From 9e8ae53154d680b1aabf39cddcb1fde0eb52752f Mon Sep 17 00:00:00 2001 From: "mh0310.choi" Date: Thu, 1 Sep 2016 11:09:28 +0900 Subject: Uploading Cairo version 1.14.2 Change-Id: I895b70fd7996b5c15f43480bdc449822636b2366 --- AUTHORS | 115 + BIBLIOGRAPHY | 109 + BUGS | 85 + CODING_STYLE | 291 + COPYING | 33 + COPYING-LGPL-2.1 | 510 + COPYING-MPL-1.1 | 470 + ChangeLog | 17933 ++++++++ ChangeLog.pre-1.0 | 18422 ++++++++ ChangeLog.pre-1.10 | 44510 +++++++++++++++++++ ChangeLog.pre-1.12 | 31634 +++++++++++++ ChangeLog.pre-1.2 | 11746 +++++ ChangeLog.pre-1.4 | 13227 ++++++ ChangeLog.pre-1.6 | 23951 ++++++++++ ChangeLog.pre-1.8 | 11558 +++++ HACKING | 185 + INSTALL | 184 + KNOWN_ISSUES | 3 + Makefile.am | 83 + Makefile.in | 1742 + Makefile.win32 | 24 + NEWS | 7366 +++ PORTING_GUIDE | 265 + README | 204 + README.win32 | 66 + RELEASING | 142 + acinclude.m4 | 55 + aclocal.m4 | 1222 + autogen.sh | 31 + boilerplate/Makefile.am | 76 + boilerplate/Makefile.am.features | 519 + boilerplate/Makefile.in | 1832 + boilerplate/Makefile.sources | 41 + boilerplate/Makefile.win32 | 24 + boilerplate/Makefile.win32.features | 523 + boilerplate/README | 14 + boilerplate/cairo-boilerplate-beos.cpp | 273 + boilerplate/cairo-boilerplate-cogl.c | 206 + boilerplate/cairo-boilerplate-constructors.c | 27 + boilerplate/cairo-boilerplate-directfb.c | 235 + boilerplate/cairo-boilerplate-drm.c | 112 + boilerplate/cairo-boilerplate-egl.c | 180 + boilerplate/cairo-boilerplate-getopt.c | 247 + boilerplate/cairo-boilerplate-getopt.h | 63 + boilerplate/cairo-boilerplate-glx.c | 457 + boilerplate/cairo-boilerplate-pdf.c | 278 + boilerplate/cairo-boilerplate-private.h | 53 + boilerplate/cairo-boilerplate-ps.c | 369 + boilerplate/cairo-boilerplate-qt.cpp | 114 + boilerplate/cairo-boilerplate-quartz.c | 76 + boilerplate/cairo-boilerplate-scaled-font.h | 34 + boilerplate/cairo-boilerplate-script.c | 141 + boilerplate/cairo-boilerplate-skia.c | 55 + boilerplate/cairo-boilerplate-svg.c | 344 + boilerplate/cairo-boilerplate-system.c | 166 + boilerplate/cairo-boilerplate-system.h | 59 + boilerplate/cairo-boilerplate-test-surfaces.c | 462 + boilerplate/cairo-boilerplate-vg.c | 363 + boilerplate/cairo-boilerplate-wgl.c | 239 + boilerplate/cairo-boilerplate-win32-printing.c | 407 + boilerplate/cairo-boilerplate-win32.c | 77 + boilerplate/cairo-boilerplate-xcb.c | 876 + boilerplate/cairo-boilerplate-xlib.c | 638 + boilerplate/cairo-boilerplate-xlib.h | 33 + boilerplate/cairo-boilerplate.c | 1101 + boilerplate/cairo-boilerplate.h | 252 + boilerplate/check-link.c | 24 + boilerplate/make-cairo-boilerplate-constructors.sh | 29 + build/Makefile.am.analysis | 37 + build/Makefile.am.changelog | 82 + build/Makefile.am.common | 14 + build/Makefile.am.gtk-doc | 190 + build/Makefile.am.releasing | 194 + build/Makefile.win32.common | 74 + build/Makefile.win32.features | 41 + build/Makefile.win32.features-h | 130 + build/Makefile.win32.inform | 13 + build/aclocal.cairo.m4 | 216 + build/aclocal.compare.m4 | 162 + build/aclocal.enable.m4 | 409 + build/aclocal.float.m4 | 65 + build/aclocal.makefile.m4 | 234 + build/aclocal.pkg.m4 | 157 + build/ar-lib | 270 + build/compile | 347 + build/config.guess | 1558 + build/config.sub | 1791 + build/configure.ac.analysis | 106 + build/configure.ac.features | 427 + build/configure.ac.noversion | 23 + build/configure.ac.pthread | 253 + build/configure.ac.system | 160 + build/configure.ac.tools | 25 + build/configure.ac.version | 42 + build/configure.ac.warnings | 99 + build/depcomp | 791 + build/gtk-doc.m4 | 88 + build/install-sh | 527 + build/libtool.m4 | 7997 ++++ build/ltmain.sh | 9661 ++++ build/ltoptions.m4 | 384 + build/ltsugar.m4 | 123 + build/ltversion.m4 | 23 + build/lt~obsolete.m4 | 98 + build/missing | 215 + build/test-driver | 139 + cairo-version.h | 8 + config.h.in | 413 + configure | 39139 ++++++++++++++++ configure.ac | 878 + doc/Makefile.am | 7 + doc/Makefile.in | 1120 + doc/public/Makefile.am | 64 + doc/public/Makefile.in | 1918 + doc/public/README | 37 + doc/public/cairo-docs.xml | 80 + doc/public/cairo-overrides.txt | 0 doc/public/cairo-sections.txt | 732 + doc/public/cairo.types | 0 doc/public/check-doc-coverage.sh | 54 + doc/public/check-doc-syntax.sh | 12 + doc/public/html/bindings-errors.html | 122 + doc/public/html/bindings-fonts.html | 53 + doc/public/html/bindings-memory.html | 123 + doc/public/html/bindings-overloading.html | 121 + doc/public/html/bindings-path.html | 117 + doc/public/html/bindings-patterns.html | 75 + doc/public/html/bindings-return-values.html | 120 + doc/public/html/bindings-streams.html | 92 + doc/public/html/bindings-surfaces.html | 93 + doc/public/html/cairo-Error-handling.html | 466 + doc/public/html/cairo-FreeType-Fonts.html | 546 + doc/public/html/cairo-Image-Surfaces.html | 582 + doc/public/html/cairo-PDF-Surfaces.html | 450 + doc/public/html/cairo-PNG-Support.html | 420 + doc/public/html/cairo-Paths.html | 1503 + doc/public/html/cairo-PostScript-Surfaces.html | 707 + doc/public/html/cairo-Quartz-(CGFont)-Fonts.html | 172 + doc/public/html/cairo-Quartz-Surfaces.html | 250 + doc/public/html/cairo-Raster-Sources.html | 809 + doc/public/html/cairo-Recording-Surfaces.html | 275 + doc/public/html/cairo-Regions.html | 1159 + doc/public/html/cairo-SVG-Surfaces.html | 397 + doc/public/html/cairo-Script-Surfaces.html | 503 + doc/public/html/cairo-Transformations.html | 570 + doc/public/html/cairo-Types.html | 206 + doc/public/html/cairo-User-Fonts.html | 843 + doc/public/html/cairo-Version-Information.html | 367 + doc/public/html/cairo-Win32-Fonts.html | 448 + doc/public/html/cairo-Win32-Surfaces.html | 371 + doc/public/html/cairo-XCB-Surfaces.html | 672 + doc/public/html/cairo-XLib-Surfaces.html | 730 + doc/public/html/cairo-XLib-XRender-Backend.html | 217 + doc/public/html/cairo-cairo-device-t.html | 850 + doc/public/html/cairo-cairo-font-face-t.html | 489 + doc/public/html/cairo-cairo-font-options-t.html | 869 + doc/public/html/cairo-cairo-matrix-t.html | 787 + doc/public/html/cairo-cairo-pattern-t.html | 2692 ++ doc/public/html/cairo-cairo-scaled-font-t.html | 1230 + doc/public/html/cairo-cairo-surface-t.html | 2073 + doc/public/html/cairo-cairo-t.html | 3494 ++ doc/public/html/cairo-drawing.html | 53 + doc/public/html/cairo-fonts.html | 53 + doc/public/html/cairo-support.html | 44 + doc/public/html/cairo-surfaces.html | 74 + doc/public/html/cairo-text.html | 1495 + doc/public/html/cairo.devhelp2 | 562 + doc/public/html/home.png | Bin 0 -> 169 bytes doc/public/html/index-1.10.html | 177 + doc/public/html/index-1.12.html | 193 + doc/public/html/index-1.2.html | 179 + doc/public/html/index-1.4.html | 123 + doc/public/html/index-1.6.html | 107 + doc/public/html/index-1.8.html | 128 + doc/public/html/index-all.html | 1122 + doc/public/html/index.html | 157 + doc/public/html/index.sgml | 742 + doc/public/html/language-bindings.html | 73 + doc/public/html/left-insensitive.png | Bin 0 -> 329 bytes doc/public/html/left.png | Bin 0 -> 187 bytes doc/public/html/right-insensitive.png | Bin 0 -> 233 bytes doc/public/html/right.png | Bin 0 -> 186 bytes doc/public/html/style.css | 461 + doc/public/html/up-insensitive.png | Bin 0 -> 293 bytes doc/public/html/up.png | Bin 0 -> 187 bytes doc/public/language-bindings.xml | 745 + doc/public/tmpl/cairo-device.sgml | 209 + doc/public/tmpl/cairo-font-face.sgml | 107 + doc/public/tmpl/cairo-font-options.sgml | 196 + doc/public/tmpl/cairo-ft.sgml | 118 + doc/public/tmpl/cairo-image.sgml | 123 + doc/public/tmpl/cairo-matrix.sgml | 155 + doc/public/tmpl/cairo-paths.sgml | 264 + doc/public/tmpl/cairo-pattern.sgml | 486 + doc/public/tmpl/cairo-pdf.sgml | 99 + doc/public/tmpl/cairo-png.sgml | 93 + doc/public/tmpl/cairo-ps.sgml | 142 + doc/public/tmpl/cairo-quartz-fonts.sgml | 49 + doc/public/tmpl/cairo-quartz.sgml | 62 + doc/public/tmpl/cairo-raster-source.sgml | 180 + doc/public/tmpl/cairo-recording.sgml | 63 + doc/public/tmpl/cairo-region.sgml | 260 + doc/public/tmpl/cairo-scaled-font.sgml | 224 + doc/public/tmpl/cairo-script.sgml | 118 + doc/public/tmpl/cairo-skia.sgml | 45 + doc/public/tmpl/cairo-status.sgml | 87 + doc/public/tmpl/cairo-surface-observer.sgml | 156 + doc/public/tmpl/cairo-surface.sgml | 438 + doc/public/tmpl/cairo-svg.sgml | 89 + doc/public/tmpl/cairo-text.sgml | 293 + doc/public/tmpl/cairo-transforms.sgml | 128 + doc/public/tmpl/cairo-types.sgml | 55 + doc/public/tmpl/cairo-unused.sgml | 0 doc/public/tmpl/cairo-user-fonts.sgml | 162 + doc/public/tmpl/cairo-version.sgml | 97 + doc/public/tmpl/cairo-win32-fonts.sgml | 104 + doc/public/tmpl/cairo-win32.sgml | 90 + doc/public/tmpl/cairo-xcb.sgml | 146 + doc/public/tmpl/cairo-xlib-xrender.sgml | 54 + doc/public/tmpl/cairo-xlib.sgml | 169 + doc/public/tmpl/cairo.sgml | 678 + doc/public/version.xml | 1 + doc/public/xml/api-index-1.0.xml | 272 + doc/public/xml/api-index-1.10.xml | 79 + doc/public/xml/api-index-1.12.xml | 86 + doc/public/xml/api-index-1.14.xml | 16 + doc/public/xml/api-index-1.2.xml | 78 + doc/public/xml/api-index-1.4.xml | 50 + doc/public/xml/api-index-1.6.xml | 43 + doc/public/xml/api-index-1.8.xml | 52 + doc/public/xml/api-index-TBD.xml | 7 + doc/public/xml/api-index-deprecated.xml | 7 + doc/public/xml/api-index-full.xml | 560 + doc/public/xml/cairo-device.xml | 641 + doc/public/xml/cairo-font-face.xml | 371 + doc/public/xml/cairo-font-options.xml | 629 + doc/public/xml/cairo-ft.xml | 418 + doc/public/xml/cairo-image.xml | 442 + doc/public/xml/cairo-matrix.xml | 588 + doc/public/xml/cairo-paths.xml | 1138 + doc/public/xml/cairo-pattern.xml | 1997 + doc/public/xml/cairo-pdf.xml | 335 + doc/public/xml/cairo-png.xml | 316 + doc/public/xml/cairo-ps.xml | 533 + doc/public/xml/cairo-quartz-fonts.xml | 138 + doc/public/xml/cairo-quartz.xml | 193 + doc/public/xml/cairo-raster-source.xml | 565 + doc/public/xml/cairo-recording.xml | 213 + doc/public/xml/cairo-region.xml | 819 + doc/public/xml/cairo-scaled-font.xml | 985 + doc/public/xml/cairo-script.xml | 362 + doc/public/xml/cairo-skia.xml | 99 + doc/public/xml/cairo-status.xml | 354 + doc/public/xml/cairo-surface-observer.xml | 301 + doc/public/xml/cairo-surface.xml | 1510 + doc/public/xml/cairo-svg.xml | 298 + doc/public/xml/cairo-text.xml | 1113 + doc/public/xml/cairo-transforms.xml | 396 + doc/public/xml/cairo-types.xml | 173 + doc/public/xml/cairo-user-fonts.xml | 642 + doc/public/xml/cairo-version.xml | 289 + doc/public/xml/cairo-win32-fonts.xml | 335 + doc/public/xml/cairo-win32.xml | 279 + doc/public/xml/cairo-xcb.xml | 488 + doc/public/xml/cairo-xlib-xrender.xml | 171 + doc/public/xml/cairo-xlib.xml | 524 + doc/public/xml/cairo.xml | 2575 ++ perf/COPYING | 5 + perf/Makefile.am | 154 + perf/Makefile.in | 1531 + perf/Makefile.sources | 38 + perf/Makefile.win32 | 78 + perf/README | 239 + perf/cairo-analyse-trace.c | 592 + perf/cairo-perf-chart.c | 1113 + perf/cairo-perf-compare-backends.c | 398 + perf/cairo-perf-diff | 255 + perf/cairo-perf-diff-files.c | 506 + perf/cairo-perf-graph-files.c | 604 + perf/cairo-perf-graph-widget.c | 604 + perf/cairo-perf-graph.h | 63 + perf/cairo-perf-micro.c | 594 + perf/cairo-perf-print.c | 139 + perf/cairo-perf-report.c | 454 + perf/cairo-perf-trace.c | 1067 + perf/cairo-perf.c | 98 + perf/cairo-perf.h | 250 + perf/cairo-stats.c | 182 + perf/cairo-stats.h | 52 + perf/micro/Makefile.am | 16 + perf/micro/Makefile.in | 1199 + perf/micro/Makefile.sources | 51 + perf/micro/a1-curve.c | 112 + perf/micro/a1-line.c | 223 + perf/micro/box-outline.c | 215 + perf/micro/cairo-perf-cover.c | 339 + perf/micro/composite-checker.c | 117 + perf/micro/curve.c | 111 + perf/micro/disjoint.c | 101 + perf/micro/dragon.c | 277 + perf/micro/fill-clip.c | 126 + perf/micro/fill.c | 122 + perf/micro/glyphs.c | 202 + perf/micro/hash-table.c | 115 + perf/micro/hatching.c | 202 + perf/micro/intersections.c | 160 + perf/micro/line.c | 222 + perf/micro/long-dashed-lines.c | 74 + perf/micro/long-lines.c | 148 + perf/micro/many-curves.c | 135 + perf/micro/many-fills.c | 187 + perf/micro/many-strokes.c | 186 + perf/micro/mask.c | 305 + perf/micro/mosaic.c | 176 + perf/micro/mosaic.h | 4387 ++ perf/micro/paint-with-alpha.c | 59 + perf/micro/paint.c | 57 + perf/micro/pattern_create_radial.c | 106 + perf/micro/pixel.c | 237 + perf/micro/pythagoras-tree.c | 95 + perf/micro/rectangles.c | 121 + perf/micro/rounded-rectangles.c | 144 + perf/micro/sierpinski.c | 94 + perf/micro/spiral.c | 352 + perf/micro/stroke.c | 100 + perf/micro/subimage_copy.c | 80 + perf/micro/tessellate.c | 181 + perf/micro/text.c | 69 + perf/micro/tiger.c | 115 + perf/micro/twin.c | 59 + perf/micro/unaligned-clip.c | 73 + perf/micro/wave.c | 115 + perf/micro/wide-fills.c | 187 + perf/micro/wide-strokes.c | 188 + perf/micro/world-map.c | 149 + perf/micro/world-map.h | 196 + perf/micro/zrusin-another.h | 668 + perf/micro/zrusin.c | 97 + src/Makefile.am | 119 + src/Makefile.am.analysis | 35 + src/Makefile.am.features | 657 + src/Makefile.in | 3123 ++ src/Makefile.sources | 472 + src/Makefile.win32 | 29 + src/Makefile.win32.features | 661 + src/README | 69 + src/cairo-analysis-surface-private.h | 74 + src/cairo-analysis-surface.c | 934 + src/cairo-arc-private.h | 61 + src/cairo-arc.c | 312 + src/cairo-array-private.h | 90 + src/cairo-array.c | 526 + src/cairo-atomic-private.h | 272 + src/cairo-atomic.c | 106 + src/cairo-backend-private.h | 201 + src/cairo-base64-stream.c | 144 + src/cairo-base85-stream.c | 131 + src/cairo-bentley-ottmann-rectangular.c | 884 + src/cairo-bentley-ottmann-rectilinear.c | 600 + src/cairo-bentley-ottmann.c | 1909 + src/cairo-beos-surface.cpp | 984 + src/cairo-beos.h | 60 + src/cairo-botor-scan-converter.c | 2164 + src/cairo-box-inline.h | 121 + src/cairo-boxes-intersect.c | 690 + src/cairo-boxes-private.h | 123 + src/cairo-boxes.c | 460 + src/cairo-cache-private.h | 145 + src/cairo-cache.c | 338 + src/cairo-cff-subset.c | 3440 ++ src/cairo-clip-boxes.c | 599 + src/cairo-clip-inline.h | 83 + src/cairo-clip-polygon.c | 156 + src/cairo-clip-private.h | 198 + src/cairo-clip-region.c | 123 + src/cairo-clip-surface.c | 240 + src/cairo-clip-tor-scan-converter.c | 1845 + src/cairo-clip.c | 838 + src/cairo-cogl-context-private.h | 52 + src/cairo-cogl-context.c | 822 + src/cairo-cogl-gradient-private.h | 89 + src/cairo-cogl-gradient.c | 642 + src/cairo-cogl-private.h | 164 + src/cairo-cogl-surface.c | 2805 ++ src/cairo-cogl-utils-private.h | 54 + src/cairo-cogl-utils.c | 126 + src/cairo-cogl.h | 69 + src/cairo-color.c | 193 + src/cairo-combsort-inline.h | 94 + src/cairo-compiler-private.h | 244 + src/cairo-composite-rectangles-private.h | 159 + src/cairo-composite-rectangles.c | 500 + src/cairo-compositor-private.h | 365 + src/cairo-compositor.c | 268 + src/cairo-contour-inline.h | 80 + src/cairo-contour-private.h | 124 + src/cairo-contour.c | 453 + src/cairo-damage-private.h | 85 + src/cairo-damage.c | 241 + src/cairo-debug.c | 304 + src/cairo-default-context-private.h | 68 + src/cairo-default-context.c | 1475 + src/cairo-deflate-stream.c | 156 + src/cairo-deprecated.h | 123 + src/cairo-device-private.h | 86 + src/cairo-device.c | 541 + src/cairo-directfb-surface.c | 544 + src/cairo-directfb.h | 67 + src/cairo-drm.h | 120 + src/cairo-egl-context.c | 317 + src/cairo-error-inline.h | 52 + src/cairo-error-private.h | 127 + src/cairo-error.c | 73 + src/cairo-fallback-compositor.c | 185 + src/cairo-features-uninstalled.pc.in | 7 + src/cairo-features.pc.in | 12 + src/cairo-fixed-private.h | 395 + src/cairo-fixed-type-private.h | 75 + src/cairo-fixed.c | 39 + src/cairo-font-face-twin-data.c | 1072 + src/cairo-font-face-twin.c | 752 + src/cairo-font-face.c | 338 + src/cairo-font-options.c | 535 + src/cairo-fontconfig-private.h | 78 + src/cairo-freed-pool-private.h | 139 + src/cairo-freed-pool.c | 93 + src/cairo-freelist-private.h | 139 + src/cairo-freelist-type-private.h | 54 + src/cairo-freelist.c | 191 + src/cairo-ft-font.c | 3577 ++ src/cairo-ft-private.h | 61 + src/cairo-ft.h | 118 + src/cairo-gl-composite.c | 1265 + src/cairo-gl-device.c | 804 + src/cairo-gl-dispatch-private.h | 129 + src/cairo-gl-dispatch.c | 261 + src/cairo-gl-ext-def-private.h | 143 + src/cairo-gl-glyphs.c | 503 + src/cairo-gl-gradient-private.h | 93 + src/cairo-gl-gradient.c | 338 + src/cairo-gl-info.c | 111 + src/cairo-gl-msaa-compositor.c | 944 + src/cairo-gl-operand.c | 788 + src/cairo-gl-private.h | 853 + src/cairo-gl-shaders.c | 1093 + src/cairo-gl-source.c | 111 + src/cairo-gl-spans-compositor.c | 553 + src/cairo-gl-surface.c | 1459 + src/cairo-gl-traps-compositor.c | 558 + src/cairo-gl.h | 155 + src/cairo-glx-context.c | 324 + src/cairo-gstate-private.h | 387 + src/cairo-gstate.c | 2346 + src/cairo-hash-private.h | 87 + src/cairo-hash.c | 578 + src/cairo-hull.c | 235 + src/cairo-image-compositor.c | 3137 ++ src/cairo-image-info-private.h | 68 + src/cairo-image-info.c | 421 + src/cairo-image-source.c | 1601 + src/cairo-image-surface-inline.h | 96 + src/cairo-image-surface-private.h | 238 + src/cairo-image-surface.c | 1321 + src/cairo-line-inline.h | 48 + src/cairo-line-private.h | 51 + src/cairo-line.c | 306 + src/cairo-list-inline.h | 215 + src/cairo-list-private.h | 48 + src/cairo-lzw.c | 404 + src/cairo-malloc-private.h | 149 + src/cairo-mask-compositor.c | 1481 + src/cairo-matrix.c | 1212 + src/cairo-mempool-private.h | 85 + src/cairo-mempool.c | 369 + src/cairo-mesh-pattern-rasterizer.c | 941 + src/cairo-misc.c | 955 + src/cairo-mono-scan-converter.c | 612 + src/cairo-mutex-impl-private.h | 278 + src/cairo-mutex-list-private.h | 78 + src/cairo-mutex-private.h | 67 + src/cairo-mutex-type-private.h | 194 + src/cairo-mutex.c | 82 + src/cairo-no-compositor.c | 107 + src/cairo-observer.c | 52 + src/cairo-os2-private.h | 67 + src/cairo-os2-surface.c | 1415 + src/cairo-os2.h | 110 + src/cairo-output-stream-private.h | 201 + src/cairo-output-stream.c | 802 + src/cairo-paginated-private.h | 168 + src/cairo-paginated-surface-private.h | 62 + src/cairo-paginated-surface.c | 716 + src/cairo-path-bounds.c | 207 + src/cairo-path-fill.c | 341 + src/cairo-path-fixed-private.h | 206 + src/cairo-path-fixed.c | 1589 + src/cairo-path-in-fill.c | 290 + src/cairo-path-private.h | 57 + src/cairo-path-stroke-boxes.c | 711 + src/cairo-path-stroke-polygon.c | 1364 + src/cairo-path-stroke-traps.c | 1149 + src/cairo-path-stroke-tristrip.c | 1088 + src/cairo-path-stroke.c | 1485 + src/cairo-path.c | 479 + src/cairo-pattern-inline.h | 65 + src/cairo-pattern-private.h | 369 + src/cairo-pattern.c | 4699 ++ src/cairo-pdf-operators-private.h | 176 + src/cairo-pdf-operators.c | 1560 + src/cairo-pdf-shading-private.h | 100 + src/cairo-pdf-shading.c | 279 + src/cairo-pdf-surface-private.h | 218 + src/cairo-pdf-surface.c | 7880 ++++ src/cairo-pdf.h | 94 + src/cairo-pen.c | 475 + src/cairo-pixman-private.h | 51 + src/cairo-png.c | 819 + src/cairo-polygon-intersect.c | 1532 + src/cairo-polygon-reduce.c | 1438 + src/cairo-polygon.c | 608 + src/cairo-private.h | 64 + src/cairo-ps-surface-private.h | 104 + src/cairo-ps-surface.c | 4694 ++ src/cairo-ps.h | 116 + src/cairo-qt-surface.cpp | 1738 + src/cairo-qt.h | 85 + src/cairo-quartz-font.c | 859 + src/cairo-quartz-image-surface.c | 387 + src/cairo-quartz-image.h | 59 + src/cairo-quartz-private.h | 109 + src/cairo-quartz-surface.c | 2574 ++ src/cairo-quartz.h | 82 + src/cairo-raster-source-pattern.c | 430 + src/cairo-recording-surface-inline.h | 68 + src/cairo-recording-surface-private.h | 195 + src/cairo-recording-surface.c | 2188 + src/cairo-rectangle.c | 299 + src/cairo-rectangular-scan-converter.c | 791 + src/cairo-reference-count-private.h | 62 + src/cairo-region-private.h | 77 + src/cairo-region.c | 939 + src/cairo-rtree-private.h | 142 + src/cairo-rtree.c | 388 + src/cairo-scaled-font-private.h | 183 + src/cairo-scaled-font-subsets-private.h | 735 + src/cairo-scaled-font-subsets.c | 1299 + src/cairo-scaled-font.c | 3158 ++ src/cairo-script-private.h | 59 + src/cairo-script-surface.c | 3999 ++ src/cairo-script.h | 98 + src/cairo-shape-mask-compositor.c | 340 + src/cairo-skia.h | 66 + src/cairo-slope-private.h | 72 + src/cairo-slope.c | 99 + src/cairo-spans-compositor-private.h | 111 + src/cairo-spans-compositor.c | 1201 + src/cairo-spans-private.h | 206 + src/cairo-spans.c | 250 + src/cairo-spline.c | 424 + src/cairo-stroke-dash-private.h | 70 + src/cairo-stroke-dash.c | 96 + src/cairo-stroke-style.c | 354 + src/cairo-surface-backend-private.h | 221 + src/cairo-surface-clipper-private.h | 71 + src/cairo-surface-clipper.c | 196 + src/cairo-surface-fallback-private.h | 95 + src/cairo-surface-fallback.c | 115 + src/cairo-surface-inline.h | 60 + src/cairo-surface-observer-inline.h | 59 + src/cairo-surface-observer-private.h | 208 + src/cairo-surface-observer.c | 2106 + src/cairo-surface-offset-private.h | 95 + src/cairo-surface-offset.c | 308 + src/cairo-surface-private.h | 121 + src/cairo-surface-snapshot-inline.h | 67 + src/cairo-surface-snapshot-private.h | 51 + src/cairo-surface-snapshot.c | 289 + src/cairo-surface-subsurface-inline.h | 72 + src/cairo-surface-subsurface-private.h | 55 + src/cairo-surface-subsurface.c | 587 + src/cairo-surface-wrapper-private.h | 193 + src/cairo-surface-wrapper.c | 685 + src/cairo-surface.c | 2749 ++ src/cairo-svg-surface-private.h | 74 + src/cairo-svg-surface.c | 2884 ++ src/cairo-svg.h | 84 + src/cairo-tee-surface-private.h | 47 + src/cairo-tee-surface.c | 602 + src/cairo-tee.h | 66 + src/cairo-time-private.h | 94 + src/cairo-time.c | 225 + src/cairo-tor-scan-converter.c | 1899 + src/cairo-tor22-scan-converter.c | 1709 + src/cairo-toy-font-face.c | 524 + src/cairo-traps-compositor.c | 2351 + src/cairo-traps-private.h | 143 + src/cairo-traps.c | 1123 + src/cairo-tristrip-private.h | 94 + src/cairo-tristrip.c | 185 + src/cairo-truetype-subset-private.h | 212 + src/cairo-truetype-subset.c | 1631 + src/cairo-type1-fallback.c | 903 + src/cairo-type1-glyph-names.c | 410 + src/cairo-type1-private.h | 51 + src/cairo-type1-subset.c | 1821 + src/cairo-type3-glyph-surface-private.h | 89 + src/cairo-type3-glyph-surface.c | 568 + src/cairo-types-private.h | 429 + src/cairo-unicode.c | 422 + src/cairo-uninstalled.pc.in | 8 + src/cairo-user-font-private.h | 46 + src/cairo-user-font.c | 831 + src/cairo-version.c | 261 + src/cairo-version.h | 14 + src/cairo-vg-surface.c | 1853 + src/cairo-vg.h | 103 + src/cairo-wgl-context.c | 261 + src/cairo-wideint-private.h | 338 + src/cairo-wideint-type-private.h | 158 + src/cairo-wideint.c | 852 + src/cairo-win32.h | 112 + src/cairo-xcb-connection-core.c | 300 + src/cairo-xcb-connection-render.c | 299 + src/cairo-xcb-connection-shm.c | 115 + src/cairo-xcb-connection.c | 1006 + src/cairo-xcb-private.h | 801 + src/cairo-xcb-resources.c | 281 + src/cairo-xcb-screen.c | 494 + src/cairo-xcb-shm.c | 337 + src/cairo-xcb-surface-core.c | 639 + src/cairo-xcb-surface-render.c | 4878 ++ src/cairo-xcb-surface.c | 1530 + src/cairo-xcb.h | 116 + src/cairo-xlib-core-compositor.c | 650 + src/cairo-xlib-display.c | 655 + src/cairo-xlib-fallback-compositor.c | 248 + src/cairo-xlib-private.h | 470 + src/cairo-xlib-render-compositor.c | 2005 + src/cairo-xlib-screen.c | 467 + src/cairo-xlib-source.c | 1168 + src/cairo-xlib-surface-private.h | 44 + src/cairo-xlib-surface-shm.c | 1459 + src/cairo-xlib-surface.c | 2383 + src/cairo-xlib-visual.c | 194 + src/cairo-xlib-xcb-surface.c | 847 + src/cairo-xlib-xrender-private.h | 1173 + src/cairo-xlib-xrender.h | 66 + src/cairo-xlib.h | 118 + src/cairo-xml-surface.c | 1209 + src/cairo-xml.h | 67 + src/cairo.c | 4031 ++ src/cairo.h | 3153 ++ src/cairo.pc.in | 13 + src/cairoint.h | 2081 + src/check-def.sh | 48 + src/check-doc-syntax.awk | 106 + src/check-doc-syntax.sh | 82 + src/check-has-hidden-symbols.c | 3 + src/check-headers.sh | 27 + src/check-link.c | 24 + src/check-plt.sh | 28 + src/check-preprocessor-syntax.sh | 59 + src/drm/cairo-drm-bo.c | 130 + src/drm/cairo-drm-gallium-surface.c | 826 + src/drm/cairo-drm-i915-glyphs.c | 563 + src/drm/cairo-drm-i915-private.h | 1270 + src/drm/cairo-drm-i915-shader.c | 2858 ++ src/drm/cairo-drm-i915-spans.c | 799 + src/drm/cairo-drm-i915-surface.c | 2942 ++ src/drm/cairo-drm-i965-glyphs.c | 504 + src/drm/cairo-drm-i965-private.h | 737 + src/drm/cairo-drm-i965-shader.c | 2825 ++ src/drm/cairo-drm-i965-spans.c | 407 + src/drm/cairo-drm-i965-surface.c | 1927 + src/drm/cairo-drm-intel-brw-defines.h | 824 + src/drm/cairo-drm-intel-brw-eu-emit.c | 1089 + src/drm/cairo-drm-intel-brw-eu-util.c | 121 + src/drm/cairo-drm-intel-brw-eu.c | 250 + src/drm/cairo-drm-intel-brw-eu.h | 1043 + src/drm/cairo-drm-intel-brw-structs.h | 1328 + src/drm/cairo-drm-intel-command-private.h | 909 + src/drm/cairo-drm-intel-debug.c | 1209 + src/drm/cairo-drm-intel-ioctl-private.h | 442 + src/drm/cairo-drm-intel-private.h | 519 + src/drm/cairo-drm-intel-surface.c | 451 + src/drm/cairo-drm-intel.c | 1389 + src/drm/cairo-drm-ioctl-private.h | 12 + src/drm/cairo-drm-private.h | 238 + src/drm/cairo-drm-radeon-private.h | 107 + src/drm/cairo-drm-radeon-surface.c | 448 + src/drm/cairo-drm-radeon.c | 451 + src/drm/cairo-drm-surface.c | 369 + src/drm/cairo-drm.c | 390 + src/skia/cairo-skia-context.cpp | 1781 + src/skia/cairo-skia-private.h | 127 + src/skia/cairo-skia-surface.cpp | 323 + src/test-base-compositor-surface.c | 824 + src/test-compositor-surface-private.h | 56 + src/test-compositor-surface.c | 264 + src/test-compositor-surface.h | 71 + src/test-null-compositor-surface.c | 480 + src/test-null-compositor-surface.h | 60 + src/test-paginated-surface.c | 286 + src/test-paginated-surface.h | 48 + src/win32/cairo-win32-debug.c | 87 + src/win32/cairo-win32-device.c | 189 + src/win32/cairo-win32-display-surface.c | 1075 + src/win32/cairo-win32-font.c | 2310 + src/win32/cairo-win32-gdi-compositor.c | 650 + src/win32/cairo-win32-printing-surface.c | 1924 + src/win32/cairo-win32-private.h | 226 + src/win32/cairo-win32-surface.c | 338 + src/win32/cairo-win32-system.c | 89 + test/6x13.pcf | Bin 0 -> 5239 bytes test/COPYING | 26 + test/Makefile.am | 407 + test/Makefile.in | 8753 ++++ test/Makefile.sources | 450 + test/Makefile.win32 | 55 + test/README | 319 + test/a1-bug.c | 61 + test/a1-clip.c | 175 + test/a1-fill.c | 67 + test/a1-image-sample.c | 73 + test/a1-mask-sample.c | 83 + test/a1-mask.c | 202 + test/a1-rasterisation.c | 101 + test/a1-sample.c | 59 + test/a1-traps-sample.c | 64 + test/a8-clear.c | 64 + test/a8-mask.c | 201 + test/aliasing.c | 100 + test/alpha-similar.c | 74 + test/any2ppm.c | 894 + test/api-special-cases.c | 1989 + test/arc-direction.c | 105 + test/arc-infinite-loop.c | 61 + test/arc-looping-dash.c | 79 + test/big-empty-box.c | 64 + test/big-empty-triangle.c | 75 + test/big-line.c | 62 + test/big-little-box.c | 69 + test/big-little-triangle.c | 76 + test/big-trap.c | 92 + test/bilevel-image.c | 63 + test/bitmap-font.c | 218 + test/buffer-diff.c | 262 + test/buffer-diff.h | 73 + test/bug-40410.c | 72 + test/bug-51910.c | 91 + test/bug-84115.c | 61 + test/bug-bo-collins.c | 76 + test/bug-bo-rectangular.c | 67 + test/bug-bo-ricotz.c | 74 + test/bug-extents.c | 59 + test/bug-seams.c | 120 + test/bug-source-cu.c | 81 + test/bug-spline.c | 95 + test/cairo-test-constructors.c | 1139 + test/cairo-test-private.h | 72 + test/cairo-test-runner.c | 1108 + test/cairo-test-trace.c | 1780 + test/cairo-test.c | 1803 + test/cairo-test.h | 322 + test/caps-joins-alpha.c | 89 + test/caps-joins-curve.c | 111 + test/caps-joins.c | 150 + test/caps-sub-paths.c | 65 + test/caps-tails-curve.c | 127 + test/caps.c | 138 + test/check-refs.sh | 63 + test/checkerboard.c | 48 + test/clear-source.c | 169 + test/clear.c | 86 + test/clip-all.c | 75 + test/clip-complex-bug61592.c | 60 + test/clip-complex-shape.c | 114 + test/clip-contexts.c | 75 + test/clip-device-offset.c | 79 + test/clip-disjoint-hatching.c | 104 + test/clip-disjoint-quad.c | 83 + test/clip-disjoint.c | 90 + test/clip-double-free.c | 87 + test/clip-draw-unbounded.c | 184 + test/clip-empty-group.c | 65 + test/clip-empty-save.c | 68 + test/clip-empty.c | 64 + test/clip-fill-no-op.c | 67 + test/clip-fill-rule-pixel-aligned.c | 90 + test/clip-fill-rule.c | 87 + test/clip-fill.c | 78 + test/clip-group-shapes.c | 188 + test/clip-image.c | 95 + test/clip-intersect.c | 94 + test/clip-mixed-antialias.c | 128 + test/clip-nesting.c | 109 + test/clip-operator.c | 188 + test/clip-polygons.c | 112 + test/clip-push-group.c | 67 + test/clip-rectilinear.c | 90 + test/clip-shape.c | 86 + test/clip-stroke-no-op.c | 67 + test/clip-stroke.c | 121 + test/clip-text.c | 88 + test/clip-twice-rectangle.c | 70 + test/clip-twice.c | 74 + test/clip-unbounded.c | 80 + test/clip-zero.c | 72 + test/clipped-group.c | 88 + test/clipped-surface.c | 63 + test/close-path-current-point.c | 95 + test/close-path.c | 78 + test/composite-integer-translate-over-repeat.c | 84 + test/composite-integer-translate-over.c | 61 + test/composite-integer-translate-source.c | 64 + test/copy-disjoint.c | 87 + test/copy-path.c | 314 + test/coverage.c | 506 + test/create-for-stream.c | 311 + test/create-from-png-stream.c | 119 + test/create-from-png.c | 320 + test/culled-glyphs.c | 62 + test/curve-to-as-line-to.c | 95 + test/dash-caps-joins.c | 104 + test/dash-curve.c | 66 + test/dash-infinite-loop.c | 83 + test/dash-no-dash.c | 87 + test/dash-offset-negative.c | 100 + test/dash-offset.c | 83 + test/dash-scale.c | 120 + test/dash-state.c | 64 + test/dash-zero-length.c | 110 + test/degenerate-arc.c | 74 + test/degenerate-arcs.c | 57 + test/degenerate-curve-to.c | 103 + test/degenerate-dash.c | 90 + test/degenerate-linear-gradient.c | 81 + test/degenerate-path.c | 120 + test/degenerate-pen.c | 105 + test/degenerate-radial-gradient.c | 93 + test/degenerate-rel-curve-to.c | 99 + test/degenerate-solid-dash.c | 69 + test/device-offset-fractional.c | 72 + test/device-offset-positive.c | 82 + test/device-offset-scale.c | 77 + test/device-offset.c | 82 + test/drunkard-tails.c | 135 + test/egl-oversized-surface.c | 117 + test/egl-surface-source.c | 135 + test/error-setters.c | 109 + test/extend-pad-border.c | 95 + test/extend-pad-similar.c | 82 + test/extend-pad.c | 81 + test/extend-reflect-similar.c | 51 + test/extend-reflect.c | 29 + test/extend-repeat-similar.c | 51 + test/extend-repeat.c | 27 + test/extended-blend.c | 256 + test/fallback-resolution.c | 517 + test/fallback.c | 79 + test/fill-alpha-pattern.c | 87 + test/fill-alpha.c | 82 + test/fill-and-stroke-alpha-add.c | 107 + test/fill-and-stroke-alpha.c | 101 + test/fill-and-stroke.c | 58 + test/fill-degenerate-sort-order.c | 77 + test/fill-disjoint.c | 63 + test/fill-empty.c | 62 + test/fill-image.c | 83 + test/fill-missed-stop.c | 83 + test/fill-rule.c | 127 + test/filter-bilinear-extents.c | 102 + test/filter-nearest-offset.c | 109 + test/filter-nearest-transformed.c | 120 + test/finer-grained-fallbacks.c | 180 + test/font-face-get-type.c | 79 + test/font-matrix-translation.c | 141 + test/font-options.c | 110 + test/ft-font-create-for-ft-face.c | 228 + test/ft-show-glyphs-positioning.c | 191 + test/ft-show-glyphs-table.c | 109 + test/ft-text-antialias-none.c | 146 + test/ft-text-vertical-layout-type1.c | 167 + test/ft-text-vertical-layout-type3.c | 166 + test/generate_refs.sh | 12 + test/get-and-set.c | 159 + test/get-clip.c | 264 + test/get-group-target.c | 85 + test/get-path-extents.c | 443 + test/get-xrender-format.c | 122 + test/gl-device-release.c | 182 + test/gl-oversized-surface.c | 88 + test/gl-surface-source.c | 111 + test/glyph-cache-pressure.c | 81 + test/gradient-alpha.c | 56 + test/gradient-constant-alpha.c | 61 + test/gradient-zero-stops-mask.c | 59 + test/gradient-zero-stops.c | 58 + test/group-clip.c | 57 + test/group-paint.c | 48 + test/group-state.c | 96 + test/group-unaligned.c | 60 + test/half-coverage.c | 155 + test/halo.c | 158 + test/hatchings.c | 153 + test/horizontal-clip.c | 77 + test/huge-linear.c | 67 + test/huge-radial.c | 69 + test/image-bug-710072.c | 80 + test/image-surface-source.c | 41 + test/imagediff.c | 303 + test/implicit-close.c | 54 + test/in-fill-empty-trapezoid.c | 109 + test/in-fill-trapezoid.c | 279 + test/index.html | 42 + test/infinite-join.c | 72 + test/invalid-matrix.c | 374 + test/inverse-text.c | 67 + test/inverted-clip.c | 56 + test/joins-loop.c | 100 + test/joins-retrace.c | 109 + test/joins-star.c | 99 + test/joins.c | 109 + test/jp2.jp2 | Bin 0 -> 2999 bytes test/jpeg.jpg | Bin 0 -> 2316 bytes test/large-clip.c | 50 + test/large-font.c | 73 + test/large-source-roi.c | 78 + test/large-source.c | 100 + test/large-twin-antialias-mixed.c | 97 + test/leaky-dash.c | 64 + test/leaky-dashed-rectangle.c | 86 + test/leaky-dashed-stroke.c | 166 + test/leaky-polygon.c | 85 + test/line-width-large-overlap.c | 149 + test/line-width-overlap.c | 149 + test/line-width-scale.c | 178 + test/line-width-tolerance.c | 66 + test/line-width-zero.c | 71 + test/line-width.c | 77 + test/linear-gradient-extend.c | 92 + test/linear-gradient-large.c | 68 + test/linear-gradient-one-stop.c | 90 + test/linear-gradient-reflect.c | 67 + test/linear-gradient-subset.c | 127 + test/linear-gradient.c | 132 + test/linear-step-function.c | 60 + test/linear-uniform.c | 63 + test/long-dashed-lines.c | 66 + test/long-lines.c | 85 + test/make-cairo-test-constructors.sh | 29 + test/map-to-image.c | 156 + test/mask-alpha.c | 82 + test/mask-ctm.c | 80 + test/mask-glyphs.c | 187 + test/mask-surface-ctm.c | 71 + test/mask-transformed-image.c | 96 + test/mask-transformed-similar.c | 98 + test/mask.c | 246 + test/mesh-pattern-accuracy.c | 99 + test/mesh-pattern-conical.c | 135 + test/mesh-pattern-control-points.c | 114 + test/mesh-pattern-fold.c | 82 + test/mesh-pattern-overlap.c | 76 + test/mesh-pattern-transformed.c | 107 + test/mesh-pattern.c | 94 + test/mime-data.c | 241 + test/mime-surface-api.c | 151 + test/miter-precision.c | 72 + test/move-to-show-surface.c | 78 + test/multi-page.c | 198 + test/negative-stride-image.c | 71 + test/new-sub-path.c | 74 + test/nil-surface.c | 170 + test/operator-alpha-alpha.c | 166 + test/operator-alpha.c | 65 + test/operator-clear.c | 196 + test/operator-source.c | 250 + test/operator.c | 65 + test/outline-tolerance.c | 52 + test/over-above-source.c | 72 + test/over-around-source.c | 83 + test/over-below-source.c | 72 + test/over-between-source.c | 83 + test/overlapping-boxes.c | 96 + test/overlapping-dash-caps.c | 67 + test/overlapping-glyphs.c | 123 + test/paint-clip-fill.c | 106 + test/paint-repeat.c | 61 + test/paint-source-alpha.c | 63 + test/paint-with-alpha-group-clip.c | 60 + test/paint-with-alpha.c | 148 + test/paint.c | 48 + test/partial-clip-text.c | 120 + test/partial-coverage.c | 680 + test/pass-through.c | 91 + test/path-append.c | 81 + test/path-currentpoint.c | 89 + test/path-precision.c | 111 + test/path-stroke-twice.c | 54 + test/pattern-get-type.c | 79 + test/pattern-getters.c | 279 + test/pdf-features.c | 148 + test/pdf-isolated-group.c | 73 + test/pdf-mime-data.c | 187 + test/pdf-surface-source.c | 53 + test/pdf2png.c | 99 + test/pdiff/Makefile.am | 19 + test/pdiff/Makefile.in | 1105 + test/pdiff/args.c | 119 + test/pdiff/args.h | 46 + test/pdiff/gpl.txt | 340 + test/pdiff/lpyramid.c | 116 + test/pdiff/lpyramid.h | 32 + test/pdiff/pdiff.c | 420 + test/pdiff/pdiff.h | 40 + test/pdiff/perceptualdiff.c | 101 + test/pixman-downscale.c | 203 + test/pixman-rotate.c | 92 + test/png-flatten.c | 77 + test/png.c | 172 + test/png.png | Bin 0 -> 2096 bytes test/ps-eps.c | 354 + test/ps-features.c | 166 + test/ps-surface-source.c | 53 + test/ps2png.c | 113 + test/pthread-same-source.c | 192 + test/pthread-show-text.c | 142 + test/pthread-similar.c | 106 + test/push-group-color.c | 141 + test/push-group-path-offset.c | 77 + test/push-group.c | 113 + test/quartz-surface-source.c | 42 + test/radial-gradient-extend.c | 92 + test/radial-gradient.c | 256 + test/radial-outer-focus.c | 72 + test/random-clips.c | 232 + test/random-intersections-curves-eo.c | 84 + test/random-intersections-curves-nz.c | 85 + test/random-intersections-eo.c | 78 + test/random-intersections-nonzero.c | 79 + test/raster-source.c | 134 + test/record-extend.c | 288 + test/record-mesh.c | 166 + test/record.c | 491 + test/record1414x.c | 498 + test/record2x.c | 493 + test/record90.c | 495 + test/recordflip.c | 733 + test/recording-surface-extend.c | 174 + test/recording-surface-pattern.c | 162 + test/rectangle-rounding-error.c | 64 + test/rectilinear-dash-scale.c | 196 + test/rectilinear-dash.c | 176 + test/rectilinear-fill.c | 84 + test/rectilinear-grid.c | 92 + test/rectilinear-miter-limit.c | 72 + test/rectilinear-stroke.c | 139 + test/reference/a1-bug.base.argb32.ref.png | Bin 0 -> 3362 bytes test/reference/a1-bug.base.rgb24.ref.png | Bin 0 -> 3362 bytes test/reference/a1-bug.image16.ref.png | Bin 0 -> 3329 bytes test/reference/a1-bug.mask.argb32.ref.png | Bin 0 -> 3735 bytes test/reference/a1-bug.mask.rgb24.ref.png | Bin 0 -> 3735 bytes test/reference/a1-bug.quartz.xfail.png | Bin 0 -> 3195 bytes test/reference/a1-bug.ref.png | Bin 0 -> 3736 bytes test/reference/a1-bug.traps.argb32.ref.png | Bin 0 -> 3362 bytes test/reference/a1-bug.traps.rgb24.ref.png | Bin 0 -> 3362 bytes .../a1-clip-fill-equal.base.argb32.ref.png | Bin 0 -> 120 bytes .../a1-clip-fill-equal.base.rgb24.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-fill-equal.ref.png | Bin 0 -> 120 bytes .../a1-clip-fill-rule.base.argb32.ref.png | Bin 0 -> 236 bytes .../reference/a1-clip-fill-rule.base.rgb24.ref.png | Bin 0 -> 218 bytes test/reference/a1-clip-fill-rule.ref.png | Bin 0 -> 236 bytes test/reference/a1-clip-fill.base.argb32.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-fill.base.rgb24.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-fill.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-paint.base.argb32.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-paint.base.rgb24.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-paint.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-stroke.base.argb32.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-stroke.base.rgb24.ref.png | Bin 0 -> 120 bytes test/reference/a1-clip-stroke.ref.png | Bin 0 -> 120 bytes test/reference/a1-fill.base.argb32.ref.png | Bin 0 -> 328 bytes test/reference/a1-fill.base.rgb24.ref.png | Bin 0 -> 328 bytes test/reference/a1-fill.ref.png | Bin 0 -> 328 bytes test/reference/a1-image-sample.base.argb32.ref.png | Bin 0 -> 122 bytes test/reference/a1-image-sample.base.rgb24.ref.png | Bin 0 -> 122 bytes test/reference/a1-image-sample.gl.xfail.png | Bin 0 -> 120 bytes test/reference/a1-image-sample.ref.png | Bin 0 -> 148 bytes test/reference/a1-line-width.base.argb32.ref.png | Bin 0 -> 154 bytes test/reference/a1-line-width.base.rgb24.ref.png | Bin 0 -> 154 bytes test/reference/a1-line-width.pdf.ref.png | Bin 0 -> 177 bytes test/reference/a1-line-width.ps.ref.png | Bin 0 -> 179 bytes test/reference/a1-line-width.ref.png | Bin 0 -> 154 bytes test/reference/a1-mask-sample.base.argb32.ref.png | Bin 0 -> 122 bytes test/reference/a1-mask-sample.base.rgb24.ref.png | Bin 0 -> 122 bytes test/reference/a1-mask-sample.ref.png | Bin 0 -> 148 bytes test/reference/a1-mask.base.argb32.ref.png | Bin 0 -> 106 bytes test/reference/a1-mask.base.rgb24.ref.png | Bin 0 -> 106 bytes test/reference/a1-mask.ref.png | Bin 0 -> 131 bytes ...a1-rasterisation-rectangles.base.argb32.ref.png | Bin 0 -> 1729 bytes .../a1-rasterisation-rectangles.base.rgb24.ref.png | Bin 0 -> 1729 bytes .../a1-rasterisation-rectangles.quartz.xfail.png | Bin 0 -> 2583 bytes test/reference/a1-rasterisation-rectangles.ref.png | Bin 0 -> 1729 bytes .../a1-rasterisation-triangles.base.argb32.ref.png | Bin 0 -> 1729 bytes .../a1-rasterisation-triangles.base.rgb24.ref.png | Bin 0 -> 1729 bytes .../a1-rasterisation-triangles.quartz.xfail.png | Bin 0 -> 2583 bytes test/reference/a1-rasterisation-triangles.ref.png | Bin 0 -> 1729 bytes .../a1-rectilinear-grid.base.argb32.ref.png | Bin 0 -> 207 bytes .../a1-rectilinear-grid.base.rgb24.ref.png | Bin 0 -> 207 bytes test/reference/a1-rectilinear-grid.ref.png | Bin 0 -> 207 bytes test/reference/a1-sample.base.argb32.ref.png | Bin 0 -> 786 bytes test/reference/a1-sample.base.rgb24.ref.png | Bin 0 -> 786 bytes test/reference/a1-sample.ref.png | Bin 0 -> 786 bytes test/reference/a1-tiger.base.argb32.ref.png | Bin 0 -> 20406 bytes test/reference/a1-tiger.base.rgb24.ref.png | Bin 0 -> 20406 bytes test/reference/a1-tiger.mask.argb32.ref.png | Bin 0 -> 20328 bytes test/reference/a1-tiger.mask.rgb24.ref.png | Bin 0 -> 20328 bytes test/reference/a1-tiger.ref.png | Bin 0 -> 20326 bytes test/reference/a1-tiger.traps.argb32.ref.png | Bin 0 -> 20326 bytes test/reference/a1-tiger.traps.rgb24.ref.png | Bin 0 -> 20326 bytes test/reference/a1-traps-sample.base.argb32.ref.png | Bin 0 -> 120 bytes test/reference/a1-traps-sample.base.rgb24.ref.png | Bin 0 -> 120 bytes test/reference/a1-traps-sample.quartz.xfail.png | Bin 0 -> 122 bytes test/reference/a1-traps-sample.ref.png | Bin 0 -> 120 bytes test/reference/a8-clear.base.argb32.ref.png | Bin 0 -> 248 bytes test/reference/a8-clear.base.rgb24.ref.png | Bin 0 -> 248 bytes test/reference/a8-clear.quartz.ref.png | Bin 0 -> 244 bytes test/reference/a8-clear.ref.png | Bin 0 -> 267 bytes test/reference/a8-clear.traps.argb32.ref.png | Bin 0 -> 248 bytes test/reference/a8-clear.traps.rgb24.ref.png | Bin 0 -> 248 bytes test/reference/a8-mask.base.argb32.ref.png | Bin 0 -> 103 bytes test/reference/a8-mask.base.rgb24.ref.png | Bin 0 -> 103 bytes test/reference/a8-mask.ref.png | Bin 0 -> 128 bytes test/reference/aliasing.base.argb32.ref.png | Bin 0 -> 103722 bytes test/reference/aliasing.base.rgb24.ref.png | Bin 0 -> 103722 bytes test/reference/aliasing.image16.ref.png | Bin 0 -> 97251 bytes test/reference/aliasing.quartz.ref.png | Bin 0 -> 108801 bytes test/reference/aliasing.ref.png | Bin 0 -> 103877 bytes test/reference/aliasing.traps.argb32.ref.png | Bin 0 -> 103722 bytes test/reference/aliasing.traps.rgb24.ref.png | Bin 0 -> 103722 bytes test/reference/alpha-similar.base.argb32.ref.png | Bin 0 -> 99 bytes test/reference/alpha-similar.base.rgb24.ref.png | Bin 0 -> 88 bytes test/reference/alpha-similar.gl.argb32.xfail.png | Bin 0 -> 99 bytes test/reference/alpha-similar.gl.rgb24.xfail.png | Bin 0 -> 93 bytes test/reference/alpha-similar.pdf.argb32.xfail.png | Bin 0 -> 95 bytes test/reference/alpha-similar.pdf.rgb24.xfail.png | Bin 0 -> 93 bytes test/reference/alpha-similar.ps.argb32.xfail.png | Bin 0 -> 95 bytes test/reference/alpha-similar.ps.rgb24.xfail.png | Bin 0 -> 93 bytes test/reference/alpha-similar.ref.png | Bin 0 -> 99 bytes test/reference/alpha-similar.svg.argb32.xfail.png | Bin 0 -> 99 bytes test/reference/alpha-similar.svg.rgb24.xfail.png | Bin 0 -> 95 bytes .../api-special-cases.base.argb32.ref.png | Bin 0 -> 95 bytes .../reference/api-special-cases.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/api-special-cases.ref.png | Bin 0 -> 95 bytes test/reference/arc-direction.base.argb32.ref.png | Bin 0 -> 5864 bytes test/reference/arc-direction.base.rgb24.ref.png | Bin 0 -> 5864 bytes test/reference/arc-direction.ps.ref.png | Bin 0 -> 3295 bytes test/reference/arc-direction.ref.png | Bin 0 -> 6073 bytes test/reference/arc-direction.traps.ref.png | Bin 0 -> 5864 bytes .../arc-infinite-loop.base.argb32.ref.png | Bin 0 -> 96 bytes .../reference/arc-infinite-loop.base.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/arc-infinite-loop.ref.png | Bin 0 -> 96 bytes test/reference/arc-looping-dash.image16.ref.png | Bin 0 -> 450 bytes .../reference/arc-looping-dash.mask.argb32.ref.png | Bin 0 -> 464 bytes test/reference/arc-looping-dash.mask.rgb24.ref.png | Bin 0 -> 464 bytes test/reference/arc-looping-dash.ps.ref.png | Bin 0 -> 377 bytes test/reference/arc-looping-dash.quartz.ref.png | Bin 0 -> 470 bytes test/reference/arc-looping-dash.ref.png | Bin 0 -> 464 bytes .../arc-looping-dash.traps.argb32.ref.png | Bin 0 -> 496 bytes .../reference/arc-looping-dash.traps.rgb24.ref.png | Bin 0 -> 496 bytes test/reference/big-empty-box.base.argb32.ref.png | Bin 0 -> 111 bytes test/reference/big-empty-box.base.rgb24.ref.png | Bin 0 -> 108 bytes test/reference/big-empty-box.ref.png | Bin 0 -> 111 bytes .../big-empty-triangle.base.argb32.ref.png | Bin 0 -> 111 bytes .../big-empty-triangle.base.rgb24.ref.png | Bin 0 -> 108 bytes test/reference/big-empty-triangle.ref.png | Bin 0 -> 111 bytes test/reference/big-line.base.argb32.ref.png | Bin 0 -> 933 bytes test/reference/big-line.base.rgb24.ref.png | Bin 0 -> 933 bytes test/reference/big-line.image16.ref.png | Bin 0 -> 988 bytes test/reference/big-line.ps.ref.png | Bin 0 -> 946 bytes test/reference/big-line.quartz.ref.png | Bin 0 -> 993 bytes test/reference/big-line.ref.png | Bin 0 -> 999 bytes test/reference/big-line.traps.argb32.ref.png | Bin 0 -> 933 bytes test/reference/big-line.traps.rgb24.ref.png | Bin 0 -> 933 bytes test/reference/big-little-box.base.argb32.ref.png | Bin 0 -> 169 bytes test/reference/big-little-box.base.rgb24.ref.png | Bin 0 -> 160 bytes test/reference/big-little-box.ref.png | Bin 0 -> 169 bytes test/reference/big-little-triangle.argb32.ref.png | Bin 0 -> 399 bytes .../big-little-triangle.base.argb32.ref.png | Bin 0 -> 399 bytes .../big-little-triangle.base.rgb24.ref.png | Bin 0 -> 320 bytes test/reference/big-little-triangle.rgb24.ref.png | Bin 0 -> 320 bytes .../big-little-triangle.traps.argb32.ref.png | Bin 0 -> 399 bytes .../big-little-triangle.traps.rgb24.ref.png | Bin 0 -> 320 bytes test/reference/big-trap.base.argb32.ref.png | Bin 0 -> 319 bytes test/reference/big-trap.base.rgb24.ref.png | Bin 0 -> 319 bytes test/reference/big-trap.mask.argb32.ref.png | Bin 0 -> 319 bytes test/reference/big-trap.mask.rgb24.ref.png | Bin 0 -> 319 bytes test/reference/big-trap.traps.argb32.ref.png | Bin 0 -> 319 bytes test/reference/big-trap.traps.rgb24.ref.png | Bin 0 -> 319 bytes test/reference/bilevel-image.base.argb32.ref.png | Bin 0 -> 105 bytes test/reference/bilevel-image.base.rgb24.ref.png | Bin 0 -> 105 bytes test/reference/bilevel-image.ref.png | Bin 0 -> 131 bytes test/reference/bilevel-xlib-fallback.rgb24.ref.png | Bin 0 -> 105 bytes test/reference/bilevel-xlib-window.rgb24.ref.png | Bin 0 -> 105 bytes test/reference/bilevel-xlib.ref.png | Bin 0 -> 105 bytes test/reference/bitmap-font.base.argb32.ref.png | Bin 0 -> 931 bytes test/reference/bitmap-font.base.rgb24.ref.png | Bin 0 -> 871 bytes test/reference/bitmap-font.ref.png | Bin 0 -> 950 bytes test/reference/bug-40410.base.argb32.ref.png | Bin 0 -> 428 bytes test/reference/bug-40410.base.rgb24.ref.png | Bin 0 -> 428 bytes test/reference/bug-40410.ref.png | Bin 0 -> 429 bytes test/reference/bug-40410.traps.argb32.ref.png | Bin 0 -> 428 bytes test/reference/bug-40410.traps.rgb24.ref.png | Bin 0 -> 428 bytes test/reference/bug-51910.ref.png | Bin 0 -> 1987 bytes test/reference/bug-84115.ref.png | Bin 0 -> 62964 bytes test/reference/bug-84115.xlib.ref.png | Bin 0 -> 65033 bytes test/reference/bug-bo-collins.ref.png | Bin 0 -> 248 bytes .../bug-bo-rectangular.base.argb32.ref.png | Bin 0 -> 950 bytes .../bug-bo-rectangular.base.rgb24.ref.png | Bin 0 -> 950 bytes test/reference/bug-bo-rectangular.image16.ref.png | Bin 0 -> 955 bytes test/reference/bug-bo-rectangular.ps.xfail.png | Bin 0 -> 945 bytes test/reference/bug-bo-rectangular.ref.png | Bin 0 -> 950 bytes test/reference/bug-bo-ricotz.base.argb32.ref.png | Bin 0 -> 2125 bytes test/reference/bug-bo-ricotz.base.rgb24.ref.png | Bin 0 -> 2125 bytes test/reference/bug-bo-ricotz.ref.png | Bin 0 -> 2128 bytes test/reference/bug-bo-ricotz.traps.ref.png | Bin 0 -> 2125 bytes test/reference/bug-extents.base.argb32.ref.png | Bin 0 -> 9250 bytes test/reference/bug-extents.base.rgb24.ref.png | Bin 0 -> 9250 bytes test/reference/bug-extents.image16.ref.png | Bin 0 -> 7576 bytes test/reference/bug-extents.ps.ref.png | Bin 0 -> 5844 bytes test/reference/bug-extents.quartz.ref.png | Bin 0 -> 9310 bytes test/reference/bug-extents.ref.png | Bin 0 -> 9211 bytes test/reference/bug-extents.traps.argb32.ref.png | Bin 0 -> 9250 bytes test/reference/bug-extents.traps.rgb24.ref.png | Bin 0 -> 9250 bytes test/reference/bug-seams.base.argb32.ref.png | Bin 0 -> 1606 bytes test/reference/bug-seams.base.rgb24.ref.png | Bin 0 -> 1606 bytes test/reference/bug-seams.image.xfail.png | Bin 0 -> 1647 bytes test/reference/bug-seams.mask.argb32.ref.png | Bin 0 -> 1647 bytes test/reference/bug-seams.mask.rgb24.ref.png | Bin 0 -> 1647 bytes test/reference/bug-seams.ref.png | Bin 0 -> 1638 bytes test/reference/bug-seams.traps.argb32.ref.png | Bin 0 -> 1606 bytes test/reference/bug-seams.traps.rgb24.ref.png | Bin 0 -> 1606 bytes test/reference/bug-seams.xlib-fallback.ref.png | Bin 0 -> 2133 bytes test/reference/bug-source-cu.ref.png | Bin 0 -> 3815 bytes test/reference/bug-source-cu.traps.argb32.ref.png | Bin 0 -> 3816 bytes test/reference/bug-source-cu.traps.rgb24.ref.png | Bin 0 -> 3212 bytes test/reference/bug-spline.ref.png | Bin 0 -> 5405 bytes test/reference/caps-05.ref.png | Bin 0 -> 1375 bytes test/reference/caps-05.traps.ref.png | Bin 0 -> 1126 bytes test/reference/caps-1.ref.png | Bin 0 -> 1457 bytes test/reference/caps-1.traps.ref.png | Bin 0 -> 1268 bytes test/reference/caps-2.ref.png | Bin 0 -> 1509 bytes test/reference/caps-2.traps.ref.png | Bin 0 -> 1231 bytes test/reference/caps-joins-05.ref.png | Bin 0 -> 2169 bytes test/reference/caps-joins-05.traps.ref.png | Bin 0 -> 1714 bytes test/reference/caps-joins-1.ref.png | Bin 0 -> 2105 bytes test/reference/caps-joins-1.traps.ref.png | Bin 0 -> 1861 bytes test/reference/caps-joins-2.ref.png | Bin 0 -> 2046 bytes test/reference/caps-joins-2.traps.ref.png | Bin 0 -> 1631 bytes test/reference/caps-joins-alpha.image16.ref.png | Bin 0 -> 2268 bytes .../reference/caps-joins-alpha.mask.argb32.ref.png | Bin 0 -> 2662 bytes test/reference/caps-joins-alpha.mask.rgb24.ref.png | Bin 0 -> 2662 bytes test/reference/caps-joins-alpha.quartz.ref.png | Bin 0 -> 2466 bytes test/reference/caps-joins-alpha.ref.png | Bin 0 -> 2420 bytes .../caps-joins-alpha.traps.argb32.ref.png | Bin 0 -> 2265 bytes .../reference/caps-joins-alpha.traps.rgb24.ref.png | Bin 0 -> 2265 bytes test/reference/caps-joins-curve.image16.ref.png | Bin 0 -> 4928 bytes .../reference/caps-joins-curve.mask.argb32.ref.png | Bin 0 -> 6217 bytes test/reference/caps-joins-curve.mask.rgb24.ref.png | Bin 0 -> 6217 bytes test/reference/caps-joins-curve.ps.ref.png | Bin 0 -> 3715 bytes test/reference/caps-joins-curve.quartz.ref.png | Bin 0 -> 5199 bytes test/reference/caps-joins-curve.ref.png | Bin 0 -> 5681 bytes .../caps-joins-curve.traps.argb32.ref.png | Bin 0 -> 5327 bytes .../reference/caps-joins-curve.traps.rgb24.ref.png | Bin 0 -> 5327 bytes test/reference/caps-joins.base.argb32.ref.png | Bin 0 -> 2363 bytes test/reference/caps-joins.base.rgb24.ref.png | Bin 0 -> 2363 bytes test/reference/caps-joins.image16.ref.png | Bin 0 -> 2587 bytes test/reference/caps-joins.ps.ref.png | Bin 0 -> 2268 bytes test/reference/caps-joins.ref.png | Bin 0 -> 2560 bytes test/reference/caps-joins.traps.argb32.ref.png | Bin 0 -> 2363 bytes test/reference/caps-joins.traps.rgb24.ref.png | Bin 0 -> 2363 bytes test/reference/caps-sub-paths.base.argb32.ref.png | Bin 0 -> 166 bytes test/reference/caps-sub-paths.base.rgb24.ref.png | Bin 0 -> 166 bytes test/reference/caps-sub-paths.image16.ref.png | Bin 0 -> 171 bytes test/reference/caps-sub-paths.ps.ref.png | Bin 0 -> 163 bytes test/reference/caps-sub-paths.ref.png | Bin 0 -> 168 bytes test/reference/caps-sub-paths.traps.argb32.ref.png | Bin 0 -> 166 bytes test/reference/caps-sub-paths.traps.rgb24.ref.png | Bin 0 -> 166 bytes .../reference/caps-tails-curve.mask.argb32.ref.png | Bin 0 -> 53311 bytes test/reference/caps-tails-curve.mask.rgb24.ref.png | Bin 0 -> 53311 bytes test/reference/caps-tails-curve.ps.ref.png | Bin 0 -> 39753 bytes test/reference/caps-tails-curve.ref.png | Bin 0 -> 53182 bytes .../caps-tails-curve.traps.argb32.ref.png | Bin 0 -> 49798 bytes .../reference/caps-tails-curve.traps.rgb24.ref.png | Bin 0 -> 49798 bytes test/reference/caps-tails-curve.xcb.ref.png | Bin 0 -> 50367 bytes test/reference/caps.base.argb32.ref.png | Bin 0 -> 1637 bytes test/reference/caps.base.rgb24.ref.png | Bin 0 -> 1637 bytes test/reference/caps.image16.ref.png | Bin 0 -> 1936 bytes test/reference/caps.ps.ref.png | Bin 0 -> 1478 bytes test/reference/caps.ref.png | Bin 0 -> 2115 bytes test/reference/caps.traps.argb32.ref.png | Bin 0 -> 1637 bytes test/reference/caps.traps.rgb24.ref.png | Bin 0 -> 1637 bytes test/reference/checkerboard.base.argb32.ref.png | Bin 0 -> 142 bytes test/reference/checkerboard.base.rgb24.ref.png | Bin 0 -> 142 bytes test/reference/checkerboard.ref.png | Bin 0 -> 142 bytes test/reference/clear-source.base.argb32.ref.png | Bin 0 -> 882 bytes test/reference/clear-source.base.rgb24.ref.png | Bin 0 -> 882 bytes test/reference/clear-source.image16.ref.png | Bin 0 -> 909 bytes test/reference/clear-source.pdf.xfail.png | Bin 0 -> 974 bytes test/reference/clear-source.ps.xfail.png | Bin 0 -> 552 bytes test/reference/clear-source.ref.png | Bin 0 -> 882 bytes test/reference/clear-source.traps.argb32.ref.png | Bin 0 -> 882 bytes test/reference/clear-source.traps.rgb24.ref.png | Bin 0 -> 882 bytes test/reference/clear.argb32.ref.png | Bin 0 -> 701 bytes test/reference/clear.base.argb32.ref.png | Bin 0 -> 673 bytes test/reference/clear.base.rgb24.ref.png | Bin 0 -> 614 bytes test/reference/clear.pdf.argb32.ref.png | Bin 0 -> 790 bytes test/reference/clear.ps.argb32.ref.png | Bin 0 -> 790 bytes test/reference/clear.quartz.argb32.ref.png | Bin 0 -> 691 bytes test/reference/clear.quartz.rgb24.ref.png | Bin 0 -> 606 bytes test/reference/clear.rgb24.ref.png | Bin 0 -> 624 bytes test/reference/clear.svg12.argb32.xfail.png | Bin 0 -> 170 bytes test/reference/clear.svg12.rgb24.xfail.png | Bin 0 -> 170 bytes test/reference/clear.traps.argb32.ref.png | Bin 0 -> 673 bytes test/reference/clear.traps.rgb24.ref.png | Bin 0 -> 614 bytes test/reference/clip-all.base.argb32.ref.png | Bin 0 -> 95 bytes test/reference/clip-all.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/clip-all.ref.png | Bin 0 -> 118 bytes test/reference/clip-complex-bug61492.ref.png | Bin 0 -> 105 bytes .../clip-complex-shape-eo-aa.base.argb32.ref.png | Bin 0 -> 325 bytes .../clip-complex-shape-eo-aa.base.rgb24.ref.png | Bin 0 -> 325 bytes test/reference/clip-complex-shape-eo-aa.ref.png | Bin 0 -> 349 bytes .../clip-complex-shape-eo-mono.base.argb32.ref.png | Bin 0 -> 325 bytes .../clip-complex-shape-eo-mono.base.rgb24.ref.png | Bin 0 -> 325 bytes test/reference/clip-complex-shape-eo-mono.ref.png | Bin 0 -> 349 bytes test/reference/clip-contexts.base.argb32.ref.png | Bin 0 -> 98 bytes test/reference/clip-contexts.base.rgb24.ref.png | Bin 0 -> 98 bytes test/reference/clip-contexts.ref.png | Bin 0 -> 98 bytes .../clip-device-offset.base.argb32.ref.png | Bin 0 -> 175 bytes .../clip-device-offset.base.rgb24.ref.png | Bin 0 -> 168 bytes test/reference/clip-device-offset.ref.png | Bin 0 -> 175 bytes .../clip-disjoint-hatching.base.argb32.ref.png | Bin 0 -> 7948 bytes .../clip-disjoint-hatching.base.rgb24.ref.png | Bin 0 -> 7948 bytes .../clip-disjoint-hatching.mask.argb32.ref.png | Bin 0 -> 8789 bytes .../clip-disjoint-hatching.mask.rgb24.ref.png | Bin 0 -> 8789 bytes test/reference/clip-disjoint-hatching.ref.png | Bin 0 -> 7918 bytes .../clip-disjoint-hatching.traps.argb32.ref.png | Bin 0 -> 7953 bytes .../clip-disjoint-hatching.traps.rgb24.ref.png | Bin 0 -> 7953 bytes test/reference/clip-disjoint-quad.ref.png | Bin 0 -> 1642 bytes test/reference/clip-disjoint-quad.traps.ref.png | Bin 0 -> 1542 bytes test/reference/clip-disjoint.base.argb32.ref.png | Bin 0 -> 5411 bytes test/reference/clip-disjoint.base.rgb24.ref.png | Bin 0 -> 5411 bytes test/reference/clip-disjoint.image16.ref.png | Bin 0 -> 3886 bytes test/reference/clip-disjoint.mask.argb32.ref.png | Bin 0 -> 5399 bytes test/reference/clip-disjoint.mask.rgb24.ref.png | Bin 0 -> 5399 bytes test/reference/clip-disjoint.ps.ref.png | Bin 0 -> 4037 bytes test/reference/clip-disjoint.quartz.ref.png | Bin 0 -> 5476 bytes test/reference/clip-disjoint.ref.png | Bin 0 -> 5348 bytes test/reference/clip-disjoint.traps.argb32.ref.png | Bin 0 -> 5411 bytes test/reference/clip-disjoint.traps.rgb24.ref.png | Bin 0 -> 5411 bytes .../reference/clip-empty-group.base.argb32.ref.png | Bin 0 -> 103 bytes test/reference/clip-empty-group.base.rgb24.ref.png | Bin 0 -> 103 bytes test/reference/clip-empty-group.ref.png | Bin 0 -> 103 bytes test/reference/clip-empty-save.base.argb32.ref.png | Bin 0 -> 95 bytes test/reference/clip-empty-save.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/clip-empty-save.ref.png | Bin 0 -> 118 bytes test/reference/clip-empty.base.argb32.ref.png | Bin 0 -> 95 bytes test/reference/clip-empty.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/clip-empty.ref.png | Bin 0 -> 118 bytes .../clip-fill-eo-unbounded.argb32.ref.png | Bin 0 -> 4053 bytes .../clip-fill-eo-unbounded.base.argb32.ref.png | Bin 0 -> 3735 bytes .../clip-fill-eo-unbounded.base.rgb24.ref.png | Bin 0 -> 3224 bytes .../clip-fill-eo-unbounded.image16.ref.png | Bin 0 -> 2887 bytes .../clip-fill-eo-unbounded.mask.argb32.ref.png | Bin 0 -> 3769 bytes .../clip-fill-eo-unbounded.mask.rgb24.ref.png | Bin 0 -> 3211 bytes .../clip-fill-eo-unbounded.quartz.argb32.ref.png | Bin 0 -> 3382 bytes .../clip-fill-eo-unbounded.quartz.rgb24.ref.png | Bin 0 -> 2941 bytes .../reference/clip-fill-eo-unbounded.rgb24.ref.png | Bin 0 -> 3408 bytes .../clip-fill-eo-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3636 bytes .../clip-fill-eo-unbounded.traps.argb32.ref.png | Bin 0 -> 3693 bytes .../clip-fill-eo-unbounded.traps.rgb24.ref.png | Bin 0 -> 3198 bytes ...p-fill-eo-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3208 bytes test/reference/clip-fill-no-op.base.argb32.ref.png | Bin 0 -> 152 bytes test/reference/clip-fill-no-op.base.rgb24.ref.png | Bin 0 -> 152 bytes test/reference/clip-fill-no-op.image16.ref.png | Bin 0 -> 153 bytes test/reference/clip-fill-no-op.ref.png | Bin 0 -> 152 bytes .../clip-fill-nz-unbounded.argb32.ref.png | Bin 0 -> 4053 bytes .../clip-fill-nz-unbounded.base.argb32.ref.png | Bin 0 -> 3735 bytes .../clip-fill-nz-unbounded.base.rgb24.ref.png | Bin 0 -> 3224 bytes .../clip-fill-nz-unbounded.image16.ref.png | Bin 0 -> 2887 bytes .../clip-fill-nz-unbounded.mask.argb32.ref.png | Bin 0 -> 3764 bytes .../clip-fill-nz-unbounded.mask.rgb24.ref.png | Bin 0 -> 3215 bytes .../clip-fill-nz-unbounded.quartz.argb32.ref.png | Bin 0 -> 3382 bytes .../clip-fill-nz-unbounded.quartz.rgb24.ref.png | Bin 0 -> 2941 bytes .../reference/clip-fill-nz-unbounded.rgb24.ref.png | Bin 0 -> 3408 bytes .../clip-fill-nz-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3636 bytes .../clip-fill-nz-unbounded.traps.argb32.ref.png | Bin 0 -> 3693 bytes .../clip-fill-nz-unbounded.traps.rgb24.ref.png | Bin 0 -> 3198 bytes ...p-fill-nz-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3208 bytes ...lip-fill-rule-pixel-aligned.base.argb32.ref.png | Bin 0 -> 176 bytes ...clip-fill-rule-pixel-aligned.base.rgb24.ref.png | Bin 0 -> 165 bytes .../reference/clip-fill-rule-pixel-aligned.ref.png | Bin 0 -> 195 bytes test/reference/clip-fill-rule.argb32.ref.png | Bin 0 -> 430 bytes test/reference/clip-fill-rule.base.argb32.ref.png | Bin 0 -> 437 bytes test/reference/clip-fill-rule.base.rgb24.ref.png | Bin 0 -> 393 bytes test/reference/clip-fill-rule.image16.ref.png | Bin 0 -> 356 bytes test/reference/clip-fill-rule.pdf.argb32.ref.png | Bin 0 -> 509 bytes test/reference/clip-fill-rule.ps.argb32.ref.png | Bin 0 -> 251 bytes test/reference/clip-fill-rule.ps.rgb24.ref.png | Bin 0 -> 234 bytes test/reference/clip-fill-rule.quartz.rgb24.ref.png | Bin 0 -> 363 bytes test/reference/clip-fill-rule.rgb24.ref.png | Bin 0 -> 376 bytes .../clip-fill-rule.test-paginated.rgb24.ref.png | Bin 0 -> 361 bytes test/reference/clip-fill-rule.traps.argb32.ref.png | Bin 0 -> 412 bytes test/reference/clip-fill-rule.traps.rgb24.ref.png | Bin 0 -> 361 bytes test/reference/clip-fill.base.argb32.ref.png | Bin 0 -> 1039 bytes test/reference/clip-fill.base.rgb24.ref.png | Bin 0 -> 1039 bytes test/reference/clip-fill.image16.ref.png | Bin 0 -> 904 bytes test/reference/clip-fill.mask.argb32.ref.png | Bin 0 -> 1039 bytes test/reference/clip-fill.mask.rgb24.ref.png | Bin 0 -> 1039 bytes test/reference/clip-fill.ps.xfail.png | Bin 0 -> 522 bytes test/reference/clip-fill.quartz.ref.png | Bin 0 -> 875 bytes test/reference/clip-fill.ref.png | Bin 0 -> 1046 bytes test/reference/clip-fill.traps.argb32.ref.png | Bin 0 -> 1049 bytes test/reference/clip-fill.traps.rgb24.ref.png | Bin 0 -> 1049 bytes test/reference/clip-fill.xlib-fallback.ref.png | Bin 0 -> 1063 bytes ...p-shapes-aligned-rectangles.base.argb32.ref.png | Bin 0 -> 378 bytes ...up-shapes-aligned-rectangles.base.rgb24.ref.png | Bin 0 -> 378 bytes .../clip-group-shapes-aligned-rectangles.ref.png | Bin 0 -> 378 bytes .../clip-group-shapes-circles.base.argb32.ref.png | Bin 0 -> 1511 bytes .../clip-group-shapes-circles.base.rgb24.ref.png | Bin 0 -> 1511 bytes .../clip-group-shapes-circles.mask.argb32.ref.png | Bin 0 -> 1511 bytes .../clip-group-shapes-circles.mask.rgb24.ref.png | Bin 0 -> 1511 bytes .../reference/clip-group-shapes-circles.ps.ref.png | Bin 0 -> 678 bytes .../clip-group-shapes-circles.quartz.ref.png | Bin 0 -> 1518 bytes test/reference/clip-group-shapes-circles.ref.png | Bin 0 -> 1504 bytes .../clip-group-shapes-circles.traps.argb32.ref.png | Bin 0 -> 1530 bytes .../clip-group-shapes-circles.traps.rgb24.ref.png | Bin 0 -> 1530 bytes ...shapes-unaligned-rectangles.base.argb32.ref.png | Bin 0 -> 415 bytes ...-shapes-unaligned-rectangles.base.rgb24.ref.png | Bin 0 -> 415 bytes ...shapes-unaligned-rectangles.mask.argb32.ref.png | Bin 0 -> 431 bytes ...-shapes-unaligned-rectangles.mask.rgb24.ref.png | Bin 0 -> 431 bytes .../clip-group-shapes-unaligned-rectangles.ref.png | Bin 0 -> 415 bytes ...hapes-unaligned-rectangles.traps.argb32.ref.png | Bin 0 -> 431 bytes ...shapes-unaligned-rectangles.traps.rgb24.ref.png | Bin 0 -> 431 bytes test/reference/clip-image.base.argb32.ref.png | Bin 0 -> 2677 bytes test/reference/clip-image.base.rgb24.ref.png | Bin 0 -> 2677 bytes test/reference/clip-image.image16.ref.png | Bin 0 -> 2032 bytes test/reference/clip-image.mask.argb32.ref.png | Bin 0 -> 2678 bytes test/reference/clip-image.mask.rgb24.ref.png | Bin 0 -> 2678 bytes test/reference/clip-image.ps.ref.png | Bin 0 -> 2498 bytes test/reference/clip-image.ref.png | Bin 0 -> 2677 bytes test/reference/clip-image.traps.argb32.ref.png | Bin 0 -> 2686 bytes test/reference/clip-image.traps.rgb24.ref.png | Bin 0 -> 2686 bytes test/reference/clip-intersect.base.argb32.ref.png | Bin 0 -> 200 bytes test/reference/clip-intersect.base.rgb24.ref.png | Bin 0 -> 200 bytes test/reference/clip-intersect.ref.png | Bin 0 -> 224 bytes test/reference/clip-intersect.traps.argb32.ref.png | Bin 0 -> 193 bytes test/reference/clip-intersect.traps.rgb24.ref.png | Bin 0 -> 193 bytes .../clip-mixed-antialias.base.argb32.ref.png | Bin 0 -> 1094 bytes .../clip-mixed-antialias.base.rgb24.ref.png | Bin 0 -> 1094 bytes test/reference/clip-mixed-antialias.ref.png | Bin 0 -> 1084 bytes .../clip-mixed-antialias.traps.argb32.ref.png | Bin 0 -> 1094 bytes .../clip-mixed-antialias.traps.rgb24.ref.png | Bin 0 -> 1094 bytes test/reference/clip-nesting.argb32.ref.png | Bin 0 -> 1026 bytes test/reference/clip-nesting.base.argb32.ref.png | Bin 0 -> 1044 bytes test/reference/clip-nesting.base.rgb24.ref.png | Bin 0 -> 937 bytes test/reference/clip-nesting.mask.rgb24.ref.png | Bin 0 -> 937 bytes test/reference/clip-nesting.pdf.argb32.ref.png | Bin 0 -> 850 bytes test/reference/clip-nesting.ps.argb32.ref.png | Bin 0 -> 441 bytes test/reference/clip-nesting.ps.rgb24.ref.png | Bin 0 -> 492 bytes test/reference/clip-nesting.quartz.argb32.ref.png | Bin 0 -> 1048 bytes test/reference/clip-nesting.quartz.rgb24.ref.png | Bin 0 -> 937 bytes test/reference/clip-nesting.rgb24.ref.png | Bin 0 -> 917 bytes .../clip-nesting.test-paginated.rgb24.ref.png | Bin 0 -> 936 bytes test/reference/clip-nesting.traps.argb32.ref.png | Bin 0 -> 1031 bytes test/reference/clip-nesting.traps.rgb24.ref.png | Bin 0 -> 936 bytes test/reference/clip-operator.argb32.ref.png | Bin 0 -> 8514 bytes test/reference/clip-operator.base.argb32.ref.png | Bin 0 -> 8136 bytes test/reference/clip-operator.base.rgb24.ref.png | Bin 0 -> 3244 bytes test/reference/clip-operator.gl.argb32.ref.png | Bin 0 -> 8296 bytes test/reference/clip-operator.image16.ref.png | Bin 0 -> 3131 bytes test/reference/clip-operator.mask.argb32.ref.png | Bin 0 -> 8680 bytes test/reference/clip-operator.mask.rgb24.ref.png | Bin 0 -> 3519 bytes test/reference/clip-operator.pdf.argb32.ref.png | Bin 0 -> 8792 bytes test/reference/clip-operator.pdf.rgb24.ref.png | Bin 0 -> 4683 bytes test/reference/clip-operator.ps2.rgb24.ref.png | Bin 0 -> 3736 bytes test/reference/clip-operator.ps3.argb32.ref.png | Bin 0 -> 7576 bytes test/reference/clip-operator.ps3.ref.png | Bin 0 -> 8188 bytes test/reference/clip-operator.ps3.rgb24.ref.png | Bin 0 -> 3736 bytes test/reference/clip-operator.quartz.argb32.ref.png | Bin 0 -> 9672 bytes test/reference/clip-operator.quartz.rgb24.ref.png | Bin 0 -> 4343 bytes test/reference/clip-operator.rgb24.ref.png | Bin 0 -> 3417 bytes .../reference/clip-operator.svg12.argb32.xfail.png | Bin 0 -> 8378 bytes test/reference/clip-operator.svg12.rgb24.xfail.png | Bin 0 -> 4566 bytes .../clip-operator.test-paginated.argb32.ref.png | Bin 0 -> 8189 bytes test/reference/clip-operator.traps.argb32.ref.png | Bin 0 -> 8114 bytes test/reference/clip-operator.traps.rgb24.ref.png | Bin 0 -> 3245 bytes test/reference/clip-operator.xlib-fallback.ref.png | Bin 0 -> 3228 bytes test/reference/clip-polygons.base.argb32.ref.png | Bin 0 -> 1336 bytes test/reference/clip-polygons.base.rgb24.ref.png | Bin 0 -> 1336 bytes test/reference/clip-polygons.mask.argb32.ref.png | Bin 0 -> 1336 bytes test/reference/clip-polygons.mask.rgb24.ref.png | Bin 0 -> 1336 bytes test/reference/clip-polygons.ref.png | Bin 0 -> 1352 bytes test/reference/clip-polygons.traps.ref.png | Bin 0 -> 1268 bytes test/reference/clip-push-group.base.argb32.ref.png | Bin 0 -> 164 bytes test/reference/clip-push-group.base.rgb24.ref.png | Bin 0 -> 164 bytes test/reference/clip-push-group.image16.ref.png | Bin 0 -> 159 bytes test/reference/clip-push-group.pdf.ref.png | Bin 0 -> 164 bytes test/reference/clip-push-group.ps.ref.png | Bin 0 -> 120 bytes test/reference/clip-push-group.quartz.ref.png | Bin 0 -> 166 bytes test/reference/clip-push-group.ref.png | Bin 0 -> 164 bytes test/reference/clip-push-group.svg.ref.png | Bin 0 -> 175 bytes .../reference/clip-push-group.traps.argb32.ref.png | Bin 0 -> 155 bytes test/reference/clip-push-group.traps.rgb24.ref.png | Bin 0 -> 155 bytes .../reference/clip-rectilinear.base.argb32.ref.png | Bin 0 -> 439 bytes test/reference/clip-rectilinear.base.rgb24.ref.png | Bin 0 -> 439 bytes .../reference/clip-rectilinear.mask.argb32.ref.png | Bin 0 -> 440 bytes test/reference/clip-rectilinear.mask.rgb24.ref.png | Bin 0 -> 440 bytes test/reference/clip-rectilinear.ref.png | Bin 0 -> 439 bytes test/reference/clip-rectilinear.traps.ref.png | Bin 0 -> 440 bytes ...-rotate-image-surface-paint.base.argb32.ref.png | Bin 0 -> 202 bytes ...p-rotate-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 202 bytes .../clip-rotate-image-surface-paint.ref.png | Bin 0 -> 202 bytes test/reference/clip-shape.base.argb32.ref.png | Bin 0 -> 2916 bytes test/reference/clip-shape.base.rgb24.ref.png | Bin 0 -> 2916 bytes test/reference/clip-shape.image16.ref.png | Bin 0 -> 2488 bytes test/reference/clip-shape.mask.argb32.ref.png | Bin 0 -> 3094 bytes test/reference/clip-shape.mask.rgb24.ref.png | Bin 0 -> 3094 bytes test/reference/clip-shape.ps.ref.png | Bin 0 -> 1797 bytes test/reference/clip-shape.quartz.ref.png | Bin 0 -> 3229 bytes test/reference/clip-shape.ref.png | Bin 0 -> 2902 bytes test/reference/clip-shape.traps.argb32.ref.png | Bin 0 -> 2944 bytes test/reference/clip-shape.traps.rgb24.ref.png | Bin 0 -> 2944 bytes test/reference/clip-shape.xlib-fallback.ref.png | Bin 0 -> 2916 bytes .../clip-stroke-no-op.base.argb32.ref.png | Bin 0 -> 152 bytes .../reference/clip-stroke-no-op.base.rgb24.ref.png | Bin 0 -> 152 bytes test/reference/clip-stroke-no-op.image16.ref.png | Bin 0 -> 153 bytes test/reference/clip-stroke-no-op.ref.png | Bin 0 -> 152 bytes .../reference/clip-stroke-unbounded.argb32.ref.png | Bin 0 -> 4097 bytes .../clip-stroke-unbounded.base.argb32.ref.png | Bin 0 -> 3655 bytes .../clip-stroke-unbounded.base.rgb24.ref.png | Bin 0 -> 3135 bytes .../clip-stroke-unbounded.image16.rgb24.ref.png | Bin 0 -> 2778 bytes .../clip-stroke-unbounded.mask.argb32.ref.png | Bin 0 -> 3991 bytes .../clip-stroke-unbounded.mask.rgb24.ref.png | Bin 0 -> 3372 bytes .../clip-stroke-unbounded.quartz.argb32.ref.png | Bin 0 -> 3290 bytes .../clip-stroke-unbounded.quartz.rgb24.ref.png | Bin 0 -> 2840 bytes test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 0 -> 3486 bytes .../clip-stroke-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3569 bytes .../clip-stroke-unbounded.traps.argb32.ref.png | Bin 0 -> 3617 bytes .../clip-stroke-unbounded.traps.rgb24.ref.png | Bin 0 -> 3108 bytes ...ip-stroke-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3123 bytes test/reference/clip-stroke.base.argb32.ref.png | Bin 0 -> 1444 bytes test/reference/clip-stroke.base.rgb24.ref.png | Bin 0 -> 1444 bytes test/reference/clip-stroke.image16.ref.png | Bin 0 -> 1305 bytes test/reference/clip-stroke.mask.argb32.ref.png | Bin 0 -> 1500 bytes test/reference/clip-stroke.mask.rgb24.ref.png | Bin 0 -> 1500 bytes test/reference/clip-stroke.ps.xfail.png | Bin 0 -> 662 bytes test/reference/clip-stroke.quartz.ref.png | Bin 0 -> 1305 bytes test/reference/clip-stroke.ref.png | Bin 0 -> 1571 bytes test/reference/clip-stroke.traps.argb32.ref.png | Bin 0 -> 1492 bytes test/reference/clip-stroke.traps.rgb24.ref.png | Bin 0 -> 1492 bytes test/reference/clip-stroke.xlib-fallback.ref.png | Bin 0 -> 1491 bytes test/reference/clip-text.base.argb32.ref.png | Bin 0 -> 921 bytes test/reference/clip-text.base.rgb24.ref.png | Bin 0 -> 921 bytes test/reference/clip-text.image16.ref.png | Bin 0 -> 811 bytes test/reference/clip-text.mask.argb32.ref.png | Bin 0 -> 918 bytes test/reference/clip-text.mask.rgb24.ref.png | Bin 0 -> 918 bytes test/reference/clip-text.ps.xfail.png | Bin 0 -> 434 bytes test/reference/clip-text.quartz.ref.png | Bin 0 -> 854 bytes test/reference/clip-text.ref.png | Bin 0 -> 912 bytes test/reference/clip-text.svg.ref.png | Bin 0 -> 946 bytes test/reference/clip-text.traps.argb32.ref.png | Bin 0 -> 899 bytes test/reference/clip-text.traps.rgb24.ref.png | Bin 0 -> 899 bytes .../clip-twice-rectangle.base.argb32.ref.png | Bin 0 -> 323 bytes .../clip-twice-rectangle.base.rgb24.ref.png | Bin 0 -> 323 bytes test/reference/clip-twice-rectangle.ref.png | Bin 0 -> 323 bytes test/reference/clip-twice.argb32.ref.png | Bin 0 -> 1333 bytes test/reference/clip-twice.base.argb32.ref.png | Bin 0 -> 1341 bytes test/reference/clip-twice.base.rgb24.ref.png | Bin 0 -> 1194 bytes test/reference/clip-twice.image16.ref.png | Bin 0 -> 1069 bytes test/reference/clip-twice.mask.argb32.ref.png | Bin 0 -> 1306 bytes test/reference/clip-twice.mask.rgb24.ref.png | Bin 0 -> 1215 bytes test/reference/clip-twice.pdf.argb32.ref.png | Bin 0 -> 1498 bytes test/reference/clip-twice.ps.argb32.ref.png | Bin 0 -> 492 bytes test/reference/clip-twice.ps.rgb24.ref.png | Bin 0 -> 409 bytes test/reference/clip-twice.quartz.argb32.ref.png | Bin 0 -> 1171 bytes test/reference/clip-twice.quartz.rgb24.ref.png | Bin 0 -> 1095 bytes test/reference/clip-twice.rgb24.ref.png | Bin 0 -> 1171 bytes .../clip-twice.test-paginated.argb32.ref.png | Bin 0 -> 1361 bytes .../clip-twice.test-paginated.rgb24.ref.png | Bin 0 -> 1199 bytes test/reference/clip-twice.traps.argb32.ref.png | Bin 0 -> 1328 bytes test/reference/clip-twice.traps.rgb24.ref.png | Bin 0 -> 1173 bytes test/reference/clip-unbounded.base.argb32.ref.png | Bin 0 -> 100 bytes test/reference/clip-unbounded.base.rgb24.ref.png | Bin 0 -> 97 bytes test/reference/clip-unbounded.pdf.argb32.xfail.png | Bin 0 -> 95 bytes test/reference/clip-unbounded.pdf.rgb24.xfail.png | Bin 0 -> 95 bytes test/reference/clip-unbounded.ref.png | Bin 0 -> 100 bytes .../reference/clip-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 100 bytes test/reference/clip-xlib-fallback.rgb24.ref.png | Bin 0 -> 2686 bytes test/reference/clip-xlib-window.rgb24.ref.png | Bin 0 -> 2686 bytes test/reference/clip-xlib.ref.png | Bin 0 -> 2686 bytes test/reference/clipped-group.base.argb32.ref.png | Bin 0 -> 316 bytes test/reference/clipped-group.base.rgb24.ref.png | Bin 0 -> 316 bytes test/reference/clipped-group.image16.ref.png | Bin 0 -> 270 bytes test/reference/clipped-group.mask.argb32.ref.png | Bin 0 -> 336 bytes test/reference/clipped-group.mask.rgb24.ref.png | Bin 0 -> 336 bytes test/reference/clipped-group.pdf.ref.png | Bin 0 -> 334 bytes test/reference/clipped-group.ps2.ref.png | Bin 0 -> 214 bytes test/reference/clipped-group.ps3.ref.png | Bin 0 -> 214 bytes test/reference/clipped-group.quartz.ref.png | Bin 0 -> 308 bytes test/reference/clipped-group.ref.png | Bin 0 -> 315 bytes test/reference/clipped-group.svg.ref.png | Bin 0 -> 250 bytes test/reference/clipped-group.traps.argb32.ref.png | Bin 0 -> 289 bytes test/reference/clipped-group.traps.rgb24.ref.png | Bin 0 -> 289 bytes test/reference/clipped-group.xlib-fallback.ref.png | Bin 0 -> 344 bytes test/reference/clipped-surface.base.argb32.ref.png | Bin 0 -> 345 bytes test/reference/clipped-surface.base.rgb24.ref.png | Bin 0 -> 345 bytes test/reference/clipped-surface.image16.ref.png | Bin 0 -> 296 bytes test/reference/clipped-surface.ref.png | Bin 0 -> 401 bytes test/reference/clipped-trapezoids.ref.png | Bin 0 -> 963 bytes .../close-path-current-point.base.argb32.ref.png | Bin 0 -> 1904 bytes .../close-path-current-point.base.rgb24.ref.png | Bin 0 -> 1904 bytes .../close-path-current-point.image16.ref.png | Bin 0 -> 1804 bytes .../close-path-current-point.mask.argb32.ref.png | Bin 0 -> 2324 bytes .../close-path-current-point.mask.rgb24.ref.png | Bin 0 -> 2324 bytes test/reference/close-path-current-point.ps.ref.png | Bin 0 -> 1490 bytes test/reference/close-path-current-point.ref.png | Bin 0 -> 2109 bytes .../close-path-current-point.traps.argb32.ref.png | Bin 0 -> 1904 bytes .../close-path-current-point.traps.rgb24.ref.png | Bin 0 -> 1904 bytes test/reference/close-path.base.argb32.ref.png | Bin 0 -> 284 bytes test/reference/close-path.base.rgb24.ref.png | Bin 0 -> 284 bytes test/reference/close-path.ps2.ref.png | Bin 0 -> 309 bytes test/reference/close-path.ps3.ref.png | Bin 0 -> 309 bytes test/reference/close-path.ref.png | Bin 0 -> 294 bytes test/reference/close-path.traps.argb32.ref.png | Bin 0 -> 284 bytes test/reference/close-path.traps.rgb24.ref.png | Bin 0 -> 284 bytes ...teger-translate-over-repeat.base.argb32.ref.png | Bin 0 -> 334 bytes ...nteger-translate-over-repeat.base.rgb24.ref.png | Bin 0 -> 334 bytes ...osite-integer-translate-over-repeat.ps2.ref.png | Bin 0 -> 448 bytes ...osite-integer-translate-over-repeat.ps3.ref.png | Bin 0 -> 448 bytes ...composite-integer-translate-over-repeat.ref.png | Bin 0 -> 401 bytes ...site-integer-translate-over.base.argb32.ref.png | Bin 0 -> 13998 bytes ...osite-integer-translate-over.base.rgb24.ref.png | Bin 0 -> 13998 bytes ...omposite-integer-translate-over.image16.ref.png | Bin 0 -> 11570 bytes .../composite-integer-translate-over.ps2.ref.png | Bin 0 -> 15783 bytes .../composite-integer-translate-over.ps3.ref.png | Bin 0 -> 15783 bytes .../composite-integer-translate-over.ref.png | Bin 0 -> 16385 bytes ...te-integer-translate-source.base.argb32.ref.png | Bin 0 -> 13998 bytes ...ite-integer-translate-source.base.rgb24.ref.png | Bin 0 -> 13998 bytes ...posite-integer-translate-source.image16.ref.png | Bin 0 -> 11570 bytes .../composite-integer-translate-source.ps2.ref.png | Bin 0 -> 15783 bytes .../composite-integer-translate-source.ps3.ref.png | Bin 0 -> 15783 bytes .../composite-integer-translate-source.ref.png | Bin 0 -> 16385 bytes ...integer-translate-source.svg12.argb32.xfail.png | Bin 0 -> 16392 bytes ...-integer-translate-source.svg12.rgb24.xfail.png | Bin 0 -> 16392 bytes test/reference/copy-disjoint.base.argb32.ref.png | Bin 0 -> 1098 bytes test/reference/copy-disjoint.base.rgb24.ref.png | Bin 0 -> 1098 bytes test/reference/copy-disjoint.ref.png | Bin 0 -> 1098 bytes test/reference/copy-path.base.argb32.ref.png | Bin 0 -> 588 bytes test/reference/copy-path.base.rgb24.ref.png | Bin 0 -> 588 bytes test/reference/copy-path.image16.ref.png | Bin 0 -> 556 bytes test/reference/copy-path.ps.ref.png | Bin 0 -> 379 bytes test/reference/copy-path.ref.png | Bin 0 -> 616 bytes test/reference/copy-path.traps.argb32.ref.png | Bin 0 -> 588 bytes test/reference/copy-path.traps.rgb24.ref.png | Bin 0 -> 588 bytes test/reference/coverage-abutting.ref.png | Bin 0 -> 777 bytes test/reference/coverage-column-triangles.ref.png | Bin 0 -> 208 bytes test/reference/coverage-column-triangles.xfail.png | Bin 0 -> 7632 bytes .../coverage-column-triangles.xlib.xfail.png | Bin 0 -> 12745 bytes test/reference/coverage-intersecting-quads.ref.png | Bin 0 -> 253 bytes .../coverage-intersecting-quads.xlib.xfail.png | Bin 0 -> 15296 bytes .../coverage-intersecting-triangles.ref.png | Bin 0 -> 209 bytes .../coverage-intersecting-triangles.xfail.png | Bin 0 -> 14444 bytes .../coverage-intersecting-triangles.xlib.xfail.png | Bin 0 -> 16728 bytes test/reference/coverage-rectangles.ref.png | Bin 0 -> 259 bytes test/reference/coverage-rectangles.xlib.xfail.png | Bin 0 -> 15981 bytes test/reference/coverage-rhombus.ref.png | Bin 0 -> 7053 bytes test/reference/coverage-rhombus.xfail.png | Bin 0 -> 9898 bytes test/reference/coverage-row-triangles.ref.png | Bin 0 -> 208 bytes test/reference/coverage-row-triangles.xfail.png | Bin 0 -> 512 bytes .../coverage-row-triangles.xlib.xfail.png | Bin 0 -> 12671 bytes test/reference/coverage-triangles.ref.png | Bin 0 -> 253 bytes test/reference/coverage-triangles.xfail.png | Bin 0 -> 14283 bytes test/reference/coverage-triangles.xlib.xfail.png | Bin 0 -> 15859 bytes .../create-from-png-stream.base.argb32.ref.png | Bin 0 -> 96 bytes .../create-from-png-stream.base.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/create-from-png-stream.ref.png | Bin 0 -> 100 bytes test/reference/create-from-png.alpha.ref.png | Bin 0 -> 150 bytes test/reference/create-from-png.base.argb32.ref.png | Bin 0 -> 96 bytes test/reference/create-from-png.base.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/create-from-png.gray-alpha.ref.png | Bin 0 -> 142 bytes test/reference/create-from-png.gray.ref.png | Bin 0 -> 124 bytes .../create-from-png.indexed-alpha.ref.png | Bin 0 -> 172 bytes test/reference/create-from-png.indexed.ref.png | Bin 0 -> 159 bytes test/reference/create-from-png.mask.argb32.ref.png | Bin 0 -> 96 bytes test/reference/create-from-png.mask.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/create-from-png.ref.png | Bin 0 -> 96 bytes .../reference/create-from-png.traps.argb32.ref.png | Bin 0 -> 96 bytes test/reference/create-from-png.traps.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/culled-glyphs.base.argb32.ref.png | Bin 0 -> 440 bytes test/reference/culled-glyphs.base.rgb24.ref.png | Bin 0 -> 440 bytes test/reference/culled-glyphs.image16.ref.png | Bin 0 -> 426 bytes test/reference/culled-glyphs.ps.ref.png | Bin 0 -> 372 bytes test/reference/culled-glyphs.quartz.ref.png | Bin 0 -> 493 bytes test/reference/culled-glyphs.ref.png | Bin 0 -> 440 bytes .../curve-to-as-line-to.base.argb32.ref.png | Bin 0 -> 95 bytes .../curve-to-as-line-to.base.rgb24.ref.png | Bin 0 -> 95 bytes .../curve-to-as-line-to.mask.argb32.ref.png | Bin 0 -> 109 bytes .../curve-to-as-line-to.mask.rgb24.ref.png | Bin 0 -> 109 bytes test/reference/curve-to-as-line-to.ps.xfail.png | Bin 0 -> 112 bytes test/reference/curve-to-as-line-to.ref.png | Bin 0 -> 95 bytes .../curve-to-as-line-to.traps.argb32.ref.png | Bin 0 -> 95 bytes .../curve-to-as-line-to.traps.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/dash-caps-joins.base.argb32.ref.png | Bin 0 -> 4483 bytes test/reference/dash-caps-joins.base.rgb24.ref.png | Bin 0 -> 4483 bytes test/reference/dash-caps-joins.image16.ref.png | Bin 0 -> 4491 bytes test/reference/dash-caps-joins.mask.argb32.ref.png | Bin 0 -> 5157 bytes test/reference/dash-caps-joins.mask.rgb24.ref.png | Bin 0 -> 5157 bytes test/reference/dash-caps-joins.ps.ref.png | Bin 0 -> 3648 bytes test/reference/dash-caps-joins.quartz.xfail.png | Bin 0 -> 4446 bytes test/reference/dash-caps-joins.ref.png | Bin 0 -> 4713 bytes .../reference/dash-caps-joins.traps.argb32.ref.png | Bin 0 -> 4483 bytes test/reference/dash-caps-joins.traps.rgb24.ref.png | Bin 0 -> 4483 bytes test/reference/dash-curve.image16.ref.png | Bin 0 -> 32445 bytes test/reference/dash-curve.mask.argb32.ref.png | Bin 0 -> 41040 bytes test/reference/dash-curve.mask.rgb24.ref.png | Bin 0 -> 41040 bytes test/reference/dash-curve.ps2.ref.png | Bin 0 -> 24355 bytes test/reference/dash-curve.ps3.ref.png | Bin 0 -> 24355 bytes test/reference/dash-curve.quartz.xfail.png | Bin 0 -> 42238 bytes test/reference/dash-curve.ref.png | Bin 0 -> 41069 bytes test/reference/dash-curve.traps.argb32.ref.png | Bin 0 -> 39925 bytes test/reference/dash-curve.traps.rgb24.ref.png | Bin 0 -> 39925 bytes .../dash-infinite-loop.base.argb32.ref.png | Bin 0 -> 642 bytes .../dash-infinite-loop.base.rgb24.ref.png | Bin 0 -> 642 bytes test/reference/dash-infinite-loop.ps.ref.png | Bin 0 -> 601 bytes test/reference/dash-infinite-loop.ref.png | Bin 0 -> 877 bytes .../dash-infinite-loop.traps.argb32.ref.png | Bin 0 -> 642 bytes .../dash-infinite-loop.traps.rgb24.ref.png | Bin 0 -> 642 bytes test/reference/dash-no-dash.base.argb32.ref.png | Bin 0 -> 119 bytes test/reference/dash-no-dash.base.rgb24.ref.png | Bin 0 -> 119 bytes test/reference/dash-no-dash.ref.png | Bin 0 -> 152 bytes .../dash-offset-negative.base.argb32.ref.png | Bin 0 -> 151 bytes .../dash-offset-negative.base.rgb24.ref.png | Bin 0 -> 151 bytes test/reference/dash-offset-negative.pdf.ref.png | Bin 0 -> 129 bytes test/reference/dash-offset-negative.ref.png | Bin 0 -> 129 bytes .../dash-offset-negative.traps.argb32.ref.png | Bin 0 -> 151 bytes .../dash-offset-negative.traps.rgb24.ref.png | Bin 0 -> 151 bytes test/reference/dash-offset.base.argb32.ref.png | Bin 0 -> 794 bytes test/reference/dash-offset.base.rgb24.ref.png | Bin 0 -> 794 bytes test/reference/dash-offset.ref.png | Bin 0 -> 794 bytes test/reference/dash-scale.image16.ref.png | Bin 0 -> 7748 bytes test/reference/dash-scale.mask.argb32.ref.png | Bin 0 -> 8913 bytes test/reference/dash-scale.mask.rgb24.ref.png | Bin 0 -> 8913 bytes test/reference/dash-scale.ps.ref.png | Bin 0 -> 5965 bytes test/reference/dash-scale.quartz.ref.png | Bin 0 -> 7614 bytes test/reference/dash-scale.ref.png | Bin 0 -> 7826 bytes test/reference/dash-scale.traps.argb32.ref.png | Bin 0 -> 7627 bytes test/reference/dash-scale.traps.rgb24.ref.png | Bin 0 -> 7627 bytes test/reference/dash-state.base.argb32.ref.png | Bin 0 -> 7509 bytes test/reference/dash-state.base.rgb24.ref.png | Bin 0 -> 7509 bytes test/reference/dash-state.image16.ref.png | Bin 0 -> 7910 bytes test/reference/dash-state.ps2.ref.png | Bin 0 -> 8740 bytes test/reference/dash-state.ps3.ref.png | Bin 0 -> 8740 bytes test/reference/dash-state.quartz.xfail.png | Bin 0 -> 6957 bytes test/reference/dash-state.ref.png | Bin 0 -> 8027 bytes test/reference/dash-state.traps.argb32.ref.png | Bin 0 -> 7509 bytes test/reference/dash-state.traps.rgb24.ref.png | Bin 0 -> 7509 bytes .../reference/dash-zero-length.base.argb32.ref.png | Bin 0 -> 219 bytes test/reference/dash-zero-length.base.rgb24.ref.png | Bin 0 -> 199 bytes test/reference/dash-zero-length.mask.rgb24.ref.png | Bin 0 -> 210 bytes test/reference/dash-zero-length.ps2.ref.png | Bin 0 -> 319 bytes test/reference/dash-zero-length.ps2.rgb24.ref.png | Bin 0 -> 304 bytes test/reference/dash-zero-length.ps3.ref.png | Bin 0 -> 319 bytes test/reference/dash-zero-length.ps3.rgb24.ref.png | Bin 0 -> 304 bytes test/reference/dash-zero-length.ref.png | Bin 0 -> 230 bytes .../dash-zero-length.traps.argb32.ref.png | Bin 0 -> 219 bytes .../reference/dash-zero-length.traps.rgb24.ref.png | Bin 0 -> 199 bytes test/reference/degenerate-arc.base.argb32.ref.png | Bin 0 -> 574 bytes test/reference/degenerate-arc.base.rgb24.ref.png | Bin 0 -> 574 bytes test/reference/degenerate-arc.image16.ref.png | Bin 0 -> 592 bytes test/reference/degenerate-arc.mask.argb32.ref.png | Bin 0 -> 653 bytes test/reference/degenerate-arc.mask.rgb24.ref.png | Bin 0 -> 653 bytes test/reference/degenerate-arc.ps2.ref.png | Bin 0 -> 509 bytes test/reference/degenerate-arc.ps3.ref.png | Bin 0 -> 509 bytes test/reference/degenerate-arc.quartz.ref.png | Bin 0 -> 552 bytes test/reference/degenerate-arc.ref.png | Bin 0 -> 626 bytes test/reference/degenerate-arc.traps.argb32.ref.png | Bin 0 -> 574 bytes test/reference/degenerate-arc.traps.rgb24.ref.png | Bin 0 -> 574 bytes test/reference/degenerate-arcs.base.argb32.ref.png | Bin 0 -> 120 bytes test/reference/degenerate-arcs.base.rgb24.ref.png | Bin 0 -> 120 bytes test/reference/degenerate-arcs.image16.ref.png | Bin 0 -> 120 bytes test/reference/degenerate-arcs.ref.png | Bin 0 -> 120 bytes .../degenerate-curve-to.base.argb32.ref.png | Bin 0 -> 282 bytes .../degenerate-curve-to.base.rgb24.ref.png | Bin 0 -> 282 bytes test/reference/degenerate-curve-to.image16.ref.png | Bin 0 -> 278 bytes .../degenerate-curve-to.mask.argb32.ref.png | Bin 0 -> 280 bytes .../degenerate-curve-to.mask.rgb24.ref.png | Bin 0 -> 280 bytes test/reference/degenerate-curve-to.ps.xfail.png | Bin 0 -> 221 bytes test/reference/degenerate-curve-to.quartz.ref.png | Bin 0 -> 247 bytes test/reference/degenerate-curve-to.ref.png | Bin 0 -> 285 bytes .../degenerate-curve-to.traps.argb32.ref.png | Bin 0 -> 282 bytes .../degenerate-curve-to.traps.rgb24.ref.png | Bin 0 -> 282 bytes test/reference/degenerate-dash.base.argb32.ref.png | Bin 0 -> 1911 bytes test/reference/degenerate-dash.base.rgb24.ref.png | Bin 0 -> 1911 bytes test/reference/degenerate-dash.mask.argb32.ref.png | Bin 0 -> 2086 bytes test/reference/degenerate-dash.mask.rgb24.ref.png | Bin 0 -> 2086 bytes test/reference/degenerate-dash.ps.xfail.png | Bin 0 -> 1837 bytes test/reference/degenerate-dash.quartz.xfail.png | Bin 0 -> 1560 bytes test/reference/degenerate-dash.ref.png | Bin 0 -> 1960 bytes .../reference/degenerate-dash.traps.argb32.ref.png | Bin 0 -> 1911 bytes test/reference/degenerate-dash.traps.rgb24.ref.png | Bin 0 -> 1911 bytes .../degenerate-linear-gradient.base.argb32.ref.png | Bin 0 -> 336 bytes .../degenerate-linear-gradient.base.rgb24.ref.png | Bin 0 -> 336 bytes test/reference/degenerate-linear-gradient.ref.png | Bin 0 -> 336 bytes test/reference/degenerate-path.base.argb32.ref.png | Bin 0 -> 237 bytes test/reference/degenerate-path.base.rgb24.ref.png | Bin 0 -> 204 bytes test/reference/degenerate-path.mask.argb32.ref.png | Bin 0 -> 250 bytes test/reference/degenerate-path.mask.rgb24.ref.png | Bin 0 -> 219 bytes test/reference/degenerate-path.ps.argb32.xfail.png | Bin 0 -> 234 bytes test/reference/degenerate-path.ps.rgb24.xfail.png | Bin 0 -> 184 bytes .../degenerate-path.quartz.argb32.xfail.png | Bin 0 -> 200 bytes .../degenerate-path.quartz.rgb24.xfail.png | Bin 0 -> 172 bytes test/reference/degenerate-path.ref.png | Bin 0 -> 251 bytes .../reference/degenerate-path.traps.argb32.ref.png | Bin 0 -> 237 bytes test/reference/degenerate-path.traps.rgb24.ref.png | Bin 0 -> 204 bytes test/reference/degenerate-pen.base.argb32.ref.png | Bin 0 -> 1000 bytes test/reference/degenerate-pen.base.rgb24.ref.png | Bin 0 -> 1000 bytes test/reference/degenerate-pen.image16.ref.png | Bin 0 -> 954 bytes test/reference/degenerate-pen.ps.ref.png | Bin 0 -> 753 bytes test/reference/degenerate-pen.ref.png | Bin 0 -> 1019 bytes test/reference/degenerate-pen.traps.argb32.ref.png | Bin 0 -> 1000 bytes test/reference/degenerate-pen.traps.rgb24.ref.png | Bin 0 -> 1000 bytes .../degenerate-radial-gradient.base.argb32.ref.png | Bin 0 -> 428 bytes .../degenerate-radial-gradient.base.rgb24.ref.png | Bin 0 -> 428 bytes test/reference/degenerate-radial-gradient.ref.png | Bin 0 -> 428 bytes .../degenerate-rel-curve-to.base.argb32.ref.png | Bin 0 -> 278 bytes .../degenerate-rel-curve-to.base.rgb24.ref.png | Bin 0 -> 278 bytes .../degenerate-rel-curve-to.image16.ref.png | Bin 0 -> 279 bytes .../degenerate-rel-curve-to.mask.argb32.ref.png | Bin 0 -> 277 bytes .../degenerate-rel-curve-to.mask.rgb24.ref.png | Bin 0 -> 277 bytes test/reference/degenerate-rel-curve-to.ps.ref.png | Bin 0 -> 225 bytes .../degenerate-rel-curve-to.quartz.ref.png | Bin 0 -> 246 bytes test/reference/degenerate-rel-curve-to.ref.png | Bin 0 -> 278 bytes .../degenerate-rel-curve-to.traps.argb32.ref.png | Bin 0 -> 278 bytes .../degenerate-rel-curve-to.traps.rgb24.ref.png | Bin 0 -> 278 bytes test/reference/degenerate-solid-dash.ref.png | Bin 0 -> 407 bytes .../device-offset-fractional.base.argb32.ref.png | Bin 0 -> 266 bytes .../device-offset-fractional.base.rgb24.ref.png | Bin 0 -> 266 bytes .../device-offset-fractional.gl.xfail.png | Bin 0 -> 311 bytes .../device-offset-fractional.pdf.xfail.png | Bin 0 -> 270 bytes .../reference/device-offset-fractional.ps2.ref.png | Bin 0 -> 200 bytes .../reference/device-offset-fractional.ps3.ref.png | Bin 0 -> 200 bytes test/reference/device-offset-fractional.ref.png | Bin 0 -> 269 bytes .../device-offset-positive.base.argb32.ref.png | Bin 0 -> 120 bytes .../device-offset-positive.base.rgb24.ref.png | Bin 0 -> 111 bytes test/reference/device-offset-positive.ref.png | Bin 0 -> 139 bytes .../device-offset-scale.base.argb32.ref.png | Bin 0 -> 109 bytes .../device-offset-scale.base.rgb24.ref.png | Bin 0 -> 109 bytes test/reference/device-offset-scale.ref.png | Bin 0 -> 145 bytes test/reference/device-offset-scale.svg.xfail.png | Bin 0 -> 128 bytes test/reference/device-offset.base.argb32.ref.png | Bin 0 -> 118 bytes test/reference/device-offset.base.rgb24.ref.png | Bin 0 -> 111 bytes test/reference/device-offset.ref.png | Bin 0 -> 137 bytes test/reference/drunkard-tails.base.argb32.ref.png | Bin 0 -> 6176 bytes test/reference/drunkard-tails.base.rgb24.ref.png | Bin 0 -> 6176 bytes test/reference/drunkard-tails.mask.argb32.ref.png | Bin 0 -> 6116 bytes test/reference/drunkard-tails.mask.rgb24.ref.png | Bin 0 -> 6116 bytes test/reference/drunkard-tails.ps.ref.png | Bin 0 -> 3780 bytes test/reference/drunkard-tails.ref.png | Bin 0 -> 6157 bytes test/reference/drunkard-tails.traps.argb32.ref.png | Bin 0 -> 6176 bytes test/reference/drunkard-tails.traps.rgb24.ref.png | Bin 0 -> 6176 bytes .../egl-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../egl-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/egl-surface-source.image16.ref.png | Bin 0 -> 305 bytes test/reference/egl-surface-source.ref.png | Bin 0 -> 377 bytes .../extend-pad-border.base.argb32.ref.png | Bin 0 -> 495 bytes .../reference/extend-pad-border.base.rgb24.ref.png | Bin 0 -> 495 bytes test/reference/extend-pad-border.image16.ref.png | Bin 0 -> 446 bytes test/reference/extend-pad-border.pdf.ref.png | Bin 0 -> 495 bytes test/reference/extend-pad-border.ps.ref.png | Bin 0 -> 649 bytes test/reference/extend-pad-border.quartz.ref.png | Bin 0 -> 432 bytes test/reference/extend-pad-border.ref.png | Bin 0 -> 495 bytes test/reference/extend-pad-border.svg.xfail.png | Bin 0 -> 1063 bytes .../extend-pad-similar.base.argb32.ref.png | Bin 0 -> 279 bytes .../extend-pad-similar.base.rgb24.ref.png | Bin 0 -> 279 bytes test/reference/extend-pad-similar.quartz.xfail.png | Bin 0 -> 270 bytes test/reference/extend-pad-similar.ref.png | Bin 0 -> 315 bytes test/reference/extend-pad-similar.svg.xfail.png | Bin 0 -> 270 bytes test/reference/extend-pad.base.argb32.ref.png | Bin 0 -> 279 bytes test/reference/extend-pad.base.rgb24.ref.png | Bin 0 -> 279 bytes test/reference/extend-pad.ps.ref.png | Bin 0 -> 314 bytes test/reference/extend-pad.quartz.xfail.png | Bin 0 -> 270 bytes test/reference/extend-pad.ref.png | Bin 0 -> 315 bytes test/reference/extend-pad.svg.xfail.png | Bin 0 -> 270 bytes .../extend-reflect-similar.base.argb32.ref.png | Bin 0 -> 133406 bytes .../extend-reflect-similar.base.rgb24.ref.png | Bin 0 -> 133406 bytes .../extend-reflect-similar.image16.ref.png | Bin 0 -> 99786 bytes test/reference/extend-reflect-similar.ps2.ref.png | Bin 0 -> 146990 bytes test/reference/extend-reflect-similar.ps3.ref.png | Bin 0 -> 146990 bytes test/reference/extend-reflect-similar.ref.png | Bin 0 -> 153571 bytes test/reference/extend-reflect.base.argb32.ref.png | Bin 0 -> 133406 bytes test/reference/extend-reflect.base.rgb24.ref.png | Bin 0 -> 133406 bytes test/reference/extend-reflect.image16.ref.png | Bin 0 -> 99786 bytes test/reference/extend-reflect.ps2.ref.png | Bin 0 -> 146990 bytes test/reference/extend-reflect.ps3.ref.png | Bin 0 -> 146990 bytes test/reference/extend-reflect.ref.png | Bin 0 -> 153571 bytes .../extend-repeat-similar.base.argb32.ref.png | Bin 0 -> 108603 bytes .../extend-repeat-similar.base.rgb24.ref.png | Bin 0 -> 108603 bytes .../extend-repeat-similar.image16.ref.png | Bin 0 -> 83738 bytes test/reference/extend-repeat-similar.ps2.ref.png | Bin 0 -> 119246 bytes test/reference/extend-repeat-similar.ps3.ref.png | Bin 0 -> 119246 bytes test/reference/extend-repeat-similar.ref.png | Bin 0 -> 108622 bytes test/reference/extend-repeat.base.argb32.ref.png | Bin 0 -> 108603 bytes test/reference/extend-repeat.base.rgb24.ref.png | Bin 0 -> 108603 bytes test/reference/extend-repeat.image16.ref.png | Bin 0 -> 83738 bytes test/reference/extend-repeat.ps2.ref.png | Bin 0 -> 119246 bytes test/reference/extend-repeat.ps3.ref.png | Bin 0 -> 119246 bytes test/reference/extend-repeat.ref.png | Bin 0 -> 108622 bytes .../extended-blend-alpha-mask.argb32.ref.png | Bin 0 -> 9221 bytes .../extended-blend-alpha-mask.base.argb32.ref.png | Bin 0 -> 9221 bytes .../extended-blend-alpha-mask.base.rgb24.ref.png | Bin 0 -> 4597 bytes .../extended-blend-alpha-mask.rgb24.ref.png | Bin 0 -> 4597 bytes test/reference/extended-blend-alpha.argb32.ref.png | Bin 0 -> 9406 bytes .../extended-blend-alpha.base.argb32.ref.png | Bin 0 -> 9406 bytes .../extended-blend-alpha.base.rgb24.ref.png | Bin 0 -> 5740 bytes .../reference/extended-blend-alpha.image16.ref.png | Bin 0 -> 4626 bytes .../extended-blend-alpha.quartz.argb32.ref.png | Bin 0 -> 9729 bytes .../extended-blend-alpha.quartz.rgb24.ref.png | Bin 0 -> 5598 bytes test/reference/extended-blend-alpha.rgb24.ref.png | Bin 0 -> 5740 bytes .../extended-blend-alpha.svg12.argb32.xfail.png | Bin 0 -> 6658 bytes .../extended-blend-alpha.svg12.rgb24.xfail.png | Bin 0 -> 5014 bytes test/reference/extended-blend-mask.argb32.ref.png | Bin 0 -> 3959 bytes .../extended-blend-mask.base.argb32.ref.png | Bin 0 -> 3971 bytes .../extended-blend-mask.base.rgb24.ref.png | Bin 0 -> 3643 bytes test/reference/extended-blend-mask.rgb24.ref.png | Bin 0 -> 3634 bytes .../extended-blend-solid-alpha.argb32.ref.png | Bin 0 -> 9406 bytes .../extended-blend-solid-alpha.base.argb32.ref.png | Bin 0 -> 9406 bytes .../extended-blend-solid-alpha.base.rgb24.ref.png | Bin 0 -> 5740 bytes .../extended-blend-solid-alpha.image16.ref.png | Bin 0 -> 4626 bytes .../extended-blend-solid-alpha.rgb24.ref.png | Bin 0 -> 5740 bytes test/reference/extended-blend-solid.argb32.ref.png | Bin 0 -> 4072 bytes .../extended-blend-solid.base.argb32.ref.png | Bin 0 -> 4063 bytes .../extended-blend-solid.base.rgb24.ref.png | Bin 0 -> 3775 bytes .../reference/extended-blend-solid.image16.ref.png | Bin 0 -> 4145 bytes test/reference/extended-blend-solid.rgb24.ref.png | Bin 0 -> 3784 bytes test/reference/extended-blend.argb32.ref.png | Bin 0 -> 4072 bytes test/reference/extended-blend.base.argb32.ref.png | Bin 0 -> 4063 bytes test/reference/extended-blend.base.rgb24.ref.png | Bin 0 -> 3775 bytes test/reference/extended-blend.image16.ref.png | Bin 0 -> 4145 bytes .../reference/extended-blend.quartz.argb32.ref.png | Bin 0 -> 4284 bytes test/reference/extended-blend.quartz.rgb24.ref.png | Bin 0 -> 3965 bytes test/reference/extended-blend.rgb24.ref.png | Bin 0 -> 3784 bytes .../extended-blend.svg12.argb32.xfail.png | Bin 0 -> 2273 bytes .../reference/extended-blend.svg12.rgb24.xfail.png | Bin 0 -> 1856 bytes .../fallback-resolution.ppi144x144.ps.ref.png | Bin 0 -> 5911 bytes .../fallback-resolution.ppi144x144.ref.png | Bin 0 -> 8746 bytes .../fallback-resolution.ppi144x72.ps.ref.png | Bin 0 -> 7206 bytes .../fallback-resolution.ppi144x72.ref.png | Bin 0 -> 8531 bytes .../fallback-resolution.ppi288x288.pdf.ref.png | Bin 0 -> 8681 bytes .../fallback-resolution.ppi288x288.ps.ref.png | Bin 0 -> 4450 bytes .../fallback-resolution.ppi288x288.svg.ref.png | Bin 0 -> 5771 bytes .../fallback-resolution.ppi288x72.ps.ref.png | Bin 0 -> 6444 bytes .../fallback-resolution.ppi288x72.ref.png | Bin 0 -> 7203 bytes .../fallback-resolution.ppi576x576.pdf.ref.png | Bin 0 -> 8732 bytes .../fallback-resolution.ppi576x576.ps.ref.png | Bin 0 -> 3448 bytes .../fallback-resolution.ppi576x576.svg.ref.png | Bin 0 -> 4317 bytes .../fallback-resolution.ppi576x72.ps.ref.png | Bin 0 -> 5992 bytes .../fallback-resolution.ppi576x72.ref.png | Bin 0 -> 6457 bytes .../fallback-resolution.ppi72x144.ps.ref.png | Bin 0 -> 7270 bytes .../fallback-resolution.ppi72x144.ref.png | Bin 0 -> 8710 bytes .../fallback-resolution.ppi72x288.ps.ref.png | Bin 0 -> 6616 bytes .../fallback-resolution.ppi72x288.ref.png | Bin 0 -> 7224 bytes .../fallback-resolution.ppi72x576.ps.ref.png | Bin 0 -> 6349 bytes .../fallback-resolution.ppi72x576.ref.png | Bin 0 -> 6604 bytes .../reference/fallback-resolution.ppi72x72.ref.png | Bin 0 -> 8579 bytes test/reference/fallback.argb32.ref.png | Bin 0 -> 4133 bytes test/reference/fallback.base.argb32.ref.png | Bin 0 -> 4156 bytes test/reference/fallback.base.rgb24.ref.png | Bin 0 -> 3332 bytes test/reference/fallback.image16.rgb24.ref.png | Bin 0 -> 2642 bytes test/reference/fallback.mask.argb32.ref.png | Bin 0 -> 4070 bytes test/reference/fallback.mask.rgb24.ref.png | Bin 0 -> 3141 bytes test/reference/fallback.rgb24.ref.png | Bin 0 -> 3283 bytes test/reference/fallback.traps.argb32.ref.png | Bin 0 -> 4156 bytes test/reference/fallback.traps.rgb24.ref.png | Bin 0 -> 3332 bytes .../fill-alpha-pattern.base.argb32.ref.png | Bin 0 -> 3379 bytes .../fill-alpha-pattern.base.rgb24.ref.png | Bin 0 -> 3379 bytes test/reference/fill-alpha-pattern.image16.ref.png | Bin 0 -> 3380 bytes test/reference/fill-alpha-pattern.pdf.ref.png | Bin 0 -> 2945 bytes .../fill-alpha-pattern.ps3.argb32.ref.png | Bin 0 -> 3484 bytes test/reference/fill-alpha-pattern.quartz.ref.png | Bin 0 -> 7943 bytes test/reference/fill-alpha-pattern.ref.png | Bin 0 -> 3500 bytes .../fill-alpha-pattern.traps.argb32.ref.png | Bin 0 -> 3379 bytes .../fill-alpha-pattern.traps.rgb24.ref.png | Bin 0 -> 3379 bytes test/reference/fill-alpha.base.argb32.ref.png | Bin 0 -> 2824 bytes test/reference/fill-alpha.base.rgb24.ref.png | Bin 0 -> 2824 bytes test/reference/fill-alpha.image16.ref.png | Bin 0 -> 2145 bytes test/reference/fill-alpha.ps.argb32.ref.png | Bin 0 -> 2248 bytes test/reference/fill-alpha.quartz.ref.png | Bin 0 -> 2704 bytes test/reference/fill-alpha.ref.png | Bin 0 -> 2754 bytes test/reference/fill-alpha.traps.argb32.ref.png | Bin 0 -> 2824 bytes test/reference/fill-alpha.traps.rgb24.ref.png | Bin 0 -> 2824 bytes .../fill-and-stroke-alpha-add.base.argb32.ref.png | Bin 0 -> 552 bytes .../fill-and-stroke-alpha-add.base.rgb24.ref.png | Bin 0 -> 552 bytes .../fill-and-stroke-alpha-add.image16.ref.png | Bin 0 -> 536 bytes .../fill-and-stroke-alpha-add.quartz.ref.png | Bin 0 -> 542 bytes test/reference/fill-and-stroke-alpha-add.ref.png | Bin 0 -> 558 bytes .../fill-and-stroke-alpha-add.svg12.xfail.png | Bin 0 -> 631 bytes .../fill-and-stroke-alpha-add.traps.argb32.ref.png | Bin 0 -> 552 bytes .../fill-and-stroke-alpha-add.traps.rgb24.ref.png | Bin 0 -> 552 bytes .../fill-and-stroke-alpha.base.argb32.ref.png | Bin 0 -> 507 bytes .../fill-and-stroke-alpha.base.rgb24.ref.png | Bin 0 -> 507 bytes .../fill-and-stroke-alpha.image16.ref.png | Bin 0 -> 470 bytes test/reference/fill-and-stroke-alpha.ref.png | Bin 0 -> 513 bytes .../fill-and-stroke-alpha.traps.argb32.ref.png | Bin 0 -> 507 bytes .../fill-and-stroke-alpha.traps.rgb24.ref.png | Bin 0 -> 507 bytes test/reference/fill-and-stroke.base.argb32.ref.png | Bin 0 -> 321 bytes test/reference/fill-and-stroke.base.rgb24.ref.png | Bin 0 -> 293 bytes test/reference/fill-and-stroke.image16.ref.png | Bin 0 -> 251 bytes test/reference/fill-and-stroke.ps.argb32.ref.png | Bin 0 -> 257 bytes test/reference/fill-and-stroke.ps.rgb24.ref.png | Bin 0 -> 225 bytes .../fill-and-stroke.quartz.argb32.ref.png | Bin 0 -> 273 bytes .../reference/fill-and-stroke.quartz.rgb24.ref.png | Bin 0 -> 249 bytes test/reference/fill-and-stroke.ref.png | Bin 0 -> 328 bytes .../reference/fill-and-stroke.traps.argb32.ref.png | Bin 0 -> 321 bytes test/reference/fill-and-stroke.traps.rgb24.ref.png | Bin 0 -> 293 bytes .../fill-degenerate-sort-order.argb32.ref.png | Bin 0 -> 2390 bytes .../fill-degenerate-sort-order.base.argb32.ref.png | Bin 0 -> 2378 bytes .../fill-degenerate-sort-order.base.rgb24.ref.png | Bin 0 -> 2041 bytes .../fill-degenerate-sort-order.image16.ref.png | Bin 0 -> 1753 bytes .../fill-degenerate-sort-order.ps.argb32.xfail.png | Bin 0 -> 1903 bytes .../fill-degenerate-sort-order.ps.rgb24.xfail.png | Bin 0 -> 1638 bytes ...ill-degenerate-sort-order.quartz.argb32.ref.png | Bin 0 -> 2451 bytes ...fill-degenerate-sort-order.quartz.rgb24.ref.png | Bin 0 -> 2079 bytes .../fill-degenerate-sort-order.rgb24.ref.png | Bin 0 -> 2048 bytes ...fill-degenerate-sort-order.traps.argb32.ref.png | Bin 0 -> 2378 bytes .../fill-degenerate-sort-order.traps.rgb24.ref.png | Bin 0 -> 2041 bytes test/reference/fill-disjoint.base.argb32.ref.png | Bin 0 -> 1098 bytes test/reference/fill-disjoint.base.rgb24.ref.png | Bin 0 -> 1098 bytes test/reference/fill-disjoint.ref.png | Bin 0 -> 1098 bytes test/reference/fill-empty.base.argb32.ref.png | Bin 0 -> 99 bytes test/reference/fill-empty.base.rgb24.ref.png | Bin 0 -> 97 bytes test/reference/fill-empty.ref.png | Bin 0 -> 99 bytes test/reference/fill-empty.svg12.rgb24.xfail.png | Bin 0 -> 99 bytes test/reference/fill-image.base.argb32.ref.png | Bin 0 -> 1458 bytes test/reference/fill-image.base.rgb24.ref.png | Bin 0 -> 1458 bytes test/reference/fill-image.image16.ref.png | Bin 0 -> 1163 bytes test/reference/fill-image.ps.ref.png | Bin 0 -> 1645 bytes test/reference/fill-image.quartz.ref.png | Bin 0 -> 1297 bytes test/reference/fill-image.ref.png | Bin 0 -> 1457 bytes test/reference/fill-image.traps.argb32.ref.png | Bin 0 -> 1458 bytes test/reference/fill-image.traps.rgb24.ref.png | Bin 0 -> 1458 bytes .../reference/fill-missed-stop.base.argb32.ref.png | Bin 0 -> 447 bytes test/reference/fill-missed-stop.base.rgb24.ref.png | Bin 0 -> 375 bytes test/reference/fill-missed-stop.pdf.argb32.ref.png | Bin 0 -> 452 bytes test/reference/fill-missed-stop.ps2.argb32.ref.png | Bin 0 -> 564 bytes test/reference/fill-missed-stop.ps2.rgb24.ref.png | Bin 0 -> 531 bytes test/reference/fill-missed-stop.ps3.argb32.ref.png | Bin 0 -> 564 bytes test/reference/fill-missed-stop.ps3.rgb24.ref.png | Bin 0 -> 531 bytes test/reference/fill-missed-stop.ref.png | Bin 0 -> 455 bytes .../fill-missed-stop.traps.argb32.ref.png | Bin 0 -> 447 bytes .../reference/fill-missed-stop.traps.rgb24.ref.png | Bin 0 -> 375 bytes test/reference/fill-rule.argb32.ref.png | Bin 0 -> 2076 bytes test/reference/fill-rule.base.argb32.ref.png | Bin 0 -> 1979 bytes test/reference/fill-rule.base.rgb24.ref.png | Bin 0 -> 1703 bytes test/reference/fill-rule.image16.ref.png | Bin 0 -> 1625 bytes test/reference/fill-rule.ps2.argb32.ref.png | Bin 0 -> 1878 bytes test/reference/fill-rule.ps2.rgb24.ref.png | Bin 0 -> 1524 bytes test/reference/fill-rule.ps3.argb32.ref.png | Bin 0 -> 1878 bytes test/reference/fill-rule.ps3.rgb24.ref.png | Bin 0 -> 1524 bytes test/reference/fill-rule.quartz.argb32.ref.png | Bin 0 -> 2060 bytes test/reference/fill-rule.quartz.rgb24.ref.png | Bin 0 -> 1771 bytes test/reference/fill-rule.rgb24.ref.png | Bin 0 -> 1763 bytes test/reference/fill-rule.traps.argb32.ref.png | Bin 0 -> 1979 bytes test/reference/fill-rule.traps.rgb24.ref.png | Bin 0 -> 1703 bytes test/reference/fill-xlib-fallback.rgb24.ref.png | Bin 0 -> 1458 bytes test/reference/fill-xlib-window.rgb24.ref.png | Bin 0 -> 1458 bytes test/reference/fill-xlib.ref.png | Bin 0 -> 1458 bytes test/reference/fill.image.argb32.ref.png | Bin 0 -> 1482 bytes test/reference/fill.image.rgb24.ref.png | Bin 0 -> 1482 bytes .../filter-bilinear-extents.base.argb32.ref.png | Bin 0 -> 1210 bytes .../filter-bilinear-extents.base.rgb24.ref.png | Bin 0 -> 1210 bytes .../filter-bilinear-extents.image16.ref.png | Bin 0 -> 895 bytes .../filter-bilinear-extents.pdf.xfail.png | Bin 0 -> 401 bytes test/reference/filter-bilinear-extents.ps2.ref.png | Bin 0 -> 556 bytes test/reference/filter-bilinear-extents.ps3.ref.png | Bin 0 -> 556 bytes .../filter-bilinear-extents.quartz.xfail.png | Bin 0 -> 308 bytes test/reference/filter-bilinear-extents.ref.png | Bin 0 -> 1210 bytes .../filter-nearest-offset.base.argb32.ref.png | Bin 0 -> 201 bytes .../filter-nearest-offset.base.rgb24.ref.png | Bin 0 -> 201 bytes test/reference/filter-nearest-offset.gl.xfail.png | Bin 0 -> 260 bytes test/reference/filter-nearest-offset.pdf.xfail.png | Bin 0 -> 4522 bytes test/reference/filter-nearest-offset.ps2.ref.png | Bin 0 -> 255 bytes test/reference/filter-nearest-offset.ps3.ref.png | Bin 0 -> 255 bytes test/reference/filter-nearest-offset.ref.png | Bin 0 -> 248 bytes test/reference/filter-nearest-offset.svg.xfail.png | Bin 0 -> 4419 bytes .../filter-nearest-transformed.base.argb32.ref.png | Bin 0 -> 514 bytes .../filter-nearest-transformed.base.rgb24.ref.png | Bin 0 -> 514 bytes .../filter-nearest-transformed.gl.xfail.png | Bin 0 -> 514 bytes .../filter-nearest-transformed.image16.ref.png | Bin 0 -> 418 bytes .../filter-nearest-transformed.pdf.xfail.png | Bin 0 -> 532 bytes .../filter-nearest-transformed.quartz.xfail.png | Bin 0 -> 349 bytes test/reference/filter-nearest-transformed.ref.png | Bin 0 -> 570 bytes .../filter-nearest-transformed.svg.xfail.png | Bin 0 -> 546 bytes .../finer-grained-fallbacks.base.argb32.ref.png | Bin 0 -> 1110 bytes .../finer-grained-fallbacks.base.rgb24.ref.png | Bin 0 -> 856 bytes .../finer-grained-fallbacks.gl.argb32.ref.png | Bin 0 -> 1075 bytes .../finer-grained-fallbacks.image16.ref.png | Bin 0 -> 862 bytes .../finer-grained-fallbacks.mask.argb32.ref.png | Bin 0 -> 1167 bytes .../finer-grained-fallbacks.mask.rgb24.ref.png | Bin 0 -> 891 bytes .../finer-grained-fallbacks.ps2.argb32.ref.png | Bin 0 -> 1168 bytes test/reference/finer-grained-fallbacks.ps2.ref.png | Bin 0 -> 1356 bytes .../finer-grained-fallbacks.ps2.rgb24.ref.png | Bin 0 -> 936 bytes .../finer-grained-fallbacks.ps3.argb32.ref.png | Bin 0 -> 1168 bytes test/reference/finer-grained-fallbacks.ps3.ref.png | Bin 0 -> 1356 bytes .../finer-grained-fallbacks.ps3.rgb24.ref.png | Bin 0 -> 936 bytes .../finer-grained-fallbacks.quartz.argb32.ref.png | Bin 0 -> 988 bytes .../finer-grained-fallbacks.quartz.rgb24.ref.png | Bin 0 -> 763 bytes test/reference/finer-grained-fallbacks.ref.png | Bin 0 -> 1151 bytes .../finer-grained-fallbacks.svg12.argb32.ref.png | Bin 0 -> 190 bytes .../finer-grained-fallbacks.svg12.rgb24.ref.png | Bin 0 -> 191 bytes .../finer-grained-fallbacks.traps.argb32.ref.png | Bin 0 -> 1110 bytes .../finer-grained-fallbacks.traps.rgb24.ref.png | Bin 0 -> 856 bytes .../finer-grained-fallbacks.xlib-fallback.ref.png | Bin 0 -> 919 bytes .../font-matrix-translation.base.argb32.ref.png | Bin 0 -> 865 bytes .../font-matrix-translation.base.rgb24.ref.png | Bin 0 -> 865 bytes .../font-matrix-translation.image16.ref.png | Bin 0 -> 852 bytes .../font-matrix-translation.ps2.argb32.ref.png | Bin 0 -> 748 bytes .../font-matrix-translation.ps2.rgb24.ref.png | Bin 0 -> 748 bytes .../font-matrix-translation.ps3.argb32.ref.png | Bin 0 -> 748 bytes .../font-matrix-translation.ps3.rgb24.ref.png | Bin 0 -> 748 bytes .../font-matrix-translation.quartz.ref.png | Bin 0 -> 996 bytes test/reference/font-matrix-translation.ref.png | Bin 0 -> 865 bytes test/reference/font-matrix-translation.svg.ref.png | Bin 0 -> 870 bytes .../font-matrix-translation.traps.ref.png | Bin 0 -> 865 bytes .../ft-show-glyphs-positioning.base.argb32.ref.png | Bin 0 -> 3243 bytes .../ft-show-glyphs-positioning.base.rgb24.ref.png | Bin 0 -> 3243 bytes .../ft-show-glyphs-positioning.image16.ref.png | Bin 0 -> 2772 bytes .../ft-show-glyphs-positioning.pdf.ref.png | Bin 0 -> 3117 bytes .../ft-show-glyphs-positioning.ps2.ref.png | Bin 0 -> 2269 bytes .../ft-show-glyphs-positioning.ps3.ref.png | Bin 0 -> 2269 bytes test/reference/ft-show-glyphs-positioning.ref.png | Bin 0 -> 3243 bytes .../ft-show-glyphs-positioning.svg.ref.png | Bin 0 -> 6018 bytes .../ft-show-glyphs-positioning.traps.ref.png | Bin 0 -> 3243 bytes .../ft-show-glyphs-table.base.argb32.ref.png | Bin 0 -> 9975 bytes .../ft-show-glyphs-table.base.rgb24.ref.png | Bin 0 -> 9975 bytes .../reference/ft-show-glyphs-table.image16.ref.png | Bin 0 -> 8052 bytes test/reference/ft-show-glyphs-table.ps2.ref.png | Bin 0 -> 5687 bytes test/reference/ft-show-glyphs-table.ps3.ref.png | Bin 0 -> 5687 bytes .../ft-show-glyphs-table.quartz.xfail.png | Bin 0 -> 827 bytes test/reference/ft-show-glyphs-table.ref.png | Bin 0 -> 9975 bytes test/reference/ft-show-glyphs-table.svg.ref.png | Bin 0 -> 10005 bytes test/reference/ft-show-glyphs-table.traps.ref.png | Bin 0 -> 9975 bytes .../ft-text-antialias-none.base.argb32.ref.png | Bin 0 -> 295 bytes .../ft-text-antialias-none.base.rgb24.ref.png | Bin 0 -> 295 bytes .../ft-text-antialias-none.ps2.argb32.ref.png | Bin 0 -> 335 bytes .../ft-text-antialias-none.ps3.argb32.ref.png | Bin 0 -> 335 bytes test/reference/ft-text-antialias-none.ref.png | Bin 0 -> 336 bytes ...-text-vertical-layout-type1.base.argb32.ref.png | Bin 0 -> 3066 bytes ...t-text-vertical-layout-type1.base.rgb24.ref.png | Bin 0 -> 3066 bytes .../ft-text-vertical-layout-type1.image16.ref.png | Bin 0 -> 3072 bytes .../ft-text-vertical-layout-type1.pdf.ref.png | Bin 0 -> 3635 bytes .../ft-text-vertical-layout-type1.ps.ref.png | Bin 0 -> 2088 bytes .../ft-text-vertical-layout-type1.quartz.xfail.png | Bin 0 -> 3635 bytes .../ft-text-vertical-layout-type1.ref.png | Bin 0 -> 3052 bytes .../ft-text-vertical-layout-type1.svg.ref.png | Bin 0 -> 3607 bytes ...text-vertical-layout-type1.traps.argb32.ref.png | Bin 0 -> 3066 bytes ...-text-vertical-layout-type1.traps.rgb24.ref.png | Bin 0 -> 3066 bytes .../ft-text-vertical-layout-type1.xfail.png | Bin 0 -> 2683 bytes ...-text-vertical-layout-type3.base.argb32.ref.png | Bin 0 -> 3597 bytes ...t-text-vertical-layout-type3.base.rgb24.ref.png | Bin 0 -> 3597 bytes .../ft-text-vertical-layout-type3.image16.ref.png | Bin 0 -> 3141 bytes ...-text-vertical-layout-type3.mask.argb32.ref.png | Bin 0 -> 3610 bytes ...t-text-vertical-layout-type3.mask.rgb24.ref.png | Bin 0 -> 3610 bytes .../ft-text-vertical-layout-type3.pdf.ref.png | Bin 0 -> 3639 bytes .../ft-text-vertical-layout-type3.ps.ref.png | Bin 0 -> 2134 bytes .../ft-text-vertical-layout-type3.quartz.ref.png | Bin 0 -> 3573 bytes .../ft-text-vertical-layout-type3.ref.png | Bin 0 -> 3609 bytes .../ft-text-vertical-layout-type3.svg.ref.png | Bin 0 -> 3626 bytes ...text-vertical-layout-type3.traps.argb32.ref.png | Bin 0 -> 3597 bytes ...-text-vertical-layout-type3.traps.rgb24.ref.png | Bin 0 -> 3597 bytes .../reference/get-group-target.base.argb32.ref.png | Bin 0 -> 113 bytes test/reference/get-group-target.base.rgb24.ref.png | Bin 0 -> 113 bytes test/reference/get-group-target.ref.png | Bin 0 -> 134 bytes .../gl-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../reference/gl-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/gl-surface-source.image16.ref.png | Bin 0 -> 305 bytes test/reference/gl-surface-source.ref.png | Bin 0 -> 377 bytes .../glyph-cache-pressure.base.argb32.ref.png | Bin 0 -> 2858 bytes .../glyph-cache-pressure.base.rgb24.ref.png | Bin 0 -> 2858 bytes .../reference/glyph-cache-pressure.image16.ref.png | Bin 0 -> 2453 bytes test/reference/glyph-cache-pressure.ps2.ref.png | Bin 0 -> 1454 bytes test/reference/glyph-cache-pressure.ps3.ref.png | Bin 0 -> 1454 bytes test/reference/glyph-cache-pressure.quartz.ref.png | Bin 0 -> 3284 bytes test/reference/glyph-cache-pressure.ref.png | Bin 0 -> 2858 bytes test/reference/glyph-cache-pressure.traps.ref.png | Bin 0 -> 2858 bytes test/reference/gradient-alpha.base.argb32.ref.png | Bin 0 -> 125 bytes test/reference/gradient-alpha.base.rgb24.ref.png | Bin 0 -> 119 bytes test/reference/gradient-alpha.ps2.argb32.ref.png | Bin 0 -> 134 bytes test/reference/gradient-alpha.ps2.rgb24.ref.png | Bin 0 -> 130 bytes test/reference/gradient-alpha.ps3.argb32.ref.png | Bin 0 -> 134 bytes test/reference/gradient-alpha.ps3.rgb24.ref.png | Bin 0 -> 130 bytes test/reference/gradient-alpha.ref.png | Bin 0 -> 125 bytes .../gradient-constant-alpha.base.argb32.ref.png | Bin 0 -> 111 bytes .../gradient-constant-alpha.base.rgb24.ref.png | Bin 0 -> 106 bytes test/reference/gradient-constant-alpha.ps3.ref.png | Bin 0 -> 124 bytes .../gradient-constant-alpha.ps3.rgb24.ref.png | Bin 0 -> 124 bytes .../gradient-constant-alpha.quartz.argb32.ref.png | Bin 0 -> 214 bytes test/reference/gradient-constant-alpha.ref.png | Bin 0 -> 111 bytes .../gradient-zero-stops-mask.base.argb32.ref.png | Bin 0 -> 86 bytes .../gradient-zero-stops-mask.base.rgb24.ref.png | Bin 0 -> 86 bytes test/reference/gradient-zero-stops-mask.ref.png | Bin 0 -> 86 bytes .../gradient-zero-stops.base.argb32.ref.png | Bin 0 -> 86 bytes .../gradient-zero-stops.base.rgb24.ref.png | Bin 0 -> 86 bytes test/reference/gradient-zero-stops.ref.png | Bin 0 -> 105 bytes test/reference/group-clip.base.argb32.ref.png | Bin 0 -> 191 bytes test/reference/group-clip.base.rgb24.ref.png | Bin 0 -> 191 bytes test/reference/group-clip.image16.ref.png | Bin 0 -> 193 bytes test/reference/group-clip.ref.png | Bin 0 -> 191 bytes test/reference/group-paint.base.argb32.ref.png | Bin 0 -> 95 bytes test/reference/group-paint.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/group-paint.ref.png | Bin 0 -> 118 bytes test/reference/group-unaligned.base.argb32.ref.png | Bin 0 -> 468 bytes test/reference/group-unaligned.base.rgb24.ref.png | Bin 0 -> 468 bytes test/reference/group-unaligned.image16.ref.png | Bin 0 -> 395 bytes test/reference/group-unaligned.ps.ref.png | Bin 0 -> 321 bytes test/reference/group-unaligned.ps.rgb24.xfail.png | Bin 0 -> 371 bytes test/reference/group-unaligned.quartz.ref.png | Bin 0 -> 363 bytes test/reference/group-unaligned.ref.png | Bin 0 -> 475 bytes .../reference/group-unaligned.svg.argb32.xfail.png | Bin 0 -> 520 bytes test/reference/group-unaligned.svg.rgb24.xfail.png | Bin 0 -> 425 bytes .../reference/group-unaligned.traps.argb32.ref.png | Bin 0 -> 468 bytes test/reference/group-unaligned.traps.rgb24.ref.png | Bin 0 -> 468 bytes .../group-unaligned.xlib-fallback.ref.png | Bin 0 -> 474 bytes test/reference/halo-transform.base.argb32.ref.png | Bin 0 -> 15122 bytes test/reference/halo-transform.base.rgb24.ref.png | Bin 0 -> 15122 bytes test/reference/halo-transform.image16.ref.png | Bin 0 -> 10983 bytes test/reference/halo-transform.ps.ref.png | Bin 0 -> 8691 bytes test/reference/halo-transform.quartz.ref.png | Bin 0 -> 14360 bytes test/reference/halo-transform.ref.png | Bin 0 -> 15265 bytes test/reference/halo-transform.traps.ref.png | Bin 0 -> 15122 bytes test/reference/halo.base.argb32.ref.png | Bin 0 -> 8594 bytes test/reference/halo.base.rgb24.ref.png | Bin 0 -> 8594 bytes test/reference/halo.image16.ref.png | Bin 0 -> 6172 bytes test/reference/halo.mask.argb32.ref.png | Bin 0 -> 8726 bytes test/reference/halo.mask.rgb24.ref.png | Bin 0 -> 8726 bytes test/reference/halo.ps.ref.png | Bin 0 -> 5220 bytes test/reference/halo.quartz.ref.png | Bin 0 -> 8601 bytes test/reference/halo.ref.png | Bin 0 -> 8631 bytes test/reference/halo.traps.ref.png | Bin 0 -> 8594 bytes test/reference/hatchings.base.argb32.ref.png | Bin 0 -> 94196 bytes test/reference/hatchings.base.rgb24.ref.png | Bin 0 -> 94196 bytes test/reference/hatchings.mask.argb32.ref.png | Bin 0 -> 94631 bytes test/reference/hatchings.mask.rgb24.ref.png | Bin 0 -> 94631 bytes test/reference/hatchings.ref.png | Bin 0 -> 90698 bytes test/reference/hatchings.traps.argb32.ref.png | Bin 0 -> 89997 bytes test/reference/hatchings.traps.rgb24.ref.png | Bin 0 -> 89997 bytes test/reference/horizontal-clip.base.argb32.ref.png | Bin 0 -> 113 bytes test/reference/horizontal-clip.base.rgb24.ref.png | Bin 0 -> 113 bytes test/reference/horizontal-clip.ref.png | Bin 0 -> 113 bytes test/reference/huge-linear.base.argb32.ref.png | Bin 0 -> 1600 bytes test/reference/huge-linear.base.rgb24.ref.png | Bin 0 -> 1600 bytes test/reference/huge-linear.image16.ref.png | Bin 0 -> 1542 bytes test/reference/huge-linear.pdf.ref.png | Bin 0 -> 1586 bytes test/reference/huge-linear.ps3.ref.png | Bin 0 -> 1786 bytes test/reference/huge-linear.quartz.ref.png | Bin 0 -> 15230 bytes test/reference/huge-linear.ref.png | Bin 0 -> 1636 bytes test/reference/huge-radial.base.argb32.ref.png | Bin 0 -> 41702 bytes test/reference/huge-radial.base.rgb24.ref.png | Bin 0 -> 41702 bytes test/reference/huge-radial.image16.ref.png | Bin 0 -> 17893 bytes test/reference/huge-radial.ps3.ref.png | Bin 0 -> 18449 bytes test/reference/huge-radial.quartz.ref.png | Bin 0 -> 84690 bytes test/reference/huge-radial.ref.png | Bin 0 -> 41702 bytes .../image-bug-710072-aligned.base.argb32.ref.png | Bin 0 -> 151 bytes .../image-bug-710072-aligned.base.rgb24.ref.png | Bin 0 -> 151 bytes test/reference/image-bug-710072-aligned.ref.png | Bin 0 -> 151 bytes .../image-bug-710072-unaligned.base.argb32.ref.png | Bin 0 -> 219 bytes .../image-bug-710072-unaligned.base.rgb24.ref.png | Bin 0 -> 219 bytes test/reference/image-bug-710072-unaligned.ref.png | Bin 0 -> 212 bytes ...image-bug-710072-unaligned.traps.argb32.ref.png | Bin 0 -> 219 bytes .../image-bug-710072-unaligned.traps.rgb24.ref.png | Bin 0 -> 219 bytes ...ug-710072-unaligned.xlib-fallback.rgb24.ref.png | Bin 0 -> 219 bytes ...-bug-710072-unaligned.xlib-window.rgb24.ref.png | Bin 0 -> 219 bytes .../image-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../image-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes .../reference/image-surface-source.image16.ref.png | Bin 0 -> 305 bytes test/reference/image-surface-source.ps2.ref.png | Bin 0 -> 376 bytes test/reference/image-surface-source.ps3.ref.png | Bin 0 -> 376 bytes test/reference/image-surface-source.ref.png | Bin 0 -> 377 bytes .../image-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes .../image-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes test/reference/implicit-close.base.argb32.ref.png | Bin 0 -> 251 bytes test/reference/implicit-close.base.rgb24.ref.png | Bin 0 -> 251 bytes test/reference/implicit-close.ps.ref.png | Bin 0 -> 252 bytes test/reference/implicit-close.ref.png | Bin 0 -> 251 bytes test/reference/implicit-close.traps.argb32.ref.png | Bin 0 -> 251 bytes test/reference/implicit-close.traps.rgb24.ref.png | Bin 0 -> 251 bytes test/reference/infinite-join.base.argb32.ref.png | Bin 0 -> 160 bytes test/reference/infinite-join.base.rgb24.ref.png | Bin 0 -> 160 bytes test/reference/infinite-join.ps2.ref.png | Bin 0 -> 218 bytes test/reference/infinite-join.ps3.ref.png | Bin 0 -> 218 bytes test/reference/infinite-join.ref.png | Bin 0 -> 164 bytes test/reference/infinite-join.traps.argb32.ref.png | Bin 0 -> 160 bytes test/reference/infinite-join.traps.rgb24.ref.png | Bin 0 -> 160 bytes test/reference/inverse-text.base.argb32.ref.png | Bin 0 -> 2162 bytes test/reference/inverse-text.base.rgb24.ref.png | Bin 0 -> 2162 bytes test/reference/inverse-text.mask.argb32.ref.png | Bin 0 -> 2162 bytes test/reference/inverse-text.mask.rgb24.ref.png | Bin 0 -> 2162 bytes test/reference/inverse-text.ref.png | Bin 0 -> 2162 bytes test/reference/inverse-text.traps.ref.png | Bin 0 -> 2162 bytes test/reference/inverted-clip.argb32.ref.png | Bin 0 -> 1390 bytes test/reference/inverted-clip.base.xfail.png | Bin 0 -> 1293 bytes test/reference/inverted-clip.rgb24.ref.png | Bin 0 -> 1274 bytes test/reference/inverted-clip.traps.xfail.png | Bin 0 -> 1283 bytes test/reference/inverted-clip.xfail.png | Bin 0 -> 1293 bytes test/reference/joins-loop.base.argb32.ref.png | Bin 0 -> 4191 bytes test/reference/joins-loop.base.rgb24.ref.png | Bin 0 -> 4191 bytes test/reference/joins-loop.ref.png | Bin 0 -> 4333 bytes test/reference/joins-loop.traps.argb32.ref.png | Bin 0 -> 4191 bytes test/reference/joins-loop.traps.rgb24.ref.png | Bin 0 -> 4191 bytes test/reference/joins-retrace.base.argb32.ref.png | Bin 0 -> 4566 bytes test/reference/joins-retrace.base.rgb24.ref.png | Bin 0 -> 4566 bytes test/reference/joins-retrace.mask.argb32.ref.png | Bin 0 -> 4997 bytes test/reference/joins-retrace.mask.rgb24.ref.png | Bin 0 -> 4997 bytes test/reference/joins-retrace.ref.png | Bin 0 -> 4687 bytes test/reference/joins-retrace.traps.argb32.ref.png | Bin 0 -> 4566 bytes test/reference/joins-retrace.traps.rgb24.ref.png | Bin 0 -> 4566 bytes test/reference/joins-star.base.argb32.ref.png | Bin 0 -> 3542 bytes test/reference/joins-star.base.rgb24.ref.png | Bin 0 -> 3542 bytes test/reference/joins-star.ref.png | Bin 0 -> 4015 bytes test/reference/joins-star.traps.argb32.ref.png | Bin 0 -> 3542 bytes test/reference/joins-star.traps.rgb24.ref.png | Bin 0 -> 3542 bytes test/reference/joins.base.argb32.ref.png | Bin 0 -> 5732 bytes test/reference/joins.base.rgb24.ref.png | Bin 0 -> 5732 bytes test/reference/joins.image16.ref.png | Bin 0 -> 5858 bytes test/reference/joins.mask.argb32.ref.png | Bin 0 -> 6970 bytes test/reference/joins.mask.rgb24.ref.png | Bin 0 -> 6970 bytes test/reference/joins.ps.ref.png | Bin 0 -> 4230 bytes test/reference/joins.quartz.ref.png | Bin 0 -> 5833 bytes test/reference/joins.ref.png | Bin 0 -> 7153 bytes test/reference/joins.traps.argb32.ref.png | Bin 0 -> 5732 bytes test/reference/joins.traps.rgb24.ref.png | Bin 0 -> 5732 bytes test/reference/large-clip.base.argb32.ref.png | Bin 0 -> 305 bytes test/reference/large-clip.base.rgb24.ref.png | Bin 0 -> 305 bytes test/reference/large-clip.ref.png | Bin 0 -> 350 bytes test/reference/large-font.base.argb32.ref.png | Bin 0 -> 6117 bytes test/reference/large-font.base.rgb24.ref.png | Bin 0 -> 6117 bytes test/reference/large-font.image16.ref.png | Bin 0 -> 5713 bytes test/reference/large-font.ref.png | Bin 0 -> 6936 bytes .../reference/large-source-roi.base.argb32.ref.png | Bin 0 -> 93 bytes test/reference/large-source-roi.base.rgb24.ref.png | Bin 0 -> 93 bytes test/reference/large-source-roi.ref.png | Bin 0 -> 112 bytes test/reference/large-source.base.argb32.ref.png | Bin 0 -> 112 bytes test/reference/large-source.base.rgb24.ref.png | Bin 0 -> 112 bytes test/reference/large-source.ref.png | Bin 0 -> 137 bytes .../large-twin-antialias-mixed.base.argb32.ref.png | Bin 0 -> 16630 bytes .../large-twin-antialias-mixed.base.rgb24.ref.png | Bin 0 -> 16630 bytes .../large-twin-antialias-mixed.image16.ref.png | Bin 0 -> 14398 bytes test/reference/large-twin-antialias-mixed.ref.png | Bin 0 -> 16494 bytes ...large-twin-antialias-mixed.traps.argb32.ref.png | Bin 0 -> 16630 bytes .../large-twin-antialias-mixed.traps.rgb24.ref.png | Bin 0 -> 16630 bytes test/reference/leaky-dash.base.argb32.ref.png | Bin 0 -> 197 bytes test/reference/leaky-dash.base.rgb24.ref.png | Bin 0 -> 197 bytes test/reference/leaky-dash.ps2.argb32.ref.png | Bin 0 -> 286 bytes test/reference/leaky-dash.ps2.rgb24.ref.png | Bin 0 -> 284 bytes test/reference/leaky-dash.ps3.argb32.ref.png | Bin 0 -> 286 bytes test/reference/leaky-dash.ps3.rgb24.ref.png | Bin 0 -> 284 bytes test/reference/leaky-dash.quartz.ref.png | Bin 0 -> 195 bytes test/reference/leaky-dash.ref.png | Bin 0 -> 243 bytes .../leaky-dashed-rectangle.base.argb32.ref.png | Bin 0 -> 345 bytes .../leaky-dashed-rectangle.base.rgb24.ref.png | Bin 0 -> 345 bytes .../leaky-dashed-rectangle.image16.ref.png | Bin 0 -> 367 bytes test/reference/leaky-dashed-rectangle.pdf.ref.png | Bin 0 -> 377 bytes test/reference/leaky-dashed-rectangle.ps.ref.png | Bin 0 -> 358 bytes .../leaky-dashed-rectangle.quartz.ref.png | Bin 0 -> 339 bytes test/reference/leaky-dashed-rectangle.ref.png | Bin 0 -> 357 bytes .../leaky-dashed-rectangle.traps.argb32.ref.png | Bin 0 -> 345 bytes .../leaky-dashed-rectangle.traps.rgb24.ref.png | Bin 0 -> 345 bytes .../leaky-dashed-stroke.base.argb32.ref.png | Bin 0 -> 9303 bytes .../leaky-dashed-stroke.base.rgb24.ref.png | Bin 0 -> 9303 bytes test/reference/leaky-dashed-stroke.image16.ref.png | Bin 0 -> 8089 bytes test/reference/leaky-dashed-stroke.ps.ref.png | Bin 0 -> 5293 bytes test/reference/leaky-dashed-stroke.quartz.ref.png | Bin 0 -> 9229 bytes test/reference/leaky-dashed-stroke.ref.png | Bin 0 -> 9286 bytes .../leaky-dashed-stroke.traps.argb32.ref.png | Bin 0 -> 9303 bytes .../leaky-dashed-stroke.traps.rgb24.ref.png | Bin 0 -> 9303 bytes test/reference/leaky-polygon.base.argb32.ref.png | Bin 0 -> 325 bytes test/reference/leaky-polygon.base.rgb24.ref.png | Bin 0 -> 325 bytes test/reference/leaky-polygon.image16.ref.png | Bin 0 -> 329 bytes test/reference/leaky-polygon.ps.ref.png | Bin 0 -> 289 bytes test/reference/leaky-polygon.ref.png | Bin 0 -> 337 bytes test/reference/leaky-polygon.traps.argb32.ref.png | Bin 0 -> 325 bytes test/reference/leaky-polygon.traps.rgb24.ref.png | Bin 0 -> 325 bytes ...-width-large-overlap-dashed.base.argb32.ref.png | Bin 0 -> 338 bytes ...e-width-large-overlap-dashed.base.rgb24.ref.png | Bin 0 -> 338 bytes ...-width-large-overlap-dashed.mask.argb32.ref.png | Bin 0 -> 343 bytes ...e-width-large-overlap-dashed.mask.rgb24.ref.png | Bin 0 -> 343 bytes .../line-width-large-overlap-dashed.ref.png | Bin 0 -> 340 bytes ...width-large-overlap-dashed.traps.argb32.ref.png | Bin 0 -> 340 bytes ...-width-large-overlap-dashed.traps.rgb24.ref.png | Bin 0 -> 340 bytes ...width-large-overlap-flipped.base.argb32.ref.png | Bin 0 -> 305 bytes ...-width-large-overlap-flipped.base.rgb24.ref.png | Bin 0 -> 305 bytes .../line-width-large-overlap-flipped.ref.png | Bin 0 -> 305 bytes ...width-large-overlap-flopped.base.argb32.ref.png | Bin 0 -> 305 bytes ...-width-large-overlap-flopped.base.rgb24.ref.png | Bin 0 -> 305 bytes .../line-width-large-overlap-flopped.ref.png | Bin 0 -> 305 bytes ...-width-large-overlap-offset.base.argb32.ref.png | Bin 0 -> 305 bytes ...e-width-large-overlap-offset.base.rgb24.ref.png | Bin 0 -> 305 bytes .../line-width-large-overlap-offset.ref.png | Bin 0 -> 305 bytes ...width-large-overlap-rotated.base.argb32.ref.png | Bin 0 -> 404 bytes ...-width-large-overlap-rotated.base.rgb24.ref.png | Bin 0 -> 404 bytes .../line-width-large-overlap-rotated.ref.png | Bin 0 -> 415 bytes .../line-width-large-overlap-rotated.traps.ref.png | Bin 0 -> 404 bytes .../line-width-large-overlap.base.argb32.ref.png | Bin 0 -> 305 bytes .../line-width-large-overlap.base.rgb24.ref.png | Bin 0 -> 305 bytes test/reference/line-width-large-overlap.ref.png | Bin 0 -> 305 bytes .../line-width-overlap-dashed.base.argb32.ref.png | Bin 0 -> 397 bytes .../line-width-overlap-dashed.base.rgb24.ref.png | Bin 0 -> 397 bytes .../line-width-overlap-dashed.mask.argb32.ref.png | Bin 0 -> 401 bytes .../line-width-overlap-dashed.mask.rgb24.ref.png | Bin 0 -> 401 bytes test/reference/line-width-overlap-dashed.ref.png | Bin 0 -> 407 bytes .../line-width-overlap-dashed.traps.argb32.ref.png | Bin 0 -> 407 bytes .../line-width-overlap-dashed.traps.rgb24.ref.png | Bin 0 -> 407 bytes .../line-width-overlap-flipped.base.argb32.ref.png | Bin 0 -> 324 bytes .../line-width-overlap-flipped.base.rgb24.ref.png | Bin 0 -> 324 bytes test/reference/line-width-overlap-flipped.ref.png | Bin 0 -> 296 bytes .../line-width-overlap-flopped.base.argb32.ref.png | Bin 0 -> 324 bytes .../line-width-overlap-flopped.base.rgb24.ref.png | Bin 0 -> 324 bytes test/reference/line-width-overlap-flopped.ref.png | Bin 0 -> 296 bytes .../line-width-overlap-offset.base.argb32.ref.png | Bin 0 -> 365 bytes .../line-width-overlap-offset.base.rgb24.ref.png | Bin 0 -> 365 bytes test/reference/line-width-overlap-offset.ref.png | Bin 0 -> 348 bytes .../line-width-overlap-offset.traps.ref.png | Bin 0 -> 365 bytes .../line-width-overlap-rotated.base.argb32.ref.png | Bin 0 -> 628 bytes .../line-width-overlap-rotated.base.rgb24.ref.png | Bin 0 -> 628 bytes test/reference/line-width-overlap-rotated.ref.png | Bin 0 -> 688 bytes ...line-width-overlap-rotated.traps.argb32.ref.png | Bin 0 -> 628 bytes .../line-width-overlap-rotated.traps.rgb24.ref.png | Bin 0 -> 628 bytes .../line-width-overlap.base.argb32.ref.png | Bin 0 -> 324 bytes .../line-width-overlap.base.rgb24.ref.png | Bin 0 -> 324 bytes test/reference/line-width-overlap.ref.png | Bin 0 -> 324 bytes .../reference/line-width-scale.base.argb32.ref.png | Bin 0 -> 5692 bytes test/reference/line-width-scale.base.rgb24.ref.png | Bin 0 -> 5692 bytes test/reference/line-width-scale.image16.ref.png | Bin 0 -> 4721 bytes test/reference/line-width-scale.ps2.ref.png | Bin 0 -> 3431 bytes test/reference/line-width-scale.ps3.ref.png | Bin 0 -> 3431 bytes test/reference/line-width-scale.quartz.ref.png | Bin 0 -> 5623 bytes test/reference/line-width-scale.ref.png | Bin 0 -> 5721 bytes .../line-width-scale.traps.argb32.ref.png | Bin 0 -> 5692 bytes .../reference/line-width-scale.traps.rgb24.ref.png | Bin 0 -> 5692 bytes .../line-width-tolerance.base.argb32.ref.png | Bin 0 -> 163 bytes .../line-width-tolerance.base.rgb24.ref.png | Bin 0 -> 163 bytes test/reference/line-width-tolerance.ref.png | Bin 0 -> 168 bytes .../line-width-tolerance.traps.argb32.ref.png | Bin 0 -> 163 bytes .../line-width-tolerance.traps.rgb24.ref.png | Bin 0 -> 163 bytes test/reference/line-width.base.argb32.ref.png | Bin 0 -> 180 bytes test/reference/line-width.base.rgb24.ref.png | Bin 0 -> 180 bytes test/reference/line-width.ref.png | Bin 0 -> 178 bytes test/reference/line-width.traps.argb32.ref.png | Bin 0 -> 180 bytes test/reference/line-width.traps.rgb24.ref.png | Bin 0 -> 180 bytes .../linear-gradient-extend.base.argb32.ref.png | Bin 0 -> 371 bytes .../linear-gradient-extend.base.rgb24.ref.png | Bin 0 -> 371 bytes test/reference/linear-gradient-extend.ref.png | Bin 0 -> 371 bytes .../linear-gradient-large.base.argb32.ref.png | Bin 0 -> 4076 bytes .../linear-gradient-large.base.rgb24.ref.png | Bin 0 -> 4076 bytes .../reference/linear-gradient-large.quartz.ref.png | Bin 0 -> 4074 bytes test/reference/linear-gradient-large.ref.png | Bin 0 -> 4076 bytes .../linear-gradient-one-stop.base.argb32.ref.png | Bin 0 -> 225 bytes .../linear-gradient-one-stop.base.rgb24.ref.png | Bin 0 -> 174 bytes test/reference/linear-gradient-one-stop.ref.png | Bin 0 -> 225 bytes .../linear-gradient-reflect.base.argb32.ref.png | Bin 0 -> 185 bytes .../linear-gradient-reflect.base.rgb24.ref.png | Bin 0 -> 185 bytes .../linear-gradient-reflect.image16.ref.png | Bin 0 -> 190 bytes .../linear-gradient-reflect.pdf.argb32.ref.png | Bin 0 -> 248 bytes .../linear-gradient-reflect.pdf.rgb24.ref.png | Bin 0 -> 248 bytes test/reference/linear-gradient-reflect.ps3.ref.png | Bin 0 -> 314 bytes .../linear-gradient-reflect.quartz.ref.png | Bin 0 -> 780 bytes test/reference/linear-gradient-reflect.ref.png | Bin 0 -> 185 bytes .../linear-gradient-subset.base.argb32.ref.png | Bin 0 -> 773 bytes .../linear-gradient-subset.base.rgb24.ref.png | Bin 0 -> 773 bytes .../linear-gradient-subset.image16.ref.png | Bin 0 -> 791 bytes test/reference/linear-gradient-subset.ps3.ref.png | Bin 0 -> 619 bytes .../linear-gradient-subset.quartz.ref.png | Bin 0 -> 852 bytes test/reference/linear-gradient-subset.ref.png | Bin 0 -> 813 bytes .../linear-gradient-subset.traps.argb32.ref.png | Bin 0 -> 773 bytes .../linear-gradient-subset.traps.rgb24.ref.png | Bin 0 -> 773 bytes test/reference/linear-gradient.base.argb32.ref.png | Bin 0 -> 914 bytes test/reference/linear-gradient.base.rgb24.ref.png | Bin 0 -> 914 bytes test/reference/linear-gradient.image16.ref.png | Bin 0 -> 941 bytes test/reference/linear-gradient.ps3.ref.png | Bin 0 -> 779 bytes test/reference/linear-gradient.quartz.ref.png | Bin 0 -> 951 bytes test/reference/linear-gradient.ref.png | Bin 0 -> 959 bytes .../reference/linear-gradient.traps.argb32.ref.png | Bin 0 -> 914 bytes test/reference/linear-gradient.traps.rgb24.ref.png | Bin 0 -> 914 bytes .../linear-step-function.base.argb32.ref.png | Bin 0 -> 118 bytes .../linear-step-function.base.rgb24.ref.png | Bin 0 -> 118 bytes .../linear-step-function.mask.argb32.ref.png | Bin 0 -> 118 bytes .../linear-step-function.mask.rgb24.ref.png | Bin 0 -> 118 bytes .../linear-step-function.traps.argb32.ref.png | Bin 0 -> 118 bytes .../linear-step-function.traps.rgb24.ref.png | Bin 0 -> 118 bytes test/reference/linear-step-function.xfail.png | Bin 0 -> 116 bytes test/reference/linear-uniform.base.argb32.ref.png | Bin 0 -> 128 bytes test/reference/linear-uniform.base.rgb24.ref.png | Bin 0 -> 128 bytes test/reference/linear-uniform.image16.ref.png | Bin 0 -> 131 bytes test/reference/linear-uniform.ref.png | Bin 0 -> 128 bytes .../long-dashed-lines.base.argb32.ref.png | Bin 0 -> 2079 bytes .../reference/long-dashed-lines.base.rgb24.ref.png | Bin 0 -> 2079 bytes test/reference/long-dashed-lines.image16.ref.png | Bin 0 -> 1974 bytes test/reference/long-dashed-lines.ps2.ref.png | Bin 0 -> 1329 bytes test/reference/long-dashed-lines.ps3.ref.png | Bin 0 -> 1329 bytes test/reference/long-dashed-lines.quartz.ref.png | Bin 0 -> 2068 bytes test/reference/long-dashed-lines.ref.png | Bin 0 -> 2548 bytes .../long-dashed-lines.traps.argb32.ref.png | Bin 0 -> 2079 bytes .../long-dashed-lines.traps.rgb24.ref.png | Bin 0 -> 2079 bytes test/reference/long-lines.base.argb32.ref.png | Bin 0 -> 201 bytes test/reference/long-lines.base.rgb24.ref.png | Bin 0 -> 201 bytes test/reference/long-lines.mask.argb32.ref.png | Bin 0 -> 201 bytes test/reference/long-lines.mask.rgb24.ref.png | Bin 0 -> 201 bytes test/reference/long-lines.traps.argb32.ref.png | Bin 0 -> 201 bytes test/reference/long-lines.traps.rgb24.ref.png | Bin 0 -> 201 bytes .../reference/map-all-to-image.base.argb32.ref.png | Bin 0 -> 86 bytes test/reference/map-all-to-image.base.rgb24.ref.png | Bin 0 -> 86 bytes test/reference/map-all-to-image.ref.png | Bin 0 -> 86 bytes .../map-all-to-xlib-fallback.rgb24.ref.png | Bin 0 -> 86 bytes .../reference/map-all-to-xlib-window.rgb24.ref.png | Bin 0 -> 86 bytes test/reference/map-all-to-xlib.ref.png | Bin 0 -> 86 bytes .../reference/map-bit-to-image.base.argb32.ref.png | Bin 0 -> 103 bytes test/reference/map-bit-to-image.base.rgb24.ref.png | Bin 0 -> 103 bytes test/reference/map-bit-to-image.ref.png | Bin 0 -> 103 bytes .../map-bit-to-xlib-fallback.rgb24.ref.png | Bin 0 -> 103 bytes .../reference/map-bit-to-xlib-window.rgb24.ref.png | Bin 0 -> 103 bytes test/reference/map-bit-to-xlib.ref.png | Bin 0 -> 103 bytes .../map-to-image-fill.base.argb32.ref.png | Bin 0 -> 103 bytes .../reference/map-to-image-fill.base.rgb24.ref.png | Bin 0 -> 103 bytes test/reference/map-to-image-fill.ref.png | Bin 0 -> 103 bytes test/reference/mask-alpha.argb32.ref.png | Bin 0 -> 629 bytes test/reference/mask-alpha.base.argb32.ref.png | Bin 0 -> 627 bytes test/reference/mask-alpha.base.rgb24.ref.png | Bin 0 -> 588 bytes test/reference/mask-alpha.image16.ref.png | Bin 0 -> 560 bytes test/reference/mask-alpha.ps.ref.png | Bin 0 -> 594 bytes test/reference/mask-alpha.quartz.argb32.ref.png | Bin 0 -> 622 bytes test/reference/mask-alpha.rgb24.ref.png | Bin 0 -> 595 bytes test/reference/mask-alpha.svg.rgb24.xfail.png | Bin 0 -> 585 bytes test/reference/mask-alpha.traps.argb32.ref.png | Bin 0 -> 627 bytes test/reference/mask-alpha.traps.rgb24.ref.png | Bin 0 -> 588 bytes test/reference/mask-ctm.base.argb32.ref.png | Bin 0 -> 110 bytes test/reference/mask-ctm.base.rgb24.ref.png | Bin 0 -> 105 bytes test/reference/mask-ctm.ref.png | Bin 0 -> 129 bytes test/reference/mask-glyphs.gl.ref.png | Bin 0 -> 1188669 bytes test/reference/mask-glyphs.image16.ref.png | Bin 0 -> 1053144 bytes test/reference/mask-glyphs.pdf.ref.png | Bin 0 -> 1187713 bytes test/reference/mask-glyphs.ref.png | Bin 0 -> 1189351 bytes test/reference/mask-glyphs.svg.ref.png | Bin 0 -> 1211144 bytes .../reference/mask-surface-ctm.base.argb32.ref.png | Bin 0 -> 110 bytes test/reference/mask-surface-ctm.base.rgb24.ref.png | Bin 0 -> 105 bytes test/reference/mask-surface-ctm.ref.png | Bin 0 -> 129 bytes .../mask-transformed-image.base.argb32.ref.png | Bin 0 -> 3812 bytes .../mask-transformed-image.base.rgb24.ref.png | Bin 0 -> 3812 bytes .../mask-transformed-image.image16.ref.png | Bin 0 -> 2748 bytes test/reference/mask-transformed-image.pdf.ref.png | Bin 0 -> 3528 bytes .../mask-transformed-image.quartz.ref.png | Bin 0 -> 3909 bytes test/reference/mask-transformed-image.ref.png | Bin 0 -> 3812 bytes .../mask-transformed-similar.base.argb32.ref.png | Bin 0 -> 3812 bytes .../mask-transformed-similar.base.rgb24.ref.png | Bin 0 -> 3812 bytes .../mask-transformed-similar.image16.ref.png | Bin 0 -> 2748 bytes .../reference/mask-transformed-similar.pdf.ref.png | Bin 0 -> 4213 bytes .../mask-transformed-similar.quartz.ref.png | Bin 0 -> 3909 bytes .../mask-transformed-similar.recording.ref.png | Bin 0 -> 3528 bytes test/reference/mask-transformed-similar.ref.png | Bin 0 -> 3812 bytes .../reference/mask-transformed-similar.svg.ref.png | Bin 0 -> 3365 bytes .../mask-transformed-xlib-fallback.rgb24.ref.png | Bin 0 -> 3809 bytes .../mask-transformed-xlib-window.rgb24.ref.png | Bin 0 -> 3809 bytes test/reference/mask-transformed-xlib.ref.png | Bin 0 -> 3809 bytes test/reference/mask.argb32.ref.png | Bin 0 -> 8530 bytes test/reference/mask.base.argb32.ref.png | Bin 0 -> 8439 bytes test/reference/mask.base.rgb24.ref.png | Bin 0 -> 7044 bytes test/reference/mask.image16.ref.png | Bin 0 -> 5533 bytes test/reference/mask.pdf.argb32.ref.png | Bin 0 -> 7554 bytes test/reference/mask.pdf.rgb24.ref.png | Bin 0 -> 7043 bytes test/reference/mask.quartz.argb32.ref.png | Bin 0 -> 10669 bytes test/reference/mask.quartz.rgb24.ref.png | Bin 0 -> 8354 bytes test/reference/mask.rgb24.ref.png | Bin 0 -> 7160 bytes test/reference/mask.svg.argb32.xfail.png | Bin 0 -> 8641 bytes test/reference/mask.svg.rgb24.xfail.png | Bin 0 -> 7199 bytes test/reference/mask.traps.argb32.ref.png | Bin 0 -> 8451 bytes test/reference/mask.traps.rgb24.ref.png | Bin 0 -> 7058 bytes .../mesh-pattern-accuracy.base.argb32.ref.png | Bin 0 -> 8086 bytes .../mesh-pattern-accuracy.base.rgb24.ref.png | Bin 0 -> 8086 bytes .../mesh-pattern-accuracy.image16.ref.png | Bin 0 -> 7209 bytes test/reference/mesh-pattern-accuracy.ref.png | Bin 0 -> 8086 bytes .../mesh-pattern-conical.base.argb32.ref.png | Bin 0 -> 8655 bytes .../mesh-pattern-conical.base.rgb24.ref.png | Bin 0 -> 8655 bytes .../reference/mesh-pattern-conical.image16.ref.png | Bin 0 -> 6141 bytes test/reference/mesh-pattern-conical.ref.png | Bin 0 -> 8655 bytes ...mesh-pattern-control-points.base.argb32.ref.png | Bin 0 -> 10665 bytes .../mesh-pattern-control-points.base.rgb24.ref.png | Bin 0 -> 10665 bytes .../mesh-pattern-control-points.image16.ref.png | Bin 0 -> 7178 bytes test/reference/mesh-pattern-control-points.ref.png | Bin 0 -> 10665 bytes .../mesh-pattern-fold.base.argb32.ref.png | Bin 0 -> 52980 bytes .../reference/mesh-pattern-fold.base.rgb24.ref.png | Bin 0 -> 52980 bytes test/reference/mesh-pattern-fold.image16.ref.png | Bin 0 -> 22913 bytes test/reference/mesh-pattern-fold.ref.png | Bin 0 -> 52980 bytes .../mesh-pattern-overlap.base.argb32.ref.png | Bin 0 -> 9129 bytes .../mesh-pattern-overlap.base.rgb24.ref.png | Bin 0 -> 9129 bytes .../reference/mesh-pattern-overlap.image16.ref.png | Bin 0 -> 5933 bytes test/reference/mesh-pattern-overlap.ref.png | Bin 0 -> 9129 bytes .../mesh-pattern-transformed.base.argb32.ref.png | Bin 0 -> 14463 bytes .../mesh-pattern-transformed.base.rgb24.ref.png | Bin 0 -> 14463 bytes .../mesh-pattern-transformed.image16.ref.png | Bin 0 -> 9778 bytes test/reference/mesh-pattern-transformed.ref.png | Bin 0 -> 14463 bytes test/reference/mesh-pattern.base.argb32.ref.png | Bin 0 -> 19566 bytes test/reference/mesh-pattern.base.rgb24.ref.png | Bin 0 -> 19566 bytes test/reference/mesh-pattern.image16.ref.png | Bin 0 -> 12199 bytes test/reference/mesh-pattern.ref.png | Bin 0 -> 19566 bytes test/reference/mime-data.base.argb32.ref.png | Bin 0 -> 243 bytes test/reference/mime-data.base.rgb24.ref.png | Bin 0 -> 243 bytes test/reference/mime-data.pdf.ref.png | Bin 0 -> 7563 bytes test/reference/mime-data.ps.ref.png | Bin 0 -> 4705 bytes test/reference/mime-data.ref.png | Bin 0 -> 243 bytes test/reference/mime-data.script.ref.png | Bin 0 -> 2130 bytes test/reference/mime-data.svg.ref.png | Bin 0 -> 6437 bytes test/reference/miter-precision.base.argb32.ref.png | Bin 0 -> 823 bytes test/reference/miter-precision.base.rgb24.ref.png | Bin 0 -> 823 bytes test/reference/miter-precision.ps2.ref.png | Bin 0 -> 865 bytes test/reference/miter-precision.ps3.ref.png | Bin 0 -> 865 bytes test/reference/miter-precision.ref.png | Bin 0 -> 824 bytes .../reference/miter-precision.traps.argb32.ref.png | Bin 0 -> 823 bytes test/reference/miter-precision.traps.rgb24.ref.png | Bin 0 -> 823 bytes .../move-to-show-surface.base.argb32.ref.png | Bin 0 -> 96 bytes .../move-to-show-surface.base.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/move-to-show-surface.ref.png | Bin 0 -> 100 bytes .../negative-stride-image.base.argb32.ref.png | Bin 0 -> 81121 bytes .../negative-stride-image.base.rgb24.ref.png | Bin 0 -> 81121 bytes .../negative-stride-image.image16.ref.png | Bin 0 -> 61197 bytes test/reference/negative-stride-image.ps.ref.png | Bin 0 -> 77159 bytes test/reference/negative-stride-image.ref.png | Bin 0 -> 81121 bytes test/reference/new-sub-path.base.argb32.ref.png | Bin 0 -> 415 bytes test/reference/new-sub-path.base.rgb24.ref.png | Bin 0 -> 378 bytes test/reference/new-sub-path.pdf.argb32.ref.png | Bin 0 -> 512 bytes test/reference/new-sub-path.ps2.argb32.ref.png | Bin 0 -> 398 bytes test/reference/new-sub-path.ps2.rgb24.ref.png | Bin 0 -> 423 bytes test/reference/new-sub-path.ps3.argb32.ref.png | Bin 0 -> 398 bytes test/reference/new-sub-path.ps3.rgb24.ref.png | Bin 0 -> 423 bytes test/reference/new-sub-path.quartz.ref.png | Bin 0 -> 370 bytes test/reference/new-sub-path.ref.png | Bin 0 -> 408 bytes test/reference/new-sub-path.traps.argb32.ref.png | Bin 0 -> 415 bytes test/reference/new-sub-path.traps.rgb24.ref.png | Bin 0 -> 378 bytes test/reference/nil-surface.base.argb32.ref.png | Bin 0 -> 88 bytes test/reference/nil-surface.base.rgb24.ref.png | Bin 0 -> 87 bytes test/reference/nil-surface.ref.png | Bin 0 -> 107 bytes .../operator-alpha-alpha.base.argb32.ref.png | Bin 0 -> 3402 bytes .../operator-alpha-alpha.base.rgb24.ref.png | Bin 0 -> 3402 bytes .../reference/operator-alpha-alpha.image16.ref.png | Bin 0 -> 4140 bytes test/reference/operator-alpha-alpha.pdf.xfail.png | Bin 0 -> 3749 bytes test/reference/operator-alpha-alpha.ps.xfail.png | Bin 0 -> 3429 bytes test/reference/operator-alpha-alpha.ref.png | Bin 0 -> 3441 bytes test/reference/operator-alpha-alpha.svg.xfail.png | Bin 0 -> 838 bytes .../operator-alpha-alpha.traps.argb32.ref.png | Bin 0 -> 3402 bytes .../operator-alpha-alpha.traps.rgb24.ref.png | Bin 0 -> 3402 bytes test/reference/operator-alpha.argb32.ref.png | Bin 0 -> 280 bytes test/reference/operator-alpha.base.argb32.ref.png | Bin 0 -> 280 bytes test/reference/operator-alpha.base.rgb24.ref.png | Bin 0 -> 205 bytes test/reference/operator-alpha.rgb24.ref.png | Bin 0 -> 205 bytes .../operator-alpha.svg12.argb32.xfail.png | Bin 0 -> 274 bytes .../reference/operator-alpha.svg12.rgb24.xfail.png | Bin 0 -> 248 bytes test/reference/operator-clear.argb32.ref.png | Bin 0 -> 1061 bytes test/reference/operator-clear.base.argb32.ref.png | Bin 0 -> 1071 bytes test/reference/operator-clear.base.rgb24.ref.png | Bin 0 -> 950 bytes test/reference/operator-clear.mask.rgb24.ref.png | Bin 0 -> 947 bytes test/reference/operator-clear.ps2.argb32.ref.png | Bin 0 -> 1156 bytes test/reference/operator-clear.ps3.argb32.ref.png | Bin 0 -> 1156 bytes .../reference/operator-clear.quartz.argb32.ref.png | Bin 0 -> 1228 bytes test/reference/operator-clear.quartz.rgb24.ref.png | Bin 0 -> 1096 bytes test/reference/operator-clear.rgb24.ref.png | Bin 0 -> 939 bytes .../operator-clear.svg12.argb32.xfail.png | Bin 0 -> 405 bytes .../reference/operator-clear.svg12.rgb24.xfail.png | Bin 0 -> 535 bytes test/reference/operator-clear.traps.argb32.ref.png | Bin 0 -> 1071 bytes test/reference/operator-clear.traps.rgb24.ref.png | Bin 0 -> 950 bytes test/reference/operator-source.argb32.ref.png | Bin 0 -> 5620 bytes test/reference/operator-source.base.argb32.ref.png | Bin 0 -> 5625 bytes test/reference/operator-source.base.rgb24.ref.png | Bin 0 -> 3979 bytes test/reference/operator-source.image16.ref.png | Bin 0 -> 3959 bytes test/reference/operator-source.mask.argb32.ref.png | Bin 0 -> 5612 bytes test/reference/operator-source.mask.rgb24.ref.png | Bin 0 -> 3975 bytes test/reference/operator-source.rgb24.ref.png | Bin 0 -> 4006 bytes .../reference/operator-source.traps.argb32.ref.png | Bin 0 -> 5625 bytes test/reference/operator-source.traps.rgb24.ref.png | Bin 0 -> 3979 bytes .../operator-source.xlib-fallback.ref.png | Bin 0 -> 4444 bytes test/reference/operator.argb32.ref.png | Bin 0 -> 238 bytes test/reference/operator.base.argb32.ref.png | Bin 0 -> 238 bytes test/reference/operator.base.rgb24.ref.png | Bin 0 -> 189 bytes test/reference/operator.rgb24.ref.png | Bin 0 -> 189 bytes test/reference/operator.svg12.argb32.xfail.png | Bin 0 -> 238 bytes test/reference/operator.svg12.rgb24.xfail.png | Bin 0 -> 242 bytes test/reference/outline-tolerance.ref.png | Bin 0 -> 205 bytes test/reference/over-above-source.argb32.ref.png | Bin 0 -> 533 bytes .../over-above-source.base.argb32.ref.png | Bin 0 -> 533 bytes .../reference/over-above-source.base.rgb24.ref.png | Bin 0 -> 450 bytes .../reference/over-above-source.ps2.argb32.ref.png | Bin 0 -> 558 bytes .../reference/over-above-source.ps3.argb32.ref.png | Bin 0 -> 558 bytes .../over-above-source.quartz.argb32.ref.png | Bin 0 -> 511 bytes .../over-above-source.quartz.rgb24.ref.png | Bin 0 -> 437 bytes test/reference/over-above-source.rgb24.ref.png | Bin 0 -> 452 bytes .../over-above-source.svg12.rgb24.xfail.png | Bin 0 -> 563 bytes .../over-above-source.traps.argb32.ref.png | Bin 0 -> 533 bytes .../over-above-source.traps.rgb24.ref.png | Bin 0 -> 450 bytes test/reference/over-around-source.argb32.ref.png | Bin 0 -> 604 bytes .../over-around-source.base.argb32.ref.png | Bin 0 -> 610 bytes .../over-around-source.base.rgb24.ref.png | Bin 0 -> 492 bytes test/reference/over-around-source.image16.ref.png | Bin 0 -> 491 bytes .../over-around-source.pdf.argb32.ref.png | Bin 0 -> 576 bytes .../over-around-source.ps2.argb32.ref.png | Bin 0 -> 508 bytes .../reference/over-around-source.ps2.rgb24.ref.png | Bin 0 -> 538 bytes .../over-around-source.ps3.argb32.ref.png | Bin 0 -> 508 bytes .../reference/over-around-source.ps3.rgb24.ref.png | Bin 0 -> 538 bytes .../over-around-source.quartz.argb32.ref.png | Bin 0 -> 593 bytes test/reference/over-around-source.rgb24.ref.png | Bin 0 -> 489 bytes .../over-around-source.svg12.argb32.xfail.png | Bin 0 -> 559 bytes .../over-around-source.svg12.rgb24.xfail.png | Bin 0 -> 559 bytes .../over-around-source.traps.argb32.ref.png | Bin 0 -> 610 bytes .../over-around-source.traps.rgb24.ref.png | Bin 0 -> 492 bytes test/reference/over-below-source.argb32.ref.png | Bin 0 -> 440 bytes .../over-below-source.base.argb32.ref.png | Bin 0 -> 436 bytes .../reference/over-below-source.base.rgb24.ref.png | Bin 0 -> 378 bytes .../reference/over-below-source.pdf.argb32.ref.png | Bin 0 -> 464 bytes .../reference/over-below-source.ps2.argb32.ref.png | Bin 0 -> 368 bytes test/reference/over-below-source.ps2.rgb24.ref.png | Bin 0 -> 362 bytes .../reference/over-below-source.ps3.argb32.ref.png | Bin 0 -> 368 bytes test/reference/over-below-source.ps3.rgb24.ref.png | Bin 0 -> 362 bytes test/reference/over-below-source.rgb24.ref.png | Bin 0 -> 376 bytes .../over-below-source.svg12.argb32.xfail.png | Bin 0 -> 224 bytes .../over-below-source.svg12.rgb24.xfail.png | Bin 0 -> 224 bytes .../over-below-source.traps.argb32.ref.png | Bin 0 -> 436 bytes .../over-below-source.traps.rgb24.ref.png | Bin 0 -> 378 bytes test/reference/over-between-source.argb32.ref.png | Bin 0 -> 572 bytes .../over-between-source.base.argb32.ref.png | Bin 0 -> 578 bytes .../over-between-source.base.rgb24.ref.png | Bin 0 -> 461 bytes .../over-between-source.ps2.argb32.ref.png | Bin 0 -> 551 bytes .../over-between-source.ps3.argb32.ref.png | Bin 0 -> 551 bytes .../over-between-source.quartz.argb32.ref.png | Bin 0 -> 551 bytes test/reference/over-between-source.rgb24.ref.png | Bin 0 -> 457 bytes .../over-between-source.svg12.argb32.xfail.png | Bin 0 -> 224 bytes .../over-between-source.svg12.rgb24.xfail.png | Bin 0 -> 224 bytes .../over-between-source.traps.argb32.ref.png | Bin 0 -> 578 bytes .../over-between-source.traps.rgb24.ref.png | Bin 0 -> 461 bytes .../overlapping-boxes.base.argb32.ref.png | Bin 0 -> 216 bytes .../reference/overlapping-boxes.base.rgb24.ref.png | Bin 0 -> 204 bytes test/reference/overlapping-boxes.ref.png | Bin 0 -> 179 bytes .../overlapping-boxes.traps.argb32.ref.png | Bin 0 -> 216 bytes .../overlapping-boxes.traps.rgb24.ref.png | Bin 0 -> 204 bytes .../overlapping-dash-caps.base.argb32.ref.png | Bin 0 -> 3967 bytes .../overlapping-dash-caps.base.rgb24.ref.png | Bin 0 -> 3967 bytes .../overlapping-dash-caps.mask.argb32.ref.png | Bin 0 -> 3986 bytes .../overlapping-dash-caps.mask.rgb24.ref.png | Bin 0 -> 3986 bytes test/reference/overlapping-dash-caps.ref.png | Bin 0 -> 3952 bytes .../overlapping-dash-caps.traps.argb32.ref.png | Bin 0 -> 3967 bytes .../overlapping-dash-caps.traps.rgb24.ref.png | Bin 0 -> 3967 bytes .../overlapping-glyphs.base.argb32.ref.png | Bin 0 -> 2715 bytes .../overlapping-glyphs.base.rgb24.ref.png | Bin 0 -> 1661 bytes .../overlapping-glyphs.pdf.argb32.xfail.png | Bin 0 -> 2199 bytes .../overlapping-glyphs.pdf.rgb24.xfail.png | Bin 0 -> 1692 bytes .../overlapping-glyphs.quartz.argb32.ref.png | Bin 0 -> 2824 bytes .../overlapping-glyphs.quartz.rgb24.ref.png | Bin 0 -> 1711 bytes test/reference/overlapping-glyphs.ref.png | Bin 0 -> 2717 bytes .../overlapping-glyphs.svg.argb32.ref.png | Bin 0 -> 2338 bytes .../reference/overlapping-glyphs.svg.rgb24.ref.png | Bin 0 -> 2338 bytes .../overlapping-glyphs.traps.argb32.ref.png | Bin 0 -> 2715 bytes .../overlapping-glyphs.traps.rgb24.ref.png | Bin 0 -> 1661 bytes .../paint-clip-fill-aa.base.argb32.ref.png | Bin 0 -> 327 bytes .../paint-clip-fill-aa.base.rgb24.ref.png | Bin 0 -> 327 bytes test/reference/paint-clip-fill-aa.ref.png | Bin 0 -> 352 bytes .../paint-clip-fill-mono.base.argb32.ref.png | Bin 0 -> 327 bytes .../paint-clip-fill-mono.base.rgb24.ref.png | Bin 0 -> 327 bytes test/reference/paint-clip-fill-mono.ref.png | Bin 0 -> 352 bytes test/reference/paint-repeat.base.argb32.ref.png | Bin 0 -> 122 bytes test/reference/paint-repeat.base.rgb24.ref.png | Bin 0 -> 122 bytes test/reference/paint-repeat.ref.png | Bin 0 -> 145 bytes .../paint-source-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes .../paint-source-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes test/reference/paint-source-alpha.image16.ref.png | Bin 0 -> 253 bytes test/reference/paint-source-alpha.ref.png | Bin 0 -> 256 bytes test/reference/paint-source-alpha.svg.ref.png | Bin 0 -> 693 bytes .../paint-with-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 330 bytes .../paint-with-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 330 bytes .../paint-with-alpha-clip-mask.mask.argb32.ref.png | Bin 0 -> 330 bytes .../paint-with-alpha-clip-mask.mask.rgb24.ref.png | Bin 0 -> 330 bytes test/reference/paint-with-alpha-clip-mask.ref.png | Bin 0 -> 335 bytes ...paint-with-alpha-clip-mask.traps.argb32.ref.png | Bin 0 -> 305 bytes .../paint-with-alpha-clip-mask.traps.rgb24.ref.png | Bin 0 -> 305 bytes .../paint-with-alpha-clip.base.argb32.ref.png | Bin 0 -> 269 bytes .../paint-with-alpha-clip.base.rgb24.ref.png | Bin 0 -> 269 bytes .../paint-with-alpha-clip.mask.argb32.ref.png | Bin 0 -> 269 bytes .../paint-with-alpha-clip.mask.rgb24.ref.png | Bin 0 -> 269 bytes test/reference/paint-with-alpha-clip.ref.png | Bin 0 -> 290 bytes .../paint-with-alpha-clip.traps.argb32.ref.png | Bin 0 -> 269 bytes .../paint-with-alpha-clip.traps.rgb24.ref.png | Bin 0 -> 269 bytes test/reference/paint-with-alpha-group-clip.ref.png | Bin 0 -> 135 bytes ...paint-with-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 248 bytes .../paint-with-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 248 bytes ...paint-with-alpha-solid-clip.mask.argb32.ref.png | Bin 0 -> 266 bytes .../paint-with-alpha-solid-clip.mask.rgb24.ref.png | Bin 0 -> 266 bytes test/reference/paint-with-alpha-solid-clip.ref.png | Bin 0 -> 248 bytes ...aint-with-alpha-solid-clip.traps.argb32.ref.png | Bin 0 -> 266 bytes ...paint-with-alpha-solid-clip.traps.rgb24.ref.png | Bin 0 -> 266 bytes .../reference/paint-with-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes test/reference/paint-with-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes test/reference/paint-with-alpha.image16.ref.png | Bin 0 -> 253 bytes test/reference/paint-with-alpha.ref.png | Bin 0 -> 256 bytes test/reference/paint-with-alpha.svg.ref.png | Bin 0 -> 483 bytes test/reference/paint.base.argb32.ref.png | Bin 0 -> 93 bytes test/reference/paint.base.rgb24.ref.png | Bin 0 -> 93 bytes test/reference/paint.ref.png | Bin 0 -> 116 bytes .../partial-clip-text-bottom.base.argb32.ref.png | Bin 0 -> 261 bytes .../partial-clip-text-bottom.base.rgb24.ref.png | Bin 0 -> 261 bytes test/reference/partial-clip-text-bottom.ref.png | Bin 0 -> 261 bytes .../partial-clip-text-left.base.argb32.ref.png | Bin 0 -> 301 bytes .../partial-clip-text-left.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/partial-clip-text-left.ref.png | Bin 0 -> 301 bytes .../partial-clip-text-right.base.argb32.ref.png | Bin 0 -> 155 bytes .../partial-clip-text-right.base.rgb24.ref.png | Bin 0 -> 155 bytes test/reference/partial-clip-text-right.ref.png | Bin 0 -> 155 bytes .../partial-clip-text-right.traps.ref.png | Bin 0 -> 155 bytes .../partial-clip-text-top.base.argb32.ref.png | Bin 0 -> 181 bytes .../partial-clip-text-top.base.rgb24.ref.png | Bin 0 -> 181 bytes test/reference/partial-clip-text-top.ps.ref.png | Bin 0 -> 107 bytes .../reference/partial-clip-text-top.quartz.ref.png | Bin 0 -> 174 bytes test/reference/partial-clip-text-top.ref.png | Bin 0 -> 181 bytes test/reference/partial-clip-text-top.svg.ref.png | Bin 0 -> 173 bytes test/reference/partial-clip-text-top.traps.ref.png | Bin 0 -> 181 bytes ...ial-coverage-half-reference.base.argb32.ref.png | Bin 0 -> 189 bytes ...tial-coverage-half-reference.base.rgb24.ref.png | Bin 0 -> 189 bytes .../partial-coverage-half-reference.ref.png | Bin 0 -> 189 bytes .../partial-coverage-half-triangles.ref.png | Bin 0 -> 189 bytes .../partial-coverage-intersecting-quads.ref.png | Bin 0 -> 189 bytes .../partial-coverage-intersecting-quads.xfail.png | Bin 0 -> 262 bytes ...partial-coverage-intersecting-triangles.ref.png | Bin 0 -> 202 bytes ...tial-coverage-overlap-half-triangles-eo.ref.png | Bin 0 -> 189 bytes ...partial-coverage-overlap-half-triangles.ref.png | Bin 0 -> 189 bytes ...overage-overlap-three-quarter-triangles.ref.png | Bin 0 -> 186 bytes test/reference/partial-coverage-rectangles.ref.png | Bin 0 -> 202 bytes .../partial-coverage-reference.base.argb32.ref.png | Bin 0 -> 202 bytes .../partial-coverage-reference.base.rgb24.ref.png | Bin 0 -> 202 bytes test/reference/partial-coverage-reference.ref.png | Bin 0 -> 202 bytes ...age-three-quarter-reference.base.argb32.ref.png | Bin 0 -> 186 bytes ...rage-three-quarter-reference.base.rgb24.ref.png | Bin 0 -> 186 bytes ...artial-coverage-three-quarter-reference.ref.png | Bin 0 -> 186 bytes test/reference/partial-coverage-triangles.ref.png | Bin 0 -> 202 bytes test/reference/pass-through.base.argb32.ref.png | Bin 0 -> 221 bytes test/reference/pass-through.base.rgb24.ref.png | Bin 0 -> 158 bytes test/reference/pass-through.ref.png | Bin 0 -> 221 bytes test/reference/path-append.base.argb32.ref.png | Bin 0 -> 6463 bytes test/reference/path-append.base.rgb24.ref.png | Bin 0 -> 6463 bytes test/reference/path-append.image16.ref.png | Bin 0 -> 5252 bytes test/reference/path-append.ps.ref.png | Bin 0 -> 4525 bytes test/reference/path-append.quartz.ref.png | Bin 0 -> 6395 bytes test/reference/path-append.ref.png | Bin 0 -> 6338 bytes test/reference/path-append.test-fallback.ref.png | Bin 0 -> 6461 bytes test/reference/path-append.traps.argb32.ref.png | Bin 0 -> 6463 bytes test/reference/path-append.traps.rgb24.ref.png | Bin 0 -> 6463 bytes test/reference/path-append.xlib-fallback.ref.png | Bin 0 -> 6320 bytes .../path-stroke-twice.base.argb32.ref.png | Bin 0 -> 205 bytes .../reference/path-stroke-twice.base.rgb24.ref.png | Bin 0 -> 205 bytes test/reference/path-stroke-twice.image16.ref.png | Bin 0 -> 210 bytes test/reference/path-stroke-twice.ps.ref.png | Bin 0 -> 197 bytes test/reference/path-stroke-twice.ref.png | Bin 0 -> 240 bytes .../path-stroke-twice.traps.argb32.ref.png | Bin 0 -> 205 bytes .../path-stroke-twice.traps.rgb24.ref.png | Bin 0 -> 205 bytes test/reference/pattern-getters.base.argb32.ref.png | Bin 0 -> 87 bytes test/reference/pattern-getters.base.rgb24.ref.png | Bin 0 -> 87 bytes test/reference/pattern-getters.ref.png | Bin 0 -> 107 bytes .../pdf-isolated-group.base.argb32.ref.png | Bin 0 -> 217 bytes .../pdf-isolated-group.base.rgb24.ref.png | Bin 0 -> 217 bytes test/reference/pdf-isolated-group.ref.png | Bin 0 -> 217 bytes .../pdf-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../pdf-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/pdf-surface-source.image16.ref.png | Bin 0 -> 305 bytes test/reference/pdf-surface-source.ref.png | Bin 0 -> 377 bytes .../pdf-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes .../pdf-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes test/reference/pixman-downscale-best-24.ref.png | Bin 0 -> 191 bytes .../pixman-downscale-best-95.image.rgb24.ref.png | Bin 0 -> 659 bytes .../pixman-downscale-best-95.image16.rgb24.ref.png | Bin 0 -> 648 bytes .../reference/pixman-downscale-best-95.pdf.ref.png | Bin 0 -> 479 bytes .../reference/pixman-downscale-best-95.ps2.ref.png | Bin 0 -> 460 bytes .../reference/pixman-downscale-best-95.ps3.ref.png | Bin 0 -> 460 bytes ...ixman-downscale-best-95.recording.rgb24.ref.png | Bin 0 -> 659 bytes test/reference/pixman-downscale-best-95.ref.png | Bin 0 -> 771 bytes .../pixman-downscale-best-95.script.ref.png | Bin 0 -> 772 bytes .../pixman-downscale-best-95.svg11.ref.png | Bin 0 -> 474 bytes .../pixman-downscale-best-95.svg12.ref.png | Bin 0 -> 474 bytes ...ixman-downscale-best-95.test-base.rgb24.ref.png | Bin 0 -> 659 bytes ...n-downscale-best-95.test-fallback.rgb24.ref.png | Bin 0 -> 659 bytes ...ixman-downscale-best-95.test-mask.rgb24.ref.png | Bin 0 -> 659 bytes ...-downscale-best-95.test-paginated.rgb24.ref.png | Bin 0 -> 659 bytes ...xman-downscale-best-95.test-spans.rgb24.ref.png | Bin 0 -> 659 bytes ...xman-downscale-best-95.test-traps.rgb24.ref.png | Bin 0 -> 659 bytes ...an-downscale-best-95.xcb-fallback.rgb24.ref.png | Bin 0 -> 659 bytes ...-downscale-best-95.xcb-render-0_0.rgb24.ref.png | Bin 0 -> 659 bytes ...man-downscale-best-95.xcb-window&.rgb24.ref.png | Bin 0 -> 474 bytes ...xman-downscale-best-95.xcb-window.rgb24.ref.png | Bin 0 -> 474 bytes .../reference/pixman-downscale-best-95.xcb.ref.png | Bin 0 -> 474 bytes ...n-downscale-best-95.xlib-fallback.rgb24.ref.png | Bin 0 -> 659 bytes ...downscale-best-95.xlib-render-0_0.rgb24.ref.png | Bin 0 -> 659 bytes ...man-downscale-best-95.xlib-window.rgb24.ref.png | Bin 0 -> 474 bytes .../pixman-downscale-best-95.xlib.ref.png | Bin 0 -> 474 bytes test/reference/pixman-downscale-best-96.ref.png | Bin 0 -> 301 bytes .../reference/pixman-downscale-bilinear-24.ref.png | Bin 0 -> 191 bytes ...man-downscale-bilinear-95.image16.rgb24.ref.png | Bin 0 -> 481 bytes .../pixman-downscale-bilinear-95.pdf.ref.png | Bin 0 -> 479 bytes .../pixman-downscale-bilinear-95.ps2.ref.png | Bin 0 -> 460 bytes .../pixman-downscale-bilinear-95.ps3.ref.png | Bin 0 -> 460 bytes .../reference/pixman-downscale-bilinear-95.ref.png | Bin 0 -> 474 bytes .../pixman-downscale-bilinear-95.script.ref.png | Bin 0 -> 481 bytes .../reference/pixman-downscale-bilinear-96.ref.png | Bin 0 -> 301 bytes test/reference/pixman-downscale-fast-24.ref.png | Bin 0 -> 191 bytes .../pixman-downscale-fast-95.image16.rgb24.ref.png | Bin 0 -> 304 bytes .../reference/pixman-downscale-fast-95.pdf.ref.png | Bin 0 -> 479 bytes .../reference/pixman-downscale-fast-95.ps2.ref.png | Bin 0 -> 299 bytes .../reference/pixman-downscale-fast-95.ps3.ref.png | Bin 0 -> 299 bytes test/reference/pixman-downscale-fast-95.ref.png | Bin 0 -> 299 bytes .../pixman-downscale-fast-95.svg11.ref.png | Bin 0 -> 474 bytes .../pixman-downscale-fast-95.svg12.ref.png | Bin 0 -> 474 bytes test/reference/pixman-downscale-fast-96.ref.png | Bin 0 -> 301 bytes test/reference/pixman-downscale-good-24.ref.png | Bin 0 -> 191 bytes .../pixman-downscale-good-95.image16.rgb24.ref.png | Bin 0 -> 481 bytes .../reference/pixman-downscale-good-95.pdf.ref.png | Bin 0 -> 479 bytes .../reference/pixman-downscale-good-95.ps2.ref.png | Bin 0 -> 460 bytes .../reference/pixman-downscale-good-95.ps3.ref.png | Bin 0 -> 460 bytes test/reference/pixman-downscale-good-95.ref.png | Bin 0 -> 474 bytes .../pixman-downscale-good-95.script.ref.png | Bin 0 -> 481 bytes test/reference/pixman-downscale-good-96.ref.png | Bin 0 -> 301 bytes test/reference/pixman-downscale-nearest-24.ref.png | Bin 0 -> 191 bytes ...xman-downscale-nearest-95.image16.rgb24.ref.png | Bin 0 -> 304 bytes .../pixman-downscale-nearest-95.pdf.ref.png | Bin 0 -> 479 bytes .../pixman-downscale-nearest-95.ps2.ref.png | Bin 0 -> 299 bytes .../pixman-downscale-nearest-95.ps3.ref.png | Bin 0 -> 299 bytes test/reference/pixman-downscale-nearest-95.ref.png | Bin 0 -> 299 bytes .../pixman-downscale-nearest-95.svg11.ref.png | Bin 0 -> 474 bytes .../pixman-downscale-nearest-95.svg12.ref.png | Bin 0 -> 474 bytes test/reference/pixman-downscale-nearest-96.ref.png | Bin 0 -> 301 bytes test/reference/pixman-rotate.base.argb32.ref.png | Bin 0 -> 260 bytes test/reference/pixman-rotate.base.rgb24.ref.png | Bin 0 -> 225 bytes test/reference/pixman-rotate.ps.argb32.ref.png | Bin 0 -> 355 bytes test/reference/pixman-rotate.ref.png | Bin 0 -> 260 bytes test/reference/ps-eps.ref.png | Bin 0 -> 4584 bytes .../ps-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../reference/ps-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/ps-surface-source.image16.ref.png | Bin 0 -> 305 bytes test/reference/ps-surface-source.ref.png | Bin 0 -> 377 bytes .../ps-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes .../ps-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes test/reference/pthread-same-source.image16.ref.png | Bin 0 -> 1048 bytes .../reference/pthread-same-source.quartz.xfail.png | Bin 0 -> 961 bytes test/reference/pthread-same-source.ref.png | Bin 0 -> 1076 bytes .../pthread-show-text.base.argb32.ref.png | Bin 0 -> 30199 bytes .../reference/pthread-show-text.base.rgb24.ref.png | Bin 0 -> 30199 bytes test/reference/pthread-show-text.image16.ref.png | Bin 0 -> 22167 bytes test/reference/pthread-show-text.pdf.ref.png | Bin 0 -> 47015 bytes test/reference/pthread-show-text.ps.ref.png | Bin 0 -> 16558 bytes test/reference/pthread-show-text.quartz.ref.png | Bin 0 -> 43005 bytes test/reference/pthread-show-text.ref.png | Bin 0 -> 30199 bytes test/reference/pthread-show-text.traps.ref.png | Bin 0 -> 30199 bytes .../pthread-show-text.xlib-fallback.ref.png | Bin 0 -> 42073 bytes test/reference/pthread-similar.base.argb32.ref.png | Bin 0 -> 170 bytes test/reference/pthread-similar.base.rgb24.ref.png | Bin 0 -> 170 bytes test/reference/pthread-similar.ref.png | Bin 0 -> 176 bytes .../reference/push-group-color.base.argb32.ref.png | Bin 0 -> 2902 bytes test/reference/push-group-color.base.rgb24.ref.png | Bin 0 -> 2902 bytes test/reference/push-group-color.image16.ref.png | Bin 0 -> 2277 bytes test/reference/push-group-color.ps2.ref.png | Bin 0 -> 2863 bytes test/reference/push-group-color.ps3.ref.png | Bin 0 -> 2561 bytes test/reference/push-group-color.quartz.ref.png | Bin 0 -> 3127 bytes test/reference/push-group-color.ref.png | Bin 0 -> 3002 bytes .../push-group-color.traps.argb32.ref.png | Bin 0 -> 2902 bytes .../reference/push-group-color.traps.rgb24.ref.png | Bin 0 -> 2902 bytes .../push-group-path-offset.base.argb32.ref.png | Bin 0 -> 186 bytes .../push-group-path-offset.base.rgb24.ref.png | Bin 0 -> 186 bytes test/reference/push-group-path-offset.ref.png | Bin 0 -> 186 bytes test/reference/push-group.argb32.ref.png | Bin 0 -> 3123 bytes test/reference/push-group.base.argb32.ref.png | Bin 0 -> 3110 bytes test/reference/push-group.base.rgb24.ref.png | Bin 0 -> 2947 bytes test/reference/push-group.image16.ref.png | Bin 0 -> 2286 bytes test/reference/push-group.quartz.argb32.ref.png | Bin 0 -> 3932 bytes test/reference/push-group.quartz.rgb24.ref.png | Bin 0 -> 3659 bytes test/reference/push-group.rgb24.ref.png | Bin 0 -> 2951 bytes test/reference/push-group.traps.argb32.ref.png | Bin 0 -> 3110 bytes test/reference/push-group.traps.rgb24.ref.png | Bin 0 -> 2947 bytes test/reference/quartz-surface-source.ps2.ref.png | Bin 0 -> 376 bytes test/reference/quartz-surface-source.ps3.ref.png | Bin 0 -> 376 bytes test/reference/quartz-surface-source.ref.png | Bin 0 -> 377 bytes .../radial-gradient-extend.base.argb32.ref.png | Bin 0 -> 466 bytes .../radial-gradient-extend.base.rgb24.ref.png | Bin 0 -> 466 bytes .../radial-gradient-extend.mask.argb32.ref.png | Bin 0 -> 466 bytes .../radial-gradient-extend.mask.rgb24.ref.png | Bin 0 -> 466 bytes test/reference/radial-gradient-extend.ps3.ref.png | Bin 0 -> 458 bytes test/reference/radial-gradient-extend.ref.png | Bin 0 -> 466 bytes .../radial-gradient-extend.traps.argb32.ref.png | Bin 0 -> 466 bytes .../radial-gradient-extend.traps.rgb24.ref.png | Bin 0 -> 466 bytes .../radial-gradient-mask-source.argb32.ref.png | Bin 0 -> 145713 bytes ...radial-gradient-mask-source.base.argb32.ref.png | Bin 0 -> 145713 bytes .../radial-gradient-mask-source.base.rgb24.ref.png | Bin 0 -> 150945 bytes .../radial-gradient-mask-source.image16.ref.png | Bin 0 -> 109925 bytes .../radial-gradient-mask-source.mask.rgb24.ref.png | Bin 0 -> 150945 bytes ...dial-gradient-mask-source.quartz.argb32.ref.png | Bin 0 -> 171002 bytes ...adial-gradient-mask-source.quartz.rgb24.ref.png | Bin 0 -> 179120 bytes ...radial-gradient-mask-source.traps.rgb24.ref.png | Bin 0 -> 150945 bytes .../radial-gradient-mask.base.argb32.ref.png | Bin 0 -> 286065 bytes .../radial-gradient-mask.base.rgb24.ref.png | Bin 0 -> 286065 bytes .../reference/radial-gradient-mask.image16.ref.png | Bin 0 -> 204585 bytes test/reference/radial-gradient-mask.quartz.ref.png | Bin 0 -> 296910 bytes test/reference/radial-gradient-mask.ref.png | Bin 0 -> 286065 bytes .../radial-gradient-one-stop.base.argb32.ref.png | Bin 0 -> 6306 bytes .../radial-gradient-one-stop.base.rgb24.ref.png | Bin 0 -> 6306 bytes .../radial-gradient-one-stop.quartz.ref.png | Bin 0 -> 6316 bytes test/reference/radial-gradient-one-stop.ref.png | Bin 0 -> 6306 bytes .../radial-gradient-source.base.argb32.ref.png | Bin 0 -> 408848 bytes .../radial-gradient-source.base.rgb24.ref.png | Bin 0 -> 263908 bytes .../radial-gradient-source.image16.ref.png | Bin 0 -> 169796 bytes .../radial-gradient-source.quartz.argb32.ref.png | Bin 0 -> 439222 bytes .../radial-gradient-source.quartz.rgb24.ref.png | Bin 0 -> 279249 bytes test/reference/radial-gradient-source.ref.png | Bin 0 -> 408848 bytes test/reference/radial-gradient.base.argb32.ref.png | Bin 0 -> 382283 bytes test/reference/radial-gradient.base.rgb24.ref.png | Bin 0 -> 382283 bytes test/reference/radial-gradient.image16.ref.png | Bin 0 -> 256686 bytes test/reference/radial-gradient.quartz.ref.png | Bin 0 -> 389140 bytes test/reference/radial-gradient.ref.png | Bin 0 -> 382283 bytes .../radial-outer-focus.base.argb32.ref.png | Bin 0 -> 38310 bytes .../radial-outer-focus.base.rgb24.ref.png | Bin 0 -> 38310 bytes .../radial-outer-focus.mask.argb32.ref.png | Bin 0 -> 38310 bytes .../radial-outer-focus.mask.rgb24.ref.png | Bin 0 -> 38310 bytes .../radial-outer-focus.traps.argb32.ref.png | Bin 0 -> 38310 bytes .../radial-outer-focus.traps.rgb24.ref.png | Bin 0 -> 38310 bytes test/reference/radial-outer-focus.xfail.png | Bin 0 -> 34234 bytes test/reference/random-clip.base.argb32.ref.png | Bin 0 -> 521821 bytes test/reference/random-clip.base.argb32.xfail.png | Bin 0 -> 525726 bytes test/reference/random-clip.base.rgb24.ref.png | Bin 0 -> 521821 bytes test/reference/random-clip.base.rgb24.xfail.png | Bin 0 -> 525726 bytes test/reference/random-clip.mask.argb32.ref.png | Bin 0 -> 550190 bytes test/reference/random-clip.mask.rgb24.ref.png | Bin 0 -> 550190 bytes test/reference/random-clip.ref.png | Bin 0 -> 525010 bytes test/reference/random-clip.traps.argb32.ref.png | Bin 0 -> 523346 bytes test/reference/random-clip.traps.rgb24.ref.png | Bin 0 -> 523346 bytes ...dom-intersections-curves-eo.base.argb32.ref.png | Bin 0 -> 244476 bytes ...ndom-intersections-curves-eo.base.rgb24.ref.png | Bin 0 -> 244476 bytes .../random-intersections-curves-eo.image16.ref.png | Bin 0 -> 181565 bytes .../random-intersections-curves-eo.pdf.ref.png | Bin 0 -> 246507 bytes .../random-intersections-curves-eo.ps.ref.png | Bin 0 -> 151668 bytes .../random-intersections-curves-eo.quartz.ref.png | Bin 0 -> 326366 bytes .../random-intersections-curves-eo.ref.png | Bin 0 -> 244632 bytes ...om-intersections-curves-eo.traps.argb32.ref.png | Bin 0 -> 244476 bytes ...dom-intersections-curves-eo.traps.rgb24.ref.png | Bin 0 -> 244476 bytes ...m-intersections-curves-eo.xlib-fallback.ref.png | Bin 0 -> 244255 bytes ...dom-intersections-curves-nz.base.argb32.ref.png | Bin 0 -> 263669 bytes ...ndom-intersections-curves-nz.base.rgb24.ref.png | Bin 0 -> 263669 bytes .../random-intersections-curves-nz.image16.ref.png | Bin 0 -> 204090 bytes .../random-intersections-curves-nz.pdf.ref.png | Bin 0 -> 266977 bytes .../random-intersections-curves-nz.ps.ref.png | Bin 0 -> 134746 bytes .../random-intersections-curves-nz.quartz.ref.png | Bin 0 -> 324940 bytes .../random-intersections-curves-nz.ref.png | Bin 0 -> 264413 bytes ...om-intersections-curves-nz.traps.argb32.ref.png | Bin 0 -> 263669 bytes ...dom-intersections-curves-nz.traps.rgb24.ref.png | Bin 0 -> 263669 bytes ...m-intersections-curves-nz.xlib-fallback.ref.png | Bin 0 -> 264277 bytes .../random-intersections-eo.base.argb32.ref.png | Bin 0 -> 134729 bytes .../random-intersections-eo.base.rgb24.ref.png | Bin 0 -> 134729 bytes .../random-intersections-eo.image16.ref.png | Bin 0 -> 97747 bytes test/reference/random-intersections-eo.ps.ref.png | Bin 0 -> 78037 bytes .../random-intersections-eo.quartz.ref.png | Bin 0 -> 179179 bytes test/reference/random-intersections-eo.ref.png | Bin 0 -> 135555 bytes .../random-intersections-eo.traps.argb32.ref.png | Bin 0 -> 134729 bytes .../random-intersections-eo.traps.rgb24.ref.png | Bin 0 -> 134729 bytes ...andom-intersections-nonzero.base.argb32.ref.png | Bin 0 -> 141616 bytes ...random-intersections-nonzero.base.rgb24.ref.png | Bin 0 -> 141616 bytes .../random-intersections-nonzero.image16.ref.png | Bin 0 -> 107644 bytes .../random-intersections-nonzero.ps.ref.png | Bin 0 -> 76450 bytes .../random-intersections-nonzero.quartz.ref.png | Bin 0 -> 180871 bytes .../reference/random-intersections-nonzero.ref.png | Bin 0 -> 141737 bytes ...ndom-intersections-nonzero.traps.argb32.ref.png | Bin 0 -> 141616 bytes ...andom-intersections-nonzero.traps.rgb24.ref.png | Bin 0 -> 141616 bytes test/reference/raster-source.base.argb32.ref.png | Bin 0 -> 1209 bytes test/reference/raster-source.base.rgb24.ref.png | Bin 0 -> 1209 bytes test/reference/raster-source.ps.ref.png | Bin 0 -> 1894 bytes test/reference/raster-source.ref.png | Bin 0 -> 1209 bytes .../record-extend-none-similar.base.argb32.ref.png | Bin 0 -> 279 bytes .../record-extend-none-similar.base.rgb24.ref.png | Bin 0 -> 279 bytes test/reference/record-extend-none-similar.ref.png | Bin 0 -> 293 bytes ...record-extend-none-similar.traps.argb32.ref.png | Bin 0 -> 279 bytes .../record-extend-none-similar.traps.rgb24.ref.png | Bin 0 -> 279 bytes .../record-extend-none.base.argb32.ref.png | Bin 0 -> 293 bytes .../record-extend-none.base.rgb24.ref.png | Bin 0 -> 293 bytes test/reference/record-extend-none.ref.png | Bin 0 -> 293 bytes .../record-extend-pad-similar.base.argb32.ref.png | Bin 0 -> 283 bytes .../record-extend-pad-similar.base.rgb24.ref.png | Bin 0 -> 283 bytes test/reference/record-extend-pad-similar.ref.png | Bin 0 -> 298 bytes .../record-extend-pad-similar.traps.argb32.ref.png | Bin 0 -> 283 bytes .../record-extend-pad-similar.traps.rgb24.ref.png | Bin 0 -> 283 bytes .../record-extend-pad.base.argb32.ref.png | Bin 0 -> 298 bytes .../reference/record-extend-pad.base.rgb24.ref.png | Bin 0 -> 298 bytes test/reference/record-extend-pad.ref.png | Bin 0 -> 298 bytes ...cord-extend-reflect-similar.base.argb32.ref.png | Bin 0 -> 283 bytes ...ecord-extend-reflect-similar.base.rgb24.ref.png | Bin 0 -> 283 bytes .../record-extend-reflect-similar.ref.png | Bin 0 -> 335 bytes ...ord-extend-reflect-similar.traps.argb32.ref.png | Bin 0 -> 283 bytes ...cord-extend-reflect-similar.traps.rgb24.ref.png | Bin 0 -> 283 bytes .../record-extend-reflect.base.argb32.ref.png | Bin 0 -> 335 bytes .../record-extend-reflect.base.rgb24.ref.png | Bin 0 -> 335 bytes test/reference/record-extend-reflect.ref.png | Bin 0 -> 335 bytes ...ecord-extend-repeat-similar.base.argb32.ref.png | Bin 0 -> 283 bytes ...record-extend-repeat-similar.base.rgb24.ref.png | Bin 0 -> 283 bytes .../reference/record-extend-repeat-similar.ref.png | Bin 0 -> 286 bytes ...cord-extend-repeat-similar.traps.argb32.ref.png | Bin 0 -> 283 bytes ...ecord-extend-repeat-similar.traps.rgb24.ref.png | Bin 0 -> 283 bytes .../record-extend-repeat.base.argb32.ref.png | Bin 0 -> 286 bytes .../record-extend-repeat.base.rgb24.ref.png | Bin 0 -> 286 bytes test/reference/record-extend-repeat.ref.png | Bin 0 -> 286 bytes .../record-fill-alpha.base.argb32.ref.png | Bin 0 -> 2853 bytes .../reference/record-fill-alpha.base.rgb24.ref.png | Bin 0 -> 2853 bytes test/reference/record-fill-alpha.base.xfail.png | Bin 0 -> 2853 bytes .../record-fill-alpha.image16.rgb24.ref.png | Bin 0 -> 2232 bytes test/reference/record-fill-alpha.ref.png | Bin 0 -> 2754 bytes .../record-fill-alpha.traps.argb32.ref.png | Bin 0 -> 2824 bytes .../record-fill-alpha.traps.rgb24.ref.png | Bin 0 -> 2824 bytes test/reference/record-fill-alpha.xfail.png | Bin 0 -> 2839 bytes test/reference/record-mesh.base.argb32.ref.png | Bin 0 -> 15229 bytes test/reference/record-mesh.base.rgb24.ref.png | Bin 0 -> 15229 bytes test/reference/record-mesh.image16.rgb24.ref.png | Bin 0 -> 9027 bytes test/reference/record-mesh.ref.png | Bin 0 -> 15229 bytes ...ecord-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 337 bytes ...record-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 337 bytes .../record-paint-alpha-clip-mask.base.xfail.png | Bin 0 -> 337 bytes ...ord-paint-alpha-clip-mask.image16.rgb24.ref.png | Bin 0 -> 352 bytes .../reference/record-paint-alpha-clip-mask.ref.png | Bin 0 -> 335 bytes ...cord-paint-alpha-clip-mask.traps.argb32.ref.png | Bin 0 -> 305 bytes ...ecord-paint-alpha-clip-mask.traps.rgb24.ref.png | Bin 0 -> 305 bytes .../record-paint-alpha-clip-mask.xfail.png | Bin 0 -> 333 bytes .../record-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 299 bytes .../record-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 299 bytes .../record-paint-alpha-clip.image16.rgb24.ref.png | Bin 0 -> 313 bytes test/reference/record-paint-alpha-clip.ref.png | Bin 0 -> 290 bytes .../record-paint-alpha-clip.traps.argb32.ref.png | Bin 0 -> 269 bytes .../record-paint-alpha-clip.traps.rgb24.ref.png | Bin 0 -> 269 bytes ...cord-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 248 bytes ...ecord-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 248 bytes ...rd-paint-alpha-solid-clip.image16.rgb24.ref.png | Bin 0 -> 274 bytes .../record-paint-alpha-solid-clip.ref.png | Bin 0 -> 248 bytes ...ord-paint-alpha-solid-clip.traps.argb32.ref.png | Bin 0 -> 266 bytes ...cord-paint-alpha-solid-clip.traps.rgb24.ref.png | Bin 0 -> 266 bytes .../record-paint-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes .../record-paint-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes .../record-paint-alpha.image16.rgb24.ref.png | Bin 0 -> 253 bytes test/reference/record-paint-alpha.ref.png | Bin 0 -> 245 bytes test/reference/record-paint.base.argb32.ref.png | Bin 0 -> 93 bytes test/reference/record-paint.base.rgb24.ref.png | Bin 0 -> 93 bytes test/reference/record-paint.ref.png | Bin 0 -> 116 bytes .../record-select-font-face.base.argb32.ref.png | Bin 0 -> 1417 bytes .../record-select-font-face.base.rgb24.ref.png | Bin 0 -> 1417 bytes .../record-select-font-face.image16.rgb24.ref.png | Bin 0 -> 1236 bytes test/reference/record-select-font-face.ref.png | Bin 0 -> 2250 bytes test/reference/record-select-font-face.xfail.png | Bin 0 -> 1448 bytes .../record-self-intersecting.base.argb32.ref.png | Bin 0 -> 168 bytes .../record-self-intersecting.base.rgb24.ref.png | Bin 0 -> 168 bytes .../record-self-intersecting.image16.rgb24.ref.png | Bin 0 -> 228 bytes test/reference/record-self-intersecting.ref.png | Bin 0 -> 168 bytes .../record-text-transform.base.argb32.ref.png | Bin 0 -> 5281 bytes .../record-text-transform.base.rgb24.ref.png | Bin 0 -> 5281 bytes .../record-text-transform.image16.rgb24.ref.png | Bin 0 -> 2688 bytes test/reference/record-text-transform.ref.png | Bin 0 -> 5579 bytes .../record1414x-fill-alpha.base.argb32.ref.png | Bin 0 -> 4138 bytes .../record1414x-fill-alpha.base.rgb24.ref.png | Bin 0 -> 4138 bytes .../record1414x-fill-alpha.base.xfail.png | Bin 0 -> 4138 bytes test/reference/record1414x-fill-alpha.ref.png | Bin 0 -> 4124 bytes test/reference/record1414x-fill-alpha.xfail.png | Bin 0 -> 4216 bytes ...1414x-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 514 bytes ...d1414x-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 514 bytes .../record1414x-paint-alpha-clip-mask.ref.png | Bin 0 -> 460 bytes ...ecord1414x-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 402 bytes ...record1414x-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 402 bytes .../reference/record1414x-paint-alpha-clip.ref.png | Bin 0 -> 378 bytes ...414x-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 317 bytes ...1414x-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 317 bytes .../record1414x-paint-alpha-solid-clip.ref.png | Bin 0 -> 317 bytes .../record1414x-paint-alpha.base.argb32.ref.png | Bin 0 -> 265 bytes .../record1414x-paint-alpha.base.rgb24.ref.png | Bin 0 -> 265 bytes test/reference/record1414x-paint-alpha.ref.png | Bin 0 -> 265 bytes .../record1414x-paint.base.argb32.ref.png | Bin 0 -> 95 bytes .../reference/record1414x-paint.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/record1414x-paint.ref.png | Bin 0 -> 95 bytes ...ecord1414x-select-font-face.base.argb32.ref.png | Bin 0 -> 2018 bytes ...record1414x-select-font-face.base.rgb24.ref.png | Bin 0 -> 2018 bytes .../reference/record1414x-select-font-face.ref.png | Bin 0 -> 3177 bytes ...cord1414x-self-intersecting.base.argb32.ref.png | Bin 0 -> 385 bytes ...ecord1414x-self-intersecting.base.rgb24.ref.png | Bin 0 -> 385 bytes .../record1414x-self-intersecting.ref.png | Bin 0 -> 385 bytes .../record1414x-text-transform.base.argb32.ref.png | Bin 0 -> 8368 bytes .../record1414x-text-transform.base.rgb24.ref.png | Bin 0 -> 8368 bytes test/reference/record1414x-text-transform.ref.png | Bin 0 -> 8713 bytes .../record2x-fill-alpha.base.argb32.ref.png | Bin 0 -> 5724 bytes .../record2x-fill-alpha.base.rgb24.ref.png | Bin 0 -> 5724 bytes test/reference/record2x-fill-alpha.base.xfail.png | Bin 0 -> 5724 bytes test/reference/record2x-fill-alpha.ref.png | Bin 0 -> 5756 bytes test/reference/record2x-fill-alpha.xfail.png | Bin 0 -> 5978 bytes ...ord2x-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 501 bytes ...cord2x-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 501 bytes .../record2x-paint-alpha-clip-mask.ref.png | Bin 0 -> 483 bytes .../record2x-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 322 bytes .../record2x-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 322 bytes test/reference/record2x-paint-alpha-clip.ref.png | Bin 0 -> 322 bytes ...rd2x-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 281 bytes ...ord2x-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 281 bytes .../record2x-paint-alpha-solid-clip.ref.png | Bin 0 -> 281 bytes .../record2x-paint-alpha.base.argb32.ref.png | Bin 0 -> 291 bytes .../record2x-paint-alpha.base.rgb24.ref.png | Bin 0 -> 291 bytes test/reference/record2x-paint-alpha.ref.png | Bin 0 -> 291 bytes test/reference/record2x-paint.base.argb32.ref.png | Bin 0 -> 98 bytes test/reference/record2x-paint.base.rgb24.ref.png | Bin 0 -> 98 bytes test/reference/record2x-paint.ref.png | Bin 0 -> 98 bytes .../record2x-select-font-face.base.argb32.ref.png | Bin 0 -> 3096 bytes .../record2x-select-font-face.base.rgb24.ref.png | Bin 0 -> 3096 bytes test/reference/record2x-select-font-face.ref.png | Bin 0 -> 4407 bytes .../record2x-self-intersecting.base.argb32.ref.png | Bin 0 -> 171 bytes .../record2x-self-intersecting.base.rgb24.ref.png | Bin 0 -> 171 bytes test/reference/record2x-self-intersecting.ref.png | Bin 0 -> 171 bytes .../record2x-text-transform.base.argb32.ref.png | Bin 0 -> 13174 bytes .../record2x-text-transform.base.rgb24.ref.png | Bin 0 -> 13174 bytes test/reference/record2x-text-transform.ref.png | Bin 0 -> 13476 bytes .../record90-fill-alpha.base.argb32.ref.png | Bin 0 -> 2628 bytes .../record90-fill-alpha.base.rgb24.ref.png | Bin 0 -> 2628 bytes test/reference/record90-fill-alpha.ref.png | Bin 0 -> 2656 bytes test/reference/record90-fill-alpha.xfail.png | Bin 0 -> 2654 bytes ...ord90-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 343 bytes ...cord90-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 343 bytes .../record90-paint-alpha-clip-mask.ref.png | Bin 0 -> 317 bytes .../record90-paint-alpha-clip-mask.xfail.png | Bin 0 -> 324 bytes .../record90-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 327 bytes .../record90-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 327 bytes test/reference/record90-paint-alpha-clip.ref.png | Bin 0 -> 306 bytes test/reference/record90-paint-alpha-clip.xfail.png | Bin 0 -> 327 bytes ...rd90-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 279 bytes ...ord90-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 279 bytes .../record90-paint-alpha-solid-clip.ref.png | Bin 0 -> 293 bytes .../record90-paint-alpha.base.argb32.ref.png | Bin 0 -> 105 bytes .../record90-paint-alpha.base.rgb24.ref.png | Bin 0 -> 105 bytes test/reference/record90-paint-alpha.ref.png | Bin 0 -> 105 bytes test/reference/record90-paint.base.argb32.ref.png | Bin 0 -> 93 bytes test/reference/record90-paint.base.rgb24.ref.png | Bin 0 -> 93 bytes test/reference/record90-paint.ref.png | Bin 0 -> 93 bytes .../record90-select-font-face.base.argb32.ref.png | Bin 0 -> 1480 bytes .../record90-select-font-face.base.rgb24.ref.png | Bin 0 -> 1480 bytes test/reference/record90-select-font-face.ref.png | Bin 0 -> 2272 bytes .../record90-self-intersecting.base.argb32.ref.png | Bin 0 -> 208 bytes .../record90-self-intersecting.base.rgb24.ref.png | Bin 0 -> 208 bytes test/reference/record90-self-intersecting.ref.png | Bin 0 -> 240 bytes .../record90-text-transform.base.argb32.ref.png | Bin 0 -> 5481 bytes .../record90-text-transform.base.rgb24.ref.png | Bin 0 -> 5481 bytes test/reference/record90-text-transform.ref.png | Bin 0 -> 5811 bytes test/reference/recordflip-fill-alpha.ref.png | Bin 0 -> 2803 bytes .../recordflip-paint-alpha-clip-mask.ref.png | Bin 0 -> 351 bytes test/reference/recordflip-paint-alpha-clip.ref.png | Bin 0 -> 316 bytes .../recordflip-paint-alpha-solid-clip.ref.png | Bin 0 -> 291 bytes test/reference/recordflip-paint-alpha.ref.png | Bin 0 -> 257 bytes test/reference/recordflip-paint.ref.png | Bin 0 -> 93 bytes test/reference/recordflip-select-font-face.ref.png | Bin 0 -> 2240 bytes .../reference/recordflip-self-intersecting.ref.png | Bin 0 -> 168 bytes test/reference/recordflip-text-transform.ref.png | Bin 0 -> 5609 bytes test/reference/recordflip-whole-fill-alpha.ref.png | Bin 0 -> 2803 bytes .../recordflip-whole-paint-alpha-clip-mask.ref.png | Bin 0 -> 351 bytes .../recordflip-whole-paint-alpha-clip.ref.png | Bin 0 -> 316 bytes ...recordflip-whole-paint-alpha-solid-clip.ref.png | Bin 0 -> 291 bytes .../reference/recordflip-whole-paint-alpha.ref.png | Bin 0 -> 257 bytes test/reference/recordflip-whole-paint.ref.png | Bin 0 -> 93 bytes .../recordflip-whole-select-font-face.ref.png | Bin 0 -> 2240 bytes .../recordflip-whole-self-intersecting.ref.png | Bin 0 -> 168 bytes .../recordflip-whole-text-transform.ref.png | Bin 0 -> 5609 bytes .../recording-surface-extend-none.argb32.ref.png | Bin 0 -> 3670 bytes ...cording-surface-extend-none.base.argb32.ref.png | Bin 0 -> 3055 bytes ...ecording-surface-extend-none.base.rgb24.ref.png | Bin 0 -> 3124 bytes .../recording-surface-extend-none.rgb24.ref.png | Bin 0 -> 3741 bytes ...ording-surface-extend-none.traps.argb32.ref.png | Bin 0 -> 3055 bytes ...cording-surface-extend-none.traps.rgb24.ref.png | Bin 0 -> 3124 bytes .../recording-surface-extend-pad.argb32.ref.png | Bin 0 -> 12932 bytes ...ecording-surface-extend-pad.base.argb32.ref.png | Bin 0 -> 10832 bytes ...recording-surface-extend-pad.base.rgb24.ref.png | Bin 0 -> 12496 bytes .../recording-surface-extend-pad.rgb24.ref.png | Bin 0 -> 13581 bytes ...cording-surface-extend-pad.traps.argb32.ref.png | Bin 0 -> 10832 bytes ...ecording-surface-extend-pad.traps.rgb24.ref.png | Bin 0 -> 12496 bytes ...recording-surface-extend-reflect.argb32.ref.png | Bin 0 -> 28910 bytes ...ding-surface-extend-reflect.base.argb32.ref.png | Bin 0 -> 23617 bytes ...rding-surface-extend-reflect.base.rgb24.ref.png | Bin 0 -> 24139 bytes .../recording-surface-extend-reflect.rgb24.ref.png | Bin 0 -> 25588 bytes ...ing-surface-extend-reflect.traps.argb32.ref.png | Bin 0 -> 23617 bytes ...ding-surface-extend-reflect.traps.rgb24.ref.png | Bin 0 -> 24139 bytes .../recording-surface-extend-repeat.argb32.ref.png | Bin 0 -> 29648 bytes ...rding-surface-extend-repeat.base.argb32.ref.png | Bin 0 -> 24112 bytes ...ording-surface-extend-repeat.base.rgb24.ref.png | Bin 0 -> 24029 bytes .../recording-surface-extend-repeat.rgb24.ref.png | Bin 0 -> 25337 bytes ...ding-surface-extend-repeat.traps.argb32.ref.png | Bin 0 -> 24112 bytes ...rding-surface-extend-repeat.traps.rgb24.ref.png | Bin 0 -> 24029 bytes .../recording-surface-over.argb32.ref.png | Bin 0 -> 3670 bytes .../recording-surface-over.base.argb32.ref.png | Bin 0 -> 3055 bytes .../recording-surface-over.base.rgb24.ref.png | Bin 0 -> 3124 bytes .../recording-surface-over.gl.argb32.ref.png | Bin 0 -> 3130 bytes .../recording-surface-over.image16.ref.png | Bin 0 -> 2856 bytes .../recording-surface-over.pdf.argb32.ref.png | Bin 0 -> 3908 bytes .../recording-surface-over.pdf.rgb24.ref.png | Bin 0 -> 3760 bytes .../recording-surface-over.ps.argb32.ref.png | Bin 0 -> 3064 bytes .../recording-surface-over.ps.rgb24.ref.png | Bin 0 -> 3147 bytes .../recording-surface-over.quartz.argb32.ref.png | Bin 0 -> 4570 bytes .../recording-surface-over.quartz.rgb24.ref.png | Bin 0 -> 4058 bytes .../reference/recording-surface-over.rgb24.ref.png | Bin 0 -> 3741 bytes .../recording-surface-over.svg.argb32.ref.png | Bin 0 -> 3778 bytes .../recording-surface-over.svg.rgb24.ref.png | Bin 0 -> 3760 bytes .../recording-surface-over.traps.argb32.ref.png | Bin 0 -> 3055 bytes .../recording-surface-over.traps.rgb24.ref.png | Bin 0 -> 3124 bytes .../recording-surface-source.argb32.ref.png | Bin 0 -> 3688 bytes .../recording-surface-source.base.argb32.ref.png | Bin 0 -> 3049 bytes .../recording-surface-source.base.rgb24.ref.png | Bin 0 -> 3121 bytes .../recording-surface-source.rgb24.ref.png | Bin 0 -> 3738 bytes .../recording-surface-source.traps.argb32.ref.png | Bin 0 -> 3049 bytes .../recording-surface-source.traps.rgb24.ref.png | Bin 0 -> 3121 bytes .../rectangle-rounding-error.base.argb32.ref.png | Bin 0 -> 212 bytes .../rectangle-rounding-error.base.rgb24.ref.png | Bin 0 -> 212 bytes test/reference/rectangle-rounding-error.ref.png | Bin 0 -> 231 bytes .../rectilinear-dash-scale-unaligned.ref.png | Bin 0 -> 3738 bytes .../rectilinear-dash-scale-unaligned.traps.ref.png | Bin 0 -> 3289 bytes test/reference/rectilinear-dash-scale.ref.png | Bin 0 -> 651 bytes .../reference/rectilinear-dash.base.argb32.ref.png | Bin 0 -> 291 bytes test/reference/rectilinear-dash.base.rgb24.ref.png | Bin 0 -> 291 bytes .../reference/rectilinear-dash.mask.argb32.ref.png | Bin 0 -> 291 bytes test/reference/rectilinear-dash.mask.rgb24.ref.png | Bin 0 -> 291 bytes test/reference/rectilinear-dash.quartz.xfail.png | Bin 0 -> 494 bytes test/reference/rectilinear-dash.ref.png | Bin 0 -> 291 bytes .../rectilinear-dash.traps.argb32.ref.png | Bin 0 -> 291 bytes .../reference/rectilinear-dash.traps.rgb24.ref.png | Bin 0 -> 291 bytes .../reference/rectilinear-fill.base.argb32.ref.png | Bin 0 -> 151 bytes test/reference/rectilinear-fill.base.rgb24.ref.png | Bin 0 -> 151 bytes test/reference/rectilinear-fill.ref.png | Bin 0 -> 162 bytes .../reference/rectilinear-grid.base.argb32.ref.png | Bin 0 -> 610 bytes test/reference/rectilinear-grid.base.rgb24.ref.png | Bin 0 -> 610 bytes test/reference/rectilinear-grid.image16.ref.png | Bin 0 -> 638 bytes test/reference/rectilinear-grid.ref.png | Bin 0 -> 569 bytes .../rectilinear-grid.traps.argb32.ref.png | Bin 0 -> 610 bytes .../reference/rectilinear-grid.traps.rgb24.ref.png | Bin 0 -> 610 bytes .../rectilinear-miter-limit.base.argb32.ref.png | Bin 0 -> 145 bytes .../rectilinear-miter-limit.base.rgb24.ref.png | Bin 0 -> 145 bytes test/reference/rectilinear-miter-limit.ps2.ref.png | Bin 0 -> 221 bytes test/reference/rectilinear-miter-limit.ps3.ref.png | Bin 0 -> 221 bytes test/reference/rectilinear-miter-limit.ref.png | Bin 0 -> 145 bytes .../rectilinear-miter-limit.traps.argb32.ref.png | Bin 0 -> 145 bytes .../rectilinear-miter-limit.traps.rgb24.ref.png | Bin 0 -> 145 bytes .../rectilinear-stroke.base.argb32.ref.png | Bin 0 -> 172 bytes .../rectilinear-stroke.base.rgb24.ref.png | Bin 0 -> 172 bytes test/reference/rectilinear-stroke.quartz.xfail.png | Bin 0 -> 209 bytes test/reference/rectilinear-stroke.ref.png | Bin 0 -> 213 bytes .../reference/reflected-stroke.base.argb32.ref.png | Bin 0 -> 5053 bytes test/reference/reflected-stroke.base.rgb24.ref.png | Bin 0 -> 5053 bytes test/reference/reflected-stroke.image16.ref.png | Bin 0 -> 4254 bytes .../reference/reflected-stroke.mask.argb32.ref.png | Bin 0 -> 5119 bytes test/reference/reflected-stroke.mask.rgb24.ref.png | Bin 0 -> 5119 bytes test/reference/reflected-stroke.ps.ref.png | Bin 0 -> 3368 bytes test/reference/reflected-stroke.ref.png | Bin 0 -> 5116 bytes .../reflected-stroke.traps.argb32.ref.png | Bin 0 -> 5053 bytes .../reference/reflected-stroke.traps.rgb24.ref.png | Bin 0 -> 5053 bytes test/reference/rel-path.base.argb32.ref.png | Bin 0 -> 189 bytes test/reference/rel-path.base.rgb24.ref.png | Bin 0 -> 206 bytes test/reference/rel-path.mask.rgb24.ref.png | Bin 0 -> 216 bytes test/reference/rel-path.ps2.rgb24.ref.png | Bin 0 -> 243 bytes test/reference/rel-path.ps3.rgb24.ref.png | Bin 0 -> 243 bytes test/reference/rel-path.ref.png | Bin 0 -> 197 bytes test/reference/rel-path.traps.argb32.ref.png | Bin 0 -> 189 bytes test/reference/rel-path.traps.rgb24.ref.png | Bin 0 -> 206 bytes .../rgb24-ignore-alpha.base.argb32.ref.png | Bin 0 -> 97 bytes .../rgb24-ignore-alpha.base.rgb24.ref.png | Bin 0 -> 97 bytes test/reference/rgb24-ignore-alpha.ref.png | Bin 0 -> 116 bytes ...te-clip-image-surface-paint.base.argb32.ref.png | Bin 0 -> 331 bytes ...ate-clip-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 331 bytes .../rotate-clip-image-surface-paint.ref.png | Bin 0 -> 332 bytes ...e-clip-image-surface-paint.traps.argb32.ref.png | Bin 0 -> 303 bytes ...te-clip-image-surface-paint.traps.rgb24.ref.png | Bin 0 -> 303 bytes ...image-surface-paint.xlib-fallback.rgb24.ref.png | Bin 0 -> 303 bytes ...p-image-surface-paint.xlib-window.rgb24.ref.png | Bin 0 -> 303 bytes .../rotate-clip.surface-paint.image.argb32.ref.png | Bin 0 -> 340 bytes .../rotate-clip.surface-paint.image.rgb24.ref.png | Bin 0 -> 340 bytes .../rotate-image-surface-paint.base.argb32.ref.png | Bin 0 -> 220 bytes .../rotate-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 220 bytes .../rotate-image-surface-paint.pdf.xfail.png | Bin 0 -> 442 bytes .../rotate-image-surface-paint.ps.ref.png | Bin 0 -> 236 bytes .../rotate-image-surface-paint.quartz.ref.png | Bin 0 -> 223 bytes test/reference/rotate-image-surface-paint.ref.png | Bin 0 -> 220 bytes .../rotate-image-surface-paint.svg.ref.png | Bin 0 -> 209 bytes .../rotate-image-surface-paint.svg.xfail.png | Bin 0 -> 387 bytes test/reference/rotate-stroke-box.ref.png | Bin 0 -> 150 bytes test/reference/rotated-clip.base.argb32.ref.png | Bin 0 -> 3912 bytes test/reference/rotated-clip.base.rgb24.ref.png | Bin 0 -> 3912 bytes test/reference/rotated-clip.image16.ref.png | Bin 0 -> 3336 bytes test/reference/rotated-clip.mask.argb32.ref.png | Bin 0 -> 3697 bytes test/reference/rotated-clip.mask.rgb24.ref.png | Bin 0 -> 3697 bytes test/reference/rotated-clip.ps.ref.png | Bin 0 -> 3378 bytes test/reference/rotated-clip.quartz.ref.png | Bin 0 -> 3923 bytes test/reference/rotated-clip.ref.png | Bin 0 -> 3834 bytes test/reference/rotated-clip.traps.argb32.ref.png | Bin 0 -> 3922 bytes test/reference/rotated-clip.traps.rgb24.ref.png | Bin 0 -> 3922 bytes .../rounded-rectangle-fill.base.argb32.ref.png | Bin 0 -> 890 bytes .../rounded-rectangle-fill.base.rgb24.ref.png | Bin 0 -> 890 bytes .../rounded-rectangle-fill.image16.ref.png | Bin 0 -> 730 bytes test/reference/rounded-rectangle-fill.ps.ref.png | Bin 0 -> 551 bytes .../rounded-rectangle-fill.quartz.ref.png | Bin 0 -> 684 bytes test/reference/rounded-rectangle-fill.ref.png | Bin 0 -> 872 bytes .../rounded-rectangle-fill.traps.argb32.ref.png | Bin 0 -> 890 bytes .../rounded-rectangle-fill.traps.rgb24.ref.png | Bin 0 -> 890 bytes .../rounded-rectangle-stroke.base.argb32.ref.png | Bin 0 -> 856 bytes .../rounded-rectangle-stroke.base.rgb24.ref.png | Bin 0 -> 856 bytes .../rounded-rectangle-stroke.image16.ref.png | Bin 0 -> 732 bytes .../rounded-rectangle-stroke.mask.argb32.ref.png | Bin 0 -> 951 bytes .../rounded-rectangle-stroke.mask.rgb24.ref.png | Bin 0 -> 951 bytes test/reference/rounded-rectangle-stroke.ps.ref.png | Bin 0 -> 568 bytes test/reference/rounded-rectangle-stroke.ref.png | Bin 0 -> 872 bytes .../rounded-rectangle-stroke.traps.argb32.ref.png | Bin 0 -> 856 bytes .../rounded-rectangle-stroke.traps.rgb24.ref.png | Bin 0 -> 856 bytes test/reference/sample-diagonal.ref.png | Bin 0 -> 272 bytes test/reference/sample-horizontal.ref.png | Bin 0 -> 209 bytes test/reference/sample-vertical.ref.png | Bin 0 -> 209 bytes ...e-down-source-surface-paint.base.argb32.ref.png | Bin 0 -> 96 bytes ...le-down-source-surface-paint.base.rgb24.ref.png | Bin 0 -> 96 bytes .../scale-down-source-surface-paint.ref.png | Bin 0 -> 133 bytes .../scale-offset-image.base.argb32.ref.png | Bin 0 -> 9048 bytes .../scale-offset-image.base.rgb24.ref.png | Bin 0 -> 9048 bytes test/reference/scale-offset-image.gl.ref.png | Bin 0 -> 9197 bytes test/reference/scale-offset-image.image16.ref.png | Bin 0 -> 7793 bytes .../scale-offset-image.pdf.argb32.ref.png | Bin 0 -> 7643 bytes .../reference/scale-offset-image.pdf.rgb24.ref.png | Bin 0 -> 7643 bytes test/reference/scale-offset-image.ps.ref.png | Bin 0 -> 7697 bytes test/reference/scale-offset-image.quartz.ref.png | Bin 0 -> 8977 bytes test/reference/scale-offset-image.ref.png | Bin 0 -> 9748 bytes test/reference/scale-offset-image.script.xfail.png | Bin 0 -> 9963 bytes .../scale-offset-image.traps.argb32.ref.png | Bin 0 -> 9048 bytes .../scale-offset-image.traps.rgb24.ref.png | Bin 0 -> 9048 bytes test/reference/scale-offset-image.xfail.png | Bin 0 -> 9961 bytes .../scale-offset-image.xlib-fallback.xfail.png | Bin 0 -> 8686 bytes .../scale-offset-similar.base.argb32.ref.png | Bin 0 -> 9048 bytes .../scale-offset-similar.base.rgb24.ref.png | Bin 0 -> 9048 bytes test/reference/scale-offset-similar.gl.ref.png | Bin 0 -> 9197 bytes .../reference/scale-offset-similar.image16.ref.png | Bin 0 -> 7793 bytes .../scale-offset-similar.pdf.argb32.ref.png | Bin 0 -> 8419 bytes .../scale-offset-similar.pdf.rgb24.ref.png | Bin 0 -> 8419 bytes test/reference/scale-offset-similar.ps.ref.png | Bin 0 -> 6850 bytes test/reference/scale-offset-similar.quartz.ref.png | Bin 0 -> 8977 bytes .../scale-offset-similar.recording.xfail.png | Bin 0 -> 10752 bytes test/reference/scale-offset-similar.ref.png | Bin 0 -> 9779 bytes .../scale-offset-similar.script.xfail.png | Bin 0 -> 9963 bytes .../scale-offset-similar.traps.argb32.ref.png | Bin 0 -> 9048 bytes .../scale-offset-similar.traps.rgb24.ref.png | Bin 0 -> 9048 bytes test/reference/scale-offset-similar.xfail.png | Bin 0 -> 9961 bytes .../scale-offset-similar.xlib-fallback.xfail.png | Bin 0 -> 8686 bytes test/reference/scale-offset-similar.xlib.xfail.png | Bin 0 -> 8698 bytes .../scale-offset-xlib-fallback.rgb24.ref.png | Bin 0 -> 9120 bytes .../scale-offset-xlib-window.rgb24.ref.png | Bin 0 -> 9120 bytes test/reference/scale-offset-xlib.ref.png | Bin 0 -> 9120 bytes test/reference/scale-offset.image.argb32.ref.png | Bin 0 -> 9847 bytes test/reference/scale-offset.image.rgb24.ref.png | Bin 0 -> 9847 bytes .../scale-source-surface-paint.base.argb32.ref.png | Bin 0 -> 128 bytes .../scale-source-surface-paint.base.rgb24.ref.png | Bin 0 -> 117 bytes ...scale-source-surface-paint.pdf.argb32.xfail.png | Bin 0 -> 157 bytes .../scale-source-surface-paint.pdf.rgb24.xfail.png | Bin 0 -> 152 bytes test/reference/scale-source-surface-paint.ref.png | Bin 0 -> 147 bytes ...scale-source-surface-paint.svg.argb32.xfail.png | Bin 0 -> 229 bytes .../scale-source-surface-paint.svg.rgb24.xfail.png | Bin 0 -> 222 bytes .../reference/select-font-face.base.argb32.ref.png | Bin 0 -> 2250 bytes test/reference/select-font-face.base.rgb24.ref.png | Bin 0 -> 2250 bytes test/reference/select-font-face.image16.ref.png | Bin 0 -> 1962 bytes test/reference/select-font-face.ps2.ref.png | Bin 0 -> 959 bytes test/reference/select-font-face.ps3.ref.png | Bin 0 -> 959 bytes test/reference/select-font-face.quartz.ref.png | Bin 0 -> 2645 bytes test/reference/select-font-face.ref.png | Bin 0 -> 2250 bytes test/reference/select-font-face.traps.ref.png | Bin 0 -> 2250 bytes .../self-copy-overlap.base.argb32.ref.png | Bin 0 -> 1140 bytes .../reference/self-copy-overlap.base.rgb24.ref.png | Bin 0 -> 213 bytes .../self-copy-overlap.mask.argb32.ref.png | Bin 0 -> 1140 bytes .../reference/self-copy-overlap.mask.rgb24.ref.png | Bin 0 -> 213 bytes .../self-copy-overlap.traps.argb32.ref.png | Bin 0 -> 1140 bytes .../self-copy-overlap.traps.rgb24.ref.png | Bin 0 -> 213 bytes test/reference/self-copy.base.argb32.ref.png | Bin 0 -> 257 bytes test/reference/self-copy.base.rgb24.ref.png | Bin 0 -> 257 bytes test/reference/self-copy.ps2.ref.png | Bin 0 -> 335 bytes test/reference/self-copy.ps3.ref.png | Bin 0 -> 335 bytes test/reference/self-copy.ref.png | Bin 0 -> 257 bytes test/reference/self-copy.traps.argb32.ref.png | Bin 0 -> 257 bytes test/reference/self-copy.traps.rgb24.ref.png | Bin 0 -> 257 bytes .../self-intersecting.base.argb32.ref.png | Bin 0 -> 208 bytes .../reference/self-intersecting.base.rgb24.ref.png | Bin 0 -> 208 bytes test/reference/self-intersecting.ps.ref.png | Bin 0 -> 186 bytes test/reference/self-intersecting.quartz.xfail.png | Bin 0 -> 233 bytes test/reference/self-intersecting.ref.png | Bin 0 -> 168 bytes .../self-intersecting.traps.argb32.ref.png | Bin 0 -> 208 bytes .../self-intersecting.traps.rgb24.ref.png | Bin 0 -> 208 bytes test/reference/set-source.base.argb32.ref.png | Bin 0 -> 101 bytes test/reference/set-source.base.rgb24.ref.png | Bin 0 -> 101 bytes test/reference/set-source.ref.png | Bin 0 -> 120 bytes .../shape-general-convex.base.argb32.ref.png | Bin 0 -> 2532 bytes .../shape-general-convex.base.rgb24.ref.png | Bin 0 -> 2532 bytes test/reference/shape-general-convex.ps.ref.png | Bin 0 -> 1632 bytes test/reference/shape-general-convex.ref.png | Bin 0 -> 2539 bytes .../shape-general-convex.traps.argb32.ref.png | Bin 0 -> 2532 bytes .../shape-general-convex.traps.rgb24.ref.png | Bin 0 -> 2532 bytes .../reference/shape-sierpinski.base.argb32.ref.png | Bin 0 -> 54485 bytes test/reference/shape-sierpinski.base.rgb24.ref.png | Bin 0 -> 54485 bytes test/reference/shape-sierpinski.pdf.argb32.ref.png | Bin 0 -> 39520 bytes test/reference/shape-sierpinski.pdf.rgb24.ref.png | Bin 0 -> 39520 bytes test/reference/shape-sierpinski.ps.ref.png | Bin 0 -> 39965 bytes test/reference/shape-sierpinski.ps3.argb32.ref.png | Bin 0 -> 39965 bytes test/reference/shape-sierpinski.ps3.rgb24.ref.png | Bin 0 -> 39965 bytes test/reference/shape-sierpinski.ref.png | Bin 0 -> 54850 bytes .../shape-sierpinski.traps.argb32.ref.png | Bin 0 -> 54485 bytes .../reference/shape-sierpinski.traps.rgb24.ref.png | Bin 0 -> 54485 bytes .../show-glyphs-advance.base.argb32.ref.png | Bin 0 -> 1394 bytes .../show-glyphs-advance.base.rgb24.ref.png | Bin 0 -> 1394 bytes test/reference/show-glyphs-advance.image16.ref.png | Bin 0 -> 1270 bytes test/reference/show-glyphs-advance.ps.ref.png | Bin 0 -> 901 bytes test/reference/show-glyphs-advance.quartz.ref.png | Bin 0 -> 1464 bytes test/reference/show-glyphs-advance.ref.png | Bin 0 -> 1394 bytes test/reference/show-glyphs-advance.svg.ref.png | Bin 0 -> 1435 bytes test/reference/show-glyphs-advance.traps.ref.png | Bin 0 -> 1394 bytes .../reference/show-glyphs-many.base.argb32.ref.png | Bin 0 -> 96 bytes test/reference/show-glyphs-many.base.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/show-glyphs-many.ref.png | Bin 0 -> 118 bytes .../show-text-current-point.base.argb32.ref.png | Bin 0 -> 2151 bytes .../show-text-current-point.base.rgb24.ref.png | Bin 0 -> 2151 bytes .../show-text-current-point.image16.ref.png | Bin 0 -> 1932 bytes test/reference/show-text-current-point.ps2.ref.png | Bin 0 -> 1356 bytes test/reference/show-text-current-point.ps3.ref.png | Bin 0 -> 1356 bytes .../show-text-current-point.quartz.ref.png | Bin 0 -> 2773 bytes test/reference/show-text-current-point.ref.png | Bin 0 -> 2151 bytes .../show-text-current-point.traps.ref.png | Bin 0 -> 2151 bytes test/reference/simple-edge.ref.png | Bin 0 -> 1922 bytes test/reference/simple-edge.xfail.png | Bin 0 -> 2124 bytes test/reference/skew-extreme.base.argb32.ref.png | Bin 0 -> 935 bytes test/reference/skew-extreme.base.rgb24.ref.png | Bin 0 -> 935 bytes test/reference/skew-extreme.ps2.ref.png | Bin 0 -> 1048 bytes test/reference/skew-extreme.ps3.ref.png | Bin 0 -> 1048 bytes test/reference/skew-extreme.ref.png | Bin 0 -> 944 bytes test/reference/skew-extreme.traps.argb32.ref.png | Bin 0 -> 935 bytes test/reference/skew-extreme.traps.rgb24.ref.png | Bin 0 -> 935 bytes test/reference/smask-fill.base.argb32.ref.png | Bin 0 -> 1170 bytes test/reference/smask-fill.base.rgb24.ref.png | Bin 0 -> 1170 bytes test/reference/smask-fill.image16.ref.png | Bin 0 -> 925 bytes test/reference/smask-fill.pdf.ref.png | Bin 0 -> 1105 bytes test/reference/smask-fill.quartz.ref.png | Bin 0 -> 2076 bytes test/reference/smask-fill.ref.png | Bin 0 -> 1185 bytes test/reference/smask-fill.svg.ref.png | Bin 0 -> 1150 bytes test/reference/smask-fill.traps.argb32.ref.png | Bin 0 -> 1170 bytes test/reference/smask-fill.traps.rgb24.ref.png | Bin 0 -> 1170 bytes .../reference/smask-image-mask.base.argb32.ref.png | Bin 0 -> 619 bytes test/reference/smask-image-mask.base.rgb24.ref.png | Bin 0 -> 619 bytes test/reference/smask-image-mask.pdf.ref.png | Bin 0 -> 615 bytes test/reference/smask-image-mask.ref.png | Bin 0 -> 619 bytes test/reference/smask-mask.base.argb32.ref.png | Bin 0 -> 2353 bytes test/reference/smask-mask.base.rgb24.ref.png | Bin 0 -> 2353 bytes test/reference/smask-mask.image16.ref.png | Bin 0 -> 1358 bytes test/reference/smask-mask.pdf.ref.png | Bin 0 -> 2308 bytes test/reference/smask-mask.quartz.ref.png | Bin 0 -> 3191 bytes test/reference/smask-mask.ref.png | Bin 0 -> 2353 bytes test/reference/smask-mask.svg.ref.png | Bin 0 -> 2376 bytes test/reference/smask-paint.base.argb32.ref.png | Bin 0 -> 2469 bytes test/reference/smask-paint.base.rgb24.ref.png | Bin 0 -> 2469 bytes test/reference/smask-paint.image16.ref.png | Bin 0 -> 1469 bytes test/reference/smask-paint.pdf.ref.png | Bin 0 -> 2431 bytes test/reference/smask-paint.quartz.ref.png | Bin 0 -> 3311 bytes test/reference/smask-paint.ref.png | Bin 0 -> 2469 bytes test/reference/smask-paint.svg.ref.png | Bin 0 -> 2453 bytes test/reference/smask-stroke.base.argb32.ref.png | Bin 0 -> 1703 bytes test/reference/smask-stroke.base.rgb24.ref.png | Bin 0 -> 1703 bytes test/reference/smask-stroke.image16.ref.png | Bin 0 -> 1330 bytes test/reference/smask-stroke.pdf.xfail.png | Bin 0 -> 392 bytes test/reference/smask-stroke.quartz.ref.png | Bin 0 -> 1697 bytes test/reference/smask-stroke.ref.png | Bin 0 -> 1701 bytes test/reference/smask-stroke.traps.argb32.ref.png | Bin 0 -> 1703 bytes test/reference/smask-stroke.traps.rgb24.ref.png | Bin 0 -> 1703 bytes test/reference/smask-text.base.argb32.ref.png | Bin 0 -> 1660 bytes test/reference/smask-text.base.rgb24.ref.png | Bin 0 -> 1660 bytes test/reference/smask-text.image16.ref.png | Bin 0 -> 1206 bytes test/reference/smask-text.mask.argb32.ref.png | Bin 0 -> 1660 bytes test/reference/smask-text.mask.rgb24.ref.png | Bin 0 -> 1660 bytes test/reference/smask-text.pdf.ref.png | Bin 0 -> 1874 bytes test/reference/smask-text.ps2.ref.png | Bin 0 -> 2023 bytes test/reference/smask-text.ps3.ref.png | Bin 0 -> 2023 bytes test/reference/smask-text.quartz.ref.png | Bin 0 -> 1904 bytes test/reference/smask-text.ref.png | Bin 0 -> 1661 bytes test/reference/smask-text.script.ref.png | Bin 0 -> 1663 bytes test/reference/smask-text.svg.ref.png | Bin 0 -> 1794 bytes test/reference/smask-text.traps.ref.png | Bin 0 -> 1661 bytes test/reference/smask-text.xlib-fallback.ref.png | Bin 0 -> 1874 bytes test/reference/smask.base.argb32.ref.png | Bin 0 -> 3393 bytes test/reference/smask.base.rgb24.ref.png | Bin 0 -> 3393 bytes test/reference/smask.image16.ref.png | Bin 0 -> 2213 bytes test/reference/smask.mask.argb32.ref.png | Bin 0 -> 3413 bytes test/reference/smask.mask.rgb24.ref.png | Bin 0 -> 3413 bytes test/reference/smask.pdf.xfail.png | Bin 0 -> 2848 bytes test/reference/smask.ps.ref.png | Bin 0 -> 3430 bytes test/reference/smask.quartz.ref.png | Bin 0 -> 4031 bytes test/reference/smask.ref.png | Bin 0 -> 3422 bytes test/reference/smask.script.ref.png | Bin 0 -> 3396 bytes test/reference/smask.svg.ref.png | Bin 0 -> 3457 bytes test/reference/smask.traps.ref.png | Bin 0 -> 3393 bytes test/reference/smask.xlib-fallback.ref.png | Bin 0 -> 3423 bytes .../solid-pattern-cache-stress.base.argb32.ref.png | Bin 0 -> 87 bytes .../solid-pattern-cache-stress.base.rgb24.ref.png | Bin 0 -> 87 bytes test/reference/solid-pattern-cache-stress.ref.png | Bin 0 -> 107 bytes .../source-clip-scale.base.argb32.ref.png | Bin 0 -> 136 bytes .../reference/source-clip-scale.base.rgb24.ref.png | Bin 0 -> 136 bytes test/reference/source-clip-scale.gl.ref.png | Bin 0 -> 164 bytes test/reference/source-clip-scale.pdf.ref.png | Bin 0 -> 113 bytes .../reference/source-clip-scale.ps2.argb32.ref.png | Bin 0 -> 183 bytes test/reference/source-clip-scale.ps2.rgb24.ref.png | Bin 0 -> 183 bytes .../reference/source-clip-scale.ps3.argb32.ref.png | Bin 0 -> 183 bytes test/reference/source-clip-scale.ps3.rgb24.ref.png | Bin 0 -> 183 bytes test/reference/source-clip-scale.quartz.ref.png | Bin 0 -> 126 bytes test/reference/source-clip-scale.recording.ref.png | Bin 0 -> 116 bytes test/reference/source-clip-scale.ref.png | Bin 0 -> 161 bytes test/reference/source-clip-scale.svg.ref.png | Bin 0 -> 116 bytes test/reference/source-clip.base.argb32.ref.png | Bin 0 -> 111 bytes test/reference/source-clip.base.rgb24.ref.png | Bin 0 -> 111 bytes test/reference/source-clip.ref.png | Bin 0 -> 133 bytes .../source-surface-scale-paint.base.argb32.ref.png | Bin 0 -> 120 bytes .../source-surface-scale-paint.base.rgb24.ref.png | Bin 0 -> 114 bytes test/reference/source-surface-scale-paint.ref.png | Bin 0 -> 139 bytes .../spline-decomposition.base.argb32.ref.png | Bin 0 -> 19089 bytes .../spline-decomposition.base.rgb24.ref.png | Bin 0 -> 19089 bytes .../reference/spline-decomposition.image16.ref.png | Bin 0 -> 14064 bytes test/reference/spline-decomposition.pdf.ref.png | Bin 0 -> 19540 bytes test/reference/spline-decomposition.ps.ref.png | Bin 0 -> 8939 bytes .../spline-decomposition.quartz.xfail.png | Bin 0 -> 19560 bytes test/reference/spline-decomposition.ref.png | Bin 0 -> 19578 bytes test/reference/spline-decomposition.svg.ref.png | Bin 0 -> 19540 bytes .../spline-decomposition.traps.argb32.ref.png | Bin 0 -> 19089 bytes .../spline-decomposition.traps.rgb24.ref.png | Bin 0 -> 19089 bytes test/reference/stride-12-image.base.argb32.ref.png | Bin 0 -> 81121 bytes test/reference/stride-12-image.base.rgb24.ref.png | Bin 0 -> 81121 bytes test/reference/stride-12-image.image16.ref.png | Bin 0 -> 61197 bytes test/reference/stride-12-image.ps.ref.png | Bin 0 -> 77159 bytes test/reference/stride-12-image.ref.png | Bin 0 -> 81121 bytes .../stride-12-xlib-fallback.rgb24.ref.png | Bin 0 -> 81121 bytes test/reference/stride-12-xlib-window.rgb24.ref.png | Bin 0 -> 81121 bytes test/reference/stride-12-xlib.ref.png | Bin 0 -> 81121 bytes test/reference/stroke-clipped.ref.png | Bin 0 -> 5845 bytes test/reference/stroke-ctm-caps.base.argb32.ref.png | Bin 0 -> 835 bytes test/reference/stroke-ctm-caps.base.rgb24.ref.png | Bin 0 -> 835 bytes test/reference/stroke-ctm-caps.image16.ref.png | Bin 0 -> 908 bytes test/reference/stroke-ctm-caps.mask.argb32.ref.png | Bin 0 -> 942 bytes test/reference/stroke-ctm-caps.mask.rgb24.ref.png | Bin 0 -> 942 bytes test/reference/stroke-ctm-caps.ps2.ref.png | Bin 0 -> 1079 bytes test/reference/stroke-ctm-caps.ps3.ref.png | Bin 0 -> 1079 bytes test/reference/stroke-ctm-caps.quartz.ref.png | Bin 0 -> 899 bytes test/reference/stroke-ctm-caps.ref.png | Bin 0 -> 896 bytes .../reference/stroke-ctm-caps.traps.argb32.ref.png | Bin 0 -> 835 bytes test/reference/stroke-ctm-caps.traps.rgb24.ref.png | Bin 0 -> 835 bytes test/reference/stroke-image.base.argb32.ref.png | Bin 0 -> 1467 bytes test/reference/stroke-image.base.rgb24.ref.png | Bin 0 -> 1467 bytes test/reference/stroke-image.image16.ref.png | Bin 0 -> 1167 bytes test/reference/stroke-image.pdf.ref.png | Bin 0 -> 1006 bytes test/reference/stroke-image.ps.ref.png | Bin 0 -> 1535 bytes test/reference/stroke-image.quartz.ref.png | Bin 0 -> 1350 bytes test/reference/stroke-image.ref.png | Bin 0 -> 1455 bytes test/reference/stroke-image.traps.argb32.ref.png | Bin 0 -> 1467 bytes test/reference/stroke-image.traps.rgb24.ref.png | Bin 0 -> 1467 bytes test/reference/stroke-open-box.base.argb32.ref.png | Bin 0 -> 148 bytes test/reference/stroke-open-box.base.rgb24.ref.png | Bin 0 -> 148 bytes test/reference/stroke-open-box.ref.png | Bin 0 -> 148 bytes test/reference/stroke-pattern.base.argb32.ref.png | Bin 0 -> 1487 bytes test/reference/stroke-pattern.base.rgb24.ref.png | Bin 0 -> 1487 bytes test/reference/stroke-pattern.ref.png | Bin 0 -> 1514 bytes test/reference/stroke-pattern.traps.ref.png | Bin 0 -> 1487 bytes test/reference/stroke-xlib-fallback.rgb24.ref.png | Bin 0 -> 1467 bytes test/reference/stroke-xlib-window.rgb24.ref.png | Bin 0 -> 1467 bytes test/reference/stroke-xlib.ref.png | Bin 0 -> 1467 bytes test/reference/stroke.image.argb32.ref.png | Bin 0 -> 1479 bytes test/reference/stroke.image.rgb24.ref.png | Bin 0 -> 1479 bytes .../subsurface-image-repeat.base.argb32.ref.png | Bin 0 -> 915 bytes .../subsurface-image-repeat.base.rgb24.ref.png | Bin 0 -> 915 bytes .../subsurface-image-repeat.image16.ref.png | Bin 0 -> 776 bytes test/reference/subsurface-image-repeat.ref.png | Bin 0 -> 915 bytes .../subsurface-modify-child.base.argb32.ref.png | Bin 0 -> 197 bytes .../subsurface-modify-child.base.rgb24.ref.png | Bin 0 -> 197 bytes test/reference/subsurface-modify-child.ref.png | Bin 0 -> 197 bytes .../subsurface-modify-parent.base.argb32.ref.png | Bin 0 -> 197 bytes .../subsurface-modify-parent.base.rgb24.ref.png | Bin 0 -> 197 bytes test/reference/subsurface-modify-parent.ref.png | Bin 0 -> 197 bytes .../subsurface-outside-target.base.argb32.ref.png | Bin 0 -> 2063 bytes .../subsurface-outside-target.base.rgb24.ref.png | Bin 0 -> 1648 bytes test/reference/subsurface-outside-target.ref.png | Bin 0 -> 2063 bytes test/reference/subsurface-pad.base.argb32.ref.png | Bin 0 -> 181 bytes test/reference/subsurface-pad.base.rgb24.ref.png | Bin 0 -> 181 bytes test/reference/subsurface-pad.quartz.xfail.png | Bin 0 -> 197 bytes test/reference/subsurface-pad.ref.png | Bin 0 -> 181 bytes .../subsurface-reflect.base.argb32.ref.png | Bin 0 -> 210 bytes .../subsurface-reflect.base.rgb24.ref.png | Bin 0 -> 210 bytes test/reference/subsurface-reflect.ref.png | Bin 0 -> 210 bytes .../subsurface-repeat.base.argb32.ref.png | Bin 0 -> 197 bytes .../reference/subsurface-repeat.base.rgb24.ref.png | Bin 0 -> 197 bytes test/reference/subsurface-repeat.ref.png | Bin 0 -> 197 bytes .../reference/subsurface-scale.base.argb32.ref.png | Bin 0 -> 5919 bytes test/reference/subsurface-scale.base.rgb24.ref.png | Bin 0 -> 5919 bytes test/reference/subsurface-scale.ref.png | Bin 0 -> 5921 bytes .../subsurface-scale.traps.argb32.ref.png | Bin 0 -> 5919 bytes .../reference/subsurface-scale.traps.rgb24.ref.png | Bin 0 -> 5919 bytes .../subsurface-similar-repeat.base.argb32.ref.png | Bin 0 -> 197 bytes .../subsurface-similar-repeat.base.rgb24.ref.png | Bin 0 -> 197 bytes test/reference/subsurface-similar-repeat.ref.png | Bin 0 -> 197 bytes test/reference/subsurface.base.argb32.ref.png | Bin 0 -> 1801 bytes test/reference/subsurface.base.rgb24.ref.png | Bin 0 -> 1801 bytes test/reference/subsurface.image16.ref.png | Bin 0 -> 1643 bytes test/reference/subsurface.ps.ref.png | Bin 0 -> 1651 bytes test/reference/subsurface.ref.png | Bin 0 -> 1811 bytes test/reference/subsurface.traps.argb32.ref.png | Bin 0 -> 1801 bytes test/reference/subsurface.traps.rgb24.ref.png | Bin 0 -> 1801 bytes ...face-pattern-big-scale-down.base.argb32.ref.png | Bin 0 -> 191 bytes ...rface-pattern-big-scale-down.base.rgb24.ref.png | Bin 0 -> 191 bytes .../surface-pattern-big-scale-down.ps.ref.png | Bin 0 -> 235 bytes .../surface-pattern-big-scale-down.quartz.ref.png | Bin 0 -> 258 bytes .../surface-pattern-big-scale-down.ref.png | Bin 0 -> 191 bytes .../surface-pattern-operator.argb32.ref.png | Bin 0 -> 5087 bytes .../surface-pattern-operator.base.argb32.ref.png | Bin 0 -> 5107 bytes .../surface-pattern-operator.base.rgb24.ref.png | Bin 0 -> 1913 bytes .../surface-pattern-operator.image16.ref.png | Bin 0 -> 1977 bytes .../surface-pattern-operator.pdf.argb32.xfail.png | Bin 0 -> 5485 bytes .../surface-pattern-operator.pdf.rgb24.xfail.png | Bin 0 -> 2095 bytes .../surface-pattern-operator.quartz.argb32.ref.png | Bin 0 -> 5721 bytes .../surface-pattern-operator.quartz.rgb24.ref.png | Bin 0 -> 2429 bytes .../surface-pattern-operator.rgb24.ref.png | Bin 0 -> 1919 bytes .../surface-pattern-operator.traps.argb32.ref.png | Bin 0 -> 5107 bytes .../surface-pattern-operator.traps.rgb24.ref.png | Bin 0 -> 1913 bytes ...tern-scale-down-extend-none.base.argb32.ref.png | Bin 0 -> 329 bytes ...ttern-scale-down-extend-none.base.rgb24.ref.png | Bin 0 -> 329 bytes ...e-pattern-scale-down-extend-none.quartz.ref.png | Bin 0 -> 391 bytes .../surface-pattern-scale-down-extend-none.ref.png | Bin 0 -> 329 bytes ...ttern-scale-down-extend-pad.base.argb32.ref.png | Bin 0 -> 320 bytes ...attern-scale-down-extend-pad.base.rgb24.ref.png | Bin 0 -> 320 bytes ...-pattern-scale-down-extend-pad.quartz.xfail.png | Bin 0 -> 397 bytes .../surface-pattern-scale-down-extend-pad.ref.png | Bin 0 -> 320 bytes ...n-scale-down-extend-reflect.base.argb32.ref.png | Bin 0 -> 328 bytes ...rn-scale-down-extend-reflect.base.rgb24.ref.png | Bin 0 -> 328 bytes ...attern-scale-down-extend-reflect.quartz.ref.png | Bin 0 -> 475 bytes ...rface-pattern-scale-down-extend-reflect.ref.png | Bin 0 -> 328 bytes ...rn-scale-down-extend-repeat.base.argb32.ref.png | Bin 0 -> 330 bytes ...ern-scale-down-extend-repeat.base.rgb24.ref.png | Bin 0 -> 330 bytes ...pattern-scale-down-extend-repeat.quartz.ref.png | Bin 0 -> 397 bytes ...urface-pattern-scale-down-extend-repeat.ref.png | Bin 0 -> 330 bytes .../surface-pattern-scale-down.base.argb32.ref.png | Bin 0 -> 1326 bytes .../surface-pattern-scale-down.base.rgb24.ref.png | Bin 0 -> 1326 bytes .../surface-pattern-scale-down.image16.ref.png | Bin 0 -> 1313 bytes .../surface-pattern-scale-down.pdf.ref.png | Bin 0 -> 2189 bytes .../surface-pattern-scale-down.ps2.ref.png | Bin 0 -> 1324 bytes .../surface-pattern-scale-down.ps3.ref.png | Bin 0 -> 1324 bytes .../surface-pattern-scale-down.quartz.ref.png | Bin 0 -> 2276 bytes test/reference/surface-pattern-scale-down.ref.png | Bin 0 -> 1326 bytes .../surface-pattern-scale-up.base.argb32.ref.png | Bin 0 -> 4020 bytes .../surface-pattern-scale-up.base.rgb24.ref.png | Bin 0 -> 4020 bytes .../surface-pattern-scale-up.image16.ref.png | Bin 0 -> 3864 bytes .../reference/surface-pattern-scale-up.pdf.ref.png | Bin 0 -> 3482 bytes .../reference/surface-pattern-scale-up.ps2.ref.png | Bin 0 -> 913 bytes .../reference/surface-pattern-scale-up.ps3.ref.png | Bin 0 -> 913 bytes .../surface-pattern-scale-up.quartz.xfail.png | Bin 0 -> 3294 bytes test/reference/surface-pattern-scale-up.ref.png | Bin 0 -> 4020 bytes test/reference/surface-pattern.base.argb32.ref.png | Bin 0 -> 11088 bytes test/reference/surface-pattern.base.rgb24.ref.png | Bin 0 -> 11088 bytes test/reference/surface-pattern.image16.ref.png | Bin 0 -> 11870 bytes test/reference/surface-pattern.pdf.xfail.png | Bin 0 -> 10532 bytes test/reference/surface-pattern.ps.xfail.png | Bin 0 -> 2188 bytes test/reference/surface-pattern.quartz.xfail.png | Bin 0 -> 9216 bytes test/reference/surface-pattern.ref.png | Bin 0 -> 11088 bytes test/reference/surface-pattern.svg.xfail.png | Bin 0 -> 16069 bytes .../svg-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../svg-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/svg-surface-source.image16.ref.png | Bin 0 -> 305 bytes test/reference/svg-surface-source.ref.png | Bin 0 -> 377 bytes .../svg-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes .../svg-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes .../text-antialias-gray.base.argb32.ref.png | Bin 0 -> 966 bytes .../text-antialias-gray.base.rgb24.ref.png | Bin 0 -> 966 bytes test/reference/text-antialias-gray.image16.ref.png | Bin 0 -> 895 bytes test/reference/text-antialias-gray.quartz.ref.png | Bin 0 -> 956 bytes test/reference/text-antialias-gray.ref.png | Bin 0 -> 966 bytes test/reference/text-antialias-gray.traps.ref.png | Bin 0 -> 966 bytes .../text-antialias-none.base.argb32.ref.png | Bin 0 -> 265 bytes .../text-antialias-none.base.rgb24.ref.png | Bin 0 -> 265 bytes test/reference/text-antialias-none.quartz.ref.png | Bin 0 -> 270 bytes test/reference/text-antialias-none.ref.png | Bin 0 -> 298 bytes ...text-antialias-subpixel-bgr.base.argb32.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel-bgr.base.rgb24.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel-bgr.image16.ref.png | Bin 0 -> 863 bytes ...text-antialias-subpixel-bgr.mask.argb32.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel-bgr.mask.rgb24.ref.png | Bin 0 -> 917 bytes test/reference/text-antialias-subpixel-bgr.ref.png | Bin 0 -> 1124 bytes .../text-antialias-subpixel-bgr.traps.ref.png | Bin 0 -> 1005 bytes ...text-antialias-subpixel-rgb.base.argb32.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel-rgb.base.rgb24.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel-rgb.image16.ref.png | Bin 0 -> 863 bytes ...text-antialias-subpixel-rgb.mask.argb32.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel-rgb.mask.rgb24.ref.png | Bin 0 -> 917 bytes test/reference/text-antialias-subpixel-rgb.ref.png | Bin 0 -> 1109 bytes .../text-antialias-subpixel-rgb.traps.ref.png | Bin 0 -> 1013 bytes ...ext-antialias-subpixel-vbgr.base.argb32.ref.png | Bin 0 -> 932 bytes ...text-antialias-subpixel-vbgr.base.rgb24.ref.png | Bin 0 -> 932 bytes .../text-antialias-subpixel-vbgr.image16.ref.png | Bin 0 -> 864 bytes ...ext-antialias-subpixel-vbgr.mask.argb32.ref.png | Bin 0 -> 932 bytes ...text-antialias-subpixel-vbgr.mask.rgb24.ref.png | Bin 0 -> 932 bytes .../reference/text-antialias-subpixel-vbgr.ref.png | Bin 0 -> 1205 bytes .../text-antialias-subpixel-vbgr.traps.ref.png | Bin 0 -> 985 bytes ...ext-antialias-subpixel-vrgb.base.argb32.ref.png | Bin 0 -> 932 bytes ...text-antialias-subpixel-vrgb.base.rgb24.ref.png | Bin 0 -> 932 bytes .../text-antialias-subpixel-vrgb.image16.ref.png | Bin 0 -> 862 bytes ...ext-antialias-subpixel-vrgb.mask.argb32.ref.png | Bin 0 -> 932 bytes ...text-antialias-subpixel-vrgb.mask.rgb24.ref.png | Bin 0 -> 932 bytes .../reference/text-antialias-subpixel-vrgb.ref.png | Bin 0 -> 1180 bytes .../text-antialias-subpixel-vrgb.traps.ref.png | Bin 0 -> 1009 bytes .../text-antialias-subpixel.base.argb32.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel.base.argb32.xfail.png | Bin 0 -> 925 bytes .../text-antialias-subpixel.base.rgb24.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel.base.rgb24.xfail.png | Bin 0 -> 925 bytes .../text-antialias-subpixel.image16.ref.png | Bin 0 -> 866 bytes .../text-antialias-subpixel.mask.argb32.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel.mask.rgb24.ref.png | Bin 0 -> 917 bytes .../text-antialias-subpixel.quartz.ref.png | Bin 0 -> 949 bytes test/reference/text-antialias-subpixel.ref.png | Bin 0 -> 1109 bytes .../text-antialias-subpixel.traps.ref.png | Bin 0 -> 1013 bytes .../reference/text-glyph-range.base.argb32.ref.png | Bin 0 -> 1979 bytes test/reference/text-glyph-range.base.rgb24.ref.png | Bin 0 -> 1979 bytes test/reference/text-glyph-range.image16.ref.png | Bin 0 -> 1731 bytes test/reference/text-glyph-range.ps.ref.png | Bin 0 -> 1253 bytes test/reference/text-glyph-range.quartz.ref.png | Bin 0 -> 2191 bytes test/reference/text-glyph-range.ref.png | Bin 0 -> 1928 bytes test/reference/text-glyph-range.traps.ref.png | Bin 0 -> 1979 bytes test/reference/text-pattern.base.argb32.ref.png | Bin 0 -> 3497 bytes test/reference/text-pattern.base.rgb24.ref.png | Bin 0 -> 2707 bytes test/reference/text-pattern.pdf.argb32.ref.png | Bin 0 -> 1515 bytes test/reference/text-pattern.pdf.rgb24.ref.png | Bin 0 -> 1339 bytes test/reference/text-pattern.ps2.argb32.ref.png | Bin 0 -> 1646 bytes test/reference/text-pattern.ps2.rgb24.ref.png | Bin 0 -> 1646 bytes test/reference/text-pattern.ps3.argb32.ref.png | Bin 0 -> 881 bytes test/reference/text-pattern.ps3.rgb24.ref.png | Bin 0 -> 862 bytes test/reference/text-pattern.quartz.argb32.ref.png | Bin 0 -> 2148 bytes test/reference/text-pattern.quartz.rgb24.ref.png | Bin 0 -> 1867 bytes test/reference/text-pattern.ref.png | Bin 0 -> 3455 bytes test/reference/text-pattern.svg.argb32.ref.png | Bin 0 -> 1745 bytes test/reference/text-pattern.svg.rgb24.ref.png | Bin 0 -> 1453 bytes test/reference/text-pattern.traps.argb32.ref.png | Bin 0 -> 3497 bytes test/reference/text-pattern.traps.rgb24.ref.png | Bin 0 -> 2707 bytes test/reference/text-rotate.base.argb32.ref.png | Bin 0 -> 16597 bytes test/reference/text-rotate.base.rgb24.ref.png | Bin 0 -> 16597 bytes test/reference/text-rotate.image16.ref.png | Bin 0 -> 12599 bytes test/reference/text-rotate.mask.argb32.ref.png | Bin 0 -> 16655 bytes test/reference/text-rotate.mask.rgb24.ref.png | Bin 0 -> 16655 bytes test/reference/text-rotate.pdf.ref.png | Bin 0 -> 16744 bytes test/reference/text-rotate.ps.ref.png | Bin 0 -> 8765 bytes test/reference/text-rotate.quartz.ref.png | Bin 0 -> 16655 bytes test/reference/text-rotate.ref.png | Bin 0 -> 16356 bytes test/reference/text-rotate.svg.ref.png | Bin 0 -> 17118 bytes test/reference/text-rotate.traps.ref.png | Bin 0 -> 16597 bytes test/reference/text-rotate.xlib-fallback.ref.png | Bin 0 -> 16592 bytes test/reference/text-transform.base.argb32.ref.png | Bin 0 -> 5579 bytes test/reference/text-transform.base.rgb24.ref.png | Bin 0 -> 5579 bytes test/reference/text-transform.image16.ref.png | Bin 0 -> 4469 bytes test/reference/text-transform.pdf.argb32.ref.png | Bin 0 -> 5507 bytes test/reference/text-transform.pdf.rgb24.ref.png | Bin 0 -> 5507 bytes test/reference/text-transform.ps2.ref.png | Bin 0 -> 3943 bytes test/reference/text-transform.ps3.ref.png | Bin 0 -> 3943 bytes test/reference/text-transform.ref.png | Bin 0 -> 6200 bytes test/reference/text-transform.svg.ref.png | Bin 0 -> 5682 bytes test/reference/tiger.base.argb32.ref.png | Bin 0 -> 94370 bytes test/reference/tiger.base.rgb24.ref.png | Bin 0 -> 94370 bytes test/reference/tiger.ref.png | Bin 0 -> 94477 bytes test/reference/tiger.traps.argb32.ref.png | Bin 0 -> 94370 bytes test/reference/tiger.traps.rgb24.ref.png | Bin 0 -> 94370 bytes test/reference/tighten-bounds.argb32.ref.png | Bin 0 -> 8997 bytes test/reference/tighten-bounds.base.argb32.ref.png | Bin 0 -> 8512 bytes test/reference/tighten-bounds.base.rgb24.ref.png | Bin 0 -> 7873 bytes test/reference/tighten-bounds.rgb24.ref.png | Bin 0 -> 8450 bytes test/reference/tighten-bounds.traps.argb32.ref.png | Bin 0 -> 8486 bytes test/reference/tighten-bounds.traps.rgb24.ref.png | Bin 0 -> 7856 bytes test/reference/transforms.base.argb32.ref.png | Bin 0 -> 299 bytes test/reference/transforms.base.rgb24.ref.png | Bin 0 -> 299 bytes test/reference/transforms.image16.ref.png | Bin 0 -> 326 bytes test/reference/transforms.ps2.ref.png | Bin 0 -> 418 bytes test/reference/transforms.ps3.ref.png | Bin 0 -> 418 bytes test/reference/transforms.ref.png | Bin 0 -> 348 bytes test/reference/transforms.traps.argb32.ref.png | Bin 0 -> 299 bytes test/reference/transforms.traps.rgb24.ref.png | Bin 0 -> 299 bytes .../translate-show-surface.base.argb32.ref.png | Bin 0 -> 96 bytes .../translate-show-surface.base.rgb24.ref.png | Bin 0 -> 96 bytes test/reference/translate-show-surface.ref.png | Bin 0 -> 100 bytes test/reference/trap-clip.argb32.ref.png | Bin 0 -> 5822 bytes test/reference/trap-clip.base.argb32.ref.png | Bin 0 -> 5651 bytes test/reference/trap-clip.base.rgb24.ref.png | Bin 0 -> 5351 bytes test/reference/trap-clip.image16.ref.png | Bin 0 -> 4344 bytes test/reference/trap-clip.mask.argb32.ref.png | Bin 0 -> 6162 bytes test/reference/trap-clip.mask.rgb24.ref.png | Bin 0 -> 5606 bytes test/reference/trap-clip.ps2.argb32.ref.png | Bin 0 -> 4839 bytes test/reference/trap-clip.ps2.rgb24.ref.png | Bin 0 -> 4729 bytes test/reference/trap-clip.ps3.argb32.ref.png | Bin 0 -> 4751 bytes test/reference/trap-clip.ps3.rgb24.ref.png | Bin 0 -> 4553 bytes test/reference/trap-clip.quartz.argb32.ref.png | Bin 0 -> 6115 bytes test/reference/trap-clip.quartz.rgb24.ref.png | Bin 0 -> 5801 bytes test/reference/trap-clip.rgb24.ref.png | Bin 0 -> 5422 bytes .../trap-clip.test-paginated.argb32.ref.png | Bin 0 -> 5898 bytes test/reference/trap-clip.traps.argb32.ref.png | Bin 0 -> 5755 bytes test/reference/trap-clip.traps.rgb24.ref.png | Bin 0 -> 5379 bytes .../twin-antialias-gray.base.argb32.ref.png | Bin 0 -> 4320 bytes .../twin-antialias-gray.base.rgb24.ref.png | Bin 0 -> 4320 bytes test/reference/twin-antialias-gray.image16.ref.png | Bin 0 -> 3005 bytes .../twin-antialias-gray.mask.argb32.ref.png | Bin 0 -> 3990 bytes .../twin-antialias-gray.mask.rgb24.ref.png | Bin 0 -> 3990 bytes test/reference/twin-antialias-gray.ref.png | Bin 0 -> 3536 bytes .../twin-antialias-gray.traps.argb32.ref.png | Bin 0 -> 4320 bytes .../twin-antialias-gray.traps.rgb24.ref.png | Bin 0 -> 4320 bytes .../twin-antialias-mixed.base.argb32.ref.png | Bin 0 -> 2340 bytes .../twin-antialias-mixed.base.rgb24.ref.png | Bin 0 -> 2340 bytes .../reference/twin-antialias-mixed.image16.ref.png | Bin 0 -> 2049 bytes test/reference/twin-antialias-mixed.ref.png | Bin 0 -> 2392 bytes .../twin-antialias-mixed.traps.argb32.ref.png | Bin 0 -> 2340 bytes .../twin-antialias-mixed.traps.rgb24.ref.png | Bin 0 -> 2340 bytes .../twin-antialias-none.base.argb32.ref.png | Bin 0 -> 738 bytes .../twin-antialias-none.base.rgb24.ref.png | Bin 0 -> 738 bytes test/reference/twin-antialias-none.ref.png | Bin 0 -> 688 bytes .../twin-antialias-none.traps.argb32.ref.png | Bin 0 -> 738 bytes .../twin-antialias-none.traps.rgb24.ref.png | Bin 0 -> 738 bytes .../twin-antialias-subpixel.base.argb32.ref.png | Bin 0 -> 4320 bytes .../twin-antialias-subpixel.base.rgb24.ref.png | Bin 0 -> 4320 bytes .../twin-antialias-subpixel.image16.ref.png | Bin 0 -> 3005 bytes .../twin-antialias-subpixel.mask.argb32.ref.png | Bin 0 -> 3990 bytes .../twin-antialias-subpixel.mask.rgb24.ref.png | Bin 0 -> 3990 bytes test/reference/twin-antialias-subpixel.ref.png | Bin 0 -> 3536 bytes .../twin-antialias-subpixel.traps.argb32.ref.png | Bin 0 -> 4320 bytes .../twin-antialias-subpixel.traps.rgb24.ref.png | Bin 0 -> 4320 bytes test/reference/twin.base.argb32.ref.png | Bin 0 -> 4320 bytes test/reference/twin.base.rgb24.ref.png | Bin 0 -> 4320 bytes test/reference/twin.image16.ref.png | Bin 0 -> 3005 bytes test/reference/twin.mask.argb32.ref.png | Bin 0 -> 3990 bytes test/reference/twin.mask.rgb24.ref.png | Bin 0 -> 3990 bytes test/reference/twin.ps.ref.png | Bin 0 -> 2136 bytes test/reference/twin.ref.png | Bin 0 -> 3536 bytes test/reference/twin.svg.ref.png | Bin 0 -> 3040 bytes test/reference/twin.traps.argb32.ref.png | Bin 0 -> 4320 bytes test/reference/twin.traps.rgb24.ref.png | Bin 0 -> 4320 bytes test/reference/unaligned-box.base.argb32.ref.png | Bin 0 -> 526 bytes test/reference/unaligned-box.base.rgb24.ref.png | Bin 0 -> 526 bytes test/reference/unaligned-box.ref.png | Bin 0 -> 496 bytes test/reference/unaligned-box.traps.argb32.ref.png | Bin 0 -> 526 bytes test/reference/unaligned-box.traps.rgb24.ref.png | Bin 0 -> 526 bytes .../unantialiased-shapes.base.argb32.ref.png | Bin 0 -> 3977 bytes .../unantialiased-shapes.base.rgb24.ref.png | Bin 0 -> 3977 bytes test/reference/unantialiased-shapes.quartz.ref.png | Bin 0 -> 3868 bytes test/reference/unantialiased-shapes.ref.png | Bin 0 -> 3926 bytes .../unantialiased-shapes.traps.argb32.ref.png | Bin 0 -> 3932 bytes .../unantialiased-shapes.traps.rgb24.ref.png | Bin 0 -> 3932 bytes test/reference/unbounded-operator.argb32.ref.png | Bin 0 -> 2744 bytes .../unbounded-operator.base.argb32.ref.png | Bin 0 -> 2764 bytes .../unbounded-operator.base.rgb24.ref.png | Bin 0 -> 1302 bytes .../unbounded-operator.gl.argb32.xfail.png | Bin 0 -> 2805 bytes .../unbounded-operator.gl.rgb24.xfail.png | Bin 0 -> 1355 bytes test/reference/unbounded-operator.image16.ref.png | Bin 0 -> 1276 bytes .../unbounded-operator.mask.argb32.ref.png | Bin 0 -> 2666 bytes .../unbounded-operator.mask.rgb24.ref.png | Bin 0 -> 1300 bytes .../unbounded-operator.pdf.argb32.ref.png | Bin 0 -> 2713 bytes .../unbounded-operator.ps2.argb32.ref.png | Bin 0 -> 2713 bytes .../unbounded-operator.ps3.argb32.ref.png | Bin 0 -> 2713 bytes .../unbounded-operator.quartz.argb32.ref.png | Bin 0 -> 3509 bytes .../unbounded-operator.quartz.rgb24.ref.png | Bin 0 -> 1657 bytes test/reference/unbounded-operator.rgb24.ref.png | Bin 0 -> 1303 bytes .../unbounded-operator.svg12.argb32.ref.png | Bin 0 -> 2767 bytes .../unbounded-operator.svg12.rgb24.xfail.png | Bin 0 -> 1731 bytes .../unbounded-operator.traps.argb32.ref.png | Bin 0 -> 2764 bytes .../unbounded-operator.traps.rgb24.ref.png | Bin 0 -> 1302 bytes .../reference/unclosed-strokes.base.argb32.ref.png | Bin 0 -> 1452 bytes test/reference/unclosed-strokes.base.rgb24.ref.png | Bin 0 -> 1452 bytes test/reference/unclosed-strokes.ref.png | Bin 0 -> 1588 bytes .../unclosed-strokes.traps.argb32.ref.png | Bin 0 -> 1452 bytes .../reference/unclosed-strokes.traps.rgb24.ref.png | Bin 0 -> 1452 bytes test/reference/user-font-mask.base.argb32.ref.png | Bin 0 -> 5476 bytes test/reference/user-font-mask.base.rgb24.ref.png | Bin 0 -> 5476 bytes test/reference/user-font-mask.image16.ref.png | Bin 0 -> 4948 bytes test/reference/user-font-mask.pdf.ref.png | Bin 0 -> 1927 bytes test/reference/user-font-mask.ps2.ref.png | Bin 0 -> 1927 bytes test/reference/user-font-mask.ps3.ref.png | Bin 0 -> 1927 bytes test/reference/user-font-mask.ref.png | Bin 0 -> 5476 bytes test/reference/user-font-mask.svg.ref.png | Bin 0 -> 2030 bytes test/reference/user-font-proxy.base.argb32.ref.png | Bin 0 -> 16854 bytes test/reference/user-font-proxy.base.rgb24.ref.png | Bin 0 -> 16854 bytes test/reference/user-font-proxy.image16.ref.png | Bin 0 -> 14460 bytes test/reference/user-font-proxy.pdf.argb32.ref.png | Bin 0 -> 16937 bytes test/reference/user-font-proxy.pdf.ref.png | Bin 0 -> 18111 bytes test/reference/user-font-proxy.pdf.rgb24.ref.png | Bin 0 -> 16937 bytes test/reference/user-font-proxy.ps.ref.png | Bin 0 -> 7837 bytes test/reference/user-font-proxy.quartz.ref.png | Bin 0 -> 19795 bytes test/reference/user-font-proxy.ref.png | Bin 0 -> 16981 bytes test/reference/user-font-proxy.svg.ref.png | Bin 0 -> 16814 bytes test/reference/user-font-proxy.traps.ref.png | Bin 0 -> 16854 bytes .../user-font-rescale.base.argb32.ref.png | Bin 0 -> 14883 bytes .../reference/user-font-rescale.base.rgb24.ref.png | Bin 0 -> 14883 bytes test/reference/user-font-rescale.image16.ref.png | Bin 0 -> 12590 bytes test/reference/user-font-rescale.ps.ref.png | Bin 0 -> 6781 bytes test/reference/user-font-rescale.quartz.ref.png | Bin 0 -> 15982 bytes test/reference/user-font-rescale.ref.png | Bin 0 -> 14883 bytes test/reference/user-font-rescale.svg.ref.png | Bin 0 -> 14873 bytes test/reference/user-font-rescale.traps.ref.png | Bin 0 -> 14883 bytes test/reference/user-font.base.argb32.ref.png | Bin 0 -> 5785 bytes test/reference/user-font.base.rgb24.ref.png | Bin 0 -> 5785 bytes test/reference/user-font.image16.ref.png | Bin 0 -> 5814 bytes test/reference/user-font.mask.argb32.ref.png | Bin 0 -> 6478 bytes test/reference/user-font.mask.rgb24.ref.png | Bin 0 -> 6478 bytes test/reference/user-font.pdf.ref.png | Bin 0 -> 6241 bytes test/reference/user-font.ps.ref.png | Bin 0 -> 4605 bytes test/reference/user-font.quartz.ref.png | Bin 0 -> 5960 bytes test/reference/user-font.ref.png | Bin 0 -> 5875 bytes test/reference/user-font.svg.ref.png | Bin 0 -> 6379 bytes test/reference/user-font.traps.argb32.ref.png | Bin 0 -> 5785 bytes test/reference/user-font.traps.rgb24.ref.png | Bin 0 -> 5785 bytes test/reference/white-in-noop.base.argb32.ref.png | Bin 0 -> 95 bytes test/reference/white-in-noop.base.rgb24.ref.png | Bin 0 -> 95 bytes test/reference/white-in-noop.ref.png | Bin 0 -> 95 bytes test/reference/world-map-fill.base.argb32.ref.png | Bin 0 -> 57451 bytes test/reference/world-map-fill.base.rgb24.ref.png | Bin 0 -> 57451 bytes test/reference/world-map-fill.image16.ref.png | Bin 0 -> 36582 bytes test/reference/world-map-fill.ref.png | Bin 0 -> 57407 bytes test/reference/world-map-fill.traps.argb32.ref.png | Bin 0 -> 57451 bytes test/reference/world-map-fill.traps.rgb24.ref.png | Bin 0 -> 57451 bytes .../reference/world-map-stroke.base.argb32.ref.png | Bin 0 -> 65217 bytes test/reference/world-map-stroke.base.rgb24.ref.png | Bin 0 -> 65217 bytes test/reference/world-map-stroke.image16.ref.png | Bin 0 -> 41885 bytes .../reference/world-map-stroke.mask.argb32.ref.png | Bin 0 -> 65149 bytes test/reference/world-map-stroke.mask.rgb24.ref.png | Bin 0 -> 65149 bytes test/reference/world-map-stroke.ref.png | Bin 0 -> 65152 bytes .../world-map-stroke.traps.argb32.ref.png | Bin 0 -> 65217 bytes .../reference/world-map-stroke.traps.rgb24.ref.png | Bin 0 -> 65217 bytes test/reference/world-map.base.argb32.ref.png | Bin 0 -> 70536 bytes test/reference/world-map.base.rgb24.ref.png | Bin 0 -> 70536 bytes test/reference/world-map.image16.ref.png | Bin 0 -> 48377 bytes test/reference/world-map.mask.argb32.ref.png | Bin 0 -> 70474 bytes test/reference/world-map.mask.rgb24.ref.png | Bin 0 -> 70474 bytes test/reference/world-map.ref.png | Bin 0 -> 70463 bytes test/reference/world-map.traps.argb32.ref.png | Bin 0 -> 70536 bytes test/reference/world-map.traps.rgb24.ref.png | Bin 0 -> 70536 bytes .../xcb-huge-image-shm.base.argb32.ref.png | Bin 0 -> 97 bytes .../xcb-huge-image-shm.base.rgb24.ref.png | Bin 0 -> 97 bytes test/reference/xcb-huge-image-shm.ref.png | Bin 0 -> 97 bytes test/reference/xcb-huge-subimage.ref.png | Bin 0 -> 97 bytes .../xcb-snapshot-assert.base.argb32.ref.png | Bin 0 -> 97 bytes .../xcb-snapshot-assert.base.rgb24.ref.png | Bin 0 -> 97 bytes test/reference/xcb-snapshot-assert.ref.png | Bin 0 -> 97 bytes .../reference/xcb-stress-cache.base.argb32.ref.png | Bin 0 -> 97 bytes test/reference/xcb-stress-cache.base.rgb24.ref.png | Bin 0 -> 97 bytes test/reference/xcb-stress-cache.ref.png | Bin 0 -> 97 bytes .../xcb-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../xcb-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/xcb-surface-source.image16.ref.png | Bin 0 -> 305 bytes .../reference/xcb-surface-source.ps.argb32.ref.png | Bin 0 -> 491 bytes test/reference/xcb-surface-source.ps.rgb24.ref.png | Bin 0 -> 482 bytes test/reference/xcb-surface-source.ref.png | Bin 0 -> 377 bytes .../xcomposite-projection.base.argb32.ref.png | Bin 0 -> 1112 bytes .../xcomposite-projection.base.rgb24.ref.png | Bin 0 -> 1112 bytes .../xcomposite-projection.image16.ref.png | Bin 0 -> 1000 bytes .../xcomposite-projection.mask.argb32.ref.png | Bin 0 -> 1109 bytes .../xcomposite-projection.mask.rgb24.ref.png | Bin 0 -> 1109 bytes .../reference/xcomposite-projection.quartz.ref.png | Bin 0 -> 926 bytes test/reference/xcomposite-projection.ref.png | Bin 0 -> 1108 bytes .../xcomposite-projection.traps.argb32.ref.png | Bin 0 -> 1112 bytes .../xcomposite-projection.traps.rgb24.ref.png | Bin 0 -> 1112 bytes .../xlib-expose-event.base.argb32.ref.png | Bin 0 -> 40717 bytes .../reference/xlib-expose-event.base.rgb24.ref.png | Bin 0 -> 40717 bytes test/reference/xlib-expose-event.image16.ref.png | Bin 0 -> 30332 bytes test/reference/xlib-expose-event.ps.ref.png | Bin 0 -> 39035 bytes test/reference/xlib-expose-event.ref.png | Bin 0 -> 40736 bytes .../xlib-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes .../xlib-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes test/reference/xlib-surface-source.image16.ref.png | Bin 0 -> 305 bytes .../xlib-surface-source.ps.argb32.ref.png | Bin 0 -> 491 bytes .../reference/xlib-surface-source.ps.rgb24.ref.png | Bin 0 -> 482 bytes test/reference/xlib-surface-source.ref.png | Bin 0 -> 377 bytes .../xlib-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes .../xlib-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes test/reference/zero-alpha.base.argb32.ref.png | Bin 0 -> 91 bytes test/reference/zero-alpha.base.rgb24.ref.png | Bin 0 -> 91 bytes test/reference/zero-alpha.ref.png | Bin 0 -> 115 bytes test/reference/zero-mask.base.argb32.ref.png | Bin 0 -> 402 bytes test/reference/zero-mask.base.rgb24.ref.png | Bin 0 -> 382 bytes test/reference/zero-mask.ref.png | Bin 0 -> 402 bytes test/reflected-stroke.c | 91 + test/rel-path.c | 129 + test/rgb24-ignore-alpha.c | 60 + test/romedalen.jpg | Bin 0 -> 11400 bytes test/romedalen.png | Bin 0 -> 80944 bytes test/rotate-image-surface-paint.c | 172 + test/rotate-stroke-box.c | 49 + test/rotated-clip.c | 110 + test/rounded-rectangle-fill.c | 65 + test/rounded-rectangle-stroke.c | 64 + test/run-cairo-test-suite.sh | 18 + test/sample.c | 117 + test/scale-down-source-surface-paint.c | 65 + test/scale-offset-image.c | 143 + test/scale-offset-similar.c | 143 + test/scale-source-surface-paint.c | 60 + test/scaled-font-zero-matrix.c | 63 + test/scarab.jpg | Bin 0 -> 9650 bytes test/select-font-face.c | 65 + test/select-font-no-show-text.c | 59 + test/self-copy-overlap.c | 54 + test/self-copy.c | 84 + test/self-intersecting.c | 87 + test/set-source.c | 81 + test/shape-general-convex.c | 88 + test/shape-sierpinski.c | 85 + test/show-glyphs-advance.c | 107 + test/show-glyphs-many.c | 176 + test/show-text-current-point.c | 59 + test/simple.c | 347 + test/skew-extreme.c | 118 + test/smask-fill.c | 73 + test/smask-image-mask.c | 85 + test/smask-mask.c | 96 + test/smask-paint.c | 81 + test/smask-stroke.c | 73 + test/smask-text.c | 83 + test/smask.c | 123 + test/solid-pattern-cache-stress.c | 212 + test/source-clip-scale.c | 82 + test/source-clip.c | 77 + test/source-surface-scale-paint.c | 59 + test/spline-decomposition.c | 471 + test/stride-12-image.c | 71 + test/stroke-clipped.c | 54 + test/stroke-ctm-caps.c | 78 + test/stroke-image.c | 73 + test/stroke-open-box.c | 51 + test/stroke-pattern.c | 68 + test/subsurface-image-repeat.c | 70 + test/subsurface-modify-child.c | 98 + test/subsurface-modify-parent.c | 78 + test/subsurface-outside-target.c | 177 + test/subsurface-pad.c | 76 + test/subsurface-reflect.c | 76 + test/subsurface-repeat.c | 76 + test/subsurface-scale.c | 93 + test/subsurface-similar-repeat.c | 86 + test/subsurface.c | 85 + test/surface-finish-twice.c | 79 + test/surface-pattern-big-scale-down.c | 125 + test/surface-pattern-operator.c | 119 + test/surface-pattern-scale-down-extend.c | 120 + test/surface-pattern-scale-down.c | 88 + test/surface-pattern-scale-up.c | 93 + test/surface-pattern.c | 90 + test/surface-source.c | 170 + test/svg-clip.c | 152 + test/svg-surface-source.c | 54 + test/svg-surface.c | 136 + test/svg2png.c | 62 + test/testtable.js | 428 + test/text-antialias-subpixel.c | 123 + test/text-antialias.c | 106 + test/text-cache-crash.c | 93 + test/text-glyph-range.c | 125 + test/text-pattern.c | 73 + test/text-rotate.c | 189 + test/text-transform.c | 104 + test/text-zero-len.c | 203 + test/tiger.c | 85 + test/tiger.inc | 2316 + test/tighten-bounds.c | 172 + test/toy-font-face.c | 149 + test/transforms.c | 112 + test/translate-show-surface.c | 79 + test/trap-clip.c | 213 + test/twin-antialias-gray.c | 71 + test/twin-antialias-mixed.c | 97 + test/twin-antialias-none.c | 71 + test/twin-antialias-subpixel.c | 71 + test/twin.c | 61 + test/unaligned-box.c | 73 + test/unantialiased-shapes.c | 98 + test/unbounded-operator.c | 185 + test/unclosed-strokes.c | 83 + test/user-data.c | 110 + test/user-font-mask.c | 253 + test/user-font-proxy.c | 222 + test/user-font-rescale.c | 368 + test/user-font.c | 267 + test/white-in-noop.c | 52 + test/world-map.c | 151 + test/world-map.h | 196 + test/xcb-huge-image-shm.c | 67 + test/xcb-huge-subimage.c | 81 + test/xcb-snapshot-assert.c | 75 + test/xcb-stress-cache.c | 118 + test/xcb-surface-source.c | 149 + test/xcomposite-projection.c | 109 + test/xlib-expose-event.c | 196 + test/xlib-surface-source.c | 100 + test/xlib-surface.c | 353 + test/zero-alpha.c | 95 + test/zero-mask.c | 198 + util/COPYING | 4 + util/Makefile.am | 102 + util/Makefile.in | 1422 + util/README | 67 + util/backtrace-symbols.c | 377 + util/cairo-api-update | 72 + util/cairo-fdr/Makefile.am | 15 + util/cairo-fdr/Makefile.in | 765 + util/cairo-fdr/fdr.c | 331 + util/cairo-gobject/Makefile.am | 15 + util/cairo-gobject/Makefile.in | 802 + util/cairo-gobject/cairo-gobject-enums.c | 511 + util/cairo-gobject/cairo-gobject-structs.c | 89 + util/cairo-gobject/cairo-gobject.h | 192 + util/cairo-missing/Makefile.am | 10 + util/cairo-missing/Makefile.in | 708 + util/cairo-missing/Makefile.sources | 8 + util/cairo-missing/cairo-missing.h | 59 + util/cairo-missing/getline.c | 90 + util/cairo-missing/strndup.c | 57 + util/cairo-script/COPYING | 17 + util/cairo-script/Makefile.am | 34 + util/cairo-script/Makefile.in | 1056 + util/cairo-script/Makefile.sources | 13 + util/cairo-script/cairo-script-file.c | 1107 + util/cairo-script/cairo-script-hash.c | 483 + util/cairo-script/cairo-script-interpreter.c | 699 + util/cairo-script/cairo-script-interpreter.h | 124 + util/cairo-script/cairo-script-objects.c | 936 + util/cairo-script/cairo-script-operators.c | 6791 +++ util/cairo-script/cairo-script-private.h | 994 + util/cairo-script/cairo-script-scanner.c | 1901 + util/cairo-script/cairo-script-stack.c | 196 + util/cairo-script/csi-bind.c | 76 + util/cairo-script/csi-exec.c | 41 + util/cairo-script/csi-replay.c | 360 + util/cairo-script/csi-trace.c | 48 + util/cairo-script/examples/Makefile.am | 10 + util/cairo-script/examples/Makefile.in | 551 + util/cairo-script/examples/dragon.cs | 48 + util/cairo-script/examples/hilbert.cs | 51 + util/cairo-script/examples/infinichess.cs | 29 + util/cairo-script/examples/interference.cs | 46 + util/cairo-script/examples/pythagoras-tree.cs | 53 + util/cairo-script/examples/sierpinski.cs | 37 + .../examples/wedgeAnnulus_crop_ybRings.cs | 30 + util/cairo-script/examples/world-map.cs | 209 + util/cairo-script/examples/zrusin.cs | 1333 + util/cairo-sphinx/Makefile.am | 43 + util/cairo-sphinx/Makefile.in | 872 + util/cairo-sphinx/fdr.c | 261 + util/cairo-sphinx/sphinx.c | 1545 + util/cairo-trace/COPYING | 5 + util/cairo-trace/COPYING-GPL-3 | 674 + util/cairo-trace/Makefile.am | 40 + util/cairo-trace/Makefile.in | 844 + util/cairo-trace/cairo-trace.in | 136 + util/cairo-trace/lookup-symbol.c | 331 + util/cairo-trace/lookup-symbol.h | 24 + util/cairo-trace/trace.c | 5581 +++ util/cairo-view | 113 + util/font-view.c | 184 + util/malloc-stats.c | 368 + util/show-contour.c | 667 + util/show-edges.c | 1221 + util/show-events.c | 845 + util/show-polygon.c | 646 + util/show-traps.c | 1311 + util/trace-to-xml.c | 78 + util/waterfall | 97 + util/xml-to-trace.c | 263 + util/xr2cairo | 49 + 4269 files changed, 703087 insertions(+) create mode 100644 AUTHORS create mode 100644 BIBLIOGRAPHY create mode 100644 BUGS create mode 100644 CODING_STYLE create mode 100644 COPYING create mode 100644 COPYING-LGPL-2.1 create mode 100644 COPYING-MPL-1.1 create mode 100644 ChangeLog create mode 100644 ChangeLog.pre-1.0 create mode 100644 ChangeLog.pre-1.10 create mode 100644 ChangeLog.pre-1.12 create mode 100644 ChangeLog.pre-1.2 create mode 100644 ChangeLog.pre-1.4 create mode 100644 ChangeLog.pre-1.6 create mode 100644 ChangeLog.pre-1.8 create mode 100644 HACKING create mode 100644 INSTALL create mode 100644 KNOWN_ISSUES create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 Makefile.win32 create mode 100644 NEWS create mode 100644 PORTING_GUIDE create mode 100644 README create mode 100644 README.win32 create mode 100644 RELEASING create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100755 autogen.sh create mode 100644 boilerplate/Makefile.am create mode 100644 boilerplate/Makefile.am.features create mode 100644 boilerplate/Makefile.in create mode 100644 boilerplate/Makefile.sources create mode 100644 boilerplate/Makefile.win32 create mode 100644 boilerplate/Makefile.win32.features create mode 100644 boilerplate/README create mode 100644 boilerplate/cairo-boilerplate-beos.cpp create mode 100644 boilerplate/cairo-boilerplate-cogl.c create mode 100644 boilerplate/cairo-boilerplate-constructors.c create mode 100644 boilerplate/cairo-boilerplate-directfb.c create mode 100644 boilerplate/cairo-boilerplate-drm.c create mode 100644 boilerplate/cairo-boilerplate-egl.c create mode 100644 boilerplate/cairo-boilerplate-getopt.c create mode 100644 boilerplate/cairo-boilerplate-getopt.h create mode 100644 boilerplate/cairo-boilerplate-glx.c create mode 100644 boilerplate/cairo-boilerplate-pdf.c create mode 100644 boilerplate/cairo-boilerplate-private.h create mode 100644 boilerplate/cairo-boilerplate-ps.c create mode 100644 boilerplate/cairo-boilerplate-qt.cpp create mode 100644 boilerplate/cairo-boilerplate-quartz.c create mode 100644 boilerplate/cairo-boilerplate-scaled-font.h create mode 100644 boilerplate/cairo-boilerplate-script.c create mode 100644 boilerplate/cairo-boilerplate-skia.c create mode 100644 boilerplate/cairo-boilerplate-svg.c create mode 100644 boilerplate/cairo-boilerplate-system.c create mode 100644 boilerplate/cairo-boilerplate-system.h create mode 100644 boilerplate/cairo-boilerplate-test-surfaces.c create mode 100644 boilerplate/cairo-boilerplate-vg.c create mode 100644 boilerplate/cairo-boilerplate-wgl.c create mode 100644 boilerplate/cairo-boilerplate-win32-printing.c create mode 100644 boilerplate/cairo-boilerplate-win32.c create mode 100644 boilerplate/cairo-boilerplate-xcb.c create mode 100644 boilerplate/cairo-boilerplate-xlib.c create mode 100644 boilerplate/cairo-boilerplate-xlib.h create mode 100644 boilerplate/cairo-boilerplate.c create mode 100644 boilerplate/cairo-boilerplate.h create mode 100644 boilerplate/check-link.c create mode 100644 boilerplate/make-cairo-boilerplate-constructors.sh create mode 100644 build/Makefile.am.analysis create mode 100644 build/Makefile.am.changelog create mode 100644 build/Makefile.am.common create mode 100644 build/Makefile.am.gtk-doc create mode 100644 build/Makefile.am.releasing create mode 100644 build/Makefile.win32.common create mode 100644 build/Makefile.win32.features create mode 100644 build/Makefile.win32.features-h create mode 100644 build/Makefile.win32.inform create mode 100644 build/aclocal.cairo.m4 create mode 100644 build/aclocal.compare.m4 create mode 100644 build/aclocal.enable.m4 create mode 100644 build/aclocal.float.m4 create mode 100644 build/aclocal.makefile.m4 create mode 100644 build/aclocal.pkg.m4 create mode 100755 build/ar-lib create mode 100755 build/compile create mode 100755 build/config.guess create mode 100755 build/config.sub create mode 100644 build/configure.ac.analysis create mode 100644 build/configure.ac.features create mode 100644 build/configure.ac.noversion create mode 100644 build/configure.ac.pthread create mode 100644 build/configure.ac.system create mode 100644 build/configure.ac.tools create mode 100644 build/configure.ac.version create mode 100644 build/configure.ac.warnings create mode 100755 build/depcomp create mode 100644 build/gtk-doc.m4 create mode 100755 build/install-sh create mode 100644 build/libtool.m4 create mode 100644 build/ltmain.sh create mode 100644 build/ltoptions.m4 create mode 100644 build/ltsugar.m4 create mode 100644 build/ltversion.m4 create mode 100644 build/lt~obsolete.m4 create mode 100755 build/missing create mode 100755 build/test-driver create mode 100644 cairo-version.h create mode 100644 config.h.in create mode 100755 configure create mode 100644 configure.ac create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in create mode 100644 doc/public/Makefile.am create mode 100644 doc/public/Makefile.in create mode 100644 doc/public/README create mode 100644 doc/public/cairo-docs.xml create mode 100644 doc/public/cairo-overrides.txt create mode 100644 doc/public/cairo-sections.txt create mode 100644 doc/public/cairo.types create mode 100755 doc/public/check-doc-coverage.sh create mode 100755 doc/public/check-doc-syntax.sh create mode 100644 doc/public/html/bindings-errors.html create mode 100644 doc/public/html/bindings-fonts.html create mode 100644 doc/public/html/bindings-memory.html create mode 100644 doc/public/html/bindings-overloading.html create mode 100644 doc/public/html/bindings-path.html create mode 100644 doc/public/html/bindings-patterns.html create mode 100644 doc/public/html/bindings-return-values.html create mode 100644 doc/public/html/bindings-streams.html create mode 100644 doc/public/html/bindings-surfaces.html create mode 100644 doc/public/html/cairo-Error-handling.html create mode 100644 doc/public/html/cairo-FreeType-Fonts.html create mode 100644 doc/public/html/cairo-Image-Surfaces.html create mode 100644 doc/public/html/cairo-PDF-Surfaces.html create mode 100644 doc/public/html/cairo-PNG-Support.html create mode 100644 doc/public/html/cairo-Paths.html create mode 100644 doc/public/html/cairo-PostScript-Surfaces.html create mode 100644 doc/public/html/cairo-Quartz-(CGFont)-Fonts.html create mode 100644 doc/public/html/cairo-Quartz-Surfaces.html create mode 100644 doc/public/html/cairo-Raster-Sources.html create mode 100644 doc/public/html/cairo-Recording-Surfaces.html create mode 100644 doc/public/html/cairo-Regions.html create mode 100644 doc/public/html/cairo-SVG-Surfaces.html create mode 100644 doc/public/html/cairo-Script-Surfaces.html create mode 100644 doc/public/html/cairo-Transformations.html create mode 100644 doc/public/html/cairo-Types.html create mode 100644 doc/public/html/cairo-User-Fonts.html create mode 100644 doc/public/html/cairo-Version-Information.html create mode 100644 doc/public/html/cairo-Win32-Fonts.html create mode 100644 doc/public/html/cairo-Win32-Surfaces.html create mode 100644 doc/public/html/cairo-XCB-Surfaces.html create mode 100644 doc/public/html/cairo-XLib-Surfaces.html create mode 100644 doc/public/html/cairo-XLib-XRender-Backend.html create mode 100644 doc/public/html/cairo-cairo-device-t.html create mode 100644 doc/public/html/cairo-cairo-font-face-t.html create mode 100644 doc/public/html/cairo-cairo-font-options-t.html create mode 100644 doc/public/html/cairo-cairo-matrix-t.html create mode 100644 doc/public/html/cairo-cairo-pattern-t.html create mode 100644 doc/public/html/cairo-cairo-scaled-font-t.html create mode 100644 doc/public/html/cairo-cairo-surface-t.html create mode 100644 doc/public/html/cairo-cairo-t.html create mode 100644 doc/public/html/cairo-drawing.html create mode 100644 doc/public/html/cairo-fonts.html create mode 100644 doc/public/html/cairo-support.html create mode 100644 doc/public/html/cairo-surfaces.html create mode 100644 doc/public/html/cairo-text.html create mode 100644 doc/public/html/cairo.devhelp2 create mode 100644 doc/public/html/home.png create mode 100644 doc/public/html/index-1.10.html create mode 100644 doc/public/html/index-1.12.html create mode 100644 doc/public/html/index-1.2.html create mode 100644 doc/public/html/index-1.4.html create mode 100644 doc/public/html/index-1.6.html create mode 100644 doc/public/html/index-1.8.html create mode 100644 doc/public/html/index-all.html create mode 100644 doc/public/html/index.html create mode 100644 doc/public/html/index.sgml create mode 100644 doc/public/html/language-bindings.html create mode 100644 doc/public/html/left-insensitive.png create mode 100644 doc/public/html/left.png create mode 100644 doc/public/html/right-insensitive.png create mode 100644 doc/public/html/right.png create mode 100644 doc/public/html/style.css create mode 100644 doc/public/html/up-insensitive.png create mode 100644 doc/public/html/up.png create mode 100644 doc/public/language-bindings.xml create mode 100644 doc/public/tmpl/cairo-device.sgml create mode 100644 doc/public/tmpl/cairo-font-face.sgml create mode 100644 doc/public/tmpl/cairo-font-options.sgml create mode 100644 doc/public/tmpl/cairo-ft.sgml create mode 100644 doc/public/tmpl/cairo-image.sgml create mode 100644 doc/public/tmpl/cairo-matrix.sgml create mode 100644 doc/public/tmpl/cairo-paths.sgml create mode 100644 doc/public/tmpl/cairo-pattern.sgml create mode 100644 doc/public/tmpl/cairo-pdf.sgml create mode 100644 doc/public/tmpl/cairo-png.sgml create mode 100644 doc/public/tmpl/cairo-ps.sgml create mode 100644 doc/public/tmpl/cairo-quartz-fonts.sgml create mode 100644 doc/public/tmpl/cairo-quartz.sgml create mode 100644 doc/public/tmpl/cairo-raster-source.sgml create mode 100644 doc/public/tmpl/cairo-recording.sgml create mode 100644 doc/public/tmpl/cairo-region.sgml create mode 100644 doc/public/tmpl/cairo-scaled-font.sgml create mode 100644 doc/public/tmpl/cairo-script.sgml create mode 100644 doc/public/tmpl/cairo-skia.sgml create mode 100644 doc/public/tmpl/cairo-status.sgml create mode 100644 doc/public/tmpl/cairo-surface-observer.sgml create mode 100644 doc/public/tmpl/cairo-surface.sgml create mode 100644 doc/public/tmpl/cairo-svg.sgml create mode 100644 doc/public/tmpl/cairo-text.sgml create mode 100644 doc/public/tmpl/cairo-transforms.sgml create mode 100644 doc/public/tmpl/cairo-types.sgml create mode 100644 doc/public/tmpl/cairo-unused.sgml create mode 100644 doc/public/tmpl/cairo-user-fonts.sgml create mode 100644 doc/public/tmpl/cairo-version.sgml create mode 100644 doc/public/tmpl/cairo-win32-fonts.sgml create mode 100644 doc/public/tmpl/cairo-win32.sgml create mode 100644 doc/public/tmpl/cairo-xcb.sgml create mode 100644 doc/public/tmpl/cairo-xlib-xrender.sgml create mode 100644 doc/public/tmpl/cairo-xlib.sgml create mode 100644 doc/public/tmpl/cairo.sgml create mode 100644 doc/public/version.xml create mode 100644 doc/public/xml/api-index-1.0.xml create mode 100644 doc/public/xml/api-index-1.10.xml create mode 100644 doc/public/xml/api-index-1.12.xml create mode 100644 doc/public/xml/api-index-1.14.xml create mode 100644 doc/public/xml/api-index-1.2.xml create mode 100644 doc/public/xml/api-index-1.4.xml create mode 100644 doc/public/xml/api-index-1.6.xml create mode 100644 doc/public/xml/api-index-1.8.xml create mode 100644 doc/public/xml/api-index-TBD.xml create mode 100644 doc/public/xml/api-index-deprecated.xml create mode 100644 doc/public/xml/api-index-full.xml create mode 100644 doc/public/xml/cairo-device.xml create mode 100644 doc/public/xml/cairo-font-face.xml create mode 100644 doc/public/xml/cairo-font-options.xml create mode 100644 doc/public/xml/cairo-ft.xml create mode 100644 doc/public/xml/cairo-image.xml create mode 100644 doc/public/xml/cairo-matrix.xml create mode 100644 doc/public/xml/cairo-paths.xml create mode 100644 doc/public/xml/cairo-pattern.xml create mode 100644 doc/public/xml/cairo-pdf.xml create mode 100644 doc/public/xml/cairo-png.xml create mode 100644 doc/public/xml/cairo-ps.xml create mode 100644 doc/public/xml/cairo-quartz-fonts.xml create mode 100644 doc/public/xml/cairo-quartz.xml create mode 100644 doc/public/xml/cairo-raster-source.xml create mode 100644 doc/public/xml/cairo-recording.xml create mode 100644 doc/public/xml/cairo-region.xml create mode 100644 doc/public/xml/cairo-scaled-font.xml create mode 100644 doc/public/xml/cairo-script.xml create mode 100644 doc/public/xml/cairo-skia.xml create mode 100644 doc/public/xml/cairo-status.xml create mode 100644 doc/public/xml/cairo-surface-observer.xml create mode 100644 doc/public/xml/cairo-surface.xml create mode 100644 doc/public/xml/cairo-svg.xml create mode 100644 doc/public/xml/cairo-text.xml create mode 100644 doc/public/xml/cairo-transforms.xml create mode 100644 doc/public/xml/cairo-types.xml create mode 100644 doc/public/xml/cairo-user-fonts.xml create mode 100644 doc/public/xml/cairo-version.xml create mode 100644 doc/public/xml/cairo-win32-fonts.xml create mode 100644 doc/public/xml/cairo-win32.xml create mode 100644 doc/public/xml/cairo-xcb.xml create mode 100644 doc/public/xml/cairo-xlib-xrender.xml create mode 100644 doc/public/xml/cairo-xlib.xml create mode 100644 doc/public/xml/cairo.xml create mode 100644 perf/COPYING create mode 100644 perf/Makefile.am create mode 100644 perf/Makefile.in create mode 100644 perf/Makefile.sources create mode 100644 perf/Makefile.win32 create mode 100644 perf/README create mode 100644 perf/cairo-analyse-trace.c create mode 100644 perf/cairo-perf-chart.c create mode 100644 perf/cairo-perf-compare-backends.c create mode 100755 perf/cairo-perf-diff create mode 100644 perf/cairo-perf-diff-files.c create mode 100644 perf/cairo-perf-graph-files.c create mode 100644 perf/cairo-perf-graph-widget.c create mode 100644 perf/cairo-perf-graph.h create mode 100644 perf/cairo-perf-micro.c create mode 100644 perf/cairo-perf-print.c create mode 100644 perf/cairo-perf-report.c create mode 100644 perf/cairo-perf-trace.c create mode 100644 perf/cairo-perf.c create mode 100644 perf/cairo-perf.h create mode 100644 perf/cairo-stats.c create mode 100644 perf/cairo-stats.h create mode 100644 perf/micro/Makefile.am create mode 100644 perf/micro/Makefile.in create mode 100644 perf/micro/Makefile.sources create mode 100644 perf/micro/a1-curve.c create mode 100644 perf/micro/a1-line.c create mode 100644 perf/micro/box-outline.c create mode 100644 perf/micro/cairo-perf-cover.c create mode 100644 perf/micro/composite-checker.c create mode 100644 perf/micro/curve.c create mode 100644 perf/micro/disjoint.c create mode 100644 perf/micro/dragon.c create mode 100644 perf/micro/fill-clip.c create mode 100644 perf/micro/fill.c create mode 100644 perf/micro/glyphs.c create mode 100644 perf/micro/hash-table.c create mode 100644 perf/micro/hatching.c create mode 100644 perf/micro/intersections.c create mode 100644 perf/micro/line.c create mode 100644 perf/micro/long-dashed-lines.c create mode 100644 perf/micro/long-lines.c create mode 100644 perf/micro/many-curves.c create mode 100644 perf/micro/many-fills.c create mode 100644 perf/micro/many-strokes.c create mode 100644 perf/micro/mask.c create mode 100644 perf/micro/mosaic.c create mode 100644 perf/micro/mosaic.h create mode 100644 perf/micro/paint-with-alpha.c create mode 100644 perf/micro/paint.c create mode 100644 perf/micro/pattern_create_radial.c create mode 100644 perf/micro/pixel.c create mode 100644 perf/micro/pythagoras-tree.c create mode 100644 perf/micro/rectangles.c create mode 100644 perf/micro/rounded-rectangles.c create mode 100644 perf/micro/sierpinski.c create mode 100644 perf/micro/spiral.c create mode 100644 perf/micro/stroke.c create mode 100644 perf/micro/subimage_copy.c create mode 100644 perf/micro/tessellate.c create mode 100644 perf/micro/text.c create mode 100644 perf/micro/tiger.c create mode 100644 perf/micro/twin.c create mode 100644 perf/micro/unaligned-clip.c create mode 100644 perf/micro/wave.c create mode 100644 perf/micro/wide-fills.c create mode 100644 perf/micro/wide-strokes.c create mode 100644 perf/micro/world-map.c create mode 100644 perf/micro/world-map.h create mode 100644 perf/micro/zrusin-another.h create mode 100644 perf/micro/zrusin.c create mode 100644 src/Makefile.am create mode 100644 src/Makefile.am.analysis create mode 100644 src/Makefile.am.features create mode 100644 src/Makefile.in create mode 100644 src/Makefile.sources create mode 100644 src/Makefile.win32 create mode 100644 src/Makefile.win32.features create mode 100644 src/README create mode 100644 src/cairo-analysis-surface-private.h create mode 100644 src/cairo-analysis-surface.c create mode 100644 src/cairo-arc-private.h create mode 100644 src/cairo-arc.c create mode 100644 src/cairo-array-private.h create mode 100644 src/cairo-array.c create mode 100644 src/cairo-atomic-private.h create mode 100644 src/cairo-atomic.c create mode 100644 src/cairo-backend-private.h create mode 100644 src/cairo-base64-stream.c create mode 100644 src/cairo-base85-stream.c create mode 100644 src/cairo-bentley-ottmann-rectangular.c create mode 100644 src/cairo-bentley-ottmann-rectilinear.c create mode 100644 src/cairo-bentley-ottmann.c create mode 100644 src/cairo-beos-surface.cpp create mode 100644 src/cairo-beos.h create mode 100644 src/cairo-botor-scan-converter.c create mode 100644 src/cairo-box-inline.h create mode 100644 src/cairo-boxes-intersect.c create mode 100644 src/cairo-boxes-private.h create mode 100644 src/cairo-boxes.c create mode 100644 src/cairo-cache-private.h create mode 100644 src/cairo-cache.c create mode 100644 src/cairo-cff-subset.c create mode 100644 src/cairo-clip-boxes.c create mode 100644 src/cairo-clip-inline.h create mode 100644 src/cairo-clip-polygon.c create mode 100644 src/cairo-clip-private.h create mode 100644 src/cairo-clip-region.c create mode 100644 src/cairo-clip-surface.c create mode 100644 src/cairo-clip-tor-scan-converter.c create mode 100644 src/cairo-clip.c create mode 100644 src/cairo-cogl-context-private.h create mode 100644 src/cairo-cogl-context.c create mode 100644 src/cairo-cogl-gradient-private.h create mode 100644 src/cairo-cogl-gradient.c create mode 100644 src/cairo-cogl-private.h create mode 100644 src/cairo-cogl-surface.c create mode 100644 src/cairo-cogl-utils-private.h create mode 100644 src/cairo-cogl-utils.c create mode 100644 src/cairo-cogl.h create mode 100644 src/cairo-color.c create mode 100644 src/cairo-combsort-inline.h create mode 100644 src/cairo-compiler-private.h create mode 100644 src/cairo-composite-rectangles-private.h create mode 100644 src/cairo-composite-rectangles.c create mode 100644 src/cairo-compositor-private.h create mode 100644 src/cairo-compositor.c create mode 100644 src/cairo-contour-inline.h create mode 100644 src/cairo-contour-private.h create mode 100644 src/cairo-contour.c create mode 100644 src/cairo-damage-private.h create mode 100644 src/cairo-damage.c create mode 100644 src/cairo-debug.c create mode 100644 src/cairo-default-context-private.h create mode 100644 src/cairo-default-context.c create mode 100644 src/cairo-deflate-stream.c create mode 100644 src/cairo-deprecated.h create mode 100644 src/cairo-device-private.h create mode 100644 src/cairo-device.c create mode 100644 src/cairo-directfb-surface.c create mode 100644 src/cairo-directfb.h create mode 100644 src/cairo-drm.h create mode 100644 src/cairo-egl-context.c create mode 100644 src/cairo-error-inline.h create mode 100644 src/cairo-error-private.h create mode 100644 src/cairo-error.c create mode 100644 src/cairo-fallback-compositor.c create mode 100644 src/cairo-features-uninstalled.pc.in create mode 100644 src/cairo-features.pc.in create mode 100644 src/cairo-fixed-private.h create mode 100644 src/cairo-fixed-type-private.h create mode 100644 src/cairo-fixed.c create mode 100644 src/cairo-font-face-twin-data.c create mode 100644 src/cairo-font-face-twin.c create mode 100644 src/cairo-font-face.c create mode 100644 src/cairo-font-options.c create mode 100644 src/cairo-fontconfig-private.h create mode 100644 src/cairo-freed-pool-private.h create mode 100644 src/cairo-freed-pool.c create mode 100644 src/cairo-freelist-private.h create mode 100644 src/cairo-freelist-type-private.h create mode 100644 src/cairo-freelist.c create mode 100644 src/cairo-ft-font.c create mode 100644 src/cairo-ft-private.h create mode 100644 src/cairo-ft.h create mode 100644 src/cairo-gl-composite.c create mode 100644 src/cairo-gl-device.c create mode 100644 src/cairo-gl-dispatch-private.h create mode 100644 src/cairo-gl-dispatch.c create mode 100644 src/cairo-gl-ext-def-private.h create mode 100644 src/cairo-gl-glyphs.c create mode 100644 src/cairo-gl-gradient-private.h create mode 100644 src/cairo-gl-gradient.c create mode 100644 src/cairo-gl-info.c create mode 100644 src/cairo-gl-msaa-compositor.c create mode 100644 src/cairo-gl-operand.c create mode 100644 src/cairo-gl-private.h create mode 100644 src/cairo-gl-shaders.c create mode 100644 src/cairo-gl-source.c create mode 100644 src/cairo-gl-spans-compositor.c create mode 100644 src/cairo-gl-surface.c create mode 100644 src/cairo-gl-traps-compositor.c create mode 100644 src/cairo-gl.h create mode 100644 src/cairo-glx-context.c create mode 100644 src/cairo-gstate-private.h create mode 100644 src/cairo-gstate.c create mode 100644 src/cairo-hash-private.h create mode 100644 src/cairo-hash.c create mode 100644 src/cairo-hull.c create mode 100644 src/cairo-image-compositor.c create mode 100644 src/cairo-image-info-private.h create mode 100644 src/cairo-image-info.c create mode 100644 src/cairo-image-source.c create mode 100644 src/cairo-image-surface-inline.h create mode 100644 src/cairo-image-surface-private.h create mode 100644 src/cairo-image-surface.c create mode 100644 src/cairo-line-inline.h create mode 100644 src/cairo-line-private.h create mode 100644 src/cairo-line.c create mode 100644 src/cairo-list-inline.h create mode 100644 src/cairo-list-private.h create mode 100644 src/cairo-lzw.c create mode 100644 src/cairo-malloc-private.h create mode 100644 src/cairo-mask-compositor.c create mode 100644 src/cairo-matrix.c create mode 100644 src/cairo-mempool-private.h create mode 100644 src/cairo-mempool.c create mode 100644 src/cairo-mesh-pattern-rasterizer.c create mode 100644 src/cairo-misc.c create mode 100644 src/cairo-mono-scan-converter.c create mode 100644 src/cairo-mutex-impl-private.h create mode 100644 src/cairo-mutex-list-private.h create mode 100644 src/cairo-mutex-private.h create mode 100644 src/cairo-mutex-type-private.h create mode 100644 src/cairo-mutex.c create mode 100644 src/cairo-no-compositor.c create mode 100644 src/cairo-observer.c create mode 100644 src/cairo-os2-private.h create mode 100644 src/cairo-os2-surface.c create mode 100644 src/cairo-os2.h create mode 100644 src/cairo-output-stream-private.h create mode 100644 src/cairo-output-stream.c create mode 100644 src/cairo-paginated-private.h create mode 100644 src/cairo-paginated-surface-private.h create mode 100644 src/cairo-paginated-surface.c create mode 100644 src/cairo-path-bounds.c create mode 100644 src/cairo-path-fill.c create mode 100644 src/cairo-path-fixed-private.h create mode 100644 src/cairo-path-fixed.c create mode 100644 src/cairo-path-in-fill.c create mode 100644 src/cairo-path-private.h create mode 100644 src/cairo-path-stroke-boxes.c create mode 100644 src/cairo-path-stroke-polygon.c create mode 100644 src/cairo-path-stroke-traps.c create mode 100644 src/cairo-path-stroke-tristrip.c create mode 100644 src/cairo-path-stroke.c create mode 100644 src/cairo-path.c create mode 100644 src/cairo-pattern-inline.h create mode 100644 src/cairo-pattern-private.h create mode 100644 src/cairo-pattern.c create mode 100644 src/cairo-pdf-operators-private.h create mode 100644 src/cairo-pdf-operators.c create mode 100644 src/cairo-pdf-shading-private.h create mode 100644 src/cairo-pdf-shading.c create mode 100644 src/cairo-pdf-surface-private.h create mode 100644 src/cairo-pdf-surface.c create mode 100644 src/cairo-pdf.h create mode 100644 src/cairo-pen.c create mode 100644 src/cairo-pixman-private.h create mode 100644 src/cairo-png.c create mode 100644 src/cairo-polygon-intersect.c create mode 100644 src/cairo-polygon-reduce.c create mode 100644 src/cairo-polygon.c create mode 100644 src/cairo-private.h create mode 100644 src/cairo-ps-surface-private.h create mode 100644 src/cairo-ps-surface.c create mode 100644 src/cairo-ps.h create mode 100644 src/cairo-qt-surface.cpp create mode 100644 src/cairo-qt.h create mode 100644 src/cairo-quartz-font.c create mode 100644 src/cairo-quartz-image-surface.c create mode 100644 src/cairo-quartz-image.h create mode 100644 src/cairo-quartz-private.h create mode 100644 src/cairo-quartz-surface.c create mode 100644 src/cairo-quartz.h create mode 100644 src/cairo-raster-source-pattern.c create mode 100644 src/cairo-recording-surface-inline.h create mode 100644 src/cairo-recording-surface-private.h create mode 100644 src/cairo-recording-surface.c create mode 100644 src/cairo-rectangle.c create mode 100644 src/cairo-rectangular-scan-converter.c create mode 100644 src/cairo-reference-count-private.h create mode 100644 src/cairo-region-private.h create mode 100644 src/cairo-region.c create mode 100644 src/cairo-rtree-private.h create mode 100644 src/cairo-rtree.c create mode 100644 src/cairo-scaled-font-private.h create mode 100644 src/cairo-scaled-font-subsets-private.h create mode 100644 src/cairo-scaled-font-subsets.c create mode 100644 src/cairo-scaled-font.c create mode 100644 src/cairo-script-private.h create mode 100644 src/cairo-script-surface.c create mode 100644 src/cairo-script.h create mode 100644 src/cairo-shape-mask-compositor.c create mode 100644 src/cairo-skia.h create mode 100644 src/cairo-slope-private.h create mode 100644 src/cairo-slope.c create mode 100644 src/cairo-spans-compositor-private.h create mode 100644 src/cairo-spans-compositor.c create mode 100644 src/cairo-spans-private.h create mode 100644 src/cairo-spans.c create mode 100644 src/cairo-spline.c create mode 100644 src/cairo-stroke-dash-private.h create mode 100644 src/cairo-stroke-dash.c create mode 100644 src/cairo-stroke-style.c create mode 100644 src/cairo-surface-backend-private.h create mode 100644 src/cairo-surface-clipper-private.h create mode 100644 src/cairo-surface-clipper.c create mode 100644 src/cairo-surface-fallback-private.h create mode 100644 src/cairo-surface-fallback.c create mode 100644 src/cairo-surface-inline.h create mode 100644 src/cairo-surface-observer-inline.h create mode 100644 src/cairo-surface-observer-private.h create mode 100644 src/cairo-surface-observer.c create mode 100644 src/cairo-surface-offset-private.h create mode 100644 src/cairo-surface-offset.c create mode 100644 src/cairo-surface-private.h create mode 100644 src/cairo-surface-snapshot-inline.h create mode 100644 src/cairo-surface-snapshot-private.h create mode 100644 src/cairo-surface-snapshot.c create mode 100644 src/cairo-surface-subsurface-inline.h create mode 100644 src/cairo-surface-subsurface-private.h create mode 100644 src/cairo-surface-subsurface.c create mode 100644 src/cairo-surface-wrapper-private.h create mode 100644 src/cairo-surface-wrapper.c create mode 100644 src/cairo-surface.c create mode 100644 src/cairo-svg-surface-private.h create mode 100644 src/cairo-svg-surface.c create mode 100644 src/cairo-svg.h create mode 100644 src/cairo-tee-surface-private.h create mode 100644 src/cairo-tee-surface.c create mode 100644 src/cairo-tee.h create mode 100644 src/cairo-time-private.h create mode 100644 src/cairo-time.c create mode 100644 src/cairo-tor-scan-converter.c create mode 100644 src/cairo-tor22-scan-converter.c create mode 100644 src/cairo-toy-font-face.c create mode 100644 src/cairo-traps-compositor.c create mode 100644 src/cairo-traps-private.h create mode 100644 src/cairo-traps.c create mode 100644 src/cairo-tristrip-private.h create mode 100644 src/cairo-tristrip.c create mode 100644 src/cairo-truetype-subset-private.h create mode 100644 src/cairo-truetype-subset.c create mode 100644 src/cairo-type1-fallback.c create mode 100644 src/cairo-type1-glyph-names.c create mode 100644 src/cairo-type1-private.h create mode 100644 src/cairo-type1-subset.c create mode 100644 src/cairo-type3-glyph-surface-private.h create mode 100644 src/cairo-type3-glyph-surface.c create mode 100644 src/cairo-types-private.h create mode 100644 src/cairo-unicode.c create mode 100644 src/cairo-uninstalled.pc.in create mode 100644 src/cairo-user-font-private.h create mode 100644 src/cairo-user-font.c create mode 100644 src/cairo-version.c create mode 100644 src/cairo-version.h create mode 100644 src/cairo-vg-surface.c create mode 100644 src/cairo-vg.h create mode 100644 src/cairo-wgl-context.c create mode 100644 src/cairo-wideint-private.h create mode 100644 src/cairo-wideint-type-private.h create mode 100644 src/cairo-wideint.c create mode 100644 src/cairo-win32.h create mode 100644 src/cairo-xcb-connection-core.c create mode 100644 src/cairo-xcb-connection-render.c create mode 100644 src/cairo-xcb-connection-shm.c create mode 100644 src/cairo-xcb-connection.c create mode 100644 src/cairo-xcb-private.h create mode 100644 src/cairo-xcb-resources.c create mode 100644 src/cairo-xcb-screen.c create mode 100644 src/cairo-xcb-shm.c create mode 100644 src/cairo-xcb-surface-core.c create mode 100644 src/cairo-xcb-surface-render.c create mode 100644 src/cairo-xcb-surface.c create mode 100644 src/cairo-xcb.h create mode 100644 src/cairo-xlib-core-compositor.c create mode 100644 src/cairo-xlib-display.c create mode 100644 src/cairo-xlib-fallback-compositor.c create mode 100644 src/cairo-xlib-private.h create mode 100644 src/cairo-xlib-render-compositor.c create mode 100644 src/cairo-xlib-screen.c create mode 100644 src/cairo-xlib-source.c create mode 100644 src/cairo-xlib-surface-private.h create mode 100644 src/cairo-xlib-surface-shm.c create mode 100644 src/cairo-xlib-surface.c create mode 100644 src/cairo-xlib-visual.c create mode 100644 src/cairo-xlib-xcb-surface.c create mode 100644 src/cairo-xlib-xrender-private.h create mode 100644 src/cairo-xlib-xrender.h create mode 100644 src/cairo-xlib.h create mode 100644 src/cairo-xml-surface.c create mode 100644 src/cairo-xml.h create mode 100644 src/cairo.c create mode 100644 src/cairo.h create mode 100644 src/cairo.pc.in create mode 100644 src/cairoint.h create mode 100755 src/check-def.sh create mode 100644 src/check-doc-syntax.awk create mode 100755 src/check-doc-syntax.sh create mode 100644 src/check-has-hidden-symbols.c create mode 100755 src/check-headers.sh create mode 100644 src/check-link.c create mode 100755 src/check-plt.sh create mode 100755 src/check-preprocessor-syntax.sh create mode 100644 src/drm/cairo-drm-bo.c create mode 100644 src/drm/cairo-drm-gallium-surface.c create mode 100644 src/drm/cairo-drm-i915-glyphs.c create mode 100644 src/drm/cairo-drm-i915-private.h create mode 100644 src/drm/cairo-drm-i915-shader.c create mode 100644 src/drm/cairo-drm-i915-spans.c create mode 100644 src/drm/cairo-drm-i915-surface.c create mode 100644 src/drm/cairo-drm-i965-glyphs.c create mode 100644 src/drm/cairo-drm-i965-private.h create mode 100644 src/drm/cairo-drm-i965-shader.c create mode 100644 src/drm/cairo-drm-i965-spans.c create mode 100644 src/drm/cairo-drm-i965-surface.c create mode 100644 src/drm/cairo-drm-intel-brw-defines.h create mode 100644 src/drm/cairo-drm-intel-brw-eu-emit.c create mode 100644 src/drm/cairo-drm-intel-brw-eu-util.c create mode 100644 src/drm/cairo-drm-intel-brw-eu.c create mode 100644 src/drm/cairo-drm-intel-brw-eu.h create mode 100644 src/drm/cairo-drm-intel-brw-structs.h create mode 100644 src/drm/cairo-drm-intel-command-private.h create mode 100644 src/drm/cairo-drm-intel-debug.c create mode 100644 src/drm/cairo-drm-intel-ioctl-private.h create mode 100644 src/drm/cairo-drm-intel-private.h create mode 100644 src/drm/cairo-drm-intel-surface.c create mode 100644 src/drm/cairo-drm-intel.c create mode 100644 src/drm/cairo-drm-ioctl-private.h create mode 100644 src/drm/cairo-drm-private.h create mode 100644 src/drm/cairo-drm-radeon-private.h create mode 100644 src/drm/cairo-drm-radeon-surface.c create mode 100644 src/drm/cairo-drm-radeon.c create mode 100644 src/drm/cairo-drm-surface.c create mode 100644 src/drm/cairo-drm.c create mode 100644 src/skia/cairo-skia-context.cpp create mode 100644 src/skia/cairo-skia-private.h create mode 100644 src/skia/cairo-skia-surface.cpp create mode 100644 src/test-base-compositor-surface.c create mode 100644 src/test-compositor-surface-private.h create mode 100644 src/test-compositor-surface.c create mode 100644 src/test-compositor-surface.h create mode 100644 src/test-null-compositor-surface.c create mode 100644 src/test-null-compositor-surface.h create mode 100644 src/test-paginated-surface.c create mode 100644 src/test-paginated-surface.h create mode 100644 src/win32/cairo-win32-debug.c create mode 100644 src/win32/cairo-win32-device.c create mode 100644 src/win32/cairo-win32-display-surface.c create mode 100644 src/win32/cairo-win32-font.c create mode 100644 src/win32/cairo-win32-gdi-compositor.c create mode 100644 src/win32/cairo-win32-printing-surface.c create mode 100644 src/win32/cairo-win32-private.h create mode 100644 src/win32/cairo-win32-surface.c create mode 100644 src/win32/cairo-win32-system.c create mode 100644 test/6x13.pcf create mode 100644 test/COPYING create mode 100644 test/Makefile.am create mode 100644 test/Makefile.in create mode 100644 test/Makefile.sources create mode 100644 test/Makefile.win32 create mode 100644 test/README create mode 100644 test/a1-bug.c create mode 100644 test/a1-clip.c create mode 100644 test/a1-fill.c create mode 100644 test/a1-image-sample.c create mode 100644 test/a1-mask-sample.c create mode 100644 test/a1-mask.c create mode 100644 test/a1-rasterisation.c create mode 100644 test/a1-sample.c create mode 100644 test/a1-traps-sample.c create mode 100644 test/a8-clear.c create mode 100644 test/a8-mask.c create mode 100644 test/aliasing.c create mode 100644 test/alpha-similar.c create mode 100644 test/any2ppm.c create mode 100644 test/api-special-cases.c create mode 100644 test/arc-direction.c create mode 100644 test/arc-infinite-loop.c create mode 100644 test/arc-looping-dash.c create mode 100644 test/big-empty-box.c create mode 100644 test/big-empty-triangle.c create mode 100644 test/big-line.c create mode 100644 test/big-little-box.c create mode 100644 test/big-little-triangle.c create mode 100644 test/big-trap.c create mode 100644 test/bilevel-image.c create mode 100644 test/bitmap-font.c create mode 100644 test/buffer-diff.c create mode 100644 test/buffer-diff.h create mode 100644 test/bug-40410.c create mode 100644 test/bug-51910.c create mode 100644 test/bug-84115.c create mode 100644 test/bug-bo-collins.c create mode 100644 test/bug-bo-rectangular.c create mode 100644 test/bug-bo-ricotz.c create mode 100644 test/bug-extents.c create mode 100644 test/bug-seams.c create mode 100644 test/bug-source-cu.c create mode 100644 test/bug-spline.c create mode 100644 test/cairo-test-constructors.c create mode 100644 test/cairo-test-private.h create mode 100644 test/cairo-test-runner.c create mode 100644 test/cairo-test-trace.c create mode 100644 test/cairo-test.c create mode 100644 test/cairo-test.h create mode 100644 test/caps-joins-alpha.c create mode 100644 test/caps-joins-curve.c create mode 100644 test/caps-joins.c create mode 100644 test/caps-sub-paths.c create mode 100644 test/caps-tails-curve.c create mode 100644 test/caps.c create mode 100755 test/check-refs.sh create mode 100644 test/checkerboard.c create mode 100644 test/clear-source.c create mode 100644 test/clear.c create mode 100644 test/clip-all.c create mode 100644 test/clip-complex-bug61592.c create mode 100644 test/clip-complex-shape.c create mode 100644 test/clip-contexts.c create mode 100644 test/clip-device-offset.c create mode 100644 test/clip-disjoint-hatching.c create mode 100644 test/clip-disjoint-quad.c create mode 100644 test/clip-disjoint.c create mode 100644 test/clip-double-free.c create mode 100644 test/clip-draw-unbounded.c create mode 100644 test/clip-empty-group.c create mode 100644 test/clip-empty-save.c create mode 100644 test/clip-empty.c create mode 100644 test/clip-fill-no-op.c create mode 100644 test/clip-fill-rule-pixel-aligned.c create mode 100644 test/clip-fill-rule.c create mode 100644 test/clip-fill.c create mode 100644 test/clip-group-shapes.c create mode 100644 test/clip-image.c create mode 100644 test/clip-intersect.c create mode 100644 test/clip-mixed-antialias.c create mode 100644 test/clip-nesting.c create mode 100644 test/clip-operator.c create mode 100644 test/clip-polygons.c create mode 100644 test/clip-push-group.c create mode 100644 test/clip-rectilinear.c create mode 100644 test/clip-shape.c create mode 100644 test/clip-stroke-no-op.c create mode 100644 test/clip-stroke.c create mode 100644 test/clip-text.c create mode 100644 test/clip-twice-rectangle.c create mode 100644 test/clip-twice.c create mode 100644 test/clip-unbounded.c create mode 100644 test/clip-zero.c create mode 100644 test/clipped-group.c create mode 100644 test/clipped-surface.c create mode 100644 test/close-path-current-point.c create mode 100644 test/close-path.c create mode 100644 test/composite-integer-translate-over-repeat.c create mode 100644 test/composite-integer-translate-over.c create mode 100644 test/composite-integer-translate-source.c create mode 100644 test/copy-disjoint.c create mode 100644 test/copy-path.c create mode 100644 test/coverage.c create mode 100644 test/create-for-stream.c create mode 100644 test/create-from-png-stream.c create mode 100644 test/create-from-png.c create mode 100644 test/culled-glyphs.c create mode 100644 test/curve-to-as-line-to.c create mode 100644 test/dash-caps-joins.c create mode 100644 test/dash-curve.c create mode 100644 test/dash-infinite-loop.c create mode 100644 test/dash-no-dash.c create mode 100644 test/dash-offset-negative.c create mode 100644 test/dash-offset.c create mode 100644 test/dash-scale.c create mode 100644 test/dash-state.c create mode 100644 test/dash-zero-length.c create mode 100644 test/degenerate-arc.c create mode 100644 test/degenerate-arcs.c create mode 100644 test/degenerate-curve-to.c create mode 100644 test/degenerate-dash.c create mode 100644 test/degenerate-linear-gradient.c create mode 100644 test/degenerate-path.c create mode 100644 test/degenerate-pen.c create mode 100644 test/degenerate-radial-gradient.c create mode 100644 test/degenerate-rel-curve-to.c create mode 100644 test/degenerate-solid-dash.c create mode 100644 test/device-offset-fractional.c create mode 100644 test/device-offset-positive.c create mode 100644 test/device-offset-scale.c create mode 100644 test/device-offset.c create mode 100644 test/drunkard-tails.c create mode 100644 test/egl-oversized-surface.c create mode 100644 test/egl-surface-source.c create mode 100644 test/error-setters.c create mode 100644 test/extend-pad-border.c create mode 100644 test/extend-pad-similar.c create mode 100644 test/extend-pad.c create mode 100644 test/extend-reflect-similar.c create mode 100644 test/extend-reflect.c create mode 100644 test/extend-repeat-similar.c create mode 100644 test/extend-repeat.c create mode 100644 test/extended-blend.c create mode 100644 test/fallback-resolution.c create mode 100644 test/fallback.c create mode 100644 test/fill-alpha-pattern.c create mode 100644 test/fill-alpha.c create mode 100644 test/fill-and-stroke-alpha-add.c create mode 100644 test/fill-and-stroke-alpha.c create mode 100644 test/fill-and-stroke.c create mode 100644 test/fill-degenerate-sort-order.c create mode 100644 test/fill-disjoint.c create mode 100644 test/fill-empty.c create mode 100644 test/fill-image.c create mode 100644 test/fill-missed-stop.c create mode 100644 test/fill-rule.c create mode 100644 test/filter-bilinear-extents.c create mode 100644 test/filter-nearest-offset.c create mode 100644 test/filter-nearest-transformed.c create mode 100644 test/finer-grained-fallbacks.c create mode 100644 test/font-face-get-type.c create mode 100644 test/font-matrix-translation.c create mode 100644 test/font-options.c create mode 100644 test/ft-font-create-for-ft-face.c create mode 100644 test/ft-show-glyphs-positioning.c create mode 100644 test/ft-show-glyphs-table.c create mode 100644 test/ft-text-antialias-none.c create mode 100644 test/ft-text-vertical-layout-type1.c create mode 100644 test/ft-text-vertical-layout-type3.c create mode 100755 test/generate_refs.sh create mode 100644 test/get-and-set.c create mode 100644 test/get-clip.c create mode 100644 test/get-group-target.c create mode 100644 test/get-path-extents.c create mode 100644 test/get-xrender-format.c create mode 100644 test/gl-device-release.c create mode 100644 test/gl-oversized-surface.c create mode 100644 test/gl-surface-source.c create mode 100644 test/glyph-cache-pressure.c create mode 100644 test/gradient-alpha.c create mode 100644 test/gradient-constant-alpha.c create mode 100644 test/gradient-zero-stops-mask.c create mode 100644 test/gradient-zero-stops.c create mode 100644 test/group-clip.c create mode 100644 test/group-paint.c create mode 100644 test/group-state.c create mode 100644 test/group-unaligned.c create mode 100644 test/half-coverage.c create mode 100644 test/halo.c create mode 100644 test/hatchings.c create mode 100644 test/horizontal-clip.c create mode 100644 test/huge-linear.c create mode 100644 test/huge-radial.c create mode 100644 test/image-bug-710072.c create mode 100644 test/image-surface-source.c create mode 100644 test/imagediff.c create mode 100644 test/implicit-close.c create mode 100644 test/in-fill-empty-trapezoid.c create mode 100644 test/in-fill-trapezoid.c create mode 100644 test/index.html create mode 100644 test/infinite-join.c create mode 100644 test/invalid-matrix.c create mode 100644 test/inverse-text.c create mode 100644 test/inverted-clip.c create mode 100644 test/joins-loop.c create mode 100644 test/joins-retrace.c create mode 100644 test/joins-star.c create mode 100644 test/joins.c create mode 100644 test/jp2.jp2 create mode 100644 test/jpeg.jpg create mode 100644 test/large-clip.c create mode 100644 test/large-font.c create mode 100644 test/large-source-roi.c create mode 100644 test/large-source.c create mode 100644 test/large-twin-antialias-mixed.c create mode 100644 test/leaky-dash.c create mode 100644 test/leaky-dashed-rectangle.c create mode 100644 test/leaky-dashed-stroke.c create mode 100644 test/leaky-polygon.c create mode 100644 test/line-width-large-overlap.c create mode 100644 test/line-width-overlap.c create mode 100644 test/line-width-scale.c create mode 100644 test/line-width-tolerance.c create mode 100644 test/line-width-zero.c create mode 100644 test/line-width.c create mode 100644 test/linear-gradient-extend.c create mode 100644 test/linear-gradient-large.c create mode 100644 test/linear-gradient-one-stop.c create mode 100644 test/linear-gradient-reflect.c create mode 100644 test/linear-gradient-subset.c create mode 100644 test/linear-gradient.c create mode 100644 test/linear-step-function.c create mode 100644 test/linear-uniform.c create mode 100644 test/long-dashed-lines.c create mode 100644 test/long-lines.c create mode 100644 test/make-cairo-test-constructors.sh create mode 100644 test/map-to-image.c create mode 100644 test/mask-alpha.c create mode 100644 test/mask-ctm.c create mode 100644 test/mask-glyphs.c create mode 100644 test/mask-surface-ctm.c create mode 100644 test/mask-transformed-image.c create mode 100644 test/mask-transformed-similar.c create mode 100644 test/mask.c create mode 100644 test/mesh-pattern-accuracy.c create mode 100644 test/mesh-pattern-conical.c create mode 100644 test/mesh-pattern-control-points.c create mode 100644 test/mesh-pattern-fold.c create mode 100644 test/mesh-pattern-overlap.c create mode 100644 test/mesh-pattern-transformed.c create mode 100644 test/mesh-pattern.c create mode 100644 test/mime-data.c create mode 100644 test/mime-surface-api.c create mode 100644 test/miter-precision.c create mode 100644 test/move-to-show-surface.c create mode 100644 test/multi-page.c create mode 100644 test/negative-stride-image.c create mode 100644 test/new-sub-path.c create mode 100644 test/nil-surface.c create mode 100644 test/operator-alpha-alpha.c create mode 100644 test/operator-alpha.c create mode 100644 test/operator-clear.c create mode 100644 test/operator-source.c create mode 100644 test/operator.c create mode 100644 test/outline-tolerance.c create mode 100644 test/over-above-source.c create mode 100644 test/over-around-source.c create mode 100644 test/over-below-source.c create mode 100644 test/over-between-source.c create mode 100644 test/overlapping-boxes.c create mode 100644 test/overlapping-dash-caps.c create mode 100644 test/overlapping-glyphs.c create mode 100644 test/paint-clip-fill.c create mode 100644 test/paint-repeat.c create mode 100644 test/paint-source-alpha.c create mode 100644 test/paint-with-alpha-group-clip.c create mode 100644 test/paint-with-alpha.c create mode 100644 test/paint.c create mode 100644 test/partial-clip-text.c create mode 100644 test/partial-coverage.c create mode 100644 test/pass-through.c create mode 100644 test/path-append.c create mode 100644 test/path-currentpoint.c create mode 100644 test/path-precision.c create mode 100644 test/path-stroke-twice.c create mode 100644 test/pattern-get-type.c create mode 100644 test/pattern-getters.c create mode 100644 test/pdf-features.c create mode 100644 test/pdf-isolated-group.c create mode 100644 test/pdf-mime-data.c create mode 100644 test/pdf-surface-source.c create mode 100644 test/pdf2png.c create mode 100644 test/pdiff/Makefile.am create mode 100644 test/pdiff/Makefile.in create mode 100644 test/pdiff/args.c create mode 100644 test/pdiff/args.h create mode 100644 test/pdiff/gpl.txt create mode 100644 test/pdiff/lpyramid.c create mode 100644 test/pdiff/lpyramid.h create mode 100644 test/pdiff/pdiff.c create mode 100644 test/pdiff/pdiff.h create mode 100644 test/pdiff/perceptualdiff.c create mode 100644 test/pixman-downscale.c create mode 100644 test/pixman-rotate.c create mode 100644 test/png-flatten.c create mode 100644 test/png.c create mode 100644 test/png.png create mode 100644 test/ps-eps.c create mode 100644 test/ps-features.c create mode 100644 test/ps-surface-source.c create mode 100644 test/ps2png.c create mode 100644 test/pthread-same-source.c create mode 100644 test/pthread-show-text.c create mode 100644 test/pthread-similar.c create mode 100644 test/push-group-color.c create mode 100644 test/push-group-path-offset.c create mode 100644 test/push-group.c create mode 100644 test/quartz-surface-source.c create mode 100644 test/radial-gradient-extend.c create mode 100644 test/radial-gradient.c create mode 100644 test/radial-outer-focus.c create mode 100644 test/random-clips.c create mode 100644 test/random-intersections-curves-eo.c create mode 100644 test/random-intersections-curves-nz.c create mode 100644 test/random-intersections-eo.c create mode 100644 test/random-intersections-nonzero.c create mode 100644 test/raster-source.c create mode 100644 test/record-extend.c create mode 100644 test/record-mesh.c create mode 100644 test/record.c create mode 100644 test/record1414x.c create mode 100644 test/record2x.c create mode 100644 test/record90.c create mode 100644 test/recordflip.c create mode 100644 test/recording-surface-extend.c create mode 100644 test/recording-surface-pattern.c create mode 100644 test/rectangle-rounding-error.c create mode 100644 test/rectilinear-dash-scale.c create mode 100644 test/rectilinear-dash.c create mode 100644 test/rectilinear-fill.c create mode 100644 test/rectilinear-grid.c create mode 100644 test/rectilinear-miter-limit.c create mode 100644 test/rectilinear-stroke.c create mode 100644 test/reference/a1-bug.base.argb32.ref.png create mode 100644 test/reference/a1-bug.base.rgb24.ref.png create mode 100644 test/reference/a1-bug.image16.ref.png create mode 100644 test/reference/a1-bug.mask.argb32.ref.png create mode 100644 test/reference/a1-bug.mask.rgb24.ref.png create mode 100644 test/reference/a1-bug.quartz.xfail.png create mode 100644 test/reference/a1-bug.ref.png create mode 100644 test/reference/a1-bug.traps.argb32.ref.png create mode 100644 test/reference/a1-bug.traps.rgb24.ref.png create mode 100644 test/reference/a1-clip-fill-equal.base.argb32.ref.png create mode 100644 test/reference/a1-clip-fill-equal.base.rgb24.ref.png create mode 100644 test/reference/a1-clip-fill-equal.ref.png create mode 100644 test/reference/a1-clip-fill-rule.base.argb32.ref.png create mode 100644 test/reference/a1-clip-fill-rule.base.rgb24.ref.png create mode 100644 test/reference/a1-clip-fill-rule.ref.png create mode 100644 test/reference/a1-clip-fill.base.argb32.ref.png create mode 100644 test/reference/a1-clip-fill.base.rgb24.ref.png create mode 100644 test/reference/a1-clip-fill.ref.png create mode 100644 test/reference/a1-clip-paint.base.argb32.ref.png create mode 100644 test/reference/a1-clip-paint.base.rgb24.ref.png create mode 100644 test/reference/a1-clip-paint.ref.png create mode 100644 test/reference/a1-clip-stroke.base.argb32.ref.png create mode 100644 test/reference/a1-clip-stroke.base.rgb24.ref.png create mode 100644 test/reference/a1-clip-stroke.ref.png create mode 100644 test/reference/a1-fill.base.argb32.ref.png create mode 100644 test/reference/a1-fill.base.rgb24.ref.png create mode 100644 test/reference/a1-fill.ref.png create mode 100644 test/reference/a1-image-sample.base.argb32.ref.png create mode 100644 test/reference/a1-image-sample.base.rgb24.ref.png create mode 100644 test/reference/a1-image-sample.gl.xfail.png create mode 100644 test/reference/a1-image-sample.ref.png create mode 100644 test/reference/a1-line-width.base.argb32.ref.png create mode 100644 test/reference/a1-line-width.base.rgb24.ref.png create mode 100644 test/reference/a1-line-width.pdf.ref.png create mode 100644 test/reference/a1-line-width.ps.ref.png create mode 100644 test/reference/a1-line-width.ref.png create mode 100644 test/reference/a1-mask-sample.base.argb32.ref.png create mode 100644 test/reference/a1-mask-sample.base.rgb24.ref.png create mode 100644 test/reference/a1-mask-sample.ref.png create mode 100644 test/reference/a1-mask.base.argb32.ref.png create mode 100644 test/reference/a1-mask.base.rgb24.ref.png create mode 100644 test/reference/a1-mask.ref.png create mode 100644 test/reference/a1-rasterisation-rectangles.base.argb32.ref.png create mode 100644 test/reference/a1-rasterisation-rectangles.base.rgb24.ref.png create mode 100644 test/reference/a1-rasterisation-rectangles.quartz.xfail.png create mode 100644 test/reference/a1-rasterisation-rectangles.ref.png create mode 100644 test/reference/a1-rasterisation-triangles.base.argb32.ref.png create mode 100644 test/reference/a1-rasterisation-triangles.base.rgb24.ref.png create mode 100644 test/reference/a1-rasterisation-triangles.quartz.xfail.png create mode 100644 test/reference/a1-rasterisation-triangles.ref.png create mode 100644 test/reference/a1-rectilinear-grid.base.argb32.ref.png create mode 100644 test/reference/a1-rectilinear-grid.base.rgb24.ref.png create mode 100644 test/reference/a1-rectilinear-grid.ref.png create mode 100644 test/reference/a1-sample.base.argb32.ref.png create mode 100644 test/reference/a1-sample.base.rgb24.ref.png create mode 100644 test/reference/a1-sample.ref.png create mode 100644 test/reference/a1-tiger.base.argb32.ref.png create mode 100644 test/reference/a1-tiger.base.rgb24.ref.png create mode 100644 test/reference/a1-tiger.mask.argb32.ref.png create mode 100644 test/reference/a1-tiger.mask.rgb24.ref.png create mode 100644 test/reference/a1-tiger.ref.png create mode 100644 test/reference/a1-tiger.traps.argb32.ref.png create mode 100644 test/reference/a1-tiger.traps.rgb24.ref.png create mode 100644 test/reference/a1-traps-sample.base.argb32.ref.png create mode 100644 test/reference/a1-traps-sample.base.rgb24.ref.png create mode 100644 test/reference/a1-traps-sample.quartz.xfail.png create mode 100644 test/reference/a1-traps-sample.ref.png create mode 100644 test/reference/a8-clear.base.argb32.ref.png create mode 100644 test/reference/a8-clear.base.rgb24.ref.png create mode 100644 test/reference/a8-clear.quartz.ref.png create mode 100644 test/reference/a8-clear.ref.png create mode 100644 test/reference/a8-clear.traps.argb32.ref.png create mode 100644 test/reference/a8-clear.traps.rgb24.ref.png create mode 100644 test/reference/a8-mask.base.argb32.ref.png create mode 100644 test/reference/a8-mask.base.rgb24.ref.png create mode 100644 test/reference/a8-mask.ref.png create mode 100644 test/reference/aliasing.base.argb32.ref.png create mode 100644 test/reference/aliasing.base.rgb24.ref.png create mode 100644 test/reference/aliasing.image16.ref.png create mode 100644 test/reference/aliasing.quartz.ref.png create mode 100644 test/reference/aliasing.ref.png create mode 100644 test/reference/aliasing.traps.argb32.ref.png create mode 100644 test/reference/aliasing.traps.rgb24.ref.png create mode 100644 test/reference/alpha-similar.base.argb32.ref.png create mode 100644 test/reference/alpha-similar.base.rgb24.ref.png create mode 100644 test/reference/alpha-similar.gl.argb32.xfail.png create mode 100644 test/reference/alpha-similar.gl.rgb24.xfail.png create mode 100644 test/reference/alpha-similar.pdf.argb32.xfail.png create mode 100644 test/reference/alpha-similar.pdf.rgb24.xfail.png create mode 100644 test/reference/alpha-similar.ps.argb32.xfail.png create mode 100644 test/reference/alpha-similar.ps.rgb24.xfail.png create mode 100644 test/reference/alpha-similar.ref.png create mode 100644 test/reference/alpha-similar.svg.argb32.xfail.png create mode 100644 test/reference/alpha-similar.svg.rgb24.xfail.png create mode 100644 test/reference/api-special-cases.base.argb32.ref.png create mode 100644 test/reference/api-special-cases.base.rgb24.ref.png create mode 100644 test/reference/api-special-cases.ref.png create mode 100644 test/reference/arc-direction.base.argb32.ref.png create mode 100644 test/reference/arc-direction.base.rgb24.ref.png create mode 100644 test/reference/arc-direction.ps.ref.png create mode 100644 test/reference/arc-direction.ref.png create mode 100644 test/reference/arc-direction.traps.ref.png create mode 100644 test/reference/arc-infinite-loop.base.argb32.ref.png create mode 100644 test/reference/arc-infinite-loop.base.rgb24.ref.png create mode 100644 test/reference/arc-infinite-loop.ref.png create mode 100644 test/reference/arc-looping-dash.image16.ref.png create mode 100644 test/reference/arc-looping-dash.mask.argb32.ref.png create mode 100644 test/reference/arc-looping-dash.mask.rgb24.ref.png create mode 100644 test/reference/arc-looping-dash.ps.ref.png create mode 100644 test/reference/arc-looping-dash.quartz.ref.png create mode 100644 test/reference/arc-looping-dash.ref.png create mode 100644 test/reference/arc-looping-dash.traps.argb32.ref.png create mode 100644 test/reference/arc-looping-dash.traps.rgb24.ref.png create mode 100644 test/reference/big-empty-box.base.argb32.ref.png create mode 100644 test/reference/big-empty-box.base.rgb24.ref.png create mode 100644 test/reference/big-empty-box.ref.png create mode 100644 test/reference/big-empty-triangle.base.argb32.ref.png create mode 100644 test/reference/big-empty-triangle.base.rgb24.ref.png create mode 100644 test/reference/big-empty-triangle.ref.png create mode 100644 test/reference/big-line.base.argb32.ref.png create mode 100644 test/reference/big-line.base.rgb24.ref.png create mode 100644 test/reference/big-line.image16.ref.png create mode 100644 test/reference/big-line.ps.ref.png create mode 100644 test/reference/big-line.quartz.ref.png create mode 100644 test/reference/big-line.ref.png create mode 100644 test/reference/big-line.traps.argb32.ref.png create mode 100644 test/reference/big-line.traps.rgb24.ref.png create mode 100644 test/reference/big-little-box.base.argb32.ref.png create mode 100644 test/reference/big-little-box.base.rgb24.ref.png create mode 100644 test/reference/big-little-box.ref.png create mode 100644 test/reference/big-little-triangle.argb32.ref.png create mode 100644 test/reference/big-little-triangle.base.argb32.ref.png create mode 100644 test/reference/big-little-triangle.base.rgb24.ref.png create mode 100644 test/reference/big-little-triangle.rgb24.ref.png create mode 100644 test/reference/big-little-triangle.traps.argb32.ref.png create mode 100644 test/reference/big-little-triangle.traps.rgb24.ref.png create mode 100644 test/reference/big-trap.base.argb32.ref.png create mode 100644 test/reference/big-trap.base.rgb24.ref.png create mode 100644 test/reference/big-trap.mask.argb32.ref.png create mode 100644 test/reference/big-trap.mask.rgb24.ref.png create mode 100644 test/reference/big-trap.traps.argb32.ref.png create mode 100644 test/reference/big-trap.traps.rgb24.ref.png create mode 100644 test/reference/bilevel-image.base.argb32.ref.png create mode 100644 test/reference/bilevel-image.base.rgb24.ref.png create mode 100644 test/reference/bilevel-image.ref.png create mode 100644 test/reference/bilevel-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/bilevel-xlib-window.rgb24.ref.png create mode 100644 test/reference/bilevel-xlib.ref.png create mode 100644 test/reference/bitmap-font.base.argb32.ref.png create mode 100644 test/reference/bitmap-font.base.rgb24.ref.png create mode 100644 test/reference/bitmap-font.ref.png create mode 100644 test/reference/bug-40410.base.argb32.ref.png create mode 100644 test/reference/bug-40410.base.rgb24.ref.png create mode 100644 test/reference/bug-40410.ref.png create mode 100644 test/reference/bug-40410.traps.argb32.ref.png create mode 100644 test/reference/bug-40410.traps.rgb24.ref.png create mode 100644 test/reference/bug-51910.ref.png create mode 100644 test/reference/bug-84115.ref.png create mode 100644 test/reference/bug-84115.xlib.ref.png create mode 100644 test/reference/bug-bo-collins.ref.png create mode 100644 test/reference/bug-bo-rectangular.base.argb32.ref.png create mode 100644 test/reference/bug-bo-rectangular.base.rgb24.ref.png create mode 100644 test/reference/bug-bo-rectangular.image16.ref.png create mode 100644 test/reference/bug-bo-rectangular.ps.xfail.png create mode 100644 test/reference/bug-bo-rectangular.ref.png create mode 100644 test/reference/bug-bo-ricotz.base.argb32.ref.png create mode 100644 test/reference/bug-bo-ricotz.base.rgb24.ref.png create mode 100644 test/reference/bug-bo-ricotz.ref.png create mode 100644 test/reference/bug-bo-ricotz.traps.ref.png create mode 100644 test/reference/bug-extents.base.argb32.ref.png create mode 100644 test/reference/bug-extents.base.rgb24.ref.png create mode 100644 test/reference/bug-extents.image16.ref.png create mode 100644 test/reference/bug-extents.ps.ref.png create mode 100644 test/reference/bug-extents.quartz.ref.png create mode 100644 test/reference/bug-extents.ref.png create mode 100644 test/reference/bug-extents.traps.argb32.ref.png create mode 100644 test/reference/bug-extents.traps.rgb24.ref.png create mode 100644 test/reference/bug-seams.base.argb32.ref.png create mode 100644 test/reference/bug-seams.base.rgb24.ref.png create mode 100644 test/reference/bug-seams.image.xfail.png create mode 100644 test/reference/bug-seams.mask.argb32.ref.png create mode 100644 test/reference/bug-seams.mask.rgb24.ref.png create mode 100644 test/reference/bug-seams.ref.png create mode 100644 test/reference/bug-seams.traps.argb32.ref.png create mode 100644 test/reference/bug-seams.traps.rgb24.ref.png create mode 100644 test/reference/bug-seams.xlib-fallback.ref.png create mode 100644 test/reference/bug-source-cu.ref.png create mode 100644 test/reference/bug-source-cu.traps.argb32.ref.png create mode 100644 test/reference/bug-source-cu.traps.rgb24.ref.png create mode 100644 test/reference/bug-spline.ref.png create mode 100644 test/reference/caps-05.ref.png create mode 100644 test/reference/caps-05.traps.ref.png create mode 100644 test/reference/caps-1.ref.png create mode 100644 test/reference/caps-1.traps.ref.png create mode 100644 test/reference/caps-2.ref.png create mode 100644 test/reference/caps-2.traps.ref.png create mode 100644 test/reference/caps-joins-05.ref.png create mode 100644 test/reference/caps-joins-05.traps.ref.png create mode 100644 test/reference/caps-joins-1.ref.png create mode 100644 test/reference/caps-joins-1.traps.ref.png create mode 100644 test/reference/caps-joins-2.ref.png create mode 100644 test/reference/caps-joins-2.traps.ref.png create mode 100644 test/reference/caps-joins-alpha.image16.ref.png create mode 100644 test/reference/caps-joins-alpha.mask.argb32.ref.png create mode 100644 test/reference/caps-joins-alpha.mask.rgb24.ref.png create mode 100644 test/reference/caps-joins-alpha.quartz.ref.png create mode 100644 test/reference/caps-joins-alpha.ref.png create mode 100644 test/reference/caps-joins-alpha.traps.argb32.ref.png create mode 100644 test/reference/caps-joins-alpha.traps.rgb24.ref.png create mode 100644 test/reference/caps-joins-curve.image16.ref.png create mode 100644 test/reference/caps-joins-curve.mask.argb32.ref.png create mode 100644 test/reference/caps-joins-curve.mask.rgb24.ref.png create mode 100644 test/reference/caps-joins-curve.ps.ref.png create mode 100644 test/reference/caps-joins-curve.quartz.ref.png create mode 100644 test/reference/caps-joins-curve.ref.png create mode 100644 test/reference/caps-joins-curve.traps.argb32.ref.png create mode 100644 test/reference/caps-joins-curve.traps.rgb24.ref.png create mode 100644 test/reference/caps-joins.base.argb32.ref.png create mode 100644 test/reference/caps-joins.base.rgb24.ref.png create mode 100644 test/reference/caps-joins.image16.ref.png create mode 100644 test/reference/caps-joins.ps.ref.png create mode 100644 test/reference/caps-joins.ref.png create mode 100644 test/reference/caps-joins.traps.argb32.ref.png create mode 100644 test/reference/caps-joins.traps.rgb24.ref.png create mode 100644 test/reference/caps-sub-paths.base.argb32.ref.png create mode 100644 test/reference/caps-sub-paths.base.rgb24.ref.png create mode 100644 test/reference/caps-sub-paths.image16.ref.png create mode 100644 test/reference/caps-sub-paths.ps.ref.png create mode 100644 test/reference/caps-sub-paths.ref.png create mode 100644 test/reference/caps-sub-paths.traps.argb32.ref.png create mode 100644 test/reference/caps-sub-paths.traps.rgb24.ref.png create mode 100644 test/reference/caps-tails-curve.mask.argb32.ref.png create mode 100644 test/reference/caps-tails-curve.mask.rgb24.ref.png create mode 100644 test/reference/caps-tails-curve.ps.ref.png create mode 100644 test/reference/caps-tails-curve.ref.png create mode 100644 test/reference/caps-tails-curve.traps.argb32.ref.png create mode 100644 test/reference/caps-tails-curve.traps.rgb24.ref.png create mode 100644 test/reference/caps-tails-curve.xcb.ref.png create mode 100644 test/reference/caps.base.argb32.ref.png create mode 100644 test/reference/caps.base.rgb24.ref.png create mode 100644 test/reference/caps.image16.ref.png create mode 100644 test/reference/caps.ps.ref.png create mode 100644 test/reference/caps.ref.png create mode 100644 test/reference/caps.traps.argb32.ref.png create mode 100644 test/reference/caps.traps.rgb24.ref.png create mode 100644 test/reference/checkerboard.base.argb32.ref.png create mode 100644 test/reference/checkerboard.base.rgb24.ref.png create mode 100644 test/reference/checkerboard.ref.png create mode 100644 test/reference/clear-source.base.argb32.ref.png create mode 100644 test/reference/clear-source.base.rgb24.ref.png create mode 100644 test/reference/clear-source.image16.ref.png create mode 100644 test/reference/clear-source.pdf.xfail.png create mode 100644 test/reference/clear-source.ps.xfail.png create mode 100644 test/reference/clear-source.ref.png create mode 100644 test/reference/clear-source.traps.argb32.ref.png create mode 100644 test/reference/clear-source.traps.rgb24.ref.png create mode 100644 test/reference/clear.argb32.ref.png create mode 100644 test/reference/clear.base.argb32.ref.png create mode 100644 test/reference/clear.base.rgb24.ref.png create mode 100644 test/reference/clear.pdf.argb32.ref.png create mode 100644 test/reference/clear.ps.argb32.ref.png create mode 100644 test/reference/clear.quartz.argb32.ref.png create mode 100644 test/reference/clear.quartz.rgb24.ref.png create mode 100644 test/reference/clear.rgb24.ref.png create mode 100644 test/reference/clear.svg12.argb32.xfail.png create mode 100644 test/reference/clear.svg12.rgb24.xfail.png create mode 100644 test/reference/clear.traps.argb32.ref.png create mode 100644 test/reference/clear.traps.rgb24.ref.png create mode 100644 test/reference/clip-all.base.argb32.ref.png create mode 100644 test/reference/clip-all.base.rgb24.ref.png create mode 100644 test/reference/clip-all.ref.png create mode 100644 test/reference/clip-complex-bug61492.ref.png create mode 100644 test/reference/clip-complex-shape-eo-aa.base.argb32.ref.png create mode 100644 test/reference/clip-complex-shape-eo-aa.base.rgb24.ref.png create mode 100644 test/reference/clip-complex-shape-eo-aa.ref.png create mode 100644 test/reference/clip-complex-shape-eo-mono.base.argb32.ref.png create mode 100644 test/reference/clip-complex-shape-eo-mono.base.rgb24.ref.png create mode 100644 test/reference/clip-complex-shape-eo-mono.ref.png create mode 100644 test/reference/clip-contexts.base.argb32.ref.png create mode 100644 test/reference/clip-contexts.base.rgb24.ref.png create mode 100644 test/reference/clip-contexts.ref.png create mode 100644 test/reference/clip-device-offset.base.argb32.ref.png create mode 100644 test/reference/clip-device-offset.base.rgb24.ref.png create mode 100644 test/reference/clip-device-offset.ref.png create mode 100644 test/reference/clip-disjoint-hatching.base.argb32.ref.png create mode 100644 test/reference/clip-disjoint-hatching.base.rgb24.ref.png create mode 100644 test/reference/clip-disjoint-hatching.mask.argb32.ref.png create mode 100644 test/reference/clip-disjoint-hatching.mask.rgb24.ref.png create mode 100644 test/reference/clip-disjoint-hatching.ref.png create mode 100644 test/reference/clip-disjoint-hatching.traps.argb32.ref.png create mode 100644 test/reference/clip-disjoint-hatching.traps.rgb24.ref.png create mode 100644 test/reference/clip-disjoint-quad.ref.png create mode 100644 test/reference/clip-disjoint-quad.traps.ref.png create mode 100644 test/reference/clip-disjoint.base.argb32.ref.png create mode 100644 test/reference/clip-disjoint.base.rgb24.ref.png create mode 100644 test/reference/clip-disjoint.image16.ref.png create mode 100644 test/reference/clip-disjoint.mask.argb32.ref.png create mode 100644 test/reference/clip-disjoint.mask.rgb24.ref.png create mode 100644 test/reference/clip-disjoint.ps.ref.png create mode 100644 test/reference/clip-disjoint.quartz.ref.png create mode 100644 test/reference/clip-disjoint.ref.png create mode 100644 test/reference/clip-disjoint.traps.argb32.ref.png create mode 100644 test/reference/clip-disjoint.traps.rgb24.ref.png create mode 100644 test/reference/clip-empty-group.base.argb32.ref.png create mode 100644 test/reference/clip-empty-group.base.rgb24.ref.png create mode 100644 test/reference/clip-empty-group.ref.png create mode 100644 test/reference/clip-empty-save.base.argb32.ref.png create mode 100644 test/reference/clip-empty-save.base.rgb24.ref.png create mode 100644 test/reference/clip-empty-save.ref.png create mode 100644 test/reference/clip-empty.base.argb32.ref.png create mode 100644 test/reference/clip-empty.base.rgb24.ref.png create mode 100644 test/reference/clip-empty.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.argb32.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.base.argb32.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.base.rgb24.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.image16.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.mask.argb32.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.mask.rgb24.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.quartz.argb32.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.quartz.rgb24.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.rgb24.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.svg12.rgb24.xfail.png create mode 100644 test/reference/clip-fill-eo-unbounded.traps.argb32.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.traps.rgb24.ref.png create mode 100644 test/reference/clip-fill-eo-unbounded.xlib-fallback.rgb24.ref.png create mode 100644 test/reference/clip-fill-no-op.base.argb32.ref.png create mode 100644 test/reference/clip-fill-no-op.base.rgb24.ref.png create mode 100644 test/reference/clip-fill-no-op.image16.ref.png create mode 100644 test/reference/clip-fill-no-op.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.argb32.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.base.argb32.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.base.rgb24.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.image16.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.mask.argb32.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.mask.rgb24.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.quartz.argb32.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.quartz.rgb24.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.rgb24.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.svg12.rgb24.xfail.png create mode 100644 test/reference/clip-fill-nz-unbounded.traps.argb32.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.traps.rgb24.ref.png create mode 100644 test/reference/clip-fill-nz-unbounded.xlib-fallback.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule-pixel-aligned.base.argb32.ref.png create mode 100644 test/reference/clip-fill-rule-pixel-aligned.base.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule-pixel-aligned.ref.png create mode 100644 test/reference/clip-fill-rule.argb32.ref.png create mode 100644 test/reference/clip-fill-rule.base.argb32.ref.png create mode 100644 test/reference/clip-fill-rule.base.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule.image16.ref.png create mode 100644 test/reference/clip-fill-rule.pdf.argb32.ref.png create mode 100644 test/reference/clip-fill-rule.ps.argb32.ref.png create mode 100644 test/reference/clip-fill-rule.ps.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule.quartz.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule.test-paginated.rgb24.ref.png create mode 100644 test/reference/clip-fill-rule.traps.argb32.ref.png create mode 100644 test/reference/clip-fill-rule.traps.rgb24.ref.png create mode 100644 test/reference/clip-fill.base.argb32.ref.png create mode 100644 test/reference/clip-fill.base.rgb24.ref.png create mode 100644 test/reference/clip-fill.image16.ref.png create mode 100644 test/reference/clip-fill.mask.argb32.ref.png create mode 100644 test/reference/clip-fill.mask.rgb24.ref.png create mode 100644 test/reference/clip-fill.ps.xfail.png create mode 100644 test/reference/clip-fill.quartz.ref.png create mode 100644 test/reference/clip-fill.ref.png create mode 100644 test/reference/clip-fill.traps.argb32.ref.png create mode 100644 test/reference/clip-fill.traps.rgb24.ref.png create mode 100644 test/reference/clip-fill.xlib-fallback.ref.png create mode 100644 test/reference/clip-group-shapes-aligned-rectangles.base.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-aligned-rectangles.base.rgb24.ref.png create mode 100644 test/reference/clip-group-shapes-aligned-rectangles.ref.png create mode 100644 test/reference/clip-group-shapes-circles.base.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-circles.base.rgb24.ref.png create mode 100644 test/reference/clip-group-shapes-circles.mask.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-circles.mask.rgb24.ref.png create mode 100644 test/reference/clip-group-shapes-circles.ps.ref.png create mode 100644 test/reference/clip-group-shapes-circles.quartz.ref.png create mode 100644 test/reference/clip-group-shapes-circles.ref.png create mode 100644 test/reference/clip-group-shapes-circles.traps.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-circles.traps.rgb24.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.base.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.base.rgb24.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.mask.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.mask.rgb24.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.traps.argb32.ref.png create mode 100644 test/reference/clip-group-shapes-unaligned-rectangles.traps.rgb24.ref.png create mode 100644 test/reference/clip-image.base.argb32.ref.png create mode 100644 test/reference/clip-image.base.rgb24.ref.png create mode 100644 test/reference/clip-image.image16.ref.png create mode 100644 test/reference/clip-image.mask.argb32.ref.png create mode 100644 test/reference/clip-image.mask.rgb24.ref.png create mode 100644 test/reference/clip-image.ps.ref.png create mode 100644 test/reference/clip-image.ref.png create mode 100644 test/reference/clip-image.traps.argb32.ref.png create mode 100644 test/reference/clip-image.traps.rgb24.ref.png create mode 100644 test/reference/clip-intersect.base.argb32.ref.png create mode 100644 test/reference/clip-intersect.base.rgb24.ref.png create mode 100644 test/reference/clip-intersect.ref.png create mode 100644 test/reference/clip-intersect.traps.argb32.ref.png create mode 100644 test/reference/clip-intersect.traps.rgb24.ref.png create mode 100644 test/reference/clip-mixed-antialias.base.argb32.ref.png create mode 100644 test/reference/clip-mixed-antialias.base.rgb24.ref.png create mode 100644 test/reference/clip-mixed-antialias.ref.png create mode 100644 test/reference/clip-mixed-antialias.traps.argb32.ref.png create mode 100644 test/reference/clip-mixed-antialias.traps.rgb24.ref.png create mode 100644 test/reference/clip-nesting.argb32.ref.png create mode 100644 test/reference/clip-nesting.base.argb32.ref.png create mode 100644 test/reference/clip-nesting.base.rgb24.ref.png create mode 100644 test/reference/clip-nesting.mask.rgb24.ref.png create mode 100644 test/reference/clip-nesting.pdf.argb32.ref.png create mode 100644 test/reference/clip-nesting.ps.argb32.ref.png create mode 100644 test/reference/clip-nesting.ps.rgb24.ref.png create mode 100644 test/reference/clip-nesting.quartz.argb32.ref.png create mode 100644 test/reference/clip-nesting.quartz.rgb24.ref.png create mode 100644 test/reference/clip-nesting.rgb24.ref.png create mode 100644 test/reference/clip-nesting.test-paginated.rgb24.ref.png create mode 100644 test/reference/clip-nesting.traps.argb32.ref.png create mode 100644 test/reference/clip-nesting.traps.rgb24.ref.png create mode 100644 test/reference/clip-operator.argb32.ref.png create mode 100644 test/reference/clip-operator.base.argb32.ref.png create mode 100644 test/reference/clip-operator.base.rgb24.ref.png create mode 100644 test/reference/clip-operator.gl.argb32.ref.png create mode 100644 test/reference/clip-operator.image16.ref.png create mode 100644 test/reference/clip-operator.mask.argb32.ref.png create mode 100644 test/reference/clip-operator.mask.rgb24.ref.png create mode 100644 test/reference/clip-operator.pdf.argb32.ref.png create mode 100644 test/reference/clip-operator.pdf.rgb24.ref.png create mode 100644 test/reference/clip-operator.ps2.rgb24.ref.png create mode 100644 test/reference/clip-operator.ps3.argb32.ref.png create mode 100644 test/reference/clip-operator.ps3.ref.png create mode 100644 test/reference/clip-operator.ps3.rgb24.ref.png create mode 100644 test/reference/clip-operator.quartz.argb32.ref.png create mode 100644 test/reference/clip-operator.quartz.rgb24.ref.png create mode 100644 test/reference/clip-operator.rgb24.ref.png create mode 100644 test/reference/clip-operator.svg12.argb32.xfail.png create mode 100644 test/reference/clip-operator.svg12.rgb24.xfail.png create mode 100644 test/reference/clip-operator.test-paginated.argb32.ref.png create mode 100644 test/reference/clip-operator.traps.argb32.ref.png create mode 100644 test/reference/clip-operator.traps.rgb24.ref.png create mode 100644 test/reference/clip-operator.xlib-fallback.ref.png create mode 100644 test/reference/clip-polygons.base.argb32.ref.png create mode 100644 test/reference/clip-polygons.base.rgb24.ref.png create mode 100644 test/reference/clip-polygons.mask.argb32.ref.png create mode 100644 test/reference/clip-polygons.mask.rgb24.ref.png create mode 100644 test/reference/clip-polygons.ref.png create mode 100644 test/reference/clip-polygons.traps.ref.png create mode 100644 test/reference/clip-push-group.base.argb32.ref.png create mode 100644 test/reference/clip-push-group.base.rgb24.ref.png create mode 100644 test/reference/clip-push-group.image16.ref.png create mode 100644 test/reference/clip-push-group.pdf.ref.png create mode 100644 test/reference/clip-push-group.ps.ref.png create mode 100644 test/reference/clip-push-group.quartz.ref.png create mode 100644 test/reference/clip-push-group.ref.png create mode 100644 test/reference/clip-push-group.svg.ref.png create mode 100644 test/reference/clip-push-group.traps.argb32.ref.png create mode 100644 test/reference/clip-push-group.traps.rgb24.ref.png create mode 100644 test/reference/clip-rectilinear.base.argb32.ref.png create mode 100644 test/reference/clip-rectilinear.base.rgb24.ref.png create mode 100644 test/reference/clip-rectilinear.mask.argb32.ref.png create mode 100644 test/reference/clip-rectilinear.mask.rgb24.ref.png create mode 100644 test/reference/clip-rectilinear.ref.png create mode 100644 test/reference/clip-rectilinear.traps.ref.png create mode 100644 test/reference/clip-rotate-image-surface-paint.base.argb32.ref.png create mode 100644 test/reference/clip-rotate-image-surface-paint.base.rgb24.ref.png create mode 100644 test/reference/clip-rotate-image-surface-paint.ref.png create mode 100644 test/reference/clip-shape.base.argb32.ref.png create mode 100644 test/reference/clip-shape.base.rgb24.ref.png create mode 100644 test/reference/clip-shape.image16.ref.png create mode 100644 test/reference/clip-shape.mask.argb32.ref.png create mode 100644 test/reference/clip-shape.mask.rgb24.ref.png create mode 100644 test/reference/clip-shape.ps.ref.png create mode 100644 test/reference/clip-shape.quartz.ref.png create mode 100644 test/reference/clip-shape.ref.png create mode 100644 test/reference/clip-shape.traps.argb32.ref.png create mode 100644 test/reference/clip-shape.traps.rgb24.ref.png create mode 100644 test/reference/clip-shape.xlib-fallback.ref.png create mode 100644 test/reference/clip-stroke-no-op.base.argb32.ref.png create mode 100644 test/reference/clip-stroke-no-op.base.rgb24.ref.png create mode 100644 test/reference/clip-stroke-no-op.image16.ref.png create mode 100644 test/reference/clip-stroke-no-op.ref.png create mode 100644 test/reference/clip-stroke-unbounded.argb32.ref.png create mode 100644 test/reference/clip-stroke-unbounded.base.argb32.ref.png create mode 100644 test/reference/clip-stroke-unbounded.base.rgb24.ref.png create mode 100644 test/reference/clip-stroke-unbounded.image16.rgb24.ref.png create mode 100644 test/reference/clip-stroke-unbounded.mask.argb32.ref.png create mode 100644 test/reference/clip-stroke-unbounded.mask.rgb24.ref.png create mode 100644 test/reference/clip-stroke-unbounded.quartz.argb32.ref.png create mode 100644 test/reference/clip-stroke-unbounded.quartz.rgb24.ref.png create mode 100644 test/reference/clip-stroke-unbounded.rgb24.ref.png create mode 100644 test/reference/clip-stroke-unbounded.svg12.rgb24.xfail.png create mode 100644 test/reference/clip-stroke-unbounded.traps.argb32.ref.png create mode 100644 test/reference/clip-stroke-unbounded.traps.rgb24.ref.png create mode 100644 test/reference/clip-stroke-unbounded.xlib-fallback.rgb24.ref.png create mode 100644 test/reference/clip-stroke.base.argb32.ref.png create mode 100644 test/reference/clip-stroke.base.rgb24.ref.png create mode 100644 test/reference/clip-stroke.image16.ref.png create mode 100644 test/reference/clip-stroke.mask.argb32.ref.png create mode 100644 test/reference/clip-stroke.mask.rgb24.ref.png create mode 100644 test/reference/clip-stroke.ps.xfail.png create mode 100644 test/reference/clip-stroke.quartz.ref.png create mode 100644 test/reference/clip-stroke.ref.png create mode 100644 test/reference/clip-stroke.traps.argb32.ref.png create mode 100644 test/reference/clip-stroke.traps.rgb24.ref.png create mode 100644 test/reference/clip-stroke.xlib-fallback.ref.png create mode 100644 test/reference/clip-text.base.argb32.ref.png create mode 100644 test/reference/clip-text.base.rgb24.ref.png create mode 100644 test/reference/clip-text.image16.ref.png create mode 100644 test/reference/clip-text.mask.argb32.ref.png create mode 100644 test/reference/clip-text.mask.rgb24.ref.png create mode 100644 test/reference/clip-text.ps.xfail.png create mode 100644 test/reference/clip-text.quartz.ref.png create mode 100644 test/reference/clip-text.ref.png create mode 100644 test/reference/clip-text.svg.ref.png create mode 100644 test/reference/clip-text.traps.argb32.ref.png create mode 100644 test/reference/clip-text.traps.rgb24.ref.png create mode 100644 test/reference/clip-twice-rectangle.base.argb32.ref.png create mode 100644 test/reference/clip-twice-rectangle.base.rgb24.ref.png create mode 100644 test/reference/clip-twice-rectangle.ref.png create mode 100644 test/reference/clip-twice.argb32.ref.png create mode 100644 test/reference/clip-twice.base.argb32.ref.png create mode 100644 test/reference/clip-twice.base.rgb24.ref.png create mode 100644 test/reference/clip-twice.image16.ref.png create mode 100644 test/reference/clip-twice.mask.argb32.ref.png create mode 100644 test/reference/clip-twice.mask.rgb24.ref.png create mode 100644 test/reference/clip-twice.pdf.argb32.ref.png create mode 100644 test/reference/clip-twice.ps.argb32.ref.png create mode 100644 test/reference/clip-twice.ps.rgb24.ref.png create mode 100644 test/reference/clip-twice.quartz.argb32.ref.png create mode 100644 test/reference/clip-twice.quartz.rgb24.ref.png create mode 100644 test/reference/clip-twice.rgb24.ref.png create mode 100644 test/reference/clip-twice.test-paginated.argb32.ref.png create mode 100644 test/reference/clip-twice.test-paginated.rgb24.ref.png create mode 100644 test/reference/clip-twice.traps.argb32.ref.png create mode 100644 test/reference/clip-twice.traps.rgb24.ref.png create mode 100644 test/reference/clip-unbounded.base.argb32.ref.png create mode 100644 test/reference/clip-unbounded.base.rgb24.ref.png create mode 100644 test/reference/clip-unbounded.pdf.argb32.xfail.png create mode 100644 test/reference/clip-unbounded.pdf.rgb24.xfail.png create mode 100644 test/reference/clip-unbounded.ref.png create mode 100644 test/reference/clip-unbounded.svg12.rgb24.xfail.png create mode 100644 test/reference/clip-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/clip-xlib-window.rgb24.ref.png create mode 100644 test/reference/clip-xlib.ref.png create mode 100644 test/reference/clipped-group.base.argb32.ref.png create mode 100644 test/reference/clipped-group.base.rgb24.ref.png create mode 100644 test/reference/clipped-group.image16.ref.png create mode 100644 test/reference/clipped-group.mask.argb32.ref.png create mode 100644 test/reference/clipped-group.mask.rgb24.ref.png create mode 100644 test/reference/clipped-group.pdf.ref.png create mode 100644 test/reference/clipped-group.ps2.ref.png create mode 100644 test/reference/clipped-group.ps3.ref.png create mode 100644 test/reference/clipped-group.quartz.ref.png create mode 100644 test/reference/clipped-group.ref.png create mode 100644 test/reference/clipped-group.svg.ref.png create mode 100644 test/reference/clipped-group.traps.argb32.ref.png create mode 100644 test/reference/clipped-group.traps.rgb24.ref.png create mode 100644 test/reference/clipped-group.xlib-fallback.ref.png create mode 100644 test/reference/clipped-surface.base.argb32.ref.png create mode 100644 test/reference/clipped-surface.base.rgb24.ref.png create mode 100644 test/reference/clipped-surface.image16.ref.png create mode 100644 test/reference/clipped-surface.ref.png create mode 100644 test/reference/clipped-trapezoids.ref.png create mode 100644 test/reference/close-path-current-point.base.argb32.ref.png create mode 100644 test/reference/close-path-current-point.base.rgb24.ref.png create mode 100644 test/reference/close-path-current-point.image16.ref.png create mode 100644 test/reference/close-path-current-point.mask.argb32.ref.png create mode 100644 test/reference/close-path-current-point.mask.rgb24.ref.png create mode 100644 test/reference/close-path-current-point.ps.ref.png create mode 100644 test/reference/close-path-current-point.ref.png create mode 100644 test/reference/close-path-current-point.traps.argb32.ref.png create mode 100644 test/reference/close-path-current-point.traps.rgb24.ref.png create mode 100644 test/reference/close-path.base.argb32.ref.png create mode 100644 test/reference/close-path.base.rgb24.ref.png create mode 100644 test/reference/close-path.ps2.ref.png create mode 100644 test/reference/close-path.ps3.ref.png create mode 100644 test/reference/close-path.ref.png create mode 100644 test/reference/close-path.traps.argb32.ref.png create mode 100644 test/reference/close-path.traps.rgb24.ref.png create mode 100644 test/reference/composite-integer-translate-over-repeat.base.argb32.ref.png create mode 100644 test/reference/composite-integer-translate-over-repeat.base.rgb24.ref.png create mode 100644 test/reference/composite-integer-translate-over-repeat.ps2.ref.png create mode 100644 test/reference/composite-integer-translate-over-repeat.ps3.ref.png create mode 100644 test/reference/composite-integer-translate-over-repeat.ref.png create mode 100644 test/reference/composite-integer-translate-over.base.argb32.ref.png create mode 100644 test/reference/composite-integer-translate-over.base.rgb24.ref.png create mode 100644 test/reference/composite-integer-translate-over.image16.ref.png create mode 100644 test/reference/composite-integer-translate-over.ps2.ref.png create mode 100644 test/reference/composite-integer-translate-over.ps3.ref.png create mode 100644 test/reference/composite-integer-translate-over.ref.png create mode 100644 test/reference/composite-integer-translate-source.base.argb32.ref.png create mode 100644 test/reference/composite-integer-translate-source.base.rgb24.ref.png create mode 100644 test/reference/composite-integer-translate-source.image16.ref.png create mode 100644 test/reference/composite-integer-translate-source.ps2.ref.png create mode 100644 test/reference/composite-integer-translate-source.ps3.ref.png create mode 100644 test/reference/composite-integer-translate-source.ref.png create mode 100644 test/reference/composite-integer-translate-source.svg12.argb32.xfail.png create mode 100644 test/reference/composite-integer-translate-source.svg12.rgb24.xfail.png create mode 100644 test/reference/copy-disjoint.base.argb32.ref.png create mode 100644 test/reference/copy-disjoint.base.rgb24.ref.png create mode 100644 test/reference/copy-disjoint.ref.png create mode 100644 test/reference/copy-path.base.argb32.ref.png create mode 100644 test/reference/copy-path.base.rgb24.ref.png create mode 100644 test/reference/copy-path.image16.ref.png create mode 100644 test/reference/copy-path.ps.ref.png create mode 100644 test/reference/copy-path.ref.png create mode 100644 test/reference/copy-path.traps.argb32.ref.png create mode 100644 test/reference/copy-path.traps.rgb24.ref.png create mode 100644 test/reference/coverage-abutting.ref.png create mode 100644 test/reference/coverage-column-triangles.ref.png create mode 100644 test/reference/coverage-column-triangles.xfail.png create mode 100644 test/reference/coverage-column-triangles.xlib.xfail.png create mode 100644 test/reference/coverage-intersecting-quads.ref.png create mode 100644 test/reference/coverage-intersecting-quads.xlib.xfail.png create mode 100644 test/reference/coverage-intersecting-triangles.ref.png create mode 100644 test/reference/coverage-intersecting-triangles.xfail.png create mode 100644 test/reference/coverage-intersecting-triangles.xlib.xfail.png create mode 100644 test/reference/coverage-rectangles.ref.png create mode 100644 test/reference/coverage-rectangles.xlib.xfail.png create mode 100644 test/reference/coverage-rhombus.ref.png create mode 100644 test/reference/coverage-rhombus.xfail.png create mode 100644 test/reference/coverage-row-triangles.ref.png create mode 100644 test/reference/coverage-row-triangles.xfail.png create mode 100644 test/reference/coverage-row-triangles.xlib.xfail.png create mode 100644 test/reference/coverage-triangles.ref.png create mode 100644 test/reference/coverage-triangles.xfail.png create mode 100644 test/reference/coverage-triangles.xlib.xfail.png create mode 100644 test/reference/create-from-png-stream.base.argb32.ref.png create mode 100644 test/reference/create-from-png-stream.base.rgb24.ref.png create mode 100644 test/reference/create-from-png-stream.ref.png create mode 100644 test/reference/create-from-png.alpha.ref.png create mode 100644 test/reference/create-from-png.base.argb32.ref.png create mode 100644 test/reference/create-from-png.base.rgb24.ref.png create mode 100644 test/reference/create-from-png.gray-alpha.ref.png create mode 100644 test/reference/create-from-png.gray.ref.png create mode 100644 test/reference/create-from-png.indexed-alpha.ref.png create mode 100644 test/reference/create-from-png.indexed.ref.png create mode 100644 test/reference/create-from-png.mask.argb32.ref.png create mode 100644 test/reference/create-from-png.mask.rgb24.ref.png create mode 100644 test/reference/create-from-png.ref.png create mode 100644 test/reference/create-from-png.traps.argb32.ref.png create mode 100644 test/reference/create-from-png.traps.rgb24.ref.png create mode 100644 test/reference/culled-glyphs.base.argb32.ref.png create mode 100644 test/reference/culled-glyphs.base.rgb24.ref.png create mode 100644 test/reference/culled-glyphs.image16.ref.png create mode 100644 test/reference/culled-glyphs.ps.ref.png create mode 100644 test/reference/culled-glyphs.quartz.ref.png create mode 100644 test/reference/culled-glyphs.ref.png create mode 100644 test/reference/curve-to-as-line-to.base.argb32.ref.png create mode 100644 test/reference/curve-to-as-line-to.base.rgb24.ref.png create mode 100644 test/reference/curve-to-as-line-to.mask.argb32.ref.png create mode 100644 test/reference/curve-to-as-line-to.mask.rgb24.ref.png create mode 100644 test/reference/curve-to-as-line-to.ps.xfail.png create mode 100644 test/reference/curve-to-as-line-to.ref.png create mode 100644 test/reference/curve-to-as-line-to.traps.argb32.ref.png create mode 100644 test/reference/curve-to-as-line-to.traps.rgb24.ref.png create mode 100644 test/reference/dash-caps-joins.base.argb32.ref.png create mode 100644 test/reference/dash-caps-joins.base.rgb24.ref.png create mode 100644 test/reference/dash-caps-joins.image16.ref.png create mode 100644 test/reference/dash-caps-joins.mask.argb32.ref.png create mode 100644 test/reference/dash-caps-joins.mask.rgb24.ref.png create mode 100644 test/reference/dash-caps-joins.ps.ref.png create mode 100644 test/reference/dash-caps-joins.quartz.xfail.png create mode 100644 test/reference/dash-caps-joins.ref.png create mode 100644 test/reference/dash-caps-joins.traps.argb32.ref.png create mode 100644 test/reference/dash-caps-joins.traps.rgb24.ref.png create mode 100644 test/reference/dash-curve.image16.ref.png create mode 100644 test/reference/dash-curve.mask.argb32.ref.png create mode 100644 test/reference/dash-curve.mask.rgb24.ref.png create mode 100644 test/reference/dash-curve.ps2.ref.png create mode 100644 test/reference/dash-curve.ps3.ref.png create mode 100644 test/reference/dash-curve.quartz.xfail.png create mode 100644 test/reference/dash-curve.ref.png create mode 100644 test/reference/dash-curve.traps.argb32.ref.png create mode 100644 test/reference/dash-curve.traps.rgb24.ref.png create mode 100644 test/reference/dash-infinite-loop.base.argb32.ref.png create mode 100644 test/reference/dash-infinite-loop.base.rgb24.ref.png create mode 100644 test/reference/dash-infinite-loop.ps.ref.png create mode 100644 test/reference/dash-infinite-loop.ref.png create mode 100644 test/reference/dash-infinite-loop.traps.argb32.ref.png create mode 100644 test/reference/dash-infinite-loop.traps.rgb24.ref.png create mode 100644 test/reference/dash-no-dash.base.argb32.ref.png create mode 100644 test/reference/dash-no-dash.base.rgb24.ref.png create mode 100644 test/reference/dash-no-dash.ref.png create mode 100644 test/reference/dash-offset-negative.base.argb32.ref.png create mode 100644 test/reference/dash-offset-negative.base.rgb24.ref.png create mode 100644 test/reference/dash-offset-negative.pdf.ref.png create mode 100644 test/reference/dash-offset-negative.ref.png create mode 100644 test/reference/dash-offset-negative.traps.argb32.ref.png create mode 100644 test/reference/dash-offset-negative.traps.rgb24.ref.png create mode 100644 test/reference/dash-offset.base.argb32.ref.png create mode 100644 test/reference/dash-offset.base.rgb24.ref.png create mode 100644 test/reference/dash-offset.ref.png create mode 100644 test/reference/dash-scale.image16.ref.png create mode 100644 test/reference/dash-scale.mask.argb32.ref.png create mode 100644 test/reference/dash-scale.mask.rgb24.ref.png create mode 100644 test/reference/dash-scale.ps.ref.png create mode 100644 test/reference/dash-scale.quartz.ref.png create mode 100644 test/reference/dash-scale.ref.png create mode 100644 test/reference/dash-scale.traps.argb32.ref.png create mode 100644 test/reference/dash-scale.traps.rgb24.ref.png create mode 100644 test/reference/dash-state.base.argb32.ref.png create mode 100644 test/reference/dash-state.base.rgb24.ref.png create mode 100644 test/reference/dash-state.image16.ref.png create mode 100644 test/reference/dash-state.ps2.ref.png create mode 100644 test/reference/dash-state.ps3.ref.png create mode 100644 test/reference/dash-state.quartz.xfail.png create mode 100644 test/reference/dash-state.ref.png create mode 100644 test/reference/dash-state.traps.argb32.ref.png create mode 100644 test/reference/dash-state.traps.rgb24.ref.png create mode 100644 test/reference/dash-zero-length.base.argb32.ref.png create mode 100644 test/reference/dash-zero-length.base.rgb24.ref.png create mode 100644 test/reference/dash-zero-length.mask.rgb24.ref.png create mode 100644 test/reference/dash-zero-length.ps2.ref.png create mode 100644 test/reference/dash-zero-length.ps2.rgb24.ref.png create mode 100644 test/reference/dash-zero-length.ps3.ref.png create mode 100644 test/reference/dash-zero-length.ps3.rgb24.ref.png create mode 100644 test/reference/dash-zero-length.ref.png create mode 100644 test/reference/dash-zero-length.traps.argb32.ref.png create mode 100644 test/reference/dash-zero-length.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-arc.base.argb32.ref.png create mode 100644 test/reference/degenerate-arc.base.rgb24.ref.png create mode 100644 test/reference/degenerate-arc.image16.ref.png create mode 100644 test/reference/degenerate-arc.mask.argb32.ref.png create mode 100644 test/reference/degenerate-arc.mask.rgb24.ref.png create mode 100644 test/reference/degenerate-arc.ps2.ref.png create mode 100644 test/reference/degenerate-arc.ps3.ref.png create mode 100644 test/reference/degenerate-arc.quartz.ref.png create mode 100644 test/reference/degenerate-arc.ref.png create mode 100644 test/reference/degenerate-arc.traps.argb32.ref.png create mode 100644 test/reference/degenerate-arc.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-arcs.base.argb32.ref.png create mode 100644 test/reference/degenerate-arcs.base.rgb24.ref.png create mode 100644 test/reference/degenerate-arcs.image16.ref.png create mode 100644 test/reference/degenerate-arcs.ref.png create mode 100644 test/reference/degenerate-curve-to.base.argb32.ref.png create mode 100644 test/reference/degenerate-curve-to.base.rgb24.ref.png create mode 100644 test/reference/degenerate-curve-to.image16.ref.png create mode 100644 test/reference/degenerate-curve-to.mask.argb32.ref.png create mode 100644 test/reference/degenerate-curve-to.mask.rgb24.ref.png create mode 100644 test/reference/degenerate-curve-to.ps.xfail.png create mode 100644 test/reference/degenerate-curve-to.quartz.ref.png create mode 100644 test/reference/degenerate-curve-to.ref.png create mode 100644 test/reference/degenerate-curve-to.traps.argb32.ref.png create mode 100644 test/reference/degenerate-curve-to.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-dash.base.argb32.ref.png create mode 100644 test/reference/degenerate-dash.base.rgb24.ref.png create mode 100644 test/reference/degenerate-dash.mask.argb32.ref.png create mode 100644 test/reference/degenerate-dash.mask.rgb24.ref.png create mode 100644 test/reference/degenerate-dash.ps.xfail.png create mode 100644 test/reference/degenerate-dash.quartz.xfail.png create mode 100644 test/reference/degenerate-dash.ref.png create mode 100644 test/reference/degenerate-dash.traps.argb32.ref.png create mode 100644 test/reference/degenerate-dash.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-linear-gradient.base.argb32.ref.png create mode 100644 test/reference/degenerate-linear-gradient.base.rgb24.ref.png create mode 100644 test/reference/degenerate-linear-gradient.ref.png create mode 100644 test/reference/degenerate-path.base.argb32.ref.png create mode 100644 test/reference/degenerate-path.base.rgb24.ref.png create mode 100644 test/reference/degenerate-path.mask.argb32.ref.png create mode 100644 test/reference/degenerate-path.mask.rgb24.ref.png create mode 100644 test/reference/degenerate-path.ps.argb32.xfail.png create mode 100644 test/reference/degenerate-path.ps.rgb24.xfail.png create mode 100644 test/reference/degenerate-path.quartz.argb32.xfail.png create mode 100644 test/reference/degenerate-path.quartz.rgb24.xfail.png create mode 100644 test/reference/degenerate-path.ref.png create mode 100644 test/reference/degenerate-path.traps.argb32.ref.png create mode 100644 test/reference/degenerate-path.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-pen.base.argb32.ref.png create mode 100644 test/reference/degenerate-pen.base.rgb24.ref.png create mode 100644 test/reference/degenerate-pen.image16.ref.png create mode 100644 test/reference/degenerate-pen.ps.ref.png create mode 100644 test/reference/degenerate-pen.ref.png create mode 100644 test/reference/degenerate-pen.traps.argb32.ref.png create mode 100644 test/reference/degenerate-pen.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-radial-gradient.base.argb32.ref.png create mode 100644 test/reference/degenerate-radial-gradient.base.rgb24.ref.png create mode 100644 test/reference/degenerate-radial-gradient.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.base.argb32.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.base.rgb24.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.image16.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.mask.argb32.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.mask.rgb24.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.ps.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.quartz.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.traps.argb32.ref.png create mode 100644 test/reference/degenerate-rel-curve-to.traps.rgb24.ref.png create mode 100644 test/reference/degenerate-solid-dash.ref.png create mode 100644 test/reference/device-offset-fractional.base.argb32.ref.png create mode 100644 test/reference/device-offset-fractional.base.rgb24.ref.png create mode 100644 test/reference/device-offset-fractional.gl.xfail.png create mode 100644 test/reference/device-offset-fractional.pdf.xfail.png create mode 100644 test/reference/device-offset-fractional.ps2.ref.png create mode 100644 test/reference/device-offset-fractional.ps3.ref.png create mode 100644 test/reference/device-offset-fractional.ref.png create mode 100644 test/reference/device-offset-positive.base.argb32.ref.png create mode 100644 test/reference/device-offset-positive.base.rgb24.ref.png create mode 100644 test/reference/device-offset-positive.ref.png create mode 100644 test/reference/device-offset-scale.base.argb32.ref.png create mode 100644 test/reference/device-offset-scale.base.rgb24.ref.png create mode 100644 test/reference/device-offset-scale.ref.png create mode 100644 test/reference/device-offset-scale.svg.xfail.png create mode 100644 test/reference/device-offset.base.argb32.ref.png create mode 100644 test/reference/device-offset.base.rgb24.ref.png create mode 100644 test/reference/device-offset.ref.png create mode 100644 test/reference/drunkard-tails.base.argb32.ref.png create mode 100644 test/reference/drunkard-tails.base.rgb24.ref.png create mode 100644 test/reference/drunkard-tails.mask.argb32.ref.png create mode 100644 test/reference/drunkard-tails.mask.rgb24.ref.png create mode 100644 test/reference/drunkard-tails.ps.ref.png create mode 100644 test/reference/drunkard-tails.ref.png create mode 100644 test/reference/drunkard-tails.traps.argb32.ref.png create mode 100644 test/reference/drunkard-tails.traps.rgb24.ref.png create mode 100644 test/reference/egl-surface-source.base.argb32.ref.png create mode 100644 test/reference/egl-surface-source.base.rgb24.ref.png create mode 100644 test/reference/egl-surface-source.image16.ref.png create mode 100644 test/reference/egl-surface-source.ref.png create mode 100644 test/reference/extend-pad-border.base.argb32.ref.png create mode 100644 test/reference/extend-pad-border.base.rgb24.ref.png create mode 100644 test/reference/extend-pad-border.image16.ref.png create mode 100644 test/reference/extend-pad-border.pdf.ref.png create mode 100644 test/reference/extend-pad-border.ps.ref.png create mode 100644 test/reference/extend-pad-border.quartz.ref.png create mode 100644 test/reference/extend-pad-border.ref.png create mode 100644 test/reference/extend-pad-border.svg.xfail.png create mode 100644 test/reference/extend-pad-similar.base.argb32.ref.png create mode 100644 test/reference/extend-pad-similar.base.rgb24.ref.png create mode 100644 test/reference/extend-pad-similar.quartz.xfail.png create mode 100644 test/reference/extend-pad-similar.ref.png create mode 100644 test/reference/extend-pad-similar.svg.xfail.png create mode 100644 test/reference/extend-pad.base.argb32.ref.png create mode 100644 test/reference/extend-pad.base.rgb24.ref.png create mode 100644 test/reference/extend-pad.ps.ref.png create mode 100644 test/reference/extend-pad.quartz.xfail.png create mode 100644 test/reference/extend-pad.ref.png create mode 100644 test/reference/extend-pad.svg.xfail.png create mode 100644 test/reference/extend-reflect-similar.base.argb32.ref.png create mode 100644 test/reference/extend-reflect-similar.base.rgb24.ref.png create mode 100644 test/reference/extend-reflect-similar.image16.ref.png create mode 100644 test/reference/extend-reflect-similar.ps2.ref.png create mode 100644 test/reference/extend-reflect-similar.ps3.ref.png create mode 100644 test/reference/extend-reflect-similar.ref.png create mode 100644 test/reference/extend-reflect.base.argb32.ref.png create mode 100644 test/reference/extend-reflect.base.rgb24.ref.png create mode 100644 test/reference/extend-reflect.image16.ref.png create mode 100644 test/reference/extend-reflect.ps2.ref.png create mode 100644 test/reference/extend-reflect.ps3.ref.png create mode 100644 test/reference/extend-reflect.ref.png create mode 100644 test/reference/extend-repeat-similar.base.argb32.ref.png create mode 100644 test/reference/extend-repeat-similar.base.rgb24.ref.png create mode 100644 test/reference/extend-repeat-similar.image16.ref.png create mode 100644 test/reference/extend-repeat-similar.ps2.ref.png create mode 100644 test/reference/extend-repeat-similar.ps3.ref.png create mode 100644 test/reference/extend-repeat-similar.ref.png create mode 100644 test/reference/extend-repeat.base.argb32.ref.png create mode 100644 test/reference/extend-repeat.base.rgb24.ref.png create mode 100644 test/reference/extend-repeat.image16.ref.png create mode 100644 test/reference/extend-repeat.ps2.ref.png create mode 100644 test/reference/extend-repeat.ps3.ref.png create mode 100644 test/reference/extend-repeat.ref.png create mode 100644 test/reference/extended-blend-alpha-mask.argb32.ref.png create mode 100644 test/reference/extended-blend-alpha-mask.base.argb32.ref.png create mode 100644 test/reference/extended-blend-alpha-mask.base.rgb24.ref.png create mode 100644 test/reference/extended-blend-alpha-mask.rgb24.ref.png create mode 100644 test/reference/extended-blend-alpha.argb32.ref.png create mode 100644 test/reference/extended-blend-alpha.base.argb32.ref.png create mode 100644 test/reference/extended-blend-alpha.base.rgb24.ref.png create mode 100644 test/reference/extended-blend-alpha.image16.ref.png create mode 100644 test/reference/extended-blend-alpha.quartz.argb32.ref.png create mode 100644 test/reference/extended-blend-alpha.quartz.rgb24.ref.png create mode 100644 test/reference/extended-blend-alpha.rgb24.ref.png create mode 100644 test/reference/extended-blend-alpha.svg12.argb32.xfail.png create mode 100644 test/reference/extended-blend-alpha.svg12.rgb24.xfail.png create mode 100644 test/reference/extended-blend-mask.argb32.ref.png create mode 100644 test/reference/extended-blend-mask.base.argb32.ref.png create mode 100644 test/reference/extended-blend-mask.base.rgb24.ref.png create mode 100644 test/reference/extended-blend-mask.rgb24.ref.png create mode 100644 test/reference/extended-blend-solid-alpha.argb32.ref.png create mode 100644 test/reference/extended-blend-solid-alpha.base.argb32.ref.png create mode 100644 test/reference/extended-blend-solid-alpha.base.rgb24.ref.png create mode 100644 test/reference/extended-blend-solid-alpha.image16.ref.png create mode 100644 test/reference/extended-blend-solid-alpha.rgb24.ref.png create mode 100644 test/reference/extended-blend-solid.argb32.ref.png create mode 100644 test/reference/extended-blend-solid.base.argb32.ref.png create mode 100644 test/reference/extended-blend-solid.base.rgb24.ref.png create mode 100644 test/reference/extended-blend-solid.image16.ref.png create mode 100644 test/reference/extended-blend-solid.rgb24.ref.png create mode 100644 test/reference/extended-blend.argb32.ref.png create mode 100644 test/reference/extended-blend.base.argb32.ref.png create mode 100644 test/reference/extended-blend.base.rgb24.ref.png create mode 100644 test/reference/extended-blend.image16.ref.png create mode 100644 test/reference/extended-blend.quartz.argb32.ref.png create mode 100644 test/reference/extended-blend.quartz.rgb24.ref.png create mode 100644 test/reference/extended-blend.rgb24.ref.png create mode 100644 test/reference/extended-blend.svg12.argb32.xfail.png create mode 100644 test/reference/extended-blend.svg12.rgb24.xfail.png create mode 100644 test/reference/fallback-resolution.ppi144x144.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi144x144.ref.png create mode 100644 test/reference/fallback-resolution.ppi144x72.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi144x72.ref.png create mode 100644 test/reference/fallback-resolution.ppi288x288.pdf.ref.png create mode 100644 test/reference/fallback-resolution.ppi288x288.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi288x288.svg.ref.png create mode 100644 test/reference/fallback-resolution.ppi288x72.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi288x72.ref.png create mode 100644 test/reference/fallback-resolution.ppi576x576.pdf.ref.png create mode 100644 test/reference/fallback-resolution.ppi576x576.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi576x576.svg.ref.png create mode 100644 test/reference/fallback-resolution.ppi576x72.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi576x72.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x144.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x144.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x288.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x288.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x576.ps.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x576.ref.png create mode 100644 test/reference/fallback-resolution.ppi72x72.ref.png create mode 100644 test/reference/fallback.argb32.ref.png create mode 100644 test/reference/fallback.base.argb32.ref.png create mode 100644 test/reference/fallback.base.rgb24.ref.png create mode 100644 test/reference/fallback.image16.rgb24.ref.png create mode 100644 test/reference/fallback.mask.argb32.ref.png create mode 100644 test/reference/fallback.mask.rgb24.ref.png create mode 100644 test/reference/fallback.rgb24.ref.png create mode 100644 test/reference/fallback.traps.argb32.ref.png create mode 100644 test/reference/fallback.traps.rgb24.ref.png create mode 100644 test/reference/fill-alpha-pattern.base.argb32.ref.png create mode 100644 test/reference/fill-alpha-pattern.base.rgb24.ref.png create mode 100644 test/reference/fill-alpha-pattern.image16.ref.png create mode 100644 test/reference/fill-alpha-pattern.pdf.ref.png create mode 100644 test/reference/fill-alpha-pattern.ps3.argb32.ref.png create mode 100644 test/reference/fill-alpha-pattern.quartz.ref.png create mode 100644 test/reference/fill-alpha-pattern.ref.png create mode 100644 test/reference/fill-alpha-pattern.traps.argb32.ref.png create mode 100644 test/reference/fill-alpha-pattern.traps.rgb24.ref.png create mode 100644 test/reference/fill-alpha.base.argb32.ref.png create mode 100644 test/reference/fill-alpha.base.rgb24.ref.png create mode 100644 test/reference/fill-alpha.image16.ref.png create mode 100644 test/reference/fill-alpha.ps.argb32.ref.png create mode 100644 test/reference/fill-alpha.quartz.ref.png create mode 100644 test/reference/fill-alpha.ref.png create mode 100644 test/reference/fill-alpha.traps.argb32.ref.png create mode 100644 test/reference/fill-alpha.traps.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.base.argb32.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.base.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.image16.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.quartz.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.svg12.xfail.png create mode 100644 test/reference/fill-and-stroke-alpha-add.traps.argb32.ref.png create mode 100644 test/reference/fill-and-stroke-alpha-add.traps.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke-alpha.base.argb32.ref.png create mode 100644 test/reference/fill-and-stroke-alpha.base.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke-alpha.image16.ref.png create mode 100644 test/reference/fill-and-stroke-alpha.ref.png create mode 100644 test/reference/fill-and-stroke-alpha.traps.argb32.ref.png create mode 100644 test/reference/fill-and-stroke-alpha.traps.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke.base.argb32.ref.png create mode 100644 test/reference/fill-and-stroke.base.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke.image16.ref.png create mode 100644 test/reference/fill-and-stroke.ps.argb32.ref.png create mode 100644 test/reference/fill-and-stroke.ps.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke.quartz.argb32.ref.png create mode 100644 test/reference/fill-and-stroke.quartz.rgb24.ref.png create mode 100644 test/reference/fill-and-stroke.ref.png create mode 100644 test/reference/fill-and-stroke.traps.argb32.ref.png create mode 100644 test/reference/fill-and-stroke.traps.rgb24.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.argb32.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.base.argb32.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.base.rgb24.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.image16.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.ps.argb32.xfail.png create mode 100644 test/reference/fill-degenerate-sort-order.ps.rgb24.xfail.png create mode 100644 test/reference/fill-degenerate-sort-order.quartz.argb32.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.quartz.rgb24.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.rgb24.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.traps.argb32.ref.png create mode 100644 test/reference/fill-degenerate-sort-order.traps.rgb24.ref.png create mode 100644 test/reference/fill-disjoint.base.argb32.ref.png create mode 100644 test/reference/fill-disjoint.base.rgb24.ref.png create mode 100644 test/reference/fill-disjoint.ref.png create mode 100644 test/reference/fill-empty.base.argb32.ref.png create mode 100644 test/reference/fill-empty.base.rgb24.ref.png create mode 100644 test/reference/fill-empty.ref.png create mode 100644 test/reference/fill-empty.svg12.rgb24.xfail.png create mode 100644 test/reference/fill-image.base.argb32.ref.png create mode 100644 test/reference/fill-image.base.rgb24.ref.png create mode 100644 test/reference/fill-image.image16.ref.png create mode 100644 test/reference/fill-image.ps.ref.png create mode 100644 test/reference/fill-image.quartz.ref.png create mode 100644 test/reference/fill-image.ref.png create mode 100644 test/reference/fill-image.traps.argb32.ref.png create mode 100644 test/reference/fill-image.traps.rgb24.ref.png create mode 100644 test/reference/fill-missed-stop.base.argb32.ref.png create mode 100644 test/reference/fill-missed-stop.base.rgb24.ref.png create mode 100644 test/reference/fill-missed-stop.pdf.argb32.ref.png create mode 100644 test/reference/fill-missed-stop.ps2.argb32.ref.png create mode 100644 test/reference/fill-missed-stop.ps2.rgb24.ref.png create mode 100644 test/reference/fill-missed-stop.ps3.argb32.ref.png create mode 100644 test/reference/fill-missed-stop.ps3.rgb24.ref.png create mode 100644 test/reference/fill-missed-stop.ref.png create mode 100644 test/reference/fill-missed-stop.traps.argb32.ref.png create mode 100644 test/reference/fill-missed-stop.traps.rgb24.ref.png create mode 100644 test/reference/fill-rule.argb32.ref.png create mode 100644 test/reference/fill-rule.base.argb32.ref.png create mode 100644 test/reference/fill-rule.base.rgb24.ref.png create mode 100644 test/reference/fill-rule.image16.ref.png create mode 100644 test/reference/fill-rule.ps2.argb32.ref.png create mode 100644 test/reference/fill-rule.ps2.rgb24.ref.png create mode 100644 test/reference/fill-rule.ps3.argb32.ref.png create mode 100644 test/reference/fill-rule.ps3.rgb24.ref.png create mode 100644 test/reference/fill-rule.quartz.argb32.ref.png create mode 100644 test/reference/fill-rule.quartz.rgb24.ref.png create mode 100644 test/reference/fill-rule.rgb24.ref.png create mode 100644 test/reference/fill-rule.traps.argb32.ref.png create mode 100644 test/reference/fill-rule.traps.rgb24.ref.png create mode 100644 test/reference/fill-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/fill-xlib-window.rgb24.ref.png create mode 100644 test/reference/fill-xlib.ref.png create mode 100644 test/reference/fill.image.argb32.ref.png create mode 100644 test/reference/fill.image.rgb24.ref.png create mode 100644 test/reference/filter-bilinear-extents.base.argb32.ref.png create mode 100644 test/reference/filter-bilinear-extents.base.rgb24.ref.png create mode 100644 test/reference/filter-bilinear-extents.image16.ref.png create mode 100644 test/reference/filter-bilinear-extents.pdf.xfail.png create mode 100644 test/reference/filter-bilinear-extents.ps2.ref.png create mode 100644 test/reference/filter-bilinear-extents.ps3.ref.png create mode 100644 test/reference/filter-bilinear-extents.quartz.xfail.png create mode 100644 test/reference/filter-bilinear-extents.ref.png create mode 100644 test/reference/filter-nearest-offset.base.argb32.ref.png create mode 100644 test/reference/filter-nearest-offset.base.rgb24.ref.png create mode 100644 test/reference/filter-nearest-offset.gl.xfail.png create mode 100644 test/reference/filter-nearest-offset.pdf.xfail.png create mode 100644 test/reference/filter-nearest-offset.ps2.ref.png create mode 100644 test/reference/filter-nearest-offset.ps3.ref.png create mode 100644 test/reference/filter-nearest-offset.ref.png create mode 100644 test/reference/filter-nearest-offset.svg.xfail.png create mode 100644 test/reference/filter-nearest-transformed.base.argb32.ref.png create mode 100644 test/reference/filter-nearest-transformed.base.rgb24.ref.png create mode 100644 test/reference/filter-nearest-transformed.gl.xfail.png create mode 100644 test/reference/filter-nearest-transformed.image16.ref.png create mode 100644 test/reference/filter-nearest-transformed.pdf.xfail.png create mode 100644 test/reference/filter-nearest-transformed.quartz.xfail.png create mode 100644 test/reference/filter-nearest-transformed.ref.png create mode 100644 test/reference/filter-nearest-transformed.svg.xfail.png create mode 100644 test/reference/finer-grained-fallbacks.base.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.base.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.gl.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.image16.ref.png create mode 100644 test/reference/finer-grained-fallbacks.mask.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.mask.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ps2.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ps2.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ps2.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ps3.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ps3.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ps3.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.quartz.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.quartz.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.ref.png create mode 100644 test/reference/finer-grained-fallbacks.svg12.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.svg12.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.traps.argb32.ref.png create mode 100644 test/reference/finer-grained-fallbacks.traps.rgb24.ref.png create mode 100644 test/reference/finer-grained-fallbacks.xlib-fallback.ref.png create mode 100644 test/reference/font-matrix-translation.base.argb32.ref.png create mode 100644 test/reference/font-matrix-translation.base.rgb24.ref.png create mode 100644 test/reference/font-matrix-translation.image16.ref.png create mode 100644 test/reference/font-matrix-translation.ps2.argb32.ref.png create mode 100644 test/reference/font-matrix-translation.ps2.rgb24.ref.png create mode 100644 test/reference/font-matrix-translation.ps3.argb32.ref.png create mode 100644 test/reference/font-matrix-translation.ps3.rgb24.ref.png create mode 100644 test/reference/font-matrix-translation.quartz.ref.png create mode 100644 test/reference/font-matrix-translation.ref.png create mode 100644 test/reference/font-matrix-translation.svg.ref.png create mode 100644 test/reference/font-matrix-translation.traps.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.base.argb32.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.base.rgb24.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.image16.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.pdf.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.ps2.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.ps3.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.svg.ref.png create mode 100644 test/reference/ft-show-glyphs-positioning.traps.ref.png create mode 100644 test/reference/ft-show-glyphs-table.base.argb32.ref.png create mode 100644 test/reference/ft-show-glyphs-table.base.rgb24.ref.png create mode 100644 test/reference/ft-show-glyphs-table.image16.ref.png create mode 100644 test/reference/ft-show-glyphs-table.ps2.ref.png create mode 100644 test/reference/ft-show-glyphs-table.ps3.ref.png create mode 100644 test/reference/ft-show-glyphs-table.quartz.xfail.png create mode 100644 test/reference/ft-show-glyphs-table.ref.png create mode 100644 test/reference/ft-show-glyphs-table.svg.ref.png create mode 100644 test/reference/ft-show-glyphs-table.traps.ref.png create mode 100644 test/reference/ft-text-antialias-none.base.argb32.ref.png create mode 100644 test/reference/ft-text-antialias-none.base.rgb24.ref.png create mode 100644 test/reference/ft-text-antialias-none.ps2.argb32.ref.png create mode 100644 test/reference/ft-text-antialias-none.ps3.argb32.ref.png create mode 100644 test/reference/ft-text-antialias-none.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.base.argb32.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.base.rgb24.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.image16.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.pdf.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.ps.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.quartz.xfail.png create mode 100644 test/reference/ft-text-vertical-layout-type1.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.svg.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.traps.argb32.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.traps.rgb24.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type1.xfail.png create mode 100644 test/reference/ft-text-vertical-layout-type3.base.argb32.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.base.rgb24.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.image16.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.mask.argb32.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.mask.rgb24.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.pdf.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.ps.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.quartz.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.svg.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.traps.argb32.ref.png create mode 100644 test/reference/ft-text-vertical-layout-type3.traps.rgb24.ref.png create mode 100644 test/reference/get-group-target.base.argb32.ref.png create mode 100644 test/reference/get-group-target.base.rgb24.ref.png create mode 100644 test/reference/get-group-target.ref.png create mode 100644 test/reference/gl-surface-source.base.argb32.ref.png create mode 100644 test/reference/gl-surface-source.base.rgb24.ref.png create mode 100644 test/reference/gl-surface-source.image16.ref.png create mode 100644 test/reference/gl-surface-source.ref.png create mode 100644 test/reference/glyph-cache-pressure.base.argb32.ref.png create mode 100644 test/reference/glyph-cache-pressure.base.rgb24.ref.png create mode 100644 test/reference/glyph-cache-pressure.image16.ref.png create mode 100644 test/reference/glyph-cache-pressure.ps2.ref.png create mode 100644 test/reference/glyph-cache-pressure.ps3.ref.png create mode 100644 test/reference/glyph-cache-pressure.quartz.ref.png create mode 100644 test/reference/glyph-cache-pressure.ref.png create mode 100644 test/reference/glyph-cache-pressure.traps.ref.png create mode 100644 test/reference/gradient-alpha.base.argb32.ref.png create mode 100644 test/reference/gradient-alpha.base.rgb24.ref.png create mode 100644 test/reference/gradient-alpha.ps2.argb32.ref.png create mode 100644 test/reference/gradient-alpha.ps2.rgb24.ref.png create mode 100644 test/reference/gradient-alpha.ps3.argb32.ref.png create mode 100644 test/reference/gradient-alpha.ps3.rgb24.ref.png create mode 100644 test/reference/gradient-alpha.ref.png create mode 100644 test/reference/gradient-constant-alpha.base.argb32.ref.png create mode 100644 test/reference/gradient-constant-alpha.base.rgb24.ref.png create mode 100644 test/reference/gradient-constant-alpha.ps3.ref.png create mode 100644 test/reference/gradient-constant-alpha.ps3.rgb24.ref.png create mode 100644 test/reference/gradient-constant-alpha.quartz.argb32.ref.png create mode 100644 test/reference/gradient-constant-alpha.ref.png create mode 100644 test/reference/gradient-zero-stops-mask.base.argb32.ref.png create mode 100644 test/reference/gradient-zero-stops-mask.base.rgb24.ref.png create mode 100644 test/reference/gradient-zero-stops-mask.ref.png create mode 100644 test/reference/gradient-zero-stops.base.argb32.ref.png create mode 100644 test/reference/gradient-zero-stops.base.rgb24.ref.png create mode 100644 test/reference/gradient-zero-stops.ref.png create mode 100644 test/reference/group-clip.base.argb32.ref.png create mode 100644 test/reference/group-clip.base.rgb24.ref.png create mode 100644 test/reference/group-clip.image16.ref.png create mode 100644 test/reference/group-clip.ref.png create mode 100644 test/reference/group-paint.base.argb32.ref.png create mode 100644 test/reference/group-paint.base.rgb24.ref.png create mode 100644 test/reference/group-paint.ref.png create mode 100644 test/reference/group-unaligned.base.argb32.ref.png create mode 100644 test/reference/group-unaligned.base.rgb24.ref.png create mode 100644 test/reference/group-unaligned.image16.ref.png create mode 100644 test/reference/group-unaligned.ps.ref.png create mode 100644 test/reference/group-unaligned.ps.rgb24.xfail.png create mode 100644 test/reference/group-unaligned.quartz.ref.png create mode 100644 test/reference/group-unaligned.ref.png create mode 100644 test/reference/group-unaligned.svg.argb32.xfail.png create mode 100644 test/reference/group-unaligned.svg.rgb24.xfail.png create mode 100644 test/reference/group-unaligned.traps.argb32.ref.png create mode 100644 test/reference/group-unaligned.traps.rgb24.ref.png create mode 100644 test/reference/group-unaligned.xlib-fallback.ref.png create mode 100644 test/reference/halo-transform.base.argb32.ref.png create mode 100644 test/reference/halo-transform.base.rgb24.ref.png create mode 100644 test/reference/halo-transform.image16.ref.png create mode 100644 test/reference/halo-transform.ps.ref.png create mode 100644 test/reference/halo-transform.quartz.ref.png create mode 100644 test/reference/halo-transform.ref.png create mode 100644 test/reference/halo-transform.traps.ref.png create mode 100644 test/reference/halo.base.argb32.ref.png create mode 100644 test/reference/halo.base.rgb24.ref.png create mode 100644 test/reference/halo.image16.ref.png create mode 100644 test/reference/halo.mask.argb32.ref.png create mode 100644 test/reference/halo.mask.rgb24.ref.png create mode 100644 test/reference/halo.ps.ref.png create mode 100644 test/reference/halo.quartz.ref.png create mode 100644 test/reference/halo.ref.png create mode 100644 test/reference/halo.traps.ref.png create mode 100644 test/reference/hatchings.base.argb32.ref.png create mode 100644 test/reference/hatchings.base.rgb24.ref.png create mode 100644 test/reference/hatchings.mask.argb32.ref.png create mode 100644 test/reference/hatchings.mask.rgb24.ref.png create mode 100644 test/reference/hatchings.ref.png create mode 100644 test/reference/hatchings.traps.argb32.ref.png create mode 100644 test/reference/hatchings.traps.rgb24.ref.png create mode 100644 test/reference/horizontal-clip.base.argb32.ref.png create mode 100644 test/reference/horizontal-clip.base.rgb24.ref.png create mode 100644 test/reference/horizontal-clip.ref.png create mode 100644 test/reference/huge-linear.base.argb32.ref.png create mode 100644 test/reference/huge-linear.base.rgb24.ref.png create mode 100644 test/reference/huge-linear.image16.ref.png create mode 100644 test/reference/huge-linear.pdf.ref.png create mode 100644 test/reference/huge-linear.ps3.ref.png create mode 100644 test/reference/huge-linear.quartz.ref.png create mode 100644 test/reference/huge-linear.ref.png create mode 100644 test/reference/huge-radial.base.argb32.ref.png create mode 100644 test/reference/huge-radial.base.rgb24.ref.png create mode 100644 test/reference/huge-radial.image16.ref.png create mode 100644 test/reference/huge-radial.ps3.ref.png create mode 100644 test/reference/huge-radial.quartz.ref.png create mode 100644 test/reference/huge-radial.ref.png create mode 100644 test/reference/image-bug-710072-aligned.base.argb32.ref.png create mode 100644 test/reference/image-bug-710072-aligned.base.rgb24.ref.png create mode 100644 test/reference/image-bug-710072-aligned.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.base.argb32.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.base.rgb24.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.traps.argb32.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.traps.rgb24.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.xlib-fallback.rgb24.ref.png create mode 100644 test/reference/image-bug-710072-unaligned.xlib-window.rgb24.ref.png create mode 100644 test/reference/image-surface-source.base.argb32.ref.png create mode 100644 test/reference/image-surface-source.base.rgb24.ref.png create mode 100644 test/reference/image-surface-source.image16.ref.png create mode 100644 test/reference/image-surface-source.ps2.ref.png create mode 100644 test/reference/image-surface-source.ps3.ref.png create mode 100644 test/reference/image-surface-source.ref.png create mode 100644 test/reference/image-surface-source.svg12.argb32.xfail.png create mode 100644 test/reference/image-surface-source.svg12.rgb24.xfail.png create mode 100644 test/reference/implicit-close.base.argb32.ref.png create mode 100644 test/reference/implicit-close.base.rgb24.ref.png create mode 100644 test/reference/implicit-close.ps.ref.png create mode 100644 test/reference/implicit-close.ref.png create mode 100644 test/reference/implicit-close.traps.argb32.ref.png create mode 100644 test/reference/implicit-close.traps.rgb24.ref.png create mode 100644 test/reference/infinite-join.base.argb32.ref.png create mode 100644 test/reference/infinite-join.base.rgb24.ref.png create mode 100644 test/reference/infinite-join.ps2.ref.png create mode 100644 test/reference/infinite-join.ps3.ref.png create mode 100644 test/reference/infinite-join.ref.png create mode 100644 test/reference/infinite-join.traps.argb32.ref.png create mode 100644 test/reference/infinite-join.traps.rgb24.ref.png create mode 100644 test/reference/inverse-text.base.argb32.ref.png create mode 100644 test/reference/inverse-text.base.rgb24.ref.png create mode 100644 test/reference/inverse-text.mask.argb32.ref.png create mode 100644 test/reference/inverse-text.mask.rgb24.ref.png create mode 100644 test/reference/inverse-text.ref.png create mode 100644 test/reference/inverse-text.traps.ref.png create mode 100644 test/reference/inverted-clip.argb32.ref.png create mode 100644 test/reference/inverted-clip.base.xfail.png create mode 100644 test/reference/inverted-clip.rgb24.ref.png create mode 100644 test/reference/inverted-clip.traps.xfail.png create mode 100644 test/reference/inverted-clip.xfail.png create mode 100644 test/reference/joins-loop.base.argb32.ref.png create mode 100644 test/reference/joins-loop.base.rgb24.ref.png create mode 100644 test/reference/joins-loop.ref.png create mode 100644 test/reference/joins-loop.traps.argb32.ref.png create mode 100644 test/reference/joins-loop.traps.rgb24.ref.png create mode 100644 test/reference/joins-retrace.base.argb32.ref.png create mode 100644 test/reference/joins-retrace.base.rgb24.ref.png create mode 100644 test/reference/joins-retrace.mask.argb32.ref.png create mode 100644 test/reference/joins-retrace.mask.rgb24.ref.png create mode 100644 test/reference/joins-retrace.ref.png create mode 100644 test/reference/joins-retrace.traps.argb32.ref.png create mode 100644 test/reference/joins-retrace.traps.rgb24.ref.png create mode 100644 test/reference/joins-star.base.argb32.ref.png create mode 100644 test/reference/joins-star.base.rgb24.ref.png create mode 100644 test/reference/joins-star.ref.png create mode 100644 test/reference/joins-star.traps.argb32.ref.png create mode 100644 test/reference/joins-star.traps.rgb24.ref.png create mode 100644 test/reference/joins.base.argb32.ref.png create mode 100644 test/reference/joins.base.rgb24.ref.png create mode 100644 test/reference/joins.image16.ref.png create mode 100644 test/reference/joins.mask.argb32.ref.png create mode 100644 test/reference/joins.mask.rgb24.ref.png create mode 100644 test/reference/joins.ps.ref.png create mode 100644 test/reference/joins.quartz.ref.png create mode 100644 test/reference/joins.ref.png create mode 100644 test/reference/joins.traps.argb32.ref.png create mode 100644 test/reference/joins.traps.rgb24.ref.png create mode 100644 test/reference/large-clip.base.argb32.ref.png create mode 100644 test/reference/large-clip.base.rgb24.ref.png create mode 100644 test/reference/large-clip.ref.png create mode 100644 test/reference/large-font.base.argb32.ref.png create mode 100644 test/reference/large-font.base.rgb24.ref.png create mode 100644 test/reference/large-font.image16.ref.png create mode 100644 test/reference/large-font.ref.png create mode 100644 test/reference/large-source-roi.base.argb32.ref.png create mode 100644 test/reference/large-source-roi.base.rgb24.ref.png create mode 100644 test/reference/large-source-roi.ref.png create mode 100644 test/reference/large-source.base.argb32.ref.png create mode 100644 test/reference/large-source.base.rgb24.ref.png create mode 100644 test/reference/large-source.ref.png create mode 100644 test/reference/large-twin-antialias-mixed.base.argb32.ref.png create mode 100644 test/reference/large-twin-antialias-mixed.base.rgb24.ref.png create mode 100644 test/reference/large-twin-antialias-mixed.image16.ref.png create mode 100644 test/reference/large-twin-antialias-mixed.ref.png create mode 100644 test/reference/large-twin-antialias-mixed.traps.argb32.ref.png create mode 100644 test/reference/large-twin-antialias-mixed.traps.rgb24.ref.png create mode 100644 test/reference/leaky-dash.base.argb32.ref.png create mode 100644 test/reference/leaky-dash.base.rgb24.ref.png create mode 100644 test/reference/leaky-dash.ps2.argb32.ref.png create mode 100644 test/reference/leaky-dash.ps2.rgb24.ref.png create mode 100644 test/reference/leaky-dash.ps3.argb32.ref.png create mode 100644 test/reference/leaky-dash.ps3.rgb24.ref.png create mode 100644 test/reference/leaky-dash.quartz.ref.png create mode 100644 test/reference/leaky-dash.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.base.argb32.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.base.rgb24.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.image16.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.pdf.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.ps.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.quartz.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.traps.argb32.ref.png create mode 100644 test/reference/leaky-dashed-rectangle.traps.rgb24.ref.png create mode 100644 test/reference/leaky-dashed-stroke.base.argb32.ref.png create mode 100644 test/reference/leaky-dashed-stroke.base.rgb24.ref.png create mode 100644 test/reference/leaky-dashed-stroke.image16.ref.png create mode 100644 test/reference/leaky-dashed-stroke.ps.ref.png create mode 100644 test/reference/leaky-dashed-stroke.quartz.ref.png create mode 100644 test/reference/leaky-dashed-stroke.ref.png create mode 100644 test/reference/leaky-dashed-stroke.traps.argb32.ref.png create mode 100644 test/reference/leaky-dashed-stroke.traps.rgb24.ref.png create mode 100644 test/reference/leaky-polygon.base.argb32.ref.png create mode 100644 test/reference/leaky-polygon.base.rgb24.ref.png create mode 100644 test/reference/leaky-polygon.image16.ref.png create mode 100644 test/reference/leaky-polygon.ps.ref.png create mode 100644 test/reference/leaky-polygon.ref.png create mode 100644 test/reference/leaky-polygon.traps.argb32.ref.png create mode 100644 test/reference/leaky-polygon.traps.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.base.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.base.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.mask.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.mask.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.traps.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-dashed.traps.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-flipped.base.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-flipped.base.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-flipped.ref.png create mode 100644 test/reference/line-width-large-overlap-flopped.base.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-flopped.base.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-flopped.ref.png create mode 100644 test/reference/line-width-large-overlap-offset.base.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-offset.base.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-offset.ref.png create mode 100644 test/reference/line-width-large-overlap-rotated.base.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap-rotated.base.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap-rotated.ref.png create mode 100644 test/reference/line-width-large-overlap-rotated.traps.ref.png create mode 100644 test/reference/line-width-large-overlap.base.argb32.ref.png create mode 100644 test/reference/line-width-large-overlap.base.rgb24.ref.png create mode 100644 test/reference/line-width-large-overlap.ref.png create mode 100644 test/reference/line-width-overlap-dashed.base.argb32.ref.png create mode 100644 test/reference/line-width-overlap-dashed.base.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-dashed.mask.argb32.ref.png create mode 100644 test/reference/line-width-overlap-dashed.mask.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-dashed.ref.png create mode 100644 test/reference/line-width-overlap-dashed.traps.argb32.ref.png create mode 100644 test/reference/line-width-overlap-dashed.traps.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-flipped.base.argb32.ref.png create mode 100644 test/reference/line-width-overlap-flipped.base.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-flipped.ref.png create mode 100644 test/reference/line-width-overlap-flopped.base.argb32.ref.png create mode 100644 test/reference/line-width-overlap-flopped.base.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-flopped.ref.png create mode 100644 test/reference/line-width-overlap-offset.base.argb32.ref.png create mode 100644 test/reference/line-width-overlap-offset.base.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-offset.ref.png create mode 100644 test/reference/line-width-overlap-offset.traps.ref.png create mode 100644 test/reference/line-width-overlap-rotated.base.argb32.ref.png create mode 100644 test/reference/line-width-overlap-rotated.base.rgb24.ref.png create mode 100644 test/reference/line-width-overlap-rotated.ref.png create mode 100644 test/reference/line-width-overlap-rotated.traps.argb32.ref.png create mode 100644 test/reference/line-width-overlap-rotated.traps.rgb24.ref.png create mode 100644 test/reference/line-width-overlap.base.argb32.ref.png create mode 100644 test/reference/line-width-overlap.base.rgb24.ref.png create mode 100644 test/reference/line-width-overlap.ref.png create mode 100644 test/reference/line-width-scale.base.argb32.ref.png create mode 100644 test/reference/line-width-scale.base.rgb24.ref.png create mode 100644 test/reference/line-width-scale.image16.ref.png create mode 100644 test/reference/line-width-scale.ps2.ref.png create mode 100644 test/reference/line-width-scale.ps3.ref.png create mode 100644 test/reference/line-width-scale.quartz.ref.png create mode 100644 test/reference/line-width-scale.ref.png create mode 100644 test/reference/line-width-scale.traps.argb32.ref.png create mode 100644 test/reference/line-width-scale.traps.rgb24.ref.png create mode 100644 test/reference/line-width-tolerance.base.argb32.ref.png create mode 100644 test/reference/line-width-tolerance.base.rgb24.ref.png create mode 100644 test/reference/line-width-tolerance.ref.png create mode 100644 test/reference/line-width-tolerance.traps.argb32.ref.png create mode 100644 test/reference/line-width-tolerance.traps.rgb24.ref.png create mode 100644 test/reference/line-width.base.argb32.ref.png create mode 100644 test/reference/line-width.base.rgb24.ref.png create mode 100644 test/reference/line-width.ref.png create mode 100644 test/reference/line-width.traps.argb32.ref.png create mode 100644 test/reference/line-width.traps.rgb24.ref.png create mode 100644 test/reference/linear-gradient-extend.base.argb32.ref.png create mode 100644 test/reference/linear-gradient-extend.base.rgb24.ref.png create mode 100644 test/reference/linear-gradient-extend.ref.png create mode 100644 test/reference/linear-gradient-large.base.argb32.ref.png create mode 100644 test/reference/linear-gradient-large.base.rgb24.ref.png create mode 100644 test/reference/linear-gradient-large.quartz.ref.png create mode 100644 test/reference/linear-gradient-large.ref.png create mode 100644 test/reference/linear-gradient-one-stop.base.argb32.ref.png create mode 100644 test/reference/linear-gradient-one-stop.base.rgb24.ref.png create mode 100644 test/reference/linear-gradient-one-stop.ref.png create mode 100644 test/reference/linear-gradient-reflect.base.argb32.ref.png create mode 100644 test/reference/linear-gradient-reflect.base.rgb24.ref.png create mode 100644 test/reference/linear-gradient-reflect.image16.ref.png create mode 100644 test/reference/linear-gradient-reflect.pdf.argb32.ref.png create mode 100644 test/reference/linear-gradient-reflect.pdf.rgb24.ref.png create mode 100644 test/reference/linear-gradient-reflect.ps3.ref.png create mode 100644 test/reference/linear-gradient-reflect.quartz.ref.png create mode 100644 test/reference/linear-gradient-reflect.ref.png create mode 100644 test/reference/linear-gradient-subset.base.argb32.ref.png create mode 100644 test/reference/linear-gradient-subset.base.rgb24.ref.png create mode 100644 test/reference/linear-gradient-subset.image16.ref.png create mode 100644 test/reference/linear-gradient-subset.ps3.ref.png create mode 100644 test/reference/linear-gradient-subset.quartz.ref.png create mode 100644 test/reference/linear-gradient-subset.ref.png create mode 100644 test/reference/linear-gradient-subset.traps.argb32.ref.png create mode 100644 test/reference/linear-gradient-subset.traps.rgb24.ref.png create mode 100644 test/reference/linear-gradient.base.argb32.ref.png create mode 100644 test/reference/linear-gradient.base.rgb24.ref.png create mode 100644 test/reference/linear-gradient.image16.ref.png create mode 100644 test/reference/linear-gradient.ps3.ref.png create mode 100644 test/reference/linear-gradient.quartz.ref.png create mode 100644 test/reference/linear-gradient.ref.png create mode 100644 test/reference/linear-gradient.traps.argb32.ref.png create mode 100644 test/reference/linear-gradient.traps.rgb24.ref.png create mode 100644 test/reference/linear-step-function.base.argb32.ref.png create mode 100644 test/reference/linear-step-function.base.rgb24.ref.png create mode 100644 test/reference/linear-step-function.mask.argb32.ref.png create mode 100644 test/reference/linear-step-function.mask.rgb24.ref.png create mode 100644 test/reference/linear-step-function.traps.argb32.ref.png create mode 100644 test/reference/linear-step-function.traps.rgb24.ref.png create mode 100644 test/reference/linear-step-function.xfail.png create mode 100644 test/reference/linear-uniform.base.argb32.ref.png create mode 100644 test/reference/linear-uniform.base.rgb24.ref.png create mode 100644 test/reference/linear-uniform.image16.ref.png create mode 100644 test/reference/linear-uniform.ref.png create mode 100644 test/reference/long-dashed-lines.base.argb32.ref.png create mode 100644 test/reference/long-dashed-lines.base.rgb24.ref.png create mode 100644 test/reference/long-dashed-lines.image16.ref.png create mode 100644 test/reference/long-dashed-lines.ps2.ref.png create mode 100644 test/reference/long-dashed-lines.ps3.ref.png create mode 100644 test/reference/long-dashed-lines.quartz.ref.png create mode 100644 test/reference/long-dashed-lines.ref.png create mode 100644 test/reference/long-dashed-lines.traps.argb32.ref.png create mode 100644 test/reference/long-dashed-lines.traps.rgb24.ref.png create mode 100644 test/reference/long-lines.base.argb32.ref.png create mode 100644 test/reference/long-lines.base.rgb24.ref.png create mode 100644 test/reference/long-lines.mask.argb32.ref.png create mode 100644 test/reference/long-lines.mask.rgb24.ref.png create mode 100644 test/reference/long-lines.traps.argb32.ref.png create mode 100644 test/reference/long-lines.traps.rgb24.ref.png create mode 100644 test/reference/map-all-to-image.base.argb32.ref.png create mode 100644 test/reference/map-all-to-image.base.rgb24.ref.png create mode 100644 test/reference/map-all-to-image.ref.png create mode 100644 test/reference/map-all-to-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/map-all-to-xlib-window.rgb24.ref.png create mode 100644 test/reference/map-all-to-xlib.ref.png create mode 100644 test/reference/map-bit-to-image.base.argb32.ref.png create mode 100644 test/reference/map-bit-to-image.base.rgb24.ref.png create mode 100644 test/reference/map-bit-to-image.ref.png create mode 100644 test/reference/map-bit-to-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/map-bit-to-xlib-window.rgb24.ref.png create mode 100644 test/reference/map-bit-to-xlib.ref.png create mode 100644 test/reference/map-to-image-fill.base.argb32.ref.png create mode 100644 test/reference/map-to-image-fill.base.rgb24.ref.png create mode 100644 test/reference/map-to-image-fill.ref.png create mode 100644 test/reference/mask-alpha.argb32.ref.png create mode 100644 test/reference/mask-alpha.base.argb32.ref.png create mode 100644 test/reference/mask-alpha.base.rgb24.ref.png create mode 100644 test/reference/mask-alpha.image16.ref.png create mode 100644 test/reference/mask-alpha.ps.ref.png create mode 100644 test/reference/mask-alpha.quartz.argb32.ref.png create mode 100644 test/reference/mask-alpha.rgb24.ref.png create mode 100644 test/reference/mask-alpha.svg.rgb24.xfail.png create mode 100644 test/reference/mask-alpha.traps.argb32.ref.png create mode 100644 test/reference/mask-alpha.traps.rgb24.ref.png create mode 100644 test/reference/mask-ctm.base.argb32.ref.png create mode 100644 test/reference/mask-ctm.base.rgb24.ref.png create mode 100644 test/reference/mask-ctm.ref.png create mode 100644 test/reference/mask-glyphs.gl.ref.png create mode 100644 test/reference/mask-glyphs.image16.ref.png create mode 100644 test/reference/mask-glyphs.pdf.ref.png create mode 100644 test/reference/mask-glyphs.ref.png create mode 100644 test/reference/mask-glyphs.svg.ref.png create mode 100644 test/reference/mask-surface-ctm.base.argb32.ref.png create mode 100644 test/reference/mask-surface-ctm.base.rgb24.ref.png create mode 100644 test/reference/mask-surface-ctm.ref.png create mode 100644 test/reference/mask-transformed-image.base.argb32.ref.png create mode 100644 test/reference/mask-transformed-image.base.rgb24.ref.png create mode 100644 test/reference/mask-transformed-image.image16.ref.png create mode 100644 test/reference/mask-transformed-image.pdf.ref.png create mode 100644 test/reference/mask-transformed-image.quartz.ref.png create mode 100644 test/reference/mask-transformed-image.ref.png create mode 100644 test/reference/mask-transformed-similar.base.argb32.ref.png create mode 100644 test/reference/mask-transformed-similar.base.rgb24.ref.png create mode 100644 test/reference/mask-transformed-similar.image16.ref.png create mode 100644 test/reference/mask-transformed-similar.pdf.ref.png create mode 100644 test/reference/mask-transformed-similar.quartz.ref.png create mode 100644 test/reference/mask-transformed-similar.recording.ref.png create mode 100644 test/reference/mask-transformed-similar.ref.png create mode 100644 test/reference/mask-transformed-similar.svg.ref.png create mode 100644 test/reference/mask-transformed-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/mask-transformed-xlib-window.rgb24.ref.png create mode 100644 test/reference/mask-transformed-xlib.ref.png create mode 100644 test/reference/mask.argb32.ref.png create mode 100644 test/reference/mask.base.argb32.ref.png create mode 100644 test/reference/mask.base.rgb24.ref.png create mode 100644 test/reference/mask.image16.ref.png create mode 100644 test/reference/mask.pdf.argb32.ref.png create mode 100644 test/reference/mask.pdf.rgb24.ref.png create mode 100644 test/reference/mask.quartz.argb32.ref.png create mode 100644 test/reference/mask.quartz.rgb24.ref.png create mode 100644 test/reference/mask.rgb24.ref.png create mode 100644 test/reference/mask.svg.argb32.xfail.png create mode 100644 test/reference/mask.svg.rgb24.xfail.png create mode 100644 test/reference/mask.traps.argb32.ref.png create mode 100644 test/reference/mask.traps.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-accuracy.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern-accuracy.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-accuracy.image16.ref.png create mode 100644 test/reference/mesh-pattern-accuracy.ref.png create mode 100644 test/reference/mesh-pattern-conical.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern-conical.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-conical.image16.ref.png create mode 100644 test/reference/mesh-pattern-conical.ref.png create mode 100644 test/reference/mesh-pattern-control-points.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern-control-points.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-control-points.image16.ref.png create mode 100644 test/reference/mesh-pattern-control-points.ref.png create mode 100644 test/reference/mesh-pattern-fold.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern-fold.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-fold.image16.ref.png create mode 100644 test/reference/mesh-pattern-fold.ref.png create mode 100644 test/reference/mesh-pattern-overlap.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern-overlap.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-overlap.image16.ref.png create mode 100644 test/reference/mesh-pattern-overlap.ref.png create mode 100644 test/reference/mesh-pattern-transformed.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern-transformed.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern-transformed.image16.ref.png create mode 100644 test/reference/mesh-pattern-transformed.ref.png create mode 100644 test/reference/mesh-pattern.base.argb32.ref.png create mode 100644 test/reference/mesh-pattern.base.rgb24.ref.png create mode 100644 test/reference/mesh-pattern.image16.ref.png create mode 100644 test/reference/mesh-pattern.ref.png create mode 100644 test/reference/mime-data.base.argb32.ref.png create mode 100644 test/reference/mime-data.base.rgb24.ref.png create mode 100644 test/reference/mime-data.pdf.ref.png create mode 100644 test/reference/mime-data.ps.ref.png create mode 100644 test/reference/mime-data.ref.png create mode 100644 test/reference/mime-data.script.ref.png create mode 100644 test/reference/mime-data.svg.ref.png create mode 100644 test/reference/miter-precision.base.argb32.ref.png create mode 100644 test/reference/miter-precision.base.rgb24.ref.png create mode 100644 test/reference/miter-precision.ps2.ref.png create mode 100644 test/reference/miter-precision.ps3.ref.png create mode 100644 test/reference/miter-precision.ref.png create mode 100644 test/reference/miter-precision.traps.argb32.ref.png create mode 100644 test/reference/miter-precision.traps.rgb24.ref.png create mode 100644 test/reference/move-to-show-surface.base.argb32.ref.png create mode 100644 test/reference/move-to-show-surface.base.rgb24.ref.png create mode 100644 test/reference/move-to-show-surface.ref.png create mode 100644 test/reference/negative-stride-image.base.argb32.ref.png create mode 100644 test/reference/negative-stride-image.base.rgb24.ref.png create mode 100644 test/reference/negative-stride-image.image16.ref.png create mode 100644 test/reference/negative-stride-image.ps.ref.png create mode 100644 test/reference/negative-stride-image.ref.png create mode 100644 test/reference/new-sub-path.base.argb32.ref.png create mode 100644 test/reference/new-sub-path.base.rgb24.ref.png create mode 100644 test/reference/new-sub-path.pdf.argb32.ref.png create mode 100644 test/reference/new-sub-path.ps2.argb32.ref.png create mode 100644 test/reference/new-sub-path.ps2.rgb24.ref.png create mode 100644 test/reference/new-sub-path.ps3.argb32.ref.png create mode 100644 test/reference/new-sub-path.ps3.rgb24.ref.png create mode 100644 test/reference/new-sub-path.quartz.ref.png create mode 100644 test/reference/new-sub-path.ref.png create mode 100644 test/reference/new-sub-path.traps.argb32.ref.png create mode 100644 test/reference/new-sub-path.traps.rgb24.ref.png create mode 100644 test/reference/nil-surface.base.argb32.ref.png create mode 100644 test/reference/nil-surface.base.rgb24.ref.png create mode 100644 test/reference/nil-surface.ref.png create mode 100644 test/reference/operator-alpha-alpha.base.argb32.ref.png create mode 100644 test/reference/operator-alpha-alpha.base.rgb24.ref.png create mode 100644 test/reference/operator-alpha-alpha.image16.ref.png create mode 100644 test/reference/operator-alpha-alpha.pdf.xfail.png create mode 100644 test/reference/operator-alpha-alpha.ps.xfail.png create mode 100644 test/reference/operator-alpha-alpha.ref.png create mode 100644 test/reference/operator-alpha-alpha.svg.xfail.png create mode 100644 test/reference/operator-alpha-alpha.traps.argb32.ref.png create mode 100644 test/reference/operator-alpha-alpha.traps.rgb24.ref.png create mode 100644 test/reference/operator-alpha.argb32.ref.png create mode 100644 test/reference/operator-alpha.base.argb32.ref.png create mode 100644 test/reference/operator-alpha.base.rgb24.ref.png create mode 100644 test/reference/operator-alpha.rgb24.ref.png create mode 100644 test/reference/operator-alpha.svg12.argb32.xfail.png create mode 100644 test/reference/operator-alpha.svg12.rgb24.xfail.png create mode 100644 test/reference/operator-clear.argb32.ref.png create mode 100644 test/reference/operator-clear.base.argb32.ref.png create mode 100644 test/reference/operator-clear.base.rgb24.ref.png create mode 100644 test/reference/operator-clear.mask.rgb24.ref.png create mode 100644 test/reference/operator-clear.ps2.argb32.ref.png create mode 100644 test/reference/operator-clear.ps3.argb32.ref.png create mode 100644 test/reference/operator-clear.quartz.argb32.ref.png create mode 100644 test/reference/operator-clear.quartz.rgb24.ref.png create mode 100644 test/reference/operator-clear.rgb24.ref.png create mode 100644 test/reference/operator-clear.svg12.argb32.xfail.png create mode 100644 test/reference/operator-clear.svg12.rgb24.xfail.png create mode 100644 test/reference/operator-clear.traps.argb32.ref.png create mode 100644 test/reference/operator-clear.traps.rgb24.ref.png create mode 100644 test/reference/operator-source.argb32.ref.png create mode 100644 test/reference/operator-source.base.argb32.ref.png create mode 100644 test/reference/operator-source.base.rgb24.ref.png create mode 100644 test/reference/operator-source.image16.ref.png create mode 100644 test/reference/operator-source.mask.argb32.ref.png create mode 100644 test/reference/operator-source.mask.rgb24.ref.png create mode 100644 test/reference/operator-source.rgb24.ref.png create mode 100644 test/reference/operator-source.traps.argb32.ref.png create mode 100644 test/reference/operator-source.traps.rgb24.ref.png create mode 100644 test/reference/operator-source.xlib-fallback.ref.png create mode 100644 test/reference/operator.argb32.ref.png create mode 100644 test/reference/operator.base.argb32.ref.png create mode 100644 test/reference/operator.base.rgb24.ref.png create mode 100644 test/reference/operator.rgb24.ref.png create mode 100644 test/reference/operator.svg12.argb32.xfail.png create mode 100644 test/reference/operator.svg12.rgb24.xfail.png create mode 100644 test/reference/outline-tolerance.ref.png create mode 100644 test/reference/over-above-source.argb32.ref.png create mode 100644 test/reference/over-above-source.base.argb32.ref.png create mode 100644 test/reference/over-above-source.base.rgb24.ref.png create mode 100644 test/reference/over-above-source.ps2.argb32.ref.png create mode 100644 test/reference/over-above-source.ps3.argb32.ref.png create mode 100644 test/reference/over-above-source.quartz.argb32.ref.png create mode 100644 test/reference/over-above-source.quartz.rgb24.ref.png create mode 100644 test/reference/over-above-source.rgb24.ref.png create mode 100644 test/reference/over-above-source.svg12.rgb24.xfail.png create mode 100644 test/reference/over-above-source.traps.argb32.ref.png create mode 100644 test/reference/over-above-source.traps.rgb24.ref.png create mode 100644 test/reference/over-around-source.argb32.ref.png create mode 100644 test/reference/over-around-source.base.argb32.ref.png create mode 100644 test/reference/over-around-source.base.rgb24.ref.png create mode 100644 test/reference/over-around-source.image16.ref.png create mode 100644 test/reference/over-around-source.pdf.argb32.ref.png create mode 100644 test/reference/over-around-source.ps2.argb32.ref.png create mode 100644 test/reference/over-around-source.ps2.rgb24.ref.png create mode 100644 test/reference/over-around-source.ps3.argb32.ref.png create mode 100644 test/reference/over-around-source.ps3.rgb24.ref.png create mode 100644 test/reference/over-around-source.quartz.argb32.ref.png create mode 100644 test/reference/over-around-source.rgb24.ref.png create mode 100644 test/reference/over-around-source.svg12.argb32.xfail.png create mode 100644 test/reference/over-around-source.svg12.rgb24.xfail.png create mode 100644 test/reference/over-around-source.traps.argb32.ref.png create mode 100644 test/reference/over-around-source.traps.rgb24.ref.png create mode 100644 test/reference/over-below-source.argb32.ref.png create mode 100644 test/reference/over-below-source.base.argb32.ref.png create mode 100644 test/reference/over-below-source.base.rgb24.ref.png create mode 100644 test/reference/over-below-source.pdf.argb32.ref.png create mode 100644 test/reference/over-below-source.ps2.argb32.ref.png create mode 100644 test/reference/over-below-source.ps2.rgb24.ref.png create mode 100644 test/reference/over-below-source.ps3.argb32.ref.png create mode 100644 test/reference/over-below-source.ps3.rgb24.ref.png create mode 100644 test/reference/over-below-source.rgb24.ref.png create mode 100644 test/reference/over-below-source.svg12.argb32.xfail.png create mode 100644 test/reference/over-below-source.svg12.rgb24.xfail.png create mode 100644 test/reference/over-below-source.traps.argb32.ref.png create mode 100644 test/reference/over-below-source.traps.rgb24.ref.png create mode 100644 test/reference/over-between-source.argb32.ref.png create mode 100644 test/reference/over-between-source.base.argb32.ref.png create mode 100644 test/reference/over-between-source.base.rgb24.ref.png create mode 100644 test/reference/over-between-source.ps2.argb32.ref.png create mode 100644 test/reference/over-between-source.ps3.argb32.ref.png create mode 100644 test/reference/over-between-source.quartz.argb32.ref.png create mode 100644 test/reference/over-between-source.rgb24.ref.png create mode 100644 test/reference/over-between-source.svg12.argb32.xfail.png create mode 100644 test/reference/over-between-source.svg12.rgb24.xfail.png create mode 100644 test/reference/over-between-source.traps.argb32.ref.png create mode 100644 test/reference/over-between-source.traps.rgb24.ref.png create mode 100644 test/reference/overlapping-boxes.base.argb32.ref.png create mode 100644 test/reference/overlapping-boxes.base.rgb24.ref.png create mode 100644 test/reference/overlapping-boxes.ref.png create mode 100644 test/reference/overlapping-boxes.traps.argb32.ref.png create mode 100644 test/reference/overlapping-boxes.traps.rgb24.ref.png create mode 100644 test/reference/overlapping-dash-caps.base.argb32.ref.png create mode 100644 test/reference/overlapping-dash-caps.base.rgb24.ref.png create mode 100644 test/reference/overlapping-dash-caps.mask.argb32.ref.png create mode 100644 test/reference/overlapping-dash-caps.mask.rgb24.ref.png create mode 100644 test/reference/overlapping-dash-caps.ref.png create mode 100644 test/reference/overlapping-dash-caps.traps.argb32.ref.png create mode 100644 test/reference/overlapping-dash-caps.traps.rgb24.ref.png create mode 100644 test/reference/overlapping-glyphs.base.argb32.ref.png create mode 100644 test/reference/overlapping-glyphs.base.rgb24.ref.png create mode 100644 test/reference/overlapping-glyphs.pdf.argb32.xfail.png create mode 100644 test/reference/overlapping-glyphs.pdf.rgb24.xfail.png create mode 100644 test/reference/overlapping-glyphs.quartz.argb32.ref.png create mode 100644 test/reference/overlapping-glyphs.quartz.rgb24.ref.png create mode 100644 test/reference/overlapping-glyphs.ref.png create mode 100644 test/reference/overlapping-glyphs.svg.argb32.ref.png create mode 100644 test/reference/overlapping-glyphs.svg.rgb24.ref.png create mode 100644 test/reference/overlapping-glyphs.traps.argb32.ref.png create mode 100644 test/reference/overlapping-glyphs.traps.rgb24.ref.png create mode 100644 test/reference/paint-clip-fill-aa.base.argb32.ref.png create mode 100644 test/reference/paint-clip-fill-aa.base.rgb24.ref.png create mode 100644 test/reference/paint-clip-fill-aa.ref.png create mode 100644 test/reference/paint-clip-fill-mono.base.argb32.ref.png create mode 100644 test/reference/paint-clip-fill-mono.base.rgb24.ref.png create mode 100644 test/reference/paint-clip-fill-mono.ref.png create mode 100644 test/reference/paint-repeat.base.argb32.ref.png create mode 100644 test/reference/paint-repeat.base.rgb24.ref.png create mode 100644 test/reference/paint-repeat.ref.png create mode 100644 test/reference/paint-source-alpha.base.argb32.ref.png create mode 100644 test/reference/paint-source-alpha.base.rgb24.ref.png create mode 100644 test/reference/paint-source-alpha.image16.ref.png create mode 100644 test/reference/paint-source-alpha.ref.png create mode 100644 test/reference/paint-source-alpha.svg.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.base.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.base.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.mask.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.mask.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.traps.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-clip-mask.traps.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-clip.base.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-clip.base.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-clip.mask.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-clip.mask.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-clip.ref.png create mode 100644 test/reference/paint-with-alpha-clip.traps.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-clip.traps.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-group-clip.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.base.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.base.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.mask.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.mask.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.traps.argb32.ref.png create mode 100644 test/reference/paint-with-alpha-solid-clip.traps.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha.base.argb32.ref.png create mode 100644 test/reference/paint-with-alpha.base.rgb24.ref.png create mode 100644 test/reference/paint-with-alpha.image16.ref.png create mode 100644 test/reference/paint-with-alpha.ref.png create mode 100644 test/reference/paint-with-alpha.svg.ref.png create mode 100644 test/reference/paint.base.argb32.ref.png create mode 100644 test/reference/paint.base.rgb24.ref.png create mode 100644 test/reference/paint.ref.png create mode 100644 test/reference/partial-clip-text-bottom.base.argb32.ref.png create mode 100644 test/reference/partial-clip-text-bottom.base.rgb24.ref.png create mode 100644 test/reference/partial-clip-text-bottom.ref.png create mode 100644 test/reference/partial-clip-text-left.base.argb32.ref.png create mode 100644 test/reference/partial-clip-text-left.base.rgb24.ref.png create mode 100644 test/reference/partial-clip-text-left.ref.png create mode 100644 test/reference/partial-clip-text-right.base.argb32.ref.png create mode 100644 test/reference/partial-clip-text-right.base.rgb24.ref.png create mode 100644 test/reference/partial-clip-text-right.ref.png create mode 100644 test/reference/partial-clip-text-right.traps.ref.png create mode 100644 test/reference/partial-clip-text-top.base.argb32.ref.png create mode 100644 test/reference/partial-clip-text-top.base.rgb24.ref.png create mode 100644 test/reference/partial-clip-text-top.ps.ref.png create mode 100644 test/reference/partial-clip-text-top.quartz.ref.png create mode 100644 test/reference/partial-clip-text-top.ref.png create mode 100644 test/reference/partial-clip-text-top.svg.ref.png create mode 100644 test/reference/partial-clip-text-top.traps.ref.png create mode 100644 test/reference/partial-coverage-half-reference.base.argb32.ref.png create mode 100644 test/reference/partial-coverage-half-reference.base.rgb24.ref.png create mode 100644 test/reference/partial-coverage-half-reference.ref.png create mode 100644 test/reference/partial-coverage-half-triangles.ref.png create mode 100644 test/reference/partial-coverage-intersecting-quads.ref.png create mode 100644 test/reference/partial-coverage-intersecting-quads.xfail.png create mode 100644 test/reference/partial-coverage-intersecting-triangles.ref.png create mode 100644 test/reference/partial-coverage-overlap-half-triangles-eo.ref.png create mode 100644 test/reference/partial-coverage-overlap-half-triangles.ref.png create mode 100644 test/reference/partial-coverage-overlap-three-quarter-triangles.ref.png create mode 100644 test/reference/partial-coverage-rectangles.ref.png create mode 100644 test/reference/partial-coverage-reference.base.argb32.ref.png create mode 100644 test/reference/partial-coverage-reference.base.rgb24.ref.png create mode 100644 test/reference/partial-coverage-reference.ref.png create mode 100644 test/reference/partial-coverage-three-quarter-reference.base.argb32.ref.png create mode 100644 test/reference/partial-coverage-three-quarter-reference.base.rgb24.ref.png create mode 100644 test/reference/partial-coverage-three-quarter-reference.ref.png create mode 100644 test/reference/partial-coverage-triangles.ref.png create mode 100644 test/reference/pass-through.base.argb32.ref.png create mode 100644 test/reference/pass-through.base.rgb24.ref.png create mode 100644 test/reference/pass-through.ref.png create mode 100644 test/reference/path-append.base.argb32.ref.png create mode 100644 test/reference/path-append.base.rgb24.ref.png create mode 100644 test/reference/path-append.image16.ref.png create mode 100644 test/reference/path-append.ps.ref.png create mode 100644 test/reference/path-append.quartz.ref.png create mode 100644 test/reference/path-append.ref.png create mode 100644 test/reference/path-append.test-fallback.ref.png create mode 100644 test/reference/path-append.traps.argb32.ref.png create mode 100644 test/reference/path-append.traps.rgb24.ref.png create mode 100644 test/reference/path-append.xlib-fallback.ref.png create mode 100644 test/reference/path-stroke-twice.base.argb32.ref.png create mode 100644 test/reference/path-stroke-twice.base.rgb24.ref.png create mode 100644 test/reference/path-stroke-twice.image16.ref.png create mode 100644 test/reference/path-stroke-twice.ps.ref.png create mode 100644 test/reference/path-stroke-twice.ref.png create mode 100644 test/reference/path-stroke-twice.traps.argb32.ref.png create mode 100644 test/reference/path-stroke-twice.traps.rgb24.ref.png create mode 100644 test/reference/pattern-getters.base.argb32.ref.png create mode 100644 test/reference/pattern-getters.base.rgb24.ref.png create mode 100644 test/reference/pattern-getters.ref.png create mode 100644 test/reference/pdf-isolated-group.base.argb32.ref.png create mode 100644 test/reference/pdf-isolated-group.base.rgb24.ref.png create mode 100644 test/reference/pdf-isolated-group.ref.png create mode 100644 test/reference/pdf-surface-source.base.argb32.ref.png create mode 100644 test/reference/pdf-surface-source.base.rgb24.ref.png create mode 100644 test/reference/pdf-surface-source.image16.ref.png create mode 100644 test/reference/pdf-surface-source.ref.png create mode 100644 test/reference/pdf-surface-source.svg12.argb32.xfail.png create mode 100644 test/reference/pdf-surface-source.svg12.rgb24.xfail.png create mode 100644 test/reference/pixman-downscale-best-24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.image.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.image16.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.pdf.ref.png create mode 100644 test/reference/pixman-downscale-best-95.ps2.ref.png create mode 100644 test/reference/pixman-downscale-best-95.ps3.ref.png create mode 100644 test/reference/pixman-downscale-best-95.recording.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.ref.png create mode 100644 test/reference/pixman-downscale-best-95.script.ref.png create mode 100644 test/reference/pixman-downscale-best-95.svg11.ref.png create mode 100644 test/reference/pixman-downscale-best-95.svg12.ref.png create mode 100644 test/reference/pixman-downscale-best-95.test-base.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.test-fallback.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.test-mask.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.test-paginated.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.test-spans.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.test-traps.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xcb-fallback.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xcb-render-0_0.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xcb-window&.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xcb-window.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xcb.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xlib-fallback.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xlib-render-0_0.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xlib-window.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-best-95.xlib.ref.png create mode 100644 test/reference/pixman-downscale-best-96.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-24.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-95.image16.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-95.pdf.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-95.ps2.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-95.ps3.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-95.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-95.script.ref.png create mode 100644 test/reference/pixman-downscale-bilinear-96.ref.png create mode 100644 test/reference/pixman-downscale-fast-24.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.image16.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.pdf.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.ps2.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.ps3.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.svg11.ref.png create mode 100644 test/reference/pixman-downscale-fast-95.svg12.ref.png create mode 100644 test/reference/pixman-downscale-fast-96.ref.png create mode 100644 test/reference/pixman-downscale-good-24.ref.png create mode 100644 test/reference/pixman-downscale-good-95.image16.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-good-95.pdf.ref.png create mode 100644 test/reference/pixman-downscale-good-95.ps2.ref.png create mode 100644 test/reference/pixman-downscale-good-95.ps3.ref.png create mode 100644 test/reference/pixman-downscale-good-95.ref.png create mode 100644 test/reference/pixman-downscale-good-95.script.ref.png create mode 100644 test/reference/pixman-downscale-good-96.ref.png create mode 100644 test/reference/pixman-downscale-nearest-24.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.image16.rgb24.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.pdf.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.ps2.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.ps3.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.svg11.ref.png create mode 100644 test/reference/pixman-downscale-nearest-95.svg12.ref.png create mode 100644 test/reference/pixman-downscale-nearest-96.ref.png create mode 100644 test/reference/pixman-rotate.base.argb32.ref.png create mode 100644 test/reference/pixman-rotate.base.rgb24.ref.png create mode 100644 test/reference/pixman-rotate.ps.argb32.ref.png create mode 100644 test/reference/pixman-rotate.ref.png create mode 100644 test/reference/ps-eps.ref.png create mode 100644 test/reference/ps-surface-source.base.argb32.ref.png create mode 100644 test/reference/ps-surface-source.base.rgb24.ref.png create mode 100644 test/reference/ps-surface-source.image16.ref.png create mode 100644 test/reference/ps-surface-source.ref.png create mode 100644 test/reference/ps-surface-source.svg12.argb32.xfail.png create mode 100644 test/reference/ps-surface-source.svg12.rgb24.xfail.png create mode 100644 test/reference/pthread-same-source.image16.ref.png create mode 100644 test/reference/pthread-same-source.quartz.xfail.png create mode 100644 test/reference/pthread-same-source.ref.png create mode 100644 test/reference/pthread-show-text.base.argb32.ref.png create mode 100644 test/reference/pthread-show-text.base.rgb24.ref.png create mode 100644 test/reference/pthread-show-text.image16.ref.png create mode 100644 test/reference/pthread-show-text.pdf.ref.png create mode 100644 test/reference/pthread-show-text.ps.ref.png create mode 100644 test/reference/pthread-show-text.quartz.ref.png create mode 100644 test/reference/pthread-show-text.ref.png create mode 100644 test/reference/pthread-show-text.traps.ref.png create mode 100644 test/reference/pthread-show-text.xlib-fallback.ref.png create mode 100644 test/reference/pthread-similar.base.argb32.ref.png create mode 100644 test/reference/pthread-similar.base.rgb24.ref.png create mode 100644 test/reference/pthread-similar.ref.png create mode 100644 test/reference/push-group-color.base.argb32.ref.png create mode 100644 test/reference/push-group-color.base.rgb24.ref.png create mode 100644 test/reference/push-group-color.image16.ref.png create mode 100644 test/reference/push-group-color.ps2.ref.png create mode 100644 test/reference/push-group-color.ps3.ref.png create mode 100644 test/reference/push-group-color.quartz.ref.png create mode 100644 test/reference/push-group-color.ref.png create mode 100644 test/reference/push-group-color.traps.argb32.ref.png create mode 100644 test/reference/push-group-color.traps.rgb24.ref.png create mode 100644 test/reference/push-group-path-offset.base.argb32.ref.png create mode 100644 test/reference/push-group-path-offset.base.rgb24.ref.png create mode 100644 test/reference/push-group-path-offset.ref.png create mode 100644 test/reference/push-group.argb32.ref.png create mode 100644 test/reference/push-group.base.argb32.ref.png create mode 100644 test/reference/push-group.base.rgb24.ref.png create mode 100644 test/reference/push-group.image16.ref.png create mode 100644 test/reference/push-group.quartz.argb32.ref.png create mode 100644 test/reference/push-group.quartz.rgb24.ref.png create mode 100644 test/reference/push-group.rgb24.ref.png create mode 100644 test/reference/push-group.traps.argb32.ref.png create mode 100644 test/reference/push-group.traps.rgb24.ref.png create mode 100644 test/reference/quartz-surface-source.ps2.ref.png create mode 100644 test/reference/quartz-surface-source.ps3.ref.png create mode 100644 test/reference/quartz-surface-source.ref.png create mode 100644 test/reference/radial-gradient-extend.base.argb32.ref.png create mode 100644 test/reference/radial-gradient-extend.base.rgb24.ref.png create mode 100644 test/reference/radial-gradient-extend.mask.argb32.ref.png create mode 100644 test/reference/radial-gradient-extend.mask.rgb24.ref.png create mode 100644 test/reference/radial-gradient-extend.ps3.ref.png create mode 100644 test/reference/radial-gradient-extend.ref.png create mode 100644 test/reference/radial-gradient-extend.traps.argb32.ref.png create mode 100644 test/reference/radial-gradient-extend.traps.rgb24.ref.png create mode 100644 test/reference/radial-gradient-mask-source.argb32.ref.png create mode 100644 test/reference/radial-gradient-mask-source.base.argb32.ref.png create mode 100644 test/reference/radial-gradient-mask-source.base.rgb24.ref.png create mode 100644 test/reference/radial-gradient-mask-source.image16.ref.png create mode 100644 test/reference/radial-gradient-mask-source.mask.rgb24.ref.png create mode 100644 test/reference/radial-gradient-mask-source.quartz.argb32.ref.png create mode 100644 test/reference/radial-gradient-mask-source.quartz.rgb24.ref.png create mode 100644 test/reference/radial-gradient-mask-source.traps.rgb24.ref.png create mode 100644 test/reference/radial-gradient-mask.base.argb32.ref.png create mode 100644 test/reference/radial-gradient-mask.base.rgb24.ref.png create mode 100644 test/reference/radial-gradient-mask.image16.ref.png create mode 100644 test/reference/radial-gradient-mask.quartz.ref.png create mode 100644 test/reference/radial-gradient-mask.ref.png create mode 100644 test/reference/radial-gradient-one-stop.base.argb32.ref.png create mode 100644 test/reference/radial-gradient-one-stop.base.rgb24.ref.png create mode 100644 test/reference/radial-gradient-one-stop.quartz.ref.png create mode 100644 test/reference/radial-gradient-one-stop.ref.png create mode 100644 test/reference/radial-gradient-source.base.argb32.ref.png create mode 100644 test/reference/radial-gradient-source.base.rgb24.ref.png create mode 100644 test/reference/radial-gradient-source.image16.ref.png create mode 100644 test/reference/radial-gradient-source.quartz.argb32.ref.png create mode 100644 test/reference/radial-gradient-source.quartz.rgb24.ref.png create mode 100644 test/reference/radial-gradient-source.ref.png create mode 100644 test/reference/radial-gradient.base.argb32.ref.png create mode 100644 test/reference/radial-gradient.base.rgb24.ref.png create mode 100644 test/reference/radial-gradient.image16.ref.png create mode 100644 test/reference/radial-gradient.quartz.ref.png create mode 100644 test/reference/radial-gradient.ref.png create mode 100644 test/reference/radial-outer-focus.base.argb32.ref.png create mode 100644 test/reference/radial-outer-focus.base.rgb24.ref.png create mode 100644 test/reference/radial-outer-focus.mask.argb32.ref.png create mode 100644 test/reference/radial-outer-focus.mask.rgb24.ref.png create mode 100644 test/reference/radial-outer-focus.traps.argb32.ref.png create mode 100644 test/reference/radial-outer-focus.traps.rgb24.ref.png create mode 100644 test/reference/radial-outer-focus.xfail.png create mode 100644 test/reference/random-clip.base.argb32.ref.png create mode 100644 test/reference/random-clip.base.argb32.xfail.png create mode 100644 test/reference/random-clip.base.rgb24.ref.png create mode 100644 test/reference/random-clip.base.rgb24.xfail.png create mode 100644 test/reference/random-clip.mask.argb32.ref.png create mode 100644 test/reference/random-clip.mask.rgb24.ref.png create mode 100644 test/reference/random-clip.ref.png create mode 100644 test/reference/random-clip.traps.argb32.ref.png create mode 100644 test/reference/random-clip.traps.rgb24.ref.png create mode 100644 test/reference/random-intersections-curves-eo.base.argb32.ref.png create mode 100644 test/reference/random-intersections-curves-eo.base.rgb24.ref.png create mode 100644 test/reference/random-intersections-curves-eo.image16.ref.png create mode 100644 test/reference/random-intersections-curves-eo.pdf.ref.png create mode 100644 test/reference/random-intersections-curves-eo.ps.ref.png create mode 100644 test/reference/random-intersections-curves-eo.quartz.ref.png create mode 100644 test/reference/random-intersections-curves-eo.ref.png create mode 100644 test/reference/random-intersections-curves-eo.traps.argb32.ref.png create mode 100644 test/reference/random-intersections-curves-eo.traps.rgb24.ref.png create mode 100644 test/reference/random-intersections-curves-eo.xlib-fallback.ref.png create mode 100644 test/reference/random-intersections-curves-nz.base.argb32.ref.png create mode 100644 test/reference/random-intersections-curves-nz.base.rgb24.ref.png create mode 100644 test/reference/random-intersections-curves-nz.image16.ref.png create mode 100644 test/reference/random-intersections-curves-nz.pdf.ref.png create mode 100644 test/reference/random-intersections-curves-nz.ps.ref.png create mode 100644 test/reference/random-intersections-curves-nz.quartz.ref.png create mode 100644 test/reference/random-intersections-curves-nz.ref.png create mode 100644 test/reference/random-intersections-curves-nz.traps.argb32.ref.png create mode 100644 test/reference/random-intersections-curves-nz.traps.rgb24.ref.png create mode 100644 test/reference/random-intersections-curves-nz.xlib-fallback.ref.png create mode 100644 test/reference/random-intersections-eo.base.argb32.ref.png create mode 100644 test/reference/random-intersections-eo.base.rgb24.ref.png create mode 100644 test/reference/random-intersections-eo.image16.ref.png create mode 100644 test/reference/random-intersections-eo.ps.ref.png create mode 100644 test/reference/random-intersections-eo.quartz.ref.png create mode 100644 test/reference/random-intersections-eo.ref.png create mode 100644 test/reference/random-intersections-eo.traps.argb32.ref.png create mode 100644 test/reference/random-intersections-eo.traps.rgb24.ref.png create mode 100644 test/reference/random-intersections-nonzero.base.argb32.ref.png create mode 100644 test/reference/random-intersections-nonzero.base.rgb24.ref.png create mode 100644 test/reference/random-intersections-nonzero.image16.ref.png create mode 100644 test/reference/random-intersections-nonzero.ps.ref.png create mode 100644 test/reference/random-intersections-nonzero.quartz.ref.png create mode 100644 test/reference/random-intersections-nonzero.ref.png create mode 100644 test/reference/random-intersections-nonzero.traps.argb32.ref.png create mode 100644 test/reference/random-intersections-nonzero.traps.rgb24.ref.png create mode 100644 test/reference/raster-source.base.argb32.ref.png create mode 100644 test/reference/raster-source.base.rgb24.ref.png create mode 100644 test/reference/raster-source.ps.ref.png create mode 100644 test/reference/raster-source.ref.png create mode 100644 test/reference/record-extend-none-similar.base.argb32.ref.png create mode 100644 test/reference/record-extend-none-similar.base.rgb24.ref.png create mode 100644 test/reference/record-extend-none-similar.ref.png create mode 100644 test/reference/record-extend-none-similar.traps.argb32.ref.png create mode 100644 test/reference/record-extend-none-similar.traps.rgb24.ref.png create mode 100644 test/reference/record-extend-none.base.argb32.ref.png create mode 100644 test/reference/record-extend-none.base.rgb24.ref.png create mode 100644 test/reference/record-extend-none.ref.png create mode 100644 test/reference/record-extend-pad-similar.base.argb32.ref.png create mode 100644 test/reference/record-extend-pad-similar.base.rgb24.ref.png create mode 100644 test/reference/record-extend-pad-similar.ref.png create mode 100644 test/reference/record-extend-pad-similar.traps.argb32.ref.png create mode 100644 test/reference/record-extend-pad-similar.traps.rgb24.ref.png create mode 100644 test/reference/record-extend-pad.base.argb32.ref.png create mode 100644 test/reference/record-extend-pad.base.rgb24.ref.png create mode 100644 test/reference/record-extend-pad.ref.png create mode 100644 test/reference/record-extend-reflect-similar.base.argb32.ref.png create mode 100644 test/reference/record-extend-reflect-similar.base.rgb24.ref.png create mode 100644 test/reference/record-extend-reflect-similar.ref.png create mode 100644 test/reference/record-extend-reflect-similar.traps.argb32.ref.png create mode 100644 test/reference/record-extend-reflect-similar.traps.rgb24.ref.png create mode 100644 test/reference/record-extend-reflect.base.argb32.ref.png create mode 100644 test/reference/record-extend-reflect.base.rgb24.ref.png create mode 100644 test/reference/record-extend-reflect.ref.png create mode 100644 test/reference/record-extend-repeat-similar.base.argb32.ref.png create mode 100644 test/reference/record-extend-repeat-similar.base.rgb24.ref.png create mode 100644 test/reference/record-extend-repeat-similar.ref.png create mode 100644 test/reference/record-extend-repeat-similar.traps.argb32.ref.png create mode 100644 test/reference/record-extend-repeat-similar.traps.rgb24.ref.png create mode 100644 test/reference/record-extend-repeat.base.argb32.ref.png create mode 100644 test/reference/record-extend-repeat.base.rgb24.ref.png create mode 100644 test/reference/record-extend-repeat.ref.png create mode 100644 test/reference/record-fill-alpha.base.argb32.ref.png create mode 100644 test/reference/record-fill-alpha.base.rgb24.ref.png create mode 100644 test/reference/record-fill-alpha.base.xfail.png create mode 100644 test/reference/record-fill-alpha.image16.rgb24.ref.png create mode 100644 test/reference/record-fill-alpha.ref.png create mode 100644 test/reference/record-fill-alpha.traps.argb32.ref.png create mode 100644 test/reference/record-fill-alpha.traps.rgb24.ref.png create mode 100644 test/reference/record-fill-alpha.xfail.png create mode 100644 test/reference/record-mesh.base.argb32.ref.png create mode 100644 test/reference/record-mesh.base.rgb24.ref.png create mode 100644 test/reference/record-mesh.image16.rgb24.ref.png create mode 100644 test/reference/record-mesh.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.base.argb32.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.base.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.base.xfail.png create mode 100644 test/reference/record-paint-alpha-clip-mask.image16.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.traps.argb32.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.traps.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-clip-mask.xfail.png create mode 100644 test/reference/record-paint-alpha-clip.base.argb32.ref.png create mode 100644 test/reference/record-paint-alpha-clip.base.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-clip.image16.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-clip.ref.png create mode 100644 test/reference/record-paint-alpha-clip.traps.argb32.ref.png create mode 100644 test/reference/record-paint-alpha-clip.traps.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-solid-clip.base.argb32.ref.png create mode 100644 test/reference/record-paint-alpha-solid-clip.base.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-solid-clip.image16.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha-solid-clip.ref.png create mode 100644 test/reference/record-paint-alpha-solid-clip.traps.argb32.ref.png create mode 100644 test/reference/record-paint-alpha-solid-clip.traps.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha.base.argb32.ref.png create mode 100644 test/reference/record-paint-alpha.base.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha.image16.rgb24.ref.png create mode 100644 test/reference/record-paint-alpha.ref.png create mode 100644 test/reference/record-paint.base.argb32.ref.png create mode 100644 test/reference/record-paint.base.rgb24.ref.png create mode 100644 test/reference/record-paint.ref.png create mode 100644 test/reference/record-select-font-face.base.argb32.ref.png create mode 100644 test/reference/record-select-font-face.base.rgb24.ref.png create mode 100644 test/reference/record-select-font-face.image16.rgb24.ref.png create mode 100644 test/reference/record-select-font-face.ref.png create mode 100644 test/reference/record-select-font-face.xfail.png create mode 100644 test/reference/record-self-intersecting.base.argb32.ref.png create mode 100644 test/reference/record-self-intersecting.base.rgb24.ref.png create mode 100644 test/reference/record-self-intersecting.image16.rgb24.ref.png create mode 100644 test/reference/record-self-intersecting.ref.png create mode 100644 test/reference/record-text-transform.base.argb32.ref.png create mode 100644 test/reference/record-text-transform.base.rgb24.ref.png create mode 100644 test/reference/record-text-transform.image16.rgb24.ref.png create mode 100644 test/reference/record-text-transform.ref.png create mode 100644 test/reference/record1414x-fill-alpha.base.argb32.ref.png create mode 100644 test/reference/record1414x-fill-alpha.base.rgb24.ref.png create mode 100644 test/reference/record1414x-fill-alpha.base.xfail.png create mode 100644 test/reference/record1414x-fill-alpha.ref.png create mode 100644 test/reference/record1414x-fill-alpha.xfail.png create mode 100644 test/reference/record1414x-paint-alpha-clip-mask.base.argb32.ref.png create mode 100644 test/reference/record1414x-paint-alpha-clip-mask.base.rgb24.ref.png create mode 100644 test/reference/record1414x-paint-alpha-clip-mask.ref.png create mode 100644 test/reference/record1414x-paint-alpha-clip.base.argb32.ref.png create mode 100644 test/reference/record1414x-paint-alpha-clip.base.rgb24.ref.png create mode 100644 test/reference/record1414x-paint-alpha-clip.ref.png create mode 100644 test/reference/record1414x-paint-alpha-solid-clip.base.argb32.ref.png create mode 100644 test/reference/record1414x-paint-alpha-solid-clip.base.rgb24.ref.png create mode 100644 test/reference/record1414x-paint-alpha-solid-clip.ref.png create mode 100644 test/reference/record1414x-paint-alpha.base.argb32.ref.png create mode 100644 test/reference/record1414x-paint-alpha.base.rgb24.ref.png create mode 100644 test/reference/record1414x-paint-alpha.ref.png create mode 100644 test/reference/record1414x-paint.base.argb32.ref.png create mode 100644 test/reference/record1414x-paint.base.rgb24.ref.png create mode 100644 test/reference/record1414x-paint.ref.png create mode 100644 test/reference/record1414x-select-font-face.base.argb32.ref.png create mode 100644 test/reference/record1414x-select-font-face.base.rgb24.ref.png create mode 100644 test/reference/record1414x-select-font-face.ref.png create mode 100644 test/reference/record1414x-self-intersecting.base.argb32.ref.png create mode 100644 test/reference/record1414x-self-intersecting.base.rgb24.ref.png create mode 100644 test/reference/record1414x-self-intersecting.ref.png create mode 100644 test/reference/record1414x-text-transform.base.argb32.ref.png create mode 100644 test/reference/record1414x-text-transform.base.rgb24.ref.png create mode 100644 test/reference/record1414x-text-transform.ref.png create mode 100644 test/reference/record2x-fill-alpha.base.argb32.ref.png create mode 100644 test/reference/record2x-fill-alpha.base.rgb24.ref.png create mode 100644 test/reference/record2x-fill-alpha.base.xfail.png create mode 100644 test/reference/record2x-fill-alpha.ref.png create mode 100644 test/reference/record2x-fill-alpha.xfail.png create mode 100644 test/reference/record2x-paint-alpha-clip-mask.base.argb32.ref.png create mode 100644 test/reference/record2x-paint-alpha-clip-mask.base.rgb24.ref.png create mode 100644 test/reference/record2x-paint-alpha-clip-mask.ref.png create mode 100644 test/reference/record2x-paint-alpha-clip.base.argb32.ref.png create mode 100644 test/reference/record2x-paint-alpha-clip.base.rgb24.ref.png create mode 100644 test/reference/record2x-paint-alpha-clip.ref.png create mode 100644 test/reference/record2x-paint-alpha-solid-clip.base.argb32.ref.png create mode 100644 test/reference/record2x-paint-alpha-solid-clip.base.rgb24.ref.png create mode 100644 test/reference/record2x-paint-alpha-solid-clip.ref.png create mode 100644 test/reference/record2x-paint-alpha.base.argb32.ref.png create mode 100644 test/reference/record2x-paint-alpha.base.rgb24.ref.png create mode 100644 test/reference/record2x-paint-alpha.ref.png create mode 100644 test/reference/record2x-paint.base.argb32.ref.png create mode 100644 test/reference/record2x-paint.base.rgb24.ref.png create mode 100644 test/reference/record2x-paint.ref.png create mode 100644 test/reference/record2x-select-font-face.base.argb32.ref.png create mode 100644 test/reference/record2x-select-font-face.base.rgb24.ref.png create mode 100644 test/reference/record2x-select-font-face.ref.png create mode 100644 test/reference/record2x-self-intersecting.base.argb32.ref.png create mode 100644 test/reference/record2x-self-intersecting.base.rgb24.ref.png create mode 100644 test/reference/record2x-self-intersecting.ref.png create mode 100644 test/reference/record2x-text-transform.base.argb32.ref.png create mode 100644 test/reference/record2x-text-transform.base.rgb24.ref.png create mode 100644 test/reference/record2x-text-transform.ref.png create mode 100644 test/reference/record90-fill-alpha.base.argb32.ref.png create mode 100644 test/reference/record90-fill-alpha.base.rgb24.ref.png create mode 100644 test/reference/record90-fill-alpha.ref.png create mode 100644 test/reference/record90-fill-alpha.xfail.png create mode 100644 test/reference/record90-paint-alpha-clip-mask.base.argb32.ref.png create mode 100644 test/reference/record90-paint-alpha-clip-mask.base.rgb24.ref.png create mode 100644 test/reference/record90-paint-alpha-clip-mask.ref.png create mode 100644 test/reference/record90-paint-alpha-clip-mask.xfail.png create mode 100644 test/reference/record90-paint-alpha-clip.base.argb32.ref.png create mode 100644 test/reference/record90-paint-alpha-clip.base.rgb24.ref.png create mode 100644 test/reference/record90-paint-alpha-clip.ref.png create mode 100644 test/reference/record90-paint-alpha-clip.xfail.png create mode 100644 test/reference/record90-paint-alpha-solid-clip.base.argb32.ref.png create mode 100644 test/reference/record90-paint-alpha-solid-clip.base.rgb24.ref.png create mode 100644 test/reference/record90-paint-alpha-solid-clip.ref.png create mode 100644 test/reference/record90-paint-alpha.base.argb32.ref.png create mode 100644 test/reference/record90-paint-alpha.base.rgb24.ref.png create mode 100644 test/reference/record90-paint-alpha.ref.png create mode 100644 test/reference/record90-paint.base.argb32.ref.png create mode 100644 test/reference/record90-paint.base.rgb24.ref.png create mode 100644 test/reference/record90-paint.ref.png create mode 100644 test/reference/record90-select-font-face.base.argb32.ref.png create mode 100644 test/reference/record90-select-font-face.base.rgb24.ref.png create mode 100644 test/reference/record90-select-font-face.ref.png create mode 100644 test/reference/record90-self-intersecting.base.argb32.ref.png create mode 100644 test/reference/record90-self-intersecting.base.rgb24.ref.png create mode 100644 test/reference/record90-self-intersecting.ref.png create mode 100644 test/reference/record90-text-transform.base.argb32.ref.png create mode 100644 test/reference/record90-text-transform.base.rgb24.ref.png create mode 100644 test/reference/record90-text-transform.ref.png create mode 100644 test/reference/recordflip-fill-alpha.ref.png create mode 100644 test/reference/recordflip-paint-alpha-clip-mask.ref.png create mode 100644 test/reference/recordflip-paint-alpha-clip.ref.png create mode 100644 test/reference/recordflip-paint-alpha-solid-clip.ref.png create mode 100644 test/reference/recordflip-paint-alpha.ref.png create mode 100644 test/reference/recordflip-paint.ref.png create mode 100644 test/reference/recordflip-select-font-face.ref.png create mode 100644 test/reference/recordflip-self-intersecting.ref.png create mode 100644 test/reference/recordflip-text-transform.ref.png create mode 100644 test/reference/recordflip-whole-fill-alpha.ref.png create mode 100644 test/reference/recordflip-whole-paint-alpha-clip-mask.ref.png create mode 100644 test/reference/recordflip-whole-paint-alpha-clip.ref.png create mode 100644 test/reference/recordflip-whole-paint-alpha-solid-clip.ref.png create mode 100644 test/reference/recordflip-whole-paint-alpha.ref.png create mode 100644 test/reference/recordflip-whole-paint.ref.png create mode 100644 test/reference/recordflip-whole-select-font-face.ref.png create mode 100644 test/reference/recordflip-whole-self-intersecting.ref.png create mode 100644 test/reference/recordflip-whole-text-transform.ref.png create mode 100644 test/reference/recording-surface-extend-none.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-none.base.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-none.base.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-none.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-none.traps.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-none.traps.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-pad.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-pad.base.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-pad.base.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-pad.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-pad.traps.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-pad.traps.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-reflect.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-reflect.base.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-reflect.base.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-reflect.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-reflect.traps.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-reflect.traps.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-repeat.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-repeat.base.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-repeat.base.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-repeat.rgb24.ref.png create mode 100644 test/reference/recording-surface-extend-repeat.traps.argb32.ref.png create mode 100644 test/reference/recording-surface-extend-repeat.traps.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.argb32.ref.png create mode 100644 test/reference/recording-surface-over.base.argb32.ref.png create mode 100644 test/reference/recording-surface-over.base.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.gl.argb32.ref.png create mode 100644 test/reference/recording-surface-over.image16.ref.png create mode 100644 test/reference/recording-surface-over.pdf.argb32.ref.png create mode 100644 test/reference/recording-surface-over.pdf.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.ps.argb32.ref.png create mode 100644 test/reference/recording-surface-over.ps.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.quartz.argb32.ref.png create mode 100644 test/reference/recording-surface-over.quartz.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.svg.argb32.ref.png create mode 100644 test/reference/recording-surface-over.svg.rgb24.ref.png create mode 100644 test/reference/recording-surface-over.traps.argb32.ref.png create mode 100644 test/reference/recording-surface-over.traps.rgb24.ref.png create mode 100644 test/reference/recording-surface-source.argb32.ref.png create mode 100644 test/reference/recording-surface-source.base.argb32.ref.png create mode 100644 test/reference/recording-surface-source.base.rgb24.ref.png create mode 100644 test/reference/recording-surface-source.rgb24.ref.png create mode 100644 test/reference/recording-surface-source.traps.argb32.ref.png create mode 100644 test/reference/recording-surface-source.traps.rgb24.ref.png create mode 100644 test/reference/rectangle-rounding-error.base.argb32.ref.png create mode 100644 test/reference/rectangle-rounding-error.base.rgb24.ref.png create mode 100644 test/reference/rectangle-rounding-error.ref.png create mode 100644 test/reference/rectilinear-dash-scale-unaligned.ref.png create mode 100644 test/reference/rectilinear-dash-scale-unaligned.traps.ref.png create mode 100644 test/reference/rectilinear-dash-scale.ref.png create mode 100644 test/reference/rectilinear-dash.base.argb32.ref.png create mode 100644 test/reference/rectilinear-dash.base.rgb24.ref.png create mode 100644 test/reference/rectilinear-dash.mask.argb32.ref.png create mode 100644 test/reference/rectilinear-dash.mask.rgb24.ref.png create mode 100644 test/reference/rectilinear-dash.quartz.xfail.png create mode 100644 test/reference/rectilinear-dash.ref.png create mode 100644 test/reference/rectilinear-dash.traps.argb32.ref.png create mode 100644 test/reference/rectilinear-dash.traps.rgb24.ref.png create mode 100644 test/reference/rectilinear-fill.base.argb32.ref.png create mode 100644 test/reference/rectilinear-fill.base.rgb24.ref.png create mode 100644 test/reference/rectilinear-fill.ref.png create mode 100644 test/reference/rectilinear-grid.base.argb32.ref.png create mode 100644 test/reference/rectilinear-grid.base.rgb24.ref.png create mode 100644 test/reference/rectilinear-grid.image16.ref.png create mode 100644 test/reference/rectilinear-grid.ref.png create mode 100644 test/reference/rectilinear-grid.traps.argb32.ref.png create mode 100644 test/reference/rectilinear-grid.traps.rgb24.ref.png create mode 100644 test/reference/rectilinear-miter-limit.base.argb32.ref.png create mode 100644 test/reference/rectilinear-miter-limit.base.rgb24.ref.png create mode 100644 test/reference/rectilinear-miter-limit.ps2.ref.png create mode 100644 test/reference/rectilinear-miter-limit.ps3.ref.png create mode 100644 test/reference/rectilinear-miter-limit.ref.png create mode 100644 test/reference/rectilinear-miter-limit.traps.argb32.ref.png create mode 100644 test/reference/rectilinear-miter-limit.traps.rgb24.ref.png create mode 100644 test/reference/rectilinear-stroke.base.argb32.ref.png create mode 100644 test/reference/rectilinear-stroke.base.rgb24.ref.png create mode 100644 test/reference/rectilinear-stroke.quartz.xfail.png create mode 100644 test/reference/rectilinear-stroke.ref.png create mode 100644 test/reference/reflected-stroke.base.argb32.ref.png create mode 100644 test/reference/reflected-stroke.base.rgb24.ref.png create mode 100644 test/reference/reflected-stroke.image16.ref.png create mode 100644 test/reference/reflected-stroke.mask.argb32.ref.png create mode 100644 test/reference/reflected-stroke.mask.rgb24.ref.png create mode 100644 test/reference/reflected-stroke.ps.ref.png create mode 100644 test/reference/reflected-stroke.ref.png create mode 100644 test/reference/reflected-stroke.traps.argb32.ref.png create mode 100644 test/reference/reflected-stroke.traps.rgb24.ref.png create mode 100644 test/reference/rel-path.base.argb32.ref.png create mode 100644 test/reference/rel-path.base.rgb24.ref.png create mode 100644 test/reference/rel-path.mask.rgb24.ref.png create mode 100644 test/reference/rel-path.ps2.rgb24.ref.png create mode 100644 test/reference/rel-path.ps3.rgb24.ref.png create mode 100644 test/reference/rel-path.ref.png create mode 100644 test/reference/rel-path.traps.argb32.ref.png create mode 100644 test/reference/rel-path.traps.rgb24.ref.png create mode 100644 test/reference/rgb24-ignore-alpha.base.argb32.ref.png create mode 100644 test/reference/rgb24-ignore-alpha.base.rgb24.ref.png create mode 100644 test/reference/rgb24-ignore-alpha.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.base.argb32.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.base.rgb24.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.traps.argb32.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.traps.rgb24.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.xlib-fallback.rgb24.ref.png create mode 100644 test/reference/rotate-clip-image-surface-paint.xlib-window.rgb24.ref.png create mode 100644 test/reference/rotate-clip.surface-paint.image.argb32.ref.png create mode 100644 test/reference/rotate-clip.surface-paint.image.rgb24.ref.png create mode 100644 test/reference/rotate-image-surface-paint.base.argb32.ref.png create mode 100644 test/reference/rotate-image-surface-paint.base.rgb24.ref.png create mode 100644 test/reference/rotate-image-surface-paint.pdf.xfail.png create mode 100644 test/reference/rotate-image-surface-paint.ps.ref.png create mode 100644 test/reference/rotate-image-surface-paint.quartz.ref.png create mode 100644 test/reference/rotate-image-surface-paint.ref.png create mode 100644 test/reference/rotate-image-surface-paint.svg.ref.png create mode 100644 test/reference/rotate-image-surface-paint.svg.xfail.png create mode 100644 test/reference/rotate-stroke-box.ref.png create mode 100644 test/reference/rotated-clip.base.argb32.ref.png create mode 100644 test/reference/rotated-clip.base.rgb24.ref.png create mode 100644 test/reference/rotated-clip.image16.ref.png create mode 100644 test/reference/rotated-clip.mask.argb32.ref.png create mode 100644 test/reference/rotated-clip.mask.rgb24.ref.png create mode 100644 test/reference/rotated-clip.ps.ref.png create mode 100644 test/reference/rotated-clip.quartz.ref.png create mode 100644 test/reference/rotated-clip.ref.png create mode 100644 test/reference/rotated-clip.traps.argb32.ref.png create mode 100644 test/reference/rotated-clip.traps.rgb24.ref.png create mode 100644 test/reference/rounded-rectangle-fill.base.argb32.ref.png create mode 100644 test/reference/rounded-rectangle-fill.base.rgb24.ref.png create mode 100644 test/reference/rounded-rectangle-fill.image16.ref.png create mode 100644 test/reference/rounded-rectangle-fill.ps.ref.png create mode 100644 test/reference/rounded-rectangle-fill.quartz.ref.png create mode 100644 test/reference/rounded-rectangle-fill.ref.png create mode 100644 test/reference/rounded-rectangle-fill.traps.argb32.ref.png create mode 100644 test/reference/rounded-rectangle-fill.traps.rgb24.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.base.argb32.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.base.rgb24.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.image16.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.mask.argb32.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.mask.rgb24.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.ps.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.traps.argb32.ref.png create mode 100644 test/reference/rounded-rectangle-stroke.traps.rgb24.ref.png create mode 100644 test/reference/sample-diagonal.ref.png create mode 100644 test/reference/sample-horizontal.ref.png create mode 100644 test/reference/sample-vertical.ref.png create mode 100644 test/reference/scale-down-source-surface-paint.base.argb32.ref.png create mode 100644 test/reference/scale-down-source-surface-paint.base.rgb24.ref.png create mode 100644 test/reference/scale-down-source-surface-paint.ref.png create mode 100644 test/reference/scale-offset-image.base.argb32.ref.png create mode 100644 test/reference/scale-offset-image.base.rgb24.ref.png create mode 100644 test/reference/scale-offset-image.gl.ref.png create mode 100644 test/reference/scale-offset-image.image16.ref.png create mode 100644 test/reference/scale-offset-image.pdf.argb32.ref.png create mode 100644 test/reference/scale-offset-image.pdf.rgb24.ref.png create mode 100644 test/reference/scale-offset-image.ps.ref.png create mode 100644 test/reference/scale-offset-image.quartz.ref.png create mode 100644 test/reference/scale-offset-image.ref.png create mode 100644 test/reference/scale-offset-image.script.xfail.png create mode 100644 test/reference/scale-offset-image.traps.argb32.ref.png create mode 100644 test/reference/scale-offset-image.traps.rgb24.ref.png create mode 100644 test/reference/scale-offset-image.xfail.png create mode 100644 test/reference/scale-offset-image.xlib-fallback.xfail.png create mode 100644 test/reference/scale-offset-similar.base.argb32.ref.png create mode 100644 test/reference/scale-offset-similar.base.rgb24.ref.png create mode 100644 test/reference/scale-offset-similar.gl.ref.png create mode 100644 test/reference/scale-offset-similar.image16.ref.png create mode 100644 test/reference/scale-offset-similar.pdf.argb32.ref.png create mode 100644 test/reference/scale-offset-similar.pdf.rgb24.ref.png create mode 100644 test/reference/scale-offset-similar.ps.ref.png create mode 100644 test/reference/scale-offset-similar.quartz.ref.png create mode 100644 test/reference/scale-offset-similar.recording.xfail.png create mode 100644 test/reference/scale-offset-similar.ref.png create mode 100644 test/reference/scale-offset-similar.script.xfail.png create mode 100644 test/reference/scale-offset-similar.traps.argb32.ref.png create mode 100644 test/reference/scale-offset-similar.traps.rgb24.ref.png create mode 100644 test/reference/scale-offset-similar.xfail.png create mode 100644 test/reference/scale-offset-similar.xlib-fallback.xfail.png create mode 100644 test/reference/scale-offset-similar.xlib.xfail.png create mode 100644 test/reference/scale-offset-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/scale-offset-xlib-window.rgb24.ref.png create mode 100644 test/reference/scale-offset-xlib.ref.png create mode 100644 test/reference/scale-offset.image.argb32.ref.png create mode 100644 test/reference/scale-offset.image.rgb24.ref.png create mode 100644 test/reference/scale-source-surface-paint.base.argb32.ref.png create mode 100644 test/reference/scale-source-surface-paint.base.rgb24.ref.png create mode 100644 test/reference/scale-source-surface-paint.pdf.argb32.xfail.png create mode 100644 test/reference/scale-source-surface-paint.pdf.rgb24.xfail.png create mode 100644 test/reference/scale-source-surface-paint.ref.png create mode 100644 test/reference/scale-source-surface-paint.svg.argb32.xfail.png create mode 100644 test/reference/scale-source-surface-paint.svg.rgb24.xfail.png create mode 100644 test/reference/select-font-face.base.argb32.ref.png create mode 100644 test/reference/select-font-face.base.rgb24.ref.png create mode 100644 test/reference/select-font-face.image16.ref.png create mode 100644 test/reference/select-font-face.ps2.ref.png create mode 100644 test/reference/select-font-face.ps3.ref.png create mode 100644 test/reference/select-font-face.quartz.ref.png create mode 100644 test/reference/select-font-face.ref.png create mode 100644 test/reference/select-font-face.traps.ref.png create mode 100644 test/reference/self-copy-overlap.base.argb32.ref.png create mode 100644 test/reference/self-copy-overlap.base.rgb24.ref.png create mode 100644 test/reference/self-copy-overlap.mask.argb32.ref.png create mode 100644 test/reference/self-copy-overlap.mask.rgb24.ref.png create mode 100644 test/reference/self-copy-overlap.traps.argb32.ref.png create mode 100644 test/reference/self-copy-overlap.traps.rgb24.ref.png create mode 100644 test/reference/self-copy.base.argb32.ref.png create mode 100644 test/reference/self-copy.base.rgb24.ref.png create mode 100644 test/reference/self-copy.ps2.ref.png create mode 100644 test/reference/self-copy.ps3.ref.png create mode 100644 test/reference/self-copy.ref.png create mode 100644 test/reference/self-copy.traps.argb32.ref.png create mode 100644 test/reference/self-copy.traps.rgb24.ref.png create mode 100644 test/reference/self-intersecting.base.argb32.ref.png create mode 100644 test/reference/self-intersecting.base.rgb24.ref.png create mode 100644 test/reference/self-intersecting.ps.ref.png create mode 100644 test/reference/self-intersecting.quartz.xfail.png create mode 100644 test/reference/self-intersecting.ref.png create mode 100644 test/reference/self-intersecting.traps.argb32.ref.png create mode 100644 test/reference/self-intersecting.traps.rgb24.ref.png create mode 100644 test/reference/set-source.base.argb32.ref.png create mode 100644 test/reference/set-source.base.rgb24.ref.png create mode 100644 test/reference/set-source.ref.png create mode 100644 test/reference/shape-general-convex.base.argb32.ref.png create mode 100644 test/reference/shape-general-convex.base.rgb24.ref.png create mode 100644 test/reference/shape-general-convex.ps.ref.png create mode 100644 test/reference/shape-general-convex.ref.png create mode 100644 test/reference/shape-general-convex.traps.argb32.ref.png create mode 100644 test/reference/shape-general-convex.traps.rgb24.ref.png create mode 100644 test/reference/shape-sierpinski.base.argb32.ref.png create mode 100644 test/reference/shape-sierpinski.base.rgb24.ref.png create mode 100644 test/reference/shape-sierpinski.pdf.argb32.ref.png create mode 100644 test/reference/shape-sierpinski.pdf.rgb24.ref.png create mode 100644 test/reference/shape-sierpinski.ps.ref.png create mode 100644 test/reference/shape-sierpinski.ps3.argb32.ref.png create mode 100644 test/reference/shape-sierpinski.ps3.rgb24.ref.png create mode 100644 test/reference/shape-sierpinski.ref.png create mode 100644 test/reference/shape-sierpinski.traps.argb32.ref.png create mode 100644 test/reference/shape-sierpinski.traps.rgb24.ref.png create mode 100644 test/reference/show-glyphs-advance.base.argb32.ref.png create mode 100644 test/reference/show-glyphs-advance.base.rgb24.ref.png create mode 100644 test/reference/show-glyphs-advance.image16.ref.png create mode 100644 test/reference/show-glyphs-advance.ps.ref.png create mode 100644 test/reference/show-glyphs-advance.quartz.ref.png create mode 100644 test/reference/show-glyphs-advance.ref.png create mode 100644 test/reference/show-glyphs-advance.svg.ref.png create mode 100644 test/reference/show-glyphs-advance.traps.ref.png create mode 100644 test/reference/show-glyphs-many.base.argb32.ref.png create mode 100644 test/reference/show-glyphs-many.base.rgb24.ref.png create mode 100644 test/reference/show-glyphs-many.ref.png create mode 100644 test/reference/show-text-current-point.base.argb32.ref.png create mode 100644 test/reference/show-text-current-point.base.rgb24.ref.png create mode 100644 test/reference/show-text-current-point.image16.ref.png create mode 100644 test/reference/show-text-current-point.ps2.ref.png create mode 100644 test/reference/show-text-current-point.ps3.ref.png create mode 100644 test/reference/show-text-current-point.quartz.ref.png create mode 100644 test/reference/show-text-current-point.ref.png create mode 100644 test/reference/show-text-current-point.traps.ref.png create mode 100644 test/reference/simple-edge.ref.png create mode 100644 test/reference/simple-edge.xfail.png create mode 100644 test/reference/skew-extreme.base.argb32.ref.png create mode 100644 test/reference/skew-extreme.base.rgb24.ref.png create mode 100644 test/reference/skew-extreme.ps2.ref.png create mode 100644 test/reference/skew-extreme.ps3.ref.png create mode 100644 test/reference/skew-extreme.ref.png create mode 100644 test/reference/skew-extreme.traps.argb32.ref.png create mode 100644 test/reference/skew-extreme.traps.rgb24.ref.png create mode 100644 test/reference/smask-fill.base.argb32.ref.png create mode 100644 test/reference/smask-fill.base.rgb24.ref.png create mode 100644 test/reference/smask-fill.image16.ref.png create mode 100644 test/reference/smask-fill.pdf.ref.png create mode 100644 test/reference/smask-fill.quartz.ref.png create mode 100644 test/reference/smask-fill.ref.png create mode 100644 test/reference/smask-fill.svg.ref.png create mode 100644 test/reference/smask-fill.traps.argb32.ref.png create mode 100644 test/reference/smask-fill.traps.rgb24.ref.png create mode 100644 test/reference/smask-image-mask.base.argb32.ref.png create mode 100644 test/reference/smask-image-mask.base.rgb24.ref.png create mode 100644 test/reference/smask-image-mask.pdf.ref.png create mode 100644 test/reference/smask-image-mask.ref.png create mode 100644 test/reference/smask-mask.base.argb32.ref.png create mode 100644 test/reference/smask-mask.base.rgb24.ref.png create mode 100644 test/reference/smask-mask.image16.ref.png create mode 100644 test/reference/smask-mask.pdf.ref.png create mode 100644 test/reference/smask-mask.quartz.ref.png create mode 100644 test/reference/smask-mask.ref.png create mode 100644 test/reference/smask-mask.svg.ref.png create mode 100644 test/reference/smask-paint.base.argb32.ref.png create mode 100644 test/reference/smask-paint.base.rgb24.ref.png create mode 100644 test/reference/smask-paint.image16.ref.png create mode 100644 test/reference/smask-paint.pdf.ref.png create mode 100644 test/reference/smask-paint.quartz.ref.png create mode 100644 test/reference/smask-paint.ref.png create mode 100644 test/reference/smask-paint.svg.ref.png create mode 100644 test/reference/smask-stroke.base.argb32.ref.png create mode 100644 test/reference/smask-stroke.base.rgb24.ref.png create mode 100644 test/reference/smask-stroke.image16.ref.png create mode 100644 test/reference/smask-stroke.pdf.xfail.png create mode 100644 test/reference/smask-stroke.quartz.ref.png create mode 100644 test/reference/smask-stroke.ref.png create mode 100644 test/reference/smask-stroke.traps.argb32.ref.png create mode 100644 test/reference/smask-stroke.traps.rgb24.ref.png create mode 100644 test/reference/smask-text.base.argb32.ref.png create mode 100644 test/reference/smask-text.base.rgb24.ref.png create mode 100644 test/reference/smask-text.image16.ref.png create mode 100644 test/reference/smask-text.mask.argb32.ref.png create mode 100644 test/reference/smask-text.mask.rgb24.ref.png create mode 100644 test/reference/smask-text.pdf.ref.png create mode 100644 test/reference/smask-text.ps2.ref.png create mode 100644 test/reference/smask-text.ps3.ref.png create mode 100644 test/reference/smask-text.quartz.ref.png create mode 100644 test/reference/smask-text.ref.png create mode 100644 test/reference/smask-text.script.ref.png create mode 100644 test/reference/smask-text.svg.ref.png create mode 100644 test/reference/smask-text.traps.ref.png create mode 100644 test/reference/smask-text.xlib-fallback.ref.png create mode 100644 test/reference/smask.base.argb32.ref.png create mode 100644 test/reference/smask.base.rgb24.ref.png create mode 100644 test/reference/smask.image16.ref.png create mode 100644 test/reference/smask.mask.argb32.ref.png create mode 100644 test/reference/smask.mask.rgb24.ref.png create mode 100644 test/reference/smask.pdf.xfail.png create mode 100644 test/reference/smask.ps.ref.png create mode 100644 test/reference/smask.quartz.ref.png create mode 100644 test/reference/smask.ref.png create mode 100644 test/reference/smask.script.ref.png create mode 100644 test/reference/smask.svg.ref.png create mode 100644 test/reference/smask.traps.ref.png create mode 100644 test/reference/smask.xlib-fallback.ref.png create mode 100644 test/reference/solid-pattern-cache-stress.base.argb32.ref.png create mode 100644 test/reference/solid-pattern-cache-stress.base.rgb24.ref.png create mode 100644 test/reference/solid-pattern-cache-stress.ref.png create mode 100644 test/reference/source-clip-scale.base.argb32.ref.png create mode 100644 test/reference/source-clip-scale.base.rgb24.ref.png create mode 100644 test/reference/source-clip-scale.gl.ref.png create mode 100644 test/reference/source-clip-scale.pdf.ref.png create mode 100644 test/reference/source-clip-scale.ps2.argb32.ref.png create mode 100644 test/reference/source-clip-scale.ps2.rgb24.ref.png create mode 100644 test/reference/source-clip-scale.ps3.argb32.ref.png create mode 100644 test/reference/source-clip-scale.ps3.rgb24.ref.png create mode 100644 test/reference/source-clip-scale.quartz.ref.png create mode 100644 test/reference/source-clip-scale.recording.ref.png create mode 100644 test/reference/source-clip-scale.ref.png create mode 100644 test/reference/source-clip-scale.svg.ref.png create mode 100644 test/reference/source-clip.base.argb32.ref.png create mode 100644 test/reference/source-clip.base.rgb24.ref.png create mode 100644 test/reference/source-clip.ref.png create mode 100644 test/reference/source-surface-scale-paint.base.argb32.ref.png create mode 100644 test/reference/source-surface-scale-paint.base.rgb24.ref.png create mode 100644 test/reference/source-surface-scale-paint.ref.png create mode 100644 test/reference/spline-decomposition.base.argb32.ref.png create mode 100644 test/reference/spline-decomposition.base.rgb24.ref.png create mode 100644 test/reference/spline-decomposition.image16.ref.png create mode 100644 test/reference/spline-decomposition.pdf.ref.png create mode 100644 test/reference/spline-decomposition.ps.ref.png create mode 100644 test/reference/spline-decomposition.quartz.xfail.png create mode 100644 test/reference/spline-decomposition.ref.png create mode 100644 test/reference/spline-decomposition.svg.ref.png create mode 100644 test/reference/spline-decomposition.traps.argb32.ref.png create mode 100644 test/reference/spline-decomposition.traps.rgb24.ref.png create mode 100644 test/reference/stride-12-image.base.argb32.ref.png create mode 100644 test/reference/stride-12-image.base.rgb24.ref.png create mode 100644 test/reference/stride-12-image.image16.ref.png create mode 100644 test/reference/stride-12-image.ps.ref.png create mode 100644 test/reference/stride-12-image.ref.png create mode 100644 test/reference/stride-12-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/stride-12-xlib-window.rgb24.ref.png create mode 100644 test/reference/stride-12-xlib.ref.png create mode 100644 test/reference/stroke-clipped.ref.png create mode 100644 test/reference/stroke-ctm-caps.base.argb32.ref.png create mode 100644 test/reference/stroke-ctm-caps.base.rgb24.ref.png create mode 100644 test/reference/stroke-ctm-caps.image16.ref.png create mode 100644 test/reference/stroke-ctm-caps.mask.argb32.ref.png create mode 100644 test/reference/stroke-ctm-caps.mask.rgb24.ref.png create mode 100644 test/reference/stroke-ctm-caps.ps2.ref.png create mode 100644 test/reference/stroke-ctm-caps.ps3.ref.png create mode 100644 test/reference/stroke-ctm-caps.quartz.ref.png create mode 100644 test/reference/stroke-ctm-caps.ref.png create mode 100644 test/reference/stroke-ctm-caps.traps.argb32.ref.png create mode 100644 test/reference/stroke-ctm-caps.traps.rgb24.ref.png create mode 100644 test/reference/stroke-image.base.argb32.ref.png create mode 100644 test/reference/stroke-image.base.rgb24.ref.png create mode 100644 test/reference/stroke-image.image16.ref.png create mode 100644 test/reference/stroke-image.pdf.ref.png create mode 100644 test/reference/stroke-image.ps.ref.png create mode 100644 test/reference/stroke-image.quartz.ref.png create mode 100644 test/reference/stroke-image.ref.png create mode 100644 test/reference/stroke-image.traps.argb32.ref.png create mode 100644 test/reference/stroke-image.traps.rgb24.ref.png create mode 100644 test/reference/stroke-open-box.base.argb32.ref.png create mode 100644 test/reference/stroke-open-box.base.rgb24.ref.png create mode 100644 test/reference/stroke-open-box.ref.png create mode 100644 test/reference/stroke-pattern.base.argb32.ref.png create mode 100644 test/reference/stroke-pattern.base.rgb24.ref.png create mode 100644 test/reference/stroke-pattern.ref.png create mode 100644 test/reference/stroke-pattern.traps.ref.png create mode 100644 test/reference/stroke-xlib-fallback.rgb24.ref.png create mode 100644 test/reference/stroke-xlib-window.rgb24.ref.png create mode 100644 test/reference/stroke-xlib.ref.png create mode 100644 test/reference/stroke.image.argb32.ref.png create mode 100644 test/reference/stroke.image.rgb24.ref.png create mode 100644 test/reference/subsurface-image-repeat.base.argb32.ref.png create mode 100644 test/reference/subsurface-image-repeat.base.rgb24.ref.png create mode 100644 test/reference/subsurface-image-repeat.image16.ref.png create mode 100644 test/reference/subsurface-image-repeat.ref.png create mode 100644 test/reference/subsurface-modify-child.base.argb32.ref.png create mode 100644 test/reference/subsurface-modify-child.base.rgb24.ref.png create mode 100644 test/reference/subsurface-modify-child.ref.png create mode 100644 test/reference/subsurface-modify-parent.base.argb32.ref.png create mode 100644 test/reference/subsurface-modify-parent.base.rgb24.ref.png create mode 100644 test/reference/subsurface-modify-parent.ref.png create mode 100644 test/reference/subsurface-outside-target.base.argb32.ref.png create mode 100644 test/reference/subsurface-outside-target.base.rgb24.ref.png create mode 100644 test/reference/subsurface-outside-target.ref.png create mode 100644 test/reference/subsurface-pad.base.argb32.ref.png create mode 100644 test/reference/subsurface-pad.base.rgb24.ref.png create mode 100644 test/reference/subsurface-pad.quartz.xfail.png create mode 100644 test/reference/subsurface-pad.ref.png create mode 100644 test/reference/subsurface-reflect.base.argb32.ref.png create mode 100644 test/reference/subsurface-reflect.base.rgb24.ref.png create mode 100644 test/reference/subsurface-reflect.ref.png create mode 100644 test/reference/subsurface-repeat.base.argb32.ref.png create mode 100644 test/reference/subsurface-repeat.base.rgb24.ref.png create mode 100644 test/reference/subsurface-repeat.ref.png create mode 100644 test/reference/subsurface-scale.base.argb32.ref.png create mode 100644 test/reference/subsurface-scale.base.rgb24.ref.png create mode 100644 test/reference/subsurface-scale.ref.png create mode 100644 test/reference/subsurface-scale.traps.argb32.ref.png create mode 100644 test/reference/subsurface-scale.traps.rgb24.ref.png create mode 100644 test/reference/subsurface-similar-repeat.base.argb32.ref.png create mode 100644 test/reference/subsurface-similar-repeat.base.rgb24.ref.png create mode 100644 test/reference/subsurface-similar-repeat.ref.png create mode 100644 test/reference/subsurface.base.argb32.ref.png create mode 100644 test/reference/subsurface.base.rgb24.ref.png create mode 100644 test/reference/subsurface.image16.ref.png create mode 100644 test/reference/subsurface.ps.ref.png create mode 100644 test/reference/subsurface.ref.png create mode 100644 test/reference/subsurface.traps.argb32.ref.png create mode 100644 test/reference/subsurface.traps.rgb24.ref.png create mode 100644 test/reference/surface-pattern-big-scale-down.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-big-scale-down.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-big-scale-down.ps.ref.png create mode 100644 test/reference/surface-pattern-big-scale-down.quartz.ref.png create mode 100644 test/reference/surface-pattern-big-scale-down.ref.png create mode 100644 test/reference/surface-pattern-operator.argb32.ref.png create mode 100644 test/reference/surface-pattern-operator.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-operator.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-operator.image16.ref.png create mode 100644 test/reference/surface-pattern-operator.pdf.argb32.xfail.png create mode 100644 test/reference/surface-pattern-operator.pdf.rgb24.xfail.png create mode 100644 test/reference/surface-pattern-operator.quartz.argb32.ref.png create mode 100644 test/reference/surface-pattern-operator.quartz.rgb24.ref.png create mode 100644 test/reference/surface-pattern-operator.rgb24.ref.png create mode 100644 test/reference/surface-pattern-operator.traps.argb32.ref.png create mode 100644 test/reference/surface-pattern-operator.traps.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-none.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-none.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-none.quartz.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-none.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-pad.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-pad.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-pad.quartz.xfail.png create mode 100644 test/reference/surface-pattern-scale-down-extend-pad.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-reflect.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-reflect.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-reflect.quartz.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-reflect.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-repeat.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-repeat.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-repeat.quartz.ref.png create mode 100644 test/reference/surface-pattern-scale-down-extend-repeat.ref.png create mode 100644 test/reference/surface-pattern-scale-down.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-scale-down.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-down.image16.ref.png create mode 100644 test/reference/surface-pattern-scale-down.pdf.ref.png create mode 100644 test/reference/surface-pattern-scale-down.ps2.ref.png create mode 100644 test/reference/surface-pattern-scale-down.ps3.ref.png create mode 100644 test/reference/surface-pattern-scale-down.quartz.ref.png create mode 100644 test/reference/surface-pattern-scale-down.ref.png create mode 100644 test/reference/surface-pattern-scale-up.base.argb32.ref.png create mode 100644 test/reference/surface-pattern-scale-up.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern-scale-up.image16.ref.png create mode 100644 test/reference/surface-pattern-scale-up.pdf.ref.png create mode 100644 test/reference/surface-pattern-scale-up.ps2.ref.png create mode 100644 test/reference/surface-pattern-scale-up.ps3.ref.png create mode 100644 test/reference/surface-pattern-scale-up.quartz.xfail.png create mode 100644 test/reference/surface-pattern-scale-up.ref.png create mode 100644 test/reference/surface-pattern.base.argb32.ref.png create mode 100644 test/reference/surface-pattern.base.rgb24.ref.png create mode 100644 test/reference/surface-pattern.image16.ref.png create mode 100644 test/reference/surface-pattern.pdf.xfail.png create mode 100644 test/reference/surface-pattern.ps.xfail.png create mode 100644 test/reference/surface-pattern.quartz.xfail.png create mode 100644 test/reference/surface-pattern.ref.png create mode 100644 test/reference/surface-pattern.svg.xfail.png create mode 100644 test/reference/svg-surface-source.base.argb32.ref.png create mode 100644 test/reference/svg-surface-source.base.rgb24.ref.png create mode 100644 test/reference/svg-surface-source.image16.ref.png create mode 100644 test/reference/svg-surface-source.ref.png create mode 100644 test/reference/svg-surface-source.svg12.argb32.xfail.png create mode 100644 test/reference/svg-surface-source.svg12.rgb24.xfail.png create mode 100644 test/reference/text-antialias-gray.base.argb32.ref.png create mode 100644 test/reference/text-antialias-gray.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-gray.image16.ref.png create mode 100644 test/reference/text-antialias-gray.quartz.ref.png create mode 100644 test/reference/text-antialias-gray.ref.png create mode 100644 test/reference/text-antialias-gray.traps.ref.png create mode 100644 test/reference/text-antialias-none.base.argb32.ref.png create mode 100644 test/reference/text-antialias-none.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-none.quartz.ref.png create mode 100644 test/reference/text-antialias-none.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.base.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.image16.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.mask.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.mask.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.ref.png create mode 100644 test/reference/text-antialias-subpixel-bgr.traps.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.base.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.image16.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.mask.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.mask.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.ref.png create mode 100644 test/reference/text-antialias-subpixel-rgb.traps.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.base.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.image16.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.mask.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.mask.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.ref.png create mode 100644 test/reference/text-antialias-subpixel-vbgr.traps.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.base.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.image16.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.mask.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.mask.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.ref.png create mode 100644 test/reference/text-antialias-subpixel-vrgb.traps.ref.png create mode 100644 test/reference/text-antialias-subpixel.base.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel.base.argb32.xfail.png create mode 100644 test/reference/text-antialias-subpixel.base.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel.base.rgb24.xfail.png create mode 100644 test/reference/text-antialias-subpixel.image16.ref.png create mode 100644 test/reference/text-antialias-subpixel.mask.argb32.ref.png create mode 100644 test/reference/text-antialias-subpixel.mask.rgb24.ref.png create mode 100644 test/reference/text-antialias-subpixel.quartz.ref.png create mode 100644 test/reference/text-antialias-subpixel.ref.png create mode 100644 test/reference/text-antialias-subpixel.traps.ref.png create mode 100644 test/reference/text-glyph-range.base.argb32.ref.png create mode 100644 test/reference/text-glyph-range.base.rgb24.ref.png create mode 100644 test/reference/text-glyph-range.image16.ref.png create mode 100644 test/reference/text-glyph-range.ps.ref.png create mode 100644 test/reference/text-glyph-range.quartz.ref.png create mode 100644 test/reference/text-glyph-range.ref.png create mode 100644 test/reference/text-glyph-range.traps.ref.png create mode 100644 test/reference/text-pattern.base.argb32.ref.png create mode 100644 test/reference/text-pattern.base.rgb24.ref.png create mode 100644 test/reference/text-pattern.pdf.argb32.ref.png create mode 100644 test/reference/text-pattern.pdf.rgb24.ref.png create mode 100644 test/reference/text-pattern.ps2.argb32.ref.png create mode 100644 test/reference/text-pattern.ps2.rgb24.ref.png create mode 100644 test/reference/text-pattern.ps3.argb32.ref.png create mode 100644 test/reference/text-pattern.ps3.rgb24.ref.png create mode 100644 test/reference/text-pattern.quartz.argb32.ref.png create mode 100644 test/reference/text-pattern.quartz.rgb24.ref.png create mode 100644 test/reference/text-pattern.ref.png create mode 100644 test/reference/text-pattern.svg.argb32.ref.png create mode 100644 test/reference/text-pattern.svg.rgb24.ref.png create mode 100644 test/reference/text-pattern.traps.argb32.ref.png create mode 100644 test/reference/text-pattern.traps.rgb24.ref.png create mode 100644 test/reference/text-rotate.base.argb32.ref.png create mode 100644 test/reference/text-rotate.base.rgb24.ref.png create mode 100644 test/reference/text-rotate.image16.ref.png create mode 100644 test/reference/text-rotate.mask.argb32.ref.png create mode 100644 test/reference/text-rotate.mask.rgb24.ref.png create mode 100644 test/reference/text-rotate.pdf.ref.png create mode 100644 test/reference/text-rotate.ps.ref.png create mode 100644 test/reference/text-rotate.quartz.ref.png create mode 100644 test/reference/text-rotate.ref.png create mode 100644 test/reference/text-rotate.svg.ref.png create mode 100644 test/reference/text-rotate.traps.ref.png create mode 100644 test/reference/text-rotate.xlib-fallback.ref.png create mode 100644 test/reference/text-transform.base.argb32.ref.png create mode 100644 test/reference/text-transform.base.rgb24.ref.png create mode 100644 test/reference/text-transform.image16.ref.png create mode 100644 test/reference/text-transform.pdf.argb32.ref.png create mode 100644 test/reference/text-transform.pdf.rgb24.ref.png create mode 100644 test/reference/text-transform.ps2.ref.png create mode 100644 test/reference/text-transform.ps3.ref.png create mode 100644 test/reference/text-transform.ref.png create mode 100644 test/reference/text-transform.svg.ref.png create mode 100644 test/reference/tiger.base.argb32.ref.png create mode 100644 test/reference/tiger.base.rgb24.ref.png create mode 100644 test/reference/tiger.ref.png create mode 100644 test/reference/tiger.traps.argb32.ref.png create mode 100644 test/reference/tiger.traps.rgb24.ref.png create mode 100644 test/reference/tighten-bounds.argb32.ref.png create mode 100644 test/reference/tighten-bounds.base.argb32.ref.png create mode 100644 test/reference/tighten-bounds.base.rgb24.ref.png create mode 100644 test/reference/tighten-bounds.rgb24.ref.png create mode 100644 test/reference/tighten-bounds.traps.argb32.ref.png create mode 100644 test/reference/tighten-bounds.traps.rgb24.ref.png create mode 100644 test/reference/transforms.base.argb32.ref.png create mode 100644 test/reference/transforms.base.rgb24.ref.png create mode 100644 test/reference/transforms.image16.ref.png create mode 100644 test/reference/transforms.ps2.ref.png create mode 100644 test/reference/transforms.ps3.ref.png create mode 100644 test/reference/transforms.ref.png create mode 100644 test/reference/transforms.traps.argb32.ref.png create mode 100644 test/reference/transforms.traps.rgb24.ref.png create mode 100644 test/reference/translate-show-surface.base.argb32.ref.png create mode 100644 test/reference/translate-show-surface.base.rgb24.ref.png create mode 100644 test/reference/translate-show-surface.ref.png create mode 100644 test/reference/trap-clip.argb32.ref.png create mode 100644 test/reference/trap-clip.base.argb32.ref.png create mode 100644 test/reference/trap-clip.base.rgb24.ref.png create mode 100644 test/reference/trap-clip.image16.ref.png create mode 100644 test/reference/trap-clip.mask.argb32.ref.png create mode 100644 test/reference/trap-clip.mask.rgb24.ref.png create mode 100644 test/reference/trap-clip.ps2.argb32.ref.png create mode 100644 test/reference/trap-clip.ps2.rgb24.ref.png create mode 100644 test/reference/trap-clip.ps3.argb32.ref.png create mode 100644 test/reference/trap-clip.ps3.rgb24.ref.png create mode 100644 test/reference/trap-clip.quartz.argb32.ref.png create mode 100644 test/reference/trap-clip.quartz.rgb24.ref.png create mode 100644 test/reference/trap-clip.rgb24.ref.png create mode 100644 test/reference/trap-clip.test-paginated.argb32.ref.png create mode 100644 test/reference/trap-clip.traps.argb32.ref.png create mode 100644 test/reference/trap-clip.traps.rgb24.ref.png create mode 100644 test/reference/twin-antialias-gray.base.argb32.ref.png create mode 100644 test/reference/twin-antialias-gray.base.rgb24.ref.png create mode 100644 test/reference/twin-antialias-gray.image16.ref.png create mode 100644 test/reference/twin-antialias-gray.mask.argb32.ref.png create mode 100644 test/reference/twin-antialias-gray.mask.rgb24.ref.png create mode 100644 test/reference/twin-antialias-gray.ref.png create mode 100644 test/reference/twin-antialias-gray.traps.argb32.ref.png create mode 100644 test/reference/twin-antialias-gray.traps.rgb24.ref.png create mode 100644 test/reference/twin-antialias-mixed.base.argb32.ref.png create mode 100644 test/reference/twin-antialias-mixed.base.rgb24.ref.png create mode 100644 test/reference/twin-antialias-mixed.image16.ref.png create mode 100644 test/reference/twin-antialias-mixed.ref.png create mode 100644 test/reference/twin-antialias-mixed.traps.argb32.ref.png create mode 100644 test/reference/twin-antialias-mixed.traps.rgb24.ref.png create mode 100644 test/reference/twin-antialias-none.base.argb32.ref.png create mode 100644 test/reference/twin-antialias-none.base.rgb24.ref.png create mode 100644 test/reference/twin-antialias-none.ref.png create mode 100644 test/reference/twin-antialias-none.traps.argb32.ref.png create mode 100644 test/reference/twin-antialias-none.traps.rgb24.ref.png create mode 100644 test/reference/twin-antialias-subpixel.base.argb32.ref.png create mode 100644 test/reference/twin-antialias-subpixel.base.rgb24.ref.png create mode 100644 test/reference/twin-antialias-subpixel.image16.ref.png create mode 100644 test/reference/twin-antialias-subpixel.mask.argb32.ref.png create mode 100644 test/reference/twin-antialias-subpixel.mask.rgb24.ref.png create mode 100644 test/reference/twin-antialias-subpixel.ref.png create mode 100644 test/reference/twin-antialias-subpixel.traps.argb32.ref.png create mode 100644 test/reference/twin-antialias-subpixel.traps.rgb24.ref.png create mode 100644 test/reference/twin.base.argb32.ref.png create mode 100644 test/reference/twin.base.rgb24.ref.png create mode 100644 test/reference/twin.image16.ref.png create mode 100644 test/reference/twin.mask.argb32.ref.png create mode 100644 test/reference/twin.mask.rgb24.ref.png create mode 100644 test/reference/twin.ps.ref.png create mode 100644 test/reference/twin.ref.png create mode 100644 test/reference/twin.svg.ref.png create mode 100644 test/reference/twin.traps.argb32.ref.png create mode 100644 test/reference/twin.traps.rgb24.ref.png create mode 100644 test/reference/unaligned-box.base.argb32.ref.png create mode 100644 test/reference/unaligned-box.base.rgb24.ref.png create mode 100644 test/reference/unaligned-box.ref.png create mode 100644 test/reference/unaligned-box.traps.argb32.ref.png create mode 100644 test/reference/unaligned-box.traps.rgb24.ref.png create mode 100644 test/reference/unantialiased-shapes.base.argb32.ref.png create mode 100644 test/reference/unantialiased-shapes.base.rgb24.ref.png create mode 100644 test/reference/unantialiased-shapes.quartz.ref.png create mode 100644 test/reference/unantialiased-shapes.ref.png create mode 100644 test/reference/unantialiased-shapes.traps.argb32.ref.png create mode 100644 test/reference/unantialiased-shapes.traps.rgb24.ref.png create mode 100644 test/reference/unbounded-operator.argb32.ref.png create mode 100644 test/reference/unbounded-operator.base.argb32.ref.png create mode 100644 test/reference/unbounded-operator.base.rgb24.ref.png create mode 100644 test/reference/unbounded-operator.gl.argb32.xfail.png create mode 100644 test/reference/unbounded-operator.gl.rgb24.xfail.png create mode 100644 test/reference/unbounded-operator.image16.ref.png create mode 100644 test/reference/unbounded-operator.mask.argb32.ref.png create mode 100644 test/reference/unbounded-operator.mask.rgb24.ref.png create mode 100644 test/reference/unbounded-operator.pdf.argb32.ref.png create mode 100644 test/reference/unbounded-operator.ps2.argb32.ref.png create mode 100644 test/reference/unbounded-operator.ps3.argb32.ref.png create mode 100644 test/reference/unbounded-operator.quartz.argb32.ref.png create mode 100644 test/reference/unbounded-operator.quartz.rgb24.ref.png create mode 100644 test/reference/unbounded-operator.rgb24.ref.png create mode 100644 test/reference/unbounded-operator.svg12.argb32.ref.png create mode 100644 test/reference/unbounded-operator.svg12.rgb24.xfail.png create mode 100644 test/reference/unbounded-operator.traps.argb32.ref.png create mode 100644 test/reference/unbounded-operator.traps.rgb24.ref.png create mode 100644 test/reference/unclosed-strokes.base.argb32.ref.png create mode 100644 test/reference/unclosed-strokes.base.rgb24.ref.png create mode 100644 test/reference/unclosed-strokes.ref.png create mode 100644 test/reference/unclosed-strokes.traps.argb32.ref.png create mode 100644 test/reference/unclosed-strokes.traps.rgb24.ref.png create mode 100644 test/reference/user-font-mask.base.argb32.ref.png create mode 100644 test/reference/user-font-mask.base.rgb24.ref.png create mode 100644 test/reference/user-font-mask.image16.ref.png create mode 100644 test/reference/user-font-mask.pdf.ref.png create mode 100644 test/reference/user-font-mask.ps2.ref.png create mode 100644 test/reference/user-font-mask.ps3.ref.png create mode 100644 test/reference/user-font-mask.ref.png create mode 100644 test/reference/user-font-mask.svg.ref.png create mode 100644 test/reference/user-font-proxy.base.argb32.ref.png create mode 100644 test/reference/user-font-proxy.base.rgb24.ref.png create mode 100644 test/reference/user-font-proxy.image16.ref.png create mode 100644 test/reference/user-font-proxy.pdf.argb32.ref.png create mode 100644 test/reference/user-font-proxy.pdf.ref.png create mode 100644 test/reference/user-font-proxy.pdf.rgb24.ref.png create mode 100644 test/reference/user-font-proxy.ps.ref.png create mode 100644 test/reference/user-font-proxy.quartz.ref.png create mode 100644 test/reference/user-font-proxy.ref.png create mode 100644 test/reference/user-font-proxy.svg.ref.png create mode 100644 test/reference/user-font-proxy.traps.ref.png create mode 100644 test/reference/user-font-rescale.base.argb32.ref.png create mode 100644 test/reference/user-font-rescale.base.rgb24.ref.png create mode 100644 test/reference/user-font-rescale.image16.ref.png create mode 100644 test/reference/user-font-rescale.ps.ref.png create mode 100644 test/reference/user-font-rescale.quartz.ref.png create mode 100644 test/reference/user-font-rescale.ref.png create mode 100644 test/reference/user-font-rescale.svg.ref.png create mode 100644 test/reference/user-font-rescale.traps.ref.png create mode 100644 test/reference/user-font.base.argb32.ref.png create mode 100644 test/reference/user-font.base.rgb24.ref.png create mode 100644 test/reference/user-font.image16.ref.png create mode 100644 test/reference/user-font.mask.argb32.ref.png create mode 100644 test/reference/user-font.mask.rgb24.ref.png create mode 100644 test/reference/user-font.pdf.ref.png create mode 100644 test/reference/user-font.ps.ref.png create mode 100644 test/reference/user-font.quartz.ref.png create mode 100644 test/reference/user-font.ref.png create mode 100644 test/reference/user-font.svg.ref.png create mode 100644 test/reference/user-font.traps.argb32.ref.png create mode 100644 test/reference/user-font.traps.rgb24.ref.png create mode 100644 test/reference/white-in-noop.base.argb32.ref.png create mode 100644 test/reference/white-in-noop.base.rgb24.ref.png create mode 100644 test/reference/white-in-noop.ref.png create mode 100644 test/reference/world-map-fill.base.argb32.ref.png create mode 100644 test/reference/world-map-fill.base.rgb24.ref.png create mode 100644 test/reference/world-map-fill.image16.ref.png create mode 100644 test/reference/world-map-fill.ref.png create mode 100644 test/reference/world-map-fill.traps.argb32.ref.png create mode 100644 test/reference/world-map-fill.traps.rgb24.ref.png create mode 100644 test/reference/world-map-stroke.base.argb32.ref.png create mode 100644 test/reference/world-map-stroke.base.rgb24.ref.png create mode 100644 test/reference/world-map-stroke.image16.ref.png create mode 100644 test/reference/world-map-stroke.mask.argb32.ref.png create mode 100644 test/reference/world-map-stroke.mask.rgb24.ref.png create mode 100644 test/reference/world-map-stroke.ref.png create mode 100644 test/reference/world-map-stroke.traps.argb32.ref.png create mode 100644 test/reference/world-map-stroke.traps.rgb24.ref.png create mode 100644 test/reference/world-map.base.argb32.ref.png create mode 100644 test/reference/world-map.base.rgb24.ref.png create mode 100644 test/reference/world-map.image16.ref.png create mode 100644 test/reference/world-map.mask.argb32.ref.png create mode 100644 test/reference/world-map.mask.rgb24.ref.png create mode 100644 test/reference/world-map.ref.png create mode 100644 test/reference/world-map.traps.argb32.ref.png create mode 100644 test/reference/world-map.traps.rgb24.ref.png create mode 100644 test/reference/xcb-huge-image-shm.base.argb32.ref.png create mode 100644 test/reference/xcb-huge-image-shm.base.rgb24.ref.png create mode 100644 test/reference/xcb-huge-image-shm.ref.png create mode 100644 test/reference/xcb-huge-subimage.ref.png create mode 100644 test/reference/xcb-snapshot-assert.base.argb32.ref.png create mode 100644 test/reference/xcb-snapshot-assert.base.rgb24.ref.png create mode 100644 test/reference/xcb-snapshot-assert.ref.png create mode 100644 test/reference/xcb-stress-cache.base.argb32.ref.png create mode 100644 test/reference/xcb-stress-cache.base.rgb24.ref.png create mode 100644 test/reference/xcb-stress-cache.ref.png create mode 100644 test/reference/xcb-surface-source.base.argb32.ref.png create mode 100644 test/reference/xcb-surface-source.base.rgb24.ref.png create mode 100644 test/reference/xcb-surface-source.image16.ref.png create mode 100644 test/reference/xcb-surface-source.ps.argb32.ref.png create mode 100644 test/reference/xcb-surface-source.ps.rgb24.ref.png create mode 100644 test/reference/xcb-surface-source.ref.png create mode 100644 test/reference/xcomposite-projection.base.argb32.ref.png create mode 100644 test/reference/xcomposite-projection.base.rgb24.ref.png create mode 100644 test/reference/xcomposite-projection.image16.ref.png create mode 100644 test/reference/xcomposite-projection.mask.argb32.ref.png create mode 100644 test/reference/xcomposite-projection.mask.rgb24.ref.png create mode 100644 test/reference/xcomposite-projection.quartz.ref.png create mode 100644 test/reference/xcomposite-projection.ref.png create mode 100644 test/reference/xcomposite-projection.traps.argb32.ref.png create mode 100644 test/reference/xcomposite-projection.traps.rgb24.ref.png create mode 100644 test/reference/xlib-expose-event.base.argb32.ref.png create mode 100644 test/reference/xlib-expose-event.base.rgb24.ref.png create mode 100644 test/reference/xlib-expose-event.image16.ref.png create mode 100644 test/reference/xlib-expose-event.ps.ref.png create mode 100644 test/reference/xlib-expose-event.ref.png create mode 100644 test/reference/xlib-surface-source.base.argb32.ref.png create mode 100644 test/reference/xlib-surface-source.base.rgb24.ref.png create mode 100644 test/reference/xlib-surface-source.image16.ref.png create mode 100644 test/reference/xlib-surface-source.ps.argb32.ref.png create mode 100644 test/reference/xlib-surface-source.ps.rgb24.ref.png create mode 100644 test/reference/xlib-surface-source.ref.png create mode 100644 test/reference/xlib-surface-source.svg12.argb32.xfail.png create mode 100644 test/reference/xlib-surface-source.svg12.rgb24.xfail.png create mode 100644 test/reference/zero-alpha.base.argb32.ref.png create mode 100644 test/reference/zero-alpha.base.rgb24.ref.png create mode 100644 test/reference/zero-alpha.ref.png create mode 100644 test/reference/zero-mask.base.argb32.ref.png create mode 100644 test/reference/zero-mask.base.rgb24.ref.png create mode 100644 test/reference/zero-mask.ref.png create mode 100644 test/reflected-stroke.c create mode 100644 test/rel-path.c create mode 100644 test/rgb24-ignore-alpha.c create mode 100644 test/romedalen.jpg create mode 100644 test/romedalen.png create mode 100644 test/rotate-image-surface-paint.c create mode 100644 test/rotate-stroke-box.c create mode 100644 test/rotated-clip.c create mode 100644 test/rounded-rectangle-fill.c create mode 100644 test/rounded-rectangle-stroke.c create mode 100755 test/run-cairo-test-suite.sh create mode 100644 test/sample.c create mode 100644 test/scale-down-source-surface-paint.c create mode 100644 test/scale-offset-image.c create mode 100644 test/scale-offset-similar.c create mode 100644 test/scale-source-surface-paint.c create mode 100644 test/scaled-font-zero-matrix.c create mode 100644 test/scarab.jpg create mode 100644 test/select-font-face.c create mode 100644 test/select-font-no-show-text.c create mode 100644 test/self-copy-overlap.c create mode 100644 test/self-copy.c create mode 100644 test/self-intersecting.c create mode 100644 test/set-source.c create mode 100644 test/shape-general-convex.c create mode 100644 test/shape-sierpinski.c create mode 100644 test/show-glyphs-advance.c create mode 100644 test/show-glyphs-many.c create mode 100644 test/show-text-current-point.c create mode 100644 test/simple.c create mode 100644 test/skew-extreme.c create mode 100644 test/smask-fill.c create mode 100644 test/smask-image-mask.c create mode 100644 test/smask-mask.c create mode 100644 test/smask-paint.c create mode 100644 test/smask-stroke.c create mode 100644 test/smask-text.c create mode 100644 test/smask.c create mode 100644 test/solid-pattern-cache-stress.c create mode 100644 test/source-clip-scale.c create mode 100644 test/source-clip.c create mode 100644 test/source-surface-scale-paint.c create mode 100644 test/spline-decomposition.c create mode 100644 test/stride-12-image.c create mode 100644 test/stroke-clipped.c create mode 100644 test/stroke-ctm-caps.c create mode 100644 test/stroke-image.c create mode 100644 test/stroke-open-box.c create mode 100644 test/stroke-pattern.c create mode 100644 test/subsurface-image-repeat.c create mode 100644 test/subsurface-modify-child.c create mode 100644 test/subsurface-modify-parent.c create mode 100644 test/subsurface-outside-target.c create mode 100644 test/subsurface-pad.c create mode 100644 test/subsurface-reflect.c create mode 100644 test/subsurface-repeat.c create mode 100644 test/subsurface-scale.c create mode 100644 test/subsurface-similar-repeat.c create mode 100644 test/subsurface.c create mode 100644 test/surface-finish-twice.c create mode 100644 test/surface-pattern-big-scale-down.c create mode 100644 test/surface-pattern-operator.c create mode 100644 test/surface-pattern-scale-down-extend.c create mode 100644 test/surface-pattern-scale-down.c create mode 100644 test/surface-pattern-scale-up.c create mode 100644 test/surface-pattern.c create mode 100644 test/surface-source.c create mode 100644 test/svg-clip.c create mode 100644 test/svg-surface-source.c create mode 100644 test/svg-surface.c create mode 100644 test/svg2png.c create mode 100644 test/testtable.js create mode 100644 test/text-antialias-subpixel.c create mode 100644 test/text-antialias.c create mode 100644 test/text-cache-crash.c create mode 100644 test/text-glyph-range.c create mode 100644 test/text-pattern.c create mode 100644 test/text-rotate.c create mode 100644 test/text-transform.c create mode 100644 test/text-zero-len.c create mode 100644 test/tiger.c create mode 100644 test/tiger.inc create mode 100644 test/tighten-bounds.c create mode 100644 test/toy-font-face.c create mode 100644 test/transforms.c create mode 100644 test/translate-show-surface.c create mode 100644 test/trap-clip.c create mode 100644 test/twin-antialias-gray.c create mode 100644 test/twin-antialias-mixed.c create mode 100644 test/twin-antialias-none.c create mode 100644 test/twin-antialias-subpixel.c create mode 100644 test/twin.c create mode 100644 test/unaligned-box.c create mode 100644 test/unantialiased-shapes.c create mode 100644 test/unbounded-operator.c create mode 100644 test/unclosed-strokes.c create mode 100644 test/user-data.c create mode 100644 test/user-font-mask.c create mode 100644 test/user-font-proxy.c create mode 100644 test/user-font-rescale.c create mode 100644 test/user-font.c create mode 100644 test/white-in-noop.c create mode 100644 test/world-map.c create mode 100644 test/world-map.h create mode 100644 test/xcb-huge-image-shm.c create mode 100644 test/xcb-huge-subimage.c create mode 100644 test/xcb-snapshot-assert.c create mode 100644 test/xcb-stress-cache.c create mode 100644 test/xcb-surface-source.c create mode 100644 test/xcomposite-projection.c create mode 100644 test/xlib-expose-event.c create mode 100644 test/xlib-surface-source.c create mode 100644 test/xlib-surface.c create mode 100644 test/zero-alpha.c create mode 100644 test/zero-mask.c create mode 100644 util/COPYING create mode 100644 util/Makefile.am create mode 100644 util/Makefile.in create mode 100644 util/README create mode 100644 util/backtrace-symbols.c create mode 100755 util/cairo-api-update create mode 100644 util/cairo-fdr/Makefile.am create mode 100644 util/cairo-fdr/Makefile.in create mode 100644 util/cairo-fdr/fdr.c create mode 100644 util/cairo-gobject/Makefile.am create mode 100644 util/cairo-gobject/Makefile.in create mode 100644 util/cairo-gobject/cairo-gobject-enums.c create mode 100644 util/cairo-gobject/cairo-gobject-structs.c create mode 100644 util/cairo-gobject/cairo-gobject.h create mode 100644 util/cairo-missing/Makefile.am create mode 100644 util/cairo-missing/Makefile.in create mode 100644 util/cairo-missing/Makefile.sources create mode 100644 util/cairo-missing/cairo-missing.h create mode 100644 util/cairo-missing/getline.c create mode 100644 util/cairo-missing/strndup.c create mode 100644 util/cairo-script/COPYING create mode 100644 util/cairo-script/Makefile.am create mode 100644 util/cairo-script/Makefile.in create mode 100644 util/cairo-script/Makefile.sources create mode 100644 util/cairo-script/cairo-script-file.c create mode 100644 util/cairo-script/cairo-script-hash.c create mode 100644 util/cairo-script/cairo-script-interpreter.c create mode 100644 util/cairo-script/cairo-script-interpreter.h create mode 100644 util/cairo-script/cairo-script-objects.c create mode 100644 util/cairo-script/cairo-script-operators.c create mode 100644 util/cairo-script/cairo-script-private.h create mode 100644 util/cairo-script/cairo-script-scanner.c create mode 100644 util/cairo-script/cairo-script-stack.c create mode 100644 util/cairo-script/csi-bind.c create mode 100644 util/cairo-script/csi-exec.c create mode 100644 util/cairo-script/csi-replay.c create mode 100644 util/cairo-script/csi-trace.c create mode 100644 util/cairo-script/examples/Makefile.am create mode 100644 util/cairo-script/examples/Makefile.in create mode 100644 util/cairo-script/examples/dragon.cs create mode 100644 util/cairo-script/examples/hilbert.cs create mode 100644 util/cairo-script/examples/infinichess.cs create mode 100644 util/cairo-script/examples/interference.cs create mode 100644 util/cairo-script/examples/pythagoras-tree.cs create mode 100644 util/cairo-script/examples/sierpinski.cs create mode 100644 util/cairo-script/examples/wedgeAnnulus_crop_ybRings.cs create mode 100644 util/cairo-script/examples/world-map.cs create mode 100644 util/cairo-script/examples/zrusin.cs create mode 100644 util/cairo-sphinx/Makefile.am create mode 100644 util/cairo-sphinx/Makefile.in create mode 100644 util/cairo-sphinx/fdr.c create mode 100644 util/cairo-sphinx/sphinx.c create mode 100644 util/cairo-trace/COPYING create mode 100644 util/cairo-trace/COPYING-GPL-3 create mode 100644 util/cairo-trace/Makefile.am create mode 100644 util/cairo-trace/Makefile.in create mode 100644 util/cairo-trace/cairo-trace.in create mode 100644 util/cairo-trace/lookup-symbol.c create mode 100644 util/cairo-trace/lookup-symbol.h create mode 100644 util/cairo-trace/trace.c create mode 100755 util/cairo-view create mode 100644 util/font-view.c create mode 100644 util/malloc-stats.c create mode 100644 util/show-contour.c create mode 100644 util/show-edges.c create mode 100644 util/show-events.c create mode 100644 util/show-polygon.c create mode 100644 util/show-traps.c create mode 100644 util/trace-to-xml.c create mode 100755 util/waterfall create mode 100644 util/xml-to-trace.c create mode 100755 util/xr2cairo diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..d85696fa8 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,115 @@ +Josh Aas Memory leak fix for quartz backend +Daniel Amelang Many (magic) floating-point optimizations +Shawn T. Amundson Build fix +Olivier Andrieu PNG backend +Peter Dennis Bartok Bug fix for clipping +Dave Beckett Build fixes, Debian packaging +Kai-Uwe Behrmann SVG bug fixes +Christian Biesinger BeOS backend +Billy Biggs Pixman code merge. Optimization. Fixes for subtle rendering bugs. +Hans Breuer win32 bug fixes, build fixes, and improvements +Brian Cameron Flag bug in Sun's X server +Carlos Garcia Campos libspectre integration into the test-suite +Andrea Canciani Bugs, quartz backend improvements and type 6/7 patterns. +Damien Carbery Build fixes +Andrew Chant Adding const where needed +Steve Chaplin Bug fixes for PNG reading +Tomasz Cholewo Bug fixes +Manu Cornet SVG build fix +Frederic Crozat Fix test suite for OPD platforms (IA64 or PPC64) +Julien Danjou XCB fixes +Radek Doulík Bug report and test case +John Ehresman Build fixes for win32 +John Ellson First font/glyph extents functions +Michael Emmel DirectFB backend +Miklós Erdélyi Fix typo leading to a crash +Behdad Esfahbod Huge piles of bug fixes, improvements, and general maintenance +Gilles Espinasse Font related fixes +Larry Ewing Test case for group-clip +Brian Ewins ATSUI maintenance (first success at making it really work) +Bertram Felgenhauer Fixes for subtle arithmetic errors +Damian Frank Build system improvements for win32 +Bdale Garbee Provided essential support for cairo achitecture sessions +Jens Granseuer Fixes to generate proper compiler flags +Laxmi Harikumar Build fix +J. Ali Harlow win32 backend updates +Bryce Harrington Test cases, bug/typo fixes +Mathias Hasselmann Significant reduction of calls to malloc +Richard Henderson "slim" macros for better shared libraries +James Henstridge Build fixes related to freetype +Graydon Hoare Support for non-render X server, first real text support +Thomas Hunger Initial version of cairo_in_stroke/fill +Thomas Jaeger Extended repeat modes for X +Björn Lindqvist Performance test cases +Kristian Høgsberg PDF backend, PS backend with meta-surfaces +Amaury Jacquot Documentation review, appplication testing +Adrian Johnson PDF backend improvement +Michael Johnson Bug fix for pre-C99 compilers +Jonathon Jongsma Fix documentation typos +Øyvind Kolås OpenVG backend, Bug fixes. Better default values. +Martin Kretzschmar Arithmetic fix for 64-bit architectures +Mathieu Lacage several bug/typo fixes +Dominic Lachowicz PDF conformance fix, fix image surface to zero out contents +Alexander Larsson Profiling and performance fixes. +Sylvestre Ledru Static analysis fixes. +Tor Lillqvist win32 build fixes, build scripts +Jinghua Luo Add bitmap glyph transformation, many freetype and glitz fixes +Luke-Jr Build fix for cross-compiling +Kjartan Maraas Several fixes for sparse, lots of debug help for multi-thread bugs +Nis Martensen Bug fix for sub paths +Jordi Mas Bug fix for cairo_show_text +Nicholas Miell Fixes for linking bugs on AMD64 +Eugeniy Meshcheryakov PS/PDF font subsetting improvements +Zakharov Mikhail Build fix for HP-UX +Christopher (Monty) Montgomery Performnace fix (subimage_copy), multi-thread testing +Tim Mooney Fix test suite to compile with Solaris compiler +Jeff Muizelaar Patient, painful, pixman code merge. Many fixes for intricacies of dashing. +Yevgen Muntyan win32 build fix +Ravi Nanjundappa Static analysis fixes, test cases, skia backend update/fixes +Declan Naughton Fix documentation typos +Peter Nilsson Glitz backend +Henning Noren Fix memory leak +Geoff Norton Build fixes +Robert O'Callahan Const-correctness fixes, several new API functions for completeness (and to help mozilla) +Ian Osgood XCB backend maintenance +Benjamin Otte Refinements to cairo/perf timing, OpenGL backend fixups, random fixes +Mike Owens Bug fixes +Emmanuel Pacaud SVG backend +Keith Packard Original concept, polygon tessellation, dashing, font metrics rewrite +Stuart Parmenter Original GDI+ backend, win32 fixes +Alfred Peng Fixes for Sun compilers and for a memory leak +Christof Petig Build fixes related to freetype +Joonas Pihlaja Huge improvements to the tessellator performance +Mart Raudsepp Build fixes +David Reveman New pattern API, glitz backend +Calum Robinson Quartz backend +Pavel Roskin Several cleanups to eliminate warnings +Tim Rowley Quartz/ATSUI fixes, X server workarounds, win32 glyph path support, test case to expose gradient regression +Soeren Sandmann Lots of MMX love for pixman compositing +Uli Schlachter Some more XCB fixes +Torsten Schönfeld Build fixes +Jamey Sharp Surface/font backend virtualization, XCB backend +Jason Dorje Short Build fixes and bug fixes +Jeff Smith Fixes for intricacies of stroking code +Travis Spencer XCB backend fix +Bill Spitzak Build fix to find Xrender.h without xrender.pc, downscaling support +Zhe Su Add support for fontconfig's embeddedbitmap option +Owen Taylor Font rewrite, documentation, win32 backend +Pierre Tardy EGL support and testing, OpenVG backend +Karl Tomlinson Optimisation and obscure bug fixes (mozilla) +Alp Toker Fix several code/comment typos +Malcolm Tredinnick Documentation fixes +David Turner Optimize gradient calculations +Kalle Vahlman Allow perf reports to be compared across different platforms +Sasha Vasko Build fix to compile without xlib backend +Vladimir Vukicevic Quartz backend rewrite, win32/quartz maintenance +Jonathan Watt win32 fixes +Peter Weilbacher OS/2 backend +Dan Williams Implemnt MMX function to help OLPC +Chris Wilson Large-scale robustness improvements, (warn_unsed_result and malloc failure injection) +Carl Worth Original library, support for paths, images +Richard D. Worth Build fixes for cygwin +Kent Worsnop Fix PDF dashing bug +Dave Yeo Build fix for win32 + +(please let us know if we have missed anyone) diff --git a/BIBLIOGRAPHY b/BIBLIOGRAPHY new file mode 100644 index 000000000..90a6cef20 --- /dev/null +++ b/BIBLIOGRAPHY @@ -0,0 +1,109 @@ +Here's an effort to document some of the academic work that was +referenced during the implementation of cairo. It is presented in the +context of operations as they would be performed by either +cairo_stroke() or cairo_fill(): + +Given a Bézier path, approximate it with line segments: + + The deCasteljau algorithm + "Outillages methodes calcul", P de Casteljau, technical + report, - Andre Citroen Automobiles SA, Paris, 1959 + + That technical report might be "hard" to find, but fortunately + this algorithm will be described in any reasonable textbook on + computational geometry. Two that have been recommended by + cairo contributors are: + + "Computational Geometry, Algorithms and Applications", M. de + Berg, M. van Kreveld, M. Overmars, M. Schwarzkopf; + Springer-Verlag, ISBN: 3-540-65620-0. + + "Computational Geometry in C (Second Edition)", Joseph + O'Rourke, Cambridge University Press, ISBN 0521640105. + +Then, if stroking, construct a polygonal representation of the pen +approximating a circle (if filling skip three steps): + + "Good approximation of circles by curvature-continuous Bezier + curves", Tor Dokken and Morten Daehlen, Computer Aided + Geometric Design 8 (1990) 22-41. + +Add points to that pen based on the initial/final path faces and take +the convex hull: + + Convex hull algorithm + + [Again, see your favorite computational geometry + textbook. Should cite the name of the algorithm cairo uses + here, if it has a name.] + +Now, "convolve" the "tracing" of the pen with the tracing of the path: + + "A Kinetic Framework for Computational Geometry", Leonidas + J. Guibas, Lyle Ramshaw, and Jorge Stolfi, Proceedings of the + 24th IEEE Annual Symposium on Foundations of Computer Science + (FOCS), November 1983, 100-111. + +The result of the convolution is a polygon that must be filled. A fill +operations begins here. We use a very conventional Bentley-Ottmann +pass for computing the intersections, informed by some hints on robust +implementation courtesy of John Hobby: + + John D. Hobby, Practical Segment Intersection with Finite + Precision Output, Computation Geometry Theory and + Applications, 13(4), 1999. + + http://cm.bell-labs.com/who/hobby/93_2-27.pdf + +Hobby's primary contribution in that paper is his "tolerance square" +algorithm for robustness against edges being "bent" due to restricting +intersection coordinates to the grid available by finite-precision +arithmetic. This is one algorithm we have not implemented yet. + +We use a data-structure called Skiplists in the our implementation +of Bentley-Ottmann: + + W. Pugh, Skip Lists: a Probabilistic Alternative to Balanced Trees, + Communications of the ACM, vol. 33, no. 6, pp.668-676, 1990. + + http://citeseer.ist.psu.edu/pugh90skip.html + +The random number generator used in our skip list implementation is a +very small generator by Hars and Petruska. The generator is based on +an invertable function on Z_{2^32} with full period and is described +in + + Hars L. and Petruska G., + ``Pseudorandom Recursions: Small and Fast Pseurodandom + Number Generators for Embedded Applications'', + Hindawi Publishing Corporation + EURASIP Journal on Embedded Systems + Volume 2007, Article ID 98417, 13 pages + doi:10.1155/2007/98417 + + http://www.hindawi.com/getarticle.aspx?doi=10.1155/2007/98417&e=cta + +From the result of the intersection-finding pass, we are currently +computing a tessellation of trapezoids, (the exact manner is +undergoing some work right now with some important speedup), but we +may want to rasterize directly from those edges at some point. + +Given the set of tessellated trapezoids, we currently execute a +straightforward, (and slow), point-sampled rasterization, (and +currently with a near-pessimal regular 15x17 grid). + +We've now computed a mask which gets fed along with the source and +destination into cairo's fundamental rendering equation. The most +basic form of this equation is: + + destination = (source IN mask) OP destination + +with the restriction that no part of the destination outside the +current clip region is affected. In this equation, IN refers to the +Porter-Duff "in" operation, while OP refers to a any user-selected +Porter-Duff operator: + + T. Porter & T. Duff, Compositing Digital Images Computer + Graphics Volume 18, Number 3 July 1984 pp 253-259 + + http://keithp.com/~keithp/porterduff/p253-porter.pdf diff --git a/BUGS b/BUGS new file mode 100644 index 000000000..ef044046d --- /dev/null +++ b/BUGS @@ -0,0 +1,85 @@ +If you find a bug in cairo we would love to hear about it. We're also +trying to make cairo better, and learning about the bugs that users +encounter is an essential part of that. So we really appreciate the +extra effort users put in to providing high-quality bug reports. + +There are two acceptable ways to report cairo bugs, and you can choose +which you prefer: + +1) Bugzilla bug tracking database: + + You can use the following web interface to report new bugs, follow + up on previous bug reports, and search for existing, known + bugs. Just use the "cairo" product: + + http://bugs.freedesktop.org + + It is necessary to go through a quick account creation process, + (with email address verification), in order to be able to report + new bugs in bugzilla. We apologize for any inconvenience that might + cause, and hope it won't prevent you from reporting bugs. + +2) Cairo mailing list: + + For people who cannot stand the bugzilla interface, you can just + send an email to cairo mailing list (cairo@cairographics.org). The + mailing list only allows posting from subscribers, so use the + following page for subscription instructions: + + http://cairographics.org/lists + + Again, we apologize for any inconvenience this subscription step + might cause, but we've found it necessary to require this in order + to enjoy spam-free discussions on the list. + + If you don't actually _want_ to be a subscriber to the mailing + list, but just want to be able to send a message, the easiest thing + to do is to go through the subscription process, and then use the + preferences page to disable message delivery to your address. + +Which of the above you use to report bugs depends on your own +preferences. Some people find just typing an email message much easier +than using the web-based forms on bugzilla. Others greatly prefer the +ability to check back on a specific bug entry in bugzilla without +having to ask on the mailing list if an issue has been resolved. + +Regardless of which method you use, here are some general tips that +will help you improve the quality of your bug report, (which will help +in getting the bug fixed sooner): + +1) Check to see if the bug has been reported already. It's pretty easy + to run a search or two against the cairo product in the + http://bugs.freedesktop.org bugzilla database. Another place to + look for known bugs is the cairo ROADMAP: + + http://cairographics.org/ROADMAP + + which shows a planned schedule of releases and which bug fixes are + being planned for each release. + +2) Provide an accurate description of the bug with detailed steps for + how we can reproduce the problem. + +3) If possible provide a minimal test case demonstrating the bug. A + great test case would be a minimal self-contained function in C or + python or whatever language you are using for cairo. The function + might accept nothing more than a cairo context, (cairo_t* in C). + +4) If you feel like being particularly helpful, you could craft this + minimal test case in the form necessary for cairo's test + suite. This isn't much more work than writing a minimal + function. Just look at the cairo/test/README file and imitate the + style of existing test cases. + + If you do submit a test case, be sure to include Copyright + information, (with the standard MIT licensing blurb if you want us + to include your test in the test case). Also, including a reference + image showing the expected result will be extremely useful. + +5) Finally, the best bug report also comes attached with a patch to + cairo to fix the bug. So send this too if you have it! Otherwise, + don't worry about it and we'll try to fix cairo when we can. + +Thanks, and have fun with cairo! + +-Carl diff --git a/CODING_STYLE b/CODING_STYLE new file mode 100644 index 000000000..95ceac04d --- /dev/null +++ b/CODING_STYLE @@ -0,0 +1,291 @@ +Cairo coding style. + +This document is intended to be a short description of the preferred +coding style for the cairo source code. Good style requires good +taste, which means this can't all be reduced to automated rules, and +there are exceptions. + +We want the code to be easy to understand and maintain, and consistent +style plays an important part in that, even if some of the specific +details seem trivial. If nothing else, this document gives a place to +put consistent answers for issues that would otherwise be arbitrary. + +Most of the guidelines here are demonstrated by examples, (which means +this document is quicker to read than it might appear given its +length). Most of the examples are positive examples that you should +imitate. The few negative examples are clearly marked with a comment +of /* Yuck! */. Please don't submit code to cairo that looks like any +of these. + +Indentation +----------- +Each new level is indented 4 more spaces than the previous level: + + if (condition) + do_something (); + +This may be achieved with space characters or a combination of tab +characters and space characters. It may not be achieved with tab +characters exclusively (see below). + +Tab characters +-------------- +The tab character must always be interpreted according to its +traditional meaning: + + Advance to the next column which is a multiple of 8. + +With this definition, even levels of indentation can be achieved with +a sequence of tab characters, while odd levels of indentation may +begin with a sequence of tab character but must end with 4 space +characters. + +Some programmers have been misled by certain text editors into +thinking that 4-space indentation can be achieved with tab characters +exclusively by changing the meaning of tab character to be "advance to +the next column which is a multiple of 4". Code formatted in this way, +making an assumption of a fictitious 4-character-tab will not be +accepted into cairo. + +The rationale here is that tabs are used in the code for lining things +up other than indentation, (see the Whitespace section below), and +changing the interpretation of tab from its traditional meaning will +break this alignment. + +Braces +------ +Most of the code in cairo uses bracing in the style of K&R: + + if (condition) { + do_this (); + do_that (); + } else { + do_the_other (); + } + +but some of the code uses an alternate style: + + if (condition) + { + do_this (); + do_that (); + } + else + { + do_the_other (); + } + +and that seems just fine. We won't lay down any strict rule on this +point, (though there should be some local consistency). If you came +here hoping to find some guidance, then use the first form above. + +If all of the substatements of an if statement are single statements, +the optional braces should not usually appear: + + if (condition) + do_this (); + else + do_that (); + +But the braces are mandatory when mixing single statement and compound +statements in the various clauses. For example, do not do this: + + if (condition) { + do_this (); + do_that (); + } else /* Yuck! */ + do_the_other (); + +And of course, there are exceptions for when the code just looks +better with the braces: + + if (condition) { + /* Note that we have to be careful here. */ + do_something_dangerous (with_care); + } + + if (condition && + other_condition && + yet_another) + { + do_something (); + } + +And note that this last example also shows a situation in which the +opening brace really needs to be on its own line. The following looks awful: + + if (condition && + other_condition && + yet_another) { /* Yuck! */ + do_something (); + } + +As we said above, legible code that is easy to understand and maintain +is the goal, not adherence to strict rules. + +Whitespace +---------- +Separate logically distinct chunks with a single newline. This +obviously applies between functions, but also applies within a +function or block and can even be used to good effect within a +structure definition: + + struct _cairo_gstate { + cairo_operator_t op; + + double tolerance; + + /* stroke style */ + double line_width; + cairo_line_cap_t line_cap; + cairo_line_join_t line_join; + double miter_limit; + + cairo_fill_rule_t fill_rule; + + double *dash; + int num_dashes; + double dash_offset; + + ... + } + +Use a single space before a left parenthesis, except where the +standard will not allow it, (eg. when defining a parameterized macro). + +Don't eliminate newlines just because things would still fit on one +line. This breaks the expected visual structure of the code making it +much harder to read and understand: + + if (condition) foo (); else bar (); /* Yuck! */ + +Do eliminate trailing whitespace (space or tab characters) on any +line. Also, avoid putting initial or final blank lines into any file, +and never use multiple blank lines instead of a single blank line. + +Do enable the default git pre-commit hook that detect trailing +whitespace for you and help you to avoid corrupting cairo's tree with +it. Do that as follows: + + chmod a+x .git/hooks/pre-commit + +You might also find the git-stripspace utility helpful which acts as a +filter to remove trailing whitespace as well as initial, final, and +duplicate blank lines. + +As a special case of the bracing and whitespace guidelines, function +definitions should always take the following form: + + void + my_function (argument) + { + do_my_things (); + } + +And function prototypes should similarly have the return type (and +associated specifiers and qualifiers) on a line above the function, so +that the function name is flush left. + +Break up long lines (> ~80 characters) and use whitespace to align +things nicely. For example the arguments in a long list to a function +call should all be aligned with each other: + + align_function_arguments (argument_the_first, + argument_the_second, + argument_the_third); + +And as a special rule, in a function prototype, (as well as in the +definition), whitespace should be inserted between the parameter types +and names so that the names are aligned: + + void + align_parameter_names_in_prototypes (const char *char_star_arg, + int int_arg, + double *double_star_arg, + double double_arg); + +Note that parameters with a * prefix are aligned one character to the +left so that the actual names are aligned. + +Managing nested blocks +---------------------- +Long blocks that are deeply nested make the code very hard to +read. Fortunately such blocks often indicate logically distinct chunks +of functionality that are begging to be split into their own +functions. Please listen to the blocks when they beg. + +In other cases, gratuitous nesting comes about because the primary +functionality gets buried in a nested block rather than living at the +primary level where it belongs. Consider the following: + + foo = malloc (sizeof (foo_t)); + if (foo) { /* Yuck! */ + ... + /* lots of code to initialize foo */ + ... + return SUCCESS; + } + return FAILURE; + +This kind of gratuitous nesting can be avoided by following a pattern +of handling exceptional cases early and returning: + + foo = malloc (sizeof (foo_t)); + if (foo == NULL) + return FAILURE; + + ... + /* lots of code to initialize foo */ + ... + return SUCCESS; + +The return statement is often the best thing to use in a pattern like +this. If it's not available due to additional nesting above which +require some cleanup after the current block, then consider splitting +the current block into a new function before using goto. + +Memory allocation +----------------- + +Because much of cairo's data consists of dynamically allocated arrays, +it's very easy to introduce integer overflow issues whenever malloc() +is called. Use the _cairo_malloc2(), _cairo_malloc3(), and +_cairo_malloc2_add1 macros to avoid these cases; these macros check +for overflow and will return NULL in that case. + + malloc (n * size) => _cairo_malloc_ab (n, size) + e.g. malloc (num_elts * sizeof(some_type)) => + _cairo_malloc2 (num_elts, sizeof(some_type)) + + malloc (a * b * size) => _cairo_malloc_abc (a, b, size) + e.g. malloc (width * height * 4) => + _cairo_malloc3 (width, height, 4) + + malloc (n * size + k) => _cairo_malloc_ab_plus_c (n, size, k) + e.g. malloc (num * sizeof(entry) + sizeof(header)) => + _cairo_malloc2k (num, sizeof(entry), sizeof(header)) + +In general, be wary of performing any arithmetic operations in an +argument to malloc. You should explicitly check for integer overflow +yourself in any more complex situations. + +Mode lines +---------- + +So given the rules above, what is the best way to simplify one's life as +a code monkey? Get your editor to do most of the tedious work of +beautifying your code! + +As a reward for reading this far, here are some mode lines for the more +popular editors: +/* + * vim:sw=4:sts=4:ts=8:tw=78:fo=tcroq:cindent:cino=\:0,(0 + * vim:isk=a-z,A-Z,48-57,_,.,-,> + */ + + +TODO +---- + +Write rules for common editors to use this style. Also cleanup/unify +the modelines in the source files. diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..f54969f1c --- /dev/null +++ b/COPYING @@ -0,0 +1,33 @@ +Cairo is free software. + +Every source file in the implementation[*] of cairo is available to be +redistributed and/or modified under the terms of either the GNU Lesser +General Public License (LGPL) version 2.1 or the Mozilla Public +License (MPL) version 1.1. Some files are available under more +liberal terms, but we believe that in all cases, each file may be used +under either the LGPL or the MPL. + +See the following files in this directory for the precise terms and +conditions of either license: + + COPYING-LGPL-2.1 + COPYING-MPL-1.1 + +Please see each file in the implementation for copyright and licensing +information, (in the opening comment of each file). + +[*] The implementation of cairo is contained entirely within the "src" +directory of the cairo source distribution. There are other components +of the cairo source distribution (such as the "test", "util", and "perf") +that are auxiliary to the library itself. None of the source code in these +directories contributes to a build of the cairo library itself, (libcairo.so +or cairo.dll or similar). + +These auxiliary components are also free software, but may be under +different license terms than cairo itself. For example, most of the +test cases in the perf and test directories are made available under +an MIT license to simplify any use of this code for reference purposes +in using cairo itself. Other files might be available under the GNU +General Public License (GPL), for example. Again, please see the COPYING +file under each directory and the opening comment of each file for copyright +and licensing information. diff --git a/COPYING-LGPL-2.1 b/COPYING-LGPL-2.1 new file mode 100644 index 000000000..f1ed6182c --- /dev/null +++ b/COPYING-LGPL-2.1 @@ -0,0 +1,510 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations +below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must +be allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding those +countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/COPYING-MPL-1.1 b/COPYING-MPL-1.1 new file mode 100644 index 000000000..7714141d1 --- /dev/null +++ b/COPYING-MPL-1.1 @@ -0,0 +1,470 @@ + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000..ad11e9250 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,17933 @@ +# Generated by configure. Do not edit. + +commit 93422b3cb5e0ef8104b8194c8873124ce2f5ea2d +Author: Bryce Harrington +Date: Tue Mar 10 18:42:50 2015 -0700 + + version: bump for cairo-1.14.2 release + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 061d54745a0c20b5da08ec4ff8b958d20fd6a143 +Author: Bryce Harrington +Date: Tue Mar 10 16:24:37 2015 -0700 + + KNOWN_ISSUES: Restore known issues file as a stub + + Apparently distcheck requires this file be present. + + KNOWN_ISSUES | 3 +++ + 1 file changed, 3 insertions(+) + +commit fb41ed34415dd58fe57490f93c6151a4bec483f1 +Author: Bryce Harrington +Date: Tue Mar 10 13:08:29 2015 -0700 + + NEWS: Note about the OS X support + + NEWS | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 845d2420e0cbfd338bab63764c4fe3c4273ab47e +Author: Andrea Canciani +Date: Tue Mar 10 12:10:35 2015 +0100 + + Update README with new minimum MacOSX requirements + + Since 70cc8f250b5669e757b4f044571ba0f71e3dea9e the quartz backend is + using some APIs that are not available on MacOSX 10.4 directly + (i.e. without detecting their availability through dynamic linking). + This means that the quartz backend does not work anymore on MacOSX + 10.4 and that the 10.5 SDK (or newer) is needed to build. + + README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 86fad78fcd2bf987249890aea4eabcce02a58f45 +Author: Bryce Harrington +Date: Tue Mar 10 12:15:40 2015 -0700 + + On MacOSX, the sed utility errors out when parsing non-UTF8 + files. Because of this, the generated cairo-test-constructor only + contained a few tests and the test suite was thus incomplete. + + Original patch by Andrea Canciani + + test/composite-integer-translate-over.c | 2 +- + test/degenerate-dash.c | 2 +- + test/degenerate-path.c | 2 +- + test/long-dashed-lines.c | 2 +- + test/reflected-stroke.c | 2 +- + test/user-font-rescale.c | 4 ++-- + 6 files changed, 7 insertions(+), 7 deletions(-) + +commit f8407332214ba87bbd652f09ce3618a973f27878 +Author: Andrea Canciani +Date: Tue Mar 10 12:10:34 2015 +0100 + + Update KNOWN_ISSUES documentation + + The bug mentioned in KNOWN_ISSUES was fixed in + 2b3d8de11a536d668084ea6d2bf295da1d1cdc11, but the documentation was + not updated. Moreover, the header of KNOWN_ISSUES was 1.10-specific. + + Reviewed-by: Bryce Harrington + + KNOWN_ISSUES | 10 ---------- + 1 file changed, 10 deletions(-) + +commit c45e323555356da0b509c3bb380ccb08b4dea9db +Author: Bryce Harrington +Date: Tue Mar 10 04:45:18 2015 -0700 + + NEWS: Finish filling in changes + + NEWS | 27 +++++++++++++++++++++++++-- + 1 file changed, 25 insertions(+), 2 deletions(-) + +commit 79dbe1bad8089aa3e0b9a9a63443a74cd9e22f32 +Author: Bryce Harrington +Date: Sat Mar 7 00:30:40 2015 -0800 + + NEWS: Update for changes through Nov 2014 + + NEWS | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 47 insertions(+) + +commit 581f8137052db60d072ee5a4cefdf7292cddab05 +Author: Bryce Harrington +Date: Fri Mar 6 23:54:49 2015 -0800 + + HACKING: Add link to git tutorial and wordsmith a bit + + HACKING | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit c0458b456007f718747be7fd690e674df5026059 +Author: Bryce Harrington +Date: Fri Mar 6 23:31:25 2015 -0800 + + csi-trace: Add --version and --help args to utility + + util/cairo-script/csi-trace.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 3a7d411539975728f90b7d0bb55e3bee2e8600bb +Author: Bryce Harrington +Date: Fri Mar 6 22:26:22 2015 -0800 + + Revert "xlib: Remove queued event from _XReadEvents" + + This reverts commit e7fc8f405beeeb1048f69fe22923170a137b805e. + + src/cairo-xlib-surface-shm.c | 5 ----- + 1 file changed, 5 deletions(-) + +commit c3605bd3adcae1f12731230a1ea599d15e3c8cad +Author: Bryce Harrington +Date: Fri Mar 6 23:29:53 2015 -0800 + + git-ignore: Add build's test-driver + + build/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 246d5c1d477cc246788f5695a08c4c414a36fbf5 +Author: Bryce Harrington +Date: Fri Mar 6 19:14:58 2015 -0800 + + doc: Drop extraneous para's + + These may have been required in the past, but just trip up distcheck + today. The generated docs still look fine. + + src/cairo-version.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit e4f6d07efbf37513b1f2341091839d66b94e3355 +Author: Bryce Harrington +Date: Fri Mar 6 18:34:07 2015 -0800 + + gitignore: logs, manuals + + .gitignore | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e7fc8f405beeeb1048f69fe22923170a137b805e +Author: Henry (Yu) Song +Date: Thu Mar 5 00:20:42 2015 +0000 + + xlib: Remove queued event from _XReadEvents + + Following patch fixes a memory leak in xlib surface. + + Reviewed-by: Bryce Harrington + + src/cairo-xlib-surface-shm.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 4e680ff4bb3a5089b2ec40a96f8e292aa3cfe5f4 +Author: Michael Haubenwallner +Date: Fri Feb 27 14:25:41 2015 +0100 + + headers: fix include order for AIX, bug#89354 + + also for cairo-xcb-private.h + + src/cairo-xcb-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 733de40e876f41ae390ae06fdf9789a48651a4e9 +Author: Michael Haubenwallner +Date: Fri Feb 27 11:22:04 2015 +0100 + + headers: fix include order for AIX, bug#89354 + + src/cairo-ft-private.h | 2 +- + src/cairo-xlib-private.h | 2 +- + src/cairo-xlib-surface-private.h | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 94d30d7160bc1dfabac22ffb9cc810ceb9a35ead +Author: Michael Haubenwallner +Date: Thu Feb 26 15:11:05 2015 +0100 + + perf: fix include order for AIX, bug#89354 + + perf/cairo-perf-report.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 15c427bc771e8a7018718eca3855f7de39438457 +Author: Michael Haubenwallner +Date: Thu Feb 26 16:00:01 2015 +0100 + + perf/micro: fix include order for AIX, bug#89354 + + perf/micro/disjoint.c | 2 +- + perf/micro/hatching.c | 2 +- + perf/micro/pattern_create_radial.c | 2 +- + perf/micro/spiral.c | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 0916d580db94bccbf8d31cc58a8198a0c1f8b309 +Author: Michael Haubenwallner +Date: Thu Feb 26 15:03:43 2015 +0100 + + test: fix include order for AIX, bug#89354 + + test/clip-nesting.c | 2 +- + test/clip-operator.c | 2 +- + test/close-path.c | 2 +- + test/composite-integer-translate-over-repeat.c | 2 +- + test/composite-integer-translate-over.c | 2 +- + test/composite-integer-translate-source.c | 2 +- + test/copy-path.c | 2 +- + test/extend-pad-border.c | 2 +- + test/extend-pad-similar.c | 2 +- + test/extend-pad.c | 2 +- + test/extend-reflect.c | 2 +- + test/extended-blend.c | 2 +- + test/mask.c | 2 +- + test/multi-page.c | 4 ++-- + test/operator-clear.c | 2 +- + test/operator-source.c | 2 +- + test/path-append.c | 2 +- + test/pattern-getters.c | 2 +- + test/pdf-features.c | 4 ++-- + test/pixman-downscale.c | 4 ++-- + test/pixman-rotate.c | 4 ++-- + test/ps-features.c | 4 ++-- + test/record-extend.c | 2 +- + test/record-mesh.c | 2 +- + test/select-font-no-show-text.c | 2 +- + test/self-copy.c | 2 +- + test/source-clip-scale.c | 2 +- + test/source-clip.c | 2 +- + test/surface-pattern-scale-down.c | 2 +- + test/surface-pattern-scale-up.c | 2 +- + test/surface-pattern.c | 2 +- + test/svg-clip.c | 3 ++- + test/svg-surface.c | 3 ++- + test/trap-clip.c | 2 +- + test/unbounded-operator.c | 2 +- + test/user-font-mask.c | 4 ++-- + test/user-font-proxy.c | 4 ++-- + test/user-font.c | 4 ++-- + test/xcb-snapshot-assert.c | 2 +- + test/xlib-expose-event.c | 2 +- + test/xlib-surface.c | 3 ++- + 41 files changed, 52 insertions(+), 49 deletions(-) + +commit e9a615a2f94697c64a6702c1e3b24c59b156cc71 +Author: Michael Haubenwallner +Date: Thu Feb 26 16:24:55 2015 +0100 + + define _GETDELIM for getline() on AIX + + On AIX 6.1, getdelim() and getline() are not provided by default, + causing a gcc compilation error. With _GETDELIM defined, AIX's stdio.h + header provides definitions for these routines. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=89356 + Reviewed-by: Bryce Harrington + + perf/cairo-perf-report.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit f72bd7c7574fc8fdc1f495f3a50111329851edc5 +Author: Michael Haubenwallner +Date: Thu Feb 26 15:23:01 2015 +0100 + + skip MAP_NORESERVE when unsupported + + Fixes a compilation on AIX ('MAP_NORESERVE' undeclared) + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=89340 + Signed-off-by: Bryce Harrington + + test/cairo-test-trace.c | 4 ++++ + util/cairo-sphinx/sphinx.c | 4 ++++ + 2 files changed, 8 insertions(+) + +commit ac75ab9f30ef10ee5973d42223f4b51acca93333 +Author: Michael Haubenwallner +Date: Thu Feb 26 14:18:30 2015 +0100 + + fix conflicting types for 'sync' on AIX, bug#89338 + + src/cairo-surface-observer.c | 12 ++++++------ + src/cairo-xlib-surface-shm.c | 4 ++-- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit 70cc8f250b5669e757b4f044571ba0f71e3dea9e +Author: Andrea Canciani +Date: Tue Dec 9 16:13:00 2014 +0100 + + quartz: Remove call to obsolete CGFontGetGlyphPath + + CGFontGetGlyphPath was not public and is not available anymore on + modern OSX/iOS systems. The same functionality is available through + the CoreText API since OSX 10.5. + + Based on a patch by Simon Cozens. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=84324 + + src/cairo-quartz-font.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 91f128bf7a1233a7fc2e164f95279987e32a3532 +Author: Massimo Valentini +Date: Wed Sep 11 18:10:38 2013 +0200 + + win32: Fix crash from win32 surface's image size too small + + Beginning in 1.12, a crash can occur when the win32 surface's image size + does not cover the entire surface (e.g. due to clipping regions). + + This patch enlarges the fallback surface created of the amount + necessary not to write past the end of the DIB. It assumes that + Clip applied to an HDC are clamped to (0,0,width,height) of the HDC. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=53121 + Reviewed-by: Bryce Harrington + + src/win32/cairo-win32-display-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit cca8b1960b0091c53235d9dc4cde8a33010c5bbf +Author: Emanuele Aina +Date: Tue Dec 16 14:58:55 2014 +0100 + + cairo-trace: Fix duplicated surface push on similar-image + + The current code results in trace lines with the source surface being + pushed on the stack two times instead of one: + + s1 s1 //ARGB32 48 48 similar-image % s2 + + Instead of: + + s1 //ARGB32 48 48 similar-image % s2 + + This greatly confuses later commands when the script was replayed, + causing traces for trivial GTK3 programs to be unplayable, usually + yielding the following error: + "invalid value (typically too big) for the size of the input (surface, pattern, etc.)" + + Drop the duplicated entry from the trace line printed by the + cairo_surface_create_similar_image() override. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=73580 + Signed-off-by: Emanuele Aina + + util/cairo-trace/trace.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit ebd23accc8722db838f6db12f7489f16fe6016ce +Author: Uli Schlachter +Date: Sat Dec 6 17:04:07 2014 +0100 + + xlib-xcb: Don't be lazy and use the real xcb_screen_t + + Signed-off-by: Uli Schlachter + + src/cairo-xlib-xcb-surface.c | 33 ++++++++++++++++++--------------- + 1 file changed, 18 insertions(+), 15 deletions(-) + +commit b47209a03feeed2172f35a6d79ba1176fedd5e17 +Author: Uli Schlachter +Date: Sat Dec 6 16:04:46 2014 +0100 + + xcb: Query the display's subpixel order via RENDER + + With commit e691d242, the xcb backend started parsing the resources, just like + cairo-xlib does. One behavior from cairo-xlib was missing: If no Xft.rgba + property was specified, cairo-xlib defaults to the screen's subpixel order. + This commit brings that last bit of functionality to cairo-xcb (but currently + disabled due to commit e0c0a673). + + This commits adds a new array to cairo_xcb_connection_t that contains the + subpixel order for each screen. There is also a new member in cairo_xcb_screen_t + which contains the subpixel order of that screen and which is initialized from + the array when the screen is constructed. With this in place, the + resource-parsing code can just pick the subpixel order from the screen if + needed. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-connection.c | 19 +++++++++++++++++++ + src/cairo-xcb-private.h | 4 +++- + src/cairo-xcb-resources.c | 33 +++++---------------------------- + src/cairo-xcb-screen.c | 16 ++++++++++++++++ + 4 files changed, 43 insertions(+), 29 deletions(-) + +commit 02e4efc961be40d266d4df0acaf3271219529017 +Author: Andrea Canciani +Date: Mon Dec 22 12:49:00 2014 +0100 + + font: Actually perform destruction of fonts + + Commit 337ab1f8d9e29086bfb4001508b28835b41c6390 introduced delayed + font destruction to overcome a race, but prevented the correct cleanup + of the font cache. + + This caused fonts to stay in the cache and caused a crash in the + api-special-cases (when running the test suite with -f). + + Fixes api-special-cases, + https://bugs.freedesktop.org/show_bug.cgi?id=87567 + + src/cairo-font-face.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 028d286e611d46755bb3d1e9932805de2ec35765 +Author: Chris Wilson +Date: Wed Dec 31 10:54:43 2014 +0000 + + xlib: Bump reference count for recording surface replays + + The snapshot takes a reference to the target recording surface in order + to enable it for use by multiple treads. In order to balance this, the + other two sources of recording surface must also take a reference and + for us to release that reference after the replay. + + Otherwise, we end up with a memory leak: + + ==1== 1,392 bytes in 3 blocks are definitely lost in loss record 1 of 7 + ==1== at 0x4A06BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) + ==1== by 0x4C7042D: _cairo_recording_surface_snapshot (cairo/src/cairo-recording-surface.c:1427) + ==1== by 0x4C842BE: _cairo_surface_snapshot_copy_on_write (cairo/src/cairo-surface-snapshot.c:189) + ==1== by 0x4C7E7E0: _cairo_surface_detach_snapshot (cairo/src/cairo-surface.c:348) + ==1== by 0x4C7E55B: _cairo_surface_detach_snapshots (cairo/src/cairo-surface.c:333) + ==1== by 0x4C7E55B: _cairo_surface_flush (cairo/src/cairo-surface.c:1545) + ==1== by 0x4C7E6CC: _cairo_surface_finish_snapshots (cairo/src/cairo-surface.c:1017) + ==1== by 0x4C7E6CC: cairo_surface_destroy (cairo/src/cairo-surface.c:961) + ==1== by 0x4C625A7: cairo_pattern_destroy (cairo/src/cairo-pattern.c:1131) + ==1== by 0x4C3FAC6: _cairo_gstate_fini (cairo/src/cairo-gstate.c:225) + ==1== by 0x4C3C68C: _cairo_default_context_fini (cairo/src/cairo-default-context.c:75) + ==1== by 0x4C3C708: _cairo_default_context_destroy (cairo/src/cairo-default-context.c:93) + ==1== by 0x43E576: record_get (cairo/test/record-extend.c:158) + ==1== by 0x43E576: record_replay (cairo/test/record-extend.c:173) + ==1== by 0x40E22D: cairo_test_for_target (cairo/test/cairo-test.c:929) + ==1== by 0x40E22D: _cairo_test_context_run_for_target (cairo/test/cairo-test.c:1532) + ==1== by 0x40B6C0: _cairo_test_runner_draw (cairo/test/cairo-test-runner.c:255) + ==1== by 0x40B6C0: main (cairo/test/cairo-test-runner.c:937) + + Reported-by: Massimo Valentini + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=87898 + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 4a225fca5f121c31ddaa0af80a13bf95a7f21a5b +Author: Andrea Canciani +Date: Thu Nov 20 17:22:30 2014 +0100 + + test: Free test list + + When running the cairo-test-suite, valgrind reports each of the + registered test as a leak, because they are _list_prepend()'ed, but + the tests list is never _list_free()'d. + + Fixes the following valgrind error: + + malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + cairo_boilerplate_xmalloc (cairo-boilerplate-system.c:47) + cairo_test_register (cairo-test-runner.c:131) + _cairo_test_runner_register_tests (cairo-test-constructors.c:1112) + main (cairo-test-runner.c:714) + + Signed-off-by: Bryce Harrington + + test/cairo-test-runner.c | 1 + + 1 file changed, 1 insertion(+) + +commit 9806f437b42056124314976f35a2d32cefa508a8 +Author: Andrea Canciani +Date: Thu Nov 20 17:22:31 2014 +0100 + + test: Release owned pattern + + The pattern created by cairo_pattern_create_rgb() is owned by the + caller, hence it needs to be released. + + Fixes the following valgrind error: + + malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + _cairo_pattern_create_solid (cairo-pattern.c:605) + _cairo_pattern_create_in_error (cairo-pattern.c:628) + cairo_pop_group (cairo.c:552) + test_cairo_push_group (api-special-cases.c:157) + preamble (api-special-cases.c:1766) + main (cairo-test-runner.c:228) + + Signed-off-by: Bryce Harrington + + test/api-special-cases.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 40201f4b1ab52c85922b2b7ae05dd862159a1aa0 +Author: Uli Schlachter +Date: Fri Dec 5 14:43:26 2014 +0100 + + tor-scan-converter: Correctly align 64bit types + + On 32bit SPARC the scan converter was causing a SIGBUS due to an unaligned + memory access while accessing an int64_t. This memory accessing was to struct + quorem's rem member. + + This crash occurred because the tor-scan-converter contains its own + implementation of a memory pool. This implementation only guarantees an + alignment of sizeof(void *), which is less than what a 64 bit type requires on + 32bit platforms. This 4 byte alignment is guaranteed, because struct _pool_chunk + (which is the struct that is used for managing free space) contains elements of + that size and so the size of that struct is a multiple of this size as well. + + This problem was introduced with commit 03c3d4b7c15. + + To fix this problem, this commit introduces a int64_t member to struct + _pool_chunk that marks the beginning of the free data space. Thanks to this, the + compiler ensures proper alignment and sizeof(struct _pool_chunk) becomes a + multiple of 8. + + However, previously the end of the struct marked the beginning of the data and + sizeof() was used for correctly calculating offsets to the data section. So, + just adding such a member would work, but would also waste some memory. To avoid + this, this commit also changes the rest of the pool implementation to + accommodate. + + Reported-by: Nicolas Setton + Signed-off-by: Uli Schlachter + Reviewed-by: Bryce Harrington + + src/cairo-tor-scan-converter.c | 38 +++++++++++++++++++++++--------------- + 1 file changed, 23 insertions(+), 15 deletions(-) + +commit 5c82d91a5e15d29b1489dcb413b24ee7fdf59934 +Author: Bryce Harrington +Date: Wed Dec 3 19:28:15 2014 -0800 + + image: Fix crash in _fill_xrgb32_lerp_opaque_spans + + If a span length is negative don't go out of bounds processing the fill + data. + + Patch thanks to Ilya Sakhnenko on mailing list. + + Signed-off-by: Bryce Harrington + + src/cairo-image-compositor.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 56da7adc3c85be0325481ecd23746dc49e60d239 +Author: Hans Breuer +Date: Thu Oct 16 20:51:07 2014 +0200 + + win32: Fix compilation of 'cairo-path-stroke-traps.c' with MSVC8 + + "The issue here is that Visual Studio 2005+ is quite strict on type + conversions (so it wants code to be clear enough on conversions)." + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=84908 + + src/cairo-path-stroke-traps.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 2c5af590ddbb08e0a46b7e37c5f0230b1805cd37 +Author: Bryce Harrington +Date: Thu Nov 20 12:19:47 2014 -0800 + + Refactor ARRAY_LENGTH macro definitions in test code + + boilerplate/cairo-boilerplate-pdf.c | 2 -- + boilerplate/cairo-boilerplate-private.h | 2 +- + boilerplate/cairo-boilerplate.h | 4 ++++ + perf/cairo-perf.h | 4 ---- + test/any2ppm.c | 2 +- + test/cairo-test.c | 4 ---- + test/cairo-test.h | 4 ---- + 7 files changed, 6 insertions(+), 16 deletions(-) + +commit 7edc5a8844b96862b866901568eb83fa56f4755b +Author: Bryce Harrington +Date: Fri Nov 14 18:10:16 2014 -0800 + + test: Use ARRAY_LENGTH macro + + test/bug-spline.c | 3 +-- + test/caps-tails-curve.c | 2 +- + test/tiger.c | 2 +- + 3 files changed, 3 insertions(+), 4 deletions(-) + +commit ae608035c7b7133826a608d45e067c3875a1aceb +Author: Adrian Johnson +Date: Thu Nov 20 10:16:06 2014 +1030 + + pdf-operators: fix bug with RTL text + + bug 86461 + + src/cairo-pdf-operators.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 121f384c0e231c9c5d9c937b216d342bfc7810a6 +Author: Ravi Nanjundappa +Date: Tue Nov 11 15:07:57 2014 +0530 + + Fix one more warning from check-doc-syntax.sh + + $ ./check-doc-syntax.sh + Checking documentation for incorrect syntax + ./cairo-pattern.c (3342): ERROR: Will invalid doc id (should be 'cairo_...:') + + The proposed changes fixes the warning about the documentation style used in cairo. + + Signed-off-by: Ravi Nanjundappa + + src/cairo-pattern.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a03f2ff72054c9530f98738aac729354a3f56102 +Author: Adam Jackson +Date: Fri Oct 31 13:21:15 2014 -0400 + + xcb: Don't crash when swapping a 0-sized glyph + + malloc(0) needn't return NULL, and on glibc, doesn't. Then we encounter + a loop of the form do { ... } while (--c), which doesn't do quite what + you were hoping for when c is initially 0. + + Since there's nothing to swap in this case, just bomb out. + + Signed-off-by: Adam Jackson + + src/cairo-xcb-surface-render.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 3cf862f6d973755cd9824c2224fbe0a623c47ff1 +Author: Adam Jackson +Date: Fri Oct 31 13:21:14 2014 -0400 + + xlib: Don't crash when swapping a 0-sized glyph + + malloc(0) needn't return NULL, and on glibc, doesn't. Then we encounter + a loop of the form do { ... } while (--c), which doesn't do quite what + you were hoping for when c is initially 0. + + Since there's nothing to swap in this case, just bomb out. + + Signed-off-by: Adam Jackson + + src/cairo-xlib-render-compositor.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit adbeb3d53c6c6e8ddcc63988200da4c5c9627717 +Author: Adrian Johnson +Date: Fri Oct 31 22:43:32 2014 +1030 + + Improve performance of cpu_to_be32 and be32_to_cpu + + By switching to the more common form, gcc and clang emit a single + bswap instruction and truetype subsetting of large fonts runs about + 15% faster. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4b78424ac82588bcb9b855d5b6d5872050d33f9 +Author: Adrian Johnson +Date: Fri Oct 31 19:06:42 2014 +1030 + + pdf-operators: only wrap text strings for PS output + + since the PS Document Structing Conventions impose a 255 character + line limit. PDF does not require wrapping. + + pdf-operators is designed to emit the same output for PS and PDF. + Unfortunately some PDF interpreters don't like strings split with + '\\\n' and some PS interpreters don't like strings split with ')('. + So we are forced to make pdf-operators handling string wrapping + differently for PDF and PS. + + Bug 85662 + + src/cairo-pdf-operators-private.h | 4 +++- + src/cairo-pdf-operators.c | 16 ++++++++++------ + src/cairo-pdf-surface.c | 9 ++++++--- + src/cairo-ps-surface.c | 9 ++++++--- + src/cairo-type3-glyph-surface-private.h | 3 ++- + src/cairo-type3-glyph-surface.c | 6 ++++-- + 6 files changed, 31 insertions(+), 16 deletions(-) + +commit b4e218c3e8402e149115a59406796b751118237f +Author: Bryce Harrington +Date: Tue Oct 21 15:26:34 2014 -0700 + + Drop the target-specific huge-radial.pdf.*.ref.png images + + These two images are mis-rendered (clearly evident from visual + inspection). By removing them, the test will fall back to the more + general format-specific images, huge-radial.argb32.ref.png and + huge-radial.rgb24.ref.png. + + Note that the huge-radial.pdf tests still fail to pass, but the pdiff + looks more sensible. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66218 + + Signed-off-by: Bryce Harrington + + test/reference/huge-radial.pdf.argb32.ref.png | Bin 177382 -> 0 bytes + test/reference/huge-radial.pdf.rgb24.ref.png | Bin 225358 -> 0 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit f7d0f80d2d880bea6b2fdbff579b21100355c1be +Author: Bryce Harrington +Date: Wed Oct 29 15:27:19 2014 -0700 + + RELEASING: Be explicit as to which tag is pushed + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit caa4c9fdeb3aecd9a4288114e75d24ec931cd01b +Author: Ravi Nanjundappa +Date: Mon Oct 27 10:54:13 2014 +0530 + + Fix warnings from check-doc-syntax.sh + + $ ./check-doc-syntax.sh + Checking documentation for incorrect syntax + ./cairo-pattern.c (3346): ERROR: Will bad line: ' */' + ./cairo-pattern.c (3346): ERROR: Will documentation comment not closed with **/ + ./cairo-pattern.c (3422): ERROR: _cairo_pattern_sampled_area invalid doc id (should be 'cairo_...:') + + The warnings are about the documentation style used in cairo + + Signed-off-by: Ravi Nanjundappa + + src/cairo-pattern.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f9b65ae1fc91bc558a01c2ad7be5a121c6f10818 +Author: Adrian Johnson +Date: Tue Oct 21 22:35:12 2014 +1030 + + build: fix regression on mingw + + 7cfebce1 removed the filename extension for executables. + + Patch from http://sourceforge.net/p/inkscape/mailman/message/32939144/ + + Bug 85120 + + build/aclocal.float.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2de69581c28bf115852037ca41eba13cb7335976 +Author: Massimo Valentini +Date: Sun Oct 19 09:19:10 2014 +0200 + + tor-scan-converter: can't do_fullrow when intersection in row + 0.5subrow + + the active edges list must be left sorted at the next possible use + and since full_row does not deal with intersections it is not usable + when there is an intersection in the top half of the next row first + subrow + + Reported-and-tested-by: Matthew Leach + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85151 + Reviewed-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 51892e91d40175d790541ac7f2e5706648649a5e +Author: Bryce Harrington +Date: Sat Oct 18 19:10:32 2014 -0700 + + Revert "Add execution bit for make-cairo-test-constructors.sh" + + This reverts commit 5c17bf1a33b8e76edeb23121342e0f163fe9d6ad. + + Script is sourced in the makefile, no need for +x. + + test/make-cairo-test-constructors.sh | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 1013d18a01aa10dadb8996b9a327eb39b219acbd +Author: Adrian Johnson +Date: Sun Oct 19 12:08:55 2014 +1030 + + pdf: fix compiler warning + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 99a35dd273f3deb4ae54310f1ed1746bfd9fae70 +Author: Adrian Johnson +Date: Sun Oct 19 11:34:34 2014 +1030 + + CFF: Fix unaligned access + + Debian bug 712836 reported bus errors in cff subsetting when + running on a sparc. This is because unlike truetype, all data + in the compact font format is not aligned. + + https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=712836 + + src/cairo-cff-subset.c | 35 +++++++++++++++++++---------------- + src/cairo-image-info.c | 32 +++++++++++++------------------- + src/cairoint.h | 26 ++++++++++++++++++++++++++ + 3 files changed, 58 insertions(+), 35 deletions(-) + +commit 5c17bf1a33b8e76edeb23121342e0f163fe9d6ad +Author: Bryce Harrington +Date: Fri Oct 17 12:04:56 2014 -0700 + + Add execution bit for make-cairo-test-constructors.sh + + This is referenced in the Makefile but not set as executable + + test/make-cairo-test-constructors.sh | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit f05e9332b389d33b5ae654e04576ccf2f389786f +Author: Adrian Johnson +Date: Fri Oct 17 22:04:39 2014 +1030 + + Update mime type documentation. + + src/cairo-surface.c | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit 9102c0b0af808e52908e4f03bd9db479339c7b7e +Author: Bryce Harrington +Date: Thu Oct 16 11:41:40 2014 -0700 + + RELEASING: Update tags push command + + I couldn't get the documented command to do diddly. Running + `git push --tags` achieved what I think was intended. + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 92bc5376a82b618d11451c1ca088fbb0d37ca270 +Author: Bryce Harrington +Date: Mon Oct 13 19:57:09 2014 -0700 + + Start 1.14.1 development + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f6fd372a8b31a0bebbdfe36090d6ffc7bab9a2f8 +Author: Bryce Harrington +Date: Mon Oct 13 18:54:12 2014 -0700 + + pattern: Restore dropped inclusion of cairoint.h + + Fixes failure in make release-check due by check-preprocessor-syntax.sh + due to requirement that cairoint.h be the first include for source files. + + src/cairo-pattern.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 60ca80b248c2a5ffd0744162af7a1f1df1b04398 +Author: Bryce Harrington +Date: Mon Oct 13 18:45:53 2014 -0700 + + 1.14.0 release + + cairo-version.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3e41f7b38169f7724ed737790a5c0ad68ff80a04 +Author: Bryce Harrington +Date: Mon Oct 13 18:30:23 2014 -0700 + + NEWS: Flesh out docs for new APIs + + NEWS | 13 +++++++++++-- + src/cairo-surface.c | 2 +- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 41561c527c72d20f6f09f898f6390a578cfd4095 +Author: Bryce Harrington +Date: Mon Oct 13 18:20:45 2014 -0700 + + NEWS: Update with latest changes and finalize for release + + NEWS | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +commit ab2a7b61d59258b71e1c3256edf2f42ea6cc1eb2 +Author: Adrian Johnson +Date: Sun Oct 12 21:04:37 2014 +1030 + + pdf: don't use '\' to split strings across multiple lines + + The PDF interpreter in my printer does not handle this correctly. + So instead we add the string delimiters '(' and ')' to each line. + + src/cairo-pdf-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 45934f69cd158b7bb5632f5e4334a156795147f4 +Author: Bill Spitzak +Date: Thu Oct 9 19:46:16 2014 -0700 + + image: Corrected extents calculations + + New implementations of _cairo_pattern_sampled_area and _cairo_pattern_get_extents + which produce a more accurate bounding box. These do not depend on side-effects + of analyze_filter, can handle different horizontal and vertical scales, filters + wider than 1 for down-scaling, and compute a somewhat tighter bounding box + in most cases. + + I removed the pad output of _cairo_pattern_analyze_filter as it is unused. + + Reviewed-by: Bryce Harrington + + src/cairo-composite-rectangles.c | 2 +- + src/cairo-pattern-private.h | 5 +- + src/cairo-pattern.c | 275 ++++++++++++++++++++++++--------------- + src/cairo-xlib-core-compositor.c | 4 +- + src/cairoint.h | 4 - + src/drm/cairo-drm-i915-shader.c | 39 +----- + 6 files changed, 176 insertions(+), 153 deletions(-) + +commit 3cd7ed1f320c3ce330da3d3153c39b613e4a5a15 +Author: Bill Spitzak +Date: Thu Oct 9 19:46:15 2014 -0700 + + xcb: Use image fallback for GOOD/BEST filters + + It will not use the fallback if the symbols in the previous patch + are turned on. + + Also some code rearrangement to make this resemble the xlib version + more and to remove some suspect bugs. In particular meshes should not + work just because the translation is an integer. + + Reviewed-by: Bryce Harrington + + src/cairo-xcb-surface-render.c | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +commit ca9aee4e62d914b3cd3d6747ff1a4961d9aff8ed +Author: Bill Spitzak +Date: Thu Oct 9 19:46:14 2014 -0700 + + xcb: Add switches for whether XRender supports GOOD/BEST filtering + + Currently these are always false, but if XRender use a pixman that + supports filtering these could be turned on for that version. + + Reviewed-by: Bryce Harrington + + src/cairo-xcb-connection.c | 10 ++++++++++ + src/cairo-xcb-private.h | 6 +++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 58728da6eba4d89ba7c4328b22a552af633abb05 +Author: Bill Spitzak +Date: Thu Oct 9 19:46:13 2014 -0700 + + xlib: Use image fallback for GOOD/BEST filters + + Fallback is not used if the symbols defined in the previous patch to + indicate if XRender does GOOD/BEST are true. + + This patch also includes some changes to take advantage of the fact that + if there is an integer translation analyze_filter will already have set + the filter to NEAREST. + + Reviewed-by: Bryce Harrington + + src/cairo-xlib-source.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit c653dcd3e6ac1cef2440fa0db97a8e5ce30b2a47 +Author: Bill Spitzak +Date: Thu Oct 9 19:46:12 2014 -0700 + + xlib: Add symbols to indicate if XRender supports GOOD/BEST filtering + + Currently these are always false, but if some version of xlib uses + a pixman supporting filtering they could be changed to return true + for that version. + + Reviewed-by: Bryce Harrington + + src/cairo-xlib-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit c8b1bf55ad016de0675f4e924fdb8e17051a029c +Author: Bill Spitzak +Date: Thu Oct 9 19:46:11 2014 -0700 + + image: Move filter decision to _cairo_pattern_analyze_filter + + The analysis to deterimine if the GOOD filter can be replaced with + the BILINEAR filter is moved to this function so it can be used + by backends other than the image backend. + + Reviewed-by: Bryce Harrington + + src/cairo-image-source.c | 22 +++++++++------------- + src/cairo-pattern.c | 36 +++++++++++++++++++++++++++++++++++- + 2 files changed, 44 insertions(+), 14 deletions(-) + +commit 82cd66f8330da0521c29c003ef0a4bb773d6dbc6 +Author: Bryce Harrington +Date: Thu Oct 9 17:55:09 2014 -0700 + + test: Update pixman downscaling 95 reference images + + The pixman downscaling "95" tests attempt to rescale a 96x96 pixmap to + 95x95. Ideally the borders between color areas should be sharp, but for + this use case we allow for 1 pixel of blur between the areas as + acceptable. The choice of what color to use for this blurred region is + not important, and in fact varies from backend to backend. + + The old reference images were generated by Krzysztof Kosiński's + downscaling algorithm. These new images are against the algorithms + written by Bill Spitzak. + + Signed-off-by: Bryce Harrington + + .../pixman-downscale-best-95.image.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.image16.rgb24.ref.png | Bin 0 -> 648 bytes + test/reference/pixman-downscale-best-95.pdf.ref.png | Bin 0 -> 479 bytes + test/reference/pixman-downscale-best-95.ps2.ref.png | Bin 0 -> 460 bytes + test/reference/pixman-downscale-best-95.ps3.ref.png | Bin 0 -> 460 bytes + .../pixman-downscale-best-95.recording.rgb24.ref.png | Bin 0 -> 659 bytes + test/reference/pixman-downscale-best-95.ref.png | Bin 685 -> 771 bytes + test/reference/pixman-downscale-best-95.script.ref.png | Bin 0 -> 772 bytes + test/reference/pixman-downscale-best-95.svg11.ref.png | Bin 0 -> 474 bytes + test/reference/pixman-downscale-best-95.svg12.ref.png | Bin 0 -> 474 bytes + .../pixman-downscale-best-95.test-base.rgb24.ref.png | Bin 0 -> 659 bytes + ...pixman-downscale-best-95.test-fallback.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.test-mask.rgb24.ref.png | Bin 0 -> 659 bytes + ...ixman-downscale-best-95.test-paginated.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.test-spans.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.test-traps.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.xcb-fallback.rgb24.ref.png | Bin 0 -> 659 bytes + ...ixman-downscale-best-95.xcb-render-0_0.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.xcb-window&.rgb24.ref.png | Bin 0 -> 474 bytes + .../pixman-downscale-best-95.xcb-window.rgb24.ref.png | Bin 0 -> 474 bytes + test/reference/pixman-downscale-best-95.xcb.ref.png | Bin 0 -> 474 bytes + ...pixman-downscale-best-95.xlib-fallback.rgb24.ref.png | Bin 0 -> 659 bytes + ...xman-downscale-best-95.xlib-render-0_0.rgb24.ref.png | Bin 0 -> 659 bytes + .../pixman-downscale-best-95.xlib-window.rgb24.ref.png | Bin 0 -> 474 bytes + test/reference/pixman-downscale-best-95.xlib.ref.png | Bin 0 -> 474 bytes + .../pixman-downscale-bilinear-95.image16.rgb24.ref.png | Bin 0 -> 481 bytes + test/reference/pixman-downscale-bilinear-95.pdf.ref.png | Bin 0 -> 479 bytes + test/reference/pixman-downscale-bilinear-95.ps2.ref.png | Bin 0 -> 460 bytes + test/reference/pixman-downscale-bilinear-95.ps3.ref.png | Bin 0 -> 460 bytes + test/reference/pixman-downscale-bilinear-95.ref.png | Bin 685 -> 474 bytes + .../pixman-downscale-bilinear-95.script.ref.png | Bin 0 -> 481 bytes + .../pixman-downscale-fast-95.image16.rgb24.ref.png | Bin 0 -> 304 bytes + test/reference/pixman-downscale-fast-95.pdf.ref.png | Bin 0 -> 479 bytes + test/reference/pixman-downscale-fast-95.ps2.ref.png | Bin 0 -> 299 bytes + test/reference/pixman-downscale-fast-95.ps3.ref.png | Bin 0 -> 299 bytes + test/reference/pixman-downscale-fast-95.svg11.ref.png | Bin 0 -> 474 bytes + test/reference/pixman-downscale-fast-95.svg12.ref.png | Bin 0 -> 474 bytes + .../pixman-downscale-good-95.image16.rgb24.ref.png | Bin 0 -> 481 bytes + test/reference/pixman-downscale-good-95.pdf.ref.png | Bin 0 -> 479 bytes + test/reference/pixman-downscale-good-95.ps2.ref.png | Bin 0 -> 460 bytes + test/reference/pixman-downscale-good-95.ps3.ref.png | Bin 0 -> 460 bytes + test/reference/pixman-downscale-good-95.ref.png | Bin 685 -> 474 bytes + test/reference/pixman-downscale-good-95.script.ref.png | Bin 0 -> 481 bytes + .../pixman-downscale-nearest-95.image16.rgb24.ref.png | Bin 0 -> 304 bytes + test/reference/pixman-downscale-nearest-95.pdf.ref.png | Bin 0 -> 479 bytes + test/reference/pixman-downscale-nearest-95.ps2.ref.png | Bin 0 -> 299 bytes + test/reference/pixman-downscale-nearest-95.ps3.ref.png | Bin 0 -> 299 bytes + .../reference/pixman-downscale-nearest-95.svg11.ref.png | Bin 0 -> 474 bytes + .../reference/pixman-downscale-nearest-95.svg12.ref.png | Bin 0 -> 474 bytes + 49 files changed, 0 insertions(+), 0 deletions(-) + +commit 79b5a35f8387845a2fe46215776082a8abc3caba +Author: Bryce Harrington +Date: Thu Oct 9 17:47:10 2014 -0700 + + test: Add an update-refs.sh script to update reference images + + There are cases where the rendered output of a test can vary from + backend to backend in ways which are visually acceptable. This is why + we have reference images in the first place. In these cases, changes to + the rendering logic can result in slight differences in the output that + is also within acceptable visual limits. + + We see this in the pixman downscaling tests. This script is introduced + as a way to more easily update the reference images after a renderer + change. + + This script is intended to be expanded to handle updating of references + for other tests as we identify similar issues. The intent is that this + script then serves as a way to document these exceptional cases. + + Signed-off-by: Bryce Harrington + + test/update-refs.sh | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 84 insertions(+) + +commit 1570fa23e8043204bd30b122d55a036da15b16e5 +Author: Bryce Harrington +Date: Wed Oct 8 20:08:47 2014 -0700 + + test: Fix error message to specify the executable that was missing + + Signed-off-by: Bryce Harrington + + test/check-refs.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a8abf3a48b588632e3f39028b0b978d73c362f46 +Author: Chris Wilson +Date: Thu Oct 9 10:43:15 2014 +0100 + + test: Fix conflation of different device scales in index.html + + Currently testtable.js does not recognise the difference between running + the same test with multiple scale factors and merges the results into + one. + + test/testtable.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8047179bfca65cad36c61daf5f88c97cc971848b +Author: Chris Wilson +Date: Thu Oct 9 10:54:58 2014 +0100 + + test: Teach check-preprocessor-syntax.sh about -inlines.h + + src/check-preprocessor-syntax.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7c1db82a2e9dc04fd652d6e6bb6f4eb976922368 +Author: Bryce Harrington +Date: Fri Oct 3 12:34:06 2014 -0700 + + Get make check back to a happy spot + + Fix header ordering for some recently added code so cairo internal + headers are included first. Quells two make check errors. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=84638 + + src/cairo-gl-info.c | 4 ++-- + src/cairo-line-private.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit f57c0fd4656ef4fdbe13dbc69aa1ce4e130c37ce +Author: Bryce Harrington +Date: Fri Oct 3 12:20:13 2014 -0700 + + Declare as private the new cairo_lines_compare_at_y symbol + + Fixes a make check error. + + Checking that .libs/libcairo.so has the same symbol list as cairo.def + 126a127 + > cairo_lines_compare_at_y + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=84638 + Signed-off-by: Bryce Harrington + + src/cairo-line-private.h | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit d9ba8337ab456ae0e232d3c603cb41cea984ebea +Author: Bryce Harrington +Date: Fri Oct 3 11:52:32 2014 -0700 + + quartz: Check for quartz surface type before conversion + + Fixes the following warning introduced in a recent commit reported by + ~suv: + + CC cairo-quartz-image-surface.lo + cairo-quartz-image-surface.c:382:37: warning: incompatible pointer types + passing 'cairo_quartz_image_surface_t *' + (aka 'struct cairo_quartz_image_surface *') to parameter of type + 'const cairo_surface_t *' (aka 'const struct _cairo_surface *') + [-Wincompatible-pointer-types] + if (! _cairo_surface_is_quartz (surface)) { + ^~~~~~~ + ./cairo-quartz-private.h:87:50: note: passing argument to parameter 'surface' here + _cairo_surface_is_quartz (const cairo_surface_t *surface); + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84569 + Signed-off-by: Bryce Harrington + + src/cairo-quartz-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03756e042a2916e6c5334e2a00ec503a38e172d4 +Author: Andrea Canciani +Date: Fri Oct 3 09:56:24 2014 +0200 + + quartz-image: Fix build + + The quartz-image backend uses _cairo_surface_is_quartz(), which + therefore needs to be made available to it. Fixed as suggested by + Bryce in the referenced bugreport. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84569 + Signed-off-by: Andrea Canciani + + src/cairo-quartz-private.h | 3 +++ + src/cairo-quartz-surface.c | 5 +---- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 531da6fb915a6e9ea33216a90196ae962876acf4 +Author: Andrea Canciani +Date: Thu Oct 2 18:10:00 2014 +0200 + + quartz: Fix build + + Cairo cannot build with Quartz enabled since + 573ddfc3d5c08c37b95a21e0a1b34acecc646053, because of a double + definition of _cairo_surface_is_quartz(). + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84569 + Signed-off-by: Andrea Canciani + + src/cairo-quartz-surface.c | 22 ++++++++-------------- + 1 file changed, 8 insertions(+), 14 deletions(-) + +commit 14df211b9c12719f67412aedd6610eb623df7d7e +Author: Chris Wilson +Date: Thu Oct 2 13:08:50 2014 +0100 + + test: Add whole flipped replays + + When investing the symmetry of the raterisation, we want to have a + simple replay of all of the original geometry through a the flipped + recording surface. This reduces the worry about artifacts from the + clipped rendering. + + Signed-off-by: Chris Wilson + + test/recordflip.c | 188 +++++++++++++++++++++ + test/reference/recordflip-whole-fill-alpha.ref.png | Bin 0 -> 2803 bytes + .../recordflip-whole-paint-alpha-clip-mask.ref.png | Bin 0 -> 351 bytes + .../recordflip-whole-paint-alpha-clip.ref.png | Bin 0 -> 316 bytes + ...recordflip-whole-paint-alpha-solid-clip.ref.png | Bin 0 -> 291 bytes + .../reference/recordflip-whole-paint-alpha.ref.png | Bin 0 -> 257 bytes + test/reference/recordflip-whole-paint.ref.png | Bin 0 -> 93 bytes + .../recordflip-whole-select-font-face.ref.png | Bin 0 -> 2240 bytes + .../recordflip-whole-self-intersecting.ref.png | Bin 0 -> 168 bytes + .../recordflip-whole-text-transform.ref.png | Bin 0 -> 5609 bytes + 10 files changed, 188 insertions(+) + +commit 7f7ed4c04e49b64c15d60889a8cdc4075efd8236 +Author: Chris Wilson +Date: Thu Oct 2 09:16:04 2014 +0100 + + image: Eliminate self-intersections for the pixman traps compositor + + As pixman uses an accumulation mask, it oversamples neighbouring edges + within a cell. We can reduce the impact of this by eliminating + overlapping triangles/trapezoids from being passed into pixman. + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +commit 7aacd81befc5ad1aec26bcf7e65fa5bd36c6a9b4 +Author: Chris Wilson +Date: Thu Oct 2 08:17:14 2014 +0100 + + test: Refresh reference images for tor rendering changes + + (And include a git add missed from commit + + ccd48b346436a80629e4f9a07f2ba7ffbfd802f1 + Author: Chris Wilson + Date: Tue Sep 30 14:06:21 2014 +0100 + + test: Remove more duplicated reference images + + but were mostly invalidated by the rasteriser changes anyway). + + Signed-off-by: Chris Wilson + + test/reference/a8-clear.ref.png | Bin 0 -> 267 bytes + test/reference/aliasing.ref.png | Bin 0 -> 103877 bytes + test/reference/arc-direction.ref.png | Bin 0 -> 6073 bytes + test/reference/big-line.ref.png | Bin 0 -> 999 bytes + test/reference/big-little-triangle.argb32.ref.png | Bin 409 -> 399 bytes + test/reference/big-little-triangle.rgb24.ref.png | Bin 331 -> 320 bytes + test/reference/bilevel-xlib.ref.png | Bin 0 -> 105 bytes + test/reference/bug-40410.ref.png | Bin 0 -> 429 bytes + test/reference/bug-84115.ref.png | Bin 64233 -> 62964 bytes + test/reference/bug-bo-ricotz.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-extents.ref.png | Bin 0 -> 9211 bytes + test/reference/bug-seams.ref.png | Bin 1364 -> 1638 bytes + test/reference/bug-spline.ref.png | Bin 0 -> 5405 bytes + test/reference/caps-joins-alpha.ref.png | Bin 0 -> 2420 bytes + test/reference/caps-joins-curve.ref.png | Bin 0 -> 5681 bytes + test/reference/caps-joins.ref.png | Bin 0 -> 2560 bytes + test/reference/caps-sub-paths.ref.png | Bin 0 -> 168 bytes + test/reference/caps-tails-curve.ref.png | Bin 0 -> 53182 bytes + test/reference/caps.ref.png | Bin 0 -> 2115 bytes + test/reference/clear-source.ref.png | Bin 0 -> 882 bytes + test/reference/clear.argb32.ref.png | Bin 692 -> 701 bytes + test/reference/clear.rgb24.ref.png | Bin 621 -> 624 bytes + test/reference/clip-disjoint-hatching.ref.png | Bin 0 -> 7918 bytes + test/reference/clip-disjoint-quad.ref.png | Bin 0 -> 1642 bytes + test/reference/clip-disjoint.ref.png | Bin 0 -> 5348 bytes + .../reference/clip-fill-eo-unbounded.argb32.ref.png | Bin 0 -> 4053 bytes + test/reference/clip-fill-eo-unbounded.ref.png | Bin 4076 -> 0 bytes + test/reference/clip-fill-eo-unbounded.rgb24.ref.png | Bin 0 -> 3408 bytes + .../reference/clip-fill-nz-unbounded.argb32.ref.png | Bin 0 -> 4053 bytes + test/reference/clip-fill-nz-unbounded.ref.png | Bin 4076 -> 0 bytes + test/reference/clip-fill-nz-unbounded.rgb24.ref.png | Bin 0 -> 3408 bytes + test/reference/clip-fill-rule.argb32.ref.png | Bin 437 -> 430 bytes + test/reference/clip-fill-rule.rgb24.ref.png | Bin 388 -> 376 bytes + test/reference/clip-fill.ref.png | Bin 0 -> 1046 bytes + test/reference/clip-group-shapes-circles.ref.png | Bin 0 -> 1504 bytes + test/reference/clip-image.ref.png | Bin 0 -> 2677 bytes + test/reference/clip-intersect.ref.png | Bin 0 -> 224 bytes + test/reference/clip-mixed-antialias.ref.png | Bin 0 -> 1084 bytes + test/reference/clip-nesting.argb32.ref.png | Bin 0 -> 1026 bytes + test/reference/clip-nesting.ref.png | Bin 1094 -> 0 bytes + test/reference/clip-nesting.rgb24.ref.png | Bin 0 -> 917 bytes + test/reference/clip-operator.argb32.ref.png | Bin 8685 -> 8514 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3458 -> 3417 bytes + test/reference/clip-polygons.ref.png | Bin 0 -> 1352 bytes + test/reference/clip-push-group.ref.png | Bin 0 -> 164 bytes + test/reference/clip-shape.ref.png | Bin 0 -> 2902 bytes + test/reference/clip-stroke-unbounded.argb32.ref.png | Bin 0 -> 4097 bytes + test/reference/clip-stroke-unbounded.ref.png | Bin 4104 -> 0 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 0 -> 3486 bytes + test/reference/clip-stroke.ref.png | Bin 0 -> 1571 bytes + test/reference/clip-text.ref.png | Bin 0 -> 912 bytes + test/reference/clip-twice.argb32.ref.png | Bin 0 -> 1333 bytes + test/reference/clip-twice.ref.png | Bin 1357 -> 0 bytes + test/reference/clip-twice.rgb24.ref.png | Bin 0 -> 1171 bytes + test/reference/clip-xlib.ref.png | Bin 0 -> 2686 bytes + test/reference/clipped-group.ref.png | Bin 0 -> 315 bytes + test/reference/close-path.ref.png | Bin 0 -> 294 bytes + test/reference/copy-path.ref.png | Bin 0 -> 616 bytes + test/reference/coverage-column-triangles.xfail.png | Bin 0 -> 7632 bytes + .../coverage-intersecting-triangles.xfail.png | Bin 0 -> 14444 bytes + test/reference/coverage-rhombus.xfail.png | Bin 0 -> 9898 bytes + test/reference/coverage-row-triangles.xfail.png | Bin 0 -> 512 bytes + test/reference/coverage-triangles.xfail.png | Bin 0 -> 14283 bytes + test/reference/create-from-png.ref.png | Bin 0 -> 96 bytes + test/reference/culled-glyphs.ref.png | Bin 0 -> 440 bytes + test/reference/dash-caps-joins.ref.png | Bin 5089 -> 4713 bytes + test/reference/dash-curve.ref.png | Bin 0 -> 41069 bytes + test/reference/dash-infinite-loop.ref.png | Bin 0 -> 877 bytes + test/reference/dash-offset-negative.ref.png | Bin 0 -> 129 bytes + test/reference/dash-scale.ref.png | Bin 8831 -> 7826 bytes + test/reference/dash-state.ref.png | Bin 0 -> 8027 bytes + test/reference/degenerate-arc.ref.png | Bin 0 -> 626 bytes + test/reference/degenerate-dash.ref.png | Bin 0 -> 1960 bytes + test/reference/degenerate-linear-gradient.ref.png | Bin 0 -> 336 bytes + test/reference/degenerate-pen.ref.png | Bin 0 -> 1019 bytes + test/reference/drunkard-tails.ref.png | Bin 6261 -> 6157 bytes + test/reference/extend-pad-border.ref.png | Bin 0 -> 495 bytes + .../extended-blend-alpha-mask.argb32.ref.png | Bin 0 -> 9221 bytes + test/reference/extended-blend-alpha-mask.ref.png | Bin 9221 -> 0 bytes + .../extended-blend-alpha-mask.rgb24.ref.png | Bin 0 -> 4597 bytes + test/reference/extended-blend-alpha.argb32.ref.png | Bin 0 -> 9406 bytes + test/reference/extended-blend-alpha.ref.png | Bin 9406 -> 0 bytes + test/reference/extended-blend-alpha.rgb24.ref.png | Bin 0 -> 5740 bytes + test/reference/extended-blend-mask.argb32.ref.png | Bin 0 -> 3959 bytes + test/reference/extended-blend-mask.ref.png | Bin 3971 -> 0 bytes + test/reference/extended-blend-mask.rgb24.ref.png | Bin 0 -> 3634 bytes + .../extended-blend-solid-alpha.argb32.ref.png | Bin 0 -> 9406 bytes + test/reference/extended-blend-solid-alpha.ref.png | Bin 9406 -> 0 bytes + .../extended-blend-solid-alpha.rgb24.ref.png | Bin 0 -> 5740 bytes + test/reference/extended-blend-solid.argb32.ref.png | Bin 0 -> 4072 bytes + test/reference/extended-blend-solid.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend-solid.rgb24.ref.png | Bin 0 -> 3784 bytes + test/reference/extended-blend.argb32.ref.png | Bin 0 -> 4072 bytes + test/reference/extended-blend.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend.rgb24.ref.png | Bin 0 -> 3784 bytes + test/reference/fallback.argb32.ref.png | Bin 0 -> 4133 bytes + test/reference/fallback.ref.png | Bin 4106 -> 0 bytes + test/reference/fallback.rgb24.ref.png | Bin 0 -> 3283 bytes + test/reference/fill-alpha-pattern.ref.png | Bin 0 -> 3500 bytes + test/reference/fill-alpha.ref.png | Bin 0 -> 2754 bytes + test/reference/fill-and-stroke-alpha-add.ref.png | Bin 0 -> 558 bytes + test/reference/fill-and-stroke-alpha.ref.png | Bin 0 -> 513 bytes + .../fill-degenerate-sort-order.argb32.ref.png | Bin 0 -> 2390 bytes + test/reference/fill-degenerate-sort-order.ref.png | Bin 2414 -> 0 bytes + .../fill-degenerate-sort-order.rgb24.ref.png | Bin 0 -> 2048 bytes + test/reference/fill-image.ref.png | Bin 0 -> 1457 bytes + test/reference/fill-rule.argb32.ref.png | Bin 2086 -> 2076 bytes + test/reference/fill-rule.rgb24.ref.png | Bin 1797 -> 1763 bytes + test/reference/fill-xlib.ref.png | Bin 0 -> 1458 bytes + test/reference/filter-bilinear-extents.ref.png | Bin 0 -> 1210 bytes + test/reference/font-matrix-translation.ref.png | Bin 0 -> 865 bytes + test/reference/ft-show-glyphs-positioning.ref.png | Bin 0 -> 3243 bytes + test/reference/ft-show-glyphs-table.ref.png | Bin 0 -> 9975 bytes + .../reference/ft-text-vertical-layout-type1.ref.png | Bin 0 -> 3052 bytes + .../reference/ft-text-vertical-layout-type3.ref.png | Bin 0 -> 3609 bytes + test/reference/glyph-cache-pressure.ref.png | Bin 0 -> 2858 bytes + test/reference/group-unaligned.ref.png | Bin 0 -> 475 bytes + test/reference/halo-transform.ref.png | Bin 0 -> 15265 bytes + test/reference/halo.ref.png | Bin 0 -> 8631 bytes + test/reference/hatchings.ref.png | Bin 0 -> 90698 bytes + test/reference/horizontal-clip.ref.png | Bin 0 -> 113 bytes + test/reference/huge-linear.ref.png | Bin 0 -> 1636 bytes + test/reference/infinite-join.ref.png | Bin 0 -> 164 bytes + test/reference/inverse-text.ref.png | Bin 0 -> 2162 bytes + test/reference/inverted-clip.argb32.ref.png | Bin 0 -> 1390 bytes + test/reference/inverted-clip.rgb24.ref.png | Bin 1323 -> 1274 bytes + test/reference/joins-loop.ref.png | Bin 0 -> 4333 bytes + test/reference/joins-retrace.ref.png | Bin 4900 -> 4687 bytes + test/reference/joins-star.ref.png | Bin 0 -> 4015 bytes + test/reference/large-twin-antialias-mixed.ref.png | Bin 0 -> 16494 bytes + test/reference/leaky-dashed-stroke.ref.png | Bin 0 -> 9286 bytes + test/reference/leaky-polygon.ref.png | Bin 0 -> 337 bytes + .../line-width-large-overlap-rotated.ref.png | Bin 0 -> 415 bytes + test/reference/line-width-overlap-rotated.ref.png | Bin 0 -> 688 bytes + test/reference/line-width-scale.ref.png | Bin 0 -> 5721 bytes + test/reference/line-width-tolerance.ref.png | Bin 0 -> 168 bytes + test/reference/line-width.ref.png | Bin 0 -> 178 bytes + test/reference/linear-gradient-reflect.ref.png | Bin 0 -> 185 bytes + test/reference/linear-gradient-subset.ref.png | Bin 0 -> 813 bytes + test/reference/linear-gradient.ref.png | Bin 0 -> 959 bytes + test/reference/long-dashed-lines.ref.png | Bin 0 -> 2548 bytes + test/reference/map-all-to-xlib.ref.png | Bin 0 -> 86 bytes + test/reference/map-bit-to-xlib.ref.png | Bin 0 -> 103 bytes + test/reference/mask-alpha.argb32.ref.png | Bin 0 -> 629 bytes + test/reference/mask-alpha.ref.png | Bin 642 -> 0 bytes + test/reference/mask-alpha.rgb24.ref.png | Bin 0 -> 595 bytes + test/reference/mask-transformed-image.ref.png | Bin 0 -> 3812 bytes + test/reference/mask-transformed-similar.ref.png | Bin 0 -> 3812 bytes + test/reference/mask-transformed-xlib.ref.png | Bin 0 -> 3809 bytes + test/reference/mask.argb32.ref.png | Bin 8681 -> 8530 bytes + test/reference/mask.rgb24.ref.png | Bin 7215 -> 7160 bytes + test/reference/miter-precision.ref.png | Bin 0 -> 824 bytes + test/reference/operator-clear.argb32.ref.png | Bin 1067 -> 1061 bytes + test/reference/operator-clear.rgb24.ref.png | Bin 940 -> 939 bytes + test/reference/operator-source.argb32.ref.png | Bin 5626 -> 5620 bytes + test/reference/operator-source.rgb24.ref.png | Bin 4026 -> 4006 bytes + test/reference/over-above-source.argb32.ref.png | Bin 557 -> 533 bytes + test/reference/over-above-source.rgb24.ref.png | Bin 459 -> 452 bytes + test/reference/over-around-source.argb32.ref.png | Bin 633 -> 604 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 504 -> 489 bytes + test/reference/over-below-source.argb32.ref.png | Bin 447 -> 440 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 389 -> 376 bytes + test/reference/over-between-source.argb32.ref.png | Bin 607 -> 572 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 482 -> 457 bytes + test/reference/overlapping-dash-caps.ref.png | Bin 0 -> 3952 bytes + test/reference/paint-with-alpha-clip-mask.ref.png | Bin 0 -> 335 bytes + test/reference/partial-clip-text-bottom.ref.png | Bin 0 -> 261 bytes + test/reference/partial-clip-text-left.ref.png | Bin 0 -> 301 bytes + test/reference/partial-clip-text-right.ref.png | Bin 0 -> 155 bytes + test/reference/partial-clip-text-top.ref.png | Bin 0 -> 181 bytes + test/reference/path-append.ref.png | Bin 0 -> 6338 bytes + test/reference/path-stroke-twice.ref.png | Bin 0 -> 240 bytes + test/reference/pthread-show-text.ref.png | Bin 0 -> 30199 bytes + test/reference/push-group-color.ref.png | Bin 0 -> 3002 bytes + test/reference/push-group.argb32.ref.png | Bin 3116 -> 3123 bytes + test/reference/push-group.rgb24.ref.png | Bin 2929 -> 2951 bytes + test/reference/random-clip.ref.png | Bin 0 -> 525010 bytes + .../random-intersections-curves-eo.ref.png | Bin 0 -> 244632 bytes + .../random-intersections-curves-nz.ref.png | Bin 0 -> 264413 bytes + test/reference/random-intersections-eo.ref.png | Bin 0 -> 135555 bytes + test/reference/random-intersections-nonzero.ref.png | Bin 0 -> 141737 bytes + test/reference/record-fill-alpha.ref.png | Bin 0 -> 2754 bytes + test/reference/record-paint-alpha-clip-mask.ref.png | Bin 0 -> 335 bytes + test/reference/record-paint-alpha-clip.ref.png | Bin 0 -> 290 bytes + test/reference/record-select-font-face.ref.png | Bin 0 -> 2250 bytes + test/reference/record-text-transform.ref.png | Bin 5281 -> 5579 bytes + test/reference/record1414x-fill-alpha.ref.png | Bin 0 -> 4124 bytes + .../record1414x-paint-alpha-clip-mask.ref.png | Bin 0 -> 460 bytes + test/reference/record1414x-paint-alpha-clip.ref.png | Bin 0 -> 378 bytes + .../record1414x-paint-alpha-solid-clip.ref.png | Bin 0 -> 317 bytes + test/reference/record1414x-paint-alpha.ref.png | Bin 0 -> 265 bytes + test/reference/record1414x-paint.ref.png | Bin 0 -> 95 bytes + test/reference/record1414x-select-font-face.ref.png | Bin 0 -> 3177 bytes + .../reference/record1414x-self-intersecting.ref.png | Bin 0 -> 385 bytes + test/reference/record1414x-text-transform.ref.png | Bin 8365 -> 8713 bytes + test/reference/record2x-fill-alpha.ref.png | Bin 0 -> 5756 bytes + .../record2x-paint-alpha-clip-mask.ref.png | Bin 0 -> 483 bytes + test/reference/record2x-paint-alpha-clip.ref.png | Bin 0 -> 322 bytes + .../record2x-paint-alpha-solid-clip.ref.png | Bin 0 -> 281 bytes + test/reference/record2x-paint-alpha.ref.png | Bin 0 -> 291 bytes + test/reference/record2x-paint.ref.png | Bin 0 -> 98 bytes + test/reference/record2x-select-font-face.ref.png | Bin 0 -> 4407 bytes + test/reference/record2x-self-intersecting.ref.png | Bin 0 -> 171 bytes + test/reference/record2x-text-transform.ref.png | Bin 13072 -> 13476 bytes + test/reference/record90-fill-alpha.ref.png | Bin 0 -> 2656 bytes + .../record90-paint-alpha-clip-mask.ref.png | Bin 0 -> 317 bytes + test/reference/record90-paint-alpha-clip.ref.png | Bin 0 -> 306 bytes + .../record90-paint-alpha-solid-clip.ref.png | Bin 0 -> 293 bytes + test/reference/record90-paint-alpha.ref.png | Bin 0 -> 105 bytes + test/reference/record90-paint.ref.png | Bin 0 -> 93 bytes + test/reference/record90-select-font-face.ref.png | Bin 0 -> 2272 bytes + test/reference/record90-self-intersecting.ref.png | Bin 244 -> 240 bytes + test/reference/record90-text-transform.ref.png | Bin 5481 -> 5811 bytes + test/reference/recordflip-fill-alpha.ref.png | Bin 2864 -> 2803 bytes + .../recordflip-paint-alpha-clip-mask.ref.png | Bin 372 -> 351 bytes + .../recording-surface-extend-none.argb32.ref.png | Bin 0 -> 3670 bytes + .../reference/recording-surface-extend-none.ref.png | Bin 3153 -> 0 bytes + .../recording-surface-extend-none.rgb24.ref.png | Bin 0 -> 3741 bytes + .../recording-surface-extend-pad.argb32.ref.png | Bin 0 -> 12932 bytes + test/reference/recording-surface-extend-pad.ref.png | Bin 11200 -> 0 bytes + .../recording-surface-extend-pad.rgb24.ref.png | Bin 0 -> 13581 bytes + .../recording-surface-extend-reflect.argb32.ref.png | Bin 0 -> 28910 bytes + .../recording-surface-extend-reflect.ref.png | Bin 23967 -> 0 bytes + .../recording-surface-extend-reflect.rgb24.ref.png | Bin 0 -> 25588 bytes + .../recording-surface-extend-repeat.argb32.ref.png | Bin 0 -> 29648 bytes + .../recording-surface-extend-repeat.ref.png | Bin 24091 -> 0 bytes + .../recording-surface-extend-repeat.rgb24.ref.png | Bin 0 -> 25337 bytes + .../reference/recording-surface-over.argb32.ref.png | Bin 0 -> 3670 bytes + test/reference/recording-surface-over.ref.png | Bin 3153 -> 0 bytes + test/reference/recording-surface-over.rgb24.ref.png | Bin 0 -> 3741 bytes + .../recording-surface-source.argb32.ref.png | Bin 0 -> 3688 bytes + test/reference/recording-surface-source.ref.png | Bin 3153 -> 0 bytes + .../recording-surface-source.rgb24.ref.png | Bin 0 -> 3738 bytes + test/reference/rectilinear-miter-limit.ref.png | Bin 0 -> 145 bytes + .../rotate-clip-image-surface-paint.ref.png | Bin 0 -> 332 bytes + test/reference/rotated-clip.ref.png | Bin 0 -> 3834 bytes + test/reference/rounded-rectangle-fill.ref.png | Bin 0 -> 872 bytes + test/reference/rounded-rectangle-stroke.ref.png | Bin 833 -> 872 bytes + test/reference/scale-offset-image.ref.png | Bin 0 -> 9748 bytes + test/reference/scale-offset-similar.ref.png | Bin 0 -> 9779 bytes + test/reference/scale-offset-xlib.ref.png | Bin 0 -> 9120 bytes + test/reference/select-font-face.ref.png | Bin 0 -> 2250 bytes + test/reference/self-copy.ref.png | Bin 0 -> 257 bytes + test/reference/shape-general-convex.ref.png | Bin 0 -> 2539 bytes + test/reference/shape-sierpinski.ref.png | Bin 0 -> 54850 bytes + test/reference/show-glyphs-advance.ref.png | Bin 0 -> 1394 bytes + test/reference/show-text-current-point.ref.png | Bin 0 -> 2151 bytes + test/reference/simple-edge.xfail.png | Bin 0 -> 2124 bytes + test/reference/skew-extreme.ref.png | Bin 0 -> 944 bytes + test/reference/smask-fill.ref.png | Bin 0 -> 1185 bytes + test/reference/smask-image-mask.ref.png | Bin 0 -> 619 bytes + test/reference/smask-mask.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-paint.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-stroke.ref.png | Bin 0 -> 1701 bytes + test/reference/smask-text.ref.png | Bin 0 -> 1661 bytes + test/reference/smask.ref.png | Bin 0 -> 3422 bytes + test/reference/spline-decomposition.ref.png | Bin 0 -> 19578 bytes + test/reference/stride-12-xlib.ref.png | Bin 0 -> 81121 bytes + test/reference/stroke-clipped.ref.png | Bin 0 -> 5845 bytes + test/reference/stroke-image.ref.png | Bin 0 -> 1455 bytes + test/reference/stroke-pattern.ref.png | Bin 0 -> 1514 bytes + test/reference/stroke-xlib.ref.png | Bin 0 -> 1467 bytes + test/reference/subsurface-scale.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface.ref.png | Bin 0 -> 1811 bytes + .../surface-pattern-operator.argb32.ref.png | Bin 5107 -> 5087 bytes + .../surface-pattern-operator.rgb24.ref.png | Bin 1926 -> 1919 bytes + test/reference/surface-pattern-scale-down.ref.png | Bin 0 -> 1326 bytes + test/reference/surface-pattern-scale-up.ref.png | Bin 0 -> 4020 bytes + test/reference/surface-pattern.ref.png | Bin 0 -> 11088 bytes + test/reference/text-antialias-gray.ref.png | Bin 0 -> 966 bytes + test/reference/text-antialias-subpixel-bgr.ref.png | Bin 0 -> 1124 bytes + test/reference/text-antialias-subpixel-rgb.ref.png | Bin 0 -> 1109 bytes + test/reference/text-antialias-subpixel-vbgr.ref.png | Bin 0 -> 1205 bytes + test/reference/text-antialias-subpixel-vrgb.ref.png | Bin 0 -> 1180 bytes + test/reference/text-antialias-subpixel.ref.png | Bin 0 -> 1109 bytes + test/reference/text-glyph-range.ref.png | Bin 0 -> 1928 bytes + test/reference/text-rotate.ref.png | Bin 0 -> 16356 bytes + test/reference/tiger.ref.png | Bin 0 -> 94477 bytes + test/reference/tighten-bounds.argb32.ref.png | Bin 0 -> 8997 bytes + test/reference/tighten-bounds.ref.png | Bin 9443 -> 0 bytes + test/reference/tighten-bounds.rgb24.ref.png | Bin 0 -> 8450 bytes + test/reference/transforms.ref.png | Bin 0 -> 348 bytes + test/reference/trap-clip.argb32.ref.png | Bin 5972 -> 5822 bytes + test/reference/trap-clip.rgb24.ref.png | Bin 5462 -> 5422 bytes + test/reference/twin-antialias-gray.ref.png | Bin 0 -> 3536 bytes + test/reference/twin-antialias-mixed.ref.png | Bin 0 -> 2392 bytes + test/reference/twin-antialias-none.ref.png | Bin 0 -> 688 bytes + test/reference/twin-antialias-subpixel.ref.png | Bin 0 -> 3536 bytes + test/reference/twin.ref.png | Bin 0 -> 3536 bytes + test/reference/unbounded-operator.argb32.ref.png | Bin 2755 -> 2744 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 1328 -> 1303 bytes + test/reference/user-font-proxy.ref.png | Bin 0 -> 16981 bytes + test/reference/user-font-rescale.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font.ref.png | Bin 0 -> 5875 bytes + test/reference/world-map-fill.ref.png | Bin 0 -> 57407 bytes + test/reference/world-map-stroke.ref.png | Bin 0 -> 65152 bytes + test/reference/world-map.ref.png | Bin 0 -> 70463 bytes + 297 files changed, 0 insertions(+), 0 deletions(-) + +commit 950f1e7103a3b4f3405fbb3ee2844ed24b902834 +Author: Chris Wilson +Date: Thu Oct 2 07:52:05 2014 +0100 + + tor: Enable analytic processing for starting rows + + If all the edges start at the very beginning of the whole row, we can + merge them and include check for intersections/endings during the row. + This allows us to enable fast analytic processing for even the very + first row on pixel aligned vertices. + + Signed-off-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 27 +++++++++++++++++---------- + 1 file changed, 17 insertions(+), 10 deletions(-) + +commit 1a32ce83e4c1f3ca22a3f137b0126003a0e3d6e7 +Author: Chris Wilson +Date: Wed Oct 1 12:59:29 2014 +0100 + + tor: Perform analytic coverage over the pixel not sample points + + We use two different methods within tor to compute the coverage. + The first is that we iterate over every sample point within the pixel + and see if it is covered. The second is that we look at a whole pixel + and analytically compute the coverage inside (if we have no + intersections within that row). + + One side effect of + + commit 03c3d4b7c159a3004071522bac2461e553fec211 + Author: Chris Wilson + Date: Tue Sep 30 08:44:43 2014 +0100 + + tor: Fix loss of precision from projection onto sample grid + + was to compute our X coordinates for the sample locations (offset by + half a subrow) and that in order to compute the analytical pixel + coverage correctly, we therefore need to backstep by half the subrow to + the pixel boundary. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84396 + Signed-off-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 67 ++++++++++++++++++++++++++++++------------ + 1 file changed, 49 insertions(+), 18 deletions(-) + +commit 79c8b14b9fd8716d47fab4436b34d26b0135e9d7 +Author: Chris Wilson +Date: Thu Oct 2 00:20:52 2014 +0100 + + test/simple: Tighten sanity checks in reference image generator + + Signed-off-by: Chris Wilson + + test/simple.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 50b41e214533ea5fd3b64128306b6cb94d353145 +Author: Chris Wilson +Date: Wed Oct 1 22:50:10 2014 +0100 + + test: Add a simple rasteriser to check fidelity of edge rendering + + In order to check the behaviour of the analytic rasteriser inside tor, + let's compare it against a very simple rasteriser that uses a rectiliner + 256x256 sample grid. + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/reference/simple-edge.ref.png | Bin 0 -> 1922 bytes + test/simple.c | 347 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 348 insertions(+) + +commit 2144e7f48ba49d5bdb4a0dd1fb672be9d313fb65 +Author: Chris Wilson +Date: Tue Sep 30 16:18:34 2014 +0100 + + test: Fix coverage-abutting + + Using CAIRO_OPERATOR_OVER in case causes oversampling of the coincident + edges, to measure coverage we should only use ADD. :| + + Signed-off-by: Chris Wilson + + test/coverage.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0c42d5c176b27725ac8ab293c3e941be64f51613 +Author: Chris Wilson +Date: Tue Sep 30 16:14:57 2014 +0100 + + test: Add another coverage example demonstrating the seams in tor + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84396 + Signed-off-by: Chris Wilson + + test/coverage.c | 53 +++++++++++++++++++++++++++++++ + test/reference/coverage-abutting.ref.png | Bin 0 -> 777 bytes + 2 files changed, 53 insertions(+) + +commit 95e147bfa05a122541645f32be52cf1902c3a4b2 +Author: Chris Wilson +Date: Tue Sep 30 14:30:45 2014 +0100 + + test: Explicitly flip the reference image for recordflip + + Signed-off-by: Chris Wilson + + test/recordflip.c | 58 +++++++++++++++++++-- + test/reference/recordflip-fill-alpha.ref.png | Bin 2790 -> 2864 bytes + .../recordflip-paint-alpha-clip-mask.ref.png | Bin 340 -> 372 bytes + test/reference/recordflip-paint-alpha-clip.ref.png | Bin 291 -> 316 bytes + .../recordflip-paint-alpha-solid-clip.ref.png | Bin 280 -> 291 bytes + test/reference/recordflip-paint-alpha.ref.png | Bin 242 -> 257 bytes + test/reference/recordflip-select-font-face.ref.png | Bin 2229 -> 2240 bytes + test/reference/recordflip-text-transform.ref.png | Bin 5606 -> 5609 bytes + 8 files changed, 55 insertions(+), 3 deletions(-) + +commit ccd48b346436a80629e4f9a07f2ba7ffbfd802f1 +Author: Chris Wilson +Date: Tue Sep 30 14:06:21 2014 +0100 + + test: Remove more duplicated reference images + + Signed-off-by: Chris Wilson + + test/reference/a8-clear.argb32.ref.png | Bin 269 -> 0 bytes + test/reference/a8-clear.rgb24.ref.png | Bin 269 -> 0 bytes + test/reference/aliasing.argb32.ref.png | Bin 104193 -> 0 bytes + test/reference/aliasing.rgb24.ref.png | Bin 104193 -> 0 bytes + test/reference/arc-direction.argb32.ref.png | Bin 6473 -> 0 bytes + test/reference/arc-direction.rgb24.ref.png | Bin 6473 -> 0 bytes + test/reference/big-line.argb32.ref.png | Bin 977 -> 0 bytes + test/reference/big-line.rgb24.ref.png | Bin 977 -> 0 bytes + test/reference/bilevel-xlib.argb32.ref.png | Bin 105 -> 0 bytes + test/reference/bilevel-xlib.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/bug-40410.argb32.ref.png | Bin 429 -> 0 bytes + test/reference/bug-40410.rgb24.ref.png | Bin 429 -> 0 bytes + test/reference/bug-bo-ricotz.argb32.ref.png | Bin 2128 -> 0 bytes + test/reference/bug-bo-ricotz.rgb24.ref.png | Bin 2128 -> 0 bytes + test/reference/bug-extents.argb32.ref.png | Bin 9264 -> 0 bytes + test/reference/bug-extents.rgb24.ref.png | Bin 9264 -> 0 bytes + test/reference/bug-spline.argb32.ref.png | Bin 5490 -> 0 bytes + test/reference/bug-spline.rgb24.ref.png | Bin 5490 -> 0 bytes + test/reference/caps-joins-alpha.argb32.ref.png | Bin 2482 -> 0 bytes + test/reference/caps-joins-alpha.rgb24.ref.png | Bin 2482 -> 0 bytes + test/reference/caps-joins-curve.argb32.ref.png | Bin 5972 -> 0 bytes + test/reference/caps-joins-curve.rgb24.ref.png | Bin 5972 -> 0 bytes + test/reference/caps-joins.argb32.ref.png | Bin 2893 -> 0 bytes + test/reference/caps-joins.rgb24.ref.png | Bin 2893 -> 0 bytes + test/reference/caps-sub-paths.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/caps-sub-paths.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/caps-tails-curve.argb32.ref.png | Bin 54409 -> 0 bytes + test/reference/caps-tails-curve.rgb24.ref.png | Bin 54409 -> 0 bytes + test/reference/caps.argb32.ref.png | Bin 2115 -> 0 bytes + test/reference/caps.rgb24.ref.png | Bin 2115 -> 0 bytes + test/reference/clear-source.argb32.ref.png | Bin 882 -> 0 bytes + test/reference/clear-source.rgb24.ref.png | Bin 882 -> 0 bytes + test/reference/clip-disjoint-hatching.argb32.ref.png | Bin 7918 -> 0 bytes + test/reference/clip-disjoint-hatching.rgb24.ref.png | Bin 7918 -> 0 bytes + test/reference/clip-disjoint-quad.argb32.ref.png | Bin 1642 -> 0 bytes + test/reference/clip-disjoint-quad.rgb24.ref.png | Bin 1642 -> 0 bytes + test/reference/clip-disjoint.argb32.ref.png | Bin 5464 -> 0 bytes + test/reference/clip-disjoint.rgb24.ref.png | Bin 5464 -> 0 bytes + test/reference/clip-fill.argb32.ref.png | Bin 1064 -> 0 bytes + test/reference/clip-fill.rgb24.ref.png | Bin 1064 -> 0 bytes + .../reference/clip-group-shapes-circles.argb32.ref.png | Bin 1533 -> 0 bytes + test/reference/clip-group-shapes-circles.rgb24.ref.png | Bin 1533 -> 0 bytes + test/reference/clip-image.argb32.ref.png | Bin 2677 -> 0 bytes + test/reference/clip-image.rgb24.ref.png | Bin 2677 -> 0 bytes + test/reference/clip-intersect.argb32.ref.png | Bin 223 -> 0 bytes + test/reference/clip-intersect.rgb24.ref.png | Bin 223 -> 0 bytes + test/reference/clip-mixed-antialias.argb32.ref.png | Bin 1084 -> 0 bytes + test/reference/clip-mixed-antialias.rgb24.ref.png | Bin 1084 -> 0 bytes + test/reference/clip-operator.ref.png | Bin 8257 -> 0 bytes + test/reference/clip-polygons.argb32.ref.png | Bin 1352 -> 0 bytes + test/reference/clip-polygons.rgb24.ref.png | Bin 1352 -> 0 bytes + test/reference/clip-push-group.argb32.ref.png | Bin 164 -> 0 bytes + test/reference/clip-push-group.rgb24.ref.png | Bin 164 -> 0 bytes + test/reference/clip-shape.argb32.ref.png | Bin 2923 -> 0 bytes + test/reference/clip-shape.rgb24.ref.png | Bin 2923 -> 0 bytes + test/reference/clip-stroke.argb32.ref.png | Bin 1551 -> 0 bytes + test/reference/clip-stroke.rgb24.ref.png | Bin 1551 -> 0 bytes + test/reference/clip-text.argb32.ref.png | Bin 918 -> 0 bytes + test/reference/clip-text.rgb24.ref.png | Bin 918 -> 0 bytes + test/reference/clip-xlib.argb32.ref.png | Bin 2686 -> 0 bytes + test/reference/clip-xlib.rgb24.ref.png | Bin 2686 -> 0 bytes + test/reference/clipped-group.argb32.ref.png | Bin 315 -> 0 bytes + test/reference/clipped-group.rgb24.ref.png | Bin 315 -> 0 bytes + test/reference/close-path.argb32.ref.png | Bin 294 -> 0 bytes + test/reference/close-path.rgb24.ref.png | Bin 294 -> 0 bytes + test/reference/copy-path.argb32.ref.png | Bin 616 -> 0 bytes + test/reference/copy-path.rgb24.ref.png | Bin 616 -> 0 bytes + test/reference/create-from-png.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/create-from-png.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/culled-glyphs.argb32.ref.png | Bin 440 -> 0 bytes + test/reference/culled-glyphs.rgb24.ref.png | Bin 440 -> 0 bytes + test/reference/dash-curve.argb32.ref.png | Bin 41069 -> 0 bytes + test/reference/dash-curve.rgb24.ref.png | Bin 41069 -> 0 bytes + test/reference/dash-infinite-loop.argb32.ref.png | Bin 877 -> 0 bytes + test/reference/dash-infinite-loop.rgb24.ref.png | Bin 877 -> 0 bytes + test/reference/dash-offset-negative.argb32.ref.png | Bin 129 -> 0 bytes + test/reference/dash-offset-negative.rgb24.ref.png | Bin 129 -> 0 bytes + test/reference/dash-state.argb32.ref.png | Bin 8027 -> 0 bytes + test/reference/dash-state.rgb24.ref.png | Bin 8027 -> 0 bytes + test/reference/degenerate-arc.argb32.ref.png | Bin 646 -> 0 bytes + test/reference/degenerate-arc.rgb24.ref.png | Bin 646 -> 0 bytes + test/reference/degenerate-dash.argb32.ref.png | Bin 1908 -> 0 bytes + test/reference/degenerate-dash.rgb24.ref.png | Bin 1908 -> 0 bytes + .../degenerate-linear-gradient.argb32.ref.png | Bin 336 -> 0 bytes + .../reference/degenerate-linear-gradient.rgb24.ref.png | Bin 336 -> 0 bytes + test/reference/degenerate-pen.argb32.ref.png | Bin 1019 -> 0 bytes + test/reference/degenerate-pen.rgb24.ref.png | Bin 1019 -> 0 bytes + test/reference/extend-pad-border.argb32.ref.png | Bin 495 -> 0 bytes + test/reference/extend-pad-border.rgb24.ref.png | Bin 495 -> 0 bytes + test/reference/fill-alpha-pattern.argb32.ref.png | Bin 3489 -> 0 bytes + test/reference/fill-alpha-pattern.rgb24.ref.png | Bin 3489 -> 0 bytes + test/reference/fill-alpha.argb32.ref.png | Bin 2815 -> 0 bytes + test/reference/fill-alpha.rgb24.ref.png | Bin 2815 -> 0 bytes + .../reference/fill-and-stroke-alpha-add.argb32.ref.png | Bin 558 -> 0 bytes + test/reference/fill-and-stroke-alpha-add.rgb24.ref.png | Bin 558 -> 0 bytes + test/reference/fill-and-stroke-alpha.argb32.ref.png | Bin 513 -> 0 bytes + test/reference/fill-and-stroke-alpha.rgb24.ref.png | Bin 513 -> 0 bytes + test/reference/fill-image.argb32.ref.png | Bin 1315 -> 0 bytes + test/reference/fill-image.rgb24.ref.png | Bin 1315 -> 0 bytes + test/reference/fill-xlib.argb32.ref.png | Bin 1458 -> 0 bytes + test/reference/fill-xlib.rgb24.ref.png | Bin 1458 -> 0 bytes + test/reference/filter-bilinear-extents.argb32.ref.png | Bin 1210 -> 0 bytes + test/reference/filter-bilinear-extents.rgb24.ref.png | Bin 1210 -> 0 bytes + test/reference/font-matrix-translation.argb32.ref.png | Bin 865 -> 0 bytes + test/reference/font-matrix-translation.rgb24.ref.png | Bin 865 -> 0 bytes + .../ft-show-glyphs-positioning.argb32.ref.png | Bin 3243 -> 0 bytes + .../reference/ft-show-glyphs-positioning.rgb24.ref.png | Bin 3243 -> 0 bytes + test/reference/ft-show-glyphs-table.argb32.ref.png | Bin 9975 -> 0 bytes + test/reference/ft-show-glyphs-table.rgb24.ref.png | Bin 9975 -> 0 bytes + .../ft-text-vertical-layout-type1.argb32.ref.png | Bin 3075 -> 0 bytes + .../ft-text-vertical-layout-type1.rgb24.ref.png | Bin 3075 -> 0 bytes + .../ft-text-vertical-layout-type3.argb32.ref.png | Bin 3609 -> 0 bytes + .../ft-text-vertical-layout-type3.rgb24.ref.png | Bin 3609 -> 0 bytes + test/reference/glyph-cache-pressure.argb32.ref.png | Bin 2858 -> 0 bytes + test/reference/glyph-cache-pressure.rgb24.ref.png | Bin 2858 -> 0 bytes + test/reference/group-unaligned.argb32.ref.png | Bin 494 -> 0 bytes + test/reference/group-unaligned.rgb24.ref.png | Bin 494 -> 0 bytes + test/reference/halo-transform.argb32.ref.png | Bin 15234 -> 0 bytes + test/reference/halo-transform.rgb24.ref.png | Bin 15234 -> 0 bytes + test/reference/halo.argb32.ref.png | Bin 8621 -> 0 bytes + test/reference/halo.rgb24.ref.png | Bin 8621 -> 0 bytes + test/reference/hatchings.argb32.ref.png | Bin 90640 -> 0 bytes + test/reference/hatchings.rgb24.ref.png | Bin 90640 -> 0 bytes + test/reference/horizontal-clip.argb32.ref.png | Bin 113 -> 0 bytes + test/reference/horizontal-clip.rgb24.ref.png | Bin 113 -> 0 bytes + test/reference/huge-linear.argb32.ref.png | Bin 1600 -> 0 bytes + test/reference/huge-linear.rgb24.ref.png | Bin 1600 -> 0 bytes + test/reference/infinite-join.argb32.ref.png | Bin 164 -> 0 bytes + test/reference/infinite-join.rgb24.ref.png | Bin 164 -> 0 bytes + test/reference/joins-loop.argb32.ref.png | Bin 4492 -> 0 bytes + test/reference/joins-loop.rgb24.ref.png | Bin 4492 -> 0 bytes + test/reference/joins-star.argb32.ref.png | Bin 4914 -> 0 bytes + test/reference/joins-star.rgb24.ref.png | Bin 4914 -> 0 bytes + .../large-twin-antialias-mixed.argb32.ref.png | Bin 16442 -> 0 bytes + .../reference/large-twin-antialias-mixed.rgb24.ref.png | Bin 16442 -> 0 bytes + test/reference/leaky-dashed-stroke.argb32.ref.png | Bin 9286 -> 0 bytes + test/reference/leaky-dashed-stroke.rgb24.ref.png | Bin 9286 -> 0 bytes + test/reference/leaky-polygon.argb32.ref.png | Bin 337 -> 0 bytes + test/reference/leaky-polygon.rgb24.ref.png | Bin 337 -> 0 bytes + .../line-width-large-overlap-rotated.argb32.ref.png | Bin 439 -> 0 bytes + .../line-width-large-overlap-rotated.rgb24.ref.png | Bin 439 -> 0 bytes + .../line-width-overlap-rotated.argb32.ref.png | Bin 722 -> 0 bytes + .../reference/line-width-overlap-rotated.rgb24.ref.png | Bin 722 -> 0 bytes + test/reference/line-width-scale.argb32.ref.png | Bin 5721 -> 0 bytes + test/reference/line-width-scale.rgb24.ref.png | Bin 5721 -> 0 bytes + test/reference/line-width-tolerance.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/line-width-tolerance.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/line-width.argb32.ref.png | Bin 178 -> 0 bytes + test/reference/line-width.rgb24.ref.png | Bin 178 -> 0 bytes + test/reference/linear-gradient-reflect.argb32.ref.png | Bin 185 -> 0 bytes + test/reference/linear-gradient-reflect.rgb24.ref.png | Bin 185 -> 0 bytes + test/reference/linear-gradient-subset.argb32.ref.png | Bin 813 -> 0 bytes + test/reference/linear-gradient-subset.rgb24.ref.png | Bin 813 -> 0 bytes + test/reference/linear-gradient.argb32.ref.png | Bin 959 -> 0 bytes + test/reference/linear-gradient.rgb24.ref.png | Bin 959 -> 0 bytes + test/reference/long-dashed-lines.argb32.ref.png | Bin 2548 -> 0 bytes + test/reference/long-dashed-lines.rgb24.ref.png | Bin 2548 -> 0 bytes + test/reference/map-all-to-xlib.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/map-all-to-xlib.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/map-bit-to-xlib.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-bit-to-xlib.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/mask-transformed-image.argb32.ref.png | Bin 3812 -> 0 bytes + test/reference/mask-transformed-image.rgb24.ref.png | Bin 3812 -> 0 bytes + test/reference/mask-transformed-similar.argb32.ref.png | Bin 3812 -> 0 bytes + test/reference/mask-transformed-similar.rgb24.ref.png | Bin 3812 -> 0 bytes + test/reference/mask-transformed-xlib.argb32.ref.png | Bin 3809 -> 0 bytes + test/reference/mask-transformed-xlib.rgb24.ref.png | Bin 3809 -> 0 bytes + test/reference/miter-precision.argb32.ref.png | Bin 1030 -> 0 bytes + test/reference/miter-precision.rgb24.ref.png | Bin 1030 -> 0 bytes + test/reference/overlapping-dash-caps.argb32.ref.png | Bin 3952 -> 0 bytes + test/reference/overlapping-dash-caps.rgb24.ref.png | Bin 3952 -> 0 bytes + .../paint-with-alpha-clip-mask.argb32.ref.png | Bin 351 -> 0 bytes + .../reference/paint-with-alpha-clip-mask.rgb24.ref.png | Bin 351 -> 0 bytes + test/reference/partial-clip-text-bottom.argb32.ref.png | Bin 261 -> 0 bytes + test/reference/partial-clip-text-bottom.rgb24.ref.png | Bin 261 -> 0 bytes + test/reference/partial-clip-text-left.argb32.ref.png | Bin 301 -> 0 bytes + test/reference/partial-clip-text-left.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/partial-clip-text-right.argb32.ref.png | Bin 155 -> 0 bytes + test/reference/partial-clip-text-right.rgb24.ref.png | Bin 155 -> 0 bytes + test/reference/partial-clip-text-top.argb32.ref.png | Bin 181 -> 0 bytes + test/reference/partial-clip-text-top.rgb24.ref.png | Bin 181 -> 0 bytes + test/reference/path-append.argb32.ref.png | Bin 6309 -> 0 bytes + test/reference/path-append.rgb24.ref.png | Bin 6309 -> 0 bytes + test/reference/path-stroke-twice.argb32.ref.png | Bin 240 -> 0 bytes + test/reference/path-stroke-twice.rgb24.ref.png | Bin 240 -> 0 bytes + test/reference/pthread-show-text.argb32.ref.png | Bin 30199 -> 0 bytes + test/reference/pthread-show-text.rgb24.ref.png | Bin 30199 -> 0 bytes + test/reference/push-group-color.argb32.ref.png | Bin 2976 -> 0 bytes + test/reference/push-group-color.rgb24.ref.png | Bin 2976 -> 0 bytes + test/reference/random-clip.argb32.ref.png | Bin 525469 -> 0 bytes + test/reference/random-clip.rgb24.ref.png | Bin 525469 -> 0 bytes + .../random-intersections-curves-eo.argb32.ref.png | Bin 244656 -> 0 bytes + .../random-intersections-curves-eo.rgb24.ref.png | Bin 244656 -> 0 bytes + .../random-intersections-curves-nz.argb32.ref.png | Bin 264449 -> 0 bytes + .../random-intersections-curves-nz.rgb24.ref.png | Bin 264449 -> 0 bytes + test/reference/random-intersections-eo.argb32.ref.png | Bin 135556 -> 0 bytes + test/reference/random-intersections-eo.rgb24.ref.png | Bin 135556 -> 0 bytes + .../random-intersections-nonzero.argb32.ref.png | Bin 141582 -> 0 bytes + .../random-intersections-nonzero.rgb24.ref.png | Bin 141582 -> 0 bytes + test/reference/record-fill-alpha.argb32.ref.png | Bin 2822 -> 0 bytes + test/reference/record-fill-alpha.rgb24.ref.png | Bin 2822 -> 0 bytes + .../record-paint-alpha-clip-mask.argb32.ref.png | Bin 321 -> 0 bytes + .../record-paint-alpha-clip-mask.rgb24.ref.png | Bin 321 -> 0 bytes + test/reference/record-paint-alpha-clip.argb32.ref.png | Bin 290 -> 0 bytes + test/reference/record-paint-alpha-clip.rgb24.ref.png | Bin 290 -> 0 bytes + test/reference/record-select-font-face.argb32.ref.png | Bin 2250 -> 0 bytes + test/reference/record-select-font-face.rgb24.ref.png | Bin 2250 -> 0 bytes + test/reference/record1414x-fill-alpha.argb32.ref.png | Bin 4244 -> 0 bytes + test/reference/record1414x-fill-alpha.rgb24.ref.png | Bin 4244 -> 0 bytes + .../record1414x-paint-alpha-clip-mask.argb32.ref.png | Bin 544 -> 0 bytes + .../record1414x-paint-alpha-clip-mask.rgb24.ref.png | Bin 544 -> 0 bytes + .../record1414x-paint-alpha-clip.argb32.ref.png | Bin 378 -> 0 bytes + .../record1414x-paint-alpha-clip.rgb24.ref.png | Bin 378 -> 0 bytes + .../record1414x-paint-alpha-solid-clip.argb32.ref.png | Bin 317 -> 0 bytes + .../record1414x-paint-alpha-solid-clip.rgb24.ref.png | Bin 317 -> 0 bytes + test/reference/record1414x-paint-alpha.argb32.ref.png | Bin 265 -> 0 bytes + test/reference/record1414x-paint-alpha.rgb24.ref.png | Bin 265 -> 0 bytes + test/reference/record1414x-paint.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/record1414x-paint.rgb24.ref.png | Bin 95 -> 0 bytes + .../record1414x-select-font-face.argb32.ref.png | Bin 3177 -> 0 bytes + .../record1414x-select-font-face.rgb24.ref.png | Bin 3177 -> 0 bytes + .../record1414x-self-intersecting.argb32.ref.png | Bin 394 -> 0 bytes + .../record1414x-self-intersecting.rgb24.ref.png | Bin 394 -> 0 bytes + test/reference/record2x-fill-alpha.argb32.ref.png | Bin 6016 -> 0 bytes + test/reference/record2x-fill-alpha.rgb24.ref.png | Bin 6016 -> 0 bytes + .../record2x-paint-alpha-clip-mask.argb32.ref.png | Bin 543 -> 0 bytes + .../record2x-paint-alpha-clip-mask.rgb24.ref.png | Bin 543 -> 0 bytes + .../reference/record2x-paint-alpha-clip.argb32.ref.png | Bin 322 -> 0 bytes + test/reference/record2x-paint-alpha-clip.rgb24.ref.png | Bin 322 -> 0 bytes + .../record2x-paint-alpha-solid-clip.argb32.ref.png | Bin 281 -> 0 bytes + .../record2x-paint-alpha-solid-clip.rgb24.ref.png | Bin 281 -> 0 bytes + test/reference/record2x-paint-alpha.argb32.ref.png | Bin 291 -> 0 bytes + test/reference/record2x-paint-alpha.rgb24.ref.png | Bin 291 -> 0 bytes + test/reference/record2x-paint.argb32.ref.png | Bin 98 -> 0 bytes + test/reference/record2x-paint.rgb24.ref.png | Bin 98 -> 0 bytes + .../reference/record2x-select-font-face.argb32.ref.png | Bin 4407 -> 0 bytes + test/reference/record2x-select-font-face.rgb24.ref.png | Bin 4407 -> 0 bytes + .../record2x-self-intersecting.argb32.ref.png | Bin 171 -> 0 bytes + .../reference/record2x-self-intersecting.rgb24.ref.png | Bin 171 -> 0 bytes + test/reference/record90-fill-alpha.argb32.ref.png | Bin 2654 -> 0 bytes + test/reference/record90-fill-alpha.rgb24.ref.png | Bin 2654 -> 0 bytes + .../record90-paint-alpha-clip-mask.argb32.ref.png | Bin 317 -> 0 bytes + .../record90-paint-alpha-clip-mask.rgb24.ref.png | Bin 317 -> 0 bytes + .../reference/record90-paint-alpha-clip.argb32.ref.png | Bin 335 -> 0 bytes + test/reference/record90-paint-alpha-clip.rgb24.ref.png | Bin 335 -> 0 bytes + .../record90-paint-alpha-solid-clip.argb32.ref.png | Bin 293 -> 0 bytes + .../record90-paint-alpha-solid-clip.rgb24.ref.png | Bin 293 -> 0 bytes + test/reference/record90-paint-alpha.argb32.ref.png | Bin 105 -> 0 bytes + test/reference/record90-paint-alpha.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/record90-paint.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/record90-paint.rgb24.ref.png | Bin 93 -> 0 bytes + .../reference/record90-select-font-face.argb32.ref.png | Bin 2272 -> 0 bytes + test/reference/record90-select-font-face.rgb24.ref.png | Bin 2272 -> 0 bytes + test/reference/rectilinear-miter-limit.argb32.ref.png | Bin 145 -> 0 bytes + test/reference/rectilinear-miter-limit.rgb24.ref.png | Bin 145 -> 0 bytes + .../rotate-clip-image-surface-paint.argb32.ref.png | Bin 331 -> 0 bytes + .../rotate-clip-image-surface-paint.rgb24.ref.png | Bin 331 -> 0 bytes + test/reference/rotated-clip.argb32.ref.png | Bin 3829 -> 0 bytes + test/reference/rotated-clip.rgb24.ref.png | Bin 3829 -> 0 bytes + test/reference/rounded-rectangle-fill.argb32.ref.png | Bin 787 -> 0 bytes + test/reference/rounded-rectangle-fill.rgb24.ref.png | Bin 787 -> 0 bytes + test/reference/scale-offset-image.argb32.ref.png | Bin 9748 -> 0 bytes + test/reference/scale-offset-image.rgb24.ref.png | Bin 9748 -> 0 bytes + test/reference/scale-offset-similar.argb32.ref.png | Bin 9779 -> 0 bytes + test/reference/scale-offset-similar.rgb24.ref.png | Bin 9779 -> 0 bytes + test/reference/scale-offset-xlib.argb32.ref.png | Bin 9120 -> 0 bytes + test/reference/scale-offset-xlib.rgb24.ref.png | Bin 9120 -> 0 bytes + test/reference/select-font-face.argb32.ref.png | Bin 2250 -> 0 bytes + test/reference/select-font-face.rgb24.ref.png | Bin 2250 -> 0 bytes + test/reference/self-copy.argb32.ref.png | Bin 257 -> 0 bytes + test/reference/self-copy.rgb24.ref.png | Bin 257 -> 0 bytes + test/reference/shape-general-convex.argb32.ref.png | Bin 2539 -> 0 bytes + test/reference/shape-general-convex.rgb24.ref.png | Bin 2539 -> 0 bytes + test/reference/shape-sierpinski.argb32.ref.png | Bin 54850 -> 0 bytes + test/reference/shape-sierpinski.rgb24.ref.png | Bin 54850 -> 0 bytes + test/reference/show-glyphs-advance.argb32.ref.png | Bin 1394 -> 0 bytes + test/reference/show-glyphs-advance.rgb24.ref.png | Bin 1394 -> 0 bytes + test/reference/show-text-current-point.argb32.ref.png | Bin 2151 -> 0 bytes + test/reference/show-text-current-point.rgb24.ref.png | Bin 2151 -> 0 bytes + test/reference/skew-extreme.argb32.ref.png | Bin 799 -> 0 bytes + test/reference/skew-extreme.rgb24.ref.png | Bin 799 -> 0 bytes + test/reference/smask-fill.argb32.ref.png | Bin 1196 -> 0 bytes + test/reference/smask-fill.rgb24.ref.png | Bin 1196 -> 0 bytes + test/reference/smask-image-mask.argb32.ref.png | Bin 619 -> 0 bytes + test/reference/smask-image-mask.rgb24.ref.png | Bin 619 -> 0 bytes + test/reference/smask-mask.argb32.ref.png | Bin 2353 -> 0 bytes + test/reference/smask-mask.rgb24.ref.png | Bin 2353 -> 0 bytes + test/reference/smask-paint.argb32.ref.png | Bin 2469 -> 0 bytes + test/reference/smask-paint.rgb24.ref.png | Bin 2469 -> 0 bytes + test/reference/smask-stroke.argb32.ref.png | Bin 1700 -> 0 bytes + test/reference/smask-stroke.rgb24.ref.png | Bin 1700 -> 0 bytes + test/reference/smask-text.argb32.ref.png | Bin 1661 -> 0 bytes + test/reference/smask-text.rgb24.ref.png | Bin 1661 -> 0 bytes + test/reference/smask.argb32.ref.png | Bin 3422 -> 0 bytes + test/reference/smask.rgb24.ref.png | Bin 3422 -> 0 bytes + test/reference/spline-decomposition.argb32.ref.png | Bin 19520 -> 0 bytes + test/reference/spline-decomposition.rgb24.ref.png | Bin 19520 -> 0 bytes + test/reference/stride-12-xlib.argb32.ref.png | Bin 81121 -> 0 bytes + test/reference/stride-12-xlib.rgb24.ref.png | Bin 81121 -> 0 bytes + test/reference/stroke-clipped.argb32.ref.png | Bin 5857 -> 0 bytes + test/reference/stroke-clipped.rgb24.ref.png | Bin 5857 -> 0 bytes + test/reference/stroke-image.argb32.ref.png | Bin 1424 -> 0 bytes + test/reference/stroke-image.rgb24.ref.png | Bin 1424 -> 0 bytes + test/reference/stroke-pattern.argb32.ref.png | Bin 1510 -> 0 bytes + test/reference/stroke-pattern.rgb24.ref.png | Bin 1510 -> 0 bytes + test/reference/stroke-xlib.argb32.ref.png | Bin 1467 -> 0 bytes + test/reference/stroke-xlib.rgb24.ref.png | Bin 1467 -> 0 bytes + test/reference/subsurface-scale.argb32.ref.png | Bin 5921 -> 0 bytes + test/reference/subsurface-scale.rgb24.ref.png | Bin 5921 -> 0 bytes + test/reference/subsurface.argb32.ref.png | Bin 1811 -> 0 bytes + test/reference/subsurface.rgb24.ref.png | Bin 1811 -> 0 bytes + .../surface-pattern-scale-down.argb32.ref.png | Bin 1326 -> 0 bytes + .../reference/surface-pattern-scale-down.rgb24.ref.png | Bin 1326 -> 0 bytes + test/reference/surface-pattern-scale-up.argb32.ref.png | Bin 4020 -> 0 bytes + test/reference/surface-pattern-scale-up.rgb24.ref.png | Bin 4020 -> 0 bytes + test/reference/surface-pattern.argb32.ref.png | Bin 11088 -> 0 bytes + test/reference/surface-pattern.rgb24.ref.png | Bin 11088 -> 0 bytes + test/reference/text-antialias-gray.argb32.ref.png | Bin 966 -> 0 bytes + test/reference/text-antialias-gray.rgb24.ref.png | Bin 966 -> 0 bytes + .../text-antialias-subpixel-bgr.argb32.ref.png | Bin 1005 -> 0 bytes + .../text-antialias-subpixel-bgr.rgb24.ref.png | Bin 1005 -> 0 bytes + .../text-antialias-subpixel-rgb.argb32.ref.png | Bin 1013 -> 0 bytes + .../text-antialias-subpixel-rgb.rgb24.ref.png | Bin 1013 -> 0 bytes + .../text-antialias-subpixel-vbgr.argb32.ref.png | Bin 985 -> 0 bytes + .../text-antialias-subpixel-vbgr.rgb24.ref.png | Bin 985 -> 0 bytes + .../text-antialias-subpixel-vrgb.argb32.ref.png | Bin 1009 -> 0 bytes + .../text-antialias-subpixel-vrgb.rgb24.ref.png | Bin 1009 -> 0 bytes + test/reference/text-antialias-subpixel.argb32.ref.png | Bin 1013 -> 0 bytes + test/reference/text-antialias-subpixel.rgb24.ref.png | Bin 1013 -> 0 bytes + test/reference/text-glyph-range.argb32.ref.png | Bin 1928 -> 0 bytes + test/reference/text-glyph-range.rgb24.ref.png | Bin 1928 -> 0 bytes + test/reference/text-rotate.argb32.ref.png | Bin 16307 -> 0 bytes + test/reference/text-rotate.rgb24.ref.png | Bin 16307 -> 0 bytes + test/reference/tiger.argb32.ref.png | Bin 94790 -> 0 bytes + test/reference/tiger.rgb24.ref.png | Bin 94790 -> 0 bytes + test/reference/transforms.argb32.ref.png | Bin 348 -> 0 bytes + test/reference/transforms.rgb24.ref.png | Bin 348 -> 0 bytes + test/reference/twin-antialias-gray.argb32.ref.png | Bin 3536 -> 0 bytes + test/reference/twin-antialias-gray.rgb24.ref.png | Bin 3536 -> 0 bytes + test/reference/twin-antialias-mixed.argb32.ref.png | Bin 2359 -> 0 bytes + test/reference/twin-antialias-mixed.rgb24.ref.png | Bin 2359 -> 0 bytes + test/reference/twin-antialias-none.argb32.ref.png | Bin 692 -> 0 bytes + test/reference/twin-antialias-none.rgb24.ref.png | Bin 692 -> 0 bytes + test/reference/twin-antialias-subpixel.argb32.ref.png | Bin 3536 -> 0 bytes + test/reference/twin-antialias-subpixel.rgb24.ref.png | Bin 3536 -> 0 bytes + test/reference/twin.argb32.ref.png | Bin 3536 -> 0 bytes + test/reference/twin.rgb24.ref.png | Bin 3536 -> 0 bytes + test/reference/user-font-proxy.argb32.ref.png | Bin 16981 -> 0 bytes + test/reference/user-font-proxy.rgb24.ref.png | Bin 16981 -> 0 bytes + test/reference/user-font-rescale.argb32.ref.png | Bin 14883 -> 0 bytes + test/reference/user-font-rescale.rgb24.ref.png | Bin 14883 -> 0 bytes + test/reference/user-font.argb32.ref.png | Bin 5889 -> 0 bytes + test/reference/user-font.rgb24.ref.png | Bin 5889 -> 0 bytes + test/reference/world-map-fill.argb32.ref.png | Bin 57407 -> 0 bytes + test/reference/world-map-fill.rgb24.ref.png | Bin 57407 -> 0 bytes + test/reference/world-map-stroke.argb32.ref.png | Bin 65152 -> 0 bytes + test/reference/world-map-stroke.rgb24.ref.png | Bin 65152 -> 0 bytes + test/reference/world-map.argb32.ref.png | Bin 70463 -> 0 bytes + test/reference/world-map.rgb24.ref.png | Bin 70463 -> 0 bytes + 359 files changed, 0 insertions(+), 0 deletions(-) + +commit 167561f2823767058e2be3a26131b5f820b35c35 +Author: Chris Wilson +Date: Tue Sep 30 10:22:41 2014 +0100 + + tor: Review full-row walker + + When updating the quorem between cells, we would lose the overflow + increment as it was only applied locally and not preserved by updating + the quorem. + + Signed-off-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 86 ++++++++------------- + test/reference/aliasing.argb32.ref.png | Bin 106073 -> 104193 bytes + test/reference/aliasing.rgb24.ref.png | Bin 106073 -> 104193 bytes + test/reference/arc-direction.argb32.ref.png | Bin 6491 -> 6473 bytes + test/reference/arc-direction.rgb24.ref.png | Bin 6491 -> 6473 bytes + test/reference/big-little-triangle.argb32.ref.png | Bin 0 -> 409 bytes + test/reference/big-little-triangle.ref.png | Bin 409 -> 0 bytes + test/reference/big-little-triangle.rgb24.ref.png | Bin 329 -> 331 bytes + test/reference/bug-extents.argb32.ref.png | Bin 9257 -> 9264 bytes + test/reference/bug-extents.rgb24.ref.png | Bin 9257 -> 9264 bytes + test/reference/bug-spline.argb32.ref.png | Bin 5462 -> 5490 bytes + test/reference/bug-spline.rgb24.ref.png | Bin 5462 -> 5490 bytes + test/reference/caps-joins-alpha.argb32.ref.png | Bin 2479 -> 2482 bytes + test/reference/caps-joins-alpha.rgb24.ref.png | Bin 2479 -> 2482 bytes + test/reference/clear.argb32.ref.png | Bin 0 -> 692 bytes + test/reference/clear.ref.png | Bin 692 -> 0 bytes + test/reference/clear.rgb24.ref.png | Bin 0 -> 621 bytes + test/reference/clip-disjoint-quad.argb32.ref.png | Bin 1643 -> 1642 bytes + test/reference/clip-disjoint-quad.rgb24.ref.png | Bin 1643 -> 1642 bytes + test/reference/clip-disjoint.argb32.ref.png | Bin 5465 -> 5464 bytes + test/reference/clip-disjoint.rgb24.ref.png | Bin 5465 -> 5464 bytes + test/reference/clip-fill-eo-unbounded.ref.png | Bin 4084 -> 4076 bytes + test/reference/clip-fill-nz-unbounded.ref.png | Bin 4084 -> 4076 bytes + test/reference/clip-fill-rule.argb32.ref.png | Bin 0 -> 437 bytes + test/reference/clip-fill-rule.ref.png | Bin 437 -> 0 bytes + test/reference/clip-fill-rule.rgb24.ref.png | Bin 0 -> 388 bytes + .../clip-group-shapes-circles.argb32.ref.png | Bin 1526 -> 1533 bytes + .../clip-group-shapes-circles.rgb24.ref.png | Bin 1526 -> 1533 bytes + test/reference/clip-intersect.argb32.ref.png | Bin 220 -> 223 bytes + test/reference/clip-intersect.rgb24.ref.png | Bin 220 -> 223 bytes + test/reference/clip-operator.argb32.ref.png | Bin 0 -> 8685 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 0 -> 3458 bytes + test/reference/clip-shape.argb32.ref.png | Bin 2945 -> 2923 bytes + test/reference/clip-shape.rgb24.ref.png | Bin 2945 -> 2923 bytes + .../reference/clip-stroke-unbounded.argb32.ref.png | Bin 4105 -> 0 bytes + test/reference/clip-stroke-unbounded.ref.png | Bin 4127 -> 4104 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 3517 -> 0 bytes + test/reference/clip-twice.ref.png | Bin 1344 -> 1357 bytes + test/reference/degenerate-arc.argb32.ref.png | Bin 639 -> 646 bytes + test/reference/degenerate-arc.rgb24.ref.png | Bin 639 -> 646 bytes + test/reference/fill-alpha-pattern.argb32.ref.png | Bin 3381 -> 3489 bytes + test/reference/fill-alpha-pattern.rgb24.ref.png | Bin 3381 -> 3489 bytes + test/reference/fill-alpha.argb32.ref.png | Bin 2815 -> 2815 bytes + test/reference/fill-alpha.rgb24.ref.png | Bin 2815 -> 2815 bytes + test/reference/fill-degenerate-sort-order.ref.png | Bin 2410 -> 2414 bytes + test/reference/fill-rule.argb32.ref.png | Bin 0 -> 2086 bytes + test/reference/fill-rule.ref.png | Bin 2086 -> 0 bytes + test/reference/fill-rule.rgb24.ref.png | Bin 0 -> 1797 bytes + .../ft-text-vertical-layout-type1.argb32.ref.png | Bin 3084 -> 3075 bytes + .../ft-text-vertical-layout-type1.rgb24.ref.png | Bin 3084 -> 3075 bytes + .../ft-text-vertical-layout-type3.argb32.ref.png | Bin 3610 -> 3609 bytes + .../ft-text-vertical-layout-type3.rgb24.ref.png | Bin 3610 -> 3609 bytes + test/reference/halo-transform.argb32.ref.png | Bin 15231 -> 15234 bytes + test/reference/halo-transform.rgb24.ref.png | Bin 15231 -> 15234 bytes + test/reference/halo.argb32.ref.png | Bin 8666 -> 8621 bytes + test/reference/halo.rgb24.ref.png | Bin 8666 -> 8621 bytes + test/reference/hatchings.argb32.ref.png | Bin 91041 -> 90640 bytes + test/reference/hatchings.rgb24.ref.png | Bin 91041 -> 90640 bytes + test/reference/inverted-clip.rgb24.ref.png | Bin 1333 -> 1323 bytes + test/reference/leaky-dashed-stroke.argb32.ref.png | Bin 9286 -> 9286 bytes + test/reference/leaky-dashed-stroke.rgb24.ref.png | Bin 9286 -> 9286 bytes + ...line-width-large-overlap-rotated.argb32.ref.png | Bin 436 -> 439 bytes + .../line-width-large-overlap-rotated.rgb24.ref.png | Bin 436 -> 439 bytes + .../line-width-overlap-rotated.argb32.ref.png | Bin 716 -> 722 bytes + .../line-width-overlap-rotated.rgb24.ref.png | Bin 716 -> 722 bytes + .../linear-gradient-subset.argb32.ref.png | Bin 812 -> 813 bytes + .../reference/linear-gradient-subset.rgb24.ref.png | Bin 812 -> 813 bytes + test/reference/linear-gradient.argb32.ref.png | Bin 960 -> 959 bytes + test/reference/linear-gradient.rgb24.ref.png | Bin 960 -> 959 bytes + test/reference/mask-alpha.ref.png | Bin 644 -> 642 bytes + test/reference/mask.argb32.ref.png | Bin 0 -> 8681 bytes + test/reference/mask.ref.png | Bin 8565 -> 0 bytes + test/reference/mask.rgb24.ref.png | Bin 0 -> 7215 bytes + test/reference/operator-alpha.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.ref.png | Bin 280 -> 0 bytes + test/reference/operator-alpha.rgb24.ref.png | Bin 0 -> 205 bytes + test/reference/operator-clear.argb32.ref.png | Bin 1068 -> 1067 bytes + test/reference/operator-clear.ref.png | Bin 1071 -> 0 bytes + test/reference/operator-clear.rgb24.ref.png | Bin 0 -> 940 bytes + test/reference/operator-source.argb32.ref.png | Bin 0 -> 5626 bytes + test/reference/operator-source.ref.png | Bin 5614 -> 0 bytes + test/reference/operator-source.rgb24.ref.png | Bin 0 -> 4026 bytes + test/reference/operator.argb32.ref.png | Bin 0 -> 238 bytes + test/reference/operator.ref.png | Bin 238 -> 0 bytes + test/reference/operator.rgb24.ref.png | Bin 0 -> 189 bytes + test/reference/over-above-source.argb32.ref.png | Bin 0 -> 557 bytes + test/reference/over-above-source.ref.png | Bin 557 -> 0 bytes + test/reference/over-above-source.rgb24.ref.png | Bin 0 -> 459 bytes + test/reference/over-around-source.argb32.ref.png | Bin 0 -> 633 bytes + test/reference/over-around-source.ref.png | Bin 633 -> 0 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 0 -> 504 bytes + test/reference/over-below-source.argb32.ref.png | Bin 0 -> 447 bytes + test/reference/over-below-source.ref.png | Bin 447 -> 0 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 0 -> 389 bytes + test/reference/over-between-source.argb32.ref.png | Bin 0 -> 607 bytes + test/reference/over-between-source.ref.png | Bin 607 -> 0 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 0 -> 482 bytes + test/reference/path-append.argb32.ref.png | Bin 6297 -> 6309 bytes + test/reference/path-append.rgb24.ref.png | Bin 6297 -> 6309 bytes + test/reference/push-group-color.argb32.ref.png | Bin 0 -> 2976 bytes + test/reference/push-group-color.ref.png | Bin 2961 -> 0 bytes + test/reference/push-group-color.rgb24.ref.png | Bin 0 -> 2976 bytes + test/reference/push-group.argb32.ref.png | Bin 3097 -> 3116 bytes + test/reference/push-group.ref.png | Bin 3062 -> 0 bytes + test/reference/push-group.rgb24.ref.png | Bin 0 -> 2929 bytes + test/reference/random-clip.argb32.ref.png | Bin 525539 -> 525469 bytes + test/reference/random-clip.rgb24.ref.png | Bin 525539 -> 525469 bytes + .../random-intersections-curves-eo.argb32.ref.png | Bin 244655 -> 244656 bytes + .../random-intersections-curves-eo.rgb24.ref.png | Bin 244655 -> 244656 bytes + .../random-intersections-curves-nz.argb32.ref.png | Bin 264447 -> 264449 bytes + .../random-intersections-curves-nz.rgb24.ref.png | Bin 264447 -> 264449 bytes + .../random-intersections-eo.argb32.ref.png | Bin 135591 -> 135556 bytes + .../random-intersections-eo.rgb24.ref.png | Bin 135591 -> 135556 bytes + .../random-intersections-nonzero.argb32.ref.png | Bin 141598 -> 141582 bytes + .../random-intersections-nonzero.rgb24.ref.png | Bin 141598 -> 141582 bytes + test/reference/record2x-fill-alpha.argb32.ref.png | Bin 5986 -> 6016 bytes + test/reference/record2x-fill-alpha.rgb24.ref.png | Bin 5986 -> 6016 bytes + .../rotate-clip.surface-paint.image.argb32.ref.png | Bin 0 -> 340 bytes + .../rotate-clip.surface-paint.image.rgb24.ref.png | Bin 0 -> 340 bytes + test/reference/scale-offset-similar.argb32.ref.png | Bin 9847 -> 9779 bytes + test/reference/scale-offset-similar.rgb24.ref.png | Bin 9847 -> 9779 bytes + test/reference/smask-fill.argb32.ref.png | Bin 1201 -> 1196 bytes + test/reference/smask-fill.rgb24.ref.png | Bin 1201 -> 1196 bytes + test/reference/smask-stroke.argb32.ref.png | Bin 1707 -> 1700 bytes + test/reference/smask-stroke.rgb24.ref.png | Bin 1707 -> 1700 bytes + test/reference/smask.argb32.ref.png | Bin 3436 -> 3422 bytes + test/reference/smask.rgb24.ref.png | Bin 3436 -> 3422 bytes + .../surface-pattern-operator.argb32.ref.png | Bin 0 -> 5107 bytes + test/reference/surface-pattern-operator.ref.png | Bin 5217 -> 0 bytes + .../surface-pattern-operator.rgb24.ref.png | Bin 0 -> 1926 bytes + test/reference/text-rotate.argb32.ref.png | Bin 16518 -> 16307 bytes + test/reference/text-rotate.rgb24.ref.png | Bin 16518 -> 16307 bytes + test/reference/tiger.argb32.ref.png | Bin 94714 -> 94790 bytes + test/reference/tiger.rgb24.ref.png | Bin 94714 -> 94790 bytes + test/reference/trap-clip.argb32.ref.png | Bin 0 -> 5972 bytes + test/reference/trap-clip.ref.png | Bin 5826 -> 0 bytes + test/reference/trap-clip.rgb24.ref.png | Bin 0 -> 5462 bytes + test/reference/unbounded-operator.argb32.ref.png | Bin 2763 -> 2755 bytes + test/reference/unbounded-operator.ref.png | Bin 2781 -> 0 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 0 -> 1328 bytes + test/reference/user-font-proxy.argb32.ref.png | Bin 16971 -> 16981 bytes + test/reference/user-font-proxy.rgb24.ref.png | Bin 16971 -> 16981 bytes + test/reference/user-font.argb32.ref.png | Bin 5882 -> 5889 bytes + test/reference/user-font.rgb24.ref.png | Bin 5882 -> 5889 bytes + 144 files changed, 34 insertions(+), 52 deletions(-) + +commit ff23afd5f26e46e9b3c1fbfa31b2809f4329c4f0 +Author: Chris Wilson +Date: Tue Sep 30 12:25:56 2014 +0100 + + test: Include coverage in the normal test run + + Currently coverage is marked as slow. It is slower than the typical + test, but it is quite a useful check on our rasterisation quality + without going too far overboard (unlike partial-coverage!). + + Signed-off-by: Chris Wilson + + test/coverage.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 03c3d4b7c159a3004071522bac2461e553fec211 +Author: Chris Wilson +Date: Tue Sep 30 08:44:43 2014 +0100 + + tor: Fix loss of precision from projection onto sample grid + + The goal is to preserve the precision in the gradients of the edges and + only apply the projection into the final cell location. We also include + the half-subrow offset as spotted by Massimo. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84396 + Testcase: coverage-rhombus + Signed-off-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 331 +++++++++++---------- + test/reference/a1-clip-fill-rule.ref.png | Bin 0 -> 236 bytes + test/reference/a8-clear.argb32.ref.png | Bin 271 -> 269 bytes + test/reference/a8-clear.rgb24.ref.png | Bin 271 -> 269 bytes + test/reference/aliasing.argb32.ref.png | Bin 104324 -> 106073 bytes + test/reference/aliasing.rgb24.ref.png | Bin 104324 -> 106073 bytes + test/reference/alpha-similar.ref.png | Bin 0 -> 99 bytes + test/reference/arc-direction.argb32.ref.png | Bin 6380 -> 6491 bytes + test/reference/arc-direction.rgb24.ref.png | Bin 6380 -> 6491 bytes + test/reference/big-empty-box.ref.png | Bin 0 -> 111 bytes + test/reference/big-empty-triangle.ref.png | Bin 0 -> 111 bytes + test/reference/big-little-box.ref.png | Bin 0 -> 169 bytes + test/reference/big-little-triangle.ref.png | Bin 0 -> 409 bytes + test/reference/big-little-triangle.rgb24.ref.png | Bin 0 -> 329 bytes + test/reference/bitmap-font.ref.png | Bin 0 -> 950 bytes + test/reference/bug-extents.argb32.ref.png | Bin 9251 -> 9257 bytes + test/reference/bug-extents.rgb24.ref.png | Bin 9251 -> 9257 bytes + test/reference/bug-source-cu.ref.png | Bin 0 -> 3815 bytes + test/reference/bug-spline.argb32.ref.png | Bin 0 -> 5462 bytes + test/reference/bug-spline.ref.png | Bin 5577 -> 0 bytes + test/reference/bug-spline.rgb24.ref.png | Bin 0 -> 5462 bytes + test/reference/caps-joins-alpha.argb32.ref.png | Bin 0 -> 2479 bytes + test/reference/caps-joins-alpha.ref.png | Bin 2643 -> 0 bytes + test/reference/caps-joins-alpha.rgb24.ref.png | Bin 0 -> 2479 bytes + test/reference/caps-joins-curve.argb32.ref.png | Bin 0 -> 5972 bytes + test/reference/caps-joins-curve.ref.png | Bin 6228 -> 0 bytes + test/reference/caps-joins-curve.rgb24.ref.png | Bin 0 -> 5972 bytes + test/reference/caps-tails-curve.argb32.ref.png | Bin 0 -> 54409 bytes + test/reference/caps-tails-curve.ref.png | Bin 54314 -> 0 bytes + test/reference/caps-tails-curve.rgb24.ref.png | Bin 0 -> 54409 bytes + test/reference/clear.ref.png | Bin 0 -> 692 bytes + test/reference/clip-device-offset.ref.png | Bin 0 -> 175 bytes + .../clip-disjoint-hatching.argb32.ref.png | Bin 9022 -> 7918 bytes + .../reference/clip-disjoint-hatching.rgb24.ref.png | Bin 9022 -> 7918 bytes + test/reference/clip-disjoint-quad.argb32.ref.png | Bin 0 -> 1643 bytes + test/reference/clip-disjoint-quad.ref.png | Bin 1592 -> 0 bytes + test/reference/clip-disjoint-quad.rgb24.ref.png | Bin 0 -> 1643 bytes + test/reference/clip-disjoint.argb32.ref.png | Bin 0 -> 5465 bytes + test/reference/clip-disjoint.ref.png | Bin 5438 -> 0 bytes + test/reference/clip-disjoint.rgb24.ref.png | Bin 0 -> 5465 bytes + test/reference/clip-fill-eo-unbounded.ref.png | Bin 0 -> 4084 bytes + test/reference/clip-fill-nz-unbounded.ref.png | Bin 0 -> 4084 bytes + .../reference/clip-fill-rule-pixel-aligned.ref.png | Bin 0 -> 195 bytes + test/reference/clip-fill-rule.ref.png | Bin 0 -> 437 bytes + test/reference/clip-fill.argb32.ref.png | Bin 1031 -> 1064 bytes + test/reference/clip-fill.rgb24.ref.png | Bin 1031 -> 1064 bytes + .../clip-group-shapes-circles.argb32.ref.png | Bin 1525 -> 1526 bytes + .../clip-group-shapes-circles.rgb24.ref.png | Bin 1525 -> 1526 bytes + test/reference/clip-intersect.argb32.ref.png | Bin 200 -> 220 bytes + test/reference/clip-intersect.rgb24.ref.png | Bin 200 -> 220 bytes + test/reference/clip-nesting.ref.png | Bin 0 -> 1094 bytes + test/reference/clip-operator.ref.png | Bin 0 -> 8257 bytes + test/reference/clip-push-group.argb32.ref.png | Bin 164 -> 164 bytes + test/reference/clip-push-group.rgb24.ref.png | Bin 164 -> 164 bytes + test/reference/clip-shape.argb32.ref.png | Bin 3073 -> 2945 bytes + test/reference/clip-shape.rgb24.ref.png | Bin 3073 -> 2945 bytes + .../reference/clip-stroke-unbounded.argb32.ref.png | Bin 0 -> 4105 bytes + test/reference/clip-stroke-unbounded.ref.png | Bin 0 -> 4127 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 0 -> 3517 bytes + test/reference/clip-stroke.argb32.ref.png | Bin 0 -> 1551 bytes + test/reference/clip-stroke.ref.png | Bin 1419 -> 0 bytes + test/reference/clip-stroke.rgb24.ref.png | Bin 0 -> 1551 bytes + test/reference/clip-text.argb32.ref.png | Bin 928 -> 918 bytes + test/reference/clip-text.rgb24.ref.png | Bin 928 -> 918 bytes + test/reference/clip-twice.ref.png | Bin 0 -> 1344 bytes + test/reference/clip-unbounded.ref.png | Bin 0 -> 100 bytes + test/reference/clipped-group.argb32.ref.png | Bin 342 -> 315 bytes + test/reference/clipped-group.rgb24.ref.png | Bin 342 -> 315 bytes + test/reference/dash-curve.argb32.ref.png | Bin 0 -> 41069 bytes + test/reference/dash-curve.ref.png | Bin 40945 -> 0 bytes + test/reference/dash-curve.rgb24.ref.png | Bin 0 -> 41069 bytes + test/reference/dash-zero-length.ref.png | Bin 0 -> 230 bytes + test/reference/degenerate-arc.argb32.ref.png | Bin 0 -> 639 bytes + test/reference/degenerate-arc.ref.png | Bin 692 -> 0 bytes + test/reference/degenerate-arc.rgb24.ref.png | Bin 0 -> 639 bytes + test/reference/degenerate-dash.argb32.ref.png | Bin 0 -> 1908 bytes + test/reference/degenerate-dash.ref.png | Bin 1985 -> 0 bytes + test/reference/degenerate-dash.rgb24.ref.png | Bin 0 -> 1908 bytes + test/reference/degenerate-path.ref.png | Bin 0 -> 251 bytes + test/reference/device-offset-positive.ref.png | Bin 0 -> 139 bytes + test/reference/device-offset.ref.png | Bin 0 -> 137 bytes + test/reference/egl-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/extended-blend-alpha-mask.ref.png | Bin 0 -> 9221 bytes + test/reference/extended-blend-alpha.ref.png | Bin 0 -> 9406 bytes + test/reference/extended-blend-mask.ref.png | Bin 0 -> 3971 bytes + test/reference/extended-blend-solid-alpha.ref.png | Bin 0 -> 9406 bytes + test/reference/extended-blend-solid.ref.png | Bin 0 -> 4063 bytes + test/reference/extended-blend.ref.png | Bin 0 -> 4063 bytes + test/reference/fallback.ref.png | Bin 0 -> 4106 bytes + test/reference/fill-alpha.argb32.ref.png | Bin 2736 -> 2815 bytes + test/reference/fill-alpha.rgb24.ref.png | Bin 2736 -> 2815 bytes + .../fill-and-stroke-alpha-add.argb32.ref.png | Bin 556 -> 558 bytes + .../fill-and-stroke-alpha-add.rgb24.ref.png | Bin 556 -> 558 bytes + .../reference/fill-and-stroke-alpha.argb32.ref.png | Bin 508 -> 513 bytes + test/reference/fill-and-stroke-alpha.rgb24.ref.png | Bin 508 -> 513 bytes + test/reference/fill-and-stroke.ref.png | Bin 0 -> 328 bytes + test/reference/fill-degenerate-sort-order.ref.png | Bin 0 -> 2410 bytes + test/reference/fill-empty.ref.png | Bin 0 -> 99 bytes + test/reference/fill-missed-stop.ref.png | Bin 0 -> 455 bytes + test/reference/fill-rule.ref.png | Bin 0 -> 2086 bytes + test/reference/fill.image.argb32.ref.png | Bin 0 -> 1482 bytes + test/reference/fill.image.rgb24.ref.png | Bin 0 -> 1482 bytes + test/reference/finer-grained-fallbacks.ref.png | Bin 0 -> 1151 bytes + .../ft-text-vertical-layout-type1.argb32.ref.png | Bin 3062 -> 3084 bytes + .../ft-text-vertical-layout-type1.rgb24.ref.png | Bin 3062 -> 3084 bytes + .../ft-text-vertical-layout-type3.argb32.ref.png | Bin 0 -> 3610 bytes + .../ft-text-vertical-layout-type3.ref.png | Bin 3608 -> 0 bytes + .../ft-text-vertical-layout-type3.rgb24.ref.png | Bin 0 -> 3610 bytes + test/reference/gl-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/gradient-alpha.ref.png | Bin 0 -> 125 bytes + test/reference/gradient-constant-alpha.ref.png | Bin 0 -> 111 bytes + test/reference/gradient-zero-stops-mask.ref.png | Bin 0 -> 86 bytes + test/reference/gradient-zero-stops.ref.png | Bin 0 -> 105 bytes + test/reference/group-unaligned.argb32.ref.png | Bin 427 -> 494 bytes + test/reference/group-unaligned.rgb24.ref.png | Bin 427 -> 494 bytes + test/reference/halo-transform.argb32.ref.png | Bin 15063 -> 15231 bytes + test/reference/halo-transform.rgb24.ref.png | Bin 15063 -> 15231 bytes + test/reference/halo.argb32.ref.png | Bin 0 -> 8666 bytes + test/reference/halo.ref.png | Bin 8774 -> 0 bytes + test/reference/halo.rgb24.ref.png | Bin 0 -> 8666 bytes + test/reference/hatchings.argb32.ref.png | Bin 0 -> 91041 bytes + test/reference/hatchings.ref.png | Bin 95333 -> 0 bytes + test/reference/hatchings.rgb24.ref.png | Bin 0 -> 91041 bytes + test/reference/image-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/inverted-clip.rgb24.ref.png | Bin 0 -> 1333 bytes + .../large-twin-antialias-mixed.argb32.ref.png | Bin 16660 -> 16442 bytes + .../large-twin-antialias-mixed.rgb24.ref.png | Bin 16660 -> 16442 bytes + test/reference/leaky-dashed-stroke.argb32.ref.png | Bin 9387 -> 9286 bytes + test/reference/leaky-dashed-stroke.rgb24.ref.png | Bin 9387 -> 9286 bytes + ...line-width-large-overlap-rotated.argb32.ref.png | Bin 427 -> 436 bytes + .../line-width-large-overlap-rotated.rgb24.ref.png | Bin 427 -> 436 bytes + .../line-width-overlap-rotated.argb32.ref.png | Bin 828 -> 716 bytes + .../line-width-overlap-rotated.rgb24.ref.png | Bin 828 -> 716 bytes + test/reference/linear-gradient-one-stop.ref.png | Bin 0 -> 225 bytes + .../linear-gradient-subset.argb32.ref.png | Bin 820 -> 812 bytes + .../reference/linear-gradient-subset.rgb24.ref.png | Bin 820 -> 812 bytes + test/reference/linear-gradient.argb32.ref.png | Bin 974 -> 960 bytes + test/reference/linear-gradient.rgb24.ref.png | Bin 974 -> 960 bytes + test/reference/mask-alpha.ref.png | Bin 0 -> 644 bytes + test/reference/mask-ctm.ref.png | Bin 0 -> 129 bytes + test/reference/mask-surface-ctm.ref.png | Bin 0 -> 129 bytes + test/reference/mask.ref.png | Bin 0 -> 8565 bytes + test/reference/new-sub-path.ref.png | Bin 0 -> 408 bytes + test/reference/nil-surface.ref.png | Bin 0 -> 107 bytes + test/reference/operator-alpha.ref.png | Bin 0 -> 280 bytes + test/reference/operator-clear.argb32.ref.png | Bin 0 -> 1068 bytes + test/reference/operator-clear.ref.png | Bin 0 -> 1071 bytes + test/reference/operator-source.ref.png | Bin 0 -> 5614 bytes + test/reference/operator.ref.png | Bin 0 -> 238 bytes + test/reference/over-above-source.ref.png | Bin 0 -> 557 bytes + test/reference/over-around-source.ref.png | Bin 0 -> 633 bytes + test/reference/over-below-source.ref.png | Bin 0 -> 447 bytes + test/reference/over-between-source.ref.png | Bin 0 -> 607 bytes + test/reference/overlapping-boxes.ref.png | Bin 0 -> 179 bytes + .../reference/overlapping-dash-caps.argb32.ref.png | Bin 0 -> 3952 bytes + test/reference/overlapping-dash-caps.ref.png | Bin 3979 -> 0 bytes + test/reference/overlapping-dash-caps.rgb24.ref.png | Bin 0 -> 3952 bytes + test/reference/overlapping-glyphs.ref.png | Bin 0 -> 2717 bytes + .../paint-with-alpha-clip-mask.argb32.ref.png | Bin 340 -> 351 bytes + .../paint-with-alpha-clip-mask.rgb24.ref.png | Bin 340 -> 351 bytes + test/reference/pass-through.ref.png | Bin 0 -> 221 bytes + test/reference/path-append.argb32.ref.png | Bin 6144 -> 6297 bytes + test/reference/path-append.rgb24.ref.png | Bin 6144 -> 6297 bytes + test/reference/pdf-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/pixman-rotate.ref.png | Bin 0 -> 260 bytes + test/reference/ps-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/push-group-color.argb32.ref.png | Bin 2892 -> 0 bytes + test/reference/push-group-color.ref.png | Bin 0 -> 2961 bytes + test/reference/push-group-color.rgb24.ref.png | Bin 2892 -> 0 bytes + test/reference/push-group.argb32.ref.png | Bin 0 -> 3097 bytes + test/reference/push-group.ref.png | Bin 0 -> 3062 bytes + test/reference/quartz-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/radial-gradient-source.ref.png | Bin 0 -> 408848 bytes + test/reference/random-clip.argb32.ref.png | Bin 0 -> 525539 bytes + test/reference/random-clip.ref.png | Bin 526034 -> 0 bytes + test/reference/random-clip.rgb24.ref.png | Bin 0 -> 525539 bytes + .../random-intersections-curves-eo.argb32.ref.png | Bin 245848 -> 244655 bytes + .../random-intersections-curves-eo.rgb24.ref.png | Bin 245848 -> 244655 bytes + .../random-intersections-curves-nz.argb32.ref.png | Bin 265249 -> 264447 bytes + .../random-intersections-curves-nz.rgb24.ref.png | Bin 265249 -> 264447 bytes + .../random-intersections-eo.argb32.ref.png | Bin 136632 -> 135591 bytes + .../random-intersections-eo.rgb24.ref.png | Bin 136632 -> 135591 bytes + .../random-intersections-nonzero.argb32.ref.png | Bin 142139 -> 141598 bytes + .../random-intersections-nonzero.rgb24.ref.png | Bin 142139 -> 141598 bytes + test/reference/record-fill-alpha.argb32.ref.png | Bin 0 -> 2822 bytes + test/reference/record-fill-alpha.ref.png | Bin 2812 -> 0 bytes + test/reference/record-fill-alpha.rgb24.ref.png | Bin 0 -> 2822 bytes + .../record-paint-alpha-clip-mask.argb32.ref.png | Bin 0 -> 321 bytes + .../reference/record-paint-alpha-clip-mask.ref.png | Bin 318 -> 0 bytes + .../record-paint-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 321 bytes + .../record1414x-fill-alpha.argb32.ref.png | Bin 0 -> 4244 bytes + test/reference/record1414x-fill-alpha.ref.png | Bin 4212 -> 0 bytes + .../reference/record1414x-fill-alpha.rgb24.ref.png | Bin 0 -> 4244 bytes + ...ecord1414x-paint-alpha-clip-mask.argb32.ref.png | Bin 560 -> 544 bytes + ...record1414x-paint-alpha-clip-mask.rgb24.ref.png | Bin 560 -> 544 bytes + test/reference/record2x-fill-alpha.argb32.ref.png | Bin 0 -> 5986 bytes + test/reference/record2x-fill-alpha.ref.png | Bin 5950 -> 0 bytes + test/reference/record2x-fill-alpha.rgb24.ref.png | Bin 0 -> 5986 bytes + .../record2x-paint-alpha-clip-mask.argb32.ref.png | Bin 534 -> 543 bytes + .../record2x-paint-alpha-clip-mask.rgb24.ref.png | Bin 534 -> 543 bytes + test/reference/record90-fill-alpha.argb32.ref.png | Bin 0 -> 2654 bytes + test/reference/record90-fill-alpha.ref.png | Bin 2650 -> 0 bytes + test/reference/record90-fill-alpha.rgb24.ref.png | Bin 0 -> 2654 bytes + .../record90-paint-alpha-clip-mask.argb32.ref.png | Bin 0 -> 317 bytes + .../record90-paint-alpha-clip-mask.ref.png | Bin 316 -> 0 bytes + .../record90-paint-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 317 bytes + .../record90-paint-alpha-clip.argb32.ref.png | Bin 0 -> 335 bytes + test/reference/record90-paint-alpha-clip.ref.png | Bin 320 -> 0 bytes + .../record90-paint-alpha-clip.rgb24.ref.png | Bin 0 -> 335 bytes + .../record90-paint-alpha-solid-clip.argb32.ref.png | Bin 254 -> 293 bytes + .../record90-paint-alpha-solid-clip.rgb24.ref.png | Bin 254 -> 293 bytes + .../recording-surface-extend-none.ref.png | Bin 0 -> 3153 bytes + .../reference/recording-surface-extend-pad.ref.png | Bin 0 -> 11200 bytes + .../recording-surface-extend-reflect.ref.png | Bin 0 -> 23967 bytes + .../recording-surface-extend-repeat.ref.png | Bin 0 -> 24091 bytes + test/reference/recording-surface-over.ref.png | Bin 0 -> 3153 bytes + test/reference/recording-surface-source.ref.png | Bin 0 -> 3153 bytes + test/reference/rel-path.ref.png | Bin 0 -> 197 bytes + test/reference/rotated-clip.argb32.ref.png | Bin 3773 -> 3829 bytes + test/reference/rotated-clip.rgb24.ref.png | Bin 3773 -> 3829 bytes + test/reference/scale-offset-similar.argb32.ref.png | Bin 9748 -> 9847 bytes + test/reference/scale-offset-similar.rgb24.ref.png | Bin 9748 -> 9847 bytes + test/reference/scale-offset.image.argb32.ref.png | Bin 0 -> 9847 bytes + test/reference/scale-offset.image.rgb24.ref.png | Bin 0 -> 9847 bytes + test/reference/scale-source-surface-paint.ref.png | Bin 0 -> 147 bytes + test/reference/set-source.ref.png | Bin 0 -> 120 bytes + test/reference/shape-general-convex.argb32.ref.png | Bin 2742 -> 2539 bytes + test/reference/shape-general-convex.rgb24.ref.png | Bin 2742 -> 2539 bytes + test/reference/shape-sierpinski.argb32.ref.png | Bin 63714 -> 54850 bytes + test/reference/shape-sierpinski.rgb24.ref.png | Bin 63714 -> 54850 bytes + test/reference/smask-fill.argb32.ref.png | Bin 1197 -> 1201 bytes + test/reference/smask-fill.rgb24.ref.png | Bin 1197 -> 1201 bytes + test/reference/smask-stroke.argb32.ref.png | Bin 1709 -> 1707 bytes + test/reference/smask-stroke.rgb24.ref.png | Bin 1709 -> 1707 bytes + test/reference/smask.argb32.ref.png | Bin 3414 -> 3436 bytes + test/reference/smask.rgb24.ref.png | Bin 3414 -> 3436 bytes + test/reference/source-surface-scale-paint.ref.png | Bin 0 -> 139 bytes + test/reference/stroke-clipped.argb32.ref.png | Bin 0 -> 5857 bytes + test/reference/stroke-clipped.ref.png | Bin 5790 -> 0 bytes + test/reference/stroke-clipped.rgb24.ref.png | Bin 0 -> 5857 bytes + test/reference/stroke-pattern.argb32.ref.png | Bin 1491 -> 1510 bytes + test/reference/stroke-pattern.rgb24.ref.png | Bin 1491 -> 1510 bytes + test/reference/stroke.image.argb32.ref.png | Bin 0 -> 1479 bytes + test/reference/stroke.image.rgb24.ref.png | Bin 0 -> 1479 bytes + test/reference/subsurface-outside-target.ref.png | Bin 0 -> 2063 bytes + test/reference/surface-pattern-operator.ref.png | Bin 0 -> 5217 bytes + test/reference/svg-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/text-pattern.ref.png | Bin 0 -> 3455 bytes + test/reference/text-rotate.argb32.ref.png | Bin 0 -> 16518 bytes + test/reference/text-rotate.ref.png | Bin 16667 -> 0 bytes + test/reference/text-rotate.rgb24.ref.png | Bin 0 -> 16518 bytes + test/reference/tiger.argb32.ref.png | Bin 93916 -> 94714 bytes + test/reference/tiger.rgb24.ref.png | Bin 93916 -> 94714 bytes + test/reference/tighten-bounds.ref.png | Bin 0 -> 9443 bytes + test/reference/trap-clip.ref.png | Bin 0 -> 5826 bytes + test/reference/twin-antialias-gray.argb32.ref.png | Bin 0 -> 3536 bytes + test/reference/twin-antialias-gray.ref.png | Bin 3948 -> 0 bytes + test/reference/twin-antialias-gray.rgb24.ref.png | Bin 0 -> 3536 bytes + test/reference/twin-antialias-mixed.argb32.ref.png | Bin 2230 -> 2359 bytes + test/reference/twin-antialias-mixed.rgb24.ref.png | Bin 2230 -> 2359 bytes + test/reference/twin-antialias-none.argb32.ref.png | Bin 690 -> 692 bytes + test/reference/twin-antialias-none.rgb24.ref.png | Bin 690 -> 692 bytes + .../twin-antialias-subpixel.argb32.ref.png | Bin 0 -> 3536 bytes + test/reference/twin-antialias-subpixel.ref.png | Bin 3948 -> 0 bytes + .../twin-antialias-subpixel.rgb24.ref.png | Bin 0 -> 3536 bytes + test/reference/twin.argb32.ref.png | Bin 0 -> 3536 bytes + test/reference/twin.ref.png | Bin 3948 -> 0 bytes + test/reference/twin.rgb24.ref.png | Bin 0 -> 3536 bytes + test/reference/unbounded-operator.argb32.ref.png | Bin 0 -> 2763 bytes + test/reference/unbounded-operator.ref.png | Bin 0 -> 2781 bytes + test/reference/unclosed-strokes.argb32.ref.png | Bin 1901 -> 0 bytes + test/reference/unclosed-strokes.ref.png | Bin 0 -> 1588 bytes + test/reference/unclosed-strokes.rgb24.ref.png | Bin 1901 -> 0 bytes + test/reference/user-font-proxy.argb32.ref.png | Bin 16941 -> 16971 bytes + test/reference/user-font-proxy.rgb24.ref.png | Bin 16941 -> 16971 bytes + test/reference/user-font.argb32.ref.png | Bin 0 -> 5882 bytes + test/reference/user-font.ref.png | Bin 6209 -> 0 bytes + test/reference/user-font.rgb24.ref.png | Bin 0 -> 5882 bytes + test/reference/world-map-fill.argb32.ref.png | Bin 57308 -> 57407 bytes + test/reference/world-map-fill.rgb24.ref.png | Bin 57308 -> 57407 bytes + test/reference/xcb-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/xlib-surface-source.ref.png | Bin 0 -> 377 bytes + test/reference/zero-mask.ref.png | Bin 0 -> 402 bytes + 283 files changed, 174 insertions(+), 157 deletions(-) + +commit 8e1e2a54147df32f0e9261d2b7b031eaf8396f06 +Author: Chris Wilson +Date: Tue Sep 30 11:47:44 2014 +0100 + + test: Remove redundant reference images + + If we have both a argb32 and rgb24 reference image that are identical, + we can replace them with a plain reference image. I also prefer to have + argb32/rgb24 versions of the reference images if rgb24 differs from the + plain reference. + + Signed-off-by: Chris Wilson + + test/reference/a1-clip-fill-rule.argb32.ref.png | Bin 236 -> 0 bytes + test/reference/a1-clip-fill-rule.rgb24.ref.png | Bin 218 -> 0 bytes + test/reference/alpha-similar.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/alpha-similar.rgb24.ref.png | Bin 88 -> 0 bytes + test/reference/big-empty-box.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/big-empty-box.rgb24.ref.png | Bin 108 -> 0 bytes + test/reference/big-empty-triangle.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/big-empty-triangle.rgb24.ref.png | Bin 108 -> 0 bytes + test/reference/big-little-box.argb32.ref.png | Bin 169 -> 0 bytes + test/reference/big-little-box.rgb24.ref.png | Bin 160 -> 0 bytes + test/reference/big-little-triangle.argb32.ref.png | Bin 409 -> 0 bytes + test/reference/big-little-triangle.rgb24.ref.png | Bin 328 -> 0 bytes + test/reference/bitmap-font.argb32.ref.png | Bin 950 -> 0 bytes + test/reference/bitmap-font.rgb24.ref.png | Bin 871 -> 0 bytes + test/reference/bug-source-cu.argb32.ref.png | Bin 3815 -> 0 bytes + test/reference/bug-source-cu.rgb24.ref.png | Bin 3211 -> 0 bytes + test/reference/clear.argb32.ref.png | Bin 692 -> 0 bytes + test/reference/clear.rgb24.ref.png | Bin 617 -> 0 bytes + test/reference/clip-device-offset.argb32.ref.png | Bin 175 -> 0 bytes + test/reference/clip-device-offset.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/clip-fill-eo-unbounded.argb32.ref.png | Bin 4197 -> 0 bytes + test/reference/clip-fill-eo-unbounded.rgb24.ref.png | Bin 3551 -> 0 bytes + test/reference/clip-fill-nz-unbounded.argb32.ref.png | Bin 4197 -> 0 bytes + test/reference/clip-fill-nz-unbounded.rgb24.ref.png | Bin 3551 -> 0 bytes + .../clip-fill-rule-pixel-aligned.argb32.ref.png | Bin 195 -> 0 bytes + .../clip-fill-rule-pixel-aligned.rgb24.ref.png | Bin 165 -> 0 bytes + test/reference/clip-fill-rule.argb32.ref.png | Bin 437 -> 0 bytes + test/reference/clip-fill-rule.rgb24.ref.png | Bin 393 -> 0 bytes + test/reference/clip-nesting.argb32.ref.png | Bin 1044 -> 0 bytes + test/reference/clip-nesting.rgb24.ref.png | Bin 936 -> 0 bytes + test/reference/clip-operator.argb32.ref.png | Bin 8257 -> 0 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3288 -> 0 bytes + test/reference/clip-stroke-unbounded.argb32.ref.png | Bin 4127 -> 0 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 3566 -> 0 bytes + test/reference/clip-twice.argb32.ref.png | Bin 1358 -> 0 bytes + test/reference/clip-twice.rgb24.ref.png | Bin 1195 -> 0 bytes + test/reference/clip-unbounded.argb32.ref.png | Bin 100 -> 0 bytes + test/reference/clip-unbounded.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/dash-zero-length.argb32.ref.png | Bin 230 -> 0 bytes + test/reference/dash-zero-length.rgb24.ref.png | Bin 208 -> 0 bytes + test/reference/degenerate-path.argb32.ref.png | Bin 251 -> 0 bytes + test/reference/degenerate-path.rgb24.ref.png | Bin 219 -> 0 bytes + test/reference/device-offset-positive.argb32.ref.png | Bin 139 -> 0 bytes + test/reference/device-offset-positive.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/device-offset.argb32.ref.png | Bin 137 -> 0 bytes + test/reference/device-offset.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/egl-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/egl-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + .../reference/extended-blend-alpha-mask.argb32.ref.png | Bin 9221 -> 0 bytes + test/reference/extended-blend-alpha-mask.rgb24.ref.png | Bin 4597 -> 0 bytes + test/reference/extended-blend-alpha.argb32.ref.png | Bin 9406 -> 0 bytes + test/reference/extended-blend-alpha.rgb24.ref.png | Bin 5740 -> 0 bytes + test/reference/extended-blend-mask.argb32.ref.png | Bin 3971 -> 0 bytes + test/reference/extended-blend-mask.rgb24.ref.png | Bin 3643 -> 0 bytes + .../extended-blend-solid-alpha.argb32.ref.png | Bin 9406 -> 0 bytes + .../reference/extended-blend-solid-alpha.rgb24.ref.png | Bin 5740 -> 0 bytes + test/reference/extended-blend-solid.argb32.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend-solid.rgb24.ref.png | Bin 3775 -> 0 bytes + test/reference/extended-blend.argb32.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend.rgb24.ref.png | Bin 3775 -> 0 bytes + test/reference/fallback.argb32.ref.png | Bin 4059 -> 0 bytes + test/reference/fallback.rgb24.ref.png | Bin 3139 -> 0 bytes + test/reference/fill-and-stroke.argb32.ref.png | Bin 312 -> 0 bytes + test/reference/fill-and-stroke.rgb24.ref.png | Bin 283 -> 0 bytes + .../fill-degenerate-sort-order.argb32.ref.png | Bin 2400 -> 0 bytes + .../reference/fill-degenerate-sort-order.rgb24.ref.png | Bin 2049 -> 0 bytes + test/reference/fill-empty.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/fill-empty.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/fill-missed-stop.argb32.ref.png | Bin 455 -> 0 bytes + test/reference/fill-missed-stop.rgb24.ref.png | Bin 382 -> 0 bytes + test/reference/fill-rule.argb32.ref.png | Bin 2065 -> 0 bytes + test/reference/fill-rule.rgb24.ref.png | Bin 1803 -> 0 bytes + test/reference/finer-grained-fallbacks.argb32.ref.png | Bin 1068 -> 0 bytes + test/reference/finer-grained-fallbacks.rgb24.ref.png | Bin 837 -> 0 bytes + test/reference/gl-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/gl-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/gradient-alpha.argb32.ref.png | Bin 125 -> 0 bytes + test/reference/gradient-alpha.rgb24.ref.png | Bin 119 -> 0 bytes + test/reference/gradient-constant-alpha.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/gradient-constant-alpha.rgb24.ref.png | Bin 106 -> 0 bytes + test/reference/gradient-zero-stops-mask.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/gradient-zero-stops-mask.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/gradient-zero-stops.argb32.ref.png | Bin 105 -> 0 bytes + test/reference/gradient-zero-stops.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/image-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/image-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/linear-gradient-one-stop.argb32.ref.png | Bin 225 -> 0 bytes + test/reference/linear-gradient-one-stop.rgb24.ref.png | Bin 174 -> 0 bytes + test/reference/mask-alpha.argb32.ref.png | Bin 632 -> 0 bytes + test/reference/mask-alpha.rgb24.ref.png | Bin 589 -> 0 bytes + test/reference/mask-ctm.argb32.ref.png | Bin 129 -> 0 bytes + test/reference/mask-ctm.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/mask-surface-ctm.argb32.ref.png | Bin 129 -> 0 bytes + test/reference/mask-surface-ctm.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/mask.argb32.ref.png | Bin 8565 -> 0 bytes + test/reference/mask.rgb24.ref.png | Bin 7135 -> 0 bytes + test/reference/new-sub-path.argb32.ref.png | Bin 408 -> 0 bytes + test/reference/new-sub-path.rgb24.ref.png | Bin 371 -> 0 bytes + test/reference/nil-surface.argb32.ref.png | Bin 107 -> 0 bytes + test/reference/nil-surface.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/operator-alpha.argb32.ref.png | Bin 280 -> 0 bytes + test/reference/operator-alpha.rgb24.ref.png | Bin 205 -> 0 bytes + test/reference/operator-clear.argb32.ref.png | Bin 1071 -> 0 bytes + test/reference/operator-clear.rgb24.ref.png | Bin 946 -> 0 bytes + test/reference/operator-source.argb32.ref.png | Bin 5614 -> 0 bytes + test/reference/operator-source.rgb24.ref.png | Bin 4012 -> 0 bytes + test/reference/operator.argb32.ref.png | Bin 238 -> 0 bytes + test/reference/operator.rgb24.ref.png | Bin 189 -> 0 bytes + test/reference/over-above-source.argb32.ref.png | Bin 564 -> 0 bytes + test/reference/over-above-source.rgb24.ref.png | Bin 465 -> 0 bytes + test/reference/over-around-source.argb32.ref.png | Bin 633 -> 0 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 499 -> 0 bytes + test/reference/over-below-source.argb32.ref.png | Bin 447 -> 0 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 385 -> 0 bytes + test/reference/over-between-source.argb32.ref.png | Bin 596 -> 0 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 463 -> 0 bytes + test/reference/overlapping-boxes.argb32.ref.png | Bin 179 -> 0 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 170 -> 0 bytes + test/reference/overlapping-glyphs.argb32.ref.png | Bin 2717 -> 0 bytes + test/reference/overlapping-glyphs.rgb24.ref.png | Bin 1663 -> 0 bytes + test/reference/pass-through.argb32.ref.png | Bin 221 -> 0 bytes + test/reference/pass-through.rgb24.ref.png | Bin 158 -> 0 bytes + test/reference/pdf-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/pdf-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/pixman-rotate.argb32.ref.png | Bin 260 -> 0 bytes + test/reference/pixman-rotate.rgb24.ref.png | Bin 225 -> 0 bytes + test/reference/ps-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/ps-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/push-group.argb32.ref.png | Bin 3062 -> 0 bytes + test/reference/push-group.rgb24.ref.png | Bin 2899 -> 0 bytes + test/reference/quartz-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/quartz-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/radial-gradient-source.argb32.ref.png | Bin 408848 -> 0 bytes + test/reference/radial-gradient-source.rgb24.ref.png | Bin 263908 -> 0 bytes + .../recording-surface-extend-none.argb32.ref.png | Bin 3153 -> 0 bytes + .../recording-surface-extend-none.rgb24.ref.png | Bin 3145 -> 0 bytes + .../recording-surface-extend-pad.argb32.ref.png | Bin 11200 -> 0 bytes + .../recording-surface-extend-pad.rgb24.ref.png | Bin 12586 -> 0 bytes + .../recording-surface-extend-reflect.argb32.ref.png | Bin 23967 -> 0 bytes + .../recording-surface-extend-reflect.rgb24.ref.png | Bin 23930 -> 0 bytes + .../recording-surface-extend-repeat.argb32.ref.png | Bin 24091 -> 0 bytes + .../recording-surface-extend-repeat.rgb24.ref.png | Bin 24075 -> 0 bytes + test/reference/recording-surface-over.argb32.ref.png | Bin 3153 -> 0 bytes + test/reference/recording-surface-over.rgb24.ref.png | Bin 3145 -> 0 bytes + test/reference/recording-surface-source.argb32.ref.png | Bin 3153 -> 0 bytes + test/reference/recording-surface-source.rgb24.ref.png | Bin 3146 -> 0 bytes + test/reference/rel-path.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/rel-path.rgb24.ref.png | Bin 216 -> 0 bytes + .../scale-source-surface-paint.argb32.ref.png | Bin 147 -> 0 bytes + .../reference/scale-source-surface-paint.rgb24.ref.png | Bin 117 -> 0 bytes + test/reference/set-source.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/set-source.rgb24.ref.png | Bin 101 -> 0 bytes + .../source-surface-scale-paint.argb32.ref.png | Bin 139 -> 0 bytes + .../reference/source-surface-scale-paint.rgb24.ref.png | Bin 114 -> 0 bytes + .../reference/subsurface-outside-target.argb32.ref.png | Bin 2063 -> 0 bytes + test/reference/subsurface-outside-target.rgb24.ref.png | Bin 1648 -> 0 bytes + test/reference/surface-pattern-operator.argb32.ref.png | Bin 5217 -> 0 bytes + test/reference/surface-pattern-operator.rgb24.ref.png | Bin 1942 -> 0 bytes + test/reference/svg-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/svg-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/text-pattern.argb32.ref.png | Bin 3455 -> 0 bytes + test/reference/text-pattern.rgb24.ref.png | Bin 2684 -> 0 bytes + test/reference/tighten-bounds.argb32.ref.png | Bin 9115 -> 0 bytes + test/reference/tighten-bounds.rgb24.ref.png | Bin 8365 -> 0 bytes + test/reference/trap-clip.argb32.ref.png | Bin 5826 -> 0 bytes + test/reference/trap-clip.rgb24.ref.png | Bin 5435 -> 0 bytes + test/reference/unbounded-operator.argb32.ref.png | Bin 2781 -> 0 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 1333 -> 0 bytes + test/reference/xcb-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/xcb-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/xlib-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/xlib-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/zero-mask.argb32.ref.png | Bin 402 -> 0 bytes + test/reference/zero-mask.rgb24.ref.png | Bin 382 -> 0 bytes + 174 files changed, 0 insertions(+), 0 deletions(-) + +commit 93c21e3fd309781d0f48052097f5670dbe9af820 +Author: Ravi Nanjundappa +Date: Mon Sep 22 10:19:17 2014 +0530 + + test: Add test for egl-surface-source + + This test file attempts to use a EGL backend surface as a source + surface for all other backends. + + Signed-off-by: Ravi Nanjundappa + + test/Makefile.sources | 3 +- + test/egl-surface-source.c | 135 +++++++++++++++++++++ + test/reference/egl-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../egl-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../egl-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/egl-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/reference/egl-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + 7 files changed, 137 insertions(+), 1 deletion(-) + +commit 573ddfc3d5c08c37b95a21e0a1b34acecc646053 +Author: Ravi Nanjundappa +Date: Thu Sep 25 08:38:50 2014 +0530 + + src: check the surface backend for NULL + + This is a follow-up patch on top of 150c1e7044c57443d458e12bfc427d3a019cb60b + As discussed in the mailing list, http://lists.cairographics.org/archives/cairo/2014-September/025647.html, + check if the surfaces are of particular backend type or not, before proceeding further. + + These changes are based on _cairo_surface_is_xlib() and _cairo_surface_is_image() + + Signed-off-by: Ravi Nanjundappa + + src/cairo-qt-surface.cpp | 28 +++++++++++++++++++++++++--- + src/cairo-quartz-image-surface.c | 4 +++- + src/cairo-quartz-surface.c | 14 ++++++++++++++ + src/win32/cairo-win32-surface.c | 19 ++++++++++++++++++- + 4 files changed, 60 insertions(+), 5 deletions(-) + +commit 06b9f8fa2d179850cda8a0a103896bc011ce46d6 +Author: Chris Wilson +Date: Mon Sep 22 12:53:08 2014 +0100 + + stroke,traps: Emit join without loss of precision + + As the target renderers operate at a different sample resolution then we + use internally for coordinate representation, there is always a potential + for discrepancies in the line gradients when passing around trapezoids. + To overcome this, the protocol specification of trapezoids uses the full + lines and vertical range as opposed to vertices and so long as we always + use the same lines for conjoint trapezoids, they remain abutting in the + rasteriser. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=84115 + Testcase: bug-84115 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 3 + + src/cairo-bentley-ottmann.c | 232 +------------------------------- + src/cairo-line-inline.h | 48 +++++++ + src/cairo-line-private.h | 50 +++++++ + src/cairo-line.c | 306 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-path-stroke-traps.c | 55 +++++--- + src/cairo-traps-private.h | 8 +- + src/cairo-traps.c | 85 ++++++++++-- + 8 files changed, 530 insertions(+), 257 deletions(-) + +commit 5c03b20732b84370950f0c7e5648da86ef45a571 +Author: Chris Wilson +Date: Mon Sep 29 08:37:56 2014 +0100 + + test/coverage: Exercise invariance under mirror symmetry + + Massimo noticed that the record/record-flip were not being rasterised as + identical mirror images due to a half-subpixel offset in the tor scan + converter. This test attempts to reproduce this error by rendering a + rhombus around the origin of each cell (that is it generates 4 mirror + images of a triangle in the 4 different orientations0. The expectation + is that each pixel in the group is lit identically as the coverage is + identical. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=84396 + Signed-off-by: Chris Wilson + + test/coverage.c | 55 ++++++++++++++++++++++++++++++++ + test/reference/coverage-rhombus.ref.png | Bin 0 -> 7053 bytes + 2 files changed, 55 insertions(+) + +commit fbb0a260b707cb5f02a14cc368c6f2f0d63564c3 +Author: Marc-André Lureau +Date: Tue Apr 2 21:00:20 2013 +0200 + + build-sys: do not try to build util/sphinx on Windows + + glib and dlfcn exist on windows, but sphinx code uses a lot of + Unix-only API + + Fixes the following build error on mingw-fedora + + CC cairo-boilerplate-system.lo + ../../../util/cairo-sphinx/sphinx.c:8:22: fatal error: sys/mman.h: No such file or directory + compilation terminated. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=63043 + Reviewed-by: Bryce Harrington + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42320793aa1b3e5a0b74e94a0aadf5d2b9ae5ce2 +Author: Bryce Harrington +Date: Wed Sep 24 11:37:58 2014 -0700 + + sphinx: Add ickle's explanation of what sphinx does + + util/cairo-sphinx/sphinx.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 80359e73d821516f411b25b977b442869fa5d0ad +Author: Chris Wilson +Date: Tue Sep 23 12:58:27 2014 +0100 + + test: Exercise stroking bugs with xlib/trapezoids + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=84115 + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/bug-84115.c | 61 ++++++++++++++++++++++++++++++++++ + test/reference/bug-84115.ref.png | Bin 0 -> 64233 bytes + test/reference/bug-84115.xlib.ref.png | Bin 0 -> 65033 bytes + 4 files changed, 62 insertions(+) + +commit 06a737b74d3bc925a2c32254f497e07b6d1af5ca +Author: Chris Wilson +Date: Wed Sep 24 09:57:31 2014 +0100 + + arc: Insert the initial point on the arc + + Currently the very first point on the arc will be the first interpreted + location along the spline used to approximate the arc. This will be + close, but not quite the exact point the user intended the arc to run + from, so begin the arc with a line-to the initial point. + + Signed-off-by: Chris Wilson + + src/cairo-arc.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit bdd0721dcddd6c4528c9518a2152cd154f746202 +Author: Bryce Harrington +Date: Tue Sep 23 16:41:36 2014 -0700 + + NEWS: Revise downscaling feature description + + Updated feature description using text from Bill. Also updated bugfix + list to include recent fixes. + + NEWS | 48 +++++++++++++++++++++++++++--------------------- + 1 file changed, 27 insertions(+), 21 deletions(-) + +commit 7cfebce15228c88ee122edb8ba575f9a609e36f4 +Author: Bryce Harrington +Date: Tue Sep 23 12:40:25 2014 -0700 + + build: Fix float endian configure test when using clang -O4 + + When using clang -O4, the compiled test object is output in bitcode + format rather than as an ELF object, so when we grep the test value from + the object it fails. To work around this, go ahead and link the test + object into an executable, and then grep against this native binary + instead of the compiler's intermediary object. + + We need to add __attribute__((used)) to ensure the d variable doesn't + get optimized out during linking, since it's not referenced in the + test's main(). + + Patch authored by cmuelle8 + + Reviewed-by: Bryce Harrington + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=63310 + + build/aclocal.float.m4 | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 9a19ef185884da1e7d5344b301f48aa2ba0f88b6 +Author: Adrian Johnson +Date: Mon Mar 24 19:08:10 2014 +1030 + + Fix compilation with bionic libc + + Refactor out a cairo_get_locale_decimal_point() routine to handle a case + where localeconv() is not available. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=70492 + Reviewed-by: Bryce Harrington + + [edit: Condensed cairo_get_locale_decimal_point and conditionalized + locale.h inclusion. -- bryce] + + src/cairo-cff-subset.c | 4 +--- + src/cairo-misc.c | 18 ++++++++++++++++++ + src/cairo-output-stream.c | 5 +---- + src/cairo-type1-subset.c | 5 +---- + src/cairoint.h | 3 +++ + 5 files changed, 24 insertions(+), 11 deletions(-) + +commit a02e29a12d82f177bdf99ed8cfd0c3b3b78c44da +Author: Bryce Harrington +Date: Mon Sep 22 15:48:49 2014 -0700 + + Don't return NULL to clients when getting device + + Return an error device instead + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=58061 + + src/cairo-cogl-surface.c | 2 +- + src/drm/cairo-drm.c | 9 ++++++--- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 150c1e7044c57443d458e12bfc427d3a019cb60b +Author: Bryce Harrington +Date: Mon Sep 22 15:41:24 2014 -0700 + + Don't return NULL to clients when getting image + + Return an error surface instead. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=58061 + + src/cairo-qt-surface.cpp | 2 +- + src/cairo-quartz-image-surface.c | 2 +- + src/win32/cairo-win32-surface.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 40e757679634ba6261b9df231ba5c706625e215d +Author: Bryce Harrington +Date: Mon Sep 22 15:06:54 2014 -0700 + + NEWS: Note that downscaling changes only affect image + fallback + + NEWS | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 402b456a3229f6c7f1550e66bbd8125c253a4ff1 +Author: Bryce Harrington +Date: Thu Jul 31 17:58:15 2014 -0700 + + gl: Increase default VBO size on GL to 1M + + The default VBO size was reduced from 256k to 16k because embedded + devices had trouble with the larger memory demands of a big VBO. My + testing[1] indicates this incurred a 5% performance loss on at least one + of Cairo's performance tests. Further testing showed that with + late-model graphics cards, further performance benefits can be seen with + even larger VBO sizes, up to 8.3% at 1M for Intel. + + Now that we can set the vbo size differently for different backends, set + it to the lower value (16k) for EGL, and higher (1M) for GL. + + 1: http://www.bryceharrington.org/wordpress/2013/08/vbo-size/ + + Signed-off-by: Bryce Harrington + + src/cairo-egl-context.c | 6 ++++++ + src/cairo-gl-private.h | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit aa820c13d78a4fc1c87da0da9012ee532aa2d50a +Author: Bryce Harrington +Date: Thu Jul 31 17:43:03 2014 -0700 + + gl: Track the VBO size as a property of the ctx + + Change suggested by Chris Wilson. This will enable setting different + vbo sizes for GL vs. EGL. + + Signed-off-by: Bryce Harrington + + src/cairo-gl-composite.c | 3 ++- + src/cairo-gl-device.c | 4 +++- + src/cairo-gl-info.c | 22 ++++++++++------------ + src/cairo-gl-private.h | 3 ++- + 4 files changed, 17 insertions(+), 15 deletions(-) + +commit 036f47c34579259fa86d0193797b6f83fe79bbeb +Author: Bryce Harrington +Date: Mon Aug 19 19:38:26 2013 -0700 + + cairo-gl: Make VBO size run-time settable + + The default VBO size was reduced from 256k to 16k last year in commit + 90860241 due to problems with larger VBOs on embedded hardware. + However, that change resulted in a 5% performance impact to the + firefox-fishbowl benchmark when using the spans or traps compositors. + + This patch doesn't change the VBO size, but does permit it to be + altered via an environment variable, to facilitate testing. + + Signed-off-by: Bryce Harrington + + src/cairo-gl-composite.c | 2 +- + src/cairo-gl-device.c | 2 +- + src/cairo-gl-info.c | 22 ++++++++++++++++++++++ + src/cairo-gl-private.h | 8 ++++++-- + 4 files changed, 30 insertions(+), 4 deletions(-) + +commit 8479b6086710e11c81c0059ffc5fa6a71d14256c +Author: Ravi Nanjundappa +Date: Tue Sep 16 10:18:02 2014 +0530 + + test: Add test oversized egl surfaces + + This test exercises error scenario when creating over sized egl surface + that is larger than maximum framebuffer or texture dimensions of the + context + + Signed-off-by: Ravi Nanjundappa + + test/Makefile.am | 4 ++ + test/Makefile.sources | 3 ++ + test/egl-oversized-surface.c | 117 +++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 124 insertions(+) + +commit 3d68352e3c00b836e50c2eacb0b80ae5a0e15a65 +Author: Bryce Harrington +Date: Thu Sep 18 13:18:48 2014 -0700 + + NEWS: Drop unfinished thought + + NEWS | 1 - + 1 file changed, 1 deletion(-) + +commit 54670ec13d64efa94f552b5473c1f15a9db1cecd +Author: Bryce Harrington +Date: Wed Sep 17 20:27:13 2014 -0700 + + AUTHORS: Add Ravi, myself, and a couple other frequent contributors + + AUTHORS | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 33a54e7c204c4bb7fb0f1f2844608a78ea317db4 +Author: Bryce Harrington +Date: Wed Sep 17 20:25:37 2014 -0700 + + README: Update required dependencies + + Also adds mention of the skia backend. + + README | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +commit d1fa4d44fe6b70eba6d5f620c5c4a6c122cc7fc8 +Author: Bryce Harrington +Date: Wed Sep 17 20:04:01 2014 -0700 + + NEWS: Bring up to date with recent bug fixes. + + NEWS | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 66 insertions(+), 3 deletions(-) + +commit e0c0a673ee757615bd3d22f46767535e9f53d6f5 +Author: Bryce Harrington +Date: Wed Sep 17 17:14:01 2014 -0700 + + Disable font options for xcb. + + This patch makes a bunch of tests pass again. The first hunk one fixes a + shameful oversight (whoops), the second one effectively reverts + e691d242. That change broke 102 xcb and 70 xlib tests, including a + bunch of *twin-antialias-* test cases. Patch thanks to Uli Schlachter. + + Signed-off-by: Bryce Harrington + + src/cairo-xcb-screen.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 0aa43ed886c0f8468a21a470f2f024bd4d8a4513 +Author: Adrian Johnson +Date: Sun Sep 14 22:02:12 2014 +0930 + + win32 printing: fix image scale when GDI scale is not identity + + src/win32/cairo-win32-printing-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit e691d242d592a8556e25659fb091a2031abee4c9 +Author: Lukáš Lalinský +Date: Wed Sep 3 22:53:55 2014 +0200 + + xcb: Initialize font options from Xft resources + + There is a similar code in the Xlib backend. The logic here is the same, but + XCB doesn't support X resources directly, so there is some custom code + to get and parse the resources from the root window. + + Signed-off-by: Lukáš Lalinský + Reviewed-by: Uli Schlachter + + src/Makefile.sources | 1 + + src/cairo-xcb-private.h | 19 +++ + src/cairo-xcb-resources.c | 304 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-xcb-screen.c | 108 ++++++++++++++++ + src/cairo-xcb-surface.c | 6 +- + 5 files changed, 435 insertions(+), 3 deletions(-) + +commit e77d0a5611fedce2bfa0940ff62f003c1f9cfa08 +Author: David Weiß +Date: Fri Sep 5 17:03:26 2014 +0200 + + made paths to pixman, libpng and zlib configurable by commandline for win32 builds + + Reviewed-by: Bryce Harrington + + build/Makefile.win32.common | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +commit 3b9d7e583f376413df655f778a3ef04537e8a5b6 +Author: Ravi Nanjundappa +Date: Fri Sep 5 12:15:02 2014 +0530 + + qt: Suppress warnings in qt backend build + + This patch fixes majorly 2 kinds of warning issues: + + (1) + cc1plus: warning: command line option '-Wold-style-definition' is valid for Ada/C/ObjC but not for C++ [enabled by default] + cc1plus: warning: command line option '-Wdeclaration-after-statement' is valid for C/ObjC but not for C++ [enabled by default] + cc1plus: warning: command line option '-Wnested-externs' is valid for C/ObjC but not for C++ [enabled by default] + cc1plus: warning: command line option '-Wstrict-prototypes' is valid for Ada/C/ObjC but not for C++ [enabled by default] + cc1plus: warning: command line option '-Wmissing-prototypes' is valid for Ada/C/ObjC but not for C++ [enabled by default] + cc1plus: warning: command line option '-Wbad-function-cast' is valid for C/ObjC but not for C++ [enabled by default] + + Solution: Enable these warnings only for C compiler and not for C++ + + (2) + cairo-qt-surface.cpp: In function 'cairo_int_status_t _cairo_qt_surface_fill(void*, cairo_operator_t, const cairo_pattern_t*, const cairo_path_fixed_t*, cairo_fill_rule_t, double, cairo_antialias_t, const cairo_clip_t*)': + cairo-qt-surface.cpp:852:5: warning: inlining failed in call to 'PatternToBrushConverter::PatternToBrushConverter(const cairo_pattern_t*)': --param max-inline-insns-single limit reached [-Winline] + cairo-qt-surface.cpp:1339:38: warning: called from here [-Winline] + cairo-qt-surface.cpp:390:1: warning: inlining failed in call to 'QPainterPath _ZL10path_to_qtPK17_cairo_path_fixedPK13_cairo_matrix.part.13()': call is unlikely and code size would grow [-Winline] + cairo-qt-surface.cpp:1306:1: warning: called from here [-Winline] + cairo-qt-surface.cpp:1051:5: warning: inlining failed in call to 'PatternToBrushConverter::~PatternToBrushConverter()': call is unlikely and code size would grow [-Winline] + + Solution: Add __attribute__ ((noinline)) to the function as mentioned in + http://stackoverflow.com/questions/11724235/warning-for-template-with-g-o2-or-os-o-o1 (Edit 3) + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + + build/configure.ac.warnings | 13 +++++++------ + src/cairo-qt-surface.cpp | 9 ++++++--- + 2 files changed, 13 insertions(+), 9 deletions(-) + +commit 29a8b4e970379ca04a7db8e63c71bb34c0e349ce +Author: Maks Naumov +Date: Wed Aug 20 09:52:45 2014 -0700 + + Fix _cairo_mesh_pattern_equal() when cairo_mesh_patch_t structs are different + + Signed-off-by: Maks Naumov + Reviewed-by: Bryce Harrington + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6bf829d8953fac82ccc80618c6cae41346e483f +Author: Maks Naumov +Date: Wed Aug 20 09:38:37 2014 -0700 + + Fix font x_scale value in _compute_transform() + + Signed-off-by: Maks Naumov + Reviewed-by: Bryce Harrington + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c6ae5b197623867e2baca0bf4fe2907ea55536f5 +Author: Ravi Nanjundappa +Date: Mon Aug 25 09:28:40 2014 +0530 + + test: Fix null pointer issue reported by cppcheck static analysis tool + + cppcheck analysis tool reports the following issues when run on the + latest Cairo source. + + $ grep "(error)" cppcheck_error_log.txt + [test/pdf-mime-data.c:58]: (error) Possible null pointer dereference: file - otherwise it is redundant to check if file is null at line 53 + [test/pdf-mime-data.c:75]: (error) Resource leak: fp + $ + + The proposed changes fixes the above issues. + + And also it does some refactoring to print the appropriate error messages + for each error condition in read_file() function and also to free the allocated + data buffer. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Chris Wilson + + test/pdf-mime-data.c | 25 ++++++++++++++----------- + 1 file changed, 14 insertions(+), 11 deletions(-) + +commit 52c4f0f2dafcc6e087a9c3c6d00c582fc272c2c2 +Author: Ravi Nanjundappa +Date: Thu Aug 21 18:18:34 2014 +0530 + + src: Fix memory issue reported by cppcheck static analysis tool + + cppcheck analysis tool reports the following issues when run on the + latest Cairo source. + + $ grep "(error)" cppcheck_error_log.txt + [src/skia/cairo-skia-surface.cpp:245]: (error) Memory leak: surface + $ + + The proposed changes fixes the above issues. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Chris Wilson + + src/skia/cairo-skia-surface.cpp | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a5f51588afd9d5629b03297eb29ff46350b6ba50 +Author: Chris Wilson +Date: Mon Aug 25 08:55:24 2014 +0100 + + traps,xcb: Set the box count after filtering + + After converting, the number of boxes should only count the number of + non-zero boxes and forget about the zero-sized boxes we skipped over. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81699 + Signed-off-by: Chris Wilson + + src/cairo-traps-compositor.c | 4 ++-- + src/cairo-xcb-surface-render.c | 5 +++-- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 13a09526d2120c244471e03b6ae979016ef88e83 +Author: Chris Wilson +Date: Sat Aug 23 14:16:55 2014 +0100 + + traps,xcb: Prefilter zero-area boxes when converting traps + + The rectangular tesselation routines rely on the presuming that all the + boxes it has to handle are already filtered to remove empty boxes. + + << /width 800 /height 600 >> surface context + 0.0848671 0 0 0.0848671 39.907812 5.608896 matrix transform + 8 0 m 12.417969 0 16 3.582031 16 8 c 16 12.417969 12.417969 16 8 16 c + 3.582031 16 0 12.417969 0 8 c 0 3.582031 3.582031 0 8 0 c h + clip + 16 0 m 8 8 l 16 16 l h + clip + 0 0 16 16 rectangle + fill + + Triggers the error given a traps tesselator like cairo-xlib. + + Reported-by: Henrique Lengler + Analyzed-by: Massimo + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81699 + Signed-off-by: Chris Wilson + + src/cairo-traps-compositor.c | 28 +++++++++++++++++----------- + src/cairo-xcb-surface-render.c | 29 ++++++++++++++++++----------- + 2 files changed, 35 insertions(+), 22 deletions(-) + +commit 545444ec1f79eab268647e9859efc9c8d1a10391 +Author: Uli Schlachter +Date: Sat Aug 23 14:38:36 2014 +0200 + + xcb: Correctly check for image surface for inplace upload + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=82987 + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 183ac1889f369743a86a8a2ff6b61486acda614e +Author: Maks Naumov +Date: Tue Aug 19 14:59:14 2014 -0700 + + Fix width and height args for _cairo_xcb_connection_copy_area() + + Found via static analysis. + + Signed-off-by: Maks Naumov + Reviewed-by: Uli Schlachter + + src/cairo-xcb-surface-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eab218d1e3b0f2a3c0ab33d3173c42cc57e9bf8c +Author: Ravi Nanjundappa +Date: Wed Aug 20 11:45:19 2014 +0530 + + configure.ac: configuration check to enable either gl or glesv2, not both at the same time + + A proposed solution for the discussion in + https://bugs.freedesktop.org/show_bug.cgi?id=57379#c12, + to avoid muliple definition of cairo_gl_* symbols when + both gl and glesv2 backends are enabled at the same time + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + + configure.ac | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 932548ef25864958ef966ffe83e7c945c3ff3cd4 +Author: Rodrigo Rivas Costa +Date: Tue Aug 19 00:09:50 2014 +0930 + + win32 print: fix cache_frozen assertions + + Bug 81709 + + src/win32/cairo-win32-printing-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 7736d08e22ffd7ab9968617164c7e027125b7755 +Author: Ravi Nanjundappa +Date: Wed Aug 6 09:49:59 2014 +0530 + + README : Update README file related to usage of FORMAT make variable + + Reformatted the README file to simplify the sentences. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + Reviewed-by: Chris Wilson + + test/README | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +commit c61aeddc44c8619a271151b2a2f6bf9f8ff2a18b +Author: Ravi Nanjundappa +Date: Tue Aug 5 14:31:37 2014 +0530 + + test: improve selective execution of Cairo tests based on FORMAT option + + This patch improves the patch "test: Selective execution of Cairo tests based on FORMAT option" + by extending the usage of FORMAT option even in the case of user not + providing TARGETS= option + + For ex: + (1). CAIRO_TESTS="zero-alpha" make test FORMAT=rgba + This command runs the zero-alpha test for all the backends with + argb32 content format and so on. + (2). CAIRO_TESTS="zero-alpha" make test FORMAT=rgba,rgb + This command runs the zero-alpha test for all the backends with + argb32 and rgb24 content formats. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + Reviewed-by: Chris Wilson + + boilerplate/cairo-boilerplate.c | 68 +++++++++++++++++++++++++++++++++-------- + 1 file changed, 55 insertions(+), 13 deletions(-) + +commit f8e0ecb5af8859e2bff26cb719b10b3a9784f6f1 +Author: Ravi Nanjundappa +Date: Thu Jul 24 14:19:21 2014 +0530 + + test: Selective execution of Cairo tests based on FORMAT option + + Added a new command line option FORMAT which can take rgb and/or rgba + values which enables the execution of tests only for the given FORMAT + For ex: + (1). CAIRO_TESTS="zero-alpha" make test TARGETS=ps2,image FORMAT=rgba,rgb + This command runs the zero-alpha test for both ps2 and image backends + with argb32 and rgb24 content formats. + (2). CAIRO_TESTS="zero-alpha" make test TARGETS=ps2,image FORMAT=rgba + This command runs the zero-alpha test for both ps2 and image backends + with argb32 content format and so on. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + Reviewed-by: Chris Wilson + + boilerplate/cairo-boilerplate.c | 61 ++++++++++++++++++++++++++++++++++++----- + perf/Makefile.am | 3 +- + test/Makefile.am | 3 +- + 3 files changed, 58 insertions(+), 9 deletions(-) + +commit 1d9f4ae5208d86843a6001d10c9cb5b16df2b785 +Author: Bill Spitzak +Date: Tue Aug 12 15:48:04 2014 -0700 + + V5: Use NEAREST filter when possible + + (changed to use determinant funciton and remove debug printf) + + Modifies _cairo_matrix_has_unity_scale to return true for 90 degree rotations + by allowing error caused by inaccuracy in trig functions. + + This fails after 14 additions of M_PI_2 to itself as a float argument to + cairo_rotate, but the failure is in the detection of the integer translate, + not in the trig components. I believe this is due to the matrix inversion, + which may need similar rounding. + + Reviewed-by: Bryce Harrington + + src/cairo-matrix.c | 37 +++++++++++++++++++++++-------------- + src/cairo-pattern.c | 2 +- + src/cairo-xcb-surface-render.c | 7 ++----- + 3 files changed, 26 insertions(+), 20 deletions(-) + +commit 7d44f8d47e7c4389cf6a3baefc7fee7b5dffbb21 +Author: Ravi Nanjundappa +Date: Tue Aug 12 14:16:46 2014 +0530 + + test : build fix when --enable-pdf=no + + Though --enable-pdf=yes by default, when --enable-pdf=no, the cairo build + fails due to unavailability of cairo-pdf.h and related cairo pdf's apis. + The current changes fixes this issue by conditionally checking if PDF + surface is enabled or not. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + Tested-by: Bryce Harrington + + test/fallback-resolution.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c7ff9bb32e20679d6da4e8a2856be716e5bd9e12 +Author: Uli Schlachter +Date: Mon Jul 21 17:10:16 2014 +0200 + + Remove LTO support + + This just never worked too well and caused too many issues. I don't think anyone + will miss this. + + As mentioned in the below bug report, proper LTO support also requires using + special versions of ranlib, nm and ar which support the LTO object files. + Otherwise, calling the normal ranlib on an .a library breaks the list of + exported symbols and thus completely breaks the static library. + + This (partly) reverts the following commits: + + c3645d97ebd24c6f7ad850785d585aebc706a11c configure.ac: Add a --disable-lto configure option + d486ea30f1a58640a1178de74f705a73845b1cda configure: Conditionally include -flto + 0870c6fb5b39dcc04fa376123848adde2d06d2ce gcc-4.5 warnings and optimisation flags. + + (The last commit is the one which brought us -flto in the first place even + though it doesn't talk about this. It's also the one which is only reverted + partly.) + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=77060 + CC: Chris Wilson + Signed-off-by: Uli Schlachter + Reviewed-by: Bryce Harrington + + build/configure.ac.warnings | 16 ---------------- + 1 file changed, 16 deletions(-) + +commit 27c9923e9887bab5854ecccc81dda69687a0b9ae +Author: Chris Wilson +Date: Fri Aug 1 11:29:29 2014 +0100 + + xlib: Undo debug hack to force fallbacks + + Remove the debug hack from + + commit f337342c88092a251dc00476c4a9880d1cb90822 + Author: Bill Spitzak + Date: Fri Jul 18 18:46:26 2014 -0700 + + V6 image: Use convolution filters for sample reconstruction when downscaling + + as it forces the fallback image surface for xlib causing severe + performance degradation. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=82002 + Signed-off-by: Chris Wilson + Cc: Bill Spitzak + Cc: Bryce Harrington + + src/cairo-xlib-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f337342c88092a251dc00476c4a9880d1cb90822 +Author: Bill Spitzak +Date: Fri Jul 18 18:46:26 2014 -0700 + + V6 image: Use convolution filters for sample reconstruction when downscaling + + This version removes testing code and has some changes to match my current + pixman version. My proposed pixman patch (not finished yet) will produce + exactly the same results as this cairo patch. + + This code contains an all-new filter generator to replace the one that is + in pixman. Results in 222 pass/298 failed image tests, which is much better + than the previous versions of this patch. + + Filter generator (which should probably be in pixman): + + - Single filter, no "reconstruction" and "sample" filter + - Filters for derivative < 1 work + - Fixed IMPULSE and BOX + - Added TENT, CATMULL_ROM, NOTCH. Remove LANZCOS2. + - Renamed CUBIC to MITCHELL + + Cairo's filter settings: + + - CAIRO_FILTER_GOOD: uses BOX filter for scales less than .75 in either + direction. Uses PIXMAN_FILTER_GOOD (ie BILINEAR) otherwise. + + - CAIRO_FILTER_BEST: uses CATMULL filter always. Upscaling more than 2x will + produce anti-aliased square pixels, similar to OS/X. + + - CAIRO_FILTER_GAUSSIAN: this obsolete value is used to test other filters. + The program must declare and poke the filter into the static varialbe + ikernel. This should be removed for production code. + + NYI: This version uses the fallback for xlib always. The xlib and xcb backends + must be rewritten to use the fallback version if filtering is needed. Or the + filtering code must be moved to XRender. + + src/cairo-image-source.c | 420 ++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-xlib-display.c | 2 +- + 2 files changed, 420 insertions(+), 2 deletions(-) + +commit e71b917bbfc881ddd6ae6ed4367efd328a95af93 +Author: Bryce Harrington +Date: Thu Jul 24 18:41:03 2014 -0700 + + xlib: Fix mispelling in a comment + + src/cairo-xlib-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 82b4781f18d4dc3d368b04a436f854a8f0cff1e1 +Author: Bryce Harrington +Date: Mon Jul 21 15:05:14 2014 -0700 + + cairo-wideint: Fix typo in two cairo_uint128 functions + + _cairo_int128_negate and _cairo_int128_not are #defines of + _cairo_uint128_negate and _cairo_uint128_not respectively. The function + implementations should use the actual function name not the aliases. On + systems without a uint128 type, these could lead to build issues. + + Credit for finding this go to Dr. Peter Barnes, LLNL. + + src/cairo-wideint.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 9e6ceb23b45b7da19911b38eddb7f42f921929b1 +Author: Behdad Esfahbod +Date: Wed Jul 23 12:12:04 2014 -0400 + + More binary mode for Windows + + Based on: + https://github.com/Alexpux/MINGW-packages/blob/master/mingw-w64-cairo/0012-more-binary-mode.mingw.patch + + boilerplate/cairo-boilerplate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 23dce494d1850ee28a9c8d67972052c5a784cacf +Author: Behdad Esfahbod +Date: Wed Jul 23 12:09:17 2014 -0400 + + Binary mode in any2ppm + + From: + https://github.com/Alexpux/MINGW-packages/blob/master/mingw-w64-cairo/0010-binary-mode-in-any2ppm.mingw.patch + + test/any2ppm.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit f4dbba26d4fc571e0621f3c7a98196c501f8bcc5 +Author: Behdad Esfahbod +Date: Mon Jul 14 15:54:38 2014 -0400 + + [cairo-trace] Work around fontconfig :charset= parse format change + + As dicussed on the mailing list. + + util/cairo-script/cairo-script-operators.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 2a37cbbabc00c7474be5baa25f848778b1773b2c +Author: Bryce Harrington +Date: Tue Jul 8 15:53:41 2014 -0700 + + configure.ac: Fix broken build for Qt backend + + When --enable-qt is specified, the build will break due to missing + libstdc++: + + CCLD cairo-test-suite + /usr/bin/ld: ../boilerplate/.libs/libcairoboilerplate.a(libcairoboilerplate_cxx_la-cairo-boilerplate-qt.o): undefined reference to symbol '__gxx_personality_v0@@CXXABI_1.3' + //usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line + collect2: error: ld returned 1 exit status + + When using g++ to compile and link code, g++ automatically links + libstdc++. However, in cairo we're using g++ only to compile, so need + to explicitly link against libstdc++ for backends that need iostream, + stl, or other stdc++ features. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=59038 + Signed-off-by: Bryce Harrington + Reviewed-by: Uli Schlachter + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit c3645d97ebd24c6f7ad850785d585aebc706a11c +Author: Bryce Harrington +Date: Tue Jul 8 13:14:20 2014 -0700 + + configure.ac: Add a --disable-lto configure option + + Link-Time Optimization seems to be stable enough with gcc 4.8 and 4.9, + but has proven to be an issue in the past for many cairo users (webkit, + efl, ubuntu, opensuse, gentoo, arch...) who carry patches to disable it. + + Gentoo's patch[1] adds a --disable-lto option to leave it enabled by + default but give users the ability to work around lto related build + problems (c.f. fdo #77060). Patch appears to have been authored by + Alexandre Rostovtsev[2]. + + 1: sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/x11-libs/cairo/files/cairo-1.12.16-lto-optional.patch + 2: https://bugs.gentoo.org/show_bug.cgi?id=509552 + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=60852 + Signed-off-by: Bryce Harrington + Reviewed-by: Uli Schlachter + + build/configure.ac.warnings | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 0f46fc8dc173698b6d61ba757e1e42f2319d6ace +Author: Bryce Harrington +Date: Tue Jul 8 12:39:02 2014 -0700 + + configure.ac: Quell warnings about AM_PROG_AR when using automake 1.12 + + Without this, autogen.sh issues warnings like: + + /usr/share/automake-1.14/am/ltlibrary.am: warning: 'libcairoboilerplate_cxx.la': linking libtool libraries using a non-POSIX + /usr/share/automake-1.14/am/ltlibrary.am: archiver requires 'AM_PROG_AR' in 'configure.ac' + boilerplate/Makefile.am:18: while processing Libtool library 'libcairoboilerplate_cxx.la' + + AM_PROG_AR was introduced in automake 1.11.2. As per the docs for + AM_PROG_AR, it is supposed to be included when the archiver ('ar') is + used, but prior to automake 1.12 the warning was only shown iff + -Wextra-portability was specified. automake 1.12 introduced a change + that includes -Wextra-portability when -Wall is specified. + + For further discussion of the issue, see: + + http://debbugs.gnu.org/cgi/bugreport.cgi?bug=11401 + http://lists.gnu.org/archive/html/automake/2012-05/msg00014.html + + Signed-off-by: Bryce Harrington + Reviewed-by: Uli Schlachter + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 312553af298692111928a9443b75a00bf46d2adb +Author: Behdad Esfahbod +Date: Fri Jul 11 11:05:43 2014 -0400 + + [trace] Don't print FC_CHARSET, FC_LANG, and FC_CAPABILITY + + There are many more that can go, but these take the most bytes. + FC_CHARSET needs to go specially because I recently changed + its format in fontconfig. Ouch! + + util/cairo-trace/trace.c | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +commit 4cb220773d4babe216afae1198bb192956ffeae9 +Author: Behdad Esfahbod +Date: Fri Jul 11 10:58:14 2014 -0400 + + chmod a+x cairo-trace + + configure.ac | 2 ++ + 1 file changed, 2 insertions(+) + +commit e279709bf32f13314b8008e6f640d2fab8cc8a78 +Author: Ravi Nanjundappa +Date: Thu Jul 10 16:14:46 2014 +0530 + + skia : Add Debug support for skia backend + + Enable the DEBUG support for skia backend to provide more + descriptive information on the unexpected operational behaviours. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + + src/cairo-skia-surface.cpp | 28 +++++++++++++++++----------- + 1 file changed, 17 insertions(+), 11 deletions(-) + +commit 8a605472d201e30ddcf3895d554cc4143cd54fb2 +Author: Ravi Nanjundappa +Date: Wed Jul 9 15:50:57 2014 +0530 + + .gitignore: Ignore the generated profile data files from callgrind tool in test/ + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 30cb23d3b64ab085578c23a194391d982ad10d32 +Author: Jeff Muizelaar +Date: Wed Jul 9 16:33:53 2014 -0400 + + clang-cl: Use size of the pointer explicitly + + This works around http://llvm.org/PR20216. + + src/cairo-compiler-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 28c3b92fb4f6ed8511a46ad9c0e1bd8cfdd477ed +Author: Bryce Harrington +Date: Tue Jul 8 17:44:56 2014 -0700 + + .gitignore: Ignore two generated files in build/ + + Signed-off-by: Bryce Harrington + + .gitignore | 1 - + build/.gitignore | 2 ++ + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 7bd68b57999bf1564ecbadf6c9aae6bf9f7aa4a7 +Author: Ravi Nanjundappa +Date: Mon Jun 30 17:05:26 2014 +0530 + + skia: update the source to build with the latest skia + + This fixes several build related issues for the skia backend + which is introduced due to skia source up-gradation. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Uli Schlachter + Reviewed-by: Bryce Harrington + + configure.ac | 12 ++++---- + src/skia/cairo-skia-context.cpp | 65 ++++++++++++++++++++++++++++++----------- + src/skia/cairo-skia-private.h | 4 +-- + src/skia/cairo-skia-surface.cpp | 13 ++++----- + 4 files changed, 60 insertions(+), 34 deletions(-) + +commit be62b1221169469c8923a5a1ec669761f5344c57 +Author: Ravi Nanjundappa +Date: Wed Jul 2 14:13:58 2014 +0530 + + xcb: make use of _cairo_surface_is_xcb to check for surface type + + Introduced a new inline function _cairo_surface_is_xcb() as similar to + _cairo_surface_is_image() and used the same to check for xcb surface + type + + Signed-off-by: Ravi Nanjundappa + + src/cairo-xcb-private.h | 15 +++++++++++++++ + src/cairo-xcb-surface-core.c | 2 +- + src/cairo-xcb-surface-render.c | 2 +- + src/cairo-xcb-surface.c | 4 ++-- + 4 files changed, 19 insertions(+), 4 deletions(-) + +commit 550385fb004e6064305518cf265adc03bd2d0c0b +Author: Jeff Muizelaar +Date: Mon Jun 30 14:17:18 2014 -0400 + + Don't use __FUNCTION__ as a string literal + + clang-cl doesn't support this and we don't gain much + from using it. + + src/cairo-compiler-private.h | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit f574fec8d2d1f83525fd7e4dbb266b6e5091627d +Author: Ravi Nanjundappa +Date: Mon May 19 14:59:29 2014 +0530 + + src : Fix warn_unused_result warnings from gcc + + Fix 'unused-result' warning messages by + - replacing cairo_private to cairo_private_no_warn in the + declaration of the cairo private apis '_cairo_surface_unmap_image', + '_cairo_polygon_add_line', '_cairo_polygon_add_external_edge' and + '_cairo_polygon_add_contour' + - removing cairo_warn for 'render_rows' member function pointer in + 'struct _cairo_span_renderer' + + Signed-off-by: Ravi Nanjundappa + + src/cairo-spans-private.h | 2 +- + src/cairoint.h | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 5741a7f2cab3548467a020c89bb7363d398f9c0d +Author: Eric Le Bihan +Date: Fri May 9 21:22:04 2014 +0200 + + test: fix build of any2ppm if fork not available + + The test program any2ppm can run as daemon. This feature can be disabled + at compile time, if the required headers are not present. However the + support for fork() is not checked. + + This patch fixes this issue. + + Signed-off-by: Eric Le Bihan + + test/any2ppm.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3d94269bd427304af70ae681d5533b572d19ec3c +Author: Uli Schlachter +Date: Tue May 13 10:15:12 2014 +0200 + + Revert "image: Use convolution filters for sample reconstruction when downscaling" + + This reverts commit fb57ea13e04d82866cbc8e86c83261148bb3e231. + + When running cairo-test-suite with the parameter "-a", it also runs each test + with a non-zero device-offset and device-scaling. The above commit influenced + the device-scaling results badly. E.g. some test results ended up with a black + border at the top-most and left-most row that looked like there was an offset of + "0.5" in drawing the image and thus pixels outside of the image were sampled. + + This can be seen by the influence that this revert has on the results from + running CAIRO_TEST_TARGET=image ./cairo-test-suite -a: + + Before: 31 Passed, 489 Failed [1 crashed, 8 expected], 31 Skipped + After: 225 Passed, 295 Failed [1 crashed, 8 expected], 31 Skipped + + Most of the failures that disappeared are from the device-scaling tests. + + With such disastrous results on the test suite, this cannot really be usable for + real-world applications. + + Signed-off-by: Bryce Harrington + + src/cairo-image-source.c | 65 ++++++++---------------------------------------- + 1 file changed, 10 insertions(+), 55 deletions(-) + +commit 2d89cbb30e276cec57a893d4f0d45428858e5e8d +Author: jimmyfrasche +Date: Sun May 25 20:22:16 2014 -0700 + + Add more info to cairo_surface_set_mime_data docs. + + Explains how to use cairo_surface_set_mime_data so that the image always + gets used even if the MIME data cannot be. + + Signed-off-by: jimmyfrasche + + src/cairo-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit ead5c7909f3db1d0d81121fc2775c458871891b2 +Author: Ravi Nanjundappa +Date: Mon May 12 14:59:03 2014 +0530 + + vg: Use EGL_NONE and GLX_NONE in place of None + + Use EGL_NONE in EGL section and GLX_NONE in GLX section + instead of None in cairo-boilerplate-vg.c + + Signed-off-by: Ravi Nanjundappa + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55805 + + boilerplate/cairo-boilerplate-vg.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d1453c512c8213115bd489b3ea8849b1c840b551 +Author: Ravi Nanjundappa +Date: Tue May 6 15:44:21 2014 +0530 + + test : Maintain consistency in the usage of xcalloc + + xcalloc is a wrapper for calloc. If it can't allocate memory then it + terminates the program. The current changes replace the usages of calloc + by xcalloc in tests. + + Signed-off-by: Ravi Nanjundappa + + test/negative-stride-image.c | 2 +- + test/stride-12-image.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 69e10bc8b53792f58e06387542c4eeeca52795c9 +Author: Ravi Nanjundappa +Date: Thu May 15 15:59:58 2014 +0530 + + glx: Use GLX_NONE in place of None + + Use "GLX_NONE" in rgb and rgba attributes instead of + "None" in cairo-boilerplate-glx.c + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + + boilerplate/cairo-boilerplate-glx.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 247cfaaa2562d28ee39a5a35eea9772ee365937b +Author: Sylvestre Ledru +Date: Wed May 7 17:15:22 2014 +0200 + + Fix some memory leaks found by scan-build, the LLVM/Clang static analyzer + + Signed-off-by: Bryce Harrington + Reviewed-by: Uli Schlachter + + src/cairo-cff-subset.c | 4 +++- + src/cairo-pdf-surface.c | 8 +++++++- + test/pdf-mime-data.c | 2 ++ + 3 files changed, 12 insertions(+), 2 deletions(-) + +commit 5e7b724dd3ed13c7c5a6ffe3874ad21b7fbe2176 +Author: Sylvestre Ledru +Date: Wed May 7 17:16:09 2014 +0200 + + Remove some potential double free + + Signed-off-by: Bryce Harrington + Reviewed-by: Uli Schlachter + + src/cairo-truetype-subset.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 85b05e84acd89b08e5e72849133ae84cf2cdcb54 +Author: jimmyfrasche +Date: Sun May 11 20:06:17 2014 -0700 + + Pattern document clarification + + Replaces documentation of the form "range 0 to 1 less than the number" + with "ranges from 0 to n-1 where n is the number", which is idiomatic + mathematical writing and less ambiguous. + + Signed-off-by: jimmyfrasche + Reviewed-by: Bryce Harrington + + src/cairo-pattern.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 55608e4fd6947f26789557ffc757affc509b141b +Author: Ravi Nanjundappa +Date: Mon May 5 12:34:21 2014 +0530 + + boilerplate: Maintain consistency in the usage of switch cases + + Some of the switch cases used in boilerplate are not consistent + across other source files in the same module. This patch fixes the + consistency issues of switch case usage in the boilerplate module. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Uli Schlachter + + boilerplate/cairo-boilerplate-drm.c | 12 ++++++-- + boilerplate/cairo-boilerplate-xlib.c | 12 ++++++-- + boilerplate/cairo-boilerplate.c | 53 +++++++++++++++++++++++++----------- + 3 files changed, 55 insertions(+), 22 deletions(-) + +commit 18b3cce2f5812c357e4b6310e72d72dd9ec92ed4 +Author: Bryce Harrington +Date: Tue May 6 10:18:19 2014 -0700 + + Fix segfault in firefox when scrolling on certain pages + + Bug discovered by thorsten + + Patch from Chris Wilson + + src/cairo-xcb-surface-render.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit da9ef97372fb9c22f66507e0ab37968b1131f077 +Author: Sylvestre Ledru +Date: Fri May 2 18:53:41 2014 +0200 + + Remove some useless declarations found by scan-build, the LLVM/clang static analyzer + + Reviewed-by: Bryce Harrington + + src/cairo-contour.c | 1 - + src/cairo-ft-font.c | 2 -- + src/cairo-path-stroke-polygon.c | 10 ---------- + src/cairo-xcb-connection-core.c | 2 -- + test/pdiff/lpyramid.c | 4 ++-- + test/tighten-bounds.c | 2 +- + util/cairo-script/cairo-script-file.c | 1 - + 7 files changed, 3 insertions(+), 19 deletions(-) + +commit 52b137bc3e3284ecef3102b0d976fd2320e0f473 +Author: Ravi Nanjundappa +Date: Wed Apr 23 08:32:19 2014 +0530 + + test and util: maintain consistency in the usage of ARRAY_LENGTH macro + + ARRAY_LENGTH macro is used in perf's cairo-perf.h, src's cairoint.h, + test's cairo-test.h and in some internal header files of util's + directory.So to maintain consistency ARRAY_SIZE is replaced with + ARRAY_LENGTH macro. + + Signed-off-by: Ravi Nanjundappa + Reviewed-by: Bryce Harrington + + test/cairo-test.c | 12 ++++++------ + util/cairo-trace/trace.c | 7 ++++--- + util/malloc-stats.c | 9 +++++---- + 3 files changed, 15 insertions(+), 13 deletions(-) + +commit 0e0004a9716ca50bf14fa0e5e1919d90b8d11960 +Author: Ravi Nanjundappa +Date: Tue Apr 22 17:53:12 2014 +0530 + + perf: Refactor some macros to cairo-perf.h + + This commit covers one of the left out modifications from + "commit cd11a4ff0421fd293279b202be800550890574bb" by Bryce. + It removes the duplicate macro definition in cairo-perf-diff-files.c + which by default includes the cairo-perf.h having MAX macro defnition. + + Signed-off-by: Ravi Nanjundappa + + perf/cairo-perf-diff-files.c | 1 - + 1 file changed, 1 deletion(-) + +commit 2d95f803b15d3d8f70df0e7278ad7bdeaf99fb59 +Author: Bryce Harrington +Date: Thu Apr 17 23:59:36 2014 -0700 + + NEWS: Add bug links and reword feature and bug descriptions + + NEWS | 67 ++++++++++++++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 46 insertions(+), 21 deletions(-) + +commit cd11a4ff0421fd293279b202be800550890574bb +Author: Bryce Harrington +Date: Wed Apr 16 17:37:18 2014 -0700 + + perf: Refactor some common macros to cairo-perf.h + + These macros are standard in src's cairoint.h and test's cairo-test.h + internal header files, so for consistency do the same thing with perf's + cairo-perf.h. + + Reviewed-by: Uli Schlachter + + perf/cairo-perf-chart.c | 2 -- + perf/cairo-perf-compare-backends.c | 1 - + perf/cairo-perf-trace.c | 5 ++--- + perf/cairo-perf.h | 12 ++++++++++++ + perf/micro/cairo-perf-cover.c | 5 ++--- + perf/micro/dragon.c | 8 -------- + perf/micro/zrusin.c | 4 +--- + 7 files changed, 17 insertions(+), 20 deletions(-) + +commit 3e22a8580a8045e450a2f2e47c8ac36abf8882ae +Author: Uli Schlachter +Date: Fri Apr 11 10:39:39 2014 +0200 + + pthread-same-source: Refresh reference images + + These reference images are generated by the new GENERATE_REFERENCE mode that the + previous commit introduced. + + I have no idea what the "base" images. From my reading of the code in + boilerplate/, these images will be used by the test-XXX targets. However, these + seem to generate the same result than e.g. the image backend. Thus, I deleted + these files. + + There is still pthread-same-source.quartz.xfail.png. This file was created in + commit b6e16b8d and touched in commit 5a1e590b1. No idea if this is still valid + and since I don't have a Mac, I won't touch it. + + The test is still broken on the following backends (out of the backends I have + compiled in). This mostly seems to be differences in image scaling, but I + couldn't figure out an easy way to tell the test suite that the new results are + correct. + + test-paginated, ps2, ps3, xcb, xcb-window, xcb-window&, xcb-fallback, xlib, + xlib-window, xlib-fallback, recording + + Signed-off-by: Uli Schlachter + + .../reference/pthread-same-source.base.argb32.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-same-source.base.rgb24.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-same-source.image16.ref.png | Bin 1007 -> 1048 bytes + test/reference/pthread-same-source.ref.png | Bin 1000 -> 1076 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit ddd344fb0f5a0e9a0e9a34306598a777ffb7667a +Author: Uli Schlachter +Date: Sat Apr 12 12:07:23 2014 +0200 + + pthread-same-source: Add ref image generation + + When the new GENERATE_REFERENCE symbol is defined to 1, no threads are involved + at all. In this case, all operations are done sequentially by the main thread. + + Thus, in this mode no thread issues can occur and the result must be usable as + reference images. + + Signed-off-by: Uli Schlachter + Reviewed-by: Bryce Harrington + + test/pthread-same-source.c | 25 ++++++++++++++++++++++--- + 1 file changed, 22 insertions(+), 3 deletions(-) + +commit 457597e2dc6fac6c879ba51da892cf31a3c432eb +Author: Bryce W. Harrington +Date: Fri Mar 14 20:24:51 2014 +0000 + + NEWS: Summarize recent changes + + This updates NEWS with items shown by `git log --stat 1.12.8..` + Hopefully I haven't misrepresented any of the work done. For sake of + brevity where there were several changes in one area, I've given a + single general entry to summarize those changes. The division between + features and bug fixes is quite rough. + + NEWS | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 88 insertions(+) + +commit bb17403622e9ea474017e0039af8ee48b2b285db +Author: Uli Schlachter +Date: Fri Mar 14 15:31:34 2014 +0100 + + mesh-rasterize: Fix number of iterations + + Commit 44a09f462c fixed a compiler warning, but changed the result of this code. + This is because the old 'for' loop did one more iteration than the new 'while' + loop. Fix this by incrementing the loop counter once before the loop. + + Fixes: mesh-pattern mesh-pattern-accuracy mesh-pattern-conical + mesh-pattern-control-points mesh-pattern-fold mesh-pattern-overlap + mesh-pattern-transformed record-mesh + + Signed-off-by: Uli Schlachter + Tested-by: Bryce Harrington + + src/cairo-mesh-pattern-rasterizer.c | 1 + + 1 file changed, 1 insertion(+) + +commit 372c8c314a93e0efba53319a120a9ccc2c99658b +Author: Uli Schlachter +Date: Fri Mar 14 13:47:38 2014 +0100 + + mask compositor: Set a check_composite method + + Commit 503b6b9e2ea6 added a check_composite method to the mask compositor, but + only added it to one of the existing implementations. This commit fixes that. + + In cairo-image-compositor.c, there is already a check_composite method which + just returns success for the traps compositor. This commit makes the mask + compositor use that one. + + I don't want to say much about cairo-image-mask-compositor.c except that I + wondered why this file and the file above both define a non-static function + called _cairo_image_mask_compositor_get(). In my opinion, that file should just + be deleted, since it confuses e.g. ctags, but I'll let someone else clean this + up. + + Fixes 493 crashes in the test suite for the test-mask target. + + Signed-off-by: Uli Schlachter + Tested-by: Bryce Harrington + + src/cairo-image-compositor.c | 2 +- + src/cairo-image-mask-compositor.c | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit bc05dbccd7dd2f137038479b30ed71c98ff81da6 +Author: Uli Schlachter +Date: Thu Feb 27 10:56:20 2014 +0100 + + Fix warnings from check-doc-syntax.sh + + $ ./check-doc-syntax.sh + Checking documentation for incorrect syntax + ./cairo-types-private.h (148): WARNING: cairo_hash_entry_t: missing 'Since' field (is it a private type?) + ./cairo-types-private.h (161): WARNING: cairo_hash_entry_t: not found + ./cairo-types-private.h (175): WARNING: cairo_lcd_filter_t: missing 'Since' field (is it a private type?) + ./cairo-cache-private.h (85): WARNING: cairo_cache_entry_t: missing 'Since' field (is it a private type?) + ./cairo-region.c (857): WARNING: cairo_region_overlap_t: not found + ./cairo-raster-source-pattern.c (62): WARNING: SECTION:cairo-raster-source 'Since' field in non-public element + + The warnings about missing 'Since' fields are fixed by changing the + documentation comment so that the script can see that these are private types. + + The documentation for cairo_region_overlap_t gets moved to cairo.h, just like + e.g. the documentation for cairo_status_t. + + The 'Since' field from the SECTION:cairo-raster-source is removed, because this + kind of field is needed on the individual functions and structs, not on the + section. + + Thanks to Bryce Harrington for bringing this up! + + Signed-off-by: Uli Schlachter + Tested-by: Bryce Harrington + + src/cairo-cache-private.h | 2 +- + src/cairo-raster-source-pattern.c | 2 -- + src/cairo-region.c | 12 ------------ + src/cairo-types-private.h | 4 ++-- + src/cairo.h | 11 +++++++++++ + 5 files changed, 14 insertions(+), 17 deletions(-) + +commit 0c189910539aa05125b60e59b7101e9b9685582f +Author: Bryce Harrington +Date: Thu Mar 13 15:22:40 2014 -0700 + + skia: Add section definitions and code docs for skia backend + + This fixes several distcheck errors regarding missing code docs. + + The skia backend was added in commit d7faec02, which was included in the + 1.10 release. + + Signed-off-by: Bryce Harrington + + doc/public/cairo-sections.txt | 5 +++-- + src/cairo-skia-surface.cpp | 21 +++++++++++++++++++++ + src/skia/cairo-skia-private.h | 19 +++++++++++++++++++ + 3 files changed, 43 insertions(+), 2 deletions(-) + +commit 0eb686d5454073f65ff78520ca862d07672d2a3f +Author: Bryce Harrington +Date: Tue Feb 25 17:43:22 2014 -0800 + + Document that libglib2.0-doc is needed to avoid some xref warnings + + Signed-off-by: Bryce Harrington + + RELEASING | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8d0abb4a945a6875de956ef12883e7efe7b7fbc7 +Author: Bryce Harrington +Date: Tue Feb 25 17:09:03 2014 -0800 + + surface: Make parameter naming consistent between header and impl + + This fixes this set of distcheck errors generating docs: + + src/cairo-surface.c:1668: warning: Parameter described in source code + comment block but does not exist. FUNCTION: + cairo_surface_set_device_scale Parameter: sx. + + src/cairo-surface.c:1668: warning: Parameter described in source code + comment block but does not exist. FUNCTION: + cairo_surface_set_device_scale Parameter: sy. + + src/cairo-surface.c:1668: warning: Parameter description for + cairo_surface_set_device_scale::x_scale is missing in source code + comment block. + + src/cairo-surface.c:1668: warning: Parameter description for + cairo_surface_set_device_scale::y_scale is missing in source code + comment block. + + Signed-off-by: Bryce Harrington + + src/cairo-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 4450af4f035fce8b468ad3ac9cd34da7bf81b688 +Author: Bryce Harrington +Date: Tue Feb 25 14:43:06 2014 -0800 + + Mark recently added _cairo_output_stream_print_matrix private symbol + + This fixes a distcheck error about a local PLT entry. + + Signed-off-by: Bryce Harrington + + src/cairo-output-stream-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ae954ae3ea262efae221cfda18eee73b5654a729 +Author: Bryce Harrington +Date: Tue Feb 25 13:20:49 2014 -0800 + + doc: Drop a couple quartz routines which distcheck claims don't exist + + These routines actually do exist in the source code, and have proper + documentation, so I'm not sure why distcheck dislikes them, but it's + happier without these listed. + + Signed-off-by: Bryce Harrington + + doc/public/cairo-sections.txt | 3 --- + 1 file changed, 3 deletions(-) + +commit f4a1a75078a844e2581615566122f4232d2a4f62 +Author: Bryce Harrington +Date: Tue Feb 25 13:17:00 2014 -0800 + + doc: Add missing sections and symbols for public docs + + This adds a number of items to the documentation for which code docs + exist, and also adds sections for cairo-skia and cairo-surface-observer. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48784 + + Signed-off-by: Bryce Harrington + + doc/public/cairo-sections.txt | 38 ++++++++++++++++++++++++++++++++++++++ + src/cairo-surface-observer.c | 5 +++++ + src/cairo.h | 9 +++++++++ + 3 files changed, 52 insertions(+) + +commit ed175b2a2bebb6def85133257bc11a875d13b0dd +Author: Uli Schlachter +Date: Thu Mar 6 09:45:08 2014 +0100 + + clip: Fix handling of special all-clipped cairo_clip_t + + _cairo_clip_intersect_box() wasn't checking if it was called with the special, + read-only all-clipped clip and thus could have ended up writing to read-only + memory. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=75819 + Signed-off-by: Uli Schlachter + + src/cairo-clip-boxes.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3b261bea7d8e8094ff3899aefab6bbc8628a3585 +Author: Chris Wilson +Date: Thu Mar 6 08:34:10 2014 +0000 + + clip: Do not modify the special all-clipped cairo_clip_t + + Signed-off-by: Chris Wilson + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75819 + + src/cairo-clip-boxes.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 42fdfa812eb05ecb539af739445ec8c36f0e7ac1 +Author: Bryce Harrington +Date: Wed Mar 5 12:50:36 2014 -0800 + + gitignore: Ignore generated tmpl dir in public docs + + doc/public/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit f88bd92e8b3d87ec728e3fee51eb82f07db8c95c +Author: Behdad Esfahbod +Date: Wed Mar 5 01:13:59 2014 -0800 + + Revert "[ft] Fix memory bug in copying bitmaps" + + This reverts commit a0f556f37fb7016aa304b7cf0e811c0d38f0b969. + + The change was clearly wrong now that I read. I was probably + tricked by what was fixed in the follow-up commit + e738079302a968b7b1fb9101cd4d92a8887bedce. + + src/cairo-ft-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 5c9fdcb4aa9c3c32fe4760586c11924dc5fb47ef +Author: Koji Egashira +Date: Mon Apr 29 18:31:08 2013 +0900 + + image: Add NULL checks for return value of _pixman_image_for_color() + + This fixes crash in pixman_image_composite32(). + + Originally fixed by Yoshitaro Makise. + + Reviewed-by: Bryce Harrington + Signed-off-by: Bryce Harrington + + src/cairo-image-compositor.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 6a03ae5859a92d3d4dbe97c9d598700fbcf1d666 +Author: Benjamin Otte +Date: Mon Mar 3 01:16:25 2014 +0100 + + xlib: Fix typo in documentation + + src/cairo-xlib-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f1709c298c355499a18796f389fa0fd9bc52b8c3 +Author: Bryce Harrington +Date: Wed Feb 26 18:55:25 2014 -0800 + + Correct spelling of "tessellator" throughout code + + Based on patch suggested by Homer Hsing + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50411 + + src/cairo-cogl-surface.c | 6 +++--- + src/cairo-fixed-private.h | 2 +- + src/cairo-fixed-type-private.h | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 273210683f182d72789f88df80fec8c4d08bb30f +Author: Bryce Harrington +Date: Wed Feb 26 18:44:46 2014 -0800 + + Add comment to explain _cairo_edge_compute_intersection_* + + Patch by Homer Hsing + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50412 + + src/cairo-fixed-private.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e555dfc7173897bc0819c715e8897cd1c886e2a3 +Author: Bryce Harrington +Date: Wed Feb 26 18:42:41 2014 -0800 + + Add explanation to _cairo_surface_create_in_error + + Patch by Homer Hsing + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50413 + + src/cairo-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit be206ddf20e7b4e0e87d91c7a18cbdb9cfcec8e6 +Author: Bryce Harrington +Date: Wed Feb 26 18:40:12 2014 -0800 + + Add explanation to enum _cairo_int_status + + Patch based on suggestion by Homer Hsing + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50416 + + src/cairo-error-private.h | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 19b31bbe7018dbe031c650e7497b19a0607ad453 +Author: Bryce Harrington +Date: Wed Feb 26 18:36:15 2014 -0800 + + image: Fix bad HTML generation in code docs for cairo-format-stride-for-width + + Patch from Simon Kågedal Reimer + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=63257 + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7b50883577df0949f793cc6dbfda281e96119dcd +Author: Bryce Harrington +Date: Wed Feb 19 11:25:16 2014 -0800 + + gl: Handle PIXMAN_a8r8g8b8_sRGB format in switch + + Fixes the following compiler warning: + + cairo-gl-surface.c:182:5: warning: enumeration value + ‘PIXMAN_a8r8g8b8_sRGB’ not handled in switch + + Same fix as done for image in 1d0055078. + + Chris Wilson + + src/cairo-gl-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 44a09f462c8ff59f864967f45f9b31e473632b7a +Author: Bryce Harrington +Date: Tue Feb 18 21:13:53 2014 -0800 + + mesh: Avoid theoretical infinite loops + + This quells this warning: + + src/cairo-mesh-pattern-rasterizer.c:731:5: warning: cannot + optimize possibly infinite loops + + I guess the compiler's complaining because if vsteps were negative or + equal to UINT_MAX the loop could cycle infinitely. Silly compiler. + + Fix as suggested by Chris Wilson + + src/cairo-mesh-pattern-rasterizer.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 19f412bb1faa5391a03c121c31f7ad94fd275d82 +Author: Bryce Harrington +Date: Tue Feb 18 21:01:07 2014 -0800 + + xml: constify source objects for emit routines + + This quells the following warnings: + + src/cairo-xml-surface.c:576:5: warning: passing argument 2 of + ‘_cairo_xml_surface_emit_clip_boxes’ discards ‘const’ qualifier from + pointer target type + src/cairo-xml-surface.c:462:1: note: expected ‘struct cairo_clip_t + *’ but argument is of type ‘const struct cairo_clip_t *’ + + Most of the cairo_xml*emit* routines const their source objects; + these should follow suit. + + Reviewed-by: Chris Wilson + + src/cairo-xml-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dc8ca191f584f837f4c2b70d0ebbe2c9d87575cf +Author: Bryce Harrington +Date: Tue Feb 18 20:56:09 2014 -0800 + + xml: Drop unused variable + + Reviewed-by: Chris Wilson + + src/cairo-xml-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 9b8a752249c69ba94461b3ef6d919c1b86ae6fab +Author: Bryce Harrington +Date: Tue Feb 18 20:13:57 2014 -0800 + + test: Quell warning for deprecated g_type_init() + + The g_type_init() routine was deprecated in glib 2.34. Tested and + verified this conditionalization on glib 2.32 and 2.36. No need to + change version dependencies. + + test/any2ppm.c:864:5: warning: ‘g_type_init’ is deprecated + (declared at /usr/include/glib-2.0/gobject/gtype.h:669) + + Reviewed-by: Chris Wilson + + test/any2ppm.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 75e671c29b2f2916c41af46f8c3707539b235674 +Author: Bryce Harrington +Date: Tue Feb 18 18:10:20 2014 -0800 + + test: Quell warning for inclusion of old rsvg header files + + This silences a warning due to header file deprecated as of libsrvg + 2.36.2. Tested and verified this hackaround on librsvg 2.36.4 and + 2.36.1. No need to change version dependencies. + + In file included from test/any2ppm.c:73:0: + /usr/include/librsvg-2.0/librsvg/rsvg-cairo.h:27:2: warning: + #warning "Including directly is deprecated." + + Reviewed-by: Chris Wilson + + test/any2ppm.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit a346e40ed33e69c7c03be3aa1b7b0065e4ee1d07 +Author: Bryce Harrington +Date: Tue Feb 18 17:37:22 2014 -0800 + + perf: Guarantee path width is non-negative + + This quells the following warning: + + perf/micro/hatching.c:39:5: warning: cannot optimize loop, the + loop counter may overflow + + Width and height aren't going to be negative so enforce it so that the + compiler can do whatever optimization it wants to do. + + Reviewed-by: Chris Wilson + + perf/micro/hatching.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4144307dbfbe7b297135d9ea4b080cae7e06b997 +Author: Ryan Lortie +Date: Tue Feb 4 10:47:40 2014 +0000 + + cairo-version: fix docs build + + We do some evil things in this doc comment by closing a tag further up. + Make sure we reopen it at the end so that gtk-doc's attempt to close it again + doesn't result in an imbalance. + + src/cairo-version.c | 1 + + 1 file changed, 1 insertion(+) + +commit 39b7d5138eb83cc2d4f3ab6039894cc61c7fe4c7 +Author: Bryce Harrington +Date: Wed Jan 29 17:07:04 2014 -0800 + + cairo-script: Compare status with CSI enums + + CSI_STATUS_SUCCESS is defined as equivalent to CAIRO_STATUS_SUCCESS. + We should prefer the former when comparing against csi_status_t + variables, else we'll get a warning: + + cairo-script-interpreter.c:637:23: warning: comparison between + ‘csi_status_t’ and ‘enum _cairo_status’ [-Wenum-compare] + + Signed-off-by: Bryce Harrington + Reviewed-by: Chris Wilson + + util/cairo-script/cairo-script-interpreter.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 18d66c88a2f1068fb490efa33ead93d0e2d71c41 +Author: Bryce Harrington +Date: Wed Jan 29 10:22:51 2014 -0800 + + cairo-script: Error if asked to decompress with missing compression lib + + This quells the following warning: + + warning: enumeration value ‘LZO’ not handled in switch [-Wswitch-enum] + + The LZO enum value is defined and used elsewhere, even if lzo support + isn't available. + + This situation might arise if cairo scripts were generated on one system + with lzo, and then replayed on a system without it. For now simply + error out if this occurs. + + Signed-off-by: Bryce Harrington + Reviewed-by: Chris Wilson + + util/cairo-script/cairo-script-file.c | 8 ++++---- + util/cairo-script/cairo-script-operators.c | 16 ++++++++-------- + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 1ce452db4ca348944ca88edfdadb6c53a4d55733 +Author: Bryce Harrington +Date: Wed Jan 29 10:10:24 2014 -0800 + + cairo-trace: Stringify CAIRO_STATUS_JBIG2_GLOBAL_MISSING + + This error enum was added last September when JBIG2 support was added. + Support it as well in the tracing code. This fixes this warning: + + trace.c:1544:5: warning: enumeration value + ‘CAIRO_STATUS_JBIG2_GLOBAL_MISSING’ not handled in switch [-Wswitch] + + Signed-off-by: Bryce Harrington + Reviewed-by: Chris Wilson + + util/cairo-trace/trace.c | 1 + + 1 file changed, 1 insertion(+) + +commit 9a29805f4e666577e5fe72fec62ecc76719862d9 +Author: Bryce Harrington +Date: Wed Jan 29 10:04:41 2014 -0800 + + test: Drop unused path variable in two recently added tests + + Signed-off-by: Bryce Harrington + Reviewed-by: Chris Wilson + + test/paint-with-alpha-group-clip.c | 2 -- + test/rotate-stroke-box.c | 2 -- + 2 files changed, 4 deletions(-) + +commit 0723290a6f7261be51312d0c53a7d4188a31bb1c +Author: Bryce Harrington +Date: Wed Jan 29 10:01:50 2014 -0800 + + test: Handle error in fgets call in ps-eps test + + Most likely this is just a theoretical problem since we just checked + feof, but this quells the following warning: + + ps-eps.c:216:8: warning: ignoring return value of ‘fgets’, declared with + attribute warn_unused_result [-Wunused-result] + + Signed-off-by: Bryce Harrington + Reviewed-by: Chris Wilson + + test/ps-eps.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 1b522f81e22fd320e6962ffb54121c10ece39275 +Author: Bryce Harrington +Date: Wed Jan 29 09:57:24 2014 -0800 + + test: Replace deprecated rsvg_init() in any2ppm test + + As of libsvg 2.35 calling g_type_init() is sufficient. + + Signed-off-by: Bryce Harrington + Reviewed-by: Chris Wilson + + configure.ac | 2 +- + test/any2ppm.c | 1 - + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit 5de25951a43f51cade42549ae60e52ffb391d61e +Author: Behdad Esfahbod +Date: Mon Jan 27 17:34:00 2014 -0500 + + Preserve current-point in copy_path()/append_path() sequence + + Fixes path-currentpoint test. + + src/cairo-path-fixed.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 8d2e24479a1efbeeddced3574c1d9e92b8ee578d +Author: Behdad Esfahbod +Date: Mon Jan 27 17:31:12 2014 -0500 + + [tests] Add path-currentpoint + + Checks whether copy_path()/append_path() preserves current-point. + Currently failing. + + test/Makefile.sources | 1 + + test/path-currentpoint.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 90 insertions(+) + +commit 2a7f133639bed86a29dd9693cb78c0aa42eaff30 +Author: Uli Schlachter +Date: Sun Jan 19 20:06:25 2014 +0100 + + cairo svg: Use \n instead of /n in bitmap fonts + + Signed-off-by: Uli Schlachter + + src/cairo-svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b56b971141bf22ee3452b7f6f5e2dfd373b99e13 +Author: Adrian Johnson +Date: Sat Jan 11 20:49:05 2014 +1030 + + type1: strip space from end of font name + + src/cairo-type1-subset.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit ee0e2b9272f6f21092fde7bee9b9237e682d4147 +Author: Adrian Johnson +Date: Sat Jan 11 20:57:44 2014 +1030 + + ps: add font DSC comments + + src/cairo-ps-surface.c | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +commit 2d3ee70ed37ed2120d5c5f75277172620e32084c +Author: Adrian Johnson +Date: Sat Jan 11 19:09:55 2014 +1030 + + ps: cairo_set_page_size does not need to be in eps output + + src/cairo-ps-surface.c | 68 ++++++++++++++++++++++++++------------------------ + 1 file changed, 36 insertions(+), 32 deletions(-) + +commit 26d0edbc35504624cbe96e95e338351e219bb262 +Author: Adrian Johnson +Date: Sat Jan 11 10:42:33 2014 +1030 + + ps: use setpagedevice to set page size + + https://bugs.freedesktop.org/show_bug.cgi?id=73452 + + src/cairo-ps-surface.c | 40 +++++++++++++++++++++++++++++++++++++++- + 1 file changed, 39 insertions(+), 1 deletion(-) + +commit 97f6e2005d9cbc9c9dd7cc21445df7c08e084c83 +Author: Marek Kasik +Date: Thu Jan 9 17:28:32 2014 +0100 + + font: Generate PDFs with correct font names + + Escape PostScript names of loaded fonts. These can not + contain white spaces and delimiter characters when saving + them to a PostScript file or a PDF file. + + src/cairo-cff-subset.c | 2 ++ + src/cairo-scaled-font-subsets-private.h | 15 +++++++++++++ + src/cairo-scaled-font-subsets.c | 40 +++++++++++++++++++++++++++++++++ + src/cairo-truetype-subset.c | 35 +++-------------------------- + src/cairo-type1-subset.c | 9 +++----- + 5 files changed, 63 insertions(+), 38 deletions(-) + +commit f81b1406755a1e63f0c44996ca9ce3802b1877ba +Author: Adrian Johnson +Date: Wed Jan 8 07:45:20 2014 +1030 + + ps: fix imagemask with pattern source failure on some printers + + When /PaintProc is invoked the pattern dict is pushed onto the stack. + Ensure this dict is removed. + + https://bugs.freedesktop.org/show_bug.cgi?id=69485 + + src/cairo-ps-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2afc941d7ffad3bd37a915e82342640772d4df5b +Author: Adrian Johnson +Date: Fri Jan 3 21:06:24 2014 +1030 + + ps: remove duplicate /Interpolate from image dictionary + + http://lists.freedesktop.org/archives/poppler/2014-January/010748.html + + src/cairo-ps-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 2974416dfc56e1b3a59001e482679f8601abd7d5 +Author: Adrian Johnson +Date: Thu Dec 26 17:18:41 2013 +1030 + + Add test for paint with alpha and clipping bug + + Add test case for https://bugs.freedesktop.org/show_bug.cgi?id=68382 + + Something has regressed in the recording surface. All the recording + surface based backends lose the alpha from the paint_With_alpha. + + test/Makefile.sources | 1 + + test/paint-with-alpha-group-clip.c | 62 +++++++++++++++++++++ + test/reference/paint-with-alpha-group-clip.ref.png | Bin 0 -> 135 bytes + 3 files changed, 63 insertions(+) + +commit 5cafaa7b3bc045a7a26a11986c16fd9419a09922 +Author: Adrian Johnson +Date: Thu Dec 26 15:28:29 2013 +1030 + + pdf: fix rectangle stroke with non rectilinear pen + + src/cairo-pdf-operators.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit acd78d721e9d1c9c74c88889fbc4580700962ed1 +Author: Adrian Johnson +Date: Thu Dec 26 15:27:30 2013 +1030 + + Add test for rectangle path optimization with non rectilinear pen + + This fails on pdf/ps. + + test/Makefile.sources | 1 + + test/reference/rotate-stroke-box.ref.png | Bin 0 -> 150 bytes + test/rotate-stroke-box.c | 51 +++++++++++++++++++++++++++++++ + 3 files changed, 52 insertions(+) + +commit 040a9f678bfb0f0b89a0273b729c4e9f2bc23e4f +Author: Behdad Esfahbod +Date: Mon Dec 16 19:27:02 2013 -0500 + + Check for XRenderSolidFill() + + configure.ac | 2 +- + src/cairo-xlib-xrender-private.h | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit dcbe16eb40b488f89f2398181f4c3f8a65f84b52 +Author: Adrian Johnson +Date: Sat Dec 7 15:48:26 2013 +1030 + + pdf/ps: avoid outputting excess decimal places in matrices + + Sometimes as a result of rounding errors in matrix transformations the + matrices in ps/pdf output look like: + + 0.000000000000000061 1 1 -0.000000000000000061 0 842 cm + + This patch rounds to zero matrix elements that are very small compared to + other elements in the same matrix. + + src/cairo-output-stream-private.h | 5 +++++ + src/cairo-output-stream.c | 39 ++++++++++++++++++++++++++++++++++ + src/cairo-pdf-operators.c | 17 +++++---------- + src/cairo-pdf-surface.c | 44 +++++++++++++++++---------------------- + src/cairo-ps-surface.c | 40 ++++++++++++++--------------------- + 5 files changed, 84 insertions(+), 61 deletions(-) + +commit 31eff5c6eb57ad379689748fd8c60a5ffe0ba481 +Author: Uli Schlachter +Date: Sat Nov 16 19:05:35 2013 +0100 + + Correct usage of CAIRO_STACK_ARRAY_LENGTH + + This macro wants the array type as its argument and calls sizeof() on it + internally. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 2 +- + src/cairo-xlib-render-compositor.c | 2 +- + src/cairo-xlib-surface-shm.c | 4 ++-- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 8c73949e44d4201fafc899693964c934f7072fa6 +Author: Henry Song +Date: Tue Nov 12 09:53:29 2013 -0800 + + gl: Fix one off issue in context cleanup + + ctx->vertex_shaders is only CAIRO_GL_VAR_TYPE_MAX large, so we should + abort the loop before the index is equal to CAIRO_GL_VAR_TYPE_MAX. + + Signed-off-by: Martin Robinson + + src/cairo-gl-shaders.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 56a195a76554abe1d5567c733ba679058fe01303 +Author: Bryce Harrington +Date: Wed Oct 30 18:43:42 2013 -0700 + + Fix SSIZE_T definition problem when making with MSYS on Windows7 + + Patch provided by Martin Schlemmer on the + mailing list. + + Reviewed-by: Bryce Harrington + + util/cairo-missing/cairo-missing.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 66f4140e73e423bfed640cfde5cb50c08cf29e2e +Author: Kouhei Sutou +Date: Mon Oct 28 22:37:54 2013 +0900 + + cairo_create(): Add finished surface check + + Without this change, the following program crashes: + + #include + #include + + int + main(int argc, char **argv) + { + cairo_t *cr; + cairo_surface_t *finished_surface; + + finished_surface = cairo_svg_surface_create ("/tmp/xxx.svg", 1.0, 1.0); + cairo_surface_finish (finished_surface); + + cr = cairo_create (finished_surface); + cairo_destroy (cr); + + cairo_surface_destroy (finished_surface); + + return 0; + } + + Reviewed-by: Bryce Harrington + + src/cairo.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b9263fea14c4c6266140205c0bffb3ae93750999 +Author: egag +Date: Wed Oct 9 14:14:02 2013 +0200 + + Fixes stroke-clipped, i.c. of a dashed stroke + + Similar to 1f4d05b55c96347aa4240190fda27f951b00c539 + 'Fix calling '_cairo_spline_intersect' for in-bounds checking of splines' + + Reviewed-by: Bryce Harrington + + src/cairo-path-stroke-traps.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 98fef3cef2d0f7f463a2e4f9f1b35b09f7b6ea77 +Author: Søren Sandmann Pedersen +Date: Wed Oct 9 15:53:16 2013 -0400 + + _cairo_color_double_to_short(): Use standard rounding algorithm + + The _cairo_color_double_to_short() function converts a double + precision floating point value in the range of [0.0, 1.0] to a + uint16_t integer by dividing the [0.0, 1.0] range into 65536 + equal-sized intervals and then associating each interval with an + integer. + + Under the assumption that an integer i corresponds to the real value i + / 65535.0 this algorithm introduces more error than necessary as can + be seen from the following picture showing the analogous + transformation for two-bit integers: + + +-----------+-----------+-----------+-----------+ + 0b00 | 0b01 | 0b10 | 0b11 + +-----------+-----------+-----------+-----------+ + + which shows that some floating point values are not converted to the + integer that would minimize the error in value that that integer + corresponds to. + + Instead, this patch uses standard rounding, which makes the diagram + look like this: + + +-------+---------------+---------------+-------+ + 0b00 | 0b01 | 0b10 | 0b11 + +-------+---------------+---------------+-------+ + + It's clear that if the values corresponding to the given integers are + fixed, then it's not possible to decrease the resulting error by + moving any of the interval boundaries. + + See this thread for more information: + + http://lists.freedesktop.org/archives/cairo/2013-October/024691.html + + Reference images updated: + + pthread-similar.ref.png + record-paint-alpha.ref.png + record90-paint-alpha.argb32.ref + record90-paint-alpha.rgb24.ref.png + xcb-huge-image-shm.ref.png + xcb-huge-subimage.ref.png + + All of these have only one-step differences to the old images. + + src/cairo-color.c | 11 +++-------- + test/reference/pthread-similar.ref.png | Bin 170 -> 176 bytes + test/reference/record-paint-alpha.ref.png | Bin 256 -> 245 bytes + test/reference/record90-paint-alpha.argb32.ref.png | Bin 105 -> 105 bytes + test/reference/record90-paint-alpha.rgb24.ref.png | Bin 105 -> 105 bytes + test/reference/xcb-huge-image-shm.ref.png | Bin 97 -> 97 bytes + test/reference/xcb-huge-subimage.ref.png | Bin 97 -> 97 bytes + 7 files changed, 3 insertions(+), 8 deletions(-) + +commit 6f05ecf488314e4b0c6c6b0110963c449bebe7d7 +Author: Adrian Johnson +Date: Fri Oct 11 19:59:50 2013 +1030 + + type1-subset: don't rename glyphs used by seac operator + + Bug 70364 + + src/cairo-type1-subset.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit f1eefee985b4361386a167e80d9836593ade59b9 +Author: Chris Wilson +Date: Sun Oct 6 09:57:44 2013 +0100 + + win32: Reorder font declarations to be in natural order + + Reported-by: John Emmas + Signed-off-by: Chris Wilson + + src/win32/cairo-win32-font.c | 90 +++++++++++++++++++++----------------------- + 1 file changed, 43 insertions(+), 47 deletions(-) + +commit 49366c5e9e7d5afd0daef4c53a41472e020145eb +Author: Uli Schlachter +Date: Thu Oct 3 17:53:34 2013 +0200 + + cairo-xlib: Fix out of bounds array access in format cache + + The cairo-xlib backend maintains a mapping form cairo_format_t to xrender + formats. This is done via an array. The size of this array is + CAIRO_FORMAT_RGB16_565 + 1 which evaluates to 5. + + However, CAIRO_FORMAT_RGB30 has the numeric value 5, too. Thus, using this value + as an index into the array would actually read the following force_precision + field from cairo_xlib_display_t. + + This could be triggered by passing CAIRO_FORMAT_RGB30 to + _cairo_xlib_display_get_xrender_format(). From a quick look, I didn't find any + code which would allow doing this, but neither did I find anything allowing + CAIRO_FORMAT_RGB16_565, so it's better to handle this correctly than assert()ing + for this to never happen. + + Signed-off-by: Uli Schlachter + + src/cairo-xlib-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 217bed84dda43f018e59a4d9a229f63095e1aa06 +Author: Uli Schlachter +Date: Thu Oct 3 17:44:27 2013 +0200 + + Revert "[xlib] Fast-path the likely case of retrieving a known xrender_format" + + This reverts commit 09a2b2ed3189fe12483cbd673c24ceddc2c20f3f. + + Back in 2009, _cairo_xlib_display_get_xrender_format() had to acquire a lock to + do its job. The above commit added a fast-path which avoided the lock in most + cases. + + However, in 2010 commit f74ad37e66bbdcc4d727ed6d931dde870d84c2f4 modified the + locking in the cairo-xlib backend and now this function never takes any locks. + + Thus, the fast-path that was added a year earlier now just does the same thing + that the regular code does and the list of cached formats was checked twice. + Reverting the earlier commit fixes this. + + Signed-off-by: Uli Schlachter + + src/cairo-xlib-display.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 592e6a98031cccfae8551bcd86c1f5134726a4f6 +Author: Uli Schlachter +Date: Sun Sep 15 14:05:42 2013 +0200 + + README: Don't mention XFAIL_TESTS anymore + + The variable XFAIL_TESTS is not used anymore since commit e90073f7ddc. + + Instead, we now have special reference images that show the wrong output and the + test suite fails a test if it does not match the expected, wrong output. + + Signed-off-by: Uli Schlachter + + test/README | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +commit bc89be2fff92968a1b585e75371ae2a8a26592e9 +Author: Uli Schlachter +Date: Sun Sep 29 13:12:55 2013 +0200 + + Remove XFAIL_TESTS from Makefile.am + + The variable XFAIL_TESTS is not used anymore since commit e90073f7ddc. + + The description for the known failures are moved into the respective tests as + comments. + + The following descriptions were dropped: + + - surface-pattern-big: Didn't really explain the failure + - big-line: Test isn't failing any more + - self-intersecting: Only XFAIL on quartz, but description doesn't match this + + The following tests don't have a xfail reference image and seem to fail just + because of not having a reference image at all (I kept their description for + now): + + big-trap, long-lines, self-copy-overlap + + Signed-off-by: Uli Schlachter + + test/Makefile.am | 73 ------------------------------------------ + test/alpha-similar.c | 4 +++ + test/big-trap.c | 1 + + test/degenerate-dash.c | 5 +++ + test/degenerate-path.c | 4 +++ + test/device-offset-scale.c | 4 +++ + test/in-fill-empty-trapezoid.c | 5 +++ + test/long-lines.c | 1 + + test/scale-offset-image.c | 1 + + test/self-copy-overlap.c | 5 +++ + 10 files changed, 30 insertions(+), 73 deletions(-) + +commit 5e6e4536716197ea0605732d32959c57ea8bb140 +Author: Adrian Johnson +Date: Sun Sep 29 22:23:31 2013 +0930 + + pdf: stencil masks may be opaque + + src/cairo-pdf-surface.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit d3a8d5a9c266b79b0059dd309b5e3eff3ce81a64 +Author: Adrian Johnson +Date: Sun Sep 29 22:18:06 2013 +0930 + + pdf: Support stencil masks with jpeg/jpx/jbig2 embedding + + src/cairo-pdf-surface.c | 204 +++++++++++++++++++++++++++++++----------------- + 1 file changed, 131 insertions(+), 73 deletions(-) + +commit 07940ecd6055e29addcdb4c14e4449a06a30bf4a +Author: Adrian Johnson +Date: Sun Sep 29 12:42:59 2013 +0930 + + pdf: combine source and mask images into single image + + Since PDF stores the alpha component of images in a separate stream + which can have a different resolution and encoding to the color + components we can optimize the case where the source and mask are both images. + + If the source and mask are both images with the same extents and the + source is opaque, combine the images into a single PDF image (ie the + source is written the the image stream and the mask is written to the + smask stream). + + src/cairo-pdf-surface-private.h | 2 + + src/cairo-pdf-surface.c | 466 +++++++++++++++++++++++++++++----------- + 2 files changed, 347 insertions(+), 121 deletions(-) + +commit c1ac8db7e60bcec8235b09729b34154e95790534 +Author: Chris Wilson +Date: Fri Sep 27 16:35:08 2013 +0100 + + trace: Fix operand emission + + Recent updates (in the past couple of years) to firefox have exposed + numerous bugs in the way we emit the operands. A few off-by-ones, + missing surfaces and outright bugs all of which are intermixed into + producing a corrupt stack. + + Reported-by: Siarhei Siamashka + Signed-off-by: Chris Wilson + + util/cairo-trace/trace.c | 232 +++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 182 insertions(+), 50 deletions(-) + +commit 0c2faf6621c4983e2ec2bea7c722a5cd3d89cc6d +Author: Uli Schlachter +Date: Fri Sep 27 15:37:08 2013 +0200 + + fill_reduces_to_source(): Handle failure of color_to_pixel() + + The function color_to_pixel() can fail for unsupported pixman image formats, but + fill_reduces_to_source() ignored this possibility. + + Fix this by using the return value of color_to_pixel(): + + Fixes the following compiler warnings: + + cairo-image-compositor.c: In function 'fill_boxes': + cairo-image-compositor.c:349:15: warning: 'pixel' may be used uninitialized in this function [-Wmaybe-uninitialized] + cairo-image-compositor.c: In function 'fill_rectangles': + cairo-image-compositor.c:304:18: warning: 'pixel' may be used uninitialized in this function [-Wmaybe-uninitialized] + + Signed-off-by: Uli Schlachter + + src/cairo-image-compositor.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 38a925460b35c82833dc4d508e7a0e7e84242318 +Author: Bryce Harrington +Date: Thu Sep 26 10:58:56 2013 -0700 + + test: Drop unnecessary math.h include + + Commit 0ac81988 refactored away fmin; nothing else from math.h is + needed. + + test/pixman-downscale.c | 1 - + 1 file changed, 1 deletion(-) + +commit 337ab1f8d9e29086bfb4001508b28835b41c6390 +Author: Chris Wilson +Date: Tue Sep 17 16:28:19 2013 +0100 + + font: Push the last reference dec into the backend->destroy() callback + + In order to close a race between locking the backend and resurrecting a + font via the cache, we need to keep the font face alive until after we + take the backend lock. Once we have that lock, we can drop our reference + and test if that was the last. Otherwise we must abort the destroy(). + + This fixes the double-free exposed by multithreaded applications trying + to create and destroy the same font concurrently. + + Reported-by: Weeble + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=69470 + Signed-off-by: Chris Wilson + + src/cairo-font-face.c | 43 +++++++++++++++++++++++++++++++------------ + src/cairo-ft-font.c | 18 ++++++++---------- + src/cairo-quartz-font.c | 3 ++- + src/cairo-toy-font-face.c | 7 ++++--- + src/cairo-user-font.c | 2 +- + src/cairoint.h | 7 +++++-- + src/win32/cairo-win32-font.c | 7 ++++--- + 7 files changed, 55 insertions(+), 32 deletions(-) + +commit 0ac81988c199df1a6652dc0ea72627122bf95c6c +Author: Chris Wilson +Date: Tue Sep 17 08:32:29 2013 +0100 + + test/pixman-downscale: Open-code fmin() + + fmin() requires a bump to either _XOPEN_SOURCE_ >= 600 (POSIX 2004) or + c99 - which is a needless dependency for a single simple routine. + + Signed-off-by: Chris Wilson + + test/pixman-downscale.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c75065ecefe18557c9d56e1c973215f01f3cd40 +Author: Uli Schlachter +Date: Mon Sep 16 12:45:21 2013 +0200 + + xcb: Remove useless error handling + + All the *_reply() functions in XCB return a pointer to their result and as last + argument they get a xcb_generic_error_t** where pointers to errors are stored, + if any occurs. + + However, a request can either fail or succeed. This means that if the returned + result is a NULL pointer, then an error occurred and the other way around: If + the error pointer is set to non-NULL, then the function must have returned NULL. + + Thus, all the code, which just checks if an error occurred and which does not + care about the exact error code, does not need to get the error pointer at all. + In this case, xcb will free() the error internally. + + While doing this, I noticed that _cairo_xcb_connection_get_image() always + succeeds and thus its return value can be replaced with the GetImage result. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-connection-core.c | 32 ++++++++++---------------------- + src/cairo-xcb-connection-shm.c | 6 ++---- + src/cairo-xcb-private.h | 5 ++--- + src/cairo-xcb-surface.c | 23 ++++++++--------------- + 4 files changed, 22 insertions(+), 44 deletions(-) + +commit 440624cdf2bd55ac1620e697cc481a8fbbb1c657 +Author: Uli Schlachter +Date: Sun Sep 15 15:00:02 2013 +0200 + + test/multi-page: Fix use-after-free + + Commit f9dcd07d22a5269 changed the way the file name is allocated and introduced + a use-after-free in doing so. + + Signed-off-by: Uli Schlachter + + test/multi-page.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1d00550784d052e9b72b3c91d5769f771033037c +Author: Uli Schlachter +Date: Sun Sep 15 14:50:20 2013 +0200 + + image: Handle PIXMAN_a8r8g8b8_sRGB in switch + + Fixes the following compiler warning: + + cairo-image-surface.c: In function '_cairo_format_from_pixman_format': + cairo-image-surface.c:93: warning: enumeration value 'PIXMAN_a8r8g8b8_sRGB' not + handled in switch + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58726 + Signed-off-by: Uli Schlachter + + src/cairo-image-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 966bf2fe6a8c29f4d10b20f982a4ab198a441c78 +Author: Uli Schlachter +Date: Sun Sep 15 16:58:05 2013 +0200 + + check-doc-syntax: Don't hardcode path to awk + + Instead of expecting awk in /usr/bin, this commit changes the code to call awk + through a shell so that $PATH is searched. + + Since this awk script shouldn't really be called manually, this is done by + removing the shebang from the awk script, marking it non-executable and fixing + up the caller. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=67674 + Reviewed-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + src/check-doc-syntax.awk | 2 -- + src/check-doc-syntax.sh | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit a8a805b8d9bbbfed9986ecc71e76859a5353730f +Author: Uli Schlachter +Date: Fri Sep 13 22:18:08 2013 +0200 + + cairo-gobject: Require at least glib 2.14 + + cairo-gobject uses g_once_init_enter() and g_once_init_leave(). These functions + were added in glib 2.14 and thus cairo needs at least this version for its + gobject helper functions. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=69239 + Signed-off-by: Uli Schlachter + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 412a4c34d9207c339fd16a99756ea96082dc993f +Author: Adrian Johnson +Date: Sun Sep 15 21:27:50 2013 +0930 + + test: update mime-data to test jbig2 mime types + + test/global.jb2 | Bin 0 -> 151 bytes + test/image1.jb2 | Bin 0 -> 143 bytes + test/image2.jb2 | Bin 0 -> 92 bytes + test/mime-data.c | 97 ++++++++++++++++++++++++++- + test/reference/mime-data.base.argb32.ref.png | Bin 185 -> 243 bytes + test/reference/mime-data.base.rgb24.ref.png | Bin 185 -> 243 bytes + test/reference/mime-data.pdf.ref.png | Bin 6482 -> 7563 bytes + test/reference/mime-data.ps.ref.png | Bin 4554 -> 4705 bytes + test/reference/mime-data.ref.png | Bin 185 -> 243 bytes + test/reference/mime-data.script.ref.png | Bin 2041 -> 2130 bytes + test/reference/mime-data.svg.ref.png | Bin 6264 -> 6437 bytes + 11 files changed, 96 insertions(+), 1 deletion(-) + +commit 5c0caa6f82374ec38a33d5f25a725f60bc121887 +Author: Adrian Johnson +Date: Sat Sep 14 20:59:56 2013 +0930 + + pdf: support JBIG2 mime data + + JBIG2 images may have shared global data that is stored in a separate + stream in PDF. The CAIRO_MIME_TYPE_JBIG2 mime type is for the JBIG2 + data for each image. All images that use global data must also set + CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID to a unique identifier. One of the + images must also set CAIRO_MIME_TYPE_JBIG2_GLOBAL to the global + data. The global data will be shared by all JBIG2 images with the same + CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. + + src/cairo-device.c | 1 + + src/cairo-error-private.h | 1 + + src/cairo-image-info-private.h | 5 ++ + src/cairo-image-info.c | 135 +++++++++++++++++++++++++++++ + src/cairo-misc.c | 2 + + src/cairo-pdf-surface-private.h | 8 ++ + src/cairo-pdf-surface.c | 182 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-region.c | 1 + + src/cairo-spans.c | 2 + + src/cairo-surface.c | 4 +- + src/cairo.c | 4 +- + src/cairo.h | 6 ++ + 12 files changed, 349 insertions(+), 2 deletions(-) + +commit 2d6705671a900251f00c6b59375bd4d23ec6b4d0 +Author: Adrian Johnson +Date: Fri Sep 13 22:14:49 2013 +0930 + + ps: fix embedding of mime data + + src/cairo-ps-surface.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 266d6e71566ac8c5e360c0b32fb78e23e6a06168 +Author: Adrian Johnson +Date: Fri Sep 13 21:32:42 2013 +0930 + + pdf: fix embedding of mime data that has been broken since 0a10982f + + For some reason the mime-data test is not detecting this failure. + + src/cairo-pdf-surface.c | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +commit 5390c2bbca3f1331f4fc831ba1381cc64e0162c6 +Author: Bryce W. Harrington +Date: Thu Sep 12 22:55:02 2013 +0000 + + test: Document use of -k and CAIRO_TEST_TARGET to run test subsets + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/README | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 640eb0206738e1d1bfd9beebaf0dcb6ac0e07584 +Author: Bryce W. Harrington +Date: Thu Sep 12 22:55:02 2013 +0000 + + test: Space out keywords for clarity + + As another nitpick, a comma alone is legal for separating keywords, but + most tests use a comma and a space. Update the few tests that don't, + to make this consistent. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/image-bug-710072.c | 4 ++-- + test/mesh-pattern-accuracy.c | 2 +- + test/mesh-pattern-conical.c | 2 +- + test/mesh-pattern-control-points.c | 2 +- + test/mesh-pattern-fold.c | 2 +- + test/mesh-pattern-overlap.c | 2 +- + test/mesh-pattern-transformed.c | 2 +- + test/mesh-pattern.c | 2 +- + test/record1414x.c | 4 ++-- + 9 files changed, 11 insertions(+), 11 deletions(-) + +commit a6ace0cf6b96930c08397c64bffabc4b201ab4e8 +Author: Bryce W. Harrington +Date: Thu Sep 12 22:55:02 2013 +0000 + + test: Comma separate keywords + + The parser accepts spaces as separtors between keywords, so this is nit + picky. But only a minority of tests don't follow the comma convention, + so change them to be consistent. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/a1-bug.c | 2 +- + test/arc-direction.c | 2 +- + test/caps-joins-curve.c | 2 +- + test/caps-tails-curve.c | 2 +- + test/caps.c | 8 ++++---- + test/clip-empty-group.c | 2 +- + test/drunkard-tails.c | 2 +- + test/joins.c | 2 +- + test/partial-coverage.c | 22 +++++++++++----------- + test/rectilinear-dash-scale.c | 4 ++-- + test/rectilinear-dash.c | 2 +- + test/scale-offset-image.c | 2 +- + test/scale-offset-similar.c | 2 +- + test/unclosed-strokes.c | 2 +- + 14 files changed, 28 insertions(+), 28 deletions(-) + +commit aacc5e76ed39b69595194a23e94bbd6483dd88a6 +Author: Bryce W. Harrington +Date: Thu Sep 12 22:55:01 2013 +0000 + + gitignore: Ignore build chaff when configuring with --enable-gtk-doc + + When this flag is enabled in configure, a couple extra build files are + created, which git should just ignore. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + .gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit ac5f3e2b8ef1937b3e6e3a3f03773cf471e46cc3 +Author: Bryce Harrington +Date: Wed Sep 11 09:59:01 2013 -0700 + + test: Move cairo_pattern_set_filter to after cairo_set_source_surface + + Also update the image.arg32 reference images, since for now we're just + accepting pixman's output as truth. This fixes up several tests: + + was is + Tests run: 420 420 + Passed: 224 261 + Failed: 195 159 + Expected Failed: 0 0 + Error: 0 0 + Crashed: 0 0 + Untested: 0 0 + Total: 420 420 + + Thanks to psychon for finding the code error in the test. + + test/pixman-downscale.c | 2 +- + test/reference/pixman-downscale-fast-95.ref.png | Bin 685 -> 299 bytes + test/reference/pixman-downscale-nearest-95.ref.png | Bin 685 -> 299 bytes + 3 files changed, 1 insertion(+), 1 deletion(-) + +commit ade7089f72e0d147db961dec88d3cb1b2280a438 +Author: Bryce Harrington +Date: Wed Jul 10 17:27:28 2013 -0700 + + test: Exercise image scaling quality when downscaling + + This adds testcases for the various cairo filter options, each of which + match to corresponding pixman filters. Use the 'downscale' keyword if + invoking tests using cairo-test-suite. + + The 24-pixel reference images were produced from quad-color.png using + Gimp's Scale Image command with Interpolation set to None. It is + assumed that all filters should handle a 1:4 scaling cleanly with no + antialiased blurring. + + The 95-pixel reference images assume differing types of antialiasing + based on the quality level. We are using the image.argb32 output as + reference here. Potentially some other rendering algorithm could + conceivably provide better results in the future. + + The 96-pixel reference images are simply copies of the original + quad-color.png file. It is assumed that 1:1 downscaling operations + should produce no visible change to the original image. + + Signed-off-by: Bryce Harrington + + test/pixman-downscale.c | 146 +++++++++++++++++++-- + test/reference/pixman-downscale-24.ref.png | Bin 191 -> 0 bytes + test/reference/pixman-downscale-95.ref.png | Bin 285 -> 0 bytes + test/reference/pixman-downscale-96.ref.png | Bin 301 -> 0 bytes + test/reference/pixman-downscale-best-24.ref.png | Bin 0 -> 191 bytes + test/reference/pixman-downscale-best-95.ref.png | Bin 0 -> 685 bytes + test/reference/pixman-downscale-best-96.ref.png | Bin 0 -> 301 bytes + .../reference/pixman-downscale-bilinear-24.ref.png | Bin 0 -> 191 bytes + .../reference/pixman-downscale-bilinear-95.ref.png | Bin 0 -> 685 bytes + .../reference/pixman-downscale-bilinear-96.ref.png | Bin 0 -> 301 bytes + test/reference/pixman-downscale-fast-24.ref.png | Bin 0 -> 191 bytes + test/reference/pixman-downscale-fast-95.ref.png | Bin 0 -> 685 bytes + test/reference/pixman-downscale-fast-96.ref.png | Bin 0 -> 301 bytes + test/reference/pixman-downscale-good-24.ref.png | Bin 0 -> 191 bytes + test/reference/pixman-downscale-good-95.ref.png | Bin 0 -> 685 bytes + test/reference/pixman-downscale-good-96.ref.png | Bin 0 -> 301 bytes + test/reference/pixman-downscale-nearest-24.ref.png | Bin 0 -> 191 bytes + test/reference/pixman-downscale-nearest-95.ref.png | Bin 0 -> 685 bytes + test/reference/pixman-downscale-nearest-96.ref.png | Bin 0 -> 301 bytes + 19 files changed, 132 insertions(+), 14 deletions(-) + +commit 0f554c36d3edf341a9aef8eedfde57f3be635500 +Author: Bryce Harrington +Date: Wed Jul 10 16:29:56 2013 -0700 + + test: Test a variety of scales when downscaling + + Downscaling from 96 to 24 is easy since it's an even multiple, so try + scaling by -1 pixel too. + + This adds a 1:1 scaling test case as well, which should pass through the + image unchanged. + + Signed-off-by: Bryce Harrington + + test/pixman-downscale.c | 21 +++++++++++++++++---- + test/reference/pixman-downscale-24.ref.png | Bin 0 -> 191 bytes + test/reference/pixman-downscale-95.ref.png | Bin 0 -> 285 bytes + test/reference/pixman-downscale-96.ref.png | Bin 0 -> 301 bytes + test/reference/pixman-downscale.ref.png | Bin 191 -> 0 bytes + 5 files changed, 17 insertions(+), 4 deletions(-) + +commit 642b6d80917feeea878a11f8aaf179b7a1e5392d +Author: Bryce Harrington +Date: Wed Jul 10 10:19:21 2013 -0700 + + test: Add test for image downscaling + + This adds pixman-downscale.c, which tests correctness of PNG images + scaled down using pixman routines. + + Signed-off-by: Bryce Harrington + + test/Makefile.sources | 1 + + test/pixman-downscale.c | 73 ++++++++++++++++++++++++++++++++ + test/quad-color.png | Bin 0 -> 301 bytes + test/reference/pixman-downscale.ref.png | Bin 0 -> 191 bytes + 4 files changed, 74 insertions(+) + +commit 7270f22af3d1ad53f033023438e915e11bf88407 +Author: Martin Robinson +Date: Wed Sep 11 08:52:31 2013 -0700 + + gl: Extend oversize check to cairo_gl_surface_create_for_texture + + If a texture is too large to render to via a framebuffer, then eagerly + fail with an error surface. + + src/cairo-gl-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 279d5a2ed1aaa6d5dbfbeab9e4b4ffa6a66aa6f3 +Author: Uli Schlachter +Date: Wed Sep 11 15:28:29 2013 +0200 + + recording: Correctly determine alpha of all surfaces + + This code has special cases for recording and image surfaces. For all other + kinds of source surfaces, has_bilevel_alpha was not modified, even though the + source surface could have an alpha channel. + + Fix this by using the same checks as in the general path at the end of this + function. + + Signed-off-by: Uli Schlachter + + src/cairo-recording-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit a6f51fed985f7db37c672bab0b5dab3f89e78282 +Author: Uli Schlachter +Date: Wed Sep 11 15:24:53 2013 +0200 + + recording: Fix unitialized variable 'free_me' + + This variable should be NULL by default and gets set only if a new reference to + a surface was acquired through _cairo_surface_snapshot_get_target(). This works, + because cairo_surface_destroy(NULL) is well-defined and doesn't do anything. + + Fixes the following compiler warning: + + cairo-recording-surface.c:1642:24: warning: 'free_me' may be used uninitialized + in this function [-Wmaybe-uninitialized] + + Signed-off-by: Uli Schlachter + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8addb4798c918000eaa6f6dab138e0abb0efa946 +Author: Adrian Johnson +Date: Sun Apr 8 10:57:23 2012 +0930 + + pdf: avoid making groups a transparency group if not required + + If the group contains only a combination of clear and opaque alpha and + only OPERATOR_OVER is used in the group and to paint the group, a + transparency group is not required. This allows the pdf viewer to + replay the group in place. + + src/cairo-pdf-surface-private.h | 2 + + src/cairo-pdf-surface.c | 125 +++++++++++++++++++++++++--------- + src/cairo-recording-surface-private.h | 8 +++ + src/cairo-recording-surface.c | 113 ++++++++++++++++++++++++++++++ + 4 files changed, 215 insertions(+), 33 deletions(-) + +commit 53255625c07d8f24403f0cb1b5a4dbaac142e4da +Author: Bryce W. Harrington +Date: Sun Sep 8 20:10:04 2013 +0000 + + svg, test: Refer to output filename by variable, not a hardcoded value + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9dcd07d22a5269bf799317a36bb2887d8f9af64 +Author: Bryce W. Harrington +Date: Sun Sep 8 20:10:03 2013 +0000 + + test: Ensure output dirs exist, falling back to current dir if needed + + This change makes several tests behave more like ps-eps.c, et al by + making them attempt to mkdir "output", and in case of trouble use "." + instead. filenames are now allocated at runtime due to this change, so + ensure the corresponding free()'s are in place as well. + + This should facilitate running the test suite with a relative path + outside cairo's source tree, such as when employing the CAIRO_REF_DIR + environment variable. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/create-for-stream.c | 14 +++++++++++--- + test/fallback-resolution.c | 20 +------------------- + test/multi-page.c | 9 ++++++--- + test/pdf-features.c | 6 +++++- + test/pdf-mime-data.c | 6 +++++- + test/pdf-surface-source.c | 6 +++++- + test/png.c | 8 +++++++- + test/ps-eps.c | 20 +------------------- + test/ps-features.c | 8 +++++--- + test/ps-surface-source.c | 6 +++++- + test/svg-clip.c | 6 +++++- + test/svg-surface-source.c | 6 +++++- + test/svg-surface.c | 6 +++++- + 13 files changed, 66 insertions(+), 55 deletions(-) + +commit be7f1ac98f62669743f381df8845886d29a9f7f4 +Author: Bryce W. Harrington +Date: Sun Sep 8 20:10:03 2013 +0000 + + test: Make cairo_test_mkdir() usable throughout tests. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/cairo-test.c | 10 +++++----- + test/cairo-test.h | 3 +++ + 2 files changed, 8 insertions(+), 5 deletions(-) + +commit 6731023f1bba7e26dbbc06defdbb37ac5267e9db +Author: Bryce W. Harrington +Date: Sun Sep 8 20:10:03 2013 +0000 + + test: Fix several tests to place output files in the output directory + + The standard location for test output is cairo/test/output. The harness + itself was updated to write automatically generated images in this + directory, however a number of tests generate their own local output + files. + + This patch updates these tests to write their output into + CAIRO_TEST_OUTPUT_DIR (which defaults to cairo/test/output) as well, in + the interest of decluttering the test directory. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/create-for-stream.c | 6 +++--- + test/multi-page.c | 5 +++-- + test/pdf-features.c | 3 ++- + test/pdf-mime-data.c | 9 +++++---- + test/pdf-surface-source.c | 4 +++- + test/png.c | 3 ++- + test/ps-features.c | 3 ++- + test/ps-surface-source.c | 4 +++- + test/svg-clip.c | 3 ++- + test/svg-surface-source.c | 4 +++- + test/svg-surface.c | 3 ++- + 11 files changed, 30 insertions(+), 17 deletions(-) + +commit f3574b8b3b3e9dbd9fca927096e5a8205e57033d +Author: Bryce W. Harrington +Date: Sun Sep 8 20:10:03 2013 +0000 + + test: Don't ignore test output files left in test directory + + Tests should be placing output files in the output/ directory now, + although not all tests follow this standard practice. Drop the + "*.out.*" from .gitignore to make improper test behavior more evident. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + test/.gitignore | 4 ---- + 1 file changed, 4 deletions(-) + +commit f52165a7bb3de56fe2a06771f554f3997e176b94 +Author: Adrian Johnson +Date: Fri Sep 6 08:00:46 2013 +0930 + + svg: Don't embed CMYK Jpeg images + + None of the SVG viewers I tried (rsvg, firefox, inkscape) support CMYK + Jpeg images. + + Bug 68965 + + src/cairo-svg-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 8e1a1ed8631dd55b4344d5682e6c69e923e0401f +Author: Adrian Johnson +Date: Fri Sep 6 07:54:28 2013 +0930 + + Downscaling requires pixman 0.30 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0266cb821fbf0bdd307af7bbcbbd22c4a14201fc +Author: Chris Wilson +Date: Thu Sep 5 16:13:56 2013 +0100 + + script: Add support for replaying device-scale + + Signed-off-by: Chris Wilson + + util/cairo-script/cairo-script-operators.c | 48 ++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +commit a4164142f2a21fb005533d1c5b3cf668c99d1259 +Author: Chris Wilson +Date: Thu Sep 5 16:12:26 2013 +0100 + + trace: Record set-device-scale + + Signed-off-by: Chris Wilson + + util/cairo-trace/trace.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 935c64a43409a80d9b19d491f9133004152de9bb +Author: Alexander Larsson +Date: Tue Aug 27 15:10:38 2013 +0200 + + surface: Inherit device scale in cairo_surface_create_similar() + + Without this most code that uses similar surfaces for offscreen + rendering will render in a pixelized fashion if the final + target uses a device scale. + + src/cairo-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit bc792a5e0e196dd9761649b14c9206465b42ef1d +Author: Alexander Larsson +Date: Tue Aug 27 14:46:16 2013 +0200 + + surface: Merge scratch construction into _cairo_surface_create_scratch + + We merge _cairo_surface_create_similar_scratch and + _cairo_surface_create_similar_solid into a single function named + _cairo_surface_create_scratch, to avoid confusion with + cairo_surface_create_similar which now will have a different + behaviour wrt the sizes and the device-scale. + + _create_scratch assumes the width and height are in backend + coordinates, while create_similar does not. + + src/cairo-clip-surface.c | 20 +++++------ + src/cairo-default-context.c | 10 +++--- + src/cairo-gl-traps-compositor.c | 18 +++++----- + src/cairo-mask-compositor.c | 14 ++++---- + src/cairo-shape-mask-compositor.c | 27 +++++++------- + src/cairo-spans-compositor.c | 10 +++--- + src/cairo-surface-subsurface.c | 9 ++--- + src/cairo-surface-wrapper.c | 4 +-- + src/cairo-surface.c | 75 +++++++++++++++++---------------------- + src/cairo-traps-compositor.c | 33 +++++++++-------- + src/cairo-xcb-surface-render.c | 20 +++++------ + src/cairo-xlib-source.c | 36 ++++++++++--------- + src/cairoint.h | 16 +++------ + 13 files changed, 145 insertions(+), 147 deletions(-) + +commit bdccf4fe51bca785f73205ccd26c4d020669e312 +Author: Alexander Larsson +Date: Tue Aug 27 14:33:14 2013 +0200 + + surface: Opencode create_similar + + We copy the _cairo_surface_create_similar_solid code into + cairo_surface_create_similar so that we can separate these later + as one wants to use backend sizes and one not. + + src/cairo-surface.c | 33 ++++++++++++++++++++++++++++++--- + 1 file changed, 30 insertions(+), 3 deletions(-) + +commit 5f70148467ff2767dc3c6d45f4af1223d7daa301 +Author: Chris Wilson +Date: Mon Jun 3 15:20:05 2013 +0100 + + test: Allow CAIRO_TEST_MODE to independently enable extended testing + + Such as CAIRO_TEST_MODE=scale for testing application of + cairo_surface_set_device_offset. + + CAIRO_TEST_MODE=similar - test rendering through similar surfaces + CAIRO_TEST_MODE=offset - test rendering with a device offset + CAIRO_TEST_MODE=scale - test rendering with a device scale + + test/cairo-test-runner.c | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 690c61aa54c27e4d35b04d0173abd5931fce507d +Author: Alexander Larsson +Date: Mon Jun 3 15:38:22 2013 +0200 + + tests: Add device scale test to "full" testrun similar to offsets + + test/cairo-test-private.h | 2 +- + test/cairo-test-runner.c | 66 ++++++++++++++++++++++++++--------------------- + test/cairo-test.c | 66 ++++++++++++++++++++++++++++------------------- + 3 files changed, 77 insertions(+), 57 deletions(-) + +commit 7ab34f302be72d9dda54d936b6d69bc7c534c885 +Author: Alexander Larsson +Date: Thu May 30 19:45:59 2013 +0200 + + surface: expose the device scale + + This adds the new public functions + cairo_surface_set_device_scale and cairo_surface_get_device_scale and + updates old users of the internal functions. + + src/cairo-default-context.c | 6 ++--- + src/cairo-paginated-surface.c | 2 +- + src/cairo-surface-subsurface.c | 12 +++++----- + src/cairo-surface.c | 52 +++++++++++++++++++++++++++++++----------- + src/cairo.h | 10 ++++++++ + src/cairoint.h | 7 ++---- + 6 files changed, 61 insertions(+), 28 deletions(-) + +commit 38217d67fc2226778dde8d05817cb916691d4d22 +Author: Chris Wilson +Date: Mon Jun 3 20:32:45 2013 +0100 + + spans,traps: Undo device transform from source matrix for recording replays + + As the replay of the recording surface applies the device_transform of + the matrix once again to all its operations, we end up with a repeated + transform through the source matrix of the recording surface. We need to + remove one of these, and the easiest way to do that appears to be to + undo the application to the source matrix. + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 13 +++++++++++-- + src/cairo-traps-compositor.c | 15 ++++++++++++--- + 2 files changed, 23 insertions(+), 5 deletions(-) + +commit f0e2cd4494b1ac9a351d095fbeb53d702342d35c +Author: Alexander Larsson +Date: Fri May 31 16:44:29 2013 +0200 + + gstate: Handle device scale on surface as source + + When creating a transformed pattern we must apply the device + transform *before* the transform set on the pattern itself, otherwise + e.g. its translation will not be affected by the device scale. + + We also fix up the device_transform related handling in + _cairo_default_context_pop_group(). With a device scale we can + no longer just use the device_transform_inverse to unset the + device offset for the extents, so we make that a simple translate + instead. + + We also remove some weird code that tries to handle the device + transform but seems unnecessary (maybe a workaround for applying + the device transform in the wrong order?). With that code removed + things work fine, but with it things get translated wrongly when + there is a scale. + + src/cairo-default-context.c | 23 ++++++++--------------- + src/cairo-gstate.c | 2 +- + src/cairo-pattern-private.h | 4 ++++ + src/cairo-pattern.c | 10 ++++++++++ + 4 files changed, 23 insertions(+), 16 deletions(-) + +commit 900fc4a890026e46a3b0a00967632f57074b8b93 +Author: Alexander Larsson +Date: Thu May 30 20:53:29 2013 +0200 + + gstate: Move device-scale font scaling to gstate + + If we do this in surface it will be applied twice then + we chain to a different surface, like e.g. a subsurface. + + We also remove a hack in cairo-surface-wrapper where it compensated + for the device scale not being applied. + + v2: Compute the backend CTM in ensure_scaled_font(). + + src/cairo-gstate.c | 8 +++++++- + src/cairo-surface-wrapper.c | 5 ++--- + src/cairo-surface.c | 31 ++++--------------------------- + 3 files changed, 13 insertions(+), 31 deletions(-) + +commit 25eaec0a3874a2090e1bb97547a328eb5c00b0b1 +Author: Alexander Larsson +Date: Thu May 30 20:53:15 2013 +0200 + + subsurface: Handle device scales + + src/cairo-surface-subsurface.c | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit 633d573889ad685c8f07e9ee72f6a1d240dfacf2 +Author: Alexander Larsson +Date: Thu May 30 19:48:33 2013 +0200 + + default-context: Inherit device scale in push_group surface + + Without this we will only render to part of the newly created + surface and then copy+scale that part back, which causes fuzziness. + + src/cairo-default-context.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit db7e551a6bf06a0aa7e2e6b3744b7663807d003f +Author: Alexander Larsson +Date: Thu May 30 19:47:19 2013 +0200 + + gstate: Respect device transform in stroke + + We need to apply the device transform to the ctm when stroking, as + otherwise line widths are not affected by the device scale. + + src/cairo-gstate.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit fb57ea13e04d82866cbc8e86c83261148bb3e231 +Author: Krzysztof Kosiński +Date: Thu Sep 5 16:02:14 2013 +0100 + + image: Use convolution filters for sample reconstruction when downscaling + + I had a look at how complex would it be to add correct downscaling to + Cairo now that Pixman supports convolution filters. It turns out it + this is rather easy. Here is an initial, minimal attempt. It uses + convolution filters only if the image is being downscaled by more than + half a pixel in at least one dimension. + + Some discussion: + + 1. The sampling and reconstruction kernels are picked in a way that + gives comparable quality when upscaling and downscaling. I paired box + sampling with bilinear reconstruction and impulse (point) sampling + with box reconstruction. This gives the expected result for NEAREST + filter. BEST filter uses Lanczos3 for both kernels. + + > Do we need to use a reconstruction filter for NEAREST at all? Or maybe + > differentiate between NEAREST and FAST in that case? + + If impulse (point) sampling is used, there must be some reconstruction + filter, otherwise no image is produced. That's because the sampling + grid does not match the data grid, and since there is no + reconstruction filter, values between data points are undefined. The + alternative is to use box sampling + no reconstruction. + + 2. Subsampling bits are always set to 1, since this doesn't seem to + affect quality at all. + + 3. I am not sure whether this code works correctly for matrices with a + skew component. It should be OK for any combination of scale, rotation + and translation. + + 4. This patch causes new failures in the test suite: + - recording-surface*: possibly an effect of improved quality. + - surface-pattern-scale-down*, surface-pattern-big-scale-down: the + reference images should be updated. + - pthread-same-source: I have no idea why this is failing, since this + test shouldn't even trigger the new code. + - large-source-roi: this test attempts to downscale an image which is + 30000 pixels wide down to 7 pixels. The filter parameters seem to be + created correctly, but they might trigger an overflow somewhere in the + convolution code; the output rectangle is white instead of red, as if + nothing was drawn. + - device-offset-scale: there are subtle differences which look like + convolution-related smoothing; I'm not sure whether this is OK or not. + + src/cairo-image-source.c | 65 ++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 55 insertions(+), 10 deletions(-) + +commit 28ad0f9f3bec65e462e29a1d0b1757a86d16c129 +Author: Chris Wilson +Date: Thu Sep 5 15:56:55 2013 +0100 + + Bump version for new development tree, 1.13.1 + + cairo-version.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 59e2a93b3c8a7b83d537bb2a4bbdd5f0f36a0cbc +Author: Chris Wilson +Date: Mon Aug 26 18:46:19 2013 +0100 + + Post-release version bump + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8e11a42e3e9b679dce97ac45cd8b47322536a253 +Author: Chris Wilson +Date: Mon Aug 26 15:30:20 2013 +0100 + + 1.12.16 release + + NEWS | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 56 insertions(+), 1 deletion(-) + +commit b710a4730940e54ac7ffd5073eecf950997a0484 +Author: Chris Wilson +Date: Mon Aug 26 17:18:38 2013 +0100 + + Make "make check" happy + + A recursive include should hide the bare header from + check-preprocessor-syntax.sh + + Signed-off-by: Chris Wilson + + src/cairo-pixman-private.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit fb8881e84bb24b2a54ee5aa449b6f5638de36404 +Author: Chris Wilson +Date: Fri Aug 23 12:48:08 2013 +0100 + + win32: Prevent double-free of similar images + + Based on a patch and analysis by Michael Henning. + + When we create a similar-image surface for win32, we set up a couple of + back references from the image to the win32 surface, and vice versa. We + need to be careful when decoupling the reference cycle to avoid chasing + around the loop upon destruction. Currently we handled destroying the + similar-image via the parent win32 surface, but similar precaution is + required when destroying the surface via the similar-image. + + Reported-by: Michael Henning + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=63787 + Signed-off-by: Chris Wilson + + src/cairo-image-surface.c | 3 ++- + src/win32/cairo-win32-display-surface.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 054f34111d220541bc785b30207387541fdd31d2 +Author: Chris Wilson +Date: Thu Aug 15 14:28:44 2013 +0000 + + Provide backwards compatibilty with old pixman + + The goal is to allow compilation against older pixman to ease regression + testing. + + Signed-off-by: Chris Wilson + + configure.ac | 2 +- + src/Makefile.sources | 1 + + src/cairo-ft-font.c | 6 +++-- + src/cairo-image-compositor.c | 44 +++++++++++++++++++++++-------------- + src/cairo-image-surface.c | 5 +++++ + src/cairo-pixman-private.h | 45 ++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib-render-compositor.c | 1 + + src/cairo-xlib-surface.c | 1 + + 8 files changed, 86 insertions(+), 19 deletions(-) + +commit 95f320e3f26b2a1552a53ebad14dd5086ccf0c60 +Author: Martin Robinson +Date: Mon Jul 29 11:14:34 2013 -0700 + + gl: Return surface in error when creating oversized texture surfaces + + When creating a texture surface that is larger than the maximum + framebuffer or texture dimensions of the context, return a surface in + error. Previously the code failed an assertion, but this prevents an + application from easily detecting when to fall back. + + Reviewed-by: Chris Wilson + + src/cairo-gl-surface.c | 33 +++++++++++------ + test/Makefile.sources | 1 + + test/gl-oversized-surface.c | 88 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 111 insertions(+), 11 deletions(-) + +commit b5e1373c5845c859ebf82ef4d5e065f6cdd68faf +Author: Henry Song +Date: Mon Aug 19 12:14:46 2013 -0700 + + gl/msaa: Clean up msaa depth/stencil buffer for OpenGLES + + OpenGLES also uses the depth/stencil buffer when doing multisampling, so + it's a leak to only clean up the buffer for desktop OpenGL. + + src/cairo-gl-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 54a51968e82ec4e6a8d81d5451232641275439df +Author: Uli Schlachter +Date: Mon Aug 12 16:33:19 2013 +0200 + + surface_get_extents: Reject finished or error surface + + This fixes a crash in the api-special-cases with xlib-xcb when calling + cairo_clip_extents() on a context that refers to a finished surface. + + The crash was a simple NULL pointer dereference, because the underlying xcb + surface that was used in xlib-xcb was gone and set to NULL already. + + Signed-off-by: Uli Schlachter + + src/cairo-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 3c4e0f0f1a338fbbd802cdb3b65b8ea3abc758d1 +Author: Uli Schlachter +Date: Mon Aug 12 15:59:18 2013 +0200 + + push_group: Refuse working with unusable surface + + Make cairo_push_group() fail when the context's target surface is finished. + + This fixes the api-special-cases for the xcb backend: + + Detected error during xcb run: error=9, seqno=0x13c, major=53, minor=0 + + The problem was that the Pixmap for the cairo surface was already freed and + cairo still tried to use it again as the drawable in a CreatePixmap request. + + Signed-off-by: Uli Schlachter + Reviewed-by: Chris Wilson + + src/cairo-default-context.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 18633b081026eb88931af6130b3e716fdb954e19 +Author: Uli Schlachter +Date: Mon Aug 12 15:40:00 2013 +0200 + + surface: Error out on finished surfaces + + Finished surfaces and surfaces with an error status must not be usable anymore, + so refuse to work on them. + + This improves the result for api-special-cases. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68014 + + Signed-off-by: Uli Schlachter + + src/cairo-surface.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit b64c83e891f2417a1b28034a55659260a1769ba7 +Author: Uli Schlachter +Date: Mon Aug 12 14:30:59 2013 +0200 + + api-special-cases: Also test contexts + + This adds code to the api-special-cases test which also tests the behavior of + cairo when the cairo context or the surface that is target is in an error state + or finished. These new tests call into all public entry points defined in + cairo.h which receive a cairo_t * as their first argument. + + Currently this causes a new crash in the testsuite: + + cairo-surface.c:394: + _cairo_surface_begin_modification: Assertion `! surface->finished' failed. + + Reported-by: christophe.troestler@umons.ac.be + References: https://bugs.freedesktop.org/show_bug.cgi?id=68014 + Signed-off-by: Uli Schlachter + + test/api-special-cases.c | 1174 +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 1153 insertions(+), 21 deletions(-) + +commit e438071e9debeca81f97c6fcdc1c2a91a969761d +Author: Bryce W. Harrington +Date: Tue Jul 9 21:22:59 2013 +0000 + + perf: Move macro-benchmark documentation to cairo-traces + + The macro benchmarks were moved to a separate repository some time ago, + but the perf README still refers to these tests as if they were still + present, which may lead to some confusion. Instead, consolodate the + macro benchmark documentation with the macro benchmarks, and focus this + README on just the (still in tree) micro-benchmarks. + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + perf/README | 89 ++++++++++++++----------------------------------------------- + 1 file changed, 20 insertions(+), 69 deletions(-) + +commit 4e133af60c1af42307724eb6a88b23056741d7e2 +Author: Bryce W. Harrington +Date: Tue Jul 9 21:23:52 2013 +0000 + + HACKING: Make mention of the separate cairo-traces repo + + Signed-off-by: Bryce Harrington + Signed-off-by: Uli Schlachter + + HACKING | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 46d9db96d460fea72f0420102e8a90c6a7231f79 +Author: Behdad Esfahbod +Date: Sun Aug 4 20:08:46 2013 -0400 + + [ft] Ensure alignment of bitmaps received from FreeType + + src/cairo-ft-font.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 34a747e7bdeba1cfe17318f80fbe6720d47bc023 +Author: Behdad Esfahbod +Date: Sun Aug 4 19:59:06 2013 -0400 + + [ft] Fix alignment + + src/cairo-ft-font.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit 3cd6c5966aca1d202744fe44083800bc2a4a831d +Author: Behdad Esfahbod +Date: Mon Jul 29 22:47:26 2013 -0400 + + Revert accidentally committed stuff + + build/configure.ac.pthread | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 0554d76402321b25cc952180e4d19436a9038d1a +Author: Behdad Esfahbod +Date: Mon Jul 29 22:41:46 2013 -0400 + + [ft] Add missing include + + build/configure.ac.pthread | 6 +++--- + src/cairo-ft-font.c | 1 + + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 7d26341072b13a78d4b3fe58779057ac020be487 +Author: Behdad Esfahbod +Date: Mon Jul 29 19:20:33 2013 -0400 + + [ft] Fix math + + src/cairo-ft-font.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 9444ef09ccde2735258cc1bd2f1912119a32dd88 +Author: Behdad Esfahbod +Date: Mon Jul 29 19:09:29 2013 -0400 + + Support 2bit and 4bit embedded bitmaps + + src/cairo-ft-font.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 51 insertions(+), 1 deletion(-) + +commit 274863be08f6c8df6d411df9db725d34f7fbabea +Author: Adrian Johnson +Date: Sun Jul 28 09:30:05 2013 +0930 + + type1-subset: Don't try to rename non winansi glyphs + + When the latin subset contains glyphs that use the seac operator to + combine two glyphs, additional non winansi glyphs are added to the + subset. These extra glyphs do not have a winansi name so they can't + be renamed. + + Based on a patch by Salvador Ortiz. + + Bug 67324 + + src/cairo-type1-subset.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 03c81d414d4edb710c91f96ddb7dbf73e5432583 +Author: Henry Song +Date: Mon Jul 8 11:36:25 2013 -0700 + + gl/msaa: Always use scissor when clipping + + Even when using the stencil buffer for clipping, always scissor the clip + extents. This simplifies the code a bit. + + src/cairo-gl-composite.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 8c710ed87244321dc18447936d629decc25d3d09 +Author: Henry Song +Date: Sun Jul 7 11:00:28 2013 -0700 + + gl/msaa: Disable stencil and scissor during framebuffer blit + + When blitting the framebuffer during transitions to and from + multi-sampling mode, we need to disable the stencil and scissor test so + that the entire surface is preserved. This fixes the bitmap-font test + for the MSAA compositor. + + src/cairo-gl-device.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit be2c09a1f59ad677a2b4718d26687873093b466c +Author: Henry Song +Date: Wed Jul 3 12:22:55 2013 -0700 + + gl/msaa: Properly destroy stencil buffer clip cache + + When replacing the stencil buffer clip cache or destroying a surface, + destroy the cached clip. This prevents the clip from leaking. + + src/cairo-gl-composite.c | 5 ++++- + src/cairo-gl-surface.c | 2 ++ + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 2cc353c3dbe01b4d8f65d6de800f2b1d6004a1c2 +Author: Behdad Esfahbod +Date: Wed Nov 7 14:34:42 2012 -0800 + + Towards support loading color glyphs from FreeType + + See comments. + + src/cairo-ft-font.c | 41 ++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 38 insertions(+), 3 deletions(-) + +commit e738079302a968b7b1fb9101cd4d92a8887bedce +Author: Behdad Esfahbod +Date: Fri Jul 5 15:22:18 2013 -0600 + + [ft] Fix wrong assumptions + + If subpixel rendering is enabled, but FT returns a 8bit gray bitmap + (perhaps because the font has 8bit embedded bitmaps) we were hitting + the assertions because the assumptions made were wrong. Fix up. + + src/cairo-ft-font.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit a0f556f37fb7016aa304b7cf0e811c0d38f0b969 +Author: Behdad Esfahbod +Date: Fri Jul 5 15:12:14 2013 -0600 + + [ft] Fix memory bug in copying bitmaps + + src/cairo-ft-font.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 9f9796920f5994090a19de357defe5e72ac61297 +Author: Uli Schlachter +Date: Fri Jun 21 20:38:43 2013 +0200 + + xcb: Fix some uninitialized variable warnings + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2170bdbb12f38e372ea2ce1c6492c60cb35f22e4 +Author: Uli Schlachter +Date: Fri Jun 21 20:36:09 2013 +0200 + + image compositor: Always finish the span renderer + + In some obscure conditions that I don't really understand, the image compositor + did not finish a span renderer that it created. This could then cause the last + row of the span to be ignored. + + Fixes: clip-complex-bug61492 + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61592 + Signed-off-by: Uli Schlachter + + src/cairo-image-compositor.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 9058e9ae283ae39a6a4f78dc3dbf8ab46b2ef291 +Author: Uli Schlachter +Date: Fri Jun 21 20:34:27 2013 +0200 + + Add new test for bug 61592 + + This test exercises some clipping-related failure that Seongwon Cho reported. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61592 + Signed-off-by: Uli Schlachter + + test/Makefile.sources | 3 +- + test/clip-complex-bug61592.c | 60 +++++++++++++++++++++++++++ + test/reference/clip-complex-bug61492.ref.png | Bin 0 -> 105 bytes + 3 files changed, 62 insertions(+), 1 deletion(-) + +commit 54bee5e0fc1fd1fa85b9f389a73502a7145e0846 +Author: Uli Schlachter +Date: Fri Jun 21 15:18:58 2013 +0200 + + Fix caps-tails-curve reference images + + Commit d7f5a1bec fixed a bug. This caused 12 new test failures for the + test-traps test target: + + caps-tails-curve degenerate-arc degenerate-path joins subsurface + subsurface-scale twin twin-antialias-gray twin-antialias-mixed + twin-antialias-none twin-antialias-subpixel user-font + + Most of these are indeed (new?) bugs. However, caps-tails-curve actually started + producing the expected result and the reference image just wrongly captures the + old state of things. + + At the time of that commit, just taking the output from test-traps as the new + reference image works fine for all backends. However, with current git, + something introduced more antialiasing noise and now test-traps changed again + while cairo-xcb stayed with the old result. Thus, we also need a new reference + image to fix this test. + + (The wrong reference images come from commit 8488ae02 which turned test-traps' + results into reference images) + + Signed-off-by: Uli Schlachter + + .../reference/caps-tails-curve.traps.argb32.ref.png | Bin 50617 -> 49798 bytes + test/reference/caps-tails-curve.traps.rgb24.ref.png | Bin 50617 -> 49798 bytes + test/reference/caps-tails-curve.xcb.ref.png | Bin 0 -> 50367 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 8b55703d760a0032772d7f9b1d17438b2db3f1b4 +Author: Chris Wilson +Date: Thu Jul 4 10:04:30 2013 +0100 + + test: Amend check-refs.sh to support out-of-tree builds + + test/Makefile.am | 4 ++-- + test/check-refs.sh | 19 ++++--------------- + 2 files changed, 6 insertions(+), 17 deletions(-) + +commit 8b4151a5e59cd2036e32c0eeb13afe420a434e19 +Author: Chris Wilson +Date: Thu Jul 4 10:02:46 2013 +0100 + + test: Remove conflicting .ref.png, .argb32.ref.png, .rgb24.ref.png + + Where a content specific reference image exists, prefer to have both + content reference images (i.e. both argb32.ref and rgb24.ref) rather + than a mix of .ref and argb32/rgb24. + + test/reference/a8-clear.ref.png | Bin 272 -> 0 bytes + test/reference/aliasing.ref.png | Bin 76314 -> 0 bytes + test/reference/alpha-similar.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.ref.png | Bin 99 -> 0 bytes + test/reference/arc-direction.ref.png | Bin 4124 -> 0 bytes + test/reference/big-line.ref.png | Bin 897 -> 0 bytes + test/reference/bitmap-font.argb32.ref.png | Bin 0 -> 950 bytes + test/reference/bitmap-font.ref.png | Bin 950 -> 0 bytes + test/reference/bug-40410.ref.png | Bin 428 -> 0 bytes + test/reference/bug-bo-ricotz.ref.png | Bin 2108 -> 0 bytes + test/reference/bug-extents.ref.png | Bin 6364 -> 0 bytes + test/reference/caps-joins.ref.png | Bin 2621 -> 0 bytes + test/reference/caps-sub-paths.ref.png | Bin 176 -> 0 bytes + test/reference/caps.ref.png | Bin 1687 -> 0 bytes + test/reference/clear-source.ref.png | Bin 779 -> 0 bytes + test/reference/clip-disjoint-hatching.ref.png | Bin 4390 -> 0 bytes + .../clip-fill-rule-pixel-aligned.argb32.ref.png | Bin 0 -> 195 bytes + test/reference/clip-fill-rule-pixel-aligned.ref.png | Bin 195 -> 0 bytes + test/reference/clip-fill.ref.png | Bin 836 -> 0 bytes + test/reference/clip-group-shapes-circles.ref.png | Bin 1178 -> 0 bytes + test/reference/clip-image.ref.png | Bin 2679 -> 0 bytes + test/reference/clip-intersect.ref.png | Bin 201 -> 0 bytes + test/reference/clip-mixed-antialias.ref.png | Bin 981 -> 0 bytes + test/reference/clip-polygons.ref.png | Bin 1355 -> 0 bytes + test/reference/clip-push-group.ref.png | Bin 166 -> 0 bytes + test/reference/clip-shape.ref.png | Bin 2249 -> 0 bytes + test/reference/clip-text.ref.png | Bin 796 -> 0 bytes + test/reference/clip-unbounded.argb32.ref.png | Bin 0 -> 100 bytes + test/reference/clip-unbounded.ref.png | Bin 100 -> 0 bytes + test/reference/clipped-group.ref.png | Bin 289 -> 0 bytes + test/reference/close-path.ref.png | Bin 271 -> 0 bytes + test/reference/copy-path.ref.png | Bin 513 -> 0 bytes + test/reference/create-from-png.ref.png | Bin 131 -> 0 bytes + test/reference/culled-glyphs.ref.png | Bin 434 -> 0 bytes + test/reference/dash-infinite-loop.ref.png | Bin 626 -> 0 bytes + test/reference/dash-offset-negative.ref.png | Bin 171 -> 0 bytes + test/reference/dash-state.ref.png | Bin 7642 -> 0 bytes + test/reference/dash-zero-length.ref.png | Bin 232 -> 0 bytes + test/reference/degenerate-linear-gradient.ref.png | Bin 322 -> 0 bytes + test/reference/degenerate-pen.ref.png | Bin 752 -> 0 bytes + test/reference/device-offset-positive.argb32.ref.png | Bin 0 -> 139 bytes + test/reference/device-offset-positive.ref.png | Bin 139 -> 0 bytes + test/reference/device-offset.argb32.ref.png | Bin 0 -> 137 bytes + test/reference/device-offset.ref.png | Bin 137 -> 0 bytes + test/reference/extend-pad-border.ref.png | Bin 616 -> 0 bytes + test/reference/fill-alpha-pattern.ref.png | Bin 2962 -> 0 bytes + test/reference/fill-alpha.ref.png | Bin 2167 -> 0 bytes + test/reference/fill-and-stroke-alpha-add.ref.png | Bin 536 -> 0 bytes + test/reference/fill-and-stroke-alpha.ref.png | Bin 462 -> 0 bytes + test/reference/fill-image.ref.png | Bin 972 -> 0 bytes + test/reference/fill-missed-stop.ref.png | Bin 455 -> 0 bytes + test/reference/fill-rule.ref.png | Bin 1769 -> 0 bytes + test/reference/filter-bilinear-extents.ref.png | Bin 1340 -> 0 bytes + test/reference/font-matrix-translation.ref.png | Bin 874 -> 0 bytes + test/reference/ft-show-glyphs-positioning.ref.png | Bin 3297 -> 0 bytes + test/reference/ft-show-glyphs-table.ref.png | Bin 9893 -> 0 bytes + test/reference/ft-text-vertical-layout-type1.ref.png | Bin 3591 -> 0 bytes + test/reference/glyph-cache-pressure.ref.png | Bin 2863 -> 0 bytes + test/reference/gradient-alpha.ref.png | Bin 147 -> 0 bytes + test/reference/gradient-constant-alpha.ref.png | Bin 117 -> 0 bytes + test/reference/gradient-zero-stops.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/gradient-zero-stops.ref.png | Bin 105 -> 0 bytes + test/reference/group-unaligned.ref.png | Bin 325 -> 0 bytes + test/reference/halo-transform.ref.png | Bin 11313 -> 0 bytes + test/reference/horizontal-clip.ref.png | Bin 129 -> 0 bytes + test/reference/huge-linear.ref.png | Bin 1619 -> 0 bytes + test/reference/infinite-join.ref.png | Bin 142 -> 0 bytes + test/reference/joins-loop.ref.png | Bin 3112 -> 0 bytes + test/reference/joins-star.ref.png | Bin 4028 -> 0 bytes + test/reference/large-twin-antialias-mixed.ref.png | Bin 10740 -> 0 bytes + test/reference/leaky-dashed-stroke.ref.png | Bin 5627 -> 0 bytes + test/reference/leaky-polygon.ref.png | Bin 281 -> 0 bytes + .../reference/line-width-large-overlap-rotated.ref.png | Bin 406 -> 0 bytes + test/reference/line-width-overlap-rotated.ref.png | Bin 719 -> 0 bytes + test/reference/line-width-scale.ref.png | Bin 3568 -> 0 bytes + test/reference/line-width-tolerance.ref.png | Bin 192 -> 0 bytes + test/reference/line-width.ref.png | Bin 201 -> 0 bytes + test/reference/linear-gradient-reflect.ref.png | Bin 216 -> 0 bytes + test/reference/linear-gradient-subset.ref.png | Bin 802 -> 0 bytes + test/reference/linear-gradient.ref.png | Bin 961 -> 0 bytes + test/reference/long-dashed-lines.ref.png | Bin 1453 -> 0 bytes + test/reference/mask-ctm.argb32.ref.png | Bin 0 -> 129 bytes + test/reference/mask-ctm.ref.png | Bin 129 -> 0 bytes + test/reference/mask-surface-ctm.argb32.ref.png | Bin 0 -> 129 bytes + test/reference/mask-surface-ctm.ref.png | Bin 129 -> 0 bytes + test/reference/mask-transformed-image.ref.png | Bin 4516 -> 0 bytes + test/reference/mask-transformed-similar.ref.png | Bin 4516 -> 0 bytes + test/reference/miter-precision.ref.png | Bin 878 -> 0 bytes + test/reference/nil-surface.argb32.ref.png | Bin 0 -> 107 bytes + test/reference/nil-surface.ref.png | Bin 107 -> 0 bytes + test/reference/operator-alpha.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.ref.png | Bin 280 -> 0 bytes + test/reference/operator.argb32.ref.png | Bin 0 -> 238 bytes + test/reference/operator.ref.png | Bin 238 -> 0 bytes + test/reference/over-above-source.ref.png | Bin 511 -> 0 bytes + test/reference/over-around-source.ref.png | Bin 578 -> 0 bytes + test/reference/over-below-source.ref.png | Bin 413 -> 0 bytes + test/reference/over-between-source.ref.png | Bin 561 -> 0 bytes + test/reference/paint-with-alpha-clip-mask.ref.png | Bin 348 -> 0 bytes + test/reference/partial-clip-text-bottom.ref.png | Bin 259 -> 0 bytes + test/reference/partial-clip-text-left.ref.png | Bin 293 -> 0 bytes + test/reference/partial-clip-text-right.ref.png | Bin 155 -> 0 bytes + test/reference/partial-clip-text-top.ref.png | Bin 173 -> 0 bytes + test/reference/pass-through.argb32.ref.png | Bin 0 -> 221 bytes + test/reference/pass-through.ref.png | Bin 221 -> 0 bytes + test/reference/path-append.ref.png | Bin 4424 -> 0 bytes + test/reference/path-stroke-twice.ref.png | Bin 209 -> 0 bytes + test/reference/pixman-rotate.argb32.ref.png | Bin 0 -> 260 bytes + test/reference/pixman-rotate.ref.png | Bin 260 -> 0 bytes + test/reference/pthread-show-text.ref.png | Bin 29759 -> 0 bytes + test/reference/push-group-color.ref.png | Bin 2676 -> 0 bytes + test/reference/push-group.ref.png | Bin 2829 -> 0 bytes + test/reference/random-intersections-curves-eo.ref.png | Bin 156491 -> 0 bytes + test/reference/random-intersections-curves-nz.ref.png | Bin 151310 -> 0 bytes + test/reference/random-intersections-eo.ref.png | Bin 85197 -> 0 bytes + test/reference/random-intersections-nonzero.ref.png | Bin 83247 -> 0 bytes + test/reference/record-paint-alpha-clip.ref.png | Bin 299 -> 0 bytes + test/reference/record-select-font-face.ref.png | Bin 2245 -> 0 bytes + test/reference/recording-surface-over.ref.png | Bin 3072 -> 0 bytes + test/reference/rectilinear-miter-limit.ref.png | Bin 145 -> 0 bytes + test/reference/rel-path.ref.png | Bin 177 -> 0 bytes + test/reference/rotate-clip-image-surface-paint.ref.png | Bin 312 -> 0 bytes + test/reference/rotated-clip.ref.png | Bin 2713 -> 0 bytes + test/reference/rounded-rectangle-fill.ref.png | Bin 563 -> 0 bytes + test/reference/scale-offset-image.ref.png | Bin 7688 -> 0 bytes + test/reference/scale-offset-similar.ref.png | Bin 7688 -> 0 bytes + .../scale-source-surface-paint.argb32.ref.png | Bin 0 -> 147 bytes + test/reference/scale-source-surface-paint.ref.png | Bin 147 -> 0 bytes + test/reference/select-font-face.ref.png | Bin 2245 -> 0 bytes + test/reference/self-copy.ref.png | Bin 258 -> 0 bytes + test/reference/set-source.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/set-source.ref.png | Bin 120 -> 0 bytes + test/reference/shape-general-convex.ref.png | Bin 1869 -> 0 bytes + test/reference/shape-sierpinski.ref.png | Bin 43504 -> 0 bytes + test/reference/show-glyphs-advance.ref.png | Bin 1395 -> 0 bytes + test/reference/show-text-current-point.ref.png | Bin 2185 -> 0 bytes + test/reference/skew-extreme.ref.png | Bin 904 -> 0 bytes + test/reference/smask-fill.ref.png | Bin 1134 -> 0 bytes + test/reference/smask-image-mask.ref.png | Bin 643 -> 0 bytes + test/reference/smask-mask.ref.png | Bin 2523 -> 0 bytes + test/reference/smask-paint.ref.png | Bin 2639 -> 0 bytes + test/reference/smask-stroke.ref.png | Bin 1598 -> 0 bytes + test/reference/smask-text.ref.png | Bin 1623 -> 0 bytes + test/reference/smask.ref.png | Bin 3401 -> 0 bytes + .../source-surface-scale-paint.argb32.ref.png | Bin 0 -> 139 bytes + test/reference/source-surface-scale-paint.ref.png | Bin 139 -> 0 bytes + test/reference/spline-decomposition.ref.png | Bin 10005 -> 0 bytes + test/reference/stroke-image.ref.png | Bin 972 -> 0 bytes + test/reference/stroke-pattern.ref.png | Bin 1417 -> 0 bytes + test/reference/subsurface-scale.ref.png | Bin 5216 -> 0 bytes + test/reference/subsurface.ref.png | Bin 1281 -> 0 bytes + test/reference/surface-pattern-scale-down.ref.png | Bin 1784 -> 0 bytes + test/reference/surface-pattern-scale-up.ref.png | Bin 4017 -> 0 bytes + test/reference/surface-pattern.ref.png | Bin 11100 -> 0 bytes + test/reference/text-antialias-gray.ref.png | Bin 975 -> 0 bytes + test/reference/text-antialias-subpixel-bgr.ref.png | Bin 1001 -> 0 bytes + test/reference/text-antialias-subpixel-rgb.ref.png | Bin 1004 -> 0 bytes + test/reference/text-antialias-subpixel-vbgr.ref.png | Bin 992 -> 0 bytes + test/reference/text-antialias-subpixel-vrgb.ref.png | Bin 1004 -> 0 bytes + test/reference/text-antialias-subpixel.ref.png | Bin 1004 -> 0 bytes + test/reference/text-glyph-range.ref.png | Bin 1729 -> 0 bytes + test/reference/text-pattern.ref.png | Bin 3444 -> 0 bytes + test/reference/tiger.ref.png | Bin 71094 -> 0 bytes + test/reference/transforms.ref.png | Bin 341 -> 0 bytes + test/reference/trap-clip.ref.png | Bin 5741 -> 0 bytes + test/reference/twin-antialias-mixed.ref.png | Bin 1639 -> 0 bytes + test/reference/twin-antialias-none.ref.png | Bin 694 -> 0 bytes + test/reference/unclosed-strokes.ref.png | Bin 1432 -> 0 bytes + test/reference/user-font-proxy.ref.png | Bin 14023 -> 0 bytes + test/reference/user-font-rescale.ref.png | Bin 14852 -> 0 bytes + test/reference/world-map-fill.ref.png | Bin 45440 -> 0 bytes + test/reference/world-map-stroke.ref.png | Bin 43370 -> 0 bytes + test/reference/world-map.ref.png | Bin 65880 -> 0 bytes + test/reference/zero-mask.argb32.ref.png | Bin 0 -> 402 bytes + test/reference/zero-mask.ref.png | Bin 402 -> 0 bytes + 175 files changed, 0 insertions(+), 0 deletions(-) + +commit 9eb1237e006bb19098144cc045c0a03d167a82b4 +Author: Chris Wilson +Date: Thu Jul 4 09:40:37 2013 +0100 + + test: Add a few reference images found lurking on my machine + + test/reference/bug-seams.image.xfail.png | Bin 0 -> 1647 bytes + test/reference/record1414x-fill-alpha.ref.png | Bin 0 -> 4212 bytes + test/reference/record2x-fill-alpha.ref.png | Bin 0 -> 5950 bytes + test/reference/record90-fill-alpha.ref.png | Bin 0 -> 2650 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 3255462a238dfb6d9f1336f04918d51f2cb6ea18 +Author: Chris Wilson +Date: Thu Jul 4 09:24:25 2013 +0100 + + test: Remove all identical (cmp & pdiff) reference images + + Courtesy of the improved check-ref-dups written by Bryce Harrington: + + Running make check on the codebase (with default configuration) with the + redundant images removed produces essentially the same test results: + + Before + ------ + Tests run: 13687 + Passed: 9216 + Failed: 3566 + Expected Failed: 312 + Error: 1 + Crashed: 17 + Untested: 575 + Total: 13687 + + After + ----- + Tests run: 13689 + Passed: 9216 + Failed: 3566 + Expected Failed: 312 + Error: 1 + Crashed: 19 + Untested: 575 + Total: 13689 + + (with the exception being the pthread tests misbehaving between runs) + + test/reference/a1-clip-fill-equal.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill-equal.mask.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill-equal.mask.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill-equal.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill-equal.traps.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill-equal.traps.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill-rule.mask.argb32.ref.png | Bin 236 -> 0 bytes + test/reference/a1-clip-fill-rule.mask.rgb24.ref.png | Bin 218 -> 0 bytes + test/reference/a1-clip-fill-rule.traps.argb32.ref.png | Bin 236 -> 0 bytes + test/reference/a1-clip-fill-rule.traps.rgb24.ref.png | Bin 218 -> 0 bytes + test/reference/a1-clip-fill.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill.mask.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill.mask.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill.traps.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-fill.traps.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-paint.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-paint.mask.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-paint.mask.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-paint.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-paint.traps.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-paint.traps.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-stroke.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-stroke.mask.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-stroke.mask.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-stroke.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-stroke.traps.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-clip-stroke.traps.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-fill.argb32.ref.png | Bin 328 -> 0 bytes + test/reference/a1-fill.mask.argb32.ref.png | Bin 328 -> 0 bytes + test/reference/a1-fill.mask.rgb24.ref.png | Bin 328 -> 0 bytes + test/reference/a1-fill.rgb24.ref.png | Bin 328 -> 0 bytes + test/reference/a1-fill.traps.argb32.ref.png | Bin 328 -> 0 bytes + test/reference/a1-fill.traps.ref.png | Bin 328 -> 0 bytes + test/reference/a1-fill.traps.rgb24.ref.png | Bin 328 -> 0 bytes + test/reference/a1-image-sample.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-image-sample.mask.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-image-sample.mask.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/a1-image-sample.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/a1-image-sample.traps.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-image-sample.traps.rgb24.ref.png | Bin 122 -> 0 bytes + .../a1-image-sample.xlib-fallback.rgb24.ref.png | Bin 122 -> 0 bytes + .../a1-image-sample.xlib-window.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/a1-line-width.argb32.ref.png | Bin 154 -> 0 bytes + test/reference/a1-line-width.mask.argb32.ref.png | Bin 154 -> 0 bytes + test/reference/a1-line-width.mask.rgb24.ref.png | Bin 154 -> 0 bytes + test/reference/a1-line-width.rgb24.ref.png | Bin 154 -> 0 bytes + test/reference/a1-line-width.traps.argb32.ref.png | Bin 154 -> 0 bytes + test/reference/a1-line-width.traps.rgb24.ref.png | Bin 154 -> 0 bytes + test/reference/a1-mask-sample.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-mask-sample.mask.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-mask-sample.mask.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/a1-mask-sample.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/a1-mask-sample.traps.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-mask-sample.traps.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/a1-mask.argb32.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.mask.argb32.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.mask.rgb24.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.pdf.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.ps.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.rgb24.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.traps.argb32.ref.png | Bin 106 -> 0 bytes + test/reference/a1-mask.traps.rgb24.ref.png | Bin 106 -> 0 bytes + .../a1-rasterisation-rectangles.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-rectangles.mask.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-rectangles.mask.rgb24.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-rectangles.rgb24.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-rectangles.traps.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-rectangles.traps.rgb24.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-triangles.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-triangles.mask.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-triangles.mask.rgb24.ref.png | Bin 1729 -> 0 bytes + .../reference/a1-rasterisation-triangles.rgb24.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-triangles.traps.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-triangles.traps.rgb24.ref.png | Bin 1729 -> 0 bytes + test/reference/a1-rectilinear-grid.argb32.ref.png | Bin 207 -> 0 bytes + test/reference/a1-rectilinear-grid.mask.argb32.ref.png | Bin 207 -> 0 bytes + test/reference/a1-rectilinear-grid.mask.rgb24.ref.png | Bin 207 -> 0 bytes + test/reference/a1-rectilinear-grid.rgb24.ref.png | Bin 207 -> 0 bytes + .../reference/a1-rectilinear-grid.traps.argb32.ref.png | Bin 207 -> 0 bytes + test/reference/a1-rectilinear-grid.traps.rgb24.ref.png | Bin 207 -> 0 bytes + test/reference/a1-sample.argb32.ref.png | Bin 786 -> 0 bytes + test/reference/a1-sample.mask.argb32.ref.png | Bin 786 -> 0 bytes + test/reference/a1-sample.mask.rgb24.ref.png | Bin 786 -> 0 bytes + test/reference/a1-sample.rgb24.ref.png | Bin 786 -> 0 bytes + test/reference/a1-sample.traps.argb32.ref.png | Bin 786 -> 0 bytes + test/reference/a1-sample.traps.rgb24.ref.png | Bin 786 -> 0 bytes + test/reference/a1-traps-sample.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-traps-sample.mask.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-traps-sample.mask.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-traps-sample.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a1-traps-sample.traps.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/a1-traps-sample.traps.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/a8-clear.mask.argb32.ref.png | Bin 271 -> 0 bytes + test/reference/a8-clear.mask.rgb24.ref.png | Bin 271 -> 0 bytes + test/reference/a8-mask.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/a8-mask.mask.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/a8-mask.mask.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/a8-mask.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/a8-mask.traps.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/a8-mask.traps.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/aliasing.mask.argb32.ref.png | Bin 104324 -> 0 bytes + test/reference/aliasing.mask.rgb24.ref.png | Bin 104324 -> 0 bytes + test/reference/alpha-similar.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/alpha-similar.mask.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/alpha-similar.mask.rgb24.ref.png | Bin 88 -> 0 bytes + test/reference/alpha-similar.traps.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/alpha-similar.traps.rgb24.ref.png | Bin 88 -> 0 bytes + test/reference/api-special-cases.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/api-special-cases.mask.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/api-special-cases.mask.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/api-special-cases.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/api-special-cases.traps.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/api-special-cases.traps.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/arc-direction.mask.argb32.ref.png | Bin 6380 -> 0 bytes + test/reference/arc-direction.mask.rgb24.ref.png | Bin 6380 -> 0 bytes + test/reference/arc-infinite-loop.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/arc-infinite-loop.mask.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/arc-infinite-loop.mask.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/arc-infinite-loop.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/arc-infinite-loop.traps.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/arc-infinite-loop.traps.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/big-empty-box.traps.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/big-empty-box.traps.rgb24.ref.png | Bin 108 -> 0 bytes + test/reference/big-empty-triangle.mask.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/big-empty-triangle.mask.rgb24.ref.png | Bin 108 -> 0 bytes + test/reference/big-empty-triangle.traps.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/big-empty-triangle.traps.rgb24.ref.png | Bin 108 -> 0 bytes + test/reference/big-line.mask.argb32.ref.png | Bin 977 -> 0 bytes + test/reference/big-line.mask.rgb24.ref.png | Bin 977 -> 0 bytes + test/reference/big-little-box.mask.argb32.ref.png | Bin 169 -> 0 bytes + test/reference/big-little-box.mask.rgb24.ref.png | Bin 160 -> 0 bytes + test/reference/big-little-box.traps.argb32.ref.png | Bin 169 -> 0 bytes + test/reference/big-little-box.traps.rgb24.ref.png | Bin 160 -> 0 bytes + test/reference/big-little-triangle.mask.argb32.ref.png | Bin 409 -> 0 bytes + test/reference/big-little-triangle.mask.rgb24.ref.png | Bin 328 -> 0 bytes + test/reference/bilevel-image.argb32.ref.png | Bin 105 -> 0 bytes + test/reference/bilevel-image.mask.argb32.ref.png | Bin 105 -> 0 bytes + test/reference/bilevel-image.mask.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/bilevel-image.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/bilevel-image.traps.argb32.ref.png | Bin 105 -> 0 bytes + test/reference/bilevel-image.traps.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/bitmap-font.argb32.ref.png | Bin 931 -> 0 bytes + test/reference/bitmap-font.mask.argb32.ref.png | Bin 931 -> 0 bytes + test/reference/bitmap-font.mask.rgb24.ref.png | Bin 871 -> 0 bytes + test/reference/bitmap-font.traps.argb32.ref.png | Bin 931 -> 0 bytes + test/reference/bitmap-font.traps.rgb24.ref.png | Bin 871 -> 0 bytes + test/reference/bug-40410.mask.argb32.ref.png | Bin 429 -> 0 bytes + test/reference/bug-40410.mask.rgb24.ref.png | Bin 429 -> 0 bytes + test/reference/bug-bo-rectangular.argb32.ref.png | Bin 950 -> 0 bytes + test/reference/bug-bo-rectangular.mask.argb32.ref.png | Bin 950 -> 0 bytes + test/reference/bug-bo-rectangular.mask.rgb24.ref.png | Bin 950 -> 0 bytes + test/reference/bug-bo-rectangular.rgb24.ref.png | Bin 950 -> 0 bytes + test/reference/bug-bo-rectangular.traps.argb32.ref.png | Bin 950 -> 0 bytes + test/reference/bug-bo-rectangular.traps.rgb24.ref.png | Bin 950 -> 0 bytes + test/reference/bug-bo-ricotz.mask.argb32.ref.png | Bin 2128 -> 0 bytes + test/reference/bug-bo-ricotz.mask.rgb24.ref.png | Bin 2128 -> 0 bytes + test/reference/bug-bo-ricotz.traps.argb32.ref.png | Bin 2125 -> 0 bytes + test/reference/bug-bo-ricotz.traps.rgb24.ref.png | Bin 2125 -> 0 bytes + test/reference/bug-extents.mask.argb32.ref.png | Bin 9251 -> 0 bytes + test/reference/bug-extents.mask.rgb24.ref.png | Bin 9251 -> 0 bytes + test/reference/caps-joins.mask.argb32.ref.png | Bin 2893 -> 0 bytes + test/reference/caps-joins.mask.rgb24.ref.png | Bin 2893 -> 0 bytes + test/reference/caps-sub-paths.mask.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/caps-sub-paths.mask.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/caps.mask.argb32.ref.png | Bin 2115 -> 0 bytes + test/reference/caps.mask.rgb24.ref.png | Bin 2115 -> 0 bytes + test/reference/checkerboard.argb32.ref.png | Bin 142 -> 0 bytes + test/reference/checkerboard.mask.argb32.ref.png | Bin 142 -> 0 bytes + test/reference/checkerboard.mask.rgb24.ref.png | Bin 142 -> 0 bytes + test/reference/checkerboard.rgb24.ref.png | Bin 142 -> 0 bytes + test/reference/checkerboard.traps.argb32.ref.png | Bin 142 -> 0 bytes + test/reference/checkerboard.traps.rgb24.ref.png | Bin 142 -> 0 bytes + test/reference/clear-source.mask.argb32.ref.png | Bin 882 -> 0 bytes + test/reference/clear-source.mask.rgb24.ref.png | Bin 882 -> 0 bytes + test/reference/clear.mask.argb32.ref.png | Bin 692 -> 0 bytes + test/reference/clear.mask.rgb24.ref.png | Bin 617 -> 0 bytes + test/reference/clip-all.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-all.mask.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-all.mask.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-all.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-all.traps.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-all.traps.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-complex-shape-eo-aa.argb32.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-aa.mask.argb32.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-aa.mask.rgb24.ref.png | Bin 325 -> 0 bytes + test/reference/clip-complex-shape-eo-aa.rgb24.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-aa.traps.argb32.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-aa.traps.rgb24.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-mono.argb32.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-mono.mask.argb32.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-mono.mask.rgb24.ref.png | Bin 325 -> 0 bytes + .../reference/clip-complex-shape-eo-mono.rgb24.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-mono.traps.argb32.ref.png | Bin 325 -> 0 bytes + .../clip-complex-shape-eo-mono.traps.rgb24.ref.png | Bin 325 -> 0 bytes + test/reference/clip-contexts.argb32.ref.png | Bin 98 -> 0 bytes + test/reference/clip-contexts.mask.argb32.ref.png | Bin 98 -> 0 bytes + test/reference/clip-contexts.mask.rgb24.ref.png | Bin 98 -> 0 bytes + test/reference/clip-contexts.rgb24.ref.png | Bin 98 -> 0 bytes + test/reference/clip-contexts.traps.argb32.ref.png | Bin 98 -> 0 bytes + test/reference/clip-contexts.traps.rgb24.ref.png | Bin 98 -> 0 bytes + test/reference/clip-device-offset.mask.argb32.ref.png | Bin 175 -> 0 bytes + test/reference/clip-device-offset.mask.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/clip-device-offset.traps.argb32.ref.png | Bin 175 -> 0 bytes + test/reference/clip-device-offset.traps.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/clip-empty-group.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/clip-empty-group.mask.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/clip-empty-group.mask.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/clip-empty-group.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/clip-empty-group.traps.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/clip-empty-group.traps.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/clip-empty-save.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty-save.mask.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty-save.mask.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty-save.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty-save.traps.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty-save.traps.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty.mask.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty.mask.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty.traps.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/clip-empty.traps.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/clip-fill-no-op.argb32.ref.png | Bin 152 -> 0 bytes + test/reference/clip-fill-no-op.mask.argb32.ref.png | Bin 152 -> 0 bytes + test/reference/clip-fill-no-op.mask.rgb24.ref.png | Bin 152 -> 0 bytes + test/reference/clip-fill-no-op.rgb24.ref.png | Bin 152 -> 0 bytes + test/reference/clip-fill-no-op.traps.argb32.ref.png | Bin 152 -> 0 bytes + test/reference/clip-fill-no-op.traps.rgb24.ref.png | Bin 152 -> 0 bytes + .../clip-fill-rule-pixel-aligned.argb32.ref.png | Bin 176 -> 0 bytes + .../clip-fill-rule-pixel-aligned.mask.argb32.ref.png | Bin 176 -> 0 bytes + .../clip-fill-rule-pixel-aligned.mask.rgb24.ref.png | Bin 165 -> 0 bytes + .../clip-fill-rule-pixel-aligned.traps.argb32.ref.png | Bin 176 -> 0 bytes + .../clip-fill-rule-pixel-aligned.traps.rgb24.ref.png | Bin 165 -> 0 bytes + test/reference/clip-fill-rule.mask.argb32.ref.png | Bin 437 -> 0 bytes + test/reference/clip-fill-rule.mask.rgb24.ref.png | Bin 393 -> 0 bytes + ...clip-group-shapes-aligned-rectangles.argb32.ref.png | Bin 378 -> 0 bytes + ...group-shapes-aligned-rectangles.mask.argb32.ref.png | Bin 378 -> 0 bytes + ...-group-shapes-aligned-rectangles.mask.rgb24.ref.png | Bin 378 -> 0 bytes + .../clip-group-shapes-aligned-rectangles.rgb24.ref.png | Bin 378 -> 0 bytes + ...roup-shapes-aligned-rectangles.traps.argb32.ref.png | Bin 378 -> 0 bytes + ...group-shapes-aligned-rectangles.traps.rgb24.ref.png | Bin 378 -> 0 bytes + ...ip-group-shapes-unaligned-rectangles.argb32.ref.png | Bin 415 -> 0 bytes + ...lip-group-shapes-unaligned-rectangles.rgb24.ref.png | Bin 415 -> 0 bytes + test/reference/clip-intersect.mask.argb32.ref.png | Bin 200 -> 0 bytes + test/reference/clip-intersect.mask.rgb24.ref.png | Bin 200 -> 0 bytes + .../reference/clip-mixed-antialias.mask.argb32.ref.png | Bin 1084 -> 0 bytes + test/reference/clip-mixed-antialias.mask.rgb24.ref.png | Bin 1084 -> 0 bytes + test/reference/clip-nesting.mask.argb32.ref.png | Bin 1044 -> 0 bytes + test/reference/clip-polygons.traps.argb32.ref.png | Bin 1268 -> 0 bytes + test/reference/clip-polygons.traps.rgb24.ref.png | Bin 1268 -> 0 bytes + test/reference/clip-push-group.mask.argb32.ref.png | Bin 164 -> 0 bytes + test/reference/clip-push-group.mask.rgb24.ref.png | Bin 164 -> 0 bytes + test/reference/clip-rectilinear.argb32.ref.png | Bin 439 -> 0 bytes + test/reference/clip-rectilinear.rgb24.ref.png | Bin 439 -> 0 bytes + test/reference/clip-rectilinear.traps.argb32.ref.png | Bin 440 -> 0 bytes + test/reference/clip-rectilinear.traps.rgb24.ref.png | Bin 440 -> 0 bytes + .../clip-rotate-image-surface-paint.argb32.ref.png | Bin 202 -> 0 bytes + ...clip-rotate-image-surface-paint.mask.argb32.ref.png | Bin 202 -> 0 bytes + .../clip-rotate-image-surface-paint.mask.rgb24.ref.png | Bin 202 -> 0 bytes + .../clip-rotate-image-surface-paint.rgb24.ref.png | Bin 202 -> 0 bytes + ...lip-rotate-image-surface-paint.traps.argb32.ref.png | Bin 202 -> 0 bytes + ...clip-rotate-image-surface-paint.traps.rgb24.ref.png | Bin 202 -> 0 bytes + ...ate-image-surface-paint.xlib-fallback.rgb24.ref.png | Bin 202 -> 0 bytes + ...otate-image-surface-paint.xlib-window.rgb24.ref.png | Bin 202 -> 0 bytes + test/reference/clip-stroke-no-op.argb32.ref.png | Bin 152 -> 0 bytes + test/reference/clip-stroke-no-op.mask.argb32.ref.png | Bin 152 -> 0 bytes + test/reference/clip-stroke-no-op.mask.rgb24.ref.png | Bin 152 -> 0 bytes + test/reference/clip-stroke-no-op.rgb24.ref.png | Bin 152 -> 0 bytes + test/reference/clip-stroke-no-op.traps.argb32.ref.png | Bin 152 -> 0 bytes + test/reference/clip-stroke-no-op.traps.rgb24.ref.png | Bin 152 -> 0 bytes + test/reference/clip-twice-rectangle.argb32.ref.png | Bin 323 -> 0 bytes + .../reference/clip-twice-rectangle.mask.argb32.ref.png | Bin 323 -> 0 bytes + test/reference/clip-twice-rectangle.mask.rgb24.ref.png | Bin 323 -> 0 bytes + test/reference/clip-twice-rectangle.rgb24.ref.png | Bin 323 -> 0 bytes + .../clip-twice-rectangle.traps.argb32.ref.png | Bin 323 -> 0 bytes + .../reference/clip-twice-rectangle.traps.rgb24.ref.png | Bin 323 -> 0 bytes + test/reference/clip-unbounded.argb32.ref.png | Bin 100 -> 0 bytes + test/reference/clip-unbounded.mask.argb32.ref.png | Bin 100 -> 0 bytes + test/reference/clip-unbounded.mask.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/clip-unbounded.traps.argb32.ref.png | Bin 100 -> 0 bytes + test/reference/clip-unbounded.traps.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/clipped-surface.argb32.ref.png | Bin 345 -> 0 bytes + test/reference/clipped-surface.mask.argb32.ref.png | Bin 345 -> 0 bytes + test/reference/clipped-surface.mask.rgb24.ref.png | Bin 345 -> 0 bytes + test/reference/clipped-surface.rgb24.ref.png | Bin 345 -> 0 bytes + test/reference/clipped-surface.traps.argb32.ref.png | Bin 345 -> 0 bytes + test/reference/clipped-surface.traps.rgb24.ref.png | Bin 345 -> 0 bytes + test/reference/close-path.mask.argb32.ref.png | Bin 294 -> 0 bytes + test/reference/close-path.mask.rgb24.ref.png | Bin 294 -> 0 bytes + ...posite-integer-translate-over-repeat.argb32.ref.png | Bin 334 -> 0 bytes + ...e-integer-translate-over-repeat.mask.argb32.ref.png | Bin 334 -> 0 bytes + ...te-integer-translate-over-repeat.mask.rgb24.ref.png | Bin 334 -> 0 bytes + ...mposite-integer-translate-over-repeat.rgb24.ref.png | Bin 334 -> 0 bytes + ...-integer-translate-over-repeat.traps.argb32.ref.png | Bin 334 -> 0 bytes + ...e-integer-translate-over-repeat.traps.rgb24.ref.png | Bin 334 -> 0 bytes + .../composite-integer-translate-over.argb32.ref.png | Bin 13998 -> 0 bytes + ...omposite-integer-translate-over.mask.argb32.ref.png | Bin 13998 -> 0 bytes + ...composite-integer-translate-over.mask.rgb24.ref.png | Bin 13998 -> 0 bytes + .../composite-integer-translate-over.rgb24.ref.png | Bin 13998 -> 0 bytes + ...mposite-integer-translate-over.traps.argb32.ref.png | Bin 13998 -> 0 bytes + ...omposite-integer-translate-over.traps.rgb24.ref.png | Bin 13998 -> 0 bytes + .../composite-integer-translate-source.argb32.ref.png | Bin 13998 -> 0 bytes + ...posite-integer-translate-source.mask.argb32.ref.png | Bin 13998 -> 0 bytes + ...mposite-integer-translate-source.mask.rgb24.ref.png | Bin 13998 -> 0 bytes + .../composite-integer-translate-source.rgb24.ref.png | Bin 13998 -> 0 bytes + ...osite-integer-translate-source.traps.argb32.ref.png | Bin 13998 -> 0 bytes + ...posite-integer-translate-source.traps.rgb24.ref.png | Bin 13998 -> 0 bytes + test/reference/copy-disjoint.argb32.ref.png | Bin 1098 -> 0 bytes + test/reference/copy-disjoint.mask.argb32.ref.png | Bin 1098 -> 0 bytes + test/reference/copy-disjoint.mask.rgb24.ref.png | Bin 1098 -> 0 bytes + test/reference/copy-disjoint.rgb24.ref.png | Bin 1098 -> 0 bytes + test/reference/copy-disjoint.traps.argb32.ref.png | Bin 1098 -> 0 bytes + test/reference/copy-disjoint.traps.rgb24.ref.png | Bin 1098 -> 0 bytes + test/reference/copy-path.mask.argb32.ref.png | Bin 616 -> 0 bytes + test/reference/copy-path.mask.rgb24.ref.png | Bin 616 -> 0 bytes + test/reference/create-from-png-stream.argb32.ref.png | Bin 96 -> 0 bytes + .../create-from-png-stream.mask.argb32.ref.png | Bin 96 -> 0 bytes + .../create-from-png-stream.mask.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/create-from-png-stream.rgb24.ref.png | Bin 96 -> 0 bytes + .../create-from-png-stream.traps.argb32.ref.png | Bin 96 -> 0 bytes + .../create-from-png-stream.traps.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/culled-glyphs.mask.argb32.ref.png | Bin 440 -> 0 bytes + test/reference/culled-glyphs.mask.rgb24.ref.png | Bin 440 -> 0 bytes + test/reference/culled-glyphs.traps.argb32.ref.png | Bin 440 -> 0 bytes + test/reference/culled-glyphs.traps.rgb24.ref.png | Bin 440 -> 0 bytes + test/reference/dash-infinite-loop.mask.argb32.ref.png | Bin 877 -> 0 bytes + test/reference/dash-infinite-loop.mask.rgb24.ref.png | Bin 877 -> 0 bytes + test/reference/dash-no-dash.argb32.ref.png | Bin 119 -> 0 bytes + test/reference/dash-no-dash.mask.argb32.ref.png | Bin 119 -> 0 bytes + test/reference/dash-no-dash.mask.rgb24.ref.png | Bin 119 -> 0 bytes + test/reference/dash-no-dash.rgb24.ref.png | Bin 119 -> 0 bytes + test/reference/dash-no-dash.traps.argb32.ref.png | Bin 119 -> 0 bytes + test/reference/dash-no-dash.traps.rgb24.ref.png | Bin 119 -> 0 bytes + .../reference/dash-offset-negative.mask.argb32.ref.png | Bin 129 -> 0 bytes + test/reference/dash-offset-negative.mask.rgb24.ref.png | Bin 129 -> 0 bytes + test/reference/dash-offset.argb32.ref.png | Bin 794 -> 0 bytes + test/reference/dash-offset.mask.argb32.ref.png | Bin 794 -> 0 bytes + test/reference/dash-offset.mask.rgb24.ref.png | Bin 794 -> 0 bytes + test/reference/dash-offset.rgb24.ref.png | Bin 794 -> 0 bytes + test/reference/dash-offset.traps.argb32.ref.png | Bin 794 -> 0 bytes + test/reference/dash-offset.traps.rgb24.ref.png | Bin 794 -> 0 bytes + test/reference/dash-state.mask.argb32.ref.png | Bin 8027 -> 0 bytes + test/reference/dash-state.mask.rgb24.ref.png | Bin 8027 -> 0 bytes + test/reference/dash-zero-length.mask.argb32.ref.png | Bin 230 -> 0 bytes + test/reference/degenerate-arcs.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/degenerate-arcs.mask.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/degenerate-arcs.mask.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/degenerate-arcs.rgb24.ref.png | Bin 120 -> 0 bytes + test/reference/degenerate-arcs.traps.argb32.ref.png | Bin 120 -> 0 bytes + test/reference/degenerate-arcs.traps.rgb24.ref.png | Bin 120 -> 0 bytes + .../degenerate-linear-gradient.mask.argb32.ref.png | Bin 336 -> 0 bytes + .../degenerate-linear-gradient.mask.rgb24.ref.png | Bin 336 -> 0 bytes + .../degenerate-linear-gradient.traps.argb32.ref.png | Bin 336 -> 0 bytes + .../degenerate-linear-gradient.traps.rgb24.ref.png | Bin 336 -> 0 bytes + test/reference/degenerate-pen.mask.argb32.ref.png | Bin 1019 -> 0 bytes + test/reference/degenerate-pen.mask.rgb24.ref.png | Bin 1019 -> 0 bytes + .../degenerate-radial-gradient.argb32.ref.png | Bin 428 -> 0 bytes + .../degenerate-radial-gradient.mask.argb32.ref.png | Bin 428 -> 0 bytes + .../degenerate-radial-gradient.mask.rgb24.ref.png | Bin 428 -> 0 bytes + .../reference/degenerate-radial-gradient.rgb24.ref.png | Bin 428 -> 0 bytes + .../degenerate-radial-gradient.traps.argb32.ref.png | Bin 428 -> 0 bytes + .../degenerate-radial-gradient.traps.rgb24.ref.png | Bin 428 -> 0 bytes + test/reference/device-offset-fractional.argb32.ref.png | Bin 266 -> 0 bytes + .../device-offset-fractional.mask.argb32.ref.png | Bin 266 -> 0 bytes + .../device-offset-fractional.mask.rgb24.ref.png | Bin 266 -> 0 bytes + test/reference/device-offset-fractional.rgb24.ref.png | Bin 266 -> 0 bytes + .../device-offset-fractional.traps.argb32.ref.png | Bin 266 -> 0 bytes + .../device-offset-fractional.traps.rgb24.ref.png | Bin 266 -> 0 bytes + test/reference/device-offset-positive.argb32.ref.png | Bin 120 -> 0 bytes + .../device-offset-positive.mask.argb32.ref.png | Bin 120 -> 0 bytes + .../device-offset-positive.mask.rgb24.ref.png | Bin 111 -> 0 bytes + .../device-offset-positive.traps.argb32.ref.png | Bin 120 -> 0 bytes + .../device-offset-positive.traps.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/device-offset-scale.argb32.ref.png | Bin 109 -> 0 bytes + test/reference/device-offset-scale.mask.argb32.ref.png | Bin 109 -> 0 bytes + test/reference/device-offset-scale.mask.rgb24.ref.png | Bin 109 -> 0 bytes + test/reference/device-offset-scale.rgb24.ref.png | Bin 109 -> 0 bytes + .../reference/device-offset-scale.traps.argb32.ref.png | Bin 109 -> 0 bytes + test/reference/device-offset-scale.traps.rgb24.ref.png | Bin 109 -> 0 bytes + test/reference/device-offset.argb32.ref.png | Bin 118 -> 0 bytes + test/reference/device-offset.mask.argb32.ref.png | Bin 118 -> 0 bytes + test/reference/device-offset.mask.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/device-offset.traps.argb32.ref.png | Bin 118 -> 0 bytes + test/reference/device-offset.traps.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/extend-pad-border.mask.argb32.ref.png | Bin 495 -> 0 bytes + test/reference/extend-pad-border.mask.rgb24.ref.png | Bin 495 -> 0 bytes + test/reference/extend-pad-border.traps.argb32.ref.png | Bin 495 -> 0 bytes + test/reference/extend-pad-border.traps.rgb24.ref.png | Bin 495 -> 0 bytes + test/reference/extend-pad-similar.argb32.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad-similar.mask.argb32.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad-similar.mask.rgb24.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad-similar.rgb24.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad-similar.traps.argb32.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad-similar.traps.rgb24.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad.argb32.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad.mask.argb32.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad.mask.rgb24.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad.rgb24.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad.traps.argb32.ref.png | Bin 279 -> 0 bytes + test/reference/extend-pad.traps.rgb24.ref.png | Bin 279 -> 0 bytes + test/reference/extend-reflect-similar.argb32.ref.png | Bin 133406 -> 0 bytes + .../extend-reflect-similar.mask.argb32.ref.png | Bin 133406 -> 0 bytes + .../extend-reflect-similar.mask.rgb24.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect-similar.rgb24.ref.png | Bin 133406 -> 0 bytes + .../extend-reflect-similar.traps.argb32.ref.png | Bin 133406 -> 0 bytes + .../extend-reflect-similar.traps.rgb24.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect.argb32.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect.mask.argb32.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect.mask.rgb24.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect.rgb24.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect.traps.argb32.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-reflect.traps.rgb24.ref.png | Bin 133406 -> 0 bytes + test/reference/extend-repeat-similar.argb32.ref.png | Bin 108603 -> 0 bytes + .../extend-repeat-similar.mask.argb32.ref.png | Bin 108603 -> 0 bytes + .../reference/extend-repeat-similar.mask.rgb24.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat-similar.rgb24.ref.png | Bin 108603 -> 0 bytes + .../extend-repeat-similar.traps.argb32.ref.png | Bin 108603 -> 0 bytes + .../extend-repeat-similar.traps.rgb24.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat.argb32.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat.mask.argb32.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat.mask.rgb24.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat.rgb24.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat.traps.argb32.ref.png | Bin 108603 -> 0 bytes + test/reference/extend-repeat.traps.rgb24.ref.png | Bin 108603 -> 0 bytes + .../extended-blend-alpha-mask.mask.argb32.ref.png | Bin 9221 -> 0 bytes + .../extended-blend-alpha-mask.mask.rgb24.ref.png | Bin 4597 -> 0 bytes + .../extended-blend-alpha-mask.traps.argb32.ref.png | Bin 9221 -> 0 bytes + .../extended-blend-alpha-mask.traps.rgb24.ref.png | Bin 4597 -> 0 bytes + .../reference/extended-blend-alpha.mask.argb32.ref.png | Bin 9406 -> 0 bytes + test/reference/extended-blend-alpha.mask.rgb24.ref.png | Bin 5740 -> 0 bytes + .../extended-blend-alpha.traps.argb32.ref.png | Bin 9406 -> 0 bytes + .../reference/extended-blend-alpha.traps.rgb24.ref.png | Bin 5740 -> 0 bytes + test/reference/extended-blend-mask.mask.argb32.ref.png | Bin 3971 -> 0 bytes + test/reference/extended-blend-mask.mask.rgb24.ref.png | Bin 3643 -> 0 bytes + .../reference/extended-blend-mask.traps.argb32.ref.png | Bin 3971 -> 0 bytes + test/reference/extended-blend-mask.traps.rgb24.ref.png | Bin 3643 -> 0 bytes + .../extended-blend-solid-alpha.mask.argb32.ref.png | Bin 9406 -> 0 bytes + .../extended-blend-solid-alpha.mask.rgb24.ref.png | Bin 5740 -> 0 bytes + .../extended-blend-solid-alpha.traps.argb32.ref.png | Bin 9406 -> 0 bytes + .../extended-blend-solid-alpha.traps.rgb24.ref.png | Bin 5740 -> 0 bytes + .../reference/extended-blend-solid.mask.argb32.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend-solid.mask.rgb24.ref.png | Bin 3775 -> 0 bytes + .../extended-blend-solid.traps.argb32.ref.png | Bin 4063 -> 0 bytes + .../reference/extended-blend-solid.traps.rgb24.ref.png | Bin 3775 -> 0 bytes + test/reference/extended-blend.mask.argb32.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend.mask.rgb24.ref.png | Bin 3775 -> 0 bytes + test/reference/extended-blend.traps.argb32.ref.png | Bin 4063 -> 0 bytes + test/reference/extended-blend.traps.rgb24.ref.png | Bin 3775 -> 0 bytes + test/reference/fill-alpha-pattern.mask.argb32.ref.png | Bin 3381 -> 0 bytes + test/reference/fill-alpha-pattern.mask.rgb24.ref.png | Bin 3381 -> 0 bytes + test/reference/fill-alpha.mask.argb32.ref.png | Bin 2736 -> 0 bytes + test/reference/fill-alpha.mask.rgb24.ref.png | Bin 2736 -> 0 bytes + .../fill-and-stroke-alpha-add.mask.argb32.ref.png | Bin 556 -> 0 bytes + .../fill-and-stroke-alpha-add.mask.rgb24.ref.png | Bin 556 -> 0 bytes + .../fill-and-stroke-alpha.mask.argb32.ref.png | Bin 508 -> 0 bytes + .../reference/fill-and-stroke-alpha.mask.rgb24.ref.png | Bin 508 -> 0 bytes + test/reference/fill-and-stroke.mask.argb32.ref.png | Bin 312 -> 0 bytes + test/reference/fill-and-stroke.mask.rgb24.ref.png | Bin 283 -> 0 bytes + .../fill-degenerate-sort-order.mask.argb32.ref.png | Bin 2400 -> 0 bytes + .../fill-degenerate-sort-order.mask.rgb24.ref.png | Bin 2049 -> 0 bytes + test/reference/fill-disjoint.argb32.ref.png | Bin 1098 -> 0 bytes + test/reference/fill-disjoint.mask.argb32.ref.png | Bin 1098 -> 0 bytes + test/reference/fill-disjoint.mask.rgb24.ref.png | Bin 1098 -> 0 bytes + test/reference/fill-disjoint.rgb24.ref.png | Bin 1098 -> 0 bytes + test/reference/fill-disjoint.traps.argb32.ref.png | Bin 1098 -> 0 bytes + test/reference/fill-disjoint.traps.rgb24.ref.png | Bin 1098 -> 0 bytes + test/reference/fill-empty.mask.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/fill-empty.mask.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/fill-empty.traps.argb32.ref.png | Bin 99 -> 0 bytes + test/reference/fill-empty.traps.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/fill-image.mask.argb32.ref.png | Bin 1315 -> 0 bytes + test/reference/fill-image.mask.rgb24.ref.png | Bin 1315 -> 0 bytes + test/reference/fill-missed-stop.mask.argb32.ref.png | Bin 455 -> 0 bytes + test/reference/fill-missed-stop.mask.rgb24.ref.png | Bin 382 -> 0 bytes + test/reference/fill-rule.mask.argb32.ref.png | Bin 2065 -> 0 bytes + test/reference/fill-rule.mask.rgb24.ref.png | Bin 1803 -> 0 bytes + .../filter-bilinear-extents.mask.argb32.ref.png | Bin 1210 -> 0 bytes + .../filter-bilinear-extents.mask.rgb24.ref.png | Bin 1210 -> 0 bytes + .../filter-bilinear-extents.traps.argb32.ref.png | Bin 1210 -> 0 bytes + .../filter-bilinear-extents.traps.rgb24.ref.png | Bin 1210 -> 0 bytes + test/reference/filter-nearest-offset.argb32.ref.png | Bin 201 -> 0 bytes + .../filter-nearest-offset.mask.argb32.ref.png | Bin 201 -> 0 bytes + .../reference/filter-nearest-offset.mask.rgb24.ref.png | Bin 201 -> 0 bytes + test/reference/filter-nearest-offset.rgb24.ref.png | Bin 201 -> 0 bytes + .../filter-nearest-offset.traps.argb32.ref.png | Bin 201 -> 0 bytes + .../filter-nearest-offset.traps.rgb24.ref.png | Bin 201 -> 0 bytes + .../filter-nearest-transformed.argb32.ref.png | Bin 514 -> 0 bytes + .../filter-nearest-transformed.mask.argb32.ref.png | Bin 514 -> 0 bytes + .../filter-nearest-transformed.mask.rgb24.ref.png | Bin 514 -> 0 bytes + .../reference/filter-nearest-transformed.rgb24.ref.png | Bin 514 -> 0 bytes + .../filter-nearest-transformed.traps.argb32.ref.png | Bin 514 -> 0 bytes + .../filter-nearest-transformed.traps.rgb24.ref.png | Bin 514 -> 0 bytes + .../font-matrix-translation.mask.argb32.ref.png | Bin 865 -> 0 bytes + .../font-matrix-translation.mask.rgb24.ref.png | Bin 865 -> 0 bytes + .../font-matrix-translation.traps.argb32.ref.png | Bin 865 -> 0 bytes + .../font-matrix-translation.traps.rgb24.ref.png | Bin 865 -> 0 bytes + .../ft-show-glyphs-positioning.mask.argb32.ref.png | Bin 3243 -> 0 bytes + .../ft-show-glyphs-positioning.mask.rgb24.ref.png | Bin 3243 -> 0 bytes + .../ft-show-glyphs-positioning.traps.argb32.ref.png | Bin 3243 -> 0 bytes + .../ft-show-glyphs-positioning.traps.rgb24.ref.png | Bin 3243 -> 0 bytes + .../reference/ft-show-glyphs-table.mask.argb32.ref.png | Bin 9975 -> 0 bytes + test/reference/ft-show-glyphs-table.mask.rgb24.ref.png | Bin 9975 -> 0 bytes + .../ft-show-glyphs-table.traps.argb32.ref.png | Bin 9975 -> 0 bytes + .../reference/ft-show-glyphs-table.traps.rgb24.ref.png | Bin 9975 -> 0 bytes + test/reference/ft-text-antialias-none.argb32.ref.png | Bin 295 -> 0 bytes + .../ft-text-antialias-none.mask.argb32.ref.png | Bin 295 -> 0 bytes + .../ft-text-antialias-none.mask.rgb24.ref.png | Bin 295 -> 0 bytes + test/reference/ft-text-antialias-none.rgb24.ref.png | Bin 295 -> 0 bytes + .../ft-text-antialias-none.traps.argb32.ref.png | Bin 295 -> 0 bytes + .../ft-text-antialias-none.traps.rgb24.ref.png | Bin 295 -> 0 bytes + .../ft-text-vertical-layout-type1.mask.argb32.ref.png | Bin 3062 -> 0 bytes + .../ft-text-vertical-layout-type1.mask.rgb24.ref.png | Bin 3062 -> 0 bytes + test/reference/get-group-target.argb32.ref.png | Bin 113 -> 0 bytes + test/reference/get-group-target.mask.argb32.ref.png | Bin 113 -> 0 bytes + test/reference/get-group-target.mask.rgb24.ref.png | Bin 113 -> 0 bytes + test/reference/get-group-target.rgb24.ref.png | Bin 113 -> 0 bytes + test/reference/get-group-target.traps.argb32.ref.png | Bin 113 -> 0 bytes + test/reference/get-group-target.traps.rgb24.ref.png | Bin 113 -> 0 bytes + test/reference/gl-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/gl-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/gl-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/gl-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + .../reference/glyph-cache-pressure.mask.argb32.ref.png | Bin 2858 -> 0 bytes + test/reference/glyph-cache-pressure.mask.rgb24.ref.png | Bin 2858 -> 0 bytes + .../glyph-cache-pressure.traps.argb32.ref.png | Bin 2858 -> 0 bytes + .../reference/glyph-cache-pressure.traps.rgb24.ref.png | Bin 2858 -> 0 bytes + test/reference/gradient-alpha.mask.argb32.ref.png | Bin 125 -> 0 bytes + test/reference/gradient-alpha.mask.rgb24.ref.png | Bin 119 -> 0 bytes + test/reference/gradient-alpha.traps.argb32.ref.png | Bin 125 -> 0 bytes + test/reference/gradient-alpha.traps.rgb24.ref.png | Bin 119 -> 0 bytes + .../gradient-constant-alpha.mask.argb32.ref.png | Bin 111 -> 0 bytes + .../gradient-constant-alpha.mask.rgb24.ref.png | Bin 106 -> 0 bytes + .../gradient-constant-alpha.traps.argb32.ref.png | Bin 111 -> 0 bytes + .../gradient-constant-alpha.traps.rgb24.ref.png | Bin 106 -> 0 bytes + .../gradient-zero-stops-mask.mask.argb32.ref.png | Bin 86 -> 0 bytes + .../gradient-zero-stops-mask.mask.rgb24.ref.png | Bin 86 -> 0 bytes + .../gradient-zero-stops-mask.traps.argb32.ref.png | Bin 86 -> 0 bytes + .../gradient-zero-stops-mask.traps.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/gradient-zero-stops.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/gradient-zero-stops.mask.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/gradient-zero-stops.mask.rgb24.ref.png | Bin 86 -> 0 bytes + .../reference/gradient-zero-stops.traps.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/gradient-zero-stops.traps.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/group-clip.argb32.ref.png | Bin 191 -> 0 bytes + test/reference/group-clip.mask.argb32.ref.png | Bin 191 -> 0 bytes + test/reference/group-clip.mask.rgb24.ref.png | Bin 191 -> 0 bytes + test/reference/group-clip.rgb24.ref.png | Bin 191 -> 0 bytes + test/reference/group-clip.traps.argb32.ref.png | Bin 191 -> 0 bytes + test/reference/group-clip.traps.rgb24.ref.png | Bin 191 -> 0 bytes + test/reference/group-paint.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/group-paint.mask.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/group-paint.mask.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/group-paint.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/group-paint.traps.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/group-paint.traps.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/group-unaligned.mask.argb32.ref.png | Bin 427 -> 0 bytes + test/reference/group-unaligned.mask.rgb24.ref.png | Bin 427 -> 0 bytes + test/reference/halo-transform.mask.argb32.ref.png | Bin 15063 -> 0 bytes + test/reference/halo-transform.mask.rgb24.ref.png | Bin 15063 -> 0 bytes + test/reference/halo-transform.traps.argb32.ref.png | Bin 15122 -> 0 bytes + test/reference/halo-transform.traps.rgb24.ref.png | Bin 15122 -> 0 bytes + test/reference/horizontal-clip.mask.argb32.ref.png | Bin 113 -> 0 bytes + test/reference/horizontal-clip.mask.rgb24.ref.png | Bin 113 -> 0 bytes + test/reference/horizontal-clip.traps.argb32.ref.png | Bin 113 -> 0 bytes + test/reference/horizontal-clip.traps.rgb24.ref.png | Bin 113 -> 0 bytes + test/reference/huge-linear.mask.argb32.ref.png | Bin 1600 -> 0 bytes + test/reference/huge-linear.mask.rgb24.ref.png | Bin 1600 -> 0 bytes + test/reference/huge-linear.traps.argb32.ref.png | Bin 1600 -> 0 bytes + test/reference/huge-linear.traps.rgb24.ref.png | Bin 1600 -> 0 bytes + test/reference/huge-radial.argb32.ref.png | Bin 41702 -> 0 bytes + test/reference/huge-radial.mask.argb32.ref.png | Bin 41702 -> 0 bytes + test/reference/huge-radial.mask.rgb24.ref.png | Bin 41702 -> 0 bytes + test/reference/huge-radial.rgb24.ref.png | Bin 41702 -> 0 bytes + test/reference/huge-radial.traps.argb32.ref.png | Bin 41702 -> 0 bytes + test/reference/huge-radial.traps.rgb24.ref.png | Bin 41702 -> 0 bytes + test/reference/image-bug-710072-aligned.argb32.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-aligned.mask.argb32.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-aligned.mask.rgb24.ref.png | Bin 151 -> 0 bytes + test/reference/image-bug-710072-aligned.rgb24.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-aligned.traps.argb32.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-aligned.traps.rgb24.ref.png | Bin 151 -> 0 bytes + ...mage-bug-710072-aligned.xlib-fallback.rgb24.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-aligned.xlib-window.rgb24.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-unaligned.argb32.ref.png | Bin 212 -> 0 bytes + .../image-bug-710072-unaligned.mask.argb32.ref.png | Bin 212 -> 0 bytes + .../image-bug-710072-unaligned.mask.rgb24.ref.png | Bin 212 -> 0 bytes + .../reference/image-bug-710072-unaligned.rgb24.ref.png | Bin 212 -> 0 bytes + .../reference/image-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/image-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + .../image-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + .../reference/image-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + .../image-surface-source.xlib-fallback.rgb24.ref.png | Bin 301 -> 0 bytes + .../image-surface-source.xlib-window.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/implicit-close.argb32.ref.png | Bin 251 -> 0 bytes + test/reference/implicit-close.mask.argb32.ref.png | Bin 251 -> 0 bytes + test/reference/implicit-close.mask.rgb24.ref.png | Bin 251 -> 0 bytes + test/reference/implicit-close.rgb24.ref.png | Bin 251 -> 0 bytes + test/reference/infinite-join.mask.argb32.ref.png | Bin 164 -> 0 bytes + test/reference/infinite-join.mask.rgb24.ref.png | Bin 164 -> 0 bytes + test/reference/inverse-text.traps.argb32.ref.png | Bin 2162 -> 0 bytes + test/reference/inverse-text.traps.rgb24.ref.png | Bin 2162 -> 0 bytes + test/reference/joins-loop.mask.argb32.ref.png | Bin 4492 -> 0 bytes + test/reference/joins-loop.mask.rgb24.ref.png | Bin 4492 -> 0 bytes + test/reference/joins-star.mask.argb32.ref.png | Bin 4914 -> 0 bytes + test/reference/joins-star.mask.rgb24.ref.png | Bin 4914 -> 0 bytes + test/reference/large-clip.argb32.ref.png | Bin 305 -> 0 bytes + test/reference/large-clip.mask.argb32.ref.png | Bin 305 -> 0 bytes + test/reference/large-clip.mask.rgb24.ref.png | Bin 305 -> 0 bytes + test/reference/large-clip.rgb24.ref.png | Bin 305 -> 0 bytes + test/reference/large-clip.traps.argb32.ref.png | Bin 305 -> 0 bytes + test/reference/large-clip.traps.rgb24.ref.png | Bin 305 -> 0 bytes + test/reference/large-font.argb32.ref.png | Bin 6117 -> 0 bytes + test/reference/large-font.mask.argb32.ref.png | Bin 6117 -> 0 bytes + test/reference/large-font.mask.rgb24.ref.png | Bin 6117 -> 0 bytes + test/reference/large-font.rgb24.ref.png | Bin 6117 -> 0 bytes + test/reference/large-font.traps.argb32.ref.png | Bin 6117 -> 0 bytes + test/reference/large-font.traps.rgb24.ref.png | Bin 6117 -> 0 bytes + test/reference/large-source-roi.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/large-source-roi.mask.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/large-source-roi.mask.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/large-source-roi.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/large-source-roi.traps.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/large-source-roi.traps.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/large-source.argb32.ref.png | Bin 112 -> 0 bytes + test/reference/large-source.mask.argb32.ref.png | Bin 112 -> 0 bytes + test/reference/large-source.mask.rgb24.ref.png | Bin 112 -> 0 bytes + test/reference/large-source.rgb24.ref.png | Bin 112 -> 0 bytes + test/reference/large-source.traps.argb32.ref.png | Bin 112 -> 0 bytes + test/reference/large-source.traps.rgb24.ref.png | Bin 112 -> 0 bytes + .../large-twin-antialias-mixed.mask.argb32.ref.png | Bin 16660 -> 0 bytes + .../large-twin-antialias-mixed.mask.rgb24.ref.png | Bin 16660 -> 0 bytes + test/reference/leaky-dash.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/leaky-dash.mask.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/leaky-dash.mask.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/leaky-dash.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/leaky-dash.traps.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/leaky-dash.traps.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/leaky-dashed-rectangle.argb32.ref.png | Bin 357 -> 0 bytes + .../leaky-dashed-rectangle.mask.argb32.ref.png | Bin 357 -> 0 bytes + .../leaky-dashed-rectangle.mask.rgb24.ref.png | Bin 357 -> 0 bytes + test/reference/leaky-dashed-rectangle.rgb24.ref.png | Bin 357 -> 0 bytes + test/reference/leaky-dashed-stroke.mask.argb32.ref.png | Bin 9387 -> 0 bytes + test/reference/leaky-dashed-stroke.mask.rgb24.ref.png | Bin 9387 -> 0 bytes + test/reference/leaky-polygon.mask.argb32.ref.png | Bin 337 -> 0 bytes + test/reference/leaky-polygon.mask.rgb24.ref.png | Bin 337 -> 0 bytes + .../line-width-large-overlap-flipped.argb32.ref.png | Bin 305 -> 0 bytes + ...ine-width-large-overlap-flipped.mask.argb32.ref.png | Bin 305 -> 0 bytes + ...line-width-large-overlap-flipped.mask.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap-flipped.rgb24.ref.png | Bin 305 -> 0 bytes + ...ne-width-large-overlap-flipped.traps.argb32.ref.png | Bin 305 -> 0 bytes + ...ine-width-large-overlap-flipped.traps.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap-flopped.argb32.ref.png | Bin 305 -> 0 bytes + ...ine-width-large-overlap-flopped.mask.argb32.ref.png | Bin 305 -> 0 bytes + ...line-width-large-overlap-flopped.mask.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap-flopped.rgb24.ref.png | Bin 305 -> 0 bytes + ...ne-width-large-overlap-flopped.traps.argb32.ref.png | Bin 305 -> 0 bytes + ...ine-width-large-overlap-flopped.traps.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap-offset.argb32.ref.png | Bin 305 -> 0 bytes + ...line-width-large-overlap-offset.mask.argb32.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap-offset.mask.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap-offset.rgb24.ref.png | Bin 305 -> 0 bytes + ...ine-width-large-overlap-offset.traps.argb32.ref.png | Bin 305 -> 0 bytes + ...line-width-large-overlap-offset.traps.rgb24.ref.png | Bin 305 -> 0 bytes + ...ine-width-large-overlap-rotated.mask.argb32.ref.png | Bin 427 -> 0 bytes + ...line-width-large-overlap-rotated.mask.rgb24.ref.png | Bin 427 -> 0 bytes + ...ne-width-large-overlap-rotated.traps.argb32.ref.png | Bin 404 -> 0 bytes + ...ine-width-large-overlap-rotated.traps.rgb24.ref.png | Bin 404 -> 0 bytes + test/reference/line-width-large-overlap.argb32.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap.mask.argb32.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap.mask.rgb24.ref.png | Bin 305 -> 0 bytes + test/reference/line-width-large-overlap.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap.traps.argb32.ref.png | Bin 305 -> 0 bytes + .../line-width-large-overlap.traps.rgb24.ref.png | Bin 305 -> 0 bytes + .../line-width-overlap-flipped.argb32.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flipped.mask.argb32.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flipped.mask.rgb24.ref.png | Bin 324 -> 0 bytes + .../reference/line-width-overlap-flipped.rgb24.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flipped.traps.argb32.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flipped.traps.rgb24.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flopped.argb32.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flopped.mask.argb32.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flopped.mask.rgb24.ref.png | Bin 324 -> 0 bytes + .../reference/line-width-overlap-flopped.rgb24.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flopped.traps.argb32.ref.png | Bin 324 -> 0 bytes + .../line-width-overlap-flopped.traps.rgb24.ref.png | Bin 324 -> 0 bytes + .../reference/line-width-overlap-offset.argb32.ref.png | Bin 348 -> 0 bytes + .../line-width-overlap-offset.mask.argb32.ref.png | Bin 348 -> 0 bytes + .../line-width-overlap-offset.mask.rgb24.ref.png | Bin 348 -> 0 bytes + test/reference/line-width-overlap-offset.rgb24.ref.png | Bin 348 -> 0 bytes + .../line-width-overlap-offset.traps.argb32.ref.png | Bin 365 -> 0 bytes + .../line-width-overlap-offset.traps.rgb24.ref.png | Bin 365 -> 0 bytes + .../line-width-overlap-rotated.mask.argb32.ref.png | Bin 828 -> 0 bytes + .../line-width-overlap-rotated.mask.rgb24.ref.png | Bin 828 -> 0 bytes + test/reference/line-width-overlap.argb32.ref.png | Bin 324 -> 0 bytes + test/reference/line-width-overlap.mask.argb32.ref.png | Bin 324 -> 0 bytes + test/reference/line-width-overlap.mask.rgb24.ref.png | Bin 324 -> 0 bytes + test/reference/line-width-overlap.rgb24.ref.png | Bin 324 -> 0 bytes + test/reference/line-width-overlap.traps.argb32.ref.png | Bin 324 -> 0 bytes + test/reference/line-width-overlap.traps.rgb24.ref.png | Bin 324 -> 0 bytes + test/reference/line-width-scale.mask.argb32.ref.png | Bin 5721 -> 0 bytes + test/reference/line-width-scale.mask.rgb24.ref.png | Bin 5721 -> 0 bytes + .../reference/line-width-tolerance.mask.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/line-width-tolerance.mask.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/line-width.mask.argb32.ref.png | Bin 178 -> 0 bytes + test/reference/line-width.mask.rgb24.ref.png | Bin 178 -> 0 bytes + test/reference/linear-gradient-extend.argb32.ref.png | Bin 371 -> 0 bytes + .../linear-gradient-extend.mask.argb32.ref.png | Bin 371 -> 0 bytes + .../linear-gradient-extend.mask.rgb24.ref.png | Bin 371 -> 0 bytes + test/reference/linear-gradient-extend.rgb24.ref.png | Bin 371 -> 0 bytes + .../linear-gradient-extend.traps.argb32.ref.png | Bin 371 -> 0 bytes + .../linear-gradient-extend.traps.rgb24.ref.png | Bin 371 -> 0 bytes + test/reference/linear-gradient-large.argb32.ref.png | Bin 4076 -> 0 bytes + .../linear-gradient-large.mask.argb32.ref.png | Bin 4076 -> 0 bytes + .../reference/linear-gradient-large.mask.rgb24.ref.png | Bin 4076 -> 0 bytes + test/reference/linear-gradient-large.rgb24.ref.png | Bin 4076 -> 0 bytes + .../linear-gradient-large.traps.argb32.ref.png | Bin 4076 -> 0 bytes + .../linear-gradient-large.traps.rgb24.ref.png | Bin 4076 -> 0 bytes + .../linear-gradient-one-stop.mask.argb32.ref.png | Bin 225 -> 0 bytes + .../linear-gradient-one-stop.mask.rgb24.ref.png | Bin 174 -> 0 bytes + .../linear-gradient-one-stop.traps.argb32.ref.png | Bin 225 -> 0 bytes + .../linear-gradient-one-stop.traps.rgb24.ref.png | Bin 174 -> 0 bytes + .../linear-gradient-reflect.mask.argb32.ref.png | Bin 185 -> 0 bytes + .../linear-gradient-reflect.mask.rgb24.ref.png | Bin 185 -> 0 bytes + .../linear-gradient-reflect.traps.argb32.ref.png | Bin 185 -> 0 bytes + .../linear-gradient-reflect.traps.rgb24.ref.png | Bin 185 -> 0 bytes + .../linear-gradient-subset.mask.argb32.ref.png | Bin 820 -> 0 bytes + .../linear-gradient-subset.mask.rgb24.ref.png | Bin 820 -> 0 bytes + test/reference/linear-gradient.mask.argb32.ref.png | Bin 974 -> 0 bytes + test/reference/linear-gradient.mask.rgb24.ref.png | Bin 974 -> 0 bytes + test/reference/linear-uniform.argb32.ref.png | Bin 128 -> 0 bytes + test/reference/linear-uniform.mask.argb32.ref.png | Bin 128 -> 0 bytes + test/reference/linear-uniform.mask.rgb24.ref.png | Bin 128 -> 0 bytes + test/reference/linear-uniform.rgb24.ref.png | Bin 128 -> 0 bytes + test/reference/linear-uniform.traps.argb32.ref.png | Bin 128 -> 0 bytes + test/reference/linear-uniform.traps.rgb24.ref.png | Bin 128 -> 0 bytes + test/reference/long-dashed-lines.mask.argb32.ref.png | Bin 2548 -> 0 bytes + test/reference/long-dashed-lines.mask.rgb24.ref.png | Bin 2548 -> 0 bytes + test/reference/map-all-to-image.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/map-all-to-image.mask.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/map-all-to-image.mask.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/map-all-to-image.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/map-all-to-image.traps.argb32.ref.png | Bin 86 -> 0 bytes + test/reference/map-all-to-image.traps.rgb24.ref.png | Bin 86 -> 0 bytes + test/reference/map-bit-to-image.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-bit-to-image.mask.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-bit-to-image.mask.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/map-bit-to-image.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/map-bit-to-image.traps.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-bit-to-image.traps.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.mask.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.mask.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.traps.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.traps.rgb24.ref.png | Bin 103 -> 0 bytes + .../map-to-image-fill.xlib-fallback.rgb24.ref.png | Bin 103 -> 0 bytes + .../map-to-image-fill.xlib-window.rgb24.ref.png | Bin 103 -> 0 bytes + test/reference/mask-alpha.mask.argb32.ref.png | Bin 632 -> 0 bytes + test/reference/mask-alpha.mask.rgb24.ref.png | Bin 589 -> 0 bytes + test/reference/mask-ctm.argb32.ref.png | Bin 110 -> 0 bytes + test/reference/mask-ctm.mask.argb32.ref.png | Bin 110 -> 0 bytes + test/reference/mask-ctm.mask.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/mask-ctm.traps.argb32.ref.png | Bin 110 -> 0 bytes + test/reference/mask-ctm.traps.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/mask-surface-ctm.argb32.ref.png | Bin 110 -> 0 bytes + test/reference/mask-surface-ctm.mask.argb32.ref.png | Bin 110 -> 0 bytes + test/reference/mask-surface-ctm.mask.rgb24.ref.png | Bin 105 -> 0 bytes + test/reference/mask-surface-ctm.traps.argb32.ref.png | Bin 110 -> 0 bytes + test/reference/mask-surface-ctm.traps.rgb24.ref.png | Bin 105 -> 0 bytes + .../mask-transformed-image.mask.argb32.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-image.mask.rgb24.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-image.traps.argb32.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-image.traps.rgb24.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-similar.mask.argb32.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-similar.mask.rgb24.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-similar.traps.argb32.ref.png | Bin 3812 -> 0 bytes + .../mask-transformed-similar.traps.rgb24.ref.png | Bin 3812 -> 0 bytes + test/reference/mask.mask.argb32.ref.png | Bin 8565 -> 0 bytes + test/reference/mask.mask.rgb24.ref.png | Bin 7135 -> 0 bytes + test/reference/mesh-pattern-accuracy.argb32.ref.png | Bin 8086 -> 0 bytes + .../mesh-pattern-accuracy.mask.argb32.ref.png | Bin 8086 -> 0 bytes + .../reference/mesh-pattern-accuracy.mask.rgb24.ref.png | Bin 8086 -> 0 bytes + test/reference/mesh-pattern-accuracy.rgb24.ref.png | Bin 8086 -> 0 bytes + .../mesh-pattern-accuracy.traps.argb32.ref.png | Bin 8086 -> 0 bytes + .../mesh-pattern-accuracy.traps.rgb24.ref.png | Bin 8086 -> 0 bytes + test/reference/mesh-pattern-conical.argb32.ref.png | Bin 8655 -> 0 bytes + .../reference/mesh-pattern-conical.mask.argb32.ref.png | Bin 8655 -> 0 bytes + test/reference/mesh-pattern-conical.mask.rgb24.ref.png | Bin 8655 -> 0 bytes + test/reference/mesh-pattern-conical.rgb24.ref.png | Bin 8655 -> 0 bytes + .../mesh-pattern-conical.traps.argb32.ref.png | Bin 8655 -> 0 bytes + .../reference/mesh-pattern-conical.traps.rgb24.ref.png | Bin 8655 -> 0 bytes + .../mesh-pattern-control-points.argb32.ref.png | Bin 10665 -> 0 bytes + .../mesh-pattern-control-points.mask.argb32.ref.png | Bin 10665 -> 0 bytes + .../mesh-pattern-control-points.mask.rgb24.ref.png | Bin 10665 -> 0 bytes + .../mesh-pattern-control-points.rgb24.ref.png | Bin 10665 -> 0 bytes + .../mesh-pattern-control-points.traps.argb32.ref.png | Bin 10665 -> 0 bytes + .../mesh-pattern-control-points.traps.rgb24.ref.png | Bin 10665 -> 0 bytes + test/reference/mesh-pattern-fold.argb32.ref.png | Bin 52980 -> 0 bytes + test/reference/mesh-pattern-fold.mask.argb32.ref.png | Bin 52980 -> 0 bytes + test/reference/mesh-pattern-fold.mask.rgb24.ref.png | Bin 52980 -> 0 bytes + test/reference/mesh-pattern-fold.rgb24.ref.png | Bin 52980 -> 0 bytes + test/reference/mesh-pattern-fold.traps.argb32.ref.png | Bin 52980 -> 0 bytes + test/reference/mesh-pattern-fold.traps.rgb24.ref.png | Bin 52980 -> 0 bytes + test/reference/mesh-pattern-overlap.argb32.ref.png | Bin 9129 -> 0 bytes + .../reference/mesh-pattern-overlap.mask.argb32.ref.png | Bin 9129 -> 0 bytes + test/reference/mesh-pattern-overlap.mask.rgb24.ref.png | Bin 9129 -> 0 bytes + test/reference/mesh-pattern-overlap.rgb24.ref.png | Bin 9129 -> 0 bytes + .../mesh-pattern-overlap.traps.argb32.ref.png | Bin 9129 -> 0 bytes + .../reference/mesh-pattern-overlap.traps.rgb24.ref.png | Bin 9129 -> 0 bytes + test/reference/mesh-pattern-transformed.argb32.ref.png | Bin 14463 -> 0 bytes + .../mesh-pattern-transformed.mask.argb32.ref.png | Bin 14463 -> 0 bytes + .../mesh-pattern-transformed.mask.rgb24.ref.png | Bin 14463 -> 0 bytes + test/reference/mesh-pattern-transformed.rgb24.ref.png | Bin 14463 -> 0 bytes + .../mesh-pattern-transformed.traps.argb32.ref.png | Bin 14463 -> 0 bytes + .../mesh-pattern-transformed.traps.rgb24.ref.png | Bin 14463 -> 0 bytes + test/reference/mesh-pattern.argb32.ref.png | Bin 19566 -> 0 bytes + test/reference/mesh-pattern.mask.argb32.ref.png | Bin 19566 -> 0 bytes + test/reference/mesh-pattern.mask.rgb24.ref.png | Bin 19566 -> 0 bytes + test/reference/mesh-pattern.rgb24.ref.png | Bin 19566 -> 0 bytes + test/reference/mesh-pattern.traps.argb32.ref.png | Bin 19566 -> 0 bytes + test/reference/mesh-pattern.traps.rgb24.ref.png | Bin 19566 -> 0 bytes + test/reference/mime-data.argb32.ref.png | Bin 185 -> 0 bytes + test/reference/mime-data.mask.argb32.ref.png | Bin 185 -> 0 bytes + test/reference/mime-data.mask.rgb24.ref.png | Bin 185 -> 0 bytes + test/reference/mime-data.rgb24.ref.png | Bin 185 -> 0 bytes + test/reference/mime-data.traps.argb32.ref.png | Bin 185 -> 0 bytes + test/reference/mime-data.traps.rgb24.ref.png | Bin 185 -> 0 bytes + test/reference/miter-precision.mask.argb32.ref.png | Bin 1030 -> 0 bytes + test/reference/miter-precision.mask.rgb24.ref.png | Bin 1030 -> 0 bytes + test/reference/move-to-show-surface.argb32.ref.png | Bin 96 -> 0 bytes + .../reference/move-to-show-surface.mask.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/move-to-show-surface.mask.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/move-to-show-surface.rgb24.ref.png | Bin 96 -> 0 bytes + .../move-to-show-surface.traps.argb32.ref.png | Bin 96 -> 0 bytes + .../reference/move-to-show-surface.traps.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/negative-stride-image.argb32.ref.png | Bin 81121 -> 0 bytes + .../negative-stride-image.mask.argb32.ref.png | Bin 81121 -> 0 bytes + .../reference/negative-stride-image.mask.rgb24.ref.png | Bin 81121 -> 0 bytes + test/reference/negative-stride-image.rgb24.ref.png | Bin 81121 -> 0 bytes + .../negative-stride-image.traps.argb32.ref.png | Bin 81121 -> 0 bytes + .../negative-stride-image.traps.rgb24.ref.png | Bin 81121 -> 0 bytes + test/reference/new-sub-path.mask.argb32.ref.png | Bin 408 -> 0 bytes + test/reference/new-sub-path.mask.rgb24.ref.png | Bin 371 -> 0 bytes + test/reference/nil-surface.argb32.ref.png | Bin 88 -> 0 bytes + test/reference/nil-surface.mask.argb32.ref.png | Bin 88 -> 0 bytes + test/reference/nil-surface.mask.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/nil-surface.traps.argb32.ref.png | Bin 88 -> 0 bytes + test/reference/nil-surface.traps.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/operator-alpha-alpha.argb32.ref.png | Bin 3441 -> 0 bytes + .../reference/operator-alpha-alpha.mask.argb32.ref.png | Bin 3441 -> 0 bytes + test/reference/operator-alpha-alpha.mask.rgb24.ref.png | Bin 3441 -> 0 bytes + test/reference/operator-alpha-alpha.rgb24.ref.png | Bin 3441 -> 0 bytes + test/reference/operator-alpha.argb32.ref.png | Bin 280 -> 0 bytes + test/reference/operator-alpha.mask.argb32.ref.png | Bin 280 -> 0 bytes + test/reference/operator-alpha.mask.rgb24.ref.png | Bin 205 -> 0 bytes + test/reference/operator-alpha.traps.argb32.ref.png | Bin 280 -> 0 bytes + test/reference/operator-alpha.traps.rgb24.ref.png | Bin 205 -> 0 bytes + test/reference/operator-clear.mask.argb32.ref.png | Bin 1071 -> 0 bytes + test/reference/operator.argb32.ref.png | Bin 238 -> 0 bytes + test/reference/operator.mask.argb32.ref.png | Bin 238 -> 0 bytes + test/reference/operator.mask.rgb24.ref.png | Bin 189 -> 0 bytes + test/reference/operator.traps.argb32.ref.png | Bin 238 -> 0 bytes + test/reference/operator.traps.rgb24.ref.png | Bin 189 -> 0 bytes + test/reference/over-above-source.mask.argb32.ref.png | Bin 564 -> 0 bytes + test/reference/over-above-source.mask.rgb24.ref.png | Bin 465 -> 0 bytes + test/reference/over-around-source.mask.argb32.ref.png | Bin 633 -> 0 bytes + test/reference/over-around-source.mask.rgb24.ref.png | Bin 499 -> 0 bytes + test/reference/over-below-source.mask.argb32.ref.png | Bin 447 -> 0 bytes + test/reference/over-below-source.mask.rgb24.ref.png | Bin 385 -> 0 bytes + test/reference/over-between-source.mask.argb32.ref.png | Bin 596 -> 0 bytes + test/reference/over-between-source.mask.rgb24.ref.png | Bin 463 -> 0 bytes + test/reference/overlapping-boxes.mask.argb32.ref.png | Bin 179 -> 0 bytes + test/reference/overlapping-boxes.mask.rgb24.ref.png | Bin 170 -> 0 bytes + test/reference/overlapping-glyphs.mask.argb32.ref.png | Bin 2717 -> 0 bytes + test/reference/overlapping-glyphs.mask.rgb24.ref.png | Bin 1663 -> 0 bytes + test/reference/paint-clip-fill-aa.argb32.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-aa.mask.argb32.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-aa.mask.rgb24.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-aa.rgb24.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-aa.traps.argb32.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-aa.traps.rgb24.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-mono.argb32.ref.png | Bin 327 -> 0 bytes + .../reference/paint-clip-fill-mono.mask.argb32.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-mono.mask.rgb24.ref.png | Bin 327 -> 0 bytes + test/reference/paint-clip-fill-mono.rgb24.ref.png | Bin 327 -> 0 bytes + .../paint-clip-fill-mono.traps.argb32.ref.png | Bin 327 -> 0 bytes + .../reference/paint-clip-fill-mono.traps.rgb24.ref.png | Bin 327 -> 0 bytes + test/reference/paint-repeat.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/paint-repeat.mask.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/paint-repeat.mask.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/paint-repeat.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/paint-repeat.traps.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/paint-repeat.traps.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/paint-source-alpha.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/paint-source-alpha.mask.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/paint-source-alpha.mask.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/paint-source-alpha.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/paint-source-alpha.traps.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/paint-source-alpha.traps.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/paint-with-alpha-clip.argb32.ref.png | Bin 290 -> 0 bytes + test/reference/paint-with-alpha-clip.rgb24.ref.png | Bin 290 -> 0 bytes + .../paint-with-alpha-solid-clip.argb32.ref.png | Bin 248 -> 0 bytes + .../paint-with-alpha-solid-clip.rgb24.ref.png | Bin 248 -> 0 bytes + test/reference/paint-with-alpha.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/paint-with-alpha.mask.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/paint-with-alpha.mask.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/paint-with-alpha.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/paint-with-alpha.traps.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/paint-with-alpha.traps.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/paint.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/paint.mask.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/paint.mask.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/paint.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/paint.traps.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/paint.traps.rgb24.ref.png | Bin 93 -> 0 bytes + .../partial-clip-text-bottom.mask.argb32.ref.png | Bin 261 -> 0 bytes + .../partial-clip-text-bottom.mask.rgb24.ref.png | Bin 261 -> 0 bytes + .../partial-clip-text-bottom.traps.argb32.ref.png | Bin 261 -> 0 bytes + .../partial-clip-text-bottom.traps.rgb24.ref.png | Bin 261 -> 0 bytes + .../partial-clip-text-left.mask.argb32.ref.png | Bin 301 -> 0 bytes + .../partial-clip-text-left.mask.rgb24.ref.png | Bin 301 -> 0 bytes + .../partial-clip-text-left.traps.argb32.ref.png | Bin 301 -> 0 bytes + .../partial-clip-text-left.traps.rgb24.ref.png | Bin 301 -> 0 bytes + .../partial-clip-text-right.mask.argb32.ref.png | Bin 155 -> 0 bytes + .../partial-clip-text-right.mask.rgb24.ref.png | Bin 155 -> 0 bytes + .../partial-clip-text-right.traps.argb32.ref.png | Bin 155 -> 0 bytes + .../partial-clip-text-right.traps.rgb24.ref.png | Bin 155 -> 0 bytes + .../partial-clip-text-top.mask.argb32.ref.png | Bin 181 -> 0 bytes + .../reference/partial-clip-text-top.mask.rgb24.ref.png | Bin 181 -> 0 bytes + .../partial-clip-text-top.traps.argb32.ref.png | Bin 181 -> 0 bytes + .../partial-clip-text-top.traps.rgb24.ref.png | Bin 181 -> 0 bytes + .../partial-coverage-half-reference.argb32.ref.png | Bin 189 -> 0 bytes + ...partial-coverage-half-reference.mask.argb32.ref.png | Bin 189 -> 0 bytes + .../partial-coverage-half-reference.mask.rgb24.ref.png | Bin 189 -> 0 bytes + .../partial-coverage-half-reference.rgb24.ref.png | Bin 189 -> 0 bytes + ...artial-coverage-half-reference.traps.argb32.ref.png | Bin 189 -> 0 bytes + ...partial-coverage-half-reference.traps.rgb24.ref.png | Bin 189 -> 0 bytes + .../partial-coverage-reference.argb32.ref.png | Bin 202 -> 0 bytes + .../partial-coverage-reference.mask.argb32.ref.png | Bin 202 -> 0 bytes + .../partial-coverage-reference.mask.rgb24.ref.png | Bin 202 -> 0 bytes + .../reference/partial-coverage-reference.rgb24.ref.png | Bin 202 -> 0 bytes + .../partial-coverage-reference.traps.argb32.ref.png | Bin 202 -> 0 bytes + .../partial-coverage-reference.traps.rgb24.ref.png | Bin 202 -> 0 bytes + ...ial-coverage-three-quarter-reference.argb32.ref.png | Bin 186 -> 0 bytes + ...overage-three-quarter-reference.mask.argb32.ref.png | Bin 186 -> 0 bytes + ...coverage-three-quarter-reference.mask.rgb24.ref.png | Bin 186 -> 0 bytes + ...tial-coverage-three-quarter-reference.rgb24.ref.png | Bin 186 -> 0 bytes + ...verage-three-quarter-reference.traps.argb32.ref.png | Bin 186 -> 0 bytes + ...overage-three-quarter-reference.traps.rgb24.ref.png | Bin 186 -> 0 bytes + test/reference/pass-through.argb32.ref.png | Bin 221 -> 0 bytes + test/reference/pass-through.mask.argb32.ref.png | Bin 221 -> 0 bytes + test/reference/pass-through.mask.rgb24.ref.png | Bin 158 -> 0 bytes + test/reference/pass-through.traps.argb32.ref.png | Bin 221 -> 0 bytes + test/reference/pass-through.traps.rgb24.ref.png | Bin 158 -> 0 bytes + test/reference/path-append.mask.argb32.ref.png | Bin 6144 -> 0 bytes + test/reference/path-append.mask.rgb24.ref.png | Bin 6144 -> 0 bytes + test/reference/path-stroke-twice.mask.argb32.ref.png | Bin 240 -> 0 bytes + test/reference/path-stroke-twice.mask.rgb24.ref.png | Bin 240 -> 0 bytes + test/reference/pattern-getters.argb32.ref.png | Bin 87 -> 0 bytes + test/reference/pattern-getters.mask.argb32.ref.png | Bin 87 -> 0 bytes + test/reference/pattern-getters.mask.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/pattern-getters.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/pattern-getters.traps.argb32.ref.png | Bin 87 -> 0 bytes + test/reference/pattern-getters.traps.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/pdf-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/pdf-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/pdf-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/pdf-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/pixman-rotate.argb32.ref.png | Bin 260 -> 0 bytes + test/reference/pixman-rotate.mask.argb32.ref.png | Bin 260 -> 0 bytes + test/reference/pixman-rotate.mask.rgb24.ref.png | Bin 225 -> 0 bytes + test/reference/pixman-rotate.traps.argb32.ref.png | Bin 260 -> 0 bytes + test/reference/pixman-rotate.traps.rgb24.ref.png | Bin 225 -> 0 bytes + test/reference/ps-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/ps-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/ps-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/ps-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/pthread-same-source.argb32.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-same-source.mask.argb32.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-same-source.mask.rgb24.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-same-source.rgb24.ref.png | Bin 1000 -> 0 bytes + .../reference/pthread-same-source.traps.argb32.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-same-source.traps.rgb24.ref.png | Bin 1000 -> 0 bytes + test/reference/pthread-show-text.mask.argb32.ref.png | Bin 30199 -> 0 bytes + test/reference/pthread-show-text.mask.rgb24.ref.png | Bin 30199 -> 0 bytes + test/reference/pthread-show-text.traps.argb32.ref.png | Bin 30199 -> 0 bytes + test/reference/pthread-show-text.traps.rgb24.ref.png | Bin 30199 -> 0 bytes + test/reference/pthread-similar.argb32.ref.png | Bin 170 -> 0 bytes + test/reference/pthread-similar.mask.argb32.ref.png | Bin 170 -> 0 bytes + test/reference/pthread-similar.mask.rgb24.ref.png | Bin 170 -> 0 bytes + test/reference/pthread-similar.rgb24.ref.png | Bin 170 -> 0 bytes + test/reference/pthread-similar.traps.argb32.ref.png | Bin 170 -> 0 bytes + test/reference/pthread-similar.traps.rgb24.ref.png | Bin 170 -> 0 bytes + test/reference/push-group-color.mask.argb32.ref.png | Bin 2892 -> 0 bytes + test/reference/push-group-color.mask.rgb24.ref.png | Bin 2892 -> 0 bytes + test/reference/push-group-path-offset.argb32.ref.png | Bin 186 -> 0 bytes + .../push-group-path-offset.mask.argb32.ref.png | Bin 186 -> 0 bytes + .../push-group-path-offset.mask.rgb24.ref.png | Bin 186 -> 0 bytes + test/reference/push-group-path-offset.rgb24.ref.png | Bin 186 -> 0 bytes + .../push-group-path-offset.traps.argb32.ref.png | Bin 186 -> 0 bytes + .../push-group-path-offset.traps.rgb24.ref.png | Bin 186 -> 0 bytes + test/reference/push-group.mask.argb32.ref.png | Bin 3062 -> 0 bytes + test/reference/push-group.mask.rgb24.ref.png | Bin 2899 -> 0 bytes + .../radial-gradient-mask-source.mask.argb32.ref.png | Bin 145713 -> 0 bytes + .../radial-gradient-mask-source.traps.argb32.ref.png | Bin 145713 -> 0 bytes + test/reference/radial-gradient-mask.argb32.ref.png | Bin 286065 -> 0 bytes + .../reference/radial-gradient-mask.mask.argb32.ref.png | Bin 286065 -> 0 bytes + test/reference/radial-gradient-mask.mask.rgb24.ref.png | Bin 286065 -> 0 bytes + test/reference/radial-gradient-mask.rgb24.ref.png | Bin 286065 -> 0 bytes + .../radial-gradient-mask.traps.argb32.ref.png | Bin 286065 -> 0 bytes + .../reference/radial-gradient-mask.traps.rgb24.ref.png | Bin 286065 -> 0 bytes + test/reference/radial-gradient-one-stop.argb32.ref.png | Bin 6306 -> 0 bytes + .../radial-gradient-one-stop.mask.argb32.ref.png | Bin 6306 -> 0 bytes + .../radial-gradient-one-stop.mask.rgb24.ref.png | Bin 6306 -> 0 bytes + test/reference/radial-gradient-one-stop.rgb24.ref.png | Bin 6306 -> 0 bytes + .../radial-gradient-one-stop.traps.argb32.ref.png | Bin 6306 -> 0 bytes + .../radial-gradient-one-stop.traps.rgb24.ref.png | Bin 6306 -> 0 bytes + .../radial-gradient-source.mask.argb32.ref.png | Bin 408848 -> 0 bytes + .../radial-gradient-source.mask.rgb24.ref.png | Bin 263908 -> 0 bytes + .../radial-gradient-source.traps.argb32.ref.png | Bin 408848 -> 0 bytes + .../radial-gradient-source.traps.rgb24.ref.png | Bin 263908 -> 0 bytes + test/reference/radial-gradient.argb32.ref.png | Bin 382283 -> 0 bytes + test/reference/radial-gradient.mask.argb32.ref.png | Bin 382283 -> 0 bytes + test/reference/radial-gradient.mask.rgb24.ref.png | Bin 382283 -> 0 bytes + test/reference/radial-gradient.rgb24.ref.png | Bin 382283 -> 0 bytes + test/reference/radial-gradient.traps.argb32.ref.png | Bin 382283 -> 0 bytes + test/reference/radial-gradient.traps.rgb24.ref.png | Bin 382283 -> 0 bytes + .../random-intersections-curves-eo.mask.argb32.ref.png | Bin 245848 -> 0 bytes + .../random-intersections-curves-eo.mask.rgb24.ref.png | Bin 245848 -> 0 bytes + .../random-intersections-curves-nz.mask.argb32.ref.png | Bin 265249 -> 0 bytes + .../random-intersections-curves-nz.mask.rgb24.ref.png | Bin 265249 -> 0 bytes + .../random-intersections-eo.mask.argb32.ref.png | Bin 136632 -> 0 bytes + .../random-intersections-eo.mask.rgb24.ref.png | Bin 136632 -> 0 bytes + .../random-intersections-nonzero.mask.argb32.ref.png | Bin 142139 -> 0 bytes + .../random-intersections-nonzero.mask.rgb24.ref.png | Bin 142139 -> 0 bytes + test/reference/raster-source.argb32.ref.png | Bin 1209 -> 0 bytes + test/reference/raster-source.mask.argb32.ref.png | Bin 1209 -> 0 bytes + test/reference/raster-source.mask.rgb24.ref.png | Bin 1209 -> 0 bytes + test/reference/raster-source.rgb24.ref.png | Bin 1209 -> 0 bytes + test/reference/raster-source.traps.argb32.ref.png | Bin 1209 -> 0 bytes + test/reference/raster-source.traps.rgb24.ref.png | Bin 1209 -> 0 bytes + .../record-extend-none-similar.argb32.ref.png | Bin 293 -> 0 bytes + .../record-extend-none-similar.image16.rgb24.ref.png | Bin 293 -> 0 bytes + .../reference/record-extend-none-similar.rgb24.ref.png | Bin 293 -> 0 bytes + test/reference/record-extend-none.argb32.ref.png | Bin 293 -> 0 bytes + .../reference/record-extend-none.image16.rgb24.ref.png | Bin 293 -> 0 bytes + test/reference/record-extend-none.rgb24.ref.png | Bin 293 -> 0 bytes + test/reference/record-extend-none.traps.argb32.ref.png | Bin 293 -> 0 bytes + test/reference/record-extend-none.traps.rgb24.ref.png | Bin 293 -> 0 bytes + .../reference/record-extend-pad-similar.argb32.ref.png | Bin 298 -> 0 bytes + .../record-extend-pad-similar.image16.rgb24.ref.png | Bin 298 -> 0 bytes + test/reference/record-extend-pad-similar.rgb24.ref.png | Bin 298 -> 0 bytes + test/reference/record-extend-pad.argb32.ref.png | Bin 298 -> 0 bytes + test/reference/record-extend-pad.image16.rgb24.ref.png | Bin 298 -> 0 bytes + test/reference/record-extend-pad.rgb24.ref.png | Bin 298 -> 0 bytes + test/reference/record-extend-pad.traps.argb32.ref.png | Bin 298 -> 0 bytes + test/reference/record-extend-pad.traps.rgb24.ref.png | Bin 298 -> 0 bytes + .../record-extend-reflect-similar.argb32.ref.png | Bin 335 -> 0 bytes + ...record-extend-reflect-similar.image16.rgb24.ref.png | Bin 335 -> 0 bytes + .../record-extend-reflect-similar.rgb24.ref.png | Bin 335 -> 0 bytes + test/reference/record-extend-reflect.argb32.ref.png | Bin 335 -> 0 bytes + .../record-extend-reflect.image16.rgb24.ref.png | Bin 335 -> 0 bytes + test/reference/record-extend-reflect.rgb24.ref.png | Bin 335 -> 0 bytes + .../record-extend-reflect.traps.argb32.ref.png | Bin 335 -> 0 bytes + .../record-extend-reflect.traps.rgb24.ref.png | Bin 335 -> 0 bytes + .../record-extend-repeat-similar.argb32.ref.png | Bin 286 -> 0 bytes + .../record-extend-repeat-similar.image16.rgb24.ref.png | Bin 286 -> 0 bytes + .../record-extend-repeat-similar.rgb24.ref.png | Bin 286 -> 0 bytes + test/reference/record-extend-repeat.argb32.ref.png | Bin 286 -> 0 bytes + .../record-extend-repeat.image16.rgb24.ref.png | Bin 286 -> 0 bytes + test/reference/record-extend-repeat.rgb24.ref.png | Bin 286 -> 0 bytes + .../record-extend-repeat.traps.argb32.ref.png | Bin 286 -> 0 bytes + .../reference/record-extend-repeat.traps.rgb24.ref.png | Bin 286 -> 0 bytes + test/reference/record-mesh.argb32.ref.png | Bin 15229 -> 0 bytes + test/reference/record-mesh.rgb24.ref.png | Bin 15229 -> 0 bytes + test/reference/record-mesh.traps.argb32.ref.png | Bin 15229 -> 0 bytes + test/reference/record-mesh.traps.rgb24.ref.png | Bin 15229 -> 0 bytes + .../record-paint-alpha-solid-clip.argb32.ref.png | Bin 248 -> 0 bytes + .../record-paint-alpha-solid-clip.rgb24.ref.png | Bin 248 -> 0 bytes + test/reference/record-paint-alpha.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/record-paint-alpha.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/record-paint-alpha.traps.argb32.ref.png | Bin 224 -> 0 bytes + test/reference/record-paint-alpha.traps.rgb24.ref.png | Bin 224 -> 0 bytes + test/reference/record-paint.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/record-paint.image16.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/record-paint.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/record-paint.traps.argb32.ref.png | Bin 93 -> 0 bytes + test/reference/record-paint.traps.rgb24.ref.png | Bin 93 -> 0 bytes + test/reference/record-self-intersecting.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/record-self-intersecting.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/rectangle-rounding-error.argb32.ref.png | Bin 212 -> 0 bytes + .../rectangle-rounding-error.mask.argb32.ref.png | Bin 212 -> 0 bytes + .../rectangle-rounding-error.mask.rgb24.ref.png | Bin 212 -> 0 bytes + test/reference/rectangle-rounding-error.rgb24.ref.png | Bin 212 -> 0 bytes + .../rectangle-rounding-error.traps.argb32.ref.png | Bin 212 -> 0 bytes + .../rectangle-rounding-error.traps.rgb24.ref.png | Bin 212 -> 0 bytes + test/reference/rectilinear-fill.argb32.ref.png | Bin 151 -> 0 bytes + test/reference/rectilinear-fill.mask.argb32.ref.png | Bin 151 -> 0 bytes + test/reference/rectilinear-fill.mask.rgb24.ref.png | Bin 151 -> 0 bytes + test/reference/rectilinear-fill.rgb24.ref.png | Bin 151 -> 0 bytes + test/reference/rectilinear-fill.traps.argb32.ref.png | Bin 151 -> 0 bytes + test/reference/rectilinear-fill.traps.rgb24.ref.png | Bin 151 -> 0 bytes + test/reference/rectilinear-grid.argb32.ref.png | Bin 569 -> 0 bytes + test/reference/rectilinear-grid.mask.argb32.ref.png | Bin 569 -> 0 bytes + test/reference/rectilinear-grid.mask.rgb24.ref.png | Bin 569 -> 0 bytes + test/reference/rectilinear-grid.rgb24.ref.png | Bin 569 -> 0 bytes + .../rectilinear-miter-limit.mask.argb32.ref.png | Bin 145 -> 0 bytes + .../rectilinear-miter-limit.mask.rgb24.ref.png | Bin 145 -> 0 bytes + test/reference/rectilinear-stroke.argb32.ref.png | Bin 172 -> 0 bytes + test/reference/rectilinear-stroke.mask.argb32.ref.png | Bin 172 -> 0 bytes + test/reference/rectilinear-stroke.mask.rgb24.ref.png | Bin 172 -> 0 bytes + test/reference/rectilinear-stroke.rgb24.ref.png | Bin 172 -> 0 bytes + test/reference/rectilinear-stroke.traps.argb32.ref.png | Bin 172 -> 0 bytes + test/reference/rectilinear-stroke.traps.rgb24.ref.png | Bin 172 -> 0 bytes + test/reference/rel-path.mask.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/rgb24-ignore-alpha.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/rgb24-ignore-alpha.mask.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/rgb24-ignore-alpha.mask.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/rgb24-ignore-alpha.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/rgb24-ignore-alpha.traps.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/rgb24-ignore-alpha.traps.rgb24.ref.png | Bin 97 -> 0 bytes + ...rotate-clip-image-surface-paint.mask.argb32.ref.png | Bin 331 -> 0 bytes + .../rotate-clip-image-surface-paint.mask.rgb24.ref.png | Bin 331 -> 0 bytes + .../rotate-image-surface-paint.argb32.ref.png | Bin 220 -> 0 bytes + .../rotate-image-surface-paint.mask.argb32.ref.png | Bin 220 -> 0 bytes + .../rotate-image-surface-paint.mask.rgb24.ref.png | Bin 220 -> 0 bytes + .../reference/rotate-image-surface-paint.rgb24.ref.png | Bin 220 -> 0 bytes + .../rotate-image-surface-paint.traps.argb32.ref.png | Bin 220 -> 0 bytes + .../rotate-image-surface-paint.traps.rgb24.ref.png | Bin 220 -> 0 bytes + ...ate-image-surface-paint.xlib-fallback.rgb24.ref.png | Bin 220 -> 0 bytes + ...otate-image-surface-paint.xlib-window.rgb24.ref.png | Bin 220 -> 0 bytes + .../rounded-rectangle-fill.mask.argb32.ref.png | Bin 787 -> 0 bytes + .../rounded-rectangle-fill.mask.rgb24.ref.png | Bin 787 -> 0 bytes + .../scale-down-source-surface-paint.argb32.ref.png | Bin 96 -> 0 bytes + ...scale-down-source-surface-paint.mask.argb32.ref.png | Bin 96 -> 0 bytes + .../scale-down-source-surface-paint.mask.rgb24.ref.png | Bin 96 -> 0 bytes + .../scale-down-source-surface-paint.rgb24.ref.png | Bin 96 -> 0 bytes + ...cale-down-source-surface-paint.traps.argb32.ref.png | Bin 96 -> 0 bytes + ...scale-down-source-surface-paint.traps.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/scale-offset-image.mask.argb32.ref.png | Bin 9748 -> 0 bytes + test/reference/scale-offset-image.mask.rgb24.ref.png | Bin 9748 -> 0 bytes + .../reference/scale-offset-similar.mask.argb32.ref.png | Bin 9748 -> 0 bytes + test/reference/scale-offset-similar.mask.rgb24.ref.png | Bin 9748 -> 0 bytes + .../scale-source-surface-paint.argb32.ref.png | Bin 128 -> 0 bytes + .../scale-source-surface-paint.mask.argb32.ref.png | Bin 128 -> 0 bytes + .../scale-source-surface-paint.mask.rgb24.ref.png | Bin 117 -> 0 bytes + .../scale-source-surface-paint.traps.argb32.ref.png | Bin 128 -> 0 bytes + .../scale-source-surface-paint.traps.rgb24.ref.png | Bin 117 -> 0 bytes + test/reference/select-font-face.mask.argb32.ref.png | Bin 2250 -> 0 bytes + test/reference/select-font-face.mask.rgb24.ref.png | Bin 2250 -> 0 bytes + test/reference/select-font-face.traps.argb32.ref.png | Bin 2250 -> 0 bytes + test/reference/select-font-face.traps.rgb24.ref.png | Bin 2250 -> 0 bytes + test/reference/self-copy.mask.argb32.ref.png | Bin 257 -> 0 bytes + test/reference/self-copy.mask.rgb24.ref.png | Bin 257 -> 0 bytes + test/reference/self-intersecting.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/self-intersecting.mask.argb32.ref.png | Bin 168 -> 0 bytes + test/reference/self-intersecting.mask.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/self-intersecting.rgb24.ref.png | Bin 168 -> 0 bytes + test/reference/set-source.argb32.ref.png | Bin 101 -> 0 bytes + test/reference/set-source.mask.argb32.ref.png | Bin 101 -> 0 bytes + test/reference/set-source.mask.rgb24.ref.png | Bin 101 -> 0 bytes + test/reference/set-source.traps.argb32.ref.png | Bin 101 -> 0 bytes + test/reference/set-source.traps.rgb24.ref.png | Bin 101 -> 0 bytes + .../reference/shape-general-convex.mask.argb32.ref.png | Bin 2742 -> 0 bytes + test/reference/shape-general-convex.mask.rgb24.ref.png | Bin 2742 -> 0 bytes + test/reference/shape-sierpinski.mask.argb32.ref.png | Bin 63714 -> 0 bytes + test/reference/shape-sierpinski.mask.rgb24.ref.png | Bin 63714 -> 0 bytes + test/reference/show-glyphs-advance.mask.argb32.ref.png | Bin 1394 -> 0 bytes + test/reference/show-glyphs-advance.mask.rgb24.ref.png | Bin 1394 -> 0 bytes + .../reference/show-glyphs-advance.traps.argb32.ref.png | Bin 1394 -> 0 bytes + test/reference/show-glyphs-advance.traps.rgb24.ref.png | Bin 1394 -> 0 bytes + test/reference/show-glyphs-many.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/show-glyphs-many.mask.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/show-glyphs-many.mask.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/show-glyphs-many.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/show-glyphs-many.traps.argb32.ref.png | Bin 96 -> 0 bytes + test/reference/show-glyphs-many.traps.rgb24.ref.png | Bin 96 -> 0 bytes + .../show-text-current-point.mask.argb32.ref.png | Bin 2151 -> 0 bytes + .../show-text-current-point.mask.rgb24.ref.png | Bin 2151 -> 0 bytes + .../show-text-current-point.traps.argb32.ref.png | Bin 2151 -> 0 bytes + .../show-text-current-point.traps.rgb24.ref.png | Bin 2151 -> 0 bytes + test/reference/skew-extreme.mask.argb32.ref.png | Bin 799 -> 0 bytes + test/reference/skew-extreme.mask.rgb24.ref.png | Bin 799 -> 0 bytes + test/reference/smask-fill.mask.argb32.ref.png | Bin 1197 -> 0 bytes + test/reference/smask-fill.mask.rgb24.ref.png | Bin 1197 -> 0 bytes + test/reference/smask-image-mask.mask.argb32.ref.png | Bin 619 -> 0 bytes + test/reference/smask-image-mask.mask.rgb24.ref.png | Bin 619 -> 0 bytes + test/reference/smask-image-mask.traps.argb32.ref.png | Bin 619 -> 0 bytes + test/reference/smask-image-mask.traps.rgb24.ref.png | Bin 619 -> 0 bytes + .../smask-image-mask.xlib-fallback.rgb24.ref.png | Bin 619 -> 0 bytes + .../smask-image-mask.xlib-window.rgb24.ref.png | Bin 619 -> 0 bytes + test/reference/smask-mask.mask.argb32.ref.png | Bin 2353 -> 0 bytes + test/reference/smask-mask.mask.rgb24.ref.png | Bin 2353 -> 0 bytes + test/reference/smask-mask.traps.argb32.ref.png | Bin 2353 -> 0 bytes + test/reference/smask-mask.traps.rgb24.ref.png | Bin 2353 -> 0 bytes + test/reference/smask-paint.mask.argb32.ref.png | Bin 2469 -> 0 bytes + test/reference/smask-paint.mask.rgb24.ref.png | Bin 2469 -> 0 bytes + test/reference/smask-paint.traps.argb32.ref.png | Bin 2469 -> 0 bytes + test/reference/smask-paint.traps.rgb24.ref.png | Bin 2469 -> 0 bytes + test/reference/smask-stroke.mask.argb32.ref.png | Bin 1709 -> 0 bytes + test/reference/smask-stroke.mask.rgb24.ref.png | Bin 1709 -> 0 bytes + test/reference/smask-text.traps.argb32.ref.png | Bin 1661 -> 0 bytes + test/reference/smask-text.traps.rgb24.ref.png | Bin 1661 -> 0 bytes + test/reference/smask.traps.argb32.ref.png | Bin 3393 -> 0 bytes + test/reference/smask.traps.rgb24.ref.png | Bin 3393 -> 0 bytes + .../solid-pattern-cache-stress.argb32.ref.png | Bin 87 -> 0 bytes + .../solid-pattern-cache-stress.mask.argb32.ref.png | Bin 87 -> 0 bytes + .../solid-pattern-cache-stress.mask.rgb24.ref.png | Bin 87 -> 0 bytes + .../reference/solid-pattern-cache-stress.rgb24.ref.png | Bin 87 -> 0 bytes + .../solid-pattern-cache-stress.traps.argb32.ref.png | Bin 87 -> 0 bytes + .../solid-pattern-cache-stress.traps.rgb24.ref.png | Bin 87 -> 0 bytes + test/reference/source-clip-scale.argb32.ref.png | Bin 136 -> 0 bytes + test/reference/source-clip-scale.mask.argb32.ref.png | Bin 136 -> 0 bytes + test/reference/source-clip-scale.mask.rgb24.ref.png | Bin 136 -> 0 bytes + test/reference/source-clip-scale.rgb24.ref.png | Bin 136 -> 0 bytes + test/reference/source-clip-scale.traps.argb32.ref.png | Bin 136 -> 0 bytes + test/reference/source-clip-scale.traps.rgb24.ref.png | Bin 136 -> 0 bytes + test/reference/source-clip.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/source-clip.mask.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/source-clip.mask.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/source-clip.rgb24.ref.png | Bin 111 -> 0 bytes + test/reference/source-clip.traps.argb32.ref.png | Bin 111 -> 0 bytes + test/reference/source-clip.traps.rgb24.ref.png | Bin 111 -> 0 bytes + .../source-surface-scale-paint.argb32.ref.png | Bin 120 -> 0 bytes + .../source-surface-scale-paint.mask.argb32.ref.png | Bin 120 -> 0 bytes + .../source-surface-scale-paint.mask.rgb24.ref.png | Bin 114 -> 0 bytes + .../source-surface-scale-paint.traps.argb32.ref.png | Bin 120 -> 0 bytes + .../source-surface-scale-paint.traps.rgb24.ref.png | Bin 114 -> 0 bytes + .../reference/spline-decomposition.mask.argb32.ref.png | Bin 19520 -> 0 bytes + test/reference/spline-decomposition.mask.rgb24.ref.png | Bin 19520 -> 0 bytes + test/reference/stride-12-image.argb32.ref.png | Bin 81121 -> 0 bytes + test/reference/stride-12-image.mask.argb32.ref.png | Bin 81121 -> 0 bytes + test/reference/stride-12-image.mask.rgb24.ref.png | Bin 81121 -> 0 bytes + test/reference/stride-12-image.rgb24.ref.png | Bin 81121 -> 0 bytes + test/reference/stride-12-image.traps.argb32.ref.png | Bin 81121 -> 0 bytes + test/reference/stride-12-image.traps.rgb24.ref.png | Bin 81121 -> 0 bytes + test/reference/stroke-image.mask.argb32.ref.png | Bin 1424 -> 0 bytes + test/reference/stroke-image.mask.rgb24.ref.png | Bin 1424 -> 0 bytes + test/reference/stroke-open-box.argb32.ref.png | Bin 148 -> 0 bytes + test/reference/stroke-open-box.mask.argb32.ref.png | Bin 148 -> 0 bytes + test/reference/stroke-open-box.mask.rgb24.ref.png | Bin 148 -> 0 bytes + test/reference/stroke-open-box.rgb24.ref.png | Bin 148 -> 0 bytes + test/reference/stroke-open-box.traps.argb32.ref.png | Bin 148 -> 0 bytes + test/reference/stroke-open-box.traps.rgb24.ref.png | Bin 148 -> 0 bytes + test/reference/stroke-pattern.mask.argb32.ref.png | Bin 1491 -> 0 bytes + test/reference/stroke-pattern.mask.rgb24.ref.png | Bin 1491 -> 0 bytes + test/reference/stroke-pattern.traps.argb32.ref.png | Bin 1487 -> 0 bytes + test/reference/stroke-pattern.traps.rgb24.ref.png | Bin 1487 -> 0 bytes + test/reference/subsurface-image-repeat.argb32.ref.png | Bin 915 -> 0 bytes + .../subsurface-image-repeat.mask.argb32.ref.png | Bin 915 -> 0 bytes + .../subsurface-image-repeat.mask.rgb24.ref.png | Bin 915 -> 0 bytes + test/reference/subsurface-image-repeat.rgb24.ref.png | Bin 915 -> 0 bytes + .../subsurface-image-repeat.traps.argb32.ref.png | Bin 915 -> 0 bytes + .../subsurface-image-repeat.traps.rgb24.ref.png | Bin 915 -> 0 bytes + ...subsurface-image-repeat.xlib-fallback.rgb24.ref.png | Bin 915 -> 0 bytes + .../subsurface-image-repeat.xlib-window.rgb24.ref.png | Bin 915 -> 0 bytes + test/reference/subsurface-modify-child.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-child.mask.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-child.mask.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-modify-child.rgb24.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-child.traps.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-child.traps.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-modify-parent.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-parent.mask.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-parent.mask.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-modify-parent.rgb24.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-parent.traps.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-modify-parent.traps.rgb24.ref.png | Bin 197 -> 0 bytes + .../subsurface-outside-target.mask.argb32.ref.png | Bin 2063 -> 0 bytes + .../subsurface-outside-target.mask.rgb24.ref.png | Bin 1648 -> 0 bytes + .../subsurface-outside-target.traps.argb32.ref.png | Bin 2063 -> 0 bytes + .../subsurface-outside-target.traps.rgb24.ref.png | Bin 1648 -> 0 bytes + test/reference/subsurface-pad.argb32.ref.png | Bin 181 -> 0 bytes + test/reference/subsurface-pad.mask.argb32.ref.png | Bin 181 -> 0 bytes + test/reference/subsurface-pad.mask.rgb24.ref.png | Bin 181 -> 0 bytes + test/reference/subsurface-pad.rgb24.ref.png | Bin 181 -> 0 bytes + test/reference/subsurface-pad.traps.argb32.ref.png | Bin 181 -> 0 bytes + test/reference/subsurface-pad.traps.rgb24.ref.png | Bin 181 -> 0 bytes + test/reference/subsurface-reflect.argb32.ref.png | Bin 210 -> 0 bytes + test/reference/subsurface-reflect.mask.argb32.ref.png | Bin 210 -> 0 bytes + test/reference/subsurface-reflect.mask.rgb24.ref.png | Bin 210 -> 0 bytes + test/reference/subsurface-reflect.rgb24.ref.png | Bin 210 -> 0 bytes + test/reference/subsurface-reflect.traps.argb32.ref.png | Bin 210 -> 0 bytes + test/reference/subsurface-reflect.traps.rgb24.ref.png | Bin 210 -> 0 bytes + test/reference/subsurface-repeat.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-repeat.mask.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-repeat.mask.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-repeat.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-repeat.traps.argb32.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-repeat.traps.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-scale.mask.argb32.ref.png | Bin 5921 -> 0 bytes + test/reference/subsurface-scale.mask.rgb24.ref.png | Bin 5921 -> 0 bytes + .../reference/subsurface-similar-repeat.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-similar-repeat.mask.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-similar-repeat.mask.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface-similar-repeat.rgb24.ref.png | Bin 197 -> 0 bytes + .../subsurface-similar-repeat.traps.argb32.ref.png | Bin 197 -> 0 bytes + .../subsurface-similar-repeat.traps.rgb24.ref.png | Bin 197 -> 0 bytes + test/reference/subsurface.mask.argb32.ref.png | Bin 1811 -> 0 bytes + test/reference/subsurface.mask.rgb24.ref.png | Bin 1811 -> 0 bytes + .../surface-pattern-big-scale-down.argb32.ref.png | Bin 191 -> 0 bytes + .../surface-pattern-big-scale-down.mask.argb32.ref.png | Bin 191 -> 0 bytes + .../surface-pattern-big-scale-down.mask.rgb24.ref.png | Bin 191 -> 0 bytes + .../surface-pattern-big-scale-down.rgb24.ref.png | Bin 191 -> 0 bytes + ...surface-pattern-big-scale-down.traps.argb32.ref.png | Bin 191 -> 0 bytes + .../surface-pattern-big-scale-down.traps.rgb24.ref.png | Bin 191 -> 0 bytes + .../surface-pattern-operator.mask.argb32.ref.png | Bin 5217 -> 0 bytes + .../surface-pattern-operator.mask.rgb24.ref.png | Bin 1942 -> 0 bytes + ...rface-pattern-scale-down-extend-none.argb32.ref.png | Bin 329 -> 0 bytes + ...-pattern-scale-down-extend-none.mask.argb32.ref.png | Bin 329 -> 0 bytes + ...e-pattern-scale-down-extend-none.mask.rgb24.ref.png | Bin 329 -> 0 bytes + ...urface-pattern-scale-down-extend-none.rgb24.ref.png | Bin 329 -> 0 bytes + ...pattern-scale-down-extend-none.traps.argb32.ref.png | Bin 329 -> 0 bytes + ...-pattern-scale-down-extend-none.traps.rgb24.ref.png | Bin 329 -> 0 bytes + ...urface-pattern-scale-down-extend-pad.argb32.ref.png | Bin 320 -> 0 bytes + ...e-pattern-scale-down-extend-pad.mask.argb32.ref.png | Bin 320 -> 0 bytes + ...ce-pattern-scale-down-extend-pad.mask.rgb24.ref.png | Bin 320 -> 0 bytes + ...surface-pattern-scale-down-extend-pad.rgb24.ref.png | Bin 320 -> 0 bytes + ...-pattern-scale-down-extend-pad.traps.argb32.ref.png | Bin 320 -> 0 bytes + ...e-pattern-scale-down-extend-pad.traps.rgb24.ref.png | Bin 320 -> 0 bytes + ...ce-pattern-scale-down-extend-reflect.argb32.ref.png | Bin 328 -> 0 bytes + ...ttern-scale-down-extend-reflect.mask.argb32.ref.png | Bin 328 -> 0 bytes + ...attern-scale-down-extend-reflect.mask.rgb24.ref.png | Bin 328 -> 0 bytes + ...ace-pattern-scale-down-extend-reflect.rgb24.ref.png | Bin 328 -> 0 bytes + ...tern-scale-down-extend-reflect.traps.argb32.ref.png | Bin 328 -> 0 bytes + ...ttern-scale-down-extend-reflect.traps.rgb24.ref.png | Bin 328 -> 0 bytes + ...ace-pattern-scale-down-extend-repeat.argb32.ref.png | Bin 330 -> 0 bytes + ...attern-scale-down-extend-repeat.mask.argb32.ref.png | Bin 330 -> 0 bytes + ...pattern-scale-down-extend-repeat.mask.rgb24.ref.png | Bin 330 -> 0 bytes + ...face-pattern-scale-down-extend-repeat.rgb24.ref.png | Bin 330 -> 0 bytes + ...ttern-scale-down-extend-repeat.traps.argb32.ref.png | Bin 330 -> 0 bytes + ...attern-scale-down-extend-repeat.traps.rgb24.ref.png | Bin 330 -> 0 bytes + .../surface-pattern-scale-down.mask.argb32.ref.png | Bin 1326 -> 0 bytes + .../surface-pattern-scale-down.mask.rgb24.ref.png | Bin 1326 -> 0 bytes + .../surface-pattern-scale-down.traps.argb32.ref.png | Bin 1326 -> 0 bytes + .../surface-pattern-scale-down.traps.rgb24.ref.png | Bin 1326 -> 0 bytes + .../surface-pattern-scale-up.mask.argb32.ref.png | Bin 4020 -> 0 bytes + .../surface-pattern-scale-up.mask.rgb24.ref.png | Bin 4020 -> 0 bytes + .../surface-pattern-scale-up.traps.argb32.ref.png | Bin 4020 -> 0 bytes + .../surface-pattern-scale-up.traps.rgb24.ref.png | Bin 4020 -> 0 bytes + test/reference/surface-pattern.mask.argb32.ref.png | Bin 11088 -> 0 bytes + test/reference/surface-pattern.mask.rgb24.ref.png | Bin 11088 -> 0 bytes + test/reference/surface-pattern.traps.argb32.ref.png | Bin 11088 -> 0 bytes + test/reference/surface-pattern.traps.rgb24.ref.png | Bin 11088 -> 0 bytes + test/reference/svg-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/svg-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/svg-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/svg-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/text-antialias-gray.mask.argb32.ref.png | Bin 966 -> 0 bytes + test/reference/text-antialias-gray.mask.rgb24.ref.png | Bin 966 -> 0 bytes + .../reference/text-antialias-gray.traps.argb32.ref.png | Bin 966 -> 0 bytes + test/reference/text-antialias-gray.traps.rgb24.ref.png | Bin 966 -> 0 bytes + test/reference/text-antialias-none.argb32.ref.png | Bin 265 -> 0 bytes + test/reference/text-antialias-none.mask.argb32.ref.png | Bin 265 -> 0 bytes + test/reference/text-antialias-none.mask.rgb24.ref.png | Bin 265 -> 0 bytes + test/reference/text-antialias-none.rgb24.ref.png | Bin 265 -> 0 bytes + .../reference/text-antialias-none.traps.argb32.ref.png | Bin 265 -> 0 bytes + test/reference/text-antialias-none.traps.ref.png | Bin 265 -> 0 bytes + test/reference/text-antialias-none.traps.rgb24.ref.png | Bin 265 -> 0 bytes + .../text-antialias-subpixel-bgr.traps.argb32.ref.png | Bin 1005 -> 0 bytes + .../text-antialias-subpixel-bgr.traps.rgb24.ref.png | Bin 1005 -> 0 bytes + .../text-antialias-subpixel-rgb.traps.argb32.ref.png | Bin 1013 -> 0 bytes + .../text-antialias-subpixel-rgb.traps.rgb24.ref.png | Bin 1013 -> 0 bytes + .../text-antialias-subpixel-vbgr.traps.argb32.ref.png | Bin 985 -> 0 bytes + .../text-antialias-subpixel-vbgr.traps.rgb24.ref.png | Bin 985 -> 0 bytes + .../text-antialias-subpixel-vrgb.traps.argb32.ref.png | Bin 1009 -> 0 bytes + .../text-antialias-subpixel-vrgb.traps.rgb24.ref.png | Bin 1009 -> 0 bytes + .../text-antialias-subpixel.traps.argb32.ref.png | Bin 1013 -> 0 bytes + .../text-antialias-subpixel.traps.rgb24.ref.png | Bin 1013 -> 0 bytes + test/reference/text-glyph-range.mask.argb32.ref.png | Bin 1928 -> 0 bytes + test/reference/text-glyph-range.mask.rgb24.ref.png | Bin 1928 -> 0 bytes + test/reference/text-glyph-range.traps.argb32.ref.png | Bin 1979 -> 0 bytes + test/reference/text-glyph-range.traps.rgb24.ref.png | Bin 1979 -> 0 bytes + test/reference/text-pattern.mask.argb32.ref.png | Bin 3455 -> 0 bytes + test/reference/text-pattern.mask.rgb24.ref.png | Bin 2684 -> 0 bytes + test/reference/text-rotate.traps.argb32.ref.png | Bin 16597 -> 0 bytes + test/reference/text-rotate.traps.rgb24.ref.png | Bin 16597 -> 0 bytes + test/reference/text-transform.argb32.ref.png | Bin 5579 -> 0 bytes + test/reference/text-transform.mask.argb32.ref.png | Bin 5579 -> 0 bytes + test/reference/text-transform.mask.rgb24.ref.png | Bin 5579 -> 0 bytes + test/reference/text-transform.rgb24.ref.png | Bin 5579 -> 0 bytes + test/reference/text-transform.traps.argb32.ref.png | Bin 5579 -> 0 bytes + test/reference/text-transform.traps.rgb24.ref.png | Bin 5579 -> 0 bytes + test/reference/tiger.mask.argb32.ref.png | Bin 93916 -> 0 bytes + test/reference/tiger.mask.rgb24.ref.png | Bin 93916 -> 0 bytes + test/reference/transforms.mask.argb32.ref.png | Bin 348 -> 0 bytes + test/reference/transforms.mask.rgb24.ref.png | Bin 348 -> 0 bytes + test/reference/translate-show-surface.argb32.ref.png | Bin 96 -> 0 bytes + .../translate-show-surface.mask.argb32.ref.png | Bin 96 -> 0 bytes + .../translate-show-surface.mask.rgb24.ref.png | Bin 96 -> 0 bytes + test/reference/translate-show-surface.rgb24.ref.png | Bin 96 -> 0 bytes + .../translate-show-surface.traps.argb32.ref.png | Bin 96 -> 0 bytes + .../translate-show-surface.traps.rgb24.ref.png | Bin 96 -> 0 bytes + .../reference/twin-antialias-mixed.mask.argb32.ref.png | Bin 2230 -> 0 bytes + test/reference/twin-antialias-mixed.mask.rgb24.ref.png | Bin 2230 -> 0 bytes + test/reference/twin-antialias-none.mask.argb32.ref.png | Bin 690 -> 0 bytes + test/reference/twin-antialias-none.mask.rgb24.ref.png | Bin 690 -> 0 bytes + test/reference/unaligned-box.argb32.ref.png | Bin 496 -> 0 bytes + test/reference/unaligned-box.mask.argb32.ref.png | Bin 496 -> 0 bytes + test/reference/unaligned-box.mask.rgb24.ref.png | Bin 496 -> 0 bytes + test/reference/unaligned-box.rgb24.ref.png | Bin 496 -> 0 bytes + test/reference/unantialiased-shapes.argb32.ref.png | Bin 3926 -> 0 bytes + .../reference/unantialiased-shapes.mask.argb32.ref.png | Bin 3926 -> 0 bytes + test/reference/unantialiased-shapes.mask.rgb24.ref.png | Bin 3926 -> 0 bytes + test/reference/unantialiased-shapes.rgb24.ref.png | Bin 3926 -> 0 bytes + test/reference/unclosed-strokes.mask.argb32.ref.png | Bin 1901 -> 0 bytes + test/reference/unclosed-strokes.mask.rgb24.ref.png | Bin 1901 -> 0 bytes + test/reference/user-font-mask.argb32.ref.png | Bin 5476 -> 0 bytes + test/reference/user-font-mask.mask.argb32.ref.png | Bin 5476 -> 0 bytes + test/reference/user-font-mask.mask.rgb24.ref.png | Bin 5476 -> 0 bytes + test/reference/user-font-mask.rgb24.ref.png | Bin 5476 -> 0 bytes + test/reference/user-font-mask.traps.argb32.ref.png | Bin 5476 -> 0 bytes + test/reference/user-font-mask.traps.rgb24.ref.png | Bin 5476 -> 0 bytes + test/reference/user-font-proxy.mask.argb32.ref.png | Bin 16941 -> 0 bytes + test/reference/user-font-proxy.mask.rgb24.ref.png | Bin 16941 -> 0 bytes + test/reference/user-font-proxy.traps.argb32.ref.png | Bin 16854 -> 0 bytes + test/reference/user-font-proxy.traps.rgb24.ref.png | Bin 16854 -> 0 bytes + test/reference/user-font-rescale.mask.argb32.ref.png | Bin 14883 -> 0 bytes + test/reference/user-font-rescale.mask.rgb24.ref.png | Bin 14883 -> 0 bytes + test/reference/user-font-rescale.traps.argb32.ref.png | Bin 14883 -> 0 bytes + test/reference/user-font-rescale.traps.rgb24.ref.png | Bin 14883 -> 0 bytes + test/reference/white-in-noop.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/white-in-noop.mask.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/white-in-noop.mask.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/white-in-noop.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/white-in-noop.traps.argb32.ref.png | Bin 95 -> 0 bytes + test/reference/white-in-noop.traps.rgb24.ref.png | Bin 95 -> 0 bytes + test/reference/world-map-fill.mask.argb32.ref.png | Bin 57308 -> 0 bytes + test/reference/world-map-fill.mask.rgb24.ref.png | Bin 57308 -> 0 bytes + test/reference/xcb-huge-image-shm.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-huge-image-shm.mask.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-huge-image-shm.mask.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-huge-image-shm.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-huge-image-shm.traps.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-huge-image-shm.traps.rgb24.ref.png | Bin 97 -> 0 bytes + .../xcb-huge-image-shm.xlib-fallback.rgb24.ref.png | Bin 97 -> 0 bytes + .../xcb-huge-image-shm.xlib-window.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-snapshot-assert.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-snapshot-assert.mask.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-snapshot-assert.mask.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-snapshot-assert.rgb24.ref.png | Bin 97 -> 0 bytes + .../reference/xcb-snapshot-assert.traps.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-snapshot-assert.traps.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-stress-cache.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-stress-cache.mask.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-stress-cache.mask.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-stress-cache.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-stress-cache.traps.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-stress-cache.traps.rgb24.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/xcb-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/xcb-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/xcb-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/xcomposite-projection.argb32.ref.png | Bin 1108 -> 0 bytes + test/reference/xcomposite-projection.rgb24.ref.png | Bin 1108 -> 0 bytes + test/reference/xlib-expose-event.argb32.ref.png | Bin 40717 -> 0 bytes + test/reference/xlib-expose-event.mask.argb32.ref.png | Bin 40717 -> 0 bytes + test/reference/xlib-expose-event.mask.rgb24.ref.png | Bin 40717 -> 0 bytes + test/reference/xlib-expose-event.rgb24.ref.png | Bin 40717 -> 0 bytes + test/reference/xlib-expose-event.traps.argb32.ref.png | Bin 40717 -> 0 bytes + test/reference/xlib-expose-event.traps.rgb24.ref.png | Bin 40717 -> 0 bytes + test/reference/xlib-surface-source.mask.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/xlib-surface-source.mask.rgb24.ref.png | Bin 301 -> 0 bytes + .../reference/xlib-surface-source.traps.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/xlib-surface-source.traps.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/zero-alpha.argb32.ref.png | Bin 91 -> 0 bytes + test/reference/zero-alpha.mask.argb32.ref.png | Bin 91 -> 0 bytes + test/reference/zero-alpha.mask.rgb24.ref.png | Bin 91 -> 0 bytes + test/reference/zero-alpha.rgb24.ref.png | Bin 91 -> 0 bytes + test/reference/zero-alpha.traps.argb32.ref.png | Bin 91 -> 0 bytes + test/reference/zero-alpha.traps.rgb24.ref.png | Bin 91 -> 0 bytes + test/reference/zero-mask.argb32.ref.png | Bin 402 -> 0 bytes + test/reference/zero-mask.mask.argb32.ref.png | Bin 402 -> 0 bytes + test/reference/zero-mask.mask.rgb24.ref.png | Bin 382 -> 0 bytes + test/reference/zero-mask.traps.argb32.ref.png | Bin 402 -> 0 bytes + test/reference/zero-mask.traps.rgb24.ref.png | Bin 382 -> 0 bytes + 1477 files changed, 0 insertions(+), 0 deletions(-) + +commit 33895904d52f47d0d89156ca1e1ff7cc8f5887d2 +Author: Bryce W. Harrington +Date: Wed Jul 3 22:37:41 2013 +0000 + + test: Add special cases for create-from-png and fallback-resolution + + These tests use reference images somewhat differently from other tests, + so treat them as special cases and avoid recommending deleting any of + their files. + + Add TODO's to each test to rework them to be more consistent with other + tests. + + Signed-off-by: Bryce Harrington + + test/check-refs.sh | 10 ++++++++++ + test/create-from-png.c | 5 +++++ + test/fallback-resolution.c | 1 + + 3 files changed, 16 insertions(+) + +commit 5577223489dc3f6e282c498d70f66f8ee9327474 +Author: Bryce W. Harrington +Date: Wed Jul 3 22:37:00 2013 +0000 + + pdiff: Drop unused variable + + Fixes: + perceptualdiff.c:35:24: warning: unused variable ‘dim’ + [-Wunused-variable] + + Signed-off-by: Bryce Harrington + Signed-off-by: Bryce Harrington + + test/pdiff/perceptualdiff.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 319b8935826c8726b8c23f1c746a82b261b8cde1 +Author: Bryce W. Harrington +Date: Wed Jul 3 22:36:28 2013 +0000 + + pdiff: Quell warning about signed/unsigned comparisons + + perceptualdiff.c:55:19: warning: comparison between signed and unsigned + integer expressions [-Wsign-compare] + perceptualdiff.c:60:16: warning: comparison between signed and unsigned + integer expressions [-Wsign-compare] + + Signed-off-by: Bryce Harrington + + test/pdiff/perceptualdiff.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9e4cac50c25cec0476413a991d98c897fce0aceb +Author: Bryce W. Harrington +Date: Wed Jul 3 22:35:47 2013 +0000 + + test: Make check-ref-dups utilize perceptualdiff for comparisons + + The current sha1sum-based file checker does a blanket comparison of all + files with each other, which is fast but not directly helpful since it + doesn't distinguish between sibling files (which are allowable to be + duplicates). Also, it ignores files that may have byte differences + (such as PNG header differences) but are otherwise pixel-identical. + + This patch replaces the sha1sum-based checker with one that accounts for + the default fallback path and uses perceptualdiff to compare files that + are bytewise different and verify whether they actually are different. + + The intention is that the output of this command can be directly used to + remove redundant files, e.g.: + + cd test + make check-ref-dups | cut -d' ' -f2 | \ + while read f; do git rm "reference/$f"; done + + This should have no impact on make check's results (modulo any tests + that behave erratically), and will help trim down the size of the + tarball. + + Signed-off-by: Bryce Harrington + [ickle: rebase and add the suggested command to the Makefile] + + test/Makefile.am | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 8d3c518e9db39b670fe89c4bf097871e1cf16955 +Author: Bryce W. Harrington +Date: Wed Jul 3 22:35:08 2013 +0000 + + test: Use cmp to catch byte-by-byte identical files + + cmp runs faster than perceptualdiff, and catches files that are exact + copies of the reference image. We still use perceptualdiff for catching + files that aren't bytewise identical, but are still identical at the + pixel level. + + Signed-off-by: Bryce Harrington + + test/check-refs.sh | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit b0be0d8d42b5b6ba80e59a869a8f72fd8556e91e +Author: Bryce W. Harrington +Date: Wed Jul 3 22:33:57 2013 +0000 + + test: Add script to check for redundant reference images + + This script requires the perceptualdiff program, which can be built as + follows: + + cd test/pdiff && make perceptualdiff + + The script's output provides a list of target-specific or + format-specific images that are identical to their more generic + reference files, and thus are redundant and can be safely removed from + the archive without altering any test behaviors. + + Signed-off-by: Bryce Harrington + [ickle: applied Behdad's suggestion of renaming the script check-refs.sh] + + test/Makefile.am | 1 + + test/check-refs.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+) + +commit 7f1be42e85589ee07dacead012234c1a1eb1b395 +Author: Bryce W. Harrington +Date: Wed Jul 3 22:32:34 2013 +0000 + + test: Fix make check-ref-dups due to move of ref images to reference/ + + The check-ref-dups target in Makefile.am was not updated with the new + path when the reference images were moved from test/ to + test/reference/. Now it produces output properly again. + + Signed-off-by: Bryce Harrington + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7b8fc77bb974fbd4fbc697405a8b6aec748bb7f2 +Author: Eric Anholt +Date: Mon Jun 24 23:28:47 2013 -0700 + + gl: Move glGetUniformLocation to shader compile time. + + The lookup of the string names has significant overhead, which is why GL + gives you glGetUniformLocation so that you reference uniforms by + constant integers in your high performance path. + + Reduces cairo-perf-trace runtime of firefox-planet-gnome by 1.06767% +/- + 0.289265% (n=72) on my IVB macbook air. + + Signed-off-by: Eric Anholt + Reviewed-by: Chris Wilson + + src/cairo-gl-composite.c | 2 +- + src/cairo-gl-operand.c | 30 ++++++++-------------- + src/cairo-gl-private.h | 19 +++++++++----- + src/cairo-gl-shaders.c | 67 +++++++++++++++++++++++++++++++++--------------- + 4 files changed, 70 insertions(+), 48 deletions(-) + +commit 4d9439132de85c0f0f4d5b5a474ea7164910251e +Author: Chris Wilson +Date: Fri Jun 21 20:18:40 2013 +0100 + + check: Fix check-def.sh for variations in GCC's linker + + We now need to exclude bss and data sections from the symbol list. + + Signed-off-by: Chris Wilson + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7b80613d6d483cdfd5d0c6311de0f8586092b408 +Author: Chris Wilson +Date: Fri Jun 21 17:30:47 2013 +0100 + + test: Use the highest precision rendering for shapes for generating ref results + + The test-traps and test-base surfaces are used for generating the + reference results, and so they should opt for using the best rendering + paths through the traps- and base-compositors. + + Signed-off-by: Chris Wilson + + src/test-compositor-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 686ebd4a893d2e583d0cf11bd9f77681dbf0b21c +Author: Chris Wilson +Date: Fri Jun 21 16:58:38 2013 +0100 + + cairo-perf-print: Do not free the uninitialised histogram + + Signed-off-by: Chris Wilson + + perf/cairo-perf-print.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 5589e80e2bd6b82e5730cbf6b72aaf82a66b31c0 +Author: Chris Wilson +Date: Fri Jun 21 12:01:32 2013 +0100 + + xml: Handle clip-boxes in the updated cairo_clip_t + + Edward Zimmerman pointed out that the xml surface had bitrotted slightly + and no longer understand the new clip layout - in particular that we can + have clips without a path, but just with boxes instead. + + Signed-off-by: Chris Wilson + + src/cairo-xml-surface.c | 77 +++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 72 insertions(+), 5 deletions(-) + +commit 2bfb9e9001bceaedffb2303c062af8e42045931e +Author: Chris Wilson +Date: Thu Jun 20 20:47:18 2013 +0100 + + svg: Unwrap recording surfaces + + As a first step towards bring SVG uptodate with the various new + patterns, first we need to prevent SVG crashing when it mishandles an + unknown recording surface. + + Signed-off-by: Chris Wilson + + src/cairo-svg-surface.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit b7331f0c52cc64f2c224eac502afa6c50a1a8d8b +Author: Chris Wilson +Date: Thu Jun 20 14:23:15 2013 +0100 + + gstate: Speed up stroked path extents + + We can skip the intermediate evaluation of the trapezoids for + determining the extents of a stroked path by using the relatively new + functions for computing the contours of the stroke. Then we can simply + use the bbox of the points within the contours to retrieve the path + extents - which is already provided by the polygon holding the contours + of the stroke. This provides a faster result with less numerical + inaccuracy due to fewer stages required in the computation + + References: https://bugs.freedesktop.org/show_bug.cgi?id=62375 + Signed-off-by: Chris Wilson + + src/cairo-gstate.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 9ea5993b036f5930179263baaf3162eeebb7c153 +Author: Chris Wilson +Date: Thu Jun 20 14:11:38 2013 +0100 + + test/get-path-extents: Check exact matches within tolerance + + When we refine geometry, we do so to a tolerance as specified by the + user. This means that we can not expect tessellated results to have + exact results, but always they should match within the specified + tolerance. + + Signed-off-by: Chris Wilson + + test/get-path-extents.c | 30 +++++++++++++++++++++--------- + 1 file changed, 21 insertions(+), 9 deletions(-) + +commit e079e4e2297810ceb10798cf310a7fafe39b18f0 +Author: Chris Wilson +Date: Thu Jun 20 14:02:14 2013 +0100 + + image: Mark the data as owned after stealing the snapshot's image + + Victor Goya found that we ended up leaking memory after reading a PNG + into an image surface and drawing that onto a PDF surface. In + particular, he discovered that + + commit 0bfd2acd35547fc2bd0de99cc67d153f0170697d + Author: Chris Wilson + Date: Mon Aug 13 01:34:12 2012 +0100 + + xlib: Implement SHM fallbacks and fast upload paths + + introduced a path to steal the image data for a snapshot (and thereby + avoid a redundant copy), but that path then lead to the leak of the + "owned" data. + + Reported-by: Victor Goya + Signed-off-by: Chris Wilson + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f39eef852491c10dec4089f9fb3d332a712da28c +Author: Chris Wilson +Date: Thu Jun 20 11:11:20 2013 +0100 + + pdf: Fix compiler warning for use of unitialised variable along error path + + cairo-pdf-surface.c: In function '_cairo_pdf_surface_add_source_surface.isra.20': + cairo-pdf-surface.c:1461:10: warning: 'unique_id' may be used uninitialized in this function [-Wmaybe-uninitialized] + + Signed-off-by: Chris Wilson + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 80641f4adc3e2ca16e67110e7b82f42e88efd93e +Author: Chris Wilson +Date: Thu Jun 20 11:09:53 2013 +0100 + + pdf: Improve consistency in use of cairo_int_status_t + + Suppress several compiler warning for mixing + cairo_status_t/cairo_int_status_t enums. + + Signed-off-by: Chris Wilson + + src/cairo-pdf-operators-private.h | 7 +- + src/cairo-pdf-surface.c | 256 ++++++++++++++++---------------- + src/cairo-ps-surface.c | 2 +- + src/cairo-type3-glyph-surface-private.h | 5 +- + 4 files changed, 136 insertions(+), 134 deletions(-) + +commit d4545910e2836eb6fc7dc2ed787b02aea514cb0b +Author: Bryce W. Harrington +Date: Thu Jun 20 03:16:01 2013 +0000 + + test: Note naming scheme for XFAIL images in README + + Signed-off-by: Bryce Harrington + + test/README | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 982f288460591a8f2b8a78db89ae6e5495d2b3b8 +Author: Bryce W. Harrington +Date: Thu Jun 20 03:16:29 2013 +0000 + + gl: Quell warning about incompatible pointer type + + mask is a cairo_surface_t pointer, and is cast to a cairo_gl_surface_t + pointer in the _cairo_gl_surface_draw_image() call. + texture.owns_surface also expects mask to be a cairo_gl_surface_t + pointer, so apply the same cast here as well. + + Fixes the following warning: + + cairo-gl-traps-compositor.c:370:35: warning: assignment from + incompatible pointer type [enabled by default] + + Ref.: 38bf7a65 + + Signed-off-by: Bryce Harrington + + src/cairo-gl-traps-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa764a3bbc3fe43191d877aaec42b73c7d55d040 +Author: Bryce W. Harrington +Date: Thu Jun 20 03:17:38 2013 +0000 + + pdf: Assure compiler that data, data_size will always be initialized + + There are only three possible color states: COLOR, GRAYSCALE, or + MONOCHROME thus data and data_size will always be set to some value, + so assert the default is never reached. + + Fixes these warning: + cairo-pdf-surface.c:2517:32: warning: ‘data_size’ may be used + uninitialized in this function [-Wuninitialized] + cairo-pdf-surface.c:2338:19: note: ‘data_size’ was declared here + cairo-pdf-surface.c:2446:11: warning: ‘data’ may be used uninitialized + in this function [-Wuninitialized] + cairo-pdf-surface.c:2337:11: note: ‘data’ was declared here + + Signed-off-by: Bryce Harrington + + src/cairo-pdf-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 27cb80b84834f7262d70cd1f95dd6e940059f75a +Author: Bryce W. Harrington +Date: Thu Jun 20 03:18:11 2013 +0000 + + type1-subset: Fix typos in function comment + + Signed-off-by: Bryce Harrington + + src/cairo-type1-subset.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit f893acd60df816f3e0282affef6b58f59f84f48a +Author: Bryce W. Harrington +Date: Thu Jun 20 03:18:45 2013 +0000 + + type1-subset: Quell warning about uninitialized array_start + + Since we explicitly set font->subset_subrs to false, there's no way the + warned code will be executed, but perhaps the compiler is confused by + the goto jump. + + Signed-off-by: Bryce Harrington + + src/cairo-type1-subset.c | 1 + + 1 file changed, 1 insertion(+) + +commit 519dff51db30e157f52ef5244a3afeea06340ff8 +Author: Chris Wilson +Date: Tue Jun 18 16:06:28 2013 +0100 + + scaled-font: Prevent a recursive mutex lock for removing a failed glyph + + If we fail to create a glyph, and it is the only one in the glyph page, + we then pluck that page out of the global glyph cache. The cache destroy + callback tries to take the scaled_font lock again, causing a lockup. + Rework the error path to avoid taking that lock in this case - still a + potential lock ordering issue remains. + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit df1ca22ada340add2360677ff892ec043dad96f4 +Author: Chris Wilson +Date: Tue Jun 18 15:46:28 2013 +0100 + + recording: Prevent invalid memory access with zero length command array + + If we try to sort a zero length array, we access invalid memory. + However, for a zero length command array, we can trivially compute the + number of visible indices, 0. + + Signed-off-by: Chris Wilson + + src/cairo-recording-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit c51b850bd836c2bec0a1bcc7b32136dc21bc2360 +Author: Chris Wilson +Date: Tue Jun 11 14:11:45 2013 +0100 + + perf: Remove a debug artifact + + Remove the intentional #error for non-UNIX path used to remind me to fix + up configure.ac. + + Signed-off-by: Chris Wilson + + perf/cairo-perf-print.c | 1 - + 1 file changed, 1 deletion(-) + +commit 2c097e6e6b8375b7d488572cdb09b80dca06d42a +Author: Chris Wilson +Date: Tue Jun 11 11:57:04 2013 +0100 + + perf: Avoid vertically stretching the histogram + + If we have more rows than the max_count in any column, we end up + stretching the histogram vertically, which makes it harder to read. + + Signed-off-by: Chris Wilson + + perf/cairo-stats.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit b9f0ef4496eca31b47296543f48078b2a7034750 +Author: Chris Wilson +Date: Tue Jun 11 11:47:24 2013 +0100 + + perf: Rescale the histogram for the terminal + + If running ./cairo-perf-print in a terminal, query the terminal size and + rescale the histogram to use the maximum available space. + + Signed-off-by: Chris Wilson + + configure.ac | 2 ++ + perf/cairo-perf-print.c | 37 +++++++++++++++++++++++++++++++++++-- + 2 files changed, 37 insertions(+), 2 deletions(-) + +commit 9a12c2e02369f0920c1f1f578eb8d228add77ea1 +Author: Chris Wilson +Date: Tue Jun 11 11:05:03 2013 +0100 + + perf: Rudimentary histogram printing for cairo-perf-print + + If you call ./cairo-perf-print --histogram results.txt, it will then + print a histogram of the results, one per test. Ideally, you should see + a skewed distribution (with a negative skew representing that most results + run in optimal time), but random sampling errors (scheduling, + throttling, general inefficiency etc) will push it more towards a normal + distribution. + + For example, + | x | + | x xx | + | x xx | + | x xx | + | xxxx | + | xxxx x | + | x xxxxxx | + | x xxxxxx | + | xxxxxxxxx | + | xxxxxxxxx | + | xxxxxxxxx | + | xxxxxxxxxxxx | + | xxxxxxxxxxxx | + | xxxxxxxxxxxx | + | xxxxxxxxxxxxxx | + |x xxxxxxxxxxxxxx | + |x x xxxxxxxxxxxxxxx | + |x x xxxxxxxxxxxxxxx | + |x x xxxxxxxxxxxxxxxxx | + |xxx x xxxxxxxxxxxxxxxxxxx | + |xxx xxxxxxxxxxxxxxxxxxxxxxxxx | + |xxxxxx xxxx x x x x xxx xx xxxxx xxx x xxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| + .------------------------------------------------------------------------------. + xlib firefox-fishtank 8298.44 1.53% (829/946) + + Starts off reasonably, but quickly deteriorates as the integrated CPU/GPU + overheats and is forced to throttle. + + Signed-off-by: Chris Wilson + + perf/cairo-perf-print.c | 65 +++++++++++++++++++++++++++++---------- + perf/cairo-perf-report.c | 2 +- + perf/cairo-perf.h | 9 ++++++ + perf/cairo-stats.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-stats.h | 16 ++++++++++ + 5 files changed, 155 insertions(+), 17 deletions(-) + +commit e519d6f9860c7f0bc51f1e8a17505f2dc372c938 +Author: Chris Wilson +Date: Tue Jun 11 10:00:56 2013 +0100 + + recording: Fix inconsistent usage of types for indices + + We were wantonly mixing unsigned/signed integers for our index and + counters, leading to compiler warnings. Be bold, and use unsigned + consistently. + + Signed-off-by: Chris Wilson + + src/cairo-recording-surface-private.h | 4 ++-- + src/cairo-recording-surface.c | 18 +++++++++--------- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit b45c79ff8a8e7c5cf4af1498d854a85c818d9268 +Author: Bryce W. Harrington +Date: Mon Jun 10 19:01:09 2013 +0000 + + image: Quell warning about signed/unsigned int comparison. + + Restore (int) cast that was dropped in e7e1ac23. + + Signed-off-by: Bryce Harrington + + src/cairo-image-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5271f3199107f50f65608f3816c840da7445fb55 +Author: Bryce W. Harrington +Date: Sat Jun 8 01:42:20 2013 +0000 + + test: Fix typo in sample_horizontal to use horizontal, not vertical. + + Triggers the following warning during build: + + sample.c:61:1: warning: ‘horizontal’ defined but not used + [-Wunused-function] + + Signed-off-by: Bryce Harrington + + test/sample.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 17dc312221c294b120bd159e01f5f566c6ec4a2d +Author: Chris Wilson +Date: Wed Jun 5 22:34:52 2013 +0100 + + trace: Improve operand emission + + In particular fixing up a couple of corner cases in emitting the right + instructions for scaled-fonts and patterns. + + Signed-off-by: Chris Wilson + + util/cairo-trace/trace.c | 147 ++++++++++++++++++++++++++++------------------- + 1 file changed, 87 insertions(+), 60 deletions(-) + +commit e34b800214c78ec3d92de505d173fc617cf6220f +Author: Chris Wilson +Date: Tue Jun 4 11:47:07 2013 +0100 + + test: Extend testing of joins for fine lines + + test/caps-joins.c | 55 ++++++++++++++++++++++++++--- + test/reference/caps-joins-05.ref.png | Bin 0 -> 2169 bytes + test/reference/caps-joins-05.traps.ref.png | Bin 0 -> 1714 bytes + test/reference/caps-joins-1.ref.png | Bin 0 -> 2105 bytes + test/reference/caps-joins-1.traps.ref.png | Bin 0 -> 1861 bytes + test/reference/caps-joins-2.ref.png | Bin 0 -> 2046 bytes + test/reference/caps-joins-2.traps.ref.png | Bin 0 -> 1631 bytes + 7 files changed, 51 insertions(+), 4 deletions(-) + +commit a2d852497364afa742518ac0d9feb0466dccc191 +Author: Chris Wilson +Date: Tue Jun 4 11:34:31 2013 +0100 + + test: Expand testing of caps for fine strokes + + test/caps.c | 57 +++++++++++++++++++++++++++++++++-- + test/reference/caps-05.ref.png | Bin 0 -> 1375 bytes + test/reference/caps-05.traps.ref.png | Bin 0 -> 1126 bytes + test/reference/caps-1.ref.png | Bin 0 -> 1457 bytes + test/reference/caps-1.traps.ref.png | Bin 0 -> 1268 bytes + test/reference/caps-2.ref.png | Bin 0 -> 1509 bytes + test/reference/caps-2.traps.ref.png | Bin 0 -> 1231 bytes + 7 files changed, 54 insertions(+), 3 deletions(-) + +commit 85c2a0d76ab109f2bec8f7dccab577033e6d37b0 +Author: Chris Wilson +Date: Mon Jun 3 13:56:00 2013 +0100 + + xlib: Unlike the visual when destroying it + + Otherwise we leave dangling pointers in the visual list, leading to + memory corruption when using low bitdepth servers. + + Signed-off-by: Chris Wilson + + src/cairo-list-inline.h | 8 +++++++- + src/cairo-xlib-visual.c | 3 +++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 41bef0fc385381b8c6b9091ec7ca2abe04cfc147 +Author: Chris Wilson +Date: Thu May 30 20:57:04 2013 +0100 + + traps: Ensure that we correctly clip when using multiple clip boxes + + We need to be more careful when trying to discard a clip to be sure that + it is truly not required. In particular, we need to not throw a way a + clip region when it has more than one box intersecting the mask. + + Reported-by: Alexander Larsson + Bugzilla: https://bugzilla.gnome.org/show_bug.cgi?id=697357 + Signed-off-by: Chris Wilson + + src/cairo-composite-rectangles.c | 7 +++++++ + src/cairo-traps-compositor.c | 32 ++++++++++++++------------------ + 2 files changed, 21 insertions(+), 18 deletions(-) + +commit 631bf299256e11a17511977f357e0353fb5615f7 +Author: Chris Wilson +Date: Sat May 11 21:37:05 2013 +0100 + + directfb: Correctly chain up map-to-image/unmap to the image backend + + Fixes the infinite recursion reported by jojo. + + Signed-off-by: Chris Wilson + + src/cairo-directfb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 728e58e60f89076f626329ee3f006f011783f90b +Author: Martin Robinson +Date: Thu May 9 10:45:44 2013 -0700 + + gles: Switch default framebuffer destinations properly + + Make _cairo_gl_context_bind_framebuffer handle different types of GLES + surfaces properly Since, the multisampling setting of a surface never changes + in for GLES, so the first thing we do when setting the destination is to + ignore the requested multisampling setting. This simplifies all + following logic. + + src/cairo-gl-device.c | 47 +++++++++++++++++++++++++++-------------------- + 1 file changed, 27 insertions(+), 20 deletions(-) + +commit 1704292e493b3c635e115df59d07330d19b39514 +Author: Martin Robinson +Date: Tue May 7 12:01:17 2013 -0700 + + gl: Fix compiler warnings in the GL backend + + src/cairo-gl-composite.c | 5 ++++- + src/cairo-gl-glyphs.c | 3 ++- + src/cairo-gl-msaa-compositor.c | 6 ++++-- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit e83943ec9a06f20572e22105f4e6e44740893eb9 +Author: Martin Robinson +Date: Mon May 6 10:56:26 2013 -0700 + + gl: Bind the default framebuffer before calling gl{Read|Draw}Buffer + + Fix more fallout from separating framebuffer binding from setting the + destination. In some cases it is sufficient to call + glDrawBuffer/glReadBuffer before binding the framebuffer, but the + masking-filling-stroking test of cairo-gl-smoke-tests fails if the order + is incorrect. + + src/cairo-gl-device.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 32bd6aa46dc77c497f06d2ab3bf0c2ec218d9e19 +Author: Martin Robinson +Date: Fri Apr 26 15:21:37 2013 -0700 + + gl: Update transformation when surface size changes + + In my previous commit I mistakenly removed the transformation matrix + update when cairo_gl_surface_set_size is called. This change restores + it. + + src/cairo-gl-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8da704ca7c43dda796657e86c5221736b1983122 +Author: Martin Robinson +Date: Wed Apr 10 22:25:49 2013 +0000 + + gl: Separate framebuffer bind from destination selection + + Disentangle the action of binding the framebuffer from setting the + destination. This straightens up the code a bit and avoids some redundant + operations (such as reacquiring the context) when simply switching from + the multi-sample framebuffer to the single-sample framebuffer and vice + versa. + + src/cairo-gl-device.c | 98 +++++++++++++++++++++++++++++--------------------- + src/cairo-gl-private.h | 9 ++--- + src/cairo-gl-surface.c | 2 +- + 3 files changed, 63 insertions(+), 46 deletions(-) + +commit 793f8223d4a71f3fc7e74722fb60659e7100a39d +Author: egag +Date: Wed Apr 24 12:07:47 2013 +0200 + + xlib: Aquire display before using it in DEBUG message. + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 498421bec90f68f3d7219b145860a71fd39f0c64 +Author: Henry Song +Date: Wed Apr 17 10:23:27 2013 -0700 + + gl/msaa: Resolve multisampling on surface flush + + When flushing a surface, we must resolve multisampling for desktop GL. + This allows use of the original surface texture in any following raw GL + operations. This fixes accelerated canvas with WebKitGTK+ using the MSAA + compositor. + + src/cairo-gl-operand.c | 39 +++------------------------------------ + src/cairo-gl-private.h | 3 +++ + src/cairo-gl-surface.c | 35 +++++++++++++++++++++++++++++++++++ + 3 files changed, 41 insertions(+), 36 deletions(-) + +commit 2dd2c826a5b367d32cf2d48ed69754795990c5db +Author: Chris Wilson +Date: Tue Apr 16 10:58:56 2013 +0100 + + png: Avoid marking the surface as in error after a png warning + + It turns out that libpng will continue to load an image after throwing a + warning, and that libpng16 now throws warnings for images that libpng15 + and earlier loaded without error. As we were happily loading those + images into cairo surfaces before, we are therefore being overzealous + in throwing an error now - so just squelch the warning. + + Signed-off-by: Chris Wilson + + src/cairo-png.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit a64ce09715162c57d6e4b6a460d426af1d443cdc +Author: Chris Wilson +Date: Sat Apr 6 09:09:23 2013 +0100 + + xlib: Trim uploads for surfaces extended by PAD + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 04b9d5d9b1ab8544fc0918d8ced90dc70641e727 +Author: Chris Wilson +Date: Sat Apr 6 09:07:24 2013 +0100 + + xlib: Wrap errors generating sources in an error surface + + Once upon a time the wrapping was provided by the caller, but the + current requirement is that the error is propagated back as an error + surface. + + Bugzilla: http://bugs.freedesktop.org/show_bug.cgi?id=63196 + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f6efecdfefa161c68fc5bf193a6487fc1a5047d5 +Author: Martin Robinson +Date: Fri Mar 29 11:09:48 2013 -0700 + + boilerplate/gl: Disable thread awareness + + This dramatically speeds up testing on NVidia and actually makes it + possible to run traces within a reasonable amount of time. + + cairo-perf-trace results for: + NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 3.3.0 NVIDIA 310.14 + + Before: + test min(s) median(s) stddev. count + gvim 30.924 31.251 0.72% 5/6 + firefox-fishbowl 168.751 201.017 12.46% 8/8 + (exited early) + + After: + test min(s) median(s) stddev. count + gvim 1.294 1.325 1.79% 6/6 + firefox-fishbowl 18.540 19.104 1.54% 6/6 + + boilerplate/cairo-boilerplate-egl.c | 2 ++ + boilerplate/cairo-boilerplate-glx.c | 3 +++ + 2 files changed, 5 insertions(+) + +commit b00b9e82ab728eaf3b87dd1113387d8e8df0d7e3 +Author: Martin Robinson +Date: Thu Apr 4 12:03:19 2013 -0700 + + boilerplate: Add a mode for running threaded perf tests + + This is useful because the GL backend runs much faster on some drivers + when thread awareness is disabled. + + boilerplate/cairo-boilerplate.h | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit e66e9ac12e3e11af76f14e8de3cfee72d4299864 +Author: Marc-André Lureau +Date: Tue Apr 2 00:32:56 2013 +0200 + + win32: fix corrupted drawing + + Fix src bitmap coordinates, which origin is bottom-left. This is + apparently a bug in StretchDIBits(), according to some comments on + MSDN API documentation. + + The backend used to have this coordinate change in the past: + + if (!StretchDIBits (dst->dc, + /* dst x,y,w,h */ + dst_r.x, dst_r.y + dst_r.height - 1, + dst_r.width, - (int) dst_r.height, + /* src x,y,w,h */ + src_r.x, src_extents.height - src_r.y + 1, + src_r.width, - (int) src_r.height, + src_image->data, + &bi, + DIB_RGB_COLORS, + SRCCOPY)) + + https://bugs.freedesktop.org/show_bug.cgi?id=61876 + + src/win32/cairo-win32-gdi-compositor.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0446fae26d35dc4e31aadc498f0f9b48b21d2c45 +Author: Chris Wilson +Date: Sat Mar 23 11:19:14 2013 +0000 + + perf: Iteratively prune outliers + + Signed-off-by: Chris Wilson + + perf/cairo-stats.c | 41 +++++++++++++++++++++++------------------ + 1 file changed, 23 insertions(+), 18 deletions(-) + +commit fdec6b37596d8b064ff082326d7189daa8208052 +Author: Michael Hutchinson +Date: Fri Mar 29 02:37:33 2013 +0100 + + quartz: Don't release memory we don't own + + This was causing crashes due to double frees. + + https://bugs.freedesktop.org/show_bug.cgi?id=62885 + + Signed-off-by: Benjamin Otte + + src/cairo-quartz-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 9e0748e223cfb8c5557c73f3ab5068ec1323e7c2 +Author: Adrian Johnson +Date: Wed Mar 27 08:08:32 2013 +1030 + + pdf: fix typo in bbox check + + http://lists.cairographics.org/archives/cairo/2013-March/024186.html + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 59ccc3d72e839bd897111322765bb13696a97ef5 +Author: Nicola Fontana +Date: Fri Mar 1 14:16:45 2013 +0100 + + gobject: Add wrapper around cairo_matrix_t + + Reviewed-By: Benjamin Otte + Signed-off-by: Uli Schlachter + + util/cairo-gobject/cairo-gobject-structs.c | 4 +++- + util/cairo-gobject/cairo-gobject.h | 4 ++++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit be5eabb66a475720020211a6d37bfeb75fc3242c +Author: Uli Schlachter +Date: Fri Mar 22 18:19:00 2013 +0100 + + xcb: Clear temporary replay image in recording playback + + This gets rid of random noise that we got from the X11 server due to + uninitialized memory. + + Fixes: pdf-surface-source, ps-surface-source, svg-surface-source + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 41ef69a98c67a2cb8b64e8ef3bb986d57a0a2437 +Author: Uli Schlachter +Date: Fri Mar 22 14:14:29 2013 +0100 + + Fix "make check" standalone header check + + This fixes the following error: + + ./cairo-fixed-private.h: In function ‘_slow_segment_intersection’: + ./cairo-fixed-private.h:374:9: error: ‘FALSE’ undeclared (first use in this function) + ./cairo-fixed-private.h:374:9: note: each undeclared identifier is reported only once for each function it appears in + ./cairo-fixed-private.h:386:12: error: ‘TRUE’ undeclared (first use in this function) + + Signed-off-by: Uli Schlachter + + src/cairo-fixed-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit b7c06fff1f597ba74fa6618766ec297d3a4bf880 +Author: Uli Schlachter +Date: Fri Mar 22 14:04:44 2013 +0100 + + boilerplate: rename xcb-render-0.0 to xcb-render-0_0 + + The test suite uses dots to separate the backend name from the content type. + Thus, the backend name must not contain any dots. + + The xlib backend already calls its RENDER 0.0 target xlib-render-0_0 for this + reason. This commit makes the xcb backend match this. + + Reported-by: Darxus + Signed-off-by: Uli Schlachter + + boilerplate/cairo-boilerplate-xcb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit caf50c07e225ee3a3e149234601e7305b1437736 +Author: Uli Schlachter +Date: Fri Mar 22 13:58:04 2013 +0100 + + test: Fix handling of dots in CAIRO_TEST_TARGET + + Before this, the following happened: + + $ CAIRO_TEST_TARGET=image,xcb-render-0.0 make test + Cannot find target 'image'. + Known targets: image, [...] + + The reason for this is that _cairo_boilerplate_target_matches_name() doesn't get + a null-terminated string, but instead has a pointer to the end of the string. + However, strpbrk() expects a null-terminated argument and thus could return a + result which points past the end of the input. + + This commit fixes exactly this. + + Reported-by: Darxus + Signed-off-by: Uli Schlachter + + boilerplate/cairo-boilerplate.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 13bd8d09b44e50649f6fc4d58d036bc32c1d5c5b +Author: Behdad Esfahbod +Date: Thu Mar 21 16:48:43 2013 -0400 + + [ft] I meant fabs(), not abs() + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed6a293e3dd2e81c8e159bf685cce6ffbcd7c81c +Author: Henry Song +Date: Wed Mar 20 15:10:34 2013 +0000 + + gl: Fix typo in gles2 shader cache lookup + + When comparing shader cache entries, it's important that we actually + compare the variable type hash. + + src/cairo-gl-shaders.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ff233fd706e62edf267bee66113e2cb35183bcd9 +Author: Behdad Esfahbod +Date: Mon Mar 18 14:17:29 2013 -0400 + + [test] Set font size + + Previously this test was working because we were not scaling bitmap + fonts. We do now, so adjust test. + + test/bitmap-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit be347acd5a198b4280f2699a1abfca241e7e610b +Author: Matt Sealey +Date: Mon Mar 11 10:24:52 2013 -0500 + + gitignore: negate gitignore for static pkgconfig files + + Commit 781f253 adds a rule cairo-*.*.* to .gitignore in the root dir. + Unfortunately this matches several src/cairo-*.pc.in files in the + src directory. + + The build system requires these files to be present, but the rule is + allowing them to be ignored. For example, when extracting a cgit + snapshot tarball and checking it into another git repository, these + files get left behind. Any accidental changes to these files will go + unnoticed by a 'git status' (possibly creating bad installs) and + any intentional changes could not be committed (git commit -a will + miss them, and every one will need to be forced). This is not really + desirable. + + We don't want to unignore *.pc.in here since there are many, many + autogenerated files with this name, and the cairo-*.*.* rule is in + general quite useful and doesn't warrant modification (although it + could be made a little more specific), so we just make these 4 files + a special case and negate the match with full filenames in src/. + + Signed-off-by: Matt Sealey + Signed-off-by: Uli Schlachter + + src/.gitignore | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0e999edff869bc08522a6a56c69efa9b5e1c33b5 +Author: Matthew Fischer +Date: Sat Mar 9 15:42:59 2013 -0700 + + Adding a simple usage statement to cairo-perf-chart + + Signed-off-by: Uli Schlachter + + perf/cairo-perf-chart.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit 592f5944239debfa3dacc410f675261947156baf +Author: Uli Schlachter +Date: Fri Mar 15 16:53:28 2013 +0100 + + test: Fix CAIRO_REF_DIR + + Ever since the test output was moved from test/ to test/output/, using + CAIRO_REF_DIR to make the test suite succeed no longer works. The test suite was + looking for the wrong file names. + + This patch makes this work again. However, I am not sure that this really is the + correct fix. It just seems to work. :-) + + Reported-by: Darxus + Signed-off-by: Uli Schlachter + + test/README | 2 +- + test/cairo-test.c | 5 ++--- + 2 files changed, 3 insertions(+), 4 deletions(-) + +commit c141615a7fa632a2435b49f3949ed1fc9962af1f +Author: Marek Kasik +Date: Fri Mar 15 14:46:19 2013 +0100 + + cff-subset: Fix allocation of width arrays + + fd_default_width and fd_nominal_width + are arrays of doubles not arrays of ints. + + src/cairo-cff-subset.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 01a8bf01c6508a4fea8d40371c3049e7a2f7908a +Author: Chris Wilson +Date: Fri Mar 15 09:08:00 2013 +0000 + + mempool: Reduce an assert into an error return for get_buddy() + + If we ask for a buddy that is outside of our allocation that is an + error that should not happen with a power-of-two allocated zone... + However, since it has been seen in the wild, we can safely return that + there is no buddy rather than die in a too-late assert. + + Reported-by: Anton Eliasson + Signed-off-by: Chris Wilson + + src/cairo-mempool.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2c2dccf5a4d298c866f7c0faed2e10c65252c168 +Author: Martin Robinson +Date: Tue Mar 12 15:17:19 2013 -0700 + + stroke: Use round-joins near inflection points of splines + + Similar to b7bd5ae4f3da44131261711bb236cd7aa24a3ae3, but applied to the + fallback stroke shaper. + + src/cairo-path-stroke.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit aadece05fb1cf80f0a1138368f4664e878a59204 +Author: Martin Robinson +Date: Tue Mar 12 15:16:01 2013 -0700 + + stroke: Fix large line widths for fallback stroke shaper + + Fix the test case line-width-tolerance for the fallback stroke shaper. + Instead of drawing quads between spline points, draw triangle based on + the actual spline edges. This roughly follows the approach of the + tristrip and polygonal shapers. + + src/cairo-fixed-private.h | 34 ++++++++++++++++++ + src/cairo-path-stroke.c | 90 ++++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 116 insertions(+), 8 deletions(-) + +commit c60e23feb16a8745eaa6d213a89f61ded5707731 +Author: Martin Robinson +Date: Wed Mar 13 17:19:19 2013 -0700 + + path: Fix a bug in line intersection + + Before the intersection code was not taking into account that both + quotients are required to be in the range (0,1) for the segments to + intersect or handling the case of negative numerators and denominators. + + src/cairo-path-fixed.c | 39 +++++++++++++++++++++++++++------------ + 1 file changed, 27 insertions(+), 12 deletions(-) + +commit 5ee136b2c067c92e85f04ba0c84966f7760f4556 +Author: Martin Robinson +Date: Fri Mar 8 10:29:55 2013 -0800 + + gl: Setup operands when the vertex size changes + + Previously _cairo_gl_composite_setup_vbo was overwriting the old context + vertex_size, while _cairo_gl_context_setup_operand was relying on it to + determine if the vertex size changed. Instead of a fragile ordering of + statements, pass whether the vertex size changed as an argument to enforce + the calling order via method parameters. + + src/cairo-gl-composite.c | 29 +++++++++++++++++------------ + 1 file changed, 17 insertions(+), 12 deletions(-) + +commit f50ced2e7b4b2f4601dc9b9edf1a861401c302e4 +Author: Chris Wilson +Date: Fri Mar 8 14:25:26 2013 +0000 + + gl: Fix typo s/bool/cairo_bool_t/ + + One quickly gets used to having stdbool.h available. + + src/cairo-egl-context.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 524e6fd3e82d952dfa850b832238a1f4f9ccb8bb +Author: Henry Song +Date: Thu Mar 7 16:33:27 2013 +0000 + + gl: Export query for EGLContext and EGLDisplay from device + + Similar to glx, add query for the EGLContext and EGLDisplay to egl-based + cairo devices. + + src/cairo-egl-context.c | 33 +++++++++++++++++++++++++++++++++ + src/cairo-gl.h | 6 ++++++ + 2 files changed, 39 insertions(+) + +commit a8f1b456db744e33a10b2301df03528787e5b1ca +Author: Behdad Esfahbod +Date: Fri Mar 8 06:21:59 2013 -0500 + + [FT] Prefer downscaling bitmap glyphs to upscaling + + Say, you have bitmap strikes for sizes 50ppem and 100ppem. + To render at 60ppem, it's much better to downscale the 100ppem + bitmap than upscale 50ppem one. Prefer downscaling. + + src/cairo-ft-font.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit 4f00d2344c84a1017a1e7d76ccb2fa552c80a969 +Author: Jana Saout +Date: Fri Mar 1 20:10:28 2013 +1030 + + pdf: Fix crash + + Bug 61451 + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7658eced9a45f42033c2b0b45cee70f6edb6ff20 +Author: Chris Wilson +Date: Sun Feb 24 17:07:54 2013 +0000 + + xlib: Fix invocation of XRenderFindFormat() + + The 'count' parameter is an indication to libXrender of the number of + matches to skip before reporting (rather than a limit on the number to + report). As we only want the first match, always pass 0. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 446a3dc5c0298e35b9a1e38460bc3804ab6e01ce +Author: Adrian Johnson +Date: Tue Feb 19 20:59:16 2013 +1030 + + pdf: add missing 'endobj' to shading dict + + https://bugs.launchpad.net/ubuntu/+source/libcairo/+bug/1051939 + + src/cairo-pdf-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit e7e1ac235ff94d184d88c8c206b81343822f6a4e +Author: Chris Wilson +Date: Tue Feb 19 09:54:24 2013 +0000 + + image: Compare against the true size of the embedded buffer + + When querying whether the run is small enough to fit inside the + pre-allocated temporary buffer, we need to avoid comparing against + sizeof(buf) as buf is a variable length array and so sizeof() is + meaningless. + + Reported-by: Edward Zimmermann + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fb1abbc4bc25c541cfb1084012a6a185c541c340 +Author: Chris Wilson +Date: Fri Feb 15 14:04:21 2013 +0000 + + win32: Free the fallback upon finish + + Zozó Teki pointed out that we leak the fallback surface upon finish in + case it was active at the time as the preceding flush would only clear + the damage and not decouple the fallback surface. + + Signed-off-by: Chris Wilson + + src/win32/cairo-win32-display-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 41e646e019911f8e566e4f9963036117750f862f +Author: Henry Song +Date: Tue Jan 29 17:30:25 2013 +0000 + + gl: disable GL_DITHER + + GL_DITHER is enabled by default by spec. Leaving GL_DITHER enabled + causes color pixel mismatch on some drivers by comparing uploading then + readPixels and original image. + + src/cairo-gl-device.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 02b467a28703a0bd68b92fb26f7905bf6a25bf7d +Author: Chris Wilson +Date: Tue Feb 12 10:46:42 2013 +0000 + + test: Exercise replaying a recording surface through a flip matrix + + test/Makefile.sources | 1 + + test/recordflip.c | 493 +++++++++++++++++++++ + test/reference/recordflip-fill-alpha.ref.png | Bin 0 -> 2790 bytes + .../recordflip-paint-alpha-clip-mask.ref.png | Bin 0 -> 340 bytes + test/reference/recordflip-paint-alpha-clip.ref.png | Bin 0 -> 291 bytes + .../recordflip-paint-alpha-solid-clip.ref.png | Bin 0 -> 280 bytes + test/reference/recordflip-paint-alpha.ref.png | Bin 0 -> 242 bytes + test/reference/recordflip-paint.ref.png | Bin 0 -> 93 bytes + test/reference/recordflip-select-font-face.ref.png | Bin 0 -> 2229 bytes + .../reference/recordflip-self-intersecting.ref.png | Bin 0 -> 168 bytes + test/reference/recordflip-text-transform.ref.png | Bin 0 -> 5606 bytes + 11 files changed, 494 insertions(+) + +commit a09b7c79278465ee1ad916697e0153eae640d8df +Author: Chris Wilson +Date: Tue Feb 12 10:25:03 2013 +0000 + + path: Fix bbox computation for negative scale factors + + The fast path for transforming a path by a simple scale factor, forgot + to fix up the orientation of the box if that scale factor was negative. + + Reported-by: Edward Zimmermann + Signed-off-by: Chris Wilson + + src/cairo-path-fixed.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit be1561dadece6e947a3ca78d1124197b4278ce96 +Author: Chris Wilson +Date: Tue Feb 12 10:24:08 2013 +0000 + + recording: Avoid indirection through indices array if not reduced + + If we don't discard any elements, then the index array is simply a 1:1 + mapping of the element array, and we may as well bypass it. + + Signed-off-by: Chris Wilson + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14237f11439831377b59e8ea5717de5dd3e19e73 +Author: Chris Wilson +Date: Tue Feb 12 10:11:12 2013 +0000 + + spans: Mark the surface as cleared in preparing for recording surface playback + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 7f3cca458a7546f913533f693b581325228aba4e +Author: Chris Wilson +Date: Sun Feb 10 14:18:47 2013 +0000 + + Post release version bump to 1.12.15 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0dac37c41473deafa4a2f154187c5c3d08b07c91 +Author: Chris Wilson +Date: Sun Feb 10 13:38:28 2013 +0000 + + 1.12.14 release + + NEWS | 32 ++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 33 insertions(+), 1 deletion(-) + +commit 93ddc3a28308bcd9e062178ceb453f26e9228fc4 +Author: Chris Wilson +Date: Sun Feb 10 13:13:31 2013 +0000 + + tests: Update reference images after adjustments to polygon line clipping + + Signed-off-by: Chris Wilson + + test/reference/clip-nesting.rgb24.ref.png | Bin 937 -> 936 bytes + test/reference/record-fill-alpha.argb32.ref.png | Bin 2736 -> 0 bytes + test/reference/record-fill-alpha.ref.png | Bin 2839 -> 2812 bytes + test/reference/record-fill-alpha.rgb24.ref.png | Bin 2736 -> 0 bytes + test/reference/record1414x-fill-alpha.argb32.ref.png | Bin 4129 -> 0 bytes + test/reference/record1414x-fill-alpha.rgb24.ref.png | Bin 4129 -> 0 bytes + test/reference/record2x-fill-alpha.argb32.ref.png | Bin 5715 -> 0 bytes + test/reference/record2x-fill-alpha.rgb24.ref.png | Bin 5715 -> 0 bytes + test/reference/record90-fill-alpha.argb32.ref.png | Bin 2651 -> 0 bytes + test/reference/record90-fill-alpha.rgb24.ref.png | Bin 2651 -> 0 bytes + test/reference/rel-path.rgb24.ref.png | Bin 216 -> 216 bytes + 11 files changed, 0 insertions(+), 0 deletions(-) + +commit d4651676e1496f0354acb0ef045e8b65601edf6d +Author: Chris Wilson +Date: Fri Feb 8 22:17:13 2013 +0000 + + win32: Clear the similar-image before returning to the user + + Our userspace API mandates that surfaces created for the user are + cleared before they are returned. Make it so for the win32 similar image + constructor. + + Reported-by: Michael Henning + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=60519 + Signed-off-by: Chris Wilson + + src/win32/cairo-win32-display-surface.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 2d7ac9e737f37daf8490c27e6a04c65bba642645 +Author: Chris Wilson +Date: Fri Feb 8 15:19:14 2013 +0000 + + xlib: Only apply the dst offset to the glyph strings once + + The elts offset is a delta from the previous glyph coordinate. So by + subtracting the dst origin everytime, we were accumulating a glyph + position error. Instead we just want to offset the starting coordinate + and then always use relative positions. + + Reported-by: Theo Veenker + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit ea16302e45ced56e6f12b8520e9f530e1ffc68c4 +Author: Chris Wilson +Date: Fri Feb 8 13:22:01 2013 +0000 + + polygon: Avoid computing the unused intersection coordinates + + If we only ignore the result of the computed boundary intersection, + because the edge is inside that boundary, then we can simply forgo the + calculation. + + Signed-off-by: Chris Wilson + + src/cairo-polygon.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 8cfbdf2f02ba01d5638a91c9f3f7fc228b402caa +Author: Chris Wilson +Date: Fri Feb 8 13:10:25 2013 +0000 + + polygon: Only rely on the computed boundary intersections for crossing edges + + If we need to extrapolate the edge to the boundary, then we run the risk + of an overflow for an immaterial result. So if the edge does not cross + the boundary, we can simply use the corresponding end-point and not emit + the boundary segment. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=60489 + Signed-off-by: Chris Wilson + + src/cairo-polygon.c | 35 +++++++++++++++++++++++++---------- + 1 file changed, 25 insertions(+), 10 deletions(-) + +commit 607a15db5df04d10e5be6d06599ec4e9d98d2446 +Author: Chris Wilson +Date: Thu Feb 7 21:40:30 2013 +0000 + + gl: Mark up _cairo_gl_composite_set_operator* as private + + Add the cairo_private markup to hide the PLT entries and to keep make + check happy. + + Signed-off-by: Chris Wilson + + src/cairo-gl-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 562cc8227feb99b75fb53df7800df66887be129d +Author: Ravi Nanjundappa +Date: Mon Feb 6 10:56:55 2012 +0530 + + gl/spans: Handle SOURCE operations with opaque sources. + + SOURCE operations with an opaque are equivalent to OVER. + This can prevent us from falling back in certain cases. + + Signed-off-by: Chris Wilson + + src/cairo-gl-spans-compositor.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 4b6b28b5e8b9020c72a60b01ff3340a70dd59478 +Author: Chris Wilson +Date: Thu Feb 7 10:00:47 2013 +0000 + + win32: Fix is_win98() + + Since the translation into a separate function, its condition was + reversed: that is almost everybody thought they were on a win98 machine + and so had no working AlphaBlend(). + + Signed-off-by: Chris Wilson + + src/win32/cairo-win32-device.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4b54c09c056e5dee65f2cf4e87835eb9127e5b1c +Author: Chris Wilson +Date: Wed Feb 6 22:16:12 2013 +0000 + + image: Substitute OVER spans for SOURCE with an opaque pattern + + Based on an idea from Ravi Nanjundappa + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 400ea9c2905461067df9e6d27c2e961d47f04676 +Author: Martin Robinson +Date: Wed Feb 6 12:53:14 2013 -0800 + + gl/msaa: Properly fall back when using CLEAR operator + + There are some situations that the MSAA compositor doesn't support using + the CLEAR operator. We should properly fall back in those cases. + + src/cairo-gl-msaa-compositor.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 7bee1962f601009c507f987838de1a9dec3d9334 +Author: Adrian Johnson +Date: Tue Feb 5 21:57:52 2013 +1030 + + type1-subset: in latin subsets replace glyph names with standard names + + When using WinAnsiEncoding in PDF the glyphs are keyed by glyph + name. We need to ensure the correct names are used and can't assume + the glyph names in the font are correct. + + Bug 60248 + + src/cairo-type1-subset.c | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +commit 4cb181d985adbbf79e80ff695adc908810b41544 +Author: Henry Song +Date: Tue Jan 29 17:53:38 2013 +0000 + + gl: do not force flush everytime uploading a glyph image to glyph cache + + In normal cases, we want to flush pending operations reading from the + texture before modifying its contents. However during uploading of + glyphs into the glyph cache, we repeatedly modify the texture as we + construct the vbo (whilst referencing it for that operation). We track + unused areas in the glyph cache so that if we run out of space, we can + explicitly flush the pending glyphs and start afresh and avoid having to + flush the operation in common case. + + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 3 ++- + src/cairo-gl-spans-compositor.c | 2 +- + src/cairo-gl-surface-legacy.c | 7 ++++--- + src/cairo-gl-surface.c | 16 ++++++++++------ + src/cairo-gl-traps-compositor.c | 9 ++++++--- + 6 files changed, 24 insertions(+), 15 deletions(-) + +commit 260c16331a2c7bedbcf35d7f2cbab2f1f4098c87 +Author: Chris Wilson +Date: Mon Feb 4 10:43:13 2013 +0000 + + gl: Include the vertex ident in the shader cache hash + + As we may specialise the vertex program depending upon details of the + fragment shader, and may have more than one program for the same + combination of fragment sources, we need to include the vertex tag in + the cache entry. + + Signed-off-by: Chris Wilson + + src/cairo-gl-shaders.c | 49 ++++++++++++++++++++++++++++++------------------- + 1 file changed, 30 insertions(+), 19 deletions(-) + +commit 05ad89f91241b386f72f5b9bac3ebe62faff1d1b +Author: Chris Wilson +Date: Sun Feb 3 16:51:35 2013 +0000 + + gl: Replace manual vertex transformation with VS computation of texcoords + + Not only is our point transformation code is quite slow (well at least + compared to a real GPU), but by deriving the texture coordinates from + the vertex position we can elide the multiple arrays that we need to + construct and pass to GL - improving performance by eliminating CPU + overhead from needless transforms and data shovelling. + + However, not all vertex emission is suitable. For instance, for glyphs + we need to emit discontiguous texture coordinates for each glyph, but + span generation is suitable - which fortuitously also has the largest + vertex density and so benefits the most. + + The only real concern is for hardware without true vertex shader support + (e.g. i915) but there we are already invoking the VS to transform the + vertex into the viewport. We would need to eliminate that transform as + well as manually compute the texture coordinates in order to eliminate + the vertex recomputation pass. + + Signed-off-by: Chris Wilson + + src/cairo-gl-composite.c | 70 ++++++++++++++++++++++++++++++----------- + src/cairo-gl-msaa-compositor.c | 21 ++++++++----- + src/cairo-gl-operand.c | 67 +++++++++++++++++++++++++++++---------- + src/cairo-gl-private.h | 24 ++++++++------ + src/cairo-gl-shaders.c | 31 +++++++++++++----- + src/cairo-gl-source.c | 3 +- + src/cairo-gl-spans-compositor.c | 6 ++-- + src/cairo-gl-traps-compositor.c | 3 +- + 8 files changed, 162 insertions(+), 63 deletions(-) + +commit d15a71f128c73ce1da19e6ff5a4e2fe044b58749 +Author: Chris Wilson +Date: Sun Feb 3 12:51:13 2013 +0000 + + qt: Update for fallback compositor + + We now need to explicitly manage fallbacks and to provide an + implementation for map-to-image/unmap-image. + + src/cairo-qt-surface.cpp | 210 +++++++++++++++++++++++++++++++---------------- + 1 file changed, 140 insertions(+), 70 deletions(-) + +commit 10110d58cee179cded8e4c4ff8a8d02c477585bd +Author: Chris Wilson +Date: Sat Feb 2 08:47:26 2013 +0000 + + surface: Prevent reads from the user-data arrays during teardown + + In a similar fashion to the previous commit, we also need to be wary of + users simply trying to read from a potentially freed user-data array. + + Signed-off-by: Chris Wilson + + src/cairo-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 18cff63e3d288bf2d7773760f2ab25c80a4a2bc1 +Author: Chris Wilson +Date: Sat Feb 2 08:47:26 2013 +0000 + + surface: Prevent writes to the user-data arrays during teardown + + As we cleanup the user-data arrays, we call the user provided destroy + notifier callbacks. These callbacks are at liberty to write back into + the parent surface, and in particular try to write into the arrays that + we have just freed. This causes hard to control and fairly unpredictable + use-after-frees in the client, so lets just rule out the dangerous + behaviour. + + References:https://bugzilla.mozilla.org/show_bug.cgi?id=722975 + Signed-off-by: Chris Wilson + + src/cairo-surface.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit c391093f40472c2300f38d0e5857858f85586b60 +Author: Chris Wilson +Date: Fri Feb 1 16:31:49 2013 +0000 + + image: Add a convenience function for creating an image from another's data + + The GL backend would like to extract a rectangle from another surface + and convert it to a different pixel format. The + _cairo_image_surface_create_from_image() does that by returning a new + image that has the contents of the specified rectangle in the source + + Signed-off-by: Chris Wilson + + src/cairo-image-surface-private.h | 7 +++++ + src/cairo-image-surface.c | 55 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 62 insertions(+) + +commit 15830fdb1087f18dcd6351de1034a5025b8ed343 +Author: Chris Wilson +Date: Thu Jan 31 18:50:39 2013 +0000 + + NEWS: fix a couple of typos + + Reported-by: Thierry Vignaud + + NEWS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 28dbafd5643fcf637a556fc196b5b984d44d151d +Author: Chris Wilson +Date: Thu Jan 31 16:23:24 2013 +0000 + + Post release version bump to 1.12.13 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a201a1169f472e822a66275b7dffe62f241d8ec0 +Author: Chris Wilson +Date: Thu Jan 31 15:24:33 2013 +0000 + + 1.12.12 release + + NEWS | 24 ++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 25 insertions(+), 1 deletion(-) + +commit 350f9fb5366079113eb8bca947d480362c3ae6be +Author: Chris Wilson +Date: Thu Jan 31 15:15:03 2013 +0000 + + test: Refresh refs for aa noise following reduction of the 2-stage compositing + + A side effect of + + commit c986a7310bb06582b7d8a566d5f007ba4e5e75bf + Author: Chris Wilson + Date: Thu Jan 24 08:55:54 2013 +0000 + + image: Enable inplace compositing with opacities for general routines + + is that we should in theory be reducing the rounding errors when + compositing coverage. + + Signed-off-by: Chris Wilson + + test/reference/bug-source-cu.rgb24.ref.png | Bin 3211 -> 3211 bytes + test/reference/clip-stroke-unbounded.argb32.ref.png | Bin 4128 -> 4127 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 3546 -> 3566 bytes + test/reference/mask.argb32.ref.png | Bin 8579 -> 8565 bytes + test/reference/mask.rgb24.ref.png | Bin 7127 -> 7135 bytes + .../record-paint-alpha-clip-mask.argb32.ref.png | Bin 340 -> 0 bytes + test/reference/record-paint-alpha-clip-mask.ref.png | Bin 333 -> 318 bytes + .../record-paint-alpha-clip-mask.rgb24.ref.png | Bin 340 -> 0 bytes + test/reference/record-text-transform.argb32.ref.png | Bin 5579 -> 0 bytes + test/reference/record-text-transform.rgb24.ref.png | Bin 5579 -> 0 bytes + test/reference/record1414x-text-transform.ref.png | Bin 8706 -> 8365 bytes + test/reference/record2x-text-transform.ref.png | Bin 13476 -> 13072 bytes + .../record90-paint-alpha-clip-mask.argb32.ref.png | Bin 343 -> 0 bytes + .../record90-paint-alpha-clip-mask.ref.png | Bin 0 -> 316 bytes + .../record90-paint-alpha-clip-mask.rgb24.ref.png | Bin 343 -> 0 bytes + .../record90-paint-alpha-clip.argb32.ref.png | Bin 296 -> 0 bytes + test/reference/record90-paint-alpha-clip.ref.png | Bin 0 -> 320 bytes + .../record90-paint-alpha-clip.rgb24.ref.png | Bin 296 -> 0 bytes + .../record90-text-transform.argb32.ref.png | Bin 5811 -> 0 bytes + test/reference/record90-text-transform.ref.png | Bin 0 -> 5481 bytes + .../reference/record90-text-transform.rgb24.ref.png | Bin 5811 -> 0 bytes + .../recording-surface-extend-none.argb32.ref.png | Bin 3051 -> 3153 bytes + .../recording-surface-extend-none.rgb24.ref.png | Bin 3128 -> 3145 bytes + .../recording-surface-extend-pad.argb32.ref.png | Bin 10822 -> 11200 bytes + .../recording-surface-extend-pad.rgb24.ref.png | Bin 12582 -> 12586 bytes + .../recording-surface-extend-reflect.argb32.ref.png | Bin 23518 -> 23967 bytes + .../recording-surface-extend-reflect.rgb24.ref.png | Bin 23881 -> 23930 bytes + .../recording-surface-extend-repeat.argb32.ref.png | Bin 24047 -> 24091 bytes + .../recording-surface-extend-repeat.rgb24.ref.png | Bin 24038 -> 24075 bytes + .../reference/recording-surface-over.argb32.ref.png | Bin 0 -> 3153 bytes + test/reference/recording-surface-over.rgb24.ref.png | Bin 3128 -> 3145 bytes + .../recording-surface-source.argb32.ref.png | Bin 3044 -> 3153 bytes + .../recording-surface-source.rgb24.ref.png | Bin 3133 -> 3146 bytes + test/reference/stroke-clipped.ref.png | Bin 5886 -> 5790 bytes + 34 files changed, 0 insertions(+), 0 deletions(-) + +commit 22b7fae0368ba6cff23b2ebdf58bd7d1bfdfbd6f +Author: Chris Wilson +Date: Thu Jan 31 14:19:53 2013 +0000 + + image: Add a reference for the clone's parent image + + We use the parent as a flag during map-to-image/umap-image that the + resultant image came from a fallback rather than as direct call + to the backend's map_to_image(). Whilst we use it as a simple flag, + we need to make sure the parent surface obeys the reference counting + semantics and is consistent for all callers. + + Unlike other users of the parent pointer, there is no resource sharing + between the two surfaces. + + Reported-by: Henry Song + Signed-off-by: Chris Wilson + + src/cairo-image-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit ec58fde294afd52c89fa5ed21ba2611edfdbd550 +Author: Chris Wilson +Date: Thu Jan 31 14:06:48 2013 +0000 + + perf: Synchronize before stopping the timers + + Fixes a regression from + + commit 2855ff4666922f2c38505414270d47f659b0d499 + Author: Andrea Canciani + Date: Wed Aug 31 16:42:03 2011 +0200 + + perf: Reuse cairo-time + + which dropped the essential call to synchronize when refactoring the + code. + + Reported-by: Siarhei Siamashka + Signed-off-by: Chris Wilson + + perf/cairo-perf.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2560c0b6577a6380ef175cf18bb804913784632c +Author: Chris Wilson +Date: Tue Jan 29 23:51:44 2013 +0000 + + xlib/shm: More clarification of seqno required + + Everytime I read the predicate wrong, but hopefully, this time I have it + right! + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 91834fbdee40f46e18d071fd2671a7a642e6aa86 +Author: Chris Wilson +Date: Tue Jan 29 22:12:00 2013 +0000 + + xlib/shm: Clarify testing of seqno + + Rename the seqno tests into seqno_passed(), seqno_before() and + seqno_after() in order to clarify their semantics. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 2 +- + src/cairo-xlib-surface-shm.c | 20 ++++++++++++++++---- + 2 files changed, 17 insertions(+), 5 deletions(-) + +commit 89092b97b50a7740058d0f72f94dfc6defe15ed6 +Author: Henry Song +Date: Tue Jan 29 13:21:00 2013 -0800 + + gl/msaa: Don't emit alpha when emitting vertices + + The color attribute is disabled when not in spans mode, so the emitted + alpha is simply overwritten by the next vertex. Additionally, this can + potentially cause the alpha to be written past the end of the buffer. + + src/cairo-gl-composite.c | 24 +++++++++++------------- + 1 file changed, 11 insertions(+), 13 deletions(-) + +commit 74a19c527c1fa07ade2042a8d2acecbb5f6ccab1 +Author: Chris Wilson +Date: Tue Jan 29 10:31:05 2013 +0000 + + configure: Include X11.h before testing for usability of Xrender.h + + On Solaris at least, the Xrender.h header is not standalone and requires + X11/X.h to be included first to define the essential types. + + Reported-by: Andreas F. Borchert + Bugzilla; https://bugs.freedesktop.org/show_bug.cgi?id=58199 + Signed-off-by: Chris Wilson + + configure.ac | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 41ae904461e344fbfa3be3d276a7102bb4304b19 +Author: Chris Wilson +Date: Tue Jan 29 03:52:02 2013 +0000 + + xlib/shm: Appease the compiler for a 'maybe used uninitialised' variable + + Initialise shm during its declaration so that it is indeed initialised + for the cleanup after every path. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 9b92625151ca75a6ee10f231f83b53f67a371947 +Author: Chris Wilson +Date: Tue Jan 29 03:49:56 2013 +0000 + + xlib/shm: Simplify uploading of SHM image data + + Make sure that we simply copy from the SHM segment into the target + drawable, and not inadvertently stage it through another SHM buffer. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit c006b886d28a772d7a62cec52ab7e0c8196c36f6 +Author: Chris Wilson +Date: Tue Jan 29 03:01:31 2013 +0000 + + xlib/shm: Force synchronisation for scratch SHM image buffers + + The scratch image buffers are used for uploads to the xserver and so we + must be careful not to overwrite active SHM segments. Unfortunately we + told the core SHM allocator that we would sync before using the images, + which was a lie. + + Reported-by: Michael Natterer + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fd59e6d86a3a1fc6720316f20deb8a0bd6f7b767 +Author: Chris Wilson +Date: Tue Jan 29 03:00:46 2013 +0000 + + xlib/shm: Always request a CompletionEvent from ShmPutImage + + ...and treat is as an expected event for synchronisation. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 11 +++-------- + src/cairo-xlib-surface.c | 3 +-- + 2 files changed, 4 insertions(+), 10 deletions(-) + +commit a364a106b257c4493ba7b3badacc63599ba6064a +Author: Chris Wilson +Date: Tue Jan 29 02:52:10 2013 +0000 + + xlib/shm: Tidy up destroying the mempool for a shm block + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 02a2baa8dcf49ad2d9766d43578ba216fab0d464 +Author: Chris Wilson +Date: Tue Jan 29 02:51:25 2013 +0000 + + xlib/shm: Tidy creation of the proxy source for ShmPixmaps + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 30e950515171b25d9bc3da8d535cfe05d8be69c8 +Author: Chris Wilson +Date: Tue Jan 29 02:49:26 2013 +0000 + + xlib/shm: Skip creating new SHM segments if the data is already in the xserver + + If the image is already inside a SHM segment, but the image format does + not match the surface, fallback to the XRender paths in order to perform + colorspace conversion on the data already inside the Xserver. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1d1af825bb4fcfd7c4a54b65292734ba244e096d +Author: Chris Wilson +Date: Tue Jan 29 02:47:48 2013 +0000 + + xlib/shm: Tighten mark-active to the actual CopyArea on the ShmPixmap + + Along the draw_image_boxes() upload path, we were actually marking the + ShmPixmap as still active for the subsequent drawing operation - which + could in theory never be submitted... + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3c18bae20ee2fea24d75f6986390ef8157d0207d +Author: Chris Wilson +Date: Mon Jan 28 10:03:54 2013 +0000 + + perf; Do not allow the backends to optimize away the clear before sync + + The importance of writing to the scratch surface before retrieving an + image is that it makes that the write lands in the server queue, as well + as the GetImage, in order to serialise the timer against all the + operations. + + Reported-by: Siarhei Siamashka + Signed-off-by: Chris Wilson + + perf/cairo-perf-trace.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit d9d5adec256b3935e4f261d81c37c77a2649248b +Author: Chris Wilson +Date: Sun Jan 27 16:51:52 2013 +0000 + + image: And more fallout from c986a73, restore the absent short runs + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +commit 1ba9fb6fadcc1cb619af0ef974dffb0ff8672244 +Author: Chris Wilson +Date: Sun Jan 27 16:15:35 2013 +0000 + + Mark _cairo_path_is_simple_quad as private + + Signed-off-by: Chris Wilson + + src/cairo-path-fixed-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d105f215a9c62f5b60541da209bf71182a2e9df +Author: Chris Wilson +Date: Sun Jan 27 16:29:44 2013 +0000 + + image: Fix opaque span fills + + I should have realised the previous result was too good to be true! + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c986a7310bb06582b7d8a566d5f007ba4e5e75bf +Author: Chris Wilson +Date: Thu Jan 24 08:55:54 2013 +0000 + + image: Enable inplace compositing with opacities for general routines + + On a SNB i5-2500: + + Speedups + ======== + firefox-chalkboard 34284.16 -> 19637.40: 1.74x speedup + swfdec-giant-steps 778.35 -> 665.37: 1.17x speedup + ocitysmap 485.64 -> 431.94: 1.12x speedup + + Slowdowns + ========= + firefox-fishbowl 46878.98 -> 54407.14: 1.16x slowdown + + That slow down is due to overhead of the increased number of calls to + pixman_image_composite32() (pixman_transform_point for analyzing the + source extents in particular) outweighing any advantage gained by + performing the rasterisation in a single pass and eliding gaps. The + solution that has been floated in the past is for an interface into + pixman to only perform the analysis once and then to return a kernel to + use for all spans. + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 190 +++++++++++++++++++++++++++++------ + src/cairo-spans-compositor-private.h | 2 +- + 2 files changed, 162 insertions(+), 30 deletions(-) + +commit cfe0e59663c71a6ecd0c976797ac32339e363af2 +Author: Martin Robinson +Date: Tue Jan 22 20:09:01 2013 -0800 + + gl/msaa: Add a fast path for fills that are simple quads + + Instead of invoking Bentley-Ottman for fills that are simple + quadrilaterals, just pass the geometry straight to OpenGL. + + src/cairo-gl-msaa-compositor.c | 45 ++++++++++++-- + src/cairo-path-fixed-private.h | 17 ++++++ + src/cairo-path-fixed.c | 136 ++++++++++++++++++++++++++++++----------- + 3 files changed, 158 insertions(+), 40 deletions(-) + +commit 1e3424cfd1fea3f9aa2b1c8af4bb72239a94f365 +Author: Henry Song +Date: Tue Jan 22 14:54:38 2013 -0800 + + gl: Use GL_ALPHA textures for CAIRO_CONTENT_ALPHA glyph caching + + It's safe to us GL_ALPHA for glyph caching surfaces, since Cairo only + uses them for texture uploading. This saves a little bit of memory. + + src/cairo-gl-glyphs.c | 16 ++++++++-------- + src/cairo-gl-private.h | 6 ++++++ + src/cairo-gl-surface.c | 38 +++++++++++++++++++++++++++++++------- + 3 files changed, 45 insertions(+), 15 deletions(-) + +commit a44b8bd70683a92d862b11c2d7359ce2b0a6a968 +Author: Henry Song +Date: Fri Jan 25 12:45:10 2013 -0800 + + gl: Fix typos in multisampling detection + + Instead of looking for the EXT_framebuffer_multisample, this code should + look for GL_EXT_framebuffer_multisample. GL_ARB_framebuffer_object also + contains all necessary API for using multisampling, so we don't need to + check for both it and the GL_EXT_framebuffer_blit and + GL_EXT_framebuffer_multisample pair. + + src/cairo-gl-device.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bb4072046016610a510373df3b67cdeb2ac1b583 +Author: Henry Song +Date: Fri Jan 25 11:55:10 2013 -0800 + + gl/msaa: Fix a memory leak in _clip_to_traps + + We need to clean up the polygon we create when decomposing a path into + trapezoids. + + src/cairo-gl-msaa-compositor.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7054c9969cb0e41845635d6658935da223899f08 +Author: Henry Song +Date: Wed Jan 16 15:32:32 2013 +0100 + + gl: Don't query the display when checking if the context changed + + If display has changed, the associated context must change. A + context is tied a display so we can avoid this check, eliminating + unnecessary work during context acquisition and release. + + src/cairo-egl-context.c | 13 ++++--------- + src/cairo-glx-context.c | 13 ++++--------- + 2 files changed, 8 insertions(+), 18 deletions(-) + +commit fa4f48cccb6c7f4e1afb2ff4b98b906b7d8d4afc +Author: Chris Wilson +Date: Wed Jan 23 15:04:26 2013 +0000 + + xlib: Do not upload the whole image just because we want an entire row + + Fixes regression exposed by + + commit a73e7ff0186176bc82cd3ae1432c054c1fd3aebd + Author: Chris Wilson + Date: Sun Jan 6 11:29:27 2013 +0000 + + xlib: Simplify source creation by use of map-to-image + + but ultimately from + + commit 74941f822015cc50cd8477d0cf97f1a70dbff60b + Author: Chris Wilson + Date: Wed Jan 2 22:27:55 2013 +0000 + + xlib: Use SHM transport for ordinary image uploads + + Reported-by: Gökçen Eraslan + Reported-by: Guillaume Ayoub + Reported-by: Emmanuel Benisty + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59635 + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 8 +++++++- + src/cairo-xlib-surface.c | 24 +++++++++++------------- + 2 files changed, 18 insertions(+), 14 deletions(-) + +commit ed2fa6b16b03fccc3e21598cdb9157cbcebd1d37 +Author: Chris Wilson +Date: Wed Jan 16 20:58:46 2013 +0000 + + version: Post-release bump to 1.12.11 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d6204c67d4d0d9c5d03087c4c1609a81ef1fdb7 +Author: Chris Wilson +Date: Wed Jan 16 20:22:38 2013 +0000 + + 1.12.10 release + + NEWS | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 50 insertions(+), 1 deletion(-) + +commit 1dfea39841fc6d545e45420b1999239f29556c05 +Author: Martin Robinson +Date: Tue Jan 15 17:12:23 2013 -0800 + + gl: Follow up fix for the previous commit + + Handle "fake" surfaces created by _cairo_gl_pattern_to_source which just + embed a GL backend operand. These surfaces do not have a backend, so we + should not fall back if a surface without a backend is not a texture + surface. + + src/cairo-gl-operand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 769ea3b2c757adc9f8f348fdc93bb46f35c2f6b8 +Author: Henry Song +Date: Wed May 2 21:54:55 2012 +0200 + + gl: Support for non-texture sources and masks + + If a GL surface is not a texture and is used as source or mask, + fall back to using an image surface as an intermediary. + + Fixes subsurface-image-repeat, subsurface-modify-child, + subsurface-modify-parent, subsurface-outside-target, subsurface-pad, + subsurface-reflect, subsurface-repeat, and subsurface-scale. + + src/cairo-gl-operand.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit d01a502710296c9b15755f445f6fdda289a2df0b +Author: Martin Robinson +Date: Tue Jan 15 12:07:33 2013 -0800 + + gl/msaa: Check for more extensions before using MSAA + + The MSAA compositor is implicitly relying on the existence of several + OpenGL extensions. This change makes those dependencies explicit. + + src/cairo-gl-device.c | 33 +++++++++++++++++---------------- + 1 file changed, 17 insertions(+), 16 deletions(-) + +commit 768b81b78eabbebb1bb443355441cac567739035 +Author: Chris Wilson +Date: Mon Jan 14 03:27:11 2013 +0000 + + script: Set decompression length prior to calling decompressors + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=59224 + Signed-off-by: Chris Wilson + + util/cairo-script/cairo-script-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6639c1231072d71d33eb0952bae5f95e7480cd0d +Author: Chris Wilson +Date: Sun Jan 13 22:48:30 2013 +0000 + + xlib: Initialise Pixmap for proxy sources + + So that we do not try to tell X to free a garbage pixmap and promptly + kill us. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fd34f420ec3ba02eb39f22f6551705ab23ebfc28 +Author: Chris Wilson +Date: Sun Jan 13 18:16:17 2013 +0000 + + compositor: Pass back the internal failure + + In order to pass back a CAIRO_INT_STATUS_UNSUPPORTED, we need to use the + internal error surface creation functions as they do not assert on + private error codes. + + Signed-off-by: Chris Wilson + + src/cairo-mask-compositor.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 14c32ee1cf6bfcaeb07d50a80b6d5a388a1f2885 +Author: Chris Wilson +Date: Sun Jan 13 18:11:31 2013 +0000 + + compositor: Convert image surface into backend source + + Before passing a surface to the backend composite functions, they expect + them to be a native source. The copy'n'paste code for the mask + compositor forgot to perform the conversion upon the clip surfaces, + which originally were native to the backend and are now images. + + Signed-off-by: Chris Wilson + + src/cairo-mask-compositor.c | 61 ++++++++++++++++++++++++++++++++++----------- + 1 file changed, 46 insertions(+), 15 deletions(-) + +commit 7012334ebb424b619312e1fa397cc3b8a3ffd770 +Author: Chris Wilson +Date: Sun Jan 13 17:20:24 2013 +0000 + + xlib: Handle lack of XRenderFillRectangles + + Remember to check for a supported render version before making a + FillRectangle request, and fallback to the core protocol where possible + instead. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-core-compositor.c | 79 +++++++++++++++++++++++++++++--------- + src/cairo-xlib-private.h | 15 +++++++- + src/cairo-xlib-render-compositor.c | 30 ++++++++++++--- + src/cairo-xlib-source.c | 70 ++++++++++++++++++++++++++++----- + 4 files changed, 157 insertions(+), 37 deletions(-) + +commit 503b6b9e2ea65805a77d527c00cf242ec86d479b +Author: Chris Wilson +Date: Fri Jan 11 13:10:56 2013 +0000 + + xlib: Only fallback through the mask intermediate if we can composite the mask + + Before rendering into the mask, we should first check whether the + subsequent call to composite the mask will trigger a fallback. In that + case, we should fallback earlier and do the operation in place. + + Signed-off-by: Chris Wilson + + src/cairo-compositor-private.h | 3 +++ + src/cairo-mask-compositor.c | 27 +++++++++++++++++++++++---- + src/cairo-xlib-render-compositor.c | 24 ++++++++++++------------ + 3 files changed, 38 insertions(+), 16 deletions(-) + +commit 1bcd59ef4c9dceaefa51ec6db1f5240d75940724 +Author: Martin Robinson +Date: Wed Jan 9 14:16:59 2013 -0800 + + gl/msaa: Rely on the stencil buffer to cache the clip + + When using a texture surface the depth/stencil buffer is private to + cairo so we can rely on the fact that any previously painted clip is + still valid. + + We also only scissor when there's a previously painted clip on the + stencil buffer, otherwise we disable the scissor test. This fixes a few + test cases. + + src/cairo-gl-composite.c | 58 +++++++++++++++++++++++++++++------------- + src/cairo-gl-msaa-compositor.c | 4 +++ + src/cairo-gl-private.h | 1 + + 3 files changed, 46 insertions(+), 17 deletions(-) + +commit d524697ede85d36e4f88fa44d6a8b884685d804b +Author: Martin Robinson +Date: Tue Jan 8 17:08:52 2013 -0800 + + gl/msaa: No need to set the clip when masking + + After 5e9083f882859201c5df18fc870577a224f88cbb there's no need to set a + clip on the cairo_gl_composite_t when masking. Clips are converted to + traps and rendered directly when masking now. + + src/cairo-gl-msaa-compositor.c | 1 - + 1 file changed, 1 deletion(-) + +commit 17418371b6755ef22b6d0c5787f71de3005e0730 +Author: Chris Wilson +Date: Wed Jan 9 15:06:28 2013 +0000 + + xcb: _cairo_scaled_font_reset_cache does it own locking + + So we can drop ours. + + Signed-off-by: Chris Wilson + + src/cairo-xcb-surface-render.c | 2 -- + 1 file changed, 2 deletions(-) + +commit dd20c1f4d6419238bbb37fb93a48986f83c6e6c2 +Author: Chris Wilson +Date: Wed Jan 9 12:38:09 2013 +0000 + + xlib: map-to-image requires an extents + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 351a9e756d0863ae7408c6d43a622620daa0c354 +Author: Chris Wilson +Date: Wed Jan 9 12:31:10 2013 +0000 + + stroke: Flip the dev slope as well for computing the cusp on a degeneracy + + Otherwise, the join think it starts and end in exactly the same + direction and elimiates the round capping. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-traps.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 14720cd0dbc325a2140fbd5b2a7ce4b257ae5f5e +Author: Chris Wilson +Date: Wed Jan 9 12:11:25 2013 +0000 + + gstate: Use the polygon intermediate for geometry queries + + Signed-off-by: Chris Wilson + + src/cairo-gstate.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit a942938e90a219a0b88153f9fa96c606ce644ef1 +Author: Chris Wilson +Date: Wed Jan 9 00:36:13 2013 +0000 + + scaled-font: Fix use after free when clearing the glyph cache + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit c5b353c3725a1a8c116b790df4206f060d64eb5c +Author: Chris Wilson +Date: Tue Jan 8 22:56:28 2013 +0000 + + scaled-font: Make reset-font-cache threadsafe + + Stop trying to workaround the destroy-callback requiring the font mutex + as we already hold the mutex whilst cleaning up the font caches. + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 66 +++++++++++++++++++++++-------------------------- + 1 file changed, 31 insertions(+), 35 deletions(-) + +commit d1184b69e8871180b7b357a02d1a0bed3e68d897 +Author: Martin Robinson +Date: Thu Feb 2 20:38:51 2012 -0800 + + gl: Do less work when acquiring and releasing devices + + After acquiring a GL device and the same GL context, surface, and + display combination is already active outside of Cairo, do not ask EGL + or GLX to change the current context as that may cause a flush on some + drivers. Also do not unset the context when releasing the device for the + same reason. + + src/cairo-egl-context.c | 64 ++++++++++++++--- + src/cairo-glx-context.c | 78 ++++++++++++++++---- + test/Makefile.sources | 1 + + test/gl-device-release.c | 182 +++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 301 insertions(+), 24 deletions(-) + +commit 7401455cb4136473521b9f33b09944aa0bc66971 +Author: Chris Wilson +Date: Tue Jan 8 17:52:04 2013 +0000 + + image: Allocate a temporary buffer for inline span composition + + Allow the inpline span compositor to operate on wider images than its + temporary buffer by allocating a scanline mask. + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +commit 0d38518c38fec68a1fa8cf9d3ae946faa08d6c42 +Author: Chris Wilson +Date: Tue Jan 8 18:52:08 2013 +0000 + + scaled-font: Remove a non-threadsafe double-freeze assert + + Sadly we cannot check ahead of acquiring the lock whether we hold the + lock. Just have to rely on lockdep. + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit e4acba6d1ddfe1c6d27b5a77edccea9d69b178f8 +Author: Chris Wilson +Date: Tue Jan 8 16:38:11 2013 +0000 + + xlib/shm: Only destroy an existing damage + + _cairo_damage_destroy() does not like to be passed a NULL. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 2ed484817ef3a5084dc65a2ae1acdef551acd107 +Author: Chris Wilson +Date: Tue Jan 8 16:06:02 2013 +0000 + + xlib/shm: Discard damage upon shm finish + + Both to make sure we do not leak the memory, but to also prevent + _cairo_xlib_surface_put_shm() from operating upon the finished shm + surface after the display is closed. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=58253 + Signed-off-by: Chris Wilson + + src/cairo-damage-private.h | 3 +++ + src/cairo-damage.c | 7 +++++++ + src/cairo-xlib-surface-shm.c | 3 +++ + 3 files changed, 13 insertions(+) + +commit b5dcc8ce4450de1e48fd0586fddb5ed658719b28 +Author: Chris Wilson +Date: Tue Jan 8 11:20:08 2013 +0000 + + scaled-font: Hold the scaled font mutex whilst reaping from the global cache + + If we need to reap the global cache, this will call back into the scaled + font to free the glyph page. We therefore need to be careful not to run + concurrently with a user adding to the glyph page, ergo we need locking. + To complicate matters we need to be wary of a lock-inversion as we hold + the scaled_font lock whilst thawing the global cache. We prevent the + deadlock by careful ordering of the thaw-unlock and by inspecting the + current frozen state of the scaled-font before releasing the glyph + page. + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit c4ea7b13b406bf0ea1dc9b337010131d3704bc4a +Author: Chris Wilson +Date: Tue Jan 8 13:35:43 2013 +0000 + + scaled-font: Assert if attempting to finish a frozen font + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 4d4bf8fddff49d349e03282ffa827f6f4659e3fe +Author: Chris Wilson +Date: Tue Jan 8 14:56:07 2013 +0000 + + scaled-font: Free the cached glyphs from the font before taking the global lock + + In the case of a recording surface we may recurse into the global glyph + cache so we need to be careful and stage the ordering of how we free the + glyphs. So first we finish any information and surfaces from the scaled + font glyph cache (and so triggering recursion into other scaled fonts) + and then take the global cache and remove our pages. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54950 + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 44a093eb95c950b0e8f2d7d1cdb9719cb8a550f7 +Author: Chris Wilson +Date: Tue Jan 8 14:58:41 2013 +0000 + + scaled-font: Always hold the mutex even for single glyph probes + + The freeze/thaw routines have a side-effect of managing the global glyph + cache in addition to taking the mutex on the font. If we don't call + them, we may end up indefinitely keeping the global glyph cache frozen + (effectively leaking glyphs to the maximum of all open fonts) and + triggering asserts. + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 41 +++++++++++++++++++++-------------------- + 1 file changed, 21 insertions(+), 20 deletions(-) + +commit 80cc532271d7e94ad02732841fbcdc811cce8754 +Author: Chris Wilson +Date: Tue Jan 8 13:47:23 2013 +0000 + + script: Thaw the scaled font cache on the error path + + Signed-off-by: Chris Wilson + + src/cairo-script-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e1307da8616027004dd6c901017a667b1503781d +Author: Chris Wilson +Date: Tue Jan 8 12:53:24 2013 +0000 + + script: Simply exchange source/dest images for _set_source_image + + But note we can only do the exchange if they do indeed match and + there are no other references (the objects are only on the stack). + + Signed-off-by: Chris Wilson + + util/cairo-script/cairo-script-operators.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +commit 146da77d85b304651949a819bc8b0a74819f0416 +Author: Chris Wilson +Date: Tue Jan 8 12:19:33 2013 +0000 + + script: Attempt to decompress images in place + + Signed-off-by: Chris Wilson + + perf/cairo-perf-trace.c | 16 +- + util/cairo-script/cairo-script-interpreter.h | 7 + + util/cairo-script/cairo-script-operators.c | 391 +++++++++++++++------------ + 3 files changed, 247 insertions(+), 167 deletions(-) + +commit 5f2e89660d5e38d8e2682945962521958f150825 +Author: Chris Wilson +Date: Mon Jan 7 13:11:06 2013 +0000 + + image: Call pixman without a mask for opaque regions of inplace_spans + + Speedups + ======== + firefox-paintball 59462.09 -> 40928.76: 1.45x speedup + firefox-fishtank 43687.33 -> 34627.78: 1.26x speedup + firefox-tron 52526.00 -> 45754.73: 1.15x speedup + + However in order to avoid a regression with firefox-talos-svg we need to + prevent splitting up the scanline when using a gradient source. + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 57 ++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 47 insertions(+), 10 deletions(-) + +commit a73e7ff0186176bc82cd3ae1432c054c1fd3aebd +Author: Chris Wilson +Date: Sun Jan 6 11:29:27 2013 +0000 + + xlib: Simplify source creation by use of map-to-image + + We were open-coding the functionality of map-to-image inside the source + creation routines. so refactor to actually use map-to-image instead. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 92 ++++++++++++++++++------------------------------- + 1 file changed, 33 insertions(+), 59 deletions(-) + +commit 4f142f3a7bf24b659c5caccab3a1aedd6b680909 +Author: Chris Wilson +Date: Sun Jan 6 10:32:25 2013 +0000 + + xlib/shm: Only mark the shm pixmap as active if we upload into it + + Be more strict with when we mark the pixmap as active so that we only + wait for the actual XCopyArea involving the pixmap to complete. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 45a4b42a361eb791c571b201e11c3505a0a1a396 +Author: Chris Wilson +Date: Fri Jan 4 17:32:46 2013 +0000 + + script: Recompress strings using LZO whilst binding traces + + Try using the lighter-weight LZO decompressor in an effort to speed up + replays (at the cost of making the bound traces slightly larger). + Presuming that with the slight increase in file size (from -1% to +10%), + the file data remains in the readahead buffer cache, replays see a + performance improvement of between 5-10%. + + Signed-off-by: Chris Wilson + + configure.ac | 12 ++ + util/cairo-script/Makefile.am | 2 +- + util/cairo-script/cairo-script-file.c | 32 ++++- + util/cairo-script/cairo-script-objects.c | 3 + + util/cairo-script/cairo-script-operators.c | 45 +++++-- + util/cairo-script/cairo-script-private.h | 5 + + util/cairo-script/cairo-script-scanner.c | 184 ++++++++++++++++++++++------- + 7 files changed, 227 insertions(+), 56 deletions(-) + +commit 9194904fa838a115b4dc58e5bff7a235cc2a9a7a +Author: Martin Robinson +Date: Fri Jan 4 16:31:01 2013 -0800 + + gl: Better handling of clear surfaces + + When clearing a GL surface, set is_clear to true, and when mapping to an + image, handle is_clear like surfaces without modification. Additionally, + explicitly clear surfaces created via cairo_surface_create_similar. + + src/cairo-gl-surface.c | 43 +++++++++++++++++++++++++++++++++++++------ + 1 file changed, 37 insertions(+), 6 deletions(-) + +commit 9bff4508443abe002fcb0ffdb9b1897272f1c588 +Author: Martin Robinson +Date: Fri Jan 4 15:47:13 2013 -0800 + + boilerplate/glx: Add a target with multisampling and stencil support + + Add a gl-window target that supports multisampling. This is useful for + testing the MSAA backend on the default framebuffer. + + boilerplate/cairo-boilerplate-glx.c | 170 ++++++++++++++++++++---------------- + 1 file changed, 96 insertions(+), 74 deletions(-) + +commit 8cd604e18adc1dbe22303d5c57dae374d7e8cd2b +Author: Chris Wilson +Date: Fri Jan 4 14:03:40 2013 +0000 + + gobject: Fix my typo s/TEST/TEXT/ in the previous commit + + Again reported by Kouhei Sutou, who I am grateful for his deligence. + + util/cairo-gobject/cairo-gobject.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a4f221498c20bd9bd6178fddc1ba481ff3fd6cb3 +Author: Kouhei Sutou +Date: Fri Jan 4 12:18:29 2013 +0000 + + gobject: Fix "text_cluster_flags_get_type" typo + + The macro missed the text from the name, rendering it useless. + + util/cairo-gobject/cairo-gobject.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9dde964553f74ccbc037b13ca83d0abb46adb194 +Author: Henry Song +Date: Thu Jan 3 16:03:55 2013 -0800 + + gl/msaa: Only clear parts of the stencil buffer we will use + + Writing to the stencil buffer can be expensive, so when using the + stencil buffer for clipping only clear the clip extent. When using the + stencil buffer to prevent overlapping rendering during stroking, only + clear the approximate stroke extents. + + src/cairo-gl-composite.c | 17 ++++++++++------- + src/cairo-gl-msaa-compositor.c | 34 ++++++++++++++++++++++++++++++---- + src/cairo-gl-private.h | 4 ++++ + 3 files changed, 44 insertions(+), 11 deletions(-) + +commit 5e9083f882859201c5df18fc870577a224f88cbb +Author: Alejandro G. Castro +Date: Wed Mar 7 14:38:52 2012 +0100 + + gl/msaa: Avoid the stencil buffer when possible during masking + + In this case we can draw the clip path and avoid the stencil buffer, + which can be expensive. + + src/cairo-gl-msaa-compositor.c | 68 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 53 insertions(+), 15 deletions(-) + +commit dd850583a7f57a666da6af218841bb10b536df46 +Author: Henry Song +Date: Tue Mar 13 08:43:24 2012 -0700 + + gl/msaa: Add full support for masking with the SOURCE operator + + Since OpenGL does not have a means to represent a masking SOURCE + operation in one step, we use two steps combined with the ADD + operator. + + src/cairo-gl-composite.c | 108 +++++++++++++++++++++++++---------------- + src/cairo-gl-msaa-compositor.c | 84 +++++++++++++++++++++++++++++--- + src/cairo-gl-private.h | 9 ++++ + 3 files changed, 152 insertions(+), 49 deletions(-) + +commit c743e93451f467782b861c67a6894df26082d5c6 +Author: Chuanbo Weng +Date: Wed Jan 2 18:03:44 2013 +0100 + + gl: Support the GL_IMG_texture_npot extension + + This extension, used by older PowerVR drivers, is functionally + equivalent to the GL_OES_TEXTURE_NPOT extension. + + src/cairo-gl-device.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ae1724ced98b86aaf97c7be9c4294fa3823d7350 +Author: Chris Wilson +Date: Thu Jan 3 13:46:20 2013 +0000 + + Add missing local slim proto for cairo_recording_surface_create + + Dependency introduced in 749ef6be4d11b95d666b0e5fe06df926b828d655 + + Signed-off-by: Chris Wilson + + src/cairoint.h | 1 + + 1 file changed, 1 insertion(+) + +commit 872a92b874270ac3b83b0e206fb5b15a7405502a +Author: Chris Wilson +Date: Thu Jan 3 13:30:13 2013 +0000 + + scaled-font: Mention ownership of returned object from get_font_face() + + As suggested by Simon Sapin. + + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 734a541dc34565f40fe0ae4e93c81c4849198a79 +Author: Chris Wilson +Date: Thu Jan 3 13:01:34 2013 +0000 + + xlib: Avoid copying the source twice if it is an image + + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 37 +++++++++++++++++++++++++++---------- + 1 file changed, 27 insertions(+), 10 deletions(-) + +commit ecc8c28b24cb5fcd85aee5d4c82b9ad72c87fa69 +Author: Kouhei Sutou +Date: Thu Jan 3 12:37:43 2013 +0000 + + gobject: Add the correct macro name for the hint-metrics type + + s/CAIRO_GOBJECT_TYPE_HNT_METRICS/CAIRO_GOBJECT_TYPE_HINT_METRICS/ + + However, as we have already released the broken headers, we need to + preserve that mistake in case applications are already using. Since it + is just a #define, there is little associated cost with carrying both + the incorrect spelling and the corrected define. + + util/cairo-gobject/cairo-gobject.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5bc1b1f6aac108d9a3963352ad774bb4fcd69e28 +Author: Chris Wilson +Date: Fri Aug 24 17:22:34 2012 +0100 + + stroke: Make the incremental trapezoid stroker optionally available again + + Whilst it cannot handle self-intersecting strokes (which includes the + antialias region of neighbouring lines and joints), it is about 3x + faster to use than the more robust algorithm. As some backends delegate + the rendering, the quality may still be preserved and so they should be + responsible for choosing the appropriate method for generation of the + stroke geometry. + + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-cogl-surface.c | 6 +- + src/cairo-path-stroke-traps.c | 1120 ++++++++++++++++++++++++++++++++++++ + src/cairo-path-stroke.c | 12 +- + src/cairo-recording-surface.c | 12 +- + src/cairo-rectangle.c | 2 +- + src/cairo-stroke-style.c | 39 ++ + src/cairo-traps-compositor.c | 37 +- + src/cairo-traps-private.h | 9 + + src/cairo-traps.c | 252 ++++++++ + src/cairoint.h | 21 +- + src/test-base-compositor-surface.c | 8 +- + 12 files changed, 1489 insertions(+), 30 deletions(-) + +commit 74941f822015cc50cd8477d0cf97f1a70dbff60b +Author: Chris Wilson +Date: Wed Jan 2 22:27:55 2013 +0000 + + xlib: Use SHM transport for ordinary image uploads + + In theory this should just save a single copy, however PutImage will + break up requests into a series of scanlines requests which is less + efficient than the single-shot transfer provided by ShmPutImage. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 100 ++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 77 insertions(+), 23 deletions(-) + +commit bf2a04c5ab91c93d4d188afd030b3004c67a180f +Author: Chris Wilson +Date: Thu Jan 3 12:24:14 2013 +0000 + + xlib/shm: Fix typo in creation of a SHM image + + Pass along the size the caller requests, not the size of the related + drawable. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit c29ab389fb2b3b91c895f2df684b0e9af8225d12 +Author: Chris Wilson +Date: Sun Dec 30 12:32:45 2012 +0000 + + gl: Provide a fast emitter for solid spans + + Signed-off-by: Chris Wilson + + src/cairo-gl-composite.c | 55 +++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 50 insertions(+), 5 deletions(-) + +commit d3848521c497dbcd3d9ae0fab34fa70c72752e60 +Author: Chris Wilson +Date: Sun Dec 30 12:32:45 2012 +0000 + + gl: Provide a fast emitter for solid glyphs + + Signed-off-by: Chris Wilson + + src/cairo-gl-composite.c | 62 ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 49 insertions(+), 13 deletions(-) + +commit 127dd466695dcb05e6178e4ed2471dba1b229d17 +Author: Chris Wilson +Date: Sun Dec 30 12:21:11 2012 +0000 + + gl: Use vfunc for vertex emission + + In order to overload the emitters in future to provide specialised + routines for the common types of operands, begin by switching the + current users over to a vfunc interface. + + Signed-off-by: Chris Wilson + + src/cairo-gl-composite.c | 107 +++++++++++++++++++++++++++---------- + src/cairo-gl-glyphs.c | 11 ++-- + src/cairo-gl-private.h | 48 ++++++++++------- + src/cairo-gl-spans-compositor.c | 115 ++++++++++++++++++++++------------------ + src/cairo-gl-surface.c | 2 +- + src/cairo-gl-traps-compositor.c | 21 ++++---- + 6 files changed, 190 insertions(+), 114 deletions(-) + +commit 9558cb62c6a3ed59a53f00f740a261251b9b64b2 +Author: Chris Wilson +Date: Sat Dec 29 18:30:48 2012 +0000 + + perf/chart: Contract the default output filenames + + Signed-off-by: Chris Wilson + + perf/cairo-perf-chart.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit fbd4864995e261a4cfc5e53273b53ce8a22d72db +Author: Chris Wilson +Date: Sat Dec 29 18:30:48 2012 +0000 + + perf/chart: Show the geometric average as an extra column + + Signed-off-by: Chris Wilson + + perf/cairo-perf-chart.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 111 insertions(+), 1 deletion(-) + +commit 71028865fae38bf26c45aae72e0a6773a19a640d +Author: Chris Wilson +Date: Sat Dec 29 15:05:53 2012 +0000 + + Revert "xlib/shm: Do not trigger a surplus event from XShmPutImage" + + This reverts commit c97f2d4acd5c4a1a4b839c72626f84e242e60b23. + + Testing suggests that keeping that event is a win; so do so. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c97f2d4acd5c4a1a4b839c72626f84e242e60b23 +Author: Chris Wilson +Date: Sat Dec 29 14:56:24 2012 +0000 + + xlib/shm: Do not trigger a surplus event from XShmPutImage + + As our lazy event mechanism is sufficient for tracking when to reuse shm + memory, and the events are not necessary for ShmPut/ShmGetImage paths. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0c84a5474d4e90fc9361ccbb0ebc3d0580bad82b +Author: Chris Wilson +Date: Sat Dec 29 11:41:17 2012 +0000 + + xlib/shm: Rate-limit events and only use as necessary + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 4 +- + src/cairo-xlib-surface-shm.c | 110 ++++++++++++++++++++++++++----------- + 2 files changed, 79 insertions(+), 35 deletions(-) + +commit 21db1c99108dc84166cbd9641f3256b22f571ee3 +Author: Martin Robinson +Date: Fri Dec 28 14:10:29 2012 -0800 + + gl: Cleanup selection of multisampling mode + + Fold the choice of multisampling mode into the cairo_gl_composite_t + structure itself. This makes it more similar to other settings. + + src/cairo-gl-composite.c | 20 +++++++++----------- + src/cairo-gl-msaa-compositor.c | 14 +++++++++----- + src/cairo-gl-private.h | 9 ++++----- + 3 files changed, 22 insertions(+), 21 deletions(-) + +commit 7d02e2d62d1d2d2852f256905af60f418216b9ea +Author: Chris Wilson +Date: Sun Dec 23 11:12:21 2012 +0000 + + xlib/shm: Populate send_event and serial + + Hopefully this random choice is more meaningful than random junk. + + Bugzilla; https://bugs.freedesktop.org/show_bug.cgi?id=58672 + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e748c122435c1047894f73c14266bc81ad2edecd +Author: Adrian Johnson +Date: Sat Dec 22 18:34:43 2012 +1030 + + doc: Add CAIRO_MIME_TYPE_UNIQUE_ID to list of supported mime types + + src/cairo-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4e751fcb031557e6ad720f5bf5f14e181564ab9b +Author: David Maxwell +Date: Thu Oct 11 08:52:36 2012 -0800 + + type1-subset: always include subroutine 4 (hint replacement idiom) + + http://lists.cairographics.org/archives/cairo/2012-December/023846.html + + src/cairo-type1-subset.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b94a519aad3d5b50aa6de47ee16ee6a099de9791 +Author: Behdad Esfahbod +Date: Fri Dec 21 18:40:08 2012 -0500 + + [ft] Fix resizing of bitmap fonts + + Say, you were asking cairo for a font at 200px. For bitmap-only fonts, + cairo was finding the closes strike size and using it. If the strike + was at 20px, well, that's what you were getting. We now scale that 20px + strike by a factor of 10 to get the correct size rendering. + + Note that by itself this patch doesn't change much on the Linux desktop. + The reason is that the size you are interested in (eg. 200px) is lost by + fontconfig. When you request a font at 200px, fontconfig returns a font + pattern that says 20px, and so the next layers thing you want a font at + 20px. To address that, one also needs a piece of fontconfig config that + puts the 200 back into the pixelsize. Something like this: + + + + false + + + + size + dpi + 0.0138888888888 + + + + + I'm going to try to upstream this config so it will be enabled by + default. The config can be a bit smarter. For example, if + metricshinting is enabled and the size difference is small, we may as + well not scale. + + The nice thing about this is that the configuration of whether and when + to scale bitmaps will be done in fontconfig, not cairo / Qt / ... code. + + src/cairo-ft-font.c | 66 +++++++++++++++++++++++++++-------------------------- + 1 file changed, 34 insertions(+), 32 deletions(-) + +commit 1404ed9692af1958b4090c46d1a27e0fe4a5616e +Author: Behdad Esfahbod +Date: Fri Dec 21 18:35:41 2012 -0500 + + [ft] Remove ancient check for FT_Bitmap_Size.y_ppem + + That member is available in the version of FreeType we require. + + configure.ac | 7 ------- + src/cairo-ft-font.c | 11 +---------- + 2 files changed, 1 insertion(+), 17 deletions(-) + +commit 867c876b0e7ce3dcc8afc7227ef6317701a6dda0 +Author: Behdad Esfahbod +Date: Wed Nov 7 14:30:35 2012 -0800 + + [Minor] Improve logging + + src/cairo-xlib-render-compositor.c | 2 ++ + src/cairoint.h | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 5d21c9e224617110678a5b854a6a41049a02fca2 +Author: Adam Jackson +Date: Tue Dec 18 13:33:13 2012 -0500 + + xlib/shm: Fix memory leak + + Despite subclassing image surfaces, we never called down to the image + surface destructor, so we leaked a pixman_image_t every time. + + Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=882976 + Signed-off-by: Adam Jackson + + src/cairo-xlib-surface-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 51435eeb0c4d9e53d76dae8b5af279ad518a05f8 +Author: Uli Schlachter +Date: Mon Dec 17 18:33:22 2012 +0100 + + xcb: Fix xcb-huge-subimage + + This teaches the xcb backend how to split up a PutImage request for a subimage + into multiple requests. The backend already does the same for "normal" PutImage + where it doesn't have to assemble the image from various rows. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-connection-core.c | 72 +++++++++++++++++++++++++++++++++-------- + 1 file changed, 58 insertions(+), 14 deletions(-) + +commit 5fb364287f96e4457d8df107ba3d0dc3f99f6f04 +Author: Uli Schlachter +Date: Mon Dec 17 18:29:21 2012 +0100 + + test: Add xcb-huge-subimage + + This creates an image surface with a non-natural stride and paints it to a + similar surface. + + In the xcb backend, this causes a call to _cairo_xcb_connection_put_subimage() + which tries to send a huge PutImage request. As a result, xcb kills the X11 + connection. + + Signed-off-by: Uli Schlachter + + test/Makefile.sources | 1 + + test/reference/xcb-huge-subimage.ref.png | Bin 0 -> 97 bytes + test/xcb-huge-subimage.c | 81 +++++++++++++++++++++++++++++++ + 3 files changed, 82 insertions(+) + +commit 749ef6be4d11b95d666b0e5fe06df926b828d655 +Author: Uli Schlachter +Date: Mon Dec 17 17:45:25 2012 +0100 + + context: Use recording surfaces for unbounded groups + + The old code uses an uninitialized variable for the extents of the group that is + created. This patch makes it use an unbounded recording surface instead. + + This has the implicit assumption that everything that is unbounded smells like a + recording surface. Let's see when this assumption breaks. :-) + + http://lists.cairographics.org/archives/cairo/2012-October/023585.html + + Signed-off-by: Uli Schlachter + + src/cairo-default-context.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 433a5829d7c38a9301346fc5a643e623565c1625 +Author: Martin Robinson +Date: Mon Dec 17 17:53:33 2012 +0100 + + Revert "gl/msaa: Share the depth/stencil buffer among all surfaces" + + This was pushed mistakenly. Sorry. + + This reverts commit a7d684e6fe4bbeea2262276aaa57bb2a47c401df. + + src/cairo-gl-device.c | 118 ++++++++++++++----------------------------------- + src/cairo-gl-private.h | 13 ------ + src/cairo-gl-surface.c | 31 ++----------- + 3 files changed, 38 insertions(+), 124 deletions(-) + +commit 000a137a6554cfc350407f3b719fb4aa3a1c33c6 +Author: Uli Schlachter +Date: Mon Dec 17 17:12:59 2012 +0100 + + boilerplate-xcb: Ignore MappingNotify events + + The boilerplate code makes sure that our tests didn't cause any X11 errors or + X11 events, because those might confuse API users. + + However, when the keyboard layout changes, every connection gets a MappingNotify + event. This means that the test and performance test suites failed when the + keyboard layout was changed while they are running. + + Fix this by ignoring MappingNotifies. + + Reported by Arthur Huillet on IRC. + + Signed-off-by: Uli Schlachter + + boilerplate/cairo-boilerplate-xcb.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 9d9aa04b60e24542b6b2a4c6bf87115db7736c2f +Author: Martin Robinson +Date: Mon Dec 3 16:08:23 2012 -0800 + + gl: Add BGRA download support for GLES2 + + Some OpenGLES2 drivers support downloading BGRA data. On little-endian + systems BGRA and GL_UNSIGNED_BYTe is equivalent to the typical + cairo_image_t format, so this can prevent CPU bit swizzling for + operations that involve images. + + src/cairo-gl-device.c | 18 ++++++++++++++++++ + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 51 +++++++++++++++++++++++++------------------------- + 3 files changed, 44 insertions(+), 26 deletions(-) + +commit a7d684e6fe4bbeea2262276aaa57bb2a47c401df +Author: Martin Robinson +Date: Mon Mar 5 23:11:19 2012 -0800 + + gl/msaa: Share the depth/stencil buffer among all surfaces + + Instead of allocating a depth/stencil buffer for all surfaces, share a + common buffer that's the size of the largest surface. This reduces + video memory usage when there are many GL surfaces. + + src/cairo-gl-device.c | 118 +++++++++++++++++++++++++++++++++++-------------- + src/cairo-gl-private.h | 13 ++++++ + src/cairo-gl-surface.c | 31 +++++++++++-- + 3 files changed, 124 insertions(+), 38 deletions(-) + +commit ba4a4eae051cd932e59e3092ef36d4f6cded0159 +Author: Chuanbo Weng +Date: Tue Oct 2 13:58:49 2012 +0200 + + gl/msaa: Use GL_IMG_multisampled_render_to_texture when available + + Some OpenGLES platforms support GL_IMG_multisampled_render_to_texture + instead of GL_EXT_multisampled_render_to_texture. + + src/cairo-gl-device.c | 8 ++++++++ + src/cairo-gl-dispatch-private.h | 10 +++++++--- + src/cairo-gl-dispatch.c | 26 ++++++++++++++++++++++++++ + 3 files changed, 41 insertions(+), 3 deletions(-) + +commit 3bedff0c009e645fff2d6f40976b4483871e73e1 +Author: Henry Song +Date: Tue May 15 20:32:44 2012 +0200 + + gl: Properly disable ctx->spans when necessary + + When compositing starts, if we are not using the spans compositor, we + should set the spans member of the context to false. + + src/cairo-gl-composite.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 18e7234c7e56ca26d7d7a2e29b1da2bb6944bb34 +Author: Henry Song +Date: Wed May 23 15:12:16 2012 +0200 + + gl/msaa: Also setmsaa_active to true for non-texture surfaces + + This is important because there are places in the code where msaa_active + is used to decide whether or not to complete an operation with + multisampling or not. + + src/cairo-gl-device.c | 1 + + 1 file changed, 1 insertion(+) + +commit 9f43f096b22a13f02d638b86b4460c7ed66d3c96 +Author: Henry Song +Date: Sat Dec 1 17:08:56 2012 +0000 + + gl: Flush context upon evicting a gradient + + As the random selection of a gradient can possible destroy the currently + active gradient, we need to flush the context in order to flush any + references to the texture before deletion. + + src/cairo-gl-gradient.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit a0fb1391315033de54368715a8855aedea258e67 +Author: Chris Wilson +Date: Sat Dec 1 09:21:15 2012 +0000 + + mempool: Reduce the assertion into an alignment adjustment for the base + + Instead of asserting that the caller passed in a chunk-aligned base + pointer, just perform the fixup whilst initialising the mempool. This + means that the caller (xcb!) cannot assume that the mempool->base is + then the same base pointer as passed in and so needs to store it + separately for use in computing SHM offsets. + + Signed-off-by: Chris Wilson + + src/cairo-mempool.c | 9 +++++++++ + src/cairo-xcb-shm.c | 14 +++++++------- + 2 files changed, 16 insertions(+), 7 deletions(-) + +commit 153b11612f34294241429b53722839984f367f2e +Author: Chris Wilson +Date: Wed Nov 28 09:57:29 2012 +0000 + + script: Fix map-to-image/unmap stack manipulations + + The idiom (and expectation) for surface operators is that it leaves the + surface on the stack for the next operation. Also we need to hold onto a + surface reference for objects put onto the stack, yet for the + map-to-image return we did not own one. + + Signed-off-by: Chris Wilson + + util/cairo-script/cairo-script-operators.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit dfbf80a57d161707d105d1b5711c85890fe18a6d +Author: Chris Wilson +Date: Tue Nov 27 12:25:56 2012 +0000 + + trace: Do not forcibly add surfaces to the dictionary + + Adjust the stack manipulation to avoid moving an unknown surface to + the dictionary. + + Reported-by: Dongyeon Kim + Signed-off-by: Chris Wilson + + util/cairo-trace/trace.c | 50 +++++++++++++++++++++++++++++++----------------- + 1 file changed, 32 insertions(+), 18 deletions(-) + +commit 376d39121c0d4eba8f0a22be71f782ce18e50923 +Author: Chris Wilson +Date: Tue Nov 27 12:25:56 2012 +0000 + + trace: Fix operand emission for map-to-image and unmap-image + + Reported-by: Dongyeon Kim + Signed-off-by: Chris Wilson + + util/cairo-trace/trace.c | 58 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 34 insertions(+), 24 deletions(-) + +commit 62b795fe52c73ad58101c101aa77449f4b61a576 +Author: Zozó Teki +Date: Sat Nov 10 08:35:33 2012 +0000 + + recording: Append new elements to the end of the bbtree chain + + I have noticed that some of my objects were lost when drawing them on + a recording surface and playing them back. Later elements with the same + extents as a prior one tend to disappear from the chain of headers + having similar extents. After doing some debugging, I found that they + are not properly added to the bbtree during playback, and were instead + clobbering the existing chain. + + src/cairo-recording-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 6ed1da67b5814c5ff062831f17621a585f81d704 +Author: Chris Wilson +Date: Sun Nov 4 15:34:34 2012 +0000 + + version: Post-release bump to 1.12.9 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cc162915a55cc67587677352bd9e389f16117853 +Author: Chris Wilson +Date: Sun Nov 4 14:23:09 2012 +0000 + + 1.12.8 release + + NEWS | 42 ++++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 43 insertions(+), 1 deletion(-) + +commit cf07bd866dc3fdbfaf3d7e7fdc83cc2a4ef5698c +Author: Adrian Johnson +Date: Sat Nov 3 11:08:01 2012 +1030 + + type1-subset: remove unused variable + + src/cairo-type1-subset.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 9f537156adcab5e7a9b21cd2bb5cc7676db52713 +Author: Adrian Johnson +Date: Sat Nov 3 11:07:02 2012 +1030 + + type1-subset: fix memory leak + + src/cairo-type1-subset.c | 52 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 33 insertions(+), 19 deletions(-) + +commit 724c6dfa9521e887682029add879c2fcdd518b14 +Author: Chris Wilson +Date: Fri Nov 2 16:54:46 2012 +0000 + + xlib/shm: Need IncludeInferiors when creating the source fallback + + Reported-by: Benjamin Otte + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 1f4d05b55c96347aa4240190fda27f951b00c539 +Author: Chris Wilson +Date: Fri Nov 2 14:52:03 2012 +0000 + + stroke: Fix calling '_cairo_spline_intersect' for in-bounds checking of splines + + Fixes stroke-clipped, within reason. There still remains some + antialiasing noise (between rendering the circle piecewise and wholly) + worth investigating - but that is probably an artefact of switching + between analytical rendering modes in the scanline + rasterisation. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2dd4ff32064c3c564e0902ae07330272e6676c22 +Author: Chris Wilson +Date: Fri Nov 2 14:48:40 2012 +0000 + + test: Add stroke-clipped + + Exercise a bug in the determine of clip-bounds when stroking, as + reported by ed44. + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/reference/stroke-clipped.ref.png | Bin 0 -> 5886 bytes + test/stroke-clipped.c | 54 ++++++++++++++++++++++++++++++++++ + 3 files changed, 55 insertions(+) + +commit e9d45705844f67f4c8342d68fe35ad08ea008e30 +Author: Chris Wilson +Date: Thu Nov 1 11:42:46 2012 +0000 + + pen: Tighten checking for bevel (start==stop) joins + + From commit d7f5a1bec421d6c7b92d16daae681fa31ac7c212 + Author: Chris Wilson + Date: Wed Oct 31 09:27:52 2012 +0000 + + pen: First check whether the in/out edges lie within the single pen vertex + + makes a couple of tests much happier. + + Signed-off-by: Chris Wilson + + src/cairo-pen.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 90860241bb8f8eff3c1ab40641b1bfca0798b238 +Author: Chris Wilson +Date: Thu Nov 1 09:47:00 2012 +0000 + + gl: Tune the default VBO size to reduce overhead on embedded devices + + Henry Song found that the 256k buffers were disadvantageous on his + embedded hardware. As there is no obvious right value for the default + VBO size, we can tune for the more obvious constraints. + + Based on a patch by Henry Song + Signed-off-by: Chris Wilson + + src/cairo-gl-private.h | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 0c1ff1572f1fc4c11b429e39f7de798030530740 +Author: Chris Wilson +Date: Thu Nov 1 08:45:37 2012 +0000 + + xlib: Fixup standalone header compilation for 'make check' + + Missing include of string.h + + Signed-off-by: Chris Wilson + + src/cairo-xlib-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit b6daf47fa08c74d9672040b2b98ac6dd1f841429 +Author: Chris Wilson +Date: Thu Nov 1 08:39:01 2012 +0000 + + spans: Do not assume that we manage to perform the clip geometrically + + Even for bounded masks, we may fail to perform the clipping + geometrically for a variety of reasons, the prime one being that the + clip has a mixture of antialias settings. So when compositing the + polygon, we need to check whether a clip path still remains and so + requires a clipmask. + + Fixes regression from + + commit cd1004ce19c7ea28c7fedb6464562a08416586c0 + Author: Chris Wilson + Date: Fri May 11 21:20:35 2012 +0100 + + traps,spans-compositor: Avoid mistreating unaligned clips as aligned + + and + + commit 4ea3ace6c810ba090464e48795fac5456f6cdc24 + Author: Chris Wilson + Date: Fri May 11 21:51:44 2012 +0100 + + spans: Only fallback for a clipmask if unbounded + + Reported-by: Dominik Röttsches + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56574 + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 5844dead01db9ddab7f10a4d685bc5ee874d0eba +Author: Chris Wilson +Date: Thu Nov 1 08:37:58 2012 +0000 + + util/show-polygon: Show the limited range of each edge + + Signed-off-by: Chris Wilson + + util/show-polygon.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 48 insertions(+), 4 deletions(-) + +commit 03adea2f50aa10d49ff578389927e7b37e265918 +Author: Chris Wilson +Date: Thu Nov 1 08:37:01 2012 +0000 + + stroke: Precompute the line half-width + + As we regularly recompute stroke->line_width/2 we may as compute it once + during initialisation. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit dbc0d83f2a7a0e6658f3b97b5f9921c44ef6a11f +Author: Chris Wilson +Date: Wed Oct 31 15:18:21 2012 +0000 + + image: Add a couple of tracepoints for spans fallbacks + + References: https://bugs.freedesktop.org/show_bug.cgi?id=56574 + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 3 ++- + src/cairo-spans-compositor.c | 13 ++++++++++--- + 2 files changed, 12 insertions(+), 4 deletions(-) + +commit 9b7ed9b2cd6c9ee4dfab71aed9b7d97b720fceb0 +Author: Chris Wilson +Date: Wed Oct 31 13:15:07 2012 +0000 + + xlib/shm: Fix bogus assertion without shm available + + In particular note that _cairo_xlib_surface_put_shm is indeed called and + is expected to be a no-op when shm is not available. + + Reported-by: Thomas Klausner + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7f5a1bec421d6c7b92d16daae681fa31ac7c212 +Author: Chris Wilson +Date: Wed Oct 31 09:27:52 2012 +0000 + + pen: First check whether the in/out edges lie within the single pen vertex + + In order to prevent underflow when searching for the closing pen vertex, + we first need to be sure that it does not simply lie next to the opening + pen vertex. As a result we were missing many cases that should have been + a bevel (in == out) and generating almost complete round caps instead. + + Reported-by: Dominik Röttsches + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56432 + Signed-off-by: Chris Wilson + + src/cairo-pen.c | 60 +++++++++++++++++--------------- + test/reference/arc-looping-dash.ref.png | Bin 502 -> 464 bytes + test/reference/caps-tails-curve.ref.png | Bin 54750 -> 54314 bytes + test/reference/reflected-stroke.ref.png | Bin 5139 -> 5116 bytes + 4 files changed, 32 insertions(+), 28 deletions(-) + +commit 66625cb46c985321c46b79d2163a4d676d6700ba +Author: Chris Wilson +Date: Tue Oct 30 12:40:41 2012 +0000 + + xlib: Apply the image offsets to the destination rather the source + + So that we can specify the entire source surface as the region to copy + and not introduce clipping errors. + + Fixes regression from + commit c068691ff57c2f6cd750a54db17393c0e132cb00 + Author: Chris Wilson + Date: Fri Aug 17 21:33:54 2012 +0100 + + xlib/shm: Use an impromptu upload ShmSegment + + Reported-by: John Lindgren + Reported-by: Kalev Lember + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56547 + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +commit 65176b7380f0d633da514be1febe16f17b99d876 +Author: Kevin Tardif +Date: Tue Oct 30 00:27:27 2012 -0400 + + type1-subset, cff-subset: Plugged 2 memory leaks + + - _cairo_type1_font_subset_fini doesn't free font->cleartext + - _cairo_cff_font_create can exit without freeing font->font_name and/or + font->data; _cairo_cff_font_load_opentype_cff is called to allocate + font_name, then _cairo_cff_font_load_cff is called to allocate + font->data, then _cairo_cff_font_load_cff's return status is checked + and if it failed, it jumps to fail1. This can cause font_name to leak + since the fail1 target only frees the font variable. In addition, + _cairo_cff_font_load_cff can fail -after- allocating data, and then + data won't be freed either. + + Bug 56566 + + src/cairo-cff-subset.c | 6 +++--- + src/cairo-type1-subset.c | 2 ++ + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit 0c800dc3f64ee030df1cd0a6a1dcd6df71502dea +Author: Adrian Johnson +Date: Tue Oct 30 19:23:30 2012 +1030 + + type1-subset: ensure subroutine numnber is an integer + + src/cairo-type1-subset.c | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit 5a6e1d680a5bf1c4091e74f999abd611abd92334 +Author: Adrian Johnson +Date: Sun Oct 28 20:58:52 2012 +1030 + + type1-subset: restore correct callothersub behavior + + that was removed in d57e652f. Without this subsetting of subroutines + won't work for some fonts. + + src/cairo-type1-subset.c | 35 +++++++++++++++++++++++++++++------ + 1 file changed, 29 insertions(+), 6 deletions(-) + +commit 0e2458697848cf8c89c9d57fa9b64f0ea7bd0877 +Author: Chris Wilson +Date: Sun Oct 28 10:08:39 2012 +0000 + + xlib/shm: Use shmstr.h instead of shmproto.h if available + + Before it was known as shmproto.h, the wire protocol definition was to + be found in shmstr.h, so if we don't have the current version of libXext + try to use the older includes. + + Reported-by: Sebastian Haas + Signed-off-by: Chris Wilson + + configure.ac | 2 +- + src/cairo-xlib-surface-shm.c | 6 +++++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit f18199fcfb3b052c198041fc05156ae3d9e6aee7 +Author: Chris Wilson +Date: Sun Oct 28 10:04:12 2012 +0000 + + xlib/shm: Check for XShm headers + + Not all version of libXext ship the same set of headers, so play safe + and check during configure that we have the headers we depend upon in + the code. + + Reported-by: Sebastian Haas + Signed-off-by: Chris Wilson + + configure.ac | 4 ++ + src/cairo-xlib-surface-shm.c | 99 ++++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 100 insertions(+), 3 deletions(-) + +commit d57e652f08f5ff7c334d01bc071962e6a131928f +Author: Adrian Johnson +Date: Fri Oct 26 23:00:01 2012 +1030 + + type1-subset: parse all operators + + The PDF at bug 56265 contained a Type 1 font that used the "div" + operator to compute the glyph width. As the "div" operator was + not handled by the charstring parser this resulted in an incorrect + glyph width in the PDF output. + + Fix this by upgrading the charstring parsing to handle all Type 1 + operators. + + src/cairo-type1-subset.c | 167 ++++++++++++++++++++++++++++------------------- + 1 file changed, 100 insertions(+), 67 deletions(-) + +commit fdd2082f923012a1354be7086d03f78fb166695b +Author: Chris Wilson +Date: Fri Oct 26 10:51:31 2012 +0100 + + xlib: Check for both X.org and Xorg ServerVendors + + Martin Husemann reported that on his NetBSD machine the vendor was being + reported as "The Xorg Foundation", a non-conformist separatist split of + the Peoples' Liberation Army^W^W^W "The X.Org Foundation". Simply check + for both during initialisation. + + Reported-by: Martin Husemann + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 2 +- + src/cairo-xlib-private.h | 7 +++++++ + src/cairo-xlib-surface-shm.c | 2 +- + 3 files changed, 9 insertions(+), 2 deletions(-) + +commit 00feb8ce530a472abbde445b52d9ae8c99ec97f0 +Author: Chris Wilson +Date: Fri Oct 26 10:51:31 2012 +0100 + + xlib/shm: Sanity check that the server handles XSendEvent with ShmCompletion + + Uli Schlachter suggested it would be wiser to complement our blacklist + of known broken X/libXext with an explicit roundtrip to check for a + BadValue error return when we try to use XSendEvent. + + Suggested-by: Uli Schlachter + Reported-by: Martin Husemann + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 77 +++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 69 insertions(+), 8 deletions(-) + +commit e43f53bf7f3d371116f31f22ab9754b08b5abe7f +Author: Chris Wilson +Date: Mon Oct 22 13:47:11 2012 +0100 + + version: Post release bump to 1.12.7 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fab6958eff35a94cf46e38f19a7e75e10aa2b182 +Author: Chris Wilson +Date: Mon Oct 22 11:07:15 2012 +0100 + + 1.12.6 release + + NEWS | 35 +++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 36 insertions(+), 1 deletion(-) + +commit d49b2284b505e93cd415af4da3cd2cc2d3d168d3 +Author: Gilles Espinasse +Date: Sat Oct 20 20:22:51 2012 +0200 + + configure: fix unrecognized -Wno option + + gcc-4.4 and later accept every -Wno option. So we can test for the + option without no in the name to check if the option is supported. + + Each time a warning is emitted and without this fix, on gcc-4.4 that will + add this warning: + cc1: warning: unrecognized command line option "-Wno-unused-but-set-variable" + + bugs.freedesktop.org #51633, rediffed after 1.12.4 + + Of course this assumes that all compilers will behave like gcc, which is + reasonably implicit in the set of warning flags. + + Signed-off-by: Gilles Espinasse + [ickle: slight modification to test both -W and -Wno variants to ideally + preserve compatability with non-GCC compilers sharing GCC options!] + + build/configure.ac.warnings | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit b12a94b98306d87689bad23dad4c0ec033037046 +Author: Gilles Espinasse +Date: Sat Oct 20 20:22:50 2012 +0200 + + configure: fix PKG_CHECK_MODULES tests displaying no no + + Inside PKG_CHECK_MODULES, AC_MSG_RESULT(no) is already displayed, so the + caller should not use another AC_MSG_RESULT(no). + + Add a comment that empty ACTION-IF-NOT-FOUND is not allowed for + PKG_CHECK_MODULES, but a simple : is enough. + + This is bugs.freedesktop.org #51628, rediffed after 1.12.4 + + Signed-off-by: Gilles Espinasse + + build/aclocal.pkg.m4 | 2 ++ + configure.ac | 41 +++++++++++++++++------------------------ + 2 files changed, 19 insertions(+), 24 deletions(-) + +commit 813143c2205c12923519ce6dcf3c8e10f63f1085 +Author: Gilles Espinasse +Date: Sat Oct 20 23:06:44 2012 +0200 + + ft: Fix compilation on 1.12 without FT_Get_X11_Font_Format + + Signed-off-by: Gilles Espinasse + + configure.ac | 2 +- + src/cairo-ft-font.c | 23 +++++++++++++++++------ + 2 files changed, 18 insertions(+), 7 deletions(-) + +commit c565bad8901dbe66e1402cdc2418986e96e698e3 +Author: Chris Wilson +Date: Fri Oct 19 12:22:58 2012 +0100 + + pen: Relax invisibility criteria from half-tolerance to quarter-tolerance + + Inkscape is one user who sets geometric tolerance to 1.25 pixels when + stroking sub-pixel lines. Whilst we wait for inkscape to set sensible + values for their tolerance, we have to allow through the current values + in order to prevent the fine strokes from disappearing. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=56099 + Signed-off-by: Chris Wilson + + src/cairo-pen.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5041b462d084de8552336275914d30c23bf5dd35 +Author: Chris Wilson +Date: Fri Oct 19 12:04:50 2012 +0100 + + xlib/shm: Sync the XShmAttach before removing the ShmSegment id + + Whilst reading through other users of XShm, it became apparent that + IPC_RMID behaves differently across the platforms. Linux allows + processes to attach to an existing ShmSegment id after a IPC_RMID, but + for others the IPC_RMID takes immediate effect. On those platforms + without a "deferred" IPC_RMID, we then need to perform the XShmAttach + synchronously before perfomring the IPC_RMID. + + Reported-by: Thomas Klausner + Signed-off-by: Chris Wilson + + configure.ac | 32 ++++++++++++++++++++++++++++++++ + src/cairo-xlib-surface-shm.c | 3 +++ + 2 files changed, 35 insertions(+) + +commit d5f9c694b9145f0464c8bd58d844bddedcb77d5e +Author: Uli Schlachter +Date: Tue Oct 16 17:09:42 2012 +0200 + + test: Define optional exception classes + + According to musl libc author: + + "C99 requires the FE_ macros to be defined if and only if the exception they + correspond to is supported" + + So we define these macros to 0 if they are not supported. Support for these FPU + exceptions is not necessary for correct functionality, but makes some tests less + effective. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55771 + Signed-off-by: Uli Schlachter + + test/cairo-test.c | 3 --- + test/cairo-test.h | 20 ++++++++++++++++++++ + test/invalid-matrix.c | 4 ---- + 3 files changed, 20 insertions(+), 7 deletions(-) + +commit db488a1703d4ef3bcbd54138b51c01600a2f4d3a +Author: Chris Wilson +Date: Thu Oct 11 17:00:57 2012 +0100 + + recording: Copy across the is-clear? during snapshotting + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55799 + Signed-off-by: Chris Wilson + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed720007ba6be17434eb68b604fd36bd91c0d894 +Author: Henry Song +Date: Thu Oct 11 16:57:57 2012 +0100 + + recording: copy reverses its dst and src parameters + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55799 + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 26c8accd41163d86711ba900bec7d9cd6591d8a3 +Author: Chris Wilson +Date: Thu Oct 11 16:52:07 2012 +0100 + + xlib: Reorder CloseDisplay hooks + + As we may utilize X extensions as we shutdown and release resources + during CloseDisplay, we need to run our own callback first. If we run + last, than we reinstantiate the extensions which often have the + unfortunate habit of then persisting with stale data across the next + Display connection, causing invalid requests to be generated and raise + XErrors. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 34 +++++++++++++++++----------------- + 1 file changed, 17 insertions(+), 17 deletions(-) + +commit fbf528f46deaebc7d8cf38fc61be9e016f207575 +Author: Chris Wilson +Date: Tue Oct 9 17:37:53 2012 +0100 + + compositor: Reduce glyph "overlap" if the inked pixels are opaque + + We can ignore the issue of overdraw if when we paint the glyphs, the + result is opaque. + + Signed-off-by: Chris Wilson + + src/cairo-composite-rectangles.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 66500ef29fea41ccda554f85d82a6aa3de774903 +Author: Henry Song +Date: Thu Sep 27 19:22:23 2012 +0000 + + gl/traps: ensure RGBA surface before upload image to texture for GLES2 + + As GLESv2 may only use an RGBA surface as its source for texture + uploads, we therefore need to perform a conversion. + + src/cairo-gl-traps-compositor.c | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +commit 188c34b40d6f08851b4076ad11aefe69d4a78a25 +Author: Henry Song +Date: Thu Sep 27 18:25:52 2012 +0000 + + gl: gles2 only supports GL_DEPTH24_STENCIL8_OES + + Patch also provided by U. Artie Eoff + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50355 + + src/cairo-gl-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f78a9269228f2f48e8eb496e341ef990db39c6c3 +Author: Alexis Ballier +Date: Fri Sep 21 08:22:55 2012 -0300 + + cairo-sphinx: protect -ldl link with CAIRO_HAS_DL like in cairo-trace. + + Signed-off-by: Uli Schlachter + + util/cairo-sphinx/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3d2712d56a22f2a86fb80da94c3e55be8d26a330 +Author: Alexis Ballier +Date: Fri Sep 21 08:22:54 2012 -0300 + + cairo-fdr: protect -ldl link with CAIRO_HAS_DL like in cairo-trace. + + Signed-off-by: Uli Schlachter + + util/cairo-fdr/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 9ab9916114db9917108198111d3232a18ae505ed +Author: Adrian Johnson +Date: Sun Oct 7 23:54:20 2012 +1030 + + remove debug code + + src/cairo-type1-subset.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 9c2a92c70836b8534ef8c26d943fa17f891da105 +Author: Adrian Johnson +Date: Sun Oct 7 23:50:54 2012 +1030 + + type1: convert '.' to locale specific decimal point before using sscanf + + src/cairo-type1-subset.c | 31 +++++++++++++++++++++++++++---- + 1 file changed, 27 insertions(+), 4 deletions(-) + +commit 0d5f63755e7ceb1bb5678fcf1f4661f3435470fb +Author: David Maxwell +Date: Sun Oct 7 00:01:53 2012 -0800 + + type1-subset: always subset subroutines 0-3 (Flex/hint replacement) + + http://lists.cairographics.org/archives/cairo/2012-October/023576.html + + src/cairo-type1-subset.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 599e78ea2ee146c74fc7ffcee32a055dabbefdda +Author: David Maxwell +Date: Tue Oct 2 16:16:28 2012 -0800 + + type1: lenIV support + + http://lists.cairographics.org/archives/cairo/2012-October/023557.html + + src/cairo-type1-subset.c | 42 ++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 38 insertions(+), 4 deletions(-) + +commit cffbdf50ce0117d62d6e157369c60e4a8572fd21 +Author: David Maxwell +Date: Tue Oct 2 16:16:28 2012 -0800 + + type1: buildchar stack fix + + http://lists.cairographics.org/archives/cairo/2012-October/023557.html + + src/cairo-type1-subset.c | 1 + + 1 file changed, 1 insertion(+) + +commit e29bb5f295d055068a24b629fa1bd5f06a93431b +Author: Chris Wilson +Date: Sat Oct 6 18:53:41 2012 +0100 + + win32: Use the image surface below the fallback when unmapping an HDC + + As for a native window, the surface does not have an image delegate + itself but instead installs a fallback surface during map_to_image. So + during unmap_image, we then need to unmap from the fallback surface + instead. + + Signed-off-by: Chris Wilson + + src/win32/cairo-win32-display-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 0251f0951d8dcdd198912326c11489823989a3eb +Author: Uli Schlachter +Date: Sat Oct 6 15:00:51 2012 +0200 + + xcb: Clear the result of create_similar_image + + The documentation of cairo_surface_create_similar_image() states that the + image's contents are initially all 0. However, the implementation didn't live up + to the documentation. + + This was found via the corresponding assert in + cairo_surface_create_similar_image(). + + There are some cairo-xcb-internal users of this function which cleared the image + right after creating it. Obviously, this isn't needed anymore. + + Fixes: Nothing. The existing call in the testsuite to + cairo_surface_create_similar_image() doesn't hit this issue, since it creates a + too small image to hit the SHM-case. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 14 -------------- + src/cairo-xcb-surface.c | 5 +++++ + 2 files changed, 5 insertions(+), 14 deletions(-) + +commit 15ef4a3248bbf32d05da7ed2480a2ce58c26d9bc +Author: Chris Wilson +Date: Fri Oct 5 19:46:41 2012 +0100 + + xlib/shm: Note the bug is an interaction between libXext and xorg + + Søren thought it was bit harsh to lay the blame solely on xorg for it + crashing due to an unexpected input value, and that we should mention + libXext was also partly to blame for incorrectly setting the SEND_EVENT + bit in the ShmCompletionEvent. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit b1532f465e05d566f6d160c5ca916a5a12614067 +Author: Chris Wilson +Date: Fri Oct 5 19:20:18 2012 +0100 + + xlib/shm: Avoid using XSendEvent with old versions of Xorg + + Søren Sandmann Pedersen pointed out that all versions of Xorg prior to + and including xorg-1.11.0 contained a bug that would cause them to crash + if they ever processed an event sent by XSendEvent. This was fixed in + + commit 2d2dce558d24eeea0eb011ec9ebaa6c5c2273c39 + Author: Sam Spilsbury + Date: Wed Sep 14 09:58:34 2011 +0800 + + Remove the SendEvent bit (0x80) before doing range checks on event type. + + so make sure we do not use XSendEvent prior to that commit, which + fortuitously is quite easy as we only do so along the ShmPixmap path. + + Reported-by: Søren Sandmann Pedersen + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit dba46f4eab716c0148d278ba7cae0cb075b5df01 +Author: Chris Wilson +Date: Fri Oct 5 17:24:56 2012 +0100 + + version: Post release bump to 1.12.5 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 117abd85ac7ff41e484fe0d98f16704ec30abd09 +Author: Chris Wilson +Date: Fri Oct 5 16:44:00 2012 +0100 + + 1.12.4 release + + NEWS | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 70 insertions(+), 1 deletion(-) + +commit 6c6a69761048cfad210160035ae32ccb49967d5d +Author: Chris Wilson +Date: Fri Oct 5 14:55:28 2012 +0100 + + win32: Compile fix for mismatched surface types + + win32/cairo-win32-display-surface.c:472: error: structure has no member + named 'base' + + Signed-off-by: Chris Wilson + + src/win32/cairo-win32-display-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ccf694d060dd9ea41939fc1c5847d23d3a422b75 +Author: Chris Wilson +Date: Fri Oct 5 13:36:30 2012 +0100 + + xlib/shm: Discard SHM surfaces upon CloseDisplay + + Fixes xlib-surface-source + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 8488ae022de45b441f29c3e90e16d5cca3082d20 +Author: Chris Wilson +Date: Fri Oct 5 13:08:26 2012 +0100 + + test: Refresh reference images for slight alteration of curves + + test/reference/a1-fill.base.ref.png | Bin 328 -> 0 bytes + test/reference/a1-tiger.traps.argb32.ref.png | Bin 20406 -> 20326 bytes + test/reference/a1-tiger.traps.rgb24.ref.png | Bin 20406 -> 20326 bytes + test/reference/arc-direction.base.ref.png | Bin 5864 -> 0 bytes + test/reference/arc-looping-dash.argb32.ref.png | Bin 464 -> 0 bytes + .../reference/arc-looping-dash.base.argb32.ref.png | Bin 470 -> 0 bytes + test/reference/arc-looping-dash.base.rgb24.ref.png | Bin 470 -> 0 bytes + test/reference/arc-looping-dash.ref.png | Bin 348 -> 502 bytes + test/reference/arc-looping-dash.rgb24.ref.png | Bin 464 -> 0 bytes + .../arc-looping-dash.traps.argb32.ref.png | Bin 470 -> 496 bytes + .../reference/arc-looping-dash.traps.rgb24.ref.png | Bin 470 -> 496 bytes + test/reference/bug-bo-ricotz.base.ref.png | Bin 2125 -> 0 bytes + test/reference/bug-bo-ricotz.traps.argb32.ref.png | Bin 2128 -> 2125 bytes + test/reference/bug-bo-ricotz.traps.rgb24.ref.png | Bin 2128 -> 2125 bytes + test/reference/bug-spline.ref.png | Bin 5476 -> 5577 bytes + test/reference/caps-joins-alpha.argb32.ref.png | Bin 2662 -> 0 bytes + .../reference/caps-joins-alpha.base.argb32.ref.png | Bin 2278 -> 0 bytes + test/reference/caps-joins-alpha.base.rgb24.ref.png | Bin 2278 -> 0 bytes + test/reference/caps-joins-alpha.ref.png | Bin 2345 -> 2643 bytes + test/reference/caps-joins-alpha.rgb24.ref.png | Bin 2662 -> 0 bytes + .../caps-joins-alpha.traps.argb32.ref.png | Bin 2278 -> 2265 bytes + .../reference/caps-joins-alpha.traps.rgb24.ref.png | Bin 2278 -> 2265 bytes + test/reference/caps-joins-curve.argb32.ref.png | Bin 6217 -> 0 bytes + .../reference/caps-joins-curve.base.argb32.ref.png | Bin 5368 -> 0 bytes + test/reference/caps-joins-curve.base.rgb24.ref.png | Bin 5368 -> 0 bytes + test/reference/caps-joins-curve.ref.png | Bin 4527 -> 6228 bytes + test/reference/caps-joins-curve.rgb24.ref.png | Bin 6217 -> 0 bytes + .../caps-joins-curve.traps.argb32.ref.png | Bin 5368 -> 5327 bytes + .../reference/caps-joins-curve.traps.rgb24.ref.png | Bin 5368 -> 5327 bytes + test/reference/caps-joins.base.argb32.ref.png | Bin 2374 -> 2363 bytes + test/reference/caps-joins.base.rgb24.ref.png | Bin 2374 -> 2363 bytes + test/reference/caps-joins.traps.argb32.ref.png | Bin 2374 -> 2363 bytes + test/reference/caps-joins.traps.rgb24.ref.png | Bin 2374 -> 2363 bytes + test/reference/caps-sub-paths.base.argb32.ref.png | Bin 166 -> 166 bytes + test/reference/caps-sub-paths.base.rgb24.ref.png | Bin 166 -> 166 bytes + test/reference/caps-sub-paths.traps.argb32.ref.png | Bin 166 -> 166 bytes + test/reference/caps-sub-paths.traps.rgb24.ref.png | Bin 166 -> 166 bytes + test/reference/caps-tails-curve.argb32.ref.png | Bin 53311 -> 0 bytes + .../reference/caps-tails-curve.base.argb32.ref.png | Bin 50228 -> 0 bytes + test/reference/caps-tails-curve.base.rgb24.ref.png | Bin 50228 -> 0 bytes + test/reference/caps-tails-curve.ref.png | Bin 41476 -> 54750 bytes + test/reference/caps-tails-curve.rgb24.ref.png | Bin 53311 -> 0 bytes + .../caps-tails-curve.traps.argb32.ref.png | Bin 50228 -> 50617 bytes + .../reference/caps-tails-curve.traps.rgb24.ref.png | Bin 50228 -> 50617 bytes + test/reference/caps.base.argb32.ref.png | Bin 1601 -> 1637 bytes + test/reference/caps.base.rgb24.ref.png | Bin 1601 -> 1637 bytes + test/reference/caps.traps.argb32.ref.png | Bin 1601 -> 1637 bytes + test/reference/caps.traps.rgb24.ref.png | Bin 1601 -> 1637 bytes + test/reference/clear-source.base.argb32.ref.png | Bin 882 -> 882 bytes + test/reference/clear-source.base.rgb24.ref.png | Bin 882 -> 882 bytes + test/reference/clear-source.traps.argb32.ref.png | Bin 882 -> 882 bytes + test/reference/clear-source.traps.rgb24.ref.png | Bin 882 -> 882 bytes + test/reference/clip-operator.base.argb32.ref.png | Bin 8182 -> 8136 bytes + test/reference/clip-operator.traps.argb32.ref.png | Bin 8160 -> 8114 bytes + test/reference/clip-polygons.base.ref.png | Bin 1296 -> 0 bytes + test/reference/clip-polygons.traps.argb32.ref.png | Bin 1336 -> 1268 bytes + test/reference/clip-polygons.traps.rgb24.ref.png | Bin 1336 -> 1268 bytes + test/reference/clip-rectilinear.base.ref.png | Bin 440 -> 0 bytes + test/reference/clip-stroke.ref.png | Bin 1445 -> 1419 bytes + .../close-path-current-point.base.argb32.ref.png | Bin 2008 -> 1904 bytes + .../close-path-current-point.base.rgb24.ref.png | Bin 2008 -> 1904 bytes + .../close-path-current-point.traps.argb32.ref.png | Bin 2008 -> 1904 bytes + .../close-path-current-point.traps.rgb24.ref.png | Bin 2008 -> 1904 bytes + test/reference/curve-to-as-line-to.argb32.ref.png | Bin 109 -> 0 bytes + .../curve-to-as-line-to.base.argb32.ref.png | Bin 107 -> 95 bytes + .../curve-to-as-line-to.base.rgb24.ref.png | Bin 107 -> 95 bytes + test/reference/curve-to-as-line-to.rgb24.ref.png | Bin 109 -> 0 bytes + .../curve-to-as-line-to.traps.argb32.ref.png | Bin 107 -> 95 bytes + .../curve-to-as-line-to.traps.rgb24.ref.png | Bin 107 -> 95 bytes + test/reference/dash-caps-joins.argb32.ref.png | Bin 5157 -> 0 bytes + test/reference/dash-caps-joins.base.argb32.ref.png | Bin 4521 -> 4483 bytes + test/reference/dash-caps-joins.base.rgb24.ref.png | Bin 4521 -> 4483 bytes + test/reference/dash-caps-joins.ref.png | Bin 4030 -> 5089 bytes + test/reference/dash-caps-joins.rgb24.ref.png | Bin 5157 -> 0 bytes + .../reference/dash-caps-joins.traps.argb32.ref.png | Bin 4521 -> 4483 bytes + test/reference/dash-caps-joins.traps.rgb24.ref.png | Bin 4521 -> 4483 bytes + test/reference/dash-curve.argb32.ref.png | Bin 41040 -> 0 bytes + test/reference/dash-curve.base.argb32.ref.png | Bin 40040 -> 0 bytes + test/reference/dash-curve.base.rgb24.ref.png | Bin 40040 -> 0 bytes + test/reference/dash-curve.ref.png | Bin 22615 -> 40945 bytes + test/reference/dash-curve.rgb24.ref.png | Bin 41040 -> 0 bytes + test/reference/dash-curve.traps.argb32.ref.png | Bin 40040 -> 39925 bytes + test/reference/dash-curve.traps.rgb24.ref.png | Bin 40040 -> 39925 bytes + .../dash-infinite-loop.base.argb32.ref.png | Bin 835 -> 642 bytes + .../dash-infinite-loop.base.rgb24.ref.png | Bin 835 -> 642 bytes + .../dash-infinite-loop.traps.argb32.ref.png | Bin 835 -> 642 bytes + .../dash-infinite-loop.traps.rgb24.ref.png | Bin 835 -> 642 bytes + test/reference/dash-scale.argb32.ref.png | Bin 8913 -> 0 bytes + test/reference/dash-scale.base.argb32.ref.png | Bin 7621 -> 0 bytes + test/reference/dash-scale.base.rgb24.ref.png | Bin 7621 -> 0 bytes + test/reference/dash-scale.ref.png | Bin 6314 -> 8831 bytes + test/reference/dash-scale.rgb24.ref.png | Bin 8913 -> 0 bytes + test/reference/dash-scale.traps.argb32.ref.png | Bin 7621 -> 7627 bytes + test/reference/dash-scale.traps.rgb24.ref.png | Bin 7621 -> 7627 bytes + test/reference/dash-state.base.argb32.ref.png | Bin 7628 -> 7509 bytes + test/reference/dash-state.base.rgb24.ref.png | Bin 7628 -> 7509 bytes + test/reference/dash-state.traps.argb32.ref.png | Bin 7628 -> 7509 bytes + test/reference/dash-state.traps.rgb24.ref.png | Bin 7628 -> 7509 bytes + .../reference/dash-zero-length.base.argb32.ref.png | Bin 219 -> 219 bytes + test/reference/dash-zero-length.base.rgb24.ref.png | Bin 199 -> 199 bytes + test/reference/dash-zero-length.rgb24.ref.png | Bin 210 -> 208 bytes + .../dash-zero-length.traps.argb32.ref.png | Bin 219 -> 219 bytes + .../reference/dash-zero-length.traps.rgb24.ref.png | Bin 199 -> 199 bytes + test/reference/degenerate-arc.base.argb32.ref.png | Bin 547 -> 574 bytes + test/reference/degenerate-arc.base.rgb24.ref.png | Bin 547 -> 574 bytes + test/reference/degenerate-arc.ref.png | Bin 646 -> 692 bytes + test/reference/degenerate-arc.traps.argb32.ref.png | Bin 547 -> 574 bytes + test/reference/degenerate-arc.traps.rgb24.ref.png | Bin 547 -> 574 bytes + test/reference/degenerate-curve-to.argb32.ref.png | Bin 280 -> 0 bytes + .../degenerate-curve-to.base.argb32.ref.png | Bin 283 -> 282 bytes + .../degenerate-curve-to.base.rgb24.ref.png | Bin 283 -> 282 bytes + test/reference/degenerate-curve-to.ref.png | Bin 227 -> 285 bytes + test/reference/degenerate-curve-to.rgb24.ref.png | Bin 280 -> 0 bytes + .../degenerate-curve-to.traps.argb32.ref.png | Bin 283 -> 282 bytes + .../degenerate-curve-to.traps.rgb24.ref.png | Bin 283 -> 282 bytes + test/reference/degenerate-dash.argb32.ref.png | Bin 2086 -> 0 bytes + test/reference/degenerate-dash.base.argb32.ref.png | Bin 1898 -> 1911 bytes + test/reference/degenerate-dash.base.rgb24.ref.png | Bin 1898 -> 1911 bytes + test/reference/degenerate-dash.ref.png | Bin 1845 -> 1985 bytes + test/reference/degenerate-dash.rgb24.ref.png | Bin 2086 -> 0 bytes + .../reference/degenerate-dash.traps.argb32.ref.png | Bin 1898 -> 1911 bytes + test/reference/degenerate-dash.traps.rgb24.ref.png | Bin 1898 -> 1911 bytes + test/reference/degenerate-path.argb32.ref.png | Bin 250 -> 251 bytes + test/reference/degenerate-path.base.argb32.ref.png | Bin 249 -> 237 bytes + test/reference/degenerate-path.base.rgb24.ref.png | Bin 217 -> 204 bytes + test/reference/degenerate-path.rgb24.ref.png | Bin 219 -> 219 bytes + .../reference/degenerate-path.traps.argb32.ref.png | Bin 249 -> 237 bytes + test/reference/degenerate-path.traps.rgb24.ref.png | Bin 217 -> 204 bytes + .../degenerate-rel-curve-to.argb32.ref.png | Bin 277 -> 0 bytes + .../degenerate-rel-curve-to.base.argb32.ref.png | Bin 278 -> 278 bytes + .../degenerate-rel-curve-to.base.rgb24.ref.png | Bin 278 -> 278 bytes + test/reference/degenerate-rel-curve-to.ref.png | Bin 227 -> 278 bytes + .../degenerate-rel-curve-to.rgb24.ref.png | Bin 277 -> 0 bytes + .../degenerate-rel-curve-to.traps.argb32.ref.png | Bin 278 -> 278 bytes + .../degenerate-rel-curve-to.traps.rgb24.ref.png | Bin 278 -> 278 bytes + test/reference/drunkard-tails.argb32.ref.png | Bin 6116 -> 0 bytes + test/reference/drunkard-tails.base.argb32.ref.png | Bin 6036 -> 6176 bytes + test/reference/drunkard-tails.base.rgb24.ref.png | Bin 6036 -> 6176 bytes + test/reference/drunkard-tails.ref.png | Bin 3853 -> 6261 bytes + test/reference/drunkard-tails.rgb24.ref.png | Bin 6116 -> 0 bytes + test/reference/drunkard-tails.traps.argb32.ref.png | Bin 6036 -> 6176 bytes + test/reference/drunkard-tails.traps.rgb24.ref.png | Bin 6036 -> 6176 bytes + .../ft-text-vertical-layout-type3.argb32.ref.png | Bin 3610 -> 0 bytes + .../ft-text-vertical-layout-type3.ref.png | Bin 3222 -> 3608 bytes + .../ft-text-vertical-layout-type3.rgb24.ref.png | Bin 3610 -> 0 bytes + test/reference/halo-transform.traps.argb32.ref.png | Bin 15063 -> 15122 bytes + test/reference/halo-transform.traps.rgb24.ref.png | Bin 15063 -> 15122 bytes + test/reference/joins-loop.base.argb32.ref.png | Bin 4202 -> 4191 bytes + test/reference/joins-loop.base.rgb24.ref.png | Bin 4202 -> 4191 bytes + test/reference/joins-loop.traps.argb32.ref.png | Bin 4202 -> 4191 bytes + test/reference/joins-loop.traps.rgb24.ref.png | Bin 4202 -> 4191 bytes + test/reference/joins-retrace.argb32.ref.png | Bin 4997 -> 0 bytes + test/reference/joins-retrace.base.argb32.ref.png | Bin 4667 -> 4566 bytes + test/reference/joins-retrace.base.rgb24.ref.png | Bin 4667 -> 4566 bytes + test/reference/joins-retrace.ref.png | Bin 3951 -> 4900 bytes + test/reference/joins-retrace.rgb24.ref.png | Bin 4997 -> 0 bytes + test/reference/joins-retrace.traps.argb32.ref.png | Bin 4667 -> 4566 bytes + test/reference/joins-retrace.traps.rgb24.ref.png | Bin 4667 -> 4566 bytes + test/reference/joins-star.base.argb32.ref.png | Bin 3583 -> 3542 bytes + test/reference/joins-star.base.rgb24.ref.png | Bin 3583 -> 3542 bytes + test/reference/joins-star.traps.argb32.ref.png | Bin 3583 -> 3542 bytes + test/reference/joins-star.traps.rgb24.ref.png | Bin 3583 -> 3542 bytes + test/reference/joins.argb32.ref.png | Bin 6970 -> 0 bytes + test/reference/joins.base.argb32.ref.png | Bin 5684 -> 5732 bytes + test/reference/joins.base.rgb24.ref.png | Bin 5684 -> 5732 bytes + test/reference/joins.ref.png | Bin 4880 -> 7153 bytes + test/reference/joins.rgb24.ref.png | Bin 6970 -> 0 bytes + test/reference/joins.traps.argb32.ref.png | Bin 5684 -> 5732 bytes + test/reference/joins.traps.rgb24.ref.png | Bin 5684 -> 5732 bytes + .../large-twin-antialias-mixed.base.argb32.ref.png | Bin 16660 -> 16630 bytes + .../large-twin-antialias-mixed.base.rgb24.ref.png | Bin 16660 -> 16630 bytes + ...large-twin-antialias-mixed.traps.argb32.ref.png | Bin 16660 -> 16630 bytes + .../large-twin-antialias-mixed.traps.rgb24.ref.png | Bin 16660 -> 16630 bytes + .../leaky-dashed-rectangle.traps.argb32.ref.png | Bin 344 -> 345 bytes + .../leaky-dashed-rectangle.traps.rgb24.ref.png | Bin 344 -> 345 bytes + ...width-large-overlap-dashed.traps.argb32.ref.png | Bin 343 -> 340 bytes + ...-width-large-overlap-dashed.traps.rgb24.ref.png | Bin 343 -> 340 bytes + .../line-width-large-overlap-rotated.base.ref.png | Bin 404 -> 0 bytes + ...idth-large-overlap-rotated.traps.argb32.ref.png | Bin 427 -> 404 bytes + ...width-large-overlap-rotated.traps.rgb24.ref.png | Bin 427 -> 404 bytes + .../line-width-overlap-dashed.traps.argb32.ref.png | Bin 401 -> 407 bytes + .../line-width-overlap-dashed.traps.rgb24.ref.png | Bin 401 -> 407 bytes + .../long-dashed-lines.base.argb32.ref.png | Bin 2071 -> 2079 bytes + .../reference/long-dashed-lines.base.rgb24.ref.png | Bin 2071 -> 2079 bytes + .../long-dashed-lines.traps.argb32.ref.png | Bin 2071 -> 2079 bytes + .../long-dashed-lines.traps.rgb24.ref.png | Bin 2071 -> 2079 bytes + test/reference/miter-precision.base.argb32.ref.png | Bin 818 -> 823 bytes + test/reference/miter-precision.base.rgb24.ref.png | Bin 818 -> 823 bytes + .../reference/miter-precision.traps.argb32.ref.png | Bin 818 -> 823 bytes + test/reference/miter-precision.traps.rgb24.ref.png | Bin 818 -> 823 bytes + .../operator-alpha-alpha.base.argb32.ref.png | Bin 3441 -> 3402 bytes + .../operator-alpha-alpha.base.rgb24.ref.png | Bin 3441 -> 3402 bytes + .../operator-alpha-alpha.traps.argb32.ref.png | Bin 3441 -> 3402 bytes + .../operator-alpha-alpha.traps.rgb24.ref.png | Bin 3441 -> 3402 bytes + test/reference/operator-clear.rgb24.ref.png | Bin 947 -> 946 bytes + test/reference/operator-source.argb32.ref.png | Bin 5612 -> 5614 bytes + test/reference/operator-source.rgb24.ref.png | Bin 3975 -> 4012 bytes + .../reference/overlapping-dash-caps.argb32.ref.png | Bin 3986 -> 0 bytes + .../overlapping-dash-caps.base.argb32.ref.png | Bin 3952 -> 3967 bytes + .../overlapping-dash-caps.base.rgb24.ref.png | Bin 3952 -> 3967 bytes + test/reference/overlapping-dash-caps.ref.png | Bin 2424 -> 3979 bytes + test/reference/overlapping-dash-caps.rgb24.ref.png | Bin 3986 -> 0 bytes + .../overlapping-dash-caps.traps.argb32.ref.png | Bin 3952 -> 3967 bytes + .../overlapping-dash-caps.traps.rgb24.ref.png | Bin 3952 -> 3967 bytes + test/reference/random-clip.ref.png | Bin 525962 -> 526034 bytes + .../record-extend-none-similar.base.argb32.ref.png | Bin 293 -> 279 bytes + .../record-extend-none-similar.base.rgb24.ref.png | Bin 293 -> 279 bytes + ...record-extend-none-similar.traps.argb32.ref.png | Bin 293 -> 279 bytes + .../record-extend-none-similar.traps.rgb24.ref.png | Bin 293 -> 279 bytes + .../record-extend-pad-similar.base.argb32.ref.png | Bin 298 -> 283 bytes + .../record-extend-pad-similar.base.rgb24.ref.png | Bin 298 -> 283 bytes + .../record-extend-pad-similar.traps.argb32.ref.png | Bin 298 -> 283 bytes + .../record-extend-pad-similar.traps.rgb24.ref.png | Bin 298 -> 283 bytes + ...cord-extend-reflect-similar.base.argb32.ref.png | Bin 335 -> 283 bytes + ...ecord-extend-reflect-similar.base.rgb24.ref.png | Bin 335 -> 283 bytes + ...ord-extend-reflect-similar.traps.argb32.ref.png | Bin 335 -> 283 bytes + ...cord-extend-reflect-similar.traps.rgb24.ref.png | Bin 335 -> 283 bytes + ...ecord-extend-repeat-similar.base.argb32.ref.png | Bin 286 -> 283 bytes + ...record-extend-repeat-similar.base.rgb24.ref.png | Bin 286 -> 283 bytes + ...cord-extend-repeat-similar.traps.argb32.ref.png | Bin 286 -> 283 bytes + ...ecord-extend-repeat-similar.traps.rgb24.ref.png | Bin 286 -> 283 bytes + .../record-fill-alpha.base.argb32.ref.png | Bin 2824 -> 2853 bytes + .../reference/record-fill-alpha.base.rgb24.ref.png | Bin 2824 -> 2853 bytes + ...ecord-paint-alpha-clip-mask.base.argb32.ref.png | Bin 330 -> 337 bytes + ...record-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 330 -> 337 bytes + .../record-paint-alpha-clip.base.argb32.ref.png | Bin 269 -> 299 bytes + .../record-paint-alpha-clip.base.rgb24.ref.png | Bin 269 -> 299 bytes + .../record-select-font-face.base.argb32.ref.png | Bin 2250 -> 1417 bytes + .../record-select-font-face.base.rgb24.ref.png | Bin 2250 -> 1417 bytes + .../record-self-intersecting.base.argb32.ref.png | Bin 208 -> 168 bytes + .../record-self-intersecting.base.rgb24.ref.png | Bin 208 -> 168 bytes + .../record-text-transform.base.argb32.ref.png | Bin 5579 -> 5281 bytes + .../record-text-transform.base.rgb24.ref.png | Bin 5579 -> 5281 bytes + .../record1414x-fill-alpha.base.argb32.ref.png | Bin 4191 -> 4138 bytes + .../record1414x-fill-alpha.base.rgb24.ref.png | Bin 4191 -> 4138 bytes + ...ecord1414x-paint-alpha-clip-mask.argb32.ref.png | Bin 473 -> 560 bytes + ...1414x-paint-alpha-clip-mask.base.argb32.ref.png | Bin 466 -> 514 bytes + ...d1414x-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 466 -> 514 bytes + ...record1414x-paint-alpha-clip-mask.rgb24.ref.png | Bin 473 -> 560 bytes + ...ecord1414x-paint-alpha-clip.base.argb32.ref.png | Bin 380 -> 402 bytes + ...record1414x-paint-alpha-clip.base.rgb24.ref.png | Bin 380 -> 402 bytes + ...414x-paint-alpha-solid-clip.base.argb32.ref.png | Bin 317 -> 317 bytes + ...1414x-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 317 -> 317 bytes + ...ecord1414x-select-font-face.base.argb32.ref.png | Bin 3177 -> 2018 bytes + ...record1414x-select-font-face.base.rgb24.ref.png | Bin 3177 -> 2018 bytes + ...cord1414x-self-intersecting.base.argb32.ref.png | Bin 353 -> 385 bytes + ...ecord1414x-self-intersecting.base.rgb24.ref.png | Bin 353 -> 385 bytes + .../record1414x-text-transform.base.argb32.ref.png | Bin 8706 -> 8368 bytes + .../record1414x-text-transform.base.rgb24.ref.png | Bin 8706 -> 8368 bytes + .../record2x-fill-alpha.base.argb32.ref.png | Bin 5896 -> 5724 bytes + .../record2x-fill-alpha.base.rgb24.ref.png | Bin 5896 -> 5724 bytes + .../record2x-paint-alpha-clip-mask.argb32.ref.png | Bin 503 -> 534 bytes + ...ord2x-paint-alpha-clip-mask.base.argb32.ref.png | Bin 488 -> 501 bytes + ...cord2x-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 488 -> 501 bytes + .../record2x-paint-alpha-clip-mask.rgb24.ref.png | Bin 503 -> 534 bytes + .../record2x-select-font-face.base.argb32.ref.png | Bin 4407 -> 3096 bytes + .../record2x-select-font-face.base.rgb24.ref.png | Bin 4407 -> 3096 bytes + .../record2x-text-transform.base.argb32.ref.png | Bin 13476 -> 13174 bytes + .../record2x-text-transform.base.rgb24.ref.png | Bin 13476 -> 13174 bytes + .../record90-fill-alpha.base.argb32.ref.png | Bin 2658 -> 2628 bytes + .../record90-fill-alpha.base.rgb24.ref.png | Bin 2658 -> 2628 bytes + ...ord90-paint-alpha-clip-mask.base.argb32.ref.png | Bin 332 -> 343 bytes + ...cord90-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 332 -> 343 bytes + .../record90-paint-alpha-clip.base.argb32.ref.png | Bin 279 -> 327 bytes + .../record90-paint-alpha-clip.base.rgb24.ref.png | Bin 279 -> 327 bytes + ...rd90-paint-alpha-solid-clip.base.argb32.ref.png | Bin 254 -> 279 bytes + ...ord90-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 254 -> 279 bytes + .../record90-select-font-face.base.argb32.ref.png | Bin 2272 -> 1480 bytes + .../record90-select-font-face.base.rgb24.ref.png | Bin 2272 -> 1480 bytes + .../record90-self-intersecting.base.argb32.ref.png | Bin 208 -> 208 bytes + .../record90-self-intersecting.base.rgb24.ref.png | Bin 208 -> 208 bytes + .../record90-text-transform.base.argb32.ref.png | Bin 5811 -> 5481 bytes + .../record90-text-transform.base.rgb24.ref.png | Bin 5811 -> 5481 bytes + test/reference/reflected-stroke.argb32.ref.png | Bin 5119 -> 0 bytes + .../reference/reflected-stroke.base.argb32.ref.png | Bin 4994 -> 5053 bytes + test/reference/reflected-stroke.base.rgb24.ref.png | Bin 4994 -> 5053 bytes + test/reference/reflected-stroke.ref.png | Bin 3410 -> 5139 bytes + test/reference/reflected-stroke.rgb24.ref.png | Bin 5119 -> 0 bytes + .../reflected-stroke.traps.argb32.ref.png | Bin 4994 -> 5053 bytes + .../reference/reflected-stroke.traps.rgb24.ref.png | Bin 4994 -> 5053 bytes + .../rounded-rectangle-stroke.base.argb32.ref.png | Bin 1060 -> 856 bytes + .../rounded-rectangle-stroke.base.rgb24.ref.png | Bin 1060 -> 856 bytes + .../rounded-rectangle-stroke.traps.argb32.ref.png | Bin 1060 -> 856 bytes + .../rounded-rectangle-stroke.traps.rgb24.ref.png | Bin 1060 -> 856 bytes + .../spline-decomposition.base.argb32.ref.png | Bin 19075 -> 19089 bytes + .../spline-decomposition.base.rgb24.ref.png | Bin 19075 -> 19089 bytes + .../spline-decomposition.traps.argb32.ref.png | Bin 19075 -> 19089 bytes + .../spline-decomposition.traps.rgb24.ref.png | Bin 19075 -> 19089 bytes + test/reference/stroke-ctm-caps.argb32.ref.png | Bin 942 -> 0 bytes + test/reference/stroke-ctm-caps.base.argb32.ref.png | Bin 873 -> 835 bytes + test/reference/stroke-ctm-caps.base.rgb24.ref.png | Bin 873 -> 835 bytes + test/reference/stroke-ctm-caps.ref.png | Bin 921 -> 896 bytes + test/reference/stroke-ctm-caps.rgb24.ref.png | Bin 942 -> 0 bytes + .../reference/stroke-ctm-caps.traps.argb32.ref.png | Bin 873 -> 835 bytes + test/reference/stroke-ctm-caps.traps.rgb24.ref.png | Bin 873 -> 835 bytes + .../reference/subsurface-scale.base.argb32.ref.png | Bin 5921 -> 5919 bytes + test/reference/subsurface-scale.base.ref.png | Bin 5216 -> 0 bytes + test/reference/subsurface-scale.base.rgb24.ref.png | Bin 5921 -> 5919 bytes + .../subsurface-scale.traps.argb32.ref.png | Bin 5921 -> 5919 bytes + .../reference/subsurface-scale.traps.rgb24.ref.png | Bin 5921 -> 5919 bytes + test/reference/subsurface.base.argb32.ref.png | Bin 1811 -> 1801 bytes + test/reference/subsurface.base.rgb24.ref.png | Bin 1811 -> 1801 bytes + test/reference/subsurface.traps.argb32.ref.png | Bin 1811 -> 1801 bytes + test/reference/subsurface.traps.rgb24.ref.png | Bin 1811 -> 1801 bytes + .../surface-pattern-operator.base.argb32.ref.png | Bin 5184 -> 5107 bytes + .../surface-pattern-operator.traps.argb32.ref.png | Bin 5184 -> 5107 bytes + test/reference/twin-antialias-gray.argb32.ref.png | Bin 3990 -> 0 bytes + .../twin-antialias-gray.base.argb32.ref.png | Bin 4392 -> 4320 bytes + .../twin-antialias-gray.base.rgb24.ref.png | Bin 4392 -> 4320 bytes + test/reference/twin-antialias-gray.ref.png | Bin 2292 -> 3948 bytes + test/reference/twin-antialias-gray.rgb24.ref.png | Bin 3990 -> 0 bytes + .../twin-antialias-gray.traps.argb32.ref.png | Bin 4392 -> 4320 bytes + .../twin-antialias-gray.traps.rgb24.ref.png | Bin 4392 -> 4320 bytes + .../twin-antialias-mixed.base.argb32.ref.png | Bin 2230 -> 2340 bytes + .../twin-antialias-mixed.base.rgb24.ref.png | Bin 2230 -> 2340 bytes + .../twin-antialias-mixed.traps.argb32.ref.png | Bin 2230 -> 2340 bytes + .../twin-antialias-mixed.traps.rgb24.ref.png | Bin 2230 -> 2340 bytes + .../twin-antialias-subpixel.argb32.ref.png | Bin 3990 -> 0 bytes + .../twin-antialias-subpixel.base.argb32.ref.png | Bin 4392 -> 4320 bytes + .../twin-antialias-subpixel.base.rgb24.ref.png | Bin 4392 -> 4320 bytes + test/reference/twin-antialias-subpixel.ref.png | Bin 2292 -> 3948 bytes + .../twin-antialias-subpixel.rgb24.ref.png | Bin 3990 -> 0 bytes + .../twin-antialias-subpixel.traps.argb32.ref.png | Bin 4392 -> 4320 bytes + .../twin-antialias-subpixel.traps.rgb24.ref.png | Bin 4392 -> 4320 bytes + test/reference/twin.argb32.ref.png | Bin 3990 -> 0 bytes + test/reference/twin.base.argb32.ref.png | Bin 4392 -> 4320 bytes + test/reference/twin.base.rgb24.ref.png | Bin 4392 -> 4320 bytes + test/reference/twin.ref.png | Bin 2292 -> 3948 bytes + test/reference/twin.rgb24.ref.png | Bin 3990 -> 0 bytes + test/reference/twin.traps.argb32.ref.png | Bin 4392 -> 4320 bytes + test/reference/twin.traps.rgb24.ref.png | Bin 4392 -> 4320 bytes + .../unantialiased-shapes.traps.argb32.ref.png | Bin 3977 -> 3932 bytes + .../unantialiased-shapes.traps.rgb24.ref.png | Bin 3977 -> 3932 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 1333 -> 1333 bytes + .../unbounded-operator.traps.argb32.ref.png | Bin 2648 -> 2764 bytes + .../unbounded-operator.traps.rgb24.ref.png | Bin 1269 -> 1302 bytes + .../reference/unclosed-strokes.base.argb32.ref.png | Bin 1482 -> 1452 bytes + test/reference/unclosed-strokes.base.rgb24.ref.png | Bin 1482 -> 1452 bytes + .../unclosed-strokes.traps.argb32.ref.png | Bin 1482 -> 1452 bytes + .../reference/unclosed-strokes.traps.rgb24.ref.png | Bin 1482 -> 1452 bytes + test/reference/user-font.argb32.ref.png | Bin 6478 -> 0 bytes + test/reference/user-font.base.argb32.ref.png | Bin 6080 -> 5785 bytes + test/reference/user-font.base.rgb24.ref.png | Bin 6080 -> 5785 bytes + test/reference/user-font.ref.png | Bin 4939 -> 6209 bytes + test/reference/user-font.rgb24.ref.png | Bin 6478 -> 0 bytes + test/reference/user-font.traps.argb32.ref.png | Bin 6080 -> 5785 bytes + test/reference/user-font.traps.rgb24.ref.png | Bin 6080 -> 5785 bytes + 347 files changed, 0 insertions(+), 0 deletions(-) + +commit d6a05676849509049fc54eea2559803b6247a6fe +Author: Chris Wilson +Date: Wed Oct 3 17:38:21 2012 +0100 + + stroke: Remove redundant code for computing culling extents + + Same code repeated! + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke.c | 91 ++++++++++++++++++------------------------------- + src/cairo-rectangle.c | 16 ++------- + 2 files changed, 35 insertions(+), 72 deletions(-) + +commit 8020e0bc8cbd3e5ac188eb305b74ae1c1f362a31 +Author: Chris Wilson +Date: Wed Oct 3 17:01:41 2012 +0100 + + recording: Perform an explicit during snapshot + + In order to avoid recursing upon our source mutex when doing a snapshot, + we can perform an explicit copy of the command array. This should also + be faster than performing a replay as well. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50443 + Signed-off-by: Chris Wilson + + src/cairo-recording-surface.c | 312 +++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 311 insertions(+), 1 deletion(-) + +commit 797441093a8346003552e0cf89aef2a644ff53ab +Author: Chris Wilson +Date: Thu Sep 27 15:21:42 2012 +0100 + + tor: Fudge the edge if it is projected into a point + + If we generate an edge (through polygon-intersect) where its end-points + lie outside the line definition then it is possible for that line to be + degenerate under sample grid projection. Apply a fudge factor to prevent + explosions as otherwise we reject an edge whose height is not strictly + 0. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54822 + Signed-off-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 2 +- + src/cairo-tor22-scan-converter.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit cabb3c3bdf3153719b0ee538ea1b66137dc89085 +Author: Chris Wilson +Date: Thu Sep 27 12:21:00 2012 +0100 + + spans-compositor: Remove polygon limits after construction + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit c05147b215072f9bd5e951011f68d9e647cf001f +Author: Chris Wilson +Date: Thu Sep 27 11:41:58 2012 +0100 + + test: Refresh reference image for clip-disjoint-quad + + Rather than using the traps reference for all target as this then + generates false negatives with the spans compositor. + + Signed-off-by: Chris Wilson + + test/reference/clip-disjoint-quad.ref.png | Bin 1542 -> 1592 bytes + test/reference/clip-disjoint-quad.traps.ref.png | Bin 0 -> 1542 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit ef0b2e43ee299a1c2e7ecfbdf36a610c4ec53d0e +Author: Chris Wilson +Date: Thu Sep 27 11:35:40 2012 +0100 + + composite-rectangles: Update unbounded (clip extents) after reducing clip + + So that the composite-rectangles remains consistent with the reduced + clip in case the individual compositors try to optimise their rendering + strategies based on the reduced clip and the overall extents. + + Signed-off-by: Chris Wilson + + src/cairo-composite-rectangles.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 36536d3eb83a8f942bcf1afba4d0815fbeaca10f +Author: Chris Wilson +Date: Thu Sep 27 11:14:18 2012 +0100 + + spans-compositor: Use the tight clip-boxes for polygon construction + + If we will be reducing the clip intersection to a single clip box check + during construction, it helps if we use the tight clip box. + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 29 +++++++++++++++++++---------- + 1 file changed, 19 insertions(+), 10 deletions(-) + +commit 7e856071a27b06a6ae35b6445635da9276975c69 +Author: Chris Wilson +Date: Thu Sep 27 11:13:23 2012 +0100 + + polygon-intersect: Exclude non-overlapping clip boxes from consideration + + Signed-off-by: Chris Wilson + + src/cairo-polygon-intersect.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 3969f2c687aa94721e02d50c2f9e1b4d62a546f7 +Author: Chris Wilson +Date: Thu Sep 27 09:56:36 2012 +0100 + + test: Add clip-disjoint-quad + + Exercises a bug in the polygon intersection code demonstrated by Søren + Sandmann. + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/clip-disjoint-quad.c | 83 ++++++++++++++++++++++++++++++ + test/reference/clip-disjoint-quad.ref.png | Bin 0 -> 1542 bytes + 3 files changed, 84 insertions(+) + +commit 9735d1d716262a0c4f0a77363ce8c7d6064fa7d6 +Author: Uli Schlachter +Date: Tue Sep 25 11:58:18 2012 +0200 + + mark_dirty: Check surface status + + This problem was introduced in commit "xlib: Implement SHM fallbacks and fast + upload paths". Before, cairo_surface_mark_dirty() directly called + cairo_surface_mark_dirty_rectangle() with special "magical arguments" and thus + didn't need any checks on the surface status. + + Fixes: api-special-cases + + Signed-off-by: Uli Schlachter + + src/cairo-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 2be125817ade58ca25cc6cc6b23e2f4dbea722c6 +Author: Uli Schlachter +Date: Tue Sep 25 11:40:22 2012 +0200 + + surface: Check reference count right before free + + This makes sure that nothing took a reference during finishing and during + detaching user and mime-data. + + Signed-off-by: Uli Schlachter + + src/cairo-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f2720e2ba1f68e9ec8f8822e41f4045663e99ad8 +Author: Uli Schlachter +Date: Tue Sep 25 11:39:42 2012 +0200 + + xcb: Add a missing check for FillRectangles + + Fixes: big-empty-box big-little-box operator operator-alpha + surface-pattern-operator unbounded-operator + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit b264ae76bd2621363cbc1e2b5bcdc4b0583d4b1f +Author: Uli Schlachter +Date: Tue Sep 25 11:34:52 2012 +0200 + + xcb: Check if traps are supported before using them + + This code tried to optimize the clip away by intersecting the boxes with the + clip polygon. However, it also did so when the server didn't support traps. + + Fixes: clip-stroke-unbounded clip-fill-nz-unbounded clip-fill-eo-unbounded + clip-fill clip-fill-rule a1-clip-fill-rule clip-group-shapes-circles + clip-intersect clip-nesting clip-operator clip-push-group clip-polygons + clip-shape clip-text clip-twice inverted-clip mask random-clip + rotate-clip-image-surface-paint trap-clip unantialiased-shapes + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0ccbb83eb892aca51838aeb1da45070b385a6d88 +Author: Uli Schlachter +Date: Tue Sep 25 11:31:04 2012 +0200 + + xcb: Check the right flag for FillRectangles + + Fixes: operator-source + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b33d83ad49343ce226f76ceb6c83659c72442e91 +Author: Uli Schlachter +Date: Tue Sep 25 11:12:58 2012 +0200 + + xcb: Verify extension support before sending + + This commit adds lots of asserts. These asserts verify for each extension + request that we send that the server really supports this. + + Sadly, this causes 28 assertion failures in the test suite with xcb-render-0.0. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-connection-render.c | 20 ++++++++++++++++++++ + src/cairo-xcb-connection-shm.c | 4 ++++ + 2 files changed, 24 insertions(+) + +commit de31018bdd1cc78fd54cf9fd7b220117008c33a8 +Author: Uli Schlachter +Date: Sat Sep 15 15:43:16 2012 +0200 + + xcb: Switch to compositor architecture + + This commit removes the hand-written code in cairo-xcb-surface.c and instead + makes use of cairo_compositor_t. Surprisingly, this doesn't break a single test + case. :-) + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-private.h | 59 ++++----- + src/cairo-xcb-surface-render.c | 75 +++++------ + src/cairo-xcb-surface.c | 277 ++++++++++++++++++++--------------------- + 3 files changed, 197 insertions(+), 214 deletions(-) + +commit 6300579a8b2c0e38a0c1abae89675bf6cb769902 +Author: Uli Schlachter +Date: Sat Sep 15 14:56:51 2012 +0200 + + xcb: Remove unimplemented cairo compositor + + Signed-off-by: Uli Schlachter + + src/Makefile.sources | 1 - + src/cairo-xcb-private.h | 44 -------------------- + src/cairo-xcb-surface-cairo.c | 94 ------------------------------------------- + src/cairo-xcb-surface.c | 32 --------------- + 4 files changed, 171 deletions(-) + +commit 8d86ea4dcbefc982e4a694f1d8e90a90b3695c10 +Author: Uli Schlachter +Date: Sat Sep 15 14:37:51 2012 +0200 + + xcb: Fix a warn_unused_result warning + + cairo-xcb-surface.c: In function '_drawable_changed': + cairo-xcb-surface.c:1434:39: warning: ignoring return value of '_cairo_surface_begin_modification', declared with attribute warn_unused_result [-Wunused-result] + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit d6253dd53127368797dfd43084450e70b4921f77 +Author: Uli Schlachter +Date: Sat Sep 15 14:36:06 2012 +0200 + + Remove an unimplemented function declaration + + This was added in commit 2458120dee350cd1b49f999f64b17a895a4b6607. + + Signed-off-by: Uli Schlachter + + src/cairo-pattern-private.h | 3 --- + 1 file changed, 3 deletions(-) + +commit 08e3f4614b688331534d72f46c9c3e9f292d0216 +Author: Uli Schlachter +Date: Sat Sep 15 14:33:54 2012 +0200 + + Fix make check + + The inline functions in cairo-backend-private.h tried to dereference a cairo_t, + which wasn't defined. Fix this by including cairo-private.h. + + In cairo-mempool-private.h, size_t is used but stddef.h is not included. + + Fixes: + + CHECK cairo-backend-private.h + In file included from headers-standalone-tmp.c:1:0: + ./cairo-backend-private.h: In function ‘_cairo_backend_to_user’: + ./cairo-backend-private.h:179:7: error: dereferencing pointer to incomplete type + ./cairo-backend-private.h: In function ‘_cairo_backend_to_user_distance’: + ./cairo-backend-private.h:185:7: error: dereferencing pointer to incomplete type + ./cairo-backend-private.h: In function ‘_cairo_user_to_backend’: + ./cairo-backend-private.h:191:7: error: dereferencing pointer to incomplete type + ./cairo-backend-private.h: In function ‘_cairo_user_to_backend_distance’: + ./cairo-backend-private.h:197:7: error: dereferencing pointer to incomplete type + CHECK cairo-mempool-private.h + In file included from headers-standalone-tmp.c:1:0: + ./cairo-mempool-private.h:61:5: error: unknown type name ‘size_t’ + ./cairo-mempool-private.h:62:5: error: unknown type name ‘size_t’ + ./cairo-mempool-private.h:68:8: error: unknown type name ‘size_t’ + ./cairo-mempool-private.h:73:44: error: unknown type name ‘size_t’ + + Signed-off-by: Uli Schlachter + + src/cairo-backend-private.h | 1 + + src/cairo-mempool-private.h | 2 ++ + 2 files changed, 3 insertions(+) + +commit 1054840d864da7efcac2ee02d43a526ed6a6760c +Author: Behdad Esfahbod +Date: Sat Sep 22 15:59:36 2012 -0400 + + Fix malloc-stats for newer glibc + + util/malloc-stats.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 38c6084758b178177cff8a3b6a9e0b5be60c80a2 +Author: Behdad Esfahbod +Date: Mon Sep 17 16:26:08 2012 -0400 + + [util/malloc-stats] Use tighter spacing. + + util/malloc-stats.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 59248fb2628e86ff62abfbf122b88c2a299ec393 +Author: Weng Xuetian +Date: Thu Sep 13 22:56:57 2012 +0100 + + xlib: Reset fallback counter when discarding the fallback + + References: https://bugs.freedesktop.org/show_bug.cgi?id=54657 + + src/cairo-xlib-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5c59d989f9037f94c80ccd7929dc05f4a95be4df +Author: Chris Wilson +Date: Thu Sep 13 22:50:11 2012 +0100 + + xlib: Destroy the fallback damage along with the fallback surface + + Whenever we discard the fallback surface, we need to destroy the + associated damage tracking, so move this into the common discard + routine. + + This should fix the issue when trying to flush the fallback before + the user modifies any foreign Drawables. The current code issued the + flush and then explicitly discard the fallback, but unless it was idle + at the time of the flush the associated damage would not have also been + destroyed. Asserts followed. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=54657 + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit 97282ef51a01ae2ac3a7a8bf3ebce841a60dc907 +Author: Chris Wilson +Date: Thu Sep 13 17:00:24 2012 +0100 + + xlib: Do not call _cairo_xlib_surface_flush directly + + Use the higher level layer to be sure we detach any snapshots and other + cached data that is invalidated along with the change of Drawable. + + Pointed out by the eternally wise Uli Schlachter. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 69d97d97bea86e7f4223d857803fb7f0ec0d369f +Author: Chris Wilson +Date: Thu Sep 13 16:45:46 2012 +0100 + + xlib: Force the fallback flush before updating the external Drawable + + _cairo_surface_begin_modification() performs an internal flush, for + which the xlib backend skips flushing the fallback surface as it will + continue to use it for the subsequent operation. In the case where we + are flushing prior to updating the Drawable, we need to perform an + external flush which will trigger the posting of the damage from the + fallback surface. + + Reported-by: Weng Xuetian + References: https://bugs.freedesktop.org/show_bug.cgi?id=54657 + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6ee216000ae487492fceda0fb3fecb20bb9a41f6 +Author: Chris Wilson +Date: Thu Sep 13 15:25:49 2012 +0100 + + xlib: Explicitly discard the fallback shm pixmap upon user modification + + If the user changes the size of the underlying drawable, we much make + sure that we discard the current ShmPixmap in order to create a new + fallback pixmap of the correct size next time. + + Reported-by: Weng Xuetian + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 38 +++++++++++++++++++++++++++++--------- + 1 file changed, 29 insertions(+), 9 deletions(-) + +commit e2c4bb9465e6261eb79f24af52d339df0b563b55 +Author: Chris Wilson +Date: Thu Sep 13 12:40:49 2012 +0100 + + xlib: Fix regression in cairo_xlib_surface_set_drawable() + + In commit 0bfd2acd35547fc2bd0de99cc67d153f0170697d + Author: Chris Wilson + Date: Mon Aug 13 01:34:12 2012 +0100 + + xlib: Implement SHM fallbacks and fast upload paths + + I made the mistake of inverting the logic for + cairo_xlib_surface_set_drawable() causing it then to never update. + + Thanks to Uli Schlachter for spotting my error. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=54657 + Reported-by: Weng Xuetian + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 77330f6b841b6938e0da44b32692cd64b0f53cbd +Author: Chris Wilson +Date: Tue Sep 11 18:20:45 2012 +0100 + + xcb: Always flush the fallback damage to foreign drawables + + We need to flush any fallback to a foreign drawable upon finish. + However, we must be careful not to attach the snapshot in that case or + else we end up with an expected reference. This is similar to the + treatment of xlib/shm in commit f864e2d70. + + Reported-by: Henry Song + Signed-off-by: Chris Wilson + + src/cairo-xcb-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 93774ac0348df04c3fa84f5bc01fe35c87a62089 +Author: Andrea Canciani +Date: Wed Sep 5 17:52:50 2012 +0200 + + test: Add degenerate closed path case to get-path-extents + + This is a testcase to ensure that we do not regress + https://bugs.freedesktop.org/show_bug.cgi?id=54549 (which is already + fixed by b0c466e27afcec230b2c9436eeb924c05123a544). + + test/get-path-extents.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit f34b87f6d76cbea93acd4a8c73c8c6a6b412a302 +Author: Chris Wilson +Date: Mon Sep 10 15:09:18 2012 +0100 + + path: Convert from backend coordinates back into user coordinates + + Fixes regression from commit 83bfd85a1378e61b8bdc3f554f5e07900311f61f + Author: Chris Wilson + Date: Fri Apr 23 19:45:26 2010 +0100 + + Implement cairo_backend_t + + As there exists no public API to perform the operation we needed, and we + failed to create one, the constructed path failed to correctly remove + the device offset. + + Fixes copy-path under device translation. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54732 + Reported-by: Benjamin Berg + Signed-off-by: Chris Wilson + + src/cairo-path.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit df6780442feba5c0c9404353177f24913b58bd32 +Author: Chris Wilson +Date: Mon Sep 10 15:03:47 2012 +0100 + + context: Add missing functions to transform between user and backend coordinates + + Signed-off-by: Chris Wilson + + src/cairo-backend-private.h | 29 +++++++++++++++++++++++++++ + src/cairo-default-context.c | 44 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-gstate-private.h | 10 ++++++++++ + src/cairo-gstate.c | 7 +++++++ + src/skia/cairo-skia-context.cpp | 4 ++++ + 5 files changed, 94 insertions(+) + +commit f864e2d70f53a1feeee5e32bf9724b1e544025a6 +Author: Chris Wilson +Date: Sat Sep 8 16:39:05 2012 +0100 + + xlib/shm: Explicitly release shm surface if we do not own the pixmap + + In this case we want to prevent the short-circuiting of the flush of the + ShmPixmap that is ordinarily performed during finish(). + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 558f0a5ab4a88937b8c212c13309d11cb1a101af +Author: Chris Wilson +Date: Sat Sep 8 15:12:58 2012 +0100 + + image: Check for an error surface before dereferencing the backend + + As the surface->backend will be NULL in such an error surface, and we + may be legitimately doing boundary checks to reject the error surface. + The alternative would be to set an explicit error surface backend. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54664 + Signed-off-by: Chris Wilson + + src/cairo-image-surface-inline.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b0c466e27afcec230b2c9436eeb924c05123a544 +Author: Chris Wilson +Date: Wed Sep 5 14:55:55 2012 +0100 + + path: Update last_move_point after move-to + + Reported-and-tested-by: Jussi Kukkonen + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=54549 + Signed-off-by: Chris Wilson + + src/cairo-path-fixed.c | 1 + + 1 file changed, 1 insertion(+) + +commit 83759e7d592c5d7b12b2341574fd584fe5e0fb5a +Author: Chris Wilson +Date: Tue Sep 4 14:42:34 2012 +0100 + + default-context: Convert the relative path segments into the backend coordinates + + When transforming the incoming paths, the goal is to transform them from + user space onto the target coordinate system. Currently for relative + paths we used user_to_device_distance as we presumed that there was no + backend scale factor. However, Alex Larsson noticed that these then + broke when playing around with such a device transform... + + Reported-by: Alexander Larsson + Signed-off-by: Chris Wilson + + src/cairo-default-context.c | 10 +++++----- + src/cairo-gstate-private.h | 10 ++++++++++ + src/cairo-gstate.c | 7 +++++++ + 3 files changed, 22 insertions(+), 5 deletions(-) + +commit c0b1b178184ccfba0fe60c2a49901cadef9df36b +Author: Chris Wilson +Date: Mon Aug 27 13:21:35 2012 +0100 + + xlib/shm: Masquerade as an ordinary ShmCompletionEvent + + Needs a bit of extra work to create the extension event, but this leaves + the application with only a single spurious event to filter. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-private.h | 6 +-- + src/cairo-xlib-surface-shm.c | 109 ++++++++++++------------------------------- + 2 files changed, 32 insertions(+), 83 deletions(-) + +commit be2973e405764d4de4a44a01ff98db3e6495a361 +Author: Chris Wilson +Date: Sun Aug 26 11:59:46 2012 +0100 + + bentley-ottmann: Cache the most recent edge colinearity check + + We frequently compare neighbouring edges for their colinearity (in case + we can skip over them in the active list) so we can record the last + comparison and reuse the result next time. + + Signed-off-by: Chris Wilson + + src/cairo-bentley-ottmann.c | 42 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 32 insertions(+), 10 deletions(-) + +commit 637659fb511824eb8ac31ef85db10406295734e6 +Author: Chris Wilson +Date: Sun Aug 26 00:39:43 2012 +0100 + + bentley-ottmann: hint that the insertion compare function should be inlined + + Albeit it too large for gcc to automatically inline, it is only used + from within a single function. Hopefully gcc can optimise better with + the hint. + + Signed-off-by: Chris Wilson + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3c6e4311fb3b9fe400555a8d97193fc87974899b +Author: Chris Wilson +Date: Sun Aug 26 00:35:52 2012 +0100 + + bentley-ottmann: Only check the pairs of coordinates for equality. + + Signed-off-by: Chris Wilson + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 535b4e970cdbb459be621cecafd7f91ca4698396 +Author: Chris Wilson +Date: Sun Aug 26 00:16:33 2012 +0100 + + bentley-ottman: Remove a few superfluous status propagation + + For the traps it is simpler if we report the status at the end, and + no-op the accumulation of the trap after hitting the error condition. + + Signed-off-by: Chris Wilson + + src/cairo-bentley-ottmann.c | 69 ++++++++++++++------------------------------- + 1 file changed, 21 insertions(+), 48 deletions(-) + +commit b66065537cec5f03b33f7513f06e26630c28b5f1 +Author: Chris Wilson +Date: Sun Aug 26 10:21:22 2012 +0100 + + stroke: Compute bounds for fallback stroker (typically dashing) + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke.c | 42 +++++++++++++++++++++++++++++++++++------- + 1 file changed, 35 insertions(+), 7 deletions(-) + +commit 99593538a9d054aa1bb9fa620fced8c8b8ccdc9d +Author: Chris Wilson +Date: Sun Aug 26 10:50:50 2012 +0100 + + stroke: Convert fallback stroker to new pen vertex finder + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke.c | 173 ++++++++++++++++++++++++++---------------------- + 1 file changed, 95 insertions(+), 78 deletions(-) + +commit 4eb8e9f8618c5c5c002b7fd72c0370451ae1f511 +Author: Chris Wilson +Date: Sat Aug 25 23:57:56 2012 +0100 + + stroke: Convert a very small round-join into a miter + + Avoid adding a bevel join if the miter point is within tolerance. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa93fc63b652f04bcf7d5340a13023819ecf2140 +Author: Chris Wilson +Date: Sat Aug 25 23:54:36 2012 +0100 + + stroke: Precompute the line half-width + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 82 +++++++++++++++++++---------------------- + 1 file changed, 38 insertions(+), 44 deletions(-) + +commit 3cf6551ac71bac4d0ae1d0938bc0205dfc03f65c +Author: Chris Wilson +Date: Sat Aug 25 23:42:45 2012 +0100 + + stroke: Use new pen vertex range finders + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 93 ++++++++++++----------------------------- + 1 file changed, 27 insertions(+), 66 deletions(-) + +commit 74e9ae8cdff31e9a039b17f7dbe6e80f98e2c047 +Author: Chris Wilson +Date: Sat Aug 25 23:29:21 2012 +0100 + + pen: Use bisection to speed up vertex finding + + Signed-off-by: Chris Wilson + + src/cairo-pen.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 12 +++++++++ + 2 files changed, 93 insertions(+) + +commit aeb039b16dc302192113a7f10c4b86e7d13eb221 +Author: Chris Wilson +Date: Sat Aug 25 12:57:01 2012 +0100 + + stroke: Skip spline evaluation when stroking to a polygon + + If the spline is wholly outside the clip region, accounting for the + stroke width and additional rendering, then we can simplify that spline + with a straight line. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit bdf83008f4b2c723fd8e65e2a92bc47a2e7bc442 +Author: Chris Wilson +Date: Sat Aug 25 08:39:30 2012 +0100 + + compositor: Skip invisible strokes + + If the pen is reduced to a single point, it is effectively invisible + when rasterised, so skip the stroke composition. + + Signed-off-by: Chris Wilson + + src/cairo-compositor.c | 4 ++++ + src/cairo-pen.c | 34 +++++++++++++--------------------- + src/cairoint.h | 5 +++++ + 3 files changed, 22 insertions(+), 21 deletions(-) + +commit fc38d7375d4f0342ece91596d71f0ce56aa2c975 +Author: Chris Wilson +Date: Fri Aug 24 17:39:08 2012 +0100 + + xlib/shm: Add missing release of the display after GetImage + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 5355eab17d026f5d5566e6de47c9dbffc5ece5d0 +Author: Chris Wilson +Date: Fri Aug 24 10:34:05 2012 +0100 + + xlib/shm: Reduce the frequency at which we emit events + + Flushing the shm operation is a fairly rare event, as it is typically + only involved with mixed rendering on a similar image, and should be + triggering its own events. Therefore we should be able to reduce our + event emission to the critical points in order to limit the amount of + extra overhead we generate. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 4 ++-- + src/cairo-xlib-surface-shm.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 5c4087af810763ee98682b3bcc1c759ad8b4c27b +Author: Martin Robinson +Date: Tue Feb 28 10:50:16 2012 -0800 + + gl: Add a non-thread-aware mode for GL devices + + GLX and EGL devices are thread-aware currently. This + is safe, but on certain GPUs can be very expensive. In + this patch, we expose a new API which turns off the + safety feature in cases where performance is a priority. + + src/cairo-egl-context.c | 2 ++ + src/cairo-gl-device.c | 13 +++++++++++++ + src/cairo-gl-private.h | 2 ++ + src/cairo-gl.h | 4 ++++ + src/cairo-glx-context.c | 7 ++++--- + 5 files changed, 25 insertions(+), 3 deletions(-) + +commit 97410990935bb4baacbc1584362a87733c483583 +Author: Martin Robinson +Date: Fri Aug 17 16:00:51 2012 -0700 + + gl: Remove the shader language version abstraction + + Cairo only needs to support one version of the shader language API, + thanks to the dispatch table. This seems unlikely to change any time + soon. This makes the addition of new features, such as a uniform + location cache, simpler. + + src/cairo-gl-private.h | 6 +- + src/cairo-gl-shaders.c | 464 +++++++++++++++++-------------------------------- + 2 files changed, 159 insertions(+), 311 deletions(-) + +commit 5c77b4df146796d8280a4f5b16949e3db4a1f84a +Author: Chris Wilson +Date: Tue Aug 21 21:03:04 2012 +0100 + + xlib/shm: Only check if we are expecting an event + + As the XCheckWindowEvent() has the unwanted side-effect of flushing the + output queue when there is no event available (libX11 seems to be + entirely anti-performant), we need to roll our own that only checks the + already available event queue. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 2 -- + src/cairo-xlib-private.h | 3 --- + src/cairo-xlib-surface-shm.c | 62 ++++++++++++++++++++++++++++++++------------ + 3 files changed, 46 insertions(+), 21 deletions(-) + +commit aa5c7123097c56e2c35bf88b8377bbdd1523fbce +Author: Chris Wilson +Date: Tue Aug 21 10:12:06 2012 +0100 + + xlib/shm: Use a genuine event rather than an open-ended request + + Adding lots of requests without popping the replies causes xcb to + continually sort large lists of unprocessed data. Use an event instead + and regularly dequeue them. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 4 ++- + src/cairo-xlib-private.h | 3 ++ + src/cairo-xlib-surface-shm.c | 80 +++++++++++++++++++++++++++++++++----------- + 3 files changed, 66 insertions(+), 21 deletions(-) + +commit 30d09cd33a582a2dd3f3a544366892c724f67592 +Author: Chris Wilson +Date: Mon Aug 20 17:20:08 2012 +0100 + + cairo-script: Attempt to fallback for unresolved patterns + + If we fail to resolve a particular pattern, try removing a few features + from the pattern and see if we can resolve that fallback and continue on + with the trace with a close approximation. + + This is then behaves very similar as if the pattern requested a specific + font that was not available on the system and so was substituted. + + Signed-off-by: Chris Wilson + + util/cairo-script/cairo-script-operators.c | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +commit a7d505d40f439208b30762be663f332c60bc0883 +Author: Chris Wilson +Date: Mon Aug 20 16:43:28 2012 +0100 + + ft: Report FILE_NOT_FOUND if creating a font with a specified nonexistent file + + If the FcPattern used to create a font specifies an exact file to use + and it does not exist we will fail much later with an ambiguous + NO_MEMORY error. As suggested by Behdad Esfahbod we should report this + back to the user so that they can take the appropriate action rather + than providing an automatic fallback. + + Signed-off-by: Chris Wilson + + src/cairo-ft-font.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ee7f5607192a3341df45199b1c7c8996f2b7347d +Author: Chris Wilson +Date: Mon Aug 20 14:21:23 2012 +0100 + + stroker: Avoid emitting a miter join for across an elided degenerate segment + + Given the criteria of the rectlinear stroker that it only handles + horizontal and vertical line segments, and eliminates degenerate + segments before stroking, we must be careful not to apply a join between + two horizontal segments (for example if the intervening vertical segment + was degenerate and so elided). A miter join between two colinear + segments is empty, yet we were blissfully extending the line caps to + cover the join. + + Fixes: outline-tolerance + Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=407107 + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-boxes.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit 2a0d81743270aaff29e8951c896cde644fd4e576 +Author: Chris Wilson +Date: Mon Aug 20 13:34:33 2012 +0100 + + tests: Add outline-tolerance + + From https://bugs.freedesktop.org/show_bug.cgi?id=53841: + + "Rectangle drawn incorrectly when it has zero height + and miter limit greater than 1.414" + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/outline-tolerance.c | 52 +++++++++++++++++++++++++++++++ + test/reference/outline-tolerance.ref.png | Bin 0 -> 205 bytes + 3 files changed, 53 insertions(+) + +commit d6f8ce91dc449a29b0921a8787d9a3c9a687b429 +Author: Chris Wilson +Date: Sun Aug 19 23:55:28 2012 +0100 + + xlib: Move the shm cleanup from CloseDisplay to finish() + + Make sure that we always detach the ShmSegments upon dispose, or else we + can trivially leak lots of memory when using serial Display connections. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 43c5387d1b251938eeba458a95d63e2dc7178c2d +Author: Chris Wilson +Date: Sun Aug 19 12:41:15 2012 +0100 + + ft: Only use a specified font filename if its accessible + + If we try to use a non-existent path, FT_New_Face returns an error. + Instead, just use fontconfig to generate a fallback pattern. + + Signed-off-by: Chris Wilson + + src/cairo-ft-font.c | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +commit b3448c3dff79d0eda2a921178c26eb87f1ba34ea +Author: Chris Wilson +Date: Sat Aug 18 09:28:17 2012 +0100 + + xlib: Drop the false optimisation of using a potentially busy shm upload pixmap + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 10ef077324bb4c23630dcdab5f281f6fca00b78e +Author: Chris Wilson +Date: Sat Aug 18 09:16:49 2012 +0100 + + xlib/shm: Mark the ShmPixmap as active following an upload flush + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 99a0d38a33a3dd311a4cf4481b7286db4e8ec775 +Author: Chris Wilson +Date: Sat Aug 18 09:10:07 2012 +0100 + + xlib/shm: Fix runtime checking of has-shm-pixmaps for !shm case + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit ec01c71ecab46e0252d295f8d1f24f261b3f52af +Author: Chris Wilson +Date: Sat Aug 18 08:02:42 2012 +0100 + + xlib/shm: Wrap the detection of shm with locking + + As we access a global error variable, we need to hold a mutex against + simultaneous checking of multiple Displays. This should already be true + as we hold our display mutex to serialize initialisation, so just add an + assertion. As the client may mix use of cairo in one thread with X from + another, we need to hold the Display lock and serialise whilst + manipulating the low-level state of the Display. + + Suggested-by: Uli Schlachter + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 1bc9f673b61aa48369329606acc13aa5bce94a0a +Author: Chris Wilson +Date: Fri Aug 17 23:38:10 2012 +0100 + + xlib/shm: Avoid using a synchronous ShmCreatePixmap if evading the readback + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 3da2d8a1e277ae76ea2ba2533850b1901c6b3b29 +Author: Chris Wilson +Date: Fri Aug 17 23:37:31 2012 +0100 + + xlib: Only use CopyArea if the ShmPixmap and destination are the same depth + + Signed-off-by: Chris Wilson + + src/cairo-xlib-render-compositor.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 94815189a42e52a82c602e8f23e69e1826f51ce7 +Author: Chris Wilson +Date: Fri Aug 17 22:17:41 2012 +0100 + + xlib/shm: Clear the similar image surface + + The upper layers check that the surface returned to userspace is + cleared; make it so. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit c068691ff57c2f6cd750a54db17393c0e132cb00 +Author: Chris Wilson +Date: Fri Aug 17 21:33:54 2012 +0100 + + xlib/shm: Use an impromptu upload ShmSegment + + Reduce the number of copies required for uploading large image data. + Ultimately we want the client to allocate the similar-image itself to + acheive zero copy, this is just an intermediate step for legacy clients. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-private.h | 11 +++++-- + src/cairo-xlib-render-compositor.c | 65 ++++++++++++++++++++++++++++++++++++-- + src/cairo-xlib-surface-shm.c | 39 +++++++++++++++-------- + src/cairo-xlib-surface.c | 5 ++- + 4 files changed, 98 insertions(+), 22 deletions(-) + +commit bc38108947a684fb6e7af99a48ebc8f79d05856a +Author: Chris Wilson +Date: Fri Aug 17 20:57:04 2012 +0100 + + xlib/shm: Limit use of the impromptu fallback pixmap for uploads + + We want to avoid unnecessary readback and so only want to use the + ShmPixmap when uploading the complete surface. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-fallback-compositor.c | 14 +++++++++----- + src/cairo-xlib-private.h | 3 ++- + src/cairo-xlib-render-compositor.c | 28 +++++++++++++++++++++++++++- + src/cairo-xlib-surface-shm.c | 8 +++++++- + src/cairo-xlib-surface.c | 4 ++-- + 5 files changed, 47 insertions(+), 10 deletions(-) + +commit 4af7a1c8637f3008a2265e063ab990eec07e02dd +Author: Chris Wilson +Date: Fri Aug 17 23:17:43 2012 +0100 + + xlib/shm: Propagate the last-request to the synchronous create + + If we optimise away the pending frees we must be careful to propagate + the implied sync. + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 1a87c526bfb7c35f5f207ca4aca7cf50a3b96765 +Author: Chris Wilson +Date: Fri Aug 17 17:52:37 2012 +0100 + + xcb: Migrate to the common mempool implementation + + Having extracted the code for use by the SHM allocator for xlib, remove + the now redundant copy from xcb. + + Signed-off-by: Chris Wilson + + src/cairo-xcb-shm.c | 385 +++------------------------------------------------- + 1 file changed, 21 insertions(+), 364 deletions(-) + +commit e568e7c18b6aa631e4aedd44c44a14bbe6d72976 +Author: Chris Wilson +Date: Fri Aug 17 15:38:16 2012 +0100 + + xlib/shm: Fix up the shrinking of the priority queue + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7266d59ebc26c5ae80c04f0270fb88f33217ebd9 +Author: Chris Wilson +Date: Fri Aug 17 15:31:07 2012 +0100 + + configure: Restore previous pixman required version of 0.22.0 + + With optional compile time support for pixman glyphs, our hard pixman + requirement is then just 0.22.0 for the radial fixes (iirc). + + Signed-off-by: Chris Wilson + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f42c0dcf7b37c8daf80e8075aa5286d137062a88 +Author: Chris Wilson +Date: Tue Aug 14 21:50:37 2012 +0100 + + tor22: Add a simple method to quickly compute coverage (with saturation) + + Signed-off-by: Chris Wilson + + src/cairo-tor22-scan-converter.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0bfd2acd35547fc2bd0de99cc67d153f0170697d +Author: Chris Wilson +Date: Mon Aug 13 01:34:12 2012 +0100 + + xlib: Implement SHM fallbacks and fast upload paths + + Signed-off-by: Chris Wilson + + configure.ac | 4 +- + src/Makefile.sources | 3 + + src/cairo-cogl-surface.c | 8 +- + src/cairo-damage.c | 1 - + src/cairo-directfb-surface.c | 6 +- + src/cairo-gl-surface.c | 9 +- + src/cairo-image-compositor.c | 26 +- + src/cairo-image-surface-inline.h | 2 +- + src/cairo-image-surface-private.h | 6 + + src/cairo-image-surface.c | 2 +- + src/cairo-mempool-private.h | 83 +++ + src/cairo-mempool.c | 359 ++++++++++ + src/cairo-quartz-image-surface.c | 6 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-surface-backend-private.h | 3 +- + src/cairo-surface-inline.h | 4 +- + src/cairo-surface-observer.c | 6 +- + src/cairo-surface-private.h | 3 + + src/cairo-surface-snapshot.c | 5 +- + src/cairo-surface-subsurface.c | 6 +- + src/cairo-surface.c | 101 ++- + src/cairo-xcb-surface.c | 6 +- + src/cairo-xlib-display.c | 9 +- + src/cairo-xlib-fallback-compositor.c | 190 +++++- + src/cairo-xlib-private.h | 59 ++ + src/cairo-xlib-render-compositor.c | 155 ++++- + src/cairo-xlib-source.c | 231 ++++--- + src/cairo-xlib-surface-shm.c | 1119 +++++++++++++++++++++++++++++++ + src/cairo-xlib-surface.c | 286 ++++++-- + src/cairo-xlib-xcb-surface.c | 5 +- + src/cairoint.h | 2 +- + src/drm/cairo-drm-gallium-surface.c | 6 +- + src/drm/cairo-drm-i915-private.h | 2 +- + src/drm/cairo-drm-i915-surface.c | 8 +- + src/drm/cairo-drm-i965-shader.c | 4 +- + src/drm/cairo-drm-i965-surface.c | 5 +- + src/drm/cairo-drm-intel-private.h | 3 +- + src/drm/cairo-drm-intel-surface.c | 5 +- + src/drm/cairo-drm-radeon-surface.c | 6 +- + src/win32/cairo-win32-display-surface.c | 5 +- + src/win32/cairo-win32-gdi-compositor.c | 4 +- + 41 files changed, 2517 insertions(+), 238 deletions(-) + +commit 140fafed89508c4685f3a464c9dbe8df769f2411 +Author: Daniel Stone +Date: Thu Aug 16 18:23:41 2012 +0100 + + Fix broken XRender ARGB32 formats + + 46d79228 did indeed silence the compilation warning, but did so by never + creating an ARGB32 format, as PictStandardARGB32 is defined to 0. Fix + this by using PictStandardNUM as our canary value instead. + + This fixes GEdit and Chromium for me, both of which were only rendering + backgrounds and text in their GTK+ sections. + + Signed-off-by: Daniel Stone + + src/cairo-xlib-display.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 95b7f4fe3a5deea6766538d843c75626e4bb68cf +Author: Chris Wilson +Date: Sun Aug 12 19:10:04 2012 +0100 + + image: Temporarily resurrect the old non-pixman glyph compositor + + As the easiest approach to making another snapshot that only depends + upon a stable pixman, make the new dependency a compile time option. + + Signed-off-by: Chris Wilson + + configure.ac | 7 +- + src/cairo-image-compositor.c | 285 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 291 insertions(+), 1 deletion(-) + +commit 16426dab486767cb16dfaf5158c5d4b3317546b0 +Author: Chris Wilson +Date: Sun Aug 12 16:12:47 2012 +0100 + + skia: Compile fix for changes to map-to-image + + Signed-off-by: Chris Wilson + + src/skia/cairo-skia-surface.cpp | 16 +++++----------- + 1 file changed, 5 insertions(+), 11 deletions(-) + +commit d647d4f7db1f9b65f5d7f64574b1989b830aaa7c +Author: Chris Wilson +Date: Sat Aug 11 19:28:21 2012 +0100 + + damage: Update tail pointer after allocating new chunk + + Reported and based on a patch by fmot.fics + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=53384 + Signed-off-by: Chris Wilson + + src/cairo-damage.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit adfe9b7eb67f642cda93f80cf9c97f1eaded0317 +Author: Chris Wilson +Date: Sat Aug 11 17:55:49 2012 +0100 + + gl: Fudge gradient color generation to handle multiple stops at 0 + + In order to generate the correct left-hand border color, we need to + fudge the offsets of the color stops if multiple stops are defined at 0. + The reason is that pixman will generate our color ramp by using the + right-most color stop for the pixel centre, but in order to provide the + sample colour outside of the gradient we need pixel 0 to be have the + left-most color. + + Reported by Henry Song. + + src/cairo-gl-gradient.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit b0336e9aadbbface0a059887ac62b1398bc81e7b +Author: Chris Wilson +Date: Sat Aug 11 18:23:51 2012 +0100 + + gl: Use a wide texture ramp to emulate a linear step function + + If the gradient contains a step function, we need an infinitely sharp + texture to emulate the correct output. Failing that, lets just use as + large a texture as can be reasonably handled by the hardware + + src/cairo-gl-gradient.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 46d79228df5c5fda114e68d3df02eaa33b5a41c9 +Author: Chris Wilson +Date: Sat Aug 11 17:48:17 2012 +0100 + + xlib: Silence compiler warning + + cairo-xlib-display.c: In function '_cairo_xlib_display_get_xrender_format': + cairo-xlib-display.c:519:21: warning: 'pict_format' may be used + uninitialized in this function [-Wmaybe-uninitialized] + + Signed-off-by: Chris Wilson + + src/cairo-xlib-display.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 40e6be327861397a821e92ab626269e31fd13979 +Author: Chris Wilson +Date: Sat Aug 11 17:43:46 2012 +0100 + + gl: Remove unused variable + + cairo-gl-glyphs.c: In function '_cairo_gl_composite_glyphs_with_clip': + cairo-gl-glyphs.c:442:9: warning: unused variable 'i' [-Wunused-variable] + + Signed-off-by: Chris Wilson + + src/cairo-gl-glyphs.c | 1 - + 1 file changed, 1 deletion(-) + +commit f59b0914f4ddbff0d116c918343a6726d5f4317b +Author: Chris Wilson +Date: Sat Aug 11 17:38:36 2012 +0100 + + egl: s/EGL_KHR_surfaceless_opengl/EGL_KHR_surfaceless_context/ + + Mesa changed the name of the extension it invented, so check for the + real name and the old name before falling back to pbuffers which are not + supported by most EGL implementations. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=53361 + Signed-off-by: Chris Wilson + + src/cairo-egl-context.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit b438e583089229d934df48e6fbf0edcd1b23dcd4 +Author: Chris Wilson +Date: Sat Aug 11 17:37:52 2012 +0100 + + trace: Fix propagation of CAIRO_TRACE_OUTDIR to children + + Signed-off-by: Chris Wilson + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 65854a001529932c4f2c85a4ee32095443153319 +Author: Adrian Johnson +Date: Fri Aug 3 18:23:55 2012 +0930 + + type1 subset: ensure encoding includes all glyphs + + Bug 53040 + + src/cairo-type1-subset.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5dd0f2eb951f8fb1d50802c99c660de1de486154 +Author: Adrian Johnson +Date: Tue Jul 31 22:52:09 2012 +0930 + + cff subsetting: widths can be floating point + + Bug 52972 + + src/cairo-cff-subset.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 1e9abd6e4e5d857c5e7a117d4e960b222a5f5578 +Author: Henry Song +Date: Thu Jul 26 18:31:20 2012 +0100 + + gl: use absolute value for color difference between gradient stops + + src/cairo-gl-gradient.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 652c632fb211cede74cef3813c7d6e8099d02089 +Author: Chris Wilson +Date: Wed Jul 25 17:03:54 2012 +0100 + + gl: Fallback for copy_boxes if src/dst do not belong to the same device + + If the source and destination are on difference devices (GL contexts) we + can not simply texture from one to the other, and must either import the + source into the destination context (which has not yet been done) or + fallback through an image copy. + + This patch is based on the work by Henry Song, but moving the check from + the common compositor layer down into the GL backend. This should have + the same effect... + + Fixes gl-surface-source + + Suggested-by: Henry Song + Signed-off-by: Chris Wilson + + src/cairo-gl-spans-compositor.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit f3abb1079a9766646dd0eda2f8a1633f8efff516 +Author: Henry Song +Date: Wed Jul 25 16:12:22 2012 +0100 + + gl: translate proper matrix depending up type of gl_operand + + Fixes radial-gradiant-mask-source. + + src/cairo-gl-operand.c | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +commit d00539ca13fbd36dea07b386211ad49ef744d5ee +Author: Andrea Canciani +Date: Tue Jul 24 10:21:08 2012 +0200 + + quartz: Use the correct transform when replaying recording surfaces + + Recording surfaces should be replayed with the transform matrix used + in the pattern, otherwise the image surface will be transformed, + introducing artifacts. + + Fixes record{1414x,2x}-paint-alpha-{,solid-clip,clip}, + record2x-{self-intersecting,text-transform} and record90-paint-alpha. + + src/cairo-quartz-surface.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 44a07a66135c4f534c909bd84f24cf7c0275a914 +Author: Henry (Yu) Song - SISA +Date: Mon Jul 23 16:28:28 2012 +0000 + + quartz: Never acquire recording surfaces + + We need to replay if the source/mask surface is a recording surface + otherwise, a crash happens if it is unbounded. + + Fixes crashes in recordxx-xxx tests + + src/cairo-quartz-surface.c | 86 ++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 67 insertions(+), 19 deletions(-) + +commit 459c060b6fcc0a3b7e6f0e544fe83f954a5ca716 +Author: Henry (Yu) Song - SISA +Date: Tue Jul 24 02:05:15 2012 +0000 + + clip: Transform clip path in _cairo_clip_intersect_clip_path_transformed() + + _cairo_clip_intersect_clip_path_transformed() completely ignored the + transformation matrix instead of transforming all the clip paths with + it. + + This caused bugs when replaying recording surfaces. + + Fixes record{2x,1414x,90}-paint-alpha-clip-mask. + + src/cairo-clip.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5f1dd8b3684db5aed42f355fa41310639e7d395d +Author: Andrea Canciani +Date: Tue Jul 24 09:56:52 2012 +0200 + + xcb: Fix make check + + The xcb private header uses the ASSERT_NOT_REACHED macro. + This macro is defined in cairoint.h, which needs to be included. + + Fixes: + + CHECK cairo-xcb-private.h + In file included from headers-standalone-tmp.c:1: + ./cairo-xcb-private.h: In function ‘_cairo_xcb_connection_shm_put_image’: + ./cairo-xcb-private.h:636: error: ‘ASSERT_NOT_REACHED’ undeclared (first use in this function) + ./cairo-xcb-private.h:636: error: (Each undeclared identifier is reported only once + ./cairo-xcb-private.h:636: error: for each function it appears in.) + + src/cairo-xcb-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 21e3f2e9034b64131075d82a4e34868dc72f2249 +Author: Chuanbo Weng +Date: Thu Jul 12 18:08:51 2012 +0100 + + gl: copy_boxes() does not support copying from a non-texture source + + So check for the appropriate surface type at the start and return + UNSUPPORTED if we cannot handle it directly. We will then fallback to + pushing the image instead. + + Together with the previous patch, fixes 8 fails in cairo-test-suite. + + src/cairo-gl-spans-compositor.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 77f8bd3199b546b3ba039afc90337159636b63f6 +Author: Chuanbo Weng +Date: Thu Jul 12 18:07:42 2012 +0100 + + gl: Create a new texture surface if the source surface type is gl-window + + When the source surface type is gl-window, we should return unsupported + and then create a new texture surface for it. Based on the code of + Henry's tree. + + src/cairo-gl-operand.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit ac2668dd087ce32d86d3bd44f7886638e76b5b8a +Author: Dongyeon Kim +Date: Thu Jul 12 18:13:43 2012 +0100 + + gl: Set is_clear flag to FALSE after map_to_image + + In _cairo_gl_surface_map_to_image(), the image surface data has been + filled by glReadPixels, so is_clear flag should be set to FALSE. + Otherwise mapped image surface does not get drawn as it is presumed + clear and so returns true from nothing_to_do(). + + src/cairo-gl-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 70c2125e2c968358a8c7ddaa4e356e9b0de9c323 +Author: Chris Wilson +Date: Thu Jul 12 18:11:21 2012 +0100 + + perf/chart: Render a solid bar if the column is too narrow for the gradient + + Signed-off-by: Chris Wilson + + perf/cairo-perf-chart.c | 53 +++++++++++++++++++++++++++++-------------------- + 1 file changed, 31 insertions(+), 22 deletions(-) + +commit 6aed048484801285ca7bd5afd825294f1ab7ce6d +Author: Chris Wilson +Date: Wed Jul 11 11:51:36 2012 +0100 + + gl: Add the compile fix that I forgot to add to the previous commit + + src/cairo-gl-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bdb9c2cb4389d7bcbd3602f8ce8fb457fb1003bd +Author: Henry Song +Date: Wed Jul 11 10:05:51 2012 +0100 + + gl: Destroy glyph cache surface during finish + + We must destroy glyph cache surface in device_finish instead of in + device_destroy because in device_destroy device status is + DEVICE_FINISHED and the operation is invalid. + + src/cairo-gl-device.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 64a236246bf4276606ce69c79702f15373c5425d +Author: Henry Song +Date: Tue Jul 10 16:12:25 2012 +0100 + + gl: generate correct gradient color texture + + Pixman generates gradient color at the center of pixel. We need to + adjust such accordingly in GL when generating gradient texture + + src/cairo-gl-gradient.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6938592ec7e1a1b4cfccb11521ecdfdb8579f380 +Author: Chris Wilson +Date: Mon Jul 9 21:50:34 2012 +0100 + + xlib: If a sample accesses outside of a repeating image, upload it all + + Fixes bug-51910 + + Reported-by: Albertas VyÅ¡niauskas + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=51910 + Signed-off-by: Chris Wilson + + src/cairo-xlib-source.c | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +commit ff22ab4c10e169e457887fae4fbd5394d45b939e +Author: Chris Wilson +Date: Mon Jul 9 16:13:49 2012 +0100 + + test: Add example from bug-51910 + + The calculation of the required source extents blows up under xlib. + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/bug-51910.c | 91 +++++++++++++++++++++++++++++++++++++++ + test/reference/bug-51910.ref.png | Bin 0 -> 1987 bytes + 3 files changed, 92 insertions(+) + +commit 7b6f9fd14091d23a69b06c422262d293268035d0 +Author: Chris Wilson +Date: Fri Jun 29 19:57:21 2012 +0100 + + test: Add a simple exercise for raster sampling of subpixel geometry + + Test that the rasteriser doesn't incorrectly merge disjoint geometry at + the subpixel level. + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/reference/sample-diagonal.ref.png | Bin 0 -> 272 bytes + test/reference/sample-horizontal.ref.png | Bin 0 -> 209 bytes + test/reference/sample-vertical.ref.png | Bin 0 -> 209 bytes + test/sample.c | 117 +++++++++++++++++++++++++++++++ + 5 files changed, 118 insertions(+) + +commit 1cac6e7fcc88b8545a9c56bf3265f37418957bb7 +Author: Adrian Johnson +Date: Thu Jul 5 22:41:28 2012 +0930 + + cff: initialise variable to prevent valgrind warning + + src/cairo-cff-subset.c | 1 + + 1 file changed, 1 insertion(+) + +commit 49c8e1b6744aa9cd296fff07d5be0ba7dcc69ff7 +Author: Adrian Johnson +Date: Thu Jul 5 21:59:33 2012 +0930 + + cff: use correct size for buffer + + Bug 51443 + + src/cairo-cff-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 77106a038bcd0dd503d383729f14134f76a664b2 +Author: Adrian Johnson +Date: Wed Jul 4 19:54:18 2012 +0930 + + cff: convert '.' to locale specific decimal point before using sscanf + + to fix bug when decoding cff real numbers. + + Bug 51443 + + src/cairo-cff-subset.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +commit 64d65f72e5dbc1d9fa2cb4738d93eadc7fd5d7c0 +Author: Chris Wilson +Date: Fri Jun 29 10:25:13 2012 +0100 + + boilerplate/gl: Round fractional window sizes up + + A few test cases purposely create fractional surface sizes which can not + be natively supported by the raster backends such as GL. For these + backends we need to consistent in creating a surface that is large + enough to contain the test, so we need to use ceil() rather than + implicit truncation to integers. + + A consequence of the misalignment between the Window size and the + surface size (where one was using ceil and the other not) is that the + first row of the cairo surface would not be visible on the output. + + Based on a patch by Chuanbo Wen to fix 5 test cases, such as + group-unaligned. + + Signed-off-by: Chris Wilson + + boilerplate/cairo-boilerplate-glx.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit cb85631c63539f259d6a3c1c04db904cbbf01d93 +Author: Chris Wilson +Date: Mon Jun 25 14:07:33 2012 +0100 + + ft: Indentation fixup for _get_bitmap_surface() + + Signed-off-by: Chris Wilson + + src/cairo-ft-font.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 1bdee6b1ad00a2e5916bffea71719977f37f1982 +Author: Chuanbo Weng +Date: Tue Jun 26 08:02:35 2012 +0800 + + gl: Set correct operation extents. + + The dst_x and dst_y should be considered when setting clip extents, + because they are not always be zero. (for example, in clip-operator.c) + + src/cairo-gl-glyphs.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 9f52261dd7941ec7b338b050479da25c2571f9ac +Author: Uli Schlachter +Date: Sun Jun 3 19:35:37 2012 +0200 + + xcb: Correctly handle a recording surface's extents + + The size of the target area doesn't really have much to do with the size of the + recording surface that we are painting from. Thus, let's use the recording + surface's size instead. + + Since we apply the transformation before replaying the recording surface, we + need to transform the recording surface's size via the inverse of our pattern + matrix to get the size in the target surface. This makes this a little more + complex. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 48 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 37 insertions(+), 11 deletions(-) + +commit e704f64d8fcceb220c8c99092c19c2cfd4bd9330 +Author: Uli Schlachter +Date: Sun Jun 3 16:53:49 2012 +0200 + + xcb: Handle recording surfaces differently + + Let's say we are painting recording surface 'source' to xcb surface 'target' by + replaying the source to a temporary surface 'tmp'. + + Previously, the xcb backend replayed the recording surface to tmp with just a + translation and then used that as its source surface with the pattern's + transformation. That means 'tmp' used the same coordinate system as 'source'. + + This patch changes this so that the transformation is applied during the replay + and painting from 'tmp' to 'target' is just a simple translation, so 'tmp' now + uses the same coordinate system as 'target'. + + This should produce way less better results, because transforming a recording + surface should have less artifacts than transforming a raster surface. + + Fixes: record1414x-* record2x-* record90-* ps-surface-source + + Breaks (or rather, "exposes unrelated bug that I have not yet figured out in"): + record-extend-*-similar + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 13d61d7bdb7ec37ebb7324187aca1b9b9b1600cf +Author: Chuanbo Weng +Date: Sun Jun 24 12:13:02 2012 +0100 + + gl: Set correct clip rectangle for non-texture destination surfaces + + When the desintation surface is not a texture, it is flipped in the Y + axis. So we need to correct the Y coordinates when using glScissor to + the set the clip region. + + Fixes 14 cases in cairo-test-suite, for example partial-clip-text-top + + src/cairo-gl-composite.c | 27 ++++++++++++++++++++++----- + 1 file changed, 22 insertions(+), 5 deletions(-) + +commit 166e6f199e909d8aea13cdd4c858d48faad26247 +Author: Chris Wilson +Date: Sun Jun 24 11:33:47 2012 +0100 + + stroke: Skip inserting a round-join if within tolerance + + If the angle between two segments is small we can simply replace the + round-join with a bevel-join. This is done automatically by the + insertion of the triangle fan as it will not be able to find a point + around the pen between the two vectors. However, we can make that search + cheaper by inspecting whether the bisection angle is small enough that + the bevel-join will be within geometric tolerance of the round-join. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit b7bd5ae4f3da44131261711bb236cd7aa24a3ae3 +Author: Chris Wilson +Date: Sun Jun 24 11:27:16 2012 +0100 + + stroke: Use round-joins near inflection points of splines + + Near an inflection, the angle between two segments of a spline increases + rapidly (as the radius of curvature decreases for the cusp). The angle + may increase so much that a simple line connecting the two outside + points of the spline is not within the user specified geometric + tolerance (with the result that you can generate severe ugliness around + a cusp). Extend the current detection of the exact inflection to cover + the sharp joins near the cusp by inspecting whether the bisection angle + is larger than acceptable. + + Fixes bug-spline. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit 3d482e266febcf7da75f5662e518380460068ce1 +Author: Chris Wilson +Date: Sun Jun 24 11:50:26 2012 +0100 + + test: Exercise bug in joining together spline segments around cusps + + Carl Worth demonstrated a glaring bug in the new stroking code, + introduced in commit 545f30856aac98199 (stroke: Convert the outlines + into contour and then into a polygon), whereby only a bevel join was + being used to connect segments around a sharp inflection point. + + This adds the two examples he reported to the test suite. + + test/Makefile.sources | 1 + + test/bug-spline.c | 96 ++++++++++++++++++++++++++++++++++++++ + test/reference/bug-spline.ref.png | Bin 0 -> 5476 bytes + 3 files changed, 97 insertions(+) + +commit 185a3518968d5ca0babb798fe10f247171a1e001 +Author: Chris Wilson +Date: Wed Jun 20 09:15:29 2012 +0100 + + gl: Trim the glyph mask to the operation extents + + In the case we try to use an unbounded operation, passing a NULL clip + causes that operation to clear the rest of the surface. Instead we need + to trim the _cairo_surface_mask() to the operation extents. + + Fixes overlapping-glyphs. + + Suggested-by: Chuanbo Weng + Signed-off-by: Chris Wilson + + src/cairo-gl-glyphs.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 35e4ffd91cc73fb17c47a12010f515941d6f4d3d +Author: Chris Wilson +Date: Fri Jun 15 10:52:25 2012 +0100 + + image: Fix up glyphs compositing + + Jose Dapena Paz reported an assertion following the uninitialised status + value being returned. Also the function failed to free its allocations. + + Based on a patch by Jose Dapena Paz . + Reported-by: Jose Dapena Paz + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=51104 + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 60 ++++++++++++++++++-------------------------- + 1 file changed, 24 insertions(+), 36 deletions(-) + +commit 9bc1ea44316d448110c1d128a9f74147f775943d +Author: Henry Song +Date: Thu Jun 14 23:07:34 2012 +0100 + + subsurface: Disable subsurface-set-snapshot as it creates a ref cycle + + _cairo_surface_subsurface_set_snapshot () sets the subsurface as the + snapshot of its target. This creates a reference cycle (as the target + is already referenced by the surface) and thus a memory leak (assuming + the likely case that user doesn't call finish). + + Test case: subsurface-similar-repeat. + + So make this call as a no-op for the time being until the bug is fixed. + + src/cairo-surface-subsurface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 13ba74a00d34b232f76ecb9efc96eea1227ce649 +Author: Andrea Canciani +Date: Thu Jun 14 08:12:41 2012 +0200 + + quart-image: Fix compilation + + quartz-image uses _cairo_surface_is_image(), which is now declared in + cairo-image-surface-inline.h. + + Fixes: + cairo-quartz-image-surface.c: In function 'cairo_quartz_image_surface_create': + cairo-quartz-image-surface.c:312: error: implicit declaration of function '_cairo_surface_is_image' + cairo-quartz-image-surface.c:312: warning: nested extern declaration of '_cairo_surface_is_image' + + src/cairo-quartz-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 615205cf072935401dac46813b597e70bc8f0a8c +Author: Søren Sandmann Pedersen +Date: Mon Apr 30 09:41:44 2012 -0400 + + Use the new pixman_glyph_cache_t API that will be in pixman 0.28.0 + + This new pixman API allows glyphs to be cached and composited in one + go, which reduces overhead compared to individual calls to + pixman_image_composite_region32(). + + Notes: + + - There is an explicit call to _cairo_image_scaled_glyph_fini(). This + could instead be done with a private, but I chose not to do that + since we don't need to store any actual data; we only need + notification when the glyph dies. + + - The slowdown in poppler-reseau is real and stable across runs. I'm + not too concerned about it because this benchmark is only one run + and so it is dominated by glyph cache setup costs and FreeType + rasterizing. + + Performance results, image backend: + + Speedups + firefox-talos-gfx 5571.55 -> 4265.57: 1.31x speedup + gnome-terminal-vim 1875.82 -> 1715.14: 1.09x speedup + evolution 1128.24 -> 1047.68: 1.08x speedup + xfce4-terminal-a1 1364.38 -> 1277.48: 1.07x speedup + + Slowdowns + poppler-reseau 374.42 -> 394.29: 1.05x slowdown + + Performance results, image16 backend: + + Speedups + firefox-talos-gfx 5387.25 -> 4065.39: 1.33x speedup + gnome-terminal-vim 2116.66 -> 1962.79: 1.08x speedup + evolution 987.50 -> 924.27: 1.07x speedup + xfce4-terminal-a1 1856.85 -> 1748.25: 1.06x speedup + gvim 1484.07 -> 1398.75: 1.06x speedup + + Slowdowns + poppler-reseau 371.37 -> 393.99: 1.06x slowdown + + Also bump pixman requirement to 0.27.1. + + configure.ac | 2 +- + src/cairo-image-compositor.c | 361 +++++++++++++---------------------------- + src/cairo-mutex-list-private.h | 1 + + src/cairo-scaled-font.c | 2 + + src/cairoint.h | 4 + + 5 files changed, 121 insertions(+), 249 deletions(-) + +commit f228769dfe5a8b5d73c49a41e95e31ed73a77fb3 +Author: Chris Wilson +Date: Fri Jun 8 17:22:41 2012 +0100 + + polygon-reduce: Reduce broken stopped-edge continuation + + This is hopefully a lesser used path and the attempted optimisation to + continue a stopped edge with a colinear stopped edge highly unlikely and + lost in the noise of the general inefficiency of the routine. As it was + broken, rather than attempt to rectify the "optimisation" remove it. + + Reported-by: Evangelos Foutras + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50852 + Signed-off-by: Chris Wilson + + src/cairo-polygon-reduce.c | 157 +++++++++++++++------------------------------ + 1 file changed, 52 insertions(+), 105 deletions(-) + +commit fc501fd6b5c378006cd8970c1dd30ee753817b6d +Author: Chris Wilson +Date: Fri Jun 8 17:22:17 2012 +0100 + + tor-scan-converter: Always recompute min-height following edge removal + + Signed-off-by: Chris Wilson + + src/cairo-tor-scan-converter.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 1bc696a8fda55ee75139f7d0123d348bbd96d2af +Author: Chris Wilson +Date: Fri Jun 8 17:20:32 2012 +0100 + + spans-compositor: After polygon intersection the fill rule is always non-zero + + As it turns out due to the rules of polygon intersection, there is never + any overlapping spans so the choice is arbitrary. However, lets be + consistent with the rest of the code. + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 37532b47c0ef6528fb6696fe97be337d9ad0a900 +Author: Chris Wilson +Date: Thu Jun 7 15:14:31 2012 +0100 + + scaled-font: Take lock around disposing of an empty page upon alloc failure + + Spotted by code inspection whilst looking at #50705 + + References: https://bugs.freedesktop.org/show_bug.cgi?id=50705 + Signed-off-by: Chris Wilson + + src/cairo-scaled-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2f1d6b27e8b78c77346a5b603114b54400e57d83 +Author: Adrian Johnson +Date: Thu Jun 7 19:18:52 2012 +0930 + + cff-subsetting: Ignore charset for non cid fonts + + Fixes crash in https://bugzilla.gnome.org/show_bug.cgi?id=677422 + + src/cairo-cff-subset.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 9fa047c0ea49d94f9f27947931fe21b70f6463d5 +Author: Chris Wilson +Date: Mon Jun 4 20:16:12 2012 +0100 + + composite-rectangles,scaled-font: Use accurate extents if the font is broken + + If the font metrics appear broken, i.e. key values are being reported as + zero, skip approximating the bbox of the glyph string. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=50688 + Signed-off-by: Chris Wilson + + src/cairo-composite-rectangles.c | 5 +++-- + src/cairo-scaled-font.c | 11 ++++++++++- + src/cairoint.h | 2 +- + 3 files changed, 14 insertions(+), 4 deletions(-) + +commit 0210499578898ba5bab8dbd323455c6735419a5a +Author: Adrian Johnson +Date: Sat Jun 2 10:48:34 2012 +0930 + + pdf: fix the offset of padded images + + Bug 50598 + + src/cairo-pdf-surface-private.h | 2 -- + src/cairo-pdf-surface.c | 16 ++++++++++++---- + 2 files changed, 12 insertions(+), 6 deletions(-) + +commit f1b546b1a2b3c4a87ca00ce0d6fa6ce88c84d20c +Author: Chris Wilson +Date: Fri Jun 1 17:46:25 2012 +0100 + + Erradicate internal use of cairo_surface_get_type() + + Signed-off-by: Chris Wilson + + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-quartz-image-surface.c | 4 ++-- + src/cairo-surface.c | 1 - + src/cairoint.h | 1 - + 5 files changed, 6 insertions(+), 8 deletions(-) + +commit e23d179e08367dc03c5c8f242bbc3af0749d4920 +Author: Chris Wilson +Date: Fri Jun 1 17:46:25 2012 +0100 + + Erradicate internal use of cairo_surface_get_content() + + Signed-off-by: Chris Wilson + + src/cairo-pdf-surface.c | 9 ++++----- + src/cairo-ps-surface.c | 2 +- + src/cairo-surface.c | 1 - + src/cairo-svg-surface.c | 2 +- + src/cairoint.h | 1 - + 5 files changed, 6 insertions(+), 9 deletions(-) + +commit 4b5d3436a36e7a2fe29131dff58b50999cd972bb +Author: Søren Sandmann Pedersen +Date: Fri Jun 1 08:13:17 2012 +0100 + + image: Fix bugs related to glyph mask creation + + In addition to fixing a bug 7d8d98b91ccf7165be853c36e6d5ef releated to + expanding a8 glyphs into a8r8g8b8, this commit also added an + optimization where if the first glyph had format a8r8g8b8, the mask + was created in this format from the beginning instead of later + converting from a8 to a8r8g8b8. + + However, the optimization had two bugs in it: + + (1) The computed stride was 3 * width, not 4 * times width, and + (2) In the case where the mask was allocated on the stack, it was + allocated as PIXMAN_a8 and not a8r8g8b8. + + The commit fixes both bugs. + + src/cairo-image-compositor.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c0a92bf8329c5a8aee76ac96034435d4fce043dc +Author: Chris Wilson +Date: Thu May 31 18:30:58 2012 +0100 + + surface: replace map-to-image clone's use of user_data with parent pointer + + Removes an another undeclared PLT entry and prevents mixing of user_data + with internal state. + + Signed-off-by: Chris Wilson + + src/cairo-image-surface-inline.h | 6 ++++++ + src/cairo-image-surface-private.h | 3 --- + src/cairo-image-surface.c | 12 +----------- + 3 files changed, 7 insertions(+), 14 deletions(-) + +commit 9e933d4b8790f0f8309bdd980f4558d51ccec168 +Author: Chris Wilson +Date: Thu May 31 18:25:09 2012 +0100 + + gl: Add missing cairo-private to _cairo_gl_composite_with_clip + + Signed-off-by: Chris Wilson + + src/cairo-gl-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9275b4d5aa45320bc3804980337c7aff6c34c029 +Author: Chris Wilson +Date: Thu May 31 18:22:11 2012 +0100 + + surface: Eliminate PLT entries for map-to-image + + Use the internal symbols internally. + + Signed-off-by: Chris Wilson + + src/cairo-surface.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit 2c6ba9a8733044ad8685e6e8312e945a7a49ce3a +Author: Chris Wilson +Date: Thu May 31 18:08:05 2012 +0100 + + image: silence make check + + The check for standalone headers requires that the + cairo-image-surface-inline.h include the cairo-surface-private.h + + Signed-off-by: Chris Wilson + + src/cairo-image-surface-inline.h | 1 + + src/cairo-surface-private.h | 3 +++ + src/cairoint.h | 3 --- + 3 files changed, 4 insertions(+), 3 deletions(-) + +commit 98c3ed1dbd9036cb8d6f64d170d213a865e2094a +Author: Chuanbo Weng +Date: Wed May 30 22:51:03 2012 +0800 + + gl: Do correct translation and lerp in gl-traps-compositor. + + Coordinate translation is necessary in composite_boxes(), composite() + and composite_traps(). The translation value should set to correct + value in traps_to_operand(). Also fix the bug in lerp(). + + src/cairo-gl-traps-compositor.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 7d8d98b91ccf7165be853c36e6d5ef0714f4a986 +Author: Chris Wilson +Date: Thu May 31 11:19:23 2012 +0100 + + image: Upconvert glyphs through a WHITE source when adding to the glyph mask + + We need to scale the channels of the glyph into the destination (and + indeed expand a8 into a8r8g8b8) when adding into the mask. Normally we + have matching formats for the glyph surfaces and the temporary mask, + for which we can continue to take the faster path. + + Reported-by: Søren Sandmann + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 74 ++++++++++++++++++++++++++++++++------------ + 1 file changed, 55 insertions(+), 19 deletions(-) + +commit 3f325764e547713bb25aef56d8ffa624bfae75d1 +Author: Adrian Johnson +Date: Thu May 31 17:46:31 2012 +0930 + + pdf: Don't use extents when acquiring a RASTER_SOURCE pattern + + because the pdf surface reuses the image each time the pattern is used. + + src/cairo-pdf-surface.c | 17 ++++------------- + 1 file changed, 4 insertions(+), 13 deletions(-) + +commit 43105a89d881a9f86f887c91c022ffc9477c6678 +Author: Chris Wilson +Date: Thu May 31 08:49:39 2012 +0100 + + test: Restore bug-seams reference + + An overzealous update after converting antialiasing missed the object of + this test was exactly to point out an error due to the antialiasing. So + restore it back to the prestine reference and mark the image backend as + failing. + + Signed-off-by: Chris Wilson + + test/reference/bug-seams.argb32.ref.png | Bin 1647 -> 0 bytes + test/reference/bug-seams.rgb24.ref.png | Bin 1647 -> 0 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 25317dbd88e96bb49fa760b50fe705a6a79ee2ec +Author: Yuanhan Liu +Date: Wed May 30 20:55:22 2012 +0800 + + configure.ac: remove annoying change of INSTALL file + + Every time we run ./autogen.sh, the INSTALL file would be replace by + /usr/share/automake-1.11/INSTALL, which changes the file. This is very + annoying since it messes up the result of 'git diff' and git always + wants to commit it. + + Declare it as foreign would fix this annoying issue. Since it's not a + GNU project, it makes sense to do so. + + Signed-off-by: Yuanhan Liu + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f3a1ee5edd1a46e3c316d8555262bce556bc1480 +Author: Chris Wilson +Date: Wed May 30 11:10:34 2012 +0100 + + gl: Do no access ctx after release during map-to-image + + Based on a patch by Yuanhan Liu. + + Signed-off-by: Chris Wilson + + src/cairo-gl-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 9340fcd965dedf714f658c6ad441787d75c05e59 +Author: Yuanhan Liu +Date: Wed May 30 15:13:46 2012 +0800 + + gl: use _cairo_gl_operand_copy to fix unblanced reference count + + Use _cairo_gl_operand_copy to do the operand copy instead of by + something like *operand = surface->operand. + + This would fix a crash introduced by operator-source test case, which + forgot to do reference while copying operand but did dereference while + destroying surface at combine_clip_as_traps(). + + Signed-off-by: Yuanhan Liu + [ickle: drop the extra reference for the owned surface] + Signed-off-by: Chris Wilson + + src/cairo-gl-operand.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f3ae8302072dbcee38be4e0a9397e5aaa4084ecf +Author: Adrian Johnson +Date: Sun May 27 22:59:13 2012 +0930 + + pdf: merge _emit_recording_surface and _emit_recording_subsurface into the one function + + src/cairo-pdf-surface.c | 112 +++++++++++------------------------------------- + 1 file changed, 26 insertions(+), 86 deletions(-) + +commit 5dd119c1fef0c30bc71311ca9ccacf1f6e8017cf +Author: Adrian Johnson +Date: Sun May 27 22:32:41 2012 +0930 + + ps: check if EXTEND_PAD group can be painted with EXTEND_NONE + + src/cairo-ps-surface.c | 31 +++++++++++++++++++++++++------ + 1 file changed, 25 insertions(+), 6 deletions(-) + +commit fcfa45c9f79ccd855d0a16ee1b0f0fa3b4da7809 +Author: Adrian Johnson +Date: Sun May 27 11:53:43 2012 +0930 + + pdf: fix smask gradient bbox + + src/cairo-pdf-surface.c | 29 ++++++++++++++++++++++++++--- + 1 file changed, 26 insertions(+), 3 deletions(-) + +commit 29a42ae6827dd17d002304aba552ffb83d3f8a2f +Author: Chris Wilson +Date: Sat May 26 15:16:13 2012 +0100 + + surface: Kill imagesurf temporary variable + + The local alias to &image->base is more confusing that the code it + replaces. + + Signed-off-by: Chris Wilson + + src/cairo-surface.c | 19 +++++-------------- + 1 file changed, 5 insertions(+), 14 deletions(-) + +commit 11e276753f0d335027a7727bf17006d612b4e4c2 +Author: Chris Wilson +Date: Sat May 26 15:20:56 2012 +0100 + + image: Propagate errors from clone_subimage + + Signed-off-by: Chris Wilson + + src/cairo-image-surface.c | 26 +++++++++++++++++++------- + 1 file changed, 19 insertions(+), 7 deletions(-) + +commit fc33cc3c3af1fc616ae445a15d2b146a29090b0f +Author: Andrea Canciani +Date: Fri Jan 6 19:47:08 2012 +0100 + + quartz: Provide a valid implementation of map_to_image + + and reuse it to implement acquire_source. + + Fixes + + cairo-quartz-surface.c: In function '_cairo_quartz_surface_map_to_image': + cairo-quartz-surface.c:1568: warning: return from incompatible pointer type + cairo-quartz-surface.c:1576: warning: return from incompatible pointer type + + src/cairo-quartz-surface.c | 203 ++++++++++++++++----------------------------- + 1 file changed, 71 insertions(+), 132 deletions(-) + +commit a8a4a8dfd450a8ce97998b5e5e09971d07a957f4 +Author: Andrea Canciani +Date: Fri Jan 6 20:13:39 2012 +0100 + + quartz: Mark surfaces created clear as is_clear + + This might provide a speedup when clearing an already clear surface + and is required by cairo_surface_create_similar(). + + Fixes zero-mask. + + src/cairo-quartz-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3735881e38d2bee941128725b8cdde6779d60a30 +Author: Andrea Canciani +Date: Tue Apr 10 22:58:18 2012 +0200 + + quartz: Silence warning + + cairo-quartz-surface.c:177: warning: enumeration value + 'CAIRO_FORMAT_RGB30' not handled in switch + + src/cairo-quartz-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 13b7364836e14b811bbeb3ba0849e6d6c0fb1dd3 +Author: Andrea Canciani +Date: Wed Jan 11 17:17:29 2012 +0100 + + surface: Use the internal map/unmap + + In many places Cairo maps/unmaps surfaces to perform operations on the + raw image, but it doesn't care about the format being invalid. All of + these are appropriate users of _cairo_surface_map_to_image(). + + src/cairo-fallback-compositor.c | 56 +++++++++++++++++++++++------------------ + src/cairo-gl-operand.c | 8 +++--- + src/cairo-surface-observer.c | 6 ++--- + src/cairo-surface.c | 2 -- + src/cairo-xlib-source.c | 16 ++++++------ + src/cairoint.h | 2 -- + 6 files changed, 46 insertions(+), 44 deletions(-) + +commit 37c5c2dbe55f64ee84ab248eb0072d5d7c5145cc +Author: Andrea Canciani +Date: Wed Jan 11 20:51:29 2012 +0100 + + surface: Only use non-NULL extents for internal mapping + + _cairo_surface_map_to_image() requires the input extents to be + non-NULL. + + src/cairo-gl-operand.c | 5 ++++- + src/cairo-xlib-source.c | 13 ++++++++++--- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit d6fb8d2134c989d2ad455ec37ce4f623d4769c46 +Author: Andrea Canciani +Date: Wed Jan 11 17:17:15 2012 +0100 + + surface: Make backend-specific map/unmap functions symmetric + + Map allocates a surface. Symmetrically, unmap should destroy it. + + src/cairo-gl-surface.c | 17 ++++++++++++----- + src/cairo-image-surface.c | 3 +++ + src/cairo-os2-surface.c | 1 + + src/cairo-quartz-image-surface.c | 7 ++----- + src/cairo-quartz-surface.c | 1 + + src/cairo-surface-observer.c | 12 ++---------- + src/cairo-surface-subsurface.c | 12 ++---------- + src/cairo-surface.c | 2 +- + src/cairo-xcb-surface.c | 13 ++++++++++--- + src/cairo-xlib-surface.c | 17 ++++++++++++----- + src/cairo-xlib-xcb-surface.c | 10 ++-------- + 11 files changed, 48 insertions(+), 47 deletions(-) + +commit df7829e2cca07c3bfcddda1c66ca56280edceaf4 +Author: Andrea Canciani +Date: Tue Apr 10 20:15:04 2012 +0200 + + surface: Make map_to_image return cairo_image_surface_t* + + This makes it easier to check that the funciton is returning the + correct type of surfaces. + + src/cairo-directfb-surface.c | 13 +++++++------ + src/cairo-gl-surface.c | 16 ++++++++-------- + src/cairo-image-surface-inline.h | 6 ++++++ + src/cairo-image-surface-private.h | 2 +- + src/cairo-image-surface.c | 4 ++-- + src/cairo-os2-surface.c | 2 +- + src/cairo-quartz-image-surface.c | 2 +- + src/cairo-quartz-surface.c | 2 +- + src/cairo-surface-backend-private.h | 2 +- + src/cairo-surface-observer.c | 2 +- + src/cairo-surface-subsurface.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-xcb-surface.c | 18 +++++++++++------- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo-xlib-xcb-surface.c | 2 +- + src/skia/cairo-skia-surface.cpp | 3 ++- + src/win32/cairo-win32-display-surface.c | 8 ++++---- + 17 files changed, 51 insertions(+), 39 deletions(-) + +commit 10c0a1c68c34677273d2f48c5d5a6c1c15a320c0 +Author: Andrea Canciani +Date: Sun Jan 8 15:30:03 2012 +0100 + + surface: Define private map/unmap functions + + Cairo backends often need to map/unmap to a raster surface but they + don't care about the pixel format, as Pixman will be doing the format + handling. + + Cairo users cannot know how to access the raw data if the format is + invalid. + + The two different scenarios call for different guarantees on the + returned surface. + + The private map/unmap functions also makes it possible to simply + return the status upon unmapping. + + src/cairo-image-surface-private.h | 7 ++ + src/cairo-image-surface.c | 41 +++++++ + src/cairo-surface.c | 239 ++++++++++++++++++++++++++------------ + src/cairoint.h | 8 ++ + 4 files changed, 222 insertions(+), 73 deletions(-) + +commit 3e9895e95100ced3a6fcbedcba75e50ca450b4f0 +Author: Andrea Canciani +Date: Mon May 7 19:05:05 2012 +0200 + + png: Implement conversion of CAIRO_FORMAT_RGB30 to string + + Fixes + + png.c:55: warning: enumeration value ‘CAIRO_FORMAT_RGB30’ not handled + in switch + + test/png.c | 1 + + 1 file changed, 1 insertion(+) + +commit afcbb7a2c5c8a05d11e054e09c8c4e53b571a435 +Author: Andrea Canciani +Date: Mon May 14 10:44:31 2012 +0200 + + build: Do not replace existing files + + The existing INSTALL file is currently being replaced at every + autogen.sh run with the default one. + + This is not desired, because INSTALL contains some cairo-specific + information. + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 38d03ea7488097f2b1194f546bd1331af189b809 +Author: Andrea Canciani +Date: Mon May 14 10:40:49 2012 +0200 + + build: Allow autogen-eration on systems without GTK-doc + + The autogen.sh script fails if it cannot run gtkdocize. The absence of + this command should not cause cairo builds to fail, it should only + prevent the build of its documentation. + + Fixes: + *** No GTK-Doc found, please install it *** + + on systems without gtkdoc tools. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=50356 + + autogen.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 465319ce828f922edce46b6e7628da543b20d5e4 +Author: Chris Wilson +Date: Thu May 24 20:39:34 2012 +0100 + + gl: Use core GL_STENCIL8_DEPTH24 for gl_flavor=desktop + + Jesse complained that --enable-gl --enable-glesv2 wasn't pulling in the + right headers, and in particular GL_STENCIL8_DEPTH24_OES was undefined + but being used. In this case we can simply use the identical + GL_STENCIL8_DEPTH24 instead. + + Reported-by: Jesse Barnes + Signed-off-by: Chris Wilson + + src/cairo-gl-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 52b7622a6c28193e4259293591b0c78070839f6c +Author: Martin Robinson +Date: Wed May 23 13:59:02 2012 -0700 + + gl: Fix compilation failure for flush cleanup. + + src/cairo-gl-composite.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bf9c295953fbe86434a8beefa6994c7a07e723fc +Author: Martin Robinson +Date: Wed May 23 11:46:25 2012 -0700 + + gl: Simplify switching between primitive types + + Simplify the code that switches between primitive types by adding + a new member to the context which tracks the currently active + primitive type. + + src/cairo-gl-composite.c | 67 ++++++++++++++++++++++++------------------------ + src/cairo-gl-device.c | 1 + + src/cairo-gl-private.h | 7 +++++ + 3 files changed, 41 insertions(+), 34 deletions(-) + +commit f78696249f13c56a1a738b4645d8e2978d67d5ce +Author: Chris Wilson +Date: Wed May 23 12:45:54 2012 +0100 + + test: Increase surface size for get-path-extents + + Whilst generating a glyph run from a string, any glyphs that are far + outside the surface (including a substantial guard region) are culled. + This affects the path extents. Workaround this by increasing the surface + size. + + Signed-off-by: Chris Wilson + + test/get-path-extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3ae8bce832cbd21831a26aeb4ac0d808900711f5 +Author: Chris Wilson +Date: Wed May 23 12:26:50 2012 +0100 + + test/record90: Rotate the reference so that it is wholly visible + + Signed-off-by: Chris Wilson + + test/record90.c | 2 +- + test/reference/record90-self-intersecting.argb32.ref.png | Bin 167 -> 0 bytes + test/reference/record90-self-intersecting.ref.png | Bin 0 -> 244 bytes + test/reference/record90-self-intersecting.rgb24.ref.png | Bin 167 -> 0 bytes + 4 files changed, 1 insertion(+), 1 deletion(-) + +commit e73830915b508efa587c6b706d7501a674fdec94 +Author: Chris Wilson +Date: Wed May 23 12:20:50 2012 +0100 + + test: Refresh unbounded-operator + + Apparently this too suffered from bug-bo-collins and is fixed by + (bo-rectangular: Emit subsummed boxes for overlapping edges). + + Signed-off-by: Chris Wilson + + test/reference/unbounded-operator.argb32.ref.png | Bin 2666 -> 2781 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 1300 -> 1333 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit c09be681123388d562822d677db631101a8faa07 +Author: Chris Wilson +Date: Wed May 23 11:38:07 2012 +0100 + + bo-rectangular: Emit subsummed boxes for overlapping edges + + Fixes bug-bo-collins + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49446 + Signed-off-by: Chris Wilson + + src/cairo-bentley-ottmann-rectangular.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 7b2f787d1999bcc351b2e2904322020732939f5f +Author: Chris Wilson +Date: Wed May 23 11:48:30 2012 +0100 + + test: Exercise rectangular bo bug + + Reported-by: S. Christian Collins + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49446 + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/bug-bo-collins.c | 76 ++++++++++++++++++++++++++++++++++ + test/reference/bug-bo-collins.ref.png | Bin 0 -> 248 bytes + 3 files changed, 77 insertions(+) + +commit aed94a5bc650f579368b4b814a8729570c32147e +Author: Chris Wilson +Date: Sat May 19 10:20:20 2012 +0100 + + gl: Replace vbo with static allocation and immediate arrays + + Some drivers have terrible latency issues when using VBO and for our + dynamic use-case (we never reuse a VBO currently) there is little + benefit from using a VBO and often a loss of performance from doing so. + And there is the benefit from reducing the number of our own code paths. + + src/cairo-gl-composite.c | 29 +++++------------------------ + src/cairo-gl-device.c | 9 +++------ + src/cairo-gl-private.h | 8 +++----- + 3 files changed, 11 insertions(+), 35 deletions(-) + +commit a845ebe32d68a4701fd0645c576a2dc65c82ca8f +Author: Chris Wilson +Date: Sun May 20 12:11:27 2012 +0100 + + test: Fix leak from xcb-snapshort-assert + + ==12598== 1,344 (768 direct, 576 indirect) bytes in 2 blocks are + definitely lost in loss record 512 of 519 + ==12598== at 0x402894D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==12598== by 0x4C76501: _cairo_image_surface_create_for_pixman_image (cairo-image-surface.c:176) + ==12598== by 0x4C76953: _cairo_image_surface_create_with_pixman_format (cairo-image-surface.c:345) + ==12598== by 0x44CFAC: draw (xcb-snapshot-assert.c:36) + ==12598== by 0x40E14C: cairo_test_for_target (cairo-test.c:923) + ==12598== by 0x40EEA7: _cairo_test_context_run_for_target (cairo-test.c:1545) + ==12598== by 0x40BD53: main (cairo-test-runner.c:254) + + Signed-off-by: Chris Wilson + + test/xcb-snapshot-assert.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 2879e656b9b9283308ed4eaf3ad820460ac1df8b +Author: Chris Wilson +Date: Sun May 20 10:24:06 2012 +0100 + + wideint: Fix compilation failure for bare use of uint64_t for !HAVE_UINT64_T + + Reported-by: Hakki Dogusan + Signed-off-by: Chris Wilson + + src/cairo-wideint-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dad69ce4d5568f94621ae60ccdcc683d5bbd0efd +Author: Chris Wilson +Date: Sun May 20 10:54:07 2012 +0100 + + win32: Fix return value for cairo_time_get + + Without uint64_t we need to construct a cairo_int64_t from the struct of + smaller 32-bit types rather than just casting the larger 64-bit value. + + Reported-by: Hakki Dogusan + Signed-off-by: Chris Wilson + + src/cairo-time.c | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 5a7a9c93e7f807ae8ee7504ff308e9676dbe8d25 +Author: Chris Wilson +Date: Sun May 20 10:33:17 2012 +0100 + + image: Tidy lerp8x4 + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +commit ced090871bbc4c052fd4ac627cdd8fc7e80f0d62 +Author: Martin Robinson +Date: Thu May 17 14:37:57 2012 -0700 + + gl/msaa: Improve fallback detection + + Rename should_fall_back to can_use_msaa_compositor to make it + more comprehensible and also modify the logic to fall back + when the antialias mode is not "fast" or "default." + + src/cairo-gl-msaa-compositor.c | 29 ++++++++++++++++------------- + 1 file changed, 16 insertions(+), 13 deletions(-) + +commit 707bb8663980e66e8406351b68c230b63a0265c6 +Author: Martin Robinson +Date: Mon Apr 2 13:45:15 2012 -0700 + + gl/msaa: Lazily flush the context + + Instead of conservatively flushing after every single drawing + operation. Wait until we are certain we need to flush, which + in the case of the MSAA compositor is when we start compositing + with a different type of geometry. + + src/cairo-gl-composite.c | 37 ++++++++++++++++++++++++------------- + src/cairo-gl-msaa-compositor.c | 4 ---- + 2 files changed, 24 insertions(+), 17 deletions(-) + +commit 4b3ad4e8dacdfb84636f188b2dc7afe3ad6966c5 +Author: Martin Robinson +Date: Mon Mar 12 15:28:23 2012 -0700 + + gl/msaa: Implement glyph rendering + + Instead of falling back to the traps compositor to do glyph + rendering, handle it in the MSAA compositor. This allows using + the stencil buffer or scissor to clip and simplifies the MSAA + code path. + + src/cairo-gl-glyphs.c | 56 +++++++++++++++++++--------- + src/cairo-gl-msaa-compositor.c | 83 +++++++++++++++++++++++++++++++++++++++--- + src/cairo-gl-private.h | 11 ++++++ + 3 files changed, 128 insertions(+), 22 deletions(-) + +commit e3f5b14fbabba2128de4ee2d8513800aa145fb2f +Author: Martin Robinson +Date: Tue Feb 21 09:36:52 2012 -0800 + + gl/msaa: Wait to clip until compositing begins + + The MSAA compositors clips in a unique way We'd like to + share this method with the text rendering path, so we move + it to cairo-gl-composite so that it works in a way very + similar to clipping with the spans and traps compositors. + + src/cairo-gl-composite.c | 164 +++++++++++++++++++++++++++++++++++------ + src/cairo-gl-device.c | 1 + + src/cairo-gl-msaa-compositor.c | 155 +++++++------------------------------- + src/cairo-gl-private.h | 12 +++ + 4 files changed, 181 insertions(+), 151 deletions(-) + +commit 29b243325c0af760249a414bdce2e6afb64186a7 +Author: Martin Robinson +Date: Mon Jan 23 13:07:59 2012 -0800 + + gl/msaa: Support for non-texture surfaces + + Add full support for non-texture surfaces, by correctly + querying primitives for stencil and multisample bits. + + src/cairo-gl-device.c | 8 ++++++++ + src/cairo-gl-msaa-compositor.c | 40 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-operand.c | 3 +++ + src/cairo-gl-private.h | 2 ++ + src/cairo-gl-surface.c | 5 +---- + 5 files changed, 54 insertions(+), 4 deletions(-) + +commit 9208dd6230aa3c236a91105f8dc5d5caf69fe591 +Author: Henry (Yu) Song +Date: Fri Dec 16 15:56:45 2011 -0800 + + gl/msaa: Support the OpenGLES EXT multisampling extension + + Add support for OpenGLES GPUs that support the EXT multisampling + extension. + + src/cairo-gl-device.c | 165 ++++++++++++++++++++++++++++++---------- + src/cairo-gl-dispatch-private.h | 7 +- + src/cairo-gl-msaa-compositor.c | 12 +++ + src/cairo-gl-operand.c | 4 + + src/cairo-gl-private.h | 13 ++-- + 5 files changed, 152 insertions(+), 49 deletions(-) + +commit ac8d50f04ca24fb24f354dea597513ec43f5ebb6 +Author: Henry (Yu) Song +Date: Thu Dec 22 17:24:01 2011 -0800 + + gl/msaa: Use unsigned short to build the index array + + Some GPUs have trouble accepting vertex index data as + integers. Using unsigned shorts expands support. + + src/cairo-gl-composite.c | 10 +++++----- + src/cairo-gl-device.c | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 5ae53c933ae4baefdedb8ca795ee25dfcba9f5b0 +Author: Henry (Yu) Song +Date: Fri Dec 23 08:44:16 2011 -0800 + + gl/msaa: Implement paint via masking + + Instead of falling back to the spans compositor, let the msaa + compositor handle painting. This ensure clipping is handled + in a consistent way with the rest of the msaa compositor. + + src/cairo-gl-msaa-compositor.c | 51 ++++++++++++++++++++++++++++++++---------- + 1 file changed, 39 insertions(+), 12 deletions(-) + +commit 4d9064d578434cadfae2b248ef29075a1a1be8b8 +Author: Henry (Yu) Song +Date: Fri Dec 16 15:56:00 2011 -0800 + + gl/msaa: Add ARB multisampling support + + This implementation is not very efficient at the moment and does not + work with platforms using the incompatible IMG extension (mobile + GPUs). Performance improvements and mobile GPU support will follow. + + src/cairo-gl-composite.c | 14 ++- + src/cairo-gl-device.c | 236 ++++++++++++++++++++++++++++++++++------ + src/cairo-gl-dispatch-private.h | 4 + + src/cairo-gl-msaa-compositor.c | 28 ++++- + src/cairo-gl-operand.c | 40 +++++++ + src/cairo-gl-private.h | 38 ++++++- + src/cairo-gl-surface.c | 21 +++- + 7 files changed, 334 insertions(+), 47 deletions(-) + +commit 50f08352f463d86022a0d7544d461fe2e5ac9076 +Author: Adrian Johnson +Date: Wed May 16 20:55:17 2012 +0930 + + pdf: check if EXTEND_PAD group can be painted with EXTEND_NONE + + to avoid the fallback + + src/cairo-pdf-surface.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit e41dffb329e4a6fcb4e75fb501843838a499c4c8 +Author: Chris Wilson +Date: Mon May 14 17:46:32 2012 +0100 + + stroke: Don't drop clockwise==0 lines + + If the join indicates the pair of edges are parallel, we may be + considering the final segment of the spline with a different tangent + vector than the slope of the final edge and so lead to false dropping of + an edge. This has the effect that the line segments between 'arc arc arc + arc' (a rounded rectangle) are no longer horizontal or vertical. As path + construction tries to eliminate joins between colinear segments, this + optimisation should not be required anyway. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-polygon.c | 14 +++----------- + test/reference/arc-direction.traps.argb32.ref.png | Bin 6380 -> 0 bytes + test/reference/arc-direction.traps.rgb24.ref.png | Bin 6380 -> 0 bytes + .../reference/close-path-current-point.argb32.ref.png | Bin 2324 -> 0 bytes + test/reference/close-path-current-point.ref.png | Bin 1675 -> 2109 bytes + test/reference/close-path-current-point.rgb24.ref.png | Bin 2324 -> 0 bytes + test/reference/fallback.traps.argb32.ref.png | Bin 4070 -> 4156 bytes + test/reference/fallback.traps.rgb24.ref.png | Bin 3141 -> 3332 bytes + test/reference/halo.argb32.ref.png | Bin 8726 -> 0 bytes + test/reference/halo.ref.png | Bin 7297 -> 8774 bytes + test/reference/halo.rgb24.ref.png | Bin 8726 -> 0 bytes + test/reference/halo.traps.argb32.ref.png | Bin 8726 -> 0 bytes + test/reference/halo.traps.rgb24.ref.png | Bin 8726 -> 0 bytes + .../reference/rounded-rectangle-stroke.argb32.ref.png | Bin 951 -> 0 bytes + test/reference/rounded-rectangle-stroke.ref.png | Bin 569 -> 833 bytes + test/reference/rounded-rectangle-stroke.rgb24.ref.png | Bin 951 -> 0 bytes + 16 files changed, 3 insertions(+), 11 deletions(-) + +commit 099420a07c33c66daf5392d4ca1df06585791751 +Author: Chris Wilson +Date: Mon May 14 17:50:54 2012 +0100 + + spans: Debug input paths and polygons + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 3 +++ + src/cairoint.h | 2 ++ + 2 files changed, 5 insertions(+) + +commit f7d937670c22db79e597cade89e84c840b58e25e +Author: Chris Wilson +Date: Mon May 14 16:03:40 2012 +0100 + + arc: Use user endpoint for final step + + Eliminate numerical inaccuracy from accumulating angle through + the floating point step value by using the exact end-value for the last + arc segment. + + Signed-off-by: Chris Wilson + + src/cairo-arc.c | 29 +++++++++++++++++------------ + 1 file changed, 17 insertions(+), 12 deletions(-) + +commit 6867383017fcea0b1d5a4671b32382037ba9be3f +Author: Alexandros Frantzis +Date: Thu May 3 13:41:29 2012 +0300 + + gl: Provide a shader implementation of repeat wrap modes + + In OpenGL ES 2.0, repeat wrap modes (GL_REPEAT and GL_MIRRORED REPEAT) are + only available for NPOT textures if the GL_OES_texture_npot is supported. + This commit adds a shader implementation of these wrap modes for use by + devices that do not support GL_OES_texture_npot. + + src/cairo-gl-composite.c | 10 ++++-- + src/cairo-gl-device.c | 16 +++++---- + src/cairo-gl-private.h | 1 + + src/cairo-gl-shaders.c | 84 +++++++++++++++++++++++++++++++++++++++++------- + 4 files changed, 90 insertions(+), 21 deletions(-) + +commit 82f69d1ef798c2ebff13ec2b548c4877bf5e0e5b +Author: Alexandros Frantzis +Date: Thu May 3 13:03:26 2012 +0300 + + gl: Simplify GL wrap parameter setting code + + src/cairo-gl-composite.c | 29 +++++++++++++++-------------- + 1 file changed, 15 insertions(+), 14 deletions(-) + +commit 6cd1f5040fed1385c2990a68d6017a7ca6c37103 +Author: Chris Wilson +Date: Fri May 11 22:38:27 2012 +0100 + + clip: Apply clip boxes to the clip surface + + As we convert the unaligned clip boxes to a region, we need to process + the intersection of the boxes with the clip surface as a separate step. + + Fixes tighten-box for the base compositor. + + Signed-off-by: Chris Wilson + + src/cairo-clip-surface.c | 86 +++++++++++++++++++--- + test/reference/tighten-bounds.base.argb32.ref.png | Bin 8490 -> 8512 bytes + test/reference/tighten-bounds.base.rgb24.ref.png | Bin 7847 -> 7873 bytes + 3 files changed, 77 insertions(+), 9 deletions(-) + +commit 4ea3ace6c810ba090464e48795fac5456f6cdc24 +Author: Chris Wilson +Date: Fri May 11 21:51:44 2012 +0100 + + spans: Only fallback for a clipmask if unbounded + + For a bounded operation with a clip we will already have performed the + clip geometrically. + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 3 ++- + test/reference/clip-operator.argb32.ref.png | Bin 8216 -> 8257 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3293 -> 3288 bytes + test/reference/random-clip.ref.png | Bin 529871 -> 525962 bytes + test/reference/trap-clip.argb32.ref.png | Bin 5810 -> 5826 bytes + test/reference/trap-clip.rgb24.ref.png | Bin 5433 -> 5435 bytes + 6 files changed, 2 insertions(+), 1 deletion(-) + +commit cd1004ce19c7ea28c7fedb6464562a08416586c0 +Author: Chris Wilson +Date: Fri May 11 21:20:35 2012 +0100 + + traps,spans-compositor: Avoid mistreating unaligned clips as aligned + + An unaligned clip requires careful handling, and so exclude processing + along the fast paths. + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 24 ++++++++++++++++++++++-- + src/cairo-traps-compositor.c | 2 +- + 2 files changed, 23 insertions(+), 3 deletions(-) + +commit de1150cc0e1cb11710b196806335817255cb4abe +Author: Chris Wilson +Date: Fri May 11 20:51:58 2012 +0100 + + spans-compositor: Add tracepoints for debugging + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +commit 197e5b7324c569d3e8cd652dbf5a281a57317cbe +Author: Chris Wilson +Date: Fri May 11 20:25:29 2012 +0100 + + spans-compositor: Handle unaligned unbounded boxes + + Signed-off-by: Chris Wilson + + src/cairo-spans-compositor.c | 67 +++++++++++++++++++++++++++++++++----------- + 1 file changed, 51 insertions(+), 16 deletions(-) + +commit 2d26f7da777b7ac01e5c469e52a17fa7d0cf4a8d +Author: Chris Wilson +Date: Fri May 11 21:26:33 2012 +0100 + + test: Fix tighten-bounds reference images + + Uli Schlachter spotted that I had inadvertently committed (606e9e1c9) a + broken set of test images for the tighten-bounds case and so masked a + nasty bug with the mishandling of unaligned clips. + + Reported-by: Uli Schlachter + Signed-off-by: Chris Wilson + + test/reference/tighten-bounds.argb32.ref.png | Bin 9115 -> 9115 bytes + test/reference/tighten-bounds.rgb24.ref.png | Bin 8256 -> 8365 bytes + test/reference/tighten-bounds.traps.argb32.ref.png | Bin 8769 -> 8486 bytes + test/reference/tighten-bounds.traps.rgb24.ref.png | Bin 8179 -> 7856 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 117a44a33526a7738cac6643ea35fb73dc8a710f +Author: Chris Wilson +Date: Fri May 11 17:17:05 2012 +0100 + + gl: Reject SOURCE + mask in composite_boxes() + + As SOURCE requires a bounded operation and the GL compositor only + implements a simple operation (i.e. it just blits from source to + destination instead of applying a linear interpolation as required), we + need to reject the operation and fallback. In the future, we should + make the linear interpolation available through a GL shader or as a + dual-source blend (better). + + Spotted-by: Chuanbo Weng + Signed-off-by: Chris Wilson + + src/cairo-gl-spans-compositor.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 0196327b30dd01ce0169a7bc67024b932368af4e +Author: Chuanbo Weng +Date: Fri May 11 23:58:05 2012 +0800 + + gl: Convert CLEAR to DEST_OUT when there's a mask for composite_boxes. + + As Cairo's CLEAR sematics are for a bounded operation, and GL's uses the + simple semantics for its CLEAR composite, we need to convert the + operation into an equivalent DEST_OUT when we have a mask. + + src/cairo-gl-spans-compositor.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 9ecf2f7c4f6451d4a2c145a82184ba185be0a421 +Author: Chris Wilson +Date: Thu May 10 21:01:36 2012 +0100 + + damage: Prevent reducing an error object + + Signed-off-by: Chris Wilson + + src/cairo-damage.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f4631dca371865f9aa747c61937c09d495f165e0 +Author: Chris Wilson +Date: Thu May 10 21:00:49 2012 +0100 + + damage: Prevent accumulating damage to an error object + + Signed-off-by: Chris Wilson + + src/cairo-damage.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 50e51389bd4108942fdc7a5f029b3171b0c1f11a +Author: Chris Wilson +Date: Thu May 10 20:57:30 2012 +0100 + + damage: Avoid freeing the NIL error object + + Signed-off-by: Chris Wilson + + src/cairo-damage.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3bff546ebe0859c65ba608a956a55b5647bfd37f +Author: Uli Schlachter +Date: Sun May 6 21:48:42 2012 +0200 + + c_surface_set_mime_data: Remove duplicate "Since" + + This fixes the following message from "make check": + + ./cairo-surface.c (1192): ERROR: cairo_surface_set_mime_data: Duplicate 'Since' + field + + Signed-off-by: Uli Schlachter + + src/cairo-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit fcccb1a65aeab7b1bf199e728b58af9bf21e197b +Author: Uli Schlachter +Date: Sun May 6 21:45:32 2012 +0200 + + check-doc-syntax: Find duplicate "Since:" tags + + It makes no sense to say more than one time when some symbol was introduced. + + Signed-off-by: Uli Schlachter + + src/check-doc-syntax.awk | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit a184de906490e743430919c55a2d5099987d4d69 +Author: Uli Schlachter +Date: Sun May 6 21:41:28 2012 +0200 + + check-doc-syntax: Make this work again + + Commit ed90616b77570 changed the way the awk script gets invoked. Due to a + missing "test", this resulted in the awk script never getting invoked at all. + + Signed-off-by: Uli Schlachter + + src/check-doc-syntax.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3e02dccb97ad12a13db0b66aba3927c78f6d08e9 +Author: Henry (Yu) Song +Date: Mon Dec 12 17:08:52 2011 -0800 + + gl/msaa: Add support for unbounded operators + + When filling and stroking with an unbounded operator, first fill + and stroke to a temporary surface and then paint the entire surface + back to the original target. + + src/cairo-gl-msaa-compositor.c | 100 +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 100 insertions(+) + +commit b099f8b0c70dc0208135cdeda76be9ab33e61d9b +Author: Henry (Yu) Song +Date: Fri Oct 14 14:32:28 2011 -0700 + + gl/msaa: Support for masking + + Add support for masking in the OpenGL MSAA compositor. This is + accomplished simply by properly setting up the masking source, + emitting the entire bounded composite region, and unforking + vertex emission. + + src/cairo-gl-composite.c | 53 ++++++++++++++---------- + src/cairo-gl-msaa-compositor.c | 92 +++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 122 insertions(+), 23 deletions(-) + +commit 929a96ed034b4e6f811da9b718a7b11e9d1b9d16 +Author: Henry (Yu) Song +Date: Thu Oct 13 15:51:29 2011 -0700 + + gl/msaa: Support for texture sources + + Add support for texture sources, by unforking _cairo_gl_composite_begin. + _cairo_gl_composite_begin_tristrip is now just a small wrapper. Also + properly emit the source texture coordinates when emitting tristrip + vertices. + + src/cairo-gl-composite.c | 73 ++++++++---------------------------------- + src/cairo-gl-msaa-compositor.c | 4 +-- + src/cairo-gl-private.h | 4 --- + 3 files changed, 15 insertions(+), 66 deletions(-) + +commit a60bb83f28a27c065f21f6a8466408df4565a0b1 +Author: Henry (Yu) Song +Date: Tue Oct 11 09:08:38 2011 -0700 + + gl/msaa: Prevent stroke overlap + + When stroking we do not send our polygon to the tessellator, so + it may have overlapping stroke components. Use the stencil buffer + to prevent stroke components from overlapping. + + src/cairo-gl-msaa-compositor.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit 138e595c1192c03ebc1b2c89851ce938b18abd2f +Author: Uli Schlachter +Date: Tue May 1 14:48:43 2012 +0200 + + Remove some dead code + + This code could never be executed, because the status variable doesn't get set + since the last time it is checked and errors get returned to the caller. + + This was noticed while looking into the build log provided by + http://lists.cairographics.org/archives/cairo/2012-April/022993.html + + Reported-by: Ryan Schmidt + Signed-off-by: Uli Schlachter + + src/cairo-scaled-font-subsets.c | 5 ----- + 1 file changed, 5 deletions(-) + +commit 494cfd7eb9d994a5e2024e299986e66a3ef9a562 +Author: Uli Schlachter +Date: Tue May 1 14:38:51 2012 +0200 + + Remove some unused functions + + All of these are unused since af9fbd176b145f0424 "Introduce a new compositor + architecture". Since no one complained yet, I guess that means that we don't + need these any more. :-) + + This was noticed while looking into the build log provided by + http://lists.cairographics.org/archives/cairo/2012-April/022993.html + + Signed-off-by: Uli Schlachter + + src/cairo-botor-scan-converter.c | 36 -------------------------------- + src/cairo-path-stroke-polygon.c | 44 ---------------------------------------- + 2 files changed, 80 deletions(-) + +commit 748dcdef4b67097c079a3ff98f970451428c24f3 +Author: Chuanbo Weng +Date: Fri May 4 08:53:20 2012 +0800 + + gl: fix the translate value in copy_boxes. + + Fixes 36 test cases (such as push-group-color) + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48221 + + src/cairo-gl-spans-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit db4ee947c3fc2c057dd8e84cdfcb779e7c62e5d5 +Author: Chris Wilson +Date: Tue May 1 14:41:25 2012 +0100 + + Split finish into multiple stages + + In order to handle the snapshot copy-on-write losing a race with another + thread using the snapshot as a source, we may find the target acquires a + fresh reference as we attempt to finalize it. + + Signed-off-by: Chris Wilson + + src/cairo-surface.c | 32 +++++++++++++++++++++++--------- + 1 file changed, 23 insertions(+), 9 deletions(-) + +commit 52dfa038b9e0c106aa3f9f08abeb7f53e72a762a +Author: Chris Wilson +Date: Tue May 1 15:06:46 2012 +0100 + + snapshot: Avoid triggering assertion for grabbing the target during destroy + + If the source wins the race to acquire the original surface as it is + being destroyed, it triggers an assertion. + + Signed-off-by: Chris Wilson + + src/cairo-surface-inline.h | 8 ++++++++ + src/cairo-surface-snapshot-inline.h | 3 ++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit f62f8f907d14a7267f136f299208029c7b904eaa +Author: Chris Wilson +Date: Tue May 1 14:57:18 2012 +0100 + + snapshot: Hold a reference to target whilst querying + + Due to race with cow and accessing target from multiple threads, we need + to be careful that we always acquire a reference for our access to + the snapshot target. + + Signed-off-by: Chris Wilson + + src/cairo-surface-snapshot.c | 51 +++++++++++++++++++++++++++++++++++++------- + 1 file changed, 43 insertions(+), 8 deletions(-) + +commit af3c8abbce529b0928742cc219e5e8e21191eee7 +Author: Søren Sandmann Pedersen +Date: Mon Apr 30 12:02:38 2012 -0400 + + Revert "Use pixman glyphs" + + This was pushed accidentally - apologies. + + This reverts commit 752c3b69e008b7d219da8cc5c657cf995732d3b8. + + src/cairo-image-compositor.c | 313 ++++++++++++++++++++++++++++------------- + src/cairo-mutex-list-private.h | 1 - + src/cairo-scaled-font.c | 2 - + src/cairoint.h | 4 - + 4 files changed, 212 insertions(+), 108 deletions(-) + +commit 752c3b69e008b7d219da8cc5c657cf995732d3b8 +Author: Søren Sandmann Pedersen +Date: Mon Apr 30 09:41:44 2012 -0400 + + Use pixman glyphs + + src/cairo-image-compositor.c | 313 +++++++++++++---------------------------- + src/cairo-mutex-list-private.h | 1 + + src/cairo-scaled-font.c | 2 + + src/cairoint.h | 4 + + 4 files changed, 108 insertions(+), 212 deletions(-) + +commit 821a9af33cf43dc6a8266f4e677171f2b1ebacba +Author: Chris Wilson +Date: Sun Apr 29 20:54:07 2012 +0100 + + version: Post release bump to 1.12.3 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dbc0efad7e565558a3abf7f69d7675efddc4688d +Author: Chris Wilson +Date: Sun Apr 29 19:49:12 2012 +0100 + + version: bump for cairo-1.12.2 release + + NEWS | 40 ++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 41 insertions(+), 1 deletion(-) + +commit ed90616b7757087154d1c191858444ecc9188935 +Author: Chris Wilson +Date: Sun Apr 29 13:21:36 2012 +0100 + + check-doc-syntax: Only parse the source files for incorrect tags + + Signed-off-by: Chris Wilson + + src/check-doc-syntax.sh | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit c16cdf0b4e2bada9b955111886eb7c9cb3878994 +Author: Chris Wilson +Date: Sun Apr 29 13:18:43 2012 +0100 + + check-doc-syntax: Fix handling of return value in make check + + src/check-doc-syntax.sh | 2 ++ + 1 file changed, 2 insertions(+) + +commit a1d4f416e403359b713f6d10d557a190458bbb16 +Author: Chris Wilson +Date: Sun Apr 29 15:49:40 2012 +0100 + + path-stroke-boxes: Fix degenerate end-caps for anti-clockwise paths + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-boxes.c | 60 ++++++++++++++++++++----------------------- + 1 file changed, 28 insertions(+), 32 deletions(-) + +commit 71df65f95a238c53fa0a64759b41af85c0b1b059 +Author: Chris Wilson +Date: Sun Apr 29 14:51:17 2012 +0100 + + test: Update degenerate-solid-dash reference + + Looking at the base output for cairo-1.0 reveals we have an issue with + the placement of degenerate end-caps. + + test/reference/degenerate-solid-dash.ref.png | Bin 405 -> 407 bytes + test/reference/line-width-large-overlap-dashed.ref.png | Bin 338 -> 340 bytes + .../reference/line-width-large-overlap-dashed.xfail.png | Bin 343 -> 0 bytes + test/reference/line-width-overlap-dashed.ref.png | Bin 0 -> 407 bytes + test/reference/rectilinear-dash.argb32.ref.png | Bin 291 -> 0 bytes + test/reference/rectilinear-dash.rgb24.ref.png | Bin 291 -> 0 bytes + 6 files changed, 0 insertions(+), 0 deletions(-) + +commit f5df96748e39d1f1a3fddf63712318377211b12b +Author: Chris Wilson +Date: Sun Apr 29 14:32:14 2012 +0100 + + gstate: Correctly compact degenerate dash segments + + The danger of the incomplete test masking the failure to correctly skip + the degenerate elements in the final dash state. + + Fixes the fixed degenerate-solid-dash. + Signed-off-by: Chris Wilson + + src/cairo-gstate.c | 37 ++++++++++++++++++------------------- + 1 file changed, 18 insertions(+), 19 deletions(-) + +commit ba21231491dbed0252858ee8c2755db7b6f1c970 +Author: Chris Wilson +Date: Sun Apr 29 14:23:11 2012 +0100 + + test: Fix array lengths for degenerate-solid-dash + + The latter arrays were meant to test compaction. + + Signed-off-by: Chris Wilson + + test/degenerate-solid-dash.c | 4 ++-- + test/reference/degenerate-solid-dash.ref.png | Bin 358 -> 405 bytes + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 9176e640d7cb5cae5d89722aa560fba19bc08a8c +Author: Chris Wilson +Date: Sun Apr 29 13:40:48 2012 +0100 + + gstate: Reduce degenerate dash to solid + + If the dash specifies that the pen is always on (i.e. the total of the + off segments is zero), then we can eliminate the dash pattern. + + Signed-off-by: Chris Wilson + + src/cairo-gstate.c | 35 ++++++++++++++++++++++++++++++----- + 1 file changed, 30 insertions(+), 5 deletions(-) + +commit 47368d5e83f95dfed500f81068d7346a93145a20 +Author: Chris Wilson +Date: Sun Apr 29 14:01:11 2012 +0100 + + image: Add a little bit of debugging to show number of boxes being drawn + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 0c14ce6dca3031320d2b9fb419aaf4e153d158d6 +Author: Chris Wilson +Date: Sun Apr 29 13:55:10 2012 +0100 + + test: Exercise degenerate dashes that are wholly solid + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/degenerate-solid-dash.c | 69 +++++++++++++++++++++++++++ + test/reference/degenerate-solid-dash.ref.png | Bin 0 -> 358 bytes + 3 files changed, 70 insertions(+) + +commit d2f740ccbd9c5416a2590e3cca888eecf046c162 +Author: Chris Wilson +Date: Sun Apr 29 12:38:37 2012 +0100 + + test: Exercise clip inversion imperfections + + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/inverted-clip.c | 56 +++++++++++++++++++++++++++ + test/reference/inverted-clip.base.xfail.png | Bin 0 -> 1293 bytes + test/reference/inverted-clip.traps.xfail.png | Bin 0 -> 1283 bytes + test/reference/inverted-clip.xfail.png | Bin 0 -> 1293 bytes + 5 files changed, 57 insertions(+) + +commit 4a9a6b7efb4abb81b228db8c998a6c9e9f383ba0 +Author: Chris Wilson +Date: Sun Apr 29 12:22:20 2012 +0100 + + Satisfy check-doc-syntax.awk for unimplemented functions + + ./cairo.c (634): ERROR: cairo_set_opacity: missing 'Since' field + ./cairo.c (3578): ERROR: cairo_get_opacity: missing 'Since' field + + Signed-off-by: Chris Wilson + + src/cairo.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit ec400daf9ec3bbd8403324db7fcdaf175e185e7b +Author: Chris Wilson +Date: Sat Apr 28 23:15:52 2012 +0100 + + image: Avoid overflow when computing lerp spans for a8 + + Reported-by: Benjamin Otte + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit a18506acf0ca4a5b6f56cc9a8e0ffb3dd0eaabab +Author: Chris Wilson +Date: Fri Apr 27 22:13:01 2012 +0100 + + Update the remaining backends to handle a NULL extents for _cairo_surface_get_source + + Signed-off-by: Chris Wilson + + src/cairo-gl-surface.c | 8 +++++--- + src/cairo-image-surface.c | 8 +++++--- + src/cairo-script-surface.c | 8 +++++--- + src/cairo-xcb-surface.c | 8 +++++--- + src/cairo-xlib-surface.c | 8 +++++--- + 5 files changed, 25 insertions(+), 15 deletions(-) + +commit 7eb33099d34234dcccb8f96caba94b38fa385f16 +Author: Chris Wilson +Date: Fri Apr 27 12:39:40 2012 +0100 + + snapshot: Perform the cow under a mutex + + In order to prevent a race between concurrent destroy and use in another + thread, we need to acquire a reference to the snapshot->target under a + mutex. Whilst we hold that reference, it prevents the internal destroy + mechanism from freeing the memory we are using (if we have a pointer to + the original surface) and the client drops their final reference. + + Oh boy, talk about opening a can of worms... + + Signed-off-by: Chris Wilson + + src/cairo-analysis-surface.c | 12 +++--------- + src/cairo-image-source.c | 33 ++++++++++++++++++++++++++++----- + src/cairo-pattern.c | 4 +--- + src/cairo-pdf-surface.c | 24 ++++++++++++++++-------- + src/cairo-ps-surface.c | 33 +++++++++++++++++++++------------ + src/cairo-script-surface.c | 5 +++-- + src/cairo-surface-snapshot-inline.h | 9 ++++++++- + src/cairo-surface-snapshot-private.h | 2 ++ + src/cairo-surface-snapshot.c | 7 ++++++- + src/cairo-surface-subsurface.c | 3 ++- + src/cairo-surface.c | 5 ++++- + src/cairo-traps-compositor.c | 11 ++--------- + 12 files changed, 96 insertions(+), 52 deletions(-) + +commit 455b4de1fc6be05f985b43c2f8f83eeed2b2a191 +Author: Chris Wilson +Date: Fri Apr 27 11:41:41 2012 +0100 + + image: Allow a snapshot to steal the original memory upon finish + + Signed-off-by: Chris Wilson + + src/cairo-image-surface.c | 18 ++++++++++++++++++ + src/cairo-surface-private.h | 1 + + src/cairo-surface.c | 3 +++ + 3 files changed, 22 insertions(+) + +commit 957a9cc619965178a8927d114fe852034fc2385c +Author: Chris Wilson +Date: Thu Apr 26 08:54:39 2012 +0100 + + image: Fix typo in _blit_spans() + + The height is 'h' not 'y'! + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fe428fc7f03316f2577b95f6a4f525bacca09948 +Author: Chris Wilson +Date: Fri Apr 20 17:30:22 2012 +0100 + + xlib: Fix inline conversion for TrueColor PutImage + + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 9e81c5b737cda9dc539b2cf497c20ac48ddb91ac +Author: Chris Wilson +Date: Wed Apr 25 20:41:16 2012 +0100 + + xlib: Allow applications to create 0x0 surfaces + + Although 0x0 is not a legimate surface size, we do allow applications + the flexibility to reset the size before drawing. As we previously never + checked the size against minimum legal constraints, applications expect + to be able to create seemingly illegal surfaces, and so we must continue + to provide backwards compatibility. + + Many thanks to Pauli Nieminen for trawling through the protocol traces, + diving into the depths of libreoffice and identifying the regression. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=49118 (presentation + mode in loimpress is blank). + + Reported-by: Eric Valette + Signed-off-by: Chris Wilson + + src/cairo-xlib-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit f736cd144305f7c9147912f6ec081962b3191e3d +Author: Jeff Mahoney +Date: Mon Apr 23 22:04:48 2012 +0100 + + pdf: Fix wrong allocation in _cairo_pdf_surface_add_source_surface + + _cairo_pdf_surface_add_source_surface allocates unique_id with + size unique_id_length but then copies surface_key.unique_id_length into it. + + This causes e.g. evince to crash predictably while trying to print with: + *** buffer overflow detected ***: evince terminated + + We should be using surface_key.unique_id_length instead. + + Reported-by: Dominique Leuenberger + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49089 + Signed-off-by: Jeff Mahoney + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6a04c2f6749756bb032e9beb6c2ad0a12f8093d +Author: Alexandros Frantzis +Date: Mon Apr 23 17:15:31 2012 +0300 + + gl: Fix creation of gradient ramps for GLESv2 + + glTexImage2D is not allowed to perform an implicit format conversion + with GLESv2, so fixup the internal format to match the incoming pixel + format. + + src/cairo-gl-gradient.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 1ca8c049cad59fcf9355ff091e1eec0471afa444 +Author: Dimiter Stanev +Date: Mon Apr 23 19:10:44 2012 +0100 + + win32: compilation fix for recent private/inline header separation + + src/win32/cairo-win32-display-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit abedc6b46ad283f896e078479174312cb87e6700 +Author: Adrian Johnson +Date: Mon Apr 23 13:20:47 2012 +0930 + + ps: support all image types + + If the image is not rgb24/argb32/a8/a1, create a new image with the + same CAIRO_CONTENT and paint image to the new image. + + src/cairo-ps-surface.c | 41 +++++++++++++++++++++++++++++++++++++---- + 1 file changed, 37 insertions(+), 4 deletions(-) + +commit 33f9e433eef13a2b39a8213c6997399f3a5896a8 +Author: Adrian Johnson +Date: Mon Apr 23 13:07:18 2012 +0930 + + pdf: support all image types + + If the image is not rgb24/argb32/a8/a1, create a new image with the + same CAIRO_CONTENT and paint image to the new image. + + src/cairo-pdf-surface.c | 41 +++++++++++++++++++++++++++++++---------- + 1 file changed, 31 insertions(+), 10 deletions(-) + +commit c0b523eb652b2c4ba41cb27132d46ad9211b5df4 +Author: Chris Wilson +Date: Sat Apr 21 10:16:30 2012 +0100 + + stroke(boxes): Convert the dash step back into device units before incrementing + + Reported-by: Carlos Garcia Campos + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-boxes.c | 2 +- + .../rectilinear-dash-scale-unaligned.ref.png | Bin 5010 -> 3738 bytes + .../rectilinear-dash-scale-unaligned.traps.ref.png | Bin 4552 -> 3289 bytes + test/reference/rectilinear-dash-scale.ref.png | Bin 921 -> 651 bytes + 4 files changed, 1 insertion(+), 1 deletion(-) + +commit 99f3fea6d92fab684b145b2eb62fc7e6705aca73 +Author: Chris Wilson +Date: Thu Apr 19 17:53:11 2012 +0100 + + gl: Uses the inline clip function, so update its include + + Fixes build from 0770dda52be9c1bf464a84cb5566ef46d7e9df5a. + + Signed-off-by: Chris Wilson + + src/cairo-gl-msaa-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0046967224640c0a390b4a7b376bbd631ed32a5c +Author: Chris Wilson +Date: Thu Apr 19 16:12:55 2012 +0100 + + dash: Increment dash_remain by the next segment to reduce accumulation errors + + Signed-off-by: Chris Wilson + + src/cairo-stroke-dash.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5e39a8098b88b2e8d25eb46c6bbe8656c9e0260c +Author: Chris Wilson +Date: Thu Apr 19 15:48:01 2012 +0100 + + dash: Use a epsilon compare for stepping the dash + + Due to rounding errors that may creep in comparing against 0.0 is + dangerous and may result in an infinite loop whilst generating dashes + that consumes all memory. + + Reported-and-tested-by: Uli Schlachter + Signed-off-by: Chris Wilson + + src/cairo-fixed-private.h | 2 ++ + src/cairo-stroke-dash.c | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 57cfdfd9796531a576060e9304715920e0fdb8fe +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-list into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-botor-scan-converter.c | 2 +- + src/cairo-gstate.c | 1 + + src/cairo-list-inline.h | 209 +++++++++++++++++++++++++++++++++++++ + src/cairo-list-private.h | 167 ----------------------------- + src/cairo-observer.c | 2 + + src/cairo-path-fixed.c | 1 + + src/cairo-pattern-inline.h | 2 + + src/cairo-pattern.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-rtree-private.h | 2 +- + src/cairo-scaled-font.c | 1 + + src/cairo-script-surface.c | 2 +- + src/cairo-surface-observer.c | 1 + + src/cairo-surface.c | 1 + + src/cairo-xcb-connection.c | 2 +- + src/cairo-xcb-screen.c | 1 + + src/cairo-xcb-shm.c | 1 + + src/cairo-xcb-surface-render.c | 1 + + src/cairo-xcb-surface.c | 1 + + src/cairo-xlib-display.c | 1 + + src/cairo-xlib-render-compositor.c | 1 + + src/cairo-xlib-screen.c | 1 + + src/cairo-xlib-surface.c | 1 + + src/cairo-xlib-xcb-surface.c | 1 + + 25 files changed, 234 insertions(+), 171 deletions(-) + +commit df62accbda19276c68753e799a32443b47d4e939 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-surface-subsurface-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-analysis-surface.c | 2 +- + src/cairo-cogl-surface.c | 2 +- + src/cairo-gl-operand.c | 2 +- + src/cairo-paginated-surface.c | 2 +- + src/cairo-surface-observer.c | 2 +- + src/cairo-surface-subsurface-inline.h | 72 ++++++++++++++++++++++++++++++++++ + src/cairo-surface-subsurface-private.h | 32 +-------------- + src/cairo-xlib-source.c | 2 +- + 9 files changed, 80 insertions(+), 37 deletions(-) + +commit 590202dbfba709cfdd8ad3c241e7af06b3c542e9 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-error-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-error-inline.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-error-private.h | 7 ------- + 3 files changed, 53 insertions(+), 7 deletions(-) + +commit 2e7d60e0a29494d94a05205ec83f3dae2041811f +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-pattern-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-image-source.c | 2 +- + src/cairo-mask-compositor.c | 2 +- + src/cairo-pattern-inline.h | 63 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-pattern-private.h | 20 -------------- + src/cairo-spans-compositor.c | 2 +- + src/cairo-traps-compositor.c | 2 +- + src/cairo-xlib-source.c | 2 +- + 8 files changed, 69 insertions(+), 25 deletions(-) + +commit 306117ea7c69f9125fa062e4c5e5f9086b98d832 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-recording-surface-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-beos-surface.cpp | 1 + + src/cairo-cogl-surface.c | 2 +- + src/cairo-gl-surface-legacy.c | 1 + + src/cairo-image-surface-inline.h | 82 +++++++++++++++++++++++++++++++++++++++ + src/cairo-image-surface-private.h | 35 ----------------- + src/cairo-image-surface.c | 10 ++--- + src/cairo-skia-surface.cpp | 1 + + src/cairo-surface.c | 2 +- + src/cairo-tee-surface.c | 2 +- + src/drm/cairo-drm-surface.c | 1 + + src/skia/cairo-skia-context.cpp | 1 + + 12 files changed, 96 insertions(+), 43 deletions(-) + +commit 8653c2692e684a60370b99e545123ba2a7b00bc8 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-recording-surface-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 2 + + src/cairo-analysis-surface.c | 4 +- + src/cairo-image-source.c | 2 +- + src/cairo-pattern.c | 4 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-recording-surface-inline.h | 68 ++++++++++++++++++++++++++++++++ + src/cairo-recording-surface-private.h | 26 ------------ + src/cairo-recording-surface.c | 2 +- + src/cairo-script-surface.c | 4 +- + src/cairo-spans-compositor.c | 2 +- + src/cairo-surface-snapshot-inline.h | 2 +- + src/cairo-surface-snapshot-private.h | 18 --------- + src/cairo-surface-snapshot.c | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-tee-surface.c | 2 +- + src/cairo-traps-compositor.c | 4 +- + src/cairo-vg-surface.c | 2 +- + src/cairo-xcb-surface-render.c | 4 +- + src/cairo-xlib-source.c | 2 +- + src/cairo-xml-surface.c | 2 +- + src/win32/cairo-win32-printing-surface.c | 2 +- + 22 files changed, 93 insertions(+), 67 deletions(-) + +commit 3266f936dee59b7c3a990e518899a72d0e103f62 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-surface-snapshot-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/cairo-surface-snapshot-inline.h | 59 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +commit 356c7cb2e3da8d95a4bc6c40d0b1895657fd59ce +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-surface-observer-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-surface-observer-inline.h | 59 ++++++++++++++++++++++++++++++++++++ + src/cairo-surface-observer-private.h | 21 +------------ + src/cairo-surface-observer.c | 1 + + 4 files changed, 62 insertions(+), 20 deletions(-) + +commit f3623cf0220aa32c12c3ba3988a5dfef6605d6b3 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-surface-private into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-surface-inline.h | 52 ++++++++++++++++++++++++++++++++++ + src/cairo-surface-private.h | 9 ------ + src/win32/cairo-win32-gdi-compositor.c | 1 + + 4 files changed, 54 insertions(+), 9 deletions(-) + +commit 6736d0bf000a42ce426b45c923d7066bf0a27089 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-contour-privates into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-contour-inline.h | 80 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-contour-private.h | 35 ------------------ + src/cairo-contour.c | 1 + + src/cairo-path-stroke-polygon.c | 1 + + 5 files changed, 83 insertions(+), 35 deletions(-) + +commit afa180935bedb5c3db06706d893b2bcd89b2215b +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-combsort-privates into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 2 +- + src/cairo-bentley-ottmann-rectangular.c | 2 +- + src/cairo-bentley-ottmann-rectilinear.c | 2 +- + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-botor-scan-converter.c | 2 +- + src/cairo-boxes-intersect.c | 2 +- + src/cairo-combsort-inline.h | 94 +++++++++++++++++++++++++++++++++ + src/cairo-combsort-private.h | 94 --------------------------------- + src/cairo-contour.c | 2 +- + src/cairo-polygon-intersect.c | 2 +- + src/cairo-polygon-reduce.c | 2 +- + src/cairo-recording-surface.c | 2 +- + src/cairo-rectangular-scan-converter.c | 2 +- + src/cairo-surface-observer.c | 2 +- + 14 files changed, 106 insertions(+), 106 deletions(-) + +commit 0770dda52be9c1bf464a84cb5566ef46d7e9df5a +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-clip-privates into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 1 + + src/cairo-clip-boxes.c | 1 + + src/cairo-clip-inline.h | 83 ++++++++++++++++++++++++++++++++++ + src/cairo-clip-polygon.c | 1 + + src/cairo-clip-private.h | 42 ----------------- + src/cairo-clip.c | 1 + + src/cairo-composite-rectangles.c | 1 + + src/cairo-default-context.c | 1 + + src/cairo-gstate.c | 1 + + src/cairo-mask-compositor.c | 1 + + src/cairo-spans-compositor.c | 1 + + src/cairo-surface-clipper.c | 1 + + src/cairo-surface-offset.c | 1 + + src/cairo-surface-subsurface.c | 1 + + src/cairo-surface-wrapper.c | 1 + + src/cairo-surface.c | 1 + + src/cairo-traps-compositor.c | 1 + + src/cairo-xcb-surface-render.c | 1 + + src/cairo-xlib-core-compositor.c | 1 + + src/win32/cairo-win32-gdi-compositor.c | 1 + + 20 files changed, 101 insertions(+), 42 deletions(-) + +commit e9c9e28cd19df8a5875f62fc74087500182399f0 +Author: Chris Wilson +Date: Thu Apr 19 11:59:54 2012 +0100 + + Split cairo-box-privates into struct+inlines + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + src/Makefile.sources | 2 +- + src/cairo-analysis-surface.c | 2 +- + src/cairo-box-inline.h | 121 +++++++++++++++++++++++++++++++++++++++ + src/cairo-box-private.h | 121 --------------------------------------- + src/cairo-boxes.c | 2 +- + src/cairo-clip-boxes.c | 2 +- + src/cairo-cogl-surface.c | 2 +- + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fixed.c | 2 +- + src/cairo-path-stroke-boxes.c | 2 +- + src/cairo-path-stroke-polygon.c | 2 +- + src/cairo-path-stroke-tristrip.c | 2 +- + src/cairo-path-stroke.c | 2 +- + src/cairo-rectangle.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-traps-compositor.c | 2 +- + 16 files changed, 135 insertions(+), 135 deletions(-) + +commit f830268b952ecd06bf3adf7bf62dc4b5c4139e5c +Author: Chris Wilson +Date: Thu Apr 19 12:04:01 2012 +0100 + + boxes: Remove unused inline function + + Signed-off-by: Chris Wilson + + src/cairo-boxes-private.h | 8 -------- + 1 file changed, 8 deletions(-) + +commit 9417fec04a172a7c44be38c1b3d032c3fee4f0d6 +Author: Chris Wilson +Date: Wed Apr 18 20:44:43 2012 +0100 + + image: Split inline SRC composition + + Currently we construct a mask for the entire line and try to process it + in one call to pixman (two without the LERP operator). An alternative + approach is split the row into separate composite operations for the + clear (which we can skip), fully opaque and partial spans. + + As the source operator is typically mostly opaque or clear, this is a + good win as we are able to utilise more fast paths. In the worst case, + it degrades to the old method of constructing a whole mask for a row. + It may reduce performance for having to process lots of spans though + (this is where the pixman spans interface should help). However, such + geometry is rare and typically handled elsewhere. + + And the existing code has a bug where it was clearing the destination + for clear regions of the mask outside of the spans. + + Signed-off-by: Chris Wilson + + src/cairo-image-compositor.c | 154 +++++++++++++++++++++++++++---------------- + 1 file changed, 96 insertions(+), 58 deletions(-) + +commit 70fc52cb80f21fff0ba960236f24b997692cce64 +Author: Chris Wilson +Date: Wed Apr 18 15:24:41 2012 +0100 + + stroke(boxes): Apply user scale factors to dash segments + + Fixes tests/rectilinear-dash-scale* + + Reported-by: Guillaume Ayoub + Reported-by: Carlos Garcia Campos + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48818 + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-boxes.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 5ff32f70c14d89cb776a1a9da91089c258dbbf68 +Author: Chris Wilson +Date: Wed Apr 18 15:20:57 2012 +0100 + + test: Add rectilinear-dash-scale + + Exercise rectilinear dashes under a non-uniform scale factors. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48818 + Signed-off-by: Chris Wilson + + test/Makefile.sources | 1 + + test/rectilinear-dash-scale.c | 196 +++++++++++++++++++++ + .../rectilinear-dash-scale-unaligned.ref.png | Bin 0 -> 5010 bytes + .../rectilinear-dash-scale-unaligned.traps.ref.png | Bin 0 -> 4552 bytes + test/reference/rectilinear-dash-scale.ref.png | Bin 0 -> 921 bytes + 5 files changed, 197 insertions(+) + +commit 4f125a1bd069095f3a97f009e7d7af2681353fb1 +Author: Nis Martensen +Date: Thu Apr 12 23:20:59 2012 +0200 + + typo + + doc/public/check-doc-coverage.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 905a88bf517bdc1b110587551ea7f1739bd90627 +Author: Nis Martensen +Date: Fri Apr 13 20:22:59 2012 +0200 + + doc: add missing chapters + + Signed-off-by: Uli Schlachter + + doc/public/cairo-docs.xml | 3 +++ + 1 file changed, 3 insertions(+) + +commit 80d1e68bb31be030f8102f28545bb622fa2050d8 +Author: Nis Martensen +Date: Fri Apr 13 20:36:03 2012 +0200 + + doc: do not use / in section title + + The Title: field is used to determine the file name of the generated + html. Due to the slash a subdirectory is created and all relative links + in the generated file are broken. + + Use a hyphen instead. + + Signed-off-by: Uli Schlachter + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 40d6c580cd029f3d330ba28a7728ff36498920cb +Author: Javier Jardón +Date: Tue Sep 13 16:30:10 2011 +0100 + + configure.ac: Do not generate template files when building docs + + It's not needed as all the api documentation is inline + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7b25b2eb4b83f411935e51ed398cebfb3a9c3c59 +Author: Javier Jardón +Date: Tue Sep 13 16:20:12 2011 +0100 + + autogen.sh: User autoreconf instead custom script + + autogen.sh | 194 +++++-------------------------------------------------------- + 1 file changed, 14 insertions(+), 180 deletions(-) + +commit aa90a8f84f7dff67d57a8c0863331bf04e3b546e +Author: Javier Jardón +Date: Tue Sep 13 16:15:49 2011 +0100 + + configure.ac: generate xz tarballs by default + + build/Makefile.am.releasing | 2 +- + configure.ac | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 3616a5f992e6d12fc7f005b7b67ab2101d248470 +Author: Javier Jardón +Date: Tue Sep 13 16:13:41 2011 +0100 + + configure.ac: Update autotools configuration + + Do not use autoconf deprecated macros + Use new libtool syntax + honor aclocal flags + + Makefile.am | 2 +- + configure.ac | 16 +++++++++++----- + 2 files changed, 12 insertions(+), 6 deletions(-) + +commit 93d42e82a43a0e2f531331b127ec82d8a3b6eded +Author: Chris Wilson +Date: Sat Apr 14 14:52:42 2012 +0100 + + Revert accidental push of ps debugging API. + + This reverts commits + 6ad8c96fd81e06cea6ada4a83e7c5614f150f914, + a3f97d1d2e77a0fee4ca03d5dc9968952a440561, + 25abe582982caeb07d1e0af4acca53bb110a33bf + + I should know better by now than to push without checking for outstanding + changes. + + boilerplate/cairo-boilerplate-pdf.c | 19 ++++++++++----- + boilerplate/cairo-boilerplate-ps.c | 40 +++++++++++++++++++++++++------ + src/cairo-pdf-surface.c | 21 ---------------- + src/cairo-pdf.h | 5 ---- + src/cairo-ps-surface.c | 48 ------------------------------------- + src/cairo-ps.h | 10 -------- + 6 files changed, 46 insertions(+), 97 deletions(-) + +commit d486ea30f1a58640a1178de74f705a73845b1cda +Author: Marcus Meissner +Date: Sat Apr 14 14:47:02 2012 +0100 + + configure: Conditionally include -flto + + As some systems fail to create working binaries with when linked with + lto, perform a check during configure. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=39114 + + build/configure.ac.warnings | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 25abe582982caeb07d1e0af4acca53bb110a33bf +Author: Chris Wilson +Date: Thu Apr 12 10:51:38 2012 +0100 + + pdf (debug API): Export the ability to force fallbacks + + We need to occasionally force fallbacks whilst testing the PDF + output, so export a debug interface to do so in order to avoid poking + around inside cairo internals. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + boilerplate/cairo-boilerplate-pdf.c | 19 ++++++------------- + src/cairo-pdf-surface.c | 21 +++++++++++++++++++++ + src/cairo-pdf.h | 5 +++++ + 3 files changed, 32 insertions(+), 13 deletions(-) + +commit a3f97d1d2e77a0fee4ca03d5dc9968952a440561 +Author: Chris Wilson +Date: Thu Apr 12 10:51:38 2012 +0100 + + ps (debug API): Export the ability to force fallbacks + + We need to occasionally force fallbacks whilst testing the PostScript + output, so export a debug interface to do so in order to avoid poking + around inside cairo internals. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + boilerplate/cairo-boilerplate-ps.c | 20 ++++++-------------- + src/cairo-ps-surface.c | 21 +++++++++++++++++++++ + src/cairo-ps.h | 3 +++ + 3 files changed, 30 insertions(+), 14 deletions(-) + +commit 6ad8c96fd81e06cea6ada4a83e7c5614f150f914 +Author: Chris Wilson +Date: Thu Apr 12 10:51:38 2012 +0100 + + ps (API): Export the ability to set the creation date of the surface + + A PostScript surface embeds a CreationDate comment into its document + description pre-amble. Normally this is set to the time the surface is + written out, except we set this to a constant value in the boilerplate + for the purposes of mimicking a reference file. It may also be useful + for external applications, so make it a public export. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=48577 + Signed-off-by: Chris Wilson + + boilerplate/cairo-boilerplate-ps.c | 20 +------------------- + src/cairo-ps-surface.c | 27 +++++++++++++++++++++++++++ + src/cairo-ps.h | 7 +++++++ + 3 files changed, 35 insertions(+), 19 deletions(-) + +commit bf5adaf3942388e58ad3bda30173e53b214df885 +Author: Nis Martensen +Date: Tue Apr 10 22:09:23 2012 +0200 + + doc: add returns statement to cairo_surface_supports_mime_type + + Signed-off-by: Uli Schlachter + + src/cairo-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit a6a5b1fd0b0e32bc03e4742a0441d03e352ea8bc +Author: Nis Martensen +Date: Tue Apr 10 22:02:54 2012 +0200 + + doc: no separate cairo-xcb-xrender section + + There is already a cairo-xcb section and there are no symbols that + should be documented in an extra -xrender section. It is not mentioned + in cairo-sections.txt either. So simply delete it. + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface-render.c | 13 ------------- + 1 file changed, 13 deletions(-) + +commit c04f5a353f0b05326915f370b05480eeda27ebac +Author: Nis Martensen +Date: Sun Mar 11 00:36:58 2012 +0100 + + add unused symbols to sections doc + + Signed-off-by: Uli Schlachter + + doc/public/cairo-sections.txt | 32 +++++++++++++++++++++++++++++++- + 1 file changed, 31 insertions(+), 1 deletion(-) + +commit 07fc63676dfdaa57ed919ad7be8f59c97c615473 +Author: Uli Schlachter +Date: Wed Apr 11 21:37:55 2012 +0200 + + xlib: Disable fallback compositor with xlib-xcb + + When xlib-xcb is enabled, this is just dead code which is never used. Thus, this + shouldn't hurt. However, this does include cairo-xlib-private.h. Shouldn't be a + problem? Well, that header contains static inline functions which some compiler + on Solaris will emit even when they are unused. + + This brings us to the real problem: That static inline function refers to a + function which isn't compiled with xlib-xcb and thus linking fails with + undefined symbols. + + This can be reproduced with GCC by adding a call to + _cairo_xlib_screen_put_gc(NULL, NULL, 0, 0); to + _cairo_xlib_fallback_compositor_get. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48489 + Signed-off-by: Uli Schlachter + + src/cairo-xlib-fallback-compositor.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 09de481ce5f6ed1c38c0d5bf3af7c60642c4c947 +Author: Gilles Espinasse +Date: Sat Apr 7 23:09:51 2012 +0200 + + Cosmetic configure fix + + 'how to allow undefined symbols in shared libraries' test should use CAIRO_CC_TRY_FLAG_SILENT or configure display is a bit out of order like this + + checking how to allow undefined symbols in shared libraries used by test suite... checking whether gcc supports -Wl,--allow-shlib-undefined... yes + -Wl,--allow-shlib-undefined + + Signed-off-by: Gilles Espinasse + Signed-off-by: Uli Schlachter + + build/configure.ac.warnings | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c7b86ab97be1d3d3ccf43b652832f148a2fcf290 +Author: Adrian Johnson +Date: Tue Apr 10 22:34:05 2012 +0930 + + any2ppm: fix missing enumeration warning + + test/any2ppm.c | 1 + + 1 file changed, 1 insertion(+) + +commit b74e8ebd50da443537a031132ebc86728f79e5f5 +Author: Maarten Bosmans +Date: Mon Apr 9 21:33:52 2012 +0200 + + Add _cairo_win32_print_gdi_error to boilerplate code + + This function is not exported in libcairo, so can't be used from the + library. + + boilerplate/cairo-boilerplate-win32-printing.c | 30 ++++++++++++++++++++++++-- + 1 file changed, 28 insertions(+), 2 deletions(-) + +commit 0bb3e0769a49f639ae86a9577394fc51709441f5 +Author: Maarten Bosmans +Date: Mon Apr 9 21:33:51 2012 +0200 + + test: Only use alarm() when SIGALRM is also defined + + On some platforms (mingw) the alarm() configure check succeeds, but the + alarm function doesn't actually work. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9fcbe25c2dcf831783bb0fd20af9754c0b5c409b +Author: Maarten Bosmans +Date: Mon Apr 9 21:33:50 2012 +0200 + + Protect code using dlfcn.h with CAIRO_HAS_DLSYM + + configure.ac | 1 + + util/Makefile.am | 4 ++++ + 2 files changed, 5 insertions(+) + +commit 3f32419257bb2e380dd63a3b1a850b512a617776 +Author: Maarten Bosmans +Date: Mon Apr 9 21:33:49 2012 +0200 + + test: Give some functions in any2ppm a prefix + + The function name _write is too generic and can clash with already + defined functions. + + test/any2ppm.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 038e4991912656a3239ca82d60056ca129016ba6 +Author: Adrian Johnson +Date: Mon Apr 9 18:01:44 2012 +0930 + + pdf: avoid unnecessary use of patterns in mask groups + + src/cairo-pdf-surface.c | 188 +++++++++++++++++++++++++++--------------------- + 1 file changed, 106 insertions(+), 82 deletions(-) + +commit 2007f0eccec5df72b7069fc43878fa0c1ce89527 +Author: Adrian Johnson +Date: Mon Apr 9 20:03:15 2012 +0930 + + test: disable subsurface tests with vector backends + + due to a subsurface snapshot bug causing recursion in the pdf backend. + + test/subsurface-image-repeat.c | 2 +- + test/subsurface-modify-child.c | 2 +- + test/subsurface-modify-parent.c | 2 +- + test/subsurface-outside-target.c | 2 +- + test/subsurface-pad.c | 2 +- + test/subsurface-reflect.c | 2 +- + test/subsurface-repeat.c | 2 +- + test/subsurface-scale.c | 2 +- + test/subsurface-similar-repeat.c | 2 +- + test/subsurface.c | 2 +- + 10 files changed, 10 insertions(+), 10 deletions(-) + +commit 7cb5053c0694992320b5f7ea3b91ea497431813b +Author: Chris Wilson +Date: Mon Apr 9 12:49:20 2012 +0100 + + analysis: Apply the integer translation to the bbox as well + + The bbox is used to compute the ink extents (and so the pattern extents + of a recording surface) and if given an integer translation we failed to + transform the bbox into the target space. + + Fixes mask (pdf). + + Signed-off-by: Chris Wilson + + src/cairo-analysis-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit de61681574eb7d6e0e497ea7f25797e3d9b20ac4 +Author: Chris Wilson +Date: Mon Apr 9 12:47:34 2012 +0100 + + build: Disable -Wset-but-unused-variable + + This is too noisy in the current build, and masking more important + warnings. + + Signed-off-by: Chris Wilson + + build/configure.ac.warnings | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 113ec6bf0c8ed1ff12293d1ed2a2de9bd5b9904b +Author: Chris Wilson +Date: Sun Apr 8 17:58:13 2012 +0100 + + traps: Clip the trapezoid extents against the clip extents + + Just in case the clip polygon turns out to be much larger than the + operation extents (silly us for not reducing it correctly) and lead to + catastrophe, such as: + + Program received signal SIGSEGV, Segmentation fault. + pixman_fill_sse2 (bits=, stride=4, bpp=8, x=0, y=0, + width=3, height=-34811, data=0) at pixman-sse2.c:3369 + 3369 *(uint16_t *)d = data; + + Signed-off-by: Chris Wilson + + src/cairo-traps-compositor.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 6f28f0b33cb12f3b2dd48c87da0018bd00c17107 +Author: Chris Wilson +Date: Sun Apr 8 11:28:59 2012 +0100 + + stroke: Fix misuse of half_line_x for vertical caps on dashes + + A typo using half_line_x instead of half_line_y when emitting dashed + segments of the rectilinear stroke. + + Signed-off-by: Chris Wilson + + src/cairo-path-stroke-boxes.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 8657ca10e34b0034602680b4304d47ecf90ccbfd +Author: Adrian Johnson +Date: Fri Apr 6 21:20:40 2012 +0930 + + fix _cairo_pattern_get_ink_extents to work with snapshot recording surfaces + + It had caused pdf bbox sizes to regress to page size bboxes. + + src/cairo-pattern.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 8886220b5027296f5b3b95e9c2f93509108d3b9e +Author: Adrian Johnson +Date: Fri Apr 6 09:43:53 2012 +0930 + + type1-subset: if font name is prefixed with a subset tag, strip it off + + src/cairo-type1-subset.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit a6d955fcc46ae2da8d6f3b2cadeae64c03066461 +Author: Adrian Johnson +Date: Fri Apr 6 09:23:50 2012 +0930 + + fix indentation in cairo_type1_font_subset_parse_charstring + + src/cairo-type1-subset.c | 147 ++++++++++++++++++++++++----------------------- + 1 file changed, 74 insertions(+), 73 deletions(-) + +commit 70b2856ed3d31b41e69b3d82fb9c5c11c2b3d3d4 +Author: Adrian Johnson +Date: Fri Apr 6 09:13:35 2012 +0930 + + type1-subset: use fallback font if glyph widths are calculated + + Bug 48349 has a pdf file with a Type 1 font where the glyph widths are + of the form: + + 34 9302 19 div hsbw + + src/cairo-type1-subset.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 7a262fd398c8a1f3c9052e8d9ec459e27ff91b4d +Author: Adrian Johnson +Date: Wed Apr 4 19:53:09 2012 +0930 + + fix bug in _cairo_image_analyze_color + + src/cairo-image-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit cc247c346b75353f16ab40ac74c54cdd9663d16b +Author: Henry (Yu) Song +Date: Mon Apr 2 14:29:47 2012 -0700 + + gl: Remove an unused variable + + src/cairo-gl-gradient.c | 1 - + 1 file changed, 1 deletion(-) + +commit c77112c5464d7ff21052527f82f4d729cc509291 +Author: Uli Schlachter +Date: Mon Apr 2 20:43:00 2012 +0200 + + xcb: Fix SHM in _get_image() + + Commit 2283ab9 introduced a logic error. Instead of falling back to the non-SHM + path when getting the image via SHM failed, we now did the fallback when getting + the image via SHM worked (which means that the SHM operation was a waste of + time). + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d18542b735bb777b444152f0ef06de18993635bd +Author: Kalev Lember +Date: Wed Mar 28 19:47:24 2012 +0300 + + win32: Avoid redefining ssize_t + + ... if it's already defined by system headers. mingw-w64 includes a + ssize_t definition, so we'll have to make sure not to redefine it in + that case. + + util/cairo-missing/cairo-missing.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit a965b0f95fdeb567f7ccb51f7c8c47735a61e2d9 +Author: Henry (Yu) Song +Date: Thu Mar 29 01:08:51 2012 +0000 + + gl: fix y-axis origin when map_to_image() for non texture GL surface + + We need to fix y-axis origin when map a GL surface to image surface for + non-texture GL surface. + + Test cases: extended-blend-alpha-mask, extended-blend-mask. + Although the image outputs is not right, but the image on the first grid + (upper-left corner) is correct comparing to image output. + + src/cairo-gl-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit af6e084dd78fcbb8ecce46c57f655f5e24343b8c +Author: Chris Wilson +Date: Thu Mar 29 14:48:24 2012 +0100 + + cairoint: Mark PDF surface as requiring the deflate stream output + + Signed-off-by: Chris Wilson + + src/cairoint.h | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 169cc39dff6f49af6e39281912e577b0d6bda8ea +Author: Chris Wilson +Date: Thu Mar 29 11:58:35 2012 +0100 + + test: update two reference images highlighted to be wrong due to source extents + + Signed-off-by: Chris Wilson + + test/reference/operator-source.argb32.ref.png | Bin 5625 -> 5612 bytes + test/reference/operator-source.rgb24.ref.png | Bin 3967 -> 3975 bytes + test/reference/overlapping-boxes.argb32.ref.png | Bin 192 -> 179 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 185 -> 170 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit f0e40af05b81bf26dcf36cb262c34603b6420d1c +Author: Andrea Canciani +Date: Tue Mar 27 11:32:55 2012 +0200 + + doc: Silence last 'missing Since field' errors + + Some APIs are public but not yet supported, hence they might chenge + without notice. State their "Since" status as "to be determined". + + src/cairo-beos-surface.cpp | 4 ++++ + src/cairo-gl-surface.c | 2 ++ + 2 files changed, 6 insertions(+) + +commit 5174c585def3e2ec06a4679644973a489f92bef2 +Author: Andrea Canciani +Date: Sat Mar 24 17:58:57 2012 +0100 + + doc: Silence warnings about 'Since' field in private functions + + A 'Since' field on non-public functions is not very meaningful, + because their signature, implementation and semantic is subject to + change without any visibility outside of cairo. + + src/cairo-font-options.c | 8 -------- + 1 file changed, 8 deletions(-) + +commit dc1f5f1b002dd61c4c7b27dbaadb9f52dd34ec14 +Author: Andrea Canciani +Date: Thu Feb 16 14:30:08 2012 +0100 + + doc: Add since documentation for enumeration values + + src/cairo-pdf.h | 4 +- + src/cairo-ps.h | 4 +- + src/cairo-region.c | 8 +- + src/cairo-script.h | 4 +- + src/cairo-svg.h | 4 +- + src/cairo.h | 265 +++++++++++++++++++++++++++-------------------------- + 6 files changed, 145 insertions(+), 144 deletions(-) + +commit 2470065edf80fa3a41159990a5dac3e45ac80a09 +Author: Andrea Canciani +Date: Tue Mar 27 11:47:11 2012 +0200 + + doc: Fix some wrong versions + + The script from the previous commit reported that some 'Since' fields + indicate incorrect versions. + + src/cairo-quartz-surface.c | 6 +++--- + src/cairo-script-surface.c | 2 +- + src/cairo-script.h | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 1d3d64469f3ddac282860f66b24a35cf2253fa46 +Author: Andrea Canciani +Date: Tue Mar 27 11:48:19 2012 +0200 + + doc: Add "since" tag to documentation + + The following Python script was used to compute "Since: 1.X" tags, + based on the first version where a symbol became officially supported. + + This script requires a concatenation of the the cairo public headers + for the officially supported beckends to be available as + "../../includes/1.X.0.h". + + from sys import argv + import re + + syms = {} + + def stripcomments(text): + def replacer(match): + s = match.group(0) + if s.startswith('/'): + return "" + else: + return s + pattern = re.compile( + r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"', + re.DOTALL | re.MULTILINE + ) + return re.sub(pattern, replacer, text) + + for minor in range(12,-2,-2): + version = "1.%d" % minor + names = re.split('([A-Za-z0-9_]+)', stripcomments(open("../../includes/%s.0.h" % version).read())) + for s in names: syms[s] = version + + for filename in argv[1:]: + is_public = False + lines = open(filename, "r").read().split("\n") + newlines = [] + for i in range(len(lines)): + if lines[i] == "/**": + last_sym = lines[i+1][2:].strip().replace(":", "") + is_public = last_sym.lower().startswith("cairo") + elif is_public and lines[i] == " **/": + if last_sym in syms: + v = syms[last_sym] + if re.search("Since", newlines[-1]): newlines = newlines[:-1] + if newlines[-1].strip() != "*": newlines.append(" *") + newlines.append(" * Since: %s" % v) + else: + print "%s (%d): Cannot determine the version in which '%s' was introduced" % (filename, i, last_sym) + newlines.append(lines[i]) + + out = open(filename, "w") + out.write("\n".join(newlines)) + out.close() + + src/cairo-debug.c | 2 + + src/cairo-font-face.c | 10 ++ + src/cairo-font-options.c | 30 ++++++ + src/cairo-ft-font.c | 14 +++ + src/cairo-image-surface.c | 8 ++ + src/cairo-matrix.c | 24 +++++ + src/cairo-misc.c | 2 + + src/cairo-path.c | 2 + + src/cairo-pattern.c | 32 ++++++ + src/cairo-pdf-surface.c | 2 + + src/cairo-pdf.h | 2 +- + src/cairo-png.c | 10 ++ + src/cairo-ps-surface.c | 2 + + src/cairo-ps.h | 2 + + src/cairo-quartz-font.c | 2 + + src/cairo-quartz-surface.c | 2 + + src/cairo-region.c | 2 + + src/cairo-scaled-font.c | 12 +++ + src/cairo-script-surface.c | 16 +++ + src/cairo-surface.c | 26 +++++ + src/cairo-svg-surface.c | 2 + + src/cairo-svg.h | 2 + + src/cairo-version.c | 16 +++ + src/cairo-xlib-surface.c | 14 +++ + src/cairo.c | 174 ++++++++++++++++++++++++++++++++ + src/cairo.h | 66 ++++++++++++ + src/win32/cairo-win32-display-surface.c | 4 + + src/win32/cairo-win32-font.c | 14 +++ + src/win32/cairo-win32-surface.c | 2 + + 29 files changed, 495 insertions(+), 1 deletion(-) + +commit 79740139e05375c4ce3542b571bc6a1e9d9137a7 +Author: Andrea Canciani +Date: Thu Feb 16 18:52:16 2012 +0100 + + doc: Do not use the '@' prefix on some tags + + Make the 'Since' and 'Returns' tags consistent by removing the '@' + prefix. + + Fixes some "missing 'Since' field" warnings. + + src/cairo-image-surface.c | 2 +- + src/cairo-script-surface.c | 2 +- + src/cairo-surface.c | 10 +++++----- + src/cairo-user-font.c | 2 +- + src/cairo-version.c | 8 ++++---- + 5 files changed, 12 insertions(+), 12 deletions(-) + +commit bbafcb3de8c01e2946e565f6ec7e31a3b325dbad +Author: Andrea Canciani +Date: Thu Feb 16 18:53:14 2012 +0100 + + doc: Make the documentation name match the function name + + Fixes the 'symbol not found' errors caused by mismatches between the + documentation name and the name in the code. + + src/cairo-scaled-font-subsets-private.h | 8 ++++---- + src/cairo-traps.c | 2 +- + src/cairo-xlib-display.c | 2 +- + 3 files changed, 6 insertions(+), 6 deletions(-) + +commit 7f635e4ead0c5bc689438a3c52742feba92c09ed +Author: Andrea Canciani +Date: Sat Mar 24 17:48:07 2012 +0100 + + doc: Make doc ids more consistent my always putting ':' after them + + This makes the documentations comments more consistent and fixes many + reports of 'invalid doc id'. + + src/cairo-arc.c | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-path-stroke.c | 2 +- + src/cairo-pattern.c | 36 ++++++++++++++++++------------------ + src/cairo-quartz-font.c | 4 ++-- + src/cairo-quartz-surface.c | 6 +++--- + src/cairo-recording-surface.c | 2 +- + src/cairo-surface-snapshot.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo.c | 8 ++++---- + src/win32/cairo-win32-surface.c | 4 ++-- + 11 files changed, 35 insertions(+), 35 deletions(-) + +commit eaac0fa87e588c3e29c177baa016e754588ad6c2 +Author: Andrea Canciani +Date: Fri Mar 23 11:57:38 2012 +0100 + + doc: Manually fix remaining warnings about symmetry + + The Python script is unable to fix all of the warnings, because some + point to comments that are not actually documentation. + + Fixes the remaining 'documentation comment not closed with **/' + warnings. + + src/cairo-gl-surface-legacy.c | 2 +- + src/cairo-qt-surface.cpp | 2 +- + src/cairo-skia-surface.cpp | 4 ++-- + src/cairo-wideint.c | 3 ++- + 4 files changed, 6 insertions(+), 5 deletions(-) + +commit f717341ab9fec1f4a72fe18f5e712272c831d978 +Author: Andrea Canciani +Date: Thu Feb 16 00:31:47 2012 +0100 + + doc: Make documentation comments symmetric + + Documentation comments should always start with "/**" and end with + "**/". This is not required by gtk-doc, but it makes the + documentations formatting more consistent and simplifies the checking + of documentation comments. + + The following Python script tries to enforce this. + + from sys import argv + from sre import search + + for filename in argv[1:]: + in_doc = False + lines = open(filename, "r").read().split("\n") + for i in range(len(lines)): + ls = lines[i].strip() + if ls == "/**": + in_doc = True + elif in_doc and ls == "*/": + lines[i] = " **/" + if ls.endswith("*/"): + in_doc = False + + out = open(filename, "w") + out.write("\n".join(lines)) + out.close() + + This fixes most 'documentation comment not closed with **/' warnings + by check-doc-syntax.awk. + + src/cairo-beos-surface.cpp | 2 +- + src/cairo-device.c | 2 +- + src/cairo-font-face.c | 2 +- + src/cairo-font-options.c | 2 +- + src/cairo-ft-font.c | 6 +++--- + src/cairo-gl.h | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-image-surface.c | 4 ++-- + src/cairo-malloc-private.h | 10 +++++----- + src/cairo-matrix.c | 2 +- + src/cairo-misc.c | 14 +++++++------- + src/cairo-path-stroke.c | 2 +- + src/cairo-path.c | 2 +- + src/cairo-pattern.c | 12 ++++++------ + src/cairo-pdf-surface.c | 8 ++++---- + src/cairo-pdf.h | 2 +- + src/cairo-png.c | 4 ++-- + src/cairo-ps-surface.c | 6 +++--- + src/cairo-ps.h | 2 +- + src/cairo-quartz-font.c | 6 +++--- + src/cairo-quartz-image-surface.c | 2 +- + src/cairo-quartz-surface.c | 4 ++-- + src/cairo-recording-surface.c | 4 ++-- + src/cairo-region.c | 4 ++-- + src/cairo-scaled-font.c | 2 +- + src/cairo-script-surface.c | 4 ++-- + src/cairo-surface.c | 22 +++++++++++----------- + src/cairo-svg-surface.c | 6 +++--- + src/cairo-svg.h | 2 +- + src/cairo-types-private.h | 2 +- + src/cairo-user-font.c | 4 ++-- + src/cairo-version.c | 16 ++++++++-------- + src/cairo-xcb-surface-render.c | 2 +- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 8 ++++---- + src/cairo.c | 16 ++++++++-------- + src/cairo.h | 2 +- + src/win32/cairo-win32-display-surface.c | 4 ++-- + src/win32/cairo-win32-font.c | 4 ++-- + src/win32/cairo-win32-surface.c | 6 +++--- + 40 files changed, 105 insertions(+), 105 deletions(-) + +commit c0fc24c889b09b734383c9250a3663d83510479e +Author: Andrea Canciani +Date: Sat Mar 24 17:53:23 2012 +0100 + + doc: Make informational comments syntactically different from docs + + This avoids confusion with the documentation comments and fixes some + malformed docs reports. + + src/cairo-qt-surface.cpp | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 71123cffe0d10c71d1c7069a125024609ba60f1d +Author: Andrea Canciani +Date: Fri Mar 23 11:45:15 2012 +0100 + + doc: Add script to enforce stricter validation of documentation comments + + src/Makefile.am | 4 +- + src/check-doc-syntax.awk | 105 +++++++++++++++++++++++++++++++++++++++++++++++ + src/check-doc-syntax.sh | 4 ++ + 3 files changed, 111 insertions(+), 2 deletions(-) + +commit d304f0e57be8036719c3709e2419487326369105 +Author: Chris Wilson +Date: Thu Mar 29 00:32:36 2012 +0100 + + composite-rectangles: Trim extents for SOURCE and CLEAR to the mask + + The SOURCE and CLEAR are the odd pair in Cairo's range of operators that + are bound by the shape/mask, but are unbound by the source. This + regularly leads to bugs as only track the bound/unbound rectangles and + confuse the meaning when bound only by the mask. + + What is required is that the unbound extents in this case is only + trimmed by the mask (the bounded extents are still the intersection of + all). + + Fixes bug-source-cu + + Signed-off-by: Chris Wilson + + src/cairo-composite-rectangles.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 5b3d878c82fc862038c8e6730f34de317d734bd0 +Author: Chris Wilson +Date: Thu Mar 29 00:47:37 2012 +0100 + + test: Add test case for tracking source operator extents + + test/Makefile.sources | 1 + + test/bug-source-cu.c | 81 ++++++++++++++++++++++ + test/reference/bug-source-cu.argb32.ref.png | Bin 0 -> 3815 bytes + test/reference/bug-source-cu.rgb24.ref.png | Bin 0 -> 3211 bytes + test/reference/bug-source-cu.traps.argb32.ref.png | Bin 0 -> 3816 bytes + test/reference/bug-source-cu.traps.rgb24.ref.png | Bin 0 -> 3212 bytes + 6 files changed, 82 insertions(+) + +commit fba21ef2a4c4eb343668267fda713aedbb6af2a4 +Author: Henry (Yu) Song +Date: Tue Mar 27 21:25:37 2012 +0000 + + gl: use font's antialias option to check whether it needs mask + + There is need to loop over number of glyphs to check wether the glyph + image is a ARGB32 as the font's antialias option can be used for checking. + If antialias is SUBPIXEL or BEST, the glyph surface will be ARGB32, + otherwise it will be A8 format. Therefore we will only be using + component-alpha at SUBPIXEL (or better) font quality and only then need + a mask for multiple pass glyph composition. + + src/cairo-gl-glyphs.c | 24 ++++++++---------------- + 1 file changed, 8 insertions(+), 16 deletions(-) + +commit 06ffa0199c483e1e637f436079b1f2ed4c9e7baf +Author: Uli Schlachter +Date: Tue Mar 27 21:23:30 2012 +0200 + + README: Note that xcb is no longer experimental + + Signed-off-by: Uli Schlachter + + README | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit c4d1063e0310fa1b0c3ab749ed1b4e15431c450b +Author: Uli Schlachter +Date: Mon Mar 26 20:17:10 2012 +0200 + + xcb/xlib: Add missing "Since: 1.12" + + Signed-off-by: Uli Schlachter + + src/cairo-xcb-connection.c | 4 ++++ + src/cairo-xcb-surface.c | 12 ++++++++++++ + src/cairo-xlib-display.c | 2 ++ + 3 files changed, 18 insertions(+) + +commit f5f8915df25112ad895d85cb6255d0bf01e24c63 +Author: Behdad Esfahbod +Date: Sun Mar 25 15:11:57 2012 -0400 + + Fix another typo + + src/cairo-gl.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 81c848c83945c19c8cf769daeaa831c086c264f2 +Author: Behdad Esfahbod +Date: Sun Mar 25 15:02:36 2012 -0400 + + More typo fixes + + src/cairo-malloc-private.h | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 73cde7a0f6d86f1e72d080757f863caddb0530e6 +Author: Behdad Esfahbod +Date: Sun Mar 25 15:00:44 2012 -0400 + + Fix typos + + src/cairo-malloc-private.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ede11b2954db19e3ca9d31cef7d04a7bf0e42ddc +Author: Behdad Esfahbod +Date: Sun Mar 25 14:37:14 2012 -0400 + + Fix math in comments + + src/cairo-arc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2721d05d69e42eef592ea0394df89cdc91414330 +Author: Behdad Esfahbod +Date: Thu Sep 22 13:02:44 2011 -0400 + + Typo + + src/cairo-arc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 841b4057bc7afdc9fbac36b178dd5f15bbfc0f90 +Author: Chris Wilson +Date: Fri Mar 23 20:16:44 2012 +0000 + + version: Post release bump to 1.12.1 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.pre-1.0 b/ChangeLog.pre-1.0 new file mode 100644 index 000000000..c9a2edc96 --- /dev/null +++ b/ChangeLog.pre-1.0 @@ -0,0 +1,18422 @@ +commit 995ed33726ac1e840ea1d6a28f48d6883a4bad59 +Author: Carl Worth +Date: Wed Aug 24 09:29:39 2005 +0000 + + Increment CAIRO_VERSION to 1.0.0 and libtool versioning to 4:2:2. + + ChangeLog | 5 +++++ + configure.in | 12 ++++++------ + 2 files changed, 11 insertions(+), 6 deletions(-) + +commit 95c1d5470151d4f9778a840847c9b532da1ef9f7 +Author: Carl Worth +Date: Wed Aug 24 09:26:28 2005 +0000 + + Fix typos. Add CAIRO_STATUS_INVALID_DASH. + + ChangeLog | 4 ++++ + NEWS | 9 +++++++-- + 2 files changed, 11 insertions(+), 2 deletions(-) + +commit 766f63567c8ecfc6881781054ac792e6252b8106 +Author: Carl Worth +Date: Wed Aug 24 09:12:37 2005 +0000 + + Unabbreviate "eg." to "for example,". + + ChangeLog | 4 ++++ + README | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 2cd76fc77f5455fb2bb141a4e75b3ced0004a1e2 +Author: Carl Worth +Date: Wed Aug 24 08:46:02 2005 +0000 + + Update name from "0.5 porting guide" to "1.0 porting guide." + + ChangeLog | 5 +++++ + PORTING_GUIDE | 14 +++++++++++--- + 2 files changed, 16 insertions(+), 3 deletions(-) + +commit aa4b9f4b00c5cf7be0f525caa2419b00a0dc26b5 +Author: Carl Worth +Date: Wed Aug 24 08:28:00 2005 +0000 + + Some text cleanups from Øyvind KolÃ¥s. + + ChangeLog | 5 +++++ + README | 9 +++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit d86f5af717baf1e44df3d10633c46482ed44b9da +Author: Carl Worth +Date: Wed Aug 24 08:12:22 2005 +0000 + + Add Amaury Jacquot. + + AUTHORS | 1 + + ChangeLog | 4 ++++ + 2 files changed, 5 insertions(+) + +commit ccc7a2f115960514ba43f24e85df9472b0fd4c60 +Author: Carl Worth +Date: Wed Aug 24 08:07:24 2005 +0000 + + Fix typo. + + ChangeLog | 4 ++++ + RELEASING | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit f4188a4680140c280bdf28c26020488d976b1dde +Author: Carl Worth +Date: Wed Aug 24 07:58:07 2005 +0000 + + Fix typos. + + AUTHORS | 2 +- + ChangeLog | 5 +++++ + README | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit bd510d8b4b7ab22a8699d55734e22b57648752d8 +Author: Tor Lillqvist +Date: Wed Aug 24 07:56:45 2005 +0000 + + Drop PDF and PS backend and FT font API from Win32 DLL entry points for now. + + ChangeLog | 5 +++++ + src/Makefile.am | 3 --- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit d86b741b4e9fdae422f7ef8c791ce779812b2be9 +Author: Carl Worth +Date: Wed Aug 24 07:16:01 2005 +0000 + + Fix typos. + + ChangeLog | 4 ++++ + README | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 83b2f98d4955149c0d9941ed42ea51bf0d6cc993 +Author: Carl Worth +Date: Wed Aug 24 06:50:51 2005 +0000 + + Move glitz into the experimental list. + + ChangeLog | 4 ++++ + README | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 9fde3cc0e3eea213c0f0fdfd8ca571fe63f4ddc9 +Author: Carl Worth +Date: Wed Aug 24 06:48:02 2005 +0000 + + Put glitz in the experimental section. + Give glitz the experimental treatment, (disable it by default. + + ChangeLog | 7 +++++++ + INSTALL | 2 +- + configure.in | 8 ++++++-- + 3 files changed, 14 insertions(+), 3 deletions(-) + +commit 19c25d63c2c4dd7a178e90df81b711ba667cbdd1 +Author: Carl Worth +Date: Wed Aug 24 06:17:39 2005 +0000 + + Add some more detailed build instructions. + + ChangeLog | 4 +++ + INSTALL | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 117 insertions(+), 5 deletions(-) + +commit 985d8571d2266715229d5e1e9d2037897240d6ce +Author: Billy Biggs +Date: Wed Aug 24 06:09:11 2005 +0000 + + Fix some minor typos in the doc. + + ChangeLog | 5 +++++ + src/cairo.c | 18 +++++++++--------- + 2 files changed, 14 insertions(+), 9 deletions(-) + +commit b5a7a195791007e3c367b92a1fcc628699ca8043 +Author: Carl Worth +Date: Wed Aug 24 06:07:58 2005 +0000 + + Disable ATSUI by default as well. + + ChangeLog | 4 ++++ + configure.in | 8 ++++++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit 3a9f977817b287e56f54760aece3105771a7dcc1 +Author: Carl Worth +Date: Wed Aug 24 05:43:48 2005 +0000 + + Add pointer to http://bugs.freedesktop.org. + + BUGS | 12 ++++++++++++ + ChangeLog | 4 ++++ + 2 files changed, 16 insertions(+) + +commit 9282036cd354a5714655ce4ad7859a99a1800b19 +Author: Carl Worth +Date: Wed Aug 24 05:36:05 2005 +0000 + + Add more detailed notes on what is required to compile cairo on Mac OS X or win32. + + ChangeLog | 5 +++++ + README | 23 +++++++++++++++++++++++ + 2 files changed, 28 insertions(+) + +commit 4569aeda97c15084998eb956a659ad1ace302819 +Author: Carl Worth +Date: Wed Aug 24 05:28:28 2005 +0000 + + Change upload directory from snapshots to releases now thatwe're doing stable releases of cairo. + + ChangeLog | 6 ++++++ + Makefile.am | 4 ++-- + RELEASING | 2 +- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 18ef8944dc318b240791070ef5282b4037bd2441 +Author: Carl Worth +Date: Wed Aug 24 05:25:51 2005 +0000 + + Give PostScript and PDF backends the experimental treatment, disabling them by default. + + ChangeLog | 5 +++++ + configure.in | 16 ++++++++++++---- + 2 files changed, 17 insertions(+), 4 deletions(-) + +commit 5ca5ddde0b505403a3a129c2c743c8e5f8fa9b90 +Author: Carl Worth +Date: Wed Aug 24 05:21:50 2005 +0000 + + Add notes for 1.0 release. Thanks to Owen Taylor. + Note that PS and PDF backends are experimental. + Note the progress that has been completed so that 1.0 is ready now. + + ChangeLog | 9 +++++++ + NEWS | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + README | 4 ++-- + ROADMAP | 28 ++++++++++++++-------- + 4 files changed, 111 insertions(+), 12 deletions(-) + +commit 112094a350c4ed3a936a748f55bcbae7eac4e5c1 +Author: Carl Worth +Date: Wed Aug 24 02:25:39 2005 +0000 + + Update documentation for most path construction functions. Add discussion of the effects on the current point to all functions. Rephrase the wording of the relative functions. Big rewrite of cairo_arc description. Add discussion of join not caps to cairo_close_path. + + ChangeLog | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 235838d49f966804970fa06715e2e89b92f39c9f +Author: Keith Packard +Date: Wed Aug 24 01:47:13 2005 +0000 + + Use new device_x_scale/device_y_scale surface fields to set the device coordinate space to the nominal pixels. + Treat more alpha values as translucent (up to 0.999) + Fix emit_image to actually use a temporary image when necessary. + Change PS coordinate space to match cairo (top-down), adjust PS output to use new space. + Find more cases where PS output was not supported and fall back to image surface. + reviewed by: cworth + + ChangeLog | 28 ++++++++++ + src/cairo-ps-surface.c | 146 +++++++++++++++++++++++++++++++------------------ + 2 files changed, 121 insertions(+), 53 deletions(-) + +commit 5198e71eaf07538307843a58a57f4551411f40b6 +Author: Keith Packard +Date: Wed Aug 24 01:42:19 2005 +0000 + + _cairo_surface_show_glyphs may return UNSUPPORTED in which case a call to scaled_font->backend->show_glyphs is needed. + reviewed by: cworth + + ChangeLog | 8 ++++++++ + src/cairo-meta-surface.c | 17 +++++++++++++++++ + 2 files changed, 25 insertions(+) + +commit e4166936b9d2e1197efcdc378a6113a6c68a41ed +Author: Keith Packard +Date: Wed Aug 24 01:39:56 2005 +0000 + + Add device_x_scale and device_y_scale to surface so that the coordinate system seen by the backend can differ from the nominal device coordinate space used by the application. + Useful for printer backends where the device coordinate space should be in pixels while the user visible device space is in points. + There is no API to set these values; the backends using this functionality should do that themselves before the first cairo_t is created. + reviewed by: cworth + + ChangeLog | 27 ++++++++++++++++++++++++ + src/cairo-gstate-private.h | 4 ++-- + src/cairo-gstate.c | 51 ++++++++++++++++++++++++++++++++++++---------- + src/cairo-surface.c | 10 +++++---- + src/cairoint.h | 2 ++ + 5 files changed, 77 insertions(+), 17 deletions(-) + +commit 77a0ae7439bba5b442fc7c3bee5eb61ebfe24abb +Author: Carl Worth +Date: Wed Aug 24 01:13:36 2005 +0000 + + Fix cairo_show_text to advance the current point. Add documentation for cairo_show_text. + Add test to verify that the current-point-advancing behavior of cairo_show_text is working. + Remove bug about cairo_show_text not advancing the current point. + + BUGS | 4 --- + ChangeLog | 15 ++++++++ + src/cairo.c | 54 ++++++++++++++++++++++++---- + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/show-text-current-point-ref.png | Bin 0 -> 1606 bytes + test/show-text-current-point.c | 68 +++++++++++++++++++++++++++++++++++ + 7 files changed, 134 insertions(+), 11 deletions(-) + +commit 5ac2d216ab5322869cd2540c7cc2cda579eaf85e +Author: Carl Worth +Date: Wed Aug 24 00:19:52 2005 +0000 + + Update documentation for most path construction functions. Add discussion of the effects on the current point to all functions. Rephrase the wording of the relative functions. Big rewrite of cairo_arc description. Add discussion of join not caps to cairo_close_path. + + ChangeLog | 4 ++ + src/cairo.c | 130 +++++++++++++++++++++++++++++++++++++++++------------------- + 2 files changed, 93 insertions(+), 41 deletions(-) + +commit 4f44cd809db5c72638d14963870848eba9f266d1 +Author: Carl Worth +Date: Tue Aug 23 23:20:53 2005 +0000 + + Minor doc edit. + + ChangeLog | 4 ++++ + src/cairo.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit ef8b5b6a50667792a1cbdd5d338c8f0a154855ff +Author: Carl Worth +Date: Tue Aug 23 23:13:35 2005 +0000 + + Minor doc edits. + + ChangeLog | 4 ++++ + doc/public/tmpl/cairo-matrix.sgml | 6 +++--- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 4047fa507720c01a9ac0377de92ddc71ff2f359f +Author: Carl Worth +Date: Tue Aug 23 22:48:13 2005 +0000 + + Prefer cairo over Cairo when not at the beginning of a sentence. + + ChangeLog | 8 ++++++++ + doc/public/tmpl/cairo-matrix.sgml | 2 +- + doc/public/tmpl/cairo-status.sgml | 2 +- + doc/public/tmpl/cairo-types.sgml | 2 +- + doc/public/tmpl/cairo.sgml | 6 +++--- + 5 files changed, 14 insertions(+), 6 deletions(-) + +commit 0b616d20dd77aaa4549759a49d72dd1007290ebb +Author: Billy Biggs +Date: Tue Aug 23 21:36:08 2005 +0000 + + Add a long description. + Fix a typo. + Document the return value of cairo_scaled_font_reference(). + Document the width and height parameters of cairo_xlib_surface_set_drawable(). + + ChangeLog | 9 +++++++++ + doc/public/tmpl/cairo-image.sgml | 7 +++++-- + doc/public/tmpl/cairo.sgml | 2 +- + src/cairo-font.c | 2 ++ + src/cairo-xlib-surface.c | 2 ++ + 5 files changed, 19 insertions(+), 3 deletions(-) + +commit 86889a55de043b1357af39a2446b948068d54179 +Author: Billy Biggs +Date: Tue Aug 23 21:10:39 2005 +0000 + + Document the rest of the path functions (except the two text ones, which should coordinate with their corresponding non-path versions). + Minor shuffling. + + ChangeLog | 9 ++++ + doc/public/cairo-sections.txt | 18 ++++---- + doc/public/tmpl/cairo-paths.sgml | 87 ++++++++++++++++++++++--------------- + doc/public/tmpl/cairo-text.sgml | 19 --------- + src/cairo.c | 92 ++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 163 insertions(+), 62 deletions(-) + +commit 1e054fa3966341c08069d90daa0a430571539d3f +Author: Kristian Høgsberg +Date: Tue Aug 23 20:08:21 2005 +0000 + + More minor edits. + + AUTHORS | 2 +- + ChangeLog | 5 +++++ + README | 2 ++ + 3 files changed, 8 insertions(+), 1 deletion(-) + +commit ebb54333561b4b4e85660687f1188999435f1a7a +Author: Billy Biggs +Date: Tue Aug 23 19:54:11 2005 +0000 + + Minor edits. + + ChangeLog | 4 ++++ + README | 16 +++++++--------- + 2 files changed, 11 insertions(+), 9 deletions(-) + +commit 326911a749979104fbcd60e5af93f902257a5389 +Author: Billy Biggs +Date: Tue Aug 23 19:52:09 2005 +0000 + + Update the long description of cairo_matrix_t to match the current sources. + Add cairo_path_data_t. + Some documentation updates and improvements. + + ChangeLog | 11 +++++ + doc/public/tmpl/cairo-matrix.sgml | 30 +++++-------- + doc/public/tmpl/cairo-paths.sgml | 6 +++ + src/cairo-ft-font.c | 5 +-- + src/cairo-path-data.c | 4 +- + src/cairo-pattern.c | 4 +- + src/cairo.c | 89 ++++++++++++++++++++++++------------- + src/cairo.h | 92 ++++++++++++++++++++------------------- + 8 files changed, 139 insertions(+), 102 deletions(-) + +commit ee3e72e6a9e777aec5a0993352de1f8e77065989 +Author: Carl Worth +Date: Tue Aug 23 19:34:20 2005 +0000 + + Add suppression for uninitialized data in fbBltOne. + + ChangeLog | 5 +++++ + test/.valgrind-suppressions | 16 ++++++++++++++++ + 2 files changed, 21 insertions(+) + +commit 0b063224a6d72ea025720060abf0781d4df81757 +Author: Carl Worth +Date: Tue Aug 23 19:31:10 2005 +0000 + + Big update in preparation for 1.0. + + ChangeLog | 4 ++ + README | 149 ++++++++++++++++++++++++++++++++++++++++++++------------------ + 2 files changed, 110 insertions(+), 43 deletions(-) + +commit 83aae920630ec9be77fc80cb544c6272859f4460 +Author: Carl Worth +Date: Tue Aug 23 17:36:20 2005 +0000 + + Added several names to the AUTHORS file (since 2005-01-24): + Josh Aas Billy Biggs Damien Carbery Steve Chaplin Tomasz Cholewo John Ehresman Behdad Esfahbod Bertram Felgenhauer J. Ali Harlow Adrian Johnson Michael Johnson Øyvind KolÃ¥s Martin Kretzschmar Tor Lillqvist Luke-Jr Jeff Muizelaar Peter Nilsson Geoff Norton Robert O'Callahan Mike Owens Stuart Parmenter Tim Rowley Jason Dorje Short Travis Spencer Malcolm Tredinnick + + AUTHORS | 29 +++++++++++++++++++++++++++-- + ChangeLog | 34 +++++++++++++++++++++++++++++++--- + 2 files changed, 58 insertions(+), 5 deletions(-) + +commit b4d43d7fddd9d0843a97a8f321cafc646f59d76d +Author: Billy Biggs +Date: Tue Aug 23 16:31:59 2005 +0000 + + Experimental Quartz and XCB backends removed from the public doc for now. + + ChangeLog | 5 +++++ + doc/public/cairo-docs.xml | 6 ++++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit f5c16c2e4815306308de5c884d11ff9888229986 +Author: Owen Taylor +Date: Tue Aug 23 15:16:37 2005 +0000 + + Reverse the help text for --enable-xcb, + --enable-quartz. + + ChangeLog | 5 +++++ + configure.in | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit b8d610c56e77afe6e27514d8a1ce76bd9aaf8274 +Author: Owen Taylor +Date: Tue Aug 23 15:11:44 2005 +0000 + + Disable XCB and Quartz backends unless explicitely enabled. Add a big warning message if they are enabled about bugs and API instability. + + ChangeLog | 6 ++++++ + configure.in | 19 +++++++++++++++++-- + 2 files changed, 23 insertions(+), 2 deletions(-) + +commit 00af78735e02a0384ada84d57cd208f06bcaaadc +Author: Owen Taylor +Date: Tue Aug 23 14:53:08 2005 +0000 + + Rip out all the code for doing anything other than linear interpolation between color stops, instead of doing different funky things based on pattern->filter. (#4184) + + ChangeLog | 7 ++++++ + src/cairo-pattern.c | 66 +++-------------------------------------------------- + 2 files changed, 10 insertions(+), 63 deletions(-) + +commit 48b3a1cacd9d486c0e279ea8fadfb2fd4e3207a0 +Author: Owen Taylor +Date: Tue Aug 23 14:52:38 2005 +0000 + + Check for AlphaBlend() with GetProcAddress() to support older compilation environments like MSVC 6. (Also fixes this portion of the code to run on Win98 and Win95, but much of the rest of cairo-win32-* won't work in that environment) (#3926, Hans Breuer, Christian Biesinger, based on code originally from Mozilla) + Remove WINVER define, since it was there only for AlphaBlend(). + + src/cairo-win32-private.h | 6 ------ + 1 file changed, 6 deletions(-) + +commit c4c1c4db96549e4ffcbd0ee081661d54522860c9 +Author: Carl Worth +Date: Tue Aug 23 14:51:51 2005 +0000 + + Remove assert statements that violate two intentional instances of ref_count == 0. + + ChangeLog | 6 ++++++ + src/cairo-font.c | 8 ++++++-- + 2 files changed, 12 insertions(+), 2 deletions(-) + +commit 2dfb7a662f63642d63a91e39ea1828957fab0705 +Author: Carl Worth +Date: Tue Aug 23 14:37:09 2005 +0000 + + Fix memory leak of pattern. + + ChangeLog | 4 ++++ + test/text-pattern.c | 2 ++ + 2 files changed, 6 insertions(+) + +commit a96a4a7ce6c402ab96a9e06b453d9c2203fad7bb +Author: Owen Taylor +Date: Tue Aug 23 14:30:52 2005 +0000 + + Check for AlphaBlend() with GetProcAddress() to support older compilation environments like MSVC 6. (Also fixes this portion of the code to run on Win98 and Win95, but much of the rest of cairo-win32-* won't work in that environment) (#3926, Hans Breuer, Christian Biesinger, based on code originally from Mozilla) + Remove WINVER define, since it was (hopefully) there only for AlphaBlend(). + + ChangeLog | 13 ++++++ + src/cairo-win32-surface.c | 109 ++++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 105 insertions(+), 17 deletions(-) + +commit 6d8df3957dc0223b35b119788d9c0f460b06141a +Author: Owen Taylor +Date: Tue Aug 23 14:12:01 2005 +0000 + + Call _get_pattern_load_flags() on the resolved pattern, not the input pattern. (Further fix from sunmoon1997) + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit f219b83466f926ee48ba6abbf69ec723c9eba685 +Author: Carl Worth +Date: Tue Aug 23 14:04:28 2005 +0000 + + if users attempt to twice destroy or re-reference a destroyed object. The condition for detecting this case is a ref_count of 0. + Reviewed by: otaylor Fixes bug #4198 + + ChangeLog | 17 +++++++++++++++++ + src/cairo-font.c | 8 ++++++++ + src/cairo-pattern.c | 4 ++++ + src/cairo-surface.c | 4 ++++ + src/cairo.c | 4 ++++ + 5 files changed, 37 insertions(+) + +commit a0ecb16417a4c3f92b0a7682b84be702480748b4 +Author: Carl Worth +Date: Tue Aug 23 13:57:00 2005 +0000 + + Move CAIRO_CONTENT_VALID and CAIRO_FORMAT_VALID from the public cairo.h to the private cairoint.h where they belong. + + ChangeLog | 7 +++++++ + src/cairo.h | 9 --------- + src/cairoint.h | 9 +++++++++ + 3 files changed, 16 insertions(+), 9 deletions(-) + +commit f229b1abfb01d3c42cba1dec36a271fe75c503a9 +Author: Owen Taylor +Date: Tue Aug 23 13:34:14 2005 +0000 + + when creating the temporary mask, do glyph ADD mask, not (glyph IN source) ADD mask. Set the mask as having component alpha when it's 4-channel. + test/text-antialias-subpixel.c test/Makefile.am: No longer XFAIL. + test/text-antialias-gray.c test/text-antialias-subpixel.c + Don't turn off metrics hinting, it doesn't make sense. + Update. + + ChangeLog | 15 +++++++++++++++ + src/cairo-ft-font.c | 10 ++++++---- + test/Makefile.am | 1 - + test/text-antialias-gray-ref.png | Bin 723 -> 727 bytes + test/text-antialias-gray.c | 1 - + test/text-antialias-none-ref.png | Bin 277 -> 278 bytes + test/text-antialias-none.c | 1 - + test/text-antialias-subpixel-ref.png | Bin 1079 -> 1081 bytes + test/text-antialias-subpixel.c | 4 +--- + 9 files changed, 22 insertions(+), 10 deletions(-) + +commit c11f0376d4c4aec3ff1c849f333aad2ce56f06bd +Author: Carl Worth +Date: Tue Aug 23 12:48:17 2005 +0000 + + Revise the description of indentation and tabs to be clear (I hope). + + CODING_STYLE | 29 ++++++++++++++++++++++++----- + ChangeLog | 5 +++++ + 2 files changed, 29 insertions(+), 5 deletions(-) + +commit 317af5618c01d1be86308aebc0e87d7752a7e309 +Author: Carl Worth +Date: Tue Aug 23 10:55:00 2005 +0000 + + Fix inadvertent commit of incorrect reference image + + test/text-antialias-subpixel-ref.png | Bin 970 -> 1079 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 9aa1f4d868c7fdad6412205538697899fe760dca +Author: Carl Worth +Date: Tue Aug 23 10:39:27 2005 +0000 + + Clear to opaque white at the beginning of the test so that the 0 alpha values in the destination don't cause bizarre results. (main): Note that only the image backend should fail now. + Add new reference image. + + ChangeLog | 9 +++++++++ + test/Makefile.am | 1 + + test/text-antialias-subpixel-ref.png | Bin 0 -> 970 bytes + test/text-antialias-subpixel.c | 5 ++++- + 4 files changed, 14 insertions(+), 1 deletion(-) + +commit 9e68e0ceef2519b28e582fdaa8f2a8a33401735a +Author: Carl Worth +Date: Tue Aug 23 10:11:16 2005 +0000 + + Add more comments on the improved state of this bug. Commit a reference image generated with cairo_text_path; cairo_fill. (We may not require getting this exact result, but I think it is worth examining the differences closely.) + + ChangeLog | 9 +++++++++ + test/text-rotate-ref.png | Bin 0 -> 12446 bytes + test/text-rotate.c | 39 +++++++++++++++++++++++++++++++++++++-- + 3 files changed, 46 insertions(+), 2 deletions(-) + +commit 985c919b9fca504125df024e511eacf42a001985 +Author: Carl Worth +Date: Tue Aug 23 09:10:45 2005 +0000 + + Add docs-publish target to build and push documentation, (since our nightly server-side cron job is not working right now). + + ChangeLog | 6 ++++++ + Makefile.am | 15 +++++++++++++-- + 2 files changed, 19 insertions(+), 2 deletions(-) + +commit 0c2aa6e6abda77b67af91b32721b228097326d6d +Author: Carl Worth +Date: Tue Aug 23 08:21:46 2005 +0000 + + Move comment about missing cleanup of caches on XCloseDisplay from BUGS to a _cairo_xlib_close_display. Also covered in bug #4120. + + BUGS | 7 ------- + ChangeLog | 7 +++++++ + src/cairo-xlib-screen.c | 3 +++ + 3 files changed, 10 insertions(+), 7 deletions(-) + +commit 60f9c8d9fd914004e183adaf2bbba76b08c4e950 +Author: Carl Worth +Date: Tue Aug 23 07:51:56 2005 +0000 + + Remove caps-sub-paths from the XFAIL list since it is fixed now. + + ChangeLog | 6 ++++++ + test/Makefile.am | 1 - + test/caps-sub-paths.c | 3 +-- + 3 files changed, 7 insertions(+), 3 deletions(-) + +commit 256456b708292b200e49107e360bfb45b7eb5bf0 +Author: Carl Worth +Date: Tue Aug 23 07:44:14 2005 +0000 + + Fix for bug #4205: + Abstract the cap-addition code from the end of the stroke operation into a new _cairo_stroker_add_caps function. + Call the new _cairo_stroker_add_caps at the beginning of every move_to so that we get caps on every subpath and not just the last one. + + ChangeLog | 13 ++++++++++++ + src/cairo-path-stroke.c | 55 +++++++++++++++++++++++++++++++------------------ + 2 files changed, 48 insertions(+), 20 deletions(-) + +commit 55a517991e0d2435a58cab7fd61e272048eddbe8 +Author: Billy Biggs +Date: Tue Aug 23 05:54:38 2005 +0000 + + Add libpixman.la to the libcairo_la_DEPENDENCIES line so that changes to pixman get picked up. + + ChangeLog | 5 +++++ + src/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 099060f9254e972ae2d28f51815b75da01736a8f +Author: Owen Taylor +Date: Tue Aug 23 05:18:48 2005 +0000 + + Some fixes for warnings from sparse (Part of #4208, Kjartan Maraas) + Use NULL, not 0. + Fix C99'ism of mixed code and declarations. + + ChangeLog | 10 ++++++++++ + src/cairo-matrix.c | 13 +++++++------ + test/cairo-test.c | 2 +- + 3 files changed, 18 insertions(+), 7 deletions(-) + +commit 704874c16538f0653f37be253f2fc3d89963667d +Author: Carl Worth +Date: Tue Aug 23 01:55:29 2005 +0000 + + caps only added to last subpath: COVERED by test/caps-sub-paths and bug #4205. + + BUGS | 4 ---- + ChangeLog | 5 +++++ + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit eb206f0a12aac21807bfba5414ad0ed34a62fc37 +Author: Carl Worth +Date: Tue Aug 23 01:50:25 2005 +0000 + + Use the expect_failure variant of cairo_test so that make check prints the reason this test fails. + + ChangeLog | 5 +++++ + test/caps-sub-paths.c | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 4b0ed008ba51a4e2e9f62c360f6ae8dcb708817c +Author: Carl Worth +Date: Tue Aug 23 01:02:16 2005 +0000 + + Add test to demonstrate bug #4205, missing caps on all but last sub-path in a complex path. + + ChangeLog | 9 +++++++ + test/.cvsignore | 1 + + test/Makefile.am | 4 +++ + test/caps-sub-paths-ref.png | Bin 0 -> 164 bytes + test/caps-sub-paths.c | 63 ++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 77 insertions(+) + +commit 65bfc03e7284301fc1cea4b88de72f7928f3857a +Author: Carl Worth +Date: Tue Aug 23 00:03:09 2005 +0000 + + Remove discussion of the BAD_NESTING restriction from the documentation of cairo_create. No such restriction exists anymore. + + ChangeLog | 6 ++++++ + src/cairo.c | 10 ---------- + 2 files changed, 6 insertions(+), 10 deletions(-) + +commit c0bbf9ac08020cafdb7de4dae5099e9cf196802c +Author: Carl Worth +Date: Tue Aug 23 00:00:42 2005 +0000 + + Fix for bug #4192: + New function to handle both calling FT_Done_Face on unscaled->face and decrementing font_map->num_open_faces. + Call new _font_map_release_face_lock_held as approporiate. + Assert that (font_map->num_open_faces == 0) when we're done, to help guarantee the bug is fixed. + Don't call FT_Done_Face anymore, instead assert that (unscaled->face == NULL) by the time this function is called. + Prefer TRUE/FALSE as values for cairo_bool_t have_scale. + + ChangeLog | 26 ++++++++++++++++++++++++++ + src/cairo-ft-font.c | 50 ++++++++++++++++++++++++++++++++++++-------------- + 2 files changed, 62 insertions(+), 14 deletions(-) + +commit dc907490e35c26ebb7d1fd106963f754d389ad82 +Author: Billy Biggs +Date: Mon Aug 22 22:23:54 2005 +0000 + + Add version.xml to content_files so it will be copied to the right place for DESTDIR builds. + + ChangeLog | 5 +++++ + doc/public/Makefile.am | 1 + + 2 files changed, 6 insertions(+) + +commit a68097a219543160ea6ff12628626dcdb070f97e +Author: Billy Biggs +Date: Mon Aug 22 22:11:44 2005 +0000 + + Rework the index for the reference manual. + Update descriptions and add new files for added sections. + + ChangeLog | 33 ++ + doc/public/cairo-docs.xml | 50 +- + doc/public/cairo-sections.txt | 262 ++++++---- + doc/public/tmpl/cairo-font-options.sgml | 194 ++++++++ + doc/public/tmpl/cairo-font.sgml | 268 +--------- + doc/public/tmpl/cairo-ft.sgml | 18 +- + doc/public/tmpl/cairo-glitz.sgml | 4 +- + doc/public/tmpl/cairo-image.sgml | 73 +++ + doc/public/tmpl/cairo-matrix.sgml | 5 +- + doc/public/tmpl/cairo-paths.sgml | 207 ++++++++ + doc/public/tmpl/cairo-pattern.sgml | 92 ++-- + doc/public/tmpl/cairo-pdf.sgml | 4 +- + doc/public/tmpl/cairo-png.sgml | 26 +- + doc/public/tmpl/cairo-ps.sgml | 4 +- + doc/public/tmpl/cairo-quartz.sgml | 4 +- + doc/public/tmpl/cairo-scaled-font.sgml | 110 +++++ + doc/public/tmpl/cairo-status.sgml | 63 +++ + doc/public/tmpl/cairo-surface.sgml | 53 +- + doc/public/tmpl/cairo-text.sgml | 189 ++++++++ + doc/public/tmpl/cairo-transforms.sgml | 127 +++++ + doc/public/tmpl/cairo-types.sgml | 42 ++ + doc/public/tmpl/cairo-version.sgml | 54 +++ + doc/public/tmpl/cairo-win32-fonts.sgml | 57 +++ + doc/public/tmpl/cairo-win32.sgml | 40 +- + doc/public/tmpl/cairo-xcb-xrender.sgml | 4 +- + doc/public/tmpl/cairo-xcb.sgml | 4 +- + doc/public/tmpl/cairo-xlib.sgml | 4 +- + doc/public/tmpl/cairo.sgml | 833 ++++---------------------------- + 28 files changed, 1588 insertions(+), 1236 deletions(-) + +commit 2d9d744f8c8a9fdf011a292ef6e823605d000f23 +Author: Owen Taylor +Date: Mon Aug 22 20:43:23 2005 +0000 + + Make cairo_ft_unscaled_font_backend static. + Add missing static. + Use NULL, not 0. + Use void in the definition of void functions, not (). + Make non-exported cairo_pattern_nil_* static. + + ChangeLog | 17 +++++++++++++++++ + src/cairo-font.c | 6 +++--- + src/cairo-ft-font.c | 4 ++-- + src/cairo-gstate.c | 2 +- + src/cairo-pattern.c | 8 ++++---- + src/cairo-ps-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + 7 files changed, 29 insertions(+), 12 deletions(-) + +commit c792e6783c8424805b83c50a8c3fd9afa3ab8ed9 +Author: Carl Worth +Date: Mon Aug 22 17:20:29 2005 +0000 + + ref_counts will go negative: COVERED by https://bugs.freedesktop.org/show_bug.cgi?id=4198 + + BUGS | 6 ------ + ChangeLog | 5 +++++ + 2 files changed, 5 insertions(+), 6 deletions(-) + +commit 0fb5b1d4c44be43c9463fe8818aea1aed88facc5 +Author: Carl Worth +Date: Mon Aug 22 16:56:43 2005 +0000 + + Remove several entries in an effort to obsolete the BUGS file in favor of bugzilla and cairo/test. Specifically: + cairo_image_surface_create should clear image: NOTABUG. The user can clear if desired, and cairo clearing unconditionally would be performance overhead). + cairo_clip is really slow: FIXED/COVERED. Since the time this entry was added we've got rectangular, pixel-alignend clipping optimized. And there's a bug in bugzilla (https://bugs.freedesktop.org/show_bug.cgi?id=4191) for optimizing IN. + self-intersecting path is wrong: COVERED by test/self-intersecting.c. + Cairo is crashing Xnest: NEEDINFO. Is this still happening? Xfake has been working quite well for a very long time now. + font-size=0 in SVG does bad things: FIXED. + + BUGS | 37 ------------------------------------- + ChangeLog | 23 +++++++++++++++++++++++ + 2 files changed, 23 insertions(+), 37 deletions(-) + +commit 23baafbaa8d3295f109030637b5e73102e48ea8a +Author: Bertram Felgenhauer +Date: Mon Aug 22 16:52:40 2005 +0000 + + remove. + + ChangeLog | 5 +++++ + src/cairo-matrix.c | 31 ------------------------------- + src/cairoint.h | 4 ---- + 3 files changed, 5 insertions(+), 35 deletions(-) + +commit 988310429036dd94ee0bb75b4c6a2fb7c930d448 +Author: Bertram Felgenhauer +Date: Mon Aug 22 16:50:30 2005 +0000 + + correct the calculation of the error bound. + + ChangeLog | 5 +++++ + src/cairo-arc.c | 20 ++++++-------------- + 2 files changed, 11 insertions(+), 14 deletions(-) + +commit c0905759b059cf679674019c5c4dd09971bedab9 +Author: Bertram Felgenhauer +Date: Mon Aug 22 16:48:28 2005 +0000 + + use new function. strip comment of derivation for major axis length. + use _cairo_matrix_get_affine to retrieve matrix entries. + new function split out of cairo-pen.c. UTF8-ify the comment that explains the calculation. + + ChangeLog | 12 +++++ + src/cairo-matrix.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-pen.c | 154 ++++------------------------------------------------- + src/cairoint.h | 3 ++ + 4 files changed, 170 insertions(+), 144 deletions(-) + +commit c7a35fbd3121f728ff40706cdf2a1ef8ac8e18a6 +Author: Bertram Felgenhauer +Date: Mon Aug 22 16:29:56 2005 +0000 + + use correctly transposed version of the matrix and fix up the comments above to use row vector notation. + + ChangeLog | 6 ++++++ + src/cairo-pen.c | 26 ++++++++++++++------------ + 2 files changed, 20 insertions(+), 12 deletions(-) + +commit 46dd21e795549481d9db8d90c399e683ef1205c7 +Author: Tor Lillqvist +Date: Mon Aug 22 15:49:04 2005 +0000 + + Calculate LT_CURRENT_MINUS_AGE (which forms part of the DLL name on Win32), and AC_SUBST it. + Add target "zips" to create zip file based distribution for Win32. + Produce a cairo.def file for distribution by preprocessing the relevant header files and grepping for declarations of functions that start with cairo_. Works for now, will have to modify later if necessary. Use the .def file when linking on Win32. + + ChangeLog | 14 ++++++++++++++ + Makefile.am | 16 ++++++++++++++++ + configure.in | 4 ++++ + src/Makefile.am | 36 +++++++++++++++++++++++++++++++++++- + 4 files changed, 69 insertions(+), 1 deletion(-) + +commit aa6b2c386be0e7a09f53da3fa08c061f01151e55 +Author: Owen Taylor +Date: Mon Aug 22 15:19:03 2005 +0000 + + Support artificial bold fonts with FC_EMBOLDEN; patch from Jackey Yang and sunmoon1997. + Check for FT_GlyphSlot_Embolden() + Call FT_GlyphSlot_Embolden for fonts where FC_EMBOLDEN is set but that aren't bold. Add another private flag for this. + + ChangeLog | 11 +++++++++++ + configure.in | 1 + + src/cairo-ft-font.c | 36 +++++++++++++++++++++++++++++++++++- + 3 files changed, 47 insertions(+), 1 deletion(-) + +commit 190dc79a2831ca86523f2e710e6b4152d0947694 +Author: Carl Worth +Date: Mon Aug 22 13:59:52 2005 +0000 + + Fix typo that was causing make dist to fail. + + ChangeLog | 5 +++++ + test/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 2ea856a21d2d392c0959e726c430e7fed87be97c +Author: Owen Taylor +Date: Mon Aug 22 12:15:28 2005 +0000 + + When width/height are 0, copy the src to the dest, don't just return. (#3017) + + pixman/ChangeLog | 5 +++++ + pixman/src/pixregion.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 31e4ade4abf716718c2f38e594f02b5b488e0d86 +Author: Owen Taylor +Date: Mon Aug 22 08:45:46 2005 +0000 + + Use floor(0.5+x) rather than round(), which is C99. (David Hollenberg) + + ChangeLog | 5 +++++ + test/text-rotate.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit b217f95fa0b8b818cbed8630c16fe8725f430c49 +Author: Owen Taylor +Date: Mon Aug 22 08:33:54 2005 +0000 + + Set LC_ALL=C rather than LANG and LC_NUMERIC to be robust against whatever settings the user has. (Martin Dobias) + + ChangeLog | 5 +++++ + autogen.sh | 7 ++++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit fdb5e2aa473a83cda9a3ecfab2fa47cdf40ffe65 +Author: Billy Biggs +Date: Sun Aug 21 21:04:52 2005 +0000 + + Optimize away calls to cairo_paint_with_alpha() if the alpha value given is <= 0. + Add a new macro CAIRO_ALPHA_IS_ZERO. + + ChangeLog | 7 +++++++ + src/cairo.c | 4 ++++ + src/cairoint.h | 1 + + 3 files changed, 12 insertions(+) + +commit 89a4e13d73e3761e8b8b5d5fa0882d4ecb6423b1 +Author: Billy Biggs +Date: Sun Aug 21 21:02:32 2005 +0000 + + Fix a typo in the last change. + + pixman/ChangeLog | 4 ++++ + pixman/src/pixman-remap.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 16ce285251afa9c6e125a51df0d8a487c0bf5bbd +Author: Billy Biggs +Date: Sun Aug 21 20:49:47 2005 +0000 + + Remove warning about fbCompositeTrans_0888xnx0888 not being tested on big-endian, it's not helpful at this point. + Only define _cairo_pixman_have_mmx for fbHaveMMX when the symbol will actually exist. + + pixman/ChangeLog | 8 ++++++++ + pixman/src/fbpict.c | 23 +++++++++++------------ + pixman/src/pixman-remap.h | 2 ++ + 3 files changed, 21 insertions(+), 12 deletions(-) + +commit 33599bc6b64ed987c1894e88bc680028f28453a7 +Author: Billy Biggs +Date: Sun Aug 21 14:10:39 2005 +0000 + + Fix for bug #4172: + Use _cairo_fixed_to_double and _cairo_double_to_fixed when converting between double and 16.16 fixed point. These functions round nicely, and solve some inconsistencies in rendering between my PPC and x86 machines. Thanks to Owen Taylor for suggesting the fix. + The above change does affect linear gradients slightly, but it seems worth it. Update the reference images to follow. + + ChangeLog | 17 +++++++++++++++++ + src/cairo-pattern.c | 8 ++++---- + test/gradient-alpha-ref.png | Bin 153 -> 154 bytes + test/linear-gradient-ref.png | Bin 12744 -> 12719 bytes + test/text-pattern-ref.png | Bin 2728 -> 2731 bytes + 5 files changed, 21 insertions(+), 4 deletions(-) + +commit e3e7046cd7ee629fe085cf081fd3aa2581782bf5 +Author: Owen Taylor +Date: Sun Aug 21 12:13:17 2005 +0000 + + Remove stray doc sentence that wasn't meant to be committed. + + ChangeLog | 5 +++++ + src/cairo-surface.c | 6 ------ + 2 files changed, 5 insertions(+), 6 deletions(-) + +commit 17845df95b80d2a9586ba44fc5ade2c311a62c4c +Author: Billy Biggs +Date: Sun Aug 21 11:41:44 2005 +0000 + + Fix for bug #4165: + Use pointer comparison for coincident points to ensure a well-defined ordering, and avoid setting discard on both points. This fixes problems with my Mac's implementation of qsort. Final patch by Bertram Felgenhauer. + Update reference images after the change. + + ChangeLog | 18 ++++++++++++++++++ + src/cairo-hull.c | 7 ++++++- + test/clip-operator-ref.png | Bin 37330 -> 37330 bytes + test/linear-gradient-ref.png | Bin 12724 -> 12744 bytes + test/operator-clear-ref.png | Bin 4992 -> 4988 bytes + test/operator-source-ref.png | Bin 19957 -> 19958 bytes + test/unantialiased-shapes-ref.png | Bin 4450 -> 4449 bytes + test/unbounded-operator-ref.png | Bin 11937 -> 11929 bytes + 8 files changed, 24 insertions(+), 1 deletion(-) + +commit d93d56caeffb80ac92a0432ad1ebdecee5c0e2b6 +Author: Owen Taylor +Date: Sun Aug 21 11:23:58 2005 +0000 + + Check automake- if automake isn't sufficiently new. (#3593, Philip Van Hoof) + + ChangeLog | 5 +++++ + autogen.sh | 29 +++++++++++++++++++++++++++-- + 2 files changed, 32 insertions(+), 2 deletions(-) + +commit 2396b502a5de39ee44d53af971b7382a1f130a87 +Author: Owen Taylor +Date: Sun Aug 21 09:57:19 2005 +0000 + + When invoked as, say, ../autogen.sh, switch to the sourcedir to run the auto*. Based on corresponding code in GTK+'s autogen.sh. (#3402, Thomas Fitzsimmons) + Update from gtk-doc CVS, bringing in some minor output changes. (Eliminate the *** from the messages that don't indicate errors.) + Use += for EXTRA_DIST, since gtk-doc.make already defines it. + + ChangeLog | 13 +++++++++++++ + autogen.sh | 13 ++++++++++++- + doc/public/Makefile.am | 5 +++-- + gtk-doc.make | 12 ++++++------ + 4 files changed, 34 insertions(+), 9 deletions(-) + +commit 5462c8a5856f1b3b81889ac3a714e47b047e1984 +Author: Owen Taylor +Date: Sun Aug 21 09:27:52 2005 +0000 + + Check for FT_Load_Sfnt_Table and disable the PDF/PS backends if not found. (#4144, Billy Biggs) + + ChangeLog | 5 +++++ + configure.in | 13 +++++++++---- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit 1ce62becd11bbc929b75ea6d47fad477ad965962 +Author: Owen Taylor +Date: Sun Aug 21 08:53:56 2005 +0000 + + Fix the handling of backend->clone_similar == NULL. (#4161, Christian Biesinger) + + ChangeLog | 6 ++++++ + src/cairo-surface.c | 11 ++++++----- + src/cairoint.h | 2 +- + 3 files changed, 13 insertions(+), 6 deletions(-) + +commit 8e9e40d75201ea4d21b53ab51d1326f6f858c57c +Author: Owen Taylor +Date: Sun Aug 21 08:24:41 2005 +0000 + + Improve the documentation of internal functions. (Based on a patch from Christian Biesinger, #4162) + + ChangeLog | 5 +++++ + src/cairo-surface.c | 24 ++++++++++++++++-------- + 2 files changed, 21 insertions(+), 8 deletions(-) + +commit 65f90287bb922357e77b759b5e0db5d2c3698fc4 +Author: Owen Taylor +Date: Sun Aug 21 08:11:24 2005 +0000 + + Recognize gentoo's (and maybe other distro's) modified server vendor string, where extra text is added to the upstream value. (#4068, reported by Doug Goldstein, others. Patch from Mart Raudsepp) + + ChangeLog | 8 ++++++++ + src/cairo-xlib-surface.c | 4 ++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit af614d2de601c997f3a2cbae535fb0e96110a386 +Author: Owen Taylor +Date: Sun Aug 21 08:06:06 2005 +0000 + + Don't try to transform val->image when it is NULL. (#4163, Mathias Hasselmann) + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 3 ++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit f823dfd9328f1aab0155257fcf9bb3aa45455867 +Author: Billy Biggs +Date: Sat Aug 20 21:28:57 2005 +0000 + + Fix for bug #4140: + Dereference the pixel value correctly on big endian systems. + + pixman/ChangeLog | 7 +++++++ + pixman/src/icrect.c | 3 ++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit d1bdd1313ee351e2ec7e4af1cf68143827f59694 +Author: Carl Worth +Date: Sat Aug 20 07:56:05 2005 +0000 + + Fix for bug #4142: + Disable xlib tests on X servers without the Render, since they currently just crash there. A better long-term fix would be to do some useful tests in this case. Thanks to Tim Mooney. + + ChangeLog | 9 +++++++++ + test/cairo-test.c | 12 ++++++++++++ + 2 files changed, 21 insertions(+) + +commit 4a7a09b4ab4e8608d2f23661ddaf301f4508d42a +Author: Owen Taylor +Date: Sat Aug 20 05:23:52 2005 +0000 + + Include Xfree86-4.5 in the blacklist. (Reported by Andrew Benton) + + ChangeLog | 6 ++++++ + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit b9da101879afc6ab960e43f94d1e0a2fc10b3aac +Author: Billy Biggs +Date: Fri Aug 19 23:05:13 2005 +0000 + + Fix for bug #4096: + Improve the performance of png reading by adding special cases for fully transparent and fully opaque alpha, and using the standard optimization for 8-bit division by 255. + Add an INLINE macro for gcc. + + ChangeLog | 11 +++++++++++ + src/cairo-png.c | 28 +++++++++++++++++++++------- + src/cairoint.h | 6 ++++++ + 3 files changed, 38 insertions(+), 7 deletions(-) + +commit 465ff187869b118f30666de83e5327ea4d174df7 +Author: Carl Worth +Date: Fri Aug 19 16:37:56 2005 +0000 + + From Bertram Felgenhauer : + Add regression test for bug #4137 (fixed earlier). + + ChangeLog | 10 +++++ + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/rectangle-rounding-error-ref.png | Bin 0 -> 298 bytes + test/rectangle-rounding-error.c | 69 ++++++++++++++++++++++++++++++++++ + 5 files changed, 83 insertions(+) + +commit 33b45c157273fbe8f8a24e5c0a333639b1a51f4a +Author: Billy Biggs +Date: Fri Aug 19 14:42:57 2005 +0000 + + No need to include cairo-pdf.h. + + ChangeLog | 4 ++++ + test/pixman-rotate.c | 1 - + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 3ec312f7289192cca3ce71d8bafee27f49cf2aa2 +Author: Carl Worth +Date: Fri Aug 19 14:37:42 2005 +0000 + + Fix for bug #4137: + Fix to round properly. + + ChangeLog | 7 +++++++ + src/cairo-fixed.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 1f68f77a10e0d93e2a73000faa1bb0097c8b056a +Author: Owen Taylor +Date: Fri Aug 19 14:05:14 2005 +0000 + + Ignore really small fonts, since size zero fonts give xpdf fits. (#2938) + + ChangeLog | 6 ++++++ + src/cairo-pdf-surface.c | 8 ++++++++ + 2 files changed, 14 insertions(+) + +commit 9d0211b2632e3a0c83331a037efd7670c91b79cd +Author: Carl Worth +Date: Fri Aug 19 13:00:23 2005 +0000 + + Fix to actually test scaled_font->status instead of just having a comment that claims to test it. Thanks to Behdad Esfahbod . + + ChangeLog | 7 +++++++ + src/cairo-font.c | 3 ++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 8eb912577b51c9feb7c078620b42f8fa858e02b0 +Author: Owen Taylor +Date: Fri Aug 19 12:55:00 2005 +0000 + + We need the call to fixup_unbounded when we optimize the RENDER operator to XCopyArea as well. + + ChangeLog | 6 ++++++ + src/cairo-xlib-surface.c | 23 ++++++++++++----------- + 2 files changed, 18 insertions(+), 11 deletions(-) + +commit 7468ed35a1c2607bd305caa93c5f9bf9c9e0be18 +Author: Carl Worth +Date: Fri Aug 19 12:08:42 2005 +0000 + + Fixes for a general problem of which bug #4094 was a specific instance: + Don't change the status value if it already holds an error. This avoids destroying "first error" information and also avoids attempting to write read-only data, (eg. from nil objects). + Don't set an error on the same object if it is in an error state to begin with, just return immediately. This is intended to reduce (eventual) error prints to the first cause of an error for any given object, instead of a continual spew. + + ChangeLog | 51 ++++++++++ + src/cairo-font.c | 11 +- + src/cairo-pattern.c | 10 +- + src/cairo-surface.c | 18 ++-- + src/cairo-win32-font.c | 4 +- + src/cairo.c | 267 +++++++++++++------------------------------------ + 6 files changed, 142 insertions(+), 219 deletions(-) + +commit 2b72a4eee80e73f0553779a281e6ef5f0587519e +Author: Carl Worth +Date: Fri Aug 19 12:02:14 2005 +0000 + + Fix for bug #2729: + Adjust negative offsets up to their equivalent positive value. Add error checking for dash values, (must each be non-negative and must not be all zero). + Add documentation. + Add new CAIRO_STATUS_INVALID_DASH. + Add dash-offfset-negative test from Owen. + churn + + ChangeLog | 20 ++++++++ + doc/public/tmpl/cairo.sgml | 5 +- + src/cairo-gstate.c | 45 +++++++++++++---- + src/cairo.c | 35 ++++++++++++-- + src/cairo.h | 9 +++- + test/.cvsignore | 1 + + test/Makefile.am | 4 ++ + test/dash-offset-negative-ref.png | Bin 0 -> 155 bytes + test/dash-offset-negative.c | 99 ++++++++++++++++++++++++++++++++++++++ + 9 files changed, 203 insertions(+), 15 deletions(-) + +commit a2e798b5a126a0aaf7043b817120986889538acf +Author: Kristian Høgsberg +Date: Fri Aug 19 10:36:43 2005 +0000 + + Add this missing fuction. + Document this funtion. + + ChangeLog | 8 ++++++++ + src/cairo-pdf-surface.c | 10 ++++++++++ + src/cairo-ps-surface.c | 21 +++++++++++++++++++++ + 3 files changed, 39 insertions(+) + +commit b626dff5b9783ba8916365478c583551d7d97a23 +Author: Carl Worth +Date: Fri Aug 19 07:39:47 2005 +0000 + + Fix for bug #3915: + Add new NULL_POINTER nil pattern. + Check for surface == NULL and return a nil pattern. + Verify that the above fix works. + + ChangeLog | 12 ++++++++++++ + src/cairo-pattern.c | 14 ++++++++++++++ + test/nil-surface.c | 40 ++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 64 insertions(+), 2 deletions(-) + +commit 435fb3c65f3edd7687a332f274545abf7e601965 +Author: Carl Worth +Date: Thu Aug 18 23:10:37 2005 +0000 + + Fix for bug #4088: + New function to return the current nil pattern depending on the status. + Add missing early bailout on surface->status with error propagation to the pattern. + Related cleanups for cairo_pattern_t: + Don't check other->status since this is a static function. + Add missing early bailout on other->status. + Cleanup identifier names. + Track rename of nil patterns. + Don't call _cairo_error for pre-existing errors. + Take care to initialize some fields to that _cairo_pattern_release_surface will work even after an error. + Track rename of cairo_solid_pattern_nil to cairo_pattern_nil. + New test to ensure that a file-not-found error will propagate from a surface, through a pattern, and onto a cairo_t. + + ChangeLog | 48 ++++++++++++++++++++ + src/cairo-pattern.c | 113 ++++++++++++++++++++++++----------------------- + src/cairo.c | 2 +- + src/cairoint.h | 2 +- + test/.cvsignore | 1 + + test/Makefile.am | 2 + + test/nil-surface-ref.png | Bin 0 -> 107 bytes + test/nil-surface.c | 73 ++++++++++++++++++++++++++++++ + 8 files changed, 184 insertions(+), 57 deletions(-) + +commit 0e56f2ea0acb1f5359294b5da5f60b05673d75e3 +Author: Carl Worth +Date: Thu Aug 18 22:43:39 2005 +0000 + + Suppress a pthread initialization error now that tests are linked with -lpthread. + + ChangeLog | 5 +++++ + test/.valgrind-suppressions | 11 +++++++++++ + 2 files changed, 16 insertions(+) + +commit 45cea5efc8b16a9645e72b722353cc27a009af13 +Author: Carl Worth +Date: Thu Aug 18 22:31:04 2005 +0000 + + Fix documentation comment to use & in place of &. + + ChangeLog | 5 +++++ + src/cairo-pattern.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit d809e829806c68b87939e6598986d45cbd3862b9 +Author: Billy Biggs +Date: Thu Aug 18 19:13:06 2005 +0000 + + Special case alpha values of 0 and 0xff. (fbCompositeSrc_8888x8888mmx): Add an MMX implementation for a common operation when using pixman. + Prototype for the new function. + Call the new function where appropriate. + + pixman/ChangeLog | 12 ++++++++ + pixman/src/fbmmx.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++------ + pixman/src/fbmmx.h | 12 ++++++++ + pixman/src/fbpict.c | 16 +++++++++-- + 4 files changed, 108 insertions(+), 12 deletions(-) + +commit f5afeec18a95b75102087abbf7497a45ff6d80c6 +Author: Billy Biggs +Date: Thu Aug 18 18:46:30 2005 +0000 + + Special case projective transforms so we can avoid doing the expensive 64-bit math. Unroll the bilinear interpolation loops for an extra boost. + + pixman/ChangeLog | 6 ++ + pixman/src/fbcompose.c | 235 +++++++++++++++++++++++++++++++++---------------- + 2 files changed, 163 insertions(+), 78 deletions(-) + +commit 5932a501ca5d8b3e4e60c77dac9a8af2c7943dd7 +Author: Owen Taylor +Date: Thu Aug 18 17:22:23 2005 +0000 + + Fix tests to just disable FreeType if a too-old FreeType is found, rather than erroring out. (#2298) + Reviewed by: krh + + ChangeLog | 7 +++++++ + configure.in | 38 ++++++++++++++++++++++---------------- + 2 files changed, 29 insertions(+), 16 deletions(-) + +commit c1b5a19624a850885996a6e0778098e77c0fd683 +Author: Owen Taylor +Date: Thu Aug 18 17:19:54 2005 +0000 + + Fix offset passed in for source patterns. (#2333, Tim Rowley) + Fix font to Vera Sans rather than "Sans" + + ChangeLog | 7 +++++++ + src/cairo-xlib-surface.c | 18 +++++++++--------- + test/.cvsignore | 1 + + test/text-pattern-ref.png | Bin 2869 -> 2728 bytes + test/text-pattern.c | 9 ++++++--- + 5 files changed, 23 insertions(+), 12 deletions(-) + +commit 8f93bcfa47fbdfd20949d09ed677eb5e4d90b12b +Author: Carl Worth +Date: Thu Aug 18 17:11:42 2005 +0000 + + Update the roadmap. Remove difficulty rating from completed tasks. Note that PostScript/PDF is (grudgingly) done as far as 1.0 is concerned, but there is more work to completing this that is slipped beyond 1.0. Note that the deadlock bug is fixed as of 0.9.2. Update who is working on what for performance. Add some new detail for post-1.0 PostScript/PDF work. Slip the overlapping source/dest Render workaround past 1.0. + + ChangeLog | 10 +++++++++ + ROADMAP | 73 ++++++++++++++++++++++++++++++++++++++++++++------------------- + 2 files changed, 61 insertions(+), 22 deletions(-) + +commit 16f66dc31499afbf64e319562f01aac96edae52e +Author: Owen Taylor +Date: Thu Aug 18 16:22:23 2005 +0000 + + Add a test for bug #2333 (Tim Rowley) + + ChangeLog | 4 +++ + test/Makefile.am | 3 ++ + test/text-pattern-ref.png | Bin 0 -> 2869 bytes + test/text-pattern.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 81 insertions(+) + +commit 31341327bfa171845ec3e921151cee6f861c2da8 +Author: Owen Taylor +Date: Thu Aug 18 15:50:36 2005 +0000 + + Implement new equations for CLEAR and SOURCE CLEAR: (mask IN clip) ? 0 : dest SOURCE: (mask IN clip) ? src : dest That behave more like what people expect. + CLEAR and SOURCE are now bounded. + Assert that SOURCE and CLEAR aren't passed to these functions. + Assert that SOURCE and CLEAR aren't passed to these functions when there is a mask. + Do fixups for SOURCE and CLEAR as well as unbounded operators, since in the absence of a mask, we need SOURCE to work correctly (don't care about CLEAR) + _cairo_ft_font_show_glyphs) Consistently use CLEAR/TRANSPARENT (source doesn't matter) rather than SOURCE/TRANSPARENT when clearing rectangles. + src/cairo-xlib-surface.c src/cairo-surface.c: Use IN rather than SOURCE as an example of an unbounded operator in docs. + Remove CLEAR/SOURCE columns since they are no longer unbounded. + test/operator-clear.c test/operator-source Makefile.am: Add targetted tests of CLEAR/SOURCE. + + ChangeLog | 38 ++++++ + src/cairo-font.c | 5 + + src/cairo-ft-font.c | 4 +- + src/cairo-gstate.c | 219 +++++++++++++++++++++++++--------- + src/cairo-image-surface.c | 4 +- + src/cairo-surface.c | 14 ++- + src/cairo-xlib-surface.c | 6 +- + test/.cvsignore | 2 + + test/Makefile.am | 6 + + test/clip-operator-ref.png | Bin 38336 -> 37330 bytes + test/operator-clear-ref.png | Bin 0 -> 4992 bytes + test/operator-clear.c | 214 +++++++++++++++++++++++++++++++++ + test/operator-source-ref.png | Bin 0 -> 19957 bytes + test/operator-source.c | 253 ++++++++++++++++++++++++++++++++++++++++ + test/unbounded-operator-ref.png | Bin 14178 -> 11937 bytes + test/unbounded-operator.c | 4 +- + 16 files changed, 706 insertions(+), 63 deletions(-) + +commit ff9654e677a916da7a3fcc97ac0547f128e71436 +Author: Carl Worth +Date: Thu Aug 18 14:34:10 2005 +0000 + + Fix to not leak surface->cgImage on out-of-memory (thanks to Josh Aas ). + + ChangeLog | 7 +++++++ + src/cairo-quartz-surface.c | 4 ++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit a82cf0eb7bdfb7f500c1652f6b9635a94e830289 +Author: Carl Worth +Date: Thu Aug 18 09:46:20 2005 +0000 + + Fix to not right-shift a negative number when called with an argument of 0. + + ChangeLog | 5 +++++ + src/cairo-fixed.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 7a9d2070402d75356ffee258517c5434dc232000 +Author: Carl Worth +Date: Thu Aug 18 09:19:21 2005 +0000 + + Disable not-yet-implemented quartz stuff. + + ChangeLog | 5 +++++ + test/cairo-test.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 93e521ce1976cef6978fcbccf78b3ed98a544d51 +Author: Billy Biggs +Date: Thu Aug 18 08:28:08 2005 +0000 + + Add an autoconf-generated version file to advertise what cairo version the manual was generated for. Idea taken from the GTK+ documentation. + Include the version number, along with the title, in a bookinfo section. + Add the version.xml.in to the dist. + Ignore version.xml. + Generate doc/public/version.xml. + + ChangeLog | 15 +++++++++++++++ + configure.in | 1 + + doc/public/.cvsignore | 4 +--- + doc/public/Makefile.am | 3 +++ + doc/public/cairo-docs.xml | 8 +++++++- + doc/public/version.xml.in | 1 + + 6 files changed, 28 insertions(+), 4 deletions(-) + +commit 3422d8760f54e403bda12aa58dc5256bb132ebf3 +Author: Carl Worth +Date: Thu Aug 18 08:22:29 2005 +0000 + + Clear setgid bit on regular files prior to tarring up a release. + + ChangeLog | 5 +++++ + Makefile.am | 19 +++++++++++++------ + 2 files changed, 18 insertions(+), 6 deletions(-) + +commit 24ba58e7f56a45f09501c9f58d177633dfda1ecd +Author: Billy Biggs +Date: Thu Aug 18 06:01:40 2005 +0000 + + For the source operator, the output should be cleared if the mask is zero. This fixes the MMX code to match the fbcompose code. + Fix a logic mistake that caused the MMX functions not to be used in many cases. + + pixman/ChangeLog | 9 +++++++++ + pixman/src/fbmmx.c | 12 ++++++++++++ + pixman/src/fbpict.c | 7 +++---- + 3 files changed, 24 insertions(+), 4 deletions(-) + +commit 260e8abfe0903b3b2955e2397e974308a1ca40bd +Author: Kristian Høgsberg +Date: Wed Aug 17 21:19:30 2005 +0000 + + Fix typo in freetype configure check. + + ChangeLog | 4 ++++ + configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 4ebe0b63cc5487661c8016ef9f80aa7890772517 +Author: Billy Biggs +Date: Wed Aug 17 21:14:02 2005 +0000 + + Only mangle exported symbols. This is sufficient and makes debugging a lot easier. + + pixman/ChangeLog | 5 + + pixman/src/pixman-remap.h | 274 +++------------------------------------------- + 2 files changed, 19 insertions(+), 260 deletions(-) + +commit 75b0541bdfb77ef456e09b1b92ccb0d2e9245ae3 +Author: Kristian Høgsberg +Date: Wed Aug 17 15:57:45 2005 +0000 + + Try to use pkg-config to detect freetype2, then fall back to the existing freetype-config based check. + + ChangeLog | 5 +++++ + cairo.pc.in | 4 ++-- + configure.in | 56 +++++++++++++++++++++++++++++++++++++------------------- + 3 files changed, 44 insertions(+), 21 deletions(-) + +commit 639680e5fe2592c76d19e8102919ef3062371883 +Author: Carl Worth +Date: Wed Aug 17 09:51:09 2005 +0000 + + Fixes for bug #4110: + Don't call _cairo_ft_unscaled_font_init_key in the from_face case, just clear filename and id instead. Initialize unscaled->base first so that initialization order matches the structure declaration order. + Fix to accept a NULL string and hash it identically to a zero-length string. + Add a test that calls cairo_ft_font_create_for_ft_face to demonstrate bug #4110. + + ChangeLog | 18 ++++++- + src/cairo-cache.c | 2 +- + src/cairo-ft-font.c | 28 +++++------ + test/.cvsignore | 1 + + test/Makefile.am | 5 ++ + test/ft-font-create-for-ft-face.c | 102 ++++++++++++++++++++++++++++++++++++++ + 6 files changed, 140 insertions(+), 16 deletions(-) + +commit f5f21a768d71f2a6897b5290f74fd41116c43966 +Author: Billy Biggs +Date: Tue Aug 16 21:04:02 2005 +0000 + + Fix the filter-nearest-offset test to actually test CAIRO_FILTER_NEAREST. + + ChangeLog | 5 +++++ + test/filter-nearest-offset.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit c892ee36d94532a395dc11d4d954611ce4f353c7 +Author: Billy Biggs +Date: Tue Aug 16 19:54:05 2005 +0000 + + Fix a typo in the last commit. + + pixman/ChangeLog | 4 ++++ + pixman/src/Makefile.am | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 0398085a6fb2e7bddba6529e7a205781347759d1 +Author: Billy Biggs +Date: Tue Aug 16 18:38:38 2005 +0000 + + Split the MMX code into a separate libtool library to avoid applying the MMX CFLAGS to all of the pixman code. Idea and code from Owen Taylor. + Update the mangling header file to include the MMX symbols. + + pixman/ChangeLog | 9 +++++++++ + pixman/src/Makefile.am | 7 +++++-- + pixman/src/pixman-remap.h | 21 +++++++++++++++++++++ + 3 files changed, 35 insertions(+), 2 deletions(-) + +commit 18f3357c99fdecb3eede41f24fbd086ab4700677 +Author: Owen Taylor +Date: Tue Aug 16 18:22:16 2005 +0000 + + src/cairoint.h: Split out a couple of useful utility functions. + src/cairo-clip.c src/cairo-gstate.c: Use them. + Move code to fill a pixman_region16_t to here. + Document. + Use _cairo_surface_fill_region(). + Add a return status, use regions to simplify. + src/cairoint.h + Handle the return value from _cairo_surface_composite_fixup_unbounded(). + src/cairo-surface.c src/cairoint.h (_cairo_surface_composite_shape_fixup_unbounded): Add a variant of _cairo_surface_composite_fixup_unbounded() to avoid creating a dummy cairo_surface_attributes_t. + Use _cairo_surface_composite_shape_fixup_unbounded(). + Call _cairo_surface_composite_shape_fixup_unbounded(), since the source might still be restricted, even though the mask is unbounded. + Restore the rectangle optizations when drawing with unbounded operators by adding a clear for the extra area after drawing the rectangles. + + ChangeLog | 44 +++++++ + src/Makefile.am | 1 + + src/cairo-clip.c | 47 ++----- + src/cairo-gstate.c | 144 ++++++++++----------- + src/cairo-image-surface.c | 90 +++++++------ + src/cairo-region.c | 83 ++++++++++++ + src/cairo-surface.c | 322 ++++++++++++++++++++++++++++++++-------------- + src/cairo-xlib-surface.c | 84 ++++++------ + src/cairoint.h | 50 +++++-- + 9 files changed, 565 insertions(+), 300 deletions(-) + +commit ae15c7d32166b6408ee7e1dc8a817a4c510ae3c3 +Author: Billy Biggs +Date: Tue Aug 16 16:52:35 2005 +0000 + + Add a check for the MMX intrinsics used by pixman. gcc >= 3.4 is required. + + ChangeLog | 5 +++++ + configure.in | 34 ++++++++++++++++++++++++++++++++++ + 2 files changed, 39 insertions(+) + +commit 9ae7d8a13b065fc44966eceb28976aa2b009e46b +Author: Billy Biggs +Date: Tue Aug 16 16:50:25 2005 +0000 + + Port MMX code from xserver to pixman. + Add an fbpict.c ported from the latest in xserver/fb, including hooks to the MMX code where appropriate. This replaces the old ic.c file. + Replaced by fbpict.c. + Move some X server macros from fbpict.c up into icint.h to keep the diff small. + Add fbmmx and fbpict.c, remove ic.c. + Add a check for the MMX intrinsics. gcc >= 3.4 is required. + + pixman/ChangeLog | 53 + + pixman/configure.in | 32 + + pixman/src/Makefile.am | 10 +- + pixman/src/fbmmx.c | 2503 ++++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/fbmmx.h | 228 +++++ + pixman/src/fbpict.c | 1904 ++++++++++++++++++++++++++++++++++++ + pixman/src/ic.c | 1687 -------------------------------- + pixman/src/icint.h | 30 + + 8 files changed, 4758 insertions(+), 1689 deletions(-) + +commit a2a89e858af70262de276c8568baabf91e00dbb2 +Author: Carl Worth +Date: Tue Aug 16 16:41:10 2005 +0000 + + Rename cairo_printf_format to CAIRO_PRINTF_FORMAT. Fix syntax error in the case of an empty definition. (Thanks to Vladimir Vukicevic). + + ChangeLog | 6 ++++++ + src/cairoint.h | 7 +++---- + 2 files changed, 9 insertions(+), 4 deletions(-) + +commit b7737163bc8c8d60967e025b71d30f9827d45801 +Author: Kristian Høgsberg +Date: Sun Aug 14 19:25:05 2005 +0000 + + Zero out 'entry', not 'unscaled' when evicting face from cache. + + ChangeLog | 5 +++++ + src/cairo-ft-font.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 52c5d89ae58e50a788f6d1ab79e9159c944c426e +Author: Kristian Høgsberg +Date: Sat Aug 13 17:38:23 2005 +0000 + + Fix a mismatch between printf arguments and format string (thanks to Adrian Johnson). + Add macro to mark printf like functions. + + ChangeLog | 9 +++++++++ + src/cairo-ps-surface.c | 4 ++-- + src/cairoint.h | 10 +++++++++- + 3 files changed, 20 insertions(+), 3 deletions(-) + +commit 28958e368cfe50198188407da10c66510d9c9515 +Author: Owen Taylor +Date: Sat Aug 13 08:12:17 2005 +0000 + + Change docREEL back to doc. (Found by Kjartan Maraas) + + ChangeLog | 5 +++++ + Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 0a2a4045daf9cdd9952918499152f88c6387709a +Author: Carl Worth +Date: Sat Aug 13 05:46:40 2005 +0000 + + Fix typo ('internal' should have been 'external'). + + ChangeLog | 4 ++++ + NEWS | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 2ebf274db4a21f11739ff6603a47fdf49571e3e9 +Author: Carl Worth +Date: Sat Aug 13 05:33:21 2005 +0000 + + Increment CAIRO_VERSION to 0.9.3 after tagging RELEASE_0_9_2. + Slight rewording of announcement email. + + ChangeLog | 8 ++++++++ + Makefile.am | 8 ++++++-- + configure.in | 2 +- + 3 files changed, 15 insertions(+), 3 deletions(-) + +commit b3a4f29f830dbcb57ef3d1e4c3c140126752043b +Author: Carl Worth +Date: Sat Aug 13 05:00:20 2005 +0000 + + Added notes for release 0.9.2. + Increment CAIRO_VERSION to 0.9.2 and libtool versioning to 3:1:1. + Remove some more 'snapshot' language. Make it more clear that the libtool versioning numbers need to be updated. + + ChangeLog | 20 +++++++------- + NEWS | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- + RELEASING | 10 +++---- + configure.in | 8 +++--- + 4 files changed, 99 insertions(+), 27 deletions(-) + +commit 3f24b949a070aebaeaa465ccd09604bda0be717b +Author: Carl Worth +Date: Sat Aug 13 04:22:46 2005 +0000 + + Fix unterminated comment that eliminated cairo_pattern_add_color_stop_rgba. + + ChangeLog | 5 +++++ + src/cairo-pattern.c | 1 + + 2 files changed, 6 insertions(+) + +commit fd8a70f4b6b919682f2609e0dda08aa1564d8ccf +Author: Carl Worth +Date: Sat Aug 13 04:17:36 2005 +0000 + + Add missing notes on soname and user-space locking for cairo_set_source() to the 0.9.0 release notes. + Document cairo_pattern_add_color_stop_rgb, cairo_pattern_add_color_stop_rgba, cairo_pattern_set_matrix, and cairo_pattern_get_matrix. + Add note on user-space locking to the documentation for cairo_set_source(). + + ChangeLog | 18 ++++++++++ + NEWS | 34 ++++++++++++++++++- + src/cairo-pattern.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++--- + src/cairo.c | 5 +++ + 4 files changed, 148 insertions(+), 5 deletions(-) + +commit 620de68bea6fa4e287d565b293202114200deec4 +Author: Carl Worth +Date: Sat Aug 13 03:26:18 2005 +0000 + + Turn the mutex code back on. It looks like the deadlocks have disappeared as of the cairo_scaled_font_map patch from two days ago. + Setup an automake conditional for the HAVE_PTHREAD case. + Link all tests with -lpthread if available, so that we can get some testing of cairo with mutexes turned on. + + ChangeLog | 16 ++++++++++++++++ + configure.in | 7 ++----- + src/cairoint.h | 41 +++++++++-------------------------------- + test/Makefile.am | 4 ++++ + 4 files changed, 31 insertions(+), 37 deletions(-) + +commit 615a32107d8174b71b0a7cbb504d79913a6e159d +Author: Carl Worth +Date: Sat Aug 13 02:21:07 2005 +0000 + + Minor, cosmetic changes: + Reowrd comment to be more clear. + Prefer return of address of base field rather than cast. + Whitespace fix. + + ChangeLog | 13 +++++++++++++ + src/cairo-ft-font.c | 7 ++++--- + 2 files changed, 17 insertions(+), 3 deletions(-) + +commit a8b6ad3e88e5b13434ab4fbac1e86e6a9076e636 +Author: Carl Worth +Date: Sat Aug 13 02:02:39 2005 +0000 + + Shuffle functions around to put them in a sane order within the file. There should be no functional change here. + + ChangeLog | 11 ++ + src/cairo-ft-font.c | 367 +++++++++++++++++++++++++--------------------------- + 2 files changed, 187 insertions(+), 191 deletions(-) + +commit 47d5bbeafc3a763988b66d8dbffff5426655213d +Author: Carl Worth +Date: Sat Aug 13 01:38:55 2005 +0000 + + Add hash_entry field to cairo_scaled_font_t so that it can be hashed. + Convert the font_face/matrix/ctm/options => cairo_scaled_font_t mapping from a two-layer cairo-cache.c implementation to a single cairo-hash.c implementation backed by a simple array for the secondary cache. + Reviewed by: keithp + + ChangeLog | 22 +++ + src/cairo-font.c | 592 ++++++++++++++++++++++++------------------------------- + src/cairoint.h | 6 +- + 3 files changed, 288 insertions(+), 332 deletions(-) + +commit be9698e6ada908a09a306dd0a2c7d824ffc824c8 +Author: Behdad Esfahbod +Date: Sat Aug 13 01:17:06 2005 +0000 + + Move checks for invalid number of points before the calls that use the points. + + ChangeLog | 6 ++++++ + src/cairo-path-data.c | 14 +++++++------- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit c5ac41755d1df2083b86dcf8b25f96c3aa7d22ed +Author: Behdad Esfahbod +Date: Sat Aug 13 01:04:55 2005 +0000 + + Fix conversion to short, to get a uniform range even for 0xffff. In other words, a color component of of (1.0 - epsilon) would convert to 0xffff, not 0xfffe. + + ChangeLog | 6 ++++++ + src/cairo-color.c | 28 +++++++++------------------- + 2 files changed, 15 insertions(+), 19 deletions(-) + +commit 20f92f48917393631c87d5f633a1055920b044a9 +Author: Behdad Esfahbod +Date: Sat Aug 13 00:20:45 2005 +0000 + + Generate sh1sum instead of md5sum. Use gpg to sign it. You need gpg set up. + + ChangeLog | 10 ++++++++-- + Makefile.am | 40 +++++++++++++++++++++++++++------------- + RELEASING | 10 ++++++---- + 3 files changed, 41 insertions(+), 19 deletions(-) + +commit a201637c7224b921948b79e4244dcc4f99f76cdf +Author: Carl Worth +Date: Fri Aug 12 23:50:17 2005 +0000 + + Move tag from an instruction in RELEASING to an automated step at the end of release-publish. + + ChangeLog | 6 ++++++ + Makefile.am | 2 ++ + RELEASING | 9 +++------ + 3 files changed, 11 insertions(+), 6 deletions(-) + +commit 21dff93be5fd8fff1e4de96afaf8ff12cb7a850a +Author: Behdad Esfahbod +Date: Fri Aug 12 21:35:31 2005 +0000 + + Check that the micro component of the version number is even. + Fixed the pattern to find all public header files. + + ChangeLog | 9 ++++++++- + Makefile.am | 16 ++++++++++++++-- + RELEASING | 6 ++---- + 3 files changed, 24 insertions(+), 7 deletions(-) + +commit 027157feb6a3761eca1edb4eb547ca07081c33e2 +Author: Billy Biggs +Date: Thu Aug 11 21:07:26 2005 +0000 + + Fix to be correct for arbitrary xDst values. + + pixman/ChangeLog | 5 +++++ + pixman/src/icrect.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 63 insertions(+), 6 deletions(-) + +commit 56d299d277f5a31f72d4a203673fbb026b7bb33f +Author: Carl Worth +Date: Thu Aug 11 16:52:43 2005 +0000 + + Fix inverted sense of assert statement which led to lots of unpleasant crashes. + + ChangeLog | 5 +++++ + doc/public/cairo-sections.txt | 5 +++++ + src/cairo-font.c | 2 +- + 3 files changed, 11 insertions(+), 1 deletion(-) + +commit ba9cb14cdf7d89132232aa3121f8e60d5982dc34 +Author: Carl Worth +Date: Thu Aug 11 14:59:27 2005 +0000 + + Add hash_entry field to cairo_font_face_t so that it can (optionally) be hashed. + Complete the remainder of the simple -> toy renaming. Convert the family/slant/weight -> cairo_toy_font_face_t mapping to use cairo-hash.c rather than cairo-cache.c. + + ChangeLog | 16 +++ + src/cairo-font.c | 360 ++++++++++++++++++++++++------------------------------- + src/cairoint.h | 4 +- + 3 files changed, 178 insertions(+), 202 deletions(-) + +commit d1dbd031cca9fbef2381e98e626e75c357dd4f53 +Author: Carl Worth +Date: Thu Aug 11 14:49:07 2005 +0000 + + Move implementation of filename/id => cairo_ft_unscaled_font_t from cairo-cache.c to cairo-hash.c, with new cairo_ft_unscaled_font_map. + Add cairo_unscaled_font->hash_entry so that unscaled fonts can live in hash tables. + + ChangeLog | 46 ++++++ + src/cairo-ft-font.c | 435 +++++++++++++++++++++++++++------------------------- + src/cairoint.h | 1 + + 3 files changed, 273 insertions(+), 209 deletions(-) + +commit 34c9e242c85cfe5cb2b53182bea07513f38c9c78 +Author: Carl Worth +Date: Thu Aug 11 06:35:20 2005 +0000 + + Re-order cairo_scaled_font->font_face parameter to maintain the font_face,font_matrix,ctm,options order that prevails throughout the implementation. Add font_face parameter to _cairo_scaled_font_init. + Remove const qualifier from toy_face parameter to creat_toy, as these functions may reference the font face. Track addition of font_face parameter to _cairo_scaled_font_init. + Implement font_face parameter to _cairo_scaled_font_init, moving the reference of the font_face from _cairo_inner_font_cache_create_entry. + Add a font_face parameter in addition to the unscaled_font parameter. + Track new font_face parameter to _cairo_ft_scaled_font_create. + Whitespace touchup. + Reviewed by: otaylor + + ChangeLog | 31 ++++++++++++++++++++++++++++++ + src/cairo-atsui-font.c | 4 ++-- + src/cairo-font.c | 7 +++---- + src/cairo-ft-font.c | 52 +++++++++++++++++++++++++++++--------------------- + src/cairo-win32-font.c | 11 ++++++++--- + src/cairoint.h | 5 +++-- + 6 files changed, 77 insertions(+), 33 deletions(-) + +commit b25c1203d8d313d9b44f29e4b0d1329dddd42dbe +Author: Billy Biggs +Date: Wed Aug 10 22:03:00 2005 +0000 + + Add support for filling 1bpp images (used to clear A1 masks). + + pixman/ChangeLog | 5 +++++ + pixman/src/icrect.c | 21 +++++++++++++++++++++ + 2 files changed, 26 insertions(+) + +commit 58c51ff1378ce749b78a2edac622100c8873efb8 +Author: Billy Biggs +Date: Wed Aug 10 21:12:10 2005 +0000 + + Update to match the output from libpixman. + + ChangeLog | 5 +++++ + test/clip-operator-ref.png | Bin 37486 -> 38336 bytes + 2 files changed, 5 insertions(+) + +commit 910d824b3df8cc72a52c44b1177045d91b83051b +Author: Billy Biggs +Date: Wed Aug 10 21:10:11 2005 +0000 + + Port fbcompose.c from xserver into pixman. Add #defines for gradients, convolution filters, and indexed colour formats to keep the patch small. Use pixman regions instead of X server regions as appropriate. + Remove iccompose.c, replaced by fbcompose.c. + Add a slightly-trimmed version of fbpict.h from xserver/fb to make the port smaller and cleaner. + Use the redundant fbpict.h defines and add in the struct for indexed colour support. + Remove defines now in fbpict.h. + Add some constants and types required by fbcompose.c + Add fbcompose.c and fbpict.h, remove iccompose.c. + reviewed by: cworth and Jeff Muizelaar at various stages + + pixman/ChangeLog | 89 + + pixman/src/Makefile.am | 3 +- + pixman/src/fbcompose.c | 3617 ++++++++++++++++++++++++++++++++++++ + pixman/src/fbpict.h | 356 ++++ + pixman/src/ic.c | 46 +- + pixman/src/iccompose.c | 2837 ---------------------------- + pixman/src/icimage.h | 35 +- + pixman/src/pixman-xserver-compat.h | 16 + + 8 files changed, 4082 insertions(+), 2917 deletions(-) + +commit 0b991f9633b2b2285132c7100aea43dcb15c7ca8 +Author: Carl Worth +Date: Wed Aug 10 20:25:57 2005 +0000 + + Thanks to Olivier Andrieu: + Add mention of cairo_get_antialias. Fix to mention cairo_surface_flush by its correct name, (rather than the non-existent cairo_flush). + + ChangeLog | 8 ++++++++ + NEWS | 7 ++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit ce5a493c70e530ee5aaec9acafb63d871d79d583 +Author: Carl Worth +Date: Wed Aug 10 16:04:26 2005 +0000 + + Fix id to be cairo rather than libglade. (Thanks to Christian Biesinger). + + ChangeLog | 5 +++++ + doc/public/cairo-docs.xml | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit ae63b95211f32f169af37dc03956f9d23fd6794d +Author: Carl Worth +Date: Wed Aug 10 15:58:25 2005 +0000 + + Augment existing CAIRO_VERSION_MAJOR/MINOR/MICRO and CAIRO_VERSION_STRING with CAIRO_VERSION_ENCODE and CAIRO_VERSION. Add functions for run-time access: + cairo_version cairo_version_string + + ChangeLog | 11 +++++++++++ + src/cairo.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 16 ++++++++++++++++ + 3 files changed, 69 insertions(+) + +commit bdd8cbddeedec584fc859c5c092ce67c3a1830eb +Author: Carl Worth +Date: Wed Aug 10 14:30:15 2005 +0000 + + From Travis Spencer : + Fix typo causing a syntax error. + + ChangeLog | 8 ++++++++ + src/cairo-xcb-surface.c | 4 ++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit eacc1e95a536cbdbf0fe7a09cfa9fb519b401b50 +Author: Keith Packard +Date: Wed Aug 10 13:32:06 2005 +0000 + + Place private include directives before CAIRO_CFLAGS in case pixman remains installed in the system. + + ChangeLog | 6 ++++++ + test/Makefile.am | 4 ++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit a05fcce1650e4b4b360056c072e09fdd7b193f5b +Author: Keith Packard +Date: Wed Aug 10 13:27:48 2005 +0000 + + Union with empty rectangle should yield SUCCESS, not FAILURE + + pixman/ChangeLog | 5 +++++ + pixman/src/pixregion.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 0fc4192104fe7f3e147fe9a80eada779fd0265fc +Author: Carl Worth +Date: Wed Aug 10 12:36:51 2005 +0000 + + From Keith Packard , + Build pixman internally as a private part of cairo, with suitable name changes to avoid any visible pixman symbols in the cairo library: + Descend into pixman. + Drop libpixman from Requires. + Don't check for libpixman. Check version of pkg-config and use Requires.private instead of Requires in cairo.pc if possible. Generate pixman Makefiles. + Rip out release-publish target and installation of libpixman.pc. + Add pixman-remap.h. Drop libpixman.la target. + Fix to include config.h rather than ../config.h + This is the cpp magic to rename all pixman functions from the various fb, Fb, INT_pixman, pixman, Render, _Render, or no prefix to _cairo_pixman_ prefixes. + Include pixman-remap.h to get all the cairo-internalized names. + Add -Ipixman/src to get at pixman-remap.h. + + ChangeLog | 36 ++++++ + Makefile.am | 4 +- + cairo.pc.in | 2 +- + configure.in | 18 ++- + pixman/Makefile.am | 57 +-------- + pixman/src/Makefile.am | 8 +- + pixman/src/icint.h | 2 +- + pixman/src/pixman-remap.h | 302 ++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/pixman.h | 3 +- + src/Makefile.am | 4 +- + test/Makefile.am | 1 + + 11 files changed, 364 insertions(+), 73 deletions(-) + +commit bbf0d98a54ca15a7d5ba3f34851a9dd8d9ba07c4 +Author: Vladimir Vukicevic +Date: Wed Aug 10 11:40:11 2005 +0000 + + Additional fix for 0-width/0-height glyphs. + + ChangeLog | 5 +++++ + src/cairo-glitz-surface.c | 6 ++---- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 8df9bfecadda5bc98d2fe484f6ea55110ac99b2c +Author: Carl Worth +Date: Wed Aug 10 11:30:45 2005 +0000 + + Change release instructions to indicate new odd-micro version for in-progress development, and even-micro for released versions. Do a bit of snapshot->release renaming. + + ChangeLog | 9 +++++++++ + Makefile.am | 4 ++-- + RELEASING | 41 ++++++++++++++++++++++------------------- + 3 files changed, 33 insertions(+), 21 deletions(-) + +commit 82fbb9c381adf9e7b7b6c5fac52c175b8859e419 +Author: Carl Worth +Date: Wed Aug 10 11:08:38 2005 +0000 + + Patch from Behdad Esfahbod : + Update to use AC_INIT and AM_INIT_AUTOMAKE in recommended ways. Add support for substituting CAIRO_VERSION_MAJOR/MINOR/MICRO into generated headers. + Add CAIRO_VERSION_MAJOR/MINOR/MICRO and CAIRO_VERSION_STRING which are generated by configure. + + ChangeLog | 11 +++++++++++ + configure.in | 31 ++++++++++++++++++++++--------- + src/cairo-features.h.in | 6 ++++++ + 3 files changed, 39 insertions(+), 9 deletions(-) + +commit 52ec34a157d0d0ef5af49f767a50672b84ebb9e6 +Author: Carl Worth +Date: Wed Aug 10 06:52:40 2005 +0000 + + Add cairo_private to the few pieces of data that were missing it. + + ChangeLog | 6 ++++++ + src/cairo-path-data-private.h | 2 +- + src/cairoint.h | 12 ++++++------ + 3 files changed, 13 insertions(+), 7 deletions(-) + +commit 8042a0d219131acfbeb6ed54b078ad2bc26ccbef +Author: Vladimir Vukicevic +Date: Tue Aug 9 13:42:54 2005 +0000 + + Don't crash on 0-width or 0-height glyphs; also correctly initialize entry->key.base.memory with the image cache image. + Free allocated entry in case of error to avoid leaking memory. + + ChangeLog | 9 +++++++++ + src/cairo-glitz-surface.c | 35 +++++++++++++++++++++++++++++++++-- + src/cairo-xlib-surface.c | 3 +++ + 3 files changed, 45 insertions(+), 2 deletions(-) + +commit cedf233052f8e173c671e614207bd63e2b7add4b +Author: Carl Worth +Date: Tue Aug 9 13:01:14 2005 +0000 + + Add cairo_private to several function prototypes that were missing it. + + ChangeLog | 8 ++++++++ + src/cairo-arc-private.h | 4 ++-- + src/cairo-ft-private.h | 4 ++-- + src/cairo-meta-surface-private.h | 4 ++-- + src/cairoint.h | 26 +++++++++++++------------- + 5 files changed, 27 insertions(+), 19 deletions(-) + +commit a391bb451a9521efa9526fe8acba97f96540d4be +Author: Carl Worth +Date: Tue Aug 9 12:35:09 2005 +0000 + + Note that sane clipping is done now. Add release versions for previously completed items. + Ignore unantialiased-shapes. + + ChangeLog | 7 +++++++ + ROADMAP | 12 +++++------- + test/.cvsignore | 1 + + 3 files changed, 13 insertions(+), 7 deletions(-) + +commit 6ece52cd0572800006d87109e8818c514d5b88ca +Author: Tor Lillqvist +Date: Tue Aug 9 10:05:35 2005 +0000 + + Get cairo_toy_font_face_t type right. + + ChangeLog | 5 +++++ + src/cairo-atsui-font.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 018015d802c170c1578efcdb9efecec08f11ab99 +Author: Carl Worth +Date: Tue Aug 9 09:27:39 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with RELEASE_0_9_0. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 4bec3d6af49f9a720121617819700bc700ba5951 +Author: Carl Worth +Date: Mon Aug 8 21:06:44 2005 +0000 + + Added notes for release 0.9.0. + Increment CAIRO_VERSION to 0.9.0. Increment LT_CURRENT to 2 to mark the beginning of proper soname management. + + ChangeLog | 7 ++++++ + NEWS | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 4 ++-- + 3 files changed, 86 insertions(+), 2 deletions(-) + +commit 9a088c2fad17af0564936a3b88c9d306c72f11de +Author: Carl Worth +Date: Mon Aug 8 21:02:11 2005 +0000 + + Add missing cairo-debug.h which was hold up make distcheck. + + ChangeLog | 5 +++++ + src/Makefile.am | 1 + + 2 files changed, 6 insertions(+) + +commit 4d2b8bddded15662015466046039650c20231bbf +Author: Carl Worth +Date: Mon Aug 8 20:57:13 2005 +0000 + + Fix typo that was holding up make distcheck from working. + + ChangeLog | 5 +++++ + test/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 1278ade2297e027906ca12c7471891a08188b115 +Author: Billy Biggs +Date: Mon Aug 8 18:36:56 2005 +0000 + + Declare _cairo_path_nil as extern. + + ChangeLog | 4 ++++ + src/cairo-path-data-private.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 53444c286ef45fa0054ba6ab94dac11016e9600c +Author: Billy Biggs +Date: Mon Aug 8 18:35:22 2005 +0000 + + Add a new API for disabling antialiasing of shapes drawn by cairo. This is a hint and is not supported by all backends. + Store the antialiasing mode in the gstate and pass it to the backend for trapezoid rendering and for clipping. + Pass the antialiasing parameter down to the backend where appropriate. + Pass the antialiasing parameter down to the backend where appropriate. + Add support for A1 format trapezoid rendering, and remove the _create_mask_image function, creating a temporary image from memory we allocate and clear. + Support A1 masks to disable antialiasing using the RENDER extension when requested. + Support A1 masks to disable antialiasing using the RENDER extension when requested. + Blindly pass through the antialising parameter. + Add the antialiasing parameter but don't support it. + Add a test case and a reference image from the latest libpixman. + Add the new antialiasing disabling API to the docs. + Update progress on a parameter to disable antialiasing. + reviewed by: cworth, otaylor + + ChangeLog | 74 +++++++++++++++++++++++++++ + TODO | 2 +- + doc/public/cairo-sections.txt | 4 +- + doc/public/tmpl/cairo-font.sgml | 10 ---- + doc/public/tmpl/cairo.sgml | 28 +++++++++++ + src/cairo-clip-private.h | 2 + + src/cairo-clip.c | 15 ++++-- + src/cairo-glitz-surface.c | 1 + + src/cairo-gstate-private.h | 1 + + src/cairo-gstate.c | 49 ++++++++++++++---- + src/cairo-image-surface.c | 71 ++++++++++++++------------ + src/cairo-meta-surface-private.h | 3 ++ + src/cairo-meta-surface.c | 11 +++- + src/cairo-pdf-surface.c | 4 +- + src/cairo-ps-surface.c | 12 +++-- + src/cairo-surface.c | 20 ++++++-- + src/cairo-xcb-surface.c | 11 +++- + src/cairo-xlib-surface.c | 22 ++++++-- + src/cairo.c | 40 +++++++++++++++ + src/cairo.h | 46 +++++++++-------- + src/cairoint.h | 18 +++++-- + test/Makefile.am | 3 ++ + test/unantialiased-shapes-ref.png | Bin 0 -> 4450 bytes + test/unantialiased-shapes.c | 103 ++++++++++++++++++++++++++++++++++++++ + 24 files changed, 450 insertions(+), 100 deletions(-) + +commit 578b45c9032fd00b68fc1709d61e915d74a527c7 +Author: Carl Worth +Date: Mon Aug 8 17:32:24 2005 +0000 + + Ignore clip-operator and unbounded-operator. + + ChangeLog | 4 ++++ + test/.cvsignore | 2 ++ + 2 files changed, 6 insertions(+) + +commit 8bdad8ffa2962c9dff1e86e9bd131d588a1ebd2f +Author: Carl Worth +Date: Mon Aug 8 15:50:55 2005 +0000 + + Fix gnome-announce-list address. + + ChangeLog | 4 ++++ + RELEASING | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit d51a35543ca405dda788eb6433e6bb30dc3c7cf5 +Author: Owen Taylor +Date: Mon Aug 8 14:27:01 2005 +0000 + + Don't free the glyph if the entry doesn't have a glyph. (Maybe #3909, Carlos Garnacho Parro) + + ChangeLog | 6 ++++++ + src/cairo-xlib-surface.c | 5 +++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit 69f140b654df878b9ba86d61062d235bbebef7a2 +Author: Carl Worth +Date: Mon Aug 8 14:13:50 2005 +0000 + + Add a return value after ASSERT_NOT_REACHED to quiet an anxious compiler. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 1 + + 2 files changed, 6 insertions(+) + +commit 8478804d9818deb3a1f86e8e22200c40f83962bf +Author: Owen Taylor +Date: Mon Aug 8 14:11:00 2005 +0000 + + Fix accidentally committed line. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 4 +--- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 7caa7cccf2e5aff083d5a88fbace0b24430397de +Author: Kristian Høgsberg +Date: Mon Aug 8 13:50:59 2005 +0000 + + Update doc comment. + + ChangeLog | 5 +++++ + src/cairo-surface.c | 12 +++++------- + 2 files changed, 10 insertions(+), 7 deletions(-) + +commit d4b24dc974bd4298c1ad8d06efc4f3dfea68ee03 +Author: Owen Taylor +Date: Mon Aug 8 13:50:02 2005 +0000 + + Add reference images + + test/clip-operator-ref.png | Bin 0 -> 37486 bytes + test/unbounded-operator-ref.png | Bin 0 -> 14178 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 8f19aaf9a8a60aa2eb86e25946d04f293ed703db +Author: Owen Taylor +Date: Mon Aug 8 13:46:11 2005 +0000 + + Add a function to test whether a cairo_operator_t is bounded (does nothing for 0 src/mask) + cairoint.h: Add a helper function to take clearing areas that are outside the source/mask but are cleared by unbounded operations. + src/cairo-xlib-surface.c (_cairo_xlib_surface_composite): Use _cairo_surface_composite_fixup_unbounded() as needed. + src/cairo-image-surface.c src/cairint.h: Keep track of whether the surface has a clip or not ... we need this for determining when we can bypass an intermediate mask for composite_trapezoids(). + Create an intermediate mask of the right size with pixman_add_trapezoids() and composite that. + When rendering with an unbounded operator, create the intermediate mask ourselves and render with ADD to that, then composite the result. + Create an intermediate surface the size of the extents, render the glyphs to that then composite the results. + Add the size of the glyph + Compute the size of the glyph mask, then use _cairo_surface_composite_fixup_unbounded(). + Use the right mask format. (Unrelated bugfix) + New function taking a drawing function as a parameter to encapsulate shared logic between compositing trapezoid, glyphs, and masks. + Use _cairo_gstate_clip_and_composite(). Also fix extents computations for unbounded operators. + src/cairo-clip.c src/cairo-clip-private.h (_cairo_clip_combine_to_surface): Add the destination as an extra parameter to allow combining to an intermediate surface. + tests/unbounded-operator.c tests/Makefile.am: Add a test for the operation of the 6 unbounded operators against different shapes. + tests/clip-operator.c tests/Makefile.am: Add a test that tests surface clipping with different shapes against all the operators. + Make use OVER like the name and description. With fixed semantics, SOURCE does something different. + + ChangeLog | 60 ++ + src/cairo-clip-private.h | 9 +- + src/cairo-clip.c | 22 +- + src/cairo-ft-font.c | 122 +++- + src/cairo-gstate.c | 733 +++++++++++++++---------- + src/cairo-image-surface.c | 126 ++++- + src/cairo-surface.c | 151 +++++ + src/cairo-xlib-surface.c | 214 +++++++- + src/cairoint.h | 23 +- + test/Makefile.am | 6 + + test/clip-operator.c | 205 +++++++ + test/composite-integer-translate-over-repeat.c | 2 +- + test/unbounded-operator.c | 201 +++++++ + 13 files changed, 1520 insertions(+), 354 deletions(-) + +commit 31ef9a80e95c5b84439b5d668d11ab3480d22a22 +Author: Carl Worth +Date: Sat Aug 6 17:00:59 2005 +0000 + + Remove several bugs that have been fixed. + + BUGS | 53 ----------------------------------------------------- + 1 file changed, 53 deletions(-) + +commit 1fadb8065600d5b9cbab9a14232e08daec450e4d +Author: Carl Worth +Date: Sat Aug 6 16:57:14 2005 +0000 + + Remove several bugs that have been fixed. + Slip group support off of the 1.0 roadmap. Update status of clipping work which otaylor is working on. + Update for progress on cairo_surface_mark_dirty (committed), non-antialiased rendering (patch), cairo_arc_to (patch), consistent error handling (committed), cairo_content_t (committed). Remove details for some completed items. + Don't crash if font_face is NULL, (this is a documented mechanism for returning to the default font_face). + + BUGS | 29 ------------------------ + ChangeLog | 16 ++++++++++++++ + ROADMAP | 22 +++++++++--------- + TODO | 65 +++++------------------------------------------------- + src/cairo-gstate.c | 2 +- + 5 files changed, 34 insertions(+), 100 deletions(-) + +commit 2f1024f83fc971516224b910cec8d3e787740c53 +Author: Carl Worth +Date: Sat Aug 6 16:38:33 2005 +0000 + + Fix to return &_cairo_font_face_nil instead of NULL on error. + + ChangeLog | 5 +++++ + src/cairo.c | 7 ++----- + 2 files changed, 7 insertions(+), 5 deletions(-) + +commit 8c52b287f37f8361653030024d7a4a42fc6e54ed +Author: Jeff Muizelaar +Date: Sat Aug 6 15:10:36 2005 +0000 + + Give reason for failure. + + ChangeLog | 4 ++++ + test/a8-mask.c | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 158b338fb2817996c5191332951b6957416c2e77 +Author: Owen Taylor +Date: Sat Aug 6 10:22:07 2005 +0000 + + Remove a non-sensical XXX that crept in at some point; for a solid color, there is no difference between premultiplied and non-premultiplied colors. + + ChangeLog | 7 +++++++ + src/cairo-win32-font.c | 1 - + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit f367e693322b1cf04040521080cc65403c292a28 +Author: Carl Worth +Date: Sat Aug 6 00:09:17 2005 +0000 + + Fix up some stale comments. Rename _cairo_ft_scaled_font_create_for_unscaled to its proper name of _cairo_ft_scaled_font_create (which is available now that _cairo_ft_scaled_font_create_toy has its correct name). Also prefer 'scaled_font' over 'f' as an identifier. + + ChangeLog | 11 +++++++++++ + src/cairo-ft-font.c | 46 ++++++++++++++++++++++++---------------------- + 2 files changed, 35 insertions(+), 22 deletions(-) + +commit e63e0578b1edf2b60c818b3e6741cf97c5a53359 +Author: Carl Worth +Date: Fri Aug 5 23:41:41 2005 +0000 + + Unify initialization for _cairo_ft_unscaled_font_create_from_face and _cairo_ft_unscaled_font_create_from_filename through new _cairo_ft_unscaled_font_init. + + ChangeLog | 9 +++++ + src/cairo-ft-font.c | 102 ++++++++++++++++++++++++++++++++++++---------------- + 2 files changed, 80 insertions(+), 31 deletions(-) + +commit c4a806f21c2b6c3081b953497daf25108a734787 +Author: Carl Worth +Date: Fri Aug 5 22:37:29 2005 +0000 + + Rename _ft_font_face_backend to be preoperly namespaced as _cairo_ft_font_face_backend. + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 4 ++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit ff147497e54ef7573b35bd023d11e4e7d4272979 +Author: Carl Worth +Date: Fri Aug 5 22:35:04 2005 +0000 + + Rename cairo_ft_font_face->next_face to next. + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 18 ++++++++++++------ + 2 files changed, 18 insertions(+), 6 deletions(-) + +commit cfcab8fe4467095381c7a4d32182580649db6f00 +Author: Carl Worth +Date: Fri Aug 5 22:29:06 2005 +0000 + + Include cairo-hash-private.h. + Add cairo-hash.c and cairo-hash-private.h since we're actually going to start using them now. + + ChangeLog | 8 ++++++++ + src/Makefile.am | 2 ++ + src/cairoint.h | 2 ++ + 3 files changed, 12 insertions(+) + +commit de87ebcc1c53d9daa4f77b618766215b1723778e +Author: Jeff Muizelaar +Date: Fri Aug 5 22:17:08 2005 +0000 + + Fix problems in render fb implementation found by rendercheck: + - fbCombineSaturate was pointed at fbCombineDisjointOver, instead of fbCombineDisjointOverReverse as it should. Instead, point fbCombineDisjointOverReverse at fbCombineSaturate (which is likely to be faster). + - fix previously-unused fbCombineSaturate implementation. + - fbCombineMaskAlphaC was just a copy of fbCombineMaskValueC. Make it do what it's supposed to (return a cs.alpha). + - fbCombineAtopC didn't invert the source alpha value. + - fix copy'n'paste errors in fbCombine(Dis/Con)jointGeneralC, also source alpha wasn't treated in a component fashion. + From anholt. + + pixman/ChangeLog | 20 +++++ + pixman/src/iccompose.c | 195 ++++++++++++++++++++++++++++++++++--------------- + 2 files changed, 156 insertions(+), 59 deletions(-) + +commit 71e560a8fa78d9fd6f83cce820de9f4acb3829eb +Author: Jeff Muizelaar +Date: Fri Aug 5 21:35:51 2005 +0000 + + Temporarily disable the 24bpp WORKING_UNALIGNED_INT because of a crash when using electric-fence when accessing hte last pixel of a drawable (last pixel is 3 bytes, read it as a 4 byte word, and you're reading one extra pixel, which doesn't normally matter, but does in a few rare cases). Should be easy to work around, but that will come later. + From jaymz + + pixman/ChangeLog | 11 +++++++++++ + pixman/src/iccompose.c | 10 +++++++--- + 2 files changed, 18 insertions(+), 3 deletions(-) + +commit 417a66da5e8a98583661d08703a5c5562732678a +Author: Carl Worth +Date: Fri Aug 5 21:33:41 2005 +0000 + + Simplify the implementation by taking advantage of the fact that destroy and reference are safe for NULL, and that reference returns its argument. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 7 ++----- + 2 files changed, 9 insertions(+), 5 deletions(-) + +commit 80b944418cab51fcc2178080fe0c9a5ffd512479 +Author: Carl Worth +Date: Fri Aug 5 21:27:21 2005 +0000 + + Rename two functions: + _cairo_gstate_unset_font -> _cairo_gstate_unset_scaled_font _cairo_gstate_ensure_font -> _cairo_gstate_ensure_scaled_font + + ChangeLog | 17 +++++++++++++++++ + src/cairo-gstate.c | 40 ++++++++++++++++++++-------------------- + 2 files changed, 37 insertions(+), 20 deletions(-) + +commit 75e3d2883409220350a688716c908bea7b6e2c13 +Author: Carl Worth +Date: Fri Aug 5 21:02:25 2005 +0000 + + Entagle the cairo_unscaled_font_t typedef. + + ChangeLog | 4 ++++ + src/cairoint.h | 6 ++---- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit c14f2252b1b3a4499e65c13a146b9f8c5e9c5550 +Author: Carl Worth +Date: Fri Aug 5 20:53:09 2005 +0000 + + Rename font_face_backend->create_font to scaled_font_create. Group the scaled_font prototypes together. A little more simple -> toy renaming. + A little more simple -> toy renaming. + Track rename of font_face_backend->scaled_font_create. + + ChangeLog | 19 +++++++++++++++++++ + src/cairo-font.c | 42 +++++++++++++++++++++--------------------- + src/cairo-ft-font.c | 14 +++++++------- + src/cairo-gstate.c | 8 ++++---- + src/cairo-win32-font.c | 14 +++++++------- + src/cairoint.h | 30 +++++++++++++++--------------- + 6 files changed, 73 insertions(+), 54 deletions(-) + +commit 9c1fe21cd70bed9fd9e77ec757751df723cb9c42 +Author: Carl Worth +Date: Fri Aug 5 20:30:43 2005 +0000 + + Rather gratuitous (though mostly harmless) whitespace changes for font backend tables. + + ChangeLog | 5 +++ + src/cairoint.h | 104 ++++++++++++++++++++++++++++++++------------------------- + 2 files changed, 63 insertions(+), 46 deletions(-) + +commit 4ad365f1834bf0204e44156a62b8e8539fb65ef9 +Author: Carl Worth +Date: Fri Aug 5 20:15:19 2005 +0000 + + Document the implicit closing of sub-paths for cairo_fill and cairo_fill_preserve. + + ChangeLog | 5 +++++ + src/cairo.c | 10 ++++++---- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit d150513c6af3a7d1f52d7251ab0d097337f40ab3 +Author: Carl Worth +Date: Fri Aug 5 17:27:57 2005 +0000 + + Rename parameters to scalend_font_backend from font to scaled_font. + + ChangeLog | 5 +++++ + src/cairoint.h | 19 ++++++++++--------- + 2 files changed, 15 insertions(+), 9 deletions(-) + +commit b482e1e25e57c7ae1422f4737a2702d3cb53c0eb +Author: Carl Worth +Date: Fri Aug 5 17:00:38 2005 +0000 + + Rename scaled_font_backend->destroy to the more accurate fini, (since it frees only the dependent data within the scaled_font and not the scaled_font itself). + Track rename of scaled_font_backend->fini. + + ChangeLog | 12 ++++++++++++ + src/cairo-atsui-font.c | 4 ++-- + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 4 ++-- + src/cairo-win32-font.c | 4 ++-- + src/cairoint.h | 2 +- + 6 files changed, 20 insertions(+), 8 deletions(-) + +commit 76f80cc42e442abaf52d6582d16be91258f3f8a9 +Author: Carl Worth +Date: Fri Aug 5 16:44:20 2005 +0000 + + Rename scaled_font_backend->create to create_toy. Move declaration of cairo_simple_font_face_t from cairo_font.c to cairoint.h and rename it cairo_toy_font_face_t. Rework create_toy to accept a cairo_toy_font_face_t rather than separate family, slant, and weight. + Track change in create_toy interface. + Partial rename of simple->toy. It's not complete as this is a step in the process of merging in a large patch of mine which actually removes most of the affected code. + + ChangeLog | 22 ++++++++++++++++++++++ + src/cairo-atsui-font.c | 21 +++++++++------------ + src/cairo-font.c | 33 ++++++++++----------------------- + src/cairo-ft-font.c | 21 ++++++++++----------- + src/cairo-win32-font.c | 21 ++++++++++----------- + src/cairoint.h | 23 ++++++++++++++++------- + 6 files changed, 77 insertions(+), 64 deletions(-) + +commit 8d0452c1ee7ba7466b7bb06ec5c4e9746fce2482 +Author: Carl Worth +Date: Fri Aug 5 15:49:52 2005 +0000 + + ignore a8-mask + + ChangeLog | 4 ++++ + test/.cvsignore | 1 + + 2 files changed, 5 insertions(+) + +commit 5925e3520fbf6223804d5c5e81698d7cdd888620 +Author: Carl Worth +Date: Fri Aug 5 15:48:42 2005 +0000 + + Patch memory leaks. + + ChangeLog | 4 ++++ + test/a8-mask.c | 15 ++++++++------- + 2 files changed, 12 insertions(+), 7 deletions(-) + +commit 53bd9879bb802606789be76e5653e2fb6781f676 +Author: Jeff Muizelaar +Date: Fri Aug 5 15:07:45 2005 +0000 + + Add a test case for CAIRO_FORMAT_A8 masks that fails with libpixman. + + ChangeLog | 8 ++++++ + test/Makefile.am | 4 +++ + test/a8-mask-ref.png | Bin 0 -> 128 bytes + test/a8-mask.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 83 insertions(+) + +commit 549b7ff2a66335dc18434790895d4b4a25a76ba4 +Author: Carl Worth +Date: Fri Aug 5 15:01:55 2005 +0000 + + Bump automake_min_vers up to 1.7 since we clearly don't work with 1.4 anymore. + + ChangeLog | 5 +++++ + autogen.sh | 3 +-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit ec93e241b0cf161216dab27eeee3917a71230aa7 +Author: Jeff Muizelaar +Date: Fri Aug 5 12:26:33 2005 +0000 + + Fix fbGetDrawable + Patch from Billy Biggs . + + pixman/ChangeLog | 6 ++++++ + pixman/src/pixman-xserver-compat.h | 6 +++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit 3ef2488265a1671d42224f4dca1b62c007ef5b0a +Author: Jeff Muizelaar +Date: Fri Aug 5 12:14:12 2005 +0000 + + Fix some of the 4 bit per channel PICT definitions + Patch from Billy Biggs . + + pixman/ChangeLog | 6 ++++++ + pixman/src/icint.h | 6 +++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit 2b20b7a23022a22a460b9441984ccdb7fdce5061 +Author: Jeff Muizelaar +Date: Fri Aug 5 11:44:49 2005 +0000 + + Fix up the fast-path compositing operators; those are useful for sources without alpha, but can't be used for sources with alpha. Also, replaced fbCompositeSrcSrc_nxn with call to fbBlt as this function must handle 1, 4, 8, 16, 24, 32 bpp objects. Would be nice to optimize fbBlt for common cases involving 8, 16, 24 and 32bpp. + From Keith Packard. + + pixman/ChangeLog | 17 +++ + pixman/src/ic.c | 432 +++++++++++++++++++++++++++++-------------------------- + 2 files changed, 244 insertions(+), 205 deletions(-) + +commit 594ba3ef69509d9c13258449f4b636bc52d77cd4 +Author: Jeff Muizelaar +Date: Fri Aug 5 11:23:51 2005 +0000 + + use the newly added buffer_diff_noalpha for comparing buffers of CAIRO_FORMAT_RGB24. + + ChangeLog | 6 ++++++ + test/xlib-surface.c | 24 ++++++++++++------------ + 2 files changed, 18 insertions(+), 12 deletions(-) + +commit 5f78feda5d9819f82ff99911b90cd09e228466a9 +Author: Jeff Muizelaar +Date: Fri Aug 5 11:15:04 2005 +0000 + + rewrite buffer_diff to be endian safe and add a new fuction buffer_diff_noalpha + + ChangeLog | 7 +++++ + test/buffer-diff.c | 83 +++++++++++++++++++++++++++++++++++++----------------- + test/buffer-diff.h | 14 ++++++++- + 3 files changed, 77 insertions(+), 27 deletions(-) + +commit 2e1eaa88ff07fbd2048c76587cd6b9ca565fa047 +Author: Carl Worth +Date: Fri Aug 5 10:46:40 2005 +0000 + + Remove CAIRO_BEGIN_DECLS and CAIRO_END_DECLS which don't belong here. + + ChangeLog | 5 +++++ + doc/public/cairo-sections.txt | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 7d88cdd15bbf8ccb82b7bd45313396ea6f93054f +Author: Carl Worth +Date: Fri Aug 5 10:43:07 2005 +0000 + + Remove unused variable. + + ChangeLog | 4 ++++ + test/surface-finish-twice.c | 1 - + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit e59d1dff7f8096c497ca4e70df1259b16c264f25 +Author: Carl Worth +Date: Fri Aug 5 10:40:32 2005 +0000 + + Ignore cairo-clip-private.h. + Drop non-existent cairo-atsui.xml. + Fix misnamed parameters in comment blocks. + Include config.h so HAVE_UNISTD_H gets picked up as necessary. + + ChangeLog | 16 ++++++++++++++++ + doc/public/Makefile.am | 1 + + doc/public/cairo-docs.xml | 1 - + src/cairo-font.c | 7 ++----- + test/cairo-test.c | 4 ++++ + 5 files changed, 23 insertions(+), 6 deletions(-) + +commit 59d7f60249c9b0d01b01548907c792c324cb9bc8 +Author: Carl Worth +Date: Fri Aug 5 10:30:31 2005 +0000 + + Add some missing declarations to the appropriate sections. + churn + Rename cairo_path_nil to _cairo_path_nil since it may be exported, and tag it cairo_private to try to avoid exporting it. Qualify it as const well. + Track new name of _cairo_path_nil and cast away the const as required. + + ChangeLog | 19 +++++++++++++++++++ + doc/public/cairo-sections.txt | 5 +++++ + doc/public/tmpl/cairo-font.sgml | 18 ++++++++++++++++++ + doc/public/tmpl/cairo-surface.sgml | 9 +++++++++ + doc/public/tmpl/cairo-xlib.sgml | 11 +++++++++++ + doc/public/tmpl/cairo.sgml | 7 +++++++ + src/cairo-path-data-private.h | 2 +- + src/cairo-path-data.c | 8 ++++---- + src/cairo.c | 4 ++-- + 9 files changed, 76 insertions(+), 7 deletions(-) + +commit a2dc18fd0c89e267bd810d42c8e0965487a22058 +Author: Carl Worth +Date: Fri Aug 5 10:05:29 2005 +0000 + + Remove include of math.h since cairoint.h does it more carefully, (for annoying platforms for which just including math.h without extra defines is not enough). + Replace Cairo with cairo. + Include config.h so HAVE_UNISTD_H gets picked up as necessary. + Fix non-UTF-8 copyright symbol. + + ChangeLog | 14 ++++++++++++++ + src/cairo-arc.c | 2 -- + src/cairo-matrix.c | 1 - + src/cairo.c | 2 +- + test/buffer-diff.c | 4 ++++ + test/cairo-test.c | 2 +- + 6 files changed, 20 insertions(+), 5 deletions(-) + +commit 72f40f58bbaf1b80c82f9447007cd4c8d7a4916f +Author: Carl Worth +Date: Fri Aug 5 10:03:04 2005 +0000 + + More obnoxious tmpl churn + + doc/public/tmpl/cairo-font.sgml | 2 ++ + doc/public/tmpl/cairo-pattern.sgml | 1 + + doc/public/tmpl/cairo-surface.sgml | 1 + + doc/public/tmpl/cairo.sgml | 1 + + 4 files changed, 5 insertions(+) + +commit 2eabc47b853f08614d829acecb277388dcb4e046 +Author: Carl Worth +Date: Fri Aug 5 09:49:38 2005 +0000 + + Sort cairo-clip.c + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0586daaa2927bfde9605487eef8e9b95c49d7d2f +Author: Carl Worth +Date: Fri Aug 5 07:48:18 2005 +0000 + + Patch from John Ehresman to aid win32 compilation: + Define snprintf as _snprintf when under the influence of _MSC_VER. + Define int32_t and friends as __int32 and friends when under the influence of _MSC_VER. + Make include of unistd.h conditional on HAVE_UNISTD_H. + + ChangeLog | 16 ++++++++++++++++ + src/cairo-output-stream.c | 4 ++++ + src/cairo-wideint.h | 14 +++++++++++++- + test/buffer-diff.c | 2 ++ + test/cairo-test.c | 6 ++++++ + test/read-png.c | 14 +++++++++++++- + 6 files changed, 54 insertions(+), 2 deletions(-) + +commit fd27af574d544d8adfd8cb6d5ac84837e6db43d2 +Author: Kristian Høgsberg +Date: Thu Aug 4 23:10:26 2005 +0000 + + Patch from Adrian Johnson + Remap composite glyps to use subset font glyph indices. + + ChangeLog | 8 ++++++ + src/cairo-font-subset.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 77 insertions(+), 3 deletions(-) + +commit ebf985c87688f090c27c3906a6b441522b2f702a +Author: Kristian Høgsberg +Date: Thu Aug 4 22:45:59 2005 +0000 + + New files. Move code for manipulating cairo_clip_t out into cairo_clip_* functions and put them in cairo-clip.c. + Rewrite to use new cairo_clip_t functions for manipulating the clip state, change the clip_and_composite_trapezoids call tree to use cairo_clip_t instead of cairo_gstate_t. + Use new cairo_clip_t function to maintain clip state while replaying. + Pass fill rule and tolerance directly, to break gstate dependency. + New function. Set the clip for a surface as specified by the cairo_clip_t. + Move translate_traps() from cairo-gstate.c to here and rename it. + Reviewed by: otaylor + + ChangeLog | 29 +++ + src/Makefile.am | 2 + + src/cairo-clip-private.h | 118 +++++++++ + src/cairo-clip.c | 457 ++++++++++++++++++++++++++++++++ + src/cairo-gstate-private.h | 41 +-- + src/cairo-gstate.c | 637 +++++++-------------------------------------- + src/cairo-meta-surface.c | 132 +++++----- + src/cairo-path-fill.c | 20 +- + src/cairo-surface.c | 23 +- + src/cairo-traps.c | 29 +++ + src/cairoint.h | 35 ++- + 11 files changed, 849 insertions(+), 674 deletions(-) + +commit 27573750eb9f2655d0b4cb5640a9f3f6c1316bc0 +Author: Kristian Høgsberg +Date: Thu Aug 4 18:44:29 2005 +0000 + + Change *_reference() functions to return the object being referenced. + + ChangeLog | 14 ++++++++++++++ + src/cairo-font-subset.c | 3 +-- + src/cairo-font.c | 26 ++++++++++++++++++-------- + src/cairo-ft-font.c | 6 ++---- + src/cairo-glitz-surface.c | 3 +-- + src/cairo-gstate.c | 11 ++++++----- + src/cairo-image-surface.c | 3 +-- + src/cairo-meta-surface.c | 3 +-- + src/cairo-pattern.c | 13 ++++++++----- + src/cairo-pdf-surface.c | 9 +++++---- + src/cairo-surface.c | 26 +++++++++++++++++++++++--- + src/cairo-xcb-surface.c | 3 +-- + src/cairo-xlib-surface.c | 3 +-- + src/cairo.c | 8 ++++++-- + src/cairo.h | 10 +++++----- + src/cairoint.h | 2 +- + 16 files changed, 94 insertions(+), 49 deletions(-) + +commit a8ccf316201e5241bcde2359f6dcbe3557cca79b +Author: Tor Lillqvist +Date: Thu Aug 4 15:53:30 2005 +0000 + + Check for render bug involving repeated patterns with a general transform matrix. + + ChangeLog | 8 ++++++++ + src/cairo-xlib-surface.c | 40 ++++++++++++++++++++++++++++++---------- + 2 files changed, 38 insertions(+), 10 deletions(-) + +commit b5ab1741e9f9e73283dd18266834ecae2b03d93e +Author: Carl Worth +Date: Thu Aug 4 13:22:15 2005 +0000 + + Originally 2005-07-13 Carl Worth + Export opaque cairo_ft_unscaled_font_t and change _cairo_ft_unscaled_font_[un]lock_face to accept cairo_ft_unscaled_font_t rather than cairo_unscaled_font_t. + Cast explicitly to cairo_ft_unscaled_font_t to track change in prototype of _cairo_ft_unscaled_font_[un]lock_face. + Lots of renaming to use consistent namespacing: + ft_font_transform_t -> cairo_ft_font_transform_t ft_font_face_t -> cairo_ft_font_face_t ft_unscaled_font_t -> cairo_ft_unscaled_font_t + Add missing _cairo prefix to many functions. + Disambiguate _ft_scaled_font_create and _cairo_ft_scaled_font_create by renaming the former to _cairo_ft_scaled_font_create_for_unscaled. + Reviewed by: otaylor + + ChangeLog | 28 +++++++ + src/cairo-font-subset.c | 18 +++- + src/cairo-ft-font.c | 215 +++++++++++++++++++++++------------------------- + src/cairo-ft-private.h | 6 +- + 4 files changed, 150 insertions(+), 117 deletions(-) + +commit b45f68876528050107b6e8c4b24fb8edb7ded12e +Author: Carl Worth +Date: Wed Aug 3 10:32:50 2005 +0000 + + Fix for bug #3951: + Add new _CHECK_FUNCS_WITH_FLAGS to abstract out the pain of temporarily setting flags for AC_CHECK_FUNCS. Use this to check for the existence of FcFini. + Make call to FcFini conditional on HAVE_FCFINI. + Remove stale comment about cleaning up memory which is now handled by cairo-test.c. + + ChangeLog | 14 ++++++++++++++ + configure.in | 30 +++++++++++++++++++++++------- + test/cairo-test.c | 2 ++ + test/text-cache-crash.c | 14 -------------- + 4 files changed, 39 insertions(+), 21 deletions(-) + +commit ba87f1324fda84ea816ad8f18442444c2ad1ed93 +Author: Billy Biggs +Date: Mon Aug 1 18:01:24 2005 +0000 + + Optimize spans where the same value is being added to multiple pixels. This improves the speed of rasterizing wide trapezoids. + Add an INLINE macro that matches the one from fbpict.h in xserver/fb. + + pixman/ChangeLog | 10 +++ + pixman/src/fbedge.c | 230 ++++++++++++++++++++++++++++++++++++++++++++++------ + pixman/src/icint.h | 6 ++ + 3 files changed, 220 insertions(+), 26 deletions(-) + +commit 500cc6fed1858d5e9240ce61bbbf00781ae4c097 +Author: Owen Taylor +Date: Mon Aug 1 14:39:01 2005 +0000 + + src/cairo-gstate.c src/cairo-gstate-private.h: Store the inverse CTM at the time of cairo_gstate_set_source() to "lock" the user space matrix. + Move the source pattern transformation to the outside of _cairo_gstate_clip_and_composite_trapezoids() instead of doing it at the leaves. + Change size of output surface for aesthetics. + Updated to correspond to the current definition. + Remove source-surface-scale-paint. + reviewed by: cworth + + ChangeLog | 23 +++++- + src/cairo-gstate-private.h | 1 + + src/cairo-gstate.c | 119 ++++++++++++++++++-------------- + test/Makefile.am | 1 - + test/source-surface-scale-paint-ref.png | Bin 147 -> 139 bytes + test/source-surface-scale-paint.c | 5 +- + 6 files changed, 91 insertions(+), 58 deletions(-) + +commit c525c684ca712c5c5acd5431ec061bfab364cef5 +Author: Carl Worth +Date: Mon Aug 1 13:33:47 2005 +0000 + + New public header file. + New function to reset all static data (eg. caches) to their initial state. + Fix check-valgrind target to depend on the 'all' target. + Add check for a new, proposed, XrmFinalize function. + Add cairo-debug.c. + Move the definition of CAIRO_BEGIN_DECLS to cairo-features.h so that it can be shared between public header files, and so that it doesn't clutter cairo.h + Implement reset_static_data in all modules as required. + Call cairo_debug_reset_static_data and FcFini so that we can have all tests be valgrind-clean with respect to memory leaks and still-reachable data. + + ChangeLog | 55 ++++++++++++++++++++++++++++++++++++ + Makefile.am | 3 ++ + configure.in | 7 +++++ + src/Makefile.am | 1 + + src/cairo-debug.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-debug.h | 48 +++++++++++++++++++++++++++++++ + src/cairo-features.h.in | 8 ++++++ + src/cairo-font.c | 39 ++++++++++++++++++++------ + src/cairo-ft-font.c | 13 +++++++++ + src/cairo-xlib-screen.c | 53 +++++++++++++++++++++++++++++------ + src/cairo-xlib-surface.c | 26 +++++++++++++++-- + src/cairo.h | 8 ------ + src/cairoint.h | 13 +++++++++ + test/cairo-test.c | 6 ++++ + test/cairo-test.h | 1 + + test/xlib-surface.c | 2 ++ + 16 files changed, 329 insertions(+), 27 deletions(-) + +commit 480951827e567db89f88e71e7ba20f4fa4633c1b +Author: Owen Taylor +Date: Mon Aug 1 11:45:42 2005 +0000 + + src/cairo.h src/cairoint.h src/cairo-surface.c: Add cairo_mark_dirty[_rectangle]() and cairo_flush() for + Implement a cairo_flush() that restores the original clip. Also restore the original flush when a surface is finished. + Check off the item. + + ChangeLog | 11 +++++ + ROADMAP | 2 +- + doc/public/cairo-sections.txt | 3 ++ + doc/public/tmpl/cairo-surface.sgml | 28 +++++++++++ + src/cairo-surface.c | 97 +++++++++++++++++++++++++++++++++++++- + src/cairo-win32-surface.c | 16 +++++-- + src/cairo.h | 13 +++++ + src/cairoint.h | 11 +++++ + 8 files changed, 176 insertions(+), 5 deletions(-) + +commit 392a2746ef051d16be303477170511ef38dcf753 +Author: Amaury Jacquot +Date: Mon Aug 1 06:57:09 2005 +0000 + + fix typo + + pixman/ChangeLog | 4 ++++ + pixman/NEWS | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit cd78d99642bdf1171d21083a6947c77ff00b599e +Author: Billy Biggs +Date: Sun Jul 31 11:19:47 2005 +0000 + + Support versions of freetype without exact FT_Bitmap_Size.x/y_ppem values by using the pixel width and height values instead. + Add a check for FT_Bitmap_Size.y_ppem. + reviewed by: keithp + + ChangeLog | 10 ++++++++++ + configure.in | 14 ++++++++++++++ + src/cairo-ft-font.c | 8 +++++++- + 3 files changed, 31 insertions(+), 1 deletion(-) + +commit b4ae3371b34ca67e98df5e73147adcd6b7853e1d +Author: Billy Biggs +Date: Sun Jul 31 11:03:35 2005 +0000 + + Cast away the const on the nil surface to avoid a compiler warning. + + ChangeLog | 5 +++++ + src/cairo-quartz-surface.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 31e0d694294ef17037a0b464615916e065a81385 +Author: Billy Biggs +Date: Sat Jul 30 22:21:12 2005 +0000 + + Pass the options down to the scaled font object to keep things compiling. + + ChangeLog | 5 +++++ + src/cairo-atsui-font.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit b47c0050f985856d0c47a43d3a1b3cc8f18dbd32 +Author: Keith Packard +Date: Sat Jul 30 12:57:54 2005 +0000 + + Replace wide integer divide algorithms with trivial bit-at-a-time code. Original code was of unclear provenance, this new code is completely different. + + ChangeLog | 11 ++ + src/cairo-wideint.c | 461 ++++++---------------------------------------------- + src/cairo-wideint.h | 6 +- + 3 files changed, 60 insertions(+), 418 deletions(-) + +commit 05d84a0a1e1f4f4cb750ab6828a1e09ffa73b0f0 +Author: Jeff Muizelaar +Date: Sat Jul 30 10:23:21 2005 +0000 + + Finish up merging the optimization work from jaymz. + + pixman/ChangeLog | 10 ++ + pixman/src/ic.c | 316 +++++++++++++++++++++++-------------------------- + pixman/src/icblt.c | 4 +- + pixman/src/iccompose.c | 13 +- + 4 files changed, 170 insertions(+), 173 deletions(-) + +commit bdfb7f4db0b48cf3882241b4b547082f68410567 +Author: Jeff Muizelaar +Date: Sat Jul 30 09:43:51 2005 +0000 + + s/uint(8|16|32)_t/CARD(8|16|32)/ + + pixman/ChangeLog | 17 +++ + pixman/src/iccompose.c | 280 ++++++++++++++++++++++++------------------------- + 2 files changed, 157 insertions(+), 140 deletions(-) + +commit 5ebf2c5d967fb84a2e102254421057af9bcd307a +Author: Jeff Muizelaar +Date: Sat Jul 30 08:48:25 2005 +0000 + + Add some optimizations from jaymz. Also adds some compile warnings that will hopefully go away as we continue merging. + + pixman/ChangeLog | 9 + + pixman/src/ic.c | 595 +++++++++++++++++++++++++++++++++++++++++++++---------- + 2 files changed, 504 insertions(+), 100 deletions(-) + +commit 172e535ee05ab725ed1a951b31077843d112e7ca +Author: Carl Worth +Date: Fri Jul 29 15:35:19 2005 +0000 + + Remove completed 0.6 tasks. Add cairo_surface_flush to the cairo_surface_mark_dirty task. + + ChangeLog | 5 +++++ + ROADMAP | 25 ++++--------------------- + 2 files changed, 9 insertions(+), 21 deletions(-) + +commit ef4209a8a1fdcf7226bec2c6481a4f8239d63ec3 +Author: Tor Lillqvist +Date: Fri Jul 29 15:31:48 2005 +0000 + + src/cairo-quartz-surface.c (_cairo_quartz_surface_acquire_dest_image): Minor updates to keep quartz backend limping along. + + ChangeLog | 6 ++++++ + src/cairo-atsui-font.c | 1 + + src/cairo-quartz-surface.c | 3 ++- + 3 files changed, 9 insertions(+), 1 deletion(-) + +commit 449087745b520c64113102f5c62bc5a8beba6c98 +Author: Owen Taylor +Date: Fri Jul 29 12:45:01 2005 +0000 + + src/cairo-font.c src/cairo-ft-font.c src/cairo-win32-font.c src/cairoint.h: Move the font options into the base cairo_scaled_font_t object so that we have them available to use when we are removing a scaled font from the cache. (http://bugzilla.gnome.org/show_bug.cgi?id=#311299, Ali Akcaagac, Behdad Esfahbod) + + ChangeLog | 9 +++++++++ + src/cairo-font.c | 8 ++++++++ + src/cairo-ft-font.c | 7 ++----- + src/cairo-win32-font.c | 4 +--- + src/cairoint.h | 17 ++++++++++------- + 5 files changed, 30 insertions(+), 15 deletions(-) + +commit a0ca6026ad0ea049198e17dbda379d4737078053 +Author: Carl Worth +Date: Thu Jul 28 15:58:09 2005 +0000 + + Run the mask pattern through the CTM in the same way as the source pattern. This fixes the bug demonstrated by the mask-ctm and mask-surface-ctm tests so they should no longer fail. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 16 ++++++++++------ + 2 files changed, 17 insertions(+), 6 deletions(-) + +commit 26289b366434103eda1dd619d8bad0e9394724d6 +Author: Carl Worth +Date: Thu Jul 28 15:55:00 2005 +0000 + + Add two new tests: mask-ctm mask-surface-ctm demonstrating that masks are not currently being modified by the CTM. + + ChangeLog | 13 +++++++ + test/.cvsignore | 2 ++ + test/Makefile.am | 6 ++++ + test/mask-ctm-ref.png | Bin 0 -> 129 bytes + test/mask-ctm.c | 82 ++++++++++++++++++++++++++++++++++++++++++ + test/mask-surface-ctm-ref.png | Bin 0 -> 129 bytes + test/mask-surface-ctm.c | 75 ++++++++++++++++++++++++++++++++++++++ + 7 files changed, 178 insertions(+) + +commit 5f6c5026e66c6325f2decf25300abede587fa4dc +Author: Carl Worth +Date: Thu Jul 28 15:38:50 2005 +0000 + + CC gnome-announce-list@gnome.org on cairo release announcements. + + ChangeLog | 5 +++++ + RELEASING | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 3dd93a930f618df42f71c5961764753d0d53306b +Author: Carl Worth +Date: Thu Jul 28 14:58:25 2005 +0000 + + Add -head to LIBPIXMAN_VERSION after tagging with SNAPSHOT_0_1_6. + + pixman/ChangeLog | 5 +++++ + pixman/RELEASING | 2 +- + pixman/configure.in | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit 6d8d18e2dcdb2c829ec25659c1397f258c6b5a6b +Author: Carl Worth +Date: Thu Jul 28 14:41:36 2005 +0000 + + Add notes for snapshot 0.1.6. + Increment version to 0.1.6. + + pixman/ChangeLog | 6 ++++++ + pixman/NEWS | 24 ++++++++++++++++++++++++ + pixman/configure.in | 2 +- + 3 files changed, 31 insertions(+), 1 deletion(-) + +commit 61e28ec71f5492671d633ccf9459b6654f33edd6 +Author: Carl Worth +Date: Thu Jul 28 12:45:26 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_6_0. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit b9861b3e877776c5fe5b8b30fe76ced8ff846923 +Author: Carl Worth +Date: Thu Jul 28 11:51:38 2005 +0000 + + Added notes for snapshot 0.6.0 + Increment CAIRO_VERSION to 0.6.0 + + ChangeLog | 6 +++ + NEWS | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 3 files changed, 153 insertions(+), 1 deletion(-) + +commit 0e0f2571a4e6a1d99f8a3fe6e357cb49a51c30e2 +Author: Carl Worth +Date: Thu Jul 28 11:46:01 2005 +0000 + + Remove const qualifiers that only make things happy with a from-cvs version of freetype. Now we should be back to being happy with a released version. + + ChangeLog | 11 +++++++++++ + src/cairo-ft-font.c | 10 +++++----- + 2 files changed, 16 insertions(+), 5 deletions(-) + +commit d4056b1d1570f1e7c8636a54d2cd1b2a2ca8eb9c +Author: Carl Worth +Date: Thu Jul 28 11:42:33 2005 +0000 + + Add missing cast. + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 08e810f5c1d2c71eb44a800ac6e4b334436aa5cf +Author: Carl Worth +Date: Thu Jul 28 11:41:37 2005 +0000 + + Remove text-antialias-subpixel-ref.png from the list since it doesn't exist yet. + + ChangeLog | 6 ++++++ + test/Makefile.am | 1 - + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 3f385a0330f4cf5775feada0cac1df9ef165a539 +Author: Carl Worth +Date: Thu Jul 28 11:34:47 2005 +0000 + + More doc/public/tmpl churn. + + ChangeLog | 4 ++++ + doc/public/tmpl/cairo.sgml | 1 + + 2 files changed, 5 insertions(+) + +commit 1481fa5132ab66de40de270668024bc07ed64bcf +Author: Carl Worth +Date: Thu Jul 28 11:33:11 2005 +0000 + + Add text-antialias-{gray|none|subpixel}-ref.png so they get distributed. + + ChangeLog | 6 ++++++ + test/Makefile.am | 3 +++ + 2 files changed, 9 insertions(+) + +commit e604017c77e5c4b755d447b6efdf489417002986 +Author: Dave Beckett +Date: Thu Jul 28 11:22:36 2005 +0000 + + Use cairo_surface_status(image) instead of testing for NULL from cairo_image_surface_create_from_png to enable testing when srcdir != builddir again. + + ChangeLog | 7 +++++++ + test/cairo-test.c | 7 +++++-- + 2 files changed, 12 insertions(+), 2 deletions(-) + +commit ddae93c72c15bca63931d3db6cfa2d2e8d368e7d +Author: Carl Worth +Date: Thu Jul 28 10:51:37 2005 +0000 + + Note that consistent error handling is done now. + + ChangeLog | 4 ++++ + NEWS | 6 ++++++ + ROADMAP | 7 ++----- + 3 files changed, 12 insertions(+), 5 deletions(-) + +commit 6efd4bf4d5f0f788db4020facb556d5b6aac1e6e +Author: Carl Worth +Date: Thu Jul 28 10:47:40 2005 +0000 + + Fix to call _cairo_error and return 0 on surface-type mismatch. + + ChangeLog | 6 ++++++ + src/cairo-image-surface.c | 10 ++++++++++ + 2 files changed, 16 insertions(+) + +commit 1e66aee352d092cbd39cac196cdf1b3681ec4c17 +Author: Owen Taylor +Date: Thu Jul 28 10:43:27 2005 +0000 + + configure.in Makefile.am: Skip tests/ directory if libpng was disabled. (#3423, reported by Steve Chaplin) + + ChangeLog | 5 +++++ + Makefile.am | 8 +++++++- + configure.in | 2 ++ + 3 files changed, 14 insertions(+), 1 deletion(-) + +commit a83124a3eeff1602c199a961b36d75a51ce96843 +Author: Carl Worth +Date: Thu Jul 28 10:41:08 2005 +0000 + + Fix so that one of three different error status values will be returned: + CAIRO_STATUS_NO_MEMORY CAIRO_STATUS_FILE_NOT_FOUND CAIRO_STATUS_READ_ERROR + Add new CAIRO_STATUS_FILE_NOT_FOUND. + Add new _cairo_surface_nil_read_error and _cairo_surface_nil_file_not_found. + Test the new FILE_NOT_FOUND error. + + ChangeLog | 21 +++++++++++++++++++++ + src/cairo-png.c | 32 +++++++++++++++++++++----------- + src/cairo-surface.c | 32 ++++++++++++++++++++++++++++++++ + src/cairo.c | 4 +++- + src/cairo.h | 4 +++- + src/cairoint.h | 2 ++ + test/create-from-png.c | 13 +++++++++++-- + 7 files changed, 93 insertions(+), 15 deletions(-) + +commit fe44b2406d30fc89ac6579bdd749b5c76e9257d8 +Author: Stuart Parmenter +Date: Thu Jul 28 10:37:41 2005 +0000 + + src/cairo-win32-font.c + src/cairo-win32-surface.c Use surface->base.status instead of just surface on cairo_win32_surface_t *s + + ChangeLog | 7 +++++++ + src/cairo-win32-font.c | 4 ++-- + src/cairo-win32-surface.c | 2 +- + 3 files changed, 10 insertions(+), 3 deletions(-) + +commit cff61fbf0d85dfdebd8b522f8efda02ec2da412f +Author: Owen Taylor +Date: Thu Jul 28 10:24:59 2005 +0000 + + Disable PS surface build if no freetyp + + ChangeLog | 4 ++++ + configure.in | 51 ++++++++++++++++++++++++++++----------------------- + 2 files changed, 32 insertions(+), 23 deletions(-) + +commit 9c70498e72f86937e02101a13d02b429fb47efd2 +Author: Owen Taylor +Date: Thu Jul 28 10:15:35 2005 +0000 + + Pass + -1 not 1 to RestoreDC to restore to the last SaveDC. (#3905, Stuart Parmenter + + ChangeLog | 6 ++++++ + src/cairo-win32-font.c | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 95beb7be6720230f65c2d2c642efd71cbbc92873 +Author: Owen Taylor +Date: Thu Jul 28 10:02:54 2005 +0000 + + Patch from Martin Kretzschmar , #3798 + prevent sign-extension of masks.*_mask on 64bit architectures. + ditto. + + ChangeLog | 9 +++++++++ + src/cairo-xcb-surface.c | 8 ++++---- + src/cairo-xlib-surface.c | 8 ++++---- + 3 files changed, 17 insertions(+), 8 deletions(-) + +commit 02c6aec91df93f523768e8bb6ff20c0fc0bc18fb +Author: Owen Taylor +Date: Thu Jul 28 09:54:03 2005 +0000 + + dest_image) src/cairo-quartz-surface.c (_cairo_quartz_surface_acquire_dest_image) src/cairo-xcb-surface.c (_cairo_xcb_surface_acquire_source,dest_image): src/cairo-xlib-surface.c (_cairo_xlib_surface_acquire_source,dest_image): Set image_extra to NULL to avoid purify warnings. (#3777, Stuart Parmenter) + + ChangeLog | 8 ++++++++ + src/cairo-image-surface.c | 4 +++- + src/cairo-quartz-surface.c | 1 + + src/cairo-xcb-surface.c | 2 ++ + src/cairo-xlib-surface.c | 4 +++- + 5 files changed, 17 insertions(+), 2 deletions(-) + +commit 5d7c796c1830663772dd681026e2d5dd952826b8 +Author: Carl Worth +Date: Thu Jul 28 09:46:38 2005 +0000 + + Remove all create_in_error functions as they were just muddling up the memory management semantics: + _cairo_path_data_create_in_error _cairo_pattern_create_in_error _cairo_surface_create_in_error + Don't bother with extra check of other->status to anticipate and try to prevent cairo_surface_create_similar from returning through cairo_surface_create_in_error. + Just return &_cairo_surface|pattern|path_nil rather than _cairo_surface|pattern|path_create_in_error. + After checking surface->status from a cairo__surface_create function, just return CAIRO_STATUS_NO_MEMORY since that's the only error we'll get from one of these create functions. + Remove unnecessary check for gstate == NULL; + Fix old check for image == NULL instead of image->base.status. + Add missing check of surface->image_base.status after creating surface->image. + Add missing check of surface->base.status after creating surface. + + ChangeLog | 67 +++++++++++++++++++++++++++++++++++++++++ + doc/public/tmpl/cairo-font.sgml | 1 + + src/cairo-ft-font.c | 6 ++-- + src/cairo-glitz-surface.c | 16 +++++----- + src/cairo-gstate.c | 25 +++------------ + src/cairo-image-surface.c | 4 +-- + src/cairo-path-data-private.h | 5 ++- + src/cairo-path-data.c | 34 +-------------------- + src/cairo-pattern.c | 37 ++--------------------- + src/cairo-png.c | 20 +++++++----- + src/cairo-ps-surface.c | 8 ++--- + src/cairo-quartz-surface.c | 5 +++ + src/cairo-surface.c | 46 ++++++++++++---------------- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 7 +++-- + src/cairo-xcb-surface.c | 6 +++- + src/cairo-xlib-surface.c | 12 ++++++-- + src/cairo.c | 44 ++++++++++++--------------- + src/cairoint.h | 8 ++--- + 19 files changed, 173 insertions(+), 180 deletions(-) + +commit b9fe1b74665e528e6114bd833028a8f62ecfa869 +Author: Owen Taylor +Date: Thu Jul 28 09:29:46 2005 +0000 + + src/cairo-font.c src/cairoint.h: Define _cairo_font_face_nil. (cairo_font_face_reference, cairo_font_face_destroy cairo_font_face_set_user_data): Handle a nil font face. (cairo_font_face_status): New function. + src/cairo-ft-font.c (cairo_ft_font_face_create_for_pattern): src/cairo-ft-font.c (cairo_ft_font_face_create_for_ft_face): src/cairo-win32-font.c (cairo_win32_font_face_create_for_logfontw): Return _cairo_font_face_nil on out-of-memory. + Check return of _cairo_simple_font_face_create(). + Error out if font_face has a status. + Handle a nil surface. + + ChangeLog | 23 ++++++++++++++++++++ + src/cairo-font.c | 57 +++++++++++++++++++++++++++++++++++++++++++------- + src/cairo-ft-font.c | 26 +++++++++++++++++------ + src/cairo-gstate.c | 21 ++++++++++++------- + src/cairo-surface.c | 3 +++ + src/cairo-win32-font.c | 6 ++++-- + src/cairo.h | 3 +++ + src/cairoint.h | 3 +++ + 8 files changed, 120 insertions(+), 22 deletions(-) + +commit d7699f0c072a6820007280a167b86a95adf8a54e +Author: Owen Taylor +Date: Wed Jul 27 19:13:39 2005 +0000 + + Remove text-antialias-none which is now fixed. + No longer xfail. + + ChangeLog | 7 +++++++ + test/Makefile.am | 1 - + test/text-antialias-none.c | 3 +-- + 3 files changed, 8 insertions(+), 3 deletions(-) + +commit 7143d8b7aee74ed4d75985158bf3dda147f3d21d +Author: Owen Taylor +Date: Wed Jul 27 16:23:11 2005 +0000 + + Go back to returning NULL. + src/cairoint.h src/cairo-ft-font.c: Stop exporting _cairo_scaled_font_nil, since we dont' need it publically any more. + return surface->status not status. (Fixes warning) + + ChangeLog | 13 +++++++++++++ + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 4 ++-- + src/cairo-surface.c | 2 +- + src/cairo-win32-font.c | 6 ++---- + src/cairoint.h | 2 -- + 6 files changed, 19 insertions(+), 10 deletions(-) + +commit 2b5d9c8e007f4198b1c48bce53491842f065a759 +Author: Carl Worth +Date: Wed Jul 27 15:39:34 2005 +0000 + + Add CAIRO_STATUS_INVALID_CONTENT, CAIRO_STATUS_INVALID_FORMAT, and CAIRO_STATUS_INVALID_VISUAL. + Change functions to return type of void: + cairo_scaled_font_extents cairo_surface_finish + Add new functions to query object status: + cairo_scaled_font_status cairo_surface_status + Implementation of new error handling scheme for cairo_surface_t and cairo_scaled_font_t. + Track change in return value of cairo_surface_finish. + + ChangeLog | 42 +++++ + doc/public/tmpl/cairo-surface.sgml | 1 + + doc/public/tmpl/cairo.sgml | 3 + + src/cairo-array.c | 5 + + src/cairo-atsui-font.c | 3 - + src/cairo-font.c | 113 +++++++++++-- + src/cairo-ft-font.c | 35 ++-- + src/cairo-glitz-surface.c | 63 +++++--- + src/cairo-gstate.c | 38 +++-- + src/cairo-image-surface.c | 76 +++++---- + src/cairo-meta-surface.c | 6 +- + src/cairo-path-data.c | 2 + + src/cairo-pattern.c | 83 ++++++++-- + src/cairo-pdf-surface.c | 24 ++- + src/cairo-png.c | 38 +++-- + src/cairo-ps-surface.c | 69 ++++---- + src/cairo-quartz-surface.c | 17 +- + src/cairo-surface.c | 322 +++++++++++++++++++++++++++--------- + src/cairo-win32-font.c | 17 +- + src/cairo-win32-surface.c | 42 +++-- + src/cairo-xcb-surface.c | 33 ++-- + src/cairo-xlib-surface.c | 52 +++--- + src/cairo.c | 323 ++++++++++++++++++++----------------- + src/cairo.h | 14 +- + src/cairoint.h | 28 +++- + test/surface-finish-twice.c | 9 +- + 26 files changed, 994 insertions(+), 464 deletions(-) + +commit c884c4c541abe380500e24a55ec017677d56db19 +Author: Owen Taylor +Date: Wed Jul 27 15:04:03 2005 +0000 + + Turn off antialiasing for rendering to alpha surfaces. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 9 ++++++--- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit 7b2b9df4e7b3c76b4dd40f865d7b6c55d3a0747c +Author: Owen Taylor +Date: Wed Jul 27 14:11:58 2005 +0000 + + Fix units for stride return to be FbStip-sized. : ---------------------------------------------------------------------- + + pixman/ChangeLog | 5 +++++ + pixman/src/icint.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 255913de9ef5da40604d55ca8d0d53ac606f7710 +Author: Carl Worth +Date: Wed Jul 27 13:28:15 2005 +0000 + + Note that the XFAIL tests all need to be fixed before 1.0. + Add three new tests for testing the various antialiasing options for text rendering. + + ChangeLog | 15 +++++++ + ROADMAP | 4 ++ + test/.cvsignore | 3 ++ + test/Makefile.am | 8 ++++ + test/text-antialias-gray-ref.png | Bin 0 -> 723 bytes + test/text-antialias-gray.c | 77 ++++++++++++++++++++++++++++++++++++ + test/text-antialias-none-ref.png | Bin 0 -> 277 bytes + test/text-antialias-none.c | 78 +++++++++++++++++++++++++++++++++++++ + test/text-antialias-subpixel.c | 82 +++++++++++++++++++++++++++++++++++++++ + 9 files changed, 267 insertions(+) + +commit 8cb451962b4be046024264fd6251f26ea1bf033c +Author: Carl Worth +Date: Wed Jul 27 09:23:29 2005 +0000 + + Fix typo that caused cairo_image_surface_create_from_png_stream to segfault. Closes bug #3863 (thanks to Steve Chaplin). + Add a test to actually call cairo_image_surface_create_from_png_stream. + + ChangeLog | 13 +++++ + src/cairo-png.c | 2 +- + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/create-from-png-stream-ref.png | Bin 0 -> 100 bytes + test/create-from-png-stream.c | 95 ++++++++++++++++++++++++++++++++++++ + test/create-from-png.c | 4 +- + 7 files changed, 116 insertions(+), 2 deletions(-) + +commit e859afecceb9e22ab8f42ca533c37a71b7ccec51 +Author: Owen Taylor +Date: Wed Jul 27 06:45:37 2005 +0000 + + Deal with glyphs with entry->im->image NULL. (This can happen if fonts have size-zero bitmaps for some characters, for example) (http://bugzilla.gnome.org/show_bug.cgi?id=311709, Sangu Kim) + + ChangeLog | 7 +++++ + src/cairo-xlib-surface.c | 73 ++++++++++++++++++++++++++++++++---------------- + 2 files changed, 56 insertions(+), 24 deletions(-) + +commit e056a72ec8316fa586d18d771923ace44c56291c +Author: Owen Taylor +Date: Wed Jul 27 04:07:46 2005 +0000 + + FreeType bitmaps may only be padded out to 8-bit boundaries, not 32-bit boundaries. (_render_glyph_bitmap): Fix sign error in using glyphslot->bitmap_left + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 21 +++++++++++++++++++-- + 2 files changed, 25 insertions(+), 2 deletions(-) + +commit 1467168326b57f11ae7080e8d9fc3816b6dc3a3c +Author: David Reveman +Date: Tue Jul 26 22:36:00 2005 +0000 + + Fix infinite loop bug in xlib backend + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit ea1218a434fb4077d27a4d8310e4ce3415102c58 +Author: Carl Worth +Date: Mon Jul 25 16:23:05 2005 +0000 + + Replace all occurences of refcount with ref_count. + Replace refcounted with reference-counted. + + ChangeLog | 12 ++++++++++++ + doc/public/language-bindings.xml | 2 +- + src/cairo-font.c | 20 ++++++++++---------- + src/cairo-ft-font.c | 4 ++-- + src/cairo-glitz-surface.c | 10 +++++----- + src/cairo-pdf-surface.c | 10 +++++----- + src/cairoint.h | 6 +++--- + 7 files changed, 38 insertions(+), 26 deletions(-) + +commit 85b74d82164e7908842d42bb1b11e8cf8c876b82 +Author: Owen Taylor +Date: Mon Jul 25 12:29:23 2005 +0000 + + src/cairo.[ch] src/cairo-gstate-private.h src/cairo-gstate.c src/cairoint.c: Add cairo_{get,set}_font_options(). + Add cairo-xlib-private.h + Update + reviewed by: cworth + + ChangeLog | 11 +++++++++ + doc/public/Makefile.am | 1 + + doc/public/cairo-sections.txt | 2 ++ + doc/public/tmpl/cairo-xlib-xrender.sgml | 1 + + doc/public/tmpl/cairo-xlib.sgml | 1 + + doc/public/tmpl/cairo.sgml | 18 ++++++++++++++ + src/cairo-font-options.c | 2 +- + src/cairo-gstate-private.h | 1 + + src/cairo-gstate.c | 22 +++++++++++++++++ + src/cairo.c | 43 +++++++++++++++++++++++++++++++++ + src/cairo.h | 8 ++++++ + src/cairoint.h | 8 ++++++ + 12 files changed, 117 insertions(+), 1 deletion(-) + +commit fcd8867a47ce77163def423a37bb517870f6cc35 +Author: Owen Taylor +Date: Sun Jul 24 05:18:15 2005 +0000 + + Fix size of allocated buffer for vertical subpixel rendering. (Reported by Fryderyk Dziarmagowski, http://bugzilla.gnome.org/show_bug.cgi?id=310935) (_get_pattern_load_flags): Fix a problem where we were OR'ing multiple FT_LOAD_* flags together. + Fix reversed check for subpixel or not. + + ChangeLog | 11 +++++++++++ + src/cairo-ft-font.c | 20 +++++++++++++------- + src/cairo-xlib-screen.c | 2 +- + 3 files changed, 25 insertions(+), 8 deletions(-) + +commit 55e2a0a03128bff86765b14179dd87af792dc4cc +Author: Carl Worth +Date: Sat Jul 23 10:05:54 2005 +0000 + + Testing UseNewInfoFtmStrings hack + +commit c8d754803181105c53cd389c0dd762dd473630fb +Author: Carl Worth +Date: Sat Jul 23 09:54:54 2005 +0000 + + Testing UseNewInfoFtmStrings hack + +commit d527428bb6775c82b3c0cc6cbb364f08317a3d17 +Author: Malcolm Tredinnick +Date: Sat Jul 23 09:48:13 2005 +0000 + + Slight change to previous commit based on feedback from cworth. + + src/cairo.h | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 563dddd81cc06f1d17c1a6880b4e6a3e5d05da97 +Author: Malcolm Tredinnick +Date: Sat Jul 23 09:36:00 2005 +0000 + + Add some missing parameters for API docs. + + ChangeLog | 5 +++++ + src/cairo-ft-font.c | 9 +++++---- + src/cairo.h | 33 +++++++++++++++++++++++++++------ + 3 files changed, 37 insertions(+), 10 deletions(-) + +commit 9fb898898ed3bc6458a365eac43861f1a77a08d0 +Author: Owen Taylor +Date: Sat Jul 23 05:37:23 2005 +0000 + + src/cairo-xlib-private.h src/cairo-xlib-screen.c: Switch to using Screen * not screen number to match surface code. + Get the screen info for the right screen for the surface. + + ChangeLog | 8 ++++++++ + src/cairo-xlib-private.h | 4 ++-- + src/cairo-xlib-screen.c | 5 +++-- + src/cairo-xlib-surface.c | 2 +- + 4 files changed, 14 insertions(+), 5 deletions(-) + +commit 399b00a99b2bbc1c56a05974c936aa69a08021f5 +Author: Owen Taylor +Date: Fri Jul 22 15:15:15 2005 +0000 + + Protect against division by zero in various places. (http://bugzilla.gnome.org/show_bug.cgi?id=311299, reported by Ali Akcaag + + ChangeLog | 5 ++++ + src/cairo-ft-font.c | 70 ++++++++++++++++++++++++++++++++++++++--------------- + 2 files changed, 55 insertions(+), 20 deletions(-) + +commit 5fb1c8033358f45c523b07be6b7e36c91e772a58 +Author: Owen Taylor +Date: Fri Jul 22 07:15:57 2005 +0000 + + Patch from Tor Lillqvist + Define TT_PRIM_CSPLINE if it wasn't in the headers. (_get_system_quality): Add missing variable smoothing_type. + + ChangeLog | 8 ++++++++ + src/cairo-win32-font.c | 4 ++++ + 2 files changed, 12 insertions(+) + +commit e9c321e66bb2b813783b1504011eb70bf8bdb3f6 +Author: Carl Worth +Date: Fri Jul 22 06:20:53 2005 +0000 + + Initial import of preliminary tutorial pieces. + + doc/tutorial/slides/.cvsignore | 7 + + doc/tutorial/slides/Makefile | 7 + + doc/tutorial/slides/cairo-blank.svg | 487 +++++++++++++++++++++++++ + doc/tutorial/slides/cairo-code.svg | 508 +++++++++++++++++++++++++++ + doc/tutorial/slides/cairo-separator.svg | 491 ++++++++++++++++++++++++++ + doc/tutorial/slides/cairo-title.svg | 373 ++++++++++++++++++++ + doc/tutorial/slides/cairo.svg | 508 +++++++++++++++++++++++++++ + doc/tutorial/slides/circle-cairo-large.png | Bin 0 -> 3362 bytes + doc/tutorial/slides/circle-cairo.png | Bin 0 -> 1429 bytes + doc/tutorial/slides/circle-ooo-large.png | Bin 0 -> 1491 bytes + doc/tutorial/slides/circle-ooo.png | Bin 0 -> 383 bytes + doc/tutorial/slides/expander-fuzzy-large.png | Bin 0 -> 1300 bytes + doc/tutorial/slides/expander-fuzzy.png | Bin 0 -> 296 bytes + doc/tutorial/slides/expander-sharp-large.png | Bin 0 -> 929 bytes + doc/tutorial/slides/expander-sharp.png | Bin 0 -> 183 bytes + doc/tutorial/slides/fuzzies.svg | 11 + + doc/tutorial/slides/jaggies.svg | 11 + + doc/tutorial/slides/tutorial.xml | 468 ++++++++++++++++++++++++ + doc/tutorial/src/.cvsignore | 7 + + doc/tutorial/src/Makefile | 30 ++ + doc/tutorial/src/cairo-tutorial-gtk.h | 116 ++++++ + doc/tutorial/src/cairo-tutorial-pdf.h | 74 ++++ + doc/tutorial/src/cairo-tutorial-png.h | 74 ++++ + doc/tutorial/src/cairo-tutorial-xlib.h | 219 ++++++++++++ + doc/tutorial/src/cairo-tutorial.h | 41 +++ + doc/tutorial/src/circle.c | 22 ++ + doc/tutorial/src/expander.c | 16 + + 27 files changed, 3470 insertions(+) + +commit dd9d984ab90904f47faaf6d3de900c136add010e +Author: Carl Worth +Date: Fri Jul 22 02:04:59 2005 +0000 + + Get the case right. It's cairo, not Cairo. + + ChangeLog | 4 ++++ + src/cairoint.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit a7b38c6826fe6f9d9a02ed94ddd5d955313f9c78 +Author: Carl Worth +Date: Thu Jul 21 21:02:11 2005 +0000 + + Note that sub-pixel text rendering is done now. + + ChangeLog | 4 ++++ + ROADMAP | 7 +++---- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 857c9fe1c4808ffe534de7eff0d3479cc439fbea +Author: Owen Taylor +Date: Thu Jul 21 18:12:21 2005 +0000 + + The FT_LOAD_TARGET_* flags aren't separate bitfields, but rather an embedded subfield, so test with FT_LOAD_TARGET_MODE (val->key.flags) == FT_RENDER_LCD, and similar. + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 8 ++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 3c0bfb39758172cca78611338de1848ea9595522 +Author: Keith Packard +Date: Thu Jul 21 14:31:28 2005 +0000 + + Add ARGB glyph support. + Change Bi-level glyph support to use A1 format. + Support bit/byte swapping of glyph image data in the Xlib backend. + reviewed by: cworth, otaylor + + ChangeLog | 24 ++++ + src/cairo-ft-font.c | 325 ++++++++++++++++++++++++++++++++++++++++------- + src/cairo-xlib-surface.c | 218 ++++++++++++++++++++++++++++--- + src/cairoint.h | 4 - + 4 files changed, 504 insertions(+), 67 deletions(-) + +commit a3ad7dc0b9f3495d7797653ba2ffb326e92393fa +Author: Carl Worth +Date: Thu Jul 21 11:26:31 2005 +0000 + + Whitespace fixes. + + ChangeLog | 5 +++++ + src/cairo-ft.h | 5 +++-- + src/cairo-quartz.h | 6 +++--- + 3 files changed, 11 insertions(+), 5 deletions(-) + +commit 9c6299c164e567311816a129125cf3a86148c018 +Author: David Reveman +Date: Thu Jul 21 08:50:20 2005 +0000 + + Fix empty glyph issue in glitz backend + + ChangeLog | 5 +++++ + src/cairo-glitz-surface.c | 9 ++++++--- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit b3dfbe94c3ec7713904cf5bd1872a0480f96f03a +Author: Keith Packard +Date: Thu Jul 21 08:45:57 2005 +0000 + + Add cairo_xlib_surface_set_drawable which changes the target drawable for an xlib cairo_t to another which shares the same format, screen and display. + reviewed by: otaylor, cworth + + ChangeLog | 11 +++++++++++ + ROADMAP | 2 +- + src/cairo-xlib-surface.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib.h | 6 ++++++ + 4 files changed, 62 insertions(+), 1 deletion(-) + +commit 464ce69689045614a0c44037c77e1261c3fecda5 +Author: Carl Worth +Date: Thu Jul 21 07:41:20 2005 +0000 + + Note that cairo_font_options_t is done now. + + ChangeLog | 4 ++++ + ROADMAP | 10 +++------- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 075cf23cdc071b170e591fd07ff6c272d561d3ee +Author: Owen Taylor +Date: Thu Jul 21 06:52:13 2005 +0000 + + src/cairo-font-options.c src/cairo.h src/cairoint.h src/Makefile.am: Add an opaque cairo_font_options_t structure. + src/cairo-font.c src/cairo.h src/cairoint.h: Add a cairo_font_options_t object to cairo_scaled_font_create(). + src/cairo-surface.c src/cairoint.h: Add virtualized cairo_surface_get_font_options() to get the font options for a surface. + Adapt to cairo_scaled_font_create() change. + Add an implementation of get_font_options() that turns off metrics hinting. + src/cairo-xlib-screen.c src/cairo-xlib-private.h: Add a "screen info" structure that holds (for now) information about the default font options for the screen. + Implement get_font_options() + src/cairo-ft-font.c src/cairo-ft.h: Add functions to apply a cairo_font_options_t to a FcPattern or get the load flags for a cairo_font_options_t. + Adapt to font options additions. Add support for non-antialiased rendering of scalable fonts. Add support for turning off metrics hinting. + Adapt to font options additions. + doc/public/Makefile.am doc/public/cairo-sections.txt: Update. + reviewed by: cworth + + ChangeLog | 37 +++ + doc/public/Makefile.am | 3 + + doc/public/cairo-sections.txt | 29 ++- + doc/public/tmpl/cairo-font.sgml | 184 ++++++++++++++ + doc/public/tmpl/cairo-ft.sgml | 9 + + doc/public/tmpl/cairo-pattern.sgml | 23 ++ + doc/public/tmpl/cairo-surface.sgml | 13 +- + doc/public/tmpl/cairo.sgml | 27 +- + src/Makefile.am | 3 +- + src/cairo-font-options.c | 352 ++++++++++++++++++++++++++ + src/cairo-font.c | 32 ++- + src/cairo-ft-font.c | 504 ++++++++++++++++++++++++++----------- + src/cairo-ft.h | 3 + + src/cairo-gstate.c | 5 +- + src/cairo-pdf-surface.c | 13 +- + src/cairo-surface.c | 27 ++ + src/cairo-win32-font.c | 101 +++++--- + src/cairo-xlib-private.h | 54 ++++ + src/cairo-xlib-screen.c | 345 +++++++++++++++++++++++++ + src/cairo-xlib-surface.c | 22 +- + src/cairo.h | 154 +++++++++++- + src/cairoint.h | 17 ++ + 22 files changed, 1762 insertions(+), 195 deletions(-) + +commit a43c9eb7b0b73493735ffa176154073604da33e6 +Author: Carl Worth +Date: Thu Jul 21 00:35:07 2005 +0000 + + Finally grepped through and fixed up the last remaining calls to cairo_pattern_release_surface. + + ChangeLog | 11 ++++++++++ + src/cairo-glitz-surface.c | 56 ++++++++++++++++++++++++++++------------------- + 2 files changed, 44 insertions(+), 23 deletions(-) + +commit 133d7f0b441d3ba255a9a36163e7446f24f7601b +Author: Carl Worth +Date: Wed Jul 20 23:30:08 2005 +0000 + + Fix yet another file that I missed when I made the cairo_pattern_release_surface change. You would think that I would have grepped for all uses of this function by now. + + ChangeLog | 8 ++++++++ + src/cairo-xcb-surface.c | 6 +++--- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit 63331a8d9218424ecf176b0b34a53fc8723fede9 +Author: Carl Worth +Date: Wed Jul 20 21:54:35 2005 +0000 + + Mark cairo_xlib_surface_create as complete. Move cairo_xlib_surface_set_drawable from 0.6 to 1.0 since it is an API addition, not a change. + + ChangeLog | 6 ++++++ + ROADMAP | 16 ++++++++-------- + 2 files changed, 14 insertions(+), 8 deletions(-) + +commit 689fdfb6ea7460aec6283414a79bbf17a2d03eae +Author: Carl Worth +Date: Wed Jul 20 19:23:19 2005 +0000 + + Fix macro to not consider CAIRO_FORMAT_ARGB32 (==0) as a valid cairo_content_t. + + ChangeLog | 7 +++++++ + src/cairo.h | 8 +++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 88cf98fe334577fc3ecd84e179479b3b60f55c91 +Author: Keith Packard +Date: Wed Jul 20 18:52:31 2005 +0000 + + Add Screen* arguments to: + cairo_xlib_surface_create_with_xrender_format cairo_xlib_surface_create_for_bitmap + Required to correctly identify when two Xlib surfaces are compatible with Core and Render rendering requests. + cairo_xlib_surface_create can determine the screen given the required Visual * + reviewed by: otaylor + + ChangeLog | 27 +++++++++++ + src/cairo-xlib-surface.c | 116 +++++++++++++++++++++++++++++++++-------------- + src/cairo-xlib-xrender.h | 1 + + src/cairo-xlib.h | 1 + + test/cairo-test.c | 1 + + 5 files changed, 112 insertions(+), 34 deletions(-) + +commit d1b1167ec5f5d89bec9f27f1e253cad0baba3b98 +Author: Carl Worth +Date: Wed Jul 20 18:31:17 2005 +0000 + + Move all API changes from 1.0 to 0.6. Other 1.0 API issues are strictly additions. + + ChangeLog | 5 +++ + ROADMAP | 121 ++++++++++++++++++++------------------------------------------ + 2 files changed, 43 insertions(+), 83 deletions(-) + +commit b0b2f8021a6eb60c3b0d434f65f1c636540aeeb6 +Author: Carl Worth +Date: Mon Jul 18 14:36:39 2005 +0000 + + Add valgrind suppressions for libpng/libz use of uninitialized data. There are clearly bugs here that are not cairo's fault as zeroing the buffer before writing the png image actually causes more errors(\!). And, notably, setting all the data to random bytes usually makes the errors go away. + Change the check-valgrind target to include the .valgrind-suppresions file and to tee output into valgrind.log. + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cd587375e327da08b5da01beccb1ebb8bb2d1e3d +Author: Carl Worth +Date: Mon Jul 18 14:35:54 2005 +0000 + + Add valgrind suppressions for libpng/libz use of uninitialized data. There are clearly bugs here that are not cairo's fault as zeroing the buffer before writing the png image actually causes more errors(\!). And, notably, setting all the data to random bytes usually makes the errors go away. + Change the check-valgrind target to include the .valgrind-suppresions file and to tee output into valgrind.log. + + ChangeLog | 13 +++++++++++++ + test/.valgrind-suppressions | 26 ++++++++++++++++++++++++++ + test/Makefile.am | 2 +- + 3 files changed, 40 insertions(+), 1 deletion(-) + +commit 0adea66c73bb8dec0e45a900815d98c029221219 +Author: Carl Worth +Date: Mon Jul 18 11:51:42 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_5_2. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 0e40baa9a7bd08abd15bfdc666c6e2d21d791e82 +Author: Carl Worth +Date: Mon Jul 18 09:23:33 2005 +0000 + + Fix the quartz backend so that it at least compiles again. This change is slipped in before 0.5.2 was pushed out and tagged. + + ChangeLog | 8 ++++++++ + src/cairo-quartz-surface.c | 11 ++++------- + 2 files changed, 12 insertions(+), 7 deletions(-) + +commit b65393917cade57d65ef92aa3510d7e3724f476d +Author: Carl Worth +Date: Mon Jul 18 08:31:24 2005 +0000 + + Added notes for snapshot 0.5.2 + Increment CAIRO_VERSION to 0.5.2 + + ChangeLog | 6 +++++ + NEWS | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 3 files changed, 81 insertions(+), 1 deletion(-) + +commit f0fae1d1bcde4f469cf6e00272fd4530875d283f +Author: Carl Worth +Date: Mon Jul 18 08:23:21 2005 +0000 + + Fix leak of pattern. + + ChangeLog | 5 +++++ + test/composite-integer-translate-over-repeat.c | 1 + + 2 files changed, 6 insertions(+) + +commit 751e059f5c506138c478fbcc2e9dfe8e92aaa3ab +Author: Carl Worth +Date: Mon Jul 18 08:04:16 2005 +0000 + + Note some progress. + New helper function to help create an image surface from a PNG file, while taking the srcdir environment variable into consideration. Rename the pattern creating helper function to match. + Use new cairo_test_create_surface_from_png so that non-srcdir builds work. + Track change in cairo_test_create_pattern_from_png. + + ChangeLog | 19 +++++++++++++++++++ + ROADMAP | 8 ++++---- + test/cairo-test.c | 16 +++++++++++++--- + test/cairo-test.h | 6 ++++-- + test/composite-integer-translate-over.c | 2 +- + test/composite-integer-translate-source.c | 2 +- + test/mask.c | 2 +- + test/trap-clip.c | 2 +- + 8 files changed, 44 insertions(+), 13 deletions(-) + +commit 584954859ead08491cd5ed04aec54aae6b1048b8 +Author: Carl Worth +Date: Sun Jul 17 22:15:57 2005 +0000 + + Add note that Xlib caches need to be cleand up on close of display. + + BUGS | 7 +++++++ + ChangeLog | 5 +++++ + 2 files changed, 12 insertions(+) + +commit c36fd95f6ed1dbdb9c7053f8ba5c58623d6095b8 +Author: Jeff Muizelaar +Date: Sat Jul 16 11:27:32 2005 +0000 + + Add call to fbCompositeSrcSrc_nxn that I missed. + + pixman/ChangeLog | 5 +++++ + pixman/src/ic.c | 6 ++++++ + 2 files changed, 11 insertions(+) + +commit d3661b0d53bf0c3c4132d8d02f8527019d65fc6b +Author: Carl Worth +Date: Fri Jul 15 13:59:47 2005 +0000 + + Remove cairo_private qualifier from .c files, (we only need it in the .h files). + + ChangeLog | 6 ++++++ + src/cairo-font.c | 2 +- + src/cairo-surface.c | 18 +++++++++--------- + 3 files changed, 16 insertions(+), 10 deletions(-) + +commit 8ad8aa63605610eaec78cdbfea321148c02be331 +Author: Vladimir Vukicevic +Date: Fri Jul 15 13:45:19 2005 +0000 + + Use XCopyArea when possible, for optimization and bug workaround. + Exercise XCopyArea, XRenderComposite, and XSetTile/XFillRectangle paths for _cairo_xlib_surface_composite + + ChangeLog | 10 ++ + ROADMAP | 2 +- + src/cairo-xlib-surface.c | 117 +++++++++++++++------ + test/.cvsignore | 3 + + test/Makefile.am | 11 +- + test/composite-integer-translate-over-ref.png | Bin 0 -> 15397 bytes + ...composite-integer-translate-over-repeat-ref.png | Bin 0 -> 401 bytes + test/composite-integer-translate-over-repeat.c | 61 +++++++++++ + test/composite-integer-translate-over.c | 42 ++++++++ + test/composite-integer-translate-source-ref.png | Bin 0 -> 16385 bytes + test/composite-integer-translate-source.c | 42 ++++++++ + 11 files changed, 255 insertions(+), 33 deletions(-) + +commit 2534057cb5df78eb5aa79c24317e4a97f6c0f2c6 +Author: Carl Worth +Date: Fri Jul 15 10:39:59 2005 +0000 + + Add new check-valgrind target for running the test suite under the influence of valgrind. + Fix memory leak when reference image is not found. + + ChangeLog | 8 ++++++++ + test/Makefile.am | 3 +++ + test/buffer-diff.c | 4 +++- + 3 files changed, 14 insertions(+), 1 deletion(-) + +commit 07d09acf2a9a8341f281cfe235325a52a20cd750 +Author: Carl Worth +Date: Fri Jul 15 01:38:38 2005 +0000 + + Fix a few memory leaks (missing cairo_pattern_destroy in 3 places). + + ChangeLog | 6 ++++++ + test/mask.c | 5 ++++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 3a053c1e58962c3fb9eae11954651270244cabae +Author: Carl Worth +Date: Fri Jul 15 01:05:56 2005 +0000 + + Fix memory leak, (missing _cairo_pattern_fini). + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 1 + + 2 files changed, 6 insertions(+) + +commit 89a9771b60906092cca1b5e7582be3ae140b9bc2 +Author: Carl Worth +Date: Fri Jul 15 00:56:58 2005 +0000 + + Remove errant line of code that was inadvertently committed recently. + + ChangeLog | 5 +++++ + test/cairo-test.c | 3 --- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit 3e05319bf8584d88fc34825d79c138f0e9f8a297 +Author: Carl Worth +Date: Thu Jul 14 17:55:58 2005 +0000 + + Fix leak of surface. + + ChangeLog | 4 ++++ + test/surface-finish-twice.c | 2 ++ + 2 files changed, 6 insertions(+) + +commit 6df1baa395ad11c1a22dd5279d6281b3ee149e94 +Author: Carl Worth +Date: Thu Jul 14 17:52:17 2005 +0000 + + Call _cairo_array_fini on the several array objects to patch memory leaks. + + ChangeLog | 6 ++++++ + src/cairo-pdf-surface.c | 10 ++++++++++ + 2 files changed, 16 insertions(+) + +commit df181620c0e6ca889013435d1ae5d0ffddfeec9d +Author: Carl Worth +Date: Thu Jul 14 16:56:08 2005 +0000 + + Eek. Yet _more_ fixups for _cairo_pattern_release_surface missed earlier. + + ChangeLog | 7 +++++++ + src/cairo-xlib-surface.c | 8 ++++---- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit 174056f7364892b07177f9e7cbda2821ca6c9ac9 +Author: Stuart Parmenter +Date: Thu Jul 14 16:50:58 2005 +0000 + + blue and green values were swapped in the DO_SOURCE case. + + ChangeLog | 5 +++++ + src/cairo-win32-surface.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 40edca337e3976ddca98caafcbab950000e66880 +Author: Carl Worth +Date: Thu Jul 14 16:18:39 2005 +0000 + + Rewrite to use cairo_image_surface_create_from_png rather than custom read_png_argb32. In addition to being simpler, this eliminates the leak of the image data buffer. + Add calls to cairo_pattern_destroy to close two memory leaks. + + ChangeLog | 10 ++++++++++ + test/cairo-test.c | 19 ++++++++----------- + test/trap-clip.c | 2 ++ + 3 files changed, 20 insertions(+), 11 deletions(-) + +commit d8500060a972de9ca0f202d9cfb73460446dfc17 +Author: Carl Worth +Date: Thu Jul 14 15:47:18 2005 +0000 + + Fix up one more call to _cairo_pattern_release_surface missed in the previous commit. + + ChangeLog | 6 ++++++ + src/cairo-pattern.c | 50 ++++++++++++++++++++++++-------------------------- + 2 files changed, 30 insertions(+), 26 deletions(-) + +commit 3cd006bb2b3986aefaf6cf9002735c430e4bc172 +Author: Carl Worth +Date: Thu Jul 14 15:10:47 2005 +0000 + + Fix to accept a cairo_pattern_t rather than a cairo_surface_t as the primary argument. + Track change in _cairo_pattern_release_surface and also pass the appropriate pattern for each acquired surface. The previous backend mismatch was causing memory leaks. + Remove stale comment. + Add missing fclose to keep valgrind happy about memory leaks. + + ChangeLog | 19 +++++++++++++++++++ + src/cairo-image-surface.c | 6 +++--- + src/cairo-pattern.c | 13 +++++++++---- + src/cairo-xlib-surface.c | 1 - + src/cairoint.h | 2 +- + test/xlib-surface.c | 4 ++++ + 6 files changed, 36 insertions(+), 9 deletions(-) + +commit 288f0f7f49849c74c1025804ecb7076b3485b8f2 +Author: Carl Worth +Date: Thu Jul 14 12:50:28 2005 +0000 + + Make the per-backend test results print XFAIL rather than FAIL for expected failures. + + ChangeLog | 6 ++++++ + test/cairo-test.c | 12 ++++++++---- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit 6f6c9196c8248f469a9f3b54f886816430c86ac4 +Author: Carl Worth +Date: Thu Jul 14 12:25:41 2005 +0000 + + Fix comment describing test result. It's not enough that all tested backends are successful. We also require that at least one backend is actually tested. + + ChangeLog | 7 +++++++ + test/cairo-test.c | 3 ++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 456e3ffc4ddd496823dce6551b0545ce5c9530d4 +Author: Carl Worth +Date: Thu Jul 14 12:20:42 2005 +0000 + + Don't consider a test to fail if it can't create a surface at all (eg. no X server is available). Instead mark this backend as untested and only consider the overall test a success if all tested backend are successful. + + ChangeLog | 8 ++++++++ + test/cairo-test.c | 31 ++++++++++++++++++++++++++----- + test/cairo-test.h | 3 ++- + 3 files changed, 36 insertions(+), 6 deletions(-) + +commit 0c3ee348f890879154089f23ea37bfaa2bfcd87a +Author: Carl Worth +Date: Thu Jul 14 11:48:40 2005 +0000 + + Add missing (putatively unreachable) return value. + + ChangeLog | 5 +++++ + src/cairo-ps-surface.c | 1 + + 2 files changed, 6 insertions(+) + +commit 14ea7b583b90142bcec829716a0077d969b847e3 +Author: Carl Worth +Date: Thu Jul 14 11:45:39 2005 +0000 + + Remove the copying of the region. This was a workaround for a missing copy bug in libpixman that has since been fixed. So now it was just a memory leak. + + ChangeLog | 7 +++++++ + src/cairo-image-surface.c | 15 +-------------- + 2 files changed, 8 insertions(+), 14 deletions(-) + +commit 171b053347c83d2a1f234b553510ef3f72f22f29 +Author: Carl Worth +Date: Thu Jul 14 11:41:00 2005 +0000 + + Whitespace fix. (pixman_image_destroy): Fix leak of the clip region associated with an image. (NOTE: xserver/render doesn't have the same bug since it has FreePicture that calls into both DestroyPicture and DestroyPictureClip separately). + + pixman/ChangeLog | 8 ++++++++ + pixman/src/icimage.c | 4 +++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 513e9e6fe5bbd8dda3e90c89d200f34104b27646 +Author: Carl Worth +Date: Thu Jul 14 11:24:56 2005 +0000 + + Patch memory leak of png_info object. + + ChangeLog | 5 +++++ + src/cairo-png.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 574b702029894f035791a99600130b16f30ddd55 +Author: Carl Worth +Date: Thu Jul 14 11:17:12 2005 +0000 + + Rename create-for-png test to create-from-png to match the naming of the cairo_image_surface_create_from_png function. + + ChangeLog | 10 +++++++ + test/.cvsignore | 2 +- + test/Makefile.am | 6 ++-- + test/create-for-png-ref.png | Bin 100 -> 0 bytes + test/create-for-png.c | 69 -------------------------------------------- + test/create-from-png.c | 4 +-- + 6 files changed, 16 insertions(+), 75 deletions(-) + +commit c41e9d698f5dbc318819fb958618b704dbc5388a +Author: Carl Worth +Date: Thu Jul 14 11:11:15 2005 +0000 + + Patch a few memory leaks. + + ChangeLog | 6 ++++++ + test/cairo-test.c | 47 ++++++++++++++++++++++++++--------------------- + 2 files changed, 32 insertions(+), 21 deletions(-) + +commit 3a469446376eb23bd4a852417b0a319b914805b9 +Author: Kristian Høgsberg +Date: Wed Jul 13 12:32:51 2005 +0000 + + Use the _cairo_surface_*() functions when replaying. + Fold the "locate fallbacks" pass into the postscript output pass, and add a simple, first implementation of image fallbacks. + + ChangeLog | 9 ++ + src/cairo-meta-surface-private.h | 1 + + src/cairo-meta-surface.c | 35 +++-- + src/cairo-ps-surface.c | 286 +++++++++++++++++++-------------------- + 4 files changed, 163 insertions(+), 168 deletions(-) + +commit aafc2e749725fab0684cce6e36b130f838696912 +Author: Carl Worth +Date: Wed Jul 13 11:34:37 2005 +0000 + + Rename CAIRO_FONT_BACKEND_DEFAULT to the more accurate CAIRO_SCALED_FONT_BACKEND_DEFAULT. + + ChangeLog | 7 +++++++ + src/cairo-font.c | 3 ++- + src/cairoint.h | 6 +++--- + 3 files changed, 12 insertions(+), 4 deletions(-) + +commit 6725cc9d7f9b44f930478c337073d372272407de +Author: Carl Worth +Date: Wed Jul 13 11:01:25 2005 +0000 + + New predicates to allow checking for cairo_ft derivates of generic font type. + Add explicit checks for cairo_ft derivatives of generic fonts rather than just blindly assuming that's what we get. + + ChangeLog | 15 +++++++++++++++ + src/cairo-font-subset.c | 4 ++++ + src/cairo-ft-font.c | 12 ++++++++++++ + src/cairo-ft-private.h | 6 ++++++ + src/cairo-pdf-surface.c | 8 ++++++++ + src/cairo-ps-surface.c | 12 ++++++++++++ + 6 files changed, 57 insertions(+) + +commit dda555de995e2af3cc49e3e2ed9e2444c8622a55 +Author: Carl Worth +Date: Tue Jul 12 14:43:37 2005 +0000 + + Remove destroy notifier. This simplifies the implementation a bit, and no anticipated use of cairo_hash_table_t in cairo needs the destroy notifier. Most uses will be hash-backed object create/destroy functions. + (_cairo_hash_table_destroy): Document that it is now a fatal error to call _cairo_hash_table_destroy on a non-empty hash table. + (_cairo_hash_table_insert): Document that it is now a fatal error to insert an entry with a key that matches an existing entry. + (_cairo_hash_table_random_entry): Add predicate function so that the user can select a random entry satisying the given predicate. + (_cairo_hash_table_remove): Change return type to void since failure is really not possible here. + + ChangeLog | 22 +++++++++ + src/cairo-hash-private.h | 25 +++++++---- + src/cairo-hash.c | 115 +++++++++++++++++++++-------------------------- + 3 files changed, 90 insertions(+), 72 deletions(-) + +commit efb413c084c51c08875ab2f356484718ff4f91dd +Author: Carl Worth +Date: Mon Jul 11 16:24:19 2005 +0000 + + Add note that glyph measurement performance needs to improve. + + ChangeLog | 1 + + ROADMAP | 3 +++ + 2 files changed, 4 insertions(+) + +commit 4329b709639c2dd3a6ec0cf113877323abfcbc2c +Author: Carl Worth +Date: Mon Jul 11 16:09:55 2005 +0000 + + Fix typo (cairo_ft_options_t -> cairo_font_options_t). + + ChangeLog | 1 + + ROADMAP | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit abdaf7555f467e2df248430853e9dd8bf3c4056d +Author: Carl Worth +Date: Mon Jul 11 16:07:08 2005 +0000 + + Add cache lock deadlock problem to roadmap for 0.5.2. + Disable mutex locks, (making the caches non-thread-safe again, just like they were in the last snapshot and before). + + ChangeLog | 8 ++++++++ + ROADMAP | 9 +++++++++ + src/cairoint.h | 48 ++++++++++++++++++++++++++++++++++++------------ + 3 files changed, 53 insertions(+), 12 deletions(-) + +commit e9d42ab9f9b6def69c8de976fb3482b9559ffb9c +Author: Carl Worth +Date: Mon Jul 11 14:03:51 2005 +0000 + + ROADMAP: Add recent API change proposals (cairo_ft_options_t, cairo_xlib_surface_create needs to be screen aware, and cairo_xlib_surface_set_drawable). + + ChangeLog | 3 +++ + ROADMAP | 15 +++++++++++++++ + 2 files changed, 18 insertions(+) + +commit 9cddbaf8e6d4aef89017baf6bf10d8d34a47b0ef +Author: Carl Worth +Date: Mon Jul 11 13:37:43 2005 +0000 + + ROADMAP: Note progress on cairo_meta_surface_t, ARGB text, and group support. + + ChangeLog | 2 ++ + ROADMAP | 11 ++++++++--- + 2 files changed, 10 insertions(+), 3 deletions(-) + +commit 48e5806f1e30e1e46a18442a568ed99daab78f66 +Author: Carl Worth +Date: Mon Jul 11 13:29:45 2005 +0000 + + Note that the cairo_content_t work is done. + Note that this function is computing an incorrect result. + + ChangeLog | 7 +++++++ + ROADMAP | 4 ++-- + src/cairo-arc.c | 2 ++ + 3 files changed, 11 insertions(+), 2 deletions(-) + +commit 2ff04df85219828c0058155ba7038a23bd264ebc +Author: Jeff Muizelaar +Date: Sat Jul 9 19:00:36 2005 +0000 + + Begin merging in newer fb code. + The code comes from keithp: Initial import of Composite extension along with name change from Apportion. Added some accelerated code to fbpict to make this initial hack a bit faster. "real" extension bits to follow. + + pixman/ChangeLog | 12 ++++ + pixman/src/ic.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 187 insertions(+), 2 deletions(-) + +commit 1d48dc6cdb653b95c4353613399972663c71e68e +Author: Jeff Muizelaar +Date: Sat Jul 9 18:13:14 2005 +0000 + + More misc merging. Mostly s/pixman_composite/fbComposite/. + + pixman/ChangeLog | 12 ++++++++++ + pixman/src/ic.c | 72 ++++++++++++++++++++++++++++---------------------------- + 2 files changed, 48 insertions(+), 36 deletions(-) + +commit 36a57bcdcbb0025250bfa037fbd7e7c08819e43b +Author: Jeff Muizelaar +Date: Sat Jul 9 15:47:43 2005 +0000 + + More misc merging. Mostly stuff like s/uint32_t/CARD32/. + + pixman/ChangeLog | 16 ++ + pixman/src/ic.c | 626 +++++++++++++++++++++++++++---------------------------- + 2 files changed, 329 insertions(+), 313 deletions(-) + +commit 9a2ba48b298c3bf4b462e1030b105efaf9fd015c +Author: Carl Worth +Date: Fri Jul 8 10:12:28 2005 +0000 + + Give enum tags an underscore prefix to match the style of the struct tags. Add new cairo_content_t and change cairo_surface_create_similar to accept a cairo_content_t rather than a cairo_format_t. + Change surface backend create_similar call to accept a cairo_content_t rather than a cairo_format_t. + Fix all calls into create_similar to pass a cairo_content_t rather than a cairo_format_t. + + ChangeLog | 44 +++++++++++++++++++ + src/cairo-glitz-surface.c | 41 +++++++++--------- + src/cairo-gstate.c | 10 ++--- + src/cairo-image-surface.c | 52 +++++++++++++++++++++-- + src/cairo-meta-surface.c | 4 +- + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 4 +- + src/cairo-ps-surface.c | 10 ++--- + src/cairo-quartz-surface.c | 11 +++-- + src/cairo-surface.c | 36 ++++++++++++---- + src/cairo-win32-surface.c | 9 ++-- + src/cairo-xcb-surface.c | 6 ++- + src/cairo-xlib-surface.c | 8 ++-- + src/cairo.h | 103 ++++++++++++++++++++++++++++----------------- + src/cairoint.h | 14 ++++-- + test/mask.c | 4 +- + test/pixman-rotate.c | 2 +- + test/source-clip.c | 2 +- + 18 files changed, 256 insertions(+), 106 deletions(-) + +commit 9fd2f0a25c4954e839d79de00ff14b1990ae39eb +Author: Carl Worth +Date: Thu Jul 7 01:15:21 2005 +0000 + + Add a missing word. + Note that the BadMatch bug has been resolved. + + CODING_STYLE | 4 ++-- + ChangeLog | 6 ++++++ + ROADMAP | 9 ++++++--- + 3 files changed, 14 insertions(+), 5 deletions(-) + +commit f766e06d25334cd8d75d28d105b6a2fa62f08702 +Author: Carl Worth +Date: Wed Jul 6 14:52:01 2005 +0000 + + Remove CAIRO_STATUS_NO_TARGET_SURFAC and add CAIRO_STATUS_INVALID_STATUS. + Don't check for gstate->target == NULL anymore as the API now guarantees it never occurs. + Check that path->status is a valid status value and cause an INVALID_STATUS error otherwise. + Test the new CAIRO_STATUS_INVALID_STATUS error case in cairo_append_path. + + ChangeLog | 18 ++++++++++++++++++ + src/cairo-gstate.c | 9 --------- + src/cairo.c | 18 +++++++++++++----- + src/cairo.h | 27 ++++++++++++++------------- + test/path-data.c | 15 +++++++++++++++ + 5 files changed, 60 insertions(+), 27 deletions(-) + +commit eb12e493084ace63cebf9eb95b07953a952a817f +Author: Carl Worth +Date: Wed Jul 6 11:23:39 2005 +0000 + + Require libpixman >= 0.1.5, (since 0.1.4 crashes on some X servers). + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit ad0e040fb6625c9fcc76b99c65f3caff098fd256 +Author: Carl Worth +Date: Tue Jul 5 22:30:59 2005 +0000 + + Disable the compilation of the _ps_locate_fallbacks code which, inaddition to being broken, appears to not currently be used. + + ChangeLog | 6 ++++++ + src/cairo-ps-surface.c | 11 +++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit e314e86cc1eb5feafee621ece4be79d897eb2850 +Author: David Reveman +Date: Mon Jul 4 03:58:43 2005 +0000 + + Use frame buffer objects for accelerated offscreen drawing in glitz backend + + ChangeLog | 9 +++ + configure.in | 2 +- + src/cairo-glitz-surface.c | 156 ++++++++++++++++++---------------------------- + 3 files changed, 72 insertions(+), 95 deletions(-) + +commit 7a923e6dddcefa643ef059e8eef0ebeba7e383ee +Author: Kristian Høgsberg +Date: Fri Jul 1 12:45:35 2005 +0000 + + Rewrite postscript backend to generate more interesting output than the current big-image implementation, using meta surfaces for font subsetting and image fallbacks. + Remove obsolete comment. + Make a couple of stylistic changes and add _cairo_output_stream_write_hex_string. + Add _cairo_surface_intersect_clip_path so we can replay path clipping. + + ChangeLog | 15 + + src/cairo-meta-surface.c | 6 - + src/cairo-output-stream.c | 28 +- + src/cairo-ps-surface.c | 1261 +++++++++++++++++++++++++++++++++++++++------ + src/cairo-surface.c | 17 + + src/cairoint.h | 11 + + 6 files changed, 1167 insertions(+), 171 deletions(-) + +commit 7ab5dbfa7547bd0d8a99e4d0fcd34d8a55722a11 +Author: Kristian Høgsberg +Date: Fri Jul 1 12:22:23 2005 +0000 + + Add meta surface implementation. + Add cairo-meta-surface.c and cairo-meta-surface-private.h + + ChangeLog | 8 + + src/Makefile.am | 2 + + src/cairo-meta-surface-private.h | 151 ++++++++++ + src/cairo-meta-surface.c | 601 +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 762 insertions(+) + +commit 4e01c4aa2f8427113153fe569b6cf22388ba0882 +Author: Carl Worth +Date: Wed Jun 29 17:05:31 2005 +0000 + + Remove debugging printfs. + + ChangeLog | 7 ++++++- + src/cairo-hash.c | 4 ---- + 2 files changed, 6 insertions(+), 5 deletions(-) + +commit aad6dce6bc9adc829e719345c5df954d9464cefb +Author: Carl Worth +Date: Wed Jun 29 17:02:37 2005 +0000 + + Add _cairo_hash_table_random_entry. + Fix to update live_entries. + style changes. + Add code to shrink table as well as to grow it. + Call new version of resize so that table will grow or shrink as needed on insert and remove. + + ChangeLog | 18 +++++++ + src/cairo-hash-private.h | 5 +- + src/cairo-hash.c | 138 +++++++++++++++++++++++++++++++++++++++-------- + 3 files changed, 139 insertions(+), 22 deletions(-) + +commit e7ffbb4179b388304d4aadda66eb6c641758f91b +Author: Carl Worth +Date: Wed Jun 29 15:02:10 2005 +0000 + + Rewrite hash table to use a single cairo_hash_entry_t* rather than void *key and void *value. This is slightly more painful to use, but lends itself to a more memory-efficient implementation. Add documentation. + + ChangeLog | 12 ++ + src/cairo-hash-private.h | 58 ++++++--- + src/cairo-hash.c | 332 +++++++++++++++++++++++++---------------------- + 3 files changed, 235 insertions(+), 167 deletions(-) + +commit 82f244eca84b37886bd0b118dc44ec04342d7a26 +Author: Carl Worth +Date: Wed Jun 29 07:04:34 2005 +0000 + + Rework the cache code as a hast table with a much simpler interface, (no object derviation is required to use it). + Remove extraneous prototype for non-existent _cairo_cache_reference. + + ChangeLog | 14 ++ + src/cairo-hash-private.h | 85 +++++++ + src/cairo-hash.c | 643 ++++++++++++++++++++--------------------------- + src/cairoint.h | 3 - + 4 files changed, 374 insertions(+), 371 deletions(-) + +commit 5ab8a3085ee4c5cab7d07d233530d74c2d978d94 +Author: Kristian Høgsberg +Date: Tue Jun 28 15:58:42 2005 +0000 + + New functions to create a cairo_pattern_t corresponding to a solid color and a translucent color respectively. Document a few pattern functions. + + ChangeLog | 7 +++ + src/cairo-pattern.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 37 +++---------- + src/cairo.h | 8 +++ + 4 files changed, 171 insertions(+), 29 deletions(-) + +commit e7442a4523603642c4805058140a7ad23fc0489d +Author: Tor Lillqvist +Date: Tue Jun 28 15:03:53 2005 +0000 + + Implement. + reviewed by: otaylor + + ChangeLog | 7 +++ + src/cairo-win32-font.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 135 insertions(+), 5 deletions(-) + +commit 6d65ee6fc40ed1dcf7cc2f50413afc207520b299 +Author: Owen Taylor +Date: Tue Jun 28 13:28:53 2005 +0000 + + Also flag older XFree86 servers as buggy-repeat. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 3 +++ + 2 files changed, 8 insertions(+) + +commit e0982300cad9cf9873c28f69e025dd9a278934f0 +Author: Tor Lillqvist +Date: Tue Jun 28 11:52:42 2005 +0000 + + Prevent crash on empty string. + + ChangeLog | 5 +++++ + src/cairo-atsui-font.c | 17 ++++++++++------- + 2 files changed, 15 insertions(+), 7 deletions(-) + +commit f3b7d3dfd8d2bec03969bc5a52fb41473b88c747 +Author: Owen Taylor +Date: Tue Jun 28 05:02:27 2005 +0000 + + Fix stray commit marker + + ChangeLog | 1 - + 1 file changed, 1 deletion(-) + +commit 3b0c3d0ee84f991347df12249f944c780dde99f8 +Author: Keith Packard +Date: Sat Jun 25 23:24:19 2005 +0000 + + Provide locking macros, implement with pthreads. + Add _cairo_cache_shrink_to which reduces cache memory usage to a specified level. + Change global glyph and xlib glyphset caches behaviour to only shrink cache on unlock. This is done by telling the cache code to never shrink (max_memory == 0), and then manually shrinking using _cairo_cache_shrink_to from the unlock function. + Fix Carl's variable renaming mixing (cache = cache). + reviewed by: cworth + + ChangeLog | 33 ++++++++++++++++++++++++++++++ + configure.in | 8 ++++++++ + src/cairo-cache.c | 24 ++++++++++++++-------- + src/cairo-font.c | 28 ++++++++++++++++--------- + src/cairo-ft-font.c | 6 ++++-- + src/cairo-hash.c | 24 ++++++++++++++-------- + src/cairo-xlib-surface.c | 53 +++++++++++++++--------------------------------- + src/cairoint.h | 23 +++++++++++++++++++++ + 8 files changed, 132 insertions(+), 67 deletions(-) + +commit 574f7f560bf2cc851ad4f3267840e37fa06611fa +Author: Jeff Muizelaar +Date: Sat Jun 25 15:03:17 2005 +0000 + + Merge over most of the low-hanging renames from xserver/fb. + + pixman/ChangeLog | 34 +++ + pixman/src/ic.c | 30 +-- + pixman/src/icblt.c | 34 +-- + pixman/src/icbltone.c | 32 +-- + pixman/src/iccompose.c | 498 ++++++++++++++++++------------------- + pixman/src/icint.h | 296 ++++++++++++---------- + pixman/src/icrop.h | 18 +- + pixman/src/icutil.c | 2 +- + pixman/src/pixman-xserver-compat.h | 4 +- + 9 files changed, 501 insertions(+), 447 deletions(-) + +commit be38e07c4e511c075f9a30c67a4385bbb1d30594 +Author: Jeff Muizelaar +Date: Sat Jun 25 14:41:38 2005 +0000 + + Fix broken build on older gcc's caused by overzealous s/IC_/FB_/g + + pixman/ChangeLog | 5 +++++ + pixman/src/icint.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 5f0e8de3e5721d55328b6b06922f7b29b49cc5cb +Author: Owen Taylor +Date: Sat Jun 25 13:51:22 2005 +0000 + + Add mostly useless (other than perhaps 90-degree rotation) code for transforming bitmap glyphs. + + ChangeLog | 8 +++- + src/cairo-ft-font.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 142 insertions(+), 2 deletions(-) + +commit 13a27d19d4e8748a4233b70cdd4a223865d3d57c +Author: Carl Worth +Date: Sat Jun 25 02:00:17 2005 +0000 + + From: J. Ali Harlow" Reviewed by: Vladimir Vukicevic + Update win32 backend to match current API, so it actually builds once again. + + ChangeLog | 22 ++++++++++++++++++++++ + src/cairo-win32-surface.c | 19 +++++++++++-------- + test/Makefile.am | 4 ++-- + 3 files changed, 35 insertions(+), 10 deletions(-) + +commit 64d5b34a9843e63d36c605abe7cdd56bacabccee +Author: Jeff Muizelaar +Date: Fri Jun 24 20:13:19 2005 +0000 + + s/Ic/Fb/g This gets read of most of the [Ii][cC]'s the rest will probably dealt with on a case by case basis. + trimmed function list again. + + pixman/ChangeLog | 26 +++ + pixman/src/ic.c | 108 +++++----- + pixman/src/icblt.c | 268 +++++++++++------------ + pixman/src/icbltone.c | 174 +++++++-------- + pixman/src/iccolor.c | 20 +- + pixman/src/iccompose.c | 288 ++++++++++++------------- + pixman/src/icformat.c | 10 +- + pixman/src/icimage.c | 36 ++-- + pixman/src/icimage.h | 70 +++--- + pixman/src/icint.h | 426 ++++++++++++++++++------------------- + pixman/src/icpixels.c | 28 +-- + pixman/src/icrect.c | 6 +- + pixman/src/icrop.h | 66 +++--- + pixman/src/icstipple.c | 20 +- + pixman/src/ictrap.c | 6 +- + pixman/src/ictri.c | 20 +- + pixman/src/icutil.c | 4 +- + pixman/src/pixman-xserver-compat.h | 2 +- + 18 files changed, 802 insertions(+), 776 deletions(-) + +commit 42fc090745c8d262b8348b9f7a6c204e9a9b2379 +Author: Jeff Muizelaar +Date: Fri Jun 24 18:28:19 2005 +0000 + + selective s/Ic/fb/g. + I took out the list of functions because it was ridiculously long. + + pixman/ChangeLog | 16 ++ + pixman/src/ic.c | 96 +++++----- + pixman/src/icblt.c | 34 ++-- + pixman/src/icbltone.c | 96 +++++----- + pixman/src/iccompose.c | 466 ++++++++++++++++++++++++------------------------- + pixman/src/icimage.h | 2 +- + pixman/src/icint.h | 30 ++-- + pixman/src/icrop.h | 26 +-- + pixman/src/icstipple.c | 2 +- + pixman/src/icutil.c | 42 ++--- + 10 files changed, 413 insertions(+), 397 deletions(-) + +commit 43e3e7eeff6ff0f9fc0b161f70dfa0f5071a087e +Author: Jeff Muizelaar +Date: Fri Jun 24 18:21:15 2005 +0000 + + s/IC_/FB_/g + dd #define FB_BITS IC_BITS so that FB_BITS get defined early enough + + pixman/ChangeLog | 18 ++++ + pixman/src/ic.c | 4 +- + pixman/src/icblt.c | 106 +++++++++++------------ + pixman/src/icbltone.c | 76 ++++++++--------- + pixman/src/icint.h | 168 ++++++++++++++++++------------------- + pixman/src/icpixels.c | 6 +- + pixman/src/icrop.h | 4 +- + pixman/src/icstipple.c | 6 +- + pixman/src/icutil.c | 16 ++-- + pixman/src/pixman-xserver-compat.h | 2 + + pixman/src/pixman.h | 3 +- + 11 files changed, 215 insertions(+), 194 deletions(-) + +commit d469cc18eb21f69f8546f1d35ea44509c6eac329 +Author: Carl Worth +Date: Fri Jun 24 15:14:31 2005 +0000 + + Remove stray character. + + ChangeLog | 5 +++++ + src/cairo-ft-font.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 05e2ffa00ad672d33f1c204237f54a006f2e5c94 +Author: Carl Worth +Date: Fri Jun 24 15:09:41 2005 +0000 + + Prefer descriptive variable names over single-character names. Remove unneeded XGlpyhInfo field from glyphset_cache_entry_t. + + ChangeLog | 12 +++++ + src/cairo-xlib-surface.c | 135 +++++++++++++++++++++++------------------------ + 2 files changed, 78 insertions(+), 69 deletions(-) + +commit 87008a44d3043e48376cb3bee3702226ec5bcac7 +Author: Owen Taylor +Date: Fri Jun 24 15:06:40 2005 +0000 + + Handle rendering bitmap glyphslots as well as outline glyphslots. + When setting the scale for a non-scalable font, use the nearest available size (FreeType won't set the glyph metrics otherwise.) + + ChangeLog | 9 ++ + src/cairo-ft-font.c | 269 ++++++++++++++++++++++++++++++++++++++++------------ + 2 files changed, 218 insertions(+), 60 deletions(-) + +commit 81fa936fd2153e62411a5fbd3e8e5a43bc493d74 +Author: Jeff Muizelaar +Date: Thu Jun 23 19:41:07 2005 +0000 + + s/IcCombine/fbCombine/ + + pixman/ChangeLog | 31 ++++++ + pixman/src/iccompose.c | 272 ++++++++++++++++++++++++------------------------- + 2 files changed, 167 insertions(+), 136 deletions(-) + +commit e77d9776ae5217e9317209815b3195366a84f70f +Author: Jeff Muizelaar +Date: Thu Jun 23 19:39:12 2005 +0000 + + s/pixman_compositeOperand/FbCompositeOperand/g. + + pixman/ChangeLog | 59 ++++++ + pixman/src/iccompose.c | 552 ++++++++++++++++++++++++------------------------- + pixman/src/icimage.h | 20 +- + 3 files changed, 345 insertions(+), 286 deletions(-) + +commit 373e7f68b1c076eab08f2bc6b249dae4e8ac9bf4 +Author: Jeff Muizelaar +Date: Thu Jun 23 19:35:45 2005 +0000 + + s/pixman_bits_t/FbBits/s + + pixman/ChangeLog | 31 ++++++++++++++ + pixman/src/ic.c | 14 +++--- + pixman/src/icblt.c | 80 +++++++++++++++++----------------- + pixman/src/icbltone.c | 44 +++++++++---------- + pixman/src/iccompose.c | 114 ++++++++++++++++++++++++------------------------- + pixman/src/icimage.c | 6 +-- + pixman/src/icstipple.c | 8 ++-- + 7 files changed, 164 insertions(+), 133 deletions(-) + +commit aa07c01cb5d1f0c41067ee005b6db4481d5d8b58 +Author: Jeff Muizelaar +Date: Thu Jun 23 19:33:34 2005 +0000 + + more merging: + 630. Fix incorrect datatype for the pixmap width in fbCompositeSrcAdd_8000x8000(), and add some small optimisations (#A.1423, Keith Packard). + + pixman/ChangeLog | 12 +++++++++++- + pixman/src/ic.c | 36 ++++++++++++++++++++++-------------- + 2 files changed, 33 insertions(+), 15 deletions(-) + +commit 81ec18369736888bea6d4d79d0de6ed00e8ca802 +Author: Jeff Muizelaar +Date: Thu Jun 23 19:30:12 2005 +0000 + + Start the xserver/fb -> libpixman merging with a copy optimization. + + pixman/ChangeLog | 7 +++++++ + pixman/src/icblt.c | 26 +++++++++++++++++++++++++- + pixman/src/icint.h | 1 + + 3 files changed, 33 insertions(+), 1 deletion(-) + +commit adeff84bc2eba19bb3f667297e594a1ef86ae2a9 +Author: Carl Worth +Date: Thu Jun 23 15:52:37 2005 +0000 + + Add ARGB text to 1.0 roadmap. + + ChangeLog | 4 ++++ + ROADMAP | 2 ++ + 2 files changed, 6 insertions(+) + +commit 609ef32bfa13c09d3a6de5c6631458109445eda0 +Author: Owen Taylor +Date: Thu Jun 23 13:05:07 2005 +0000 + + Improve last ChangeLog entry a bit + + ChangeLog | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ff27263f3968d8f97534ce218bfde0392908cf6c +Author: Owen Taylor +Date: Thu Jun 23 12:58:49 2005 +0000 + + Only unpremultiply ARGB32 data. Call png_write_info() *before* we set up the write conversion... it doesn't work after. + + ChangeLog | 6 ++++++ + src/cairo-png.c | 47 ++++++++++++++++++++++++++++++++++++----------- + 2 files changed, 42 insertions(+), 11 deletions(-) + +commit 3b20ab66b89527c25c1fbfff8ed1ff672196520f +Author: Carl Worth +Date: Thu Jun 23 12:45:38 2005 +0000 + + Add workaround for Render's overlapping source/dest bug to the 0.5.2 roadmap. + + ChangeLog | 5 +++++ + ROADMAP | 4 ++++ + 2 files changed, 9 insertions(+) + +commit 03c7b6aa7a5d2b97b7f892296f2a46ae56dde5b2 +Author: Carl Worth +Date: Wed Jun 22 22:12:09 2005 +0000 + + Add link to BadMatch bug. + + ChangeLog | 6 ++++-- + ROADMAP | 3 ++- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit b04b434db189904b108ab5167e61a286ea8225d2 +Author: Carl Worth +Date: Wed Jun 22 17:09:08 2005 +0000 + + Update ROADMAP with some comments on 0.5.2. + Add documentation for cairo_set_source_surface and fix some typos in other documentation blocks. + + ChangeLog | 6 ++++++ + ROADMAP | 16 ++++++++-------- + src/cairo.c | 29 ++++++++++++++++++++++++++--- + 3 files changed, 40 insertions(+), 11 deletions(-) + +commit 687f3d78d6b1fe1fb03980c70537bea331bbcf28 +Author: Øyvind KolÃ¥s +Date: Wed Jun 22 09:49:48 2005 +0000 + + minor whitespace and spellfix + + ChangeLog | 4 ++++ + doc/public/language-bindings.xml | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit b1130276d59a219e70d43dd1d199ddf391fa3330 +Author: Kristian Høgsberg +Date: Tue Jun 21 15:38:51 2005 +0000 + + Split out font subsetting code from here, + and put it here. + + ChangeLog | 7 + + src/Makefile.am | 91 +++--- + src/cairo-font-subset-private.h | 68 +++++ + src/cairo-font-subset.c | 645 +++++++++++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 657 ++-------------------------------------- + 5 files changed, 784 insertions(+), 684 deletions(-) + +commit 7283ba6d470950e0e49f33fc25f3358113dda51e +Author: Tor Lillqvist +Date: Tue Jun 21 09:54:58 2005 +0000 + + allow building against < 10.3 SDK. + + ChangeLog | 4 ++++ + src/cairo-atsui-font.c | 12 ++++++++++++ + 2 files changed, 16 insertions(+) + +commit adee31be18e20112c7da49675b93d37cc66ee263 +Author: Carl Worth +Date: Mon Jun 20 17:06:10 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_5_1. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 86869f02b9206eaeac331ff8945dacf4d840df98 +Author: Carl Worth +Date: Mon Jun 20 17:01:36 2005 +0000 + + Force distcheck to enable gtk-doc. + + ChangeLog | 4 ++++ + Makefile.am | 2 ++ + doc/public/tmpl/cairo.sgml | 19 ------------------- + 3 files changed, 6 insertions(+), 19 deletions(-) + +commit d7ef15d4b48820a072e4f4525fa83b23dc2cdf5d +Author: Carl Worth +Date: Mon Jun 20 16:35:40 2005 +0000 + + Added notes for snapshot 0.5.1 + Increment CAIRO_VERSION to 0.5.1 + + ChangeLog | 6 ++++ + NEWS | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 3 files changed, 109 insertions(+), 1 deletion(-) + +commit 74e3cc672f4b687d48caabe53a9c611868e27904 +Author: Carl Worth +Date: Mon Jun 20 16:31:17 2005 +0000 + + Fix abbreviated ChangeLog + + ChangeLog | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ea2a04d901947106d15978c077cad61b7b7c9b26 +Author: Owen Taylor +Date: Mon Jun 20 15:48:46 2005 +0000 + + Workaround for https://bugs.freedesktop.org/show_bug.cgi?id=3566 + Detect servers with a bug in repeating surfaces by checking vendor string and version. + For such surfaces + Save clip rects when setting a clip region on a surface so that we set the right clip for the surface's GC if we create it later. + + ChangeLog | 13 +++ + doc/public/tmpl/cairo.sgml | 19 +++ + src/cairo-xlib-surface.c | 282 ++++++++++++++++++++++++++++++++++++++++++--- + 3 files changed, 300 insertions(+), 14 deletions(-) + +commit 1ce9be95415c43b9db73b80f2641cc3a8eee9215 +Author: Carl Worth +Date: Mon Jun 20 12:54:15 2005 +0000 + + Make out parameters optional. Style cleanup. + + ChangeLog | 5 +++++ + src/cairo-matrix.c | 42 +++++++++++++++++++++++------------------- + 2 files changed, 28 insertions(+), 19 deletions(-) + +commit ab668278b060f3708bd1418c5707ceda74b9e2b4 +Author: Carl Worth +Date: Mon Jun 20 11:09:51 2005 +0000 + + Abstract CAIRO_ALPHA_IS_OPAQUE out for general internal use. + Optimize to defer to cairo_paint if the alpha value is actually opaque. + + ChangeLog | 9 +++++++++ + src/cairo-pattern.c | 2 +- + src/cairo.c | 5 +++++ + src/cairoint.h | 2 ++ + 4 files changed, 17 insertions(+), 1 deletion(-) + +commit f15ec64e7f2cfb9071c05ec072e49f364dbc4164 +Author: Carl Worth +Date: Mon Jun 20 09:59:23 2005 +0000 + + Rip out cairo_set_error_notfiy function as it is clear that it is not the right approach. + Remove error-notify test. + + ChangeLog | 12 +++++ + doc/public/tmpl/cairo.sgml | 19 -------- + src/cairo-private.h | 3 -- + src/cairo.c | 32 -------------- + src/cairo.h | 14 ------ + test/.cvsignore | 1 - + test/Makefile.am | 2 - + test/error-notify.c | 108 --------------------------------------------- + 8 files changed, 12 insertions(+), 179 deletions(-) + +commit 3b8da5f213c3d0cf4357b29207639357241938bb +Author: Carl Worth +Date: Fri Jun 17 23:22:20 2005 +0000 + + Remove references to repeat and matrix fields that no longer exist. + + ChangeLog | 5 +++++ + doc/public/tmpl/cairo-pattern.sgml | 4 ++-- + doc/public/tmpl/cairo.sgml | 23 +++++++++++++++++++++-- + src/cairo-xcb-surface.c | 3 --- + 4 files changed, 28 insertions(+), 7 deletions(-) + +commit 92222f8bcaca41304ddd6a49a7e9d731a6a15820 +Author: Owen Taylor +Date: Fri Jun 17 16:19:08 2005 +0000 + + Fix width/height typo. + + ChangeLog | 6 ++++++ + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 66f8b1202ed82e4e88a63c6c385aded852186e68 +Author: Kristian Høgsberg +Date: Fri Jun 17 13:25:19 2005 +0000 + + Remove matrix, filter and repeat from the cairo_surface_t struct. + + ChangeLog | 10 ++++++++++ + src/cairo-glitz-surface.c | 3 --- + src/cairo-image-surface.c | 6 +++--- + src/cairo-pattern.c | 6 ------ + src/cairo-pdf-surface.c | 2 +- + src/cairo-surface.c | 4 ---- + src/cairo-xlib-surface.c | 3 --- + src/cairoint.h | 16 ---------------- + 8 files changed, 14 insertions(+), 36 deletions(-) + +commit 9318742aa434c1e8dd7c71ae07632383f8f7c59b +Author: Carl Worth +Date: Fri Jun 17 11:24:24 2005 +0000 + + cairo_reference and cairo_destroy shouldn't behave differently when cr->status indicates an error. Fix this bug that just slipped back in. + Remove useless conditional return at the end of a void function. + Fix so that after calling _cairo_error the most that any cairo entry function ever does is return a previously computed value. + + ChangeLog | 14 ++++++++++++++ + src/cairo.c | 39 +++++++++++++++++++-------------------- + 2 files changed, 33 insertions(+), 20 deletions(-) + +commit c71f0904f19beb7b5916fc229fe02c78ab296bae +Author: Kristian Høgsberg +Date: Fri Jun 17 10:48:47 2005 +0000 + + Remove the path clipping entry from the list. + + ChangeLog | 4 ++++ + TODO | 3 --- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 7c811e0ac604e71ab67937c5a0842a6d01c67fbe +Author: Carl Worth +Date: Thu Jun 16 12:31:56 2005 +0000 + + update documentation build stuff + + doc/public/cairo-sections.txt | 2 ++ + doc/public/tmpl/cairo-pattern.sgml | 2 ++ + doc/public/tmpl/cairo.sgml | 2 ++ + 3 files changed, 6 insertions(+) + +commit d6eca5a45f220d806491af518ba8ce16b524e01d +Author: Carl Worth +Date: Thu Jun 16 12:20:46 2005 +0000 + + Reorder fields of cairo_private_t to match initialization order. + Call error_notify callback if set. (cairo_create): Initialize error_notify callback to NULL. (cairo_set_error_notify): New function to allow the user to set an error notify callback. + New cairo_set_error_notify prototye. + New test for cairo_set_error_notify. + + ChangeLog | 17 +++++++++ + src/cairo-private.h | 8 +++- + src/cairo.c | 39 +++++++++++++++++-- + src/cairo.h | 14 +++++++ + test/.cvsignore | 1 + + test/Makefile.am | 2 + + test/error-notify.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 184 insertions(+), 5 deletions(-) + +commit 18c2d12b9ed98aea7f8ebe2b97b9406a6acb4d29 +Author: Carl Worth +Date: Wed Jun 15 16:52:11 2005 +0000 + + Add CAIRO_STATUS_DESTROYED to TODO list. + Note progress on consistent error handling. + Fix typo in documentation comment for _cairo_surface_get_current_clip_serial. + + ChangeLog | 9 +++++++++ + ROADMAP | 4 +++- + TODO | 1 + + src/cairo-surface.c | 2 +- + 4 files changed, 14 insertions(+), 2 deletions(-) + +commit 615d50976735a544da6888dc608495d130878400 +Author: Owen Taylor +Date: Wed Jun 15 16:04:19 2005 +0000 + + Remove --only-section-tmpl; it doesn't really work currently :-(. + + ChangeLog | 5 + + doc/public/Makefile.am | 2 +- + doc/public/tmpl/cairo-font.sgml | 121 ++++ + doc/public/tmpl/cairo-ft.sgml | 36 ++ + doc/public/tmpl/cairo-glitz.sgml | 9 + + doc/public/tmpl/cairo-matrix.sgml | 131 ++++ + doc/public/tmpl/cairo-pattern.sgml | 154 +++++ + doc/public/tmpl/cairo-pdf.sgml | 33 + + doc/public/tmpl/cairo-png.sgml | 40 ++ + doc/public/tmpl/cairo-ps.sgml | 33 + + doc/public/tmpl/cairo-quartz.sgml | 11 + + doc/public/tmpl/cairo-surface.sgml | 75 +++ + doc/public/tmpl/cairo-win32.sgml | 45 ++ + doc/public/tmpl/cairo-xcb-xrender.sgml | 13 + + doc/public/tmpl/cairo-xcb.sgml | 35 ++ + doc/public/tmpl/cairo-xlib-xrender.sgml | 13 + + doc/public/tmpl/cairo-xlib.sgml | 35 ++ + doc/public/tmpl/cairo.sgml | 1039 +++++++++++++++++++++++++++++++ + src/cairo-ft-font.c | 2 +- + src/cairo-win32-font.c | 2 +- + 20 files changed, 1831 insertions(+), 3 deletions(-) + +commit a3906e65aaca3a9aaee0f42e49a53585f684ef3e +Author: Owen Taylor +Date: Wed Jun 15 12:44:52 2005 +0000 + + Use a clip region when rendering a non-solid pattern through a rectangular path ... trapezoid rasterization is just too slow to use that path when we aren't forced to do so. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 25 ++++++++++++++++--------- + 2 files changed, 23 insertions(+), 9 deletions(-) + +commit fac3cd46b38d8ad45e0f6b1d112318cce289a8b4 +Author: Carl Worth +Date: Wed Jun 15 10:58:52 2005 +0000 + + (cairo_test_for_target): And add missing parenthesis. + + ChangeLog | 1 + + test/cairo-test.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 0b122003e7b1e45d28b535a5f5577544d1666510 +Author: Carl Worth +Date: Wed Jun 15 10:56:31 2005 +0000 + + Track removal of cairo_status_string. + + ChangeLog | 4 ++++ + test/cairo-test.c | 3 ++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit ac17f1ce68b829908e6329890b08eb7ef47d9910 +Author: Carl Worth +Date: Wed Jun 15 10:54:00 2005 +0000 + + Add cairo_finish to TODO list. Note that cairo_satus_string has now been removed. + + ChangeLog | 5 +++++ + TODO | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 4834b8e7f0be882e08ce0166750eb69e161e2a2c +Author: Carl Worth +Date: Wed Jun 15 10:52:01 2005 +0000 + + Remove cairo_status_string function which can now be replaced by: + cairo_status_to_string (cairo_status (cr)); + This allows consistent handling of status values for things like cairo_pattern_status where there is now cairo_pattern_status_string function. + + ChangeLog | 12 ++++++++++++ + src/cairo.c | 6 ------ + src/cairo.h | 6 ++---- + 3 files changed, 14 insertions(+), 10 deletions(-) + +commit e3c92f26134460117e58bf37bd6a5d2c90ca49a6 +Author: Carl Worth +Date: Wed Jun 15 10:46:49 2005 +0000 + + Add _cairo_error so we have a single function which all errors can pass through. This allows the user to set a breakpoint on error and will allow us to augment error handling later as necessary. + Make all assignements to cr->status go through the new _cairo_error function. Remove CAIRO_CHECK_SANITY macro. + + ChangeLog | 41 ++++ + src/cairo.c | 639 ++++++++++++++++++++++++++++++++++-------------------------- + 2 files changed, 400 insertions(+), 280 deletions(-) + +commit e749cf524caafe1c20c8ceba510974abb490a67e +Author: Carl Worth +Date: Wed Jun 15 10:41:41 2005 +0000 + + Remove cairo-atsui section since cairo-atsui.h is currently empty. Add cairo_path_data_type_t and cairo_path_data_t. + Add pdf-clip and pdf-clip.pdf. + + ChangeLog | 8 ++++++++ + doc/public/cairo-sections.txt | 7 ++----- + test/.cvsignore | 2 ++ + 3 files changed, 12 insertions(+), 5 deletions(-) + +commit 476fe9a66e2be74e65fe2f4e42bda5f4c8b244a0 +Author: Kristian Høgsberg +Date: Tue Jun 14 19:45:22 2005 +0000 + + Implement path clipping and refactor _cairo_gstate_clip() out in three different functions corresponding to the three different clipping modes. + Add NULL pointers for intersect_clip_path. + New test case to exercise PDF clipping code. + + ChangeLog | 36 ++++++++ + src/cairo-glitz-surface.c | 1 + + src/cairo-gstate-private.h | 16 +++- + src/cairo-gstate.c | 222 +++++++++++++++++++++++++++++++-------------- + src/cairo-image-surface.c | 1 + + src/cairo-pdf-surface.c | 101 +++++++++++++++++++-- + src/cairo-ps-surface.c | 1 + + src/cairo-quartz-surface.c | 1 + + src/cairo-surface.c | 116 +++++++++++++++-------- + src/cairo-win32-surface.c | 1 + + src/cairo-xcb-surface.c | 1 + + src/cairo-xlib-surface.c | 1 + + src/cairoint.h | 71 +++++++++++---- + test/Makefile.am | 11 ++- + test/pdf-clip.c | 134 +++++++++++++++++++++++++++ + 15 files changed, 583 insertions(+), 131 deletions(-) + +commit 663e39a63c6ae223dc3095d29fd95bc8885c74f2 +Author: Carl Worth +Date: Tue Jun 14 15:38:15 2005 +0000 + + Remove Boolean 'drawable' parameter from the create_similar surface backend function since nothing anywhere is actually using this parameter. + + ChangeLog | 23 +++++++++++++++++++++++ + src/cairo-glitz-surface.c | 9 ++++----- + src/cairo-image-surface.c | 1 - + src/cairo-pdf-surface.c | 1 - + src/cairo-ps-surface.c | 1 - + src/cairo-quartz-surface.c | 1 - + src/cairo-surface.c | 6 ++---- + src/cairo-win32-surface.c | 2 -- + src/cairo-xcb-surface.c | 3 +-- + src/cairo-xlib-surface.c | 3 +-- + src/cairoint.h | 2 -- + 11 files changed, 31 insertions(+), 21 deletions(-) + +commit d2ddfe42a9d66a8b369afb75e6e758af145def3e +Author: Tor Lillqvist +Date: Tue Jun 14 14:12:00 2005 +0000 + + Correct extents for text with a general tranform. + + ChangeLog | 5 +++++ + src/cairo-win32-font.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit bb7eeeb7498dad5b6bd70d1497b049a80d77af11 +Author: Carl Worth +Date: Tue Jun 14 11:58:14 2005 +0000 + + Remove comment suggesting ambiguity of whether cairo_get_target references the surface, (we decided as part of the API shakeup that cairo functions returning pointers to internal objects do not automatically take a reference). + + ChangeLog | 7 +++++++ + src/cairo.h | 2 -- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 8084fb9b095fb28d39d26f223e73be1867d4f0bc +Author: Carl Worth +Date: Mon Jun 13 16:53:52 2005 +0000 + + Add new _cairo_pattern_create_in_error. + Propagate error values from cr->status to pattern->status. + + ChangeLog | 9 +++++++++ + src/cairo-pattern.c | 31 +++++++++++++++++++++++++++++++ + src/cairo.c | 4 +--- + src/cairoint.h | 3 +++ + 4 files changed, 44 insertions(+), 3 deletions(-) + +commit 14ae3ce3ade3448f3c3d6ae0344ab4785afa96aa +Author: Carl Worth +Date: Mon Jun 13 16:36:40 2005 +0000 + + No longer need to check for NULL after creating a pattern. + Propagate status errors from pattern->status to cr->status. + Originally 2005-05-08 Owen Taylor : + src/cairo-pattern.c src/cairoint.h: If allocation of pattern objects fails, return special static nil pattern objects. + If adding a color stop fails to allocate memory, set pattern->status. (And fix a memory leak.) Make public functions return when pattern->status is set, (and no longer return a cairo_status_t). + src/cairo-pattern.c src/cairo.h doc/public/cairo-sections.txt: Add cairo_pattern_status() + Check the status of gstate->source and of mask patterns passed in. + + ChangeLog | 25 ++++++ + doc/public/cairo-sections.txt | 1 + + src/cairo-gstate.c | 24 +++++- + src/cairo-pattern.c | 188 ++++++++++++++++++++++++++++++------------ + src/cairo.c | 34 +++++--- + src/cairo.h | 16 ++-- + src/cairoint.h | 6 +- + 7 files changed, 219 insertions(+), 75 deletions(-) + +commit 15fb5e0d27a1fc7743894792a168980363df5d71 +Author: Carl Worth +Date: Mon Jun 13 16:35:03 2005 +0000 + + Originally 2005-05-08 Owen Taylor : + If cairo_create() fails, return a special static object, cairo_nil. + Don't return early if cr->status is set. cr->status should not affect reference counting. + Ignore any magic object with a reference count of -1. + + ChangeLog | 14 ++++++++++++++ + src/cairo.c | 26 ++++++++++++++++++++++++-- + 2 files changed, 38 insertions(+), 2 deletions(-) + +commit 01e1844e9ceb58edb3ef6351f2163264611635fe +Author: Carl Worth +Date: Mon Jun 13 16:29:26 2005 +0000 + + Originally 2005-06-02 Carl Worth : + Add a status field to cairo_path_t. + Add documentation for the new approach for handling errors in these functions---always returning a valid pointer with at least a status. (cairo_append_path): Propagate path status errors to the context. Add note to documentation on initializing path->status. + Add missing cairo_private qualifier to a couple functions. + Track new status field in cairo_path_t. (cairo_path_destroy): Don't destroy cairo_path_nil. Add documentation. (_cairo_path_data_create): (_cairo_path_data_create_flat): (_cairo_path_data_append_to_context): Add documentation. (_cairo_path_data_create_in_error): New function to create a placeholder cairo_path_t just to propagate a cairo_status_t error. + + ChangeLog | 26 ++++++++++++ + src/cairo-path-data-private.h | 11 ++--- + src/cairo-path-data.c | 98 ++++++++++++++++++++++++++++++++++++------- + src/cairo.c | 50 +++++++++++++++++----- + src/cairo.h | 1 + + 5 files changed, 156 insertions(+), 30 deletions(-) + +commit 730fb40455118894d970c0cb1a9b37880660889e +Author: Carl Worth +Date: Sat Jun 11 01:09:15 2005 +0000 + + Make these functions static, which allows slightly less awkward error handling within them. + + ChangeLog | 8 ++++++++ + src/cairo-gstate.c | 22 ++++++++++++++++------ + src/cairoint.h | 13 ------------- + 3 files changed, 24 insertions(+), 19 deletions(-) + +commit df19a5aa7e0aa37a0d33eb3946f5492db0307ff3 +Author: Carl Worth +Date: Sat Jun 11 00:06:04 2005 +0000 + + Provide font-backend-specific macros for FONT_FAMILY_DEFAULT. Change CAIRO_FT_FONT_FAMILY_DEFAULT from "serif" to "" to allow the actual default to come from the system/user configuration. + + ChangeLog | 7 +++++++ + src/cairoint.h | 10 +++++++--- + 2 files changed, 14 insertions(+), 3 deletions(-) + +commit ff2dee65bdff0e3bce239a6617b7acb680d5ad27 +Author: Carl Worth +Date: Fri Jun 10 23:47:23 2005 +0000 + + Pull the enum out from inside cairo_path_data_t and give it a name of cairo_path_data_type_t. This allows C++ programs to see the enum values. It also allows variables to be declared of this type for manually constructing a cairo_path_t. + + ChangeLog | 7 +++++++ + src/cairo.h | 14 ++++++++------ + 2 files changed, 15 insertions(+), 6 deletions(-) + +commit 4c37790a22a029332d182dc21bff4a72a976bbf8 +Author: Carl Worth +Date: Fri Jun 10 13:23:24 2005 +0000 + + Add 'consistent error handling' to 1.0 roadmap. (This isn't new, we just forgot to list it here before). + Big cleanup to remove finished items. Also, split the file up to separate TODO items that affect the API from items that do not. + + ChangeLog | 3 +++ + ROADMAP | 4 ++++ + 2 files changed, 7 insertions(+) + +commit 2a1c88064508938124c0700b8939303c579df188 +Author: Carl Worth +Date: Fri Jun 10 13:19:45 2005 +0000 + + Big cleanup to remove finished items. Also, split the file up to separate TODO items that affect the API from items that do not. + + ChangeLog | 8 ++- + TODO | 183 ++++++++++++++++++++++++++------------------------------------ + 2 files changed, 83 insertions(+), 108 deletions(-) + +commit 6cd484a4c0d6a6a67c1922746a2c21b5f46bff38 +Author: Carl Worth +Date: Fri Jun 10 12:46:49 2005 +0000 + + Originally: 2005-06-09 Carl Worth + Rework occurrences of 'if (status == CAIRO_STATUS_SUCCESS)' to use 'if (status)' instead where trivial. + + ChangeLog | 14 ++++++++++++++ + src/cairo-pdf-surface.c | 8 +++++--- + src/cairo-xcb-surface.c | 16 ++++++++++------ + src/cairo-xlib-surface.c | 16 ++++++++++------ + 4 files changed, 39 insertions(+), 15 deletions(-) + +commit 31dcb954fe2b8269563dbcd05c9ce0c1ca2f9a16 +Author: Carl Worth +Date: Fri Jun 10 12:18:20 2005 +0000 + + Remove STATUS_OK macro which was not being used universally. + + ChangeLog | 18 ++++++++++++++++ + src/cairo-font.c | 12 +++++------ + src/cairo-ft-font.c | 6 +++--- + src/cairo-glitz-surface.c | 22 ++++++++++++-------- + src/cairo-gstate.c | 52 +++++++++++++++++++++++------------------------ + src/cairo-image-surface.c | 6 +++--- + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-png.c | 10 ++++++--- + src/cairo-surface.c | 10 ++++----- + src/cairo-win32-font.c | 32 ++++++++++++++++------------- + src/cairo-win32-surface.c | 34 ++++++++++++++++--------------- + src/cairo-xcb-surface.c | 6 +++--- + src/cairo-xlib-surface.c | 6 +++--- + src/cairoint.h | 2 -- + 15 files changed, 127 insertions(+), 95 deletions(-) + +commit e6eef091152a7bcdcc6119224fa1aa1bfea5a823 +Author: Carl Worth +Date: Thu Jun 9 12:27:02 2005 +0000 + + Remove trailing comma from enum values which gcc 4.0 does not want to see (Luis Villa). Closes bug #3502. + + ChangeLog | 5 +++++ + src/cairo.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 23976d00b2cfb4640a0e0119247ae7d8f7f2ad73 +Author: Owen Taylor +Date: Thu Jun 9 07:26:40 2005 +0000 + + Add + -I$(top_builddir)/src for cairo-features.h (Tomasz Cholewo) + + ChangeLog | 5 +++++ + test/Makefile.am | 7 ++++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit c1c8c57b90659287e43c2fd591e74df4c696cb09 +Author: Keith Packard +Date: Tue Jun 7 23:28:12 2005 +0000 + + Font matrix was output incorrectly; the implicit mirror-in-y transformation was not computed correctly, missing a negation of the 'xy' component. + + ChangeLog | 7 +++++++ + src/cairo-pdf-surface.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 4f2f520dcec441be34628d233456ad252ff14f58 +Author: Carl Worth +Date: Fri Jun 3 16:45:46 2005 +0000 + + Allow NULL as a valid value for several objects. That is, calling reference or destroy on these objects will simply do nothing, successfully. + Remove extra whitespace. + + ChangeLog | 20 ++++++++++++++++++++ + src/cairo-atsui-font.c | 1 - + src/cairo-font.c | 31 +++++++++++++++++++++++++++---- + src/cairo-ft-font.c | 7 +++++++ + src/cairo-glitz-surface.c | 2 +- + src/cairo-path-data.c | 17 +++++++++++++++++ + src/cairo-pdf-surface.c | 6 ++++++ + src/cairo-win32-font.c | 3 +++ + 8 files changed, 81 insertions(+), 6 deletions(-) + +commit 7b4a65dba4b37111ec56b9cbb5d462bc08d4b0db +Author: Kristian Høgsberg +Date: Fri Jun 3 16:40:15 2005 +0000 + + When clipping, update the clip surface to a new surface the size of the intersection of the old clip surface and the extents of the new clip path. + + ChangeLog | 6 ++++ + src/cairo-gstate.c | 75 ++++++++++++++++++++++++++++++++++++++---------- + test/clip-twice-ref.png | Bin 751 -> 1191 bytes + test/clip-twice.c | 6 ++++ + 4 files changed, 72 insertions(+), 15 deletions(-) + +commit 7c47633b2c74e329f04b9f1ebde4c05c409d73c0 +Author: Carl Worth +Date: Fri Jun 3 16:22:26 2005 +0000 + + Remove unused cache->refcount and _cairo_cache_reference(). + Remove gratuitous nesting as recommended in CODING_STYLE. + + ChangeLog | 9 +++++++++ + src/cairo-cache.c | 28 ++++++++-------------------- + src/cairo-hash.c | 28 ++++++++-------------------- + src/cairoint.h | 1 - + 4 files changed, 25 insertions(+), 41 deletions(-) + +commit 756e991b91465c6da933368d66f19e54849815dd +Author: Carl Worth +Date: Fri Jun 3 16:16:44 2005 +0000 + + Fix name of _cairo_user_data_array_destroy to be _cairo_user_data_array_fini. + + ChangeLog | 8 ++++++++ + src/cairo-array.c | 6 +++--- + src/cairo-font.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairoint.h | 2 +- + 5 files changed, 14 insertions(+), 6 deletions(-) + +commit 42c1fb7c918ceb7920ddc8b6b75b38fd757d3a06 +Author: Carl Worth +Date: Fri Jun 3 16:08:28 2005 +0000 + + Rename functions to match the naming scheme used by cairo-cache.c and all other users of it. Though it's quite likely that glitz had this right and now everything could be changed to match it instead. I'll save that for some day when we're cleaning up the cache code. + + ChangeLog | 12 ++++++++++++ + src/cairo-glitz-surface.c | 14 +++++++------- + 2 files changed, 19 insertions(+), 7 deletions(-) + +commit 97ac61700ae8d2fcf055fdad12533671895f539b +Author: Carl Worth +Date: Fri Jun 3 15:56:52 2005 +0000 + + Fix spelling errors. + + CODING_STYLE | 6 +++--- + ChangeLog | 4 ++++ + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 56990720358ea18b026f952101ddd674a5fbb268 +Author: Carl Worth +Date: Fri Jun 3 15:54:40 2005 +0000 + + Fix Freudian unwrapped line in paragraph describing why long lines should be wrapped. + + CODING_STYLE | 5 +++-- + ChangeLog | 7 ++++++- + src/cairo-gstate-private.h | 1 - + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit 36beed9bf1b3ddef42e0fb1a46035ed4a6afa4f7 +Author: Carl Worth +Date: Fri Jun 3 14:51:57 2005 +0000 + + Add CODING_STYLE document to standardize on some style issues. + Standardize brace handling around all else clauses according to new CODING_STYLE guidelines. + + CODING_STYLE | 211 ++++++++++++++++++++++++++++++++++++++++++++++ + ChangeLog | 21 ++++- + src/cairo-atsui-font.c | 6 +- + src/cairo-cache.c | 6 ++ + src/cairo-ft-font.c | 5 +- + src/cairo-glitz-surface.c | 6 +- + src/cairo-gstate.c | 4 + + src/cairo-hash.c | 6 ++ + src/cairo-matrix.c | 2 + + src/cairo-pattern.c | 16 +++- + src/cairo-pdf-surface.c | 6 +- + src/cairo-spline.c | 16 ++-- + src/cairo-wideint.c | 6 +- + src/cairo-win32-font.c | 3 +- + src/cairo-xlib-surface.c | 13 ++- + 15 files changed, 297 insertions(+), 30 deletions(-) + +commit f87fd91bcf06a1e7a9332005b5d88d6b55c82548 +Author: Kristian Høgsberg +Date: Fri Jun 3 10:28:42 2005 +0000 + + Patch from Tomasz Cholewo : + Store the index of the checksum instea of a pointer to the location. + + ChangeLog | 8 ++++++++ + src/cairo-pdf-surface.c | 10 +++++----- + 2 files changed, 13 insertions(+), 5 deletions(-) + +commit bb00e0fce5a92693e20fde64b039fd4d105b82eb +Author: Carl Worth +Date: Fri Jun 3 09:38:39 2005 +0000 + + Move internal convenience up from _cairo_gstate_set_source_solid to _cairo_set_source_solid so that all set_source functions flow through cairo_set_source. + + ChangeLog | 9 +++++++++ + src/cairo-gstate.c | 18 ------------------ + src/cairo.c | 20 ++++++++++++++++++-- + src/cairoint.h | 4 ---- + 4 files changed, 27 insertions(+), 24 deletions(-) + +commit 4914eac983a92b7c424c217fdbaf13bb772cb1b9 +Author: Carl Worth +Date: Wed Jun 1 13:36:20 2005 +0000 + + Remove obsolete _cairo_gstate_set_target_surface, folding its contents into _cairo_gstate_init, most of which disappears due to constant folding. Ensure that gstate->next is initialized even if _cairo_pattern_create_solid fails. + Remove unused _cairo_xcb_surface_set_clip_region. + + ChangeLog | 11 +++++++++ + src/cairo-gstate.c | 60 ++++--------------------------------------------- + src/cairo-xcb-surface.c | 8 ------- + 3 files changed, 15 insertions(+), 64 deletions(-) + +commit c56938e568b3c4a5118e2f050214bb1906329153 +Author: Carl Worth +Date: Wed Jun 1 13:24:10 2005 +0000 + + Rename CAIRO_OK to STATUS_OK. No intended changes in functionality. + + ChangeLog | 18 ++++++++++++++++++ + src/cairo-font.c | 12 ++++++------ + src/cairo-ft-font.c | 6 +++--- + src/cairo-glitz-surface.c | 6 +++--- + src/cairo-gstate.c | 48 +++++++++++++++++++++++------------------------ + src/cairo-image-surface.c | 6 +++--- + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-png.c | 6 +++--- + src/cairo-surface.c | 10 +++++----- + src/cairo-win32-font.c | 26 ++++++++++++------------- + src/cairo-win32-surface.c | 4 ++-- + src/cairo-xcb-surface.c | 6 +++--- + src/cairo-xlib-surface.c | 6 +++--- + src/cairoint.h | 2 +- + 15 files changed, 90 insertions(+), 72 deletions(-) + +commit 045ba795dabacbb9153015ce0d4cb0881cd0d863 +Author: Carl Worth +Date: Wed Jun 1 13:19:52 2005 +0000 + + Rename gstate->surface to gstate->target. No intended changes in functionality. + + ChangeLog | 6 +++ + src/cairo-gstate-private.h | 2 +- + src/cairo-gstate.c | 114 ++++++++++++++++++++++----------------------- + 3 files changed, 64 insertions(+), 58 deletions(-) + +commit 6c62cf76435153c6fdc165d229ee02e52c5c0db5 +Author: Carl Worth +Date: Wed Jun 1 13:13:10 2005 +0000 + + Remove unused fields from cairo_gstate_t, (font_family, font_slant, font_weight). Reorder fields to match between declaration and initialization and to put the most problematic fields (surface and source) at the end. No intended changes in functionality. + + ChangeLog | 9 +++++++++ + src/cairo-gstate-private.h | 14 +++++--------- + src/cairo-gstate.c | 14 +++++++------- + 3 files changed, 21 insertions(+), 16 deletions(-) + +commit 707a2c97a1cb709ccf60899576467b898f658481 +Author: Carl Worth +Date: Wed Jun 1 13:10:57 2005 +0000 + + Add self-intersecting to the list of expected failures. + + ChangeLog | 5 +++++ + test/Makefile.am | 1 + + 2 files changed, 6 insertions(+) + +commit 48fbc201c787512076934c40f15e173dbff771c3 +Author: Carl Worth +Date: Wed Jun 1 11:03:50 2005 +0000 + + Add self-intersecting test which demonstrates the long-standing bug with stroking self-intersecting paths. + + ChangeLog | 9 +++++ + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/self-intersecting-ref.png | Bin 0 -> 242 bytes + test/self-intersecting.c | 89 +++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 102 insertions(+) + +commit 37a48e674c575eaf36a3d9e8d84ea21f70da9a5b +Author: Carl Worth +Date: Wed Jun 1 00:29:24 2005 +0000 + + Fix bug in converting box to rectangle that left clip_rect.height uninitialized, (leading to unpredictable, intermittent test failures). + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 2 +- + src/cairo-traps.c | 2 +- + 3 files changed, 9 insertions(+), 2 deletions(-) + +commit 7bb6dfdaa2cd1c7b6c673edce27045678938bd18 +Author: Carl Worth +Date: Tue May 31 16:05:06 2005 +0000 + + Add new function cairo_status_to_string an reimplement cairo_status_string in terms of the new function. + + ChangeLog | 7 +++++++ + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-win32.sgml | 2 -- + doc/public/tmpl/cairo-xcb-xrender.sgml | 2 -- + doc/public/tmpl/cairo-xlib-xrender.sgml | 2 -- + src/cairo.c | 10 ++++++++-- + src/cairo.h | 3 +++ + 7 files changed, 19 insertions(+), 8 deletions(-) + +commit 63428d3cc77bc08d1db9e228ddf37a153a0cc221 +Author: Olivier Andrieu +Date: Thu May 26 17:35:35 2005 +0000 + + : Fix memory leak + + ChangeLog | 7 ++++++- + src/cairo-path-data.c | 16 ++++++++++++---- + 2 files changed, 18 insertions(+), 5 deletions(-) + +commit ae96f5db6cb357ae9432d66a9590e11e6c7d9cca +Author: Keith Packard +Date: Thu May 26 13:02:31 2005 +0000 + + Split clipping into separate source and destination operand clips. By default, source operands are not affected by any client clipping. This matches the desired semantics for cairo. When this code is ported back to the X server, that will have to select the clipping option which clip source operands to the client clip. + + pixman/ChangeLog | 15 +++++++++++++++ + pixman/src/iccompose.c | 20 +++++++++++++------- + pixman/src/icimage.c | 37 ++++++++++++++++++++++++++++++++----- + pixman/src/icimage.h | 9 ++++++--- + 4 files changed, 66 insertions(+), 15 deletions(-) + +commit 45a966f69528c86dd6e3d4736805803b80de9f9b +Author: Keith Packard +Date: Thu May 26 11:35:44 2005 +0000 + + Replace nesting-only surface clipping with gstate contained serial-number tracked clipping sets that are loaded into the surface on demand just before each rendering operation. This permits multiple cairo_t contexts to reference a surface without regard to ordering of operations among the contexts. + Also in this patch is a change to the xlib surface that creates two separate Pictures, one for source and one for destination operands which separates the source clipping from destination clipping. Cairo now specifies that sources are never clipped by any clipping applied to them as destinations. + Move cairo_clip_t (renamed from cairo_clip_rec_t) from cairoint.h to cairo-gstate-private.h. Eliminate stack of clip state from surfaces. Add new surface clipping API. + Manage clip objects entirely within the gstate, loading the whole thing into the surface just before drawing. + Source surfaces need not have clipping modified as the surface interface now specifies that source surfaces are always unclipped. + Eliminate nested clipping contexts, leaving clip management entirely to the gstate. Create new clip API for the gstate which uses per-surface serial numbers to match gstate clipping against current surface clipping values. + Surfaces no longer track clipping regions at all, so the old _cairo_surface_get_clip_extents has been replaced with _cairo_surface_get_extents. For PDF/PS surfaces, this function is expected to return a rectangle covering the entire fixed point coordinate space to leave rendering unclipped by the surface. + Region clipping capability is now signalled by a non-NULL function pointer in set_clip_region. + Each surface now contains two Pictures, one for source and one for destination operands so that source operands are never clipped by destination clipping. + CAIRO_STATUS_BAD_NESTING removed + self-copy now passes (Xlib only, until libpixman changes land) + reviewed by: krh, otaylor, cworth + + ChangeLog | 95 +++++++++++++++ + src/cairo-gstate-private.h | 30 ++++- + src/cairo-gstate.c | 286 ++++++++++++++++++++++++-------------------- + src/cairo-pattern.c | 28 ----- + src/cairo-surface.c | 292 ++++++++++++++++++++------------------------- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 123 ++++++++++++------- + src/cairo.c | 2 - + src/cairo.h | 7 +- + src/cairoint.h | 72 ++++++----- + test/Makefile.am | 1 - + test/self-copy.c | 3 +- + 12 files changed, 541 insertions(+), 400 deletions(-) + +commit be903f4c2232bfa8b48c1dca60ad5cf65f403c77 +Author: Olivier Andrieu +Date: Thu May 26 03:31:28 2005 +0000 + + trivial doc fixes. + + ChangeLog | 4 ++++ + src/cairo.c | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 17a5c3a3daef92ee1702edd4ca007590d5606ae6 +Author: Carl Worth +Date: Tue May 24 16:08:39 2005 +0000 + + Re-synch with latest from gtk-doc CVS tree. + Add --only-section-tmpl option so that changes to inline documentation does not lead to churn in the .sgml template files. + Commit new templates now that gtk-doc has ripped all the inline portions out. + New template files added for new sections. + Update to match current API. + Make parameter names match those in the .c file and its documentation. + + ChangeLog | 33 + + doc/public/.cvsignore | 3 + + doc/public/Makefile.am | 3 + + doc/public/cairo-sections.txt | 102 ++- + doc/public/tmpl/cairo-font.sgml | 129 ---- + doc/public/tmpl/cairo-ft.sgml | 36 - + doc/public/tmpl/cairo-glitz.sgml | 9 - + doc/public/tmpl/cairo-matrix.sgml | 157 ----- + doc/public/tmpl/cairo-pattern.sgml | 151 ----- + doc/public/tmpl/cairo-pdf.sgml | 21 - + doc/public/tmpl/cairo-png.sgml | 40 -- + doc/public/tmpl/cairo-ps.sgml | 17 - + doc/public/tmpl/cairo-quartz.sgml | 11 - + doc/public/tmpl/cairo-surface.sgml | 145 ---- + doc/public/tmpl/cairo-win32.sgml | 21 + + doc/public/tmpl/cairo-xcb-xrender.sgml | 21 + + doc/public/tmpl/cairo-xcb.sgml | 17 - + doc/public/tmpl/cairo-xlib-xrender.sgml | 21 + + doc/public/tmpl/cairo-xlib.sgml | 26 - + doc/public/tmpl/cairo.sgml | 1108 ------------------------------- + gtk-doc.make | 26 +- + src/cairo-xcb.h | 2 +- + 22 files changed, 177 insertions(+), 1922 deletions(-) + +commit d41465d89a4df689d56d4a6cf06d6615ddf1b3ce +Author: Carl Worth +Date: Sun May 22 11:12:46 2005 +0000 + + Protect less-than and greater-than symbols in documentation string. + + ChangeLog | 3 +++ + doc/public/tmpl/cairo-atsui.sgml | 9 --------- + doc/public/tmpl/cairo-pdf.sgml | 22 +++++----------------- + doc/public/tmpl/cairo-ps.sgml | 6 +++++- + doc/public/tmpl/cairo-xcb.sgml | 9 +++++++-- + doc/public/tmpl/cairo-xlib.sgml | 17 ++++------------- + doc/public/tmpl/cairo.sgml | 1 + + src/cairo.c | 2 +- + 8 files changed, 26 insertions(+), 43 deletions(-) + +commit e90a5c89900ec2034628b8894ada7bef272326a6 +Author: Carl Worth +Date: Sun May 22 09:08:23 2005 +0000 + + Not that a patch has been submitted for consistent error handling. + Fix documentation string for cairo_create so that it might actualyl appear in the manual. + + ChangeLog | 8 ++++++++ + TODO | 2 +- + src/cairo.c | 4 ++-- + 3 files changed, 11 insertions(+), 3 deletions(-) + +commit b16dafe5539676874dff783ba1c31dc5a65cf9a4 +Author: Carl Worth +Date: Wed May 18 10:23:48 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_1_5. + + pixman/ChangeLog | 5 +++++ + pixman/configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 17c740eb6bb7567a0ac70afd339d1a0cc0bb979e +Author: Carl Worth +Date: Wed May 18 10:13:14 2005 +0000 + + Add notes for snapshot 0.1.5. + Increment version to 0.1.5. + + pixman/ChangeLog | 6 ++++++ + pixman/NEWS | 18 ++++++++++++++++++ + pixman/configure.in | 2 +- + 3 files changed, 25 insertions(+), 1 deletion(-) + +commit b1301f401336a29f63a8b5990969e03593f1808a +Author: Carl Worth +Date: Wed May 18 09:41:47 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_5_0. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit f083b21c76b3a3f542b93d32a40cd5deccc0c985 +Author: Carl Worth +Date: Wed May 18 09:27:24 2005 +0000 + + Clear pointers to NULL after destroying/freeing them. + + pixman/ChangeLog | 5 +++++ + pixman/src/icimage.c | 12 +++++++++--- + 2 files changed, 14 insertions(+), 3 deletions(-) + +commit 55a7bb718ffe9598b8c39902023e68355836592f +Author: Carl Worth +Date: Wed May 18 09:25:54 2005 +0000 + + Declare pixman_fixed16_16_t properly as int32_t rather than just int. Reported by Lance Fetters. + + pixman/ChangeLog | 5 +++++ + pixman/src/pixman.h | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit f030aec810d74a60a44c35bf7815b9e94743cd65 +Author: Carl Worth +Date: Tue May 17 18:39:56 2005 +0000 + + Added porting guide to help with transition to cairo 0.5 API. + Added notes for snapshot 0.5.0 + Increment CAIRO_VERSION to 0.5.0 + + ChangeLog | 9 ++ + NEWS | 304 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + PORTING_GUIDE | 257 +++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 4 files changed, 571 insertions(+), 1 deletion(-) + +commit 3f9573b7bb3f3066ad3e20908edd4af30cac3284 +Author: Carl Worth +Date: Tue May 17 15:23:53 2005 +0000 + + Bring up to date with Keith's latest improvements to cairo-xlib-surface.c: Add some comments about how and why masks are computed. Generalize overflow detection in mask computation. Expand on pixman format conversion comment. Fix the broken visual->format case. + + ChangeLog | 11 +++++++++- + src/cairo-xcb-surface.c | 53 ++++++++++++++++++++++++++++--------------------- + 2 files changed, 40 insertions(+), 24 deletions(-) + +commit f0923288c58f42bf45dc6658a504b14faec6df53 +Author: Carl Worth +Date: Tue May 17 12:40:55 2005 +0000 + + Two fixes from Kristion Høgsberg: + Fix to close the file if we opened it. + Grab the status from out of the stream _before_ we destroy the stream. + + ChangeLog | 12 ++++++++++++ + src/cairo-output-stream.c | 9 ++++++++- + src/cairo-pdf-surface.c | 5 ++++- + 3 files changed, 24 insertions(+), 2 deletions(-) + +commit b4710711b8e39738587249f04a41ae99c5eae981 +Author: Keith Packard +Date: Tue May 17 12:21:56 2005 +0000 + + Add some comments about how and why masks are computed. Generalize overflow detection in mask computation. Expand on pixman format conversion comment. + + ChangeLog | 7 +++++++ + src/cairo-xlib-surface.c | 32 ++++++++++++++++++++------------ + 2 files changed, 27 insertions(+), 12 deletions(-) + +commit e72c41f95b8ae262f82d9023174c88f4e9c02fe3 +Author: Carl Worth +Date: Tue May 17 11:28:26 2005 +0000 + + Fix documentation to not mention set_size for the _for_bitmap functions. + + ChangeLog | 6 ++++++ + src/cairo-xcb-surface.c | 6 +----- + src/cairo-xlib-surface.c | 6 +----- + 3 files changed, 8 insertions(+), 10 deletions(-) + +commit 5cc39a708c623cbe6a8c5efdad538778b2fbadd7 +Author: Carl Worth +Date: Tue May 17 09:13:02 2005 +0000 + + Remove #ifdef munging since we once again support either #if or #ifdef. + + ChangeLog | 5 +++++ + RELEASING | 7 +++++-- + util/cairo-api-update | 1 - + 3 files changed, 10 insertions(+), 3 deletions(-) + +commit ec84ace5a6830778d29d36f9fc87361e8545f57b +Author: Carl Worth +Date: Tue May 17 09:08:23 2005 +0000 + + Update instructions to match output of 'make distcheck' + Add private headers and flesh out CLEANFILES so that 'make distcheck' actually passes. + + ChangeLog | 9 +++++++++ + RELEASING | 7 ++++--- + src/Makefile.am | 4 ++++ + test/Makefile.am | 4 ++-- + 4 files changed, 19 insertions(+), 5 deletions(-) + +commit 366aa98a792460bda8de70bc7eb342950e214ce3 +Author: Carl Worth +Date: Tue May 17 08:34:44 2005 +0000 + + Fix more deprecation macros + + src/cairo.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 23b7ac25edae4992c78b20f02d538bd717799f95 +Author: Carl Worth +Date: Tue May 17 08:26:37 2005 +0000 + + Add a few more REPLACED_BY and DEPRECATED_BY definitions. + Add some helpful warnings. + + ChangeLog | 7 +++++++ + src/cairo.h | 17 ++++++++++++++++- + util/cairo-api-update | 8 ++++++++ + 3 files changed, 31 insertions(+), 1 deletion(-) + +commit f82a3b2b557c91be0f6e6e26f89c5f7ef90b426a +Author: Carl Worth +Date: Tue May 17 06:12:52 2005 +0000 + + Add cairo-xlib-xrender.h which was missed from an earlier commit. + + ChangeLog | 5 +++++ + src/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 30d7ede3dfdc256180e4447debd0be6d69c699b7 +Author: Carl Worth +Date: Tue May 17 06:11:32 2005 +0000 + + Update cairo-xcb.h to provide the same style of interface as cairo-xlib.h. + Update to match new cairo_xcb_surface_t create functions. + + ChangeLog | 14 ++ + src/Makefile.am | 2 +- + src/cairo-xcb-surface.c | 410 ++++++++++++++++++++++++++++-------------------- + src/cairo-xcb-xrender.h | 62 ++++++++ + src/cairo-xcb.h | 21 ++- + test/cairo-test.c | 115 ++++++++++++-- + 6 files changed, 427 insertions(+), 197 deletions(-) + +commit f67f5003df306de40416f24bc652fc4630cf5808 +Author: Carl Worth +Date: Tue May 17 06:08:01 2005 +0000 + + Avoid shifting 32-bit quanity by 32 bits, which is undefined behavior. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 5 +++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 0c05b23b3165ec6908c28f56b3446cf43dff44a2 +Author: Carl Worth +Date: Tue May 17 06:05:13 2005 +0000 + + Rework of cairo_xlib_surface create functions by Keith Packard: + Add cairo_xlib_surface_create_with_render_format. + Reduce Xlib constructors down to two simple forms. Add width, height to constructors and eliminate any synchronous size queries from the implementation. + Update to match new cairo_xlib_surface_t create functions. + + ChangeLog | 18 ++ + src/cairo-xlib-surface.c | 453 +++++++++++++++++++++++++---------------------- + src/cairo-xlib-xrender.h | 62 +++++++ + src/cairo-xlib.h | 15 +- + test/cairo-test.c | 14 +- + test/xlib-surface.c | 10 +- + 6 files changed, 342 insertions(+), 230 deletions(-) + +commit 84bc5a32d6b3ad366698c14a01f7a4898f1cd25c +Author: Carl Worth +Date: Tue May 17 05:58:01 2005 +0000 + + Remove destroy_closure from cairo_output_stream_t interface. + Remove destroy_closure argument from cairo_pdf_surface_create_for_stream. Rename width,height to width_in_points, height_in_points for better clarity. + Brush a bunch of dust off of the PS backend and bring it up to date with the latest API conventions from the PDF backend. These include: accepting a filename rather than a FILE in the primary constructor, providing a stream-based interface for more flexibility, and accepting a surface size in device-space units (points) rather than inches. + Make it a little more clear that the width and height being passed around are in units of points. + Update to the latest cairo-ps.h changes as described above. Notice how much more sane things become now that the surface size is described in device-space units. + + ChangeLog | 27 ++++++++ + src/cairo-output-stream.c | 23 ++----- + src/cairo-pdf-surface.c | 13 ++-- + src/cairo-pdf.h | 17 +++--- + src/cairo-ps-surface.c | 153 ++++++++++++++++++++++++++++------------------ + src/cairo-ps.h | 19 ++++-- + src/cairoint.h | 1 - + test/pdf-surface.c | 11 ++-- + test/ps-surface.c | 13 +--- + 9 files changed, 164 insertions(+), 113 deletions(-) + +commit 9bf26e8e73e0bafd7361ae38d485c9b9b17794b1 +Author: Carl Worth +Date: Tue May 17 01:05:35 2005 +0000 + + Add simple test for ps surface backend (modeled after pdf-surface.c). + Add print message telling user to examine resulting file. + + ChangeLog | 10 +++++ + test/.cvsignore | 2 + + test/Makefile.am | 5 +++ + test/pdf-surface.c | 2 + + test/ps-surface.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 141 insertions(+) + +commit 189161118faeb3a6d5d7b625f16ffbef22231c93 +Author: Carl Worth +Date: Tue May 17 00:54:09 2005 +0000 + + Update PDF test case to make sure we're actually getting the right paper size, image scaling etc. And it should now be easier to see if cairo is happy by manually viewing the resulting PDF file. + + ChangeLog | 7 ++++++ + test/pdf-surface.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 62 insertions(+), 7 deletions(-) + +commit 9bf669a790cfda9950a8fa204de541133c671bd9 +Author: Carl Worth +Date: Tue May 17 00:39:17 2005 +0000 + + Fix to include cairo-xlib.h, (which also fixes test/xlib-surface.c). + + ChangeLog | 5 +++++ + src/cairo-xlib-test.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 91dcaea6a2cd9a169e8b0a23a1a0902cd42b3a93 +Author: Carl Worth +Date: Tue May 17 00:34:10 2005 +0000 + + Update to the latest PDF surface API changes: use filename not FILE* and use surface dimension in points, not inches. + + ChangeLog | 6 ++++++ + test/pdf-surface.c | 18 ++++++++---------- + 2 files changed, 14 insertions(+), 10 deletions(-) + +commit 200bcda18859699832ea2cf8d86abd57b501aecc +Author: Keith Packard +Date: Mon May 16 22:31:36 2005 +0000 + + Initialize op->stops[0].scale = 0. + This scale value is used only when computing gradient values before the defined range, in which case stop 0 is used for both ends of the interpolation, making the value of 'scale' not actually matter, except that valgrind notices we're using an undefined value. + + ChangeLog | 11 +++++++++++ + src/cairo-pattern.c | 7 +++++++ + 2 files changed, 18 insertions(+) + +commit e5b31bca7c0a7d7eb4dec303fb652c26652c3f60 +Author: Carl Worth +Date: Mon May 16 15:05:56 2005 +0000 + + Remove quarter-over test name accidentally added to Makefile. + + ChangeLog | 6 ++++++ + test/.cvsignore | 1 - + test/Makefile.am | 3 --- + 3 files changed, 6 insertions(+), 4 deletions(-) + +commit ea410111d38145e7c74558951b1d895ebaf6f8dc +Author: Kristian Høgsberg +Date: Mon May 16 11:41:42 2005 +0000 + + Take a filename instead of a FILE pointer. + + ChangeLog | 7 +++++++ + src/cairo-output-stream.c | 20 +++++++++++++++++--- + src/cairo-pdf-surface.c | 24 ++++++++++++------------ + src/cairo-pdf.h | 10 ++++------ + src/cairoint.h | 2 +- + 5 files changed, 41 insertions(+), 22 deletions(-) + +commit 60b0a05df73cef4a67d111a282b20ce1fd5081e6 +Author: Carl Worth +Date: Sat May 14 14:01:46 2005 +0000 + + Brush the dust off the XCB backend and get it compiling and working again. This patch makes the XCB surface API match that of the Xlib surface API as of yesterday. But, it's already stale as the Xlib API changed again. So we'll need one more revision of the XCB backend before the next snapshot. + Add support for testing of the xcb backend as well. + + ChangeLog | 24 +++ + src/cairo-xcb-surface.c | 404 +++++++++++++++++++++++++++++++++++++++--------- + src/cairo-xcb.h | 22 ++- + test/.cvsignore | 2 + + test/Makefile.am | 3 + + test/cairo-test.c | 47 +++++- + test/cairo-test.h | 2 - + 7 files changed, 427 insertions(+), 77 deletions(-) + +commit 6a1af1999dfb79f05341ea6c4bf0e23795db01bc +Author: Carl Worth +Date: Sat May 14 13:51:59 2005 +0000 + + Cleanup output a bit, move verbose messages to test-specific log file. + + ChangeLog | 7 +++++++ + test/cairo-test.c | 6 +++++- + test/pdf-surface.c | 1 + + test/xlib-surface.c | 31 ++++++++++++++++++------------- + 4 files changed, 31 insertions(+), 14 deletions(-) + +commit 53e6fdb8855ad7bc54ec40ebf6609cccb6eac54c +Author: Carl Worth +Date: Sat May 14 13:22:25 2005 +0000 + + Fix the last commit so it actually compiles now. + + ChangeLog | 8 +++++++- + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 55366995b6783309493af8a9f88560b6ad3494ff +Author: Carl Worth +Date: Sat May 14 10:15:11 2005 +0000 + + Fix a few documentation typos in the recent xlib surface rework. + + ChangeLog | 7 +++++++ + src/cairo-xlib-surface.c | 17 +++++++++-------- + test/.cvsignore | 1 + + 3 files changed, 17 insertions(+), 8 deletions(-) + +commit 95859dc2c6975f072696374b90e1108626a99830 +Author: Carl Worth +Date: Sat May 14 10:03:56 2005 +0000 + + Add an #error if cairo-foo.h is included when cairo was compiled without support for the foo backend. + + ChangeLog | 13 +++++++++++++ + src/cairo-atsui.h | 3 +++ + src/cairo-ft.h | 3 +++ + src/cairo-glitz.h | 3 +++ + src/cairo-pdf.h | 3 +++ + src/cairo-ps.h | 3 +++ + src/cairo-quartz.h | 3 +++ + src/cairo-win32.h | 6 ++++-- + src/cairo-xcb.h | 3 +++ + src/cairo-xlib.h | 3 +++ + 10 files changed, 41 insertions(+), 2 deletions(-) + +commit f797eaac1ce939a0a890ab2157f42d2ae3421dda +Author: Carl Worth +Date: Sat May 14 10:00:27 2005 +0000 + + Update for change in cairo_pdf_surface_create which no longer accepts DPI values. + + ChangeLog | 5 +++++ + test/pdf-surface.c | 3 +-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit bef4b1371676444e51dcd73f1ec52024265c1f5b +Author: Owen Taylor +Date: Fri May 13 17:54:43 2005 +0000 + + src/cairo-xlib-surface.c src/cairo-xlib.h doc/public/cairo-sections.txt: Drop the _for_pixmap() and _for_window() out of the create functions and use some lazy cleverness to sniff the information out as needed. + src/cairo-xlib-surface.c src/cairo-xlib-test.h Makefile.am: add cairo_test_xlib_disable_render() to turn off RENDER for tests. + Test various different types of Xlib surface creation. + Remove left-over include of Xrender.h. + + ChangeLog | 16 +++ + doc/public/Makefile.am | 1 + + doc/public/cairo-sections.txt | 5 +- + doc/public/tmpl/cairo-xlib.sgml | 20 +--- + src/Makefile.am | 2 +- + src/cairo-xlib-surface.c | 190 +++++++++++++++++++---------- + src/cairo-xlib-test.h | 55 +++++++++ + src/cairo-xlib.h | 18 +-- + test/Makefile.am | 5 + + test/cairo-test.c | 4 +- + test/xlib-surface.c | 260 ++++++++++++++++++++++++++++++++++++++++ + 11 files changed, 479 insertions(+), 97 deletions(-) + +commit 15ecc8776327ee076274d4234f36ab584956c073 +Author: Kristian Høgsberg +Date: Fri May 13 14:04:22 2005 +0000 + + Make this a varg function and use the new _cairo_output_stream_vprintf() function to format extra dict contents. + Reimplement the printf logic so we can special case formatting of doubles to be locale independent and trim trailing zeros. + + ChangeLog | 9 +++ + src/cairo-output-stream.c | 156 ++++++++++++++++++++++++++++++++++++++++++---- + src/cairo-pdf-surface.c | 86 +++++++++++++------------ + src/cairoint.h | 5 ++ + 4 files changed, 203 insertions(+), 53 deletions(-) + +commit b9db66eb17754da628894a4e43943f3fbef88406 +Author: Kristian Høgsberg +Date: Fri May 13 09:26:20 2005 +0000 + + Rename cairo_pdf_surface_create_for_callback() to cairo_pdf_surface_create_for_stream(), and change PDF constructors to take width and height as points and move PPI setting to cairo_pdf_surface_set_ppi() + + ChangeLog | 8 ++++ + src/cairo-pdf-surface.c | 120 +++++++++++++++++++++--------------------------- + src/cairo-pdf.h | 23 +++++----- + 3 files changed, 73 insertions(+), 78 deletions(-) + +commit 9ebf15e9600c5a5c741cd1540478bb18f236b55d +Author: Owen Taylor +Date: Fri May 13 08:09:24 2005 +0000 + + Fix misplaced goto. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 5 +++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 7c4a2b1d6e10808bac483b5f2b01efa70bca2c02 +Author: Carl Worth +Date: Thu May 12 23:11:55 2005 +0000 + + Fix image->data to be unsigned + Track change in signedness of data member/parameter. + + ChangeLog | 13 +++++++++++++ + src/cairo-glitz-surface.c | 2 +- + src/cairo-image-surface.c | 6 +++--- + src/cairo-xlib-surface.c | 6 +++--- + src/cairoint.h | 6 +++--- + 5 files changed, 23 insertions(+), 10 deletions(-) + +commit d5ca4e37d7b761ccc4fc500c5ba615526a4a38c7 +Author: Carl Worth +Date: Thu May 12 23:09:58 2005 +0000 + + Update xcb backend to compile after recent API changes: + Fix missing return value. (_cairo_xcb_surface_acquire_source_image): Remove calls to non-existent cairo_surface functions. (_cairo_xcb_surface_set_matrix): Update for new matrix member names. (_cairo_xcb_surface_get_extents): Fix typo. + + ChangeLog | 11 +++++++++++ + src/cairo-xcb-surface.c | 25 +++++++++++-------------- + 2 files changed, 22 insertions(+), 14 deletions(-) + +commit 949daa1bc98cdd34a6c3d7b3ca69fd06e88883e4 +Author: Keith Packard +Date: Thu May 12 20:25:07 2005 +0000 + + libpixman creates an A8 format object and sometimes forgets to destroy (when the bounds of the trapezoids are empty). Avoids creating the format object in that case. + reviewed by: cworth + + pixman/ChangeLog | 9 +++++++++ + pixman/src/ictrap.c | 13 ++++++++----- + 2 files changed, 17 insertions(+), 5 deletions(-) + +commit 27d9c575a77e0b6dc995e348c4877bc0092a4571 +Author: Carl Worth +Date: Thu May 12 11:02:35 2005 +0000 + + Add new test for bug in cairo_paint_with_alpha not transforming the source. + Use a transformed copy of the source just like we do in all the other calls to cairo_surface_composite. Fixes the bug tested by test/paint-with-alpha. + + ChangeLog | 13 +++++++++ + src/cairo-gstate.c | 6 +++- + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/paint-with-alpha-ref.png | Bin 0 -> 164 bytes + test/paint-with-alpha.c | 64 ++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 86 insertions(+), 1 deletion(-) + +commit 52f41b7bf08a5e3a599ef6ebc7273f057ada4fa6 +Author: Keith Packard +Date: Thu May 12 08:04:22 2005 +0000 + + _get_mask_extents creates a pixman region but neglects to destroy it. + reviewed by: otaylor + + ChangeLog | 8 ++++++++ + src/cairo-gstate.c | 2 ++ + 2 files changed, 10 insertions(+) + +commit e4e5b1f00ded346f40c788fa9b6cfdd3164c1241 +Author: Owen Taylor +Date: Wed May 11 16:32:44 2005 +0000 + + Handle more cases by assuming no-super-luminescent colors. + + ChangeLog | 5 +++++ + src/cairo-win32-surface.c | 12 ++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit b913a81c3482f4dc8bc452d91bfaf64b416523f3 +Author: T Rowley +Date: Wed May 11 16:01:56 2005 +0000 + + Revive quartz backend. + Set fill type repeat on source surface. (_cairo_glitz_surface_show_glyphs): Add missing cairo operator to glitz operator conversion. (_cairo_glitz_surface_show_glyphs): Only render glyphs with non zero size. + Fix bounding box computation. + + ChangeLog | 21 +++++++++ + src/cairo-surface.c | 18 ++++---- + src/cairo-win32-font.c | 36 +++++++-------- + src/cairo-win32-surface.c | 111 +++++++++++++++++++++++++++++++++++++--------- + test/Makefile.am | 5 ++- + test/cairo-test.c | 9 ++-- + 6 files changed, 149 insertions(+), 51 deletions(-) + +commit 3be31fee9ae5d1740f71ea829ba26df7569c976c +Author: Tor Lillqvist +Date: Wed May 11 15:39:26 2005 +0000 + + Revive quartz backend. + + ChangeLog | 6 ++ + src/cairo-atsui-font.c | 140 +++++++++++++++------------------------------ + src/cairo-atsui.h | 3 - + src/cairo-quartz-surface.c | 18 ++++-- + 4 files changed, 65 insertions(+), 102 deletions(-) + +commit ac278285c8a243c42a50e7d1f5cfc875a12401b2 +Author: David Reveman +Date: Wed May 11 13:53:18 2005 +0000 + + Avoid empty glyphs + + ChangeLog | 2 ++ + src/cairo-glitz-surface.c | 63 +++++++++++++++++++++++++++++++++-------------- + 2 files changed, 46 insertions(+), 19 deletions(-) + +commit bd168e15ca9dbd2a02ad5e2f7df1a661d534d679 +Author: David Reveman +Date: Wed May 11 13:30:56 2005 +0000 + + Fix fill_rectangles and show_glyphs in glitz backend + + ChangeLog | 7 +++++++ + src/cairo-glitz-surface.c | 12 +++++++----- + 2 files changed, 14 insertions(+), 5 deletions(-) + +commit 59c2730b1d5fa511494858e599735948ce1cf394 +Author: Owen Taylor +Date: Tue May 10 21:06:01 2005 +0000 + + src/cairo-xlib-surface.c src/cairo-xlib.h: Remove leftover cairo_xlib_surface_create(). + + ChangeLog | 5 +++++ + doc/public/cairo-sections.txt | 1 - + doc/public/tmpl/cairo-xlib.sgml | 13 ------------- + src/cairo-xlib-surface.c | 16 ---------------- + src/cairo-xlib.h | 8 -------- + 5 files changed, 5 insertions(+), 38 deletions(-) + +commit 0c7c2246681dad0b69d6ea0438f18916dbb0e0a4 +Author: Owen Taylor +Date: Tue May 10 20:45:54 2005 +0000 + + src/cairo.c src/cairo-path-data.c src/cairo-path-data-private.h: Pass the gstate to _cairo_path_data_create[_flat] and use _cairo_gstate_backend_to_user() so as to properly handle the surface device offset. + + ChangeLog | 7 +++++++ + src/cairo-path-data-private.h | 6 ++---- + src/cairo-path-data.c | 38 ++++++++++++++++---------------------- + src/cairo.c | 8 ++------ + 4 files changed, 27 insertions(+), 32 deletions(-) + +commit 4e1cce108b641fbb6931ffa1d10aa1e4aef0329c +Author: Carl Worth +Date: Tue May 10 20:38:21 2005 +0000 + + Don't use return when calling a void function (thanks to Damien Carbery ). Closes bug #3134. + + ChangeLog | 6 ++++++ + src/cairo-arc.c | 8 ++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit b05c85eafb953fbe082b67875865ae4e4ca56ed2 +Author: Carl Worth +Date: Tue May 10 20:25:38 2005 +0000 + + Removing mucking around with stderr and add a cairo_test_log function instead. + Switch all error messages from fprintf(stderr,...) to cairo_test_log(...). + + ChangeLog | 14 ++++++++++++++ + test/buffer-diff.c | 17 +++++++++-------- + test/cairo-test.c | 45 +++++++++++++++++++++++++++++---------------- + test/cairo-test.h | 3 +++ + test/create-for-png.c | 2 +- + test/create-from-png.c | 2 +- + test/pdf-surface.c | 2 +- + test/read-png.c | 9 +++++---- + test/trap-clip.c | 4 ++-- + test/xmalloc.c | 5 +++-- + 10 files changed, 68 insertions(+), 35 deletions(-) + +commit 40796148b87eea991a9c624061a978821f108de6 +Author: Carl Worth +Date: Tue May 10 14:54:48 2005 +0000 + + Fix URLs for glitz and xlibs, (thanks to Jason Dorje Short ). + + ChangeLog | 5 +++++ + configure.in | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 6f3215cb7ff9c9ccb1728192765578ebb9352ac1 +Author: Carl Worth +Date: Tue May 10 14:48:05 2005 +0000 + + Update to current canonical URL for XCB. + + ChangeLog | 4 ++++ + configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 3253534a824cf3b81ea5b6abeaea0e4b414834d2 +Author: Carl Worth +Date: Tue May 10 12:42:32 2005 +0000 + + Don't guess and make our own definitions for uint8_t, etc. Just error out if we can't find a suitable header file. + Fix to use fixed-size type so that this code works when sizeof(unsigned long) != 32. Thanks to Manish Singh. + + ChangeLog | 11 +++++++++++ + src/cairo-png.c | 22 +++++++++++----------- + src/cairo-wideint.h | 9 ++------- + test/read-png.c | 28 +++++++++++++++++++++------- + 4 files changed, 45 insertions(+), 25 deletions(-) + +commit c66ca528e037381f485b53bb36b2e9a735c2b8f5 +Author: Carl Worth +Date: Tue May 10 12:22:41 2005 +0000 + + Fix cairo_get_font_matrix to actually use its out-parameter. And change the return type to void. + + ChangeLog | 8 ++++++++ + src/cairo-gstate.c | 7 ++++--- + src/cairo.c | 10 +++++----- + src/cairo.h | 5 +++-- + src/cairoint.h | 5 +++-- + 5 files changed, 23 insertions(+), 12 deletions(-) + +commit 7b46c815d2652a02aca77a3a962a37e22e9d04fb +Author: Owen Taylor +Date: Mon May 9 16:33:59 2005 +0000 + + Get the glyphslot point *after* we get the FT_Face. (Robert O'Callahan) + + ChangeLog | 5 +++++ + src/cairo-ft-font.c | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 01b2526ceb77e43f653f2909f6ff998a956d72a5 +Author: Carl Worth +Date: Mon May 9 10:41:17 2005 +0000 + + Fix deprecation macro to point to the right function, (thanks to John Ellson). + + ChangeLog | 5 +++++ + src/cairo.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 14c690472cf893978331dcf25cc50d43609928ad +Author: Carl Worth +Date: Mon May 9 09:12:52 2005 +0000 + + Push cairo_matrix_t const-correctness down through the entire implmentation, (expanding on preliminary work by Robert O'Callahan ) + + ChangeLog | 25 +++++++++++++++++++++++++ + src/cairo-font.c | 18 +++++++++--------- + src/cairo-ft-font.c | 19 ++++++++++--------- + src/cairo-gstate.c | 11 ++++++----- + src/cairo-image-surface.c | 2 +- + src/cairo-matrix.c | 19 +++++++++++-------- + src/cairo-pattern.c | 7 ++++--- + src/cairo.c | 10 ++++++---- + src/cairo.h | 30 +++++++++++++++++------------- + src/cairoint.h | 45 ++++++++++++++++++++++++--------------------- + 10 files changed, 113 insertions(+), 73 deletions(-) + +commit 31b4e5b4ecda4b3733f39b5f1f759cc59f953836 +Author: Carl Worth +Date: Mon May 9 08:34:57 2005 +0000 + + Change cairo-features again so that either #if or #ifdef will work to test any feature. + + ChangeLog | 6 ++++++ + configure.in | 44 +++++++++++--------------------------------- + src/cairo-features.h.in | 22 +++++++++++----------- + 3 files changed, 28 insertions(+), 44 deletions(-) + +commit 2e72b70124f678ba0bd21db318345a6583cb9cbd +Author: Owen Taylor +Date: Sat May 7 14:31:01 2005 +0000 + + doc/public/language-bindings.xml doc/public/cairo-doc.xml doc/public/Makefile.am: Document suggested conventions and techniques for many aspects of creating a language binding for Cairo. + + ChangeLog | 7 + + doc/public/language-bindings.xml | 726 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 733 insertions(+) + +commit 35248a17fd2cb1f4ff2bf312c092f853551bb9eb +Author: Owen Taylor +Date: Sat May 7 10:35:35 2005 +0000 + + Update. + + ChangeLog | 4 ++ + doc/public/cairo-sections.txt | 19 +-------- + doc/public/tmpl/cairo-glitz.sgml | 9 ----- + doc/public/tmpl/cairo-pdf.sgml | 33 ---------------- + doc/public/tmpl/cairo-ps.sgml | 13 ------- + doc/public/tmpl/cairo-quartz.sgml | 11 ------ + doc/public/tmpl/cairo-surface.sgml | 25 +++++++----- + doc/public/tmpl/cairo-xcb.sgml | 12 ------ + doc/public/tmpl/cairo-xlib.sgml | 10 ----- + doc/public/tmpl/cairo.sgml | 79 ++++++++++---------------------------- + 10 files changed, 41 insertions(+), 174 deletions(-) + +commit bc794062600a774a71045055deae5ad28483d7ec +Author: Carl Worth +Date: Fri May 6 22:42:52 2005 +0000 + + Point to both cairo_set_source_rgba and cairo_paint_with_alpha in deprecation of cairo_set_alpha. + + ChangeLog | 6 ++++++ + src/cairo.h | 2 +- + util/cairo-api-update | 3 ++- + 3 files changed, 9 insertions(+), 2 deletions(-) + +commit 750cc8143dda4e6194880dfc314a296424b325e5 +Author: Carl Worth +Date: Fri May 6 21:59:10 2005 +0000 + + Make idempotent substitutions that extend old names: + cairo_select_font -> cairo_select_font_face cairo_pattern_add_color_stop -> cairo_pattern_add_color_stop_rgba + by only substituting if the old name is not immediately followed by an underscore. + Tweak the substitution slightly to allow the script to be run on the cairo source itself, (eg. avoid changing the REPLACED_BY and DEPRECATED_BY macros that must mention the old names). + + ChangeLog | 15 +++++++++++++++ + util/cairo-api-update | 7 ++++--- + 2 files changed, 19 insertions(+), 3 deletions(-) + +commit 10c88d424485c7f001e9e03c121aa7c3b55336cc +Author: Carl Worth +Date: Fri May 6 21:33:22 2005 +0000 + + Change definitions of everything in cairo-features.h to prefer #if over #ifdef. + Track #ifdef -> #if changes. + Add support to automatically change all #ifdef CAIRO_HAS to #if CAIRO_HAS. + + ChangeLog | 26 ++++++++++ + configure.in | 135 +++++++++++++++++++----------------------------- + src/cairo-atsui.h | 2 +- + src/cairo-cache.c | 6 +-- + src/cairo-features.h.in | 24 ++++----- + src/cairo-ft-private.h | 2 +- + src/cairo-ft.h | 2 +- + src/cairo-glitz.h | 2 +- + src/cairo-hash.c | 6 +-- + src/cairo-pdf.h | 2 +- + src/cairo-ps.h | 2 +- + src/cairo-quartz.h | 2 +- + src/cairo-win32.h | 2 +- + src/cairo-xcb.h | 2 +- + src/cairo-xlib.h | 2 +- + src/cairo.c | 7 ++- + src/cairo.h | 4 +- + src/cairoint.h | 12 ++--- + test/cairo-test.c | 16 +++--- + util/cairo-api-update | 1 + + 20 files changed, 127 insertions(+), 130 deletions(-) + +commit 9939e01b693a885496cfa82430b91c11a121269e +Author: Carl Worth +Date: Fri May 6 21:25:56 2005 +0000 + + Remove deprecated cairo_get_rgb_color that was accidentally missed in the recent purge of deprecated functions. + + ChangeLog | 9 +++++++++ + src/cairo-gstate.c | 6 ------ + src/cairo-pattern.c | 19 ------------------- + src/cairo.c | 25 ------------------------- + src/cairo.h | 3 --- + src/cairoint.h | 10 ---------- + 6 files changed, 9 insertions(+), 63 deletions(-) + +commit 4fff218fc4e1cdce281b916ecb6b616e581601e0 +Author: Carl Worth +Date: Fri May 6 21:19:49 2005 +0000 + + Update to track new CAIRO_OPERATOR names. + Fix documentation to refer to functions by their current names. + Update to track latest API (in currently unused function). + + ChangeLog | 14 ++++++++++++++ + src/cairo-gstate.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-win32-surface.c | 6 +++--- + src/cairo-xcb-surface.c | 12 ++++++------ + test/select-font-no-show-text.c | 4 ++-- + 6 files changed, 27 insertions(+), 13 deletions(-) + +commit 7bf02c12ab3aafae5f6cf8519401d1272b183d30 +Author: Carl Worth +Date: Fri May 6 14:20:05 2005 +0000 + + Fix return type from cairo_status_t to cairo_int_status_t. + + ChangeLog | 5 +++++ + src/cairo-glitz-surface.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit c7afce2ffdbc1e2d4eae2ba5a85dfff4ad3016ad +Author: Carl Worth +Date: Fri May 6 13:42:45 2005 +0000 + + Note that cairo_mask, and "just eliminate a bunch of functions are now done". + Note that all backwards-compatible and backwards-incompatible cahnges for the API Shakeup are now done. Sort "new functionality" of API Shakeup into its own category. + + ChangeLog | 10 ++++++++++ + ROADMAP | 17 ++++++++--------- + TODO | 31 +++++++++++++++++-------------- + 3 files changed, 35 insertions(+), 23 deletions(-) + +commit d7fe527e0f48f23821b7283d8d003fd1f6a3f899 +Author: Carl Worth +Date: Fri May 6 13:32:53 2005 +0000 + + Eliminate the following deprecated functions from cairo's interface: + cairo_copy cairo_get_path cairo_get_path_flat cairo_matrix_create cairo_matrix_destroy cairo_matrix_copy cairo_matrix_get_affine cairo_surface_set_repeat cairo_surface_set_matrix cairo_surface_get_matrix cairo_surface_set_filter cairo_surface_get_filter + Also, eliminate all support for compiling against, or running with old, deprecated names for functions. + Deal with all of the removals. + + ChangeLog | 65 ++++++++++ + src/cairo-ft-font.c | 8 +- + src/cairo-gstate.c | 15 --- + src/cairo-image-surface.c | 1 - + src/cairo-matrix.c | 116 ++++-------------- + src/cairo-pattern.c | 17 ++- + src/cairo-pdf-surface.c | 10 +- + src/cairo-surface.c | 79 ------------ + src/cairo-xlib-surface.c | 8 +- + src/cairo.c | 145 ---------------------- + src/cairo.h | 265 ++++++++++++---------------------------- + src/cairoint.h | 19 +-- + test/cairo-test.c | 7 +- + test/gradient-alpha.c | 16 +-- + test/mask.c | 8 +- + test/move-to-show-surface.c | 5 +- + test/select-font-no-show-text.c | 6 +- + test/set-source.c | 4 +- + test/text-cache-crash.c | 16 +-- + test/text-rotate.c | 6 +- + test/transforms.c | 2 +- + test/translate-show-surface.c | 5 +- + test/trap-clip.c | 8 +- + util/cairo-api-update | 48 ++++++-- + 24 files changed, 274 insertions(+), 605 deletions(-) + +commit a790a2ea79507cae9564006ac32e27a0fcca8d60 +Author: Carl Worth +Date: Fri May 6 13:26:16 2005 +0000 + + Rename and re-order the cairo_operator_t enum to names that abbreviate less and are easier to understand, (eg. CAIRO_OPERATOR_DEST_OVER instead of CAIRO_OPEERATOR_OVER_REVERSE). + + ChangeLog | 20 ++++++++++++++++++++ + src/cairo-glitz-surface.c | 43 ++++++++++++++++++++++++++++++------------- + src/cairo-gstate.c | 2 +- + src/cairo-image-surface.c | 30 +++++++++++++++++++----------- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-surface.c | 2 +- + src/cairo-xlib-surface.c | 23 +++++++++++++---------- + src/cairo.h | 17 ++++++++++------- + test/cairo-test.c | 2 +- + test/mask.c | 4 ++-- + 10 files changed, 99 insertions(+), 48 deletions(-) + +commit d6fc5ee5e97f60972ec80fcfc52f0cf8b780d2a9 +Author: Carl Worth +Date: Fri May 6 13:23:41 2005 +0000 + + Remove cairo_set_target_surface and all other backend-specific cairo_set_target functions. Require a cairo_surface_t* to call cairo_create. + Port to use new cairo_create interface. + Rewrite all tests that were using cairo_set_target_surface to instead create a temporary cairo_t, (eventually to be replaced with cairo_begin_group). + + ChangeLog | 42 ++++ + src/cairo-glitz.h | 4 - + src/cairo-gstate.c | 28 +-- + src/cairo-pdf.h | 18 -- + src/cairo-ps.h | 8 - + src/cairo-quartz-surface.c | 24 --- + src/cairo-quartz.h | 6 - + src/cairo-surface.c | 2 +- + src/cairo-win32.h | 4 - + src/cairo-xcb.h | 7 - + src/cairo-xlib.h | 7 - + src/cairo.c | 429 ++++---------------------------------- + src/cairo.h | 86 +++----- + src/cairoint.h | 11 +- + test/cairo-test.c | 100 +++++---- + test/clip-nesting.c | 9 +- + test/mask.c | 10 +- + test/path-data.c | 13 +- + test/pdf-surface.c | 13 +- + test/pixman-rotate.c | 35 ++-- + test/scale-source-surface-paint.c | 1 - + test/self-copy.c | 2 +- + test/source-clip.c | 5 +- + test/source-surface-scale-paint.c | 1 - + test/surface-pattern.c | 25 ++- + 25 files changed, 245 insertions(+), 645 deletions(-) + +commit cea1de7579fad18ca6c9ec9bb29660970ec283b3 +Author: Owen Taylor +Date: Fri May 6 12:00:22 2005 +0000 + + src/cairo.[ch] doc/public/cairo-sections.txt: Add cairo_paint_with_alpha(). + Fix segfault when mask == NULL. + test/mask.c test/mask-ref.png: Add testing of cairo_paint_with_alpha(). + test/coverage.c test/coverage-ref.png: Remove ... it's not testing anything that mask doesn't test better. + + ChangeLog | 13 +++ + doc/public/Makefile.am | 3 +- + doc/public/cairo-docs.xml | 8 +- + doc/public/cairo-sections.txt | 2 + + doc/public/tmpl/cairo.sgml | 31 ++++--- + src/cairo-pattern.c | 4 +- + src/cairo.c | 31 +++++++ + src/cairo.h | 4 + + test/Makefile.am | 4 - + test/coverage-ref.png | Bin 25904 -> 0 bytes + test/coverage.c | 185 ------------------------------------------ + test/mask-ref.png | Bin 58954 -> 87846 bytes + test/mask.c | 7 ++ + 13 files changed, 83 insertions(+), 209 deletions(-) + +commit 7f79e048b96dd3e2b2c798047aff312560de5006 +Author: David Reveman +Date: Wed May 4 05:45:59 2005 +0000 + + Add glyph caching to glitz backend + + ChangeLog | 4 + + src/cairo-glitz-surface.c | 856 +++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 859 insertions(+), 1 deletion(-) + +commit 8e485ec8c203f7fd1ce1cf4adc0c491732c97ecb +Author: Kristian Høgsberg +Date: Tue May 3 14:28:50 2005 +0000 + + Fills as paths patch originally by Owen Taylor. + Make sure we have a current point for the relative path operators. + Add fill_path backend method. + Implement fill_path in the PDF backend. + + ChangeLog | 21 +++++++++ + src/cairo-gstate.c | 8 ++++ + src/cairo-path.c | 9 ++++ + src/cairo-pdf-surface.c | 116 ++++++++++++++++++++++++++++++++++++++++++++---- + src/cairo-surface.c | 13 ++++++ + src/cairoint.h | 13 ++++++ + 6 files changed, 171 insertions(+), 9 deletions(-) + +commit 05ccd7685420be7c7213e68462e1fcc4c01bad3c +Author: Carl Worth +Date: Tue May 3 08:33:32 2005 +0000 + + Originally 2005-04-20 Carl Worth + Remove cairo_show_surface. Add new cairo_set_source_surface. + Remove _cairo_gstate_show_surface. + Replace calls to cairo_show_surface with cairo_set_source_surface; cairo_paint. + Fix messages to prefer - over _. + Fix documentation. + Three new tests to exercise set_source_surface more completely, (two of these are expected failures dues to outstanding bugs). + + ChangeLog | 31 ++++++ + src/cairo-gstate.c | 188 +------------------------------- + src/cairo-png.c | 11 +- + src/cairo.c | 49 +++++---- + src/cairo.h | 20 +--- + test/.cvsignore | 10 +- + test/Makefile.am | 128 ++++++++++++---------- + test/cairo-test.c | 2 +- + test/create-for-png.c | 6 +- + test/create-from-png.c | 6 +- + test/filter-nearest-offset-ref.png | Bin 0 -> 254 bytes + test/filter-nearest-offset.c | 107 ++++++++++++++++++ + test/move-to-show-surface.c | 5 +- + test/pixman-rotate.c | 3 +- + test/scale-source-surface-paint-ref.png | Bin 0 -> 147 bytes + test/scale-source-surface-paint.c | 65 +++++++++++ + test/source-surface-scale-paint-ref.png | Bin 0 -> 147 bytes + test/source-surface-scale-paint.c | 65 +++++++++++ + test/translate-show-surface.c | 3 +- + 19 files changed, 399 insertions(+), 300 deletions(-) + +commit 8283381f120c0d5a4d3d770a541a576974cfdf89 +Author: Carl Worth +Date: Tue May 3 08:16:47 2005 +0000 + + Add suggestion for copy-on-write regions to fix clip region problems. + Fix check for old headers to respect DESTDIR, (to work better when cross-compiling, etc.). Thanks to Luke-Jr . + + ChangeLog | 9 +++++++++ + TODO | 4 ++++ + src/Makefile.am | 2 +- + 3 files changed, 14 insertions(+), 1 deletion(-) + +commit e227a106850ccced4e55bbc5cd5f139c6139aa2a +Author: Owen Taylor +Date: Mon May 2 14:20:07 2005 +0000 + + Changes the sign of extents->descent to match win32 backend and the conventional convention. + Document cairo_font_extents_t. + + ChangeLog | 8 ++++++++ + src/cairo-ft-font.c | 2 +- + src/cairo.h | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + 3 files changed, 53 insertions(+), 4 deletions(-) + +commit 7dbd1f4401eb892ea58c147a61f02535d30318ab +Author: Owen Taylor +Date: Mon May 2 13:39:30 2005 +0000 + + src/cairo-surface.c src/cairoint.h: Add _cairo_surface_begin/end to save and restore the clip state of a surface. Copy and store clip regions set on a surface so that we can save and restore them. + Add a CAIRO_STATUS_BAD_NESTING error for interleaved use of two cairo_t's on the same surface. Also, add a skeleton doc comment for cairo_status_t. + src/cairo.c src/cairo-gstate.c src/cairoint.h: Use _cairo_surface_begin/end to replace _cairo_gstate_restore_external_state. + Use _cairo_surface_begin/end to save the state of a surface when we start drawing at it and restore it at the end. Check that the save level of the surface is what we expect on drawing operations and fail with CAIRO_STATUS_BAD_NESTING otherwise. + src/cairo-pattern.c src/cairoint.h (_cairo_pattern_acquire_surface_for_surface) (_cairo_pattern_release_surface): Surround use of pattern->surface with _cairo_surface->begin/end so we don't clip surfaces used as sources. + test/clip-nesting.c test/Makefile.am: Test of destinatin clipping with the nested creation of cairo_t's for the same context. + test/source-clip.c test/Makefile.am: Test that clipping on a source as a destination doesn't affect use of it as a source. + XFAIL test for copying from a surface as a source to itself as a destination with a clip. + + ChangeLog | 35 +++++++++ + doc/public/tmpl/cairo.sgml | 1 + + src/cairo-gstate-private.h | 1 + + src/cairo-gstate.c | 75 +++++++++++++------ + src/cairo-pattern.c | 82 ++++++++++++++------ + src/cairo-surface.c | 181 +++++++++++++++++++++++++++++++++++++++------ + src/cairo.c | 14 +++- + src/cairo.h | 29 +++++++- + src/cairoint.h | 21 ++++-- + test/Makefile.am | 11 +++ + test/clip-nesting-ref.png | Bin 0 -> 1050 bytes + test/clip-nesting.c | 101 +++++++++++++++++++++++++ + test/self-copy-ref.png | Bin 0 -> 291 bytes + test/self-copy.c | 90 ++++++++++++++++++++++ + test/source-clip-ref.png | Bin 0 -> 180 bytes + test/source-clip.c | 85 +++++++++++++++++++++ + 16 files changed, 649 insertions(+), 77 deletions(-) + +commit 4ce3d3fb266908f2fe98564bf7dad387420dba9c +Author: Keith Packard +Date: Mon May 2 12:36:20 2005 +0000 + + Use correct arguments to compute absolute positions. + Test cairo_rel_move_to, cairo_rel_line_to and cairo_rel_curve_to + reviewed by: cworth + + ChangeLog | 12 +++++++++++ + src/cairo-path.c | 8 ++++---- + test/Makefile.am | 7 +++++-- + test/rel-path-ref.png | Bin 0 -> 212 bytes + test/rel-path.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 77 insertions(+), 6 deletions(-) + +commit 1464e35fde29e0a03a7ce033327a2f00396f71b0 +Author: Owen Taylor +Date: Mon May 2 11:42:41 2005 +0000 + + not mask.png. (Pointed out by Carl) + + ChangeLog | 5 +++++ + test/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 79b2a79f2d9ba8dbef44d04656fa84d83836ac6c +Author: Owen Taylor +Date: Mon May 2 11:01:18 2005 +0000 + + src/cairo.[ch] src/cairo-gstate.c: Add cairo_mask() and cairo_mask_surface(). + test/maks.c tests/Makefile.am tests/mask-ref.png: Add a comprehensive tests for cairo_mask(). + Updated + + ChangeLog | 10 ++ + doc/public/cairo-sections.txt | 2 + + doc/public/tmpl/cairo.sgml | 20 ++++ + src/cairo-gstate.c | 259 +++++++++++++++++++++++++++++++----------- + src/cairo.c | 62 ++++++++++ + src/cairo.h | 10 ++ + src/cairoint.h | 4 + + test/Makefile.am | 3 + + test/mask-ref.png | Bin 0 -> 58954 bytes + test/mask.c | 241 +++++++++++++++++++++++++++++++++++++++ + 10 files changed, 544 insertions(+), 67 deletions(-) + +commit 0c40f66c04bffa1847d37cf9c64e48db9e76f51f +Author: Kristian Høgsberg +Date: Sun May 1 22:30:58 2005 +0000 + + Also call _cairo_gstate_ensure_font() for this function. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 4 ++++ + 2 files changed, 9 insertions(+) + +commit 388a8d491d43901a6608174daad284c35a10ea6c +Author: Owen Taylor +Date: Thu Apr 28 13:41:00 2005 +0000 + + Add a item about reworking cairo_format_t. + + ChangeLog | 4 ++++ + ROADMAP | 6 ++++++ + TODO | 32 ++++++++++++++++++++++++++++++++ + 3 files changed, 42 insertions(+) + +commit 2dd5f40bc052a48c964acefe43005d727c045238 +Author: Owen Taylor +Date: Thu Apr 28 11:16:52 2005 +0000 + + Set image->pCompositeClip here. (IcComputeCompositeRegion) src/icrect.c (pixman_color_rects): Remove workaround clipping to the clientClip. + + pixman/ChangeLog | 7 +++++++ + pixman/src/icimage.c | 23 ++++++++++++++++------- + pixman/src/icrect.c | 2 -- + 3 files changed, 23 insertions(+), 9 deletions(-) + +commit 2a6e7ef7c3d42f2e51eefdd218f43f7272faf594 +Author: Carl Worth +Date: Thu Apr 28 11:15:47 2005 +0000 + + Replace annoying _ in output image filenames with - for better consistency. + + ChangeLog | 6 ++++++ + test/.cvsignore | 4 ++-- + test/cairo-test.c | 4 ++-- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit f3bc5e55541b53c414d066a1f6afb89e55f68a08 +Author: Carl Worth +Date: Wed Apr 27 14:09:41 2005 +0000 + + Use 1 instead of 0 for width and height to avoid BadValue errors from XCreatePixmap. + + ChangeLog | 6 ++++++ + test/cairo-test.c | 5 +++++ + 2 files changed, 11 insertions(+) + +commit 2f5b0808b8e19af0c8c9e5fbaef4051404f7d7e7 +Author: Carl Worth +Date: Wed Apr 27 13:33:25 2005 +0000 + + Add support for testing multiple backends, courtesy of cairo_surface_write_to_png. Currently, only image and xlib backends are fullk hooked-up, but other backends should be quite easy to add for anyone skilled in the appropriate art. + + ChangeLog | 18 +++ + test/.cvsignore | 3 +- + test/buffer-diff.c | 98 ++++++++++++++-- + test/buffer-diff.h | 18 ++- + test/cairo-test.c | 323 ++++++++++++++++++++++++++++++++++++++--------------- + test/cairo-test.h | 1 + + test/read-png.c | 4 + + test/xmalloc.h | 2 + + 8 files changed, 362 insertions(+), 105 deletions(-) + +commit eabc32a0114ba86a450539e3fbde4cabab8d6b8f +Author: Owen Taylor +Date: Wed Apr 27 13:02:20 2005 +0000 + + Don't use pixman_compositeSrc_8888x8888 when the source is x8r8g8b8 or x8b8g8r8. + + pixman/ChangeLog | 5 +++++ + pixman/src/ic.c | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit c382f9daf091331a37df61a8cfe883b7606af66b +Author: Owen Taylor +Date: Wed Apr 27 10:16:47 2005 +0000 + + src/cairo-traps.c src/cairoint.h (_cairo_traps_init_box): New function to create a single trapezoid box. + src/cairo.c src/cairo-gstate.c src/cairoint.h: Move the implementation of cairo_paint() into cairo-gstate.c for a better fix for the problem with backend/user coordinate confusion. Also no longer clear the current path on cairo_paint() + + ChangeLog | 11 +++++++++++ + src/cairo-gstate.c | 30 +++++++++++++++++++++++++++--- + src/cairo-traps.c | 37 +++++++++++++++++++++++++++++++++++++ + src/cairo.c | 26 +------------------------- + src/cairoint.h | 11 +++++++---- + 5 files changed, 83 insertions(+), 32 deletions(-) + +commit 153e0c5eab461320280c61e6f702b53eeeecfe82 +Author: Carl Worth +Date: Tue Apr 26 19:04:48 2005 +0000 + + Build rectangle with an identity matrix in place so that the entire target surface will be filled even when there is a transformation in place. + + ChangeLog | 6 ++++++ + src/cairo.c | 14 ++++++++++++++ + 2 files changed, 20 insertions(+) + +commit 1c316ca07ad352c2cb9a522c6babef89b2e0d001 +Author: Carl Worth +Date: Tue Apr 26 18:56:37 2005 +0000 + + Add test to demonstrate bug in cairo_paint when under a non-identity transformation. + + ChangeLog | 8 ++++++++ + test/.cvsignore | 2 ++ + test/Makefile.am | 3 +++ + test/paint-ref.png | Bin 0 -> 116 bytes + test/paint.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 66 insertions(+) + +commit 86a17d5357a0164e418f57a3f0d383c429782858 +Author: Owen Taylor +Date: Tue Apr 26 15:28:01 2005 +0000 + + Updated. + src/cairo-png.c src/cairo.h: Fix up some doc build issues. + + ChangeLog | 6 +++ + doc/public/cairo-sections.txt | 27 +++++++++--- + doc/public/tmpl/cairo-pattern.sgml | 15 ++++++- + doc/public/tmpl/cairo-png.sgml | 31 +++++++++++--- + doc/public/tmpl/cairo.sgml | 86 ++++++++++++++++++++++++++++++++++++-- + src/cairo-png.c | 27 +++--------- + src/cairo.h | 2 +- + 7 files changed, 155 insertions(+), 39 deletions(-) + +commit 2847ff9d6e715c1926a10b6c0278f1274d0765a3 +Author: Carl Worth +Date: Tue Apr 26 13:05:51 2005 +0000 + + Note that cairo_paint and cairo_clip/fill/stroke_preserve are all done now. + + ChangeLog | 6 ++++++ + ROADMAP | 8 ++++---- + TODO | 2 +- + 3 files changed, 11 insertions(+), 5 deletions(-) + +commit 1baa4d132903e21395dc66ca792164e2ef8885d2 +Author: Carl Worth +Date: Tue Apr 26 12:38:06 2005 +0000 + + Originally: 2005-04-19 Carl Worth + Add cairo_stroke_preserve, cairo_fill_preserve, and cairo_clip_preserve. + Rip the path out of cairo_gstate_t. + Add path to cairo_t. + Bring in most of the path code that used to live in cairo-gstate.c + Move arc generation code into its own file. + Accept path+ctm_inverse+tolerance instead of gstate. Absorb flattening and device space->user space conversion that used to be in _cairo_gstate_intepret_path. + Prefer cairo_fixed_t parameters over ciaro_point_t for cross-file interfaces. + Track changes in _cairo_path_fixed interfaces. + Port to use cairo_fill_preserve rather than cairo_save/cairo_restore which no longer work for saving the path. + Remove get and set of current point since it is no longer affected by cairo_save and cairo_restore. Add get and set testing for cairo_matrix_t. + + ChangeLog | 40 +++ + TODO | 2 +- + src/Makefile.am | 1 + + src/cairo-arc-private.h | 57 ++++ + src/cairo-arc.c | 296 ++++++++++++++++++ + src/cairo-ft-font.c | 60 ++-- + src/cairo-gstate-private.h | 4 - + src/cairo-gstate.c | 677 +++--------------------------------------- + src/cairo-path-data-private.h | 8 +- + src/cairo-path-data.c | 239 ++++++++++++--- + src/cairo-path.c | 93 +++--- + src/cairo-private.h | 4 + + src/cairo.c | 321 +++++++++++++++++--- + src/cairo.h | 10 +- + src/cairoint.h | 159 ++++------ + test/fill-and-stroke.c | 8 +- + test/get-and-set.c | 37 +-- + 17 files changed, 1106 insertions(+), 910 deletions(-) + +commit 618792c8c041ee2004acf1ff411e0adbe94a3e63 +Author: Carl Worth +Date: Tue Apr 26 09:43:39 2005 +0000 + + Add very simple test to generate PDF output, (no automated verification yet). + Track PNG interface changes, (no more include of cairo-png.h, cairo_surface_write_png renamed to cairo_surface_write_to_png). + + ChangeLog | 14 +++++++++++ + test/.cvsignore | 1 + + test/Makefile.am | 2 ++ + test/cairo-test.c | 4 +--- + test/cairo-test.h | 1 + + test/create-for-png.c | 2 -- + test/create-from-png.c | 2 -- + test/pdf-surface.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ + test/pixman-rotate.c | 1 - + 9 files changed, 84 insertions(+), 8 deletions(-) + +commit a5f734455c00f1031f19494717b02a5de2687ec0 +Author: Kristian Høgsberg +Date: Mon Apr 25 21:52:13 2005 +0000 + + Prototypes moved to cairo.h, this file removed. + + ChangeLog | 2 ++ + src/cairo-png.h | 58 --------------------------------------------------------- + 2 files changed, 2 insertions(+), 58 deletions(-) + +commit 28e7bbea652efa58b28217bd0cdfe2599a6ae7c7 +Author: Kristian Høgsberg +Date: Mon Apr 25 21:36:38 2005 +0000 + + Renamed from cairo_surface_write_png_to_stream() for consistency. (cairo_surface_write_to_png): Renamed from cairo_surface_write_png() for consistency. + + ChangeLog | 7 +++++++ + src/cairo-png.c | 9 +++++---- + src/cairo.h | 6 +++--- + 3 files changed, 15 insertions(+), 7 deletions(-) + +commit 87009d692b5a37fc91db19819c46216ed6b3c4e3 +Author: Kristian Høgsberg +Date: Mon Apr 25 20:42:54 2005 +0000 + + Factor out bulk of the code into a new callback based function, write_png(). Call it with a stdio write callback. (cairo_surface_write_png_to_stream): New function to write a surface to a PNG stream. (cairo_image_surface_create_from_png): Likewise, move most of the code to read_png(), clean up error handling and reduce this function to calling read_png() with a stdio based read function. (cairo_image_surface_create_from_png_stream): New function to create an image surface from a PNG stream. + New functions to get widht and height of an image surface. + Add new prototype and error codes. + Adjust to new PNG API. + + ChangeLog | 21 ++++ + src/cairo-image-surface.c | 32 ++++++ + src/cairo-png.c | 245 +++++++++++++++++++++++++++++++++++----------- + src/cairo.c | 4 + + src/cairo.h | 68 ++++++++++--- + test/cairo-test.c | 4 +- + test/create-for-png.c | 19 ++-- + test/create-from-png.c | 19 ++-- + 8 files changed, 316 insertions(+), 96 deletions(-) + +commit e55161d2b2ea27d5174c2674544b3aaf6748134d +Author: Owen Taylor +Date: Mon Apr 25 19:38:44 2005 +0000 + + Initialize the saved_dc_bitmap field here as well ... not strictly needed, but cleaner. (Reported by Peter Arsoff) + + ChangeLog | 6 ++++++ + src/cairo-win32-surface.c | 1 + + 2 files changed, 7 insertions(+) + +commit 1c756648fc4b5984cb721571bc4cbd68d8c95b29 +Author: Kristian Høgsberg +Date: Sat Apr 23 11:58:18 2005 +0000 + + Finalize the correct pattern. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 70211bdbca78c944bc1447eb6216c8e84e14db23 +Author: Kristian Høgsberg +Date: Fri Apr 22 17:32:12 2005 +0000 + + Only check PNG signature if we read all the bytes. Don't fclose() the FILE argument (Steve Chaplin ). + Rename to cairo_image_surface_create_for_png() to cairo_image_surface_create_from_png() and change FILE arguments for this function and cairo_surface_write_png() to be a filename argument instead. + + ChangeLog | 11 +++++++++++ + src/Makefile.am | 2 -- + src/cairo-png.c | 61 +++++++++++++++++++++++++++++++-------------------------- + src/cairo-png.h | 6 ++---- + src/cairo.h | 11 +++++++++++ + 5 files changed, 57 insertions(+), 34 deletions(-) + +commit 0f0a6a57a31f06d250f0684a49b6bb57084d65b2 +Author: Kristian Høgsberg +Date: Thu Apr 21 15:18:14 2005 +0000 + + Handle backends that don't have a set_clip_region implementation (PDF). + + ChangeLog | 5 +++++ + src/cairo-surface.c | 3 +++ + 2 files changed, 8 insertions(+) + +commit 9c10b54e5e98a5c5beca48c51ea930c2072ff6bc +Author: Carl Worth +Date: Tue Apr 19 16:29:04 2005 +0000 + + Add new cairo_paint function. + Add new get_extents function to the surface backend interface. + Add function to query current clip_extents. + Implement the new get_extents function for each backend. + Save the clip extents from set_clip_region and implement _cairo_surface_get_clip_extents. + Abstract away the evil XGetGeometry roundtrip in _cairo_xlib_surface_get_size. + Rewrite a couple of tests to call cairo_paint. + + ChangeLog | 35 ++++++++++++++++ + src/cairo-glitz-surface.c | 15 +++++++ + src/cairo-gstate.c | 7 ++++ + src/cairo-image-surface.c | 22 ++++++++++ + src/cairo-pdf-surface.c | 22 +++++++++- + src/cairo-ps-surface.c | 20 +++++++++ + src/cairo-quartz-surface.c | 12 +++++- + src/cairo-surface.c | 39 ++++++++++++++++- + src/cairo-win32-surface.c | 18 ++++++++ + src/cairo-xcb-surface.c | 15 +++++++ + src/cairo-xlib-surface.c | 87 +++++++++++++++++++++++++------------- + src/cairo.c | 31 +++++++++++++- + src/cairo.h | 3 ++ + src/cairoint.h | 101 ++++++++++++++++++++++++++++----------------- + test/gradient-alpha.c | 3 +- + test/linear-gradient.c | 3 +- + 16 files changed, 358 insertions(+), 75 deletions(-) + +commit 60ec322241ef01930ae63195651249a97ddbe6f7 +Author: Carl Worth +Date: Tue Apr 19 06:38:07 2005 +0000 + + Update API Shakeup chart to indicate that cairo_paint and cairo_fill_preserve patches have been sent. + + ChangeLog | 5 +++++ + TODO | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit f13b13a70e987443b572264014647f27237d4cc0 +Author: Carl Worth +Date: Mon Apr 18 16:26:14 2005 +0000 + + Add a test of a repeating surface pattern. + + ChangeLog | 8 +++++ + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/surface-pattern-ref.png | Bin 0 -> 194 bytes + test/surface-pattern.c | 75 +++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 87 insertions(+) + +commit aef8f9b1a01f712c52d74ea0556dbe9092035b48 +Author: Carl Worth +Date: Mon Apr 18 05:25:57 2005 +0000 + + Mark a couple of items that are now complete. + Add test case that fills and strokes the same shapes, (in preparation for testing cairo_fill_preserve patch). + + ChangeLog | 11 +++++++ + ROADMAP | 14 ++++----- + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/fill-and-stroke-ref.png | Bin 0 -> 279 bytes + test/fill-and-stroke.c | 67 +++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 89 insertions(+), 7 deletions(-) + +commit ea82928aa74b87c8feab5e8424ba739b070680fe +Author: Carl Worth +Date: Thu Apr 14 15:02:47 2005 +0000 + + Update API Shakeup chart to indicate that cairo_set_source is done. + + ChangeLog | 5 +++++ + TODO | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 828094aef860c8087564c93408846a4e81eec20d +Author: Carl Worth +Date: Thu Apr 14 14:42:26 2005 +0000 + + and delete: + cairo_set_pattern -> cairo_set_source cairo_get_pattern -> cairo_get_source cairo_set_rgb_color -> cairo_set_source_rgb + -> cairo_set_source_rgba cairo_set_alpha -> cairo_get_alpha -> + Note that we'll likely want to add cairo_set_source_surface. + Add _cairo_stock_color helper function. Improve some interfaces: + _cairo_color_init _cairo_color_init_rgb _cairo_color_set_rgb -> _cairo_color_init_rgba _cairo_color_set_alpha _cairo_color_multiply_alpha + _cairo_color_get_rgb -> _cairo_color_get_rbga _cairo_color_get_rgba_premultiplied + Add cairo_stock_t and some helper macros: + CAIRO_COLOR_WHITE CAIRO_COLOR_BLACK CAIRO_COLOR_TRANSPARENT + Fix cairo_pattern_t by eliminating pattern->alpha. Fix cairo_solid_pattern_t to use cairo_color_t rather than three doubles. + Track removal of pattern->alpha, simplifying the code considerably + Track _cairo_color interface changes. Remove gstate->alpha. Propagate down set_source renamings. + cairo_pattern_add_color_stop -> cairo_pattern_add_color_stop_rgba + and add: + cairo_pattern_add_color_stop_rgb + Remove pattern->alpha, simplifying the code considerably. + Track pattern and color interface changes. + Add const where appropriate on cairo_color_t*. + Add private type inspection predicate. (cairo_xlib_surface_set_size): Add check for surface type mismatch, (no useful error reporting yet, though). + Note coverage as en expected failure. + Improve line wrap on expected failure messages. + Port all tests to new cairo_set_source interfaces. + + ChangeLog | 84 ++++++++++++ + src/cairo-color.c | 120 +++++++++++++---- + src/cairo-glitz-surface.c | 94 ++++---------- + src/cairo-gstate-private.h | 3 +- + src/cairo-gstate.c | 147 ++++++++------------- + src/cairo-pattern.c | 318 +++++++++++++++++---------------------------- + src/cairo-pdf-surface.c | 8 +- + src/cairo-ps-surface.c | 9 +- + src/cairo-surface.c | 35 +++-- + src/cairo-xlib-surface.c | 18 +++ + src/cairo.c | 146 +++++++++++---------- + src/cairo.h | 55 ++++---- + src/cairoint.h | 92 +++++++------ + test/Makefile.am | 1 + + test/cairo-test.c | 2 +- + test/clip-twice.c | 3 +- + test/coverage.c | 23 ++-- + test/fill-rule.c | 2 +- + test/line-width.c | 2 +- + test/linear-gradient.c | 31 ++--- + test/pixman-rotate.c | 13 +- + test/set-source.c | 16 +-- + test/text-rotate.c | 9 +- + test/trap-clip.c | 11 +- + 24 files changed, 628 insertions(+), 614 deletions(-) + +commit c0d9c13d0403673a7fe994664a4f616c71301474 +Author: Carl Worth +Date: Thu Apr 14 14:02:03 2005 +0000 + + Make gradient change color in addition to just changing alpha in order to highlight distinction between interpolating in premultiplied vs. non-premultiplied space. + + ChangeLog | 8 ++++++++ + test/gradient-alpha-ref.png | Bin 146 -> 153 bytes + test/gradient-alpha.c | 8 ++++---- + 3 files changed, 12 insertions(+), 4 deletions(-) + +commit 65209fc39cb0257b2e55e7dfa509be5a5ef65f05 +Author: Carl Worth +Date: Thu Apr 14 10:02:58 2005 +0000 + + Improve instructions for when to add a test to the XFAIL list. + Print explanations for expected failures. + + ChangeLog | 11 +++++++++++ + test/Makefile.am | 30 ++++++++++++++++-------------- + test/cairo-test.c | 9 +++++++++ + test/cairo-test.h | 5 +++++ + test/pixman-rotate.c | 4 +++- + test/text-rotate.c | 4 +++- + 6 files changed, 47 insertions(+), 16 deletions(-) + +commit d1eb620a195170ac0761b3376e4cd97d7a46cf02 +Author: Carl Worth +Date: Thu Apr 14 09:31:21 2005 +0000 + + Add gradient-alpha test in preparation for upcoming cairo_set_source patch. + + ChangeLog | 8 ++++++ + test/.cvsignore | 1 + + test/Makefile.am | 3 +++ + test/gradient-alpha-ref.png | Bin 0 -> 146 bytes + test/gradient-alpha.c | 62 ++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 74 insertions(+) + +commit 95a6f1941a1ff32b3ef792e5db2a942d7c85bf07 +Author: Carl Worth +Date: Thu Apr 14 09:13:48 2005 +0000 + + Add set-source test in preparation for upcoming cairo_set_source patch. + + ChangeLog | 8 +++++ + test/.cvsignore | 3 +- + test/Makefile.am | 7 ++-- + test/set-source-ref.png | Bin 0 -> 120 bytes + test/set-source.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 104 insertions(+), 3 deletions(-) + +commit 080f331edd6c64dd93785f35e05b532aa2f72512 +Author: Owen Taylor +Date: Thu Apr 14 06:05:59 2005 +0000 + + Remove a stray free() (#3029, Carl Worth) + Note that the bug is fixed. + + ChangeLog | 7 +++++++ + src/cairo-font.c | 1 - + test/select-font-no-show-text.c | 6 +++++- + 3 files changed, 12 insertions(+), 2 deletions(-) + +commit 66688da5e4485a369750bd5600134a94c281d985 +Author: Carl Worth +Date: Wed Apr 13 14:51:59 2005 +0000 + + Set freed pointer to NULL. + Fix to actually set surface->finished when done. Closes bug #2950 as documented in test/surface-finish-twice.c. + Note that this bug is fixed. + + ChangeLog | 11 +++++++++++ + src/cairo-image-surface.c | 4 +++- + src/cairo-surface.c | 11 +++++++++-- + test/surface-finish-twice.c | 4 ++++ + 4 files changed, 27 insertions(+), 3 deletions(-) + +commit 0fe6378bdb83b550ad10b007463d7fb12ef742a9 +Author: Carl Worth +Date: Wed Apr 13 14:48:02 2005 +0000 + + Add new test to exercise crash when calling cairo_surface_finish twice on the same surface. + + ChangeLog | 8 ++++++ + test/.cvsignore | 1 + + test/Makefile.am | 2 ++ + test/surface-finish-twice.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 81 insertions(+) + +commit f4b2f59c056ca3a84b89412a617994cb1837fd4a +Author: Carl Worth +Date: Wed Apr 13 14:45:05 2005 +0000 + + Add new set-surface-no-show-text test. + Be sure to call cairo_destroy even if the image size is 0,0 so that we can test bugs triggered during cleanup. + + ChangeLog | 11 ++++++++ + test/.cvsignore | 2 ++ + test/Makefile.am | 2 ++ + test/cairo-test.c | 1 + + test/select-font-no-show-text.c | 60 +++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 76 insertions(+) + +commit f3af02bb0e098824a23b000adfa7a86a48390ddf +Author: Carl Worth +Date: Wed Apr 13 14:24:20 2005 +0000 + + Temporarily remove all text from this test case until we come up with an approach for drawing the same text with different freetype configurations. + + ChangeLog | 7 +++++++ + test/coverage-ref.png | Bin 44324 -> 25904 bytes + test/coverage.c | 6 ++++++ + 3 files changed, 13 insertions(+) + +commit 21268bc35938c18783c428f6b3c267b85191b78c +Author: Owen Taylor +Date: Wed Apr 13 14:04:33 2005 +0000 + + Fix a comment from last commit + + src/cairo-traps.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8feb2717eb20ca2764a1c367a4f7e30bf1ad8537 +Author: Owen Taylor +Date: Wed Apr 13 14:03:17 2005 +0000 + + Fix ChangeLog entry + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 542e6c8c90a76bb9ccbedd95c8c65103c68ae6b6 +Author: Owen Taylor +Date: Wed Apr 13 14:01:50 2005 +0000 + + Work around a pair of libpixman bugs (denegerate trapezoids from tesellator, pixman_region_union_rect() failing on width/height zero rectangles) + + ChangeLog | 6 ++++++ + src/cairo-traps.c | 7 +++++++ + 2 files changed, 13 insertions(+) + +commit 1de5ace6c22b457d4c712b9d8c9e8fb87e927c43 +Author: Carl Worth +Date: Wed Apr 13 13:01:54 2005 +0000 + + Fix typo + + TODO | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a16a634f97a9948d6a98ed89664f74bf36e0f1ae +Author: Owen Taylor +Date: Wed Apr 13 11:23:43 2005 +0000 + + src/cairoint.h src/cairo-traps.c: Add _cairo_traps_extract_region for converting trapezoids into a pixman region. + Represent all rectangular pixel-aligned regions as regions, not just single rectangles. + Split into manageable pieces, optimize rectangular pixel- aligned regions by using _cairo_surface_fill_rectangles() or _cairo_surface_set_clip_region() as appropriate. + tests/trap-clip.c tests/trap-clip-ref.png tests/Makefile.am: Add a test for trapezoids clipping. + Add an index. + + ChangeLog | 18 ++ + doc/public/cairo-docs.xml | 3 + + src/cairo-gstate.c | 586 +++++++++++++++++++++++++++++++--------------- + src/cairo-traps.c | 55 +++++ + src/cairoint.h | 4 + + test/Makefile.am | 5 +- + test/trap-clip-ref.png | Bin 0 -> 71701 bytes + test/trap-clip.c | 213 +++++++++++++++++ + 8 files changed, 688 insertions(+), 196 deletions(-) + +commit 3bec073a7c7ae946d1a61769a694760dd3fcb890 +Author: Carl Worth +Date: Tue Apr 12 13:24:48 2005 +0000 + + Note that bug is now fixed. + + ChangeLog | 4 ++++ + test/translate-show-surface.c | 6 +++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 173bc22a62681d1dc0807f16f387e3f41d3653c0 +Author: Carl Worth +Date: Tue Apr 12 11:50:25 2005 +0000 + + Replace errant use of aclocal with , as reported by Martin Hedenfalk. Closes bug #3000. + + ChangeLog | 5 +++++ + autogen.sh | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 369d1bf28f589d4aee7773180038a9564f14db19 +Author: Carl Worth +Date: Tue Apr 12 09:14:14 2005 +0000 + + Default to CAIRO_FILTER_GOOD rather than CAIRO_FILTER_BEST. + Optimize to use CAIRO_FILTER_NEAREST when the pattern matrix is an integer translation. + + ChangeLog | 11 +++++++++++ + src/cairo-pattern.c | 3 ++- + src/cairo-surface.c | 2 +- + 3 files changed, 14 insertions(+), 2 deletions(-) + +commit 439a94cc7b5f8982d469cdb6665be3cd21944cc5 +Author: Carl Worth +Date: Tue Apr 12 07:57:46 2005 +0000 + + Use CAIRO_FILTER_BEST by default rather than CAIRO_FILTER_NEAREST. + + ChangeLog | 7 +++++++ + src/cairo-pattern.c | 2 +- + src/cairo-surface.c | 2 +- + 3 files changed, 9 insertions(+), 2 deletions(-) + +commit 8f6fc777d1f032f829fcd1e6134dbf761e6df5d0 +Author: Carl Worth +Date: Tue Apr 12 07:12:08 2005 +0000 + + Offset the src pattern by (0,0)->CTM. This fixes test/translate-show-surface. + Use unsigned cahr* to match new prototype for cairo_image_surface_create_for_data. + + ChangeLog | 9 +++++++++ + src/cairo-glitz-surface.c | 4 ++-- + src/cairo-gstate.c | 17 +++++++++++++++-- + 3 files changed, 26 insertions(+), 4 deletions(-) + +commit 8f7ea593bab3c30f1e99e48f78285d18b3724ee1 +Author: Carl Worth +Date: Mon Apr 11 14:04:56 2005 +0000 + + Add new test demonstrating bug in the sequence: cairo_translate; cairo_show_surface. + + ChangeLog | 9 +++++ + test/.cvsignore | 1 + + test/Makefile.am | 5 ++- + test/translate-show-surface-ref.png | Bin 0 -> 100 bytes + test/translate-show-surface.c | 77 ++++++++++++++++++++++++++++++++++++ + 5 files changed, 91 insertions(+), 1 deletion(-) + +commit a70e8f7c9e5ffc07ef867196bda3c9996212c8a6 +Author: Carl Worth +Date: Mon Apr 11 11:30:28 2005 +0000 + + Add deprecation alias from cairo_scale_font to cairo_set_font_size. + + ChangeLog | 5 +++++ + src/cairo.c | 1 + + 2 files changed, 6 insertions(+) + +commit 9ba4dce8110dc02d9faa255918a64c332da80a7a +Author: Carl Worth +Date: Mon Apr 11 11:20:08 2005 +0000 + + Add deprecation alias from cairo_select_font to cairo_select_font_face. + + ChangeLog | 5 +++++ + src/cairo.c | 1 + + 2 files changed, 6 insertions(+) + +commit cf9ea3007828a46c5297a8882b6272ad30d12ba8 +Author: Owen Taylor +Date: Mon Apr 11 09:18:51 2005 +0000 + + src/cairo.h doc/public/cairo-sections.txt src/cairo-matrix.c: Update. + Include cairo-font.xml + + ChangeLog | 7 +++ + doc/public/Makefile.am | 13 +++--- + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 54 ++++++++++++++-------- + doc/public/tmpl/cairo-font.sgml | 12 +++++ + doc/public/tmpl/cairo-matrix.sgml | 61 ++++++++++++------------- + doc/public/tmpl/cairo-pattern.sgml | 6 +++ + doc/public/tmpl/cairo-pdf.sgml | 30 +++++++++++++ + doc/public/tmpl/cairo-png.sgml | 21 +++++++++ + doc/public/tmpl/cairo-surface.sgml | 6 +++ + doc/public/tmpl/cairo-xcb.sgml | 12 +++++ + doc/public/tmpl/cairo.sgml | 91 +++++++++++++++++++++++++++++++------- + src/cairo-matrix.c | 2 - + src/cairo.h | 8 ++-- + 14 files changed, 249 insertions(+), 75 deletions(-) + +commit df997b3f5be6e04fe20da82ad0ee24a33732a4f0 +Author: Carl Worth +Date: Mon Apr 11 06:56:10 2005 +0000 + + Indentation changes + + ROADMAP | 37 +++++++++++++++++++++---------------- + 1 file changed, 21 insertions(+), 16 deletions(-) + +commit 2a616d68422c7029434a3d1d22ab668f23bd55bc +Author: Carl Worth +Date: Fri Apr 8 14:06:32 2005 +0000 + + Move include of pixman.h from cairo.h to cairoint.h since libpixman isn't part of cairo's public interface. + Use unsigned long rather than uint32_t since we no longer have pixman.h setting that type up for us. + Remove unused variable user_data_copy. + + ChangeLog | 13 +++++++++++++ + src/cairo-font.c | 2 -- + src/cairo.h | 1 - + src/cairoint.h | 1 + + test/move-to-show-surface.c | 3 +-- + 5 files changed, 15 insertions(+), 5 deletions(-) + +commit 584cb301456bd4ee9d92fa3becd148440df57d3b +Author: Carl Worth +Date: Fri Apr 8 13:44:22 2005 +0000 + + Add ROADMAP file with an initial stab at 1.0 items. + + ChangeLog | 4 ++++ + ROADMAP | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + TODO | 8 ++++---- + 3 files changed, 78 insertions(+), 4 deletions(-) + +commit c803908d95d0022463d138f0caee949b14d0cadb +Author: Owen Taylor +Date: Fri Apr 8 13:14:17 2005 +0000 + + src/cairo.h src/cairo-font.c src/cairoint.h doc/public/cairo-sections.txt: Add cairo_font_face_set/get_user_data(). + src/cairo-array.c src/cairoint.h src/cairo-surface.c: Refactor user data code from cairo-surface.c into cairo_user_data_array_t. + Switch these types to be like cairo_surface_t where the generic code frees the wrapper object. + src/cairo-atsui-font.c src/cairo-ft-font.c src/cairo-win32-font.c: Fix up for the above changes. + Implement a complicated mutual-referencing scheme to make sure that a face from cairo_ft_font_face_create_for_ft_face() is freed only when the FT_Face is no longer needed. + Update the docs to describe how to figure out when the FT_Face can be freed. + Fix refcount leaks when creating fonts. + Remove excess call to _cairo_unscaled_font_reference(). + Remove stray initialization of font matrix to the identity. + test/user-data.c: Fix a bug when setting/unsetting a key with a free key slot before it, add that to the test case. + Don't append an element when user_data is NULL. + + ChangeLog | 42 +++++++++++ + doc/public/cairo-sections.txt | 2 + + doc/public/tmpl/cairo-font.sgml | 18 +++-- + doc/public/tmpl/cairo-matrix.sgml | 12 ---- + doc/public/tmpl/cairo-pattern.sgml | 6 -- + doc/public/tmpl/cairo-surface.sgml | 6 -- + doc/public/tmpl/cairo.sgml | 13 ---- + src/cairo-array.c | 139 +++++++++++++++++++++++++++++++++++++ + src/cairo-atsui-font.c | 2 - + src/cairo-font.c | 67 +++++++++++++++++- + src/cairo-ft-font.c | 97 +++++++++++++++++--------- + src/cairo-gstate.c | 1 - + src/cairo-pdf-surface.c | 2 - + src/cairo-surface.c | 71 ++----------------- + src/cairo-win32-font.c | 3 - + src/cairo.h | 54 ++++++++------ + src/cairoint.h | 24 ++++++- + test/user-data.c | 4 ++ + 18 files changed, 393 insertions(+), 170 deletions(-) + +commit 7aa5b71e8cc42bdcc935ad0990a0ac434dd0aa0e +Author: Dave Beckett +Date: Fri Apr 8 12:42:28 2005 +0000 + + Update to track changes to cairo_matrix_t interface. + + ChangeLog | 5 +++++ + src/cairo-glitz-surface.c | 14 +++++++------- + 2 files changed, 12 insertions(+), 7 deletions(-) + +commit 30f0d517aa73d5d00b5a2bed2f549f9c662a39a7 +Author: Carl Worth +Date: Fri Apr 8 10:03:17 2005 +0000 + + Eliminate internal use of deprecated cairo_matrix_copy. + Change cairo_get_matrix to accept a pointer to the return value cairo_matrix_t rather than returning the value directly. + + ChangeLog | 15 +++++++++++++++ + src/cairo-gstate.c | 18 ++++++------------ + src/cairo-matrix.c | 1 - + src/cairo.c | 27 ++++----------------------- + src/cairo.h | 7 ++----- + src/cairoint.h | 5 +---- + 6 files changed, 28 insertions(+), 45 deletions(-) + +commit 745627ff1b0cf97760cbd613668f79c9b63a57c2 +Author: Carl Worth +Date: Fri Apr 8 04:43:06 2005 +0000 + + Don't try to return a value (even a void value) from a void function. Closes bug #2931. + + ChangeLog | 6 ++++++ + src/cairo-matrix.c | 8 ++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 43435b69e14d4039b0537dfdc96cbcebd164175f +Author: Carl Worth +Date: Thu Apr 7 15:00:46 2005 +0000 + + Remove broken code for defining uint64_t. + + ChangeLog | 5 +++++ + src/cairo-wideint.h | 8 +------- + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit 9bef5b6f148d08b5f0e13bd768b6e7e2a4697c0b +Author: Carl Worth +Date: Thu Apr 7 14:25:00 2005 +0000 + + Change to allow NULL backend function pointers to indicate unsupported functions. + Eliminate stub functions and replace with NULL in surface backend table. + + ChangeLog | 22 +++++++++ + src/cairo-glitz-surface.c | 16 +------ + src/cairo-image-surface.c | 16 +------ + src/cairo-pdf-surface.c | 61 +++---------------------- + src/cairo-ps-surface.c | 79 +++----------------------------- + src/cairo-quartz-surface.c | 109 ++++----------------------------------------- + src/cairo-surface.c | 86 +++++++++++++++++------------------ + src/cairo-win32-surface.c | 64 +++----------------------- + src/cairo-xcb-surface.c | 18 ++------ + src/cairo-xlib-surface.c | 16 +------ + 10 files changed, 99 insertions(+), 388 deletions(-) + +commit ac6f15e2450e4e08d833355e626df0358d81c2ec +Author: Owen Taylor +Date: Thu Apr 7 13:29:32 2005 +0000 + + src/cairo.[ch] src/cairoint.h src/cairo-gstate.c docs/public/cairo-sections.txt: cairo_select_font() => cairo_select_font_face() cairo_scale_font() => cairo_set_font_size() cairo_transform_font() => cairo_set_font_matrix() Add cairo_get_font_matrix(). Make cairo_set_font_face() not reset the font matrix. Default the font matrix to SCALE(10). Document cairo_select_font_face(). + test/text-cache-crash.c (draw) test/text-rotate.c (draw): Use cairo_set_font_size(). + src/cairo-font.c src/cairo.h: Fix up some parameter names for docs. + + ChangeLog | 17 ++++++++++ + doc/public/cairo-sections.txt | 10 ++++-- + doc/public/tmpl/cairo-font.sgml | 12 +++++-- + doc/public/tmpl/cairo.sgml | 18 +++++++--- + src/cairo-font.c | 8 ++--- + src/cairo-gstate.c | 50 +++++++++++----------------- + src/cairo.c | 73 ++++++++++++++++++++++++++++++----------- + src/cairo.h | 32 +++++++++++------- + src/cairoint.h | 30 ++++++++--------- + test/coverage.c | 2 +- + test/text-cache-crash.c | 6 ++-- + test/text-rotate.c | 2 +- + 12 files changed, 163 insertions(+), 97 deletions(-) + +commit 62212867d4228d5834ea16858a8569765977bdd9 +Author: Carl Worth +Date: Thu Apr 7 12:56:43 2005 +0000 + + Minor changes to header file inclusion recommended by Oleg Smolsky for better portability to MSVC. + + ChangeLog | 10 ++++++++++ + src/cairo-gstate.c | 1 - + src/cairo-png.c | 3 ++- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-win32.h | 1 + + src/cairoint.h | 4 ++++ + 7 files changed, 19 insertions(+), 4 deletions(-) + +commit 4a3a6e871965b1f2ab113cb50a4687a54a231856 +Author: Owen Taylor +Date: Thu Apr 7 12:38:02 2005 +0000 + + Fix various compilation errors. + + ChangeLog | 4 +++ + src/cairo-win32-font.c | 83 ++++++++++++++++++++++++-------------------------- + 2 files changed, 44 insertions(+), 43 deletions(-) + +commit 3ea3186f165c2d73403534982094518473156989 +Author: Carl Worth +Date: Thu Apr 7 12:35:33 2005 +0000 + + Use a preprocessor macro to get a literal value in the array size declaration, (for better portability to lame compilers that can't deal with a const int variable for the array size). Reported by Oleg Smolsky. + + ChangeLog | 1 + + src/cairo-png.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 88a62f07df27a5e6501678e3aec1882e367901be +Author: Carl Worth +Date: Thu Apr 7 12:33:06 2005 +0000 + + Use a preprocessor macro to get a literal value in the array size declaration, (for better portability to lame compilers that can't deal with a const int variable for the array size). Reported by Oleg Smolsky. + + ChangeLog | 7 +++++++ + src/cairo-png.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit d4209c331f0823c585643e6a7197107321ba2049 +Author: Carl Worth +Date: Thu Apr 7 12:05:52 2005 +0000 + + Use configure-time checks for stdint.h vs. inttypes.h vs. sys/int_types.h rather than ad-hoc system-specific macros. Also define these types manually none of these header are available. (Thanks to Jason Dorje Short ). + + ChangeLog | 10 ++++++++++ + configure.in | 1 + + src/cairo-wideint.h | 23 +++++++++++++++++------ + src/cairoint.h | 10 ---------- + 4 files changed, 28 insertions(+), 16 deletions(-) + +commit 945e6c24586e124a346818c9a2b15f4693b8ae9f +Author: Carl Worth +Date: Thu Apr 7 11:18:40 2005 +0000 + + Fix to return non-zero status on error. + + ChangeLog | 4 ++++ + test/imagediff.c | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 47824dee31acdaf5ad6488dd2714e9f28c936aa2 +Author: Owen Taylor +Date: Thu Apr 7 11:03:59 2005 +0000 + + src/cairo.h src/cairo-gstate.c src/cairo-font.c: Add a cairo_font_face_t type to hold a description of a font face. Replace cairo_set_font() with cairo_set_font_face(). + src/cairoint.h src/cairo-font.c src/cairo-gstate.c: Add "cairo_simple_font_face" for family/weight/slant and use it to implement font naming for the toy API. + src/cairo-ft.h src/cairo-ft-font.c cairo-win32.h cairo-win32-font.c: Switch the FreeType and Win32 backends over to using cairo_font_face_t. + src/cairo.h src/cairo-font.c src/cairo-ft-font.c src/cairo-win32-font.c: Pass in font matrix and CTM separately rather than as a composite scale when creating fonts; allows removing font_matrix argument to metrics functions. + src/cairoint.h src/cairo-font.c src/cairo-ft-font.c src/cairo-win32-font.c: Remove cairo_font_scale_t type, just use cairo_matrix_t and ignore translations. + src/cairo-ft.h src/cairo-ft-font.c: Remove cairo_ft_font_get_pattern() -- it can't work for all FreeType backend fonts and doesn't seem particularly useful. + Rename cairo_font_get_extents() to cairo_font_extents() + split font functions into a separate section. + Fix locking order problem. + Add caches for simple font faces and from cairo_font_face_t to cairo_scaled_font_t. + src/cairo.h src/cairoint.h src/cairo-font.c src/cairo-win32-font.c src/cairo-ft-font.c src/cairo-gstate.c src/cairo-gstate-private.h: Rename cairo_font_t to cairo_scaled_font_t. + + ChangeLog | 43 ++ + doc/public/cairo-sections.txt | 47 +- + doc/public/tmpl/cairo-font.sgml | 118 +++++ + doc/public/tmpl/cairo-ft.sgml | 23 +- + doc/public/tmpl/cairo-matrix.sgml | 27 +- + doc/public/tmpl/cairo-pdf.sgml | 38 +- + doc/public/tmpl/cairo-png.sgml | 24 - + doc/public/tmpl/cairo-surface.sgml | 5 +- + doc/public/tmpl/cairo.sgml | 130 +----- + src/cairo-font.c | 875 ++++++++++++++++++++++++++++++++----- + src/cairo-ft-font.c | 829 ++++++++++++++++++----------------- + src/cairo-ft-private.h | 2 +- + src/cairo-ft.h | 19 +- + src/cairo-gstate-private.h | 3 +- + src/cairo-gstate.c | 211 ++++----- + src/cairo-pdf-surface.c | 16 +- + src/cairo-surface.c | 4 +- + src/cairo-win32-font.c | 564 ++++++++++++------------ + src/cairo-win32-surface.c | 2 +- + src/cairo-win32.h | 13 +- + src/cairo-xlib-surface.c | 18 +- + src/cairo.c | 79 +--- + src/cairo.h | 77 ++-- + src/cairoint.h | 184 ++++---- + 24 files changed, 2033 insertions(+), 1318 deletions(-) + +commit d135938efd443e4adce63cf8c5926ac421b2d3ed +Author: Carl Worth +Date: Thu Apr 7 10:01:49 2005 +0000 + + Rework the cairo_matrix_t interface in several ways. Expose a struct for cairo_matrix_t. + Add new function to return current matrix: cairo_get_matrix + Deprecate the following functions (in documentation): cairo_matrix_create cairo_matrix_destroy cairo_matrix_get_affine + Rename: cairo_matrix_set_affine -> cairo_matrix_init cairo_matrix_set_identity -> cairo_matrix_init_identity + Add other new matrix initialization functions: cairo_matrix_init_translate cairo_matrix_init_scale cairo_matrix_init_rotate + Change return type of almost all cairo_matrix functions from cairo_status_t to void. + Track changes to cairo_matrix_t interface. + Add a test case showing the same path drawn under various transforms, (including skews set directly by initializing a cairo_matrix_t). + + ChangeLog | 46 ++++++ + TODO | 2 +- + src/cairo-atsui-font.c | 6 +- + src/cairo-ft-font.c | 12 +- + src/cairo-gstate.c | 48 ++++--- + src/cairo-image-surface.c | 12 +- + src/cairo-matrix.c | 354 ++++++++++++++++++++++------------------------ + src/cairo-pattern.c | 18 ++- + src/cairo-pdf-surface.c | 20 +-- + src/cairo-pen.c | 4 +- + src/cairo-surface.c | 10 +- + src/cairo-win32-font.c | 14 +- + src/cairo-xlib-surface.c | 12 +- + src/cairo.c | 26 +++- + src/cairo.h | 70 ++++++--- + src/cairoint.h | 38 ++--- + test/.cvsignore | 1 + + test/Makefile.am | 5 +- + test/transforms-ref.png | Bin 0 -> 302 bytes + test/transforms.c | 111 +++++++++++++++ + 20 files changed, 502 insertions(+), 307 deletions(-) + +commit 92060c12ee2acc38541ec2398abba5e1569278de +Author: Carl Worth +Date: Wed Apr 6 13:01:13 2005 +0000 + + Make handling of unsigned char* vs. char* consistent. Change all parameters that are actual string data from unsigned char* to char* (cairo_text_extents, cairo_show_text, cairo_text_path). Change all data buffers from char* to unsigned char* (cairo_write_func_t). + Track changes from unsigned char* to char*. Convert to unsigned only at the internal interface to unicode processing. + Track change from char* to unsigned char*. + + ChangeLog | 22 ++++++++++++++++++++++ + src/cairo-atsui-font.c | 13 +++++++------ + src/cairo-font.c | 8 ++++---- + src/cairo-ft-font.c | 14 +++++++------- + src/cairo-gstate.c | 8 ++++---- + src/cairo-output-stream.c | 6 +++--- + src/cairo.c | 6 +++--- + src/cairo.h | 16 ++++++++-------- + src/cairoint.h | 18 +++++++++--------- + test/move-to-show-surface.c | 2 +- + 10 files changed, 68 insertions(+), 45 deletions(-) + +commit 957ceac0c63b70d1a32b64d0d6a89cb1b9bca2c5 +Author: Carl Worth +Date: Wed Apr 6 12:20:02 2005 +0000 + + Fix reversed arguments in call to calloc. + + ChangeLog | 5 +++++ + src/cairo-cache.c | 5 +++-- + src/cairo-hash.c | 5 +++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit a6d9b6a671faf6cc726af12d4f4e706262c2bd6b +Author: Carl Worth +Date: Mon Apr 4 09:47:12 2005 +0000 + + Change type of data parameter from char* to unsigned char*. + Propagate the unsigned char* change down the stack. + Add cast since XImage uses char* rather than unsigned char*. + Fix memory leak of image data. + Switch to use cairo_surface_write_png rather than a custom write_png_argb32. + Add test to exercise the cairo_image_surface_create_for_png function. + + ChangeLog | 35 ++++++++++++++++++-- + src/cairo-ft-font.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-pattern.c | 8 ++--- + src/cairo-png.c | 9 ++++-- + src/cairo-xlib-surface.c | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 4 +-- + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/buffer-diff.c | 6 ++-- + test/buffer-diff.h | 4 ++- + test/cairo-test.c | 14 ++++---- + test/cairo-test.h | 2 ++ + test/create-for-png-ref.png | Bin 0 -> 100 bytes + test/create-for-png.c | 74 +++++++++++++++++++++++++++++++++++++++++++ + test/create-from-png-ref.png | Bin 0 -> 100 bytes + test/create-from-png.c | 74 +++++++++++++++++++++++++++++++++++++++++++ + test/write-png.c | 2 +- + test/write-png.h | 2 +- + 20 files changed, 221 insertions(+), 25 deletions(-) + +commit 770d4c55b4b576875b73249f29ad7840fb5da7e5 +Author: Carl Worth +Date: Mon Apr 4 09:25:47 2005 +0000 + + Remove items for PNG backend removal and trapezoid reasterization re-implementation since they have been completed. + + ChangeLog | 6 ++++++ + TODO | 6 ------ + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 027057bf62fe0df78261af338f6d2f190433792b +Author: Carl Worth +Date: Mon Apr 4 06:49:19 2005 +0000 + + Drop cairo_default_matrix since it is now always identical to cairo_identity_matrix. + Remove gstate->pixels_per inch. Change default matrix to always be the identity matrix. + Drop pixels_per_inch function from surface backend interface as it is no longer needed. + + ChangeLog | 24 ++++++++++++++++++++++++ + src/cairo-glitz-surface.c | 7 ------- + src/cairo-gstate-private.h | 2 -- + src/cairo-gstate.c | 28 ++-------------------------- + src/cairo-image-surface.c | 8 -------- + src/cairo-pdf-surface.c | 10 ---------- + src/cairo-ps-surface.c | 10 ---------- + src/cairo-quartz-surface.c | 9 --------- + src/cairo-surface.c | 6 ------ + src/cairo-win32-surface.c | 8 -------- + src/cairo-xcb-surface.c | 8 -------- + src/cairo-xlib-surface.c | 8 -------- + src/cairo.c | 30 ++++++++++++++++++------------ + src/cairo.h | 7 ++----- + src/cairoint.h | 10 ---------- + 15 files changed, 46 insertions(+), 129 deletions(-) + +commit 5778c77382f3a81b77aca1d224d0ad7626bcd5d2 +Author: Carl Worth +Date: Sat Apr 2 06:00:32 2005 +0000 + + Use the current point to offset just the destination, not the source and destination. With this fix, cairo_show_surface should work with the current point at places other than the origin. + Move move-to-show-surface off the expected failure list. + Add comment indicating that bug is resolved. + Don't use diff to compare images, just imagediff. + + ChangeLog | 15 +++++++++++++++ + src/cairo-gstate.c | 4 ++-- + test/Makefile.am | 1 - + test/move-to-show-surface.c | 9 +++++++++ + test/testsvg | 4 ++-- + 5 files changed, 28 insertions(+), 5 deletions(-) + +commit 9e405876e86ce004cd69b87a10c1bf7ce7d1b436 +Author: Carl Worth +Date: Sat Apr 2 05:18:11 2005 +0000 + + Style and indentation fixes. + cast to quiet new gcc-4 warnings. + Initialize variables to quiet new gcc-4 warnings. + Use unsigned char* as expected by freetype, libpng, Xlib, and zlib. + Propagate unsigned char* down from cairo_text_extents. + + ChangeLog | 29 +++++++++++++++++++++++++++++ + src/cairo-font.c | 6 +++--- + src/cairo-ft-font.c | 7 ++++--- + src/cairo-gstate.c | 12 ++++++------ + src/cairo-image-surface.c | 2 +- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-png.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-unicode.c | 28 ++++++++++++++-------------- + src/cairo-xlib-surface.c | 5 +++-- + src/cairo.c | 34 ++++++++++++++++++---------------- + src/cairo.h | 14 +++++++------- + src/cairoint.h | 36 ++++++++++++++++++------------------ + 13 files changed, 109 insertions(+), 76 deletions(-) + +commit 7636e901841a800dd5d032963fca6a7c9ef1be99 +Author: Carl Worth +Date: Fri Apr 1 18:00:00 2005 +0000 + + Update API shakeup chart. + Add a standin for the function that should be cairo_set_target_image which should then have some other name. We can straighten that mess out when we eliminate the set_target functions. Add deprecation alias for cairo_current_pattern. + Deprecate cairo_surface_create_for_image in favor of cairo_image_surface_create_for_data. + + ChangeLog | 16 +++++++++++++++ + TODO | 6 +++--- + src/cairo-image-surface.c | 1 + + src/cairo-surface.c | 11 ----------- + src/cairo.c | 50 +++++++++++++++++++++++++++++++++++++++++++---- + src/cairo.h | 21 +++++++++++--------- + src/cairoint.h | 1 - + 7 files changed, 78 insertions(+), 28 deletions(-) + +commit 5abf7786c070a3baf220599d6e3b71e56911ba5f +Author: Kristian Høgsberg +Date: Thu Mar 31 13:25:44 2005 +0000 + + Remove this function now that the PNG backend is gone. + + ChangeLog | 5 +++++ + src/cairo.c | 28 ---------------------------- + 2 files changed, 5 insertions(+), 28 deletions(-) + +commit 19a918e624a398c315e511e580bc048b81d58849 +Author: Carl Worth +Date: Wed Mar 30 14:00:31 2005 +0000 + + Fix typo I had introduced into Jason's patch that made configure fail. + + ChangeLog | 5 +++++ + configure.in | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 13b1b705f41efd33dfb5d1fa9ddb3c22f353055f +Author: Carl Worth +Date: Wed Mar 30 13:34:51 2005 +0000 + + A few fixes courtesy of Jason Dorje Short : + Disable PS backend if zlib is not found. + Fix mistyped parameter. + Fix missing return value. + + ChangeLog | 12 ++++++++++++ + configure.in | 6 ++++++ + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 4 +++- + 4 files changed, 22 insertions(+), 2 deletions(-) + +commit 811fe63f84983efa7aec984dfb4a4aed365bab02 +Author: Tor Lillqvist +Date: Wed Mar 30 09:31:49 2005 +0000 + + src/cairo-gstate.c (_cairo_gstate_stroke_extents): call _cairo_pen_init so that the result takes into account the caps. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 2 ++ + 2 files changed, 7 insertions(+) + +commit a7a4aa34f89b9a65ad00da6048e86301ad7d21cc +Author: Tor Lillqvist +Date: Tue Mar 29 11:54:01 2005 +0000 + + src/cairo-xlib.h: include Xlib.h to fix solaris build bustage. + + ChangeLog | 4 ++++ + src/cairo-xlib.h | 1 + + 2 files changed, 5 insertions(+) + +commit a55a640e542c483a286b9481d8b9ee1fb96a8c4a +Author: Tor Lillqvist +Date: Tue Mar 29 11:48:58 2005 +0000 + + src/cairo-wideint.h: add preprocessor tests for stdint.h/inttypes.h + src/cairoint.h: add preprocessor tests for stdint.h/inttypes.h + + ChangeLog | 6 ++++++ + src/cairo-wideint.h | 12 ++++++++++-- + src/cairoint.h | 11 ++++++++++- + 3 files changed, 26 insertions(+), 3 deletions(-) + +commit 72cc8f96fe75ccb79fd0d136b99020f5bc64e05b +Author: Tor Lillqvist +Date: Tue Mar 29 11:45:52 2005 +0000 + + src/pixman.h: add AIX to the test for inttypes.h + + pixman/ChangeLog | 4 ++++ + pixman/src/pixman.h | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 78b022b1d18dff1627a054bae1ef1fcc87ba2cbb +Author: Tor Lillqvist +Date: Tue Mar 29 11:24:10 2005 +0000 + + Update quartz backend to compilable/workable version and re-enable. + + ChangeLog | 8 + + configure.in | 2 +- + src/cairo-atsui-font.c | 1228 +++++++++++++++++++++----------------------- + src/cairo-quartz-surface.c | 383 +++++++------- + 4 files changed, 768 insertions(+), 853 deletions(-) + +commit 35b9e3c45d8a4c2aa24eff5acb04d0e1eb7bc6ba +Author: Carl Worth +Date: Tue Mar 29 00:02:19 2005 +0000 + + More _/- renames in the test directory. + + ChangeLog | 5 + + test/.cvsignore | 24 ++-- + test/Makefile.am | 66 +++++----- + test/buffer-diff.c | 2 +- + test/buffer_diff.c | 73 ----------- + test/buffer_diff.h | 38 ------ + test/cairo-test.c | 8 +- + test/cairo_test.c | 263 -------------------------------------- + test/cairo_test.h | 55 -------- + test/clip-twice.c | 4 +- + test/clip_twice-ref.png | Bin 751 -> 0 bytes + test/clip_twice.c | 74 ----------- + test/coverage.c | 2 +- + test/fill-rule.c | 4 +- + test/fill_rule-ref.png | Bin 1979 -> 0 bytes + test/fill_rule.c | 132 ------------------- + test/get-and-set.c | 4 +- + test/get_and_set.c | 151 ---------------------- + test/imagediff.c | 6 +- + test/leaky-polygon.c | 4 +- + test/leaky_polygon-ref.png | Bin 255 -> 0 bytes + test/leaky_polygon.c | 84 ------------ + test/line-width.c | 4 +- + test/line_width-ref.png | Bin 171 -> 0 bytes + test/line_width.c | 65 ---------- + test/linear-gradient.c | 4 +- + test/linear_gradient-ref.png | Bin 12724 -> 0 bytes + test/linear_gradient.c | 143 --------------------- + test/move-to-show-surface.c | 4 +- + test/move_to_show_surface-ref.png | Bin 100 -> 0 bytes + test/move_to_show_surface.c | 71 ---------- + test/path-data.c | 4 +- + test/path_data-ref.png | Bin 387 -> 0 bytes + test/path_data.c | 179 -------------------------- + test/pixman-rotate.c | 4 +- + test/pixman_rotate-ref.png | Bin 260 -> 0 bytes + test/pixman_rotate.c | 80 ------------ + test/read-png.c | 2 +- + test/read_png.c | 166 ------------------------ + test/read_png.h | 45 ------- + test/text-cache-crash.c | 4 +- + test/text-rotate.c | 4 +- + test/text_cache_crash.c | 135 ------------------- + test/text_rotate.c | 119 ----------------- + test/user_data.c | 78 ----------- + test/write-png.c | 2 +- + test/write_png.c | 99 -------------- + test/write_png.h | 35 ----- + 48 files changed, 83 insertions(+), 2163 deletions(-) + +commit d9c2be3dcd27baa91b67cc9179bc98e06805a365 +Author: Carl Worth +Date: Mon Mar 28 14:30:40 2005 +0000 + + Renamed a bunch of files to use - rather than _ as a separator. Copy happened in the master repository to preserve history, so this is just a big remove. + + ChangeLog | 7 + + src/Makefile.am | 68 +- + src/cairo_array.c | 134 --- + src/cairo_atsui_font.c | 807 -------------- + src/cairo_cache.c | 518 --------- + src/cairo_color.c | 97 -- + src/cairo_fixed.c | 91 -- + src/cairo_font.c | 475 -------- + src/cairo_ft_font.c | 1538 -------------------------- + src/cairo_glitz_surface.c | 1299 ---------------------- + src/cairo_gstate.c | 2618 -------------------------------------------- + src/cairo_hull.c | 202 ---- + src/cairo_image_surface.c | 675 ------------ + src/cairo_matrix.c | 656 ----------- + src/cairo_output_stream.c | 147 --- + src/cairo_path.c | 504 --------- + src/cairo_path_bounds.c | 184 ---- + src/cairo_path_data.c | 275 ----- + src/cairo_path_fill.c | 210 ---- + src/cairo_path_stroke.c | 852 -------------- + src/cairo_pattern.c | 1325 ---------------------- + src/cairo_pdf_surface.c | 2278 -------------------------------------- + src/cairo_pen.c | 589 ---------- + src/cairo_polygon.c | 172 --- + src/cairo_ps_surface.c | 403 ------- + src/cairo_quartz_surface.c | 392 ------- + src/cairo_slope.c | 103 -- + src/cairo_spline.c | 288 ----- + src/cairo_surface.c | 958 ---------------- + src/cairo_traps.c | 740 ------------- + src/cairo_unicode.c | 340 ------ + src/cairo_wideint.c | 1024 ----------------- + src/cairo_win32_font.c | 1252 --------------------- + src/cairo_win32_surface.c | 908 --------------- + src/cairo_xcb_surface.c | 946 ---------------- + src/cairo_xlib_surface.c | 1669 ---------------------------- + 36 files changed, 41 insertions(+), 24703 deletions(-) + +commit 18c8846bc068e59137cf8cf4a94ad37822e28fae +Author: Carl Worth +Date: Mon Mar 28 14:06:40 2005 +0000 + + Sorted API shakeup chart. + + ChangeLog | 4 ++++ + TODO | 31 ++++++++++++++++++------------- + 2 files changed, 22 insertions(+), 13 deletions(-) + +commit bd5bbb6ce2e0f3a9296e3fec017ace10ee8068d3 +Author: Kristian Høgsberg +Date: Mon Mar 28 13:58:26 2005 +0000 + + New PNG utility functions. + Reverse the naming of the pdf constructors so the callback based ones have the long names. + + ChangeLog | 9 ++ + configure.in | 18 +-- + src/Makefile.am | 4 +- + src/cairo-features.h.in | 4 +- + src/cairo-pdf-surface.c | 24 +-- + src/cairo-pdf.h | 52 +++---- + src/cairo-png.c | 336 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-png.h | 20 +-- + src/cairo.c | 43 +++--- + src/cairo_pdf_surface.c | 24 +-- + src/cairo_png_surface.c | 402 ------------------------------------------------ + 11 files changed, 438 insertions(+), 498 deletions(-) + +commit 33d2ec2eb8b97e51fc3e24fdfa97ee7b89e734a1 +Author: Jamey Sharp +Date: Fri Mar 25 11:47:38 2005 +0000 + + Fix "implicit declaration" warning in cairo.c by moving cairo_xcb_surface_create prototype into cairo-xcb.h. + + ChangeLog | 7 +++++++ + src/cairo-xcb-surface.c | 6 ------ + src/cairo-xcb.h | 6 ++++++ + src/cairo_xcb_surface.c | 6 ------ + 4 files changed, 13 insertions(+), 12 deletions(-) + +commit 410e3ae8f20176f1a18b5394dfa753a277221a7f +Author: Carl Worth +Date: Wed Mar 23 14:36:29 2005 +0000 + + Clean up names of cairo_path internals. + + ChangeLog | 5 + + src/cairo-path-fixed-private.h | 14 +- + src/cairo-path.c | 293 ++++++++++++++++++++--------------------- + src/cairo_path.c | 293 ++++++++++++++++++++--------------------- + 4 files changed, 304 insertions(+), 301 deletions(-) + +commit 5170c1f4d2e554ad03450513046ff8c27150f6ee +Author: Carl Worth +Date: Wed Mar 23 14:17:40 2005 +0000 + + Remove unneeded includes of cairo-path-fixed-private.h. + Fix indentation. + + ChangeLog | 9 +++++++++ + src/cairo-ft-font.c | 2 +- + src/cairo-path-fill.c | 1 - + src/cairo-path-stroke.c | 1 - + src/cairo_ft_font.c | 2 +- + src/cairo_path_fill.c | 1 - + src/cairo_path_stroke.c | 1 - + 7 files changed, 11 insertions(+), 6 deletions(-) + +commit 9bcfb831fa6355b61700b2c5f466711296971a07 +Author: Carl Worth +Date: Wed Mar 23 14:02:36 2005 +0000 + + More updates to the API Shakeup chart. + + ChangeLog | 4 ++++ + TODO | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit f218c14b9da7950b49bdab76965db22ec470d5de +Author: Carl Worth +Date: Wed Mar 23 13:52:54 2005 +0000 + + Rename cairo_path_real_t to cairo_path_fixed_t and fix all _cairo_path functions to be named as _cairo_path_fixed functions. + Track name change of cairo_path_real_t and _cairo_path_fixed functions. + + ChangeLog | 37 ++++++++++ + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 26 +++---- + src/cairo-gstate-private.h | 2 +- + src/cairo-gstate.c | 66 +++++++++--------- + src/cairo-path-bounds.c | 18 ++--- + src/cairo-path-fill.c | 20 +++--- + src/cairo-path-fixed-private.h | 2 +- + src/cairo-path-stroke.c | 34 ++++----- + src/cairo-path.c | 74 ++++++++++---------- + src/cairo_font.c | 2 +- + src/cairo_ft_font.c | 26 +++---- + src/cairo_gstate.c | 66 +++++++++--------- + src/cairo_path.c | 74 ++++++++++---------- + src/cairo_path_bounds.c | 18 ++--- + src/cairo_path_fill.c | 20 +++--- + src/cairo_path_stroke.c | 34 ++++----- + src/cairoint.h | 152 ++++++++++++++++++++++------------------- + 18 files changed, 360 insertions(+), 313 deletions(-) + +commit 0ba7a082afa91476129f2cbdbc48360b4f83efec +Author: Carl Worth +Date: Wed Mar 23 13:52:11 2005 +0000 + + Remove CAIRO_BEGIN_DECLS and CAIRO_END_DECLS as they are not needed for private headers. + Add ASSERT_NOT_REACHED macro. + Rewrite in terms of cairo_copt_path and cairo_copy_path_flat in preparation for removing cairo_gstate_interpret_path. + + ChangeLog | 11 +++++++ + src/cairo-path-data-private.h | 4 --- + src/cairo.c | 69 +++++++++++++++++++++++++++++++++++-------- + src/cairoint.h | 6 ++++ + 4 files changed, 73 insertions(+), 17 deletions(-) + +commit cb5bbd0aa75ad55a7f0f61c718c32f9b9f5af45e +Author: Carl Worth +Date: Wed Mar 23 13:50:51 2005 +0000 + + Begin the process of breaking up cairoint.h, moving structure definitions of cairo_t, cairo_gstate_t, and cairo_path_real_t into their own header files. + Track changes to header files, reaching into the new private headers where necessary. + + ChangeLog | 17 +++++++++ + src/cairo-gstate-private.h | 85 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-gstate.c | 2 + + src/cairo-path-fill.c | 3 ++ + src/cairo-path-fixed-private.h | 74 ++++++++++++++++++++++++++++++++++++ + src/cairo-path-stroke.c | 3 ++ + src/cairo-path.c | 2 + + src/cairo-pen.c | 2 + + src/cairo-private.h | 47 +++++++++++++++++++++++ + src/cairo.c | 2 + + src/cairo_gstate.c | 2 + + src/cairo_path.c | 2 + + src/cairo_path_fill.c | 3 ++ + src/cairo_path_stroke.c | 3 ++ + src/cairo_pen.c | 2 + + src/cairoint.h | 86 +----------------------------------------- + 16 files changed, 251 insertions(+), 84 deletions(-) + +commit 9bb171515986fa26dd12ae19e684db847a614960 +Author: Carl Worth +Date: Wed Mar 23 13:49:32 2005 +0000 + + Move surface-specific cairo_t functions to cairo.c. + Remove functions that have now moved to cairo.c. + A few new files to ignore now with new compilation mode using a libtool helper library. + + ChangeLog | 20 ++++ + src/cairo-glitz-surface.c | 19 ---- + src/cairo-pdf-surface.c | 75 ------------- + src/cairo-ps-surface.c | 40 ------- + src/cairo-win32-surface.c | 21 ---- + src/cairo-xcb-surface.c | 24 ----- + src/cairo-xlib-surface.c | 41 ------- + src/cairo.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_glitz_surface.c | 19 ---- + src/cairo_pdf_surface.c | 75 ------------- + src/cairo_png_surface.c | 23 ---- + src/cairo_ps_surface.c | 40 ------- + src/cairo_win32_surface.c | 21 ---- + src/cairo_xcb_surface.c | 24 ----- + src/cairo_xlib_surface.c | 41 ------- + test/.cvsignore | 5 +- + 16 files changed, 288 insertions(+), 465 deletions(-) + +commit 12de3807b48d6c5f133983a0de1498f93e0c84a6 +Author: Carl Worth +Date: Wed Mar 23 13:31:01 2005 +0000 + + Add backwards-compatibility for recently renamed functions. + + ChangeLog | 5 +++++ + src/cairo.h | 12 ++++++++++++ + 2 files changed, 17 insertions(+) + +commit b381eb8045683e51cbd052bb724cab9969677cb6 +Author: Carl Worth +Date: Sun Mar 20 23:23:19 2005 +0000 + + Rename functions to eliminate abbreviations: cairo_concat_matrix -> cairo_transform cairo_transform_point -> cairo_user_to_device cairo_transform_distance -> cairo_user_to_device_distance cairo_inverse_transform_point -> cairo_device_to_user cairo_inverse_transform_distance-> cairo_device_to_user_distance cairo_init_clip -> cairo_reset_clip + + ChangeLog | 19 +++++++ + src/cairo-gstate.c | 29 +++++----- + src/cairo-matrix.c | 10 ++-- + src/cairo.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++++----- + src/cairo.h | 14 ++--- + src/cairo_gstate.c | 29 +++++----- + src/cairo_matrix.c | 10 ++-- + src/cairoint.h | 16 +++--- + 8 files changed, 220 insertions(+), 66 deletions(-) + +commit ba5bf28fbcc41925f49700be02365850b7e445d7 +Author: Carl Worth +Date: Fri Mar 18 14:31:11 2005 +0000 + + Update API shakeup chart. + + ChangeLog | 4 ++++ + TODO | 6 +++--- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit c629df861673bd9e60cf7a3babd83f0f5bb257f0 +Author: Carl Worth +Date: Fri Mar 18 14:28:53 2005 +0000 + + * src/cairo.c: (cairo_copy_path), (cairo_copy_path_flat), (cairo_append_path): Rename cairo_copy_path_data, cairop_copy_path_data_flat, and cairo_append_path_data to cairo_copy_path, cairo_copy_path_flat, and cairo_append_path. + Add new cairo_path_t, containing a cairo_path_data_t array and an explicit length. Remove CAIRO_PATH_END_PATH terminator from cairo_path_data_t. + Rename the internal path object from cairo_path_t to cairo_path_real_t. + + ChangeLog | 36 +++++++++++++++++++++ + src/cairo-atsui-font.c | 4 +-- + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 10 +++--- + src/cairo-gstate.c | 2 +- + src/cairo-path-bounds.c | 4 ++- + src/cairo-path-data-private.h | 10 +++--- + src/cairo-path-data.c | 65 ++++++++++++++++++++----------------- + src/cairo-path-fill.c | 4 ++- + src/cairo-path-stroke.c | 4 ++- + src/cairo-path.c | 62 ++++++++++++++++++++---------------- + src/cairo.c | 56 ++++++++++++++++---------------- + src/cairo.h | 74 ++++++++++++++++++++++++++++--------------- + src/cairo_atsui_font.c | 4 +-- + src/cairo_font.c | 2 +- + src/cairo_ft_font.c | 10 +++--- + src/cairo_gstate.c | 2 +- + src/cairo_path.c | 62 ++++++++++++++++++++---------------- + src/cairo_path_bounds.c | 4 ++- + src/cairo_path_data.c | 65 ++++++++++++++++++++----------------- + src/cairo_path_fill.c | 4 ++- + src/cairo_path_stroke.c | 4 ++- + src/cairoint.h | 64 ++++++++++++++++++++----------------- + test/path-data.c | 60 +++++++++++++++++++++-------------- + test/path_data.c | 60 +++++++++++++++++++++-------------- + 25 files changed, 402 insertions(+), 272 deletions(-) + +commit 987a13b814d2d84cff719a817f9f73a5b7aa38f2 +Author: Kristian Høgsberg +Date: Fri Mar 18 12:26:03 2005 +0000 + + Remove return statements from these functions (bug #2137). + + ChangeLog | 6 ++++++ + src/cairo-pdf-surface.c | 20 ++++++++++---------- + src/cairo_pdf_surface.c | 20 ++++++++++---------- + 3 files changed, 26 insertions(+), 20 deletions(-) + +commit 84a6da8f07a5f0352a342ed8d599b52ab32dfe6f +Author: Carl Worth +Date: Fri Mar 18 11:15:25 2005 +0000 + + Remove unused libcairo_freetype_sources (thanks to Damien Carbery). Closes bug #2673. + + ChangeLog | 6 ++++++ + TODO | 2 +- + src/Makefile.am | 1 - + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit 2ad590a0eebe8c03cb956dfaf0ce79c485c2ce3c +Author: Owen Taylor +Date: Thu Mar 17 13:27:26 2005 +0000 + + doc fix - 90 degrees is MI_PI/2 radians. + src/cairo.c src/cairo_matrix.c src/cairo_ft_font.c src/cairo_ps_surface.c src/cairo_quartz_surface.c src/cairo_win32_font.c src/cairo_win32_surface.c src/cairo_xlib_surface.c: Cairo is only capitalized at the beginning of sentences. + + ChangeLog | 11 +++++++++++ + src/cairo-ft-font.c | 2 +- + src/cairo-matrix.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-quartz-surface.c | 6 +++--- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 6 +++--- + src/cairo-xlib-surface.c | 12 ++++++------ + src/cairo.c | 4 ++-- + src/cairo_ft_font.c | 2 +- + src/cairo_matrix.c | 4 ++-- + src/cairo_ps_surface.c | 4 ++-- + src/cairo_quartz_surface.c | 6 +++--- + src/cairo_win32_font.c | 2 +- + src/cairo_win32_surface.c | 6 +++--- + src/cairo_xlib_surface.c | 12 ++++++------ + 16 files changed, 49 insertions(+), 38 deletions(-) + +commit 58420806bbbe3970747edc2efaa155651377a370 +Author: Kristian Høgsberg +Date: Thu Mar 17 13:13:56 2005 +0000 + + From Tor Lillqvist : + Open output PNG files in binary mode. + + ChangeLog | 7 +++++++ + test/cairo-test.c | 4 ++-- + test/cairo_test.c | 4 ++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit e66e4c7b8c7aa80e3a71caebefae06cd2d6b468e +Author: Owen Taylor +Date: Thu Mar 17 12:57:42 2005 +0000 + + src/cairo.h src/cairo_surface.c src/cairo-xlib.h src/cairo_xlib_surface.c: Move cairo_xlib_surface_set_device_offset() to a generic cairo_surface_set_device_offset(). + Take the surface's device offset into account. + Update. + + ChangeLog | 11 ++++ + doc/public/cairo-sections.txt | 6 +- + doc/public/tmpl/cairo-pdf.sgml | 34 +++++++++++ + doc/public/tmpl/cairo-surface.sgml | 19 ++++++ + doc/public/tmpl/cairo-xlib.sgml | 10 ---- + doc/public/tmpl/cairo.sgml | 13 ++++ + src/cairo-gstate.c | 119 ++++++++++++++++++++++++++----------- + src/cairo-surface.c | 30 ++++++++++ + src/cairo-xlib-surface.c | 111 +++++----------------------------- + src/cairo-xlib.h | 5 -- + src/cairo.h | 5 ++ + src/cairo_gstate.c | 119 ++++++++++++++++++++++++++----------- + src/cairo_surface.c | 30 ++++++++++ + src/cairo_xlib_surface.c | 111 +++++----------------------------- + src/cairoint.h | 3 + + 15 files changed, 350 insertions(+), 276 deletions(-) + +commit 0b09748296ea3f0ebb554061ef248373b8437947 +Author: Owen Taylor +Date: Thu Mar 17 11:24:00 2005 +0000 + + Fix the docs to to correctly describe the order of transformation for muliply/scale/rotate/translate. (cairo_matrix_translate): Fix translate/rotate typo in the parameter descriptions. + + ChangeLog | 7 +++++++ + src/cairo-matrix.c | 35 ++++++++++++++++++++++------------- + src/cairo_matrix.c | 35 ++++++++++++++++++++++------------- + 3 files changed, 51 insertions(+), 26 deletions(-) + +commit 1e7138175667e55dad7e0ca8ebadd0a1a50f0fa8 +Author: Kristian Høgsberg +Date: Thu Mar 17 07:32:28 2005 +0000 + + Forgot to add this file. + + ChangeLog | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b481b858412876f015a2fcba286b0cc5cadf4d0c +Author: Kristian Høgsberg +Date: Thu Mar 17 07:30:05 2005 +0000 + + ChangeLog + + src/cairo-output-stream.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_output_stream.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 294 insertions(+) + +commit 0f52fb2289b8369f0d66a779338e18818746ad7d +Author: Kristian Høgsberg +Date: Wed Mar 16 12:15:29 2005 +0000 + + Dont call user data destroy function if it's NULL. + Add test case for user data with NULL destroy function. + + ChangeLog | 11 ++++++++++- + src/cairo-surface.c | 4 ++-- + src/cairo_surface.c | 4 ++-- + test/user-data.c | 8 ++++++++ + test/user_data.c | 8 ++++++++ + 5 files changed, 30 insertions(+), 5 deletions(-) + +commit 6993c086ebaa9a98b1794f2c483013ec51cc41ec +Author: Kristian Høgsberg +Date: Wed Mar 16 12:08:41 2005 +0000 + + Add cairo_output_stream.c + Add new errors, CAIRO_STATUS_WRITE_ERROR and CAIRO_STATUS_SURFACE_FINISHED, add cairo_surface_finish() prototype, add cairo_write_func_t. + Add strings for new errors, documentation fix. + Rename surface destroy functions to finish and change them to not free the surface. + Change PDF surface constructors to take a write function in the general case and add stdio convenience constructors. Change destroy function to finish for cairo_pdf_surface. Change implementation to use cairo_output_stream_t functions for output. + Use _cairo_surface_show_glyphs instead of calling function pointer directly. + Add prototypes for cairo output stream functions, rename destroy to finish in cairo_surface_backend_t and add finished flag to cairo_surface_t. + Add cairo_surface_finish() and call it from cairo_surface_destroy(). Check the finished flag in cairo_surface_t in functions that change the surface. + + ChangeLog | 38 +++ + src/Makefile.am | 1 + + src/cairo-font.c | 19 +- + src/cairo-glitz-surface.c | 11 +- + src/cairo-image-surface.c | 8 +- + src/cairo-pdf-surface.c | 849 ++++++++++++++++++++++++++-------------------- + src/cairo-pdf.h | 40 ++- + src/cairo-ps-surface.c | 8 +- + src/cairo-surface.c | 116 ++++++- + src/cairo-win32-surface.c | 6 +- + src/cairo-xcb-surface.c | 6 +- + src/cairo-xlib-surface.c | 8 +- + src/cairo.c | 6 +- + src/cairo.h | 22 +- + src/cairo_font.c | 19 +- + src/cairo_glitz_surface.c | 11 +- + src/cairo_image_surface.c | 8 +- + src/cairo_pdf_surface.c | 849 ++++++++++++++++++++++++++-------------------- + src/cairo_png_surface.c | 8 +- + src/cairo_ps_surface.c | 8 +- + src/cairo_surface.c | 116 ++++++- + src/cairo_win32_surface.c | 6 +- + src/cairo_xcb_surface.c | 6 +- + src/cairo_xlib_surface.c | 8 +- + src/cairoint.h | 49 ++- + 25 files changed, 1415 insertions(+), 811 deletions(-) + +commit 5fecf69e2c41ed1957fdde8b0208e7a4aa031466 +Author: Owen Taylor +Date: Tue Mar 15 16:25:30 2005 +0000 + + src/cairo-xlib.h src/cairo_xlib_surface.c: Rework set of contructors for XLib surfaces. Add cairo_xlib_surface_set_size(). + src/cairo-xlib.h src/cairo_xlib_surface.c: Add cairo_xlib_surface_set_device_offset(). + Rewrite for clarity and efficiency. + Use a temporary pixmap to avoid possible BadMatch when fetch from windows. + src/cairo.[ch] src/cairo-xlib.h: Fix some parameter names for the docs. + Update + + ChangeLog | 21 ++ + doc/public/cairo-sections.txt | 5 + + doc/public/tmpl/cairo-surface.sgml | 4 +- + doc/public/tmpl/cairo-xlib.sgml | 55 ++++ + src/cairo-xlib-surface.c | 583 ++++++++++++++++++++++++++----------- + src/cairo-xlib.h | 38 ++- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairo_xlib_surface.c | 583 ++++++++++++++++++++++++++----------- + 9 files changed, 955 insertions(+), 338 deletions(-) + +commit 30e771d8118a6b240f483b4d0db26bb970e88181 +Author: Carl Worth +Date: Mon Mar 14 11:49:12 2005 +0000 + + Add reference image. + + ChangeLog | 4 ++++ + test/path-data-ref.png | Bin 0 -> 387 bytes + test/path_data-ref.png | Bin 0 -> 387 bytes + 3 files changed, 4 insertions(+) + +commit f385e5f3e47dec22aa48df02f3f19b06fe0b8780 +Author: Carl Worth +Date: Mon Mar 14 11:14:13 2005 +0000 + + Fixes to force tests to run against locally compiled version (thanks to Manish Singh). + + ChangeLog | 5 +++++ + test/Makefile.am | 36 +++++++++++++++++++----------------- + 2 files changed, 24 insertions(+), 17 deletions(-) + +commit a98430092f5f43cfa6eee555a56d91575d92cd62 +Author: Carl Worth +Date: Fri Mar 11 14:29:15 2005 +0000 + + Added some documentation, so we get some churn here. + New functions: cairo_copy_path_data, cairo_copy_path_data_flat, and cairo_append_path_data. + Add new implementation for cairo_copy_path_data and cairo_append_path_data. + New test for new path_data functions. + + ChangeLog | 19 +++ + doc/public/cairo-sections.txt | 11 ++ + doc/public/tmpl/cairo-surface.sgml | 22 +++ + doc/public/tmpl/cairo.sgml | 43 ++++++ + src/Makefile.am | 2 + + src/cairo-path-data-private.h | 57 ++++++++ + src/cairo-path-data.c | 268 +++++++++++++++++++++++++++++++++++++ + src/cairo.c | 88 +++++++++++- + src/cairo.h | 100 +++++++++++++- + src/cairo_path_data.c | 268 +++++++++++++++++++++++++++++++++++++ + test/.cvsignore | 3 + + test/Makefile.am | 3 + + test/path-data.c | 167 +++++++++++++++++++++++ + test/path_data.c | 167 +++++++++++++++++++++++ + 14 files changed, 1210 insertions(+), 8 deletions(-) + +commit db616356c1dd6a8a30c681e3380003ada1f3234c +Author: Owen Taylor +Date: Fri Mar 11 12:09:00 2005 +0000 + + Set format->depth correctly instead of just using the bpp. + + pixman/ChangeLog | 5 +++++ + pixman/src/icformat.c | 6 +++++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 1f5394ffe91ee8a7bd4c15cbec3a8ac3956d949e +Author: Kristian Høgsberg +Date: Thu Mar 10 09:28:50 2005 +0000 + + *** empty log message *** + + ChangeLog | 5 +++++ + src/cairo-surface.c | 18 ++++++++++++++++++ + src/cairo_surface.c | 18 ++++++++++++++++++ + 3 files changed, 41 insertions(+) + +commit b032d02322a656a3cfc02d0ea788680c12689d1f +Author: Kristian Høgsberg +Date: Thu Mar 10 09:22:20 2005 +0000 + + Fix assert()'s using = instead of ==. + Move xunlink call below the xasprintf that builds the filename to unlink. + + ChangeLog | 7 +++++++ + test/cairo-test.c | 4 ++-- + test/cairo_test.c | 4 ++-- + test/user-data.c | 4 ++-- + test/user_data.c | 4 ++-- + 5 files changed, 15 insertions(+), 8 deletions(-) + +commit 05a7c69c904119ee08df40b8e3f7154614fcbf8e +Author: Carl Worth +Date: Thu Mar 10 09:02:41 2005 +0000 + + API Shakeup status update. + + ChangeLog | 4 ++++ + TODO | 15 ++++++++------- + 2 files changed, 12 insertions(+), 7 deletions(-) + +commit c67ba13a6e715fa3bd4e785ed72c093f791e2774 +Author: Carl Worth +Date: Thu Mar 10 08:59:11 2005 +0000 + + Originally: 2005-02-24 Carl Worth + Add const qualifier to cairo_user_data_key_t arguments. + Originally: 2005-02-15 Kristian Høgsberg + Add these two functions to set and get user data on an surface. + Function prototypes for new functions. + Test case for user data functions. + + ChangeLog | 18 ++++++++ + doc/public/tmpl/cairo-atsui.sgml | 3 ++ + doc/public/tmpl/cairo-ft.sgml | 3 ++ + doc/public/tmpl/cairo-glitz.sgml | 3 ++ + doc/public/tmpl/cairo-matrix.sgml | 3 ++ + doc/public/tmpl/cairo-pattern.sgml | 3 ++ + doc/public/tmpl/cairo-pdf.sgml | 3 ++ + doc/public/tmpl/cairo-png.sgml | 3 ++ + doc/public/tmpl/cairo-ps.sgml | 3 ++ + doc/public/tmpl/cairo-quartz.sgml | 3 ++ + doc/public/tmpl/cairo-surface.sgml | 3 ++ + doc/public/tmpl/cairo-xcb.sgml | 3 ++ + doc/public/tmpl/cairo-xlib.sgml | 3 ++ + doc/public/tmpl/cairo.sgml | 48 +++++++++++++------- + src/cairo-surface.c | 90 ++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 33 ++++++++++++++ + src/cairo_surface.c | 90 ++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 1 + + test/.cvsignore | 3 +- + test/Makefile.am | 5 ++- + test/user-data.c | 70 +++++++++++++++++++++++++++++ + test/user_data.c | 70 +++++++++++++++++++++++++++++ + 22 files changed, 444 insertions(+), 20 deletions(-) + +commit 12abad4759286d8642cd02f258fba0749ea20b8b +Author: Carl Worth +Date: Wed Mar 9 17:43:59 2005 +0000 + + Move filename initialization up to before first use. + Add test for the most trivial cairo_get and cairo_set functions. + + ChangeLog | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 0daf6b1745fa6a64652849f280da42781aeb296b +Author: Carl Worth +Date: Wed Mar 9 14:34:26 2005 +0000 + + Move filename initialization up to before first use. + Add test for the most trivial cairo_get and cairo_set functions. + + test/Makefile.am | 17 +++--- + test/cairo-test.c | 22 ++++---- + test/cairo_test.c | 22 ++++---- + test/get-and-set.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + test/get_and_set.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 336 insertions(+), 27 deletions(-) + +commit c3bd9b1b8d55d1128a7f70096b7135a80c6c9bed +Author: Carl Worth +Date: Wed Mar 9 13:58:20 2005 +0000 + + Change the draw function under test to return a cairo_test_status_t so that it can indicate test failure even if there is no result image. + + ChangeLog | 17 +++++++++++++++++ + test/cairo-test.c | 20 +++++++++++++++++--- + test/cairo-test.h | 2 +- + test/cairo_test.c | 20 +++++++++++++++++--- + test/cairo_test.h | 2 +- + test/clip-twice.c | 4 +++- + test/clip_twice.c | 4 +++- + test/coverage.c | 4 +++- + test/fill-rule.c | 4 +++- + test/fill_rule.c | 4 +++- + test/leaky-polygon.c | 4 +++- + test/leaky_polygon.c | 4 +++- + test/line-width.c | 4 +++- + test/line_width.c | 4 +++- + test/linear-gradient.c | 4 +++- + test/linear_gradient.c | 4 +++- + test/move-to-show-surface.c | 4 +++- + test/move_to_show_surface.c | 4 +++- + test/pixman-rotate.c | 4 +++- + test/pixman_rotate.c | 4 +++- + test/text-cache-crash.c | 4 +++- + test/text-rotate.c | 4 +++- + test/text_cache_crash.c | 4 +++- + test/text_rotate.c | 4 +++- + 24 files changed, 110 insertions(+), 27 deletions(-) + +commit 80b2742952eeadc116bef8865f55ecb47b4a0a5e +Author: Carl Worth +Date: Wed Mar 9 13:56:37 2005 +0000 + + fix typos. + + ChangeLog | 1 + + TODO | 8 ++++---- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 2fbdcf208216a8c383ce2ddfded4763ba700ed5a +Author: Carl Worth +Date: Wed Mar 9 12:53:01 2005 +0000 + + Update API Shakeup planning chart. + + ChangeLog | 4 ++++ + TODO | 56 ++++++++++++++++++++++++++++++-------------------------- + 2 files changed, 34 insertions(+), 26 deletions(-) + +commit 6d4653fe22c0d24d650b094a1e271c37a9a11eb1 +Author: Carl Worth +Date: Wed Mar 9 12:35:36 2005 +0000 + + Rename all the cairo_current functions to cairo_get functions instead. Add documentation for all of these functions (and a few others as well). + Add support so that old binarys should still run and old source should still compile, (though we'll rip that out again on the API Shakeup flag day). + + ChangeLog | 34 ++++ + doc/public/cairo-sections.txt | 53 +++--- + src/cairo-ft-font.c | 8 +- + src/cairo-gstate.c | 42 ++--- + src/cairo-path.c | 2 +- + src/cairo.c | 423 ++++++++++++++++++++++++++++++++++++------ + src/cairo.h | 125 ++++++++----- + src/cairo_ft_font.c | 8 +- + src/cairo_gstate.c | 42 ++--- + src/cairo_path.c | 2 +- + src/cairoint.h | 36 ++-- + test/pixman-rotate.c | 2 +- + test/pixman_rotate.c | 2 +- + 13 files changed, 578 insertions(+), 201 deletions(-) + +commit 36820ec40a4c2cd246d23d23e6d8ef15dd4c6504 +Author: Carl Worth +Date: Tue Mar 8 19:34:04 2005 +0000 + + Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_4_0. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 980eff38e494223de00e7ded706f6beaca27fce1 +Author: Carl Worth +Date: Tue Mar 8 19:30:19 2005 +0000 + + Commit workaround to prevent make distcheck from making bogus complaints that gtk-doc is not enabled. + + ChangeLog | 4 ++++ + gtk-doc.make | 8 +++++++- + test/Makefile.am | 2 +- + 3 files changed, 12 insertions(+), 2 deletions(-) + +commit e586688e6bed6b148c6920be35741305c95f0ca6 +Author: Carl Worth +Date: Tue Mar 8 19:25:39 2005 +0000 + + Look for png images in ${srcdir}/filename as well, so that make distcheck can still find them. + Add romedalen.png to EXTRA_DIST so the tests can pass from the tar file. + Fix typo: cairo-win3 -> cairo-win32. + Add cairo-win32.xml to the list, so it gets generated as well. + Add pointer to new win32 documentation. + + ChangeLog | 15 +++++++++++++++ + NEWS | 4 ++++ + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 2 +- + test/Makefile.am | 3 ++- + test/cairo-test.c | 9 +++++++++ + test/cairo_test.c | 9 +++++++++ + 7 files changed, 41 insertions(+), 2 deletions(-) + +commit 0c67d496a35e7f069faeaba32bfde697dc949e9f +Author: Carl Worth +Date: Tue Mar 8 17:36:24 2005 +0000 + + Increment CAIRO_VERSION to 0.4.0 + Added notes for snapshot 0.4.0 + + ChangeLog | 6 +++ + NEWS | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 3 files changed, 129 insertions(+), 1 deletion(-) + +commit 627338ab4a270f54235c3356640f7feff4df7079 +Author: Carl Worth +Date: Tue Mar 8 14:30:14 2005 +0000 + + Fix accidental commit of diff, rather than ref image. + + test/coverage-ref.png | Bin 2148 -> 44324 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit c05059f62fc70e94ed864559212a223debe30915 +Author: Carl Worth +Date: Tue Mar 8 14:25:54 2005 +0000 + + Update coverage-ref.png due to seemingly harmless, though not entirely understood changes. + + test/coverage-ref.png | Bin 44331 -> 2148 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 246a07022aa97614c8961526cf3e2b06e8d5774b +Author: Carl Worth +Date: Tue Mar 8 13:44:14 2005 +0000 + + Shared function for checking unlink errrors. (cairo_test): Move all error messages to test-specific log files for quieter test output. + Make pixman_rotate an expected failure. + + ChangeLog | 8 ++++++++ + test/Makefile.am | 6 ++---- + test/cairo-test.c | 48 ++++++++++++++++++++++++++++++++++-------------- + test/cairo_test.c | 48 ++++++++++++++++++++++++++++++++++-------------- + 4 files changed, 78 insertions(+), 32 deletions(-) + +commit 4dcccab806f56f54bd21541c9a90a9439f8ccbbe +Author: Carl Worth +Date: Tue Mar 8 08:51:48 2005 +0000 + + Require libpixman >= 0.1.4. + + ChangeLog | 4 ++++ + configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 74416f2d9aa4529ca8951f0d276e06a148c632fb +Author: Kristian Høgsberg +Date: Mon Mar 7 21:22:42 2005 +0000 + + Return CAIRO_STATUS_SUCCESS even if we don't implement masks yet, so we don't set cr->status to CAIRO_INT_STATUS_UNSUPPORTED. + + ChangeLog | 6 ++++++ + src/cairo-pdf-surface.c | 2 +- + src/cairo_pdf_surface.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit c4697bc572f60340978df6662caad0e0755acc58 +Author: Carl Worth +Date: Mon Mar 7 14:23:07 2005 +0000 + + Disable the "new" intersection code so that the incorrect fill problems (test/fill_rule) go away. + + ChangeLog | 3 +++ + src/cairo-traps.c | 28 ++++++++++++++++++++++++++-- + src/cairo_traps.c | 28 ++++++++++++++++++++++++++-- + 3 files changed, 55 insertions(+), 4 deletions(-) + +commit 864496a10a2a99c27c8dcd90efb7cb1759036ef3 +Author: Carl Worth +Date: Mon Mar 7 13:50:30 2005 +0000 + + Increment version to 0.1.4-head post-snapshot. + + pixman/ChangeLog | 2 ++ + pixman/configure.in | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit dfcd68ecca8f6a627ba406cbd4123a3a1c5cac40 +Author: Carl Worth +Date: Mon Mar 7 13:20:52 2005 +0000 + + Add notes on using -head suffix for PIXMAN_VERSION. + + pixman/ChangeLog | 2 ++ + pixman/RELEASING | 28 +++++++++++++++++----------- + 2 files changed, 19 insertions(+), 11 deletions(-) + +commit 32fbb0afae691d18c23d7fe996d33cd134f58fcb +Author: Carl Worth +Date: Mon Mar 7 12:40:29 2005 +0000 + + Make configure fail if no font backend is available. Point the user at freetype and fontconfig. + + ChangeLog | 5 +++++ + configure.in | 10 ++++++++++ + 2 files changed, 15 insertions(+) + +commit 5804df2bcc1d0d697a2e4c4b7620d742e10fd450 +Author: Carl Worth +Date: Mon Mar 7 12:16:33 2005 +0000 + + Add notes for snapshot 0.1.4. + Increment version to 0.1.4. + + pixman/ChangeLog | 6 ++++++ + pixman/NEWS | 22 ++++++++++++++++++++++ + pixman/configure.in | 2 +- + 3 files changed, 29 insertions(+), 1 deletion(-) + +commit e7607bb379641f1f07a08e02214db63c0ed637a4 +Author: Owen Taylor +Date: Sun Mar 6 12:05:23 2005 +0000 + + Comment and clean up the gradient computation. (_cairo_linear_pattern_classify): Determine if a linear gradient is horizontal or vertical. (_cairo_pattern_acquire_surface_for_gradient): Optimize horizontal/vertical gradients with a repeating surface. + Test case for linear gradients at angles and with a rotated pattern matrix. + + ChangeLog | 12 ++++ + src/cairo-pattern.c | 119 ++++++++++++++++++++++++++++++------ + src/cairo_pattern.c | 119 ++++++++++++++++++++++++++++++------ + test/Makefile.am | 3 + + test/linear-gradient-ref.png | Bin 0 -> 12724 bytes + test/linear-gradient.c | 141 +++++++++++++++++++++++++++++++++++++++++++ + test/linear_gradient-ref.png | Bin 0 -> 12724 bytes + test/linear_gradient.c | 141 +++++++++++++++++++++++++++++++++++++++++++ + 8 files changed, 497 insertions(+), 38 deletions(-) + +commit 023d91123229dfb7db1c9e28b3981037660cc5a6 +Author: David Reveman +Date: Sun Mar 6 05:16:19 2005 +0000 + + Fix gradient acceleration in glitz backend + + ChangeLog | 9 ++++++ + src/cairo-glitz-surface.c | 76 ++++++++++++++++++++++++++++++----------------- + src/cairo_glitz_surface.c | 76 ++++++++++++++++++++++++++++++----------------- + 3 files changed, 107 insertions(+), 54 deletions(-) + +commit 50b483042dc8b02fdcf8cc04bccf24b68dab76d6 +Author: Owen Taylor +Date: Fri Mar 4 10:43:24 2005 +0000 + + src/cairo_win32_font.c src/cairo_win32_surface.c: Update for recent backend interface changes. + Reenable win32 backend by default. + + ChangeLog | 7 +++++ + src/cairo-win32-font.c | 17 ++++++++---- + src/cairo-win32-surface.c | 67 ++++++++++++++--------------------------------- + src/cairo_win32_font.c | 17 ++++++++---- + src/cairo_win32_surface.c | 67 ++++++++++++++--------------------------------- + 5 files changed, 71 insertions(+), 104 deletions(-) + +commit f6dcd38c8cb65bfdc621efb9fad06b7c06704e69 +Author: Carl Worth +Date: Fri Mar 4 10:07:22 2005 +0000 + + Fix accidental reversal of condition in previous patch. + + ChangeLog | 6 ++++++ + src/cairo-glitz-surface.c | 2 +- + src/cairo_glitz_surface.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 66af5f9f3600b514801958d0c796a815ea4e31ee +Author: Owen Taylor +Date: Fri Mar 4 09:41:34 2005 +0000 + + src/cairoint.h src/cairo_pattern.c src/cairo_glitz_surface.c: Add _cairo_pattern_is_opaque, use it rather than pattern->alpha == 1.0. + + ChangeLog | 6 ++++++ + configure.in | 2 +- + src/cairo-glitz-surface.c | 28 ++++++++++++++++++++----- + src/cairo-pattern.c | 53 +++++++++++++++++++++++++++++++++++++++++++---- + src/cairo-win32-surface.c | 4 ++-- + src/cairo_glitz_surface.c | 28 ++++++++++++++++++++----- + src/cairo_pattern.c | 53 +++++++++++++++++++++++++++++++++++++++++++---- + src/cairo_win32_surface.c | 4 ++-- + src/cairoint.h | 3 +++ + 9 files changed, 158 insertions(+), 23 deletions(-) + +commit c4443533e8e8fc3bbac6bfe935d1c8bb7421a710 +Author: Carl Worth +Date: Fri Mar 4 07:53:09 2005 +0000 + + Intersect bounds of trapezoids with the bounds of the destination surface before creating an intermediate surface. + + pixman/ChangeLog | 6 ++++++ + pixman/src/ictrap.c | 28 +++++++++++++++++++++++++--- + 2 files changed, 31 insertions(+), 3 deletions(-) + +commit b1545db06697221af7078ab09894d378893e1162 +Author: Carl Worth +Date: Fri Mar 4 07:31:49 2005 +0000 + + Add comment from xserver's mitrap.c. + + pixman/ChangeLog | 5 +++++ + pixman/src/ictrap.c | 7 +++++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit 4552898cfb11f7bc5161a713217dd964956437b7 +Author: David Reveman +Date: Thu Mar 3 20:16:23 2005 +0000 + + Update xcb backend + + ChangeLog | 4 + + configure.in | 4 +- + src/cairo-xcb-surface.c | 457 +++++++++++++++++++++++++++++++++--------------- + src/cairo_xcb_surface.c | 457 +++++++++++++++++++++++++++++++++--------------- + 4 files changed, 630 insertions(+), 292 deletions(-) + +commit f54f78525a1d4fcf535cf7c7a47c40073889081e +Author: David Reveman +Date: Thu Mar 3 19:09:24 2005 +0000 + + Fixed variable assignments in configure.in + + ChangeLog | 2 ++ + configure.in | 4 ++-- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 378fb57051e6b1246c975a58f5fafa426935d6e1 +Author: David Reveman +Date: Thu Mar 3 18:55:28 2005 +0000 + + Add more mask surface acceleration to glitz backend + + ChangeLog | 4 ++ + src/cairo-glitz-surface.c | 101 +++++++++++++++++++++++++++++++++++++++++----- + src/cairo_glitz_surface.c | 101 +++++++++++++++++++++++++++++++++++++++++----- + 3 files changed, 188 insertions(+), 18 deletions(-) + +commit 01b87c7d99c157b560733edd9431a01a59752f6c +Author: David Reveman +Date: Thu Mar 3 18:46:49 2005 +0000 + + Add overall alpha acceleration using mask surface + + ChangeLog | 3 +++ + src/cairo-pattern.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- + src/cairo_pattern.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- + 3 files changed, 91 insertions(+), 8 deletions(-) + +commit 50b5344d7d8ff16c06b89deefe9de520848de706 +Author: David Reveman +Date: Thu Mar 3 18:39:06 2005 +0000 + + Pass mask to composite operation as pattern + + ChangeLog | 16 ++++++ + src/cairo-ft-font.c | 7 ++- + src/cairo-glitz-surface.c | 126 ++++++++++++++++++++++++++++++++-------------- + src/cairo-gstate.c | 21 ++++++-- + src/cairo-image-surface.c | 82 +++++++++++++++++------------- + src/cairo-pattern.c | 44 ++++++++++++++++ + src/cairo-pdf-surface.c | 11 ++-- + src/cairo-ps-surface.c | 2 +- + src/cairo-surface.c | 14 +++--- + src/cairo-xlib-surface.c | 88 +++++++++++++++++--------------- + src/cairo_ft_font.c | 7 ++- + src/cairo_glitz_surface.c | 126 ++++++++++++++++++++++++++++++++-------------- + src/cairo_gstate.c | 21 ++++++-- + src/cairo_image_surface.c | 82 +++++++++++++++++------------- + src/cairo_pattern.c | 44 ++++++++++++++++ + src/cairo_pdf_surface.c | 11 ++-- + src/cairo_png_surface.c | 4 +- + src/cairo_ps_surface.c | 2 +- + src/cairo_surface.c | 14 +++--- + src/cairo_xlib_surface.c | 88 +++++++++++++++++--------------- + src/cairoint.h | 21 ++++++-- + 21 files changed, 564 insertions(+), 267 deletions(-) + +commit a97f4cce5e13cfa2dc3b843b3b37cb14cb16cf65 +Author: David Reveman +Date: Thu Mar 3 18:20:28 2005 +0000 + + Removed surface backend functions set_matrix, set_filter and set_repeat + + ChangeLog | 13 ++++++++++++ + src/cairo-glitz-surface.c | 24 +++------------------- + src/cairo-image-surface.c | 26 ------------------------ + src/cairo-pdf-surface.c | 24 ---------------------- + src/cairo-ps-surface.c | 30 ---------------------------- + src/cairo-surface.c | 8 +++----- + src/cairo-xlib-surface.c | 51 +++++++++++++++++++++++++++-------------------- + src/cairo_glitz_surface.c | 24 +++------------------- + src/cairo_image_surface.c | 26 ------------------------ + src/cairo_pdf_surface.c | 24 ---------------------- + src/cairo_png_surface.c | 30 ---------------------------- + src/cairo_ps_surface.c | 30 ---------------------------- + src/cairo_surface.c | 8 +++----- + src/cairo_xlib_surface.c | 51 +++++++++++++++++++++++++++-------------------- + src/cairoint.h | 12 ----------- + 15 files changed, 83 insertions(+), 298 deletions(-) + +commit 36b69fc7f4ff090f5d5eb6e9db4c13cbf25971a6 +Author: David Reveman +Date: Thu Mar 3 18:04:51 2005 +0000 + + Major update to glitz backend + + ChangeLog | 5 + + configure.in | 2 +- + src/cairo-glitz-surface.c | 1097 ++++++++++++++++++++++++++------------------- + src/cairo_glitz_surface.c | 1097 ++++++++++++++++++++++++++------------------- + 4 files changed, 1278 insertions(+), 923 deletions(-) + +commit 6c915293119afefd0701cd6719917d2990f6a3e0 +Author: David Reveman +Date: Thu Mar 3 18:02:23 2005 +0000 + + Add pixman_add_trapezoids + + pixman/ChangeLog | 5 +++++ + pixman/src/ictrap.c | 18 +++++++++++++++++- + pixman/src/pixman.h | 9 ++++++++- + 3 files changed, 30 insertions(+), 2 deletions(-) + +commit 019d381b4076a5716cae3708f0109d0815d7d6ef +Author: David Reveman +Date: Thu Mar 3 17:40:04 2005 +0000 + + Change to cairo_surface_t like structure of of cairo_pattern_t + + ChangeLog | 29 ++ + configure.in | 4 +- + src/cairo-gstate.c | 89 +++-- + src/cairo-image-surface.c | 149 ++++--- + src/cairo-pattern.c | 971 +++++++++++++++++++++++++++------------------- + src/cairo-pdf-surface.c | 92 ++--- + src/cairo-ps-surface.c | 6 +- + src/cairo-xlib-surface.c | 201 +++++----- + src/cairo_gstate.c | 89 +++-- + src/cairo_image_surface.c | 149 ++++--- + src/cairo_pattern.c | 971 +++++++++++++++++++++++++++------------------- + src/cairo_pdf_surface.c | 92 ++--- + src/cairo_ps_surface.c | 6 +- + src/cairo_xlib_surface.c | 201 +++++----- + src/cairoint.h | 174 +++++---- + 15 files changed, 1867 insertions(+), 1356 deletions(-) + +commit 849a7ca8ef2abd94ccf90ec6cb732e9c742777f1 +Author: Carl Worth +Date: Thu Mar 3 14:27:31 2005 +0000 + + Port from render/mipict.c. + Merge in optimization from render/mitrap.c for op==ADD and solid alpha src. + + pixman/ChangeLog | 7 +++++++ + pixman/src/icimage.c | 31 +++++++++++++++++++++++++++++++ + pixman/src/icimage.h | 3 +++ + pixman/src/ictrap.c | 9 ++++++++- + 4 files changed, 49 insertions(+), 1 deletion(-) + +commit e533d2faebccc9fbb02aa681cb93df26e4284929 +Author: Carl Worth +Date: Thu Mar 3 13:54:40 2005 +0000 + + Add a few more things that might be helpful when moving more files over from xserver. + + pixman/ChangeLog | 6 ++++++ + pixman/src/pixman-xserver-compat.h | 13 +++++++++---- + 2 files changed, 15 insertions(+), 4 deletions(-) + +commit f482f2be49080921ef49c31def57933f72e3b646 +Author: Carl Worth +Date: Thu Mar 3 13:52:49 2005 +0000 + + Move definitions of MIN and MAX macros from ictrap.c to icint.h. + + pixman/ChangeLog | 6 ++++++ + pixman/src/icint.h | 3 +++ + pixman/src/ictrap.c | 5 +---- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit 76d89e825763bffc3114d6e8a269eb5aea023267 +Author: Carl Worth +Date: Thu Mar 3 13:47:04 2005 +0000 + + Remove dead "if (!format)" code which also makes things more in synch with the server's mitrap.c. + + pixman/ChangeLog | 6 ++++ + pixman/src/ictrap.c | 84 ++++++++++++++++++++--------------------------------- + 2 files changed, 38 insertions(+), 52 deletions(-) + +commit 15bb06aaa07546fd6b853671012d28c1fa942f3f +Author: Carl Worth +Date: Thu Mar 3 13:36:30 2005 +0000 + + Restore original copyright and license which must have been inadvertently changed. + + pixman/ChangeLog | 5 +++++ + pixman/src/ictrap.c | 40 +++++++++++++++++++--------------------- + 2 files changed, 24 insertions(+), 21 deletions(-) + +commit b01798ea13327ea9048bdbffb4b98b172b8bbe3f +Author: Carl Worth +Date: Wed Mar 2 07:44:53 2005 +0000 + + Fix comment to clarify that libpixman regards the xserver repository as its canonical upstream for some files. + + pixman/ChangeLog | 4 ++++ + pixman/src/pixman-xserver-compat.h | 21 +++++++++++++-------- + 2 files changed, 17 insertions(+), 8 deletions(-) + +commit 6d50e485fa1d95f27608bb33608e6d696145c9bb +Author: Carl Worth +Date: Wed Mar 2 07:43:33 2005 +0000 + + Convert file encodings from ISO-8859 to UTF-8. + + pixman/ChangeLog | 9 +++++++++ + pixman/src/ic.c | 2 +- + pixman/src/icblt.c | 2 +- + pixman/src/icbltone.c | 2 +- + pixman/src/iccolor.c | 2 +- + pixman/src/iccompose.c | 2 +- + pixman/src/icformat.c | 2 +- + pixman/src/icimage.c | 2 +- + pixman/src/icimage.h | 2 +- + pixman/src/icint.h | 2 +- + pixman/src/icpixels.c | 4 ++-- + pixman/src/icrect.c | 2 +- + pixman/src/icrop.h | 2 +- + pixman/src/icstipple.c | 2 +- + pixman/src/ictransform.c | 2 +- + pixman/src/ictrap.c | 2 +- + pixman/src/ictri.c | 2 +- + pixman/src/icutil.c | 2 +- + pixman/src/pixman.h | 4 ++-- + pixman/src/slim_internal.h | 2 +- + 20 files changed, 30 insertions(+), 21 deletions(-) + +commit 2dcb6cd345a5221ddb7356c0a2743a49183dea6d +Author: Carl Worth +Date: Tue Mar 1 15:04:48 2005 +0000 + + Note that cairo_output_stream_t patch has been reviewed. + + ChangeLog | 4 ++++ + TODO | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 06bed80b9ed9b6941663855fdde178278becb376 +Author: Carl Worth +Date: Tue Mar 1 14:50:57 2005 +0000 + + Fix uninitialized value for status, (reported by Manish Singh). + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 4 ++-- + src/cairo_gstate.c | 4 ++-- + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit 85db25b8a1eba2ce6dd54faa7f496bbb08c1b02f +Author: Kristian Høgsberg +Date: Sun Feb 27 11:21:39 2005 +0000 + + Fix this function again. Problem with signed/unsigned types reported by Jeff Muizelaar . + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 17 ++++++++++------- + src/cairo_gstate.c | 17 ++++++++++------- + 3 files changed, 26 insertions(+), 14 deletions(-) + +commit db2eb5d4cb442d8a8bdd705c18c69bf2e4d9ee39 +Author: Kristian Høgsberg +Date: Sun Feb 27 11:02:48 2005 +0000 + + Remove newline in comment which was confusing gtk-doc. + Document these functions. + + ChangeLog | 8 ++++++++ + src/cairo-image-surface.c | 36 ++++++++++++++++++++++++++++++++++++ + src/cairo.h | 1 - + src/cairo_image_surface.c | 36 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 80 insertions(+), 1 deletion(-) + +commit cac994f1f842622e056e51637225fc6e2474866e +Author: Carl Worth +Date: Fri Feb 25 14:06:19 2005 +0000 + + Note that "user data" and "setters and getters" patches have been reviewed. Remove a few more TODO notes: cleanup cairo_snippets: DONE cairo_surface_finish: Now in API Shakeup snapping code: Decided against this + + ChangeLog | 8 ++++++++ + TODO | 13 ++----------- + 2 files changed, 10 insertions(+), 11 deletions(-) + +commit f343b0b44a8411a133d2a94ead7faa2e58648f97 +Author: Carl Worth +Date: Fri Feb 25 13:31:00 2005 +0000 + + From David Reveman: + Rewrite to use cairo_bool_t for legibility. + + ChangeLog | 7 +++++++ + src/cairo-matrix.c | 6 +++--- + src/cairo_matrix.c | 6 +++--- + src/cairoint.h | 2 +- + 4 files changed, 14 insertions(+), 7 deletions(-) + +commit ebec6df7a77f1c778b69e36d562423a3ffd6edfb +Author: Carl Worth +Date: Fri Feb 25 13:03:42 2005 +0000 + + From David Reveman: + Simplify code to eliminate a goto. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 26 ++++++++++---------------- + src/cairo_gstate.c | 26 ++++++++++---------------- + 3 files changed, 27 insertions(+), 32 deletions(-) + +commit 03e7e13cb1412c29ebd1f1c8b46db3849e089557 +Author: Carl Worth +Date: Fri Feb 25 12:58:49 2005 +0000 + + From David Reveman: + Clean up the mess that was the misnamed _cairo_gstate_create_pattern. + + ChangeLog | 11 +++++++++++ + src/cairo-gstate.c | 55 +++++++++++++++++------------------------------------- + src/cairo_gstate.c | 55 +++++++++++++++++------------------------------------- + 3 files changed, 45 insertions(+), 76 deletions(-) + +commit 1a043bbf26a02d240f24f0aca1bf848e7e203f1d +Author: Carl Worth +Date: Fri Feb 25 12:52:47 2005 +0000 + + Don't put an off-by-one n_stops into cairo_shader_op_t. (_cairo_shader_op_find_color_stops): Put search for two color stops containing a given offset into its own function. Handle the case of before first and after last stop by returning the nearest stop twice. (_cairo_pattern_calc_color_at_pixel): Handle case of no color stops by returning a transparent pixel. + + ChangeLog | 11 +++++++ + src/cairo-pattern.c | 91 +++++++++++++++++++++++++++++++++++------------------ + src/cairo_pattern.c | 91 +++++++++++++++++++++++++++++++++++------------------ + src/cairoint.h | 2 -- + 4 files changed, 131 insertions(+), 64 deletions(-) + +commit 8ad3ab22e447e5fc2e93333b5958c37ef63fb392 +Author: Owen Taylor +Date: Thu Feb 24 15:48:07 2005 +0000 + + Remove a left-over debug printf. + + ChangeLog | 4 ++++ + src/cairo-win32-surface.c | 3 --- + src/cairo_win32_surface.c | 3 --- + 3 files changed, 4 insertions(+), 6 deletions(-) + +commit aca0708fc828f75dd31142cdc20e5650c706d37e +Author: Carl Worth +Date: Thu Feb 24 14:06:03 2005 +0000 + + Fix memory leak when realloc fails due to out-of-memory. + + ChangeLog | 5 +++++ + src/cairo-pattern.c | 12 ++++++------ + src/cairo_pattern.c | 12 ++++++------ + 3 files changed, 17 insertions(+), 12 deletions(-) + +commit a64b7e51eeefb61676c8579cc870fec9e2463529 +Author: Owen Taylor +Date: Thu Feb 24 12:51:33 2005 +0000 + + Instead of counting on ordering deletion to work (apparently it didn't on older Windows), save the initial bitmap created with the DC and reselect that into the DC. (Based on a patch by Hans Breuer) + + ChangeLog | 10 +++++- + src/cairo-win32-private.h | 10 ++++++ + src/cairo-win32-surface.c | 91 ++++++++++++++++++++++++++--------------------- + src/cairo_win32_surface.c | 91 ++++++++++++++++++++++++++--------------------- + 4 files changed, 119 insertions(+), 83 deletions(-) + +commit de7d69aff9784cb19289d6709e18fb890ed39ecb +Author: Carl Worth +Date: Thu Feb 24 12:30:23 2005 +0000 + + Add pixman_rotate to ignore list. + + ChangeLog | 4 ++++ + test/.cvsignore | 5 +++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 04fefd1b281e3fcba0b81cee2acf68f8c97381c8 +Author: Carl Worth +Date: Thu Feb 24 12:28:51 2005 +0000 + + Fixes from David Reveman with minor cleanups by Carl Worth: + Handle new failure possibility of _cairo_gstate_init. (_cairo_gstate_init): Handle possible failure of _cairo_pattern_create_solid. (_cairo_gstate_set_pattern): Reference new pattern before destroying existing pattern to handle the case where they are the same. (_cairo_gstate_set_rgb_color): Handle possible failure of _cairo_pattern_create_solid. + + ChangeLog | 14 ++++++++++++++ + src/cairo-gstate.c | 24 ++++++++++++++++++------ + src/cairo_gstate.c | 24 ++++++++++++++++++------ + src/cairoint.h | 2 +- + 4 files changed, 51 insertions(+), 13 deletions(-) + +commit 12d19423f608916753596cf736c89274d381964d +Author: Carl Worth +Date: Thu Feb 24 10:09:44 2005 +0000 + + Fix typo (pointed out by Kristian Høgsberg). + + ChangeLog | 4 ++++ + src/cairo.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 724cf1ce71f55783ec3d759804aaba4b4a88bd7e +Author: Owen Taylor +Date: Thu Feb 24 08:20:14 2005 +0000 + + When we created a DC/bitmap pair, delete the DC before the Bitmap so that the Bitmap will be released from the DC and can be destroyed. (Reported by Hans Breuer) + configure.in cairo.pc.in: Only require fontconfig if building FreeType font backend. + Fix output when reporting Win32 font backend. + + ChangeLog | 12 ++++++++++++ + cairo.pc.in | 2 +- + configure.in | 6 ++++-- + src/cairo-win32-surface.c | 10 ++++++---- + src/cairo_win32_surface.c | 10 ++++++---- + 5 files changed, 29 insertions(+), 11 deletions(-) + +commit b210c00c30c5e191be230d9675bb00ce5cf57393 +Author: Carl Worth +Date: Thu Feb 24 08:07:39 2005 +0000 + + Remove many TODO items that have now been absorbed by the API shakeup. Remove comparison with PostScript as there's nothing interesting there left unimplemented, (and cairo is already establishing its own conventions in naming and behavior that deviate from PostScript). + + ChangeLog | 6 +++ + TODO | 167 -------------------------------------------------------------- + 2 files changed, 6 insertions(+), 167 deletions(-) + +commit 77826a97565d48073b5725ca60b25b66bed73ab5 +Author: Carl Worth +Date: Thu Feb 24 07:39:20 2005 +0000 + + Fix typo (pointed out by Mike Emmel) + + ChangeLog | 4 ++++ + src/cairoint.h | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 748115a88d9b058837e7a2bc690e2c98fc2253bc +Author: Carl Worth +Date: Wed Feb 23 14:56:55 2005 +0000 + + Add entries from API Shakeup. + + ChangeLog | 4 ++++ + TODO | 27 +++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+) + +commit dcfb0d8a2b9eeffd52ca42635c6cf12a0705bd66 +Author: Carl Worth +Date: Tue Feb 22 11:35:03 2005 +0000 + + Switch from broken cworth@isi.edu address to canonical cworth@cworth.org address. + + ChangeLog | 37 +++++++++++++++++++++++++++++++++++++ + README | 2 +- + src/cairo-color.c | 2 +- + src/cairo-features.h.in | 2 +- + src/cairo-fixed.c | 2 +- + src/cairo-font.c | 2 +- + src/cairo-glitz.h | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-hull.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fill.c | 2 +- + src/cairo-path-stroke.c | 2 +- + src/cairo-path.c | 2 +- + src/cairo-pdf.h | 2 +- + src/cairo-pen.c | 2 +- + src/cairo-png.h | 2 +- + src/cairo-polygon.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-ps.h | 2 +- + src/cairo-quartz.h | 2 +- + src/cairo-slope.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-traps.c | 2 +- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xcb.h | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo-xlib.h | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairo_color.c | 2 +- + src/cairo_fixed.c | 2 +- + src/cairo_font.c | 2 +- + src/cairo_gstate.c | 2 +- + src/cairo_hull.c | 2 +- + src/cairo_image_surface.c | 2 +- + src/cairo_matrix.c | 2 +- + src/cairo_path.c | 2 +- + src/cairo_path_bounds.c | 2 +- + src/cairo_path_fill.c | 2 +- + src/cairo_path_stroke.c | 2 +- + src/cairo_pen.c | 2 +- + src/cairo_png_surface.c | 2 +- + src/cairo_polygon.c | 2 +- + src/cairo_ps_surface.c | 2 +- + src/cairo_slope.c | 2 +- + src/cairo_spline.c | 2 +- + src/cairo_surface.c | 2 +- + src/cairo_traps.c | 2 +- + src/cairo_xcb_surface.c | 2 +- + src/cairo_xlib_surface.c | 2 +- + src/cairoint.h | 4 ++-- + 54 files changed, 91 insertions(+), 54 deletions(-) + +commit 604e333be2567e8877bec71d46107897717a1be6 +Author: Carl Worth +Date: Tue Feb 22 11:32:02 2005 +0000 + + Convert to utf-8 encoding. + + ChangeLog | 6 ++++++ + src/cairo-atsui-font.c | 2 +- + src/cairo-atsui.h | 2 +- + src/cairo_atsui_font.c | 2 +- + test/write-png.c | 4 ++-- + test/write_png.c | 4 ++-- + 6 files changed, 13 insertions(+), 7 deletions(-) + +commit 6b537f24660f180ba7acd6865ca11170711c3eff +Author: Carl Worth +Date: Tue Feb 22 10:43:26 2005 +0000 + + Temporarily disable XCB backend by default. + + ChangeLog | 4 ++++ + configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 272df99aabee9d678c98e5f31f2b9f0ede7778e3 +Author: Carl Worth +Date: Mon Feb 21 13:29:22 2005 +0000 + + Add only-just-better-than-ASCII-art diagram showing all macros used in locating sub-pixel sample rows/columns. + Add missing protective parentheses around macro parameter usage. + + pixman/ChangeLog | 8 +++++++ + pixman/src/renderedge.h | 61 ++++++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 58 insertions(+), 11 deletions(-) + +commit 6d70b286f5ff86a3855636de7165b30a5a45968c +Author: Carl Worth +Date: Mon Feb 21 12:57:27 2005 +0000 + + Move definition of __inline for non-gcc from ic.c to icint.h so it applies to more code in the implementation. + + pixman/ChangeLog | 6 ++++++ + pixman/src/ic.c | 5 ----- + pixman/src/icint.h | 6 ++++-- + 3 files changed, 10 insertions(+), 7 deletions(-) + +commit 30a02c8e172a9caece7526fbe87b060fc74e5041 +Author: Carl Worth +Date: Mon Feb 21 08:22:47 2005 +0000 + + Revert accidental commit. + + ChangeLog | 5 +++++ + src/cairo-pattern.c | 6 ++---- + src/cairo.h | 10 +--------- + src/cairo_pattern.c | 6 ++---- + 4 files changed, 10 insertions(+), 17 deletions(-) + +commit c8a98b109a5f7b02455aaf717066757a13652eb8 +Author: Carl Worth +Date: Mon Feb 21 08:17:42 2005 +0000 + + Fix y offset to use dst_y instead of dst_x, (caught by David Reveman). + + ChangeLog | 5 +++++ + src/cairo-pattern.c | 6 ++++-- + src/cairo-surface.c | 2 +- + src/cairo.h | 11 ++++++++++- + src/cairo_pattern.c | 6 ++++-- + src/cairo_surface.c | 2 +- + 6 files changed, 25 insertions(+), 7 deletions(-) + +commit 81fd7e53e3e053f8f3fdc9a528cce9e01c4e5c68 +Author: Owen Taylor +Date: Sun Feb 20 18:19:10 2005 +0000 + + Fix line endings (reported by Hans Breuer) + + ChangeLog | 5 ++ + src/cairo-win32.h | 142 +++++++++++++++++++++++++++--------------------------- + 2 files changed, 76 insertions(+), 71 deletions(-) + +commit d106bb2f3cbd5c498b6964c86e5bca4cfa74936c +Author: Kristian Høgsberg +Date: Wed Feb 16 09:34:47 2005 +0000 + + Patches from Mike Owens : + Free rows if we fail early in this function. + Clean up path if we run out of memory. + + ChangeLog | 10 ++++++++++ + src/cairo-path.c | 2 ++ + src/cairo_path.c | 2 ++ + src/cairo_png_surface.c | 18 ++++++++++-------- + 4 files changed, 24 insertions(+), 8 deletions(-) + +commit 8c8ced257379bdca4c37b312cb353e4f592f8cd2 +Author: Carl Worth +Date: Tue Feb 15 15:07:25 2005 +0000 + + Added testsvg script + + test/testsvg | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 51 insertions(+) + +commit 9597c0b791d68d258618773996da67cf8f07113f +Author: Kristian Høgsberg +Date: Sun Feb 13 20:36:28 2005 +0000 + + Initialize array element size correctly. + + ChangeLog | 6 ++++++ + src/cairo-pdf-surface.c | 2 +- + src/cairo_pdf_surface.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 0502a5a63c3feea954a2d45441d56b7546a50554 +Author: Kristian Høgsberg +Date: Sun Feb 13 12:41:42 2005 +0000 + + Patches from Owen Taylor: + Emit text as octal escapes, to avoid problems with \, \r, ), etc. (_cairo_pdf_document_write_fonts): Change /Flags to be 4 (symbolic), not 32 (non-symbolic), otherwise acroread gets confuse. (cairo_pdf_ft_font_write_cmap_table): Use a 1,0 cmap subtable, not a 0,0, to conform to the PDF spec. + + ChangeLog | 12 ++++++++++++ + src/cairo-pdf-surface.c | 8 ++++---- + src/cairo_pdf_surface.c | 8 ++++---- + 3 files changed, 20 insertions(+), 8 deletions(-) + +commit 2cd01deb4d3ea3a722ef4d10839eef8577b81e5c +Author: Carl Worth +Date: Sun Feb 13 11:57:52 2005 +0000 + + Use LC_NUMERIC=C so that decimal separator works in version checks. + + ChangeLog | 5 +++++ + autogen.sh | 1 + + 2 files changed, 6 insertions(+) + +commit d4ae84f39764dc2ced9d6807dbb5fe7f23c6eebe +Author: Owen Taylor +Date: Sat Feb 12 18:23:04 2005 +0000 + + Fix x2/x1 typo. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 2 +- + src/cairo_gstate.c | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit f3f63f39245bade5d70d546bf8acfe1bd0a6f7f8 +Author: Carl Worth +Date: Sat Feb 12 13:01:39 2005 +0000 + + Return all-zero extents if string is NULL. + + ChangeLog | 5 +++++ + src/cairo.c | 10 ++++++++++ + 2 files changed, 15 insertions(+) + +commit b33f37ff040dbc3c7e7b9dcffdd1cccca1a11b20 +Author: Kristian Høgsberg +Date: Sat Feb 12 12:59:53 2005 +0000 + + Make clipping fast path fast. When we have a clipping region set, intersect it against the drawing extents to determine the bounding box for the visible drawing. + + ChangeLog | 8 ++++++++ + src/cairo-gstate.c | 34 ++++++++++++++++++++++++++++++++++ + src/cairo.c | 2 +- + src/cairo_gstate.c | 34 ++++++++++++++++++++++++++++++++++ + 4 files changed, 77 insertions(+), 1 deletion(-) + +commit 063ba1f51df750cc3d9e340bd355cc1cc41f88df +Author: Carl Worth +Date: Thu Feb 10 07:46:46 2005 +0000 + + Add bug for cairo_show_surface under non-default CTM. + + AUTHORS | 2 +- + BUGS | 16 ++++++++++++++++ + ChangeLog | 4 ++++ + 3 files changed, 21 insertions(+), 1 deletion(-) + +commit 0c07ddf729f0b4d2625dec90fbec6321f4908424 +Author: Kristian Høgsberg +Date: Mon Feb 7 10:15:46 2005 +0000 + + Argh, committed conflict marker in ChangeLog - fixed. + + ChangeLog | 1 - + 1 file changed, 1 deletion(-) + +commit 7296349eaa23f2e697e5553d7a1fd0b818aad47f +Author: Kristian Høgsberg +Date: Mon Feb 7 09:38:43 2005 +0000 + + New test case which exposes off-by-one rotation error in pixman. + + ChangeLog | 6 ++++ + test/Makefile.am | 7 ++-- + test/pixman-rotate-ref.png | Bin 0 -> 260 bytes + test/pixman-rotate.c | 78 +++++++++++++++++++++++++++++++++++++++++++++ + test/pixman_rotate-ref.png | Bin 0 -> 260 bytes + test/pixman_rotate.c | 78 +++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 167 insertions(+), 2 deletions(-) + +commit 67ffc273eff916f9b1a2f4cc308683c0e4c0660a +Author: Owen Taylor +Date: Sun Feb 6 15:07:17 2005 +0000 + + src/cairo_gstate.c src/cairo.c: Allow cairo_set_font (cr, NULL) to unset the current font and return the cairo_t to the the "use the font from cairo_select_font() state". + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 11 +++++++---- + src/cairo.c | 2 +- + src/cairo_gstate.c | 11 +++++++---- + 4 files changed, 21 insertions(+), 9 deletions(-) + +commit b93f42fae1080590fbf7050ba810155d37664843 +Author: Owen Taylor +Date: Sun Feb 6 12:00:28 2005 +0000 + + Return the right status. (Reported by Hans Breuer.) + + ChangeLog | 5 +++++ + src/cairo-win32-font.c | 2 +- + src/cairo_win32_font.c | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit 991ac7bacc758698052ea4ac6ada449c5cf6ab45 +Author: Owen Taylor +Date: Sun Feb 6 11:51:07 2005 +0000 + + Add AC_PREREQ(2.54) to help the Debian auto-guess-which-configure-version hack. + + pixman/ChangeLog | 5 +++++ + pixman/configure.in | 2 ++ + 2 files changed, 7 insertions(+) + +commit 092c5ca5583512c9689397f355d3d0b7a09c882e +Author: Owen Taylor +Date: Sat Feb 5 21:42:47 2005 +0000 + + Free glyph_indices, not glyphs. (Reported by Hans Breuer.) + + ChangeLog | 5 +++++ + src/cairo-win32-font.c | 4 ++-- + src/cairo_win32_font.c | 4 ++-- + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit eb01786729b3d56f47ddf593fd5cc826d5c75064 +Author: Carl Worth +Date: Sat Feb 5 17:17:19 2005 +0000 + + Add message stating why glitz backend is disabled. + + ChangeLog | 4 ++++ + configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit b0ee983a7def6752d5bff7481c4af487db757b36 +Author: Owen Taylor +Date: Sat Feb 5 17:01:29 2005 +0000 + + Don't free *glyphs when succeeding! (Reported by Øyvind KolÃ¥s) + Temporarily disable glitz by default. + + ChangeLog | 7 +++++++ + configure.in | 2 +- + src/cairo-ft-font.c | 2 -- + src/cairo_ft_font.c | 2 -- + 4 files changed, 8 insertions(+), 5 deletions(-) + +commit 5707a69bfc9ce5525b2177f68c4e810c84b2f73f +Author: Carl Worth +Date: Fri Feb 4 08:04:36 2005 +0000 + + Generate an error during make install if old cairo headers are found in includedir, (rather than includedir/cairo where the new ones are going). + + ChangeLog | 6 ++++++ + src/Makefile.am | 10 ++++++++++ + 2 files changed, 16 insertions(+) + +commit 56d84bb85677df147063f2bc8eef583a6bdd5cae +Author: Owen Taylor +Date: Thu Feb 3 15:24:35 2005 +0000 + + Fix missing cairo_ft_font_unlock_face(). + Fix problem when no entry could be found. + + ChangeLog | 8 +++++++ + src/cairo-cache.c | 2 +- + src/cairo-ft-font.c | 64 +++++++++++++++++++++++++++++++---------------------- + src/cairo-hash.c | 2 +- + src/cairo_cache.c | 2 +- + src/cairo_ft_font.c | 64 +++++++++++++++++++++++++++++++---------------------- + 6 files changed, 87 insertions(+), 55 deletions(-) + +commit 587dff8a7191e7e2e4c6778b58af5dc16e39bf3f +Author: Carl Worth +Date: Thu Feb 3 06:19:51 2005 +0000 + + Commit old change to ChangeLog that got missed before: + test/imagediff.c + Add new testsvg script and accompanying imagediff program, (for interim SVG-based test suites while we wait for the standard cairo test suite to mature). + Split buffer_diff out into its own file for the purpose of imagediff. + + ChangeLog | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 913e39b6eef18a59c21b07ff92e4c5d078335ded +Author: Owen Taylor +Date: Wed Feb 2 23:14:55 2005 +0000 + + src/cairo_font.c src/cairo.h doc/public/cairo-sections.txt: Add cairo_font_extents(). + src/cairo_win32_font.c src/cairo-win32.h doc/public/cairo-sections.txt: Rename cairo_font_create_for_logfont() into cairo_font_create_for_logfontw() to make clear what it takes. Don't add cairo_font_create_for_logfonta() for now. + + ChangeLog | 12 +++++++++++- + doc/public/cairo-sections.txt | 3 ++- + src/cairo-font.c | 44 +++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gstate.c | 26 ++++--------------------- + src/cairo-win32-font.c | 9 +++++---- + src/cairo-win32.h | 4 ++-- + src/cairo.h | 29 ++++++++++++++++------------ + src/cairo_font.c | 44 +++++++++++++++++++++++++++++++++++++++++++ + src/cairo_gstate.c | 26 ++++--------------------- + src/cairo_win32_font.c | 9 +++++---- + 10 files changed, 138 insertions(+), 68 deletions(-) + +commit 749a8c1e7b387845beeae9c10eac7c6b041eaff7 +Author: Owen Taylor +Date: Wed Feb 2 19:52:22 2005 +0000 + + src/cairo_win32_font.c doc/public/cairo-sections.txt doc/public/Makefile.am: Add windows functions to the docs. + + ChangeLog | 15 +++++++++++++++ + doc/public/Makefile.am | 3 ++- + doc/public/cairo-sections.txt | 11 +++++++++++ + src/cairo-win32-font.c | 2 +- + src/cairo_win32_font.c | 2 +- + 5 files changed, 30 insertions(+), 3 deletions(-) + +commit 72a44202343031762d761acce55d75881356448f +Author: Owen Taylor +Date: Wed Feb 2 18:57:40 2005 +0000 + + Add some functions to select the font into a device context with the intention to enable callers to use, e.g, Uniscribe. + Use 'hdc' not 'dc' for param/variable name. + Return immediately if height or width is 0. + + ChangeLog | 13 ++ + src/cairo-win32-font.c | 331 +++++++++++++++++++++++++++++++--------------- + src/cairo-win32-surface.c | 8 +- + src/cairo-win32.h | 10 ++ + src/cairo_win32_font.c | 331 +++++++++++++++++++++++++++++++--------------- + src/cairo_win32_surface.c | 8 +- + 6 files changed, 483 insertions(+), 218 deletions(-) + +commit 199c41dafee1559570c250d22a97dc1667d657f3 +Author: Owen Taylor +Date: Tue Feb 1 21:45:51 2005 +0000 + + Mostly-functioning Win32 font backend; no glyph paths yet. + Turn on building of the Win32 font backend. + src/cairo-win32-private.h src/Makefile.am: Private header for the Win32 backend. + src/cairo-win32-private.h src/cairo_win32_surface.c: Internally export _cairo_win32_print_gdi_error() for use in the font code. + src/cairo-win32-private.h src/cairo_win32_surface.c: Add _cairo_win32_surface_create_dib to create a DIB surface. + src/cairo-win32-private.h src/cairo_win32_surface.c: Add _cairo_surface_is_win32() + Check for vasnprintf. + Add a simple fixed-buffer size snprintf fallback in the absence of vasnprintf. + + ChangeLog | 25 ++ + configure.in | 4 +- + src/Makefile.am | 2 +- + src/cairo-win32-font.c | 806 ++++++++++++++++++++++++++++++---------------- + src/cairo-win32-private.h | 77 +++++ + src/cairo-win32-surface.c | 97 +++--- + src/cairo-win32.h | 2 +- + src/cairo_win32_font.c | 806 ++++++++++++++++++++++++++++++---------------- + src/cairo_win32_surface.c | 97 +++--- + test/cairo-test.c | 29 +- + test/cairo_test.c | 29 +- + 11 files changed, 1343 insertions(+), 631 deletions(-) + +commit 211d115f1835e1f724709a2b8b55ab203326fa9a +Author: Kristian Høgsberg +Date: Tue Feb 1 20:47:43 2005 +0000 + + Pretend we support compositing of solid color or gradient patterns to prevent image fallback. (emit_pattern): New function, code factored out from _cairo_pdf_surface_composite_trapezoids. (_cairo_pdf_surface_show_glyphs): Use emit_pattern here so we get pattern support for text. + Fix typo. + + ChangeLog | 12 ++++ + src/cairo-ft-font.c | 2 +- + src/cairo-pdf-surface.c | 155 +++++++++++++++++++++++++++--------------------- + src/cairo_ft_font.c | 2 +- + src/cairo_pdf_surface.c | 155 +++++++++++++++++++++++++++--------------------- + 5 files changed, 186 insertions(+), 140 deletions(-) + +commit 32ada34ddb85038f4098a301f57113b19e87ed14 +Author: Owen Taylor +Date: Tue Feb 1 16:29:17 2005 +0000 + + Commit earlier missed new file + src/cairo_unicode.c src/cairoint.h src/Makefile.am: Add _cairo_utf8_to_utf16(), _cairo_utf8_to_ucs4() based on code from GLib. + + src/cairo-unicode.c | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_unicode.c | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 680 insertions(+) + +commit 711d7965c87550901653bb8713b4604c441cb5c3 +Author: Owen Taylor +Date: Tue Feb 1 15:06:33 2005 +0000 + + src/cairo_unicode.c src/cairoint.h src/Makefile.am: Add _cairo_utf8_to_utf16(), _cairo_utf8_to_ucs4() based on code from GLib. + Add CAIRO_STATUS_INVALID_STRING + Use _cairo_utf8_to_ucs4(). + Add cairo_bool_t + Add TRUE/FALSE definitions. + src/cairo.[ch] src/cairoint.h src/cairo_gstate.c: switch cairo_in_stroke/cairo_in_fill and all the functions used to implement them over to cairo_bool_t. + + ChangeLog | 17 + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo.sgml | 7 + + doc/reference/.cvsignore | 20 -- + src/Makefile.am | 1 + + src/cairo-ft-font.c | 41 +-- + src/cairo-gstate.c | 4 +- + src/cairo-traps.c | 18 +- + src/cairo-win32-font.c | 787 ++++++++++++++++++++++++++++++++++-------- + src/cairo-win32-surface.c | 83 ++--- + src/cairo-win32.h | 20 +- + src/cairo.c | 4 +- + src/cairo.h | 23 +- + src/cairo_ft_font.c | 41 +-- + src/cairo_gstate.c | 4 +- + src/cairo_traps.c | 18 +- + src/cairo_win32_font.c | 787 ++++++++++++++++++++++++++++++++++-------- + src/cairo_win32_surface.c | 83 ++--- + src/cairoint.h | 26 +- + 19 files changed, 1469 insertions(+), 516 deletions(-) + +commit f4ccbb4615841c509e6ada7c12f469634732c4e4 +Author: Owen Taylor +Date: Mon Jan 31 16:41:06 2005 +0000 + + Forgotten commit: + src/cairo_gdip_font.cpp src/cairo_gdip_surface.cpp: Remove remnants of a GDI+ based backend. + + src/cairo_gdip_font.cpp | 665 ----------------------------------------- + src/cairo_gdip_surface.cpp | 727 --------------------------------------------- + 2 files changed, 1392 deletions(-) + +commit 86c8755e59a7f2000fc8a44811d06afae2d0dbb7 +Author: Owen Taylor +Date: Mon Jan 31 16:11:37 2005 +0000 + + configure.in src/cairo-features.h.in: Add a check for the Windows platform and --enable-win32. Also add some (currently always off) stubs for native Win32 fonts. + Make building the PDF backend conditional on having FreeType. + src/Makefile.am src/cairo_win32_surface.c src/cairo_win32_font.c src/cairo-win32.h: Add a Win32 backend using GDI and software fallbacks Font code is not yet there yet, but it works with the fontconfig backend. + src/cairo_gdip_font.cpp src/cairo_gdip_surface.cpp: Remove remnants of a GDI+ based backend. + Prefer platform-specific font backends to the fontconfig backend. + + ChangeLog | 20 + + configure.in | 117 ++++-- + src/Makefile.am | 12 + + src/cairo-features.h.in | 4 + + src/cairo-surface.c | 2 +- + src/cairo-win32-font.c | 380 +++++++++++++++++++ + src/cairo-win32-surface.c | 932 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-win32.h | 61 +++ + src/cairo_surface.c | 2 +- + src/cairo_win32_font.c | 380 +++++++++++++++++++ + src/cairo_win32_surface.c | 932 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 22 +- + 12 files changed, 2827 insertions(+), 37 deletions(-) + +commit 26148a1d15b710b8f2ce850f8704bf44b0c3d484 +Author: Owen Taylor +Date: Mon Jan 31 08:50:22 2005 +0000 + + src/cairoint.h src/cairo_image_surface.c src/cairo_pdf_surface.c src/cairo_png_surface.c src/cairo_surface.c src/cairo_xlib_surface.c: Replace the get_image()/set_image() backend operations with a more specific {acquire,release}_{source,dest}_image() and clone_similar(). + src/cairoint.h src/cairo_pattern.c: Replace _cairo_pattern_get_surface() with a _cairo_pattern_begin_draw()/_cairo_pattern_end_draw() pair. + Save the format for which an image is created so we can access it later. (Needed for the _cairo_xlib_surface_clone_similar()) + src/cairoint.h src/cairo_image_surface.c: Add _cairo_surface_is_image(). + Add CAIRO_OK(status) to check for CAIRO_STATUS_SUCCESS. + In the absence of of RENDER, make cairo_xlib_surface_create_similar() return an image surface. + Don't try to use RENDER to composite glyphs in the absence of the RENDER extension. + + ChangeLog | 31 ++++ + src/cairo-image-surface.c | 160 ++++++++++++------ + src/cairo-pattern.c | 358 +++++++++++++++++++++++++---------------- + src/cairo-pdf-surface.c | 79 +++++++-- + src/cairo-ps-surface.c | 59 +++++-- + src/cairo-surface.c | 402 ++++++++++++++++++++++++++++++++++++++++------ + src/cairo-xlib-surface.c | 332 +++++++++++++++++++++++++------------- + src/cairo_image_surface.c | 160 ++++++++++++------ + src/cairo_pattern.c | 358 +++++++++++++++++++++++++---------------- + src/cairo_pdf_surface.c | 79 +++++++-- + src/cairo_png_surface.c | 57 +++++-- + src/cairo_ps_surface.c | 59 +++++-- + src/cairo_surface.c | 402 ++++++++++++++++++++++++++++++++++++++++------ + src/cairo_xlib_surface.c | 332 +++++++++++++++++++++++++------------- + src/cairoint.h | 99 +++++++++--- + 15 files changed, 2182 insertions(+), 785 deletions(-) + +commit 608a52ff9390f98a8e5269e6362f4ad8d07ec2c5 +Author: Owen Taylor +Date: Sun Jan 30 11:37:48 2005 +0000 + + Update composite-over-white code to use a pattern, not a surface. (to match _cairo_surface_composite API change.) + + ChangeLog | 6 ++++++ + src/cairo-ps-surface.c | 23 ++++++----------------- + src/cairo_ps_surface.c | 23 ++++++----------------- + 3 files changed, 18 insertions(+), 34 deletions(-) + +commit dca785faafb4baf2a5626e5191b3c3739b0b42b7 +Author: Owen Taylor +Date: Sun Jan 30 11:28:14 2005 +0000 + + Fixes from David Reveman: + Don't save to surface part of the union when the pattern isn't a surface pattern. (_cairo_pattern_get_surface): Create the new surface at the width and height of the source. + Add cairo-ft-private.h + + ChangeLog | 12 ++++++++++++ + src/Makefile.am | 2 +- + src/cairo-pattern.c | 52 +++++++++++++++++++++++++--------------------------- + src/cairo_pattern.c | 52 +++++++++++++++++++++++++--------------------------- + 4 files changed, 63 insertions(+), 55 deletions(-) + +commit a24f2f909e29dd3ad1c7241a9d3f5c6580ac6a3e +Author: Kristian Høgsberg +Date: Fri Jan 28 12:27:23 2005 +0000 + + Update prototype to eliminate warning. + Remember to reference surfaces when copying patterns. + Don't call _gstate_create_pattern for internally created patterns. (_cairo_gstate_show_surface): Don't change the surface matrix here, it's done later when we set it up as a pattern. + Correct clip_twice-ref.png filename. + Add these. + Fix broken intersection code. + + ChangeLog | 22 +++++++++++++++++++++ + src/cairo-gstate.c | 51 +++++++++++-------------------------------------- + src/cairo-pattern.c | 4 ++++ + src/cairo_gstate.c | 51 +++++++++++-------------------------------------- + src/cairo_pattern.c | 4 ++++ + src/cairo_png_surface.c | 2 +- + src/cairoint.h | 3 +++ + test/Makefile.am | 2 +- + 8 files changed, 57 insertions(+), 82 deletions(-) + +commit 4c329eecb9d956c2553376d76308bdff032216a8 +Author: Kristian Høgsberg +Date: Thu Jan 27 21:14:04 2005 +0000 + + Make sure we always return a surface similar to dst in the gradient case. + + ChangeLog | 5 ++++- + src/cairo-pattern.c | 31 ++++++++++++++++++++++++------- + src/cairo_pattern.c | 31 ++++++++++++++++++++++++------- + src/cairoint.h | 9 --------- + 4 files changed, 52 insertions(+), 24 deletions(-) + +commit 79c8b29c3be5179f52db8a726f138137d63ae765 +Author: Kristian Høgsberg +Date: Thu Jan 27 19:57:31 2005 +0000 + + Fold _cairo_pattern_get_image into _cairo_pattern_get_surface and make sure we always return a surface of the same type as dest. + Use _cairo_pattern_get_surface instead of _cairo_pattern_get_image. + Remove use of _cairo_xlib_surface_clone_similar since _cairo_pattern_get_surface always gives us an xlib surface for the pattern. Clean up error handling code in _cairo_xlib_surface_show_glyphs. + Add missing cairo_surface_destroy and tidy up offset calculations as suggested by Owen. + Simplify code for computing the extents of clipping area, by introducing a couple of cairo_rectangle_t functions. + + ChangeLog | 20 ++++++++ + src/cairo-glitz-surface.c | 10 ++-- + src/cairo-image-surface.c | 31 +++++++----- + src/cairo-pattern.c | 102 ++++++++++++++------------------------ + src/cairo-xlib-surface.c | 122 ++++++++++++---------------------------------- + src/cairo_glitz_surface.c | 10 ++-- + src/cairo_image_surface.c | 31 +++++++----- + src/cairo_pattern.c | 102 ++++++++++++++------------------------ + src/cairo_xlib_surface.c | 122 ++++++++++++---------------------------------- + 9 files changed, 206 insertions(+), 344 deletions(-) + +commit 8e90ae2f6527e39fca55e5c3e1472e067cdfe159 +Author: Kristian Høgsberg +Date: Thu Jan 27 17:21:13 2005 +0000 + + Simplify code for computing the extents of clipping area, by introducing a couple of cairo_rectangle_t functions. + + ChangeLog | 8 ++ + src/cairo-gstate.c | 302 +++++++++++++++++++++-------------------------------- + src/cairo_gstate.c | 302 +++++++++++++++++++++-------------------------------- + src/cairoint.h | 5 +- + 4 files changed, 243 insertions(+), 374 deletions(-) + +commit e0de000336976ddd69243ae775cb40946b730c5b +Author: Owen Taylor +Date: Thu Jan 27 15:46:16 2005 +0000 + + src/cairo.[ch] src/cairo_font.c src/cairo_ft_font.c src/cairo_ps_surface.c src/cairo_xlib_surface.c: Move docs from docs/reference, with a fair bit of addition and rewriting. + Remove old-format docs. + Add a AC_PREREQ(2.54) (Jason Dorje Short) + + ChangeLog | 11 + + configure.in | 2 + + doc/public/tmpl/cairo-matrix.sgml | 2 +- + doc/reference/ChangeLog | 16 -- + doc/reference/README | 11 - + doc/reference/crossreference.rb | 30 --- + doc/reference/doc.xml | 223 --------------------- + doc/reference/xml/cairo_arc.xml | 40 ---- + doc/reference/xml/cairo_arc_negative.xml | 40 ---- + doc/reference/xml/cairo_clip.xml | 35 ---- + doc/reference/xml/cairo_close_path.xml | 35 ---- + doc/reference/xml/cairo_copy.xml | 54 ----- + doc/reference/xml/cairo_create.xml | 34 ---- + doc/reference/xml/cairo_current_alpha.xml | 35 ---- + doc/reference/xml/cairo_current_fill_rule.xml | 35 ---- + doc/reference/xml/cairo_current_font.xml | 37 ---- + doc/reference/xml/cairo_current_font_extents.xml | 40 ---- + doc/reference/xml/cairo_current_line_cap.xml | 35 ---- + doc/reference/xml/cairo_current_line_join.xml | 35 ---- + doc/reference/xml/cairo_current_line_width.xml | 35 ---- + doc/reference/xml/cairo_current_matrix.xml | 41 ---- + doc/reference/xml/cairo_current_miter_limit.xml | 35 ---- + doc/reference/xml/cairo_current_operator.xml | 35 ---- + doc/reference/xml/cairo_current_point.xml | 47 ----- + doc/reference/xml/cairo_current_rgb_color.xml | 53 ----- + doc/reference/xml/cairo_current_target_surface.xml | 34 ---- + doc/reference/xml/cairo_current_tolerance.xml | 35 ---- + doc/reference/xml/cairo_curve_to.xml | 70 ------- + doc/reference/xml/cairo_default_matrix.xml | 35 ---- + doc/reference/xml/cairo_destroy.xml | 38 ---- + doc/reference/xml/cairo_fill.xml | 35 ---- + doc/reference/xml/cairo_fill_rule_t.xml | 40 ---- + doc/reference/xml/cairo_font_glyph_extents.xml | 72 ------- + doc/reference/xml/cairo_font_t.xml | 25 --- + doc/reference/xml/cairo_format_t.xml | 52 ----- + doc/reference/xml/cairo_ft_font_create.xml | 59 ------ + .../xml/cairo_ft_font_create_for_ft_face.xml | 69 ------- + doc/reference/xml/cairo_ft_font_get_pattern.xml | 49 ----- + doc/reference/xml/cairo_ft_font_lock_face.xml | 61 ------ + doc/reference/xml/cairo_ft_font_unlock_face.xml | 44 ---- + doc/reference/xml/cairo_glyph_t.xml | 62 ------ + doc/reference/xml/cairo_hit.xml | 36 ---- + doc/reference/xml/cairo_identity_matrix.xml | 35 ---- + doc/reference/xml/cairo_in_fill.xml | 34 ---- + doc/reference/xml/cairo_in_stroke.xml | 34 ---- + .../xml/cairo_inverse_transform_distance.xml | 47 ----- + .../xml/cairo_inverse_transform_point.xml | 47 ----- + doc/reference/xml/cairo_line_cap_t.xml | 43 ---- + doc/reference/xml/cairo_line_to.xml | 47 ----- + doc/reference/xml/cairo_matrix_copy.xml | 41 ---- + doc/reference/xml/cairo_matrix_create.xml | 34 ---- + doc/reference/xml/cairo_matrix_destroy.xml | 35 ---- + doc/reference/xml/cairo_matrix_invert.xml | 35 ---- + doc/reference/xml/cairo_matrix_multiply.xml | 47 ----- + doc/reference/xml/cairo_matrix_rotate.xml | 41 ---- + doc/reference/xml/cairo_matrix_scale.xml | 47 ----- + doc/reference/xml/cairo_matrix_set_identity.xml | 35 ---- + doc/reference/xml/cairo_matrix_t.xml | 33 --- + .../xml/cairo_matrix_transform_distance.xml | 47 ----- + doc/reference/xml/cairo_matrix_transform_point.xml | 47 ----- + doc/reference/xml/cairo_matrix_translate.xml | 47 ----- + doc/reference/xml/cairo_move_to.xml | 47 ----- + doc/reference/xml/cairo_new_path.xml | 35 ---- + doc/reference/xml/cairo_operator_t.xml | 47 ----- + doc/reference/xml/cairo_pop_group.xml | 35 ---- + doc/reference/xml/cairo_push_group.xml | 35 ---- + doc/reference/xml/cairo_rectangle.xml | 47 ----- + doc/reference/xml/cairo_reference.xml | 35 ---- + doc/reference/xml/cairo_rel_curve_to.xml | 70 ------- + doc/reference/xml/cairo_rel_line_to.xml | 47 ----- + doc/reference/xml/cairo_rel_move_to.xml | 47 ----- + doc/reference/xml/cairo_restore.xml | 36 ---- + doc/reference/xml/cairo_rotate.xml | 41 ---- + doc/reference/xml/cairo_save.xml | 36 ---- + doc/reference/xml/cairo_scale.xml | 47 ----- + doc/reference/xml/cairo_scale_font.xml | 41 ---- + doc/reference/xml/cairo_select_font.xml | 53 ----- + doc/reference/xml/cairo_set_alpha.xml | 42 ---- + doc/reference/xml/cairo_set_dash.xml | 53 ----- + doc/reference/xml/cairo_set_fill_rule.xml | 41 ---- + doc/reference/xml/cairo_set_font.xml | 52 ----- + doc/reference/xml/cairo_set_line_cap.xml | 41 ---- + doc/reference/xml/cairo_set_line_join.xml | 41 ---- + doc/reference/xml/cairo_set_line_width.xml | 41 ---- + doc/reference/xml/cairo_set_miter_limit.xml | 41 ---- + doc/reference/xml/cairo_set_operator.xml | 42 ---- + doc/reference/xml/cairo_set_pattern.xml | 41 ---- + doc/reference/xml/cairo_set_rgb_color.xml | 54 ----- + doc/reference/xml/cairo_set_target_drawable.xml | 45 ----- + doc/reference/xml/cairo_set_target_image.xml | 58 ------ + doc/reference/xml/cairo_set_target_png.xml | 51 ----- + doc/reference/xml/cairo_set_target_ps.xml | 52 ----- + doc/reference/xml/cairo_set_target_surface.xml | 41 ---- + doc/reference/xml/cairo_set_target_xcb.xml | 58 ------ + doc/reference/xml/cairo_set_tolerance.xml | 41 ---- + doc/reference/xml/cairo_show_glyphs.xml | 46 ----- + doc/reference/xml/cairo_show_text.xml | 41 ---- + doc/reference/xml/cairo_status.xml | 35 ---- + doc/reference/xml/cairo_status_string.xml | 35 ---- + doc/reference/xml/cairo_stroke.xml | 35 ---- + doc/reference/xml/cairo_stroke_path.xml | 35 ---- + doc/reference/xml/cairo_surface_clip_restore.xml | 35 ---- + doc/reference/xml/cairo_surface_destroy.xml | 35 ---- + doc/reference/xml/cairo_surface_get_matrix.xml | 41 ---- + doc/reference/xml/cairo_surface_reference.xml | 35 ---- + doc/reference/xml/cairo_surface_set_filter.xml | 41 ---- + doc/reference/xml/cairo_surface_set_matrix.xml | 41 ---- + doc/reference/xml/cairo_surface_set_repeat.xml | 41 ---- + doc/reference/xml/cairo_surface_t.xml | 17 -- + doc/reference/xml/cairo_t.xml | 23 --- + doc/reference/xml/cairo_text_extents.xml | 47 ----- + doc/reference/xml/cairo_text_extents_t.xml | 76 ------- + doc/reference/xml/cairo_transform_distance.xml | 47 ----- + doc/reference/xml/cairo_transform_font.xml | 41 ---- + doc/reference/xml/cairo_transform_point.xml | 47 ----- + doc/reference/xml/cairo_translate.xml | 47 ----- + doc/reference/xml/skeleton.xml | 30 --- + src/cairo-font.c | 13 ++ + src/cairo-ft-font.c | 107 ++++++++++ + src/cairo-ps-surface.c | 16 ++ + src/cairo-xlib-surface.c | 16 ++ + src/cairo.c | 162 +++++++++++++++ + src/cairo.h | 126 +++++++++++- + src/cairo_font.c | 13 ++ + src/cairo_ft_font.c | 107 ++++++++++ + src/cairo_ps_surface.c | 16 ++ + src/cairo_xlib_surface.c | 16 ++ + 127 files changed, 601 insertions(+), 4984 deletions(-) + +commit 56c96d014047c8759dcec6777416466f87aba354 +Author: Kristian Høgsberg +Date: Thu Jan 27 12:28:17 2005 +0000 + + Update these two once again, this time generated using libpixman-0.1.3 without leaky circles. + + ChangeLog | 7 +++++++ + test/clip-twice-ref.png | Bin 793 -> 751 bytes + test/clip_twice-ref.png | Bin 793 -> 751 bytes + test/coverage-ref.png | Bin 44373 -> 44331 bytes + 4 files changed, 7 insertions(+) + +commit 73cdfa0b2ba3222958483245a48daf483f3c74f6 +Author: Kristian Høgsberg +Date: Thu Jan 27 11:59:55 2005 +0000 + + [ Grr... previous commit from test/, missed the ChangLog changes ] + Fix missing rounding in these two functions. + Update these to versions with properly rounded alpha values. + Move clip_twice out of XFAIL now that rounding works. + Add new test cases. + + ChangeLog | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 81d03b3048b238099ae29a4baba84d5870353540 +Author: Kristian Høgsberg +Date: Thu Jan 27 11:40:29 2005 +0000 + + Fix missing rounding in these two functions. + Update these to versions with properly rounded alpha values. + Move clip_twice out of XFAIL now that rounding works. + Add new test cases. + + test/.cvsignore | 2 ++ + test/Makefile.am | 3 +-- + test/clip-twice-ref.png | Bin 869 -> 793 bytes + test/clip_twice-ref.png | Bin 869 -> 793 bytes + test/coverage-ref.png | Bin 44332 -> 44373 bytes + test/read-png.c | 6 +++--- + test/read_png.c | 6 +++--- + test/write-png.c | 6 +++--- + test/write_png.c | 6 +++--- + 9 files changed, 15 insertions(+), 14 deletions(-) + +commit 0f5b7d82deb8941705b703ef27d442ca7627bf41 +Author: Owen Taylor +Date: Thu Jan 27 11:35:25 2005 +0000 + + configure.in Makefile.am docs/Makefile.am docs/public/*: Add framework for doing docs via gtk-doc. + src/cairo.[ch] src/cairo-matrix.c: Add some inline docs for arcs and matrices. + gtk-doc.m4 acinclude.m4: Check in files from gtk-doc to make the dependency on gtk-doc optional. + Add --enable-gtk-doc to the default args. + + ChangeLog | 14 + + Makefile.am | 2 +- + acinclude.m4 | 53 ++ + autogen.sh | 2 +- + configure.in | 5 + + doc/.cvsignore | 2 + + doc/Makefile.am | 2 + + doc/public/.cvsignore | 15 + + doc/public/Makefile.am | 45 ++ + doc/public/cairo-docs.xml | 30 ++ + doc/public/cairo-overrides.txt | 0 + doc/public/cairo-sections.txt | 238 +++++++++ + doc/public/cairo.types | 0 + doc/public/tmpl/.cvsignore | 1 + + doc/public/tmpl/cairo-atsui.sgml | 25 + + doc/public/tmpl/cairo-ft.sgml | 63 +++ + doc/public/tmpl/cairo-glitz.sgml | 34 ++ + doc/public/tmpl/cairo-matrix.sgml | 193 +++++++ + doc/public/tmpl/cairo-pattern.sgml | 154 ++++++ + doc/public/tmpl/cairo-pdf.sgml | 42 ++ + doc/public/tmpl/cairo-png.sgml | 40 ++ + doc/public/tmpl/cairo-ps.sgml | 42 ++ + doc/public/tmpl/cairo-quartz.sgml | 38 ++ + doc/public/tmpl/cairo-surface.sgml | 112 ++++ + doc/public/tmpl/cairo-xcb.sgml | 28 + + doc/public/tmpl/cairo-xlib.sgml | 39 ++ + doc/public/tmpl/cairo.sgml | 1012 ++++++++++++++++++++++++++++++++++++ + gtk-doc.make | 157 ++++++ + src/cairo-matrix.c | 162 ++++++ + src/cairo.c | 47 ++ + src/cairo.h | 26 +- + src/cairo_matrix.c | 162 ++++++ + 32 files changed, 2782 insertions(+), 3 deletions(-) + +commit 17ec6f1482ed63ea15e317e78eafab52786cee55 +Author: Kristian Høgsberg +Date: Thu Jan 27 10:46:20 2005 +0000 + + The overall idea of this rewrite is that we want to pass the source pattern all the way down into the backends. The motivation for this is that not all backends want a surface for the source operand, and by passing the pattern down, backends can choose to convert it to a surface if they need that. + The patch removes the create_surface function pointer from the surface vtable and moves much of that code into a couple of helper functions. The composite, compsite_trapezoids, and show_glyphs backend functions are updated to take a cairo_pattern_t instead of a surface as the source. + Change these functions to not create a surface for the pattern and just pass the pattern down to the backend functions. + New function to translate a set of trapezoids. + Break out the code to adjust and restore surface transformation and repeat settings into _cairo_pattern_prepare_surface and _cairo_pattern_restore_surface. + Split cairo_pattern_create_for_surface into an init function and a create function. + Utility functions to create a surface from a pattern. + Update these backends to work with the new pattern API. Glitz work by David Reveman. + Update these to pass through the new set of args. + Update this reference image as we now render it correctly. + + ChangeLog | 62 ++++ + src/cairo-font.c | 20 +- + src/cairo-ft-font.c | 19 +- + src/cairo-glitz-surface.c | 827 ++++++++++++++++++++++------------------------ + src/cairo-gstate.c | 363 ++++++++++---------- + src/cairo-image-surface.c | 79 +++-- + src/cairo-pattern.c | 207 ++++++++---- + src/cairo-pdf-surface.c | 72 +--- + src/cairo-ps-surface.c | 15 +- + src/cairo-surface.c | 142 ++------ + src/cairo-xlib-surface.c | 102 ++++-- + src/cairo_font.c | 20 +- + src/cairo_ft_font.c | 19 +- + src/cairo_glitz_surface.c | 827 ++++++++++++++++++++++------------------------ + src/cairo_gstate.c | 363 ++++++++++---------- + src/cairo_image_surface.c | 79 +++-- + src/cairo_pattern.c | 207 ++++++++---- + src/cairo_pdf_surface.c | 72 +--- + src/cairo_png_surface.c | 19 +- + src/cairo_ps_surface.c | 15 +- + src/cairo_surface.c | 142 ++------ + src/cairo_xlib_surface.c | 102 ++++-- + src/cairoint.h | 102 +++--- + test/coverage-ref.png | Bin 43819 -> 44332 bytes + 24 files changed, 1960 insertions(+), 1915 deletions(-) + +commit 2654df6afb424e41d7cc3752a9d7b9c27c3efc92 +Author: Kristian Høgsberg +Date: Wed Jan 26 21:46:01 2005 +0000 + + New test case to verify that the clip surface is correctly updated when extending an existing clip path. + + ChangeLog | 4 +++ + test/Makefile.am | 21 +++++++++----- + test/clip-twice-ref.png | Bin 0 -> 869 bytes + test/clip-twice.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/clip_twice-ref.png | Bin 0 -> 869 bytes + test/clip_twice.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 162 insertions(+), 7 deletions(-) + +commit 79d9b82ff3a803a0895fd57156cb39dc0a54e926 +Author: Kristian Høgsberg +Date: Wed Jan 26 14:21:53 2005 +0000 + + Set alpha to 1 before setting clip mask. + Added the right reference PNG. Running test against stock 0.3.0 gives the expected results. + + ChangeLog | 5 +++++ + test/coverage-ref.png | Bin 629 -> 43819 bytes + test/coverage.c | 1 + + 3 files changed, 6 insertions(+) + +commit d4fb5c92407f31291041f421360ea83a209ea2ad +Author: Kristian Høgsberg +Date: Wed Jan 26 13:41:55 2005 +0000 + + New test case, covering various combinations of pattern types, drawing operations and clipping. Currently fails, for some combinations, coverage-ref.png is just a placeholder. + Added this PNG from cairo-snippets to use for pattern fills. + expose PNG loading to test cases. + + ChangeLog | 13 ++++ + test/Makefile.am | 7 +- + test/cairo-test.c | 23 +++++++ + test/cairo-test.h | 4 ++ + test/cairo_test.c | 23 +++++++ + test/cairo_test.h | 4 ++ + test/coverage-ref.png | Bin 0 -> 629 bytes + test/coverage.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++ + test/romedalen.png | Bin 0 -> 80944 bytes + 9 files changed, 253 insertions(+), 2 deletions(-) + +commit 6dce601fd3cd7f6c8ebe72240e6be7c223ccbdcb +Author: Carl Worth +Date: Wed Jan 26 09:10:15 2005 +0000 + + Use 32-bits for pixman_bits_t, even on 64-bit platforms. This should fix bug #2335 as well as rendering problems seen on 64-bit platforms. + + pixman/ChangeLog | 6 ++++++ + pixman/src/pixman.h | 20 ++++++++++---------- + 2 files changed, 16 insertions(+), 10 deletions(-) + +commit dfee909d51aa62d731512d6a66ad3d7478c41089 +Author: Alexander Larsson +Date: Wed Jan 26 06:49:16 2005 +0000 + + Fix access to uninitialized data + key must be first element in cache entry + + ChangeLog | 8 ++++++++ + src/cairo-ft-font.c | 4 +++- + src/cairo-xlib-surface.c | 2 +- + src/cairo_ft_font.c | 4 +++- + src/cairo_xlib_surface.c | 2 +- + 5 files changed, 16 insertions(+), 4 deletions(-) + +commit 2a7a9d00cc2aa124b5c914dcaf978cbf7ddeddbb +Author: Carl Worth +Date: Tue Jan 25 14:45:31 2005 +0000 + + test/imagediff.c + Add new testsvg script and accompanying imagediff program, (for interim SVG-based test suites while we wait for the standard cairo test suite to mature). + Split buffer_diff out into its own file for the purpose of imagediff. + + test/.cvsignore | 1 + + test/Makefile.am | 5 ++++ + test/buffer-diff.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ + test/buffer-diff.h | 38 ++++++++++++++++++++++++ + test/buffer_diff.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ + test/buffer_diff.h | 38 ++++++++++++++++++++++++ + test/cairo-test.c | 61 +++++++-------------------------------- + test/cairo_test.c | 61 +++++++-------------------------------- + test/imagediff.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + test/write-png.c | 7 ++--- + test/write-png.h | 4 +-- + test/write_png.c | 7 ++--- + test/write_png.h | 4 +-- + 13 files changed, 340 insertions(+), 116 deletions(-) + +commit e5e0880d6761bac2482ec5e1af44a89c9e0b10d9 +Author: David Reveman +Date: Tue Jan 25 12:25:29 2005 +0000 + + Update mail address + + AUTHORS | 2 +- + ChangeLog | 4 ++++ + src/cairo-glitz-surface.c | 2 +- + src/cairo_glitz_surface.c | 2 +- + 4 files changed, 7 insertions(+), 3 deletions(-) + +commit b35c7a3ee5df3cac5d5060df6f251947f168e8ec +Author: David Reveman +Date: Tue Jan 25 12:21:32 2005 +0000 + + Track changes to glitz + + ChangeLog | 4 +++ + configure.in | 2 +- + src/cairo-glitz-surface.c | 67 +++++++++++++++++++++-------------------------- + src/cairo_glitz_surface.c | 67 +++++++++++++++++++++-------------------------- + 4 files changed, 65 insertions(+), 75 deletions(-) + +commit 71f65cbad209bce433f8aca4809a99216856e53d +Author: David Reveman +Date: Tue Jan 25 12:11:02 2005 +0000 + + Add missing include directive so xcb backend compile again + + ChangeLog | 5 +++++ + src/cairo-xcb-surface.c | 1 + + src/cairo_xcb_surface.c | 1 + + 3 files changed, 7 insertions(+) + +commit b321202d18443e4140093c41a17ac0bf10f9059f +Author: Carl Worth +Date: Tue Jan 25 11:48:59 2005 +0000 + + Fixed rounding of glyph positioning. + + ChangeLog | 5 +++++ + src/cairo-ft-font.c | 6 +++--- + src/cairo_ft_font.c | 6 +++--- + 3 files changed, 11 insertions(+), 6 deletions(-) + +commit a812c7a06606f6c6b050fca6ad86a7b94564c1a2 +Author: Owen Taylor +Date: Tue Jan 25 10:56:50 2005 +0000 + + Chec pdf_font for NULL, not font. + + ChangeLog | 5 +++++ + src/cairo-pdf-surface.c | 2 +- + src/cairo_pdf_surface.c | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit 55a8b62ec4650c9e730a431880b2d68614275d57 +Author: Alexander Larsson +Date: Tue Jan 25 06:50:33 2005 +0000 + + Fix typo that made cairo-ft.h not get installed + + ChangeLog | 5 +++++ + src/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit fe0c66a821591b15de0ed4f6781243ed9beb4f55 +Author: Carl Worth +Date: Mon Jan 24 09:17:10 2005 +0000 + + Add Shawn T. Amundson, Calum Robinson, and Owen Taylor. + + AUTHORS | 7 +++++-- + ChangeLog | 2 ++ + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit e2afdd14588f1352e35777eb1d817f3559b297bd +Author: Carl Worth +Date: Mon Jan 24 09:10:51 2005 +0000 + + Conditionally install header files only for backends that are compiled. Thanks to Shawn T. Amundson . + + ChangeLog | 4 ++++ + src/Makefile.am | 58 +++++++++++++++++++++++++++++++++------------------------ + 2 files changed, 38 insertions(+), 24 deletions(-) + +commit 31f05254ffabd660b27b26af082ca75ac724c9d7 +Author: Carl Worth +Date: Mon Jan 24 09:01:52 2005 +0000 + + Qualify color argument as const. Closes bug #2336. + + ChangeLog | 6 ++++++ + src/cairo-color.c | 3 ++- + src/cairo_color.c | 3 ++- + src/cairoint.h | 3 ++- + 4 files changed, 12 insertions(+), 3 deletions(-) + +commit c58f6a4bcf20b1f2a50629100457e4025a7de19b +Author: Dave Beckett +Date: Sun Jan 23 15:16:57 2005 +0000 + + Protect switch on hintstyle with #ifdef FC_HINT_STYLE. + + ChangeLog | 5 +++++ + src/cairo-ft-font.c | 8 ++++---- + src/cairo_ft_font.c | 8 ++++---- + 3 files changed, 13 insertions(+), 8 deletions(-) + +commit 7114a77ce1f25c4e4cd6840daf49ce34cdc11826 +Author: Carl Worth +Date: Sun Jan 23 12:49:56 2005 +0000 + + Add instructions for handling the new -head suffix of CAIRO_VERSION at release-time. + Append -head to CAIRO_VERSION to indicate state between snapshots. + + ChangeLog | 12 ++++++++++++ + RELEASING | 24 +++++++++++++++--------- + configure.in | 2 +- + src/cairo-gstate.c | 6 ++++++ + src/cairo_gstate.c | 6 ++++++ + 5 files changed, 40 insertions(+), 10 deletions(-) + +commit 7275be538b37c0e102f62b98e6e8489eaf64e715 +Author: Owen Taylor +Date: Fri Jan 21 15:43:55 2005 +0000 + + Call _cairo_gstate_ensure_font(). Don't reference the returned font. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 8 ++++++-- + src/cairo_gstate.c | 8 ++++++-- + 3 files changed, 17 insertions(+), 4 deletions(-) + +commit e613961f948495b06e60542dee85d513cf459ad2 +Author: Owen Taylor +Date: Fri Jan 21 15:31:15 2005 +0000 + + Make dependence on FC_HINT_STYLE conditional. (reported by Abraham Egnor) + Use FT_LOAD_MONOCHROME if FT_LOAD_TARGET_MONO isn't defined for compatibility with older FreeType. + + ChangeLog | 9 +++++++++ + src/cairo-ft-font.c | 12 ++++++++++++ + src/cairo_ft_font.c | 12 ++++++++++++ + 3 files changed, 33 insertions(+) + +commit 97424a3c2a4172dd3a686d0d41f7c7781b670814 +Author: Owen Taylor +Date: Fri Jan 21 14:33:47 2005 +0000 + + Change cairo_font_t to refer to a font scaled to a particular output device resolution. + src/cairoint.h src/cairo_font.c src/cairo_ft_font.c src/cairo_xlib_surface.c src/cairo_pdf_surface.c src/cairo_gstate.c src/cairo.c: Switch many internal methods from handling cairo_unscaled_font_t and cairo_font_scale_t pairs to handling cairo_font_t. + src/cairo-ft-private.h src/cairo_ft_fontc: Add some internal interfaces for use by the FreeType backend. + Clear the gstate's current font when the transform or target surface changes. + src/cairo.h src/cairo_ft_font.c: Rename cairo_ft_font_pattern to cairo_ft_font_get_pattern(). + src/cairo.h src/cairo_ft_font.c: Make cairo_ft_font_create() and cairo_ft_font_create_for_ft_face() take a font scale; make the latter take load_flags for FT_Load_Glyph() as well. Change cairo_ft_font_face() to Xft-style cairo_ft_font_lock_face, cairo_ft_font_unlock_face. + Remove the name/slant/weight=>unscaled font cache, it didn't work with the new cairo_font_t setup. If it turns out to be needed, it can be added back in some other form. + src/cairoint.h src/cairo_font.c: Add a 'flags' field to cairo_glyph_cache_key_t, we use it for load flags with freetype backend. + Switch the caching to be from resolved fontconfig pattern => file; keep only a fixed number of FT_Face objects open at once, similar to FreeType. + src/cairo_gstate.c src/cairoint.h: Add public cairo_font_glyph_extents, use it to implement _cairo_gstate_glyph_extents(). + Add refcounting for glyph cache elements; there was an bug where elements got ejected from the cache and freed before they could be used. + src/cairoint.h src/cairo_cache.c (_cairo_cache_random_entry()) New function to return a random entry in the cache matching a predicate; reuse the internals for the previous _random_live_entry(). + src/cairoint.h src/cairo_cache.c (_cairo_cache_lookup()): Add an optional created_entry return value. + src/cairo_ft_font.c src/cairo_xlib_surface.c: Adapt to _cairo_cache_lookup() change. + Support max_memory == 0 to indicate an unbounded cache. + src/cairoint.h src/cairo_cache.c (_cairo_cache_remove()): Add a function to manually remove entries from the cache. + Update for changes, document cairo_matrix_t, cairo_glyph_t, etc. + src/cairo.h src/cairo-atsui.h src/cairo-ft.h src/cairo-glitz.h src/cairo-pdf.h src/cairo-png.h src/cairo-ps.h src/cairo-quartz.h src/cairo-xcb.h src/cairo-xlib.h: Add CAIRO_BEGIN/END_DECLS for extern "C", use it on all public headers. Move header guards outermost. + Fix encoding. + + ChangeLog | 74 ++ + doc/reference/doc.xml | 21 +- + doc/reference/xml/cairo_current_font.xml | 4 +- + doc/reference/xml/cairo_font_glyph_extents.xml | 72 ++ + doc/reference/xml/cairo_font_t.xml | 25 + + doc/reference/xml/cairo_ft_font_create.xml | 59 ++ + .../xml/cairo_ft_font_create_for_ft_face.xml | 69 ++ + doc/reference/xml/cairo_ft_font_get_pattern.xml | 49 + + doc/reference/xml/cairo_ft_font_lock_face.xml | 61 ++ + doc/reference/xml/cairo_ft_font_unlock_face.xml | 44 + + doc/reference/xml/cairo_glyph_t.xml | 62 ++ + doc/reference/xml/cairo_matrix_t.xml | 24 +- + doc/reference/xml/cairo_set_font.xml | 16 +- + doc/reference/xml/cairo_show_glyphs.xml | 2 +- + doc/reference/xml/cairo_text_extents_t.xml | 49 +- + src/cairo-atsui.h | 9 +- + src/cairo-cache.c | 104 +- + src/cairo-font.c | 410 +++----- + src/cairo-ft-font.c | 1047 ++++++++++++-------- + src/cairo-ft-private.h | 63 ++ + src/cairo-ft.h | 31 +- + src/cairo-glitz.h | 9 +- + src/cairo-gstate.c | 323 +++--- + src/cairo-hash.c | 104 +- + src/cairo-pdf-surface.c | 63 +- + src/cairo-pdf.h | 9 +- + src/cairo-png.h | 11 +- + src/cairo-ps.h | 9 +- + src/cairo-quartz-surface.c | 2 +- + src/cairo-quartz.h | 9 +- + src/cairo-xcb.h | 9 +- + src/cairo-xlib-surface.c | 55 +- + src/cairo-xlib.h | 9 +- + src/cairo.h | 29 +- + src/cairo_cache.c | 104 +- + src/cairo_font.c | 410 +++----- + src/cairo_ft_font.c | 1047 ++++++++++++-------- + src/cairo_gstate.c | 323 +++--- + src/cairo_pdf_surface.c | 63 +- + src/cairo_quartz_surface.c | 2 +- + src/cairo_xlib_surface.c | 55 +- + src/cairoint.h | 157 +-- + 42 files changed, 3118 insertions(+), 1979 deletions(-) + +commit 90689370267f3c02d6be62e3e8c85cccdad6f577 +Author: Carl Worth +Date: Fri Jan 21 12:48:11 2005 +0000 + + Increment CAIRO_VERSION to 0.3.0 + Add notes for snapshot 0.3.0 + + ChangeLog | 6 ++- + NEWS | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 3 files changed, 176 insertions(+), 3 deletions(-) + +commit f697490665735c5b5a469b81b16e8075eb355ba7 +Author: Carl Worth +Date: Fri Jan 21 11:27:56 2005 +0000 + + Update reference images for new rasterization in libpixman 0.1.3. + + ChangeLog | 5 +++++ + test/fill-rule-ref.png | Bin 1983 -> 1979 bytes + test/fill_rule-ref.png | Bin 1983 -> 1979 bytes + test/leaky-polygon-ref.png | Bin 264 -> 255 bytes + test/leaky_polygon-ref.png | Bin 264 -> 255 bytes + test/line-width-ref.png | Bin 167 -> 171 bytes + test/line_width-ref.png | Bin 167 -> 171 bytes + 7 files changed, 5 insertions(+) + +commit 1463fbb6c90a9a6faff0d4d1b65d375e416dafd4 +Author: Carl Worth +Date: Fri Jan 21 11:20:55 2005 +0000 + + Update since directory changed after server compromise. + + ChangeLog | 5 +++++ + Makefile.am | 2 +- + RELEASING | 6 +++--- + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit fdf1ed1185916b77dc36564f637ebe147acb537d +Author: Carl Worth +Date: Fri Jan 21 11:18:46 2005 +0000 + + Fix typo + + pixman/RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 886d457c2f16faa0f570fcf98680df5e5123a641 +Author: Carl Worth +Date: Fri Jan 21 11:16:03 2005 +0000 + + Fix snapshot URL in description + + pixman/RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4b072cc7d266a059871bb76043fa8d0394410671 +Author: Carl Worth +Date: Fri Jan 21 11:10:07 2005 +0000 + + Add notes for snapshot 0.1.3. + Increment version to 0.1.3 + Add reminder to diff pixman.h to look for API changes since the last snapshot. + + pixman/ChangeLog | 7 +++++++ + pixman/NEWS | 22 ++++++++++++++++++++++ + pixman/RELEASING | 8 +++++++- + pixman/configure.in | 2 +- + 4 files changed, 37 insertions(+), 2 deletions(-) + +commit c3e41a966c5fb0b503dfba48f13a585509c62530 +Author: Carl Worth +Date: Fri Jan 21 10:59:33 2005 +0000 + + Add missing files to satisfy make distcheck. + + pixman/ChangeLog | 3 +++ + pixman/src/Makefile.am | 2 ++ + 2 files changed, 5 insertions(+) + +commit 1c4286c2a8323fdadc5112d25acf3cf7ba0d32da +Author: Carl Worth +Date: Fri Jan 21 10:54:51 2005 +0000 + + Update for changed www directory on server. + + pixman/ChangeLog | 3 +++ + pixman/Makefile.am | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit fd8974f2adfcb46870dec15d4a90763a89ede42a +Author: Carl Worth +Date: Fri Jan 21 10:52:55 2005 +0000 + + Add pixman-xserver-compat.h, (that was supposed to go in a couple of commits ago). + + pixman/ChangeLog | 3 ++ + pixman/src/pixman-xserver-compat.h | 98 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 101 insertions(+) + +commit dfa7b94c9c9aea61a1ae786139e21152d6e8e34a +Author: Carl Worth +Date: Fri Jan 21 10:38:42 2005 +0000 + + Avoid buffer ovverrun when trapezoid's right edge is on a pixel boundary. + + pixman/ChangeLog | 3 +++ + pixman/src/fbedgeimp.h | 10 +++++++--- + 2 files changed, 10 insertions(+), 3 deletions(-) + +commit 13225d4d3baa78b3020586c6e9b4601111792903 +Author: Carl Worth +Date: Fri Jan 21 10:26:28 2005 +0000 + + Switch to use new fbRasterizeTrapezoid. Gut old IcRasterizeTrapezoid implementation. Remove lots of code, (and all the bugs with it). + Replace IcRasterizeTrapezoid with fbRasterizeTrapezoid. Add a couple of missing typedefs. + Minor changes to allow things to compile within libpixman tree, (replace xserver include directives with pixman-xserver-compat.h and sprinkle a few const qualifiers). + Add sources for new point-sampling rasterization. + + pixman/ChangeLog | 19 + + pixman/src/Makefile.am | 4 + + pixman/src/fbedge.c | 12 +- + pixman/src/fbtrap.c | 20 +- + pixman/src/icint.h | 18 +- + pixman/src/ictransform.c | 2 - + pixman/src/ictrap.c | 1337 +--------------------------------------------- + pixman/src/ictri.c | 4 +- + pixman/src/renderedge.c | 8 +- + pixman/src/renderedge.h | 6 +- + 10 files changed, 53 insertions(+), 1377 deletions(-) + +commit c64e2ccd06edfc9b148ca620d218f84c7bb93378 +Author: Carl Worth +Date: Fri Jan 21 09:26:44 2005 +0000 + + Merge in changes from xserver, (mostly just whitespace). + + pixman/ChangeLog | 5 +++++ + pixman/src/fbtrap.c | 21 ++++++++++++--------- + 2 files changed, 17 insertions(+), 9 deletions(-) + +commit d466c33d1df2a30aa8a8c38f2b9861cb36bf3c1e +Author: Carl Worth +Date: Thu Jan 20 20:45:38 2005 +0000 + + Add a bunch of missing include directives, (now that cairo.h has been cleaned up). + + ChangeLog | 7 ++++++- + test/cairo-test.c | 4 ++++ + test/cairo_test.c | 4 ++++ + 3 files changed, 14 insertions(+), 1 deletion(-) + +commit da1b3c147b9151cef55f0e1c567c897d066bf594 +Author: Carl Worth +Date: Thu Jan 20 20:41:40 2005 +0000 + + Created new public header cairo-atsui.h. + Build fixes for Quartz backend courtesy of Geoff Norton : + Fix check for atsui font backend. + Add conditional compilation for cairo_atsui_font.c and cairo_ft_font.c. + Add missing include of cairo-quartz.h. + Add include of Carbon/Carbon.h. + Advertise availability of Quartz surface. + Install cairo-quartz.h, and conditionally compile cairo_quartz_surface.c. + Add autofoo checks to detect quartz backend. + + ChangeLog | 26 ++++++++++++++++++++++++++ + configure.in | 33 ++++++++++++++++++++++++++++++--- + 2 files changed, 56 insertions(+), 3 deletions(-) + +commit 0ad3789985161fe0fe9908ce993aa7ac2d95e8c4 +Author: Carl Worth +Date: Thu Jan 20 20:36:25 2005 +0000 + + Created new public header cairo-atsui.h. + Build fixes for Quartz backend courtesy of Geoff Norton : + Fix check for atsui font backend. + Add conditional compilation for cairo_atsui_font.c and cairo_ft_font.c. + Add missing include of cairo-quartz.h. + Add include of Carbon/Carbon.h. + Advertise availability of Quartz surface. + Install cairo-quartz.h, and conditionally compile cairo_quartz_surface.c. + Add autofoo checks to detect quartz backend. + + src/Makefile.am | 18 ++++++++++++++++- + src/cairo-atsui-font.c | 13 ++++++------ + src/cairo-atsui.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-features.h.in | 2 ++ + src/cairo-quartz-surface.c | 7 +------ + src/cairo-quartz.h | 2 ++ + src/cairo_atsui_font.c | 13 ++++++------ + src/cairo_quartz_surface.c | 7 +------ + 8 files changed, 87 insertions(+), 25 deletions(-) + +commit b646ecfe08601af5587b0f3e10e0bf2e62e355c6 +Author: Carl Worth +Date: Thu Jan 20 08:28:54 2005 +0000 + + Track various renamings. + Insert new includes for backend-specific header files. + Remove redundant include of cairo-features.h. + Rename header-exclusion macro from _CAIRO_H_ to CAIRO_H. Remove platform-specific grubbing for cairo-features.h and pixman.h in odd places. + Remove all backend-specific prototypes, (as they are now in their own header files). + Remove deprecated + Remove printf. + Convert to utf-8. Use the proper name for multiple-header exclusion (CAIRO_FEATURES_H). Track rename of FREETYPE_FONT_FEATURE to FT_FONT_FEATURE. + Split cairo.h up into cairo.h, cairo-ft.h, cairo-glitz.h, cairo-pdf.h, cairo-png.h, cairo-ps.h, cairo-xcb.h, cairo-xlib.h. Update for rename of cairo_wideint.h to cairo-wideint.h. + Rename CAIRO_HAS_FREETYPE_FONT to CAIRO_HAS_FT_FONT, (to match cairo_ft_font functions and cairo-ft.h). + Update for public header files now in /cairo. + + ChangeLog | 45 ++++++- + cairo.pc.in | 3 +- + configure.in | 10 +- + src/Makefile.am | 27 +++-- + src/cairo-features.h.in | 8 +- + src/cairo-ft-font.c | 2 + + src/cairo-ft.h | 62 ++++++++++ + src/cairo-glitz-surface.c | 1 + + src/cairo-glitz.h | 53 +++++++++ + src/cairo-pdf-surface.c | 4 + + src/cairo-pdf.h | 62 ++++++++++ + src/cairo-png.h | 59 ++++++++++ + src/cairo-ps-surface.c | 1 + + src/cairo-ps.h | 63 ++++++++++ + src/cairo-quartz.h | 56 +++++++++ + src/cairo-xcb.h | 54 +++++++++ + src/cairo-xlib-surface.c | 1 + + src/cairo-xlib.h | 71 +++++++++++ + src/cairo.c | 2 - + src/cairo.h | 197 +------------------------------ + src/cairo_ft_font.c | 2 + + src/cairo_gdip_font.cpp | 1 - + src/cairo_gdip_surface.cpp | 1 - + src/cairo_glitz_surface.c | 1 + + src/cairo_pdf_surface.c | 4 + + src/cairo_png_surface.c | 1 + + src/cairo_ps_surface.c | 1 + + src/cairo_wideint.h | 285 --------------------------------------------- + src/cairo_xlib_surface.c | 1 + + src/cairoint.h | 6 +- + 30 files changed, 580 insertions(+), 504 deletions(-) + +commit 68d5ba661d5d0ba0a604a3c947f43f629a6a6bb9 +Author: Carl Worth +Date: Wed Jan 19 12:12:42 2005 +0000 + + Allow NULL values for return pointers so that the user can easily get partial results from cairo_matrix_get_affine, cairo_current_point, and cairo_current_color_rgb as needed. + + ChangeLog | 7 +++++++ + src/cairo-color.c | 9 ++++++--- + src/cairo-gstate.c | 6 ++++-- + src/cairo-matrix.c | 17 ++++++++++++++--- + src/cairo_color.c | 9 ++++++--- + src/cairo_gstate.c | 6 ++++-- + src/cairo_matrix.c | 17 ++++++++++++++--- + 7 files changed, 55 insertions(+), 16 deletions(-) + +commit 429c1f42b5942ebd8b3170e462418880c7cf5e2e +Author: Carl Worth +Date: Wed Jan 19 11:39:06 2005 +0000 + + Fix int* vs. size_t* confusion, (currently in favor of int* but only because that's easier to implement). Thanks to John Ellson . Closes bug #2328. + + ChangeLog | 7 +++++++ + src/cairo-ft-font.c | 4 ++-- + src/cairo_ft_font.c | 4 ++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 6fb833a84c8cbdba299f3ba4f23e8c4434491cad +Author: Kristian Høgsberg +Date: Wed Jan 19 08:03:53 2005 +0000 + + Add byteswap macros missing for bigendian architectures. + + ChangeLog | 5 +++++ + src/cairo-pdf-surface.c | 2 ++ + src/cairo_pdf_surface.c | 2 ++ + 3 files changed, 9 insertions(+) + +commit cc58bc3b9b6f46d7953f9a088208f6df1c11a497 +Author: Carl Worth +Date: Wed Jan 19 07:55:28 2005 +0000 + + Remove fill_rule and leaky_polygon from expected failures list. Both of these bugs have fixes, (fill_rule is fixed by reverting cairo_traps.c to 1.16, and leaky_polygon is fixed in a newer libpixman). + + ChangeLog | 5 +++++ + test/Makefile.am | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 27532eda85897f2b2f99d17108174c479a47cf5c +Author: Carl Worth +Date: Wed Jan 19 07:11:14 2005 +0000 + + Remove const qualifiers from the header file as well. + + ChangeLog | 3 +++ + src/cairo-wideint.h | 74 ++++++++++++++++++++++++++--------------------------- + src/cairo_wideint.h | 74 ++++++++++++++++++++++++++--------------------------- + 3 files changed, 77 insertions(+), 74 deletions(-) + +commit 8605b6ae5a0035580683488ba8057f7877f74a9f +Author: Carl Worth +Date: Wed Jan 19 07:07:00 2005 +0000 + + Remove useless const qualifier from functions returning simple values, (quiets the warning in gcc4). Thanks to John Ellson . Closes bug #2299. + + ChangeLog | 5 ++++ + src/cairo-wideint.c | 82 ++++++++++++++++++++++++++--------------------------- + src/cairo_wideint.c | 82 ++++++++++++++++++++++++++--------------------------- + 3 files changed, 87 insertions(+), 82 deletions(-) + +commit f493efa92d1e945cfb02b4a83b87c48c2788ea5d +Author: Carl Worth +Date: Wed Jan 19 05:32:32 2005 +0000 + + Add bugs on cairo_surface_create_for_image, bad names for cairo_font_set_transform and cairo_font_current_transform, segfault on AMD64. + + BUGS | 16 +++++++++++++++- + ChangeLog | 7 +++++++ + 2 files changed, 22 insertions(+), 1 deletion(-) + +commit d894196840aa8363de6f167e6a2b4d59ad9cf977 +Author: Carl Worth +Date: Tue Jan 18 11:54:23 2005 +0000 + + Add pristine files from the X server containing Keith's newer point-sampling implementation of trapezoid rasterization. The plan is to munge these files as little as possible to make them work within libpixman, (so that it will be easier to share patches between libpixman and the X server). + + pixman/ChangeLog | 13 +++ + pixman/src/fbedge.c | 134 +++++++++++++++++++++++++++ + pixman/src/fbedgeimp.h | 134 +++++++++++++++++++++++++++ + pixman/src/fbtrap.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/renderedge.c | 197 ++++++++++++++++++++++++++++++++++++++++ + pixman/src/renderedge.h | 120 +++++++++++++++++++++++++ + 6 files changed, 833 insertions(+) + +commit e1eec5cf0ef9efa2358b27cdb61a45987ce290e4 +Author: Kristian Høgsberg +Date: Mon Jan 17 14:59:49 2005 +0000 + + Fix double free in error path. (cairo_pdf_ft_font_create): Reference the unscaled font to keep the FT_Face around. (cairo_pdf_ft_font_generate): Initialize end to avoid compiler warning; bail out if table write fails. Fixes from Owen. + + ChangeLog | 9 +++++++++ + src/cairo-pdf-surface.c | 26 ++++++++++++++++---------- + src/cairo_pdf_surface.c | 26 ++++++++++++++++---------- + 3 files changed, 41 insertions(+), 20 deletions(-) + +commit 2c6939b7acb3dc931fd723eee84f51a5a692f444 +Author: Kristian Høgsberg +Date: Mon Jan 17 09:40:00 2005 +0000 + + Add preliminary text support, including support for truetype font subsetting. + Change type of 'surface' argument in show_glyphs to void * as it is for all other surface virtual functions. + Update accordingly. + Add check for endianess. + Fix bug in array growing loop. (_cairo_array_append): Accept NULL for elements argument, in which case we just allocate space in the array. + + ChangeLog | 17 + + configure.in | 1 + + src/cairo-array.c | 18 +- + src/cairo-pdf-surface.c | 894 +++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo-xlib-surface.c | 10 +- + src/cairo_array.c | 18 +- + src/cairo_pdf_surface.c | 894 +++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo_xlib_surface.c | 10 +- + src/cairoint.h | 7 +- + 9 files changed, 1798 insertions(+), 71 deletions(-) + +commit be7b745a43b4cbfec7e5ca24185f32ee83856163 +Author: Kristian Høgsberg +Date: Mon Jan 17 09:18:37 2005 +0000 + + Take image_rotate-ref.png out of EXTRA_DIST until we can actually render it correctly. (XFAIL_TESTS): Update with new known bugs. + Add font backend selection options. + + ChangeLog | 11 ++++++ + configure.in | 89 ++++++++++++++++++++++++++++++++++++------------- + src/cairo-features.h.in | 4 +++ + src/cairo.h | 4 +-- + src/cairoint.h | 8 +++-- + test/Makefile.am | 15 +++++---- + 6 files changed, 97 insertions(+), 34 deletions(-) + +commit 0e2e28c71726a5346ec13a6a5681421d1929628f +Author: Marco Pesenti Gritti +Date: Sun Jan 16 08:35:14 2005 +0000 + + Add native Mac OS X support. + + src/cairo-atsui-font.c | 806 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-quartz-surface.c | 397 ++++++++++++++++++++++ + src/cairo.h | 32 +- + src/cairo_atsui_font.c | 806 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_quartz_surface.c | 397 ++++++++++++++++++++++ + src/cairoint.h | 21 +- + 6 files changed, 2455 insertions(+), 4 deletions(-) + +commit 4358135bc9ef8da04906f7491008231608f837c2 +Author: John Ellson +Date: Sat Jan 15 10:53:13 2005 +0000 + + Was using the wrong extents variable. + reviewed by: Keith Packard + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 4 ++-- + src/cairo_gstate.c | 4 ++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit b0de4a7d094e16fda4e9124caa867df78b607d8c +Author: Carl Worth +Date: Thu Jan 13 18:08:57 2005 +0000 + + (IcRasterizeTrapezoid): Fix the above correction so that it doesn't force 0 alpha when the left edge is positioned above but slopes so as to contain some of the pixel. + + pixman/ChangeLog | 3 +++ + pixman/src/ictrap.c | 8 ++++++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit 46baad20ee702ab20903dc48db6ec984604e405c +Author: Carl Worth +Date: Thu Jan 13 14:53:13 2005 +0000 + + Force alpha to 0 when the left edge is entirely above top. (This is a workaround for some bizarre edge effects in the current algorithm). + + pixman/ChangeLog | 6 ++++++ + pixman/src/ictrap.c | 14 ++++++++++++-- + 2 files changed, 18 insertions(+), 2 deletions(-) + +commit 3016995b0d391d233a951db07cbcce49144aef2c +Author: Carl Worth +Date: Thu Jan 13 14:50:35 2005 +0000 + + test/Makefile.am + Add leaky_polygon test for trapezoid rasterization corner case. + + ChangeLog | 5 +++ + test/.cvsignore | 1 + + test/Makefile.am | 3 ++ + test/leaky-polygon-ref.png | Bin 0 -> 264 bytes + test/leaky-polygon.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ + test/leaky_polygon-ref.png | Bin 0 -> 264 bytes + test/leaky_polygon.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 173 insertions(+) + +commit 3ae8c1ca654807a1f76b18931a29425f59c77436 +Author: David Reveman +Date: Thu Jan 13 14:48:15 2005 +0000 + + Replace struct cairo_surface_backend with cairo_surface_backend_t + + ChangeLog | 5 +++++ + src/cairo-xcb-surface.c | 2 +- + src/cairo_xcb_surface.c | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit a2af89b04a53e2f2fb4a9d7ea4ff879e80d20cd7 +Author: Carl Worth +Date: Thu Jan 13 06:50:23 2005 +0000 + + Replace all structure tags to have _ prefix. struct cairo_foo -> struct _cairo_foo Also, prefer cairo_foo_t over struct _cairo_foo in .c files. + + ChangeLog | 11 +++++++ + src/cairo-font.c | 9 +++-- + src/cairo-ft-font.c | 6 ++-- + src/cairo-glitz-surface.c | 4 +-- + src/cairo-xlib-surface.c | 4 +-- + src/cairo.h | 10 +++--- + src/cairo_font.c | 9 +++-- + src/cairo_ft_font.c | 6 ++-- + src/cairo_glitz_surface.c | 4 +-- + src/cairo_xlib_surface.c | 4 +-- + src/cairoint.h | 84 +++++++++++++++++++++++------------------------ + 11 files changed, 80 insertions(+), 71 deletions(-) + +commit 5235dbb80f966acf8d4fe4bdf75766803824e7af +Author: Carl Worth +Date: Wed Jan 12 14:40:14 2005 +0000 + + A NULL cairo_t * is not sane. + Add freetype flags so that things work with freetype in a non-standard location, (a little extra work here since freetype doesn't use pkg-config). + Add several items culled from recent mailing list discussions. + Add bugs on cache locking and surface pattern scaling. + + BUGS | 7 +++++++ + ChangeLog | 16 ++++++++++++++++ + TODO | 21 +++++++++++++++++++++ + cairo.pc.in | 4 ++-- + src/cairo.c | 3 +++ + 5 files changed, 49 insertions(+), 2 deletions(-) + +commit 4796dc0b26d5f56eecc4e208afc6b99ee4a7483e +Author: Carl Worth +Date: Wed Jan 12 14:38:22 2005 +0000 + + Add big_star_path which shows we still have fill bugs, (even now that little_star_path is working). + + test/fill-rule-ref.png | Bin 408 -> 1983 bytes + test/fill-rule.c | 58 +++++++++++++++++++++++++++++++++++++++++-------- + test/fill_rule-ref.png | Bin 408 -> 1983 bytes + test/fill_rule.c | 58 +++++++++++++++++++++++++++++++++++++++++-------- + 4 files changed, 98 insertions(+), 18 deletions(-) + +commit 72832b97606066681b640a7b7fda9fc434fd7e4c +Author: Keith Packard +Date: Tue Jan 11 14:52:16 2005 +0000 + + Scale factors shouldn't include mirroring. + int32x32_64_mul and int64x64_128_mul are different from their unsigned compatriots + + ChangeLog | 11 +++++++++++ + src/cairo-matrix.c | 5 +++++ + src/cairo-wideint.c | 28 +++++++++++++++++++++++++++- + src/cairo-wideint.h | 10 ++++------ + src/cairo_matrix.c | 5 +++++ + src/cairo_wideint.c | 28 +++++++++++++++++++++++++++- + src/cairo_wideint.h | 10 ++++------ + 7 files changed, 83 insertions(+), 14 deletions(-) + +commit 18680d494b7aa14ec1a8cfac602abdb993482266 +Author: Øyvind KolÃ¥s +Date: Tue Jan 11 13:50:13 2005 +0000 + + renamed CAIRO_COLOR_DEFAULT to CAIRO_COLOR_WHITE + + ChangeLog | 5 +++++ + src/cairo-color.c | 8 ++++---- + src/cairo_color.c | 8 ++++---- + 3 files changed, 13 insertions(+), 8 deletions(-) + +commit c7e80e6bffc43de0f0ffadb9f2b3037bd9b18954 +Author: Øyvind KolÃ¥s +Date: Tue Jan 11 13:36:41 2005 +0000 + + reverted accidental change + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 3 --- + src/cairo_xlib_surface.c | 3 --- + 3 files changed, 5 insertions(+), 6 deletions(-) + +commit 7dd4d7aad48ae1c454f28d0a61916ef833b5ef78 +Author: Øyvind KolÃ¥s +Date: Tue Jan 11 13:28:50 2005 +0000 + + changed default paint color to opaque black + + ChangeLog | 7 +++++++ + src/cairo-color.c | 4 ++-- + src/cairo-gstate.c | 2 +- + src/cairo-xlib-surface.c | 3 +++ + src/cairo_color.c | 4 ++-- + src/cairo_gstate.c | 2 +- + src/cairo_xlib_surface.c | 3 +++ + 7 files changed, 19 insertions(+), 6 deletions(-) + +commit ad2225c6f4f18570cbd5e4391788458533895bb8 +Author: Keith Packard +Date: Tue Jan 11 10:03:01 2005 +0000 + + Fix math library detection to use autotools helper + Remove cache memory usage assertions as single objects can be larger than the cache size + Decompose font matrix transformations into a couple of helper routines. Return all metrics in font space. + Eliminate compiler warning + Expect glyph metrics to be in font space. Compute text extents by fetching one glyph metric at a time, transforming to user space and computing the overall bounding box. + use 'sincos' where available. Scale factors now ensure the non-scale transform is area preserving. Scale factors requires another parameter to mark the fixed axis. + Change license to LGPL Mark int32x32_64_mul as broken (which it still is) + Ensure each glyph is located as close to the specified position as possible + interface change to _cairo_matrix_compute_scale_factors + + ChangeLog | 48 ++++++++++++++ + cairo.pc.in | 4 +- + configure.in | 8 ++- + src/Makefile.am | 2 +- + src/cairo-cache.c | 6 +- + src/cairo-ft-font.c | 126 +++++++++++++++++++++++++++++------ + src/cairo-glitz-surface.c | 1 + + src/cairo-gstate.c | 164 +++++++++++++++++++++++++++++----------------- + src/cairo-hash.c | 6 +- + src/cairo-matrix.c | 51 ++++++++++---- + src/cairo-wideint.c | 46 ++++++++----- + src/cairo-wideint.h | 49 +++++++++----- + src/cairo-xlib-surface.c | 33 ++++++---- + src/cairo_cache.c | 6 +- + src/cairo_ft_font.c | 126 +++++++++++++++++++++++++++++------ + src/cairo_glitz_surface.c | 1 + + src/cairo_gstate.c | 164 +++++++++++++++++++++++++++++----------------- + src/cairo_matrix.c | 51 ++++++++++---- + src/cairo_wideint.c | 46 ++++++++----- + src/cairo_wideint.h | 49 +++++++++----- + src/cairo_xlib_surface.c | 33 ++++++---- + src/cairoint.h | 2 +- + 22 files changed, 733 insertions(+), 289 deletions(-) + +commit dc0d812f6c78bfc3e4cbf717cf09a4524d8f149c +Author: Carl Worth +Date: Fri Jan 7 12:14:40 2005 +0000 + + Restore extern tag for variable declarations, (accidentally removed when recently removing extern from function prototypes). + + pixman/ChangeLog | 7 +++++++ + pixman/src/icint.h | 2 +- + pixman/src/icrop.h | 2 +- + 3 files changed, 9 insertions(+), 2 deletions(-) + +commit a85013680566ec945a87dc49ea97d946a57b8c71 +Author: Kristian Høgsberg +Date: Thu Jan 6 23:20:07 2005 +0000 + + Add -lz to CAIRO_LIBS when compiling the PDF backend. + Don't use compressBound, since it's only available in zlib 1.2 and newer. + + ChangeLog | 8 ++++++++ + configure.in | 4 ++++ + src/cairo-pdf-surface.c | 8 +++++++- + src/cairo_pdf_surface.c | 8 +++++++- + 4 files changed, 26 insertions(+), 2 deletions(-) + +commit f4a51d915461b1ac6cb1183a428e7b3afa47ec2a +Author: Carl Worth +Date: Thu Jan 6 21:28:07 2005 +0000 + + Add Owen's new equation to fix clipping: ((src Op dest) In clip) Add (dest Out clip) + + ChangeLog | 5 +++++ + TODO | 20 +++++++++++++------- + 2 files changed, 18 insertions(+), 7 deletions(-) + +commit cf354e9924d8e36593ba1f441cd345703dc1ebcd +Author: Carl Worth +Date: Thu Jan 6 10:28:10 2005 +0000 + + Added cairo_show_surface_mask and note about clipping problems. + + ChangeLog | 1 + + TODO | 14 ++++++++++++++ + 2 files changed, 15 insertions(+) + +commit a513fa18c7ff7c13f54a4098ba97cb1173b1e39d +Author: Carl Worth +Date: Thu Jan 6 08:51:48 2005 +0000 + + Added some TODO items from mailing list traffic. + + ChangeLog | 4 ++++ + TODO | 30 ++++++++++++++++++++++++++++++ + 2 files changed, 34 insertions(+) + +commit c9f545672a0a8a101c9979ab07085b019f55598a +Author: Kristian Høgsberg +Date: Wed Jan 5 17:46:31 2005 +0000 + + Implement image compression (taken from cairo_ps_surface.c). + + ChangeLog | 6 ++++- + src/cairo-pdf-surface.c | 62 +++++++++++++++++++++++++++++++++++-------------- + src/cairo_pdf_surface.c | 62 +++++++++++++++++++++++++++++++++++-------------- + 3 files changed, 93 insertions(+), 37 deletions(-) + +commit b1ec8ae13e9a42c6f9e102a73774dfaeb38dafda +Author: Kristian Høgsberg +Date: Wed Jan 5 14:29:31 2005 +0000 + + New PDF backend. + Add PDF surface constructors. + New file - generic array implementation. + Add cairo_array prototypes. + Add cairo_array.c and cairo_pdf_surface.c. + + AUTHORS | 1 + + ChangeLog | 8 + + configure.in | 17 + + src/Makefile.am | 6 + + src/cairo-array.c | 130 +++++ + src/cairo-features.h.in | 2 + + src/cairo-pdf-surface.c | 1314 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 25 + + src/cairo_array.c | 130 +++++ + src/cairo_gdip_surface.cpp | 4 + + src/cairo_pdf_surface.c | 1314 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 34 ++ + 12 files changed, 2985 insertions(+) + +commit c90bd12ec7fdb548b58903f1f357840888b25871 +Author: Carl Worth +Date: Tue Jan 4 11:55:36 2005 +0000 + + Do nothing if src image has width or height == 0 to avoid potential divide-by-zero. + + pixman/ChangeLog | 5 +++++ + pixman/src/ic.c | 6 ++++++ + 2 files changed, 11 insertions(+) + +commit 7a5a3cb208b079dfe453ad532a8939bed394cff9 +Author: Carl Worth +Date: Thu Dec 23 13:49:56 2004 +0000 + + Remove unused CAIRO_TRAPS_GROWTH_INC. + Resize arrays by doubling rather than by linear increments. + Add new bug exposed centi_unfinished.svg. + + BUGS | 7 +++++++ + ChangeLog | 10 ++++++++++ + TODO | 2 ++ + src/cairo-polygon.c | 5 ++--- + src/cairo-spline.c | 5 ++--- + src/cairo-traps.c | 2 -- + src/cairo_polygon.c | 5 ++--- + src/cairo_spline.c | 5 ++--- + src/cairo_traps.c | 2 -- + 9 files changed, 27 insertions(+), 16 deletions(-) + +commit f76d898cf1f14305e1cc984d0f2f40c831aa9014 +Author: Carl Worth +Date: Thu Dec 23 11:10:08 2004 +0000 + + Rename __internal_linkage to pixman_private. + Track rename to pixman_private and move it to before the function return value to quiet gcc warnings about visibility attribute ignored for non-class type. + + pixman/ChangeLog | 15 +++++++++++++++ + pixman/configure.in | 12 ++++++++++++ + pixman/src/Makefile.am | 2 +- + pixman/src/icimage.h | 24 ++++++++++++------------ + pixman/src/icint.h | 36 ++++++++++++++++++------------------ + pixman/src/icrop.h | 6 +++--- + pixman/src/slim_internal.h | 15 ++++++++------- + 7 files changed, 69 insertions(+), 41 deletions(-) + +commit cd21775ef9ee1c4ef2742abd50a6edc99bfbe639 +Author: Carl Worth +Date: Thu Dec 23 11:00:01 2004 +0000 + + Fix to actually call pixman_fill_rect_32bpp in the 32 bpp case. Thanks to TOKUNAGA Hiroyuki . (pixman_fill_rect_8bpp, pixman_fill_rect_32bpp): Fix typo in naming: bbp -> bpp. + + pixman/ChangeLog | 8 ++++++++ + pixman/src/icrect.c | 10 +++++----- + 2 files changed, 13 insertions(+), 5 deletions(-) + +commit e5d48545e027316e8ace74eada9e6b682d219595 +Author: Carl Worth +Date: Tue Dec 21 13:22:44 2004 +0000 + + Rename __internal_linkage to cairo_private and move it to the beginning of the line for function declarations. Also, drop unneeded "extern" from function declarations. + + ChangeLog | 8 + + src/cairo-wideint.h | 4 +- + src/cairo_wideint.h | 4 +- + src/cairoint.h | 417 ++++++++++++++++++++++++++-------------------------- + 4 files changed, 220 insertions(+), 213 deletions(-) + +commit 1a21b8289fcbfb808852d152f13f0ff0da935c9c +Author: Carl Worth +Date: Tue Dec 21 13:14:45 2004 +0000 + + With thanks to Kristian Høgsberg : + Tag a few private functions/data that were missing __internal_linkage. + Mark cache backends as static. + + ChangeLog | 11 +++++++++++ + src/cairo-font.c | 6 ++---- + src/cairo-ft-font.c | 3 +-- + src/cairo-wideint.h | 20 ++++++++++---------- + src/cairo-xlib-surface.c | 2 +- + src/cairo_font.c | 6 ++---- + src/cairo_ft_font.c | 3 +-- + src/cairo_wideint.h | 20 ++++++++++---------- + src/cairo_xlib_surface.c | 2 +- + src/cairoint.h | 11 +++++------ + 10 files changed, 44 insertions(+), 40 deletions(-) + +commit 8ffb7df16c137a87b14039f6e17d090f9e73468f +Author: Carl Worth +Date: Tue Dec 21 12:57:33 2004 +0000 + + Change "head -1" to more standard "head -n 1". + + ChangeLog | 5 +++++ + autogen.sh | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 153bf60b3a68266196a007167fc44b7df66ee73b +Author: Alexander Larsson +Date: Mon Dec 20 12:22:50 2004 +0000 + + Fix bug in earlier change. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 4 +++- + src/cairo_xlib_surface.c | 4 +++- + 3 files changed, 11 insertions(+), 2 deletions(-) + +commit eecfec86f1646f185555fd1fb0a65a0a345fa49a +Author: Carl Worth +Date: Mon Dec 20 09:53:06 2004 +0000 + + Re-enabled __internal_linkage for all internal functions. Now avoid the warning by moving the * from the return type after the __internal_linkage macro. It looks awaful, but it keeps the compiler quiet. + + BUGS | 12 ------------ + ChangeLog | 7 +++++++ + src/cairoint.h | 34 ++++++++++++---------------------- + 3 files changed, 19 insertions(+), 34 deletions(-) + +commit 5c1c5e67dc18c3ad96a1d885b4c7331d48036158 +Author: Alexander Larsson +Date: Mon Dec 20 09:43:59 2004 +0000 + + Add _cairo_gstate_restore_external_state, _cairo_fixed_integer_floor and _cairo_fixed_integer_ceil. + Call _cairo_gstate_restore_external_state on restore. + Fix cache-misses. + Implement floor and ceil + Restore surface clip region on restroe. + (_calculate_region_for_intermediate_clip_surface), (_cairo_gstate_clip_and_composite_trapezoids), (_cairo_gstate_show_surface), (_cairo_gstate_show_glyphs): Create intermediate clip surfaces of the minimal required size. + + ChangeLog | 26 +++++ + src/cairo-cache.c | 10 +- + src/cairo-fixed.c | 18 ++++ + src/cairo-gstate.c | 295 +++++++++++++++++++++++++++++++++++++++++------------ + src/cairo-hash.c | 10 +- + src/cairo.c | 6 ++ + src/cairo_cache.c | 10 +- + src/cairo_fixed.c | 18 ++++ + src/cairo_gstate.c | 295 +++++++++++++++++++++++++++++++++++++++++------------ + src/cairoint.h | 10 ++ + 10 files changed, 554 insertions(+), 144 deletions(-) + +commit 8fe87a32a8bf4754a24e27aad74c1f1f5dbe9fc7 +Author: Carl Worth +Date: Mon Dec 20 08:58:38 2004 +0000 + + Add Alexander Larsson to AUTHORS list. + + AUTHORS | 1 + + ChangeLog | 2 ++ + 2 files changed, 3 insertions(+) + +commit cc0c442d0480723d7c594b262962041f3a45817f +Author: Carl Worth +Date: Mon Dec 20 08:56:50 2004 +0000 + + Split off from _cairo_xlib_surface_create to avoid roundtrip when size is already known. (cairo_xlib_surface_create): Simplified to just call XGetGeometry that defer to _cairo_xlib_surface_create_with_size. Add comment about remaining roundtrip and possible plans to eliminate it later with a new interface requiring width/height. Thanks to Alexander Larsson . + + ChangeLog | 1 + + 1 file changed, 1 insertion(+) + +commit e3fe2138fe9b1446690e75ac87aba2b6aeacd3c0 +Author: Carl Worth +Date: Mon Dec 20 08:52:47 2004 +0000 + + Split off from _cairo_xlib_surface_create to avoid roundtrip when size is already known. (cairo_xlib_surface_create): Simplified to just call XGetGeometry that defer to _cairo_xlib_surface_create_with_size. Add comment about remaining roundtrip and possible plans to eliminate it later with a new interface requiring width/height. + + ChangeLog | 8 +++++++ + src/cairo-xlib-surface.c | 62 +++++++++++++++++++++++++++++++++++------------- + src/cairo_xlib_surface.c | 62 +++++++++++++++++++++++++++++++++++------------- + 3 files changed, 100 insertions(+), 32 deletions(-) + +commit 682202fdfa37c040c45ebb8b4191f2dfaca8f064 +Author: Carl Worth +Date: Mon Dec 20 08:08:29 2004 +0000 + + Disabled test that was killing my machine for some reason. Scary. + + ChangeLog | 5 +++++ + test/text-cache-crash.c | 20 ++++++++++++++++++++ + test/text_cache_crash.c | 20 ++++++++++++++++++++ + 3 files changed, 45 insertions(+) + +commit 725d363877e5aaa49c3cc57efda621c0d4f8b1bd +Author: Carl Worth +Date: Mon Dec 20 07:38:38 2004 +0000 + + Change return value from cairo_status_t to cairo_int_status_t to match definition in cairo_surface_backend_t. + + ChangeLog | 5 +++++ + src/cairo-image-surface.c | 2 +- + src/cairo_image_surface.c | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit 31534f264cb5bb9cbbcf2cf82dfe9cb7ea021726 +Author: Carl Worth +Date: Mon Dec 20 07:32:45 2004 +0000 + + Add bug about gcc 3.4 warning: '__visibility__' attribute ignored on non-class types. + Remove __internal_linkage macro from all functions returning pointers to shut up warning from gcc 3.4. + + BUGS | 12 ++++++++++++ + ChangeLog | 8 ++++++++ + src/cairoint.h | 34 ++++++++++++++++++++++------------ + 3 files changed, 42 insertions(+), 12 deletions(-) + +commit e291f1d88254e69986aa6abe7c44540621fffeab +Author: Alexander Larsson +Date: Mon Dec 20 06:15:21 2004 +0000 + + Special case solid color rectangle fills. + + pixman/ChangeLog | 7 +++ + pixman/src/icrect.c | 174 +++++++++++++++++++++++++++++++++++++++++++++------- + 2 files changed, 158 insertions(+), 23 deletions(-) + +commit a827069cc521935eb75211668f2331ac078ecb41 +Author: Carl Worth +Date: Fri Dec 17 13:23:32 2004 +0000 + + Fix to find reference images in local directory when run directly, (rather than by "make check"). + + ChangeLog | 3 +++ + test/cairo-test.c | 2 +- + test/cairo_test.c | 2 +- + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit 5c33c78c8ca551abc5bf28bb7cd1c29d60687ed5 +Author: Carl Worth +Date: Fri Dec 17 11:31:05 2004 +0000 + + Add bug about invalidating font caches. + + BUGS | 4 ++++ + ChangeLog | 4 ++++ + 2 files changed, 8 insertions(+) + +commit e656b1f3ba99641e82e603fe5dcbc0c0cc8b8f31 +Author: Øyvind KolÃ¥s +Date: Mon Dec 6 00:01:45 2004 +0000 + + normalizing ChangeLog headers + + ChangeLog | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit cb0364a28c4b9c950bf736f1ef87e0d884f864a3 +Author: David Reveman +Date: Wed Dec 1 16:27:18 2004 +0000 + + Revert clipping changes + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 6 +++++- + src/cairo_gstate.c | 6 +++++- + 3 files changed, 16 insertions(+), 2 deletions(-) + +commit e5d50e075937c0d34808451ead09f8a5537f9f6d +Author: Carl Worth +Date: Mon Nov 29 18:25:23 2004 +0000 + + Fix typo: LPGL->LGPL. + + COPYING | 2 +- + ChangeLog | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit d098370411b934ef60b99ca585ae7c100f98867d +Author: Carl Worth +Date: Mon Nov 29 14:11:26 2004 +0000 + + Remove unintentional copyright statement from user-generated output image. + + ChangeLog | 6 ++++++ + src/cairo-ps-surface.c | 2 -- + src/cairo_ps_surface.c | 2 -- + 3 files changed, 6 insertions(+), 4 deletions(-) + +commit 5c143241df52440ac9e1f9a7aa7b130bae622c5e +Author: Carl Worth +Date: Tue Nov 23 13:38:09 2004 +0000 + + Note that text_cache_crash is expected to fail. + Add test to demonstrate bug when item is too big for cache. + Really remove that refcount assertion this time. + + ChangeLog | 9 +++++++++ + src/cairo-cache.c | 3 --- + src/cairo-hash.c | 3 --- + src/cairo_cache.c | 3 --- + test/Makefile.am | 2 +- + test/text-cache-crash.c | 6 ++++++ + test/text_cache_crash.c | 6 ++++++ + 7 files changed, 22 insertions(+), 10 deletions(-) + +commit 7478ea5051306cf38ed29d9c9faa4c0263f413b8 +Author: Carl Worth +Date: Tue Nov 23 12:53:46 2004 +0000 + + Add note that bug has been fixed. (main): Instrumentation code for testing cache destruction. + Support tests that produce no output, (don't check image if (width,height) == (0,0)). + Add #include here rather than in multiple .c files. + Add const qualifier to static cache_arrangements table. (_cache_sane_state): Remove refcount assertion as it it false during the cairo_cache_destroy. (_cache_sane_state): #include moved up to cairoint.h (_entry_destroy): Fix bug in assertion (used_memory >= entry->memory), not >. (_cairo_cache_destroy): Fix timing of refcount decrement so that the destroy function actually works. + + BUGS | 7 +++++++ + ChangeLog | 21 +++++++++++++++++++++ + src/cairo-cache.c | 15 +++++++-------- + src/cairo-hash.c | 15 +++++++-------- + src/cairo_cache.c | 15 +++++++-------- + src/cairoint.h | 8 +++----- + test/cairo-test.c | 7 +++++++ + test/cairo_test.c | 7 +++++++ + test/text-cache-crash.c | 32 +++++++++++++++++++++++++++----- + test/text_cache_crash.c | 32 +++++++++++++++++++++++++++----- + 10 files changed, 120 insertions(+), 39 deletions(-) + +commit 78f1206bf8d71d56117fa5dee95b1314f7b1421c +Author: Carl Worth +Date: Sun Nov 14 10:07:54 2004 +0000 + + Don't destroy a NULL font. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 4 ++-- + src/cairo_gstate.c | 4 ++-- + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit 2b76ec2d467ff3cf1f23431729ed3a8887cdfcdb +Author: Carl Worth +Date: Sat Nov 13 19:46:18 2004 +0000 + + Unconditionally destroy the old font, (otherwise, if the same font was selected twice in a row, a reference was lost to it, leading to assertion failures). + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 15 ++++----------- + src/cairo_gstate.c | 15 ++++----------- + 3 files changed, 15 insertions(+), 22 deletions(-) + +commit d29237e9c0a93595bbca4506f35cbaec33080198 +Author: Stuart Parmenter +Date: Fri Nov 12 14:46:23 2004 +0000 + + Added GDI+ backend to Cairo. + + ChangeLog | 4 + + src/cairo_gdip_font.cpp | 666 +++++++++++++++++++++++++++++++++++++++++ + src/cairo_gdip_surface.cpp | 724 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 1394 insertions(+) + +commit b6a2e10301a6670b9678afcc7fda8c1826dd72c8 +Author: Carl Worth +Date: Fri Nov 12 06:12:20 2004 +0000 + + Move declarations above statements to satisfy pre-C99 compilers. Thanks to Michael Johnson . + + ChangeLog | 7 +++++++ + src/cairo-font.c | 5 ++--- + src/cairo-ft-font.c | 7 +++---- + src/cairo_font.c | 5 ++--- + src/cairo_ft_font.c | 7 +++---- + 5 files changed, 17 insertions(+), 14 deletions(-) + +commit 10deb4c4ae149cb3677f84aef0a8f72d4e919074 +Author: Carl Worth +Date: Thu Nov 11 12:15:12 2004 +0000 + + Added BUG entry + + BUGS | 5 +++++ + ChangeLog | 2 ++ + 2 files changed, 7 insertions(+) + +commit fe728e55323c999a97075e3f6906f978cda2f7ce +Author: Carl Worth +Date: Tue Nov 9 14:27:32 2004 +0000 + + (draw): Move x_off, y_off calculation outside of loop to emphasize loop-independence. + + test/text-rotate.c | 16 ++++++++-------- + test/text_rotate.c | 16 ++++++++-------- + 2 files changed, 16 insertions(+), 16 deletions(-) + +commit 9dacc32fbc4acd00795805244dd0d2a4faa48818 +Author: Carl Worth +Date: Tue Nov 9 14:22:37 2004 +0000 + + Increase size and increase number of different angles drawn. (draw): Fix broken usage of extents (missing bearings), add stroked bounding box (shifted out by 0.5 units to just abut the text), and increase position adjustments to make room for this larger box. + + ChangeLog | 9 +++++++++ + test/text-rotate.c | 32 ++++++++++++++++++-------------- + test/text_rotate.c | 32 ++++++++++++++++++-------------- + 3 files changed, 45 insertions(+), 28 deletions(-) + +commit a373313c736b61e00118afd8a631a99b852e3bde +Author: Dave Beckett +Date: Mon Nov 8 14:15:31 2004 +0000 + + Fix the bit that patch --reverse failed to do. "cvs diff -r1.256 ChangeLog" is just my change now. + + ChangeLog | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 128 insertions(+), 1 deletion(-) + +commit 186f14eeb627a047af495f68efd75480b52501fe +Author: Dave Beckett +Date: Mon Nov 8 14:08:16 2004 +0000 + + Restore the huge bit of ChangeLog I just deleted, then add my 6 lines. + + ChangeLog | 349 +++++++++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 220 insertions(+), 129 deletions(-) + +commit 9d032378848167e7dc9a66e4f8c5423abe3798c7 +Author: Dave Beckett +Date: Mon Nov 8 13:33:42 2004 +0000 + + require libpixman 0.1.2 since src/cairo_glitz_surface.c depends on two new functions of 0.1.2 - pixman_format_get_masks and pixman_image_get_format + + ChangeLog | 226 ++--------------------------------------------------------- + configure.in | 2 +- + 2 files changed, 8 insertions(+), 220 deletions(-) + +commit ed08ea6bba0ad1528b0073e7ef6c4bfa7f6b5154 +Author: Graydon Hoare +Date: Fri Nov 5 10:57:50 2004 +0000 + + Change the signs of a variety of metrics, which were backwards. + Return early if we found a rectangular clip at all, not just in error case. + Give render glyphset entry the negative bbox offsets it wants, not the bearings. + + ChangeLog | 10 ++++++++++ + src/cairo-ft-font.c | 34 +++++++++++++++++++++++----------- + src/cairo-gstate.c | 2 +- + src/cairo-image-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 41 +++++++++++++++++++++++++++++++++++++++-- + src/cairo_ft_font.c | 34 +++++++++++++++++++++++----------- + src/cairo_gstate.c | 2 +- + src/cairo_image_surface.c | 4 ++-- + src/cairo_xlib_surface.c | 41 +++++++++++++++++++++++++++++++++++++++-- + 9 files changed, 140 insertions(+), 32 deletions(-) + +commit 12a86de2c4dbcd44797a4ddf719c6450c6a4e4b0 +Author: Carl Worth +Date: Thu Nov 4 14:23:50 2004 +0000 + + Add new test demonstrating assertion failure in cairo_cache_lookup. + Add new test showing problems with rotated text. + + ChangeLog | 8 ++++ + Makefile.am | 1 - + RELEASING | 2 +- + test/.cvsignore | 2 + + test/Makefile.am | 13 ++++-- + test/cairo-test.h | 1 + + test/cairo_test.h | 1 + + test/text-cache-crash.c | 85 ++++++++++++++++++++++++++++++++++++ + test/text-rotate.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/text_cache_crash.c | 85 ++++++++++++++++++++++++++++++++++++ + test/text_rotate.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ + 11 files changed, 419 insertions(+), 5 deletions(-) + +commit ca61417f7d7562862affd0381b741df260f4a3bb +Author: David Reveman +Date: Wed Nov 3 15:28:37 2004 +0000 + + Tracking changes to glitz + + ChangeLog | 11 +++ + configure.in | 2 +- + src/cairo-glitz-surface.c | 227 +++++++++++++++++++++++++++++++--------------- + src/cairo_glitz_surface.c | 227 +++++++++++++++++++++++++++++++--------------- + 4 files changed, 322 insertions(+), 145 deletions(-) + +commit f1cf7d43318cf0841aed5cc82e1583eb3222c079 +Author: David Reveman +Date: Wed Nov 3 15:05:24 2004 +0000 + + Fixed return status of _cairo_gstate_clip + + ChangeLog | 4 ++++ + src/cairo-gstate.c | 2 +- + src/cairo_gstate.c | 2 +- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit 32cde60a0568fd1a0377b5346f419a212bc0628d +Author: Olivier Andrieu +Date: Mon Nov 1 07:58:27 2004 +0000 + + remove cairo_ft_font_destroy() prototype. + + ChangeLog | 4 ++++ + src/cairo.h | 3 --- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 0340265ce470e12ed434cbcde56f44a01e06c046 +Author: Carl Worth +Date: Thu Oct 28 08:48:07 2004 +0000 + + Abort release-publish if there's already a published tar file with the current version. (release-publish): Add code to update the LATEST-package-version file. + + pixman/ChangeLog | 7 +++++++ + pixman/Makefile.am | 25 ++++++++++++++++--------- + pixman/RELEASING | 8 +++++--- + 3 files changed, 28 insertions(+), 12 deletions(-) + +commit 2473e782ca5e92cb70837daf4d2950253170fe66 +Author: Carl Worth +Date: Thu Oct 28 08:36:42 2004 +0000 + + Abort release-publish if there's already a published tar file with the current version. (release-publish): Add code to update the LATEST-package-version file. + + ChangeLog | 7 +++++++ + Makefile.am | 16 +++++++++++++--- + RELEASING | 10 ++++++---- + 3 files changed, 26 insertions(+), 7 deletions(-) + +commit 327dc6f2ae304aa0536123bf8224a53290f72c29 +Author: Carl Worth +Date: Wed Oct 27 13:19:39 2004 +0000 + + Add note on reverted tessellation regression bugs. + + ChangeLog | 1 + + NEWS | 8 ++++++++ + 2 files changed, 9 insertions(+) + +commit d18aad05f33b903ec2ce2d5b5159ea1193af819c +Author: Carl Worth +Date: Wed Oct 27 13:13:39 2004 +0000 + + Increment CAIRO_VERSION to 0.2.0. + Add notes for snapshot 0.2.0. + + .cvsignore | 1 + + ChangeLog | 4 +++ + NEWS | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- + RELEASING | 6 ++++- + configure.in | 2 +- + 5 files changed, 84 insertions(+), 8 deletions(-) + +commit 377983fdf320cf98061fed9cec1870712855871a +Author: Carl Worth +Date: Wed Oct 27 11:59:56 2004 +0000 + + Update release instructions for new release-publish target. + Add release-check and release-publish targets copied from libpixman. + + ChangeLog | 6 ++++++ + Makefile.am | 40 ++++++++++++++++++++++++++++++++++ + RELEASING | 71 +++++++++++++++++++++++++++++-------------------------------- + 3 files changed, 80 insertions(+), 37 deletions(-) + +commit 39d57762a65f8b16e27c56435217cc96e8c68a23 +Author: Carl Worth +Date: Wed Oct 27 11:42:45 2004 +0000 + + Fix to always link tests against locally built library, not installed version. + + ChangeLog | 3 +++ + test/Makefile.am | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 1839d679b1a9b60b9c153183df8380061fdd7e64 +Author: Carl Worth +Date: Wed Oct 27 10:53:44 2004 +0000 + + Put the tag command back which was accidentally removed from the instructions. + + pixman/ChangeLog | 3 +++ + pixman/RELEASING | 6 +++++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 667fa8fc15044f1d488aa98a74c29206b921d57e +Author: Carl Worth +Date: Wed Oct 27 10:48:58 2004 +0000 + + Add new test for cairo_set_fill_rule. Also demonstrate some of the current tessellation bugs with the version of the code that is in CVS. + + ChangeLog | 6 ++++ + test/.cvsignore | 1 + + test/Makefile.am | 26 +++++++++----- + test/fill-rule-ref.png | Bin 0 -> 408 bytes + test/fill-rule.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ + test/fill_rule-ref.png | Bin 0 -> 408 bytes + test/fill_rule.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 204 insertions(+), 9 deletions(-) + +commit 944b1721e1910bc4d8caa97ae946b769f9ad2d8a +Author: Carl Worth +Date: Wed Oct 27 09:43:22 2004 +0000 + + Suggest "cvs -q update -Ad" as an alternative to checkout. + + pixman/ChangeLog | 1 + + pixman/RELEASING | 3 +++ + 2 files changed, 4 insertions(+) + +commit ed1ad714174abd3354d2dc3991b596d83f6330bf +Author: Carl Worth +Date: Wed Oct 27 09:37:34 2004 +0000 + + Update date since 0.1.2 release didn't get pushed out until today. + Update release instructions to include new release-publish target. + Add release-check and release-publish targets to simplify the release process. + + pixman/.cvsignore | 2 +- + pixman/ChangeLog | 11 +++++++++++ + pixman/Makefile.am | 42 ++++++++++++++++++++++++++++++++++++++++ + pixman/NEWS | 2 +- + pixman/RELEASING | 57 ++++++++++++++++++++++-------------------------------- + pixman/TODO | 10 ++++++++++ + 6 files changed, 88 insertions(+), 36 deletions(-) + +commit 19d3fc2399a05a3802b1cb2ced55139fa85a68b8 +Author: Carl Worth +Date: Wed Oct 27 07:26:36 2004 +0000 + + Switch from two different buggy mod macros to a new MOD macro which should work in C89 or C99. + + pixman/ChangeLog | 5 +++++ + pixman/NEWS | 7 ++++--- + pixman/src/ic.c | 10 ++++------ + pixman/src/iccompose.c | 18 ++++++++---------- + pixman/src/icint.h | 10 +++++++++- + 5 files changed, 30 insertions(+), 20 deletions(-) + +commit 083de7201755e1b4b322cf2308607f8f3c60a9d8 +Author: Carl Worth +Date: Tue Oct 26 18:19:55 2004 +0000 + + Find reference images in so that make distcheck will work. + Add header files so that make distcheck is happy. (INCLUDES): Add -D_GNU_SOURCE for asprintf. Someone motivated may want to find a more portable approach. (EXTRA_DIST): Add reference images for the sake of make distcheck. + + ChangeLog | 9 +++++++++ + test/Makefile.am | 26 +++++++++++++++++++++----- + test/cairo-test.c | 29 ++++++++++++++++++----------- + test/cairo_test.c | 29 ++++++++++++++++++----------- + 4 files changed, 66 insertions(+), 27 deletions(-) + +commit 240276d7920d1c03e32e9a90f826f891f3cd3fcf +Author: Carl Worth +Date: Tue Oct 26 16:59:22 2004 +0000 + + Shell doesn't like whitespace around assignment operator. + + ChangeLog | 3 +++ + configure.in | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 211b19b47575741a70901c10fe0e2d9aec8aa37b +Author: Carl Worth +Date: Tue Oct 26 16:31:31 2004 +0000 + + Add paragraph on new features. + + ChangeLog | 2 ++ + test/README | 11 ++++++++++- + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit f8e632ab1e0673cecd2ea68b3c0e6747b74d7cd6 +Author: Carl Worth +Date: Tue Oct 26 14:38:43 2004 +0000 + + Add initial regression test suite. + Don't AC_SUBST a dozen different FOO_CFLAGS and FOO_LIBS. Instead, incrementally build up just CAIRO_CFLAGS and CAIRO_LIBS. + Don't list flags that should get picked up via dependency information through Requires. + Add description of move_to_show_surface. + + BUGS | 11 +++ + ChangeLog | 27 ++++++ + Makefile.am | 2 +- + cairo.pc.in | 2 +- + configure.in | 41 +++++--- + src/Makefile.am | 4 +- + test/.cvsignore | 10 ++ + test/Makefile.am | 29 ++++++ + test/README | 55 +++++++++++ + test/cairo-test.c | 191 ++++++++++++++++++++++++++++++++++++++ + test/cairo-test.h | 50 ++++++++++ + test/cairo_test.c | 191 ++++++++++++++++++++++++++++++++++++++ + test/cairo_test.h | 50 ++++++++++ + test/line-width-ref.png | Bin 0 -> 167 bytes + test/line-width.c | 63 +++++++++++++ + test/line_width-ref.png | Bin 0 -> 167 bytes + test/line_width.c | 63 +++++++++++++ + test/move-to-show-surface-ref.png | Bin 0 -> 100 bytes + test/move-to-show-surface.c | 69 ++++++++++++++ + test/move_to_show_surface-ref.png | Bin 0 -> 100 bytes + test/move_to_show_surface.c | 69 ++++++++++++++ + test/read-png.c | 166 +++++++++++++++++++++++++++++++++ + test/read-png.h | 45 +++++++++ + test/read_png.c | 166 +++++++++++++++++++++++++++++++++ + test/read_png.h | 45 +++++++++ + test/write-png.c | 102 ++++++++++++++++++++ + test/write-png.h | 35 +++++++ + test/write_png.c | 102 ++++++++++++++++++++ + test/write_png.h | 35 +++++++ + test/xmalloc.c | 58 ++++++++++++ + test/xmalloc.h | 35 +++++++ + 31 files changed, 1698 insertions(+), 18 deletions(-) + +commit bf8374dba260c80ae8ee33c1eb5bddf39ae649f4 +Author: Carl Worth +Date: Thu Oct 21 18:40:50 2004 +0000 + + Convert all files to utf-8. Add copyright information to cairo_png_surface.c. + + ChangeLog | 31 +++++++++++++++++++++++++++++++ + src/cairo-cache.c | 2 +- + src/cairo-color.c | 2 +- + src/cairo-fixed.c | 2 +- + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 2 +- + src/cairo-glitz-surface.c | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-hash.c | 2 +- + src/cairo-hull.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fill.c | 2 +- + src/cairo-path-stroke.c | 2 +- + src/cairo-path.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-pen.c | 2 +- + src/cairo-polygon.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-slope.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-traps.c | 2 +- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairo_cache.c | 2 +- + src/cairo_color.c | 2 +- + src/cairo_fixed.c | 2 +- + src/cairo_font.c | 2 +- + src/cairo_ft_font.c | 2 +- + src/cairo_glitz_surface.c | 2 +- + src/cairo_gstate.c | 2 +- + src/cairo_hull.c | 2 +- + src/cairo_image_surface.c | 2 +- + src/cairo_matrix.c | 2 +- + src/cairo_path.c | 2 +- + src/cairo_path_bounds.c | 2 +- + src/cairo_path_fill.c | 2 +- + src/cairo_path_stroke.c | 2 +- + src/cairo_pattern.c | 2 +- + src/cairo_pen.c | 2 +- + src/cairo_png_surface.c | 37 +++++++++++++++++++++++++++++++++++++ + src/cairo_polygon.c | 2 +- + src/cairo_ps_surface.c | 2 +- + src/cairo_slope.c | 2 +- + src/cairo_spline.c | 2 +- + src/cairo_surface.c | 2 +- + src/cairo_traps.c | 2 +- + src/cairo_xcb_surface.c | 2 +- + src/cairo_xlib_surface.c | 2 +- + src/cairoint.h | 2 +- + 54 files changed, 120 insertions(+), 52 deletions(-) + +commit 215d5c5a46b7523faa31d2f1d087123a7fd54f32 +Author: Carl Worth +Date: Thu Oct 21 18:26:25 2004 +0000 + + Fix comparison so that it results in a stable sort. This should fix some rendering bugs due to broken pens. + + ChangeLog | 4 ++++ + src/cairo-hull.c | 7 +++++-- + src/cairo_hull.c | 7 +++++-- + 3 files changed, 14 insertions(+), 4 deletions(-) + +commit de115d07c35ec59e65d27bbfeced9af5a9df43c0 +Author: Carl Worth +Date: Thu Oct 21 08:55:46 2004 +0000 + + Add items on custom caps and getting access to hidden image data + + ChangeLog | 3 +++ + TODO | 13 +++++++++++-- + 2 files changed, 14 insertions(+), 2 deletions(-) + +commit 07677744429a5664af30dcbae5bd67d26ba64401 +Author: Carl Worth +Date: Thu Oct 21 08:51:52 2004 +0000 + + Add COPYING-LGPL-2.1 and COPYING-MPL-1.1 to the distribution. + + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit fe2b2c0abf64ad67f9f128c29d2ecd24d8fbac2a +Author: Carl Worth +Date: Thu Oct 21 08:31:21 2004 +0000 + + Makefile.am + + ChangeLog | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ce5f903ea84c398f0766fefdafc4f0866fc2c429 +Author: Carl Worth +Date: Wed Oct 13 11:13:51 2004 +0000 + + Fix email address in ChangeLog + + pixman/ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 06788edb0af0b1c15823022747c58e5d595d9960 +Author: Carl Worth +Date: Wed Oct 13 11:01:42 2004 +0000 + + Add notes for snapshot 0.1.2 + Increment version to 0.1.2 + + pixman/ChangeLog | 6 ++++++ + pixman/NEWS | 24 ++++++++++++++++++++++++ + pixman/configure.in | 3 +-- + 3 files changed, 31 insertions(+), 2 deletions(-) + +commit d8b24a4ee035071db8b65c1fcc37ef467b70e2c7 +Author: Carl Worth +Date: Wed Oct 13 08:18:38 2004 +0000 + + automake 1.4 seems to be sufficient. Don't require 1.6. + + ChangeLog | 5 +++++ + autogen.sh | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit f9b0020850ac62f37989e6828a69ddaa421d722b +Author: Keith Packard +Date: Tue Oct 12 14:17:23 2004 +0000 + + Compute extents of cairo_traps_t on the fly using approximate method which is correct given the way cairo generates trapezoids. + Avoid zero-dimensioned pixmaps + + ChangeLog | 11 +++++ + src/cairo-traps.c | 105 +++++++++++++++++++++++++---------------------- + src/cairo-xlib-surface.c | 2 +- + src/cairo_traps.c | 105 +++++++++++++++++++++++++---------------------- + src/cairo_xlib_surface.c | 2 +- + src/cairoint.h | 1 + + 6 files changed, 126 insertions(+), 100 deletions(-) + +commit 047ce336000d595bcc123bb3647c44d239e1b89a +Author: Carl Worth +Date: Tue Oct 12 14:09:37 2004 +0000 + + Fix a few typos in pen vertex math description. + + ChangeLog | 4 ++++ + src/cairo-pen.c | 6 +++--- + src/cairo_pen.c | 6 +++--- + 3 files changed, 10 insertions(+), 6 deletions(-) + +commit cc890b9cf4d2a38e13ae48e16589c4fd02678f99 +Author: Keith Packard +Date: Tue Oct 12 12:29:29 2004 +0000 + + Adapt function from Walter Brisken to compute pen ellipse major axis length and use that to compute the required number of pen vertices. + reviewed by: Carl Worth + + ChangeLog | 9 ++ + src/cairo-pen.c | 273 +++++++++++++++++++++++++++++++++++++++++++++++++++----- + src/cairo_pen.c | 273 +++++++++++++++++++++++++++++++++++++++++++++++++++----- + 3 files changed, 511 insertions(+), 44 deletions(-) + +commit 30131aa4638f9bba6148114d3c60770592d6583b +Author: Graydon Hoare +Date: Fri Oct 8 12:09:49 2004 +0000 + + Add cairo_cache.c + Rewrite using temporary glyph arrays + New file. + Remove old glyph cache code. (_cairo_font_scale) (_cairo_font_transform): Remove font-transforming code. (_cairo_font_text_extents) (_cairo_font_text_bbox) (_cairo_font_show_text) (_cairo_font_text_path): Remove text-API code. (_cairo_font_cache_key_t): New structure type. (_font_cache_hash) (_font_cache_keys_equal) (_font_cache_create_entry) (_font_cache_destroy_entry) (_font_cache_destroy_cache): New font cache code. (_global_font_cache) (_lock_global_font_cache) (_unlock_global_font_cache) (_get_global_font_cache): New global font cache. (_cairo_font_text_to_glyphs) (_cairo_glyph_cache_hash) (_cairo_glyph_cache_keys_equal) (_image_glyph_cache_create_entry) (_image_glyph_cache_destroy_entry) (_image_glyph_cache_destroy_cache): New glyph cache code. (_global_image_glyph_cache) (_cairo_lock_global_image_glyph_cache) (_cairo_unlock_global_image_glyph_cache) (_cairo_get_global_image_glyph_cache): New global glyph cache. (_cairo_font_cache_backend): New structure. (_cairo_image_cache_backend): Likewise. (_cairo_font_create): Reimplement in terms of font cache. (_cairo_font_init): Remove matrix and glyph cache related code. (_cairo_font_copy): Likewise. (_cairo_font_show_glyphs): Delegate to surface when possible. (_cairo_font_glyph_extents) (_cairo_font_glyph_bbox) (_cairo_font_glyph_path) (_cairo_font_font_extents) (_cairo_font_show_glyphs): Rename to as cairo_unscaled_font_XXX, and add scale parameter. + New structure types. (_create_from_face) (_reference_font_val) (_destroy_font_val) (_create_from_library_and_pattern): New functions. (_ft_font_cache_hash) (_ft_font_cache_keys_equal) (_ft_font_cache_create_entry) (_ft_font_cache_destroy_entry) (_ft_font_cache_destroy_cache): New ft font cache code. (_global_ft_cache) (_lock_global_ft_cache) (_unlock_global_ft_cache) (_get_global_ft_cache): New global ft font cache. (_ft_font_cache_backend): New structure. (_cairo_ft_font_create): Rewrite to use cache. (_cairo_ft_font_destroy): Likewise. (_cairo_ft_font_copy): Remove. (_install_font_matrix): Rename as _install_font_scale. (_utf8_to_glyphs): Rename as _cairo_ft_font_text_to_glyphs. (_cairo_ft_font_text_to_glyphs): Use cache for metrics. (_cairo_ft_font_extents): Accept size, use scaled metrics. (_cairo_ft_font_glyph_extents) (_cairo_ft_font_glyph_bbox) (_cairo_ft_font_show_glyphs) (_cairo_ft_font_glyph_path): Modify to use size, cache. (_cairo_ft_font_text_extents) (_cairo_ft_font_text_bbox) (_cairo_ft_font_show_text) (_cairo_ft_font_text_path): Remove text-API code. (cairo_ft_font_create) (cairo_ft_font_create_for_ft_face) (cairo_ft_font_face) (cairo_ft_font_pattern): Rewrite using ft_font_val_t. + Just reference font. (_cairo_gstate_fini): Finalize font matrix. (_cairo_gstate_default_matrix): Initialize font matrix. (_cairo_gstate_clip): Re-enable clipping rectangle. (_cairo_gstate_select_font) (_cairo_gstate_set_font): Set font matrix to identity. (_cairo_gstate_scale_font): Scale font matrix, not font. (_cairo_gstate_transform_font): Transform font matrix, not font. (_cairo_gstate_set_font_transform): Install as font matrix, not in font. (_build_font_scale): New helper function. (_cairo_gstate_text_to_glyphs): New function. (_cairo_gstate_current_font_extents) (_cairo_gstate_glyph_extents) (_cairo_gstate_show_glyphs) (_cairo_gstate_glyph_path): Rewrite using font matrix and size. (_cairo_gstate_text_path (_cairo_gstate_text_extents) (_cairo_gstate_show_text): Remove text-API code. + Minor bug fix. (_cairo_xlib_surface_show_glyphs): New function. (_cairo_xlib_surface_backend): Add reference to new function. (glyphset_cache_t) (glyphset_cache_entry_t): New structure types. (_next_xlib_glyph): New helper function. (_xlib_glyphset_cache_create_value) (_xlib_glyphset_cache_destroy_cache) (_xlib_glyphset_cache_destroy_value) (_xlib_glyphset_cache_backend): New glyphset cache code. (_xlib_glyphset_caches) (_lock_xlib_glyphset_caches) (_unlock_xlib_glyphset_caches) (_get_glyphset_cache): New global glyphset cache. + Add NULL entry for show_glyphs. + Add NULL entry for show_glyphs. + Add NULL entry for show_glyphs. + Add NULL entry for show_glyphs. + Add NULL entry for show_glyphs. + New structure type. (cairo_cache_entry_base_t) (cairo_cache_arrangement_t) (cairo_cache_t): New structure types. (_cairo_cache_init) (_cairo_cache_reference) (_cairo_cache_destroy) (_cairo_cache_lookup) (_cairo_hash_string): New cache functions. (CAIRO_IMAGE_GLYPH_CACHE_MEMORY_DEFAULT) (CAIRO_XLIB_GLYPH_CACHE_MEMORY_DEFAULT) (CAIRO_FONT_CACHE_NUM_FONTS_DEFAULT) (CAIRO_FT_CACHE_NUM_FONTS_DEFAULT): New constants. (cairo_font_scale_t) (cairo_glyph_cache_key_t) (cairo_image_glyph_cache_entry_t): New structure types. (_cairo_lock_global_image_glyph_cache) (_cairo_unlock_global_image_glyph_cache) (_cairo_get_global_image_glyph_cache) (_cairo_glyph_cache_hash) (_cairo_glyph_cache_keys_equal): New functions for glyph caches. (cairo_font_backend_t): Remove text-API calls, add scale params, remove copy call. (cairo_surface_backend_t): Add show_glyphs entry. (cairo_glyph_surface_t) (cairo_glyph_surface_node_t): Remove old glyph cache structures. (cairo_unscaled_font_t): New structure type. (cairo_font): Remove glyph cache member, add pointer to unscaled. (cairo_gstate): Add font_matrix member, change to hold unscaled. (_cairo_gstate_set_font_transform) (_cairo_gstate_current_font_transform) (_cairo_gstate_text_to_glyphs): New functions. (_cairo_gstate_text_path (_cairo_gstate_text_extents) (_cairo_gstate_show_text) (_cairo_font_text_extents) (_cairo_font_text_bbox) (_cairo_font_show_text) (_cairo_font_text_path): Remove text-API code. (_cairo_font_glyph_extents) (_cairo_font_glyph_bbox) (_cairo_font_glyph_path) (_cairo_font_font_extents) (_cairo_font_show_glyphs): Add scale parameter. + + ChangeLog | 190 +++++++++ + src/Makefile.am | 1 + + src/cairo-cache.c | 454 ++++++++++++++++++++++ + src/cairo-font.c | 659 ++++++++++++++++++------------- + src/cairo-ft-font.c | 965 +++++++++++++++++++++++++++++----------------- + src/cairo-glitz-surface.c | 3 +- + src/cairo-gstate.c | 526 +++++++++++++------------ + src/cairo-hash.c | 454 ++++++++++++++++++++++ + src/cairo-image-surface.c | 3 +- + src/cairo-ps-surface.c | 3 +- + src/cairo-xcb-surface.c | 3 +- + src/cairo-xlib-surface.c | 529 ++++++++++++++++++++++++- + src/cairo.c | 53 ++- + src/cairo_cache.c | 454 ++++++++++++++++++++++ + src/cairo_font.c | 659 ++++++++++++++++++------------- + src/cairo_ft_font.c | 965 +++++++++++++++++++++++++++++----------------- + src/cairo_glitz_surface.c | 3 +- + src/cairo_gstate.c | 526 +++++++++++++------------ + src/cairo_image_surface.c | 3 +- + src/cairo_png_surface.c | 3 +- + src/cairo_ps_surface.c | 3 +- + src/cairo_xcb_surface.c | 3 +- + src/cairo_xlib_surface.c | 529 ++++++++++++++++++++++++- + src/cairoint.h | 413 ++++++++++++-------- + 24 files changed, 5485 insertions(+), 1919 deletions(-) + +commit 56ccb883761ff0781954705795f78b8e5a1591d4 +Author: David Reveman +Date: Mon Oct 4 04:55:46 2004 +0000 + + Do not use VBOs and PBOs for immediate mode drawing + + ChangeLog | 7 +++ + configure.in | 2 +- + src/cairo-glitz-surface.c | 118 +++++++++++++++++++++------------------------- + src/cairo_glitz_surface.c | 118 +++++++++++++++++++++------------------------- + 4 files changed, 118 insertions(+), 127 deletions(-) + +commit 978e2dd0d613a6c043014b62df0c1ac7ae076581 +Author: Jamey Sharp +Date: Thu Sep 30 13:34:19 2004 +0000 + + Update for minor XCB API change. + + ChangeLog | 5 +++++ + src/cairo-xcb-surface.c | 2 +- + src/cairo_xcb_surface.c | 2 +- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit 96dfd5db6488f4b649c429471da14362c7697503 +Author: David Reveman +Date: Sun Sep 19 22:11:04 2004 +0000 + + Important fixes to glitz format handling + + ChangeLog | 11 +++++++++++ + src/cairo-glitz-surface.c | 29 ++++++++++++++++++++--------- + src/cairo_glitz_surface.c | 29 ++++++++++++++++++++--------- + 3 files changed, 51 insertions(+), 18 deletions(-) + +commit c150ea0855428f56cc12d83f4bdafec7f1ce6ce8 +Author: David Reveman +Date: Wed Sep 15 09:55:40 2004 +0000 + + Improved format handling, pixel transfers and gradients + + ChangeLog | 8 +++++ + src/cairo-glitz-surface.c | 74 ++++++++++++++++++++++++++++++----------------- + src/cairo_glitz_surface.c | 74 ++++++++++++++++++++++++++++++----------------- + 3 files changed, 104 insertions(+), 52 deletions(-) + +commit 3deeb1d1784cced73d94e8274e5c1650189b85d4 +Author: David Reveman +Date: Sun Sep 12 15:34:00 2004 +0000 + + Get pixel masks from pixman image format + + ChangeLog | 2 ++ + src/cairo-glitz-surface.c | 27 +++++++++++---------------- + src/cairo_glitz_surface.c | 27 +++++++++++---------------- + 3 files changed, 24 insertions(+), 32 deletions(-) + +commit 3a1931baba4c453226a2d0c307352569c6b2bfab +Author: David Reveman +Date: Sun Sep 12 06:06:50 2004 +0000 + + Added pixman_format_get_masks and fixed a few format issues + + pixman/AUTHORS | 2 +- + pixman/ChangeLog | 9 +++++++++ + pixman/src/icformat.c | 35 ++++++++++++++++++++++++++++++++++- + pixman/src/icimage.c | 6 ++++++ + pixman/src/pixman.h | 10 +++++++++- + 5 files changed, 59 insertions(+), 3 deletions(-) + +commit 93c27d48a3783dbf318392170edfec78af42fd4f +Author: David Reveman +Date: Sun Sep 12 05:09:32 2004 +0000 + + cairo_surface_t pointer to cairo_surface_set_repeat + + ChangeLog | 3 +++ + src/cairo-glitz-surface.c | 2 +- + src/cairo_glitz_surface.c | 2 +- + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit d0e30df8cb32550e2075efc2d1fa342fa6d8ca8b +Author: David Reveman +Date: Sat Sep 11 19:55:24 2004 +0000 + + Added function for setting component alpha + + pixman/AUTHORS | 1 + + pixman/ChangeLog | 6 ++++++ + pixman/src/icimage.c | 9 +++++++++ + pixman/src/icint.h | 1 + + pixman/src/pixman.h | 6 +++++- + 5 files changed, 22 insertions(+), 1 deletion(-) + +commit 1ba0de94fb774d1f3f8e082004adadfe897e285e +Author: David Reveman +Date: Sat Sep 11 19:42:40 2004 +0000 + + Fixed clipping + + pixman/ChangeLog | 4 ++++ + pixman/src/icimage.c | 10 +++++++++- + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 81d66588587e506781a91e7378b39f728202b317 +Author: David Reveman +Date: Sat Sep 11 19:33:23 2004 +0000 + + Byte-order fix + + pixman/ChangeLog | 5 +++++ + pixman/configure.in | 2 ++ + pixman/src/icint.h | 13 +++++++++++++ + 3 files changed, 20 insertions(+) + +commit c5786fd0fe0f0b69f3896e77705282c211ba7a77 +Author: David Reveman +Date: Sat Sep 11 19:27:59 2004 +0000 + + Added support for both transform and repeat + + pixman/AUTHORS | 1 + + pixman/ChangeLog | 7 +++++++ + pixman/src/ic.c | 8 ++++++++ + pixman/src/iccompose.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- + pixman/src/icimage.h | 3 +++ + 5 files changed, 61 insertions(+), 4 deletions(-) + +commit 4af8faee061b3b90e71badf36040daa0b8edb7d1 +Author: David Reveman +Date: Sat Sep 11 19:05:46 2004 +0000 + + Pickup repeat setting when cloning surface + + ChangeLog | 5 +++++ + src/cairo-glitz-surface.c | 2 ++ + src/cairo_glitz_surface.c | 2 ++ + 3 files changed, 9 insertions(+) + +commit 7abd103d2eb0fb7099527f16634c80df247c7a65 +Author: Carl Worth +Date: Sat Sep 11 13:29:59 2004 +0000 + + Require automake 1.6 rather than 1.7 since it seems to work just fine. + + ChangeLog | 5 +++++ + autogen.sh | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 786904f1aa0dc24f9c206387312eec81e42784d8 +Author: David Reveman +Date: Sat Sep 11 07:59:27 2004 +0000 + + Tracking color stop coordinate changes to glitz's gradient filters + + ChangeLog | 5 +++++ + configure.in | 2 +- + src/cairo-glitz-surface.c | 4 ++-- + src/cairo_glitz_surface.c | 4 ++-- + 4 files changed, 10 insertions(+), 5 deletions(-) + +commit 27d2de8c2d0ebdabf80321bf59d7e680093b4e33 +Author: David Reveman +Date: Sat Sep 11 04:23:17 2004 +0000 + + Replaced the gl backend with the new glitz backend + + ChangeLog | 18 + + cairo.pc.in | 2 +- + configure.in | 36 +- + src/Makefile.am | 10 +- + src/cairo-features.h.in | 2 +- + src/cairo-glitz-surface.c | 907 +++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 14 +- + src/cairo_gl_surface.c | 967 ---------------------------------------------- + src/cairo_glitz_surface.c | 907 +++++++++++++++++++++++++++++++++++++++++++ + 9 files changed, 1864 insertions(+), 999 deletions(-) + +commit 211cf9a2ce2f15402062ebc87f82a2b45b0cfde2 +Author: Carl Worth +Date: Sat Sep 4 07:29:16 2004 +0000 + + Add the MPL as a new license option, in addition to the LGPL. + + ChangeLog | 28 +++++++++++++++++++++++++--- + 1 file changed, 25 insertions(+), 3 deletions(-) + +commit 0f3ce6a24010b9d1416f218c447b5c68a0df85ea +Author: Carl Worth +Date: Sat Sep 4 06:38:34 2004 +0000 + + Add the MPL as a new license option, in addition to the LGPL. + + COPYING | 519 ++-------------------------------------------- + COPYING-LGPL-2.1 | 510 +++++++++++++++++++++++++++++++++++++++++++++ + COPYING-MPL-1.1 | 470 +++++++++++++++++++++++++++++++++++++++++ + ChangeLog | 8 + + src/cairo-color.c | 37 +++- + src/cairo-features.h.in | 41 ++-- + src/cairo-fixed.c | 41 ++-- + src/cairo-font.c | 37 +++- + src/cairo-gstate.c | 37 +++- + src/cairo-hull.c | 37 +++- + src/cairo-image-surface.c | 37 +++- + src/cairo-matrix.c | 37 +++- + src/cairo-path-bounds.c | 37 +++- + src/cairo-path-fill.c | 37 +++- + src/cairo-path-stroke.c | 37 +++- + src/cairo-path.c | 37 +++- + src/cairo-pen.c | 37 +++- + src/cairo-polygon.c | 37 +++- + src/cairo-ps-surface.c | 37 +++- + src/cairo-slope.c | 37 +++- + src/cairo-spline.c | 37 +++- + src/cairo-surface.c | 37 +++- + src/cairo-xcb-surface.c | 37 +++- + src/cairo-xlib-surface.c | 37 +++- + src/cairo.c | 38 +++- + src/cairo.h | 37 +++- + src/cairo_color.c | 37 +++- + src/cairo_fixed.c | 41 ++-- + src/cairo_font.c | 37 +++- + src/cairo_gstate.c | 37 +++- + src/cairo_hull.c | 37 +++- + src/cairo_image_surface.c | 37 +++- + src/cairo_matrix.c | 37 +++- + src/cairo_path.c | 37 +++- + src/cairo_path_bounds.c | 37 +++- + src/cairo_path_fill.c | 37 +++- + src/cairo_path_stroke.c | 37 +++- + src/cairo_pen.c | 37 +++- + src/cairo_polygon.c | 37 +++- + src/cairo_ps_surface.c | 37 +++- + src/cairo_slope.c | 37 +++- + src/cairo_spline.c | 37 +++- + src/cairo_surface.c | 37 +++- + src/cairo_xcb_surface.c | 37 +++- + src/cairo_xlib_surface.c | 37 +++- + src/cairoint.h | 37 +++- + 46 files changed, 2142 insertions(+), 932 deletions(-) + +commit 31d0ddbf2a6acecea8ffede9f3f3942dcbc9c035 +Author: Carl Worth +Date: Sat Aug 14 07:21:52 2004 +0000 + + Make a copy of the region since pixman is currently taking ownership of it (ugh). Thanks to Vladimir Vukicevic and Peter Dennis Bartok . + + AUTHORS | 2 ++ + ChangeLog | 6 ++++++ + src/cairo-image-surface.c | 15 ++++++++++++++- + src/cairo_image_surface.c | 15 ++++++++++++++- + 4 files changed, 36 insertions(+), 2 deletions(-) + +commit adabb18408157299940413a80a6c943de96296d5 +Author: Carl Worth +Date: Sat Aug 14 06:35:30 2004 +0000 + + Explicitly set LANG=C to fix the awk string->number conversion for user with locales that don't match ASCII digit conventions. + + ChangeLog | 6 ++++++ + autogen.sh | 3 ++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 62e4b869cd17c2fd5103d9e61656a4451624f6b9 +Author: Carl Worth +Date: Tue Aug 3 11:49:20 2004 +0000 + + Temporarily disable rectangle-based clipping optimization as it's not working (see cairo_snippets/xxx_clip_rectangle for a test case). + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 9 +++++++++ + src/cairo_gstate.c | 9 +++++++++ + 3 files changed, 24 insertions(+) + +commit e5afa03605e4e8eda39ecbf589796d1c51b8452a +Author: Carl Worth +Date: Mon Aug 2 17:04:00 2004 +0000 + + Fix to explicitly refer to GNU Lesser Public License 2.1 rather than the Library Public License version 2 or 'any later version' + + ChangeLog | 2 ++ + src/cairo-color.c | 12 +++++------- + src/cairo-features.h.in | 12 +++++------- + src/cairo-fixed.c | 12 +++++------- + src/cairo-font.c | 12 +++++------- + src/cairo-gstate.c | 12 +++++------- + src/cairo-hull.c | 12 +++++------- + src/cairo-image-surface.c | 12 +++++------- + src/cairo-matrix.c | 12 +++++------- + src/cairo-path-bounds.c | 12 +++++------- + src/cairo-path-fill.c | 12 +++++------- + src/cairo-path-stroke.c | 12 +++++------- + src/cairo-path.c | 12 +++++------- + src/cairo-pen.c | 12 +++++------- + src/cairo-polygon.c | 12 +++++------- + src/cairo-ps-surface.c | 12 +++++------- + src/cairo-slope.c | 12 +++++------- + src/cairo-spline.c | 12 +++++------- + src/cairo-surface.c | 12 +++++------- + src/cairo-xcb-surface.c | 12 +++++------- + src/cairo-xlib-surface.c | 12 +++++------- + src/cairo.c | 12 +++++------- + src/cairo.h | 12 +++++------- + src/cairo_color.c | 12 +++++------- + src/cairo_fixed.c | 12 +++++------- + src/cairo_font.c | 12 +++++------- + src/cairo_gstate.c | 12 +++++------- + src/cairo_hull.c | 12 +++++------- + src/cairo_image_surface.c | 12 +++++------- + src/cairo_matrix.c | 12 +++++------- + src/cairo_path.c | 12 +++++------- + src/cairo_path_bounds.c | 12 +++++------- + src/cairo_path_fill.c | 12 +++++------- + src/cairo_path_stroke.c | 12 +++++------- + src/cairo_pen.c | 12 +++++------- + src/cairo_polygon.c | 12 +++++------- + src/cairo_ps_surface.c | 12 +++++------- + src/cairo_slope.c | 12 +++++------- + src/cairo_spline.c | 12 +++++------- + src/cairo_surface.c | 12 +++++------- + src/cairo_xcb_surface.c | 12 +++++------- + src/cairo_xlib_surface.c | 12 +++++------- + src/cairoint.h | 12 +++++------- + 43 files changed, 212 insertions(+), 294 deletions(-) + +commit d5e92dd1c80eda83cc808abad0c8ce0905d453f7 +Author: Carl Worth +Date: Mon Aug 2 13:13:28 2004 +0000 + + Change from MIT license to LGPL. + + COPYING | 532 ++++++++++++++++++++++++++++++++++++++++++++-- + ChangeLog | 30 +++ + src/cairo-color.c | 34 ++- + src/cairo-features.h.in | 34 ++- + src/cairo-fixed.c | 34 ++- + src/cairo-font.c | 34 ++- + src/cairo-gstate.c | 34 ++- + src/cairo-hull.c | 34 ++- + src/cairo-image-surface.c | 34 ++- + src/cairo-matrix.c | 34 ++- + src/cairo-path-bounds.c | 34 ++- + src/cairo-path-fill.c | 34 ++- + src/cairo-path-stroke.c | 34 ++- + src/cairo-path.c | 34 ++- + src/cairo-pen.c | 34 ++- + src/cairo-polygon.c | 34 ++- + src/cairo-ps-surface.c | 34 ++- + src/cairo-slope.c | 34 ++- + src/cairo-spline.c | 34 ++- + src/cairo-surface.c | 34 ++- + src/cairo-xcb-surface.c | 34 ++- + src/cairo-xlib-surface.c | 34 ++- + src/cairo.c | 34 ++- + src/cairo.h | 34 ++- + src/cairo_color.c | 34 ++- + src/cairo_fixed.c | 34 ++- + src/cairo_font.c | 34 ++- + src/cairo_gstate.c | 34 ++- + src/cairo_hull.c | 34 ++- + src/cairo_image_surface.c | 34 ++- + src/cairo_matrix.c | 34 ++- + src/cairo_path.c | 34 ++- + src/cairo_path_bounds.c | 34 ++- + src/cairo_path_fill.c | 34 ++- + src/cairo_path_stroke.c | 34 ++- + src/cairo_pen.c | 34 ++- + src/cairo_polygon.c | 34 ++- + src/cairo_ps_surface.c | 34 ++- + src/cairo_slope.c | 34 ++- + src/cairo_spline.c | 34 ++- + src/cairo_surface.c | 34 ++- + src/cairo_xcb_surface.c | 34 ++- + src/cairo_xlib_surface.c | 34 ++- + src/cairoint.h | 34 ++- + 44 files changed, 1128 insertions(+), 862 deletions(-) + +commit b0a6de8f0b3830fd0af521945dcaa98d62ac69d2 +Author: Carl Worth +Date: Mon Aug 2 12:14:57 2004 +0000 + + Fix copyright attributions mistakenly attributed to University of Southern California rather than to David Reveman. + + src/cairo-pattern.c | 33 ++++++++++++++++----------------- + src/cairo_gl_surface.c | 33 ++++++++++++++++----------------- + src/cairo_pattern.c | 33 ++++++++++++++++----------------- + 3 files changed, 48 insertions(+), 51 deletions(-) + +commit a9bc4e1f5eb2d9ea78ce7c11bcb7a96d9c349f9e +Author: Carl Worth +Date: Mon Aug 2 11:51:57 2004 +0000 + + Note that cairo_clip is fixed now. + + BUGS | 6 +++--- + ChangeLog | 4 ++++ + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 0e3770e82074f76302190b853302e21113400ece +Author: Øyvind KolÃ¥s +Date: Sun Aug 1 23:03:02 2004 +0000 + + s/ct/cr/ + + ChangeLog | 5 +++++ + src/cairo.h | 20 ++++++++++---------- + 2 files changed, 15 insertions(+), 10 deletions(-) + +commit fe2ca7e7afbbb78425bb271416e69dde9bafa102 +Author: Jamey Sharp +Date: Sat Jul 24 19:30:05 2004 +0000 + + Updating for XCB API change around iterators. + + ChangeLog | 5 +++++ + src/cairo-xcb-surface.c | 8 ++++---- + src/cairo_xcb_surface.c | 8 ++++---- + 3 files changed, 13 insertions(+), 8 deletions(-) + +commit 7f87ea9a9e05541ecbc8cab04e214d15a606e3fb +Author: David Reveman +Date: Tue Jul 20 01:39:23 2004 +0000 + + Tracking changes to glitz + + ChangeLog | 11 +++++++++ + src/cairo_gl_surface.c | 66 ++++++++++++++++++++++++-------------------------- + 2 files changed, 42 insertions(+), 35 deletions(-) + +commit c95e622675ca9370f74e68e2356103e503d2a9ca +Author: David Reveman +Date: Fri Jul 16 10:25:31 2004 +0000 + + Fixed typo in earlier memory leak fix + + ChangeLog | 5 +++++ + src/cairo-font.c | 5 ++++- + src/cairo_font.c | 5 ++++- + 3 files changed, 13 insertions(+), 2 deletions(-) + +commit b306adead8b49a7aff0957a0c5aa8fd93825ff8c +Author: David Reveman +Date: Thu Jul 15 13:38:21 2004 +0000 + + Fixed glyph cache memory leak + + ChangeLog | 5 +++++ + src/cairo-font.c | 3 +++ + src/cairo_font.c | 3 +++ + 3 files changed, 11 insertions(+) + +commit 49f691ec0b3c4b780456b99c199a9be9548454af +Author: Carl Worth +Date: Sun Jul 11 18:51:55 2004 +0000 + + Don't call _cairo_surface_set_clip_region with a NULL surface. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 5 +++-- + src/cairo_gstate.c | 5 +++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit d7a392bf3015a9bc53397a277fe2003e00411ffe +Author: Carl Worth +Date: Fri Jul 9 13:47:46 2004 +0000 + + Fix numerical problem that could lead to infinite loops. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 9 +++++---- + src/cairo_gstate.c | 9 +++++---- + 3 files changed, 15 insertions(+), 8 deletions(-) + +commit 63468474d732f7e707cafb216051be7802defd00 +Author: Dave Beckett +Date: Fri Jul 9 12:47:06 2004 +0000 + + Report versions of commands on failure. Try to get version numbers from newer GNU --version formats. + + autogen.sh | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +commit 2277d8fd4fcc2529cf2584db2f252cfb38a0b3bf +Author: Dave Beckett +Date: Fri Jul 9 09:16:41 2004 +0000 + + Require automake 1.7 (and thus aclocal 1.7) which requires autoconf 2.54. Changed since newer libtools may fail to work with older automake versions such as 1.4. I bet this will annoy people with older tool chains :( + + ChangeLog | 7 ++++++ + autogen.sh | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 82 insertions(+), 1 deletion(-) + +commit 259cbd0a9bb17ca35ff27b719f935ce85e877af3 +Author: Carl Worth +Date: Mon Jul 5 09:17:22 2004 +0000 + + Remove errant semicolon from macro definition. + + ChangeLog | 5 +++++ + src/cairo.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 8b9c42e8ce3135aad4d9adc5be1c4b984c190604 +Author: Carl Worth +Date: Thu Jul 1 13:38:23 2004 +0000 + + Add missing ChangeLog entry. Add description of current tessellation bugs. + + BUGS | 5 +++++ + ChangeLog | 12 ++++++++++++ + 2 files changed, 17 insertions(+) + +commit ad398d9bda70a1e49edf126bd8576edf63b4b7a6 +Author: David Reveman +Date: Mon Jun 21 15:13:52 2004 +0000 + + Glitz updates and a minor clipping fix + + ChangeLog | 16 +++++ + configure.in | 2 +- + src/cairo-gstate.c | 26 +++++--- + src/cairo_gl_surface.c | 163 +++++++++++++++++++++++++++++++------------------ + src/cairo_gstate.c | 26 +++++--- + 5 files changed, 156 insertions(+), 77 deletions(-) + +commit 5230af4e5ad1faee3bb340ce4495e935a807b399 +Author: Keith Packard +Date: Wed Jun 16 18:16:04 2004 +0000 + + Fix image data length computation (XCB doesn't do this part). + + ChangeLog | 6 ++++++ + src/cairo-xcb-surface.c | 4 ++-- + src/cairo_xcb_surface.c | 4 ++-- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit 1e72b87b933615bbcc8b977c02b4587db0c01bde +Author: David Reveman +Date: Fri Jun 11 08:08:27 2004 +0000 + + Software multi-sample support + + ChangeLog | 11 +++++++++ + configure.in | 2 +- + src/cairo_gl_surface.c | 66 +++++++++++++++++++++++++++++++++++++++++++------- + 3 files changed, 69 insertions(+), 10 deletions(-) + +commit 06ef87276e4f070e73db8c408cb1411e8cd8467b +Author: David Reveman +Date: Fri Jun 11 06:20:17 2004 +0000 + + Pre-multiply gradients after color interpolation + + ChangeLog | 11 +++++++++++ + src/cairo-gstate.c | 12 ++++++++++-- + src/cairo-pattern.c | 37 ++++++++++++++++++++----------------- + src/cairo_gstate.c | 12 ++++++++++-- + src/cairo_pattern.c | 37 ++++++++++++++++++++----------------- + src/cairoint.h | 1 - + 6 files changed, 71 insertions(+), 39 deletions(-) + +commit f82f1ba380d9c2b4e9f41092ee149ccac0881f2e +Author: Carl Worth +Date: Fri May 28 12:47:00 2004 +0000 + + These two fixes are from David Reveman : + Move NULL test from create_similar_scratch to create_similar_solid. + Fix for when surface->backend != image->backend, but the backend does use images for similar surfaces. + + src/cairo-font.c | 6 ++++-- + src/cairo-surface.c | 14 ++++++-------- + src/cairo_font.c | 6 ++++-- + src/cairo_surface.c | 14 ++++++-------- + 4 files changed, 20 insertions(+), 20 deletions(-) + +commit 41f549a870aee35840e6e76f82d4d625c5b8ff25 +Author: Keith Packard +Date: Fri May 28 12:37:15 2004 +0000 + + Add WARN_CFLAGS, autodetection for 64/128 bit ints and cairo_wideint.[ch] + Check status return from _cairo_gstate_glyph_extents + Quiet compiler warnings about uninitialized variables + Switch to alternate exact line intersection code. + Add 64/128-bit wide integer arithmetic. + Switch to stdint.h types (and new wide types). + + ChangeLog | 44 +++ + configure.in | 16 + + src/Makefile.am | 4 +- + src/cairo-pattern.c | 4 + + src/cairo-surface.c | 2 +- + src/cairo-traps.c | 118 ++++-- + src/cairo-wideint.c | 986 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-wideint.h | 272 +++++++++++++ + src/cairo_pattern.c | 4 + + src/cairo_png_surface.c | 3 + + src/cairo_surface.c | 2 +- + src/cairo_traps.c | 118 ++++-- + src/cairo_wideint.c | 986 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_wideint.h | 272 +++++++++++++ + src/cairoint.h | 31 +- + 15 files changed, 2785 insertions(+), 77 deletions(-) + +commit 878c76807ab6c4eae60701d50a1bc7c9fadce2da +Author: David Reveman +Date: Mon May 24 02:44:59 2004 +0000 + + Moved CAIRO_CHECK_SANITY below declarations + + ChangeLog | 4 ++++ + src/cairo.c | 6 +++--- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit cdad6472111848e5167f3d71c7b4e7c3e9b2ebb6 +Author: David Reveman +Date: Mon May 24 02:28:05 2004 +0000 + + Added glyph caching + + ChangeLog | 53 ++++++++++ + NEWS | 6 ++ + src/cairo-font.c | 221 ++++++++++++++++++++++++++++++++++++++++- + src/cairo-ft-font.c | 248 ++++++++++++++++++++++++++++++++-------------- + src/cairo-gstate.c | 41 ++++---- + src/cairo-image-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-surface.c | 28 +++++- + src/cairo-xcb-surface.c | 3 +- + src/cairo-xlib-surface.c | 3 +- + src/cairo_font.c | 221 ++++++++++++++++++++++++++++++++++++++++- + src/cairo_ft_font.c | 248 ++++++++++++++++++++++++++++++++-------------- + src/cairo_gl_surface.c | 18 +++- + src/cairo_gstate.c | 41 ++++---- + src/cairo_image_surface.c | 1 + + src/cairo_png_surface.c | 1 + + src/cairo_ps_surface.c | 1 + + src/cairo_surface.c | 28 +++++- + src/cairo_xcb_surface.c | 3 +- + src/cairo_xlib_surface.c | 3 +- + src/cairoint.h | 84 +++++++++++++++- + 21 files changed, 1032 insertions(+), 222 deletions(-) + +commit 23026d5ab65201793ac19b459e3e7e05a090e435 +Author: Graydon Hoare +Date: Thu May 20 16:42:56 2004 +0000 + + Add sanity checking feature configury. + Add sanity checking feature. + Add sanity checking. + Add prototypes. + New functions. + New function. + Use fixed functions. (_cairo_gstate_clip): Arithmetic fixes. (_cairo_gstate_clip_and_composite_trapezoids): (_cairo_gstate_show_surface): (_cairo_gstate_show_text): (_cairo_gstate_show_glyphs): Corrections to clipping. + Add XCopyArea fast path. (_cairo_xlib_surface_set_clip_region): Drive clip to drawable. + + ChangeLog | 29 ++++ + configure.in | 14 ++ + src/cairo-features.h.in | 2 + + src/cairo-fixed.c | 11 ++ + src/cairo-gstate.c | 351 ++++++++++++++++++++++++++++++++++++++--------- + src/cairo-matrix.c | 24 ++++ + src/cairo-xlib-surface.c | 52 ++++++- + src/cairo.c | 187 ++++++++++++++++++++++++- + src/cairo_fixed.c | 11 ++ + src/cairo_gstate.c | 351 ++++++++++++++++++++++++++++++++++++++--------- + src/cairo_matrix.c | 24 ++++ + src/cairo_xlib_surface.c | 52 ++++++- + src/cairoint.h | 9 ++ + 13 files changed, 982 insertions(+), 135 deletions(-) + +commit aab2fe8c059cc41451ddf5e0719f18d77ef354f4 +Author: Carl Worth +Date: Mon May 17 08:03:17 2004 +0000 + + Do nothing when passed a NULL string. + + ChangeLog | 5 +++++ + src/cairo.c | 3 +++ + 2 files changed, 8 insertions(+) + +commit 4511a6cc7f52f461fb79635a6fc1ba9cafdcc66d +Author: Øyvind KolÃ¥s +Date: Tue May 11 13:59:09 2004 +0000 + + changed CAIRO_FILTER_DEFAULT to CAIRO_FILTER_BEST to make gradients easier. + + ChangeLog | 5 +++++ + src/cairoint.h | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit cdf8739c0968831d12a3b7c22e34296488eb1fa9 +Author: David Reveman +Date: Tue May 11 11:20:06 2004 +0000 + + Removed pattern_offset + + ChangeLog | 12 ++++++++++++ + src/cairo-gstate.c | 8 -------- + src/cairo-pattern.c | 10 ++-------- + src/cairo-surface.c | 8 +++----- + src/cairo_gstate.c | 8 -------- + src/cairo_pattern.c | 10 ++-------- + src/cairo_surface.c | 8 +++----- + src/cairoint.h | 1 - + 8 files changed, 22 insertions(+), 43 deletions(-) + +commit 2f7b4a3ad7a0760af023d350685d1acfdc528d2c +Author: Carl Worth +Date: Tue May 11 08:19:47 2004 +0000 + + Increment CAIRO_VERSION to 0.1.23. + Added notes for snapshot 0.1.23. + Add reminder to mention incompatible API changes in NEWS. Re-order steps to avoid clobbering pre-existing tar files. + + ChangeLog | 10 ++++++++++ + NEWS | 41 +++++++++++++++++++++++++++++++++++++++++ + RELEASING | 28 +++++++++++++++------------- + configure.in | 2 +- + 4 files changed, 67 insertions(+), 14 deletions(-) + +commit b743ed0342d0e6696df159e9739781fbcb1fac33 +Author: Carl Worth +Date: Tue May 11 06:52:19 2004 +0000 + + Several people have reported that cairo_clip is not working right now. And it's always been slow. + + BUGS | 6 ++++++ + ChangeLog | 5 +++++ + 2 files changed, 11 insertions(+) + +commit 4162e1f16b6ea9d162872dcc2b6b612e0dcb7523 +Author: David Reveman +Date: Tue May 11 05:31:16 2004 +0000 + + Better surface pattern support + + ChangeLog | 10 +++++++ + configure.in | 2 +- + src/cairo_gl_surface.c | 77 +++++++++++++++++++++++++++++++++++++------------- + 3 files changed, 68 insertions(+), 21 deletions(-) + +commit 1e20a2db0fa26c6882bc00f8ea00cbf1e4619884 +Author: Carl Worth +Date: Fri May 7 18:52:01 2004 +0000 + + Bail on NULL utf8 string. + Don't add two consecutive, identical points when decomposing the spline, (which was leading to an infinte loop in the stroke algorithm when it found a slope of (0,0)). + + ChangeLog | 9 +++++++++ + TODO | 4 ++-- + src/cairo-ft-font.c | 2 +- + src/cairo-spline.c | 7 +++++++ + src/cairo.h | 1 + + src/cairo_ft_font.c | 2 +- + src/cairo_spline.c | 7 +++++++ + 7 files changed, 28 insertions(+), 4 deletions(-) + +commit 9faef192afc6a1606518a8e6a0a8e4e27351d920 +Author: Carl Worth +Date: Thu May 6 05:50:23 2004 +0000 + + Leave clientClipType as CT_NONE if region is NULL (thanks to Vladimir Vukicevic ). + + pixman/AUTHORS | 1 + + pixman/ChangeLog | 6 ++++++ + pixman/src/icimage.c | 6 ++++-- + 3 files changed, 11 insertions(+), 2 deletions(-) + +commit c7230543b06d3ec4070073fbc55f344d09b26ea5 +Author: Carl Worth +Date: Tue May 4 12:00:22 2004 +0000 + + (_cairo_png_surface_copy_page): Don't close a file we didn't open. + + ChangeLog | 1 + + src/cairo_png_surface.c | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 7398aa8e1e4328a85f8d2de0c5180712cfa842e8 +Author: Carl Worth +Date: Tue May 4 09:25:54 2004 +0000 + + Move all libpng-related code into copy_page. (unpremultiply_data): Add missing unpremultiply step. (_cairo_png_surface_copy_page): Move PNG output to copy_page. Add support for A8 and A1 images. Remove time from header (we may want to add it again later, but for now it messes up my test suite). (_cairo_png_surface_destroy): Call copy_page if it hasn't been called already. (_cairo_png_surface_show_page): Add implementation. + + BUGS | 4 + + ChangeLog | 12 +++ + src/cairo_png_surface.c | 232 ++++++++++++++++++++++++++++-------------------- + 3 files changed, 153 insertions(+), 95 deletions(-) + +commit 423ea55410d86c8c8cc4fb5219941bcbdeab2a33 +Author: David Reveman +Date: Tue May 4 04:01:18 2004 +0000 + + Corrected some confusing comments about the math used for radial gradients + + ChangeLog | 5 +++++ + src/cairo-pattern.c | 24 ++++++++++++++++-------- + src/cairo_pattern.c | 24 ++++++++++++++++-------- + 3 files changed, 37 insertions(+), 16 deletions(-) + +commit 1876568f208f3067449988bad896be756eacacaf +Author: David Reveman +Date: Sat May 1 05:50:46 2004 +0000 + + cairo_surface_t pointer to cairo_surface_set_matrix + + ChangeLog | 5 +++++ + src/cairo_gl_surface.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit c0df5d4b1a28bb95e83cbfa232b1f4722d999c93 +Author: Carl Worth +Date: Thu Apr 29 22:09:05 2004 +0000 + + Don't set pattern_offset by the current point. Perhaps we can eliminate pattern_offset altogether now? + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 4 ---- + src/cairo_gstate.c | 4 ---- + 3 files changed, 6 insertions(+), 8 deletions(-) + +commit f516564f987b7030f52273d66c69acef4222ef29 +Author: David Reveman +Date: Thu Apr 29 20:26:56 2004 +0000 + + Updated linear and radial patterns + + ChangeLog | 25 ++++++ + configure.in | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-pattern.c | 226 +++++++++++++++++++++++++++---------------------- + src/cairo_gl_surface.c | 80 +++++++---------- + src/cairo_gstate.c | 2 +- + src/cairo_pattern.c | 226 +++++++++++++++++++++++++++---------------------- + src/cairoint.h | 7 +- + 8 files changed, 315 insertions(+), 255 deletions(-) + +commit c9c882d2b28f8bb9656224eed8adba5a5395b294 +Author: Carl Worth +Date: Thu Apr 29 07:26:53 2004 +0000 + + Added a BUG and a TODO item + + BUGS | 9 ++++++++- + TODO | 3 +++ + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 09698566e1b238830eca1085a65f6292195805a9 +Author: David Reveman +Date: Wed Apr 28 02:14:23 2004 +0000 + + Support compositing with mask surface when mask is solid or multi-texturing is available + + ChangeLog | 8 ++++++++ + src/cairo_gl_surface.c | 17 ++++++++++++----- + 2 files changed, 20 insertions(+), 5 deletions(-) + +commit 37f6590708061a79f1b3b34efe550935b3a03d8c +Author: David Reveman +Date: Sun Apr 25 05:11:07 2004 +0000 + + Fixed conversion of pixman_box16_t to glitz_rectangle_t + + ChangeLog | 3 +++ + src/cairo_gl_surface.c | 8 ++++---- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit f870f16e98d4a3dcfdc2ab28f532fb510dc59124 +Author: David Reveman +Date: Sun Apr 25 04:02:37 2004 +0000 + + Converted shading routines to use fixed point values. + + ChangeLog | 31 +++++++ + src/cairo-pattern.c | 237 +++++++++++++++++++++++++------------------------ + src/cairo-surface.c | 8 +- + src/cairo_gl_surface.c | 36 +++++--- + src/cairo_pattern.c | 237 +++++++++++++++++++++++++------------------------ + src/cairo_surface.c | 8 +- + src/cairoint.h | 25 +++++- + 7 files changed, 327 insertions(+), 255 deletions(-) + +commit c82011dddd3d7f5ac50d61077cfa2c5dcb17a952 +Author: Carl Worth +Date: Fri Apr 23 10:08:53 2004 +0000 + + Fixed several function prototype mismatches between internal header file and implementation (thanks to Carlos Romero and gcc-3.4). + + ChangeLog | 8 ++++++++ + src/cairo-gstate.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo_gstate.c | 2 +- + src/cairo_surface.c | 2 +- + src/cairoint.h | 16 ++++++++-------- + 6 files changed, 20 insertions(+), 12 deletions(-) + +commit e172b7cec739ca57f9034d62029e00283a9ab84c +Author: David Reveman +Date: Thu Apr 22 02:22:36 2004 +0000 + + Fixed pattern source offset + + ChangeLog | 10 ++++++++++ + src/cairo-gstate.c | 8 ++++---- + src/cairo-pattern.c | 30 ++++++++++++++---------------- + src/cairo-surface.c | 14 +++++++------- + src/cairo_gl_surface.c | 10 +++++----- + src/cairo_gstate.c | 8 ++++---- + src/cairo_pattern.c | 30 ++++++++++++++---------------- + src/cairo_surface.c | 14 +++++++------- + src/cairoint.h | 2 +- + 9 files changed, 66 insertions(+), 60 deletions(-) + +commit c15c7b93647d997b7ba13e9fb511d5a5505cdc22 +Author: David Reveman +Date: Tue Apr 20 12:35:44 2004 +0000 + + Fixed missing limits.h includes + + ChangeLog | 11 +++++++++++ + src/cairo-pattern.c | 2 +- + src/cairo-traps.c | 4 ++-- + src/cairo_pattern.c | 2 +- + src/cairo_traps.c | 4 ++-- + src/cairoint.h | 4 ++++ + 6 files changed, 21 insertions(+), 6 deletions(-) + +commit eff1670123efce23f09d8015a9db00a9b7ae98a5 +Author: Carl Worth +Date: Fri Apr 16 08:56:45 2004 +0000 + + Added notes for snapshot 0.1.22. + Now depends on libpixman 0.1.1. Bump version to 0.1.22. + + ChangeLog | 5 +++++ + NEWS | 5 +++++ + configure.in | 4 ++-- + 3 files changed, 12 insertions(+), 2 deletions(-) + +commit b0f8dcdc83d3487a5016d813a4ee3284784b78c1 +Author: Carl Worth +Date: Fri Apr 16 08:52:00 2004 +0000 + + Add RELEASING file + + pixman/RELEASING | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 71 insertions(+) + +commit a8106bae111dddf240ceb071bfb686a8d3cac782 +Author: Carl Worth +Date: Fri Apr 16 08:50:11 2004 +0000 + + Add notes for snapshot 0.1.1 + Increment LIBPIXMAN_VERSION to 0.1.1 + + pixman/ChangeLog | 4 ++++ + pixman/NEWS | 23 +++++++++++++++++++++++ + pixman/configure.in | 2 +- + 3 files changed, 28 insertions(+), 1 deletion(-) + +commit 3a29d7a5310b0e4bc76eb7a852a41d9b4634de31 +Author: Carl Worth +Date: Fri Apr 16 08:33:20 2004 +0000 + + Track pixman fixes to PIXMAN_FORMAT_NAME_*. + Explicitly add cases for all enum values to eliminate compiler warnings. + Remove proposal for surface_clip interface as cairo_clip should be able to cover this case now. + Added bug concerning negative ref_counts. + + BUGS | 6 ++++++ + ChangeLog | 13 +++++++++++++ + src/cairo-image-surface.c | 4 ++-- + src/cairo.h | 13 ------------- + src/cairo_image_surface.c | 4 ++-- + src/cairo_png_surface.c | 8 ++++++++ + 6 files changed, 31 insertions(+), 17 deletions(-) + +commit 821a9f2f6c663429abbacce89383af6171f65225 +Author: Carl Worth +Date: Fri Apr 16 08:32:53 2004 +0000 + + Fix bogus names such as PIXMAN_FORMAT_NAME_AR_GB32 that were left over from a broken search-and-replace. Normalize structure defintions, (eg. struct _pixman_region16_t -> struct pixman_region16). Normalize indentation. + Fix alphabetization. + + pixman/AUTHORS | 2 +- + pixman/ChangeLog | 16 +++++ + pixman/src/icformat.c | 6 +- + pixman/src/icimage.c | 4 +- + pixman/src/icimage.h | 30 ++++---- + pixman/src/icint.h | 6 +- + pixman/src/icrect.c | 8 +-- + pixman/src/ictrap.c | 2 +- + pixman/src/pixman.h | 177 +++++++++++++++++++++++----------------------- + pixman/src/pixregion.c | 70 +++++++++--------- + pixman/src/pixregionint.h | 16 ++--- + 11 files changed, 177 insertions(+), 160 deletions(-) + +commit aa83e5c2c1fee1eb52f829f6cfd2e170e369e720 +Author: David Reveman +Date: Fri Apr 9 14:30:38 2004 +0000 + + Bump version to 0.1.21 + + ChangeLog | 4 ++++ + NEWS | 16 ++++++++++++++++ + configure.in | 2 +- + 3 files changed, 21 insertions(+), 1 deletion(-) + +commit 73df0e81cb6a5d43a1325f4722a7236bd554738f +Author: David Reveman +Date: Fri Apr 9 14:19:47 2004 +0000 + + Added OpenGL surface backend + + AUTHORS | 1 + + ChangeLog | 12 + + cairo.pc.in | 2 +- + configure.in | 26 ++ + src/Makefile.am | 9 +- + src/cairo-features.h.in | 2 + + src/cairo-pattern.c | 14 +- + src/cairo-surface.c | 12 +- + src/cairo.h | 16 + + src/cairo_gl_surface.c | 821 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_pattern.c | 14 +- + src/cairo_surface.c | 12 +- + 12 files changed, 912 insertions(+), 29 deletions(-) + +commit f713fe43cf18c221a840caab710dfdb25aaf6898 +Author: David Reveman +Date: Fri Apr 9 14:14:56 2004 +0000 + + Automatically detect available backends + + ChangeLog | 4 ++++ + configure.in | 55 ++++++++++++++++++++++++++++++++++++++++--------------- + 2 files changed, 44 insertions(+), 15 deletions(-) + +commit 69b9f89da7c510fafc172fd30d1a970e7c8ca69b +Author: Carl Worth +Date: Wed Apr 7 11:03:40 2004 +0000 + + Add note that announcement needs to include the URL + + RELEASING | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 2e891bdd33e9b3d2c8b9297d01eacde317ebae22 +Author: Carl Worth +Date: Tue Apr 6 20:13:11 2004 +0000 + + Added notes for snapshot 0.1.20. + Added new RELEASING file. + + ChangeLog | 6 +++++ + NEWS | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + RELEASING | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 149 insertions(+), 2 deletions(-) + +commit b26a742bcfe2c81b99c2c5e26acc10ad259cb4ef +Author: David Reveman +Date: Tue Apr 6 09:45:17 2004 +0000 + + Added new pattern API + + src/cairo-pattern.c | 716 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_pattern.c | 716 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 1432 insertions(+) + +commit e309090d2a18a896c67e731151b973b530f76980 +Author: David Reveman +Date: Tue Apr 6 09:36:12 2004 +0000 + + Added new pattern API + + ChangeLog | 82 +++++++ + cairo.pc.in | 2 +- + configure.in | 7 +- + src/Makefile.am | 4 +- + src/cairo-ft-font.c | 21 +- + src/cairo-gstate.c | 528 +++++++++++++++++++++++++--------------------- + src/cairo-image-surface.c | 23 +- + src/cairo-ps-surface.c | 10 +- + src/cairo-surface.c | 108 ++++++++++ + src/cairo-traps.c | 37 ++++ + src/cairo-xcb-surface.c | 11 +- + src/cairo-xlib-surface.c | 15 +- + src/cairo.c | 33 ++- + src/cairo.h | 75 ++++++- + src/cairo_ft_font.c | 21 +- + src/cairo_gstate.c | 528 +++++++++++++++++++++++++--------------------- + src/cairo_image_surface.c | 23 +- + src/cairo_png_surface.c | 10 +- + src/cairo_ps_surface.c | 10 +- + src/cairo_surface.c | 108 ++++++++++ + src/cairo_traps.c | 37 ++++ + src/cairo_xcb_surface.c | 11 +- + src/cairo_xlib_surface.c | 15 +- + src/cairoint.h | 150 ++++++++++++- + 24 files changed, 1339 insertions(+), 530 deletions(-) + +commit b17b04aa388541c0880698aed0f03796a3146d49 +Author: Carl Worth +Date: Fri Apr 2 08:01:09 2004 +0000 + + Move weight after slant to match the order in cairo_select_font. + Added notes on DPI for image-based backends and on proposal for new cairo_text_glyphs function. + Added BUG about cairo_show_text not advancing the current point. + + BUGS | 4 ++++ + ChangeLog | 11 +++++++++++ + TODO | 22 ++++++++++++++++++++++ + src/cairo.h | 11 +++++------ + 4 files changed, 42 insertions(+), 6 deletions(-) + +commit 72667ec5680c77fc0e89fcfe71e6fa72467991ff +Author: Carl Worth +Date: Tue Mar 30 18:55:48 2004 +0000 + + Add -lz. + + ChangeLog | 4 ++++ + src/Makefile.am | 3 ++- + src/cairo-ft-font.c | 2 +- + src/cairo_ft_font.c | 2 +- + 4 files changed, 8 insertions(+), 3 deletions(-) + +commit 9459871bbf4f027354c781b7d6bc1b9f6a4d1e05 +Author: Carl Worth +Date: Tue Mar 30 18:45:00 2004 +0000 + + Add checks for Xrender.h in xrender.pc is not found. Remove AC_HELP_STRING to be compatible with older versions of autoconf (thanks to Bill Spitzak ). + + AUTHORS | 1 + + ChangeLog | 4 ++++ + cairo.pc.in | 2 +- + configure.in | 18 ++++++++++++------ + 4 files changed, 18 insertions(+), 7 deletions(-) + +commit 76478e4ad004e25d1f0e71be660983eb85b8285e +Author: Carl Worth +Date: Tue Mar 30 17:49:30 2004 +0000 + + Add question on semantics with empty region. Fix missing return value. + Export for internal use. (_cairo_image_abstract_surface_set_clip_region): Add silly wrapper to match the backend interface. + Remove unused variables. + + ChangeLog | 12 ++++++++++++ + src/cairo-gstate.c | 4 ---- + src/cairo-image-surface.c | 17 +++++++++++++---- + src/cairo-xlib-surface.c | 7 +++++-- + src/cairo_gstate.c | 4 ---- + src/cairo_image_surface.c | 17 +++++++++++++---- + src/cairo_xlib_surface.c | 7 +++++-- + src/cairoint.h | 6 +++++- + 8 files changed, 53 insertions(+), 21 deletions(-) + +commit c7d2b0e0531633630823090a7d85c14b916275c0 +Author: Carl Worth +Date: Tue Mar 30 17:24:29 2004 +0000 + + Add proposal for cairo_xlib_surface_set_size. + Added note about problem with cairo_scale_font. + + AUTHORS | 2 +- + BUGS | 27 +++++++++++++++++++++++++++ + ChangeLog | 6 ++++++ + TODO | 13 ++++++++----- + src/cairo.h | 5 +++++ + 5 files changed, 47 insertions(+), 6 deletions(-) + +commit 3cd25474937c1ae2dbd17d28aaa5c7868f3902ef +Author: Olivier Andrieu +Date: Tue Mar 23 10:33:32 2004 +0000 + + Implement _set_clip_region by delegating it to the image backend. + Add a stub. + Add missing (?) cairo_init_clip + + ChangeLog | 11 +++++++++++ + src/cairo-ps-surface.c | 5 +++-- + src/cairo-xcb-surface.c | 11 ++++++++++- + src/cairo.h | 3 +++ + src/cairo_png_surface.c | 13 ++++++++++++- + src/cairo_ps_surface.c | 5 +++-- + src/cairo_xcb_surface.c | 11 ++++++++++- + 7 files changed, 52 insertions(+), 7 deletions(-) + +commit e576aeb222b5f7378cb01fd6df05e6daf43094dd +Author: Øyvind KolÃ¥s +Date: Mon Mar 22 17:56:35 2004 +0000 + + cairo usage is crashing Xnest + + BUGS | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 1d51df571348d8ebd8f978cfc5cff06e7b35b248 +Author: Dave Beckett +Date: Sat Mar 20 09:54:15 2004 +0000 + + Move the PNG_CFLAGS/_LIBS substitutes outside the conditional, to match what is already done for XCB. Do the same for XRENDER_CFLAGS/LIBS. + + ChangeLog | 4 ++++ + configure.in | 7 ++++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit ad255ad599d607ed1b16f2ac87ce64546a76bd16 +Author: Dave Beckett +Date: Sat Mar 20 08:20:40 2004 +0000 + + Substitute PNG_CFLAGS, PNG_LIBS on the configure path when use_png is not enabled to prevent the substituions being undefined. + + ChangeLog | 6 ++++++ + configure.in | 3 +++ + 2 files changed, 9 insertions(+) + +commit 94551db67c610582be115bdc18ad4169c9f7db92 +Author: Graydon Hoare +Date: Fri Mar 19 15:47:25 2004 +0000 + + Add. + finalize and copy clip.region. Detect rectangular clips and push down to backend. + Add set_clip_region slot. (cairo_clip_rec_t): Add region slot. (_cairo_gstate_init_clip) (_cairo_surface_set_clip_region): Prototype. + Add. + Add. + Add. + not implemented. + + ChangeLog | 25 +++++++++ + src/cairo-gstate.c | 133 +++++++++++++++++++++++++++++++++++++++++++--- + src/cairo-image-surface.c | 12 ++++- + src/cairo-ps-surface.c | 12 ++++- + src/cairo-surface.c | 5 ++ + src/cairo-xlib-surface.c | 50 +++++++++++++++-- + src/cairo.c | 9 ++++ + src/cairo_gstate.c | 133 +++++++++++++++++++++++++++++++++++++++++++--- + src/cairo_image_surface.c | 12 ++++- + src/cairo_ps_surface.c | 12 ++++- + src/cairo_surface.c | 5 ++ + src/cairo_xlib_surface.c | 50 +++++++++++++++-- + src/cairoint.h | 11 ++++ + 13 files changed, 445 insertions(+), 24 deletions(-) + +commit 9e793ee5fceb1c6d41438f304eb01b481962fcb8 +Author: Jamey Sharp +Date: Wed Mar 17 09:44:26 2004 +0000 + + Fixed for latest XCB API. XCB headers can co-exist with Xlib headers now, so Cairo may be compiled with both backends in the same library. http://freedesktop.org/Software/XCBCompletedTasks#17_Mar_2004 + + ChangeLog | 10 ++++ + src/cairo-surface.c | 1 + + src/cairo-xcb-surface.c | 123 +++++++++++++++++++++++++----------------------- + src/cairo.h | 4 +- + src/cairo_surface.c | 1 + + src/cairo_xcb_surface.c | 123 +++++++++++++++++++++++++----------------------- + 6 files changed, 142 insertions(+), 120 deletions(-) + +commit e7f3335baf9cb7955e27115a2975db1eed71434a +Author: Thomas Hunger +Date: Thu Feb 26 14:47:21 2004 +0000 + + added missing links for rectangle and curve_to function + + doc/reference/doc.xml | 4 ++++ + 1 file changed, 4 insertions(+) + +commit f1b56497b10efe7cf70f6a9768dbeeff12efa031 +Author: Thomas Hunger +Date: Thu Feb 26 14:32:12 2004 +0000 + + added functions to describe the new backends, added text_extents function + + doc/reference/doc.xml | 12 +++++ + doc/reference/xml/cairo_set_target_drawable.xml | 45 +++++++++++++++++++ + doc/reference/xml/cairo_set_target_png.xml | 51 ++++++++++++++++++++++ + doc/reference/xml/cairo_set_target_ps.xml | 52 ++++++++++++++++++++++ + doc/reference/xml/cairo_set_target_surface.xml | 2 +- + doc/reference/xml/cairo_set_target_xcb.xml | 58 +++++++++++++++++++++++++ + doc/reference/xml/cairo_text_extents.xml | 47 ++++++++++++++++++++ + doc/reference/xml/cairo_text_extents_t.xml | 29 +++++++++++++ + 8 files changed, 295 insertions(+), 1 deletion(-) + +commit 02329029583bbc481b76ff3ce149c2bbec1bc096 +Author: Carl Worth +Date: Thu Feb 26 08:55:03 2004 +0000 + + Fix typo + + ChangeLog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 529b16f119fb2c203a10c1d46c3810fd177da2fc +Author: Carl Worth +Date: Thu Feb 26 08:54:42 2004 +0000 + + Add Jordi and Olvier to the AUTHORS file. + Fix broken return value for nchars (thanks to Jordi Mas ). + + AUTHORS | 2 ++ + ChangeLog | 7 +++++++ + TODO | 6 +++--- + src/cairo-ft-font.c | 2 +- + src/cairo_ft_font.c | 2 +- + 5 files changed, 14 insertions(+), 5 deletions(-) + +commit bd5c27207aaa89ac4c55c55006f6253006c2a8b8 +Author: Olivier Andrieu +Date: Tue Feb 24 12:39:29 2004 +0000 + + forgot the SUBST for PNG_REQUIRES + + configure.in | 1 + + 1 file changed, 1 insertion(+) + +commit 995097752e18dffbbbdf4c80d29efb02e1bfdecf +Author: Olivier Andrieu +Date: Tue Feb 24 12:29:25 2004 +0000 + + PNG backend + + ChangeLog | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 3b85dd1f9da71f886e48cb4cbe5a4edd0c9e6024 +Author: Olivier Andrieu +Date: Tue Feb 24 12:28:49 2004 +0000 + + Add PNG backend (cairo_set_target_png and cairo_png_surface_create). + + src/cairo-features.h.in | 2 + + src/cairo.h | 25 ++++ + src/cairo_png_surface.c | 314 ++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 341 insertions(+) + +commit 0a07e28683ef94f393fbc20aedf6d21bd58c9aa9 +Author: Olivier Andrieu +Date: Tue Feb 24 12:27:52 2004 +0000 + + autoconf support for the PNG backend. Bump version to 0.1.19. + + cairo.pc.in | 2 +- + configure.in | 22 +++++++++++++++++++++- + 2 files changed, 22 insertions(+), 2 deletions(-) + +commit 13911e3d67f272920fa0a66ec6dcb8f910f771cd +Author: Olivier Andrieu +Date: Tue Feb 24 12:27:13 2004 +0000 + + PNG backend support, removed references to X_LIBS and X_CFLAGS. + + src/Makefile.am | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit cf069c127a5721f15876485c717a45f5e1d9f4e1 +Author: Carl Worth +Date: Tue Feb 24 12:22:56 2004 +0000 + + Fix email address for Anders Carlsson. + + pixman/AUTHORS | 2 +- + pixman/ChangeLog | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 0e02e71cf54331aa54eee2d39433be117bae1b7d +Author: Carl Worth +Date: Tue Feb 24 10:45:26 2004 +0000 + + Add attribution for many people who have made generous contributions to cairo. This list was generated by sifting through the ChangeLog. Please let me know if I have missed anyone. + Add some historical notes on cairo development, prior to when we began to maintain this NEWS file. + Add pointer to cairographics.org. Fix to use cairo rather than Cairo when not at the beginning of a sentence. + Remove cairo_current_path, cairo_current_path_flat, cairo_text_extents, cairo_glyph_extents, cairo_text_path, and cairo_glyph_path from the TODO list as they have all been implemented now. + + AUTHORS | 16 +++++++++++++++- + ChangeLog | 18 ++++++++++++++++++ + NEWS | 35 ++++++++++++++++++++++++++++++++++- + README | 3 ++- + TODO | 5 +---- + 5 files changed, 70 insertions(+), 7 deletions(-) + +commit 431548c3d8a998d9b8b5615469b500d3e11edc06 +Author: Carl Worth +Date: Tue Feb 24 10:41:11 2004 +0000 + + Added attribution for several authors after sifting through the ChangeLog. + + pixman/AUTHORS | 24 ++++++++++++++++-------- + pixman/ChangeLog | 5 +++++ + 2 files changed, 21 insertions(+), 8 deletions(-) + +commit faa43926612d6edcdf6caf895399a459cf55f72e +Author: Thomas Hunger +Date: Tue Feb 24 07:18:45 2004 +0000 + + applied patch from Ravindra fixing missing lines in doc.xml + + doc/reference/doc.xml | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 554726563f67d3a8428b03e2af41f4a88baffc5e +Author: Thomas Hunger +Date: Fri Feb 20 14:23:17 2004 +0000 + + added missing xml/cairo_set_target_image.xml + + doc/reference/xml/cairo_arc.xml | 4 +- + doc/reference/xml/cairo_arc_negative.xml | 4 +- + doc/reference/xml/cairo_current_font.xml | 4 +- + doc/reference/xml/cairo_current_font_extents.xml | 2 +- + doc/reference/xml/cairo_curve_to.xml | 2 +- + doc/reference/xml/cairo_rectangle.xml | 4 +- + doc/reference/xml/cairo_rel_curve_to.xml | 10 ++-- + doc/reference/xml/cairo_set_font.xml | 4 +- + doc/reference/xml/cairo_set_target_image.xml | 58 ++++++++++++++++++++++++ + doc/reference/xml/cairo_set_target_surface.xml | 2 +- + doc/reference/xml/cairo_show_glyphs.xml | 2 +- + doc/reference/xml/cairo_show_text.xml | 2 +- + doc/reference/xml/cairo_transform_font.xml | 2 +- + 13 files changed, 79 insertions(+), 21 deletions(-) + +commit c3fe1bbe33f65b28cc6fdcc3945a77a6cd233c3f +Author: Carl Worth +Date: Tue Feb 17 18:47:34 2004 +0000 + + Add comment indication cairo_copy will be going away at some point. Some indentation fixes. + + ChangeLog | 3 +++ + src/cairo.h | 6 +++--- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 122b2d850459b3acfcd5194018bd78da1dde14b7 +Author: Carl Worth +Date: Tue Feb 17 18:38:23 2004 +0000 + + Bump version to 0.1.18. Includes new functions cairo_current_path, cairo_current_path_flat, cairo_surface_get_filter. Support for XCB backend. Fixes for building in cygwin. Adds cairo_surface_get_filter. + Add new path query functions. + Implement support for cairo_current_path and cairo_current_path_flat. These functions just provide an interface to _cairo_path_interpret and take care of mapping from device space back to user space. + + ChangeLog | 20 +++++++ + configure.in | 2 +- + src/cairo-gstate.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 37 +++++++++++++ + src/cairo.h | 25 +++++++-- + src/cairo_gstate.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 8 +++ + 7 files changed, 392 insertions(+), 4 deletions(-) + +commit 9349c95f28f574747ec24b010f9a9e40327dc466 +Author: Carl Worth +Date: Fri Feb 13 06:13:19 2004 +0000 + + Add some notes from JG's TODO list on the wiki: http://cairographics.org/CairoToDoList. (Also testing automated mailing to cairo-commit list). + + ChangeLog | 6 ++++++ + TODO | 12 +++++++++++- + 2 files changed, 17 insertions(+), 1 deletion(-) + +commit b55f1076793229d182463100ed9de2a68dd3c77b +Author: Carl Worth +Date: Thu Feb 12 19:02:33 2004 +0000 + + Add typedefs for new callbacks to be used by cairo_current_path: cairo_move_to_func, cairo_line_to_func, cairo_curve_to_func, and cairo_close_path_func. + cairo_path.last_move_point and cairo_path.current_point are now fixed-point not doubles for consistency. + Now accept 4 explicit function pointers rather than a structure. Eliminate unnecessary done_path callback. + Track change in _cairo_path_interpret. Code previously in done_path callback is now here immediately after call to _cairo_path_interpret. + Internal _cairo_path API modified to accept fixed-point data everywhere. Much cleaner this way. + Have to convert doubles to fixed-point to track changes in _cairo_path API. + Keep data in fixed-point rather than going through intermediate doubles. Track changes in _cairo_path API. + New function to help when working with freetype. + + ChangeLog | 47 ++++++++++++++++++++ + src/cairo-fixed.c | 7 +++ + src/cairo-ft-font.c | 56 +++++++++++++++--------- + src/cairo-gstate.c | 88 ++++++++++++++++++++++++++++++-------- + src/cairo-path-bounds.c | 23 +++------- + src/cairo-path-fill.c | 58 +++++++++---------------- + src/cairo-path-stroke.c | 107 ++++++++++++++++++++-------------------------- + src/cairo-path.c | 111 ++++++++++++++++++++++-------------------------- + src/cairo-traps.c | 2 +- + src/cairo.h | 13 ++++++ + src/cairo_fixed.c | 7 +++ + src/cairo_ft_font.c | 56 +++++++++++++++--------- + src/cairo_gstate.c | 88 ++++++++++++++++++++++++++++++-------- + src/cairo_path.c | 111 ++++++++++++++++++++++-------------------------- + src/cairo_path_bounds.c | 23 +++------- + src/cairo_path_fill.c | 58 +++++++++---------------- + src/cairo_path_stroke.c | 107 ++++++++++++++++++++-------------------------- + src/cairo_traps.c | 2 +- + src/cairoint.h | 63 +++++++++++++++------------ + 19 files changed, 573 insertions(+), 454 deletions(-) + +commit 810037bc7c7707337fb1e7682b36651f6a7c4e04 +Author: Jamey Sharp +Date: Mon Feb 2 23:24:14 2004 +0000 + + Ported the Xlib surface backend to XCB. + + ChangeLog | 9 + + configure.in | 19 ++ + src/Makefile.am | 9 +- + src/cairo-features.h.in | 2 + + src/cairo-xcb-surface.c | 776 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 13 + + src/cairo_xcb_surface.c | 776 ++++++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 1602 insertions(+), 2 deletions(-) + +commit 34e0e7eec8a1a8434c5ad52fb754f2bbaf224ced +Author: Graydon Hoare +Date: Mon Feb 2 11:20:44 2004 +0000 + + New predicate. (_cairo_xlib_surface_set_filter): Skip filterless servers. (_cairo_xlib_surface_clone_similar): Fix typo. + + ChangeLog | 7 +++++++ + src/cairo-xlib-surface.c | 8 +++++--- + src/cairo_xlib_surface.c | 8 +++++--- + 3 files changed, 17 insertions(+), 6 deletions(-) + +commit b66bbf48790238174efd1491bfcd8c0d77f43f13 +Author: Graydon Hoare +Date: Fri Jan 30 14:44:18 2004 +0000 + + New "filter" field. + New function. (cairo_surface_set_filter): Store filter in surface. + Declare. + Copy filter setting. (_cairo_xlib_surface_set_filter): Use constants from Xrender.h + + ChangeLog | 11 +++++++++++ + src/cairo-surface.c | 7 +++++++ + src/cairo-xlib-surface.c | 18 ++++++++---------- + src/cairo.h | 3 +++ + src/cairo_surface.c | 7 +++++++ + src/cairo_xlib_surface.c | 18 ++++++++---------- + src/cairoint.h | 1 + + 7 files changed, 45 insertions(+), 20 deletions(-) + +commit 62520eb2d15808934c0e76dc8f4fe02b01b11e64 +Author: Carl Worth +Date: Sat Jan 24 01:56:26 2004 +0000 + + Fix to use tessellate_polygon instead of tessellate_rectangle as the matrix may have skewed the coordinates into a non-rectangular shape. + + ChangeLog | 5 +++++ + src/cairo-path-stroke.c | 25 +++++++++++++++++++------ + src/cairo_path_stroke.c | 25 +++++++++++++++++++------ + 3 files changed, 43 insertions(+), 12 deletions(-) + +commit f1d98d27a65ec2c7e04a018e69aee44e1d525ed7 +Author: Carl Worth +Date: Sat Jan 24 01:50:55 2004 +0000 + + Remove dead-code (useless n++). + + pixman/ChangeLog | 5 +++++ + pixman/src/iccompose.c | 4 ---- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit f05248faefe3d3c2e4445faf373f826ded496b8b +Author: Carl Worth +Date: Sat Jan 24 01:46:20 2004 +0000 + + Add missing break statements to switch. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 6 ++++++ + src/cairo_xlib_surface.c | 6 ++++++ + 3 files changed, 17 insertions(+) + +commit 6d465f4e439f2b01214618040af7a5cf7e230c2a +Author: Thomas Hunger +Date: Fri Jan 23 14:13:20 2004 +0000 + + added and updated documentation concerning text handling + + doc/reference/doc.xml | 4 ++ + doc/reference/xml/cairo_arc.xml | 40 ++++++++++++++ + doc/reference/xml/cairo_arc_negative.xml | 40 ++++++++++++++ + doc/reference/xml/cairo_current_font.xml | 37 +++++++++++++ + doc/reference/xml/cairo_current_font_extents.xml | 40 ++++++++++++++ + doc/reference/xml/cairo_curve_to.xml | 70 ++++++++++++++++++++++++ + doc/reference/xml/cairo_operator_t.xml | 54 +++++------------- + doc/reference/xml/cairo_rectangle.xml | 47 ++++++++++++++++ + doc/reference/xml/cairo_rel_curve_to.xml | 70 ++++++++++++++++++++++++ + doc/reference/xml/cairo_select_font.xml | 18 +++++- + doc/reference/xml/cairo_set_font.xml | 40 ++++++++++++++ + doc/reference/xml/cairo_show_glyphs.xml | 46 ++++++++++++++++ + doc/reference/xml/cairo_show_text.xml | 4 +- + doc/reference/xml/cairo_transform_font.xml | 41 ++++++++++++++ + 14 files changed, 506 insertions(+), 45 deletions(-) + +commit 077fcb36da9d7edf8f7689ca913abce2c311925f +Author: Richard Worth +Date: Thu Jan 22 21:05:08 2004 +0000 + + Add '-no-undefined' to end of libpixman_la_LDFLAGS tp enable building shared libary under cygwin. + Remove all 'extern ' and ' __external_linkage' (macro for __declspec(dllexport) and __declspec(dllimport)) from function declarations. These are no longer needed for cygwin. + + pixman/ChangeLog | 10 +++++ + pixman/src/Makefile.am | 2 +- + pixman/src/pixman.h | 107 ++++++++++++++++++++++--------------------------- + 3 files changed, 58 insertions(+), 61 deletions(-) + +commit 5c490d216050fc5261811805d81dc5de98004794 +Author: Richard Worth +Date: Thu Jan 22 20:47:24 2004 +0000 + + Add '-no-undefined' to end of libcairo_la_LDFLAGS to enable building shared library under cygwin. + Remove all 'extern ' and ' __external_linkage' (macro for __declspec(dllexport) and __declspec(dllimport)) from function declarations. These are no longer needed for cygwin. + Changed type of _line_segs_intersect_ceil from 'static cairo_fixed_t' to 'static int' to match definition. This was necessary to compile under cygwin. + + ChangeLog | 14 +++ + src/Makefile.am | 2 +- + src/cairo-traps.c | 2 +- + src/cairo.h | 249 ++++++++++++++++++++++++++---------------------------- + src/cairo_traps.c | 2 +- + 5 files changed, 135 insertions(+), 134 deletions(-) + +commit 22792e2e7a118c7ef97f89617a5932e412453fe4 +Author: Carl Worth +Date: Wed Dec 17 13:17:13 2003 +0000 + + Remove trailing commas from enum, (some compilers like to complain about this). + + pixman/ChangeLog | 5 +++++ + pixman/src/pixman.h | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit decf8b395cc277d60267c75e3685ac4ead731d63 +Author: Carl Worth +Date: Wed Dec 17 12:59:37 2003 +0000 + + Remove trailing commas from enums, (some compilers like to complain about them). + + ChangeLog | 5 +++++ + README | 13 ++++++------- + src/cairo.h | 4 ++-- + 3 files changed, 13 insertions(+), 9 deletions(-) + +commit 2eb2408ca786fab6234239d4ade689af8589ac1b +Author: Dave Beckett +Date: Tue Dec 16 09:42:19 2003 +0000 + + Replace requiring libpixregion, libic with libpixman. + + ChangeLog | 4 ++++ + README | 4 +--- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit 75a7541cf1a8456780dbf446624a2a751fc24346 +Author: Carl Worth +Date: Tue Dec 16 08:29:01 2003 +0000 + + Fix typo + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa7c663ea844b8caf230b428ee593e785172d66d +Author: Carl Worth +Date: Tue Dec 16 08:27:17 2003 +0000 + + Add more notes culled from the ChangeLog. + + ChangeLog | 4 ++++ + NEWS | 35 ++++++++++++++++++++++++++++++----- + 2 files changed, 34 insertions(+), 5 deletions(-) + +commit a194d9ecd43e164e93899bad9ce82b63cd8712c7 +Author: Carl Worth +Date: Tue Dec 16 08:06:49 2003 +0000 + + Begin maintaining NEWS file. Add notes on 0.1.17. + + ChangeLog | 2 ++ + NEWS | 19 +++++++++++++++++++ + 2 files changed, 21 insertions(+) + +commit fb93261e3739fd15f8001c8d3631c4baabf3482c +Author: Carl Worth +Date: Tue Dec 16 07:20:20 2003 +0000 + + Bump version to 0.1.17 for new functions: cairo_text_extents, cairo_glyph_extents, cairo_text_path, cairo_glyph_path. + Re-enable cairo_text_path and cairo_glyph_path. + Add missing transformation. + Initial implementation of glyph_path. + + ChangeLog | 19 +++++++++ + configure.in | 2 +- + src/cairo-ft-font.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++----- + src/cairo-gstate.c | 10 ++++- + src/cairo.c | 3 -- + src/cairo.h | 8 +--- + src/cairo_ft_font.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++----- + src/cairo_gstate.c | 10 ++++- + src/cairoint.h | 3 +- + 9 files changed, 236 insertions(+), 37 deletions(-) + +commit bf40046a4ea5c92de6afbf8b77ba0610ff8c05ba +Author: Carl Worth +Date: Tue Dec 16 07:10:48 2003 +0000 + + Move all current_point state fields from cairo_gstate_t to cairo_path_t. + Add current_point state. (_cairo_path_current_point): New function. (_cairo_path_rel_move_to): (_cairo_path_rel_line_to): (_cairo_path_rel_curve_to): New functions. + Eliminate current_point state. (_cairo_gstate_show_text): (_cairo_gstate_text_path): Use new _cairo_path_current_point. + + ChangeLog | 31 +++++++++++++ + src/cairo-gstate.c | 130 +++++++++-------------------------------------------- + src/cairo-path.c | 110 +++++++++++++++++++++++++++++++++++++++++++-- + src/cairo_gstate.c | 130 +++++++++-------------------------------------------- + src/cairo_path.c | 110 +++++++++++++++++++++++++++++++++++++++++++-- + src/cairoint.h | 23 ++++++++-- + 6 files changed, 302 insertions(+), 232 deletions(-) + +commit b5983fab84409209c4af6bdd7cd5bdcf8cc7bb93 +Author: Carl Worth +Date: Tue Dec 16 06:58:10 2003 +0000 + + A couple of changes missed in the last batch of commits (reordering so that path is final argument). + + ChangeLog | 4 ++++ + src/cairo-ft-font.c | 12 ++++++------ + src/cairo_ft_font.c | 12 ++++++------ + 3 files changed, 16 insertions(+), 12 deletions(-) + +commit 368b4d269b48f19af5ba0d01613356f3bfa5e982 +Author: Carl Worth +Date: Tue Dec 16 06:50:37 2003 +0000 + + Change cairo_font_backend_t to use a void * for the abstract font. Put create, copy, and destroy as the first functions in the list. Fix text_path and glyph_path so that the path to be returned is the last argument. Add x,y arguments to text_path. + Compute x,y now needed by cairo_font_text_path. (_cairo_gstate_glyph_path): Track change in cairo_font_text/glyph_path (path argument is now last). + Switch to new macro-based mechanism for including freetype headers. (cairo_ft_font_face): (cairo_ft_font_pattern): Minor cleanup. (_cairo_ft_font_copy): (_cairo_ft_font_destroy): (_utf8_to_glyphs): (_cairo_ft_font_font_extents): (_cairo_ft_font_glyph_extents): (_cairo_ft_font_text_extents): (_cairo_ft_font_show_glyphs): (_cairo_ft_font_show_text): Track changes to cairo_font_backend_t interface. + Track changes to cairo_font_backend_t interface. + + ChangeLog | 31 +++++++++++ + src/cairo-font.c | 15 +++--- + src/cairo-ft-font.c | 148 ++++++++++++++++++++++++++-------------------------- + src/cairo-gstate.c | 30 +++++++++-- + src/cairo_font.c | 15 +++--- + src/cairo_ft_font.c | 148 ++++++++++++++++++++++++++-------------------------- + src/cairo_gstate.c | 30 +++++++++-- + src/cairoint.h | 90 ++++++++++++++++---------------- + 8 files changed, 295 insertions(+), 212 deletions(-) + +commit c18a81e25259100c28c384333578fa6ce1374d21 +Author: Carl Worth +Date: Tue Dec 16 06:15:53 2003 +0000 + + Change instances of Cairo to cairo where necessary. Add note about broken dashing on splines. + + ChangeLog | 5 +++++ + TODO | 64 ++++++++++++++++++++++++++++++++------------------------------- + 2 files changed, 38 insertions(+), 31 deletions(-) + +commit dea75c833335f05230bb0c3d252553ce369909eb +Author: Carl Worth +Date: Mon Dec 15 19:00:15 2003 +0000 + + Rename cairo_text_exextents_t fields: left_side_bearing -> x_bearing ascent -> y_bearing right_side_bearing (replaced by) width descent (replaced by) height + + ChangeLog | 12 ++++++++++++ + src/cairo-ft-font.c | 16 ++++++++-------- + src/cairo-gstate.c | 16 ++++++++-------- + src/cairo.h | 8 ++++---- + src/cairo_ft_font.c | 16 ++++++++-------- + src/cairo_gstate.c | 16 ++++++++-------- + 6 files changed, 48 insertions(+), 36 deletions(-) + +commit 39bb4f1d99a23c8668fd73f4616f8811b9db1f4b +Author: Carl Worth +Date: Mon Dec 15 18:26:51 2003 +0000 + + Need to divide out the scale factor to return user-space extents. (_cairo_gstate_glyph_extents): Don't transform glyph locations as they're not relevant to extents. + Clean up implementation. (_cairo_ft_font_glyph_extents): Initial implementation. Thanks to John Ellson for most of the work on this function. (_cairo_ft_font_show_text): Clean to use num_glyphs not nglyphs. + Re-enable cairo_text/glyph_extents. + + ChangeLog | 19 +++++++++++ + src/cairo-ft-font.c | 98 ++++++++++++++++++++++++++++++++++++++++++----------- + src/cairo-gstate.c | 45 +++++++++++++----------- + src/cairo.c | 2 -- + src/cairo.h | 5 ++- + src/cairo_ft_font.c | 98 ++++++++++++++++++++++++++++++++++++++++++----------- + src/cairo_gstate.c | 45 +++++++++++++----------- + src/cairoint.h | 3 ++ + 8 files changed, 232 insertions(+), 83 deletions(-) + +commit 9d4fe7e36990e39f849b0983daff6bf0b690458a +Author: Carl Worth +Date: Mon Dec 15 18:02:03 2003 +0000 + + Move this function from cairo_ft_font.c (_get_scale_factors). + + ChangeLog | 3 +++ + src/cairo-ft-font.c | 18 ++---------------- + src/cairo-matrix.c | 19 +++++++++++++++++++ + src/cairo_ft_font.c | 18 ++---------------- + src/cairo_matrix.c | 19 +++++++++++++++++++ + 5 files changed, 45 insertions(+), 32 deletions(-) + +commit 0095dcb49d5a10f8ab62aeff1809587250a09575 +Author: Carl Worth +Date: Mon Dec 15 17:26:25 2003 +0000 + + Fix minor errors in fixed/floating-point conversion. + + ChangeLog | 3 +++ + src/cairo-ft-font.c | 10 ++++------ + src/cairo_ft_font.c | 10 ++++------ + 3 files changed, 11 insertions(+), 12 deletions(-) + +commit 1cd1330aa3967fb57a646a60e4fcb478c631cda6 +Author: Carl Worth +Date: Mon Dec 15 14:20:56 2003 +0000 + + font->show_glyphs no longer accepts an offset point. + _utf8_to_glyphs now accepts a point by which each glyph should be offset. (cairo_ft_font_backend): Remove evil void * casts on function pointers. + Fix to not require a current point. + Move initialization of current device-space point from setup_text_rendering_context to _cairo_gstate_show_text. (_cairo_gstate_show_glyphs): Fix to not reference current point. + + ChangeLog | 22 ++++++++++++++++++++++ + src/cairo-font.c | 4 +--- + src/cairo-ft-font.c | 40 ++++++++++++++++++++-------------------- + src/cairo-gstate.c | 34 ++++++++++++++++------------------ + src/cairo_font.c | 4 +--- + src/cairo_ft_font.c | 40 ++++++++++++++++++++-------------------- + src/cairo_gstate.c | 34 ++++++++++++++++------------------ + src/cairoint.h | 4 ---- + 8 files changed, 96 insertions(+), 86 deletions(-) + +commit 8b00a61e8b2f6dbbe7e19a40959fada69469106c +Author: Dave Beckett +Date: Fri Dec 12 16:00:19 2003 +0000 + + Add compatibility defines FONTCONFIG_LIBS, X_LIBS, XRENDER_LIBS to keep automake happy - they look like automake variable names. + + ChangeLog | 6 ++++++ + src/Makefile.am | 8 ++++++++ + 2 files changed, 14 insertions(+) + +commit b694e4d1ffa480c0ec151a3030eb2dfca63b5b93 +Author: Dave Beckett +Date: Fri Dec 12 15:11:23 2003 +0000 + + (libpixman_la_SOURCES): slim_export.h slim_import.h gone. + + pixman/ChangeLog | 1 + + pixman/src/Makefile.am | 2 -- + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit d9febe2fb4e14efefb4463a74bb9e6758c8cccfc +Author: Dave Beckett +Date: Fri Dec 12 15:10:12 2003 +0000 + + src/Makefile.am: Remove LIBPIXMAN_CFLAGS/LIBS cruft. + + pixman/ChangeLog | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 09abb6df40522318f106a0d612fa2b7c98ddca8c +Author: Dave Beckett +Date: Fri Dec 12 15:09:55 2003 +0000 + + Remove LIBPIXMAN_CFLAGS/LIBS cruft. + + pixman/src/Makefile.am | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 2309a8b98ace453aabcc955df369ca19bc3f4f54 +Author: Carl Worth +Date: Fri Dec 12 12:00:50 2003 +0000 + + Add comment about building in a font. + Check for NULL return value from cairo_ft_font_create. + + ChangeLog | 6 ++++++ + src/cairo-font.c | 6 ++++++ + src/cairo-ft-font.c | 3 +++ + src/cairo_font.c | 6 ++++++ + src/cairo_ft_font.c | 3 +++ + 5 files changed, 24 insertions(+) + +commit e232072c12d5bd4bc1d093658428007e47114a2e +Author: Carl Worth +Date: Fri Dec 12 11:44:16 2003 +0000 + + Add conditionals for ps_surface functions, etc. + Get rid of AC_PATH_XTRA. Instead, find X includes/libraries only via pkg-config xrender. Switch option from --without-x to --disable-xlib Add option --disable-ps + Add -lz only if ps_surface backend is compiled. + + ChangeLog | 12 ++++++++++++ + cairo.pc.in | 2 +- + configure.in | 28 +++++++++++++++++++++++----- + src/Makefile.am | 8 +++++--- + src/cairo-features.h.in | 2 ++ + src/cairo.h | 10 ++++++++++ + 6 files changed, 53 insertions(+), 9 deletions(-) + +commit a02d8aaa595b4893f9b25715c0bd5fbc8ee7b3c8 +Author: Carl Worth +Date: Fri Dec 12 11:02:07 2003 +0000 + + Add missing definitions from slim_import.h. + + ChangeLog | 5 +++++ + src/cairo.h | 10 +++++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 47000a1737c02fc2cebcdfbefb9eb505f8824341 +Author: Carl Worth +Date: Fri Dec 12 10:51:21 2003 +0000 + + Updated .cvsignore + + pixman/.cvsignore | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 0278468fc1f68bc40348a3a387baa72dca357256 +Author: Carl Worth +Date: Fri Dec 12 10:47:59 2003 +0000 + + Fold contents of slim_export/import.h directly into this file to avoid dependence on external slim package. + Use quote-based include now that slim_internal is an internal file. + Follow convention of other files for multi-inclusion guard (_IC_INT_H_) + Remove cruft. + + pixman/ChangeLog | 15 ++++++++++++++ + pixman/configure.in | 8 ------- + pixman/src/icint.h | 8 +++---- + pixman/src/pixman.h | 13 ++++++++---- + pixman/src/pixregion.c | 2 +- + pixman/src/slim_export.h | 54 ------------------------------------------------ + pixman/src/slim_import.h | 53 ----------------------------------------------- + 7 files changed, 29 insertions(+), 124 deletions(-) + +commit 849c780a63ecb0733f0cbe5cc90f2e9a1b77b7f7 +Author: Carl Worth +Date: Thu Dec 11 13:04:39 2003 +0000 + + Rename surface->ic_image to surface->pixman_image. + Rename functions and indentifiers with ic_ in the name that were missed by the recent renaming. Fix indentation problems left by the recent renaming. + Shift everything over from libic/libpixregion/slim to libpixman. Many thanks to Dave Beckett for all of the heavy lifting with this renaming effort. + + ChangeLog | 24 +++++++ + src/cairo-image-surface.c | 160 +++++++++++++++++++++++----------------------- + src/cairo_image_surface.c | 160 +++++++++++++++++++++++----------------------- + src/cairoint.h | 2 +- + 4 files changed, 185 insertions(+), 161 deletions(-) + +commit 5b38b14ff2bf8cfc74f5f14339d3aeff0d01a769 +Author: Carl Worth +Date: Thu Dec 11 12:43:58 2003 +0000 + + Directly fold in slim stuff rather than depending on it from an external package. + Switch from libic to libpixman. + Include pixman.h not ic.h. (__external_linkage): Directly fold in slim stuff rather than depending on it from an external package. + Look for libpixman instead of libic and slim. + + ChangeLog | 16 +++++++ + cairo.pc.in | 2 +- + configure.in | 2 +- + src/Makefile.am | 2 +- + src/cairo-image-surface.c | 120 +++++++++++++++++++++++----------------------- + src/cairo-ps-surface.c | 2 +- + src/cairo.h | 15 +++--- + src/cairo_image_surface.c | 120 +++++++++++++++++++++++----------------------- + src/cairo_ps_surface.c | 2 +- + src/cairoint.h | 30 +++++++++++- + 10 files changed, 177 insertions(+), 134 deletions(-) + +commit 18ae004832b6bf3d12a8ee4e9199bc847a46031f +Author: Andrew Chant +Date: Thu Dec 11 11:12:59 2003 +0000 + + cairo_select_font: _cairo_font_create: _cairo_gstate_select_font: cairo_ft_font_create: change char * family to const char * family + + ChangeLog | 8 ++++++++ + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairo_font.c | 2 +- + src/cairo_ft_font.c | 2 +- + src/cairo_gstate.c | 2 +- + src/cairoint.h | 4 ++-- + 10 files changed, 18 insertions(+), 10 deletions(-) + +commit c2696a7d8d6158345f0d386b8aa90c4634a7e254 +Author: Carl Worth +Date: Thu Dec 11 10:01:10 2003 +0000 + + Replace mysterious image->depth == 32 ? 24 : image->depth with simply image->depth. + + ChangeLog | 6 ++++++ + src/cairo-xlib-surface.c | 2 +- + src/cairo_xlib_surface.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 6cd6ac5a0572666990c6db9492ddf9fc0579a71a +Author: Carl Worth +Date: Thu Dec 11 09:35:07 2003 +0000 + + Add xrender to cairo.pc Renders line if needed. + + ChangeLog | 5 +++++ + cairo.pc.in | 2 +- + configure.in | 2 ++ + 3 files changed, 8 insertions(+), 1 deletion(-) + +commit b95d2066a56f656df0a1be5fe32115a186d4e46a +Author: Carl Worth +Date: Thu Dec 11 07:03:41 2003 +0000 + + Fix to use shifts and masks for endianness-correct PS image generation. Rename bgr to rgb now that the byte order issues are clear. + + ChangeLog | 7 +++++++ + src/cairo-ps-surface.c | 27 +++++++++++++-------------- + src/cairo_ps_surface.c | 27 +++++++++++++-------------- + 3 files changed, 33 insertions(+), 28 deletions(-) + +commit 9da5af44f4e999cf4394e114cdb799bb4dd054ad +Author: Dave Beckett +Date: Wed Dec 10 15:42:01 2003 +0000 + + Correct some more renames where the order of the renaming caused later renames to fail due to earlier prefixes failing. + + pixman/ChangeLog | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit b24029f4d05b2ba6951f0442dc68033f9727bda4 +Author: Dave Beckett +Date: Wed Dec 10 15:41:14 2003 +0000 + + fixes for wrong order of renames + + pixman/update.pl | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit af1ab1a9f25bf7465ae5d4addcfa99a82bddd5e0 +Author: Dave Beckett +Date: Wed Dec 10 15:39:45 2003 +0000 + + Correct some more renames where the order of the renaming caused later renames to fail due to earlier prefixes failing. + + pixman/src/ic.c | 2 +- + pixman/src/icformat.c | 12 ++++++------ + pixman/src/icimage.c | 4 ++-- + pixman/src/ictrap.c | 2 +- + pixman/src/ictri.c | 6 +++--- + pixman/src/pixman.h | 20 ++++++++++---------- + pixman/src/pixregion.c | 12 ++++++------ + 7 files changed, 29 insertions(+), 29 deletions(-) + +commit 4409b9fff97a34256c70de0c579d279557cd6017 +Author: Dave Beckett +Date: Wed Dec 10 15:27:11 2003 +0000 + + Add rename fixes + + pixman/update.pl | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit 22b133453dbf54ada09399535b632b2e66f97e73 +Author: Dave Beckett +Date: Wed Dec 10 15:25:38 2003 +0000 + + Correct over-eager renames of the form pixman_thing_tName into pixman_thing_name. It was inevitable really this would happen! + + pixman/ChangeLog | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4ecffdf8b9d7cf0a9bbd46d140d8b552957ee485 +Author: Dave Beckett +Date: Wed Dec 10 15:23:11 2003 +0000 + + Correct over-eager renames of the form pixman_thing_tName into pixman_thing_name. It was inevitable really this would happen! + + pixman/src/iccolor.c | 4 +- + pixman/src/iccompose.c | 4 +- + pixman/src/icformat.c | 24 +++++----- + pixman/src/icimage.c | 48 +++++++++---------- + pixman/src/icimage.h | 4 +- + pixman/src/icint.h | 16 +++---- + pixman/src/icpixels.c | 8 ++-- + pixman/src/icrect.c | 10 ++-- + pixman/src/ictransform.c | 2 +- + pixman/src/ictrap.c | 32 ++++++------- + pixman/src/ictri.c | 42 ++++++++--------- + pixman/src/pixman.h | 34 +++++++------- + pixman/src/pixregion.c | 116 +++++++++++++++++++++++----------------------- + pixman/src/pixregionint.h | 4 +- + 14 files changed, 174 insertions(+), 174 deletions(-) + +commit 0070bd372cdc8c2383c78e1d0f90552f9167526b +Author: Dave Beckett +Date: Wed Dec 10 14:28:55 2003 +0000 + + Added helper script for updating names in source. + + pixman/ChangeLog | 2 + + pixman/update.pl | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 113 insertions(+) + +commit c2d04cfb0b83ddc90f8fce58c53228abf4ca6d9f +Author: Dave Beckett +Date: Wed Dec 10 14:26:22 2003 +0000 + + Rename exported Ic* and PixRegion* functions, types, enums to be prefixed pixman (or PIXMAN for enum values) + + pixman/ChangeLog | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 94988dbe09e93e0de0ee1706b8f2e1caf79b5238 +Author: Dave Beckett +Date: Wed Dec 10 14:20:05 2003 +0000 + + Rename exported Ic* and PixRegion* functions, types, enums to be prefixed pixman (or PIXMAN for enum values) + + pixman/src/ic.c | 190 ++++++------ + pixman/src/icblt.c | 74 ++--- + pixman/src/icbltone.c | 42 +-- + pixman/src/iccolor.c | 14 +- + pixman/src/iccompose.c | 714 +++++++++++++++++++++--------------------- + pixman/src/icformat.c | 40 +-- + pixman/src/icimage.c | 156 +++++----- + pixman/src/icimage.h | 110 +++---- + pixman/src/icint.h | 290 ++++++++--------- + pixman/src/icpixels.c | 20 +- + pixman/src/icrect.c | 64 ++-- + pixman/src/icrop.h | 22 +- + pixman/src/icstipple.c | 6 +- + pixman/src/ictransform.c | 6 +- + pixman/src/ictrap.c | 82 ++--- + pixman/src/ictri.c | 110 +++---- + pixman/src/icutil.c | 28 +- + pixman/src/pixman.h | 332 ++++++++++---------- + pixman/src/pixregion.c | 770 +++++++++++++++++++++++----------------------- + pixman/src/pixregionint.h | 26 +- + 20 files changed, 1548 insertions(+), 1548 deletions(-) + +commit e39e756403b44bd77aa89f17b1241249565431e2 +Author: Dave Beckett +Date: Wed Dec 10 14:04:15 2003 +0000 + + libpixman is the pixel manipulation library + + pixman/ChangeLog | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2841a7184299882c45f8364fb6c0798ffdb00471 +Author: Dave Beckett +Date: Wed Dec 10 13:29:40 2003 +0000 + + libpixman is the pixel manipulation library + + pixman/README | 6 +++--- + pixman/libpixman.pc.in | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 05bcf7a4b50f7c711ab66971912d0d752a59fcd6 +Author: Dave Beckett +Date: Tue Dec 9 16:10:29 2003 +0000 + + Initial version with the following changes to do the merging: + Change ic.h/pixregion.h headers inclusions to be pixman.h + Removed ic.h, merged into pixman.h + Merged pixregion.h (former name and CVS history of this file) and ic.h (now CVS deleted here). + Updated for libpixregion,libic to libpixman source merges. Added -I$(srcdir) so we get internal headers from here even when srcdir != builddir. + Updated for libpixregion,libic to libpixman package name, dependencies. + Merge of libic, slim AUTHORS, COPYING, README + Initial repository copy of libpixregion, libic, slim CVS. + Constructed a merged ChangeLog below via emacs VC mode (which rocks!) + + pixman/ChangeLog | 351 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 351 insertions(+) + +commit 7ba9ad29733e25399bf6f70232ce97f065d43d91 +Author: Dave Beckett +Date: Tue Dec 9 16:09:33 2003 +0000 + + Change ic.h/pixregion.h headers inclusions to be pixman.h + + pixman/src/icint.h | 4 ++-- + pixman/src/pixregionint.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit b76a5ccf7f78b68ff7eeea84af7930e09854581b +Author: Dave Beckett +Date: Tue Dec 9 16:08:36 2003 +0000 + + Removed ic.h, merged into pixman.h + + pixman/src/ic.h | 304 -------------------------------------------------------- + 1 file changed, 304 deletions(-) + +commit 08e0943c9f175df5647258937977fc584cb15a94 +Author: Dave Beckett +Date: Tue Dec 9 16:08:16 2003 +0000 + + Merged pixregion.h (former name and CVS history of this file) and ic.h (now CVS deleted here). + + pixman/src/pixman.h | 309 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 304 insertions(+), 5 deletions(-) + +commit 9b086c333057d824aabcc7af1a66fa707152835c +Author: Dave Beckett +Date: Tue Dec 9 16:06:52 2003 +0000 + + Updated for libpixregion,libic to libpixman source merges. Added -I$(srcdir) so we get internal headers from here even when srcdir != builddir. + + pixman/src/Makefile.am | 36 ++++++++++++++++++++++++++++-------- + 1 file changed, 28 insertions(+), 8 deletions(-) + +commit d5bcf9e4f03017c474eae8c96a673f7348c8959c +Author: Dave Beckett +Date: Tue Dec 9 16:05:24 2003 +0000 + + Updated for libpixregion,libic to libpixman package name, dependencies. + + pixman/Makefile.am | 7 +++++-- + pixman/configure.in | 18 +++++++++--------- + pixman/libpixman.pc.in | 7 +++---- + 3 files changed, 17 insertions(+), 15 deletions(-) + +commit 43129191fe6d829cd0ebb5da9bdbbf5aac3a4b3c +Author: Dave Beckett +Date: Tue Dec 9 15:59:18 2003 +0000 + + Merge of libic, slim AUTHORS, COPYING, README + + pixman/AUTHORS | 6 ++++++ + pixman/COPYING | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + pixman/README | 32 ++++++++++++++++++++++++++++++++ + 3 files changed, 88 insertions(+) + +commit f59f92836c610dd27c24d75fcc17bfdb4921f336 +Author: Carl Worth +Date: Mon Dec 8 18:07:56 2003 +0000 + + Allow names of all autofoo programs to be overridden via environment variables. + + pixman/ChangeLog.libic | 5 +++++ + pixman/ChangeLog.libpixregion | 5 +++++ + pixman/autogen.sh | 18 +++++++++++++----- + 3 files changed, 23 insertions(+), 5 deletions(-) + +commit 0949a86dd1cbe301c2d6ffc1aa4606d31b62cc39 +Author: Carl Worth +Date: Mon Dec 8 17:39:32 2003 +0000 + + Track change in cairo_path_callbacks interface. + + ChangeLog | 6 ++++++ + src/cairo-path-bounds.c | 46 ++++++++++++++++++++++++++++++---------------- + src/cairo_path_bounds.c | 46 ++++++++++++++++++++++++++++++---------------- + 3 files changed, 66 insertions(+), 32 deletions(-) + +commit 08553e75b7db97a3176e40768231c88f9b8eeabd +Author: Carl Worth +Date: Mon Dec 8 13:38:26 2003 +0000 + + Clean up cairo_path_callbacks to have move_to, line_to, curve_to, abd close_path instead of add_edge, add_spline, and done_sub_path. Much, much nicer. + Provide cairo_polygon_move_to and cairo_polygon_line_to instead of cairo_polygon_add_point. + Track change in cairo_polygon interface. + + ChangeLog | 16 +++ + src/cairo-path-fill.c | 101 ++++++++++++++----- + src/cairo-path-stroke.c | 253 +++++++++++++++++++++++++++++------------------- + src/cairo-path.c | 56 ++--------- + src/cairo-pen.c | 2 +- + src/cairo-polygon.c | 56 +++++------ + src/cairo_path.c | 56 ++--------- + src/cairo_path_fill.c | 101 ++++++++++++++----- + src/cairo_path_stroke.c | 253 +++++++++++++++++++++++++++++------------------- + src/cairo_pen.c | 2 +- + src/cairo_polygon.c | 56 +++++------ + src/cairoint.h | 22 ++--- + 12 files changed, 554 insertions(+), 420 deletions(-) + +commit 6aff3cbf96dca64e755075add11acc7fc35d6ebd +Author: Carl Worth +Date: Mon Dec 8 12:31:22 2003 +0000 + + Bump version to 0.1.16 since it actually has a hope of building, (due to fix for broken cairo-xlib.h includes). + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 76e2cd9a743538222fe77f11e95e174fadd1b308 +Author: Carl Worth +Date: Fri Dec 5 10:47:42 2003 +0000 + + Don't include obsolete cairo-xlib.h. + + ChangeLog | 2 ++ + src/cairo-xlib-surface.c | 1 - + src/cairo_xlib_surface.c | 1 - + 3 files changed, 2 insertions(+), 2 deletions(-) + +commit 97666464c0a38d5904869af1c742c87c3be15067 +Author: Carl Worth +Date: Fri Dec 5 10:30:39 2003 +0000 + + Allow names of all autofoo programs to be overridden via environment variables. + + ChangeLog | 3 +++ + autogen.sh | 18 +++++++++++++----- + 2 files changed, 16 insertions(+), 5 deletions(-) + +commit 928095693bff00e38b6d369ee0e7931f136f9082 +Author: Carl Worth +Date: Fri Dec 5 08:53:07 2003 +0000 + + Bump version to 0.1.15 for new CAIRO_HAS_XLIB_SURFACE macro. + Add missing #include + Rename cairo-config.h to cairo-features.h. + Rename XLIB_BACKEND_DEFINE to XLIB_SURFACE_FEATURE. Rename AM_CONDITIONAL HAVE_XLIB_BACKEND to CAIRO_HAS_XLIB_SURFACE. Rename user-visibile macro CAIRO_HAS_XLIB_BACKEND to CAIRO_HAS_XLIB_SURFACE. + + ChangeLog | 14 ++++++++++++++ + configure.in | 12 ++++++------ + src/.cvsignore | 2 +- + src/Makefile.am | 4 ++-- + src/cairo-config.h.in | 33 --------------------------------- + src/cairo-features.h.in | 33 +++++++++++++++++++++++++++++++++ + src/cairo.h | 10 ++++++---- + 7 files changed, 62 insertions(+), 46 deletions(-) + +commit aae17d3b6b15881f7bd8c4fac6a14a0c7b6729e6 +Author: Carl Worth +Date: Wed Dec 3 12:27:44 2003 +0000 + + Bumped version to 0.1.14 to indicate dropped cairo-xlib.h and new cairo-config.h. + New support for "./configure --without-x" to compile without the xlib backend. Many thanks to Sasha V. . + We do three things here: Make the pkg-config check for xrender conditional, set XLIB_BACKEND_DEFINE to either CAIRO_HAS_XLIB_BACKEND or CAIRO_HAS_NO_XLIB_BACKEND to be substituted into cairo-config.h, and set an AM_CONDITIONAL for HAVE_XLIB_BACKEND to enable conditional compilation of cairo_xlib_surface.c. Perhaps that could be simplified a tad, but it's what we have working now. Also split up various PKG_CHECK_MODULES into separate checks. + Remove errant reference to cairo_gstate_set_drawable. + Move xlib-specific calls in from old cairo-xlib.h, now guarded in #ifdef CAIRO_HAS_XLIB_BACKEND. + Make compilation of cairo_xlib_surface.c conditional. (INCLUDES, libcairo_la_LIBADD): Add the new variables from splitting up the PKG_CHECK_MODULES calls. + + ChangeLog | 28 +++++++++++++++++++++ + configure.in | 19 +++++++++++++-- + src/.cvsignore | 1 + + src/Makefile.am | 14 ++++++++--- + src/cairo-config.h.in | 33 +++++++++++++++++++++++++ + src/cairo-xlib.h | 67 --------------------------------------------------- + src/cairo.h | 28 +++++++++++++++++++++ + src/cairoint.h | 5 ---- + 8 files changed, 117 insertions(+), 78 deletions(-) + +commit 9cf63b0390b71693a0eb3ba2e6065f7d3f6e240c +Author: Carl Worth +Date: Wed Dec 3 07:14:59 2003 +0000 + + Add -lz for the compress function used in the PS backend. + + ChangeLog | 5 +++++ + cairo.pc.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit ae96c8ab929513710cb11d71697759c4c3484aff +Author: Keith Packard +Date: Mon Dec 1 10:59:57 2003 +0000 + + Add note about degenerate path caps being broken + + ChangeLog | 5 +++++ + TODO | 3 +++ + 2 files changed, 8 insertions(+) + +commit 3369c676f0c8a6ce1e7531250a29726b650ecfcf +Author: Carl Worth +Date: Tue Nov 25 07:45:34 2003 +0000 + + Bump version to 0.1.5 for new 64-bit fixes. + One more fix needed for 64-bit machine (alpha in this case). Thanks to Jakub Bogusz . + + pixman/ChangeLog.libic | 8 ++++++++ + pixman/src/icutil.c | 4 ++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit 765a1ad0fd63abb055bb1cc2e1e2f48541cc5d81 +Author: Carl Worth +Date: Fri Nov 21 06:22:02 2003 +0000 + + Use 0 and 1 not False and True, (to avoid false dependency on X headers). + Use cairo_point_double_t not XPointDouble, (to avoid false dependency on X headers). Thanks to "Sasha V." for pointing these out. + + ChangeLog | 10 ++++++++++ + src/cairo-path-stroke.c | 2 +- + src/cairo-polygon.c | 4 ++-- + src/cairo_path_stroke.c | 2 +- + src/cairo_polygon.c | 4 ++-- + 5 files changed, 16 insertions(+), 6 deletions(-) + +commit 567f28e62a6d8dee7edd7357f01dd04562b3d071 +Author: Carl Worth +Date: Tue Nov 18 13:21:29 2003 +0000 + + Bump version to 0.1.13 for new freetype header compatibility. Fix comments regarding freetype version checking. + + ChangeLog | 6 ++++++ + configure.in | 6 +++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit a26c3d4a5925bf971dfac5be0ee492e5c7cb51a2 +Author: James Henstridge +Date: Tue Nov 18 07:28:16 2003 +0000 + + add FREETYPE_CFLAGS/LIBS to Libs/Cflags rather than requiring "freetype2", which doesn't exist in anything but the most recent version of freetype. + add freetype cflags/libs substitutions. + + ChangeLog | 9 +++++++++ + cairo.pc.in | 6 +++--- + configure.in | 9 +++++++-- + 3 files changed, 19 insertions(+), 5 deletions(-) + +commit 97cfea914d5276bd575264827293c3dfe458e678 +Author: Carl Worth +Date: Tue Nov 18 06:18:05 2003 +0000 + + Fix build for new freetype header include mechanism, (thanks to Christof Petig ) + + ChangeLog | 5 +++++ + src/cairo.h | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 75ced44ae08358f1e8f64ecd1e93b69996e4b595 +Author: Carl Worth +Date: Mon Nov 17 07:43:06 2003 +0000 + + Fixes needed to compile libic on x86_64. Many thanks to David R Bacon . + + pixman/ChangeLog.libic | 6 ++++++ + pixman/src/icrop.h | 2 +- + pixman/src/icutil.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit f27af5d98d90395b6bddceecfec0d12181af5a50 +Author: Carl Worth +Date: Mon Nov 17 07:04:15 2003 +0000 + + Remove infinite looping when stroking with a line width at or close to 0.0. Thanks to Rob Buis and Noah Levitt for providing in-the-wild examples of SVG files with stroke-width:0 that demonstrated the problem, (cowboy.svg and albania.svg). + Do nothing if the pen is a degenerate, single point. This happens when the line width is a very small, non-zero value. + Do nothing when asked to stroke a path with a line_width of 0.0. Previously, this would lead to an infinite loop. + Force negative line width to 0.0. + Updated TODO list. + + ChangeLog | 21 +++++++++++++++++++++ + TODO | 18 +++++++++++++----- + src/cairo-gstate.c | 3 +++ + src/cairo-pen.c | 5 +++++ + src/cairo.c | 2 ++ + src/cairo_gstate.c | 3 +++ + src/cairo_pen.c | 5 +++++ + 7 files changed, 52 insertions(+), 5 deletions(-) + +commit 399803d067ab60d11cd20fd5826fae281c4081ae +Author: Carl Worth +Date: Mon Nov 10 08:16:34 2003 +0000 + + Fix typo (thanks to John Ellson ) + Add TODO items for intersection problem, programmatic patterns, missing text functions. + + ChangeLog | 8 ++++++++ + TODO | 19 +++++++++++++------ + configure.in | 2 +- + 3 files changed, 22 insertions(+), 7 deletions(-) + +commit 9aa2d445b7de7a8ebdf98c8bb6a13f985ee11b86 +Author: Dave Beckett +Date: Sat Nov 8 10:28:04 2003 +0000 + + Use freetype-config to get the freetype2 compiling and linking flags rather than use pkg-config which requires a quite new freetype2 to get freetype2.pc + + configure.in | 42 +++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 41 insertions(+), 1 deletion(-) + +commit f0d9ab5b2963bf2a35f09944de0d7084c4cfaa71 +Author: Carl Worth +Date: Fri Nov 7 11:03:09 2003 +0000 + + Move declaration to beginning of function to avoid requiring a C99-compatible compiler. + + ChangeLog | 3 +++ + 1 file changed, 3 insertions(+) + +commit f86a979b49d3a737afea4697eeb9bce965587e3f +Author: Carl Worth +Date: Thu Nov 6 18:33:28 2003 +0000 + + Bumped version to 0.1.12 for new cairo_in_stroke and cairo_in_fill functions. + Added new cairo_in_stroke and cairo_in_fill. + * src/cairo_gstate.c (_cairo_gstate_in_stroke): (_cairo_gstate_in_fill): New functions to support for cairo_in_stroke and cairo_in_fill. Many thanks to Thomas Hunger for the initial implementation which demonstrated how easy this would be and pushed me to go and write it already. + Fixed to use _cairo_fixed_from_double instead of XDoubleToFixed. + + ChangeLog | 25 ++++++++++++++++++++++++ + configure.in | 2 +- + src/cairo-gstate.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo-path.c | 20 +++++++++---------- + src/cairo-traps.c | 44 +++++++++++++++++++++++++++++++++++++++++- + src/cairo.c | 32 +++++++++++++++++++++++++++++++ + src/cairo.h | 7 +++++++ + src/cairo_gstate.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo_path.c | 20 +++++++++---------- + src/cairo_traps.c | 44 +++++++++++++++++++++++++++++++++++++++++- + src/cairoint.h | 15 +++++++++++++++ + 11 files changed, 294 insertions(+), 27 deletions(-) + +commit a3ad0527950b7e161382d25a4891f403fcd87477 +Author: Carl Worth +Date: Thu Nov 6 13:32:15 2003 +0000 + + Move declaration to beginning of function to avoid requiring a C99-compatible compiler. + + src/cairo.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7262e1554f83d011c77603298615a25102adf414 +Author: Carl Worth +Date: Thu Nov 6 12:53:39 2003 +0000 + + Add comment pondering memory management semantics of cairo_current_target_surface. + NULL out pen->vertices after free. + NULL out durface->data after free. + + ChangeLog | 12 ++++++++++++ + src/cairo-gstate.c | 5 +++++ + src/cairo-image-surface.c | 4 +++- + src/cairo-pen.c | 2 ++ + src/cairo.h | 2 ++ + src/cairo_gstate.c | 5 +++++ + src/cairo_image_surface.c | 4 +++- + src/cairo_pen.c | 2 ++ + 8 files changed, 34 insertions(+), 2 deletions(-) + +commit 3262cd9f9501b91d57b54a2bf4743138bea179ee +Author: Carl Worth +Date: Thu Nov 6 07:56:10 2003 +0000 + + Removed stale version from ic.h. Better to have no version listed than the wrong one. + + pixman/ChangeLog.libic | 9 +++++++++ + pixman/src/ic.h | 5 ----- + 2 files changed, 9 insertions(+), 5 deletions(-) + +commit 443b8cb6a295495b293cd65a62177f5d9799dec4 +Author: Carl Worth +Date: Tue Nov 4 10:46:45 2003 +0000 + + Enable cairo_set_target_surface (cr, NULL) to work. This can be useful to force the current target surface to be finalized. + + ChangeLog | 4 ++++ + src/cairo-gstate.c | 7 +++++++ + src/cairo_gstate.c | 7 +++++++ + 3 files changed, 18 insertions(+) + +commit 05b399242937a79b8f2242220ff8ba27041cec23 +Author: Carl Worth +Date: Tue Nov 4 08:58:53 2003 +0000 + + Add explicit fontconfig and freetype2 dependencies that were implicitly dropped along with Xft. + + ChangeLog | 6 ++++++ + cairo.pc.in | 2 +- + configure.in | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 9e25bb231cbe6f4a18f786cd21b59099d09fbbe2 +Author: Carl Worth +Date: Tue Nov 4 08:36:03 2003 +0000 + + TODO: Note that cairo_show_page, cairo_copy_page, PostScript backend, real text API, and text support for the image backend have now all been implemented. + + ChangeLog | 6 ++++++ + TODO | 15 ++++----------- + 2 files changed, 10 insertions(+), 11 deletions(-) + +commit 8d88d5da1758732a995669e46ae10f2703331e29 +Author: Carl Worth +Date: Tue Nov 4 08:33:45 2003 +0000 + + Fix configure.in and cairo.pc.in now that cairo no longer depends on Xft. + + ChangeLog | 6 ++++++ + cairo.pc.in | 2 +- + configure.in | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 7765a3c6767203ca47df34822d529ad2dd4ef970 +Author: Carl Worth +Date: Mon Nov 3 19:17:31 2003 +0000 + + Add support for cairo_copy_page. Fixes so PS output can be more than one page. Bump version to 0.1.11 for new cairo_copy_page. + + ChangeLog | 23 +++++++++++ + configure.in | 2 +- + src/cairo-gstate.c | 9 +++++ + src/cairo-image-surface.c | 7 ++++ + src/cairo-ps-surface.c | 101 ++++++++++++++++++++++++++++++---------------- + src/cairo-surface.c | 15 +++++++ + src/cairo-xlib-surface.c | 7 ++++ + src/cairo.c | 9 +++++ + src/cairo.h | 3 ++ + src/cairo_gstate.c | 9 +++++ + src/cairo_image_surface.c | 7 ++++ + src/cairo_ps_surface.c | 101 ++++++++++++++++++++++++++++++---------------- + src/cairo_surface.c | 15 +++++++ + src/cairo_xlib_surface.c | 7 ++++ + src/cairoint.h | 13 +++++- + 15 files changed, 255 insertions(+), 73 deletions(-) + +commit aa40d2e2e1d3069d5225d046f1760855c9af4132 +Author: Carl Worth +Date: Mon Nov 3 18:24:45 2003 +0000 + + Add several missing checks for out of memory + + ChangeLog | 14 ++++++++++++++ + src/cairo-image-surface.c | 26 ++++++++++++++++++++------ + src/cairo-ps-surface.c | 4 ++++ + src/cairo_image_surface.c | 26 ++++++++++++++++++++------ + src/cairo_ps_surface.c | 4 ++++ + 5 files changed, 62 insertions(+), 12 deletions(-) + +commit cbc1ea78d6209d9a1fbdaa806d16797644ab0a18 +Author: Carl Worth +Date: Mon Nov 3 13:44:53 2003 +0000 + + Added __external_linkage to a few functions that were missing it. + + ChangeLog | 5 +++++ + src/cairo.h | 10 +++++----- + 2 files changed, 10 insertions(+), 5 deletions(-) + +commit 0819fbb164442f0feb69617275859e5c2af3c0a1 +Author: Carl Worth +Date: Sat Nov 1 05:23:55 2003 +0000 + + Add IcImageGetDepth. Bump version to 0.1.3 + + pixman/ChangeLog.libic | 6 ++++++ + pixman/src/ic.h | 3 +++ + pixman/src/icimage.c | 6 ++++++ + 3 files changed, 15 insertions(+) + +commit 51da155707f207691cdcc39ac46bd93bdc3a61c9 +Author: Carl Worth +Date: Fri Oct 31 21:56:14 2003 +0000 + + Fix misplacement of PS origin, (was translating vertically by width instead of height). + + ChangeLog | 4 ++++ + src/cairo-ps-surface.c | 2 +- + src/cairo_ps_surface.c | 2 +- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit c6255f9c295dc2b273b8aa4c5ce558d6d2a05887 +Author: Carl Worth +Date: Fri Oct 31 21:30:35 2003 +0000 + + Implemented preliminary PostScript output support. Added cairo_show_page. Bumped version number to 0.1.10 + + ChangeLog | 29 ++++ + configure.in | 2 +- + src/Makefile.am | 1 + + src/cairo-gstate.c | 9 ++ + src/cairo-image-surface.c | 18 ++- + src/cairo-ps-surface.c | 377 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-surface.c | 15 ++ + src/cairo-xlib-surface.c | 7 +- + src/cairo.c | 9 ++ + src/cairo.h | 49 +++++- + src/cairo_gstate.c | 9 ++ + src/cairo_image_surface.c | 18 ++- + src/cairo_ps_surface.c | 377 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_surface.c | 15 ++ + src/cairo_xlib_surface.c | 7 +- + src/cairoint.h | 16 +- + 16 files changed, 942 insertions(+), 16 deletions(-) + +commit 9736375a7a106b9fd6745dcea26572a63f1334f5 +Author: Carl Worth +Date: Fri Oct 31 19:27:33 2003 +0000 + + Do nothing when radius <= 0.0, (which is much better than the current infinite loop). + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 6 ++++++ + src/cairo_gstate.c | 6 ++++++ + 3 files changed, 18 insertions(+) + +commit 32df4d217d968123de3c03760b951b9cc891e850 +Author: Carl Worth +Date: Fri Oct 31 10:41:37 2003 +0000 + + Moved all libic-related drawing into cairo_image_surface.c + + ChangeLog | 66 +++++++ + configure.in | 2 +- + src/Makefile.am | 43 ++--- + src/cairo-ft-font.c | 97 ++++++----- + src/cairo-gstate.c | 118 ++++++++----- + src/cairo-image-surface.c | 429 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-surface.c | 348 ++++++++++++------------------------- + src/cairo-xlib-surface.c | 386 ++++++++++++++++++++++++----------------- + src/cairo-xlib.h | 2 + + src/cairo.c | 6 +- + src/cairo.h | 92 +++++----- + src/cairo_ft_font.c | 97 ++++++----- + src/cairo_gstate.c | 118 ++++++++----- + src/cairo_image_surface.c | 429 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_surface.c | 348 ++++++++++++------------------------- + src/cairo_xlib_surface.c | 386 ++++++++++++++++++++++++----------------- + src/cairoint.h | 109 ++++++++---- + 17 files changed, 1999 insertions(+), 1077 deletions(-) + +commit 6dca2ab9d3c6e3801ce7887b9ad40f45385f00f0 +Author: Carl Worth +Date: Thu Oct 30 18:39:20 2003 +0000 + + Fixed a few memory leaks + + ChangeLog | 8 ++++++++ + src/cairo-xlib-surface.c | 40 ++++++++++++++++++++++++++++++++++------ + src/cairo_xlib_surface.c | 40 ++++++++++++++++++++++++++++++++++------ + 3 files changed, 76 insertions(+), 12 deletions(-) + +commit eb40d4b82e9e2b103d12064101b5026b1781794d +Author: Carl Worth +Date: Thu Oct 30 13:28:34 2003 +0000 + + Update copyright information in COPYING + + COPYING | 37 +++++++++++++++++++------------------ + 1 file changed, 19 insertions(+), 18 deletions(-) + +commit 5a9cf4f1a1c096d729cf50b8c0422325d44a5018 +Author: Carl Worth +Date: Thu Oct 30 12:39:49 2003 +0000 + + A set of changes to eliminate the static FT_Library field, (which could introduce nasty problems with respect to threading). With the new code, each font created with the toy API will own its own FT_Library. Meanwhile, cairo_ft_font_create now accepts an FT_Library parameter. + Bumped version number to 0.1.9 + + ChangeLog | 24 +++++++++++++++++++++ + configure.in | 2 +- + src/cairo-ft-font.c | 62 ++++++++++++++++++++++++++++++----------------------- + src/cairo.h | 2 +- + src/cairo_ft_font.c | 62 ++++++++++++++++++++++++++++++----------------------- + 5 files changed, 96 insertions(+), 56 deletions(-) + +commit fb46d7390e0776e888d75533304fb5ce26dca04f +Author: Carl Worth +Date: Thu Oct 30 10:55:04 2003 +0000 + + A few cleanups to eliminate a memory leak. + + ChangeLog | 2 ++ + src/cairo-font.c | 40 +++++----------------------------------- + src/cairo-ft-font.c | 4 ++-- + src/cairo-gstate.c | 8 ++++---- + src/cairo_font.c | 40 +++++----------------------------------- + src/cairo_ft_font.c | 4 ++-- + src/cairo_gstate.c | 8 ++++---- + src/cairoint.h | 8 +------- + 8 files changed, 25 insertions(+), 89 deletions(-) + +commit 5edcd47a91456bbf0ea0313685a31862e8d452e3 +Author: Carl Worth +Date: Thu Oct 30 10:55:04 2003 +0000 + + A few cleanups to eliminate a memory leak. + + ChangeLog | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 249ff3fb3813f69603a75c7aaa39bb8db5510c49 +Author: Carl Worth +Date: Wed Oct 29 12:50:02 2003 +0000 + + Drop AC_CONFIG_AUX_DIR(config) as it was confusing "make distcheck" + + pixman/ChangeLog.libpixregion | 5 +++++ + pixman/configure.in | 2 -- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit fb811db0d2742231510a210b356530aed66f20d5 +Author: Carl Worth +Date: Wed Oct 29 12:21:14 2003 +0000 + + Drop AC_CONFIG_AUX_DIR(config) as it was confusing "make distcheck" + + pixman/ChangeLog.libic | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 22c167e00fd7ad6ff3383d4235fec7894b84f4a2 +Author: Carl Worth +Date: Wed Oct 29 10:54:26 2003 +0000 + + Fix memory leak of image->transform. Remove currently unused DevUnion type and IcImageChange function. + + pixman/ChangeLog.libic | 9 +++++++++ + pixman/src/icimage.c | 3 +++ + pixman/src/icimage.h | 21 --------------------- + 3 files changed, 12 insertions(+), 21 deletions(-) + +commit b806ea9d1b42c9b48b9e7f917b43a115afd88c48 +Author: Carl Worth +Date: Wed Oct 29 10:46:10 2003 +0000 + + Bumped version to 0.1.2 to indicate new IcOperator type. + + pixman/ChangeLog.libic | 3 +++ + 1 file changed, 3 insertions(+) + +commit ece5507937f0a8e9cda7829f5e614597e4668a8a +Author: Carl Worth +Date: Wed Oct 29 10:45:02 2003 +0000 + + Patch from Bryan Worth to eliminate lots of leftover, undesired dependencies on X header files. + + pixman/ChangeLog.libic | 41 +++++++++++++++++++++++ + pixman/src/ic.c | 51 ++++++++++++++-------------- + pixman/src/ic.h | 33 +++++++++++++++---- + pixman/src/icblt.c | 34 +++++++++---------- + pixman/src/icbltone.c | 32 +++++++++--------- + pixman/src/iccolor.c | 10 +++--- + pixman/src/iccompose.c | 34 +++++++++---------- + pixman/src/icimage.c | 86 ++++++++++++++++++++++++------------------------ + pixman/src/icimage.h | 41 +++++++++++------------ + pixman/src/icint.h | 43 +++++++++++++++++------- + pixman/src/icrect.c | 16 ++++----- + pixman/src/ictransform.c | 10 +++--- + pixman/src/ictrap.c | 26 +++++++-------- + pixman/src/ictri.c | 6 ++-- + 14 files changed, 271 insertions(+), 192 deletions(-) + +commit cf882f5d73ee0b630168f66e7fcfcb1cd96f1d2d +Author: Carl Worth +Date: Tue Oct 28 17:32:44 2003 +0000 + + Updated stale text in README + + ChangeLog | 5 +++++ + README | 49 ++++++++++++++++++++++++------------------------- + 2 files changed, 29 insertions(+), 25 deletions(-) + +commit 859bfd03a6132558ad08aeb0c28ae55874a695d5 +Author: Carl Worth +Date: Tue Oct 28 12:18:29 2003 +0000 + + Rename gstate->ppm to gstate->pixels_per_inch. Add new pixels_per_inch to the surface backend. + + ChangeLog | 12 ++++++++++++ + src/cairo-gstate.c | 11 ++++------- + src/cairo-surface.c | 12 +++++++++--- + src/cairo-xlib-surface.c | 8 ++++++++ + src/cairo_gstate.c | 11 ++++------- + src/cairo_surface.c | 12 +++++++++--- + src/cairo_xlib_surface.c | 8 ++++++++ + src/cairoint.h | 10 ++++++++-- + 8 files changed, 62 insertions(+), 22 deletions(-) + +commit 8bb3f7664d2a25be0dd57348fe78e268f40def4e +Author: Carl Worth +Date: Tue Oct 28 12:15:03 2003 +0000 + + Drop cairo_surface_create_similar_solid + + ChangeLog | 15 +++++++++++++ + src/cairo-gstate.c | 64 +++++++++++++++++++++++++++++------------------------ + src/cairo-surface.c | 34 ++++++++++++---------------- + src/cairo.h | 14 ------------ + src/cairo_gstate.c | 64 +++++++++++++++++++++++++++++------------------------ + src/cairo_surface.c | 34 ++++++++++++---------------- + src/cairoint.h | 8 ++++++- + 7 files changed, 120 insertions(+), 113 deletions(-) + +commit 01378dab3e85cc9bfdd34f59bea246062d363cc4 +Author: Carl Worth +Date: Tue Oct 28 12:13:35 2003 +0000 + + Fix bug from previous commit. Must check for NULL backend function pointers before calling them. + + ChangeLog | 8 ++++++++ + src/cairo-surface.c | 46 ++++++++++++++++++++++++++-------------------- + src/cairo_surface.c | 46 ++++++++++++++++++++++++++-------------------- + 3 files changed, 60 insertions(+), 40 deletions(-) + +commit 9d052aa9ca733d7c4008453d00c1a579fab74f92 +Author: Carl Worth +Date: Mon Oct 27 18:40:55 2003 +0000 + + Cleanup of surface->backend interface. Better type-safety and more consistent return-value handling. + + ChangeLog | 26 +++++++++ + src/cairo-surface.c | 28 +++++++--- + src/cairo-xlib-surface.c | 133 ++++++++++++++++++++++++++--------------------- + src/cairo_surface.c | 28 +++++++--- + src/cairo_xlib_surface.c | 133 ++++++++++++++++++++++++++--------------------- + src/cairoint.h | 83 ++++++++++++++++++----------- + 6 files changed, 271 insertions(+), 160 deletions(-) + +commit 75282a5e21e2f83cf7ed50b9aa3a4c52bb3815f9 +Author: Carl Worth +Date: Mon Oct 27 18:32:44 2003 +0000 + + Default to normal slant/weight on out-of-range values. Add missing include of fontconfig/fcfreetype.h + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 15 +++++++++------ + src/cairo_ft_font.c | 15 +++++++++------ + 3 files changed, 24 insertions(+), 12 deletions(-) + +commit 99fd32a8d67157a9ae09faf178bdbcfe8f9e10f0 +Author: Keith Packard +Date: Fri Oct 24 14:43:58 2003 +0000 + + A HORRIBLE KLUDGE to repad glyph images from freetype to meet libic requirements. + + ChangeLog | 6 ++++++ + src/cairo-ft-font.c | 38 ++++++++++++++++++++++++++++++++++++-- + src/cairo_ft_font.c | 38 ++++++++++++++++++++++++++++++++++++-- + 3 files changed, 78 insertions(+), 4 deletions(-) + +commit 965ab2ff553a12a64e10047f82658a6957a0f706 +Author: Carl Worth +Date: Fri Oct 24 11:01:37 2003 +0000 + + Fixes to eliminate a few compiler warnings. Bump version to 0.1.8 for recent font API changes. + + ChangeLog | 19 +++++++++++++++++++ + configure.in | 2 +- + src/cairo-ft-font.c | 21 +++++++-------------- + src/cairo-xlib-surface.c | 9 --------- + src/cairo.c | 7 +++++-- + src/cairo.h | 2 +- + src/cairo_ft_font.c | 21 +++++++-------------- + src/cairo_xlib_surface.c | 9 --------- + 8 files changed, 40 insertions(+), 50 deletions(-) + +commit 6498351f495f4ce5a9153f6043f501c0cebc86be +Author: Carl Worth +Date: Fri Oct 24 10:01:34 2003 +0000 + + Create a font by default. Remove bogus NULL_POINTER status errors leaking to the outside. + + ChangeLog | 21 ++++++++++++++++ + src/cairo-font.c | 70 ++++++++++++++---------------------------------------- + src/cairo-gstate.c | 15 ++++-------- + src/cairo_font.c | 70 ++++++++++++++---------------------------------------- + src/cairo_gstate.c | 15 ++++-------- + src/cairoint.h | 10 ++++---- + 6 files changed, 73 insertions(+), 128 deletions(-) + +commit c5aace21fbf67d27b433472e6070fee98761463c +Author: Graydon Hoare +Date: Thu Oct 23 15:27:40 2003 +0000 + + missing file from commit + + src/cairo-ft-font.c | 574 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_ft_font.c | 574 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 1148 insertions(+) + +commit c11a49a69e7d717c6c080198f568774047a21120 +Author: Graydon Hoare +Date: Thu Oct 23 15:22:28 2003 +0000 + + New file. + Add cairo_ft_font.c + Change to virtual font interface. + + ChangeLog | 11 ++ + src/Makefile.am | 1 + + src/cairo-font.c | 236 +++++++++++++++++++---------- + src/cairo-gstate.c | 375 +++++++++++++++++++++++++++++++++++++---------- + src/cairo-xlib-surface.c | 215 ++------------------------- + src/cairo.c | 98 +++++++++++-- + src/cairo.h | 135 +++++++++++++++-- + src/cairo_font.c | 236 +++++++++++++++++++---------- + src/cairo_gstate.c | 375 +++++++++++++++++++++++++++++++++++++---------- + src/cairo_xlib_surface.c | 215 ++------------------------- + src/cairoint.h | 222 ++++++++++++++++++++-------- + 11 files changed, 1322 insertions(+), 797 deletions(-) + +commit 223da5ea188ba7755aa6257452316b2330e981ae +Author: Carl Worth +Date: Thu Oct 23 07:51:41 2003 +0000 + + Updated TODO file + + ChangeLog | 5 +++++ + TODO | 39 +++++++++++++++++++++++---------------- + 2 files changed, 28 insertions(+), 16 deletions(-) + +commit 2c9d1913ccc6df9adc07d77781e68d5124535fa2 +Author: Carl Worth +Date: Thu Oct 23 07:47:29 2003 +0000 + + Fixed copyright attribution to refer to "University of Southern California + + ChangeLog | 6 ++++++ + src/cairo-color.c | 2 +- + src/cairo-fixed.c | 2 +- + src/cairo-font.c | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-hull.c | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fill.c | 2 +- + src/cairo-path-stroke.c | 2 +- + src/cairo-path.c | 2 +- + src/cairo-pen.c | 2 +- + src/cairo-polygon.c | 2 +- + src/cairo-slope.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo-xlib.h | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairo_color.c | 2 +- + src/cairo_fixed.c | 2 +- + src/cairo_font.c | 2 +- + src/cairo_gstate.c | 2 +- + src/cairo_hull.c | 2 +- + src/cairo_matrix.c | 2 +- + src/cairo_path.c | 2 +- + src/cairo_path_bounds.c | 2 +- + src/cairo_path_fill.c | 2 +- + src/cairo_path_stroke.c | 2 +- + src/cairo_pen.c | 2 +- + src/cairo_polygon.c | 2 +- + src/cairo_slope.c | 2 +- + src/cairo_spline.c | 2 +- + src/cairo_surface.c | 2 +- + src/cairo_xlib_surface.c | 2 +- + src/cairoint.h | 2 +- + 37 files changed, 42 insertions(+), 36 deletions(-) + +commit 6aaa9dff25e7ff2e21af0eefd1a644029b9914d9 +Author: Thomas Hunger +Date: Sun Oct 19 08:46:21 2003 +0000 + + added some types and enums, documented more functions + + doc/reference/xml/cairo_current_fill_rule.xml | 2 +- + doc/reference/xml/cairo_current_line_cap.xml | 2 +- + doc/reference/xml/cairo_current_operator.xml | 2 +- + doc/reference/xml/cairo_fill_rule_t.xml | 40 +++++++++++++++ + doc/reference/xml/cairo_format_t.xml | 52 +++++++++++++++++++ + doc/reference/xml/cairo_line_cap_t.xml | 43 ++++++++++++++++ + doc/reference/xml/cairo_matrix_t.xml | 23 +++++++++ + doc/reference/xml/cairo_operator_t.xml | 73 +++++++++++++++++++++++++++ + doc/reference/xml/cairo_set_alpha.xml | 7 +-- + doc/reference/xml/cairo_set_fill_rule.xml | 2 +- + doc/reference/xml/cairo_set_line_cap.xml | 10 ++-- + doc/reference/xml/cairo_set_line_width.xml | 6 +-- + doc/reference/xml/cairo_set_operator.xml | 9 ++-- + doc/reference/xml/cairo_set_pattern.xml | 8 +-- + doc/reference/xml/cairo_set_rgb_color.xml | 11 ++-- + doc/reference/xml/cairo_set_tolerance.xml | 8 +-- + doc/reference/xml/cairo_surface_t.xml | 17 +++++++ + doc/reference/xml/cairo_t.xml | 23 +++++++++ + 18 files changed, 306 insertions(+), 32 deletions(-) + +commit 007bbe56dba5a4c83017caa4d00d697436c9cce1 +Author: Thomas Hunger +Date: Thu Oct 16 10:54:34 2003 +0000 + + started to document from top to bottom. most things are obvious + + doc/reference/ChangeLog | 4 ++++ + doc/reference/xml/cairo_copy.xml | 21 +++++++++++++++++---- + doc/reference/xml/cairo_create.xml | 4 ++-- + doc/reference/xml/cairo_destroy.xml | 9 ++++++--- + doc/reference/xml/cairo_in_fill.xml | 2 +- + doc/reference/xml/cairo_in_stroke.xml | 2 +- + doc/reference/xml/cairo_reference.xml | 6 +++--- + doc/reference/xml/cairo_restore.xml | 3 ++- + doc/reference/xml/cairo_save.xml | 5 +++-- + doc/reference/xml/cairo_set_target_surface.xml | 7 ++++--- + doc/reference/xml/skeleton.xml | 6 +++--- + 11 files changed, 46 insertions(+), 23 deletions(-) + +commit 8f7106a9523cf4350db29cbe413bb992c1b7a960 +Author: Thomas Hunger +Date: Thu Oct 16 05:31:56 2003 +0000 + + updated xml files to look more like gtk refence and introduced crossreferencing via script + + doc/reference/ChangeLog | 8 +++ + doc/reference/README | 6 ++ + doc/reference/crossreference.rb | 30 ++++++++ + doc/reference/doc.xml | 23 +++--- + doc/reference/xml/cairo_clip.xml | 63 ++++++++-------- + doc/reference/xml/cairo_close_path.xml | 63 ++++++++-------- + doc/reference/xml/cairo_copy.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_create.xml | 62 ++++++++-------- + doc/reference/xml/cairo_current_alpha.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_fill_rule.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_line_cap.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_line_join.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_line_width.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_matrix.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_current_miter_limit.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_operator.xml | 63 ++++++++-------- + doc/reference/xml/cairo_current_point.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_current_rgb_color.xml | 84 +++++++++++++--------- + doc/reference/xml/cairo_current_target_surface.xml | 62 ++++++++-------- + doc/reference/xml/cairo_current_tolerance.xml | 63 ++++++++-------- + doc/reference/xml/cairo_default_matrix.xml | 63 ++++++++-------- + doc/reference/xml/cairo_destroy.xml | 63 ++++++++-------- + doc/reference/xml/cairo_fill.xml | 63 ++++++++-------- + doc/reference/xml/cairo_hit.xml | 62 ++++++++-------- + doc/reference/xml/cairo_identity_matrix.xml | 63 ++++++++-------- + .../xml/cairo_inverse_transform_distance.xml | 77 +++++++++++--------- + .../xml/cairo_inverse_transform_point.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_line_to.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_matrix_copy.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_matrix_create.xml | 62 ++++++++-------- + doc/reference/xml/cairo_matrix_destroy.xml | 63 ++++++++-------- + doc/reference/xml/cairo_matrix_invert.xml | 63 ++++++++-------- + doc/reference/xml/cairo_matrix_multiply.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_matrix_rotate.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_matrix_scale.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_matrix_set_identity.xml | 63 ++++++++-------- + .../xml/cairo_matrix_transform_distance.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_matrix_transform_point.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_matrix_translate.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_move_to.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_new_path.xml | 63 ++++++++-------- + doc/reference/xml/cairo_pop_group.xml | 63 ++++++++-------- + doc/reference/xml/cairo_push_group.xml | 63 ++++++++-------- + doc/reference/xml/cairo_reference.xml | 63 ++++++++-------- + doc/reference/xml/cairo_rel_line_to.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_rel_move_to.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_restore.xml | 63 ++++++++-------- + doc/reference/xml/cairo_rotate.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_save.xml | 63 ++++++++-------- + doc/reference/xml/cairo_scale.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_scale_font.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_select_font.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_alpha.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_dash.xml | 84 +++++++++++++--------- + doc/reference/xml/cairo_set_fill_rule.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_line_cap.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_line_join.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_line_width.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_miter_limit.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_operator.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_pattern.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_set_rgb_color.xml | 84 +++++++++++++--------- + doc/reference/xml/cairo_set_target_surface.xml | 69 ++++++++++-------- + doc/reference/xml/cairo_set_tolerance.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_show_text.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_status.xml | 63 ++++++++-------- + doc/reference/xml/cairo_status_string.xml | 63 ++++++++-------- + doc/reference/xml/cairo_stroke.xml | 63 ++++++++-------- + doc/reference/xml/cairo_stroke_path.xml | 63 ++++++++-------- + doc/reference/xml/cairo_surface_clip_restore.xml | 63 ++++++++-------- + doc/reference/xml/cairo_surface_destroy.xml | 63 ++++++++-------- + doc/reference/xml/cairo_surface_get_matrix.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_surface_reference.xml | 63 ++++++++-------- + doc/reference/xml/cairo_surface_set_filter.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_surface_set_matrix.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_surface_set_repeat.xml | 70 ++++++++++-------- + doc/reference/xml/cairo_transform_distance.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_transform_point.xml | 77 +++++++++++--------- + doc/reference/xml/cairo_translate.xml | 77 +++++++++++--------- + 79 files changed, 2907 insertions(+), 2321 deletions(-) + +commit 227bf48eff8e25dba592fbe2fcb48bfdf5d93dc3 +Author: Carl Worth +Date: Wed Oct 15 12:26:51 2003 +0000 + + Added bug about self-intersecting paths. (Really, I'm just testing the cairo-commit mailing list) + + BUGS | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8ca1f1a8258daaf2380b794735a424e872600c31 +Author: Thomas Hunger +Date: Wed Oct 15 08:51:06 2003 +0000 + + commited documentation skeleton + + doc/reference/.cvsignore | 20 +++ + doc/reference/ChangeLog | 4 + + doc/reference/README | 5 + + doc/reference/doc.xml | 173 +++++++++++++++++++++ + doc/reference/xml/cairo_clip.xml | 32 ++++ + doc/reference/xml/cairo_close_path.xml | 32 ++++ + doc/reference/xml/cairo_copy.xml | 33 ++++ + doc/reference/xml/cairo_create.xml | 32 ++++ + doc/reference/xml/cairo_current_alpha.xml | 32 ++++ + doc/reference/xml/cairo_current_fill_rule.xml | 32 ++++ + doc/reference/xml/cairo_current_line_cap.xml | 32 ++++ + doc/reference/xml/cairo_current_line_join.xml | 32 ++++ + doc/reference/xml/cairo_current_line_width.xml | 32 ++++ + doc/reference/xml/cairo_current_matrix.xml | 33 ++++ + doc/reference/xml/cairo_current_miter_limit.xml | 32 ++++ + doc/reference/xml/cairo_current_operator.xml | 32 ++++ + doc/reference/xml/cairo_current_point.xml | 34 ++++ + doc/reference/xml/cairo_current_rgb_color.xml | 35 +++++ + doc/reference/xml/cairo_current_target_surface.xml | 32 ++++ + doc/reference/xml/cairo_current_tolerance.xml | 32 ++++ + doc/reference/xml/cairo_default_matrix.xml | 32 ++++ + doc/reference/xml/cairo_destroy.xml | 32 ++++ + doc/reference/xml/cairo_fill.xml | 32 ++++ + doc/reference/xml/cairo_hit.xml | 32 ++++ + doc/reference/xml/cairo_identity_matrix.xml | 32 ++++ + doc/reference/xml/cairo_in_fill.xml | 34 ++++ + doc/reference/xml/cairo_in_stroke.xml | 34 ++++ + .../xml/cairo_inverse_transform_distance.xml | 34 ++++ + .../xml/cairo_inverse_transform_point.xml | 34 ++++ + doc/reference/xml/cairo_line_to.xml | 34 ++++ + doc/reference/xml/cairo_matrix_copy.xml | 33 ++++ + doc/reference/xml/cairo_matrix_create.xml | 32 ++++ + doc/reference/xml/cairo_matrix_destroy.xml | 32 ++++ + doc/reference/xml/cairo_matrix_invert.xml | 32 ++++ + doc/reference/xml/cairo_matrix_multiply.xml | 34 ++++ + doc/reference/xml/cairo_matrix_rotate.xml | 33 ++++ + doc/reference/xml/cairo_matrix_scale.xml | 34 ++++ + doc/reference/xml/cairo_matrix_set_identity.xml | 32 ++++ + .../xml/cairo_matrix_transform_distance.xml | 34 ++++ + doc/reference/xml/cairo_matrix_transform_point.xml | 34 ++++ + doc/reference/xml/cairo_matrix_translate.xml | 34 ++++ + doc/reference/xml/cairo_move_to.xml | 34 ++++ + doc/reference/xml/cairo_new_path.xml | 32 ++++ + doc/reference/xml/cairo_pop_group.xml | 32 ++++ + doc/reference/xml/cairo_push_group.xml | 32 ++++ + doc/reference/xml/cairo_reference.xml | 32 ++++ + doc/reference/xml/cairo_rel_line_to.xml | 34 ++++ + doc/reference/xml/cairo_rel_move_to.xml | 34 ++++ + doc/reference/xml/cairo_restore.xml | 32 ++++ + doc/reference/xml/cairo_rotate.xml | 33 ++++ + doc/reference/xml/cairo_save.xml | 32 ++++ + doc/reference/xml/cairo_scale.xml | 34 ++++ + doc/reference/xml/cairo_scale_font.xml | 33 ++++ + doc/reference/xml/cairo_select_font.xml | 33 ++++ + doc/reference/xml/cairo_set_alpha.xml | 33 ++++ + doc/reference/xml/cairo_set_dash.xml | 35 +++++ + doc/reference/xml/cairo_set_fill_rule.xml | 33 ++++ + doc/reference/xml/cairo_set_line_cap.xml | 33 ++++ + doc/reference/xml/cairo_set_line_join.xml | 33 ++++ + doc/reference/xml/cairo_set_line_width.xml | 33 ++++ + doc/reference/xml/cairo_set_miter_limit.xml | 33 ++++ + doc/reference/xml/cairo_set_operator.xml | 33 ++++ + doc/reference/xml/cairo_set_pattern.xml | 33 ++++ + doc/reference/xml/cairo_set_rgb_color.xml | 35 +++++ + doc/reference/xml/cairo_set_target_surface.xml | 33 ++++ + doc/reference/xml/cairo_set_tolerance.xml | 33 ++++ + doc/reference/xml/cairo_show_text.xml | 33 ++++ + doc/reference/xml/cairo_status.xml | 32 ++++ + doc/reference/xml/cairo_status_string.xml | 32 ++++ + doc/reference/xml/cairo_stroke.xml | 32 ++++ + doc/reference/xml/cairo_stroke_path.xml | 32 ++++ + doc/reference/xml/cairo_surface_clip_restore.xml | 32 ++++ + doc/reference/xml/cairo_surface_destroy.xml | 32 ++++ + doc/reference/xml/cairo_surface_get_matrix.xml | 33 ++++ + doc/reference/xml/cairo_surface_reference.xml | 32 ++++ + doc/reference/xml/cairo_surface_set_filter.xml | 33 ++++ + doc/reference/xml/cairo_surface_set_matrix.xml | 33 ++++ + doc/reference/xml/cairo_surface_set_repeat.xml | 33 ++++ + doc/reference/xml/cairo_transform_distance.xml | 34 ++++ + doc/reference/xml/cairo_transform_point.xml | 34 ++++ + doc/reference/xml/cairo_translate.xml | 34 ++++ + doc/reference/xml/skeleton.xml | 30 ++++ + 82 files changed, 2763 insertions(+) + +commit 5f48214ad24ace45276f15111fa5b15c2956f38f +Author: Carl Worth +Date: Sat Oct 11 13:49:13 2003 +0000 + + Add extern "C" stuff to cairo-xlib.h + + ChangeLog | 5 +++++ + src/cairo-xlib.h | 19 ++++++++++++++----- + 2 files changed, 19 insertions(+), 5 deletions(-) + +commit cdc84283e321a3fd14c430b8f991f60ac624204c +Author: Carl Worth +Date: Thu Oct 9 20:10:36 2003 +0000 + + Stub out NULL_POINTER error so drawing to off-screen memory still works even though text does not yet. + + ChangeLog | 6 ++++++ + src/cairo-font.c | 14 +++++++------- + src/cairo_font.c | 14 +++++++------- + 3 files changed, 20 insertions(+), 14 deletions(-) + +commit 61726a88f24efcbabdff980abdfe1ff8301315b2 +Author: Carl Worth +Date: Sat Oct 4 14:34:42 2003 +0000 + + Generate convex hull of pen before stroking. + + ChangeLog | 8 ++ + src/Makefile.am | 1 + + src/cairo-hull.c | 190 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-path-stroke.c | 4 +- + src/cairo-pen.c | 115 ++++++++--------------------- + src/cairo-slope.c | 40 +++++++++- + src/cairo_hull.c | 190 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_path_stroke.c | 4 +- + src/cairo_pen.c | 115 ++++++++--------------------- + src/cairo_slope.c | 40 +++++++++- + src/cairoint.h | 6 +- + 11 files changed, 534 insertions(+), 179 deletions(-) + +commit a249bd717c194d03d480d7803351ee6f21daf0c2 +Author: Carl Worth +Date: Sat Oct 4 09:06:15 2003 +0000 + + Remove abbreviation of "point" as "pt". Fix cairo_destrot, cairo_set_target_surface, and cairo_set_target_image to act appropriately in the face of non-zero status. + + ChangeLog | 12 ++++++++ + src/cairo-gstate.c | 70 +++++++++++++++++++++---------------------- + src/cairo-path-bounds.c | 38 +++++++++++------------ + src/cairo-path-fill.c | 4 +-- + src/cairo-path-stroke.c | 54 ++++++++++++++++----------------- + src/cairo-path.c | 78 ++++++++++++++++++++++++------------------------ + src/cairo-pen.c | 50 +++++++++++++++---------------- + src/cairo-polygon.c | 36 +++++++++++----------- + src/cairo-spline.c | 44 +++++++++++++-------------- + src/cairo-xlib-surface.c | 2 +- + src/cairo.c | 14 ++++----- + src/cairo_gstate.c | 70 +++++++++++++++++++++---------------------- + src/cairo_path.c | 78 ++++++++++++++++++++++++------------------------ + src/cairo_path_bounds.c | 38 +++++++++++------------ + src/cairo_path_fill.c | 4 +-- + src/cairo_path_stroke.c | 54 ++++++++++++++++----------------- + src/cairo_pen.c | 50 +++++++++++++++---------------- + src/cairo_polygon.c | 36 +++++++++++----------- + src/cairo_spline.c | 44 +++++++++++++-------------- + src/cairo_xlib_surface.c | 2 +- + src/cairoint.h | 39 +++++++++++++----------- + 21 files changed, 416 insertions(+), 401 deletions(-) + +commit b466e068b99c71acd26ca10b8e70ad34c7e34881 +Author: Carl Worth +Date: Wed Oct 1 17:34:19 2003 +0000 + + Fix to gracefully handle a NULL pointer for gstate->font + + ChangeLog | 15 +++++++++++++++ + src/cairo-font.c | 44 +++++++++++++++++++++++++++++++++++--------- + src/cairo-gstate.c | 12 +++++++----- + src/cairo_font.c | 44 +++++++++++++++++++++++++++++++++++--------- + src/cairo_gstate.c | 12 +++++++----- + src/cairoint.h | 17 +++++++++-------- + 6 files changed, 108 insertions(+), 36 deletions(-) + +commit 973ee8998377f09aee66664ddf93725d6ffd416e +Author: Jamey Sharp +Date: Tue Sep 30 18:56:22 2003 +0000 + + Virtualized the font and surface backend implementations. + + ChangeLog | 7 + + TODO | 3 - + src/Makefile.am | 3 +- + src/cairo-font.c | 121 +++----- + src/cairo-gstate.c | 67 ++--- + src/cairo-surface.c | 489 ++++++-------------------------- + src/cairo-xlib-surface.c | 719 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib.h | 56 ++++ + src/cairo.c | 24 -- + src/cairo.h | 17 -- + src/cairo_font.c | 121 +++----- + src/cairo_gstate.c | 67 ++--- + src/cairo_surface.c | 489 ++++++-------------------------- + src/cairo_xlib_surface.c | 719 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 130 ++++++--- + 15 files changed, 1881 insertions(+), 1151 deletions(-) + +commit 9c964b8f8afe03f2cf37073fc8f313fae24d58c6 +Author: Carl Worth +Date: Tue Sep 30 14:15:28 2003 +0000 + + Don't copy a gstate if src->status != 0 + + ChangeLog | 2 ++ + src/cairo.c | 4 +++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit b1ade55559b9deb350dc3fb28ee10cbde11c3476 +Author: Carl Worth +Date: Tue Sep 30 13:15:09 2003 +0000 + + Fixed horribly botched implementation of cairo_copy. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 21 +++++++++++++++++++++ + src/cairo.c | 11 ++++++----- + src/cairo_gstate.c | 21 +++++++++++++++++++++ + src/cairoint.h | 3 +++ + 5 files changed, 58 insertions(+), 5 deletions(-) + +commit 0cd47881bd62bc8600bd29c459036105f956d3c6 +Author: Carl Worth +Date: Tue Sep 30 11:39:07 2003 +0000 + + Changed cairo_copy to copy graphics state from one cairo_t to another rather than allocating a new cairo_t. + + ChangeLog | 7 +++++++ + configure.in | 2 +- + src/cairo.c | 30 +++++++++++------------------- + src/cairo.h | 6 +++--- + 4 files changed, 22 insertions(+), 23 deletions(-) + +commit 6b582a836abe9d44034e97e5ded55a983932e022 +Author: Carl Worth +Date: Tue Sep 30 07:58:58 2003 +0000 + + Fix to delay XFreePixmap until cairo_surface_destroy. + + ChangeLog | 6 ++++++ + src/cairo-surface.c | 7 ++++++- + src/cairo_surface.c | 7 ++++++- + src/cairoint.h | 1 + + 4 files changed, 19 insertions(+), 2 deletions(-) + +commit 9edacaf78075c3ed3a5e27da81f41ddc265acfc1 +Author: Carl Worth +Date: Mon Sep 29 11:55:56 2003 +0000 + + Bugfix from Graydon Hoare. + + ChangeLog | 8 +++++ + TODO | 84 ----------------------------------------------------- + src/cairo-surface.c | 2 +- + src/cairo_surface.c | 2 +- + 4 files changed, 10 insertions(+), 86 deletions(-) + +commit 6f87c8bc6c4b539049b089a0f90559eac0f2ffa2 +Author: Carl Worth +Date: Mon Sep 29 08:36:29 2003 +0000 + + Added cairo_arc and cairo_arc_negative. + + ChangeLog | 21 ++++- + TODO | 52 +++++++++-- + configure.in | 2 +- + src/cairo-font.c | 11 ++- + src/cairo-gstate.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo.c | 47 ++++++++++ + src/cairo.h | 20 ++++ + src/cairo_font.c | 11 ++- + src/cairo_gstate.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairoint.h | 12 +++ + 10 files changed, 698 insertions(+), 14 deletions(-) + +commit 2e19ebf7663e77c9a01787fe7dd70896c62e2743 +Author: Carl Worth +Date: Sat Sep 27 05:08:38 2003 +0000 + + Removed two _print_svg headers that had been included accidentally. + + ChangeLog | 4 +++- + src/cairoint.h | 6 ------ + 2 files changed, 3 insertions(+), 7 deletions(-) + +commit 60d541ee6a85a63638e2d30623f703d0c8e474c7 +Author: Carl Worth +Date: Sat Sep 27 05:00:47 2003 +0000 + + Fixed some internal enums that had been mistakenly converted to lowercase at some point. + + ChangeLog | 7 +++++++ + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fill.c | 4 ++-- + src/cairo-path-stroke.c | 8 ++++---- + src/cairo-path.c | 37 ++++++++++++++++++------------------- + src/cairo-pen.c | 10 +++++----- + src/cairo-spline.c | 2 +- + src/cairo_path.c | 37 ++++++++++++++++++------------------- + src/cairo_path_bounds.c | 2 +- + src/cairo_path_fill.c | 4 ++-- + src/cairo_path_stroke.c | 8 ++++---- + src/cairo_pen.c | 10 +++++----- + src/cairo_spline.c | 2 +- + src/cairoint.h | 36 ++++++++++++++++++------------------ + 14 files changed, 87 insertions(+), 82 deletions(-) + +commit 4dc8b3a312d0f390306131006e6d87a25e41ce58 +Author: Carl Worth +Date: Thu Sep 25 15:01:28 2003 +0000 + + Removed support for cairo_path_t and related functions. Bumped version to 0.1.5 + + ChangeLog | 7 ++ + configure.in | 2 +- + src/cairo-gstate.c | 190 ++++++++++++++++++++++++++++++----------------------- + src/cairo-path.c | 188 ++++------------------------------------------------ + src/cairo.c | 20 +----- + src/cairo.h | 49 +------------- + src/cairo_gstate.c | 190 ++++++++++++++++++++++++++++++----------------------- + src/cairo_path.c | 188 ++++------------------------------------------------ + src/cairoint.h | 58 ++++++++-------- + 9 files changed, 273 insertions(+), 619 deletions(-) + +commit ca1cec0f49f837dbe541fed97280952315d2876c +Author: Carl Worth +Date: Thu Sep 25 08:01:38 2003 +0000 + + Expose a cairo_path_t object with related functions: cairo_set_path, cairo_current_path, cairo_path_move_to, cairo_path_line_to, etc. + + ChangeLog | 35 ++++++++++ + configure.in | 2 +- + src/cairo-gstate.c | 190 +++++++++++++++++++++++------------------------------ + src/cairo-path.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++---- + src/cairo.c | 20 +++++- + src/cairo.h | 49 +++++++++++++- + src/cairo_gstate.c | 190 +++++++++++++++++++++++------------------------------ + src/cairo_path.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++---- + src/cairoint.h | 58 ++++++++-------- + 9 files changed, 654 insertions(+), 266 deletions(-) + +commit 17f5e712e217be701cf6555528cb81dfd22e49f8 +Author: Carl Worth +Date: Wed Sep 24 06:20:38 2003 +0000 + + Require __GNUC__ >= 3 before defining slim_hidden_def macro + + pixman/ChangeLog.slim | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ba03c60ce95130e211ab9fd71c8a769f28a9fc74 +Author: Carl Worth +Date: Tue Sep 23 07:58:02 2003 +0000 + + Require __GNUC__ >= 3 before defining slim_hidden_def macro + + pixman/src/slim_internal.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e3d81a872cbc6a2113f9e54dffa0f6f27bba52d7 +Author: Carl Worth +Date: Wed Sep 17 08:48:41 2003 +0000 + + Updated description of PostScript comparison + + TODO | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit 3f9a062bc62e5d66b9e984bbdce5d3b642faecdd +Author: Carl Worth +Date: Wed Sep 17 08:41:30 2003 +0000 + + Added "A comparison with PostScript" to TODO + + TODO | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 121 insertions(+) + +commit d3db983ab2c66e9a53ecbd53f04f56d0723cd3ee +Author: Carl Worth +Date: Tue Sep 16 10:28:46 2003 +0000 + + Fixed massive pixmap leak + + ChangeLog | 3 +++ + src/cairo-surface.c | 4 ---- + src/cairo_surface.c | 4 ---- + 3 files changed, 3 insertions(+), 8 deletions(-) + +commit 7e46e8e6caab34f4f2be9a694d8c15d1942bff7e +Author: Carl Worth +Date: Tue Sep 16 06:45:19 2003 +0000 + + Add cairo_reference and cairo_surface_reference + + ChangeLog | 15 +++++++++++++++ + configure.in | 2 +- + src/cairo-gstate.c | 10 +++++----- + src/cairo-surface.c | 2 +- + src/cairo.c | 38 ++++++++++++++++++++++++++++---------- + src/cairo.h | 12 +++++++++--- + src/cairo_gstate.c | 10 +++++----- + src/cairo_surface.c | 2 +- + src/cairoint.h | 4 +--- + 9 files changed, 66 insertions(+), 29 deletions(-) + +commit ee4bb020152525daa8ce880b0c739bdea2b92a01 +Author: Carl Worth +Date: Mon Sep 15 13:17:32 2003 +0000 + + Force explicit dependency on Xrender >= 0.6. Make _cairo_x11_surface_put_image static. + + ChangeLog | 6 ++++++ + configure.in | 2 +- + src/cairo-surface.c | 22 +++++++++++----------- + src/cairo_surface.c | 22 +++++++++++----------- + 4 files changed, 29 insertions(+), 23 deletions(-) + +commit 9c5be2cf317cdac454af3566a30fa6bb74db6e14 +Author: Carl Worth +Date: Mon Sep 15 07:55:10 2003 +0000 + + Fix for invalid restore from keithp. Began adding notes on arc support. + + ChangeLog | 6 ++++++ + TODO | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 8 +++----- + 3 files changed, 55 insertions(+), 5 deletions(-) + +commit 1154ac5b59a3530c3f74a54ea559908816cb7e83 +Author: Carl Worth +Date: Mon Sep 15 07:29:44 2003 +0000 + + Don't try to create depth-32 pixmaps on non-Render servers. Fix massive memory leask in _cairo_surface_push_image. + + ChangeLog | 6 ++++++ + src/cairo-surface.c | 12 ++++++++---- + src/cairo_surface.c | 12 ++++++++---- + 3 files changed, 22 insertions(+), 8 deletions(-) + +commit 4b30a924c9a61915a286c1cdf9c63e7d2b43a8db +Author: Carl Worth +Date: Fri Sep 12 10:53:03 2003 +0000 + + Added a few items to BUGS/TODO + + BUGS | 13 +++++++++++++ + TODO | 58 +++++++--------------------------------------------------- + 2 files changed, 20 insertions(+), 51 deletions(-) + +commit e540d4c44f7d38881c40a2eff1dab6469968b380 +Author: Carl Worth +Date: Tue Sep 9 17:38:10 2003 +0000 + + Updated calls to slim_hidden_def to track changes in slim 0.2.0 + + ChangeLog | 5 +++++ + configure.in | 2 +- + src/cairo-matrix.c | 16 ++++++++-------- + src/cairo-surface.c | 16 ++++++++-------- + src/cairo.c | 12 ++++++------ + src/cairo_matrix.c | 16 ++++++++-------- + src/cairo_surface.c | 16 ++++++++-------- + 7 files changed, 44 insertions(+), 39 deletions(-) + +commit 1abf6689e18f2fbde965efcf1b6b3bd4d6fa22f5 +Author: Carl Worth +Date: Tue Sep 9 17:35:42 2003 +0000 + + Updated calls to slim_hidden_def to track cahnges in slim 0.2.0 + + pixman/ChangeLog.libic | 5 +++++ + pixman/ChangeLog.libpixregion | 5 +++++ + pixman/configure.in | 2 +- + pixman/src/ic.c | 2 +- + pixman/src/iccolor.c | 2 +- + pixman/src/icformat.c | 2 +- + pixman/src/icimage.c | 6 +++--- + pixman/src/icrect.c | 2 +- + pixman/src/pixregion.c | 6 +++--- + 9 files changed, 21 insertions(+), 11 deletions(-) + +commit be113ebc4ab3c597e3b2a4f924397f66e5d83ada +Author: Carl Worth +Date: Tue Sep 9 17:33:52 2003 +0000 + + Bump version number to 0.2.0 + + pixman/ChangeLog.slim | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5d1bf0b96b7ef6eed5fb0b9089d9950d28c1c75a +Author: Carl Worth +Date: Tue Sep 9 17:32:07 2003 +0000 + + Remove ';' from slim_hidden_def. Bump version to 0.1.1 + + pixman/ChangeLog.slim | 8 ++++++++ + pixman/src/slim_internal.h | 6 +++--- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit 5b5c172803887e59bf86f351d60930fd10f6063b +Author: Carl Worth +Date: Fri Sep 5 15:29:49 2003 +0000 + + Preliminary support for running Cairo with X servers without the Render extension. This is still horribly slow. Removed many uses of X-specific macros, (eg. XDoubleToFixed) + + ChangeLog | 34 ++++++++ + configure.in | 2 +- + src/Makefile.am | 1 + + src/cairo-fixed.c | 46 ++++++++++ + src/cairo-font.c | 1 + + src/cairo-gstate.c | 78 +++++++++++------ + src/cairo-path-bounds.c | 8 +- + src/cairo-path-stroke.c | 32 +++---- + src/cairo-pen.c | 4 +- + src/cairo-spline.c | 12 +-- + src/cairo-surface.c | 225 +++++++++++++++++++++++++++--------------------- + src/cairo-traps.c | 14 +-- + src/cairo.h | 7 -- + src/cairo_fixed.c | 46 ++++++++++ + src/cairo_font.c | 1 + + src/cairo_gstate.c | 78 +++++++++++------ + src/cairo_path_bounds.c | 8 +- + src/cairo_path_stroke.c | 32 +++---- + src/cairo_pen.c | 4 +- + src/cairo_spline.c | 12 +-- + src/cairo_surface.c | 225 +++++++++++++++++++++++++++--------------------- + src/cairo_traps.c | 14 +-- + src/cairoint.h | 33 ++++--- + 23 files changed, 573 insertions(+), 344 deletions(-) + +commit 4551d78c8f5579a563a446ee745a04472d372823 +Author: Carl Worth +Date: Fri Sep 5 15:24:45 2003 +0000 + + Expose functions for creating IcFormat based on IcFormatName or masks. The actual IcFormat struct is no longer exposed. Bump version number to 0.1.1 + + pixman/ChangeLog.libic | 22 +++++ + pixman/src/ic.c | 36 ++++---- + pixman/src/ic.h | 33 +++---- + pixman/src/icblt.c | 1 - + pixman/src/icbltone.c | 1 - + pixman/src/iccolor.c | 36 +++----- + pixman/src/iccompose.c | 222 ++--------------------------------------------- + pixman/src/icformat.c | 117 +++++++++++++++++-------- + pixman/src/icimage.c | 6 +- + pixman/src/icimage.h | 11 +-- + pixman/src/icint.h | 49 +++++++---- + pixman/src/icpixels.c | 3 +- + pixman/src/icrect.c | 4 +- + pixman/src/icrop.h | 1 - + pixman/src/icstipple.c | 1 - + pixman/src/ictransform.c | 2 - + pixman/src/ictrap.c | 20 ++--- + pixman/src/ictri.c | 16 ++-- + pixman/src/icutil.c | 1 - + 19 files changed, 208 insertions(+), 374 deletions(-) + +commit 7e9a0f9cf30f507b50cbf3fc97c387bd05b534cd +Author: Keith Packard +Date: Fri Sep 5 13:25:46 2003 +0000 + + comment face computations, check for reflecting transformation to select correct face orientations + check for reflecting transform when computing pen to ensure consistent pen orientation + + ChangeLog | 8 ++++++ + src/cairo-path-stroke.c | 65 ++++++++++++++++++++++++++++++------------------- + src/cairo-pen.c | 43 +++++++++++++++++++++----------- + src/cairo_path_stroke.c | 65 ++++++++++++++++++++++++++++++------------------- + src/cairo_pen.c | 43 +++++++++++++++++++++----------- + 5 files changed, 146 insertions(+), 78 deletions(-) + +commit 36307e49d44a3712767749c450199b7a1ce0dea9 +Author: Carl Worth +Date: Fri Sep 5 10:17:22 2003 +0000 + + Portability fix for OpenBSD (from Michael Schubert) + + pixman/ChangeLog.libic | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 67275336bf0a89357fc4fda38dc5fb80a8cb90e8 +Author: Carl Worth +Date: Fri Sep 5 08:35:08 2003 +0000 + + Added cairo_copy. Bumbed version to 0.1.2. + + ChangeLog | 20 ++++++++++++++++++++ + configure.in | 2 +- + src/cairo-gstate.c | 3 +++ + src/cairo.c | 55 ++++++++++++++++++++++++++---------------------------- + src/cairo.h | 3 +++ + src/cairo_gstate.c | 3 +++ + 6 files changed, 56 insertions(+), 30 deletions(-) + +commit 196388abe67283364e774a75167a2e83e3884036 +Author: Carl Worth +Date: Fri Sep 5 07:16:45 2003 +0000 + + Fix crash in show_text due to missing call to ensure_source. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 19 +++++++++++++++++++ + src/cairo_gstate.c | 19 +++++++++++++++++++ + 3 files changed, 43 insertions(+) + +commit acb8ef11ceba696312b9e52dd45318833dffb80f +Author: Carl Worth +Date: Thu Sep 4 16:32:21 2003 +0000 + + Changed DEPRECATE method to preseve binary compatibility, but break source-level compatibility. + + src/cairoint.h | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit c25eea6f10473fd1e2d61faf60289f58475b85fd +Author: Carl Worth +Date: Thu Sep 4 16:27:34 2003 +0000 + + Fixed bugs if cairo_stroke/fill called before cairo_set_rgb_color or cairo_set_target. Also fixed bug when cairo_set_rgb_color is called before cairo_set_target. + + BUGS | 2 - + ChangeLog | 23 +++++++++ + src/cairo-gstate.c | 136 ++++++++++++++++++++++++++++++++--------------------- + src/cairo.c | 8 ++-- + src/cairo.h | 3 +- + src/cairo_gstate.c | 136 ++++++++++++++++++++++++++++++++--------------------- + src/cairoint.h | 7 +-- + 7 files changed, 198 insertions(+), 117 deletions(-) + +commit 6f731e27580870a5954ca21331b15746e371c8d3 +Author: Keith Packard +Date: Thu Sep 4 11:54:09 2003 +0000 + + added comments describing miter join code and miter limit computation. Replace XFoo with cairo_foo for double and fixed + add cairo_fixed_to_double and cairo_double_to_fixed Carl says he's got similar code, so he'll have to fix things if I get this committed quickly enough. + + ChangeLog | 10 +++++ + src/cairo-path-stroke.c | 100 +++++++++++++++++++++++++++++++++++------------- + src/cairo_path_stroke.c | 100 +++++++++++++++++++++++++++++++++++------------- + src/cairoint.h | 3 ++ + 4 files changed, 161 insertions(+), 52 deletions(-) + +commit 66c091e70661f8a87658fd20707b899f9b85970c +Author: Carl Worth +Date: Thu Sep 4 11:21:15 2003 +0000 + + Fixed DEPRECATE macro so that old programs will still work + + src/cairo.h | 2 ++ + src/cairoint.h | 8 ++++---- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit bbe8f9330bca8a1266cd3cea27742481eb2ae7e8 +Author: Carl Worth +Date: Thu Sep 4 06:53:02 2003 +0000 + + Added cairo-api-update script. + + ChangeLog | 3 +++ + 1 file changed, 3 insertions(+) + +commit b9c3be767896c817786e115a0a4856a419d6ce55 +Author: Carl Worth +Date: Thu Sep 4 06:52:01 2003 +0000 + + Changed names of all cairo_get_* functions to cairo_current_*. Added magic DEPRECATE macro so that using the old names will give useful warnings/errors. Bumped version number to 0.1.1 + + ChangeLog | 18 ++++++++++++++ + configure.in | 2 +- + src/cairo-gstate.c | 30 +++++++++++------------ + src/cairo.c | 67 ++++++++++++++++++++++++++++++--------------------- + src/cairo.h | 57 +++++++++++++++++++++++++++++++------------ + src/cairo_gstate.c | 30 +++++++++++------------ + src/cairoint.h | 46 ++++++++++++++++++++++++++--------- + util/cairo-api-update | 40 ++++++++++++++++++++++++++++++ + 8 files changed, 204 insertions(+), 86 deletions(-) + +commit 1568c818dacf70463e4b71550bbf24d26f894b70 +Author: Carl Worth +Date: Wed Sep 3 07:14:18 2003 +0000 + + Add implementation of cairo_get_matrix + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 6 ++++++ + src/cairo.c | 6 ++++++ + src/cairo.h | 5 +---- + src/cairo_gstate.c | 6 ++++++ + src/cairoint.h | 3 +++ + 6 files changed, 29 insertions(+), 4 deletions(-) + +commit 1a6496eaec0e94a59008c3a205f92e308fbafe38 +Author: Carl Worth +Date: Tue Sep 2 13:36:17 2003 +0000 + + Portability fix for OpenBSD (from Michael Schubert) + + pixman/src/ic.h | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 44b3c4ca7875c20429d983c47437e16a01c45d3a +Author: Carl Worth +Date: Fri Aug 29 17:57:08 2003 +0000 + + Optimized _cairo_surface_composite for compositing local memory surface with an X11 server surface. + + ChangeLog | 7 +++++++ + src/cairo-surface.c | 28 +++++++++++++++++++++++++--- + src/cairo.h | 18 +++++++++--------- + src/cairo_surface.c | 28 +++++++++++++++++++++++++--- + 4 files changed, 66 insertions(+), 15 deletions(-) + +commit 0ed4d32d87695599f66568e3f966f08ca060c9c6 +Author: Carl Worth +Date: Fri Aug 29 17:48:48 2003 +0000 + + Fixed to use fabs not abs. Added pointer to Hobby's intersection paper. + + ChangeLog | 9 +++++++++ + src/cairo-font.c | 3 ++- + src/cairo-traps.c | 21 +++++++++++++++++++++ + src/cairo_font.c | 3 ++- + src/cairo_traps.c | 21 +++++++++++++++++++++ + 5 files changed, 55 insertions(+), 2 deletions(-) + +commit 2ee2cfe14a446bc928d5a0945cc2a68657f8c825 +Author: Keith Packard +Date: Thu Aug 28 14:12:08 2003 +0000 + + font pixel size is always non-negative + + ChangeLog | 3 +++ + src/cairo-font.c | 2 +- + src/cairo_font.c | 2 +- + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit 4d399b9aca39f60793957e581664a968f35aee5d +Author: Carl Worth +Date: Tue Aug 26 07:40:17 2003 +0000 + + Added missing underscores to several internal functions. + + ChangeLog | 12 +++++ + src/cairo-font.c | 6 +-- + src/cairo-gstate.c | 28 ++++++------ + src/cairo-matrix.c | 6 +-- + src/cairo-path-fill.c | 6 +-- + src/cairo-path-stroke.c | 20 ++++----- + src/cairo-pen.c | 2 +- + src/cairo-traps.c | 116 ++++++++++++++++++++++++------------------------ + src/cairo.h | 32 ++++++------- + src/cairo_font.c | 6 +-- + src/cairo_gstate.c | 28 ++++++------ + src/cairo_matrix.c | 6 +-- + src/cairo_path_fill.c | 6 +-- + src/cairo_path_stroke.c | 20 ++++----- + src/cairo_pen.c | 2 +- + src/cairo_traps.c | 116 ++++++++++++++++++++++++------------------------ + src/cairoint.h | 53 ++++++++++------------ + 17 files changed, 236 insertions(+), 229 deletions(-) + +commit daf4141a03fa36b4ff9a45c92cc217afe1d5172c +Author: Carl Worth +Date: Tue Aug 26 07:14:40 2003 +0000 + + Fixed anchoring/transformation of pattern for stroke/fill. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 32 ++++++++++++++++++++++++++------ + src/cairo_gstate.c | 32 ++++++++++++++++++++++++++------ + 3 files changed, 59 insertions(+), 12 deletions(-) + +commit 596d081d47920298ccb91ee34d867661f31f067c +Author: Carl Worth +Date: Mon Aug 18 18:53:16 2003 +0000 + + Add --enable-maintainer-mode to autogen.sh + + pixman/autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 48db57aea654fbd57afb627aa9ff2004358ee0c8 +Author: Carl Worth +Date: Mon Aug 18 18:52:46 2003 +0000 + + Added better warning if pkg-config is not installed. Add --enable-maintainer-mode to autogen.sh + + autogen.sh | 25 +++++++++++++++++++++---- + 1 file changed, 21 insertions(+), 4 deletions(-) + +commit e7eecebc271bfde162bad48b6f2c6063a9b6982e +Author: Carl Worth +Date: Mon Aug 18 18:45:24 2003 +0000 + + Fixed to give a better warning if pkg-config is not installed + + pixman/autogen.sh | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 9a68366825015b66afd8496fb4eb42ce08e9849b +Author: Carl Worth +Date: Tue Aug 5 05:04:27 2003 +0000 + + Removed version requirements from dependencies on slim, libic, and Xft. + + configure.in | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit 83d5f0352ca54adb5fa5caa12dbba6c7f5e7755d +Author: Richard Henderson +Date: Thu Jul 31 22:49:09 2003 +0000 + + Mark const. + Likewise. + Likewise. + Likewise for cb. + + ChangeLog | 7 +++++++ + src/cairo-color.c | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-path-bounds.c | 2 +- + src/cairo-path.c | 2 +- + src/cairo_color.c | 2 +- + src/cairo_matrix.c | 2 +- + src/cairo_path.c | 2 +- + src/cairo_path_bounds.c | 2 +- + 9 files changed, 15 insertions(+), 8 deletions(-) + +commit 9289e8a77af5a2cd7faa18c90cced6d90adad66a +Author: Richard Henderson +Date: Thu Jul 31 22:41:44 2003 +0000 + + Depend on slim. + Check for slim. + Include slim_{export,import}.h as needed; mark all symbols __external_linkage. + Include slim_internal.h; mark all symbols __internal_linkage. Provide slim_hidden_proto symbols as needed. + Provide slim_hidden_def symbols as needed. + Mark static. (cairo_traps_add_trap_from_points): Likewise. + + ChangeLog | 14 +++ + cairo.pc.in | 2 +- + configure.in | 3 +- + src/cairo-matrix.c | 8 ++ + src/cairo-surface.c | 7 ++ + src/cairo-traps.c | 8 +- + src/cairo.c | 6 ++ + src/cairo.h | 188 ++++++++++++++++++----------------- + src/cairo_matrix.c | 8 ++ + src/cairo_surface.c | 7 ++ + src/cairo_traps.c | 8 +- + src/cairoint.h | 280 ++++++++++++++++++++++++++++------------------------ + 12 files changed, 312 insertions(+), 227 deletions(-) + +commit b7483e81a745d0cb933535346e35305bb2b06f2d +Author: Richard Henderson +Date: Thu Jul 31 20:46:21 2003 +0000 + + Define as __builtin_popcount when available. + + pixman/ChangeLog.libic | 4 ++++ + pixman/src/iccolor.c | 18 ++++++++++++++---- + 2 files changed, 18 insertions(+), 4 deletions(-) + +commit 2d51c71a79005c70249eedb191fa59732a358789 +Author: Richard Henderson +Date: Thu Jul 31 10:00:08 2003 +0000 + + Check for slim revision. + Depend on slim. + Don't include icimage.h. + Don't include ic.h. + Include slim_{export,import}.h as appropriate. Mark all symbols __external_linkage. + Include slim_import.h; mark symbols __internal_linkage; add slim hidden_proto declarations. + Mark all symbols __internal_linkage. + Likewise. + Provide hidden definition. + Likewise. + Likewise. + Likewise. + Likewise. + Make static. + + pixman/ChangeLog.libic | 23 ++++++++++++++++++ + pixman/src/ic.c | 3 +-- + pixman/src/ic.h | 66 +++++++++++++++++++++++++++++--------------------- + pixman/src/iccolor.c | 1 + + pixman/src/iccompose.c | 1 - + pixman/src/icformat.c | 1 + + pixman/src/icimage.c | 3 +++ + pixman/src/icimage.h | 29 +++++++++++----------- + pixman/src/icint.h | 50 +++++++++++++++++++++++--------------- + pixman/src/icrect.c | 1 + + pixman/src/icrop.h | 7 +++--- + pixman/src/ictri.c | 8 +----- + 12 files changed, 118 insertions(+), 75 deletions(-) + +commit f4dc2f2ee031b117aacbf4f4262ad548b8e0498a +Author: Richard Henderson +Date: Thu Jul 31 02:14:10 2003 +0000 + + Attribute visibility not present until gcc 3.3. + + pixman/ChangeLog.slim | 5 +++++ + pixman/src/slim_internal.h | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 7b1d999679d6ccc08c10d6b6c8a0a41ff7176892 +Author: Richard Henderson +Date: Thu Jul 31 02:11:33 2003 +0000 + + Make everything but IcComposite static. + Make everything except IcBuildCompositeOperand and IcCompositeGeneral static. + Make static. (IcLaneTable): Turn into a function. (IcBltOne): Make IcLane const. (icStipple24Bits): Make static. + Remove lots of now static declarations. + Likewise. + Make static. (icStipple2Bits, icStipple1Bits): Make static. (IcStippleTable): Turn into a function. + + pixman/ChangeLog.libic | 15 + + pixman/src/ic.c | 32 +- + pixman/src/icbltone.c | 42 +-- + pixman/src/iccompose.c | 294 +++++++++--------- + pixman/src/icimage.h | 801 ------------------------------------------------- + pixman/src/icrop.h | 8 +- + pixman/src/icutil.c | 47 +-- + 7 files changed, 231 insertions(+), 1008 deletions(-) + +commit a1e7245d74187e21f36211762f09b1ba1b59f566 +Author: Carl Worth +Date: Wed Jul 30 11:50:38 2003 +0000 + + Committing missed ChangeLog entry + + pixman/ChangeLog.libic | 7 ++++++- + pixman/src/ic.h | 2 +- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 713f550a938c8a492d6a40b70664af5fa6a87f80 +Author: Carl Worth +Date: Wed Jul 30 11:21:54 2003 +0000 + + fixed some typos in the libic PKG_CHECK + + ChangeLog | 3 +++ + configure.in | 10 ++++------ + 2 files changed, 7 insertions(+), 6 deletions(-) + +commit f4017c58575be26ab0ae5e41a9d5233e358969d8 +Author: Carl Worth +Date: Wed Jul 30 10:54:44 2003 +0000 + + Fixed IcRectangle to be compatible with XRectangle. + + pixman/ChangeLog.libic | 4 ++++ + pixman/src/ic.h | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit b86e8f5a0c8a2ddac9742e229e34c81d522c4c5a +Author: Carl Worth +Date: Wed Jul 30 10:48:27 2003 +0000 + + Fixed a disagreement over whether some internal cairo_gstate_t functions had an '_' prefix or not. + + ChangeLog | 4 ++++ + src/cairo.c | 12 ++++++------ + src/cairoint.h | 22 +++++++++++----------- + 3 files changed, 21 insertions(+), 17 deletions(-) + +commit 1ec2cb30f5862f1677670999e48475c02508d50d +Author: Carl Worth +Date: Wed Jul 30 10:36:50 2003 +0000 + + Removed false dependency on X. + + pixman/ChangeLog.libpixregion | 8 ++++++++ + pixman/configure.in | 4 ---- + pixman/src/pixman.h | 13 ++++++++----- + 3 files changed, 16 insertions(+), 9 deletions(-) + +commit e82a135aac039eb73436137b924d00726ef87119 +Author: Richard Henderson +Date: Wed Jul 30 10:09:53 2003 +0000 + + New. + Add slim.pc. + New file. + + pixman/ChangeLog.slim | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit b9be119a3f3258df58067d24f5133b3e19dde91a +Author: Richard Henderson +Date: Wed Jul 30 10:06:34 2003 +0000 + + Run PKG_CHECK_MODULES on slim. + Require slim. + Mark hidden. (PixRegionCopy, PixRegionUnion): Mark hidden. + Include and use X11/Xfuncproto.h. Include slim_{export,import}.h as appropriate. Mark all functions with __external_linkage. + Rename include protect to _PIXREGIONINT_H_. + + pixman/ChangeLog.libpixregion | 11 ++++++++ + pixman/configure.in | 3 +++ + pixman/libpixman.pc.in | 1 + + pixman/src/pixman.h | 63 ++++++++++++++++++++++++++----------------- + pixman/src/pixregion.c | 8 ++++++ + pixman/src/pixregionint.h | 8 +++--- + 6 files changed, 65 insertions(+), 29 deletions(-) + +commit 9fecd258a68a915cdac26c2fce14b8706d308df0 +Author: Richard Henderson +Date: Wed Jul 30 09:14:22 2003 +0000 + + New file. + New file. + New file. + Add them. + Check for src/slim_export.h + + pixman/ChangeLog.slim | 11 ++++++ + pixman/src/slim_export.h | 54 +++++++++++++++++++++++++ + pixman/src/slim_import.h | 53 +++++++++++++++++++++++++ + pixman/src/slim_internal.h | 99 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 217 insertions(+) + +commit e97cfd5eae9874cd665646403a6f8e5fbdf5621e +Author: Carl Worth +Date: Wed Jul 30 08:30:50 2003 +0000 + + Made all changes necessary to abandon the Xc library, (sucking the functionality up into cairo_surface_t instead). Eliminated most of the remaining X datatypes (XFixed, XPointFixed, XLineFixed, XTrapezoid). Fixed some numerical problems relating to pen initialization and intersection calculation. + + ChangeLog | 71 ++++++++ + cairo.pc.in | 2 +- + configure.in | 4 +- + src/Makefile.am | 8 +- + src/cairo-color.c | 38 +++-- + src/cairo-font.c | 2 +- + src/cairo-gstate.c | 178 +++++++++++--------- + src/cairo-path-bounds.c | 22 +-- + src/cairo-path-fill.c | 12 +- + src/cairo-path-stroke.c | 68 ++++---- + src/cairo-path.c | 34 ++-- + src/cairo-pen.c | 134 +++++++-------- + src/cairo-polygon.c | 9 +- + src/cairo-slope.c | 58 +++++++ + src/cairo-spline.c | 40 ++--- + src/cairo-surface.c | 439 ++++++++++++++++++++++++++++++++++++++++-------- + src/cairo-traps.c | 122 ++++++++------ + src/cairo.c | 160 +++++++++--------- + src/cairo.h | 116 ++++++++----- + src/cairo_color.c | 38 +++-- + src/cairo_font.c | 2 +- + src/cairo_gstate.c | 178 +++++++++++--------- + src/cairo_misc.c | 36 ---- + src/cairo_path.c | 34 ++-- + src/cairo_path_bounds.c | 22 +-- + src/cairo_path_fill.c | 12 +- + src/cairo_path_stroke.c | 68 ++++---- + src/cairo_pen.c | 134 +++++++-------- + src/cairo_polygon.c | 9 +- + src/cairo_slope.c | 58 +++++++ + src/cairo_spline.c | 40 ++--- + src/cairo_surface.c | 439 ++++++++++++++++++++++++++++++++++++++++-------- + src/cairo_traps.c | 122 ++++++++------ + src/cairoint.h | 245 +++++++++++++++++++-------- + 34 files changed, 1958 insertions(+), 996 deletions(-) + +commit 2026b1c44aeeb09e7015efadd508aeec28d778fa +Author: Carl Worth +Date: Tue Jul 29 19:52:08 2003 +0000 + + Initial commit of slim shell + + pixman/ChangeLog.slim | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit f605294dd31feb88261d4629ddd9cb7e8793c60f +Author: Carl Worth +Date: Tue Jul 29 14:45:20 2003 +0000 + + Replaced CARD*/INT* datatypes with stdint types (vektor@dumbterm.net). + + pixman/src/ic.c | 456 +++++++++++++-------------- + pixman/src/ic.h | 28 +- + pixman/src/iccompose.c | 828 ++++++++++++++++++++++++------------------------- + pixman/src/icimage.h | 534 +++++++++++++++---------------- + pixman/src/icint.h | 152 ++++----- + 5 files changed, 999 insertions(+), 999 deletions(-) + +commit 47844ba222600301bf46c521fc84d27e93586bc7 +Author: Carl Worth +Date: Sat Jul 26 20:38:58 2003 +0000 + + Fixed to not munge some internal cairot names, (such as cairo_traps_*) + + util/xr2cairo | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 953b708e2c483f41bb45a3694833dd8b62b4f415 +Author: Carl Worth +Date: Fri Jul 25 23:16:31 2003 +0000 + + Do nothing in cairo_show_text when using libic. + + src/cairo-gstate.c | 3 +++ + src/cairo_gstate.c | 3 +++ + src/cairoint.h | 1 - + 3 files changed, 6 insertions(+), 1 deletion(-) + +commit 91739aa148b078fe9e2f1da4a16a076bc7af68e5 +Author: Carl Worth +Date: Fri Jul 25 13:29:07 2003 +0000 + + Fix error correction on intersection test to avoid needless spinning. + + ChangeLog | 6 ++++++ + src/.cvsignore | 1 + + src/cairo-traps.c | 9 ++++++--- + src/cairo_traps.c | 9 ++++++--- + 4 files changed, 19 insertions(+), 6 deletions(-) + +commit cf24f32a5154269518369e7d10d22956da4192f3 +Author: Carl Worth +Date: Thu Jul 24 01:40:16 2003 +0000 + + Massive cleanup of polygon tessellation + + ChangeLog | 6 ++ + src/cairo-traps.c | 199 ++++++++++++++++++------------------------------------ + src/cairo_traps.c | 199 ++++++++++++++++++------------------------------------ + src/cairoint.h | 1 - + 4 files changed, 134 insertions(+), 271 deletions(-) + +commit ee146c47403520815aaac8c4b1b9bf6807c7cef0 +Author: Carl Worth +Date: Wed Jul 23 21:20:24 2003 +0000 + + Introduced cairo_fixed_*_t types. Converted several functions from floating to fixed point. + + ChangeLog | 18 ++++++++++++++++ + src/cairo-pen.c | 8 ++----- + src/cairo-traps.c | 64 ++++++++++++++++++++++++++++++++----------------------- + src/cairo.c | 8 +++---- + src/cairo_pen.c | 8 ++----- + src/cairo_traps.c | 64 ++++++++++++++++++++++++++++++++----------------------- + src/cairoint.h | 24 +++++++++++++++++++++ + 7 files changed, 124 insertions(+), 70 deletions(-) + +commit 6ef8b5cdf46e376f917797c0cd97758e31cec8b7 +Author: Carl Worth +Date: Sat Jul 19 14:02:43 2003 +0000 + + Better fix for the previous bug. More complete and more efficient. + + ChangeLog | 9 +++++++++ + src/cairo-traps.c | 18 +++++++----------- + src/cairo_traps.c | 18 +++++++----------- + 3 files changed, 23 insertions(+), 22 deletions(-) + +commit 92284e4ac81e92c108b60efe0ce7c5301b419d11 +Author: Carl Worth +Date: Sat Jul 19 05:19:32 2003 +0000 + + Fixed polygon tesselattion for some cases of incorrect sorting when two intersections are very near the same vertical position. + + src/cairo-traps.c | 6 +++--- + src/cairo_traps.c | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 84ed2d465fecd2d2fcf0a68a9c654f220f9119d7 +Author: Carl Worth +Date: Fri Jul 18 12:42:49 2003 +0000 + + Fixed some inconsistent tag/typedef names I missed the first time. + + ChangeLog | 5 +++++ + src/cairo-path-bounds.c | 26 +++++++++++++------------- + src/cairo-path-fill.c | 26 +++++++++++++------------- + src/cairo-path-stroke.c | 38 +++++++++++++++++++------------------- + src/cairo-path.c | 12 ++++++------ + src/cairo-pen.c | 20 ++++++++++---------- + src/cairo-spline.c | 2 +- + src/cairo.h | 18 +++++++++--------- + src/cairo_path.c | 12 ++++++------ + src/cairo_path_bounds.c | 26 +++++++++++++------------- + src/cairo_path_fill.c | 26 +++++++++++++------------- + src/cairo_path_stroke.c | 38 +++++++++++++++++++------------------- + src/cairo_pen.c | 20 ++++++++++---------- + src/cairo_spline.c | 2 +- + src/cairoint.h | 32 ++++++++++++++++---------------- + 15 files changed, 154 insertions(+), 149 deletions(-) + +commit dc1e96ae3502a81729839f4bcafcbc1fd00fc1bc +Author: Carl Worth +Date: Fri Jul 18 11:34:19 2003 +0000 + + Renamed everything from Xr* to cairo_* + + .cvsignore | 3 +- + BUGS | 5 +- + ChangeLog | 7 + + Makefile.am | 4 +- + README | 30 +- + cairo.pc.in | 13 + + configure.in | 14 +- + src/Makefile.am | 47 +- + src/Xr.h | 476 -------------------- + src/cairo-color.c | 80 ++++ + src/cairo-font.c | 171 ++++++++ + src/cairo-gstate.c | 1123 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-matrix.c | 380 ++++++++++++++++ + src/cairo-path-bounds.c | 168 +++++++ + src/cairo-path-fill.c | 158 +++++++ + src/cairo-path-stroke.c | 715 ++++++++++++++++++++++++++++++ + src/cairo-path.c | 436 ++++++++++++++++++ + src/cairo-pen.c | 398 +++++++++++++++++ + src/cairo-polygon.c | 175 ++++++++ + src/cairo-spline.c | 271 ++++++++++++ + src/cairo-surface.c | 391 +++++++++++++++++ + src/cairo-traps.c | 593 +++++++++++++++++++++++++ + src/cairo.c | 715 ++++++++++++++++++++++++++++++ + src/cairo.h | 494 +++++++++++++++++++++ + src/cairo_color.c | 80 ++++ + src/cairo_font.c | 171 ++++++++ + src/cairo_gstate.c | 1123 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo_matrix.c | 380 ++++++++++++++++ + src/cairo_misc.c | 36 ++ + src/cairo_path.c | 436 ++++++++++++++++++ + src/cairo_path_bounds.c | 168 +++++++ + src/cairo_path_fill.c | 158 +++++++ + src/cairo_path_stroke.c | 715 ++++++++++++++++++++++++++++++ + src/cairo_pen.c | 398 +++++++++++++++++ + src/cairo_polygon.c | 175 ++++++++ + src/cairo_spline.c | 271 ++++++++++++ + src/cairo_surface.c | 391 +++++++++++++++++ + src/cairo_traps.c | 593 +++++++++++++++++++++++++ + src/cairoint.h | 710 ++++++++++++++++++++++++++++++ + src/xr.c | 654 --------------------------- + src/xrcolor.c | 78 ---- + src/xrfiller.c | 103 ----- + src/xrfont.c | 169 ------- + src/xrgstate.c | 1120 ---------------------------------------------- + src/xrint.h | 708 ------------------------------ + src/xrmatrix.c | 378 ---------------- + src/xrmisc.c | 34 -- + src/xrpath.c | 434 ------------------ + src/xrpathbounds.c | 168 ------- + src/xrpathfill.c | 156 ------- + src/xrpathstroke.c | 713 ------------------------------ + src/xrpen.c | 389 ---------------- + src/xrpolygon.c | 173 -------- + src/xrspline.c | 269 ------------ + src/xrstate.c | 108 ----- + src/xrstroker.c | 643 --------------------------- + src/xrsurface.c | 386 ---------------- + src/xrtraps.c | 589 ------------------------- + util/xr2cairo | 49 +++ + xr.pc.in | 13 - + 60 files changed, 12194 insertions(+), 7812 deletions(-) + +commit 4a57fd0881b242d98ea74abb46c8c402faeb1960 +Author: Anders Carlsson +Date: Thu Jul 10 11:05:24 2003 +0000 + + Pass --enable-maintainer-mode to configure + Add compiler warning flags to CFLAGS. + + pixman/ChangeLog.libic | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit eefc5d5ec762881e8b59ebca4d8dbcc6d3c5e1ff +Author: Anders Carlsson +Date: Tue Jul 8 17:06:15 2003 +0000 + + Add accessor for getting a pointer to the image data. + + pixman/ChangeLog.libic | 6 ++++++ + pixman/src/ic.h | 3 +++ + pixman/src/icimage.c | 6 ++++++ + 3 files changed, 15 insertions(+) + +commit 42529a2c7295a55005d172d2d5ed16531d0989f4 +Author: Anders Carlsson +Date: Tue Jul 8 16:00:55 2003 +0000 + + Add accessors. + + pixman/ChangeLog.libic | 7 +++++++ + pixman/src/ic.h | 12 ++++++++++++ + pixman/src/icimage.c | 18 ++++++++++++++++++ + 3 files changed, 37 insertions(+) + +commit a18f4ea75b43b4be130caf02e2a03e8d6570ce2f +Author: Carl Worth +Date: Thu Jul 3 08:22:44 2003 +0000 + + Added XrMatrixGetAffine + + ChangeLog | 3 +++ + src/Xr.h | 6 ++++++ + src/xrmatrix.c | 13 +++++++++++++ + 3 files changed, 22 insertions(+) + +commit 1fc2dabbd0ee2f21ee46160cc113de4a89c94742 +Author: Carl Worth +Date: Thu Jul 3 08:12:51 2003 +0000 + + Added XrGetRGBColor and XrGetAlpha + + ChangeLog | 5 +++++ + src/Xr.h | 6 ++++++ + src/xr.c | 18 +++++++++++++++++- + src/xrcolor.c | 8 ++++++++ + src/xrgstate.c | 14 ++++++++++++++ + src/xrint.h | 9 +++++++++ + 6 files changed, 59 insertions(+), 1 deletion(-) + +commit 991d4447542440ac1dde67db3b8e824bda6319a9 +Author: Carl Worth +Date: Wed Jun 11 23:43:29 2003 +0000 + + Scaling by 0 now causes an InvalidMatrix error + + ChangeLog | 5 +++++ + src/xrgstate.c | 3 +++ + 2 files changed, 8 insertions(+) + +commit bfdd0ab71b64e371ed48f667af95131d697ff9d8 +Author: Carl Worth +Date: Wed May 28 19:31:30 2003 +0000 + + Cleanup of some stale unused code. + + pixman/src/ic.c | 17 ----------------- + pixman/src/iccompose.c | 1 - + 2 files changed, 18 deletions(-) + +commit 528c1aceb1e17b52017182b154399b14ed6219a1 +Author: Carl Worth +Date: Wed May 28 19:28:53 2003 +0000 + + Added XrSurfacePutImage. Fixed missing translation of clip region. + + ChangeLog | 10 ++++++++++ + src/Xr.h | 10 ++++++++++ + src/xrfont.c | 4 ++-- + src/xrgstate.c | 50 ++++++++++++++++++++++++++++++++++++++------------ + src/xrint.h | 7 ------- + src/xrmatrix.c | 18 +++--------------- + src/xrsurface.c | 19 +++++++++++++++++++ + 7 files changed, 82 insertions(+), 36 deletions(-) + +commit c988feb05dfe63f25c37a36dce6ac76b7ee1f7c6 +Author: Carl Worth +Date: Thu May 15 21:16:26 2003 +0000 + + Changed default matrix to be 3780 user units per 1 meter physical device + + ChangeLog | 14 ++++++++++++++ + src/Xr.h | 4 ---- + src/xr.c | 2 +- + src/xrgstate.c | 28 ++++++++++++++++++++++++++-- + src/xrint.h | 6 ++++++ + src/xrsurface.c | 6 ++++++ + 6 files changed, 53 insertions(+), 7 deletions(-) + +commit dfc84ef8299a256264b6849ecca8392a60bdcea0 +Author: Carl Worth +Date: Wed May 14 21:59:42 2003 +0000 + + Added XrSetTargetImage. Removed _XrGStateSetTargetDrawable, (now implemented as a convenience function in xr.c) + + ChangeLog | 8 ++++++++ + src/Xr.h | 8 ++++++++ + src/xr.c | 44 ++++++++++++++++++++++++++++++++++++++++---- + src/xrgstate.c | 24 ------------------------ + src/xrint.h | 7 ------- + 5 files changed, 56 insertions(+), 35 deletions(-) + +commit b3b306dfd91b4126812254380dc3a7ae77f33935 +Author: Carl Worth +Date: Wed May 14 18:30:57 2003 +0000 + + Added toplevel functions for setting surface matrix, filter. Introduced new XrMatrix object. Fixed to properly hint scaled fonts. + + ChangeLog | 31 +++++ + README | 56 +++++--- + src/Makefile.am | 4 +- + src/Xr.h | 125 ++++++++++++------ + src/xr.c | 107 +++++++-------- + src/xrfont.c | 51 ++++---- + src/xrgstate.c | 272 +++++++++++++++++++------------------- + src/xrint.h | 122 +++++++---------- + src/xrmatrix.c | 377 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/xrpathstroke.c | 14 +- + src/xrpen.c | 8 +- + src/xrsurface.c | 39 +++++- + src/xrtransform.c | 301 ------------------------------------------ + 13 files changed, 831 insertions(+), 676 deletions(-) + +commit 7e1f3f1798eace4f5a48079a949717da8b5a0d50 +Author: Carl Worth +Date: Wed May 14 18:09:09 2003 +0000 + + Fixed transform/filter support + + pixman/ChangeLog.libic | 4 ++++ + pixman/src/ic.h | 16 ++++++++++++++++ + pixman/src/iccompose.c | 38 ++++++++++++++++++++------------------ + pixman/src/icimage.c | 12 +++++++++--- + pixman/src/icimage.h | 4 ++-- + pixman/src/icint.h | 6 ++++++ + pixman/src/ictransform.c | 6 ++---- + 7 files changed, 59 insertions(+), 27 deletions(-) + +commit 8f10ce30138ba541b71a2bb38a5d8a4249a8a478 +Author: Carl Worth +Date: Mon May 12 09:46:57 2003 +0000 + + Added XrSetPattern + + ChangeLog | 2 ++ + src/Xr.h | 7 +++++++ + src/xr.c | 9 +++++++++ + src/xrgstate.c | 13 ++++++++++++- + src/xrint.h | 3 +++ + 5 files changed, 33 insertions(+), 1 deletion(-) + +commit 078e552da81600f58d53e7ac5f8ba971e0ea767a +Author: Carl Worth +Date: Mon May 12 09:24:17 2003 +0000 + + XrStroke and XrFill now both go through the same clipping. Cleaned up the three path interpreters (stroke, fill, and bounds), to each be in their own files + + ChangeLog | 16 ++ + src/Makefile.am | 5 +- + src/xrgstate.c | 140 +++++------ + src/xrint.h | 83 +------ + src/xrpath.c | 132 +--------- + src/xrpathbounds.c | 168 +++++++++++++ + src/xrpathfill.c | 156 ++++++++++++ + src/xrpathstroke.c | 713 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 8 files changed, 1135 insertions(+), 278 deletions(-) + +commit 9d4a8db55c751e093353f7f3b48d27244d5973b7 +Author: Noah Levitt +Date: Thu May 8 14:21:48 2003 +0000 + + Lowercase pkg-config module name and distribution tarball name. + + .cvsignore | 4 +++- + Makefile.am | 6 +++--- + configure.in | 6 +++--- + xr.pc.in | 13 +++++++++++++ + 4 files changed, 22 insertions(+), 7 deletions(-) + +commit 5f61782a7ebeccef7d551c625eb60ade18f9539e +Author: Carl Worth +Date: Mon May 5 09:27:09 2003 +0000 + + Avoid crash in IcCompositeTrapezoids when there's nothing to draw. + + pixman/ChangeLog.libic | 5 +++++ + pixman/src/ictrap.c | 3 +++ + 2 files changed, 8 insertions(+) + +commit 292d7bd9baf996d45275e848f258a4dbdd36cd73 +Author: Carl Worth +Date: Fri May 2 14:07:41 2003 +0000 + + Changed XrFormatRGB32 to XrFormatRGB24 + + ChangeLog | 8 ++++++++ + src/Makefile.am | 2 +- + src/Xr.h | 2 +- + src/xrsurface.c | 7 ++++--- + 4 files changed, 14 insertions(+), 5 deletions(-) + +commit 9c814d23d6b42794e9278ac7518dc4d99c77e408 +Author: Carl Worth +Date: Thu May 1 08:18:25 2003 +0000 + + Added several query functions. Experimental clip support (still incomplete) + + ChangeLog | 36 +++++++++++++ + src/Xr.h | 47 +++++++++++++++-- + src/xr.c | 67 +++++++++++++++++++++--- + src/xrgstate.c | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- + src/xrint.h | 50 +++++++++++++++++- + src/xrpath.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++ + src/xrtraps.c | 2 +- + 7 files changed, 474 insertions(+), 23 deletions(-) + +commit cb1e64d7bcd96da04839eb5841feeed257cf21f3 +Author: Noah Levitt +Date: Mon Apr 28 16:00:40 2003 +0000 + + Get rid of all mention of Xrender. + + pixman/src/icimage.h | 2 +- + pixman/src/icint.h | 3 --- + 2 files changed, 1 insertion(+), 4 deletions(-) + +commit 7b5270441b19a68323137034db621e0a194300aa +Author: Carl Worth +Date: Sat Apr 26 09:57:54 2003 +0000 + + Fixed memory leak + + pixman/ChangeLog.libic | 5 +++++ + pixman/src/icimage.c | 8 +++++++- + pixman/src/icimage.h | 1 + + src/xrsurface.c | 4 ++++ + 4 files changed, 17 insertions(+), 1 deletion(-) + +commit b2e30d233eafd0d3bb26d2db45ef1d3505327e81 +Author: Carl Worth +Date: Fri Apr 25 14:24:38 2003 +0000 + + Remove X datatypes from public interface + + pixman/ChangeLog.libic | 3 +++ + pixman/src/ic.h | 37 +++++++++++++++++++++++++++++++------ + pixman/src/icint.h | 4 +++- + pixman/src/icrect.c | 6 +++--- + pixman/src/ictrap.c | 23 ++++++++++++----------- + pixman/src/ictri.c | 26 +++++++++++++------------- + 6 files changed, 65 insertions(+), 34 deletions(-) + +commit c5b28ba63cba596e1c5644de5df5f5d126535773 +Author: Carl Worth +Date: Fri Apr 25 13:34:00 2003 +0000 + + Fixed libtool versioning + + BUGS | 1 + + ChangeLog | 4 ++++ + configure.in | 24 ++++++++++++++++-------- + src/Makefile.am | 2 +- + 4 files changed, 22 insertions(+), 9 deletions(-) + +commit 140285ed9b246ebca15f7810696131c54bff8dd9 +Author: Carl Worth +Date: Fri Apr 25 13:21:42 2003 +0000 + + Fixed libtool versioning + + pixman/configure.in | 25 +++++++++++++++++-------- + pixman/src/Makefile.am | 3 ++- + pixman/src/pixman.h | 3 +-- + pixman/src/pixregionint.h | 2 +- + 4 files changed, 21 insertions(+), 12 deletions(-) + +commit b4d3b8e928c43d022e3a0d9ba978be91cfc02988 +Author: Carl Worth +Date: Fri Apr 25 13:18:13 2003 +0000 + + Fixed to not reference XFixed. Fixed libtool versioning + + pixman/ChangeLog.libic | 7 +++++++ + pixman/src/ic.h | 9 ++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit cdb85050b706b2845ef8a618c033b69d5b15c6b7 +Author: Carl Worth +Date: Wed Apr 23 07:23:46 2003 +0000 + + Cleanup whitespace in configure output + + configure.in | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 5a4f65a774d833d1ef8b2a59270b0076e0760e54 +Author: Carl Worth +Date: Wed Apr 23 07:17:57 2003 +0000 + + extern "C" stuff to support C++ (Fredrik Höglund) + + pixman/src/ic.h | 12 ++++++++++++ + src/Xr.h | 6 +++++- + src/xr.c | 4 ++-- + 3 files changed, 19 insertions(+), 3 deletions(-) + +commit 189b01b4fd4647f6d64e7c73ecb3ccf9ed180072 +Author: Keith Packard +Date: Tue Apr 22 22:08:58 2003 +0000 + + Require proper Xft version + + configure.in | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8bb54c2b2d4b6df4ec23a442159065277d303f30 +Author: Carl Worth +Date: Tue Apr 22 16:38:45 2003 +0000 + + Fixed typo (Owen Taylor) + + pixman/ChangeLog.libpixregion | 4 ++++ + pixman/configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit e712a21abe4027abdb41180512d9c8bd5420206e +Author: Carl Worth +Date: Mon Apr 21 12:46:41 2003 +0000 + + Added Makefile.am + + src/.cvsignore | 1 - + src/Makefile.am | 27 +++++++++++++++++++++++++++ + 2 files changed, 27 insertions(+), 1 deletion(-) + +commit 8d930fee2c5c5434084fabb7852d7921223fc5d3 +Author: Carl Worth +Date: Mon Apr 21 12:41:30 2003 +0000 + + Added Makefile.am + + .cvsignore | 1 - + Makefile.am | 8 ++++++++ + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit ee738deaf6ff2cf7391d813876241b389a0dedaf +Author: Carl Worth +Date: Thu Apr 17 13:24:29 2003 +0000 + + Switched to autotools. Dropped XrPush/PopGroup. Supports non-X Xc rendering. + + .cvsignore | 19 +- + AUTHORS | 1 + + BUGS | 1 + + COPYING | 21 ++ + ChangeLog | 17 ++ + INSTALL | 9 + + Imakefile | 63 ---- + NEWS | 0 + Xr.h | 278 ----------------- + autogen.sh | 28 ++ + configure.in | 51 ++++ + local.def | 53 ---- + src/.cvsignore | 7 + + src/Xr.h | 91 +++++- + src/xr.c | 50 ++- + src/xrfont.c | 4 +- + src/xrgstate.c | 240 +++++++++------ + src/xrint.h | 123 +++----- + src/xrstate.c | 9 +- + src/xrsurface.c | 434 +++++++++++++------------- + src/xrtransform.c | 10 +- + xr.c | 513 ------------------------------- + xrcolor.c | 70 ----- + xrfiller.c | 103 ------- + xrfont.c | 170 ----------- + xrgstate.c | 885 ------------------------------------------------------ + xrint.h | 794 ------------------------------------------------ + xrmisc.c | 34 --- + xrpath.c | 432 -------------------------- + xrpen.c | 389 ------------------------ + xrpolygon.c | 173 ----------- + xrspline.c | 269 ----------------- + xrstate.c | 109 ------- + xrstroker.c | 643 --------------------------------------- + xrsurface.c | 323 -------------------- + xrtransform.c | 301 ------------------- + xrtraps.c | 589 ------------------------------------ + 37 files changed, 691 insertions(+), 6615 deletions(-) + +commit b61b9ffc2322e09873b9e2dfb0c1da56ec1ffd61 +Author: Carl Worth +Date: Thu Apr 17 08:48:22 2003 +0000 + + Removed reliance on server headers. Reowrked IcFormat + + pixman/ChangeLog.libic | 50 +++++++++ + pixman/src/ic.c | 40 ++++--- + pixman/src/ic.h | 161 +++++++++++++++++----------- + pixman/src/iccolor.c | 85 +++++++++++++++ + pixman/src/iccompose.c | 26 ++++- + pixman/src/icformat.c | 67 ++++++------ + pixman/src/icimage.c | 115 ++++++++------------ + pixman/src/icimage.h | 86 ++++++--------- + pixman/src/icint.h | 285 ++++++++++++++++++++++++++++++++++++++++++++----- + pixman/src/icpixels.c | 22 ++-- + pixman/src/icrect.c | 107 +++++++++++-------- + pixman/src/ictrap.c | 48 +++++---- + pixman/src/ictri.c | 102 ++++++++++-------- + 13 files changed, 798 insertions(+), 396 deletions(-) + +commit 2d8dfcec1bb166f8335300bd3850847a5bb1396e +Author: Carl Worth +Date: Wed Mar 5 10:19:48 2003 +0000 + + Updated to use libpixregion + + pixman/ChangeLog.libic | 21 +++++++++++++++++++++ + pixman/src/ic.h | 22 +++++++++++++++++++++- + pixman/src/icimage.h | 3 +++ + pixman/src/icint.h | 41 +++-------------------------------------- + 4 files changed, 48 insertions(+), 39 deletions(-) + +commit 88bd3a9799fd2225d84d1abed922204b3e1885e6 +Author: Carl Worth +Date: Tue Feb 25 10:33:10 2003 +0000 + + updated to use libpixregion instead of Xlib region code + + pixman/src/ic.c | 19 +++++------- + pixman/src/ic.h | 2 ++ + pixman/src/iccompose.c | 8 ++--- + pixman/src/icimage.c | 81 +++++++++++++++++++++++++------------------------- + pixman/src/icimage.h | 12 ++++---- + pixman/src/icint.h | 4 --- + pixman/src/ictrap.c | 20 +++---------- + pixman/src/ictri.c | 20 ++++++++----- + 8 files changed, 76 insertions(+), 90 deletions(-) + +commit 3eaa7a73e7ef8e24caa09a3e0318a5254c55d56f +Author: Carl Worth +Date: Tue Feb 25 10:28:05 2003 +0000 + + API cleanup + + pixman/ChangeLog.libpixregion | 9 +++++++++ + pixman/src/pixman.h | 27 ++++++++++----------------- + pixman/src/pixregion.c | 43 ++++++++++++++++++++++--------------------- + 3 files changed, 41 insertions(+), 38 deletions(-) + +commit a837f75a8b9dafb373bcc828dcc5ade6a1d84674 +Author: Carl Worth +Date: Tue Feb 25 08:05:26 2003 +0000 + + Initial import of libpixregion + + pixman/.cvsignore | 13 + + pixman/AUTHORS | 2 + + pixman/COPYING | 42 + + pixman/ChangeLog.libpixregion | 0 + pixman/INSTALL | 9 + + pixman/Makefile.am | 8 + + pixman/NEWS | 1 + + pixman/README | 15 + + pixman/autogen.sh | 30 + + pixman/configure.in | 46 + + pixman/libpixman.pc.in | 10 + + pixman/src/.cvsignore | 6 + + pixman/src/Makefile.am | 12 + + pixman/src/pixman.h | 157 +++ + pixman/src/pixregion.c | 2538 +++++++++++++++++++++++++++++++++++++++++ + pixman/src/pixregionint.h | 83 ++ + 16 files changed, 2972 insertions(+) + +commit 56e193eaf2c24aa3799b8440708a9448de3a94e9 +Author: Carl Worth +Date: Fri Feb 21 14:08:28 2003 +0000 + + Added triangle support + + pixman/src/ic.h | 32 ++++++++++++ + pixman/src/icimage.h | 51 ------------------- + pixman/src/icint.h | 10 ++++ + pixman/src/ictrap.c | 6 --- + pixman/src/ictri.c | 140 ++++++++++++++++++++++++++++----------------------- + 5 files changed, 118 insertions(+), 121 deletions(-) + +commit 8bb4eb1beb020ed679a7644579253bd21f8bc970 +Author: Carl Worth +Date: Fri Feb 21 13:34:50 2003 +0000 + + Some reorganization and cruft removal + + pixman/ChangeLog.libic | 5 + + pixman/src/ic.c | 1973 +++++++++++++++++++++++----------------------- + pixman/src/icbltone.c | 130 --- + pixman/src/iccompose.c | 1 + + pixman/src/icformat.c | 20 - + pixman/src/icimage.c | 1639 +++++++------------------------------- + pixman/src/icimage.h | 18 - + pixman/src/icint.h | 221 ------ + pixman/src/ictransform.c | 70 ++ + pixman/src/icutil.c | 81 -- + 10 files changed, 1351 insertions(+), 2807 deletions(-) + +commit 18edad04edf860211260a1db4a7b58fd75715cf7 +Author: Carl Worth +Date: Fri Feb 21 10:07:17 2003 +0000 + + Started cleaning up public libic interface + + pixman/src/ic.c | 14 +- + pixman/src/ic.h | 1008 +++--------------------------------------------- + pixman/src/icimage.c | 24 +- + pixman/src/icint.h | 956 ++++++++++++++++++++++++++++++++++++++++++++- + pixman/src/icpixels.c | 4 +- + pixman/src/icstipple.c | 2 +- + pixman/src/ictrap.c | 6 +- + 7 files changed, 1010 insertions(+), 1004 deletions(-) + +commit c9bf4bab84e6c1abbdcb2b7888918fc01e5cf063 +Author: Carl Worth +Date: Fri Feb 21 06:51:08 2003 +0000 + + Initial import of libic code, (still very preliminary). + + pixman/ChangeLog.libic | 4 + + pixman/src/ic.c | 1183 ++++++++++++++++++++ + pixman/src/ic.h | 1024 +++++++++++++++++ + pixman/src/icblt.c | 926 ++++++++++++++++ + pixman/src/icbltone.c | 867 +++++++++++++++ + pixman/src/iccompose.c | 2900 ++++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/icformat.c | 139 +++ + pixman/src/icimage.c | 1641 +++++++++++++++++++++++++++ + pixman/src/icimage.h | 1243 +++++++++++++++++++++ + pixman/src/icint.h | 68 ++ + pixman/src/icpixels.c | 118 ++ + pixman/src/icrect.c | 152 +++ + pixman/src/icrop.h | 139 +++ + pixman/src/icstipple.c | 80 ++ + pixman/src/ictrap.c | 1517 +++++++++++++++++++++++++ + pixman/src/ictri.c | 342 ++++++ + pixman/src/icutil.c | 363 ++++++ + 17 files changed, 12706 insertions(+) + +commit d084434770b77d0751978bf6774eca00a6e7d646 +Author: Carl Worth +Date: Fri Feb 14 07:22:19 2003 +0000 + + Fixed transformed images to not be 1 pixel too big + + ChangeLog | 5 +++++ + src/xrgstate.c | 4 ++-- + xrgstate.c | 4 ++-- + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit d4ba730ba26d6a58ba81d733a75e4ce01a4bda72 +Author: Carl Worth +Date: Thu Feb 6 08:06:28 2003 +0000 + + Fixed algebra used by XrPenVerticesNeeded to avoid sqrt() of negative numbers. + + ChangeLog | 6 ++++++ + src/xrint.h | 3 +++ + src/xrpen.c | 15 +++++++-------- + src/xrtransform.c | 21 ++++++++++++++------- + xrint.h | 3 +++ + xrpen.c | 15 +++++++-------- + xrtransform.c | 21 ++++++++++++++------- + 7 files changed, 54 insertions(+), 30 deletions(-) + +commit a4b439eb69710a3c2053e68f7716bbf76b5ceb7f +Author: Carl Worth +Date: Tue Jan 28 13:49:57 2003 +0000 + + Added round caps/joins. Fixed initial cap. Fixed disabling of dashing. + + ChangeLog | 22 +++++++ + src/xrgstate.c | 46 +++++++------ + src/xrint.h | 33 +++++----- + src/xrpen.c | 96 +++++++++++++++++++++------ + src/xrstroker.c | 201 +++++++++++++++++++++++++++++++++++++------------------- + src/xrtraps.c | 62 +++++++++++++---- + xrgstate.c | 46 +++++++------ + xrint.h | 33 +++++----- + xrpen.c | 96 +++++++++++++++++++++------ + xrstroker.c | 201 +++++++++++++++++++++++++++++++++++++------------------- + xrtraps.c | 62 +++++++++++++---- + 11 files changed, 624 insertions(+), 274 deletions(-) + +commit 1507f1c795478c9cde970d1a750d0602407f6986 +Author: Carl Worth +Date: Tue Jan 28 07:23:54 2003 +0000 + + Added triangle tessellation. Converted bevel joins from polygons to triangles. + + ChangeLog | 8 ++++++++ + src/xrint.h | 3 +++ + src/xrstroker.c | 26 +++++++++++++++++--------- + src/xrtraps.c | 31 +++++++++++++++++++++++++++++++ + xrint.h | 3 +++ + xrstroker.c | 26 +++++++++++++++++--------- + xrtraps.c | 31 +++++++++++++++++++++++++++++++ + 7 files changed, 110 insertions(+), 18 deletions(-) + +commit f93c88efbf84d6a2dab3a37608ae5c73c6dd22d3 +Author: Carl Worth +Date: Sat Jan 25 11:12:39 2003 +0000 + + Fixed round joins to not fall through to miter case + + src/xrstroker.c | 13 +++++-------- + xrstroker.c | 13 +++++-------- + 2 files changed, 10 insertions(+), 16 deletions(-) + +commit 341c446ba2c4d9833c3366edaa9b725b3ab2c8f6 +Author: Carl Worth +Date: Fri Jan 24 13:56:30 2003 +0000 + + Fixed xrpolygon for multiple sub-polygons + + src/xrpolygon.c | 2 ++ + xrpolygon.c | 2 ++ + 2 files changed, 4 insertions(+) + +commit 214662761e7ea372073f4a1a496c3859f893d6ac +Author: Carl Worth +Date: Fri Jan 24 13:52:01 2003 +0000 + + Fixed miter limit handling. Added local.def + + ChangeLog | 9 +++++++++ + Imakefile | 5 +++-- + README | 7 +++++-- + local.def | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/xrstroker.c | 4 ++-- + xrstroker.c | 4 ++-- + 6 files changed, 74 insertions(+), 8 deletions(-) + +commit cdae3ba6155a7c883e52f1617edd9f6ab61df830 +Author: Carl Worth +Date: Tue Dec 3 12:37:59 2002 +0000 + + Fixed holes in self-intersecting splines, (from change to winding rule parameter interface) + + ChangeLog | 10 ++++++++++ + TODO | 14 +++++++++++--- + src/xrpen.c | 2 +- + src/xrstroker.c | 4 ++-- + xrpen.c | 2 +- + xrstroker.c | 4 ++-- + 6 files changed, 27 insertions(+), 9 deletions(-) + +commit 7f49b9ee83e277c5615e5e7a0c64f9df53ea5c85 +Author: Keith Packard +Date: Thu Nov 21 11:12:20 2002 +0000 + + Make Xr use XFTINCLUDES as it now uses Xft + + Imakefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6c8533a2ad96080889be9b2255c3236200dcb858 +Author: Carl Worth +Date: Mon Nov 11 12:46:17 2002 +0000 + + Fixes for transformed images + + ChangeLog | 20 +++++++++++++++++ + Xr.h | 19 +++++++++++++++- + src/Xr.h | 19 +++++++++++++++- + src/xr.c | 32 +++++++++++++++++++++++++++ + src/xrfiller.c | 4 +++- + src/xrgstate.c | 64 +++++++++++++++++++++++++++++++++++++++++++----------- + src/xrint.h | 16 +++++++++++++- + src/xrpen.c | 5 ++++- + src/xrsurface.c | 10 ++++----- + src/xrtransform.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++---- + xr.c | 32 +++++++++++++++++++++++++++ + xrfiller.c | 4 +++- + xrgstate.c | 64 +++++++++++++++++++++++++++++++++++++++++++----------- + xrint.h | 16 +++++++++++++- + xrpen.c | 5 ++++- + xrsurface.c | 10 ++++----- + xrtransform.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++---- + 17 files changed, 398 insertions(+), 52 deletions(-) + +commit 405598e4e0699bf5d4e2e0e7366a780219430cc8 +Author: Carl Worth +Date: Mon Nov 4 00:24:44 2002 +0000 + + Added group support. + + ChangeLog | 31 ++++++++++++ + Xr.h | 7 +++ + src/Xr.h | 7 +++ + src/xr.c | 30 +++++++++++- + src/xrfont.c | 4 +- + src/xrgstate.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++---------- + src/xrint.h | 48 +++++++++++++++--- + src/xrstate.c | 1 + + src/xrsurface.c | 113 +++++++++++++++++++++++++++++++++++++----- + xr.c | 30 +++++++++++- + xrfont.c | 4 +- + xrgstate.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++---------- + xrint.h | 48 +++++++++++++++--- + xrstate.c | 1 + + xrsurface.c | 113 +++++++++++++++++++++++++++++++++++++----- + 15 files changed, 639 insertions(+), 94 deletions(-) + +commit ea0104b2c04e12e16b8243b3762b6e53c58f0a72 +Author: Carl Worth +Date: Sat Nov 2 10:24:12 2002 +0000 + + Fix memory leak of image pixmap + + ChangeLog | 5 +++++ + src/xrsurface.c | 6 ++++++ + xrsurface.c | 6 ++++++ + 3 files changed, 17 insertions(+) + +commit e39a088a29cd7676ad6f33ac0f0f2c4d5035580b +Author: Carl Worth +Date: Fri Nov 1 19:45:30 2002 +0000 + + Partial image support. + + ChangeLog | 24 ++++++++ + Xr.h | 27 ++++++++- + src/Xr.h | 27 ++++++++- + src/xr.c | 56 +++++++++++++++++++ + src/xrfont.c | 2 +- + src/xrgstate.c | 141 +++++++++++++++++++++++++++++++++++++---------- + src/xrint.h | 56 ++++++++++++++++--- + src/xrsurface.c | 166 +++++++++++++++++++++++++++++++++++++++++--------------- + xr.c | 56 +++++++++++++++++++ + xrfont.c | 2 +- + xrgstate.c | 141 +++++++++++++++++++++++++++++++++++++---------- + xrint.h | 56 ++++++++++++++++--- + xrsurface.c | 166 +++++++++++++++++++++++++++++++++++++++++--------------- + 13 files changed, 752 insertions(+), 168 deletions(-) + +commit fec91ede9e8bc725551e39619b65c32ad9abf3ce +Author: Carl Worth +Date: Wed Oct 30 21:54:50 2002 +0000 + + Moved Xft/fontconfig code up from Xc to Xr. Added XrTextExtents + + ChangeLog | 12 +++++++++ + Xr.h | 7 ++++++ + src/Xr.h | 7 ++++++ + src/xr.c | 14 +++++++++++ + src/xrcolor.c | 8 +++--- + src/xrfont.c | 44 +++++++++++++++++++-------------- + src/xrgstate.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++---------- + src/xrint.h | 30 ++++++++++++++++------- + src/xrsurface.c | 41 +++++++++++++++++++------------ + xr.c | 14 +++++++++++ + xrcolor.c | 8 +++--- + xrfont.c | 44 +++++++++++++++++++-------------- + xrgstate.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++---------- + xrint.h | 30 ++++++++++++++++------- + xrsurface.c | 41 +++++++++++++++++++------------ + 15 files changed, 332 insertions(+), 120 deletions(-) + +commit f207f1db6489742c1061349f547ba34523969482 +Author: Carl Worth +Date: Tue Oct 29 17:27:01 2002 +0000 + + Added basic font support + + ChangeLog | 9 ++++ + Imakefile | 2 + + Xr.h | 15 +++++- + src/Xr.h | 15 +++++- + src/xr.c | 32 +++++++++++- + src/xrfont.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/xrgstate.c | 64 ++++++++++++++++++----- + src/xrint.h | 54 ++++++++++++++++++- + src/xrsurface.c | 3 ++ + xr.c | 32 +++++++++++- + xrfont.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + xrgstate.c | 64 ++++++++++++++++++----- + xrint.h | 54 ++++++++++++++++++- + xrsurface.c | 3 ++ + 14 files changed, 631 insertions(+), 36 deletions(-) + +commit f64ebf489ba101ff99fb7910924f04291d272057 +Author: Carl Worth +Date: Mon Oct 28 09:00:10 2002 +0000 + + Added XrStatusInvalidRestore. Fixed XrSurface memory leak. + + ChangeLog | 9 +++++++++ + Xr.h | 3 ++- + src/Xr.h | 3 ++- + src/xr.c | 3 --- + src/xrgstate.c | 23 +++++++++++++++++------ + src/xrint.h | 9 ++++++++- + src/xrstate.c | 11 ++++++----- + src/xrsurface.c | 29 +++++++++++++++++++---------- + xr.c | 3 --- + xrgstate.c | 23 +++++++++++++++++------ + xrint.h | 9 ++++++++- + xrstate.c | 11 ++++++----- + xrsurface.c | 29 +++++++++++++++++++---------- + 13 files changed, 113 insertions(+), 52 deletions(-) + +commit 84da6c1f7f1877662ad3e83858e77872426e2f14 +Author: Carl Worth +Date: Sat Oct 26 08:00:39 2002 +0000 + + Added TODO, README, and .cvsignore + + .cvsignore | 2 ++ + README | 42 ++++++++++++++++++++++++++++++++++++++++++ + TODO | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 92 insertions(+) + +commit 06ddeffeb7f41ba535453bcbcff0c452420dfd51 +Author: Carl Worth +Date: Sat Oct 26 07:59:31 2002 +0000 + + Moved current point state to XrGState and dropped relative operators from XrPath. This is all in preparation for XrShowText, (which needs access to the current point) + + ChangeLog | 57 +++++++++++++- + Xr.h | 8 +- + src/Xr.h | 8 +- + src/xr.c | 190 ++++++++++++++++++++++++++++------------------ + src/xrgstate.c | 221 ++++++++++++++++++++++++++++++++++++++++-------------- + src/xrint.h | 87 ++++++++++++++------- + src/xrpath.c | 121 ++++++++++++++++++------------ + src/xrpen.c | 12 +-- + src/xrstate.c | 4 +- + src/xrstroker.c | 79 +++++++++---------- + src/xrtransform.c | 22 +++--- + xr.c | 190 ++++++++++++++++++++++++++++------------------ + xrgstate.c | 221 ++++++++++++++++++++++++++++++++++++++++-------------- + xrint.h | 87 ++++++++++++++------- + xrpath.c | 121 ++++++++++++++++++------------ + xrpen.c | 12 +-- + xrstate.c | 4 +- + xrstroker.c | 79 +++++++++---------- + xrtransform.c | 22 +++--- + 19 files changed, 1016 insertions(+), 529 deletions(-) + +commit 0b6fd5b4d11a6557b762696bbfb3ea7ec5233ed3 +Author: Carl Worth +Date: Thu Oct 24 11:27:29 2002 +0000 + + Added XrSetFillRule + + ChangeLog | 4 ++++ + Xr.h | 5 +++++ + src/Xr.h | 5 +++++ + src/xr.c | 6 ++++++ + src/xrfiller.c | 2 +- + src/xrgstate.c | 8 +++++++- + src/xrint.h | 10 ++++++---- + src/xrtraps.c | 6 +++--- + xr.c | 6 ++++++ + xrfiller.c | 2 +- + xrgstate.c | 8 +++++++- + xrint.h | 10 ++++++---- + xrtraps.c | 6 +++--- + 13 files changed, 60 insertions(+), 18 deletions(-) + +commit 8379c09a5b7111235da02e6cd74bcbe06e120bcd +Author: Carl Worth +Date: Wed Oct 23 18:30:53 2002 +0000 + + Fix for paths with multiple polygons disjoint in Y + + ChangeLog | 5 +++++ + src/xrtraps.c | 5 ++++- + xrtraps.c | 5 ++++- + 3 files changed, 13 insertions(+), 2 deletions(-) + +commit f07852454c2f34b9582d9a74ea83d74dcdb40dcc +Author: Carl Worth +Date: Wed Oct 23 11:58:38 2002 +0000 + + Added XrConcatMatrix, XrGetStatus. Properly clip color, alpha, and tolerance values from the user. Renamed _XrTransformPointWithoutTranslate to _XrTransformDistance. Added new XrIntStatus type for error codes that are not exported. + + Xr.h | 16 ++++++++++++++ + src/Xr.h | 16 ++++++++++++++ + src/xr.c | 37 +++++++++++++++++++++++++++++++++ + src/xrfiller.c | 2 +- + src/xrgstate.c | 22 ++++++++++++++++---- + src/xrint.h | 26 ++++++++++++++--------- + src/xrpen.c | 2 +- + src/xrspline.c | 4 ++-- + src/xrstroker.c | 16 +++++++------- + src/xrtransform.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- + xr.c | 37 +++++++++++++++++++++++++++++++++ + xrfiller.c | 2 +- + xrgstate.c | 22 ++++++++++++++++---- + xrint.h | 26 ++++++++++++++--------- + xrpen.c | 2 +- + xrspline.c | 4 ++-- + xrstroker.c | 16 +++++++------- + xrtransform.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- + 18 files changed, 312 insertions(+), 62 deletions(-) + +commit 88237e451e9719a211c3f2292f7679d4ac25654a +Author: Carl Worth +Date: Wed Oct 16 12:57:00 2002 +0000 + + Various cleanups, (no functional changes). Changed arguments for XrRel* from x,y to dx,dy. Changed XrError to XrStatus. Added a prefix of '_' to all internal functions + + Xr.h | 10 +- + src/Xr.h | 10 +- + src/xr.c | 146 +++++++++++++-------------- + src/xrcolor.c | 8 +- + src/xrfiller.c | 54 +++++----- + src/xrgstate.c | 264 ++++++++++++++++++++++++------------------------- + src/xrint.h | 290 +++++++++++++++++++++++++++--------------------------- + src/xrmisc.c | 2 +- + src/xrpath.c | 76 +++++++------- + src/xrpen.c | 114 ++++++++++----------- + src/xrpolygon.c | 52 +++++----- + src/xrspline.c | 88 ++++++++--------- + src/xrstate.c | 40 ++++---- + src/xrstroker.c | 224 ++++++++++++++++++++--------------------- + src/xrsurface.c | 12 +-- + src/xrtransform.c | 66 ++++++------- + src/xrtraps.c | 98 +++++++++--------- + xr.c | 146 +++++++++++++-------------- + xrcolor.c | 8 +- + xrfiller.c | 54 +++++----- + xrgstate.c | 264 ++++++++++++++++++++++++------------------------- + xrint.h | 290 +++++++++++++++++++++++++++--------------------------- + xrmisc.c | 2 +- + xrpath.c | 76 +++++++------- + xrpen.c | 114 ++++++++++----------- + xrpolygon.c | 52 +++++----- + xrspline.c | 88 ++++++++--------- + xrstate.c | 40 ++++---- + xrstroker.c | 224 ++++++++++++++++++++--------------------- + xrsurface.c | 12 +-- + xrtransform.c | 66 ++++++------- + xrtraps.c | 98 +++++++++--------- + 32 files changed, 1544 insertions(+), 1544 deletions(-) + +commit fe0606c7635ec666c3ea0695d30adefe3f47caad +Author: Carl Worth +Date: Tue Oct 1 04:37:42 2002 +0000 + + Standardized bracing-style and indentation + + src/xrpath.c | 8 +++----- + src/xrpen.c | 30 +++++++++++++++--------------- + src/xrstroker.c | 19 ++++++------------- + xrpath.c | 8 +++----- + xrpen.c | 30 +++++++++++++++--------------- + xrstroker.c | 19 ++++++------------- + 6 files changed, 48 insertions(+), 66 deletions(-) + +commit cf44ac0f7a2a91b11cf614bdf916f2d46234826c +Author: Carl Worth +Date: Tue Oct 1 04:28:20 2002 +0000 + + Fixed pen when it has more than 2 duplicate vertices. Imposed minimum value on tolerance to avoid infinite recursion. + + src/xrgstate.c | 2 ++ + src/xrint.h | 1 + + src/xrpen.c | 2 ++ + xrgstate.c | 2 ++ + xrint.h | 1 + + xrpen.c | 2 ++ + 6 files changed, 10 insertions(+) + +commit c5e37af245f02d7c2a40dd2cf457cfac25f253b5 +Author: Carl Worth +Date: Fri Sep 20 09:43:42 2002 +0000 + + Fixed rounding bug in _ComputeX. Use if statement instead of while loop to increment intersection Y value + + src/xrtraps.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++----------- + xrtraps.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++----------- + 2 files changed, 112 insertions(+), 26 deletions(-) + +commit e9255b4688fe516ade5a83a41c87036e686e3d1c +Author: Carl Worth +Date: Tue Sep 17 14:44:52 2002 +0000 + + Fixed intersection test for parallel lines + + src/xrtraps.c | 32 ++++++++++++++++++-------------- + xrtraps.c | 32 ++++++++++++++++++-------------- + 2 files changed, 36 insertions(+), 28 deletions(-) + +commit a2265c8e1bb35c649f2606f82caefdbf8cd86272 +Author: Carl Worth +Date: Tue Sep 17 14:21:36 2002 +0000 + + Added comments describing polygon tessellation algorithm + + src/xrtraps.c | 25 +++++++++++++++++++++++++ + xrtraps.c | 25 +++++++++++++++++++++++++ + 2 files changed, 50 insertions(+) + +commit d334c8bf8f6814976ba12a31643917d0ede86088 +Author: Carl Worth +Date: Tue Sep 17 13:38:55 2002 +0000 + + Cleaned up polygon tessellation code. Fixes all known problems. + + src/xrint.h | 3 -- + src/xrtraps.c | 119 +++++++++++++++++++++++++++++++++------------------------- + xrint.h | 3 -- + xrtraps.c | 119 +++++++++++++++++++++++++++++++++------------------------- + 4 files changed, 136 insertions(+), 108 deletions(-) + +commit 546b33d3627639b5ef38615ab2797f36e5d18939 +Author: Carl Worth +Date: Fri Sep 13 19:01:01 2002 +0000 + + Fixed some broken polygons by adding another sort to polygon tessellation code. + + src/xrtraps.c | 92 +++++++++++++++++++++++++++++++++-------------------------- + xrtraps.c | 92 +++++++++++++++++++++++++++++++++-------------------------- + 2 files changed, 104 insertions(+), 80 deletions(-) + +commit b2d0004956a17c0cfa6ee2fd6a5a4dbacc6846b9 +Author: Carl Worth +Date: Fri Sep 13 13:27:51 2002 +0000 + + Fixed _XrPenVerticesNeeded to not return negative numbers under scaling + + src/xrpen.c | 19 ++++++++++--------- + xrpen.c | 19 ++++++++++--------- + 2 files changed, 20 insertions(+), 18 deletions(-) + +commit 1fa0a496bb9689a5ebeacabd9cc3d05d48a1f4c3 +Author: Carl Worth +Date: Fri Sep 13 12:55:37 2002 +0000 + + Removed state from XrFiller that was redundant with state in XrPolygon. Fixed state update in XrStroker so that paths with multiple subpaths work. Simplified error-prone sorting in XrPenAddPoints. Renamed XrPenVertexTag to XrPenVertexFlag, (to allow for a single vertex that is the starting point for both the forward and reverse half-path). + + Xr.h | 2 -- + src/Xr.h | 2 -- + src/xrfiller.c | 17 +-------- + src/xrint.h | 26 ++++++-------- + src/xrpen.c | 104 ++++++++++++++++++++++++++------------------------------ + src/xrstroker.c | 26 +++++++------- + src/xrtraps.c | 12 ++++--- + xrfiller.c | 17 +-------- + xrint.h | 26 ++++++-------- + xrpen.c | 104 ++++++++++++++++++++++++++------------------------------ + xrstroker.c | 26 +++++++------- + xrtraps.c | 12 ++++--- + 12 files changed, 158 insertions(+), 216 deletions(-) + +commit 2ba3786b272b89da4f7fd264db55dc0a4744aad9 +Author: Carl Worth +Date: Tue Sep 10 09:51:14 2002 +0000 + + Fixed rendering of degenerate splines. Changed XrStrokeFace to define everything in terms of the direction of the path + + src/xrfiller.c | 5 ++++- + src/xrint.h | 5 +++-- + src/xrspline.c | 16 ++++++---------- + src/xrstroker.c | 58 ++++++++++++++++++++------------------------------------- + xrfiller.c | 5 ++++- + xrint.h | 5 +++-- + xrspline.c | 16 ++++++---------- + xrstroker.c | 58 ++++++++++++++++++++------------------------------------- + 8 files changed, 66 insertions(+), 102 deletions(-) + +commit 5f1938f26ff64d9036a5f78cdc47641427924a1d +Author: Carl Worth +Date: Tue Sep 10 08:01:00 2002 +0000 + + Fixed spline error calculation. New effort to compute spline initial/final slopes even for degenerate splines, (degenerate splines are still broken somewhere though). + + Imakefile | 2 + + src/xrgstate.c | 25 ++++++++---- + src/xrint.h | 20 +++++++--- + src/xrmisc.c | 34 ++++++++++++++++ + src/xrpath.c | 2 - + src/xrpen.c | 22 ++++------- + src/xrpolygon.c | 1 + + src/xrspline.c | 118 ++++++++++++++++++++++++++++++++++++++++++++------------ + src/xrtraps.c | 1 + + xrgstate.c | 25 ++++++++---- + xrint.h | 20 +++++++--- + xrmisc.c | 34 ++++++++++++++++ + xrpath.c | 2 - + xrpen.c | 22 ++++------- + xrpolygon.c | 1 + + xrspline.c | 118 ++++++++++++++++++++++++++++++++++++++++++++------------ + xrtraps.c | 1 + + 17 files changed, 340 insertions(+), 108 deletions(-) + +commit 44ca388c90aea7ed1b04784ddf3e53b339e0eb32 +Author: Carl Worth +Date: Thu Sep 5 13:12:23 2002 +0000 + + Fix polygon stroking so last final face is rendered exactly. Fix bug in which XrPolygonAddPt with horizontal edge would then drop the next edge. + + src/xrint.h | 2 +- + src/xrpen.c | 49 +++++++++++++++++++++++++++++-------------------- + src/xrpolygon.c | 3 ++- + src/xrstroker.c | 6 +----- + xrint.h | 2 +- + xrpen.c | 49 +++++++++++++++++++++++++++++-------------------- + xrpolygon.c | 3 ++- + xrstroker.c | 6 +----- + 8 files changed, 66 insertions(+), 54 deletions(-) + +commit bc362fc2e4bcf2324eda74c5d6290f4da6645e20 +Author: Carl Worth +Date: Thu Sep 5 10:06:44 2002 +0000 + + Corrected XrPenVerticesNeeded for handling transformed pens + + src/xrint.h | 3 +++ + src/xrpen.c | 26 ++++++++++++++++---------- + src/xrtransform.c | 32 ++++++++++++++++++++++++++++++++ + xrint.h | 3 +++ + xrpen.c | 26 ++++++++++++++++---------- + xrtransform.c | 32 ++++++++++++++++++++++++++++++++ + 6 files changed, 102 insertions(+), 20 deletions(-) + +commit 34ab06281fe53dde2d9b12780221b91dbafe940a +Author: Carl Worth +Date: Wed Sep 4 16:11:35 2002 +0000 + + Fixed brain-damaged XrPenVertexCompareByTheta. Correctly handle degenerate miter joins + + src/xrpen.c | 9 ++++++++- + src/xrstroker.c | 10 ++++++++++ + xrpen.c | 9 ++++++++- + xrstroker.c | 10 ++++++++++ + 4 files changed, 36 insertions(+), 2 deletions(-) + +commit 13216da122ba167d8a2c0a5bca37c844ccea2026 +Author: Carl Worth +Date: Wed Sep 4 07:28:56 2002 +0000 + + Fixed pen to transform user-space radius to device space, (vertices_needed computation still broken). Pen now behaves well when an extra point is coincident with an original vertex point. + + Xr.h | 4 ---- + src/Xr.h | 4 ---- + src/xrgstate.c | 5 ++++- + src/xrint.h | 2 +- + src/xrpen.c | 36 +++++++++++++++++++++++++++--------- + src/xrstroker.c | 47 ++++++++++++++++++++++++++++++----------------- + xrgstate.c | 5 ++++- + xrint.h | 2 +- + xrpen.c | 36 +++++++++++++++++++++++++++--------- + xrstroker.c | 47 ++++++++++++++++++++++++++++++----------------- + 10 files changed, 124 insertions(+), 64 deletions(-) + +commit cf6f2e67d9ff908054779480699440ea2736fe68 +Author: Carl Worth +Date: Tue Sep 3 08:42:25 2002 +0000 + + Added initial spline support. Added XrSetTolerance + + Xr.h | 5 +- + src/Xr.h | 5 +- + src/xr.c | 11 ++- + src/xrfiller.c | 29 +++++-- + src/xrgstate.c | 10 +++ + src/xrint.h | 66 +++++++++++--- + src/xrpen.c | 264 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- + src/xrpolygon.c | 58 +++++++++++++ + src/xrspline.c | 164 ++++++++++++++++++++++++++++++++++- + src/xrstroker.c | 136 +++++++++++++++++++++-------- + src/xrtraps.c | 6 +- + xr.c | 11 ++- + xrfiller.c | 29 +++++-- + xrgstate.c | 10 +++ + xrint.h | 66 +++++++++++--- + xrpen.c | 264 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- + xrpolygon.c | 58 +++++++++++++ + xrspline.c | 164 ++++++++++++++++++++++++++++++++++- + xrstroker.c | 136 +++++++++++++++++++++-------- + xrtraps.c | 6 +- + 20 files changed, 1354 insertions(+), 144 deletions(-) + +commit 25011eade4e33030bd86392e44bc02c945c5c0c3 +Author: Keith Packard +Date: Sun Aug 18 22:55:58 2002 +0000 + + Add dashed line support. Needs work to simplify some case analysis. + + src/xrgstate.c | 10 ++- + src/xrint.h | 8 ++ + src/xrstroker.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++------ + xrgstate.c | 10 ++- + xrint.h | 8 ++ + xrstroker.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++------ + 6 files changed, 436 insertions(+), 50 deletions(-) + +commit f20a4a96c77a251e18dc65f1ab9c24a10007b466 +Author: Carl Worth +Date: Thu Aug 15 17:33:00 2002 +0000 + + Fixed XrPen stubs + + Imakefile | 2 ++ + src/xrpen.c | 5 ++++- + xrpen.c | 5 ++++- + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 2d8f2f4946b789b5d14731e8eed77dc63dee035c +Author: Carl Worth +Date: Thu Aug 15 17:30:03 2002 +0000 + + Added xrpen/xrspline + + src/xrpen.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/xrspline.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + xrpen.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + xrspline.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 208 insertions(+) + +commit c1c7ee62bcf7e412fb74552ce171fbe44f5b4e7b +Author: Carl Worth +Date: Thu Aug 15 17:29:26 2002 +0000 + + Cleaned up XrPathInterpret. Prepare for splines + + Imakefile | 4 ++ + src/xrfiller.c | 94 ++++++++++++++++++++++++++++++++++++++++ + src/xrgstate.c | 51 +++++++++++++--------- + src/xrint.h | 113 ++++++++++++++++++++++++++++++++++++++++++------ + src/xrpath.c | 126 +++++++++++++++++++++++++----------------------------- + src/xrpolygon.c | 54 ++++++++++------------- + src/xrstroker.c | 46 +++++++++++++++++++- + src/xrtransform.c | 8 ---- + xrfiller.c | 94 ++++++++++++++++++++++++++++++++++++++++ + xrgstate.c | 51 +++++++++++++--------- + xrint.h | 113 ++++++++++++++++++++++++++++++++++++++++++------ + xrpath.c | 126 +++++++++++++++++++++++++----------------------------- + xrpolygon.c | 54 ++++++++++------------- + xrstroker.c | 46 +++++++++++++++++++- + xrtransform.c | 8 ---- + 15 files changed, 706 insertions(+), 282 deletions(-) + +commit 20f631ce22d1189410d21db077e3b38a70e06bf7 +Author: Keith Packard +Date: Thu Aug 15 17:19:28 2002 +0000 + + Add dashes, collapse stroke_style/fill_style into gstate + + Xr.h | 3 +++ + src/Xr.h | 3 +++ + src/xr.c | 9 +++++++++ + src/xrgstate.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++---------- + src/xrint.h | 23 +++++++++++---------- + src/xrstroker.c | 19 +++++++++--------- + xr.c | 9 +++++++++ + xrgstate.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++---------- + xrint.h | 23 +++++++++++---------- + xrstroker.c | 19 +++++++++--------- + 10 files changed, 168 insertions(+), 64 deletions(-) + +commit ba6c4971300181f64084437ba190e90c6c21cc5e +Author: Keith Packard +Date: Thu Aug 15 16:48:16 2002 +0000 + + Fix combined transforms, fix caps/joins under transform + + src/xrgstate.c | 2 +- + src/xrpath.c | 2 ++ + src/xrstroker.c | 75 ++++++++++++++++++++++++++++++++++++++++++++----------- + src/xrtransform.c | 12 ++++++--- + xrgstate.c | 2 +- + xrpath.c | 2 ++ + xrstroker.c | 75 ++++++++++++++++++++++++++++++++++++++++++++----------- + xrtransform.c | 12 ++++++--- + 8 files changed, 144 insertions(+), 38 deletions(-) + +commit 91f09687e5bebd8436e2e1c34ec153b976a3cc30 +Author: Carl Worth +Date: Thu Aug 15 05:22:59 2002 +0000 + + Added error handling (Xr shutdown) for out-of-memory handling. Started adding spline functions. + + Xr.h | 12 ++++++ + src/Xr.h | 12 ++++++ + src/xr.c | 93 ++++++++++++++++++++++++++++++++++++++---- + src/xrgstate.c | 116 +++++++++++++++++++++++++++++++++++----------------- + src/xrint.h | 59 +++++++++++++-------------- + src/xrpath.c | 124 ++++++++++++++++++++++++++++++++++---------------------- + src/xrpolygon.c | 31 +++++++++----- + src/xrstate.c | 22 ++++++++-- + src/xrstroker.c | 92 ++++++++++++++++------------------------- + src/xrtraps.c | 94 ++++++++++++++++++++++-------------------- + xr.c | 93 ++++++++++++++++++++++++++++++++++++++---- + xrgstate.c | 116 +++++++++++++++++++++++++++++++++++----------------- + xrint.h | 59 +++++++++++++-------------- + xrpath.c | 124 ++++++++++++++++++++++++++++++++++---------------------- + xrpolygon.c | 31 +++++++++----- + xrstate.c | 22 ++++++++-- + xrstroker.c | 92 ++++++++++++++++------------------------- + xrtraps.c | 94 ++++++++++++++++++++++-------------------- + 18 files changed, 804 insertions(+), 482 deletions(-) + +commit ba3bce9d7e3ad45db5a2ce115404bd332d868ac7 +Author: Keith Packard +Date: Thu Aug 15 03:50:28 2002 +0000 + + Note that the only rectangles could be quickly converted to traps. Add miter joins + + src/xrint.h | 6 ++--- + src/xrstroker.c | 78 ++++++++++++++++++++++++++++++++++++++++++++------------- + src/xrtraps.c | 16 +----------- + xrint.h | 6 ++--- + xrstroker.c | 78 ++++++++++++++++++++++++++++++++++++++++++++------------- + xrtraps.c | 16 +----------- + 6 files changed, 126 insertions(+), 74 deletions(-) + +commit e55de618e7386364032fc4985a67942cd7a825eb +Author: Keith Packard +Date: Wed Aug 14 19:19:33 2002 +0000 + + Add bevel joins + + src/xrgstate.c | 4 ++-- + src/xrint.h | 3 +++ + src/xrpath.c | 5 ----- + src/xrpolygon.c | 6 ++++++ + src/xrstroker.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++--------- + xrgstate.c | 4 ++-- + xrint.h | 3 +++ + xrpath.c | 5 ----- + xrpolygon.c | 6 ++++++ + xrstroker.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++--------- + 10 files changed, 130 insertions(+), 34 deletions(-) + +commit 6b1903c40e74d13a9387ff1afa5fa5d19c1b8a29 +Author: Keith Packard +Date: Wed Aug 14 18:32:42 2002 +0000 + + Prepare for joins and caps + + Imakefile | 4 ++++ + src/xrint.h | 18 ++++++++++++++++ + src/xrpath.c | 21 ++++++++++++++++-- + src/xrstroker.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++----------- + xrint.h | 18 ++++++++++++++++ + xrpath.c | 21 ++++++++++++++++-- + xrstroker.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++----------- + 7 files changed, 186 insertions(+), 30 deletions(-) + +commit 71b804a30163404eb30df6d81a9ee3477e0d5bcb +Author: Carl Worth +Date: Wed Aug 14 17:32:22 2002 +0000 + + Fixed XrFill to implicitly call ClosePath. Broke off XrFillStyle/XrStrokeStyle + + src/xr.c | 1 + + src/xrgstate.c | 37 +++++++++++++++++++++++++------------ + src/xrint.h | 26 ++++++++++++++------------ + src/xrpath.c | 27 --------------------------- + src/xrstroker.c | 5 +++-- + xr.c | 1 + + xrgstate.c | 37 +++++++++++++++++++++++++------------ + xrint.h | 26 ++++++++++++++------------ + xrpath.c | 27 --------------------------- + xrstroker.c | 5 +++-- + 10 files changed, 86 insertions(+), 106 deletions(-) + +commit 466fc8700f22e6635997a5b427732d51b9d6b5cd +Author: Carl Worth +Date: Wed Aug 14 00:44:28 2002 +0000 + + Handle degenerate polygons (no edges) + + src/xrtraps.c | 5 ++++- + xrtraps.c | 5 ++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 48bd9e5d30be831e71f12def2e521a7fa713e06a +Author: Carl Worth +Date: Wed Aug 14 00:39:43 2002 +0000 + + Total rewrite of path storage/interpretation in preparation for splines. + + Imakefile | 6 +- + Xr.h | 33 +++-- + src/Xr.h | 33 +++-- + src/xr.c | 41 +++--- + src/xrcolor.c | 33 +++-- + src/xrgstate.c | 289 ++++++--------------------------------- + src/xrint.h | 206 ++++++++++++++-------------- + src/xrpath.c | 393 +++++++++++++++++++++++++++++++++++++++++++----------- + src/xrpolygon.c | 104 +++++++++++++++ + src/xrstate.c | 33 +++-- + src/xrstroker.c | 141 ++++++++++++++++++++ + src/xrsurface.c | 33 +++-- + src/xrtransform.c | 33 +++-- + src/xrtraps.c | 210 +++++++++-------------------- + xr.c | 41 +++--- + xrcolor.c | 33 +++-- + xrgstate.c | 289 ++++++--------------------------------- + xrint.h | 206 ++++++++++++++-------------- + xrpath.c | 393 +++++++++++++++++++++++++++++++++++++++++++----------- + xrpolygon.c | 104 +++++++++++++++ + xrstate.c | 33 +++-- + xrstroker.c | 141 ++++++++++++++++++++ + xrsubpath.c | 150 --------------------- + xrsurface.c | 33 +++-- + xrtransform.c | 33 +++-- + xrtraps.c | 210 +++++++++-------------------- + 26 files changed, 1718 insertions(+), 1536 deletions(-) + +commit 9824dc894440bc2566206bb5f04d403d68bf24c0 +Author: Carl Worth +Date: Mon Aug 12 11:43:56 2002 +0000 + + Fixed XrPathClose to deal with empty path + + src/xrpath.c | 6 ++++-- + xrpath.c | 6 ++++-- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit c2824c4ded348a6cfa56ab55db5857d3021f54ca +Author: Carl Worth +Date: Mon Aug 12 09:38:05 2002 +0000 + + Stabilized the sort used to generate traps. Discard degenerate traps + + Imakefile | 13 ++++--------- + src/xrgstate.c | 2 +- + src/xrtraps.c | 10 +++++++++- + xrgstate.c | 2 +- + xrtraps.c | 10 +++++++++- + 5 files changed, 24 insertions(+), 13 deletions(-) + +commit c44bf18e78f502fb30fa62db171216289d5ee5d3 +Author: Carl Worth +Date: Wed Aug 7 19:49:36 2002 +0000 + + Fixed missing semicolon. + + src/xrsurface.c | 2 +- + xrsurface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 9ee45ab8164593f1e368b99c0d63bd4b21a4daa1 +Author: Carl Worth +Date: Wed Aug 7 19:48:49 2002 +0000 + + Fixed missing xrtraps.c + + src/xrtraps.c | 494 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + xrtraps.c | 494 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 988 insertions(+) + +commit f7f194c47dbf20a9ba56bb928be78530c98bc16c +Author: Carl Worth +Date: Tue Jul 23 07:22:56 2002 +0000 + + Added ChangeLog + + ChangeLog | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit f8fef556d7b5eb391ce52d4307252e4a1a30b024 +Author: Carl Worth +Date: Tue Jul 23 07:22:23 2002 +0000 + + See ChangeLog for 2002-07-16 + + Imakefile | 10 ++- + Xr.h | 79 +++++++++++++++-- + src/Xr.h | 79 +++++++++++++++-- + src/xr.c | 26 +++++- + src/xrcolor.c | 16 ++-- + src/xrgstate.c | 264 +++++++++++++++++++++++++++++++++++++------------------- + src/xrint.h | 110 +++++++++++++++++------ + src/xrpath.c | 6 +- + src/xrsurface.c | 134 ++++++++++++++++++++++++++++ + xr.c | 26 +++++- + xrcolor.c | 16 ++-- + xrgstate.c | 264 +++++++++++++++++++++++++++++++++++++------------------- + xrint.h | 110 +++++++++++++++++------ + xrpath.c | 6 +- + xrpicture.c | 134 ---------------------------- + xrsubpath.c | 5 +- + xrsurface.c | 134 ++++++++++++++++++++++++++++ + 17 files changed, 1015 insertions(+), 404 deletions(-) + +commit 093b754cb1014ed95baaa1bde579d033d7856e46 +Author: Carl Worth +Date: Fri Jun 14 15:13:44 2002 +0000 + + Added XrSetVisual, XrSetFormat. Fixed XrSetAlpha. Fixed transformed line widths, (added inverse CTM). + + Xr.h | 16 +++++++++-- + src/Xr.h | 16 +++++++++-- + src/xr.c | 27 +++++++++++------- + src/xrcolor.c | 1 + + src/xrgstate.c | 82 +++++++++++++++++++++++++++++++++++++++---------------- + src/xrint.h | 38 ++++++++++++++++++++------ + src/xrtransform.c | 77 +++++++++++++++++++++++++++++++++++---------------- + xr.c | 27 +++++++++++------- + xrcolor.c | 1 + + xrgstate.c | 82 +++++++++++++++++++++++++++++++++++++++---------------- + xrint.h | 38 ++++++++++++++++++++------ + xrpicture.c | 60 ++++++++++++++++++++++++++++++---------- + xrsubpath.c | 6 ++-- + xrtransform.c | 77 +++++++++++++++++++++++++++++++++++---------------- + 14 files changed, 394 insertions(+), 154 deletions(-) diff --git a/ChangeLog.pre-1.10 b/ChangeLog.pre-1.10 new file mode 100644 index 000000000..88428f94e --- /dev/null +++ b/ChangeLog.pre-1.10 @@ -0,0 +1,44510 @@ +commit cb0bc64c16b3a38cbf0c622830c18ac9ea6e2ffe +Author: Chris Wilson +Date: Mon Sep 6 17:15:51 2010 +0100 + + version: 1.10.0 *release* + + /me faints with excitement. + + cairo-version.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 87fad104645c481ab027afbc9fa45c54cacbc9a7 +Author: Chris Wilson +Date: Mon Sep 6 17:14:41 2010 +0100 + + NEWS: Sum up 2 years of development for 1.10.0 in 60 lines + + NEWS | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 61 insertions(+) + +commit 04623ef9df7274d411a3b7f03129bf43e53e7086 +Author: Chris Wilson +Date: Mon Sep 6 13:15:55 2010 +0100 + + test: Add subsurface-outside-target refs to REFERENCE_IMAGES + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit d5b2c2a12ebea33f4d108d4deec2e9111c8c7e12 +Author: Chris Wilson +Date: Mon Sep 6 13:10:08 2010 +0100 + + test: Rename clip-fill-*-unbounded.image16 ref to match REFERENCE_IMAGES + + test/clip-fill-eo-unbounded.image16.ref.png | Bin 0 -> 2887 bytes + test/clip-fill-eo-unbounded.image16.rgb24.ref.png | Bin 2887 -> 0 bytes + test/clip-fill-nz-unbounded.image16.ref.png | Bin 0 -> 2887 bytes + test/clip-fill-nz-unbounded.image16.rgb24.ref.png | Bin 2887 -> 0 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit cab9682f9dc4c99dcd51ddb66abd756e2ac7a63c +Author: Chris Wilson +Date: Mon Sep 6 12:24:47 2010 +0100 + + check: Ignore the documentation errors. + + Currently it is complaining about having documentation for + unconfigured sections, ignore it for now. + + doc/public/check-doc-coverage.sh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 8127f1f5d52bb716dbd70efe096894f2a542f4a9 +Author: Chris Wilson +Date: Mon Sep 6 12:24:14 2010 +0100 + + Bump pixman requirements to 0.18.4 for assorted fixes. + + README | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 21a2f90cdef3d592c1d1614852fe3929ed2aa765 +Author: Chris Wilson +Date: Thu Sep 2 13:19:26 2010 +0100 + + check: Make the actual error stand out + + doc/public/check-doc-coverage.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8258532794d0579f6c1b825b8cfb9c8f7ced4369 +Author: Chris Wilson +Date: Thu Sep 2 13:15:07 2010 +0100 + + Reduce the cairo_device_type_t to only hold the used entries. + + This should help clarify the documentation by not mentioning non-existent + devices and prevent any assumed coupling between surface-type values and + devices. + + src/cairo.h | 49 ++++++-------------------------- + util/cairo-gobject/cairo-gobject-enums.c | 24 +++------------- + 2 files changed, 12 insertions(+), 61 deletions(-) + +commit e3afbc1875d618c6d7e893971372be8f9889fc8b +Author: Chris Wilson +Date: Thu Sep 2 13:07:53 2010 +0100 + + check: Fix for link-time-optimisation + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a9e055ff481303428cd9684dca826bc3f5d868c5 +Author: M Joonas Pihlaja +Date: Thu Sep 2 14:51:30 2010 +0100 + + freelist: Separate freelist inlines from the datatype in headers. + + The cairo-freelist-private.h header has a number of static inline + functions which call hidden functions in libcairo. This poses + a problem on Solaris where the native compiler compiles inline + functions whether they are used or not, thereby adding the + link time requirements on hidden functions from whatever code + that includes cairo-freelist-private.h. Unfortunately the + boilerplate code includes cairo-private headers and indirectly + the freelist header, so linking the boilerplate helper library + fails on Solaris. + + This patch separates the structure definitions from the function + prototypes and static inlines in cairo-freelist-private.h by moving + the datatypes to a new cairo-freelist-type-private.h. + + src/Makefile.sources | 1 + + src/cairo-freelist-private.h | 28 +------------------- + src/cairo-freelist-type-private.h | 54 +++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib-display.c | 2 +- + src/cairo-xlib-private.h | 2 +- + 5 files changed, 58 insertions(+), 29 deletions(-) + +commit f5632d641c44a143386ca3b413e90ed3b1a85f89 +Author: M Joonas Pihlaja +Date: Thu Sep 2 13:55:55 2010 +0300 + + build: Remove stray backslash. + + A stray backslash bwetween two assignment lines apparently + invokes a GNU make extension for conditional assignments. + This patch fixes the build when using the native Solaris make. + + src/Makefile.sources | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3a8b8fcc2a8a48cef49211c45723862f9fa8db23 +Author: Benjamin Otte +Date: Wed Sep 1 21:14:40 2010 +0200 + + gobject: Fix header defines + + util/cairo-gobject/cairo-gobject.h | 64 +++++++++++++++++++------------------- + 1 file changed, 32 insertions(+), 32 deletions(-) + +commit 54a651564cdd2510d0a66f6720c4a45733ff3285 +Author: Benjamin Otte +Date: Wed Sep 1 18:47:16 2010 +0200 + + build: Work around caching not reevaluating uncached variables + + This is a somewhat crude hack to ensure that GOBJECT_CFLAGS/LIBS are + properly cached. + + configure.ac | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 28ba78a9716f3c105cdfb5f7519f2435dd9cb271 +Author: Benjamin Otte +Date: Wed Sep 1 18:46:46 2010 +0200 + + gobject: Fix pkgconfig file variable + + I confused % and $. I blame it on spec files. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 61a1835e40d0b6d786951143779077d16ed2486e +Author: Benjamin Otte +Date: Wed Sep 1 03:17:12 2010 +0200 + + subsurface: Fix acquire_source_surface for out-of-bounds surfaces + + See subsurface-outside-target test. + + src/cairo-surface-subsurface.c | 41 +++++++++++++++++++++++------------------ + 1 file changed, 23 insertions(+), 18 deletions(-) + +commit f54c51e75c7abe872127d559e029bf4383439bca +Author: Benjamin Otte +Date: Wed Sep 1 02:10:51 2010 +0200 + + test: Add subsurface-outside-target + + This test defines the behavior of subsurfaces when they are created to + be bigger than their target. + + test/Makefile.sources | 1 + + test/subsurface-outside-target.argb32.ref.png | Bin 0 -> 2063 bytes + test/subsurface-outside-target.c | 178 ++++++++++++++++++++++++++ + test/subsurface-outside-target.rgb24.ref.png | Bin 0 -> 1648 bytes + 4 files changed, 179 insertions(+) + +commit 6eab5ee10c111cf87dcf62e3f639f44cfd1e5cf6 +Author: Maarten Bosmans +Date: Sat Aug 28 13:39:21 2010 +0200 + + build: prefer libpng14 over older versions + + Also move libpng to the front of the list, so that the default + version of the system is first checked. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9f98ec6eb915204d59820cf57d32f347f9933517 +Author: M Joonas Pihlaja +Date: Sun Aug 29 00:05:51 2010 +0300 + + device: Refer the user to per-backend docs about devices. + + The exact semantics of the device API can't be spelled out + out in the device API docs since the effects are so tied + to the specific backend. To use a particular device in + practice the user should refer to the backend docs. + + src/cairo-device.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit b0f65054b810d432238ff4986bee3f63e1fc46df +Author: M Joonas Pihlaja +Date: Sun Aug 29 00:03:07 2010 +0300 + + subsurface: Add a note to the docs about usage restrictions. + + Make our assumptions about constructed subsurfaces explicit + while we work out the correct semantics for the edge cases. + + src/cairo-surface-subsurface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 92fe2d370d120f4d9bc95e92209d1c1cec7e900b +Author: Benjamin Otte +Date: Sat Aug 28 17:12:45 2010 +0200 + + surface-offset: Use right variable in mask + + Use source/mask instead of their copies. The copies only get initialized + if we actually need to translate things. + + src/cairo-surface-offset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df4b23ff74f3d22fb306f59cdba4dce6b0857cd2 +Author: M Joonas Pihlaja +Date: Fri Aug 27 20:26:06 2010 +0300 + + subsurface: Fix crash when acquiring a source image. + + The code is passing in the extra info received from + the target surface's acquire_source() method to + _cairo_surface_get_extents() rather than the acquired + source surface itself. + + src/cairo-surface-subsurface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d146867dc4d4e17da2fd1e4776f62aaa999d90f +Author: Andrea Canciani +Date: Thu Aug 26 14:50:34 2010 +0200 + + subsurface: Correct cloning condition + + 72644c6df2c2da1d77ca10a755dbb44bbd960c0d was using the wrong (inverted) + condition to check if the subsurface extents are contained in the + target extents. + + src/cairo-surface-subsurface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 72644c6df2c2da1d77ca10a755dbb44bbd960c0d +Author: Andrea Canciani +Date: Thu Aug 26 14:24:17 2010 +0200 + + subsurface: Avoid invalid accesses + + Whenever subsurface extents are not contained in the target extents, + using the source image given by the target (with origin corrected by + using an appropriate offset in the data pointer) is not a valid + operation. Fallback to cloning in that case. + + src/cairo-surface-subsurface.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit df4465bdd11e25a1ed942bc0fc8e7dc5d43f951f +Author: Andrea Canciani +Date: Thu Aug 26 14:23:04 2010 +0200 + + subsurface: Silence compiler warnings + + Commit d1c35f5e65d53f6b8b9060455335424ca0f44bd0 introduced two + unused variable warnings. + + src/cairo-surface-subsurface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit d1c35f5e65d53f6b8b9060455335424ca0f44bd0 +Author: Benjamin Otte +Date: Thu Aug 26 13:55:02 2010 +0200 + + subsurface: Don't clip size to target size + + This clipping would modify the origin of the subsurface and then the + creator has no easy way to figure this out. + + src/cairo-surface-subsurface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 174fb5f16f93887e2f319edd5b46efae3e7e93ad +Author: Benjamin Otte +Date: Thu Aug 26 13:21:04 2010 +0200 + + subsurface: Don't apply device transform twice for source/mask + + src/cairo-surface-offset.c | 12 ------------ + 1 file changed, 12 deletions(-) + +commit e79acf47a57b60c83d1f9491aac354161986b29b +Author: Benjamin Otte +Date: Thu Aug 26 12:54:25 2010 +0200 + + subsurface: Make CAIRO_SURFACE_TYPE_SUBSURFACE public + + src/cairo-analysis-surface.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-script-surface.c | 2 +- + src/cairo-surface-subsurface.c | 4 ++-- + src/cairo-types-private.h | 3 +-- + src/cairo-xcb-surface-render.c | 4 ++-- + src/cairo-xlib-surface.c | 2 +- + src/cairo.h | 7 ++++++- + src/drm/cairo-drm-i915-shader.c | 6 +++--- + src/drm/cairo-drm-i965-shader.c | 6 +++--- + 12 files changed, 25 insertions(+), 21 deletions(-) + +commit 40459dacb52587cc784faf2635e54797d3989408 +Author: Benjamin Otte +Date: Thu Aug 26 11:45:28 2010 +0200 + + subsurface: Don't crash when the device transform isn't integer + + Apply the transform before rounding to integer coordinates, so we can + handle doubles easily. + + src/cairo-surface-subsurface.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit e19b213e84ab8b8ead5e0c700e5b906590e22aa1 +Author: Benjamin Otte +Date: Thu Aug 26 11:18:29 2010 +0200 + + subsurface: Make subsurfaces their own type + + Do not try to hide being a subsurface. + This would cause confusion when users where calling surface-type + specific getters on subsurfaces. + + FIXME: We still need public API to access a subsurface's target though. + + src/cairo-surface-subsurface.c | 1 - + 1 file changed, 1 deletion(-) + +commit e65bf64c4a6e2c7ff673449b8459b3150e438e21 +Author: Benjamin Otte +Date: Thu Aug 26 11:17:06 2010 +0200 + + subsurface: Properly account for device offsets in the target + + src/cairo-surface-subsurface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 8e9c4ea5890a4df3f463e592dc3aa429bb423608 +Author: Chris Wilson +Date: Wed Aug 11 12:18:53 2010 +0100 + + Mark the context as invalid on the final cairo_destroy() + + We initialise the context to a non-error state upon creation, but after + destroy there is a window of opportunity where the object is kept alive + inside the context pool and the user could mistakenly keep on passing + the zombie context into cairo functions. As all entry points need to + check error status, flagging the context as an error object upon the + final unreference prevents such misuse (until such as time as the + context is reallocated). + + src/cairo.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit cd52378ae60ab2075d7e9ec7335e990b2f46059e +Author: Andrea Canciani +Date: Tue Aug 10 19:38:59 2010 +0200 + + test: Update linear-gradient-large ref image + + Make linear-gradient-large ref image match xlib gradients (both on nvidia + and on macosx) and pixman gradients (when patched to compute the linear + gradients using floating point math). + + test/linear-gradient-large.ref.png | Bin 3753 -> 4079 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a7762e3d6570a6981d8fb74ecc6ae30391c39b89 +Author: Krzysztof KosiÅ„ski +Date: Tue Aug 10 17:55:03 2010 +0200 + + tests: Add linear-gradient-large test + + Shows large rounding errors in Pixman when computing gradients. Added as + a test to Cairo to catch similar issues in other backends. + + https://bugs.freedesktop.org/show_bug.cgi?id=29470 + + test/Makefile.am | 5 +-- + test/Makefile.sources | 1 + + test/linear-gradient-large.c | 67 +++++++++++++++++++++++++++++++++++++ + test/linear-gradient-large.ref.png | Bin 0 -> 3753 bytes + 4 files changed, 71 insertions(+), 2 deletions(-) + +commit 56ea51fdcc273531b5e86b921aad19237a1c9415 +Author: Andrea Canciani +Date: Mon Aug 9 20:23:50 2010 +0200 + + Replace insertion sort with mergesort in the scan converter + + Insertion sort can take up to O(n^2), mergesort is guaranteed to run + in O(n*log(n)). + An example showing bad performance for insertion sort is: + https://bugs.freedesktop.org/show_bug.cgi?id=28067 + + The mergesort has been engineered to be fast even when working on + cases where the insertion sort would have performed well and as + expected it shows no changes in the benchmark cairo traces. + + src/cairo-tor-scan-converter.c | 138 ++++++++++++++++++++++++++++++----------- + 1 file changed, 103 insertions(+), 35 deletions(-) + +commit a150371a5d10e03d6c0d781c6fac950a9ac6be18 +Author: Nicolaus L Hepler +Date: Tue Aug 10 09:34:39 2010 +0200 + + ft-font: Make alpha mapping consistent + + Vertical RGB mapping previously forced opaque pixels. + To be consistent with horizontal RGB/BGR and vertical BGR it + should use an alpha equal to the mid channel (green). + + src/cairo-ft-font.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit 73470862cbc5895147d5c58ca2647f539e8fe67c +Author: David Schleef +Date: Tue Aug 10 02:37:38 2010 +0200 + + perf: Fix README to say cairo-perf-micro + + perf/README | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit df8f96423429915ef1648310fce8b5aed0917c0a +Author: Benjamin Otte +Date: Tue Aug 10 01:24:30 2010 +0200 + + build: Fudge the build system some more so it handles extra libs + + Add NONPKGCONFIG_EXTRA_LIBS that are only put into the generated pc file + but not used when linking. This is now used to add -lcairo-gobject to + the cairo-gobject.pc file. + + build/configure.ac.features | 3 +++ + configure.ac | 2 +- + src/cairo-features-uninstalled.pc.in | 2 +- + src/cairo-features.pc.in | 2 +- + 4 files changed, 6 insertions(+), 3 deletions(-) + +commit 01325ad767acf6213135a0bad895de233324f745 +Author: Benjamin Otte +Date: Tue Aug 10 00:11:25 2010 +0200 + + gobject: Include the extra library in the pkgconfig file + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 8fb91dc3f6b691f91c322cec4b1d0ee4dbebd69c +Author: M Joonas Pihlaja +Date: Tue Aug 10 00:53:53 2010 +0300 + + script: Fix script backend build. + + The flight data recorders were missing an include + of cairo-tee.h ever since cairo-tee.h became an optional + backend. + + util/cairo-fdr/fdr.c | 1 + + util/cairo-sphinx/fdr.c | 1 + + 2 files changed, 2 insertions(+) + +commit 766832364904dbf5b8a67ebc1600d2ec45d2734f +Author: Andrea Canciani +Date: Mon Aug 9 18:47:13 2010 +0200 + + perf: Improve calibration + + Make the loops count depend on the actual calibration_loops/calibration_time + instead of calibration_loops/calibration_max_time. + This avoids having some tests take much less/more than the wanted time per iteration + (I was having some tests taking about 1 second, other taking about 7 seconds when + the ms_per_iteration was 2000) + + Spend 0.5-1 times the time wanted for each iteration in calibration, increase the + accuracy of loops count. Just making the loops count be the correct ratio doesn't + guarantee that the iteration time is accurate. By actually measuring iteration + times until it gets greater than 1/4 of the wanted time, the total sum is bound + to be <= the wanted iteration time and last calibration time is between 1/4 and + 1/2 of the wanted time, so it should give a very accurate loop count. + + perf/cairo-perf-micro.c | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +commit 046b642db0782ab5e2a5c82988b21e05afe8e716 +Author: Rich Walsh +Date: Sat Aug 7 16:30:59 2010 +0300 + + os2: Restore surface type checking in the get_extents method. + + src/cairo-os2-surface.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 78bdd87b7545f8e85632ac301a69da145727fcec +Author: Rich Walsh +Date: Sat Aug 7 16:22:26 2010 +0300 + + os2: Fix clipping to bounds when blitting pixels. + + The bounds checks on the rectangle to blit were done + after converting target/source to inclusive/noninclusive + coordinates rather than before, potentially causing an + off-by-one in the sizes, since the same logic was applied + to both inclusive and non-inclusive coordinates. This + patch enforces bounds up front. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-surface.c | 62 +++++++++++++++++++++---------------------------- + 1 file changed, 27 insertions(+), 35 deletions(-) + +commit d0284687b32161212d6bc52309e2d5bb516dc3e8 +Author: Rich Walsh +Date: Sat Aug 7 03:53:24 2010 +0300 + + os2: Tweak an inline declaration. + + C99 and cairo prefers "static inline " rather + than "static inline". + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb30340064a2ff24dc408e185c5a309a14f6c78c +Author: Rich Walsh +Date: Sat Aug 7 03:33:10 2010 +0300 + + os2: Consolidate error paths of cairo_os2_surface_create(). + + Use a single code path to release the resources acquired + for a surface that's been partially constructed, rather than + have multiple error exits which each release the resources + acquired so far. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-surface.c | 120 ++++++++++++++++++++++++------------------------ + 1 file changed, 60 insertions(+), 60 deletions(-) + +commit 66e3d650fe90754c811195c75579ac7a3512b7be +Author: Rich Walsh +Date: Sat Aug 7 03:12:12 2010 +0300 + + os2: Document ownership of OS/2 objects passed to surfaces. + + Clarify the documentation for cairo_os2_surface_create() + and cairo_os2_surface_set_hwnd() to note that the ownership + of the presentation space and window respectively + remains with the caller. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-surface.c | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +commit 01525271544d5b88f87027e470fa85038d59bf8d +Author: Rich Walsh +Date: Sat Aug 7 03:08:21 2010 +0300 + + os2: Don't fake an Anchor Block when one isn't needed. + + The code was being tricky about passing in a HAB to + DevOpenDC() even though one isn't needed at all under + OS/2. Pass in NULL instead. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-surface.c | 16 +++------------- + 1 file changed, 3 insertions(+), 13 deletions(-) + +commit 883d9725e0f844e7d5cc4c50c75a812b5435702b +Author: Rich Walsh +Date: Sat Aug 7 03:01:56 2010 +0300 + + os2: Fix buffer allocator behaviour on arithmetic overflow. + + On arithmetic overflow the buffer allocator would attempt + to allocate zero bytes instead of failing the allocation. + Depending on the implementation of the underlying allocator + being proxied, this may result in an allocation of a zero + length buffer, causing all kinds of grief. This patch + causes arithmetic overflows to explicitly fail the allocation. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-surface.c | 54 +++++++++++++++++++++---------------------------- + 1 file changed, 23 insertions(+), 31 deletions(-) + +commit b54037828c5b338b2f1dcbe48201225b258c1e1e +Author: Rich Walsh +Date: Sat Aug 7 02:40:20 2010 +0300 + + os2: Fix blitting 24 bpp pixel data. + + There's a format mismatch between cairo's pixel formats + and OS/2 24 bpp data: the individual pixels in OS/2 take + only three bytes per pixel, but there needs to be padding + between lines to make the start of a line always be aligned + at a DWORD boundary. + + This patch fixes the format conversion code to include + the required padding between rows. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + src/cairo-os2-private.h | 1 + + src/cairo-os2-surface.c | 116 ++++++++++++++++++++++++++++-------------------- + 2 files changed, 68 insertions(+), 49 deletions(-) + +commit 5aadecb3ac03d379c2c8113566fa8062843df42e +Author: Rich Walsh +Date: Sat Aug 7 02:30:01 2010 +0300 + + os2: New API to create surfaces without a persistent HPS. + + It's not always necessary to create a presentation space (HPS) for + surface tied to a window, as the user may have one already. This patch + introduces three new functions to create a surface without an HPS + and let the user manage an HPS associated with the surface. + + Thread "OS/2 surface fixes" on cairo-l: + http://lists.cairographics.org/archives/cairo/2010-July/020343.html + + Mozilla Bugzilla: + https://bugzilla.mozilla.org/show_bug.cgi?id=557159 + + src/cairo-os2-surface.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-os2.h | 14 +++++ + 2 files changed, 153 insertions(+), 3 deletions(-) + +commit 9669faa936fe38da3615d7831e423befa5ecdfad +Author: Benjamin Otte +Date: Sun Aug 8 17:23:05 2010 +0200 + + gl: Handle errors from _cairo_gl_gradient_render() + + Thanks Andrea for finding this. + + src/cairo-gl-gradient.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit e31b56e020df806aa6180cd2efa0a34e55e5adaf +Author: Benjamin Otte +Date: Sun Aug 8 14:45:24 2010 +0200 + + configure: Fix gobject handling + + 1) Explicitly depend on glib, too. + 2) Don't link gobject into libcairo proper (thanks Joonas for noticing). + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ae2b7b13cd5fdeaee44496056bb99f497346e262 +Author: Andrea Canciani +Date: Wed Aug 4 14:22:23 2010 +0200 + + pattern: Simplify degenerate linear pattern to solid colors + + Degenerate linear patterns are considered clear if they have + EXTEND_NONE, the average of the first and the last stop if they are + EXTEND_PAD, the weighted average of the stops (based on the size of + the interpolation range in which they are active, just like integrating + over the whole interpolation range and taking the average) if they are + EXTEND_REPEAT or EXTEND_REFLECT. + + Fixes degenerate-linear-gradient + + src/cairo-pattern.c | 119 +++++++++++++++++++++++++++++++- + test/degenerate-linear-gradient.ref.png | Bin 232 -> 322 bytes + 2 files changed, 117 insertions(+), 2 deletions(-) + +commit d54a5a9fc90857448954d6cbe725d4665efa3d45 +Author: Andrea Canciani +Date: Wed Aug 4 14:16:34 2010 +0200 + + pattern: Add gradient degeneracy testing functions + + Introduce two new (private) functions for testing the degeneracy of linear + and radial gradients and use them instead of verbose (and error-prone) tests. + + src/cairo-pattern.c | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +commit 63434bc43819e2c7d4db568e82f5a9a7dfb0418d +Author: Andrea Canciani +Date: Wed Aug 4 14:22:01 2010 +0200 + + gstate: Correct comment + + src/cairo-gstate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 28cd511fb974f886ae65e588413afcfc220a1a7c +Author: Andrea Canciani +Date: Sat Aug 7 22:55:46 2010 +0200 + + Correct color stops comparison function + + Two clear stops with different "underlying" colors must be considered + different, since when interpolated with non-clear colors they will + produce different results. + + src/cairo-color.c | 25 ++++--------------------- + 1 file changed, 4 insertions(+), 21 deletions(-) + +commit f71a618bd2604c8f0beaf4816a38a54f6f271bd9 +Author: Andrea Canciani +Date: Sat Aug 7 21:32:09 2010 +0200 + + Fix configuration if gobject is absent + + Autodetect gobject and only use it if present. + Its absence is not to be considered a failure since it's not required. + + build/Makefile.win32.features | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 661f4859cdbc0394ed0a9db34ced0f4e2bbe78ff +Author: Benjamin Otte +Date: Sat Aug 7 20:05:42 2010 +0200 + + Add cairo-gobject library + + This library is supposed to contain GType declarations for Cairo types. + It is also meant to support gobject-introspection binding creation. + + boilerplate/Makefile.win32.features | 12 + + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 + + configure.ac | 10 + + src/Makefile.win32.features | 16 + + util/Makefile.am | 4 + + util/cairo-gobject/Makefile.am | 15 + + util/cairo-gobject/cairo-gobject-enums.c | 519 +++++++++++++++++++++++++++++ + util/cairo-gobject/cairo-gobject-structs.c | 87 +++++ + util/cairo-gobject/cairo-gobject.h | 186 +++++++++++ + 10 files changed, 853 insertions(+) + +commit fc4e8f036326da1839ec5320eba60823e7efc2db +Author: Søren Sandmann Pedersen +Date: Sat Aug 7 12:10:49 2010 -0400 + + Update documentation to reflect that rgb565 is no longer deprecated. + + src/cairo.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit de606af5d673df193fc07fbd047ba2cec82d2f1c +Author: Andrea Canciani +Date: Tue Jul 27 18:04:36 2010 +0200 + + quartz: improve backend detection + + Quartz previously crashed with NULL backends and didn't check for + the backend type when getting a CGContext from a quartz surface, + returning meaningless data for subsurfaces. + + src/cairo-quartz-surface.c | 24 +++++++++++++++--------- + 1 file changed, 15 insertions(+), 9 deletions(-) + +commit 056ce165c4377e9cf93fd7a06b6b0d5d4d98cb8c +Author: Andrea Canciani +Date: Tue Jul 27 18:50:55 2010 +0200 + + quartz: fix solid masking fallback + + Falling back when painting would ignore the alpha value (which is + needed to have the correct mask opacity). + _cairo_quartz_surface_paint_cg doesn't fallback, so the usual mask + fallback path is now taken, as expected. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bdeade14ea86fb5f3ff17accd71711d2c40b1b33 +Author: Andrea Canciani +Date: Wed Jul 28 19:33:53 2010 +0200 + + quartz: fix stroking with unbounded operators + + Self-intersecting strokes were drawn incorrectly when an unbounded + operator was used, since the fixup operation also cleared the + intersection. + + Fixes clip-stroke-unbounded. + + src/cairo-quartz-surface.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 8f38d2aa29bc0d69690cbf542c4a2b497b7a0c0a +Author: Andrea Canciani +Date: Thu Jul 29 10:45:59 2010 +0200 + + test: improve clip-*-unbounded tests + + Merge clip-*-unbounded tests and add self-intersections to the paths + that are drawn. This exposes a bug in the unbounded fixup code in quartz. + + Signed-off-by: Chris Wilson + + test/Makefile.am | 35 ++-- + test/Makefile.sources | 3 +- + test/clip-draw-unbounded.c | 184 +++++++++++++++++++++ + test/clip-fill-eo-unbounded.argb32.ref.png | Bin 0 -> 3668 bytes + test/clip-fill-eo-unbounded.image16.rgb24.ref.png | Bin 0 -> 2887 bytes + test/clip-fill-eo-unbounded.quartz.argb32.ref.png | Bin 0 -> 3366 bytes + test/clip-fill-eo-unbounded.quartz.rgb24.ref.png | Bin 0 -> 3061 bytes + test/clip-fill-eo-unbounded.rgb24.ref.png | Bin 0 -> 3201 bytes + test/clip-fill-eo-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3636 bytes + ...p-fill-eo-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3208 bytes + test/clip-fill-eo-unbounded.xlib.argb32.ref.png | Bin 0 -> 3693 bytes + test/clip-fill-eo-unbounded.xlib.rgb24.ref.png | Bin 0 -> 3198 bytes + test/clip-fill-nz-unbounded.argb32.ref.png | Bin 0 -> 3668 bytes + test/clip-fill-nz-unbounded.image16.rgb24.ref.png | Bin 0 -> 2887 bytes + test/clip-fill-nz-unbounded.quartz.argb32.ref.png | Bin 0 -> 3366 bytes + test/clip-fill-nz-unbounded.quartz.rgb24.ref.png | Bin 0 -> 3061 bytes + test/clip-fill-nz-unbounded.rgb24.ref.png | Bin 0 -> 3201 bytes + test/clip-fill-nz-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3636 bytes + ...p-fill-nz-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3208 bytes + test/clip-fill-nz-unbounded.xlib.argb32.ref.png | Bin 0 -> 3693 bytes + test/clip-fill-nz-unbounded.xlib.rgb24.ref.png | Bin 0 -> 3198 bytes + test/clip-fill-unbounded.argb32.ref.png | Bin 1607 -> 0 bytes + test/clip-fill-unbounded.c | 105 ------------ + test/clip-fill-unbounded.image16.ref.png | Bin 1204 -> 0 bytes + test/clip-fill-unbounded.pdf.argb32.ref.png | Bin 1244 -> 0 bytes + test/clip-fill-unbounded.ps.argb32.xfail.png | Bin 1244 -> 0 bytes + test/clip-fill-unbounded.quartz.argb32.ref.png | Bin 1436 -> 0 bytes + test/clip-fill-unbounded.quartz.rgb24.ref.png | Bin 1368 -> 0 bytes + test/clip-fill-unbounded.rgb24.ref.png | Bin 1304 -> 0 bytes + test/clip-fill-unbounded.svg12.argb32.xfail.png | Bin 1601 -> 0 bytes + test/clip-fill-unbounded.svg12.rgb24.xfail.png | Bin 1601 -> 0 bytes + ...clip-fill-unbounded.xlib-fallback.rgb24.ref.png | Bin 1438 -> 0 bytes + test/clip-fill-unbounded.xlib.argb32.ref.png | Bin 1759 -> 0 bytes + test/clip-fill-unbounded.xlib.rgb24.ref.png | Bin 1430 -> 0 bytes + test/clip-stroke-unbounded.argb32.ref.png | Bin 1694 -> 3545 bytes + test/clip-stroke-unbounded.c | 102 ------------ + test/clip-stroke-unbounded.image16.ref.png | Bin 1255 -> 0 bytes + test/clip-stroke-unbounded.image16.rgb24.ref.png | Bin 0 -> 2778 bytes + test/clip-stroke-unbounded.pdf.argb32.xfail.png | Bin 1351 -> 0 bytes + test/clip-stroke-unbounded.ps.argb32.ref.png | Bin 1351 -> 0 bytes + test/clip-stroke-unbounded.quartz.argb32.ref.png | Bin 1493 -> 3362 bytes + test/clip-stroke-unbounded.quartz.rgb24.ref.png | Bin 1356 -> 3061 bytes + test/clip-stroke-unbounded.rgb24.ref.png | Bin 1372 -> 3063 bytes + test/clip-stroke-unbounded.svg12.argb32.xfail.png | Bin 1697 -> 0 bytes + test/clip-stroke-unbounded.svg12.rgb24.xfail.png | Bin 1697 -> 3569 bytes + ...ip-stroke-unbounded.xlib-fallback.rgb24.ref.png | Bin 1437 -> 3123 bytes + test/clip-stroke-unbounded.xlib.argb32.ref.png | Bin 1785 -> 3620 bytes + test/clip-stroke-unbounded.xlib.rgb24.ref.png | Bin 1442 -> 3109 bytes + 48 files changed, 204 insertions(+), 225 deletions(-) + +commit 142df6f9638e10d0712e092d902f7670965a88f9 +Author: Benjamin Otte +Date: Fri Jul 30 22:04:44 2010 +0200 + + configure: Disable xml backend by default + + We don't want to enable it by default when nobody uses it. + + boilerplate/Makefile.win32.features | 2 +- + build/Makefile.win32.features | 2 +- + configure.ac | 2 +- + src/Makefile.win32.features | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 9f33f8453b4949cfdc63169d3acd7238f89379c2 +Author: Benjamin Otte +Date: Fri Jul 30 21:48:14 2010 +0200 + + configure: Disable tee backend by default + + We don't want to enable it by default when nobody uses it. + + boilerplate/Makefile.win32.features | 4 +++- + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 2 ++ + configure.ac | 2 +- + src/Makefile.win32.features | 8 +++++++- + src/cairo-surface.c | 4 ++++ + test/api-special-cases.c | 6 ++++++ + 7 files changed, 24 insertions(+), 3 deletions(-) + +commit 9f4d677e2a6dd0bfbbbe20de39f92177bfdfc0e8 +Author: Benjamin Otte +Date: Fri Jul 30 22:15:55 2010 +0200 + + tee: Move definitions into separate header + + src/Makefile.sources | 6 +++-- + src/cairo-tee-surface.c | 2 ++ + src/cairo-tee.h | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 17 ------------- + test/api-special-cases.c | 3 +++ + 5 files changed, 75 insertions(+), 19 deletions(-) + +commit 14639e6b8525ada2cb93abb1d70dde827b7bf9e0 +Author: Kristian Høgsberg +Date: Thu Jun 17 18:29:48 2010 -0400 + + egl: Use EGL_KHR_surfaceless_opengl extension when available + + This lets us avoid creating a throwaway pbuffer just to make the + context current. + + src/cairo-egl-context.c | 58 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 38 insertions(+), 20 deletions(-) + +commit b6fd673d37e1c8962d15c0e0e59322a2002fc399 +Author: Chris Wilson +Date: Mon Jul 26 13:15:38 2010 +0100 + + version: 1.9.15 post-snapshot bump + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed8c6f42540f03a62fd64ad83b7c397528092232 +Author: Chris Wilson +Date: Mon Jul 26 12:53:44 2010 +0100 + + version: 1.9.14 snapshot + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 81094cf4622302ebaa9b3f328f5d2a56a1c07a64 +Author: Chris Wilson +Date: Mon Jul 26 12:52:56 2010 +0100 + + NEWS: 1.9.14 + + NEWS | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit c1fcbd0322f86327ddd89c2eef2facbc74045629 +Author: Andrea Canciani +Date: Mon Jul 26 11:21:48 2010 +0200 + + quartz: fix REFLECT radial gradients + + The interpolation range of repeating radial gradients can safely be + reflected around any integer (previously 0), but for reflect-extended + radial gradients can only be reflected around odd integers if the + appearance is to be the same, thus reflecting around 1 is correct for both. + + Fixes radial-gradient. + + src/cairo-quartz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3898e46d1de19848efeddb442dcf7f7663530256 +Author: Chris Wilson +Date: Fri Jul 23 09:41:48 2010 +0100 + + image: Compensate mask origins for glyph clipping + + Fixes the regression in bitmap-font and large-font pointed out by Andrea + Canciani since ef067933. + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53fcfc781eeee949abc03cf90048a2228f7e0a63 +Author: M Joonas Pihlaja +Date: Wed Jul 21 22:39:40 2010 +0300 + + build: Typos in comments. + + Fix inline "dnl" strings left over from a string + substitution "--" -> "dnl". + + build/configure.ac.pthread | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fd1e731c9d0af307ebde4d888866c95bd6ebe66d +Author: Hib Eris +Date: Wed Jul 21 22:34:05 2010 +0300 + + build: Fix pthread detection code when there isn't one. + + The code was testing the output variable $use_pthread rather than + the input variable $enable_pthread when checking that pthreads + were actually found when requested. + + build/configure.ac.pthread | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 108b1c7825116ed3f93aa57384bbd3290cdc9181 +Author: Karl Tomlinson +Date: Sat Jul 17 13:08:53 2010 +1200 + + clip: consider gstate target extents in _cairo_gstate_copy_clip_rectangle_list + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29125 + + To be consistent with _cairo_gstate_clip_extents, the context's clip + should be intersected with the target surface extents (instead of only + using them when there is no clip). + + Reviewed-by: Chris Wilson + + src/cairo-clip.c | 72 ++++++++++++++++++++---------------------------------- + src/cairo-gstate.c | 14 ++++++++++- + test/get-clip.c | 16 ++++++++++++ + 3 files changed, 55 insertions(+), 47 deletions(-) + +commit b79ea8a6cab8bd28aebecf6e1e8229d5ac017264 +Author: Karl Tomlinson +Date: Sat Jul 17 11:46:25 2010 +1200 + + clip: consider all_clipped in _cairo_clip_get_extents + + If the gstate clip in _cairo_gstate_int_clip_extents() has all_clipped + set (and path NULL), then it returns the gstate target extents instead of + an empty rectangle. If the target is infinite, then it says the clip is + unbounded. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29124 + Tested-by test/get-clip + + Reviewed-by: Chris Wilson + + src/cairo-clip.c | 5 +++++ + test/get-clip.c | 5 ++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 6a5115901381fe9c81a8a311e267c2a00e2a1d04 +Author: Karl Tomlinson +Date: Sat Jul 17 10:47:42 2010 +1200 + + test: return CAIRO_TEST_FAILURE from get-clip preamble on failure + + https://bugs.freedesktop.org/show_bug.cgi?id=29120 + + test/get-clip.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit f2fa15680ec3ac95cb68d4957557f06561a7dc55 +Author: Karl Tomlinson +Date: Sat Jul 17 10:39:50 2010 +1200 + + clip: return empty clip from _cairo_clip_copy_rectangle_list when all_clipped + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=29122 + Tested by test/get-clip + + Reviewed-by: Chris Wilson + + src/cairo-clip.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 33ac2035876aeb9215ca0bdaaeea5265fcee61f8 +Author: Karl Tomlinson +Date: Sat Jul 17 10:13:22 2010 +1200 + + test: use the surface size expected in get-clip phase "No clip set" + + https://bugs.freedesktop.org/show_bug.cgi?id=29121 + + test/get-clip.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit bac5c28a18af5d43c96f0b64d1c7235da3f02779 +Author: Chris Wilson +Date: Sat Jul 17 10:09:14 2010 +0100 + + boilerplate: Offset the xlib window + + An idea courtesy of Benjamin Otte is to stress the drivers a bit more by + not rendering to 0,0. Under various circumstances rendering to a Window + is mapped onto the Screen root Window with a collection of offsets and + clips by X. It is easy for the driver to make a mistake and misrender... + + boilerplate/cairo-boilerplate-xlib.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 51b0c21f02a8f0f5d7f44da05e49d7f8f3bf8bc7 +Author: Benjamin Otte +Date: Fri Jul 16 19:49:53 2010 +0200 + + build: Add explicit dependcy to cxx lib + + Otherwise the build will fail because it doesn't add the dependency + manually. + + https://bugs.freedesktop.org/show_bug.cgi?id=29114 + + boilerplate/Makefile.am | 3 +++ + src/Makefile.am | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 6b92d5a0f9fce28f99b07177454da00f984fdb43 +Author: Oleg Romashin +Date: Fri Jul 16 09:47:23 2010 +0100 + + qt: Use native glyph rendering. + + Remove the hack of using the xlib surface to do glyph rendering and use + the new interface introduced with Qt4.7, or else fallback to image + rendering with freetype. + + Reviewed-by: Chris Wilson + [2 files changed, 35 insertions(+), 140 deletions(-) \o/] + + src/cairo-qt-surface.cpp | 169 ++++++++++------------------------------------- + src/cairo-xlib-surface.c | 6 -- + 2 files changed, 35 insertions(+), 140 deletions(-) + +commit f53f072a223c3fbdeba315f5cba755cba498e121 +Author: Chris Wilson +Date: Mon Jul 12 18:53:29 2010 +0100 + + clip: Do the NULL check before the dereference. + + Breakage introduced in the commit earlier today. + + src/cairo-clip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ef0679333da881bd83b0bb4db546ea9c68f81f89 +Author: Chris Wilson +Date: Mon Jul 12 16:07:27 2010 +0100 + + image: Manually clip against bounds when rendering directly + + This is path is slightly peculiar in that it explicitly avoid the + intermediate mask and the geometry is not pre-clipped. + + This in conjunction with the previous commit fixes: + + Clip doesn't work for text + https://bugs.freedesktop.org/show_bug.cgi?id=29008 + + which is captured in test/partial-clip-text. + + src/cairo-image-surface.c | 23 +++++++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +commit 679e5a600bd7dae6cbde83070fb1f7355f8025a7 +Author: Chris Wilson +Date: Mon Jul 12 16:06:32 2010 +0100 + + Differentiate between reducing clip to composite extents and a rectangle + + This is required for handling glyphs when rendering directly to the + surface. + + src/cairo-clip-private.h | 4 ++++ + src/cairo-clip.c | 22 +++++++++++++++------- + src/cairo-gl-surface.c | 4 ++-- + src/cairo-image-surface.c | 10 +++++----- + src/cairo-surface-fallback.c | 10 +++++----- + src/cairo-xcb-surface-render.c | 10 +++++----- + src/drm/cairo-drm-i915-glyphs.c | 2 +- + src/drm/cairo-drm-i915-surface.c | 8 ++++---- + src/drm/cairo-drm-i965-glyphs.c | 2 +- + src/drm/cairo-drm-i965-surface.c | 8 ++++---- + 10 files changed, 46 insertions(+), 34 deletions(-) + +commit 8546a877889bfafc056c867bc9aea25e9fdcdef0 +Author: Chris Wilson +Date: Mon Jul 12 16:27:29 2010 +0100 + + test: Add partial-clip-text + + This exercises a bug found by Igor Nikitin: + + https://bugs.freedesktop.org/show_bug.cgi?id=29008 + + test/Makefile.am | 3 +++ + test/Makefile.sources | 1 + + test/partial-clip-text.c | 50 +++++++++++++++++++++++++++++++++++++ + test/partial-clip-text.ps.ref.png | Bin 0 -> 107 bytes + test/partial-clip-text.ref.png | Bin 0 -> 175 bytes + test/partial-clip-text.svg.ref.png | Bin 0 -> 173 bytes + 6 files changed, 54 insertions(+) + +commit 53ee897449dca497d6a3d6dc90b87fea8027cc44 +Author: Chris Wilson +Date: Mon Jul 12 12:37:31 2010 +0100 + + version: Post-snapshot bump to 1.9.13 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa4cd8287f47b4538e765e1b48dcbac19813a8a2 +Author: Chris Wilson +Date: Mon Jul 12 12:12:12 2010 +0100 + + version: 1.9.12 snapshot + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53b129dd8aecf4e2bd8b7d2cd27b91370c6705e9 +Author: Chris Wilson +Date: Mon Jul 12 12:11:42 2010 +0100 + + NEWS for 1.9.12. + + NEWS | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 56 insertions(+) + +commit 01380f3a56b28a388d2876780f33516ecd16ee16 +Author: Chris Wilson +Date: Mon Jul 12 11:49:53 2010 +0100 + + test: Missing REFERENCE_IMAGES + + test/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit 459b8ae660eb49a87ffb9da31f305718a2b4f11f +Author: Chris Wilson +Date: Mon Jul 12 11:05:57 2010 +0100 + + Make distcheck happy. + + src/cairo-fontconfig-private.h | 2 ++ + src/cairo-skia.h | 2 +- + src/glew/GL/glew.h | 2 ++ + src/glew/GL/glxew.h | 2 ++ + test/api-special-cases.c | 5 +++-- + 5 files changed, 10 insertions(+), 3 deletions(-) + +commit d56b1718025f8b2354b5b1eb99af41df70a6c590 +Author: Andrea Canciani +Date: Mon Jul 12 10:36:24 2010 +0200 + + test: Add halo quartz reference images + + When quartz-font is enabled, halo and halo-transform fonts have a + different shape. + + test/halo-transform.quartz.ref.png | Bin 0 -> 14360 bytes + test/halo.quartz.ref.png | Bin 0 -> 8601 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 9107895789fc721ee6ea2ccb2ce3ab99fb978caa +Author: M Joonas Pihlaja +Date: Mon Jul 12 11:03:15 2010 +0300 + + test: Add comments explaining the bug in bug-seams. + + Where two rasterization methods meet, havoc occurs. + + test/bug-seams.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit 0152db263b9b12547fadb5d080913fcbb696d34e +Author: M Joonas Pihlaja +Date: Mon Jul 12 10:36:00 2010 +0300 + + build: Sync up autogenerated win32 build files. + + boilerplate/Makefile.win32.features | 9 +++++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + src/Makefile.win32.features | 9 +++++++++ + 4 files changed, 22 insertions(+) + +commit 06ffb7df716652baba96960cd59e1a59f4bd1ac1 +Author: Eric Anholt +Date: Sat Jul 10 14:19:50 2010 -0700 + + gl: Only use a mat3 for the transformation for gradients coordinates. + + No point in passing in a column of zeroes that we multiply by zero, or + the row that we drop on the floor. We could do even better by just + passing in a 3x2, at the expense of adding a language version + dependency (or just pass in 2 vectors). + + No significant performance difference. + + src/cairo-gl-shaders.c | 28 +++++++++++++--------------- + 1 file changed, 13 insertions(+), 15 deletions(-) + +commit 1e7485f8e5b6fd9b26f06838d8e7a35e073c394b +Author: M Joonas Pihlaja +Date: Mon Jul 12 00:23:11 2010 +0300 + + trace: Avoid stdbool.h C99ism. + + There is no on old Solaris without invoking + c99 mode explicitly. + + util/cairo-trace/trace.c | 184 ++++++++++++++++++++++++----------------------- + 1 file changed, 94 insertions(+), 90 deletions(-) + +commit 97529a3713d899468fb3ca7a1c3f75a09bd1b215 +Author: M Joonas Pihlaja +Date: Sun Jul 11 23:54:21 2010 +0300 + + build: Avoid shifting shell parameters that aren't there. + + The shift primitive of the Solaris 9 Bourne shell doesn't like + it if we try to shift more formal arguments than are there. + This causes the compare_versions function in autogen.sh to croak when + the actual and compared versions differ in the number of + components. + + autogen.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit dd6026b613aa5414a128727995f2a4f79284072a +Author: Benjamin Otte +Date: Sun Jul 11 20:44:40 2010 +0200 + + doc: Make the necessity of flush/mark_dirty more obvious + + src/cairo-surface.c | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +commit 8a1944f45b9c9056088246d4f2e72d60a59fd5c4 +Author: Benjamin Otte +Date: Sun Jul 11 19:11:15 2010 +0200 + + check: Allow unprefix type names in the title + + Some documentation sections use the type name as the title, and we don't + want to use that title as a link. + + src/check-doc-syntax.sh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit f0466ecf7db859a80b779b7fb4381e3c9409c39b +Author: M Joonas Pihlaja +Date: Sun Jul 11 21:57:40 2010 +0300 + + build: Fix typo in pthread test program. + + Missing a semicolon after pthread_cleanup_push. Incredibly + only openbsd 4.5 minded. + + build/configure.ac.pthread | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f1d7de8e1620ad385930477b63454107dd8ffd3 +Author: M Joonas Pihlaja +Date: Sun Jul 11 17:29:07 2010 +0300 + + build: Fix regression provoked by newer autoconf and dodgy configuring. + + We're not supposed to be redefining PACKAGE_VERSION, PACKAGE_... + from the configure generated confdefs.h. This patch rudely adds + paper over the problem. The compiler warnings are a problem for + us since our checking of various compiler flags assumes that + no news is good news, and that any warning messages are due + to the flags under test. The regression appears when using + an autoconf >= 2.64, at least, but not with 2.61. + + The same issue appears in the pthread test because our conftest + unconditionally #defines _GNU_SOURCE, but autoconf ends up doing + that in the confdefs.h. + + build/configure.ac.noversion | 13 ++++++++++++- + build/configure.ac.pthread | 2 ++ + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit fca8977219b857e2e61dd86ac39ae9f40086f306 +Author: M Joonas Pihlaja +Date: Sun Jun 27 03:03:17 2010 +0300 + + build: Rework pthread detection. + + Use two levels of pthread support: a minimal level used to + build cairo itself, and a full level to build threaded apps + which want to use cairo. The minimal level tries to use + pthread stubs from libc if possible, but falls back to the + full level if that's not possible. We use CFLAGS=-D_REENTRANT + LIBS=-lpthread to find a real pthread library since that seems + to work on every unix-like test box we can get our hands on. + + build/ax-pthread.m4 | 283 ------------------------------------------ + build/configure.ac.pthread | 251 +++++++++++++++++++++++++++++++++++++ + configure.ac | 47 +++---- + test/Makefile.am | 16 +-- + test/cairo-test-trace.c | 10 +- + test/cairo-test.c | 6 +- + util/cairo-sphinx/Makefile.am | 3 +- + util/cairo-sphinx/sphinx.c | 4 + + util/cairo-trace/Makefile.am | 4 +- + 9 files changed, 291 insertions(+), 333 deletions(-) + +commit 47c35e5e86a3c99fc39afe2e13a7c92d5247ee1e +Author: M Joonas Pihlaja +Date: Sun Jun 27 01:14:03 2010 +0300 + + build: Purge CAIRO_CC_TRY_LINK_FLAG. + + Use CAIRO_CC_TRY_FLAG instead in the one place where we used + CAIRO_CC_TRY_LINK_FLAG and make the build system one macro + smaller. + + build/aclocal.cairo.m4 | 21 --------------------- + build/configure.ac.warnings | 2 +- + 2 files changed, 1 insertion(+), 22 deletions(-) + +commit d2f5592e0e0d316cfc40ec676ee6e7f4e2a699fb +Author: M Joonas Pihlaja +Date: Sun Jun 27 01:11:13 2010 +0300 + + build: Factor out a more pliable CAIRO_CC_TRY_LINK_WITH_ENV_SILENT. + + Introduce a new CAIRO_CC_TRY_LINK_WITH_ENV_SILENT macro for running + generic link tests with arbitrary CFLAGS/LIBS/LDFLAGS and no muttering + of autoconf messages. Rewrite the previous CAIRO_CC_TRY_FLAG in terms + of it. + + build/aclocal.cairo.m4 | 31 +++++++++++++++++++++++++------ + 1 file changed, 25 insertions(+), 6 deletions(-) + +commit 120b78ada7eed6424f07a688854657d0c3ad68f8 +Author: Benjamin Otte +Date: Sun Jul 11 18:48:38 2010 +0200 + + build: Split boilerplate lib generation into two so's + + Same thing as what was previously done for libcairo.so: Build an + intermediate lib for the (potential) C++ stuff. + + boilerplate/Makefile.am | 31 ++++++++++++++++++++++++------- + boilerplate/Makefile.sources | 7 ++----- + 2 files changed, 26 insertions(+), 12 deletions(-) + +commit d6362a0d76753cb6f85f0dbd567a3ec7b7b08696 +Author: Benjamin Otte +Date: Sun Jul 11 16:01:44 2010 +0200 + + qt: Define cairo-qt's API as C symbols + + That way, the C linker doesn't mess up when linking libcairo.so. + + src/cairo-qt.h | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 5d4a4775c8b091b947b52cc8f7e1e48a5eaea007 +Author: Benjamin Otte +Date: Sun Jul 11 15:41:56 2010 +0200 + + build: Fix typo that makes C++ libs not build + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b9952ab4f64a476bbadfd3e6cf1e66c1137ccd7 +Author: Chris Wilson +Date: Sat Jul 10 11:13:07 2010 +0100 + + Convert mime data length to use unsigned long + + What we want to use is size_t, but we don't want the implied POSIX + dependency. However, POSIX does say that size_t is an unsigned integer + that is no longer than a long, so it would appear safe to use an + unsigned long as a replacement. Safer at least than unsigned int. + + src/cairo-image-info-private.h | 6 +++--- + src/cairo-image-info.c | 4 ++-- + src/cairo-output-stream-private.h | 2 +- + src/cairo-output-stream.c | 2 +- + src/cairo-pdf-surface.c | 18 +++++++++--------- + src/cairo-png.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-script-surface.c | 6 +++--- + src/cairo-surface.c | 4 ++-- + src/cairo-svg-surface.c | 6 +++--- + src/cairo-types-private.h | 2 +- + src/cairo-win32-printing-surface.c | 10 +++++----- + src/cairo.h | 4 ++-- + util/cairo-trace/trace.c | 6 +++--- + 14 files changed, 37 insertions(+), 37 deletions(-) + +commit eb85ab998b606144daf025285968a5d6031b9aa6 +Author: Chris Wilson +Date: Sat Jul 10 10:43:40 2010 +0100 + + subsurface: Don't assume we ever own the target. + + Andrea pointed out that snapshots can be shared, and so the subsurface + should not be calling finish even on a snapshot. + + src/cairo-surface-subsurface-private.h | 1 - + src/cairo-surface-subsurface.c | 17 ++++++++--------- + 2 files changed, 8 insertions(+), 10 deletions(-) + +commit 59c83117d77f58e9cb64aaa6b572fab62fb31c6b +Author: Benjamin Otte +Date: Fri Jul 9 18:55:11 2010 +0200 + + build: Commit new versions of autogenerate Windows build files + + The recent commits to the build system changed a bunch of stuff in + there, so update the files. + + boilerplate/Makefile.win32.features | 92 +++++++++++++++++++++++++++++++++---- + build/Makefile.win32.features-h | 1 - + src/Makefile.win32.features | 92 +++++++++++++++++++++++++++++++++---- + 3 files changed, 164 insertions(+), 21 deletions(-) + +commit bf117e4ea7c89dadcb5a358bb47c0f213cc67461 +Author: Benjamin Otte +Date: Fri Jul 9 18:43:38 2010 +0200 + + build: fix glew include + + Currently wether internal glew is built is dependant on wether the + tarball in use was built with internal glew or not. And that's not how + it should be. + + configure.ac | 8 ++++---- + src/Makefile.sources | 11 +++++++---- + 2 files changed, 11 insertions(+), 8 deletions(-) + +commit 0bd704bd1e92b274209aeda6de88c7e75ffa81be +Author: Benjamin Otte +Date: Fri Jul 9 17:15:02 2010 +0200 + + build: Remove wrong flags from libcairo_cxx.la + + They're useful for the final so, but not for an intermediate noinst lib. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit faceffd5beb4297299175945660522d8f1f5f2cb +Author: Benjamin Otte +Date: Fri Jul 9 16:58:18 2010 +0200 + + build: copy/paste failure: Don't build libcxx.la + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dbb386d3c0aa9e7534d333cf3dbcfc2aaeac05d3 +Author: Benjamin Otte +Date: Fri Jul 9 12:49:10 2010 +0200 + + gl: Use unsigned int instead of GLuint + + GLuint is not defined in cairo-gl.h. If unsigned int is not compatible + enough to GLuint, we might consider to use #include instead. + + src/cairo-gl-surface.c | 2 +- + src/cairo-gl.h | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit f7fc8569a797356d5e93ad67aae4eca31e6835cd +Author: Benjamin Otte +Date: Fri Jul 9 12:29:35 2010 +0200 + + build: Fix C++ issues with automake + + This is an attempt to fix the broken situation we've been in where + automake links libcairo.la with c++ because it might potentially maybe + include C++ files. + + Those potential files only exist in Chris' throwaway backends (skia, qt) + and the BeOS backend, so for 99.99% of cases, these backends are not + needed and linking with c++ is overkill. Also, no one wants to have + libcairo.so link to libstdc++. + + This patch fixes that in mutliple steps: + 1) Add build infrastructure to distinguish between C and C++ backends. + This is done by allowing to specify backend_sources as well as + backend_cxx_sources variables in Makefile.sources. + 2) Optionally build a libcairo_cxx.la noinst library + This intermediate library is built for C++ backends only and therefor + linked using c++. It is then linked into the final libcairo.la. This + does not require c++, so the linking of libcairo.la is done with cc. + + This also works around various weirdnesses that the current build system + exposes, where it assumes cisms when in fact using c++ semantics, like + not detecting c++ properly or: + https://bugzilla.redhat.com/show_bug.cgi?id=606523 + + build/configure.ac.features | 7 ++++++- + configure.ac | 10 ++++++++++ + src/Makefile.am | 20 +++++++++++++++++++- + src/Makefile.am.analysis | 4 ++-- + src/Makefile.sources | 6 +++--- + 5 files changed, 40 insertions(+), 7 deletions(-) + +commit df6d49f6eaf334d5a2de8bdd90919278071ab868 +Author: Benjamin Otte +Date: Fri Jul 9 10:29:30 2010 +0200 + + build: Get rid of $(foo_files) Makefile.am variables + + They're unused, and less variables make the build system easier to + understand. + + build/configure.ac.features | 1 - + src/Makefile.am | 1 - + 2 files changed, 2 deletions(-) + +commit ce530b2802683fe6c5289367ef03018f4081a2da +Author: Benjamin Otte +Date: Fri Jul 9 04:24:51 2010 +0200 + + doc: Add "@Since: 1.10" tags to device docs + + src/cairo-device.c | 14 ++++++++++++++ + src/cairo.h | 2 ++ + 2 files changed, 16 insertions(+) + +commit c1fed693020c96126cdc697ddd22567398369b04 +Author: Benjamin Otte +Date: Fri Jul 9 04:20:42 2010 +0200 + + gl: Remove double ** from some comments + + gtk-doc doesn't like that unless it's a real gtk-doc comment. + And it wasn't. + + src/cairo-gl-composite.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5c73b371ae31f230210987941eec2db49d2e02be +Author: Benjamin Otte +Date: Fri Jul 9 04:20:06 2010 +0200 + + doc: Document remaining cairo-device functions + + src/cairo-device.c | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +commit 9877c1932a44f7e5300d6fcd99c19748aa5a4828 +Author: Benjamin Otte +Date: Fri Jul 9 03:52:45 2010 +0200 + + doc: Add more documentation for devices + + Add general docs and document acquire/release. I'm not happy with the + documentation yet. In particular, I have 2 issues: + 1) The threading guarantees Cairo provides are missing. + 2) There's no docs on which Cairo functions do acquire devices. + + I guess I'll have to fix them later. + + src/cairo-device.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +commit 739d6e35fa5632b80b888d6475f2fdb6be6054a6 +Author: Benjamin Otte +Date: Fri Jul 9 03:04:27 2010 +0200 + + doc: Clarify that cairo_surface_get_device() can return NULL + + src/cairo-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 65d0590b041835fb466f4a7073910ef1383d9e77 +Author: Benjamin Otte +Date: Fri Jul 9 02:23:13 2010 +0200 + + doc: Copy docs for standard device APIs + + Copied from the surface equivalents + + src/cairo-device.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit 8a08b6fa5288f376688730c66ae9219d01180f42 +Author: Benjamin Otte +Date: Fri Jul 9 02:21:00 2010 +0200 + + doc: Remove the declarations + + This information was duplicated. It exists as the "@Title" of the + SECTION inline documentation already. + + doc/public/cairo-sections.txt | 28 ---------------------------- + 1 file changed, 28 deletions(-) + +commit 5e76bc6deb9fd4dc7a0f9181d3941ba55ce89c56 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jul 9 01:10:24 2010 +0200 + + doc: Add missing region documentation + + src/cairo-region.c | 25 +++++++++++++++++++++++++ + src/cairo.h | 13 +++++++++++++ + 2 files changed, 38 insertions(+) + +commit 57da730d286f643c8f68b445907f7cdd1f53e5de +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 23:44:35 2010 +0200 + + doc: Fix a syntax issue in quartz-font gtkdoc + + A missing empty line caused the long description to be part of + @See_Also. Ooops. + + src/cairo-quartz-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit fb03eba44f1ae7dd76dd3db82bfb55b06b0932ae +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 8 20:06:08 2010 +0200 + + test: Add quartz functions to api-special-cases test + + test/api-special-cases.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 59aab0bdc24838252850034cee36ed756f3c3e2a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 8 20:05:13 2010 +0200 + + test: fix typo + + test/api-special-cases.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b870cc030d8e0eb6309695e5a101c802f688cf40 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 13:05:18 2010 +0200 + + doc: Move tmpl/ docs to inline docs + + I did this manually so I could review the docs at the same time. + If anyone finds typos or other mistakes I did, please complain to me (or + better: fix them). + + doc/public/cairo-sections.txt | 4 +- + doc/public/tmpl/.gitignore | 3 - + doc/public/tmpl/cairo-atsui.sgml | 21 - + doc/public/tmpl/cairo-beos.sgml | 22 -- + doc/public/tmpl/cairo-font-face.sgml | 116 ------ + doc/public/tmpl/cairo-font-options.sgml | 199 ---------- + doc/public/tmpl/cairo-ft.sgml | 87 ----- + doc/public/tmpl/cairo-image.sgml | 127 ------ + doc/public/tmpl/cairo-matrix.sgml | 169 -------- + doc/public/tmpl/cairo-paths.sgml | 263 ------------- + doc/public/tmpl/cairo-pattern.sgml | 350 ----------------- + doc/public/tmpl/cairo-pdf.sgml | 101 ----- + doc/public/tmpl/cairo-png.sgml | 96 ----- + doc/public/tmpl/cairo-ps.sgml | 144 ------- + doc/public/tmpl/cairo-quartz-fonts.sgml | 52 --- + doc/public/tmpl/cairo-quartz.sgml | 64 --- + doc/public/tmpl/cairo-scaled-font.sgml | 227 ----------- + doc/public/tmpl/cairo-status.sgml | 98 ----- + doc/public/tmpl/cairo-surface.sgml | 326 --------------- + doc/public/tmpl/cairo-svg.sgml | 91 ----- + doc/public/tmpl/cairo-text.sgml | 319 --------------- + doc/public/tmpl/cairo-transforms.sgml | 132 ------- + doc/public/tmpl/cairo-types.sgml | 43 -- + doc/public/tmpl/cairo-user-fonts.sgml | 169 -------- + doc/public/tmpl/cairo-version.sgml | 205 ---------- + doc/public/tmpl/cairo-win32-fonts.sgml | 106 ----- + doc/public/tmpl/cairo-win32.sgml | 101 ----- + doc/public/tmpl/cairo-xcb-xrender.sgml | 26 -- + doc/public/tmpl/cairo-xcb.sgml | 26 -- + doc/public/tmpl/cairo-xlib-xrender.sgml | 60 --- + doc/public/tmpl/cairo-xlib.sgml | 147 ------- + doc/public/tmpl/cairo.sgml | 674 -------------------------------- + src/cairo-beos-surface.cpp | 10 + + src/cairo-font-face.c | 17 + + src/cairo-font-options.c | 12 + + src/cairo-ft-font.c | 25 ++ + src/cairo-image-surface.c | 21 + + src/cairo-matrix.c | 23 ++ + src/cairo-misc.c | 20 + + src/cairo-path.c | 9 + + src/cairo-pattern.c | 17 + + src/cairo-pdf-surface.c | 17 + + src/cairo-png.c | 18 + + src/cairo-ps-surface.c | 17 + + src/cairo-quartz-font.c | 17 + + src/cairo-quartz-surface.c | 17 + + src/cairo-scaled-font.c | 10 + + src/cairo-surface.c | 47 +++ + src/cairo-svg-surface.c | 17 + + src/cairo-types-private.h | 8 + + src/cairo-user-font.c | 22 ++ + src/cairo-version.c | 156 ++++++++ + src/cairo-win32-font.c | 17 + + src/cairo-win32-surface.c | 24 ++ + src/cairo-xcb-surface-render.c | 13 + + src/cairo-xcb-surface.c | 13 + + src/cairo-xlib-surface.c | 40 ++ + src/cairo.c | 57 +++ + 58 files changed, 666 insertions(+), 4566 deletions(-) + +commit 65a1e351330106ee0af9f6f0df06b82954341ee6 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 03:28:05 2010 +0200 + + doc: Remove CAIRO_FORMAT_RGB16_565 from hidden symbols list + + It's part of the cairo_format_t documentation now. + + doc/public/cairo-sections.txt | 1 - + 1 file changed, 1 deletion(-) + +commit e7594aebce6007bfa2027ba2655875db6c036e73 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 03:21:45 2010 +0200 + + doc: Fix some consistency issues that confuse gtk-doc + + src/cairo-region.c | 16 +++++++++++++--- + src/cairo.h | 16 ++++++++++++++-- + 2 files changed, 27 insertions(+), 5 deletions(-) + +commit da2663a0aa1e3f0a6b2f6ae2e9952ac27dec3f5d +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 03:14:42 2010 +0200 + + doc: Add list of new symbol in Cairo 1.10 + + doc/public/cairo-docs.xml | 3 +++ + 1 file changed, 3 insertions(+) + +commit a106aa86a3267b4886f7eabdc4b07bb394e11531 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 03:13:20 2010 +0200 + + doc: add --name-space option to gtkdoc-mkdb + + This sorts function names in new symbols lists way better. + + doc/public/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 71d17e4b1f1cb83bc605d72d8419d4bfb824c828 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 02:42:39 2010 +0200 + + drm: Fix Makefile for drm_xr + + Use cairo_drm_xr_sources/headers for the drm_xr stuff. This makes it + work correctly in gtk-doc instead of conditionally adding it to + cairo_drm_sources/headers. + + src/Makefile.sources | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 4b3e488cebeeace02eae1164ed12caa93d7c5847 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 02:42:06 2010 +0200 + + skia: Add cairo-skia.h as a public header + + src/Makefile.sources | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2a546286da5fe7203846d99a4a3d732c73e62db5 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 02:20:17 2010 +0200 + + doc: Add a section about regions + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 30 ++++++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+) + +commit ab1f6d1af7c0e47077013edd58e93fa9fc6f2b5c +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 01:41:27 2010 +0200 + + doc: Add missing surface APIs + + doc/public/cairo-sections.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 90bf273a38856d178e90721168b8b076f79fbf38 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 01:39:37 2010 +0200 + + doc: Add a section for cairo_device_t + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 18 ++++++++++++++++++ + 2 files changed, 19 insertions(+) + +commit 60e4f28d091df8ac6b898448eb52fae9ca920d5d +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 01:39:07 2010 +0200 + + doc: Add cairo_in_clip() to cairo_t section + + doc/public/cairo-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 6843186b729b20acddccd36184d2c5a7b5525d2e +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 01:38:43 2010 +0200 + + doc: Add cairo_rectangle_int_t to the general types list + + doc/public/cairo-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit c54dff82d3055529b7663dcff7a970cae919a9e0 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 01:33:42 2010 +0200 + + glew: The headers are private, not public + + src/Makefile.sources | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4252e3b8f915fc23611f1a667bf7bc1bb6a21dfd +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 01:32:25 2010 +0200 + + doc: Add drm and glew to the ignored directories + + This reduces the number of unused symbols to a reasonable size. ;) + + doc/public/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 729d00341c26d46d82359014df97472a469e49a4 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jul 8 13:57:43 2010 +0200 + + gl: Fix compile error after rebase failure + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 292423c73376a7f9b84c9e3e578c242f486e921b +Author: Colin Walters <walters@verbum.org> +Date: Wed Jul 7 15:46:33 2010 -0400 + + Support NOCONFIGURE environment variable + + This is taken from gnome-common; it can be convenient for builders + to separate the autogen from the configure stage. + + autogen.sh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 9e6c151af810886e94372ac8e4878915059c6c14 +Author: Kristian Høgsberg <krh@bitplanet.net> +Date: Thu Jun 17 18:19:39 2010 -0400 + + gl: Add new cairo-gl surface constructor to create surface for texture + + src/cairo-gl-private.h | 2 + + src/cairo-gl-surface.c | 111 +++++++++++++++++++++++++++++++++++++++++++------ + src/cairo-gl.h | 4 ++ + 3 files changed, 105 insertions(+), 12 deletions(-) + +commit 4c91bb9a221bc8e3d65a96365bbd1157b3f4e612 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jul 6 17:27:18 2010 +0200 + + region: Add cairo_region_xor() and cairo_region_xor_rectangle() + + gdk_region_xor() was a quite often used function in GDK and now that + GDKe uses cairo regions, it seems like a worthwhile addition to Cairo. + + src/cairo-region.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 6 ++++ + src/cairoint.h | 2 ++ + 3 files changed, 88 insertions(+) + +commit 82de6336d88be43de759b94634e87b9e4a8391b1 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jul 6 00:48:36 2010 +0200 + + test: Add note about how to fix failures to api-special-cases + + test/api-special-cases.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 75f269b14e1e4cdadd8c08566a07b2460ae3364b +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jul 6 00:41:12 2010 +0200 + + test: Add documentation to the api-special-cases test + + Hopefully people add other backend APIs to the testsuite. + + test/api-special-cases.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit 398870e64a18f32f1854cb19f64c34e2b1987140 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jul 6 00:21:38 2010 +0200 + + xlib: Setters should set finished surfaces into an error status + + Caught by api-special-cases test + + src/cairo-xlib-surface.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 6e562d1448eb70b7269f8f2f280719aa2aeb3ce7 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jul 6 00:20:57 2010 +0200 + + xcb: Setters should set finished surfaces into an error status + + Caught by api-special-cases test + + src/cairo-xcb-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit fa070704966f10e7264778a3ffb401054a68e8f7 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jul 6 00:20:36 2010 +0200 + + test: Add xcb and xlib functions to api-special-cases test + + test/api-special-cases.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 91 insertions(+) + +commit c4068fe9414bad663f77c030ac96fa4b4cba87ba +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 23:14:33 2010 +0200 + + test: Add ps, pdf and svg to the api-special-cases test + + test/api-special-cases.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 103 insertions(+) + +commit 3e008e8ab0a1c5254bd1d8a58c9e9a89846fe7ac +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 23:14:19 2010 +0200 + + svg: Set error when extracting from finished surface + + Caught by api-special-cases test + + src/cairo-svg-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 2e66cbaee2efc4a8eb2117f945d68e2816349cfe +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 23:10:12 2010 +0200 + + ps: Allow specifying if errors on extract_surface should be set + + Getters should not set errors on passed in input. So we don't. + + Caught by api-special-cases test + + src/cairo-ps-surface.c | 39 ++++++++++++++++++++++----------------- + 1 file changed, 22 insertions(+), 17 deletions(-) + +commit f5dfc3ce6eab3bf836f2d7f7cf72d2834c42d72f +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 23:08:08 2010 +0200 + + ps: Set error when extracting from finished surface + + Caught by api-special-cases test + + src/cairo-ps-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 106357f6e28467f6db02e8d69c4aea459aca781c +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 23:07:24 2010 +0200 + + pdf: Set error when extracting from finished surface + + Caught by api-special-cases test + + src/cairo-pdf-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 702aa19fdae8bd511c4374f580dde6503afd3341 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:50:44 2010 +0200 + + gl: Fail properly when called with finished functions + + Caught by api-special-cases test + + src/cairo-gl-surface.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit b87be76bdfcbd329c79a9f11b24d22010ad15dde +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:50:18 2010 +0200 + + test: Add gl functions to the tests + + test/api-special-cases.c | 39 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 38 insertions(+), 1 deletion(-) + +commit 448653e7b9938100c3f2e30e026fbc4d9de7d0d5 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:41:43 2010 +0200 + + Call _cairo_error() when setting the FINISHED error on surfaces + + src/cairo-surface-subsurface.c | 2 +- + src/cairo-surface.c | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 19da8e138d317c1770d8bbd21a49c657d954f126 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:40:54 2010 +0200 + + tee: Add proper error handling + + Caught by api-special-cases + + src/cairo-tee-surface.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit a9f30fc1f0c3e50715468b09707477973bf5268b +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:30:55 2010 +0200 + + test: Add recording and tee surface functions to api-special-cases + + test/api-special-cases.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 44 insertions(+) + +commit 41abc0ca37855751ed06051a30c0d866977ed2bd +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:19:05 2010 +0200 + + test: add PNG functions + + test/api-special-cases.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit 897eaa3e97f865ad2c28442c26efaf4ba391cf03 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:11:23 2010 +0200 + + test: Add a non-error surface check + + In that check, we call functions that require a specific surface type + with surfaces of a different type and check that they don't crash and + set the correct error. + + test/api-special-cases.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit 986ddf565215dc01065eade46921abe8a4b7912e +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 22:03:42 2010 +0200 + + test: add image surface functions to api-special-cases test + + test/api-special-cases.c | 90 +++++++++++++++++++++++++++++++++++------------- + 1 file changed, 66 insertions(+), 24 deletions(-) + +commit 72878d70ea75be03f47fa9d53f8305e76162054e +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 20:47:19 2010 +0200 + + test: Add a new test variant to api-special-cases test + + This variant tests a (hopefully) inert error surface. + + test/api-special-cases.c | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit 9de25a0297c141a0776835920168afaa3ca77a87 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 18:33:40 2010 +0200 + + configure: remove dolt + + libtool should be fast by now + + Makefile.am | 5 +- + build/aclocal.dolt.m4 | 178 -------------------------------------------------- + configure.ac | 1 - + 3 files changed, 2 insertions(+), 182 deletions(-) + +commit 6744b78de17930285569da2158a334763e2bd333 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 18:25:31 2010 +0200 + + subsurface: Fail if created from a finished surface + + Caught by api-special-cases test + + src/cairo-surface-subsurface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8fd1ecea12f15c2bda710065909a14415ba92bd8 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 18:25:16 2010 +0200 + + surface: Fail if set_mime_data() is called on a finished surface + + Caught by api-special-cases test + + src/cairo-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit e388ff1ae732970d6166780817ec121cf58ccd0e +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 18:24:23 2010 +0200 + + surface: Fail early if create_similar() is called on a finished surface + + Caught by api-special-cases test + + src/cairo-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit c1689ef6f27f99c36e1a5f4de658363ca0aad25a +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 18:23:37 2010 +0200 + + surface: don't call begin_modification on finished surfaces + + Fixes https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/600622 + + Caught by api-special-cases test + + src/cairo-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cf0245c1201d4884ff19e881e9c118784fa14884 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 18:17:09 2010 +0200 + + tests: Add a testcase that checks APIs work consistently + + In particular, it checks that finished and surfaces in an error state do + not do bad things, like cause crashes. + So far this test only checks surface APIs, but it should be extended to + cover all APIs. + + Please update this test when new APIs get added. + + Motivated by https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/600622 + + test/Makefile.sources | 1 + + test/api-special-cases.c | 360 +++++++++++++++++++++++++++++++++++++++++ + test/api-special-cases.ref.png | Bin 0 -> 95 bytes + 3 files changed, 361 insertions(+) + +commit eb63284fc3ae9377003ca312be58ae8f5dbbfdbd +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 00:37:10 2010 +0200 + + configure: Use automake silent rules + + This replaces shave usage. + If silent rules are not available, don't use them. + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 68bbb6b4a0a3b9bc923ccf130b1ca4221a5e54bd +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jul 5 00:35:39 2010 +0200 + + configure: remove shave + + build/.gitignore | 2 -- + build/aclocal.shave.m4 | 77 ----------------------------------------------- + build/shave-libtool.in | 69 ------------------------------------------ + build/shave.in | 82 -------------------------------------------------- + configure.ac | 4 --- + 5 files changed, 234 deletions(-) + +commit 9ce87c67ff64083ec48edfefe83a1df3756c364c +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jul 3 02:54:55 2010 +0200 + + perf: print comment describing backend + + Use the descibe string to output information about the backend we're + testing. + + perf/cairo-perf-trace.c | 31 ++++++++++++++++++++++++++++++- + 1 file changed, 30 insertions(+), 1 deletion(-) + +commit fcfe7c67248ea171dc40c0dbd861e489a2df5941 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jul 3 02:54:28 2010 +0200 + + boilerplate: Add describe string + + Print the pixman version we're using + + boilerplate/cairo-boilerplate.c | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit 0a7135148a634ea6692a4edd83193870a5d526b3 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jul 3 02:54:08 2010 +0200 + + gl: Add describe string + + boilerplate/cairo-boilerplate-glx.c | 29 +++++++++++++++++++++++++---- + 1 file changed, 25 insertions(+), 4 deletions(-) + +commit a1c4b001a548611b7d77e9280fdb5a82da275830 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 30 18:27:54 2010 +0200 + + boilerplate: Add a describe vfunc + + This function is supposed to describe the backend in use. The describe + function is optional - and therefore initialized as NULL everywhere. + Note: + It is well known that the xlib backend uses X. What is not known is what + version the server supports or what graphics card it is running on. That + is the information the describe vfunc is supposed to provide. + + boilerplate/Makefile.win32.features | 8 ++++++++ + boilerplate/cairo-boilerplate-directfb.c | 4 ++-- + boilerplate/cairo-boilerplate-drm.c | 2 ++ + boilerplate/cairo-boilerplate-egl.c | 1 + + boilerplate/cairo-boilerplate-glx.c | 4 ++++ + boilerplate/cairo-boilerplate-pdf.c | 4 ++-- + boilerplate/cairo-boilerplate-ps.c | 8 ++++---- + boilerplate/cairo-boilerplate-quartz.c | 5 +++-- + boilerplate/cairo-boilerplate-script.c | 2 +- + boilerplate/cairo-boilerplate-skia.c | 4 ++-- + boilerplate/cairo-boilerplate-svg.c | 8 ++++---- + boilerplate/cairo-boilerplate-test-surfaces.c | 16 ++++++++-------- + boilerplate/cairo-boilerplate-vg.c | 4 ++++ + boilerplate/cairo-boilerplate-wgl.c | 2 ++ + boilerplate/cairo-boilerplate-win32-printing.c | 4 ++-- + boilerplate/cairo-boilerplate-win32.c | 4 ++-- + boilerplate/cairo-boilerplate-xcb.c | 7 +++++++ + boilerplate/cairo-boilerplate-xlib.c | 4 ++++ + boilerplate/cairo-boilerplate.c | 10 +++++----- + boilerplate/cairo-boilerplate.h | 4 ++++ + build/Makefile.win32.features-h | 1 + + src/Makefile.win32.features | 8 ++++++++ + 22 files changed, 80 insertions(+), 34 deletions(-) + +commit 4c039b1cdfac5b5d6aa0c38f0779213fd14ec7de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 2 17:01:12 2010 +0100 + + user-font: Check the status before destroying the context + + src/cairo-user-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1f84f5682c6ff246b3d28c75c8731504f31c1ee1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 2 13:19:17 2010 +0100 + + xlib: Apply translation to image surface upload. + + Fixes: + + Bug 28888 - cairo_paint with rgb images does not work correctly + https://bugs.freedesktop.org/show_bug.cgi?id=28888 + + src/cairo-xlib-surface.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit d2d6c96c24501d888422ea42d3c90d3c8f3647a0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 29 09:58:54 2010 +0200 + + user-font: correct handling of size 0 text + + Text with size 0 has a singular scale matrix, thus requires special + handling to avoid invalidating the context where it is used. + + Fixes pthread-show-text and text-zero-len (they failed with assertion + when ran using the user font backend). + + src/cairo-matrix.c | 9 ++++++++ + src/cairo-scaled-font.c | 5 ++--- + src/cairo-user-font.c | 60 +++++++++++++++++++++++++++++-------------------- + src/cairoint.h | 3 +++ + 4 files changed, 50 insertions(+), 27 deletions(-) + +commit 6db247e13c6fa61879029b335c6fa649d810c11b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 29 09:28:04 2010 +0200 + + user-font: ignore translation in scale matrix + + Currently the translation component of the scaled_font scale matrix + is applied by gstate and only linear components should be applied in + font backends. + + Fixes font-matrix-translation (when using user-font as font backend). + + src/cairo-user-font.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 549431e98ed0be17b80f24f0e0c167c7ad632f4f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jun 28 22:40:28 2010 +0200 + + ft-font: fix typo + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 97a88c5adb08a3181bad1f63a7bbdfe5784b4207 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 28 17:10:59 2010 +0100 + + xlib: Compile without fontconfig + + Create a cairo-fontconfig-private.h where we can add the missing defines + in a common location rather than in the body of the code. + + src/Makefile.sources | 1 + + src/cairo-fontconfig-private.h | 76 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-ft-font.c | 5 +-- + src/cairo-surface-subsurface.c | 1 + + src/cairo-xlib-screen.c | 20 +---------- + 5 files changed, 80 insertions(+), 23 deletions(-) + +commit 7d6910014310344e5d16c97ffd1f1c9fbc01b143 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jun 28 17:12:41 2010 +0200 + + quartz: remove unused declarations + + src/cairo-quartz-surface.c | 17 ----------------- + 1 file changed, 17 deletions(-) + +commit bd4c14b94eeb386b30439929e8e54a5d9b5d5fca +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 24 23:20:41 2010 +0200 + + quartz: remove unused os version info + + It was previously used to activate a workaround for text transformation + whenrunning on some os versions. Now the workaround is not needed anymore. + + src/cairo-quartz-surface.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit aa7e9c43b6381930455a68258dcc3e14dce2b0e4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 24 14:18:02 2010 +0200 + + quartz-font: correct and explain matrix computations + + glyph_path was taking into account the translation (which currently + is already applied in gstate) and the sign of the elements of the + matrices was not explained. + + src/cairo-quartz-font.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit b26f72fef99e9869a62cbb8e44a82837f87cf2c6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 24 22:34:36 2010 +0200 + + quartz: check return status + + If the font backend is unable to tell the extents of the operation, + consider it unbound. + + src/cairo-quartz-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 9c0d761bfcdd28d52c83d74f46dd3c709ae0fa69 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 24 15:26:03 2010 +0200 + + quartz: improve text transform handling + + Use scale instead of manually compositing font_matrix and ctm and + composite it with the context ctm, so that no workaround for clipping + is needed anymore. + + src/cairo-quartz-surface.c | 46 ++++++++++++---------------------------------- + 1 file changed, 12 insertions(+), 34 deletions(-) + +commit 9068b5768b8560fbf095f1c0eecb5c805232f794 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 24 15:15:37 2010 +0200 + + quartz-font: silence compiler warnings + + Remove an unused function, explicitly ignore or check return values, + don't define unused variables. + + src/cairo-quartz-font.c | 84 ++++++++++++++++++------------------------------- + 1 file changed, 30 insertions(+), 54 deletions(-) + +commit ca161a585a7ce09cfcd468ea7591c5959077a907 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 26 14:50:57 2010 +0100 + + version: 1.9.9 + + Post-snapshot bump. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f1ff0daab7259ec16076f788760da4f35cb0cdc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 26 14:20:25 2010 +0100 + + test: Missing ref image. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 45d1f461ce2d2e3af16a5a90ffd8980bffc5eaa8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 26 14:17:23 2010 +0100 + + version: 1.9.10 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7a68a7bfd550b5e4b6635495e7de49fe306fbad4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 26 14:16:27 2010 +0100 + + NEWS for 1.9.10 snapshot + + NEWS | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit 8df41361196c7ba1b8d272507cc3d523cdcf5632 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 26 09:52:11 2010 +0100 + + Regenerate default win32 headers. + + boilerplate/Makefile.win32.features | 8 -------- + build/Makefile.win32.features-h | 1 - + src/Makefile.win32.features | 8 -------- + 3 files changed, 17 deletions(-) + +commit 1373675ef7602363aeca0d9ec12be79719ea066d +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 25 14:10:12 2010 +0200 + + pop-group: Translate existing path properly + + This fixes the reverse case of the push_group case fixed a few commits + ago. + + src/cairo.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 59076776674e3ae47099f20e1d86064fbd856008 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 25 14:08:49 2010 +0200 + + test: improve push-group-path-offset to also catch the pop_group() case + + cairo_pop_group() also trasnforms the path wrong, so we use cairo_fill() + to copy data instead of cairo_paint(). + + (Also, unbust the testcase.) + + test/push-group-path-offset.c | 45 +++++++++++++++---------------------------- + 1 file changed, 16 insertions(+), 29 deletions(-) + +commit 2e8571d95ca36f8ad9e20796990cdc0b3f763082 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 25 13:41:22 2010 +0200 + + push-group: Fix path translation when pushing a group with device offsets + + With the previous code, the parent's device offset wasn't undone before + applying the new device offset. + Tested by push-group-path-offset test. + + src/cairo.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit a9b8d1a94ea624ea8b12a125bdf70c6f248e7ca7 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 25 13:38:40 2010 +0200 + + test: Add a new test for a bug with device-offset tests + + All the credit for this one goes to make distcheck + + test/Makefile.sources | 1 + + test/push-group-path-offset.c | 90 ++++++++++++++++++++++++++++++++++++ + test/push-group-path-offset.ref.png | Bin 0 -> 186 bytes + 3 files changed, 91 insertions(+) + +commit 1099a3515b6a69e2ff360d8e6b1df71e3ea5c213 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 24 17:22:34 2010 +0100 + + drm/intel: Fix common off-by-one by rewriting the [XY]MAX macro. + + Many rectangles in the command stream are specified as inclusive rects, + i.e. the max values are (width-1, height-1), which is easy to neglect. + + src/drm/cairo-drm-i915-private.h | 2 +- + src/drm/cairo-drm-i915-surface.c | 24 ++++++------------------ + src/drm/cairo-drm-i965-shader.c | 12 ++++++------ + src/drm/cairo-drm-intel-command-private.h | 4 ++-- + 4 files changed, 15 insertions(+), 27 deletions(-) + +commit fb6a00571c818c738d66bc04dc75e79491878f78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 14 10:19:37 2010 +0100 + + drm: _cairo_color_get_content() compilation fixes + + src/drm/cairo-drm-i915-shader.c | 2 +- + src/drm/cairo-drm-i965-shader.c | 5 +---- + src/drm/cairo-drm-intel.c | 3 +-- + 3 files changed, 3 insertions(+), 7 deletions(-) + +commit 42956b46436b9704be7619e1b61ab222923376d0 +Author: Zoxc <zoxc32@gmail.com> +Date: Sun Jun 20 21:07:57 2010 +0000 + + build: Added cairo deflate stream as a requirement for the script surface. + + src/Makefile.sources | 3 +++ + 1 file changed, 3 insertions(+) + +commit b036a09972a19e63a85a4661a457525e2abe4026 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jun 24 14:59:18 2010 +0300 + + whitespace: Fixup formal arguments and tabs in boilerplate/ and perf/. + + Ran a script to align the formal parameters of functions and + collapse spaces to tabs in code. + + boilerplate/cairo-boilerplate-beos.cpp | 42 +++++----- + boilerplate/cairo-boilerplate-directfb.c | 86 ++++++++++----------- + boilerplate/cairo-boilerplate-drm.c | 2 +- + boilerplate/cairo-boilerplate-egl.c | 20 ++--- + boilerplate/cairo-boilerplate-getopt.c | 12 +-- + boilerplate/cairo-boilerplate-glx.c | 60 +++++++-------- + boilerplate/cairo-boilerplate-pdf.c | 24 +++--- + boilerplate/cairo-boilerplate-private.h | 2 +- + boilerplate/cairo-boilerplate-ps.c | 49 ++++++------ + boilerplate/cairo-boilerplate-qt.cpp | 18 ++--- + boilerplate/cairo-boilerplate-quartz.c | 18 ++--- + boilerplate/cairo-boilerplate-scaled-font.h | 2 +- + boilerplate/cairo-boilerplate-script.c | 30 ++++---- + boilerplate/cairo-boilerplate-skia.c | 18 ++--- + boilerplate/cairo-boilerplate-svg.c | 59 +++++++------- + boilerplate/cairo-boilerplate-system.c | 10 ++- + boilerplate/cairo-boilerplate-system.h | 10 ++- + boilerplate/cairo-boilerplate-test-surfaces.c | 100 ++++++++++++------------ + boilerplate/cairo-boilerplate-vg.c | 36 ++++----- + boilerplate/cairo-boilerplate-wgl.c | 58 +++++++------- + boilerplate/cairo-boilerplate-win32-printing.c | 29 +++---- + boilerplate/cairo-boilerplate-win32.c | 18 ++--- + boilerplate/cairo-boilerplate-xcb.c | 85 +++++++++++---------- + boilerplate/cairo-boilerplate-xlib.c | 90 +++++++++++----------- + boilerplate/cairo-boilerplate.c | 102 +++++++++++++------------ + boilerplate/cairo-boilerplate.h | 44 ++++++----- + perf/cairo-perf-chart.c | 38 ++++++--- + perf/cairo-perf-compare-backends.c | 30 ++++---- + perf/cairo-perf-diff-files.c | 37 +++++---- + perf/cairo-perf-graph-files.c | 73 ++++++++++-------- + perf/cairo-perf-graph-widget.c | 60 +++++++++------ + perf/cairo-perf-graph.h | 8 +- + perf/cairo-perf-micro.c | 82 ++++++++++---------- + perf/cairo-perf-os2.c | 10 +-- + perf/cairo-perf-posix.c | 24 +++--- + perf/cairo-perf-print.c | 5 +- + perf/cairo-perf-report.c | 62 +++++++++------ + perf/cairo-perf-trace.c | 82 +++++++++++--------- + perf/cairo-perf-win32.c | 6 +- + perf/cairo-perf.h | 38 ++++----- + perf/cairo-stats.c | 11 +-- + perf/cairo-stats.h | 6 +- + 42 files changed, 850 insertions(+), 746 deletions(-) + +commit 616e35d1fae703dc118ce503d25d4f57cfd16dfd +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jun 24 09:44:07 2010 +0300 + + boilerplate: Remove the xlib-window target from Renderless builds. + + I don't know why _cairo_boilerplate_xlib_window_create_surface() + is in the Render-only section of the code, but since it is, this + patch makes the boilerplate at least compile if we don't have + Render support built in. + + boilerplate/cairo-boilerplate-xlib.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aed744008dbaab49f28f9c54ad0850074ece5d66 +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Thu Jun 24 05:38:14 2010 -0400 + + test: Fix typo in copyright statement + + test/bug-seams.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5c7e1dd690af21943435676bfac320cfe863cf55 +Author: Soeren Sandmann <sandmann@daimi.au.dk> +Date: Thu Jun 24 10:11:48 2010 +0100 + + test: Add an example of seams. + + A pair of perfectly conjoint quads should not produce a seam when + accumulating into a temporary mask. Yet here is an example of where they + do! + + test/Makefile.am | 3 ++ + test/Makefile.sources | 1 + + test/bug-seams.c | 98 +++++++++++++++++++++++++++++++++++ + test/bug-seams.ref.png | Bin 0 -> 1604 bytes + test/bug-seams.xlib-fallback.ref.png | Bin 0 -> 2133 bytes + test/bug-seams.xlib.ref.png | Bin 0 -> 1606 bytes + 6 files changed, 102 insertions(+) + +commit 413ec4b708a511eb2f3866165a35d3a8d97bd326 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 22 23:19:32 2010 +0200 + + gl: Return a surface from _cairo_surface_create_in_error() + + On error, surface creation functions should always return a surface + created with _cairo_surface_create_in_error() instead of a new surface + in an error state. This simplifies internal code as no refcounting has + to be done. + + src/cairo-gl-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a4e292507cf7c2f960d040edd57b56a976c73da6 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 22 22:01:25 2010 +0200 + + gl: Propagate surface creation error instead of crashing + + src/cairo-gl-glyphs.c | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +commit faa4e6761c8f74a1acaa7ccc5bc8bb23b2f5cdb1 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jun 21 14:01:34 2010 +0200 + + egl: Copy glx code to detect the proper surface in acquire + + src/cairo-egl-context.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 76a721f7e94fb040f106b200c09c1a7b9ae83d36 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jun 21 13:30:06 2010 +0200 + + egl: Remove unused prev_foo usage + + src/cairo-egl-context.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit b8051ee985ed46c69f5fba1216ead1ebacecfd44 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 19 18:09:27 2010 +0100 + + script: Pass the buffer length back to freetype. + + After querying the required size, inform the backend of the allocated + size of the buffer. + + src/cairo-script-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8ac9a9df24eefc5f1125db87eb8eda2e94f54070 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 19 13:23:50 2010 +0100 + + xcb: Return the status upon flushing the device. + + The vfunc was updated to expect the status return, so supply it. + + src/cairo-xcb-connection.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 9fffc0e120df8947c34d9e423c69ab66b763d875 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 19 11:15:13 2010 +0100 + + xlib: Precise and Imprecise were reversed. + + The intention was to switch to imprecise mode by default, using the + exact rendering mode only upon request. + + src/cairo-xlib-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b322b2e61984c2e9e00fb44343ebe5e423246445 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 19 10:26:05 2010 +0100 + + xlib: Perform image uploads inplace. + + Under the restrictive conditions where we are doing an untransformed + contained upload of an image into a matching surface, perform it in + place. The drivers will attempt to stream such uploads efficiently, far + more so than our code. + + src/cairo-xlib-surface.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 112 insertions(+) + +commit c3eb95bf6670bbc06ef908481da95f3504c7dc4d +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 19:26:07 2010 +0200 + + egl: Fail properly if no configs are available instead of crashing + + boilerplate/cairo-boilerplate-egl.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 3908d80f57bc0abef47721a5b8b9afd5041118e3 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 16:11:20 2010 +0200 + + glx: Remove useless optimization trying to avoid glXMakeCurrent() + + The optimization is not performance-relevant. And having less code is + always a good idea. + + src/cairo-glx-context.c | 19 ++----------------- + 1 file changed, 2 insertions(+), 17 deletions(-) + +commit 64f90322f73c37ac5667292949bb45b0279239d9 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 12:40:48 2010 +0200 + + gl: Refactor status handling in _cairo_gl_context_release() + + Previously, the code returned a status and required the caller to mangle + this status with his own status. Now, the function takes the previous + status ass an argument and does the mangling itself. + + Also contains fixes for all the callers to actually check the return + value - which is now rather trivial as it just requires passing through + the status variable. + + src/cairo-gl-composite.c | 6 ++---- + src/cairo-gl-device.c | 2 +- + src/cairo-gl-glyphs.c | 14 +++++--------- + src/cairo-gl-gradient.c | 3 ++- + src/cairo-gl-private.h | 14 ++++++++------ + src/cairo-gl-surface.c | 47 +++++++++++++++++++++++++---------------------- + 6 files changed, 43 insertions(+), 43 deletions(-) + +commit fc3d521c121da237974e486f1b7735009764b441 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 12:23:37 2010 +0200 + + gl: Inline the check_error() function + + src/cairo-gl-private.h | 23 +++++++---------------- + 1 file changed, 7 insertions(+), 16 deletions(-) + +commit 9d7fa289132650261e546b39af2371c262f46d3c +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 12:18:05 2010 +0200 + + gl: Don't assert if there used to be a GL error + + When acquiring the GL context, do not assert that the GL context is not + in an error state. Do not even call _cairo_error(). Handling GL errors + in other code is not Cairo's responsibility. + + Instead just clear all previous errors so we don't accidentally set + surfaces into error states to unrelated errors. + + src/cairo-gl-private.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0f9a8cd18f14b1f23aaefe14db3b5ad07c84cff7 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 12:17:36 2010 +0200 + + gl: Add a custom glGetError() function + + This function clears all errors and returns the first one that happened. + + src/cairo-gl-private.h | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +commit 8048d3aa0a11ab1c054887682b8b2a899a87da0e +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 10:50:21 2010 +0200 + + gl: Remove custom fprintf fudging on GL errors + + Now that we probably call _cairo_error() on every GL error, there is no + need to use custom methods to catch those errors. The usual breakpoint + is enough. + + src/cairo-gl-private.h | 7 +------ + src/cairo-gl-surface.c | 20 -------------------- + 2 files changed, 1 insertion(+), 26 deletions(-) + +commit f4da5048bf87df0651ec83ca3f1ad6a5af7eb16d +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 10:44:15 2010 +0200 + + gl: cairo_warn about return value from cairo_gl_context_release() + + src/cairo-gl-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d9179f480a43c7171806e2c33804aaae70a2cfa6 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 18 00:43:09 2010 +0200 + + boilerplate: Reinstate glFinish() for wgl + + It was accidentally disabled. + + boilerplate/cairo-boilerplate-wgl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 67e84d61230a2012c18d8bff60e8835aaa57be07 +Author: Kristian Høgsberg <krh@bitplanet.net> +Date: Thu Jun 17 17:38:00 2010 -0400 + + egl: Implement acquire and release for EGL backend + + src/cairo-egl-context.c | 46 +++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 37 insertions(+), 9 deletions(-) + +commit 7ab9ce1b9130dcd63b2b2b2516b77ef1ae531144 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 17 15:47:04 2010 +0100 + + image: Make a local copy of the trap coordinates as the boxes alias. + + As we transform the array of trapezoids into an array of boxes in-place, + we must take local copies of the coordinates before writing into the + boxes otherwise we may inadvertently modify the trapezoidal coordinates. + + Fixes test/a1-bug. + + src/cairo-image-surface.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit f2645fa361003636d1da6ca38c3b61fef1b1ce4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 17 15:38:53 2010 +0100 + + test: Add a1-bug + + Capture a bug report from "cairouser" where a1 rasterisation is now + broken. + + test/Makefile.am | 3 +++ + test/Makefile.sources | 1 + + test/a1-bug.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ + test/a1-bug.image16.ref.png | Bin 0 -> 3329 bytes + test/a1-bug.ref.png | Bin 0 -> 3736 bytes + test/a1-bug.xlib.ref.png | Bin 0 -> 3362 bytes + 6 files changed, 65 insertions(+) + +commit 800e977c2ea1e097c4b7332b18a5fc03089603c1 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jun 17 14:27:13 2010 +0300 + + perf: Allow comparing perf reports with only one difference. + + The cairo-perf-diff-files tool would ignore perf reports with + just one test for no apparent reason. The traces take so long + that it's useful to be able to compare runs with just one trace. + + perf/cairo-perf-diff-files.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 29b8cfd2b6cf590fcfe64e5ba5b4479c2748ac06 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 17 10:11:31 2010 +0100 + + test/halo: Remove copied code. + + How did that get there? I obviously ran the test to generate the output, + so where did it spring as it is the old version of the function? + + From 16364768d79570e7201a87f0a985c65acaff5560. + + Mysteries will never cease. + + test/halo.c | 36 ------------------------------------ + 1 file changed, 36 deletions(-) + +commit a9a22649e2ffa1cd3720c8555dc3c6aff2040e3d +Author: Zoxc <zoxc32@gmail.com> +Date: Wed Jun 16 21:33:30 2010 +0200 + + wgl: Only reset GL context on the dummy window. + + This changes the WGL context destruction code to only reset the GL + context for the dummy window, since doing it on <nothing> is an + invalid operation. + + src/cairo-wgl-context.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit ca35e09ece5107c3ebc9f111d4a3d96d69aa3d03 +Author: Zoxc <zoxc32@gmail.com> +Date: Mon Jun 14 20:34:52 2010 +0200 + + gl: Added wgl boilerplate and moved the glx and egl boilerplates into their own files. + + boilerplate/Makefile.sources | 4 +- + boilerplate/Makefile.win32.features | 8 + + boilerplate/cairo-boilerplate-egl.c | 141 +++++++++++ + boilerplate/cairo-boilerplate-gl.c | 492 ------------------------------------ + boilerplate/cairo-boilerplate-glx.c | 401 +++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate-wgl.c | 236 +++++++++++++++++ + build/Makefile.win32.features-h | 1 + + src/Makefile.win32.features | 8 + + 8 files changed, 798 insertions(+), 493 deletions(-) + +commit 2af3262895d74492a0f856f049d1524a527257bb +Author: Zoxc <zoxc32@gmail.com> +Date: Mon Jun 14 20:33:17 2010 +0200 + + wgl: Renamed hwnd field to wnd. + + src/cairo-wgl-context.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 7a023a62f7517ad0d54f4d59c99909fadcc05e82 +Author: Nicolaus L Helper <nlhepler@gmail.com> +Date: Thu Jun 17 08:56:30 2010 +0100 + + ft,fc,xlib: LCD filtering patch. + + This adds internal API to retrieve the LCD filtering parameters from + fontconfig, or as set on the Screen, and feed them to FreeType when + rendering the glyph. + + References: + Bug 10301 - LCD filtering patch + https://bugs.freedesktop.org/show_bug.cgi?id=10301 + + Tested-by: Brandon Wright <bearoso@gmail.com> + Forward-ported-by: Robert Hooker <sarvatt@gmail.cm> + + ickle: The API is clearly not ready for public consumption, the enum are + poorly named, however this stands by itself as enabling system wide + properties. + + src/cairo-font-options.c | 51 +++- + src/cairo-ft-font.c | 675 +++++++++++++++++++++++++++++++++------------- + src/cairo-surface.c | 1 + + src/cairo-types-private.h | 25 ++ + src/cairo-xlib-screen.c | 28 ++ + src/cairoint.h | 7 + + 6 files changed, 597 insertions(+), 190 deletions(-) + +commit 36b4b0631cc220d01c411b596a4eef839338cd7c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 17 08:50:31 2010 +0100 + + image: Use consistent rounding modes for a1 rasterisation. + + When checking if the traps are equivalent to a set of rectangles, we + need to use the same rounding mode as when converting the traps to a set + of boxes and then filling them. Failure to do leads to a situation where + (-127,-128) was thought to be equivalent to (0,0) but we attempted to + fill from 0 to -1 instead. + + References: + http://lists.cairographics.org/archives/cairo/2010-June/020115.html + + src/cairo-image-surface.c | 58 ++++++++++++++++++++++++++++------------------- + 1 file changed, 35 insertions(+), 23 deletions(-) + +commit 3306bcb1d91265d60c460aa64d3ee4a4acb430a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 17 08:47:48 2010 +0100 + + fixed: Refactor code to use more inlines and less duplication of logic. + + This also has the side-effect of fixing the types in the problematic + functions which hid Andrea's true fix for the unsigned FRAC_MASK. + + src/cairo-fixed-private.h | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit c0dee7964c4394b7963041f246855fd3b01f4ebb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 16 18:49:58 2010 +0100 + + test: Add a1-rasterisation + + Check the rounding criteria when rasterising. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/a1-rasterisation-rectangles.ref.png | Bin 0 -> 1729 bytes + test/a1-rasterisation-triangles.ref.png | Bin 0 -> 1729 bytes + test/a1-rasterisation.c | 101 +++++++++++++++++++++++++++++++ + 5 files changed, 104 insertions(+) + +commit 16364768d79570e7201a87f0a985c65acaff5560 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 16 15:09:22 2010 +0100 + + test/halo: Transformation seems key to the bug... + + test/halo.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit cb28e0bfeb47a72f14ee42f161ebf6b5eb61e76b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 17 08:42:39 2010 +0200 + + test: correct options in getopt call + + 'k' was missing and 't' was present but unhandled. Options have been + reordered according to the "USAGE" ordering. + + test/cairo-test-runner.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3cd07559328b60e3da85debb805cb4a3fc4abc22 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 16 22:54:08 2010 +0200 + + correct rounding computation + + cairo_fixed_integer_round[_down] were adding an unsigned mask value + before shifting its result, causing the shift to be computed as + logical (unsigned) right shift, thus producing incorrect values for + negative inputs. Making the mask value signed fixes this issue. + + Bug report by cu: + http://lists.cairographics.org/archives/cairo/2010-June/020115.html + + src/cairo-fixed-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8689d75caaa9c6ee42976873d21684fa9f48834f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 16 15:09:22 2010 +0100 + + test/halo: Transformation seems key to the bug... + + Only it is actually transformation of the result that is required in + order to magnify the effect to a detectable level. + + test/Makefile.am | 5 +++ + test/halo-transform.image16.ref.png | Bin 0 -> 10983 bytes + test/halo-transform.ps.ref.png | Bin 0 -> 8691 bytes + test/halo-transform.ref.png | Bin 0 -> 15086 bytes + test/halo-transform.xlib.ref.png | Bin 0 -> 15346 bytes + test/halo.c | 64 ++++++++++++++++++++++++++++++++++-- + test/halo.image16.ref.png | Bin 5328 -> 6172 bytes + test/halo.ps.ref.png | Bin 0 -> 5220 bytes + test/halo.ref.png | Bin 7524 -> 8839 bytes + test/halo.xlib.ref.png | Bin 7404 -> 8835 bytes + 10 files changed, 67 insertions(+), 2 deletions(-) + +commit 71936a1f414807a51c68de111362c2d5499bdfa7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 15 21:36:15 2010 +0100 + + test/aliasing: Add a few more colour combinations. + + In particular, compare red against its inverse, cyan. Etc. + + test/aliasing.c | 6 +++++- + test/aliasing.image16.ref.png | Bin 20810 -> 97251 bytes + test/aliasing.ref.png | Bin 22980 -> 104672 bytes + test/aliasing.xlib.ref.png | Bin 24018 -> 104315 bytes + 4 files changed, 5 insertions(+), 1 deletion(-) + +commit e2220a1f3a7b483e615f5bb993a014d20b0f788a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 15 11:45:54 2010 +0100 + + configure: Try an alternate name for system glew. + + configure.ac | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 25ec0c1e9b5af2ba68200b79b252de5c1b371d0a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 15 10:59:01 2010 +0100 + + build: Enable system GLEW on non-UNIX platforms + + configure.ac | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 52624446636bb5941ca2180afa2c0be275414cec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 15 10:40:36 2010 +0100 + + glew: Define NULL + + src/glew/glew.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 56d06b088b9c355ca76a38191717a8e03aa5f59a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 14 22:58:38 2010 +0100 + + test: Add an aliasing test case. + + Just a simple test in drawing neighbouring edges and looking for the + effects of aliasing. + + test/Makefile.am | 3 ++ + test/Makefile.sources | 1 + + test/aliasing.c | 98 ++++++++++++++++++++++++++++++++++++++++++ + test/aliasing.image16.ref.png | Bin 0 -> 20810 bytes + test/aliasing.ref.png | Bin 0 -> 22980 bytes + test/aliasing.xlib.ref.png | Bin 0 -> 24018 bytes + 6 files changed, 102 insertions(+) + +commit 4b39f02bf7e8b4921518db4a2d8564514cb323a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 14 20:38:26 2010 +0100 + + test: Add halo + + halo uses text_path + stroke + (fill | show_text) to generate a "halo" + around the string. This is to try to replicate a bug described by Ian + Britten in the PDF backend where the rendering of the show_text looked + distorted compared to the stroke. + + test/Makefile.am | 3 ++ + test/Makefile.sources | 1 + + test/halo.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++ + test/halo.image16.ref.png | Bin 0 -> 5328 bytes + test/halo.ref.png | Bin 0 -> 7524 bytes + test/halo.xlib.ref.png | Bin 0 -> 7404 bytes + 6 files changed, 102 insertions(+) + +commit 072a200ec502bf5ac3e62702e6f14ed18171b1e0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 14 16:05:14 2010 +0100 + + build: Add wgl to Makefile.sources and regenerate features. + + boilerplate/Makefile.win32.features | 10 ++++++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + src/Makefile.sources | 6 ++++-- + src/Makefile.win32.features | 14 ++++++++++++++ + 5 files changed, 32 insertions(+), 2 deletions(-) + +commit 4a0bd91ff77c8afddde6d09495bc9ca7242f953d +Author: Dmitri Vorobiev <dmitri.vorobiev@movial.com> +Date: Mon Jun 14 16:40:39 2010 +0300 + + scaled-font: fine-tune caching + + This patch implements the ideas outlined by Behdad Esfahbod in the following + mailing list message: + + http://lists.cairographics.org/archives/cairo/2010-June/020065.html + + Specifically, two things have been adjusted. First, the size of the look-up + table was reduced to 64. Second, cache codepath is now bypassed for strings + that are shorter than 16, not only for one-character strings. This allowed + us to reduce the LUT initialization overhead while still retaining the + advantage of caching for common-case string sizes. + + We have experimented with different LUT sizes, and it came out that the size + of 64 is the best one in view of speed, at least for our language-neutral + benchmark, which generated random strings of printable ASCII characters. + + Below is a table presenting benchmark results for different values of LUT + size: + + =============================================================================== + Benchmark | [1] | [2] | [3] | [4] | [5] | [6] | [7] + =============================================================================== + 8px text, 1 chars | 0.41 | 0.41 | 0 | 0.41 | 0 | 0.41 | 0 + 8px text, 10 chars | 2.13 | 2.21 | 3.76 | 2.19 | 2.82 | 2.09 | -1.88 + 8px text, 20 chars | 2.97 | 3.04 | 2.36 | 3.01 | 1.35 | 2.98 | 0.34 + 12px text, 1 chars | 0.94 | 0.94 | 0 | 0.95 | 1.06 | 0.94 | 0 + 12px text, 10 chars | 4.73 | 4.89 | 3.38 | 4.9 | 3.59 | 4.82 | 1.9 + 12px text, 20 chars | 6.32 | 6.42 | 1.58 | 6.46 | 2.22 | 6.32 | 0 + 16px text, 1 chars | 1.75 | 1.76 | 0.57 | 1.77 | 1.14 | 1.76 | 0.57 + 16px text, 10 chars | 8.13 | 8.45 | 3.94 | 8.43 | 3.69 | 8.44 | 3.81 + 16px text, 20 chars | 10.41 | 10.69 | 2.69 | 10.64 | 2.21 | 10.65 | 2.31 + 24px text, 1 chars | 3.3 | 3.3 | 0 | 3.32 | 0.61 | 3.3 | 0 + 24px text, 10 chars | 14.68 | 14.97 | 1.98 | 14.97 | 1.98 | 14.87 | 1.29 + 24px text, 20 chars | 17.93 | 18.01 | 0.45 | 18.06 | 0.73 | 17.81 | -0.67 + 96px text, 1 chars | 23.65 | 23.38 | -1.14 | 23.74 | 0.38 | 23.65 | 0 + 96px text, 5 chars | 50.52 | 51.34 | 1.62 | 51.48 | 1.9 | 51.41 | 1.76 + 96px text, 10 chars | 57.5 | 58.11 | 1.06 | 58.27 | 1.34 | 58.04 | 0.94 + =============================================================================== + + [1]: Git head, Mpix/s + [2]: {GLYPH_LUT_SIZE = 32, CACHING_THRESHOLD = 16} + [3]: Gain of {32, 16} w.r.t. Git head + [4]: {GLYPH_LUT_SIZE = 64, CACHING_THRESHOLD = 16} + [5]: Gain of {64, 16} w.r.t. Git head + [6]: {GLYPH_LUT_SIZE = 128, CACHING_THRESHOLD = 16} + [7]: Gain of {128, 16} w.r.t. Git head + + The benchmark itself can be found from this mailing list message: + + http://lists.cairographics.org/archives/cairo/2010-June/020064.html + + src/cairo-scaled-font.c | 61 ++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 45 insertions(+), 16 deletions(-) + +commit 505a0456d2498112155db7e7f275a14dc98f643e +Author: Zoxc <zoxc32@gmail.com> +Date: Mon Jun 14 01:20:54 2010 +0200 + + gl: Added WGL context and surface. + + build/configure.ac.features | 1 + + configure.ac | 9 ++ + src/cairo-gl.h | 16 +++ + src/cairo-wgl-context.c | 253 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 279 insertions(+) + +commit fd6c38b9e006feefa20ce4f54d3108dad51c828d +Author: Zoxc <zoxc32@gmail.com> +Date: Mon Jun 14 01:04:10 2010 +0200 + + win32: Fixed compile errors in Windows backend. + + src/cairo-win32-printing-surface.c | 9 ++++----- + src/cairo-win32-surface.c | 4 ++-- + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit 5f10139cd92383c657e328ffad41874c4f668551 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 13 12:33:10 2010 +0100 + + NEWS: A couple more tweaks + + I only spotted these in the release announcement. + + NEWS | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4932aaa3173799c8f3ac30e4c9a594c20c83a121 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 13 12:02:53 2010 +0100 + + version: 1.9.9 + + Post-snapshot bump. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3a20b10cd0d94406fbd5fe3bb3d4820a95364537 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 13 10:27:03 2010 +0100 + + version: 1.9.8 + + Snapshot time! + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b612a230865a1a62f9cdcb051de9b57b509646b2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jun 13 12:29:24 2010 +0200 + + test: update quartz ref images in makefile + + test/Makefile.am | 143 ++++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 109 insertions(+), 34 deletions(-) + +commit 0693af2328606a4c7e4c888d2a1cd346e6bef405 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 13 10:22:37 2010 +0100 + + test: Move all output below test/output/ + + make distcheck complains of remanents being left under test/ after a + clean, notably the files used to check the capabilities of a similar + surface and the fallback-resolution output. + + test/cairo-test.c | 53 ++++++++++++++++++++++++++-------------------- + test/fallback-resolution.c | 30 ++++++++++++++++++++++---- + 2 files changed, 56 insertions(+), 27 deletions(-) + +commit ffc3a39c95e918fa2fcd14c1b1063b9a9acceebf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 20:04:36 2010 +0100 + + NEWS: Minor tweaks. + + NEWS | 46 +++++++++++++++++++++++----------------------- + 1 file changed, 23 insertions(+), 23 deletions(-) + +commit b6e16b8d2950cdadf2e2b14b0e7502d4a9ebdc09 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 12 10:33:35 2010 +0200 + + test: quartz ref image refresh + + test/a1-image-sample.quartz.xfail.png | Bin 0 -> 972 bytes + test/a1-mask-sample.quartz.xfail.png | Bin 0 -> 972 bytes + test/a1-traps-sample.quartz.xfail.png | Bin 0 -> 122 bytes + test/big-line.quartz.ref.png | Bin 0 -> 993 bytes + test/caps-joins-curve.quartz.ref.png | Bin 0 -> 5199 bytes + test/clear.quartz.argb32.ref.png | Bin 0 -> 691 bytes + test/clear.quartz.rgb24.ref.png | Bin 0 -> 606 bytes + test/clip-disjoint.quartz.ref.png | Bin 0 -> 5476 bytes + test/clip-fill-rule.quartz.rgb24.ref.png | Bin 0 -> 363 bytes + test/clip-fill-unbounded.quartz.argb32.ref.png | Bin 0 -> 1436 bytes + test/clip-fill-unbounded.quartz.rgb24.ref.png | Bin 0 -> 1368 bytes + test/clip-fill.quartz.ref.png | Bin 0 -> 875 bytes + test/clip-group-shapes-circles.quartz.ref.png | Bin 0 -> 1518 bytes + test/clip-nesting.quartz.argb32.ref.png | Bin 0 -> 1048 bytes + test/clip-nesting.quartz.ref.png | Bin 1067 -> 0 bytes + test/clip-nesting.quartz.rgb24.ref.png | Bin 956 -> 937 bytes + test/clip-operator.quartz.argb32.ref.png | Bin 0 -> 9586 bytes + test/clip-operator.quartz.ref.png | Bin 9539 -> 0 bytes + test/clip-operator.quartz.rgb24.ref.png | Bin 4412 -> 4104 bytes + test/clip-push-group.quartz.ref.png | Bin 203 -> 166 bytes + test/clip-shape.quartz.ref.png | Bin 0 -> 3229 bytes + test/clip-stroke-unbounded.quartz.argb32.ref.png | Bin 0 -> 1493 bytes + test/clip-stroke-unbounded.quartz.rgb24.ref.png | Bin 0 -> 1356 bytes + test/clip-stroke.quartz.ref.png | Bin 0 -> 1305 bytes + test/clip-text.quartz.ref.png | Bin 0 -> 854 bytes + test/clip-twice.quartz.argb32.ref.png | Bin 0 -> 1171 bytes + test/clip-twice.quartz.ref.png | Bin 1171 -> 0 bytes + test/clip-twice.quartz.rgb24.ref.png | Bin 1111 -> 1095 bytes + test/clipped-group.quartz.ref.png | Bin 0 -> 308 bytes + test/culled-glyphs.quartz.ref.png | Bin 0 -> 493 bytes + test/dash-caps-joins.quartz.ref.png | Bin 4727 -> 0 bytes + test/dash-caps-joins.quartz.xfail.png | Bin 0 -> 4446 bytes + test/dash-curve.quartz.ref.png | Bin 47965 -> 0 bytes + test/dash-curve.quartz.xfail.png | Bin 0 -> 42238 bytes + test/dash-scale.quartz.ref.png | Bin 8079 -> 7614 bytes + test/dash-state.quartz.ref.png | Bin 8698 -> 0 bytes + test/dash-state.quartz.xfail.png | Bin 0 -> 6957 bytes + test/degenerate-arc.quartz.ref.png | Bin 0 -> 552 bytes + test/degenerate-curve-to.quartz.ref.png | Bin 0 -> 247 bytes + test/degenerate-dash.quartz.xfail.png | Bin 0 -> 1560 bytes + test/degenerate-path.quartz.argb32.xfail.png | Bin 0 -> 200 bytes + test/degenerate-path.quartz.ref.png | Bin 232 -> 0 bytes + test/degenerate-path.quartz.rgb24.ref.png | Bin 198 -> 0 bytes + test/degenerate-path.quartz.rgb24.xfail.png | Bin 0 -> 172 bytes + test/degenerate-pen.quartz.ref.png | Bin 1144 -> 0 bytes + test/degenerate-rel-curve-to.quartz.ref.png | Bin 0 -> 246 bytes + test/extend-pad-border.quartz.ref.png | Bin 0 -> 432 bytes + test/extend-pad-similar.quartz.xfail.png | Bin 0 -> 270 bytes + test/extend-pad.quartz.xfail.png | Bin 0 -> 270 bytes + test/fill-alpha-pattern.quartz.ref.png | Bin 0 -> 7943 bytes + test/fill-alpha.quartz.ref.png | Bin 0 -> 2704 bytes + test/fill-and-stroke-alpha-add.quartz.ref.png | Bin 603 -> 542 bytes + test/fill-and-stroke-alpha.quartz.ref.png | Bin 550 -> 0 bytes + test/fill-and-stroke.quartz.argb32.ref.png | Bin 0 -> 273 bytes + test/fill-and-stroke.quartz.ref.png | Bin 286 -> 0 bytes + test/fill-and-stroke.quartz.rgb24.ref.png | Bin 264 -> 249 bytes + ...ill-degenerate-sort-order.quartz.argb32.ref.png | Bin 0 -> 2451 bytes + test/fill-degenerate-sort-order.quartz.ref.png | Bin 2470 -> 0 bytes + ...fill-degenerate-sort-order.quartz.rgb24.ref.png | Bin 2098 -> 2079 bytes + test/fill-image.quartz.ref.png | Bin 0 -> 1297 bytes + test/fill-rule.quartz.argb32.ref.png | Bin 0 -> 2060 bytes + test/fill-rule.quartz.ref.png | Bin 2079 -> 0 bytes + test/fill-rule.quartz.rgb24.ref.png | Bin 1790 -> 1771 bytes + test/filter-bilinear-extents.quartz.xfail.png | Bin 0 -> 308 bytes + test/filter-nearest-offset.quartz.xfail.png | Bin 0 -> 2130 bytes + test/filter-nearest-transformed.quartz.xfail.png | Bin 0 -> 534 bytes + test/finer-grained-fallbacks.quartz.argb32.ref.png | Bin 0 -> 988 bytes + test/finer-grained-fallbacks.quartz.rgb24.ref.png | Bin 0 -> 763 bytes + test/font-matrix-translation.quartz.ref.png | Bin 1090 -> 996 bytes + test/ft-show-glyphs-table.quartz.xfail.png | Bin 0 -> 827 bytes + .../ft-text-vertical-layout-type1.quartz.xfail.png | Bin 0 -> 3635 bytes + test/ft-text-vertical-layout-type3.quartz.ref.png | Bin 0 -> 3573 bytes + test/glyph-cache-pressure.quartz.ref.png | Bin 3654 -> 3284 bytes + test/gradient-constant-alpha.quartz.argb32.ref.png | Bin 0 -> 214 bytes + test/group-unaligned.quartz.ref.png | Bin 0 -> 363 bytes + test/huge-radial.quartz.ref.png | Bin 0 -> 84690 bytes + test/inverse-text.quartz.ref.png | Bin 0 -> 2565 bytes + test/joins.quartz.ref.png | Bin 0 -> 5833 bytes + test/leaky-dash.quartz.ref.png | Bin 241 -> 195 bytes + test/leaky-dashed-rectangle.quartz.ref.png | Bin 0 -> 339 bytes + test/leaky-dashed-stroke.quartz.ref.png | Bin 0 -> 9229 bytes + test/line-width-scale.quartz.ref.png | Bin 6434 -> 5623 bytes + test/linear-gradient-reflect.quartz.ref.png | Bin 878 -> 780 bytes + test/linear-gradient-subset.quartz.ref.png | Bin 0 -> 887 bytes + test/linear-gradient.quartz.ref.png | Bin 1164 -> 1060 bytes + test/long-dashed-lines.quartz.ref.png | Bin 2313 -> 2068 bytes + test/mask-alpha.quartz.argb32.ref.png | Bin 641 -> 622 bytes + test/mask-transformed-image.quartz.ref.png | Bin 0 -> 3909 bytes + test/mask-transformed-similar.quartz.ref.png | Bin 0 -> 3909 bytes + test/mask.quartz.argb32.ref.png | Bin 0 -> 10575 bytes + test/mask.quartz.ref.png | Bin 10682 -> 0 bytes + test/mask.quartz.rgb24.ref.png | Bin 8418 -> 8354 bytes + test/new-sub-path.quartz.ref.png | Bin 383 -> 370 bytes + test/new-sub-path.quartz.rgb24.ref.png | Bin 357 -> 0 bytes + test/operator-clear.quartz.argb32.ref.png | Bin 0 -> 1228 bytes + test/operator-clear.quartz.ref.png | Bin 1459 -> 0 bytes + test/operator-clear.quartz.rgb24.ref.png | Bin 1293 -> 1096 bytes + test/operator-source.quartz.argb32.ref.png | Bin 0 -> 4754 bytes + test/operator-source.quartz.ref.png | Bin 4637 -> 0 bytes + test/operator-source.quartz.rgb24.ref.png | Bin 3533 -> 3535 bytes + test/over-above-source.quartz.argb32.ref.png | Bin 0 -> 511 bytes + test/over-above-source.quartz.ref.png | Bin 530 -> 0 bytes + test/over-above-source.quartz.rgb24.ref.png | Bin 456 -> 437 bytes + test/over-around-source.quartz.argb32.ref.png | Bin 0 -> 593 bytes + test/over-around-source.quartz.ref.png | Bin 612 -> 0 bytes + test/over-around-source.quartz.rgb24.ref.png | Bin 491 -> 0 bytes + test/over-between-source.quartz.argb32.ref.png | Bin 0 -> 551 bytes + test/over-between-source.quartz.ref.png | Bin 570 -> 0 bytes + test/over-between-source.quartz.rgb24.ref.png | Bin 467 -> 0 bytes + test/path-append.quartz.ref.png | Bin 0 -> 6395 bytes + test/pthread-same-source.quartz.xfail.png | Bin 0 -> 957 bytes + test/pthread-show-text.quartz.ref.png | Bin 0 -> 42996 bytes + test/push-group-color.quartz.ref.png | Bin 0 -> 3127 bytes + test/push-group.quartz.argb32.ref.png | Bin 0 -> 3932 bytes + test/push-group.quartz.rgb24.ref.png | Bin 0 -> 3659 bytes + test/radial-gradient.quartz.ref.png | Bin 92334 -> 0 bytes + test/random-intersections-curves-eo.quartz.ref.png | Bin 0 -> 326366 bytes + test/random-intersections-curves-nz.quartz.ref.png | Bin 0 -> 324940 bytes + test/random-intersections-eo.quartz.ref.png | Bin 197778 -> 179179 bytes + test/random-intersections-nonzero.quartz.ref.png | Bin 0 -> 180871 bytes + ...recording-surface-pattern.quartz.argb32.ref.png | Bin 0 -> 4570 bytes + test/recording-surface-pattern.quartz.ref.png | Bin 4572 -> 0 bytes + .../recording-surface-pattern.quartz.rgb24.ref.png | Bin 4063 -> 4058 bytes + test/rectilinear-dash.quartz.xfail.png | Bin 0 -> 494 bytes + test/rectilinear-stroke.quartz.xfail.png | Bin 0 -> 209 bytes + test/reflected-stroke.quartz.ref.png | Bin 5293 -> 0 bytes + test/rel-path.quartz.ref.png | Bin 212 -> 0 bytes + test/rel-path.quartz.rgb24.ref.png | Bin 228 -> 0 bytes + test/rotate-image-surface-paint.quartz.ref.png | Bin 257 -> 356 bytes + test/rotated-clip.quartz.ref.png | Bin 0 -> 3923 bytes + test/rounded-rectangle-fill.quartz.ref.png | Bin 0 -> 684 bytes + test/scale-offset-image.quartz.ref.png | Bin 0 -> 9054 bytes + test/scale-offset-similar.quartz.ref.png | Bin 0 -> 9054 bytes + test/select-font-face.quartz.ref.png | Bin 2970 -> 2645 bytes + test/self-intersecting.quartz.xfail.png | Bin 0 -> 233 bytes + test/show-text-current-point.quartz.ref.png | Bin 3093 -> 2773 bytes + test/smask-fill.quartz.ref.png | Bin 0 -> 2076 bytes + test/smask-mask.quartz.ref.png | Bin 0 -> 3357 bytes + test/smask-paint.quartz.ref.png | Bin 0 -> 3499 bytes + test/smask-stroke.quartz.ref.png | Bin 0 -> 1697 bytes + test/smask-text.quartz.ref.png | Bin 0 -> 1904 bytes + test/smask.quartz.ref.png | Bin 0 -> 4067 bytes + test/source-clip-scale.quartz.ref.png | Bin 148 -> 126 bytes + test/spline-decomposition.quartz.xfail.png | Bin 0 -> 19560 bytes + test/stroke-ctm-caps.quartz.ref.png | Bin 1109 -> 899 bytes + test/stroke-image.quartz.ref.png | Bin 1802 -> 1350 bytes + test/subsurface-pad.quartz.xfail.png | Bin 0 -> 197 bytes + test/surface-pattern-big-scale-down.quartz.ref.png | Bin 0 -> 258 bytes + ...urface-pattern-operator.quartz.argb32.xfail.png | Bin 0 -> 5917 bytes + ...surface-pattern-operator.quartz.rgb24.xfail.png | Bin 0 -> 2546 bytes + ...e-pattern-scale-down-extend-none.quartz.ref.png | Bin 0 -> 391 bytes + ...-pattern-scale-down-extend-pad.quartz.xfail.png | Bin 0 -> 397 bytes + ...attern-scale-down-extend-reflect.quartz.ref.png | Bin 0 -> 475 bytes + ...pattern-scale-down-extend-repeat.quartz.ref.png | Bin 0 -> 397 bytes + test/surface-pattern-scale-down.quartz.ref.png | Bin 3188 -> 2276 bytes + test/surface-pattern-scale-up.quartz.xfail.png | Bin 0 -> 3294 bytes + test/surface-pattern.quartz.xfail.png | Bin 0 -> 9216 bytes + test/text-antialias-gray.quartz.ref.png | Bin 1041 -> 956 bytes + test/text-antialias-none.quartz.ref.png | Bin 300 -> 270 bytes + test/text-antialias-subpixel.quartz.ref.png | Bin 1065 -> 949 bytes + test/text-glyph-range.quartz.ref.png | Bin 0 -> 2191 bytes + test/text-pattern.quartz.argb32.ref.png | Bin 0 -> 2148 bytes + test/text-pattern.quartz.ref.png | Bin 2158 -> 0 bytes + test/text-pattern.quartz.rgb24.ref.png | Bin 1874 -> 1867 bytes + test/text-rotate.quartz.ref.png | Bin 17820 -> 16655 bytes + test/trap-clip.quartz.argb32.ref.png | Bin 0 -> 6060 bytes + test/trap-clip.quartz.ref.png | Bin 6041 -> 0 bytes + test/trap-clip.quartz.rgb24.ref.png | Bin 5385 -> 5694 bytes + test/unantialiased-shapes.quartz.ref.png | Bin 4394 -> 3868 bytes + test/unbounded-operator.quartz.ref.png | Bin 4066 -> 0 bytes + test/unbounded-operator.quartz.rgb24.ref.png | Bin 1918 -> 0 bytes + test/user-font-proxy.quartz.ref.png | Bin 0 -> 19795 bytes + test/user-font-rescale.quartz.ref.png | Bin 0 -> 15982 bytes + test/user-font.quartz.ref.png | Bin 0 -> 5960 bytes + test/xcomposite-projection.quartz.ref.png | Bin 0 -> 639 bytes + 175 files changed, 0 insertions(+), 0 deletions(-) + +commit 0d5a15f23812575c80db44ca23075293cc0dbfad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 20:00:24 2010 +0100 + + check: Disable running cairo-perf-micro + + Since this takes days to run now and should not find any bugs that are + not covered by the test-suite it seems like a pointless exercise. + Especially as I am trying to make a release! + + perf/Makefile.am | 15 ++++----------- + 1 file changed, 4 insertions(+), 11 deletions(-) + +commit e9fb39daee9ef3f80e4aedbda68027b36ce94fe3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 19:40:42 2010 +0100 + + NEWS: take two. + + NEWS | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 75 insertions(+), 6 deletions(-) + +commit 62899e5e23a798bb3e9b60c9e793555e973b7823 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 18:51:31 2010 +0100 + + NEWS: Boring stub for 1.9.10. + + NEWS | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit fc372b1d9dea1ed4cb4229eaaad62a2d8e112a03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 16:50:30 2010 +0100 + + test: Missing ref images + + test/Makefile.am | 8 ++++---- + test/coverage-triangles.xlib.xfail.png | Bin 0 -> 15859 bytes + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 8737bc8b17ff0c437bb57df018bb7c540a394a7c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 16:49:46 2010 +0100 + + gl: start returning the failure status aftern an invalid GL op. + + src/cairo-gl-composite.c | 1 + + src/cairo-gl-device.c | 26 +++++++++++++++++++------- + src/cairo-gl-glyphs.c | 10 +++++++--- + src/cairo-gl-private.h | 45 ++++++++++++++++++++++++++++++++++----------- + src/cairo-gl-surface.c | 40 +++++++++++++++++++++++++--------------- + 5 files changed, 86 insertions(+), 36 deletions(-) + +commit 5b2f90bf532184e46829de4b2e2f9d0b10c1ff81 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 16:49:11 2010 +0100 + + test: Forgotten ref image. + + test/clipped-group.xlib-fallback.ref.png | Bin 0 -> 344 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit cdd6f11716e3fbe579d68161caec220c7852fdff +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 15:44:29 2010 +0100 + + test: Record the expected failure mode for partial-coverage-intersecting-quads + + As the diagonals of the quad intersect below the limits of Cairo's fixed + point, we fail to take heed of the intersection. + + test/Makefile.am | 1 + + test/partial-coverage-intersecting-quads.xfail.png | Bin 0 -> 262 bytes + 2 files changed, 1 insertion(+) + +commit 3d72b4aa70d106b5da093e6405c7e3890fa343cf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 15:32:31 2010 +0100 + + test/coverage: The comment was still wrong. + + Writing comments is hard. I give in. + + test/coverage.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6d1b3a8ce0b516aed7715b57d9ca5ab4fad6c2f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 12 16:22:54 2010 +0200 + + test: update font family name + + Update the name of the test font family to DejaVu, so that backends + unable to rely on fontconfig to match font names can find the correct + font anyway. + + test/README | 10 +++++----- + test/cairo-test.h | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 3cb882d01b53cb3cec9be62d678dd4ef7ea2c1fd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 12 16:20:37 2010 +0200 + + test: make test font family a define + + In order to make it easier to change the test font family, add it + as a define in the global header and always reference the macro in + the tests. + + test/cairo-test.h | 2 ++ + test/clip-all.c | 2 +- + test/clip-empty-save.c | 2 +- + test/clip-empty.c | 2 +- + test/clip-operator.c | 2 +- + test/font-face-get-type.c | 2 +- + test/font-matrix-translation.c | 2 +- + test/ft-show-glyphs-positioning.c | 2 +- + test/ft-show-glyphs-table.c | 2 +- + test/ft-text-antialias-none.c | 2 +- + test/ft-text-vertical-layout-type3.c | 2 +- + test/get-path-extents.c | 2 +- + test/glyph-cache-pressure.c | 2 +- + test/inverse-text.c | 6 +++--- + test/large-font.c | 2 +- + test/operator-clear.c | 2 +- + test/operator-source.c | 2 +- + test/overlapping-glyphs.c | 2 +- + test/pdf-features.c | 2 +- + test/ps-features.c | 2 +- + test/select-font-face.c | 6 +++--- + test/select-font-no-show-text.c | 2 +- + test/show-text-current-point.c | 2 +- + test/smask-text.c | 2 +- + test/smask.c | 2 +- + test/text-antialias-gray.c | 2 +- + test/text-antialias-none.c | 2 +- + test/text-antialias-subpixel.c | 2 +- + test/text-glyph-range.c | 2 +- + test/text-pattern.c | 2 +- + test/text-rotate.c | 2 +- + test/text-transform.c | 2 +- + test/text-zero-len.c | 2 +- + test/unbounded-operator.c | 2 +- + test/user-font-rescale.c | 6 +++--- + 35 files changed, 42 insertions(+), 40 deletions(-) + +commit b1e4df928fb59ee295830d5c0fa26330714f88f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 15:28:28 2010 +0100 + + test/coverage: Refine comments + + Joonas didn't like me putting incorrect labels in my comments. Said they + were misleading and worse than useless. Harsh. + + test/coverage.c | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +commit 968374b6335199cbf02c8c4733537388da2a45f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 15:14:17 2010 +0100 + + test/coverage: Add a comment describing the column_triangle geometry() + + test/coverage.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 299263f8c912d3468d51ed22bcb6ab96275709f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 13:48:12 2010 +0100 + + test: Disable tests that are too slow to run by default. + + Introduce a slow mode [-s] to the runner, and add "slow" to the + requirements for the very long running tests like the coverage stress + tests. + + test/cairo-test-runner.c | 17 +++++++++++++++-- + test/coverage.c | 12 ++++++------ + test/half-coverage.c | 4 ++-- + test/mask-glyphs.c | 2 +- + test/partial-coverage.c | 16 ++++++++-------- + 5 files changed, 32 insertions(+), 19 deletions(-) + +commit 53139261c7ba1a4cc0b869cb48c136b0362a3b0c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 13:40:17 2010 +0100 + + test: Use exact matching on test names by default. + + Specifying individual tests to run is more common than using a group + chosen from a keyword, so change the default matching mode and introduce + '-k' to select by keyword. + + test/cairo-test-runner.c | 45 ++++++++++++++++++++++----------------------- + 1 file changed, 22 insertions(+), 23 deletions(-) + +commit 97288b0859bae6cea1e3bff84b632e00f1d10917 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 13:34:27 2010 +0100 + + test: More minute geometry exercised by partial-coverage. + + Moving beyond the capabilities of cairo... + + test/Makefile.am | 2 + + test/partial-coverage-intersecting-quads.ref.png | Bin 0 -> 189 bytes + ...partial-coverage-intersecting-triangles.ref.png | Bin 0 -> 202 bytes + test/partial-coverage.c | 131 +++++++++++++++++++++ + 4 files changed, 133 insertions(+) + +commit 4e3ef57bc892b0b046c486390adc7164a1de64de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 13:18:42 2010 +0100 + + test: More coverage coverage. + + A couple of different shapes that aim to test the tessellation side of + the rasterisers more... And worryingly there does seem to be an + unexpected systematic error. + + test/Makefile.am | 8 + + test/coverage-column-triangles.ref.png | Bin 0 -> 208 bytes + test/coverage-column-triangles.xlib.xfail.png | Bin 0 -> 12745 bytes + test/coverage-intersecting-quads.ref.png | Bin 0 -> 253 bytes + test/coverage-intersecting-quads.xlib.xfail.png | Bin 0 -> 15296 bytes + test/coverage-intersecting-triangles.ref.png | Bin 0 -> 209 bytes + .../coverage-intersecting-triangles.xlib.xfail.png | Bin 0 -> 16728 bytes + test/coverage-row-triangles.ref.png | Bin 0 -> 208 bytes + test/coverage-row-triangles.xlib.xfail.png | Bin 0 -> 12671 bytes + test/coverage.c | 249 ++++++++++++++++++++- + 10 files changed, 251 insertions(+), 6 deletions(-) + +commit 9b7cc7641b691a3b9e3d5edd51053c9a095d9c5a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 12 10:41:09 2010 +0100 + + cairo: Create error objects for cairo_t + + Perform an early check for error status and prevent creation of a full + object. This means that we do not pass down error objects to the + initialisation routines and so can survive without paranoia inside the + library. It also has brings consistency that like the other + constructors, no object is created in error and we can skip the + cairo_destroy() if we choose (and we don't waste one of the precious + zero-alloc context slots. + + Fixes crash in test/a8-mask introduced by 1a544361e845. + + src/cairo-debug.c | 2 ++ + src/cairo-mutex-list-private.h | 1 + + src/cairo.c | 76 ++++++++++++++++++++++++++++++++++++------ + src/cairoint.h | 3 ++ + 4 files changed, 71 insertions(+), 11 deletions(-) + +commit 9b6617a3b3b31d52e6646400b16ec56c754bfebd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 21:58:34 2010 +0100 + + image: Apply component alpha to composite masks. + + If we need to pattern requires component alpha, then we must take a + copy of the image and enable component alpha for pixman. + + Fixes test/text-antialias-subpixel on xlib-fallback -- i.e. we will + finally render subpixel antialiased text on ancient XServers. + + src/cairo-image-surface.c | 40 ++++++++++++++++++++++++---------------- + 1 file changed, 24 insertions(+), 16 deletions(-) + +commit 7440fc07f77b112b00957f5459129dba23a5683f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 21:29:02 2010 +0100 + + test: xlib ref image refresh + + test/Makefile.am | 26 +++++++++++++++------ + ...clip-fill-unbounded.xlib-fallback.rgb24.ref.png | Bin 1429 -> 1438 bytes + test/clip-fill-unbounded.xlib.argb32.ref.png | Bin 1758 -> 1759 bytes + test/clip-fill-unbounded.xlib.rgb24.ref.png | Bin 1426 -> 1430 bytes + test/clip-group-shapes-circles.xlib.ref.png | Bin 0 -> 1534 bytes + ...-group-shapes-unaligned-rectangles.xlib.ref.png | Bin 0 -> 431 bytes + ...ip-stroke-unbounded.xlib-fallback.rgb24.ref.png | Bin 1429 -> 1437 bytes + test/clip-stroke-unbounded.xlib.argb32.ref.png | Bin 1792 -> 1785 bytes + test/clip-stroke-unbounded.xlib.rgb24.ref.png | Bin 1426 -> 1442 bytes + test/clip-stroke.xlib-fallback.ref.png | Bin 1490 -> 1491 bytes + test/clip-stroke.xlib.ref.png | Bin 1490 -> 1491 bytes + test/clipped-group.xlib.ref.png | Bin 0 -> 289 bytes + test/coverage-rectangles.xlib.xfail.png | Bin 0 -> 15981 bytes + test/finer-grained-fallbacks.xlib-fallback.ref.png | Bin 0 -> 919 bytes + test/finer-grained-fallbacks.xlib.ref.png | Bin 1111 -> 1110 bytes + test/finer-grained-fallbacks.xlib.rgb24.ref.png | Bin 1114 -> 856 bytes + test/ft-text-vertical-layout-type1.xlib.ref.png | Bin 3639 -> 3625 bytes + test/ft-text-vertical-layout-type3.xlib.ref.png | Bin 3605 -> 3597 bytes + test/leaky-dashed-rectangle.xlib.ref.png | Bin 347 -> 344 bytes + test/linear-gradient-subset.xlib.ref.png | Bin 0 -> 782 bytes + test/pthread-show-text.xlib-fallback.ref.png | Bin 0 -> 42073 bytes + ...m-intersections-curves-nz.xlib-fallback.ref.png | Bin 264288 -> 264277 bytes + test/random-intersections-curves-nz.xlib.ref.png | Bin 264288 -> 264277 bytes + test/recording-surface-pattern.xlib.argb32.ref.png | Bin 0 -> 3055 bytes + test/recording-surface-pattern.xlib.rgb24.ref.png | Bin 0 -> 3124 bytes + test/scale-offset-image.xlib-fallback.xfail.png | Bin 8706 -> 8686 bytes + test/scale-offset-image.xlib.ref.png | Bin 0 -> 9136 bytes + test/scale-offset-image.xlib.xfail.png | Bin 9132 -> 0 bytes + test/scale-offset-similar.xlib-fallback.xfail.png | Bin 8706 -> 8686 bytes + test/scale-offset-similar.xlib.xfail.png | Bin 8696 -> 8698 bytes + test/self-intersecting.xlib.ref.png | Bin 252 -> 208 bytes + test/smask-text.xlib-fallback.ref.png | Bin 0 -> 1874 bytes + test/smask.xlib-fallback.ref.png | Bin 0 -> 3423 bytes + test/subsurface.xlib.ref.png | Bin 0 -> 1782 bytes + test/text-rotate.xlib-fallback.ref.png | Bin 0 -> 16592 bytes + 35 files changed, 19 insertions(+), 7 deletions(-) + +commit a049889c64131b170b66ed8906309f6adee80fa5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 21:26:26 2010 +0100 + + pattern: Remove incorrect optimisations from _cairo_pattern_aquire_surface() + + Safe reduction of patterns is performed in gstate, so not only are the + extra checks in _cairo_pattern_acquire_surface redundant there are also + unsafe. Simply remove them. + + Fixes test/radial-gradient-extend [xlib-fallback] + + src/cairo-pattern.c | 110 ++++++++-------------------------------------------- + 1 file changed, 17 insertions(+), 93 deletions(-) + +commit 00bc1d1578dc2640db64315270b00073697fb9fa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 20:31:29 2010 +0100 + + pattern: Remove extraordinary _cairo_pattern_fini_snapshot(). + + Miraculously the circular references from self-copy have disappeared and + the forced finish within _cairo_pattern_fini_snapshot() now quite + explosive. By replacing them with an ordinary _cairo_pattern_fini() the + crash from test/smask-image-mask disappear along and valgrind remains + happy. + + Fixes test/smask-image-mask and similar. + + src/cairo-pattern.c | 17 ----------------- + src/cairo-recording-surface.c | 24 ++++++++++++------------ + src/cairoint.h | 3 --- + 3 files changed, 12 insertions(+), 32 deletions(-) + +commit 1098e203dc21529f138bfabfa7558f61b8427ea0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 18:07:28 2010 +0100 + + test: pdf ref image refresh + + test/Makefile.am | 11 +++++++++++ + test/clear-source.pdf.xfail.png | Bin 0 -> 974 bytes + test/clip-fill-unbounded.pdf.argb32.ref.png | Bin 0 -> 1244 bytes + test/clip-stroke-unbounded.pdf.argb32.xfail.png | Bin 0 -> 1351 bytes + test/clip-unbounded.pdf.argb32.xfail.png | Bin 0 -> 95 bytes + test/clip-unbounded.pdf.rgb24.xfail.png | Bin 0 -> 95 bytes + test/filter-nearest-offset.pdf.xfail.png | Bin 2152 -> 4522 bytes + test/filter-nearest-transformed.pdf.xfail.png | Bin 532 -> 532 bytes + test/pthread-show-text.pdf.ref.png | Bin 0 -> 47015 bytes + test/radial-gradient-source.pdf.argb32.ref.png | Bin 0 -> 235290 bytes + test/rotate-image-surface-paint.pdf.xfail.png | Bin 358 -> 442 bytes + test/scale-source-surface-paint.pdf.argb32.xfail.png | Bin 0 -> 157 bytes + test/scale-source-surface-paint.pdf.rgb24.xfail.png | Bin 0 -> 152 bytes + test/surface-pattern-operator.pdf.argb32.xfail.png | Bin 0 -> 5485 bytes + test/surface-pattern-operator.pdf.rgb24.xfail.png | Bin 0 -> 2095 bytes + 15 files changed, 11 insertions(+) + +commit 1c91d019c54afde0edb022312491b086588ce6c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 17:47:08 2010 +0100 + + test: ps ref image refresh. + + Update to gs-8.71 and some additional reference images for the new tests. + + test/Makefile.am | 116 ++++++++++++--------- + test/README | 2 +- + test/big-line.ps.ref.png | Bin 0 -> 946 bytes + test/bug-bo-rectangular.ps.xfail.png | Bin 0 -> 945 bytes + test/caps-joins-curve.ps.ref.png | Bin 3728 -> 3715 bytes + test/caps-joins.ps.ref.png | Bin 2282 -> 2268 bytes + test/caps-sub-paths.ps.ref.png | Bin 0 -> 163 bytes + test/caps.ps.ref.png | Bin 1466 -> 1478 bytes + test/clear-source.ps.xfail.png | Bin 0 -> 552 bytes + test/clip-disjoint.ps.ref.png | Bin 0 -> 4680 bytes + test/clip-fill-rule.ps.argb32.ref.png | Bin 0 -> 251 bytes + test/clip-fill-rule.ps.rgb24.ref.png | Bin 0 -> 234 bytes + test/clip-fill-rule.ps2.argb32.ref.png | Bin 310 -> 0 bytes + test/clip-fill-rule.ps2.rgb24.ref.png | Bin 302 -> 0 bytes + test/clip-fill-rule.ps3.argb32.ref.png | Bin 310 -> 0 bytes + test/clip-fill-rule.ps3.rgb24.ref.png | Bin 302 -> 0 bytes + test/clip-fill-unbounded.ps.argb32.xfail.png | Bin 0 -> 1244 bytes + test/clip-image.ps.ref.png | Bin 0 -> 2498 bytes + test/clip-nesting.ps.argb32.ref.png | Bin 0 -> 441 bytes + test/clip-nesting.ps.rgb24.ref.png | Bin 0 -> 492 bytes + test/clip-nesting.ps2.argb32.ref.png | Bin 651 -> 0 bytes + test/clip-nesting.ps2.rgb24.ref.png | Bin 636 -> 0 bytes + test/clip-nesting.ps3.argb32.ref.png | Bin 651 -> 0 bytes + test/clip-nesting.ps3.rgb24.ref.png | Bin 636 -> 0 bytes + test/clip-push-group.ps.ref.png | Bin 0 -> 120 bytes + test/clip-push-group.ps2.argb32.ref.png | Bin 179 -> 0 bytes + test/clip-push-group.ps2.rgb24.ref.png | Bin 179 -> 0 bytes + test/clip-push-group.ps3.argb32.ref.png | Bin 179 -> 0 bytes + test/clip-push-group.ps3.rgb24.ref.png | Bin 179 -> 0 bytes + test/clip-stroke-unbounded.ps.argb32.ref.png | Bin 0 -> 1351 bytes + test/clip-stroke.ps.xfail.png | Bin 0 -> 662 bytes + test/clip-twice.ps.argb32.ref.png | Bin 0 -> 492 bytes + test/clip-twice.ps.rgb24.ref.png | Bin 0 -> 409 bytes + test/clip-twice.ps2.argb32.ref.png | Bin 575 -> 0 bytes + test/clip-twice.ps2.rgb24.ref.png | Bin 541 -> 0 bytes + test/clip-twice.ps3.argb32.ref.png | Bin 575 -> 0 bytes + test/clip-twice.ps3.rgb24.ref.png | Bin 541 -> 0 bytes + test/clipped-group.ps2.ref.png | Bin 343 -> 214 bytes + test/clipped-group.ps3.ref.png | Bin 343 -> 214 bytes + test/copy-path.ps.ref.png | Bin 0 -> 379 bytes + test/copy-path.ps2.ref.png | Bin 474 -> 0 bytes + test/copy-path.ps3.ref.png | Bin 474 -> 0 bytes + test/dash-caps-joins.ps.ref.png | Bin 0 -> 3669 bytes + test/dash-caps-joins.ps2.argb32.ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins.ps2.rgb24.ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins.ps3.argb32.ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins.ps3.rgb24.ref.png | Bin 3870 -> 0 bytes + test/dash-curve.ps2.ref.png | Bin 27293 -> 24355 bytes + test/dash-curve.ps3.ref.png | Bin 27293 -> 24355 bytes + test/dash-infinite-loop.ps.ref.png | Bin 0 -> 617 bytes + test/dash-scale.ps.ref.png | Bin 0 -> 5965 bytes + test/dash-scale.ps2.argb32.ref.png | Bin 6318 -> 0 bytes + test/dash-scale.ps2.rgb24.ref.png | Bin 6316 -> 0 bytes + test/dash-scale.ps3.argb32.ref.png | Bin 6318 -> 0 bytes + test/dash-scale.ps3.rgb24.ref.png | Bin 6316 -> 0 bytes + test/dash-state.ps2.ref.png | Bin 10219 -> 8740 bytes + test/dash-state.ps3.ref.png | Bin 10219 -> 8740 bytes + test/degenerate-arc.ps2.ref.png | Bin 585 -> 509 bytes + test/degenerate-arc.ps3.ref.png | Bin 585 -> 509 bytes + test/degenerate-curve-to.ps.xfail.png | Bin 202 -> 221 bytes + test/degenerate-dash.ps.xfail.png | Bin 1835 -> 1837 bytes + test/degenerate-path.ps.argb32.xfail.png | Bin 236 -> 234 bytes + test/degenerate-path.ps.rgb24.xfail.png | Bin 186 -> 184 bytes + test/degenerate-pen.ps.ref.png | Bin 0 -> 759 bytes + test/degenerate-pen.ps2.ref.png | Bin 865 -> 0 bytes + test/degenerate-pen.ps3.ref.png | Bin 865 -> 0 bytes + test/degenerate-rel-curve-to.ps.ref.png | Bin 0 -> 225 bytes + test/degenerate-rel-curve-to.ps.xfail.png | Bin 202 -> 0 bytes + test/fill-and-stroke.ps.argb32.ref.png | Bin 0 -> 257 bytes + test/fill-and-stroke.ps.rgb24.ref.png | Bin 0 -> 225 bytes + test/fill-and-stroke.ps2.argb32.ref.png | Bin 310 -> 0 bytes + test/fill-and-stroke.ps2.rgb24.ref.png | Bin 319 -> 0 bytes + test/fill-and-stroke.ps3.argb32.ref.png | Bin 310 -> 0 bytes + test/fill-and-stroke.ps3.rgb24.ref.png | Bin 319 -> 0 bytes + .../fill-degenerate-sort-order.ps.argb32.xfail.png | Bin 1901 -> 1903 bytes + test/fill-degenerate-sort-order.ps.rgb24.xfail.png | Bin 1645 -> 1638 bytes + test/fill-image.ps.ref.png | Bin 1799 -> 1645 bytes + test/fill-rule.ps2.argb32.ref.png | Bin 2253 -> 1878 bytes + test/fill-rule.ps2.rgb24.ref.png | Bin 2031 -> 1524 bytes + test/fill-rule.ps3.argb32.ref.png | Bin 2253 -> 1878 bytes + test/fill-rule.ps3.rgb24.ref.png | Bin 2031 -> 1524 bytes + test/finer-grained-fallbacks.ps2.argb32.ref.png | Bin 1173 -> 1168 bytes + test/finer-grained-fallbacks.ps2.rgb24.ref.png | Bin 1154 -> 936 bytes + test/finer-grained-fallbacks.ps3.argb32.ref.png | Bin 1173 -> 1168 bytes + test/finer-grained-fallbacks.ps3.rgb24.ref.png | Bin 1154 -> 936 bytes + test/ft-text-vertical-layout-type1.ps.ref.png | Bin 1634 -> 2088 bytes + test/ft-text-vertical-layout-type3.ps.ref.png | Bin 1636 -> 2134 bytes + test/group-unaligned.ps.ref.png | Bin 332 -> 321 bytes + test/group-unaligned.ps.rgb24.xfail.png | Bin 0 -> 371 bytes + test/implicit-close.ps.ref.png | Bin 0 -> 252 bytes + test/joins.ps.ref.png | Bin 5496 -> 4230 bytes + test/leaky-dashed-rectangle.ps.ref.png | Bin 444 -> 358 bytes + test/leaky-dashed-stroke.ps.ref.png | Bin 0 -> 5293 bytes + test/leaky-dashed-stroke.ps2.ref.png | Bin 5511 -> 0 bytes + test/leaky-dashed-stroke.ps3.ref.png | Bin 5511 -> 0 bytes + test/leaky-polygon.ps.ref.png | Bin 0 -> 289 bytes + test/leaky-polygon.ps2.ref.png | Bin 354 -> 0 bytes + test/leaky-polygon.ps3.ref.png | Bin 354 -> 0 bytes + test/line-width-scale.ps2.ref.png | Bin 3911 -> 3431 bytes + test/line-width-scale.ps3.ref.png | Bin 3911 -> 3431 bytes + test/linear-gradient-subset.ps3.ref.png | Bin 0 -> 619 bytes + test/long-dashed-lines.ps2.ref.png | Bin 1516 -> 1329 bytes + test/long-dashed-lines.ps3.ref.png | Bin 1516 -> 1329 bytes + test/new-sub-path.ps2.argb32.ref.png | Bin 556 -> 398 bytes + test/new-sub-path.ps3.argb32.ref.png | Bin 556 -> 398 bytes + test/operator-alpha-alpha.ps.xfail.png | Bin 1338 -> 3429 bytes + test/over-around-source.ps2.argb32.ref.png | Bin 522 -> 508 bytes + test/over-around-source.ps3.argb32.ref.png | Bin 522 -> 508 bytes + test/over-below-source.ps2.argb32.ref.png | Bin 503 -> 368 bytes + test/over-below-source.ps2.rgb24.ref.png | Bin 0 -> 362 bytes + test/over-below-source.ps3.argb32.ref.png | Bin 503 -> 368 bytes + test/over-below-source.ps3.rgb24.ref.png | Bin 0 -> 362 bytes + test/path-append.ps.ref.png | Bin 4516 -> 4525 bytes + test/pixman-rotate.ps.argb32.ref.png | Bin 0 -> 355 bytes + test/push-group-color.ps3.ref.png | Bin 0 -> 2561 bytes + test/random-intersections-curves-eo.ps.ref.png | Bin 151676 -> 151668 bytes + test/random-intersections-curves-nz.ps.ref.png | Bin 134732 -> 134746 bytes + test/random-intersections-eo.ps.ref.png | Bin 78806 -> 78037 bytes + test/random-intersections-nonzero.ps.ref.png | Bin 77299 -> 76450 bytes + test/recording-surface-pattern.ps.argb32.ref.png | Bin 0 -> 3064 bytes + test/recording-surface-pattern.ps.rgb24.ref.png | Bin 0 -> 3147 bytes + test/recording-surface-pattern.ps2.argb32.ref.png | Bin 3257 -> 0 bytes + test/recording-surface-pattern.ps2.rgb24.ref.png | Bin 3873 -> 0 bytes + test/recording-surface-pattern.ps3.argb32.ref.png | Bin 3257 -> 0 bytes + test/recording-surface-pattern.ps3.rgb24.ref.png | Bin 3873 -> 0 bytes + test/reflected-stroke.ps.ref.png | Bin 0 -> 3368 bytes + test/reflected-stroke.ps2.ref.png | Bin 3898 -> 0 bytes + test/reflected-stroke.ps3.ref.png | Bin 3898 -> 0 bytes + test/rounded-rectangle-fill.ps.ref.png | Bin 0 -> 551 bytes + test/rounded-rectangle-stroke.ps.ref.png | Bin 0 -> 568 bytes + test/scale-offset-image.ps.ref.png | Bin 7289 -> 7697 bytes + test/spline-decomposition.ps.ref.png | Bin 9028 -> 8939 bytes + test/stroke-image.ps.ref.png | Bin 1641 -> 1682 bytes + test/subsurface.ps.ref.png | Bin 0 -> 1651 bytes + test/surface-pattern-big-scale-down.ps.ref.png | Bin 0 -> 235 bytes + test/surface-pattern-big-scale-down.ps.xfail.png | Bin 238 -> 0 bytes + test/text-glyph-range.ps.ref.png | Bin 0 -> 1253 bytes + test/text-glyph-range.ps2.ref.png | Bin 1389 -> 0 bytes + test/text-glyph-range.ps3.ref.png | Bin 1389 -> 0 bytes + test/text-rotate.ps.ref.png | Bin 0 -> 8765 bytes + test/text-rotate.ps2.ref.png | Bin 6851 -> 0 bytes + test/text-rotate.ps3.ref.png | Bin 6851 -> 0 bytes + test/text-transform.ps.ref.png | Bin 0 -> 3430 bytes + test/text-transform.ps2.ref.png | Bin 4154 -> 0 bytes + test/text-transform.ps3.ref.png | Bin 4154 -> 0 bytes + test/trap-clip.ps2.argb32.ref.png | Bin 4849 -> 4839 bytes + test/trap-clip.ps2.rgb24.ref.png | Bin 5617 -> 4729 bytes + test/trap-clip.ps3.argb32.ref.png | Bin 5591 -> 4751 bytes + test/trap-clip.ps3.rgb24.ref.png | Bin 5512 -> 4553 bytes + test/twin.ps.ref.png | Bin 2142 -> 2136 bytes + test/user-font-proxy.ps.ref.png | Bin 7766 -> 7837 bytes + test/user-font-rescale.ps.ref.png | Bin 0 -> 6781 bytes + test/user-font-rescale.ps2.ref.png | Bin 8041 -> 0 bytes + test/user-font-rescale.ps3.ref.png | Bin 8041 -> 0 bytes + test/xlib-expose-event.ps.ref.png | Bin 0 -> 39035 bytes + 155 files changed, 65 insertions(+), 53 deletions(-) + +commit 1a544361e845e4881990624a597f9dc2b82d1c73 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 16:04:41 2010 +0100 + + gstate: Update cached matrix state after device transform changes on the target + + Commit 8d67186cb291cb877e52b987e2ac18c2a1175a57 caches whether the device + transform is identity on context creation. However, the api is quite lax + and allows the user to modify the device transform *after* he has + started to use the surface in a context, as apparently WebKit does. + Since this is not the only instance where we may need to invalidate + caches if the user modifies state, introduce a simple mechanism for + hooking into notifications of property changes. + + Fixes test/clip-device-offset. + + src/Makefile.sources | 1 + + src/cairo-gstate-private.h | 3 +++ + src/cairo-gstate.c | 28 +++++++++++++++++++++---- + src/cairo-observer.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-surface-private.h | 1 + + src/cairo-surface.c | 6 ++++++ + src/cairo-types-private.h | 6 ++++++ + src/cairoint.h | 5 +++++ + 8 files changed, 96 insertions(+), 4 deletions(-) + +commit f74b11415a1f7682dd50c222baa8815ef93681dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 14:06:15 2010 +0100 + + test: Use a group to render PDF correctly using poppler. + + In order to support blend modes, we need to use a clear background + whilst rendering the PDF, which inspired the use of DEST_OVER to avoid + having to render to an intermediate surface. However, the adjunct of + using subpixel text means that we cannot simply using the alpha channel + as the sole mask and so need to render to an intermediate and paint it + over an opaque background. + + test/any2ppm.c | 9 ++++++--- + test/pdf2png.c | 9 ++++++--- + 2 files changed, 12 insertions(+), 6 deletions(-) + +commit 7f227ec8d3f981dbbf2ca1914bf7fd29d9cdfd05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 12:54:15 2010 +0100 + + Revert "test/pdf2png: Don't use DEST_OVER as poppler starts using subpixel text." + + This reverts commit 506b2ebe714d61a64972b607a42a55e48d1c722a. + + We have conflicting requirements here. In order to support extended + blend modes correctly we need to use DEST_OVER, at the expense of + supporting subpixel text. More thought required. + + test/any2ppm.c | 9 +++++---- + test/pdf2png.c | 10 +++++----- + 2 files changed, 10 insertions(+), 9 deletions(-) + +commit c761e0c5bb55e8869521ad5b4a2447ea9abcb4d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 12:40:36 2010 +0100 + + test: Restrict the coverage tests to raster targets. + + Typo inside the requirements failed to prevent the tests running on the + vector backends. + + test/coverage.c | 4 ++-- + test/half-coverage.c | 4 ++-- + test/partial-coverage.c | 18 +++++++++--------- + 3 files changed, 13 insertions(+), 13 deletions(-) + +commit b49c944fe4abb9f3c70fac02a71061bf8d07259a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 12:38:17 2010 +0100 + + test: Add a convenience script to disable the screensaver when testing + + If the screensaver activates, it can cause failures when attempting to + render into an xlib window, so inhibit if we know how. + + test/Makefile.am | 2 +- + test/run-cairo-test-suite.sh | 18 ++++++++++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +commit 4e4724d48c63d0cd4ec507ce72dcc55fb6e5f584 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 12:19:56 2010 +0100 + + gl: make check insists "cairoint.h" is first. + + src/cairo-gl-gradient.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 4edbcf1b1d046c9c626a0c0ad10d3c71f17984f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 12:17:19 2010 +0100 + + color: Mark _cairo_color_get_content() as private. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 506b2ebe714d61a64972b607a42a55e48d1c722a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 12:04:39 2010 +0100 + + test/pdf2png: Don't use DEST_OVER as poppler starts using subpixel text. + + Using DEST_OVER in this form to paint the background white fails in the + presence of subpixel geometry (particular text), so remove the hack and + simply paint the background white prior to passing the surface to + poppler. KISS. + + test/any2ppm.c | 9 ++++----- + test/pdf2png.c | 10 +++++----- + 2 files changed, 9 insertions(+), 10 deletions(-) + +commit edb73b6dcf1adce40d6c10c492e3f78556e22b85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 11:16:42 2010 +0100 + + xlib: Adjust trapezoid precision based on antialias. + + Render supports two modes of precision when rendering trapezoids. + Precise specifies points sampling on a 15x17 grid, ala pixman. Imprecise + allows the driver more freedom in the methods used, which may be more + amenable to acceleration. Choose to use the imprecise mode by default, + but still allow users to force the more rigidly specified precision by + changing the antialias mode. + + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 31 +++++++++++++++++++++++++++++++ + 2 files changed, 32 insertions(+) + +commit 290749bdb5c634c030db81722214661c34344403 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 10:59:17 2010 +0100 + + polygon: Reorder conditionals based on likelihood. + + The vast majority of edges will be unclipped, so process those first. + + src/cairo-polygon.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 55037bfb2454a671332d961e061c712ab5471580 +Author: Karl Tomlinson <karlt+@karlt.net> +Date: Fri Jun 11 10:35:43 2010 +0100 + + xlib: Find matching Visual for XRenderFormat + + Not only is this useful for users to know which Visual matches any + particular Cairo surface, it should also close a few obscure bugs of not + converting images correctly on upload. + + Fixes: + + Bug 28492 - cairo_xlib_surface_create_with_xrender_format does not + create visual for resulting surface + https://bugs.freedesktop.org/show_bug.cgi?id=28492 + + Mozilla Bug 567065 - Try to create offscreen Xlib surface from existing + visual if possible + https://bugzilla.mozilla.org/show_bug.cgi?id=567065 + + Mozilla Bug 445250 - cairo_draw_with_xlib should provide a non-NULL visual + to callback + https://bugzilla.mozilla.org/show_bug.cgi?id=445250 + + Reported-by: Oleg Romashin <romaxa@gmail.com> + + src/cairo-xlib-surface.c | 74 ++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 65 insertions(+), 9 deletions(-) + +commit cf426bce8ebd3aff5d50c6a54bbd731132b3d312 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 10:05:09 2010 +0100 + + test: Add a simple coverage test. + + This test case should be much clearer than half-coverage over what it + purports to actually test. In each pixel, it draws a single geometric + primitive that coverages a known percentage of the pixel and then we + measure how close the rasterisers are to that ideal. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/coverage-rectangles.ref.png | Bin 0 -> 259 bytes + test/coverage-triangles.ref.png | Bin 0 -> 253 bytes + test/coverage.c | 135 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 138 insertions(+) + +commit bd3d9ef3d1dbc5364e79e6afb47d9e124cb61ca4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 09:12:16 2010 +0100 + + test: Distinguish tests that throw an error from a normal fail. + + Hitting an error in a test case is almost as bad as crashing, and the + severity may be lost amidst "normal" failures. So introduce a new class + of ERROR so that we can immediately spot these during a test run, and + appropriately log them afterwards. + + test/cairo-test-runner.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++-- + test/cairo-test.c | 20 ++++++++++- + test/cairo-test.h | 1 + + 3 files changed, 107 insertions(+), 3 deletions(-) + +commit eeafeebd2ec8ad8a9e7053aaaa0f845b58563b3b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 11 09:06:20 2010 +0100 + + path: Exponentially grow buffer based on populated points and ops. + + Instead of simply doubling the buffer size every time we overflow a point + or an op, enlarge the buffer to fit twice the number of used points and + ops. We expect paths to be fairly consistent in the mix of operations, + and this allows the buffer size to tune itself to actual usage and reduce + wastage. + + src/cairo-path-fixed-private.h | 3 ++- + src/cairo-path-fixed.c | 39 +++++++++++++++++++-------------------- + 2 files changed, 21 insertions(+), 21 deletions(-) + +commit b0056a86b4f6c92fa7eb89baf8483a46979c8cf1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 10 18:27:22 2010 +0100 + + test: Exercise partial coverage some more. + + Add some overlapping triangles (coarse enough for them to be resolved + using Cairo's 24.8 fixed point without loss of precision) to exercise + handling of overlapping subpixel geometry. + + test/Makefile.am | 4 + + ...tial-coverage-overlap-half-triangles-eo.ref.png | Bin 0 -> 189 bytes + ...partial-coverage-overlap-half-triangles.ref.png | Bin 0 -> 189 bytes + ...overage-overlap-three-quarter-triangles.ref.png | Bin 0 -> 186 bytes + ...artial-coverage-three-quarter-reference.ref.png | Bin 0 -> 186 bytes + test/partial-coverage.c | 284 +++++++++++++++++++-- + 6 files changed, 269 insertions(+), 19 deletions(-) + +commit 836f6166597eaa687b10e5f26fe71e099c434aa1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 9 19:09:22 2010 +0200 + + gl: support single stop gradients + + src/cairo-gl-gradient-private.h | 2 +- + src/cairo-gl-gradient.c | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit d17e2c5e23eac302b7463a08205088147da1172a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 10 10:52:16 2010 +0200 + + ps: support single stop gradients + + src/cairo-ps-surface.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit eb7fc351156bd66921ac3b3ffbd1fba6ba743ffb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 10 10:51:50 2010 +0200 + + pdf: support single stop gradients + + src/cairo-pdf-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e2660a0eac5f6081bf052db16b8bd85c814d19d8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 9 16:59:29 2010 +0200 + + pattern: improve single stop gradients handling + + None-extended single stop gradients are now explicitly made clear. + + src/cairo-pattern.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 7a024bc206aae790c7357be83474126037335ab1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 9 17:59:47 2010 +0200 + + test: exercise ps crash with single stop gradients + + PS crashes only when using the source operator, as it will otherwise + fallback to rasterization of the gradients. + + test/linear-gradient-one-stop.argb32.ref.png | Bin 0 -> 225 bytes + test/linear-gradient-one-stop.c | 2 +- + test/linear-gradient-one-stop.ref.png | Bin 344 -> 0 bytes + test/linear-gradient-one-stop.rgb24.ref.png | Bin 0 -> 174 bytes + test/radial-gradient-one-stop.argb32.ref.png | Bin 0 -> 1392 bytes + test/radial-gradient-one-stop.c | 2 +- + test/radial-gradient-one-stop.ref.png | Bin 1422 -> 0 bytes + test/radial-gradient-one-stop.rgb24.ref.png | Bin 0 -> 1153 bytes + 8 files changed, 2 insertions(+), 2 deletions(-) + +commit a0f8cfe64660c0043db15f9b9cbf1298bf1838d1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 8 17:04:00 2010 +0200 + + pattern: improve degenerate gradients handling + + Degenerate radial gradients are now considered clear. + + src/cairo-pattern.c | 35 +++++++++++++++++++++++++---------- + 1 file changed, 25 insertions(+), 10 deletions(-) + +commit bccd89b4177b5f5bd05def9bee5f0927a9f25e4a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 8 15:45:09 2010 +0200 + + gstate: correct optimizations + + Gradient were previously hand-optimized (without properly checking + for extend modes). By properly using _cairo_pattern functions we + avoid code duplication and bugs. + + Fixes linear-gradient-extend, radial-gradient-extend. + + src/cairo-gstate.c | 85 +++++++++++------------------------------------------- + 1 file changed, 17 insertions(+), 68 deletions(-) + +commit 06c6207ad4205f211be70e324c6d32ea7d28dca8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 1 19:40:14 2010 +0200 + + pattern: add gradient_is_solid function + + It contains in a single place the logic needed to check if a gradient + pattern is solid (within a specified region). + + src/cairo-pattern.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 5 +++++ + 2 files changed, 58 insertions(+) + +commit 561625ee3bd2732457eaaf28937edf557ee7661d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 1 19:39:02 2010 +0200 + + pattern: improve clear/opaque check functions + + _cairo_pattern_is_opaque was missing some checks about the extend type. + Conversely _cairo_pattern_is_clear was being too strict about gradients. + + src/cairo-pattern.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++---- + src/cairoint.h | 4 ++ + 2 files changed, 108 insertions(+), 8 deletions(-) + +commit baaf312e047a9bea6f54e63cd6534c2ed7448523 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Apr 19 09:53:00 2010 +0200 + + pattern: remove content field from solid patterns + + The content field in solid patterns had ill-defined semantic (or no + semantic at all), thus it can be removed. + + src/cairo-color.c | 16 ++++++++++++++++ + src/cairo-gl-surface.c | 2 +- + src/cairo-gstate.c | 14 +++++--------- + src/cairo-pattern.c | 37 ++++++++++--------------------------- + src/cairo-script-surface.c | 9 +++------ + src/cairo-surface.c | 4 ++-- + src/cairo-types-private.h | 1 - + src/cairo-xlib-surface.c | 6 +++--- + src/cairo.c | 4 ++-- + src/cairoint.h | 9 +++++---- + 10 files changed, 47 insertions(+), 55 deletions(-) + +commit 7461947eb1a5f002a5931303843a5a2deca0e383 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Apr 19 09:51:26 2010 +0200 + + surface: remove content argument from is_similar + + The content argument was basically unuses. + + Xlib change extracted from ickle's wip/compositor branch. + + src/cairo-directfb-surface.c | 2 +- + src/cairo-pattern.c | 5 ++--- + src/cairo-surface.c | 5 ++--- + src/cairo-win32-surface.c | 3 +-- + src/cairo-xlib-surface.c | 30 ++---------------------------- + src/cairoint.h | 6 ++---- + 6 files changed, 10 insertions(+), 41 deletions(-) + +commit ef5f9b5c61750207947587173d21b46e2d299f33 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 10 14:13:53 2010 +0100 + + test: Update partial coverage. + + Gah, no wonder the output looked wrong for the triangles, they only + covered half the pixel. So separate triangles into two cases. + + test/Makefile.am | 2 + + test/partial-coverage-half-reference.ref.png | Bin 0 -> 189 bytes + test/partial-coverage-half-triangles.ref.png | Bin 0 -> 189 bytes + test/partial-coverage.c | 98 +++++++++++++++++++++++++-- + 4 files changed, 96 insertions(+), 4 deletions(-) + +commit 8d67186cb291cb877e52b987e2ac18c2a1175a57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 10 11:36:58 2010 +0100 + + gstate: Track whether the combination of ctm * device is identity. + + In the fairly common condition that both the ctm and the device + transforms are identity, the function overhead of calling the matrix + multiplication on the point overwhelmingly dominates. + + src/cairo-clip.c | 1 + + src/cairo-gstate-private.h | 310 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gstate.c | 18 ++- + src/cairoint.h | 295 ------------------------------------------ + 4 files changed, 327 insertions(+), 297 deletions(-) + +commit 1349728d1ef63ed562a3fd0ee3c0a89aaba77616 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 10 11:26:12 2010 +0100 + + test: Add partial coverage. + + Another experiment in measuring consistency of rasterisation stratagems + across the backends. + + test/Makefile.am | 3 + + test/Makefile.sources | 1 + + test/partial-coverage-rectangles.ref.png | Bin 0 -> 202 bytes + test/partial-coverage-reference.ref.png | Bin 0 -> 202 bytes + test/partial-coverage-triangles.ref.png | Bin 0 -> 202 bytes + test/partial-coverage.c | 213 +++++++++++++++++++++++++++++++ + 6 files changed, 217 insertions(+) + +commit 486118361ad0c2e68fa9f6b44ddb10e84d237eca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 10 11:28:26 2010 +0100 + + test: Fix half-coverage colouration. + + Hmm, red over red makes the test pointless. The test still remains of + highly dubious quality, as it primarily serves as a rendercheck more + than a test of Cairo. The best hope for this test is that it inspires a + better one. + + And incorporate the notes made by Joonas. + + test/half-coverage.c | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit 5cb764850f7c405085739647bac2809045e7cdf3 +Author: Dmitri Vorobiev <dmitri.vorobiev@movial.com> +Date: Wed Jun 9 19:20:27 2010 +0300 + + scaled-font: optimize cairo_scaled_font_text_to_glyphs() + + This patch serves two purposes. First, it factors out the heavy part + of the cairo_scaled_font_text_to_glyphs() routine thus allowing GCC + to better optimize the cache cleanup loop. Keeping the look-up table + indices in a separate array speeds up array initialization even further. + + Second, this patch introduces a shortcut for the case when the string + to be rendered consists of a single character. In this case, caching is + not necessary at all. + + We have a benchmark that uses Cairo to render a large amount of random + strings of consisting of printable ASCII characters. Below are Oprofile + results collected while running this benchmark. It is easy to see that + the heavy part becomes noticeably lighter. + + Before: + + Profiling through timer interrupt + samples % app name symbol name + 198755 13.5580 libcairo.so.2.10907.0 cairo_scaled_font_text_to_glyphs + 88580 6.0424 libcairo.so.2.10907.0 _cairo_scaled_glyph_lookup + 81127 5.5340 libcairo.so.2.10907.0 _cairo_hash_table_lookup + 68186 4.6513 libcairo.so.2.10907.0 cairo_scaled_font_glyph_extents + 47145 3.2160 libcairo.so.2.10907.0 _composite_glyphs_via_mask + 46327 3.1602 libcairo.so.2.10907.0 _cairo_scaled_font_glyph_device_extents + 44817 3.0572 libcairo.so.2.10907.0 _composite_glyphs + 40431 2.7580 libcairo.so.2.10907.0 .plt + + After (note that cairo_scaled_font_text_to_glyphs_internal_single() was inlined): + + Profiling through timer interrupt + samples % app name symbol name + 107264 7.6406 libcairo.so.2.10907.0 cairo_scaled_font_text_to_glyphs_internal_multiple + 87888 6.2604 libcairo.so.2.10907.0 _cairo_scaled_glyph_lookup + 79011 5.6281 libcairo.so.2.10907.0 _cairo_hash_table_lookup + 71723 5.1090 libcairo.so.2.10907.0 cairo_scaled_font_glyph_extents + 48084 3.4251 libcairo.so.2.10907.0 _composite_glyphs_via_mask + 46636 3.3220 libcairo.so.2.10907.0 _cairo_scaled_font_glyph_device_extents + 44740 3.1869 libcairo.so.2.10907.0 _composite_glyphs + 42472 3.0254 libc-2.8.so _int_malloc + 39194 2.7919 libcairo.so.2.10907.0 _cairo_gstate_transform_glyphs_to_backend + 38614 2.7506 libcairo.so.2.10907.0 .plt + 37063 2.6401 libcairo.so.2.10907.0 _cairo_ft_ucs4_to_index + 36856 2.6253 libc-2.8.so random + 36376 2.5911 libcairo.so.2.10907.0 _cairo_scaled_glyphs_equal + 34545 2.4607 libcairo.so.2.10907.0 cairo_matrix_transform_point + 31690 2.2573 libc-2.8.so malloc + 29395 2.0939 libcairo.so.2.10907.0 _cairo_matrix_is_identity + 26142 1.8621 libcairo.so.2.10907.0 _cairo_utf8_to_ucs4 + 24406 1.7385 libc-2.8.so free + 24059 1.7138 libcairo.so.2.10907.0 cairo_scaled_font_text_to_glyphs + + [ickle: slightly amended for stylistic consistency.] + + src/cairo-scaled-font.c | 168 ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 114 insertions(+), 54 deletions(-) + +commit c43399fa68696aa62599fb71752850dd46c15c82 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 9 17:53:09 2010 +0200 + + gl: fix compilation on MacOS X + + MacOS X uses different defines to avoid multiple inclusion of GL + header files. Adding them to glew.h fixes the compilation when GL is + enabled. + + src/glew/GL/glew.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6eb5f859f1d38783dc43541e7e87b0c5f91691d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 9 10:40:32 2010 +0100 + + bo: And disable DEBUG_TRAPS again. + + Meh. I'm going back to bed. Thanks Joonas for catching this. + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 85af0ec37456b4eb47c39326b24370a9ccc43092 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 9 10:33:29 2010 +0100 + + test: Add half-coverage to exercise the rasteriser with subpixel geometry. + + test/Makefile.sources | 1 + + test/half-coverage.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 130 insertions(+) + +commit 56c081bdc6d29df932e6993109586ff275d8de12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 9 10:33:01 2010 +0100 + + bo: Fix debugging for changes in internal traps api. + + src/cairo-bentley-ottmann.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit a946d39555136adc4eff3b68a62ba37f6d9a6299 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 8 21:09:51 2010 +0200 + + gl: Add support for clip regions to the span renderer + + Clip surface support is still missing, but i suppose that'd need a tiny + bit more code... + + src/cairo-gl-surface.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit f61b3f25aff454800a9d6013012d41633139d896 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 8 12:03:36 2010 +0200 + + gl: Add an assertion that we always have a texture + + When painting, the sources must be textures and not windows, and we did + that wrong previously. This assertion makes sure that never happens + again. + + src/cairo-gl-composite.c | 1 + + 1 file changed, 1 insertion(+) + +commit c6c9a24a1df1826cab78bd8ef1c5a1074bafa0d7 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 8 04:11:33 2010 +0200 + + gl: Use CAIRO_COLOR_BLACK + + ... instead of creating black on our own - and wrong, too. + + src/cairo-gl-surface.c | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +commit 19bc6793d1d9b209d5a03a727288504b1e71f7c4 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 8 04:00:02 2010 +0200 + + gl: Only clone texture surfaces + + Using non-texture surfaces as source or mask will fail, so we need to + fallback. + Caught by the subsurface-modify-child test. + + src/cairo-gl-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 44483d843e4fe1f5db5cf213f76913d683265bb4 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 8 03:59:10 2010 +0200 + + gl: Fix argument order + + oops... + + src/cairo-gl-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 72bf1a536775138d79787729994ec9cfe2193be7 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Jun 8 01:50:12 2010 +0200 + + Update my copyright notices to preferred version + + No more copyright headers containing my name. + + test/clear-source.c | 35 ++++++++++++++++++----------------- + test/clip-fill-no-op.c | 35 ++++++++++++++++++----------------- + test/clip-stroke-no-op.c | 35 ++++++++++++++++++----------------- + test/pthread-same-source.c | 35 ++++++++++++++++++----------------- + test/pthread-similar.c | 35 ++++++++++++++++++----------------- + test/xcomposite-projection.c | 35 ++++++++++++++++++----------------- + test/zero-mask.c | 35 ++++++++++++++++++----------------- + 7 files changed, 126 insertions(+), 119 deletions(-) + +commit 10d95c7020ca94903d474beb9c8ede89c186cbe3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 8 20:48:25 2010 +0200 + + test: add/update reference images + + Add missing reference images and update one-stop references according + to current subset policy (outside the defined range, the gradient + is clear). + + test/degenerate-linear-gradient.ref.png | Bin 0 -> 232 bytes + test/degenerate-radial-gradient.ref.png | Bin 0 -> 428 bytes + test/linear-gradient-one-stop.ref.png | Bin 468 -> 344 bytes + test/radial-gradient-one-stop.ref.png | Bin 3772 -> 1422 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit dd0f8872711d9896416cca2027f578f7d58d228f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jun 7 17:34:12 2010 +0200 + + test: fix typo + + test/linear-gradient-extend.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b88b5dce5327cbd13ea05de949c502fe41f91f7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 8 10:45:06 2010 +0200 + + test: add degenerate gradient and single stop tests + + Add tests for degeneratate linear gradients (with start point equal + to the end point), degenerate radial gradients (start radius and end + radius equal to zero, same start and end circle) and gradients (both + linear and radial) with just a single stop. + + test/Makefile.sources | 6 +- + test/degenerate-linear-gradient.c | 81 +++++++++++++++++++++++++ + test/degenerate-radial-gradient.c | 93 +++++++++++++++++++++++++++++ + test/linear-gradient-one-stop.c | 90 ++++++++++++++++++++++++++++ + test/linear-gradient-one-stop.ref.png | Bin 0 -> 468 bytes + test/radial-gradient-one-stop.c | 107 ++++++++++++++++++++++++++++++++++ + test/radial-gradient-one-stop.ref.png | Bin 0 -> 3772 bytes + 7 files changed, 376 insertions(+), 1 deletion(-) + +commit 7d8359721b581845260c0442a174e48b061484a7 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jun 7 16:46:46 2010 +0200 + + gl: Fix span renderer doing bad stuff for CLEAR and SOURCE + + SOURCE will fallback now, CLEAR is identical to DEST_OUT with white. + + src/cairo-gl-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit ef8fd1355ea03b8566ef31642b32133d3543e4e8 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jun 7 15:03:37 2010 +0200 + + gl: Fix span renderer for unbounded spans + + The span renderer used to not output rects for the top and bottom rows + when they didn't contain any spans. + + src/cairo-gl-surface.c | 72 ++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 49 insertions(+), 23 deletions(-) + +commit 1d11af083f5368c88032a33ff40d0e21c139db18 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jun 5 15:22:44 2010 +0200 + + gl: Add a simple spans renderer for stroke/fill + + It's very simple as clipped polygons or ANTIALIAS_NONE still return + UNSUPPORTED. Also, no optimizations are done, so even pixel-aligned + rectangles use the full span rendering. + + Still, there are no performance regressions in the benchmark traces and + firefox-talos-svg and swfdec-giant-steps both got ~15% faster. + + src/cairo-gl-surface.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 175 insertions(+), 3 deletions(-) + +commit 550335efeddf813c1bec493513254fdbd34a9ace +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jun 5 15:19:44 2010 +0200 + + Remove _cairo_surface_composite_trapezoids_as_polygon() + + The function computed the composite rectangles wrong and was only used + in a gl fallback anyway. So instead of trying to fix it, just remove it + and make sure gl doesn't fallback. + + src/cairo-gl-surface.c | 14 --------- + src/cairo-spans-private.h | 12 -------- + src/cairo-spans.c | 75 ----------------------------------------------- + src/cairoint.h | 12 -------- + 4 files changed, 113 deletions(-) + +commit 1e003fce8f7239aaf4608747d63287e0c715ee51 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jun 5 14:58:32 2010 +0200 + + gl: Fix vertex size changes not causing updates of the operands + + Check vertex size stays identical when setting up vertices. + + src/cairo-gl-composite.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit 39143400ddd0d4e63a72ce91c423f764e466e405 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Jun 4 12:25:52 2010 +0200 + + gl: Add a gradient texture cache + + For firefox-planet-gnome, 19135 times a gradient gets rendered using + only 10 different gradients. So we get a 100% hit rate in the cache. + Unfortunately, texture upload is not the biggest problem of this test, + as the performance increase is only moderate - at least on i965: + 34.3s => 33.5s + + src/cairo-gl-device.c | 12 ++++++++- + src/cairo-gl-gradient-private.h | 18 +++++++++---- + src/cairo-gl-gradient.c | 58 ++++++++++++++++++++++++++++++++++++++--- + src/cairo-gl-private.h | 2 ++ + 4 files changed, 81 insertions(+), 9 deletions(-) + +commit 932ab2641ea3183171c3b5699c96c4709fc6bd49 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jun 3 18:54:18 2010 +0200 + + device: flush before setting finished + + Otherwise APIs critical for flushing - in particular acquiring the + device - do not work. + + src/cairo-device.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 35e219d08f1c202399655db183ca0105a1c2166f +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jun 3 17:50:59 2010 +0200 + + gl: Make gradient textures a separate object + + This is necessary so we can do proper refcounting and don't delete the + gradient texture prematurely. + + src/Makefile.sources | 4 +- + src/cairo-gl-composite.c | 156 +++------------------------- + src/cairo-gl-gradient-private.h | 80 ++++++++++++++ + src/cairo-gl-gradient.c | 223 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 9 +- + 5 files changed, 327 insertions(+), 145 deletions(-) + +commit 9c17a477d29f633a4850ef8b458cbca82a19afc4 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jun 3 17:40:56 2010 +0200 + + gl: Use the generic functions for filter/extend in gradients + + src/cairo-gl-composite.c | 26 ++++++++------------------ + src/cairo-gl-private.h | 2 ++ + 2 files changed, 10 insertions(+), 18 deletions(-) + +commit df93802765afcf883abef5549bd5dff3465e2d79 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Jun 3 17:38:28 2010 +0200 + + gl: Create separate functions for setting extend and filter + + src/cairo-gl-composite.c | 47 ++++++++++++++++++++++++++++------------------- + 1 file changed, 28 insertions(+), 19 deletions(-) + +commit 10e71806d2e1929aa127642a397fa6ccef434b5b +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 20:04:57 2010 +0200 + + gl: Switch to deferred rendering + + 1) call _cairo_gl_composite_flush() or cairo_surface_flush() where + needed + 2) Destroy texture operands when necessary + 3) get rid of _cairo_gl_composite_end() + + With this patch, vertices are not flushed immediately anymore, but only + when needed or when a new set of vertices is emitted that requires an + incompatible setup. This improves performance a lot in particular for + text. (gnome-terminal-vim gets 10x faster) + + src/cairo-gl-composite.c | 40 ++++++++++++++++++++++------------------ + src/cairo-gl-glyphs.c | 4 ---- + src/cairo-gl-private.h | 4 ---- + src/cairo-gl-surface.c | 12 ++++++------ + 4 files changed, 28 insertions(+), 32 deletions(-) + +commit f2f79ca1b3455000df4138ab500ae03b6584250c +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 19:57:47 2010 +0200 + + gl: Make using shaders an explicit argument + + This is preparation for a followup patch + + src/cairo-gl-composite.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 19c1d8316e22fc37c7cdaf6c3e56519c06d10561 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 18:14:28 2010 +0200 + + gl: Special case blend mode for CAIRO_CONTENT_COLOR + + This ensures that alpha stays at 1 for RGB in all cases. + + src/cairo-gl-composite.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1f249064cc5c19a39ffe0faaa8825c8f8b6a2175 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 18:11:04 2010 +0200 + + gl: rework _cairo_gl_set_operator() + + 1) store the current operator. This will be useful later to check if the + operator changed. + 2) pass the context instead of the destination as first argument. The + destination is known to be the current target. + + src/cairo-gl-composite.c | 16 +++++++++------- + src/cairo-gl-device.c | 3 +++ + src/cairo-gl-private.h | 1 + + 3 files changed, 13 insertions(+), 7 deletions(-) + +commit f66500d8b052251ea3ce06f06d2fa4c8dec2ff3b +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 15:53:48 2010 +0200 + + gl: Only resetup textures if we need to + + src/cairo-gl-composite.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 45 insertions(+) + +commit d9dcafd61ad6aeecb4538e9fd44e3443a8a50bf1 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 15:26:45 2010 +0200 + + gl: Do not reset the current target on release + + This now also requires a call to cairo_device_flush(). + + src/cairo-gl-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce36be5c67fa5b574eb11eb98cdd8c9cd7e09335 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 15:23:57 2010 +0200 + + glx: When acquiring device, use the correct drawable + + src/cairo-glx-context.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 5819bb07eb7ac64f0e2fbe6a46cc3db0de1d92ce +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jun 2 15:23:08 2010 +0200 + + gl: Store the vertex offset in the operand + + src/cairo-gl-composite.c | 1 + + src/cairo-gl-private.h | 1 + + 2 files changed, 2 insertions(+) + +commit c75460c54d88ce9a50ac59c15a10684043ca4b0e +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 30 22:01:10 2010 +0200 + + gl: Introduce a temporary texture unit + + ...and use it for image uploads. This makes sure that the texture units + used for SOURCE and MASK get not clobbered when images get uploaded to + textures. + + src/cairo-gl-composite.c | 2 ++ + src/cairo-gl-device.c | 17 +++++++++++++++++ + src/cairo-gl-private.h | 8 +++++++- + src/cairo-gl-surface.c | 2 ++ + 4 files changed, 28 insertions(+), 1 deletion(-) + +commit 1ddff8aba35466fe6689536bc5f2d7eeefaea02c +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 30 21:25:20 2010 +0200 + + gl: Only allocate a framebuffer if we need one + + This way, we don't clobber the current target when creating textures for + image surfaces. + + src/cairo-gl-device.c | 26 ++++++++++++++++++++++++++ + src/cairo-gl-private.h | 2 +- + src/cairo-gl-surface.c | 20 ++------------------ + 3 files changed, 29 insertions(+), 19 deletions(-) + +commit 1c15510c3d00553aba9ec4fd4e6764da3cdb0a41 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 30 20:12:31 2010 +0200 + + Call cairo_surface_flush() before setting finished + + With the current code, the surface will never be flushed as the flush + function checks if the surface is finished, and if so, doesn't call the + vfunc. Ooops. + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 467d5e7f90b9edfb62ca71e67608704424a10aca +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 21:56:57 2010 +0200 + + gl: Flush properly in set_destination + + src/cairo-gl-device.c | 33 +++++++++++++++++---------------- + 1 file changed, 17 insertions(+), 16 deletions(-) + +commit e15348d8d0bbff6968b1f640e63315d159f143f5 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 21:55:26 2010 +0200 + + gl: Don't reset vertex size + + src/cairo-gl-composite.c | 10 ++++++---- + src/cairo-gl-device.c | 1 + + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit a8d6ac1efc3f1f5ff4f92f4e7a3492e62518f3f7 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 21:51:08 2010 +0200 + + gl: Remove check if we're between begin/end + + This will be useless soon, because we will keep the current state alive as + long as possible. + + src/cairo-gl-composite.c | 1 - + src/cairo-gl-private.h | 7 ------- + 2 files changed, 8 deletions(-) + +commit 8f675fb801f7864aa52778d4d53d7ab68f4e664b +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 21:46:52 2010 +0200 + + gl: Stop disabling the vertex array and the array buffer + + src/cairo-gl-composite.c | 12 ++++-------- + src/cairo-gl-device.c | 4 ++++ + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit bef0b541497eb5a621df0b5528e08adb0beff961 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 21:08:17 2010 +0200 + + gl: Do not reset shaders on _end() + + Instead, keep the shader around until cairo_device_flush() is called. + + src/cairo-gl-composite.c | 35 ++++++++++++++++++++++------------- + src/cairo-gl-device.c | 3 +++ + src/cairo-gl-private.h | 6 ++++++ + 3 files changed, 31 insertions(+), 13 deletions(-) + +commit 534c14729921cbc2f8e24575eb792de9ddb96e23 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 21:06:58 2010 +0200 + + region: clarify docs of cairo_region_equal() + + src/cairo-region.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 0fc6f08981604ffdd0109362dcbbd9773501cd9a +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 20:45:52 2010 +0200 + + gl: Make _shader_by_type() a getter + + And refactor code to do the current_shader assigning itself. + + src/cairo-gl-composite.c | 16 +++++++++++----- + src/cairo-gl-private.h | 5 +++-- + src/cairo-gl-shaders.c | 13 ++++++++----- + 3 files changed, 22 insertions(+), 12 deletions(-) + +commit 2971ca049881298cd171cf27cd3beb49d2c0572f +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 20:39:22 2010 +0200 + + gl: bind all shader variables at the same place + + Avoids the need to bind the shader when creating it. + + src/cairo-gl-composite.c | 26 ++++++++++++++++++++------ + src/cairo-gl-shaders.c | 11 ----------- + 2 files changed, 20 insertions(+), 17 deletions(-) + +commit e11d8370e0503f085beaa355d85fa6991cd497da +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 17:37:19 2010 +0200 + + gl: Set GL_BLEND and GL_SCISSOR_TEST globally + + Note that we do set them unconditionally in _begin() because a flush + might have cleared them. + + src/cairo-gl-composite.c | 11 +++-------- + src/cairo-gl-device.c | 8 ++++++++ + src/cairo-gl-surface.c | 1 + + 3 files changed, 12 insertions(+), 8 deletions(-) + +commit 7747f6d9146c19419fdc4fbbdf72eed42dfa731d +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 17:19:56 2010 +0200 + + gl: Introduce flush functions + + The flush functions will clear the state that will in the future be kep + unconditionally. + + src/cairo-gl-composite.c | 6 +++--- + src/cairo-gl-device.c | 22 +++++++++++++++++++++- + src/cairo-gl-private.h | 4 ++++ + src/cairo-gl-surface.c | 36 ++++++++++++++++++++++++++++++++---- + 4 files changed, 60 insertions(+), 8 deletions(-) + +commit 5c74beaaa5dedd82f891f1cc109142f7b6e222a8 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 17:19:45 2010 +0200 + + docs: fix typo + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 92d7b1eee96e6b1448aaf3c95a44238fa0eeff48 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 16:19:12 2010 +0200 + + device: Make flush vfunc return a cairo_status_t + + Mirror the behavior of the surface flush vfunc: Make it return a status + and if it's an error set it on the device. + + src/cairo-device-private.h | 2 +- + src/cairo-device.c | 9 +++++++-- + src/cairo-xml-surface.c | 4 +++- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 63e3cf3888d5b55295a04c4af28e876c04245b85 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 15:09:23 2010 +0200 + + gl: Move unsetting the state into the operand destroy function + + src/cairo-gl-composite.c | 43 +++++++++++++++++++++++++++++-------------- + 1 file changed, 29 insertions(+), 14 deletions(-) + +commit b9b85dbf3706fe9e50f40b5fda655e71931c2d7f +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 13:42:11 2010 +0200 + + gl: get rid of the operand's pattern variable + + Now someone just needs to teach cairo-gl to not use + cairo_pattern_acquire_surface() and we could avoid the nasty hack in + cairo_gl_operand_destroy(). + + src/cairo-gl-composite.c | 21 ++++++++++----------- + src/cairo-gl-private.h | 2 -- + 2 files changed, 10 insertions(+), 13 deletions(-) + +commit ae9517a39fdddec389553a64116140e222970ef0 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 13:18:28 2010 +0200 + + gl: Check mask's attributes for component alpha + + ... and don't duplicate that information into the cairo_gl_composite_t + + src/cairo-gl-composite.c | 14 ++++++++------ + src/cairo-gl-private.h | 1 - + 2 files changed, 8 insertions(+), 7 deletions(-) + +commit f72afc09d0b99030f5766e7bbbb05f6db606e195 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 13:14:09 2010 +0200 + + gl: Merge fixed function setup into general texture setup + + src/cairo-gl-composite.c | 84 ++++++++++++++++++++---------------------------- + 1 file changed, 34 insertions(+), 50 deletions(-) + +commit dd1faaf02e2a75ca8b9c484abd15726f5c6d3ac4 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 12:54:54 2010 +0200 + + gl: Move function + + I wanna use it elsewhere and keep the diff small. + + src/cairo-gl-composite.c | 58 ++++++++++++++++++++++++------------------------ + 1 file changed, 29 insertions(+), 29 deletions(-) + +commit d03800313623fb2b9e7d15c6a659ceaaee2882e8 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 12:51:08 2010 +0200 + + gl: Simplify mask operand setup code + + Component alpha just has one different value + + src/cairo-gl-composite.c | 40 +++++++--------------------------------- + 1 file changed, 7 insertions(+), 33 deletions(-) + +commit e20261dddaa194ab4e980da8681e9378d7fd7ef1 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 12:48:59 2010 +0200 + + gl: Get rid of operand argument to emit functions + + src/cairo-gl-composite.c | 34 +++++++++++++++------------------- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 2 -- + src/cairo-gl-surface.c | 11 +++-------- + 4 files changed, 19 insertions(+), 30 deletions(-) + +commit 8062fb352e6cd1d961f0fbc660779f4ad94c7508 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 11:03:09 2010 +0200 + + gl: Add an enum for tex units + + Instead of hardcoding 0 for source and 1 for mask, use an enum. It's + also clearer when functions take a cairo_gl_tex_t argument instead of a + GLuint. + + src/cairo-gl-composite.c | 20 ++++++++++---------- + src/cairo-gl-private.h | 5 +++++ + src/cairo-gl-shaders.c | 34 ++++++++++++---------------------- + 3 files changed, 27 insertions(+), 32 deletions(-) + +commit 5db362dd6792af20282e0e9a2805ee6f1b921e44 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 28 10:24:33 2010 +0200 + + gl: Keep a copy of the current operand in the context + + Note that they are currently only valid as long as the + cairo_gl_composite_t exists, but that will be changed soon. + + src/cairo-gl-composite.c | 20 ++++++++++++++++---- + src/cairo-gl-private.h | 2 ++ + 2 files changed, 18 insertions(+), 4 deletions(-) + +commit a05f062c806ac014d0daffa1d74bdb0dd90a8a26 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 19:23:18 2010 +0200 + + gl: Move struct definitions in header + + src/cairo-gl-private.h | 66 +++++++++++++++++++++++++------------------------- + 1 file changed, 33 insertions(+), 33 deletions(-) + +commit 85d4c6c55b85c52d8f86247f00659e37354abd49 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 21:23:40 2010 +0200 + + gl: operand->texture.surface cannot be NULL + + src/cairo-gl-composite.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 9486ad5fbdad047b5194f6bed68a08bb4c594610 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 19:16:41 2010 +0200 + + gl: Remove composite_t argument from _flush() function + + src/cairo-gl-composite.c | 17 +++++++---------- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 3 +-- + 3 files changed, 9 insertions(+), 13 deletions(-) + +commit 16e420b4dca5325ab295a27103299a916f334b05 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 19:13:53 2010 +0200 + + gl: Remove dependency on composite_t in draw function + + src/cairo-gl-composite.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e46215ec6b94355b741acf5dfdd264d6396b4bc8 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 18:44:20 2010 +0200 + + gl: Remove unneeded and broken workaround + + We now ensure the values are properly zeroed when setting the operator. + + src/cairo-gl-composite.c | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +commit b2d709b5c7e463437189b8e4a2c53a3317437825 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 17:41:01 2010 +0200 + + gl: Switch src alpha handling to a tiny on/off function + + Instead of doing setup every time, we just set this one flag. Much + nicer. + + src/cairo-gl-composite.c | 22 +++++++--------------- + 1 file changed, 7 insertions(+), 15 deletions(-) + +commit 53fd451f85974d2ed0d6f29a0a0549fd4c7035fe +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 17:32:14 2010 +0200 + + gl: Avoid redundant mask setup + + The mask doesn't change, so no need to set it up twice + + src/cairo-gl-composite.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 1b3675fc4b9c7f6ad4d9edd9b27bee10c2502b81 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 17:28:05 2010 +0200 + + gl: Split fixed-function operand setup into own function + + src/cairo-gl-composite.c | 151 +++++++++++++---------------------------------- + 1 file changed, 42 insertions(+), 109 deletions(-) + +commit 02da871050f6be02ba0231e545d6613a42c3a7e6 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 17:02:29 2010 +0200 + + gl: Unify fixed function setup code + + src/cairo-gl-composite.c | 15 ++++----------- + 1 file changed, 4 insertions(+), 11 deletions(-) + +commit 74f9094162fba54c29859e25ad5be085604aa0b6 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 15:46:39 2010 +0200 + + gl: switch OPERAND0 and OPERAND1 in the fixed function path + + This should not change anything as we multiply the values. + But it allows unifying parts of the code, which will happen in another + patch. + + src/cairo-gl-composite.c | 42 +++++++++++++++++++++--------------------- + 1 file changed, 21 insertions(+), 21 deletions(-) + +commit c6aac5d0134f1473d3867c1b6a4b40753700ffcb +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 15:42:56 2010 +0200 + + gl: Move the pre shader to the context, too + + It's required when flushing, too. + + src/cairo-gl-composite.c | 10 +++++----- + src/cairo-gl-private.h | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 61bc3067ca5fa4aeaef537c397c37826facc7621 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 15:28:32 2010 +0200 + + gl: Store the clip region in the context + + This is necessary because we want to get rid of keeping the composite + stuff around. + + src/cairo-gl-composite.c | 15 ++++++++++----- + src/cairo-gl-device.c | 2 ++ + src/cairo-gl-private.h | 1 + + 3 files changed, 13 insertions(+), 5 deletions(-) + +commit db79880d9a836d50e9202caa5c73e22a2b6b97b3 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 13:03:12 2010 +0200 + + gl: Make gl_composite_begin() acquire the context + + Also remove the previous places for context acquisition. This completes + fixing the potential ABBA deadlock I talked about a few commits ago. + + src/cairo-gl-composite.c | 21 +++++++++++++++++---- + src/cairo-gl-glyphs.c | 7 ++++++- + src/cairo-gl-private.h | 4 ++-- + src/cairo-gl-surface.c | 26 +++++--------------------- + 4 files changed, 30 insertions(+), 28 deletions(-) + +commit 1320a168fa5b73fd42438040a4bf8ee9ad222a0e +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 12:26:49 2010 +0200 + + gl: Remove unused code + + We don't need to acquire/release the context, we're not using it. + + src/cairo-gl-glyphs.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit 8f5c3b706b5bad6b0851a3e27752f7d1a3ca8a72 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 12:16:01 2010 +0200 + + gl: Make composite_set_clip_region not require the context + + src/cairo-gl-composite.c | 3 +-- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 3 +-- + src/cairo-gl-surface.c | 2 +- + 4 files changed, 4 insertions(+), 6 deletions(-) + +commit ac6abcbac7f79e5717c44e251135dcba8ab00b27 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 12:14:24 2010 +0200 + + gl: Make composite_set_source/mask/mask_spans not require a context + + src/cairo-gl-composite.c | 77 +++++++++++++++++++++++++----------------------- + src/cairo-gl-glyphs.c | 5 ++-- + src/cairo-gl-private.h | 9 ++---- + src/cairo-gl-surface.c | 13 ++++---- + 4 files changed, 51 insertions(+), 53 deletions(-) + +commit 88a70d66fcdbca7e489baa48cd145bb69c3e28e0 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 11:59:36 2010 +0200 + + gl: Add API for querying if we need GL_TEXTURE_RECTANGLE_EXT + + We need to do that querying outside of taking the lock, so we want to be + able to query the device, not the context. + + src/cairo-gl-composite.c | 11 +++++------ + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 6 ++++++ + 3 files changed, 12 insertions(+), 7 deletions(-) + +commit 9c6e1338a1c7d61b4cc84bcdc5c38573a34cd561 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 26 11:36:22 2010 +0200 + + gl: Make cairo_gl_composite_t not require a gl context anymore + + First patch in a series. + + The idea is to make all gl operations in Cairo work like this: + 1) prepare cairo_gl_composite_t + 2) acquire device + 3) begin composite operation + 4) emit vertexes + 5) end operation + 6) release device + 7) cleanup composite operation + + This both reduces the time required with the device locked, cleans the + API and more importantly avoids ABBA deadlocks, as we currently call + acquire_pattern() with the device lock held. + + src/cairo-gl-composite.c | 6 ++---- + src/cairo-gl-glyphs.c | 7 +++---- + src/cairo-gl-private.h | 6 ++---- + src/cairo-gl-surface.c | 19 ++++++++----------- + 4 files changed, 15 insertions(+), 23 deletions(-) + +commit 60f0cb9c60556f94af903dd6f9da0628a05a1f7f +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 22 18:42:44 2010 +0200 + + gl: Flush surface at the right times + + src/cairo-gl-composite.c | 2 ++ + src/cairo-gl-device.c | 2 ++ + src/cairo-gl-surface.c | 2 ++ + 3 files changed, 6 insertions(+) + +commit ffeeae462ea0f8c7af326f3bcc66b88881bd8fdd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 6 16:50:34 2010 +0100 + + Revert "gstate: reduce a couple more operators" + + This reverts commit a85c6c1e36273d534f01ade0714b0592b6bed5ab. + + Soeren found that this introduced a regression when displaying pages in + evince, and since I'm not overly enthralled at the added complexity here + for very little gain, remove the reduction and leave it clear for a more + complete solution in the future. + + src/cairo-gstate.c | 15 +-------------- + 1 file changed, 1 insertion(+), 14 deletions(-) + +commit 44e628a6f4e6b9b21ad67b08869186a779d0db5a +Author: Makoto Kato <m_kato@ga2.so-net.ne.jp> +Date: Mon May 31 18:22:40 2010 +0900 + + openvg: fix build break + + src/cairo-vg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cc080a1e2731a42045709d789587070da944145c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 27 20:51:55 2010 +0100 + + gl: Unmap the vertex buffer prior to using in DaawArrays() + + "It is an INVALID_OPERTION error to source data from a buffer object + that is currently mapped." + + mesa is currently lax in this regard, but the Nvidia libGL conforms to + the spec and thus was causing failures. + + src/cairo-gl-composite.c | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +commit b3e15bd5c307352065555c6c3ae5f0bd15b9a791 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 27 18:43:03 2010 +0100 + + gl: _cairo_set_shader_by_type() cannot return UNSUPPORTED + + So remove the superfuous test. + + src/cairo-gl-composite.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 59bd34e6a3661483f60bb01be8b406a5c38e1131 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 27 18:35:40 2010 +0100 + + gl: Check for an error device when creating surfaces. + + src/cairo-gl-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 53f086105975c1c2bd4c43a1b0613ebde3580e95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 27 18:27:53 2010 +0100 + + gl: Make _cairo_gl_shader_(init|compile) static + + Only used within _cairo_gl_shaders.c, so remove the private symbol. + + src/cairo-gl-private.h | 10 ---------- + src/cairo-gl-shaders.c | 41 +++++++++++++++++++++++++---------------- + 2 files changed, 25 insertions(+), 26 deletions(-) + +commit dd0866cdc878a0be438a117051ccc64f12f81970 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 27 17:52:11 2010 +0100 + + boilerplate: Exercise RENDER capable windows. + + Ensure that the drivers actually work when rendering to a normal window. + + boilerplate/cairo-boilerplate-xlib.c | 107 +++++++++++++++++++++++++++++++++++ + 1 file changed, 107 insertions(+) + +commit 2dc42af9422a15f902934a53c074e4194991a9e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 17 16:32:20 2010 +0100 + + script: Update csi-exec to match new interface. + + util/cairo-script/csi-exec.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2f0f4ed0e2ae5657dedfe180b7be3a2496753ba8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 20 21:54:51 2010 +0100 + + freed-pool: Don't access beyond the end of the array. + + Argh. This bug has been here for quite some time and only showed itself + with a corrupt pointer on ppc32. Since the erroneous write is inside the + block, it remained undetected by valgrind. + + src/cairo-freed-pool-private.h | 8 +++++--- + src/cairo-freed-pool.c | 4 +++- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 97b4aeba44e5f4b23b3ed417b991570b46d4736e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 20 21:54:16 2010 +0100 + + atomic: Add memory barriers if required for intel primitives + + src/cairo-atomic-private.h | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 24e684c267404528b40fa49b55272d73bd44167d +Author: Benjamin Otte <otte@gnome.org> +Date: Thu May 20 22:37:18 2010 +0200 + + gl: spans need the dummy texture + + Thanks Eric. That took me half a day. + + src/cairo-gl-composite.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7a564d8eed32b4417fdb4c8c5d91467e4ae1019 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 20 22:10:06 2010 +0200 + + gl: Don't set is_clear + + 1) It's wrong. + 2) The core functions set the flag correctly already. + + src/cairo-gl-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit f9cf07b126293d00df085d4fbfa337e1132e0258 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 20 16:08:38 2010 +0200 + + gl: Fix coverage passing for spans not being endian safe. + + src/cairo-gl-composite.c | 29 ++++++++++++++++------------- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-surface.c | 4 ++-- + 3 files changed, 19 insertions(+), 16 deletions(-) + +commit 2a0f34c6da2eb4f10b198d04894fc1413352e041 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 20 11:23:18 2010 +0200 + + gl: Allow NONE and SPANS sampler for source, too + + src/cairo-gl-shaders.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 1586f7740ad436447ac75c6b869da7446172a63c +Author: Benjamin Otte <otte@gnome.org> +Date: Thu May 20 13:17:52 2010 +0200 + + gl: Refactor fixed function setup code + + In particular get rid of the _cairo_gl_set_tex_combine_constant_color() + function by inlining it and move common glTexEnv calls out of the + switch statement. + + src/cairo-gl-composite.c | 130 +++++++++++++++++------------------------------ + 1 file changed, 46 insertions(+), 84 deletions(-) + +commit 4889090c76bdab5e4eb887593caf5d5a34f90864 +Author: Benjamin Otte <otte@gnome.org> +Date: Thu May 20 12:13:43 2010 +0200 + + gl: set the active texture before fiddling with with glTexEnv + + fixes the fixed function pipeline + + src/cairo-gl-composite.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 3cff2da912150868390bf4b9df166c88b3dfcf2e +Author: Benjamin Otte <otte@gnome.org> +Date: Thu May 20 12:03:18 2010 +0200 + + gl: Remove unused variables + + src/cairo-gl-composite.c | 9 --------- + 1 file changed, 9 deletions(-) + +commit 4c7dd1be4526c85b47f1fe1d4663e7fbec0926b1 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 22:03:18 2010 +0200 + + gl: Move vertex array setup code into the texture setup code + + src/cairo-gl-composite.c | 35 ++++++++++++++--------------------- + 1 file changed, 14 insertions(+), 21 deletions(-) + +commit d9d5976bdf333a5a7ea7707bc3076696f3c079d2 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 21:54:32 2010 +0200 + + gl: Add an assertion that a context cannot call _begin() twice + + Evert _begin() call must be followed by an _end() call to avoid any + nastiness. Just like GL. :) + + src/cairo-gl-composite.c | 2 ++ + src/cairo-gl-private.h | 7 +++++++ + 2 files changed, 9 insertions(+) + +commit 5b8b1fe1cb692530b40db330c3040cd85a8b6bd7 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 21:10:26 2010 +0200 + + gl: Move vertex buffer handling from setup into context + + We can only emit one vertex buffer at a time anyway. + + src/cairo-gl-composite.c | 34 ++++++++++++++++++---------------- + src/cairo-gl-private.h | 8 ++++---- + 2 files changed, 22 insertions(+), 20 deletions(-) + +commit 0d5f2eab77f055b063538dcd345a1e0db480f3bc +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 20:49:49 2010 +0200 + + gl: Actuall do fall back to fixed function paths. + + Previously we were just returning UNSUPPORTED all the time. I guess that + explains why my code got so slow... + + src/cairo-gl-composite.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit bb7ca71c1af416ca084f03089f5fe762403635dd +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 20:47:31 2010 +0200 + + gl: Don't store the shader in the composite_t anymore + + Now that we have ctx->current_shader, there's no need to keep it in the + composite setup code. + + src/cairo-gl-composite.c | 30 ++++++++++++++---------------- + src/cairo-gl-private.h | 10 ++++------ + src/cairo-gl-shaders.c | 16 ++++++---------- + 3 files changed, 24 insertions(+), 32 deletions(-) + +commit 6c477b4a945a8f8b866bb2f5e125d4a0328d05f4 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 20:10:19 2010 +0200 + + gl: Move shader checking in the TexEnv setup code + + As the previously generic setup code only contains non-shader code now, + we can check in advance that no shader is in use and do all the other + stuff without checks. + + src/cairo-gl-composite.c | 208 +++++++++++++++++++++++------------------------ + 1 file changed, 101 insertions(+), 107 deletions(-) + +commit 73262edd8201de8ab8a01e01f83af5b5d6470f9e +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 19:25:03 2010 +0200 + + gl: Move texture setup code into its own file + + This ensures textures don't need to be (re)set when doing component + alpha and running 2 shaders. + + src/cairo-gl-composite.c | 208 +++++++++++++++++++++-------------------------- + 1 file changed, 92 insertions(+), 116 deletions(-) + +commit 970c879dd897019f90b0c8ff5a18781be4935c55 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 18:34:00 2010 +0200 + + gl: Binding variables only works for the current shader + + So make the code reflect that. + + src/cairo-gl-composite.c | 27 ++++++++++++--------------- + src/cairo-gl-private.h | 6 ------ + src/cairo-gl-shaders.c | 22 ++++++++-------------- + 3 files changed, 20 insertions(+), 35 deletions(-) + +commit 065969d78f23c634ebcb2b931cbb1fe184f2cedf +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 18:21:06 2010 +0200 + + gl: Separate binding to shaders from setting operands + + That way we only need to bind to shaders when creating them, but not + everytime we switch shaders on text output. + + src/cairo-gl-composite.c | 156 +++++++++++++++++++++++------------------------ + src/cairo-gl-shaders.c | 2 +- + 2 files changed, 79 insertions(+), 79 deletions(-) + +commit c53f7778bcf274f64f801ef9ee1641a088842f60 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 16:50:57 2010 +0200 + + gl: Use the mask, not the source + + Not that we'd ever have constant color component-alpha masks, but that's + an entirely different topic. + + src/cairo-gl-composite.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 26e8e506b66022910c262da0618ef5be8c5a080e +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 13:19:56 2010 +0200 + + gl: Add _cairo_gl_surface_is_texture() + + It's more explicit then just checking surface->fb != 0 + Also, it makes improving that check easier. + + src/cairo-gl-device.c | 4 ++-- + src/cairo-gl-private.h | 6 ++++++ + src/cairo-gl-surface.c | 11 ++++++----- + 3 files changed, 14 insertions(+), 7 deletions(-) + +commit e4cb46b50015f792b0e8c7b49f3b42f2c3c0ad00 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 12:10:10 2010 +0200 + + gl: Implement texture upload to window with composite() + + Instead of custom code that does basically the same thing, use + a temporary surface and _cairo_gl_surface_composite() to upload images. + + src/cairo-gl-shaders.c | 2 +- + src/cairo-gl-surface.c | 129 ++++++++++++++++++------------------------------- + 2 files changed, 48 insertions(+), 83 deletions(-) + +commit 7c8759e279f51ea722c07e4b0c70f4a49f34393d +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 11:46:12 2010 +0200 + + gl: cache the current shader in the context + + src/cairo-gl-private.h | 4 +++- + src/cairo-gl-shaders.c | 7 +++++++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 6864ca6c25aa8147a562d7f693a95025dde807a8 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 19 11:10:11 2010 +0200 + + gl: Move _cairo_gl_set_operator() to the file it's used in + + Also make it a private function. + + src/cairo-gl-composite.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 4 ---- + src/cairo-gl-surface.c | 57 ------------------------------------------------ + 3 files changed, 57 insertions(+), 61 deletions(-) + +commit 0d2d4c59026c31da084e6797d109a230341b396d +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 21:56:55 2010 +0200 + + gl: Detect color-pattern clears of surfaces + + ... and use glClear() there. + + The common case here is a solid color and OPERATOR_OVER. + + src/cairo-gl-private.h | 3 --- + src/cairo-gl-surface.c | 38 +++++++++++++++++++++++++++++--------- + 2 files changed, 29 insertions(+), 12 deletions(-) + +commit b70eb275c4aa54f7c90a985b5de67da12ac08a30 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 21:56:18 2010 +0200 + + gl: detect image uploads and fast-path them + + src/cairo-gl-surface.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 8adbf3aa19fd9fb8200973ecd72cdebfd9a5364d +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 20:12:44 2010 +0200 + + gl: Use _cairo_gl_surface_draw_image() when caching glyphs + + src/cairo-gl-glyphs.c | 47 ++++++++--------------------------------------- + 1 file changed, 8 insertions(+), 39 deletions(-) + +commit 915aa64ef077fe3b6094d0f1c8bd87ab5acc4868 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 13:01:30 2010 +0200 + + gl: Actually check errors for _cairo_gl_composite_begin() + + src/cairo-gl-glyphs.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0222cc7d76b0dc724630b660687f98a2460eb0b9 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 13:00:34 2010 +0200 + + gl: Get rid of _cairo_gl_composite_set_mask_texture() + + Now that the glyph cache contains real surfaces, there's no longer a + need to have a special function for it. + + src/cairo-gl-composite.c | 16 ---------------- + src/cairo-gl-glyphs.c | 15 ++++++++------- + src/cairo-gl-private.h | 6 ------ + 3 files changed, 8 insertions(+), 29 deletions(-) + +commit 208d9f2a7e1f66ff2764c41fe67f65e27279b2ab +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 12:49:59 2010 +0200 + + gl: Make glyph cache a real surface + + This has the huge advantage that we can use real surface functions on + it. + + src/cairo-gl-glyphs.c | 67 +++++++++++++++++++------------------------------- + src/cairo-gl-private.h | 3 +-- + 2 files changed, 26 insertions(+), 44 deletions(-) + +commit 050117996339cfe35add1f2cd44d0e5578d4a981 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 18 12:02:54 2010 +0200 + + surface: Add _cairo_surface_release_device_reference() API + + See the API documentation for that function about its intended purpose. + + src/cairo-surface-private.h | 1 + + src/cairo-surface.c | 26 +++++++++++++++++++++++++- + src/cairoint.h | 3 +++ + 3 files changed, 29 insertions(+), 1 deletion(-) + +commit c489f67d1d1d6079f9b58b726ed42beea1dfc44e +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 20:45:42 2010 +0200 + + gl: Make a bunch of functions static + + They are no longer used outside of cairo_gl_composite_t. + + src/cairo-gl-composite.c | 8 ++++---- + src/cairo-gl-private.h | 16 ---------------- + 2 files changed, 4 insertions(+), 20 deletions(-) + +commit c8008e118a54d62690d6555c9ffabf734c39e69f +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 19:16:20 2010 +0200 + + gl: Don't name the union in cairo_gl_operand_t + + Gets rid of ultra-long variable names. + + src/cairo-gl-composite.c | 152 +++++++++++++++++++++++------------------------ + src/cairo-gl-private.h | 2 +- + 2 files changed, 77 insertions(+), 77 deletions(-) + +commit 53260148ea9abacdc510826765c1d63f486add6c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri May 14 21:04:22 2010 +0200 + + quartz: fix repeating radial gradients on 64 bits + + Quartz API uses the type CGFloat, which is double on 64 bits, + float on 32 bits architectures + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0104976dc853b60de14080a749a6f729852f1b22 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri May 14 21:03:19 2010 +0200 + + quartz: silence compiler warnings + + All the possible enum values have to be explicitly handled in switch statements. + + src/cairo-quartz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ac94a00a4d3acb36f011330b78d1311534fe90e0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri May 14 19:33:15 2010 +0200 + + quartz: fallback for A1 images on little endian archs + + Quartz uses a bit ordering that is consistent with cairo on big + endian architectures, but isn't on little endian architectures. + + Fixes a1-mask and large-source-roi (on little endian) + + src/cairo-quartz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit f40e3b09a130a9ccbe310120fd5cfc7ad7828a4d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu May 13 12:15:19 2010 +0200 + + quartz-font: Silence 0x0 CGContext warning + + Silence Quartz complaints about operations on empty contexts: + <Error>: CGContextSetFont: invalid context 0x0 + <Error>: CGContextSetFontSize: invalid context 0x0 + <Error>: CGContextSetTextMatrix: invalid context 0x0 + <Error>: CGContextSetAlpha: invalid context 0x0 + <Error>: CGContextShowGlyphsAtPoint: invalid context 0x0 + + src/cairo-quartz-font.c | 77 +++++++++++++++++++++++++++---------------------- + 1 file changed, 42 insertions(+), 35 deletions(-) + +commit 1687e6169463947554f5476674a577e67e2c543b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu May 13 11:54:32 2010 +0200 + + quartz-font: Conform context and antialias handling to quartz-surface + + A8 surfaces are now kAlphaOnly surfaces in quartz-font too. + Subpixel font smoothing can be enabled. + + src/cairo-quartz-font.c | 38 ++++++++++++++++++++++++++++---------- + 1 file changed, 28 insertions(+), 10 deletions(-) + +commit d68bbc0fe5706634e4c025bdcb311905b7f008e4 +Author: Benjamin Otte <otte@gnome.org> +Date: Mon May 17 20:57:08 2010 +0200 + + gl: Add missing NULL-check in non-shader code + + src/cairo-gl-composite.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7f22372edf10f5eab53ea132d9226f6d5b49eb9a +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 14:20:17 2010 +0200 + + gl: Get rid of src and mask argument to composite_init() + + This was thought of as a way to detect self-painting, but it's better to + check that later in _begin() - when we check it. + + src/cairo-gl-composite.c | 2 -- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 2 -- + src/cairo-gl-surface.c | 9 ++++----- + 4 files changed, 5 insertions(+), 10 deletions(-) + +commit 75f15babed8409fb1eaae514411de01d57072c80 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 14:17:47 2010 +0200 + + gl: Implement fill_rectangles with composite + + Tiny performance improvement, but a lot less code. + + src/cairo-gl-surface.c | 204 ++++++++++--------------------------------------- + 1 file changed, 41 insertions(+), 163 deletions(-) + +commit e7c5b4f79fa24b75026c93bc9244115d2ee23930 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 13:56:22 2010 +0200 + + gl: make _set_mask() accept NULL + + That way, it can be used to unset the mask. + + src/cairo-gl-composite.c | 3 +++ + src/cairo-gl-surface.c | 14 ++++++-------- + 2 files changed, 9 insertions(+), 8 deletions(-) + +commit 145db7a427e594f1d68a6c0f4afe5e365e219cf0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 17 12:37:46 2010 +0100 + + gl: Check status after composite_begin + + Skip the unnecessary work in _cairo_gl_surface_composite() if we fail + to setup the GL composite operation. + + src/cairo-gl-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8695c41e80ce932fd5dd434307b92f323a937c7c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 17 12:36:54 2010 +0100 + + gl: Throw a _cairo_error when detecting a GLerror + + This allows us to easily set an breakpoint and inspect cairo's state + when we do something illegal. + + src/cairo-gl-private.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 1c18ab02c8d41be8e5886cbb34aeda5099189fef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 17 11:42:26 2010 +0100 + + gl: Rename cairo_gl_shader_program_t to cairo_gl_shader_t + + And complete the move of the shaders into the cairo_gl_shader namespace. + Of particular note, the bind_*_to_shader become + _cairo_gl_shader_bind_*() and have proper types. + + src/cairo-gl-composite.c | 138 ++++++------- + src/cairo-gl-device.c | 14 +- + src/cairo-gl-private.h | 93 +++++---- + src/cairo-gl-shaders.c | 508 ++++++++++++++++++++++++++--------------------- + src/cairo-gl-surface.c | 54 ++--- + 5 files changed, 424 insertions(+), 383 deletions(-) + +commit 2325d755b03958d8ead9a995c0d1d03e4f93af0c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 17 10:33:46 2010 +0100 + + gl: Pretty print the error GLenum. + + src/cairo-gl-private.h | 3 ++- + src/cairo-gl-surface.c | 19 +++++++++++++++++++ + 2 files changed, 21 insertions(+), 1 deletion(-) + +commit 7ef1bd22ded512f4fad3959796d7f40c4ddc5824 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 01:12:34 2010 +0200 + + gl: Update copyright statements + + - add 2010 Red Hat copyright for my code + - include myself as author + - update contributors list + + src/cairo-gl-composite.c | 5 ++++- + src/cairo-gl-device.c | 5 ++++- + src/cairo-gl-glyphs.c | 5 +++++ + src/cairo-gl-private.h | 6 ++++-- + src/cairo-gl-shaders.c | 8 +++++++- + src/cairo-gl-surface.c | 5 ++++- + 6 files changed, 28 insertions(+), 6 deletions(-) + +commit 0b69e51b526a609a2dc5f1d2fb9c49f240feb57b +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 00:56:21 2010 +0200 + + gl: Assert that binding values to shaders never fails + + As that would be a programming error, we can use an assert and get rid + of return values that we weren't checking anyway. + + src/cairo-gl-composite.c | 129 ++++++++++++++++++++--------------------------- + src/cairo-gl-private.h | 12 ++--- + src/cairo-gl-shaders.c | 114 ++++++++++++++++------------------------- + src/cairo-gl-surface.c | 15 +++--- + 4 files changed, 111 insertions(+), 159 deletions(-) + +commit 0bb11e8f5bcdc8a6f8384197b39c2ad48eaab1cd +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 17 00:49:01 2010 +0200 + + gl: Use GL_TRIANGLES instead of GL_QUADS + + It seems to increase performance by 1-2% on average and up to 30% in + some cases (on i965). + + src/cairo-gl-composite.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit 2b771da47a87f86f378314bfe8033874d9444914 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 23:58:47 2010 +0200 + + xlib: ensure variable isn't uninitialized + + src/cairo-xlib-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b768a33a602942825e5ec651ae7bafd6d5fc33ac +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 21:10:45 2010 +0200 + + gl: Set composite->has_component_alpha based on mask + + Previously it was set when initing the composite structure, but that + doesn't allow resetting it when a new mask is used. + + src/cairo-gl-composite.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 1cde4601df8a3689450e2a0e15888c53aff12983 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 21:05:16 2010 +0200 + + gl: Replace _cairo_gl_operand_init() with setters for src/mask + + Now cairo_gl_operand_t is no longer exposed outside of + cairo-gl-composite.c + + src/cairo-gl-composite.c | 34 +++++++++++++++++++++++++++++++++- + src/cairo-gl-glyphs.c | 10 +++++----- + src/cairo-gl-private.h | 25 ++++++++++++++++--------- + src/cairo-gl-surface.c | 26 +++++++++++++------------- + 4 files changed, 67 insertions(+), 28 deletions(-) + +commit 6575cb7a95e109ab39eda58603ed6a76581a41b0 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 20:39:00 2010 +0200 + + gl: Convert glyphs path to use cairo_gl_composite_t + + src/cairo-gl-composite.c | 122 ++++++++++++----- + src/cairo-gl-glyphs.c | 331 ++++++----------------------------------------- + src/cairo-gl-private.h | 22 ++++ + 3 files changed, 150 insertions(+), 325 deletions(-) + +commit 8937f2b4b5e4bcb8ada1e478df6a7329c0b80a5a +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 13:19:48 2010 +0200 + + gl: Require ARB_vertex_buffer_object extension unconditionally + + <anholt> we shouldn't bother with non-vbo support. there's no + justification for a driver not supporting it. + + src/cairo-gl-composite.c | 1 - + src/cairo-gl-device.c | 5 +++-- + src/cairo-gl-glyphs.c | 3 --- + src/cairo-gl-private.h | 7 ------- + src/cairo-gl-surface.c | 12 ++++-------- + 5 files changed, 7 insertions(+), 21 deletions(-) + +commit 29dfd5b488e16ec8be879b2415635df93b874afc +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 03:36:05 2010 +0200 + + gl: Remove unused variables + + src/cairo-gl-surface.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 4144488f516214b675d25d48add8cbd83fd17025 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 03:29:04 2010 +0200 + + gl: Convert span renderer to use cairo_gl_composite_begin/end() + + Adds two new APIs to the composite API: + - _cairo_gl_composite_set_mask_spans() + Tells the composite renderer to use the color values for spans. + - _cairo_gl_composite_set_clip_region() + Tells the composite renderer to use GL_SCISSORS_TEST to clip when + drawing. This function is very unperformant, so if it can be avoided, + it probably shouldn't be used. + + src/cairo-gl-composite.c | 72 +++++++++++++- + src/cairo-gl-private.h | 10 ++ + src/cairo-gl-surface.c | 247 ++++++----------------------------------------- + 3 files changed, 110 insertions(+), 219 deletions(-) + +commit 6e81d85e3682f14e1c5dbe97dda2cc1fcd32df3a +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 03:27:28 2010 +0200 + + gl: Change _cairo_gl_composite_emit_rect() + + Two changes: + - The function now takes x1/y1,x2/y2 instead of x,y,width,height + - The function takes a color uint32_t. This will be used by spans. + + src/cairo-gl-composite.c | 27 +++++++++++++++------------ + src/cairo-gl-private.h | 9 +++++---- + src/cairo-gl-surface.c | 10 ++++++---- + 3 files changed, 26 insertions(+), 20 deletions(-) + +commit f8398cc2d83eb9ac37874f71d4f8805dbf0df412 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 02:34:18 2010 +0200 + + gl: remove unused variables from span renderer + + src/cairo-gl-surface.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit f5c5077def47b91b57dfbc8c2622b4aaf5ca8fbb +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 02:06:43 2010 +0200 + + gl: Support component alpha in gl_composite_t + + Use that to get rid of cairo_gl_surface_composite_component_alpha() + + src/cairo-gl-composite.c | 165 ++++++++++++++++++++++++++-- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 4 + + src/cairo-gl-surface.c | 280 +---------------------------------------------- + 4 files changed, 167 insertions(+), 284 deletions(-) + +commit 88c118f891ca9ba472b8acff33829de845bb507c +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 16 00:24:17 2010 +0200 + + gl: Implement _composite_emit_rect() and _composite_end() + + And use it in cairo_gl_surface_composite() + + src/cairo-gl-composite.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 19 ++++++ + src/cairo-gl-surface.c | 107 +++---------------------------- + 3 files changed, 192 insertions(+), 98 deletions(-) + +commit b96735f7b465a16182c4c8555878ba16b947e8f9 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 22:12:12 2010 +0200 + + gl: Add _cairo_gl_composite_begin() function + + This is the first step at adding the following function set: + _cairo_gl_composite_begin() + _cairo_gl_composite_emit_*() + _cairo_gl_composite_end() + which will take care of proiding a unified model for emitting vertexes + using vbos instead of the 5 different methods we currently have. + + src/cairo-gl-composite.c | 30 ++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 6 ++++++ + src/cairo-gl-surface.c | 22 +--------------------- + 3 files changed, 37 insertions(+), 21 deletions(-) + +commit 211a8b8234d24dd8e00332cb0b0e625ac1ffef58 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 21:27:58 2010 +0200 + + gl: make _cairo_operand_destroy private + + src/cairo-gl-composite.c | 2 +- + src/cairo-gl-private.h | 3 --- + 2 files changed, 1 insertion(+), 4 deletions(-) + +commit bf1060252abaa97eb5ce149f8b99055b42096c67 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 21:26:55 2010 +0200 + + gl: make show_glyphs use the cairo_composite_t API + + src/cairo-gl-glyphs.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit 948290de12c5f451d361903f0f52e0cde5527180 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 20:33:00 2010 +0200 + + gl: Make the span renderer use the new composite APIs + + src/cairo-gl-surface.c | 32 ++++++++++++++++++++------------ + 1 file changed, 20 insertions(+), 12 deletions(-) + +commit 7ad8c3b45691ce0c8a86180bb3c1117b9a9980c0 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 20:07:44 2010 +0200 + + gl: Move composite code into own file + + This allows designing a cleaner interface for cairo_composite_t as there + will not be static functions that get called outside of the "published" + interfaces. + + src/Makefile.sources | 3 +- + src/cairo-gl-composite.c | 898 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 8 + + src/cairo-gl-surface.c | 851 +------------------------------------------- + 4 files changed, 910 insertions(+), 850 deletions(-) + +commit 3ff32b00f0f85a853163c20b101ac5dd6a07da77 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 18:20:56 2010 +0200 + + gl: cairo_gl_compsite_setup_t => cairo_gl_composite_t + + src/cairo-gl-glyphs.c | 4 ++-- + src/cairo-gl-private.h | 26 +++++++++++++------------- + src/cairo-gl-surface.c | 46 +++++++++++++++++++++++----------------------- + 3 files changed, 38 insertions(+), 38 deletions(-) + +commit c16edee26fb9f1669ee0ce1a61f0c54d802c6c7b +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 15 17:33:24 2010 +0200 + + gl: use glBlendFuncSeparate() + + This way we can treat alpha-only textures correctly and don't have to + emit different shaders for it. Also gets rid of + GL_OPERAND_TEXTURE_ALPHA. + + src/cairo-gl-glyphs.c | 9 +++------ + src/cairo-gl-private.h | 1 - + src/cairo-gl-shaders.c | 37 ------------------------------------- + src/cairo-gl-surface.c | 37 +++++++++++++------------------------ + 4 files changed, 16 insertions(+), 68 deletions(-) + +commit 4f5221a834a883262cce607d247f607d6c200363 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 21:12:37 2010 +0200 + + gl: acquire device manually in finish, as the default way will error + + We'll get CAIRO_STATUS_DEVICE_FINISHED, d'oh + + src/cairo-gl-device.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 3f6300444928d12bf4a6e2f6f2c5fec1de7dba8e +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 20:53:20 2010 +0200 + + gl: Put shaders into a cache + + This allows to grow the complexity of the shaders without enlarging the + static array to unreasonable sizes. + + The cache size of 64 is essentially random. + + src/cairo-gl-device.c | 2 + + src/cairo-gl-private.h | 8 ++-- + src/cairo-gl-shaders.c | 111 +++++++++++++++++++++++++++++++++++++++++-------- + 3 files changed, 100 insertions(+), 21 deletions(-) + +commit 08b04caf52518f1672694341355b5f5418008e78 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 18:10:04 2010 +0200 + + gl: Add cairo_gl_composite_setup_init/fini() functions + + Simplifies the main code paths, and can be extended to do dest copies. + + src/cairo-gl-private.h | 13 ++++++++ + src/cairo-gl-surface.c | 91 ++++++++++++++++++++++++++++---------------------- + 2 files changed, 65 insertions(+), 39 deletions(-) + +commit aa14df0db5e4f236a9668ceda4e148e7d3ba0e9f +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 17:01:47 2010 +0200 + + gl: move operator check + + component alpha compositing checks the operator itself + + src/cairo-gl-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a3ee0a7f113ed38df66580ff7e38a79759b0c933 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 16:57:32 2010 +0200 + + gl: Programmatically generate fragment shaders + + src/cairo-gl-shaders.c | 428 +++++++++++++++++++++---------------------------- + src/cairo-gl-surface.c | 6 +- + 2 files changed, 186 insertions(+), 248 deletions(-) + +commit fe43b13052f7063f880aeeebda1880a6a2097922 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 13:57:06 2010 +0200 + + gl: Automatically generate the vertex shader source + + The idea is being able to generate shaders from the given input + on-demand. This allows creating more advanced shaders, such as those + that include the destination (for self-painting and + unsupported-by-blending operator) or painting images in weird formats + (extra translation step in shader, think YUV). + + src/cairo-gl-device.c | 2 +- + src/cairo-gl-private.h | 21 +++--- + src/cairo-gl-shaders.c | 195 ++++++++++++++++++++++++++++++------------------- + src/cairo-gl-surface.c | 3 +- + 4 files changed, 132 insertions(+), 89 deletions(-) + +commit 405eee07ad9a5bc325b339b8588facb905fb28f5 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 00:02:28 2010 +0200 + + gl: Get rid of cairo_gl_shader_source/mask_t + + Use the cairo_gl_operand_type_t instead. Those enums are pretty much + identical. + + src/cairo-gl-glyphs.c | 13 +++-- + src/cairo-gl-private.h | 67 ++++++++-------------- + src/cairo-gl-shaders.c | 60 ++++++++++--------- + src/cairo-gl-surface.c | 153 +++++++++++++++++++++++++++++-------------------- + 4 files changed, 157 insertions(+), 136 deletions(-) + +commit 5149bb87d7b547766ce6ff4976217454adbab562 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 11 21:35:13 2010 +0200 + + gl: s/_cairo_gl_set_destination/_cairo_gl_context_set_destination/ + + It's an operation on the context, so name it accordingly + + src/cairo-gl-device.c | 2 +- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-surface.c | 16 ++++++++-------- + 4 files changed, 11 insertions(+), 11 deletions(-) + +commit 9f34e403f38192d711304fbde4dedbaa8e15fd6e +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 11 13:15:16 2010 +0200 + + gl: Share vertex shaders + + Previously, we created a new vertex shader for every shader program we + used. Now the code shares identical vertex shaders between programs. + + src/cairo-gl-device.c | 17 ++++- + src/cairo-gl-private.h | 27 ++++++-- + src/cairo-gl-shaders.c | 179 ++++++++++++++++++++++++++++--------------------- + src/cairo-gl-surface.c | 7 +- + 4 files changed, 142 insertions(+), 88 deletions(-) + +commit 562c323ae8689907d7a62a7c2f5c10fb8d055608 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 16 17:47:13 2010 +0930 + + cff: Use correct glyph advance when subsetting cff fonts + + Previously the glyph advance in font units was used for the widths in + the PDF font dictionary. This only works for cff fonts that use a + [0.001 0 0 0.001 0 0] font matrix. + + src/cairo-cff-subset.c | 38 ++++++++++++++++++--------------- + src/cairo-pdf-surface.c | 19 +++++++++-------- + src/cairo-scaled-font-subsets-private.h | 6 +++--- + 3 files changed, 34 insertions(+), 29 deletions(-) + +commit edcefa87ed0a8ff59b54ef9251182ce68f9158ba +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed May 12 23:12:55 2010 +0930 + + type1: Use correct glyph advance when subsetting type 1 fonts + + Previously the glyph advance in font units was used for the widths in + the PDF font dictionary. This only works for Type 1 fonts that use a + [0.001 0 0 0.001 0 0] font matrix. + + https://bugs.freedesktop.org/show_bug.cgi?id=28061 + + src/cairo-pdf-surface.c | 23 ++++++++++++----------- + src/cairo-scaled-font-subsets-private.h | 6 +++--- + src/cairo-type1-fallback.c | 18 +++++++++--------- + src/cairo-type1-subset.c | 6 +++--- + 4 files changed, 27 insertions(+), 26 deletions(-) + +commit 34fd094b3be54138c20ea5c4aab1d9597d056f35 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 16 10:23:30 2010 +0100 + + rtree: Actually pin the node when pinning. + + How embarrassing. + + src/cairo-rtree-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 63062511f6755af9ddd2985250465f94ebc5a3e8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 16 10:15:42 2010 +0100 + + boilerplate: Exercise manual double-buffering to a window + + Shouldn't possibly go wrong, but the mix of fbo and Window might prove + interesting. + + boilerplate/cairo-boilerplate-gl.c | 117 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 117 insertions(+) + +commit 605be3182308ec7dfe15e9d89890c33800b1eea9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 16 10:11:02 2010 +0100 + + cairo: Missing private markup for _cairo_format_to_pixman_format + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14d6c3e054da89e47fc82ea29a708290eefe1357 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 16 10:07:07 2010 +0100 + + configure: Include PTHREAD_CFLAGS in CAIRO_LDFLAGS + + Required for successful linking of our programs. I am not sure what the + impact this has upon other users of Cairo yet, I think we need to export + the PTHREAD_CFLAGS via cairo.pc as well. + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit c3df7e6d58364f883d91567757ed999ea88e10ca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 16 09:54:04 2010 +0100 + + rtree: Replace undeclared TRUE/FALSE with 1/0 + + src/cairo-rtree-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 465ceb330eada9937945f5c4d156169167d4bf8c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun May 16 09:41:12 2010 +0200 + + test: improve copyright notices + + Conform copyright notices to a1-image-sample.c + + test/dash-offset.c | 48 ++++++++++++++++------------------------- + test/linear-gradient-extend.c | 36 ++++++++++++++++--------------- + test/radial-gradient-extend.c | 36 ++++++++++++++++--------------- + test/surface-pattern-operator.c | 36 ++++++++++++++++--------------- + 4 files changed, 76 insertions(+), 80 deletions(-) + +commit e8bc25fdb21340b0a5a25f7193fd0bc5de540a50 +Author: Andrea Canciani <ranma42@valium.area51.sns.it> +Date: Fri May 14 21:40:13 2010 +0200 + + test: add linear-gradient-extend and radial-gradient-extend + + Check that constant gradient to solid color optimization are only + applied if the extents permit it. + + test/Makefile.sources | 2 + + test/linear-gradient-extend.c | 90 ++++++++++++++++++++++++++++++++++++ + test/linear-gradient-extend.ref.png | Bin 0 -> 371 bytes + test/radial-gradient-extend.c | 90 ++++++++++++++++++++++++++++++++++++ + test/radial-gradient-extend.ref.png | Bin 0 -> 466 bytes + 5 files changed, 182 insertions(+) + +commit a9d821b7a0f582b3d1b0175adee3350c81061a94 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 14 21:06:18 2010 +0200 + + gl: gl surfaces are only similar when they share the same device + + Fixes gl-surface-source test for gl target + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 435329a70f172c8cec72831dd7a2b2cfc0496342 +Author: Richard Procter <richard.n.procter@gmail.com> +Date: Fri May 14 14:48:46 2010 -0400 + + Bug 28100 - Font option CAIRO_HINT_METRICS_OFF unhonoured on win32 + + Fix typo. Ouch! + + src/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3a550eb2253588372b2c071b3c3152d5271c1aa2 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 21:17:19 2010 +0200 + + gl: Remove gradient optimizations + + These optimizations are done in cairo-gstate.c these days. + + src/cairo-gl-surface.c | 31 ------------------------------- + 1 file changed, 31 deletions(-) + +commit 3b1c0a4bd66660780095e6016e3db451f34503a3 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 14 15:56:17 2010 +0200 + + fallback: Remove span renderer paths + + Those paths were broken, as they didn't properly translate the polygon + to the destination size. And rather than adding lots of code that allows + translation, it's easier to just delete this code. + + Note that the only user of the code was the GL backend anyway. + + src/cairo-surface-fallback.c | 67 -------------------------------------------- + 1 file changed, 67 deletions(-) + +commit e3b2212bc5c4884eab356ae263b8318e10c379ac +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 15:14:29 2010 +0200 + + build: Fix pthread detection + + Incorporate the pthread detection code from the autoconf archive. Should + fix build on obscure archs that pretend to be UNIXy - like Mac OS X + Tiger. + + http://www.gnu.org/software/autoconf-archive/ + http://www.gnu.org/software/autoconf-archive/ax_pthread.html + + build/ax-pthread.m4 | 283 ++++++++++++++++++++++++++++++++++++++++++ + build/configure.ac.system | 11 -- + configure.ac | 14 +-- + util/cairo-sphinx/Makefile.am | 5 +- + util/cairo-trace/Makefile.am | 2 +- + 5 files changed, 292 insertions(+), 23 deletions(-) + +commit acfbf95a0c7620359fd917224b5b391702740190 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 14:21:21 2010 +0200 + + test: Make global variables in new test static + + It seems there's no gcc flag that warns about this. + + test/zero-mask.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c69143e3f9c95ab3937a7efb8e4de170c4edb648 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 12 21:14:36 2010 +0200 + + gl: Don't keep a temporary surface in the device + + We get circular references that way. + If it turns out later such a cache is critical, we'll need to invent a + way to avoid circling references. For now, just pretend it's not + important. + + src/cairo-gl-glyphs.c | 36 ++++++++---------------------------- + src/cairo-gl-private.h | 1 - + 2 files changed, 8 insertions(+), 29 deletions(-) + +commit ec1ca17b71b41159ea8754d42954863b62623536 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 12:07:53 2010 +0200 + + gl: Don't create 0x0 surfaces + + We get a very annoyed libGL if we try to create 0x0 textures, so we + return an image surface instead. + + Tested by the zero-mask test. + + src/cairo-gl-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 108e3f5031fc16843197382af78af299b19ef290 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 12:01:39 2010 +0200 + + Use a solid color for 0xN and Nx0 surfaces + + This gets around the need to check for 0-sized surfaces in the backends. + + src/cairo-gstate.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 18c963824ebbb0e7054e682ecb5664a282a58552 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 11:56:22 2010 +0200 + + Make _cairo_color_equal() work for unmultiplied colors, too + + Color stop colors are unmultiplied, and we use it there. + + src/cairo-color.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 7bd8d0db1f4ac448c93d6d342726f64a0d6300e3 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 11:23:33 2010 +0200 + + image: Fix wholly unbounded fixup + + Tested by zero-mask test. + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8aa50b5a7873b8317d0593105497607dbb2fae1d +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 10:27:37 2010 +0200 + + cairo_paint_with_alpha(cr, 0.0) is only a noop when bounded by mask + + src/cairo.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ee32dfb3de035e73cb8c2073c0826daf244e3845 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu May 13 10:04:49 2010 +0200 + + test: Add a test for various zero mask operations + + test/Makefile.sources | 3 +- + test/zero-mask.c | 199 +++++++++++++++++++++++++++++++++++++++++++ + test/zero-mask.ref.png | Bin 0 -> 402 bytes + test/zero-mask.rgb24.ref.png | Bin 0 -> 382 bytes + 4 files changed, 201 insertions(+), 1 deletion(-) + +commit 986ae4232067d4f33931d98fb6324871a1025633 +Author: Owen W. Taylor <otaylor@fishsoup.net> +Date: Thu Feb 25 15:18:22 2010 -0500 + + language bindings guide: clarify mapping for cairo_pattern_create_rgb[a] + + Clarify that cairo_pattern_create_rgb() and cairo_pattern_create_rgba() + should be be overloaded as a single constructor for SolidPattern, but + instead should be static methods. + + doc/public/language-bindings.xml | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 18b48a6ebc044c07f08bafd0abcb68c595c5746c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 13 10:00:18 2010 +0100 + + Make cairo_color_stop_t a unique type. + + Hopefully reduce the occurrence of the confusion between the + premultiplied shorts in cairo_color_t and the non-premultiplied shorts + in cairo_color_stop_t. + + The existence of the two separate types is debatable and open for + review. + + src/cairo-color.c | 4 ++-- + src/cairo-gstate.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 9 --------- + src/cairo-ps-surface.c | 32 ++------------------------------ + src/cairo-svg-surface.c | 4 ++-- + src/cairo-types-private.h | 17 ++++++++++++++++- + src/cairoint.h | 4 ++-- + 8 files changed, 26 insertions(+), 48 deletions(-) + +commit dfa2544f158930b002df74e676f3ef7aeeee1bd4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 13 09:52:39 2010 +0100 + + color: Special case comparing color stops. + + color stops are not premultiplied so we need to handle them carefully + when comparing. The next step will be to make cairo_color_stop_t a + unique type to prevent this mistake again. + + src/cairo-color.c | 30 ++++++++++++++++++++++++++++++ + src/cairo-gl-surface.c | 4 ++-- + src/cairo-gstate.c | 4 ++-- + src/cairo-pattern.c | 6 +++--- + src/cairoint.h | 4 ++++ + src/drm/cairo-drm-intel.c | 2 +- + 6 files changed, 42 insertions(+), 8 deletions(-) + +commit 4741d33cf67409a6fddbc32a5d0c8d68224cd939 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 13 09:31:10 2010 +0100 + + gstate: Don't reduce solid source and mask for SOURCE and CLEAR + + Not all operators are created equal, and this optimization breaks for + SOURCE and CLEAR where the mask operates on the clip and not the source. + + src/cairo-gstate.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ee871940ffe229ed285e618566e45c7d28c5857c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu May 13 01:54:39 2010 +0200 + + Revert bd672d080ca0036ef1b88d26583e6af36f541461 + on src/cairo-composite-rectangles.c + + The extent of the operation can be larger than the source if + the operator is not bounded by the source. + + Fixes clip-unbounded, operator-source, surface-pattern-operator + + src/cairo-composite-rectangles.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 0870c6fb5b39dcc04fa376123848adde2d06d2ce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 15 20:31:24 2010 +0100 + + gcc-4.5 warnings and optimisation flags. + + build/configure.ac.warnings | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cf0933a05aedb66b5d8999c84b935349b25dd974 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 12 10:42:14 2010 +0100 + + gallium: Refresh. + + Catch up with changes in APIs, still no substance and the integration + with winsys handles needs review. + + boilerplate/Makefile.win32.features | 8 - + build/Makefile.win32.features-h | 1 - + src/Makefile.win32.features | 8 - + src/drm/cairo-drm-gallium-surface.c | 514 ++++++++++++++++++++++-------------- + 4 files changed, 317 insertions(+), 214 deletions(-) + +commit bd672d080ca0036ef1b88d26583e6af36f541461 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 26 19:37:08 2010 +0000 + + drm: code dump, sorry. + + Lots upon lots of tiny fixes mixed in with experimental code. :( + + boilerplate/Makefile.win32.features | 18 + + boilerplate/cairo-boilerplate-drm.c | 12 +- + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 4 + + build/configure.ac.features | 1 + + configure.ac | 13 + + src/Makefile.sources | 7 + + src/Makefile.win32.features | 22 + + src/cairo-boxes-private.h | 4 + + src/cairo-boxes.c | 31 + + src/cairo-composite-rectangles.c | 7 +- + src/cairo-drm-xr.h | 66 + + src/cairo-drm.h | 4 +- + src/cairo-fixed-private.h | 18 +- + src/cairo-freelist-private.h | 1 - + src/cairo-freelist.c | 7 +- + src/cairo-image-surface.c | 2 +- + src/cairo-list-private.h | 31 +- + src/cairoint.h | 7 + + src/drm/cairo-drm-i915-glyphs.c | 82 +- + src/drm/cairo-drm-i915-private.h | 153 +- + src/drm/cairo-drm-i915-shader.c | 866 ++++++----- + src/drm/cairo-drm-i915-spans.c | 146 +- + src/drm/cairo-drm-i915-surface.c | 1884 ++++++++++++++++++------ + src/drm/cairo-drm-i965-glyphs.c | 36 +- + src/drm/cairo-drm-i965-private.h | 2 +- + src/drm/cairo-drm-i965-shader.c | 11 +- + src/drm/cairo-drm-i965-spans.c | 16 +- + src/drm/cairo-drm-i965-surface.c | 146 +- + src/drm/cairo-drm-intel-debug.c | 1 + + src/drm/cairo-drm-intel-ioctl-private.h | 25 + + src/drm/cairo-drm-intel-private.h | 92 +- + src/drm/cairo-drm-intel-surface.c | 90 +- + src/drm/cairo-drm-intel.c | 530 ++++--- + src/drm/cairo-drm-private.h | 10 +- + src/drm/cairo-drm-radeon-surface.c | 60 +- + src/drm/cairo-drm-surface.c | 37 +- + src/drm/cairo-drm-xr.c | 2377 +++++++++++++++++++++++++++++++ + 38 files changed, 5416 insertions(+), 1404 deletions(-) + +commit c8fba4960339797521afbf8068fcbe62d064f5dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 15:38:04 2010 +0100 + + rtree: Remove the unused evict hook. + + src/cairo-gl-glyphs.c | 3 +-- + src/cairo-rtree-private.h | 4 +--- + src/cairo-rtree.c | 13 +------------ + src/drm/cairo-drm-i915-surface.c | 3 +-- + src/drm/cairo-drm-intel.c | 2 +- + 5 files changed, 5 insertions(+), 20 deletions(-) + +commit 2a0726337368462046ef84d9be4cf59734b39806 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 15:30:18 2010 +0100 + + rtree: defer propagating pinned nodes until eviction. + + Only during infrequent eviction do we require absolute knowledge of + which graph of nodes are in use and thus pinned. So during the common + use of querying the glyph cache, we just mark the leaf as used. Then we + need to make space for a new glyph, we move the parents of the left + nodes from the evictable list to the pinned list. + + src/cairo-rtree-private.h | 12 ++++++++++-- + src/cairo-rtree.c | 33 +++++++++++---------------------- + 2 files changed, 21 insertions(+), 24 deletions(-) + +commit cbe8fd0794adaccdf3eb15eef780a030e3d51784 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 14:56:25 2010 +0100 + + script: Avoid the expensive of the redundant memset. + + As we are about to immediately fill the entire image, allocate the + memory ourselves to avoid the redundant memset performed by pixman. + + util/cairo-script/cairo-script-operators.c | 39 ++++++++++++++++++++---------- + 1 file changed, 26 insertions(+), 13 deletions(-) + +commit b9f7a4b5261b6d4e7bdbb5cc56d78d50ad1bd4a7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 14:48:36 2010 +0100 + + script: Don't hash the entire image. + + The reuse hit rate is very small, and most images are quickly + distinguished in the first few bytes... Though perhaps not for video as + in the swfdec-youtube case... + + util/cairo-script/cairo-script-operators.c | 35 ++++++++++++++++++++---------- + 1 file changed, 24 insertions(+), 11 deletions(-) + +commit a85c6c1e36273d534f01ade0714b0592b6bed5ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 14:09:56 2010 +0100 + + gstate: reduce a couple more operators + + src/cairo-gstate.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit a3cb52e4037db9e565d32f85d69c364b606555e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 13:36:18 2010 +0100 + + simplify pattern extents for translation matrices + + src/cairo-pattern.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit d45c7dc62d6b036bbbe85c3c1951807e055930d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 1 17:09:11 2010 +0100 + + xcb: discard glyph mask and use dst directly when possible. + + boilerplate/cairo-boilerplate-xcb.c | 12 ++++-- + src/cairo-gstate.c | 18 ++++++-- + src/cairo-pattern.c | 2 +- + src/cairo-xcb-surface-render.c | 85 +++++++++++++++++++++++++++++-------- + 4 files changed, 92 insertions(+), 25 deletions(-) + +commit a8b611ea8eb90f190ee3a9e7999e08e2d865ac43 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 27 08:23:10 2010 +0000 + + clip: Fill instead of creating intermediate surfaces. + + src/cairo-clip.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit fb53d05a69d0291fe68dfe8669b5c1f7636ede1a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 12 20:06:34 2010 +0100 + + test: Remove pthread_yield() + + I accidentally pushed this debugging left-over from when I was tracking + down a race in memfault. Remove it so that the test suite compiles on + more minimal pthread setups. + + test/pthread-same-source.c | 2 -- + test/pthread-show-text.c | 2 -- + test/pthread-similar.c | 2 -- + 3 files changed, 6 deletions(-) + +commit cdd98dba6a62360071aebb6dbbb6be2ab6be368f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 12 19:35:15 2010 +0100 + + win32-printing: compile fix. + + Missing arg for _cairo_recording_surface_replay_region(). + + src/cairo-win32-printing-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 35307fc66f649cc042ec07b7b79277d7ee5987f3 +Author: Jonathan Kew <jfkthame@gmail.com> +Date: Tue May 11 15:12:01 2010 -0400 + + win32: Grow glyph extents to account for ClearType + + Add extra pixel on each side of the glyph's black box returned by + GetGlyphOutlineW, to avoid clipping ClearType pixels. + + From https://bugzilla.mozilla.org/show_bug.cgi?id=445087 + + src/cairo-win32-font.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit d65e8064c0bd3f2d5ad200493bfefb89aefbba55 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Tue May 11 13:59:58 2010 -0400 + + Ensure the quartz backend returns the first stop for negative positions on the gradient line of a nonrepeating linear gradient. + + I discovered a small bug in cairo-quartz gradients. If you have multiple stops + at position 0, then cairo-quartz pads with the *last* stop at position 0, + instead of the first stop at position 0. This patch fixes that. + + From https://bugzilla.mozilla.org/show_bug.cgi?id=513395 + + src/cairo-quartz-surface.c | 24 ++++++++++++++++++++++-- + 1 file changed, 22 insertions(+), 2 deletions(-) + +commit ce27db9a558cbf4065b18aed55cc706fc0a6d128 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Tue May 11 13:59:52 2010 -0400 + + Don't repeat a Quartz gradient more times than necessary, to avoid Quartz quality problems when there are lots of repeated color stops. + + -- Add a parameter to _cairo_quartz_setup_source so we can pass down the + extents of the object we're drawing + -- Compute fill/stroke/glyph extents and pass them down in the cases we need to + (repeating/reflecting gradients) + -- Pass those extents on down to where we set up the gradients + -- Make _cairo_quartz_setup_linear_source fall back to pixman for the + degenerate case where the linear gradient vector has no length + -- In CreateRepeatingRadialGradientFunction and + CreateRepeatingLinearGradientFunction, use the object extents (or surface + extents, for the paint() case) instead of the clip box to calculate the + parameters for the gradient + -- I've changed the way CreateRepeatingLinearGradientFunction calculates the + repetition count. The new approach gives much more precise bounds on the number + of repetitions needed (and is very similar to what we do for radial gradients). + This is important because if we specify a much larger input range than we + really need for our gradient color function, Quartz samples it too coarsely + over the range we actually care about, and the gradients look bad. + + For example, suppose start = (5,0), end = (6,10), the CTM is identity and the + bounds we want to cover is (0,0)-(10,10). I think the current approach sets up + the gradient to be repeated 10 times. In fact only 3 repetitions are needed. + + Also, using 'width' here didn't look right: + - y_rep_end = (int) ceil((surface->extents.width - MAX(mstart.y, mend.y)) + / dy + + From https://bugzilla.mozilla.org/show_bug.cgi?id=508730 + + src/cairo-quartz-surface.c | 261 +++++++++++++++++++++++++++++++-------------- + 1 file changed, 179 insertions(+), 82 deletions(-) + +commit 7b4e63d5b8bda8e9ea1f6455d779070f64f07f6f +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Tue May 11 13:59:43 2010 -0400 + + Clean up Quartz gradient code by moving some local variables to static const globals. + + From https://bugzilla.mozilla.org/show_bug.cgi?id=508730 + + src/cairo-quartz-surface.c | 31 +++++++++++++------------------ + 1 file changed, 13 insertions(+), 18 deletions(-) + +commit 8302952dcff20a1d2de194152ace810c7056f994 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Tue May 11 13:58:10 2010 -0400 + + quartz: Don't fallback to pixman for repeating radial gradients. + + Figuring out where the outer circle should move to is tricky. I hope the + algebra in there is understandable. + + This is a nice performance improvement, probably because we avoid painting the + gradient over the entire clipBox (which is usually the entire surface). + + I tried to write reftests that compared a repeating radial gradient to a + non-repeating gradient with manually repeated stops, but it didn't work because + the rasterization was slightly different --- I'm not sure why. + + This patch also forces us to use pixman for all degenerate cases where the + circles intersect. This at least makes us consistent across platforms. + + From https://bugzilla.mozilla.org/show_bug.cgi?id=508227 + + src/cairo-quartz-surface.c | 203 ++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 180 insertions(+), 23 deletions(-) + +commit 1bda2334b32394a821e6286fbc76617e68da3895 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 11 13:51:38 2010 +0100 + + trace: And for the bonus round... Make it compile. + + util/cairo-trace/trace.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b23f3bd20450aae764f9f9362c560b00bf68636b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 11 13:54:08 2010 +0100 + + trace: Try wrapping FT_Open_Face() + + We have to be careful to disambuigate an internal call by FreeType from + the application. + + util/cairo-trace/trace.c | 38 ++++++++++++++++++++++++++------------ + 1 file changed, 26 insertions(+), 12 deletions(-) + +commit ee446910aa1db0ca0b54791a2ef3bb24b277c9a4 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon May 10 15:06:25 2010 -0400 + + Add an additional set parantheses around the container_of macro + + The non-__GNUC__ version of the container_of macro would do wrong + when used like container_of(...)-> because '->' binds tighter + than the cast in the container_of macro. Adding an additional + set of parantheses fixes this. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e540d040bddc717f17e0e2510cffc0bc3cb41ccd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 10 13:36:53 2010 +0100 + + xcb: trivial memfault fixes. + + The first fixes required to kick-start memfault testing of the xcb + backend. + + boilerplate/cairo-boilerplate-xcb.c | 22 +++++++++++--- + src/cairo-xcb-connection-render.c | 35 +++++++++++++++++------ + src/cairo-xcb-connection.c | 57 ++++++++++++++++++++++++++----------- + src/cairo-xcb-private.h | 2 +- + src/cairo-xcb-screen.c | 15 +++++----- + src/cairo-xcb-surface-core.c | 1 - + src/cairo-xcb-surface-render.c | 32 +++++++++++++++++---- + src/cairo-xcb-surface.c | 5 ++-- + src/cairo-xlib-xcb-surface.c | 1 - + 9 files changed, 123 insertions(+), 47 deletions(-) + +commit 8b486db9a9d74b40df296382eb1833bc40ae791a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 10 12:45:31 2010 +0100 + + region: _cairo_region_create_in_error() + + Avoid leaks when reporting memfault associated with constructing + regions. + + src/cairo-path-fill.c | 7 ++---- + src/cairo-region-private.h | 3 +++ + src/cairo-region.c | 63 ++++++++++++++++++++++++++++++++++++++++------ + 3 files changed, 60 insertions(+), 13 deletions(-) + +commit 9d863cd3942c3086c24d67305f7a5892604d0eeb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 8 18:20:11 2010 +0100 + + xcb: Find the correct xcb_screen_t for faking Screen + + When choosing the xcb_screen_t to use for the xlib-xcb backing surface, + it helps if it matches the screen used to generate similar surfaces and + snapshots - otherwise we end up pulling the image back from the XServer + every time we want to use the Picture. + + src/cairo-xlib-xcb-surface.c | 23 +++++++++++++++++++++-- + 1 file changed, 21 insertions(+), 2 deletions(-) + +commit 448d3571088463fc61641badcdfdc8c0002ae12a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 8 09:59:54 2010 +0100 + + xcb: Upload images in place. + + A common operation is to store an image in a similar surface, so + construct a fast path to avoid the allocation and double-blit through a + temporary pixmap. + + src/cairo-xcb-private.h | 5 ++ + src/cairo-xcb-surface-render.c | 169 ++++++++++++++++++++++++++++++++++++++++- + src/cairo-xcb-surface.c | 31 ++++---- + 3 files changed, 189 insertions(+), 16 deletions(-) + +commit e48cbd3b47a6e4f7c1f66b3085df41546460e477 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 8 09:56:46 2010 +0100 + + xcb: Reset picture after failed snapshot. + + Clear the local picture variable if we cannot use the snapshot so that + we are forced to create a new and valid picture. + + src/cairo-xcb-surface-render.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4e3c19833ef8631c1f1cd54870c0a86d88252886 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 21:30:13 2010 +0100 + + test: Force cairo-test-suite to return SUCCESS + + Set the CAIRO_TEST_FORCE_PASS environment variable to run through the + test suite and ignore errors. Useful for forcing distcheck to continue + past a broken test suite. + + test/cairo-test-runner.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit ad8abc01105f02a05497969b6b5ec2c8742daeb2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 21:28:58 2010 +0100 + + subsurface: Don't double apply device offset for deep subsurfaces. + + If we have a subsurface of a subsurface then the device offset has + already been applied to the extents that we use to offset the new + subsurface. + + src/cairo-surface-subsurface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit d2a250ad33dcd1a3960b07d2f0270266a3f3f106 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 7 20:36:33 2010 +0200 + + gl: Make the shader implementation per-context, not global + + src/cairo-gl-device.c | 8 +--- + src/cairo-gl-glyphs.c | 4 +- + src/cairo-gl-private.h | 37 +++++++++++------ + src/cairo-gl-shaders.c | 105 ++++++++++++++++++++++++++----------------------- + src/cairo-gl-surface.c | 89 +++++++++++++++++++++-------------------- + 5 files changed, 131 insertions(+), 112 deletions(-) + +commit 4571055c46e82cbb6d3ab47860d63e400b338238 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 19:36:46 2010 +0200 + + gl: Print GL errors when releasing the device + + Don't scatter calls to error printing around everywhere, instead do it + in the one place where it matters. + + Also, convert the functions to macros, so we can use __FILE__ and + __LINE__ when printing a warning + + src/cairo-gl-private.h | 15 ++++++++++----- + src/cairo-gl-surface.c | 22 +--------------------- + 2 files changed, 11 insertions(+), 26 deletions(-) + +commit 59b31aeed9b3ec2a1ac6da188ef5e86d20626662 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat May 8 15:09:39 2010 +0200 + + gl: Make check_span_renderer() call not require a device lock + + Note that we didn't lock the device previously, so the function was + broken. + + src/cairo-gl-device.c | 1 + + src/cairo-gl-private.h | 7 +++++++ + src/cairo-gl-surface.c | 5 +++-- + 3 files changed, 11 insertions(+), 2 deletions(-) + +commit 81f4dd65a32efae645b826b84e8382f7bf7a9b2d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 22:35:18 2010 +0100 + + cairo: Special case cairo_t with NULL_POINTER + + Avoid allocation for the potential user error of attempting to use + cairo_create(NULL). + + src/cairo.c | 24 +++++++++++++++++++++++- + 1 file changed, 23 insertions(+), 1 deletion(-) + +commit a61570a55e70040ffcf8ff3cb2c7943e71a5e2a0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 22:18:52 2010 +0100 + + test/copy-path: memfault status checks. + + test/copy-path.c | 61 +++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 38 insertions(+), 23 deletions(-) + +commit e6180d1d5e29a91f1bfc20956bb017ab74fb8b8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 22:18:10 2010 +0100 + + surface-fallback: Only destroy the clip after it has been initialized. + + More memfault detected error path errors. + + src/cairo-surface-fallback.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 01a208f7e3785254dc101f09a73943ec7cfb1d6e +Author: timeless <timeless@bemail.org> +Date: Fri May 7 10:24:49 2010 -0400 + + Remove useless null checks of a and b in _cairo_path_fixed_equal + + 'a' and 'b' are dereferenced before being checked for null. + + From https://bugzilla.mozilla.org/show_bug.cgi?id=555706 + + src/cairo-path-fixed.c | 22 ++++++++-------------- + 1 file changed, 8 insertions(+), 14 deletions(-) + +commit 0068d9b5cd09a7aa0c5a2ab4da97ca181934ff56 +Author: Jonathan Kew <jfkthame@gmail.com> +Date: Fri May 7 10:16:32 2010 -0400 + + quartz: Work around bad glyph extents returned by CoreGraphics for empty glyphs in Al Bayan font + + This resolves the problem by checking for the crazy glyph bbox result from + CoreGraphics, and replacing it with an empty rect. + + From https://bugzilla.mozilla.org/show_bug.cgi?id=534260 + + src/cairo-quartz-font.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit c5d9643417690380c102bf0b6ad195cb264d3feb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 11:24:28 2010 +0100 + + doc: regen + + doc/public/tmpl/cairo-font-face.sgml | 3 +++ + doc/public/tmpl/cairo-font-options.sgml | 4 ++++ + doc/public/tmpl/cairo-ft.sgml | 3 +++ + doc/public/tmpl/cairo-image.sgml | 5 +++++ + doc/public/tmpl/cairo-matrix.sgml | 3 +++ + doc/public/tmpl/cairo-paths.sgml | 3 +++ + doc/public/tmpl/cairo-pattern.sgml | 3 +++ + doc/public/tmpl/cairo-pdf.sgml | 3 +++ + doc/public/tmpl/cairo-png.sgml | 3 +++ + doc/public/tmpl/cairo-ps.sgml | 3 +++ + doc/public/tmpl/cairo-quartz-fonts.sgml | 3 +++ + doc/public/tmpl/cairo-quartz.sgml | 3 +++ + doc/public/tmpl/cairo-scaled-font.sgml | 3 +++ + doc/public/tmpl/cairo-status.sgml | 6 ++++++ + doc/public/tmpl/cairo-surface.sgml | 9 +++++++++ + doc/public/tmpl/cairo-svg.sgml | 3 +++ + doc/public/tmpl/cairo-text.sgml | 3 +++ + doc/public/tmpl/cairo-transforms.sgml | 3 +++ + doc/public/tmpl/cairo-types.sgml | 3 +++ + doc/public/tmpl/cairo-user-fonts.sgml | 4 ++++ + doc/public/tmpl/cairo-version.sgml | 5 +++++ + doc/public/tmpl/cairo-win32-fonts.sgml | 3 +++ + doc/public/tmpl/cairo-win32.sgml | 3 +++ + doc/public/tmpl/cairo-xlib-xrender.sgml | 3 +++ + doc/public/tmpl/cairo-xlib.sgml | 3 +++ + doc/public/tmpl/cairo.sgml | 3 +++ + 26 files changed, 93 insertions(+) + +commit b9e9ff59348412a1f1f2c57d6185c84f77874c26 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 7 11:21:50 2010 +0100 + + subsurface: Include device offset in extents + + Adjust the subsurface extents so that the user specifies the extents in + world space rather than device space. + + src/cairo-surface-subsurface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 5e3b28ffeac3fc7239c7ada6992e4794a27b0818 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu May 6 22:27:09 2010 -0400 + + Remove comma from the end of the CAIRO_PATTERN_ACQUIRE enum + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cc8442514ab15f08708ecb26f499c764a7d171f4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 21:50:16 2010 +0100 + + gl: Enable fixed-function without glsl. + + Through a very simple mistake we were triggering fallbacks after + detecting we were not able to perform the composite using GLSL -- we + were just returning the UNSUPPORTED status instead of enabling the + fixed-function path. + + src/cairo-gl-surface.c | 56 ++++++++++++++++++++++++++++---------------------- + 1 file changed, 31 insertions(+), 25 deletions(-) + +commit 30d358e098353af24f16cdb7efe41f10f276f559 +Author: Metal Sonic <kidlinux96@gmail.com> +Date: Thu May 6 16:07:43 2010 -0400 + + Update license blocks to use "Mozilla Foundation" instead of "Mozilla Corporation" + + From https://bugzilla.mozilla.org/show_bug.cgi?id=507387 + + src/cairo-fixed-private.h | 2 +- + src/cairo-fixed-type-private.h | 2 +- + src/cairo-malloc-private.h | 2 +- + src/cairo-quartz-font.c | 2 +- + src/cairo-quartz-image-surface.c | 2 +- + src/cairo-quartz-image.h | 2 +- + src/cairo-quartz-surface.c | 2 +- + src/cairo-quartz.h | 2 +- + 8 files changed, 8 insertions(+), 8 deletions(-) + +commit 506636e19edcdb656c94f61c915c9d49829dade8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 17:21:59 2010 +0100 + + cairo: stash a number of contexts for use with NO_MUTEX + + The implementation is the same as the atomic one (bar the use of atomic + primitives to manipulate the occupancy!). + + Patch based on the original by Jeff Muizelaar. + + src/cairo.c | 33 ++++++++++++++++++++++++++++++++- + 1 file changed, 32 insertions(+), 1 deletion(-) + +commit 91dfee420c3e9d85e5cd4f2cec6dc708c0e471a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 17:03:56 2010 +0100 + + device: Reorder finalization so that user data is destroyed last. + + As the user is likely to attach the underlying resources to the device + for automatic collection upon finalization, it is important that the + user data is then destroy last (so that those resources are still + available in the surface and device cleanup routines). + + src/cairo-device.c | 9 +++++++-- + src/cairo-surface.c | 4 ++-- + 2 files changed, 9 insertions(+), 4 deletions(-) + +commit 2658d7ef5f8f7e06929f4b1cae64e5312db24ec4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 17:02:39 2010 +0100 + + test/gl-surface-source: Attach GLXContext to device user data. + + As we actually use the GLXContext to create the device, we only want to + free those resources upon the final unreference of the device (and not + the initial surface). + + test/gl-surface-source.c | 26 +++++++++++--------------- + 1 file changed, 11 insertions(+), 15 deletions(-) + +commit f5167dc2e1a13d8c4e5d66d7178a24b9b5e7ac7a +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu May 6 11:43:52 2010 -0400 + + Add an implementation of ffs() for MSVC + + src/cairo-compiler-private.h | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit a2a2bd62ff37e2642f671ca7ebf26954e1856abe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 14:39:30 2010 +0100 + + surface-fallback: Handle memfaults during clipping. + + Don't be lazy, propagate the error rather than asserting. + + src/cairo-surface-fallback.c | 26 +++++++++++++++----------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +commit 2e3acee410ff127d4557ca8191625338cd225313 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 14:38:55 2010 +0100 + + test: Add gl-surface-source + + Exercise using GL sources. + + test/Makefile.am | 7 ++ + test/Makefile.sources | 3 + + test/gl-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/gl-surface-source.c | 115 +++++++++++++++++++++++++++++++++ + test/gl-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/gl-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + 6 files changed, 125 insertions(+) + +commit 75d8550891b8b2c09200aaaa812c6c9332161cd7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 13:50:27 2010 +0100 + + test/clip-contexts: Free secondary context + + test/clip-contexts.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit bf83bf00a75343f7d1dcd15dc4eeec1b1a4b9428 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 10:53:48 2010 +0100 + + test: Add subsurface-image-repeat + + Test handling of source clipping with an image - principally to check + handling of mime types and zero-copy image snapshotting in the vector + surfaces and ensure that they work with subsurface patterns as well. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/subsurface-image-repeat.c | 70 +++++++++++++++++++++++++++ + test/subsurface-image-repeat.image16.ref.png | Bin 0 -> 776 bytes + test/subsurface-image-repeat.ref.png | Bin 0 -> 915 bytes + 5 files changed, 73 insertions(+) + +commit 88986fdbef795c61cd60231046663d3cd80b4947 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 10:46:49 2010 +0100 + + xlib: Remove reference counting for cairo_xlib_screen_t + + The screen is owned by the cairo_xlib_display_t device, so we can + simplify and close the refleak by removing the surplus reference + counting. + + src/cairo-xlib-display.c | 84 +++++++++++------------------------------------- + src/cairo-xlib-private.h | 22 +++---------- + src/cairo-xlib-screen.c | 47 ++++++--------------------- + src/cairo-xlib-surface.c | 38 +++++++--------------- + src/cairo-xlib-visual.c | 2 +- + 5 files changed, 46 insertions(+), 147 deletions(-) + +commit 632fabc77d89254e2e6915148fa870f23c2a5722 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 10:10:38 2010 +0100 + + xlib: Convert visual array to a cairo_list_t + + It's simpler and more memory efficient. + + src/cairo-xlib-private.h | 4 ++- + src/cairo-xlib-screen.c | 76 +++++++++++++++--------------------------------- + 2 files changed, 26 insertions(+), 54 deletions(-) + +commit 20d75bdadc897be238ceb4d2d02f079e469144e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 10:03:36 2010 +0100 + + xlib: Remove screen->has_render + + Use the info from the display instead. + + src/cairo-xlib-private.h | 1 - + src/cairo-xlib-screen.c | 17 ++++------------- + 2 files changed, 4 insertions(+), 14 deletions(-) + +commit 9e0b716ecf1b27d74e63f25a055d8120d8d53309 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 09:58:46 2010 +0100 + + xlib: Remove obsolete comment, there is no race anymore + + The display lock is now held for the duration of the screen creation, so + there is no race. Remove the false comment. + + src/cairo-xlib-screen.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 62346c500a7421e30b3054fdcc07fc78a18da96e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 09:37:02 2010 +0100 + + xlib: Ensure the global display mutex is initialized before use. + + src/cairo-xlib-display.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit fb6caf08ae5ccf8f8c2c251d32fd98aacbcebdcc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 09:30:41 2010 +0100 + + image: Propagate error instead of asserting. + + Apparently we can get to this point without evaluating the clip surface, + so return the error status rather than assert. + + src/cairo-image-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 5e95c62bbb0cb28ee22af8f97267ce2da72cf47a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 6 09:09:22 2010 +0100 + + clip: Propagate failure from retrieving the previous clip surface. + + src/cairo-clip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a6ee7aea8ac11a9e5a9b58e17e881db9666a2b24 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 10:52:39 2010 +0100 + + test: Add xlib-expose-event.image16.ref.png + + test/Makefile.am | 1 + + test/xlib-expose-event.image16.ref.png | Bin 0 -> 30332 bytes + 2 files changed, 1 insertion(+) + +commit ded2dc8faaa3a48c84a31422a31c64595a6eaf8a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 14:44:55 2010 +0100 + + scaled-font: Pluck last glyph from the most recent page. + + In converting to cairo_list_t, it helps to preserve the semantics of + appending the page to the end of the list where it is expected to be + plucked in the event of an allocation failure. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa937913e06bc295750538be45aa83eb42332fb4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed May 5 21:35:11 2010 +0930 + + PS: Add missing 'q' when resetting clip path + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c594d8b405eba09b07c0a438f5311f5c5e40313 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:28:59 2010 +0200 + + gl: Get rid of ctx variable + + The code used renderer->ctx and ctx interchangably, that was confusing. + + src/cairo-gl-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit a354f1f92a17378f42d0b703482ae2b8168c7f68 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:28:24 2010 +0200 + + gl: Another case of proper device acquiring + + This patch isn't strictly necessary, but it cleans up the code. + + src/cairo-gl-surface.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 36210ee51444979271f7ba1cc0ac452cd30df0af +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:24:43 2010 +0200 + + gl: Get rid of another cast to cairo_gl_context_t + + src/cairo-gl-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 58b03691d379979b50d74740748b8b8523e0cd0d +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:21:23 2010 +0200 + + gl: Introduce _cairo_gl_device_has_glsl() function + + The function takes a cairo_device_t argument as it can be called on an + unacquired device. + + This is the first patch in a process to try to rid cairo-gl-surface.c of + casts from cairo_device_t to cairo_gl_context_t. As its members should + usually only be accessed when the device is locked, the only way the + cairo_gl_context_t should be acquired is using + _cairo_gl_context_acquire(). + + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 6 ++++++ + src/cairo-gl-surface.c | 9 ++++----- + 3 files changed, 11 insertions(+), 6 deletions(-) + +commit 5223b654230d3074d0bc31eb74c415e50eced365 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:07:49 2010 +0200 + + gl: Get rid of cairo_gl_surface_glfinish() from public API + + This is now done explicitly in the boilerplate code. It was not a useful + public API to begin with. + + boilerplate/cairo-boilerplate-gl.c | 17 +++++++---------- + src/cairo-gl-surface.c | 9 --------- + src/cairo-gl.h | 3 --- + 3 files changed, 7 insertions(+), 22 deletions(-) + +commit e071fa2c4f62b5ead39c6c6401f39360ea4dee1f +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:03:13 2010 +0200 + + gl: Remove unused member variable + + src/cairo-gl-private.h | 1 - + 1 file changed, 1 deletion(-) + +commit 90c64f60d853f1a6ea5febd362ef3528cc9d914b +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 12:01:59 2010 +0200 + + gl: Move device-specific code into cairo-gl-device.c + + src/Makefile.sources | 6 +- + src/cairo-gl-device.c | 205 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-surface.c | 162 -------------------------------------- + 3 files changed, 210 insertions(+), 163 deletions(-) + +commit 0ff5a18fd5623b57c7493e6b67a6b1c75af82fb3 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 11:52:40 2010 +0200 + + gl: Make _gl_set_destination() take the context as an argument + + Keeping with the API introduced for Xlib, functions that require an + acquired context take this context as the first argument. + + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-surface.c | 20 +++++++++----------- + 3 files changed, 11 insertions(+), 13 deletions(-) + +commit e8c5b6b1c2099fc6a49d0a082f5e884d3fbd89df +Author: Benjamin Otte <otte@redhat.com> +Date: Wed May 5 10:05:30 2010 +0200 + + Fix typo in docs + + src/cairo-array.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53508e6e3047b4dac6d69d5d3ff2208178998fd4 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 4 19:28:45 2010 +0200 + + gl: Acquire the context before destroying it. + + src/cairo-gl-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c46aec489722bf09cd10c52d70bb4975eb1546d9 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 4 19:28:22 2010 +0200 + + gl: acquire/release context during surface_finish() + + src/cairo-gl-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 88801aabb34328746a53d3d59d036dada7ced756 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue May 4 19:23:08 2010 +0200 + + gl: Acquire context when initing/destroying gl operands + + src/cairo-gl-glyphs.c | 17 ++++++----- + src/cairo-gl-private.h | 3 +- + src/cairo-gl-surface.c | 80 ++++++++++++++++++++++++++------------------------ + 3 files changed, 54 insertions(+), 46 deletions(-) + +commit c6d7d054ca44f3849ee1ab76de9032a4eaa210fe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 10:39:49 2010 +0100 + + test: Add radial-gradient-mask + + Exercise using radial gradients as a mask. + + test/Makefile.am | 6 ++ + test/Makefile.sources | 2 + + test/radial-gradient-mask-source.argb32.ref.png | Bin 0 -> 116311 bytes + test/radial-gradient-mask-source.c | 111 +++++++++++++++++++++++ + test/radial-gradient-mask-source.image16.ref.png | Bin 0 -> 82800 bytes + test/radial-gradient-mask-source.rgb24.ref.png | Bin 0 -> 129093 bytes + test/radial-gradient-mask.argb32.ref.png | Bin 0 -> 116311 bytes + test/radial-gradient-mask.c | 110 ++++++++++++++++++++++ + test/radial-gradient-mask.image16.ref.png | Bin 0 -> 82800 bytes + test/radial-gradient-mask.rgb24.ref.png | Bin 0 -> 129093 bytes + 10 files changed, 229 insertions(+) + +commit 5f878f917980cde145d4c385b0c0b66336c0f454 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 10:24:14 2010 +0100 + + clip: Trivial compiler warning + + cairo-clip.c: In function ‘_cairo_clip_path_reapply_clip_path_translate’: + cairo-clip.c:446: warning: suggest parentheses around assignment used as + truth value + + src/cairo-clip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 840dad765febf7b807bbb75e401c159a8c5c4dfe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 09:46:03 2010 +0100 + + test/mask-glyphs: Check for memfault + + test/mask-glyphs.c | 32 +++++++++++++++++++++++--------- + 1 file changed, 23 insertions(+), 9 deletions(-) + +commit ad541a1ec62e18bcaf74994affbdb0503e277f9c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 09:33:36 2010 +0100 + + clip: Propagate memfault from translating clip region + + src/cairo-clip.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 4bc54643f5cdeddf2145d28c317b55ca6b5949a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 21:36:03 2010 +0100 + + image: Propagate failure from pixman_image_set_clip_region() + + src/cairo-image-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 9ef33a1d8c0476f4f1eeba4f26523fdeb6f7d809 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 21:35:51 2010 +0100 + + test/bitmap-font: Destroy FcPattern + + test/bitmap-font.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit fba4cf1d94b3ab676e0b62ae3574bf1ee4e69de0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 09:22:03 2010 +0100 + + recording: Mark an empty recording surface as clear. + + src/cairo-recording-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit e5329805394c94c915e43a0040b51d5019b4a90e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 09:17:51 2010 +0100 + + recording: Avoid refcycles by always copying the command array. + + Short-term solution to avoid the refleaks and to make the test suite + happy. A more elegant solution would be to track the references and + avoid the substantial memory overhead of copying the recording surfaces. + + Thanks to Benjamin Otte for pointing out the solution to avoiding + refcycles. + + src/cairo-recording-surface-private.h | 1 - + src/cairo-recording-surface.c | 23 ++++++++++++----------- + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 6a06e0ef7b534355d0f3b4885159ffc37dbc3867 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 5 09:17:33 2010 +0100 + + test/subsurface-modify-parent: Free region. + + Minor refleak. + + test/subsurface-modify-parent.c | 1 + + 1 file changed, 1 insertion(+) + +commit 4a46c715564c886e7434d65625fb84b5d87c0970 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 18:51:30 2010 +0100 + + type3: Minor tweaks to remove a redundant check. + + src/cairo-type3-glyph-surface.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 11531b90a2317bb1113b187d6aa9c5083f5ecaa1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 18:50:58 2010 +0100 + + ps: Force finish of the type3 glyph surfaces. + + src/cairo-ps-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5155ebeaa25815124124db2599336ab2ddbe7413 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 18:50:27 2010 +0100 + + pdf: Assert that no other error can occur for an invertible matrix. + + src/cairo-pdf-operators.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit d9259bd06822c871a4c653f395cfc1f933caaeb7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 18:49:55 2010 +0100 + + paginated: Mark as clear initially. + + src/cairo-paginated-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit bc14e0e953630d47a65e701a377631e406eb080c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 14:18:33 2010 +0100 + + scaled-font: Convert to cairo_list_t + + Convert the open-coded doubly-linked list of glyph pages for a font into + the common cairo_list_t. + + src/cairo-scaled-font-private.h | 2 +- + src/cairo-scaled-font.c | 46 ++++++++++++++++++++--------------------- + 2 files changed, 23 insertions(+), 25 deletions(-) + +commit 627527693c38c328fdb79058f5299609c0031029 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 13:41:41 2010 +0100 + + ps: Remove the fill stroke command + + This is not supported by PostScript, so eliminate it from the prologue. + + src/cairo-ps-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 4dd92ef2bc877eb197f096c3eb8fe74cb2e7b099 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 2 14:35:59 2010 +0100 + + test: Add subsurface-pad + + Round out the subsurface tests with PAD. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/subsurface-pad.c | 76 ++++++++++++++++++++++++++++++++++++++++++++ + test/subsurface-pad.ref.png | Bin 0 -> 181 bytes + 4 files changed, 78 insertions(+) + +commit 85e3cffde164a5af444639dfd182fde2448809ee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 21:09:01 2010 +0100 + + test: Add subsurface-modify-{child,parent} + + Add tests to ensure that modifications to the subsurface via the + original surface are tracked by the subsurface, i.e. that any snapshots + are detached upon modification of the parent as well as modification of + itself and vice versa. + + test/Makefile.am | 2 + + test/Makefile.sources | 2 + + test/subsurface-modify-child.c | 98 ++++++++++++++++++++++++++++++++++ + test/subsurface-modify-child.ref.png | Bin 0 -> 197 bytes + test/subsurface-modify-parent.c | 77 ++++++++++++++++++++++++++ + test/subsurface-modify-parent.ref.png | Bin 0 -> 197 bytes + 6 files changed, 179 insertions(+) + +commit 19ac81f50ba353400934bf112523b4257ad9de2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 18:25:23 2010 +0100 + + scaled-font: Remove MRU cache upon detection of error. + + src/cairo-scaled-font.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 6f2d4f5b2aba9344fee9375614dfd0c6236bfd7c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 18:09:11 2010 +0100 + + image: Propagate failure from pixman_image_fill_boxes(). + + src/cairo-image-surface.c | 55 ++++++++++++++++++++++++++--------------------- + 1 file changed, 30 insertions(+), 25 deletions(-) + +commit ded7be0b9ce12f8d4a84c8c9dd622d92fe347a34 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 17:01:35 2010 +0100 + + test/user-font-rescale: Use after free and check for memfault. + + test/user-font-rescale.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit b0052c52153376400a30dca1d67f4aca9735cc09 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 17:01:17 2010 +0100 + + test/bitmap-font: Propagate memfault + + test/bitmap-font.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 9187c7532755dda8d2677ec792162c71029fb37d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 13:18:09 2010 +0100 + + test/bitmap-font: Check for memfault error + + test/bitmap-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0fced9279227614ede6964e94ede9de49a3a3388 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 13:17:38 2010 +0100 + + test/user-font-proxy: Check we install user data on the scaled font + + test/user-font-proxy.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 38188961b996c97d344195749b7bec8c93f9bad7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 13:17:07 2010 +0100 + + image: Check for pixman image allocation failure during glyphs + + src/cairo-image-surface.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 4a181ebac416ec35e412ddbe9ed1392fb8b74ab7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 10:26:30 2010 +0100 + + pdf: Cleanup local reference to source on error paths. + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ba48edcd86ee1bca06b25587e56abcd2c1b19d79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 10:26:13 2010 +0100 + + ps: Always cleanup used font subsets. + + src/cairo-ps-surface.c | 19 ++++++++----------- + 1 file changed, 8 insertions(+), 11 deletions(-) + +commit 9a0958be012e097c239260fac0dec0b1e5679028 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 10:25:48 2010 +0100 + + test: Cleanup after failed pthread_join(). + + test/pthread-same-source.c | 17 +++++++++-------- + test/pthread-show-text.c | 17 +++++++++-------- + test/pthread-similar.c | 17 +++++++++-------- + 3 files changed, 27 insertions(+), 24 deletions(-) + +commit 08b9984da9f2119cd4ed03bbd656a349b49d1f12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 08:19:41 2010 +0100 + + image: Replace assert with error return + + It is possible to encounter an allocation failure here since we may have + tweaked the clip since the last evaluation of the clip region. + + src/cairo-image-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2c68fcace4ad47ad09e9699e45afb514be1381f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 20:39:34 2010 +0100 + + test: Embed the list pointer into cairo_test_t + + Reduce the amount of output printed by leak-detectors when a test + crashes. + + test/cairo-test-runner.c | 31 +++++++++++++++---------------- + test/cairo-test.h | 7 ++++--- + 2 files changed, 19 insertions(+), 19 deletions(-) + +commit 7002b824729885a9d579f677ecc665b620847480 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 4 13:52:09 2010 +0200 + + xlib: Don't delete gradients in unbounded fixup code + + The fix is ugly, but for now it works. + + src/cairo-xlib-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit af26560f258d93cc78782ddd0208128756874c11 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 19:21:59 2010 +0100 + + test: Improve memfault behaviour. + + Various minor tweaks to convert asserts into error returns and to + improve error checking on intermediate surfaces. + + boilerplate/cairo-boilerplate-svg.c | 2 +- + test/cairo-test.c | 21 ++++++++++++--- + test/png.c | 34 +++++++++++++++++-------- + test/pthread-same-source.c | 7 +++++ + test/surface-source.c | 11 ++++++-- + test/toy-font-face.c | 16 +++++++++--- + test/user-data.c | 51 ++++++++++++++++++++++++++----------- + test/xlib-surface-source.c | 7 ++++- + 8 files changed, 112 insertions(+), 37 deletions(-) + +commit c549203c8d69474be4362037f702e4fb59c9929e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 19:21:18 2010 +0100 + + scaled-font: Check for an error return when retrieving the implementation + + src/cairo-scaled-font.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit c93e6f014d9678b1aea34fd7a30a1fc2f51c6347 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 19:20:42 2010 +0100 + + paginated: propagate malloc failures more cleanly. + + src/cairo-paginated-surface.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 8e9fd9c01732c3102c27c7dee50f6e494ba7cdd8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 19:20:07 2010 +0100 + + image: A few missing tests for malloc failure + + src/cairo-image-surface.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 87781ffbd914bca29b4d744fb48678ab06a07108 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 3 19:18:49 2010 +0100 + + ft: Convert an assert into an unlikely error return. + + The assert depends upon good behaviour from fontconfig, which is no + guaranteed under memfault, so return an error instead. + + src/cairo-ft-font.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 5672b7a18a34456862977a1cf678bf6575dcc3f4 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon May 3 13:13:27 2010 +0200 + + fallback: get src_x/y variables right when compositing traps + + src/cairo-image-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c10a5a9fb0463f254fb607a2260b540256f888cc +Author: Dave Yeo <daveryeo@telus.net> +Date: Mon May 3 10:20:51 2010 +0200 + + os2: Fix get_extents() segfaulting. + + bed2701e1c89095878d549cbca8f22d84f3dda3c removed one line too much. + + src/cairo-os2-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9df81fe4d3f0ccc5632d0e84e920fe1c448bd531 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun May 2 19:59:26 2010 +0200 + + boilerplate: don't compile pdf test code when pdf is not tested + + Avoids gcc warnings when libpoppler version isn't good enough. + + boilerplate/cairo-boilerplate-pdf.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 358f57c8765f823f8e6db7629ea6ca48fcd392b8 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Apr 30 23:29:24 2010 +0200 + + image: remove useless optimization + + The optimization is done way smarter inside + _cairo_matrix_transform_bounding_box() + + src/cairo-image-surface.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit 94aa6d24b6d5ab4528a0b0a9b1b0c6eb7218f861 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Apr 30 23:24:41 2010 +0200 + + fallback: Create pixman image for correct rectangle + + This was most prominently shown by the a1-image-sample test, but + multiple tests exposed the problem with the xlib-fallback code. + + src/cairo-image-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 41fecf8e662c9ad2fe063754db8302f349a223ef +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 30 21:18:52 2010 +0200 + + [configure] Bump poppler dependency to 0.13.3 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3294daf423e88b55aa13841dfa7c557ee9833f92 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Apr 30 20:14:54 2010 +0200 + + Create cleared surface instead of a scratch surface in clone_similar() + + A cleared surface is needed when playing back a recording surface that + has semi-transparent operations. + As this only affects surface types where scratch surfaces aren't already + cleared (ie it affected xlib but not image), the effect was only visible + for those backends. + This should not cause any performance regressions as the other backends + set surface->clear = TRUE when creating the scratch surface, so the + clear operation is effectively a no-op. + + Covered by the existing pdf-surface-source and svg-surface-source tests. + + src/cairo-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 0aeb612d2f822e8cda1f509b6a4f2995e24053fc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 30 16:18:57 2010 +0200 + + [test] Update pdf reference image for text-rotate + + test/text-rotate.pdf.ref.png | Bin 16757 -> 16744 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit fe2844464721644b837816aa4dad4ead508f0b89 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 30 16:16:23 2010 +0200 + + [test] Update pdf reference image for surface-pattern-scale-down + + test/surface-pattern-scale-down.pdf.ref.png | Bin 1603 -> 2189 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit dba6f23318005a4cdbe7566519ce896278ea184a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 30 16:11:52 2010 +0200 + + [test] Update pdf reference image for leaky-dashed-rectangle + + test/leaky-dashed-rectangle.pdf.ref.png | Bin 380 -> 377 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 6b81187ac4870311a10c024af9f30c366be785cd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Apr 30 16:05:21 2010 +0200 + + [test] Update pdf reference images for clip-operator + + test/clip-operator.pdf.argb32.ref.png | Bin 9266 -> 9437 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 5166 -> 5391 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit b485ae5b90bf72cde0c30c2350e03d1369ca6dcd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 14:14:01 2010 +0100 + + atomic: Add Andrea's copyright notice + + Note Andrea's copyright for his contribution of platform agnostic + fallbacks and the implementation for MacOS/X. + + src/cairo-atomic-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4ee5119a3467ea086efccef2907b0c576d600b79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 13:00:05 2010 +0100 + + test: Expand pthread-show-text to cover all surfaces. + + In a similar fashion to pthread-same-source and pthread-similar, check + that the texting handling is thread-safe for all surface and font + backends. + + test/Makefile.am | 3 + + test/pthread-show-text.c | 118 +++++++++++++++++++++------------ + test/pthread-show-text.image16.ref.png | Bin 0 -> 22167 bytes + test/pthread-show-text.ps.ref.png | Bin 0 -> 16558 bytes + test/pthread-show-text.ref.png | Bin 0 -> 29885 bytes + 5 files changed, 77 insertions(+), 44 deletions(-) + +commit c6dc8ad7dc46d03899cd37fff40bd7f3a60339e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 12:38:25 2010 +0100 + + Revert "paginated: Call surface finish explicitly on recording surface" + + This reverts commit 5fc04bba9fa8ddda8cf7d7a97015f21a21429172. + + Whilst this fixes the self-referential reference leak, it however + introduces use-after-finish into normal behaviour. Close, but not quite. + + src/cairo-paginated-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit b972669c9ac87d1c2ca922e12024ef5da394aa6b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 12:37:16 2010 +0100 + + boilerplate: Fix use after free from 3ae5723 + + If we want to access the surface during the cleanup, we must hold our + own reference to it. Make it so for the forced finish of the recording + surface. + + boilerplate/cairo-boilerplate.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 905c345df1f828551af2ab0b751388428e4dfaf6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 10:31:50 2010 +0100 + + recording: Check that we do not use a finished recording surface. + + User paranoia - as the replay is exposed to the user it is convenient to + add the finish check in the core replay function so that we gain a + paranoia check for the internal paths as well. + + src/cairo-recording-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 5fe7c5842f3589efce765b3869c1dd55367a5aba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 10:13:09 2010 +0100 + + pdf; Emit subsurface patterns natively. + + Encode subsurface patterns into the PDF stream natively (when possible), + similar to the cairo-ps backend. + + src/cairo-pdf-surface.c | 113 ++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 94 insertions(+), 19 deletions(-) + +commit 8ded35fd69ed0bbb07359c0278071a25af66571c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 14:26:21 2010 +0100 + + ps: Enable native encoding of subsurface patterns. + + Carefully handle subsurfaces of a recording surface through the analysis + and paginated surfaces so that we can generate a native pattern for the + vector backends, demonstrated by the PostScript backend. + + Nothing remarkable, just a lot of bookkeeping to track the wrapped + surface types and to apply the correct offsets when generating the + subsurface pattern. + + src/cairo-analysis-surface.c | 13 +- + src/cairo-paginated-surface.c | 1 + + src/cairo-pdf-surface.c | 4 +- + src/cairo-ps-surface.c | 121 +++++++++++-- + src/cairo-recording-surface-private.h | 1 + + src/cairo-recording-surface.c | 12 +- + src/cairo-surface-private.h | 4 +- + src/cairo-surface-subsurface-private.h | 4 +- + src/cairo-surface-subsurface.c | 101 +++++++---- + src/cairo-surface-wrapper-private.h | 7 +- + src/cairo-surface-wrapper.c | 314 +++++++++++++++++++++++++++------ + src/cairo-surface.c | 13 +- + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/subsurface-reflect.c | 76 ++++++++ + test/subsurface-reflect.ref.png | Bin 0 -> 210 bytes + test/subsurface-repeat.c | 8 +- + test/subsurface-similar-repeat.c | 3 + + test/subsurface.c | 7 +- + test/subsurface.image16.ref.png | Bin 1430 -> 1643 bytes + test/subsurface.ref.png | Bin 1597 -> 1811 bytes + 21 files changed, 565 insertions(+), 126 deletions(-) + +commit 5fc04bba9fa8ddda8cf7d7a97015f21a21429172 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 21:51:29 2010 +0100 + + paginated: Call surface finish explicitly on recording surface + + During show_page() when we destroy the recording surface after emitting + the page, ensure that we actually call cairo_surface_finish() to dispose + of any self-referential reference leaks. + + src/cairo-paginated-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 3ae57234644c3756785c551beffe584f837b0273 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 21:50:22 2010 +0100 + + boilerplate: Ensure that the recording surfaces are finished. + + Be paranoid and explicitly call finish to cleanup self-referential leaks + when using paginated/recording surfaces. + + boilerplate/cairo-boilerplate-pdf.c | 5 ++++- + boilerplate/cairo-boilerplate-ps.c | 5 ++++- + boilerplate/cairo-boilerplate-svg.c | 5 ++++- + boilerplate/cairo-boilerplate.c | 10 +++++----- + 4 files changed, 17 insertions(+), 8 deletions(-) + +commit f08cc311af1248b39c3e757ef192515ed8506862 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 20:34:56 2010 +0100 + + boilerplate: Destroy the redundant image reference + + When using a script surface to record the recording surface, we replace + the local reference to the image surface. + + boilerplate/cairo-boilerplate.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ab2776c9a16134c50b48fd202263421ec0f466e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 18:50:32 2010 +0100 + + snapshot: Attach the backend generated snapshot to the target + + Cache the result of snapshotting using the backend vfunc in the normal + manner by attaching the snapshot to the target. This should reduce + resource usage in these cases. + + src/cairo-surface-snapshot.c | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 07122f37d11eabe62bc9c81ccbf71bbe8b7a1005 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 15:19:18 2010 +0100 + + surface: Convert snapshots from an array to a double-linked list. + + Saves the memory allocation for the array, and the overhead of + maintaining the area for both insertions and more importantly deletes. + + src/cairo-recording-surface.c | 6 +- + src/cairo-surface-private.h | 5 +- + src/cairo-surface-snapshot.c | 10 +-- + src/cairo-surface.c | 130 ++++++++++++++----------------------- + src/cairo-vg-surface.c | 8 +-- + src/cairo-xcb-surface-core.c | 6 +- + src/cairo-xcb-surface-render.c | 10 +-- + src/cairo-xcb-surface.c | 12 ++-- + src/cairoint.h | 2 +- + src/drm/cairo-drm-i915-shader.c | 11 ++-- + src/drm/cairo-drm-i965-shader.c | 11 ++-- + src/drm/cairo-drm-intel-surface.c | 8 +-- + src/drm/cairo-drm-radeon-surface.c | 8 +-- + 13 files changed, 77 insertions(+), 150 deletions(-) + +commit 4cb733c28551f4a34cd4a225b8d797a55bf9b977 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 12:04:44 2010 +0100 + + image: Simplify translation of pattern matrix for composite_trapezoids() + + src/cairo-image-surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 3940b0e91c274de0cf2fca4b34d4025b92965c19 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 17:29:13 2010 +0100 + + subsurface: s/region/rectangle/ + + After a renewed discussion, it was pointed out that the API in Cairo was + not restrictive and by using doubles we would be consisted with the rest + of the API. Thus prompting the name change to + + cairo_surface_create_for_rectangle() + + similar to cairo_rectangle(). + + And document the public API. + + src/cairo-surface-subsurface.c | 39 ++++++++++++++++++++++++------ + src/cairo.h | 10 ++++---- + test/subsurface-repeat.c | 4 +-- + test/subsurface-similar-repeat.c | 2 +- + test/subsurface.c | 4 +-- + util/cairo-script/cairo-script-operators.c | 12 ++++----- + util/cairo-trace/trace.c | 10 ++++---- + 7 files changed, 53 insertions(+), 28 deletions(-) + +commit 4b6fa8d5a78731aca80f3c8c6320e7edc845c5b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 30 09:47:51 2010 +0100 + + test: Remove group-unaligned.*new.png + + Entirely misleading, looks like PDF is behaving the same as image and + this remnant was thus giving the wrong impression. + + test/Makefile.am | 1 - + test/group-unaligned.pdf.new.png | Bin 427 -> 0 bytes + 2 files changed, 1 deletion(-) + +commit e3f990d84131f7bd1e64e54d02bac780b1e9f85e +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 22:34:35 2010 +0200 + + test: Update reference images for last checkin + + Both tests now pas on all backends I tested: test, image, xlib and + recording + + test/a1-traps-sample.ref.png | Bin 148 -> 120 bytes + test/unantialiased-shapes.ref.png | Bin 3969 -> 3968 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 6d36f06751377459e35afe1ac26c59d33b16c730 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 22:12:02 2010 +0200 + + image: Round down when rendering antialiased boxes + + Matches Pixman's output when going via pixman_rasterize_trapezoid() + + src/cairo-fixed-private.h | 6 ++++++ + src/cairo-image-surface.c | 9 +++++---- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit 95179a5de91b5c6f99dbccc3b6c950df58d4f2a7 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 20:45:23 2010 +0200 + + Remove excessive semicolons + + s/;;/;/ basically + + src/cairo-image-surface.c | 2 +- + src/cairo-wideint.c | 2 +- + src/drm/cairo-drm-i965-shader.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 5d07307b691afccccbb15f773d5231669ba44f5a +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 18:20:59 2010 +0200 + + xlib: Don't modify variables that are needed later + + In the XCopyArea region code, don't modify src_x/y when they are later + used in the unbounded fixup code. + + Exposed by composite-integer-translate-source test. + + src/cairo-xlib-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 90160deb2a84f787dff46243471e37600b24799b +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 18:20:44 2010 +0200 + + xlib: Constify some function arguments + + src/cairo-xlib-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 4da71d1a01c4d4cc84b5e31cc89dd7f297b23359 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 18:11:54 2010 +0200 + + xlib: remove unused code + + src/cairo-xlib-surface.c | 12 ------------ + 1 file changed, 12 deletions(-) + +commit 758ffadcb1d0a0478d43ca40775687a37e5920a4 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 16:54:09 2010 +0200 + + fallback: Only do _fill/compsoite_rectangles on bounded source + + For unbounded sources, these optimizations fail to take into account the + regions outside the source. + + src/cairo-surface-fallback.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 6288ad719da898c4a75cdc6527f5a41d4c900e57 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 15:37:32 2010 +0200 + + fallback: translate extents regions properly + + The extents clip regions that were created for unbounded operators were + not translated properly. This has been changed now. + + This is a followup to 9ce8bef9d6e6d773dd1f4b184916ed5c96c3541d. + + src/cairo-surface-fallback.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit b0760826f30f63637561b353e7eed1913036da2d +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 12:11:48 2010 +0200 + + test: Set have_result for image matches + + Causes the log to contain information about the reference imagery used. + + test/cairo-test.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 8f85c2d77cc2ca7984f9771c0096fbad798dbde8 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 29 12:09:31 2010 +0200 + + image: translate source pattern in composite_trapezoids() + + Fixes xlib fallback paths as exposed by the clip-push-group test. + + src/cairo-image-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit aa495eac5a2db9b396eb1953eb112c733d0ababc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 29 10:04:18 2010 +0100 + + atomic: Tweak for compilation x86. + + Missing definition of _cairo_atomic_ptr_get() used in the fallbacks. + + src/cairo-atomic-private.h | 27 ++++++++++++++++++++------- + src/cairo-atomic.c | 16 ++++++++-------- + 2 files changed, 28 insertions(+), 15 deletions(-) + +commit 248af38b3efa3f96225eea43f4ba5b94baff34a6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Apr 28 17:23:47 2010 +0200 + + atomic: Add MacOSX atomic implementation + + Enable atomic operation on MacOS X, using the functions provided by + libkern/OSAtomic.h + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + build/aclocal.cairo.m4 | 10 ++++++++++ + src/cairo-atomic-private.h | 30 ++++++++++++++++++++++++++++++ + 2 files changed, 40 insertions(+) + +commit 56a367a1626b2b7ec3d9e64e74f016867f294a34 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Apr 28 19:17:10 2010 +0200 + + atomic: Correct implementation of _atomic_fetch () + + _atomic_fetch() was expected to replace the content of a slot with + NULL and return the old content, but it incorrectly returned the + previous content even if it was unable to perform the exchange + (because of conflicts with other threads accessing the pool). + + Fix suggested by Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-freed-pool-private.h | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit d66b1ca1cfda64088521581bc2bd494bff9f5d23 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Apr 28 16:23:15 2010 +0200 + + atomic: Separate bool and old-value compare-and-exchange + + Some implementations only offer one version of compare-and-exchange, + thus we expose both through cairo-atomic, implementing what is missing + through appropriate fallbacks. + *_cmpxchg() now return a boolean (this unbreaks _cairo_atomic_uint_cmpxchg) + *_cmpxchg_return_old() return the old value + Code is updated everywhere to reflect this, by using *_cmpxchg() + wherever the returned value was only tested to check if the exchange + had really taken place. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-atomic-private.h | 68 ++++++++++++++++++++++++++++++++++++++---- + src/cairo-atomic.c | 4 +-- + src/cairo-freed-pool-private.h | 4 +-- + src/cairo-image-surface.c | 6 ++-- + src/cairo.c | 4 +-- + src/drm/cairo-drm.c | 2 +- + 6 files changed, 72 insertions(+), 16 deletions(-) + +commit a0bf424b820b404947671b56f357a2cef71640fb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Apr 28 15:29:32 2010 +0200 + + atomic: Remove unused function _cairo_atomic_int_set() + + _cairo_atomic_int_set() was only used in the definition of + CAIRO_REFERENCE_SET_VALUE, which was never used. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-atomic-private.h | 10 ---------- + src/cairo-atomic.c | 8 -------- + src/cairo-reference-count-private.h | 1 - + 3 files changed, 19 deletions(-) + +commit 9ce8bef9d6e6d773dd1f4b184916ed5c96c3541d +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 18:34:20 2010 +0200 + + fallback: Propagate extents properly + + Otherwise unbounded operators will clear the full surface. + Improves the score for the unbounded-operator test, in particular the + output for the test-fallback case. + + src/cairo-surface-fallback.c | 112 ++++++++++++++++++++++++++++++------------- + 1 file changed, 78 insertions(+), 34 deletions(-) + +commit 91fd97ae7c4de23c61d481c98c9352f0639d76dd +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 20:21:37 2010 +0200 + + fallback: Pass the correct extents for unbounbded operations + + src/cairo-surface-fallback.c | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +commit 06e9caf86199e8261a07db6d4774628fa147728d +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 20:05:13 2010 +0200 + + image: pixman_image_fill_rectangles() => pixman_image_fill_boxes() + + src/cairo-image-surface.c | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit bc49df322770b3bd1797c0e153b97f1f296fbd1e +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 19:56:36 2010 +0200 + + pixman_image_composite => pixman_image_composite32 + + Fix up the remaining callers + + src/cairo-gl-surface.c | 12 ++++++------ + src/cairo-image-surface.c | 12 ++++++------ + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 393da364a7f26e696141c58d4fb6fdefb2ea245a +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 18:18:15 2010 +0200 + + fallback: Sanitize code that queries surface extents + + The previous code was setting extents.is_bounded, but that value has a + completely different meaning. + + src/cairo-surface-fallback.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 13914039567d5e8269fc29c51018ce172a40f2e9 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 13:05:28 2010 +0200 + + test: run xlib-expose-event test unconditionally + + test/Makefile.sources | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2ce1afa3222145e9c4f8c74a0034e0da9e93b70b +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 12:54:54 2010 +0200 + + test-suite: add image_diff_is_failure() function + + This cleans the code and fixes a boolean logic error where this check + was done manually. + + test/buffer-diff.c | 8 ++++++++ + test/buffer-diff.h | 4 ++++ + test/cairo-test-trace.c | 3 +-- + test/cairo-test.c | 9 +++------ + test/fallback-resolution.c | 3 +-- + test/xlib-surface.c | 4 ++-- + 6 files changed, 19 insertions(+), 12 deletions(-) + +commit 2a91d425088cb8a93de76f2f91f32a7f23f0aecd +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 28 12:26:29 2010 +0200 + + fallback: Fix clip_region handling in mask creation + + Fixes the xlib-expose-event test. + + src/cairo-surface-fallback.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit bb853916f3581af13cc1abff185ef5e0218f9f1e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 11:37:59 2010 +0100 + + image: Generate clear/white/black images when !HAS_ATOMIC_OPS + + Andrea reported that b74cc0f broke compilation without atomic ops. + + src/cairo-image-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 45d4c6e0b2fe62a3c6f1fdb7f359c9771111b470 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 10:01:06 2010 +0100 + + script: Replace the missing " " after pop + + I accidentally deleted the whitespace after popping the recording + surface, thus causing the scripts to be broken. + + src/cairo-script-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6a99e83c50d715ba1e47aa5c7be714a423568e57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 09:55:20 2010 +0100 + + subsurface: Mark the image as !clear after copying. + + src/cairo-surface-subsurface.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit ca3df75e8f876991f2dc9e85c9daa3fd96e826d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 09:54:56 2010 +0100 + + script: Reconstruct subsurfaces. + + src/cairo-script-surface.c | 84 ++++++++++++++++++++++++++++++++-------------- + 1 file changed, 58 insertions(+), 26 deletions(-) + +commit 0f0d349a400e097856e6d9863e66c0a041e65c35 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 09:54:37 2010 +0100 + + trace: Wrap cairo_surface_create_for_region() + + util/cairo-script/cairo-script-operators.c | 33 +++++++++++++++++++++++++++ + util/cairo-trace/trace.c | 36 ++++++++++++++++++++++++++++++ + 2 files changed, 69 insertions(+) + +commit 80fc2a8e49aa6ab4646b14eed9a4cf348a9149b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 28 09:50:49 2010 +0100 + + test: Expand xlib-expose-event to cover all backends + + Use a similar surface to create an equivalent backing surface for + any backend, thus enabling the test to run against any target. + + The comment about forcing fallbacks has long since been false. + + test/xlib-expose-event.c | 76 ++++++------------------------------------------ + 1 file changed, 9 insertions(+), 67 deletions(-) + +commit d3c4349730be991db0c85094103c744fc2d94836 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 21:04:52 2010 +0100 + + test: Mark surfaces as finished if the data goes out of scope. + + The issue being that as the on-stack data is being referenced via a + zero-copy snapshot outside of the functions scope as the surface is only + finished and the source written long after the draw() returns. The + correct procedure is that the user must call cairo_surface_finish() + prior to any surface becoming inaccessible. In this case, this triggers + the snapshot to preserve a copy of the data whilst it is still valid. + + test/bilevel-image.c | 4 +++- + test/filter-nearest-offset.c | 1 + + test/mask-ctm.c | 4 +++- + test/mask-surface-ctm.c | 1 + + test/move-to-show-surface.c | 2 ++ + test/paint-repeat.c | 1 + + test/paint-source-alpha.c | 1 + + test/paint-with-alpha.c | 1 + + test/rgb24-ignore-alpha.c | 1 + + test/scale-down-source-surface-paint.c | 1 + + test/scale-source-surface-paint.c | 1 + + test/set-source.c | 1 + + test/smask-image-mask.c | 4 +++- + test/smask.c | 4 +++- + test/source-surface-scale-paint.c | 1 + + test/translate-show-surface.c | 1 + + test/zero-alpha.c | 1 + + 17 files changed, 26 insertions(+), 4 deletions(-) + +commit a5f54e48e3136076f3c8c60fc068f6a2105d9a33 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 21:05:22 2010 +0100 + + snapshot: The snapshot masquerades as the target surface type. + + Not wholly convinced this is a good idea, but it matches the behaviour + of the other internal surface types. + + src/cairo-surface-snapshot.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4a678afdf73d6f7b2b8a532ac7024976702c8aac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 18:57:56 2010 +0100 + + snapshot: Simply memcpy if the cloned image matches the original. + + src/cairo-surface-snapshot.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit b74cc0f6d5b71295c70d4c29e24ab252175f9a5b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 18:57:00 2010 +0100 + + image: Convert 1x1 samples into solid colors. + + If the sampled extents of the operation on an image surface is just a + single pixel, we can safely convert to a solid color. + + src/cairo-image-surface.c | 161 +++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 136 insertions(+), 25 deletions(-) + +commit f5cf131a9d8984bd6b3403396beed2ffbc26bded +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 18:56:23 2010 +0100 + + surface: skip OVER is the source is clear. + + If the source has no alpha, the OVER operation becomes DST, i.e. a + no-op. + + src/cairo-surface.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit 453b1cba11f71694cfe0c3d934ac1f5aabda67fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 16:47:31 2010 +0100 + + test: Update image ref images, and used fonts in README + + test/Makefile.am | 2 +- + test/README | 6 +++--- + test/finer-grained-fallbacks.argb32.ref.png | Bin 0 -> 1068 bytes + test/finer-grained-fallbacks.ref.png | Bin 1070 -> 0 bytes + test/finer-grained-fallbacks.rgb24.ref.png | Bin 839 -> 837 bytes + test/ft-text-vertical-layout-type1.ref.png | Bin 3644 -> 3591 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3608 -> 3616 bytes + test/mask-glyphs.ref.png | Bin 1189352 -> 1189351 bytes + test/smask-text.ref.png | Bin 1874 -> 1672 bytes + test/smask.ref.png | Bin 3423 -> 3396 bytes + 10 files changed, 4 insertions(+), 4 deletions(-) + +commit 70656bba81e01eaf7b48817b2ca16fdf6d0b4bd5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 14:19:22 2010 +0100 + + test: Add image16 refs + + test/Makefile.am | 144 +++++++++++++++++++++ + test/big-line.image16.ref.png | Bin 0 -> 988 bytes + test/bug-bo-rectangular.image16.ref.png | Bin 0 -> 955 bytes + test/caps-joins-alpha.image16.ref.png | Bin 0 -> 2268 bytes + test/caps-joins-curve.image16.ref.png | Bin 0 -> 4928 bytes + test/caps-joins.image16.ref.png | Bin 0 -> 2587 bytes + test/caps-sub-paths.image16.ref.png | Bin 0 -> 171 bytes + test/caps.image16.ref.png | Bin 0 -> 1936 bytes + test/clear-source.image16.ref.png | Bin 0 -> 909 bytes + test/clip-disjoint.image16.ref.png | Bin 0 -> 3886 bytes + test/clip-fill-no-op.image16.ref.png | Bin 0 -> 153 bytes + test/clip-fill-rule.image16.ref.png | Bin 0 -> 356 bytes + test/clip-fill-unbounded.image16.ref.png | Bin 0 -> 1204 bytes + test/clip-fill.image16.ref.png | Bin 0 -> 904 bytes + test/clip-image.image16.ref.png | Bin 0 -> 2032 bytes + test/clip-operator.image16.ref.png | Bin 0 -> 3131 bytes + test/clip-push-group.image16.ref.png | Bin 0 -> 159 bytes + test/clip-shape.image16.ref.png | Bin 0 -> 2488 bytes + test/clip-stroke-no-op.image16.ref.png | Bin 0 -> 153 bytes + test/clip-stroke-unbounded.image16.ref.png | Bin 0 -> 1255 bytes + test/clip-stroke.image16.ref.png | Bin 0 -> 1308 bytes + test/clip-text.image16.ref.png | Bin 0 -> 811 bytes + test/clip-twice.image16.ref.png | Bin 0 -> 1069 bytes + test/clipped-group.image16.ref.png | Bin 0 -> 281 bytes + test/clipped-surface.image16.ref.png | Bin 0 -> 296 bytes + test/close-path-current-point.image16.ref.png | Bin 0 -> 1804 bytes + ...omposite-integer-translate-over.image16.ref.png | Bin 0 -> 11570 bytes + ...posite-integer-translate-source.image16.ref.png | Bin 0 -> 11570 bytes + test/copy-path.image16.ref.png | Bin 0 -> 556 bytes + test/culled-glyphs.image16.ref.png | Bin 0 -> 426 bytes + test/dash-caps-joins.image16.ref.png | Bin 0 -> 4491 bytes + test/dash-curve.image16.ref.png | Bin 0 -> 32445 bytes + test/dash-scale.image16.ref.png | Bin 0 -> 7748 bytes + test/dash-state.image16.ref.png | Bin 0 -> 7910 bytes + test/degenerate-arc.image16.ref.png | Bin 0 -> 592 bytes + test/degenerate-arcs.image16.ref.png | Bin 0 -> 120 bytes + test/degenerate-curve-to.image16.ref.png | Bin 0 -> 278 bytes + test/degenerate-pen.image16.ref.png | Bin 0 -> 954 bytes + test/degenerate-rel-curve-to.image16.ref.png | Bin 0 -> 279 bytes + test/extend-pad-border.image16.ref.png | Bin 0 -> 446 bytes + test/extend-reflect-similar.image16.ref.png | Bin 0 -> 99786 bytes + test/extend-reflect.image16.ref.png | Bin 0 -> 99786 bytes + test/extend-repeat-similar.image16.ref.png | Bin 0 -> 83738 bytes + test/extend-repeat.image16.ref.png | Bin 0 -> 83738 bytes + test/extended-blend-alpha.image16.ref.png | Bin 0 -> 4626 bytes + test/extended-blend.image16.ref.png | Bin 0 -> 4145 bytes + test/fill-alpha-pattern.image16.ref.png | Bin 0 -> 3380 bytes + test/fill-alpha.image16.ref.png | Bin 0 -> 2145 bytes + test/fill-and-stroke-alpha-add.image16.ref.png | Bin 0 -> 536 bytes + test/fill-and-stroke-alpha.image16.ref.png | Bin 0 -> 470 bytes + test/fill-and-stroke.image16.ref.png | Bin 0 -> 251 bytes + test/fill-degenerate-sort-order.image16.ref.png | Bin 0 -> 1753 bytes + test/fill-image.image16.ref.png | Bin 0 -> 1163 bytes + test/fill-rule.image16.ref.png | Bin 0 -> 1625 bytes + test/filter-bilinear-extents.image16.ref.png | Bin 0 -> 895 bytes + test/filter-nearest-transformed.image16.ref.png | Bin 0 -> 418 bytes + test/finer-grained-fallbacks.image16.ref.png | Bin 0 -> 862 bytes + test/font-matrix-translation.image16.ref.png | Bin 0 -> 852 bytes + test/ft-show-glyphs-positioning.image16.ref.png | Bin 0 -> 2772 bytes + test/ft-show-glyphs-table.image16.ref.png | Bin 0 -> 8052 bytes + test/ft-text-vertical-layout-type1.image16.ref.png | Bin 0 -> 3072 bytes + test/ft-text-vertical-layout-type3.image16.ref.png | Bin 0 -> 3141 bytes + test/glyph-cache-pressure.image16.ref.png | Bin 0 -> 2453 bytes + test/group-clip.image16.ref.png | Bin 0 -> 193 bytes + test/group-unaligned.image16.ref.png | Bin 0 -> 395 bytes + test/huge-linear.image16.ref.png | Bin 0 -> 1542 bytes + test/huge-radial.image16.ref.png | Bin 0 -> 17893 bytes + test/image-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/joins.image16.ref.png | Bin 0 -> 5858 bytes + test/large-font.image16.ref.png | Bin 0 -> 5713 bytes + test/large-twin-antialias-mixed.image16.ref.png | Bin 0 -> 14398 bytes + test/leaky-dashed-rectangle.image16.ref.png | Bin 0 -> 367 bytes + test/leaky-dashed-stroke.image16.ref.png | Bin 0 -> 8089 bytes + test/leaky-polygon.image16.ref.png | Bin 0 -> 329 bytes + test/line-width-scale.image16.ref.png | Bin 0 -> 4721 bytes + test/linear-gradient-reflect.image16.ref.png | Bin 0 -> 190 bytes + test/linear-gradient-subset.image16.ref.png | Bin 0 -> 791 bytes + test/linear-gradient.image16.ref.png | Bin 0 -> 941 bytes + test/linear-uniform.image16.ref.png | Bin 0 -> 131 bytes + test/long-dashed-lines.image16.ref.png | Bin 0 -> 1974 bytes + test/mask-alpha.image16.ref.png | Bin 0 -> 560 bytes + test/mask-glyphs.image16.ref.png | Bin 0 -> 1053144 bytes + test/mask-transformed-image.image16.ref.png | Bin 0 -> 2748 bytes + test/mask-transformed-similar.image16.ref.png | Bin 0 -> 2748 bytes + test/mask.image16.ref.png | Bin 0 -> 5533 bytes + test/operator-alpha-alpha.image16.ref.png | Bin 0 -> 4140 bytes + test/operator-source.image16.ref.png | Bin 0 -> 2756 bytes + test/over-around-source.image16.ref.png | Bin 0 -> 491 bytes + test/paint-source-alpha.image16.ref.png | Bin 0 -> 253 bytes + test/paint-with-alpha.image16.ref.png | Bin 0 -> 253 bytes + test/path-append.image16.ref.png | Bin 0 -> 5252 bytes + test/path-stroke-twice.image16.ref.png | Bin 0 -> 210 bytes + test/pdf-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/ps-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/pthread-same-source.image16.ref.png | Bin 0 -> 1007 bytes + test/push-group-color.image16.ref.png | Bin 0 -> 2277 bytes + test/push-group.image16.ref.png | Bin 0 -> 2286 bytes + test/radial-gradient-source.image16.ref.png | Bin 0 -> 132037 bytes + test/radial-gradient.image16.ref.png | Bin 0 -> 202415 bytes + .../random-intersections-curves-eo.image16.ref.png | Bin 0 -> 181565 bytes + .../random-intersections-curves-nz.image16.ref.png | Bin 0 -> 204090 bytes + test/random-intersections-eo.image16.ref.png | Bin 0 -> 97747 bytes + test/random-intersections-nonzero.image16.ref.png | Bin 0 -> 107644 bytes + test/recording-surface-pattern.image16.ref.png | Bin 0 -> 2856 bytes + test/reflected-stroke.image16.ref.png | Bin 0 -> 4254 bytes + test/rotated-clip.image16.ref.png | Bin 0 -> 3336 bytes + test/rounded-rectangle-fill.image16.ref.png | Bin 0 -> 730 bytes + test/rounded-rectangle-stroke.image16.ref.png | Bin 0 -> 732 bytes + test/scale-offset-image.image16.ref.png | Bin 0 -> 7793 bytes + test/scale-offset-similar.image16.ref.png | Bin 0 -> 7793 bytes + test/select-font-face.image16.ref.png | Bin 0 -> 1962 bytes + test/show-text-current-point.image16.ref.png | Bin 0 -> 1932 bytes + test/smask-fill.image16.ref.png | Bin 0 -> 925 bytes + test/smask-mask.image16.ref.png | Bin 0 -> 1358 bytes + test/smask-paint.image16.ref.png | Bin 0 -> 1469 bytes + test/smask-stroke.image16.ref.png | Bin 0 -> 1330 bytes + test/smask-text.image16.ref.png | Bin 0 -> 1206 bytes + test/smask.image16.ref.png | Bin 0 -> 2213 bytes + test/spline-decomposition.image16.ref.png | Bin 0 -> 14064 bytes + test/stroke-ctm-caps.image16.ref.png | Bin 0 -> 908 bytes + test/stroke-image.image16.ref.png | Bin 0 -> 1167 bytes + test/subsurface.image16.ref.png | Bin 0 -> 1430 bytes + test/surface-pattern-operator.image16.ref.png | Bin 0 -> 1977 bytes + test/surface-pattern-scale-down.image16.ref.png | Bin 0 -> 1313 bytes + test/surface-pattern-scale-up.image16.ref.png | Bin 0 -> 3864 bytes + test/surface-pattern.image16.ref.png | Bin 0 -> 11870 bytes + test/svg-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/text-antialias-gray.image16.ref.png | Bin 0 -> 895 bytes + test/text-antialias-subpixel.image16.ref.png | Bin 0 -> 866 bytes + test/text-glyph-range.image16.ref.png | Bin 0 -> 1731 bytes + test/text-rotate.image16.ref.png | Bin 0 -> 12599 bytes + test/text-transform.image16.ref.png | Bin 0 -> 4469 bytes + test/transforms.image16.ref.png | Bin 0 -> 326 bytes + test/trap-clip.image16.ref.png | Bin 0 -> 4344 bytes + test/twin-antialias-gray.image16.ref.png | Bin 0 -> 3005 bytes + test/twin-antialias-mixed.image16.ref.png | Bin 0 -> 2049 bytes + test/twin-antialias-subpixel.image16.ref.png | Bin 0 -> 3005 bytes + test/twin.image16.ref.png | Bin 0 -> 3005 bytes + test/unbounded-operator.image16.ref.png | Bin 0 -> 1276 bytes + test/user-font-mask.image16.ref.png | Bin 0 -> 4948 bytes + test/user-font-proxy.image16.ref.png | Bin 0 -> 14460 bytes + test/user-font-rescale.image16.ref.png | Bin 0 -> 12590 bytes + test/user-font.image16.ref.png | Bin 0 -> 5814 bytes + test/xcomposite-projection.image16.ref.png | Bin 0 -> 1000 bytes + test/xlib-surface-source.image16.ref.png | Bin 0 -> 305 bytes + 145 files changed, 144 insertions(+) + +commit ebe6f2ac6988991afde0d685bea9f207ed3360d8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Apr 27 10:59:09 2010 +0200 + + quartz: Assert success of path creation + + Path creation can only fail because of the callbacks, but in quartz + they all return CAIRO_STATUS_SUCCESS. Therefore we can just assert + that path creation was successful and simplify calling functions + (as they don't have to handle potential errors anymore). + + src/cairo-quartz-surface.c | 35 +++++++++++++++-------------------- + 1 file changed, 15 insertions(+), 20 deletions(-) + +commit f67b6009278ef3dfe91ddbffb989dcfeed174352 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Apr 4 11:50:41 2010 +0200 + + quartz: Simplify path creation + + If paths are created before changing the ctm (when stroking) no + multiplication is needed in the path construction code. + + src/cairo-quartz-surface.c | 60 ++++++++-------------------------------------- + 1 file changed, 10 insertions(+), 50 deletions(-) + +commit 3b2ceff0502ba409c161e497ebe015e0a0a88847 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Apr 7 18:34:25 2010 +0200 + + quartz: Stroke without ctm_inverse multiplication + + If the CTM is not changed before creating the path, no multiplication + needs to be made between points and the inverse of the CTM. + + src/cairo-quartz-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 514d366cde689f8200b049834bebbd421d5d8bcb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 27 11:07:09 2010 +0100 + + snapshot: propagate status on finish + + src/cairo-surface-snapshot.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit a505104013a1db0c8b1092c8a1848d7f0b02e6bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 26 20:22:13 2010 +0100 + + image: Compute sample extents + + In order to reuse the original image as the pixman pattern, then the + entire operation must be wholly contained within the extents of the + image (including subsurfaces) and be reducible to an untransformed + REPEAT_NONE. + + src/cairo-image-surface.c | 72 +++++++++++++++++++++++++++++++---------------- + src/cairo-pattern.c | 2 +- + src/cairoint.h | 4 +++ + 3 files changed, 52 insertions(+), 26 deletions(-) + +commit b8a7f8621a84083735d0e2c8748f5fa2b7f4b36a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Apr 27 10:17:23 2010 +0200 + + Update FSF address + + I updated the Free Software Foundation address using the following script. + + for i in $(git grep Temple | cut -d: -f1 ) + do + sed -e 's/59 Temple Place[, -]* Suite 330, Boston, MA *02111-1307[, ]* USA/51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA/' -i "$i" + done + + Fixes http://bugs.freedesktop.org/show_bug.cgi?id=21356 + + COPYING-LGPL-2.1 | 4 ++-- + boilerplate/cairo-boilerplate-drm.c | 2 +- + boilerplate/cairo-boilerplate-gl.c | 2 +- + boilerplate/cairo-boilerplate-qt.cpp | 2 +- + boilerplate/cairo-boilerplate-vg.c | 2 +- + build/aclocal.pkg.m4 | 2 +- + doc/tutorial/src/include/cairo-tutorial-gtk.h | 2 +- + doc/tutorial/src/include/cairo-tutorial-pdf.h | 2 +- + doc/tutorial/src/include/cairo-tutorial-png.h | 2 +- + doc/tutorial/src/include/cairo-tutorial-xlib.h | 2 +- + doc/tutorial/src/include/cairo-tutorial.h | 2 +- + src/cairo-analysis-surface-private.h | 2 +- + src/cairo-analysis-surface.c | 2 +- + src/cairo-arc-private.h | 2 +- + src/cairo-arc.c | 2 +- + src/cairo-array.c | 2 +- + src/cairo-atomic-private.h | 2 +- + src/cairo-atomic.c | 2 +- + src/cairo-base64-stream.c | 2 +- + src/cairo-base85-stream.c | 2 +- + src/cairo-bentley-ottmann-rectangular.c | 2 +- + src/cairo-bentley-ottmann-rectilinear.c | 2 +- + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-beos-surface.cpp | 2 +- + src/cairo-beos.h | 2 +- + src/cairo-botor-scan-converter.c | 2 +- + src/cairo-boxes-private.h | 2 +- + src/cairo-boxes.c | 2 +- + src/cairo-cache-private.h | 2 +- + src/cairo-cache.c | 2 +- + src/cairo-cff-subset.c | 2 +- + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 2 +- + src/cairo-color.c | 2 +- + src/cairo-combsort-private.h | 2 +- + src/cairo-compiler-private.h | 2 +- + src/cairo-composite-rectangles-private.h | 2 +- + src/cairo-composite-rectangles.c | 2 +- + src/cairo-debug.c | 2 +- + src/cairo-deflate-stream.c | 2 +- + src/cairo-deprecated.h | 2 +- + src/cairo-device-private.h | 2 +- + src/cairo-device.c | 2 +- + src/cairo-directfb-surface.c | 2 +- + src/cairo-directfb.h | 2 +- + src/cairo-drm.h | 2 +- + src/cairo-egl-context.c | 2 +- + src/cairo-error-private.h | 2 +- + src/cairo-fixed-private.h | 2 +- + src/cairo-fixed-type-private.h | 2 +- + src/cairo-fixed.c | 2 +- + src/cairo-font-face-twin.c | 2 +- + src/cairo-font-face.c | 2 +- + src/cairo-font-options.c | 2 +- + src/cairo-freed-pool-private.h | 2 +- + src/cairo-freed-pool.c | 2 +- + src/cairo-ft-font.c | 2 +- + src/cairo-ft-private.h | 2 +- + src/cairo-ft.h | 2 +- + src/cairo-gl-glyphs.c | 2 +- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-shaders.c | 2 +- + src/cairo-gl-surface.c | 2 +- + src/cairo-gl.h | 2 +- + src/cairo-glx-context.c | 2 +- + src/cairo-gstate-private.h | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-hash-private.h | 2 +- + src/cairo-hash.c | 2 +- + src/cairo-hull.c | 2 +- + src/cairo-image-info-private.h | 2 +- + src/cairo-image-info.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-list-private.h | 2 +- + src/cairo-lzw.c | 2 +- + src/cairo-malloc-private.h | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-misc.c | 2 +- + src/cairo-mutex-impl-private.h | 2 +- + src/cairo-mutex-list-private.h | 2 +- + src/cairo-mutex-private.h | 2 +- + src/cairo-mutex-type-private.h | 2 +- + src/cairo-mutex.c | 2 +- + src/cairo-os2-private.h | 2 +- + src/cairo-os2-surface.c | 2 +- + src/cairo-os2.h | 2 +- + src/cairo-output-stream-private.h | 2 +- + src/cairo-output-stream.c | 2 +- + src/cairo-paginated-private.h | 2 +- + src/cairo-paginated-surface-private.h | 2 +- + src/cairo-paginated-surface.c | 2 +- + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fill.c | 2 +- + src/cairo-path-fixed-private.h | 2 +- + src/cairo-path-fixed.c | 2 +- + src/cairo-path-in-fill.c | 2 +- + src/cairo-path-private.h | 2 +- + src/cairo-path-stroke.c | 2 +- + src/cairo-path.c | 2 +- + src/cairo-pdf-operators-private.h | 2 +- + src/cairo-pdf-operators.c | 2 +- + src/cairo-pdf-surface-private.h | 2 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-pdf.h | 2 +- + src/cairo-pen.c | 2 +- + src/cairo-png.c | 2 +- + src/cairo-polygon.c | 2 +- + src/cairo-private.h | 2 +- + src/cairo-ps-surface-private.h | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-ps.h | 2 +- + src/cairo-qt-surface.cpp | 2 +- + src/cairo-qt.h | 2 +- + src/cairo-quartz-font.c | 2 +- + src/cairo-quartz-image-surface.c | 2 +- + src/cairo-quartz-image.h | 2 +- + src/cairo-quartz-private.h | 2 +- + src/cairo-quartz-surface.c | 2 +- + src/cairo-quartz.h | 2 +- + src/cairo-recording-surface-private.h | 2 +- + src/cairo-recording-surface.c | 2 +- + src/cairo-rectangle.c | 2 +- + src/cairo-rectangular-scan-converter.c | 2 +- + src/cairo-reference-count-private.h | 2 +- + src/cairo-region-private.h | 2 +- + src/cairo-region.c | 2 +- + src/cairo-rtree-private.h | 2 +- + src/cairo-rtree.c | 2 +- + src/cairo-scaled-font-private.h | 2 +- + src/cairo-scaled-font-subsets-private.h | 2 +- + src/cairo-scaled-font-subsets.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-script-surface.c | 2 +- + src/cairo-script.h | 2 +- + src/cairo-skia-surface.cpp | 2 +- + src/cairo-skia.h | 2 +- + src/cairo-slope-private.h | 2 +- + src/cairo-slope.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-stroke-style.c | 2 +- + src/cairo-surface-clipper-private.h | 2 +- + src/cairo-surface-clipper.c | 2 +- + src/cairo-surface-fallback-private.h | 2 +- + src/cairo-surface-fallback.c | 2 +- + src/cairo-surface-offset-private.h | 2 +- + src/cairo-surface-offset.c | 2 +- + src/cairo-surface-private.h | 2 +- + src/cairo-surface-snapshot-private.h | 2 +- + src/cairo-surface-snapshot.c | 2 +- + src/cairo-surface-subsurface-private.h | 2 +- + src/cairo-surface-subsurface.c | 2 +- + src/cairo-surface-wrapper-private.h | 2 +- + src/cairo-surface-wrapper.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-svg-surface-private.h | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-svg.h | 2 +- + src/cairo-system.c | 2 +- + src/cairo-tee-surface-private.h | 2 +- + src/cairo-tee-surface.c | 2 +- + src/cairo-toy-font-face.c | 2 +- + src/cairo-traps.c | 2 +- + src/cairo-truetype-subset-private.h | 2 +- + src/cairo-truetype-subset.c | 2 +- + src/cairo-type1-fallback.c | 2 +- + src/cairo-type1-private.h | 2 +- + src/cairo-type1-subset.c | 2 +- + src/cairo-type3-glyph-surface-private.h | 2 +- + src/cairo-type3-glyph-surface.c | 2 +- + src/cairo-types-private.h | 2 +- + src/cairo-unicode.c | 2 +- + src/cairo-user-font-private.h | 2 +- + src/cairo-user-font.c | 2 +- + src/cairo-version.c | 2 +- + src/cairo-vg-surface.c | 2 +- + src/cairo-vg.h | 2 +- + src/cairo-wideint-private.h | 2 +- + src/cairo-wideint-type-private.h | 2 +- + src/cairo-wideint.c | 2 +- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-printing-surface.c | 2 +- + src/cairo-win32-private.h | 2 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-win32.h | 2 +- + src/cairo-xcb-connection-core.c | 2 +- + src/cairo-xcb-connection-render.c | 2 +- + src/cairo-xcb-connection-shm.c | 2 +- + src/cairo-xcb-connection.c | 2 +- + src/cairo-xcb-private.h | 2 +- + src/cairo-xcb-screen.c | 2 +- + src/cairo-xcb-shm.c | 2 +- + src/cairo-xcb-surface-cairo.c | 2 +- + src/cairo-xcb-surface-core.c | 2 +- + src/cairo-xcb-surface-private.h | 2 +- + src/cairo-xcb-surface-render.c | 2 +- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xcb.h | 2 +- + src/cairo-xlib-display.c | 2 +- + src/cairo-xlib-private.h | 2 +- + src/cairo-xlib-screen.c | 2 +- + src/cairo-xlib-surface-private.h | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo-xlib-visual.c | 2 +- + src/cairo-xlib-xcb-surface.c | 2 +- + src/cairo-xlib-xrender-private.h | 2 +- + src/cairo-xlib-xrender.h | 2 +- + src/cairo-xlib.h | 2 +- + src/cairo-xml-surface.c | 2 +- + src/cairo-xml.h | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairoint.h | 2 +- + src/drm/cairo-drm-bo.c | 2 +- + src/drm/cairo-drm-gallium-surface.c | 2 +- + src/drm/cairo-drm-i915-glyphs.c | 2 +- + src/drm/cairo-drm-i915-shader.c | 2 +- + src/drm/cairo-drm-i915-spans.c | 2 +- + src/drm/cairo-drm-i915-surface.c | 2 +- + src/drm/cairo-drm-i965-glyphs.c | 2 +- + src/drm/cairo-drm-i965-shader.c | 2 +- + src/drm/cairo-drm-i965-spans.c | 2 +- + src/drm/cairo-drm-i965-surface.c | 2 +- + src/drm/cairo-drm-intel-ioctl-private.h | 2 +- + src/drm/cairo-drm-intel-private.h | 2 +- + src/drm/cairo-drm-intel-surface.c | 2 +- + src/drm/cairo-drm-intel.c | 2 +- + src/drm/cairo-drm-private.h | 2 +- + src/drm/cairo-drm-radeon-private.h | 2 +- + src/drm/cairo-drm-radeon-surface.c | 2 +- + src/drm/cairo-drm-radeon.c | 2 +- + src/drm/cairo-drm-surface.c | 2 +- + src/drm/cairo-drm.c | 2 +- + src/test-fallback-surface.c | 2 +- + src/test-fallback-surface.h | 2 +- + src/test-fallback16-surface.c | 2 +- + src/test-fallback16-surface.h | 2 +- + src/test-null-surface.c | 2 +- + src/test-null-surface.h | 2 +- + src/test-paginated-surface.c | 2 +- + src/test-paginated-surface.h | 2 +- + src/test-wrapping-surface.c | 2 +- + src/test-wrapping-surface.h | 2 +- + test/dash-offset.c | 2 +- + test/miter-precision.c | 2 +- + test/operator-alpha-alpha.c | 2 +- + test/pdiff/args.c | 2 +- + test/pdiff/args.h | 2 +- + test/pdiff/lpyramid.c | 2 +- + test/pdiff/lpyramid.h | 2 +- + test/pdiff/pdiff.c | 2 +- + test/pdiff/pdiff.h | 2 +- + test/pdiff/perceptualdiff.c | 2 +- + util/backtrace-symbols.c | 2 +- + util/cairo-script/cairo-script-file.c | 2 +- + util/cairo-script/cairo-script-hash.c | 2 +- + util/cairo-script/cairo-script-interpreter.c | 2 +- + util/cairo-script/cairo-script-interpreter.h | 2 +- + util/cairo-script/cairo-script-objects.c | 2 +- + util/cairo-script/cairo-script-operators.c | 2 +- + util/cairo-script/cairo-script-private.h | 2 +- + util/cairo-script/cairo-script-scanner.c | 2 +- + util/cairo-script/cairo-script-stack.c | 2 +- + 262 files changed, 263 insertions(+), 263 deletions(-) + +commit 9672aab6b7c3f1efc065a6e5eb69443a1ecaa723 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Apr 26 21:28:53 2010 +0200 + + tests: Integrate xlib-expose-event test into usual tests + + Previously the test was using the preamble vfunc and generating output + itself. Now it uses the draw function and ignores any but the xlib + backends. + + test/xlib-expose-event.c | 63 ++++++++++++------------------------------------ + 1 file changed, 15 insertions(+), 48 deletions(-) + +commit 36e0a3d3a01f9962d97386ea2d3c60020e937a81 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 26 18:18:27 2010 +0100 + + trace: Remove unused functions + + trace.c:1154: warning: ‘_has_font_face_id’ defined but not used + trace.c:1196: warning: ‘_get_pattern_id’ defined but not used + trace.c:1870: warning: ‘_emit_font_face’ defined but not used + trace.c:1882: warning: ‘_emit_scaled_font’ defined but not used + + util/cairo-trace/trace.c | 24 ------------------------ + 1 file changed, 24 deletions(-) + +commit 3a2d9ffe0333090bb31ff01048ed506595f20cf9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 26 18:17:49 2010 +0100 + + trace: Check return value to suppress compiler warning + + trace.c: In function ‘get_prog_name’: + trace.c:741: warning: ignoring return value of ‘fgets’, declared with + attribute warn_unused_result + + util/cairo-trace/trace.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 37be183412eb35abc11e602857602aee05839fc7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 26 18:12:05 2010 +0100 + + trace: Trivial compiler warning fix + + trace.c:1665: warning: initialization from incompatible pointer type + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3c9e5d9792e101cfbd5a1116f06579539ed7b585 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 26 18:13:36 2010 +0100 + + region: Cast to remove const to suppress compiler warnings. + + airo-region.c: In function ‘cairo_region_intersect’: + cairo-region.c:503: warning: passing argument 3 of + ‘pixman_region32_intersect’ discards qualifiers from pointer target type + /usr/local/include/pixman-1/pixman.h:518: note: expected ‘struct + pixman_region32_t *’ but argument is of type ‘const struct pixman_region32_t *’ + + cairo-region.c: In function ‘cairo_region_union’: + cairo-region.c:566: warning: passing argument 3 of + ‘pixman_region32_union’ discards qualifiers from pointer target type + /usr/local/include/pixman-1/pixman.h:521: note: expected ‘struct + pixman_region32_t *’ but argument is of type ‘const struct pixman_region32_t *’ + + src/cairo-region.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8c72122df51a10a32b56cdf20e5a1037ee59a958 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 25 10:30:12 2010 +0100 + + clip: Skip combining with solid pixel aligned boxes. + + src/cairo-clip.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 240ebaf81a42c24c4d4267879c5ef8102e97017e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 25 09:44:18 2010 +0100 + + clip: Fix sign reverse when combining with the clip surface. + + Finally, found the reversed sign in the clipping code, thanks cu! + + Fixes: test/clip-shape + + src/cairo-clip.c | 24 ++---------------------- + 1 file changed, 2 insertions(+), 22 deletions(-) + +commit 4d3632761b928c14fb1ce257af077f45658d8537 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 25 09:42:13 2010 +0100 + + clip: Report the surface offset when retrieving the clip mask + + Stop the callers from guessing the origin of the clip surface by + reporting it explicitly! This enables the clip to bypass any rectangles + overlaid on top of the clip surface, which is common when the backends + limit the clip to the extents of the operation -- but irrelevant to the + actual content of the clip mask + + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 26 ++++++++++++++++++++------ + src/cairo-image-surface.c | 39 +++++++++++++++++++++------------------ + src/cairo-surface-fallback.c | 20 ++++++++++---------- + src/cairo-xcb-surface-render.c | 31 +++++++++++++++---------------- + src/drm/cairo-drm-i915-shader.c | 9 ++++----- + src/drm/cairo-drm-i965-shader.c | 7 ++++--- + 7 files changed, 75 insertions(+), 59 deletions(-) + +commit 241ce933f8fa44210015dcdc4a66b3f9d8ac56e8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 25 09:37:50 2010 +0100 + + test: Add clip-shape + + cu found a bug when using clipping and fills with the image backend, but + it turns out to be the lost sign bug afflicting everything... + + To trigger the bug requires evaluating the clip surface prior to using + in with _cairo_clip_combine_with_surface(). Which is taken along a + particular path when using a clip mask with non-pixel geometry on image, + but more easily hit by the fallback code. + + Reported-by: <cairouser@yahoo.com> + + test/Makefile.am | 4 ++ + test/Makefile.sources | 1 + + test/clip-shape.c | 86 ++++++++++++++++++++++++++++++++++ + test/clip-shape.ps.ref.png | Bin 0 -> 1797 bytes + test/clip-shape.ref.png | Bin 0 -> 2935 bytes + test/clip-shape.xlib-fallback.ref.png | Bin 0 -> 2916 bytes + test/clip-shape.xlib.ref.png | Bin 0 -> 2944 bytes + 7 files changed, 91 insertions(+) + +commit 1687c7b7d3074de8eeea1a5c339df9a12cc38da2 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Apr 23 22:22:28 2010 +0200 + + xlib: Fix display closing to work properly + + Previously we free()'d the cairo_device's memory which was not good at + all. Now the code causes cairo_device_finish() instead. + + src/cairo-xlib-display.c | 37 +++++++++++++++++++++++-------------- + 1 file changed, 23 insertions(+), 14 deletions(-) + +commit 637564c562de21c17c36d192d3ab1b3fe069754b +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Apr 23 22:10:32 2010 +0200 + + xlib: Fix screen device handling + + Add a _cairo_xlib_device_create() function that could easily be exported + as a replacement for _cairo_xlib_display_get(). This function returns a + cairo_device_t instead of a cairo_xlib_display_t because the display + isn't acquired. + + src/cairo-xlib-display.c | 33 ++++++++++++++++++--------------- + src/cairo-xlib-private.h | 4 ++-- + src/cairo-xlib-screen.c | 23 ++++++++++++++++------- + 3 files changed, 36 insertions(+), 24 deletions(-) + +commit 49b52a8946cbd5f785f71069313e4a204358887b +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 22 21:56:31 2010 +0200 + + gl: Make drawing to windows work again + + The correct MIN/MAG_FILTER wasn't set. + + src/cairo-gl-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3efbc0c5c850d0cb5c5af5bcabbc7293670ea355 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Apr 20 21:58:59 2010 +0200 + + gl: Only unref a surface if it exists + + Note: This will likely work for NULL clones, but I prefer not + dereferencing NULLs. That gives people a wrong understanding of the code + (i.e. me). + + src/cairo-gl-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 64662be4ef3851d21658e5fdb2efb6806b45eba8 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 22 22:05:03 2010 +0200 + + gl: Use GLfloat instead of float in gl*Array() functions + + src/cairo-gl-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e4f84f97b2f5d37bc1fb7dd510df733053ffe624 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Apr 20 21:33:50 2010 +0200 + + gl: Don't acquire the gl context twice + + src/cairo-gl-surface.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit e40a2d1f5eeea139e29c27e38495b9c0bf9e39a1 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 22 22:03:29 2010 +0200 + + gl: Use correct type when uploading images + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 55cf323f963bbcc11bcc290eaf71656e1ba91efd +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 22 21:58:01 2010 +0200 + + gl: fix typo in comment + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 887d43578c3acc7d45c8b2e3ade5da29be804eeb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 23 20:14:03 2010 +0100 + + xlib: Simply release the ref, not destroy, from CloseDisplay. + + Do not call the destroy function directly, but rely on the reference + counting to call the notifier upon the last reference. Instead, simply + release the reference we were holding for the cache and CloseDisplay + callback. + + src/cairo-xlib-display.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit c63e3490a5fc2836837e7adcb5ecad62bdfd18ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 22 20:33:06 2010 +0100 + + cairo: Handle the all-clipped state in cairo_push_group() + + Yet another bug reported by Jeff Muizelaar, thanks! + + Fixes: test/clip-empty-group + + src/cairo.c | 81 +++++++++++++++++++++++++++++++++++-------------------------- + 1 file changed, 46 insertions(+), 35 deletions(-) + +commit 567e485f28716d7b72cbf864a0c573148be91cd8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 23 14:37:43 2010 +0100 + + test: Add clip-empty-group + + Exercise a bug reported by Jeff Muizelaar whereby cairo_push_group() was + broken by everything being clipped out. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/clip-empty-group.c | 65 ++++++++++++++++++++++++++++++++++++++++++ + test/clip-empty-group.ref.png | Bin 0 -> 103 bytes + 4 files changed, 67 insertions(+) + +commit 4438cc6a49e7e902dce045706f7125a2c3e2174b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 3 18:10:57 2010 +0100 + + cairo: Use explicit device flushing. + + Now with the concept of a cairo_device_t and the ability to flush it, + we now longer require the heuristic of automatically flushing on behalf + of the user at the end of every context. + + src/cairo.c | 11 ----------- + 1 file changed, 11 deletions(-) + +commit 0fc140abc3c848e72b1b2b959026355fdbd6a941 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 21 12:01:49 2010 +0100 + + pdf: Suppress compiler warning. + + src/cairo-pdf-operators.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 1923a33a7277009b2898840d671fdc8f8d1b3922 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 21 11:59:33 2010 +0100 + + cairoint.h: Change ASSERT_NOT_REACHED to remove compiler warning + + src/cairoint.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit d366da7d8c46b08673b9e36dd130608a311ded4b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 23 14:38:42 2010 +0100 + + Win32 features update + + boilerplate/Makefile.win32.features | 8 -------- + src/Makefile.win32.features | 8 -------- + 2 files changed, 16 deletions(-) + +commit c1e51a0264d204716f7706fbc66c2a7786b7947c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 23 14:33:53 2010 +0100 + + build: Spelling correction + + build/Makefile.win32.features-h | 1 - + build/configure.ac.features | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit e0306da1d73509e2cfd0fce81a1b4259e5e3fcef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 21 22:51:53 2010 +0100 + + configure: typo in check for xcb-shm + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b7fbda276df52de6a5ac67397a8d49657233fcfa +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Apr 18 23:16:07 2010 +0200 + + Revert "script: Another RGB16_565 warning." + + This reverts commit a9f506493371ac91494488e5ca38e57ceb5a10cb. + + The change was already applied in bdf8f50adae67498d5fe36727ed2cd34c0206509. + + src/cairo-script-surface.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit f74ad37e66bbdcc4d727ed6d931dde870d84c2f4 +Author: Benjamin Otte <otte@redhat.com> +Date: Sun Apr 18 23:20:02 2010 +0200 + + xlib: Make display a cairo_device_t + + The code now uses the locking of the cairo_device_t instead of its own + mutexes. + + The code was modified so that cairo_surface_t does no longer reference + the display directly. Instead, it calls _cairo_xlib_display_acquire(). + If a function assumes an already acquired display, it now requires the + caller to provide a cairo_xlib_display_t parameter. Functions that do + not require an acquired display will not require the display parameter + or they will take the cairo_device_t instead. + + src/cairo-xlib-display.c | 234 +++++++--------- + src/cairo-xlib-private.h | 66 +++-- + src/cairo-xlib-screen.c | 161 +++-------- + src/cairo-xlib-surface-private.h | 2 - + src/cairo-xlib-surface.c | 557 +++++++++++++++++++++++---------------- + 5 files changed, 494 insertions(+), 526 deletions(-) + +commit 2bffa2467ed67517419e425fc34fb5b8294a9e96 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jan 27 10:56:22 2010 +0100 + + Use pixman_image_composite32() + + Replace all occurences of pixman_image_composite() + + src/cairo-directfb-surface.c | 16 +- + src/cairo-image-surface.c | 352 ++++++++++++++++++++--------------------- + src/cairo-pattern.c | 16 +- + src/cairo-surface-snapshot.c | 12 +- + src/cairo-surface-subsurface.c | 24 +-- + src/cairo-xlib-surface.c | 16 +- + src/drm/cairo-drm-intel.c | 12 +- + 7 files changed, 224 insertions(+), 224 deletions(-) + +commit 567923d66a375259a6a8083aa4ef1051097a60c5 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jan 27 09:39:20 2010 +0100 + + image: Make unbounded fixup code not use pixman_fill() + + The new pixman_image_fill_boxes() does proper fallbacks for weird pixman + formats. + + src/cairo-image-surface.c | 123 ++++++++++++++++++---------------------------- + 1 file changed, 47 insertions(+), 76 deletions(-) + +commit b648365cfa2d808b34b924a6b105718e0673bb9b +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jan 27 09:21:41 2010 +0100 + + Require pixman 0.17.5 + + We want pixman_image_composite32() and pixman_image_fill_boxes() + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0a19ad7c104cd81fa2b93aaf7ef9302f50b3f369 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 15 17:58:16 2010 +0200 + + gl: Get rid of "return value not checked" warnings + + Assert that those functions only return successfully. + + src/cairo-gl-surface.c | 42 ++++++++++++++++++++++++------------------ + 1 file changed, 24 insertions(+), 18 deletions(-) + +commit 7745ea21e104d0a5eec1814f19bacb7334f42185 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 14 15:59:36 2010 +0200 + + gl: acquire/release properly in _cairo_gl_draw_image() + + Fixes various testsuite failures, in particular ones related to masks. + + src/cairo-gl-surface.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit 596d3017a1b11cb9844e69330cdece7441929725 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Apr 13 20:53:47 2010 +0200 + + gl: acquire/release context when getting images + + Avoids Mesa complaining about no current context. + + src/cairo-gl-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 46ef05c3d73af2b222602954b986832e77355a12 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Mar 29 12:58:18 2010 +0200 + + glx: Add getters for device's Display and GLXContext + + src/cairo-gl.h | 6 ++++++ + src/cairo-glx-context.c | 30 ++++++++++++++++++++++++++++++ + 2 files changed, 36 insertions(+) + +commit 712919223d08f8b4c43f828322fdc285560c137f +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Mar 26 15:50:10 2010 +0100 + + gl: Make code safe for multithreaded access + + The code callss the gl device's acquire/release in + cairo_device_acquire/release(). This way, external APIs can use these + functions to prepare for rendering GL. + + Also adds code to unset the glx context if it wasn't set when acquiring + the device. This allows multithreaded apps to work fine with just using + cairo APIs, but might introduce penalties in single-threaded + applications. + + src/cairo-egl-context.c | 2 ++ + src/cairo-gl-private.h | 5 ++++- + src/cairo-gl-surface.c | 20 +++++++++++++++++++- + src/cairo-glx-context.c | 37 +++++++++++++++++++++++++++++++++++-- + 4 files changed, 60 insertions(+), 4 deletions(-) + +commit 8f2e82cea3405fa9a6591911c0d42ea3dd0c6180 +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Apr 15 17:48:24 2010 +0200 + + xcb: Make code not complain about every new format + + src/cairo-xcb-surface-render.c | 46 +++++++++++++++++------------------------- + 1 file changed, 18 insertions(+), 28 deletions(-) + +commit 1d753b2f4d724c5ac3e452848ca4dda5891816a6 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Feb 23 21:53:31 2010 +0100 + + xlib: Make code not complain about every new format + + src/cairo-xlib-surface.c | 46 ++++++++++++++++++---------------------------- + 1 file changed, 18 insertions(+), 28 deletions(-) + +commit ebc9cc46fe7740c6d97e02edc66bae383413764b +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Mar 5 15:08:34 2010 +0100 + + gl: Use right format + + The internal format should always be GL_RGBA. + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4142f0836d6719dd136a5fc6ac1adaddd681a3f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 15 09:09:31 2010 +0100 + + gl: Handle component-alpha ADD + + A simple extension to the component-alpha OVER [as ca-ADD is just the + second pass in ca-OVER] to support amalgamation of glyph masks. This + speeds up firefox-36 by ~5% on g45. + + Before: + firefox-36-20090611 76.185 + After: + firefox-36-20090611 72.863 + + src/cairo-gl-surface.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit a4bae1956bee0be98a5a22bd82d417192776e7f0 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 14 22:46:34 2010 +0200 + + gl: Really don't write error status to the inert object. + + src/cairo-gl-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5fed41ee2bb3097c1446c1cf2038c912d5932692 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 14 22:43:29 2010 +0200 + + test: Add test checking that all setters properly check surface->status + + In particular, make sure that the setters when called on a const nil + surface don't try to set surface->status. + + test/Makefile.sources | 1 + + test/error-setters.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 110 insertions(+) + +commit 6826f020014fff566678a1ff92014211e2a21d4c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:33:34 2010 +0100 + + gl: Don't write error status to the inert object. + + Reported-by: Benjamin Otte <otte@redhat.com> + + src/cairo-gl-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3814855a649ffca695ce31d97c291496e32d2e26 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 20:22:14 2010 +0100 + + script: Flush prior to modifying the image data. + + util/cairo-script/cairo-script-operators.c | 1 + + 1 file changed, 1 insertion(+) + +commit 03f7bfc351c27ab9d0b764a21bdcf2304e8c2e81 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 20:14:39 2010 +0100 + + rtree: Remove the false assert upon collapse. + + src/cairo-rtree.c | 2 -- + 1 file changed, 2 deletions(-) + +commit b0383d0cd2b40185b1676d9c88d3647cecc1d7fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:33:34 2010 +0100 + + svg: Don't write error status to the inert object. + + Reported-by: Benjamin Otte <otte@redhat.com> + + src/cairo-svg-surface.c | 37 +++++++++++++++++++++---------------- + 1 file changed, 21 insertions(+), 16 deletions(-) + +commit 5274b63adb9ad808f94e6ea04707991ec1192694 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:33:34 2010 +0100 + + ps: Don't write error status to the inert object. + + Reported-by: Benjamin Otte <otte@redhat.com> + + src/cairo-pdf-surface.c | 2 -- + src/cairo-ps-surface.c | 74 ++++++++++++++++++------------------------------- + 2 files changed, 27 insertions(+), 49 deletions(-) + +commit 45d23b8a791d5845025a1a4d93f99030ec9e0115 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:33:34 2010 +0100 + + pdf: Don't write error status to the inert object. + + Reported-by: Benjamin Otte <otte@redhat.com> + + src/cairo-pdf-surface.c | 41 ++++++++++++++++++++++------------------- + 1 file changed, 22 insertions(+), 19 deletions(-) + +commit 4351304b5110200b77e6851995cf533a929ba17e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:29:07 2010 +0100 + + Win32 features update. + + boilerplate/Makefile.win32.features | 8 ++++++++ + build/Makefile.win32.features-h | 1 + + 2 files changed, 9 insertions(+) + +commit bd17b898b1c249aa0dc443bc303bad4fea8690bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:11:15 2010 +0100 + + surface: Propagate the error status to _cairo_surface_get_device() + + If the surface is in error, the appropriate action is report the error + using an inert error cairo_device_t. + + Reported-by: Benjamin Otte <otte@redhat.com> + + src/cairo-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 005596907fc9b62fa4bf72ec35e0d1a1a242ef93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 14 19:05:09 2010 +0100 + + xlib: Don't operate on an error object inside setters. + + Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=599574 + + The backend API manipulated the surface prior to checking whether it was + an inert error surface - and in the event of an error surface, tried to + overwrite it's error status. + + src/Makefile.win32.features | 8 ++++++++ + src/cairo-xcb-surface.c | 3 +++ + src/cairo-xlib-surface.c | 6 ++++++ + src/cairo-xlib-xcb-surface.c | 6 ++++++ + 4 files changed, 23 insertions(+) + +commit 8afd4e4c3db53159d1e5b6f13d3355cb5fb1750b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 13 17:52:19 2010 +0100 + + hull: _cairo_hull_vertex_compare() return 0 for identical elements + + Andreas Falkenhahn reported a bizarre situation with some + implementations of qsort that actually compare the same elements and + require the comparator to return 0. So be it. + + Reported-by: Andreas Falkenhahn <andreas@airsoftsoftwair.de> + + src/cairo-hull.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit d95037db9915033ef1eee24c2fc05e8a95af5457 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 11 21:04:29 2010 +0100 + + cache: Tidy _cairo_cache_shrink_to_accommodate() + + There is no need to shrink the cache if we add an entry of size 0, so + don't by moving the guards in _cairo_cache_shrink_to_accommodate() to the + callers. + + src/cairo-cache.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit e6309c6307179388c5de938bffdb44b83b694f28 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 11 21:03:00 2010 +0100 + + xcb: Use normal finish to decouple from surface cache. + + Hook into the standard finishing process for a more robust cache removal + mechanism. firefox was able to trigger some double free asserts + otherwise. + + src/cairo-xcb-screen.c | 4 ++- + src/cairo-xcb-surface-render.c | 57 ++++++++++++++++++++---------------------- + 2 files changed, 30 insertions(+), 31 deletions(-) + +commit e425c44e9c4c1796ccc3557a0368cf3b3a685a31 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Apr 9 08:32:22 2010 +0200 + + boilerplate: Compile xlib without xrender + + cairo_boilerplate_xlib_surface_disable_render() is not defined when + compiling without XRender, but it was used nonetheless. Replace it + with an empty stub when XRender is not available. + + boilerplate/cairo-boilerplate-xlib.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 061ea78ad2838450b20d5550a7285823e0d24e1b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Apr 9 08:28:33 2010 +0200 + + perf: Correct cairo-perf-diff syntax + + { cmd-list; } seems to literally be the required syntax. Blanks and + ';' are both mandatory. + + perf/cairo-perf-diff | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6986970ea5197685274b1fd809d72fbd771c0bab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 10 17:05:38 2010 +0100 + + clip: Compile fix for previous clip. + + PEBKAC. + + src/cairo-clip.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 0899852c974099da9f8c5e493fa89b8d022646c5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 10 16:00:45 2010 +0100 + + clip: Compare the whole clip when testing for equality. + + Should fix test/clip-contexts + + src/cairo-clip-private.h | 4 ++++ + src/cairo-clip.c | 40 +++++++++++++++++++++++++++++++++++++--- + src/cairo-surface-clipper.c | 5 +---- + 3 files changed, 42 insertions(+), 7 deletions(-) + +commit 557016a86a5a4487aeb6ab6392795eb709ee8bb5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 10 15:59:13 2010 +0100 + + test: Add clip-contexts + + This should exercise a bug found by Jeff Muizelaar that + cairo-surface-clipper was mistakenly thinking that clip operations on a + second context was a no-op as the topmost clip path matched that of the + previous context. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/clip-contexts.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ + test/clip-contexts.ref.png | Bin 0 -> 98 bytes + 4 files changed, 75 insertions(+) + +commit a9f506493371ac91494488e5ca38e57ceb5a10cb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 7 22:44:02 2010 +0100 + + script: Another RGB16_565 warning. + + src/cairo-script-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 42b5cac7668625c9761113ff72b47af5cfd10377 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Apr 7 19:10:15 2010 +0930 + + PDF-operators: ensure text operations flushed before emitting clip + + src/cairo-pdf-operators.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit c004800fae362ae907ef9d1f822d02c598572161 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 7 22:46:38 2010 +0100 + + script: Compile without FT_FONT + + src/cairo-script-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit bdf8f50adae67498d5fe36727ed2cd34c0206509 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 7 22:44:02 2010 +0100 + + script: Another RGB16_565 warning. + + src/cairo-script-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit f5f64317874a3faa4f47688848a499b1e8836cf6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 7 21:57:22 2010 +0100 + + perf: Switch between micro and trace benchmarks for cairo-perf-diff + + perf/cairo-perf-diff | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 70ca0040fda77b6865c20c94c1b7deaa6e63c481 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Apr 7 22:54:57 2010 +0200 + + Actually check for memory allocation failure + + Clang static analyzer signals "Dereference of null pointer" in case + the malloc returns NULL, as the code is checking the wrong pointer. + + src/cairo-boxes.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7f71ac5c209376bacb45199a0eaa3b1937172e9 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Apr 7 21:57:38 2010 +0200 + + region: Make the 2nd argument to intersect and union const + + src/cairo-region.c | 4 ++-- + src/cairo.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit ded3a9639b33b1e637e99250a463bc227c9e60f4 +Author: Kristian Rietveld <kris@gtk.org> +Date: Tue Dec 29 08:47:09 2009 +0100 + + quartz: Define cairo_quartz_float_t and use instead of float + + On Mac OS 10.6 and newer cairo_quartz_float_t is defined to be a + CGFloat, resolving issues with the 64-bit builds. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=25814 + + src/cairo-quartz-private.h | 6 ++++++ + src/cairo-quartz-surface.c | 40 +++++++++++++++++++++------------------- + 2 files changed, 27 insertions(+), 19 deletions(-) + +commit 7c2c3f621f9b009b97c5f269bf313be926cc51c7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Apr 3 22:54:57 2010 +0200 + + Correct masking optimization + + In _cairo_surface_mask() there was an invaild optimization (it failed + for surfaces without alpha content). Using _cairo_pattern_is_clear() + is the correct way to evaluate if a pattern is clear. + + Fixes clear-source + + src/cairo-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 24fc36c10f5c1c34e3059a8334178743052d7ad2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 2 08:44:45 2010 +0100 + + script: Fix endian encoding of '<|' length. + + Andrea found and fixed (and updated all the traces!) an endian bug where + we were encoding a 32bit length inside the compressed string stream. + However, this one inside the script backed escaped his notice. + + src/cairo-script-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 697094488c652ad351301696bba9a384cc70002c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 2 08:40:28 2010 +0100 + + test: Add inverse text + + This is exercising a bug that I have introduced either in the xcb + backend or in the driver in my experimental branches. So simple, yet so + wrong. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/inverse-text.c | 67 ++++++++++++++++++++++++++++++++++++++ + test/inverse-text.image16.ref.png | Bin 0 -> 1863 bytes + test/inverse-text.ps.ref.png | Bin 0 -> 776 bytes + test/inverse-text.ref.png | Bin 0 -> 2150 bytes + 6 files changed, 69 insertions(+) + +commit fe610d559c70ab67f782b122437908ac80788611 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 31 09:33:30 2010 +0100 + + perf/micro: Show megapixel fill rate during paint. + + perf/micro/paint-with-alpha.c | 9 ++++++++- + perf/micro/paint.c | 8 +++++++- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit 8f7078eba71dcd2aa70bf97c03ed7b4341260143 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 1 20:42:44 2010 +0100 + + boilerplate: Allox xlib-fallback to build without RENDER + + This surface doesn't use RENDER and should produce the same results + when cairo-xlib is compiled without any support for RENDER. + + boilerplate/cairo-boilerplate-xlib.c | 72 ++---------------------------------- + 1 file changed, 4 insertions(+), 68 deletions(-) + +commit d209b40c64bddeb0d830678bc2f84e1016fed879 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 1 20:36:15 2010 +0100 + + xlib: Rearrange xrender stubs to restore compilation without xrender.h + + boilerplate/Makefile.win32.features | 8 -------- + build/Makefile.win32.features-h | 1 - + src/Makefile.win32.features | 8 -------- + src/cairo-xlib-xrender-private.h | 14 +++++++------- + 4 files changed, 7 insertions(+), 24 deletions(-) + +commit db4dbb38340e93da616319f00e0f4327d1c1d815 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 1 01:53:22 2010 -0400 + + Improve doc syntax check to allow inline macro docs + + src/check-doc-syntax.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 00101fa71614fb48de436d6618e26353cf44ef95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 31 16:19:02 2010 +0100 + + configure: check -lrt for shm_open() + + OS/X includes shm_open() in libc, and fails to link if -lrt is + specified. So perform the appropriate configure time magic. + + configure.ac | 5 +++++ + util/cairo-sphinx/Makefile.am | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit a81d347c2484e60ceec1d9dc81e1b88724496eaf +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Feb 5 22:34:51 2010 +0100 + + perf: Fix timestamp computation on MacOS X + + The OIL routines don't work as expected on MacOS X. The operating + system gives access to the timestamp counter through the function + mach_absolute_time. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-posix.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 55ce0b774869e9fa614c6f9fec7905f7205cb5ff +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Feb 5 22:30:05 2010 +0100 + + script: Fix script scanner endianness + + The script interpreter was reading the length of compressed data as + an host-endian uint32_t, thus making cairo-script able to correctly + read traces that were produced on the same endianness as the one they + ran upon, but unsuitable for portabile cairo-scripts. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-script/cairo-script-scanner.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 4f617eaf77540ba2140086bd5a19fe6d62503d62 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Feb 5 22:27:28 2010 +0100 + + trace: Fix trace endianness + + Trace files were using host-endian to represent the length of + compressed data, making the trace format not portable. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 35f19bc084792bbad42b86a399103ebfbf407d05 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 31 12:18:01 2010 +0200 + + pattern: Fix _gradient_is_opaque() for zero stops + + _gradient_is_opaque() previously returned TRUE for gradient with + no stops, triggering a false optimization in _cairo_gstate_mask(). + + Fixes test/gradient-zero-stops-mask + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pattern.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 01e182194224e0eb7493b2ae3c8367ed455cfd54 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 31 12:14:25 2010 +0200 + + test: Add gradient-zero-stops-mask + + Add a test to check that gradient with no stops are not considered + opaque by gstate (and thus masking with them is not optimized to + paint). + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/gradient-zero-stops-mask.argb32.ref.png | Bin 0 -> 86 bytes + test/gradient-zero-stops-mask.c | 59 +++++++++++++++++++++++++++ + test/gradient-zero-stops-mask.rgb24.ref.png | Bin 0 -> 86 bytes + 5 files changed, 62 insertions(+) + +commit ce3ad6f41edf86ed6914f4d7f364111eba42ca65 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 31 08:21:17 2010 +0100 + + xlib: Avoid multiple evaluations inside bswap_*() macro. + + Fixes: + Fonts are not readable if remote display to a machine with different + endian. + https://bugzilla.mozilla.org/show_bug.cgi?id=526977 + + Reported-and-tested-by: Ginn Chen <Ginn.Chen@Sun.COM> + + src/cairo-xlib-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit be4ffa9df275513de3175415ee889b7323499a37 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 28 19:40:54 2010 +0100 + + doc: Fix some missing '%' in gtk-doc comments + + src/cairo-surface.c | 4 ++-- + src/cairo-svg-surface.c | 10 +++++----- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 7ab350378e8597e9872dbe390b8454d0a63bff28 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 28 19:38:24 2010 +0100 + + Silence enumeration warnings following addition of RGB16_565 + + src/cairo-debug.c | 3 +++ + src/cairo-gl-glyphs.c | 2 ++ + src/cairo-png.c | 1 + + src/cairo-qt-surface.cpp | 2 ++ + src/cairo-scaled-font.c | 1 + + src/cairo-script-surface.c | 15 +++++++++++++ + src/cairo-xcb-surface-render.c | 5 +++++ + src/cairo-xlib-surface.c | 5 +++++ + src/cairo-xml-surface.c | 1 + + src/drm/cairo-drm-i915-surface.c | 3 +++ + src/drm/cairo-drm-i965-shader.c | 4 ++++ + src/drm/cairo-drm-i965-surface.c | 1 + + src/drm/cairo-drm-intel-surface.c | 1 + + src/drm/cairo-drm-intel.c | 12 ++++++++-- + src/drm/cairo-drm-radeon-surface.c | 1 + + util/cairo-script/cairo-script-operators.c | 35 ++++++++++++++++++++++++++++++ + util/cairo-sphinx/sphinx.c | 1 + + util/cairo-trace/trace.c | 25 ++++++++++++++++++--- + 18 files changed, 113 insertions(+), 5 deletions(-) + +commit d901692a5550c51fd3eefd307609fb800ef02a95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 30 15:31:32 2010 +0100 + + scaled-glyph: Allow removal info fields. + + Pushed a fraction of a second too soon... Update the + scaled_glyph->has_info if the backend clears any field as well. + + src/cairo-scaled-font.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +commit 5c4b6d520bc7ce7d5193a89bbda44b91f5eb0d4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 30 15:26:42 2010 +0100 + + xcb: Cache whether we have already check a glyph for size. + + Avoid repeated cairo_scaled_glyph_lookup() and checking of sizes if we + have already seen this glyph in this run. + + src/cairo-xcb-surface-render.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 1c76e3e9ad1437662bf91ed1d21c4bda8fd50fb4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 30 15:24:08 2010 +0100 + + scaled-font: Optimize cairo_scaled_font_lookup() + + By tracking which fields of information are already available on the + scaled_glyph we can more efficiently determine if we already have the + requested fields. This reduces from about 6 conditionals to one, and + reduces the function overhead by ~20% -- which has a measurable + improvement on glyph benchmarks. + + src/cairo-scaled-font.c | 73 +++++++++++++---------------------------------- + src/cairo-types-private.h | 1 + + 2 files changed, 21 insertions(+), 53 deletions(-) + +commit d2ec151e490b227e7f3d6879bf7a893577dfefa5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 30 15:23:18 2010 +0100 + + perf/micro: Exercise different sizes and antialising modes with glyphs + + perf/micro/glyphs.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 77 insertions(+), 8 deletions(-) + +commit 72481acf0d1e8648c5d03ce51f84c639132475a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 30 04:10:28 2010 +0100 + + perf: Compute ops per second + + Provide a hook for the test to be able to compute the number of ops per + second. For instance, the glyphs test uses it to report the number of + kiloglyph per second Cairo is able to render. + + perf/cairo-perf-micro.c | 47 ++++++++++++++++++++++++-------------- + perf/cairo-perf.h | 9 ++++++-- + perf/micro/box-outline.c | 4 ++-- + perf/micro/cairo-perf-cover.c | 5 ++-- + perf/micro/composite-checker.c | 2 +- + perf/micro/dragon.c | 10 ++++---- + perf/micro/fill.c | 6 ++--- + perf/micro/glyphs.c | 35 ++++++++++++++++++++++++++-- + perf/micro/intersections.c | 8 +++---- + perf/micro/long-dashed-lines.c | 2 +- + perf/micro/long-lines.c | 8 +++---- + perf/micro/mask.c | 18 +++++++-------- + perf/micro/mosaic.c | 8 +++---- + perf/micro/paint-with-alpha.c | 2 +- + perf/micro/paint.c | 2 +- + perf/micro/pattern_create_radial.c | 2 +- + perf/micro/pythagoras-tree.c | 2 +- + perf/micro/rectangles.c | 6 ++--- + perf/micro/rounded-rectangles.c | 6 ++--- + perf/micro/spiral.c | 28 +++++++++++------------ + perf/micro/stroke.c | 4 ++-- + perf/micro/subimage_copy.c | 2 +- + perf/micro/tessellate.c | 6 ++--- + perf/micro/text.c | 2 +- + perf/micro/twin.c | 2 +- + perf/micro/unaligned-clip.c | 2 +- + perf/micro/world-map.c | 2 +- + perf/micro/zrusin.c | 4 ++-- + 28 files changed, 142 insertions(+), 92 deletions(-) + +commit 2a98d0586c19fbb2b555f471895d73f253c4943b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 15 18:23:23 2010 +0000 + + drm/i915: Avoid using another unpreserved temporary + + As we may load from a sampler, we can not use on of the unpreserved + temporaries to store the intermediate colour result. + + src/drm/cairo-drm-i915-shader.c | 26 +++++++++++++++----------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +commit 26f963557bf065fd25b9c4f6652a252735a0fb74 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 15 18:22:06 2010 +0000 + + drm/i915: Normalize spans opacity value + + On the generic path I forgot to rescale the alpha value into [0,1]. + + src/drm/cairo-drm-i915-spans.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 97f8c20727eaeb2dfddb0d4796192cc042eb14fa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 27 21:52:16 2010 +0000 + + boilerplate: Create an image16 target + + In order to exercise the newly restored r5g6g5 support, we need to + create an appropriate surface and feed it through the test and + performance suites. + + boilerplate/cairo-boilerplate-directfb.c | 6 ++- + boilerplate/cairo-boilerplate-drm.c | 6 ++- + boilerplate/cairo-boilerplate-gl.c | 12 +++-- + boilerplate/cairo-boilerplate-pdf.c | 4 +- + boilerplate/cairo-boilerplate-ps.c | 8 +-- + boilerplate/cairo-boilerplate-quartz.c | 3 ++ + boilerplate/cairo-boilerplate-script.c | 2 +- + boilerplate/cairo-boilerplate-skia.c | 6 ++- + boilerplate/cairo-boilerplate-svg.c | 8 +-- + boilerplate/cairo-boilerplate-test-surfaces.c | 21 ++++---- + boilerplate/cairo-boilerplate-vg.c | 12 +++-- + boilerplate/cairo-boilerplate-win32-printing.c | 4 +- + boilerplate/cairo-boilerplate-win32.c | 6 ++- + boilerplate/cairo-boilerplate-xcb.c | 21 +++++--- + boilerplate/cairo-boilerplate-xlib.c | 12 +++-- + boilerplate/cairo-boilerplate.c | 39 +++++++++++++-- + boilerplate/cairo-boilerplate.h | 1 + + perf/cairo-perf-micro.c | 59 +---------------------- + perf/cairo-perf-trace.c | 67 +------------------------- + 19 files changed, 120 insertions(+), 177 deletions(-) + +commit 022291be1cbddf4f6722f0bf76ebda6922780276 +Author: Oleg Romashin <romaxa@gmail.com> +Date: Wed Mar 24 13:12:25 2010 -0400 + + Add back support for CAIRO_FORMAT_RGB16_565 + + Due to slow memory speed, 16bpp color depth is still very popular on mobile + devices. Maemo5 is also using 16bpp color depth. + + src/cairo-deprecated.h | 14 -------------- + src/cairo-image-surface.c | 16 +++++++++++++++- + src/cairo-xlib-display.c | 28 +++++++++++++++++++++++++--- + src/cairo.h | 7 ++----- + src/cairoint.h | 2 +- + 5 files changed, 43 insertions(+), 24 deletions(-) + +commit 36e12b1952f9bdc52491c5a9bdf8ce155865c362 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 24 12:14:20 2010 +0000 + + subsurface: Ignore return from _cairo_clip_init_copy() + + The return is just a hint that the clip is empty, however we are about + to immediately apply the surface clip and so do not care for an + 'optimised' path. + + src/cairo-surface-subsurface.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit e356e5d18b923d9b0ff83e9460582710f9e515d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 24 11:38:19 2010 +0000 + + recording: Fix leak of clip from snapshots of recording surfaces. + + src/cairo-recording-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 5b4885f693c0d800da7160770b341166e3bdea61 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 24 11:25:29 2010 +0000 + + clip: propagate the no-clip through the copy. + + src/cairo-clip.c | 1 + + 1 file changed, 1 insertion(+) + +commit b3e0393161904c2fea62b0198dea551a77201c19 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 24 11:21:36 2010 +0000 + + clip: Don't reduce all-clip to no-clip. + + src/cairo-clip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b12114f296e4e8db3207ab593a431fd0ca2ee67c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 24 11:08:38 2010 +0000 + + snapshot: Finish the clone. + + Kill ref cycles from snapshots patterns by explicitly calling finish on + the cloned surface. + + src/cairo-surface-snapshot.c | 1 + + 1 file changed, 1 insertion(+) + +commit db913d731e50505892697bdc919f9fe146eea6ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 24 10:16:58 2010 +0000 + + xcb: Ensure that we own the glyph cache before use. + + Sigh. One day, I will enable multiple glyph caches to be attached to a + scaled font, but for today, simply avoid the crash. + + src/cairo-xcb-surface-render.c | 38 +++++++++++++++++++++++++++++--------- + 1 file changed, 29 insertions(+), 9 deletions(-) + +commit 6da3cea3564bd8c5de37bf2244a2dd656202e4ec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 20:53:11 2010 +0000 + + scaled-font: Destroy the old surface when replacing scaled_glyph->recording + + src/cairo-scaled-font.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 548092fe8c9af1423a10e9566cbc4315d2f28efc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 20:08:04 2010 +0000 + + script: Free the surface/font bitmaps. + + src/cairo-script-surface.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 83d1bd9f37da93fbdc586788b6891d0eccdb7cee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 20:04:10 2010 +0000 + + script: Manually unlink font entries upon destruction + + As the device is already finished, we can not lock it without raising an + error, so we have to open code the destruction of the font entries. + Fortunately we can make several simplifying assumptions about the + required cleanup as we know the device is also being destroyed. + + src/cairo-script-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit cccf6753ab68b0795351da2626f9e4ecd60c2a2e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 19:45:35 2010 +0000 + + script: More acquire device fixes. + + We also need to acquire the device upon finish, similar surface creation + and the pagination functions, i.e. the other times outside of the + drawing ops that must modify the shared context/device. + + src/cairo-script-surface.c | 69 ++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 54 insertions(+), 15 deletions(-) + +commit 25a77b263d170265a9acf1697793cbbfa07dd852 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 16:49:21 2010 +0000 + + boilerplate: Cleanup the list of backends upon shutdown. + + boilerplate/cairo-boilerplate.c | 13 +++++++++++++ + boilerplate/cairo-boilerplate.h | 3 +++ + perf/cairo-perf-micro.c | 2 ++ + perf/cairo-perf-trace.c | 2 ++ + test/cairo-test.c | 2 ++ + 5 files changed, 22 insertions(+) + +commit 1ddcd5cf31bb47e9ff18ddf94d0a4648fa70a617 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 16:43:39 2010 +0000 + + clip: Remove the redundant _cairo_clip_init_rectangle() + + As _cairo_clip_init_rectangle() is equivalent and more importantly more + clearly written as: + _cairo_clip_init(&clip); + if (status = _cairo_clip_rectangle(&clip, &rect)) { + _cairo_clip_fini(&fini); + return status; + } + perform the transformation and in the process catch a few mistakes along + error paths. + + src/cairo-clip-private.h | 4 ---- + src/cairo-clip.c | 30 +++++++++++------------------- + src/cairo-paginated-surface.c | 18 +++++++++--------- + src/cairo-recording-surface.c | 11 +++++------ + src/cairo-surface-wrapper.c | 14 +++++--------- + 5 files changed, 30 insertions(+), 47 deletions(-) + +commit 61ad28fe7d334c63197ae3881d5edd074d63cfec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 10:44:16 2010 +0000 + + device: Add language binding interfaces. + + Damien Carbonne reported that cairo_device_t lacked the language binding + hooks normally associated with cairo objects. So add the missing + get_reference_count, get_user_data and set_user_data. + + src/cairo-device-private.h | 1 + + src/cairo-device.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 14 +++++++++ + 3 files changed, 93 insertions(+) + +commit 8a8c2f6c282c1822dc1a638c2258c8449b1d678b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 10:34:06 2010 +0000 + + cairo: Typos in docs. + + A couple of typos reported by Damien Carbonne. + + src/cairo-recording-surface.c | 10 ++++------ + src/cairo.h | 4 ++-- + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit 4c55c87478a2595569f9c1f13657c3d309f31407 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 10:05:35 2010 +0000 + + image: Free traps after conversion from boxes. + + src/cairo-image-surface.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 07f7bddc30157fed8f9dced00fef44a2307b4b01 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 10:05:35 2010 +0000 + + xcb: Free traps after conversion from boxes. + + src/cairo-xcb-surface-render.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 181403fb534d0216123043bcd3ee6cff60e1e6fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 09:38:59 2010 +0000 + + test/clear-source: Free source after use. + + test/clear-source.c | 38 ++++++++++++++++++++++---------------- + 1 file changed, 22 insertions(+), 16 deletions(-) + +commit 35432e37c264e1ace764b4a1393d9b8579eb52c0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 09:35:51 2010 +0000 + + xcb: Destroy reference to clip surface after use. + + src/cairo-xcb-surface-render.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 98e3dfbb899f0228fc9987a56af93b012989a27a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 09:35:31 2010 +0000 + + xcb: Relinquish the xcb connection on finish. + + src/cairo-xcb-connection.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 638cae3bdeaf0b10d1fd59a519f5d7a05c5b179c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 08:25:13 2010 +0000 + + xcb: Fix leak of clip rectangle during show-glyphs. + + src/cairo-xcb-surface-render.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit 1d4ad787747b5c92c3b062afde5b98c72ac4cc95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 08:20:49 2010 +0000 + + test/pthread-same-source: Free source after use. + + test/pthread-same-source.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit bfc027ac6d05f489d0d26110c225d2871be0971c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 23 08:16:57 2010 +0000 + + test/clip-image: Free image after use. + + test/clip-image.c | 1 + + 1 file changed, 1 insertion(+) + +commit e214f09d633093ce9b2ca0bffce10bc68a6e30b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 22:20:58 2010 +0000 + + xcb: Consume the implicit reference for the cached connection on finish + + src/cairo-xcb-connection.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c235543bdfd8b1495cb7ae8f2a82b6267c4d9b84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 22:15:44 2010 +0000 + + xcb: Destroy reference to local source picture in show-glyphs. + + src/cairo-xcb-surface-render.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit c42cdd2c9d883ef359ac57b65eba4ed15441181d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 20:14:09 2010 +0000 + + xcb: Gracefully destroy any lingering fallback during finish. + + A fallback should never persist beyond the flush into the finish, but + yet one remains in test/clip-shapes-unaligned-rectangles. For the time + been, simply clean up the rogue surface. + + src/cairo-xcb-surface.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit fd96aa3de2218dcc6671636f35a24738e3cae996 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 19:07:31 2010 +0000 + + gl: Hook in glyph cache finalisation. + + src/cairo-gl-glyphs.c | 23 ++++++++++++----------- + src/cairo-gl-private.h | 7 ++++--- + src/cairo-gl-surface.c | 4 ++++ + 3 files changed, 20 insertions(+), 14 deletions(-) + +commit c7511fa7ad932675c8cebba504d3c538ead3c44c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 17:21:38 2010 +0000 + + drm/intel: Revoke glyph caches on device finish + + src/drm/cairo-drm-i915-glyphs.c | 2 +- + src/drm/cairo-drm-i965-glyphs.c | 2 +- + src/drm/cairo-drm-intel-private.h | 1 + + src/drm/cairo-drm-intel.c | 18 ++++++++++++------ + 4 files changed, 15 insertions(+), 8 deletions(-) + +commit 9ba73bdfc451d205f411e3dbc8073ae10d58b4f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 17:17:08 2010 +0000 + + gl: Decouple cache from scaled-font on context destruction + + src/cairo-gl-glyphs.c | 8 +++++++- + src/cairo-gl-private.h | 4 ++++ + src/cairo-gl-surface.c | 14 +++++++++++++- + src/cairo-scaled-font-private.h | 2 ++ + src/cairo-scaled-font.c | 1 + + 5 files changed, 27 insertions(+), 2 deletions(-) + +commit 7812d095ab7657400be470af8fdc7f20eaedd6c5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 16:46:58 2010 +0000 + + drm/intel: Replace open-coding of _cairo_rtree_node_remove() + + src/drm/cairo-drm-intel.c | 17 +++-------------- + 1 file changed, 3 insertions(+), 14 deletions(-) + +commit 48d847162558dc09388942a96ff443c253068d68 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 13:05:23 2010 +0000 + + recording: Cleanup the clip on error. + + Whilst recording the commands, remember to cleanup the local clip after + detecting an error. + + src/cairo-recording-surface.c | 5 +++++ + src/cairo-surface-snapshot.c | 2 ++ + 2 files changed, 7 insertions(+) + +commit c87737c2bf983a8555b08c526050423a5eab5642 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 13:04:19 2010 +0000 + + ps: Skip surface emission if in error state. + + During finish, if we encountered an error during the construction of the + surface, simply proceed to cleanup rather than emit the incomplete and + potentially subtly broken output. + + src/cairo-ps-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e961cdf568f4551bbd6bca6b7505fc9f9b0805f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 10:48:48 2010 +0000 + + image: Special case wholly unbounded fixups. + + In the event of an empty bounded rectangle, the computation of the + unbounded - bounded rectangles leads to negative areas, integer overflow + and death. + + [And similarly for the derived surfaces.] + + src/cairo-image-surface.c | 24 +++++++++++ + src/cairo-xcb-surface-render.c | 62 +++++++++++++++------------ + src/drm/cairo-drm-i915-surface.c | 62 +++++++++++++++------------ + src/drm/cairo-drm-i965-surface.c | 93 +++++++++++++++++++++------------------- + 4 files changed, 144 insertions(+), 97 deletions(-) + +commit 844d8ea57d69c9a68fbec64f4438953850f7657f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 10:37:18 2010 +0000 + + surface: Check pattern for error status. + + Ensure that the error status from patterns is propagated when used by + doing so in the surface layer. Similarly check that a surface pattern + has not been finished. + + src/cairo-surface.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 55 insertions(+), 4 deletions(-) + +commit 213093f43770d078dd146d5a10b9a5803097b8a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 22 10:36:47 2010 +0000 + + ps: Free page on error path. + + src/cairo-ps-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit c8a8e57d6af7261d70103ddd46f8da409896b5e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:42:34 2010 +0000 + + script: Use a stack to push/pop recursed line numbers. + + Still not entirely helpful in the event of recursive parsing without a + reference to the file as well as the line number in the event of an + exception. + + util/cairo-script/cairo-script-scanner.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 4b4de940ee6e76ec9677b5468ebf709c6d2db982 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:41:18 2010 +0000 + + script: Remove the version check. + + When compiling we can depend on whatever version of cairo we need, but + we should be wary of checking for runtime compatibility when building + standalone. + + util/cairo-script/cairo-script-operators.c | 2 -- + 1 file changed, 2 deletions(-) + +commit a7cb314b060f6ada855ec75b283ef64bf835824a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:40:54 2010 +0000 + + test/any2ppm: Check for errors after executing script. + + test/any2ppm.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit b73a33b89e43d63a437035a05cf91df5c3b4d186 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:40:19 2010 +0000 + + script: Make the test suite run again! + + src/cairo-script-surface.c | 194 ++++++++++++++++++++++++--------------------- + 1 file changed, 103 insertions(+), 91 deletions(-) + +commit 2a59f0af6aab5fe0ebb19195d4c018fc5221016c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:38:27 2010 +0000 + + wrapper: Apply device transform inverse as appropriate. + + Fixes many failures of the paginated surfaces as they replayed through + the recording surfaces. + + src/cairo-surface-wrapper.c | 89 ++++++++++++++++----------------------------- + 1 file changed, 31 insertions(+), 58 deletions(-) + +commit 5720fff827e5149b201a9366179db93ce258b120 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:37:38 2010 +0000 + + ps: Destroy the local surface on error. + + Minor leak of the intermediate surface when converting to an opaque + source following an error. + + src/cairo-ps-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 35f318a59cde9c635036cc14c90878400528882d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 21 20:36:26 2010 +0000 + + paginated: Use common is_clear. + + As equivalent processing to the page_is_blank optimisation done inside + the paginated surface is applied by the gstate, remove the redundant + code. + + src/cairo-paginated-surface-private.h | 1 - + src/cairo-paginated-surface.c | 34 +--------------------------------- + 2 files changed, 1 insertion(+), 34 deletions(-) + +commit b101c7dab8cdbf7b9321355a8d2311b2f863f011 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 11 01:48:43 2010 +0000 + + gl: Add EGL interface + + Enable the EGL backend for GL. + + boilerplate/Makefile.win32.features | 8 ++ + boilerplate/cairo-boilerplate-gl.c | 98 +++++++++++++++++++++ + build/Makefile.win32.features-h | 1 + + configure.ac | 52 ++++++----- + src/Makefile.sources | 1 + + src/Makefile.win32.features | 8 ++ + src/cairo-egl-context.c | 168 ++++++++++++++++++++++++++++++++++++ + src/cairo-gl.h | 14 +++ + 8 files changed, 327 insertions(+), 23 deletions(-) + +commit ca6e4e1f91e0a90666551d2fa74cfc04484d4e80 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 11 01:48:08 2010 +0000 + + spans: Initialise rects->is_bounded for polygon compat. + + src/cairo-spans.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6754f1db1716a6570c82e207e21b09a10de120ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 10 15:13:00 2010 +0000 + + gstate: Account for undropped non-transformed glyphs. + + In the simplest case of pass-through glyphs we made a mistake in + propagating the number of glyphs. + + Reported-by: Christophe de Dinechin <christophe@taodyne.com> + + src/cairo-gstate.c | 1 + + 1 file changed, 1 insertion(+) + +commit 5fb36fe5ab2a2b30da213557936122a829493906 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 8 15:32:15 2010 +0000 + + drm/i965: Acquire device around commit. + + src/drm/cairo-drm-i915-surface.c | 4 +- + src/drm/cairo-drm-i965-shader.c | 13 +++-- + src/drm/cairo-drm-i965-surface.c | 106 ++++++++++++++++++++++++++------------- + 3 files changed, 82 insertions(+), 41 deletions(-) + +commit 4083f40fbd085dc2039fe62592cf1239373c7fca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 7 16:59:57 2010 +0000 + + glew: don't pull in GL/glu.h + + src/glew/GL/glew.h | 10 ---------- + 1 file changed, 10 deletions(-) + +commit 473e006ad6ef0959c8a7059aba0689a16a937732 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 6 18:12:36 2010 +0000 + + test: Add a1-mask-sample + + Test sampling positions with a NEAREST mask. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/a1-mask-sample.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ + test/a1-mask-sample.ref.png | Bin 0 -> 148 bytes + 4 files changed, 85 insertions(+) + +commit f79b2ceea4722b5059563be1eb55de617fecc004 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 4 19:52:58 2010 +0000 + + drm/i915: Discard redundant solitary clips during fill + + src/drm/cairo-drm-i915-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 7cea9ae290ba24e4d2f87cef4228cce5fcb3181b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 4 17:23:55 2010 +0000 + + drm/i915: Apply more micro-optimisations when targetting CONTENT_ALPHA + + src/drm/cairo-drm-i915-shader.c | 51 ++++++++++++++++++++++++++++++----------- + 1 file changed, 37 insertions(+), 14 deletions(-) + +commit dce8b028cd5b249054e8197a536c29f6ba4110da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 4 17:13:53 2010 +0000 + + drm/i915: Adjust clip matrix for clip origin. + + src/drm/cairo-drm-i915-shader.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 8e702044b3816002011488c56f1ec9c6b9682eee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 4 17:13:02 2010 +0000 + + drm/i915: Handle clip/combine coords for spans. + + src/drm/cairo-drm-i915-spans.c | 71 +++++++++++++++++++++++++----------------- + 1 file changed, 43 insertions(+), 28 deletions(-) + +commit e1f0c2e73fa8cda9e38ab182288201fa27a3b363 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 4 17:11:58 2010 +0000 + + perf: Check for and include unistd.h + + isatty() and access() require unistd.h, so include it! + + perf/cairo-perf-trace.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 271752b944ef0898b5d1be57f26de83c8e40ae3a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 4 08:24:08 2010 +0000 + + gl: Pad the gradient texture. + + Fixes test/linear-gradient-subset + + src/cairo-gl-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit afe6f4f0519606c4bc7e9b705b0cae75692d7af2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 23:06:43 2010 +0000 + + drm/i915: Use a preserved temporary to store the radial texcoord. + + src/drm/cairo-drm-i915-shader.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 4b2e0478822cb8415be4bac21950dbf03c0f01c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 21:45:31 2010 +0000 + + drm/i915: Eliminate redundant radial vertex shader. + + It is always equivalent to a simple texture transformation, so reduce it + to the texture shader. + + src/drm/cairo-drm-i915-glyphs.c | 13 ------------- + src/drm/cairo-drm-i915-private.h | 1 - + src/drm/cairo-drm-i915-shader.c | 8 +------- + src/drm/cairo-drm-i915-spans.c | 42 ++-------------------------------------- + 4 files changed, 3 insertions(+), 61 deletions(-) + +commit 51610517982a4cf70ca8d396d0ad4c58a477c5e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 21:56:56 2010 +0000 + + drm/i915: Fix encoding of negated operand channels + + Long ago when converting the pixel shader structs into macros and + reducing the code size by ~100k (the inlines were too depth for constant + propagation and CSE), I broke the encoding of negated channels. So + instead use a single bit to indicate a negation rather than 2s + complement (with sign extension into neighbouring channels, oops). The + disadvantage is that expressing the negated channel is a little more + ugly. + + src/drm/cairo-drm-i915-private.h | 22 ++++++++++++++-------- + src/drm/cairo-drm-i915-shader.c | 16 ++++++++-------- + 2 files changed, 22 insertions(+), 16 deletions(-) + +commit 5b973c670807bda2bb355c90ea817e2a2f092f0b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 21:25:11 2010 +0000 + + drm/i915: Fix crash with linear-step-function + + Avoid the potential divide by zero by falling back to pixman rendered + gradient textures for such troublesome input. + + src/drm/cairo-drm-i915-shader.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit 404ead7eebafa7ca077e1d012dde0a598b64245a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 21:01:49 2010 +0000 + + drm/i915: Ensure simple alpha is written to green on alpha-only surfaces. + + The intricacies of h/w make convoluted s/w. + + src/drm/cairo-drm-i915-shader.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +commit 1f2daf652480ef768f847467d9171b5e4a7f01a3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 20:06:08 2010 +0000 + + drm/i915: Avoid double multiplication of linear alpha. + + src/drm/cairo-drm-i915-shader.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit cdaef58c19a191632473fcbbe688e6231c02b9b2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 18:52:40 2010 +0000 + + drm/i915: Acquire device before shader commit. + + src/drm/cairo-drm-i915-shader.c | 2 + + src/drm/cairo-drm-i915-surface.c | 111 ++++++++++++++++++++++++++------------- + 2 files changed, 77 insertions(+), 36 deletions(-) + +commit dd6f96dd4aeb48262d5af8a3006e6404521c151b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 16:06:25 2010 +0000 + + drm/i965: Ignore flushing on device finish. + + src/drm/cairo-drm-i965-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3692597567f62dd300e8ce8c43d43ac449616041 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 13:56:48 2010 +0000 + + drm/i965: Merge the constants into the surface stream. + + As we can use an offset from the surface base for the constant buffers, + we need to fold the constants into the surface stream. + + src/drm/cairo-drm-i965-private.h | 11 ++----- + src/drm/cairo-drm-i965-shader.c | 26 ++++----------- + src/drm/cairo-drm-i965-surface.c | 70 +++------------------------------------- + 3 files changed, 14 insertions(+), 93 deletions(-) + +commit cc585947574f6e17d299a5987ee69162f63d5a52 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 23:06:23 2010 +0000 + + drm/intel: Set the 1D gradient texture to be untiled. + + src/drm/cairo-drm-intel.c | 1 + + 1 file changed, 1 insertion(+) + +commit 543cf073643b259096ee2a95d91b9067395a7e09 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 21:19:41 2010 +0000 + + drm/intel: Set default extend mode for rendering gradient subsets. + + src/drm/cairo-drm-intel.c | 1 + + 1 file changed, 1 insertion(+) + +commit 521d1c1d2c51bca07db1aed3c7f62d860cece3f4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 20:25:54 2010 +0000 + + surface: Simplify is_clear logic. + + As we pre-check whether the operation is a no-op on an already cleared + surface, then for all but a paint with CLEAR and no clip, the result is + a non-clear surface. + + src/cairo-surface.c | 22 ++++++++-------------- + 1 file changed, 8 insertions(+), 14 deletions(-) + +commit 017db956644fa1da22033653490f362d1e3e47e0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 20:06:30 2010 +0000 + + gstate: Use _cairo_pattern_clear for CLEAR. + + src/cairo-gstate.c | 100 +++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 62 insertions(+), 38 deletions(-) + +commit 70412bba0e9fd0ac6e7343d7aebe953355207aab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 17:34:39 2010 +0000 + + test: Avoid derefencing a NULL xcb connection + + test/xcb-surface-source.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 5bfea8447b1b2333218295f51a9474d061192d49 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 3 21:32:13 2010 +0000 + + test: Add references for rounded-rectangle-{fill,stroke} + + test/Makefile.am | 2 ++ + test/rounded-rectangle-fill.ref.png | Bin 0 -> 787 bytes + test/rounded-rectangle-stroke.ref.png | Bin 0 -> 871 bytes + 3 files changed, 2 insertions(+) + +commit 4126d580d8b9db9217ed17aadcce20b14e77a00b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 2 14:38:36 2010 +0000 + + surface-fallback: Free traps on composite_trapezoids() error + + src/cairo-surface-fallback.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 8a59522bbdc61d5c90f1ae55111b5408865755b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 2 14:36:16 2010 +0000 + + surface-fallback: Propagate NOTHING_TO_DO + + NOTHING_TO_DO is converted to SUCCESS by the surface layer, so clean up + the code slightly by reducing the number of checks and conversions. + + src/cairo-surface-fallback.c | 15 +++------------ + 1 file changed, 3 insertions(+), 12 deletions(-) + +commit f07195860620959c27d43080a7b987e28222735a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 2 13:57:02 2010 +0000 + + xlib: Handle a1 image uploads through converter + + Fixes test/large-source [xlib] + + src/cairo-xlib-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f979dd22d8f48e6ac7c50372c7d180c3b590dc74 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 2 11:20:11 2010 +0000 + + image: Don't rely on clip regions being clipped to surface extents. + + Fixes a crash in test/clip-fill-unbounded [xlib-fallback]. + + src/cairo-image-surface.c | 32 ++++++++++++++++++++------------ + 1 file changed, 20 insertions(+), 12 deletions(-) + +commit 15d9c5fcd8881b4593ec23633450a4f629b6d42b +Author: Alexander Shulgin <alex.shulgin@gmail.com> +Date: Sat Feb 20 20:59:32 2010 +0200 + + Added new MIME type CAIRO_MIME_TYPE_URI and it's support in SVG backend + + The rationale behind this change is that when someone is trying to + draw on a SVG surface using image surface patterns, the resulting SVG + file can take up to ridiculous 20 megabytes for 3-4 typical + photographic images in a single SVG file. This also can take + significant amount of CPU time to complete. + + The reason for this behaviour is that currently whenever SVG backend + needs to emit an image tag for a surface pattern it takes a snapshot + of the subject surface, encodes it in PNG, then Base64-encodes and + emits the (huge) resulting string. With use of + cairo_surface_set_mime_data API this can be somewhat improved by + associating JPEG image contents with the corresponding surfaces. + Still this doesn't allow for post-processing of involved photographic + images without regenerating the SVG file. + + As SVG specification allows URIs in the image tag's xlink:href + attribute, it is possible instead of embedding encoded image data to + simply link image files residing physically on the same medium as the + generated SVG file: files on disk under common directory, files on a + web server at common base URI, etc. + + To make this happen we add new (unofficial) MIME type "text/x-uri" and + let users associate URIs with surfaces through + cairo_surface_set_mime_data() API. When SVG backend needs to emit + surface contents and it sees "text/x-uri" attached to the surface, it + emits this data instead of taking snapshot. The URI data is emitted + as is, so correctness check is left solely to the client code. + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-surface.sgml | 7 ++++ + src/cairo-surface.c | 16 ++++++++- + src/cairo-svg-surface.c | 72 +++++++++++++++++++++++++++++++++++--- + src/cairo.h | 1 + + 5 files changed, 92 insertions(+), 5 deletions(-) + +commit d91bab565c54205f8dd7aa8a9de819dc4bc3551c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 2 08:12:52 2010 +0000 + + test: Remove the double-clip from clip-group-shapes + + A push/pop is an implicit save/restore, so a clip applied inside the + group is temporary, whereas a clip applied outside affects both the + geometry inside *and* the application of the group when painted. So + reset the clip afterwards to get the desired behaviour. + + test/clip-group-shapes.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit e8c819c5227d29dfdf503022339276eb725a3e97 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 1 10:25:01 2010 +0000 + + Warnings cleanup for CAIRO_FORMAT_INVALID. + + A few more fixes required case statements to handle the addition of + CAIRO_FORMAT_INVALID. + + src/cairo-qt-surface.cpp | 2 ++ + src/drm/cairo-drm-i915-surface.c | 2 ++ + src/drm/cairo-drm-i965-shader.c | 2 ++ + src/drm/cairo-drm-i965-surface.c | 1 + + src/drm/cairo-drm-intel-surface.c | 1 + + src/drm/cairo-drm-intel.c | 3 +++ + src/drm/cairo-drm-radeon-surface.c | 1 + + 7 files changed, 12 insertions(+) + +commit 1a7ba1a8061c373cd66d15b3a1c8dfada92745ef +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Mar 1 01:23:17 2010 +0200 + + xcb: Update minimum required versions of libxcb. + + The new xcb surface uses xcb_writev() and xcb_take_socket() + which were introduced in libxcb 1.1.92. The boilerplate + in turn uses the major_code and minor_code fields in + xcb_generic_error_t, which were introduced in 1.4. + + boilerplate/cairo-boilerplate-xcb.c | 6 ++++++ + configure.ac | 5 ++++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 5b7f4bb241f3191c1589cd714f373719efded56e +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Feb 28 23:31:06 2010 +0200 + + api: Introduce CAIRO_FORMAT_INVALID formally in the API. + + We were exposing the actual value of CAIRO_FORMAT_INVALID + through API functions already, so it makes sense to just + go ahead and put it in the cairo_format_t enum. + + boilerplate/cairo-boilerplate.c | 2 +- + src/cairo-debug.c | 1 + + src/cairo-gl-glyphs.c | 6 ++++++ + src/cairo-image-surface.c | 6 +++++- + src/cairo-png.c | 1 + + src/cairo-scaled-font.c | 1 + + src/cairo-script-surface.c | 22 ++++++++++++++-------- + src/cairo-win32-surface.c | 6 ++++++ + src/cairo-xcb-surface-render.c | 3 +++ + src/cairo-xlib-display.c | 1 + + src/cairo-xlib-surface.c | 3 +++ + src/cairo-xml-surface.c | 28 +++++++++------------------- + src/cairo.h | 10 ++++++---- + src/cairoint.h | 4 ++-- + src/drm/cairo-drm-gallium-surface.c | 1 + + src/drm/cairo-drm-i915-surface.c | 1 + + src/drm/cairo-drm-intel-surface.c | 2 +- + src/drm/cairo-drm-intel.c | 11 ++++++++--- + src/drm/cairo-drm-radeon-surface.c | 2 +- + test/any2ppm.c | 1 + + test/png.c | 1 + + util/cairo-script/cairo-script-operators.c | 5 +++++ + util/cairo-sphinx/sphinx.c | 9 ++++++--- + util/cairo-trace/trace.c | 4 ++++ + 24 files changed, 88 insertions(+), 43 deletions(-) + +commit 620cd9c2be4a6bef790e6818652470a5c53d578d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 28 09:09:20 2010 +0000 + + image: Allow reduction of repeat modes for unity scaled patterns. + + src/cairo-image-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 9ecb0f3cec491264041d0d3718595ad95164980a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Feb 28 01:42:10 2010 +0200 + + image: Fix bug optimizing surface pattern extend modes. + + The image surface tries to convert surface pattern's extend + modes to EXTEND_NONE, if it can, when converting a cairo_pattern_t + to a pixman_image_t. The check was not taking into account the + transformation matrix on the pattern, so it was possible to + trick it into using EXTEND_NONE by downscaling the source + pattern enough. This patch changes the optimization to only + take if the pattern has no transformation. + + Fixes surface-pattern-scale-down-extend-{pad,reflect,repeat} + failures in the test suite for the image backend. + + src/cairo-image-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 260d7f8ace9dea8ff6b3a70f481e433cf399a3d2 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Feb 27 17:41:28 2010 +0200 + + test: Test downscaling and extending a surface pattern. + + Franz Schmid reported a regression in 1.9.6 when downscaling + and using EXTEND_REPEAT for an image surface pattern. This + patch adds such tests for every extend mode. + + test/Makefile.sources | 1 + + .../surface-pattern-scale-down-extend-none.ref.png | Bin 0 -> 329 bytes + test/surface-pattern-scale-down-extend-pad.ref.png | Bin 0 -> 320 bytes + ...rface-pattern-scale-down-extend-reflect.ref.png | Bin 0 -> 328 bytes + ...urface-pattern-scale-down-extend-repeat.ref.png | Bin 0 -> 330 bytes + test/surface-pattern-scale-down-extend.c | 107 +++++++++++++++++++++ + 6 files changed, 108 insertions(+) + +commit ebadc2ed0810d9941a2f44586016073fea90115b +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Feb 27 03:24:55 2010 +0200 + + test: Add tests covering more clip fast paths in groups. + + The clip-group-shapes-* tests check that it doesn't + matter whether the clip path is set before or after + pushing a group using specific types of clip paths + (aligned/unaligned rectangles and general paths.) + + test/Makefile.sources | 1 + + test/clip-group-shapes-aligned-rectangles.ref.png | Bin 0 -> 378 bytes + test/clip-group-shapes-circles.ref.png | Bin 0 -> 1510 bytes + .../clip-group-shapes-unaligned-rectangles.ref.png | Bin 0 -> 415 bytes + test/clip-group-shapes.c | 189 +++++++++++++++++++++ + 5 files changed, 190 insertions(+) + +commit e8d0b4fb39eba799e8649df6dd609f6100efb95e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 26 10:28:23 2010 +0000 + + gl: Markup internal functions with cairo_private + + src/cairo-gl-private.h | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit ef807119ff8ee23c0444f1197f92b06a5caf6024 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Feb 25 13:58:53 2010 +0200 + + compiler: Explain the slim hidden macros. + + The slim_hidden_* macro definitions are rather cryptic at first + sight and I keep needing to rederive how they work just find out + what they're supposed to do. This patch adds a comment explaining + how they're used and work. + + src/cairo-compiler-private.h | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +commit dcf897967d54f579c737bbcc10af7fa295b586e5 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Feb 21 01:45:30 2010 +0200 + + test: Fix a wrongly typed return value in scaled-font-zero-matrix. + + The test was returning a cairo_status_t, but should be returning + a cairo_test_status_t instead. When the test failed it was + being reported as having crashed, rather than merely failed, + because the enum value of CAIRO_TEST_CRASHED happened to be + same as the cairo_status_t value of the cairo context at + the end of the failing test. + + test/scaled-font-zero-matrix.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8bb06915ed6628c6d8978b6c2fec474bbf08d7e9 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Feb 23 21:01:13 2010 +0100 + + image: split cairo_image_surface_coerce() + + Split into a general cairo_image_surface_coerce() that coerces to one of + the 3 supported formats (ARGB32, RGB24, A8) based on content and the + more general cairo_image_surface_coerce_to_format() that coerces to a + specified format. + + src/cairo-gl-glyphs.c | 3 +-- + src/cairo-gl-surface.c | 3 +-- + src/cairo-image-surface.c | 14 ++++++++++++-- + src/cairo-png.c | 3 +-- + src/cairo-scaled-font.c | 2 +- + src/cairo-script-surface.c | 4 +--- + src/cairo-svg-surface.c | 4 ++-- + src/cairo-type3-glyph-surface.c | 2 +- + src/cairo-xcb-surface-render.c | 21 ++++----------------- + src/cairoint.h | 8 ++++++-- + 10 files changed, 30 insertions(+), 34 deletions(-) + +commit b7c42b6aaa2dba09ed3ff9ae85eae27bec268713 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 23 19:27:16 2010 +0000 + + drm: Add missing private headers + + Reported by: Thomas Jones <thomas.jones@utoronto.ca> + + src/Makefile.sources | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6ab5f89571b0252496d58242ed3060a9486d68d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 23 08:54:58 2010 +0000 + + bo-rectangular: Fix incorrect skipping of colinear eo edges + + Fixes test/bug-bo-rectangular + + After skipping edges, we need to bd careful to only terminate the box on + a closing edge. + + src/cairo-bentley-ottmann-rectangular.c | 31 ++++++++++++++----------------- + 1 file changed, 14 insertions(+), 17 deletions(-) + +commit 1897156d96d77ff28f585794c1eb1baffa105488 +Author: Benjamin Otte <otte@gnome.com> +Date: Tue Feb 23 08:41:27 2010 +0000 + + test: Add bug-bo-rectangular + + Exercises a bug found in the special case rectangular tessellator with + colinear eo edges. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/bug-bo-rectangular.c | 67 ++++++++++++++++++++++++++++++++++++++++ + test/bug-bo-rectangular.ref.png | Bin 0 -> 950 bytes + 4 files changed, 69 insertions(+) + +commit 21b2457aabf7df2a9f040751cd48e396443262f1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 22 15:26:37 2010 +0000 + + fallback: Initialize rects.is_bounded for span renderer. + + src/cairo-surface-fallback.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6dd22b767808f721de5d00fe384711ffaa269453 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 22 15:24:08 2010 +0000 + + gl: Initialise glyphs mask to ensure allocation in absence of stash. + + src/cairo-gl-glyphs.c | 1 + + 1 file changed, 1 insertion(+) + +commit 668ac047e6c790b0f8f58c52f169c688caa81678 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 22 14:57:01 2010 +0000 + + gl: Avoid attempting to create a program on GLSL-incapable h/w for spans + + src/cairo-gl-shaders.c | 17 ++++++++++++----- + src/cairo-gl-surface.c | 6 ++++++ + 2 files changed, 18 insertions(+), 5 deletions(-) + +commit 29df5c91d02276211962a083284feb9a424f0d97 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 22 14:46:18 2010 +0000 + + gl: Return unsupported for h/w that cannot handle shaders. + + Remove the ASSERT_NOT_REACHED and propagate the unsupported status so + that we fallback to fixed-function gracefully. + + src/cairo-gl-shaders.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit 9f46bad301eff967dc0790fc271d872f8a45cedb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 22 14:20:34 2010 +0000 + + bo-rectangular: Prevent invalid read during edge traversal + + Benjamin Otte tracked down an invalid read triggered by WebKit. The + cause is that we attempt to dereference the list_head as an edge as we + failed to check that during the skipping of colinear edges we advanced + to the end, under the false assumption that there would always + be a closing edge in a rectangle. This assumption is broken if the tail + rectangles having colinear right edges. + + src/cairo-bentley-ottmann-rectangular.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 75db4f0ece194b7aa0455509785a300784778ec4 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Feb 22 02:26:47 2010 +0200 + + text: Fix assert failure from compositing by SOURCE with a mask internally. + + Change the operator used to upgrade the format of a glyph mask from + CAIRO_OPERATOR_SOURCE to CAIRO_OPERATOR_ADD. + + The _cairo_scaled_font_show_glyphs() function upgrades the pixel + format of a glyph mask by calling _cairo_surface_composite() to copy + the mask to an image surface of the upgraded destination. The way it + was doing it however was to use CAIRO_OPERATOR_SOURCE, a white source + pattern and the glyph's rasterised glyph as the mask pattern. This + combination isn't supported by _cairo_surface_composite(), which + asserts that no mask is present when the operator is SOURCE or CLEAR. + + Reported by Mikael Magnusson to #cairo on irc.freenode.net. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 20f8f17f0e494a57a6b413be76f9333b42d88014 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Feb 20 21:42:23 2010 +0100 + + xcb: Fix compilation without dri2 + + XCB should be able to compile without xcb-drm. To do so it + can include xcb/dri2.h only if xcb-drm is enabled. + + src/cairo-xcb-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit fc7be0014d91c8536db8a15ae98b5e78c354c160 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 19 17:39:50 2010 -0800 + + Update version to 1.9.7. + + Following the 1.9.6 snapshot. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb090136b2b0b89bde69d9575f2f592b46e144e8 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 19 17:28:29 2010 -0800 + + Update REFERENCE_IMAGES list for "make distcheck". + + As usual, "make distcheck" does not work until we update this list. + + test/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 20cf7c92b332a5fd28227f0cdaa50e3f1080c038 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 19 17:24:33 2010 -0800 + + Update version to 1.9.6 + + For a new cairo 1.9.6 snapshot. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1c3d417c30bd60c51512d23440896a6a7f51bf23 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 19 17:23:16 2010 -0800 + + NEWS: Add notes for the 1.9.6 snapshot. + + Based on a very brief reading of the git log. There's certainly + a lot of interesting stuff missing here. + + NEWS | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 112 insertions(+), 2 deletions(-) + +commit 9057c4b6be5f5cc6f8905e017dde534402ddedda +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 17 12:37:07 2010 -0800 + + test: Add an option to explicitly specify a test name to the runner. + + test/cairo-test-runner.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit e0a948bd2ff3504f5d8b3b3f2136cd9b86cf8ec6 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 17 11:48:41 2010 -0800 + + gl: Be sure to do linear interpolation on gradients. + + src/cairo-gl-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f1e794956f60a935bfc38ae1c2c2d51d37aadee3 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 17 11:03:52 2010 -0800 + + gl: Stop trying to handle first/last stop offset in the gradient shaders. + + Since moving to pixman for the gradient textures, first=0 and last=1, + so there's no need to rescale to 0,1 any more. Shaves 6 Gen4 ISA + instructions, including 2 inverses, in the radial fragment shader. + + src/cairo-gl-private.h | 4 ---- + src/cairo-gl-shaders.c | 12 ------------ + src/cairo-gl-surface.c | 51 +++----------------------------------------------- + 3 files changed, 3 insertions(+), 64 deletions(-) + +commit f813a0243b90ea4151f60f3d13bb6c84d21270df +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 17 10:58:16 2010 -0800 + + gl: Remove the old unused radial/linear gradients shaders. + + They're dynamically generated now for source/mask. + + src/cairo-gl-private.h | 6 --- + src/cairo-gl-shaders.c | 117 ------------------------------------------------- + 2 files changed, 123 deletions(-) + +commit 8da843e996bda7152abb217b3f461a8091dbc880 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 17 10:54:39 2010 -0800 + + gl: Reduce complexity of radial fragment shaders. + + This shaves 1 Mesa IR instruction, and 6 Gen4 ISA instructions. + + src/cairo-gl-shaders.c | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +commit 89bdc2f8d55d951e15b77e6737c57b208d984b0a +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 4 23:17:59 2010 -0800 + + gl: Implement draw_image for window targets. + + Creates a texture and draws with it instead of doing TexSubImage. + Open question is whether this wouldn't be better in general. Fixes + several failures with ARB_texture_rectangle path due to fallbacks to + window drawing. + + src/cairo-gl-surface.c | 157 ++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 124 insertions(+), 33 deletions(-) + +commit fcd29473ff71b74bf541199293a966df2232fd63 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 16 13:47:41 2010 -0800 + + gl: Fix glyphs texture coordinates for ARB_texture_rectangle. + + Fixes most of the text testcases to match the + ARB_texture_non_power_of_two results. + + src/cairo-gl-glyphs.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit e845450905f373e4fcb9ae4717cfd2c3e6472423 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 16 13:18:33 2010 -0800 + + gl: Add GLSL support for ARB_texture_rectangle, and repeat/reflect fallbacks. + + Most testcases are now passing like the ARB_texture_non_power_of_two + case. EXT_texture_rectangle support is dropped in favor of + ARB_texture_non_power_of_two. If we have issues with drivers not + having that but having EXT (which just lacks the GLSL part of the + spec), we can split it out. Right now non-GLSL support in cairo-gl is + probably in bad shape anyway and will require someone that cares for + it in order to get fixed up. + + src/cairo-gl-shaders.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-surface.c | 21 +++++++++++++++------ + 2 files changed, 59 insertions(+), 6 deletions(-) + +commit 40294377cb26fab7bcf17ee98b8e4f5bf9778ca2 +Author: Dave Airlie <airlied@redhat.com> +Date: Sat Jan 30 19:24:31 2010 +1000 + + gl: initial support for EXT_texture_rectangle extension + + The only issue is the repeat modes aren't supported for rectangular + textures. In any case even with ARB_npot radeon's pre-r600 lie and + fail to do repeats anyway. + + src/cairo-gl-glyphs.c | 25 +++++----- + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 124 ++++++++++++++++++++++++++++++------------------- + 3 files changed, 89 insertions(+), 61 deletions(-) + +commit 6542a515f04d52d10fdc89ee9abc76e54282a2d8 +Author: Eric Anholt <eric@anholt.net> +Date: Sun Feb 7 20:26:56 2010 +0100 + + gl: Reduce the size of the gradient texture for small numbers of stops. + + This code is stolen straight from cairo-drm-intel.c. This saves a + bunch of time calculating interpolated points when we just do + interpolation between points at sampling time anyway. Reduces + firefox-talos-svg from 47 seconds back to the 42 it was at before the + pixman change. + + This regresses the reported result of huge-radial, but there's no + visible difference. + + src/cairo-gl-surface.c | 63 +++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 45 insertions(+), 18 deletions(-) + +commit 3b678a88b0d026bb765fd9cdff92fe7235e19848 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 12 16:44:25 2010 +0000 + + drm/i915: Set a source for unbounded fixups. + + src/drm/cairo-drm-i915-surface.c | 52 +++++++++++++++++++++++++++++++--------- + 1 file changed, 41 insertions(+), 11 deletions(-) + +commit 45a275ee29095b69c620ece868411885f4574be9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 12 14:12:24 2010 +0000 + + drm/i915: Use correct linear mode for mask. + + src/drm/cairo-drm-i915-shader.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 37dbf157f354234d04cd4f0c5d069ff0d535e862 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 12 14:08:32 2010 +0000 + + clip: Avoiding derefencing NULL clip_region + + src/cairo-image-surface.c | 26 ++++++++++++++------------ + src/cairo-xcb-surface-render.c | 26 ++++++++++++++------------ + 2 files changed, 28 insertions(+), 24 deletions(-) + +commit 6995e1d982a3ad84a1b74730ce557840745fcd8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 12 14:08:14 2010 +0000 + + boilerplate: Include X11.h for GL/GLX + + boilerplate/cairo-boilerplate-gl.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5390df961f6dff8e25e5aac21062026a81710d88 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 12 12:20:35 2010 +0000 + + clip: Restrict composite extents to clip extents + + Fixes test/clip-rectangle-twice. + + src/cairo-clip-private.h | 6 +++ + src/cairo-clip.c | 84 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-image-surface.c | 74 +++++++++-------------------------- + src/cairo-surface-fallback.c | 71 ++------------------------------- + src/cairo-xcb-surface-render.c | 78 ++++++++++--------------------------- + src/drm/cairo-drm-i915-surface.c | 47 ++-------------------- + src/drm/cairo-drm-i965-surface.c | 47 ++-------------------- + 7 files changed, 137 insertions(+), 270 deletions(-) + +commit 51047483f462a905567b42275ae061ead4df0a07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 12 12:18:30 2010 +0000 + + test: Add clip-twice-rectangle + + Jeff Muizeelar found another bug with clipping whereby the clip was + been incorrectly discarded. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/clip-twice-rectangle.c | 70 ++++++++++++++++++++++++++++++++++++++ + test/clip-twice-rectangle.ref.png | Bin 0 -> 323 bytes + 4 files changed, 72 insertions(+) + +commit 22b5f78c1c1ae7d289a99a3c52354bba3b9e817f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 11 10:38:51 2010 +0000 + + gl: Remove eagle support + + Eagle is no more, Kristian has superseded it with true EGL support. He + is so happy... + + boilerplate/Makefile.win32.features | 10 -- + build/Makefile.win32.features | 1 - + build/Makefile.win32.features-h | 3 - + build/configure.ac.features | 1 - + configure.ac | 12 --- + src/Makefile.sources | 2 - + src/Makefile.win32.features | 14 --- + src/cairo-eagle-context.c | 185 ------------------------------------ + src/cairo-gl.h | 12 --- + 9 files changed, 240 deletions(-) + +commit ed4a30b38311e4ce0730ecd6026432f4a1e8ddf7 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Feb 10 22:10:23 2010 +0100 + + build: Add -Wdeclaration-after-statement + + ... and fix the compile errors from it I get on my build. + + It's Cairo style to put declarations before the code, so better warn + about it. + Besides, it eases porting to old compilers like MSVC. + + build/configure.ac.warnings | 2 +- + src/cairo-gl-shaders.c | 8 ++++---- + src/cairo-gl-surface.c | 3 ++- + src/cairo-xcb-surface-core.c | 3 ++- + 4 files changed, 9 insertions(+), 7 deletions(-) + +commit 4113e455a317785b83324215a6b0156995665989 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 10 21:09:56 2010 +0000 + + drm/i965: fix use of uninitialized variable whilst dumping errors + + Cut'n'paste bug from i915 error path. + + src/drm/cairo-drm-i965-surface.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 5d34902c0cb9712179292112fbdb0f06be327fd8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 10 12:10:16 2010 +0000 + + script: Compile without mmap + + Should fix: + Bug 26509 - Cairo fails to compile without mmap + http://bugs.freedesktop.org/show_bug.cgi?id=26509 + + As reported by Hib Eris, Cairo files to compile under a mingw32 + cross-compiler as we use a structure only defined if HAVE_MMAP + unconditionally. + + util/cairo-script/cairo-script-operators.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit fb5af4ae407044d1c0d0144ec13f5951075426a3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 10 12:00:59 2010 +0000 + + drm/intel: An interrupted SET_TILING modifies the input parameters + + If a signal interrupts the SET_TILING ioctl, the tiling and stride + values are updated to reflect the current condition of the buffer, so we + need to restore those to the desired values before repeating the ioctl. + + src/drm/cairo-drm-intel.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3c66c721d1bb1db6052acf722f609dcbe56431f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 9 08:48:42 2010 +0000 + + qt: Fix compile error. + + Update after prototype changed for create_similar(), as pointed out by + augzilla. + + src/cairo-qt-surface.cpp | 1 - + 1 file changed, 1 deletion(-) + +commit a1e5b07fa834819b8d9df9fa56758639a08262d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 7 20:26:27 2010 +0000 + + ps: Initialise page bbox to page size + + src/cairo-ps-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 44b6370cb04d27e1ae3e50558a9085d318990938 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 7 19:36:29 2010 +0000 + + ps: Propagate NOTHING_TO_DO + + The upper layers should know what to do if there is nothing to be done, + so pass on that knowledge. + + src/cairo-ps-surface.c | 36 ++++-------------------------------- + 1 file changed, 4 insertions(+), 32 deletions(-) + +commit a4793d1331845b85a9c1810035119dfbcffa5082 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 7 19:27:32 2010 +0000 + + test: Add linear-gradient-subset + + It was observed that we never actually test the condition that the + gradient is only defined for a portion of its range, i.e. the starting + offset is >0 and the ending offset is <0. By definition the colour + between 0 and start offset is the start color, so check that this + behaviour is followed by all backends. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/linear-gradient-subset.c | 127 ++++++++++++++++++++++++++++++++++++ + test/linear-gradient-subset.ref.png | Bin 0 -> 825 bytes + 4 files changed, 129 insertions(+) + +commit 0f99303cd6d68df79070200a843194a20ad1c597 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 7 12:40:19 2010 +0000 + + gl: Use pixman to create the gradient texture + + This is just for consistency as we know that pixman has to handle all + the corner cases anyway... + + src/cairo-gl-surface.c | 145 +++++++++++++++++++++++++++---------------------- + 1 file changed, 80 insertions(+), 65 deletions(-) + +commit b028d287e6effe30833963f4df40db3846e7f4da +Author: Eric Anholt <eric@anholt.net> +Date: Fri Feb 5 07:25:04 2010 -0800 + + [gl] Make the VBO once at startup instead of recreating per glyphs/spans. + + This shaves 2% off of firefox-talos-gfx. + + src/cairo-gl-glyphs.c | 10 ++-------- + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 8 +++----- + 3 files changed, 6 insertions(+), 13 deletions(-) + +commit 696a715702ed18bbe3f7d8b97654a055fa37444e +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 21:34:24 2010 -0800 + + [gl] Add radial gradients acceleration. + + This is significantly cribbed from Zach Laine's work, but reworked so + that gradients can be plugged in as either source or mask operands for + any of the paths. + + src/cairo-gl-private.h | 13 +++++ + src/cairo-gl-shaders.c | 77 +++++++++++++++++++++++++++-- + src/cairo-gl-surface.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 216 insertions(+), 3 deletions(-) + +commit 297b0ab47fa63ef99e65b6834b731c260ea3e941 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 4 23:57:43 2010 -0800 + + [gl] When making a boilerplate GLX window, ensure it has alpha. + + cairo_gl_surface_create_for_window assumes CONTENT_COLOR_ALPHA, so + make sure the fbconfig we choose is good enough. Fixes gl-window + testcase results to basically match the non-window testcases. + + boilerplate/cairo-boilerplate-gl.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 6708bc0593a649d083ede429ae73f06691edc018 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 4 23:47:33 2010 -0800 + + [gl] When filling a gradient texture, multiply alpha after interpolating. + + Fixes gradient-alpha testcase. + + src/cairo-gl-surface.c | 20 +++++++++----------- + 1 file changed, 9 insertions(+), 11 deletions(-) + +commit e426cdd56973ff1114dac5e8b1130180d43631b0 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 16:03:52 2010 -0800 + + [gl] Implement linear gradients acceleration. + + This is significantly cribbed from Zach Laine's work, but reworked so + that gradients can be plugged in as either source or mask operands for + any of the paths. + + This cuts the runtime of firefox-talos-svg in half on my GM45, at the + expense of gradient-alpha. surface-pattern-operator also now fails + due to small rasterization differences. + + src/cairo-gl-glyphs.c | 1 + + src/cairo-gl-private.h | 11 ++++ + src/cairo-gl-shaders.c | 39 ++++++++++++-- + src/cairo-gl-surface.c | 139 +++++++++++++++++++++++++++++++++++++++++++++---- + 4 files changed, 176 insertions(+), 14 deletions(-) + +commit 05b18fc09af0e0887c652bd482d68f00bec6d4d7 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 4 00:12:58 2010 -0800 + + [gl] Fix create_gradient_texture to premultiply alpha. + + src/cairo-gl-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 31e706454b7f0fa510047f582250a7a2db24dd31 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 15:48:40 2010 -0800 + + [gl] Pull the gradient operand setup out to its own function. + + Hopefully this clarifies what's going on, including the fallthrough to + texture setup on failure. + + src/cairo-gl-surface.c | 77 ++++++++++++++++++++++++++++---------------------- + 1 file changed, 43 insertions(+), 34 deletions(-) + +commit 745f263c1c2d263f7c5e78964bf7181f650301cc +Author: T. Zachary Laine <whatwasthataddress@gmail.com> +Date: Wed Feb 3 15:38:02 2010 -0800 + + [gl] Add function for creating a 1D texture to use for gradient lookups. + + Rather than have fragment shaders try to walk a variable-length set of + stops and try to compute the interpolation between the nearest stops + per fragment, we make a little texture representing the gradient along + a line and have the shaders compute texture coordinates along the line + and sample. This should be a good tradeoff between CPU work and GPU + work. + + [anholt: I pulled this set of code out of Zach Laine's tree to use for + gradient acceleration, and wanted to make sure attribution was + appropriate. I applied only minor tweaking] + + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 118 insertions(+) + +commit 88c8304e9072e5a46890a0eb32fcdbc857eb1a12 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 17:06:45 2010 -0800 + + [gl] Sanity check the sampler uniform binding. + + src/cairo-gl-shaders.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 42597170f2303475bb0507f4c6e948eead28c7bd +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 16:55:45 2010 -0800 + + [gl] Convert the spans code to using GLSL when available. + + src/cairo-gl-private.h | 1 + + src/cairo-gl-shaders.c | 35 ++++++++++++++++++++++++++++++--- + src/cairo-gl-surface.c | 52 +++++++++++++++++++++++++++++++------------------- + 3 files changed, 65 insertions(+), 23 deletions(-) + +commit 8d16fb10ea9940c0c9f311ff08c51d572c068c17 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 15:31:57 2010 -0800 + + [gl] Test for required EXT_bgra and explain what it's used for. + + src/cairo-gl-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit b2d8c9cbf2faec570450d163da140c54e64bbdc8 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 15:25:47 2010 -0800 + + [gl] Use the shader source choice from operand setup instead of DIY. + + src/cairo-gl-glyphs.c | 15 +-------------- + 1 file changed, 1 insertion(+), 14 deletions(-) + +commit 0fceac4d52d4b574b9c1f911b83d15dc7e01691d +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 12:24:41 2010 -0800 + + [gl] Move the component alpha composite to using GLSL when available. + + src/cairo-gl-surface.c | 165 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 108 insertions(+), 57 deletions(-) + +commit 8357336ed7be91ad359d205b1f223486d13215f2 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 11:54:24 2010 -0800 + + [gl] Move normal composites to using GLSL when available. + + src/cairo-gl-private.h | 2 ++ + src/cairo-gl-surface.c | 55 ++++++++++++++++++++++++++++++++++++-------------- + 2 files changed, 42 insertions(+), 15 deletions(-) + +commit 106bc158bafa4eecfd7f79422fc19d267c20dcdb +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 3 15:15:02 2010 -0800 + + [gl] Move the glyphs shader construction to a more general location. + + src/cairo-gl-glyphs.c | 213 ++++++++++--------------------------------------- + src/cairo-gl-private.h | 48 +++++++---- + src/cairo-gl-shaders.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 273 insertions(+), 188 deletions(-) + +commit f475351f75a3ec079628a2eb2643ebc09f0e5cc8 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 2 19:23:17 2010 -0800 + + [gl] Use GLSL when available for glyph rendering. + + This reduces the CPU work in translating fixed function state to + shaders, but currently is a slight cost on GM45 because we end up + changing shaders more frequently since other parts of the pipeline are + doing fixed function still. + + src/cairo-gl-glyphs.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++--- + src/cairo-gl-private.h | 19 +++++ + src/cairo-gl-shaders.c | 10 ++- + src/cairo-gl-surface.c | 56 +++++++++------ + 4 files changed, 239 insertions(+), 35 deletions(-) + +commit 672973caa0c3877b3b9f1c5f5966449ce0d7e239 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 2 11:17:43 2010 -0800 + + [gl] Convert fill_rectangles to the new GLSL core/arb wrapper. + + src/cairo-gl-private.h | 12 +++--- + src/cairo-gl-shaders.c | 106 +++++++++++-------------------------------------- + src/cairo-gl-surface.c | 39 +++++++++--------- + 3 files changed, 48 insertions(+), 109 deletions(-) + +commit 416273db34a715a6fa180f52ddfd11b82b6e8b6c +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 2 10:37:42 2010 -0800 + + [gl] Cut out the abstraction of GL_VERTEX_SHADER vs GL_VERTEX_SHADER_ARB. + + They're the same number, so just use the core 2.0 name. + + src/cairo-gl-shaders.c | 38 ++------------------------------------ + 1 file changed, 2 insertions(+), 36 deletions(-) + +commit 48a5a6eefc923db47c35ad7da3b635d205736716 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 2 10:36:16 2010 -0800 + + [gl] Avoid macro obfuscation of the shader impl structures. + + src/cairo-gl-shaders.c | 52 ++++++++++++++++++++++++++++++-------------------- + 1 file changed, 31 insertions(+), 21 deletions(-) + +commit 25ccc5dcb036554430b66fb1bf5f74766daa5612 +Author: Zach Laine <whatwasthataddress@gmail.com> +Date: Thu Jan 14 11:49:04 2010 -0600 + + [gl] Add shader support code for GL versions < 3.0. + + Adds cairo_gl_shader_program_t, and functions to manipulate same. Multiple GL + entry points for shaders are provided -- one for the pre-GL 2.0 extenstions + entry points, and one for GL 2.0. This code is well tested, but currently + unused in the GL backend. + + src/cairo-gl-private.h | 49 ++++ + src/cairo-gl-shaders.c | 623 ++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 671 insertions(+), 1 deletion(-) + +commit a6897ad3867611bd74f8ab7de4b1e8d8d1c12c71 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Feb 2 11:24:36 2010 -0800 + + [gl] Check for GLSL support once at context init instead of per draw. + + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 11 ++++++++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit b1829a47bff2b03a850d4049f228d2a41e14d6bd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Feb 3 11:19:26 2010 +0100 + + [quartz] Unbreak mask fallback path + + _cairo_quartz_surface_paint will never fail as it falls back to image + when CoreGraphics can't handle the requested operation. This means that + upon fallback the ClipImage set by the masking code gets ignored, thus + the mask fallback path is broken. Using the _cg function ensures that + masking is either completely done by CoreGraphics, or the fallback path + passes the mask operation to image. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 597dd24ddcc763281c82790b7677e54dc2db8f92 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 3 08:53:44 2010 +0000 + + drm/i915: Free potential leak of cloned textures. + + src/drm/cairo-drm-i915-shader.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 913a31494ec4bd000dfa303e362d8273b6857cfe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 17:49:09 2010 +0000 + + drm/i915: Increase batch buffer space. + + src/drm/cairo-drm-i915-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1315323b20398c7c4efa68e4e1c7f6fd6c1d8d91 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 17:38:06 2010 +0000 + + drm/i915: check for batch buffer overflow. + + Oops, the check for sufficient batch space mysteriously disappeared + during the rearrangement. + + src/drm/cairo-drm-i915-private.h | 3 --- + src/drm/cairo-drm-i915-shader.c | 44 ++++++++++++++++++++++++++++++++++++++++ + src/drm/cairo-drm-i915-surface.c | 35 -------------------------------- + 3 files changed, 44 insertions(+), 38 deletions(-) + +commit e2be50c722347734801468d7d9568a18dbbaaa17 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 29 12:06:13 2010 +0100 + + [quartz] Fix UNSUPPORTED operations + + The fallback path shouldn't be used anymore, thus fallbacks are now + handled by passing unsupported ops to the image backend. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-quartz-surface.c | 234 ++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 198 insertions(+), 36 deletions(-) + +commit 3e69c38fe642be467fee0cad166b83006741d55c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 24 21:59:32 2010 +0100 + + [quartz] Fix surface to CGImage conversion + + Snapshotting a surface doesn't produce a cairo_image_surface_t. + Acquiring (and later releasing) the surface is needed to access + its image data. + + src/cairo-quartz-surface.c | 75 +++++++++++++++++++++++----------------------- + 1 file changed, 38 insertions(+), 37 deletions(-) + +commit 7aba47e9d87bf09a5fa7e41a3c76c775f28b08f3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 25 15:09:51 2010 +0100 + + [quartz] Silence compiler warnings + + src/cairo-quartz-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit e9b07d194630f3f5e31eef3606f8e4c188a01d5f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:28:30 2010 +0000 + + drm/i915: Don't tile page sized bo. + + Minor tweak from < to <= so that a page sized bo is also not tiled for + those 32x32 pixmaps... + + src/drm/cairo-drm-i915-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70ca9dd170ce1cf8941311ec1f3dc117aef141b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:28:09 2010 +0000 + + drm/i915: Pass the correct length to dump the batchbuffer. + + src/drm/cairo-drm-i915-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3266a1a72be9c0a6b6c0014c4b64098507b6d385 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:27:52 2010 +0000 + + drm: Handle absence of PCI_ID + + src/drm/cairo-drm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1ecefc53a1d370d9fffb323952dcabeef5b872c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:26:54 2010 +0000 + + pattern: Zero-length gradients are not necessary empty + + Fixes: test/linear-step-function + + If the extend mode is unbounded, then the gradient is also unbound. + + src/cairo-pattern.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2a59220aa448cd7416f1851c4c62ca6ac396302d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:24:30 2010 +0000 + + test: Add linear-step-function + + Another bug identified by Jeff Muizelaar was that the bounds for a + zero-length (i.e. it started and stopped at the same point) were + miscomputed. This test case exercises that bug. + + Note: I believe the output is wrong here when padding a zero-length + gradient. On the left it should be red, and on the right it should be + blue. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/linear-step-function.c | 60 ++++++++++++++++++++++++++++++++++++ + test/linear-step-function.xfail.png | Bin 0 -> 116 bytes + 4 files changed, 62 insertions(+) + +commit 7b37ba8a49dca39a42b5395e0715d3d0a5a89972 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:17:13 2010 +0000 + + clip: Propagate all-clipped when copying + + Fixes test/clip-empty-save. + + The all-clipped flag was not being copied to the new clip, which occurs + for instance when an empty clip is pushed via a gstate save. + + src/cairo-clip.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 7dc464bb2bd64d1469b7b03afaf2191ee6d9e28b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 2 16:15:32 2010 +0000 + + test: Add clip-empty-save + + Jeff Muizelaar found a bug in _cairo_clip_init_copy() which was not + correctly propagating the all-clipped status when an empty clip was + saved in the gstate. This test case exercises that bug. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/clip-empty-save.c | 68 +++++++++++++++++++++++++++++++++++++++++++ + test/clip-empty-save.ref.png | Bin 0 -> 118 bytes + 4 files changed, 70 insertions(+) + +commit ab3dc7bb31f7f8b8c4d87c1ae62bd946b260c77e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 31 16:59:07 2010 +0000 + + csi-replay: compile fix + + util/cairo-script/csi-replay.c | 32 +++++++++++++++++++++----------- + 1 file changed, 21 insertions(+), 11 deletions(-) + +commit ab605214d151098ad153e8bf74ae0ca71a34c963 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Feb 1 09:27:16 2010 +0100 + + Partially revert "Improve stroking of densely dashed styles" + + This reverts commit 26e9f149063b9e1fdb54fc54fccbefdf04a68190 on + cairo-path-stroke. + The changes in cairo-path-stroke are not needed anymore since dash + pattern approximation is now done in gstate before passing the dash + pattern to the backend. + + src/cairo-path-stroke.c | 24 ++++++------------------ + 1 file changed, 6 insertions(+), 18 deletions(-) + +commit 8ffe0fc3825f0f6bc4d06607f6819ea8c2c2040b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 30 09:29:48 2010 +0100 + + Revert "[quartz] Approximate dense dashing patterns" + + This reverts commit 27701ed8447d4c21b7bf9709a2fc21690b3cdc96. + Approximation is now done in gstate. + + src/cairo-quartz-surface.c | 32 +++++++++++--------------------- + 1 file changed, 11 insertions(+), 21 deletions(-) + +commit 2e91648bcba06832dfa92bd742c32b2f5c1ad989 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 15 15:46:20 2010 +0100 + + Approximate dash patterns in gstate + + Since approximation is only done when the pattern is sub-tolerance, + it is acceptable to apply it even for vector backends. + By doing it once and for all backends, backends are guaranteed to have + non-degenerate input. + Acked-by: Adrian Johnson <ajohnson@redneon.com> + + src/cairo-gstate.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 67f666896cbfd0ac2728c7aa1325a7d0b2c8282d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 24 22:17:18 2010 +0100 + + Improve comments style consistency + + Each line of a multi-line comment should begin with '*'. + + src/cairo-stroke-style.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 45c795a1820e0317b123e7782cefed6ade8996d7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 15 10:44:58 2010 +0100 + + Improve dash pattern approximation + + Dash pattern approximation was taking the caps style into account + only for coverage computation, but not when computing the new + pattern, thus the computed approximation had a higher coverage if + the caps style was SQUARE or ROUND. + + Reviewed-by: M. Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-stroke-style.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 54 insertions(+), 2 deletions(-) + +commit 8d7841048b079ce2a582ff17c90e82e0081e5f42 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 17 19:00:47 2010 +0100 + + Round caps coverage extimate explanation + + Comment on how the round caps coverage has been computed, explaining + the complete procedure. The comments doesn't contain intermediate + (verbose and ugly) results, but when executed in a symbolic math + program (sage, for example) computes the expected results. + + Reviewed-by: M. Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-stroke-style.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 8558cd579059974758bda696c33f08399267d33e +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 28 17:39:34 2010 -0800 + + [gl] Use GL_MESA_pack_invert to flip get_image of windows around. + + This doesn't have any fallback for a GL that fails to implement the + extension. Fixes 120 testcases for gl-window. + + src/cairo-gl-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 11a120fb8477910f5ac63dc1ebde45c276764783 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 29 14:21:06 2010 +0100 + + Silence autoconf on Mac OS X + + Autoconf was complaining that AC_COMPILE_IFELSE and AC_RUN_IFELSE + were called before AC_GNU_SOURCE. Moving AC_GNU_SOURCE right after + AC_INIT solves this. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 05d4f9b461749f129b17cc97d6e3e6b49fe8e8d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 29 11:30:49 2010 +0000 + + xlib: Compile fix for no fontconfig + + src/cairo-xlib-screen.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e3e74641450481e7ad393bbc6fd1a7428be53de1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 29 11:22:26 2010 +0000 + + atomic: Fix up compile on PPC with libatomic-ops + + src/cairo-atomic-private.h | 2 -- + src/cairo-atomic.c | 3 ++- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit e11d2d0b4d646757fcba11631b6db169e2c183b0 +Author: Alexander Shulgin <alex.shulgin@gmail.com> +Date: Fri Jan 29 09:17:01 2010 +0000 + + surface: Fix detach mime-data after ecda633f887a10da650b4cd3efb17c861a6f519f + + Hi, + + while browsing the git log I've noticed a small mistake in the above + commit, where we reversed the order of init/fini required to reset the + mime-data array. + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5f0a0088af784157d8efe149ed073c8fa010e648 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 28 13:23:39 2010 +0000 + + drm-intel: Unmap a full glyph cache. + + When we swap a full glyph cache for a fresh one, be sure to unmap the + old one prior to release. + + src/drm/cairo-drm-i915-glyphs.c | 2 +- + src/drm/cairo-drm-intel.c | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 78cd9471200c69c8b3737e859260f4552145d958 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 23:45:17 2010 +0000 + + drm: Paranoid assert that the fallback is released upon finish. + + src/drm/cairo-drm-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5aa1191204e3eed6e3e97e23f37a52bbdfffcbce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 23:42:26 2010 +0000 + + drm-intel: flush in memory modifications to texture. + + If the surface was written to using a fallback, and so is mapped, we + need to flush those modifications by relinquishing the map. So the next + time the application tries to write to the surface, those writes are + correctly serialised with our reads. + + src/drm/cairo-drm-i915-shader.c | 14 ++++++++++++++ + src/drm/cairo-drm-i965-shader.c | 12 ++++++++++++ + 2 files changed, 26 insertions(+) + +commit a38accb694452fc5dfac63535648656885cd47eb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 23:27:46 2010 +0000 + + drm-intel: The accumulation bo may be NULL, beware. + + If we are not accumulating but rendering directly to the output vbo, + then the tail bo may not even be allocated, let alone mapped. + + src/drm/cairo-drm-i915-spans.c | 2 +- + src/drm/cairo-drm-i965-glyphs.c | 2 +- + src/drm/cairo-drm-i965-spans.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 44734b9d3ba60fb45abb0268a916e40cd688ef6a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 23:17:44 2010 +0000 + + drm-intel: Assert that the bo is unmapped upon release. + + Check through error paths to catch a few more places where the mapped bo + may have been leaked, and add an assert to abort in case we do leak a + mapping. + + src/drm/cairo-drm-i915-spans.c | 3 +++ + src/drm/cairo-drm-i965-glyphs.c | 4 ++++ + src/drm/cairo-drm-i965-spans.c | 3 +++ + src/drm/cairo-drm-intel.c | 6 +++++- + 4 files changed, 15 insertions(+), 1 deletion(-) + +commit 6848c7c850aa0a710c1409d1fc2cb441d02a2b28 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 23:01:37 2010 +0000 + + drm-i915: Don't tile temporary image textures. + + As uploading to a tiled buffer is much slower than linear memory, don't + unless we expect to reuse the texture. This is not true for sub-image + clones, which are single shot affairs. + + src/drm/cairo-drm-i915-shader.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f75b7c4c110e880f4bdd578d9180f9afbb1d0034 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 19:20:57 2010 +0000 + + drm/i915: Ensure surface is initialized. + + Let's try that again, this time remembering to place it on the + conjunction of the two branches, so *both* paths are initialized. + + src/drm/cairo-drm-i915-shader.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 02f20458d1dd48fc4589734fc4b3e0c8bea1ce5c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 19:02:21 2010 +0000 + + drm-i915: Ensure surface size for clone is initialized. + + If the surface had a snapshot, then we would have not initialized the + surface size and so compute a bogus normalization matrix. + + src/drm/cairo-drm-i915-shader.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit c82ff8cbcf27dc20d2b44a988eed1b676d996e8c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 27 18:48:32 2010 +0000 + + configure: Enable AC_SYS_LARGEFILE for drm + + drm makes use of 64bit offsets when mmaping, and so we require the + 64bit file interfaces. I had presumed that it would be pulled in with + AC_GNU_SOURCE, but no. + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 6d2d338ac04b02200e009c9e97d3ce030d07eb6f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 22:47:10 2010 +0000 + + drm: compile fix for cairo_always_inline + + s/always_inline/cairo_always_inline/ + + src/drm/cairo-drm-i965-private.h | 8 +-- + src/drm/cairo-drm-intel-brw-eu.h | 132 +++++++++++++++++++------------------- + src/drm/cairo-drm-intel-private.h | 2 +- + src/drm/cairo-drm-private.h | 2 +- + 4 files changed, 72 insertions(+), 72 deletions(-) + +commit 58980b4ad60a60923a59370c81d59bb0457a7922 +Author: Benjamin Otte <otte@redhat.com> +Date: Wed Jan 27 09:56:14 2010 +0100 + + build: Remove glitz surface + + glitz is unmaintained and the GL surface is far superior anyway. + + README | 8 +- + boilerplate/Makefile.am | 13 - + boilerplate/Makefile.sources | 5 - + boilerplate/Makefile.win32.features | 10 - + boilerplate/cairo-boilerplate-glitz-agl.c | 191 --- + boilerplate/cairo-boilerplate-glitz-glx.c | 265 ---- + boilerplate/cairo-boilerplate-glitz-wgl.c | 188 --- + build/Makefile.win32.features | 1 - + build/Makefile.win32.features-h | 3 - + build/configure.ac.features | 1 - + configure.ac | 38 - + doc/public/cairo-docs.xml | 1 - + doc/public/cairo-sections.txt | 1 - + doc/public/tmpl/cairo-glitz.sgml | 22 - + src/Makefile.sources | 4 - + src/Makefile.win32.features | 14 - + src/cairo-deprecated.h | 1 - + src/cairo-glitz-private.h | 41 - + src/cairo-glitz-surface.c | 2450 ----------------------------- + src/cairo-glitz.h | 57 - + test/Makefile.am | 8 - + test/Makefile.sources | 2 - + test/glitz-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/glitz-surface-source.c | 293 ---- + test/glitz-surface-source.ps2.ref.png | Bin 376 -> 0 bytes + test/glitz-surface-source.ps3.ref.png | Bin 376 -> 0 bytes + test/glitz-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + util/cairo.modules | 10 +- + 28 files changed, 3 insertions(+), 3624 deletions(-) + +commit 17ddb1598b3df374b6275d907441f34318b4257f +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jan 25 20:17:12 2010 +0100 + + docs: appease make check + + src/cairo-gl-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bac513a85dc8ef2915b2e60d034cf3dbc82a8e0c +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jan 25 20:05:56 2010 +0100 + + build: Fix pthread detection + + THe pthread.h detection code didn't pass -lpthread or -pthread to Cairo. + + configure.ac | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 582604f7b6b5b2ab6e681245bc7cde64d4995307 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jan 25 19:22:33 2010 +0100 + + [png] Simplify coercion code + + Call _cairo_image_surface_coerce() unconditionally to ensure coercion to + one of the standard formats happens even when it's a format we support. + + src/cairo-png.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +commit 002e02715cac9a285fd97e1bb6b068ceebfae3d8 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Jan 25 19:42:54 2010 +0100 + + Remove useless pixman version checks + + We require pixman >= 0.15.16 in configure.ac, so checks for older + versions aren't required anymore. + + src/cairo-gl-surface.c | 2 -- + src/cairo-image-surface.c | 10 ++-------- + 2 files changed, 2 insertions(+), 10 deletions(-) + +commit 5a690ad4acb3687c45c201b3ce92cd3e41bf3b30 +Author: Benjamin Otte <otte@gnome.org> +Date: Fri Jan 15 13:44:04 2010 +0100 + + Give cairo_surface_mark_dirty() the slim hidden treatment + + Fixes test suite failure + + src/cairo-surface.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit 571ab1007571cb8d78fcb5206b43d6b964aa0df1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 18:22:03 2010 +0000 + + xcb: Fix linking with xcb-drm + + src/cairo-xcb-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ecda633f887a10da650b4cd3efb17c861a6f519f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 18:17:28 2010 +0000 + + mime-data: Detach existing alternate representations upon modification + + A major sore point in the current mime-data API is the choice to keep + the alternate mime-data representations after the user has actually + modifying the primary representation (i.e. has made it a target of a + cairo_t and drawn to it). This has been rightly chastised as unexpected + behaviour, and given that we already have the mechanism to detach + snapshots upon modification, there is no reason not to behave as + expected. + + src/cairo-surface.c | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 123bdb086ad9c5725a51791458d31309c69a3f41 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 16:45:03 2010 +0000 + + xcb: Make shm optional + + Trying to build xcb on a system without SHM wrapped by xcb. The right + answer would be to build libxcb-shm. The quick answer is to compile out + shm support. + + boilerplate/Makefile.win32.features | 10 ++++++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + build/configure.ac.features | 1 + + configure.ac | 14 +++++++++++++- + src/Makefile.sources | 8 ++++++-- + src/Makefile.win32.features | 14 ++++++++++++++ + src/cairo-xcb-connection.c | 22 ++++++++++++++++++---- + src/cairo-xcb-private.h | 21 +++++++++++++++++++++ + src/cairo-xcb-surface-core.c | 2 ++ + src/cairo-xcb-surface-render.c | 2 ++ + src/cairo-xcb-surface.c | 14 ++++++++++++++ + 12 files changed, 105 insertions(+), 7 deletions(-) + +commit e1b3330376c173633e146eb6cf578592d424e4d5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 14:48:44 2010 +0000 + + configure: dri2 is only required for xcb-drm + + Move the optional dependency on dri2 to the xcb-drm integration where it + is required. + + configure.ac | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 8151c72307e8cb369fbb524de56f87f805efff2b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 12:14:39 2010 +0000 + + xcb: compile errors with lockdep + + After moving the mutex to the superclass, I forgot to update the + references from the lockdep asserts. + + src/cairo-xcb-connection.c | 6 +++--- + src/cairo-xcb-screen.c | 16 ++++++++-------- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit be81d656c53c76032fd3fe11c81402d17ec56327 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 11:54:24 2010 +0000 + + clip: Create a fallback clip surface + + If the destination cannot support a clip surface, then we will need to + use an intermediate image surface and trigger fallbacks upon use. + + src/cairo-clip.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c453d8ab704e5f41cb010241efe9bcb9ff886024 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 11:45:01 2010 +0000 + + test: Erroneous ref image for big-line xlib-fallback. + + test/big-line.xlib-fallback.ref.png | Bin 723 -> 0 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 180aea76adbb6d5c5909652b7a8cafb7a693e982 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 25 20:48:02 2010 +1030 + + Fix printing of rotated user fonts + + b7550bf0 introduced a regression when user fonts are rendered to a + rotated context. + + src/cairo-type3-glyph-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit abcb9d2c39178620b1847fe6ea6e144602464ecc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 09:35:09 2010 +0000 + + image: Prevent deref of NULL clip_region + + Another stray from surface-fallback, spotted by Carlos: + + *INT_cairo_region_get_extents (region=0x0, extents=0xbfffce90) at + cairo-region.c:385 + 385 if (region->status) { + (gdb) bt + 0 *INT_cairo_region_get_extents (region=0x0, extents=0xbfffce90) at + cairo-region.c:385 + 1 0x0013ba46 in _cairo_image_surface_composite_trapezoids + (op=CAIRO_OPERATOR_OVER, pattern=0xbfffdda8, abstract_dst=0x837de10, + antialias=CAIRO_ANTIALIAS_DEFAULT, src_x=486, src_y=45, dst_x=0, + dst_y=0, width=15, height=25, traps=0x837f100, num_traps=30, + clip_region=0x0) + at cairo-image-surface.c:4102 + 2 0x0015d846 in _cairo_surface_composite_trapezoids + (op=CAIRO_OPERATOR_OVER, pattern=0xbfffdda8, dst=0x837de10, + antialias=CAIRO_ANTIALIAS_DEFAULT, + src_x=486, src_y=45, dst_x=0, dst_y=0, width=15, height=25, + traps=0x837f100, num_traps=30, clip_region=0x0) at cairo-surface.c:2125 + 3 0x001607ce in _cairo_surface_fallback_composite_trapezoids + (op=CAIRO_OPERATOR_OVER, pattern=0xbfffdda8, dst=0x837db00, + antialias=CAIRO_ANTIALIAS_DEFAULT, src_x=486, src_y=45, dst_x=486, + dst_y=45, width=15, height=25, traps=0x837fd78, num_traps=30, + clip_region=0x0) + at cairo-surface-fallback.c:1641 + 4 0x0015d8a4 in _cairo_surface_composite_trapezoids + (op=CAIRO_OPERATOR_OVER, pattern=0xbfffdda8, dst=0x837db00, + antialias=CAIRO_ANTIALIAS_DEFAULT, + src_x=486, src_y=45, dst_x=486, dst_y=45, width=15, height=25, + traps=0x837fd78, num_traps=30, clip_region=0x0) at cairo-surface.c:2137 + 5 0x001623b0 in _composite_traps_draw_func (closure=0xbfffd350, + op=CAIRO_OPERATOR_OVER, src=0xbfffdda8, dst=0x837db00, dst_x=0, dst_y=0, + extents=0xbfffdc78, clip_region=0x0) at cairo-surface-fallback.c:546 + 6 0x00161234 in _clip_and_composite (clip=0x0, op=<value optimized + out>, src=0xbfffdda8, draw_func=0x162310 <_composite_traps_draw_func>, + draw_closure=0xbfffd350, dst=0x837db00, extents=0xbfffdc78) at + cairo-surface-fallback.c:463 + 7 0x0016205b in _clip_and_composite_trapezoids (src=<value optimized + out>, op=CAIRO_OPERATOR_OVER, dst=0x837db00, traps=0xbfffd7bc, + antialias=CAIRO_ANTIALIAS_DEFAULT, clip=0x0, extents=0xbfffdc78) at + cairo-surface-fallback.c:853 + 8 0x001626ef in _cairo_surface_fallback_stroke (surface=0x837db00, + op=CAIRO_OPERATOR_OVER, source=0xbfffdda8, path=0x1b164c, + stroke_style=0x1b1524, + ctm=0x1b15b0, ctm_inverse=0x1b15e0, tolerance=0.10000000000000001, + antialias=CAIRO_ANTIALIAS_DEFAULT, clip=0x0) at + cairo-surface-fallback.c:1173 + 9 0x0015f2f4 in _cairo_surface_stroke (surface=0x837db00, + op=CAIRO_OPERATOR_OVER, source=0xbfffdda8, path=0x1b164c, + stroke_style=0x1b1524, ctm=0x1b15b0, + ctm_inverse=0x1b15e0, tolerance=0.10000000000000001, + antialias=CAIRO_ANTIALIAS_DEFAULT, clip=0xbfffde88) at + cairo-surface.c:2041 + 10 0x00134629 in _cairo_gstate_stroke (gstate=0x1b1514, path=0x1b164c) + at cairo-gstate.c:1133 + 11 0x0012a706 in *INT_cairo_stroke_preserve (cr=0x1b13c0) at + cairo.c:2234 + 12 0x0012a732 in *INT_cairo_stroke (cr=0x1b13c0) at cairo.c:2207 + + src/cairo-image-surface.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 38ba696c483c289c2522b124ca628ef602c12126 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 09:20:11 2010 +0000 + + surface-fallback: We no longer own a reference to the clip surface + + _cairo_clip_get_surface() now returns a borrowed reference to the cached + surface on the clip, so we must not destroy it - as Carlos pointed out + when he hit the assert: + + 12:55 < KaL> ickle: cairo-surface.c:595: cairo_surface_destroy: + Assertion `((*&(&surface->ref_count)->ref_count) > 0)' failed. + 12:56 < KaL> ickle: trying to render any pdf file with poppler glib demo + after installing cairo from git master + 13:00 < KaL> ickle: well, it seems it has nothing ot do with poppler, + since it crashes in clearlooks src/clearlooks_draw.c:347 + + src/cairo-surface-fallback.c | 3 --- + 1 file changed, 3 deletions(-) + +commit b3ba610ec05f863a0830a1f30ed130649fbadfbb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 25 09:09:18 2010 +0000 + + win32: Trivially fix the compile error with printing. + + _cairo_pattern_is_opaque() now takes the extents over which the + operation is defined so that we make exclude the clear pixels that + surround EXTEND_NONE surfaces when determining opacity. In order to take + full advantage of this we need to start performing an extents query on + the operation and pass that down to the analysis... + + This patch however is just the quick compile fix to pass a NULL and + restore the old behaviour. + + Fixes (with previous commit): + Bug 26197 - Cairo doesn't build on windows + http://bugs.freedesktop.org/show_bug.cgi?id=26197 + + src/cairo-win32-printing-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 386ca53f280652983870316593e510cfef59c559 +Author: Haakon Sporsheim <haakon.sporsheim@gmail.com> +Date: Sun Jan 24 16:43:42 2010 +0100 + + win32: Compile fix, rename render_row to render_rows. + + src/cairo-win32-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a9a73e5df42840148fd4db60cc0d1ba5d137b764 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 24 23:26:28 2010 +0100 + + Constrain subsurface creation + + Force the subsurface extents to be inside the target extents and + compose subsubsurfaces offsets correctly. + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface.c | 36 +++++++++++++++--------------------- + 1 file changed, 15 insertions(+), 21 deletions(-) + +commit b7550bf0f1cafb5cc5df13da50b0cec80313038f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 24 22:23:26 2010 +1030 + + Fix incorrect font scale and glyph position in Type 3 fonts + + The PDF file referenced by bug 26186 contains a Type 3 font with non + identity font matrix and a "1/2" glyph created by drawing the "1" and + "2" from a Type 1 font. This combination exposed a bug in the font + scale and glyph position in _cairo_type3_glyph_surface_show_glyphs + when printing user font glyphs. + + src/cairo-type3-glyph-surface.c | 21 +++++---------------- + 1 file changed, 5 insertions(+), 16 deletions(-) + +commit ea7fda442c169a159b2e3c51894a0f5e70a13984 +Author: Eric Anholt <eric@anholt.net> +Date: Fri Jan 22 16:26:38 2010 -0800 + + [gl] Release the context acquired in surface_create. + + Fixes assertion failures in many testcases since + cf9ea9f2f0ea1e1b42dc1507ed0dac4dfbf5d387 + + src/cairo-gl-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 20990365f3885457d66b4a8bef865f027a98333f +Author: Eric Anholt <eric@anholt.net> +Date: Fri Jan 22 16:13:02 2010 -0800 + + [gl] Emit rectanges a whole primitive at a time. + + Since the spans rework, we were emitting half a primitive at a time, + and if we flushed our VBO full of quads out halfway through, we could + end up dropping the primitive and then out of phase. + + src/cairo-gl-surface.c | 25 +++++++++++-------------- + 1 file changed, 11 insertions(+), 14 deletions(-) + +commit c8a61a3267ffd53d4b4d61e2e2bcb70448ea4d41 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 23 18:25:11 2010 +0100 + + Fix compilation on MacOS X + + Some functions declared in MacOS X headers use the always_inline + attribute, thus defining it to be a different expression breaks the + build. + + src/cairo-botor-scan-converter.c | 8 ++++---- + src/cairo-compiler-private.h | 4 ++-- + src/cairo-gl-private.h | 4 ++-- + 3 files changed, 8 insertions(+), 8 deletions(-) + +commit 90ba1242b61e7b8e5ae2c2ca028d0058f6dabd88 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 23 18:13:35 2010 +0100 + + Fix image backend compilation + + When HAS_ATOMIC_OPS is not defined, cairo-image-surface.c does not + compile because _pixman_white_image calls _pixman_image_for_solid + which gets defined only later in the code. + + src/cairo-image-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2a466ba07072cb394cfc955cfb0633b0cc278044 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 22:26:52 2010 +0000 + + script: Encode octal values correctly. + + Oops, we were emitting the octal numerals in reverse order. + + src/cairo-script-surface.c | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +commit 87529198aa37f5eb5943eb80cc1aae858fdaadd0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 22:21:44 2010 +0000 + + scaled-font: Mark an error site with _cairo_error() + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6544f3b25d2120b7bd04f6c956c2ea7b9c101c76 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 22:15:25 2010 +0000 + + ps: Wean off the low-level image composite interface + + The low-level surface composite interface will disappear in the near + future and results in much more ugly code than calling the high level + interface - so use it when flattening images into the page background. + + src/cairo-ps-surface.c | 77 ++++++++++++++++++-------------------------------- + 1 file changed, 27 insertions(+), 50 deletions(-) + +commit f57cb45fa9274351b36f96eb932a931493b5db94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 22:18:35 2010 +0000 + + ps: Arguments to fill_extents() were reversed. + + src/cairo-ps-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 58540405d9bc6581c1d07f17bd5aee330f06d4a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 22:05:37 2010 +0000 + + pdf: Arguments to fill_extents() were reversed. + + src/cairo-pdf-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 34dd80632e4671f0ca245be9db4280db62bdb1f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 21 18:39:26 2010 +0000 + + glew: Silence compiler. + + src/glew/GL/glew.h | 2 +- + src/glew/glew.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit cf9ea9f2f0ea1e1b42dc1507ed0dac4dfbf5d387 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 21 18:39:12 2010 +0000 + + gl: Acquire the context whilst creating surfaces. + + src/cairo-gl-private.h | 5 ++--- + src/cairo-gl-surface.c | 37 ++++++++++++++++++++++++------------- + 2 files changed, 26 insertions(+), 16 deletions(-) + +commit a7e05bd602e7f8bee63f5d32cb95d65628e6e715 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 21 18:22:04 2010 +0000 + + glew: Do not assume that UNIX == GLX + + src/glew/glew.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c0008242b0f162d8c7717009ba792ed61b2924d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 21:35:23 2010 +0000 + + misc: Only use custom lround() under DISABLE_SOME_FLOATING_POINT + + On my Core2, the library version of lround() is faster than our + hand-rolled non-floating point implementation. So only enable our code + if we are trying to minimise the number of floating point operations -- + even then, it would worth investigating the library performance first. + + [Just a reminder that optimisation choices will change over time as our + hardware and software evolves.] + + src/cairo-misc.c | 2 ++ + src/cairo-ps-surface.c | 4 ++-- + src/cairoint.h | 5 +++++ + 3 files changed, 9 insertions(+), 2 deletions(-) + +commit 1236c41072a7966eda7db48a381fd0508e5289be +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 21:26:26 2010 +0000 + + xcb: Refresh. + + Still an experimental backend, it's now a little too late to stabilise + for 1.10, but this should represent a major step forward in its feature + set and an attempt to catch up with all the bug fixes that have been + performed on xlib. Notably not tested yet (and expected to be broken) + are mixed-endian connections and low bitdepth servers (the dithering + support has not been copied over for instance). However, it seems robust + enough for daily use... + + Of particular note in this update is that the xcb surface is now capable + of subverting the xlib surface through the ./configure --enable-xlib-xcb + option. This replaces the xlib surface with a proxy that forwards all + operations to an equivalent xcb surface whilst preserving the cairo-xlib + API that is required for compatibility with the existing applications, + for instance GTK+ and Mozilla. Also you can experiment with enabling a + DRM bypass, though you need to be extremely foolhardy to do so. + + boilerplate/Makefile.win32.features | 20 + + boilerplate/cairo-boilerplate-xcb.c | 522 +++- + build/Makefile.win32.features | 2 + + build/Makefile.win32.features-h | 6 + + build/configure.ac.features | 2 + + configure.ac | 26 +- + src/Makefile.sources | 22 +- + src/Makefile.win32.features | 28 + + src/cairo-list-private.h | 7 + + src/cairo-mutex-list-private.h | 4 + + src/cairo-pattern.c | 41 +- + src/cairo-xcb-connection-core.c | 482 ++++ + src/cairo-xcb-connection-render.c | 969 ++++++++ + src/cairo-xcb-connection-shm.c | 194 ++ + src/cairo-xcb-connection.c | 867 +++++++ + src/cairo-xcb-private.h | 760 ++++++ + src/cairo-xcb-screen.c | 518 ++++ + src/cairo-xcb-shm.c | 576 +++++ + src/cairo-xcb-surface-cairo.c | 94 + + src/cairo-xcb-surface-core.c | 613 +++++ + src/cairo-xcb-surface-private.h | 37 + + src/cairo-xcb-surface-render.c | 4471 +++++++++++++++++++++++++++++++++++ + src/cairo-xcb-surface.c | 3382 ++++++++------------------ + src/cairo-xcb-xrender.h | 63 - + src/cairo-xcb.h | 41 +- + src/cairo-xlib-xcb-surface.c | 515 ++++ + src/cairoint.h | 16 + + test/xcb-surface-source.c | 1 - + 28 files changed, 11708 insertions(+), 2571 deletions(-) + +commit 77afe8491ed7038a8399c01f10d8f062a7239225 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 20:48:54 2010 +0000 + + drm: Add backends for i915 and i965. + + As proof-of-principle add the nearly working demonstrations of using DRM + to render directly with the GPU bypassing both RENDER and GL for + performance whilst preserving high quality rendering. + + The basis behind developing these chip specific backends is that this is + the idealised interface that we desire for this chips, and so a target + for cairo-gl as we continue to develop both it and our GL stack. + + Note that this backends do not yet fully pass the test suite, so only + use if you are brave and willing to help develop them further. + + boilerplate/cairo-boilerplate-drm.c | 2 +- + src/Makefile.sources | 17 + + src/cairo-drm.h | 31 +- + src/cairo-misc.c | 57 + + src/cairoint.h | 2 + + src/drm/cairo-drm-bo.c | 13 +- + src/drm/cairo-drm-gallium-surface.c | 3 +- + src/drm/cairo-drm-i915-glyphs.c | 534 ++++++ + src/drm/cairo-drm-i915-private.h | 1169 ++++++++++++ + src/drm/cairo-drm-i915-shader.c | 2674 +++++++++++++++++++++++++++ + src/drm/cairo-drm-i915-spans.c | 708 +++++++ + src/drm/cairo-drm-i915-surface.c | 1996 ++++++++++++++++++++ + src/drm/cairo-drm-i965-glyphs.c | 500 +++++ + src/drm/cairo-drm-i965-private.h | 742 ++++++++ + src/drm/cairo-drm-i965-shader.c | 2852 +++++++++++++++++++++++++++++ + src/drm/cairo-drm-i965-spans.c | 408 +++++ + src/drm/cairo-drm-i965-surface.c | 1949 ++++++++++++++++++++ + src/drm/cairo-drm-intel-brw-defines.h | 824 +++++++++ + src/drm/cairo-drm-intel-brw-eu-emit.c | 1089 +++++++++++ + src/drm/cairo-drm-intel-brw-eu-util.c | 121 ++ + src/drm/cairo-drm-intel-brw-eu.c | 250 +++ + src/drm/cairo-drm-intel-brw-eu.h | 1043 +++++++++++ + src/drm/cairo-drm-intel-brw-structs.h | 1328 ++++++++++++++ + src/drm/cairo-drm-intel-command-private.h | 909 +++++++++ + src/drm/cairo-drm-intel-debug.c | 1208 ++++++++++++ + src/drm/cairo-drm-intel-ioctl-private.h | 417 +++++ + src/drm/cairo-drm-intel-private.h | 427 ++++- + src/drm/cairo-drm-intel-surface.c | 421 +++-- + src/drm/cairo-drm-intel.c | 1240 +++++++++---- + src/drm/cairo-drm-private.h | 101 +- + src/drm/cairo-drm-radeon-private.h | 3 - + src/drm/cairo-drm-radeon-surface.c | 281 +-- + src/drm/cairo-drm-radeon.c | 5 +- + src/drm/cairo-drm-surface.c | 235 +-- + src/drm/cairo-drm.c | 232 +-- + 35 files changed, 22675 insertions(+), 1116 deletions(-) + +commit b9407af6a4bc792c1bcb52c90aa8a618627bb618 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 17:57:41 2010 +0000 + + image: Implement high level interface. + + Write a dedicated compositor for pixman so that we avoid the + middle-layer syndrome of surface-fallback. The major upshot of this + rewrite is that the image surface is now several times quicker for glyph + compositing, which dramatically improves performance for text rendering + by firefox and friends. It also uses a couple of the new scan + convertors, such as the rectangular scan converter for rectilinear + paths. + + Speedups + ======== + image-rgba firefox-talos-gfx-0 342050.17 (342155.88 0.02%) -> 69412.44 (69702.90 0.21%): 4.93x speedup + ███▉ + image-rgba vim-0 97518.13 (97696.23 1.21%) -> 30712.63 (31238.65 0.85%): 3.18x speedup + ██■+ image-rgba evolution-0 69927.77 (110261.08 19.84%) -> 24430.05 (25368.85 1.89%): 2.86x speedup + █▉ + image-rgba poppler-0 41452.61 (41547.03 2.51%) -> 21195.52 (21656.85 1.08%): 1.96x speedup + █ + image-rgba firefox-planet-gnome-0 217512.61 (217636.80 0.06%) -> 123341.02 (123641.94 0.12%): 1.76x speedup + ▊ + image-rgba swfdec-youtube-0 41302.71 (41373.60 0.11%) -> 31343.93 (31488.87 0.23%): 1.32x speedup + ■+ image-rgba swfdec-giant-steps-0 20699.54 (20739.52 0.10%) -> 17360.19 (17375.51 0.04%): 1.19x speedup + ▎ + image-rgba gvim-0 167837.47 (168027.68 0.51%) -> 151105.94 (151635.85 0.18%): 1.11x speedup + ■+ image-rgba firefox-talos-svg-0 375273.43 (388250.94 1.60%) -> 356846.09 (370370.08 1.86%): 1.05x speedup + + src/cairo-image-surface.c | 3987 ++++++++++++++++++++++++----- + src/cairo-mutex-list-private.h | 2 + + src/cairo-xcb-surface.c | 10 +- + src/cairoint.h | 21 +- + test/clip-fill-unbounded.argb32.ref.png | Bin 1615 -> 1607 bytes + test/clip-fill-unbounded.rgb24.ref.png | Bin 1312 -> 1304 bytes + test/clip-stroke-unbounded.argb32.ref.png | Bin 1703 -> 1694 bytes + test/clip-stroke-unbounded.rgb24.ref.png | Bin 1383 -> 1372 bytes + test/clip-stroke.ref.png | Bin 1451 -> 1442 bytes + test/clipped-group.ref.png | Bin 289 -> 289 bytes + test/leaky-dashed-rectangle.ref.png | Bin 347 -> 357 bytes + test/scale-offset-image.xfail.png | Bin 9960 -> 9961 bytes + test/scale-offset-similar.xfail.png | Bin 9960 -> 9961 bytes + test/self-intersecting.ref.png | Bin 213 -> 168 bytes + 14 files changed, 3342 insertions(+), 678 deletions(-) + +commit ec7cc9dea16f94e1e56720be548cf5520ec4708b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 19:27:45 2010 +0000 + + ft: Tidy computation of transformed bitmap, and mark if CA + + Discard a redundant clear as the image surface is guaranteed to return + a cleared surface that meets pixman/xlib requirements for alignment, and + more importantly add the ComponentAlpha flag on the pixman image + generated as appropriate. + + src/cairo-ft-font.c | 31 +++++++++++-------------------- + 1 file changed, 11 insertions(+), 20 deletions(-) + +commit b713510f213d0a83cb0575d6870416a0f13786c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 17:56:26 2010 +0000 + + surface-fallback: Convert to composite rectangles + + src/cairo-surface-fallback.c | 396 ++++++++++++++----------------------------- + src/cairo-surface.c | 3 + + src/cairo-traps.c | 47 ++--- + src/cairoint.h | 3 +- + 4 files changed, 158 insertions(+), 291 deletions(-) + +commit 498c10032ea3f8631a928cd7df96766f2c8ddca4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:39:29 2010 +0000 + + clip: Implement clipping using only the high-level operators. + + Revamp clipping in preparation for the removal of the low-level interface + and promote backend to use the higher levels. The principle here is that + the higher level interface gives the backend more scope for choosing + better performing primitives. + + src/cairo-clip-private.h | 6 +- + src/cairo-clip.c | 257 +++++++++++++++++++++---------------------- + src/cairo-surface-fallback.c | 2 +- + 3 files changed, 131 insertions(+), 134 deletions(-) + +commit 05bb43a00770f17566c80f28faf684597d1b6afb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:14:53 2010 +0000 + + types: Move cairo_scaled_glyph_t to cairo-types-private.h + + Another step in bringing some sanity to our headers. + + src/cairo-types-private.h | 25 +++++++++++++++++++++++++ + src/cairoint.h | 26 -------------------------- + 2 files changed, 25 insertions(+), 26 deletions(-) + +commit 9c98656fb1ac10a6085c5db5731b6b986af26165 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:11:48 2010 +0000 + + color: Add enum value for the largest stock color. + + Useful if we wish to keep a cache of patterns for the very common stock + colors... + + src/cairo-color.c | 13 +++++++------ + src/cairo-types-private.h | 3 ++- + 2 files changed, 9 insertions(+), 7 deletions(-) + +commit b7b65b5315836297f86c54121ea45e469f514312 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:07:25 2010 +0000 + + stroke: Convert rectilinear paths to boxes. + + A quick and efficient method for extracting the set of boxes that + represent the path when stroked. + + src/cairo-path-stroke.c | 170 ++++++++++++++++++++++++++++++++++++++---------- + src/cairoint.h | 7 ++ + 2 files changed, 142 insertions(+), 35 deletions(-) + +commit fe6a7f4c9e69c86588eca4925a9d65f3086f98bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:02:07 2010 +0000 + + fill: Convert rectilinear paths to boxes. + + A quick and efficient method for extracting the set of boxes that + represent the path when filled. + + src/cairo-path-fill.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairoint.h | 5 ++++ + 2 files changed, 80 insertions(+), 1 deletion(-) + +commit 6b77567b6ef28710c7707ab82c7fa95c810152d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 15:54:45 2010 +0000 + + path: Compute coarse bounds upon construction. + + Frequently we only need the coarse path bounds, so avoid walking over + the list of points once more as we can cheaply track the extents during + construction. + + src/cairo-debug.c | 6 ++ + src/cairo-gstate.c | 21 ++++-- + src/cairo-path-bounds.c | 159 ++++++++++++++++++++--------------------- + src/cairo-path-fixed-private.h | 4 +- + src/cairo-path-fixed.c | 83 +++++++++++++++++++-- + src/cairo.c | 2 + + src/cairoint.h | 9 ++- + 7 files changed, 184 insertions(+), 100 deletions(-) + +commit 6bfcf3ea55964fee1c9b73818c3bb7cdacbc4f82 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 15:37:25 2010 +0000 + + matrix: Do not need to iteratively refine conversion for unity matrices. + + If the scale factors on the matrix are unity, then the conversion from a + cairo_matrix_t to a pixman_matrix_t is exact (within numerical + restrictions). + + src/cairo-matrix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 13c56800ca6c32a6d8251edec5d3976399b70ea4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:33:34 2010 +0000 + + gstate: Reduce operators + + Some operators may be equivalent to simpler operations, so make the + transformation in the gstate, before calling down into the surface + backends. + + src/cairo-gstate.c | 86 +++++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 72 insertions(+), 14 deletions(-) + +commit 4d52be39bf36a3557f4e7c61dba764b1c6542c8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:09:11 2010 +0000 + + gstate: Skip ops with a clear mask. + + As pointed out by Benjamin Otte, these are expensive no-ops that we can + trivially detect, just so long as we remember the semantics of extend + modes. + + src/cairo-gstate.c | 6 ++++++ + src/cairo-pattern.c | 23 +++++++++++++++++++++++ + src/cairoint.h | 3 +++ + 3 files changed, 32 insertions(+) + +commit c2ef45226d6801acb15854de55a5f5bc728ed65d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 14:33:53 2010 +0000 + + gstate: Check for an invalid matrix before cairo_transform() + + Similar to the other checks that will generate an invalid matrix prior + to performing the operation. + + src/cairo-gstate.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 22316a0c17cd3b49ec625814f4e737b3fdc6ca63 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 14:33:16 2010 +0000 + + gstate: White space. + + A couple of minor coding style violations. + + src/cairo-gstate.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 29bedde904824098f73b978d73d36b3b5420ac32 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 16:19:31 2010 +0000 + + pattern: Add convenience patterns for stock colours + + By preallocating in our data segment a couple of solid patterns for the + stock colours, it becomes more convenient when using those in surface + operations, such as when clearing. + + src/cairo-clip.c | 29 +++++++++++------------------ + src/cairo-gl-glyphs.c | 10 +++------- + src/cairo-gstate.c | 9 +++------ + src/cairo-pattern.c | 24 ++++++++++++++++++++++++ + src/cairo-scaled-font.c | 9 ++------- + src/cairo-surface-fallback.c | 14 +++----------- + src/cairo-vg-surface.c | 5 ++--- + src/cairo-win32-printing-surface.c | 8 ++------ + src/cairo-xcb-surface.c | 7 +------ + src/cairo-xlib-surface.c | 6 +----- + src/cairoint.h | 3 ++- + 11 files changed, 54 insertions(+), 70 deletions(-) + +commit 9eb98e1dc5af7eac896bf469e491063777e678be +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 14:14:51 2010 +0000 + + scaled-font: Use tight glyph bounds when determining overlap. + + An issue that we currently have is that we have a pessimistic + false-positive rate when determining whether glyphs within a string + overlap. By using the tight bounds, the overlap detection is arguably + less accurate presuming pixel-aligned opacity masks but we make the + trade-off for performance. + + src/cairo-scaled-font.c | 55 ++++++++++++++++++++++--------------------------- + 1 file changed, 25 insertions(+), 30 deletions(-) + +commit 005b0c4eb2a1fe2c4de31ebe2a3244bea8bd2625 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 19:47:58 2010 +0000 + + test: Add explicit device management to xlib-surface-source + + Mostly pedagogical example. + + test/xlib-surface-source.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ca02b51ef6d058b6fb492258177f0396a5819e26 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 21:57:58 2010 +0000 + + test: Add an xcb surface source test + + test/Makefile.am | 6 ++ + test/Makefile.sources | 3 + + test/xcb-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/xcb-surface-source.c | 145 +++++++++++++++++++++++++++++++++ + test/xcb-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + 5 files changed, 154 insertions(+) + +commit f0678fb70ceec5db1b7c3f0eb1c5603039daf307 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 22 19:02:39 2010 +0000 + + test: Tweak aligned of text-rotate + + Reset the rotation for every quadrant so that the starting rectangles + are pixel-aligned. + + test/text-rotate.c | 68 ++++++++++++++++++++++++++++++++++------------- + test/text-rotate.ref.png | Bin 16738 -> 16722 bytes + 2 files changed, 49 insertions(+), 19 deletions(-) + +commit 2edd2adafc471f4aa9c417d4bc76cc38466a9ed0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 22:45:59 2010 +0000 + + test: Exercise scan converters with large rounded rectangles. + + Having added a specialised scan converter on the premise that it should + be better at handling rounded rectangles, ensure that they are indeed + rendered correctly. + + test/Makefile.am | 2 + + test/Makefile.sources | 2 + + test/rounded-rectangle-fill.c | 65 +++++++++++++++++++++++++++++ + test/rounded-rectangle-fill.xlib.ref.png | Bin 0 -> 890 bytes + test/rounded-rectangle-stroke.c | 64 ++++++++++++++++++++++++++++ + test/rounded-rectangle-stroke.xlib.ref.png | Bin 0 -> 860 bytes + 6 files changed, 133 insertions(+) + +commit 5187501e997d6b8c0d135542d21accde9e311281 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 22:41:45 2010 +0000 + + test: Add --track-origins=yes to valgrind flags. + + Enable origin tracking by default for make check-valgrind. This is + slower and consumes more memory than regular valgrind, but the + additional information provided about the source of the uninitialised + data is often invaluable. + + test/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 3a5d71c431dfb251308c3e4e02d2ea4acec90a91 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 19:18:54 2010 +0000 + + pattern: An EXTEND_NONE surface is not opaque if we sample outside + + Fixes test/clear-source as proposed by Benjamin Otte. + + src/cairo-gstate.c | 2 +- + src/cairo-pattern.c | 33 ++++++- + src/cairo-pdf-surface.c | 219 ++++++++++++++++++++++++++++------------------- + src/cairo-ps-surface.c | 186 ++++++++++++++++++++++++---------------- + src/cairo-xlib-surface.c | 8 +- + src/cairoint.h | 3 +- + 6 files changed, 284 insertions(+), 167 deletions(-) + +commit b07de014eba1a482747ac235670011972a82d19d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 18:44:34 2010 +0000 + + spans: Add a rectangular scan converter + + This is a highly specialised scan converter for the relatively common + case of where the input geometry is known to be a series of rectangles. + Generally not device aligned (or else we would most likely have chosen + an even higher performance path that does not require a coverage mask), + this optimised converter can simply compute the analytical coverage by + utilising a special case Bentley-Ottmann intersection finder. + + src/Makefile.sources | 1 + + src/cairo-rectangular-scan-converter.c | 723 +++++++++++++++++++++++++++++++++ + src/cairo-spans-private.h | 25 ++ + 3 files changed, 749 insertions(+) + +commit e49855497e7214c21c85b03d7ab94e9e008f821b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 18:36:20 2010 +0000 + + spans: Add a Bentley-Ottmann variant on the Tor scan converter + + This variant uses the Bentley-Ottmann algorithm to only maintain the + active edge list upon edge events and so can efficiently skip areas + where no change occurs. This means that it can be much quicker than the + Tor algorithm (which is still used to compute the coverages from the + active edges) for geometries consisting of long straight lines with few + intersections. However due to the computational overhead of the + Bentley-Ottmann event processing, for dense curvy paths, simply updating + the active edge list in sync with computing the coverages is a win. Due + to advantageous adaptive step size, the scan converter can be run at a + much higher subsampling with little extra overhead compared with Tor, + currently it uses a 256x256 subsampling grid to avoid any impedance + mismatch with path precision. + + Given the current status of implementations, this scan converter [botor] + is likely to be advantage where detecting large regions of unchanged + span data will result in improved performance, for instance the drm + backends which convert the scan data into rectangles. + + src/Makefile.sources | 1 + + src/cairo-botor-scan-converter.c | 2199 ++++++++++++++++++++++++++++++++++++++ + src/cairo-compiler-private.h | 11 + + src/cairo-fixed-private.h | 22 +- + src/cairo-freelist-private.h | 16 + + src/cairo-freelist.c | 38 +- + src/cairo-spans-private.h | 23 + + src/cairoint.h | 9 - + 8 files changed, 2299 insertions(+), 20 deletions(-) + +commit 424dcf296378a107286a164aaf135a34e40c42ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 19:11:31 2010 +0000 + + boxes: Enable generation of boxes from rectilinear polygons. + + Extend the special case rectilinear tessellator to also produce boxes. + + src/cairo-bentley-ottmann-rectilinear.c | 122 +++++++++++++++++++++++++++----- + src/cairoint.h | 5 ++ + 2 files changed, 108 insertions(+), 19 deletions(-) + +commit b83f1c347dfd77139e9485745d43da946b086b74 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 19:09:10 2010 +0000 + + boxes: Enable tessellation + + Extend the special case rectangular tessellator to handle generation of + cairo_boxes_t. + + src/cairo-bentley-ottmann-rectangular.c | 778 +++++++++++++++++--------------- + src/cairoint.h | 5 + + 2 files changed, 416 insertions(+), 367 deletions(-) + +commit 43beaa5873b9ad10620bfe7ed5f9212a3c44effd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 18:11:26 2010 +0000 + + boxes: Efficient storage for an array of cairo_box_t. + + Currently we use cairo_traps_t to also pass around arrays of boxes. This + is woefully inefficient in terms of storage, but also means that we + repeatedly have to verify that the traps are a set of boxes. By + explicitly passing around a cairo_boxes_t we avoid the semantic loss. + + This will be heavily used in pending commits. + + src/Makefile.sources | 2 + + src/cairo-boxes-private.h | 80 ++++++++++++++ + src/cairo-boxes.c | 269 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-types-private.h | 1 + + 4 files changed, 352 insertions(+) + +commit ae25f1c360b79f0b7b1bb73e9ebc47eb794d8007 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 17:11:55 2010 +0000 + + Alter definition of cairo_composite_rectangles_t + + This is a more useful definition that is able to individually track the + rectangles that compose the composite operation. This will be used by + the specialist compositors as a means to perform the common extents + determination for an operation. + + src/Makefile.sources | 2 + + src/cairo-composite-rectangles-private.h | 105 ++++++++++++++++ + src/cairo-composite-rectangles.c | 197 +++++++++++++++++++++++++++++++ + src/cairo-gl-surface.c | 19 +-- + src/cairo-image-surface.c | 31 ++--- + src/cairo-misc.c | 41 +++++++ + src/cairo-rectangle.c | 21 ---- + src/cairo-spans.c | 29 +++-- + src/cairo-surface-fallback.c | 13 +- + src/cairo-types-private.h | 24 +--- + src/cairo-win32-surface.c | 21 ++-- + src/cairoint.h | 14 +-- + 12 files changed, 417 insertions(+), 100 deletions(-) + +commit 9cd9137843f8f1c3d32bedb6510259ab3638a2c5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 17:11:11 2010 +0000 + + spans: Pass multiple rows of identical spans to the renders. + + It is quite common amongst our geometry to have rows of repeated span + data, for example a rounded rectangle will have repeating data between + the top and bottom rounded corners. By passing the repeat length to the + renderers, they may be able to use that information more efficiently, + and the scan converters can avoid recomputing the same span data. + + src/cairo-gl-surface.c | 141 +++++++++-------- + src/cairo-image-surface.c | 79 ++++------ + src/cairo-spans-private.h | 24 ++- + src/cairo-spans.c | 6 +- + src/cairo-tor-scan-converter.c | 343 +++++++++++++++++++++++++---------------- + src/cairo-win32-surface.c | 13 +- + src/cairoint.h | 4 +- + 7 files changed, 349 insertions(+), 261 deletions(-) + +commit a04873c0770df5eaed078493df5216ca28322de7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 23:40:00 2010 +0000 + + qt: Trivial compile fix for boilerplate. + + boilerplate/cairo-boilerplate-qt.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0f09349dd85b15d5de14248e2f3f17a91fbcbb5e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 23:37:36 2010 +0000 + + gl: Exercise Window destinations with boilerplate + + Add a gl-window boilerplate target to exercise using GL to render to a + visible Drawable -- for instance, a window has a different coordinate + system to a framebuffer... + + boilerplate/cairo-boilerplate-gl.c | 99 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 99 insertions(+) + +commit ccea7fd7c1a2d7144e892c19615488e368529bc0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 23:37:11 2010 +0000 + + gl: Port to cairo_device_t + + boilerplate/cairo-boilerplate-gl.c | 28 +++-- + src/cairo-eagle-context.c | 25 +++-- + src/cairo-gl-glyphs.c | 46 +++++--- + src/cairo-gl-private.h | 44 +++++--- + src/cairo-gl-surface.c | 222 ++++++++++++++++--------------------- + src/cairo-gl.h | 22 ++-- + src/cairo-glx-context.c | 25 +++-- + 7 files changed, 211 insertions(+), 201 deletions(-) + +commit 3acd520c9dec89e72d7ff61adb1ae30bab12e256 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 23:11:19 2010 +0000 + + xml: Port to cairo_device_t + + src/cairo-xml-surface.c | 210 ++++++++++++++++++++++++------------------------ + src/cairo-xml.h | 13 +-- + util/trace-to-xml.c | 7 +- + 3 files changed, 115 insertions(+), 115 deletions(-) + +commit 49ab86772a44d7a044464d875324bd0af96af728 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 22:43:24 2010 +0000 + + script: Port cairo_script_context_t to cairo_device_t + + Use the unifying cairo_device_t for cairo_script_context_t and replace. + + boilerplate/cairo-boilerplate-script.c | 6 +- + boilerplate/cairo-boilerplate.c | 6 +- + src/cairo-script-surface.c | 491 ++++++++++++++++++--------------- + src/cairo-script.h | 35 +-- + test/cairo-test-trace.c | 7 +- + util/cairo-fdr/fdr.c | 10 +- + util/cairo-script/csi-trace.c | 11 +- + util/cairo-sphinx/fdr.c | 4 +- + util/cairo-sphinx/sphinx.c | 17 +- + util/cairo-trace/trace.c | 8 +- + 10 files changed, 312 insertions(+), 283 deletions(-) + +commit f617d5fc982f749d0981c81c1de1be8dc3632717 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 21:53:42 2010 +0000 + + Add cairo_device_t + + The device is a generic method for accessing the underlying interface + with the native graphics subsystem, typically the X connection or + perhaps the GL context. By exposing a cairo_device_t on a surface and + its various methods we enable finer control over interoperability with + external interactions of the device by applications. The use case in + mind is, for example, a multi-threaded gstreamer which needs to serialise + its own direct access to the device along with Cairo's across many + threads. + + Secondly, the cairo_device_t is a unifying API for the mismash of + backend specific methods for controlling creation of surfaces with + explicit devices and a convenient hook for debugging and introspection. + + The principal components of the API are the memory management of: + + cairo_device_reference(), + cairo_device_finish() and + cairo_device_destroy(); + + along with a pair of routines for serialising interaction: + + cairo_device_acquire() and + cairo_device_release() + + and a method to flush any outstanding accesses: + + cairo_device_flush(). + + The device for a particular surface may be retrieved using: + + cairo_surface_get_device(). + + The device returned is owned by the surface. + + src/Makefile.sources | 2 + + src/cairo-analysis-surface.c | 9 +- + src/cairo-beos-surface.cpp | 5 +- + src/cairo-device-private.h | 85 ++++++++++++ + src/cairo-device.c | 265 ++++++++++++++++++++++++++++++++++++ + src/cairo-directfb-surface.c | 2 + + src/cairo-gl-surface.c | 1 + + src/cairo-glitz-surface.c | 4 +- + src/cairo-image-surface.c | 4 +- + src/cairo-misc.c | 4 + + src/cairo-os2-surface.c | 1 + + src/cairo-paginated-surface.c | 4 +- + src/cairo-pdf-surface.c | 4 +- + src/cairo-ps-surface.c | 4 +- + src/cairo-qt-surface.cpp | 7 +- + src/cairo-quartz-image-surface.c | 1 + + src/cairo-quartz-surface.c | 6 +- + src/cairo-recording-surface.c | 9 +- + src/cairo-script-surface.c | 1 + + src/cairo-skia-surface.cpp | 1 + + src/cairo-spans.c | 4 + + src/cairo-surface-private.h | 1 + + src/cairo-surface-snapshot.c | 1 + + src/cairo-surface-subsurface.c | 1 + + src/cairo-surface.c | 29 ++++ + src/cairo-svg-surface.c | 4 +- + src/cairo-tee-surface.c | 1 + + src/cairo-type3-glyph-surface.c | 4 +- + src/cairo-types-private.h | 1 + + src/cairo-vg-surface.c | 1 + + src/cairo-win32-printing-surface.c | 1 + + src/cairo-win32-surface.c | 8 +- + src/cairo-xcb-surface.c | 4 +- + src/cairo-xlib-surface.c | 4 +- + src/cairo-xml-surface.c | 1 + + src/cairo.h | 117 ++++++++++++++++ + src/cairoint.h | 1 + + src/drm/cairo-drm-gallium-surface.c | 2 + + src/drm/cairo-drm-intel-surface.c | 5 +- + src/drm/cairo-drm-radeon-surface.c | 5 +- + src/test-fallback-surface.c | 4 +- + src/test-fallback16-surface.c | 1 + + src/test-null-surface.c | 5 +- + src/test-paginated-surface.c | 4 +- + src/test-wrapping-surface.c | 1 + + util/cairo-trace/trace.c | 2 + + 46 files changed, 607 insertions(+), 24 deletions(-) + +commit 82f8aa548d70acf51b319000d7a5c176fc73da64 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 22:02:09 2010 +0000 + + Recursive mutex. + + Implement a recursive mutex which will be needed for cairo_device_t. + In particular only pthreads by default is a non-recursive mutex (to my + knowledge) - both win32 critical sections and mutexes on Quartz are + recursive. + + src/cairo-mutex-impl-private.h | 28 ++++++++++++++++++++++++++++ + src/cairo-mutex-type-private.h | 9 ++++++++- + 2 files changed, 36 insertions(+), 1 deletion(-) + +commit d2f251f84b326c5f8825c9a631ea729f21891580 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 22:12:23 2010 +0000 + + configure: Globally define AC_GNU_SOURCE + + We were using _GNU_SOURCE throughout the codebase, so simply define it + once during configure. This is the easiest method to enable recursive + mutexes using pthreads, as required in a pending patch. + + boilerplate/cairo-boilerplate-pdf.c | 4 ++++ + boilerplate/cairo-boilerplate-ps.c | 4 ++++ + configure.ac | 3 +++ + src/cairo-gstate.c | 2 -- + src/cairo-matrix.c | 2 -- + src/cairo-scaled-font.c | 2 -- + 6 files changed, 11 insertions(+), 6 deletions(-) + +commit 934d0d0d6585eb7638c7db597c40dd821092c034 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 19:05:34 2010 +0000 + + Real zero-copy cow snapshotting + + The first iteration of COW snapshotting always made an initial copy when + the snapshot was requested (and reused that copy until the surface was + modified). However, in a few circumstances we can avoid even that copy + so long as the surface is still alive and unmodified between the + snapshotting and its use. In order to do so, we need a new proxy surface + that can automatically perform the copy if the target should disappear + prior to use. + + src/Makefile.sources | 2 + + src/cairo-paginated-surface.c | 7 +- + src/cairo-surface-snapshot-private.h | 48 ++++++++ + src/cairo-surface-snapshot.c | 225 +++++++++++++++++++++++++++++++++++ + src/cairo-surface.c | 101 ++-------------- + src/cairo-types-private.h | 2 + + 6 files changed, 291 insertions(+), 94 deletions(-) + +commit 6b3e19aa434d159db7878b2a7fb28a026b2d1756 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 19:12:25 2010 +0000 + + Remove content matching from snapshot lookup. + + This was never used, so remove the complexity from the interface. + + src/cairo-recording-surface.c | 3 +-- + src/cairo-surface.c | 23 +++++++---------------- + src/cairo-vg-surface.c | 3 +-- + src/cairoint.h | 3 +-- + src/drm/cairo-drm-intel-surface.c | 3 +-- + src/drm/cairo-drm-radeon-surface.c | 3 +-- + 6 files changed, 12 insertions(+), 26 deletions(-) + +commit dc8290814c0e98b38828953bac6dd0893c31c9ad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 18:06:51 2010 +0000 + + Add subsurface. + + A subsurface is a region of another surface that may be used either to + restrict the writable area of a context or the readable extents of a + source. Whilst writing, access to the exterior of the subsurface is + prevented via clipping and when used as a source reads from the exterior + of the subsurface are governed via the extend mechanism of the pattern. + + src/Makefile.sources | 2 + + src/cairo-surface-subsurface-private.h | 48 ++++ + src/cairo-surface-subsurface.c | 464 +++++++++++++++++++++++++++++++++ + src/cairo-types-private.h | 4 +- + src/cairo.h | 7 + + test/Makefile.am | 3 + + test/Makefile.sources | 3 + + test/subsurface-repeat.c | 72 +++++ + test/subsurface-repeat.ref.png | Bin 0 -> 197 bytes + test/subsurface-similar-repeat.c | 83 ++++++ + test/subsurface-similar-repeat.ref.png | Bin 0 -> 197 bytes + test/subsurface.c | 80 ++++++ + test/subsurface.ref.png | Bin 0 -> 1597 bytes + 13 files changed, 765 insertions(+), 1 deletion(-) + +commit b8eacbfae1c155f412d84120411103cb610e383b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 18:09:11 2010 +0000 + + Add surface-offset internal API. + + This is a simplified version of the wrapping surface where the target + surface is just a subsurface onto which we wish to draw the current + operation. In particular this is useful for the subsurface API as well + as fallbacks. + + src/Makefile.sources | 2 + + src/cairo-surface-offset-private.h | 95 ++++++++++ + src/cairo-surface-offset.c | 354 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 451 insertions(+) + +commit f2c32d01836379766bc287edf77381123767daeb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 18:06:54 2010 +0000 + + Unify the two freed object pools + + Discard some duplicate code and shared a single freed object pointer + pool between the pattern and clip. + + src/Makefile.sources | 2 + + src/cairo-clip.c | 88 +----------------------------- + src/cairo-freed-pool-private.h | 121 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-freed-pool.c | 91 +++++++++++++++++++++++++++++++ + src/cairo-pattern.c | 115 ++++++--------------------------------- + 5 files changed, 234 insertions(+), 183 deletions(-) + +commit cfd204824fada7d2b4bcf4994c4200ae9b5a8b26 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 18:20:16 2010 +0000 + + Constify stroke style and matrices. + + As a simple step to ensure that we do not inadvertently modify (or at least + generate compiler warns if we try) user data, mark the incoming style + and matrices as constant. + + src/cairo-analysis-surface.c | 12 ++++---- + src/cairo-paginated-surface.c | 6 ++-- + src/cairo-path-bounds.c | 6 ++-- + src/cairo-path-stroke.c | 60 ++++++++++++++++++------------------ + src/cairo-pdf-operators-private.h | 24 +++++++-------- + src/cairo-pdf-operators.c | 38 +++++++++++------------ + src/cairo-pdf-surface-private.h | 11 +++---- + src/cairo-pdf-surface.c | 40 ++++++++++++------------ + src/cairo-ps-surface.c | 6 ++-- + src/cairo-qt-surface.cpp | 14 ++++----- + src/cairo-quartz-surface.c | 6 ++-- + src/cairo-recording-surface.c | 6 ++-- + src/cairo-script-surface.c | 6 ++-- + src/cairo-stroke-style.c | 2 +- + src/cairo-surface-fallback-private.h | 6 ++-- + src/cairo-surface-fallback.c | 6 ++-- + src/cairo-surface-wrapper-private.h | 12 ++++---- + src/cairo-surface-wrapper.c | 12 ++++---- + src/cairo-surface.c | 14 ++++----- + src/cairo-svg-surface.c | 40 ++++++++++++------------ + src/cairo-tee-surface.c | 6 ++-- + src/cairo-type3-glyph-surface.c | 6 ++-- + src/cairo-win32-printing-surface.c | 6 ++-- + src/cairo-xml-surface.c | 6 ++-- + src/cairoint.h | 44 +++++++++++++------------- + src/drm/cairo-drm-private.h | 6 ++-- + src/drm/cairo-drm-surface.c | 6 ++-- + src/test-null-surface.c | 6 ++-- + src/test-paginated-surface.c | 6 ++-- + src/test-wrapping-surface.c | 6 ++-- + 30 files changed, 212 insertions(+), 213 deletions(-) + +commit 3e17c559b04e2df208f28125746d7e0acfb4b476 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Dec 9 19:46:28 2009 +0100 + + [test] Add pthread-same-source test + + Multiple threads render using the same source surface, but with + different extend and filter. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/pthread-same-source.c | 160 +++++++++++++++++++++++++++++++++++++++ + test/pthread-same-source.ref.png | Bin 0 -> 1000 bytes + 4 files changed, 162 insertions(+) + +commit 30a12f802f4ff46f13dc36e60936cd857585a9ea +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 25 18:55:05 2009 +0100 + + [test] Add a simple multithreading test + + test/Makefile.am | 1 + + test/Makefile.sources | 5 +- + test/pthread-similar.c | 106 +++++++++++++++++++++++++++++++++++++++++++ + test/pthread-similar.ref.png | Bin 0 -> 170 bytes + 4 files changed, 111 insertions(+), 1 deletion(-) + +commit 038829eb84e53532a6e3c75225933ad85da50cfc +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Dec 6 17:47:50 2009 +0100 + + [test] Add new test checking is_clear is handled properly + + This test does various operations with a clear source surface with + various content types. + The idea is to make sure optimizations done when surface->is_clear == + TRUE only happen in the proper cases. + + test/Makefile.sources | 1 + + test/clear-source.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++ + test/clear-source.ref.png | Bin 0 -> 881 bytes + 3 files changed, 164 insertions(+) + +commit bf7fb4e0e09d05f42425cc7969c64992d4dc9ff9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 17:18:08 2010 +0000 + + script: Handle cache allocation failure more gracefully + + Instead of bailing out if we cannot store the glyph cache on the font, + simply do not store the glyph cache on the font... + + util/cairo-script/cairo-script-operators.c | 74 +++++++++++++----------------- + 1 file changed, 33 insertions(+), 41 deletions(-) + +commit 2b312806f138da6f88d03bb3c0c3852b342eb220 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 17:14:24 2010 +0000 + + script: Free the correct pattern after failure. + + The error path attempted to free the resolved pattern which it had just + discovered was NULL and not the locally allocated pattern... + + util/cairo-script/cairo-script-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bc2d0ad114f8fc0b0579851154fe9d39c0aa0fc9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 27 17:30:51 2009 +0000 + + script: Permit surface operations on the context + + By implicitly reference the target of the context instead, i.e. + this reduces the use of: + + /target get (example.png) write-to-png pop + + as a common idiom where the context is kept on the stack and the surface + forgotten. + + util/cairo-script/cairo-script-operators.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 411c09eed7ebff7335948a7f96d2b29d82ed817a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 1 08:40:41 2009 +0000 + + perf: Enable a surface cache for perf-trace + + Real applications that control their Drawable externally to Cairo are + 'disadvantaged' by cairo-perf-trace when it creates a similar surface + for each new instance of the same Drawable. The difficulty in + maintaining one perf surface for every application surface is that the + traces do not track lifetimes for the application surfaces, so we would + just accumulate stale surfaces. The surface cache takes a different + approach and returns the same surface for each active Drawable, and + maintains a hold-over of the MRU 16 surfaces. This achieves 60-80% hit + rate with firefox, which is probably as good as can be expected. + Obviously for double-buffered applications we only every draw to freshly + created surfaces (and Gtk+ bypasses cairo to do the final copy -- the + ideal application would just use a push-group for double buffering, in + which case we would capture and replay the entire expose event). + + To enable use of the surface cache whilst replaying use -c: + + ./cairo-perf-trace -c firefox-talos-gfx + + perf/Makefile.am | 3 +- + perf/cairo-perf-trace.c | 141 ++++++++++++++++++++++++++- + test/any2ppm.c | 4 +- + util/cairo-script/cairo-script-interpreter.h | 3 +- + util/cairo-script/cairo-script-operators.c | 13 ++- + util/cairo-sphinx/sphinx.c | 3 +- + 6 files changed, 157 insertions(+), 10 deletions(-) + +commit c50c8b90c0033686b465e6766fba4772c1d698c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 16:58:40 2010 +0000 + + Move _cairo_error() to a standalone header + + A pending commit will want to include some utility code from cairo and + so we need to extricate the error handling from the PLT symbol hiding. + + src/Makefile.sources | 1 + + src/cairo-analysis-surface.c | 1 + + src/cairo-array.c | 1 + + src/cairo-base64-stream.c | 1 + + src/cairo-base85-stream.c | 1 + + src/cairo-bentley-ottmann-rectangular.c | 1 + + src/cairo-bentley-ottmann-rectilinear.c | 1 + + src/cairo-bentley-ottmann.c | 1 + + src/cairo-beos-surface.cpp | 2 ++ + src/cairo-cache.c | 1 + + src/cairo-cff-subset.c | 1 + + src/cairo-clip.c | 1 + + src/cairo-deflate-stream.c | 1 + + src/cairo-directfb-surface.c | 1 + + src/cairo-eagle-context.c | 1 + + src/cairo-error-private.h | 60 +++++++++++++++++++++++++++++++++ + src/cairo-font-face-twin.c | 1 + + src/cairo-font-face.c | 1 + + src/cairo-font-options.c | 1 + + src/cairo-freelist.c | 1 + + src/cairo-ft-font.c | 1 + + src/cairo-gl-glyphs.c | 2 ++ + src/cairo-gl-shaders.c | 1 + + src/cairo-gl-surface.c | 1 + + src/cairo-glitz-surface.c | 2 ++ + src/cairo-glx-context.c | 2 ++ + src/cairo-gstate.c | 1 + + src/cairo-hash.c | 1 + + src/cairo-hull.c | 1 + + src/cairo-image-surface.c | 1 + + src/cairo-lzw.c | 1 + + src/cairo-matrix.c | 1 + + src/cairo-misc.c | 1 + + src/cairo-os2-surface.c | 1 + + src/cairo-output-stream.c | 1 + + src/cairo-paginated-surface.c | 1 + + src/cairo-path-fill.c | 1 + + src/cairo-path-fixed.c | 1 + + src/cairo-path-stroke.c | 1 + + src/cairo-path.c | 1 + + src/cairo-pattern.c | 1 + + src/cairo-pdf-operators.c | 1 + + src/cairo-pdf-surface.c | 1 + + src/cairo-pen.c | 1 + + src/cairo-png.c | 2 ++ + src/cairo-polygon.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-qt-surface.cpp | 6 ++-- + src/cairo-quartz-font.c | 2 ++ + src/cairo-quartz-image-surface.c | 2 ++ + src/cairo-quartz-surface.c | 2 ++ + src/cairo-recording-surface.c | 3 +- + src/cairo-region.c | 1 + + src/cairo-rtree.c | 1 + + src/cairo-scaled-font-subsets.c | 1 + + src/cairo-scaled-font.c | 1 + + src/cairo-script-surface.c | 1 + + src/cairo-stroke-style.c | 1 + + src/cairo-surface-fallback.c | 1 + + src/cairo-surface-wrapper.c | 1 + + src/cairo-surface.c | 1 + + src/cairo-svg-surface.c | 1 + + src/cairo-tee-surface.c | 1 + + src/cairo-tor-scan-converter.c | 1 + + src/cairo-toy-font-face.c | 1 + + src/cairo-traps.c | 1 + + src/cairo-truetype-subset.c | 1 + + src/cairo-type1-fallback.c | 1 + + src/cairo-type1-subset.c | 1 + + src/cairo-type3-glyph-surface.c | 1 + + src/cairo-unicode.c | 1 + + src/cairo-user-font.c | 1 + + src/cairo-vg-surface.c | 3 +- + src/cairo-win32-font.c | 1 + + src/cairo-win32-printing-surface.c | 1 + + src/cairo-win32-surface.c | 1 + + src/cairo-xcb-surface.c | 3 +- + src/cairo-xlib-display.c | 1 + + src/cairo-xlib-screen.c | 1 + + src/cairo-xlib-surface.c | 1 + + src/cairo-xlib-visual.c | 2 ++ + src/cairo-xml-surface.c | 1 + + src/cairo.c | 1 + + src/cairoint.h | 12 ------- + src/drm/cairo-drm-bo.c | 1 + + src/drm/cairo-drm-intel-surface.c | 1 + + src/drm/cairo-drm-intel.c | 1 + + src/drm/cairo-drm-radeon-surface.c | 1 + + src/drm/cairo-drm-radeon.c | 1 + + src/drm/cairo-drm-surface.c | 1 + + src/drm/cairo-drm.c | 1 + + src/test-fallback-surface.c | 1 + + src/test-fallback16-surface.c | 1 + + src/test-null-surface.c | 2 ++ + src/test-paginated-surface.c | 1 + + src/test-wrapping-surface.c | 1 + + 96 files changed, 170 insertions(+), 17 deletions(-) + +commit 558f9501700ba569f04f345f7c64d16b1870e37c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 18 22:47:34 2010 +0000 + + surface-wrapper: Avoid copying patterns and clips unless transformed. + + An older variant of the fixes for moving the device transformation out + of the surface layer, but languished in a side branch. The only benefit + of this patch is that it avoids the copy where possible. + + src/cairo-surface-wrapper.c | 134 +++++++++++++++++++++++++------------------- + 1 file changed, 75 insertions(+), 59 deletions(-) + +commit 8f694817227366f4a4c6bbbf46e6cdddb4a065df +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 19 17:12:47 2010 +0000 + + gitignore: refresh + + Add forgotten local targets to .gitignore + + .gitignore | 1 + + perf/.gitignore | 1 + + util/.gitignore | 2 ++ + util/cairo-script/.gitignore | 1 + + 4 files changed, 5 insertions(+) + +commit 5914e995723682e0b1f685d9ff5ea5abe05ae024 +Author: Eric Anholt <eric@anholt.net> +Date: Fri Jan 22 09:21:36 2010 -0800 + + [gl] Cache a temporary glyph compositing mask for reuse later. + + Cuts firefox-talos-gfx time from 56 seconds to 43 seconds. + + src/cairo-gl-glyphs.c | 29 ++++++++++++++++++++++------- + src/cairo-gl-private.h | 4 ++++ + src/cairo-gl-surface.c | 4 +++- + 3 files changed, 29 insertions(+), 8 deletions(-) + +commit 1bf0f64ee7783742fa777a496567e4da48e300dd +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 21 14:08:11 2010 -0800 + + [gl] Composite component-alpha glyphs directly instead of through a mask. + + Cuts gnome-terminal-vim time from 58 seconds to 20. + + src/cairo-gl-glyphs.c | 190 +++++++++++++++++++++++++++++++------------------ + src/cairo-gl-private.h | 4 ++ + src/cairo-gl-surface.c | 2 +- + 3 files changed, 127 insertions(+), 69 deletions(-) + +commit 12d521df8acc483b2daa844d4f05dc2fe2765ba6 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 21 13:19:17 2010 -0800 + + [gl] Use GL_RGBA textures even for CAIRO_CONTENT_COLOR. + + When the texture is GL_RGB, GL_CLAMP_TO_BORDER (EXTEND_NONE) fills the + border color alpha channel with 1, when the whole reason we were using + the border color was to get a color and alpha of 0. We're forced to + use GL_RGBA textures and do extra work to fill in the alpha channel of + them to 1 to get cairo's desired behavior. + + This fixes a failure in rotate-image-surface-paint and 4 other + testcases. No performance difference in firefox-talos-gfx. + + src/cairo-gl-surface.c | 131 ++++++++++++++++++++++++++++--------------------- + 1 file changed, 75 insertions(+), 56 deletions(-) + +commit e316cb9db57094359c28f6b740e73674e8dcc134 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Jan 20 13:33:56 2010 -0800 + + [gl] Add support for component-alpha glyph rendering. + + This is done using a mask and the two-pass trick I did for EXA. Fixes + text-antialias-subpixel. + + src/cairo-gl-glyphs.c | 60 ++++++-- + src/cairo-gl-private.h | 3 +- + src/cairo-gl-surface.c | 384 +++++++++++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 424 insertions(+), 23 deletions(-) + +commit ceeb7e7e703213a83ca43d80962519074a19364d +Author: Eric Anholt <eric@anholt.net> +Date: Tue Jan 19 13:43:16 2010 -0800 + + [gl] Use the UNSUPPORTED() macro in more places for fallback debugging. + + src/cairo-gl-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 5d9e2fd84b4f66e5b121d95805ce34e2f482d1b0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 15 16:28:12 2010 +0100 + + [quartz] Leftbehind change from a39075c88f9b2e12e19348ea11c9b3f739818265 + + This commit completes the change in a39075c88f9b2e12e19348ea11c9b3f739818265. + It removes unused variables and corrects the extents rect computation. + + src/cairo-quartz-surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 6950b233e41a0c926465728c37f9bc5512f2844b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 15 14:25:16 2010 +0000 + + qt: Make flush() robust. + + Hanno Meyer-Thurow reported in + + http://bugs.freedesktop.org/show_bug.cgi?id=26063 + [PATCH] various fixes to cairo-qt + + a few issues related to _cairo_qt_surface_flush() where firefox was + crashing after being built to use cairo-qt. + + This is an amalgam of those patches that hopefully address the issue. + + src/cairo-qt-surface.cpp | 33 ++++++++++++++++++++++++++------- + 1 file changed, 26 insertions(+), 7 deletions(-) + +commit 4e315d84723b27746a6a012ab7de429b2f2ef90b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 15 12:21:52 2010 +0000 + + pattern: Premultiply color-stop when converting to solid + + Fixes: test/linear-uniform + https://bugzilla.mozilla.org/show_bug.cgi?id=539165 + Bug 539165 - gradients with a single stop do not have their color + multiplied by the alpha. + + As reported by Jeff Muizelaar, we regressed in 2d790daa as the + color-stops are not premultiplied and so could not be treated as an + ordinary cairo_color_t. Instead we have to create a intermediate + cairo_color_t from the original values in order for the + premultiplication to be performed. + + src/cairo-gstate.c | 26 +++++++++++++++++++------- + src/cairo-pattern.c | 32 +++++++++++++++++++++----------- + 2 files changed, 40 insertions(+), 18 deletions(-) + +commit f40560a9bb5b12d2584ed297bf4114baf2aa9cc1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 15 12:17:30 2010 +0000 + + test: Add linear-uniform + + Jeff reported a regression found by Mozilla whereby a uniform gradient + was not being premultiplied on conversion to a solid pattern. + + https://bugzilla.mozilla.org/show_bug.cgi?id=539165 + [Bug 539165] gradients with a single stop do not have their color + multiplied by the alpha. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/linear-uniform.c | 63 ++++++++++++++++++++++++++++++++++++++++++++ + test/linear-uniform.ref.png | Bin 0 -> 128 bytes + 4 files changed, 65 insertions(+) + +commit e22c02dbaeda6941083fc89b517508dc0c4386a0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 15 12:02:58 2010 +0000 + + test: Add degenerate-arcs + + A simple test to ensure that using degenerate-arcs such as when drawing + a rounded rectangle with radii=0 construct a proper path. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/degenerate-arcs.c | 57 +++++++++++++++++++++++++++++++++++++++++++ + test/degenerate-arcs.ref.png | Bin 0 -> 120 bytes + 4 files changed, 59 insertions(+) + +commit a39075c88f9b2e12e19348ea11c9b3f739818265 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 6 18:53:54 2010 +0100 + + [quartz] Fix generic masking + + Masking with unbounded operators was broken because an incorrect + transformation was applied to inverted mask used for the fixup. + + src/cairo-quartz-surface.c | 59 +++++++++++++++++----------------------------- + 1 file changed, 21 insertions(+), 38 deletions(-) + +commit 27701ed8447d4c21b7bf9709a2fc21690b3cdc96 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jan 5 19:42:23 2010 +0100 + + [quartz] Approximate dense dashing patterns + + Quartz doesn't try to approximate dash pattern even if they are well + beyond suface sampling frequency. Approximating dash patterns when their + density is too high avoids looping indefinitely in these degenerate cases. + + src/cairo-quartz-surface.c | 32 +++++++++++++++++++++----------- + 1 file changed, 21 insertions(+), 11 deletions(-) + +commit ad7ab00c10fc1adcf2ef4574fdd00b25dfcdafdd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 2 13:23:53 2010 +0100 + + [quartz] Improve A8 and A1 support + + Use A8 images as alpha-only masks intread of greyscale images. + Add support to A1 images (they were ignored before). + + src/cairo-quartz-surface.c | 59 +++++++++++++++++++++++++++------------------- + 1 file changed, 35 insertions(+), 24 deletions(-) + +commit f3b3a5c43f247f3e9019fa6c1fd2abb3b00dd9ea +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 15 07:47:30 2010 +1030 + + Fix bug in _cairo_ft_index_to_ucs4 + + Previously it would miss the first character causing the space glyph to + return 0x00A0 instead of 0x0020. + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e26e2c8cc41b4e60462eacbd87894dc82beca883 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 14 10:05:02 2010 -0800 + + [gl] Fix the color bits of CAIRO_CONTENT_ALPHA surface patterns to be 0. + + Fixes surface-pattern-operator and alpha-similar. + + src/cairo-gl-private.h | 1 - + src/cairo-gl-surface.c | 22 +++++++++++----------- + 2 files changed, 11 insertions(+), 12 deletions(-) + +commit 520945603cdbacb90b3067f24a37b6dbd2ea6808 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 14 10:00:37 2010 -0800 + + [gl] Remove the special-casing of acquiring a pattern surface. + + _cairo_pattern_acquire_surface() should do fine at it, and matches + what cairo-drm-i915 does. + + src/cairo-gl-surface.c | 127 ------------------------------------------------- + 1 file changed, 127 deletions(-) + +commit dbf9faf8232e7bf279377b5f3fc08ed210ca4e51 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Jan 13 10:33:32 2010 -0800 + + [gl] Use GLSL for fill_rectangles when available. + + Ultimately, we want all of our paths to use shaders when they are + exposed -- it brings us closer to GL 3.0 compatibility and it should + reduce the work that GL drivers have to do per operation to compute + the required hardware state. + + src/Makefile.sources | 2 +- + src/cairo-gl-private.h | 6 +++ + src/cairo-gl-shaders.c | 117 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-surface.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++-- + 4 files changed, 244 insertions(+), 6 deletions(-) + +commit 57341cf5ac4d16222da27856e3a1092a473597e8 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Jan 13 14:18:06 2010 -0800 + + [gl] Use ADD instead of SOURCE when making a mask for overlapping glyphs. + + The whole point of making the mask was to avoid overwriting one glyph + with the data from another. Whoops. + + Fixes ft-show-glyphs-positioning, text-rotate, overlapping-glyphs, + clip-text. + + src/cairo-gl-glyphs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6e0a63102e7e2d3fa3d5c993f2b94a2d6e40bdd8 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Jan 13 14:06:23 2010 -0800 + + [gl] Clear the current_target cache when binding a framebuffer in creation. + + Failing to do so meant that we might not re-bind the framebuffer to + the correct one if we didn't follow up surface creation with drawing + to it. + + Fixes many testcases. Thanks to T. Zachary Laine for tracking down + that the current_target was the source of these issues. + + src/cairo-gl-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit ad0f4bee19b214b96fb07a45d1f059b362afee0f +Author: T. Zachary Laine <whatwasthataddress@gmail.com> +Date: Thu Jan 7 17:24:31 2010 -0600 + + [gl] Clear the is_clear flag on the temporary glyph mask we create. + + Normally is_clear is cleared by the caller of one of the 5 basic + entrypoints, but in this temporary surface usage nobody else can do it + for us. + + Fixes ft-show-glyphs-table, user-font-rescale, and select-font-face. + + src/cairo-gl-glyphs.c | 1 + + 1 file changed, 1 insertion(+) + +commit 384e50d858e9eec670f764c758fb3aa09b56caed +Author: T. Zachary Laine <whatwasthataddress@gmail.com> +Date: Wed Jan 13 15:06:24 2010 -0600 + + [gl] Removed repeated lines of source + + The two removed lines are redundant with code a few lines above them. + + src/cairo-gl-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 515ccb63a67c88ddb2bc5adfd018cae55bc93185 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jan 11 16:04:21 2010 -0800 + + [gl] Fix the glyph cache full flush to really try again. + + Previously, the initial error handling would dump through to software + fallback instead of retrying in the following code. + + src/cairo-gl-glyphs.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 4aae4bfa8f28a470ab18575670563ad28374e445 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 12 17:10:04 2010 +0000 + + test: Fix typo in path-stroke-twice reference image + + Sigh. I committed the reference image with the name + path-stroke-twice-ref.png. + + test/path-stroke-twice-ref.png | Bin 206 -> 0 bytes + test/path-stroke-twice.ref.png | Bin 0 -> 206 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 74ea4c908067f5579b51d3dbaea387da8f343671 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 12 17:00:25 2010 +0000 + + path: Do not remove anti-parallel line segments in case we are stroking + + Bug 26010 - cairo_line_to optimizes away path segments + http://bugs.freedesktop.org/show_bug.cgi?id=26010 + + As exercised by path-stroke-twice, we incorrectly optimise away a line + segment if the path doubled back upon itself. This is very reminiscent + of the optimisation bug for replacing curve-to with line-to. + + src/cairo-path-fixed.c | 5 ++++- + src/cairo-slope-private.h | 7 +++++++ + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit a5dd5a6069c0d7435260a954d8d98483f5fbcc1c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 12 16:32:09 2010 +0000 + + test: Add path-stroke-twice + + Exercises a bug found by alois@astro.ch, whereby we inadvertently remove + a line segment when the path doubles back upon itself. + + Bug 26010 - cairo_line_to optimizes away path segments + http://bugs.freedesktop.org/show_bug.cgi?id=26010 + + test/Makefile.am | 2 ++ + test/Makefile.sources | 1 + + test/path-stroke-twice-ref.png | Bin 0 -> 206 bytes + test/path-stroke-twice.c | 54 ++++++++++++++++++++++++++++++++++++++ + test/path-stroke-twice.ps.ref.png | Bin 0 -> 197 bytes + 5 files changed, 57 insertions(+) + +commit 4204605813d93e7e2f0d8761e90a6dd6b8089dcb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 8 11:58:15 2010 +0000 + + type1: Destroy the output stream. + + mpsuzuki spotted that the output stream for the subset was not being + destroyed on the error path - on closer inspection, it wasn't destroyed + along the normal path either and may never have been correctly + initialised to NULL on an earlier error. + + Reported-by: mpsuzuki@hiroshima-u.ac.jp + + src/cairo-type1-subset.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit 41a24d822ac094f0841ba0c92ca86448ad062def +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 7 11:58:01 2010 +0000 + + trace: Correctly encode octal values. + + How embarrassing. + + util/cairo-trace/trace.c | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit 3ae9d04c6ddd311ffab91170fb9342e37c5530a8 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jan 1 20:13:33 2010 +0200 + + [stroker] Fix off-by-one memory allocation in _tessellate_fan(). + + The number of points in a triangle fan was miscomputed because + it was computing the number of line segments rather than points + in the fan. Now we include the final point of the fan correctly + in the count. + + This fixes https://bugs.webkit.org/show_bug.cgi?id=33071 as + reported by Benjamin Otte. A derived test case was not added + to the cairo test suite since the bug is difficult to trigger in + a reliable way which causes visible results (as opposed to + silent heap corruption.) + + The easiest way of triggering the bug is to stroke a line + using a large line width and round caps or joins. + + src/cairo-path-stroke.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a0ea0b63fdd38a73d6696da5cd4800d9a7289240 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 30 16:21:50 2009 +0000 + + arc: Just emit a line-to if radius is zero. + + In order to be consistent with the semantics of cairo_arc() using a + radius of 0 should simply degenerate into a line-to. + + Reported-by: Benjamin Berg + + src/cairo.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 21560b3ec6d015004867207c5bdd90061b8a5d80 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 11 10:29:12 2009 +0100 + + [trace] Fix compilation when FreeType is disabled + + cairo-trace needs some headers which are missing if freetype is + not enabled. Adding them explicitly fixes compilation. + + util/cairo-trace/trace.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 393d2d9c9199c368916fb5412abaac163f57ff86 +Author: Tim Janik <timj@gtk.org> +Date: Mon Dec 28 13:34:43 2009 +0100 + + Fixed documentation typo. + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2d75203c515f9740a8e0e9779391de0a1a54b07 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Nov 29 15:56:26 2009 +0200 + + [dirty] Add more missing surface dirtying notifications. + + Now that the image surface actually cares about + cairo_surface_mark_dirty() we're hitting cases where + we've forgotten to mark surfaces dirty. + + boilerplate/cairo-boilerplate.c | 1 + + src/cairo-xlib-surface.c | 1 + + util/cairo-script/cairo-script-operators.c | 2 ++ + 3 files changed, 4 insertions(+) + +commit b76565d2f4a2510aabada4cef968b9b597bbef09 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Nov 29 15:40:30 2009 +0200 + + [test] Don't use uninitialised data in surface-source.c + + The draw_pattern() function assumed the incoming surface + was clear, but it's not. Explicitly clear the surface first. + + test/surface-source.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e09b754fdd43206e1668812be4ff11d25188148c +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Nov 29 01:11:29 2009 +0200 + + [gstate] Change dash offset normalisation to preserve offsets in range. + + We have a test case get-and-set which wants to see whatever it puts + into a cairo_t come back out again, but at the same time cairo-gstate + wants to range reduce the dash offset it's given to a sane range. + This patch changes the range reduction algorithm to always normalize + to a non-negative dash offset and not touch dash offsets which are + already in range. + + src/cairo-gstate.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit b394240941dffa263776a62cf42dc9b7e477f7a2 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Nov 29 02:48:23 2009 +0200 + + [test] Add missing mark_dirty() calls to test cases. + + A recent optimisation has added a flag to the image + surface which is used to track whether the surface + is clear or not. This makes it imperative that clients + call cairo_surface_mark_dirty() if they use cairo to + allocate their pixel buffers and then proceed to + initialize them without telling cairo about it. + + test/a1-mask.c | 1 + + test/large-source.c | 2 ++ + test/user-font-mask.c | 1 + + 3 files changed, 4 insertions(+) + +commit 9ddf14cfd5c3bf0cf507cfc82b192f5c46f66f9a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 29 10:40:18 2009 +1030 + + PDF: Don't specify colorspace in JPEG2000 image dictionary + + PDF uses the colorspace specified in the JPEG2000 image. + + src/cairo-pdf-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit d58560bda8361bd25f1b2207ecfab4b331601045 +Author: Benjamin Otte <otte@gnome.org> +Date: Fri Nov 27 21:04:55 2009 +0100 + + Satisfy make check + + src/cairo-stroke-style.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 16fffc5c05857896c03decdcebff7f1b5e582390 +Author: Benjamin Otte <otte@gnome.org> +Date: Fri Nov 27 18:13:45 2009 +0100 + + Apply device transform in surface wrapper + + src/cairo-surface-wrapper.c | 56 +++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 46 insertions(+), 10 deletions(-) + +commit 02d7e123d640d62db46ef03d7faecbc7598444e1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Nov 27 23:11:56 2009 +1030 + + PDF: Remove extraneous \n from end of jpeg/jp2 data + + PDF requires a '\n' between the end of stream data and the "endstream" + that is not included in the stream length. Ensure this is always added + in _close_stream where it is not included in the stream length. + + Previously the jpeg/jp2 embedding functions were adding the '\n'. This + resulted in the '\n' becoming part of the stream data. + + src/cairo-pdf-surface.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 4fc7bdaed651a5c19eb89dddd88808468e0e7eb8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 26 21:14:20 2009 +1030 + + PS: Add some missing pdf-operators flushes + + src/cairo-ps-surface.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 3f0c9afa9760a90065c67927c63770f9bb8abe99 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 25 15:57:46 2009 +0100 + + [clip] Don't ignore outermost clip when it clips everything + + Fixes testcases clip-stroke-no-op and clip-fill-no-op added in + 0d8a04ef47426d87c7932f308a831e36b4ef7683 + + src/cairo-clip.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 0d8a04ef47426d87c7932f308a831e36b4ef7683 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 25 10:48:39 2009 +0000 + + test: Add cases to exercise clipping after no-ops + + Whilst investigating: + + Bug 31788: SVG <line> with y1 == y2 and both with fractional + part don't render + https://bugs.webkit.org/show_bug.cgi?id=31788 + + I found that it can be reduced to a no-op clip following a no-op stroke + or fill. These conditions are exercised here and are shown to be a bug + introduced in the 1.9.x development series. + + test/Makefile.am | 2 ++ + test/Makefile.sources | 2 ++ + test/clip-fill-no-op.c | 66 +++++++++++++++++++++++++++++++++++++++++ + test/clip-fill-no-op.ref.png | Bin 0 -> 152 bytes + test/clip-stroke-no-op.c | 66 +++++++++++++++++++++++++++++++++++++++++ + test/clip-stroke-no-op.ref.png | Bin 0 -> 152 bytes + 6 files changed, 136 insertions(+) + +commit 26e9f149063b9e1fdb54fc54fccbefdf04a68190 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 10 23:09:56 2009 +0100 + + Improve stroking of densely dashed styles + + Add some auxiliary functions to cairo-stroke-style to compute + properties of the dashed patterns (period, "on" coverage) and to + generate approximations when the dash pattern is sub-tolerance. + These functions are used in cairo-path-stroke to simplify dash + patterns stroked by cairo. + Fixes dash-infinite-loop + See http://bugs.freedesktop.org/show_bug.cgi?id=24702 + + src/cairo-path-stroke.c | 24 +++++++--- + src/cairo-stroke-style.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 20 ++++++++ + 3 files changed, 157 insertions(+), 6 deletions(-) + +commit 9c24288c820069e80b0feb5e99ece4c89e92c0c6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 11 00:09:08 2009 +0100 + + Revert "[test] Reorder dash-infinite-loop to not hit a runaway allocation." + + The infinite loop problem in _cairo_stroker_dash_start is solved by + commit ee02f3484899527380df94c00f40da87f41660ea, so hitting that + problem is not possible anymore and dash-infinite stroke always + hit the memory intensive loops. + This reverts commit 29432d3d32bc84ec4a2e1815a84e4ac2089138fe. + + test/dash-infinite-loop.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cc2d2630669b084ec43e415d2806d94af00cf56c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 10 22:58:59 2009 +0100 + + Improve stroke offset computation + + The stroke offset was forced to be positive because stroking code + wants to be able to decrement it until it finds the first dash to be + drawn. This can lead to long (almost infinite) loops if the offset is + positive but huge compared to the total length of the dash pattern. + Computing the offset this way guarantees that it's always the smallest + non-negative equivalent offset. + + src/cairo-gstate.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit e436a57c22f2c2a87404cac27e2d5e3c404f8bf9 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 10 13:29:28 2009 +0100 + + Fix odd length dashing with negative offset + + When computing an equivalent offset, a wrong total dash length was + used when the dash elements were odd and more than 1. + Doubling the total dash length whenever they are odd is needed to + correctly compute the new offset. + Fixes dash-offset. + + src/cairo-gstate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b1a76394655793fd698a1281b00a3d049f9e70f5 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 10 13:09:50 2009 +0100 + + Add dash-offset test + + Stroking a dash pattern of odd length with a negative offset is broken + (except when the pattern is composed by a single dash). + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/dash-offset.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++ + test/dash-offset.ref.png | Bin 0 -> 794 bytes + 4 files changed, 97 insertions(+) + +commit 7d8788b4ba5ae335a7bb77bd09e7ebd20376f632 +Author: Robert O'Callahan <robert at ocallahan.org> +Date: Mon Nov 9 18:58:59 2009 +0100 + + [quartz] Cleanup fallback source + + Remove the transformation code as it's useless and confusing. + The clipbox was transformed in a wrong way if the CTM + was not the base one, otherwise the transformation did nothing. + As long as _cairo_quartz_setup_fallback_source is only called + with the base CTM, no transformation needs to be performed on the + clipbox. + Patch by Robert O'Callahan, see Mozilla bug #507939. + + src/cairo-quartz-surface.c | 9 --------- + 1 file changed, 9 deletions(-) + +commit 248090e52b02f2b2dc424c6073489df32632b9d1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 9 21:38:00 2009 +0100 + + [quartz] Fix compositing operators + + Fallback on SATURATE (since quartz doesn't support it) and on + blending operators (to be implemented using CGContextSetBlendMode, + after its availability has been assessed). + Workaround the different behaviour of quartz operators on alpha + masks. + Fixes text in clip-operator and clip-text, blend modes in + extended-blend, extended-blend-alpha, saturate in operator, + operator-alpha and surface-pattern-operator. + Changes the output of operator-alpha-alpha, but to really fix it + pure-alpha surfaces needs to be treated as alpha masks and not as + greyscale images. + + src/cairo-quartz-surface.c | 182 ++++++++++++++++++++++++++++++++++----------- + 1 file changed, 140 insertions(+), 42 deletions(-) + +commit d44414191a685a23fd48bb32826366dfd113e1e5 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 9 14:21:40 2009 +0100 + + [quartz] Fix source-unbounded compositing of surface sources + + Surface sources were not respecting EXTEND_NONE when composited + because the part outside of the surface rectangle was not changed. + To correctly extend the source, it's sufficient to composite a + transparent rectangle with a hole in the region covered by the surface. + Fixes clip-unbounded and operator-source. Changes the output of + surface-pattern-operator. + + src/cairo-quartz-surface.c | 62 +++++++++++++++++++++------------------------- + 1 file changed, 28 insertions(+), 34 deletions(-) + +commit 7ef611a67a2a68d0a50e2191804a8ef137c78b33 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 9 20:17:35 2009 +0100 + + [quartz] Fix stroking with unbounded operator + + Stroking was not fixed up correctly when the stroke trasform + was not the identity and when the stroked path was dashed. + Instead of building a mask image and clearing through it + (forgetting to use the CTM and the dash setting), the code now + simply fills the outside of the stroke with tranparent black. + Additionally this commit moves the CTM composition so that the invocation + of _cairo_quartz_setup_source is always done with the base CTM. + This commit changes the result of clip-stroke-unbounded (the clip + mask is now correctly aligned to the stroked path). + + src/cairo-quartz-surface.c | 36 +++++++++++++----------------------- + 1 file changed, 13 insertions(+), 23 deletions(-) + +commit 577ac4fc6d810cae7ff6d460fdea1886cd97258c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 9 14:24:13 2009 +0100 + + [quartz] Fix implied colour of alpha-only surface sources + + If a fill colour was set, an alpha-only surface source would + have used that colour instead of black. + + src/cairo-quartz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8b25e4a7fd839ac399d14460d2596037134c9801 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Oct 19 18:38:57 2009 +0200 + + [quartz] Improve unbounded operators fixup + + Don't allocate a colorspace and use a 16-bytes aligned stride and + an alpha-only image for the rendering of the fixup mask. + + src/cairo-quartz-surface.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit ed8bdcd59863964a3eb9c49ca1a9bfd5f544350c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Oct 19 17:33:10 2009 +0200 + + [quartz] Improve A8 image handling + + A8 images were cosidered grayscale, whereas they should behave like + transparency mask. They are now alpha-only images and the stride is + 16-bytes aligned, as suggested. + Fixes alpha-similar and mask-transformed-similar. Makes the patterns + behave (as expected) as masks in surface-pattern-operator. + Affects the output of operator-alpha-alpha, but the result is not + correct because of wrong compositing. + + src/cairo-quartz-surface.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +commit b32695c248b08289ce431d5f2fdab5205219c203 +Author: Robert O'Callahan <robert at ocallahan.org> +Date: Tue Oct 20 16:07:52 2009 +0200 + + [quartz] Fix gradient pattern painting + + CTM was changed and not restored when painting gradients. + Fixes the alignment of surface patterns in surface-pattern-operator. + Patch by Robert O'Callahan, see Mozilla bug #507939. + + src/cairo-quartz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1ce096657b2d38956e3229042f87aea42b0d0d8c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 3 22:51:29 2009 +0100 + + Fix compilation on MacOS X + + Enable "ld_preload" (DYLD_INSERT_LIBRARIES + DYLD_FORCE_FLAT_NAMESPACE) + and build cairo-trace as a library instead of a module to make it + work also on MacOS X. + + configure.ac | 17 ++++++++++++++++- + util/cairo-trace/Makefile.am | 22 +++++++++++----------- + util/cairo-trace/cairo-trace.in | 6 +++++- + util/cairo-trace/trace.c | 2 +- + 4 files changed, 33 insertions(+), 14 deletions(-) + +commit c181f9e9aeac375eed07aaab58d177e3476d5117 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Nov 7 19:29:30 2009 +0100 + + Add new operator-alpha-alpha test + + Compositing of alpha-only sources is not throughly tested and + as a consequence the misbehaviour of some backends is not + shown by the test suite. + + [ickle: Added XFAILs for pdf, ps, svg.] + + src/cairo-xcb-surface.c | 4 - + test/Makefile.am | 4 + + test/Makefile.sources | 1 + + test/operator-alpha-alpha.c | 166 ++++++++++++++++++++++++++++++++ + test/operator-alpha-alpha.pdf.xfail.png | Bin 0 -> 3749 bytes + test/operator-alpha-alpha.ps.xfail.png | Bin 0 -> 1338 bytes + test/operator-alpha-alpha.ref.png | Bin 0 -> 3441 bytes + test/operator-alpha-alpha.svg.xfail.png | Bin 0 -> 838 bytes + 8 files changed, 171 insertions(+), 4 deletions(-) + +commit cee3a6169bdf7f64c126c487b443dcb7a9f0586a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 8 21:52:06 2009 +1030 + + Type1-subset: Append "cleartomark" operator for binary fonts that don't include it + + Type 1 fonts embedded in PDF may omit the fixed-content portion of the + font that contains the "cleartomark" operator. + + src/cairo-type1-subset.c | 22 +++++++++++++++------- + 1 file changed, 15 insertions(+), 7 deletions(-) + +commit d962d6bae2681ea1f3c9533a83c8902d76e81c6a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 8 21:46:16 2009 +1030 + + PDF: Include Type 1 fixed-content portion in the embedded font + + Some fonts may contain additional PostScript code after the + cleartomark. + + src/cairo-pdf-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ac59c7580894fc5fd424f7f6f8c1532d15048566 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 8 21:38:58 2009 +1030 + + Type1-subset: Check for binary eexec data + + Type 1 fonts embedded in PDF have the the encrypted portion in binary + but the existing check for binary only works for Type 1 fonts in PFB + format. + + Add an additional check based on the first 4 characters of eexec data. + The Type 1 specification gurantees that at least one of the first 4 + bytes of ciphertext is not an ASCII Hex character. + + src/cairo-type1-subset.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit a4a59be600cbe17f43afa20422f9d05f3a5d5b52 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 7 14:36:49 2009 +1030 + + Type 1 subset: Don't add a new line when in binary mode + + At the end of the private dictionary a new line is appended so that + the trailing zeros will not exceed 80 columns. In hex mode (used for + PS embedding) extra white space is harmless as it is ignored when + parsing the ascii hex encoded data. But in binary mode (used for PDF + embedding) the new line must not be added as it corrupts the binary + data. + + https://bugs.launchpad.net/ubuntu/+source/cups/+bug/419143 + + src/cairo-type1-subset.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 9775f44436ffaf54931614d1867bcb7d147acd06 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 5 10:13:34 2009 +0000 + + AUTHORS: Add Andrea Canciani + + AUTHORS | 1 + + 1 file changed, 1 insertion(+) + +commit d51915f873da8d40740a908c86f02e972e358be9 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 4 16:15:48 2009 +0100 + + xlib: Fix double free + + Both _cairo_xlib_call_close_display_hooks and _cairo_xlib_screen_destroy + invoke _cairo_xlib_screen_close_display, which frees all the cached + GCs, but (if HAS_ATOMIC_OPS is undefined) doesn't mark them as freed, + thus freeing them agin upon the second invocation. + + src/cairo-xlib-screen.c | 1 + + 1 file changed, 1 insertion(+) + +commit 7c1424a315b677ca119d11b7ced1d4c969dde568 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 18 08:59:33 2009 +0200 + + quartz: Fix compilation + + The function _cairo_image_surface_create_for_content does not exist. + The correct name of the function is instead _cairo_image_surface_create_with_content. + + src/cairo-quartz-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8a10c25c3f4036d17e24852e7dc970fa06fcb4af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 5 10:02:54 2009 +0000 + + test: Tweak Benjamin's xcomposite-projection + + Include Benjamin's advice on how to make the bug more visible inline + with the code. + + test/xcomposite-projection.c | 69 ++++++++++++++++++++++++++++++-------------- + 1 file changed, 48 insertions(+), 21 deletions(-) + +commit a9f37953c71e16f65122097462e51b035783a965 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 4 13:59:58 2009 +0100 + + [xlib] Use correct number when checking if points are out of range + + src/cairo-xlib-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit aa1f245ea313a2f1f0dda3994f5b48073b0c385d +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 4 13:56:15 2009 +0100 + + [test] Add "target=raster" to test + + The test isn't useful on vector backends and fails there due to + antialiasing issues. + + test/xcomposite-projection.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 52afe9c77f2f54372fefeca50321a27e8dda0f63 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 4 11:15:57 2009 +0100 + + [xlib] Fix new Composite test + + When the reference point was tirggering _line_exceeds_16_16() and got + adjusted, the code failed to compute the srcX and srcY arguments for the + call to XRenderCompositeTrapezoids() correctly and caused the resulting + source image to be misaligned. + + src/cairo-fixed-private.h | 9 +++++++++ + src/cairo-xlib-surface.c | 22 +++++++++++----------- + 2 files changed, 20 insertions(+), 11 deletions(-) + +commit 84bbf179c375622d2c7b4e21b1b8ce189b5a18f2 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Nov 4 11:06:57 2009 +0100 + + [test] Add a test exposing bugs in XRenderComposite + + This test fills a slightly rotated surface slightly above the 0 line. + This hits some corner cases in the XRenderComposite path. + I discovered these issues while playing with video rendering onto the + canvas in HTML5 (both Webkit and Mozilla have this problem). + I used CAIRO_ANTIALIAS_NONE and a single-color source in the test to get + rid of aliasing issues in the output images. This makes some issues + slightly less visible, but still fails for all of them. If you want to + get a clearer view, disable it and use romedalen.png instead - it has + the same size as the red surface. + + (At least) 3 bugs are at work here: + - if _line_exceeds_16_16() triggers for the reference point, the + source surface will be misaligned. + - the intel driver seems to have an off-by-one bug on my i945 when + positioning the source surface, causing black seams at the top + (not visible in the test unless using romedalen.png) and on the left + of the image. + - My Xvfb fails completely in picture up/download in the xlib-fallback + path. + + test/Makefile.sources | 1 + + test/xcomposite-projection.c | 81 +++++++++++++++++++++++++++++++++++++ + test/xcomposite-projection.ref.png | Bin 0 -> 1112 bytes + 3 files changed, 82 insertions(+) + +commit 9b42b6156d9916e64e19f2ccb0b43f4d1df72e79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 2 12:50:45 2009 +0000 + + build: Add -pthread to real_pthread_CFLAGS + + build/configure.ac.system | 12 +++++++++++ + configure.ac | 51 ++++++++++++++++++++--------------------------- + 2 files changed, 34 insertions(+), 29 deletions(-) + +commit 3eecf2f60c85e0195360ff3c3a54d58ceaa4a6f1 +Author: Benjamin Otte <otte@gnome.org> +Date: Mon Nov 2 13:20:25 2009 +0100 + + sphinx: Add required pthread libs + + Try again, this time for real hopefully. + + configure.ac | 2 +- + util/cairo-sphinx/Makefile.am | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 837eb577b4707e447fafb0dfca378ecf4ea3fda5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 2 11:56:29 2009 +0000 + + sphinx: Add required pthread libs + + Switching to pthread-stubs broke the build for sphinx on unbroken + platforms [those that do not unnecessarily link against -lpthreads]. + + configure.ac | 7 +++++++ + util/cairo-sphinx/Makefile.am | 5 +++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit 942a15ba9e85fa3297ad6e65270928ad3c1c0a42 +Author: Benjamin Otte <otte@gnome.org> +Date: Mon Nov 2 12:51:14 2009 +0100 + + [test] Update upscale test to expose an Xlib failure + + By filling the background with grey, we can see that Xlib fills areas + with black that it shouldn't. Xlib therefore now fails this test. + + test/surface-pattern-scale-up.c | 4 +++- + test/surface-pattern-scale-up.pdf.ref.png | Bin 2793 -> 3482 bytes + test/surface-pattern-scale-up.ps2.ref.png | Bin 943 -> 913 bytes + test/surface-pattern-scale-up.ps3.ref.png | Bin 943 -> 913 bytes + test/surface-pattern-scale-up.ref.png | Bin 4061 -> 4017 bytes + 5 files changed, 3 insertions(+), 1 deletion(-) + +commit 19c411a5b8b84d31516d9c85642ad55ef5d29aba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 30 07:58:45 2009 +0000 + + path: Skip any secondary degenerate line-to segments. + + Only the very first line-to following a move-to can have any + significance if degenerate whilst stroking, so skip all others. + In other words, + + 0 0 m 0 0 l stroke + + produces a capped degenerate path (i.e a dot), + + 0 0 m 0 0 l 0 0 l stroke + + produces the same degenerate stroke, and + + 0 0 m 0 0 l 1 0 l stroke + + produce a horizontal line. + + src/cairo-path-fixed.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 23bcf91748c4bb04c16e503b913da3bfc237463f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 30 07:49:56 2009 +0000 + + path: Misclassification of rectilinear after degenerate line-to + + Malte Nuhn reported hitting an assertion: + + cairo-path-stroke.c:1816: _cairo_rectilinear_stroker_line_to: Assertion `a->x == b->x || a->y == b->y' failed. + http://bugs.freedesktop.org/show_bug.cgi?id=24797 + + when stroking an apparently simple path: + + 0 8.626485 m + 0 8.626485 l + 5.208333 2.5 l + 10.416667 2.5 l + 15.625 2.5 l + 20.833333 2.5 l + 26.041667 2.5 l + 31.25 2.5 l + 36.458333 2.5 l + 41.666667 2.5 l + 46.875 2.5 l + 52.083333 2.5 l + 57.291667 2.5 l + 62.5 2.5 l + 67.708333 2.5 l + 72.916667 2.5 l + 78.125 2.5 l + 83.333333 2.5 l + 88.541667 2.5 l + 93.75 2.5 l + 98.958333 2.5 l + 104.166667 2.5 l + 109.375 2.5 l + 114.583333 2.5 l + 119.791667 2.5 l + 125 2.5 l + stroke + + which upon reduction becomes: + + 0.000000 8.625000 m 5.207031 2.500000 l 125.000000 2.500000 l stroke + + The bug is that after spotting a repeated line-to we move the previous + end-point without reclassifying the path, hence we miss the + non-rectilinear step. + + src/cairo-path-fixed.c | 101 +++++++++++++++++++++++++------------------------ + 1 file changed, 52 insertions(+), 49 deletions(-) + +commit 600dd833983bd85bf8aea487393ce156abb622bd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 28 19:14:46 2009 +0930 + + Provide a builtin implementation of isspace() and isdigit() + + The glibc versions are slow in utf8 locales. + + src/cairo-output-stream.c | 7 +++---- + src/cairo-pdf-operators.c | 6 ++---- + src/cairo-type1-subset.c | 16 +++++++--------- + src/cairoint.h | 16 ++++++++++++++++ + 4 files changed, 28 insertions(+), 17 deletions(-) + +commit f571356d346565cae34f08d12c584c4bd40921d6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 27 20:27:09 2009 +0000 + + xlib: Set has_component_alpha = FALSE for gradient Pictures + + Whilst creating the xlib surface wrapper for gradient Pictures, the + corresponding attributes require ComponentAlpha disabled. + + src/cairo-xlib-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 1a80cd2aa00b232a9a2192a85d6264e44ffcbd69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 26 11:05:38 2009 +0000 + + scaled-font: Fix documentation examples with incorrect derefs + + Bug 24730 -- New: misleading use cases in cairo_scaled_font_text_to_glyphs's docs + http://bugs.freedesktop.org/show_bug.cgi?id=24730 + + An apparent copy'n'paste error from the code which has to deal with + indirect pointers crept into the documentation for the same functions. + + src/cairo-scaled-font.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit f648fcd2f91ea5c9ec318c2c0573ee82ac8c0ac9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 26 11:02:16 2009 +0000 + + gitignore: Add forgotten cairo-perf-print + + perf/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 6911ba2f76d4ccdf228c029e2719461a72848824 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 26 11:01:01 2009 +0000 + + perf: Fix comparisons + + The sort order was unstable resulting in incorrect ordering dependent + upon libc version. + + perf/cairo-perf-diff-files.c | 22 +++++++++++++++------- + 1 file changed, 15 insertions(+), 7 deletions(-) + +commit f955a4cba7784f97ef1dd978158e98176e03baf0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 25 11:04:17 2009 +0000 + + wideint: Protect 64_32_div for non-HAVE_UINT16_T systems + + Peter Clifton spotted that we failed to properly wrap + _cairo_int64_32_div() for systems without a native 64 bit type. + + src/cairo-wideint-private.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c701d7813b6d116c9db53f63f791928a407499c7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 23 14:42:48 2009 +0100 + + [pattern] Compute zero extents for empty patterns + + If the pattern is for example a repeating 0x0 image, then treat it as + having zero extents. + + This should workaround the bug presented here: + + https://bugs.freedesktop.org/show_bug.cgi?id=24693 + Attached PDF crashes evince with a Floating point exception + + src/cairo-pattern.c | 27 ++++++++++++++++++++++++--- + 1 file changed, 24 insertions(+), 3 deletions(-) + +commit 43a775f60da57206b194039cd5d8b6a735284c45 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Oct 22 02:13:36 2009 +0300 + + [meta] Rename cairo_meta_surface_t to cairo_recording_surface_t. + + The new name is more descriptive than the rather opaque meta surface. + Discussed with vigour on the mailing list and #cairo: + + http://lists.cairographics.org/archives/cairo/2009-July/017571.html + + NEWS | 7 + + boilerplate/Makefile.win32.features | 14 +- + boilerplate/cairo-boilerplate-pdf.c | 6 +- + boilerplate/cairo-boilerplate-ps.c | 8 +- + boilerplate/cairo-boilerplate-svg.c | 8 +- + boilerplate/cairo-boilerplate-test-surfaces.c | 2 +- + boilerplate/cairo-boilerplate-win32-printing.c | 2 +- + boilerplate/cairo-boilerplate.c | 46 +- + boilerplate/cairo-boilerplate.h | 2 +- + build/Makefile.win32.features-h | 2 +- + configure.ac | 2 +- + doc/public/tmpl/cairo-surface.sgml | 2 +- + perf/cairo-perf-micro.c | 4 +- + perf/cairo-perf-trace.c | 4 +- + src/Makefile.sources | 4 +- + src/Makefile.win32.features | 14 +- + src/cairo-analysis-surface.c | 48 +- + src/cairo-meta-surface-private.h | 171 --- + src/cairo-meta-surface.c | 1096 -------------------- + src/cairo-paginated-private.h | 6 +- + src/cairo-paginated-surface-private.h | 4 +- + src/cairo-paginated-surface.c | 92 +- + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 56 +- + src/cairo-ps-surface.c | 42 +- + src/cairo-recording-surface-private.h | 171 +++ + src/cairo-recording-surface.c | 1096 ++++++++++++++++++++ + src/cairo-scaled-font.c | 28 +- + src/cairo-script-surface.c | 42 +- + src/cairo-script.h | 4 +- + src/cairo-surface.c | 58 +- + src/cairo-svg-surface.c | 46 +- + src/cairo-tee-surface.c | 6 +- + src/cairo-type3-glyph-surface.c | 14 +- + src/cairo-types-private.h | 2 +- + src/cairo-user-font.c | 42 +- + src/cairo-vg-surface.c | 10 +- + src/cairo-win32-printing-surface.c | 60 +- + src/cairo-xml-surface.c | 32 +- + src/cairo-xml.h | 4 +- + src/cairo.c | 2 +- + src/cairo.h | 20 +- + src/cairoint.h | 12 +- + test/Makefile.am | 32 +- + test/Makefile.sources | 2 +- + test/cairo-test-trace.c | 48 +- + test/cairo-test.c | 6 +- + test/meta-surface-pattern.c | 121 --- + test/meta-surface-pattern.gl.argb32.ref.png | Bin 3130 -> 0 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 3908 -> 0 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 3760 -> 0 bytes + test/meta-surface-pattern.ps2.argb32.ref.png | Bin 3257 -> 0 bytes + test/meta-surface-pattern.ps2.rgb24.ref.png | Bin 3873 -> 0 bytes + test/meta-surface-pattern.ps3.argb32.ref.png | Bin 3257 -> 0 bytes + test/meta-surface-pattern.ps3.rgb24.ref.png | Bin 3873 -> 0 bytes + test/meta-surface-pattern.quartz.ref.png | Bin 4572 -> 0 bytes + test/meta-surface-pattern.quartz.rgb24.ref.png | Bin 4063 -> 0 bytes + test/meta-surface-pattern.ref.png | Bin 3072 -> 0 bytes + test/meta-surface-pattern.rgb24.ref.png | Bin 3162 -> 0 bytes + test/meta-surface-pattern.svg.argb32.ref.png | Bin 3778 -> 0 bytes + test/meta-surface-pattern.svg.rgb24.ref.png | Bin 3760 -> 0 bytes + test/recording-surface-pattern.c | 121 +++ + test/recording-surface-pattern.gl.argb32.ref.png | Bin 0 -> 3130 bytes + test/recording-surface-pattern.pdf.argb32.ref.png | Bin 0 -> 3908 bytes + test/recording-surface-pattern.pdf.rgb24.ref.png | Bin 0 -> 3760 bytes + test/recording-surface-pattern.ps2.argb32.ref.png | Bin 0 -> 3257 bytes + test/recording-surface-pattern.ps2.rgb24.ref.png | Bin 0 -> 3873 bytes + test/recording-surface-pattern.ps3.argb32.ref.png | Bin 0 -> 3257 bytes + test/recording-surface-pattern.ps3.rgb24.ref.png | Bin 0 -> 3873 bytes + test/recording-surface-pattern.quartz.ref.png | Bin 0 -> 4572 bytes + .../recording-surface-pattern.quartz.rgb24.ref.png | Bin 0 -> 4063 bytes + test/recording-surface-pattern.ref.png | Bin 0 -> 3072 bytes + test/recording-surface-pattern.rgb24.ref.png | Bin 0 -> 3162 bytes + test/recording-surface-pattern.svg.argb32.ref.png | Bin 0 -> 3778 bytes + test/recording-surface-pattern.svg.rgb24.ref.png | Bin 0 -> 3760 bytes + test/scale-offset-similar.meta.xfail.png | Bin 10752 -> 0 bytes + test/scale-offset-similar.recording.xfail.png | Bin 0 -> 10752 bytes + util/cairo-fdr/fdr.c | 8 +- + util/cairo-sphinx/sphinx.c | 38 +- + util/cairo-trace/trace.c | 10 +- + util/trace-to-xml.c | 4 +- + 81 files changed, 1845 insertions(+), 1838 deletions(-) + +commit df357f26ff72571acb840715efa4930054d4fdbe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 16 16:48:54 2009 +0100 + + Support component-alpha. + + Within our code base we carried a few hacks to utilize the component + alpha capabilities of pixman, whilst not supporting the concept for our + own masks. Thus we were setting it upon the pixman_image_t that we + passed around through code that was blissfully unaware and indeed the + component-alpha property was forgotten (e.g. upgrading glyph masks). + + The real issue is that without explicit support that a pattern carries + subpixel masking information, that information is lost when using that + pattern with composite. Again we can look at the example of compositing + a sub-pixel glyph mask onto a remote xlib surface for further failure. + + src/cairo-ft-font.c | 5 --- + src/cairo-gl-glyphs.c | 23 ++++++++++--- + src/cairo-gl-surface.c | 18 ++++++---- + src/cairo-gstate.c | 17 ++++++---- + src/cairo-image-surface.c | 55 +++++++++++++++++++++++-------- + src/cairo-pattern.c | 22 ++++++++++--- + src/cairo-pdf-surface.c | 10 ++++-- + src/cairo-scaled-font.c | 14 ++++---- + src/cairo-svg-surface.c | 10 ++++-- + src/cairo-types-private.h | 71 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-win32-font.c | 10 +++--- + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 43 +++++++++++++++++++----- + src/cairoint.h | 69 +------------------------------------- + 14 files changed, 234 insertions(+), 134 deletions(-) + +commit f0cd20e6cec445eb627c2708c2230c8bad1b64ce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 21 10:36:27 2009 +0100 + + [gl] Do not clear internal surfaces. + + Create a scratch surface that will be initialised as required for + internal use. External surfaces, i.e. those returned to the user, are + cleared as normal. + + src/cairo-gl-surface.c | 46 +++++++++++++++++++++++++++++++--------------- + 1 file changed, 31 insertions(+), 15 deletions(-) + +commit 7c9ebd4a852ad709e57ed48b9610db00de79de7e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 21 09:04:30 2009 +0100 + + Make the surface->is_clear logic common + + A nasty surprise whilst profiling is that performing redundant clear + operations is extremely painful. We can mitigate this somewhat by + tracking the cleared state of surfaces and skipping repeated attempts to + clear a surface. + + src/cairo-gl-surface.c | 2 ++ + src/cairo-image-surface.c | 47 +++----------------------------- + src/cairo-surface-private.h | 6 +++-- + src/cairo-surface.c | 66 ++++++++++++++++++++++++++++++++++++++++----- + src/cairoint.h | 1 - + 5 files changed, 68 insertions(+), 54 deletions(-) + +commit 723055722f1d9a133fe9e78bb19165f2c7be720e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 21 10:40:51 2009 +0100 + + [doc] Add comments on when surfaces are cleared on construction. + + Or perhaps, more importantly, when the contents are left unmodified. + + src/cairo.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit cef8194178b01eaa2d10c1ba8291a9a4c5a6d302 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 20 14:37:28 2009 +0200 + + [test] Add surface-pattern-operator + + Test the results of compositing ALPHA and COLOR_ALPHA surfaces + with different operators. + + test/Makefile.am | 4 + + test/Makefile.sources | 1 + + test/surface-pattern-operator.argb32.ref.png | Bin 0 -> 5217 bytes + test/surface-pattern-operator.c | 117 ++++++++++++++++++++++ + test/surface-pattern-operator.rgb24.ref.png | Bin 0 -> 1942 bytes + test/surface-pattern-operator.xlib.argb32.ref.png | Bin 0 -> 5171 bytes + test/surface-pattern-operator.xlib.rgb24.ref.png | Bin 0 -> 1913 bytes + 7 files changed, 122 insertions(+) + +commit 710303ef15b9a1bf73b2b07b7aa51ec816d0aa07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 19 10:42:51 2009 +0100 + + [test] Update rotate-image-surface-paint + + Update this test case so the background is not the default border colour + so that we spot when the backend pads out the transformed image surface. + + test/Makefile.am | 5 +- + test/rotate-image-surface-paint.c | 78 ++++++++++++++------------ + test/rotate-image-surface-paint.pdf.xfail.png | Bin 217 -> 358 bytes + test/rotate-image-surface-paint.ps.ref.png | Bin 0 -> 236 bytes + test/rotate-image-surface-paint.ps2.ref.png | Bin 212 -> 0 bytes + test/rotate-image-surface-paint.ps3.ref.png | Bin 212 -> 0 bytes + test/rotate-image-surface-paint.ref.png | Bin 191 -> 220 bytes + test/rotate-image-surface-paint.svg.xfail.png | Bin 0 -> 387 bytes + 8 files changed, 45 insertions(+), 38 deletions(-) + +commit ea39f0302a936711043aa6834ba0ab487736572b +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Mon Oct 19 22:21:00 2009 +0800 + + atomic: correct libatomic_ops version of _cairo_atomic_int_cmpxchg + + AO_compare_and_swap_full() doesn't have the same semantic as + _cairo_atomic_int_cmpxchg(). The former returns a TRUE on success + FALSE otherwise while the later returns the atomic value. + + src/cairo-atomic-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a2254e56474fcdf5f25232812cdbef30a2b5ea60 +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Oct 18 22:12:13 2009 +0200 + + [gstate] Apply target device offsets to patterns immediately + + Previously target device offsets were applied in cairo-surface.c which + could cause bugs when paths were taken as fallbacks, as for example + pointed out by ade55037ffa596b690c6a1051394589f76eb1f48 and quick-fixed + by 79190d89853958ee8252440d35a662fabf122afd. The quick-fix is now + unnecessary and was removed. + + src/cairo-gstate.c | 4 +++ + src/cairo-surface-fallback.c | 41 +++++------------------------- + src/cairo-surface.c | 59 -------------------------------------------- + 3 files changed, 10 insertions(+), 94 deletions(-) + +commit 4b720d56db72d314b3b7cedb05a53321b1d0adbe +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Oct 18 21:32:10 2009 +0200 + + [clip] Remove non-existing functions from header + + src/cairo-clip-private.h | 9 --------- + 1 file changed, 9 deletions(-) + +commit cacf9ccedffa0c804a56c76c8ab17bf81831b621 +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Oct 18 21:30:22 2009 +0200 + + [path] Fix compiler warnings + + src/cairo-path-fill.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit a70705b2ede8c0dc401f28405641e70f8a6d8d92 +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Oct 18 21:30:06 2009 +0200 + + [xlib] Fix compiler warnings + + src/cairo-xlib-screen.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 96117c1212be2bf39a300a212dec85466f49f31e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 17 10:36:10 2009 +0100 + + [test] Add radial-gradient-source + + ranma42 found a bug in compositing with a radial gradient using the + SOURCE operator with EXTEND_NONE, as exercised here. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/radial-gradient-source.argb32.ref.png | Bin 0 -> 272428 bytes + test/radial-gradient-source.c | 115 +++++++++++++++++++++++++++++ + test/radial-gradient-source.rgb24.ref.png | Bin 0 -> 193364 bytes + 5 files changed, 118 insertions(+) + +commit 54df07a3da2bfbbdbe2dde92ca298ac0d7b8d255 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 16 10:11:41 2009 +0100 + + [surface] Don't AND in the desired content. + + Gah, that was a horrible mistake. It was a flawed hack to create Pixmaps + of the correct depth when cloning patterns for blitting to the xlib + backend. However, it had the nasty side-effect of discarding alpha when + targeting Window surfaces. The correct solution is to simply correct the + Pixmap of the desired depth and render a matching pattern onto the + surface - i.e. a reversal the current acquire -> clone. See the + forthcoming revised xcb backend on how I should have done it originally. + + src/cairo-directfb-surface.c | 2 -- + src/cairo-gl-surface.c | 4 +--- + src/cairo-glitz-surface.c | 3 --- + src/cairo-image-surface.c | 4 ---- + src/cairo-pattern.c | 15 +++------------ + src/cairo-quartz-surface.c | 1 - + src/cairo-surface-fallback-private.h | 1 - + src/cairo-surface-fallback.c | 3 +-- + src/cairo-surface.c | 14 ++++---------- + src/cairo-xlib-surface.c | 18 +----------------- + src/cairoint.h | 4 ---- + src/test-fallback-surface.c | 1 - + src/test-fallback16-surface.c | 2 -- + 13 files changed, 10 insertions(+), 62 deletions(-) + +commit 6a19a82efd3afe8fb8bd30e5362b247de8efe159 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 16 08:43:21 2009 +0100 + + [image] Clone the format for a similar surface with identical content + + Honour the incoming surface format when we are asked to create a similar + surface with identical content. The goal of + cairo_surface_create_similar() is to create an intermediate with similar + characteristics to the original that can be used in place of the + original and be quick to copy to the original. Matching the format for + the same content, ensures that the blits between the two need only be a + memcpy. + + src/cairo-image-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit ed94d7caad6b851f6f80fa4d67441ad0387a8cd4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 16 08:38:24 2009 +0100 + + [fallback] Create intermediate surface with same content. + + The goal is to create a similar surface with an identical format to + maximise performance in the subsequent blit, e.g. the xlib backend could + make the similar surface with an identical depth and so use the core + protocol, or the image surface could indeed make an identical copy so + that pixman only has to do a fast memcpy. As there is no direct method + to specify such a clone, we ask the backend for a similar surface of + identical content, and trust that the semantics are clear enough for the + intent to obvious. + + src/cairo-surface-fallback.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit c739940137c4ffc6cc727ea30afc0e92f7ab1e80 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 15 16:24:44 2009 -0700 + + Increment version to 1.9.5 + + Just after the 1.9.4 snapshot. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad6334b9870c63e641b531d6e910c084b587d0f9 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 15 15:33:20 2009 -0700 + + Add mising images to REFERENCE_IMAGES list. + + Again, the kind of thing that only gets fixed at release time. + But at least we have a nice test for this. + + test/Makefile.am | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit cdad5e10768978b11088f82858a1e6e0037dc0a7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 15 14:58:39 2009 -0700 + + Mark in-fill-empty-trapezoid as an XFAIL test. + + Otherwise, it was disrupting my attempts to release a snapshot, (since + it doesn't respect CAIRO_TEST_TARGET=" " and not run like most of the + tests do). + + test/Makefile.am | 5 +++++ + test/in-fill-empty-trapezoid.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit b0f309abb33fb7e068199c941835af0217d8d1fc +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 15 14:40:22 2009 -0700 + + Update version to 1.9.4 + + In preparation for the 1.9.4 snapshot. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b113275f8b081685227fc073c03f64bb1a229d3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 15 14:17:30 2009 -0700 + + Remove stale references to non-existant reference images. + + This is just one of those things that we don't get right until + someone tries running "make distcheck". + + test/Makefile.am | 7 ------- + 1 file changed, 7 deletions(-) + +commit 37078b262a268179f8b7a3dfdc263e1a403daa7d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 15 14:11:04 2009 -0700 + + NEWS: Update with correct data for 1.9.4 snapshot + + NEWS | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit d5609ca04ecc5f5e3d5cef8ca0e67fa98cd653de +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Oct 15 17:47:33 2009 +0300 + + [build] Check compiler flags using AC_TRY_LINK instead of AC_TRY_COMPILE. + + Turns out we were passing suncc warning suppression flags to gcc + by mistake since -e<entry point> is actually a valid option for + gcc. This caused the -erroff=E_ENUM_TYPE_MISMATCH_ARG and other + -erroff options to be passed to the linker. In the normal case + of a GNU ld linker this doesn't matter since it ignores bogus + entry points, but the GNU gold linker replaces a bogus entry + point with NULL. This patch makes the CAIRO_CC_TRY_FLAG() + check stricter by testing that the flag doesn't interfere with + linking executables. + + build/aclocal.cairo.m4 | 19 ++++++++----------- + 1 file changed, 8 insertions(+), 11 deletions(-) + +commit 79190d89853958ee8252440d35a662fabf122afd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 15 14:05:37 2009 +0100 + + [surface] Avoid double application of device offset when calling fill() + + _cairo_surface_fallback_paint() attempts to avoid a clipped operation if + we can convert the paint into a fill of the clipmask. However by calling + _cairo_surface_fill() we incur a double application of device offset to + the source, triggering various failures. + + Company spotted this and managed to extract an excellent minimal test + case, test/clip-device-offset. This commit fixes that failure. + + src/cairo-surface-fallback.c | 41 +++++++++++++++++++++++++++++++++++------ + 1 file changed, 35 insertions(+), 6 deletions(-) + +commit ade55037ffa596b690c6a1051394589f76eb1f48 +Author: Benjamin Otte <otte@gnome.org> +Date: Thu Oct 15 13:19:11 2009 +0100 + + [test] Add clip-device-offset + + Exercises a bug demonstrated by WebKit with clipping + device offsets. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/clip-device-offset.argb32.ref.png | Bin 0 -> 175 bytes + test/clip-device-offset.c | 79 +++++++++++++++++++++++++++++++++ + test/clip-device-offset.rgb24.ref.png | Bin 0 -> 168 bytes + 5 files changed, 82 insertions(+) + +commit dac73d260a9b9a848bb97436ad84081c51629511 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 15 12:18:47 2009 +0100 + + [build] Link against pthread-stubs + + Avoid pulling in the real pthread library if the application is single + threaded and not using pthreads, by linking against pthread-stubs + instead. + + build/configure.ac.features | 1 + + configure.ac | 8 +++++++- + src/cairo-mutex-impl-private.h | 2 +- + test/Makefile.am | 4 ++++ + test/cairo-test-trace.c | 10 +++++----- + test/cairo-test.c | 6 +++--- + util/cairo-trace/Makefile.am | 2 +- + 7 files changed, 22 insertions(+), 11 deletions(-) + +commit ef9286751d8346ecb803bfb5916581ee4dfc84db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 13 16:10:39 2009 +0100 + + [atomic] Fallback to libatomic-ops-dev + + Use libatomic-ops-dev in preference to mutex-based atomics, if we do not + have the builtin atomic intrinsics available. + + build/aclocal.cairo.m4 | 10 ++++++++++ + src/cairo-atomic-private.h | 41 ++++++++++++++++++++++++++++++++++++----- + src/cairo-surface.c | 4 ++-- + src/cairo-xlib-private.h | 2 +- + src/cairo-xlib-screen.c | 16 +++++++++------- + src/cairo.c | 10 +++++----- + 6 files changed, 63 insertions(+), 20 deletions(-) + +commit d85eda97dd9116f51e0255b29652f4b52ba4f8e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 13 14:14:55 2009 +0100 + + [pattern] Compute extents for gradients + + As noted in the comments we could also compute the pattern extents for + gradients with CAIRO_EXTEND_NONE under certain circumstances, i.e. + radial gradients and device axis aligned linear gradients. + + src/cairo-pattern.c | 184 +++++++++++++++++++++++++++++++++++----------------- + 1 file changed, 126 insertions(+), 58 deletions(-) + +commit 3a83bc8617dae3cc2bfea862f252338463871648 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 2 23:28:10 2009 +0930 + + PDF: Fix regression caused by 1ae5a419 + + Bug 24240 acroread prints error message when printing + + src/cairo-pdf-surface.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 91a4f59f135dd42a28e14be55d1f08712c0c3097 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 2 23:11:54 2009 +0930 + + PDF: Fix regression caused by 1ae5a419 + + Bug 24240 first char missing when printing a PDF. + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 39284159234d5318c90fa3a72178cd3d14fe0fbb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 30 20:11:12 2009 +0100 + + [boilerplate/xcb] Fix pixmap depth + + All the error checking, finally pointed out that I was creating a pixmap + with the wrong depth! Oops. + + boilerplate/cairo-boilerplate-xcb.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +commit e9bc2180d73acc7133d715ed4380ed20fb4364c0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 30 19:50:44 2009 +0100 + + [xcb] Deferred error checking. + + XCB avoids the dreaded abort on XError mechanism by forcing the client + to perform deferred error checking. So do so. This allows us to combine + the fire-and-forget rendering model with accurate error checking, + without killing the client or mixing our errors with theirs. + + XCB for the win! + + boilerplate/cairo-boilerplate-xcb.c | 17 + + src/cairo-freelist-private.h | 5 + + src/cairo-freelist.c | 33 ++ + src/cairo-xcb-surface.c | 712 +++++++++++++++++++++++------------- + 4 files changed, 521 insertions(+), 246 deletions(-) + +commit 8e4e0aa7ee5b4e0963409cda825705a09aae61e1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 30 17:50:09 2009 +0100 + + [boilerplate/xcb] Check for connection errors during test + + boilerplate/cairo-boilerplate-xcb.c | 51 +++++++++++++++++----- + test/cairo-test.c | 86 ++++++++++++++++++------------------- + 2 files changed, 83 insertions(+), 54 deletions(-) + +commit 395555b116a497c99b9e8365a202377c344c0c45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 30 00:37:36 2009 +0100 + + [xlib] Suppress warning that should never have been. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42ea356c0393288eea16eb5c591fa51009f85cb9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 30 21:21:42 2009 +0930 + + Fix truetype subset crash + + Bug 24213 + + src/cairo-truetype-subset.c | 1 + + 1 file changed, 1 insertion(+) + +commit 6809e1216119e16c5be236418dc560d2e9bf854d +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Sep 30 08:54:19 2009 +0200 + + [API] Make _cairo_meta_surface_replay() private again + + Replaying a meta surface can be achieved by using it as a source for a + cairo_paint() so exporting a separate API is unnecesary and confusing. + So after consulting Chris and Carl, we decided to remove the function + again. + + NEWS | 1 - + src/cairo-meta-surface-private.h | 5 ++++- + src/cairo-meta-surface.c | 39 +++++++++++++++++---------------------- + src/cairo-paginated-surface.c | 4 ++-- + src/cairo-script-surface.c | 6 +++--- + src/cairo-surface.c | 4 ++-- + src/cairo-svg-surface.c | 2 +- + src/cairo-type3-glyph-surface.c | 4 ++-- + src/cairo-user-font.c | 2 +- + src/cairo-vg-surface.c | 2 +- + src/cairo-xml-surface.c | 2 +- + src/cairo.h | 4 ---- + test/cairo-test-trace.c | 8 ++++++-- + util/cairo-trace/trace.c | 22 ---------------------- + 14 files changed, 40 insertions(+), 65 deletions(-) + +commit f8c49b4187a32b60408b23b2c2abce1778a8dc95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 29 03:02:40 2009 +0100 + + [xlib] XRequest bread crumbing + + Add bread crumbs in the form of NoOperations that can be parsed by + xtrace and very useful when debugging protocol/server errors. + + src/cairo-xlib-surface.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 57 insertions(+) + +commit 1c4f61ec5068a5935eb6d5dd1d6f2c0275b70529 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 29 03:01:37 2009 +0100 + + [tessellator] Invalid conversion of list head to edge. + + When scanning for collinear right edges, we need to check that we do not + go beyond the end of the array. + + src/cairo-bentley-ottmann-rectangular.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit f23ae97e307f00a79cbf2e01f9ca20da29ea87c3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 24 16:30:57 2009 +0100 + + [perf] Support parsing reports from stdin + + perf/cairo-perf-compare-backends.c | 22 ++++++++++++---------- + perf/cairo-perf-report.c | 29 +++++++++++++++++++---------- + 2 files changed, 31 insertions(+), 20 deletions(-) + +commit 50163a9fafa77dd1135ca5b6b03c7ec5619687c1 +Author: Benjamin Otte <otte@gnome.org> +Date: Tue Sep 29 00:23:12 2009 +0200 + + [xlib] Set proper bpp when computing format from masks + + Fixing omission in caa9eed4646e78a62ffb49d9c4f48c0b351c7a7f + + src/cairo-xlib-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit a160c8c4009e069db53bec79abd8926231de9a7f +Author: Benjamin Otte <otte@gnome.org> +Date: Mon Sep 28 23:52:14 2009 +0200 + + [xlib] Handle 24bpp formats during dithering + + src/cairo-xlib-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 9e89de813516c48baed67a4d18325971cd42cd4a +Author: Benjamin Otte <otte@gnome.org> +Date: Mon Sep 28 23:51:14 2009 +0200 + + [image] Fix masks computation for BGRx format + + Patch originally by Mark Kettenis + + src/cairo-image-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4b2c74e28531e403a9538f20a3ace7b114f9bbae +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 28 22:57:10 2009 +0930 + + PS: Use standard page size names for some common sizes + + Some PS viewers like gv use the label in the %PageMedia DSC comment as + the displayed page size. + + The page names and sizes were obtained from the list at: + + http://www.gnu.org/software/gv/manual/html_node/Paper-Keywords-and-paper-size-in-points.html + + src/cairo-ps-surface.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 62 insertions(+), 4 deletions(-) + +commit db5e3db0a9b218bebad6921a95d5244047050348 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 25 23:07:56 2009 +0930 + + PS: Add DocumentMedia/PageMedia DSC comments + + Provide default DocumentMedia and PageMedia DSC comments if the user + does not specify them using cairo_ps_surface_dsc_comment(). This is + required so that PostScript viewers such as gv use the correct page + size. + + src/cairo-ps-surface-private.h | 1 + + src/cairo-ps-surface.c | 88 ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 89 insertions(+) + +commit caa9eed4646e78a62ffb49d9c4f48c0b351c7a7f +Author: Benjamin Otte <otte@gnome.org> +Date: Thu Sep 24 23:42:05 2009 +0200 + + [xlib] Handle case in draw_image() where pixman format is not RGB + + When an image cannot be expressed as masks, its data cannot be used in + an XImage. In that case, we use pixman to copy the image to the desired + format. + + src/cairo-xlib-surface.c | 50 ++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 44 insertions(+), 6 deletions(-) + +commit 9f5fe6711566ee34afe210f271f1c5a061efa745 +Author: Benjamin Otte <otte@gnome.org> +Date: Thu Sep 24 22:57:39 2009 +0200 + + [image] Return cairo_bool_t from _pixman_format_to_masks + + Return FALSE when the pixman format does not support ARGB masks. In + particular, return FALSE for YUV formats. + + src/cairo-image-surface.c | 21 ++++++++++----------- + src/cairoint.h | 2 +- + 2 files changed, 11 insertions(+), 12 deletions(-) + +commit 120247ac55d92d9c9b24fad45c765d16e692f355 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 24 23:02:38 2009 +0930 + + Add EPS test + + This test demonstrates a regression in the EPS output since 1.8.8. + The ps-eps.ref.eps was created with 1.8.8. + + test/Makefile.am | 2 ++ + test/Makefile.sources | 1 + + test/ps-eps.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ + test/ps-eps.ref.eps | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 172 insertions(+) + +commit c8a4f486712eba4ad0ccbf5ae3b18920137d5b1b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 23 18:08:34 2009 +0100 + + [image] Do not trust user supplied data to be clear + + Gah, more important than the whitespace was the reversal of is_clear... + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03bce099eae68643979e5742b2703b2b2e835cca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 23 17:56:00 2009 +0100 + + [image] Tweak coding style + + Whitespace spam. + + src/cairo-image-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit ab558fa843accc440686f7b8eda197277a6a4eb2 +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Sep 23 17:40:17 2009 +0200 + + [image] Move setting of is_clear to _create_with_pixman_format() + + Simplifies code and ensures other users of that function don't run into + the same bug. + + src/cairo-image-surface.c | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +commit 07ee9cfbf07deba228e73d26b419a4e130de24e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 23 15:33:23 2009 +0100 + + [image] Do assumption initial user data is cleared. + + Benjamin Otte pointed out the error of my ways that a clear on a + cairo_image_surface_create_for_data() was not working. This is because I + modified the image surface to skip clears when it knows the target data + has been cleared. This flag must be reset when the user interacts with + the surface, such as providing the initial surface data. + + src/cairo-image-surface.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit 9948b5180aa4312b3184d9ba46e9ad6f0d8e700c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 22 18:20:03 2009 +0100 + + [test] Revamp surface-source + + Include a translucent region in the source that exercises the xlib bug + that I'm trying to fix. Hmm. + + test/Makefile.am | 18 +++++++++----- + test/glitz-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/glitz-surface-source.ref.png | Bin 268 -> 0 bytes + test/glitz-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + test/image-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/image-surface-source.ref.png | Bin 332 -> 0 bytes + test/image-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + test/pdf-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/pdf-surface-source.ref.png | Bin 268 -> 0 bytes + test/pdf-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + test/ps-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/ps-surface-source.ref.png | Bin 268 -> 0 bytes + test/ps-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + test/quartz-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/quartz-surface-source.ref.png | Bin 332 -> 0 bytes + test/quartz-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + test/surface-source.c | 37 ++++++++++++++++++++++++++-- + test/svg-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/svg-surface-source.ref.png | Bin 268 -> 0 bytes + test/svg-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + test/test-fallback16-surface-source.ref.png | Bin 268 -> 0 bytes + test/xlib-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/xlib-surface-source.ref.png | Bin 268 -> 0 bytes + test/xlib-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + 24 files changed, 47 insertions(+), 8 deletions(-) + +commit 941d3693fac831c4ce8c61cbac7c77b566b97611 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 22 14:43:45 2009 +0100 + + [test] Exercise push-group-color. + + Hunting for a known bug in the xlib backend where it invalidly converts + an argb32 source to rgb24. However, this does not appear to be that bug, + but still a useful exercise nevertheless. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/push-group-color.c | 141 +++++++++++++++++++++++++++++++++++++ + test/push-group-color.ref.png | Bin 0 -> 2902 bytes + test/push-group-color.xlib.ref.png | Bin 0 -> 2964 bytes + 5 files changed, 144 insertions(+) + +commit 30f45ce5f7d639dd5a0b60f544b3535e3bc2105d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 22 15:15:47 2009 +0100 + + [gl] Handle an absent visual. + + If we cannot find the correct visual for the fbconfig, return an error + instead of crashing. The difference is subtle, granted. + + src/cairo-gl-surface.c | 8 ++++++++ + src/cairo-glx-context.c | 7 ++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit e74cb7fa3eb9a9bcdeb298d969b70fd99ba50f3d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:44:34 2009 +0930 + + win32-printing: correct the use of the CAIRO_HAS_WIN32_FONT #ifdef + + it was wrapping code required for non windows fonts. + + src/cairo-win32-printing-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3dd2cc8f6d84253f93affecd3022c9fe4a25d60f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:40:53 2009 +0930 + + win32-printing: fix meta surface pattern regression caused by bed2701e + + src/cairo-win32-printing-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7658635c654b694b516e5dd44a43611d94e91abd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:36:20 2009 +0930 + + win32-printing: Allow GDI CTM with scale < 1 to be set + + To better support creating EMF files with the win32-printing surface, + allow a GDI CTM with scale < 1 to be used. + + http://lists.cairographics.org/archives/cairo/2009-September/018110.html + + src/cairo-win32-printing-surface.c | 90 ++++++++++++++++++++++++++++++-------- + src/cairo-win32-private.h | 2 + + 2 files changed, 73 insertions(+), 19 deletions(-) + +commit 19c091670302fd23a676e680308df49a4ba06687 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:35:33 2009 +0930 + + Make win32 fonts work in EMF files created by win32-printing + + src/cairo-win32-printing-surface.c | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit f01a54266d57763635f984982bec001a393d8aa2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:34:56 2009 +0930 + + Fix compiler warnings in win32-surface + + src/cairo-win32-surface.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 23663e2078e34659af43bd0e62bb1fb7a94cc71e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:34:21 2009 +0930 + + Fix compiler error on cygwin + + src/cairo-win32-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 7ecd413fab7c55918c6f3c4c272b5e8b5aa89aa7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:33:14 2009 +0930 + + Add WINVER defines to cairo-mutex-impl-privaye.h + + The WINVER defines should always be defined before including windows.h + + src/cairo-mutex-impl-private.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 605ec22ab5103e16052591517f86fe558133fb8e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 22 22:17:27 2009 +0930 + + Use _WIN32 to check for win32 mutex + + Commit 535bcaa1 moved pthread after win32 to fix mingw build + problems. However this breaks cygwin builds. + + On cygwin HAVE_WINDOWS_H is defined but _WIN32 is not. This was + causing windows.h to be included which defines _WIN32. As a result the + win32 code in cairo-misc.c was being compiled but the win32 declaration + in cairint.h was not included. + + Fix this by using _WIN32 to enable the win32 mutex functions since + _WIN32 is defined by mingw, visual C++, and winegcc, but not + cygwin. On cygwin, posix functions are preferred as it is a unix + emulation environment. + + src/cairo-mutex-impl-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e00d0627494a4b15ed3b74a704695ca8b81a350e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 21 13:50:00 2009 +0100 + + [xlib] Fix recent bug in unbounded trapezoids + + Gah! I had believed that the dst extents and the clip were correct to + enable unbounded fixup for the unbounded trapezoids. I was wrong, so I + need to requery the trapezoid extents. As this information is already + known, I should update the interface to pass along all relevant + information. + + src/cairo-surface.c | 23 ++++++++++------------- + src/cairo-xlib-surface.c | 32 +++++++++++++++++++------------- + 2 files changed, 29 insertions(+), 26 deletions(-) + +commit 378b1e73d9f27e9b54ea01b10e588b361848d0cd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 21 03:10:53 2009 +0100 + + [fallback] Special case single composite rectangle + + Avoid the overhead of region-from-traps extraction for the very frequent + case of using a single (possibly clipped) rectangle with a pattern source. + + src/cairo-surface-fallback.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit 35daf95db8aa4f0c254891f180aa4996dd464a60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 21 03:31:22 2009 +0100 + + [xlib] Trim a few redundant steps when uploading glyphs + + Cleanup the glyph coercion routines to avoid the temporary cairo_t (as + we can just cairo_surface_paint() directly). + + src/cairo-xlib-surface.c | 23 ++++++----------------- + 1 file changed, 6 insertions(+), 17 deletions(-) + +commit 9b7c5d95055c4ea5da46c53263050d6ec1331c08 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 20 18:46:19 2009 +0100 + + [xlib] Cleanse creation of similar surfaces. + + Reduce two nearly identical routines to one. + + src/cairo-xlib-surface.c | 197 ++++++++++++++++++++++------------------------- + 1 file changed, 91 insertions(+), 106 deletions(-) + +commit 878cef62b525e9f13ab2a8ab562ba8b6628aaa1f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 20 18:45:09 2009 +0100 + + [xlib] Interim CAIRO_DEBUG variable to specify xrender level + + Use CAIRO_DEBUG=xrender-version=x.y to override what the server reports. + Useful to test cairo's behaviour against older servers. + + src/cairo-xlib-display.c | 23 +++++++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +commit 531e8045980c966b8e51df933721f9b86c6b1539 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri Sep 18 12:17:46 2009 -0400 + + Add a description of how we compute the spline_error_squared. + + src/cairo-spline.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit f4336352405ee7c184d45a73cdd6c1a0526843db +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 16 15:46:14 2009 -0400 + + Set LC_ALL=C instead of LANG=C + + doc/public/check-doc-coverage.sh | 4 +++- + doc/public/check-doc-syntax.sh | 3 ++- + src/check-def.sh | 3 ++- + src/check-doc-syntax.sh | 3 ++- + src/check-headers.sh | 3 ++- + src/check-plt.sh | 3 ++- + src/check-preprocessor-syntax.sh | 3 ++- + 7 files changed, 15 insertions(+), 7 deletions(-) + +commit 56c9b2de7a2b93b2e0c59cf98326d8c0d4d508ba +Author: Sebastian Dröge <sebastian.droege@collabora.co.uk> +Date: Tue Sep 15 17:26:59 2009 +0200 + + Use __uint128_t and __int128_t if available + + GCC uses a peculiar name for a real 128-bit integer on x86-64. + + Speedups, xlib on a gm45 + ======================== + poppler 41246.56 -> 35102.82: 1.18x speedup + swfdec-youtube 12623.01 -> 11936.79: 1.06x speedup + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + build/configure.ac.system | 2 +- + src/cairo-wideint-private.h | 1 + + src/cairo-wideint-type-private.h | 6 +++ + src/cairo-wideint.c | 91 +++++++++++++++++++--------------------- + 4 files changed, 50 insertions(+), 50 deletions(-) + +commit ccf84a8883ebb8d2ee8f55eb53da4dfc96887de0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 15 14:22:57 2009 +0100 + + [perf] Reorganise cairo-perf + + In preparation to creating a new hub to control performance measuring + and reporting, move the current cairo-perf out of the way. + + perf/.gitignore | 3 + + perf/Makefile.am | 84 +- + perf/box-outline.c | 102 - + perf/cairo-perf-cover.c | 339 --- + perf/cairo-perf-diff | 2 +- + perf/cairo-perf-micro.c | 596 +++++ + perf/cairo-perf.c | 596 ----- + perf/composite-checker.c | 114 - + perf/dragon.c | 249 -- + perf/fill.c | 119 - + perf/glyphs.c | 99 - + perf/intersections.c | 157 -- + perf/long-dashed-lines.c | 71 - + perf/long-lines.c | 145 -- + perf/mask.c | 299 --- + perf/micro/box-outline.c | 102 + + perf/micro/cairo-perf-cover.c | 339 +++ + perf/micro/composite-checker.c | 114 + + perf/micro/dragon.c | 249 ++ + perf/micro/fill.c | 119 + + perf/micro/glyphs.c | 99 + + perf/micro/intersections.c | 157 ++ + perf/micro/long-dashed-lines.c | 71 + + perf/micro/long-lines.c | 145 ++ + perf/micro/mask.c | 299 +++ + perf/micro/mosaic.c | 173 ++ + perf/micro/mosaic.h | 4387 ++++++++++++++++++++++++++++++++++++ + perf/micro/paint-with-alpha.c | 49 + + perf/micro/paint.c | 48 + + perf/micro/pattern_create_radial.c | 103 + + perf/micro/pythagoras-tree.c | 91 + + perf/micro/rectangles.c | 118 + + perf/micro/rounded-rectangles.c | 141 ++ + perf/micro/spiral.c | 349 +++ + perf/micro/stroke.c | 97 + + perf/micro/subimage_copy.c | 77 + + perf/micro/tessellate.c | 178 ++ + perf/micro/text.c | 66 + + perf/micro/twin.c | 56 + + perf/micro/unaligned-clip.c | 70 + + perf/micro/world-map.c | 116 + + perf/micro/world-map.h | 196 ++ + perf/micro/zrusin-another.h | 668 ++++++ + perf/micro/zrusin.c | 95 + + perf/mosaic.c | 173 -- + perf/mosaic.h | 4387 ------------------------------------ + perf/paint-with-alpha.c | 49 - + perf/paint.c | 48 - + perf/pattern_create_radial.c | 103 - + perf/pythagoras-tree.c | 91 - + perf/rectangles.c | 118 - + perf/rounded-rectangles.c | 141 -- + perf/spiral.c | 349 --- + perf/stroke.c | 97 - + perf/subimage_copy.c | 77 - + perf/tessellate.c | 178 -- + perf/text.c | 66 - + perf/twin.c | 56 - + perf/unaligned-clip.c | 70 - + perf/world-map.c | 116 - + perf/world-map.h | 196 -- + perf/zrusin-another.h | 668 ------ + perf/zrusin.c | 95 - + 63 files changed, 9414 insertions(+), 9411 deletions(-) + +commit 4152cd90e25ffa9d2a3683c790bd2891a58c52de +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Sep 14 14:29:01 2009 +0300 + + [autoconf] Comment on the SIZEOF_VOID__ -> SIZEOF_VOID_P workaround. + + Explain where the weird SIZEOF_VOID__ comes from. + + src/cairo-atomic-private.h | 2 ++ + util/cairo-trace/trace.c | 2 ++ + 2 files changed, 4 insertions(+) + +commit cd94bf8bf30de9aa8dfec1a06a7ef3386944c974 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Sep 14 03:41:42 2009 -0600 + + [trace] Look harder for the cairo-trace.so library. + + On OpenBSD the convention is to not use symlinks from + unversioned library names to versioned library names. + This breaks cairo-trace because it looks for cairo-trace.so + explicitly, but on OpenBSD only cairo-trace.so.0.0 is + installed. + + The right thing to do is probably to source the cairo-trace.la + file and look for a file name there somehow. Instead this commit + just looks for a likely looking file or symlink in the install + directory. + + util/cairo-trace/cairo-trace.in | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit a343c8c42d3adc8f52afd09bdfbbcfd5299df49e +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Sep 14 02:33:26 2009 -0600 + + [trace] Don't use pthread_key_delete. + + On OpenBSD libc doesn't provide pthread stubs like glibc on Linux + or newer libcs from FreeBSD. However libX11 does provide a stubs + for a subset of the pthread functions (formerly in libXThrStub, + now moved into libX11 proper), but pthread_key_delete() is not + one of the stubbed ones. So, on OpenBSD cairo's non-linking of + libpthread accidentally works as long as the xlib-surface is enabled, + which is nearly always the case. + + This patch makes trace.c stand at the same precipice as cairo itself + by reverting to only a subset of the pthreads functions stubbed by + libX11. + + util/cairo-trace/trace.c | 1 - + 1 file changed, 1 deletion(-) + +commit cf0fed2191c2b5ebce8855def1dd302ccf8e039a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 17:35:29 2009 -0600 + + [build] Check for dlsym in both libdl and libc. + + The BSDs have dlsym() in libc rather than libdl. + + boilerplate/cairo-boilerplate.c | 4 ++-- + configure.ac | 12 +++++++----- + util/cairo-trace/Makefile.am | 6 +++++- + 3 files changed, 14 insertions(+), 8 deletions(-) + +commit 1c7ac6c47addd6825c4f49f514fe3ffb708e3813 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 17:56:56 2009 -0600 + + [build] Work around autoconf void* -> VOID__ name conversion bug. + + The autoconf shipping with OpenBSD 4.5 converts sizeof(void*) + to SIZEOF_VOID__ rather than SIZEOF_VOID_P. Work around that + by defining SIZEOF_VOID_P if required. + + src/cairo-atomic-private.h | 4 ++++ + util/cairo-trace/trace.c | 4 ++++ + 2 files changed, 8 insertions(+) + +commit 12470fd7010ea0748c8dcc9014d1cd0f52f51a3b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 14 10:36:08 2009 +0100 + + [configure] Setup GL CFLAGS before checking for GLX + + configure.ac | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9c2790ccc48392bfe039626ebb383070aa18fe56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 14 10:08:57 2009 +0100 + + [build] Add a default message for when GLEW isn't built + + And it appears I touched the build system again and autoregenerated the + feature headers. + + boilerplate/Makefile.win32.features | 8 -------- + build/Makefile.win32.features-h | 1 - + configure.ac | 5 +++-- + src/Makefile.win32.features | 8 -------- + util/cairo.modules | 1 + + 5 files changed, 4 insertions(+), 19 deletions(-) + +commit 6d4f3c40eff7d070b1c9759038444928c6754efe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 14 09:19:10 2009 +0100 + + Add a private copy of GLEW + + This appears to be the simplest mechanism to build libglew at the moment - + should a system copy be unavailable. Fortunately libglew is now distributed + under a permissive licence. + + If you want to pass 'make -C src check' you have to use the system copy, + or spend quite a bit of time cairo-fying libglew. + + boilerplate/Makefile.win32.features | 8 + + build/Makefile.win32.features-h | 1 + + build/configure.ac.features | 1 + + configure.ac | 19 +- + src/Makefile.am | 2 + + src/Makefile.sources | 3 + + src/Makefile.win32.features | 8 + + src/glew/GL/glew.h | 12262 ++++++++++++++++++++++++++++++++++ + src/glew/GL/glxew.h | 1397 ++++ + src/glew/LICENSE.txt | 73 + + src/glew/glew.c | 12180 +++++++++++++++++++++++++++++++++ + util/cairo.modules | 10 +- + 12 files changed, 25955 insertions(+), 9 deletions(-) + +commit 9ad26f74b0059645d865a20c387fa4bd460cabc8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 13 23:16:57 2009 +0100 + + [configure] Fallback to detect OpenGL headers + + When not using mesa, we can not rely on a pkgconfig file, so just rely on + the presence of the OpenGL headers instead. + + configure.ac | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 71c3b2888cc81e6d55782388d14bb8d806e77d07 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 20:24:29 2009 +0300 + + [win32] Sync Makefile.win32.features. + + Ooops.. wasn't sure if I should commit this or not. + + build/Makefile.win32.features | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ba21f213560fa239a02ae28af4eb1d3a6b7254e5 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 18:21:38 2009 +0100 + + [trace] Don't trace internal cairo calls on Solaris. + + On various configurations of Solaris cairo-trace likes to trace + internal calls to the API from within cairo and cairo-trace itself. On + Linux the slim_hidden_proto stuff avoids this by name mangling and + symbol alias magic, but on Solaris that doesn't work so we're left + with either no hidden symbols at all or using normal ELF hidden symbol + attributes, but neither of those prevent internal calls to cairo from + being traced of course. + + This commit provides a per-thread entry/exit trace counter for use + when we can't use name mangling to hide internal API calls. As a + side-effect it may hide actual client API calls from callback + functions called by cairo, but such use cases ought to be rare. + + util/cairo-trace/trace.c | 465 +++++++++++++++++++++++++++++++++-------------- + 1 file changed, 327 insertions(+), 138 deletions(-) + +commit f5bcb2f36e7dba9cfba5d697e1401dcd00603812 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 12:47:19 2009 +0100 + + [build] Enable building cairo-trace on Solaris. + + Solaris supports LD_PRELOAD too! + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce8c842a70d3f23527dcbd889b022103483341f2 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 12:53:07 2009 +0100 + + [trace] Make cairo-trace and its symbol-lookup automatically configured. + + The build shouldn't fail if we can't make our optional performance + tools. + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2fb59a69f4509c2116f16bd6d376f35e3e2eb709 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 14:27:03 2009 +0100 + + [trace] Don't rely on the constructor attribute to initialise the tracer. + + Use pthread_once() at cairo API entry points to initialise the library + if required. This side steps the issues with the __constructor__ + attribute vs _init()/_fini() on Solaris and different tracer/tracee + runtimes which result in the constructors not being run in + cairo-trace.so. + + util/cairo-trace/trace.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 174 insertions(+), 2 deletions(-) + +commit 18a441984b649f558c6478f24a7987941acadbe1 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 13:53:27 2009 +0100 + + [trace] Don't try and propagate a void result. + + The pattern + + return <function returning void>( ... ); + + is a gccism not supported by Sun Studio. + + util/cairo-trace/trace.c | 136 ++++++++++++++++++++++++----------------------- + 1 file changed, 70 insertions(+), 66 deletions(-) + +commit fee5c58c6caecdbdb387fe39bd6ed94faf7f6ae9 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Sep 13 13:09:47 2009 +0100 + + [trace] Avoid warnings from assigning a void pointer to a function pointer. + + The Sun Studio compiler complains a *lot* when assigning the result + of dlsym to a function pointer. Cast the result to the proper + type first.:w + + util/cairo-trace/trace.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 19881012cb31ec2aebf556e2c25b53e8387dc689 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 13 16:36:12 2009 +0100 + + [image] Add pixel masks for BGRA formats + + pixman introduced the BGRA pixel type not too long ago, and so we need to + update our pixman_format_code_t to cairo_format_masks_t translator. + + src/cairo-image-surface.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit f8a8f297f298d81899803a1b2bbca007418408b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 13 10:58:59 2009 +0100 + + [trace] Stray trailing ';' in bswap macros + + util/cairo-trace/trace.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f851009ec76ee2290ffbc3f55edbf3cc16aff488 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 13 10:57:42 2009 +0100 + + [trace] Compile without lookup-symbol + + And check compilation with --disable-symbol-lookup + + util/cairo-trace/trace.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 6cb3ff9c1943c58f5b6892af3f18f6aaa24494b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 13 10:52:14 2009 +0100 + + [configure] --enable-symbol-lookup + + There you go Joonas, I don't always ignore your suggestions! This is + simple patch to allow the user to disable symbol loops in case the + auto-detection fails on some obscure (perhaps OpenBSD) platform. Or in + case the user really wants to trim a few bytes from a library only used + during tracing! + + boilerplate/Makefile.win32.features | 7 +++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + build/configure.ac.features | 1 + + configure.ac | 6 ++++++ + src/Makefile.win32.features | 7 +++++++ + util/cairo-trace/Makefile.am | 14 +++++++++----- + 7 files changed, 34 insertions(+), 5 deletions(-) + +commit 556d064f4eb3625022f0d99461929ff3fafc9c71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 11 15:35:27 2009 +0100 + + [test] Typos in README from previous commit + + test/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 43ecde2d22c5a8c591ac83f9a82c2bf83af484fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 11 15:15:22 2009 +0100 + + [test] Add Debian packages for fonts + + Mention which .deb provides the required fonts. + + test/README | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 33be73dfb76c26e3bb0ab59b2f570d00d9c7be62 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 11 14:59:58 2009 +0100 + + [xlib] Fix big-line. + + Project lines that exceed the 16.16 limits onto the XFixedLine, as we know + that top/bottom must fit within the confines of the surface and so will be + less than 16 bits. + + Sadly this is a run-on patch that also does: + 1. Make FillTiled the default for new GCs. + 2. Stores extend mode as opposed to repeat, and thereby cleaning up some + inconsistent code. + 3. Remove the special casing for unbounded trapezoids, as it is redundant + with the polygon clipping. + 4. Tidy the logic for deciding when to use the core protocol + (_categorize_composite_operation) + + src/cairo-xlib-screen.c | 6 +- + src/cairo-xlib-surface-private.h | 2 +- + src/cairo-xlib-surface.c | 402 ++++++++++++++++----------------------- + 3 files changed, 164 insertions(+), 246 deletions(-) + +commit 6960162c5eae30e2d48992023be35e3dbf502a03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 11 14:56:17 2009 +0100 + + [xlib] Discard clip if larger than glyph extents + + Implement cheap calculation of glyph extents to see whether we can discard + the clip region. This is effective around 50% of the time for firefox (and + makes the xtrace so much neater). + + src/cairo-scaled-font.c | 36 ++++++++++++++++++++++++++++++++++++ + src/cairo-xlib-surface.c | 23 +++++++++++++++++++++++ + src/cairoint.h | 6 ++++++ + 3 files changed, 65 insertions(+) + +commit 6e78409417117ad4de1aec65bb4753ff32e1e7a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 11 14:19:38 2009 +0100 + + [test] Update big-line and remove XFAIL + + Now that we use polygon clipping, output geometry should no longer exceed + the 2^16 limits imposed by pixman. For the image backend, we now use spans + for stroking and for the xlib backend we have to double check the range on + the output trapezoids. In short, cairo should pass this test. + + test/Makefile.am | 8 ++++---- + test/big-line.c | 16 ++++++++-------- + test/big-line.ps.argb32.ref.png | Bin 977 -> 0 bytes + test/big-line.ps.rgb24.ref.png | Bin 709 -> 0 bytes + test/big-line.quartz.ref.png | Bin 1075 -> 0 bytes + test/big-line.quartz.rgb24.ref.png | Bin 941 -> 0 bytes + test/big-line.ref.png | Bin 0 -> 977 bytes + test/big-line.xlib-fallback.ref.png | Bin 0 -> 723 bytes + test/big-line.xlib.ref.png | Bin 0 -> 933 bytes + 9 files changed, 12 insertions(+), 12 deletions(-) + +commit b495e7eb2ee2521a400d4b42e04242023bdb1e44 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 10 19:25:14 2009 +0100 + + [surface] Early return for (region IN white) + + Fill a region using IN and a white source is a frequent reduction of a + complex clip (viz a path that covers the whole operation extents will be + reduced to a single rectangle), and we can simply discard the fill (as it + always has bounded semantics). + + src/cairo-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 94aeae9b2ec563201a0e65705504d1d70c33a619 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 10 19:11:36 2009 +0100 + + [clip] Simplify applying a box clip + + If the clip path is a simple box, then for many operations it is entirely + representation by the alteration of extents and so we can skip a few steps + during reconstruction. + + src/cairo-clip-private.h | 3 +- + src/cairo-clip.c | 84 ++++++++++++++++++++++++++---------------------- + 2 files changed, 48 insertions(+), 39 deletions(-) + +commit 496e79b63762c70fd022b2d9e2d6107bcce1807a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 10 17:36:46 2009 +0100 + + [xlib] Fix extraction of GC during XCloseDisplay() + + Jeff Muizelaar reported a bug from his firefox builds that was causing a + double free during XCloseDisplay, and suggested it was related to + c0e01d9cd. Reviewing the cleanup, suggested that the cause may just be a + pair of missing parenthesis. + + src/cairo-xlib-screen.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f34affaa1e0b52e255d882b84bf064f9a9d4a95d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 18:03:20 2009 +0100 + + [util] And reuse the same name repository name. + + Completely confused by local caching of a broken cairo.modules by the + jhbuild client. ARGH! + + util/cairo.modules | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e1774185d6bb824a53465a037539b53fdc7af5d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 17:52:10 2009 +0100 + + [util] And back to a unique repo name for cairo.modules + + Gah, further experiments into the unknown and the unclear. + + util/cairo.modules | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2905ebc99e4cf8b8e94e16fcd3bc1566f51f4b57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 17:24:43 2009 +0100 + + [util] And restore the repository tag. + + jbhuild requires a local definition. + + util/cairo.modules | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4d7eb79d25bcfdc47abcae1fd51c7573043909fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 17:12:14 2009 +0100 + + [util] Inherit the repository from xorg.modules + + Experiment with inheriting the repository from xorg.module, in order to + avoid having two entries for the same server. + + util/cairo.modules | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit f5ee785144a8ddb6056b21f6c28bc4a9f4870b32 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 13:59:50 2009 +0100 + + [test] Disable the antialias testing for the vector surfaces. + + Only the raster bckends obey the font anti-alias options. + + test/large-twin-antialias-mixed.c | 2 +- + test/twin-antialias-gray.c | 2 +- + test/twin-antialias-mixed.c | 2 +- + test/twin-antialias-none.c | 2 +- + test/twin-antialias-subpixel.c | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit abaef9bfbe11302beb6481547632b44be9d5be8d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 13:57:06 2009 +0100 + + [test] Compare a failure against the image output + + If a backend fails in exactly the same way as the image, then we can + safely assume that the failure is systematic and not an error in the + backend, so change the result to XFAIL. + + test/cairo-test.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + +commit 41fbea053a8feb201a4f11aaf4dff86fea0bcb01 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 12:19:51 2009 +0100 + + [test] Typo in ft-show-glyphs-positioning + + Note to self: remember to sleep more often. + + test/ft-show-glyphs-positioning.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c61480a319bad55b0b4cf3f2be609bde9f2c5948 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 11:08:17 2009 +0100 + + [test] An oversized twin test case. + + A larger variant of the twin mixed antialiasing test. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/large-twin-antialias-mixed.c | 97 +++++++++++++++++++++++++++ + test/large-twin-antialias-mixed.ref.png | Bin 0 -> 16668 bytes + test/large-twin-antialias-mixed.xlib.ref.png | Bin 0 -> 14655 bytes + 5 files changed, 100 insertions(+) + +commit 610b311a970877f3954ba829cf43caecce0ab72c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 09:48:24 2009 +0100 + + [test] Variation of twin that intermixes antialiasing + + Check that we are substituting the right glyph depth and changing masks + appropriately. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/twin-antialias-mixed.c | 97 +++++++++++++++++++++++++++++++++ + test/twin-antialias-mixed.ref.png | Bin 0 -> 2338 bytes + test/twin-antialias-mixed.xlib.ref.png | Bin 0 -> 1760 bytes + 5 files changed, 100 insertions(+) + +commit c218ff8cbec2cc7aa3efc4c7f7d8690fbdec5e9a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 09:52:18 2009 +0100 + + [test] SUBPIXEL_ANTIALIAS varation of twin + + Force argb32 glyphs. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/twin-antialias-subpixel.c | 71 ++++++++++++++++++++++++++++++ + test/twin-antialias-subpixel.ref.png | Bin 0 -> 3979 bytes + test/twin-antialias-subpixel.xlib.ref.png | Bin 0 -> 3863 bytes + 5 files changed, 74 insertions(+) + +commit 456484514f4dacfe95952e8c0b73eb6a9a1a9d27 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 09:38:18 2009 +0100 + + [test] Variation of twin with ANTIALIAS_GRAY + + Force generation of a8 glyphs. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/twin-antialias-gray.c | 71 ++++++++++++++++++++++++++++++++++ + test/twin-antialias-gray.ref.png | Bin 0 -> 3979 bytes + test/twin-antialias-gray.xlib.ref.png | Bin 0 -> 3863 bytes + 5 files changed, 74 insertions(+) + +commit 8555984b8e72ab5846783ed54afa1a857d70f241 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 09:29:42 2009 +0100 + + [test] Add ANTIALIAS_NONE variation of twin + + I'm off hunting bugs. By using twin with ANTIALIAS_NONE we can construct + a1 glyph images independently of the native font system. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/twin-antialias-none.c | 71 ++++++++++++++++++++++++++++++++++ + test/twin-antialias-none.ref.png | Bin 0 -> 718 bytes + test/twin-antialias-none.xlib.ref.png | Bin 0 -> 745 bytes + 5 files changed, 74 insertions(+) + +commit 1820cb7fd648283a5b477fbc6bd654200ed190e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 09:12:54 2009 +0100 + + [test] Check for errors during ft-show-glyphs-positioning + + Do not blindly assume that we managed to construct a valid scaled-font + before attempting to dereference the FT_Face. Consider a machine with + no fonts which is substituting twin... + + test/ft-show-glyphs-positioning.c | 46 +++++++++++++++++++++++++++++++++------ + 1 file changed, 39 insertions(+), 7 deletions(-) + +commit 7fb0d5e2091a09ef7b01574f4ecf87236ef43fec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 01:45:16 2009 +0100 + + [twin] Initialise all properties + + Left a couple of uninitialised properties along the non-toy font + construction path. + + src/cairo-font-face-twin.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 34778a883af806f77d0c89c85cebb315b43d7ef2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 9 01:16:08 2009 +0100 + + [configure] Typo in test + + The have_dl clause was meant to have been removed from the requirements + test for cairo-script-interpreter. Instead we left the test broken. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4b221bd49a0c2c980a63779d905e8eb9b9cfa690 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 8 19:02:04 2009 +0100 + + [spans] Correct offsets for trapezoids + + Pass on the destination offset from composite_trapezoids() to + composite_polygon(). + + src/cairo-spans.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9389cb78a8ea5b6579d091ab1030ab9f1b13efc2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 8 17:51:33 2009 +0100 + + [build] Improve handling of missing test apparatus + + Improve detection, reporting and disabling of test backends when we lack + the required libraries and utilities. + + boilerplate/Makefile.win32.features | 7 +++++++ + boilerplate/cairo-boilerplate-pdf.c | 2 ++ + boilerplate/cairo-boilerplate-ps.c | 2 ++ + boilerplate/cairo-boilerplate-svg.c | 2 ++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + build/configure.ac.features | 3 ++- + configure.ac | 20 +++++++++++++------- + perf/cairo-perf-compare-backends.c | 2 +- + src/Makefile.win32.features | 7 +++++++ + test/Makefile.am | 2 ++ + test/any2ppm.c | 8 ++++++++ + util/Makefile.am | 4 ++-- + 13 files changed, 52 insertions(+), 11 deletions(-) + +commit 45759e5a0fb20a632f66a8dd206833b55a95f840 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 8 09:19:53 2009 +0100 + + [gl] Supply extents for acquire source image + + I have no idea how we survived for so long without supplying the source + extents... + + src/cairo-gl-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 67d40e5c7300c4082484dbda5c81808737bb2ac5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 6 10:17:40 2009 +0100 + + [xlib] Protect ourselves from liars that claim to have a 64k window + + Found using webkit, who attempt to paint an width X page height window. + Please, please clip large windows to the visible area. Thanks. + + src/cairo-xlib-surface.c | 27 +++++++++++++++++++++++++-- + 1 file changed, 25 insertions(+), 2 deletions(-) + +commit 310cebf194919cf3a7c37e724e64962ae47343cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 5 15:21:50 2009 +0100 + + [configure] Add option to disable trace. + + Some environments may be broken beyond our capabilities to detect, or + maybe the user is just insane and doesn't want to build my nice shiny + cairo-trace. Whatever, give them the option to choose: + + $ ./configure --disable-trace + + boilerplate/Makefile.win32.features | 7 +++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + build/configure.ac.features | 3 +++ + configure.ac | 8 +++++--- + src/Makefile.win32.features | 7 +++++++ + util/Makefile.am | 2 +- + 7 files changed, 27 insertions(+), 4 deletions(-) + +commit 9b932d7cd750b9bc61d108c80c4530352d952cfa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 5 08:46:39 2009 +0100 + + [perf] Move the calibration to its own function + + Improve code clarity and whatnot. + + perf/cairo-perf.c | 71 ++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 41 insertions(+), 30 deletions(-) + +commit 270b2f1be0e600621647f2e2486618c134217941 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Sep 5 05:39:35 2009 +0300 + + [perf] Add a fast-and-sloppy mode to cairo-perf. + + A new -f option to cairo-perf reverts to a fast run + mode for quick performance overviews. The number of + milliseconds each iteration of a test is run for can + be overriden using the new CAIRO_PERF_ITERATION_MS + environment variable. The default remains 2000 ms/iter. + + perf/cairo-perf.c | 59 ++++++++++++++++++++++++++++++++++++------------------- + perf/cairo-perf.h | 3 +++ + 2 files changed, 42 insertions(+), 20 deletions(-) + +commit 7f91c4953ccfbb96d76ecd73715fa2e524be933e +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Sep 5 05:07:25 2009 +0300 + + [boilerplate] Support wildcard ? in CAIRO_TEST_TARGET{,_EXCLUDE}. + + Useful for running tests only for a given content type. + + boilerplate/cairo-boilerplate.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit b3bafbc5f9201662702cc0c0d1c96411e31bb7d3 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Sep 5 05:02:00 2009 +0300 + + [boilerplate] Support giving content in CAIRO_TEST_TARGET{,_EXCLUDE}. + + Sometimes it's convenient to run the regression or performance tests + against a given target with a given content. Now we accept an optional + content specifier as a suffix .<content> on a target name, where + <content> is rgb or rgba. + + boilerplate/cairo-boilerplate.c | 61 ++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 57 insertions(+), 4 deletions(-) + +commit 29432d3d32bc84ec4a2e1815a84e4ac2089138fe +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Sep 5 02:25:01 2009 +0300 + + [test] Reorder dash-infinite-loop to not hit a runaway allocation. + + This test is annoying enough as it is what with it wedging the + test suite and all. There's no reason why it should DOS the + running box as well by sitting in a loop allocating like mad. + + test/dash-infinite-loop.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 20b0e7f95448e496b609212b9608f75e03f223f8 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Sep 4 23:54:21 2009 +0300 + + [test] Add large-source-roi.ref.png to test/Makefile.am + + Oops.. forgot to add it to the build files too + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 402a0539489cc01094b464109ae28ae78b85a294 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 4 09:47:10 2009 +0100 + + [gl] compile fix. + + Compiled fine during testing -- only I forgot I hadn't enable the gl surface. + + src/cairo-gl-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b065303740cc18fbcabfeef34d09c7d8b617647e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 4 09:35:22 2009 +0100 + + [xlib] Enable pad_reflect by default + + If the XServer claims to support the required Render extension then send + it the operations. However for the cases where we know it does not work, + i.e. the current and previous generations (<=1.6) of Xorg servers, enable + the buggy_pad_reflect fallbacks. + + src/cairo-xlib-display.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 634fdb4afd15e2467979609b1af7c1c198fc83d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 4 09:14:12 2009 +0100 + + [test] Add unbounded variants of clip-{fill,stroke} + + Add a couple of tests to exercise a bug that Joonas spotted that I had + introduced with the clip-reduction scheme - namely that I had + incorrectly removed the clip on unbounded operations. + + test/Makefile.am | 14 +++ + test/Makefile.sources | 2 + + test/clip-fill-unbounded.argb32.ref.png | Bin 0 -> 1615 bytes + test/clip-fill-unbounded.c | 105 +++++++++++++++++++++ + test/clip-fill-unbounded.rgb24.ref.png | Bin 0 -> 1312 bytes + test/clip-fill-unbounded.svg12.argb32.xfail.png | Bin 0 -> 1601 bytes + test/clip-fill-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 1601 bytes + ...clip-fill-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 1429 bytes + test/clip-fill-unbounded.xlib.argb32.ref.png | Bin 0 -> 1758 bytes + test/clip-fill-unbounded.xlib.rgb24.ref.png | Bin 0 -> 1426 bytes + test/clip-stroke-unbounded.argb32.ref.png | Bin 0 -> 1703 bytes + test/clip-stroke-unbounded.c | 102 ++++++++++++++++++++ + test/clip-stroke-unbounded.rgb24.ref.png | Bin 0 -> 1383 bytes + test/clip-stroke-unbounded.svg12.argb32.xfail.png | Bin 0 -> 1697 bytes + test/clip-stroke-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 1697 bytes + ...ip-stroke-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 1429 bytes + test/clip-stroke-unbounded.xlib.argb32.ref.png | Bin 0 -> 1792 bytes + test/clip-stroke-unbounded.xlib.rgb24.ref.png | Bin 0 -> 1426 bytes + 18 files changed, 223 insertions(+) + +commit de99f841886de5cc6e5bc91f9d3e82076d838dee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 4 08:55:19 2009 +0100 + + [fallback] Only eliminate the clip if the operation is bounded + + For unbounded operations we still need to pass along the clip in order to + correctly limit the extents of the operation. + + src/cairo-surface-fallback.c | 57 ++++++++++++++++++++++++++++++++------------ + 1 file changed, 42 insertions(+), 15 deletions(-) + +commit 0ffca06d7feec6fdc56c47a378fcc37c1951a00a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 4 08:32:31 2009 +0100 + + [perf] Use milliseconds by default in cairo-perf-diff-files + + Necessary when comparing performance reports from different machines (or + even at different CPU states). + + perf/cairo-perf-diff-files.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 00ca0780b8f06ec160d8f969e316c21fbbde04bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 23:25:53 2009 +0100 + + [win32] Remove unused clone_similar() + + The win32 backend handles surface sources directly and never calls + _cairo_pattern_acquire_surface() which is the only other possible user of + clone_similar(). + + src/cairo-win32-printing-surface.c | 2 +- + src/cairo-win32-surface.c | 57 +------------------------------------- + 2 files changed, 2 insertions(+), 57 deletions(-) + +commit 535bcaa1a1dac28fbe3106c6605949171bc36cb2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 20:10:55 2009 +0100 + + [mutex] Hook into pthread last + + Check for native mutex types before hooking into pthread, as this + workarounds broken builds on mingw that confuse us by including the + pthread header file. + + src/cairo-mutex-impl-private.h | 47 +++++++++++++++++++++--------------------- + 1 file changed, 24 insertions(+), 23 deletions(-) + +commit 769f4a4f47ab4636ec5cca3e92ce2c0ff19d2f75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 17:47:34 2009 +0100 + + [gl] Allocate small number of rectangles on the stack + + FillRectangle is most frequently used to fill an entire imagee with the + background colour, i.e. with just a single, or few, rectangle. Avoid + heap allocation for this common case by allocating enough space for 4 + rectangles (vertices+colors) on the stack. + + src/cairo-gl-surface.c | 43 +++++++++++++++++++++++++++++-------------- + 1 file changed, 29 insertions(+), 14 deletions(-) + +commit 6ce200da9d01a85a1de576229e75732db65a8b70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 17:38:00 2009 +0100 + + [gl] Assert that the error is impossible. + + As we created the image, it should not need coercing into a suitable + format and so we should be able to upload it without failure. + + src/cairo-gl-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d3aeafb406da7bf69e9bf24e18a5975780a7a987 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 17:32:28 2009 +0100 + + [gl] Remove reference to depth_stencil_tex + + We no longer use a depth-stencil, so remove the vestigial reference. + + src/cairo-gl-private.h | 1 - + src/cairo-gl-surface.c | 2 -- + 2 files changed, 3 deletions(-) + +commit 316c1683ceb39eb652608adc360cb4da9c22256a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Sep 3 21:38:31 2009 +0300 + + [test] Fix the order of random points random-intersections-curves*. + + The calls to uniform_random() to get the curve points were in + the function arguments, but argument order evaluation is compiler + implementation dependent. + + test/random-intersections-curves-eo.c | 17 ++++++++++------- + test/random-intersections-curves-nz.c | 17 ++++++++++------- + 2 files changed, 20 insertions(+), 14 deletions(-) + +commit 9e45673e197d0f43e296483cc6b5ca6df94e7f02 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Sep 3 19:18:07 2009 +0300 + + [image] Check for out of bounds image surface sizes in constructors. + + The image surface code doesn't reliably work on images larger than + 32767 in width or height. This patch makes the image surface + constructors fail by returning a surface in the CAIRO_STATUS_INVALID_SIZE + state when given negative or too large dimensions so that client code + gets a prompt and correct error rather than flaky rendering on large + images. + + src/cairo-image-surface.c | 27 +++++++++++++++++++++++++-- + test/large-source-roi.c | 4 ++-- + test/large-source-roi.ref.png | Bin 0 -> 112 bytes + test/large-source.c | 4 ++-- + 4 files changed, 29 insertions(+), 6 deletions(-) + +commit 12d0613210547b8a50dd7b21a12eb1485ee496b9 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Sep 3 17:54:49 2009 +0300 + + [test] Allow tests to XFAIL by putting the cairo_t into an error state. + + The test runner was extra strict about never letting a test put + the cairo_t into an error state, and never would it check for + the expectedness status of the failure. This patch moves the + check for a test being an XFAIL above the check on the cairo_t's + final status. + + test/cairo-test.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit a76c36f2edd16d8e2b8f49e6409134aceab38a42 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 14:29:20 2009 +0100 + + [xlib] solid pictures should only be 1x1 + + Creating an widthxheight solid picture for using with + RenderCompositeTrapezoids defeats the optimization with the xserver that + checks for a solid alpha pattern. The checks it performs are for + CONTENT_ALPHA, Repeat, 1x1 and value == 0xff. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df067be863bf714f22db0392ab29926edfa8e917 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 08:45:40 2009 +0100 + + [polygon] Compute the limit of the limits slightly more efficiently + + Initialize the bbox to the first limit, as frequently there will only be a + single (or at least a small number) limit. + + src/cairo-polygon.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit a1bac73f24069990842fa8f31e776b4d2c72546e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 09:20:46 2009 +0100 + + [boilerplate] Handle errors whilst creating GL surface + + boilerplate/cairo-boilerplate-gl.c | 11 ++++++----- + src/cairo-glx-context.c | 16 ++++++++-------- + 2 files changed, 14 insertions(+), 13 deletions(-) + +commit f1d284f9976d38f636c6791f11479ae75d7bd199 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 01:00:59 2009 +0100 + + [polygon] Fix discard with non-banded disjoint clip boxes + + The early discard checked if the line was below the last clip-box, or if + above the first. However, the clip-boxes are only sorted on by the bottom + (not the strict XY-banded sort of the regions) and so this was erroneously + discarding lines. + + src/cairo-polygon.c | 29 ++++++++++++++++++++++++----- + src/cairo-types-private.h | 1 + + 2 files changed, 25 insertions(+), 5 deletions(-) + +commit a6dfdeec82ec34d88276fd0bb0ddcc94405d89f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 3 00:59:21 2009 +0100 + + [test] Add clip-disjoint + + Soeren found another bug (thanks Soeren!) in the clipping code - as + reproduced by this test case. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/clip-disjoint.c | 90 ++++++++++++++++++++++++++++++++++++++++ + test/clip-disjoint.ref.png | Bin 0 -> 5520 bytes + test/clip-disjoint.xlib.ref.png | Bin 0 -> 5395 bytes + 5 files changed, 93 insertions(+) + +commit ff6bc1e132836c68d4f538799c2cd26a2d9cace4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 2 21:22:33 2009 +0100 + + [script] Always create a fallback font + + In order to get a baseline for win32 performance testing, always create a + font so that the trace can be replayed. Not ideal, but I feel this the + pragmatic solution for judging the performance differentials before I can + work out a better solution for loading typ42 fonts. + + util/cairo-script/cairo-script-operators.c | 46 ++++++++++++++++++------------ + 1 file changed, 27 insertions(+), 19 deletions(-) + +commit fcbb288e7cf2f5914c0d2b66ee6d81b694de6de6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 2 21:02:18 2009 +0100 + + [script] Attempt to select a font if ! CAIRO_HAS_FT_FONT + + In order to enable replay of traces on machines that do not use FreeType + as the native font system, we need to convert a type42 font into something + similar. Currently the fallback is just to select a font with the same + name - this ignores weight and slant, and many other details. + + util/cairo-script/cairo-script-operators.c | 106 +++++++++++++++++++++++++++++ + 1 file changed, 106 insertions(+) + +commit 2c03dfa0b406565fca798214a842bac69b042017 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 2 10:09:50 2009 +0100 + + [boilerplate/test] Use numerical equality not string equality + + test == != -eq + + boilerplate/make-cairo-boilerplate-constructors.sh | 2 +- + test/make-cairo-test-constructors.sh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit f5df38ca5efcbc0cd3cc18d9fb67df49ec4859f8 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Sep 2 04:38:52 2009 +0100 + + [build] Fix typos in prototype warnings. + + The -Wstrict-prototypes and -Wmissing-prototypes warnings + weren't actually in use due to typos. + + build/configure.ac.warnings | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c086b40a93057a6fd47d23c85c5026d6fe2f524a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Sep 2 04:29:18 2009 +0100 + + [build] Hush the Solaris compiler about enum abuse. + + Sun Studio 12 doesn't like it when we mix our + enum values and types. We do that a lot on purpose + so the warnings from compiles were very verbose. + + build/aclocal.cairo.m4 | 23 +++++++++++++++++++++-- + build/configure.ac.warnings | 6 ++++++ + 2 files changed, 27 insertions(+), 2 deletions(-) + +commit f081a5ff554267eebecea4652bb483eea11d1484 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Sep 2 04:10:39 2009 +0100 + + [build] Refine the -Wno-attribute test to check our use cases. + + We don't actually check that -Wno-attribute does what + we think it does. On clang it doesn't since it happily + seems to recognize but ignore the attribute. + + This patch factors out a silent version of CAIRO_CC_TRY_FLAG + which accepts an optional program argument and actually tests + that the compiler doesn't produce any warning messages. It + is then used to check that -Wno-attribute doesn't complain + when the __warn_unused_result__ attribute is applied to + void functions or variables. + + build/aclocal.cairo.m4 | 42 ++++++++++++++++++++++++++++++++++-------- + build/configure.ac.analysis | 2 +- + build/configure.ac.warnings | 10 ++++++---- + 3 files changed, 41 insertions(+), 13 deletions(-) + +commit c87b366bfec4eeda2646b33cb8a33822a301456c +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Sep 2 04:09:46 2009 +0100 + + [constructors] Guard against being called without any input files. + + The make-cairo-(test|boilerplate)-constructors scripts ought + never to be called without arguments lest we are left constructorless. + + boilerplate/make-cairo-boilerplate-constructors.sh | 7 ++++++- + test/make-cairo-test-constructors.sh | 7 ++++++- + 2 files changed, 12 insertions(+), 2 deletions(-) + +commit b509b548b1e3ac5a9e3de2f9652cd1973d295fa3 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 24 09:12:10 2009 +0300 + + [trace] Check for __builtin_return_address explicitly. + + Some other compilers such as clang and icc support the + __builtin_return_address() intrinsic as well, so we don't + need to check for __GNUC__ >= 3 only. + + build/configure.ac.system | 12 ++++++++++++ + util/cairo-trace/trace.c | 2 +- + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 2b0e070f6a6bee415b1036fd149f0c41bcf87abb +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 24 07:48:57 2009 +0300 + + [trace] Replace an open coded test for matrix identity. + + The code has a _matrix_is_identity() function we can use + instead of open coding the same test. + + util/cairo-trace/trace.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 70ea9e3ce1b0037999340e484e62d3a1484da41a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 24 07:46:20 2009 +0300 + + [trace] Don't crash on unknown enums values. + + If the tracer encounters an unknown enum value it + ought not to crash. Theis patch replaces the idiom + of looking up a name for an enumerated value directly + from a table by a switch statement. As a bonus we get + warnings from the compiler when the enums are updated + in cairo. + + util/cairo-trace/trace.c | 313 ++++++++++++++++++++++++++--------------------- + 1 file changed, 172 insertions(+), 141 deletions(-) + +commit 174c2620c82a47d067ec7b5062a4f513155a0b1f +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 24 07:42:57 2009 +0300 + + [trace] Check for object stack underflow. + + If the tracer's object stack underflows we want to + know about is as soon as possible. This patch adds + checks against the stack overflowing and aborts the + program with an object stack dump if it does. + + util/cairo-trace/trace.c | 26 ++++++++++++++++++++++++-- + 1 file changed, 24 insertions(+), 2 deletions(-) + +commit bb480d235882d8e7d5748a3837f9b274a8b8ac86 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Jul 21 21:18:36 2009 +0300 + + [NEWS] Thank the AuroraUX team for facilitating Solaris testing. + + NEWS | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c64f6f8a15306cdcf5dd02480049b0f9112fd6ac +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 26 16:54:11 2009 +0300 + + [trace] Get the tracee program name from the environment. + + Support non-Linux systems which don't have a /proc/self/cmdline + by transferring the application name given to cairo-trace via + an environment variable CAIRO_TRACE_PROG_NAME. + + util/cairo-trace/cairo-trace.in | 3 ++- + util/cairo-trace/trace.c | 31 +++++++++++++++++++------------ + 2 files changed, 21 insertions(+), 13 deletions(-) + +commit 17cdffafda04514f08e0f0f11d0a85b938282c38 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 2 00:41:18 2009 +0100 + + [xlib] Remove stray code + + Grr. Should have spotted this before pushing - remove the addition of the + superfluous code. + + src/cairo-xlib-surface.c | 13 ++----------- + 1 file changed, 2 insertions(+), 11 deletions(-) + +commit 59c4fe93ee30c8182ae1a29267b9c08602e2f6c5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 2 00:34:37 2009 +0100 + + [xlib] Eliminate GC clipping + + Eradicate the use of clipping with GC. By never using clipping, we never + have to worry about retrieving a dirty clip from the GC cache. + + src/cairo-xlib-private.h | 12 +-- + src/cairo-xlib-screen.c | 50 ++++------ + src/cairo-xlib-surface-private.h | 2 - + src/cairo-xlib-surface.c | 197 ++++++++++++++++++--------------------- + 4 files changed, 116 insertions(+), 145 deletions(-) + +commit 075fc5666abe006c434bf7ec28d2d4f0226a1d3a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 2 00:33:22 2009 +0100 + + [test] Add clip-image + + Exercise the XCopyArea() paths under clipping - whilst modifying that code + I noticed that it was not being exercised by the test suite. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/clip-image.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/clip-image.ref.png | Bin 0 -> 2679 bytes + 4 files changed, 96 insertions(+) + +commit 7d1eb259f93d3f2f2e754b2b8b90cb88359b477d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 23:12:43 2009 +0100 + + [xlib] Make xlib_display_t private and rename xlib_screen_info_t + + The issue Joonas was trying to solve was the unwanted inclusion of + the inlines via cairo-freelist-private.h. Unwittingly he included + cairoint.h from cairo-xlib-private.h instead, a far more heinous crime as + that causes the boilerplate to try to use the hidden, private symbols. + Instead we resolve this issue by making the cairo_xlib_display_t structure + private to cairo-xlib-display.c and provide functions to manipulate the + abstract data type. Whilst in the vicinity, we rename + cairo_xlib_screen_info_t to cairo_xlib_screen_t for consistency and + cleanliness. + + src/cairo-xlib-display.c | 126 ++++++++++++++++++++++++++-- + src/cairo-xlib-private.h | 88 ++++++++++++-------- + src/cairo-xlib-screen.c | 155 ++++++++++++++++------------------- + src/cairo-xlib-surface-private.h | 3 +- + src/cairo-xlib-surface.c | 173 ++++++++++++++++++++++----------------- + 5 files changed, 339 insertions(+), 206 deletions(-) + +commit b8ddd66cf6e0d16383580c3c3398343f577b89fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 21:49:01 2009 +0100 + + Revert "[freelist] Make _cairo_freepool_alloc_from_new_pool static inline." + + This reverts commit 5a3fa29b370816acb3a08d60e4031ed82c1e4c73 as it breaks + the boilerplate when linking with gcc. + + src/cairo-freelist-private.h | 29 ++--------------------------- + src/cairo-freelist.c | 29 +++++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+), 27 deletions(-) + +commit 5a3fa29b370816acb3a08d60e4031ed82c1e4c73 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Sep 1 20:57:01 2009 +0100 + + [freelist] Make _cairo_freepool_alloc_from_new_pool static inline. + + The xlib boilerplate includes a cairo private header to be able + to disable usage of the render extension. This indirectly includes + cairo-freelist-private.h which contains a bunch of static inline + functions which use the private _cairo_freepool_alloc_from_new_pool + function, but since that is not inline also, it causes an undefined + extern which cannot be resolved. The binutils linker doesn't care + since the freelist function aren't actually used in the boilerplate + but the Solaris linker does. By making the .._alloc_from_new_pool + function inline no dangling references are created and linking + succeeds. + + src/cairo-freelist-private.h | 29 +++++++++++++++++++++++++++-- + src/cairo-freelist.c | 29 ----------------------------- + 2 files changed, 27 insertions(+), 31 deletions(-) + +commit 68c8eb955d6d16872c2fa488f0960b974611865d +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Aug 31 23:57:20 2009 +0100 + + [wrapper] Avoid a void return gccism. + + Returning void using the pattern "return func_returning_void(...)" + is a gccism not supported by Sun Studio 12. + + src/cairo-surface-wrapper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6ddab64025eacd5000fa295c86c0fddc469bdc5f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 20:25:53 2009 +0100 + + [ps] Clip meta-surface to desired extents. + + Ensure that the meta surface does not extend beyond the operation by + forcing a clip to the extents of the operation. + + Fixes test/device-offset and test/device-offset-positive + + src/cairo-ps-surface.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 43 insertions(+), 3 deletions(-) + +commit 665f5829541703b29e33f80bebf579a17f47a892 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 18:24:42 2009 +0100 + + [ps/pdf] Trim patterns to operation extents + + If we have to rasterise a pattern for use by PS/PDF (for example, to + satisfy CAIRO_EXTENT_PAD) then only generate an image large enough to + cover the operation extents. We ensure tight coverage by computing the + extents afresh - we could do this lazily in the future, but we can not + rely on the bounds as computed by the analysis surface as for native + operations they may not be tight. + + src/cairo-pdf-surface.c | 67 +++++++++++++++++--- + src/cairo-ps-surface.c | 76 +++++++++++++++-------- + src/cairo-surface.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 49 +++++++++++++++ + 4 files changed, 319 insertions(+), 35 deletions(-) + +commit c4c7db96750337076b953a4938afc7b5f16815fc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 14:59:36 2009 +0100 + + [boilerplate] Use xlib as fallback reference for xcb + + And exercise RGB code-paths. + + boilerplate/cairo-boilerplate-xcb.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit e7a118d3f82f2cbefb4a1529cc90f76ed7371ecc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 14:31:38 2009 +0100 + + [path] Standalone header-compilation + + Hmm, TRUE/FALSE apparently weren't defined before use. Odd. + + src/cairo-path-fixed-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4f880deeabc36842b3b4b0d7ad16383db708cd42 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 14:24:59 2009 +0100 + + Compiler warnings + + Add an impossible default condition to avoid a compiler warning. And tweak + the code to avoid mismatching signed/unsigned comparisons. + + src/cairo-pdf-surface.c | 1 + + src/cairo-xml-surface.c | 8 ++++---- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 1bcc3a3fa00445667adc47d4852237271c7eec0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 14:24:06 2009 +0100 + + [tee] Rename 'append' to 'add' and add symmetric 'remove' + + src/cairo-tee-surface.c | 51 ++++++++++++++++++++++++++++++++++++++++++++----- + src/cairo.h | 8 ++++++-- + util/cairo-fdr/fdr.c | 2 +- + util/cairo-sphinx/fdr.c | 2 +- + 4 files changed, 54 insertions(+), 9 deletions(-) + +commit af82670dd3bfdb661de5a01a6856ec01bdf80040 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 1 13:31:52 2009 +0100 + + [pattern] Remove unused hidden symbol for cairo_pattern_status() + + src/cairo-pattern.c | 9 ++++----- + src/cairoint.h | 1 - + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit aca1dff25967940c36caee26977512484f1720ac +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 31 22:28:26 2009 +0930 + + PDF: Ensure operator is selected before painting surface + + src/cairo-pdf-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit a402bdbd32d3ffe4b564318e6dd83831328257b1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 31 22:15:57 2009 +0930 + + PDF: Flush operators before writing to the PDF stream + + src/cairo-pdf-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 119355b2a4d81c903720484adaeb7dea3929ca1f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 31 22:14:15 2009 +0930 + + PDF: Reset alpha to 1.0 before painting a surface + + Fixes a test suite regression. + + src/cairo-pdf-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 20bd7d0edbb01a52bcc88bddcba4cc5237f3a673 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 31 22:03:34 2009 +0930 + + Update ref images + + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 3835 -> 3908 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 3682 -> 3760 bytes + test/rotate-image-surface-paint.pdf.xfail.png | Bin 207 -> 217 bytes + test/scale-offset-image.pdf.argb32.ref.png | Bin 0 -> 9981 bytes + test/scale-offset-image.pdf.ref.png | Bin 10099 -> 0 bytes + test/scale-offset-image.pdf.rgb24.ref.png | Bin 0 -> 9981 bytes + test/scale-offset-similar.pdf.argb32.ref.png | Bin 0 -> 11027 bytes + test/scale-offset-similar.pdf.ref.png | Bin 10890 -> 0 bytes + test/scale-offset-similar.pdf.rgb24.ref.png | Bin 0 -> 11027 bytes + test/surface-pattern-scale-down.pdf.ref.png | Bin 1589 -> 1603 bytes + test/surface-pattern-scale-up.pdf.ref.png | Bin 2712 -> 2793 bytes + 11 files changed, 0 insertions(+), 0 deletions(-) + +commit 135912721f5791ad8eac773fd042c751122c8760 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 30 23:58:53 2009 +0930 + + PDF: Avoid using patterns when filling a surface with EXTEND_NONE + + The fill equivilant of the previous optimization. + + src/cairo-pdf-surface.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 6512faeb9487dcc2d577b5fb3628cf7f13a25c0a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 30 23:38:17 2009 +0930 + + PDF: Avoid using patterns when painting surfaces with EXTEND_NONE + + This is an optimization the PS surface has been using to improve + printing speed and prevent printers from choking on large + images. Applying this optimzation to PDF prevents the same problem + occuring when the PDF is converted to PS. + + src/cairo-pdf-surface.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 58 insertions(+) + +commit 26d568a9ada523793b2e5855678922894e438ef4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 30 23:50:53 2009 +0930 + + PDF: Fix bug when when embedding surfaces + + src/cairo-pdf-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit feaf38d0cdc5a79966d3a412b644705b0f38e75a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Aug 31 16:25:08 2009 +0300 + + [test] Use HAVE_FLOCKFILE instead of _POSIX_C_SOURCE. + + The _POSIX_C_SOURCE 2001.. #define requires C99 mode and + clang on Solaris is strict about such things. Use configure + tests for flockfile() instead. + + test/cairo-test.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 9bb469c51cf580e3ae18b21b3847488e8c4be051 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 24 06:15:46 2009 +0300 + + [trace] Use HAVE_FLOCKFILE/FUNLOCKFILE since configure test for them. + + The trace source was using the flockfile() and funlockfile() + functions directly. + + util/cairo-trace/trace.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b5cf24a4fb0e48a0067c4b5a706890d4c1f3f1ae +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 26 20:06:40 2009 +0300 + + [build] Remove duplicate invocation of AC_CHECK_HEADERS. + + The fenv.h stuff was checked twice. + + build/configure.ac.system | 3 --- + 1 file changed, 3 deletions(-) + +commit 3acccf0ea5ca1fde9cf6b91677588680a2644ee6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 30 12:33:40 2009 +0100 + + [perf] Trim outliers from chart + + Use "mild outliers" method to remove exceptional speed-ups and slow-downs + from the graph, so that the majority of information is not lost by the + scaling. Add the timing labels to the bars so that the true factor is + always presented. + + perf/cairo-perf-chart.c | 211 +++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 172 insertions(+), 39 deletions(-) + +commit 687462be89fd0ddf6b5412f2cb7b4f7b1a80135c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Aug 30 12:07:28 2009 +0200 + + [build] Fix a typo in configure.ac + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a6bcb6260ec8982493ac3411436ec007b40e4501 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 30 10:09:51 2009 +0100 + + [bo-rectangular] Fix assertion failure with insertion sort + + We remember the location of the last insert as the next edge is likely to + be nearby. However, we need to be careful when the pointer rests upon the + HEAD and ensure that we begin the search from the appropriate end. + + src/cairo-bentley-ottmann-rectangular.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 19ebf83b6717e1f02e7be14218007858edf14ef0 +Merge: 40aefac a77f193 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 17:45:48 2009 +0100 + + Merge branch 'stroke-with-spans' + + This branch brings self-intersection removal with virtually no + performance regression. (Compare with the initial implementation that + incurred a 5-10x slowdown due to having to tessellate whole strokes at a + time.) The importance of self-intersection removal is the improved visual + quality it brings - gone are those annoying sparkles on the outside of + rounded-rectangles for instance. Most of the performance overhead + associated with the self-intersection removal is avoided by switching from + trapezoids to spans for strokes. Obviously we are not able to do so for + the xlib backend as we do not yet have a polygon image type, and so the + tessellators are overhauled instead, along with more special casing for + frequent operations to avoid the increased complexity along the general + paths. + + Speedups + ======== + xlib-rgba swfdec-youtube-0 11371.13 (11406.01 0.28%) -> 10450.00 (10461.84 0.66%): 1.09x speedup + ■+ image-rgba firefox-talos-svg-0 73696.53 (73828.28 3.42%) -> 68324.30 (70269.79 1.36%): 1.08x speedup + ■+ image-rgba swfdec-youtube-0 7843.08 (7873.89 2.57%) -> 7393.96 (7399.68 0.18%): 1.06x speedup + + xvfb-rgba swfdec-youtube-0 9627.25 (9634.43 0.16%) -> 9020.55 (9040.97 0.27%): 1.07x speedup + ■+ Slowdowns + ========= + xvfb-rgba gnome-terminal-vim-0 7695.12 (7697.87 0.44%) -> 8569.45 (8588.29 0.19%): 1.11x slowdown + ■+ xvfb-rgba swfdec-giant-steps-0 3811.77 (3815.06 0.23%) -> 4246.67 (4569.17 3.52%): 1.11x slowdown + ■+ image-rgba gvim-0 7150.90 (7181.96 29.36%) -> 14641.04 (14651.36 0.11%): 2.05x slowdown + █ + + One method for overcoming these regressions is to reduce the complexity of + the polygons being fed into the tessellator (both in the number of edges + and intersections). This should be feasible by coupling into Jeff Muizelaar's + stroke-to-path work, which early indications suggest will bring a + significant performance improvement. On top of this, our span + implementation for the image backend is not as efficient as we would hope + for - and Joonas promises a much faster implementation soon. + +commit a77f1933afebe28e0651906c96fd098cd8267a9f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 14:23:41 2009 +0100 + + Use the more generic is_box when doing simple extent checks + + is_rectangle() is far stricter than is_box(), and is only required for a + very limited set of operations (essentially were the rectangle must + conform to the motion as described by cairo_rectangle). For the general + case where we just want to know whether we have a single rectangular path + that covers a certain area, is_box() is sufficient. + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-script-surface.c | 4 ++-- + src/cairo-svg-surface.c | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +commit 0a548d08b5eae73a95fb41f41298c9c43379163e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 16:27:27 2009 +0100 + + [clip] Correctly compute a geometric mask for a rectilinear + arbitrary + + Fix up the geometric clipper to handle intersecting a rectilinear path + with an arbitrary path and inspecting the result to see if it becomes a + a region. + + src/cairo-clip.c | 47 ++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 38 insertions(+), 9 deletions(-) + +commit 8a323d7c8998f308fc222d65badb1289e3f7fb54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 14:15:07 2009 +0100 + + [clip] Apply surface offset when combining with clip mask + + In order to correctly combine the clip mask with the compositing mask the + clip path must be offset so that it is relative to the destination + surface. + + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 85 ++++++++++++++++++++++-------------------- + src/cairo-region.c | 8 +++- + src/cairo-surface-fallback.c | 8 +--- + src/cairo-traps.c | 8 +--- + src/cairo.h | 2 +- + test/clip-stroke.xlib.ref.png | Bin 1563 -> 1490 bytes + 7 files changed, 56 insertions(+), 57 deletions(-) + +commit 21225a7163bc93d34d3e395c840faaba24046bb6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 12:08:12 2009 +0100 + + [clip] Pass in destination offset for combining with clip-mask + + When combining a clip-mask with a subsurface, as when used to combine with + the composite mask, we need to pass the destination surface offset to the + clip so that the paths can be corrected for the new surface. + + src/cairo-clip-private.h | 4 +++- + src/cairo-clip.c | 45 ++++++++++++++++++++++---------------------- + src/cairo-surface-fallback.c | 14 +++++++++----- + 3 files changed, 34 insertions(+), 29 deletions(-) + +commit ac6c6fe1d39effd5b6b382f0f1199af824868ef4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 12:07:20 2009 +0100 + + [test] Add rotated clip. + + Exercise a bug found in not offsetting the clip mask when combining with + the composite mask. + + test/Makefile.am | 3 ++ + test/Makefile.sources | 1 + + test/rotated-clip.c | 110 +++++++++++++++++++++++++++++++++++++++++ + test/rotated-clip.ps.ref.png | Bin 0 -> 3378 bytes + test/rotated-clip.ref.png | Bin 0 -> 3761 bytes + test/rotated-clip.xlib.ref.png | Bin 0 -> 3922 bytes + 6 files changed, 114 insertions(+) + +commit c60280782dfac7de1abe3230a500c7c98735dc02 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 09:59:36 2009 +0100 + + [script] Implement invert + + Flesh out matrix inversion. + + util/cairo-script/cairo-script-operators.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +commit 06ca0b1475caf709fdf32b10a891dfb3b47cc6b1 +Author: Damian Frank <damianf@ubuntu-vm.(none)> +Date: Fri Aug 14 11:35:55 2009 -0500 + + Fix build on systems with older Xrender headers. + + This patch revises xlib so that it doesn't depend on having recent + Xrender headers to build. In particular, some definitions were added + to the private xrender header file, and an ifdef render version check + CAIRO_SURFACE_RENDER_SUPPORTS_OPERATOR was changed to a run-time + check using CAIRO_SURFACE_RENDER_HAS_PDF_OPERATORS. + + src/cairo-xlib-display.c | 7 ++++ + src/cairo-xlib-surface.c | 30 ++------------ + src/cairo-xlib-xrender-private.h | 90 ++++++++++++++++++++++++++++++++++++---- + 3 files changed, 93 insertions(+), 34 deletions(-) + +commit 17ef949b6aaa812dd566f1db016055f8e1913320 +Author: Damian Frank <damianf@ubuntu-vm.(none)> +Date: Fri Aug 14 11:38:52 2009 -0500 + + Rename cairo-script static func to avoid MinGW conflict + + cairo-script-operators.c's _dup function was colliding with one + defined in io.h by MinGW (gcc 4.3.0 package). I renamed it + to _duplicate. + + util/cairo-script/cairo-script-operators.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3e7e0eacef650f1035cfbe15e306116ff711f99c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 17:07:41 2009 +0100 + + Update reference images + + Refresh the test reference images to match the current output where + acceptable. + + test/Makefile.am | 14 ++++++++++++-- + test/clip-fill.xlib-fallback.ref.png | Bin 1039 -> 1063 bytes + test/clip-operator.pdf.argb32.ref.png | Bin 9340 -> 9266 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 5146 -> 5166 bytes + test/clip-operator.ref.png | Bin 8191 -> 8126 bytes + test/clip-operator.rgb24.ref.png | Bin 3279 -> 3244 bytes + test/clip-operator.svg12.argb32.xfail.png | Bin 8404 -> 8378 bytes + test/clip-operator.svg12.rgb24.xfail.png | Bin 4523 -> 4566 bytes + test/clip-operator.xlib-fallback.ref.png | Bin 3226 -> 3228 bytes + test/clip-push-group.svg.ref.png | Bin 0 -> 175 bytes + test/clip-stroke.ref.png | Bin 1528 -> 1451 bytes + test/clip-stroke.xlib-fallback.ref.png | Bin 1566 -> 1490 bytes + test/clip-stroke.xlib.ref.png | Bin 1563 -> 1563 bytes + test/clip-text.svg.ref.png | Bin 933 -> 946 bytes + test/clipped-group.ref.png | Bin 316 -> 289 bytes + test/clipped-group.svg.ref.png | Bin 0 -> 250 bytes + test/device-offset-fractional.pdf.xfail.png | Bin 275 -> 270 bytes + test/extended-blend-alpha.svg12.argb32.xfail.png | Bin 6857 -> 6658 bytes + test/filter-nearest-offset.pdf.xfail.png | Bin 1926 -> 2152 bytes + test/filter-nearest-transformed.pdf.xfail.png | Bin 488 -> 532 bytes + test/ft-text-vertical-layout-type1.svg.ref.png | Bin 3609 -> 3607 bytes + test/ft-text-vertical-layout-type1.xlib.ref.png | Bin 3640 -> 3639 bytes + test/ft-text-vertical-layout-type3.svg.ref.png | Bin 3626 -> 3626 bytes + test/ft-text-vertical-layout-type3.xlib.ref.png | Bin 3605 -> 3605 bytes + test/group-unaligned.svg.argb32.xfail.png | Bin 522 -> 520 bytes + test/leaky-dashed-rectangle.pdf.ref.png | Bin 347 -> 380 bytes + test/mask-glyphs.svg.ref.png | Bin 1211158 -> 1211144 bytes + test/mask.pdf.argb32.ref.png | Bin 7837 -> 7866 bytes + test/mask.pdf.rgb24.ref.png | Bin 7301 -> 7336 bytes + test/mask.svg.argb32.xfail.png | Bin 8613 -> 8641 bytes + test/mask.svg.rgb24.xfail.png | Bin 7189 -> 7199 bytes + test/operator-source.svg12.argb32.xfail.png | Bin 2951 -> 2967 bytes + test/operator-source.svg12.rgb24.xfail.png | Bin 2963 -> 2976 bytes + test/overlapping-glyphs.svg.argb32.ref.png | Bin 0 -> 2338 bytes + test/overlapping-glyphs.svg.rgb24.ref.png | Bin 0 -> 2338 bytes + test/radial-gradient.pdf.ref.png | Bin 277162 -> 280944 bytes + test/radial-gradient.svg.xfail.png | Bin 0 -> 264425 bytes + test/random-intersections-curves-eo.ref.png | Bin 246996 -> 245762 bytes + ...m-intersections-curves-eo.xlib-fallback.ref.png | Bin 246243 -> 244255 bytes + test/random-intersections-curves-eo.xlib.ref.png | Bin 246243 -> 244255 bytes + test/random-intersections-curves-nz.ref.png | Bin 267589 -> 264545 bytes + ...m-intersections-curves-nz.xlib-fallback.ref.png | Bin 266364 -> 264288 bytes + test/random-intersections-curves-nz.xlib.ref.png | Bin 266360 -> 264288 bytes + test/scale-offset-image.pdf.ref.png | Bin 0 -> 10099 bytes + test/scale-offset-image.pdf.xfail.png | Bin 10099 -> 0 bytes + test/scale-offset-image.script.xfail.png | Bin 0 -> 9963 bytes + test/scale-offset-similar.pdf.ref.png | Bin 0 -> 10890 bytes + test/scale-offset-similar.pdf.xfail.png | Bin 11024 -> 0 bytes + test/scale-offset-similar.script.xfail.png | Bin 0 -> 9963 bytes + test/self-intersecting.ref.png | Bin 301 -> 213 bytes + test/smask-text.script.ref.png | Bin 0 -> 1663 bytes + test/smask.pdf.xfail.png | Bin 4393 -> 2848 bytes + test/smask.script.ref.png | Bin 0 -> 3396 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 1831 -> 1810 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 1598 -> 1559 bytes + test/unbounded-operator.svg12.rgb24.xfail.png | Bin 1719 -> 1731 bytes + test/user-font-proxy.svg.ref.png | Bin 16817 -> 16814 bytes + test/user-font.pdf.ref.png | Bin 0 -> 6241 bytes + 58 files changed, 12 insertions(+), 2 deletions(-) + +commit 155e10e632cb647df5c3d54a75975bc16591287d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 08:04:33 2009 +0100 + + [script] Fix use of freed list + + A typo, I missed converting the user over to the freshly sorted list, + leaving it iterating over original but checking the sorted for termination + conditions. + + src/cairo-script-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5393aa6d6c4676f20d316f3cd0a18bb497574e50 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 29 08:02:52 2009 +0100 + + [path] Return the canonical box. + + When returning the single box that represents a path, always return it + consistently wound. + + src/cairo-path-fill.c | 32 -------------------------------- + src/cairo-path-fixed.c | 28 ++++++++++++++++++++++++---- + 2 files changed, 24 insertions(+), 36 deletions(-) + +commit afea5eb79d2159fe9a5dc1a1a7b9445e40fbb474 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 28 17:10:35 2009 +0100 + + [scaled-font] Fix implementation-face refleak + + If we found the font via the holdover cache, or if we returned due to an + error, we would leak a reference count on the implementaton face. + + src/cairo-scaled-font.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit e5d44937f34d35606ad7f07415be7331cf146567 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 28 17:09:54 2009 +0100 + + [ft] Improve error path handling. + + Specifically check for an error during resolving the font and do not cache + the error object. + + src/cairo-ft-font.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit e76856e6ee563affc0a273ed6eef865866802dec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 28 15:51:33 2009 +0100 + + [scaled-font] Refleak on error path. + + Perform the destroy of the local font before returning along the error + path. + + src/cairo-scaled-font.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit d7d6f75ed26bc3ea040c618442ba71c89633ac7b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 28 15:50:13 2009 +0100 + + [clip] Fix refleak of previous clipping surfaces. + + When combining previous clip masks, we leaked a referenced due to not + destroying the returned reference. + + src/cairo-clip.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 52e5ce3a36ab1cd7da25056df7f12ac0b23e410d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 27 17:25:08 2009 +0100 + + [test] Add clip-stroke + + Soeren was the first to report a clipping regression in the xlib backend + with strokes, and provided a test case to exercise the bug. This is an + extension of his test to provide coverage of different clipping and + stroking methods. + + test/Makefile.am | 3 + + test/Makefile.sources | 1 + + test/clip-stroke.c | 121 +++++++++++++++++++++++++++++++++ + test/clip-stroke.ref.png | Bin 0 -> 1528 bytes + test/clip-stroke.xlib-fallback.ref.png | Bin 0 -> 1566 bytes + test/clip-stroke.xlib.ref.png | Bin 0 -> 1563 bytes + 6 files changed, 125 insertions(+) + +commit 20cdb99ae8ae0cc02193468e811b1b74b3f6d3b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 27 16:21:30 2009 +0100 + + [path-fixed] Distinguish cw and ccw boxes + + To correctly handle retessellating trapezods constructed from alternately + wound boxes, then we need to pass that information from the path to the + tessellator. We do this by switching the direction of the box if the first + edge is horizontal as opposed to vertical. + + src/cairo-path-fixed.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 219d46a9ebc47f99fa8fe9c6e3f0aa440309f032 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 27 14:45:24 2009 +0100 + + [scaled-font] Eliminate intermediate path when tracing glyphs + + Currently the tracing code for glyphs constructs an temporary path in + order to replay and append to the output. This temporary allocation is + extremely wasteful as we can just directly append the glyph path to + the output path. + + src/cairo-scaled-font.c | 51 +++++++++++++++++++++---------------------------- + 1 file changed, 22 insertions(+), 29 deletions(-) + +commit 2e05922737d63289a3f124699359b8d385315cbd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 27 13:58:43 2009 +0100 + + [stroke] Handle degenerate stroke extents + + If the stroke is degenerate, i.e. the path consists only of a single + move-to and no edges, then the stroke may be visible due to end-capping + (as opposed to fills which are empty). So we also need to pad out the + extents around the current point for the degenerate case. + + src/cairo-path-bounds.c | 31 +++++++++++++------------------ + 1 file changed, 13 insertions(+), 18 deletions(-) + +commit cfd78393f357bc69233d4d00d0fb3a2ff736f1a7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 26 23:32:34 2009 +0100 + + [path] Handle the implicit close for path_fixed_is_box() + + _cairo_path_fixed_is_box() is only called for filled paths and so must + handle the implicit close (which was already being correctly handled by + _cairo_path_fixed_iter_is_box). + + src/cairo-path-fixed.c | 33 ++++++++++++++++++--------------- + 1 file changed, 18 insertions(+), 15 deletions(-) + +commit f22045bb4b9e700ce223c259ad41403dc7efe81f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 26 23:30:02 2009 +0100 + + [fallback] Include implicit closes in the check for rectilinear paths + + Fixes test/implicit-close + + By forgetting the implicit-close when checking for rectilinear paths, we + tried to feed the triangle (and other diagclose) into the specialised + rectilinear tesselators which completely mishandled that final edge. + + src/cairo-path-fixed-private.h | 14 ++++++++++++++ + src/cairo-surface-fallback.c | 6 ++++-- + 2 files changed, 18 insertions(+), 2 deletions(-) + +commit 92f6f275fcb5407baf908485ffd08b6787b2caf9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 26 23:27:46 2009 +0100 + + [test] Implicit close + + This is a simple test that broke with the determination of rectilinearity + during path construction. I forgot the implicit close on fill and so the + ignored the final diagonal edge and failed to draw the triangle. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/implicit-close.c | 54 ++++++++++++++++++++++++++++++++++++++++++++ + test/implicit-close.ref.png | Bin 0 -> 251 bytes + 4 files changed, 56 insertions(+) + +commit 8078cd194e95a10cf653c970d1ddd39049a511f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 23 15:25:42 2009 +0100 + + [boilerplate] Runtime library check + + For the purposes of benchmarking it is useful to run cairo-perf against a + different library from the one it was compiled against. In order to do so, + we need to check that the runtime library contains the required entry + points for our targets - which we can check by using dlsym. + + boilerplate/Makefile.am | 3 +++ + boilerplate/cairo-boilerplate-directfb.c | 2 ++ + boilerplate/cairo-boilerplate-drm.c | 2 ++ + boilerplate/cairo-boilerplate-gl.c | 2 ++ + boilerplate/cairo-boilerplate-glitz-agl.c | 2 ++ + boilerplate/cairo-boilerplate-glitz-glx.c | 2 ++ + boilerplate/cairo-boilerplate-glitz-wgl.c | 2 ++ + boilerplate/cairo-boilerplate-pdf.c | 2 ++ + boilerplate/cairo-boilerplate-ps.c | 4 ++++ + boilerplate/cairo-boilerplate-quartz.c | 2 ++ + boilerplate/cairo-boilerplate-script.c | 1 + + boilerplate/cairo-boilerplate-skia.c | 2 ++ + boilerplate/cairo-boilerplate-svg.c | 4 ++++ + boilerplate/cairo-boilerplate-test-surfaces.c | 8 +++++++ + boilerplate/cairo-boilerplate-vg.c | 4 ++++ + boilerplate/cairo-boilerplate-win32-printing.c | 2 ++ + boilerplate/cairo-boilerplate-win32.c | 2 ++ + boilerplate/cairo-boilerplate-xcb.c | 1 + + boilerplate/cairo-boilerplate-xlib.c | 4 ++++ + boilerplate/cairo-boilerplate.c | 29 +++++++++++++++++++++++--- + boilerplate/cairo-boilerplate.h | 1 + + configure.ac | 7 +++++++ + 22 files changed, 85 insertions(+), 3 deletions(-) + +commit 7447915381fc64bd0c66f7110c1dd0b8a10d73f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 22:20:35 2009 +0100 + + [script] Conditionalise the build + + Allow the interpreter to be disabled if we can not satisfy its dependencies. + + configure.ac | 2 ++ + util/Makefile.am | 11 +++++++++-- + util/cairo-script/Makefile.am | 2 +- + 3 files changed, 12 insertions(+), 3 deletions(-) + +commit fcda9fc2f29c2ee7d0bb45c17a2261badfdf430c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 18:48:33 2009 +0100 + + [scaled-font] Remove assert from cairo_scled_font_create() + + The assert() is only correct for the normal paths, but failed on the error + path. It has been run for long enough for me to be confident that the code + is self-consistent, so I think I can now safely remove it. + + src/cairo-scaled-font.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 93cfa7376fb505e676d113e8ef431bab9b497f56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 18:45:54 2009 +0100 + + [win32] Use the system scaled_font_done + + Pointless as both functions are empty, but lets be pedantically correct + nevertheless. + + src/cairo-win32-font.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 8654a4b35c060ab06860c124a643be912060c4a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 18:16:20 2009 +0100 + + [win32] Initialize clip_region + + Eek, I attempted to destroy an uninitialised region on the first use + of a clip. + + src/cairo-win32-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9b33a2e1c794996cbe4cb0a5c773d50566d46bd4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 17:40:12 2009 +0100 + + [win32] Compiler warnings + + Innocuous warnings about the use of mismatching explicit casts (I'm really + not convinced by the merits of this particular compiler warning, but it + does cleanse the code slightly.) + + src/cairo-win32-printing-surface.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit d1740d8782d90edb5b5e20dc5bcadb7a9eeeb4cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 20 21:11:11 2009 +0100 + + [pattern] Ensure that no repeated pattern is clipped + + Previously the pattern_acquire_surface routine only had to worry about + handling extend modes NONE or REPEAT and so the test for ! REPEAT + sufficed when what was actually intended was a test for NONE. + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 958f7ab1238b8242975d3ea774c26d23e090e70c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 19 12:35:00 2009 +0100 + + [script] Support running on cairo-1.8 + + Pre 1.9 the application had to pass a resolved font to cairo -- so do so + in the interpreter if the cairo version is less than 1.9 + + util/cairo-script/cairo-script-operators.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 87175334a574fa0f69679b1a0baeeb881eaa439b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 21 15:51:12 2009 +0100 + + [gl] Use spans for trapezois. + + Always use spans, even for unaligned boxes. In the future (given a new + interface) we may want to emit the common unaligned box code more + efficient than a per-scanline computation -- but for now simply avoid the + requirements to write a temporary CPU buffer. + + src/cairo-gl-surface.c | 22 ++++++++++++++++++---- + src/cairo-image-surface.c | 4 +--- + src/cairo-surface-fallback.c | 10 ++-------- + src/cairo-surface.c | 27 ++++++++++----------------- + src/cairo-win32-surface.c | 4 +--- + src/cairoint.h | 18 ++++++++++++++---- + 6 files changed, 46 insertions(+), 39 deletions(-) + +commit e65dfacab5d123913a4b2f59967f27c0b0af0692 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 21 15:50:24 2009 +0100 + + [gl] Simplify acquire_dest_image() + + Remove redundant code: the intersection of surface extents and the copy to + a temporary buffer. + + src/cairo-gl-surface.c | 53 ++++++++++++-------------------------------------- + 1 file changed, 12 insertions(+), 41 deletions(-) + +commit 5a13396373180ceae31287441ef9c838c771849d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 21 15:48:38 2009 +0100 + + [gl] Use common ARRAY_LENGTH macro + + Forgo the local ARRAY_SIZE macro where the common one will suffice. + + src/cairo-gl-surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit efdb53425ee71b3bce6c92ce212f5baf3e2a43d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 21 11:58:31 2009 +0100 + + [qt] Discard impossible status return from path construction + + As we never return an error status during the path construction, we can + use the return value for the QPainterPath instead, greatly simplifying the + callers. + + src/cairo-qt-surface.cpp | 105 +++++++++++++++++++---------------------------- + 1 file changed, 42 insertions(+), 63 deletions(-) + +commit f2cde41cabaa0c190ef965f634cf2c73b6ba2334 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 21 10:29:39 2009 +0100 + + [cairoint.h] Add missing cairo_private to debug prototypes. + + src/cairoint.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b6d96bba8a4e9efe1033dd7fc875aba9bd8d0dc8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 20 20:31:49 2009 +0100 + + [win32] Trust the clipping code to trim roi to our surface + + The higher level code ensures that the region of interest is trimmed to + our declared surface extents, so performing the intersection again is + redundant. Furthermore with the change in the clipping code, the + fallback region is no longer clipped, especially as the clip that is + currently set upon the DC is likely to be stale and incorrect for the + fallback. + + Hopefully this resolves the assertion failure reported by Damian Frank, + http://lists.cairographics.org/archives/cairo/2009-August/018015.html + + CC: Damian Frank <damian.frank@gmail.com> + + src/cairo-win32-surface.c | 53 ++++++++--------------------------------------- + 1 file changed, 9 insertions(+), 44 deletions(-) + +commit d7faec024ac9f702c9bb305599ef8960a972491a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 15 11:15:22 2009 +0100 + + Add skia backend + + Originally written by Vladimir Vukicevic to investigate using Skia for + Mozilla, it provides a nice integration with a rather interesting code + base. By hooking Skia underneath Cairo it allows us to directly compare + code paths... which is interesting. + + [updated by Chris Wilson] + + boilerplate/Makefile.sources | 1 + + boilerplate/Makefile.win32.features | 10 + + boilerplate/cairo-boilerplate-skia.c | 50 ++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 + + build/configure.ac.features | 1 + + configure.ac | 13 + + perf/cairo-perf-trace.c | 3 + + perf/cairo-perf.c | 3 + + src/Makefile.sources | 3 + + src/Makefile.win32.features | 14 + + src/cairo-skia-surface.cpp | 1174 ++++++++++++++++++++++++++++++++++ + src/cairo-skia.h | 84 +++ + src/cairo.h | 4 +- + 14 files changed, 1363 insertions(+), 1 deletion(-) + +commit af6df4af51ad75a956e3b73542647206ab534bd2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 20 12:54:12 2009 +0100 + + [configure] Choose a better name for the 'temporary' egl iterator + + The problem is that it remains referenced by egl_NONPKGCONFIG_LIBS and so + must not be subsequently overwritten, so give it an egl_ prefix. + + configure.ac | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 83c2f44dd954cb491d72834d0362d6d801ef7651 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 20 12:16:55 2009 +0100 + + [test] Update REFERENCE_IMAGES + + test/Makefile.am | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit f99e1841448e98be6161be57551153a6d9e28a13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 20 12:11:51 2009 +0100 + + [build] Remove -Wcast-align + + Use -Wcast-align simply generates too much noise due to false-positive + reports when casting pixels to uint32_t. + + build/configure.ac.warnings | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 5fdf5b311e06e49843e924523e9bc91ba14da3bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 19 08:35:01 2009 +0100 + + [fallback] Reduce paint + clipmask to fill + + Under simple, yet common, conditions using a bounded operator and painting + with a single complex clip we can reduce the strength of that operation to + a fill. In effect this removes the need for a temporary mask for some + backends (GL, drm, xlib). + + src/cairo-surface-fallback.c | 26 +++++++++++++++++--------- + 1 file changed, 17 insertions(+), 9 deletions(-) + +commit 425b0e35e2d7d44d99e22169b98fc3ca05763650 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 18 14:25:25 2009 +0100 + + Add xml surface + + A very simple surface that produces a hierarchical DAG in a simple XML + format. It is intended to be used whilst debugging, for example with the + automatic regression finding tools of cairo-sphinx, and with test suites + that just want to verify that their code made a particular Cairo call. + + boilerplate/Makefile.win32.features | 10 + + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 + + build/configure.ac.features | 1 + + configure.ac | 4 + + src/Makefile.sources | 18 +- + src/Makefile.win32.features | 14 + + src/cairo-base64-stream.c | 143 ++++ + src/cairo-base85-stream.c | 3 - + src/cairo-output-stream-private.h | 4 + + src/cairo-ps-surface.c | 4 + + src/cairo-script-surface.c | 18 +- + src/cairo-xml-surface.c | 1153 ++++++++++++++++++++++++++++++ + src/cairo-xml.h | 72 ++ + src/cairo.h | 4 +- + util/Makefile.am | 11 +- + util/cairo-script/cairo-script-scanner.c | 113 +++ + util/trace-to-xml.c | 77 ++ + util/xml-to-trace.c | 263 +++++++ + 19 files changed, 1902 insertions(+), 14 deletions(-) + +commit 6e0b3be903a6c3ad948de95f490cff92430429a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 18 10:55:54 2009 +0100 + + Add cairo-sphinx utility for regression analysis + + sphinx is an alternate version of the current cairo-test-trace. It's + purpose is to replay a live application (which may just be a replay of a + trace) against a backend and its reference. The improvement over the + original cairo-test-trace is that the reference backend may be from an + older version of cairo. + + configure.ac | 6 + + util/Makefile.am | 6 + + util/cairo-sphinx/.gitignore | 1 + + util/cairo-sphinx/Makefile.am | 40 ++ + util/cairo-sphinx/fdr.c | 260 +++++++ + util/cairo-sphinx/sphinx.c | 1525 +++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 1838 insertions(+) + +commit c980affce05590f5f52273ba340463f00773c776 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 18 10:54:26 2009 +0100 + + [script] Apply device offset when replaying meta surface + + As we set the size of the surface to fit the ink extents of the meta + surface, we also need to ensure that the origin of the script lies at the + origin of the ink extents. + + src/cairo-script-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit eb33f842dc9a2555ba8f7948f49a8335db951959 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 17 11:38:52 2009 +0100 + + [meta] Missing status check + + We need to check the status on the created image before use. + + src/cairo-meta-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ce6a2cc5d2cb8a299759d764de2e7d2b6b655cb4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 17 10:31:47 2009 +0100 + + [wrapper] Always copy clip + + We always need to make a local copy of the clip as the backends are free + to modify it as they process the operation. + + src/cairo-surface-wrapper.c | 60 +++++++++++++++++++++++++++++++++------------ + 1 file changed, 44 insertions(+), 16 deletions(-) + +commit 6ff711b6305a9cf65e584d92258a6fa4e78c31ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 17 10:11:32 2009 +0100 + + [matrix] Improve bbox finding for translation matrix + + If the matrix is a pure translation matrix than we can skip determination + of the extents and just translate the input bbox. + + src/cairo-matrix.c | 56 ++++++++++++++++++++++++++++-------------------------- + 1 file changed, 29 insertions(+), 27 deletions(-) + +commit cd7b27ff5c01a533c2c065c4b455ad19df2be3bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 21:08:22 2009 +0100 + + Add 'flight-data-recorder' utility. + + This is a simple variation on cairo-trace that wraps records the last 16 + contexts by wrapping the target surface inside a tee surface, along with a + meta/recording surface. Then on receipt of a SIGUSR1, those last 16 + contexts are played via a script-surface into /tmp/fdr.trace. + + Mostly proof-of-concept, it seems to be causing a number of rendering + glitches whilst testing with firefox -- otherwise, it seems to works. + + configure.ac | 1 + + src/cairo-scaled-font-private.h | 3 + + src/cairo-scaled-font.c | 16 +++ + src/cairo-script-surface.c | 58 +++++++- + src/cairo-script.h | 4 + + src/cairo.h | 4 + + util/Makefile.am | 3 + + util/cairo-fdr/Makefile.am | 13 ++ + util/cairo-fdr/fdr.c | 304 ++++++++++++++++++++++++++++++++++++++++ + 9 files changed, 400 insertions(+), 6 deletions(-) + +commit 658cdc7c9aac23f82f3ea5db8df10844aeb3ac75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 18:04:54 2009 +0100 + + Introduce cairo_tee_surface_t + + Add a new surface type that multiplies it input onto several output + surfaces. The only limitation is that it requires a master surface that is + used whenever we need to query surface options, such as font options and + extents. + + boilerplate/Makefile.win32.features | 8 + + build/Makefile.win32.features-h | 1 + + build/configure.ac.features | 1 + + configure.ac | 1 + + src/Makefile.sources | 6 +- + src/Makefile.win32.features | 8 + + src/cairo-surface-wrapper-private.h | 4 + + src/cairo-surface-wrapper.c | 7 + + src/cairo-surface.c | 11 + + src/cairo-tee-surface-private.h | 47 +++ + src/cairo-tee-surface.c | 558 ++++++++++++++++++++++++++++++++++++ + src/cairo.h | 13 +- + 12 files changed, 662 insertions(+), 3 deletions(-) + +commit 4ae7186719b25f052b875549cc5377e16a557512 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 17:07:00 2009 +0100 + + [script] Correct emission of get_target() for a popped context + + If the context is no longer on the operand stack, then we need to recall + the surface via a definition. + + src/cairo-script-surface.c | 53 ++++++++++++++++++++++++++++------------------ + 1 file changed, 32 insertions(+), 21 deletions(-) + +commit 8d1bf830c0137eac837091bda92a636c0fcb0456 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 14:20:35 2009 +0100 + + Fix errors found by clang + + Shadowed variables, unused writes and some dead code. + + src/cairo-pdf-surface.c | 2 -- + src/cairo-xlib-surface.c | 5 ++--- + util/cairo-script/cairo-script-file.c | 10 +++------- + util/cairo-script/cairo-script-operators.c | 23 ++++++++++++++++------- + util/cairo-trace/trace.c | 14 ++++++++------ + 5 files changed, 29 insertions(+), 25 deletions(-) + +commit d8dbce021a4493330864154e67ca6e4a1f2f50b2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 13:26:59 2009 +0100 + + [script] recursive active (type3 glyphs) + + The assumption that an active surface could not recurse into another + operation was invalid - due to the complexity of handling type3 glyphs. + + src/cairo-script-surface.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit eba6b5126a55c84706e677b3fc88743f64cc28d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 12:47:14 2009 +0100 + + [build] Add options for warning about bad casts + + -Wbad-function-cast in particular. Triggers quite a few warnings where we + have explicitly cast to an integer. + + build/configure.ac.warnings | 9 +- + src/cairo-arc.c | 2 +- + src/cairo-pdf-surface.c | 8 +- + src/cairo-ps-surface.c | 20 ++-- + src/cairo-svg-surface.c | 4 +- + util/cairo-script/cairo-script-objects.c | 4 +- + util/cairo-script/cairo-script-operators.c | 172 +++++++++++++++++++---------- + util/cairo-script/cairo-script-private.h | 6 +- + 8 files changed, 143 insertions(+), 82 deletions(-) + +commit 33ef32af4e7adce41f035ee378279c19577469b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 12:46:20 2009 +0100 + + [clip] Use the rectangular tessellator to extract boxes + + src/cairo-clip.c | 17 ++++++++++------- + src/cairo-path-fill.c | 29 ++++++++++++++++++++++------- + src/cairo-surface-fallback.c | 8 ++++---- + 3 files changed, 36 insertions(+), 18 deletions(-) + +commit ab035ab2c7bec254fc94d6391398905b5039e777 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 28 10:06:04 2009 +0100 + + [tessellate] Rectangular special case + + Add an even simpler sweep-line tessellator for rectangular trapezoids (as + produced by the rectilinear stoker and box filler). + + This is so simple it even outperforms pixman's region validation code for the + purposes of path-to-region conversion. + + src/Makefile.sources | 1 + + src/cairo-bentley-ottmann-rectangular.c | 733 ++++++++++++++++++++++++++++++++ + src/cairo-clip.c | 26 +- + src/cairo-path-fill.c | 40 +- + src/cairo-path-stroke.c | 3 +- + src/cairo-surface-fallback.c | 95 ++++- + src/cairo-traps.c | 28 +- + src/cairoint.h | 5 + + 8 files changed, 883 insertions(+), 48 deletions(-) + +commit d7b0c3b784faba756b10b66b9757e6e4c3fce38c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 22:03:06 2009 +0100 + + [script] Track scaled-font + + Instead of emitting the (font-face, matrix and options) elements when + setting up the desired font on the matrix, simply restore the scaled-font. + + src/cairo-script-surface.c | 39 ++++++++++++++++++++++----------------- + 1 file changed, 22 insertions(+), 17 deletions(-) + +commit 7306305cc898c9f27957c6c6717028cbdcff6a5a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 21:59:12 2009 +0100 + + [script] Emit surface content + + Include the desired content with the creation info. + + boilerplate/cairo-boilerplate-script.c | 2 +- + src/cairo-script-surface.c | 34 +++++++++++++++++++++------------- + src/cairo-script.h | 1 + + util/cairo-trace/trace.c | 5 ++++- + 4 files changed, 27 insertions(+), 15 deletions(-) + +commit 052211b072788f0977dccebdcf681d4874f2487a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 20:16:51 2009 +0100 + + [script] Garbage collect contexts on context switch + + Previously the contexts were permanently associated with the surface and + only destroyed along with the final reference to the surface. This meant + that we kept a large number of unwanted contexts in memory. Most + applications only have a few contexts active at any time, so remove + inactive contexts from the operand stack every time we perform an + operation on a different context. + + src/cairo-script-surface.c | 262 +++++++++++++++++++++++++++++++-------------- + 1 file changed, 184 insertions(+), 78 deletions(-) + +commit 8f8b91d9049433c9210e0b3aad574cf659862ae0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 18:37:01 2009 +0100 + + [script] Wrap snapshot. + + Use the snapshot of our target surface if available. + + src/cairo-script-surface.c | 20 ++++++++++++++++---- + src/cairo-surface-wrapper-private.h | 3 +++ + src/cairo-surface-wrapper.c | 6 ++++++ + 3 files changed, 25 insertions(+), 4 deletions(-) + +commit fee647c98506eedad0fea667a9442786cb0804b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 18:35:48 2009 +0100 + + [script] Read from a FILE stream + + For ease of implementing the interpreter inside a pipeline, add a method + to execute a FILE *. + + util/cairo-script/cairo-script-interpreter.c | 22 ++++++++++++++++++++++ + util/cairo-script/cairo-script-interpreter.h | 4 ++++ + 2 files changed, 26 insertions(+) + +commit a9d997fecd54cea7dcd71487a24dbae14d0073a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 17:21:05 2009 +0100 + + [script] Introduce cairo_script_context_t + + cairo_script_context_t is an encapsulation object for interfacing with the + output - multiple surfaces can share the same context, meaning that they + write to the same destination file/stream. + + boilerplate/cairo-boilerplate-script.c | 5 +- + boilerplate/cairo-boilerplate.c | 26 +--- + src/cairo-script-surface.c | 225 ++++++++++++++------------------- + src/cairo-script.h | 47 ++++--- + test/cairo-test-trace.c | 5 +- + util/cairo-script/csi-trace.c | 13 +- + util/cairo-trace/trace.c | 20 +-- + 7 files changed, 145 insertions(+), 196 deletions(-) + +commit 28887ac272c8a36a41da4d6d58044164b94da6f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 16:38:08 2009 +0100 + + [trace] Fix emission of similar (track operands) + + util/cairo-trace/trace.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit dbd9438f5d01666ea118254427c0dc66a519ec3e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 15:57:30 2009 +0100 + + [stroke] Only mark traps as having intersection if non-empty. + + We were hitting an assertion attempting to eliminate intersections inside + the rectilinear tessellator for empty strokes. We can avoid this + assertion, by only marking the traps as having potential intersections iff + it is non-empty. + + src/cairo-path-stroke.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 60d73da9f2e148e982254c78773f0b925be184ff +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 24 08:04:12 2009 +0100 + + [clip] Cache intermediate clip masks. + + As we now superimpose a per-operation clip, this defeats the current + top-level caching mechanism. Instead we need to cache the mask for + each path. This still seems quite wasteful, and an avenue would be to + avoid caching if the path is rectilinear and reduce the number of + required composite operations. (However, first find test case...) + + src/cairo-clip.c | 165 ++++++++++++++++++++++++++++++++++--------------------- + src/cairoint.h | 3 + + 2 files changed, 104 insertions(+), 64 deletions(-) + +commit 50c7d637f3a97031c5f4e2bc8d41d17e5397db45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 15:49:11 2009 +0100 + + [trace] Emit an 'index' for an undefined surface + + Larry Ewing hit a bug in cairo-trace whereby it tried to create a similar + surface referencing an undefined object. This fix checks whether the + object has yet to be defined, and if not issues an index in order to copy + the appropriate operand from the stack. + + util/cairo-trace/trace.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +commit 3a483c2896c28142a90bd0e282af3862e066adfe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 00:19:03 2009 +0100 + + [gstate] Convert simple mask() into a paint() + + As using mask() prevents various optimisations in the backends (for + example the use of geometric clips) and for some may trigger fallbacks, + perform the simplifications usually done (too late) by the pattern layer + in the generic gstate layer. This allows us on the odd occasion to + transform a mask() into a paint() but perhaps more importantly removes the + need for identical transformations in each backend. + + src/cairo-gstate.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++----- + src/cairoint.h | 9 ++--- + 2 files changed, 98 insertions(+), 12 deletions(-) + +commit e2c31183e96f84e7d40a9e5e2b6b8802d47628d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 23:45:30 2009 +0100 + + [script] Handle zero-length strings + + Not sure where the zero length string is coming from, but we should + nevertheless handle it. + + util/cairo-script/cairo-script-scanner.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4c215162d24453788b3a461aa47ccf2e638db35e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 23:40:54 2009 +0100 + + [script] Off-by-one in allocation of string length. + + We need pass in the real number of bytes in the string, excluding the NUL + terminator which is already accounted for. + + util/cairo-script/cairo-script-scanner.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 55eddb7ef4b6b561d6692a6f074834d5d5fb94fa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 23:40:04 2009 +0100 + + [script] A little utility to convert a trace into a trace + + Replay the trace using the interpreter onto a script surface - useful for + checking idempotency. + + util/cairo-script/Makefile.am | 6 ++++++ + util/cairo-script/csi-trace.c | 40 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 46 insertions(+) + +commit 4f129863df6392f3deaf6e76fd15adeba98e41b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 23:38:42 2009 +0100 + + [script] Store the current stroke matrix + + We can skip re-emitting stroke parameters if the values are unchanged and + the scaling matrix is unaltered. + + src/cairo-script-surface.c | 46 +++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 37 insertions(+), 9 deletions(-) + +commit 858211f3944507362b2a18d56a65e9a478ccd305 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 22:43:31 2009 +0100 + + [script] Suppress resetting stroke-style elements after matrix switch + + If the user is just using the default values, there is no point re-emitting + them. + + src/cairo-script-surface.c | 42 ++++++++++++++++++++++++++---------------- + 1 file changed, 26 insertions(+), 16 deletions(-) + +commit b6db3053dcde99e26471fdeaedcadd4a6f93b5ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 22:30:58 2009 +0100 + + [script] Hide the implicit CLEAR for similar surfaces + + Do emit the clear that is performed by the surface layer on similar + surfaces. + + src/cairo-script-surface.c | 43 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + +commit 005b195f062d896d76a87d608ce313b169f99201 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 22:07:12 2009 +0100 + + [pattern] Ignore matrix/filter/extend when comparing solids + + Solid patterns do not use their matrices, filter or extend properties so + ignore them for the purposes of comparing and hashing. + + src/cairo-pattern.c | 25 ++++++++++++++++--------- + 1 file changed, 16 insertions(+), 9 deletions(-) + +commit bb919584c0054bb3e3c547f65c91cfe48302ac86 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 21:40:37 2009 +0100 + + [script] Use a compact representation for horizontal offsets between glyphs + + Kerning is quite frequent, that is to apply a horizontal but no vertical + offset to a glyph. For instance by discarding the vertical coordinate + where it remains the same and only encoding the horizontal offset we + reduce the file size by ~12.5% when tracing poppler. + + src/cairo-script-surface.c | 56 +++++++++++++++++++++--------- + util/cairo-script/cairo-script-operators.c | 22 ++++++++---- + 2 files changed, 55 insertions(+), 23 deletions(-) + +commit cbee97f0e3e784b4482429790fc3f42c81908557 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 21:26:11 2009 +0100 + + [script] Preserve '{}' whilst translating + + util/cairo-script/cairo-script-private.h | 1 + + util/cairo-script/cairo-script-scanner.c | 67 +++++++++++++++++--------------- + 2 files changed, 37 insertions(+), 31 deletions(-) + +commit 24b23200025166e8343425f77a53bedd08790367 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 21:12:59 2009 +0100 + + [script] Fix list handling during font destruction + + Use cairo_list to unhook the font correctly during the fini callback. + + src/cairo-script-surface.c | 33 +++++++++++++-------------------- + 1 file changed, 13 insertions(+), 20 deletions(-) + +commit 4032438625819cfa5d1928d653f404364529a2e1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 17:02:41 2009 +0100 + + [path] Eliminate redundant line-to before a close + + As the close implicitly issues a line-to to the initial point, remove an + identical line-to if present. + + src/cairo-path-fixed.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit 111f2be71b1e51fac551fd9214d13899a8ec7909 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 17:01:50 2009 +0100 + + [path] Discard redundant line-to + + Eliminate repeated line-to to the current point. + + src/cairo-path-fixed.c | 49 ++++++++++++++++++++++++++++--------------------- + 1 file changed, 28 insertions(+), 21 deletions(-) + +commit a2d5f59e2158651ac85dcc8a2b8f49cd2861044e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 17:01:07 2009 +0100 + + [debug] Path printer + + src/cairo-debug.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 3 +++ + 2 files changed, 70 insertions(+) + +commit 4bf96bad9697cbe67907df69d40f46d8d7f24325 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 15:37:35 2009 +0100 + + [fill] Use trivial rectilinear_to_traps + + Avoid a small amount of unnecessary overhead by performing a simple + conversion of the path to traps when it consists solely of simple boxes. + + src/cairo-path-fill.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-surface-fallback.c | 14 +++++++++ + src/cairoint.h | 5 +++ + 3 files changed, 93 insertions(+) + +commit 30e5fa0ce06b2572f09f3d47ee10b692f18ba0ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 15:36:11 2009 +0100 + + [polygon] Return status from path ops + + This tidies the common case which was to call, for example, + _cairo_polygon_line_to(); _cairo_polygon_status(); + + src/cairo-path-fill.c | 26 ++++---------------------- + src/cairo-polygon.c | 18 ++++++++++++------ + src/cairoint.h | 6 +++--- + 3 files changed, 19 insertions(+), 31 deletions(-) + +commit 3fcac1ef21de9526bc1abca902db5755abe463ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 13:43:32 2009 +0100 + + [slope] Inline _cairo_slope_init() + + Move the definition to a separate header file and allow callers to inline + the simple function. + + src/Makefile.sources | 1 + + src/cairo-hull.c | 2 ++ + src/cairo-path-fixed.c | 1 + + src/cairo-path-stroke.c | 2 ++ + src/cairo-pen.c | 2 ++ + src/cairo-polygon.c | 2 ++ + src/cairo-slope-private.h | 65 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-slope.c | 9 +------ + src/cairo-spline.c | 2 ++ + src/cairo-traps.c | 1 + + src/cairoint.h | 17 ------------- + 11 files changed, 79 insertions(+), 25 deletions(-) + +commit a1e0c4b30980d624bb3e015b7dcf39b4a2ef8c56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 11 13:34:29 2009 +0100 + + [clip] Combine directly onto target + + Where it is unlikely that we will reuse the temporary clip surface, + combine the clip directly with the mask. + + src/cairo-clip-private.h | 3 ++ + src/cairo-clip.c | 118 ++++++++++++++++++++++++++++++++++++++++--- + src/cairo-surface-fallback.c | 26 +--------- + 3 files changed, 115 insertions(+), 32 deletions(-) + +commit 3f12d9ec5db1ac372742c3c03408bdaeaffdc1e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 28 10:05:52 2009 +0100 + + [clip] Use geometric clipping for unaligned clips + + For the simple cases where the clip is an unaligned box (or boxes), apply + the clip directly to the geometry and avoid having to use an intermediate + clip-mask. + + src/cairo-bentley-ottmann.c | 285 +++---------------------------------- + src/cairo-clip-private.h | 5 + + src/cairo-clip.c | 296 ++++++++++++++++++++++++++++++++++++-- + src/cairo-gstate.c | 15 +- + src/cairo-path-fill.c | 8 +- + src/cairo-path-stroke.c | 22 +-- + src/cairo-polygon.c | 329 ++++++++++++++++++++++++------------------- + src/cairo-rectangle.c | 23 +++ + src/cairo-surface-fallback.c | 267 +++++++++++++++++++---------------- + src/cairo-traps.c | 210 +++++++++++++++------------ + src/cairo-types-private.h | 4 +- + src/cairoint.h | 28 +++- + 12 files changed, 830 insertions(+), 662 deletions(-) + +commit 2457c4bedef0447f7bff9b54dba96126010917ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 14:48:03 2009 +0100 + + traps-as-spans + + Add an interface to spans that accepts trapezoids. This allows backends + that have an efficient span-line interface but lack efficient handling + of boxes (partly due to the current poor compositor interface) to + redirect composite_trapezoids() to composite_polygon() and the + span-renderer. + + src/cairo-spans-private.h | 19 ++++++++++ + src/cairo-spans.c | 82 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-tor-scan-converter.c | 27 +++++++++++++- + 3 files changed, 127 insertions(+), 1 deletion(-) + +commit 3023330706b1237b0fbd697d015cad9a23c250b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 10:57:41 2009 +0100 + + [fill] Early check for empty path/polygon + + src/cairo-path-fill.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 9ba37a85d2f6c033d68eb547be6c63382164519e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 10:57:01 2009 +0100 + + [gstate] Discard trivial all-clipped regions + + Avoid assertion failures later that we have a valid region. + + src/cairo-gstate.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 85094c4eee4e50ec724bf1bb54ecff6f7c1014bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 24 07:06:32 2009 +0100 + + [clip] Eliminate redundant clips + + First perform a simple geometric clip to catch the majority of cases where + an unaligned clip has been set outside the operation extents that can be + discarded without having to use an image surface. + + This causes a dramatic increase of over 13x for the poppler-bug-12266 + trace and little impact elsewhere for more sensible clippers. + + src/cairo-clip-private.h | 8 +- + src/cairo-clip.c | 187 ++++++++++++++++++++++++++++++++++--------- + src/cairo-gstate.c | 106 +++++++++++++++--------- + src/cairo-path-fill.c | 3 + + src/cairo-surface-fallback.c | 111 ++++++++++++++++++------- + 5 files changed, 309 insertions(+), 106 deletions(-) + +commit ff0ca6d02a2e8901e9cfca31326c3fdc16e77e2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 5 17:54:48 2009 +0100 + + [test] Stress the intersection handling by feeding spans/traps random curves + + Another stress test for the fill/stroke and intersection finders. + + test/Makefile.am | 10 +++ + test/Makefile.sources | 2 + + test/random-intersections-curves-eo.c | 81 ++++++++++++++++++++ + test/random-intersections-curves-eo.pdf.ref.png | Bin 0 -> 246507 bytes + test/random-intersections-curves-eo.ps.ref.png | Bin 0 -> 151676 bytes + test/random-intersections-curves-eo.ref.png | Bin 0 -> 246996 bytes + ...m-intersections-curves-eo.xlib-fallback.ref.png | Bin 0 -> 246243 bytes + test/random-intersections-curves-eo.xlib.ref.png | Bin 0 -> 246243 bytes + test/random-intersections-curves-nz.c | 82 +++++++++++++++++++++ + test/random-intersections-curves-nz.pdf.ref.png | Bin 0 -> 266977 bytes + test/random-intersections-curves-nz.ps.ref.png | Bin 0 -> 134732 bytes + test/random-intersections-curves-nz.ref.png | Bin 0 -> 267589 bytes + ...m-intersections-curves-nz.xlib-fallback.ref.png | Bin 0 -> 266364 bytes + test/random-intersections-curves-nz.xlib.ref.png | Bin 0 -> 266360 bytes + 14 files changed, 175 insertions(+) + +commit 6dfe050d6360409161418d853df3d7d7dfb216af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 4 15:32:25 2009 +0100 + + [polygon] Amalgamate collinear edges + + Combine sequential collinear edges into a single edge, this benefits + immensely by feeding fewer edges into either the tessellator or spans. + + src/cairo-polygon.c | 58 +++++++++++++++++++++++++++++++++++++++++------ + src/cairo-types-private.h | 3 +++ + 2 files changed, 54 insertions(+), 7 deletions(-) + +commit dc886450ac7c04252cff77729e0653c6ea2768db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 4 13:14:38 2009 +0100 + + [util] Show total edge length in show-edges + + util/show-edges.c | 54 +++++++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 43 insertions(+), 11 deletions(-) + +commit 0f8af054841c2d6dfe4bfeb3d13a7bab0cfbe2f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 3 08:27:01 2009 +0100 + + [fallback] Avoid tessellating empty polygons + + I added an assert inside the tessellator to ensure that empty polygon were + not being propagated that far... + + src/cairo-surface-fallback.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 09377a716334df3683912747067cd396768cfab6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 2 13:09:30 2009 +0100 + + [freelist] Lazy initialisation of pools + + src/cairo-freelist-private.h | 31 ++++++++++++++++-- + src/cairo-freelist.c | 75 +++++++++++++++++--------------------------- + 2 files changed, 56 insertions(+), 50 deletions(-) + +commit 6f0340e2e5079eba597c0a3a7d39da21cf2b5e7a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 21:47:11 2009 +0100 + + [clip] Use the rectilinear tessellator + + We can ensure that we always produce a clip region when possible by using + the rectilinear tessellator to convert complex, device-aligned polygons to + regions. Prior to using the tessellator, we relied on pixman's region code + which could only handle a union of rectangles. + + src/cairo-clip.c | 9 ++---- + src/cairo-path-fill.c | 79 +++++++++++++++++++++++++++++++++++++++++---------- + 2 files changed, 66 insertions(+), 22 deletions(-) + +commit e3820bef20fdd77ab804b9832f47dc286e4887c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 2 15:17:51 2009 +0100 + + [fill] Short-circuit extents on an empty path. + + If the path is empty, avoid redundant polygonisation and tessellation by + simply returning the empty extents. + + src/cairo-gstate.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 4051ed328b618e28cf1df276899eefa225225c76 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 25 20:51:06 2009 +0100 + + [tessellator] Special case rectilinear tessellation + + For the frequent cases where we know in advance that we are dealing with a + rectilinear path, but can not use the simple region code, implement a + variant of the Bentley-Ottmann tessellator. The advantages here are that + edge comparison is very simple (we only have vertical edges) and there are + no intersection, though possible overlaps. The idea is the same, maintain + a y-x sorted queue of start/stop events that demarcate traps and sweep + through the active edges at each event, looking for completed traps. + + The motivation for this was noticing a performance regression in + box-fill-outline with the self-intersection work: + + 1.9.2 to HEAD^: 3.66x slowdown + HEAD^ to HEAD: 5.38x speedup + 1.9.2 to HEAD: 1.57x speedup + + The cause of which was choosing to use spans instead of the region handling + code, as the complex polygon was no longer being tessellated. + + src/Makefile.sources | 1 + + src/cairo-bentley-ottmann-rectilinear.c | 582 +++++++++++++++++++++++++++++ + src/cairo-bentley-ottmann.c | 5 +- + src/cairo-combsort-private.h | 4 +- + src/cairo-path-fill.c | 100 +---- + src/cairo-path-stroke.c | 1 + + src/cairo-surface-fallback.c | 34 +- + src/cairo-traps.c | 2 + + src/cairoint.h | 18 +- + test/ft-text-vertical-layout-type1.ref.png | Bin 3647 -> 3644 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3607 -> 3608 bytes + 11 files changed, 631 insertions(+), 116 deletions(-) + +commit 82ccb4c70cbf28167c280e590017b221a406b5c3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 18:47:29 2009 +0100 + + [clip] Use special-purpose fill_to_region() + + Avoid the creation of temporary traps when generating a region, by calling + the to_region() directly. + + src/cairo-clip.c | 26 +++++++++----------------- + 1 file changed, 9 insertions(+), 17 deletions(-) + +commit 41adeac9880d011278f083c620a42b849471a92f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 25 21:25:07 2009 +0100 + + [fallback] Avoid going through traps for trivial regions. + + src/cairo-path-fill.c | 129 ++++++++++++++++++++++++++++++ + src/cairo-surface-fallback.c | 184 ++++++++++++++++++++++++++++++++----------- + src/cairoint.h | 5 ++ + 3 files changed, 272 insertions(+), 46 deletions(-) + +commit 55bd590561880136c54da0db1f7f095a426d96a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 24 20:45:56 2009 +0100 + + [tessellator] Use a priority queue for the events + + The skip list was suffering from severe overhead, so though the search was + quick, the extra copies during insertion and deletion were slow. + + src/Makefile.am | 5 +- + src/Makefile.sources | 2 - + src/cairo-bentley-ottmann.c | 341 +++++++++++++++++++++--------------- + src/cairo-freelist.c | 8 +- + src/cairo-skiplist-private.h | 118 ------------- + src/cairo-skiplist.c | 399 ------------------------------------------- + 6 files changed, 212 insertions(+), 661 deletions(-) + +commit ebfcc2ce8fb6fcaf28d1c59cf7a5b13168cbeb70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 24 16:50:33 2009 +0100 + + [tessellator] Remove the skiplist for the active edges + + The active edge list is typically short, and the skiplist adds significant + overhead that far outweigh the benefit of the O(n lg n) sort. Instead we + track the position of the last insertion edge, knowing that the start + events are lexicographically sorted, and begin a linear search from there. + + src/cairo-bentley-ottmann.c | 230 +++++++++++++++----------------------------- + 1 file changed, 75 insertions(+), 155 deletions(-) + +commit 36480fe531f19d9c692ee1f8cf09accd4b2c0ad8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 25 07:38:04 2009 +0100 + + [traps] Increase exponential expansion factor. + + Grow the traps more rapidly, as the allocations are very short-lived so + the over-allocation is less of an issue. + + src/cairo-traps.c | 8 +++----- + src/cairoint.h | 8 +++----- + 2 files changed, 6 insertions(+), 10 deletions(-) + +commit 9d51c03bad5f10257e248f43375062902482c0c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 24 13:51:23 2009 +0100 + + [traps] Compute extents on demand. + + src/cairo-region-private.h | 5 - + src/cairo-region.c | 47 ++--- + src/cairo-surface-fallback.c | 10 - + src/cairo-traps.c | 440 +++++++++++++------------------------------ + src/cairoint.h | 9 - + 5 files changed, 144 insertions(+), 367 deletions(-) + +commit f8bb3617c3a7ec598c42eff1f8562e3ccc95127f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 09:32:16 2008 +0000 + + Eliminate self-intersecting strokes. + + We refactor the surface fallbacks to convert full strokes and fills to the + intermediate polygon representation (as opposed to before where we + returned the trapezoidal representation). This allow greater flexibility + to choose how then to rasterize the polygon. Where possible we use the + local spans rasteriser for its increased performance, but still have the + option to use the tessellator instead (for example, with the current + Render protocol which does not yet have a polygon image). + + In order to accommodate this, the spans interface is tweaked to accept + whole polygons instead of a path and the tessellator is tweaked for speed. + + Performance Impact + ================== + + ... + Still measuring, expecting some severe regressions. + ... + + NEWS | 18 + + src/Makefile.am | 2 + + src/cairo-bentley-ottmann.c | 1833 ++++++++++++--------- + src/cairo-clip.c | 14 +- + src/cairo-fixed-private.h | 52 +- + src/cairo-fixed-type-private.h | 5 + + src/cairo-gstate.c | 4 +- + src/cairo-hash.c | 6 - + src/cairo-matrix.c | 27 +- + src/cairo-path-fill.c | 109 +- + src/cairo-path-stroke.c | 1025 +++++++----- + src/cairo-pen.c | 191 --- + src/cairo-polygon.c | 269 ++- + src/cairo-skiplist-private.h | 4 +- + src/cairo-skiplist.c | 8 +- + src/cairo-slope.c | 4 +- + src/cairo-spans-private.h | 45 +- + src/cairo-spans.c | 179 +- + src/cairo-surface-fallback.c | 208 ++- + src/cairo-tor-scan-converter.c | 492 +++--- + src/cairo-toy-font-face.c | 3 +- + src/cairo-traps.c | 72 +- + src/cairo-types-private.h | 15 +- + src/cairo-wideint-private.h | 47 +- + src/cairo-wideint.c | 34 - + src/cairoint.h | 102 +- + test/Makefile.am | 90 +- + test/Makefile.sources | 3 +- + test/caps-joins-alpha.ref.png | Bin 2463 -> 2570 bytes + test/caps-joins-alpha.xlib.ref.png | Bin 0 -> 2278 bytes + test/caps-joins-curve.ref.png | Bin 5132 -> 5725 bytes + test/caps-joins-curve.xlib.ref.png | Bin 0 -> 5126 bytes + test/clear.pdf.argb32.ref.png | Bin 0 -> 790 bytes + test/clear.ps.argb32.ref.png | Bin 0 -> 790 bytes + test/clip-operator.svg12.argb32.xfail.png | Bin 8406 -> 8404 bytes + test/clip-operator.svg12.rgb24.xfail.png | Bin 4540 -> 4523 bytes + test/clipped-group.pdf.ref.png | Bin 310 -> 334 bytes + test/clipped-trapezoids-ref.png | Bin 0 -> 1055 bytes + test/clipped-trapezoids.c | 95 ++ + test/clipped-trapezoids.ref.png | Bin 0 -> 963 bytes + test/close-path-current-point.ref.png | Bin 1916 -> 1893 bytes + test/dash-caps-joins.ref.png | Bin 4718 -> 4520 bytes + test/dash-curve.ref.png | Bin 39696 -> 41284 bytes + test/dash-curve.xlib.ref.png | Bin 0 -> 40109 bytes + test/dash-scale.ref.png | Bin 8058 -> 7616 bytes + test/degenerate-arc.ref.png | Bin 544 -> 646 bytes + test/degenerate-dash.ref.png | Bin 2005 -> 2086 bytes + test/degenerate-dash.xlib.ref.png | Bin 0 -> 1898 bytes + test/degenerate-path.argb32.ref.png | Bin 0 -> 240 bytes + test/degenerate-path.ref.png | Bin 257 -> 0 bytes + test/degenerate-path.rgb24.ref.png | Bin 224 -> 210 bytes + test/degenerate-pen.ref.png | Bin 1139 -> 997 bytes + test/degenerate-pen.xlib.ref.png | Bin 0 -> 997 bytes + test/device-offset-fractional.pdf.xfail.png | Bin 275 -> 275 bytes + test/fill-and-stroke-alpha-add.ref.png | Bin 591 -> 562 bytes + test/fill-and-stroke-alpha-add.svg12.xfail.png | Bin 614 -> 631 bytes + test/fill-and-stroke-alpha.ref.png | Bin 519 -> 515 bytes + test/fill-and-stroke.argb32.ref.png | Bin 0 -> 313 bytes + test/fill-and-stroke.ref.png | Bin 279 -> 0 bytes + test/fill-and-stroke.rgb24.ref.png | Bin 257 -> 287 bytes + test/fill-and-stroke.xlib.argb32.ref.png | Bin 0 -> 322 bytes + test/fill-and-stroke.xlib.rgb24.ref.png | Bin 0 -> 291 bytes + test/filter-nearest-offset.pdf.xfail.png | Bin 1867 -> 1926 bytes + test/filter-nearest-transformed.pdf.xfail.png | Bin 482 -> 488 bytes + test/ft-text-vertical-layout-type1.ps.ref.png | Bin 0 -> 1634 bytes + test/ft-text-vertical-layout-type1.ps2.ref.png | Bin 1846 -> 0 bytes + test/ft-text-vertical-layout-type1.ps3.ref.png | Bin 1846 -> 0 bytes + test/ft-text-vertical-layout-type1.ref.png | Bin 3643 -> 3647 bytes + test/ft-text-vertical-layout-type1.svg.ref.png | Bin 3607 -> 3609 bytes + test/ft-text-vertical-layout-type1.xlib.ref.png | Bin 3980 -> 3640 bytes + test/ft-text-vertical-layout-type3.ps.ref.png | Bin 0 -> 1636 bytes + test/ft-text-vertical-layout-type3.ps2.ref.png | Bin 1804 -> 0 bytes + test/ft-text-vertical-layout-type3.ps3.ref.png | Bin 1804 -> 0 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3608 -> 3607 bytes + test/ft-text-vertical-layout-type3.svg.ref.png | Bin 3626 -> 3626 bytes + test/ft-text-vertical-layout-type3.xlib.ref.png | Bin 3934 -> 3605 bytes + test/group-unaligned.svg.argb32.xfail.png | Bin 520 -> 522 bytes + test/joins.ref.png | Bin 5879 -> 5708 bytes + test/leaky-dashed-rectangle.pdf.ref.png | Bin 347 -> 347 bytes + test/leaky-dashed-rectangle.xlib.ref.png | Bin 0 -> 347 bytes + test/leaky-dashed-stroke.ref.png | Bin 9214 -> 9387 bytes + test/leaky-dashed-stroke.xlib.ref.png | Bin 0 -> 9305 bytes + test/line-width-scale.ref.png | Bin 6445 -> 5716 bytes + test/long-dashed-lines.ref.png | Bin 2116 -> 2070 bytes + test/mask-glyphs.svg.ref.png | Bin 1211147 -> 1211158 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 3919 -> 3835 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 3867 -> 3682 bytes + test/meta-surface-pattern.svg.argb32.ref.png | Bin 3930 -> 3778 bytes + test/meta-surface-pattern.svg.rgb24.ref.png | Bin 3910 -> 3760 bytes + test/new-sub-path.argb32.ref.png | Bin 0 -> 421 bytes + test/new-sub-path.pdf.argb32.ref.png | Bin 0 -> 512 bytes + test/new-sub-path.ref.png | Bin 386 -> 0 bytes + test/new-sub-path.rgb24.ref.png | Bin 355 -> 381 bytes + test/operator-source.svg12.argb32.xfail.png | Bin 2967 -> 2951 bytes + test/operator-source.svg12.rgb24.xfail.png | Bin 2976 -> 2963 bytes + test/over-around-source.pdf.argb32.ref.png | Bin 585 -> 576 bytes + test/random-intersections-eo.c | 78 + + test/random-intersections-eo.ps.ref.png | Bin 0 -> 78806 bytes + test/random-intersections-eo.quartz.ref.png | Bin 0 -> 197778 bytes + test/random-intersections-eo.ref.png | Bin 0 -> 136018 bytes + test/random-intersections-eo.xlib.ref.png | Bin 0 -> 134655 bytes + test/random-intersections-nonzero.c | 79 + + test/random-intersections-nonzero.ps.ref.png | Bin 0 -> 77299 bytes + test/random-intersections-nonzero.ref.png | Bin 0 -> 141154 bytes + test/random-intersections-nonzero.xlib.ref.png | Bin 0 -> 141548 bytes + test/random-intersections.c | 78 - + test/random-intersections.ps2.ref.png | Bin 89253 -> 0 bytes + test/random-intersections.ps3.ref.png | Bin 89253 -> 0 bytes + test/random-intersections.quartz.ref.png | Bin 197778 -> 0 bytes + test/random-intersections.ref.png | Bin 133462 -> 0 bytes + test/random-intersections.xlib.ref.png | Bin 148722 -> 0 bytes + test/reflected-stroke.ref.png | Bin 5704 -> 4978 bytes + test/rel-path.ref.png | Bin 212 -> 198 bytes + test/rel-path.rgb24.ref.png | Bin 228 -> 214 bytes + test/scale-offset-image.meta.xfail.png | Bin 8599 -> 0 bytes + test/scale-offset-image.pdf.xfail.png | Bin 8694 -> 10099 bytes + test/scale-offset-image.xfail.png | Bin 8599 -> 9960 bytes + test/scale-offset-image.xlib-fallback.xfail.png | Bin 8580 -> 8706 bytes + test/scale-offset-image.xlib.xfail.png | Bin 9100 -> 9132 bytes + test/scale-offset-similar.meta.xfail.png | Bin 9095 -> 10752 bytes + test/scale-offset-similar.pdf.xfail.png | Bin 9368 -> 11024 bytes + test/scale-offset-similar.xfail.png | Bin 8599 -> 9960 bytes + test/scale-offset-similar.xlib-fallback.xfail.png | Bin 8580 -> 8706 bytes + test/scale-offset-similar.xlib.xfail.png | Bin 8570 -> 8696 bytes + test/self-intersecting.argb32.xfail.png | Bin 235 -> 0 bytes + test/self-intersecting.c | 3 + + test/self-intersecting.pdf.argb32.xfail.png | Bin 285 -> 0 bytes + test/self-intersecting.pdf.rgb24.xfail.png | Bin 269 -> 0 bytes + test/self-intersecting.ps.argb32.xfail.png | Bin 186 -> 0 bytes + test/self-intersecting.ps.ref.png | Bin 0 -> 186 bytes + test/self-intersecting.ps.rgb24.xfail.png | Bin 186 -> 0 bytes + test/self-intersecting.ref.png | Bin 242 -> 301 bytes + test/self-intersecting.rgb24.ref.png | Bin 304 -> 0 bytes + test/self-intersecting.rgb24.xfail.png | Bin 240 -> 0 bytes + test/self-intersecting.xlib.argb32.xfail.png | Bin 235 -> 0 bytes + test/self-intersecting.xlib.ref.png | Bin 0 -> 252 bytes + test/self-intersecting.xlib.rgb24.xfail.png | Bin 240 -> 0 bytes + test/smask-stroke.ref.png | Bin 1845 -> 1714 bytes + test/smask-stroke.xlib.ref.png | Bin 0 -> 1707 bytes + test/smask.ps.ref.png | Bin 0 -> 3430 bytes + test/smask.ps2.ref.png | Bin 3669 -> 0 bytes + test/smask.ps3.ref.png | Bin 3669 -> 0 bytes + test/smask.ref.png | Bin 3417 -> 3423 bytes + test/smask.svg.ref.png | Bin 3458 -> 3457 bytes + test/smask.xlib.ref.png | Bin 3393 -> 3386 bytes + test/spline-decomposition.pdf.ref.png | Bin 19156 -> 19540 bytes + test/spline-decomposition.ps.ref.png | Bin 9090 -> 9028 bytes + test/spline-decomposition.ref.png | Bin 19107 -> 19569 bytes + test/spline-decomposition.svg.ref.png | Bin 19156 -> 19540 bytes + test/spline-decomposition.xlib.ref.png | Bin 0 -> 19158 bytes + test/stroke-ctm-caps.ref.png | Bin 1057 -> 873 bytes + test/stroke-image.pdf.ref.png | Bin 1554 -> 1475 bytes + test/stroke-image.ps.ref.png | Bin 0 -> 1641 bytes + test/stroke-image.ps2.ref.png | Bin 2121 -> 0 bytes + test/stroke-image.ps3.ref.png | Bin 2121 -> 0 bytes + test/stroke-image.ref.png | Bin 1866 -> 1344 bytes + test/stroke-image.xlib.ref.png | Bin 0 -> 1440 bytes + test/surface-pattern.pdf.xfail.png | Bin 10528 -> 10532 bytes + test/text-rotate.pdf.ref.png | Bin 16639 -> 16757 bytes + test/text-rotate.ref.png | Bin 17775 -> 16738 bytes + test/text-rotate.svg.ref.png | Bin 17024 -> 17118 bytes + test/text-rotate.xlib.ref.png | Bin 0 -> 16646 bytes + test/twin.ps.ref.png | Bin 2197 -> 2142 bytes + test/twin.ref.png | Bin 4038 -> 3979 bytes + test/twin.xlib.ref.png | Bin 0 -> 4435 bytes + test/unantialiased-shapes.ref.png | Bin 4459 -> 3969 bytes + test/unbounded-operator.svg12.argb32.ref.png | Bin 0 -> 2767 bytes + test/unbounded-operator.svg12.argb32.xfail.png | Bin 2771 -> 0 bytes + test/unbounded-operator.svg12.rgb24.xfail.png | Bin 1731 -> 1719 bytes + test/user-font-proxy.svg.ref.png | Bin 16814 -> 16817 bytes + test/user-font.ps.ref.png | Bin 0 -> 4605 bytes + test/user-font.ps2.ref.png | Bin 5043 -> 0 bytes + test/user-font.ps3.ref.png | Bin 5043 -> 0 bytes + test/user-font.ref.png | Bin 6082 -> 6270 bytes + test/user-font.xlib.ref.png | Bin 6183 -> 5884 bytes + util/.gitignore | 3 + + util/Makefile.am | 23 +- + util/show-edges.c | 1189 +++++++++++++ + util/show-events.c | 845 ++++++++++ + util/show-traps.c | 1239 ++++++++++++++ + 180 files changed, 6303 insertions(+), 2190 deletions(-) + +commit 7c499db8afe8a7cf8c512ec166fe7dbf11a25c02 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 25 20:37:55 2009 +0100 + + [test] Minor tweak of ft-text-vertical-layout + + Tidily destroy the font immediately after use. + + test/ft-text-vertical-layout-type1.c | 6 ++---- + test/ft-text-vertical-layout-type3.c | 5 ++--- + 2 files changed, 4 insertions(+), 7 deletions(-) + +commit bdd3c5ba6987280b455229dd12b20c22159ce61c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 18:59:01 2009 +0100 + + [perf] Match directory names + + In order to handle 'cairo-perf-trace benchmark', we need to perform the + can_run? test on the directory name as opposed to the individual trace + names. Make it so. + + perf/box-outline.c | 2 +- + perf/cairo-perf-trace.c | 37 ++++++++++++++++++++++++++++--------- + perf/cairo-perf.c | 14 +++++++++++--- + perf/cairo-perf.h | 3 ++- + perf/composite-checker.c | 2 +- + perf/dragon.c | 3 ++- + perf/fill.c | 2 +- + perf/glyphs.c | 2 +- + perf/intersections.c | 2 +- + perf/long-dashed-lines.c | 2 +- + perf/long-lines.c | 2 +- + perf/mask.c | 2 +- + perf/mosaic.c | 2 +- + perf/paint-with-alpha.c | 2 +- + perf/paint.c | 2 +- + perf/pattern_create_radial.c | 2 +- + perf/pythagoras-tree.c | 4 ++-- + perf/rectangles.c | 2 +- + perf/rounded-rectangles.c | 2 +- + perf/spiral.c | 2 +- + perf/stroke.c | 2 +- + perf/subimage_copy.c | 2 +- + perf/tessellate.c | 2 +- + perf/text.c | 2 +- + perf/twin.c | 2 +- + perf/unaligned-clip.c | 2 +- + perf/world-map.c | 2 +- + perf/zrusin.c | 2 +- + 28 files changed, 68 insertions(+), 39 deletions(-) + +commit 77c11096169bc8af6aa08241a800a51a2292a27a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 12:23:03 2009 +0100 + + [perf] Reset global caches after every trace + + I'd disabled this to look at cairo-qt performance, then forgot about it. + Be clean, cleanup globals -- this should fix the huge performance loss + when running in series multiple backends that need separate font caches. + + perf/cairo-perf-trace.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 9c8e60f7718b29051268541d2cfec58e51d8e7b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 12:09:25 2009 +0100 + + [perf] Remove cpuset warning for cairo-perf-trace + + These traces run for much longer than the original synthetic benchmarks + and seek to replicate 'real-world' applications, so the warning that the + xserver and cairo-perf are not bound to any cpu is false. + + perf/cairo-perf-trace.c | 47 ----------------------------------------------- + 1 file changed, 47 deletions(-) + +commit d07ed5d990634dc09d0d1b6ce45aa8ad1994b75a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 19 12:36:56 2009 +0100 + + [perf] Add charting utility + + cairo-perf-chart takes multiple runs (currently it is limited to + prefiltered data sets) and pretty-prints a chart showing performace + improvements/regressions (in either ASCII or HTML) along with a + cairo-perf-chart.png + + perf/Makefile.am | 4 + + perf/cairo-perf-chart.c | 751 ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 755 insertions(+) + +commit 015eccadcb8b22f302bdaa315b88981a38294686 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 16 09:57:07 2009 +0100 + + [perf] Fix unaligned-clip + + We failed to reset the scale after each loop, eventually generating a vast + clip-mask that exceeded memory capacity. + + perf/unaligned-clip.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6f8fae21e6fee07a8f6561f77bcb0bfaf64f5882 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 15 10:16:41 2009 +0100 + + [perf] Add a box mode to spiral + + Add a very similar 'spiral' path (really just concentric boxes) that hit + the rectangular optimisations so that we can compare how effective they + are. + + perf/spiral.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 73 insertions(+) + +commit e79a9a87c311fd0499c96cecbe560839a17d244e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 15 10:33:48 2009 +0100 + + [perf] Support objdir!=srcdir in cairo-perf-diff + + Crude support to detect when we have cairo-perf-diff-files in the local + directory which is not srcdir. + + perf/cairo-perf-diff | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +commit 6bfb77a33c3614cafdcd6206de5c71321c5fc1e5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 14 19:53:17 2009 +0100 + + [perf] Add spiral strokes + + Use cairo_stroke() to perform the equivalent of + spiral-rect-(pix|non)align-evenodd-fill. A useful comparison of stroking + versus filling, as we can assume the composition costs are similar. + + perf/spiral.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 73 insertions(+) + +commit 54b2935c3842e77888faef06bbf247f99bd9de8c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 23:23:41 2009 +0100 + + [perf] Reset the path after each spiral + + Oops we were accumulating paths during each spiral iteration and so the + tests were getting slower and slower and slower... + + [And fix a couple of other instances of path accumulation.] + + perf/intersections.c | 2 ++ + perf/spiral.c | 1 + + perf/world-map.c | 2 ++ + 3 files changed, 5 insertions(+) + +commit fddfe4973f5b49f280734ee7141ab72451cf94d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 13 15:52:06 2009 +0100 + + [perf] Add clipped modes to dragon + + Investigate the performance hit for unclipped/aligned/unaligned/masked + modes with a reasonably complex geometry. + + perf/dragon.c | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit 8b3be26c7be0747378792e3a454e500d290c3982 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 12 00:02:04 2009 +0100 + + [test] Remove misleading code/comments from a1-image-sample + + test/a1-image-sample.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit e702df59b05246a52a645792a65dc9c12d5b3feb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 22 17:53:59 2009 +0100 + + [test] Attempt to automatically detect running under gdb + + A common mistake is to forget to pass the foreground mode to + cairo-test-suite when launching it under the debugger, resulting in the + debugger not attaching to the children and missing the error you were + trying to capture. Under linux, we can inspect the path to our parent's + executable and if that looks like gdb, we assume it is and disable forking + of traces. + + test/cairo-test-runner.c | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +commit bf4977b645270bb88225501e73848f7814cccead +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 25 07:16:16 2009 +0100 + + [test] Exit on first failure '-x' + + Add a command line option to the test suite to cause it to exit after the + first failure. The purpose of this is for integration into 'git bisect run', + where the failing test is unknown and we are looking for any failure. For + example, for use in a regression script to find commits in the midst of as + series that need a refresh of a reference image (or fixing!). + + test/cairo-test-runner.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit 40aefac5d714bf7536632ed38c7a8ee05049f30b +Author: Benjamin Otte <otte@gnome.org> +Date: Wed Aug 26 21:22:07 2009 +0200 + + [xlib] DO_XCOPYAREA and DO_XTILE optimizations break with Window source + + Cairo should include the contents of subwindows when using a Window as a + source but will clip to subwindows when using a Window as a destination. + This can be set using the GC's subwindow_mode. + + XCopyArea and XFillRectangle can however only use one GC for both source + and destination. Cairo's mode is set to (the default) ClipByChildren. + This means that copying from a Window is broken, so we only allow the + optimization when we know that the source is a Pixmap. + + The performance impact of this change has not been tested. It should be + small, as the code will use XRender otherwise. + + If it turns out to be a bigger impact, the optimizations could be + improved by doing a two-step copy process: + 1) Copy to an intermediate Pixmap with IncludeInferiors + 2) Copy to the destination with ClipByChildren + (potentially omitting one one of the steps if source or destination are + known to be Pixmaps). + + references: + commit 0c5d28a4e5ce5e4dd72c0f416ce5e960e92b808b + https://bugs.freedesktop.org/show_bug.cgi?id=12996 + + src/cairo-xlib-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 90536ef2dd534d9385d38125445faeadd0511850 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 25 00:28:08 2009 -0400 + + [build] Remove bogus warning that we require at least one native font backend + + That limitation was lifted long ago after twin face was introduced. + + build/configure.ac.features | 4 ---- + 1 file changed, 4 deletions(-) + +commit 20e227fc397d064af0b4b8bbf4028430695a218d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 24 23:57:21 2009 -0400 + + [build] Fix typo + + build/aclocal.enable.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87fb9a9ded0fb0355f91cad188393d26b9e47e0b +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Mon Aug 17 00:59:46 2009 -0400 + + [test] Update reference image for the extended-blend-mode test. + + A recent pixman change caused one-bit differences in some pixels. + + test/extended-blend-alpha.argb32.ref.png | Bin 9777 -> 9406 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit d1b8e260d43c7dee71244f26d50d8b2e49e9b6e0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 21:29:13 2009 +0100 + + [qt] Fix compilation + + Enabling 'FAST CLIP' appears to trigger an infinite loop so disable. + + Enabling 'FAST FILL' has limited effect on performance, so disable whilst + the basic QT surface is improved. + + perf/cairo-perf-trace.c | 2 +- + src/cairo-qt-surface.cpp | 63 ++++++++++++++++++++++++++++++++---------------- + 2 files changed, 43 insertions(+), 22 deletions(-) + +commit dff0a91742908098a1ee110fadf11d4b802b1587 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 17:57:16 2009 +0100 + + [xlib] Rewrite UNSUPPORTED() avoiding gcc-ism + + Behdad pointed out that fprintf() returns a value so that we could simply + use the comma operator to return the correct value instead of the + expression-block gcc-ism. + + src/cairo-xlib-surface.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit e63d725ad4fb92a0085224f627cbced3e3205735 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jun 6 01:08:22 2009 -0400 + + [utils] Remove unused code + + util/malloc-stats.c | 30 ------------------------------ + 1 file changed, 30 deletions(-) + +commit d4d0fcb4a8055f1fdd24fc5b7b64bb55d55e1485 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Aug 10 17:43:31 2009 +0100 + + [quartz] Compile fix for show_glyphs + + Correct the prototype for _cairo_quartz_surface_show_glyphs(). + + src/cairo-quartz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2a2a19457bb934f9585bfdb97730fab99c8e386c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 17:42:05 2009 +0100 + + [surface] Check for a NULL snapshot + + The backend is permitted to return a NULL surface when snapshotting to + indicate that it cannot (or choses not to) implement the method. + + src/cairo-surface.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit 2e8ce34454a4d93986f590b1d2b024d1a1eb6bde +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 16:51:07 2009 +0100 + + [quartz] Use the implementation font-face not the associated + + As the associated is now explicitly the font-face used to create the font + by the user, whereas what we require is the current implementation + (quartz) font. + + src/cairo-quartz-font.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit a4dc372bab8ebe75a9f7d17a9a2e6fc8d9d2d747 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 16:50:00 2009 +0100 + + [scaled-font] Update API documentation + + Now that the toy-font-face is exposed to the user, it is expected to be + returned when the user queries the font face associated with a scaled font. + + src/cairo-scaled-font.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit c4828666b9b4dad39c3f17fdfd7d1dd3cbb83cbc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 10 16:45:41 2009 +0100 + + [script] Handle translation of compressed strings. + + After introducing the new syntax to mark a deflated string, we also need + to add the equivalent binary tokens. + + util/cairo-script/cairo-script-file.c | 10 ++-- + util/cairo-script/cairo-script-scanner.c | 81 ++++++++++++++++++++------------ + 2 files changed, 56 insertions(+), 35 deletions(-) + +commit 34870491951f5a712833b5fe7ed84c935bccfc5a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Aug 9 22:33:28 2009 +0200 + + [quartz] Fix one more compile error + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c2e75b9993ab1d30002877fc11b52ea7b9acd40b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 9 21:12:36 2009 +0100 + + [quartz] Attempt to fix compile errors + + ranma42 spotted that the quartz-backend no longer compiled after bed270, + so once again attempt to blindly fix those errors... + + src/cairo-quartz-surface.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 81c4594712843abca188a33c1edfb70fa6c5a0d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 23:41:11 2009 +0100 + + [script] Ensure strings are nul terminated + + Infrequently, but, for example, handling glyph strings, we require the + string to be nul terminated. (Otherwise an error occurs, which was + previously compounded by a drastic leak.) + + util/cairo-script/cairo-script-scanner.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 86d6a489527d125e739aa5a6d17893bb44977010 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 23:39:21 2009 +0100 + + [script] Check for failure to store the glyph cache + + If we fail to add the glyph cache (presumably because the font is in + error) do not leak the allocation. As this occurs for every single glyph + string, the leak can grow very quickly and mask the original bug. + + util/cairo-script/cairo-script-operators.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit af392f7e45edcbf101ca7c91fc1ee372d283e8b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 23:17:06 2009 +0100 + + [script] Extend csi-replay to show how to use a single surface + + Currently the replay creates a fresh surface for every new surface. Whilst + using it to view replays (such as with --xlib) this is often not what is + desired so add a mode (compile-time only for now) to use similar surfaces + and blits to the front buffer instead. + + util/cairo-script/csi-replay.c | 73 +++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 72 insertions(+), 1 deletion(-) + +commit b7639a5f79eaecfbaf1710fc679c7be375638efd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 10:55:18 2009 +0100 + + [trace] Close the dictionary before font + + font expects the dictionary to be constructed on the stack for its use, so + close it. (I missed the closing '>>' when switching between dictionary + constructors.) + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 19f54d872fcfa9801abee9c57e30c6b3fc7eef40 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 10:40:32 2009 +0100 + + [gl] Move hidden cairo_gl_surface_create() proto to header + + Make check-plt.sh happy + + src/cairo-gl-private.h | 2 ++ + src/cairo-gl-surface.c | 1 - + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit ee69f8aa5e0697aaeee9c00839fb7b30fe7e3184 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 10:30:52 2009 +0100 + + [trace] Whitespace + + A few gratuitous whitespace and increase the buffer size used whilst + reading in data files. + + util/cairo-trace/trace.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 6d30021d65aa4126cd5eef47b0e6057dfc17d7ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 10:29:49 2009 +0100 + + [trace] Only write the 4 byte length to the stream + + We were attempting to write out the whole length of the block when we were + just trying to write out the length value. + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a439bd99d0439c007bc74584c1eb56700c520b52 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 5 17:34:29 2009 +0100 + + [perf] Compare drawing random curves + + Extend the intersection tests with straight lines, with random curves as + well. + + perf/intersections.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 57 insertions(+), 1 deletion(-) + +commit 1327df2cf2f2dd9f98533d824503dfb081803b05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 4 20:15:13 2009 +0100 + + [pattern] Invalid access beyond end of freed-pool + + Oops, we were attempting to return a pointer from beyond the end of our + array. + + src/cairo-pattern.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 920f59a755ce142b068f21b9db07f76f35449f16 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 4 20:13:43 2009 +0100 + + [build] Configure switch to disable atomics + + Workaround for my arm toolchain which succeeds in linking the configure + program, only to complain when linking a program (such as cairo-perf) + against libcairo.so. Annoying. + + build/configure.ac.system | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit cb30c1f367967e3395296a5d01a3eb9050635e3b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 4 13:59:03 2009 +0100 + + [path] Extend identical lines. + + If a subsequent PATH_OP is just a continuation of the previous line, i.e. + it has the same gradient, then just replace the end-point of the previous + line with the new point rather than adding a new operation. Surprisingly + this occurs in the wild, but the main motivation is a future optimisation + to reduce the number of intersections during stroke-to-path. + + src/cairo-path-fixed.c | 31 ++++++++++++++++++++++++++++--- + src/cairoint.h | 7 +++++++ + 2 files changed, 35 insertions(+), 3 deletions(-) + +commit 85b688a3f6271427befca699de3a7a15162fc59e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 3 22:27:22 2009 +0100 + + [matrix] Use hypot() + + Use hypot() instead of open-coding sqrt(x*x + y*y). In theory, the + compiler could emit highly efficient code. In practice it's slower, but + more likely to be more accurate -- but the difference over a bare sqrt() + is likely not to be perceptible. + + src/cairo-matrix.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0db9e010fa70c65451d324cc9c0ade989f77fedd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 3 22:23:19 2009 +0100 + + [perf] Calibrate tests to run for at least 2 seconds + + By ensuring that tests take longer than a couple of seconds we eliminate + systematic errors in our measurements. However, we also effectively + eliminate the synchronisation overhead. To compensate, we attempt to + estimate the overhead by reporting the difference between a single + instance and the minimum averaged instance. + + perf/box-outline.c | 14 +++-- + perf/cairo-perf-report.c | 4 +- + perf/cairo-perf.c | 39 +++++++++--- + perf/cairo-perf.h | 2 +- + perf/composite-checker.c | 22 ++++--- + perf/dragon.c | 142 ++++++++++++++++++++++--------------------- + perf/fill.c | 21 +++++-- + perf/glyphs.c | 32 +++++----- + perf/intersections.c | 27 ++++---- + perf/long-dashed-lines.c | 9 +-- + perf/long-lines.c | 68 +++++++++++---------- + perf/mask.c | 45 ++++++++------ + perf/mosaic.c | 38 ++++++------ + perf/paint-with-alpha.c | 5 +- + perf/paint.c | 5 +- + perf/pattern_create_radial.c | 24 ++++---- + perf/pythagoras-tree.c | 20 +++--- + perf/rectangles.c | 38 ++++++------ + perf/rounded-rectangles.c | 47 +++++++++++--- + perf/spiral.c | 51 ++++++++-------- + perf/stroke.c | 19 ++++-- + perf/subimage_copy.c | 7 ++- + perf/tessellate.c | 17 +++--- + perf/text.c | 27 ++++---- + perf/twin.c | 29 +++++---- + perf/unaligned-clip.c | 37 ++++++----- + perf/world-map.c | 78 ++++++++++++------------ + perf/zrusin.c | 10 +-- + 28 files changed, 496 insertions(+), 381 deletions(-) + +commit 60c574ad062f3d8526056942bb7c9e71610a2773 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 5 15:11:00 2009 +0100 + + [surface] Protect against the user setting a fallback resolution of 0. + + Bug 23067 -- using clear drawing operator crashes printing + http://bugs.freedesktop.org/show_bug.cgi?id=23067 + + Here we were hitting an assert within the paginated surface after creating + a zero sized fallback image, due to the paginated surface being created + with an x fallback resolution of 0 dpi (by + _gtk_printer_create_cairo_surface(), gtk/gtkprinter.c:924). + + Avoid the bug by guarding against bad input to + cairo_surface_set_fallback_resolution() which also allows us to identity + the invalid caller. + + src/cairo-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit a3f393cf644d75065fe524e2fbb28f55844f43bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 09:52:34 2009 +0100 + + [configure] Also check for libiberty.h + + cairo-trace also uses the libiberty.h without checking for its presence -- + causing a build failure if bfd was installed but not that header. + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 51bd27afa147f78c8f4f3778cee725b6444e7eb0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 09:41:15 2009 +0100 + + [boilerplate/test] Convert make-*-constructors to shell + + Remove the intermediate C program that was a nuisance whilst + cross-compiling and replace it with a simple shell script that is just a + combination of cat + sed. + + boilerplate/Makefile.am | 17 +-- + boilerplate/make-cairo-boilerplate-constructors.c | 163 --------------------- + boilerplate/make-cairo-boilerplate-constructors.sh | 24 +++ + build/configure.ac.tools | 8 - + test/Makefile.am | 11 +- + test/make-cairo-test-constructors.c | 162 -------------------- + test/make-cairo-test-constructors.sh | 24 +++ + 7 files changed, 56 insertions(+), 353 deletions(-) + +commit 5dd29d7e2da8684ea46c8f1baba42e6dc64f1351 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 6 09:55:43 2009 +0100 + + [directfb] Conditionally use DSPF_BGR555 + + Appears that this token is more recent than some of my headers, so check + for its presence before use. + + src/cairo-directfb-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1d2abe7d1061e580e189604b25465c8025cedfb7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 19:38:23 2009 +0100 + + [gl] Refresh clip-operator ref. + + A minor renderering difference, acceptable. + + test/Makefile.am | 1 + + test/clip-operator.gl.argb32.ref.png | Bin 0 -> 8296 bytes + 2 files changed, 1 insertion(+) + +commit 640a0be2e2ef0124424aeca32915a2f644b03d27 +Merge: 067de9c 5c2239b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 18:03:35 2009 +0100 + + Merge branch 'gl-glyph-cache' + + Comparing the glyph-cache on an i915: + + gnome-terminal-20090728: 1.51x speedup + firefox-20090601: No change + +commit 5c2239be4b11437b1ab1731ef2dfac6cfb8095b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 16:29:49 2009 +0100 + + [gl] Use scissors rather than allocating a temporary depth buffer. + + src/cairo-gl-glyphs.c | 9 ---- + src/cairo-gl-private.h | 9 ++++ + src/cairo-gl-surface.c | 114 ++++++++++--------------------------------------- + 3 files changed, 32 insertions(+), 100 deletions(-) + +commit 067de9cf62223ee7a36aab10e3d8a4e0dcda4741 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 17:49:39 2009 +0100 + + [test] Add clip-fill. + + Test filling through a complex clip. + + test/Makefile.am | 4 ++ + test/Makefile.sources | 1 + + test/clip-fill.c | 78 +++++++++++++++++++++++++++++++++++ + test/clip-fill.ps.xfail.png | Bin 0 -> 522 bytes + test/clip-fill.ref.png | Bin 0 -> 1035 bytes + test/clip-fill.xlib-fallback.ref.png | Bin 0 -> 1039 bytes + test/clip-fill.xlib.ref.png | Bin 0 -> 1049 bytes + 7 files changed, 83 insertions(+) + +commit 7db1fb6fa97e0c44e66c0ae533b94fb3f26b273d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 16:57:14 2009 +0100 + + [test] Add clip-text + + Test applying a complex clip to text. + + test/Makefile.am | 4 ++ + test/Makefile.sources | 1 + + test/clip-text.c | 88 ++++++++++++++++++++++++++++++++++++++++++++ + test/clip-text.ps.xfail.png | Bin 0 -> 434 bytes + test/clip-text.ref.png | Bin 0 -> 928 bytes + test/clip-text.svg.ref.png | Bin 0 -> 933 bytes + test/clip-text.xlib.ref.png | Bin 0 -> 900 bytes + 7 files changed, 93 insertions(+) + +commit 728d3f6383bba218de03f2693f289ddad6a80d0c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 16:24:37 2009 +0100 + + Revert "[gl] Fixup unbounded regions after spans" + + This reverts commit f7121ca88844fa70ecb1a35f3f6c9b653324718d. + + src/cairo-gl-surface.c | 68 ++++++-------------------------------------------- + 1 file changed, 7 insertions(+), 61 deletions(-) + +commit 74bdea1249bc1fcd223e9bab83d9b9e22fa98b99 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 16:20:54 2009 +0100 + + [spans] Emit empty rows. + + A problem that does not present itself whilst using spans to intermediate + masks is that the tor-span-convertor did not emit the empty rows. When + compositing directly using spans with an unbounded operator this was + causing rendering artefacts, for overlapping-glyphs and the gl backend. + + src/cairo-tor-scan-converter.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 1e4b9ab04bfe18f50b9b7c2cdb75d5828e33ef69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 15:27:20 2009 +0100 + + [gl] Return status from _render_glyphs() + + src/cairo-gl-glyphs.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 097484da6fd70867ed2128e78247eab5c43217fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 14:48:32 2009 +0100 + + [boilerplate] Conditionally tweak the xlib surface + + Prior to introduction of the buggy members to the surface, we obviously + cannot set them. However, the boilerplate code is meant to compile against + older revisions of the library so we need to check for the existence prior + to use. + + boilerplate/cairo-boilerplate-xlib.c | 10 ++++++++-- + src/cairo-xlib-surface-private.h | 3 +++ + 2 files changed, 11 insertions(+), 2 deletions(-) + +commit 397538a251ae19bb1a34650763eb9a80108a96de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 12:17:28 2009 +0100 + + [boilerplate] Update fallbacks after disabling RENDER + + The xlib surface caches flags based on RENDER version, so after disabling + render to force fallbacks, we need to ensure that the flags are reset. + + boilerplate/cairo-boilerplate-xlib.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 786d1f962a7e7ee7036ea85d4ea3aec7580e25db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 13:17:24 2009 +0100 + + [xlib] Use server-side gradients. + + We can offload creation of gradients to server that support RENDER 0.10 + and later. This greatly reduces the amount of traffic we need to send over + our display connection as the gradient patterns are much smaller than the + full image. Even if the server fallbacks to using pixman, performance + should be improved by the reduced transport overhead. Furthermore this is a + requisite to enable hardware accelerated gradients with the xlib backend. + + Running cairo-perf-trace on tiny, Celeron/i915: + + before: firefox-20090601 211.585 + after: firefox-20090601 270.939 + + and on tiger, CoreDuo/nvidia: + + before: firefox-20090601 70.143 + after: firefox-20090601 87.326 + + where linear gradients are used extensively throughout the GTK+ theme. + Not quite the result I was expecting! + + In particular, looking at tiny: + + xlib-rgba paint-with-alpha_linear-rgba_over-512 47.11 (47.16 0.05%) -> 123.42 (123.72 0.13%): 2.62x slowdown + █▋ + xlib-rgba paint-with-alpha_linear3-rgba_over-512 47.27 (47.32 0.04%) -> 123.78 (124.04 0.13%): 2.62x slowdown + █▋ + xlib-rgba paint-with-alpha_linear-rgb_over-512 47.19 (47.21 0.02%) -> 123.37 (123.70 0.13%): 2.61x slowdown + █▋ + xlib-rgba paint-with-alpha_linear3-rgb_over-512 47.30 (47.31 0.04%) -> 123.52 (123.62 0.09%): 2.61x slowdown + █▋ + xlib-rgba paint_linear3-rgb_over-512 47.29 (47.32 0.05%) -> 118.95 (119.60 0.29%): 2.52x slowdown + █▌ + xlib-rgba paint_linear-rgba_over-512 47.14 (47.17 0.06%) -> 116.76 (117.06 0.16%): 2.48x slowdown + █▌ + xlib-rgba paint_linear3-rgba_over-512 47.32 (47.34 0.04%) -> 116.85 (116.98 0.05%): 2.47x slowdown + █▌ + xlib-rgba paint_linear-rgb_over-512 47.15 (47.19 0.03%) -> 114.08 (114.55 0.20%): 2.42x slowdown + █■+ xlib-rgba paint-with-alpha_radial-rgb_over-512 117.25 (119.43 1.21%) -> 194.36 (194.73 0.09%): 1.66x slowdown + ▋ + xlib-rgba paint-with-alpha_radial-rgba_over-512 117.22 (117.26 0.02%) -> 193.81 (194.17 0.11%): 1.65x slowdown + ▋ + xlib-rgba paint_radial-rgba_over-512 117.23 (117.26 0.02%) -> 186.35 (186.41 0.03%): 1.59x slowdown + ▋ + xlib-rgba paint_radial-rgb_over-512 117.23 (117.27 0.02%) -> 184.14 (184.62 1.51%): 1.57x slowdown + ▋ + + Before 1.10, we may choose to disable server-side gradients for the + current crop of Xorg servers, similar to the extended repeat modes. + + [Updated by Chris Wilson. All bugs are his.] + + NEWS | 28 ++++ + src/cairo-xlib-display.c | 9 +- + src/cairo-xlib-private.h | 3 +- + src/cairo-xlib-surface-private.h | 5 +- + src/cairo-xlib-surface.c | 306 +++++++++++++++++++++++++++++++++++---- + 5 files changed, 318 insertions(+), 33 deletions(-) + +commit 53cbbad8fbbd2b9423a5eb179d0cec3fc7678791 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 11:35:45 2009 +0100 + + [xlib] Disable extended repeat modes if RENDER < 0.10 + + The extended repeat modes were only introduced in RENDER 0.10, so disable + them if the server reports an earlier version. This is in addition to + disabling the repeat modes if we know (guess!) the server to have a buggy + implementation. + + src/cairo-xlib-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e283e53563915daa11566ba006e1bf1e12b0d2fc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 10:50:13 2009 +0100 + + [perf] Print min_ticks in report + + As the change and ranking is based on the min_ticks, and as this can + sometimes deviate wildly from median_ticks, include min_ticks in the + output. + + In particular it helps to explain cases like: + + xlib-rgba rectangles_similar-rgba-mag_source-512 10.13 88.41% -> 5.77 0.19%: 1.50x slowdown + + which becomes + + xlib-rgba rectangles_similar-rgba-mag_source-512 3.83 (10.13 88.41%) -> 5.75 (5.77 0.19%): 1.50x slowdown + + (Considering the poor standard deviation on the initial measurement, this + is more likely a sampling error than a true regression.) + + perf/cairo-perf-diff-files.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ce8a8424aa4331f119b115123faf7b773b5f25d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 31 09:36:10 2009 +0100 + + [perf] Change the order of slowdowns. + + More the large slowdowns to the end. This has two pleasing effects: + + 1. There is symmetry between large speedups at the top, and large + slowdowns at the bottom, with long bars -> short bars -> long bars. + + 2. After a cairo-perf-diff run the largest slowdowns are immediately + visible on the console. What better way to flag performance + regressions? + + perf/cairo-perf-diff-files.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 877ed645f95ff048f7c5d2ce0fb92389918711a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 30 22:09:55 2009 +0100 + + [perf] Add a more complex fill, a set of rings + + In investigating performance regressions with the wip/tessellator, I'm + keen to inspect how the tessellator scales with polygon complexity. + + perf/fill.c | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit 3dbc4170f0e89f02455b82c6496d6322e56e0491 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 30 10:35:11 2009 +0100 + + [perf] Add a single shot long-lines + + Compare the performance of self-intersection removal by comparing the cost + of individually stroking each line versus stroking them all en-mass. + + perf/long-lines.c | 45 ++++++++++++++++++++++++++++++++++----------- + 1 file changed, 34 insertions(+), 11 deletions(-) + +commit 2f033af5ab15dc56675c42434bb1c18655012b03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 30 09:42:31 2009 +0100 + + [perf] Fix the asymmetry in long lines + + We missed the final long diagonal to the bottom-right. + + perf/long-lines.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 944206e55ba997a4a55334be3c7ebf8141016be7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 30 09:36:28 2009 +0100 + + [perf] Correct typo in long-lines.c + + Computed may_y using height not width, fortunately the test cases have + always been square. + + perf/long-lines.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 229887e980f03d90248add8af9cd0a9be6cb0f9a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 19:48:00 2009 +0100 + + [perf] Check output + + Add a CAIRO_PERF_OUTPUT environment variable to cause cairo-perf to first + generate an output image in order to manually check that the test is + functioning correctly. This needs to be automated, so that we have + absolute confidence that the performance tests are not broken - but isn't + that the role of the test suite? If we were ever to publish cairo-perf + results, I would want some means of verification that the test-suite had + first been passed. + + perf/cairo-perf.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 8c6ecfe6488dff93090d5d0a2d814466804bc7de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 16:17:36 2009 +0100 + + [perf] Remove the warning about failing to open a directory + + The warning is repeated in the error message if we fail to find any + traces, and now that we search a path it is likely that some elements do + not exist. Thus we annoy the user with irrelevant, non-fatal warnings. + + Still looking for suggestions for the most appropriate home for the system + wide cairo-traces dir... + + perf/cairo-perf-trace.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 8c1aed17ca5dafb00175ac413d56760a3ef012f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 13:24:19 2009 +0100 + + [perf] Add another stroking micro-benchmark + + The original stroke only contains a single subpath. Self-intersection + removal particularly affects strokes with multiple curved segments, so add + a path that encompasses both straight edges and rounded corners. + + perf/stroke.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit 71f5649846aa8e9e2178e7caf69ab47554f86c4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 15:36:25 2009 +0100 + + [path] Fix iter to handle circular list of buffers + + When switching the path over to use the circularly linked list, 73f801, + I missed updating the path iterator. + + src/cairo-path-fixed-private.h | 1 + + src/cairo-path-fixed.c | 9 +++++++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit acfcf4a31b3370ca7bbdd522fad9ddc483df3472 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 16:10:04 2009 +0100 + + [path] Remove the broken rel-curve-to as line-to + + As pointed out by Andrea, and now tested by test/degenerate-rel-curve-to, + this attempt at removing degenerate curve-to was broken. + + src/cairo-path-fixed.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 81d3e15e6ca7b7c1a07fdfb6d03c43484ce9f502 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 29 16:07:17 2009 +0100 + + [test] Yet another bug in curve-to as line-to. + + Andrea Canciani (ranma42) found another instance of my broken 'degenerate' + curve-to as line-to optimisation. All I can say is when I do something + wrong, at least I'm consistent! + + This test case highlights the bug in the rel-curve-to path. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/degenerate-rel-curve-to.c | 99 ++++++++++++++++++++++++++++++ + test/degenerate-rel-curve-to.ps.xfail.png | Bin 0 -> 202 bytes + test/degenerate-rel-curve-to.ref.png | Bin 0 -> 270 bytes + 5 files changed, 102 insertions(+) + +commit f7121ca88844fa70ecb1a35f3f6c9b653324718d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 20:48:26 2009 +0100 + + [gl] Fixup unbounded regions after spans + + src/cairo-gl-surface.c | 68 ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 61 insertions(+), 7 deletions(-) + +commit 5631f01075a030255c5eb47a8ee600b062705d0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 18:56:12 2009 +0100 + + [gl] Cache texture snapshots. + + src/cairo-gl-glyphs.c | 32 ++++-- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-surface.c | 297 +++++++++++++++++++++++++++++-------------------- + 3 files changed, 204 insertions(+), 127 deletions(-) + +commit 3b0bb2cfd2ad8579e88f1c0ab46f5ccf762e0974 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 18:04:59 2009 +0100 + + [gl] Replace DrawPixels with TexSubImage + + src/cairo-gl-surface.c | 60 +++++++++++++++++++++++--------------------------- + 1 file changed, 27 insertions(+), 33 deletions(-) + +commit 4b7a1a2da7a7f55db788cbfb3164f9f948bbb26b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 17:32:30 2009 +0100 + + [gl] Disable the EXTEND_REFLECT convertor + + As we can handle EXTEND_REFLECT via the samplers, we do not need to + convert such patterns to EXTEND_REPEAT during acquisition. + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 780a95b024c5880353ffc256a634eb3bcc641601 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 16:49:04 2009 +0100 + + [gl] Trim glyphs to surface/clip extents. + + src/cairo-gl-glyphs.c | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit b1227dea29d3e357cc69c49eed0ae10d5578f24a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 16:39:52 2009 +0100 + + [gl] Render glyphs to an intermediate mask as opposed to falling back. + + There are many common scenarios, mostly involving overlapping glyphs, + for which to guarantee correct rendering we have to composite the glyphs + via an explicit mask. That is instead of just blending the glyphs on to + the destination, we have to add the glyphs to a mask, and then composite + that mask+source with the destination. + + src/cairo-gl-glyphs.c | 306 ++++++++++++++++++++++++++++++++------------------ + 1 file changed, 194 insertions(+), 112 deletions(-) + +commit cd259489e2f41caaa7441233d87b46fbd43991ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 15:58:54 2009 +0100 + + [gl] Fallback for overlapping glyphs. + + src/cairo-analysis-surface.c | 6 ++++-- + src/cairo-gl-glyphs.c | 35 ++++++++++++++++++++--------------- + src/cairo-gl-private.h | 13 +++++++++++++ + src/cairo-scaled-font.c | 23 +++++++++++++++++++++-- + src/cairo-surface-fallback.c | 3 ++- + src/cairo-xcb-surface.c | 3 ++- + src/cairo-xlib-surface.c | 3 ++- + src/cairoint.h | 3 ++- + 8 files changed, 66 insertions(+), 23 deletions(-) + +commit 3d8f1d3dc83b9a86f2f104f0e2afa192a34d18c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 15:38:45 2009 +0100 + + [gl] Only unlock the glyph cache when full. + + src/cairo-gl-glyphs.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 922b1fe8e380ceba0630935460ce758ef660df75 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 28 22:34:42 2009 +0930 + + Ensure Type 3 fonts do not use the name .notdef in the PS encoding + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a251e34dbbcb652906f7fddd2a72cbb5992b58ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 13:44:19 2009 +0100 + + [gl] Move check for vertex buffer support to individual operations. + + As we can fallback instead of using vertex buffers, do so rather than + preventing any use of GL acceleration. + + src/cairo-gl-glyphs.c | 3 +++ + src/cairo-gl-surface.c | 17 +++++++++-------- + 2 files changed, 12 insertions(+), 8 deletions(-) + +commit 90657bacc306e65e07e9eb16561a805150aef778 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 13:30:31 2009 +0100 + + [gl] Separate out supported operator check. + + By performing the check on whether the operator is supported prior to + acquiring the context, we do not need to handle the error part way + through the context setup. This makes the code much cleaner, and save + some work for the unsupported cases. + + src/cairo-gl-glyphs.c | 7 ++++--- + src/cairo-gl-private.h | 5 ++++- + src/cairo-gl-surface.c | 46 ++++++++++++++++++---------------------------- + 3 files changed, 26 insertions(+), 32 deletions(-) + +commit 21d50e2163038c8acc0eef738acf61f851835f7d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 13:24:43 2009 +0100 + + [gl] Unthaw font along contended path. + + If we bail after freezing the font, make sure we thaw that it is thawed + before returning. + + src/cairo-gl-glyphs.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5440055fc0329c726d324984cd2fdf07badc7e0f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 28 20:59:25 2009 +0930 + + Ensure Type 3 fonts do not add a .notdef glyph + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1ae5a41951b8a8cb415835559f91d1636a885216 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 28 20:54:58 2009 +0930 + + PDF: Only Type 3 fonts should include glyph 0 in /ToUnicode + + 4c498098 made all 8-bit fonts include glyph 0 which incorrectly + included Type 1 fallback fonts. + + src/cairo-pdf-surface.c | 20 +++++++++++++------- + src/cairo-scaled-font-subsets.c | 1 + + src/cairoint.h | 1 + + 3 files changed, 15 insertions(+), 7 deletions(-) + +commit c11f369057c5ebb958bec58ef41f8ad4b43bdbee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 13:02:10 2009 +0100 + + [perf] Avoid NULL derefs on broken result files. + + Instead of testing for a NULL return we checked that the pointer didn't + point to NIL. Oops. + + perf/cairo-perf-report.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 19f44982348d247057df4481010c1e3ddc80bac2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 12:58:07 2009 +0100 + + [test] Wrap yet another call to get_image_surface() inside a timeout. + + I missed this call to get_image_surface() that is now being hit having + restored the reference image for dash-infinite-loop. + + test/cairo-test.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit e2f912dc5bbfad3a6f4b5e1dbfbe51be148b3232 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 09:32:36 2009 +0100 + + [script] Add cvi, cvr, mod + + Add implementations of convert-to-integer, convert-to-real and modulus + supplied by Zack Weinberg <zweinberg@mozilla.com>. + + util/cairo-script/cairo-script-operators.c | 95 +++++++++++++++++++++++++++++- + util/cairo-script/cairo-script-private.h | 3 + + util/cairo-script/cairo-script-scanner.c | 6 +- + 3 files changed, 100 insertions(+), 4 deletions(-) + +commit 24b5ac6377f0e4b76b73460a497b9861fc01a889 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 08:05:22 2009 +0100 + + [test] Add timeouts around finishing and converting surfaces to images. + + In order to catch infinite loops whilst replaying and converting vector + surfaces to images (via external renderers) we need to also install + alarms around the calls to finish() and get_image(). + + test/cairo-test.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit dacc380dd9ea23fe060d0397104ecd4b2a6d0eae +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Jul 11 02:59:12 2009 +0300 + + [test] Test extremely small dash lengths. + + The stroker code is liable to wedge when passed + dash patterns which don't advance the dash offset + due to limited precision arithmetic. This test + attempts to hit all the places in the stroker where + that can happen. + + Reported on the cairo mailing list by Hans Breuer: + + http://lists.cairographics.org/archives/cairo/2009-June/017506.html + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/dash-infinite-loop.c | 83 ++++++++++++++++++++++++++++++++++++++++ + test/dash-infinite-loop.ref.png | Bin 0 -> 642 bytes + 4 files changed, 85 insertions(+) + +commit 128d6fb2daf4e57def813511cc89167217041bf4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 08:37:54 2009 +0100 + + [path] Remove the erroneous conversion of a 'zero-length' curve-to + + As pointed out by Andrea, and now tested by test/degenerate-curve-to, a + curve-to that begins and ends on the same point may extend further due to + its control points. It can not be simply replaced with a degenerate + line-to. In order to do so we will need more extensive degeneracy + checking, ala _cairo_spline_init(). + + src/cairo-path-fixed.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 660c389d11bda29498807f41d3b761fa540ae9b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 28 08:18:17 2009 +0100 + + [test] Add degenerate-curve-to + + Andrea Canciani (ranma42) pointed out a second bug in the curve-to as + line-to optimisation, that is a curve starting and finishing on the same + point is not necessarily degenerate. This test case exercises 5 different + curves that start and end on the same point. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/degenerate-curve-to.c | 103 ++++++++++++++++++++++++++++++++++ + test/degenerate-curve-to.ps.xfail.png | Bin 0 -> 202 bytes + test/degenerate-curve-to.ref.png | Bin 0 -> 276 bytes + 5 files changed, 106 insertions(+) + +commit d31de83e01468eaf9e1a906aef536b63e77cb752 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 27 15:58:27 2009 -0700 + + Mark curve-to-as-line-to as XFAIL for PS backend. + + Looks like ghostscript has a similar buggy optimization like we + just fixed in cairo. I'm just waiting on a new bugzilla account + from bugs.ghostscript.com after which I plan to report the bug + there. + + test/curve-to-as-line-to.ps.xfail.png | Bin 0 -> 112 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 45919a4f0c94a247b1c6941dbc4a57f6c9399396 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 27 15:45:55 2009 -0700 + + Revert "[path] Convert straight curve-to to line-to" + + This reverts commit c72ca2f2296b5fbc5859059b98221e5ffe087dae. + + This commit was broken as verified by the curve-to-as-line-to test + case. + + src/cairo-path-fixed.c | 12 ------------ + 1 file changed, 12 deletions(-) + +commit 5bed405b278a6b934369873f55117d497f69bc3a +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 27 15:45:15 2009 -0700 + + Revert "[spline] Treat a straight spline as degenerate." + + This reverts commit f3d265559a2f97152ce8f307ea3ce83463083088. + + This commit was broken as verified by the curve-to-as-line-to test + case. + + src/cairo-spline.c | 9 --------- + 1 file changed, 9 deletions(-) + +commit 01acad1659caf766c57849f85dc3536fe2167608 +Merge: 3cc9a60 cf15aed +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 27 15:26:19 2009 -0700 + + Merge branch 'master' of git.cairographics.org:/git/cairo + +commit 3cc9a6050d9704976d8efe373b913e5309bde6d2 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 27 15:24:55 2009 -0700 + + Add new test: curve-to-as-line-to + + This test anticipates a future optimization, (already pushed + upstream but not pulled yet), with a buggy implementation + of replacing curve_to with line_to. + + test/Makefile.sources | 1 + + test/curve-to-as-line-to.c | 95 +++++++++++++++++++++++++++++++++++++++ + test/curve-to-as-line-to.ref.png | Bin 0 -> 95 bytes + 3 files changed, 96 insertions(+) + +commit e19b2866ed095cf66e9344efa442ae01dc7913ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 19:51:36 2009 +0100 + + [gl] Actually remove the glyph from the rtree on scaled_font_fini + + Mark the node as available when the scaled_glyph is finished, and then + attempt to collapse the parent node. + + src/cairo-gl-glyphs.c | 5 +++-- + src/cairo-rtree-private.h | 3 +++ + src/cairo-rtree.c | 13 +++++++++++++ + 3 files changed, 19 insertions(+), 2 deletions(-) + +commit e0b7979a30fff2a22fef5c170fd72c37c197ee0e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 17:44:10 2009 +0100 + + [gl] Switch to using the common rtree implementation. + + src/cairo-gl-glyphs.c | 440 ++++++++----------------------------------------- + src/cairo-gl-private.h | 52 ++---- + src/cairo-gl-surface.c | 5 + + 3 files changed, 89 insertions(+), 408 deletions(-) + +commit 37bf06d66efa238c4ff9c74c86a0c9d037b300e6 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jul 27 09:16:46 2009 -0700 + + [gl] Fix handling of clip for glyphs (clip-operator test). + + src/cairo-gl-glyphs.c | 43 ++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 42 insertions(+), 1 deletion(-) + +commit 74f33513194ec3d8e69a21aa71aa7fc854415e83 +Author: Eric Anholt <eric@anholt.net> +Date: Fri Jul 24 14:08:55 2009 -0700 + + [gl] Switch the glyph cache to using VBOs. + + This is a major performance improvement for GL even on non-TNL hardware + (i915), as we get to emit one giant DrawArrays and make GL drivers love us. + Now we're actually faster than not having the glyph cache. + + Before glyph cache (HP 945GM): + [ 0] gl firefox-20090601 238.103 238.195 0.35% 5/6 + After: + [ 0] gl firefox-20090601 68.181 76.735 5.46% 6/6 + + src/cairo-gl-glyphs.c | 177 ++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 120 insertions(+), 57 deletions(-) + +commit ee4138e587a67c3fc4d0e89b899109af89f16e72 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jul 23 21:12:59 2009 -0700 + + [gl] Start adding glyph cache support. + + This is pretty much cut-and-paste from ickle's cairo-drm-i915-surface, and + uses fixed function and doesn't use VBOs. + + src/Makefile.sources | 2 +- + src/cairo-gl-glyphs.c | 829 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 115 +++++++ + src/cairo-gl-surface.c | 69 ++-- + 4 files changed, 965 insertions(+), 50 deletions(-) + +commit cf15aed0c4e843e7297c5a1979ac0318f6df4947 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 19:18:21 2009 +0100 + + [xlib] Add a timely reminder to ensure that bugs are properly filed. + + In a discussion on IRC, attention was drawn to a dubious comment in + _cairo_xlib_show_glyphs() - the precise details of which have passed + out of the collective memory. + + src/cairo-xlib-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 2da01ed552d48808cdf3aa7798ddfb959d016f0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 18:20:22 2009 +0100 + + [rtree] Merge the common unpin_and_evict_unused() routine + + Having written the same method to prune glyphs from the rtree three times, + I thought wise to add the common method to the core routines. + + src/cairo-rtree-private.h | 1 + + src/cairo-rtree.c | 50 +++++++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 49 insertions(+), 2 deletions(-) + +commit 9f6a0f5668601c74886378d6cdb9588621d30e6d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 14:01:32 2009 +0100 + + [paginated] Propagate error return during finish. + + In bed2701, I removed the explicit finish of the paginated's target + surface, since as a wrapper it did not explicitly own the surface and so + should not be calling finish(). However, we do need to propagate errors + from the backing surface, such as PDF, which will only be detected during + the implicit finish in the final destroy. So check to see it we hold the + last reference to the target (and so our destroy will trigger the implicit + finish) and call the finish explicitly and check the error status + afterwards. + + src/cairo-paginated-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 6ca3720ba66f443e70c961f7d4fdac604c831e97 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 10:06:34 2009 +0100 + + [test] Overlapping glyphs + + Add a test case to explicitly check handling of overlapping glyphs. + + test/Makefile.am | 4 + + test/Makefile.sources | 1 + + test/overlapping-glyphs.argb32.ref.png | Bin 0 -> 2696 bytes + test/overlapping-glyphs.c | 123 +++++++++++++++++++++++++++ + test/overlapping-glyphs.pdf.argb32.xfail.png | Bin 0 -> 2199 bytes + test/overlapping-glyphs.pdf.rgb24.xfail.png | Bin 0 -> 1692 bytes + test/overlapping-glyphs.rgb24.ref.png | Bin 0 -> 1650 bytes + 7 files changed, 128 insertions(+) + +commit 09a2b2ed3189fe12483cbd673c24ceddc2c20f3f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 10:14:24 2009 +0100 + + [xlib] Fast-path the likely case of retrieving a known xrender_format + + If we know the CPU can read pointers atomically, then we can simply peek + into the cached_xrender_formats to see if we already have a match, before + taking the mutex. (Acquiring the mutex here is a minor nuisance that + appears on the callgrind profiles.) + + src/cairo-xlib-display.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit efb3445ee1553c91e62f6b0fe50ab72d65f5c81c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 27 10:18:25 2009 +0100 + + Add a simple rectangle tree (rtree) implementation + + In order to efficient store small images, we need to pack them into a + large texture. The rtree handles allocation of small rectangles out of a + much larger whole. As well as tracking free rectangles, it can also be + used to note which parts of the texture are 'pinned' -- that is have + operations currently pending and so can not be modified until that batch + of operations have been flushed. When the rtree is full, i.e. there is no + single free rectangle to accommodate the allocation request, it will + randomly evict an unpinned block large enough to fit the request. The + block may comprise just a single glyph, or a subtree of many glyphs. This + may not be the best strategy, but it is an effective start. + + src/Makefile.sources | 2 + + src/cairo-rtree-private.h | 124 ++++++++++++++++ + src/cairo-rtree.c | 349 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 475 insertions(+) + +commit c72ca2f2296b5fbc5859059b98221e5ffe087dae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 26 09:07:48 2009 +0100 + + [path] Convert straight curve-to to line-to + + Avoid the high cost associated with curves if we can convert the curve to + a straight line. + + src/cairo-path-fixed.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit f3d265559a2f97152ce8f307ea3ce83463083088 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 26 09:03:36 2009 +0100 + + [spline] Treat a straight spline as degenerate. + + The fallback for degenerate splines is to treat them as a line-to, so if + the spline is straight, we can just replace it with a simple line-to by + treating as degenerate. + + src/cairo-spline.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 25858d524d158531a71a2e772551b1e497d9d423 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 26 08:13:28 2009 +0100 + + [script] Fix reference to font source after transferring to mmap + + After diverting the pointers to accommodate lazy decompressing of the + source, the bytecode pointer was left pointing to the original location + that had already been freed - thus passing an invalid block to FreeType + and unsurprisingly then, blowing up. + + util/cairo-script/cairo-script-operators.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ede0f7e7df4e17ddc1ffe98dcdfe0115a58e7b14 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 25 07:19:22 2009 +0100 + + [pdf] Eliminate redundant whole-page clip. + + We do not to emit a clip if it covers the whole page. + + src/cairo-pdf-surface.c | 16 ++++++++++++++++ + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 3868 -> 3919 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 3806 -> 3867 bytes + test/scale-offset-image.pdf.xfail.png | Bin 8692 -> 8694 bytes + test/scale-offset-similar.pdf.xfail.png | Bin 9369 -> 9368 bytes + 5 files changed, 16 insertions(+) + +commit 4c498098c0dc66dc8c3e8cd60f79e5e5eda206b9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jul 24 21:36:47 2009 +0930 + + PDF: Fix glyph 0 in toUnicode stream when using user fonts + + _cairo_pdf_surface_emit_to_unicode_stream() was reserving glyph 0 for + the .notdef glyph (as required by TrueType/CFF/Type1 fallback + fonts). However Type 3 fonts do not reserve glyph 0 for .notdef and + need glyph 0 to be included in the toUnicode stream. + + http://lists.cairographics.org/archives/cairo/2009-July/017731.html + + src/cairo-pdf-surface.c | 71 +++++++++++++++++++++++++++++++------------------ + 1 file changed, 45 insertions(+), 26 deletions(-) + +commit e577096dff714266101ba86ac275864b854096a4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 23:17:07 2009 +0100 + + [boilerplate] Fix compilation against old revisions (as old as 1.9.2!) + + boilerplate/Makefile.am | 7 +++++- + boilerplate/cairo-boilerplate-pdf.c | 4 ++++ + boilerplate/cairo-boilerplate-ps.c | 4 ++++ + boilerplate/cairo-boilerplate-svg.c | 4 ++++ + boilerplate/cairo-boilerplate-test-surfaces.c | 31 ++++++++++++++++----------- + boilerplate/cairo-boilerplate.c | 10 ++++++--- + src/cairo-types-private.h | 5 ++++- + util/cairo-script/cairo-script-operators.c | 2 ++ + 8 files changed, 50 insertions(+), 17 deletions(-) + +commit 0466053099b7f27065267d49c84e9e24bff6c7a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 23:45:01 2009 +0100 + + [image] Discard redundant clears + + On slow machines the call to pixman_fill_sse2() on similar surfaces that + we know are already zeroed takes a significant amount of time [12.77% of + the profile for a firefox trace, cf to just 3% of the profile is spent + inside memset]. + + Rather than solve why the pixman_fill_sse2() is so slow, simply skip the + redundant clears. + + src/cairo-image-surface.c | 35 ++++++++++++++++++++++++++++++++++- + src/cairoint.h | 1 + + 2 files changed, 35 insertions(+), 1 deletion(-) + +commit 8b8e03503d7a4fdacfc48e0b35c9b02d7a08c1e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 22:00:05 2009 +0100 + + [script] mark scan_read() inline + + Small function that is critical to performance whilst scanning scripts. + + util/cairo-script/cairo-script-scanner.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f02ba09475b751fba411addb96718dbcb1de5132 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 20:23:51 2009 +0100 + + [xlib] Check workqueue before taking the display mutex + + Optimistically check to see if there is any outstanding work before + checking under the mutex. We don't care if we occasionally do not run the + queue this time due to contention, since we will most likely check again + very shortly or clean up with the display. + + src/cairo-xlib-display.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 4dc62bbedc5d8669c0508963497c568d0202f579 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 19:34:10 2009 +0100 + + [test] Extend radial gradients to check r2 < r1 + + Include additional gradients to cover the cases where r1 > r2, as a pixman + bug was exposed by: + [Bug 22908] Invalid output of radial gradient + http://bugs.freedesktop.org/show_bug.cgi?id=22908 + + test/radial-gradient.c | 36 +++++++++++++++++++++++------------- + test/radial-gradient.pdf.ref.png | Bin 79612 -> 277162 bytes + test/radial-gradient.ref.png | Bin 91159 -> 280971 bytes + 3 files changed, 23 insertions(+), 13 deletions(-) + +commit e98e2690cb4ac475819394334cb5e61a8e3d5557 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 18:32:47 2009 +0100 + + [test] Fix use of uninitialized widths. + + user-font-rescale copied unitialized values from the widths array into + the desired array. Although these corresponded to unused glyphs and so + were never used during the rendering, the values may have been illegal + causing FPE as they were copied. + + test/user-font-rescale.c | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit 596dec95610ef02d86ede94eca5b83221b0b533a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 18:15:38 2009 +0100 + + [test] Trap SIGFPE + + Note the crash if we hit a floating-point exception. + + test/cairo-test.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 0561539880b480273767a9559da89a25970802e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 18:31:37 2009 +0100 + + [scaled-font] cairo_scaled_font_glyph_extents() initialise extents + + Ensure that the extents are zeroed on error. + + src/cairo-scaled-font.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit 5c843b5f8eca4b6f9756644143bc1be3bc3cbc84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 20:43:28 2009 +0100 + + [scaled-font] Skip empty glyphs + + Skip the composition of empty glyphs - prevents redundant calls through + the stack. + + src/cairo-scaled-font.c | 57 +++++++++++++++++++++++++++---------------------- + 1 file changed, 31 insertions(+), 26 deletions(-) + +commit 0c4692a1d0667f5850f59c65754a3ffbaf688afe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 23:34:55 2009 +0100 + + [perf] Specify html file on cmdline instead of redirecting all output + + Redirecting all output was causing the build messages to be entangled with + the Performance Change html. + + perf/Makefile.am | 4 ++-- + perf/cairo-perf-diff | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 1ec1d6148e85d4a9b9da825ea57adb0b8ceba1c0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 22:42:44 2009 +0100 + + [perf] Compare performance against most recent tag. + + perf/Makefile.am | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 9d7fd626c39c37368ea05f91a358899e5b5b898c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 17:05:28 2009 +0100 + + [script] Decompress font sources + + Need to decompress patterns and embedded bytecode before passing to + fontconfig/FreeType. + + util/cairo-script/cairo-script-operators.c | 119 ++++++++++++++++++++++++----- + 1 file changed, 99 insertions(+), 20 deletions(-) + +commit 5d8f366581c0ca31fac76c991cb681d036af275f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 16:36:02 2009 +0100 + + [test] clip representation is no longer surface dependent + + So we can test the api just once in the preamble and not per-target. + + test/get-clip.c | 200 +++++++++++++++++++++----------------------------------- + 1 file changed, 74 insertions(+), 126 deletions(-) + +commit c3f2db4f73e93a3dafe0f52a5f9ca09ca78cc906 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 15:18:55 2009 +0100 + + [drm] Add an accelerated image surface. + + Use the DRM interface to h/w accelerate composition on image surfaces. + The purpose of the backend is simply to explore what such a hardware + interface might look like and what benefits we might expect. The + use case that might justify writing such custom backends are embedded + devices running a drm compositor like wayland - which would, for example, + allow one to write applications that seamlessly integrated accelerated, + dynamic, high quality 2D graphics using Cairo with advanced interaction + (e.g. smooth animations in the UI) driven by a clutter framework... + + In this first step we introduce the fundamental wrapping of GEM for intel + and radeon chipsets, and, for comparison, gallium. No acceleration, all + we do is use buffer objects (that is use the kernel memory manager) to + allocate images and simply use the fallback mechanism. This provides a + suitable base to start writing chip specific drivers. + + boilerplate/Makefile.sources | 2 + + boilerplate/Makefile.win32.features | 20 + + boilerplate/cairo-boilerplate-drm.c | 91 ++++ + build/Makefile.win32.features | 2 + + build/Makefile.win32.features-h | 6 + + build/configure.ac.features | 1 + + configure.ac | 25 + + perf/cairo-perf-trace.c | 3 + + perf/cairo-perf.c | 5 +- + src/Makefile.sources | 13 + + src/Makefile.win32.features | 28 ++ + src/cairo-debug.c | 4 + + src/cairo-drm.h | 135 ++++++ + src/cairo-freelist-private.h | 59 ++- + src/cairo-freelist.c | 73 +++ + src/cairo-image-surface.c | 1 + + src/cairo-mutex-list-private.h | 3 + + src/cairo.h | 2 + + src/cairoint.h | 8 + + src/drm/cairo-drm-bo.c | 120 +++++ + src/drm/cairo-drm-gallium-surface.c | 696 +++++++++++++++++++++++++++ + src/drm/cairo-drm-intel-private.h | 182 +++++++ + src/drm/cairo-drm-intel-surface.c | 475 ++++++++++++++++++ + src/drm/cairo-drm-intel.c | 933 ++++++++++++++++++++++++++++++++++++ + src/drm/cairo-drm-ioctl-private.h | 12 + + src/drm/cairo-drm-private.h | 257 ++++++++++ + src/drm/cairo-drm-radeon-private.h | 110 +++++ + src/drm/cairo-drm-radeon-surface.c | 437 +++++++++++++++++ + src/drm/cairo-drm-radeon.c | 447 +++++++++++++++++ + src/drm/cairo-drm-surface.c | 517 ++++++++++++++++++++ + src/drm/cairo-drm.c | 362 ++++++++++++++ + test/cairo-test.c | 2 +- + test/get-clip.c | 1 + + 33 files changed, 5025 insertions(+), 7 deletions(-) + +commit bed2701e1c89095878d549cbca8f22d84f3dda3c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 15:32:13 2009 +0100 + + Remove clip handling from generic surface layer. + + Handling clip as part of the surface state, as opposed to being part of + the operation state, is cumbersome and a hindrance to providing true proxy + surface support. For example, the clip must be copied from the surface + onto the fallback image, but this was forgotten causing undue hassle in + each backend. Another example is the contortion the meta surface + endures to ensure the clip is correctly recorded. By contrast passing the + clip along with the operation is quite simple and enables us to write + generic handlers for providing surface wrappers. (And in the future, we + should be able to write more esoteric wrappers, e.g. automatic 2x FSAA, + trivially.) + + In brief, instead of the surface automatically applying the clip before + calling the backend, the backend can call into a generic helper to apply + clipping. For raster surfaces, clip regions are handled automatically as + part of the composite interface. For vector surfaces, a clip helper is + introduced to replay and callback into an intersect_clip_path() function + as necessary. + + Whilst this is not primarily a performance related change (the change + should just move the computation of the clip from the moment it is applied + by the user to the moment it is required by the backend), it is important + to track any potential regression: + + ppc: + Speedups + ======== + image-rgba evolution-20090607-0 1026085.22 0.18% -> 672972.07 0.77%: 1.52x speedup + ▌ + image-rgba evolution-20090618-0 680579.98 0.12% -> 573237.66 0.16%: 1.19x speedup + ▎ + image-rgba swfdec-fill-rate-4xaa-0 460296.92 0.36% -> 407464.63 0.42%: 1.13x speedup + ■+ image-rgba swfdec-fill-rate-2xaa-0 128431.95 0.47% -> 115051.86 0.42%: 1.12x speedup + ■+ Slowdowns + ========= + image-rgba firefox-periodic-table-0 56837.61 0.78% -> 66055.17 3.20%: 1.09x slowdown + ■+ + NEWS | 6 + + boilerplate/cairo-boilerplate-glitz-glx.c | 4 - + boilerplate/cairo-boilerplate-pdf.c | 1 - + boilerplate/cairo-boilerplate-ps.c | 8 +- + boilerplate/cairo-boilerplate-qt.cpp | 4 +- + boilerplate/cairo-boilerplate-svg.c | 1 - + boilerplate/cairo-boilerplate-test-surfaces.c | 113 +- + boilerplate/cairo-boilerplate.c | 100 +- + boilerplate/cairo-boilerplate.h | 2 + + perf/unaligned-clip.c | 3 + + src/Makefile.sources | 7 + + src/cairo-analysis-surface-private.h | 6 +- + src/cairo-analysis-surface.c | 539 ++++---- + src/cairo-beos-surface.cpp | 409 +++---- + src/cairo-clip-private.h | 87 +- + src/cairo-clip.c | 1290 ++++++++++---------- + src/cairo-debug.c | 2 + + src/cairo-directfb-surface.c | 491 ++++---- + src/cairo-ft-font.c | 53 +- + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 216 +++- + src/cairo-glitz-surface.c | 213 ++-- + src/cairo-gstate.c | 233 ++-- + src/cairo-image-surface.c | 173 ++- + src/cairo-meta-surface-private.h | 43 +- + src/cairo-meta-surface.c | 550 ++++----- + src/cairo-os2-surface.c | 14 +- + src/cairo-paginated-private.h | 2 - + src/cairo-paginated-surface-private.h | 9 - + src/cairo-paginated-surface.c | 234 ++-- + src/cairo-path-bounds.c | 65 +- + src/cairo-path-fill.c | 11 +- + src/cairo-path-fixed-private.h | 36 +- + src/cairo-path-fixed.c | 201 ++- + src/cairo-path-in-fill.c | 27 +- + src/cairo-path-stroke.c | 8 +- + src/cairo-pattern.c | 127 +- + src/cairo-pdf-surface-private.h | 3 + + src/cairo-pdf-surface.c | 220 ++-- + src/cairo-ps-surface-private.h | 4 + + src/cairo-ps-surface.c | 367 +++--- + src/cairo-qt-surface.cpp | 373 +++--- + src/cairo-quartz-image-surface.c | 14 +- + src/cairo-quartz-private.h | 2 + + src/cairo-quartz-surface.c | 136 ++- + src/cairo-region-private.h | 73 ++ + src/cairo-region.c | 170 ++- + src/cairo-scaled-font.c | 132 +- + src/cairo-script-surface.c | 611 +++++++-- + src/cairo-script.h | 10 + + src/cairo-spans-private.h | 19 +- + src/cairo-spans.c | 20 +- + src/cairo-stroke-style.c | 8 +- + src/cairo-surface-clipper-private.h | 72 ++ + src/cairo-surface-clipper.c | 138 +++ + src/cairo-surface-fallback-private.h | 21 +- + src/cairo-surface-fallback.c | 995 ++++++++------- + src/cairo-surface-private.h | 19 +- + src/cairo-surface-wrapper-private.h | 156 +++ + src/cairo-surface-wrapper.c | 449 +++++++ + src/cairo-surface.c | 857 ++++--------- + src/cairo-svg-surface-private.h | 4 +- + src/cairo-svg-surface.c | 527 ++++---- + src/cairo-traps.c | 26 +- + src/cairo-type3-glyph-surface-private.h | 9 +- + src/cairo-type3-glyph-surface.c | 94 +- + src/cairo-types-private.h | 9 +- + src/cairo-user-font.c | 30 +- + src/cairo-vg-surface.c | 122 +- + src/cairo-win32-font.c | 16 +- + src/cairo-win32-printing-surface.c | 194 ++- + src/cairo-win32-private.h | 15 +- + src/cairo-win32-surface.c | 279 ++--- + src/cairo-xcb-surface.c | 248 ++-- + src/cairo-xlib-surface-private.h | 2 +- + src/cairo-xlib-surface.c | 492 ++++---- + src/cairo.c | 83 +- + src/cairo.h | 30 +- + src/cairoint.h | 325 ++--- + src/test-fallback-surface.c | 4 +- + src/test-fallback16-surface.c | 4 +- + src/test-null-surface.c | 35 +- + src/test-paginated-surface.c | 100 +- + src/test-paginated-surface.h | 6 +- + src/test-wrapping-surface.c | 272 +++++ + src/test-wrapping-surface.h | 51 + + test/Makefile.am | 75 +- + test/Makefile.sources | 2 + + test/buffer-diff.c | 12 +- + test/cairo-test.c | 18 +- + test/clip-operator.pdf.argb32.ref.png | Bin 0 -> 9340 bytes + test/clip-operator.pdf.argb32.xfail.png | Bin 9340 -> 0 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 0 -> 5146 bytes + test/clip-operator.pdf.rgb24.xfail.png | Bin 5155 -> 0 bytes + test/clip-operator.svg12.argb32.xfail.png | Bin 8404 -> 8406 bytes + test/clip-operator.svg12.rgb24.xfail.png | Bin 4523 -> 4540 bytes + test/clip-operator.xlib-fallback.ref.png | Bin 0 -> 3226 bytes + test/clip-operator.xlib-fallback.rgb24.ref.png | Bin 3254 -> 0 bytes + test/clip-push-group.pdf.ref.png | Bin 0 -> 164 bytes + test/clip-push-group.ref.png | Bin 199 -> 164 bytes + test/clip-push-group.xlib.ref.png | Bin 0 -> 155 bytes + test/clip-unbounded.c | 80 ++ + test/clip-unbounded.ref.png | Bin 0 -> 100 bytes + test/clip-unbounded.rgb24.ref.png | Bin 0 -> 97 bytes + test/clip-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 100 bytes + test/clipped-group.pdf.argb32.ref.png | Bin 298 -> 0 bytes + test/clipped-group.pdf.ref.png | Bin 0 -> 310 bytes + test/clipped-group.pdf.rgb24.ref.png | Bin 298 -> 0 bytes + test/clipped-group.ref.png | Bin 350 -> 316 bytes + ...integer-translate-source.svg12.argb32.xfail.png | Bin 0 -> 16392 bytes + ...-integer-translate-source.svg12.rgb24.xfail.png | Bin 0 -> 16392 bytes + test/device-offset-fractional.pdf.argb32.ref.png | Bin 275 -> 0 bytes + test/device-offset-fractional.pdf.ref.png | Bin 277 -> 0 bytes + test/device-offset-fractional.pdf.rgb24.ref.png | Bin 275 -> 0 bytes + test/device-offset-fractional.pdf.xfail.png | Bin 0 -> 275 bytes + test/extended-blend-alpha.svg12.argb32.xfail.png | Bin 0 -> 6857 bytes + test/extended-blend-alpha.svg12.rgb24.xfail.png | Bin 0 -> 5014 bytes + test/extended-blend.svg12.argb32.xfail.png | Bin 0 -> 2273 bytes + test/extended-blend.svg12.rgb24.xfail.png | Bin 0 -> 1856 bytes + test/fill-empty.argb32.ref.png | Bin 0 -> 99 bytes + test/fill-empty.c | 62 + + test/fill-empty.rgb24.ref.png | Bin 0 -> 97 bytes + test/fill-empty.svg12.rgb24.xfail.png | Bin 0 -> 99 bytes + test/filter-nearest-offset.pdf.xfail.png | Bin 1926 -> 1867 bytes + test/filter-nearest-transformed.pdf.xfail.png | Bin 488 -> 482 bytes + ...t-text-vertical-layout-type1.pdf.argb32.ref.png | Bin 3632 -> 0 bytes + test/ft-text-vertical-layout-type1.pdf.ref.png | Bin 3968 -> 3635 bytes + ...ft-text-vertical-layout-type1.pdf.rgb24.ref.png | Bin 3632 -> 0 bytes + ...t-text-vertical-layout-type3.pdf.argb32.ref.png | Bin 3642 -> 0 bytes + test/ft-text-vertical-layout-type3.pdf.ref.png | Bin 3634 -> 3639 bytes + ...ft-text-vertical-layout-type3.pdf.rgb24.ref.png | Bin 3642 -> 0 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3609 -> 3608 bytes + test/group-unaligned.svg.argb32.xfail.png | Bin 522 -> 520 bytes + test/group-unaligned.xlib-fallback.ref.png | Bin 496 -> 474 bytes + test/image-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + test/image-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/in-fill-trapezoid.c | 19 +- + test/mask-glyphs.svg.ref.png | Bin 1211170 -> 1211147 bytes + test/mask.pdf.argb32.ref.png | Bin 0 -> 7837 bytes + test/mask.pdf.argb32.xfail.png | Bin 7944 -> 0 bytes + test/mask.pdf.rgb24.ref.png | Bin 0 -> 7301 bytes + test/mask.pdf.rgb24.xfail.png | Bin 7388 -> 0 bytes + test/mask.xlib-fallback.rgb24.ref.png | Bin 7216 -> 0 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 4009 -> 3868 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 3905 -> 3806 bytes + test/operator-clear.xlib.argb32.ref.png | Bin 0 -> 1071 bytes + test/operator-clear.xlib.ref.png | Bin 951 -> 0 bytes + test/operator-clear.xlib.rgb24.ref.png | Bin 0 -> 951 bytes + test/operator-source.pdf.rgb24.ref.png | Bin 0 -> 3645 bytes + test/operator-source.pdf.rgb24.xfail.png | Bin 3645 -> 0 bytes + test/operator-source.svg12.argb32.xfail.png | Bin 2951 -> 2967 bytes + test/operator-source.svg12.rgb24.xfail.png | Bin 2963 -> 2976 bytes + test/operator-source.xlib-fallback.ref.png | Bin 0 -> 3177 bytes + test/operator-source.xlib-fallback.rgb24.ref.png | Bin 3193 -> 0 bytes + test/path-append.xlib-fallback.ref.png | Bin 6357 -> 6320 bytes + test/pdf-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + test/pdf-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/ps-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + test/ps-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/push-group.xlib-fallback.rgb24.ref.png | Bin 2912 -> 0 bytes + test/scale-offset-image.meta.xfail.png | Bin 0 -> 8599 bytes + test/scale-offset-image.pdf.argb32.ref.png | Bin 8692 -> 0 bytes + test/scale-offset-image.pdf.rgb24.ref.png | Bin 8691 -> 0 bytes + test/scale-offset-image.pdf.xfail.png | Bin 0 -> 8692 bytes + test/scale-offset-image.xlib-fallback.xfail.png | Bin 0 -> 8580 bytes + test/scale-offset-similar.meta.xfail.png | Bin 0 -> 9095 bytes + test/scale-offset-similar.pdf.argb32.ref.png | Bin 9278 -> 0 bytes + test/scale-offset-similar.pdf.rgb24.ref.png | Bin 9278 -> 0 bytes + test/scale-offset-similar.pdf.xfail.png | Bin 0 -> 9369 bytes + test/scale-offset-similar.xlib-fallback.xfail.png | Bin 0 -> 8580 bytes + test/self-intersecting.argb32.xfail.png | Bin 287 -> 235 bytes + test/self-intersecting.pdf.argb32.xfail.png | Bin 295 -> 285 bytes + test/self-intersecting.pdf.rgb24.xfail.png | Bin 272 -> 269 bytes + test/self-intersecting.rgb24.xfail.png | Bin 282 -> 240 bytes + test/smask-fill.xlib-fallback.ref.png | Bin 1156 -> 0 bytes + test/smask-text.xlib.ref.png | Bin 0 -> 1672 bytes + test/smask.xlib.ref.png | Bin 0 -> 3393 bytes + test/surface-pattern-big-scale-down.ps.xfail.png | Bin 0 -> 238 bytes + test/svg-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + test/svg-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + ...allback16-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + ...fallback16-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 0 -> 1831 bytes + test/text-pattern.pdf.argb32.xfail.png | Bin 1845 -> 0 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 0 -> 1598 bytes + test/text-pattern.pdf.rgb24.xfail.png | Bin 1599 -> 0 bytes + test/unbounded-operator.svg12.argb32.xfail.png | Bin 2767 -> 2771 bytes + test/unbounded-operator.svg12.rgb24.xfail.png | Bin 1719 -> 1731 bytes + test/user-font-proxy.svg.ref.png | Bin 16817 -> 16814 bytes + test/xlib-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + test/xlib-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + util/cairo-script/cairo-script-file.c | 39 +- + util/cairo-script/cairo-script-objects.c | 22 + + util/cairo-script/cairo-script-private.h | 9 +- + util/cairo-script/cairo-script-scanner.c | 52 +- + util/cairo-trace/trace.c | 119 +- + 196 files changed, 7741 insertions(+), 5903 deletions(-) + +commit f5a1cdf283a6aa1f4409ccbf3c2274fb587724fe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 14:46:16 2009 +0100 + + [gl] Simplify the common CLEAR of a surface + + Almost every surface is at sometime cleared, so catch the operation in + paint(), and emit a simple glClear() instead. + + src/cairo-gl-surface.c | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +commit eed17527f62eab826af65258b60cd4545a71a22d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 14:30:46 2009 +0100 + + [gl] Do not use unchecked GL v1.5 features + + The span renderer uses ARB_vertex_buffer_object which was included into + the core as part of OpenGL 1.5. We failed to check for the required version + during initialisation, and to my surprise the i915 can only support OpenGL + 1.4 as it lacks ARB_occlusion_query. So just use the ARB extension instead + which is present on i915. + + src/cairo-gl-surface.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +commit 6c28c7a1e268fad0ad34cac0d8a9a3951d8f3c7a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 23 08:45:58 2009 +0100 + + [perf] Add a simple report printer. + + After a run, it can be useful to reprint the results, so add + cairo-perf-print to perform that task. + + For the future, I'd like to move the performance suite over to the + git/perf style of single, multi-function binary. + + The sequence of operations that I typically do are: + + ./cairo-perf-trace -r -v -i 6 > `git describe`.`hostname`.perf + ./cairo-perf-diff-files REVA REVB + ./cairo-perf-print REVA + ./cairo-perf-compare-backends REVA + + which misses the caching available with cairo-perf-diff. 'make html' is + almost what I want, but still too prescriptive. However, that does need to + be addressed for continuous performance monitoring. + + Along the perf lines, those sequence of operations become: + ./cairo-perf record -i 6 + ./cairo-perf report + ./cairo-perf report REVA REVB + ./cairo-perf report --backends="image,xlib,gl" REVA REVB + ./cairo-perf report --html REVA REVB + + Also we want to think about installing the cairo-perf binary. So we want + to differentiate when run inside a git checkout. + + perf/Makefile.am | 8 ++++-- + perf/cairo-perf-print.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 78 insertions(+), 2 deletions(-) + +commit 92ba74d760f20cd257b3916a51c8efef1c0e021e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 19:04:07 2009 +0100 + + [vg] Compile fixes for EGL boilerplate + + boilerplate/cairo-boilerplate-vg.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +commit bfbe875ded0b0666a8048ef5fb598179a81c610a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 07:52:30 2009 +0100 + + [gl] Enable GL backend for cairo-perf-trace + + perf/cairo-perf-trace.c | 3 +++ + perf/cairo-perf.c | 4 +++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit fed000620335a5fc2bda2ffeca5cbdd0ca5a158c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 07:49:05 2009 +0100 + + [NEWS] Add stub for OpenGL. + + NEWS | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit bff0b11634ffe52a5c8b2bbc9b6aee5bc3d2772c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 07:45:21 2009 +0100 + + [gl] Update reference images + + test/Makefile.am | 14 ++++++++++++++ + test/a1-image-sample.gl.xfail.png | Bin 0 -> 120 bytes + test/alpha-similar.gl.argb32.xfail.png | Bin 0 -> 99 bytes + test/alpha-similar.gl.rgb24.xfail.png | Bin 0 -> 93 bytes + test/device-offset-fractional.gl.xfail.png | Bin 0 -> 311 bytes + test/filter-nearest-offset.gl.xfail.png | Bin 0 -> 260 bytes + test/filter-nearest-transformed.gl.xfail.png | Bin 0 -> 514 bytes + test/finer-grained-fallbacks.gl.argb32.ref.png | Bin 0 -> 1075 bytes + test/mask-glyphs.gl.ref.png | Bin 0 -> 1188669 bytes + test/meta-surface-pattern.gl.argb32.ref.png | Bin 0 -> 3130 bytes + test/scale-offset-image.gl.ref.png | Bin 0 -> 9197 bytes + test/scale-offset-similar.gl.ref.png | Bin 0 -> 9197 bytes + test/source-clip-scale.gl.ref.png | Bin 0 -> 164 bytes + test/unbounded-operator.gl.argb32.xfail.png | Bin 0 -> 2805 bytes + test/unbounded-operator.gl.rgb24.xfail.png | Bin 0 -> 1355 bytes + 15 files changed, 14 insertions(+) + +commit 653351cd2e9fbe42333cd5ce57b7b49c6da3d122 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 07:38:24 2009 +0100 + + [gl] Copy font options from image backend. + + Enable hint metrics similar to the default image backend. However, + consider using the display stored in the GLX context to query the screen + default. + + src/cairo-gl-surface.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit a2ac67274d4ef89079c47cc415144a6ac0303f70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 00:05:07 2009 +0100 + + [gl] Add warning about missing hook for XCloseDisplay(). + + src/cairo-glx-context.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit f2f42ec70a626a69f4b29f55f9d1818942bb0b19 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 22 00:01:22 2009 +0100 + + [gl] Apply pixel sample bias for spans + + src/cairo-gl-surface.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 9e420f5d0669ec12eaaf7faf4e55642c10b95fb3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 23:45:00 2009 +0100 + + [gl] Another whitespace pass. + + src/cairo-gl-surface.c | 69 +++++++++++++++++++++++++------------------------- + 1 file changed, 35 insertions(+), 34 deletions(-) + +commit 222fd8b49b25c56f38ad375059240983a8f576ce +Merge: 5471603 7ee0fee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 23:42:34 2009 +0100 + + Merge commit 'anholt/gl-span-renderer' + +commit 5471603b527ecf43aaa72665d47929a1038aa642 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 23:38:05 2009 +0100 + + [gl] Use QUADS for drawing fill_rectangles() not TRIFAN + + As each rectangle is independent, we need to draw the array using QUADS. + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c3ef0c8d2011a23d73ff919dbb947ca68e1d8c1b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 23:31:30 2009 +0100 + + [gl] Whitespace + + Ensure we leave a space between a function call and its parameters. + + src/cairo-gl-surface.c | 90 +++++++++++++++++++++++++------------------------- + 1 file changed, 45 insertions(+), 45 deletions(-) + +commit b71c27bf4ebd19f74f22392ddb2612d843c74a38 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 23:26:15 2009 +0100 + + [gl] Remove dead code. + + The loop between texture_setup() and clone_similar() should be + impossible, since every compositing backend should know how to clone an + image surface. cairo-gl is no longer an exception and so this code can + safely be removed. + + src/cairo-gl-surface.c | 25 +------------------------ + 1 file changed, 1 insertion(+), 24 deletions(-) + +commit c8cc6a205a68a7c87239424aa93a29b5b166561d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 23:08:39 2009 +0100 + + [gl] Avoid temporary allocation of pixman trapezoids + + When creating the trapezoid mask, avoid having to allocate a temporary + array to hold the converted pixman trapezoids by instead rasterizing each + trapezoid separately into the mask. + + src/cairo-gl-surface.c | 82 ++++++++++++++++++++++---------------------------- + 1 file changed, 36 insertions(+), 46 deletions(-) + +commit 5deb8fa213ce86759053be391966618ee0959f50 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 9 16:20:32 2009 +0100 + + [gl] Construct a dummy window for the initial context + + In order to make the initial context current we need a Drawable that + matches the context. In general, the RootWindow may not match the desired + context so we need to query the context and construct an appropriate + Drawable. + + src/cairo-glx-context.c | 70 ++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 63 insertions(+), 7 deletions(-) + +commit 911482e5ae88ba26a1b3290731968f8b8a80cd70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 22 23:44:27 2009 +0100 + + [gl] Constrain image sources to max texture size + + src/cairo-gl-private.h | 2 ++ + src/cairo-gl-surface.c | 19 +++++++++++++++++++ + 2 files changed, 21 insertions(+) + +commit 1ae5942a3aa9f73aa71438dc40221836b0dff7e2 +Merge: fd9df49 6a59574 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 22:28:44 2009 +0100 + + Merge commit 'anholt/gl' + + Conflicts: + boilerplate/Makefile.sources + boilerplate/cairo-boilerplate.c + build/configure.ac.features + src/cairo.h + util/cairo-script/Makefile.am + +commit fd9df4978d56bbb85ecd795afce72c0310dbcf3f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 21 20:51:46 2009 +0100 + + [perf] Don't override CAIRO_TRACE_DIR in cairo-perf-diff + + perf/cairo-perf-diff | 1 - + 1 file changed, 1 deletion(-) + +commit 2dd97ae59c482f09e42d719a941e189560f00b8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 22:19:21 2009 +0100 + + [perf] Include trace comparison in html output + + build/Makefile.am.analysis | 2 ++ + perf/Makefile.am | 2 +- + perf/cairo-perf-diff | 17 +++++++---------- + perf/make-html.py | 3 +-- + 4 files changed, 11 insertions(+), 13 deletions(-) + +commit f30cee70f5fadd1f2af60310a148f61ed4fc7069 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 22:17:30 2009 +0100 + + [perf] Search multiple directories for traces + + In view of sharing traces between multiple builder, add some system wide + directories to the search path. This should be refined to a single + canonical location before release. + + perf/cairo-perf-trace.c | 23 +++++++++++++++++++++-- + 1 file changed, 21 insertions(+), 2 deletions(-) + +commit ebac096648d638d6405152d37d7b58a0f6ad3242 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 19:54:12 2009 +0100 + + [build] And export CC_FOR_BUILD so that we can actually use it! + + build/configure.ac.tools | 1 + + 1 file changed, 1 insertion(+) + +commit ed7853d4991f17a5e6df694808d33603eecf9186 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 19:37:27 2009 +0100 + + [build] Use ${CC} as the default value for CC_FOR_BUILD + + build/configure.ac.tools | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 809f77a5cb7c17582a0ed90285a3c48c0696ed3e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 13:44:48 2009 +0100 + + [test] Summarise tests that fail during the preamble. + + Some tests only run and check during the preamble phase, and those + failures were being ignored during the summary. + + test/cairo-test-runner.c | 109 ++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 85 insertions(+), 24 deletions(-) + +commit dbaa08e80b6d53f905974f3d2012f9425d9b8603 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 11:53:17 2009 +0100 + + [test] Fallback to comparing the base image references + + After looking at backend specific images, check against the base image + reference. This is useful to fallback surfaces like xlib-fallback, which + should look closer to the image backend than the xlib backend. + + test/cairo-test.c | 231 ++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 163 insertions(+), 68 deletions(-) + +commit 164e0d2ea38baacd5888bffa5bebb5d64bfee01b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 11:02:04 2009 +0100 + + [test] Misidentification of XFAIL as NEW + + cut'n'paste error compared the image against the known failure instead of + any recorded new failure, when checking for NEW fails. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2883177487ba294a0c97bafb00e2f56e5fe84d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 20 18:55:04 2009 +0100 + + Add a jhbuild moduleset. + + util/cairo.modules | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 0c1e86d661e145981050129b163eae0fb8f4a963 +Author: Pierre Tardy <tardyp@gmail.com> +Date: Sat Jul 18 19:16:20 2009 +0100 + + Cross-compilation fix for boilerplate/test + + boilerplate/Makefile.am | 2 +- + test/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit aac256b2692d15fc21abcdc9c1b9e5fd35f63f66 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 18 16:15:47 2009 +0100 + + Compile fixes for mingw32. + + Trivial typos found whilst using a cross-compiler. + + src/cairo-win32-surface.c | 1 + + util/cairo-script/cairo-script-private.h | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 922b01ad141305f909a4cfffc6c65a27c6d7a8a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 17 14:27:19 2009 +0100 + + [test] Add a simplified CLEAR test. + + Just performs a very basic masked clear. This does not exhibit the bug I was + looking for, but is still useful for its simplicity. + + test/Makefile.am | 4 ++ + test/Makefile.sources | 1 + + test/clear.argb32.ref.png | Bin 0 -> 695 bytes + test/clear.c | 86 ++++++++++++++++++++++++++++++++++++++ + test/clear.rgb24.ref.png | Bin 0 -> 618 bytes + test/clear.svg12.argb32.xfail.png | Bin 0 -> 170 bytes + test/clear.svg12.rgb24.xfail.png | Bin 0 -> 170 bytes + 7 files changed, 91 insertions(+) + +commit 52fa8760aeef38abbab0484a6978adaf4f100f90 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 15 16:37:25 2009 +0100 + + Add OpenVG backend. + + Based on the work by Øyvind Kolås and Pierre Tardy -- many thanks to + Pierre for pushing this backend for inclusion as well as testing and + reviewing my initial patch. And many more thanks to pippin for writing the + backend in the first place! + + Hacked and chopped by myself into a suitable basis for a backend. Quite a + few issues remain open, but would seem to be ready for testing on suitable + hardware. + + AUTHORS | 3 +- + NEWS | 3 + + boilerplate/Makefile.sources | 1 + + boilerplate/Makefile.win32.features | 30 + + boilerplate/cairo-boilerplate-vg.c | 350 +++++++ + build/Makefile.win32.features | 3 + + build/Makefile.win32.features-h | 9 + + build/configure.ac.features | 3 + + configure.ac | 43 + + src/Makefile.sources | 3 + + src/Makefile.win32.features | 42 + + src/cairo-vg-surface.c | 1938 +++++++++++++++++++++++++++++++++++ + src/cairo-vg.h | 103 ++ + src/cairo.h | 4 +- + test/cairo-test.c | 3 +- + test/get-clip.c | 1 + + util/cairo-trace/trace.c | 70 ++ + 17 files changed, 2606 insertions(+), 3 deletions(-) + +commit 34d5b862bce3e9273391eb5d2c384394cca94d2d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 16 14:18:13 2009 +0100 + + [xlib] Enable Render support for the extended PDF operators + + With the latest 0.11 release of renderproto we now have the ability to + use the extended PDF operators via Render. + + src/cairo-image-surface.c | 10 ++++++---- + src/cairo-xlib-surface.c | 48 ++++++++++++++++++++++++++++++++++++++++++++--- + 2 files changed, 51 insertions(+), 7 deletions(-) + +commit 01eec61f4ffae4f492d667b6accb5ed3f6960d2c +Author: Tobias Hunger <tobias.hunger@gmail.com> +Date: Thu Jul 16 00:16:59 2009 -0400 + + [qt] Remove use of unnecessary QBrush pointer + + QBrush is a implicitly shared datastructure. There is on need to layer + "explicit pointer based sharing" atop of it. + + Mozilla Bug #498871 + + src/cairo-qt-surface.cpp | 31 +++++++++++++++---------------- + 1 file changed, 15 insertions(+), 16 deletions(-) + +commit 222c12cc4e48c2c9178a7390ea8edd73d7cb56bb +Author: Tobias Hunger <tobias.hunger@gmail.com> +Date: Thu Jul 16 00:16:59 2009 -0400 + + [qt] Remove use of unnecessary QPen pointer + + QPen is a implicitly shared class, so there is no need to do explicit sharing + via pointers. + + Mozilla Bug #498873 + + src/cairo-qt-surface.cpp | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +commit 0797b2fcaad0c17c35e67ec5d01a0556a76ee39d +Author: Tobias Hunger <tobias.hunger@gmail.com> +Date: Thu Jul 16 00:16:59 2009 -0400 + + [qt] Cleanup some whitespace + + Mozilla bug #498843 + + src/cairo-qt-surface.cpp | 212 +++++++++++++++++++++++------------------------ + 1 file changed, 106 insertions(+), 106 deletions(-) + +commit d782ba04b76ae18c562840242dc535e9db48aa13 +Author: Tobias Hunger <tobias.hunger@gmail.com> +Date: Thu Jul 16 00:16:58 2009 -0400 + + [qt] Add method to flush qpainter + + This is required for non-X11 rendering backends. + + Mozilla bug #498910 + + src/cairo-qt-surface.cpp | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit e713857b85ef45d923eae94d8e4c05c7b2049ca5 +Author: Tobias Hunger <tobias.hunger@gmail.com> +Date: Thu Jul 16 00:16:58 2009 -0400 + + [qt] Move _opstr() inside the #if 0 to avoid warnings + + Mozilla bug #498917 + + src/cairo-qt-surface.cpp | 50 ++++++++++++++++++++++++------------------------ + 1 file changed, 25 insertions(+), 25 deletions(-) + +commit 4f9551e5e533deb66401b601766bf4263192b6de +Author: Tobias Hunger <tobias.hunger@gmail.com> +Date: Thu Jul 16 00:16:57 2009 -0400 + + [qt] Reduce padding in cairo_qt_surface_t struct + + Removes 4 bytes of padding (on a 32bit system) from the datastructure by + reordering the members. + + Mozilla bug #498880 + + src/cairo-qt-surface.cpp | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +commit 1caa34103925c53b180cd614f5c6b425b5a3f271 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 15 13:26:34 2009 +0100 + + Fix build under distcheck + + Need to play a little dance to get the sources included and paths correct + whilst building source files with objdir != srcdir under distcheck. + + boilerplate/Makefile.am | 10 +-- + boilerplate/make-cairo-boilerplate-constructors.c | 19 ++++-- + doc/public/tmpl/cairo-surface.sgml | 2 + + doc/public/tmpl/cairo.sgml | 15 +++++ + test/Makefile.am | 9 ++- + test/make-cairo-test-constructors.c | 13 +++- + util/cairo-script/csi-bind.c | 76 +++++++++++++++++++++++ + 7 files changed, 125 insertions(+), 19 deletions(-) + +commit 818ad38a0e323892231469520a4b077f4dae31d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 19:07:42 2009 +0100 + + [boilerplate] Add make-...-constructors to .gitignore + + boilerplate/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 9a65b4a116a3ae451cbba2826467ad3375235a5c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 19:06:53 2009 +0100 + + [perf] Add cairo-traces to .gitignore + + perf/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 5796a9240ea02dbdbef0d51a4ee71398fea858ad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 19:04:56 2009 +0100 + + [test] Reconstruct REFERENCE_IMAGES + + Rebuild the list from scratch using the contents of my git working tree. + + test/Makefile.am | 449 ++++++++++++++++++++++--------------------------------- + 1 file changed, 178 insertions(+), 271 deletions(-) + +commit 8c55ca9ebce487c5ca8b1712f8358a6361032d43 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 16:54:51 2009 +0100 + + [directfb] Silence compiler warnings. + + Add extended blend mode to operator switch. + + src/cairo-directfb-surface.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 8ad3fca2109f18b5125e7087b3059eb4225eec3e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 16:51:31 2009 +0100 + + [glitz] Extended blend mode support + + Ensure that we fallback given an extended operator. + + src/cairo-glitz-surface.c | 80 +++++++++++++++++++++++++++++++++++------------ + 1 file changed, 60 insertions(+), 20 deletions(-) + +commit 333d37a60fa80f325612ea94b19ec9892dff8cfb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 16:41:00 2009 +0100 + + [pdf] Silence copmiler. + + Fill in missing case values to silence the compiler, and remind us should + we every add more operators in future. + + src/cairo-pdf-surface.c | 95 +++++++++++++++++++++++++------------------------ + 1 file changed, 48 insertions(+), 47 deletions(-) + +commit 710308c64e298ae35988fb0881a33cbe92af48ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 16:31:41 2009 +0100 + + [script] Extended blend mode support. + + src/cairo-script-surface.c | 18 +++++++++++++++++- + util/cairo-script/cairo-script-operators.c | 15 +++++++++++++++ + util/cairo-trace/trace.c | 18 +++++++++++++++++- + 3 files changed, 49 insertions(+), 2 deletions(-) + +commit 100f0d94eebcec05372263b2e68c27b91b52a1c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 14 16:30:36 2009 +0100 + + [cairo] Remove trailing spaces in comments. + + vim highlights these errors making my screen go red and upsets me. + So they must die. + + src/cairo.h | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 75736603d3b976dab8ac1ef473164c618084ee60 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Aug 29 15:11:23 2007 +0200 + + [SVG] Add extended blend modes. + + src/cairo-svg-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 47af6cf2803737ab7248d1ce4d76f038d1f3188e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 14 15:34:13 2009 +0200 + + [pdf] Add support for the extra blend modes + + HSL modes support added by Benjamin Otte <otte@gnome.org> + + src/cairo-pdf-surface-private.h | 4 + + src/cairo-pdf-surface.c | 162 +++++++++++++++++++++++++++++++++++++++- + 2 files changed, 164 insertions(+), 2 deletions(-) + +commit cf186d60b0d96cde859869237fa859e28a74a037 +Author: Benjamin Otte <otte@gnome.org> +Date: Thu Aug 30 10:16:00 2007 +0200 + + [xlib] Add support for new operators + + This is of course just making sure fallbacks get used as Render does not support + the new operators yet. + + src/cairo-xlib-surface.c | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit 0fd944d4bfbc2fff9960378eafd18a7d8fb9f296 +Author: Benjamin Otte <otte@gnome.org> +Date: Tue Jul 14 15:28:10 2009 +0200 + + Use new pixman extended blend operators + + It also adds extended-blend tests. + + Based on a previous patch by Emmanuel Pacaud <emmanuel.pacaud@free.fr> + + src/cairo-image-surface.c | 31 ++++++++ + src/cairo-misc.c | 30 ++++++++ + src/cairo.h | 53 +++++++++++++- + test/Makefile.am | 4 ++ + test/Makefile.sources | 2 + + test/extended-blend-alpha.argb32.ref.png | Bin 0 -> 9777 bytes + test/extended-blend-alpha.c | 115 ++++++++++++++++++++++++++++++ + test/extended-blend-alpha.rgb24.ref.png | Bin 0 -> 5743 bytes + test/extended-blend.argb32.ref.png | Bin 0 -> 4071 bytes + test/extended-blend.c | 117 +++++++++++++++++++++++++++++++ + test/extended-blend.rgb24.ref.png | Bin 0 -> 3772 bytes + 11 files changed, 351 insertions(+), 1 deletion(-) + +commit 16387f0a7dd3b474bcaf637d3e290029b79afec1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 14 11:16:24 2009 +0200 + + [configure] Bump pixman dependency + + Version 0.15.16 contains the new PDF blend mode operators. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 655a4dbc36d95ce4a82cbc13aa9e2002b41fa4de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 13 14:31:43 2009 +0100 + + [test] Track XFAIL using expected results stored as xfail.png + + Instead of tagging the sources, which is insensitive to changes, track the + known failure modes by recording the current fail as an xfail.png + reference. (We also introduce a new.png to track a fresh error, so that + they are not lost in the noise of the old XFAILs and hopefully do not + cause everyone to fret). + + As we have removed the XFAIL tagging we find, surprise surprise, that some + tests are now working -- so review all the reference images (as also some + .ref.png now should be .xfail.png). + + Note: I've only checked image,pdf,ps,svg. The test surfaces report some + failures that probably need to addressed in source. I've not correct the + changes for win32 and quartz. Nor fixed up the experimental backends. + + test/alpha-similar.c | 2 +- + test/alpha-similar.pdf.argb32.xfail.png | Bin 0 -> 95 bytes + test/alpha-similar.pdf.rgb24.xfail.png | Bin 0 -> 93 bytes + test/alpha-similar.ps.argb32.xfail.png | Bin 0 -> 95 bytes + test/alpha-similar.ps.rgb24.xfail.png | Bin 0 -> 93 bytes + test/alpha-similar.svg.argb32.xfail.png | Bin 0 -> 99 bytes + test/alpha-similar.svg.rgb24.xfail.png | Bin 0 -> 95 bytes + test/big-line.c | 2 +- + test/big-line.ps.argb32.ref.png | Bin 0 -> 977 bytes + test/big-line.ps.rgb24.ref.png | Bin 0 -> 709 bytes + test/big-line.ps2.ref.png | Bin 1148 -> 0 bytes + test/big-line.ps2.rgb24.ref.png | Bin 830 -> 0 bytes + test/big-line.ps3.ref.png | Bin 1148 -> 0 bytes + test/big-line.ps3.rgb24.ref.png | Bin 830 -> 0 bytes + test/big-line.ref.png | Bin 1486 -> 0 bytes + test/big-line.rgb24.ref.png | Bin 1308 -> 0 bytes + test/big-trap.c | 7 +- + test/cairo-test-runner.c | 161 +++----- + test/cairo-test.c | 405 ++++++++++++++------- + test/cairo-test.h | 56 ++- + test/caps-joins-alpha.svg11.ref.png | Bin 2454 -> 0 bytes + test/caps-joins-alpha.svg12.ref.png | Bin 2454 -> 0 bytes + test/clip-fill-rule.test-fallback.rgb24.ref.png | Bin 361 -> 0 bytes + test/clip-nesting.test-fallback.rgb24.ref.png | Bin 936 -> 0 bytes + test/clip-operator.c | 2 +- + test/clip-operator.pdf.argb32.ref.png | Bin 11603 -> 0 bytes + test/clip-operator.pdf.argb32.xfail.png | Bin 0 -> 9340 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 6882 -> 0 bytes + test/clip-operator.pdf.rgb24.xfail.png | Bin 0 -> 5155 bytes + test/clip-operator.svg12.argb32.xfail.png | Bin 0 -> 8404 bytes + test/clip-operator.svg12.rgb24.xfail.png | Bin 0 -> 4523 bytes + test/clip-operator.test-fallback.argb32.ref.png | Bin 8252 -> 0 bytes + test/clip-operator.test-fallback.rgb24.ref.png | Bin 3241 -> 0 bytes + test/clip-twice.test-fallback.argb32.ref.png | Bin 1343 -> 0 bytes + test/clip-twice.test-fallback.rgb24.ref.png | Bin 1179 -> 0 bytes + test/composite-integer-translate-source.c | 2 +- + test/degenerate-arc.test-fallback.argb32.ref.png | Bin 547 -> 0 bytes + test/degenerate-arc.test-fallback.rgb24.ref.png | Bin 547 -> 0 bytes + test/degenerate-dash.c | 2 +- + test/degenerate-dash.ps.xfail.png | Bin 0 -> 1835 bytes + test/degenerate-path.c | 2 +- + test/degenerate-path.ps.argb32.xfail.png | Bin 0 -> 236 bytes + test/degenerate-path.ps.rgb24.xfail.png | Bin 0 -> 186 bytes + test/degenerate-path.ps2.argb32.ref.png | Bin 390 -> 0 bytes + test/degenerate-path.ps2.rgb24.ref.png | Bin 358 -> 0 bytes + test/degenerate-path.ps3.argb32.ref.png | Bin 390 -> 0 bytes + test/degenerate-path.ps3.rgb24.ref.png | Bin 358 -> 0 bytes + test/device-offset-scale.c | 2 +- + test/device-offset-scale.svg.xfail.png | Bin 0 -> 128 bytes + test/extend-pad-border.c | 2 +- + test/extend-pad-border.ps.ref.png | Bin 0 -> 649 bytes + test/extend-pad-border.svg.xfail.png | Bin 0 -> 1063 bytes + test/extend-pad-similar.svg.xfail.png | Bin 0 -> 270 bytes + test/extend-pad.svg.xfail.png | Bin 0 -> 270 bytes + test/fallback-resolution.c | 14 +- + test/fill-alpha-pattern.pdf.argb32.ref.png | Bin 3750 -> 0 bytes + test/fill-alpha-pattern.pdf.rgb24.ref.png | Bin 3758 -> 0 bytes + ...fill-alpha-pattern.test-fallback.argb32.ref.png | Bin 3379 -> 0 bytes + .../fill-alpha-pattern.test-fallback.rgb24.ref.png | Bin 3379 -> 0 bytes + test/fill-alpha.test-fallback.argb32.ref.png | Bin 2824 -> 0 bytes + test/fill-alpha.test-fallback.rgb24.ref.png | Bin 2824 -> 0 bytes + test/fill-and-stroke-alpha-add.c | 2 +- + test/fill-and-stroke-alpha-add.svg12.xfail.png | Bin 0 -> 614 bytes + test/fill-degenerate-sort-order.c | 2 +- + .../fill-degenerate-sort-order.ps.argb32.xfail.png | Bin 0 -> 1901 bytes + test/fill-degenerate-sort-order.ps.rgb24.xfail.png | Bin 0 -> 1645 bytes + ...enerate-sort-order.test-fallback.argb32.ref.png | Bin 2378 -> 0 bytes + ...generate-sort-order.test-fallback.rgb24.ref.png | Bin 2041 -> 0 bytes + test/fill-image.xlib.ref.png | Bin 0 -> 1460 bytes + test/fill-rule.test-fallback.argb32.ref.png | Bin 1979 -> 0 bytes + test/fill-rule.test-fallback.rgb24.ref.png | Bin 1703 -> 0 bytes + test/filter-bilinear-extents.pdf.ref.png | Bin 798 -> 0 bytes + test/filter-bilinear-extents.pdf.xfail.png | Bin 0 -> 401 bytes + test/filter-nearest-offset.pdf.ref.png | Bin 997 -> 0 bytes + test/filter-nearest-offset.pdf.xfail.png | Bin 0 -> 1926 bytes + test/filter-nearest-offset.svg.xfail.png | Bin 0 -> 4419 bytes + test/filter-nearest-offset.svg11.ref.png | Bin 4739 -> 0 bytes + test/filter-nearest-offset.svg12.ref.png | Bin 4739 -> 0 bytes + test/filter-nearest-transformed.pdf.ref.png | Bin 552 -> 0 bytes + test/filter-nearest-transformed.pdf.xfail.png | Bin 0 -> 488 bytes + test/filter-nearest-transformed.svg.xfail.png | Bin 0 -> 546 bytes + test/filter-nearest-transformed.svg11.ref.png | Bin 559 -> 0 bytes + test/filter-nearest-transformed.svg12.ref.png | Bin 559 -> 0 bytes + test/finer-grained-fallbacks.c | 2 +- + test/finer-grained-fallbacks.svg12.argb32.ref.png | Bin 0 -> 190 bytes + test/finer-grained-fallbacks.svg12.rgb24.ref.png | Bin 0 -> 191 bytes + ...-grained-fallbacks.test-fallback.argb32.ref.png | Bin 1111 -> 0 bytes + ...r-grained-fallbacks.test-fallback.rgb24.ref.png | Bin 854 -> 0 bytes + test/font-matrix-translation.svg.ref.png | Bin 0 -> 870 bytes + test/font-matrix-translation.svg11.argb32.ref.png | Bin 857 -> 0 bytes + test/font-matrix-translation.svg11.ref.png | Bin 970 -> 0 bytes + test/font-matrix-translation.svg11.rgb24.ref.png | Bin 857 -> 0 bytes + test/font-matrix-translation.svg12.argb32.ref.png | Bin 857 -> 0 bytes + test/font-matrix-translation.svg12.ref.png | Bin 970 -> 0 bytes + test/font-matrix-translation.svg12.rgb24.ref.png | Bin 857 -> 0 bytes + test/ft-show-glyphs-positioning.svg.ref.png | Bin 0 -> 6018 bytes + test/ft-show-glyphs-positioning.svg11.ref.png | Bin 6590 -> 0 bytes + test/ft-show-glyphs-positioning.svg12.ref.png | Bin 6590 -> 0 bytes + test/ft-show-glyphs-table.svg.ref.png | Bin 0 -> 10005 bytes + test/ft-show-glyphs-table.svg11.argb32.ref.png | Bin 9953 -> 0 bytes + test/ft-show-glyphs-table.svg11.rgb24.ref.png | Bin 9953 -> 0 bytes + test/ft-show-glyphs-table.svg12.argb32.ref.png | Bin 9953 -> 0 bytes + test/ft-show-glyphs-table.svg12.rgb24.ref.png | Bin 9953 -> 0 bytes + test/ft-text-vertical-layout-type1.svg.ref.png | Bin 0 -> 3607 bytes + ...text-vertical-layout-type1.svg11.argb32.ref.png | Bin 3614 -> 0 bytes + test/ft-text-vertical-layout-type1.svg11.ref.png | Bin 3973 -> 0 bytes + ...-text-vertical-layout-type1.svg11.rgb24.ref.png | Bin 3614 -> 0 bytes + ...text-vertical-layout-type1.svg12.argb32.ref.png | Bin 3614 -> 0 bytes + test/ft-text-vertical-layout-type1.svg12.ref.png | Bin 3973 -> 0 bytes + ...-text-vertical-layout-type1.svg12.rgb24.ref.png | Bin 3614 -> 0 bytes + ...tical-layout-type1.test-fallback.argb32.ref.png | Bin 3639 -> 0 bytes + ...rtical-layout-type1.test-fallback.rgb24.ref.png | Bin 3639 -> 0 bytes + test/ft-text-vertical-layout-type3.svg.ref.png | Bin 0 -> 3626 bytes + ...text-vertical-layout-type3.svg11.argb32.ref.png | Bin 3640 -> 0 bytes + test/ft-text-vertical-layout-type3.svg11.ref.png | Bin 3957 -> 0 bytes + ...-text-vertical-layout-type3.svg11.rgb24.ref.png | Bin 3640 -> 0 bytes + ...text-vertical-layout-type3.svg12.argb32.ref.png | Bin 3640 -> 0 bytes + test/ft-text-vertical-layout-type3.svg12.ref.png | Bin 3957 -> 0 bytes + ...-text-vertical-layout-type3.svg12.rgb24.ref.png | Bin 3640 -> 0 bytes + ...tical-layout-type3.test-fallback.argb32.ref.png | Bin 3605 -> 0 bytes + ...rtical-layout-type3.test-fallback.rgb24.ref.png | Bin 3605 -> 0 bytes + test/gradient-alpha.pdf.argb32.ref.png | Bin 126 -> 0 bytes + test/gradient-alpha.pdf.rgb24.ref.png | Bin 121 -> 0 bytes + test/gradient-constant-alpha.pdf.argb32.ref.png | Bin 116 -> 0 bytes + test/gradient-constant-alpha.pdf.rgb24.ref.png | Bin 115 -> 0 bytes + test/group-unaligned.pdf.new.png | Bin 0 -> 427 bytes + test/group-unaligned.pdf.ref.png | Bin 414 -> 0 bytes + test/group-unaligned.svg.argb32.ref.png | Bin 524 -> 0 bytes + test/group-unaligned.svg.argb32.xfail.png | Bin 0 -> 522 bytes + test/group-unaligned.svg.rgb24.ref.png | Bin 434 -> 0 bytes + test/group-unaligned.svg.rgb24.xfail.png | Bin 0 -> 425 bytes + test/huge-linear.c | 2 +- + test/huge-linear.pdf.ref.png | Bin 0 -> 1577 bytes + test/huge-radial.c | 2 +- + test/huge-radial.pdf.argb32.ref.png | Bin 0 -> 177382 bytes + test/huge-radial.pdf.rgb24.ref.png | Bin 0 -> 225358 bytes + test/large-source-roi.c | 2 +- + test/large-source-roi.ref.png | Bin 102 -> 0 bytes + test/linear-gradient.pdf.ref.png | Bin 1125 -> 0 bytes + test/linear-gradient.svg11.argb32.ref.png | Bin 988 -> 0 bytes + test/linear-gradient.svg11.ref.png | Bin 1000 -> 0 bytes + test/linear-gradient.svg11.rgb24.ref.png | Bin 988 -> 0 bytes + test/linear-gradient.svg12.argb32.ref.png | Bin 988 -> 0 bytes + test/linear-gradient.svg12.ref.png | Bin 1000 -> 0 bytes + test/linear-gradient.svg12.rgb24.ref.png | Bin 988 -> 0 bytes + test/linear-gradient.test-fallback.argb32.ref.png | Bin 923 -> 0 bytes + test/linear-gradient.test-fallback.rgb24.ref.png | Bin 923 -> 0 bytes + test/long-lines.c | 2 +- + test/long-lines.ref.png | Bin 247 -> 0 bytes + test/make-html.pl | 13 +- + test/mask-alpha.svg.rgb24.xfail.png | Bin 0 -> 585 bytes + test/mask-alpha.svg11.argb32.ref.png | Bin 642 -> 0 bytes + test/mask-alpha.svg11.rgb24.ref.png | Bin 592 -> 0 bytes + test/mask-alpha.svg12.argb32.ref.png | Bin 642 -> 0 bytes + test/mask-alpha.svg12.rgb24.ref.png | Bin 592 -> 0 bytes + test/mask-alpha.test-fallback.argb32.ref.png | Bin 627 -> 0 bytes + test/mask-ctm.svg11.argb32.ref.png | Bin 108 -> 0 bytes + test/mask-ctm.svg12.argb32.ref.png | Bin 108 -> 0 bytes + test/mask-glyphs.c | 2 +- + test/mask-glyphs.pdf.ref.png | Bin 0 -> 1187713 bytes + test/mask-glyphs.svg.ref.png | Bin 0 -> 1211170 bytes + test/mask-surface-ctm.svg11.argb32.ref.png | Bin 108 -> 0 bytes + test/mask-surface-ctm.svg12.argb32.ref.png | Bin 108 -> 0 bytes + test/mask-transformed-similar.svg.ref.png | Bin 0 -> 3365 bytes + test/mask-transformed-similar.svg11.ref.png | Bin 4051 -> 0 bytes + test/mask-transformed-similar.svg12.ref.png | Bin 4051 -> 0 bytes + test/mask.pdf.argb32.ref.png | Bin 9946 -> 0 bytes + test/mask.pdf.argb32.xfail.png | Bin 0 -> 7944 bytes + test/mask.pdf.rgb24.ref.png | Bin 8745 -> 0 bytes + test/mask.pdf.rgb24.xfail.png | Bin 0 -> 7388 bytes + test/mask.svg.argb32.xfail.png | Bin 0 -> 8613 bytes + test/mask.svg.rgb24.xfail.png | Bin 0 -> 7189 bytes + test/mask.svg11.argb32.ref.png | Bin 8682 -> 0 bytes + test/mask.svg11.rgb24.ref.png | Bin 7203 -> 0 bytes + test/mask.svg12.argb32.ref.png | Bin 8682 -> 0 bytes + test/mask.svg12.rgb24.ref.png | Bin 7203 -> 0 bytes + test/mask.test-fallback.argb32.ref.png | Bin 8457 -> 0 bytes + test/mask.test-fallback.rgb24.ref.png | Bin 7058 -> 0 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 0 -> 4009 bytes + test/meta-surface-pattern.pdf.ref.png | Bin 4111 -> 0 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 0 -> 3905 bytes + test/meta-surface-pattern.svg.argb32.ref.png | Bin 0 -> 3930 bytes + test/meta-surface-pattern.svg.rgb24.ref.png | Bin 0 -> 3910 bytes + test/meta-surface-pattern.svg11.argb32.ref.png | Bin 3924 -> 0 bytes + test/meta-surface-pattern.svg11.rgb24.ref.png | Bin 3914 -> 0 bytes + test/meta-surface-pattern.svg12.argb32.ref.png | Bin 3924 -> 0 bytes + test/meta-surface-pattern.svg12.rgb24.ref.png | Bin 3914 -> 0 bytes + test/operator-alpha.c | 2 +- + test/operator-alpha.svg12.argb32.xfail.png | Bin 0 -> 274 bytes + test/operator-alpha.svg12.rgb24.xfail.png | Bin 0 -> 248 bytes + test/operator-clear.c | 2 +- + test/operator-clear.pdf.argb32.ref.png | Bin 1607 -> 0 bytes + test/operator-clear.pdf.rgb24.ref.png | Bin 1402 -> 0 bytes + test/operator-clear.svg12.argb32.xfail.png | Bin 0 -> 405 bytes + test/operator-clear.svg12.rgb24.xfail.png | Bin 0 -> 535 bytes + test/operator-clear.xlib.ref.png | Bin 0 -> 951 bytes + test/operator-source.c | 2 +- + test/operator-source.pdf.argb32.ref.png | Bin 5112 -> 0 bytes + test/operator-source.pdf.rgb24.ref.png | Bin 4186 -> 0 bytes + test/operator-source.pdf.rgb24.xfail.png | Bin 0 -> 3645 bytes + test/operator-source.svg12.argb32.xfail.png | Bin 0 -> 2951 bytes + test/operator-source.svg12.rgb24.xfail.png | Bin 0 -> 2963 bytes + test/operator-source.test-fallback.argb32.ref.png | Bin 4401 -> 0 bytes + test/operator-source.test-fallback.rgb24.ref.png | Bin 3200 -> 0 bytes + test/operator.c | 2 +- + test/operator.svg12.argb32.xfail.png | Bin 0 -> 238 bytes + test/operator.svg12.rgb24.xfail.png | Bin 0 -> 242 bytes + test/over-above-source.c | 2 +- + test/over-above-source.svg12.rgb24.xfail.png | Bin 0 -> 563 bytes + .../over-above-source.test-fallback.argb32.ref.png | Bin 533 -> 0 bytes + test/over-above-source.test-fallback.rgb24.ref.png | Bin 450 -> 0 bytes + test/over-around-source.c | 2 +- + test/over-around-source.svg12.argb32.xfail.png | Bin 0 -> 559 bytes + test/over-around-source.svg12.rgb24.xfail.png | Bin 0 -> 559 bytes + ...over-around-source.test-fallback.argb32.ref.png | Bin 610 -> 0 bytes + test/over-below-source.c | 2 +- + test/over-below-source.svg12.argb32.xfail.png | Bin 0 -> 224 bytes + test/over-below-source.svg12.rgb24.xfail.png | Bin 0 -> 224 bytes + test/over-between-source.c | 2 +- + test/over-between-source.svg12.argb32.xfail.png | Bin 0 -> 224 bytes + test/over-between-source.svg12.rgb24.xfail.png | Bin 0 -> 224 bytes + ...ver-between-source.test-fallback.argb32.ref.png | Bin 578 -> 0 bytes + test/paint-source-alpha.c | 2 +- + test/paint-source-alpha.svg.ref.png | Bin 0 -> 693 bytes + test/paint-source-alpha.svg11.ref.png | Bin 756 -> 0 bytes + test/paint-source-alpha.svg12.ref.png | Bin 505 -> 0 bytes + test/paint-with-alpha.svg.ref.png | Bin 0 -> 483 bytes + test/paint-with-alpha.svg11.ref.png | Bin 516 -> 0 bytes + test/paint-with-alpha.svg12.ref.png | Bin 516 -> 0 bytes + test/path-precision.c | 9 +- + test/push-group.svg11.argb32.ref.png | Bin 3034 -> 0 bytes + test/push-group.svg12.argb32.ref.png | Bin 3034 -> 0 bytes + test/push-group.test-fallback.argb32.ref.png | Bin 3107 -> 0 bytes + test/push-group.test-fallback.rgb24.ref.png | Bin 2942 -> 0 bytes + test/radial-gradient.svg11.ref.png | Bin 91039 -> 0 bytes + test/radial-gradient.svg12.ref.png | Bin 91039 -> 0 bytes + ...ndom-intersections.test-fallback.argb32.ref.png | Bin 132312 -> 0 bytes + ...andom-intersections.test-fallback.rgb24.ref.png | Bin 132312 -> 0 bytes + test/rotate-image-surface-paint.pdf.ref.png | Bin 196 -> 0 bytes + test/rotate-image-surface-paint.pdf.xfail.png | Bin 0 -> 207 bytes + test/rotate-image-surface-paint.svg.ref.png | Bin 0 -> 209 bytes + test/rotate-image-surface-paint.svg11.ref.png | Bin 248 -> 0 bytes + test/rotate-image-surface-paint.svg12.ref.png | Bin 248 -> 0 bytes + test/scale-offset-image.c | 2 +- + test/scale-offset-image.pdf.argb32.ref.png | Bin 0 -> 8692 bytes + test/scale-offset-image.pdf.rgb24.ref.png | Bin 0 -> 8691 bytes + test/scale-offset-image.xfail.png | Bin 0 -> 8599 bytes + test/scale-offset-image.xlib.xfail.png | Bin 0 -> 9100 bytes + test/scale-offset-similar.c | 2 +- + test/scale-offset-similar.pdf.argb32.ref.png | Bin 0 -> 9278 bytes + test/scale-offset-similar.pdf.rgb24.ref.png | Bin 0 -> 9278 bytes + test/scale-offset-similar.xfail.png | Bin 0 -> 8599 bytes + test/scale-offset-similar.xlib.xfail.png | Bin 0 -> 8570 bytes + ...scale-source-surface-paint.svg.argb32.xfail.png | Bin 0 -> 229 bytes + .../scale-source-surface-paint.svg.rgb24.xfail.png | Bin 0 -> 222 bytes + ...scale-source-surface-paint.svg11.argb32.ref.png | Bin 229 -> 0 bytes + .../scale-source-surface-paint.svg11.rgb24.ref.png | Bin 243 -> 0 bytes + ...scale-source-surface-paint.svg12.argb32.ref.png | Bin 229 -> 0 bytes + .../scale-source-surface-paint.svg12.rgb24.ref.png | Bin 243 -> 0 bytes + test/self-copy-overlap.c | 2 +- + test/self-copy-overlap.ref.png | Bin 1140 -> 0 bytes + test/self-copy-overlap.rgb24.ref.png | Bin 608 -> 0 bytes + test/self-intersecting.argb32.xfail.png | Bin 0 -> 287 bytes + test/self-intersecting.c | 2 +- + test/self-intersecting.pdf.argb32.xfail.png | Bin 0 -> 295 bytes + test/self-intersecting.pdf.rgb24.xfail.png | Bin 0 -> 272 bytes + test/self-intersecting.ps.argb32.xfail.png | Bin 0 -> 186 bytes + test/self-intersecting.ps.rgb24.xfail.png | Bin 0 -> 186 bytes + test/self-intersecting.rgb24.xfail.png | Bin 0 -> 282 bytes + test/self-intersecting.xlib.argb32.xfail.png | Bin 0 -> 235 bytes + test/self-intersecting.xlib.rgb24.xfail.png | Bin 0 -> 240 bytes + test/set-source.svg11.argb32.ref.png | Bin 104 -> 0 bytes + test/set-source.svg12.argb32.ref.png | Bin 104 -> 0 bytes + test/smask-fill.c | 2 +- + test/smask-fill.svg.ref.png | Bin 0 -> 1150 bytes + test/smask-fill.svg11.argb32.ref.png | Bin 1128 -> 0 bytes + test/smask-fill.svg11.ref.png | Bin 1166 -> 0 bytes + test/smask-fill.svg11.rgb24.ref.png | Bin 1128 -> 0 bytes + test/smask-fill.svg12.argb32.ref.png | Bin 1128 -> 0 bytes + test/smask-fill.svg12.ref.png | Bin 1166 -> 0 bytes + test/smask-fill.svg12.rgb24.ref.png | Bin 1128 -> 0 bytes + test/smask-fill.test-fallback.argb32.ref.png | Bin 1148 -> 0 bytes + test/smask-fill.test-fallback.rgb24.ref.png | Bin 1148 -> 0 bytes + test/smask-image-mask.c | 2 +- + test/smask-mask.c | 2 +- + test/smask-mask.pdf.xfail.png | Bin 0 -> 4401 bytes + test/smask-mask.svg.ref.png | Bin 0 -> 2376 bytes + test/smask-mask.svg11.ref.png | Bin 2529 -> 0 bytes + test/smask-mask.svg12.ref.png | Bin 2529 -> 0 bytes + test/smask-paint.c | 2 +- + test/smask-paint.pdf.xfail.png | Bin 0 -> 4513 bytes + test/smask-paint.svg.ref.png | Bin 0 -> 2453 bytes + test/smask-paint.svg11.ref.png | Bin 2612 -> 0 bytes + test/smask-paint.svg12.ref.png | Bin 2612 -> 0 bytes + test/smask-stroke.c | 2 +- + test/smask-stroke.pdf.xfail.png | Bin 0 -> 392 bytes + test/smask-text.c | 2 +- + test/smask-text.pdf.ref.png | Bin 0 -> 1874 bytes + test/smask-text.ref.png | Bin 1777 -> 1874 bytes + test/smask-text.svg.ref.png | Bin 0 -> 1794 bytes + test/smask-text.svg11.argb32.ref.png | Bin 1791 -> 0 bytes + test/smask-text.svg11.ref.png | Bin 1886 -> 0 bytes + test/smask-text.svg11.rgb24.ref.png | Bin 1791 -> 0 bytes + test/smask-text.svg12.argb32.ref.png | Bin 1791 -> 0 bytes + test/smask-text.svg12.ref.png | Bin 1886 -> 0 bytes + test/smask-text.svg12.rgb24.ref.png | Bin 1791 -> 0 bytes + test/smask.c | 2 +- + test/smask.pdf.xfail.png | Bin 0 -> 4393 bytes + test/smask.ref.png | Bin 3587 -> 3417 bytes + test/smask.svg.ref.png | Bin 0 -> 3458 bytes + test/smask.svg11.ref.png | Bin 3634 -> 0 bytes + test/smask.svg12.ref.png | Bin 3634 -> 0 bytes + test/source-clip-scale.svg.ref.png | Bin 0 -> 116 bytes + test/source-clip-scale.svg11.ref.png | Bin 119 -> 0 bytes + test/source-clip-scale.svg12.ref.png | Bin 119 -> 0 bytes + test/surface-pattern-big-scale-down.c | 2 +- + test/surface-pattern-big-scale-down.ref.png | Bin 226 -> 191 bytes + test/surface-pattern-scale-down.pdf.argb32.ref.png | Bin 1532 -> 0 bytes + test/surface-pattern-scale-down.pdf.ref.png | Bin 0 -> 1589 bytes + test/surface-pattern-scale-down.pdf.rgb24.ref.png | Bin 1532 -> 0 bytes + test/surface-pattern-scale-up.pdf.argb32.ref.png | Bin 3834 -> 0 bytes + test/surface-pattern-scale-up.pdf.ref.png | Bin 0 -> 2712 bytes + test/surface-pattern-scale-up.pdf.rgb24.ref.png | Bin 3834 -> 0 bytes + test/surface-pattern.pdf.ref.png | Bin 14800 -> 0 bytes + test/surface-pattern.pdf.xfail.png | Bin 0 -> 10528 bytes + test/surface-pattern.ps.xfail.png | Bin 0 -> 2188 bytes + test/surface-pattern.ps2.ref.png | Bin 2364 -> 0 bytes + test/surface-pattern.ps3.ref.png | Bin 2364 -> 0 bytes + test/surface-pattern.svg.ref.png | Bin 16069 -> 0 bytes + test/surface-pattern.svg.xfail.png | Bin 0 -> 16069 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 2334 -> 0 bytes + test/text-pattern.pdf.argb32.xfail.png | Bin 0 -> 1845 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 1915 -> 0 bytes + test/text-pattern.pdf.rgb24.xfail.png | Bin 0 -> 1599 bytes + test/text-pattern.svg.argb32.ref.png | Bin 0 -> 1745 bytes + test/text-pattern.svg.rgb24.ref.png | Bin 0 -> 1453 bytes + test/text-pattern.svg11.argb32.ref.png | Bin 1743 -> 0 bytes + test/text-pattern.svg11.rgb24.ref.png | Bin 1563 -> 0 bytes + test/text-pattern.svg12.argb32.ref.png | Bin 1743 -> 0 bytes + test/text-pattern.svg12.rgb24.ref.png | Bin 1563 -> 0 bytes + test/text-rotate.svg.ref.png | Bin 0 -> 17024 bytes + test/text-rotate.svg11.argb32.ref.png | Bin 16942 -> 0 bytes + test/text-rotate.svg11.ref.png | Bin 18301 -> 0 bytes + test/text-rotate.svg11.rgb24.ref.png | Bin 16942 -> 0 bytes + test/text-rotate.svg12.argb32.ref.png | Bin 16942 -> 0 bytes + test/text-rotate.svg12.ref.png | Bin 18301 -> 0 bytes + test/text-rotate.svg12.rgb24.ref.png | Bin 16942 -> 0 bytes + test/text-transform.svg.ref.png | Bin 0 -> 5682 bytes + test/text-transform.svg11.argb32.ref.png | Bin 5677 -> 0 bytes + test/text-transform.svg11.rgb24.ref.png | Bin 5677 -> 0 bytes + test/text-transform.svg12.argb32.ref.png | Bin 5677 -> 0 bytes + test/text-transform.svg12.rgb24.ref.png | Bin 5677 -> 0 bytes + test/trap-clip.pdf.argb32.ref.png | Bin 6746 -> 0 bytes + test/trap-clip.pdf.rgb24.ref.png | Bin 6616 -> 0 bytes + test/trap-clip.test-fallback.argb32.ref.png | Bin 5753 -> 0 bytes + test/trap-clip.test-fallback.rgb24.ref.png | Bin 5379 -> 0 bytes + test/twin.svg.ref.png | Bin 3027 -> 3040 bytes + test/unbounded-operator.c | 2 +- + test/unbounded-operator.svg12.argb32.xfail.png | Bin 0 -> 2767 bytes + test/unbounded-operator.svg12.rgb24.xfail.png | Bin 0 -> 1719 bytes + .../unbounded-operator.test-fallback.rgb24.ref.png | Bin 1306 -> 0 bytes + test/user-font-mask.svg.ref.png | Bin 0 -> 2030 bytes + test/user-font-mask.svg11.ref.png | Bin 2224 -> 0 bytes + test/user-font-proxy.svg.ref.png | Bin 0 -> 16817 bytes + test/user-font-proxy.svg11.argb32.ref.png | Bin 16836 -> 0 bytes + test/user-font-proxy.svg11.ref.png | Bin 17902 -> 0 bytes + test/user-font-proxy.svg11.rgb24.ref.png | Bin 16836 -> 0 bytes + test/user-font-proxy.svg12.argb32.ref.png | Bin 16836 -> 0 bytes + test/user-font-proxy.svg12.ref.png | Bin 17902 -> 0 bytes + test/user-font-proxy.svg12.rgb24.ref.png | Bin 16836 -> 0 bytes + test/user-font-proxy.test-fallback.argb32.ref.png | Bin 16835 -> 0 bytes + test/user-font-proxy.test-fallback.rgb24.ref.png | Bin 16835 -> 0 bytes + test/user-font-rescale.svg.ref.png | Bin 0 -> 14873 bytes + test/user-font-rescale.svg11.ref.png | Bin 15741 -> 0 bytes + test/user-font-rescale.svg12.ref.png | Bin 15741 -> 0 bytes + test/user-font.svg.ref.png | Bin 0 -> 6379 bytes + test/user-font.svg11.argb32.ref.png | Bin 6411 -> 0 bytes + test/user-font.svg11.ref.png | Bin 6134 -> 0 bytes + test/user-font.svg11.rgb24.ref.png | Bin 6411 -> 0 bytes + test/user-font.svg12.argb32.ref.png | Bin 6411 -> 0 bytes + test/user-font.svg12.ref.png | Bin 6134 -> 0 bytes + test/user-font.svg12.rgb24.ref.png | Bin 6411 -> 0 bytes + test/user-font.test-fallback.argb32.ref.png | Bin 5601 -> 0 bytes + test/user-font.test-fallback.rgb24.ref.png | Bin 5601 -> 0 bytes + 384 files changed, 438 insertions(+), 303 deletions(-) + +commit a81cf14bd6de545e9108f5c24c59e55026df86de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 13 10:58:44 2009 +0100 + + [test] Sanitise REFERENCE_IMAGES + + Add and delete files to satisfy 'make check-ref-missing'. + + test/Makefile.am | 6 ------ + test/fill-image.test-fallback.ref.png | Bin 1462 -> 0 bytes + test/fill-image.xlib.ref.png | Bin 1462 -> 0 bytes + test/group-unaligned.ref.png | Bin 0 -> 434 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 4011 -> 0 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 3910 -> 0 bytes + test/operator-clear.test-fallback.ref.png | Bin 1071 -> 0 bytes + test/operator-clear.xlib.ref.png | Bin 1071 -> 0 bytes + 8 files changed, 6 deletions(-) + +commit 7f3eda4e9f9e6cb6f3a33871ed42099c822d0ea2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 13 10:43:34 2009 +0100 + + [test] Update reference images for gs 8.64 + + test/Makefile.am | 7 +++++-- + test/README | 2 +- + test/close-path-current-point.ps.ref.png | Bin 0 -> 1490 bytes + test/extend-pad.ps.ref.png | Bin 0 -> 314 bytes + test/fill-image.ps.ref.png | Bin 0 -> 1799 bytes + test/test-fallback16-surface-source.ps.ref.png | Bin 0 -> 292 bytes + test/user-font-proxy.ps.ref.png | Bin 0 -> 7766 bytes + test/user-font-proxy.ps2.ref.png | Bin 8171 -> 0 bytes + test/user-font-proxy.ps3.ref.png | Bin 8171 -> 0 bytes + 9 files changed, 6 insertions(+), 3 deletions(-) + +commit 0d44416b9dd8149032039cf44ea14bf4867f3c54 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jul 12 19:21:28 2009 +0930 + + PDF: Don't round pattern y location to an integer + + Using cairo_surface_get_extents() to get page height does not work + when the page height is not an integer. + + http://lists.cairographics.org/archives/cairo/2009-July/017570.html + + src/cairo-pdf-surface.c | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +commit 9686331cb07a8f9018f28dc7d6d6e3726e289fda +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat May 2 18:05:20 2009 +0300 + + [spans] Round rasterization grid pixel areas instead of truncating. + + When converting a grid pixel area into the range [0,255] the + GRID_AREA_TO_ALPHA() macro would truncate extra bits off the result + rather than rounding. This could cause seams between abutting + collinear edges of separately rendered polygons even when the + coordinates of the abutting edges were the same. + + Reported by Soeren Sandmann on the cairo mailing list: + + http://lists.cairographics.org/archives/cairo/2009-May/017043.html + + src/cairo-tor-scan-converter.c | 4 ++-- + test/clip-operator.ref.png | Bin 8210 -> 8191 bytes + test/clip-operator.test-paginated.argb32.ref.png | Bin 8247 -> 8189 bytes + test/fill-degenerate-sort-order.ref.png | Bin 2406 -> 2399 bytes + test/fill-rule.ref.png | Bin 2061 -> 2065 bytes + test/finer-grained-fallbacks.ref.png | Bin 1069 -> 1070 bytes + test/linear-gradient.pdf.argb32.ref.png | Bin 1112 -> 0 bytes + test/linear-gradient.pdf.ref.png | Bin 935 -> 1125 bytes + test/linear-gradient.pdf.rgb24.ref.png | Bin 1112 -> 0 bytes + test/mask-alpha.ref.png | Bin 643 -> 632 bytes + test/mask.pdf.argb32.ref.png | Bin 9918 -> 9946 bytes + test/mask.ref.png | Bin 8581 -> 8603 bytes + test/operator-clear.ref.png | Bin 1084 -> 1070 bytes + test/operator-clear.test-fallback.ref.png | Bin 0 -> 1071 bytes + test/operator-clear.xlib.ref.png | Bin 0 -> 1071 bytes + test/operator-source.ref.png | Bin 4425 -> 4395 bytes + test/radial-gradient.pdf.argb32.ref.png | Bin 79601 -> 0 bytes + test/radial-gradient.pdf.ref.png | Bin 79490 -> 79612 bytes + test/radial-gradient.pdf.rgb24.ref.png | Bin 79601 -> 0 bytes + test/trap-clip.pdf.argb32.ref.png | Bin 6745 -> 6746 bytes + test/trap-clip.pdf.rgb24.ref.png | Bin 6621 -> 6616 bytes + test/trap-clip.ref.png | Bin 5829 -> 5820 bytes + test/trap-clip.test-paginated.argb32.ref.png | Bin 5865 -> 5898 bytes + 23 files changed, 2 insertions(+), 2 deletions(-) + +commit fbd88db938bf3bb03934795da9b3d184c4f43608 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 5 14:43:50 2009 +0100 + + [path] Don't include current-point in hash + + As we don't strictly use the current-point in comparing paths, exclude it + from the hash. Similarly use the path content flags as a cheap means to + differentiate contents. + + src/cairo-path-fixed.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 73f8019fd2afd0ad41c2515bef9877348355d246 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 5 14:37:02 2009 +0100 + + [path] Use cairo_list_t instead of open-coding its own + + Use the cairo_list_t and its style of iterators to improve the readability + of the cairo_path_buf_t management. Note the complications that arise from + the embedding of the initial buf -- however the macros do help make the + unusual manipulations more identifiable. + + src/cairo-path-fixed-private.h | 14 +-- + src/cairo-path-fixed.c | 226 +++++++++++++++++++---------------------- + src/cairo.c | 2 +- + 3 files changed, 114 insertions(+), 128 deletions(-) + +commit a04e3726648c62a1385b67cfc16a785a468e1d13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 5 09:21:47 2009 +0100 + + [path] Add path watch debugging + + Simple debug macro to print the path to stderr during construction. + + src/cairo-path-fixed-private.h | 9 +++++++++ + src/cairo-path-fixed.c | 26 ++++++++++++++++++++++++++ + 2 files changed, 35 insertions(+) + +commit 1645352bfb69cc6d43fcbf3c77b4da5693af322a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 5 09:09:42 2009 +0100 + + [path] Evaluate is_box && is_region during construction + + Whilst constructing the path, if the operations continue to be + axis-aligned lines, allow the is_box and is_region flags to persist. These + are set to false as soon as a curve-to is added, a diagonal or in the case + of is_region a non-integer point. + + src/cairo-path-fixed-private.h | 8 ++ + src/cairo-path-fixed.c | 286 +++++++++++++++-------------------------- + src/cairo.c | 2 + + src/cairoint.h | 3 - + 4 files changed, 115 insertions(+), 184 deletions(-) + +commit 4bb157672ef8cb7d486d6ccdaaa3890e3f45e17a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 23:44:09 2009 +0100 + + [test] Rename some structures within cairo-test-trace + + Simply rename a few structures so that their names are less confusing with + the mix of process and threads used to executes traces. + + test/cairo-test-trace.c | 224 ++++++++++++++++++++++++------------------------ + 1 file changed, 112 insertions(+), 112 deletions(-) + +commit 53a54827f7d8ca8500f3f9674edbd7e768e8a50d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 5 09:22:05 2009 +0100 + + [boilerplate] Add missing header file. + + Deleted so many, and forgot to add just this little one. Sigh. + + boilerplate/cairo-boilerplate-private.h | 49 +++++++++++++++++++++++++++++++++ + 1 file changed, 49 insertions(+) + +commit ee8c50f2d6f1dba41f829c715b7bc59b5eeda50d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 22:00:09 2009 +0100 + + Remove the defunct test-meta surface + + Replace the internal test-meta surface will the freshly exported, + real meta-surface. + + boilerplate/cairo-boilerplate-test-surfaces.c | 38 --- + boilerplate/cairo-boilerplate.c | 35 +++ + src/Makefile.sources | 2 - + src/test-meta-surface.c | 358 -------------------------- + src/test-meta-surface.h | 50 ---- + util/cairo-trace/trace.c | 49 ++-- + 6 files changed, 69 insertions(+), 463 deletions(-) + +commit 88cb69b10c66751f687c3745c8e9861b105de3a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 21:43:27 2009 +0100 + + [boilerpate] Move target definition to backends. + + By moving the backend target definition out of the massive amlagamated + block in cairo-boilerplate.c and into each of the + cairo-boilerplate-backend.c, we make it much easier to add new targets as + the information need only be entered in a single file and not scattered + across three. However, updating the target interface means trawling across + all the files -- except given that I found it difficult maintaining the + single massive array I do not see this as an increase in the maintenance + burden. + + boilerplate/.gitignore | 2 + + boilerplate/Makefile.am | 12 + + boilerplate/Makefile.sources | 27 +- + boilerplate/cairo-boilerplate-beos-private.h | 40 -- + boilerplate/cairo-boilerplate-beos.cpp | 48 +- + boilerplate/cairo-boilerplate-directfb-private.h | 26 - + boilerplate/cairo-boilerplate-directfb.c | 29 +- + boilerplate/cairo-boilerplate-glitz-agl.c | 31 +- + boilerplate/cairo-boilerplate-glitz-glx.c | 31 +- + boilerplate/cairo-boilerplate-glitz-private.h | 88 --- + boilerplate/cairo-boilerplate-glitz-wgl.c | 32 +- + boilerplate/cairo-boilerplate-pdf-private.h | 60 -- + boilerplate/cairo-boilerplate-pdf.c | 48 +- + boilerplate/cairo-boilerplate-ps-private.h | 71 --- + boilerplate/cairo-boilerplate-ps.c | 73 ++- + boilerplate/cairo-boilerplate-qt-private.h | 60 -- + boilerplate/cairo-boilerplate-qt.cpp | 29 +- + boilerplate/cairo-boilerplate-quartz-private.h | 44 -- + boilerplate/cairo-boilerplate-quartz.c | 29 +- + boilerplate/cairo-boilerplate-script-private.h | 57 -- + boilerplate/cairo-boilerplate-script.c | 28 +- + boilerplate/cairo-boilerplate-svg-private.h | 72 --- + boilerplate/cairo-boilerplate-svg.c | 70 ++- + .../cairo-boilerplate-test-surfaces-private.h | 99 ---- + boilerplate/cairo-boilerplate-test-surfaces.c | 117 +++- + boilerplate/cairo-boilerplate-win32-printing.c | 43 +- + boilerplate/cairo-boilerplate-win32-private.h | 65 --- + boilerplate/cairo-boilerplate-win32.c | 28 +- + boilerplate/cairo-boilerplate-xcb-private.h | 47 -- + boilerplate/cairo-boilerplate-xcb.c | 28 +- + boilerplate/cairo-boilerplate-xlib-private.h | 71 --- + boilerplate/cairo-boilerplate-xlib.c | 207 ++++--- + boilerplate/cairo-boilerplate.c | 639 +++------------------ + boilerplate/cairo-boilerplate.h | 3 +- + boilerplate/make-cairo-boilerplate-constructors.c | 156 +++++ + test/make-cairo-test-constructors.c | 28 +- + 36 files changed, 946 insertions(+), 1592 deletions(-) + +commit 8a10ab1c04298d6c22ae8aabec5d762141a8e98f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 18:46:21 2009 +0100 + + [script] Tidy dict construction for glyphs + + Replace dict with '<< ... >>' similar to surface definitions as it is + easier to read in scripts. + + src/cairo-script-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit fef3649953a3dcc3a17d9d5858f56690a8782501 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 18:32:57 2009 +0100 + + [script] Fix the trivial errors running the test suite + + A few typos crept in breaking the script output and various refreshes of + the expected results. + + src/cairo-script-surface.c | 33 +++++++++++++++++++++---------- + test/mime-data.script.ref.png | Bin 1982 -> 2041 bytes + test/scale-offset-image.c | 2 +- + test/scale-offset-similar.c | 2 +- + util/cairo-script/cairo-script-scanner.c | 6 ++++-- + 5 files changed, 29 insertions(+), 14 deletions(-) + +commit 2395bba1e66a2623cb288e13effc206f86e5e62e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 18:31:49 2009 +0100 + + [any2ppm] Choose a more appropriate format for the replay content + + Actually select a format that matches the request content when replaying + the script to an image. + + test/any2ppm.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 9942a89870f7754e28ff334010c4432553cf7d91 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 18:30:24 2009 +0100 + + [boilerplate] Read whole RGB lines at a time + + Rather than read+unpack each pixel, read in a whole RGB packed line and + unpack the whole line in a single pass. + + boilerplate/cairo-boilerplate.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 23648e2fdfefba4df08bc854d725758209998e1f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 00:40:32 2009 +0100 + + [script] Prototypical binary translator + + Hook into the scanner to write out binary version of the tokenized + objects -- note we bind executable names (i.e. check to see if is an + operator and substitute the name with an operator -- this breaks + overloading of operators by scripts). + + By converting scripts to a binary form, they are more compact and + execute faster: + + firefox-world-map.trace 526850146 bytes + bound.trace 275187755 bytes + + [ # ] backend test min(s) median(s) stddev. count + [ 0] null bound 34.481 34.741 0.68% 3/3 + [ 1] null firefox-world-map 89.635 89.716 0.19% 3/3 + [ 0] drm bound 79.304 79.350 0.61% 3/3 + [ 1] drm firefox-world-map 135.380 135.475 0.58% 3/3 + [ 0] image bound 95.819 96.258 2.85% 3/3 + [ 1] image firefox-world-map 156.889 156.935 1.36% 3/3 + [ 0] xlib bound 539.130 550.220 1.40% 3/3 + [ 1] xlib firefox-world-map 596.244 613.487 1.74% 3/3 + + This trace has a lot of complex paths and the use of binary floating point + reduces the file size by about 50%, with a commensurate reduction in scan + time and significant reduction in operator lookup overhead. Note that this + test is still IO/CPU bound on my i915 with its pitifully slow flash... + + util/cairo-script/Makefile.am | 5 +- + util/cairo-script/cairo-script-file.c | 44 +- + util/cairo-script/cairo-script-interpreter.c | 85 ++- + util/cairo-script/cairo-script-interpreter.h | 9 +- + util/cairo-script/cairo-script-objects.c | 8 +- + util/cairo-script/cairo-script-operators.c | 2 +- + util/cairo-script/cairo-script-private.h | 27 +- + util/cairo-script/cairo-script-scanner.c | 1059 ++++++++++++++++++-------- + 8 files changed, 906 insertions(+), 333 deletions(-) + +commit 07c0c8c5c0820e93403623eb5c1fa2df8ca89c60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 14:07:16 2009 +0100 + + [surface] Refactor meta-surface clone + + Whilst still obnoxious, at least moving it to a separate function is more + readable. + + src/cairo-surface.c | 140 +++++++++++++++++++++++++++++----------------------- + 1 file changed, 79 insertions(+), 61 deletions(-) + +commit 7903c80ee81777bab6eec408c10b2b59330b10f7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 13:50:15 2009 +0100 + + [meta] Cache replays when used as a pattern source + + Use the cow-snapshotting mechanism to store the meta surface replay (either + to an image inside acquire_source_image() or to a similar surface during + clone_similar()). + + Fixes Bug 17971 -- Extreme slowdown for manual convolutions in most + vector backends. + https://bugs.freedesktop.org/show_bug.cgi?id=17971 + + src/cairo-meta-surface.c | 18 ++++++++-- + src/cairo-surface.c | 92 ++++++++++++++++++++++++++++++++++++------------ + src/cairoint.h | 3 +- + 3 files changed, 88 insertions(+), 25 deletions(-) + +commit f353ba46a3b8c260f96588fd6bb8d07c2a09d01a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 13:49:35 2009 +0100 + + [meta] Copy extents on snapshotting. + + Need to copy across the extents as well when snapshotting. + + src/cairo-meta-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit f4019be7bdff5c67d679f4de1070c25aa99a993d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 13:16:42 2009 +0100 + + [trace] Remove a few transient pattern def/undef + + It is easier on the eye to use + '1 index set-source exch pop' + rather than + 'dup /p0 exch def p0 set-source /p0 undef' + (as patterns are expected to be temporary so we strive to avoid naming + them). + + util/cairo-trace/trace.c | 42 +++++++++++++++++++++++++++++++----------- + 1 file changed, 31 insertions(+), 11 deletions(-) + +commit dcb7f1d034438c5c890490df93a86b40fea3036c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 4 08:08:25 2009 +0100 + + [script] Add missing include <string.h> + + As reported by Magnus Boman <captain.magnus@gmail.com>. + + Fixes Bug 22610 -- Patch to add missing include in util/cairo-script/csi-replay.c + http://bugs.freedesktop.org/show_bug.cgi?id=22610 + + util/cairo-script/csi-replay.c | 1 + + 1 file changed, 1 insertion(+) + +commit 97bd2228a6635bbb0eac4ce95801754957dbb7ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 19:41:51 2009 +0100 + + [script] Insert spaces around '<<' and '>>' + + The dictionary constructors are just ordinary tokens so need space for + delimiters. + + src/cairo-script-surface.c | 62 ++++++++++++++++------------------------------ + 1 file changed, 21 insertions(+), 41 deletions(-) + +commit 6003ab77e1ebefadb97338de0e7da4a76d973b1a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 18:26:50 2009 +0100 + + Export meta-surface + + The meta-surface is a vital tool to record a trace of drawing commands + in-memory. As such it is used throughout cairo. + + The value of such a surface is immediately obvious and should be + applicable for many applications. The first such case is by + cairo-test-trace which wants to record the entire graph of drawing commands + that affect a surface in the event of a failure. + + NEWS | 27 +++++ + boilerplate/Makefile.win32.features | 8 ++ + boilerplate/cairo-boilerplate.c | 12 +-- + build/Makefile.win32.features-h | 1 + + build/configure.ac.features | 1 + + configure.ac | 4 + + perf/cairo-perf.c | 6 +- + src/Makefile.win32.features | 8 ++ + src/cairo-meta-surface-private.h | 14 +-- + src/cairo-meta-surface.c | 202 +++++++++++++++++++++++++++--------- + src/cairo-paginated-surface.c | 16 +-- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-script-surface.c | 10 +- + src/cairo-surface.c | 2 +- + src/cairo-svg-surface.c | 8 +- + src/cairo-type3-glyph-surface.c | 8 +- + src/cairo-types-private.h | 3 +- + src/cairo-user-font.c | 7 +- + src/cairo-win32-printing-surface.c | 2 +- + src/cairo.h | 22 +++- + src/test-meta-surface.c | 16 +-- + src/test-meta-surface.h | 8 +- + test/cairo-test-trace.c | 58 ++++------- + test/get-clip.c | 5 + + 25 files changed, 296 insertions(+), 156 deletions(-) + +commit 2a9903dbbfeb3fe843f0d618d15674b37a29f3a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 12:48:40 2009 +0100 + + [script] Trim some excess verbage + + Remove some redundant defining of surfaces and contexts and of setting + defaults. In order to reduce the number of defines, we need to operate on + the operand stack more frequently - though in practice those operations + are quite rare. + + src/Makefile.sources | 1 + + src/cairo-list-private.h | 189 +++++++++++++++ + src/cairo-script-surface.c | 561 ++++++++++++++++++++++++++++++--------------- + 3 files changed, 572 insertions(+), 179 deletions(-) + +commit 28773fe79f883c32ee4e55e49f5dc3fced00c4f6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 13:17:47 2009 +0100 + + [test-meta] Initialize image + + Oops, stupid mistake - missed off the initialization of the image to NULL + from the last commit. + + src/test-meta-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit ac6c3dbbaed377273b73da6e9e03bb8380a78ec4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 12:56:20 2009 +0100 + + [test-meta] Lazily allocate image + + Only allocate the image on first use, as we may never actually need to + construct the image output. + + src/test-meta-surface.c | 42 ++++++++++++++++++++++++------------------ + 1 file changed, 24 insertions(+), 18 deletions(-) + +commit fe73a9dd1413a851beeca7a0fc4ab7cb351ea9ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 3 11:24:42 2009 +0100 + + [test] Record trace to an in-memory meta-surface + + Requires hooking into test-meta-surface currently. Export meta-surface! + + The idea is that on detection of an error, we can reconstruct a minimal + trace from the meta-surface. The first step is to simply dump the trace + for the failing meta-surface. Later, we should automatically minimise + this further. + + src/test-meta-surface.c | 101 +++++++------ + src/test-meta-surface.h | 4 + + test/Makefile.am | 3 + + test/cairo-test-trace.c | 371 ++++++++++++++++++++++++++++++++++++++++++------ + 4 files changed, 397 insertions(+), 82 deletions(-) + +commit 633efe81873168506ec3594eae1f6ac38d71026c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 2 09:17:43 2009 +0100 + + [surface] Allocate temporary region on stack + + Avoid a very short-lived temporary heap allocation of a region. + + src/cairo-surface.c | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit b2e2a2f31af33ff01d78c6c8786249a623017ffa +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 15:47:51 2009 +0200 + + [test] Update argb32 pdf reference image for trap-clip + + test/trap-clip.pdf.argb32.ref.png | Bin 6720 -> 6745 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 910afc7a8e5c40f4fe682ec0b0f3836a07ea721d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 15:40:24 2009 +0200 + + [test] Mark all smask tests as XFAIL for pdf + + Those tests use linear gradients which are not correctly handled by + poppler yet. See https://bugs.freedesktop.org/show_bug.cgi?id=10942 + + test/README | 11 +++++++++++ + test/smask-fill.c | 2 +- + test/smask-image-mask.c | 2 +- + test/smask-mask.c | 2 +- + test/smask-paint.c | 2 +- + test/smask-stroke.c | 2 +- + test/smask-text.c | 2 +- + test/smask.c | 2 +- + 8 files changed, 18 insertions(+), 7 deletions(-) + +commit 5becfc2bd59956090daa8afd68db2f139dcb8392 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 14:58:40 2009 +0200 + + [test] Add pdf reference image for rotate-image-surface-paint + + Remove also argb32 and rgb24 pdf reference images. + + test/Makefile.am | 3 +-- + test/rotate-image-surface-paint.pdf.argb32.ref.png | Bin 215 -> 0 bytes + test/rotate-image-surface-paint.pdf.ref.png | Bin 0 -> 196 bytes + test/rotate-image-surface-paint.pdf.rgb24.ref.png | Bin 215 -> 0 bytes + 4 files changed, 1 insertion(+), 2 deletions(-) + +commit f81203cde864af1a1fea81a438e4f4effe928808 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 14:44:19 2009 +0200 + + [test] Add pdf reference image for mask-transformed-image + + test/Makefile.am | 1 + + test/mask-transformed-image.pdf.ref.png | Bin 0 -> 3528 bytes + 2 files changed, 1 insertion(+) + +commit 9d538ef337e9ca1600f842cd2164ff5e6629090a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 14:42:32 2009 +0200 + + [test] Update argb32 and rgb24 pdf reference image for mask + + test/mask.pdf.argb32.ref.png | Bin 9903 -> 9918 bytes + test/mask.pdf.rgb24.ref.png | Bin 8735 -> 8745 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 97def877bb1c290735875061118bd795b9b83215 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 14:18:30 2009 +0200 + + [test] Update pdf reference image for surface-pattern + + Remove also argb32 and rgb24 pdf reference images. + + test/Makefile.am | 2 -- + test/surface-pattern.pdf.argb32.ref.png | Bin 14808 -> 0 bytes + test/surface-pattern.pdf.ref.png | Bin 14791 -> 14800 bytes + test/surface-pattern.pdf.rgb24.ref.png | Bin 14808 -> 0 bytes + 4 files changed, 2 deletions(-) + +commit 8a6bdc63c1491dc77e8d9e192b9e44d9ff2e3c9b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 13:33:07 2009 +0200 + + [test] Update argb32 and rgb24 pdf reference image for text-pattern + + test/text-pattern.pdf.argb32.ref.png | Bin 2151 -> 2334 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 508 -> 1915 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit b46ba7aa33ba604628f1c94449019895b1d7ef82 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 13:25:39 2009 +0200 + + [test] Update pdf reference image for text-transform + + test/text-transform.pdf.ref.png | Bin 3796 -> 5586 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 9bc7ab980d6e834dacaf4f48f199e8c95cfba94e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 12:09:50 2009 +0200 + + [test] Update pdf reference image for filter-nearest-transformed + + Remove also argb32 and rgb24 pdf reference images. + + test/Makefile.am | 2 -- + test/filter-nearest-transformed.pdf.argb32.ref.png | Bin 488 -> 0 bytes + test/filter-nearest-transformed.pdf.ref.png | Bin 548 -> 552 bytes + test/filter-nearest-transformed.pdf.rgb24.ref.png | Bin 488 -> 0 bytes + 4 files changed, 2 deletions(-) + +commit 27938f7e3ff357e5fe8a05e547cf83dbad7551ef +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 12:04:06 2009 +0200 + + [test] Update pdf reference image for filter-nearest-offset + + Remove also argb32 and rgb24 pdf reference images. + + test/Makefile.am | 2 -- + test/filter-nearest-offset.pdf.argb32.ref.png | Bin 4295 -> 0 bytes + test/filter-nearest-offset.pdf.ref.png | Bin 4537 -> 997 bytes + test/filter-nearest-offset.pdf.rgb24.ref.png | Bin 4295 -> 0 bytes + 4 files changed, 2 deletions(-) + +commit e6576e8912196607fdd3613c6924e26c2ce7a951 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 11:56:18 2009 +0200 + + [test] Update argb32 pdf reference image for clip-operator + + test/clip-operator.pdf.argb32.ref.png | Bin 11604 -> 11603 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 13d9374ec13c62233312beb0feb9a47531aec2e3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 29 17:36:47 2009 +0200 + + [test] Remove PDF reference images for scale-source-surface-paint + + It works with current poppler now + + test/Makefile.am | 2 -- + test/scale-source-surface-paint.pdf.argb32.ref.png | Bin 182 -> 0 bytes + test/scale-source-surface-paint.pdf.rgb24.ref.png | Bin 198 -> 0 bytes + 3 files changed, 2 deletions(-) + +commit 3710c4184c2e87368dde5ccb25f3648b861b6059 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 29 17:32:54 2009 +0200 + + [test] Remove PDF reference images for paint-with-alpha + + It works with current poppler now + + test/Makefile.am | 1 - + test/paint-with-alpha.pdf.ref.png | Bin 466 -> 0 bytes + 2 files changed, 1 deletion(-) + +commit 8162acd81a898247f19054a136af95062e3b0e91 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 29 12:42:52 2009 +0200 + + [test] Remove PDF reference images for paint-source-alpha + + It works with current poppler now + + test/Makefile.am | 2 -- + test/paint-source-alpha.pdf.argb32.ref.png | Bin 471 -> 0 bytes + test/paint-source-alpha.pdf.ref.png | Bin 473 -> 0 bytes + 3 files changed, 2 deletions(-) + +commit 1e1f4fd0920cb2b0882137b4cc500dcbae42d2dc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 30 11:05:50 2009 +0200 + + [test] Use poppler_page_render with a transparent surface + + Instead of using an opaque surface filled in white, use a transparent + surface and fill it in white by using CAIRO_OPERATOR_DEST_OVER after + rendering. + + test/any2ppm.c | 9 +++++---- + test/pdf2png.c | 9 +++++---- + 2 files changed, 10 insertions(+), 8 deletions(-) + +commit 700a555d194a20c00df69b963cdc5b6153e162a4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 1 19:41:42 2009 +0100 + + [surface] Expose a SURFACE_TYPE_MISMATCH nil object + + Gah, yet more error object bloat. Must finish cairo-object. + + src/cairo-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8f4611a94bda407b5944520b95599441a4ff5327 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 1 19:39:57 2009 +0100 + + [perf] Fix use-after-free when retrieving error line number + + We find out the status on destroying the script and then attempt to query + the defunct script for more info about the error. Wrong. + + perf/cairo-perf-trace.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 7c160dea5456b783d9b04b5c11bbacb9a89fa031 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 1 10:12:50 2009 +0100 + + [perf] Unbreak cairo-perf-diff builder + + perf/cairo-perf-diff | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +commit 3d88f99668308315db759af3dac789973caa8eae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 1 09:57:56 2009 +0100 + + [perf] Enable cairo-perf-trace in cairo-perf-diff + + Only as a --trace option for now. + + perf/cairo-perf-diff | 51 ++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 36 insertions(+), 15 deletions(-) + +commit 1564d67d63618e12c58dc1d65c7e68505950e4d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 30 22:22:39 2009 +0100 + + [perf] Exclude the xlib-reference target from cairo-perf + + perf/cairo-perf-trace.c | 3 ++- + perf/cairo-perf.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit e5b4f78bff20903fef5f55a0fcd026590ea444a4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 30 22:12:50 2009 +0100 + + [boilerplate] Only include null-test-surface >= cairo-1.9.3 + + boilerplate/cairo-boilerplate-test-surfaces.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit e0bdbb437ee699d6f75df34494a6e290dc55aa39 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 30 22:04:01 2009 +0100 + + [xlib] Remove redundant checks for src_picture==None + + Before attempting to even set the attributes on the source Picture, we + ensure that it exists. So remove the redundant safe-guards to do nothing + if it doesn't exist. + + src/cairo-xlib-surface.c | 12 +----------- + 1 file changed, 1 insertion(+), 11 deletions(-) + +commit b7f68d3518e25fb02c9d36d14de9dc0c905ffe8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 30 20:46:12 2009 +0100 + + [perf] Enable trace directory recursion. + + I have an idea to categorise traces within their own subdirectories and so + for convenience added path walking to cairo-perf-trace. Principally this + should allow for forests of symlinks of all types. + + perf/cairo-perf-trace.c | 104 +++++++++++++++++++++++++++++++----------------- + perf/cairo-perf.h | 1 + + 2 files changed, 68 insertions(+), 37 deletions(-) + +commit 6102dd0c1c26e289ad08d1cf0cc366e6298f5711 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 29 10:50:44 2009 +0100 + + [ft] Correct reference counting for implementation font face + + We are expected to return a new reference from get_implementation(), and + failing to do so was causing use-after-frees (detected by the reference + counting checks). + + src/cairo-ft-font.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 4f745fbe3329a4fd5164c7bd7fe61c0395e8d1ee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 29 10:49:51 2009 +0100 + + [test] Only run fallback-resolution for enabled targets + + A secondary check that both activates CAIRO_TEST_TARGET and prevents a + NULL-deref with the null test surface. + + test/fallback-resolution.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit d80f5580ef371a1d4b1746b4ad54d97274d2d6cd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 21:11:41 2009 +0100 + + [pattern] Mark _cairo_pattern_nil as static + + Fixes check-def.sh failure. + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 758a18b354cefca841536c7d91f8f5758456f72f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 20:56:33 2009 +0100 + + [test] Timeout support for tests + + Enforce that each test must render within 60 seconds or be considered to + have hit an infinite loop and be reported as a CRASH. The timeout value is + adjustable via CAIRO_TEST_TIMEOUT -- a value of 0 will disable. + + build/configure.ac.system | 3 +++ + test/cairo-test.c | 18 ++++++++++++++++++ + test/cairo-test.h | 2 ++ + 3 files changed, 23 insertions(+) + +commit f7021d8f3e59d1f7fa77135366bbbd6845dff684 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 20:41:04 2009 +0100 + + [script] Enable error handling for recursive scanners + + It's conceivable that a script could execute another file and so we should + only setjmp on the first invocation. + + util/cairo-script/cairo-script-private.h | 1 + + util/cairo-script/cairo-script-scanner.c | 15 ++++++++++++--- + 2 files changed, 13 insertions(+), 3 deletions(-) + +commit 963664727b4754f92a876c36557922821706f591 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 10:49:37 2009 +0100 + + [trace] Compile fix for --enable-script + + Silly typo as pointed out by Hans Breuer <hans@breuer.org>. + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2ecafb025c8b15a86372b655e763d742a0f6ef85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 10:09:01 2009 +0100 + + [script] Reuse glyph advance cache over multiple invocations + + Store the metric cache as user-data on the scaled-font so that we can + retrieve it on future calls to show-glyphs and friends. + + util/cairo-script/cairo-script-operators.c | 413 +++++++++-------------------- + 1 file changed, 131 insertions(+), 282 deletions(-) + +commit 663da31bbe7cf6021c8d59a4d4ddd2702cfe860f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 01:17:13 2009 +0100 + + [boilerplate] Propagate original error from create_from_png() + + During cairo_boilerplate_get_image_surface_from_png() the original status + returned by cairo_image_surface_create_from_png() could have been masked + by inappropriate context construction when flattening or extracting. + Simply check after creating the surface from the png file, and return + immediately if in error. + + boilerplate/cairo-boilerplate.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2bbb69420289aa372512602db312611369e70f54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 00:57:10 2009 +0100 + + [test] Disable fallback16 testing + + Only use the RGB16_565 surface as a source during testing. We presume that + pixman is itself rigorously tested and the output is equivalent to the + image surface. Enabling this test surface would require too large of a + burden to maintain the reference images for the 16-bit backend. + + boilerplate/cairo-boilerplate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 34ac8673b2d51edeb0b29a4949d7d16c3d07a790 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 28 00:48:05 2009 +0100 + + [script] Use setjmp exception handling during scanning + + Save ~5% of overhead by using longjmp on error to terminate scanning + instead of propagating the error, incurring lots of redundant error + checks. + + util/cairo-script/cairo-script-interpreter.c | 14 +- + util/cairo-script/cairo-script-objects.c | 46 +--- + util/cairo-script/cairo-script-private.h | 51 ++-- + util/cairo-script/cairo-script-scanner.c | 390 +++++++++++++-------------- + 4 files changed, 221 insertions(+), 280 deletions(-) + +commit 2b1ec7a4d87399824dacb9803627c9322b12d894 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 22:48:19 2009 +0100 + + [cairo] Report true error via pattern from cairo_pop_group() + + Report the correct error via the returned pattern->status rather than + simply returning the NO_MEMORY nil object. + + src/cairo-pattern.c | 4 ++-- + src/cairo.c | 18 +++++++++++------- + src/cairoint.h | 4 +++- + 3 files changed, 16 insertions(+), 10 deletions(-) + +commit 5c3be3ece27b7cf6e4b1262ea18ac51b45c62389 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 22:40:15 2009 +0100 + + [cairo] Mark cr->status guard as unlikely + + For correct operation, the context should never be in error, so mark the + error context as being unlikely to optimize the common path. + + src/cairo.c | 199 +++++++++++++++++++++++++++++------------------------------- + 1 file changed, 97 insertions(+), 102 deletions(-) + +commit f3880283331f3bda374e24fd0e1de677d8d368a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 20:18:18 2009 +0100 + + [gstate] Avoid temporary allocation for transformed patterns + + Observe that patterns are not altered during an operation and so we are + safe to use the data from the original pattern without copying. (This is + enforced through the declaration that the backends operate on constant + patterns which are not allowed to be referenced or destroyed.) + + src/cairo-gstate.c | 184 ++++++++++++++++------------------------------------ + src/cairo-pattern.c | 31 +++++++++ + src/cairoint.h | 4 ++ + 3 files changed, 92 insertions(+), 127 deletions(-) + +commit 3759c7b34b662ccdc0486c68798aca0a6438ab7e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 19:38:30 2009 +0100 + + [perf] Enable the null-backend for trace replays. + + perf/cairo-perf-trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8d4c704129132effa10fb9242239952c2f4b7721 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 19:34:20 2009 +0100 + + [ft] Cache the resolved font face + + Keep the resolved font face alive whilst the default FcConfig remains + identical i.e. resolve the pattern again if the system configuration + changes (e.g. a new font is added or the rules are updated). This should + retain the benefits of lazily resolving font patterns whilst improving + performance by reducing the number of calls to FcFontMatch(). + + src/cairo-ft-font.c | 39 ++++++++++++++++++++++++++++++++++----- + 1 file changed, 34 insertions(+), 5 deletions(-) + +commit ddadd41a6c3d6a7cdaa07373b24325f59d3436e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 18:07:36 2009 +0100 + + [test] Remove broken PDF reference images for push-group + + More XFAIL reference images that are now invalidated by changes in + poppler. + + test/Makefile.am | 3 --- + test/push-group.pdf.argb32.ref.png | Bin 2722 -> 0 bytes + test/push-group.pdf.ref.png | Bin 2807 -> 0 bytes + test/push-group.pdf.rgb24.ref.png | Bin 2740 -> 0 bytes + 4 files changed, 3 deletions(-) + +commit 4d233fa4a6a16d400ba959f4c1c5d84fdd26d8fc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 18:04:37 2009 +0100 + + [test] Remove invalid smask PDF reference images + + These need to be recorded using an XFAIL reference. In the meantime, as + the poppler output has changed, just remove all the invalid PDF reference + images. + + test/Makefile.am | 19 ------------------- + test/smask-fill.pdf.argb32.ref.png | Bin 1909 -> 0 bytes + test/smask-fill.pdf.ref.png | Bin 1075 -> 0 bytes + test/smask-fill.pdf.rgb24.ref.png | Bin 1909 -> 0 bytes + test/smask-image-mask.pdf.argb32.ref.png | Bin 1651 -> 0 bytes + test/smask-image-mask.pdf.ref.png | Bin 421 -> 0 bytes + test/smask-image-mask.pdf.rgb24.ref.png | Bin 1651 -> 0 bytes + test/smask-mask.pdf.argb32.ref.png | Bin 4398 -> 0 bytes + test/smask-mask.pdf.ref.png | Bin 3731 -> 0 bytes + test/smask-mask.pdf.rgb24.ref.png | Bin 4398 -> 0 bytes + test/smask-paint.pdf.argb32.ref.png | Bin 4496 -> 0 bytes + test/smask-paint.pdf.ref.png | Bin 3800 -> 0 bytes + test/smask-paint.pdf.rgb24.ref.png | Bin 4496 -> 0 bytes + test/smask-stroke.pdf.argb32.ref.png | Bin 1417 -> 0 bytes + test/smask-stroke.pdf.ref.png | Bin 449 -> 0 bytes + test/smask-stroke.pdf.rgb24.ref.png | Bin 1417 -> 0 bytes + test/smask-text.pdf.ref.png | Bin 1806 -> 0 bytes + test/smask.pdf.argb32.ref.png | Bin 4496 -> 0 bytes + test/smask.pdf.ref.png | Bin 3800 -> 0 bytes + test/smask.pdf.rgb24.ref.png | Bin 4496 -> 0 bytes + 20 files changed, 19 deletions(-) + +commit 86624627e4b196a78cfd9bd642299441e838e0f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 17:53:18 2009 +0100 + + [test] Add group-unaligned + + Test case for: + Bug 22441 -- Unexpected shift with push_group and pop_group + https://bugs.freedesktop.org/show_bug.cgi?id=22441 + + This is a test that demonstrates the error in the pdf backend when using + groups on surfaces with non-integer sizes. In order to create such a + surface, we need to update the boilerplate to use doubles instead of + integers when specifying the surface size. + + boilerplate/cairo-boilerplate-beos-private.h | 16 +++--- + boilerplate/cairo-boilerplate-beos.cpp | 8 +-- + boilerplate/cairo-boilerplate-directfb-private.h | 8 +-- + boilerplate/cairo-boilerplate-directfb.c | 8 +-- + boilerplate/cairo-boilerplate-glitz-agl.c | 8 +-- + boilerplate/cairo-boilerplate-glitz-glx.c | 10 ++-- + boilerplate/cairo-boilerplate-glitz-private.h | 24 ++++----- + boilerplate/cairo-boilerplate-glitz-wgl.c | 8 +-- + boilerplate/cairo-boilerplate-pdf-private.h | 8 +-- + boilerplate/cairo-boilerplate-pdf.c | 14 ++--- + boilerplate/cairo-boilerplate-ps-private.h | 16 +++--- + boilerplate/cairo-boilerplate-ps.c | 30 +++++------ + boilerplate/cairo-boilerplate-qt-private.h | 10 ++-- + boilerplate/cairo-boilerplate-qt.cpp | 8 +-- + boilerplate/cairo-boilerplate-quartz-private.h | 8 +-- + boilerplate/cairo-boilerplate-quartz.c | 8 +-- + boilerplate/cairo-boilerplate-script-private.h | 8 +-- + boilerplate/cairo-boilerplate-script.c | 12 ++--- + boilerplate/cairo-boilerplate-svg-private.h | 16 +++--- + boilerplate/cairo-boilerplate-svg.c | 30 +++++------ + .../cairo-boilerplate-test-surfaces-private.h | 40 +++++++------- + boilerplate/cairo-boilerplate-test-surfaces.c | 40 +++++++------- + boilerplate/cairo-boilerplate-win32-printing.c | 8 +-- + boilerplate/cairo-boilerplate-win32-private.h | 16 +++--- + boilerplate/cairo-boilerplate-win32.c | 8 +-- + boilerplate/cairo-boilerplate-xcb-private.h | 8 +-- + boilerplate/cairo-boilerplate-xcb.c | 8 +-- + boilerplate/cairo-boilerplate-xlib-private.h | 24 ++++----- + boilerplate/cairo-boilerplate-xlib.c | 45 +++++++++------- + boilerplate/cairo-boilerplate.c | 10 ++-- + boilerplate/cairo-boilerplate.h | 8 +-- + test/Makefile.am | 7 +++ + test/Makefile.sources | 1 + + test/cairo-test.c | 2 +- + test/cairo-test.h | 4 +- + test/group-unaligned.c | 60 +++++++++++++++++++++ + test/group-unaligned.pdf.ref.png | Bin 0 -> 414 bytes + test/group-unaligned.ps.ref.png | Bin 0 -> 332 bytes + test/group-unaligned.svg.argb32.ref.png | Bin 0 -> 524 bytes + test/group-unaligned.svg.rgb24.ref.png | Bin 0 -> 434 bytes + test/group-unaligned.xlib-fallback.ref.png | Bin 0 -> 496 bytes + test/group-unaligned.xlib.ref.png | Bin 0 -> 466 bytes + 42 files changed, 312 insertions(+), 235 deletions(-) + +commit c506ddb58612c69b80b08be3a6d14c5bcc1ac21f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 27 16:54:37 2009 +0100 + + [pdf] Restore original surface size after emitting group mask + + A trivial fix to reset the original surface size after emitting the group. + The annoying aspect is that this should have been caught by the test suite. + Alas, no. A gentle reminder that simple line coverage is insufficient. :( + + src/cairo-pdf-surface.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit f8a2665840f12ae48798b0ffca49681e276823ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 26 07:22:49 2009 +0100 + + [cairo] Trivial code tidy + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c7cf5317f58b382c47ad2d1b4d8db3133b0c4d4b +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Jun 24 23:33:44 2009 +0100 + + [test] Fix Makefile.am for Solaris make. + + Sun's make doesn't like conditional assignments to variables + in dependencies in the form of "target: VAR+=VAL". This + construct was used to force the test suite run in the foreground + in the check-valgrind target. It is replaced by a more + explicit set of the CAIRO_TEST_MODE environment variable. + + test/Makefile.am | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit b82e7740c102afa7b9184b2556b887cf7a0211b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 21 22:25:08 2009 +0100 + + [atomic] Silence compiler warnings by defining an intptr_t + + Evaulate the integer sizes during configure to find one of the exact same + size as a void* to use in the conversion of the atomic ptr cmpxchg to an + atomic int cmpxchg. + + build/configure.ac.system | 3 +++ + src/cairo-atomic-private.h | 19 ++++++++++++------- + 2 files changed, 15 insertions(+), 7 deletions(-) + +commit a2d4fb50092c0cbb31a5df1bca9111957238139b +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Jun 21 14:09:10 2009 +0100 + + [test] Fix a typo in the _POSIX_SOURCE version number. + + I hope POSIX isn't around in 20000 AD! + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 80990c7f729a666fc646182a36ffd311d7396a1a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Jun 21 14:02:46 2009 +0100 + + [atomic] Use an integer __sync_val_compare_and_swap() for pointer CAS. + + Fix an implicit pointer/integer cast in _cairo_atomic_ptr_cmpxchg() + when building with LLVM/clang. + + The Intel synchronization primitives __sync_val_compare_and_swap() + are only defined by Intel for types int, long, long long and their + unsigned variants. This patch uses one of those for + _cairo_atomic_ptr_cmpxchg() instead of relying on a gcc extension of + __sync_val_compare_and_swap() to pointer types. + + src/cairo-atomic-private.h | 9 ++++++++- + src/cairo-atomic.c | 6 +++++- + 2 files changed, 13 insertions(+), 2 deletions(-) + +commit d0c1c9282164bffb76f7419873e93608dc6d9876 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 21 10:08:21 2009 +0100 + + [boilerplate] Implement a reference xlib surface + + Create an xlib target that uses a separate display, specified by + CAIRO_REFERENCE_DISPLAY, that can be used as a reference implementation + for the normal display. So this can be used by cairo-trace-test to create + a reference surface that mimics exactly the true surface, but if it + targets an Xvfb display will be entirely rendered in software. If + CAIRO_REFERENCE_DISPLAY is not set, the reference surface degrades into an + xlib-fallback surface which is a close approximation (but still has + behavioural differences). + + boilerplate/cairo-boilerplate-xlib-private.h | 11 ++++++ + boilerplate/cairo-boilerplate-xlib.c | 51 ++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 14 ++++++-- + 3 files changed, 74 insertions(+), 2 deletions(-) + +commit d2244053dcca687a878b1008e3a8219f11d7bd0d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 21 08:58:08 2009 +0100 + + [perf] Force rebuild if make fails + + The build system has a singular failure whereby if a backend disappears + between on compile and the next, automake will fail to reconstruct the + Makefiles - resulting in a broken build. Attempt to fix this by removing + the build dir and recloning, which should work for any corrupt caches but + obviously will fail again at a true build failure. + + perf/cairo-perf-diff | 63 ++++++++++++++++++++++++++++++---------------------- + 1 file changed, 37 insertions(+), 26 deletions(-) + +commit ef0d307d549b9cc7a98cdce2ee4bae40d0fd0bd1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 21 08:43:55 2009 +0100 + + [perf] Need to version surface types + + As cairo-perf-diff will execute the current cairo-perf against historical + revisions, any introduced api must be protect in order to compile on old + versions. + + perf/cairo-perf-trace.c | 8 ++++++++ + perf/cairo-perf.c | 6 ++++++ + 2 files changed, 14 insertions(+) + +commit 44b72ba6d7bdcc5f4e431af178bc7c22f13e88e0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 20 13:09:46 2009 +0100 + + [perf] Add a non-build mode to graph + + Add --show to cairo-perf-graph just to graph perf files that currently + exist and not build the missing cases. + + perf/cairo-perf-graph | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit d4dd6fcf3a4e0d7426657592ebb3d65a2ae0bc4a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 20 13:08:50 2009 +0100 + + [perf] Show speedup/slowdownn labels on graph + + Add labels show that it is clear which direction is faster on the graph. + + perf/cairo-perf-graph-widget.c | 166 +++++++++++++++++++++++++++++++++++++---- + 1 file changed, 153 insertions(+), 13 deletions(-) + +commit b71b6ecb59bf83605bb2bb10e3f8acd7dd950242 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 21:21:02 2009 +0100 + + [test] Fix the image compare + + Oh, it's a bad sign when I can't even correctly compare a bunch of pixels. + + test/cairo-test-trace.c | 101 +++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 86 insertions(+), 15 deletions(-) + +commit d544828934e479071fe5246fc0bdbbad33c097e8 +Author: M Joonas Pihlaja <rowan@sal.math.ualberta.ca> +Date: Sat Jun 20 06:16:51 2009 -0600 + + [build] Look for libpng.pc as well when configuring. + + The OpenBSD png package installs only libpng.pc and not + any of libpng{13,12,10}.pc. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5733d8d6c35e1a77513a49267a47f6caae68e829 +Author: M Joonas Pihlaja <rowan@sal.math.ualberta.ca> +Date: Sat Jun 20 06:11:44 2009 -0600 + + [build] Remove a level of quoting from CAIRO_PARSE_VERSION. + + The m4 that comes with OpenBSD gets confused by the extra quoting + applied to the version number argument when building the + bodies of the cairo_version_{major,minor,micro} macros using + m4_bpatsubst(). Since we're making sure that the argument is always + a number, we can safely use the unquoted \2 body rather than \[\2\]. + + acinclude.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3bad3efaa2fa00275c1d27c95ccbf1fcdfdfef3e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 19:09:03 2009 +0100 + + [test] Add cairo-test-trace to .gitignore + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 62dc0ae46c26652da9a76b851bab594020020115 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 19:03:17 2009 +0100 + + [cairo] Offset the current path when pushing/popping groups. + + We need to translate the path in order to compensate for the device offset + applied to the group surface when pushing and popping. (The path is + transformed to device space on creation, and so needs recomputing for the + new device.) + + src/cairo.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 851c8839622619779c9169299e3efccd108d0395 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 19:00:39 2009 +0100 + + [test] Add group-clip + + Larry Ewing found an ancient and nasty bug whereby a path was not + corrected whilst pushing and popping groups. + + AUTHORS | 1 + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/group-clip.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/group-clip.ref.png | Bin 0 -> 191 bytes + 5 files changed, 60 insertions(+) + +commit 0a34abace781976b92287dd07daa2b41e168c4f6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 18:40:43 2009 +0100 + + [test] Experiment with reference targets + + Specify another boilerplate target to use as the reference for this + target. We then use this in cairo-test-trace in preference to using the + image surface. Still not perfect, though the framework is improving. + + boilerplate/cairo-boilerplate.c | 254 ++++++++++++++++++++++------------------ + boilerplate/cairo-boilerplate.h | 5 + + test/Makefile.am | 6 +- + test/cairo-test-trace.c | 229 ++++++++++++++++++++++++++++++------ + 4 files changed, 341 insertions(+), 153 deletions(-) + +commit cec8579348fb39ca879285bebfb1ee65cbae502d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 16:09:26 2009 +0100 + + [xlib] Remove redundant code to query a xrender_format from a visual + + We always query an xrender_format for a Visual upon surface creation, so + checking again in create_similar() is redundant. (It also interferes with + disabling XRender...) + + src/cairo-xlib-surface.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit dd842a2bed1568000c9727fc35d4683db349e506 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 14:59:59 2009 +0100 + + [boilerplate] Missing static on pdf user data key. + + boilerplate/cairo-boilerplate-pdf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2da906f4764d5fe7cbb08ec238b01e2a03696899 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 19 18:44:23 2009 +0300 + + [script] Include unistd.h if we're twiddling file descriptors. + + Including sys/mman.h doesn't pull in unistd.h on Solaris 9 so + we have to include it explicitly. + + util/cairo-script/cairo-script-operators.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 1b6dbcbbebf18d6239fcc618f3389e9c0fc981f3 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 19 18:39:53 2009 +0300 + + [trace] Compile without fontconfig. + + Use CAIRO_HAS_FC_FONT to decide whether to export + cairo_ft_font_face_create_for_pattern() or not. + + util/cairo-trace/trace.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit d9b5a98a78b712a2ad64408fa47ba6aa34e29f1f +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 19 18:34:34 2009 +0300 + + [build] Require fontconfig >= 2.2.95 if we're using it at all. + + We require at least fontconfig 2.2.95 when we're using + fontconfig because we depend on the FcResultOutOfMemory + error code introduced in that version. + + configure.ac | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 84e587bbfad6586e41fac86c4d19005418115ac5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 14:41:39 2009 +0100 + + [trace] Prevent a child process from writing to the same file + + After opening a specific file or fd for ourselves, reset the + CAIRO_TRACE_FD to point to an invalid fd in order to prevent any child + processes (who inherit our environment) from attempting to trace cairo + calls. If we allow them to continue, then the two traces will intermix + and be unreplayable. + + util/cairo-trace/trace.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 18edea36ba6604e4cbdbda1ed56e6117b5768d94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 14:14:32 2009 +0100 + + [perf] Report line of error during trace + + Query the number of new lines processed so far and report that on hitting + an error. + + perf/cairo-perf-trace.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 55721d380d5a75a9448f522f9ad48cd18a6c2f65 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 14:13:34 2009 +0100 + + [script] Report line number + + Count the number of newlines processed in the trace and provide an API for + the user to query. + + util/cairo-script/cairo-script-interpreter.c | 6 ++++++ + util/cairo-script/cairo-script-interpreter.h | 3 +++ + util/cairo-script/cairo-script-private.h | 2 ++ + util/cairo-script/cairo-script-scanner.c | 12 +++++++++--- + 4 files changed, 20 insertions(+), 3 deletions(-) + +commit 030ef4ca0023166fcb82f0a0b1512eb31beb3385 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 11:56:14 2009 +0100 + + [trace] Change the threshold at which pixel data is immediately copied + + Embed the pixels for images less than 32*32 as this catches most icons + which are frequently uploaded, but is still an unlikely size for a + destination image surface. + + util/cairo-trace/trace.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit d3330d7beba0e0d2543e40a0e0e4d81ea9a78b45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 19 11:15:30 2009 +0100 + + [ft] Substitute twin if there are no fonts + + Fixes bug 22356 -- Spurious "out of memory" error on system without fonts + https://bugs.freedesktop.org/show_bug.cgi?id=22356 + + If FcFontMatch() fails, then it means that there are no fonts available on + the system (or it may have been a malloc error, we have no way of telling). + Instead of report NO_MEMORY and disabling all drawing, one of the + rationales for including a builtin font was so that we could continue even + in the face of this error and show *something* to the user. (This being a + last resort (and especially important for demos!) and hopefully easier to + diagnose than no output at all.) + + src/cairo-font-face-twin.c | 75 +++++++++++++++++++++++++++++++++++----------- + src/cairo-ft-font.c | 6 +++- + src/cairoint.h | 3 ++ + 3 files changed, 66 insertions(+), 18 deletions(-) + +commit 6d8b353658da1ad973e3bda9e89799a7467d8182 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 19 02:37:19 2009 +0300 + + [spans] Squash a compiler warning when creating error objects. + + Handle the new CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED status code + in the switch/case of the ..._create_in_error() functions for + creating span renderers or scan converters. + + src/cairo-spans.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7651227d3dfe4ebf40e95a72106957a9ec51dd3e +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jun 19 02:03:39 2009 +0300 + + Revert "[test] Make the xlib-fallback use the image refs." + + This reverts commit 903b39c30448d62e2cbf9d075c5256a333bd5d8f. + + The xlib-fallback actually renders mostly via traps at the moment, + so staying with xlib refs is the right thing to do. + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 729457b174cb19f4e0750486caed9582c5708930 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat May 2 23:30:02 2009 +0300 + + [test] Add trap rendered ref images for fill-image. + + The fill code path for the xlib and fallback surfaces use trapezoids + rather than spans, so there's lots of differences due to antialising + differences at the edge of the fill. This patch adds a ref image + for the xlib and test-fallback surfaces. + + test/fill-image.test-fallback.ref.png | Bin 0 -> 1462 bytes + test/fill-image.xlib.ref.png | Bin 0 -> 1462 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 8e7f667abb94262b63b4fd589f5ee06cb8974aaf +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat May 2 19:09:27 2009 +0300 + + [test] Mark scale-offset tests as XFAIL for image, xlib-fallback. + + The scale-offset tests trigger a loss-of-precision bug when + converting double matrices from cairo to pixman format. + + http://lists.cairographics.org/archives/cairo/2008-November/015671.html + + test/Makefile.am | 2 ++ + test/scale-offset-image.c | 2 +- + test/scale-offset-similar.c | 2 +- + 3 files changed, 4 insertions(+), 2 deletions(-) + +commit c12533b1358c9e5c1c3440efca4dc44ba2de9f6d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 17:46:14 2009 +0100 + + [pattern] Add _cairo_pattern_fini_snapshot + + Symmetric operation to _cairo_pattern_init_snapshot() this exists simply + to break the circular reference between the meta-surface and snapshot-cow. + + src/cairo-meta-surface.c | 24 ++++++++++++------------ + src/cairo-pattern.c | 17 +++++++++++++++++ + src/cairoint.h | 3 +++ + 3 files changed, 32 insertions(+), 12 deletions(-) + +commit 2213c447373b600c1583b2edd24775c5c031231c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 17:14:53 2009 +0100 + + [svg] Break circular snapshot reference by explicit finish + + The svg backend snapshots the meta surface which because of snapshot-cow + creates a circular reference back to the creator. So in order to break the + circular reference when we have finished with the snapshot, we need to + call cairo_surface_finish() in addition to simply destroying the surface. + + src/cairo-svg-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit cd9eef1aad87558d3f2d47cfcfa2f5b9b254692c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 16:42:56 2009 +0100 + + [scaled-font] Check the MRU font before resolving the implementor + + This should hide most of the overhead of resolving a frequently used toy font. + + src/cairo-scaled-font.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +commit 5ad64dfda26f97f243f13e9b766567a30fda67a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 16:39:02 2009 +0100 + + [test] Add the sha1sum of the required fonts + + (Note, I think these are currently out-of-date... But it will serve as a + useful reminder to verify and update them in future.) + + test/README | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 3063f0f44c61869bc6bb07d46bf881f1558ac015 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 16:33:12 2009 +0100 + + [scaled-font-subset] Check for matching font-face implementors + + Catch toy and user fonts which may have different font-faces for their + implementation than the original ones they were created with. + + src/cairo-scaled-font-subsets.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 6e78c94615e407d72d4778d5558dc218e0402cbc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 16:30:41 2009 +0100 + + [test] Move calls to the getters from out of the innermost loops. + + Tidy the code slightly by removing excess and unsightly calls to + cairo_test_get_context() and cairo_get_scaled_font(). + + test/show-glyphs-many.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 3da32e35afa57533379c3de35459f23aef7c3d04 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 15:31:27 2009 +0100 + + [analysis] Restore nops for the analysis null surface + + Joonas reported that adding the extra routines to the null-surface as used + by the analysis surface broke user-fonts. So create a separate null + backend to be exported via the test-null surface. + + src/cairo-analysis-surface.c | 57 ++-------------- + src/test-null-surface.c | 157 ++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 161 insertions(+), 53 deletions(-) + +commit c0e01d9cd71bd958e1b31a03cea4c08a1bdf4926 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 18 14:32:53 2009 +0100 + + [xlib] Improve GC caching efficacy + + Shrink the overall size of the per-screen GC cache, but allow multiple GCs + per depth, as it quite common to need up to two temporary GCs along some + drawing paths. Decrease the number of GCs we obtain in total by returning + clean (i.e. a GC without a clip set) back to the screen pool after use. + Compensate for the increased number of put/get by performing the query + using atomic operations where available. So overall we see a dramatic + reduction on the numbers of XCreateGC and XFreeGC, of even greater benefit + for RENDER-less servers. + + src/cairo-xlib-private.h | 11 +-- + src/cairo-xlib-screen.c | 200 +++++++++++++++++++++++++++++++++++------------ + src/cairo-xlib-surface.c | 58 +++++++++----- + 3 files changed, 197 insertions(+), 72 deletions(-) + +commit 7f238f542441cc5912d14e5c6f9c49ffd0b83fad +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Jun 18 17:13:13 2009 -0400 + + Use the scanline rasterizer in the win32 backend. + + Brings http://people.mozilla.com/~jmuizelaar/world-map.html from 8fps to 13fps + in Vista on a Mac Mini + + src/cairo-win32-surface.c | 146 +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 144 insertions(+), 2 deletions(-) + +commit d066154e62d6b4ecad15e0eef431aa2f4a56fecb +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jun 16 15:55:53 2009 -0400 + + Factor out _cairo_image_surface_span_render_row() + + This allows other backends use the same function for rendering rows. + More specifically, I intend to use this with the win32-backend. + + src/cairo-image-surface.c | 36 +++++++++++++++++++++++------------- + src/cairoint.h | 6 ++++++ + 2 files changed, 29 insertions(+), 13 deletions(-) + +commit fd142d0a6e21c492624ca8bc5019d89b0d7c5457 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jun 18 16:14:50 2009 +0100 + + [shave] Robuster usage of the test shell built-in. + + Solaris 9 confuses shave, resulting in an empty variable. + This patch papers over the resulting build failure from + the test shell built-in being called with an empty argument + which was unquoted. + + build/shave.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9ecee571c12e4d1645d9db2929280c9b35b1aad4 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jun 18 16:09:31 2009 +0100 + + [test/build] Don't test Freetype font stuff without Fontconfig. + + Most Freetype hitting tests require Fontconfig to find + them some fonts. + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 742b1ad4b069653a99fc6bd4510f2b6abb6abf95 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 24 23:41:28 2009 +0100 + + [test] Fix checking of the fenv.h include. + + This adds a configure check for fenv.h and makes + invalid-matrix.c check for it with HAVE_FENV_H instead + of HAVE_FEDISABLEEXCEPT -- turns out Solaris doesn't + have fedisableexcept(), but it does have feclearexcept(). + + The same issue appears on OSX and was fixed in + ab86662ab499e1f29c0f8c4248771e730c281e3f. This patch + adds some configure magic. + + build/configure.ac.system | 2 +- + test/invalid-matrix.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 75f1d11d93236b19d06515b8ed2baf612b0767ab +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 24 21:28:04 2009 +0300 + + [test] Fallback to HUGE_VAL in place of INFINITY in invalid-matrix.c. + + GCC 3.4.3 on OpenSolaris does not recognise INFINITY. Use HUGE_VAL + instead for every compiler instead of just MSVC. + + test/invalid-matrix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d1994d1ac292cbc896cffd24094ddfa5f2b1e8a9 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 24 23:46:13 2009 +0300 + + [test/any2ppm] Daemonize without BSD's daemon(). + + Solaris libc doesn't provide daemon() so implement + any2ppm daemon's detaching without it. + + test/Makefile.am | 2 +- + test/any2ppm.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 58 insertions(+), 6 deletions(-) + +commit aafff0b9528952fbbe9d04a70bf8c76ee701743f +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 24 23:50:03 2009 +0300 + + [boilerplate] Check for connect() in libsocket. + + Solaris requires -lsocket to be able to talk to + the any2ppm daemon over unix domain sockets. + + boilerplate/Makefile.am | 2 ++ + build/configure.ac.system | 4 ++++ + 2 files changed, 6 insertions(+) + +commit c4c06931690226e12622a957bbb6d652134f78b0 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 24 16:14:33 2009 +0300 + + [test] Make test constructors without perl. + + Remove the dependency on perl when building the test suite + by replacing the script which makes cairo-test-constructors.c + with a C program. + + test/.gitignore | 1 + + test/Makefile.am | 9 ++- + test/Makefile.win32 | 7 +- + test/make-cairo-test-constructors.c | 153 +++++++++++++++++++++++++++++++++++ + test/make-cairo-test-constructors.pl | 18 ----- + 5 files changed, 165 insertions(+), 23 deletions(-) + +commit cdd27a8d4cc3486867cff4ce81bb4e064eb74d58 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun May 24 16:19:31 2009 +0300 + + [test] Never use gcc __attribute__ magic for constructors. + + The configure test for __attribute__((constructor)) succeeds when + compiling with Sun Studio 12 on OpenSolaris but the attribute + is just ignored and has no actual effect. This causes the test + suite to not run any tests at all. With this patch we revert to + always using make-cairo-test-constructors.pl. + + build/configure.ac.system | 10 ---------- + test/Makefile.am | 7 ++----- + test/cairo-test-private.h | 2 -- + test/cairo-test-runner.c | 2 -- + test/cairo-test.h | 14 -------------- + 5 files changed, 2 insertions(+), 33 deletions(-) + +commit 46eb56a99f72b364e3eabe46f9b2995ed0696bd3 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jun 18 16:42:53 2009 +0300 + + [cairo-surface] Handle the all clipped out case for regions. + + Explicitly handle a region clip which represents that the + entire surface is clipped out by passing in a temporary + empty region to the backend set_clip_region() method. + Previously the passed in region may have been NULL even + when clip->all_clipped = TRUE. + + Fixes a bug tickled by the clip-all test case which was + brought to light by 394e139213e8f6692115c4c24818bfeb5e6d456a. + + src/cairo-surface.c | 34 +++++++++++++++++++++++++++++++--- + 1 file changed, 31 insertions(+), 3 deletions(-) + +commit 002264d572841f06930869a6c87fa2c987346dd6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 17 17:15:26 2009 +0100 + + [clip] Missing {} (coding style) + + Carl spotted that I'd slipped in a little CODING_STYLE violation. + + src/cairo-clip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit bc87074185592eae367b6c091241957b94202fda +Author: Nis Martensen <nis.martensen@web.de> +Date: Tue Jun 16 23:27:20 2009 +0200 + + [path] Fix missing implicit move-to + + When cairo_curve_to happens to start a new subpath (e.g., after a call + to cairo_new_sub_path()), it also needs to update the last_move_point. + Otherwise the new current point after a close_path() will be at an + unexpected position. + + Therefore, call _cairo_path_fixed_move_to() explicitly. + + AUTHORS | 1 + + src/cairo-path-fixed.c | 6 +++--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 3c5e57e694d1a8a0a48a66e0d61d8257c23a780e +Author: Nis Martensen <nis.martensen@web.de> +Date: Tue Jun 16 23:38:50 2009 +0200 + + [test] Verify current point position after subpath closure + + Make sure cairo_close_path always takes the current point where it + should be. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/close-path-current-point.c | 95 ++++++++++++++++++++++++++++++++++ + test/close-path-current-point.ref.png | Bin 0 -> 1916 bytes + 4 files changed, 97 insertions(+) + +commit 394e139213e8f6692115c4c24818bfeb5e6d456a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 17 14:46:53 2009 +0100 + + [clip] During _clip() limit the extracted traps to the current clip extents + + By applying a tight _cairo_traps_limit() we can reduce the amount of work + we need to do when tessellating the path and extracting the trapezoids. + + src/cairo-clip.c | 39 +++++++++++++++++++++++++++++++++++---- + 1 file changed, 35 insertions(+), 4 deletions(-) + +commit 650b85ec7721fb1302284e3ca4b7f4b72358abed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 17 14:19:19 2009 +0100 + + [clip] Avoid copying region within _cairo_clip_intersect_region() + + Within _cairo_clip_intersect_region() we can simply assign the freshly + extracted traps-region if we previously had no region set. + + src/cairo-clip.c | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +commit 4bc89e224f74f24272c97dec93d70f0c4dd1963c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 16 15:13:46 2009 +0100 + + [NEWS] Add release notes from 1.8.8 + + NEWS | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 68 insertions(+), 1 deletion(-) + +commit 116c93cb7fe8ad55457c53b4652e8d3117581158 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 16 11:36:36 2009 +0100 + + [cairo] Remove instance of 'return free()' + + Gah! This is a GCC-ism, so therefore it has to go. + + src/cairo.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 22587f57bd5d1b4440d936cd4655a7e8fcebdf36 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sun Jun 14 20:43:05 2009 +0100 + + Import Qt backend by Mozilla + + Written by Vladimir Vukicevic to enable integration with Qt embedded + devices, this backend allows cairo code to target QPainter, and use + it as a source for other cairo backends. + + This imports the sources from mozilla-central: + http://mxr.mozilla.org/mozilla-central/find?text=&kind=text&string=cairo-qpainter + renames them from cairo-qpainter to cairo-qt, and integrates the patch + by Oleg Romashin: + https://bugs.freedesktop.org/attachment.cgi?id=18953 + + And then attempts to restore 'make check' to full functionality. + + However: + - C++ does not play well with the PLT symbol hiding, and leaks into the + global namespace. 'make check' fails at check-plt.sh + + - Qt embeds a GUI into QApplication which it requires to construct any + QPainter drawable, i.e. used by the boilerplate to create a cairo-qt + surface, and this leaks fonts (cairo-ft-fonts no less) causing assertion + failures that all cairo objects are accounted for upon destruction. + + [Updated by Chris Wilson] + Acked-by: Jeff Muizelaar <jeff@infidigm.net> + Acked-by: Carl Worth <cworth@cworth.org> + + boilerplate/Makefile.sources | 3 + + boilerplate/Makefile.win32.features | 10 + + boilerplate/cairo-boilerplate-qt-private.h | 60 + + boilerplate/cairo-boilerplate-qt.cpp | 90 ++ + boilerplate/cairo-boilerplate.c | 23 + + boilerplate/cairo-boilerplate.h | 3 + + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 + + build/configure.ac.features | 1 + + configure.ac | 11 + + perf/cairo-perf-trace.c | 1 + + perf/cairo-perf.c | 3 +- + src/Makefile.am | 2 +- + src/Makefile.sources | 3 + + src/Makefile.win32.features | 14 + + src/cairo-debug.c | 42 + + src/cairo-qt-surface.cpp | 1876 ++++++++++++++++++++++++++++ + src/cairo-qt.h | 89 ++ + src/cairo-xlib-surface.c | 6 + + src/cairo.h | 4 +- + src/check-def.sh | 7 +- + src/check-preprocessor-syntax.sh | 3 +- + 22 files changed, 2247 insertions(+), 8 deletions(-) + +commit 7d3881114add18d5934073d0b04755d343ea38c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 15 15:13:43 2009 +0100 + + [perf] Report errors during replays + + perf/cairo-perf-trace.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 061e0477e9a894241806eeacbde2f3770b751f34 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 15 15:10:50 2009 +0100 + + [perf] Report iteration count + + Show number of discard results by showing the number of statistically + valid samples out of total population count. + + perf/cairo-perf-trace.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit bab8af62e772844f08a244d99f705e318af3f58c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 15 15:01:34 2009 +0100 + + [region] Add PLT entry for cairo_region_create_rectangles() + + src/cairo-region.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 6da9c410d4696ebba0fb563a858f1625bf3b1f9e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 15 12:14:51 2009 +0100 + + Missing header file for cairo-test-null-surface. + + src/test-null-surface.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + +commit e5727e20f52eb0308a8ad1c44a6eb4c7c65d7ff0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 15 11:58:58 2009 +0100 + + Expose _cairo_null_surface_create() via a test surface + + Using a null surface is a convenient method to measure the overhead of the + performance testing framework, so export it although as a test-surface so + that it will only be available in development builds and not pollute + distributed libraries. + + .../cairo-boilerplate-test-surfaces-private.h | 10 ++++ + boilerplate/cairo-boilerplate-test-surfaces.c | 16 +++++++ + boilerplate/cairo-boilerplate.c | 9 ++++ + perf/cairo-perf-trace.c | 6 +-- + src/Makefile.sources | 2 + + src/cairo-analysis-surface.c | 56 ++++++++++++++++++++-- + src/test-null-surface.c | 48 +++++++++++++++++++ + test/cairo-test.c | 14 ++++-- + util/cairo-trace/trace.c | 26 ++++++++++ + 9 files changed, 175 insertions(+), 12 deletions(-) + +commit f2057061c67236a79c8bb69b84e44e151109629a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 14 09:10:08 2009 +0100 + + [trace] Add sticky bit to (system-wide) trace output dir + + Need to allow user programs to dump their traces into the common output + directory, when using /etc/ld.so.preload to capture traces for the entire + desktop. + + util/cairo-trace/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3fe50a77ea21bcddb701a8640b5ecad9f6f5ab01 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 22:27:17 2009 +0100 + + [configure] Rephrase warning message for disabling core features. + + "strictly recommended" is an odd phrase and though the stern warning is + appropriate as replacing a system library with a more limited version is + likely to cause mayhem, we are but mere servants and should be reserved in + our parlance. + + build/configure.ac.features | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5d57aeaa23566739ba01a0fac1c3b90ce27b28cd +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Tue May 26 17:53:37 2009 -0400 + + Reinstate cairo_region_create_rectangles() + + cairo_region_union_rectangle() is linear in the number of rectangles + in the region. There is no way to make it significantly faster without + losing the ability to return errors synchronously, so a + cairo_region_create_rectangles() is needed to avoid a large + performance regression. + + src/cairo-region.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-traps.c | 47 ++++++++++++++++++++++++++++------------------- + src/cairo.h | 4 ++++ + src/cairoint.h | 1 + + 4 files changed, 77 insertions(+), 19 deletions(-) + +commit 216a2e24c7375e48677ce30f9fe8fb3d8bbdd10d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 21:40:05 2009 +0100 + + [test] Minor tweak to cairo-test-trace + + Cleanse the code of a couple of redundant pointer manipulations. + + test/cairo-test-trace.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 2ab4245c866bcefb755a33f7eaa6ef1277f82df1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 21:33:09 2009 +0100 + + [test] Need SOURCE when copying image data + + As cairo-test-trace does not clear the image data before reuse, using + the default OVER operator will cause differing results for each process + when inadvertently alpha blending into the shared memory region. As we + essentially want to just copy the source pixels, be explicit and set the + SOURCE operator. + + test/cairo-test-trace.c | 1 + + 1 file changed, 1 insertion(+) + +commit e003d665fe45905606a792e4a783f65fc7e84550 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 19:18:11 2009 +0100 + + [test] Disable compilation of cairo-test-trace without shm_open() + + Remember to only add cairo-test-trace to the list of EXTRA_PROGRAM so long + as we can actually compile it. + + test/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c092136fe9e5fee71dfe02f945fe5676f43b2d05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 18:59:17 2009 +0100 + + [configure] Check for shm_open() + + As needed for cairo-test-trace. + + build/configure.ac.system | 8 ++++++++ + test/Makefile.am | 4 +++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit f298dd92ca0b789a3d2b591753c992e1673b2d87 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 18:49:16 2009 +0100 + + [test] Remove dlmalloc + + cairo-test-trace's shared memory allocation pattern is much simpler than + anticipated as it allocates a bunch of images and then frees them all, + and so only needs a simple linear allocator. + + test/Makefile.am | 1 - + test/cairo-test-trace.c | 62 +- + test/dlmalloc.c | 5099 ----------------------------------------------- + 3 files changed, 11 insertions(+), 5151 deletions(-) + +commit 37f32f29518bdc1428c7ec137f212313e377486c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 18:31:35 2009 +0100 + + [util] Disable default build of font-view + + It's only a demonstration utility after a all and we do not need to incur + the cost of relinking it everytime we modify the main library. + + util/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0eca1b17b14057ef88ae2df500679e62ffb50118 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 17:16:20 2009 +0100 + + [surface] Give ownership of the snapshot to the snapshotter. + + Previously the reference to the newly created snapshot was owned by the + containing pattern. The consequence of this was that when the pattern was + destroyed the snapshot was cleaned up which prevent reuse of the snapshot + across multiple pages. Transferring ownership upon attachment of the + snapshot to the target means that the snapshot stays in existence until + the target itself is destroyed or modified *and* the containing pattern + is consumed. Obvious in hindsight. + + src/cairo-surface.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit a1b3392e60b6b4ff4b650f4d48d56568c1851245 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 16:37:43 2009 +0100 + + [surface] Mark cairo_surface_show_page() with begin-modification + + cairo_surface_show_page() clears the surface after presentation, so we + need to discard the snapshots here. + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1798bdd322e0d25147195198bf0c5e9506c61a15 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jun 13 22:47:41 2009 +0930 + + Fix PDF pattern embedding + + The PDF snapshot cow patch was reusing a previously emitted surface + pattern if the surface unique id matched the current surface. This + resulted in incorrect output as the new pattern may have a different + pattern matrix. + + This patch fixes the PDF backend to always emit a new pattern but + re-use previously emitted image or metasurface XObjects. + + src/cairo-pdf-surface-private.h | 21 +- + src/cairo-pdf-surface.c | 532 +++++++++++++++++++++++++++------------- + 2 files changed, 372 insertions(+), 181 deletions(-) + +commit f115c5479ead934774fea99d74d780e2bb1681c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 15:49:15 2009 +0100 + + [trace] Strip absolute path off name when profiling + + Carl spotted this last night, but I misinterpreted it as an old problem + caused by the application changing its working directory before its first + cairo call - thus causing cairo-trace to attempt to open a file in the new + directory. Instead the problem was attempting to trace an executable with + an absolute path, where we just tagged it with a .lzma extentsion and + attempted to pipe the output there. Obviously this fails for the user + profiling system binaries. So use basename to strip the leading path. + + util/cairo-trace/cairo-trace.in | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit c52eed6680dd13f6bc65dc4a26b6c8eab5a94a54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 15:42:43 2009 +0100 + + [trace] Handle wrapping python + + python lazily loads libcairo.so and so it is not available via RTLD_NEXT, + and we need to dlopen cairo ourselves. Similarly the linker is not able to + resolve any naked function references and so we need to ensure that all of + our own calls into the library are wrapped with DLCALL. + + util/cairo-trace/trace.c | 145 +++++++++++++++++++++++++++-------------------- + 1 file changed, 83 insertions(+), 62 deletions(-) + +commit 606790a86083d31fa50ed5e0cf621eca56c16e33 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 14:07:22 2009 +0100 + + [script] Disable compilation of examples + + Now that cairo-perf-trace exists and is a far superior replay tool, use + EXTRA_PROGRAM for the original replay tools. + + util/cairo-script/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 31b7652e1fa2ab2bd9e9df7f5517b7d678faf6aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 12:19:51 2009 +0100 + + [test] Never, ever, blame a crashing test on external factors. + + test/cairo-test-runner.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3dde883b779b81b95f420039c02b51b029311f78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 10:13:20 2009 +0100 + + [test] Code review after sleep + + Review cairo-test-trace.c and rewrite parts to ease understanding and fix + various bugs - such as failure to notice the slaves crashing and not + releasing our shared memory after an interrupt. + + test/cairo-test-trace.c | 400 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 236 insertions(+), 164 deletions(-) + +commit 1f542965f0310aed493651b8ddc1e98a4192b977 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 13 08:24:22 2009 +0100 + + [perf] Mention cairo-perf-compare-backends in the README + + perf/README | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 3b6e4018c69f88135f8d937724acf90adb003bad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 22:19:56 2009 +0100 + + [test] Add cairo-test-trace + + The basic premise is that we feed the trace to multiple backends in + parallel and compare the output at the end of each context (based on + the premise that contexts demarcate expose events, or their logical + equivalents) with that of the image[1] backend. Each backend is + executed in a separate process, for robustness, with the image data + residing in shared memory and synchronising over a socket. + + [1] Should be reference implementation, currently the image backend is + considered to be the reference for all other backends. + + test/Makefile.am | 16 +- + test/cairo-test-trace.c | 1225 ++++++++++++ + test/dlmalloc.c | 5099 +++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 6339 insertions(+), 1 deletion(-) + +commit a41e1275d28317c88e29b7f142cfc835673c01f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 12:32:51 2009 +0100 + + [boilerplate] Make array of targets const. + + Protect the boilerplate targets from unexpected modifications. + + boilerplate/cairo-boilerplate.c | 8 ++++---- + boilerplate/cairo-boilerplate.h | 4 ++-- + perf/cairo-perf-trace.c | 6 +++--- + perf/cairo-perf.c | 4 ++-- + perf/cairo-perf.h | 4 ++-- + test/cairo-test.h | 2 +- + 6 files changed, 14 insertions(+), 14 deletions(-) + +commit 6aebde6598c629d667b06e20111106832d139c4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 12:25:22 2009 +0100 + + [boilerplate] Export cairo_boilerplate_get_image_target() + + A routine to scan the compiled list of targets and return the entry + corresponding to the image backend. + + boilerplate/cairo-boilerplate.c | 17 +++++++++++++++++ + boilerplate/cairo-boilerplate.h | 3 +++ + 2 files changed, 20 insertions(+) + +commit d008167b9bcd6a24199740183bbfcabcfdccdd63 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 12 12:08:22 2009 -0700 + + Makefile: Fix two typos preventing doc-publish from working + + It seems that everything up to this point in release-publish + worked fine, so with these fixes, hopefully the next run of + make release-publish will work without any snags. + + build/Makefile.am.releasing | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 98eb84cfbbf2cfdb0153c8e924099cef016a412a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 12 12:07:59 2009 -0700 + + Increment version to 1.9.3 after the 1.9.2 snapshot. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9b9d2a7c17ca4b2bc2991fdc4893aed850578db +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 11 15:28:59 2009 -0700 + + Update version to 1.9.2 + + In preparation for the (long overdue) 1.9.2 snapshot today. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8ac8c5b428d11b11ba9fb55264cd9091368f6acb +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 12 11:49:52 2009 -0700 + + NEWS: Fix date and name of 1.9.2 snapshot + + It's a snapshot, not a release, and the broken REFERENCE_IMAGE list + derailed me from finishing yesterday. + + NEWS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3f474555dd00b8585ae3db848cf46984d77bd16e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 11:19:50 2009 +0100 + + [test] Add jp2.jp2 to EXTRA_DIST + + Required by test/mime-data and so triggering failures during distcheck as + it was not packaged. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 7f114b781f5c530d57530e5f76402e41cdabac6b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 11:15:16 2009 +0100 + + [doc] Workaround read-only tree during make distcheck + + This looks to be an ugly necessity to work-around the nasty issue that + we currently gtkdoc expect to be run inside the source tree. I'm sure + Behdad will be able to resolve this much more elegantly than this quick + and fragile attempt. + + build/Makefile.am.gtk-doc | 11 ++++++----- + build/configure.ac.features | 2 +- + doc/public/Makefile.am | 5 +++-- + 3 files changed, 10 insertions(+), 8 deletions(-) + +commit 1498c9c333d7579231ac44a91f00f0a49360702d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 07:38:00 2009 +0100 + + [script] Also mmap backing storage for the pattern descriptions + + These can be reasonably large and persist for long times due to the + font holdover caches, so manually swap them out to save space on tiny + swapless machines. + + util/cairo-script/cairo-script-operators.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 80ba06803b50cc0f76039939f25372cbbe2e8d81 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 12 08:03:12 2009 +0100 + + [Makefile] Update list of reference images. + + test/Makefile.am | 1432 +++++++++++++++++++++++++++++++----------------------- + 1 file changed, 818 insertions(+), 614 deletions(-) + +commit fb21a0da8730823ff092f8e298af3d5b4e8c90e4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 11 15:28:02 2009 -0700 + + Update CLEANFILES for 'make distcheck' + + This is a standard part of the release ritual. + + test/Makefile.am | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit a4f023ef2eb041fecba5f3fd2d5a1594975ca211 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 11 14:51:14 2009 -0700 + + NEWS: Update date for snapshot planned for today. + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 82139b42919be1acf6bade733bb2ff489e50812d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 11 14:51:10 2009 -0700 + + NEWS: Explain bovine polaroids a bit more. + + It's a fun joke, but the COW snapshots feature is important enough + that we should actually tell users what it is. + + NEWS | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 4d5f66d5b1f243e58d43dc89568be9240262fd5c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 11 14:42:11 2009 -0700 + + NEWS: Cleanup in preparation for 1.9.2 snapshot + + Mostly just wrapping to a reasonable line length, and some minor + wording changes. + + NEWS | 71 +++++++++++++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 45 insertions(+), 26 deletions(-) + +commit 19630f4b73a4fdfb9855ececd6614493e68d3b95 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 10 17:39:48 2009 -0700 + + Make the warning about the need to --enable-gtk-doc more explicit. + + I must have read it three times and kept thinking, "but I *did* + just install gtk-doc", before I finally understood what it was + trying to tell me. + + build/Makefile.am.gtk-doc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3aaea453b0f0880d6c8825be21e67821732d1635 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 22:36:01 2009 +0100 + + [script] Store fonts inside mmaped files. + + As an aide to tiny swapless systems write the rarely used bytes that + define type42 fonts into a deleted file and mmap them back into our + address space. + + build/configure.ac.system | 3 + + util/cairo-script/cairo-script-operators.c | 91 ++++++++++++++++++++++++------ + 2 files changed, 78 insertions(+), 16 deletions(-) + +commit 6167f27adfd530bdf091a0e7a3e0141d5db66f00 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 22:33:00 2009 +0100 + + [script] Fix memleak of duplicated strings from files + + csi_string_new() duplicated the bytes which was not what was desired, so + implement a csi_string_new_for_bytes() to take ownership and prevent the + leak that was occuring, for example, every time we create a new font face. + + util/cairo-script/cairo-script-file.c | 5 +++-- + util/cairo-script/cairo-script-objects.c | 27 +++++++++++++++++++++++++++ + util/cairo-script/cairo-script-private.h | 6 ++++++ + 3 files changed, 36 insertions(+), 2 deletions(-) + +commit 13b56c42bfdb9ad36f9b1bd22f83d7ef3a074ddc +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Jun 11 17:32:23 2009 -0400 + + Fix compilation on OS X when compiling for 64 bit + + OS X doesn't support ATSUI in 64 bit so don't include the cairo ATSUI + API in that case. + + src/cairo-quartz-font.c | 3 ++- + src/cairo-quartz.h | 2 ++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 9e3019ef987f8d3ad424c13ffae5a15b08beb327 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 22:27:18 2009 +0100 + + [perf] Add libcairoperf.la to DEPENDENCIES + + It seems adding the explicit dependencies to encourage it to rebuild + components from other parts of the source tree removed the automagic + dependency of libcairoperf.la. So add it to the list. Maybe this is not + the correct solution, but it works again for now. + + perf/Makefile.am | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 55cbf525479cde8251cc9199f9db89e510d6a9c1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 15:40:27 2009 +0100 + + [perf] Fix -i getopt parsing. + + Gah, I presumed that the ':' separated options that required arguments + from stand-alone options. I was wrong. The ':' indicates that the + preceding option takes an argument. So add it back to -i. + + perf/cairo-perf-trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 614bfdc0846856653a742b035e70d009b0a716cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 15:35:05 2009 +0100 + + [xcb] Trivial compile fix. + + Update show_glyphs() interface. + + src/cairo-xcb-surface.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit f7dbdf1fd1d7cc14491a9419c316b078247e145e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 09:39:20 2009 +0100 + + [script] Hide pixman-ops when copying pixels + + Seeing unexpected time inside pixman composite is quite disturbing when + trying to track down the apparent slowness in some benchmarks. Remove one + source of this artefact by simply memcpy'ing pixel data when trivial. + + util/cairo-script/cairo-script-operators.c | 70 +++++++++++++++++++++++------- + 1 file changed, 55 insertions(+), 15 deletions(-) + +commit ecee5663bf900ab97d2bb7ec41ade838f167e1cd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 01:05:28 2009 +0100 + + [perf] Fixup compare-backends to work with just a single test. + + perf/cairo-perf-compare-backends.c | 17 ++++++----------- + 1 file changed, 6 insertions(+), 11 deletions(-) + +commit 42c0aee1d9ff5e0182c41ed505a2b0f56e564cbb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 12:58:05 2009 +0100 + + [perf] Add a -x to exclude traces from a benchmark. + + Read names of traces to exclude from a file specified using -x on the + commandline, i.e. + $ ./cairo-perf-trace -x cairo-traces/tiny.exclude + + This is a convenient method for me to exclude certain traces for + particular machines. For example tiny cannot run + firefox-36-20090609.trace as that has a greater working set than the + available RAM on tiny. + + perf/cairo-perf-trace.c | 135 +++++++++++++++++++++++++++++++++++++++++++++--- + perf/cairo-perf.h | 2 + + 2 files changed, 130 insertions(+), 7 deletions(-) + +commit b40ce402ada8d57c5093715be530df08459d1654 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 11 09:16:29 2009 +0100 + + [NEWS] Add more notes + + NEWS | 50 ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 44 insertions(+), 6 deletions(-) + +commit 610da573e91810c53305b6bfe02eb7b714e3d08e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 10 12:59:36 2009 +0100 + + [win32-font] Non-fatal error from GetGlyphOutlineW(GGO_METRICS) + + If GetGlyphOutlineW(GGO_METRICS) fails to retreive the metrics for the + specified glyph it returns GDI_ERROR. Like ft, do not interpret this as a + fatal error but just mark the glyph as empty. + + Fixes http://bugs.freedesktop.org/show_bug.cgi?id=20255 + Bug 20255 -- cairo_scaled_font_glyph_extents breaks with invalid glyph id + + src/cairo-win32-font.c | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +commit 81b5dc42b0e754d602506a8ccd231df9afd71593 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 10 08:49:39 2009 +0100 + + [perf] Expand the section on cairo-perf-trace in the README + + Promote the information on how to use cairo-perf-trace and include it + immediately after the details on cairo-perf. This should make it much + clearer on how to replay the traces, and the difference between the two + benchmarks. + + perf/README | 37 ++++++++++++++++++++++++++++++++++--- + 1 file changed, 34 insertions(+), 3 deletions(-) + +commit ec92e633edd377747155b60aa225b266c38bc498 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 10 08:34:57 2009 +0100 + + [perf] Couple cairo-perf-traces into make perf + + Rather than complicating cairo-perf to extend it to perform both micro- + and macro-benchmarks, simply run the two binaries in succession during + make perf. + + For bonus points, consider whether we should hook cairo-perf-trace into + cairo-perf-diff. + + perf/Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 0db946cdd9fe601a060b62c5df7df3022ea5e2d6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 9 16:19:36 2009 +0100 + + [perf] Add explicit dependences for the local libraries + + Update the build rules and add the dependences for the libraries built in + other parts of cairo. + + perf/Makefile.am | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 844c809698635cf44658fcbfb5da6976890185b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 9 12:45:53 2009 +0100 + + [boilerplate] Print out known targets on error. + + Improve the 'Cannot find target ...' error message for an incorrect + CAIRO_TEST_TARGET by actually listing the targets that have been compiled + into the test suite. + + boilerplate/cairo-boilerplate.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit ac563715506b911f142dd0e4460a6effee45119d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 23:58:56 2009 +0100 + + [test] Exercise overlapping glyphs + + Quite an expensive test that converts an image into a distorted array of + glyphs, using a perspective transformation taking the intensity of the + pixel as depth. This generates a pretty picture and many overlapping + glyphs. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/mask-glyphs.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++ + test/mask-glyphs.ref.png | Bin 0 -> 1189352 bytes + 4 files changed, 177 insertions(+) + +commit 015df191ba947e714285145c3a4ead198ba0d07e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 17:40:16 2009 +0100 + + [trace] Prevent overflowing the operand stack when recreating objects + + Objects like cairo_scaled_font_t may return a reference to a previously + defined scaled-font instead of creating a new token each time. This caused + cairo-trace to overflow its operand stack by pushing a new instance of the + old token every time. Modify the tracer such that a font token can only + appear once on the stack -- for font-faces we remove the old operand and + for scaled-fonts we simply pop, chosen to reflect expected usage. + + util/cairo-trace/trace.c | 89 ++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 63 insertions(+), 26 deletions(-) + +commit 09492288b33c36093e50d39e4e7e632ab659a0e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 17:38:14 2009 +0100 + + [trace] Option to re-enable mark-dirty + + Applications such as swfdec have a strictly correct use of mark-dirty and + so we need an option to re-enable mark-dirty tracing in conjunction with + --profile. + + util/cairo-trace/cairo-trace.in | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 39bac6edddb8913d07fb25f14f088967ca846a78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 11:52:56 2009 +0100 + + [perf] Mention cairo-perf-trace early on in the README + + perf/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 34ccaeae2d3cf1b5bdd8b97581d6e70324494356 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 8 00:12:28 2009 +0100 + + [perf] Continuously update the summary for traces + + perf/cairo-perf-trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 055e9b0eb650bec6ae8297e5a36f1cac22c43d56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 7 23:35:57 2009 +0100 + + [test] Cache resolved scaled-font + + The intention is to stress test the solid pattern caches, so we can cheat + and avoid repeatedly resolving the toy font. + + test/solid-pattern-cache-stress.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 25c37509396a89deb644cbd6ada99137ba9d3095 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 7 19:23:04 2009 +0100 + + [scaled-font] Report the original-font-face + + When queried with cairo_scaled_font_get_font_face() return the original + font-face which matches the one supplied by the user, rather than the + implementation derived face. + + Fixes test/font-face-get-type. + + src/cairo-scaled-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6d693f6bd7c629372cfb6c284ca98dc04619bfe9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 7 18:59:36 2009 +0100 + + [ft] Support font_face->get_implementation + + The lazy resolution of patterns was defeating the scaled_font cache as + ft-fonts that resolved to the same unscaled font were being given different + font-faces upon creation. We can keep the lazy resolution by simply asking + the ft backend to create a fully resolved ft-font-face when we need to + create a scaled-font. This font is then keyed by the resolved font-face + and so will match all future lazily resolved identical patterns. + + src/cairo-ft-font.c | 117 ++++++++++++++++++++-------------------------- + src/cairo-scaled-font.c | 20 +++++--- + src/cairo-toy-font-face.c | 41 +++++++++------- + src/cairoint.h | 9 ++-- + 4 files changed, 96 insertions(+), 91 deletions(-) + +commit a29426f4bffc0a3f5bb349a2ba44203394339ae8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 7 17:24:40 2009 +0100 + + [ft] Assert that we create an unscaled font for the resolved pattern + + src/cairo-ft-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7d8a0a1cdd62112ccdae2a80bb55ec9cec99b978 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 7 17:01:57 2009 +0100 + + [cairo] Keep a small stash of cairo contexts + + A cairo context is meant to be extremely cheap to create such that it can + be used in transient expose events. Thus these are allocated reasonably + frequently and show up malloc profiles. + + src/cairo.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 49 insertions(+), 2 deletions(-) + +commit f08fe5b550d53c93b73c6295f8a85a8dcd4a1f4a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 7 15:55:20 2009 +0100 + + [trace] Redirect stdout to /dev/null when compressing + + Otherwise we mix in stdout in with the trace and prevent replay. + + util/cairo-trace/cairo-trace.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 750c1b5b48dcd33ba4a4d5290c50f564bf45bc58 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 21:45:18 2009 +0100 + + [configure] Check for FcInit() + + configure.ac | 2 +- + test/cairo-test.c | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit f7a562a590493904cf10b4fb9af3b42fb3f8a3a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 14:58:46 2009 +0100 + + [configure] Don't attempt to build GTK+ utilities on system without GTK+ + + configure.ac | 3 ++- + util/Makefile.am | 5 ++++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 6a5957475139a7c80a6bb55fb63927e5ec8866f6 +Author: Eric Anholt <eric@anholt.net> +Date: Sun Jun 7 10:43:43 2009 +0000 + + [gl] consolidate the pixman format to GL format/type/internalformat code. + + This means that draw_image gets all the love that the pattern texture code + does. Not that I'm sure it still needs to exist. + + src/cairo-gl-surface.c | 321 ++++++++++++++++++++++++------------------------- + 1 file changed, 158 insertions(+), 163 deletions(-) + +commit cb1e5674cd7a61a2d96bd4ae8895b26686571e78 +Author: Eric Anholt <eric@anholt.net> +Date: Sun Jun 7 10:09:28 2009 +0000 + + [gl] Add support for more 16-bit image formats. + + Fixes test-fallback16-surface-source + + src/cairo-gl-surface.c | 54 ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 48 insertions(+), 6 deletions(-) + +commit 7a95b2745ae619f6ca4631f3cdb03e12203126f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 21:36:08 2009 +0100 + + [boilerplate] Minor typo in win32-printing + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 16eb160c7794ad34c17c5b12ec586d956baf9831 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 20:09:15 2009 +0100 + + [script] Enable compilation without fontconfig + + Some insane people actually try compiling cairo with freetype and without + fontconfig... + + util/cairo-script/cairo-script-operators.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit d753ba96aba4dbbcbd0da1823be8824ba233f079 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 5 17:59:38 2009 +0100 + + [script] Manage used entries within hash tables + + Apply the patch from Karl Tomlinson, + https://bugs.freedesktop.org/attachment.cgi?id=19802, to repack the hash + table if the number of free slots falls too low. + + util/cairo-script/cairo-script-hash.c | 109 ++++++++++++++++++++----------- + util/cairo-script/cairo-script-private.h | 1 + + 2 files changed, 73 insertions(+), 37 deletions(-) + +commit 4ccfd474a36f482adcab49a8d38742121817b47e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 13:32:21 2009 +0100 + + [perf] Switch to using clock_gettime() + + Try using clock_gettime() for a high resolution stable time source in + preference to the potentially unstable TSC. + + build/configure.ac.system | 9 ++++-- + perf/cairo-perf-posix.c | 72 ++++++++++++++++++++++++++++++++++------------- + 2 files changed, 60 insertions(+), 21 deletions(-) + +commit 867c88ae90e4e69a556c032fa67d94a292f5d817 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 12:59:39 2009 +0100 + + [script] Add a finish method to the interpreter + + When using fonts circular references are established between the holdover + font caches and the interpreter which need manual intervention via + cairo_script_interpreter_finish() to break. + + perf/cairo-perf-trace.c | 3 +- + util/cairo-script/cairo-script-interpreter.c | 51 ++++++++++++++++++++++------ + util/cairo-script/cairo-script-interpreter.h | 3 ++ + util/cairo-script/cairo-script-objects.c | 35 ++++++++++++------- + util/cairo-script/cairo-script-private.h | 3 ++ + 5 files changed, 70 insertions(+), 25 deletions(-) + +commit 098822d7ee7f14096dd269c1bc96e39da126622c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 6 10:35:19 2009 +0100 + + [script] Fix erroneous error return when rendering type3 glyphs + + Only return a USER_FONT_ERROR if an error occurs whilst rendering the + glyph! + + util/cairo-script/cairo-script-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 24e51dd2ee04884e1f6f9f527b6675ad5f883ee2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 5 18:34:29 2009 +0100 + + [atomic] Hide compiler warnings + + Add uint variants of _cairo_atomic_int_*() to hide the compiler warnings + about sign conversions. + + src/cairo-atomic-private.h | 3 +++ + src/cairo-surface.c | 6 +++--- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 4ae5e2d44555a7219eb76ee187a8f588606c112f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 5 18:29:40 2009 +0100 + + [atomic] Provide mutex-based ptr cmpxchg + + To handle those CPUs where we do not have an atomic cmpxchg. + + src/cairo-atomic-private.h | 3 +++ + src/cairo-atomic.c | 13 +++++++++++++ + 2 files changed, 16 insertions(+) + +commit a1d0a06b6275cac3974be84919993e187394fe43 +Author: Thomas Jaeger <ThJaeger@gmail.com> +Date: Thu Feb 19 12:02:41 2009 -0500 + + xlib, xcb: Hand off EXTEND_PAD/EXTEND_REFLECT to Render + + Most drivers and the X server used to have incorrect RepeatPad/RepeatReflect + implementations, forcing cairo to fall back to client-side software rendering, + which is painfully slow due to pixmaps being transfered over the wire. These + issues are mostly fixed in the drivers (with the exception of radeonhd, whose + developers didn't respond) and the RepeatPad software fallback is implemented + correctly as of pixman-0.15.0, so this patch will hand off composite operations + with EXTEND_PAD/EXTEND_REFLECT source patterns to XRender. + + There is no way to detect whether the X server or the drivers use a + broken Render implementation, we make a guess based on the server + version: It's probably safe to assume that 1.7 X servers will use + fixed drivers and a recent enough version of pixman. + + AUTHORS | 1 + + src/cairo-xcb-surface.c | 15 +++++++++++++-- + src/cairo-xlib-display.c | 15 +++++++++++---- + src/cairo-xlib-private.h | 1 + + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 21 ++++++++++++++++++--- + 6 files changed, 45 insertions(+), 9 deletions(-) + +commit 60aefd0d634c531353c92b77b36424b142efeb93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 5 07:30:13 2009 +0100 + + [configure] Bump pixman dependency. + + Reflect was only fixed in the 0.15 series, so require at least that + version of pixman so we can that advantage of that and drop our + workaround. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9d7a7e76b8bccc2517950976bb8557cd7b955a11 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 4 22:19:31 2009 +0100 + + [scaled-font] Close race from 16d128 + + Whilst waiting for the fontmap lock on destruction another thread may not + only have resurrected the font but also destroyed it acquired the lock + first and inserted into the holdovers before the first thread resumes. So + check that the font is not already in the holdovers array before + inserting. + + src/cairo-scaled-font-private.h | 6 +++--- + src/cairo-scaled-font.c | 33 +++++++++++++++++++++++---------- + 2 files changed, 26 insertions(+), 13 deletions(-) + +commit f4d9a4482fa1bfa37783ca139e3716c8d8649f32 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 4 14:13:06 2009 +0100 + + [pattern] Generalise the freed pattern pool + + Also cache recently freed surface and gradient patterns. With thanks to + Jonathan Morton for the inspiration and initial pointer pool code for + pixman. + + src/cairo-atomic-private.h | 1 + + src/cairo-mutex-list-private.h | 1 - + src/cairo-pattern.c | 170 +++++++++++++++++++++++++++-------------- + 3 files changed, 112 insertions(+), 60 deletions(-) + +commit 132f44dce1884c9beed8c5e6588140ee8fa9cfbe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 4 14:12:20 2009 +0100 + + valgrindify init/fini routines + + Annotate object init/fini routines to detect use-after-free for + on-stack/embedded objects. + + src/cairo-debug.c | 2 -- + src/cairo-freelist.c | 7 ------- + src/cairo-gstate.c | 7 +++++++ + src/cairo-path-fixed.c | 10 +++------- + src/cairo-pattern.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-pen.c | 8 ++++++-- + src/cairo-polygon.c | 4 ++++ + src/cairo-region.c | 5 +++++ + src/cairo-stroke-style.c | 6 ++++++ + src/cairo-traps.c | 4 ++++ + src/cairo.c | 1 + + src/cairoint.h | 4 ++++ + 12 files changed, 88 insertions(+), 19 deletions(-) + +commit e89828c5331579d0d4019b6339df09ba1e2aa32e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 21:52:02 2009 +0100 + + [freelist] valgrindify freed blocks + + Mark freed blocks as unaccessible upon free() and then as undefined + on alloc(). + + src/cairo-freelist.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit 4e11d56f8e5f409ea2476315c9d67116b213b738 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 4 11:16:48 2009 +0100 + + [perf] Update trace summary after each iteration + + Running the macro-benchmarks takes so long, feedback is important. + + perf/cairo-perf-trace.c | 29 ++++++++++++++++++++++++++++- + perf/cairo-perf.h | 1 + + 2 files changed, 29 insertions(+), 1 deletion(-) + +commit 5c2e73e74cb9aef92fdd90a91df44b417a036ebd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 4 10:03:45 2009 +0100 + + [perf] Enable traces to be interrupted + + Waiting for a long running benchmark can be very annoying, especially if + you just want a rough-and-ready result. So hook into SIGINT and stop the + current benchmark (after the end of the iteration) on the first ^C. A + second ^C within the same iteration will kill the program as before. + + perf/cairo-perf-trace.c | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +commit 2eaced24475622e73fbf6e3307ab46e3fe37eaef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 21:49:17 2009 +0100 + + [perf] Reconstruct interpreter for each run + + Destroy the interpreter after each run of a trace so that we collect any + left-over garbage. + + perf/cairo-perf-trace.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +commit 1b92ea250fdaef9add1a68bb8565847e6d56b023 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 20:28:49 2009 +0100 + + [ft] Don't call FT_Done_Face() on a face we do not own + + _font_map_release_face_lock_held() was being called unconditionally during + _cairo_ft_font_reset_static_data(). This presents two problems. The first + is that we call FT_Done_Face() on an object not owned by cairo, and the + second is that the bookkeeping is then incorrect which will trigger an + assert later. + + src/cairo-ft-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8e5295979fe087fadeff0f56c036f9d002086996 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 20:17:59 2009 +0100 + + [pattern] Typo in document + + Remove extraneous markup from program-listing. + + https://bugs.freedesktop.org/show_bug.cgi?id=20441 + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa5d6c7afdb9b742ad653c65e8804e84f2964599 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 19:29:19 2009 +0100 + + [trace] Add a --profile mode + + To save typing when creating macro-benchmarks --profile disables + mark-dirty and caller-info and compresses the trace using LZMA. Not for + computers short on memory! + + perf/README | 11 +++++++++-- + util/cairo-trace/cairo-trace.in | 18 ++++++++++++++++++ + 2 files changed, 27 insertions(+), 2 deletions(-) + +commit 9451f0b983665d13ad777bc8fd88507fb7a317b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 13:26:52 2009 +0100 + + [perf] Drop ticks from trace benchmarks + + Don't report the tick values for the macro-benchmarks as these are so + large as to be meaningless. + + perf/cairo-perf-trace.c | 37 ++++++++++++++++++++----------------- + 1 file changed, 20 insertions(+), 17 deletions(-) + +commit c988dc3719e345f6e1db6b0d656077a6b253b26d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 10:51:23 2009 +0100 + + [cairo] Doc typo. + + Fix conflicting sentence as pointed out by + https://bugs.freedesktop.org/show_bug.cgi?id=20183 + + src/cairo.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 35d0dd00c9f21cc4fd392d4627756f8d5b53a11b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 10:49:16 2009 +0100 + + [image] Doc typo. + + Correct parameter reference as pointed out by + https://bugs.freedesktop.org/show_bug.cgi?id=20182 + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 58459ac6435a2889b90580ddf00e69107361f431 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 10:45:51 2009 +0100 + + [font-options] Doc typo + + Remove duplicate 'with' as pointed out by + https://bugs.freedesktop.org/show_bug.cgi?id=20180 + + src/cairo-font-options.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8d39dee8e2aea2200fec460e8540838ec29cae5f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 10:40:38 2009 +0100 + + [cairo] Update documentation for bug 20154 + + Several typographical errors were pointed out in + https://bugs.freedesktop.org/show_bug.cgi?id=20154 + + src/cairo.c | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +commit 73469e693c02e6a99a32f12ac333737b47408e5e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 09:51:52 2009 +0100 + + [cairo] Tweak error strings. + + Rewrite a few error strings so that they more closer match the + documentation. Where they differ, I believe I have chosen the more + informative combination of the two texts. + + src/cairo-misc.c | 12 ++++++------ + src/cairo.h | 4 ++-- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit ab86662ab499e1f29c0f8c4248771e730c281e3f +Author: Andrew Lavin <aj.lavin@gmail.com> +Date: Fri May 22 16:36:40 2009 -0400 + + [test] Compile fix for invalid-matrix + + Fixed test compile error on OS X that caused fenv.h not to be included. + + test/invalid-matrix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eec547648439884a464eef832067a363cf1547e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 3 08:57:15 2009 +0100 + + [perf] s/git/anongit/ + + Third time lucky? + + perf/cairo-perf-trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce7e6339428703069f798dffcf23ec3e98cb554f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 21:54:44 2009 +0100 + + [perf] Warn if no traces were found + + perf/cairo-perf-trace.c | 28 ++++++++++++++++++++-------- + 1 file changed, 20 insertions(+), 8 deletions(-) + +commit f0366f0f3263397181699bf6bf2ed3968ea66403 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 21:48:26 2009 +0100 + + [perf] Update to point to new toplevel cairo-traces repo + + perf/cairo-perf-trace.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit c9cd2f9ca101c25d04f52578d54be36ae646049e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 18:47:07 2009 +0100 + + [cairo] PLT symbols for cairo_set_source_rgb + + Added a private use in user-font, but forgot to add a hidden symbol. + + src/cairo.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit 21550a753059b4f880f03ea96148befaa34a6426 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 18:08:45 2009 +0100 + + [user-font] Set the initial colour to white + + An issue occured when using subpixel antialiasing with user-fonts and + XRender - the glyphs were transparent, as demonstrated by the font-view + example. + + The problem lies in that enabling subpixel antialiasing triggers use of an + ARGB32 image surface for rendering the glyph, but the default colour is + black (so the only information is in the alpha-channel). Given an ARGB32 + glyph XRender treats it as a per-channel mask, but since the R,G,B + channels were uniformly zero, the glyph is rendered as transparent. + + Fix this by setting the initial colour to white before rendering the image + surface for a user-font glyph, which generates the appropiate gray-level + mask by default. + + src/cairo-user-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit b5799e073e4e404aea277b7640eeee2120318823 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 18:07:31 2009 +0100 + + [xlib] Use bswap_32 + + Byteswap the ARGB32 glyphs using bswap_32 instead of open-coding. + + src/cairo-xlib-surface.c | 30 +++++++++++------------------- + 1 file changed, 11 insertions(+), 19 deletions(-) + +commit 56e9765f82a64940b36a64688267fbe5d1c8919e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 14:25:04 2009 +0000 + + [util] Add font-view + + A C variant of Behdad's python example font viewer. + + util/Makefile.am | 5 ++ + util/font-view.c | 184 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 189 insertions(+) + +commit d331dda48017667c15f95bf7d510bce2f38111de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 15:41:19 2009 +0100 + + [perf] Missing ')' in output + + perf/cairo-perf-compare-backends.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c9ddaf8e7f0006f308aab0b87cf0425b2690d914 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 7 13:09:09 2008 +0930 + + PDF: Don't embed the same pattern more than once + + The PDF surface now keeps track of all the patterns it is embedding in + a hash table keyed by the unique_id returned by the + _cairo_surface_get_unique_id(). + + src/cairo-pdf-surface-private.h | 13 +++- + src/cairo-pdf-surface.c | 134 +++++++++++++++++++++++++++++++--------- + 2 files changed, 115 insertions(+), 32 deletions(-) + +commit f7613eeecea1218d353a183078fb77bc5cf4e72e +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Tue Nov 25 20:15:15 2008 +0100 + + Add more surface snapshots providers + + This patch adds more implementation of the snapshot method. For + surface types where acquire_source_image is already making a copy + of the bits, doing another one as is the case for the fallback + implementation is a waste. + + src/cairo-glitz-surface.c | 16 +++++++++++++++- + src/cairo-quartz-surface.c | 19 ++++++++++++++++++- + src/cairo-xcb-surface.c | 17 ++++++++++++++++- + src/cairo-xlib-surface.c | 20 +++++++++++++++++++- + 4 files changed, 68 insertions(+), 4 deletions(-) + +commit cffb398f5a484000be458d04ef8f8bce3f6c7e3d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 26 21:07:07 2009 +0100 + + Add a generic cow-snapshotting framework + + Provide a mechanism for backends to attach and remove snapshots. This can + be used by backends to provide a cache for _cairo_surface_clone_similar(), + or by the meta-surfaces to only emit a single pattern for each unique + snapshot. + + In order to prevent stale data being returned upon a snapshot operation, + if the surface is modified (via the 5 high level operations, and on + notification of external modification) we break the association with any + current snapshot of the surface and thus preserve the current data for + their use. + + src/cairo-meta-surface.c | 1 - + src/cairo-surface-fallback.c | 2 +- + src/cairo-surface-private.h | 7 +- + src/cairo-surface.c | 272 +++++++++++++++++++++++++++++++++---------- + src/cairoint.h | 12 ++ + test/mask.c | 12 +- + test/trap-clip.c | 12 +- + 7 files changed, 249 insertions(+), 69 deletions(-) + +commit 7ed050fd435f17d25c7b757b02cfe200f8779fc2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 13:08:25 2009 +0100 + + [perf] Benchmark traces + + Add a variant of cairo-perf that measures the time to replay traces. + + boilerplate/cairo-boilerplate-system.c | 15 + + boilerplate/cairo-boilerplate-system.h | 4 + + perf/.gitignore | 1 + + perf/Makefile.am | 17 ++ + perf/README | 31 ++ + perf/cairo-perf-compare-backends.c | 10 +- + perf/cairo-perf-trace.c | 530 +++++++++++++++++++++++++++++++++ + 7 files changed, 605 insertions(+), 3 deletions(-) + +commit 403f780b292762aa45056c2fb5a48bb806521173 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 09:16:16 2009 +0100 + + [perf] Add a verbose flag for summary output with raw + + Use 'cairo-perf -v -r' to have both the summary output along with the raw + values. This gives a progress report whilst benchmarking, very reassuring + with long running tests. + + perf/cairo-perf.c | 82 +++++++++++++++++++++++++++++++++++-------------------- + perf/cairo-perf.h | 3 ++ + 2 files changed, 55 insertions(+), 30 deletions(-) + +commit 70fd2bbce38fca65db6725c632ee591352dfe42c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 2 09:00:21 2009 +0100 + + [perf] Exclude similar testing by default + + There are synchronisation issues with similar surfaces (as only the + original target surface is synced) which interferes with making + performance comparisons. (There still maybe some value should you be aware + of the limitations...) + + perf/cairo-perf.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit bc49cb377c70c4c6926ca52e34094e99a4591f14 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 30 12:28:23 2009 +0100 + + [perf] Benchmark mixing different masks and sources + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/mask.c | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 293 insertions(+) + +commit 4aca84ddb22bc178cbc9b132b9ce06af3f4b300b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 28 18:05:26 2009 +0100 + + [perf] Add a pure glyphs performance metric + + Use the new API Behdad exposed in 1.8 to precompute a glyph string using + Cairo and then benchmark cairo_show_glyphs(). This is then equivalent to + the text benchmark but without the extra step of converting to glyphs on + every call to cairo_show_text() i.e. it shows the underlying glyph + rendering performance. + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/glyphs.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 100 insertions(+) + +commit 55f4e0e4e8c7df59bfc9e6ffea8daa065276e42f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 30 16:50:17 2009 +0100 + + [perf] Change seperators from '-' to '.' + + This allows the perf tests to use '-' in the name which is easier to read + and differentiates with using '_' to separate source and operators. + + perf/cairo-perf-compare-backends.c | 22 ++++++++++++---------- + perf/cairo-perf-cover.c | 32 ++++++++++++++++---------------- + perf/cairo-perf-report.c | 16 +++++++++++++--- + perf/cairo-perf.c | 8 ++++---- + perf/mosaic.c | 8 ++++---- + perf/pattern_create_radial.c | 4 ++-- + perf/pythagoras-tree.c | 2 +- + perf/subimage_copy.c | 4 ++-- + perf/unaligned-clip.c | 2 +- + perf/world-map.c | 4 ++-- + perf/zrusin.c | 4 ++-- + 11 files changed, 59 insertions(+), 47 deletions(-) + +commit b7c03d4e400245fc2b2d748fe808a9724e61f22f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 16:31:51 2009 +0100 + + [ps] Trivial warning fix. + + src/cairo-ps-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 99482b17a50a8ae52b7627bf624e358ed3623540 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 18:34:54 2009 +0100 + + [script] Improve caching of glyph advance + + The glyph advance cache was only enabled for glyph indices < 256, + causing a large number of misses for non-ASCII text. Improve this by + simply applying the modulus of the index to select the cache slot - which + may cause some glyph advances to be overwritten and re-queried, but + improves the hit rate. + + util/cairo-script/cairo-script-operators.c | 39 +++++++++++------------------- + 1 file changed, 14 insertions(+), 25 deletions(-) + +commit 51193f1610c0f6893768e43e90a3395ec96c28fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 28 14:16:58 2009 +0100 + + [pattern] Pass flags to _cairo_pattern_acquire_surface() + + Allow the caller to choose whether or not various conversions take place. + The first flag is used to disable the expansion of reflected patterns into a + repeating surface. + + src/cairo-directfb-surface.c | 1 + + src/cairo-glitz-surface.c | 1 + + src/cairo-image-surface.c | 3 +++ + src/cairo-pattern.c | 13 +++++++++++-- + src/cairo-xcb-surface.c | 4 ++++ + src/cairo-xlib-surface.c | 5 +++++ + src/cairoint.h | 6 ++++++ + 7 files changed, 31 insertions(+), 2 deletions(-) + +commit 4ec451a2fa4050a60a81d01473d23ff2973f47e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 17:35:54 2009 +0100 + + [scaled-font] Cache repeated glyphs during probing device_extents + + Maintain a local on-stack cache of recently queried glyphs to avoid + relatively expensive hash table queries. + + src/cairo-scaled-font.c | 35 +++++++++++++++++++++++------------ + 1 file changed, 23 insertions(+), 12 deletions(-) + +commit ec22ae5b1d7e8ec364813f3b1c73f538018ecb57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 11:11:06 2009 +0100 + + [scaled-font] Compare most recently used font directly + + Avoid the relatively expensive _cairo_scaled_font_init_key() operation + when checking against the most recently used font. + + src/cairo-scaled-font.c | 28 +++++++++++++++++++++++----- + 1 file changed, 23 insertions(+), 5 deletions(-) + +commit 16d128c15edf36a6e285fe4fbd6a828b64fd7f87 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 21:10:04 2009 +0100 + + [scaled-font] Lazily acquire the font_map_lock on font destruction. + + We can defer taking the cairo_scaled_font_map_lock until we drop the + last reference to the scaled font so long as we double check the reference + count after waiting for the lock and not making assumptions about + unreferenced fonts during construction. This is significant as even + acquiring the uncontended cairo_scaled_font_map_lock during + cairo_scaled_font_destroy() was showing up as a couple of percent on text + heavy profiles (e.g. gnome-terminal). + + src/cairo-scaled-font.c | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +commit dc083ab30a5b781e205354c525ee054982364abd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 14:54:34 2009 +0100 + + [cairo] Track the MRU scaled font + + When observing applications two patterns emerge. The first is due to + Pango, which wraps each glyph run within a context save/restore. This + causes the scaled font to be evicted after every run and reloaded on the + next. This is caught by the MRU slot on the cairo_scaled_font_map and + prevents a relatively costly traversal of the hash table and holdovers. + + The second pattern is by applications that directly manage the rendering + of their own glyphs. The prime example of this is gnome-terminal/vte. Here + the application frequently alternates between a few scaled fonts - which + requires a hash table retrieval every time. + + By introducing a MRU slot on the gstate we are able to directly recover + the scaled font around 90% of the time. + + Of 110,000 set-scaled-fonts: + 4,000 were setting the current font + 96,000 were setting to the previous font + 2,500 were recovered from the MRU on the cairo_scaled_font_map + 7,500 needed a hash retrieval + which compares to ~106,000 hash lookups without the additional MRU slot on + the gstate. + + This translates to an elapsed time saving of ~5% when replaying a + gnome-terminal trace using the drm backend. + + src/cairo-gstate-private.h | 1 + + src/cairo-gstate.c | 18 ++++++++++++++---- + src/cairo.c | 6 ++++++ + 3 files changed, 21 insertions(+), 4 deletions(-) + +commit fda89c56ff484a8cd33cd780e8b9396d3538284d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 15:59:16 2009 +0100 + + Markup a few more functions as const/pure + + src/cairoint.h | 59 ++++++++++++++++++++++++++++++---------------------------- + 1 file changed, 31 insertions(+), 28 deletions(-) + +commit f59f44c140e5f60d336423e0585d2bb8a6c0ea01 +Merge: 2da78fd 4232719 +Author: Eric Anholt <eric@anholt.net> +Date: Tue Jun 2 00:37:19 2009 -0700 + + Merge commit 'origin/master' into gl + + Felt like pulling the latest stuff, since I branched back in February. + + Conflicts: + build/configure.ac.features + src/cairo.h + util/cairo-script/csi-replay.c + +commit 2da78fd4666faa27d037ae3625ca83353a6e7629 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jun 1 14:04:21 2009 -0700 + + [gl] Drop use of packed datatypes where it's disallowed. + + I had naively assumed that GL image specification let you do useful things + and describe the most common datatypes in graphics, since we do things that + way inside of the DRI drivers. Silly me. GL_BGR and GL_RGB can't do + GL_UNSIGNED_INT_8_8_8_8{,_REV}, so no specifying 24-depth 32-bpp data with + implicit alpha. GL_BGR can't even do r5g6b5! + + This fixes 20 regressions in the test suite. + + src/cairo-gl-surface.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit 69a150b7d8115babf2c60d7c5f7ca340162dc098 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jun 1 13:36:32 2009 -0700 + + [gl] Initialize has_alpha in the image surface composite fastpath. + + Fixes bilevel-image, set-source, and zero-alpha. + + src/cairo-gl-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 7ee0fee900bf30a7ca0497ab64199c9013f81cdd +Merge: 882f1d5 d3a478b +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jun 1 10:45:36 2009 -0700 + + Merge branch 'gl' into gl-span-renderer + + Conflicts: + src/cairo-gl-surface.c + +commit d3a478b6c0dca3884a68c5014185cad0a166801c +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jun 1 10:19:24 2009 -0700 + + [gl] Fix check-plt.sh for the GL surface. + + src/cairo-gl-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 1f7c393a6d63282a632a62264b99e67e26ecf38e +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jun 1 10:10:00 2009 -0700 + + [gl] Fix check-doc-syntax.sh for GL surface. + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 19bc0f2f1d75b1514b22d0bb737bad67ff8d1ee6 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jun 1 10:09:16 2009 -0700 + + [gl] Fix check-def.sh for GL surface. + + src/cairo-gl-surface.c | 2 +- + src/cairo-gl.h | 6 ------ + 2 files changed, 1 insertion(+), 7 deletions(-) + +commit e05097c604c607d27b341cd33426001bd2d1f690 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 27 16:45:20 2009 +0100 + + [surface] Assign a unique id to the surface. + + Allocate an ever-increasing, non-zero, unique identifier to each surface. + True for the first 4-billion... + + src/cairo-pattern.c | 11 ++++++++--- + src/cairo-surface-private.h | 2 ++ + src/cairo-surface.c | 25 +++++++++++++++++++++++++ + 3 files changed, 35 insertions(+), 3 deletions(-) + +commit 45835f623f5ddda6e3258361b9d6ab27860a9198 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 26 12:46:46 2009 +0100 + + [cache] Expose init/fini methods so that caches can be embedded. + + The structure is already exposed, so just expose the + constructors/destructors in order to enable caches to be embedded and + remove a superfluous malloc. + + src/cairo-cache-private.h | 27 +++++++++--- + src/cairo-cache.c | 104 ++++++++++++++++------------------------------ + src/cairo-scaled-font.c | 35 ++++++++-------- + src/cairo-types-private.h | 14 ------- + 4 files changed, 74 insertions(+), 106 deletions(-) + +commit c3aac9cf49362b726a54a33a46bd8511a10f644f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 26 10:37:30 2009 +0100 + + [image] Eliminate trapezoid array allocation + + By simply iterating over the array cairo_trapezoid_t, converting each one + separately to a pixman_trapezoid_t and rasterizing each one individually + we can avoid the common heap allocation. pixman performs exactly the same + iteration internally so there is no efficiency loss. + + src/cairo-image-surface.c | 92 +++++++++++++++++++++++------------------------ + 1 file changed, 45 insertions(+), 47 deletions(-) + +commit 7b2bc441387abcf3967587f571dc5741d0a53938 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 26 10:41:53 2009 +0100 + + [surface-fallback] Tidy pattern handling. + + Make the treatment of replacing the NULL source pattern with WHITE + consistent. As it is a solid pattern, we can skip _cairo_pattern_fini() + and so make the code more readable, and consistent along the error paths. + + src/cairo-surface-fallback.c | 83 ++++++++++++++++++-------------------------- + 1 file changed, 33 insertions(+), 50 deletions(-) + +commit e83e113eae9e7cb3e09719bfc0ad68450faf3ecd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 23:25:38 2009 +0100 + + [surface] Speed up cairo_surface_get_mime_data(). + + The number of mime-types attached to a surface is usually small, + typically zero. Therefore it is quicker to do a strcmp() against + each key in the private mime-data array than it is to intern the + string (i.e. compute a hash, search the hash table, and do a final + strcmp). + + src/cairo-array.c | 8 -------- + src/cairo-surface.c | 33 ++++++++++++++++++--------------- + src/cairoint.h | 6 ++++++ + 3 files changed, 24 insertions(+), 23 deletions(-) + +commit 247e76b923d54f639e2ca50c8da945c15b691158 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 26 08:53:45 2009 +0100 + + [script] Speed up floating-point scanner + + Hard-code frequent exponents to reduce number of calls to pow(). + + util/cairo-script/cairo-script-scanner.c | 45 ++++++++++++++++++++++---------- + 1 file changed, 31 insertions(+), 14 deletions(-) + +commit c5e85835b29c7654e1c28a90b2e587afba7b6f0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 26 15:52:30 2009 +0100 + + [debug] Relax ASSERT_NOT_REACHED + + Need to actually handle random pixman image formats... + For the time being, ignore them. + + src/cairo-debug.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4232719af968ed05636fe34f2ffe2520dc02d737 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 30 23:03:55 2009 -0400 + + [ft] Fix vertical advance metrics of bitmap fonts (#21985) + + src/cairo-ft-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4314cae874dec2747df6be88859d7b6174eece31 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed May 27 17:56:05 2009 +0930 + + Fix typo in comment + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7dbc2fe80a4fe0dcee4a293e47ab6edcefc24e18 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 20:36:34 2009 +0100 + + [script] Simplify _dictionary_name_equal + + Just a simple return TRUE since all necessary checking is performed by + _csi_hash_table_lookup(). + + util/cairo-script/cairo-script-objects.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 0b5e92e66be94ce7cc9c31e911f23c4cb7ec77af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 19:56:57 2009 +0100 + + [script] Check hash value between comparing keys + + util/cairo-script/cairo-script-hash.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit a364f71194aa2ea92071662f156c9b2a4d9211b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 21:25:27 2009 +0100 + + [trace] Set output location using pwd + + Record the current working directory and pass that along to cairo-trace so + that the trace output is local to the user and not the application. This + is vital if the application is called via a script that changes directory. + + util/cairo-trace/cairo-trace.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a76e09ea656faa63fbfa159e8f52c9c9ec7d35c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 21:22:43 2009 +0100 + + [trace] Missing newlines in error messages. + + util/cairo-trace/trace.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b7f199fde25c960bf87302d5e868a7c2dffa4f5d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 12:40:35 2009 +0100 + + [pattern] Trim REPEAT source size when applicable. + + Some backends are quite constrained with surface sizes and so trigger + fallbacks when asked to clone large images. To avoid this we attempt + to trim ROIs (as these are often limited to the destination image, and + so can be accommodated by the hardware). This patch allows trimming + REPEAT sources both horizontally and vertically independently. + + src/cairo-pattern.c | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit e4efc80b8e89b05afc22d74f984f4ec9012bc39b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 21:15:22 2009 +0100 + + [build] Make valgrind support user-configurable + + As the number of places where we add valgrind client requests grows, it + becomes imperative that we should be able to disable them with a simple + configure time option. + + build/configure.ac.analysis | 37 ++++++++++++++++++++++--------------- + 1 file changed, 22 insertions(+), 15 deletions(-) + +commit d840deb57b51236820dc8c320ecd7540973de873 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 22:11:22 2009 +0100 + + [in-fill] Fix typo in on-vertex test. + + Eeek! Comparing point->y against in_fill->x is a bad idea. + + src/cairo-path-in-fill.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit cfd484cd01a77b1f91e27daccfc5f240cf7c692d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon May 25 22:10:20 2009 +0100 + + [test] Change test semantics to match new in-fill definition + + The in-fill definition has changed to include queries on the edges and + vertices, so update the test case to match. + + test/in-fill-trapezoid.c | 77 +++++++++++++++++++++++++++++++++++------------- + 1 file changed, 57 insertions(+), 20 deletions(-) + +commit b71b019fe50a9188ddbecd1945606da8ba3bad53 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 27 16:32:21 2009 +0000 + + [in-fill] Treat on-edge queries as inside. + + Jeff Muizelaar noted that the treatment of edges differed with firefox's + canvas definition, which considers a point on any edge as inside. The + current implementation has a similar definition to that of flash, for + which the top and right edges are outside. Arguably, firefox has the more + intuitive definition here... + + src/cairo-path-in-fill.c | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit efd0f0b2922d0801e4e0e8e75ddf9b9892a2f2e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 20 18:49:28 2009 +0100 + + [xlib] Handle too-large images gracefully. + + Trigger a fallback to an image surface for massive patterns. + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3c6838532a62c294e7f18b13b0b7f8da9a1a1e1e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 20 18:46:35 2009 +0100 + + [surface] Early return if the backend cannot clone an image + + If the backend cannot create a similar surface to hold the image, then + report back the failure before embarking upon an infinite recursion. + The UNSUPPORTED return should percolate up through the call stack and + trigger a fallback. + + src/cairo-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit bf2c7356d4c955fb770863874a0ea111e9ba02a4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 22 12:52:43 2009 +0100 + + [surface] Provide nil-surface for INVALID_SIZE + + So that we can faithfully report back failure if the user tries to create + a surface larger than the backend can support. + + src/cairo-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6717f0d748000416172057d0aab2471377456e27 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 20 17:35:19 2009 +0100 + + [win32] Wrap win32-font usage with CAIRO_HAS_WIN32_FONT + + Bug 19251: --enable-win32=yes and --enable-win32-font=no causes + compilation failure + [https://bugs.freedesktop.org/show_bug.cgi?id=19251] + + Wrap use of the win32 font backend within win32-printing-surface within + CAIRO_HAS_WIN32_FONT ifdefs to prevent compilation failure if the user + explicitly disables the win32 font backend. + + src/cairo-win32-printing-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit c7d2b0de830f4c653fbb5016c4efdc5f0e5af0eb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 20 17:34:56 2009 +0100 + + [win32] Typo + + Correct function name in error string. + + src/cairo-win32-printing-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87b764908a38cbb4159ac76d8b7d1d08a24b838e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 19 15:53:55 2009 +0100 + + [gl] Add EGL target + + Split the GLX context from the GL surface to enable use of an alternative + EGL interface. + + boilerplate/Makefile.win32.features | 20 ++ + boilerplate/cairo-boilerplate-gl.c | 2 +- + build/Makefile.win32.features | 2 + + build/Makefile.win32.features-h | 6 + + build/configure.ac.features | 3 + + configure.ac | 30 ++- + src/Makefile.sources | 4 +- + src/Makefile.win32.features | 28 +++ + src/cairo-egl-context.c | 181 ++++++++++++++++++ + src/cairo-gl-private.h | 88 +++++++++ + src/cairo-gl-surface.c | 191 ++++++++----------- + src/cairo-gl.h | 41 +++-- + src/cairo-glx-context.c | 136 ++++++++++++++ + test/.gitignore | 2 + + test/Makefile.am | 10 + + test/egl-flowers.c | 358 ++++++++++++++++++++++++++++++++++++ + test/glx-flowers.c | 256 ++++++++++++++++++++++++++ + util/cairo-script/.gitignore | 2 + + util/cairo-script/Makefile.am | 15 ++ + util/cairo-script/csi-egl.c | 263 ++++++++++++++++++++++++++ + util/cairo-script/csi-glx.c | 150 +++++++++++++++ + util/cairo-script/csi-replay.c | 61 ++++++ + 22 files changed, 1723 insertions(+), 126 deletions(-) + +commit 6e87e354e42d1a758a252533407e6e1829638544 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 17 18:14:28 2009 +0930 + + Correct the comment for the index_to_ucs4 font backend function + + src/cairoint.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2a34992cccfd77c2acf30fe851311f16137ba32f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 17 18:12:39 2009 +0930 + + Ensure win32 font index_to_ucs4() sets ucs4 to -1 if lookup fails + + src/cairo-win32-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit 4c8e5485a10478c19e8a6cb48595473f5bb8ee8a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 17 18:05:42 2009 +0930 + + Fix win32 build breakage + + that was caused by c25992479aca481d326f72665ebdcf0904273eac + + src/cairo-win32-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 31596cf2b298054bbd3e340ae77a3388eadc0d8b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 15 17:40:26 2009 +0100 + + [debug] Check image contents using memcheck. + + As an aide to tracking down the source of uninitialised reads, run + VALGRIND_CHECK_MEM_IS_DEFINED() over the contents of image surfaces at the + boundary between backends, e.g. upon setting a glyph image or acquiring + a source image. + + src/cairo-debug.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-ft-font.c | 2 ++ + src/cairo-pattern.c | 2 ++ + src/cairo-png.c | 2 ++ + src/cairo-scaled-font.c | 3 +++ + src/cairo-surface.c | 32 +++++++++++++++++++++++--------- + src/cairoint.h | 11 +++++++++++ + 7 files changed, 85 insertions(+), 9 deletions(-) + +commit 791a6fa399894e735d522781b15b7f18c3ecd4d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 15 16:57:49 2009 +0100 + + [memfault] Update macros to avoid namescape collision with memcheck + + Basing the macro names of the memfault skin lead to a namespace + collision with memcheck. After updating the headers, update cairo's usage + to match. + + src/cairo-malloc-private.h | 2 +- + test/cairo-test.c | 62 +++++++++++++++++++++++----------------------- + 2 files changed, 32 insertions(+), 32 deletions(-) + +commit c897f36a6b09f3591d858142e3236f256f0bd6a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 15 20:37:52 2009 +0100 + + [test] Stress the ft from-face cache + + Create a set of font faces using the same FT_Face to stress test the + handling of from-face fonts within the backend cache. + + test/ft-font-create-for-ft-face.c | 109 +++++++++++++++++++++++++++++++++++--- + 1 file changed, 102 insertions(+), 7 deletions(-) + +commit 477df1f5504a507d0c5960aa7e21375284a6f99c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 15 10:48:56 2009 +0100 + + [test] Clear expected floating point exceptions + + test/invalid-matrix deliberately feeds garbage into the API to test our + error detection. This causes FPE to be raised during the course of the + test - so they are deliberately disable for the duration. However, the + exceptions were not being cleared and so the FPE could be triggered on + the next floating point operation. This was being masked during make check, + by the fact that each test is run in its own forked process and was only + observed when multiple tests were run in foreground mode. + + build/configure.ac.system | 2 +- + test/invalid-matrix.c | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit f47a93ef30249b531e588335045d052c3dcc71bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 9 09:55:49 2009 +0100 + + [test] Check text->path with user-fonts (twin) + + Check behaviour of user-fonts, twin in particular, when using the text as + a path. + + test/twin.c | 11 ++++++++++- + test/twin.ps.ref.png | Bin 1114 -> 2197 bytes + test/twin.ref.png | Bin 1492 -> 4038 bytes + test/twin.svg.ref.png | Bin 1487 -> 3027 bytes + 4 files changed, 10 insertions(+), 1 deletion(-) + +commit 669e7ae5c98812360bf20b798c20024ae2e9810b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 8 17:36:01 2009 +0100 + + [test] Relax APPROX_EQUALS condition + + The bounding box of the text is rounded to the nearest pixel boundaries, + so therefore the test must accept a similar level of imprecision. + + test/get-path-extents.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fe7410c6cdc19bb366bf1e93481bf8287a14d52e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 9 19:01:06 2009 +0100 + + [test] Add a note to "Getting the elusive zero failures" + + The test suite depends upon many external factors and in order to achieve + a pass, your system must match that upon which the reference images were + generated. Add a note to read test/README in case of failures so that the + casual user is not unduly alarmed by cairo reportedly failing. + + test/cairo-test-runner.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 2f962799a77faef0e6ad62c79bd7eebc9b8c5a4b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 15 18:49:03 2009 +0100 + + [test] Fix typos that excluded backend test sources + + test/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c25992479aca481d326f72665ebdcf0904273eac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 9 10:10:14 2009 +0100 + + [xlib] Use minimal depth for similar clones. + + Damian Frank noted + [http://lists.cairographics.org/archives/cairo/2009-May/017095.html] + a performance problem with an older XServer with an + unaccelerated composite - similar problems will be seen with non-XRender + servers which will trigger extraneous fallbacks. The problem he found was + that painting an ARGB32 image onto an RGB24 destination window (using + SOURCE) was going via the RENDER protocol and not core. He was able to + demonstrate that this could be worked around by declaring the pixel data as + an RGB24 image. The issue is that the image is uploaded into a temporary + pixmap of matching depth (i.e. 32 bit for ARGB32 and 24 bit for RGB23 + data), however the core protocol can only blit between Drawables of + matching depth - so without the work-around the Drawables are mismatched + and we either need to use RENDER or fallback. + + This patch adds a content mask to _cairo_surface_clone_similar() to + provide the extra bit of information to the backends for when it is + possible for them to drop channels from the clone. This is used by the + xlib backend to only create a 24 bit source when blitting to a Window. + + src/cairo-clip.c | 1 + + src/cairo-directfb-surface.c | 2 ++ + src/cairo-glitz-surface.c | 3 +++ + src/cairo-image-surface.c | 4 ++++ + src/cairo-pattern.c | 18 +++++++++++++--- + src/cairo-quartz-surface.c | 1 + + src/cairo-surface-fallback-private.h | 1 + + src/cairo-surface-fallback.c | 3 ++- + src/cairo-surface.c | 7 +++++- + src/cairo-win32-surface.c | 3 ++- + src/cairo-xcb-surface.c | 5 +++++ + src/cairo-xlib-surface.c | 42 +++++++++++++++++++++++++++--------- + src/cairoint.h | 4 ++++ + src/test-fallback-surface.c | 1 + + src/test-fallback16-surface.c | 2 ++ + test/surface-source.c | 1 + + 16 files changed, 82 insertions(+), 16 deletions(-) + +commit 0238fe2cafea2e1ed19bb222117bd73ee6898d4d +Author: Karl Tomlinson <karlt+@karlt.net> +Date: Thu May 14 11:46:29 2009 +0100 + + [ft] Resolve mutual referencing problems with zombie faces + + Bug 21706 -- zombie ft_font_face / ft_unscaled_font mutual + referencing problems + [http://bugs.freedesktop.org/show_bug.cgi?id=21706] + + There can be more than one zombie font_face belonging to an unscaled_font, + but only the first is destroyed. This leaks the client's FT_Face + (and associated font data) as release of the FT_Face depends on release + of the font_face. + + (The reason why Firefox ends up with two different font_faces for one + unscaled_font is that load_flags for faces with artificial oblique have + FT_LOAD_NO_BITMAP set. + https://bugzilla.mozilla.org/show_bug.cgi?id=486974) + + Also it's possible for _cairo_ft_font_face_create to pull out a zombie + font_face from the unscaled_font, which would crash + _cairo_ft_font_face_scaled_font_create, as that expects non-null + font_face->unscaled (if !font-face->pattern). + + AUTHORS | 2 +- + src/cairo-ft-font.c | 38 ++++++++++++++++++++++++++++++-------- + 2 files changed, 31 insertions(+), 9 deletions(-) + +commit d6f6ec9082c86b9fd9e2389b9627f08a91c2cdd3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 8 16:43:43 2009 +0100 + + [ft] Restore the ability to lazily resolve patterns. + + I broke the ability for the ft font backend to resolve patterns whilst + fixing the font creation to propagate the error status from fontconfig + (be27e8). By adjusting the sequence of error checks we do not confuse + the absence of a match with a fatal error and thereby restoring the + lazy pattern resolution whilst ensuring error propagation. + + src/cairo-ft-font.c | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +commit a352fd46020e18f9d9f839f0c3f3a63c1d8c0ae1 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri May 15 15:34:05 2009 -0400 + + Only include <strings.h> for ffs() when we HAVE_FFS + + This fixes breakage caused by 3d3d10a31e04498ef91a288d89b3dec291bfc323 + + src/cairo-skiplist.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 882f1d5a60abfbf83c65fe00b31bb4c8e5c82f62 +Author: Eric Anholt <eric@anholt.net> +Date: Sun May 10 16:56:49 2009 -0700 + + [gl] Use spans directly as geometry instead of rasterizing to a temporary. + + I was hoping for a bigger win than this, but cairogears is now significantly + faster than it was with just traps. One potential problem is that adding + src texture coordinates blew up vertex size from 12 bytes to 20, and we're + emitting quite a few vertices. There's plenty of hope for the future, + though: With shaders we could remove the 2 new texcoords again by stuffing a + position to source coordinate transformation matrix in constants. Then + with EXT_geometry_shader4 plus EXT_gpu_shader4 we should be able to get the + 24 bytes for 2 vertices down to 16 or less. + + src/cairo-gl-surface.c | 316 ++++++++++++++++++++++++++----------------------- + 1 file changed, 171 insertions(+), 145 deletions(-) + +commit 7b4f2d5e6dd37232d4fa764b69065c7d96856dcc +Author: Eric Anholt <eric@anholt.net> +Date: Sun May 10 14:50:22 2009 -0700 + + [gl] Use Enable/DisableClientState for arrays for consistency. + + src/cairo-gl-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 705ee3da1372e8533f25e0b4bde072e4bf76872b +Author: Eric Anholt <eric@anholt.net> +Date: Sat May 9 12:17:12 2009 -0700 + + [gl] Add HW spans implementation using VBOs and GL_LINES. + + This is a minor performance regression over software, but is the basis for + not rasterizing the geometry into a temporary mask, which should be a + significant win. + + src/cairo-gl-surface.c | 145 ++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 124 insertions(+), 21 deletions(-) + +commit 934af24ccce9c06fc38ab7735d643d230fb3b8ad +Author: Eric Anholt <eric@anholt.net> +Date: Sat May 9 10:03:06 2009 -0700 + + [gl] Use the span renderer with an image surface temporary. + + This appears to be no performance difference in cairogears versus the traps + fallback before, but is a step towards handing the information off to the + hardware. + + src/cairo-gl-surface.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 208 insertions(+), 2 deletions(-) + +commit 17b41fe7e3b8b493341be6384d816105aadf0cb6 +Author: Eric Anholt <eric@anholt.net> +Date: Sun May 10 10:17:27 2009 -0700 + + [gl] Use filtering of GL_NEAREST to hint to TexImage not to alloc for mipmaps. + + Gl defaults to NEAREST_MIPMAP_LINEAR on new texture objects. + This should save space or bandwidth with DRI drivers, as they'll use the + parameter as a hint, and then not have to either fix up later or waste + space for unused mipmap levels. + + src/cairo-gl-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit a438acd37c5aaedc7e7a05e6a9d8758315931b44 +Author: Eric Anholt <eric@anholt.net> +Date: Sat May 9 11:33:53 2009 -0700 + + [gl] Handle PIXMAN_b8g8r8a and PIXMAN_b8g8r8x8 in the image tex shortcut. + + src/cairo-gl-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 29768c2193b09d3bef54a178c8e3ba6f7e7cebd0 +Author: Eric Anholt <eric@anholt.net> +Date: Sat May 9 11:30:11 2009 -0700 + + [gl] Don't forget that we require ARB_texture_non_power_of_two currently. + + src/cairo-gl-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 088d2a6cc70b01f55d178d235542247180b3e5ee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 11:35:17 2009 +0100 + + [doc] Update identifiers + + doc/public/tmpl/cairo-status.sgml | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit d8fb6a03d3034cf776687bcc1f0625a8a9f2ae07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:57:13 2009 +0100 + + [path] Define _BSD_SOURCE to enable hypot() + + hypot() is only declared for BSD/SVID/XOPEN/C99 sources. Choose BSD as + we've used that elsewhere. + + src/cairo-path-stroke.c | 1 + + 1 file changed, 1 insertion(+) + +commit e38f85c5de51016b8858e755e2752816c9995ab2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:42:15 2009 +0100 + + [script] Pedantic violations + + Fixup a few trivial errors with -pedantic. + + util/cairo-script/cairo-script-operators.c | 2 +- + util/cairo-script/cairo-script-private.h | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 0c00556990a842e0ee0056134c6e196c2fb372b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:11:12 2009 +0100 + + [script] Missing include for INT32_MAX + + Avoid depending upon stdint.h, or rather cut'n'pasting Cairo's portable + defines, by using INT_MAX and limits.h instead. + + util/cairo-script/cairo-script-file.c | 3 ++- + util/cairo-script/cairo-script-objects.c | 3 ++- + util/cairo-script/cairo-script-operators.c | 13 +++++++------ + util/cairo-script/cairo-script-scanner.c | 5 +++-- + util/cairo-script/cairo-script-stack.c | 7 ++++--- + 5 files changed, 18 insertions(+), 13 deletions(-) + +commit 3d3d10a31e04498ef91a288d89b3dec291bfc323 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:10:47 2009 +0100 + + [skiplist] Missing include for ffs() + + src/cairo-skiplist.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit e5752865ab0ebefec313ab9a6f90451ef2d7af95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:58:45 2009 +0100 + + [cairo] Protect typeof against -ansi + + s/typeof/__typeof__/ to allow the [gcc-specific] macro to continue to work + despite -ansi. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5f4f2ab01ab3fa6b07ac7521dfeaf90a787a5dee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:34:47 2009 +0100 + + [cairo] Remove stray semi-colon + + Pedantic finds another victim. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d86ad461cf7a9d857bd07a6b775c84acbf35647b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 14:16:05 2009 +0100 + + [cairo] Convert C99 comments to /* ... */ + + First victim of -pedantic... + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 695f648607dd5a78cf29dcc33ed19aa223d0416a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 11:16:10 2009 +0100 + + [cairo] Fix errors reported by check-doc + + Identity a few new instances of CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED in + comments with %. + + src/cairo.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 849bdee199b5ebba467603a69d30bb519c10bc75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 11:36:38 2009 +0100 + + [check] Quieten output during checking headers-standalone + + Remove the duplication of the compile line and enable shave to replace it + entirely with a "CHECK $header". This should make errors more obvious. + + build/shave.in | 3 +++ + src/Makefile.am.analysis | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 84fad4b11bc26cfd0847660e3309eb902d783713 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 11:31:22 2009 +0100 + + [build] Fix gtk-doc interoperation with shave + + Add --tag=CC to the libtool invocations. + + build/Makefile.am.gtk-doc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit fd72c56af833a738ddc8f188cabe03d9f8b45475 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 7 11:27:43 2009 +0100 + + [build] Report status of gtk-doc in summary + + build/configure.ac.features | 1 + + 1 file changed, 1 insertion(+) + +commit 428fb58a4c96391f96f48026be49a4533cd12834 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 28 15:03:53 2009 -0400 + + [user-font] Add CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED + + This is useful for language bindings to signal that a method is not + implemented. + + src/cairo-misc.c | 2 ++ + src/cairo-surface.c | 1 + + src/cairo-user-font.c | 14 +++++++++++--- + src/cairo.h | 23 ++++++++++++++--------- + 4 files changed, 28 insertions(+), 12 deletions(-) + +commit f9573d03dde2c38674d36b783044715ab5104b0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 17 19:48:12 2009 -0400 + + Err, make gtk-doc happy again + + doc/public/tmpl/cairo-status.sgml | 2 +- + src/cairo.h | 2 -- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit 30735f790aa3cef822f132932f43a4738cd8cd95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 5 18:37:25 2009 +0100 + + [xlib] Use a similar content surface for cloning images + + Simply request a surface with a similar content to the source image when + uploading pixel data. Failing to do so prevents using a 16-bit (or + otherwise non-standard pixman image format) window as a source - in fact + it will trigger an infinite recursion. + + src/cairo-xlib-surface.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 60e38d0530443aa9c78e74e47ba5574887ae220c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 5 17:05:39 2009 +0100 + + [surface] Convert FORMAT_INVALID during snapshots + + Currently the surface snapshotting attempts to clone the source using a + new surface of identical format. This will raise an error if the source is + an unusual xserver, for example one operating at 16bpp. The solution to + this is to create the surface using the content type rather than the + format (as elsewhere within the code base). However, we also wish to + preserve FORMAT_A1 (which is lost if we only choose the format based on + _cairo_format_from_content) as the various backends may be able to + trivially special case such bitmaps. + + src/cairo-surface-fallback.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 31f5a2e94d669b9d2785de944d4aee584fd1d76e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 5 15:52:55 2009 +0100 + + [png] Coerce FORMAT_INVALID to a known image format + + It is possible for cairo_surface_write_to_png() to acquire a non-standard + image surface when, for example, we try to dump a low bit-depth XServer. + Handle this scenario by coercing the unknown image format to a standard + type via pixman. + + src/cairo-png.c | 44 ++++++++++++++++++++++++++++++-------------- + 1 file changed, 30 insertions(+), 14 deletions(-) + +commit c488b336449a1a7ca4d3f90785afeec9e21784c3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 5 13:59:07 2009 +0100 + + [test] Create a new fallback surface to exercise 16-bit paths. + + Add a variation of test-fallback-surface that forces the use of a 16-bit + pixman format code instead of the standard 32-bit types. This creates an + image surface akin to the fallbacks used with low bit-depth xservers. + + .../cairo-boilerplate-test-surfaces-private.h | 11 + + boilerplate/cairo-boilerplate-test-surfaces.c | 16 ++ + boilerplate/cairo-boilerplate.c | 18 ++ + src/Makefile.sources | 2 + + src/test-fallback16-surface.c | 234 +++++++++++++++++++++ + src/test-fallback16-surface.h | 52 +++++ + test/Makefile.am | 4 + + test/Makefile.sources | 3 + + test/test-fallback16-surface-source.c | 43 ++++ + test/test-fallback16-surface-source.ref.png | Bin 0 -> 268 bytes + 10 files changed, 383 insertions(+) + +commit 1d609d672273da494fd596606b59ab1c0010ae6d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 5 17:11:55 2009 +0100 + + [image] Treat A1 image surfaces as BILEVEL_ALPHA + + Categorise the transparency of FORMAT_A1 image surfaces as BILEVEL_ALPHA. + + src/cairo-image-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit aac132a76a2af3719088678295169f1962a555e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 24 10:14:36 2009 +0100 + + [image] Make _cairo_image_analayze_transparency() more format agnostic + + Use the content in preference to the format to determine + CAIRO_IMAGE_IS_OPAQUE/CAIRO_IMAGE_HAS_ALPHA. + + src/cairo-image-surface.c | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +commit 4be6de9fc6192d59c8d61e8edafed941e868a756 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 24 10:03:20 2009 +0100 + + [image] Return FORMAT_INVALID for an error surface. + + The default error value should be CAIRO_FORMAT_INVALID [-1] not 0 (which + corresponds to CAIRO_FORMAT_ARGB32). + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6675cf558719f81afe2a4331bc6adb3cda637a26 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 1 09:31:53 2009 +0100 + + [build] Add lcov-1.7 to known list + + build/configure.ac.analysis | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 526fcdb7e6cc8b522508762b1a68a5585fddf823 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 20 10:56:06 2009 +0100 + + [build] Enable shave support + + shave transforms the messy output of autotools into a pretty (quiet!) + Kbuild-like one. + + Lets see how controversial a simple change can be... + + build/.gitignore | 2 ++ + build/aclocal.dolt.m4 | 1 + + build/aclocal.shave.m4 | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ + build/shave-libtool.in | 69 +++++++++++++++++++++++++++++++++++++++++++ + build/shave.in | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 4 +++ + 6 files changed, 232 insertions(+) + +commit 1ae2ddc1dd4c90d50b8c57c4de677f8ab96b1fa2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 16 17:19:12 2009 +0100 + + [memfault] Manually inject faults when using stack allocations + + Ensure that no assumptions are made that a small allocation will succeed + by manually injecting faults when we may be simply allocating from an + embedded memory pool. + + The main advantage in manual fault injection is improved code coverage - + from within the test suite most allocations are handled by the embedded + memory pools. + + src/cairo-array.c | 3 +++ + src/cairo-bentley-ottmann.c | 3 +++ + src/cairo-gstate.c | 3 +++ + src/cairo-hull.c | 3 +++ + src/cairo-image-surface.c | 6 ++++++ + src/cairo-malloc-private.h | 7 +++++++ + src/cairo-misc.c | 3 +++ + src/cairo-path-stroke.c | 2 ++ + src/cairo-pattern.c | 9 +++++++++ + src/cairo-pen.c | 9 +++++++++ + src/cairo-polygon.c | 5 +++++ + src/cairo-scaled-font.c | 3 +++ + src/cairo-stroke-style.c | 3 +++ + src/cairo-traps.c | 5 +++++ + 14 files changed, 64 insertions(+) + +commit 817589e1967ebdd5e5bda1781eb76010fd8c37dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 16 13:01:52 2009 +0100 + + [test] Call FcInit() manually. + + Pre-initialise fontconfig whilst memfault is disabled to avoid a lot of + expensive, redundant testing of FcInit() throughout the test suite. + + test/cairo-test.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit be27e844c83c0f5cf25dee1c62768dbf70897a06 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 16 17:13:52 2009 +0100 + + [ft] Propagate status from font creation + + Return the true error status whel + _cairo_ft_unscaled_font_create_internal(). This ensures that the original + error is not masked and we are able to report the error during fontconfig + pattern resolution. + + src/cairo-ft-font.c | 90 ++++++++++++++++++++++++++++++----------------------- + 1 file changed, 51 insertions(+), 39 deletions(-) + +commit d46c56f18c8a93d3d50be9333292c7c9b0ac0a78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 16 13:00:59 2009 +0100 + + [ft] Check for pattern duplication failure. + + Check the return of FcPatternDuplicate() for failure, and propagate the + error. + + src/cairo-ft-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 50302f156dfba4dcb3639843d7eda819f2c6797c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 16 12:59:36 2009 +0100 + + [ft] Check (correctly!) for pattern duplication failure. + + Check the return from FcPatternDuplicate() for allocation failure (and not + the original pattern)! + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8bf109bd2a9c9bf755671185733def898a4f96f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 16 17:17:06 2009 +0100 + + [pattern] Silence compiler with impossible case. + + Assert that the pattern is one of the four known types, and return an + error so that the compiler knows that the local variable can not be used + uninitialised. + + src/cairo-pattern.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5a76c233bffda65140c6ada9b5f2ed7d3bcc999e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 14 11:02:40 2009 +0100 + + [type3] Propagate error from font creation. + + Perform an error check after creating a scaled-font to prevent operations + on a nil-object. + + src/cairo-type3-glyph-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit d46bd67c8b3f63d6286845e814f8f1e040f89737 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 10 14:55:24 2009 +0100 + + [type3] Add status checks. + + Propagate error from the stream when creating the surface and add status + guards before writing to the potential nil object. + + src/cairo-type3-glyph-surface.c | 26 +++++++++++++++++++++++--- + 1 file changed, 23 insertions(+), 3 deletions(-) + +commit a6ffb69a54f15659dac7c6b2e1c98bd7893ccdf1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 3 17:28:05 2009 +0100 + + [type3] Check error status before emit_image(). + + Be careful not to pass an error object down to emit_image() hook, + propagate the error instead. This relieves the burden of the error check + from the callee -- which was causing an assertion failure in the ps + backend. + + src/cairo-type3-glyph-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 21d1138da9bcf9c006e0cf3f3d1d50e1c7cec1de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 10 14:53:55 2009 +0100 + + [scaled-font-subsets] Check for malloc failure. + + Check that the utf8 string is successfully allocated before writing to it, + otherwise propagate the error status back to the callers. + + src/cairo-scaled-font-subsets.c | 63 +++++++++++++++++++++++------------------ + 1 file changed, 35 insertions(+), 28 deletions(-) + +commit 0f0e2d738437176e72317b37ef66fbc56c60ba93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 10 14:52:48 2009 +0100 + + [pdf] Propagate failure from type3 glyph surface creation. + + Add an early check that we successfully created the glyph surface. + + src/cairo-pdf-surface.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 1496c5cf51a2304dfd4e9d359a0645ff44fadd3e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 10 14:50:26 2009 +0100 + + [analysis] Use _cairo_region_init() + + Avoid secondary allocations of the thin region wrappers during surface + creation by embedding them into the parent structure. This has the + satisfactory side-effect of not requiring status checks which current code + lacks. + + src/cairo-analysis-surface.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit ad83765a1441cb369c3e7f3de77c243297406c7a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 3 09:23:58 2009 +0100 + + [xlib] Allocate bounded region on stack. + + Eliminate the extremely short-lived and oft unnecessary heap allocation + of the region by first checking to see whether the clip exceeds the + surface bounds and only then intersect the clip with a local + stack-allocated region. + + src/cairo-region.c | 23 +++++++++++++++++++ + src/cairo-xlib-surface.c | 58 +++++++++++++++++++++++++++++++----------------- + src/cairoint.h | 10 +++++++++ + 3 files changed, 71 insertions(+), 20 deletions(-) + +commit 75b06b8bdb5efaf030e063c1f66583d8fde347dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 1 11:43:16 2009 +0100 + + [pattern] Do not modify outparam on error path. + + The pdf backend was crashing as a failed pattern copy stored an invalid + pointer with the resource group. + + src/cairo-pattern.c | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit 82cccb26723697492504f395fed33afba28d84ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 14 11:01:39 2009 +0100 + + [test] Handle memfaults during surface-finish-twice + + Check and report memory allocation failures. + + test/surface-finish-twice.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit f12d52bfcae0792729b33a1fd1b2d23bd3fc7cf3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 4 19:02:15 2009 +0100 + + [test] Use xmalloc() to evade memfault. + + Do not use the simple malloc() as memfault will inject allocation failures + (unlike xmalloc() for which faults are excluded) - as this is unnecessary + inside the test harness and thus does not exercise any cairo code paths. + + test/show-glyphs-many.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ca501d99bbec432252cbb134d863801d4a792a44 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 1 11:41:59 2009 +0100 + + [test] Disable signal handling under valgrind + + Capturing and handling the signals prevents valgrind from providing + backtraces for fatal signals -- which is often more useful. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f8539726368141f8b42c7817cfd59b4abfce33f3 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Apr 7 14:50:25 2009 -0400 + + [win32] Fix building with libpng and zlib + + Include zlib and libpng dependencies using something like '$(cairo_dir)/../zlib/zdll.lib' + instead of just 'zdll.lib'. Also, do similarly for the headers. + + build/Makefile.win32.common | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 1798fc6607a89811929d1f21cc71c751438f5699 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 5 11:17:02 2009 +0930 + + Fix the TrueType subsetting fix in 9b496af5c + + Oops. + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fe97e815e81f4429889fd52bb525c260f9967356 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 5 01:04:12 2009 +1030 + + Fix TrueType subsetting bug + + Fix incorrect counting of arguments in composite glyphs + + src/cairo-truetype-subset-private.h | 2 +- + src/cairo-truetype-subset.c | 12 +++++++----- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 9b496af5c214283c297a52c90a04743f9da9f6a3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 5 00:44:02 2009 +1030 + + Fix buffer size check in TrueType subsetting + + Andrew Cowie reported a problem with the Charis SIL font being + embedded as a fallback font. + + The buffer size check for composite glyphs was incorrect causing the + subsetting to fail for some fonts. + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ba2ec8e1d9144c4a27917e59cb15039552eb008c +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Apr 1 13:29:12 2009 -0400 + + Remove trailing comma in cairo_region_overlap_t enum. + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d6336624c33e9c674c192b68eb501373a96dc87 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Apr 1 11:32:58 2009 -0400 + + [test-win32] Fix static linking of the test suite. + + Previously, the test suite needed to be dynamically linked to work. + + boilerplate/Makefile.win32 | 2 +- + test/Makefile.win32 | 9 ++++++--- + test/pdiff/Makefile.win32 | 2 +- + 3 files changed, 8 insertions(+), 5 deletions(-) + +commit 0f21893b0510a188439c2d8cd448bcfcf17ef8c6 +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Wed Apr 1 08:54:30 2009 -0400 + + [region] pixman_region32_contains_point() does not allow NULL for box + + src/cairo-region.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e46c1d7fa34b4ba89fc3e0fe6f3042a6fa8c0398 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 31 10:39:46 2009 +0100 + + [scaled-font-subset] Cleanup after failure to convert to utf16. + + Avoid leaking the local hashtable and strings after failing to convert the + string to utf16. + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 180b964aac4e058e6783778d33772f08e13b3669 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 31 10:37:44 2009 +0100 + + [scaled-font-subset] Propagate error from scaled-font to collection. + + Don't attempt to collect the sub_font if it is in error. + + src/cairo-scaled-font-subsets.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 8362c6f726979abc43ad9f7303bd45fcb03f83b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 31 10:36:08 2009 +0100 + + [type1] Fixup error path during write_charstrings() + + On the common error path we attempted to unlock a mutex that was not + always held, so reorder the error paths appropriately. + + src/cairo-type1-fallback.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 88956cd42e9cc03cb8b4ec730062993eaaf3938d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 31 10:35:24 2009 +0100 + + [ps] Check for error during stroking. + + Add a missing error status check that caused errors during stroke to be + masked. + + src/cairo-ps-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 043352aa8d1e3aeacf3b877f45e1bc451a676e15 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 31 10:34:41 2009 +0100 + + [pdf] Prevent leak of pad_image on error path. + + Ensure that the local pad_image is destroyed after an error. + + src/cairo-pdf-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b0689f56118dd8ccda6f29901d41cf8f80983aa0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 31 10:27:15 2009 +0100 + + Check for errors during get_mime_data() + + cairo_surface_get_mime_data() may raise an error on the surface, so we + need to check lest it goes unnoticed and we generate a corrupt file. + + src/cairo-pdf-surface.c | 2 ++ + src/cairo-ps-surface.c | 2 ++ + src/cairo-svg-surface.c | 2 ++ + 3 files changed, 6 insertions(+) + +commit 9f63cbb870892253f363ddb7aac908263672c8dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 19:09:13 2009 +0100 + + [pdf] Free compressed stream after error. + + Ensure that the compressed stream is destroyed after encountering an + error. + + src/cairo-pdf-surface.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit ba1a0fa601a817ff489bc5373af57977e41eb99f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 19:08:41 2009 +0100 + + [truetype] Free local names on failure. + + Ensure that all local allocations are freed on the error path. + + src/cairo-truetype-subset.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit edce97a750acf4368bd7249ec6b9a195f8584cdf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 16:50:51 2009 +0100 + + [pdf] Remove false assertion. + + The stream itself may be in an error state, so an error could be raised. + + src/cairo-pdf-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit b580a4a8d6c056ba8b47be32ea8c5b9a1d90d01e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 16:50:10 2009 +0100 + + [test] Improve fault injection coverage + + In order to exercise the meta-surfaces, we need to inject faults into + cairo_surface_finish(). + + boilerplate/cairo-boilerplate.c | 16 +++++++++++++--- + test/cairo-test.c | 35 +++++++++++++++++++++++++++++++++++ + 2 files changed, 48 insertions(+), 3 deletions(-) + +commit 80d5b53b474c94219c51ae16dcc19098a2d86165 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Tue Mar 31 05:47:44 2009 -0400 + + [region] Change name of cairo_region_empty() to cairo_region_is_empty() + + src/cairo-clip.c | 2 +- + src/cairo-region.c | 6 +++--- + src/cairo-surface-fallback.c | 2 +- + src/cairo.h | 2 +- + src/cairoint.h | 2 +- + 5 files changed, 7 insertions(+), 7 deletions(-) + +commit 77ee65fd03d06064be023f022d565c5038fe26df +Author: Jonathan Kew <jfkthame@gmail.com> +Date: Mon Mar 30 14:45:48 2009 -0400 + + [win32] Fix horizontal glyph positioning bug + + The _cairo_win32_scaled_font_backend version of show_glyphs collects + glyph runs to hand to ExtTextOutW until the y-offset changes, then flushes the + glyphs buffered so far. As each glyph is buffered, it also calculates and + buffers the dx value for the preceding glyph. + + However, when it sees a change in dy and decides to flush, it should *not* + append an entry to the dx buffer, as this would be the "dx" of the previous + glyph, and instead the new start_x value will be used for the new glyph run + that's being collected. This bug means that after any vertically-offset glyph, + the remaining glyphs in the run will get incorrect dx values (horizontal + escapement). + + Mozilla bug #475092 + + src/cairo-win32-font.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit aee71e2063b1d6d23cd8dcef7789c9cf106af32a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 13:41:00 2009 +0100 + + [test] Memfault checks. + + Don't assume an error means the test failed, check for injected allocation + errors. + + test/create-from-png.c | 164 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 113 insertions(+), 51 deletions(-) + +commit ea6197c2f5f04d5e8e8035a330c5199b37beb702 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 10:54:26 2009 +0100 + + [surface] Propagate region allocation failure. + + Propagate the error status from failing to allocate the region. + + src/cairo-surface.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +commit c35d226f7d3654b312e18068b8ccb47a51002a39 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 10:46:37 2009 +0100 + + [traps] Propagate allocation failure. + + Report failure to allocation region. + + src/cairo-traps.c | 23 ++++++++++------------- + 1 file changed, 10 insertions(+), 13 deletions(-) + +commit e238d10b30e18084bf07eb1643fdf48ef35467ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 10:22:18 2009 +0100 + + [region] Use const cairo_rectangle_int_t consistently. + + Add the const declaration to a couple of functions. + + src/cairo-region.c | 4 ++-- + src/cairo.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit de1612bdd767ca37e01938f8e41d9699531a49d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 10:17:49 2009 +0100 + + [region] Use _cairo_status_is_error + + Replace the open-coded version with the more readable macro. + + src/cairo-region.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f027405429d0133b2840c4b82bc553355fa5f3d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 10:12:41 2009 +0100 + + [region] Add leading underscore to private _cairo_region_set_error() + + Differentiate the private _cairo_region_set_error() function by using a + leading underscore. + + src/cairo-region.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit ed7188a471f73abcc4ca3e2a92685088134391c7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 30 10:07:48 2009 +0100 + + [region] Add slim_hidden_def. + + Fixes for check-plt.sh (and a few adjacent whitespace). + + src/cairo-region.c | 244 +++++++++++++++++++++++++++++------------------------ + 1 file changed, 133 insertions(+), 111 deletions(-) + +commit f31c6548f818e1d4e257d94d623705284bcc4274 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 28 19:26:03 2009 +0000 + + Silence compiler warnings for CAIRO_STATUS_LAST_STATUS + + Add ASSERT_NOT_REACHED (or similar) cases to the error handling switches + to silence the compiler. + + src/cairo-misc.c | 5 +++-- + src/cairo-spans.c | 2 ++ + src/cairo-surface.c | 1 + + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit 979337dd4da40abb2ea49968a2c01709d9046aab +Author: Eric Anholt <eric@anholt.net> +Date: Sat Mar 28 21:53:04 2009 -0700 + + [gl] Wire blend factors using dst alpha to constants for CAIRO_CONTENT_COLOR. + + This fixes the operator and operator-alpha tests to rgb24 destinations. + While we request an RGB texture, the returned texture has alpha bits, so when + we blend against it as a renderbuffer, we get the junk alpha values. Whether + or not this is a driver bug, we'll have this problem when we get visuals + with alpha bits for windows despite not requestiong alpha, so we have to + handle it in cairo. + + src/cairo-gl-surface.c | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 809f7dc4c83009f0a67bc8af0608b480bf7fb00e +Author: Eric Anholt <eric@anholt.net> +Date: Sat Mar 28 21:30:13 2009 -0700 + + [gl] Make sure test visuals for CAIRO_CONTENT_COLOR_ALPHA have alpha bits. + + Since we're just making FBOs, the visual chosen probably shouldn't matter, + and it doesn't on Intel. But it does seem like the right thing to do. + + boilerplate/cairo-boilerplate-gl.c | 25 ++++++++++++++++++------- + 1 file changed, 18 insertions(+), 7 deletions(-) + +commit 93c437d4b9261bc1ce3daf9cbd02d9cc4d2584cc +Author: Eric Anholt <eric@anholt.net> +Date: Sat Mar 28 20:59:01 2009 -0700 + + [gl] Use GLEW to detect required extension presence. + + configure.ac | 9 +++++++++ + src/cairo-gl-surface.c | 13 +++++++++++++ + 2 files changed, 22 insertions(+) + +commit 62d84847c3b857b8fd5aeea3f4b5c0f2f4c91625 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Sat Mar 28 03:58:51 2009 -0400 + + [region] Add documentation for all the new region methods. + + src/cairo-region.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++------- + src/cairo.h | 6 +- + 2 files changed, 232 insertions(+), 34 deletions(-) + +commit 980e9f0dbd4f21c0ccf4cc33b0b0f2f370667290 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Sat Mar 28 03:04:28 2009 -0400 + + [region] Fix status propagation for regions + + When an operation fails, store the status code in the destination + region rather than leaving it unchanged. + + src/cairo-region.c | 66 ++++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 52 insertions(+), 14 deletions(-) + +commit 64e490a464472cfe06d779503601d41972ed4518 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Sat Mar 28 01:10:24 2009 -0400 + + [region] Use signed ints for width and height in cairo_rectangle_int_t + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 26999e5aa8b5d353596e31d4b3823cafe007125c +Author: Søren Sandmann <sandmann@redhat.com> +Date: Fri Mar 27 08:48:42 2009 -0400 + + [region] Add cairo_region_intersect_rectangle() and _subtract_rectangle() + + Intersecting with and subtracting rectangles is quite common, and we + already have cairo_union_rectangle(). + + src/cairo-clip.c | 27 ++++----------------------- + src/cairo-region.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-surface.c | 9 +-------- + src/cairo.h | 11 ++++++++++- + src/cairoint.h | 2 ++ + 5 files changed, 61 insertions(+), 33 deletions(-) + +commit 4b3245481cfbf96388c140421a071fd1f79ad601 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Sat Feb 21 08:13:25 2009 -0500 + + [region] Expand rect to rectangle in a couple of names + + Specifically, + + cairo_region_union_rect -> cairo_region_union_rectangle + cairo_region_create_rect -> cairo_region_create_rectangle + + Also delete cairo_region_clear() which is not that useful. + + src/cairo-analysis-surface.c | 4 ++-- + src/cairo-clip.c | 4 ++-- + src/cairo-region.c | 16 +++------------- + src/cairo-surface-fallback.c | 2 +- + src/cairo-surface.c | 4 ++-- + src/cairo-traps.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo.h | 7 ++----- + src/cairoint.h | 5 ++--- + 9 files changed, 16 insertions(+), 30 deletions(-) + +commit bf6d9bc1758ac1971485b6565d29934d6b06bef2 +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Wed Feb 18 08:01:19 2009 -0500 + + [region] Delete cairo_region_create_rectangles() + + It was only used in _cairo_traps_extract_region() which could be + simplified significantly by calling cairo_region_union_rect() + repeatedly instead. + + src/cairo-region.c | 44 --------------------------------------- + src/cairo-traps.c | 60 +++++++++++++++++++++--------------------------------- + src/cairo.h | 4 ---- + src/cairoint.h | 1 - + 4 files changed, 23 insertions(+), 86 deletions(-) + +commit e6d82afcab01cc91b88185abc8d1bfb9df5c2c19 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Wed Feb 18 00:20:46 2009 -0500 + + [region] Add slim_hidden_proto for region functions + + src/cairoint.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit e29103c08189cab9de34f577951219a69bd7c8e2 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Wed Feb 18 00:11:35 2009 -0500 + + [region] Move region function prototypes to cairo.h along with helper types. + + Move struct _cairo_region to cairoint.h and delete + cairo-region-private.h. Delete cairo_private from the function + definitions that had it. + + src/Makefile.sources | 1 - + src/cairo-analysis-surface.c | 1 - + src/cairo-clip-private.h | 1 - + src/cairo-region-private.h | 128 ------------------------------------------- + src/cairo-region.c | 6 +- + src/cairo-types-private.h | 6 -- + src/cairo.h | 75 +++++++++++++++++++++++++ + src/cairoint.h | 6 +- + 8 files changed, 83 insertions(+), 141 deletions(-) + +commit 1cca5a1348d071a3c8e2ba9d3ba0d9670b9564f4 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Tue Feb 17 23:52:18 2009 -0500 + + [region] Remove underscores from _cairo_region_* + + src/cairo-analysis-surface.c | 18 ++++++------- + src/cairo-clip.c | 50 +++++++++++++++++------------------ + src/cairo-directfb-surface.c | 4 +-- + src/cairo-paginated-surface.c | 4 +-- + src/cairo-region-private.h | 36 ++++++++++++------------- + src/cairo-region.c | 61 +++++++++++++++++++++---------------------- + src/cairo-surface-fallback.c | 20 +++++++------- + src/cairo-surface.c | 14 +++++----- + src/cairo-traps.c | 10 +++---- + src/cairo-win32-surface.c | 8 +++--- + src/cairo-xcb-surface.c | 4 +-- + src/cairo-xlib-surface.c | 14 +++++----- + 12 files changed, 120 insertions(+), 123 deletions(-) + +commit fcdca966941f4f7cc908bd46df1ec9a6b0f757c1 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Tue Feb 17 22:52:50 2009 -0500 + + [region] Always define cairo_rectangle_int_t with ints + + Use ints in cairo_rectangle_int_t, no matter the fixed type. + + src/cairo-types-private.h | 38 +++++++++----------------------------- + 1 file changed, 9 insertions(+), 29 deletions(-) + +commit cfa7a384b730289233bef556fe1919f781eac684 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Tue Feb 17 23:40:02 2009 -0500 + + [region] Add _cairo_region_contains_point() + + src/cairo-region-private.h | 5 ++++- + src/cairo-region.c | 15 +++++++++++++-- + src/cairo.h | 1 + + 3 files changed, 18 insertions(+), 3 deletions(-) + +commit 15564d1949778124e553d792f85cae2b031aad45 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Tue Feb 17 05:58:34 2009 -0500 + + [region] Add _cairo_region_union + + src/cairo-region-private.h | 4 ++++ + src/cairo-region.c | 16 ++++++++++++++++ + 2 files changed, 20 insertions(+) + +commit df883aa937d2f3ecf52048b60caff48b1c9edac9 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Tue Feb 17 06:06:40 2009 -0500 + + [region] Add a cairo_region_overlap_t type + + src/cairo-analysis-surface.c | 4 ++-- + src/cairo-region-private.h | 8 +++++++- + src/cairo-region.c | 33 ++++++++++++++++++++++++--------- + 3 files changed, 33 insertions(+), 12 deletions(-) + +commit ebd0e685ae2d76c3af96d748a33a7194c70749f3 +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Mon Feb 16 05:41:31 2009 -0500 + + [region] Consistently use rectangles in the API of regions + + Usually, rectangles are more useful than boxes, so regions should only + expose rectangles in their public API. + + Specifically, + _cairo_region_num_boxes becomes _cairo_region_num_rectangles + _cairo_region_get_box becomes _cairo_region_get_rectangle + + Remove the cairo_box_int_t type + + src/cairo-clip.c | 22 ++++++++------------ + src/cairo-directfb-surface.c | 26 +++++++++++------------ + src/cairo-paginated-surface.c | 34 +++++++++++++++--------------- + src/cairo-region-private.h | 14 ++++++------- + src/cairo-region.c | 28 ++++++++++++------------- + src/cairo-surface-fallback.c | 2 +- + src/cairo-surface.c | 25 ++++++++-------------- + src/cairo-traps.c | 31 ++++++++++++++-------------- + src/cairo-types-private.h | 6 ------ + src/cairo-win32-surface.c | 48 +++++++++++++++++++++---------------------- + src/cairo-xcb-surface.c | 24 +++++++++++----------- + src/cairo-xlib-surface.c | 29 +++++++++++++------------- + 12 files changed, 134 insertions(+), 155 deletions(-) + +commit c29aeee2d3569cd43e88adc05662bb6306987b8b +Author: Søren Sandmann <sandmann@redhat.com> +Date: Thu Dec 11 18:37:40 2008 -0500 + + [region] Change sense of _cairo_region_not_empty() to _cairo_region_empty() + + Having "not" in the name causes double negatives. + + src/cairo-clip.c | 2 +- + src/cairo-region-private.h | 2 +- + src/cairo-region.c | 6 +++--- + src/cairo-surface-fallback.c | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit c88321d0a2b9d200b2044674d02fa0683feca74c +Author: Søren Sandmann <sandmann@redhat.com> +Date: Thu Dec 11 16:20:23 2008 -0500 + + [region] Miscellaneous bug fixes. + + - Initialize region->status in _cairo_region_create_boxes() + - Make _cairo_region_copy() actually return a region. + - Fix a bug where a NULL region could be dereferenced + + Also add an assertion that the result of cairo_region_copy() is never + NULL. + + src/cairo-clip.c | 2 ++ + src/cairo-image-surface.c | 2 +- + src/cairo-region.c | 4 +++- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit 93b285dc2c9c9ec486e0096933c3611f73374fcb +Author: Søren Sandmann <sandmann@redhat.com> +Date: Thu Dec 11 15:50:15 2008 -0500 + + [region] Get rid of clip->has_region + + src/cairo-clip-private.h | 1 - + src/cairo-clip.c | 36 +++++++++++++++--------------------- + src/cairo-surface.c | 2 +- + 3 files changed, 16 insertions(+), 23 deletions(-) + +commit e3e1b35eb9eb3cf90d882a7452580f9efe00b89a +Author: Søren Sandmann <sandmann@redhat.com> +Date: Thu Dec 11 15:29:23 2008 -0500 + + [region] Make cairo_region_t a malloced object. + + src/cairo-analysis-surface.c | 26 ++++--- + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 99 +++++++++++++------------ + src/cairo-region-private.h | 42 +++++------ + src/cairo-region.c | 168 ++++++++++++++++++++++++++++++++++--------- + src/cairo-surface-fallback.c | 65 ++++++++--------- + src/cairo-surface.c | 29 ++++---- + src/cairo-traps.c | 14 ++-- + src/cairo-xlib-surface.c | 16 ++--- + src/cairoint.h | 2 +- + 10 files changed, 280 insertions(+), 183 deletions(-) + +commit c2c637cf1d89fc8fdcced4467d602a55ef0b14e0 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Sat Mar 28 04:26:10 2009 -0400 + + Simplify _cairo_clip_intersect_region() + + The intermediate intersection region is not necessary because if the + operation fails, clip->region will end up as a pixman error region. + + src/cairo-clip.c | 19 +++++-------------- + 1 file changed, 5 insertions(+), 14 deletions(-) + +commit fe10cd6467f2ec58532dc7c713bb6d08dab08442 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Fri Mar 27 07:10:21 2009 +0100 + + [spline] fix wrong sign in _cairo_spline_bound. + + src/cairo-spline.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53107de63a954105f8820e5b96e2a1956cb7af8c +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Thu Mar 26 04:56:27 2009 +0100 + + [in_fill] Correctly track current point in curve_to. + + When discarding a bezier path segment, we still need to update the + current point. + + src/cairo-path-in-fill.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 578b06a978d51dc3d1d844ee7eea9ddd8329cc8d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 23 10:56:43 2009 +0000 + + [perf] Use CAIRO_LDFLAGS + + Use CAIRO_LDFLAGS in order to pull in additional link options, such as + --coverage. + + perf/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit ac30ced6135c5cf0fb34a67fe8f863030c1fbeb9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 22 19:02:27 2009 +0000 + + [test] Check for surface create failure. + + If the image surface creation fails, the data pointer will be NULL leading + to a segfault -- so check! + + test/user-font-mask.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit b5a4a2c4b1b1bab25e2ff0842e3c27205ec73d51 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 22 19:00:04 2009 +0000 + + [test] Early test for memfault. + + Check the error status within after each iteration in + solid-pattern-cache-stress. + + test/solid-pattern-cache-stress.c | 41 ++++++++++++++++++++++++++++----------- + 1 file changed, 30 insertions(+), 11 deletions(-) + +commit 1a7b94f934f8c9a25e60d9466651b0b7fb919656 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 20 11:06:29 2009 +0000 + + [test] Check for errors during get-path-extents. + + Need to check that an error was not raised on the context before checking + whether the extents match expectations. + + test/get-path-extents.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 3b545330887209c68128fca0d1bb40bf4927c2a6 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Mar 21 11:56:18 2009 -0700 + + [win32] Use _hypot instead of hypot + + The hypot symbol is deprecated on Win32, and nonexistent on Windows CE + + src/cairo-compiler-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 895fce1632069ddfb8c581d2b23b1b3552e35104 +Author: Stefan Klug <Klug.Stefan@gmx.de> +Date: Fri Mar 20 17:20:22 2009 -0400 + + [wince] Use the official _WIN32_WCE define instead of WINCE + + src/cairo-misc.c | 4 ++-- + src/cairoint.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 86a935de42318c4be92a657ce8e8c452693d4414 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri Mar 20 17:14:08 2009 -0400 + + [msvc] Fix definition of CAIRO_ENSURE_UNIQUE for non-x86 + + The current definition of CAIRO_ENSURE_UNIQUE uses x86 assembly so make sure we + only compile it when targeting x86. + + src/cairo-compiler-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c932a809d6484503d7ee267d934bbc87c8d44092 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 17 12:01:13 2009 +0000 + + [test] Propagate allocation failure. + + Check for memfaults during rel-path test. + + test/rel-path.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +commit 7db55b37d4aef188e04771b45076f6735507c209 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 17 11:58:16 2009 +0000 + + [test] Destroy pattern on error paths. + + Destroy the pattern after encountering an error in pattern-getters test. + + test/pattern-getters.c | 29 +++++++++++++++++++++++++---- + 1 file changed, 25 insertions(+), 4 deletions(-) + +commit dc176d88ac03ae71fc32abb27329a35650801d99 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 17 10:42:37 2009 +0000 + + [test] Trivial leak on error in show-glyphs-many. + + Free the allocated glyph array after failure. + + test/show-glyphs-many.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit a4b44ca89eb9975e6af2913e50ec3c3eb566cfdd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 17 14:56:42 2009 +0000 + + [pattern] Report the true error status from getters. + + As the getters actually return an error status, use it to report any + pre-existing error status on the pattern. + + src/cairo-pattern.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 496bbcf58233ceecfffc52ae5b1a3a1f07516c67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 17 19:46:25 2009 -0400 + + Make CAIRO_STATUS_LAST_STATUS public + + doc/public/tmpl/cairo-status.sgml | 1 + + src/cairo.h | 12 ++++++++++-- + src/cairoint.h | 6 ------ + 3 files changed, 11 insertions(+), 8 deletions(-) + +commit 922c108365b940dbabf23358189bbaa8602446c9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 17 19:22:31 2009 -0400 + + [twin] Reorganize matching code to better reflect the code in Pango + + Makes it easier to update later. + + src/cairo-font-face-twin.c | 179 +++++++++++++++++++++++++++++++++------------ + src/cairoint.h | 4 + + 2 files changed, 138 insertions(+), 45 deletions(-) + +commit 2b4044a36f8b156ca0e58b72614659324a9b022e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 17 18:52:16 2009 -0400 + + [twin] Update parsed weights and stretches from Pango + + src/cairo-font-face-twin.c | 64 ++++++++++++++++++++++++++++------------------ + 1 file changed, 39 insertions(+), 25 deletions(-) + +commit 3ec94f9b5917b8f71304c982bd153e5a810f3b12 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 17 00:53:30 2009 -0400 + + Support compiling without fontconfig + + Adds a new, fake, fontconfig font backend. Fontconfig can be disabled + using --disable-fc, in which case the toy text API wont find fonts and + the internal font will always be used. + + Also defines the feature macro CAIRO_HAS_FC_FONT. The two fontconfig-specific + functions in cairo-ft.h depend on that macro now. + + boilerplate/Makefile.win32.features | 10 +++++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + build/configure.ac.features | 1 + + configure.ac | 26 ++++++++++++++-------- + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-ft.sgml | 9 ++++++++ + doc/public/tmpl/cairo-status.sgml | 2 +- + src/Makefile.win32.features | 14 ++++++++++++ + src/cairo-ft-font.c | 43 +++++++++++++++++++++++++++++++------ + src/cairo-ft.h | 23 +++++++++++++------- + src/cairo-os2-surface.c | 6 ++++-- + src/cairo-path-fixed.c | 2 +- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-xlib-display.c | 2 -- + src/cairo-xlib-screen.c | 23 +++++++++----------- + 16 files changed, 125 insertions(+), 45 deletions(-) + +commit 0e7bcb5e3793771d50f7d391d7b1e538ef220a80 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 16 21:32:44 2009 +0000 + + [scaled-font] Improve comments. + + Grr. I thought I had merged this in with the previous commit... + + src/cairo-scaled-font.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9c80392ac415e7f07c71261d280ac4376d3c8471 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 16 19:31:38 2009 +0000 + + [scaled-font] Lean and mean global glyph cache. + + Jeff Muizelaar pointed out that the severe overallocation implicit in the + current version of the glyph cache is obnoxious and prevents him from + accepting the trunk into Mozilla. Jeff captured a trace of scaled font + and glyph usage during a tp run and presented his analysis in + http://lists.cairographics.org/archives/cairo/2009-March/016706.html + + Using that data, the design was changed to allocate pages of glyphs from a + capped global pool but with per-font hash tables. This should allow the + glyph cache to have tight memory bounds with fair allocation according to + usage. Note that both the old design and the 1.8 glyph cache had + essentially unbounded memory constraints, since each scaled font could + cache up to 256 glyphs (1.8) or had a reserved page (old), with no limit + on the number of active fonts. Currently the eviction policy is a simple + random strategy, this gives a 'fair' allotment of the cache, but a LRU + variant might perform better. + + On a sample run of firefox-3.0.7 perusing BBC news in 32 languages: + 1.8: cache allocation 8190x, ~1.2 MiB; elapsed 88.2s + old: cache allocation 771x, ~13.8 MiB; elapsed 81.7s + lean: cache allocation 433x, ~1.8 MiB; elapsed 82.4s + + src/cairo-cache-private.h | 5 +- + src/cairo-cache.c | 39 ++-- + src/cairo-ft-font.c | 4 +- + src/cairo-hash-private.h | 6 +- + src/cairo-hash.c | 55 ------ + src/cairo-scaled-font-private.h | 6 +- + src/cairo-scaled-font.c | 396 ++++++++++++++++++++-------------------- + src/cairo-types-private.h | 3 + + src/cairoint.h | 7 +- + 9 files changed, 232 insertions(+), 289 deletions(-) + +commit 121d4bb656755b7ca89065bf87e3e4e47c49c89d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 16 19:42:47 2009 +0000 + + [scaled-font] Initialise original_font_face + + Eek, attempting to use+free an uninitialised pointer! + + src/cairo-scaled-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit 2df498ba452b188f2f40413c91fec5e5ed9cf967 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Mar 5 23:26:44 2009 -0800 + + [gl] Use triangle fan instead of GL_QUADS for the single quad we draw. + + This saves the driver from converting the quad into tris on its own. We'd + rather be able to specify a rect as 2-3 points and use the rectangular + rendering feature that most of our hardware has, if it was possible, but + it isn't exposed in GL. + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9099c7e7307a39bc630919faa65bba089fd15104 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 4 09:26:17 2009 +0000 + + [trace] Disable mark dirty tracing. + + Applications like firefox have a very conservative approach and mark + surfaces dirty before every render. As we record the image data every + time, firefox traces can grow very large with redundant data - so allow + the user to disable mark dirty tracing. + + util/cairo-trace/cairo-trace.in | 19 +++++++++++++++---- + util/cairo-trace/trace.c | 27 ++++++++++++++++++++------- + 2 files changed, 35 insertions(+), 11 deletions(-) + +commit addeb32c751ac080fe634ea6f83076d018944e4a +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Mar 3 12:20:47 2009 -0500 + + [pdf] Intialize 'interpolate' + + Intialize 'interpolate' to prevent a gcc warning. Do this instead of adding a + 'default' case to the switch statement so that we still get warnings if new + filter types are added. + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a8158d443e6a4bafae28a46b883cbdcfd5789eec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 3 11:21:35 2009 +0000 + + [truetype] Move the sizeof asserts to compile time. + + Eliminate the need for a runtime test on the sizeof the private structures + by performing the check at compile time. This was provoked by Ginn Chenn + noting that the test was including a private header. + + src/cairo-truetype-subset.c | 15 +++++++++++ + test/Makefile.sources | 1 - + test/truetype-tables.c | 63 --------------------------------------------- + 3 files changed, 15 insertions(+), 64 deletions(-) + +commit e4b1f871e9cbb04590df5dc6f6f7854642fa0340 +Author: Ginn Chen <Ginn.Chen@Sun.COM> +Date: Tue Mar 3 10:27:11 2009 +0000 + + [configure] Detect mkdir variant with non-gcc compilers. + + It doesn't work for non GCC compiler right now, as "-Werror -Wall" is + an error to non GCC compiler. + + I swapped the sequence of build/configure.ac.system and build/ + configure.ac.warnings, then WARN_CFLAGS can be used. + + build/configure.ac.system | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit f178f55e47013a92a47a24ac04b1041963b03976 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 3 10:25:05 2009 +0000 + + [test/any2ppm] Update the cairo-script-interpreter callback. + + Reflect the current prototype which now specifies the content to use when + creating the surface. + + test/any2ppm.c | 1 + + 1 file changed, 1 insertion(+) + +commit 694f2eea9feecfdc437e6964d1e758fab7315af9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 3 10:24:25 2009 +0000 + + [test/any2ppm] Add feature checks for daemon() + + Add the feature checks for the presence of the daemon() function call. + + test/any2ppm.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 9304984f4e20beec7b4de6a4141e2fd489130006 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 1 10:10:24 2009 +0000 + + [path] Fix regression introduced with 005436 + + The order of the multiplication of the CTM and device_transform was + reversed. + + src/cairo-path.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b30de64a8ca3de7632696f45bdb580217bd9f8a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 1 10:05:16 2009 +0000 + + [test] Add regression test for 005436 + + Jeff Muizelaar found a regression in commit 005436 and submitted this + little test to exercise it. The essence of the bug appears to be wrt to + the product of the CTM and device transform matrices. + + test/Makefile.sources | 1 + + test/path-append.c | 81 +++++++++++++++++++++++++++++++++ + test/path-append.ps.ref.png | Bin 0 -> 4516 bytes + test/path-append.ref.png | Bin 0 -> 6165 bytes + test/path-append.test-fallback.ref.png | Bin 0 -> 6461 bytes + test/path-append.xlib-fallback.ref.png | Bin 0 -> 6357 bytes + test/path-append.xlib.ref.png | Bin 0 -> 6461 bytes + 7 files changed, 82 insertions(+) + +commit e20f1a0c76f2185760ca3a7466e25de6beedeaac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 27 16:30:05 2009 +0000 + + [in-fill] Close the path, cf fill() + + In order for in-fill treat the path equivalently to a fill, we need to + close the path after interpretation. + + src/cairo-path-in-fill.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 102ddd37bb329d41241f434ede0f9cba8424e71e +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 26 16:04:49 2009 -0500 + + [win32] Include $(OPT) flags when linking cairo.dll + + This will pass in -Zi which causes the /DEBUG flag to be passed to the + linker keeping the debug information from being discarded during link. + + src/Makefile.win32 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eb2a73ba6d290497cabb0f917c0375eea919178e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 24 20:27:36 2009 +0000 + + [ps] Check the status of _cairo_type3_glyph_surface_create() + + Doing so serves two purposes. The first is to do an early error check and + the second is to clearly initialise the status variable. + + src/cairo-ps-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6eb0a9d97ff7eaaee69ca10e4081cb950a543ce3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 15 21:27:29 2009 +0000 + + [scaled-font] Hold reference to original font face + + As noted by Carl during his LCA talk, caching of toy fonts was broken + because we create the scaled font using the implementation font face and + lose the reference to the containing font face that is cached by the toy + font face create routines. So the toy fonts were not being preserved for + the duration of the holdover scaled fonts and we recreated a new font + face, new scaled font and new glyph caches every time we needed a font. + + src/cairo-ft-font.c | 2 +- + src/cairo-scaled-font-private.h | 2 ++ + src/cairo-scaled-font.c | 17 +++++++++++++---- + src/cairo-toy-font-face.c | 1 + + 4 files changed, 17 insertions(+), 5 deletions(-) + +commit fe7d5323f5bc734e76179b74d68fcba9b924ba94 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 19 16:00:17 2009 -0500 + + Relanding: Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error() + + When using MSVC, _cairo_error() can be folded into other identical functions. + If that happens, _cairo_error isn't really useful anymore. Using the + CAIRO_ENSURE_UNIQUE macro makes sure this doesn't happen. + + Use __asm to serve as a line delimiter. This allows us to use the + __asm{} block in a macro. + + src/cairo-compiler-private.h | 24 ++++++++++++++++++++++++ + src/cairo.c | 1 + + 2 files changed, 25 insertions(+) + +commit 78de0e045ec0c10708052ed48df228e786839ddb +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 19 15:45:11 2009 -0500 + + Revert "Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error()" + + This reverts commit 126824f5e6279f56dab0c040394b6c326b848cf7. + + It turns out MSVC doesn't handle line continuation characters in __asm{} + blocks very well, so revert for now until I come up with something that + works. + + src/cairo-compiler-private.h | 24 ------------------------ + src/cairo.c | 1 - + 2 files changed, 25 deletions(-) + +commit 126824f5e6279f56dab0c040394b6c326b848cf7 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 19 13:31:55 2009 -0500 + + Add CAIRO_ENSURE_UNIQUE macro and use it in _cairo_error() + + When using MSVC, _cairo_error() can be folded into other identical functions. If + that happens, _cairo_error isn't really useful anymore. Using the + CAIRO_ENSURE_UNIQUE macro makes sure this doesn't happen. + + src/cairo-compiler-private.h | 24 ++++++++++++++++++++++++ + src/cairo.c | 1 + + 2 files changed, 25 insertions(+) + +commit d4227fc9126ffbb3a967aea1bc9795e7e64ee8e1 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 19 11:45:14 2009 -0500 + + [test] Fix assert on default font family in toy-font-face + + toy-font-face was checking that cairo_toy_font_face_get_family returned "" + which is CAIRO_FONT_FAMILY_DEFAULT when the freetype font backend is the + default. However, when other font backends are the default the returned family + is different. Therefore, instead of checking for "", we check for the appropriate + string depending on the backend. + + test/toy-font-face.c | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +commit 06fa7a8386b267fdbd7635b952adc75a58f62584 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Feb 18 18:43:29 2009 -0500 + + Fix a const warning in _cairo_user_data_array_foreach() + + _cairo_user_data_array_foreach() was taking a function + with a void *key parameter instead of a const void *key + to match cairo_user_data_slot_t. + + src/cairo-array.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairoint.h | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit f7b3c9df5885a1cd7981ee12b91962bdbfff47af +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Feb 16 22:28:32 2009 -0500 + + Add test/Makefile.sources + + This lets test/Makefile.am and test/Makefile.win32 share a common list of sources. + It also makes test/Makefile.win32 useful again. + + test/Makefile.am | 251 ++++---------------------------------------------- + test/Makefile.sources | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++ + test/Makefile.win32 | 125 +++++-------------------- + 3 files changed, 293 insertions(+), 334 deletions(-) + +commit e380beae5382df547a1b538de94e90c0e2339141 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Feb 16 14:01:43 2009 +0200 + + [sdl] Remove new backend. + + The SDL backend makes invalid assumptions about SDL_Surface locking + semantics and doesn't deal correctly with the unpremultiplied pixel + format supported by SDL. Removed as per discussion on the mailing list. + + http://lists.cairographics.org/archives/cairo/2009-February/016595.html + + boilerplate/Makefile.sources | 3 - + boilerplate/Makefile.win32.features | 10 - + boilerplate/cairo-boilerplate-sdl-private.h | 56 ---- + boilerplate/cairo-boilerplate-sdl.c | 69 ----- + boilerplate/cairo-boilerplate.c | 15 - + build/Makefile.win32.features | 1 - + build/Makefile.win32.features-h | 3 - + build/configure.ac.features | 1 - + configure.ac | 8 - + doc/public/tmpl/cairo-surface.sgml | 1 - + perf/Makefile.am | 4 - + perf/cairo-perf.c | 4 - + src/Makefile.sources | 3 - + src/Makefile.win32.features | 14 - + src/cairo-sdl-surface.c | 418 ---------------------------- + src/cairo-sdl.h | 54 ---- + src/cairo.h | 2 - + test/Makefile.am | 4 - + test/cairo-test-runner.c | 4 - + test/get-clip.c | 1 - + 20 files changed, 675 deletions(-) + +commit 79a72e63585d7fce7898f2c8bd997c6d88f8895f +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Mon Feb 16 05:44:15 2009 -0500 + + Delete _cairo_region_boxes_fini() + + src/cairo-region.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit f6daa664c1b2c894ba3baf2e7a72566bda1fd636 +Author: Søren Sandmann <sandmann@daimi.au.dk> +Date: Sun Feb 15 18:55:17 2009 -0500 + + Delete _cairo_region_get_boxes() in favor of _cairo_region_get_box() + + The _cairo_region_get_boxes() interface was difficult to use and often + caused unnecessary memory allocation. With _cairo_region_get_box() it + is possible to access the boxes of a region without allocating a big + temporary array. + + src/cairo-clip.c | 21 ++++++++----------- + src/cairo-directfb-surface.c | 21 ++++++++----------- + src/cairo-paginated-surface.c | 19 ++++++++--------- + src/cairo-region-private.h | 10 +++------ + src/cairo-region.c | 39 +++++++++-------------------------- + src/cairo-sdl-surface.c | 21 ++++++++----------- + src/cairo-surface.c | 44 +++++++++++++++------------------------ + src/cairo-win32-surface.c | 48 +++++++++++++++++++++---------------------- + src/cairo-xcb-surface.c | 26 ++++++++++------------- + src/cairo-xlib-surface.c | 31 ++++++++++++---------------- + 10 files changed, 112 insertions(+), 168 deletions(-) + +commit 54228cb5fe0c41b10f0ec4a206b5fac28823cde6 +Author: Eric Anholt <eric@anholt.net> +Date: Sun Feb 15 14:29:55 2009 -0800 + + [gl] Use textures and not fbo-based surfaces for image surface patterns. + + This cuts the BO allocation overhead for traps in more than half, and reduces + the load on the accelerator. + + src/cairo-gl-surface.c | 191 +++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 176 insertions(+), 15 deletions(-) + +commit fcb13d262c5a09e56dc25c76103ef4ba623929ff +Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk> +Date: Sun Feb 15 15:59:10 2009 -0500 + + Simplify region handling in xlib surface + + src/cairo-xlib-surface.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit b43e7aee98a8d69677f7e6d2584fe01f550f896b +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri Feb 13 12:15:23 2009 -0500 + + [wince] We don't need cairo_win32_tmpfile on Windows CE + + _cairo_win32_tmpfile() uses _open_osfhandle() which is not available + on Windows CE. However, Windows CE doesn't have the permisions problems + that necessitated _cairo_win32_tmpfile() in the first place so we can just + use tmpfile() on Windows CE. + + src/cairo-misc.c | 5 ++++- + src/cairoint.h | 2 +- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit fa66291c8862ed592fca469ceab0ac9b1d270835 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 28 14:22:58 2009 +0000 + + [perf] Test non-antialiased fill. + + Just because the i915 can special case such fills using a single-pass + tessellation in the stencil buffer. + + perf/fill.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit aab9ed3432f0ea7b8b24990de4aa134bb599a3e5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 30 10:22:47 2009 +0000 + + [perf] Env variable to ignore similar targets whilst benchmarking. + + Use CAIRO_TEST_IGNORE_SIMILAR to skip similar targets. + + perf/cairo-perf.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 655f6987334b991763a5ab7746dbfd73c6b05f3e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 6 20:11:17 2009 +0000 + + [perf] Split can_run? into a separate precondition. + + Allow tests to skip unnecessary setup when pruning the list of perf cases. + + perf/box-outline.c | 3 +++ + perf/cairo-perf.c | 24 ++++++++++++++++-------- + perf/cairo-perf.h | 4 ++++ + perf/composite-checker.c | 3 +++ + perf/dragon.c | 3 +++ + perf/fill.c | 3 +++ + perf/intersections.c | 3 +++ + perf/long-dashed-lines.c | 3 +++ + perf/long-lines.c | 3 +++ + perf/mosaic.c | 3 +++ + perf/paint-with-alpha.c | 3 +++ + perf/paint.c | 3 +++ + perf/pattern_create_radial.c | 3 +++ + perf/pythagoras-tree.c | 3 +++ + perf/rectangles.c | 3 +++ + perf/rounded-rectangles.c | 3 +++ + perf/spiral.c | 3 +++ + perf/stroke.c | 3 +++ + perf/subimage_copy.c | 3 +++ + perf/tessellate.c | 3 +++ + perf/text.c | 3 +++ + perf/twin.c | 3 +++ + perf/unaligned-clip.c | 3 +++ + perf/world-map.c | 3 +++ + perf/zrusin.c | 3 +++ + 25 files changed, 89 insertions(+), 8 deletions(-) + +commit 798581a1b5a8a56ce9d16c5b21eab82851061732 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 30 22:12:49 2009 +0000 + + [perf] Extend range of testing. + + Primarily to test longer glyph runs, but also test large upper bounds for + strokes and fills. + + perf/cairo-perf.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 1522fac5c71708fc9e98e03da9f51926c1e3769c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 3 17:18:53 2009 +0000 + + [perf] Fix infinite loop in text + + The row would wrap-around with the character index, causing an infinite + loop when trying to fill a window of size 512x512 and above. + + perf/text.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 187e3473512e40fa1d046783e797ec3a198b09b2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 13 13:09:32 2009 +0000 + + [test] Free ref_name in fallback-resolution. + + Trivial leak of a few thousand bytes. + + test/fallback-resolution.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 005436758c5679f76cc462841678fb93d6c7e0ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 3 10:20:26 2009 +0000 + + [path] Inline path ops during append_to_context() + + By inlining the operations, and most significantly, precomputing the + combined user-to-backend matrix, we can achieve a speed up of over 50%, + which is a noticeable performance boost in swfdec - where append-to-path + accounts for over 35% [inclusive] of the time for a h/w accelerated + backend. + + src/cairo-path.c | 76 ++++++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 58 insertions(+), 18 deletions(-) + +commit d295942b9d4da3be3318cd5fe2d3b0b1fe005d11 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 31 00:56:45 2009 +0000 + + Inline _cairo_restrict_value() + + This is one instance where the function call overhead dominated the + function call in both time and size. + + src/cairo-misc.c | 9 --------- + src/cairo-pattern.c | 32 ++++++++++++++++---------------- + src/cairo.c | 14 ++++++++------ + src/cairoint.h | 13 +++++++++++-- + 4 files changed, 35 insertions(+), 33 deletions(-) + +commit cc8a09567ca034e7d95e2ef8a3ec833b12c9f87a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 13 13:23:50 2009 +0000 + + [surface] Move the meta-data copy-on-snapshot to the generic layer. + + As pointed out by Paolo Bonzini, copying the meta data for a snapshot is + common for all backends and so should be handled by the generic layer. + + src/cairo-surface-fallback.c | 11 ----------- + src/cairo-surface.c | 30 +++++++++++++++++++++++++++--- + 2 files changed, 27 insertions(+), 14 deletions(-) + +commit adaf70a93f4449e85997bcde531b76c9044758ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 13 12:56:46 2009 +0000 + + [surface] Separate the mime-data from the user-data. + + Move the mime-data into its own array so that it cannot be confused with + user-data and we do not need to hard-code the copy list during + snapshotting. The copy-on-snapshotting code becomes far simpler and will + accommodate all future mime-types. + + Keeping mime-data separate from user-data is important due to the + principle of least surprise - the API is different and so it would be + surprising if you queried for user-data and were returned an opaque + mime-data pointer, and vice versa. (Note this should have been prevented + by using interned strings, but conceptually it is cleaner to make the + separation.) Also it aides in trimming the user data arrays which are + linearly searched. + + Based on the original patch by Adrian Johnson: + http://cgit.freedesktop.org/~ajohnson/cairo/commit/?h=metadata&id=37e607cc777523ad12a2d214708d79ecbca5b380 + + src/cairo-array.c | 36 ++++++++++++++++++++++++++++++++++++ + src/cairo-surface-fallback.c | 27 +++++++-------------------- + src/cairo-surface-private.h | 1 + + src/cairo-surface.c | 42 +++++++++++++++++++++--------------------- + src/cairoint.h | 14 ++++++++++++-- + 5 files changed, 77 insertions(+), 43 deletions(-) + +commit 2280de9d0282a599309ec12dc576bae54857f873 +Merge: 17ce858 de7270c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 13 10:08:21 2009 +0000 + + Merge branch '1.8' + +commit de7270cb1e9510cb230e80045c812fa68fcfa585 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 13 10:03:22 2009 +0000 + + [cairo] Describe the restrictions upon cairo_set_tolerance() + + Truc Troung reported that the behaviour of + cairo_set_tolerance()/cairo_get_tolerance() was inconsistent with the + documentation, i.e. we failed to mention that the tolerance would be + restricted to the smalled fixed-point value. + + Add a sentence to the documentation that describes the restriction without + mentioning what that is... Hopefully that is sufficient detail to + accommodate the reporter, without exposing internal implementation details. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=20095 + Bug 20095 - The cairo_set_tolerance() function behavior is inconsistency + with the spec + + src/cairo.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 17ce8584e7142d13bd7a777c9570e5548a06a90c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 12 18:26:57 2009 +0000 + + [NEWS] Add API changes. + + Scan the public headers for obvious additions. + + NEWS | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +commit 2df611a3810eb64c8ed22dfae5f3d3157eef7e6a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 10 10:28:28 2009 +0000 + + [script] Expose a normal xlib window for replay + + Provide a visible surface for replaying scripts against. + + util/cairo-script/csi-replay.c | 122 ++++++++++++++++++++++------------------- + 1 file changed, 66 insertions(+), 56 deletions(-) + +commit 8e1f103540392b17c51b4fb4b3c3480430cbc212 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 12 12:02:17 2009 -0500 + + Divert pclose to _pclose for MSVC + + Commit bf62798b1284533e28b78717dac8070ca6d29e54 added a diversion for + popen but not for pclose. This is needed for linking the boilerplate + with the test suite. + + src/cairo-compiler-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 4c6e7a16032fb223f4224d4355c2ea046cd8fc4b +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 11 05:09:23 2009 -0800 + + [gl] Add support for constant color directly, not through a texture. + + src/cairo-gl-surface.c | 337 ++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 248 insertions(+), 89 deletions(-) + +commit 31fb7382d22c9293c093b60716ee4e393fa0d5cf +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 11 05:09:51 2009 -0800 + + [gl] Fix some memory leaks on boilerplate-based runs. + + boilerplate/cairo-boilerplate-gl.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit df96fc1f92b68ef3e76750d0891377980e039b09 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Feb 9 15:42:09 2009 -0800 + + [gl] Avoid re-binding the same draw buffer. + + The driver could be smarter and avoid a lot of the cost, but this is easy + and avoids needing much driver smarts. + + src/cairo-gl-surface.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +commit fb6937565be558e7ff8ba3dd815a427721783cba +Author: Eric Anholt <eric@anholt.net> +Date: Mon Feb 9 15:30:21 2009 -0800 + + [gl] Add interface for creating surfaces from window backbuffers. + + src/cairo-gl-surface.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++--- + src/cairo-gl.h | 9 +++--- + 2 files changed, 85 insertions(+), 9 deletions(-) + +commit 6cc3d8dcc0fe418c56a519180163bd49fbdb9730 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Feb 9 12:30:20 2009 -0800 + + [gl] Fix unantialiased-shapes tests. + + src/cairo-gl-surface.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 23a8c58dc13bd9ff44f235bee8e4e7240831728a +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 5 11:00:59 2009 -0800 + + [gl] Fix infinite recursion on compositing A1 images. + + We could do this fast, but let's do it correct first. + + src/cairo-gl-surface.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit b6dde667fa1c72c6da1970244c4f28c48a38f493 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Feb 2 23:22:49 2009 -0800 + + [gl] Add support for composite and composite_trapezoids. + + This is a simple implementation that uses GL_ARB_texture_env_combine after + converting everything to GL surfaces (FBOs). + + src/cairo-gl-surface.c | 375 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 373 insertions(+), 2 deletions(-) + +commit 38a1061bbcf3e69acc05c35f2084d462b43f5477 +Merge: b3e2433 e7d4bc3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 12 10:46:29 2009 +0000 + + Merge branch '1.8' + +commit e7d4bc3d864b1b42bb1cae031036ddf6a4445d3c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 12 10:42:24 2009 +0000 + + [png] Correct documentation to avoid reference to NULL + + As pointed out by Truc Truong, + cairo_image_surface_create_from_png_stream() cannot return NULL and so the + documentation was incorrect. + + Fixes http://bugs.freedesktop.org/show_bug.cgi?id=20075 + Bug 20075 There is a misprint in the spec for + cairo_image_surface_create_from_png_stream() function + + src/cairo-png.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +commit b3e2433f1e78e8799a9f57bfb6da108016687fc9 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Wed Feb 11 17:55:15 2009 -0500 + + Correct the reference image for the rotate-image-surface-paint test + + test/rotate-image-surface-paint.ref.png | Bin 190 -> 191 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 41cbd935f9dba276db716e2c71ac21dc60505be9 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Feb 11 15:24:20 2009 -0500 + + [test] Add cairo_test_NaN and use it in place of strtod + + strtod("NaN") returns 0.0 with the MSVC runtime so we + need to generate NaN some other way. + + test/cairo-test.h | 15 +++++++++++++++ + test/invalid-matrix.c | 2 +- + test/user-font-rescale.c | 2 +- + 3 files changed, 17 insertions(+), 2 deletions(-) + +commit 70297f257d4dc0accb5183b806d43a033887acb7 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Feb 10 17:58:28 2009 -0500 + + [test] Add crtdbg.h include + + crtdbg.h is required for _CrtSetReportMode() and _CrtSetReportFile(). + + test/cairo-test-runner.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b9f0c4b25223830ce73f7e3adef85a0e97a31c0e +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Feb 10 17:57:00 2009 -0500 + + Use _cairo_round() instead of round() + + MSVC doesn't have round() and the code probably wants + to round in the same direction regardless of whether + the values are negative or positive. + + src/cairo-font-face-twin.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit dffdbd85157395bceb27d30d6426aa47173f6a18 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Feb 10 17:53:39 2009 -0500 + + Add _cairo_round() + + _cairo_round() has the same behaviour as _cairo_lround() except + it returns a double instead of an integer. + + src/cairoint.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 41e46c7754fff3a99927979925300a7588b9962f +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Feb 10 11:44:20 2009 -0500 + + [test] Don't embed preprocessor directives inside macros + + MSVC can't handle this. GCC will warn with -pedantic, but I'm not + sure we want to enable that. + + test/user-font-mask.c | 11 ++++++----- + test/user-font-proxy.c | 10 +++++----- + test/user-font.c | 10 +++++----- + 3 files changed, 16 insertions(+), 15 deletions(-) + +commit fe40d3bdb0d0cb93169b935e44d14b15e014fa6d +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Feb 9 23:43:04 2009 -0500 + + [test] Allocate glyph array with malloc + + Keeping it on the stack causes a stack overflow of Window's + default 1mb stack. + + test/show-glyphs-many.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 50f8c2e4f3407ef237afd94c7317b1e185ccc9dc +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Feb 9 23:39:38 2009 -0500 + + [test] define isnan() on MSVC + + Needed for user-font-rescale.c + + test/cairo-test.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit dd9fc47418b86610d7896fcf585037c96beaa66f +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Feb 9 16:31:08 2009 -0500 + + Remove zero size data array for compilation with MSVC + + MSVC doesn't support zero sized arrays very well. For example, zero + sized arrays in arrays. + + src/cairo-tor-scan-converter.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit a6c8f18a391407044b33340cf13c49368a2e810e +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Feb 9 15:59:01 2009 -0500 + + [test] Avoid C99 designated initializers + + MSVC doesn't support these so we shouldn't use them. + + test/path-precision.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 3d2fcec948b93f75ba49b898633a84f60d419779 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Feb 9 15:12:41 2009 -0500 + + [test] Define INFINITY on MSVC + + 1./0. produces a compiler error on MSVC so we'll use HUGEVAL instead. + + test/cairo-test.h | 3 --- + test/invalid-matrix.c | 4 ++-- + 2 files changed, 2 insertions(+), 5 deletions(-) + +commit 6fb4c6200c840d438e1c9cdd2c9e7b0f140863d8 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 5 10:29:01 2009 -0800 + + [gl] Clamp surface size to a minimum of (1,1) in create_similar. + + Fixes clip-zero test. + + src/cairo-gl-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a8a40810275ff0a59f5767034372523d34fbbd1b +Author: Eric Anholt <eric@anholt.net> +Date: Thu Feb 5 09:43:38 2009 -0800 + + [gl] clear surfaces to transparent on creation + + src/cairo-gl-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit e7eb6dab12b9d622b80e4202d753324f7161b269 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 29 22:31:56 2009 -0800 + + [gl] Hook up fill_rectangles. + + First actual "acceleration" for cairogears. Actually slows things down since + we're now pingponging between cpu and gpu. + + src/cairo-gl-surface.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 118 insertions(+), 1 deletion(-) + +commit 2ad5c3fc8fdb5941bdedcda3c972b3bae426fb32 +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 4 13:10:47 2009 -0800 + + [gl] Add a shortcut from image to gl in clone_similar. + + src/cairo-gl-surface.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit d9d56bb2ed552dd40415af53105a98b9d6ba39ab +Author: Eric Anholt <eric@anholt.net> +Date: Wed Feb 4 13:06:31 2009 -0800 + + [gl] Make create_similar actually create similar instead of image. + + src/cairo-gl-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 90b30219b945d6cce941a1b702c9b789a60d8b27 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 29 22:27:39 2009 -0800 + + [gl] Replace all-software implementation with all-GL-read/drawpixels. + + src/cairo-gl-surface.c | 315 +++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 282 insertions(+), 33 deletions(-) + +commit c22ca79863a54b4293e607c8e4d515868c216842 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 6 12:56:48 2009 -0500 + + Don't distribute cairo-features.h (#19992) + + Second time I fix this bug. Mabe we should add a test for it! + + src/Makefile.am | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit a55655a82de8dee0f171efb2f7dfb1da341ecdd6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 6 12:47:38 2009 -0500 + + [test] Fix "make dist" + + doc/public/tmpl/cairo-status.sgml | 1 + + test/Makefile.am | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit af5ca7249f7628a8b0758f51934e3c1f6d9f4f36 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Feb 5 16:46:50 2009 -0500 + + [test] Fix the definition of INFINITY + + In my defence, even with INFINITY as 0, I was seeing new asserts on win32. + Caught by Jeremy Lea. + + test/invalid-matrix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 235de8d7a492ccd132fb83f78d33b408bd76aec1 +Author: Eric Anholt <eric@anholt.net> +Date: Thu Jan 29 09:19:01 2009 -0800 + + [gl] Add basics for GL surface backend using test-fallback as base. + + boilerplate/Makefile.sources | 3 + + boilerplate/Makefile.win32.features | 10 + + boilerplate/cairo-boilerplate-gl-private.h | 59 ++++++ + boilerplate/cairo-boilerplate-gl.c | 124 +++++++++++++ + boilerplate/cairo-boilerplate.c | 25 +++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 + + build/configure.ac.features | 1 + + configure.ac | 7 + + perf/cairo-perf.c | 1 + + src/Makefile.sources | 4 + + src/Makefile.win32.features | 14 ++ + src/cairo-gl-surface.c | 287 +++++++++++++++++++++++++++++ + src/cairo-gl.h | 89 +++++++++ + src/cairo-mutex-list-private.h | 4 + + src/cairo.h | 4 +- + 16 files changed, 635 insertions(+), 1 deletion(-) + +commit 83ec4b16b7b9a27439fee2d84c50e30a1ec2d68c +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Feb 4 14:04:05 2009 -0500 + + Elaborate the meaning of arithmetic rounding as done by _cairo_lround() + + src/cairo-misc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2676b3bdd6fbeef62d34c100718f76fe5bbe647d +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Feb 3 14:18:44 2009 -0500 + + [test] Define INFINITY if it hasn't been defined. + + This lets us use more of invalid-matrix on win32 + + test/cairo-test.h | 3 +++ + test/invalid-matrix.c | 22 ++-------------------- + 2 files changed, 5 insertions(+), 20 deletions(-) + +commit 6b0c2c8ba61b6fdaad4c77e1a7c02c13c70e03c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 31 11:58:19 2009 +0000 + + [directfb] Don't access the scaled_font->glyphs cache directly + + Not only does it no longer exist, but doing so bypassed the locking + mechanisms and sanity checks! + + Spotted by Lance Hepler. + + src/cairo-directfb-surface.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit d63c1ab3ffcb64220a05c80e674324f524f29dc2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 31 22:10:57 2009 -0500 + + [util/malloc-stats] Do a single backtrace_symbols() call + + I was hoping that this may speed things up, but it didn't. :( + + util/malloc-stats.c | 58 +++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 50 insertions(+), 8 deletions(-) + +commit 64d1c7587041f765b393e1802a10cce02b807ad1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 31 21:34:21 2009 -0500 + + [util] Fix memset bug in malloc-stats + + util/malloc-stats.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit b02aeb367dc4bada5412798fa93ce74f3d861273 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 31 21:33:42 2009 -0500 + + [util] Don't link backtrace-symbols into malloc-stats + + On my rawhide machine, seems like the glibc backgrace-symbols is now as + good as our private backtrace-symbols. + + util/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7375f4c76bb169cc24d5d714520c337172d3cf69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 30 21:54:56 2009 +0000 + + Trivial warning fixes. + + Cleanup a few compiler warnings about unused variables and mismatching + pointer types. + + src/cairo-bentley-ottmann.c | 1 - + src/cairo-ps-surface.c | 4 ++-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit f10eaadf89fa94172a81c05a59febab3f7e32396 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 30 21:50:24 2009 +0000 + + Revert "[png] Complete the idempotent read_png() -> write_png()" + + This reverts commit 564d64a1323c5cbcde2dd9365ac790fe8aa1c5a6. + + In hindsight, and with further discussion with Jeff Muizelaar, this + behaviour of using the stored contents from the mime-data is completely + the opposite of the users' expectations. When the user calls + cairo_surface_write_to_png(), usually in the course of debugging their + rendering code, they expect the precise contents of the surface to be + saved. + + src/cairo-png.c | 14 -------------- + 1 file changed, 14 deletions(-) + +commit dd11d905a54a123ddf619e5f0194fb1800ba643d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 30 10:09:29 2009 +0000 + + [util] Use a hash-table for malloc-stats. + + At Behdad's request, convert the array of allocators into a simple hash + table (large static number of buckets + chaining) in order to speed up + malloc profiling. + + util/malloc-stats.c | 150 ++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 103 insertions(+), 47 deletions(-) + +commit 322fb00066cc4655122fcf7d738a0cbbe46fcdd1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 29 22:05:06 2009 +0000 + + [test] Compile again without memfault. + + Hide the valgrind macro when not using memfault. + + test/cairo-test.c | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +commit 5e6d25e204b681c5d5fba90abfe4d7401f23460f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 20:47:09 2008 +0000 + + [skiplist] Provide an initial stack allocated pool. + + Since we only need to allocate elts for intersection events and edges, the + number of elts in flight at any one time is actually quite small and can + usually be accommodated from an embedded pool. + + src/cairo-bentley-ottmann.c | 33 ++++++++++----------------------- + src/cairo-skiplist-private.h | 9 +++++---- + src/cairo-skiplist.c | 13 ++++++------- + 3 files changed, 21 insertions(+), 34 deletions(-) + +commit dd4276c6618aa250637e4499bc7cb0a35b24448c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 30 13:49:24 2008 +0000 + + [stroker] Rectilinear dashing. + + Extend the rectilinear stroker to handle dashes, so that for pixel-aligned + dashed strokes we completely avoid tessellation overhead. + + src/cairo-matrix.c | 3 +- + src/cairo-path-stroke.c | 492 ++++++++++++++++++++++++++------ + src/cairo-pen.c | 11 +- + src/cairo-stroke-style.c | 18 +- + src/cairoint.h | 11 +- + test/Makefile.am | 4 +- + test/leaky-dashed-rectangle.pdf.ref.png | Bin 0 -> 347 bytes + test/leaky-dashed-rectangle.ps.ref.png | Bin 0 -> 444 bytes + test/leaky-dashed-rectangle.ps2.ref.png | Bin 444 -> 0 bytes + test/leaky-dashed-rectangle.ps3.ref.png | Bin 444 -> 0 bytes + test/leaky-dashed-rectangle.ref.png | Bin 366 -> 347 bytes + 11 files changed, 437 insertions(+), 102 deletions(-) + +commit 7f95288c03a400bf770165d427ef623d924b3b47 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 29 09:47:01 2009 +0000 + + [ft] Improve error status propagation. + + Propagate the error status from deep within the bowels, in order to reduce + the number of duplicate _cairo_error() and generally clean up the return + values. + + src/cairo-ft-font.c | 65 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 32 insertions(+), 33 deletions(-) + +commit 53bd2ae2ce27f9b954f34bc9921d798c9a074125 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 21:36:27 2009 +0000 + + [ft] Distinguish fatal backend errors whilst constructing scaled fonts. + + We now have the ability to distinguish an error case where the backend is + left in an inconsistent state from a transitory error. For the former we + need to report the error condition via the return value, which will be + propagated to the font-face. For the latter we just construct an in-error + scaled font nil-object which is passed back to the user. + + src/cairo-ft-font.c | 38 ++++++++++++++++++++++++++------------ + 1 file changed, 26 insertions(+), 12 deletions(-) + +commit f17aeedab31753974cce027f92571107425b1bcd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 21:11:41 2009 +0000 + + [scaled-font] Differentiate fatal error when creating fonts + + We only want to set the error state on the backend when it implies that + the font-face is in an inconsistent state. For example, this may be due to + a locking error in the backend or that we have detected a corrupt font. + + In contrast, if we merely fail to allocated the scaled font then we just + wish to return that error to the user, without making the font-face itself + inert. + + src/cairo-scaled-font.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 58cab06c4c2c49bbecb11efaae6b41d30c06eff0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 20:52:29 2009 +0000 + + [scaled-font] Guard against invalid matrices when creating the scaled font. + + Check the user input for validity before passing the values on to the + backend. Currently the error is detected by the backend and the error is + propagated onto the font-face. + + src/cairo-scaled-font.c | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +commit 97c88f2af04b6bc5161fa2b567b5e922d7fd326a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 20:51:02 2009 +0000 + + [surface] Fix memleak of along set_mime_data() error path + + Free the mime_data holder if we fail to attach it to the surface. + + src/cairo-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit d20e5fc2d95c61ab04e085bf3a99d2cb958421a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 15:08:58 2009 +0000 + + [ps] Free images after emitting patterns. + + Ensure that the temporary images are freed after we finish with the + pattern. + + Note that we are using 3 members of the surface for temporary storage + whilst emitting patterns, this should be reviewed. + + src/cairo-ps-surface-private.h | 3 +++ + src/cairo-ps-surface.c | 18 ++++++++++++++++-- + 2 files changed, 19 insertions(+), 2 deletions(-) + +commit e6102dbe028ca93db936b2f4cd6368e2ba0a2209 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 14:00:13 2009 +0000 + + [png] Avoid a double free of the memory stream after error. + + _cairo_memory_stream_destroy() finalizes the stream even if the stream was + in error and that error is reported back to the caller - so ensure we + don't try to free the stream again. + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f3e366f8bbbaa80b518eb1b0297a6122901ce66 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 26 10:54:45 2009 +0000 + + [font-face] Close a race when resurrecting fonts. + + Paul Messmer provided a thorough analysis of a race between destroying the + final reference on a font and a concurrent recreation of the font - + demonstrating how it is possible for the create() to return the font that + was in the process of being freed. + + To stop the race, we need to recheck the reference count upon taking the + mutex guarding the hash table. + + src/cairo-ft-font.c | 6 ++++++ + src/cairo-toy-font-face.c | 6 ++++++ + 2 files changed, 12 insertions(+) + +commit 312b5680a5754c8e7ee1332206b81449cf9bf8a3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 23 21:13:15 2009 +0000 + + [cff-subset] Free ps_name. + + Ensure ps_name is freed along error paths and by the normal destructor. + + src/cairo-cff-subset.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 5176507fcb61ae1ec1143aa0b6b098bc92575c48 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 23 13:37:54 2009 +0000 + + [truetype] Free font name. + + Remember to free the font name on destruction. + + src/cairo-truetype-subset.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ab0ac1b8a84b0d259602f0029a3b5552466f35a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 29 09:45:11 2009 +0000 + + [truetype] Initialise font_name + + Ensure the font_name is initialized to NULL. + + src/cairo-cff-subset.c | 2 ++ + src/cairo-truetype-subset.c | 1 + + 2 files changed, 3 insertions(+) + +commit 8388af137841679b7c510980daf3cec1427b6e6b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 29 09:50:38 2009 +0000 + + [test] Trivial fixes for error paths. + + Kill a few leaks along error paths in the test code. + + test/create-from-png-stream.c | 36 ++++++++++++++++++++++++++++-------- + test/mime-data.c | 4 ++++ + 2 files changed, 32 insertions(+), 8 deletions(-) + +commit 3752f690b467432ab5b1058d450cb79d719a794a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 29 09:49:41 2009 +0000 + + [test] Suppress suppressed memfault report + + Check to see if there are any *unsuppressed* memfaults before declaring + unreported faults. + + test/cairo-test.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 8dc4c0da9b13b16c593e874d59c13a89a77a2481 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 23 13:17:24 2009 +0000 + + [toy-font] Fix unwind behaviour following error during construction. + + We failed to cleanup the font face correctly after an allocation failure + during _cairo_toy_font_face_init() leading to memleaks and live entries + being left in the font-face hash tables. + + src/cairo-toy-font-face.c | 43 +++++++++++++++++++++---------------------- + 1 file changed, 21 insertions(+), 22 deletions(-) + +commit 1d52fbc8f4f70e9e2419a6ed66cd907552d1d13b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 23 12:51:52 2009 +0000 + + [tessellator] Memleak on error path. + + Add a missing _cairo_skip_list_fini() after failure to allocate the + events. + + src/cairo-bentley-ottmann.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6b5d2bf1a742b34a58d65f188fe15ffbf2f83118 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 23 10:42:42 2009 +0000 + + [trace] Comment out the redundant wrapping of FT_Open_Face() + + Remove the left-over debugging spew, but leave a comment to hopefully + clarify the situation with wrapping FT_Open_Face(). + + util/cairo-trace/trace.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit faa004033cde21cd81890c7f82abae8eb766bb4b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 22 11:52:54 2009 +1100 + + cairo-trace: Print name of trace file. + + It's just a lot easier to use cairo-trace if it tells you + what file it just created. + + util/cairo-trace/trace.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit d108b2777fcd6ef4fa45aeeef457dc58522e325b +Author: Daniel Holbert <dholbert@mozilla.com> +Date: Fri Jan 23 10:18:48 2009 +0000 + + Spelling corrections: s/it's/its/ + + As a fun itch to scratch, I've been fixing incorrect uses of the + contraction "it's" in comments within the mozilla source tree (tracked + in https://bugzilla.mozilla.org/show_bug.cgi?id=458167 ), and I ran + across 6 instances of this typo in mozilla's snapshot of cairo. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ft-font.c | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-mutex-impl-private.h | 2 +- + src/cairo-pdf-operators.c | 2 +- + src/cairo-surface-fallback.c | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit 6394ec3048f31b867d9588853fa400c6c630c6f1 +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Mon Dec 15 09:32:43 2008 +0100 + + [surface] add CAIRO_STATUS_INVALID_SIZE + + Adds an error code replacing CAIRO_STATUS_NO_MEMORY in one case where it + is not really appropriate. CAIRO_STATUS_INVALID_SIZE is used by several + backends that do not support image sizes beyond 2^15 pixels on each side. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-misc.c | 4 +++- + src/cairo-os2-surface.c | 9 +++++---- + src/cairo-quartz-image-surface.c | 5 +++-- + src/cairo-quartz-surface.c | 4 ++-- + src/cairo-spans.c | 2 ++ + src/cairo-surface.c | 1 + + src/cairo-xlib-surface.c | 7 +++---- + src/cairo.h | 6 ++++-- + src/cairoint.h | 2 +- + 9 files changed, 24 insertions(+), 16 deletions(-) + +commit 46acfd2e85dd6f7a73e1172d363d509c769376f2 +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Tue Dec 23 08:31:30 2008 +0100 + + [glitz] use image fallback if the cairo_content_t is unsupported + + The agreement on the mailing list was that returning NULL is the right + thing to do, and indeed the callers of _cairo_glitz_surface_create_similar + are prepared to receive NULL and return CAIRO_STATUS_INT_UNSUPPORTED in + that case. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-glitz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 01d20b79daf0abe0f69ccec4ecd5122c5bfe9a4e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 23 10:09:37 2009 +0000 + + [scaled-font] Fix up syntax in doc comments + + The old NULL vs %NULL conflict. + + src/cairo-scaled-font-subsets-private.h | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit aaec63d48386ec825cd4d6e67b6adf7c5fd3b167 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 21 15:04:47 2008 +0000 + + [scaled-font] Global glyph cache + + Currently glyphs are cached independently in each font i.e. each font + maintains a cache of up to 256 glyphs, and there can be as many scaled fonts + in use as the application needs and references (we maintain a holdover + cache of 512 scaled fonts as well). + + Alternatively, as in this patch, we can maintain a global pool of glyphs + split between all open fonts. This allows a heavily used individual font + to cache more glyphs than we could allow if we used per-font glyph caches, + but at the same time maintains fairness across all fonts (by using random + replacement) and provides a cap on the maximum number of global glyphs. + + The glyphs are allocated in pages, which are cached in the global pool. + Using pages means we can exploit spatial locality within the font + (nearby indices are typically used in clusters) to reduce frequency of small + allocations and allow the scaled font to reserve a single MRU page of + glyphs. This caching dramatically reduces the cairo overhead during the + cairo-perf benchmarks, and drastically reduces the number of allocations + made by the application (for example browsing multi-lingual site with + firefox). + + boilerplate/cairo-boilerplate.c | 5 +- + src/cairo-cache-private.h | 8 ++ + src/cairo-cache.c | 36 +++-- + src/cairo-hash-private.h | 4 + + src/cairo-hash.c | 117 ++++++++++----- + src/cairo-mutex-list-private.h | 1 + + src/cairo-scaled-font-private.h | 6 +- + src/cairo-scaled-font.c | 306 ++++++++++++++++++++++++++++------------ + src/cairoint.h | 9 +- + 9 files changed, 351 insertions(+), 141 deletions(-) + +commit 54f6a49ebb18cf396823d0d70b95e4e264142171 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 19 15:36:29 2009 +0000 + + [bounds] Skip spline evaluation based on bounding bbox of control points. + + The bounding polygon of the control points, defines the extents of the + spline. Therefore if the control points are entirely contained within the + current path extents, so is the spline and we do not need to evaluate its + tight bounds. + + src/cairo-path-bounds.c | 21 +++++++++++++++++++-- + 1 file changed, 19 insertions(+), 2 deletions(-) + +commit e217c4da7bc5c4817e0d829ff61dd2bd5b3145a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 19 15:28:05 2009 +0000 + + [in-stroke] Check point against extents before computing path. + + We can avoid tessellating the path entirely by first checking whether the + query point is inside the path extents. + + src/cairo-gstate.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 48f9a0e6da0dd24ea9c809876ef3c745dcfd0d52 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 15 00:26:03 2009 +0000 + + [spline] Correct the definition of a cubic Bezier curve. + + Add the missing coefficients for p1 and p2 so the derivation of the + derivative and the solution for its inflection points stands correct. + + src/cairo-spline.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ee7ac5681fa6a74b68beeae667d96d1421050fc9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 21 12:04:06 2009 +0000 + + [path] A degenerate curve_to becomes a line_to. + + Be consistent. + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 778ced4879b09f7482bd41c398bf2d984754ed0b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 14 18:55:32 2009 +0000 + + [path] Rename _cairo_path_fixed_approximate_extents() + + Rename approximate_extents() to approximate_clip_extents() so that it is + consistent with the fill and stroke variants and clearer under what + circumstances you may wish to use it. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-clip.c | 4 ++-- + src/cairo-path-bounds.c | 4 ++-- + src/cairo-surface-fallback.c | 2 +- + src/cairoint.h | 4 ++-- + 5 files changed, 8 insertions(+), 8 deletions(-) + +commit 75f7c420b624049c1f6c51795679f8029cd2231d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 21 13:09:41 2009 +0000 + + [perf] Remove a redundant clear during source init. + + After a short wild goose chase to see why + cairo_image_surface_fill_rectangles() was appearing in the profile, + tweak init_and_set_source_surface() to remove the redundant clear and + to propagate any errors in the auxiliary context. + + perf/cairo-perf-cover.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 706f6de68da65911f434d2065dcb143649fa793e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 18 16:47:59 2009 +0000 + + [perf] Add another variation on the many-rectangles case + + This variation aims to show the difference between calling fill once + per-rectangle, or once for all rectangles. + + perf/rectangles.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit ff5d37a8ad063e84e88f453a403715bc85f8a3ec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 29 10:09:11 2009 +0000 + + [mutex] Civilise the comment. + + Note bene that Behdad does not like people shouting. + + src/cairo-mutex-impl-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f4ff6128d7fb6e4b5ba361a597fc6c0c88d5ec00 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Jan 28 17:16:32 2009 -0500 + + Avoid "empty body in an if-statement" warning + + Use '(void)expr;' instead of 'if (expr) ;' to avoid getting the warning. + 'if (expr) {}' is an option, however '(void)expr;' seems like a more common + idiom and getting warnings for __attribute__((warn_unsed_result)) functions is + probably prefered. + + src/cairo-mutex-impl-private.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 41feeedcc14bf8caef3c039de49f4f28143712c7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Dec 3 23:58:22 2008 +1030 + + Use PS font name in PS TrueType fonts + + src/cairo-ps-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit b7a9e1d4ac3972bc3d215070124b6a9eda68d3e3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Dec 3 23:58:05 2008 +1030 + + Embed full font name in PDF TrueType and CFF fonts + + if the full font name was available in the font. + + src/cairo-pdf-surface.c | 32 ++++++++++++++++++++++++-------- + 1 file changed, 24 insertions(+), 8 deletions(-) + +commit 6f2db9a4b07cde2c4932ea481228abc248e90145 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Dec 3 23:57:38 2008 +1030 + + Use PS font name in CFF and TrueType PDF font subsets + + James Cloos found that the font name in embedded fonts should be the + PostScript font name (nameID=6 in the name table). + + http://lists.cairographics.org/archives/cairo/2008-December/015919.html + + src/cairo-cff-subset.c | 70 +++++++++++++++--------- + src/cairo-pdf-surface.c | 16 +++--- + src/cairo-scaled-font-subsets-private.h | 19 +++++-- + src/cairo-truetype-subset.c | 97 +++++++++++++++++++++++---------- + 4 files changed, 136 insertions(+), 66 deletions(-) + +commit 2ed08f7801a2af27e35afcf57f00f4bf5d48384a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Dec 3 23:56:01 2008 +1030 + + Factor out duplicate code in truetype and cff subsetting + + The code for reading the font name from the name table has been moved + to a new function: _cairo_truetype_read_font_name(). + + src/cairo-cff-subset.c | 60 ++----------- + src/cairo-scaled-font-subsets-private.h | 18 ++++ + src/cairo-truetype-subset.c | 149 +++++++++++++++++++------------- + 3 files changed, 114 insertions(+), 113 deletions(-) + +commit 1deb1e451022b9dd5aa6ecb0b580b006047b630e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 25 23:11:01 2008 +1030 + + PDF: Include subset tag in font name + + PDF requires font names of subsetted fonts to be preprended with + "XXXXXX+" where XXXXXX is a sequence of 6 uppercase letters unique the + font and the set of glyphs in the subset. + + src/cairo-pdf-surface.c | 112 ++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 104 insertions(+), 8 deletions(-) + +commit c4e54629bb444ed3e850ca8deec175936b90c4e4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 22 12:26:55 2009 +1100 + + Add details to test/COPYING about license of bundled fonts. + + Just the public-doamin 6x13.pcf file for now, but Adrian will + be bundling more soon. + + test/COPYING | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 6801f28f6dfeb21eec44052e75156e9d2b82422e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 14 13:59:28 2009 +0000 + + [perf] Add a utility to compare backends. + + A minor variation on cairo-perf-diff-files that compares tests with the + same name for multiple backends. + + perf/.gitignore | 1 + + perf/Makefile.am | 8 +- + perf/cairo-perf-compare-backends.c | 393 +++++++++++++++++++++++++++++++++++++ + perf/cairo-perf-diff-files.c | 2 +- + perf/cairo-perf-graph-files.c | 2 +- + perf/cairo-perf-report.c | 43 +++- + perf/cairo-perf.h | 9 +- + 7 files changed, 448 insertions(+), 10 deletions(-) + +commit 4c79cd480db1cf10b6018bce3ea966587efc6081 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 13 12:52:52 2009 +0000 + + [perf] Tweak dragon to hit fill_rectangles(). + + Add a second dragon path that is pixel-aligned and uses a solid pattern, + so that it can be drawn using fill-rectangles. + + perf/dragon.c | 42 +++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 41 insertions(+), 1 deletion(-) + +commit de9e6b5a3f4e4752e0f99e3ae20ac263a5aae4bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 12 01:00:30 2009 +0000 + + [perf] Cover linear gradient with 3 stops. + + The i915 is able to special case gradients with just 2 color stops to + avoid creating temporary gradient textures, so add a 3 stop linear + gradient to compare the speed difference. + + perf/cairo-perf-cover.c | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +commit 7cbc55f21624159dfa58a9a50ec004af9368ab3d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 10 00:12:06 2009 +0000 + + [perf] Add scaled similar surface sources. + + Cover the similar source with min/mag scale factors as well, so we can + compare the performance impact with scaled image sources. This is useful + to distinguish between transport overhead and transform cost. + + perf/cairo-perf-cover.c | 44 ++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 40 insertions(+), 4 deletions(-) + +commit afce1cfe987eeec6516aed1eb8fd97c2d3b9b07b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 9 14:22:36 2009 +0000 + + [scaled-font] Avoid repeated lookup of the same unicode during text->glyphs + + Performing the unicode to index is quite expensive, the + FcFreeTypeCharIndex() taking over 12% in the cairo-perf text benchmarks. + By adding a simple cache of translated unicode indices, we save around 25% + of the lookups during benchmarks, with a relative reduction in runtime. + + src/cairo-scaled-font.c | 63 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 41 insertions(+), 22 deletions(-) + +commit 49eca78a4265432e285af58435219e8b804b38bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 12 12:42:46 2009 +0000 + + [test] Add a huge-radial test case. + + Also test the handling of radial gradients with large radii. + + test/Makefile.am | 11 +++--- + test/huge-linear.c | 67 ++++++++++++++++++++++++++++++++++ + test/huge-linear.ps3.ref.png | Bin 0 -> 1786 bytes + test/huge-linear.ref.png | Bin 0 -> 1619 bytes + test/huge-pattern.c | 65 --------------------------------- + test/huge-pattern.pdf.argb32.ref.png | Bin 2430 -> 0 bytes + test/huge-pattern.pdf.ref.png | Bin 2716 -> 0 bytes + test/huge-pattern.pdf.rgb24.ref.png | Bin 2817 -> 0 bytes + test/huge-pattern.ps3.ref.png | Bin 1786 -> 0 bytes + test/huge-pattern.ref.png | Bin 1619 -> 0 bytes + test/huge-radial.c | 69 +++++++++++++++++++++++++++++++++++ + test/huge-radial.ps3.ref.png | Bin 0 -> 18449 bytes + test/huge-radial.ref.png | Bin 0 -> 41702 bytes + 13 files changed, 142 insertions(+), 70 deletions(-) + +commit 7709d1d9d43a42dd8f9293f18141c57c76ca0970 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 7 21:12:21 2009 +0000 + + [test] Add fill-image. + + A filled equivalent of stroke-image, that checks that the pattern + matrices are applied correctly during fills - useful with the + segregation between fills and strokes introduced by spans. + + test/Makefile.am | 2 ++ + test/fill-image.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/fill-image.ref.png | Bin 0 -> 1317 bytes + 3 files changed, 85 insertions(+) + +commit 5605e4bfcd0b6e3e34eed3785bc8ae51b24a7385 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 4 11:26:45 2009 +0000 + + [test] Propagate failure from painting large-source-roi + + Use cairo_get_target() to propagate any failure when creating the + large-source. + + test/large-source-roi.c | 28 ++++++++++++++++++++-------- + 1 file changed, 20 insertions(+), 8 deletions(-) + +commit 59a14f622389ae3f34f93c78b709df2ad6d1d624 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 10 13:09:06 2009 -0500 + + Comment win32 maintainer-clean files again + + Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit cc5119173918623ce13363f4b25cd06076fc3fbc +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Sat Jan 10 12:13:40 2009 -0500 + + Uncomment win32 maintainer-clean files to make Makefile.am syntactically correct + + Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 06deaa98b67f9e674a6933a8f54dae6a45faf6ff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 9 15:55:24 2009 -0500 + + [build] Include all generated win32 build files in the repo + + So a git clone can be built on win32. The files only change after adding + new backends. + + Makefile.am | 4 +- + boilerplate/.gitignore | 2 +- + boilerplate/Makefile.am | 2 +- + boilerplate/Makefile.win32.features | 233 +++++++++++++++++++++++++++ + build/.gitignore | 4 +- + build/Makefile.win32.features | 22 +++ + build/Makefile.win32.features-h | 70 ++++++++ + src/.gitignore | 3 +- + src/Makefile.am | 2 +- + src/Makefile.win32.features | 311 ++++++++++++++++++++++++++++++++++++ + 10 files changed, 644 insertions(+), 9 deletions(-) + +commit a5c1cdf2b030959309e1645bd115f058f1367296 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Nov 13 12:11:12 2008 +0200 + + [clip] Fix uninitialised status return in _cairo_clip_intersect_mask() for empty extents. + + This fixes the clip-all test case crashing for me. + + src/cairo-clip.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8157bc8a2dc0d555606d19ad52ae7a603471edd6 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sun Jan 4 04:14:28 2009 +0200 + + [test] Stress test using large source images. + + This test attempts to trigger failures in those backend clone_similar + methods that have size restrictions on the resulting image. It also + triggers errors in scaling down large image surfaces as the image + backend also fails this test. + + test/Makefile.am | 2 ++ + test/large-source-roi.c | 64 ++++++++++++++++++++++++++++++++++++++++++ + test/large-source-roi.ref.png | Bin 0 -> 102 bytes + 3 files changed, 66 insertions(+) + +commit 388ae177e4100698289819429fa1f8e6958d1c60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 3 22:51:28 2009 +0000 + + [boilerplate] Remove CAIRO_BOILERPLATE_LOG() + + The variadic macro is only used within boilerplate/ so replace it with a + simple, and portable, call to fprintf. + + boilerplate/cairo-boilerplate-beos.cpp | 19 +++---------------- + boilerplate/cairo-boilerplate-glitz-agl.c | 10 +++++----- + boilerplate/cairo-boilerplate-glitz-glx.c | 6 +++--- + boilerplate/cairo-boilerplate-glitz-wgl.c | 10 +++++----- + boilerplate/cairo-boilerplate-system.c | 16 ++++++++-------- + boilerplate/cairo-boilerplate-xcb.c | 4 ++-- + boilerplate/cairo-boilerplate.h | 4 ---- + test/cairo-test.h | 1 - + 8 files changed, 26 insertions(+), 44 deletions(-) + +commit 5f816ccd25d1cd303fc1e9e44e80c1207b2a424a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 3 22:30:55 2009 +0000 + + [boilerplate] Redefine DEBUG() for portability concerns + + Behdad warned that using an empty variadic macro was non-portable. + + boilerplate/cairo-boilerplate-xlib.c | 18 +++++++++--------- + boilerplate/cairo-boilerplate.h | 2 +- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit acb2717372f3862ddbde8cfdc814132808b71f86 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 3 21:50:55 2009 +0000 + + [quartz] Define RTLD_DEFAULT + + RTLD_DEFAULT is a gnu-ism (at least according to the manpage on my linux + system) so declare _GNU_SOURCE before including dlfcn.h and failing that + provide our own definition. + + src/cairo-quartz-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ff1f5de5511ba0b7842b53223c26986e4bcdc38a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 3 11:44:58 2009 +0000 + + [boilerplate] Suppress xlib warnings on stderr + + If we cannot test the xlib backend simply because there is no Display, + just report UNTESTED and do not clutter the output with superfluous + warnings [see the output from the buildbots for an example]. However, + keep the warnings around so that a developer can re-enable them + and so simply move them to a new "lower priority" macro. + + boilerplate/cairo-boilerplate-xlib.c | 18 +++++++++--------- + boilerplate/cairo-boilerplate.h | 4 ++++ + 2 files changed, 13 insertions(+), 9 deletions(-) + +commit 75538962c8af11b1ec669caca6259b7769b5cc1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 17:45:26 2009 +0000 + + [boilerplate] Check the return of pclose() + + pclose() returns the child exit status, so we can use that to detect + errors in the convertor process. + + boilerplate/cairo-boilerplate.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 333158ec85cf3c610cc8965fc3f99d72b534cc2e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 15:36:39 2009 +0000 + + [configure] Replace awk comparator with an aclocal version + + As reported in https://bugs.freedesktop.org/show_bug.cgi?id=19283, the + fallback freetype version compare is broken inside the configure script as + the $1-$3 arguments are interpreted as the script is constructed. To avoid + making that awk comparison any more complicated, we import a version compare + from the autoconf archives - such that we have a reusable macro for the + furture. + + build/aclocal.compare.m4 | 162 +++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 18 ++---- + 2 files changed, 168 insertions(+), 12 deletions(-) + +commit dc33ae24619f4602c23716e9e407f8dd4f1b4a1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 14:29:53 2009 +0000 + + [boilerplate] Use pclose() after popen + + Joonas pointed out that we should be using pclose() on a stream returned + by popen(). + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f230ce7658910c7f4f8feb722b77a2141824f963 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 14:03:35 2009 +0000 + + [path] Fix typo in bounds for empty path. + + We set the width to be zero, twice, and the height not even once! + + src/cairo-path-bounds.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 163c326c82a45c1f3ee84bbfaee2cc2e6dc1fafc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 13:46:16 2009 +0000 + + [test] Free test name + + Adding the missing free for the converted test name. + + test/cairo-test.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit dd65be740c475daf75c602fc79ff25977674d9cf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 13:42:53 2009 +0000 + + [test/pdf-mime-data] Free data on error paths. + + Cleanup the allocated buffers on error. + + test/pdf-mime-data.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 65f9760d661a0eb2edf9e53fb1b74666ce0ba3b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 13:43:33 2009 +0000 + + [toy-font-face] Return defaults for error objects. + + Similar to the behaviour of the other objects, we return the default + conditions if the object is in any error (and not just a nil object). + + src/cairo-toy-font-face.c | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +commit d478d5ed5ce7c19a02e11435bcf69e867c6705d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 2 06:48:54 2009 -0500 + + [doc] Give a small hint about Twin font + + Though, the details are not documented yet. I'm not sure how much of it + I do want to document. + + src/cairo-toy-font-face.c | 2 +- + src/cairo.c | 7 +++++++ + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit a023104400f7f08775e9e52c304f5df2bc96382d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 2 10:32:39 2009 +0000 + + [trace] Adopt _cairo_dtostr + + In order to have locale-independent output of decimal values, we need to + manually transform such numbers into strings. As this is a solved problem + for cairo, we adopt _cairo_output_stream_printf() and in particular the + _cairo_dtostr() routine for our own printf processing. + + util/cairo-trace/trace.c | 920 ++++++++++++++++++++++++++++------------------- + 1 file changed, 546 insertions(+), 374 deletions(-) + +commit c601f308430f4d33929109fb9170b9322edca3c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 1 16:55:08 2009 +0000 + + [cairo] Early return if we attempt to set the same colour. + + Profiling a silly video renderer that called set-source; rectangle; fill; + for each pixel, we can shave 5% off the cairo overhead by introducing an + early return if we attempt to reset the current colour. + + src/cairo.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +commit fb3522f33a565576002595bf03e07f6c8b16a471 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 19:19:54 2008 +0000 + + [os2] Fix memory leak of surface on error path + + Of we fail to create the mutex, free the surface before returning the + failure. + + Reported: http://bugs.freedesktop.org/show_bug.cgi?id=19208. + + src/cairo-os2-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8d23c3a6c2ab0ae168afb695e2b8c5f121ed2be3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 19:17:28 2008 +0000 + + [quartz] Delay allocation of string until after guard. + + Fixes a memory leak should we bail due to the version of Quartz being + insufficient. + + Reported: http://bugs.freedesktop.org/show_bug.cgi?id=19209. + + src/cairo-quartz-font.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 9c9ed8f0b5ce8bc3036dcb0bf841ffaa24797cfa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 19 13:04:31 2008 +0000 + + [scaled-font] Post-process hash value. + + Mix the bits within the hash value to reduce clustering. + + src/cairo-scaled-font.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 555dd6b97ec432787d83242727164d25b459cf54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 19 13:02:00 2008 +0000 + + [scaled-font] Switch to a constant loop for hashing. + + As we only use the FNV hash for hashing matrices, expose the constant size + to the compiler so that it can perform its magic. + + src/cairo-scaled-font.c | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit f5274f5847519208865159fa9bb254d76ba8ddac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 19 16:31:28 2008 +0000 + + Iterate over hash table using foreach() in destructors. + + Don't use the remarkably inefficient _cairo_hash_table_random_entry() to + remove all entries from the hash table! + + src/cairo-cff-subset.c | 21 +++++++++++---------- + src/cairo-ft-font.c | 47 ++++++++++++++++++++++------------------------- + 2 files changed, 33 insertions(+), 35 deletions(-) + +commit 1c4ea84b24f3f7e480f9c50b5bd77ac703c36ef0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 20:32:44 2008 +0000 + + [cairo] Early return if we attempt to set the same scaled_font + + If the application calls cairo_set_scaled_font() with the current + scaled font, we can return early as it is a no-op. + + src/cairo.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit b661f3d27ba77cdf470a86f6320b1bb31d92a9f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 18:34:16 2008 +0000 + + [cairo] Embed a second gstate. + + Experiment with embedding a second gstate into the initial context to + reduce allocations. + + src/cairo-private.h | 2 +- + src/cairo.c | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 8abd21bd3afc143501f66fdcdc0c6c4139df490b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 23 15:09:15 2008 +0000 + + [script] Call the context creation hook + + Hook in the creation hook so applications can record or even modify the + contexts used in replay. + + util/cairo-script/cairo-script-operators.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 2c9323d3942cbf93b100f711000f48a3eb869271 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 19 14:11:37 2008 +0000 + + [script] more targets + + util/cairo-script/csi-replay.c | 101 +++++++++++++++++++++++++++++++++++------ + 1 file changed, 88 insertions(+), 13 deletions(-) + +commit fd96cea4fefeeee8bcccde663faa559151e2606e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 19 12:54:53 2008 +0000 + + [script] Improve array construction. + + Limit the memory allocation to the initial array size and perform a direct + copy from the operand stack to the array. + + util/cairo-script/cairo-script-objects.c | 27 +++++++++++++----- + util/cairo-script/cairo-script-operators.c | 45 ++++++++++++------------------ + util/cairo-script/cairo-script-private.h | 1 + + util/cairo-script/cairo-script-scanner.c | 2 +- + util/cairo-script/cairo-script-stack.c | 2 +- + 5 files changed, 41 insertions(+), 36 deletions(-) + +commit ecb8dce27c769158fe4a92432a90b24a96f8afa9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 18:32:44 2008 +0000 + + [script] Recreate surface content. + + Use the content recorded in the trace, defaulting to COLOR_ALPHA, to + determine the replayed surface type. + + util/cairo-script/cairo-script-interpreter.h | 1 + + util/cairo-script/cairo-script-operators.c | 8 ++- + util/cairo-script/csi-exec.c | 1 + + util/cairo-script/csi-replay.c | 80 ++++++++++++++++++++-------- + util/cairo-trace/trace.c | 8 ++- + 5 files changed, 74 insertions(+), 24 deletions(-) + +commit d21529b9ef31228182d2f61bb4f7beb6319b10c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 15:38:13 2008 +0000 + + [trace] Correct escaped characters in string literal. + + Laziness caused the control character to be used instead of its + replacement in the escaped string! + + util/cairo-trace/trace.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit ca39c4bf7f90646b70b2bbe9e7318fcfae99e35e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 15:35:40 2008 +0000 + + [trace] Correct a couple of typos. + + A couple of minor typos in the escaped characters strings. + + util/cairo-trace/trace.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1f2fec7388092c8fea87651f9094ca2e0be2104b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 19 18:04:03 2008 +0000 + + [trace] Fix OBO in emit_glyphs() + + The largest index that will fit within 8 bits is 255 not 256! + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ebe9e68371e4e77139d9abeb7feb390203b1c8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 21:59:16 2008 +0000 + + [trace] Minor tidy. + + Improve scoping of variables. + + util/cairo-trace/trace.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 931556005a1946c5e730afc7977551a2bc5be42c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 21:57:19 2008 +0000 + + [trace] Remove the forced switching to C locale + + This interferes with the application being traced. It is not clear from + printf(3) whether "%.f" is locale dependent or not - but until we have a + failure do not break applications unnecessarily! + + util/cairo-trace/cairo-trace.in | 4 ---- + 1 file changed, 4 deletions(-) + +commit d0f41b92bf9a9ee313dde6f451b26fffb65a0906 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 17:26:43 2008 +0000 + + [trace] Do not force the output filename. + + Handle the case of tracing an application that spawns it own graphical + children but using the autonaming facility within cairo-trace. Currently + the traced process tree would all attempt to write to the same file, + creating a broken trace. This means sacrificing the display of the output + name, but allows use for a wider range of applications. + + util/cairo-trace/cairo-trace.in | 25 ++++++------------------- + 1 file changed, 6 insertions(+), 19 deletions(-) + +commit 19e8c5c7f4a561f2454380c8f4098a832d716d28 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 19:27:33 2008 +0000 + + [test] Fix mismatched free. + + A couple of strings allocated using glib functions but freed with system + malloc. + + Reported: http://bugs.freedesktop.org/show_bug.cgi?id=19210. + + test/pdf2png.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6662eede2af2da50bff1902e694204c69e84f036 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 19:14:23 2008 +0000 + + [perf] Fix errors reported by cppcheck + + Trivial mistakes, identified in bugs + http://bugs.freedesktop.org/show_bug.cgi?id=19206 and + http://bugs.freedesktop.org/show_bug.cgi?id=19207. + + perf/cairo-perf-graph-files.c | 2 +- + perf/cairo-perf-report.c | 7 ++++--- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 8419c4f124c6ffa75b44901dccab33df8bb6287a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 20 15:34:41 2008 +0000 + + [perf] Correct another reference to '<cairo>' + + I think that's the last use of the old internal name for twin! + + perf/twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14d94d9354170003ec15847873a273c1752cf9f2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 2 02:56:38 2009 -0500 + + Fix various README typos + + HACKING | 2 +- + src/README | 4 ++-- + util/README | 6 ++++++ + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 28a72648ba7abe02ebd4df7234424e333b85dc9c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Dec 30 13:48:47 2008 -0500 + + [gstate] Change the glyph dropping safety margin from 2em to 10em + + The small margin caused bugs with math fonts. See: + https://bugzilla.mozilla.org/show_bug.cgi?id=460023 + + src/cairo-gstate.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit fa63c43532de4a38d59d2746c34c815d18121062 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 29 16:11:29 2008 +0000 + + [spline] Be pedantic and propagate errors. + + We know that the current users will always return SUCCESS, but propagate + the status return for future users. + + src/cairo-path-bounds.c | 6 ++---- + src/cairo-spline.c | 15 +++++++++++---- + src/cairo-types-private.h | 2 +- + src/cairoint.h | 2 +- + 4 files changed, 15 insertions(+), 10 deletions(-) + +commit 7df082dd8aaa9d31479a8bb1f6f1dfe07f52019a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 29 16:06:36 2008 +0000 + + [test] Update twin reference images + + Subsequent to recent tweaks, update the reference images for twin. + + test/Makefile.am | 6 ++---- + test/twin.c | 2 +- + test/twin.pdf.ref.png | Bin 1669 -> 0 bytes + test/twin.ps.ref.png | Bin 0 -> 1114 bytes + test/twin.ps2.ref.png | Bin 1095 -> 0 bytes + test/twin.ps3.ref.png | Bin 1095 -> 0 bytes + test/twin.ref.png | Bin 1712 -> 1492 bytes + test/twin.svg.ref.png | Bin 0 -> 1487 bytes + test/twin.svg11.argb32.ref.png | Bin 1797 -> 0 bytes + test/twin.svg11.ref.png | Bin 1662 -> 0 bytes + test/twin.svg11.rgb24.ref.png | Bin 1797 -> 0 bytes + test/twin.svg12.argb32.ref.png | Bin 1797 -> 0 bytes + test/twin.svg12.ref.png | Bin 1662 -> 0 bytes + test/twin.svg12.rgb24.ref.png | Bin 1797 -> 0 bytes + 14 files changed, 3 insertions(+), 5 deletions(-) + +commit e10af38799eb77f1a7b5f75e76c733353c7b8622 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 29 12:54:13 2008 +0000 + + make "make check" happy again + + Add the missing scoping that caused check-plt to complain. + + src/cairo-font-face-twin.c | 6 ++++-- + src/cairo-scaled-font.c | 2 ++ + src/cairo.c | 4 ++++ + src/cairoint.h | 8 +++++++- + 4 files changed, 17 insertions(+), 3 deletions(-) + +commit 010085622674bd02098742f401409da8e7c1b1dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 29 12:45:13 2008 +0000 + + [path] Remove tolerance from path bounders + + With Behdad's analytical analysis of the spline bbox, tolerance is now + redundant for the path extents and the approximate bounds, so remove it + from the functions parameters. + + src/cairo-analysis-surface.c | 3 +-- + src/cairo-gstate.c | 3 +-- + src/cairo-path-bounds.c | 18 ++++++------------ + src/cairo-surface-fallback.c | 1 - + src/cairoint.h | 5 +---- + 5 files changed, 9 insertions(+), 21 deletions(-) + +commit 84b81388bef4a2f300580081415fe09947edb96e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 29 12:16:53 2008 +0000 + + [test] Draw spline bbox + + Add the stroked extents to the spline-decomposition test. + + test/Makefile.am | 6 +-- + test/spline-decomposition.c | 63 ++++++++++++++++++++++++++++++++ + test/spline-decomposition.pdf.ref.png | Bin 20404 -> 19156 bytes + test/spline-decomposition.ps.ref.png | Bin 0 -> 9090 bytes + test/spline-decomposition.ps2.ref.png | Bin 8957 -> 0 bytes + test/spline-decomposition.ps3.ref.png | Bin 8957 -> 0 bytes + test/spline-decomposition.ref.png | Bin 20402 -> 19107 bytes + test/spline-decomposition.svg.ref.png | Bin 0 -> 19156 bytes + test/spline-decomposition.svg11.ref.png | Bin 20404 -> 0 bytes + test/spline-decomposition.svg12.ref.png | Bin 20404 -> 0 bytes + 10 files changed, 65 insertions(+), 4 deletions(-) + +commit efb17160904eda8fdb21fa1fd10a09081cf5cb3e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 16:06:27 2008 -0500 + + [_cairo_spline_bound] Protect against b == 0 + + src/cairo-spline.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 0b59e29004bb19eb9bd458bbe6a48a7c367f72d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 02:49:39 2008 -0500 + + [_cairo_spline_bound] Simplify condition + + src/cairo-spline.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 3bf1b7d574620b1ab3c1fa50977a23d36ab04a40 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 02:41:39 2008 -0500 + + [_cairo_spline_bound] Fix the check for feasible solutions + + Also make it more strict. The only times we call sqrt now is + when a solution in (0,1) exists. + + src/cairo-spline.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 7f840d156c1212eeb0fddad4b4a6844a9c070bd5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 02:02:30 2008 -0500 + + [spline] Save a couple more muls + + src/cairo-spline.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 3292f9906b3637564c37863dde5d214b0fee2885 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 01:59:12 2008 -0500 + + [spline] Do some checks to avoid calling sqrt() if no feasible solution exists + + src/cairo-spline.c | 27 ++++++++++++++++++++------- + 1 file changed, 20 insertions(+), 7 deletions(-) + +commit efe4d2ce99e65f9841951d3ff3e0536973bfb12c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 01:22:40 2008 -0500 + + [spline] Simplify code + + src/cairo-spline.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +commit 8672178bf6c7f3a38e11e224f1d484b1f0c7fd7b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 28 01:20:37 2008 -0500 + + [spline] Remove duplicated code by using a macro + + src/cairo-spline.c | 50 +++++++++++++++++++++----------------------------- + 1 file changed, 21 insertions(+), 29 deletions(-) + +commit ef0f6c3ca311c41c9062e1298b020eae1212984e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 27 23:13:45 2008 -0500 + + [spline] Add an analytical bounder for splines + + The way this works is very simple: Once for X, and once for Y, it + takes the derivative of the bezier equation, equals it to zero and + solves to find the extreme points, and if the extreme points are + interesting, adds them to the bounder. + + Not the fastest algorithm out there, but my estimate is that if + _de_casteljau() ends up breaking a stroke in at least 10 pieces, + then the new bounder is faster. Would be good to see some real + perf data. + + src/cairo-path-bounds.c | 18 ++----- + src/cairo-spline.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 6 +++ + 3 files changed, 141 insertions(+), 14 deletions(-) + +commit f2f62c7c4402a28a65c8171238d163af6b2fb95a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 20:28:54 2008 -0500 + + [twin] Micro-optimize + + src/cairo-font-face-twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 50bc2bc0170be2a9c84ae3064525b18190e22b48 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 27 11:46:24 2008 +0000 + + [path] Simply track the current point for bounds. + + The idea is to track always update the current point, but not add it + during a move-to. + + src/cairo-path-bounds.c | 25 +++++++++++-------------- + 1 file changed, 11 insertions(+), 14 deletions(-) + +commit 078ebb01ba0b99ab4973ba479fe438f0674aa102 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 27 11:29:15 2008 +0000 + + [path] Initialise spline from current point + + Joonas spotted that the breakage with the curve bounds was the result of + initialising the spline using the original move to point and not the + current point. + + Fixes: Bug 19256 Gnome Foot in gnome-games rendered incorrectly + (https://bugs.freedesktop.org/show_bug.cgi?id=19256) + + src/cairo-path-bounds.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4320ea68875cc015dfecdf5ed40195e276efca07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 26 00:01:01 2008 +0000 + + [trace] Fix up positional arguments + + James Cloos pointed out that the correct form to use is "$@" when + executing the command line. + + util/cairo-trace/cairo-trace.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e76a676c8f3d6dc9199cf0bc0856af0c659f4a16 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 25 09:51:51 2008 +0000 + + [twin] Trivial spelling correction. + + This ain't no decadent descendent of the Hershey font... + + src/cairo-font-face-twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9332c0a8eaf266e99555df9ad7769f8b5804cbfd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 16:38:04 2008 -0500 + + [util] Add waterfall + + util/Makefile.am | 3 +- + util/waterfall | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 99 insertions(+), 1 deletion(-) + +commit ab1febbf22a641feb2fda4b21156b2bd45df039b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 16:35:33 2008 -0500 + + [twin] Resnap margin under monospace + + src/cairo-font-face-twin.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 3c91d9f5a2a290653a56242eed6acae4f16e99e3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 16:30:01 2008 -0500 + + [twin] Adjust margins + + src/cairo-font-face-twin.c | 114 ++++++++++++++++++++++++++++----------------- + 1 file changed, 70 insertions(+), 44 deletions(-) + +commit 0b5c60bae1fb0924bbd43daab38932052e10b3be +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 15:48:46 2008 -0500 + + [twin] Clean up hinting + + src/cairo-font-face-twin.c | 89 ++++++++++++++++++++++------------------------ + 1 file changed, 42 insertions(+), 47 deletions(-) + +commit 6e7a2c4ce32ddfb0e58a74fcba8c4e46e46d32a4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 15:34:50 2008 -0500 + + [twin] Fix monospace for narrow glyphs + + src/cairo-font-face-twin.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit e8e6ae1294f11addcbc8a95db471bb48a50b0b1a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 15:15:15 2008 -0500 + + [twin] Cache pen and other properties on the scaled font + + src/cairo-font-face-twin.c | 170 +++++++++++++++++++++++++++------------------ + 1 file changed, 101 insertions(+), 69 deletions(-) + +commit e133cc14469e8ebb8311bf8db206147f6b07786d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 14:56:32 2008 -0500 + + [twin] Don't stretch pen + + src/cairo-font-face-twin.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit dec4d791f4cc626d1fa52d68518f787210240812 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 14:24:08 2008 -0500 + + [twin] Minor shuffling + + src/cairo-font-face-twin.c | 142 ++++++++++++++++++++++++++------------------- + 1 file changed, 81 insertions(+), 61 deletions(-) + +commit c3de08ee2fcfb0e092f0299e249b0f5fe56b87bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 14:11:52 2008 -0500 + + [twin] Further reduce weight + + src/cairo-font-face-twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5c201ef5cfdfdd4e19db7e0995b85fbb3f2e6090 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 26 00:05:19 2008 -0500 + + [scaled-font] Make cairo_debug_reset_static_data() work again + + I broke it in a5983929f8f07f384f78e0b604e22037cf5ed716 + + src/cairo-debug.c | 2 ++ + src/cairo-scaled-font.c | 4 +--- + src/cairoint.h | 3 +++ + 3 files changed, 6 insertions(+), 3 deletions(-) + +commit 730ed68ec1ac10dcb9c7c69759f72fcaa3ea82e5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 23:29:02 2008 -0500 + + [pattern] Fix comment typo + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a5f4a97aa4122d8c4b8f31053d421a52c356e270 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 02:48:26 2008 -0500 + + [twin] Don't hint pen if hint-style is SLIGHT + + src/cairo-font-face-twin.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0c7eaf6e0a2c2f0db634f8120fcbc03f7e8fd751 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 02:44:19 2008 -0500 + + [twin] Improve glyph hints + + src/cairo-font-face-twin-data.c | 202 +++++++++++++++++++++++----------------- + 1 file changed, 116 insertions(+), 86 deletions(-) + +commit e6205ea5a38c9de4c08b313a1beb70d4a38b0676 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 02:10:16 2008 -0500 + + [twin] Improve hinting + + src/cairo-font-face-twin.c | 90 +++++++++++++++++++--------------------------- + 1 file changed, 36 insertions(+), 54 deletions(-) + +commit da8658b67510daaefd542b80e6a997bbdfd82d44 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 01:35:36 2008 -0500 + + [twin] Hint dots + + src/cairo-font-face-twin-data.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit f4c81e18f85c6a68d682301abfd75e7c208c1e1a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 01:29:41 2008 -0500 + + [twin] Disable pen hinting if hinting is off + + src/cairo-font-face-twin.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +commit af91fc1974ce2dfbaab187e22769cdfb9e6279d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 01:24:46 2008 -0500 + + [twin] Optimize hinting + + src/cairo-font-face-twin.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 439959d1af1f6c4ce174a3fee524eacfc18a00bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 25 01:06:47 2008 -0500 + + [twin] Implement hinting + + src/cairo-font-face-twin.c | 148 +++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 129 insertions(+), 19 deletions(-) + +commit 9f9f5317dca6a9988a0a62aaa60393570157af63 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 22:29:59 2008 -0500 + + [util] Fix pangram + + util/cairo-view | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8296bc74c8687a2f52e06174e9dc70d32d1181c8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 18:00:04 2008 -0500 + + [twin] Reduce the weight just a bit, such that bold doesn't look as bad + + src/cairo-font-face-twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b2f89625453e2a15da175ea5b4ca5af6c2201d96 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 17:29:21 2008 -0500 + + [twin] Adjust baseline + + src/cairo-font-face-twin.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit f980d017d2360634f391eb1129317446bfe42cc9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 17:00:43 2008 -0500 + + [twin] Remove serif setting + + I don't think I'm going to implement serif-drawing soon, so, remove the + infrastructure. Can always be added back later. + + src/cairo-font-face-twin.c | 21 ++------------------- + 1 file changed, 2 insertions(+), 19 deletions(-) + +commit 1116febb40cb5e5f7eafe97999d1143347819b3f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 16:32:25 2008 -0500 + + [twin] Implement small-caps + + src/cairo-font-face-twin.c | 27 ++++++++++++++++----------- + 1 file changed, 16 insertions(+), 11 deletions(-) + +commit 6767673961401c7ab7b92eb8dfbb345efb560741 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 16:13:12 2008 -0500 + + [twin] Implement stretch + + src/cairo-font-face-twin.c | 27 +++++++++++++++++++++------ + 1 file changed, 21 insertions(+), 6 deletions(-) + +commit 0656e947f11356877014df93bd083123c7313dc3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 15:43:17 2008 -0500 + + [twin] Implement slant + + src/cairo-font-face-twin.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 9d493fcd16fb770f21fa732b08834f3a435fe1f2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 15:36:57 2008 -0500 + + [twin] Disable the serif mode + + src/cairo-font-face-twin.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 6c1d21bf8947f5b11702626ddfd9bac18073188d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 03:47:21 2008 -0500 + + [twin] Implement monospace + + src/cairo-font-face-twin.c | 30 +++++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +commit 5def8c587b2b897bfebc6d77a6a3e13355cae2f2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 24 03:45:06 2008 -0500 + + [twin] Fix dots + + src/cairo-font-face-twin-data.c | 54 +++++++++++++++++++++++++---------------- + 1 file changed, 33 insertions(+), 21 deletions(-) + +commit a303bbaea332df20b81f068366d701d66913c043 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Dec 23 16:12:56 2008 -0500 + + [font-face-get-type] Fix test to cleanup the surface and context properly + + Destroy the context and the surface even when the test fails. + + I ran into this because cairo_debug_reset_static_data() is called between the + tests on the quartz backend (it doesn't fork) and isn't on other backends? This + is perhaps a mistake... + + test/font-face-get-type.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 52cc31a7fa6570e538762631359a92e7b717710e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Dec 23 13:48:52 2008 -0500 + + [util] Add cairo-view + + util/Makefile.am | 3 +- + util/cairo-view | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 115 insertions(+), 1 deletion(-) + +commit 418c7ef133840c10eb0be7e75c7dd11533fbe897 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Dec 23 02:39:17 2008 -0500 + + [twin] Adjust font extents + + src/cairo-font-face-twin.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 96e41c28e980f313c51a0eed81681e7e48752797 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 20 23:30:59 2008 -0500 + + [twin] Minor cleanup + + src/cairo-font-face-twin.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 556f6ce364d81f9309162d21deb86a3d5b8b9a6e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 20 23:16:53 2008 -0500 + + [twin] close_path the Q + + src/cairo-font-face-twin-data.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6929ed800d19f359af7436636e8adc6203083a10 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 20 20:25:01 2008 -0500 + + [twin] Fix serif option parsing. Also make serif and weight do something + + src/cairo-font-face-twin.c | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +commit d423339fcef3c41225196c4371fb2c133ca61144 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 20 19:39:58 2008 -0500 + + [twin] Add face properties + + Just parse them now. We don't use them yet. + + src/cairo-font-face-twin.c | 191 +++++++++++++++++++++++++++++++++++++++++++-- + src/cairo-user-font.c | 4 +- + src/cairoint.h | 6 +- + 3 files changed, 189 insertions(+), 12 deletions(-) + +commit 93672d842f2b2c840bb9e73901faa4ce5df9c792 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 23 15:00:47 2008 +0000 + + [test] Fix reference handling in user-font-rescale + + user-font-rescale stored the current font on the context in order to + create a rescaling proxy font. As we failed to take a reference to the + font, it caught us by surprise when the font disappeared as we modified + the context before creating our proxy. Ho hum. + + test/user-font-rescale.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 5ad65dc4be5964265946de59a951f2304d64159e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 23 14:56:48 2008 +1030 + + Document PDF restrict_to_version API + + doc/public/cairo-sections.txt | 4 ++++ + doc/public/tmpl/cairo-pdf.sgml | 35 +++++++++++++++++++++++++++++++++++ + src/cairo-pdf.h | 2 ++ + 3 files changed, 41 insertions(+) + +commit 1869e0240bcc93c93e8abd1c8f930cf08ca8ee24 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 23 14:37:30 2008 +1030 + + Document cairo_surface_(set|get)_mime_data() and mime types + + doc/public/cairo-sections.txt | 5 ++++ + doc/public/tmpl/cairo-surface.sgml | 50 ++++++++++++++++++++++++++++++++++++-- + 2 files changed, 53 insertions(+), 2 deletions(-) + +commit 1f894033f077731485e1228f7e071e75c37a9947 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 23 03:14:38 2008 +0200 + + [spans] Close open subpaths when filling with a scan converter. + + As reported by Christian Persch, open subpaths weren't being + closed when rendering to an image surface: + + http://bugs.freedesktop.org/show_bug.cgi?id=19240 + + src/cairo-spans.c | 53 +++++++++++++++++++++++++++++++---------------------- + 1 file changed, 31 insertions(+), 22 deletions(-) + +commit 0aa34c6435eaa260292cf10d270ebbf3314c7924 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 23 02:18:14 2008 +0200 + + [svg] Fix build when building only the svg vector surface. + + The SVG vector surface pulls in font subsetting and that in turns + uses the PDF operators in cairo-type3-glyph-surface.c. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 38ec6e302cdd703447f169d95121d434c7495501 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 23 02:05:32 2008 +0200 + + [test] Fix any2ppm build when building without the full complement of surfaces. + + It was complaining about g_init_type () being used without the proper includes + which would have been pulled in by the svg or poppler includes. + + test/any2ppm.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6ce97907edfa8a7b09abfc090a9c03d235de2ada +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Dec 22 11:09:27 2008 +1030 + + win32-font: truncate instead of fail if toy font name too long + + http://lists.cairographics.org/archives/cairo/2008-December/016109.html + + src/cairo-win32-font.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit d99583bae680fea852e957afdf674e2031aa7928 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 21 17:03:17 2008 +1030 + + Fix win32 font breakage + + as a result of the toy font face changes in f7ab65e9b0c0f08be8d294e90131baa2decf1f1d + + src/cairo-win32-font.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit a5983929f8f07f384f78e0b604e22037cf5ed716 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 20 01:18:12 2008 -0500 + + [toy-font-face] Move toy font face code in a file of its own + + src/Makefile.sources | 1 + + src/cairo-debug.c | 2 +- + src/cairo-font-face.c | 449 ------------------------------------- + src/cairo-mutex-list-private.h | 2 +- + src/cairo-os2-surface.c | 9 +- + src/cairo-scaled-font.c | 4 +- + src/cairo-toy-font-face.c | 489 +++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 5 +- + 8 files changed, 497 insertions(+), 464 deletions(-) + +commit 8bf49b27aeea8179b5862a424fb3ef1934be6e0e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 19 20:46:36 2008 -0500 + + [font-face] Use cairo_font_face_t instead of toy, for nil objects + + And with a NULL backend. We are not supposed to read the nil objects + afterall. + + If this causes crashes, the crash site should be fixed. + + src/cairo-font-face.c | 55 ++++++++++----------------------------------------- + src/cairoint.h | 2 +- + 2 files changed, 11 insertions(+), 46 deletions(-) + +commit e3675f8ac0acb285b2d669c0a44322623dac5fe9 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri Dec 19 08:50:26 2008 -0500 + + Fix definition of _cairo_quartz_font_face_backend + + Removes the NULL so that _cairo_quartz_font_face_scaled_font_create + is in the correct location. + + src/cairo-quartz-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit fa7d96e1236cdfa0016f96e5c7b6bd209c405cba +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri Dec 19 08:47:07 2008 -0500 + + Fix compilation of quartz surface. + + Declares _cairo_quartz_scaled_font_backend ahead of time and makes it static. + Also, removes the 'static' from the _cairo_quartz_font_backend definition. + + src/cairo-quartz-font.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit f8886ad1b30ec9c29ec5ac3e9cd5519dbc9e7b65 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 18 20:50:20 2008 -0500 + + [scaled-font-zero-matrix] Destrory scaled font and font options + + Oops. + + test/scaled-font-zero-matrix.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4567692326daf592ab432670c6d33b49f940dd35 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 18 18:03:40 2008 -0500 + + Add test creating a scaled font with a zero ctm matrix + + test/Makefile.am | 1 + + test/scaled-font-zero-matrix.c | 59 ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 60 insertions(+) + +commit 18054ef00c69f62804e08734fd2c3286373b451f +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 18 18:01:52 2008 -0500 + + [test] Quartz doesn't like being forked + + When the cairo-test-suite forks CoreFoundation complains with: + "The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). + When forked so avoid doing it in the test suite for now. In the future we should investigate + the possibility of a work around. + + test/cairo-test-runner.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit b4e0d489bb0317fdd935ad2d29830e48b5ce4f6c +Merge: 813cbf1 f60da9a +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 18 17:25:17 2008 -0500 + + Merge branch '1.8' + + Conflicts: + NEWS + build/Makefile.am.changelog + cairo-version.h + src/cairo-gstate.c + +commit f60da9a379890a3a4cd74cdad48e73c22cb74160 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 18 17:07:25 2008 -0500 + + Fix _compute_transform to check for nearly degenerate matrices + + If a matrix was something like [0 .000001 0, .000001 0 0] the old code would + assume that xx and yy were greater than 0 and turn the nearly degenerate matrix + into an actual degenerate one. This caused things to blow up later on. Now we + check that our nearly rectangular matrices are not nearly degenerate, and let + the nearly degenerate ones fall through to the non-rectangular path. + + Note: I'm not sure why NEARLY_ZERO(d) is fabs(d) < 1/65536 instead of some + other value. Hopefully, it's a useful definition. + + This problem was found by a test case attached to: + https://bugzilla.mozilla.org/show_bug.cgi?id=467423 + + src/cairo-win32-font.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 813cbf13ddbd3d4b708b3b362dd6c108966f44d5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 14:52:03 2008 +0000 + + [path] Separate the approx. bounds into 3 distinct functions + + Based on feedback from Jeff Muizelaar, there is a case for a very quick + and dirty extents approximation based solely on the curve control points + (for example when computing the clip intersect rectangle of a path) and + by moving the stroke extension into a core function we can clean up the + interface for all users, and centralise the logic of approximating the + stroke extents. + + src/cairo-analysis-surface.c | 32 ++++++-------- + src/cairo-clip.c | 14 +++--- + src/cairo-path-bounds.c | 101 ++++++++++++++++++++++++++++++++++++++++--- + src/cairo-rectangle.c | 10 ----- + src/cairo-surface-fallback.c | 10 ++--- + src/cairoint.h | 19 +++++--- + 6 files changed, 134 insertions(+), 52 deletions(-) + +commit dea40e61babe608315b6d365094cf518814b134e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 11:50:00 2008 +0000 + + [path] Return the fixed-point bounds of the path + + When analysing the stroke extents, we need the original fixed-point + extents so that we do not incur an OBO when we round-to-integer a second + time. We also need a more accurate estimate than simply using the control + points of the curve, so pass in tolerance and decompose until someone + discovers a cheaper algorithm to determine the precise aligned bounding + box of a bezier curve. + + src/cairo-analysis-surface.c | 30 +++++++------- + src/cairo-clip.c | 25 +++++++----- + src/cairo-path-bounds.c | 95 ++++++++++++++++++++++---------------------- + src/cairo-rectangle.c | 10 +++++ + src/cairo-surface-fallback.c | 9 +++-- + src/cairoint.h | 9 ++++- + 6 files changed, 98 insertions(+), 80 deletions(-) + +commit 3a53e0261b1b5af21bf37e2a211eefd501bd5358 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 11:10:17 2008 +0000 + + [test] Update twin reference images. + + Closing the 'o' in twin has removed a slight artefact - update the reference + images to match. + + test/twin.pdf.ref.png | Bin 1673 -> 1669 bytes + test/twin.ref.png | Bin 1718 -> 1712 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit c2478de26cc1781b8f8604191a9f75ad29eac746 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 10:50:45 2008 +0000 + + [twin] Switch internal users to the new name. + + s/<cairo>/@cairo:/ + + doc/tutorial/src/twin.c | 2 +- + test/twin.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 3424b5f8c8cb1f2ef16b9e8429e64f720106f4d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 10:47:44 2008 +0000 + + [scaled-font] Make check-doc happy + + Replace a structure marker '#' with a macro marker '%'. + + src/cairo-scaled-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 449bf0bb7bff38da1c5d0286cb4f22c858bcc3a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 10:45:22 2008 +0000 + + [script] Silence incorrect compiler warnings + + Bah, the compiler failed to do its IPA correctly and wrongly complained + about potential use of uninitialised out-params guarded by the return + value. Silence them! + + util/cairo-script/cairo-script-operators.c | 38 +++++++++++++++--------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +commit ce0b136a441382b25d0932cd66a906a30a693365 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 20:34:45 2008 +0000 + + Query the backend to see if we can repaint the solid pattern. + + If we are dithering on the Xlib backend we can not simply repaint the + surface used for a solid pattern and must recreate it from scratch. + However, for ordinary XRender usage we do not want to have to pay that + price - so query the backend to see if we can reuse the surface. + + src/cairo-analysis-surface.c | 2 ++ + src/cairo-meta-surface.c | 1 + + src/cairo-paginated-surface.c | 1 + + src/cairo-pdf-surface.c | 1 + + src/cairo-script-surface.c | 1 + + src/cairo-surface.c | 41 ++++++++++++++++++++++++----------------- + src/cairo-xlib-surface.c | 12 +++++++++++- + src/cairoint.h | 5 +++++ + src/test-meta-surface.c | 1 + + src/test-paginated-surface.c | 1 + + 10 files changed, 48 insertions(+), 18 deletions(-) + +commit 0df43251d4b4641d16c0a2e2c49d18dd2a9c832e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 23:45:39 2008 +0000 + + [replay] Take advantage of unresolved fonts + + As Behdad has changed the underlying ft-font to accept unresolved patterns, + take advantage of that to simplify the replay code. + + util/cairo-script/cairo-script-operators.c | 16 ++-------------- + 1 file changed, 2 insertions(+), 14 deletions(-) + +commit 97a00bdd4eefade8d0808b5572bcdbba26c9c8f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 17:32:07 2008 +0000 + + [cairoint.h] Wrap macro in parenthesis + + Ensure that the stride calculation macro is not influenced by surrounding + precedence issues by enclosing it in a pair of parenthesis. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa65e756d496f4c3a8b43d2100e17dc39c2c26b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 5 11:21:11 2008 +0000 + + [script] Avoid creating 0x0 windows + + XCreateWindow dies if asked to create a 0x0 window, so don't and use a 1x1 + pixel window for a zero-sized surface. + + util/cairo-script/csi-replay.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 6458903c95c2bba3f1b9ceaaafb6979d180ab039 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 10:07:32 2008 +0000 + + [image] Eliminate the short-lived context used for coercing. + + When coercing from one image format to another we performed a paint + operation using a temporary context - this is overkill as we can just call + _cairo_surface_paint() directly. + + src/cairo-image-surface.c | 42 +++++++++++++++++++++++------------------ + src/cairo-scaled-font.c | 40 ++++++++++++++++++++------------------- + src/cairo-svg-surface.c | 18 ++++++++---------- + src/cairo-type3-glyph-surface.c | 20 ++++---------------- + src/cairoint.h | 4 ++-- + 5 files changed, 59 insertions(+), 65 deletions(-) + +commit 9b46d13b6cd58c711010df89a41b216c5cc8c881 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 23:52:32 2008 +0000 + + [trace] Runtime version check. + + Check that the application is using cairo >= 1.9 before attempting to + query the mime-data. + + util/cairo-trace/trace.c | 47 +++++++++++++++++++++++++---------------------- + 1 file changed, 25 insertions(+), 22 deletions(-) + +commit 2d790daa957471670f4ae0d3b22da89e4ee7111f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 18 00:47:08 2008 +0000 + + [pattern] Use a solid pattern for a uniform gradient. + + If each color stop in a gradient is identical, replace the gradient + surface with a simple solid surface. As seen in the wild. + + src/cairo-pattern.c | 54 ++++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 39 insertions(+), 15 deletions(-) + +commit 25a4677200ea6689be0dca9d533842dc7da54837 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 17 09:29:35 2008 +0000 + + [analysis] Use approximate extents. + + Use the approximate path based extents to avoid tessellation. + + src/cairo-analysis-surface.c | 54 ++++++++++++++------------------------------ + 1 file changed, 17 insertions(+), 37 deletions(-) + +commit 18bca91411e9ba6e1e58dbc945a0567d2661568f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 18 02:12:14 2008 -0500 + + [twin] close_path the 'o' + + src/cairo-font-face-twin-data.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5ee6aad471d460f960a5e7a5a8e35aca0f0af60e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 17 18:05:51 2008 -0500 + + [toy] Use twin font if font backend returns UNSUPPORTED + + src/cairo-font-face.c | 19 ++++++++----------- + 1 file changed, 8 insertions(+), 11 deletions(-) + +commit eb069094ea4471b3e63881fe0f8b958ad8924c7d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 17 17:30:34 2008 -0500 + + Treat any toy family starting with "@cairo:" as request for twin + + src/cairo-font-face.c | 3 ++- + src/cairoint.h | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 32c66109059398e88f50335bef75fa8c0e51c4c8 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Dec 17 17:43:37 2008 -0500 + + Call _cairo_error when propagating error status from the font_face. + + src/cairo-gstate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d72e53c3e99f93aa59967c76f1b1b4c035b9130 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Dec 17 17:42:18 2008 -0500 + + Add a missing _cairo_error() to a bunch of status returns. + + src/cairo-misc.c | 4 ++-- + src/cairo-scaled-font.c | 14 +++++++------- + src/cairo.c | 2 +- + 3 files changed, 10 insertions(+), 10 deletions(-) + +commit af3a892c3ef6a7c1d28d523944bbb67e59edc1de +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 17 16:45:28 2008 -0500 + + [ft] Remove stale comment + + src/cairo-ft-font.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 0137b9bd320783264d865a397392b0ee14fd69b3 +Author: Karl Tomlinson <karlt+@karlt.net> +Date: Wed Dec 17 16:40:12 2008 -0500 + + [ft] Don't call FT_Done_Face() on faces we did not create + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4d7c87b5e449a743a68dd256faaa3242f191a44 +Author: Karl Tomlinson <karlt+@karlt.net> +Date: Wed Dec 17 16:40:12 2008 -0500 + + [ft] Don't call FT_Done_Face() on faces we did not create + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6778a5f67ae2e35e809cf4464530e2bb05870378 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 17 16:19:45 2008 -0500 + + [.gitignore] Update + + build/.gitignore | 2 ++ + src/.gitignore | 1 + + 2 files changed, 3 insertions(+) + +commit 26f471999973c538e45db0ae9f0227fbe5dedf24 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 17 16:08:32 2008 -0500 + + [scaled-font] Improve docs + + src/cairo-scaled-font.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit f7ab65e9b0c0f08be8d294e90131baa2decf1f1d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 17 06:25:50 2008 -0500 + + Clean up toy font face handling + + This commit moves the toy-to-real mapping from the scaled font creation + time to font face creation. A toy font face will keep an internal ref + to an implementation face. Then cairo_scaled_font_create() will simply + substitute the implementation face before creating anything. + + This also modifies the cairo-ft toy creation in that we now create a + non-resolved pattern and store it in a cairo-ft font-face. We then + do the resolving and unscaled font creation at scaled-font creation + time. This also means that cairo_ft_font_face_create_for_pattern() + now accepts non-resolved patterns too, and does the right thing about + them. As much as that can be called right. + + Some testing of toy font creation performance is in order, as is testing + win32 and quartz font backends. + + src/cairo-font-face.c | 143 +++++++++---------- + src/cairo-ft-font.c | 371 +++++++++++++++++++++++++++++------------------- + src/cairo-quartz-font.c | 208 ++++++++++----------------- + src/cairo-scaled-font.c | 19 ++- + src/cairo-user-font.c | 62 +------- + src/cairo-win32-font.c | 20 +-- + src/cairoint.h | 40 +++--- + 7 files changed, 412 insertions(+), 451 deletions(-) + +commit 43edb4dd7b8d0614a6c2be15dfa72f980dd55f1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 12 18:10:58 2008 +0000 + + Fix compilation with gcov + + We need to add --coverage to LDFLAGS, so create CAIRO_LDFLAGS and use that + to populate AM_LDFLAGS. + + boilerplate/Makefile.am | 1 + + build/configure.ac.analysis | 6 +++++- + build/configure.ac.features | 1 + + src/Makefile.am | 3 ++- + test/Makefile.am | 17 +++++++++-------- + 5 files changed, 18 insertions(+), 10 deletions(-) + +commit bcea3151d66495f03d67ce71274203d0515caf4c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 12 14:08:11 2008 +0000 + + [test] Add missing joins.ref.png + + Missed this file when adding the reference images for joins. + + test/joins.ref.png | Bin 0 -> 5879 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 8cec548854d86dac8f0c99e99461421c8ad653b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 14:06:07 2008 +0000 + + [NEWS] Add notes for 1.8.6 + + Add the historical blurb for 1.8.6. + + NEWS | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 49 insertions(+) + +commit 0a1d194ad85398c8711268fd9ba679f8609206a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 14:53:27 2008 +0000 + + [perf] Fix for git-1.6 + + git-1.6 moved all the subcommands out of the PATH so update our usage. + + perf/cairo-perf-graph | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1c2eba92c16207a48f9c8f52065fbf9a65d16fcd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 13:05:01 2008 +0000 + + [RELEASING] Update Makefile for git-1.6 + + Git moved all the subcommands out of the PATH, so we need to update our + usage. + + build/Makefile.am.changelog | 4 ++-- + build/Makefile.am.releasing | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2fa6b6353740b7941e90e50bf6b0eb5f06aa11b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 11:40:12 2008 +0000 + + [RELEASING] Correct a few minor typos. + + As I was reading through the instructions, take the opportunity to fix a + few spelling mistakes. + + RELEASING | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 1950abd14c28d58913c085d3829eb99a078cf2d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 11:26:56 2008 +0000 + + [doc] Fix erroneous doc comment. + + A normal comment was marked as a gtk-doc entry and thus causing gtk-doc to + complain. + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9485cd947f982ecd1e4f8d948786af3265d6eb74 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 16:35:14 2008 +0000 + + Increment version to 1.8.7 after the 1.8.6 release. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2a2eddcfb8fc73f3decdb91c00e8e6d5282e09c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 14:07:11 2008 +0000 + + Increment version to 1.8.6 + + In preparation for the next stable release. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ef7c42a7d390064b2a5b08e14d5f65b8ea4628e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 14:06:07 2008 +0000 + + [NEWS] Add notes for 1.8.6 + + Add the historical blurb for 1.8.6. + + NEWS | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 50 insertions(+) + +commit ce91e6ac360e1dbe57a4e729b68d84499603e9ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 14:53:27 2008 +0000 + + [perf] Fix for git-1.6 + + git-1.6 moved all the subcommands out of the PATH so update our usage. + + perf/cairo-perf-graph | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f8372509aff662e9cbabeb99560b01019395c15e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 13:05:01 2008 +0000 + + [RELEASING] Update Makefile for git-1.6 + + Git moved all the subcommands out of the PATH, so we need to update our + usage. + + build/Makefile.am.changelog | 4 ++-- + build/Makefile.am.releasing | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 9faa9a214994fe27a0cb27a298881f23c2050bbe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 11:40:12 2008 +0000 + + [RELEASING] Correct a few minor typos. + + As I was reading through the instructions, take the opportunity to fix a + few spelling mistakes. + + RELEASING | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit b1be4196513263bdbf58944ea6ac87708a399c5f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 14 11:26:56 2008 +0000 + + [doc] Fix erroneous doc comment. + + A normal comment was marked as a gtk-doc entry and thus causing gtk-doc to + complain. + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 79bd32a6ccb1a882ddd2b1585ab155f568bf5ec7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 6 13:32:37 2008 +0200 + + [perf-diff] Fix cairo-perf-diff for git 1.6 + + Since git 1.6 the plumbing commands aren't installed in the user's + path by default. This patch fixes cairo-perf-diff to find the + git-sh-setup command from git's lib dir. + (cherry picked from commit 0c0f4862c52d68776024f125b003ade455044b27) + + perf/cairo-perf-diff | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 97b5240beeb9206f4dbda6ffce33b51aa16eec2f +Author: Julien Danjou <julien@danjou.info> +Date: Tue Nov 18 10:01:49 2008 +0100 + + [xcb] check for render extension presence + + Otherwise this may leads to an invalid memory access to r. + + Fixes: Bug 18588 - XCB backend fails with missing render. + https://bugs.freedesktop.org/show_bug.cgi?id=18588 + + Signed-off-by: Julien Danjou <julien@danjou.info> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + (cherry picked from commit 834f1d7b7097dcc3a32f6c65d21e87fd272d924a) + + AUTHORS | 1 + + src/cairo-xcb-surface.c | 8 ++++++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 6fed98c0d3b0708ad5171654179a482fa7d88805 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 5 21:14:45 2008 +0000 + + [gstate] Remove culled glyphs from clusters. + + Sascha Steinbiss reported a bug where the PDF backend was reading beyond + the end of the glyph array: + http://lists.cairographics.org/archives/cairo/2008-December/015976.html. + + It transpires that in the early glyph culling in the gstate we were + not updating the clusters to skip culled glyphs. + + src/cairo-gstate.c | 223 ++++++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 176 insertions(+), 47 deletions(-) + +commit 2b7c6f361a3cfe309ff0bcb606b808acbf36aa0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 12:33:12 2008 +0000 + + [skiplist] Allocate elements in chunks. + + Use a pool allocator to preallocate a chunk from which to allocate the + skiplist elements (if we failed to reallocate from the freelists). + + src/cairo-bentley-ottmann.c | 33 ++++++++++++----- + src/cairo-skiplist-private.h | 3 +- + src/cairo-skiplist.c | 85 +++++++++++++++++++++++++++++++++++--------- + 3 files changed, 94 insertions(+), 27 deletions(-) + +commit 903b39c30448d62e2cbf9d075c5256a333bd5d8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 4 15:22:01 2008 +0000 + + [test] Make the xlib-fallback use the image refs. + + The xlib-fallback is closer to the image than the xlib backend, so prefer + not to use the xlib.ref.png. + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 792057539bf814cc00447a0a53978e0af3efe270 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 3 10:52:59 2008 +0000 + + [test] Only delete output images beneath output. + + We were using an overly-liberal find that also deleted copied output for + use in CAIRO_REF_DIR if that directory was below test/. So only delete + files below output/ (which should only be used by cairo-test). + + test/Makefile.am | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 913cbad25e08a07c05b8c2e6ddd3c343ca2462b2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 2 13:06:50 2008 +0000 + + [test] Add a simple joins test case + + Exercise joins between short (<LINE_WIDTH) lines - used in debugging + stroke-to-path. + + test/Makefile.am | 3 ++ + test/joins.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ + test/joins.ps.ref.png | Bin 0 -> 5496 bytes + 3 files changed, 112 insertions(+) + +commit 9f4f41de7d20ee46ee8ca06716cbc18e55cfcf86 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 2 13:05:30 2008 +0000 + + [tutorial] Correct twin font name + + We changed the name for the builtin font from "cairo" to "<cairo>" to + reduce possible naming conflicts - update the tutorial to match. + + doc/tutorial/src/twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4ff884fe4df64234a7da4635d78ffafabe00f18c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 30 19:18:15 2008 +0000 + + [test] Check idempotency of append_path() -> copy_path() + + The API should preserve the precision across the public interface so that + the user is able to retrieve the co-ordinates that he used to construct + the path. However since we transform the path to a 24.8 fixed-point + internal represent we currently incur a precision-loss - the affects of + which can be seen in the miter-precision test case for example. It is + planned to move to keeping the path as doubles until the backend + explicitly requests the fixed-point coodinates (and some backends, e.g. + pdf, might only ever use the doubles). Then, barring rounding errors + during path transformations, we should be able to return the exact path + the user set (under an identity CTM, of course ;-). + + test/Makefile.am | 1 + + test/path-precision.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 109 insertions(+) + +commit fe4af195a7880336894a5fbae86740ef55c14cbf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 30 13:48:11 2008 +0000 + + [test] Add a rectilinear-dash test case. + + Exercise dashing on pixel-aligned boundaries to test extending the + rectilinear stroker to handle dashes. + + test/Makefile.am | 2 + + test/rectilinear-dash.c | 176 ++++++++++++++++++++++++++++++++++++++++++ + test/rectilinear-dash.ref.png | Bin 0 -> 291 bytes + 3 files changed, 178 insertions(+) + +commit 1d68ee73f8d406671d25a1ab6c3cfb096a7a6ce7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 23 08:59:56 2008 +0000 + + [pattern] Compute the combined color content. + + When multiplying two colors together, the combined content is simply the + or of the their contents. + + src/cairo-pattern.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 30cef3116ed960a94323477154896a03c4fb30bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 11 01:45:31 2008 +0000 + + [spans] Add a sentinel cell to the cell_list. + + By terminating the list with a cell for INT_MAX, we remove a few + conditionals from the hot-paths. + + src/cairo-tor-scan-converter.c | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +commit 3b2bb95249afdc3a705d0ce5205019e7d9d31020 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 11 01:22:37 2008 +0000 + + [spans] Embed 64 edge buckets into polygon + + Frequently we only need a few y-buckets, so embed 64 into the parent + structure. + + src/cairo-tor-scan-converter.c | 40 ++++++++++++---------------------------- + 1 file changed, 12 insertions(+), 28 deletions(-) + +commit 70235df72e3f33482527090d7039d8cab7ef6ff9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 11 00:32:13 2008 +0000 + + [spans] Pool capacity is in bytes not elements. + + Set the polygon capacity to a shade under 8k, not 200 bytes, reducing the + number of malloc calls made by the scan convertor by a factor of 40! + + src/cairo-tor-scan-converter.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6f284587a4ef829a1666fe730e590b59e4eedd5e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 13:50:23 2008 +0000 + + [script] Add examples + + Add some simple examples to demonstrate CairoScript, courtesy of M Joonas + Philaja. + + configure.ac | 1 + + util/cairo-script/Makefile.am | 2 + + util/cairo-script/examples/Makefile.am | 10 + + util/cairo-script/examples/dragon.cs | 48 + + util/cairo-script/examples/hilbert.cs | 51 + + util/cairo-script/examples/infinichess.cs | 29 + + util/cairo-script/examples/interference.cs | 46 + + util/cairo-script/examples/pythagoras-tree.cs | 53 + + util/cairo-script/examples/sierpinski.cs | 37 + + .../examples/wedgeAnnulus_crop_ybRings.cs | 30 + + util/cairo-script/examples/world-map.cs | 209 +++ + util/cairo-script/examples/zrusin.cs | 1333 ++++++++++++++++++++ + 12 files changed, 1849 insertions(+) + +commit 463dc2891312e3658875d6964a91e7e875de4b38 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 21:09:14 2008 +0000 + + [script] Allocate the interned strings from a permanent pool + + Reduce memory fragmentation by allocating the permanent strings from a + single pool. + + util/cairo-script/cairo-script-interpreter.c | 52 ++++++++++++++++++++++------ + util/cairo-script/cairo-script-private.h | 4 +++ + 2 files changed, 45 insertions(+), 11 deletions(-) + +commit adc9c90d79cf4bf5e3789ceadab6a49da746274a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 21:00:11 2008 +0000 + + [script] Freed object cache. + + Cache the last freed object to reduce malloc pressure. + + util/cairo-script/cairo-script-hash.c | 3 - + util/cairo-script/cairo-script-interpreter.c | 16 ++-- + util/cairo-script/cairo-script-objects.c | 118 ++++++++++++++++++--------- + util/cairo-script/cairo-script-private.h | 5 +- + 4 files changed, 91 insertions(+), 51 deletions(-) + +commit 1042909796295234d8aadf674824d306d7bcc9b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 17:56:19 2008 +0000 + + [script] Replay multiple files. + + Iterate over the argument vector and replay each file on the command line. + + util/cairo-script/csi-replay.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c5c04528b51b9025f48fb0f3b1c4a8dc98acb214 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 17:30:21 2008 +0000 + + [script] Slab allocator + + Allocate small objects from a pool and maintain a per-size free-list. + + util/cairo-script/cairo-script-interpreter.c | 65 +++++++++++++++++++++++++++- + util/cairo-script/cairo-script-private.h | 22 ++++++++++ + 2 files changed, 85 insertions(+), 2 deletions(-) + +commit 83f0e6cf6245c0b3fd7a9b572e5dcea9b633a644 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 16:46:05 2008 +0000 + + [script] Inline the stack push + + Frequently to push an object onto the stack all we need is to simply + perform the struct copy - so inline it and only call the out-of-line + function if we need to enlarge the stack. + + util/cairo-script/cairo-script-interpreter.c | 20 ++++++------- + util/cairo-script/cairo-script-operators.c | 43 +++++++--------------------- + util/cairo-script/cairo-script-private.h | 14 ++++++++- + util/cairo-script/cairo-script-stack.c | 13 ++++----- + 4 files changed, 39 insertions(+), 51 deletions(-) + +commit 565b3d6ad64fe9d35ebddb4f6b46e492740ee59f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 15:16:02 2008 +0000 + + [script] Switch to hyphens. + + Using hyphen in the operators is easier to read than underscores. + + src/cairo-script-surface.c | 60 ++++----- + util/cairo-script/cairo-script-operators.c | 189 +++++++++++++++++++---------- + util/cairo-trace/trace.c | 114 ++++++++--------- + 3 files changed, 211 insertions(+), 152 deletions(-) + +commit 3abfd836a021a2950b7eea97f3b30011d58efcc8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 14:34:41 2008 +0000 + + [script] Null constructor + + Expose 'null', principally for comparison purposes. + + util/cairo-script/cairo-script-operators.c | 8 +++++++- + util/cairo-script/cairo-script-private.h | 7 +++++++ + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit 7540ac7f23db47ee3f58a557ce91aaf1c0bc72d5 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 9 07:52:21 2008 +0200 + + [script] Reverse direction of bitshift. + + Positive shift counts should shift left according to PostScript. + + util/cairo-script/cairo-script-operators.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4be479cc63a783da18652528f33bd08427a74fe7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 13:20:06 2008 +0000 + + [script] Add simple to integer converter + + Simple operator to coerce the type of the object on top of the stack to + integer. + + util/cairo-script/cairo-script-operators.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 6711b591b9efd8f116f2683f17d52e9a9ddfbaba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 12:34:30 2008 +0000 + + [script] Simple replay. + + Basic script executer. + + util/cairo-script/.gitignore | 1 + + util/cairo-script/Makefile.am | 5 ++++- + util/cairo-script/csi-exec.c | 29 +++++++++++++++++++++++++++++ + 3 files changed, 34 insertions(+), 1 deletion(-) + +commit 177a68ef3ecd1717b81c93c53f8c7ae27838e2e5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 13:21:19 2008 +0000 + + [script] Add a few mathematical constants + + Just pi and the sqrt(2) for the moment, more to come on demand. + + util/cairo-script/cairo-script-interpreter.c | 26 ++++++++++++++++++++++++++ + util/cairo-script/cairo-script-operators.c | 17 +++++++++++++++++ + util/cairo-script/cairo-script-private.h | 8 ++++++++ + 3 files changed, 51 insertions(+) + +commit 5dfaa22a578ff6561e8d15a8c08546c840476313 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 12:26:09 2008 +0000 + + [script] Add repeat operator. + + Simple operator to repeat procedure n times. + + util/cairo-script/cairo-script-operators.c | 37 +++++++++++++++++++++++++++++- + 1 file changed, 36 insertions(+), 1 deletion(-) + +commit 738cb327450821db2d3689e514376c0d9bc55e87 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 9 05:59:19 2008 +0200 + + [script] Fix \t escapes in string literals. + + Typo \r -> \t. + + util/cairo-script/cairo-script-scanner.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 265ebd372a4fd510bc29c749a46393ee7caace41 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Dec 8 10:14:33 2008 +0200 + + [script] Flesh out the relational comparison operators to be more PostScript-like. + + The relational comparison operators can now compare strings vs names + by content as well as performing automatic type promotions on the + numeric types. For other types relational comparisons succeeed + only if the values compare equal according to the eq operator, and + put the interpreter into a type-error state otherwise. + + util/cairo-script/cairo-script-objects.c | 103 +++++++++++++++++++++ + util/cairo-script/cairo-script-operators.c | 144 +++++------------------------ + util/cairo-script/cairo-script-private.h | 5 + + 3 files changed, 132 insertions(+), 120 deletions(-) + +commit 05afec7a8ac590d0d53a254895796f36a8b0eaf3 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Dec 8 10:06:53 2008 +0200 + + [script] Implement the ne operator. + + util/cairo-script/cairo-script-operators.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +commit 1aeb96dc287b516955db1909995e45fe26d4f87a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Dec 8 10:03:57 2008 +0200 + + [script] Implement PostScript-like semantics for the eq operator. + + The eq operator would only work for some types and put the + interpreter in an error state if passed objects it didn't + know how to compare. It would also not compare strings + by value nor allow strings to be compared to names. + This patch makes any two objects comparable. + + util/cairo-script/cairo-script-objects.c | 92 ++++++++++++++++++++++++++++++ + util/cairo-script/cairo-script-operators.c | 64 +-------------------- + util/cairo-script/cairo-script-private.h | 4 ++ + 3 files changed, 97 insertions(+), 63 deletions(-) + +commit 620028fd19b091f525964b689ebd3a70e1636da2 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Dec 8 09:23:37 2008 +0200 + + [script] Don't segfault when hashing empty strings. + + Check for the empty string. + + util/cairo-script/cairo-script-interpreter.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 4ba77f776509caad030edf818a076ea9b071ad23 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Dec 8 07:16:14 2008 +0200 + + [script] Fix dictionary construction to access the right stack slots. + + It bound values to themselves and ignored keys. + + util/cairo-script/cairo-script-operators.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit af53297a97eec505ac2a90768badda72056c6e3b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 11 00:35:20 2008 +0000 + + [cairo] Use a stack buffer for text path. + + First try to allocate glyphs from the stack, similar to cairo_show_text(). + + src/cairo.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 09589e20e14476df609581027d14628f52091e71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 23:45:44 2008 +0000 + + [clip] Intersect to region extents. + + When querying the intersection of a rectangle with the clip region, the + result only depends upon the region extents so we do not need to perform + an expensive region-region intersection computation. + + src/cairo-clip.c | 18 +++++------------- + src/cairo-surface-fallback.c | 1 - + 2 files changed, 5 insertions(+), 14 deletions(-) + +commit c5acb125e9509570c407a069f7e89acfbadda57b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 23:06:22 2008 +0000 + + [surface] Avoid a short-lived context during fallback_clone_similar() + + We can paint to the surface directly without need of a temporary context, + so do so. + + src/cairo-surface-fallback.c | 41 +++++++++++++++++++---------------------- + 1 file changed, 19 insertions(+), 22 deletions(-) + +commit 888f62feaa73be326d41a485c0bcf81a3e466ee1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 17:42:16 2008 +0000 + + [test] Propagate error from path + + If the path is in error, just append it to the context so that the error + is propagated correctly. + + test/copy-path.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit f13f63e3d85d28a17a3cb60b7d1a7b552f2b6872 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 08:54:03 2008 +0000 + + [test/clip-nesting] Propagate status from sub-context. + + Use cairo_path_append() to propagate an error status from a child context + to it parent so that it is properly reported under memfault. + + test/clip-nesting.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit e6e33b036f9de5087a72cf1de9c0a4ce97c75812 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 10 08:50:57 2008 +0000 + + [test/solid-pattern-cache-stress] Propagate status from sub-contexts. + + Use a cairo_append_path() to set an arbitrary error status on the parent + context, in order to propagate errors from a child. + + test/solid-pattern-cache-stress.c | 32 +++++++++++++++++++++++++------- + 1 file changed, 25 insertions(+), 7 deletions(-) + +commit bcb2724920aa1bca1a9a82b5017d3180f5f9523e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 9 20:44:25 2008 +0000 + + [path] Mark points as const during _cairo_path_fixed_interpret() + + Use const to document the read-only nature of the arguments passed to the + callbacks. + + src/cairo-path-bounds.c | 33 ++++-------- + src/cairo-path-fill.c | 33 +++--------- + src/cairo-path-fixed.c | 86 ++++++++++++++--------------- + src/cairo-path-in-fill.c | 12 +++-- + src/cairo-path-stroke.c | 108 +++++++++++++------------------------ + src/cairo-path.c | 26 +++++---- + src/cairo-pdf-operators.c | 12 +++-- + src/cairo-pen.c | 4 +- + src/cairo-quartz-surface.c | 11 ++-- + src/cairo-rectangle.c | 6 +-- + src/cairo-scaled-font.c | 12 +++-- + src/cairo-script-surface.c | 12 +++-- + src/cairo-spans.c | 18 +++---- + src/cairo-svg-surface.c | 15 +++--- + src/cairo-type1-fallback.c | 16 +++--- + src/cairo-types-private.h | 3 +- + src/cairo-win32-printing-surface.c | 12 +++-- + src/cairoint.h | 12 ++--- + 18 files changed, 186 insertions(+), 245 deletions(-) + +commit 68b29cafa597128e7cae86608e04ecae6070dad9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 9 20:15:34 2008 +0000 + + [spline] Propagate errors during add point. + + Yikes! The callback could fail so we need to propagate the error status. + + src/cairo-path-fill.c | 11 +++-------- + src/cairo-path-fixed.c | 7 ++----- + src/cairo-path-in-fill.c | 7 ++----- + src/cairo-path-stroke.c | 14 ++++++-------- + src/cairo-pen.c | 23 ++++++++++++----------- + src/cairo-spline.c | 40 ++++++++++++++++++++-------------------- + src/cairo-types-private.h | 6 +++++- + src/cairoint.h | 9 ++------- + 8 files changed, 52 insertions(+), 65 deletions(-) + +commit 2f3905dec38a710234aba30e1983b80ea3066a50 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 9 19:21:35 2008 +0000 + + [image] Set status on error path. + + We failed to set the status after cairo_image_surface_create() returned an + error. + + src/cairo-image-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dfc49a67e62bea359b33413e9b882e92952431de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 9 14:44:51 2008 +0000 + + [test] Trim the number of fallback resolutions tested. + + Simplify the test matrix to only include testing the fallback-resolution + of a uniform scale in one or both axes. + + test/Makefile.am | 20 --- + test/fallback-resolution.c | 222 ++++++++++++++------------ + test/fallback-resolution.ppi150x150.ref.png | Bin 8043 -> 8058 bytes + test/fallback-resolution.ppi150x300.ref.png | Bin 6848 -> 0 bytes + test/fallback-resolution.ppi150x37.5.ref.png | Bin 13176 -> 0 bytes + test/fallback-resolution.ppi150x600.ref.png | Bin 6338 -> 0 bytes + test/fallback-resolution.ppi150x72.ref.png | Bin 8370 -> 8303 bytes + test/fallback-resolution.ppi150x75.ref.png | Bin 10445 -> 0 bytes + test/fallback-resolution.ppi300x150.ref.png | Bin 6851 -> 0 bytes + test/fallback-resolution.ppi300x300.ref.png | Bin 5637 -> 5639 bytes + test/fallback-resolution.ppi300x37.5.ref.png | Bin 12870 -> 0 bytes + test/fallback-resolution.ppi300x600.ref.png | Bin 4848 -> 0 bytes + test/fallback-resolution.ppi300x72.ref.png | Bin 7053 -> 7014 bytes + test/fallback-resolution.ppi300x75.ref.png | Bin 9617 -> 0 bytes + test/fallback-resolution.ppi37.5x150.ref.png | Bin 12728 -> 0 bytes + test/fallback-resolution.ppi37.5x300.ref.png | Bin 11981 -> 0 bytes + test/fallback-resolution.ppi37.5x37.5.ref.png | Bin 14098 -> 14092 bytes + test/fallback-resolution.ppi37.5x600.ref.png | Bin 11654 -> 0 bytes + test/fallback-resolution.ppi37.5x72.ref.png | Bin 12990 -> 12906 bytes + test/fallback-resolution.ppi37.5x75.ref.png | Bin 13787 -> 0 bytes + test/fallback-resolution.ppi600x150.ref.png | Bin 6096 -> 0 bytes + test/fallback-resolution.ppi600x300.ref.png | Bin 4812 -> 0 bytes + test/fallback-resolution.ppi600x37.5.ref.png | Bin 12401 -> 0 bytes + test/fallback-resolution.ppi600x600.ref.png | Bin 4104 -> 4090 bytes + test/fallback-resolution.ppi600x72.ref.png | Bin 6398 -> 6326 bytes + test/fallback-resolution.ppi600x75.ref.png | Bin 8974 -> 0 bytes + test/fallback-resolution.ppi72x150.ref.png | Bin 8069 -> 8061 bytes + test/fallback-resolution.ppi72x300.ref.png | Bin 6803 -> 6911 bytes + test/fallback-resolution.ppi72x37.5.ref.png | Bin 13147 -> 13167 bytes + test/fallback-resolution.ppi72x600.ref.png | Bin 6245 -> 6214 bytes + test/fallback-resolution.ppi72x72.ref.png | Bin 8409 -> 8416 bytes + test/fallback-resolution.ppi72x75.ref.png | Bin 10628 -> 10620 bytes + test/fallback-resolution.ppi75x150.ref.png | Bin 9940 -> 0 bytes + test/fallback-resolution.ppi75x300.ref.png | Bin 9003 -> 0 bytes + test/fallback-resolution.ppi75x37.5.ref.png | Bin 14020 -> 0 bytes + test/fallback-resolution.ppi75x600.ref.png | Bin 8455 -> 0 bytes + test/fallback-resolution.ppi75x72.ref.png | Bin 10202 -> 10119 bytes + test/fallback-resolution.ppi75x75.ref.png | Bin 12101 -> 12127 bytes + 38 files changed, 121 insertions(+), 121 deletions(-) + +commit 0ebbcd671c362d98a60214872fa48aee1e42dde1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 9 14:30:58 2008 +0000 + + [test] Fix memleak from fallback-resolution. + + The test-name was being recreated for every pass, but was never freed. + + test/fallback-resolution.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit a9697e5fb04d045fe7aaf0cee80c41eb9d09e1c1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 12 11:08:13 2008 +0000 + + [test] Exercise glyph culling. + + Sascha Steinbiss reported an issue with glyph culling, + http://lists.cairographics.org/archives/cairo/2008-December/015976.html, + whereby we failed to update the text clusters upon culling the glyphs in + the gstate and proceeded to read beyond the end of the glyph array in the + PDF backend. This test case setups a similar condition as reported, by + trying to write a wide string into a small box. + + test/Makefile.am | 3 ++ + test/culled-glyphs.c | 62 ++++++++++++++++++++++++++++++++++++++++++ + test/culled-glyphs.ps.ref.png | Bin 0 -> 372 bytes + test/culled-glyphs.ref.png | Bin 0 -> 434 bytes + 4 files changed, 65 insertions(+) + +commit 095a1fd7860bd1f6d4116766ade0ec9a382bb957 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 5 21:14:45 2008 +0000 + + [gstate] Remove culled glyphs from clusters. + + Sascha Steinbiss reported a bug where the PDF backend was reading beyond + the end of the glyph array: + http://lists.cairographics.org/archives/cairo/2008-December/015976.html. + + It transpires that in the early glyph culling in the gstate we were + not updating the clusters to skip culled glyphs. + + src/cairo-gstate.c | 223 ++++++++++++++++++++++++++++++++++++++++++----------- + src/cairo.c | 9 ++- + 2 files changed, 183 insertions(+), 49 deletions(-) + +commit 834f1d7b7097dcc3a32f6c65d21e87fd272d924a +Author: Julien Danjou <julien@danjou.info> +Date: Tue Nov 18 10:01:49 2008 +0100 + + [xcb] check for render extension presence + + Otherwise this may leads to an invalid memory access to r. + + Fixes: Bug 18588 - XCB backend fails with missing render. + https://bugs.freedesktop.org/show_bug.cgi?id=18588 + + Signed-off-by: Julien Danjou <julien@danjou.info> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + AUTHORS | 1 + + src/cairo-xcb-surface.c | 8 ++++++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit e184bf0d3592c8703b1193d37553cdcdee313139 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 12 10:12:43 2008 +0000 + + Fix compilation with --enable-png=no + + Adrian Johnson spotted that the build was broken if the PNG functions were + disabled. Fix. + + src/cairoint.h | 1 - + util/cairo-script/cairo-script-operators.c | 8 ++++++++ + util/cairo-trace/trace.c | 4 ++++ + 3 files changed, 12 insertions(+), 1 deletion(-) + +commit 391c6026402dee09bb34816637114cea990cd93a +Merge: 2f1b581 d93bf10 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 11 14:41:01 2008 -0500 + + Merge branch '1.8' + +commit 2f1b581f54713c899f3b03af1e0ac8c38c36c385 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 11 10:34:37 2008 -0500 + + [quartz] Create a copy instead of increasing the reference + + The pattern could be stack allocated so we can't take a reference to it. + + Some testing of quartz shows that it doesn't deal with malloc failure particularily + well. In the best case CGFunctionCreate returns NULL, in the worst case it just crashes. + Quartz does seem to be able to handle a NULL CGFunctionRef, so returning NULL if + we fail to copy the pattern avoids complicating the code to deal with + propagating the failure and shouldn't cause any additional crashes. + + Based on a patch by Paolo Bonzini. + + src/cairo-quartz-surface.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit f7b3f1b7d70a271575d3bb233b7ee51a21861c05 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Dec 10 17:54:59 2008 -0500 + + [quartz] Propagate const patterns through the casts + + As part of this avoid using cairo_pattern_get_matrix() because it requires a + 'cairo_pattern_t *' instead of 'const cairo_pattern *' + + Also, make a copy of the pattern before pasing it in to cairo_set_source() + + src/cairo-quartz-surface.c | 39 +++++++++++++++++++++++---------------- + 1 file changed, 23 insertions(+), 16 deletions(-) + +commit d93bf10edc7e432349524221a3d1b0f0b2ec8090 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Dec 10 17:02:55 2008 -0500 + + [quartz] Create a copy of the pattern so that the reference counts are balanced + + The pattern could be stack allocated so we can't take a reference to it; + instead make a copy. + + Based on a patch by Paolo Bonzini. + + src/cairo-quartz-surface.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit db4c427e8460b0e326691bd6d3784178a713eb33 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Dec 9 12:03:11 2008 -0500 + + [quartz] Change some pattern casts to access to the base class + + Avoiding casts gives us some more type safety. + + src/cairo-quartz-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 5f60e2e00455f2894c7ce3805a029c806f21514a +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Dec 9 11:41:10 2008 -0500 + + Reorganize the (set|get)_antialias prototypes + + Move _cairo_gstate_set_antialias() and _cairo_gstate_get_antialias() into the + gstate section of cairoint.h + + src/cairoint.h | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 673640a3b3931995897b01d49c5dd8d82b50dac2 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 4 17:53:06 2008 -0500 + + [win32] Use MOD instead of the '%' operator + + Repeat should be handled using MOD instead of '%' so that negative numbers + are handled as expected. E.g. -1 mod 600 = 599, not 495 as the '%' operator + gives. This was causing https://bugzilla.mozilla.org/show_bug.cgi?id=466258 + + Patch from Robert O'Callahan + + src/cairo-win32-surface.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 5e06085b483dcaaa7b1b29b13cd2813c7e51e02a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Aug 1 23:28:15 2008 +0300 + + [cairo-spans] Render clip mask surfaces with spans if we can. + + Generating surface masks for clipping can also benefit from span + rendering sometimes. + + src/cairo-clip.c | 140 +++++++++++++++++++++ + test/clip-fill-rule.pdf.argb32.ref.png | Bin 0 -> 509 bytes + test/clip-fill-rule.rgb24.ref.png | Bin 380 -> 390 bytes + test/clip-fill-rule.test-paginated.rgb24.ref.png | Bin 0 -> 361 bytes + test/clip-fill-rule.xlib.rgb24.ref.png | Bin 0 -> 380 bytes + test/clip-nesting.pdf.argb32.ref.png | Bin 0 -> 850 bytes + test/clip-nesting.rgb24.ref.png | Bin 955 -> 963 bytes + test/clip-nesting.test-fallback.rgb24.ref.png | Bin 0 -> 936 bytes + test/clip-nesting.test-paginated.rgb24.ref.png | Bin 0 -> 936 bytes + test/clip-nesting.xlib.rgb24.ref.png | Bin 0 -> 955 bytes + test/clip-operator.pdf.argb32.ref.png | Bin 11600 -> 11604 bytes + test/clip-operator.ps3.argb32.ref.png | Bin 7574 -> 7576 bytes + test/clip-operator.ref.png | Bin 8247 -> 8210 bytes + test/clip-operator.test-paginated.argb32.ref.png | Bin 0 -> 8247 bytes + test/clip-twice.pdf.argb32.ref.png | Bin 1458 -> 1498 bytes + test/clip-twice.ref.png | Bin 1362 -> 1342 bytes + test/clip-twice.rgb24.ref.png | Bin 1198 -> 1203 bytes + test/clip-twice.test-fallback.argb32.ref.png | Bin 0 -> 1343 bytes + test/clip-twice.test-fallback.rgb24.ref.png | Bin 0 -> 1179 bytes + test/clip-twice.test-paginated.argb32.ref.png | Bin 0 -> 1361 bytes + test/clip-twice.test-paginated.rgb24.ref.png | Bin 0 -> 1199 bytes + test/clip-twice.xlib.ref.png | Bin 0 -> 1362 bytes + test/clip-twice.xlib.rgb24.ref.png | Bin 0 -> 1198 bytes + test/device-offset-fractional.pdf.argb32.ref.png | Bin 0 -> 275 bytes + test/device-offset-fractional.pdf.rgb24.ref.png | Bin 0 -> 275 bytes + test/filter-nearest-offset.pdf.argb32.ref.png | Bin 0 -> 4295 bytes + test/filter-nearest-offset.pdf.rgb24.ref.png | Bin 0 -> 4295 bytes + test/filter-nearest-transformed.pdf.argb32.ref.png | Bin 0 -> 488 bytes + test/filter-nearest-transformed.pdf.rgb24.ref.png | Bin 0 -> 488 bytes + test/linear-gradient.pdf.argb32.ref.png | Bin 1118 -> 1112 bytes + test/linear-gradient.pdf.rgb24.ref.png | Bin 1118 -> 1112 bytes + test/mask.pdf.argb32.ref.png | Bin 9956 -> 9903 bytes + test/mask.ref.png | Bin 8571 -> 8581 bytes + test/mask.svg11.argb32.ref.png | Bin 8625 -> 8682 bytes + test/mask.svg12.argb32.ref.png | Bin 8625 -> 8682 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 4017 -> 4011 bytes + test/meta-surface-pattern.svg11.argb32.ref.png | Bin 3928 -> 3924 bytes + test/meta-surface-pattern.svg12.argb32.ref.png | Bin 3928 -> 3924 bytes + test/rotate-image-surface-paint.pdf.argb32.ref.png | Bin 209 -> 215 bytes + test/rotate-image-surface-paint.pdf.rgb24.ref.png | Bin 207 -> 215 bytes + test/surface-pattern-scale-down.pdf.argb32.ref.png | Bin 2386 -> 1532 bytes + test/surface-pattern-scale-down.pdf.rgb24.ref.png | Bin 2386 -> 1532 bytes + test/surface-pattern-scale-up.pdf.argb32.ref.png | Bin 4247 -> 3834 bytes + test/surface-pattern-scale-up.pdf.rgb24.ref.png | Bin 4247 -> 3834 bytes + test/surface-pattern.pdf.argb32.ref.png | Bin 0 -> 14808 bytes + test/surface-pattern.pdf.rgb24.ref.png | Bin 0 -> 14808 bytes + test/trap-clip.pdf.rgb24.ref.png | Bin 6642 -> 6621 bytes + test/trap-clip.ref.png | Bin 5865 -> 5829 bytes + test/trap-clip.test-paginated.argb32.ref.png | Bin 0 -> 5865 bytes + 49 files changed, 140 insertions(+) + +commit 18634c37026a2d6147443cb6d991576f62b07e6d +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jul 24 20:47:14 2008 +0300 + + [cairo-spans] Hook up filling paths with spans to cairo-surface-fallback.c. + + This speeds up the mask generation step in cairo_fill() for the image + surface by up to 10x in especially favourable cases. + + image-rgba twin-800 7757.80 0.20% -> 749.41 0.29%: 10.36x speedup + image-rgba spiral-diag-pixalign-nonzero-fill-512 15.16 0.44% -> 3.45 8.80%: 5.54x speedup + + More typical simple non-rectilinear geometries are sped up by 30-50%. + This patch does not affect any stroking operations or any fill + operations of pixel aligned rectilinear geometries; those are still + rendered using trapezoids. + + src/cairo-surface-fallback.c | 86 ++++++++++++++++++++- + test/clip-fill-rule.test-fallback.rgb24.ref.png | Bin 0 -> 361 bytes + test/clip-operator.pdf.argb32.ref.png | Bin 12125 -> 11600 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 7367 -> 6882 bytes + test/clip-operator.ps2.rgb24.ref.png | Bin 3624 -> 3736 bytes + test/clip-operator.ps3.argb32.ref.png | Bin 0 -> 7574 bytes + test/clip-operator.ps3.rgb24.ref.png | Bin 3624 -> 3736 bytes + test/clip-operator.ref.png | Bin 8271 -> 8247 bytes + test/clip-operator.rgb24.ref.png | Bin 3258 -> 3279 bytes + test/clip-operator.test-fallback.argb32.ref.png | Bin 0 -> 8252 bytes + test/clip-operator.test-fallback.rgb24.ref.png | Bin 0 -> 3241 bytes + test/clip-operator.xlib-fallback.rgb24.ref.png | Bin 0 -> 3254 bytes + test/clip-operator.xlib.ref.png | Bin 0 -> 8271 bytes + test/clip-operator.xlib.rgb24.ref.png | Bin 0 -> 3258 bytes + test/clip-twice.pdf.argb32.ref.png | Bin 0 -> 1458 bytes + test/clipped-group.pdf.argb32.ref.png | Bin 0 -> 298 bytes + test/clipped-group.pdf.rgb24.ref.png | Bin 0 -> 298 bytes + test/degenerate-arc.ref.png | Bin 616 -> 544 bytes + test/degenerate-arc.test-fallback.argb32.ref.png | Bin 0 -> 547 bytes + test/degenerate-arc.test-fallback.rgb24.ref.png | Bin 0 -> 547 bytes + test/degenerate-arc.xlib.ref.png | Bin 0 -> 616 bytes + test/fill-alpha-pattern.pdf.argb32.ref.png | Bin 3887 -> 3750 bytes + test/fill-alpha-pattern.pdf.rgb24.ref.png | Bin 3840 -> 3758 bytes + test/fill-alpha-pattern.ps3.argb32.ref.png | Bin 0 -> 4070 bytes + test/fill-alpha-pattern.ps3.rgb24.ref.png | Bin 0 -> 4473 bytes + test/fill-alpha-pattern.ref.png | Bin 3653 -> 3374 bytes + ...fill-alpha-pattern.test-fallback.argb32.ref.png | Bin 0 -> 3379 bytes + .../fill-alpha-pattern.test-fallback.rgb24.ref.png | Bin 0 -> 3379 bytes + test/fill-alpha-pattern.xlib.ref.png | Bin 0 -> 3653 bytes + test/fill-alpha.ref.png | Bin 2989 -> 2728 bytes + test/fill-alpha.test-fallback.argb32.ref.png | Bin 0 -> 2824 bytes + test/fill-alpha.test-fallback.rgb24.ref.png | Bin 0 -> 2824 bytes + test/fill-alpha.xlib.ref.png | Bin 0 -> 2989 bytes + test/fill-degenerate-sort-order.ref.png | Bin 2397 -> 2406 bytes + test/fill-degenerate-sort-order.rgb24.ref.png | Bin 2060 -> 2052 bytes + ...enerate-sort-order.test-fallback.argb32.ref.png | Bin 0 -> 2378 bytes + ...generate-sort-order.test-fallback.rgb24.ref.png | Bin 0 -> 2041 bytes + test/fill-degenerate-sort-order.xlib.ref.png | Bin 0 -> 2397 bytes + test/fill-degenerate-sort-order.xlib.rgb24.ref.png | Bin 0 -> 2060 bytes + test/fill-missed-stop.pdf.argb32.ref.png | Bin 0 -> 452 bytes + test/fill-rule.ref.png | Bin 1979 -> 2061 bytes + test/fill-rule.rgb24.ref.png | Bin 1722 -> 1780 bytes + test/fill-rule.test-fallback.argb32.ref.png | Bin 0 -> 1979 bytes + test/fill-rule.test-fallback.rgb24.ref.png | Bin 0 -> 1703 bytes + test/fill-rule.xlib.ref.png | Bin 0 -> 1979 bytes + test/fill-rule.xlib.rgb24.ref.png | Bin 0 -> 1722 bytes + test/finer-grained-fallbacks.ps2.argb32.ref.png | Bin 0 -> 1173 bytes + test/finer-grained-fallbacks.ps2.rgb24.ref.png | Bin 1096 -> 1154 bytes + test/finer-grained-fallbacks.ps3.argb32.ref.png | Bin 0 -> 1173 bytes + test/finer-grained-fallbacks.ps3.rgb24.ref.png | Bin 1096 -> 1154 bytes + test/finer-grained-fallbacks.ref.png | Bin 1111 -> 1069 bytes + test/finer-grained-fallbacks.rgb24.ref.png | Bin 1114 -> 839 bytes + ...-grained-fallbacks.test-fallback.argb32.ref.png | Bin 0 -> 1111 bytes + ...r-grained-fallbacks.test-fallback.rgb24.ref.png | Bin 0 -> 854 bytes + test/finer-grained-fallbacks.xlib.ref.png | Bin 0 -> 1111 bytes + test/finer-grained-fallbacks.xlib.rgb24.ref.png | Bin 0 -> 1114 bytes + test/font-matrix-translation.svg11.argb32.ref.png | Bin 0 -> 857 bytes + test/font-matrix-translation.svg11.rgb24.ref.png | Bin 0 -> 857 bytes + test/font-matrix-translation.svg12.argb32.ref.png | Bin 0 -> 857 bytes + test/font-matrix-translation.svg12.rgb24.ref.png | Bin 0 -> 857 bytes + test/ft-show-glyphs-table.svg11.argb32.ref.png | Bin 0 -> 9953 bytes + test/ft-show-glyphs-table.svg11.rgb24.ref.png | Bin 0 -> 9953 bytes + test/ft-show-glyphs-table.svg12.argb32.ref.png | Bin 0 -> 9953 bytes + test/ft-show-glyphs-table.svg12.rgb24.ref.png | Bin 0 -> 9953 bytes + ...t-text-vertical-layout-type1.pdf.argb32.ref.png | Bin 0 -> 3632 bytes + ...ft-text-vertical-layout-type1.pdf.rgb24.ref.png | Bin 0 -> 3632 bytes + test/ft-text-vertical-layout-type1.ref.png | Bin 3980 -> 3643 bytes + ...text-vertical-layout-type1.svg11.argb32.ref.png | Bin 0 -> 3614 bytes + ...-text-vertical-layout-type1.svg11.rgb24.ref.png | Bin 0 -> 3614 bytes + ...text-vertical-layout-type1.svg12.argb32.ref.png | Bin 0 -> 3614 bytes + ...-text-vertical-layout-type1.svg12.rgb24.ref.png | Bin 0 -> 3614 bytes + ...tical-layout-type1.test-fallback.argb32.ref.png | Bin 0 -> 3639 bytes + ...rtical-layout-type1.test-fallback.rgb24.ref.png | Bin 0 -> 3639 bytes + test/ft-text-vertical-layout-type1.xlib.ref.png | Bin 0 -> 3980 bytes + ...t-text-vertical-layout-type3.pdf.argb32.ref.png | Bin 0 -> 3642 bytes + ...ft-text-vertical-layout-type3.pdf.rgb24.ref.png | Bin 0 -> 3642 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3934 -> 3609 bytes + ...text-vertical-layout-type3.svg11.argb32.ref.png | Bin 0 -> 3640 bytes + ...-text-vertical-layout-type3.svg11.rgb24.ref.png | Bin 0 -> 3640 bytes + ...text-vertical-layout-type3.svg12.argb32.ref.png | Bin 0 -> 3640 bytes + ...-text-vertical-layout-type3.svg12.rgb24.ref.png | Bin 0 -> 3640 bytes + ...tical-layout-type3.test-fallback.argb32.ref.png | Bin 0 -> 3605 bytes + ...rtical-layout-type3.test-fallback.rgb24.ref.png | Bin 0 -> 3605 bytes + test/ft-text-vertical-layout-type3.xlib.ref.png | Bin 0 -> 3934 bytes + test/huge-pattern.pdf.argb32.ref.png | Bin 0 -> 2430 bytes + test/linear-gradient.pdf.argb32.ref.png | Bin 0 -> 1118 bytes + test/linear-gradient.pdf.rgb24.ref.png | Bin 0 -> 1118 bytes + test/linear-gradient.ref.png | Bin 1021 -> 983 bytes + test/linear-gradient.svg11.argb32.ref.png | Bin 0 -> 988 bytes + test/linear-gradient.svg11.rgb24.ref.png | Bin 0 -> 988 bytes + test/linear-gradient.svg12.argb32.ref.png | Bin 0 -> 988 bytes + test/linear-gradient.svg12.rgb24.ref.png | Bin 0 -> 988 bytes + test/linear-gradient.test-fallback.argb32.ref.png | Bin 0 -> 923 bytes + test/linear-gradient.test-fallback.rgb24.ref.png | Bin 0 -> 923 bytes + test/linear-gradient.xlib.ref.png | Bin 0 -> 1021 bytes + test/mask-alpha.ref.png | Bin 640 -> 643 bytes + test/mask-alpha.svg11.argb32.ref.png | Bin 615 -> 642 bytes + test/mask-alpha.svg11.rgb24.ref.png | Bin 0 -> 592 bytes + test/mask-alpha.svg12.argb32.ref.png | Bin 615 -> 642 bytes + test/mask-alpha.svg12.rgb24.ref.png | Bin 0 -> 592 bytes + test/mask-alpha.test-fallback.argb32.ref.png | Bin 0 -> 627 bytes + test/mask-alpha.xlib.ref.png | Bin 0 -> 640 bytes + test/mask-alpha.xlib.rgb24.ref.png | Bin 0 -> 599 bytes + test/mask.pdf.argb32.ref.png | Bin 8881 -> 9956 bytes + test/mask.pdf.rgb24.ref.png | Bin 8267 -> 8735 bytes + test/mask.ref.png | Bin 8476 -> 8571 bytes + test/mask.rgb24.ref.png | Bin 7041 -> 7216 bytes + test/mask.svg11.argb32.ref.png | Bin 8527 -> 8625 bytes + test/mask.svg11.rgb24.ref.png | Bin 7935 -> 7203 bytes + test/mask.svg12.argb32.ref.png | Bin 8527 -> 8625 bytes + test/mask.svg12.rgb24.ref.png | Bin 7935 -> 7203 bytes + test/mask.test-fallback.argb32.ref.png | Bin 0 -> 8457 bytes + test/mask.test-fallback.rgb24.ref.png | Bin 0 -> 7058 bytes + test/mask.xlib-fallback.rgb24.ref.png | Bin 0 -> 7216 bytes + test/mask.xlib.ref.png | Bin 0 -> 8476 bytes + test/mask.xlib.rgb24.ref.png | Bin 0 -> 7041 bytes + test/meta-surface-pattern.pdf.argb32.ref.png | Bin 0 -> 4017 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 4009 -> 3910 bytes + test/meta-surface-pattern.svg11.argb32.ref.png | Bin 3924 -> 3928 bytes + test/meta-surface-pattern.svg11.rgb24.ref.png | Bin 4593 -> 3914 bytes + test/meta-surface-pattern.svg12.argb32.ref.png | Bin 3924 -> 3928 bytes + test/meta-surface-pattern.svg12.rgb24.ref.png | Bin 4593 -> 3914 bytes + test/operator-clear.pdf.argb32.ref.png | Bin 1614 -> 1607 bytes + test/operator-clear.ps2.argb32.ref.png | Bin 0 -> 1156 bytes + test/operator-clear.ps3.argb32.ref.png | Bin 0 -> 1156 bytes + test/operator-source.pdf.argb32.ref.png | Bin 5149 -> 5112 bytes + test/operator-source.pdf.rgb24.ref.png | Bin 4354 -> 4186 bytes + test/operator-source.ref.png | Bin 4420 -> 4425 bytes + test/operator-source.rgb24.ref.png | Bin 3201 -> 3231 bytes + test/operator-source.test-fallback.argb32.ref.png | Bin 0 -> 4401 bytes + test/operator-source.test-fallback.rgb24.ref.png | Bin 0 -> 3200 bytes + test/operator-source.xlib-fallback.rgb24.ref.png | Bin 0 -> 3193 bytes + test/operator-source.xlib.ref.png | Bin 0 -> 4420 bytes + test/operator-source.xlib.rgb24.ref.png | Bin 0 -> 3201 bytes + test/over-above-source.ps2.argb32.ref.png | Bin 636 -> 558 bytes + test/over-above-source.ps3.argb32.ref.png | Bin 636 -> 558 bytes + test/over-above-source.ref.png | Bin 538 -> 560 bytes + test/over-above-source.rgb24.ref.png | Bin 461 -> 466 bytes + .../over-above-source.test-fallback.argb32.ref.png | Bin 0 -> 533 bytes + test/over-above-source.test-fallback.rgb24.ref.png | Bin 0 -> 450 bytes + test/over-above-source.xlib.ref.png | Bin 0 -> 538 bytes + test/over-above-source.xlib.rgb24.ref.png | Bin 0 -> 461 bytes + test/over-around-source.pdf.argb32.ref.png | Bin 0 -> 585 bytes + test/over-around-source.ps2.argb32.ref.png | Bin 632 -> 522 bytes + test/over-around-source.ps3.argb32.ref.png | Bin 632 -> 522 bytes + test/over-around-source.ref.png | Bin 614 -> 645 bytes + ...over-around-source.test-fallback.argb32.ref.png | Bin 0 -> 610 bytes + test/over-around-source.xlib.ref.png | Bin 0 -> 614 bytes + test/over-around-source.xlib.rgb24.ref.png | Bin 0 -> 503 bytes + test/over-below-source.pdf.argb32.ref.png | Bin 0 -> 464 bytes + test/over-between-source.ps2.argb32.ref.png | Bin 678 -> 551 bytes + test/over-between-source.ps3.argb32.ref.png | Bin 678 -> 551 bytes + test/over-between-source.ref.png | Bin 575 -> 612 bytes + ...ver-between-source.test-fallback.argb32.ref.png | Bin 0 -> 578 bytes + test/over-between-source.xlib.ref.png | Bin 0 -> 575 bytes + test/over-between-source.xlib.rgb24.ref.png | Bin 0 -> 473 bytes + test/push-group.pdf.argb32.ref.png | Bin 0 -> 2722 bytes + test/push-group.pdf.rgb24.ref.png | Bin 2714 -> 2740 bytes + test/push-group.ref.png | Bin 3126 -> 3060 bytes + test/push-group.rgb24.ref.png | Bin 2961 -> 2912 bytes + test/push-group.svg11.argb32.ref.png | Bin 2935 -> 3034 bytes + test/push-group.svg12.argb32.ref.png | Bin 2935 -> 3034 bytes + test/push-group.test-fallback.argb32.ref.png | Bin 0 -> 3107 bytes + test/push-group.test-fallback.rgb24.ref.png | Bin 0 -> 2942 bytes + test/push-group.xlib-fallback.rgb24.ref.png | Bin 0 -> 2912 bytes + test/push-group.xlib.ref.png | Bin 0 -> 3126 bytes + test/push-group.xlib.rgb24.ref.png | Bin 0 -> 2961 bytes + test/radial-gradient.pdf.argb32.ref.png | Bin 0 -> 79601 bytes + test/radial-gradient.pdf.rgb24.ref.png | Bin 0 -> 79601 bytes + test/random-intersections.ref.png | Bin 148722 -> 133462 bytes + ...ndom-intersections.test-fallback.argb32.ref.png | Bin 0 -> 132312 bytes + ...andom-intersections.test-fallback.rgb24.ref.png | Bin 0 -> 132312 bytes + test/random-intersections.xlib.ref.png | Bin 0 -> 148722 bytes + test/smask-fill.pdf.argb32.ref.png | Bin 0 -> 1909 bytes + test/smask-fill.pdf.rgb24.ref.png | Bin 0 -> 1909 bytes + test/smask-fill.ref.png | Bin 1223 -> 1156 bytes + test/smask-fill.svg11.argb32.ref.png | Bin 0 -> 1128 bytes + test/smask-fill.svg11.rgb24.ref.png | Bin 0 -> 1128 bytes + test/smask-fill.svg12.argb32.ref.png | Bin 0 -> 1128 bytes + test/smask-fill.svg12.rgb24.ref.png | Bin 0 -> 1128 bytes + test/smask-fill.test-fallback.argb32.ref.png | Bin 0 -> 1148 bytes + test/smask-fill.test-fallback.rgb24.ref.png | Bin 0 -> 1148 bytes + test/smask-fill.xlib-fallback.ref.png | Bin 0 -> 1156 bytes + test/smask-fill.xlib.ref.png | Bin 0 -> 1223 bytes + test/smask-image-mask.pdf.argb32.ref.png | Bin 0 -> 1651 bytes + test/smask-image-mask.pdf.rgb24.ref.png | Bin 0 -> 1651 bytes + test/smask-mask.pdf.argb32.ref.png | Bin 0 -> 4398 bytes + test/smask-mask.pdf.rgb24.ref.png | Bin 0 -> 4398 bytes + test/smask-paint.pdf.argb32.ref.png | Bin 0 -> 4496 bytes + test/smask-paint.pdf.rgb24.ref.png | Bin 0 -> 4496 bytes + test/smask-stroke.pdf.argb32.ref.png | Bin 0 -> 1417 bytes + test/smask-stroke.pdf.rgb24.ref.png | Bin 0 -> 1417 bytes + test/smask-text.svg11.argb32.ref.png | Bin 0 -> 1791 bytes + test/smask-text.svg11.rgb24.ref.png | Bin 0 -> 1791 bytes + test/smask-text.svg12.argb32.ref.png | Bin 0 -> 1791 bytes + test/smask-text.svg12.rgb24.ref.png | Bin 0 -> 1791 bytes + test/smask.pdf.argb32.ref.png | Bin 0 -> 4496 bytes + test/smask.pdf.rgb24.ref.png | Bin 0 -> 4496 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 1823 -> 2151 bytes + test/text-pattern.svg11.argb32.ref.png | Bin 1733 -> 1743 bytes + test/text-pattern.svg12.argb32.ref.png | Bin 1733 -> 1743 bytes + test/text-rotate.svg11.argb32.ref.png | Bin 0 -> 16942 bytes + test/text-rotate.svg11.rgb24.ref.png | Bin 0 -> 16942 bytes + test/text-rotate.svg12.argb32.ref.png | Bin 0 -> 16942 bytes + test/text-rotate.svg12.rgb24.ref.png | Bin 0 -> 16942 bytes + test/text-transform.svg11.argb32.ref.png | Bin 0 -> 5677 bytes + test/text-transform.svg11.rgb24.ref.png | Bin 0 -> 5677 bytes + test/text-transform.svg12.argb32.ref.png | Bin 0 -> 5677 bytes + test/text-transform.svg12.rgb24.ref.png | Bin 0 -> 5677 bytes + test/trap-clip.pdf.argb32.ref.png | Bin 5809 -> 6720 bytes + test/trap-clip.pdf.rgb24.ref.png | Bin 5768 -> 6642 bytes + test/trap-clip.ps2.argb32.ref.png | Bin 5690 -> 4849 bytes + test/trap-clip.ref.png | Bin 5772 -> 5865 bytes + test/trap-clip.rgb24.ref.png | Bin 5365 -> 5457 bytes + test/trap-clip.test-fallback.argb32.ref.png | Bin 0 -> 5753 bytes + test/trap-clip.test-fallback.rgb24.ref.png | Bin 0 -> 5379 bytes + test/trap-clip.xlib.ref.png | Bin 0 -> 5772 bytes + test/trap-clip.xlib.rgb24.ref.png | Bin 0 -> 5365 bytes + test/twin.svg11.argb32.ref.png | Bin 0 -> 1797 bytes + test/twin.svg11.rgb24.ref.png | Bin 0 -> 1797 bytes + test/twin.svg12.argb32.ref.png | Bin 0 -> 1797 bytes + test/twin.svg12.rgb24.ref.png | Bin 0 -> 1797 bytes + test/unbounded-operator.pdf.argb32.ref.png | Bin 0 -> 2713 bytes + test/unbounded-operator.ps2.argb32.ref.png | Bin 0 -> 2713 bytes + test/unbounded-operator.ps3.argb32.ref.png | Bin 0 -> 2713 bytes + test/unbounded-operator.rgb24.ref.png | Bin 1315 -> 1341 bytes + .../unbounded-operator.test-fallback.rgb24.ref.png | Bin 0 -> 1306 bytes + test/unbounded-operator.xlib.rgb24.ref.png | Bin 0 -> 1315 bytes + test/user-font-proxy.pdf.argb32.ref.png | Bin 0 -> 16937 bytes + test/user-font-proxy.pdf.rgb24.ref.png | Bin 0 -> 16937 bytes + test/user-font-proxy.ref.png | Bin 18121 -> 16937 bytes + test/user-font-proxy.svg11.argb32.ref.png | Bin 0 -> 16836 bytes + test/user-font-proxy.svg11.rgb24.ref.png | Bin 0 -> 16836 bytes + test/user-font-proxy.svg12.argb32.ref.png | Bin 0 -> 16836 bytes + test/user-font-proxy.svg12.rgb24.ref.png | Bin 0 -> 16836 bytes + test/user-font-proxy.test-fallback.argb32.ref.png | Bin 0 -> 16835 bytes + test/user-font-proxy.test-fallback.rgb24.ref.png | Bin 0 -> 16835 bytes + test/user-font-proxy.xlib.ref.png | Bin 0 -> 18121 bytes + test/user-font.ref.png | Bin 6183 -> 6082 bytes + test/user-font.svg11.argb32.ref.png | Bin 0 -> 6411 bytes + test/user-font.svg11.rgb24.ref.png | Bin 0 -> 6411 bytes + test/user-font.svg12.argb32.ref.png | Bin 0 -> 6411 bytes + test/user-font.svg12.rgb24.ref.png | Bin 0 -> 6411 bytes + test/user-font.test-fallback.argb32.ref.png | Bin 0 -> 5601 bytes + test/user-font.test-fallback.rgb24.ref.png | Bin 0 -> 5601 bytes + test/user-font.xlib.ref.png | Bin 0 -> 6183 bytes + 246 files changed, 85 insertions(+), 1 deletion(-) + +commit 85b81a3e59401e2fc68209634f7622694e7d30e1 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 11 13:10:20 2008 +0300 + + [cairo-spans] Implement a span renderer for cairo_image_surface_t. + + This implementation first produces an A8 alpha mask and then + pixman_image_composites the result to the destination with the source. + Clipping is handled by pixman when it is region clipping or by + cairo-surface-fallback when it is something more complex. + + src/cairo-image-surface.c | 273 +++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 233 insertions(+), 40 deletions(-) + +commit 7994fc06ad66e31fcbc16f6e8cd9ad226022ec8c +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Aug 28 22:16:07 2008 +0300 + + [cairo-spans] New cairo_tor_scan_converter_t. + + Imports a new polygon scan converter implementation from the + repository at + + http://cgit.freedesktop.org/~joonas/glitter-paths/ + + Glitter paths is a stand alone polygon rasteriser derived from David + Turner's reimplementation of Tor Anderssons's 15x17 supersampling + rasteriser from the Apparition graphics library. The main new feature + in this implementation is cheaply choosing per-scan line between doing + fully analytical coverage computation for an entire row at a time + vs. using a supersampling approach. + + src/Makefile.sources | 1 + + src/cairo-spans-private.h | 10 + + src/cairo-spans.c | 18 +- + src/cairo-tor-scan-converter.c | 2003 ++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 2027 insertions(+), 5 deletions(-) + +commit 2078e5b20fdff76ada6e13b29b2775b7dcd35439 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jul 31 01:58:08 2008 +0300 + + [cairo-spans] New _cairo_path_fixed_fill_using_spans(). + + Adds a helper function for backends to use for filling a path using + spans. + + src/cairo-spans-private.h | 10 ++++ + src/cairo-spans.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 155 insertions(+) + +commit 4a9b274eebe674bbc5c66dc3e33256723cdf9829 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 11 00:59:47 2008 +0300 + + [cairo-spans] Add a check/create_span_renderer backend methods. + + A surface will have the chance to use span rendering at cairo_fill() + time by creating a renderer for a specific combination of + pattern/dst/op before the path is scan converted. The protocol is to + first call check_span_renderer() to see if the surface wants to render + with spans and then later call create_span_renderer() to create the + renderer for real once the extents of the path are known. + + No backends have an implementation yet. + + src/cairo-analysis-surface.c | 4 +++ + src/cairo-beos-surface.cpp | 2 ++ + src/cairo-directfb-surface.c | 2 ++ + src/cairo-glitz-surface.c | 2 ++ + src/cairo-image-surface.c | 2 ++ + src/cairo-meta-surface.c | 2 ++ + src/cairo-os2-surface.c | 2 ++ + src/cairo-paginated-surface.c | 2 ++ + src/cairo-pdf-surface.c | 2 ++ + src/cairo-ps-surface.c | 2 ++ + src/cairo-quartz-image-surface.c | 2 ++ + src/cairo-quartz-surface.c | 2 ++ + src/cairo-script-surface.c | 2 ++ + src/cairo-sdl-surface.c | 2 ++ + src/cairo-surface.c | 53 ++++++++++++++++++++++++++++++++++++++ + src/cairo-svg-surface.c | 2 ++ + src/cairo-type3-glyph-surface.c | 2 ++ + src/cairo-win32-printing-surface.c | 2 ++ + src/cairo-win32-surface.c | 2 ++ + src/cairo-xcb-surface.c | 2 ++ + src/cairo-xlib-surface.c | 2 ++ + src/cairoint.h | 30 +++++++++++++++++++++ + src/test-fallback-surface.c | 2 ++ + src/test-meta-surface.c | 2 ++ + src/test-paginated-surface.c | 2 ++ + 25 files changed, 131 insertions(+) + +commit 948c3526dcdbc440395fff4ce9bf4b7553930d92 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Oct 24 17:37:30 2008 +0300 + + [cairo-spans] New abstract types for scan converting polygons. + + A cairo_span_renderer_t implementation can be provided by a surface if + it wants to render paths as horizontal spans of the alpha component of + a mask. Its job is to composite a source pattern to the destination + surface when given spans of alpha coverage for a row while taking care + of backend specific clipping. + + A cairo_scan_converter_t takes edges of a flattened path and generates + spans for a span renderer to render. + + src/Makefile.sources | 2 + + src/cairo-spans-private.h | 124 ++++++++++++++++++++++++ + src/cairo-spans.c | 242 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 1 + + 4 files changed, 369 insertions(+) + +commit 4b227143b3daab75148cd54c9e7580d509864e0d +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Jul 31 01:54:53 2008 +0300 + + [cairo-spans] Introduce a type to track which pixels combine in a compositing op. + + A cairo_composite_rectangles_t contains the coordinates of rectangular + windows into each of the source pattern, mask, clip and destination + surface containing the pixels that will combine in a compositing + operation. The idea is to have a uniform way to represent all the + translations involved rather than overloading parameters like src_x/y, + dst_x/y, etc., sometimes with different incompatible meanings across + functions. + + src/cairo-rectangle.c | 21 +++++++++++++++++++++ + src/cairo-types-private.h | 24 ++++++++++++++++++++++++ + src/cairoint.h | 7 +++++++ + 3 files changed, 52 insertions(+) + +commit a370d077bc697588b6dac2556afa0b95ff83a77d +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Jul 25 16:35:14 2008 +0300 + + [path-fixed] New _cairo_path_fixed_is_region(). + + We want to hit the current fast paths for rendering axis aligned + rectilinear paths rather than spans, and for that we need to be able + to identify regional paths. + + src/cairo-path-fixed.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 3 ++ + 2 files changed, 99 insertions(+) + +commit 6acb8223930081f70b422ef93a49ea645c2cc12d +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Sep 12 19:32:12 2008 +0300 + + [path-fixed] Avoid extra indirection when iterating already flat paths. + + Perform a plain iteration rather than a flattening one if the path + knows it doesn't have any curves. + + src/cairo-path-fixed.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 0c0f4862c52d68776024f125b003ade455044b27 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 6 13:32:37 2008 +0200 + + [perf-diff] Fix cairo-perf-diff for git 1.6 + + Since git 1.6 the plumbing commands aren't installed in the user's + path by default. This patch fixes cairo-perf-diff to find the + git-sh-setup command from git's lib dir. + + perf/cairo-perf-diff | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit afba0c312958852586b846ec615cff1bd3e5cde7 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Sep 12 17:41:45 2008 +0300 + + [perf] Add perf tests to hit rectilinear code paths. + + These tests look at the differences in code paths + hit by filling paths that are rectilinear (or not) and + pixel aligned (or not) with the even-odd and non-zero + fill rules. The paths are not simple, so they don't + hit the special case quad/triangle tessellator. + + perf/Makefile.am | 3 +- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/spiral.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 204 insertions(+), 1 deletion(-) + +commit 8ec58113df417e1ec1d331ab65267c34e6d32096 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Sep 12 17:32:40 2008 +0300 + + [perf] Explicitly test rendering a path with lots of intersections. + + We don't have one just for this purpose. The only other + path with many intersections that gets actually rendered is zrusin-another, + but that might be sped up in the future (say by identifying + collinearities up front or something like that.) + + perf/Makefile.am | 3 +- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/intersections.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 101 insertions(+), 1 deletion(-) + +commit 08b486c9aa1d6ad01f1b17a16dcb4d695e8cbf7d +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Dec 4 17:53:06 2008 -0500 + + [win32] Use MOD instead of the '%' operator + + Repeat should be handled using MOD instead of '%' so that negative numbers + are handled as expected. E.g. -1 mod 600 = 599, not 495 as the '%' operator + gives. This was causing https://bugzilla.mozilla.org/show_bug.cgi?id=466258 + + Patch from Robert O'Callahan + + src/cairo-win32-surface.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 540de34453d16092acd2978b513831a02f01f59f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 26 12:53:29 2008 +0000 + + [matrix] Optimise invert for simple scaling|translation matrices. + + Peter Hercek reported, and provided a very useful test case for, a bug + that caused his applications to crash with Cairo detecting an + non-invertible pattern matrix and thus asserting the impossible happened. + Bisecting revealed that the bug first appeared with 3c18d95 and + disappeared with 0d0c6a1. Since neither of these explain the crash, + further investigation revealed a compiler bug (gcc 4.3.3 20081130, + earlier versions have different bugs!) that caused the matrix inversion + to be invalid iff _cairo_matrix_scalar_multiply() was inlined (i.e. -O0, + or an explicit noinline atttribute on that function prevented the bug, as + did -msse.) So we apply this workaround to hide the bug in the stable + series... + + The matrix is quite often just a simple scale and translate (or even + identity!). For this class of matrix, we can skip the full adjoint + rearrangement and determinant calculation and just compute the inverse + directly. + (cherry picked from commit 0d0c6a199c5b631299c72dce80d66ac0f4936a64) + + src/cairo-matrix.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +commit aff32019a70600fec5040a5a73c4f0b688826064 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Nov 30 23:28:59 2008 -0500 + + [Makefile.am] Use top_srcdir instead of srcdir + + Doesn't make much difference here, but makes our intention clear. + + build/Makefile.am.changelog | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 51a75ad932af4a3c3da96ef98de79328afa200c3 +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Sun Nov 30 20:42:49 2008 +0800 + + glitz: Replace specified color with an opaque one if dst surface don't have an alpha channel. + + Otherwise if underlying glitz drawable has an alpha channel, glitz_set_rectangles + will set its alpha channel to specified value instead of opaque one and effects following + composite operations since glitz draws to attached drawable then copies its content to + the dst surface. With this commit, three test cases such as operator, operator-alpha and + unbounded-operator passes now. + + src/cairo-glitz-surface.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +commit 7247017cf5e6b497a5836d9081ee153d27c6b15e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 29 11:47:25 2008 +0000 + + Fix up a couple of likely(malloc==NULL) + + Adrian Johnson spotted that I marked a few malloc failures as likely, + whoops. + + src/cairo-cff-subset.c | 4 ++-- + src/cairo-clip.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 1659db2c1f4cc72e51fb43d119822ec7aaa77ac0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 29 10:37:58 2008 +0000 + + [test] Fix surface leak from device-offset-positive. + + A forgotten cairo_surface_destroy() caused the similar surface to be + leaked during the test. + + test/device-offset-positive.c | 1 + + 1 file changed, 1 insertion(+) + +commit 0d757a793d7fe2860c6a522124a123864fc97f0a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 29 10:36:34 2008 +0000 + + [png] Fix leak of original png data on error path. + + The error path was missing a _cairo_output_stream_destroy() to cleanup a + copy of the incoming PNG data. + + src/cairo-png.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit e6963a5bfebda69a1ef0a986cede84bcd955b6d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 18 17:26:55 2008 +0000 + + Mark allocation failures as unlikely. + + Use the gcc likelihood annotation to indicate that allocation failures are + extremely unlikely. + + src/cairo-analysis-surface.c | 4 +-- + src/cairo-array.c | 4 +-- + src/cairo-base85-stream.c | 2 +- + src/cairo-bentley-ottmann.c | 13 ++++---- + src/cairo-cache.c | 6 ++-- + src/cairo-cff-subset.c | 66 ++++++++++++++++++++--------------------- + src/cairo-clip.c | 8 ++--- + src/cairo-deflate-stream.c | 2 +- + src/cairo-directfb-surface.c | 2 +- + src/cairo-font-face.c | 6 ++-- + src/cairo-ft-font.c | 25 ++++++++-------- + src/cairo-gstate.c | 17 ++++++----- + src/cairo-hash.c | 6 ++-- + src/cairo-hull.c | 2 +- + src/cairo-image-surface.c | 12 ++++---- + src/cairo-lzw.c | 4 +-- + src/cairo-meta-surface.c | 24 +++++++-------- + src/cairo-misc.c | 24 ++++++++++----- + src/cairo-output-stream.c | 14 ++++----- + src/cairo-paginated-surface.c | 2 +- + src/cairo-path-fixed.c | 4 +-- + src/cairo-path-stroke.c | 4 +-- + src/cairo-path.c | 8 ++--- + src/cairo-pattern.c | 36 +++++++++++----------- + src/cairo-pdf-operators.c | 6 ++-- + src/cairo-pdf-surface.c | 34 ++++++++++----------- + src/cairo-pen.c | 8 ++--- + src/cairo-png.c | 14 ++++----- + src/cairo-polygon.c | 2 +- + src/cairo-ps-surface.c | 16 +++++----- + src/cairo-region.c | 2 +- + src/cairo-scaled-font-subsets.c | 28 ++++++++--------- + src/cairo-scaled-font.c | 29 +++++++++--------- + src/cairo-script-surface.c | 14 ++++----- + src/cairo-sdl-surface.c | 2 +- + src/cairo-skiplist.c | 2 +- + src/cairo-stroke-style.c | 2 +- + src/cairo-surface-fallback.c | 2 +- + src/cairo-surface.c | 4 +-- + src/cairo-svg-surface.c | 16 +++++----- + src/cairo-traps.c | 4 +-- + src/cairo-truetype-subset.c | 30 +++++++++---------- + src/cairo-type1-fallback.c | 15 +++++----- + src/cairo-type1-subset.c | 22 +++++++------- + src/cairo-type3-glyph-surface.c | 2 +- + src/cairo-user-font.c | 2 +- + src/cairo-xlib-display.c | 4 +-- + src/cairo-xlib-screen.c | 2 +- + src/cairo-xlib-surface.c | 25 ++++++++-------- + src/cairo-xlib-visual.c | 2 +- + src/cairo.c | 4 +-- + src/test-fallback-surface.c | 2 +- + src/test-meta-surface.c | 2 +- + src/test-paginated-surface.c | 2 +- + 54 files changed, 300 insertions(+), 294 deletions(-) + +commit d1801c23fae3777c7c59e084894a3410f7a1f932 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 18 15:38:37 2008 +0000 + + Mark if(status) as being unlikely. + + The error paths should be hit very rarely during normal operation, so mark + them as being unlikely so gcc may emit better code. + + src/cairo-analysis-surface.c | 24 +-- + src/cairo-array.c | 6 +- + src/cairo-cache.c | 4 +- + src/cairo-cff-subset.c | 208 ++++++++++++------------- + src/cairo-clip.c | 23 ++- + src/cairo-font-face.c | 14 +- + src/cairo-ft-font.c | 44 +++--- + src/cairo-gstate.c | 66 ++++---- + src/cairo-image-surface.c | 16 +- + src/cairo-lzw.c | 4 +- + src/cairo-meta-surface.c | 42 ++--- + src/cairo-misc.c | 6 +- + src/cairo-output-stream.c | 2 +- + src/cairo-paginated-surface.c | 38 ++--- + src/cairo-path-fill.c | 6 +- + src/cairo-path-fixed.c | 14 +- + src/cairo-path-stroke.c | 56 +++---- + src/cairo-path.c | 6 +- + src/cairo-pattern.c | 34 ++-- + src/cairo-pdf-operators.c | 60 ++++---- + src/cairo-pdf-surface.c | 334 ++++++++++++++++++++-------------------- + src/cairo-pen.c | 6 +- + src/cairo-png.c | 14 +- + src/cairo-ps-surface.c | 122 +++++++-------- + src/cairo-scaled-font-subsets.c | 30 ++-- + src/cairo-scaled-font.c | 72 ++++----- + src/cairo-script-surface.c | 160 +++++++++---------- + src/cairo-sdl-surface.c | 4 +- + src/cairo-surface-fallback.c | 82 +++++----- + src/cairo-surface.c | 60 ++++---- + src/cairo-svg-surface.c | 84 +++++----- + src/cairo-traps.c | 12 +- + src/cairo-truetype-subset.c | 98 ++++++------ + src/cairo-type1-fallback.c | 44 +++--- + src/cairo-type1-subset.c | 46 +++--- + src/cairo-type3-glyph-surface.c | 10 +- + src/cairo-user-font.c | 18 +-- + src/cairo-xlib-screen.c | 4 +- + src/cairo-xlib-surface.c | 92 +++++------ + src/cairo.c | 138 ++++++++--------- + 40 files changed, 1053 insertions(+), 1050 deletions(-) + +commit f0804d4856496a46d0b2270d5815856bf63b4cf8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 28 23:58:55 2008 +0000 + + [test] Exercise caps and joins under reflection. + + The nature of the joins depends critically upon whether the joint is + clockwise or counter-clockwise, so extend the basic caps-joins test to + exercise both conditions i.e. repeat the test under a reflection. + + test/Makefile.am | 6 ++- + test/caps-joins-curve.c | 111 +++++++++++++++++++++++++++++++++++++++ + test/caps-joins-curve.ps.ref.png | Bin 0 -> 3728 bytes + test/caps-joins-curve.ref.png | Bin 0 -> 5132 bytes + test/caps-joins.c | 40 +++++++++----- + test/caps-joins.ps.ref.png | Bin 0 -> 2282 bytes + test/caps-joins.ps2.ref.png | Bin 1459 -> 0 bytes + test/caps-joins.ps3.ref.png | Bin 1459 -> 0 bytes + test/caps-joins.ref.png | Bin 1488 -> 2380 bytes + test/dash-curve.ref.png | Bin 39642 -> 39696 bytes + 10 files changed, 143 insertions(+), 14 deletions(-) + +commit f39dd86e292e9af3438acb041a3a7330fb4a3b22 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 27 00:23:11 2008 +0000 + + [test] Add simple cap test. + + Add a test case that only exercises capping, useful for developing + new strokers. + + test/Makefile.am | 3 ++ + test/caps.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++ + test/caps.ps.ref.png | Bin 0 -> 1466 bytes + test/caps.ref.png | Bin 0 -> 1601 bytes + 4 files changed, 90 insertions(+) + +commit f2982e103c27cad1edf648dadcfffe1a15763efd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 17:23:33 2008 +0000 + + [fill] Allow rectangles to be implicitly closed. + + Also scan for appendages of simple rectangles. + + src/cairo-path-fill.c | 2 +- + src/cairo-path-fixed-private.h | 4 ++-- + src/cairo-path-fixed.c | 14 +++++++++----- + 3 files changed, 12 insertions(+), 8 deletions(-) + +commit d2bcf1d76defda861e1a7f2271046851083ad694 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 28 17:12:03 2008 +0000 + + [path] Carefully check for no more points. + + As the empty path points to an embedded buf, we cannot rely on the buf + pointer being NULL to mark end-of-path. + + src/cairo-path-fixed-private.h | 10 +++++----- + src/cairo-path-fixed.c | 15 ++++++++++++--- + 2 files changed, 17 insertions(+), 8 deletions(-) + +commit 424aba9be558e89b4d42554ca6a5042574e3df75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 20:38:24 2008 +0000 + + [check] Search for the word NOTE + + Add word boundary markers around the regexp so that we only match for the + word NOTE and not on substrings like GL_NOTEQUAL. + + src/check-doc-syntax.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36147140ce56d8d3492b971a9b6ceff97e212e01 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 28 18:54:02 2008 +0000 + + [perf] Fix build + + If automake detects the use of cairo_perf_LDADD in an unused conditional + that overrides the default - so we need to manually set cairo_perf_LDADD. + + perf/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ed6bd4766cb47e97b1a6ecb81eff5bf4673d549b +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Fri Nov 28 07:54:41 2008 +0800 + + image: Use unsigned long to compute color masks. + + Use unsigned long in the first place to prevent compiler from + expanding signed bit to all upper bits. e.g, a alpha mask 0xff0000 + will expand to 0xffffffffff00000 on 64 bit platform which is not + what we expected. + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 41cb91d417e7c0dc1cc767ea0fb38a1f8b3f4e43 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Nov 26 23:49:12 2008 +0200 + + [script] Use the in-tree libcairo for csi-replay. + + csi-replay was missing the in-tree libcairo.la so the build was + failing while looking for new symbols from the system libcairo. + + util/cairo-script/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f5634818f1e5cc0adaa326662c099a75f4e615eb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 14:56:38 2008 +0000 + + [os2] Move include cairo.h before os2.h + + The defines need to come first, but we specify that cairo.h is the first + header file to be included by files. + + src/cairo-os2.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2f0f9a1a593db43dd04507c5989cd0af4b1486de +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Nov 13 10:50:41 2008 +0100 + + [os2] Fix includes + + Patch from Dave Yeo to make cairo-os2.h include os2.h directly so the + header is standalone. + + src/cairo-os2-private.h | 11 ----------- + src/cairo-os2-surface.c | 5 ----- + src/cairo-os2.h | 8 ++++++++ + 3 files changed, 8 insertions(+), 16 deletions(-) + +commit 5591cb58fd94483ec3dc7c169ae8cf0a6b7841bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 17:43:22 2008 +0000 + + [script] Only use zlib if available. + + Conditionally link against zlib - replaying a script will fail if the + trace uses a compressed format. + + configure.ac | 5 ++++- + util/cairo-script/Makefile.am | 2 +- + util/cairo-script/cairo-script-file.c | 5 ++++- + util/cairo-script/cairo-script-operators.c | 2 ++ + 4 files changed, 11 insertions(+), 3 deletions(-) + +commit 9432c0c9b89ed6b3d369b377cf884918cd6180db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 17:33:35 2008 +0000 + + [script] Link the interpreter against the built library. + + Ensure we correctly link against the version of cairo just built. + + util/cairo-script/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 815e5b962ef8477c344da0f0b52c1f85c9854777 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 17:30:29 2008 +0000 + + [script] Add a fallback image surface for replay + + If we do not have a native windowing surface compiled into the library, + just replay the script to an image surface. + + util/cairo-script/csi-replay.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 5e376523628d5e2078e395ea7263a04bacd37c47 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 17:26:57 2008 +0000 + + [skiplist] Check for ffs() + + Wine at least does not provide ffs(), so check at configure time and + open-code a replacement. + + build/configure.ac.system | 2 +- + src/cairo-skiplist.c | 11 +++++++++++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit 60282b866aab359840b4bcaa6aaccaca2eccd3d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 16:58:29 2008 +0000 + + [glitz] Fix clone_similar(). + + Clone similar open-coded various image surface functions and failed to + clone a sub-region resulting in failures for mask-transformed-* and + large-source. + + src/cairo-glitz-surface.c | 458 ++++++++++++++-------------------------------- + 1 file changed, 137 insertions(+), 321 deletions(-) + +commit 47275c7ece06c0d02f2d7c9aa81d87a7144392b0 +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Wed Nov 26 15:56:48 2008 +0100 + + [test] Fix glitz-surface-source test + + The recent changes to separate glitz/agl broke the compilation of the + glitz-surface-source test. + + test/glitz-surface-source.c | 96 +++++++++++++++++++++++++++++++++- + test/glitz-surface-source.ps2.ref.png | Bin 0 -> 376 bytes + test/glitz-surface-source.ps3.ref.png | Bin 0 -> 376 bytes + 3 files changed, 94 insertions(+), 2 deletions(-) + +commit a84ea7829065b7e1d33d6fed6bcf0c7c8abd383a +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Wed Nov 26 15:49:00 2008 +0100 + + [test] Add quartz-surface-source test + + Add a simple test to exercise using a Quartz surface as a source. + + test/Makefile.am | 6 ++++- + test/quartz-surface-source.c | 42 +++++++++++++++++++++++++++++++++ + test/quartz-surface-source.ps2.ref.png | Bin 0 -> 376 bytes + test/quartz-surface-source.ps3.ref.png | Bin 0 -> 376 bytes + test/quartz-surface-source.ref.png | Bin 0 -> 332 bytes + 5 files changed, 47 insertions(+), 1 deletion(-) + +commit 993941cfd701eb222b81cdddeabf6f7ff2daa150 +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Wed Nov 26 13:32:11 2008 +0000 + + [perf] Fix SDL compilation for MacOS X + + The attached patch makes the SDL tests compile under Mac OS X. The + problem is: + + 1) that <SDL_main.h> should be included in files that define the main + function for SDL Mac OS X programs (this is not true with the upcoming + SDL 1.3 release). + + 2) that -lSDLmain, because it is statically linked, needs the Cocoa + framework in the LDADD of the main program. Again, 1.3 will not require + this. + + perf/Makefile.am | 4 ++++ + perf/cairo-perf.c | 4 ++++ + test/Makefile.am | 4 ++++ + test/cairo-test-runner.c | 4 ++++ + 4 files changed, 16 insertions(+) + +commit 8a5b55ca6c69671a138f65ab15bcf93163f24a37 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 13:26:40 2008 +0000 + + [matrix] Impose a maximum number of refinement iterations + + Ensure we do not loop forever trying to minimise the error between the + pixman and cairo matrices - for instance when the FPU is not running at + full precision. + + src/cairo-matrix.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4218699642c621eb3098a5251ef88d8c7d8a96d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 11:54:29 2008 +0000 + + [skiplist] Use ffs() + + Use ffs() [find-first-set-bit] instead of open-coding, which is about 25% + faster on my test machine. + + src/cairo-skiplist.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit 039437c9cfaeed7a2cc1977623ab8bda9854b58a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 26 10:31:09 2008 +0000 + + [png] Use FILE* instead of void*. + + Adrian Johnson reported that cygwin complained about the use of the void * + within feof() as it was using a macro and attempted a to deference the + void*... + + src/cairo-png.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 8fa3cd95641e9138406d651b0734ee84f1da60d2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 26 06:40:47 2008 +1030 + + Change uint to uint32_t + + src/cairo-image-info.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e828f7330633cd839f094bf8409de0bcff17c95c +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Wed Nov 26 00:09:11 2008 +0800 + + glitz: Apply fixup to unbounded operators to clear area outside of mask + + src/cairo-glitz-surface.c | 79 +++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 66 insertions(+), 13 deletions(-) + +commit 449e7518bee5d0238138176b3b71d137c6fc01e7 +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Tue Nov 25 22:55:24 2008 +0800 + + glitz: set correct parameters for linear and radial pattern. + + Glitz expects 16.16 fixed point, but we use 24.8 fixed point by default. + + src/cairo-glitz-surface.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 3bde440e00ba19e968b854c1505dc4d1ace83504 +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Tue Nov 25 22:36:53 2008 +0800 + + glitz: fixup another stupid bug in fill_rectangles. + + Wny I doesn't notice them before. Without fixes it fills n_rect times of + the first one in the rectangle list. + + src/cairo-glitz-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 4ac38f7c2bde67cab37805cab8a2effb2a8617e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 11:52:01 2008 +0000 + + [fill] Emit rectangles for GdkRegion + + Scan the path for a series of consistently wound rectangles. + + src/cairo-path-fill.c | 85 ++++++++++++++++++++++------ + src/cairo-path-fixed-private.h | 17 ++++++ + src/cairo-path-fixed.c | 124 ++++++++++++++++++++++++++++++++++++++--- + 3 files changed, 201 insertions(+), 25 deletions(-) + +commit 23df74e5ffd6be876f3c19ee9d71683f5a0ed6f4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 11:45:30 2008 +0000 + + [xlib] Cosmetic tweak. + + Tightly scope the local rects. + + src/cairo-xlib-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 06fabd6cbd0ad187f5f9f155d6b7962f76ec5dda +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 12:05:26 2008 +0000 + + [path] Fix up extents. + + Forgot to round the box to the integer rectangle and missed why only + testing on image. Very naughty. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-path-bounds.c | 20 +++++++++++--------- + 2 files changed, 12 insertions(+), 10 deletions(-) + +commit 1f44fb97f3973aa90c4f27bcf9341149370c825d +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Tue Nov 25 20:45:03 2008 +0800 + + cairo-script: add $(top_builddir)/src to CPPPATH. + + $(top_builddir)/src is needed to find cairo-features.h while + building out of tree. + + util/cairo-script/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 487c708b3b6727eb2f8d3714edeae356a7cbbd40 +Author: Paolo Bonzini <bonzini@gnu.org> +Date: Tue Nov 25 20:40:37 2008 +0800 + + [boilerplate] fix compilation for glitz-agl + + As suggested on the list, this splits the cairo-boilerplate-glitz.c + file in three separate files, one for each backend. Furthermore, + it fixes a few problems in compilation of the AGL backend test harness. + + boilerplate/Makefile.sources | 6 +- + boilerplate/cairo-boilerplate-glitz-agl.c | 166 +++++++++ + boilerplate/cairo-boilerplate-glitz-glx.c | 244 ++++++++++++ + boilerplate/cairo-boilerplate-glitz-private.h | 6 + + boilerplate/cairo-boilerplate-glitz-wgl.c | 164 ++++++++ + boilerplate/cairo-boilerplate-glitz.c | 517 -------------------------- + 6 files changed, 585 insertions(+), 518 deletions(-) + +commit ca80b8c652dde4449216da9d11691202eef97bbd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 10:25:24 2008 +0000 + + [pdf] Add a default case to silence the compiler. + + The foolish compiler was emitting a warning about a potential + uninitialized variable even though the switch was fully populated. + + src/cairo-pdf-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit b8991a1c69ae5d8fb630296a3c689aa8d1546671 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 10:11:59 2008 +0000 + + [in-fill] Add the implicit close-path during move-to. + + When interpreting a fixed-path for a fill operation, any move-to + implicitly closes the current path. + + src/cairo-gstate.c | 12 ++++++------ + src/cairo-path-in-fill.c | 23 +++++++++++++---------- + src/cairo.c | 11 ++++------- + src/cairoint.h | 4 ++-- + 4 files changed, 25 insertions(+), 25 deletions(-) + +commit 59de6fb89e80ee6aeeb2984b545ceb9bb9f0f7bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 25 10:04:50 2008 +0000 + + [path] Compute approximate extents. + + When computing the bounds of the clip path, we care more for a fast result + than absolute precision as the extents are only used as a guide to trim + the future operations. So computing the extents of the path suffices. + + src/cairo-analysis-surface.c | 16 +++-------- + src/cairo-clip.c | 25 +++--------------- + src/cairo-gstate.c | 13 +++------ + src/cairo-path-bounds.c | 63 ++++++++++++++++++++++++++++++++++++++++---- + src/cairo-surface.c | 8 +++--- + src/cairo.c | 10 +++---- + src/cairoint.h | 8 ++++-- + 7 files changed, 82 insertions(+), 61 deletions(-) + +commit b6bf047494fc308fff00d818b2920d8ba4aa7aed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 21 15:27:31 2008 +0000 + + [clip] Check for error surface + + The update to use a NULL backend with an error surface broke creating a + context from an error surface. + + src/cairo-clip.c | 2 +- + src/cairo.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 721cad9b24c2ad049320950d231ed84046c5b8ab +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Nov 24 22:41:03 2008 +1030 + + Fix typo + + src/cairo-misc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70e4c532722bbcad1eca50438e6ab2cdd0ea9b53 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Nov 24 22:38:30 2008 +1030 + + Document location of image format specifications + + src/cairo-image-info.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 4ca644af274bda4603e7d02dbeca8641bbb3ff79 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Nov 24 00:29:54 2008 +1030 + + Win32-print: Add PNG embedding support + + src/cairo-win32-printing-surface.c | 106 +++++++++++++++++++++++++++---------- + src/cairo-win32-private.h | 3 ++ + 2 files changed, 82 insertions(+), 27 deletions(-) + +commit f59a3e03fc91dc4a1769b07bda77a364cc570bc8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 22:27:49 2008 +1030 + + Add PNG get info function + + src/cairo-image-info-private.h | 5 +++++ + src/cairo-image-info.c | 46 ++++++++++++++++++++++++++++++++++++------ + 2 files changed, 45 insertions(+), 6 deletions(-) + +commit 1892907e24d9f9f31942c6962aaa6d2ff9553ce7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 21:36:40 2008 +1030 + + PDF: Disable PDF 1.5 features when version 1.4 is selected + + JPEG 2000 image embedding and ActualText marked content are + PDF 1.5 features. + + src/cairo-pdf-operators-private.h | 5 +++++ + src/cairo-pdf-operators.c | 8 ++++++++ + src/cairo-pdf-surface.c | 7 +++++++ + 3 files changed, 20 insertions(+) + +commit c4a57385fa2e69020f43519bea21b98182bf5fd7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 21:12:08 2008 +1030 + + PDF: Add cairo_pdf_surface_restrict_to_version API + + Now that we are using PDF 1.5 features, add an api to select between + version 1.4 or 1.5. + + src/cairo-pdf-surface-private.h | 2 + + src/cairo-pdf-surface.c | 116 +++++++++++++++++++++++++++++++++++++--- + src/cairo-pdf.h | 24 +++++++++ + 3 files changed, 136 insertions(+), 6 deletions(-) + +commit d85e836911d661275c29f2348a047e5d911f9004 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 21:03:22 2008 +1030 + + PDF: Add newline to end of binary streams + + PDF requires white space before the "endstream" + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b87d81ef0bb52570385a3c9e331651cbeb87b2bb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 19:29:26 2008 +1030 + + Add image/jp2 to mime-data test + + test/jp2.jp2 | Bin 0 -> 2999 bytes + test/mime-data.c | 7 ++++++- + test/mime-data.pdf.ref.png | Bin 4466 -> 6482 bytes + test/mime-data.ps.ref.png | Bin 4466 -> 4554 bytes + test/mime-data.ref.png | Bin 155 -> 185 bytes + test/mime-data.svg.ref.png | Bin 6153 -> 6264 bytes + 6 files changed, 6 insertions(+), 1 deletion(-) + +commit 7fdb712cbaadc95c02f607a9f6c995f8beb01342 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 18:56:12 2008 +1030 + + PDF: Add JPEG2000 image embedding + + Requires increasing the PDF version to 1.5. + + src/cairo-pdf-surface.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 51 insertions(+), 1 deletion(-) + +commit 0746efbf0718095920d9258942d32a7023d22131 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 18:47:13 2008 +1030 + + Add JPEG2000 mimetype and image info function + + src/cairo-image-info-private.h | 4 ++ + src/cairo-image-info.c | 100 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-surface-fallback.c | 1 + + src/cairo.h | 1 + + 4 files changed, 106 insertions(+) + +commit 5de1e4de938d03406ce3364c6c1baa958f210410 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 23 18:33:58 2008 +1030 + + Move cairo-jpeg-info.c to cairo-image-info.c + + Other image formats will be added to the same file. + + src/Makefile.sources | 4 +- + src/cairo-image-info-private.h | 54 ++++++++++++++ + src/cairo-image-info.c | 141 +++++++++++++++++++++++++++++++++++++ + src/cairo-jpeg-info-private.h | 54 -------------- + src/cairo-jpeg-info.c | 141 ------------------------------------- + src/cairo-pdf-surface.c | 6 +- + src/cairo-ps-surface.c | 6 +- + src/cairo-svg-surface.c | 6 +- + src/cairo-win32-printing-surface.c | 6 +- + 9 files changed, 209 insertions(+), 209 deletions(-) + +commit 63180edf6f7cc81beda626190ca1055efa330fda +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Sun Nov 23 11:42:26 2008 +0800 + + glitz: set clone_offset_{x, y} on success in clone_similar. + + With this fix, glitz backend passes 135 test cases and fails 66 test cases. + + src/cairo-glitz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 36c1b3e5919f119a054e425ca03f7ce810d3e7ec +Author: Luo Jinghua <sunmoon1997@gmail.com> +Date: Sun Nov 23 10:27:49 2008 +0800 + + glitz: fixup a stupid bug in get_image. + + _pixman_format_from_masks returns a boolean instead of cairo status code. + Without this fix, get_image bails out over and over again even operations + was completed successfully. :-( + + src/cairo-glitz-surface.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit c8b70aacc6b5523e2f73bebf4f61e876de1c3b3f +Author: Nicolas Bruguier <gandalfn@club-internet.fr> +Date: Sat Nov 22 18:16:17 2008 +0800 + + glitz: bring glitz backend to more or less working state. + + Thanks Nicolas Bruguier for writing the original patch and + thanks Paolo Bonzini for pointing out. This patch converts 24.8 + fixed point values into 16.16 ones before passing them down to glitz. + And I fixed a use-after-free issue in _cairo_glitz_surface_set_clip_region. + glitz_surface_set_clip_region takes the pointer and doesn't copy the + clip boxes, the original code frees the clip boxes immediately after + setting clip region. Keeping the box around with the life time of clip + region fixes the bug. + + src/cairo-glitz-surface.c | 329 +++++++++++++++++++++++----------------------- + 1 file changed, 163 insertions(+), 166 deletions(-) + +commit 77e60df32fa59328bd32095c77f8c360805b5db7 +Author: Maarten Maathuis <madman2003@gmail.com> +Date: Sat Nov 8 15:29:40 2008 +0100 + + cairo-xcb: avoid leaking memory + + src/cairo-xcb-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 361962b7fb4385f164673991670b6fce0839d32a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 08:42:30 2008 +0000 + + [directfb] Compile fix with debug enabled. + + Fix a trivial compile failure reported here: + Bug 18322 - bug in _cairo_directfb_surface_release_source_image function + (http://bugs.freedesktop.org/show_bug.cgi?id=18322) + + src/cairo-directfb-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit f15b1f26becf28457e9ccf8903257a0dec25d547 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 20 23:19:19 2008 +0000 + + [region] Use the caller supplied array for extracting boxes. + + Allow the user to pass in a pre-allocated array and use it if the number + of boxes permits. This eliminates the frequent allocations during clipping + by toolkits. + + src/cairo-directfb-surface.c | 6 ++++-- + src/cairo-glitz-surface.c | 1 + + src/cairo-paginated-surface.c | 3 +++ + src/cairo-region.c | 11 ++++++----- + src/cairo-sdl-surface.c | 1 + + src/cairo-surface.c | 15 ++++++++------- + src/cairo-win32-surface.c | 3 ++- + src/cairo-xcb-surface.c | 1 + + src/cairo-xlib-surface-private.h | 2 +- + src/cairo-xlib-surface.c | 13 ++++++++----- + 10 files changed, 35 insertions(+), 21 deletions(-) + +commit 9d2c55c661885c06eed44e810004c2ebe07038d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 20 21:53:34 2008 +0000 + + [traps] Embed sufficient traps to accommodate a stroke rectangle + + Small numbers of traps are frequently generated from either a path of a + single line, or that of a rectangle. Therefore should embed sufficient + storage with cairo_traps_t to accommodate the stroke of a single rectangle + (e.g. a pango unknown glyph hexbox) to avoid frequent allocations. + + src/cairoint.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a11442154d958d5c9694eb944a715a6c689fda85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 20 18:00:40 2008 +0000 + + [cairo] Allocate glyphs on the stack for show_text(). + + First try to use a stack buffer for the glyphs and clusters if the user + calls cairo_show_text() - for example, as pango does to draw the unknown hex + box. + + src/cairo.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 9556266ffcb1c34187730af90bb847950d6db66e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 20 09:40:25 2008 +0000 + + [surface] Make the error surfaces have a NULL backend. + + By using a NULL backend for the error surfaces, instead of a pointer to + the image surface backend end, we save a few lookup/redirections during + dynamic linking. + + src/cairo-surface.c | 22 ++++++---------------- + 1 file changed, 6 insertions(+), 16 deletions(-) + +commit cfd2c73826f5bf20624fbdf5b16fd08fbe18a914 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 20 09:36:02 2008 +0000 + + [image] Trim image surface size by a few bytes + + Convert an infrequently accessed series of cairo_bool_t and short enums + to a common bitfield. + + src/cairo-image-surface.c | 11 ++++++----- + src/cairoint.h | 7 ++++--- + 2 files changed, 10 insertions(+), 8 deletions(-) + +commit 1f48b36933b5ff082edf3e221563c15c3bf16b75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 20 12:41:18 2008 +0000 + + [script] Build fix for ! HAS_FT_FONT + + Correct the macro definition used when compiling without FreeType. + + util/cairo-script/cairo-script-operators.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 0d5e533b6cc43c4ebc030140933247cf160d47cd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 17:03:13 2008 +0000 + + [trace] Correctly push font-face onto the operand stack. + + We tried to push a reference to an undefined font-face, now we just copy + from the operand stack. + + util/cairo-trace/trace.c | 61 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 36 insertions(+), 25 deletions(-) + +commit b426346b482e2687081433213ae107cb7b2ebe58 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 16:04:57 2008 +0000 + + [trace] Construct matrices directly + + Avoid building a temporary array by constructing the matrix directly. + + util/cairo-trace/trace.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 727ff2bd7260f26c9390079258c43e6890ef2284 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 14:25:20 2008 +0000 + + [xlib] Explicitly track whether the GC has clip_rects. + + Simplify the logic and remove some pessimism from the code by explicitly + tracking when we set clip rectangles on the GC. + + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 6 +++--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 63a86a470fb88ee876414164e7e26789c1065b82 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 14:04:01 2008 +0000 + + [surface] Replay meta surfaces to a similar surface. + + When cloning a meta-surface, first attempt to replay it to a similar + surface rather than a full-sized image buffer. + + src/cairo-surface.c | 30 ++++++++++++++++++++++++++++-- + 1 file changed, 28 insertions(+), 2 deletions(-) + +commit 7657bda0172f823fba61db4f66e0166c7619fbd2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 18 11:23:33 2007 +0000 + + [perf/pythagoras_tree] Another fractal. + + Test lots of rectangles and recursion path construction. + + perf/Makefile.am | 3 +- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/pythagoras-tree.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 90 insertions(+), 1 deletion(-) + +commit abd0a2627d198eddb628bbc1f2974435a74655a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 18 10:49:23 2007 +0000 + + [perf/dragon] Add a dragon curve perf case. + + Inspired by http://labs.trolltech.com/blogs/2007/08/31/rasterizing-dragons/ + and http://en.wikipedia.org/wiki/Dragon_curve, add a performance test case + to measure drawing this space-filling fractal curve. + + perf/Makefile.am | 3 +- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/dragon.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 170 insertions(+), 1 deletion(-) + +commit 81ef772aa0bf512ec5ad8752da160117498bdb30 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 11:00:35 2008 +0000 + + [xlib] Mark GC as dirty if we have an outstanding clip. + + Ginn Chen reported a regression with Firefox where "the whole area of web + page is transparent until it redraws", and bisected it to the change to + lazily clear the clip. + + The bug would appears to be when we have an inconsistent GC clip - i.e. + the clip on the surface has been cleared, but we have not yet used and + thus cleared the GC, so that we did not mark the GC as having a clip set + when we freed it. + + src/cairo-xlib-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c41b99268dd2424d09ab12ca560d5db30b6b6faf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 11:49:04 2008 +0000 + + Conditionally include byteswap.h + + Fixup compilation by copying the checks from cairo-wideint-private.h to + conditionally include byteswap.h and provide fallback implementations. + + util/cairo-script/cairo-script-interpreter.c | 1 - + util/cairo-script/cairo-script-operators.c | 1 - + util/cairo-script/cairo-script-private.h | 17 +++++++++++++++++ + util/cairo-script/cairo-script-scanner.c | 1 - + util/cairo-trace/trace.c | 17 ++++++++++++++++- + 5 files changed, 33 insertions(+), 4 deletions(-) + +commit 8345fedbe4d4d003c1f26a78ac7c512c04d04173 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 11:44:42 2008 +0000 + + [spline] Fix compile. + + Do not return the result of a void function. gcc chose to not warn about + this when removing the return parameter... + + src/cairo-spline.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit b6c371a47f33ec10d4d6130cc15677761df2bdfd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 08:44:24 2008 +0000 + + [pattern] Cosmetic. + + surface is equal to pattern->surface at this point. + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7894abbe6d43b10ab2a92d99bdd6a08878e9022c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 19 08:37:26 2008 +0000 + + [test] Support foreground only execution. + + Add an option to prevent forking - which makes it difficult to + valgrind/gdb individual tests. + + test/Makefile.am | 1 + + test/cairo-test-runner.c | 120 ++++++++++++++++++++++++++--------------------- + 2 files changed, 67 insertions(+), 54 deletions(-) + +commit 645df0c6d2a3d9999bb18ddb8bb9995b3d597554 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 18 16:37:59 2008 +0000 + + [scaled-font] Clean-up compiler warning. + + gcc warns that the status may be used uninitialized, so fix it. + + src/cairo-scaled-font-subsets.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 2fdee490745a6c3a75691907aadf8ae38c57234c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 17 12:22:39 2008 +0000 + + [compiler] likelihood macros + + Behdad prefers these to be upper-case to be consistent with G_UNLIKELY and + friends. However, as I intend to use these for nearly all instances of + if(status), I suggest that we keep to the short and not so loud: + if (unlikely (status)) + return status; + + src/cairo-compiler-private.h | 8 ++++---- + src/cairo-hash.c | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 97edc680c189205ac2f4e150009f1f1cbe55ba1a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 18 10:49:27 2008 +0000 + + [twin] Reduce tolerance. + + As the glyphs are rendered to cache, ensure that they are rendered at the + highest quality settings. + + src/cairo-font-face-twin.c | 1 + + src/cairo.c | 1 + + src/cairoint.h | 1 + + test/Makefile.am | 1 + + test/twin.pdf.ref.png | Bin 0 -> 1673 bytes + test/twin.ref.png | Bin 1673 -> 1718 bytes + 6 files changed, 4 insertions(+) + +commit e50538863a2c063eba61b36cc08eff6eeb712956 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 18 10:45:19 2008 +0000 + + [twin] Tweak line width. + + Slightly increase line width to eliminate internal holes in the characters + where the strokes were not quite overlapping. + + src/cairo-font-face-twin.c | 2 +- + test/twin.c | 2 +- + test/twin.ps2.ref.png | Bin 1167 -> 1095 bytes + test/twin.ps3.ref.png | Bin 1167 -> 1095 bytes + test/twin.ref.png | Bin 1836 -> 1673 bytes + test/twin.svg11.ref.png | Bin 1773 -> 1662 bytes + test/twin.svg12.ref.png | Bin 1773 -> 1662 bytes + 7 files changed, 2 insertions(+), 2 deletions(-) + +commit 91c17d33324b51a3876bc6ce778c684111139303 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 18 00:32:54 2008 +0000 + + [trace] Simple unbounded cache for symbol lookups. + + Reparsing the dwarf info for every lookup is very slow, so cache the + symbol lookups. This initial implementation is unbounded in the simple + belief that the actual number of unique lookups during a program's + lifetime should be fairly small. (Extending to a bounded MRU list is left + as an exercise for the reader.) + + util/cairo-trace/lookup-symbol.c | 70 ++++++++++++++++++++++++++++++++++------ + util/cairo-trace/trace.c | 9 +++--- + 2 files changed, 65 insertions(+), 14 deletions(-) + +commit 2839a0e800d6cc12b28da44f30a9e278ceac65aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 16 20:04:55 2008 +0000 + + [script] Add a simple replay. + + A very simple replay program for trace replay. + + util/cairo-script/.gitignore | 1 + + util/cairo-script/Makefile.am | 7 +++- + util/cairo-script/csi-replay.c | 85 ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 92 insertions(+), 1 deletion(-) + +commit b091c5bfcad170fd563699a1c8b11e7d25d159a2 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Nov 18 00:20:38 2008 +0200 + + BIBLIOGRAPHY: Cite Hars & Petruska's Pseudorandom Recursions paper. + + BIBLIOGRAPHY | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 3a82f943988413e0d3fada9932bb385f4cbdb3c7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 16 18:21:52 2008 +0000 + + [test] Add util/cairo-script to include path. + + any2ppm needs the include path for cairo-script-interpreter so that it can + be built without an existing install. + + test/Makefile.am | 3 ++- + test/any2ppm.c | 3 --- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 997fa6a7729b72b25d9275929bf190e71eed1b9d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 16 17:43:40 2008 +0000 + + [configure] Remove old line for CairoScript testing. + + CairoScript testing should now be unconditional so remove the surplus + message. + + build/configure.ac.features | 1 - + 1 file changed, 1 deletion(-) + +commit a2eff7c7deb9b41c387472bb91b9a7b9c8f319f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 16 16:19:25 2008 +0000 + + [test] Add build rule for libcairo-script-interpreter.la + + Add a rule to build the cairo-script-interpreter on behalf of any2ppm. + + test/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit bf309aab6072ee1004073e71bccdf3c8040a8ad6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 15 11:36:41 2008 +0000 + + [configure] Delete CAN_TEST_SCRIPT + + A CairoScript interpreter is built under utils and so is always available. + + configure.ac | 3 --- + test/any2ppm.c | 8 -------- + 2 files changed, 11 deletions(-) + +commit d7873eecc598a558a2a862add8e9b056c4a23a4a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 14 17:18:47 2008 +0000 + + [spline] Eliminate intermediate allocations during spline decomposition. + + The spline decomposition code allocates and stores points in a temporary + buffer which is immediately consumed by the caller. If the caller supplies + a callback that handles each point computed along the spline, then we can + use the point immediately and avoid the allocation. + + src/cairo-bentley-ottmann.c | 12 +-- + src/cairo-path-fill.c | 23 ++-- + src/cairo-path-fixed.c | 27 ++--- + src/cairo-path-in-fill.c | 21 ++-- + src/cairo-path-stroke.c | 101 +++++++++--------- + src/cairo-pen.c | 254 +++++++++++++++++++++++++++++--------------- + src/cairo-polygon.c | 23 ++-- + src/cairo-spline.c | 121 ++++----------------- + src/cairo-types-private.h | 13 ++- + src/cairoint.h | 65 ++++++++---- + 10 files changed, 331 insertions(+), 329 deletions(-) + +commit 3bf8379408ce9b1e08d130bcd1076766e36f1bef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 14 09:50:29 2008 +0000 + + [type1] Propagate fatal NO_MEMORY erro from FreeType. + + If FreeType fails to load the glyph, check for a fatal error before + falling back (and effectively masking the fatal condition). + + src/cairo-type1-subset.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit db9ed77d8aa4f4b4c8410e52e5bbd16ffa94ee24 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 20:36:14 2008 +0000 + + [cairo] FLush surface on cairo_destroy() + + When discussing the implications of snapshot cow, one of the questions + that we raised was what happens on cairo_destroy()? The lifetime of the + context implicitly marks the extents of the drawing operations, typically + the expose event (or perhaps one phase of it). Therefore at the end of the + sequence we implicitly wish to flush the graphics events to the surface. + + src/cairo.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 032be9849dfc32ec8802a4f086619755a3a397f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 16:36:01 2008 +0000 + + [skiplist] Inline testing. + + Add a loop to create a skip list to allow manual checking. + + src/Makefile.am | 5 ++++- + src/cairo-skiplist.c | 36 ++++++++++++++++++++++++++++++++++++ + 2 files changed, 40 insertions(+), 1 deletion(-) + +commit e44c1f26e48cfb2f74834b6a8ef8532b0bd28982 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Oct 18 01:15:44 2008 +0300 + + Use a smaller and faster random number generator. + + The previous LFSR generator used a large table to be speedy. The + replacement generator is the single stage generator (1) from section + 5.4 of [HP2007], requires no tables or extra state. I've run the + generator through Rob Brown's extended Dieharder test suite and it + passes all but one self-proclaimed buggy test (-d2) and the 2D sphere + minimum distance test (-d12). + + [HP2007] Hars L. and Petruska G., ``Pseudorandom Recursions: Small and Fast Pseurodandom Number Generators for Embedded Applications'', + Hindawi Publishing Corporation + EURASIP Journal on Embedded Systems + Volume 2007, Article ID 98417, 13 pages + doi:10.1155/2007/98417 + http://www.hindawi.com/getarticle.aspx?doi=10.1155/2007/98417&e=cta + + src/cairo-skiplist.c | 200 +++------------------------------------------------ + 1 file changed, 11 insertions(+), 189 deletions(-) + +commit a4c5371b5e6d0df71efc75fee6f6a8fe8c6d3488 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 14:56:38 2008 +0000 + + [os2] Move include cairo.h before os2.h + + The defines need to come first, but we specify that cairo.h is the first + header file to be included by files. + + src/cairo-os2.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 456252a1c2b00685bee18c01bf27738d6125b4f8 +Merge: 3b11997 ab61544 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 14 15:27:34 2008 +0100 + + Merge branch '1.8' + + Conflicts: + + NEWS + cairo-version.h + +commit ab61544b30406a49abc1f559d81129edce6d41ec +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 14 13:17:01 2008 +0100 + + Increment version to 1.8.5 after the 1.8.4 release. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 66e8f142e381501d114888c2d1fc1e7f6d6a9857 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 14 11:08:40 2008 +0100 + + Increment version to 1.8.4 + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b9c1344ad82d38bb86fa85fbb565b2de64aa0e35 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 14 11:07:10 2008 +0100 + + NEWS: Add notes for cairo 1.8.4 + + Just a few bug fixes here. + + NEWS | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 52 insertions(+) + +commit 3b11997a23baa9e38e87b584ee29f4888a5d92f7 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Nov 13 18:01:47 2008 +0200 + + [cairo-script] Remove outdated #error to allow compilation to succeed. + + The interpreter doesn't depend on the script surface anymore. + + util/cairo-script/cairo-script-interpreter.h | 6 ------ + 1 file changed, 6 deletions(-) + +commit d654d528de16769932131da80f4b925151d50103 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 13 16:45:15 2008 +0100 + + Blacklist "X.Org" < 7.0 with the buggy_repeat workaround. + + This is in response to a report that a 6.9 server crashes with + cairo's extend-reflect test: + + https://bugs.freedesktop.org/show_bug.cgi?id=15628#c2 + + src/cairo-xlib-display.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 35a1ba0ddc45f9cc785c6f8a37b6bb49c953e047 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 13 16:36:20 2008 +0100 + + Document the buggy_repeat workaround more carefully. + + It's a confusing condition, so let's be explicit about where + the various numbers come from. + + src/cairo-xlib-display.c | 54 ++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 38 insertions(+), 16 deletions(-) + +commit cdfffc7420e005b2a7d1979feef8bd304183126c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 11:07:45 2008 +0000 + + Add CairoScript interpreter + + Add a CairoScript interpreter library and use it to replay the test output + for the CairoScript backend. The library is also used by the currently + standalone Sphinx debugger [git://anongit.freedesktop.org/~ickle/sphinx]. + The syntax/operator semantics are not yet finalized, but are expected to + mature before the next stable release. + + configure.ac | 20 +- + test/Makefile.am | 4 +- + test/any2ppm.c | 41 +- + util/Makefile.am | 2 +- + util/cairo-script/COPYING | 17 + + util/cairo-script/Makefile.am | 21 + + util/cairo-script/cairo-script-file.c | 1018 +++++ + util/cairo-script/cairo-script-hash.c | 448 ++ + util/cairo-script/cairo-script-interpreter.c | 473 +++ + util/cairo-script/cairo-script-interpreter.h | 104 + + util/cairo-script/cairo-script-objects.c | 666 +++ + util/cairo-script/cairo-script-operators.c | 5791 ++++++++++++++++++++++++++ + util/cairo-script/cairo-script-private.h | 853 ++++ + util/cairo-script/cairo-script-scanner.c | 1180 ++++++ + util/cairo-script/cairo-script-stack.c | 196 + + 15 files changed, 10801 insertions(+), 33 deletions(-) + +commit a856371bef496da0e84226f4fd2fc3cb72e955ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 10:45:34 2008 +0000 + + Add CairoScript backend. + + A new meta-surface backend for serialising drawing operations to a + CairoScript file. The principal use (as currently envisaged) is to provide + a round-trip testing mechanism for CairoScript - i.e. we can generate + script files for every test in the suite and check that we can replay them + with perfect fidelity. (Obviously this does not provide complete coverage + of CairoScript's syntax, but should give reasonable coverage over the + operators.) + + boilerplate/Makefile.sources | 3 + + boilerplate/cairo-boilerplate-script-private.h | 57 + + boilerplate/cairo-boilerplate-script.c | 125 ++ + boilerplate/cairo-boilerplate.c | 16 + + build/configure.ac.features | 2 + + configure.ac | 16 + + doc/public/tmpl/cairo-surface.sgml | 1 + + src/Makefile.sources | 3 + + src/cairo-base85-stream.c | 1 + + src/cairo-cache-private.h | 2 +- + src/cairo-cache.c | 41 +- + src/cairo-deflate-stream.c | 1 + + src/cairo-ft-font.c | 12 + + src/cairo-ft-private.h | 3 + + src/cairo-gstate.c | 3 +- + src/cairo-output-stream-private.h | 19 +- + src/cairo-output-stream.c | 43 +- + src/cairo-path-fixed-private.h | 11 + + src/cairo-path-fixed.c | 164 ++ + src/cairo-pattern.c | 255 +++ + src/cairo-pdf-operators.c | 1 + + src/cairo-ps-surface.c | 2 + + src/cairo-scaled-font-private.h | 9 +- + src/cairo-scaled-font.c | 5 + + src/cairo-script-surface.c | 2598 ++++++++++++++++++++++++ + src/cairo-script.h | 74 + + src/cairo-types-private.h | 1 + + src/cairo.h | 4 +- + src/cairoint.h | 18 + + test/Makefile.am | 4 +- + test/any2ppm.c | 87 +- + test/mime-data.script.ref.png | Bin 0 -> 1982 bytes + 32 files changed, 3540 insertions(+), 41 deletions(-) + +commit 47a56e08501ec9375f75c15e35a68c77b313ada4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 10 16:51:52 2008 +0100 + + [type1] Bind the RD procedure + + As the RD procedure may be called several hundred times for a full font, + it is worth binding. + + src/cairo-type1-fallback.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0769d39d0093ec3bff5b72ecbfcef1bae2f03be2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 11:13:22 2008 +0000 + + Add predicate likelihood macros. + + Define the couple of standard macros that we can use to guide gcc + optimisations of which code path will be most likely taken. + + src/cairo-compiler-private.h | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit b06c50cc54140a662adacde6336a3e7777f26ac3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 11:21:26 2008 +0000 + + [cairoint.h] Remove unused PLT entries. + + Trim the slim_hidden_proto/def to match the currently used functions. + + src/cairo-pattern.c | 1 - + src/cairo.c | 3 --- + src/cairoint.h | 16 ++++++---------- + 3 files changed, 6 insertions(+), 14 deletions(-) + +commit 20fc2a2f92e27082a8806b9acb4b904dc84da672 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 11 11:35:14 2008 +0000 + + [in-fill] Fixup boundary insideness testing + + Benjamin Otte noticed that the top-left vertex was now included within the + fill extents. Having updated the test case to check the insideness + conditions as defined by flash, fix the edge handling to match. + + src/cairo-path-in-fill.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9afad537301529a5a4b4ddf8b7e4425002ea39c7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 11 10:22:17 2008 +0000 + + [test] Expand in-fill-trapezoid + + Test vertices and edges of a rectangle to probe 'corner-cases', using the + insideness conditions from flash. + + test/in-fill-trapezoid.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit cebc84f367a81eedebf7ab0b6b082691923c3ef7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 8 00:06:38 2008 +0000 + + [hash] Separate out unique patterns of iterating over the table. + + Avoid unnecessary conditionals for the hotpaths by separating out the + iteration over the elements into their distinct modes. + + src/cairo-font-face.c | 2 +- + src/cairo-hash.c | 185 ++++++++++++++++++++++-------------------------- + src/cairo-scaled-font.c | 11 +-- + 3 files changed, 93 insertions(+), 105 deletions(-) + +commit 5f0aa274459fa182d1f82d393224c46ce2b12785 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 13 10:45:15 2008 +0000 + + [trace] Add caller line info. + + Use lookup_symbol() on the return address to identify the caller and emit + useful debug info to the trace. + + util/cairo-trace/cairo-trace.in | 27 +++++++- + util/cairo-trace/lookup-symbol.c | 72 ++++++++++----------- + util/cairo-trace/trace.c | 134 +++++++++++++++++++++++++++++++++++---- + 3 files changed, 178 insertions(+), 55 deletions(-) + +commit 4cd6b0c0b9862f398877cb23c294399b480ac8d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 12 00:37:40 2008 +0000 + + [trace] Check for an undefined pattern and use index instead. + + util/cairo-trace/trace.c | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +commit 76f249a49399744d6d936e36ca4d68ab4a1f3d3b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 11 09:12:50 2008 +0000 + + [trace] Detect and report broken traces. + + We cannot trace the cairo-script-interpreter as that uses Cairo's private + symbols. + + util/cairo-trace/trace.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 01e2021b2b7b66e7cdb9c4b0326fd5793759848b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 10 16:15:28 2008 +0000 + + [trace] Trace mark-dirty + + Capture the image data on mark dirty and record in the trace. + + util/cairo-trace/cairo-trace.in | 2 +- + util/cairo-trace/trace.c | 121 ++++++++++++++++++++++++++++++++++------ + 2 files changed, 106 insertions(+), 17 deletions(-) + +commit 8f3d0b55f50168f061a01eecfcb4ebecbff0e1c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 11 09:25:24 2008 +0000 + + [trace] Add unstable warning. + + Add warning that CairoScript is unfinished and I may radically alter the + format/syntax/language before release. + + util/cairo-trace/trace.c | 1 + + 1 file changed, 1 insertion(+) + +commit 7ad2635ebe84ba7c050a7f00c5389cdc31ab1172 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 11 09:46:38 2008 +0000 + + [trace] Disable stdout by default. + + Don't hog the terminal when we save to a trace file anyway. + + util/cairo-trace/cairo-trace.in | 48 +++++++++++++++++++++++++---------------- + 1 file changed, 29 insertions(+), 19 deletions(-) + +commit efa9e1088cbf1b5331cc0bab3348520f3b91ae4b +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Nov 13 12:11:12 2008 +0200 + + [clip] Fix uninitialised status return in _cairo_clip_intersect_mask() for empty extents. + + This fixes the clip-all test case crashing for me. + + src/cairo-clip.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 279a7cef349cf5aa87cdeacb9424413f51117fe8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Nov 13 10:50:41 2008 +0100 + + [os2] Fix includes + + Patch from Dave Yeo to make cairo-os2.h include os2.h directly so the + header is standalone. + + src/cairo-os2-private.h | 11 ----------- + src/cairo-os2-surface.c | 5 ----- + src/cairo-os2.h | 8 ++++++++ + 3 files changed, 8 insertions(+), 16 deletions(-) + +commit 0a682034a04fa7fc1407e7bc093ae01f4b385ad7 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Nov 11 13:26:09 2008 -0500 + + Make the clipping implementation comment clearer + + When reviewing the spans changes, I reread this comment and it wasn't as clear + as it could be. + + src/cairo-clip.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 4fdd856569a67636aaf29bc1a76eed44418db484 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Tue Nov 11 15:37:09 2008 +0100 + + README: adapt pixman version requirement to match configure.ac + + README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c0042840c70c14e3e608ac3849edf5f1ef99816 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Tue Nov 11 08:41:31 2008 -0500 + + [quartz] Add the proper propagation of extents + + This fixes the problems introduced by d682d275b90f7326df76d2764c513c8b6d5b551b + + src/cairo-quartz-surface.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +commit 57551a91168a68399add9e5c324fba03961b7747 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Nov 11 08:31:23 2008 -0500 + + [quartz] Fix fallout caused by const cairo_pattern_t * + + 794460186459981cd43ca38f3eba07e3f6bf8908 broke the quartz backend. + Fix it by adding const to the appropriate parameters in the function + declarations and copying the pattern when needed. + + src/cairo-quartz-surface.c | 41 ++++++++++++++++++++++++----------------- + 1 file changed, 24 insertions(+), 17 deletions(-) + +commit 164069b339843837e04e2522a615f03a83b362c0 +Author: Maarten Maathuis <madman2003@gmail.com> +Date: Sat Nov 8 15:29:40 2008 +0100 + + cairo-xcb: avoid leaking memory + + src/cairo-xcb-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5badcf6e370b9808374a1fa547383b236a9dcd21 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 8 11:17:34 2008 +0000 + + [trace] Use a string literal for the type. + + In order that the string is interned and so is only allocated the once. + + util/cairo-trace/trace.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit 1d0faefbc8700833e9bde8a9c825b02b0f3cf910 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 7 22:48:21 2008 +0000 + + [trace] Record the XID as a number + + Don't waste string constants (which get interned) for a simple number! + + util/cairo-trace/trace.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 899a159b133e22f71e2a176785c91e78838c3fee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 8 11:16:03 2008 +0000 + + [trace] Remove stray /source + + An accidental /source was pushing pushed onto the operand stack and never + used. + + util/cairo-trace/trace.c | 1 - + 1 file changed, 1 deletion(-) + +commit f1cae5c52a5ee71b7933fca702bb525d98936838 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 7 20:52:08 2008 +0000 + + [ps] Trivial compile warning clenaup. + + Add a missing const to silence the compiler. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2b32c8b9e572c96ce8ba5c7d43b568f18f6da295 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 7 20:30:33 2008 +0000 + + [hash] Return lookup entry. + + Use the return value to return the result from _cairo_hash_table_lookup() + (as opposed to filling an output parameter on the stack) as this (a) + results in cleaner code (no strict-alias breaking pointer casts), (b) + produces a smaller binary and (c) is measurably faster. + + src/cairo-cache-private.h | 5 ++--- + src/cairo-cache.c | 8 +++---- + src/cairo-cff-subset.c | 24 +++++++++------------ + src/cairo-font-face.c | 9 ++++---- + src/cairo-ft-font.c | 6 +++--- + src/cairo-hash-private.h | 7 +++--- + src/cairo-hash.c | 24 +++++++-------------- + src/cairo-misc.c | 7 +++--- + src/cairo-scaled-font-subsets.c | 47 ++++++++++++++++++++--------------------- + src/cairo-scaled-font.c | 18 +++++++--------- + 10 files changed, 67 insertions(+), 88 deletions(-) + +commit d15fb9344bf86dd52cda0b43d3dfc49397fd84ec +Author: Karl Tomlinson <karlt+@karlt.net> +Date: Fri Nov 7 20:06:35 2008 +0000 + + [hash] Set is_unique when finding an available for inserts + + As we obey the rule in Cairo that we only insert if we know that there is + no existing entry in the hash table, we can therefore perform a much quicker + search knowing that the key is unique. + + src/cairo-hash.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit cd2e18ddc65959a736fc7b7f6bbd3e76af0495a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 7 18:35:39 2008 +0000 + + [test] Fix-up rgb byte packing + + Another embarrassing, but thankfully, trivial bug. + + boilerplate/cairo-boilerplate.c | 2 ++ + test/any2ppm.c | 14 +++++++++----- + 2 files changed, 11 insertions(+), 5 deletions(-) + +commit 2554d1759835a174b89107808d81d044c3e2e098 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 7 13:26:46 2008 +0000 + + [surface] Pass a separate closure for the mime-type destroy notifier. + + A limitation of the current API was that the destroy notifier was called + on the mime-data block. This prevents the user from passing in a pointer + to a managed block, for example a mime-data block belonging to a + ref-counted object. We can overcome this by allowing the user to specify + the closure to be used with the destroy notifier. + + src/cairo-png.c | 3 ++- + src/cairo-surface.c | 9 ++++++--- + src/cairo-types-private.h | 1 + + src/cairo.h | 11 ++++++----- + test/mime-data.c | 3 ++- + test/pdf-mime-data.c | 4 +++- + util/cairo-trace/trace.c | 6 ++++-- + 7 files changed, 24 insertions(+), 13 deletions(-) + +commit ff0bd64e9436026f11e85eafcd74e9a0131c8b9f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 6 01:22:39 2008 +0000 + + [NEWS] Add a few notes. + + Help Carl with a speedy snapshot by writing a few notes about what has been + added so far to 1.9. + + NEWS | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit 13627b46209f9239d10a155f2de7e53c0585e4c2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 6 01:04:52 2008 +0000 + + [in-fill] Fix transposed arguments. + + Silly typo that escaped the test suite. + + src/cairo-path-in-fill.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9dee7af41f4f5a4c1285e9d7951148e78659c064 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 6 01:02:23 2008 +0000 + + [test] Add off-centre tests to in-fill-trapezoid. + + Reading through the previous commit spotted that the arguments to + edge_compare_for_y_against_x were transposed, but the test-suite had + failed to catch detect it. This is due that in order to actually + solve the equation we need to have a diagonal edge passing near an + off-centre point of interest, which was not among the test cases. So add + some off-centre tests to fully exercise the code. + + test/in-fill-trapezoid.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 66 insertions(+) + +commit f5965cb7d6559e051c2581fe446d0b9f40427eb2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 23:48:52 2008 +0000 + + [in-fill] Avoid tessellation by counting number of edge crossing to -∞ + + Benjamin Otte reports that in one particular benchmark cairo_in_fill() is + a hotspot in the profile. Currently we tessellate the entire path and then + search for a containing trapezoid. This is very expensive compared to the + simple method of counting the number of edge crossing between the point of + interest and x=-∞. For example, this speeds tessellate-256 up by almost 3 + orders of magnitude. + + src/Makefile.sources | 1 + + src/cairo-gstate.c | 30 +----- + src/cairo-path-in-fill.c | 264 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 9 ++ + 4 files changed, 279 insertions(+), 25 deletions(-) + +commit 0ac98461597420d3dfe52e405c6b3322d32f4854 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 6 00:04:11 2008 +0000 + + [test] Add WINDING variants to in-fill test + + Check cairo_in_fill() with some WINDING tests as well as the current + EVEN_ODD. + + test/in-fill-trapezoid.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 56 insertions(+) + +commit 476d5daa9bfc5e9014d1b6572853d1d78ce6a6d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 19:29:04 2008 +0000 + + [trace] Only build if we have zlib. + + Use the configure check for libz and do not attempt to build the trace + unless we have zlib. + + configure.ac | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 34564aa84a4642dceba75efdeef438be6c6896c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 19:27:49 2008 +0000 + + [test/pdf2png] Remove dependency on GdkPixbuf + + It's appears to be dropped from the current poppler trunk, so just use our + own venerable cairo_surface_write_ton_png(). + + configure.ac | 2 +- + test/pdf2png.c | 32 +++++++++++++++++++------------- + 2 files changed, 20 insertions(+), 14 deletions(-) + +commit 564d64a1323c5cbcde2dd9365ac790fe8aa1c5a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 18:47:34 2008 +0000 + + [png] Complete the idempotent read_png() -> write_png() + + Write out the original PNG mime-data if attached to the surface during + cairo_surface_write_to_png(). Similar to how the compressed alternate + representations are handled by the other backends. + + Note: by automatically attaching and using the mime-data in preference to + the image data, we break the read_from_png(); draw(); write_to_png() + cycle. + + src/cairo-png.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit ec559822cfe6df0006ca2db2aa3a11699326865c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 18:11:36 2008 +0000 + + [trace] Use the mime-type image representation + + When emitting image data, first check to see if we have a pre-compressed + alternate representation. + + util/cairo-trace/trace.c | 303 +++++++++++++++++++++++++++++++++-------------- + 1 file changed, 214 insertions(+), 89 deletions(-) + +commit d63267e4e7e148836dcfc4c8e2a8396ddaab70d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 17:18:51 2008 +0000 + + [test] Update mime-data to check image/png + + Add a "image/png" mime-type test. + + test/Makefile.am | 1 + + test/mime-data.c | 67 +++++++++++++++++++++++++++++---------------- + test/mime-data.pdf.ref.png | Bin 4345 -> 4466 bytes + test/mime-data.ps.ref.png | Bin 4345 -> 4466 bytes + test/mime-data.ref.png | Bin 127 -> 155 bytes + test/mime-data.svg.ref.png | Bin 0 -> 6153 bytes + test/png.png | Bin 0 -> 2096 bytes + 7 files changed, 45 insertions(+), 23 deletions(-) + +commit e4ec5c762f6d01cc5af28dc0a256e268a04101aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 16:44:49 2008 +0000 + + [svg] Embed original PNG data. + + Embed the attached PNG representation of a surface in preference to + re-encoding the surface. + + src/cairo-svg-surface.c | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +commit e40d62a0fe96b8b937017a3bc2f18766c411ec41 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 16:38:34 2008 +0000 + + [png] Attach the png representation to cairo_surface_create_from_png(). + + Attach the original png data as an alternate representation for image + surfaces created by cairo_surface_create_from_png(). + + src/cairo-output-stream-private.h | 5 ++ + src/cairo-output-stream.c | 28 ++++++++- + src/cairo-png.c | 127 +++++++++++++++++++++++--------------- + src/cairo-surface-fallback.c | 20 +++--- + src/cairo.h | 1 + + 5 files changed, 122 insertions(+), 59 deletions(-) + +commit 89616dee8f11c6a7de3fa476b13661420648786f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 16:41:13 2008 +0000 + + [surface] Don't allocate a structure for mime_data == NULL. + + If the user attempts to clear the attached mime data representation, just + clear the user data slot and do not allocate an empty structure. + + src/cairo-surface.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit a1ab11df01962bea5752f5a5b53926a26a6f34ae +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Nov 5 11:50:20 2008 -0500 + + Define RepeatNone, etc if the available Render version doesn't (#18385) + + src/cairo-xlib-xrender-private.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 43cfaec39cc742ddfbf566b36391d620400e10be +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Nov 5 11:50:20 2008 -0500 + + Define RepeatNone, etc if the available Render version doesn't (#18385) + + src/cairo-xlib-xrender-private.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 199c0e71139fe9baf83e74ea69c01629ace5f9a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 15:12:19 2008 +0000 + + [svg] Embed jpeg data. + + Support jpeg embedding for svg output. + + src/cairo-svg-surface.c | 50 +++++++++++++++++++++++++++++++++++++++++++++---- + test/Makefile.am | 1 + + 2 files changed, 47 insertions(+), 4 deletions(-) + +commit 2261590875b4be7aa258c51e766f68974750e9e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 15:11:32 2008 +0000 + + [trace] Trim a few bytes from glyph arrays + + Remove some redundant whitespace from the glyph arrays to improve + readability and shrink the output file size. + + util/cairo-trace/trace.c | 65 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 38 insertions(+), 27 deletions(-) + +commit 248dd97075b50cd91619022098ed5dd35a66b5df +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 6 00:17:53 2008 +1030 + + win32-printing: Implement JPEG support + + src/cairo-win32-printing-surface.c | 91 ++++++++++++++++++++++++++++++++++---- + src/cairo-win32-private.h | 3 ++ + 2 files changed, 85 insertions(+), 9 deletions(-) + +commit 29621bd3995c5269fd6f73ab501383433bd29768 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 12:16:47 2008 +0000 + + [matrix] Remove stray offset from previous commit. + + I moved the pixel centre to xc,yc but forgot to remove it during + compensation - as caught by the test suite. + + Refresh a couple of reference images that depend upon exact pixel-centre + rounding conditions. + + src/cairo-matrix.c | 8 ++++---- + test/rotate-image-surface-paint.ref.png | Bin 232 -> 190 bytes + test/surface-pattern.pdf.ref.png | Bin 14776 -> 14791 bytes + test/surface-pattern.ref.png | Bin 11044 -> 11100 bytes + test/surface-pattern.svg.ref.png | Bin 16151 -> 16069 bytes + 5 files changed, 4 insertions(+), 4 deletions(-) + +commit e811173311ebe76d47eebcf5c6c5c798f9d3ea72 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 10:59:15 2008 +0000 + + [matrix] Compensate pixman_matrix in device space. + + We wish to reduce the visible error when converting to a pixman matrix, so + perform the compensation in device space instead of pattern space. + + src/cairo-image-surface.c | 4 ++-- + src/cairo-matrix.c | 53 ++++++++++++++++++++++++++++------------------- + 2 files changed, 34 insertions(+), 23 deletions(-) + +commit c95eebc92316ad50840fab1cec6c14b6c3e50fa5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 09:56:02 2008 +0000 + + [pattern] Split the translation between the matrix and [xy]_offset + + pixman limits the src] co-ordinates (and thus [xy]_offset] to 16bits, + so we need to be careful how much of the translation vector to push into + [xy]_offset. Since the range is the same for both, split the integer + component between the matrix and the offset. + + test/scale-offset* now at least shows the source image, even if it is + misplaced. + + src/cairo-pattern.c | 7 +++++-- + test/scale-offset-image.ps.ref.png | Bin 7445 -> 7289 bytes + test/scale-offset-image.ref.png | Bin 10005 -> 9953 bytes + test/scale-offset-similar.ps.ref.png | Bin 7819 -> 7860 bytes + test/scale-offset-similar.ref.png | Bin 10005 -> 9953 bytes + 5 files changed, 5 insertions(+), 2 deletions(-) + +commit d1b8186fd75922e73e62ef8f2ebb011e334ebe36 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 01:16:25 2008 +0000 + + [trace] Correct emission of set_font_face and set_source + + set_font_face was not consuming it's operand but blithely placing an + undefined font_face onto the operand stack, whereas set_source was + performing invalid exchanges on the stack. + + util/cairo-trace/trace.c | 36 +++++++++++++++++++++++++++--------- + 1 file changed, 27 insertions(+), 9 deletions(-) + +commit 4a4b10271a614ee9bf982994b8f9ec6b6102ee10 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 00:02:09 2008 +0000 + + [trace] Capture foreign drawables. + + If we attempt to use a surface as a source before we write to it, record + the surface contents. + + util/cairo-trace/trace.c | 102 ++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 93 insertions(+), 9 deletions(-) + +commit 432fe1ec2792153ec2559ef52aece3fcdc9c5df4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 15:30:23 2008 +0000 + + [trace] Mark filter mode as immediate. + + Be consistent and use "//" for the filter mode to indicate a constant. + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 68309481aa9295026e3e7e6407c793f899b5e600 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 5 08:03:01 2008 +0000 + + [test] Mark targets with is_meta? + + Allow tests to skip targets based on whether they are a meta surface or + not. + + boilerplate/cairo-boilerplate.c | 40 ++++++++++++++++++++++++---------------- + boilerplate/cairo-boilerplate.h | 1 + + test/cairo-test.c | 13 ++++++++++++- + 3 files changed, 37 insertions(+), 17 deletions(-) + +commit 8855f9583e84ae2e6d981e21133f590bff2065ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 20:04:02 2008 +0000 + + [test] Add scale-offset-(similar|image) + + Add a test case for the scaling bug reported by Michel Iwaniec: + http://lists.cairographics.org/archives/cairo/2008-November/015660.html + + test/Makefile.am | 6 ++ + test/scale-offset-image.c | 142 ++++++++++++++++++++++++++++++++++ + test/scale-offset-image.ps.ref.png | Bin 0 -> 7445 bytes + test/scale-offset-image.ref.png | Bin 0 -> 10005 bytes + test/scale-offset-similar.c | 143 +++++++++++++++++++++++++++++++++++ + test/scale-offset-similar.ps.ref.png | Bin 0 -> 7819 bytes + test/scale-offset-similar.ref.png | Bin 0 -> 10005 bytes + 7 files changed, 291 insertions(+) + +commit aad980900314bd032468f41a3216769c66e62097 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 19:11:55 2008 +0000 + + [test] Only depend on any2ppm if we build it. + + Do not add a dependency to any2ppm if it has been deconfigured. + + test/Makefile.am | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 59bdeba9abd7bef15c6855d707c4cf92b623cb00 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 18:42:05 2008 +0000 + + [matrix] Minimise pixman conversion error. + + Minimise the error of the pixman matrix about the centre of the displayed + area rather than the origin. + + src/cairo-image-surface.c | 25 +++++++++++++++++-------- + src/cairo-matrix.c | 24 ++++++++++++++---------- + src/cairo-pattern.c | 3 ++- + src/cairo-xlib-surface.c | 33 +++++++++++++++++++++++---------- + src/cairoint.h | 4 +++- + test/Makefile.am | 3 +-- + test/surface-pattern.pdf.ref.png | Bin 15996 -> 14776 bytes + test/surface-pattern.ref.png | Bin 11439 -> 11044 bytes + test/surface-pattern.svg.ref.png | Bin 0 -> 16151 bytes + test/surface-pattern.svg11.ref.png | Bin 17663 -> 0 bytes + test/surface-pattern.svg12.ref.png | Bin 17663 -> 0 bytes + 11 files changed, 60 insertions(+), 32 deletions(-) + +commit 068d465bb3541cc0ffc3cb9daa0848365c0a6a24 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 14:57:21 2008 +0000 + + [trace] Fix emission of cairo_scaled_font_create() + + In the case where the font face was no longer on the operand stack, the + font face would not have been passed to cairo_scaled_font_create(). + + util/cairo-trace/trace.c | 27 +++++++++++++-------------- + 1 file changed, 13 insertions(+), 14 deletions(-) + +commit a3d56c60e85176526d6cce139441b6921acc9218 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 14:06:02 2008 +0000 + + [trace] Use a common directory by default. + + If called directly (e.g. via /etc/ld.so.preload) put the output trace into + a central directory, and not the pwd. + + util/cairo-trace/Makefile.am | 10 ++++++++-- + util/cairo-trace/trace.c | 8 ++++++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit 3f7a21c5c93d8648ded097757852df44fc9fcaeb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 13:46:10 2008 +0000 + + [test] Add jpeg.jpg to EXTRA_DIST + + Forgot to add the new file to the distribution with the previous commit. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 9900a2adf3e43e752bd421f00e81873b41db4c30 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 13:41:02 2008 +0000 + + [test] Update mime-data jpeg reference data. + + <adrianj> ickle_: If we are going to use a different image for jpeg in + mime-data maybe we could create a jpg that contains the text "jpeg". That + way when support for the other image formats is added the mime-data test + could have one image for each type with each image and it is easy to see + that each image is the correct one. + + test/jpeg.jpg | Bin 0 -> 2316 bytes + test/mime-data.c | 6 +++--- + test/mime-data.pdf.ref.png | Bin 96 -> 4345 bytes + test/mime-data.ps.ref.png | Bin 368 -> 4345 bytes + test/mime-data.ref.png | Bin 263 -> 127 bytes + 5 files changed, 3 insertions(+), 3 deletions(-) + +commit c13a09ddb411287224c15728b14f23fef472f7d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 13:00:36 2008 +0000 + + [test] Use a different jpeg image for mime-data + + Detect when we successfully encode the JPEG data from the mime-type by + using a completely image. + + test/Makefile.am | 3 +++ + test/mime-data.c | 6 +++++- + test/mime-data.pdf.ref.png | Bin 0 -> 96 bytes + test/mime-data.ps.ref.png | Bin 0 -> 368 bytes + test/scarab.jpg | Bin 0 -> 9650 bytes + 5 files changed, 8 insertions(+), 1 deletion(-) + +commit 8407470409ad9cb93263a1c2da7dd7446d3f897e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 12:45:47 2008 +0000 + + [test] Adapt pdf-mime-data for non-srcdir build. + + Need to look for reference/input images from srcdir as well. + + test/Makefile.am | 2 +- + test/pdf-mime-data.c | 44 ++++++++++++++++++++++++++++++++------------ + 2 files changed, 33 insertions(+), 13 deletions(-) + +commit 8007618837c0292b6ebc6a4f954c5049d4e99d8a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 12:31:10 2008 +0000 + + [test] Fix compilation of imagediff. + + imagediff broke once again. + + test/Makefile.am | 3 ++- + test/imagediff.c | 17 +++++++++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +commit 282d7744275f623ce550638df953ef279d2209f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 12:53:15 2008 +0000 + + [mime-type] Request the mime-data for the source surface, not ourselves! + + Fixup a typo I introduced that caused us to request the jpeg data for the + destination surface and not the source. + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 5 ++--- + 2 files changed, 3 insertions(+), 4 deletions(-) + +commit aa616abc9ab02e333cf0cad4f524b15c710bf449 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 11:18:22 2008 +0000 + + [png] Use RGB for opaque images. + + If the ARGB32 is opaque, discard the alpha channel - so we should generate + byte identical output to the reference images. + + src/cairo-png.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 30976635d7072c06d00e39b106e41be7b08c6c49 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 4 22:52:45 2008 +1030 + + PS: Implement JPEG embedding + + src/cairo-ps-surface.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 101 insertions(+), 3 deletions(-) + +commit 73bc278c7a4630cd9299c974771ffd6e9245d0ac +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 4 22:25:26 2008 +1030 + + Add pdf mime data test + + To test that images in PDF files correctly embedded the mime data. + + test/Makefile.am | 2 + + test/pdf-mime-data.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 153 insertions(+) + +commit 3f18d38fbdc661d34e0fd951e0fd3aa1aa2cbcc9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 10:31:48 2008 +0000 + + [win32] Compile fix for extend-pad extents. + + Update the show_glyphs() prototype to include the extents argument. + + src/cairo-win32-printing-surface.c | 3 ++- + src/cairo-win32-private.h | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 5ba95b7e1287ade0b8a1acf2f5cb73fa1f44c451 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 09:22:28 2008 +0000 + + [trace] Convert [1 0 0 1 0 0] to identity + + Simplify the trace/replay by replacing the identity array with the + identity operator. + + util/cairo-trace/trace.c | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +commit 3664b32195b101ebab9a5f9087095306f8969c80 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 4 10:38:41 2008 +0000 + + [trace] Remove more @..@ from Makefile.am + + Use $(..) for make variable substitution as opposed to incorrectly using + @..@ for substitution by configure. + + util/cairo-trace/Makefile.am | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 1d8ad69abb88f6e0283b6ce2aadc5d801b8e3722 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 4 01:51:06 2008 -0500 + + [aclocal.dolt.m4] Fix build with bash versions <= 3.0 (bug #18363) + + build/aclocal.dolt.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 310026ab42c2078e2749c886c74c5b38cab41671 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 4 01:51:06 2008 -0500 + + [aclocal.dolt.m4] Fix build with bash versions <= 3.0 (bug #18363) + + build/aclocal.dolt.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 90217550120f129004bc555b59ced28b4b25a4d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 23:45:12 2008 +0000 + + [mime-data] Copy a reference to the mime-data on snapshotting. + + Instead of doing a full-copy of the mime data (which can be 10K-100K, + or even larger) just copy a reference to the original mime to the + snapshot surface (as suggested by Behdad). + + src/cairo-surface-fallback.c | 29 +++-------------- + src/cairo-surface.c | 77 +++++++++++++++++++++++++++++++------------- + src/cairo-types-private.h | 2 ++ + src/cairoint.h | 5 +++ + 4 files changed, 66 insertions(+), 47 deletions(-) + +commit 4f032ca35a7086b76775e4b53c6b99ba4e1eb3cb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 23:23:09 2008 +0000 + + [trace] Install cairo-trace.so into $(libdir)/cairo + + Install the auxiliary library into the cairo subdirectory within the + lib path, so that it doesn't clutter $(libdir) and sets a precedent for + future auxiliary libraries. + + util/cairo-trace/Makefile.am | 7 ++++--- + util/cairo-trace/cairo-trace.in | 13 ++++++++++--- + 2 files changed, 14 insertions(+), 6 deletions(-) + +commit c80a1c68c19f876c9f55b7c6d62b18ae110b11d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 23:16:09 2008 +0000 + + [configure] Make trace consistent. + + Remove the debianism from the comments for HAVE_BFD and comply with + Behdad's guidelines on using $(...) within Makefile.am. + + configure.ac | 5 ++--- + util/cairo-trace/Makefile.am | 6 +++--- + 2 files changed, 5 insertions(+), 6 deletions(-) + +commit 43e2370b024f66d995c514fd53414d3d8588a481 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 14:20:35 2008 +0000 + + [test] Update extend-pad. + + extend-pad was not a clear demonstration of the EXTEND_PAD mode, so revamp + it to show the filter extending a 4 pixel surface to cover the entire + output. However, this hides a discrepancy with the vector surfaces that we + cannot prevent the external renders from applying an interpolation to the + border pixels, so we copy the original test to extend-pad-border to check + the desired behaviour on boundary pixels. + + test/Makefile.am | 4 ++ + test/extend-pad-border.c | 95 ++++++++++++++++++++++++++++++++++++++++ + test/extend-pad-border.ref.png | Bin 0 -> 616 bytes + test/extend-pad-similar.c | 82 ++++++++++++++++++++++++++++++++++ + test/extend-pad-similar.ref.png | Bin 0 -> 315 bytes + test/extend-pad.c | 50 ++++++++------------- + test/extend-pad.ref.png | Bin 616 -> 315 bytes + 7 files changed, 200 insertions(+), 31 deletions(-) + +commit b3462c5616ae24fd391ad0872d2fbb98c6cd0c92 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 13:10:42 2008 +0000 + + [test] Convert a few residual '-out.*' + + Catch a few -out.* hiding in boilerplate. + + boilerplate/cairo-boilerplate-pdf.c | 2 +- + boilerplate/cairo-boilerplate-ps.c | 2 +- + boilerplate/cairo-boilerplate-svg.c | 2 +- + boilerplate/cairo-boilerplate-win32-printing.c | 2 +- + test/Makefile.am | 6 +++--- + 5 files changed, 7 insertions(+), 7 deletions(-) + +commit 34586860ef08e6aab988ba227997dfe376f9d319 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 12:11:14 2008 +0000 + + [trace] Big-endian compile fixes. + + A few typos. + + util/cairo-trace/trace.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ca83df55a63eab1821dbc009f65b3b09d61f5b62 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 11:46:31 2008 +0000 + + [trace] Wrap test surfaces. + + Wrap the test surfaces to avoid crashes whilst tracing the test suite. + + util/cairo-trace/trace.c | 116 +++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 108 insertions(+), 8 deletions(-) + +commit 2c08f3f83b1acd168cd74b300272970658179a0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 11:30:38 2008 +0000 + + [trace] Autodetect -lbfd during configure + + Stop being lazy and detect libbfd during configure. + + configure.ac | 10 ++++++++++ + util/cairo-trace/Makefile.am | 2 +- + util/cairo-trace/lookup-symbol.c | 6 +++--- + 3 files changed, 14 insertions(+), 4 deletions(-) + +commit 8fc3d0ffebea5622332327cdef9222486cc85581 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 11:01:22 2008 +0000 + + [mime-data] Allow embedding of arbitrary mime-types. + + Use the surface user-data array allow to store an arbitrary set of + alternate image representations keyed by an interned string (which + ensures that it has a unique key in the user-visible namespace). + + Update the API to mirror that of cairo_surface_set_user_data() [i.e. + return a status indicator] and switch internal users of the mime-data to + the public functions. + + src/cairo-debug.c | 2 + + src/cairo-jpeg-info-private.h | 6 +-- + src/cairo-jpeg-info.c | 19 ++++--- + src/cairo-misc.c | 98 ++++++++++++++++++++++++++++++++++++ + src/cairo-mutex-list-private.h | 1 + + src/cairo-pdf-surface.c | 16 +++--- + src/cairo-surface-fallback.c | 37 ++++++++++---- + src/cairo-surface-private.h | 4 -- + src/cairo-surface.c | 91 ++++++++++++++++++++++++++------- + src/cairo-types-private.h | 7 +++ + src/cairo.h | 4 +- + src/cairoint.h | 8 +++ + test/Makefile.am | 3 ++ + test/mime-data.c | 111 +++++++++++++++++++++++++++++++++++++++++ + test/mime-data.ref.png | Bin 0 -> 263 bytes + test/romedalen.jpg | Bin 0 -> 11400 bytes + util/cairo-trace/trace.c | 2 +- + 17 files changed, 351 insertions(+), 58 deletions(-) + +commit afef83a1fae028b45cefd6b4698e7b32ad4d6fc7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 3 09:40:35 2008 +0000 + + Compile tidy. + + Fix a few minor compiler warnings. + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-surface.c | 6 +++--- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit f77723fc88c12ebf6f5bff5a1797649d134ecc5d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 2 19:59:53 2008 +0000 + + [pdf] Missing status check. + + Check that stream was successfully opened before attempting to write to + it. + + src/cairo-pdf-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 04e3bb932eeac4f403b512087b96a164d082d52c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 2 21:51:37 2008 +0000 + + [trace] Emit set_mime_data(). + + Wrap the new cairo_surface_set_mime_data() function. + + util/cairo-trace/trace.c | 30 ++++++++++++++++++++++++++++-- + 1 file changed, 28 insertions(+), 2 deletions(-) + +commit 350fa7b98e5045a4fa05f64a1ad7d8167036be34 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 1 13:12:43 2008 +0000 + + [trace] Fix boundary terminations + + Don't increment the terminator! + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f3cbc5cf4580da83b7edacfd381afee3d571c659 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 23:47:16 2008 +0000 + + [trace] Use utf8 len in show_text_glyphs(). + + Honour the parameter specifying the length of the utf8 string when + emitting show_text_glyphs. + + util/cairo-trace/trace.c | 36 ++++++++++++++++++++---------------- + 1 file changed, 20 insertions(+), 16 deletions(-) + +commit 6434cddb899d750b815d71f8f51ae3e4568dd3c0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 2 11:42:33 2008 +1030 + + type1-subset: return unsupported on FT errors + + and let type1-fallback handle it. This fixes the bug reported by + Peter Weilbacher in + http://lists.cairographics.org/archives/cairo/2008-October/015569.html + + src/cairo-type1-subset.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 1685bbee1bf1ebc015ada94f77756d8d10c7818d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 2 19:50:59 2008 +1030 + + test/README: fix typo + + test/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 540ac11113015f0fd6856d016cb38fec5282b6ce +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 2 11:42:33 2008 +1030 + + type1-subset: return unsupported on FT errors + + and let type1-fallback handle it. This fixes the bug reported by + Peter Weilbacher in + http://lists.cairographics.org/archives/cairo/2008-October/015569.html + + src/cairo-type1-subset.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 3707178fa48e23b85c5640f3cee72e19f49c700b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 8 10:26:58 2008 +0930 + + PDF: Implement JPEG image embedding + + src/Makefile.sources | 2 + + src/cairo-jpeg-info-private.h | 54 ++++++++++++++++ + src/cairo-jpeg-info.c | 142 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 55 ++++++++++++++++ + 4 files changed, 253 insertions(+) + +commit 3c684347f49a581bfba35202ec61a5f6334acd4a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 7 20:46:20 2008 +0930 + + Add cairo_surface_set_mime_data() + + Currently only handles jpeg data. + + src/cairo-surface-fallback.c | 15 ++++++++++ + src/cairo-surface-private.h | 4 +++ + src/cairo-surface.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 15 ++++++++++ + 4 files changed, 101 insertions(+) + +commit a39a4f52ac4a057f579e881a9a929029bcc514d1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 21:02:26 2008 +0930 + + PS: meta-surface patterns with EXTEND_PAD are unsupported + + We have to use fallback images for this. + + src/cairo-ps-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 19ee13ca2b5b1e08a7fc965516be514d2fe40232 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 21:01:17 2008 +0930 + + PS: Implement EXTEND_PAD for image patterns + + Images with EXTEND_PAD are painted into a new image the size of the + operation extents. The new image is then embedded in the PS file with + the pattern matrix adjusted to ensure the image origin is in the + correct location. + + src/cairo-ps-surface-private.h | 1 + + src/cairo-ps-surface.c | 99 ++++++++++++++++++++++++++++++++++-------- + 2 files changed, 83 insertions(+), 17 deletions(-) + +commit e639b536711c07bc09355205f476ab3f73012268 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 21:00:30 2008 +0930 + + PDF: meta-surface patterns with EXTEND_PAD are unsupported + + We have to use fallback images for this. + + src/cairo-pdf-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 6c92edd9a3b0c79857cfa8dee482efa56f40c714 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 20:56:49 2008 +0930 + + PDF: Implement EXTEND_PAD for image patterns + + Images with EXTEND_PAD are painted into a new image the size of the + operation extents. The new image is then embedded in the PDF file with + the pattern matrix adjusted to ensure the image origin is in the + correct location. + + src/cairo-pdf-surface.c | 70 +++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 62 insertions(+), 8 deletions(-) + +commit d146cb4056ab54cf85454a6fe9d36282ca7a3f2e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 20:56:01 2008 +0930 + + PDF: Store the operation extents in each pattern + + The extents will be used by EXTEND_PAD patterns as well as any other + pattern that can benefit from knowing the extents of the operation it + will be used with. + + src/cairo-pdf-surface-private.h | 1 + + src/cairo-pdf-surface.c | 30 ++++++++++++++++++++++++------ + 2 files changed, 25 insertions(+), 6 deletions(-) + +commit fb7cfdd94d4e436e066d884f6dc294efd896b344 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 20:52:08 2008 +0930 + + Make meta-surface store and replay extents of each operation + + To be able to provide the extents of each operation to the backend + during the render phase the meta-surface needs to store the extents + computed by the analysis surface during the analysis phase. + + The extents argument is either a pointer to the extents of the operation + stored in the meta-surface or NULL. During analysis the analysis surface + writes the extents to the meta-surface. During the render phase the extents + is made available to paginated surface backends. + + src/cairo-analysis-surface.c | 12 ++++++++++++ + src/cairo-meta-surface-private.h | 1 + + src/cairo-meta-surface.c | 33 +++++++++++++++++++++++++++------ + 3 files changed, 40 insertions(+), 6 deletions(-) + +commit d682d275b90f7326df76d2764c513c8b6d5b551b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 1 20:50:53 2008 +0930 + + Add an extents argument to the high level surface backend functions + + Add a "cairo_rectangle_int_t *extents" argument to to the following + backend functions: + paint + mask, + stroke + fill + show_glyphs + show_text_glyphs + + This will be used to pass the extents of each operation computed by + the analysis surface to the backend. This is required for implementing + EXTEND_PAD. + + src/cairo-analysis-surface.c | 49 +++++++++++++++++++++++--------------- + src/cairo-directfb-surface.c | 3 ++- + src/cairo-gstate.c | 12 +++++----- + src/cairo-meta-surface.c | 27 ++++++++++++--------- + src/cairo-paginated-surface.c | 27 ++++++++++++--------- + src/cairo-pdf-surface.c | 18 +++++++++----- + src/cairo-ps-surface.c | 12 ++++++---- + src/cairo-quartz-surface.c | 15 ++++++++---- + src/cairo-surface.c | 45 +++++++++++++++++++--------------- + src/cairo-svg-surface.c | 24 ++++++++++++------- + src/cairo-type3-glyph-surface.c | 17 ++++++++----- + src/cairo-win32-printing-surface.c | 12 ++++++---- + src/cairo-win32-surface.c | 3 ++- + src/cairo-xlib-surface.c | 8 ++++--- + src/cairoint.h | 39 ++++++++++++++++++++---------- + src/test-meta-surface.c | 25 +++++++++++-------- + src/test-paginated-surface.c | 25 +++++++++++-------- + 17 files changed, 223 insertions(+), 138 deletions(-) + +commit ed2081d97401741db10b0244eaba7ff31ae63346 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 2 15:05:07 2008 +1030 + + Specify a background color for XFAIL text + + To improve readability on terminals with a white background. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 81c3009c077ddab40df052bffaa646526e2b8dfc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Oct 31 16:45:58 2008 -0400 + + [boilerplate/Makefile.win32] Only build source files, not headers + + boilerplate/Makefile.win32 | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit d5f88c28021907ad761a1bf1c311bfd206db617e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Oct 31 13:43:37 2008 -0400 + + [.gitignore] Add + + util/cairo-trace/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 49bd253fd36dc93219a5414c6e7a6daeaa9c63b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 16:40:49 2008 +0000 + + [tessellator] Refine the math comments. + + First of a simple substitution for -?-, as they are very confusing in + context with other minus signs floating around. + + Carl has promised to go over these docs with me at the HackFest in order + to improve them (and verify them). + + src/cairo-bentley-ottmann.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit ab8a0bfd82f8f474714d7aae4ceff4e7848c9b4b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 16:09:13 2008 +0000 + + Add a COPYING file to each aux. source directory + + Include a COPYING inside perf/, test/, util/ to clarify the licensing + conditions beneath the respective directories. This is because cairo + itself (libcairo.so) is LGPL-2.1/MPL-1.1 but that only relates to src/. + The auxiliary source files are under a mix of free licenses and we wish to + be clear just what license applies to each file. + + In particular, cairo-trace needs to include the GPL terms and conditions. + + COPYING | 17 +- + perf/COPYING | 5 + + perf/Makefile.am | 2 +- + test/COPYING | 5 + + test/Makefile.am | 2 +- + util/COPYING | 4 + + util/Makefile.am | 1 + + util/cairo-trace/COPYING | 5 + + util/cairo-trace/COPYING-GPL-3 | 674 +++++++++++++++++++++++++++++++++++++++++ + util/cairo-trace/Makefile.am | 5 +- + 10 files changed, 709 insertions(+), 11 deletions(-) + +commit c554f18d78fff71aff2d79309b19155de407363d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 15:37:58 2008 +0000 + + [util] Add cairo-trace. + + This tool can be used to trace all the cairo function calls made by an + applications. This is useful for either extracting a test case triggering + a bug from an application, or simply to get a general idea of how an + application is using cairo. + + After make install, cairo-trace program arguments, will print out all the + cairo calls to the terminal and also capture theme in ./program.$pid.trace + + The format of the output is CairoScript, watch this space for more + cairo-script tools! + + build/configure.ac.system | 2 + + configure.ac | 17 + + util/Makefile.am | 6 + + util/README | 8 - + util/cairo-trace/Makefile.am | 21 + + util/cairo-trace/cairo-trace.in | 58 + + util/cairo-trace/lookup-symbol.c | 290 ++++ + util/cairo-trace/lookup-symbol.h | 24 + + util/cairo-trace/trace.c | 3345 ++++++++++++++++++++++++++++++++++++++ + 9 files changed, 3763 insertions(+), 8 deletions(-) + +commit 992f74d884c9ea83f7b51c6959dd93718027b99a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 13:50:55 2008 +0000 + + [test] Use '.' as the field separator in the names + + We frequently use '-' within the test name or format name and so we + encounter confusion as '-' is also used as the field separator. At times + this has caused a new test to break an old test because the new test would + match one of the old test's target specific reference images. So switch + everything over to use '.' between fields (test name, target, format, + subtest, etc.). + + test/.gitignore | 8 +- + test/Makefile.am | 1402 ++++++++++---------- + test/a1-image-sample-ref.png | Bin 148 -> 0 bytes + test/a1-image-sample.ref.png | Bin 0 -> 148 bytes + test/a1-mask-ref.png | Bin 131 -> 0 bytes + test/a1-mask.ref.png | Bin 0 -> 131 bytes + test/a1-traps-sample-ref.png | Bin 148 -> 0 bytes + test/a1-traps-sample.ref.png | Bin 0 -> 148 bytes + test/a8-mask-ref.png | Bin 128 -> 0 bytes + test/a8-mask.ref.png | Bin 0 -> 128 bytes + test/alpha-similar-ref.png | Bin 99 -> 0 bytes + test/alpha-similar-rgb24-ref.png | Bin 99 -> 0 bytes + test/alpha-similar.ref.png | Bin 0 -> 99 bytes + test/alpha-similar.rgb24.ref.png | Bin 0 -> 99 bytes + test/big-line-ps2-ref.png | Bin 1148 -> 0 bytes + test/big-line-ps2-rgb24-ref.png | Bin 830 -> 0 bytes + test/big-line-ps3-ref.png | Bin 1148 -> 0 bytes + test/big-line-ps3-rgb24-ref.png | Bin 830 -> 0 bytes + test/big-line-quartz-ref.png | Bin 1075 -> 0 bytes + test/big-line-quartz-rgb24-ref.png | Bin 941 -> 0 bytes + test/big-line-ref.png | Bin 1486 -> 0 bytes + test/big-line-rgb24-ref.png | Bin 1308 -> 0 bytes + test/big-line.ps2.ref.png | Bin 0 -> 1148 bytes + test/big-line.ps2.rgb24.ref.png | Bin 0 -> 830 bytes + test/big-line.ps3.ref.png | Bin 0 -> 1148 bytes + test/big-line.ps3.rgb24.ref.png | Bin 0 -> 830 bytes + test/big-line.quartz.ref.png | Bin 0 -> 1075 bytes + test/big-line.quartz.rgb24.ref.png | Bin 0 -> 941 bytes + test/big-line.ref.png | Bin 0 -> 1486 bytes + test/big-line.rgb24.ref.png | Bin 0 -> 1308 bytes + test/bilevel-image-ref.png | Bin 131 -> 0 bytes + test/bilevel-image.ref.png | Bin 0 -> 131 bytes + test/bitmap-font-ref.png | Bin 950 -> 0 bytes + test/bitmap-font-rgb24-ref.png | Bin 890 -> 0 bytes + test/bitmap-font.ref.png | Bin 0 -> 950 bytes + test/bitmap-font.rgb24.ref.png | Bin 0 -> 890 bytes + test/cairo-test.c | 68 +- + test/cairo-test.h | 1 + + test/caps-joins-alpha-quartz-ref.png | Bin 2466 -> 0 bytes + test/caps-joins-alpha-ref.png | Bin 2463 -> 0 bytes + test/caps-joins-alpha-svg11-ref.png | Bin 2454 -> 0 bytes + test/caps-joins-alpha-svg12-ref.png | Bin 2454 -> 0 bytes + test/caps-joins-alpha.quartz.ref.png | Bin 0 -> 2466 bytes + test/caps-joins-alpha.ref.png | Bin 0 -> 2463 bytes + test/caps-joins-alpha.svg11.ref.png | Bin 0 -> 2454 bytes + test/caps-joins-alpha.svg12.ref.png | Bin 0 -> 2454 bytes + test/caps-joins-ps2-ref.png | Bin 1459 -> 0 bytes + test/caps-joins-ps3-ref.png | Bin 1459 -> 0 bytes + test/caps-joins-ref.png | Bin 1488 -> 0 bytes + test/caps-joins.ps2.ref.png | Bin 0 -> 1459 bytes + test/caps-joins.ps3.ref.png | Bin 0 -> 1459 bytes + test/caps-joins.ref.png | Bin 0 -> 1488 bytes + test/caps-sub-paths-ref.png | Bin 197 -> 0 bytes + test/caps-sub-paths.ref.png | Bin 0 -> 197 bytes + test/clip-all-ref.png | Bin 118 -> 0 bytes + test/clip-all.ref.png | Bin 0 -> 118 bytes + test/clip-empty-ref.png | Bin 118 -> 0 bytes + test/clip-empty.ref.png | Bin 0 -> 118 bytes + test/clip-fill-rule-pixel-aligned-ref.png | Bin 195 -> 0 bytes + test/clip-fill-rule-pixel-aligned-rgb24-ref.png | Bin 184 -> 0 bytes + test/clip-fill-rule-pixel-aligned.ref.png | Bin 0 -> 195 bytes + test/clip-fill-rule-pixel-aligned.rgb24.ref.png | Bin 0 -> 184 bytes + test/clip-fill-rule-ps2-argb32-ref.png | Bin 310 -> 0 bytes + test/clip-fill-rule-ps2-rgb24-ref.png | Bin 302 -> 0 bytes + test/clip-fill-rule-ps3-argb32-ref.png | Bin 310 -> 0 bytes + test/clip-fill-rule-ps3-rgb24-ref.png | Bin 302 -> 0 bytes + test/clip-fill-rule-ref.png | Bin 431 -> 0 bytes + test/clip-fill-rule-rgb24-ref.png | Bin 380 -> 0 bytes + test/clip-fill-rule.ps2.argb32.ref.png | Bin 0 -> 310 bytes + test/clip-fill-rule.ps2.rgb24.ref.png | Bin 0 -> 302 bytes + test/clip-fill-rule.ps3.argb32.ref.png | Bin 0 -> 310 bytes + test/clip-fill-rule.ps3.rgb24.ref.png | Bin 0 -> 302 bytes + test/clip-fill-rule.ref.png | Bin 0 -> 431 bytes + test/clip-fill-rule.rgb24.ref.png | Bin 0 -> 380 bytes + test/clip-nesting-ps2-argb32-ref.png | Bin 651 -> 0 bytes + test/clip-nesting-ps2-rgb24-ref.png | Bin 636 -> 0 bytes + test/clip-nesting-ps3-argb32-ref.png | Bin 651 -> 0 bytes + test/clip-nesting-ps3-rgb24-ref.png | Bin 636 -> 0 bytes + test/clip-nesting-quartz-ref.png | Bin 1067 -> 0 bytes + test/clip-nesting-quartz-rgb24-ref.png | Bin 956 -> 0 bytes + test/clip-nesting-ref.png | Bin 1050 -> 0 bytes + test/clip-nesting-rgb24-ref.png | Bin 955 -> 0 bytes + test/clip-nesting.ps2.argb32.ref.png | Bin 0 -> 651 bytes + test/clip-nesting.ps2.rgb24.ref.png | Bin 0 -> 636 bytes + test/clip-nesting.ps3.argb32.ref.png | Bin 0 -> 651 bytes + test/clip-nesting.ps3.rgb24.ref.png | Bin 0 -> 636 bytes + test/clip-nesting.quartz.ref.png | Bin 0 -> 1067 bytes + test/clip-nesting.quartz.rgb24.ref.png | Bin 0 -> 956 bytes + test/clip-nesting.ref.png | Bin 0 -> 1050 bytes + test/clip-nesting.rgb24.ref.png | Bin 0 -> 955 bytes + test/clip-operator-pdf-argb32-ref.png | Bin 12125 -> 0 bytes + test/clip-operator-pdf-rgb24-ref.png | Bin 7367 -> 0 bytes + test/clip-operator-ps2-rgb24-ref.png | Bin 3624 -> 0 bytes + test/clip-operator-ps3-ref.png | Bin 8188 -> 0 bytes + test/clip-operator-ps3-rgb24-ref.png | Bin 3624 -> 0 bytes + test/clip-operator-quartz-ref.png | Bin 9539 -> 0 bytes + test/clip-operator-quartz-rgb24-ref.png | Bin 4412 -> 0 bytes + test/clip-operator-ref.png | Bin 8271 -> 0 bytes + test/clip-operator-rgb24-ref.png | Bin 3258 -> 0 bytes + test/clip-operator.pdf.argb32.ref.png | Bin 0 -> 12125 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 0 -> 7367 bytes + test/clip-operator.ps2.rgb24.ref.png | Bin 0 -> 3624 bytes + test/clip-operator.ps3.ref.png | Bin 0 -> 8188 bytes + test/clip-operator.ps3.rgb24.ref.png | Bin 0 -> 3624 bytes + test/clip-operator.quartz.ref.png | Bin 0 -> 9539 bytes + test/clip-operator.quartz.rgb24.ref.png | Bin 0 -> 4412 bytes + test/clip-operator.ref.png | Bin 0 -> 8271 bytes + test/clip-operator.rgb24.ref.png | Bin 0 -> 3258 bytes + test/clip-push-group-ps2-argb32-ref.png | Bin 179 -> 0 bytes + test/clip-push-group-ps2-rgb24-ref.png | Bin 179 -> 0 bytes + test/clip-push-group-ps3-argb32-ref.png | Bin 179 -> 0 bytes + test/clip-push-group-ps3-rgb24-ref.png | Bin 179 -> 0 bytes + test/clip-push-group-quartz-ref.png | Bin 203 -> 0 bytes + test/clip-push-group-ref.png | Bin 199 -> 0 bytes + test/clip-push-group.ps2.argb32.ref.png | Bin 0 -> 179 bytes + test/clip-push-group.ps2.rgb24.ref.png | Bin 0 -> 179 bytes + test/clip-push-group.ps3.argb32.ref.png | Bin 0 -> 179 bytes + test/clip-push-group.ps3.rgb24.ref.png | Bin 0 -> 179 bytes + test/clip-push-group.quartz.ref.png | Bin 0 -> 203 bytes + test/clip-push-group.ref.png | Bin 0 -> 199 bytes + test/clip-twice-ps2-argb32-ref.png | Bin 575 -> 0 bytes + test/clip-twice-ps2-rgb24-ref.png | Bin 541 -> 0 bytes + test/clip-twice-ps3-argb32-ref.png | Bin 575 -> 0 bytes + test/clip-twice-ps3-rgb24-ref.png | Bin 541 -> 0 bytes + test/clip-twice-quartz-ref.png | Bin 1171 -> 0 bytes + test/clip-twice-quartz-rgb24-ref.png | Bin 1111 -> 0 bytes + test/clip-twice-ref.png | Bin 1362 -> 0 bytes + test/clip-twice-rgb24-ref.png | Bin 1198 -> 0 bytes + test/clip-twice.ps2.argb32.ref.png | Bin 0 -> 575 bytes + test/clip-twice.ps2.rgb24.ref.png | Bin 0 -> 541 bytes + test/clip-twice.ps3.argb32.ref.png | Bin 0 -> 575 bytes + test/clip-twice.ps3.rgb24.ref.png | Bin 0 -> 541 bytes + test/clip-twice.quartz.ref.png | Bin 0 -> 1171 bytes + test/clip-twice.quartz.rgb24.ref.png | Bin 0 -> 1111 bytes + test/clip-twice.ref.png | Bin 0 -> 1362 bytes + test/clip-twice.rgb24.ref.png | Bin 0 -> 1198 bytes + test/clipped-group-ps2-ref.png | Bin 343 -> 0 bytes + test/clipped-group-ps3-ref.png | Bin 343 -> 0 bytes + test/clipped-group-ref.png | Bin 350 -> 0 bytes + test/clipped-group.ps2.ref.png | Bin 0 -> 343 bytes + test/clipped-group.ps3.ref.png | Bin 0 -> 343 bytes + test/clipped-group.ref.png | Bin 0 -> 350 bytes + test/clipped-surface-ref.png | Bin 401 -> 0 bytes + test/clipped-surface.ref.png | Bin 0 -> 401 bytes + test/close-path-ps2-ref.png | Bin 309 -> 0 bytes + test/close-path-ps3-ref.png | Bin 309 -> 0 bytes + test/close-path-ref.png | Bin 312 -> 0 bytes + test/close-path.ps2.ref.png | Bin 0 -> 309 bytes + test/close-path.ps3.ref.png | Bin 0 -> 309 bytes + test/close-path.ref.png | Bin 0 -> 312 bytes + test/composite-integer-translate-over-ps2-ref.png | Bin 15783 -> 0 bytes + test/composite-integer-translate-over-ps3-ref.png | Bin 15783 -> 0 bytes + test/composite-integer-translate-over-ref.png | Bin 16385 -> 0 bytes + ...osite-integer-translate-over-repeat-ps2-ref.png | Bin 448 -> 0 bytes + ...osite-integer-translate-over-repeat-ps3-ref.png | Bin 448 -> 0 bytes + ...composite-integer-translate-over-repeat-ref.png | Bin 401 -> 0 bytes + ...osite-integer-translate-over-repeat.ps2.ref.png | Bin 0 -> 448 bytes + ...osite-integer-translate-over-repeat.ps3.ref.png | Bin 0 -> 448 bytes + ...composite-integer-translate-over-repeat.ref.png | Bin 0 -> 401 bytes + test/composite-integer-translate-over.ps2.ref.png | Bin 0 -> 15783 bytes + test/composite-integer-translate-over.ps3.ref.png | Bin 0 -> 15783 bytes + test/composite-integer-translate-over.ref.png | Bin 0 -> 16385 bytes + .../composite-integer-translate-source-ps2-ref.png | Bin 15783 -> 0 bytes + .../composite-integer-translate-source-ps3-ref.png | Bin 15783 -> 0 bytes + test/composite-integer-translate-source-ref.png | Bin 16385 -> 0 bytes + .../composite-integer-translate-source.ps2.ref.png | Bin 0 -> 15783 bytes + .../composite-integer-translate-source.ps3.ref.png | Bin 0 -> 15783 bytes + test/composite-integer-translate-source.ref.png | Bin 0 -> 16385 bytes + test/copy-path-ps2-ref.png | Bin 474 -> 0 bytes + test/copy-path-ps3-ref.png | Bin 474 -> 0 bytes + test/copy-path-ref.png | Bin 579 -> 0 bytes + test/copy-path.ps2.ref.png | Bin 0 -> 474 bytes + test/copy-path.ps3.ref.png | Bin 0 -> 474 bytes + test/copy-path.ref.png | Bin 0 -> 579 bytes + test/create-for-stream.c | 2 +- + test/create-from-png-alpha-ref.png | Bin 150 -> 0 bytes + test/create-from-png-gray-alpha-ref.png | Bin 142 -> 0 bytes + test/create-from-png-gray-ref.png | Bin 124 -> 0 bytes + test/create-from-png-indexed-alpha-ref.png | Bin 172 -> 0 bytes + test/create-from-png-indexed-ref.png | Bin 159 -> 0 bytes + test/create-from-png-ref.png | Bin 131 -> 0 bytes + test/create-from-png-stream-ref.png | Bin 100 -> 0 bytes + test/create-from-png-stream.c | 2 +- + test/create-from-png-stream.ref.png | Bin 0 -> 100 bytes + test/create-from-png.alpha.ref.png | Bin 0 -> 150 bytes + test/create-from-png.c | 16 +- + test/create-from-png.gray-alpha.ref.png | Bin 0 -> 142 bytes + test/create-from-png.gray.ref.png | Bin 0 -> 124 bytes + test/create-from-png.indexed-alpha.ref.png | Bin 0 -> 172 bytes + test/create-from-png.indexed.ref.png | Bin 0 -> 159 bytes + test/create-from-png.ref.png | Bin 0 -> 131 bytes + test/dash-caps-joins-ps2-argb32-ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins-ps2-rgb24-ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins-ps3-argb32-ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins-ps3-rgb24-ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins-quartz-ref.png | Bin 4727 -> 0 bytes + test/dash-caps-joins-ref.png | Bin 4718 -> 0 bytes + test/dash-caps-joins.ps2.argb32.ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins.ps2.rgb24.ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins.ps3.argb32.ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins.ps3.rgb24.ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins.quartz.ref.png | Bin 0 -> 4727 bytes + test/dash-caps-joins.ref.png | Bin 0 -> 4718 bytes + test/dash-curve-ps2-ref.png | Bin 27293 -> 0 bytes + test/dash-curve-ps3-ref.png | Bin 27293 -> 0 bytes + test/dash-curve-quartz-ref.png | Bin 47965 -> 0 bytes + test/dash-curve-ref.png | Bin 39642 -> 0 bytes + test/dash-curve.ps2.ref.png | Bin 0 -> 27293 bytes + test/dash-curve.ps3.ref.png | Bin 0 -> 27293 bytes + test/dash-curve.quartz.ref.png | Bin 0 -> 47965 bytes + test/dash-curve.ref.png | Bin 0 -> 39642 bytes + test/dash-no-dash-ref.png | Bin 152 -> 0 bytes + test/dash-no-dash.ref.png | Bin 0 -> 152 bytes + test/dash-offset-negative-ref.png | Bin 171 -> 0 bytes + test/dash-offset-negative.ref.png | Bin 0 -> 171 bytes + test/dash-scale-ps2-argb32-ref.png | Bin 6318 -> 0 bytes + test/dash-scale-ps2-rgb24-ref.png | Bin 6316 -> 0 bytes + test/dash-scale-ps3-argb32-ref.png | Bin 6318 -> 0 bytes + test/dash-scale-ps3-rgb24-ref.png | Bin 6316 -> 0 bytes + test/dash-scale-quartz-ref.png | Bin 8079 -> 0 bytes + test/dash-scale-ref.png | Bin 8058 -> 0 bytes + test/dash-scale.ps2.argb32.ref.png | Bin 0 -> 6318 bytes + test/dash-scale.ps2.rgb24.ref.png | Bin 0 -> 6316 bytes + test/dash-scale.ps3.argb32.ref.png | Bin 0 -> 6318 bytes + test/dash-scale.ps3.rgb24.ref.png | Bin 0 -> 6316 bytes + test/dash-scale.quartz.ref.png | Bin 0 -> 8079 bytes + test/dash-scale.ref.png | Bin 0 -> 8058 bytes + test/dash-state-ps2-ref.png | Bin 10219 -> 0 bytes + test/dash-state-ps3-ref.png | Bin 10219 -> 0 bytes + test/dash-state-quartz-ref.png | Bin 8698 -> 0 bytes + test/dash-state-ref.png | Bin 9389 -> 0 bytes + test/dash-state.ps2.ref.png | Bin 0 -> 10219 bytes + test/dash-state.ps3.ref.png | Bin 0 -> 10219 bytes + test/dash-state.quartz.ref.png | Bin 0 -> 8698 bytes + test/dash-state.ref.png | Bin 0 -> 9389 bytes + test/dash-zero-length-ps2-ref.png | Bin 319 -> 0 bytes + test/dash-zero-length-ps2-rgb24-ref.png | Bin 304 -> 0 bytes + test/dash-zero-length-ps3-ref.png | Bin 319 -> 0 bytes + test/dash-zero-length-ps3-rgb24-ref.png | Bin 304 -> 0 bytes + test/dash-zero-length-ref.png | Bin 238 -> 0 bytes + test/dash-zero-length-rgb24-ref.png | Bin 218 -> 0 bytes + test/dash-zero-length.ps2.ref.png | Bin 0 -> 319 bytes + test/dash-zero-length.ps2.rgb24.ref.png | Bin 0 -> 304 bytes + test/dash-zero-length.ps3.ref.png | Bin 0 -> 319 bytes + test/dash-zero-length.ps3.rgb24.ref.png | Bin 0 -> 304 bytes + test/dash-zero-length.ref.png | Bin 0 -> 238 bytes + test/dash-zero-length.rgb24.ref.png | Bin 0 -> 218 bytes + test/degenerate-arc-ps2-ref.png | Bin 585 -> 0 bytes + test/degenerate-arc-ps3-ref.png | Bin 585 -> 0 bytes + test/degenerate-arc-ref.png | Bin 616 -> 0 bytes + test/degenerate-arc.ps2.ref.png | Bin 0 -> 585 bytes + test/degenerate-arc.ps3.ref.png | Bin 0 -> 585 bytes + test/degenerate-arc.ref.png | Bin 0 -> 616 bytes + test/degenerate-dash-ref.png | Bin 2005 -> 0 bytes + test/degenerate-dash.ref.png | Bin 0 -> 2005 bytes + test/degenerate-path-ps2-argb32-ref.png | Bin 390 -> 0 bytes + test/degenerate-path-ps2-rgb24-ref.png | Bin 358 -> 0 bytes + test/degenerate-path-ps3-argb32-ref.png | Bin 390 -> 0 bytes + test/degenerate-path-ps3-rgb24-ref.png | Bin 358 -> 0 bytes + test/degenerate-path-quartz-ref.png | Bin 232 -> 0 bytes + test/degenerate-path-quartz-rgb24-ref.png | Bin 198 -> 0 bytes + test/degenerate-path-ref.png | Bin 257 -> 0 bytes + test/degenerate-path-rgb24-ref.png | Bin 224 -> 0 bytes + test/degenerate-path.ps2.argb32.ref.png | Bin 0 -> 390 bytes + test/degenerate-path.ps2.rgb24.ref.png | Bin 0 -> 358 bytes + test/degenerate-path.ps3.argb32.ref.png | Bin 0 -> 390 bytes + test/degenerate-path.ps3.rgb24.ref.png | Bin 0 -> 358 bytes + test/degenerate-path.quartz.ref.png | Bin 0 -> 232 bytes + test/degenerate-path.quartz.rgb24.ref.png | Bin 0 -> 198 bytes + test/degenerate-path.ref.png | Bin 0 -> 257 bytes + test/degenerate-path.rgb24.ref.png | Bin 0 -> 224 bytes + test/degenerate-pen-ps2-ref.png | Bin 865 -> 0 bytes + test/degenerate-pen-ps3-ref.png | Bin 865 -> 0 bytes + test/degenerate-pen-quartz-ref.png | Bin 1144 -> 0 bytes + test/degenerate-pen-ref.png | Bin 1139 -> 0 bytes + test/degenerate-pen.ps2.ref.png | Bin 0 -> 865 bytes + test/degenerate-pen.ps3.ref.png | Bin 0 -> 865 bytes + test/degenerate-pen.quartz.ref.png | Bin 0 -> 1144 bytes + test/degenerate-pen.ref.png | Bin 0 -> 1139 bytes + test/device-offset-fractional-pdf-ref.png | Bin 277 -> 0 bytes + test/device-offset-fractional-ps2-ref.png | Bin 200 -> 0 bytes + test/device-offset-fractional-ps3-ref.png | Bin 200 -> 0 bytes + test/device-offset-fractional-ref.png | Bin 269 -> 0 bytes + test/device-offset-fractional.pdf.ref.png | Bin 0 -> 277 bytes + test/device-offset-fractional.ps2.ref.png | Bin 0 -> 200 bytes + test/device-offset-fractional.ps3.ref.png | Bin 0 -> 200 bytes + test/device-offset-fractional.ref.png | Bin 0 -> 269 bytes + test/device-offset-positive-ref.png | Bin 139 -> 0 bytes + test/device-offset-positive-rgb24-ref.png | Bin 130 -> 0 bytes + test/device-offset-positive.ref.png | Bin 0 -> 139 bytes + test/device-offset-positive.rgb24.ref.png | Bin 0 -> 130 bytes + test/device-offset-ref.png | Bin 137 -> 0 bytes + test/device-offset-rgb24-ref.png | Bin 130 -> 0 bytes + test/device-offset-scale-ref.png | Bin 145 -> 0 bytes + test/device-offset-scale.ref.png | Bin 0 -> 145 bytes + test/device-offset.ref.png | Bin 0 -> 137 bytes + test/device-offset.rgb24.ref.png | Bin 0 -> 130 bytes + test/extend-pad-ref.png | Bin 616 -> 0 bytes + test/extend-pad.ref.png | Bin 0 -> 616 bytes + test/extend-reflect-ps2-ref.png | Bin 146990 -> 0 bytes + test/extend-reflect-ps3-ref.png | Bin 146990 -> 0 bytes + test/extend-reflect-ref.png | Bin 153571 -> 0 bytes + test/extend-reflect-similar-ps2-ref.png | Bin 146990 -> 0 bytes + test/extend-reflect-similar-ps3-ref.png | Bin 146990 -> 0 bytes + test/extend-reflect-similar-ref.png | Bin 153571 -> 0 bytes + test/extend-reflect-similar.ps2.ref.png | Bin 0 -> 146990 bytes + test/extend-reflect-similar.ps3.ref.png | Bin 0 -> 146990 bytes + test/extend-reflect-similar.ref.png | Bin 0 -> 153571 bytes + test/extend-reflect.ps2.ref.png | Bin 0 -> 146990 bytes + test/extend-reflect.ps3.ref.png | Bin 0 -> 146990 bytes + test/extend-reflect.ref.png | Bin 0 -> 153571 bytes + test/extend-repeat-ps2-ref.png | Bin 119246 -> 0 bytes + test/extend-repeat-ps3-ref.png | Bin 119246 -> 0 bytes + test/extend-repeat-ref.png | Bin 108622 -> 0 bytes + test/extend-repeat-similar-ps2-ref.png | Bin 119246 -> 0 bytes + test/extend-repeat-similar-ps3-ref.png | Bin 119246 -> 0 bytes + test/extend-repeat-similar-ref.png | Bin 108622 -> 0 bytes + test/extend-repeat-similar.ps2.ref.png | Bin 0 -> 119246 bytes + test/extend-repeat-similar.ps3.ref.png | Bin 0 -> 119246 bytes + test/extend-repeat-similar.ref.png | Bin 0 -> 108622 bytes + test/extend-repeat.ps2.ref.png | Bin 0 -> 119246 bytes + test/extend-repeat.ps3.ref.png | Bin 0 -> 119246 bytes + test/extend-repeat.ref.png | Bin 0 -> 108622 bytes + test/fallback-resolution-ppi150x150-ref.png | Bin 8043 -> 0 bytes + test/fallback-resolution-ppi150x300-ref.png | Bin 6848 -> 0 bytes + test/fallback-resolution-ppi150x37.5-ref.png | Bin 13176 -> 0 bytes + test/fallback-resolution-ppi150x600-ref.png | Bin 6338 -> 0 bytes + test/fallback-resolution-ppi150x72-ref.png | Bin 8370 -> 0 bytes + test/fallback-resolution-ppi150x75-ref.png | Bin 10445 -> 0 bytes + test/fallback-resolution-ppi300x150-ref.png | Bin 6851 -> 0 bytes + test/fallback-resolution-ppi300x300-ref.png | Bin 5637 -> 0 bytes + test/fallback-resolution-ppi300x37.5-ref.png | Bin 12870 -> 0 bytes + test/fallback-resolution-ppi300x600-ref.png | Bin 4848 -> 0 bytes + test/fallback-resolution-ppi300x72-ref.png | Bin 7053 -> 0 bytes + test/fallback-resolution-ppi300x75-ref.png | Bin 9617 -> 0 bytes + test/fallback-resolution-ppi37.5x150-ref.png | Bin 12728 -> 0 bytes + test/fallback-resolution-ppi37.5x300-ref.png | Bin 11981 -> 0 bytes + test/fallback-resolution-ppi37.5x37.5-ref.png | Bin 14098 -> 0 bytes + test/fallback-resolution-ppi37.5x600-ref.png | Bin 11654 -> 0 bytes + test/fallback-resolution-ppi37.5x72-ref.png | Bin 12990 -> 0 bytes + test/fallback-resolution-ppi37.5x75-ref.png | Bin 13787 -> 0 bytes + test/fallback-resolution-ppi600x150-ref.png | Bin 6096 -> 0 bytes + test/fallback-resolution-ppi600x300-ref.png | Bin 4812 -> 0 bytes + test/fallback-resolution-ppi600x37.5-ref.png | Bin 12401 -> 0 bytes + test/fallback-resolution-ppi600x600-ref.png | Bin 4104 -> 0 bytes + test/fallback-resolution-ppi600x72-ref.png | Bin 6398 -> 0 bytes + test/fallback-resolution-ppi600x75-ref.png | Bin 8974 -> 0 bytes + test/fallback-resolution-ppi72x150-ref.png | Bin 8069 -> 0 bytes + test/fallback-resolution-ppi72x300-ref.png | Bin 6803 -> 0 bytes + test/fallback-resolution-ppi72x37.5-ref.png | Bin 13147 -> 0 bytes + test/fallback-resolution-ppi72x600-ref.png | Bin 6245 -> 0 bytes + test/fallback-resolution-ppi72x72-ref.png | Bin 8409 -> 0 bytes + test/fallback-resolution-ppi72x75-ref.png | Bin 10628 -> 0 bytes + test/fallback-resolution-ppi75x150-ref.png | Bin 9940 -> 0 bytes + test/fallback-resolution-ppi75x300-ref.png | Bin 9003 -> 0 bytes + test/fallback-resolution-ppi75x37.5-ref.png | Bin 14020 -> 0 bytes + test/fallback-resolution-ppi75x600-ref.png | Bin 8455 -> 0 bytes + test/fallback-resolution-ppi75x72-ref.png | Bin 10202 -> 0 bytes + test/fallback-resolution-ppi75x75-ref.png | Bin 12101 -> 0 bytes + test/fallback-resolution.c | 11 +- + test/fallback-resolution.ppi150x150.ref.png | Bin 0 -> 8043 bytes + test/fallback-resolution.ppi150x300.ref.png | Bin 0 -> 6848 bytes + test/fallback-resolution.ppi150x37.5.ref.png | Bin 0 -> 13176 bytes + test/fallback-resolution.ppi150x600.ref.png | Bin 0 -> 6338 bytes + test/fallback-resolution.ppi150x72.ref.png | Bin 0 -> 8370 bytes + test/fallback-resolution.ppi150x75.ref.png | Bin 0 -> 10445 bytes + test/fallback-resolution.ppi300x150.ref.png | Bin 0 -> 6851 bytes + test/fallback-resolution.ppi300x300.ref.png | Bin 0 -> 5637 bytes + test/fallback-resolution.ppi300x37.5.ref.png | Bin 0 -> 12870 bytes + test/fallback-resolution.ppi300x600.ref.png | Bin 0 -> 4848 bytes + test/fallback-resolution.ppi300x72.ref.png | Bin 0 -> 7053 bytes + test/fallback-resolution.ppi300x75.ref.png | Bin 0 -> 9617 bytes + test/fallback-resolution.ppi37.5x150.ref.png | Bin 0 -> 12728 bytes + test/fallback-resolution.ppi37.5x300.ref.png | Bin 0 -> 11981 bytes + test/fallback-resolution.ppi37.5x37.5.ref.png | Bin 0 -> 14098 bytes + test/fallback-resolution.ppi37.5x600.ref.png | Bin 0 -> 11654 bytes + test/fallback-resolution.ppi37.5x72.ref.png | Bin 0 -> 12990 bytes + test/fallback-resolution.ppi37.5x75.ref.png | Bin 0 -> 13787 bytes + test/fallback-resolution.ppi600x150.ref.png | Bin 0 -> 6096 bytes + test/fallback-resolution.ppi600x300.ref.png | Bin 0 -> 4812 bytes + test/fallback-resolution.ppi600x37.5.ref.png | Bin 0 -> 12401 bytes + test/fallback-resolution.ppi600x600.ref.png | Bin 0 -> 4104 bytes + test/fallback-resolution.ppi600x72.ref.png | Bin 0 -> 6398 bytes + test/fallback-resolution.ppi600x75.ref.png | Bin 0 -> 8974 bytes + test/fallback-resolution.ppi72x150.ref.png | Bin 0 -> 8069 bytes + test/fallback-resolution.ppi72x300.ref.png | Bin 0 -> 6803 bytes + test/fallback-resolution.ppi72x37.5.ref.png | Bin 0 -> 13147 bytes + test/fallback-resolution.ppi72x600.ref.png | Bin 0 -> 6245 bytes + test/fallback-resolution.ppi72x72.ref.png | Bin 0 -> 8409 bytes + test/fallback-resolution.ppi72x75.ref.png | Bin 0 -> 10628 bytes + test/fallback-resolution.ppi75x150.ref.png | Bin 0 -> 9940 bytes + test/fallback-resolution.ppi75x300.ref.png | Bin 0 -> 9003 bytes + test/fallback-resolution.ppi75x37.5.ref.png | Bin 0 -> 14020 bytes + test/fallback-resolution.ppi75x600.ref.png | Bin 0 -> 8455 bytes + test/fallback-resolution.ppi75x72.ref.png | Bin 0 -> 10202 bytes + test/fallback-resolution.ppi75x75.ref.png | Bin 0 -> 12101 bytes + test/fill-alpha-pattern-pdf-argb32-ref.png | Bin 3887 -> 0 bytes + test/fill-alpha-pattern-pdf-rgb24-ref.png | Bin 3840 -> 0 bytes + test/fill-alpha-pattern-ps3-ref.png | Bin 4380 -> 0 bytes + test/fill-alpha-pattern-ref.png | Bin 3653 -> 0 bytes + test/fill-alpha-pattern.pdf.argb32.ref.png | Bin 0 -> 3887 bytes + test/fill-alpha-pattern.pdf.rgb24.ref.png | Bin 0 -> 3840 bytes + test/fill-alpha-pattern.ps3.ref.png | Bin 0 -> 4380 bytes + test/fill-alpha-pattern.ref.png | Bin 0 -> 3653 bytes + test/fill-alpha-ref.png | Bin 2989 -> 0 bytes + test/fill-alpha.ref.png | Bin 0 -> 2989 bytes + test/fill-and-stroke-alpha-add-quartz-ref.png | Bin 603 -> 0 bytes + test/fill-and-stroke-alpha-add-ref.png | Bin 591 -> 0 bytes + test/fill-and-stroke-alpha-add.quartz.ref.png | Bin 0 -> 603 bytes + test/fill-and-stroke-alpha-add.ref.png | Bin 0 -> 591 bytes + test/fill-and-stroke-alpha-quartz-ref.png | Bin 550 -> 0 bytes + test/fill-and-stroke-alpha-ref.png | Bin 519 -> 0 bytes + test/fill-and-stroke-alpha.quartz.ref.png | Bin 0 -> 550 bytes + test/fill-and-stroke-alpha.ref.png | Bin 0 -> 519 bytes + test/fill-and-stroke-ps2-argb32-ref.png | Bin 310 -> 0 bytes + test/fill-and-stroke-ps2-rgb24-ref.png | Bin 319 -> 0 bytes + test/fill-and-stroke-ps3-argb32-ref.png | Bin 310 -> 0 bytes + test/fill-and-stroke-ps3-rgb24-ref.png | Bin 319 -> 0 bytes + test/fill-and-stroke-quartz-ref.png | Bin 286 -> 0 bytes + test/fill-and-stroke-quartz-rgb24-ref.png | Bin 264 -> 0 bytes + test/fill-and-stroke-ref.png | Bin 279 -> 0 bytes + test/fill-and-stroke-rgb24-ref.png | Bin 257 -> 0 bytes + test/fill-and-stroke.ps2.argb32.ref.png | Bin 0 -> 310 bytes + test/fill-and-stroke.ps2.rgb24.ref.png | Bin 0 -> 319 bytes + test/fill-and-stroke.ps3.argb32.ref.png | Bin 0 -> 310 bytes + test/fill-and-stroke.ps3.rgb24.ref.png | Bin 0 -> 319 bytes + test/fill-and-stroke.quartz.ref.png | Bin 0 -> 286 bytes + test/fill-and-stroke.quartz.rgb24.ref.png | Bin 0 -> 264 bytes + test/fill-and-stroke.ref.png | Bin 0 -> 279 bytes + test/fill-and-stroke.rgb24.ref.png | Bin 0 -> 257 bytes + test/fill-degenerate-sort-order-quartz-ref.png | Bin 2470 -> 0 bytes + ...fill-degenerate-sort-order-quartz-rgb24-ref.png | Bin 2098 -> 0 bytes + test/fill-degenerate-sort-order-ref.png | Bin 2397 -> 0 bytes + test/fill-degenerate-sort-order-rgb24-ref.png | Bin 2060 -> 0 bytes + test/fill-degenerate-sort-order.quartz.ref.png | Bin 0 -> 2470 bytes + ...fill-degenerate-sort-order.quartz.rgb24.ref.png | Bin 0 -> 2098 bytes + test/fill-degenerate-sort-order.ref.png | Bin 0 -> 2397 bytes + test/fill-degenerate-sort-order.rgb24.ref.png | Bin 0 -> 2060 bytes + test/fill-missed-stop-ps2-argb32-ref.png | Bin 564 -> 0 bytes + test/fill-missed-stop-ps2-rgb24-ref.png | Bin 531 -> 0 bytes + test/fill-missed-stop-ps3-argb32-ref.png | Bin 564 -> 0 bytes + test/fill-missed-stop-ps3-rgb24-ref.png | Bin 531 -> 0 bytes + test/fill-missed-stop-ref.png | Bin 466 -> 0 bytes + test/fill-missed-stop-rgb24-ref.png | Bin 394 -> 0 bytes + test/fill-missed-stop.ps2.argb32.ref.png | Bin 0 -> 564 bytes + test/fill-missed-stop.ps2.rgb24.ref.png | Bin 0 -> 531 bytes + test/fill-missed-stop.ps3.argb32.ref.png | Bin 0 -> 564 bytes + test/fill-missed-stop.ps3.rgb24.ref.png | Bin 0 -> 531 bytes + test/fill-missed-stop.ref.png | Bin 0 -> 466 bytes + test/fill-missed-stop.rgb24.ref.png | Bin 0 -> 394 bytes + test/fill-rule-ps2-argb32-ref.png | Bin 2253 -> 0 bytes + test/fill-rule-ps2-rgb24-ref.png | Bin 2031 -> 0 bytes + test/fill-rule-ps3-argb32-ref.png | Bin 2253 -> 0 bytes + test/fill-rule-ps3-rgb24-ref.png | Bin 2031 -> 0 bytes + test/fill-rule-quartz-ref.png | Bin 2079 -> 0 bytes + test/fill-rule-quartz-rgb24-ref.png | Bin 1790 -> 0 bytes + test/fill-rule-ref.png | Bin 1979 -> 0 bytes + test/fill-rule-rgb24-ref.png | Bin 1722 -> 0 bytes + test/fill-rule.ps2.argb32.ref.png | Bin 0 -> 2253 bytes + test/fill-rule.ps2.rgb24.ref.png | Bin 0 -> 2031 bytes + test/fill-rule.ps3.argb32.ref.png | Bin 0 -> 2253 bytes + test/fill-rule.ps3.rgb24.ref.png | Bin 0 -> 2031 bytes + test/fill-rule.quartz.ref.png | Bin 0 -> 2079 bytes + test/fill-rule.quartz.rgb24.ref.png | Bin 0 -> 1790 bytes + test/fill-rule.ref.png | Bin 0 -> 1979 bytes + test/fill-rule.rgb24.ref.png | Bin 0 -> 1722 bytes + test/filter-bilinear-extents-pdf-ref.png | Bin 798 -> 0 bytes + test/filter-bilinear-extents-ps2-ref.png | Bin 556 -> 0 bytes + test/filter-bilinear-extents-ps3-ref.png | Bin 556 -> 0 bytes + test/filter-bilinear-extents-ref.png | Bin 1340 -> 0 bytes + test/filter-bilinear-extents.pdf.ref.png | Bin 0 -> 798 bytes + test/filter-bilinear-extents.ps2.ref.png | Bin 0 -> 556 bytes + test/filter-bilinear-extents.ps3.ref.png | Bin 0 -> 556 bytes + test/filter-bilinear-extents.ref.png | Bin 0 -> 1340 bytes + test/filter-nearest-offset-pdf-ref.png | Bin 4537 -> 0 bytes + test/filter-nearest-offset-ps2-ref.png | Bin 255 -> 0 bytes + test/filter-nearest-offset-ps3-ref.png | Bin 255 -> 0 bytes + test/filter-nearest-offset-ref.png | Bin 248 -> 0 bytes + test/filter-nearest-offset-svg11-ref.png | Bin 4739 -> 0 bytes + test/filter-nearest-offset-svg12-ref.png | Bin 4739 -> 0 bytes + test/filter-nearest-offset.pdf.ref.png | Bin 0 -> 4537 bytes + test/filter-nearest-offset.ps2.ref.png | Bin 0 -> 255 bytes + test/filter-nearest-offset.ps3.ref.png | Bin 0 -> 255 bytes + test/filter-nearest-offset.ref.png | Bin 0 -> 248 bytes + test/filter-nearest-offset.svg11.ref.png | Bin 0 -> 4739 bytes + test/filter-nearest-offset.svg12.ref.png | Bin 0 -> 4739 bytes + test/filter-nearest-transformed-pdf-ref.png | Bin 548 -> 0 bytes + test/filter-nearest-transformed-ref.png | Bin 570 -> 0 bytes + test/filter-nearest-transformed-svg11-ref.png | Bin 559 -> 0 bytes + test/filter-nearest-transformed-svg12-ref.png | Bin 559 -> 0 bytes + test/filter-nearest-transformed.pdf.ref.png | Bin 0 -> 548 bytes + test/filter-nearest-transformed.ref.png | Bin 0 -> 570 bytes + test/filter-nearest-transformed.svg11.ref.png | Bin 0 -> 559 bytes + test/filter-nearest-transformed.svg12.ref.png | Bin 0 -> 559 bytes + test/finer-grained-fallbacks-ps2-ref.png | Bin 1356 -> 0 bytes + test/finer-grained-fallbacks-ps2-rgb24-ref.png | Bin 1096 -> 0 bytes + test/finer-grained-fallbacks-ps3-ref.png | Bin 1356 -> 0 bytes + test/finer-grained-fallbacks-ps3-rgb24-ref.png | Bin 1096 -> 0 bytes + test/finer-grained-fallbacks-ref.png | Bin 1111 -> 0 bytes + test/finer-grained-fallbacks-rgb24-ref.png | Bin 1114 -> 0 bytes + test/finer-grained-fallbacks.ps2.ref.png | Bin 0 -> 1356 bytes + test/finer-grained-fallbacks.ps2.rgb24.ref.png | Bin 0 -> 1096 bytes + test/finer-grained-fallbacks.ps3.ref.png | Bin 0 -> 1356 bytes + test/finer-grained-fallbacks.ps3.rgb24.ref.png | Bin 0 -> 1096 bytes + test/finer-grained-fallbacks.ref.png | Bin 0 -> 1111 bytes + test/finer-grained-fallbacks.rgb24.ref.png | Bin 0 -> 1114 bytes + test/font-matrix-translation-ps2-argb32-ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation-ps2-rgb24-ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation-ps3-argb32-ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation-ps3-rgb24-ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation-quartz-ref.png | Bin 1090 -> 0 bytes + test/font-matrix-translation-ref.png | Bin 1006 -> 0 bytes + test/font-matrix-translation-svg11-ref.png | Bin 970 -> 0 bytes + test/font-matrix-translation-svg12-ref.png | Bin 970 -> 0 bytes + test/font-matrix-translation.ps2.argb32.ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation.ps2.rgb24.ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation.ps3.argb32.ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation.ps3.rgb24.ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation.quartz.ref.png | Bin 0 -> 1090 bytes + test/font-matrix-translation.ref.png | Bin 0 -> 1006 bytes + test/font-matrix-translation.svg11.ref.png | Bin 0 -> 970 bytes + test/font-matrix-translation.svg12.ref.png | Bin 0 -> 970 bytes + test/ft-show-glyphs-positioning-pdf-ref.png | Bin 3133 -> 0 bytes + test/ft-show-glyphs-positioning-ps2-ref.png | Bin 2269 -> 0 bytes + test/ft-show-glyphs-positioning-ps3-ref.png | Bin 2269 -> 0 bytes + test/ft-show-glyphs-positioning-ref.png | Bin 3444 -> 0 bytes + test/ft-show-glyphs-positioning-svg11-ref.png | Bin 6590 -> 0 bytes + test/ft-show-glyphs-positioning-svg12-ref.png | Bin 6590 -> 0 bytes + test/ft-show-glyphs-positioning.pdf.ref.png | Bin 0 -> 3133 bytes + test/ft-show-glyphs-positioning.ps2.ref.png | Bin 0 -> 2269 bytes + test/ft-show-glyphs-positioning.ps3.ref.png | Bin 0 -> 2269 bytes + test/ft-show-glyphs-positioning.ref.png | Bin 0 -> 3444 bytes + test/ft-show-glyphs-positioning.svg11.ref.png | Bin 0 -> 6590 bytes + test/ft-show-glyphs-positioning.svg12.ref.png | Bin 0 -> 6590 bytes + test/ft-show-glyphs-table-ps2-ref.png | Bin 5687 -> 0 bytes + test/ft-show-glyphs-table-ps3-ref.png | Bin 5687 -> 0 bytes + test/ft-show-glyphs-table-ref.png | Bin 11439 -> 0 bytes + test/ft-show-glyphs-table.ps2.ref.png | Bin 0 -> 5687 bytes + test/ft-show-glyphs-table.ps3.ref.png | Bin 0 -> 5687 bytes + test/ft-show-glyphs-table.ref.png | Bin 0 -> 11439 bytes + test/ft-text-antialias-none-ps2-argb32-ref.png | Bin 335 -> 0 bytes + test/ft-text-antialias-none-ps3-argb32-ref.png | Bin 335 -> 0 bytes + test/ft-text-antialias-none-ref.png | Bin 336 -> 0 bytes + test/ft-text-antialias-none.ps2.argb32.ref.png | Bin 0 -> 335 bytes + test/ft-text-antialias-none.ps3.argb32.ref.png | Bin 0 -> 335 bytes + test/ft-text-antialias-none.ref.png | Bin 0 -> 336 bytes + test/ft-text-vertical-layout-type1-pdf-ref.png | Bin 3968 -> 0 bytes + test/ft-text-vertical-layout-type1-ps2-ref.png | Bin 1846 -> 0 bytes + test/ft-text-vertical-layout-type1-ps3-ref.png | Bin 1846 -> 0 bytes + test/ft-text-vertical-layout-type1-ref.png | Bin 3980 -> 0 bytes + test/ft-text-vertical-layout-type1-svg11-ref.png | Bin 3973 -> 0 bytes + test/ft-text-vertical-layout-type1-svg12-ref.png | Bin 3973 -> 0 bytes + test/ft-text-vertical-layout-type1.pdf.ref.png | Bin 0 -> 3968 bytes + test/ft-text-vertical-layout-type1.ps2.ref.png | Bin 0 -> 1846 bytes + test/ft-text-vertical-layout-type1.ps3.ref.png | Bin 0 -> 1846 bytes + test/ft-text-vertical-layout-type1.ref.png | Bin 0 -> 3980 bytes + test/ft-text-vertical-layout-type1.svg11.ref.png | Bin 0 -> 3973 bytes + test/ft-text-vertical-layout-type1.svg12.ref.png | Bin 0 -> 3973 bytes + test/ft-text-vertical-layout-type3-pdf-ref.png | Bin 3634 -> 0 bytes + test/ft-text-vertical-layout-type3-ps2-ref.png | Bin 1804 -> 0 bytes + test/ft-text-vertical-layout-type3-ps3-ref.png | Bin 1804 -> 0 bytes + test/ft-text-vertical-layout-type3-ref.png | Bin 3934 -> 0 bytes + test/ft-text-vertical-layout-type3-svg11-ref.png | Bin 3957 -> 0 bytes + test/ft-text-vertical-layout-type3-svg12-ref.png | Bin 3957 -> 0 bytes + test/ft-text-vertical-layout-type3.pdf.ref.png | Bin 0 -> 3634 bytes + test/ft-text-vertical-layout-type3.ps2.ref.png | Bin 0 -> 1804 bytes + test/ft-text-vertical-layout-type3.ps3.ref.png | Bin 0 -> 1804 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 0 -> 3934 bytes + test/ft-text-vertical-layout-type3.svg11.ref.png | Bin 0 -> 3957 bytes + test/ft-text-vertical-layout-type3.svg12.ref.png | Bin 0 -> 3957 bytes + test/get-group-target-ref.png | Bin 134 -> 0 bytes + test/get-group-target.ref.png | Bin 0 -> 134 bytes + test/glitz-surface-source-ref.png | Bin 268 -> 0 bytes + test/glitz-surface-source.ref.png | Bin 0 -> 268 bytes + test/glyph-cache-pressure-ps2-ref.png | Bin 1454 -> 0 bytes + test/glyph-cache-pressure-ps3-ref.png | Bin 1454 -> 0 bytes + test/glyph-cache-pressure-quartz-ref.png | Bin 3654 -> 0 bytes + test/glyph-cache-pressure-ref.png | Bin 3223 -> 0 bytes + test/glyph-cache-pressure.ps2.ref.png | Bin 0 -> 1454 bytes + test/glyph-cache-pressure.ps3.ref.png | Bin 0 -> 1454 bytes + test/glyph-cache-pressure.quartz.ref.png | Bin 0 -> 3654 bytes + test/glyph-cache-pressure.ref.png | Bin 0 -> 3223 bytes + test/gradient-alpha-pdf-argb32-ref.png | Bin 126 -> 0 bytes + test/gradient-alpha-pdf-rgb24-ref.png | Bin 121 -> 0 bytes + test/gradient-alpha-ps2-argb32-ref.png | Bin 134 -> 0 bytes + test/gradient-alpha-ps2-rgb24-ref.png | Bin 130 -> 0 bytes + test/gradient-alpha-ps3-argb32-ref.png | Bin 134 -> 0 bytes + test/gradient-alpha-ps3-rgb24-ref.png | Bin 130 -> 0 bytes + test/gradient-alpha-ref.png | Bin 147 -> 0 bytes + test/gradient-alpha-rgb24-ref.png | Bin 142 -> 0 bytes + test/gradient-alpha.pdf.argb32.ref.png | Bin 0 -> 126 bytes + test/gradient-alpha.pdf.rgb24.ref.png | Bin 0 -> 121 bytes + test/gradient-alpha.ps2.argb32.ref.png | Bin 0 -> 134 bytes + test/gradient-alpha.ps2.rgb24.ref.png | Bin 0 -> 130 bytes + test/gradient-alpha.ps3.argb32.ref.png | Bin 0 -> 134 bytes + test/gradient-alpha.ps3.rgb24.ref.png | Bin 0 -> 130 bytes + test/gradient-alpha.ref.png | Bin 0 -> 147 bytes + test/gradient-alpha.rgb24.ref.png | Bin 0 -> 142 bytes + test/gradient-constant-alpha-pdf-argb32-ref.png | Bin 116 -> 0 bytes + test/gradient-constant-alpha-pdf-rgb24-ref.png | Bin 115 -> 0 bytes + test/gradient-constant-alpha-ps3-ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha-ps3-rgb24-ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha-ref.png | Bin 117 -> 0 bytes + test/gradient-constant-alpha-rgb24-ref.png | Bin 116 -> 0 bytes + test/gradient-constant-alpha.pdf.argb32.ref.png | Bin 0 -> 116 bytes + test/gradient-constant-alpha.pdf.rgb24.ref.png | Bin 0 -> 115 bytes + test/gradient-constant-alpha.ps3.ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha.ps3.rgb24.ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha.ref.png | Bin 0 -> 117 bytes + test/gradient-constant-alpha.rgb24.ref.png | Bin 0 -> 116 bytes + test/gradient-zero-stops-ref.png | Bin 105 -> 0 bytes + test/gradient-zero-stops-rgb24-ref.png | Bin 105 -> 0 bytes + test/gradient-zero-stops.ref.png | Bin 0 -> 105 bytes + test/gradient-zero-stops.rgb24.ref.png | Bin 0 -> 105 bytes + test/group-paint-ref.png | Bin 118 -> 0 bytes + test/group-paint.ref.png | Bin 0 -> 118 bytes + test/huge-pattern-pdf-ref.png | Bin 2716 -> 0 bytes + test/huge-pattern-pdf-rgb24-ref.png | Bin 2817 -> 0 bytes + test/huge-pattern-ps3-ref.png | Bin 1786 -> 0 bytes + test/huge-pattern-ref.png | Bin 1619 -> 0 bytes + test/huge-pattern.pdf.ref.png | Bin 0 -> 2716 bytes + test/huge-pattern.pdf.rgb24.ref.png | Bin 0 -> 2817 bytes + test/huge-pattern.ps3.ref.png | Bin 0 -> 1786 bytes + test/huge-pattern.ref.png | Bin 0 -> 1619 bytes + test/image-surface-source-ps2-ref.png | Bin 376 -> 0 bytes + test/image-surface-source-ps3-ref.png | Bin 376 -> 0 bytes + test/image-surface-source-ref.png | Bin 332 -> 0 bytes + test/image-surface-source.ps2.ref.png | Bin 0 -> 376 bytes + test/image-surface-source.ps3.ref.png | Bin 0 -> 376 bytes + test/image-surface-source.ref.png | Bin 0 -> 332 bytes + test/infinite-join-ps2-ref.png | Bin 218 -> 0 bytes + test/infinite-join-ps3-ref.png | Bin 218 -> 0 bytes + test/infinite-join-ref.png | Bin 194 -> 0 bytes + test/infinite-join.ps2.ref.png | Bin 0 -> 218 bytes + test/infinite-join.ps3.ref.png | Bin 0 -> 218 bytes + test/infinite-join.ref.png | Bin 0 -> 194 bytes + test/large-clip-ref.png | Bin 350 -> 0 bytes + test/large-clip.ref.png | Bin 0 -> 350 bytes + test/large-font-ref.png | Bin 6936 -> 0 bytes + test/large-font.ref.png | Bin 0 -> 6936 bytes + test/large-source-ref.png | Bin 137 -> 0 bytes + test/large-source.ref.png | Bin 0 -> 137 bytes + test/leaky-dash-ps2-argb32-ref.png | Bin 286 -> 0 bytes + test/leaky-dash-ps2-rgb24-ref.png | Bin 284 -> 0 bytes + test/leaky-dash-ps3-argb32-ref.png | Bin 286 -> 0 bytes + test/leaky-dash-ps3-rgb24-ref.png | Bin 284 -> 0 bytes + test/leaky-dash-quartz-ref.png | Bin 241 -> 0 bytes + test/leaky-dash-ref.png | Bin 243 -> 0 bytes + test/leaky-dash.ps2.argb32.ref.png | Bin 0 -> 286 bytes + test/leaky-dash.ps2.rgb24.ref.png | Bin 0 -> 284 bytes + test/leaky-dash.ps3.argb32.ref.png | Bin 0 -> 286 bytes + test/leaky-dash.ps3.rgb24.ref.png | Bin 0 -> 284 bytes + test/leaky-dash.quartz.ref.png | Bin 0 -> 241 bytes + test/leaky-dash.ref.png | Bin 0 -> 243 bytes + test/leaky-dashed-rectangle-ps2-ref.png | Bin 444 -> 0 bytes + test/leaky-dashed-rectangle-ps3-ref.png | Bin 444 -> 0 bytes + test/leaky-dashed-rectangle-ref.png | Bin 366 -> 0 bytes + test/leaky-dashed-rectangle.ps2.ref.png | Bin 0 -> 444 bytes + test/leaky-dashed-rectangle.ps3.ref.png | Bin 0 -> 444 bytes + test/leaky-dashed-rectangle.ref.png | Bin 0 -> 366 bytes + test/leaky-dashed-stroke-ps2-ref.png | Bin 5511 -> 0 bytes + test/leaky-dashed-stroke-ps3-ref.png | Bin 5511 -> 0 bytes + test/leaky-dashed-stroke-ref.png | Bin 9214 -> 0 bytes + test/leaky-dashed-stroke.ps2.ref.png | Bin 0 -> 5511 bytes + test/leaky-dashed-stroke.ps3.ref.png | Bin 0 -> 5511 bytes + test/leaky-dashed-stroke.ref.png | Bin 0 -> 9214 bytes + test/leaky-polygon-ps2-ref.png | Bin 354 -> 0 bytes + test/leaky-polygon-ps3-ref.png | Bin 354 -> 0 bytes + test/leaky-polygon-ref.png | Bin 368 -> 0 bytes + test/leaky-polygon.ps2.ref.png | Bin 0 -> 354 bytes + test/leaky-polygon.ps3.ref.png | Bin 0 -> 354 bytes + test/leaky-polygon.ref.png | Bin 0 -> 368 bytes + test/line-width-ref.png | Bin 201 -> 0 bytes + test/line-width-scale-ps2-ref.png | Bin 3911 -> 0 bytes + test/line-width-scale-ps3-ref.png | Bin 3911 -> 0 bytes + test/line-width-scale-quartz-ref.png | Bin 6434 -> 0 bytes + test/line-width-scale-ref.png | Bin 6445 -> 0 bytes + test/line-width-scale.ps2.ref.png | Bin 0 -> 3911 bytes + test/line-width-scale.ps3.ref.png | Bin 0 -> 3911 bytes + test/line-width-scale.quartz.ref.png | Bin 0 -> 6434 bytes + test/line-width-scale.ref.png | Bin 0 -> 6445 bytes + test/line-width.ref.png | Bin 0 -> 201 bytes + test/linear-gradient-pdf-ref.png | Bin 935 -> 0 bytes + test/linear-gradient-ps3-ref.png | Bin 779 -> 0 bytes + test/linear-gradient-quartz-ref.png | Bin 1164 -> 0 bytes + test/linear-gradient-ref.png | Bin 1021 -> 0 bytes + test/linear-gradient-reflect-pdf-argb32-ref.png | Bin 248 -> 0 bytes + test/linear-gradient-reflect-pdf-rgb24-ref.png | Bin 248 -> 0 bytes + test/linear-gradient-reflect-ps3-ref.png | Bin 314 -> 0 bytes + test/linear-gradient-reflect-quartz-ref.png | Bin 878 -> 0 bytes + test/linear-gradient-reflect-ref.png | Bin 216 -> 0 bytes + test/linear-gradient-reflect.pdf.argb32.ref.png | Bin 0 -> 248 bytes + test/linear-gradient-reflect.pdf.rgb24.ref.png | Bin 0 -> 248 bytes + test/linear-gradient-reflect.ps3.ref.png | Bin 0 -> 314 bytes + test/linear-gradient-reflect.quartz.ref.png | Bin 0 -> 878 bytes + test/linear-gradient-reflect.ref.png | Bin 0 -> 216 bytes + test/linear-gradient-svg11-ref.png | Bin 1000 -> 0 bytes + test/linear-gradient-svg12-ref.png | Bin 1000 -> 0 bytes + test/linear-gradient.pdf.ref.png | Bin 0 -> 935 bytes + test/linear-gradient.ps3.ref.png | Bin 0 -> 779 bytes + test/linear-gradient.quartz.ref.png | Bin 0 -> 1164 bytes + test/linear-gradient.ref.png | Bin 0 -> 1021 bytes + test/linear-gradient.svg11.ref.png | Bin 0 -> 1000 bytes + test/linear-gradient.svg12.ref.png | Bin 0 -> 1000 bytes + test/long-dashed-lines-ps2-ref.png | Bin 1516 -> 0 bytes + test/long-dashed-lines-ps3-ref.png | Bin 1516 -> 0 bytes + test/long-dashed-lines-quartz-ref.png | Bin 2313 -> 0 bytes + test/long-dashed-lines-ref.png | Bin 2116 -> 0 bytes + test/long-dashed-lines.ps2.ref.png | Bin 0 -> 1516 bytes + test/long-dashed-lines.ps3.ref.png | Bin 0 -> 1516 bytes + test/long-dashed-lines.quartz.ref.png | Bin 0 -> 2313 bytes + test/long-dashed-lines.ref.png | Bin 0 -> 2116 bytes + test/long-lines-ref.png | Bin 247 -> 0 bytes + test/long-lines.ref.png | Bin 0 -> 247 bytes + test/mask-alpha-quartz-argb32-ref.png | Bin 641 -> 0 bytes + test/mask-alpha-ref.png | Bin 640 -> 0 bytes + test/mask-alpha-rgb24-ref.png | Bin 599 -> 0 bytes + test/mask-alpha-svg11-argb32-ref.png | Bin 615 -> 0 bytes + test/mask-alpha-svg12-argb32-ref.png | Bin 615 -> 0 bytes + test/mask-alpha.quartz.argb32.ref.png | Bin 0 -> 641 bytes + test/mask-alpha.ref.png | Bin 0 -> 640 bytes + test/mask-alpha.rgb24.ref.png | Bin 0 -> 599 bytes + test/mask-alpha.svg11.argb32.ref.png | Bin 0 -> 615 bytes + test/mask-alpha.svg12.argb32.ref.png | Bin 0 -> 615 bytes + test/mask-ctm-ref.png | Bin 129 -> 0 bytes + test/mask-ctm-rgb24-ref.png | Bin 124 -> 0 bytes + test/mask-ctm-svg11-argb32-ref.png | Bin 108 -> 0 bytes + test/mask-ctm-svg12-argb32-ref.png | Bin 108 -> 0 bytes + test/mask-ctm.ref.png | Bin 0 -> 129 bytes + test/mask-ctm.rgb24.ref.png | Bin 0 -> 124 bytes + test/mask-ctm.svg11.argb32.ref.png | Bin 0 -> 108 bytes + test/mask-ctm.svg12.argb32.ref.png | Bin 0 -> 108 bytes + test/mask-pdf-argb32-ref.png | Bin 8881 -> 0 bytes + test/mask-pdf-rgb24-ref.png | Bin 8267 -> 0 bytes + test/mask-quartz-ref.png | Bin 10682 -> 0 bytes + test/mask-quartz-rgb24-ref.png | Bin 8418 -> 0 bytes + test/mask-ref.png | Bin 8476 -> 0 bytes + test/mask-rgb24-ref.png | Bin 7041 -> 0 bytes + test/mask-surface-ctm-ref.png | Bin 129 -> 0 bytes + test/mask-surface-ctm-rgb24-ref.png | Bin 124 -> 0 bytes + test/mask-surface-ctm-svg11-argb32-ref.png | Bin 108 -> 0 bytes + test/mask-surface-ctm-svg12-argb32-ref.png | Bin 108 -> 0 bytes + test/mask-surface-ctm.ref.png | Bin 0 -> 129 bytes + test/mask-surface-ctm.rgb24.ref.png | Bin 0 -> 124 bytes + test/mask-surface-ctm.svg11.argb32.ref.png | Bin 0 -> 108 bytes + test/mask-surface-ctm.svg12.argb32.ref.png | Bin 0 -> 108 bytes + test/mask-svg11-argb32-ref.png | Bin 8527 -> 0 bytes + test/mask-svg11-rgb24-ref.png | Bin 7935 -> 0 bytes + test/mask-svg12-argb32-ref.png | Bin 8527 -> 0 bytes + test/mask-svg12-rgb24-ref.png | Bin 7935 -> 0 bytes + test/mask-transformed-image-ref.png | Bin 4516 -> 0 bytes + test/mask-transformed-image.ref.png | Bin 0 -> 4516 bytes + test/mask-transformed-similar-pdf-ref.png | Bin 4213 -> 0 bytes + test/mask-transformed-similar-ref.png | Bin 4516 -> 0 bytes + test/mask-transformed-similar-svg11-ref.png | Bin 4051 -> 0 bytes + test/mask-transformed-similar-svg12-ref.png | Bin 4051 -> 0 bytes + test/mask-transformed-similar.pdf.ref.png | Bin 0 -> 4213 bytes + test/mask-transformed-similar.ref.png | Bin 0 -> 4516 bytes + test/mask-transformed-similar.svg11.ref.png | Bin 0 -> 4051 bytes + test/mask-transformed-similar.svg12.ref.png | Bin 0 -> 4051 bytes + test/mask.pdf.argb32.ref.png | Bin 0 -> 8881 bytes + test/mask.pdf.rgb24.ref.png | Bin 0 -> 8267 bytes + test/mask.quartz.ref.png | Bin 0 -> 10682 bytes + test/mask.quartz.rgb24.ref.png | Bin 0 -> 8418 bytes + test/mask.ref.png | Bin 0 -> 8476 bytes + test/mask.rgb24.ref.png | Bin 0 -> 7041 bytes + test/mask.svg11.argb32.ref.png | Bin 0 -> 8527 bytes + test/mask.svg11.rgb24.ref.png | Bin 0 -> 7935 bytes + test/mask.svg12.argb32.ref.png | Bin 0 -> 8527 bytes + test/mask.svg12.rgb24.ref.png | Bin 0 -> 7935 bytes + test/meta-surface-pattern-pdf-ref.png | Bin 4111 -> 0 bytes + test/meta-surface-pattern-pdf-rgb24-ref.png | Bin 4009 -> 0 bytes + test/meta-surface-pattern-ps2-argb32-ref.png | Bin 3257 -> 0 bytes + test/meta-surface-pattern-ps2-rgb24-ref.png | Bin 3873 -> 0 bytes + test/meta-surface-pattern-ps3-argb32-ref.png | Bin 3257 -> 0 bytes + test/meta-surface-pattern-ps3-rgb24-ref.png | Bin 3873 -> 0 bytes + test/meta-surface-pattern-quartz-ref.png | Bin 4572 -> 0 bytes + test/meta-surface-pattern-quartz-rgb24-ref.png | Bin 4063 -> 0 bytes + test/meta-surface-pattern-ref.png | Bin 3072 -> 0 bytes + test/meta-surface-pattern-rgb24-ref.png | Bin 3162 -> 0 bytes + test/meta-surface-pattern-svg11-argb32-ref.png | Bin 3924 -> 0 bytes + test/meta-surface-pattern-svg11-rgb24-ref.png | Bin 4593 -> 0 bytes + test/meta-surface-pattern-svg12-argb32-ref.png | Bin 3924 -> 0 bytes + test/meta-surface-pattern-svg12-rgb24-ref.png | Bin 4593 -> 0 bytes + test/meta-surface-pattern.pdf.ref.png | Bin 0 -> 4111 bytes + test/meta-surface-pattern.pdf.rgb24.ref.png | Bin 0 -> 4009 bytes + test/meta-surface-pattern.ps2.argb32.ref.png | Bin 0 -> 3257 bytes + test/meta-surface-pattern.ps2.rgb24.ref.png | Bin 0 -> 3873 bytes + test/meta-surface-pattern.ps3.argb32.ref.png | Bin 0 -> 3257 bytes + test/meta-surface-pattern.ps3.rgb24.ref.png | Bin 0 -> 3873 bytes + test/meta-surface-pattern.quartz.ref.png | Bin 0 -> 4572 bytes + test/meta-surface-pattern.quartz.rgb24.ref.png | Bin 0 -> 4063 bytes + test/meta-surface-pattern.ref.png | Bin 0 -> 3072 bytes + test/meta-surface-pattern.rgb24.ref.png | Bin 0 -> 3162 bytes + test/meta-surface-pattern.svg11.argb32.ref.png | Bin 0 -> 3924 bytes + test/meta-surface-pattern.svg11.rgb24.ref.png | Bin 0 -> 4593 bytes + test/meta-surface-pattern.svg12.argb32.ref.png | Bin 0 -> 3924 bytes + test/meta-surface-pattern.svg12.rgb24.ref.png | Bin 0 -> 4593 bytes + test/miter-precision-ps2-ref.png | Bin 865 -> 0 bytes + test/miter-precision-ps3-ref.png | Bin 865 -> 0 bytes + test/miter-precision-ref.png | Bin 931 -> 0 bytes + test/miter-precision.ps2.ref.png | Bin 0 -> 865 bytes + test/miter-precision.ps3.ref.png | Bin 0 -> 865 bytes + test/miter-precision.ref.png | Bin 0 -> 931 bytes + test/move-to-show-surface-ref.png | Bin 100 -> 0 bytes + test/move-to-show-surface.ref.png | Bin 0 -> 100 bytes + test/multi-page.c | 4 +- + test/new-sub-path-ps2-argb32-ref.png | Bin 556 -> 0 bytes + test/new-sub-path-ps2-rgb24-ref.png | Bin 423 -> 0 bytes + test/new-sub-path-ps3-argb32-ref.png | Bin 556 -> 0 bytes + test/new-sub-path-ps3-rgb24-ref.png | Bin 423 -> 0 bytes + test/new-sub-path-quartz-ref.png | Bin 383 -> 0 bytes + test/new-sub-path-quartz-rgb24-ref.png | Bin 357 -> 0 bytes + test/new-sub-path-ref.png | Bin 386 -> 0 bytes + test/new-sub-path-rgb24-ref.png | Bin 355 -> 0 bytes + test/new-sub-path.ps2.argb32.ref.png | Bin 0 -> 556 bytes + test/new-sub-path.ps2.rgb24.ref.png | Bin 0 -> 423 bytes + test/new-sub-path.ps3.argb32.ref.png | Bin 0 -> 556 bytes + test/new-sub-path.ps3.rgb24.ref.png | Bin 0 -> 423 bytes + test/new-sub-path.quartz.ref.png | Bin 0 -> 383 bytes + test/new-sub-path.quartz.rgb24.ref.png | Bin 0 -> 357 bytes + test/new-sub-path.ref.png | Bin 0 -> 386 bytes + test/new-sub-path.rgb24.ref.png | Bin 0 -> 355 bytes + test/nil-surface-ref.png | Bin 107 -> 0 bytes + test/nil-surface-rgb24-ref.png | Bin 106 -> 0 bytes + test/nil-surface.ref.png | Bin 0 -> 107 bytes + test/nil-surface.rgb24.ref.png | Bin 0 -> 106 bytes + test/operator-alpha-ref.png | Bin 280 -> 0 bytes + test/operator-alpha-rgb24-ref.png | Bin 229 -> 0 bytes + test/operator-alpha.ref.png | Bin 0 -> 280 bytes + test/operator-alpha.rgb24.ref.png | Bin 0 -> 229 bytes + test/operator-clear-pdf-argb32-ref.png | Bin 1614 -> 0 bytes + test/operator-clear-pdf-rgb24-ref.png | Bin 1402 -> 0 bytes + test/operator-clear-quartz-ref.png | Bin 1459 -> 0 bytes + test/operator-clear-quartz-rgb24-ref.png | Bin 1293 -> 0 bytes + test/operator-clear-ref.png | Bin 1084 -> 0 bytes + test/operator-clear-rgb24-ref.png | Bin 965 -> 0 bytes + test/operator-clear.pdf.argb32.ref.png | Bin 0 -> 1614 bytes + test/operator-clear.pdf.rgb24.ref.png | Bin 0 -> 1402 bytes + test/operator-clear.quartz.ref.png | Bin 0 -> 1459 bytes + test/operator-clear.quartz.rgb24.ref.png | Bin 0 -> 1293 bytes + test/operator-clear.ref.png | Bin 0 -> 1084 bytes + test/operator-clear.rgb24.ref.png | Bin 0 -> 965 bytes + test/operator-ref.png | Bin 238 -> 0 bytes + test/operator-rgb24-ref.png | Bin 217 -> 0 bytes + test/operator-source-pdf-argb32-ref.png | Bin 5149 -> 0 bytes + test/operator-source-pdf-rgb24-ref.png | Bin 4354 -> 0 bytes + test/operator-source-quartz-ref.png | Bin 4637 -> 0 bytes + test/operator-source-quartz-rgb24-ref.png | Bin 3533 -> 0 bytes + test/operator-source-ref.png | Bin 4420 -> 0 bytes + test/operator-source-rgb24-ref.png | Bin 3201 -> 0 bytes + test/operator-source.pdf.argb32.ref.png | Bin 0 -> 5149 bytes + test/operator-source.pdf.rgb24.ref.png | Bin 0 -> 4354 bytes + test/operator-source.quartz.ref.png | Bin 0 -> 4637 bytes + test/operator-source.quartz.rgb24.ref.png | Bin 0 -> 3533 bytes + test/operator-source.ref.png | Bin 0 -> 4420 bytes + test/operator-source.rgb24.ref.png | Bin 0 -> 3201 bytes + test/operator.ref.png | Bin 0 -> 238 bytes + test/operator.rgb24.ref.png | Bin 0 -> 217 bytes + test/over-above-source-ps2-argb32-ref.png | Bin 636 -> 0 bytes + test/over-above-source-ps3-argb32-ref.png | Bin 636 -> 0 bytes + test/over-above-source-quartz-ref.png | Bin 530 -> 0 bytes + test/over-above-source-quartz-rgb24-ref.png | Bin 456 -> 0 bytes + test/over-above-source-ref.png | Bin 538 -> 0 bytes + test/over-above-source-rgb24-ref.png | Bin 461 -> 0 bytes + test/over-above-source.ps2.argb32.ref.png | Bin 0 -> 636 bytes + test/over-above-source.ps3.argb32.ref.png | Bin 0 -> 636 bytes + test/over-above-source.quartz.ref.png | Bin 0 -> 530 bytes + test/over-above-source.quartz.rgb24.ref.png | Bin 0 -> 456 bytes + test/over-above-source.ref.png | Bin 0 -> 538 bytes + test/over-above-source.rgb24.ref.png | Bin 0 -> 461 bytes + test/over-around-source-ps2-argb32-ref.png | Bin 632 -> 0 bytes + test/over-around-source-ps2-rgb24-ref.png | Bin 538 -> 0 bytes + test/over-around-source-ps3-argb32-ref.png | Bin 632 -> 0 bytes + test/over-around-source-ps3-rgb24-ref.png | Bin 538 -> 0 bytes + test/over-around-source-quartz-ref.png | Bin 612 -> 0 bytes + test/over-around-source-quartz-rgb24-ref.png | Bin 491 -> 0 bytes + test/over-around-source-ref.png | Bin 614 -> 0 bytes + test/over-around-source-rgb24-ref.png | Bin 503 -> 0 bytes + test/over-around-source.ps2.argb32.ref.png | Bin 0 -> 632 bytes + test/over-around-source.ps2.rgb24.ref.png | Bin 0 -> 538 bytes + test/over-around-source.ps3.argb32.ref.png | Bin 0 -> 632 bytes + test/over-around-source.ps3.rgb24.ref.png | Bin 0 -> 538 bytes + test/over-around-source.quartz.ref.png | Bin 0 -> 612 bytes + test/over-around-source.quartz.rgb24.ref.png | Bin 0 -> 491 bytes + test/over-around-source.ref.png | Bin 0 -> 614 bytes + test/over-around-source.rgb24.ref.png | Bin 0 -> 503 bytes + test/over-below-source-ps2-argb32-ref.png | Bin 503 -> 0 bytes + test/over-below-source-ps3-argb32-ref.png | Bin 503 -> 0 bytes + test/over-below-source-ref.png | Bin 434 -> 0 bytes + test/over-below-source-rgb24-ref.png | Bin 392 -> 0 bytes + test/over-below-source.ps2.argb32.ref.png | Bin 0 -> 503 bytes + test/over-below-source.ps3.argb32.ref.png | Bin 0 -> 503 bytes + test/over-below-source.ref.png | Bin 0 -> 434 bytes + test/over-below-source.rgb24.ref.png | Bin 0 -> 392 bytes + test/over-between-source-ps2-argb32-ref.png | Bin 678 -> 0 bytes + test/over-between-source-ps3-argb32-ref.png | Bin 678 -> 0 bytes + test/over-between-source-quartz-ref.png | Bin 570 -> 0 bytes + test/over-between-source-quartz-rgb24-ref.png | Bin 467 -> 0 bytes + test/over-between-source-ref.png | Bin 575 -> 0 bytes + test/over-between-source-rgb24-ref.png | Bin 473 -> 0 bytes + test/over-between-source.ps2.argb32.ref.png | Bin 0 -> 678 bytes + test/over-between-source.ps3.argb32.ref.png | Bin 0 -> 678 bytes + test/over-between-source.quartz.ref.png | Bin 0 -> 570 bytes + test/over-between-source.quartz.rgb24.ref.png | Bin 0 -> 467 bytes + test/over-between-source.ref.png | Bin 0 -> 575 bytes + test/over-between-source.rgb24.ref.png | Bin 0 -> 473 bytes + test/paint-ref.png | Bin 116 -> 0 bytes + test/paint-repeat-ref.png | Bin 145 -> 0 bytes + test/paint-repeat.ref.png | Bin 0 -> 145 bytes + test/paint-source-alpha-pdf-argb32-ref.png | Bin 471 -> 0 bytes + test/paint-source-alpha-pdf-ref.png | Bin 473 -> 0 bytes + test/paint-source-alpha-ref.png | Bin 256 -> 0 bytes + test/paint-source-alpha-svg11-ref.png | Bin 756 -> 0 bytes + test/paint-source-alpha-svg12-ref.png | Bin 505 -> 0 bytes + test/paint-source-alpha.pdf.argb32.ref.png | Bin 0 -> 471 bytes + test/paint-source-alpha.pdf.ref.png | Bin 0 -> 473 bytes + test/paint-source-alpha.ref.png | Bin 0 -> 256 bytes + test/paint-source-alpha.svg11.ref.png | Bin 0 -> 756 bytes + test/paint-source-alpha.svg12.ref.png | Bin 0 -> 505 bytes + test/paint-with-alpha-pdf-ref.png | Bin 466 -> 0 bytes + test/paint-with-alpha-ref.png | Bin 256 -> 0 bytes + test/paint-with-alpha-svg11-ref.png | Bin 516 -> 0 bytes + test/paint-with-alpha-svg12-ref.png | Bin 516 -> 0 bytes + test/paint-with-alpha.pdf.ref.png | Bin 0 -> 466 bytes + test/paint-with-alpha.ref.png | Bin 0 -> 256 bytes + test/paint-with-alpha.svg11.ref.png | Bin 0 -> 516 bytes + test/paint-with-alpha.svg12.ref.png | Bin 0 -> 516 bytes + test/paint.ref.png | Bin 0 -> 116 bytes + test/pass-through-ref.png | Bin 221 -> 0 bytes + test/pass-through-rgb24-ref.png | Bin 179 -> 0 bytes + test/pass-through.ref.png | Bin 0 -> 221 bytes + test/pass-through.rgb24.ref.png | Bin 0 -> 179 bytes + test/pattern-getters-ref.png | Bin 107 -> 0 bytes + test/pattern-getters.ref.png | Bin 0 -> 107 bytes + test/pdf-features.c | 2 +- + test/pdf-surface-source-ref.png | Bin 268 -> 0 bytes + test/pdf-surface-source.c | 2 +- + test/pdf-surface-source.ref.png | Bin 0 -> 268 bytes + test/pixman-rotate-ref.png | Bin 260 -> 0 bytes + test/pixman-rotate-rgb24-ref.png | Bin 244 -> 0 bytes + test/pixman-rotate.ref.png | Bin 0 -> 260 bytes + test/pixman-rotate.rgb24.ref.png | Bin 0 -> 244 bytes + test/png.c | 2 +- + test/ps-features.c | 2 +- + test/ps-surface-source-ref.png | Bin 268 -> 0 bytes + test/ps-surface-source.c | 2 +- + test/ps-surface-source.ref.png | Bin 0 -> 268 bytes + test/push-group-pdf-ref.png | Bin 2807 -> 0 bytes + test/push-group-pdf-rgb24-ref.png | Bin 2714 -> 0 bytes + test/push-group-ref.png | Bin 3126 -> 0 bytes + test/push-group-rgb24-ref.png | Bin 2961 -> 0 bytes + test/push-group-svg11-argb32-ref.png | Bin 2935 -> 0 bytes + test/push-group-svg12-argb32-ref.png | Bin 2935 -> 0 bytes + test/push-group.pdf.ref.png | Bin 0 -> 2807 bytes + test/push-group.pdf.rgb24.ref.png | Bin 0 -> 2714 bytes + test/push-group.ref.png | Bin 0 -> 3126 bytes + test/push-group.rgb24.ref.png | Bin 0 -> 2961 bytes + test/push-group.svg11.argb32.ref.png | Bin 0 -> 2935 bytes + test/push-group.svg12.argb32.ref.png | Bin 0 -> 2935 bytes + test/radial-gradient-pdf-ref.png | Bin 79490 -> 0 bytes + test/radial-gradient-quartz-ref.png | Bin 92334 -> 0 bytes + test/radial-gradient-ref.png | Bin 91159 -> 0 bytes + test/radial-gradient-svg11-ref.png | Bin 91039 -> 0 bytes + test/radial-gradient-svg12-ref.png | Bin 91039 -> 0 bytes + test/radial-gradient.pdf.ref.png | Bin 0 -> 79490 bytes + test/radial-gradient.quartz.ref.png | Bin 0 -> 92334 bytes + test/radial-gradient.ref.png | Bin 0 -> 91159 bytes + test/radial-gradient.svg11.ref.png | Bin 0 -> 91039 bytes + test/radial-gradient.svg12.ref.png | Bin 0 -> 91039 bytes + test/random-intersections-ps2-ref.png | Bin 89253 -> 0 bytes + test/random-intersections-ps3-ref.png | Bin 89253 -> 0 bytes + test/random-intersections-quartz-ref.png | Bin 197778 -> 0 bytes + test/random-intersections-ref.png | Bin 148722 -> 0 bytes + test/random-intersections.ps2.ref.png | Bin 0 -> 89253 bytes + test/random-intersections.ps3.ref.png | Bin 0 -> 89253 bytes + test/random-intersections.quartz.ref.png | Bin 0 -> 197778 bytes + test/random-intersections.ref.png | Bin 0 -> 148722 bytes + test/rectangle-rounding-error-ref.png | Bin 231 -> 0 bytes + test/rectangle-rounding-error.ref.png | Bin 0 -> 231 bytes + test/rectilinear-fill-ref.png | Bin 162 -> 0 bytes + test/rectilinear-fill.ref.png | Bin 0 -> 162 bytes + test/rectilinear-miter-limit-ps2-ref.png | Bin 221 -> 0 bytes + test/rectilinear-miter-limit-ps3-ref.png | Bin 221 -> 0 bytes + test/rectilinear-miter-limit-ref.png | Bin 177 -> 0 bytes + test/rectilinear-miter-limit.ps2.ref.png | Bin 0 -> 221 bytes + test/rectilinear-miter-limit.ps3.ref.png | Bin 0 -> 221 bytes + test/rectilinear-miter-limit.ref.png | Bin 0 -> 177 bytes + test/rectilinear-stroke-ref.png | Bin 213 -> 0 bytes + test/rectilinear-stroke.ref.png | Bin 0 -> 213 bytes + test/reflected-stroke-ps2-ref.png | Bin 3898 -> 0 bytes + test/reflected-stroke-ps3-ref.png | Bin 3898 -> 0 bytes + test/reflected-stroke-quartz-ref.png | Bin 5293 -> 0 bytes + test/reflected-stroke-ref.png | Bin 5704 -> 0 bytes + test/reflected-stroke.ps2.ref.png | Bin 0 -> 3898 bytes + test/reflected-stroke.ps3.ref.png | Bin 0 -> 3898 bytes + test/reflected-stroke.quartz.ref.png | Bin 0 -> 5293 bytes + test/reflected-stroke.ref.png | Bin 0 -> 5704 bytes + test/rel-path-ps2-rgb24-ref.png | Bin 243 -> 0 bytes + test/rel-path-ps3-rgb24-ref.png | Bin 243 -> 0 bytes + test/rel-path-quartz-ref.png | Bin 212 -> 0 bytes + test/rel-path-quartz-rgb24-ref.png | Bin 228 -> 0 bytes + test/rel-path-ref.png | Bin 212 -> 0 bytes + test/rel-path-rgb24-ref.png | Bin 228 -> 0 bytes + test/rel-path.ps2.rgb24.ref.png | Bin 0 -> 243 bytes + test/rel-path.ps3.rgb24.ref.png | Bin 0 -> 243 bytes + test/rel-path.quartz.ref.png | Bin 0 -> 212 bytes + test/rel-path.quartz.rgb24.ref.png | Bin 0 -> 228 bytes + test/rel-path.ref.png | Bin 0 -> 212 bytes + test/rel-path.rgb24.ref.png | Bin 0 -> 228 bytes + test/rgb24-ignore-alpha-ref.png | Bin 116 -> 0 bytes + test/rgb24-ignore-alpha.ref.png | Bin 0 -> 116 bytes + test/rotate-image-surface-paint-pdf-argb32-ref.png | Bin 209 -> 0 bytes + test/rotate-image-surface-paint-pdf-rgb24-ref.png | Bin 207 -> 0 bytes + test/rotate-image-surface-paint-ps2-ref.png | Bin 212 -> 0 bytes + test/rotate-image-surface-paint-ps3-ref.png | Bin 212 -> 0 bytes + test/rotate-image-surface-paint-quartz-ref.png | Bin 257 -> 0 bytes + test/rotate-image-surface-paint-ref.png | Bin 232 -> 0 bytes + test/rotate-image-surface-paint-svg11-ref.png | Bin 248 -> 0 bytes + test/rotate-image-surface-paint-svg12-ref.png | Bin 248 -> 0 bytes + test/rotate-image-surface-paint.pdf.argb32.ref.png | Bin 0 -> 209 bytes + test/rotate-image-surface-paint.pdf.rgb24.ref.png | Bin 0 -> 207 bytes + test/rotate-image-surface-paint.ps2.ref.png | Bin 0 -> 212 bytes + test/rotate-image-surface-paint.ps3.ref.png | Bin 0 -> 212 bytes + test/rotate-image-surface-paint.quartz.ref.png | Bin 0 -> 257 bytes + test/rotate-image-surface-paint.ref.png | Bin 0 -> 232 bytes + test/rotate-image-surface-paint.svg11.ref.png | Bin 0 -> 248 bytes + test/rotate-image-surface-paint.svg12.ref.png | Bin 0 -> 248 bytes + test/scale-down-source-surface-paint-ref.png | Bin 133 -> 0 bytes + test/scale-down-source-surface-paint.ref.png | Bin 0 -> 133 bytes + test/scale-source-surface-paint-pdf-argb32-ref.png | Bin 182 -> 0 bytes + test/scale-source-surface-paint-pdf-rgb24-ref.png | Bin 198 -> 0 bytes + test/scale-source-surface-paint-ref.png | Bin 147 -> 0 bytes + test/scale-source-surface-paint-rgb24-ref.png | Bin 136 -> 0 bytes + ...scale-source-surface-paint-svg11-argb32-ref.png | Bin 229 -> 0 bytes + .../scale-source-surface-paint-svg11-rgb24-ref.png | Bin 243 -> 0 bytes + ...scale-source-surface-paint-svg12-argb32-ref.png | Bin 229 -> 0 bytes + .../scale-source-surface-paint-svg12-rgb24-ref.png | Bin 243 -> 0 bytes + test/scale-source-surface-paint.pdf.argb32.ref.png | Bin 0 -> 182 bytes + test/scale-source-surface-paint.pdf.rgb24.ref.png | Bin 0 -> 198 bytes + test/scale-source-surface-paint.ref.png | Bin 0 -> 147 bytes + test/scale-source-surface-paint.rgb24.ref.png | Bin 0 -> 136 bytes + ...scale-source-surface-paint.svg11.argb32.ref.png | Bin 0 -> 229 bytes + .../scale-source-surface-paint.svg11.rgb24.ref.png | Bin 0 -> 243 bytes + ...scale-source-surface-paint.svg12.argb32.ref.png | Bin 0 -> 229 bytes + .../scale-source-surface-paint.svg12.rgb24.ref.png | Bin 0 -> 243 bytes + test/select-font-face-ps2-ref.png | Bin 959 -> 0 bytes + test/select-font-face-ps3-ref.png | Bin 959 -> 0 bytes + test/select-font-face-quartz-ref.png | Bin 2970 -> 0 bytes + test/select-font-face-ref.png | Bin 2473 -> 0 bytes + test/select-font-face.ps2.ref.png | Bin 0 -> 959 bytes + test/select-font-face.ps3.ref.png | Bin 0 -> 959 bytes + test/select-font-face.quartz.ref.png | Bin 0 -> 2970 bytes + test/select-font-face.ref.png | Bin 0 -> 2473 bytes + test/self-copy-overlap-ref.png | Bin 1140 -> 0 bytes + test/self-copy-overlap-rgb24-ref.png | Bin 608 -> 0 bytes + test/self-copy-overlap.ref.png | Bin 0 -> 1140 bytes + test/self-copy-overlap.rgb24.ref.png | Bin 0 -> 608 bytes + test/self-copy-ps2-ref.png | Bin 335 -> 0 bytes + test/self-copy-ps3-ref.png | Bin 335 -> 0 bytes + test/self-copy-ref.png | Bin 291 -> 0 bytes + test/self-copy.ps2.ref.png | Bin 0 -> 335 bytes + test/self-copy.ps3.ref.png | Bin 0 -> 335 bytes + test/self-copy.ref.png | Bin 0 -> 291 bytes + test/self-intersecting-ref.png | Bin 242 -> 0 bytes + test/self-intersecting-rgb24-ref.png | Bin 304 -> 0 bytes + test/self-intersecting.ref.png | Bin 0 -> 242 bytes + test/self-intersecting.rgb24.ref.png | Bin 0 -> 304 bytes + test/set-source-ref.png | Bin 120 -> 0 bytes + test/set-source-rgb24-ref.png | Bin 120 -> 0 bytes + test/set-source-svg11-argb32-ref.png | Bin 104 -> 0 bytes + test/set-source-svg12-argb32-ref.png | Bin 104 -> 0 bytes + test/set-source.ref.png | Bin 0 -> 120 bytes + test/set-source.rgb24.ref.png | Bin 0 -> 120 bytes + test/set-source.svg11.argb32.ref.png | Bin 0 -> 104 bytes + test/set-source.svg12.argb32.ref.png | Bin 0 -> 104 bytes + test/show-glyphs-many-ref.png | Bin 118 -> 0 bytes + test/show-glyphs-many.ref.png | Bin 0 -> 118 bytes + test/show-text-current-point-ps2-ref.png | Bin 1356 -> 0 bytes + test/show-text-current-point-ps3-ref.png | Bin 1356 -> 0 bytes + test/show-text-current-point-quartz-ref.png | Bin 3093 -> 0 bytes + test/show-text-current-point-ref.png | Bin 2411 -> 0 bytes + test/show-text-current-point.ps2.ref.png | Bin 0 -> 1356 bytes + test/show-text-current-point.ps3.ref.png | Bin 0 -> 1356 bytes + test/show-text-current-point.quartz.ref.png | Bin 0 -> 3093 bytes + test/show-text-current-point.ref.png | Bin 0 -> 2411 bytes + test/skew-extreme-ps2-ref.png | Bin 1048 -> 0 bytes + test/skew-extreme-ps3-ref.png | Bin 1048 -> 0 bytes + test/skew-extreme-ref.png | Bin 1012 -> 0 bytes + test/skew-extreme.ps2.ref.png | Bin 0 -> 1048 bytes + test/skew-extreme.ps3.ref.png | Bin 0 -> 1048 bytes + test/skew-extreme.ref.png | Bin 0 -> 1012 bytes + test/smask-fill-pdf-ref.png | Bin 1075 -> 0 bytes + test/smask-fill-ref.png | Bin 1223 -> 0 bytes + test/smask-fill-svg11-ref.png | Bin 1166 -> 0 bytes + test/smask-fill-svg12-ref.png | Bin 1166 -> 0 bytes + test/smask-fill.pdf.ref.png | Bin 0 -> 1075 bytes + test/smask-fill.ref.png | Bin 0 -> 1223 bytes + test/smask-fill.svg11.ref.png | Bin 0 -> 1166 bytes + test/smask-fill.svg12.ref.png | Bin 0 -> 1166 bytes + test/smask-image-mask-pdf-ref.png | Bin 421 -> 0 bytes + test/smask-image-mask-ref.png | Bin 643 -> 0 bytes + test/smask-image-mask.pdf.ref.png | Bin 0 -> 421 bytes + test/smask-image-mask.ref.png | Bin 0 -> 643 bytes + test/smask-mask-pdf-ref.png | Bin 3731 -> 0 bytes + test/smask-mask-ref.png | Bin 2523 -> 0 bytes + test/smask-mask-svg11-ref.png | Bin 2529 -> 0 bytes + test/smask-mask-svg12-ref.png | Bin 2529 -> 0 bytes + test/smask-mask.pdf.ref.png | Bin 0 -> 3731 bytes + test/smask-mask.ref.png | Bin 0 -> 2523 bytes + test/smask-mask.svg11.ref.png | Bin 0 -> 2529 bytes + test/smask-mask.svg12.ref.png | Bin 0 -> 2529 bytes + test/smask-paint-pdf-ref.png | Bin 3800 -> 0 bytes + test/smask-paint-ref.png | Bin 2639 -> 0 bytes + test/smask-paint-svg11-ref.png | Bin 2612 -> 0 bytes + test/smask-paint-svg12-ref.png | Bin 2612 -> 0 bytes + test/smask-paint.pdf.ref.png | Bin 0 -> 3800 bytes + test/smask-paint.ref.png | Bin 0 -> 2639 bytes + test/smask-paint.svg11.ref.png | Bin 0 -> 2612 bytes + test/smask-paint.svg12.ref.png | Bin 0 -> 2612 bytes + test/smask-pdf-ref.png | Bin 3800 -> 0 bytes + test/smask-ps2-ref.png | Bin 3669 -> 0 bytes + test/smask-ps3-ref.png | Bin 3669 -> 0 bytes + test/smask-ref.png | Bin 3587 -> 0 bytes + test/smask-stroke-pdf-ref.png | Bin 449 -> 0 bytes + test/smask-stroke-ref.png | Bin 1845 -> 0 bytes + test/smask-stroke.pdf.ref.png | Bin 0 -> 449 bytes + test/smask-stroke.ref.png | Bin 0 -> 1845 bytes + test/smask-svg11-ref.png | Bin 3634 -> 0 bytes + test/smask-svg12-ref.png | Bin 3634 -> 0 bytes + test/smask-text-pdf-ref.png | Bin 1806 -> 0 bytes + test/smask-text-ps2-ref.png | Bin 2023 -> 0 bytes + test/smask-text-ps3-ref.png | Bin 2023 -> 0 bytes + test/smask-text-ref.png | Bin 1777 -> 0 bytes + test/smask-text-svg11-ref.png | Bin 1886 -> 0 bytes + test/smask-text-svg12-ref.png | Bin 1886 -> 0 bytes + test/smask-text.pdf.ref.png | Bin 0 -> 1806 bytes + test/smask-text.ps2.ref.png | Bin 0 -> 2023 bytes + test/smask-text.ps3.ref.png | Bin 0 -> 2023 bytes + test/smask-text.ref.png | Bin 0 -> 1777 bytes + test/smask-text.svg11.ref.png | Bin 0 -> 1886 bytes + test/smask-text.svg12.ref.png | Bin 0 -> 1886 bytes + test/smask.pdf.ref.png | Bin 0 -> 3800 bytes + test/smask.ps2.ref.png | Bin 0 -> 3669 bytes + test/smask.ps3.ref.png | Bin 0 -> 3669 bytes + test/smask.ref.png | Bin 0 -> 3587 bytes + test/smask.svg11.ref.png | Bin 0 -> 3634 bytes + test/smask.svg12.ref.png | Bin 0 -> 3634 bytes + test/solid-pattern-cache-stress-ref.png | Bin 107 -> 0 bytes + test/solid-pattern-cache-stress.ref.png | Bin 0 -> 107 bytes + test/source-clip-ref.png | Bin 133 -> 0 bytes + test/source-clip-scale-pdf-ref.png | Bin 113 -> 0 bytes + test/source-clip-scale-ps2-argb32-ref.png | Bin 183 -> 0 bytes + test/source-clip-scale-ps2-rgb24-ref.png | Bin 183 -> 0 bytes + test/source-clip-scale-ps3-argb32-ref.png | Bin 183 -> 0 bytes + test/source-clip-scale-ps3-rgb24-ref.png | Bin 183 -> 0 bytes + test/source-clip-scale-quartz-ref.png | Bin 148 -> 0 bytes + test/source-clip-scale-ref.png | Bin 161 -> 0 bytes + test/source-clip-scale-svg11-ref.png | Bin 119 -> 0 bytes + test/source-clip-scale-svg12-ref.png | Bin 119 -> 0 bytes + test/source-clip-scale.pdf.ref.png | Bin 0 -> 113 bytes + test/source-clip-scale.ps2.argb32.ref.png | Bin 0 -> 183 bytes + test/source-clip-scale.ps2.rgb24.ref.png | Bin 0 -> 183 bytes + test/source-clip-scale.ps3.argb32.ref.png | Bin 0 -> 183 bytes + test/source-clip-scale.ps3.rgb24.ref.png | Bin 0 -> 183 bytes + test/source-clip-scale.quartz.ref.png | Bin 0 -> 148 bytes + test/source-clip-scale.ref.png | Bin 0 -> 161 bytes + test/source-clip-scale.svg11.ref.png | Bin 0 -> 119 bytes + test/source-clip-scale.svg12.ref.png | Bin 0 -> 119 bytes + test/source-clip.ref.png | Bin 0 -> 133 bytes + test/source-surface-scale-paint-ref.png | Bin 139 -> 0 bytes + test/source-surface-scale-paint-rgb24-ref.png | Bin 133 -> 0 bytes + test/source-surface-scale-paint.ref.png | Bin 0 -> 139 bytes + test/source-surface-scale-paint.rgb24.ref.png | Bin 0 -> 133 bytes + test/spline-decomposition-pdf-ref.png | Bin 20404 -> 0 bytes + test/spline-decomposition-ps2-ref.png | Bin 8957 -> 0 bytes + test/spline-decomposition-ps3-ref.png | Bin 8957 -> 0 bytes + test/spline-decomposition-ref.png | Bin 20402 -> 0 bytes + test/spline-decomposition-svg11-ref.png | Bin 20404 -> 0 bytes + test/spline-decomposition-svg12-ref.png | Bin 20404 -> 0 bytes + test/spline-decomposition.pdf.ref.png | Bin 0 -> 20404 bytes + test/spline-decomposition.ps2.ref.png | Bin 0 -> 8957 bytes + test/spline-decomposition.ps3.ref.png | Bin 0 -> 8957 bytes + test/spline-decomposition.ref.png | Bin 0 -> 20402 bytes + test/spline-decomposition.svg11.ref.png | Bin 0 -> 20404 bytes + test/spline-decomposition.svg12.ref.png | Bin 0 -> 20404 bytes + test/stroke-ctm-caps-ps2-ref.png | Bin 1079 -> 0 bytes + test/stroke-ctm-caps-ps3-ref.png | Bin 1079 -> 0 bytes + test/stroke-ctm-caps-quartz-ref.png | Bin 1109 -> 0 bytes + test/stroke-ctm-caps-ref.png | Bin 1057 -> 0 bytes + test/stroke-ctm-caps.ps2.ref.png | Bin 0 -> 1079 bytes + test/stroke-ctm-caps.ps3.ref.png | Bin 0 -> 1079 bytes + test/stroke-ctm-caps.quartz.ref.png | Bin 0 -> 1109 bytes + test/stroke-ctm-caps.ref.png | Bin 0 -> 1057 bytes + test/stroke-image-pdf-ref.png | Bin 1554 -> 0 bytes + test/stroke-image-ps2-ref.png | Bin 2121 -> 0 bytes + test/stroke-image-ps3-ref.png | Bin 2121 -> 0 bytes + test/stroke-image-quartz-ref.png | Bin 1802 -> 0 bytes + test/stroke-image-ref.png | Bin 1866 -> 0 bytes + test/stroke-image.pdf.ref.png | Bin 0 -> 1554 bytes + test/stroke-image.ps2.ref.png | Bin 0 -> 2121 bytes + test/stroke-image.ps3.ref.png | Bin 0 -> 2121 bytes + test/stroke-image.quartz.ref.png | Bin 0 -> 1802 bytes + test/stroke-image.ref.png | Bin 0 -> 1866 bytes + test/surface-pattern-big-scale-down-ref.png | Bin 226 -> 0 bytes + test/surface-pattern-big-scale-down.ref.png | Bin 0 -> 226 bytes + test/surface-pattern-pdf-ref.png | Bin 15996 -> 0 bytes + test/surface-pattern-ps2-ref.png | Bin 2364 -> 0 bytes + test/surface-pattern-ps3-ref.png | Bin 2364 -> 0 bytes + test/surface-pattern-ref.png | Bin 11439 -> 0 bytes + test/surface-pattern-scale-down-pdf-argb32-ref.png | Bin 2386 -> 0 bytes + test/surface-pattern-scale-down-pdf-rgb24-ref.png | Bin 2386 -> 0 bytes + test/surface-pattern-scale-down-ps2-ref.png | Bin 1324 -> 0 bytes + test/surface-pattern-scale-down-ps3-ref.png | Bin 1324 -> 0 bytes + test/surface-pattern-scale-down-quartz-ref.png | Bin 3188 -> 0 bytes + test/surface-pattern-scale-down-ref.png | Bin 1784 -> 0 bytes + test/surface-pattern-scale-down.pdf.argb32.ref.png | Bin 0 -> 2386 bytes + test/surface-pattern-scale-down.pdf.rgb24.ref.png | Bin 0 -> 2386 bytes + test/surface-pattern-scale-down.ps2.ref.png | Bin 0 -> 1324 bytes + test/surface-pattern-scale-down.ps3.ref.png | Bin 0 -> 1324 bytes + test/surface-pattern-scale-down.quartz.ref.png | Bin 0 -> 3188 bytes + test/surface-pattern-scale-down.ref.png | Bin 0 -> 1784 bytes + test/surface-pattern-scale-up-pdf-argb32-ref.png | Bin 4247 -> 0 bytes + test/surface-pattern-scale-up-pdf-rgb24-ref.png | Bin 4247 -> 0 bytes + test/surface-pattern-scale-up-ps2-ref.png | Bin 943 -> 0 bytes + test/surface-pattern-scale-up-ps3-ref.png | Bin 943 -> 0 bytes + test/surface-pattern-scale-up-ref.png | Bin 4061 -> 0 bytes + test/surface-pattern-scale-up.pdf.argb32.ref.png | Bin 0 -> 4247 bytes + test/surface-pattern-scale-up.pdf.rgb24.ref.png | Bin 0 -> 4247 bytes + test/surface-pattern-scale-up.ps2.ref.png | Bin 0 -> 943 bytes + test/surface-pattern-scale-up.ps3.ref.png | Bin 0 -> 943 bytes + test/surface-pattern-scale-up.ref.png | Bin 0 -> 4061 bytes + test/surface-pattern-svg11-ref.png | Bin 17663 -> 0 bytes + test/surface-pattern-svg12-ref.png | Bin 17663 -> 0 bytes + test/surface-pattern.pdf.ref.png | Bin 0 -> 15996 bytes + test/surface-pattern.ps2.ref.png | Bin 0 -> 2364 bytes + test/surface-pattern.ps3.ref.png | Bin 0 -> 2364 bytes + test/surface-pattern.ref.png | Bin 0 -> 11439 bytes + test/surface-pattern.svg11.ref.png | Bin 0 -> 17663 bytes + test/surface-pattern.svg12.ref.png | Bin 0 -> 17663 bytes + test/svg-clip.c | 2 +- + test/svg-surface-source-ref.png | Bin 268 -> 0 bytes + test/svg-surface-source.c | 2 +- + test/svg-surface-source.ref.png | Bin 0 -> 268 bytes + test/svg-surface.c | 2 +- + test/text-antialias-gray-quartz-ref.png | Bin 1041 -> 0 bytes + test/text-antialias-gray-ref.png | Bin 1084 -> 0 bytes + test/text-antialias-gray.quartz.ref.png | Bin 0 -> 1041 bytes + test/text-antialias-gray.ref.png | Bin 0 -> 1084 bytes + test/text-antialias-none-quartz-ref.png | Bin 300 -> 0 bytes + test/text-antialias-none-ref.png | Bin 298 -> 0 bytes + test/text-antialias-none.quartz.ref.png | Bin 0 -> 300 bytes + test/text-antialias-none.ref.png | Bin 0 -> 298 bytes + test/text-antialias-subpixel-quartz-ref.png | Bin 1065 -> 0 bytes + test/text-antialias-subpixel-ref.png | Bin 1102 -> 0 bytes + test/text-antialias-subpixel.quartz.ref.png | Bin 0 -> 1065 bytes + test/text-antialias-subpixel.ref.png | Bin 0 -> 1102 bytes + test/text-glyph-range-ps2-ref.png | Bin 1389 -> 0 bytes + test/text-glyph-range-ps3-ref.png | Bin 1389 -> 0 bytes + test/text-glyph-range-ref.png | Bin 2211 -> 0 bytes + test/text-glyph-range.ps2.ref.png | Bin 0 -> 1389 bytes + test/text-glyph-range.ps3.ref.png | Bin 0 -> 1389 bytes + test/text-glyph-range.ref.png | Bin 0 -> 2211 bytes + test/text-pattern-pdf-argb32-ref.png | Bin 1823 -> 0 bytes + test/text-pattern-pdf-rgb24-ref.png | Bin 508 -> 0 bytes + test/text-pattern-ps3-argb32-ref.png | Bin 966 -> 0 bytes + test/text-pattern-ps3-rgb24-ref.png | Bin 924 -> 0 bytes + test/text-pattern-quartz-ref.png | Bin 2158 -> 0 bytes + test/text-pattern-quartz-rgb24-ref.png | Bin 1874 -> 0 bytes + test/text-pattern-ref.png | Bin 1717 -> 0 bytes + test/text-pattern-rgb24-ref.png | Bin 1414 -> 0 bytes + test/text-pattern-svg11-argb32-ref.png | Bin 1733 -> 0 bytes + test/text-pattern-svg11-rgb24-ref.png | Bin 1563 -> 0 bytes + test/text-pattern-svg12-argb32-ref.png | Bin 1733 -> 0 bytes + test/text-pattern-svg12-rgb24-ref.png | Bin 1563 -> 0 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 0 -> 1823 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 0 -> 508 bytes + test/text-pattern.ps3.argb32.ref.png | Bin 0 -> 966 bytes + test/text-pattern.ps3.rgb24.ref.png | Bin 0 -> 924 bytes + test/text-pattern.quartz.ref.png | Bin 0 -> 2158 bytes + test/text-pattern.quartz.rgb24.ref.png | Bin 0 -> 1874 bytes + test/text-pattern.ref.png | Bin 0 -> 1717 bytes + test/text-pattern.rgb24.ref.png | Bin 0 -> 1414 bytes + test/text-pattern.svg11.argb32.ref.png | Bin 0 -> 1733 bytes + test/text-pattern.svg11.rgb24.ref.png | Bin 0 -> 1563 bytes + test/text-pattern.svg12.argb32.ref.png | Bin 0 -> 1733 bytes + test/text-pattern.svg12.rgb24.ref.png | Bin 0 -> 1563 bytes + test/text-rotate-pdf-ref.png | Bin 16639 -> 0 bytes + test/text-rotate-ps2-ref.png | Bin 6851 -> 0 bytes + test/text-rotate-ps3-ref.png | Bin 6851 -> 0 bytes + test/text-rotate-quartz-ref.png | Bin 17820 -> 0 bytes + test/text-rotate-ref.png | Bin 17775 -> 0 bytes + test/text-rotate-svg11-ref.png | Bin 18301 -> 0 bytes + test/text-rotate-svg12-ref.png | Bin 18301 -> 0 bytes + test/text-rotate.pdf.ref.png | Bin 0 -> 16639 bytes + test/text-rotate.ps2.ref.png | Bin 0 -> 6851 bytes + test/text-rotate.ps3.ref.png | Bin 0 -> 6851 bytes + test/text-rotate.quartz.ref.png | Bin 0 -> 17820 bytes + test/text-rotate.ref.png | Bin 0 -> 17775 bytes + test/text-rotate.svg11.ref.png | Bin 0 -> 18301 bytes + test/text-rotate.svg12.ref.png | Bin 0 -> 18301 bytes + test/text-transform-pdf-ref.png | Bin 3796 -> 0 bytes + test/text-transform-ps2-ref.png | Bin 4154 -> 0 bytes + test/text-transform-ps3-ref.png | Bin 4154 -> 0 bytes + test/text-transform-ref.png | Bin 6200 -> 0 bytes + test/text-transform.pdf.ref.png | Bin 0 -> 3796 bytes + test/text-transform.ps2.ref.png | Bin 0 -> 4154 bytes + test/text-transform.ps3.ref.png | Bin 0 -> 4154 bytes + test/text-transform.ref.png | Bin 0 -> 6200 bytes + test/transforms-ps2-ref.png | Bin 418 -> 0 bytes + test/transforms-ps3-ref.png | Bin 418 -> 0 bytes + test/transforms-ref.png | Bin 361 -> 0 bytes + test/transforms.ps2.ref.png | Bin 0 -> 418 bytes + test/transforms.ps3.ref.png | Bin 0 -> 418 bytes + test/transforms.ref.png | Bin 0 -> 361 bytes + test/translate-show-surface-ref.png | Bin 100 -> 0 bytes + test/translate-show-surface.ref.png | Bin 0 -> 100 bytes + test/trap-clip-pdf-argb32-ref.png | Bin 5809 -> 0 bytes + test/trap-clip-pdf-rgb24-ref.png | Bin 5768 -> 0 bytes + test/trap-clip-ps2-argb32-ref.png | Bin 5690 -> 0 bytes + test/trap-clip-ps2-rgb24-ref.png | Bin 5617 -> 0 bytes + test/trap-clip-ps3-argb32-ref.png | Bin 5591 -> 0 bytes + test/trap-clip-ps3-rgb24-ref.png | Bin 5512 -> 0 bytes + test/trap-clip-quartz-ref.png | Bin 6041 -> 0 bytes + test/trap-clip-quartz-rgb24-ref.png | Bin 5385 -> 0 bytes + test/trap-clip-ref.png | Bin 5772 -> 0 bytes + test/trap-clip-rgb24-ref.png | Bin 5365 -> 0 bytes + test/trap-clip.pdf.argb32.ref.png | Bin 0 -> 5809 bytes + test/trap-clip.pdf.rgb24.ref.png | Bin 0 -> 5768 bytes + test/trap-clip.ps2.argb32.ref.png | Bin 0 -> 5690 bytes + test/trap-clip.ps2.rgb24.ref.png | Bin 0 -> 5617 bytes + test/trap-clip.ps3.argb32.ref.png | Bin 0 -> 5591 bytes + test/trap-clip.ps3.rgb24.ref.png | Bin 0 -> 5512 bytes + test/trap-clip.quartz.ref.png | Bin 0 -> 6041 bytes + test/trap-clip.quartz.rgb24.ref.png | Bin 0 -> 5385 bytes + test/trap-clip.ref.png | Bin 0 -> 5772 bytes + test/trap-clip.rgb24.ref.png | Bin 0 -> 5365 bytes + test/twin-ps2-ref.png | Bin 1167 -> 0 bytes + test/twin-ps3-ref.png | Bin 1167 -> 0 bytes + test/twin-ref.png | Bin 1836 -> 0 bytes + test/twin-svg11-ref.png | Bin 1773 -> 0 bytes + test/twin-svg12-ref.png | Bin 1773 -> 0 bytes + test/twin.ps2.ref.png | Bin 0 -> 1167 bytes + test/twin.ps3.ref.png | Bin 0 -> 1167 bytes + test/twin.ref.png | Bin 0 -> 1836 bytes + test/twin.svg11.ref.png | Bin 0 -> 1773 bytes + test/twin.svg12.ref.png | Bin 0 -> 1773 bytes + test/unantialiased-shapes-quartz-ref.png | Bin 4394 -> 0 bytes + test/unantialiased-shapes-ref.png | Bin 4459 -> 0 bytes + test/unantialiased-shapes.quartz.ref.png | Bin 0 -> 4394 bytes + test/unantialiased-shapes.ref.png | Bin 0 -> 4459 bytes + test/unbounded-operator-quartz-ref.png | Bin 4066 -> 0 bytes + test/unbounded-operator-quartz-rgb24-ref.png | Bin 1918 -> 0 bytes + test/unbounded-operator-ref.png | Bin 2777 -> 0 bytes + test/unbounded-operator-rgb24-ref.png | Bin 1315 -> 0 bytes + test/unbounded-operator.quartz.ref.png | Bin 0 -> 4066 bytes + test/unbounded-operator.quartz.rgb24.ref.png | Bin 0 -> 1918 bytes + test/unbounded-operator.ref.png | Bin 0 -> 2777 bytes + test/unbounded-operator.rgb24.ref.png | Bin 0 -> 1315 bytes + test/user-font-mask-pdf-ref.png | Bin 1927 -> 0 bytes + test/user-font-mask-ps2-ref.png | Bin 1927 -> 0 bytes + test/user-font-mask-ps3-ref.png | Bin 1927 -> 0 bytes + test/user-font-mask-ref.png | Bin 6011 -> 0 bytes + test/user-font-mask-svg11-ref.png | Bin 2224 -> 0 bytes + test/user-font-mask.pdf.ref.png | Bin 0 -> 1927 bytes + test/user-font-mask.ps2.ref.png | Bin 0 -> 1927 bytes + test/user-font-mask.ps3.ref.png | Bin 0 -> 1927 bytes + test/user-font-mask.ref.png | Bin 0 -> 6011 bytes + test/user-font-mask.svg11.ref.png | Bin 0 -> 2224 bytes + test/user-font-proxy-pdf-ref.png | Bin 18111 -> 0 bytes + test/user-font-proxy-ps2-ref.png | Bin 8171 -> 0 bytes + test/user-font-proxy-ps3-ref.png | Bin 8171 -> 0 bytes + test/user-font-proxy-ref.png | Bin 18121 -> 0 bytes + test/user-font-proxy-svg11-ref.png | Bin 17902 -> 0 bytes + test/user-font-proxy-svg12-ref.png | Bin 17902 -> 0 bytes + test/user-font-proxy.pdf.ref.png | Bin 0 -> 18111 bytes + test/user-font-proxy.ps2.ref.png | Bin 0 -> 8171 bytes + test/user-font-proxy.ps3.ref.png | Bin 0 -> 8171 bytes + test/user-font-proxy.ref.png | Bin 0 -> 18121 bytes + test/user-font-proxy.svg11.ref.png | Bin 0 -> 17902 bytes + test/user-font-proxy.svg12.ref.png | Bin 0 -> 17902 bytes + test/user-font-ps2-ref.png | Bin 5043 -> 0 bytes + test/user-font-ps3-ref.png | Bin 5043 -> 0 bytes + test/user-font-ref.png | Bin 6183 -> 0 bytes + test/user-font-rescale-ps2-ref.png | Bin 8041 -> 0 bytes + test/user-font-rescale-ps3-ref.png | Bin 8041 -> 0 bytes + test/user-font-rescale-ref.png | Bin 15937 -> 0 bytes + test/user-font-rescale-svg11-ref.png | Bin 15741 -> 0 bytes + test/user-font-rescale-svg12-ref.png | Bin 15741 -> 0 bytes + test/user-font-rescale.ps2.ref.png | Bin 0 -> 8041 bytes + test/user-font-rescale.ps3.ref.png | Bin 0 -> 8041 bytes + test/user-font-rescale.ref.png | Bin 0 -> 15937 bytes + test/user-font-rescale.svg11.ref.png | Bin 0 -> 15741 bytes + test/user-font-rescale.svg12.ref.png | Bin 0 -> 15741 bytes + test/user-font-svg11-ref.png | Bin 6134 -> 0 bytes + test/user-font-svg12-ref.png | Bin 6134 -> 0 bytes + test/user-font.ps2.ref.png | Bin 0 -> 5043 bytes + test/user-font.ps3.ref.png | Bin 0 -> 5043 bytes + test/user-font.ref.png | Bin 0 -> 6183 bytes + test/user-font.svg11.ref.png | Bin 0 -> 6134 bytes + test/user-font.svg12.ref.png | Bin 0 -> 6134 bytes + test/xlib-expose-event-ref.png | Bin 40736 -> 0 bytes + test/xlib-expose-event.c | 4 +- + test/xlib-expose-event.ref.png | Bin 0 -> 40736 bytes + test/xlib-surface-source-ps2-ref.png | Bin 376 -> 0 bytes + test/xlib-surface-source-ps3-ref.png | Bin 376 -> 0 bytes + test/xlib-surface-source-ref.png | Bin 268 -> 0 bytes + test/xlib-surface-source.ps2.ref.png | Bin 0 -> 376 bytes + test/xlib-surface-source.ps3.ref.png | Bin 0 -> 376 bytes + test/xlib-surface-source.ref.png | Bin 0 -> 268 bytes + test/zero-alpha-ref.png | Bin 115 -> 0 bytes + test/zero-alpha.ref.png | Bin 0 -> 115 bytes + 1412 files changed, 782 insertions(+), 752 deletions(-) + +commit e90073f7ddc6f461a935bc360c409b04f1fe9f74 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 3 16:38:03 2008 +0100 + + [test] Build test suite into single binary. + + Avoid calling libtool to link every single test case, by building just one + binary from all the sources. + + This binary is then given the task of choosing tests to run (based on user + selection and individual test requirement), forking each test into its own + process and accumulating the results. + + Makefile.am | 1 + + boilerplate/cairo-boilerplate.c | 658 +++++++++------- + boilerplate/cairo-boilerplate.h | 1 + + build/configure.ac.noversion | 12 + + build/configure.ac.system | 57 ++ + build/configure.ac.version | 8 - + configure.ac | 16 + + doc/public/tmpl/cairo-surface.sgml | 1 + + test/.gitignore | 237 +----- + test/Makefile.am | 572 +++++++------- + test/README | 28 +- + test/a1-image-sample.c | 20 +- + test/a1-mask.c | 38 +- + test/a1-traps-sample.c | 20 +- + test/a8-mask.c | 37 +- + test/alpha-similar.c | 23 +- + test/big-line.c | 22 +- + test/big-trap.c | 22 +- + test/bilevel-image.c | 20 +- + test/bitmap-font.c | 22 +- + test/cairo-test-private.h | 74 ++ + test/cairo-test-runner.c | 907 ++++++++++++++++++++++ + test/cairo-test.c | 594 +++++++------- + test/cairo-test.h | 99 ++- + test/caps-joins-alpha.c | 26 +- + test/caps-joins.c | 27 +- + test/caps-sub-paths.c | 21 +- + test/clip-all.c | 21 +- + test/clip-empty.c | 20 +- + test/clip-fill-rule-pixel-aligned.c | 22 +- + test/clip-fill-rule.c | 20 +- + test/clip-nesting.c | 20 +- + test/clip-operator.c | 21 +- + test/clip-push-group.c | 20 +- + test/clip-twice.c | 20 +- + test/clip-zero.c | 20 +- + test/clipped-group.c | 20 +- + test/clipped-surface.c | 19 +- + test/close-path.c | 18 +- + test/composite-integer-translate-over-repeat.c | 20 +- + test/composite-integer-translate-over.c | 22 +- + test/composite-integer-translate-source.c | 22 +- + test/copy-path.c | 33 +- + test/create-for-stream.c | 53 +- + test/create-from-png-stream.c | 20 +- + test/create-from-png.c | 82 +- + test/dash-caps-joins.c | 26 +- + test/dash-curve.c | 20 +- + test/dash-no-dash.c | 20 +- + test/dash-offset-negative.c | 20 +- + test/dash-scale.c | 26 +- + test/dash-state.c | 22 +- + test/dash-zero-length.c | 20 +- + test/degenerate-arc.c | 20 +- + test/degenerate-dash.c | 20 +- + test/degenerate-path.c | 21 +- + test/degenerate-pen.c | 20 +- + test/device-offset-fractional.c | 20 +- + test/device-offset-positive.c | 20 +- + test/device-offset-scale.c | 21 +- + test/device-offset.c | 20 +- + test/extend-pad.c | 20 +- + test/extend-reflect-similar.c | 22 +- + test/extend-reflect.c | 22 +- + test/extend-repeat-similar.c | 22 +- + test/extend-repeat.c | 22 +- + test/fallback-resolution.c | 28 +- + test/fill-alpha-pattern.c | 20 +- + test/fill-alpha.c | 20 +- + test/fill-and-stroke-alpha-add.c | 20 +- + test/fill-and-stroke-alpha.c | 20 +- + test/fill-and-stroke.c | 20 +- + test/fill-degenerate-sort-order.c | 20 +- + test/fill-missed-stop.c | 19 +- + test/fill-rule.c | 20 +- + test/filter-bilinear-extents.c | 22 +- + test/filter-nearest-offset.c | 21 +- + test/filter-nearest-transformed.c | 19 +- + test/finer-grained-fallbacks.c | 20 +- + test/font-face-get-type.c | 28 +- + test/font-matrix-translation.c | 20 +- + test/font-options.c | 17 +- + test/ft-font-create-for-ft-face.c | 21 +- + test/ft-show-glyphs-positioning.c | 20 +- + test/ft-show-glyphs-table.c | 21 +- + test/ft-text-antialias-none.c | 20 +- + test/ft-text-vertical-layout-type1.c | 23 +- + test/ft-text-vertical-layout-type3.c | 20 +- + test/get-and-set.c | 20 +- + test/get-clip.c | 21 +- + test/get-group-target.c | 20 +- + test/get-path-extents.c | 20 +- + test/get-xrender-format.c | 35 +- + test/glyph-cache-pressure.c | 20 +- + test/gradient-alpha.c | 20 +- + test/gradient-constant-alpha.c | 20 +- + test/gradient-zero-stops.c | 22 +- + test/group-paint.c | 20 +- + test/huge-pattern.c | 21 +- + test/image-surface-source.c | 8 +- + test/in-fill-empty-trapezoid.c | 24 +- + test/in-fill-trapezoid.c | 20 +- + test/infinite-join.c | 22 +- + test/invalid-matrix.c | 20 +- + test/large-clip.c | 22 +- + test/large-font.c | 22 +- + test/large-source.c | 20 +- + test/leaky-dash.c | 22 +- + test/leaky-dashed-rectangle.c | 20 +- + test/leaky-dashed-stroke.c | 20 +- + test/leaky-polygon.c | 20 +- + test/line-width-scale.c | 20 +- + test/line-width-zero.c | 20 +- + test/line-width.c | 20 +- + test/linear-gradient-reflect.c | 21 +- + test/linear-gradient.c | 20 +- + test/long-dashed-lines.c | 20 +- + test/long-lines.c | 24 +- + test/make-cairo-test-constructors.pl | 18 + + test/mask-alpha.c | 20 +- + test/mask-ctm.c | 21 +- + test/mask-surface-ctm.c | 20 +- + test/mask-transformed-image.c | 19 +- + test/mask-transformed-similar.c | 19 +- + test/mask.c | 23 +- + test/meta-surface-pattern.c | 20 +- + test/miter-precision.c | 22 +- + test/move-to-show-surface.c | 20 +- + test/multi-page.c | 30 +- + test/new-sub-path.c | 22 +- + test/nil-surface.c | 20 +- + test/operator-alpha.c | 21 +- + test/operator-clear.c | 20 +- + test/operator-source.c | 20 +- + test/operator.c | 21 +- + test/over-above-source.c | 20 +- + test/over-around-source.c | 20 +- + test/over-below-source.c | 20 +- + test/over-between-source.c | 20 +- + test/paint-repeat.c | 20 +- + test/paint-source-alpha.c | 20 +- + test/paint-with-alpha.c | 20 +- + test/paint.c | 20 +- + test/pattern-get-type.c | 21 +- + test/pattern-getters.c | 20 +- + test/pdf-features.c | 31 +- + test/pdf-surface-source.c | 10 +- + test/pixman-rotate.c | 20 +- + test/png.c | 56 +- + test/ps-features.c | 29 +- + test/ps-surface-source.c | 10 +- + test/pthread-show-text.c | 41 +- + test/push-group.c | 20 +- + test/radial-gradient.c | 22 +- + test/random-intersections.c | 21 +- + test/rectangle-rounding-error.c | 22 +- + test/rectilinear-fill.c | 20 +- + test/rectilinear-miter-limit.c | 20 +- + test/rectilinear-stroke.c | 21 +- + test/reflected-stroke.c | 21 +- + test/rel-path.c | 20 +- + test/rgb24-ignore-alpha.c | 20 +- + test/rotate-image-surface-paint.c | 22 +- + test/scale-down-source-surface-paint.c | 20 +- + test/scale-source-surface-paint.c | 20 +- + test/select-font-face.c | 28 +- + test/select-font-no-show-text.c | 20 +- + test/self-copy-overlap.c | 22 +- + test/self-copy.c | 20 +- + test/self-intersecting.c | 22 +- + test/set-source.c | 20 +- + test/show-glyphs-many.c | 20 +- + test/show-text-current-point.c | 22 +- + test/skew-extreme.c | 20 +- + test/smask-fill.c | 20 +- + test/smask-image-mask.c | 20 +- + test/smask-mask.c | 20 +- + test/smask-paint.c | 20 +- + test/smask-stroke.c | 20 +- + test/smask-text.c | 20 +- + test/smask.c | 20 +- + test/solid-pattern-cache-stress.c | 20 +- + test/source-clip-scale.c | 20 +- + test/source-clip.c | 20 +- + test/source-surface-scale-paint.c | 20 +- + test/spline-decomposition.c | 20 +- + test/stroke-ctm-caps.c | 20 +- + test/stroke-image.c | 20 +- + test/surface-finish-twice.c | 20 +- + test/surface-pattern-big-scale-down.c | 20 +- + test/surface-pattern-scale-down-pdf-rgb24-ref.png | Bin 0 -> 2386 bytes + test/surface-pattern-scale-down.c | 21 +- + test/surface-pattern-scale-up.c | 21 +- + test/surface-pattern.c | 24 +- + test/surface-source.c | 15 +- + test/svg-clip.c | 26 +- + test/svg-surface-source.c | 11 +- + test/svg-surface.c | 26 +- + test/text-antialias-gray.c | 20 +- + test/text-antialias-none.c | 20 +- + test/text-antialias-subpixel.c | 20 +- + test/text-cache-crash.c | 40 +- + test/text-glyph-range-ps2-ref.png | Bin 0 -> 1389 bytes + test/text-glyph-range-ps3-ref.png | Bin 0 -> 1389 bytes + test/text-glyph-range-ref.png | Bin 1810 -> 2211 bytes + test/text-glyph-range-rgb24-ref.png | Bin 1645 -> 0 bytes + test/text-glyph-range.c | 62 +- + test/text-pattern.c | 54 +- + test/text-rotate.c | 22 +- + test/text-transform.c | 22 +- + test/text-zero-len.c | 20 +- + test/toy-font-face.c | 16 +- + test/transforms.c | 20 +- + test/translate-show-surface.c | 20 +- + test/trap-clip.c | 22 +- + test/truetype-tables.c | 18 +- + test/twin.c | 20 +- + test/unantialiased-shapes.c | 20 +- + test/unbounded-operator.c | 20 +- + test/user-data.c | 17 +- + test/user-font-mask.c | 28 +- + test/user-font-proxy.c | 28 +- + test/user-font-rescale.c | 20 +- + test/user-font.c | 28 +- + test/xlib-expose-event.c | 28 +- + test/xlib-surface-source.c | 8 +- + test/xlib-surface.c | 36 +- + test/zero-alpha.c | 20 +- + 228 files changed, 3770 insertions(+), 4123 deletions(-) + +commit 8457972d40088cda165f31fdd7bd9b4c19c6e095 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 02:16:54 2008 +0000 + + [type3] Whitespace. + + Tightly scope the output stream. + + src/cairo-type3-glyph-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 08f4d49a9464bc19bc2ca7f2356a6eb8d62f5daf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 02:03:41 2008 +0000 + + [xlib] Intialise clip_dirty. + + Eeek, forgot to set the clip_dirty to 0 on construction. + + src/cairo-xlib-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit b722d5b2b988d43931648d8377a9433d75f7d95f +Merge: 05fce5b 710f7d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 02:24:25 2008 +0000 + + Merge branch '1.8' + +commit 710f7d30d348517602293f123525aef7677d69cf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 31 02:14:53 2008 +0000 + + [scaled-font] Fix typo that prevented meta_surface lookup. + + test/text-glyph-range was crashing since we requested the meta_surface but + the glyph wrongly believed it already had the meta_surface but was + checking for a path instead. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 05fce5bced9718ffa803f5a87df00f96809d1f53 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Apr 5 13:32:51 2008 +1030 + + PS/PDF: Set image Interpolation flag + + If the filter mode is anything other than DEFAILT, FAST or NEAREST set the + Interpolate flag in the image dictionary so that a smoothing filter is + applied when rasterising the vector file. + + As we have no control over the implementation of the Interpolate filter + (the PS/PDF specifications leave it undefined) we need to capture the + output of poppler/GS and update our reference images. (For a couple of + tests, the filtering is irrelevant so for those we set the filter to + NEAREST.) + + Note that GhostScript's Interpolate filter does not work on rotated images + (and a variety of other transformations) so several of the PS reference + images have use nearest-neighbour sampling instead of a bilinear filter. + + src/cairo-pdf-surface.c | 28 +++++++++-- + src/cairo-ps-surface.c | 28 +++++++++-- + test/Makefile.am | 54 +++++++++++++++------ + test/bilevel-image.c | 1 + + test/composite-integer-translate-over-ps2-ref.png | Bin 0 -> 15783 bytes + test/composite-integer-translate-over-ps3-ref.png | Bin 0 -> 15783 bytes + ...osite-integer-translate-over-repeat-ps2-ref.png | Bin 0 -> 448 bytes + ...osite-integer-translate-over-repeat-ps3-ref.png | Bin 0 -> 448 bytes + .../composite-integer-translate-source-ps2-ref.png | Bin 0 -> 15783 bytes + .../composite-integer-translate-source-ps3-ref.png | Bin 0 -> 15783 bytes + test/create-from-png-stream.c | 1 + + test/create-from-png.c | 1 + + test/device-offset-fractional-ps2-ref.png | Bin 201 -> 200 bytes + test/device-offset-fractional-ps3-ref.png | Bin 201 -> 200 bytes + test/extend-reflect-ps2-ref.png | Bin 153322 -> 146990 bytes + test/extend-reflect-ps3-ref.png | Bin 153322 -> 146990 bytes + test/extend-reflect-similar-ps2-ref.png | Bin 153322 -> 146990 bytes + test/extend-reflect-similar-ps3-ref.png | Bin 153322 -> 146990 bytes + test/extend-repeat-ps2-ref.png | Bin 0 -> 119246 bytes + test/extend-repeat-ps3-ref.png | Bin 0 -> 119246 bytes + test/extend-repeat-similar-ps2-ref.png | Bin 0 -> 119246 bytes + test/extend-repeat-similar-ps3-ref.png | Bin 0 -> 119246 bytes + test/filter-bilinear-extents-ps2-ref.png | Bin 173 -> 556 bytes + test/filter-bilinear-extents-ps3-ref.png | Bin 173 -> 556 bytes + test/image-surface-source-ps2-ref.png | Bin 0 -> 376 bytes + test/image-surface-source-ps3-ref.png | Bin 0 -> 376 bytes + test/image-surface-source-ref.png | Bin 268 -> 332 bytes + test/stroke-image-ps2-ref.png | Bin 1786 -> 2121 bytes + test/stroke-image-ps3-ref.png | Bin 1786 -> 2121 bytes + test/surface-pattern-pdf-argb32-ref.png | Bin 14880 -> 0 bytes + test/surface-pattern-pdf-ref.png | Bin 0 -> 15996 bytes + test/surface-pattern-ps2-argb32-ref.png | Bin 2520 -> 0 bytes + test/surface-pattern-ps2-ref.png | Bin 0 -> 2364 bytes + test/surface-pattern-ps3-argb32-ref.png | Bin 2520 -> 0 bytes + test/surface-pattern-ps3-ref.png | Bin 0 -> 2364 bytes + test/surface-pattern-scale-down-pdf-argb32-ref.png | Bin 1565 -> 2386 bytes + test/surface-pattern-scale-down-ps2-argb32-ref.png | Bin 1400 -> 0 bytes + test/surface-pattern-scale-down-ps2-ref.png | Bin 0 -> 1324 bytes + test/surface-pattern-scale-down-ps3-argb32-ref.png | Bin 1400 -> 0 bytes + test/surface-pattern-scale-down-ps3-ref.png | Bin 0 -> 1324 bytes + test/surface-pattern-scale-down.c | 3 +- + test/surface-pattern-scale-up-pdf-argb32-ref.png | Bin 3886 -> 4247 bytes + test/surface-pattern-scale-up-pdf-rgb24-ref.png | Bin 0 -> 4247 bytes + test/surface-pattern-scale-up-ps2-argb32-ref.png | Bin 1011 -> 0 bytes + test/surface-pattern-scale-up-ps2-ref.png | Bin 0 -> 943 bytes + test/surface-pattern-scale-up-ps3-argb32-ref.png | Bin 1011 -> 0 bytes + test/surface-pattern-scale-up-ps3-ref.png | Bin 0 -> 943 bytes + test/surface-pattern-scale-up-ref.png | Bin 3825 -> 4061 bytes + test/surface-pattern-scale-up.c | 6 ++- + test/surface-pattern.c | 6 ++- + test/xlib-surface-source-ps2-ref.png | Bin 0 -> 376 bytes + test/xlib-surface-source-ps3-ref.png | Bin 0 -> 376 bytes + 52 files changed, 98 insertions(+), 30 deletions(-) + +commit 2c53bdb82a955c672c8fee2b1b4c991af2654ae0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 21:12:53 2008 +0100 + + [paginated] Emit fallback images using FILTER_NEAREST. + + Fallback images should (in theory) be emitted at native resolution, so + disable filtering to avoid introducing potential artifacts into cairo's + ideal output. + + src/cairo-paginated-surface.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit f03d3f9f7f923730cdc4c5f21364f752f705086a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 19:24:29 2008 +0000 + + [boilerplate] Remove #if VERSION>1.9.0 + + Remove the obsolete #if statement. + + boilerplate/cairo-boilerplate.c | 2 -- + 1 file changed, 2 deletions(-) + +commit ef98eb26f7484019b023cd4c93dce44f23e3a594 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 19:23:17 2008 +0000 + + [test] Reenable device offset testing. + + Restore device offset testing that was temporarily disable in the run up + to the 1.8 release. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4f2f46ef1bd793a712df045178b3d00d027e3ba6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 19:14:07 2008 +0000 + + Restore the ability to choose the internal font. + + Behdad wants to include the feature with 1.10, so we enable it as early as + possible in 1.9 dev cycle to generate as much feedback as possible. + + The first change is to use "<cairo>" as being a name unlikely to clash + with any real font names. + + This reverts commits: + a824d284be23793a5c48b9ae833dcb7b2d5fff80, + 292233685534aed712dfd45e8ccf498b792ce496, + e0046aaf417a61da008dc6374871fa3687ba94ab, + f534bd549e1e2283735d1eabb60c015a5949a735. + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/twin.c | 50 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-font-face.c | 6 +++-- + src/cairoint.h | 1 + + test/.gitignore | 1 + + test/Makefile.am | 6 +++++ + test/twin-ps2-ref.png | Bin 0 -> 1167 bytes + test/twin-ps3-ref.png | Bin 0 -> 1167 bytes + test/twin-ref.png | Bin 0 -> 1836 bytes + test/twin-svg11-ref.png | Bin 0 -> 1773 bytes + test/twin-svg12-ref.png | Bin 0 -> 1773 bytes + test/twin.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ + 14 files changed, 125 insertions(+), 2 deletions(-) + +commit 52c3fc58b52c77282998f9ad75657a6bec5956f8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 13:04:37 2008 +0100 + + [tessellator] Simplify dequeuing by using a sentinel value. + + Instead of maintaining an index and comparing it to the count, just mark + the last startstop event with NULL and stop dequeuing events upon seeing + that sentinel value. (Removes an unreadable line, and cachegrind hints + that it may be a tiny bit faster.) + + src/cairo-bentley-ottmann.c | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit ef9e0a5d1d74ac92a1fcde5a657c866a8e6509e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 22:09:37 2008 +0100 + + [tessellator] Use a combsort for sorting the event queue. + + In my experiments using cairo-perf, the inlined combsort is ~20% quicker + than the library qsort. + + src/Makefile.sources | 1 + + src/cairo-bentley-ottmann.c | 39 ++++++++++++------------ + src/cairo-combsort-private.h | 71 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 92 insertions(+), 19 deletions(-) + +commit b1461308416fa83d1de0016a9d4804b68a1f1d8f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Oct 30 14:18:18 2008 -0400 + + [Makefile.am.releasing] Symlink /manual and /cairo-manual.tar.gz only for releases + + And not for snapshots. Also symlink /cairo-manual-X.Y.Z.tar.gz for all + versions. + + build/Makefile.am.releasing | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit e3a7f522a6b96729b2a0122f8c430c24dc17fc5a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 23:33:32 2008 +0100 + + [tessellator] Perform cheap checks before computing intersect. + + First check if we can reject the intersection without having to perform + the full divides, based on analysing: + t * (ady*bdx - bdy*adx) = bdy * (ax - bx) - bdx * (ay - by) + s * (ady*bdx - bdy*adx) = ady * (ax - bx) - adx * (ay - by) + and excluding the result if by inspection we know that + (s, t) <= 0 || (s, t) => 1. + + Doing so virtually eliminates all division and speeds up the strokes (when + performing self-intersection elimination using the tessellator) perf cases + by about 5%. + + src/cairo-bentley-ottmann.c | 51 ++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 50 insertions(+), 1 deletion(-) + +commit 553fde4bb3e913de7e26bf416166d69bae4d02e1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 4 13:15:08 2008 +0100 + + [tessellator] Simplify special cases of edges to compare. + + Use our prior knowledge of the inputs and trivial conditions to simplify + the edge equations and in many common conditions, such as vertical edges + and common points, reduce the operations down to a just returning the + non-degenerate 32 bit value. This adds an overhead of a few conditionals, + but on the fast paths we actually generate fewer branches and many fewer + arithmetic operations such that it improves performance of the fill + performance tests by around 10%. + + src/cairo-bentley-ottmann.c | 132 +++++++++++++++++++++++++++++++++++--------- + 1 file changed, 106 insertions(+), 26 deletions(-) + +commit cc109df2a70e953d71e3e6fc4e6e54cce4ba0d47 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 15:50:20 2008 +0000 + + [test] Update .gitignore + + Add a couple of new programs to gitignore. + + test/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7d546bba213c3b89404bb3c58a5665343abfcd51 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 29 15:46:10 2008 +0000 + + [xlib] Eliminate shadowed variable. + + Cleanup a minor -Wshadow warning. + + src/cairo-xlib-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e3388b8180e38f79e0d5b66cc640c3d5c37db2a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 29 15:45:09 2008 +0000 + + [cff-subset] Eliminate shadowed variable. + + Cleanup a minor -Wshadow warning. + + src/cairo-cff-subset.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3e18114aff21acfa73a7d13a419719375ae9b5a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 29 15:43:23 2008 +0000 + + [user-font] Eliminate shadowed variable + + Cleanup a minor -Wshadow warning. + + src/cairo-user-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit d073537e82b57738068a7e1cf1d36ce452876804 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 29 15:41:44 2008 +0000 + + [scaled-font] Eliminate shadowed variable. + + Cleanup a minor -Wshadow warning. + + src/cairo-scaled-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit 6429e3f39468ef4f865681b3b5988d35906deeb0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 17:38:09 2008 +0000 + + [xlib] Only set Picture clip as necessary. + + Only set ClipRectangles on a new Picture, avoiding redundant calls to + clear the non-existent ClipMask otherwise. + + src/cairo-xlib-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit cd45258c5bf6a06f7bd3f2bfaf928e423a9b70e1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 16:54:10 2008 +0000 + + [xlib] Only clear the GC clip mask as necessary. + + Avoid redundant calls to XSetClipMask() for clean GCs. + + src/cairo-xlib-private.h | 10 ++++++++-- + src/cairo-xlib-screen.c | 8 ++++++-- + src/cairo-xlib-surface.c | 7 ++++--- + 3 files changed, 18 insertions(+), 7 deletions(-) + +commit d384f864992fbf7513446a70158135a08e704678 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 16:33:51 2008 +0000 + + [xlib] Propagate real status from get_screen_info(). + + Return the real error from _cairo_xlib_screen_info_get() in order to avoid + having to create a fake NO_MEMORY error. + + src/cairo-xlib-private.h | 6 +++-- + src/cairo-xlib-screen.c | 66 +++++++++++++++++++++++++++--------------------- + src/cairo-xlib-surface.c | 6 ++--- + 3 files changed, 44 insertions(+), 34 deletions(-) + +commit e25b106e9c33e220fb104afb0929e766647b6de9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 16:27:58 2008 +0000 + + [xlib] Propagate real status from get_display() + + Avoid throwing away the error and inventing a new NO_MEMORY error for + _cairo_xlib_display_get(). + + src/cairo-xlib-display.c | 13 ++++++++----- + src/cairo-xlib-private.h | 4 ++-- + src/cairo-xlib-surface.c | 14 ++++++++------ + 3 files changed, 18 insertions(+), 13 deletions(-) + +commit 2555f83b11ee23829cfdeaae703420ca3e572fa1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 16:22:49 2008 +0000 + + [xlib] Avoid repeated calls to XRenderQueryVersion + + Use the value determined during display initialisation in order to avoid + redundant XRenderQueryFormats requests. + + src/cairo-xlib-display.c | 6 ++++-- + src/cairo-xlib-private.h | 2 ++ + src/cairo-xlib-surface.c | 7 ++----- + 3 files changed, 8 insertions(+), 7 deletions(-) + +commit 0d0c6a199c5b631299c72dce80d66ac0f4936a64 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 26 12:53:29 2008 +0000 + + [matrix] Optimise invert for simple scaling|translation matrices. + + The matrix is quite often just a simple scale and translate (or even + identity!). For this class of matrix, we can skip the full adjoint + rearrangement and determinant calculation and just compute the inverse + directly. + + src/cairo-matrix.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +commit 74876b00cd969d5cfc209fa903dfad50bda59361 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 25 11:33:52 2008 +0100 + + [xlib] Exploit compaction of XRenderFillRectangle() + + libXrender amalgamates sequences of XRenderFillRectangle() into a single + XRenderFillRectangles request (when permissible). Since it is common for a + cairo application to draw rectangles individually in order to exploit fast + paths within cairo [rectilinear fills], it is a reasonably common pattern. + + src/cairo-xlib-surface.c | 50 +++++++++++++++++++++++++++++++----------------- + 1 file changed, 32 insertions(+), 18 deletions(-) + +commit 64726ccfb99ba964420f3a840fd707998927e902 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 24 17:06:04 2008 +0100 + + [traps] Whitespace. + + Fixup whitespace in line with CODING_STYLE and rest of file. + + src/cairo-region.c | 6 +++--- + src/cairo-traps.c | 33 ++++++++++++++++++++------------- + 2 files changed, 23 insertions(+), 16 deletions(-) + +commit d5543005e7b7cc08f97578f301182ef4807a05fe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 24 09:00:45 2008 +0100 + + [surface] Only copy font options if the target surface has them. + + No need to copy font options if the similar surface is from the same + backend and no special options have been applied by the user. Doing so + breaks lazy initialisation of backend specific options. + + src/cairo-surface.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit a0023758104b700751ba8d7a66d75db139eea6cb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 24 08:39:29 2008 +0100 + + [xlib] Defer querying of font options until first use + + Constructing the font options cause the initialisation of Xlc and invoke + several round-trips to the X server, significantly delaying the creation + of the first surface. By deferring that operation until the first use of + fonts then we avoid that overhead for very simple applications (like the + test suite) and should improve start-up latency for larger application. + + src/cairo-xlib-private.h | 4 ++++ + src/cairo-xlib-screen.c | 28 +++++++++++++++++++++++++--- + src/cairo-xlib-surface.c | 2 +- + 3 files changed, 30 insertions(+), 4 deletions(-) + +commit 6706590d4e7ad19dae0b8e3efe6f573d5688e19a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 16:22:48 2008 +0100 + + [pattern] Reduce likelihood of range overflow with large downscaling. + + Exploit the auxiliary offset vector in the attributes to reduce + likelihood of range overflow in the translation components when converting + the pattern matrix to fixed-point pixman_matrix_t. + + An example of this is bug 9148 + Bug 9148 - invalid rendering when painting large scaled-down surfaces + (https://bugs.freedesktop.org/show_bug.cgi?id=9148) + but the issue is perhaps even more likely with high resolution fallback + images. + + src/cairo-pattern.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit c0af8c70635d641fc5770afc0cd6e9285122fd72 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 16:49:23 2008 +0100 + + [pattern] Tweak REFLECT HACK + + In order to workaound a directfb bug, tweak the reflect->repeat pattern so + that it covers the destination rectangle. Although the number of paint() + increases, the number of read/written pixels remain the same so that + performance should not deteriorate, but instead be improved by using a + cloned source. The early return of the REFLECT surface is discarded so + that the latter optimisations for surface sources can be applied. One side + effect of this is that acquire_source_image() is removed due to its lax + reference counting which thereby exposes the ROI optimisations for image + destinations as well. + + src/cairo-pattern.c | 279 +++++++++++++++++++++++++--------------------------- + src/cairoint.h | 1 - + 2 files changed, 136 insertions(+), 144 deletions(-) + +commit 234623b3d5884b02a0619de8ddd57bbed36ef4fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 14:55:26 2008 +0100 + + [pattern] Support unbounded surfaces. + + An unbounded surface should just report an infinite pattern extent and not + return UNSUPPORTED from _cairo_pattern_get_extents(). + + src/cairo-pattern.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2836be6f7565684e86b3cc8a3d2db4ba690b3718 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 14:42:47 2008 +0100 + + Cleanup 'status && status != UNSUPPORTED' + + Replace instances of 'status && status != UNSUPPORTED' with the more + readable _cairo_status_is_error(). + + src/cairo-analysis-surface.c | 14 +++++++------- + src/cairo-clip.c | 4 ++-- + src/cairo-pdf-surface.c | 8 ++++---- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-scaled-font-subsets.c | 4 ++-- + 5 files changed, 17 insertions(+), 17 deletions(-) + +commit 13ba43eb8ffc3bb6c8881d91824102a8df86d928 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 12:28:25 2008 +0100 + + [matrix] Optimize finding the bounding box under an orthogonal matrix. + + We frequently need to find the bounds of a pattern under an identity + matrix, or a simple scale+translation. For these cases we do not need to + transform each corner and search for the bounds as the matrix is x/y + separable and so allows us to inspect the results for the extreme x/y + points independently. + + src/cairo-matrix.c | 42 +++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 41 insertions(+), 1 deletion(-) + +commit 6ed957fc242d7890117f4dea121c03ec2523470c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 22:02:05 2008 +0100 + + [gstate] Use _cairo_pattern_black for the default source. + + Avoid allocating a default source pattern by using the static black pattern + object. The one complication is that we need to ensure that the static + pattern does leak to the application, so we replace it with an allocated + solid pattern within _cairo_gstate_get_source(). + + src/cairo-gstate.c | 9 +++++++-- + src/cairo-pattern.c | 12 +++++++----- + src/cairo.c | 6 +++--- + src/cairoint.h | 2 +- + 4 files changed, 18 insertions(+), 11 deletions(-) + +commit 794460186459981cd43ca38f3eba07e3f6bf8908 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 19:24:44 2008 +0100 + + [pattern] Avoid needless copying of patterns. + + Only copy the pattern if we need to modify it, e.g. preserve a copy in a + snapshot or a soft-mask, or to modify the matrix. Otherwise we can + continue to use the original pattern and mark it as const in order to + generate compiler warnings if we do attempt to write to it. + + src/cairo-analysis-surface.c | 37 +++---- + src/cairo-directfb-surface.c | 33 +++---- + src/cairo-glitz-surface.c | 42 ++++---- + src/cairo-gstate.c | 117 ++++++++++++++-------- + src/cairo-image-surface.c | 6 +- + src/cairo-meta-surface.c | 12 +-- + src/cairo-paginated-surface.c | 12 +-- + src/cairo-pattern.c | 70 ++++++-------- + src/cairo-pdf-surface.c | 88 +++++++++++------ + src/cairo-ps-surface.c | 39 ++++---- + src/cairo-quartz-surface.c | 10 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-sdl-surface.c | 22 ++--- + src/cairo-surface-fallback-private.h | 45 ++++----- + src/cairo-surface-fallback.c | 65 ++++++------- + src/cairo-surface.c | 181 +++++++++++++++++++++-------------- + src/cairo-svg-surface.c | 50 +++++----- + src/cairo-type3-glyph-surface.c | 18 ++-- + src/cairo-win32-font.c | 26 ++--- + src/cairo-win32-printing-surface.c | 51 +++++----- + src/cairo-win32-private.h | 2 +- + src/cairo-win32-surface.c | 6 +- + src/cairo-xcb-surface.c | 42 ++++---- + src/cairo-xlib-surface.c | 14 +-- + src/cairoint.h | 74 +++++++------- + src/test-meta-surface.c | 28 +++--- + src/test-paginated-surface.c | 40 ++++---- + 27 files changed, 605 insertions(+), 527 deletions(-) + +commit 9d2189afbd2aa1413f620a4d35016ef3be3fc0e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 18:29:02 2008 +0100 + + [pattern] Do not recompute the inverse if setting an identical matrix. + + More micro-optimisation. + + src/cairo-pattern.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2c277ddbea42222130b8b1c2a2b4934503b40188 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 18:17:49 2008 +0100 + + [matrix] Avoid error correction overhead for translation matrices. + + We can only correct rounding errors between cairo and pixman matrices for + scaled matrices - so skip the inversion and point transformation overhead + for simple translation matrices. + + src/cairo-matrix.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 57a1d932f3e9d79f3259a536ec2f45f020d46de5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 18:12:10 2008 +0100 + + [array] Rearrange user_data_fini() to optimize common case. + + Micro-optimisation to avoid the _cairo_array_index() for the common case + of 0 elements. + + src/cairo-array.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 2852127c72fa6cfe246e6ece0433be6c3f2a93ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 18:04:30 2008 +0100 + + [cairoint] Add a few cairo_pure. + + Start marking up the prototypes with function attributes - first the + obvious pure functions. + + src/cairoint.h | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit cf072c7203dfce989ee60e56352f548329d3d616 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 14:35:49 2008 +0000 + + [sdl] Add new backend. + + Add a new backend to allow easy interoperability with the Simple + DirectMedia Layer. + + boilerplate/Makefile.sources | 3 + + boilerplate/cairo-boilerplate-sdl-private.h | 56 ++++ + boilerplate/cairo-boilerplate-sdl.c | 69 +++++ + boilerplate/cairo-boilerplate.c | 13 + + build/configure.ac.features | 1 + + configure.ac | 8 + + src/Makefile.sources | 3 + + src/cairo-sdl-surface.c | 418 ++++++++++++++++++++++++++++ + src/cairo-sdl.h | 54 ++++ + src/cairo.h | 4 +- + 10 files changed, 628 insertions(+), 1 deletion(-) + +commit 31ada1ea15d14c0a843728b105340c270e4e4613 +Merge: 30f2df1 ab15d76 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 16:56:07 2008 +0000 + + Merge branch '1.8' + +commit ab15d7627506a837fea7101661425bb923ef5b4f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 16:54:23 2008 +0000 + + [test] Remove XFAIL from user-font-mask + + user-font-mask should PASS modulo the scaling anomalies in the external + renderers, so remove it from the XFAIL list. + + test/Makefile.am | 15 ++++++--------- + test/user-font-mask-pdf-ref.png | Bin 0 -> 1927 bytes + test/user-font-mask-ps2-ref.png | Bin 0 -> 1927 bytes + test/user-font-mask-ps3-ref.png | Bin 0 -> 1927 bytes + test/user-font-mask-svg11-ref.png | Bin 0 -> 2224 bytes + 5 files changed, 6 insertions(+), 9 deletions(-) + +commit 540f555840ba4076e3ab86669daf9bee5695afa2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 14:38:44 2008 +0100 + + [analysis] Only limit to mask extends if bounded by mask. + + The extents of cairo_mask() is only limited to the mask if the operation + is bounded by the mask. + + src/cairo-analysis-surface.c | 8 ++++++-- + test/clip-operator-pdf-argb32-ref.png | Bin 11145 -> 12125 bytes + test/clip-operator-pdf-rgb24-ref.png | Bin 6530 -> 7367 bytes + test/operator-clear-pdf-argb32-ref.png | Bin 1438 -> 1614 bytes + test/operator-clear-pdf-rgb24-ref.png | Bin 1170 -> 1402 bytes + test/operator-source-pdf-argb32-ref.png | Bin 4694 -> 5149 bytes + test/operator-source-pdf-rgb24-ref.png | Bin 3848 -> 4354 bytes + 7 files changed, 6 insertions(+), 2 deletions(-) + +commit 4b2998893930e4bab19646e6f0a0c8d2a47f12a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 14:34:30 2008 +0100 + + Review users of cairo_rectangle_int_t for incorrect unsigned promotion. + + Adrian Johnson discovered cases where we mistakenly compared the result + of unsigned arithmetic where we need signed quantities. Look for similar + cases in the users of cairo_rectangle_int_t. + + src/cairo-analysis-surface.c | 48 +++++++++++++++++++++++-------------- + src/cairo-clip.c | 43 +++++++++++++++++----------------- + src/cairo-gstate.c | 4 ++-- + src/cairo-pattern.c | 13 ++++++---- + src/cairo-rectangle.c | 6 ++++- + src/cairo-region-private.h | 3 ++- + src/cairo-region.c | 3 ++- + src/cairo-surface-fallback.c | 31 +++++++++++++++--------- + src/cairo-surface.c | 27 +++++++++++---------- + src/cairo-win32-surface.c | 4 ++-- + src/cairo-xcb-surface.c | 56 ++++++++++++++------------------------------ + src/cairo-xlib-surface.c | 52 ++++++++++++++-------------------------- + src/cairoint.h | 2 +- + 13 files changed, 144 insertions(+), 148 deletions(-) + +commit 0e4156121f05b14f800289ea34c5382de1f20869 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 13:37:41 2008 +0100 + + [rectangle] Fix unsigned promotion whilst computing intersect. + + _cairo_rectangle_intersect() incorrectly allows unsigned promotion during + its arithmetic. + + src/cairo-rectangle.c | 31 +++++++++++++++++-------------- + src/cairoint.h | 3 ++- + 2 files changed, 19 insertions(+), 15 deletions(-) + +commit 2464b8a0a9f7db7421c257eb4e3ac0d98af34761 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 13:36:19 2008 +0100 + + [pattern] Allow the projected surface extents to be negative. + + In order to handle projection of analysis surface with user-fonts we need + to accommodate patterns extending into negative coordinate space. + + src/cairo-pattern.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d5d29075bdbb7f412fa6dc182573da18fd81af54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 23 15:24:13 2008 +0100 + + [gstate] Allocate temporary variable for backend_to_user transform. + + _cairo_gstate_backend_to_user_rectangle() requires that its input + arguments are non-NULL and describe the input rectangle to be transformed. + However, we were passing through output parameters from the public API + which were allowed to be NULL. So we need to allocate temporary variables + in which to compute the output rectangle, but only copy them as required. + + src/cairo-gstate.c | 69 +++++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 50 insertions(+), 19 deletions(-) + +commit 30f2df1dec419a10408b53ecd26cebfcf607bf27 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 30 08:40:35 2008 -0700 + + Fix typo in bug URL. + + Thanks to AndrewR in IRC for pointing out the typo. + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b598dcd1b1726184506de6a9d253f6091a000922 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 30 08:29:51 2008 -0700 + + Fix release-publish to also update the current manual. + + That is, the vesion that appears as: + + http://cairographics.org/manual + and: + http://cairographics.org/cairo-manual.tar.gz + + It was silly that we previously required a manual step to + upload the documentation (which we regularly forgot to do) + and that it uploaded with a date in the name rather than a + version. So we just drop the old doc-publish Makefile target + now as it's just not useful anymore. + + RELEASING | 3 ++- + build/Makefile.am.releasing | 18 ++++-------------- + 2 files changed, 6 insertions(+), 15 deletions(-) + +commit 91183a503e3b7bed11e0149783d3974e26daf623 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 30 08:26:55 2008 -0700 + + RELEASING: Mention that a versioned manual is uploaded. + + RELEASING | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5037fa238e820419824773fa2ea475c949e23a8c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 30 08:23:06 2008 -0700 + + Increment version to 1.9.1 + + We're finalyl opening the 1.9 development series in order to land + lots of exciting new features that people have been working on. + + cairo-version.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d53537e8b5e3a8345983d8a0529cb230fa2886d1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 30 08:20:59 2008 -0700 + + Increment version to 1.8.3 after the 1.8.2 release. + + Thanks to Chris Wilson (who else?) for the last-minute bug fix. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f7c958d97221375fdcbb6c58c3b58c07676b7589 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 21:02:04 2008 -0700 + + Increment cairo version to 1.8.2. + + Hurrah! We're finally there. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42711a5586cba5db5451ce2400ee5fe655700391 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 09:54:47 2008 +0000 + + [xlib] Fix _draw_image_surface() with opaque images. + + If the image was opaque with no alpha channel, we filled the output alpha + with 0. Typically, the destination surface for dithering is an RGB window, + so this bug went unnoticed. However, test/xlib-expose-event is an example + where we generate an intermediate alpha-only pixmap for use as a stencil + and this was failing as the mask was left completely transparent. The + simple solution is to ensure that for opaque images, the output alpha is + set to the maximum permissible value. + + src/cairo-xlib-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit c3940d342ac506055c2ce6b7e9b27f92d8a63999 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 09:59:48 2008 +0000 + + [xlib] whitespace + + Tweak the whitespace to lose some unnecessary line wrapping, casts and + blanks. + + src/cairo-xlib-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit e51648b601de274559800c63575c7f7e0288f596 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Oct 30 04:43:45 2008 -0400 + + [test/xlib-expose-event] Save the output image to disk + + test/xlib-expose-event.c | 1 + + 1 file changed, 1 insertion(+) + +commit f534bd549e1e2283735d1eabb60c015a5949a735 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 21:28:56 2008 -0700 + + Remove test/twin-ref.png. + + I missed this in a previous commit, (I think I had used a + pattern of twin-*-ref.png which of course didn't match + this file). + + test/twin-ref.png | Bin 1836 -> 0 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit cf97966c07bc64ff4b169d1d8239407883a26747 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 21:01:01 2008 -0700 + + NEWS: Finish the entry for the 1.8.2 release. + + Add some summarizing paragraphs and organize bug-fixes and optimizations + into separate sections. + + NEWS | 89 ++++++++++++++++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 60 insertions(+), 29 deletions(-) + +commit b6741cffef6e86d59fa4809d32de14b9c5e8afbf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 01:15:45 2008 +0000 + + [NEWS] Spot another couple of typos. + + Proof-reading is difficult, even with the squiggly lines. + + NEWS | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d20cc827791e177eb73a9003c6704b7a5bc49f71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 30 01:06:08 2008 +0000 + + [NEWS] Correct a couple of typos. + + Whilst Carl's not looking, fix a couple of typos -- in particular the one + calling me a bug! ;-) + + NEWS | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 0ceda81dfdfc4adcec28c71be7822caa0627d818 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 17:38:36 2008 -0700 + + NEWS: Add long list of bugs fixed for 1.8.2. + + (Still need to add a paragraph or two summarizing the release.) + + NEWS | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 110 insertions(+) + +commit e0046aaf417a61da008dc6374871fa3687ba94ab +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 16:25:00 2008 -0700 + + Remove twin perf case. + + This performance test relied on the recently-removed ability + to select the internal twin-based font family with a name of + "cairo". + + Presumably, we'll want to bring this performance case back when + some other means of requesting that font face is added. + + perf/Makefile.am | 1 - + perf/cairo-perf.c | 1 - + perf/cairo-perf.h | 1 - + perf/twin.c | 50 -------------------------------------------------- + 4 files changed, 53 deletions(-) + +commit 292233685534aed712dfd45e8ccf498b792ce496 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 16:25:00 2008 -0700 + + Remove twin test case. + + This test relied on the recently-removed ability to select + the internal twin-based font family with a name of "cairo". + + Presumably, we'll want to bring this test case back when + some other means of requesting that font face is added. + + test/.gitignore | 1 - + test/Makefile.am | 6 ----- + test/twin-ps2-ref.png | Bin 1167 -> 0 bytes + test/twin-ps3-ref.png | Bin 1167 -> 0 bytes + test/twin-svg11-ref.png | Bin 1773 -> 0 bytes + test/twin-svg12-ref.png | Bin 1773 -> 0 bytes + test/twin.c | 60 ------------------------------------------------ + 7 files changed, 67 deletions(-) + +commit a824d284be23793a5c48b9ae833dcb7b2d5fff80 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 16:21:42 2008 -0700 + + Remove the ability to select the internal font face with a name of "cairo". + + It's not fair to steal this name from the namespace of family names. + There are definitely cairo.ttf files that exist out there, and people + may already be using these, (or may use them in the future), with + cairo_select_font_face and a family name of "cairo". + + In place of this, we'll want to come up with some other new, and + documented API for selecting the internal font face. + + src/cairo-font-face.c | 6 ++---- + src/cairoint.h | 1 - + 2 files changed, 2 insertions(+), 5 deletions(-) + +commit f039da8d9172a6fb60082901c8dc56c7159ecd24 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 16:17:24 2008 -0700 + + Add doltcompile and doltlibtool to .gitignore. + + These generated files were recently added to our build system. + We definitely don't want to see them in git-status output. + + .gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 81439b3bc8656b34c13b3cc7b5b6a9f03a3c8c54 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 29 16:15:12 2008 -0700 + + Add missing files to CLEANFILES and DISTCLEANFILES. + + Without these files in these lists, "make distcheck" is unhappy. + + Makefile.am | 4 +++- + test/Makefile.am | 9 +++++++++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit dd0416f5d47a946498219616f53abdad81d4fc38 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 18:01:09 2008 -0700 + + Add recently added reference images to REFERENCE_IMAGES list. + + This is just part of the make-distcheck routine for me. I know + Behdad added a test to check for missing images in the list, but + it doesn't seem to be getting run automatically as part of + 'make test' nor 'make distcheck', (or if it it, then I'm not + noticing its output). + + test/Makefile.am | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 9cd9644c1d993f86c6eb7bee692fe642d6d280b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 29 21:56:36 2008 +0000 + + [test] Add a pass-through test. + + Check that colour values are correctly passed through all the backends. + Simple test of the most fundamental functionality. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/pass-through-ref.png | Bin 0 -> 221 bytes + test/pass-through-rgb24-ref.png | Bin 0 -> 179 bytes + test/pass-through.c | 99 ++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 103 insertions(+) + +commit cec689eab628b59ee1d69e241c5d336760304ea0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 17:18:34 2008 -0700 + + RELEASING: Suggest running 'make distcheck' against Xvfb. + + This avoids hitting driver-specific bugs in the X server, and is + better than doing 'DISPLAY= make distcheck' which simply disables + all xlib testing completely. + + RELEASING | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 0ca6ba18e398db7ed8f8bca5faa93d48aa3a4878 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 17:15:42 2008 -0700 + + Add note to test/README on running with Xvfb. + + This X server has been tested to run through the test suite with + no unexpected failures, and it avoids hitting any X-driver-specific + bugs. + + test/README | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit eed67717649c343e42ce102a4d78a245dba48925 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 17:12:15 2008 -0700 + + Disable the svg12 target in boilerplate. + + This target was added to the boilerplate during 1.8.1. It currently + shows many failures in the test suite. These failures likely fall + into three different classes: + + * Tests needing new svg12-specific reference images + + * Tests exercising bugs in librsvg + + * Tests exercising existing cairo bugs + + We haven't gone through the effort to separate these, but even for + the tests that are exercising actual cairo bugs, these are likely + bugs that existed in the cairo 1.8.0 release and not regressions. + + Because of that, in this commit I'm conditionally disabling the + testing of the svg12 target. As soon as we increment the cairo + version to 1.9.0 or higher, this target will get re-enabled + automatically and we can begin the work to separate the tests as + described above and also fix the bugs. + + boilerplate/cairo-boilerplate.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a94928ddfa066f6e6824775b9d0b6008f3fcbf26 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 15:55:38 2008 -0700 + + Add svg-specific reference images for the twin test. + + A bit annoying that I have to add the same image as both -svg11 + and -svg12 but that's all the support we have in the current + test suite. I suppose I could avoid doing that by figuring out + why this test case cannot successfully roundtrip through librsvg + and back through cairo. + + test/twin-svg11-ref.png | Bin 0 -> 1773 bytes + test/twin-svg12-ref.png | Bin 0 -> 1773 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 53554ea8892893098b29a27a23c069f0ee584a06 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 15:50:44 2008 -0700 + + Add ps2-specific reference images for trap-clip test. + + These are quite similar to the existing ps3-specific reference images. + I definitely don't see any reason why this output should be considered + a failure. + + test/trap-clip-ps2-argb32-ref.png | Bin 0 -> 5690 bytes + test/trap-clip-ps2-rgb24-ref.png | Bin 0 -> 5617 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 10fd16a05d8549753179ab5cca855539fb7dec94 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 15:41:40 2008 -0700 + + Mark user-font-mask as XFAIL. + + This test is expected to fail due to a couple of known bugs. Chris + has fixes for both bugs, but is holding off on them until after 1.8.2 + to prevent introducing any possible new bugs with his fixes. + + test/Makefile.am | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 655546243f57ae2a5c1813bd45994b18061f1c74 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 15:35:35 2008 -0700 + + Rename user-font-image test to user-font-mask. + + Otherwise the reference image (user-font-image-ref.png) gets + interpreted as an image-specific reference image for the + user-font test case resulting in a bogus failure. + + test/Makefile.am | 4 +- + test/user-font-image-ref.png | Bin 6011 -> 0 bytes + test/user-font-image.c | 254 ------------------------------------------- + test/user-font-mask-ref.png | Bin 0 -> 6011 bytes + test/user-font-mask.c | 254 +++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 256 insertions(+), 256 deletions(-) + +commit 42d2d1b6d3b187b5dbdb630783d7c9bf90c66fb2 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 28 12:48:03 2008 -0700 + + Correct NEWS to say 'release' instead of 'snapshot' for 1.8.0 + + A copy-and-paste bug strikes again. + + NEWS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1327ec232cfca675647fb03876487c92fb638354 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 10:00:38 2008 +0000 + + [image] Remove invalid assert. + + The assert can fail for an error surface. + + TODO: Decide what values should be returned from getters for error + surfaces. + + src/cairo-image-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 9481d999df8d399543bdbb45b85bd24b1725bece +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 09:59:01 2008 +0000 + + [image] Check create_for_data() to ensure a valid minimum stride. + + Double check that the user is not being silly by passing in a stride that + is too small for the width. evince/poppler is one such example... + + src/cairo-image-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 88f628b3972819c0f6ce8e5f06d0f7e6abb9d661 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 28 09:11:23 2008 +0000 + + [perf] Fix rectangular case of unaligned-clip. + + Janoos spotted that the unaligned clip actually degenerated to an empty + clip due to a typo when constructing the second rectangle. Simply use a + cairo_rectangle() instead. + + perf/unaligned-clip.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit 1522805f39c505ff05231e67de5a6e6686081d46 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 27 20:57:56 2008 -0400 + + [Makefile.am.releasing] Fix typo + + build/Makefile.am.releasing | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3386794d96d2b1616af9db5b7df1fc5c7a5796a7 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 27 14:09:19 2008 -0700 + + Add creation of a versioned manual to the release-publish target. + + This arranges so that a versioned manual will be available of the form: + + http://cairographics.org/manual-X.Y.Z + + for all future releases and snapshots. We're going through the process + of manually doing all former releases, such as: + + http://cairographics.org/manual-1.2.0/ + + which the LSB folks wanted to reference. + + build/Makefile.am.releasing | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +commit a1a7ec6a056fa36389a48c0f53884ae7e92ebc1a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 27 23:13:05 2008 +1030 + + Change ps to ps3 in test/README + + The ps target no longer exists. + + test/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 670d942fe3dafbed5ceca234e760f29f793233cb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 27 23:04:16 2008 +1030 + + Change user-font-image test to use a pattern + + This can be used to expose a bug in _cairo_rectangle_intersect() by + changing: + + fixed_scale = 1024 to 1 in cairo-user-font.c + + and + + cairo_matrix_translate (&matrix, 0, -8) to (&matrix, 0, -9) in + user-font-image.c + + This will cause cairo_text_extents (cr, text, &extents) in + user-font-image.c to return a height of 8388683. + + test/user-font-image-ref.png | Bin 5502 -> 6011 bytes + test/user-font-image.c | 13 +++++++++++-- + 2 files changed, 11 insertions(+), 2 deletions(-) + +commit cdacf55e1b16a6982c681fab212405fc4af4f1db +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 27 22:07:04 2008 +1030 + + Add user-font-image test + + Draws bitmap glyphs using cairo_mask(). This test exposes a bug in the + calculation of the glyph extents. + + test/Makefile.am | 2 + + test/user-font-image-ref.png | Bin 0 -> 5502 bytes + test/user-font-image.c | 245 +++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 247 insertions(+) + +commit 22e2dac819de3c082424ebf3ce8f64c9c4797e8a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 26 10:21:37 2008 +0000 + + [stroke] Ensure we record the first face for a dashed path. + + If the first face was outside the bounds then we skipped it, and so a + close would incorrectly connect to the first visible face. + + src/cairo-path-stroke.c | 1 + + 1 file changed, 1 insertion(+) + +commit 64fb3290f00bafc4a10e6432226f669a51fa0bc6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 26 09:54:03 2008 +0000 + + [stroke] _cairo_stroker_line_to_dashed() whitespace + + A couple of comment spelling mistakes and rearrange whitespace to more + closely match CODING_STYLE. + + src/cairo-path-stroke.c | 57 +++++++++++++++++++++++++++++++++---------------- + 1 file changed, 39 insertions(+), 18 deletions(-) + +commit 88935947d11762c91e282fb129c493afc6f2f1a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 26 08:19:31 2008 +0000 + + [test] Add leaky-dashed-stroke + + A test case for a leak whilst closing a dashed stroke extracted from the + report by Jeff Muizelaar who found the artifact whilst looking at + firefox http://people.mozilla.com/~jmuizelaar/BerlinDistricts-check.svg + + test/.gitignore | 1 + + test/Makefile.am | 4 + + test/leaky-dashed-stroke-ps2-ref.png | Bin 0 -> 5511 bytes + test/leaky-dashed-stroke-ps3-ref.png | Bin 0 -> 5511 bytes + test/leaky-dashed-stroke-ref.png | Bin 0 -> 9214 bytes + test/leaky-dashed-stroke.c | 174 +++++++++++++++++++++++++++++++++++ + 6 files changed, 179 insertions(+) + +commit 195fd27cc64c7aaf18a6d48ccd9d94548331fd4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 22:04:53 2008 +0100 + + [build] Use AC_LINK_IFELSE for testing linker flags. + + Richard Hult reported that -Wl,--allow-shlib-undefined was incorrectly + being identified as supported by gcc under Mac OS/X: + + configure:25103: checking whether gcc supports -Wl,--allow-shlib-undefined + configure:25117: gcc -c -Werror -Wl,--allow-shlib-undefined conftest.c + >&5 + i686-apple-darwin9-gcc-4.0.1: --allow-shlib-undefined: linker input file + unused because linking not done + + So instead of just checking whether the compiler accepts the flag, check + that we can actually link a dummy file. + + build/aclocal.cairo.m4 | 20 ++++++++++++++++++++ + build/configure.ac.warnings | 2 +- + 2 files changed, 21 insertions(+), 1 deletion(-) + +commit d692284ab8f90d7402621f1a07aaddcf11d87ef5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Oct 23 01:45:35 2008 -0400 + + [test/user-font] Exercise glyph 0 + + Previously there was a bug in cairo and/or poppler causing glyph 0 of + user fonts to not show up. This is fixed now, so we exercise glyph 0. + + test/user-font.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit e6219f7116311d999054dc31df081aa66a0cd2d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 17:53:05 2008 +0100 + + [win32] Correct error paths in text_to_glyphs(). + + Carl spotted that 1db894 introduced an error into text_to_glyphs() such + that following an allocation error the code would attempt to thaw an + unfrozen glyph cache, leading to an attempt to unlock an unlocked mutex - + which causes a deadlock under win32. + + src/cairo-win32-font.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 09651a1c1a4856607423e9b06c1f7c397ba4f304 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 22:39:48 2008 +0100 + + Twin perf case + + perf/Makefile.am | 3 ++- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/twin.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 54 insertions(+), 1 deletion(-) + +commit 954ebacb71071c53c4e4092b469417f01478bc2d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 15:43:56 2008 +0100 + + Map toy font face to implementation. + + Quartz fonts and user fonts use an indirect font face when creating a + scaled font for the toy font face. This means that they insert a scaled + font into the font map that has a different font face to the one that is + initially searched upon. The result is that when we try to create an + identical scaled font, we fail to find the existing scaled font and + attempt to insert a duplicate into the hash table - which triggers an + assert. + + In order to avoid creating duplicate fonts, we add a new method to the + font backends that allows cairo_scaled_font_create() to peek at the + font_face that will be used to actually implement the scaled font + constructor - thus we are able to use the correct font_face as part of the + hash key. + + src/cairo-font-face.c | 34 ++++++++++++++++++++++++++++++ + src/cairo-ft-font.c | 2 ++ + src/cairo-quartz-font.c | 55 +++++++++++++++++++++++++++++++++++++++---------- + src/cairo-scaled-font.c | 11 +++++++++- + src/cairo-user-font.c | 37 +++++++++++++++++++++++++-------- + src/cairo-win32-font.c | 2 ++ + src/cairoint.h | 8 +++++++ + 7 files changed, 128 insertions(+), 21 deletions(-) + +commit 5e4a1cb0b830f069d99c9512563c82ad628587e3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 22 21:36:42 2008 +1030 + + Don't add a notdef glyph to Type 3 font subsets + + This allows user-fonts to use glyph 0 when embedding in PS/PDF. + According to ISO32000 Type 3 fonts do not require a notdef glyph. + + src/cairo-pdf-surface.c | 19 ++++------- + src/cairo-ps-surface.c | 21 ++++-------- + src/cairo-scaled-font-subsets.c | 59 +++++++++++++++++++-------------- + src/cairo-type3-glyph-surface-private.h | 6 ---- + src/cairo-type3-glyph-surface.c | 16 --------- + 5 files changed, 48 insertions(+), 73 deletions(-) + +commit 170686d4b0ed913a1a175f3f354ec5796814b416 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 22 01:01:06 2008 +0100 + + [cairoint] Remove the duplicate prototype. + + In the previous commit I added comments and a duplicate prototype. Remove + the duplicate - but keep the comments. + + src/cairoint.h | 3 --- + 1 file changed, 3 deletions(-) + +commit 1db8949f2baf1e620e1d5ef73a66de211420bd0a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 22:48:17 2008 +0100 + + Ensure that the scaled font is frozen for the lifetime of the scaled glyph. + + After discussing the scaled font locking with Behdad, it transpired that it + is not sufficient for a font to be locked for the lifetime of a scaled glyph, + but that the scaled font's glyph cache must be frozen for the glyph' + lifetime. If the cache is not frozen, then there is a possibility that the + glyph may be evicted before the reference goes out of scope i.e. the glyph + becomes invalid whilst we are trying to use it. + + Since the freezing of the cache is the stronger barrier, we remove the + locking/unlocking of the mutex from the backends and instead move the + mutex acquisition into the freeze/thaw routines. Then update the rule on + acquiring glyphs to enforce that the cache is frozen and review the usage + of freeze/thaw by all the backends to ensure that the cache is frozen for + the lifetime of the glyph. + + src/cairo-directfb-surface.c | 4 +- + src/cairo-glitz-surface.c | 2 +- + src/cairo-gstate.c | 4 - + src/cairo-meta-surface.c | 2 - + src/cairo-mutex-impl-private.h | 3 +- + src/cairo-mutex-type-private.h | 3 + + src/cairo-paginated-surface.c | 2 - + src/cairo-pdf-surface.c | 2 - + src/cairo-scaled-font-subsets.c | 30 +++--- + src/cairo-scaled-font.c | 81 ++++++++++----- + src/cairo-surface-fallback.c | 1 + + src/cairo-surface.c | 4 - + src/cairo-svg-surface.c | 4 +- + src/cairo-type1-fallback.c | 9 +- + src/cairo-type3-glyph-surface.c | 18 ++-- + src/cairo-user-font.c | 1 - + src/cairo-win32-font.c | 12 ++- + src/cairo-xcb-surface.c | 216 ++++++++++++++++++++++++---------------- + src/cairo-xlib-surface.c | 57 ++++++----- + src/cairoint.h | 4 + + src/test-meta-surface.c | 25 +---- + src/test-paginated-surface.c | 25 +---- + 22 files changed, 280 insertions(+), 229 deletions(-) + +commit b2cbbceb4ca57816a498c2c1e676b19182c34e12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 19:44:42 2008 +0100 + + [test/meta-surface-pattern] Propagate errors. + + Use cairo_get_target() to propagate any errors from the secondary context. + + test/meta-surface-pattern.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 9d4262ebe07bacacd6e743dea616b37ac51eac01 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Oct 21 17:44:47 2008 -0400 + + [build] Use dolt + + Dolt is a hack to speed up libtool-based build systems: + + http://dolt.freedesktop.org/ + + It's completely transparent to the user. Brings make time + of cairo from 70s down to 20s. Yay! + + build/aclocal.dolt.m4 | 177 ++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 1 + + 2 files changed, 178 insertions(+) + +commit 5a822046cc66d8405618370c1071433016969020 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:22:48 2008 +0100 + + [test/xlib-expose-event] Propagate errors. + + Use cairo_get_target() to propagate errors from secondary contexts. + + test/xlib-expose-event.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 21223cc12ca00c52c0b39dc60db410f29e4e76c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:29:12 2008 +0100 + + [test/unbounded-operator] Propagate errors. + + Use cairo_get_target() to propagate errors from secondary contexts. + + test/unbounded-operator.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 4c8de6d99d337338d6fd57134247515f9815b5e5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:21:37 2008 +0100 + + [test/surface-pattern-scale-up] Propagate errors. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/surface-pattern-scale-up.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit e8de7d1c3605fa6d89640fb4e0631c07e5366348 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:20:54 2008 +0100 + + [test/surface-pattern-scale-down] Propagate errors. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/surface-pattern-scale-down.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit b5551cfce2969358746dadae90cbe1add012e29c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:19:40 2008 +0100 + + [test/rotate-image-surface-paint] Proapgate errors. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/rotate-image-surface-paint.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 6d41ffbbed2ad3bab2b1a58e1e5d9e1570a37926 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:18:37 2008 +0100 + + [test/pixman-rotate] Propagate errors + + Use cairo_get_target() to propagate errors from the secondary context. + + test/pixman-rotate.c | 33 ++++++++++++++++----------------- + 1 file changed, 16 insertions(+), 17 deletions(-) + +commit 64949b81735ee4e43772224d10031f7edfbc8068 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:17:13 2008 +0100 + + [test/operator-source] Propagate errors. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/operator-source.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 971f030b7dca7ce24e54d0465900e6984020345e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:27:17 2008 +0100 + + [test/operator-clear] Propagate errors. + + Use cairo_get_target() to propagate errors from secondary contexts. + + test/operator-clear.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 9b919b0e91b6c64acbcbfc05c72610188327be67 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:14:51 2008 +0100 + + [test/extend-pad] Propagate errors. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/extend-pad.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 69415b4fc6387acda7498847f8181c802c8b0982 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:25:38 2008 +0100 + + [test/device-offset-scale] Propagate errors + + Use cairo_get_target() to propagate errors from the secondary contexts. + + test/device-offset-scale.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 9ab296123ef49259a67e8dc43708023da2759283 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:14:01 2008 +0100 + + [test/device-offset-positive] Propagate errors. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/device-offset-positive.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +commit 594fa0836f2526e0a7f44fc7184f7f09de7dd41f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 11:12:11 2008 +0100 + + [test/device-offset] Propagate error. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/device-offset.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 29da47be60b0373ff93769f9f373a20b15a01e0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 10:42:41 2008 +0100 + + [ps] Check for an empty font subset. + + Return early before trying to emit an empty subset into the document - + avoids a potential use of an uninitialised status variable. + + src/cairo-ps-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit fd1f3c27e093b1f51f0c1a381cc02cbf8f9889d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 21 09:17:56 2008 +0100 + + [configure] Check for atomic xchg. + + Bug 18140 identifies a case where we have an atomic increment, but not an + atomic exchange. We need both to implement atomic reference counting, so + add a second check to detect whether __sync_val_compare_and_swap + generates a non-atomic instruction. + + Fixes http://bugs.freedesktop.org/show_bug.cgi?id=18140. + + build/aclocal.cairo.m4 | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 71e4f7e3a10e6c9794360473d0114b27b42bcead +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 23:54:57 2008 +0100 + + Add API documentation for NULL filenames and write_funcs. + + Mention in the API docs that you can pass a NULL filename to + cairo_(pdf|ps|svg)_surface_create in order to construct a queryable + surface without generating any temporary files. Similarly when passing a + NULL write_func to cairo_pdf_surface_create_for_stream et al. + + src/cairo-pdf-surface.c | 10 ++++++++-- + src/cairo-ps-surface.c | 10 ++++++++-- + src/cairo-svg-surface.c | 10 ++++++++-- + 3 files changed, 24 insertions(+), 6 deletions(-) + +commit 6cb2b29434ffd5e718868d90e31cb050904b3ea7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 23:22:16 2008 +0100 + + [mutex] s/HOLDS_MUTEX/MUTEX_IS_LOCKED/ + + Behdad prefers the latter to keep a clean namespace. + + src/cairo-mutex-impl-private.h | 2 +- + src/cairo-mutex-type-private.h | 4 ++-- + src/cairo-scaled-font.c | 18 +++++++++--------- + 3 files changed, 12 insertions(+), 12 deletions(-) + +commit ae9d17c015867002895c8aa4e1c6dd1ef370dd20 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 22:31:17 2008 +0100 + + [directfb] Unbounded operators are unsupported. + + Currently the emulation of Porter-Duff operators does not correctly + handle the unbounded operators. + + src/cairo-directfb-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 1f35f31c4ee50dcc2f7c8616b9bbb5c45b4ed707 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 22:14:41 2008 +0100 + + [directfb] Fallback for SATURATE + + We're unable to satisfactorily emulate SATURATE using the src/dst blend + modes, so fallback. (Might just be a bug in libdirectfb...) + + src/cairo-directfb-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit c7951c4a368baaeeadca4e2a18d3ad45225380a0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 22:04:58 2008 +0100 + + [directfb] Perfom text fallback if emulating clip regions. + + Fallback if we have a clip that is not a simple region. + + src/cairo-directfb-surface.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 98933fd4b8579b68623a8212015769b058db43f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 20:59:14 2008 +0100 + + [directfb] When blitting check if we need the un-premultiplied color. + + When blitting whether we need to use the premultiplied color is dependent + upon the destination surface capabilities. + + src/cairo-color.c | 3 ++ + src/cairo-directfb-surface.c | 75 ++++++++++++++++++++++++++++++-------------- + 2 files changed, 54 insertions(+), 24 deletions(-) + +commit 4af8aa5f4d31141a6a4ba914cc860aff5d342d5b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 20:15:12 2008 +0100 + + [directfb] Apply clip to release_dest_image() + + We need to respect the current clip when copying the fallback image back to + the target surface. + + src/cairo-directfb-surface.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 0ba5085ba06fd1c0ff1ebc88111d4573675a2e17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 19:41:20 2008 +0100 + + [directfb] Fix OBO in clip. + + DirectFB seems to use inclusive upper bounds. + + src/cairo-directfb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2743e84171fd2a548ac37b1fdd3611d319acded0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 19:32:21 2008 +0100 + + [directfb] Force NEAREST. + + The current version of DirectFB does not support any filters, so set + NEAREST on the source patterns so that we can fully optimize the pattern + inside core. + + src/cairo-directfb-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit f1669d31c0064b8ffbc7db2527fed85488fb305c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 19:03:33 2008 +0100 + + [directfb] Track the empty clip rectangle. + + A region with no extents means everything should be clipped out, so we + need an extra flag to disambiguate when we have 0 clip rectangles. + + src/cairo-directfb-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit ebe3048f9b74ff949795a807a7076ec756150ede +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 18:59:03 2008 +0100 + + [directfb] Cap the maximum surface size to use for the font cache. + + Fallback if we need to create a cache larger than the maximum usable + surface. + + src/cairo-directfb-surface.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 6f35c2d13e4cb736634bf446d3b8ee38cc6a6b9b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 18:39:45 2008 +0100 + + [directfb] Only use the pure BLIT for integer translations. + + If we have non-integer translation on a source pattern then we need to use + STRECTHBLIT (the core takes care to optimize NEAREST patterns to integer + translations so that this will only be used when interpolation is + required). + + src/cairo-directfb-surface.c | 30 +++++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +commit 55bb7087b0236fe27980efda829f7b72e047b316 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 16:47:41 2008 +0100 + + [directfb] Tweak _categorize_operation(). + + Explicitly list the extend modes that are supported/unsupported and + immediately check for an unsupported operation. + + src/cairo-directfb-surface.c | 37 +++++++++++++++++++++++++------------ + 1 file changed, 25 insertions(+), 12 deletions(-) + +commit edb65213ec975e517165bc3b623f676a12917d0c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 16:46:08 2008 +0100 + + [directfb] Support ROI cloning. + + Only clone the ROI in order to efficiently handle large sources. + + src/cairo-directfb-surface.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit 4006e49ac1e96a983346f97be97bfd850f247ab0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 16:45:06 2008 +0100 + + [directfb] Rename backend structure. + + Use _cairo_directfb_surface_backend for consistency with other backends. + + src/cairo-directfb-surface.c | 37 ++++++++++++++++++++++++------------- + 1 file changed, 24 insertions(+), 13 deletions(-) + +commit 7e31ddbb08a6a7cf1db06c950c3768e54a5f4cfa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 13:04:20 2008 +0100 + + [directfb] Whitespace. + + Trim lots of trailing whitespace and fix up according to CODING_STYLE. + + src/cairo-directfb-surface.c | 1478 +++++++++++++++++++++--------------------- + 1 file changed, 733 insertions(+), 745 deletions(-) + +commit d49563280b80dd85275057b6442d2f4ece8d724c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 12:49:52 2008 +0100 + + [directfb] Simplify return from _directfb_get_operator(). + + Used only as a predicate, so simply return a boolean. + + src/cairo-directfb-surface.c | 138 +++++++++++++++++++++---------------------- + 1 file changed, 68 insertions(+), 70 deletions(-) + +commit b17d0ded8cd42d84e97ca2c1fbd4aefedd570b8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 12:48:02 2008 +0100 + + [directfb] Use the solid pattern cache. + + The dfb backend recreated a solid color surface for every colour, + completely bypassing the solid pattern cache. + + src/cairo-directfb-surface.c | 72 +++++++++++--------------------------------- + 1 file changed, 18 insertions(+), 54 deletions(-) + +commit 786bea48df0dc6d76b2ad00409804a803fe2f4b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 12:19:50 2008 +0100 + + [boilerplate/directfb] Create ARGB surfaces on demand. + + Create an RGB or ARGB surface depending upon the content type of the test + target, with the result that the directfb rgb24 target no longer + unconditionally fails. + + boilerplate/cairo-boilerplate-directfb.c | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +commit 4ba9ccc6ab5926d59696f86193f42df2195d7cda +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 23:07:38 2008 +0100 + + [configure.ac.analysis] s/safe/_save/ + + Rename the temporary variable in line with the convention used by the rest + of the build system. + + build/configure.ac.analysis | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3a45b07af9743a26305c2576f838b4f3ef83bbb8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 10:37:46 2008 +0100 + + [perf] Free images for composite-checker + + Fix memleak of the image surfaces. + + perf/composite-checker.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 86356a9578dc248a755aceb7a04aef67a6c529b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 20 17:12:21 2008 +0100 + + [test] Add degenerate-dash to XFAIL. + + PS (ghostscript) interprets the degenerate end-caps quite differently, and + perhaps slightly more rationally... Add this to XFAIL, until we have a + definitive specification on how we should behave. + + test/Makefile.am | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 83d2552e4cafc9f86a8055abdf6caa685ed4922b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 20 17:59:09 2008 -0400 + + Remove CAIRO_BEGIN_DECLS uses that ickle introduced while merging + + src/cairo-mutex-impl-private.h | 2 -- + src/cairo-mutex-type-private.h | 2 -- + 2 files changed, 4 deletions(-) + +commit eab37f76b0f26a7b007dd51debf4d4901310c8b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 22:12:18 2008 +0100 + + [directfb] Return an error surface on create() failure. + + Do not return NULL but an NO_MEMORY error surface if we fail to allocate + the surface during creation. + + src/cairo-directfb-surface.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +commit 6a02f53dd191605986b15e4757b16f599fe8de5f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 14:21:15 2008 +0100 + + [directfb] Simplifiy ADD_TRI + + Simplify the ADD_TRI macro to make the code more readable. + + src/cairo-directfb-surface.c | 30 +++++++++++++----------------- + 1 file changed, 13 insertions(+), 17 deletions(-) + +commit aba457fe64f12598043b11ae076f0a93fe05eba7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 14:03:24 2008 +0100 + + [directfb] Add missing error status + + We jumped to the ERROR path without setting an error status - assume + NO_MEMORY. + + src/cairo-directfb-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 610451e4a7b079d30a73384a76f0aaab250c2970 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 12:45:45 2008 +0100 + + [directfb] Correct fixed-to-double conversion. + + The trapezoid calculations had not been updated after the 16.16->24.8 + switch. Use _cairo_fixed_to_double() rather than open-coding. + + src/cairo-directfb-surface.c | 110 +++++++++++++++++++++---------------------- + 1 file changed, 54 insertions(+), 56 deletions(-) + +commit 8e0950ced8837a35b9dc0254860250f9fa1a9613 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 12:11:13 2008 +0100 + + [boilerplate/directfb] Gracefully handle failure to create surface. + + Simply return NULL indicating failure to create the target surface rather + than aborting the test (allowing other targets to be tested). + + boilerplate/cairo-boilerplate-directfb.c | 230 +++++++++++++++++-------------- + 1 file changed, 130 insertions(+), 100 deletions(-) + +commit 801df1b87a585ebf71e6d3d74b815f3470b81ae9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 11:55:20 2008 +0100 + + [directfb] Fix error propagation from surface_create() + + Do not mask fatal errors, but correctly propagate the error status. + + src/cairo-directfb-surface.c | 208 ++++++++++++++++++++++++------------------- + 1 file changed, 114 insertions(+), 94 deletions(-) + +commit 476d17fa788fcf173e58b963540c6557f846ceed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 11:35:27 2008 +0100 + + [directfb] Compile fix. + + Fixup compilation after 901f0b. + + src/cairo-directfb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d72969289db62b38ca024a41c0d8e0df480e7f8c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 09:47:33 2008 +0100 + + [image] Remove unused variable. + + Cleanup the compiler warning for the unused status after code shuffling. + + src/cairo-image-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit f2ff7944264c23cbec856be3e85f240a93184f80 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 11:56:19 2008 +0100 + + [perf] A crude tool to visualise performance changes across a series. + + Generate a cairo-perf-diff graph for a series of commits in order to be + able to identify significant commits. Still very crude, but minimally + functional. + + configure.ac | 3 + + perf/.gitignore | 1 + + perf/Makefile.am | 26 +- + perf/Makefile.win32 | 6 +- + perf/cairo-perf-diff | 12 +- + perf/cairo-perf-diff-files.c | 458 ------------------------------- + perf/cairo-perf-graph | 205 ++++++++++++++ + perf/cairo-perf-graph-files.c | 593 +++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf-graph-widget.c | 450 +++++++++++++++++++++++++++++++ + perf/cairo-perf-graph.h | 63 +++++ + perf/cairo-perf-report.c | 456 +++++++++++++++++++++++++++++++ + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 61 ++++- + perf/cairo-stats.h | 8 - + 14 files changed, 1865 insertions(+), 478 deletions(-) + +commit 41c8eefc6d432ab213f6f405c3d6346adb7f7931 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 22:24:32 2008 +0100 + + [output-stream] Protect against NULL write_func. + + Allow the user to specify a NULL write_func for the output stream so that + a dummy surface can be created, for example, for querying target font + options or font extents. + + Currently we do not perform any sanity checks at the user entry point and + will generate a mysterious SEGV during cairo_surface_finish() - which may + not immediately be obvious that it is due to a NULL write_func. + + src/cairo-output-stream.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 84e4a825fffe3d78e95dec3406a86da6a23144c2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 22:15:17 2008 +0100 + + [output-stream] Accept a NULL filename + + Principally to support creating a dummy vector surface (i.e. + cairo_ps_surface_create (NULL, 1, 1)) that can be used to determine font + extents (or target font options) before opening an output file, but also + because we currently fail to do any sanity checking at the entry point. + + src/cairo-output-stream.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 52ea38f97b1b90e395c667619770482b10e5672e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 18 00:44:29 2008 +0100 + + [meta] Acquire scaled_font mutex for glyph_path(). + + The caller of _cairo_scaled_font_glyph_path() is expected to be holding + the scaled_font->mutex. + + src/cairo-meta-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 299ea0580a646dc55fd0156f1904fe4b45ec5725 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 18 00:37:38 2008 +0100 + + [user-font] Review locks under error conditions. + + Simplify the error handling by only relinquishing the global + scaled_font_map mutex if we successfully insert the placeholder font. The + result is that on the error path, there are no changes to global state and + thus we can entirely skip the user-font initialisation and + re-registration. + + src/cairo-scaled-font.c | 44 ++++++++++++++++++++++---------------------- + src/cairo-user-font.c | 39 +++++++++++++++++++++++---------------- + src/cairoint.h | 2 +- + 3 files changed, 46 insertions(+), 39 deletions(-) + +commit c76a8481f372fab8981231b257fdcc69466263d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 18 00:36:34 2008 +0100 + + [analysis] Check for error surfaces. + + If the target surface is an error surface, ensure that we return the + appropriate error surface. Likewise, avoid writing to error surfaces. + + src/cairo-analysis-surface.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 5b28b0b903cb2fdb8a5614659d528bf12488389e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 18 00:35:48 2008 +0100 + + [ps] Destroy type3 surface on error. + + After an error, ensure that the local type3 surface is destroyed. + + src/cairo-ps-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6b17c6da47c42dd04ed2acad723c25b6da41b51c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 18 00:34:17 2008 +0100 + + [type3] Acquire scaled_font mutex whilst looking up glyphs. + + When looking up the glyph in the shared scaled_font glyph cache, the + caller is required to have taken the scaled_font->mutex. + + src/cairo-type3-glyph-surface.c | 50 ++++++++++++++++++++++++----------------- + 1 file changed, 30 insertions(+), 20 deletions(-) + +commit f56cf93181e73b4ba74f25ce14f7ed6c7cf36e83 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 22:13:53 2008 +0100 + + [user-font] Check for error objects. + + Check that the user has not passed in an inert error object before any + attempts to write to it and return the default values. + + src/cairo-user-font.c | 71 ++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 59 insertions(+), 12 deletions(-) + +commit 1f9f9d936b296dbe796b1436c7da7fa3462f7d59 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:39:56 2008 +0100 + + [pdf] Acquire scaled_font mutex for show_text_glyphs(). + + We need to be holding the scaled font mutex over a call to draw text + glyphs from within an smask group. + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 12fb8c9b7c808ab20bee466aa28ee368559fd902 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:33:07 2008 +0100 + + [type1] Acquire scaled_font mutex. + + In order to perform glyph lookups we need to be holding the mutex for the + scaled_font. + + src/cairo-type1-fallback.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ca5f868a73b35eda737ae6596efff91f82eeea75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:26:20 2008 +0100 + + [scaled-font] Zero font extents for an error surface. + + Do not attempt to read from the error object, but just return zero + extents. + + src/cairo-scaled-font.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 1ddf0b2a5c1f3d20b9a91acf7aae021f6b738485 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 10:35:38 2008 +0100 + + [surface] Reorder asserts to make no assumptions about error objects. + + If the surface is in error, then we cannot assume anything about the + validity of its contents other than the error status (and reference + count). This is for the cases were the surface is replaced by a nil + surface, and in future where the error surface may be replaced by a tiny + error object. + + src/cairo-surface.c | 94 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 47 insertions(+), 47 deletions(-) + +commit 644e78ca4e6f72499fcf763acd53fa7235b0226d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 20:34:13 2008 +0100 + + [svg] Lock the scaled_font whilst emitting glyphs. + + We need to hold the scaled_font mutex whilst looking upon glyphs so lock + the font whilst iterating over the font subset. + + src/cairo-svg-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4587e9e4f5c46656108b05f7a4841f78df14de26 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 19:11:09 2008 +0100 + + [scaled-font-subsets] Add locking to unscaled font. + + During map_glyph() we are passed a locked scaled_font for which we are + asked to add a glyph from that font into the active subsets for the + surface. This means that we eventually call scaled_glyph_lookup() to load + the glyph. But first, we attempt to find an existing an existing sub_font + for glyph, creating a new sub_font as necessary (possibly using an + entirely different unhinted scaled font). So before accessing the glyph + cache we need to make sure that we are holding the appropriate mutexes. + + src/cairo-scaled-font-subsets.c | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +commit d3a6651237a276c410885578c41fb505f83372ed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 14:37:42 2008 +0100 + + [xlib] Set return code after failing to allocate glyph surface. + + Although we checked for an allocation error, we missed propagating the + status to the return error code. + + src/cairo-xlib-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit bfc3a72cff1a3f9641dae7c9f121598a14eb9a5a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 14:06:03 2008 +0100 + + [gstate] Propagate error from clip. + + During clip transformation we query the clip extents which can trigger a + fatal error. Check and propagate. + + src/cairo-gstate.c | 33 +++++++++++++++++++++++---------- + 1 file changed, 23 insertions(+), 10 deletions(-) + +commit 7975cf3f2c0bc28b8b3c916d5ba725abb38b300d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 13:21:28 2008 +0100 + + [paginated] Free local reference to target on error path. + + On the error path we must destroy the local reference to the target + surface. + + src/cairo-paginated-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 4662204a2a02d50e674f121d82bbb4fe1b8f1436 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 12:44:45 2008 +0100 + + [test-paginated] Fix double free of surface along error path. + + The ownership of the surface is transferred to the paginated surface, so + we do not need to destroy it ourselves along the error path. + + src/test-paginated-surface.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit bf3202fcfd281be3fa62c2d6719377a8f2a0dec4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 12:33:22 2008 +0100 + + [xlib] Fix double free of Pixmap along error path. + + If the paint fails then we attempt to free the Pixmap ourselves and via + the cairo_surface_destroy (as it also believes that it owns the Pixmap). + + src/cairo-xlib-surface.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 901f0b540c764e131dd9745def329308af61b3d5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 12:19:09 2008 +0100 + + Review backend->create_similar() + + Avoid masking fatal errors by enforcing any error to be returned via an + error surface, so that the NULL return only means UNSUPPORTED. A few + backends called their create_similar() directly, without correctly checking + for a potential NULL (for example, the directfb backend was a timebomb, + since it used NULL to indicate out-of-memory). + + src/cairo-directfb-surface.c | 18 ++++++++++-------- + src/cairo-glitz-surface.c | 17 +++++++++++------ + src/cairo-quartz-surface.c | 4 ++-- + src/cairo-surface.c | 8 ++------ + src/cairo-win32-surface.c | 16 ++++++++++++---- + src/cairo-xcb-surface.c | 2 ++ + 6 files changed, 39 insertions(+), 26 deletions(-) + +commit 9529699028a5c7a3b0f81f945d25f26285247a11 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 19 09:35:07 2008 +0100 + + [test/user-font-rescale] Check and propagate errors. + + We need to check the error status on set_user_data() to be sure that the + data has been set and error otherwise. + + test/user-font-rescale.c | 63 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 40 insertions(+), 23 deletions(-) + +commit 683de2fea2d8cdeea9759cbf3ab7492d634e7af2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 18 00:01:39 2008 +0100 + + [test/user-font[-proxy]] Check for error from set_user_data(). + + Check in case we fail to attach our user_data. + + test/user-font-proxy.c | 69 ++++++++++++++++++++++++++++---------------------- + test/user-font.c | 24 ++++++++++++++---- + 2 files changed, 58 insertions(+), 35 deletions(-) + +commit 198392990082e01443bbda5c0cbe6dc8bf090baf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 22:14:49 2008 +0100 + + [test/bitmap] Leak on error path. + + Free the FcPattern on error. + + test/bitmap-font.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 0409be426cb7f67974346a93213dd4675b59776c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 14:26:15 2008 +0100 + + [test/font-matrix-translation] Check for OOM + + First check that querying the extents did not trigger NO_MEMORY. + + test/font-matrix-translation.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 21360bf6748b30cf58d54561e40a1aa711d8d7af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 20:44:51 2008 +0100 + + [test/source-surface-big-scaled-down] Propagate error. + + Propagate error to source. + + test/surface-pattern-big-scale-down.c | 43 ++++++++++++++++++++--------------- + 1 file changed, 25 insertions(+), 18 deletions(-) + +commit 794160c35baf39593942ba71b45e4e75d2a87103 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 20:37:43 2008 +0100 + + [test/surface-pattern] Propagate error. + + Use cairo_get_target() to propagate error from secondary context. + + test/surface-pattern.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 0f48cce8d90cf95afcf86d71a932ab4e504b909b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 20:31:57 2008 +0100 + + [test/source-clip-scale] Propagate error. + + Use cairo_get_target() to propagate error from secondary context. + + test/source-clip-scale.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 6cdbd132ceba159bb7e3ac5612aa79293b21e95a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 20:22:49 2008 +0100 + + [test/source-clip] Propagate error. + + Use cairo_get_target() to propagate error from the secondary context. + + test/source-clip.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f86f233b3e49c3f401b2fa02987b2193485e8be5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 20:14:06 2008 +0100 + + [test/smask] Propagate error. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/smask.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4490a6c363a8745ba89bfa890519a570d098086e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 19:15:17 2008 +0100 + + [test/stroke-image] Propagate error + + Use cairo_get_target() to propagate errors from the secondary context. + + test/stroke-image.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +commit 6e6d7e52a3c16787633e5059ae36f2fb0d03148a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 19:02:31 2008 +0100 + + [test/mask] Propagate error from secondary context. + + Reset the source every time so that the error is propagate from the + secondary context using cairo_get_target(). + + test/mask.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit a56d4530d6149e2c4fc884a5cfeede2d6ff6d3b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:54:21 2008 +0100 + + [test/smask-text] Propagate error. + + Use cairo_get_target() to propagate error from the secondary context. + + test/smask-text.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit b1e884cd89ab2b83d3b8e072414e4e3f63e3a023 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:52:55 2008 +0100 + + [test/smask-stroke] Propagate error. + + Use cairo_get_target() to propagate the error from the secondary context. + + test/smask-stroke.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit 546fbc2c0cf87abd627477056bf19063c5aa001a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:50:25 2008 +0100 + + [test/smask-paint] Propagate error. + + Use cairo_get_target() to propagate errors from the secondary context. + + test/smask-paint.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8bd69132827fa539d9dfb65bd00e00c079827360 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:49:02 2008 +0100 + + [test/smask-mask] Propagate error. + + Use cairo_get_target() to propagate errors from the secondary contexts. + + test/smask-mask.c | 46 ++++++++++++++++++++++------------------------ + 1 file changed, 22 insertions(+), 24 deletions(-) + +commit 9c0fe6c61e92044e8599f49e75d38edcdd6be960 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:45:07 2008 +0100 + + [test/smask-image-mask] Propagate error. + + Use cairo_get_target() to propagate any error status from the secondary + context. + + test/smask-image-mask.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 373d6c76b65e826f81873b51461bdf3c30024c06 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:43:26 2008 +0100 + + [test/smask-fill] Propagate error status. + + Use cairo_get_target() to propagate the error from the secondary context. + + test/smask-fill.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit bb05beaab626d2fca6d219bfd8148dde71073b39 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 15:27:11 2008 +0100 + + [test/show-glyphs-many] Check for NO_MEMORY + + As we do a manual status check, we need to perform a full check. + + test/show-glyphs-many.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit c0a4ef76e17dfd43d248c13b7f0665da9b847316 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 14:57:42 2008 +0100 + + [test/composite-integer-translate-over-repeat] Propagate error. + + Use cairo_get_target() to propagate any errors from the secondary context. + + test/composite-integer-translate-over-repeat.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 4a9e0f0e5ba17a322bbf0f38b2fb418211571d48 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 16:50:32 2008 +0100 + + [test/mask] Propagate error from secondary context. + + Use cairo_get_target() to infect the primary context with any errors + raised whilst drawing the mask. + + test/mask.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit eaec1caa94ac871eb881ac354c4442ddd2a308ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 16:20:28 2008 +0100 + + [test/ft-text-*] Check for errors from fontconfig. + + If a match cannot be found, or if any other error occured, then fontconfig + will return NULL. Check and propagate. + + test/ft-text-antialias-none.c | 31 ++++++++++++++++++++++++++----- + test/ft-text-vertical-layout-type1.c | 31 ++++++++++++++++++++++++++----- + test/ft-text-vertical-layout-type3.c | 31 ++++++++++++++++++++++++++----- + 3 files changed, 78 insertions(+), 15 deletions(-) + +commit 336eddfdbb31865e3669ceb775089c63ce1db27f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 17:19:12 2008 +0100 + + [test/get-clip] Check the status on the secondary context. + + As we solely use a secondary context, we must manually report NO_MEMORY + errors whilst running under memfault. + + test/cairo-test.c | 14 +++++++- + test/cairo-test.h | 4 +++ + test/get-clip.c | 98 ++++++++++++++++++++++++++++--------------------------- + 3 files changed, 67 insertions(+), 49 deletions(-) + +commit d48f9340514c258cfece1b72d2f7e3f7b2d3c7b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 14:05:14 2008 +0100 + + [test/clip-operator] Propagate error from secondary context. + + Use the cairo_get_target() to propagate any errors from the secondary + context. + + test/clip-operator.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit d11014386f739f43ec5f290714d7c51cc638f172 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 13:37:07 2007 +0100 + + Add support for lockdep. + + lockdep is a valgrind skin which performs pthread locking correctness + validation. In particular it allows one to write assert(HOLDS_LOCK(mutex)) + which both documents the preconditions for a function and enforces them + when the program is run under lockdep. + + As an aide to lockdep (as it works by intercepting the pthread functions), + all the mutexes should be initialised and destroyed using + pthread_mutex_init() and pthread_mutex_destroy() rather than using static + initializers and no-ops. + + src/cairo-mutex-impl-private.h | 14 ++++++++++++++ + src/cairo-mutex-type-private.h | 6 +++++- + src/cairo-scaled-font.c | 13 +++++++++++++ + 3 files changed, 32 insertions(+), 1 deletion(-) + +commit bccfdf7d93c2a92a342127fc212770f4053cb2cf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 13:47:27 2008 +0100 + + [test] Add support for memfault. + + Add the core support to cairo-test for running the test-suite under a + malloc fault injector. This commit contains the adjustments to + cairo_test_run() to repeat the test if it detects a failure due to fault + injection and complains if it detects unreported faults or memory leaks. + + build/configure.ac.analysis | 17 +++ + test/cairo-test.c | 271 ++++++++++++++++++++++++++++++++++---------- + test/cairo-test.h | 10 +- + 3 files changed, 239 insertions(+), 59 deletions(-) + +commit 974fabfe059f9744116d20fd9f8b59f1b8c34b70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 17 18:52:51 2008 +0100 + + [ft] Add more comments about FT_Face lifetime issues. + + Currently we only have an example of how to call FT_Done after the last + reference to the FT cairo_font_face_t has been dropped, but do not + actually explain why this needs to be done. So add a couple of sentences + to clarify the likely lifetime of the FT_Face once exposed to cairo. + + src/cairo-ft-font.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 5fcfc7ebc9a2d1d947898d269be7ba91d27c5261 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 17:13:45 2008 +0100 + + [test/README] Document all fonts used. + + Do a little leg-work to answer a query in a bug report and document the + results. + + test/README | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit c1164a574d3e2cc4746384875d5c2781114c0ea4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 16 08:49:13 2008 +0100 + + [type1] Add comment to warn about read() as macro. + + In case we are ever tempted to simplify the function pointer, warn that it + may alias with a macro. + + src/cairo-type1-subset.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ff9ee74b37a88cba2e996bf0cdae1af6b6c6fe30 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 16 17:29:33 2008 +1030 + + Revert unintended changes to test/fallback-resolution.c in the previous commit + + test/fallback-resolution.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5911c6966de832fa350a6e9a4d587b7c3b3b4825 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 16 17:22:48 2008 +1030 + + Use correct inverse ctm for stroke in meta surface replay + + This fixes #9189 Dashed strokes too long in fallback images + + src/cairo-meta-surface.c | 2 +- + test/fallback-resolution.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 6afcd821182137e8c3f128f9600e97cff79978b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 22:41:26 2008 +0100 + + [test] Add a spline test. + + Test the decomposition of 5 different types of spline curve. Useful test + for future experiments in improving the decomposition algorithm. + + Note: the vector targets all need separate reference images due to their + lack of support for cairo_set_tolerance(). Also GS strokes the Bezier + curve differently using offset curves and opposed to transcribing the + outline of a pen. + + test/.gitignore | 1 + + test/Makefile.am | 7 + + test/spline-decomposition-pdf-ref.png | Bin 0 -> 20404 bytes + test/spline-decomposition-ps2-ref.png | Bin 0 -> 8957 bytes + test/spline-decomposition-ps3-ref.png | Bin 0 -> 8957 bytes + test/spline-decomposition-ref.png | Bin 0 -> 20402 bytes + test/spline-decomposition-svg11-ref.png | Bin 0 -> 20404 bytes + test/spline-decomposition-svg12-ref.png | Bin 0 -> 20404 bytes + test/spline-decomposition.c | 416 ++++++++++++++++++++++++++++++++ + 9 files changed, 424 insertions(+) + +commit 91b0dc92c8ede189d942188f92068f189907e239 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 22:27:53 2008 +0100 + + [build] Add -fno-common. + + Generate a warning if two files define a global variable with the same + name, instead of silently merging them to reference the same location. + + build/configure.ac.warnings | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b94b600b34793cecd9a66d37dd34a6619738e2c2 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Oct 15 13:41:03 2008 -0400 + + [quartz] Completely remove CAIRO_HAS_QUARTZ_IMAGE_SURFACE check + + Instead of fixing the check in d36b02dc662e623bee58a69c32b149a242cbf52b, just + remove it. Conditionally compilation will keep cairo-quartz-image-surface.c + from being compiled in when it is not configured to be. Suggested by Behdad. + + src/cairo-quartz-image-surface.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit d36b02dc662e623bee58a69c32b149a242cbf52b +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Oct 15 12:45:11 2008 -0400 + + [quartz] Rebalance 'CAIRO_HAS_QUARTZ_IMAGE_SURFACE' #ifdef + + Fixes compilation by re-adding '#ifdef CAIRO_HAS_QUARTZ_IMAGE_SURFACE' which + was, I assume, unintentionally removed by + 2cf4b3161c19b9b0349bd2aa94855fd0822968be. + + src/cairo-quartz-image-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 83162360a44c4d4701f0ade2e2ee813f79186439 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Oct 15 10:34:12 2008 -0400 + + Fix quratz_image typo in Makefile.sources. + + src/Makefile.sources | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 877e77fa3e85c09c29e64ca5ae7329346db029cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 12:20:00 2008 +0100 + + [glitz] Disable caching of solid surfaces. + + glitz currently has no mechanism to release resources upon connection + closure (ala XCloseDisplay) and so will attempt invalid accesses when + evicting old surfaces from the solid pattern cache. + + src/cairo-glitz-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit fc04a1e0dbc3cefa51c7602e0a23dba886813fe5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 12:13:40 2008 +0100 + + [boilerplate] Fixup compilation for gliitz. + + Convert a few old references to cairo_boilerplate_surface_set_user_data. + + boilerplate/cairo-boilerplate-glitz.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit e17f02add019d9acf461a1ad1245ba5be00cf336 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 10:52:33 2008 +0100 + + [type1] Protect against read macro + + POSIX allows for any of its functions to be implemented as a macro, + inflicting damage upon innocent function pointers that happen to share + the same name. + + face->stream->read() is one such example. + + As it's outside of our control (being a FT_Face) we cannot simply rename + the data member, so we need to explicitly dereference it as a function + pointer in order to disambiguate it for the compiler. + + src/cairo-type1-subset.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit bc872a5f5fb9b6318dc78d132da46a6b201f75c7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 10:21:05 2008 +0100 + + [xlib] Handle 4,20,24,28 depth XImages + + Bug 9102 cairo doesn't support 24 bits per pixel mode on X11 + (https://bugs.freedesktop.org/show_bug.cgi?id=9102) + is a reminder that that we need to support many obscure XImage formats. + With Carl's and Behdad's work to support psuedocolor we have a mechanism + in place to handle any format that is not natively handled by pixman. The + only piece we were missing was extending the swapper to handle all-known + formats and putting in defensive checks that pixels were correctly aligned + in accordance with pixman's requirements. + + src/cairo-image-surface.c | 13 ++++----- + src/cairo-xlib-surface.c | 70 +++++++++++++++++++++++++++++++++++++++-------- + src/cairoint.h | 2 +- + 3 files changed, 66 insertions(+), 19 deletions(-) + +commit 1728fa352011c570ce1bcc3bd14897e789c85252 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 15 09:23:01 2008 +0100 + + [svg] Add notes about why we shouldn't add DOCTYPE. + + Emmanuel Pacaud did some research into adding DOCTYPE after we had a + complaint that our SVG output failed to be validated by batik. The + conclusion he came to was that the validation of SVG was incomplete and + misleading, i.e. our output might generate false negatives leading to more + confusion. + + src/cairo-svg-surface.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit e9f5ee6efe7725c1e0e32fa9e85cca61ecb93440 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 14 14:42:48 2008 +0100 + + [doc] Fix a few gtk-doc errors. + + gtk-doc insists on a non-empty long description, even for trivial + functions that are fully described by their input arguments and return + value. Grrr. + + src/cairo-gstate.c | 4 ++++ + src/cairo-os2-surface.c | 2 ++ + src/cairo-scaled-font.c | 14 +++++++------- + src/cairo-surface.c | 4 +++- + src/cairo-unicode.c | 6 ++++-- + 5 files changed, 20 insertions(+), 10 deletions(-) + +commit 595414bb787d570ac95fc91c58c370558e9d5a54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 14 14:24:49 2008 +0100 + + [test/fallback-resolution] Extend to cover separate ppi x/y. + + Adrian Johnson proposed a hack that fixed the current test by simply + scaling the dashed stroke by device_transform.xx. Obviously this exposes a + deficiency in the test case. So add an outer loop to iterate over several + common ppi for both x and y and in doing so reveal more ugly artifacts in + the current fallback code. + + test/Makefile.am | 42 +++++- + test/fallback-resolution-ppi150-ref.png | Bin 8043 -> 0 bytes + test/fallback-resolution-ppi150x150-ref.png | Bin 0 -> 8043 bytes + test/fallback-resolution-ppi150x300-ref.png | Bin 0 -> 6848 bytes + test/fallback-resolution-ppi150x37.5-ref.png | Bin 0 -> 13176 bytes + test/fallback-resolution-ppi150x600-ref.png | Bin 0 -> 6338 bytes + test/fallback-resolution-ppi150x72-ref.png | Bin 0 -> 8370 bytes + test/fallback-resolution-ppi150x75-ref.png | Bin 0 -> 10445 bytes + test/fallback-resolution-ppi300-ref.png | Bin 5637 -> 0 bytes + test/fallback-resolution-ppi300x150-ref.png | Bin 0 -> 6851 bytes + test/fallback-resolution-ppi300x300-ref.png | Bin 0 -> 5637 bytes + test/fallback-resolution-ppi300x37.5-ref.png | Bin 0 -> 12870 bytes + test/fallback-resolution-ppi300x600-ref.png | Bin 0 -> 4848 bytes + test/fallback-resolution-ppi300x72-ref.png | Bin 0 -> 7053 bytes + test/fallback-resolution-ppi300x75-ref.png | Bin 0 -> 9617 bytes + test/fallback-resolution-ppi37.5-ref.png | Bin 14098 -> 0 bytes + test/fallback-resolution-ppi37.5x150-ref.png | Bin 0 -> 12728 bytes + test/fallback-resolution-ppi37.5x300-ref.png | Bin 0 -> 11981 bytes + test/fallback-resolution-ppi37.5x37.5-ref.png | Bin 0 -> 14098 bytes + test/fallback-resolution-ppi37.5x600-ref.png | Bin 0 -> 11654 bytes + test/fallback-resolution-ppi37.5x72-ref.png | Bin 0 -> 12990 bytes + test/fallback-resolution-ppi37.5x75-ref.png | Bin 0 -> 13787 bytes + test/fallback-resolution-ppi600-ref.png | Bin 4104 -> 0 bytes + test/fallback-resolution-ppi600x150-ref.png | Bin 0 -> 6096 bytes + test/fallback-resolution-ppi600x300-ref.png | Bin 0 -> 4812 bytes + test/fallback-resolution-ppi600x37.5-ref.png | Bin 0 -> 12401 bytes + test/fallback-resolution-ppi600x600-ref.png | Bin 0 -> 4104 bytes + test/fallback-resolution-ppi600x72-ref.png | Bin 0 -> 6398 bytes + test/fallback-resolution-ppi600x75-ref.png | Bin 0 -> 8974 bytes + test/fallback-resolution-ppi72-ref.png | Bin 8409 -> 0 bytes + test/fallback-resolution-ppi72x150-ref.png | Bin 0 -> 8069 bytes + test/fallback-resolution-ppi72x300-ref.png | Bin 0 -> 6803 bytes + test/fallback-resolution-ppi72x37.5-ref.png | Bin 0 -> 13147 bytes + test/fallback-resolution-ppi72x600-ref.png | Bin 0 -> 6245 bytes + test/fallback-resolution-ppi72x72-ref.png | Bin 0 -> 8409 bytes + test/fallback-resolution-ppi72x75-ref.png | Bin 0 -> 10628 bytes + test/fallback-resolution-ppi75-ref.png | Bin 12101 -> 0 bytes + test/fallback-resolution-ppi75x150-ref.png | Bin 0 -> 9940 bytes + test/fallback-resolution-ppi75x300-ref.png | Bin 0 -> 9003 bytes + test/fallback-resolution-ppi75x37.5-ref.png | Bin 0 -> 14020 bytes + test/fallback-resolution-ppi75x600-ref.png | Bin 0 -> 8455 bytes + test/fallback-resolution-ppi75x72-ref.png | Bin 0 -> 10202 bytes + test/fallback-resolution-ppi75x75-ref.png | Bin 0 -> 12101 bytes + test/fallback-resolution.c | 199 +++++++++++++------------- + 44 files changed, 139 insertions(+), 102 deletions(-) + +commit 0d3e152d2fe28b22a27dd6b9f82e2047aea3be94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 14 13:44:47 2008 +0100 + + [check-doc-syntax.sh] Allow quoting. + + func_regexp was incorrectly complaining that cairo_pure was a function without + parenthesis. The simplest solution appeared to be allow quoting of + 'cairo_pure'. + + src/cairo-compiler-private.h | 22 +++++++++++----------- + src/check-doc-syntax.sh | 6 +++--- + 2 files changed, 14 insertions(+), 14 deletions(-) + +commit 02a7ca80f9f9b62deff6c8ba4dc58fee0cebcaa6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 14 11:08:43 2008 +0100 + + [pattern] Correctly optimize away fractional translations. + + As is so often the case, reading the commit log gives you fresh insight in + the problem - often called confessional debugging... + + We can simplify the problem by ignoring attr->[xy]_offset, for the time + being, and focus on computing the correct matrix. This is comparatively + simple as all we need to do is perform the appropriate rounding on the + translation vector. + + src/cairo-pattern.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit 9886cb3353eb02ce5b99d555a35b13b8347f8e87 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 14 10:23:41 2008 +0100 + + [pattern] Only perform non-integer optimization for identity matrices. + + A complication I realised after pushing 3eb4bc3 was handling larger + sampled areas. Extending the test case revealed that the optimization + was broken for anything but the identity transform (after removing the + translation). Correctness first, leaving the "pixel-exact" solution for + interested reader... + + src/cairo-pattern.c | 16 ++++++---------- + test/filter-nearest-transformed-pdf-ref.png | Bin 373 -> 548 bytes + test/filter-nearest-transformed-ref.png | Bin 151 -> 570 bytes + test/filter-nearest-transformed-svg11-ref.png | Bin 217 -> 559 bytes + test/filter-nearest-transformed-svg12-ref.png | Bin 217 -> 559 bytes + test/filter-nearest-transformed.c | 24 ++++++++++++++++++++++++ + 6 files changed, 30 insertions(+), 10 deletions(-) + +commit 8dc3deecb8e0ca2f84d996096230f27ab4c24c18 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 14 08:17:23 2008 +0100 + + Add documentation for function attributes 'pure' and 'const'. + + Carl suggested that cairo_pure and cairo_const are pretty opaque, even to + the developer who added them, so it is extremely important that they have + a good description so that they are used correctly and perhaps ported to + other compilers. + + src/cairo-compiler-private.h | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 6aa1143d5a8ec45fc793102a64e956d7d1c7ad01 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 13 23:49:17 2008 +0100 + + Update documentation to remove references to cairo_has_show_text_glyphs(). + + With the addition of cairo_show_text_glyphs() came a couple of functions + to query whether the target supported the extended attributes. However, + at Carl's request cairo_has_show_text_glyphs() was removed - but the + documentation was not updated to reflect that. + + NEWS | 2 +- + src/cairo-surface.c | 3 --- + src/cairo.c | 6 +++--- + 3 files changed, 4 insertions(+), 7 deletions(-) + +commit b2053945df35d4d7eea9fe3200e9c018705309d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 13 23:39:47 2008 +0100 + + [scaled-font] Correct documentation for cairo_scaled_font_create(). + + Fix the documentation not to suggest that NULL is a legal value for + font_options (as we temporarily made it during the 1.[57] dev cycle). + + src/cairo-scaled-font.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 3eb4bc37577e905d93a1935e7a9cd33ae8dbda15 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 13 23:26:04 2008 +0100 + + [pattern] Optimize away fractional translation for NEAREST patterns. + + As identified in bug 15479, + Unpredictable performance of cairo-xlib with non-integer translations of a + source surface pattern + (https://bugs.freedesktop.org/show_bug.cgi?id=15479), + source surfaces with a fractional translation hit slow paths for some + drivers, causing seemingly random performance variations. As a work-around + Owen Taylor proposed that cairo could convert non-integer translations on + NEAREST sources patterns to their integer equivalents. + + The messy detail involved here is replicating the rounding mode used by + pixman for the sample offset, but otherwise the conversion is fairly + trivial. + + src/cairo-pattern.c | 35 +++++++++ + test/.gitignore | 1 + + test/Makefile.am | 5 ++ + test/filter-nearest-transformed-pdf-ref.png | Bin 0 -> 373 bytes + test/filter-nearest-transformed-ref.png | Bin 0 -> 151 bytes + test/filter-nearest-transformed-svg11-ref.png | Bin 0 -> 217 bytes + test/filter-nearest-transformed-svg12-ref.png | Bin 0 -> 217 bytes + test/filter-nearest-transformed.c | 103 ++++++++++++++++++++++++++ + 8 files changed, 144 insertions(+) + +commit ceab32e2c3d51c0dd29b105a5a390cdd8aa58f8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 12 12:11:12 2008 +0100 + + [win32] win32 also uses font subsets. + + Include win32 in the list of font subset users, fixes build when + cross-compiling. + + src/cairoint.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 1d3453eee50e4343995c5d3f225d18289fbcebec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 12 11:21:14 2008 +0100 + + [pattern] Rescale the linear pattern matrix to avoid overflow. + + As proof-of-principle, compute a scale factor to avoid overflow when + converting a linear pattern to pixman_fixed_t. Fixes test/huge-pattern, + but the principle should be extended to handle more cases of overflow. + + src/cairo-pattern.c | 48 +++++++++++++++++++++++++++++++----- + test/Makefile.am | 5 ++-- + test/huge-pattern-pdf-ref.png | Bin 0 -> 2716 bytes + test/huge-pattern-pdf-rgb24-ref.png | Bin 0 -> 2817 bytes + test/huge-pattern-ps3-ref.png | Bin 0 -> 1786 bytes + 5 files changed, 45 insertions(+), 8 deletions(-) + +commit ab1d106cba7aa4abe5f7253c089aadd15e0bb06d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 11 19:52:28 2008 +0100 + + [xlib] Use the cached xrender formats. + + Use the cached formats for consistency and simplify several double pointer + dereferences. + + src/cairo-xlib-surface.c | 64 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 40 insertions(+), 24 deletions(-) + +commit 6736faba3ebe4eae4c1d2aeeb3153eb6f12a32de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 11 18:10:16 2008 +0100 + + [test/any2ppm] Do not attempt to compile PS without spectre + + Since CAN_TEST_PS_SURFACE does not currently require spectre, we were + attempting to compile in spectre support for any2ppm even on systems + without libspectre installed. Fix that by adding a separate flag for + CAIRO_HAS_SPECTRE. + + configure.ac | 5 ++++- + test/Makefile.am | 2 +- + test/any2ppm.c | 28 ++++++++++++++++++++-------- + 3 files changed, 25 insertions(+), 10 deletions(-) + +commit b35871116243724b59738fce00b512818c83ea17 +Author: Benjamin Otte <otte@gnome.org> +Date: Sat Oct 11 00:18:11 2008 +0100 + + [test] Add huge pattern. + + Add a test case to exercise range overflow during gradient construction. + + test/.gitignore | 1 + + test/Makefile.am | 4 +++ + test/huge-pattern-ref.png | Bin 0 -> 1619 bytes + test/huge-pattern.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 79 insertions(+) + +commit 77070270813d2ca40d422e5301f75222d19e1d8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 10 22:24:01 2008 +0100 + + [test] Use _POSIX_C_SOURCE for flockfile. + + From bug 18010 (https://bugs.freedesktop.org/show_bug.cgi?id=18010), + in order to make flockfile() available we need to set _POSIX_C_SOURCE and + according to the man page, the appropriate feature check is + _POSIX_THREAD_SAFE_FUNCTIONS. + + test/cairo-test.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 34ff7e4ac42acfb2ab9921da21933113518bd8a0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 11 23:44:37 2008 +1030 + + Check that reads in truetype_reverse_cmap are within valid data + + Bulia Byak reported a bug where cairo was crashing with a particular + font. The font had an incorrect entry in the cmap table that caused + cairo to read from outside of the buffer allocated for the cmap. + + src/cairo-truetype-subset.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit a16ef6ead2b02120ca482aa3d2667e51b0c67e78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 10 18:03:49 2008 +0100 + + [INSTALL] Mention pkg-config requirement + + Mention that building the configure script requires at least version 0.16 + of pkg-config. + + See the old bug: + Bug 4702 PKG_PROG_PKG_CONFIG: command not found + (https://bugs.freedesktop.org/show_bug.cgi?id=4702) + + INSTALL | 1 + + 1 file changed, 1 insertion(+) + +commit eba9d87d541d89804f70e56874538a249de08502 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 10 16:51:07 2008 +0100 + + [image] Warn about a potential NULL return after finish(). + + Improve the wording as suggested by + https://bugs.freedesktop.org/show_bug.cgi?id=12659 + to warn about the possibility of returning NULL even if the passed in + surface was an image surface. + + src/cairo-image-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ac3e4b4bea574c94de77ec15878d116b619ee3f4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 10 14:00:32 2008 +0100 + + [xlib] Disable XRender support if the surface has no xrender_format + + Bug 11734: + XRender crashes due to NULL pointer from Cairo on SGI O2 + (https://bugs.freedesktop.org/show_bug.cgi?id=1173) + is an example of a case where we try to perform an XRender operation on a + surface with a format that was not supported by the XRender extension. By + marking the extension version as -1 on those surfaces, the current checks + for SURFACE_RENDER_HAS_* always correctly return false and prevent us try + to create a Picture with a NULL xrender_format. + + src/cairo-xlib-surface.c | 37 ++++++++++++++++++++++++------------- + 1 file changed, 24 insertions(+), 13 deletions(-) + +commit 8ac8e8c523abaa5db24c5303c671ff3487bf0801 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 21 14:29:30 2008 +0200 + + [test] Add ps2png check program using libspectre + + Add a simple program to compliment pdf2png and svg2png. + + configure.ac | 1 + + test/Makefile.am | 8 ++++ + test/ps2png.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 122 insertions(+) + +commit 3e6afb353da1fee624b519f5a96b3303c7eb91ae +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Oct 9 12:11:51 2008 +0100 + + [test/any2ppm] Enable PS conversion using libspectre. + + Complete the vector trilogy using libspectre to provide a similar + interface (to poppler and librsvg) around GhostScript. + + AUTHORS | 1 + + configure.ac | 20 ++++++++++++---- + test/Makefile.am | 4 ++-- + test/any2ppm.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 4 files changed, 90 insertions(+), 8 deletions(-) + +commit ddd1615a1777181c6e8db1dbafacb68535ed163a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 23:13:03 2008 +0100 + + [pattern] Remove incorrect assert. + + It's possible to reach that point without setting the filter to NEAREST, + for example if using FAST or GAUSSIAN. + + src/cairo-pattern.c | 1 - + 1 file changed, 1 deletion(-) + +commit c647c0bbca8694a14f5f5807b8349f0b0bb4987d +Author: Benjamin Otte <otte@gnome.org> +Date: Thu Oct 9 13:21:27 2008 +0200 + + [TEST] make imagediff work again + + It seems to have bitrotten + + test/imagediff.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit f644d78dc138a7ba920a108dfb058e9f0fdb5302 +Author: Björn Lindqvist <bjourne@gmail.com> +Date: Wed Oct 8 20:08:25 2008 +0100 + + [perf] Add composite performance test. + + Add a new test case to Cairo for checking the performance of Cairo's + equivalent to GDK's gdk_pixbuf_composite_color() operation. That is an + operation that happens to be extremely useful when viewing or editing + transparent images so I think it is important that it is as fast as + possible. + + AUTHORS | 1 + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/composite-checker.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 112 insertions(+) + +commit 96b083d3f0e47f919cb6d0f06735427eaea21565 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 18:53:46 2008 +0100 + + [test] Exercise degenerate dashes. + + Add a test case to capture the current behaviour when a segment ends on + an off/on dash transition. + + Originally filed as bug: + Miter artifacts for dashed strokes + https://bugs.freedesktop.org/show_bug.cgi?id=17973 + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/degenerate-dash-ref.png | Bin 0 -> 2005 bytes + test/degenerate-dash.c | 97 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 100 insertions(+) + +commit 6487a147a2129f588aae900b048b2a801ef95ec0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 15:26:03 2008 +0100 + + [cairo.h] Be defensive when checking for _MSC_VER + + Since cairo.h is a public header file, we need to be careful so that it + can be compiled by random compilers and even users specifying "-Werror + -Wundef" (mentioning no names, Company). So replace the bare (and legal) + #if _MSC_VER + with + #if defined (_MSC_VER) + just in case. + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 59141e56a723f741c87e2eaa37bf96e243ac5728 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 13:50:28 2008 +0100 + + [win32] Restore fine-grained fallback support for printing. + + Missed updating win32 when implementing the new paginated API to query + support for the fine-grained fallbacks. + + (Thanks to Adrian for spotting this oversight.) + + src/cairo-win32-printing-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 565c02a37e2d140a20867081eea9bb5de9999b1c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 8 11:06:42 2008 +0100 + + [svg] Use finer-grained fallbacks for SVG 1.2 + + The use of fine-grained fallbacks requires the native support of the + SOURCE operator applied to an image on the target surface. SVG 1.2 + introduces the "comp-op:src" mode fulfilling this criteria - so we can + enable fine-grained fallbacks for 1.2+. + + Update test/fine-grained-fallbacks to exercise this pathway in SVG 1.2 - + as SVG natively supported all the current operations within that test. + This reveals yet another librsvg bug in handling SVG 1.2. + + src/cairo-paginated-private.h | 9 ++- + src/cairo-paginated-surface.c | 47 +++++--------- + src/cairo-pdf-surface.c | 14 ++++- + src/cairo-ps-surface.c | 8 +++ + src/cairo-svg-surface.c | 34 +++++++--- + test/Makefile.am | 4 +- + test/finer-grained-fallbacks-ps2-argb32-ref.png | Bin 1047 -> 0 bytes + test/finer-grained-fallbacks-ps2-ref.png | Bin 0 -> 1356 bytes + test/finer-grained-fallbacks-ps2-rgb24-ref.png | Bin 819 -> 1096 bytes + test/finer-grained-fallbacks-ps3-argb32-ref.png | Bin 1047 -> 0 bytes + test/finer-grained-fallbacks-ps3-ref.png | Bin 0 -> 1356 bytes + test/finer-grained-fallbacks-ps3-rgb24-ref.png | Bin 819 -> 1096 bytes + test/finer-grained-fallbacks-ref.png | Bin 796 -> 1111 bytes + test/finer-grained-fallbacks-rgb24-ref.png | Bin 590 -> 1114 bytes + test/finer-grained-fallbacks.c | 79 +++++++++++++++++++++++- + 15 files changed, 147 insertions(+), 48 deletions(-) + +commit 0c777a3e0de0d48289432a3d66be68f8779b08a0 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 7 15:20:33 2008 -0700 + + [win32] Use wide-char versions of some API functions, for compat with Windows Mobile + + src/cairo-win32-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit cf572b58e1197dac0ff1795b27b142c3e044cf45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 09:55:03 2008 +0100 + + [tessellator] Compile fixes for !HAVE_INT64_T + + Fixup a couple of instances of implicit down-casting to 32bits from a + 64bit wide integer and add a new is_zero() predicate. + + src/cairo-bentley-ottmann.c | 14 +++++++------- + src/cairo-wideint-private.h | 10 +++++++++- + 2 files changed, 16 insertions(+), 8 deletions(-) + +commit 6b8c0559620ab23c4df1f381d2e95ffc307d2e2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 09:43:45 2008 +0100 + + [tessellator] Avoid implicit promotion to 64bit integer. + + Avoid passing a 32bit integer as a cairo_int64_t in case we do not have a + 64bit native integral type. As a side-effect this means we can also use a + narrower multiply. + + src/cairo-bentley-ottmann.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit eaa4bd13926728e9da97a23df8a465ef2296049a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 21:09:16 2008 +0100 + + [pattern] After cloning adjust [xy]_offset if possible. + + For the simple case where the pattern matrix only contains an integer + translation then care is taken to convert that to a identity source matrix + with the translation applied to the [xy]_offsets. 5b97ee6525 broke this + guarantee by applying the clone offsets to the source matrix. So when the + source matrix is identity we can simply adjust the [xy]_offsets and + preserve the identity matrix. (This idea can be extended further by + removing any integer translation from the source matrix and storing it in + the [xy]_offsets as a means to extend the limited precision in + pixman_matrix_t - encountered when downscaling large images offset onto + the target surface.) + + src/cairo-pattern.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 552cc09e6be2b704dc32f986c84640d50316c25c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 21:05:57 2008 +0100 + + [xlib] Check integer translation for XCopyArea. + + A precondition for using the core XCopyArea protocol is that the source + attributes contain only integer translations. However, we failed to apply + any integer translations from the source matrix to the XCopyArea offsets. + This worked prior to 5b97ee6525 as + _cairo_pattern_acquire_surface_for_surface() was careful to only generate + an identity matrix if the pattern matrix only contained an integer + translation (and thus we would use XCopyArea in the xlib backend). + + src/cairo-xlib-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 308485a3fc70bc4455a01990443c1f954b8a66f8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 7 20:19:10 2008 +0100 + + [test] Add a test for a reported regression by Michael Natterer. + + mitch reported on irc that expose events in the gimp were suffering from + artifacts which he tracked down to a bug with clipping and source + surfaces. This is the cairo test case for that regression. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/clipped-surface-ref.png | Bin 0 -> 401 bytes + test/clipped-surface.c | 70 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 73 insertions(+) + +commit 28a3b546b91290f3377777adedcf7ab71e599188 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 7 10:25:46 2008 -0700 + + [win32] create_similar should fall back to DIBs if DDB creation fail + + src/cairo-win32-surface.c | 43 +++++++++++++++++-------------------------- + 1 file changed, 17 insertions(+), 26 deletions(-) + +commit 4ae37a97b3e415591caa611533f44db5a29cfb72 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 7 10:18:41 2008 -0700 + + [quartz] initialize do_reflect field correctly for pattern draws + + src/cairo-quartz-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 8cf399b944294645833088ee2ac1313093948b66 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 18:59:15 2008 +0100 + + [test] Add a test to exercise the internal twin font + + Although Behdad promises that the rendering is subject to improvement, + introduce a test to check consistency across platforms and update as + required. + + test/.gitignore | 1 + + test/Makefile.am | 4 ++++ + test/twin-ps2-ref.png | Bin 0 -> 1167 bytes + test/twin-ps3-ref.png | Bin 0 -> 1167 bytes + test/twin-ref.png | Bin 0 -> 1836 bytes + test/twin.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 65 insertions(+) + +commit 1f813ff04022a36a91bf9d1b0f7f2ae1c63b399f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 17:55:37 2008 +0100 + + [array] Silence gtk-doc complaints. + + gtk-doc fails make check for array as it insists that even the simplest + functions must have a long description and cannot be entirely described by + their arguments and return value. + + src/cairo-array.c | 26 ++++++++++++++++++++------ + 1 file changed, 20 insertions(+), 6 deletions(-) + +commit 7cb9ccb4cb2106bb59e181ee284f8dcc5504eb7a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 17:44:03 2008 +0100 + + Fixup a couple of trivials doc warnings. + + Correct the 'Returns' statement to match what gtk-doc expects. + + src/cairo-cache.c | 3 +-- + src/cairo-pattern.c | 5 ++--- + 2 files changed, 3 insertions(+), 5 deletions(-) + +commit d6f0351b6cbb0d542a069eb5d0a7377eb85a6e4e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 17:17:04 2008 +0100 + + [skiplist] Avoid repeated calls to compare on the same element when inserting. + + During insertion we must traverse the skiplist in order to find the + insertion point for the new element. As we descend each level, the next + element in the chain for this level is sometimes the same as the one we + just compared against (and know that the new element is greater than). + Hence we can skip the search on that level and descend to the next. During + world_map this reduces the number of calls into _sweep_line_elt_compare() + by ~2.5% (and when performing trapezoidation on strokes gives a similar + speed up of about 2% - not bad for the addition of a single line.) + + src/cairo-skiplist.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 1440399625ae0579d0748475fc924cfe74339a21 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 16:15:29 2008 +0100 + + [hull] Replace open-coding of 64bit arithmetic. + + Use primitives from cairo-wideint-private.h - in this case it helps to + make the code more readable as well as reduce dependence on native 64bit + integers. + + src/cairo-hull.c | 31 +++++++++++++++++++------------ + 1 file changed, 19 insertions(+), 12 deletions(-) + +commit c6a6bf580fa7036e4c28137f8c038beb5c347244 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 16:13:21 2008 +0100 + + [slope] Replace open-coding 64bit integer arithmetic. + + Prefer to use the operations form cairo-wideint-private.h in order to + improve readability and reduce our assumptions on the availability of + 64bit integers. + + src/cairo-slope.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit 5e3fcb7934f568bb7e304a1c434a9370b693df17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 6 17:02:54 2008 +0100 + + [wideint] Declare the wideint arithmetic functions as const. + + 'const' is a stricter form of 'pure' in that functions declared with that + attribute do not access any values other than their arguments (in + contrast to 'pure' which is allowed to read from global memory). + + src/cairo-compiler-private.h | 2 ++ + src/cairo-wideint-private.h | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 9430bf57ebc86c79e28128e54aeb5a194c9cad03 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 6 14:00:37 2008 -0700 + + Fix scrambled version number in generated documentation. + + In the cairo 1.8.0 release the documentation would get generated with + the second and third version components transposed, (so it would say + 1.0.8). Fix the obviously mistaken transposition. + + doc/public/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5beae8f530fe7056fa965cb5ca7b345a667e8122 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 6 12:43:42 2008 -0400 + + [Makefile.am.releasing] Make 'make snapshot' print a banner when done + + Copied from "make distcheck" implementation. Prints something like: + + ============================================================= + cairo-1.8.1-20081006-38de89 archives ready for distribution: + cairo-1.8.1-20081006-38de89.tar.gz + ============================================================= + + build/Makefile.am.releasing | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 38de895d3863bd2e6fe921ad6cc6eeff15102701 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 6 12:11:18 2008 -0400 + + [RELEASING] Fix sample distcheck output to reflect current versioning + + RELEASING | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f8018cf193823356270c8e7f21f3108fbe44679c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 6 11:45:08 2008 -0400 + + [boilerplate] Fix "make dist" + + The cairo-boilerplate-ps/pdf/svg.h files where removed in commit + 9841d9d58ea286f798626d325d50a85bf3f02c8f but the Makefile.sources + listing was not updated. + + boilerplate/Makefile.sources | 3 --- + 1 file changed, 3 deletions(-) + +commit 6578ac148ecdd236b0860923e5dee87291c9966c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 6 11:39:47 2008 -0400 + + [twin-font] Make the stroke lighter + + I'm still to fine-tune the font and add hinting and bold/oblique support. + In the mean time though, a lighter stroke produces much nicer glyphs. + + src/cairo-font-face-twin.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2fb7753903daf5c207b22034682a250161af22ad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 6 11:39:00 2008 -0400 + + [Makefile.am.releasing] Exclude uid/gid from tarball + + By setting GNU tar options --owner=0 --group=0 + + build/Makefile.am.releasing | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 589564c3b02d5b0505806924bd051323717791a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Oct 4 01:36:07 2008 -0400 + + [user-font] Fix comment re backend interface + + src/cairo-user-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c98c1cb5325bbc05c88ea350ff99d6eaf56fd339 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 5 10:39:10 2008 +0100 + + [wideint] Mark functions as pure + + Take advantage of the gcc function attribute 'pure', which tells gcc that + the function result only depends upon its arguments and it has zero side + effects (e.g. it does not clobber memory). This gives gcc greater + opportunity to rearrange and optimize the wideint arithmetic. + + src/cairo-compiler-private.h | 6 ++++++ + src/cairo-wideint-private.h | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 76dd4603d01068b1b377312ced6b44fe5419794f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 5 10:15:49 2008 +0100 + + [tessellator] Replace open-coding _cairo_int64_cmp(). + + We often use the construct: + if (_cairo_int64_lt (A, B) + return -1; + if (_cairo_int64_gt (A, B) + return 1; + return 0; + to compare two large integers (int64, or int128) which does twice the + required work on CPUs without large integer support. So replace it with a + single wideint function _cairo_int64_cmp() and therefore allow + opportunities to both shrink the code size and write a more efficient + comparison. (The primarily motivation is to simply replace each block with + a single more expressive line.) + + src/cairo-bentley-ottmann.c | 19 +++--------------- + src/cairo-wideint-private.h | 10 +++++++++- + src/cairo-wideint.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 60 insertions(+), 17 deletions(-) + +commit 6eead4a5f746e182eabfcda9959cd9cc53d95a89 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 4 12:39:21 2008 +0100 + + [stroke] Simplify dash-off logic. + + Remove a redundant level of if-else branching (and remove a duplicate + code) block by testing dash_on first. + + src/cairo-path-stroke.c | 65 +++++++++++++++++++++---------------------------- + 1 file changed, 28 insertions(+), 37 deletions(-) + +commit 4aa0991a11f03a47735dcfafe43d9505b939554e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 4 20:22:18 2008 +0100 + + [test] Mark fallback-resolution as XFAIL. + + There appears to be no simple solution here, as it seems to be a + fundamental flaw in the design of the meta-surface wrt to replaying into + a fallback image. (I may be wrong, but if Carl found no easy solution then + I feel no shame for my own failure ;-) + + test/Makefile.am | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit ae87382a84770f8656c369d258f705b8ac20049c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 4 10:54:25 2008 +0100 + + [tessellator] Special case edge comparisons when on either end-point. + + If the sweep-line is currently on an end-point of a line, + then we know its precise x value and can use a cheaper comparator. + Considering that we often need to compare events at end-points (for + instance on a start event), this happens frequently enough to warrant + special casing. + + src/cairo-bentley-ottmann.c | 100 ++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 96 insertions(+), 4 deletions(-) + +commit ab23c2995356821537b9a0facdff87c339a05d2a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 1 12:18:16 2008 +0100 + + [tessellator] Direct comparison of result in edges_compare_x_for_y. + + We need to compare the x-coordinate of a line at a for a particular y, + without loss of precision. + + The x-coordinate along an edge for a given y is: + X = A_x + (Y - A_y) * A_dx / A_dy + + So the inequality we wish to test is: + A_x + (Y - A_y) * A_dx / A_dy -?- B_x + (Y - B_y) * B_dx / B_dy, + where -?- is our inequality operator. + + By construction we know that A_dy and B_dy (and (Y - A_y), (Y - B_y)) are + all positive, so we can rearrange it thus without causing a sign + change: + A_dy * B_dy * (A_x - B_x) -?- (Y - B_y) * B_dx * A_dy + - (Y - A_y) * A_dx * B_dy + + Given the assumption that all the deltas fit within 32 bits, we can compute + this comparison directly using 128 bit arithmetic. + + src/cairo-bentley-ottmann.c | 97 +++++++++++++++++++++++++-------------------- + src/cairo-wideint-private.h | 1 + + 2 files changed, 56 insertions(+), 42 deletions(-) + +commit 7db03ac68cd556c903c07a2e2f8b75ec51263d12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 1 12:34:36 2008 +0100 + + [tessellator] Use abort() instead of exit(). + + More friendly when debugging, as the debug will (by default) catch the + SIGTRAP and break at the offending test. + + src/cairo-bentley-ottmann.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 59e569576d00e9c1cb66a77cf447c3cc3fb038e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 19:04:39 2008 +0100 + + [traps] Discard trivially empty trapezoid. + + The convex_quad tessellator (and possibly even the more general polygon + tessellator) will generate empty trapezoids when given a + rectangle which can be trivially discarded before inserting into traps. + + src/cairo-traps.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 7a2329e9c8afbfecb88c6c50bd63aa03ea7f9f81 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 1 09:49:45 2008 +0100 + + [traps] Reset extents on clearing. + + When clearing the array of current trapezoids, reset the extents to + infinite so that they are properly recomputed. + + src/cairo-traps.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8ec24a443d45b012df9b1a14b00a0b5b1c43e2ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 23:19:01 2008 +0100 + + [xlib] Share the common conditions for starting a new xGlyphElt using a macro. + + Move the predicate for starting a new glyph elt into a macro so that it + can be shared between _cairo_xlib_surface_emit_glyphs() and + _emit_glyph_chunks() without code duplication. + + src/cairo-xlib-surface.c | 39 ++++++++++++++++++++++----------------- + 1 file changed, 22 insertions(+), 17 deletions(-) + +commit a593338b2c2cdaff808947436f8fb9a52d74c695 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 1 16:24:33 2008 +0100 + + [xcb] Return false from _cairo_xcb_surface_is_similar(). + + _cairo_xcb_surface_is_similar() is currently only used by the pattern + cache to determine whether to keep the surface in the solid color cache. + This is fundamentally broken without hooking into Display closure as it + keeps a reference to an expired picture. So in order to prevent spurious + application crashes, disable the caching for xcb. + + src/cairo-xcb-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 65f1575f6b2392d59410f40281a52654053bd2a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 1 16:16:45 2008 +0100 + + [xcb] Compile fix. + + Must compile xcb more often. Especially after copying code over from xlib. + + src/cairo-xcb-surface.c | 41 ++++++++++++++++++++++++----------------- + 1 file changed, 24 insertions(+), 17 deletions(-) + +commit e76432f7544d5b3b9157f09e18acc167d9ee90a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Oct 4 00:35:43 2008 -0400 + + [win32] Use -MDd and -LDd instead of -MD and -LD for debug build + + As reported by Damian Frank: + + "I ran into a hitch with the Makefile.win32 infrastructure. It uses -MD and + -LD when linking regardless of the config, but it should be using -MDd and + -LDd for the debug config. I believe both the Makefile.win32.common and + src/Makefile.win32 files include erroneous declarations. This produces + warnings at link time about a mismatch when linking against properly created + debug libs (for instance, I had a zlib built as "LIB ASM Debug" that linked + properly against the debug runtime). + + This problem applies to pixman too; can you pass this along to the + maintainer?" + + Would be delighted to if someone commits a fix to pixman reading this + commit message. + + build/Makefile.win32.common | 8 ++++++-- + src/Makefile.win32 | 2 +- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 8ea9cb187a198c64bfb79af8001d95eab29715b4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 1 14:12:18 2008 -0700 + + Use symbolic constants for Render repeat modes. + + Names like RepeatNone and RepeatNormal are much easier to + read and understand than bare 0 and 1. + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2c58a2c3851afac0386fcf0bf8504a937231185c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 30 17:55:01 2008 -0400 + + [xlib] Start a new glyph element every 128 glyphs + + Xrender has limits at 252 glyphs. We play safe and fast and limit + elements to 128 glyphs. That's plenty, no measurable performance + hit expected. + + src/cairo-xlib-surface.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit fd7e09c7e66876b8492424e1c7d1260c12cc17f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 30 17:46:06 2008 -0400 + + [xlib] Allow room for glyph element padding + + Xrender pads glyph elements to 4byte boundaries. We didn't consider + that in our request size calculations. We do now. + + src/cairo-xlib-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit c01fb77abbaf28c03aa6a21ebb997638dbdf950b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 30 17:41:51 2008 -0400 + + [xlib] s/_cairo_xlib_surface_emit_glyphs_chunk/_emit_glyphs_chunk/ + + For readability's sake. + + src/cairo-xlib-surface.c | 34 +++++++++++++++++----------------- + 1 file changed, 17 insertions(+), 17 deletions(-) + +commit c2ba25df1aec1cebfc4ce85e06a4187950675820 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 30 17:40:56 2008 -0400 + + [xlib] Add comment about glyph chunk invariant + + src/cairo-xlib-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e983458e1fba15153815430c83619da53929139d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 30 17:26:46 2008 -0400 + + Revert "[xlib] Correct calculation of XRenderComposite* request size." + + This reverts commit 0eb0c26474a19477554bfd580aa5f8ae77c29779. + The change was too drastic and overlooked some subleties of the old + code, but the main reason for the revert is that it introduced an + ugly duplicated glyph flush block. I'm working on a more incremental + fix. + + src/cairo-xlib-surface.c | 123 +++++++++++++++++------------------------------ + 1 file changed, 45 insertions(+), 78 deletions(-) + +commit 32a158528884562f4b22a81da3fa352ee1061835 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 30 15:20:36 2008 -0400 + + [configure.ac] Require autoconf >= 2.59 and automake >= 1.9.6 + + These are the versions available on RHEL5 (two years old now), and + we know cairo works with them. There's evidence that our build system + does not work with older automake, and we've been requiring autoconf 2.58 + but no one ever tested 2.58 with the new build system. It's very likely + that 2.58 doesn't work and needs some macro backporting. In any case, + no one reported that they have 2.58 when I asked on the list. + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0eb0c26474a19477554bfd580aa5f8ae77c29779 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 13:33:25 2008 +0100 + + [xlib] Correct calculation of XRenderComposite* request size. + + show-glyphs-many is triggering an assertion failure within xlib. The cause + appears to be that we are submitting an overlong request. + + Reviewing the code and comparing with libXrender/src/Glyph.c I found two + points to address. + + 1. When encountering the first 2-byte, or 4-byte glyph and thus triggering + the recalculation of the current request_size, we did not check that there + was enough room for the expanded request. In case there is not, we need to + emit the current request (before expansion) and reset. + + 2. Subtleties in how XRenderCompositeText* constructs the binary protocol + buffer require that xGlyphElts are aligned to 32-bit boundaries and that + it inserts an additional xGlyphElt every 252 glyphs when width==1 or + every 254 glyphs for width==2 || width==4. Thus we need to explicitly + compute how many bytes would be required to add this glyph in accordance + with the above. + + Considering the complexity (and apparent fragility since we require tight + coupling to XRender) of the code, I'm sure there are more bugs to be + found. + + src/cairo-xlib-surface.c | 123 ++++++++++++++++++++++++++++++----------------- + 1 file changed, 78 insertions(+), 45 deletions(-) + +commit 02a56a4c84cd07a2c33134974680bad7f17f733d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 15:08:54 2008 +0100 + + [test/show-glyphs-many] Exercise xlib boundary conditions. + + Within _cairo_xlib_surface_emit_glyphs() there are a number of + complications to do with packing as many glyphs as possible into a + single XRenderCompositeGlyph*() call. Essentially these consist of + choosing the right function and packing for the current glyphs, describing + runs of glyphs and ensuring that we do not exceed the maximum request size + within a single call. So we add to the test case we an attempt to show 64k + 2-byte glyphs and an attempt to mix 64k 1-byte and 2-byte glyphs, with the + change-over point chosen to overflow the maximum request size, should + _cairo_xlib_surface_emit_glyphs() naively resize the current request. + + test/show-glyphs-many.c | 83 ++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 64 insertions(+), 19 deletions(-) + +commit 2a347a92b0a27a42840f9538cb98f792be12b277 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 13:29:35 2008 +0100 + + [test/show-glyphs-many] Re-enable test to trigger crash in xlib. + + Moral of this story is bugs cluster. If we made a mistake, especially in a + complicated bit of code that is interfacing with another library, then we + are likely to make a similar mistake in future. Disabling this test hid a + regression between 1.4 and 1.6. + + test/Makefile.am | 15 +-------------- + test/show-glyphs-many.c | 9 +++++++++ + 2 files changed, 10 insertions(+), 14 deletions(-) + +commit fade54e71a48919cc3e8311e202960c66eab74bf +Author: Torsten Schönfeld <kaffeetisch@gmx.de> +Date: Tue Sep 30 11:47:53 2008 +0100 + + [doc] Add links to solid pattern constructors. + + Add links for the solid pattern constructors to the language bindings + guidelines in line with the other pattern types. + + doc/public/language-bindings.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d9f50d7841fa0216df157ba632483c8b27c50119 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 11:03:29 2008 +0100 + + [test/filter-nearest-offset] Remove XFAIL status + + I swear that when I said that it was a rounding error, I was looking at an + image where the squares were overlapping the lines and had a listing of + all the coordinates used. However, the current output on all the machines + I have to hand is correct so I believe the underlying bug to be fixed. + + Update the reference images for the external renderers because (a) GS + exhibits the same bug cairo had and (b) librvsg/PDF do not use NEAREST + when applying surface patterns, so the squares are blurred as a result. + + test/Makefile.am | 8 +++++--- + test/filter-nearest-offset-pdf-ref.png | Bin 0 -> 4537 bytes + test/filter-nearest-offset-ps2-ref.png | Bin 0 -> 255 bytes + test/filter-nearest-offset-ps3-ref.png | Bin 0 -> 255 bytes + test/filter-nearest-offset-svg11-ref.png | Bin 0 -> 4739 bytes + test/filter-nearest-offset-svg12-ref.png | Bin 0 -> 4739 bytes + test/filter-nearest-offset.c | 3 +-- + 7 files changed, 6 insertions(+), 5 deletions(-) + +commit 7d5e6a18d5e72366e19cb806cbdad5ed180b53da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 10:04:12 2008 +0100 + + [test/filter-nearest-offset] Paint a grey background + + Avoid requiring (an absent!) rgb24 ref image by using an opaque grey + background. Confirm the reference image is identical to the old one + (modulo the background change) using GIMP. + + test/filter-nearest-offset-ref.png | Bin 254 -> 248 bytes + test/filter-nearest-offset.c | 6 ++++++ + 2 files changed, 6 insertions(+) + +commit 35be08715595aa0bda48ce0b3cb11711eee55c64 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 30 10:54:45 2008 +0100 + + [Makefile.am] Only rerun headers-standalone if a header file has changed + + Use a stamp to mark the time that the headers were last checked and only + rerun the test if any have been modified since. + + src/.gitignore | 1 + + src/Makefile.am.analysis | 4 +++- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 6da8d8ea62399d94281a2a262a630ef113062d0c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 17:56:34 2008 +0100 + + [pattern] Fix up OBO introduced to cloned area + + In the midst of porting 5eec3e378afd6ff9991cea8e42b8478eb3e79773 I failed + to include the pad in the floor() and ceil() which introduces two + potential off-by-one errors into each dimension of the region of interest + of the source surface. + + src/cairo-pattern.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e3f9e40df74b0334c2b544790fd3485ba527bd55 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 29 11:49:04 2008 -0400 + + Fix residues of the Makefile.*.config Makefile.*.features renaming + + They just don't seem to want to die... + + boilerplate/Makefile.win32 | 2 +- + src/Makefile.sources | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit d703f964aa7d1d4c8ec0b8a5dee437c222ce8629 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 16:37:35 2008 +0100 + + Clean up compile warnings. + + A couple of unchecked status returns (which should always be + CAIRO_STATUS_SUCCESS) and an unused variable. + + src/cairo-surface.c | 8 ++++++-- + src/cairo-svg-surface.c | 1 - + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 1310df44edcf0b9fee648c8f8688d4a1177cde68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 29 11:34:19 2008 -0400 + + [text_to_glyphs] Further enhance the docs + + The most complex public cairo API deserves more doc love... + + src/cairo-scaled-font.c | 8 +++++--- + src/cairo-user-font.c | 5 +++++ + src/cairo.h | 2 +- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 41c66a9dfa9f4e7b9839db9dc362f5fa48797561 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 15:28:28 2008 +0100 + + [test/xlib-surface-source] Fix ill-timed XCloseDisplay + + Sigh - finding a crasher in xlib seemed too good to be true. And it was. + The bug is due to the coupling of the XCloseDisplay with the user_data on + the source surface. + + This was an externally trigger XCloseDisplay whilst the user had live + surfaces, so I consider this a gross application bug and therefore does + not require graceful handling within cairo-xlib. However, I'm willing to + listen to reason... + + test/surface-source.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 63ee963c63a73cf6d9272e15a7d8f7b63f12e77b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 15:09:23 2008 +0100 + + [user-font] Rewrite text_to_glyphs allocation instructions. + + Resolve the seemingly conflicting two paragraphs that instruct the writer + of a user-font on when to allocate the glyphs array during text_to_glyphs, + so that it is consistent with itself and the code. In particular, I could + find no indication in the code that num_glyphs is preset to -1 (it should + be a user parameter reflecting the number of entries in the supplied glyph + buffer) and the callback must allocate the array using + cairo_glyph_allocate(). + + src/cairo.h | 33 ++++++++++++++------------------- + 1 file changed, 14 insertions(+), 19 deletions(-) + +commit c23dbc4c616aed05dfe71901ce7ac0cadcbfb13d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 13:54:12 2008 +0100 + + [test/surface-source] Modify to trigger a crash. + + Whilst investigating: + Bug 7360 painting huge surfaces fails + https://bugs.freedesktop.org/show_bug.cgi?id=7360 + I found a particular combination of operations that cause a crash within + xlib, so I'm committing the test for posterity. + + test/surface-source.c | 50 ++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 38 insertions(+), 12 deletions(-) + +commit 3b33d49d37a5751e7848516c468b323e19c34bea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 08:14:24 2008 +0100 + + [test/filter-bilinear-extents] Remove XFAIL. + + With the reintroduction of Carl Worth's and Owen Taylor's work to expand + pattern extents as necessary to include extra samples due to the filter + radius, we expect filter-bilinear-extents to PASS. This patch series is + important as it factors out our assumptions about filter radius into a + single function and cleans up the code in its wake. + + However, since the external PS/PDF renderers do not necessarily use the same + filter as cairo (and currently they only use NEAREST due to lack of + /Interpolate emission in those backends) we can expect differences in test + output. So add the respective reference images to capture current + expectations and to highlight future changes. + + Fixes bugs: + Bug 15349 - bad clipping with EXTEND_NONE + [https://bugs.freedesktop.org/show_bug.cgi?id=15349], + Bug 15367 -Improve filtering handling in cairo-pattern.c + [https://bugs.freedesktop.org/show_bug.cgi?id=15367] + + test/Makefile.am | 35 ++++++++++++++++++++++++++++++- + test/filter-bilinear-extents-pdf-ref.png | Bin 0 -> 798 bytes + test/filter-bilinear-extents-ps2-ref.png | Bin 0 -> 173 bytes + test/filter-bilinear-extents-ps3-ref.png | Bin 0 -> 173 bytes + 4 files changed, 34 insertions(+), 1 deletion(-) + +commit 5eec3e378afd6ff9991cea8e42b8478eb3e79773 +Author: Owen W. Taylor <otaylor@fishsoup.net> +Date: Mon Sep 29 00:53:59 2008 +0100 + + [pattern] Improve handling of filter radius and optimize when possible. + + Factor out common filter analysis code from _cairo_pattern_get_extents() + so that we can share it with _cairo_pattern_acquire_surface_for_surface() + as well. During the analysis of the filter determine whether the pattern + matrix maps source pixels exactly onto destination pixels and if so convert + the filter to NEAREST - generalising the existing conversion to NEAREST. + + (Patch ported to master by Chris Wilson, all bugs are his.) + + src/cairo-matrix.c | 29 ++++++++++++++ + src/cairo-pattern.c | 113 ++++++++++++++++++++++++++++++++++++---------------- + src/cairoint.h | 3 ++ + 3 files changed, 110 insertions(+), 35 deletions(-) + +commit 7d7057cf8896a3558fadc35d160d3bc667972800 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 4 19:00:28 2008 -0700 + + _cairo_pattern_get_extents: Fix to allow for expansion based on filter + + This fixes the filter-bilinear-extents test case and the + related bug entry: + + bad clipping with EXTEND_NONE + http://bugs.freedesktop.org/show_bug.cgi?id=15349 + + Though there are still differences in the PDF and PostScript + backends, (primarily because we can't capture cairo's filter + modes in those file formats). + + src/cairo-pattern.c | 22 +++++++++++++++++++++ + test/paint-source-alpha-svg11-ref.png | Bin 505 -> 756 bytes + ...scale-source-surface-paint-svg11-argb32-ref.png | Bin 182 -> 229 bytes + .../scale-source-surface-paint-svg11-rgb24-ref.png | Bin 192 -> 243 bytes + ...scale-source-surface-paint-svg12-argb32-ref.png | Bin 182 -> 229 bytes + .../scale-source-surface-paint-svg12-rgb24-ref.png | Bin 192 -> 243 bytes + 6 files changed, 22 insertions(+) + +commit 6ef4bd4ecfa30f00ad0fe6e5e5f1d1a0a5dfe8e3 +Author: Owen W. Taylor <otaylor@fishsoup.net> +Date: Sun Sep 28 23:30:22 2008 +0100 + + [pattern] Fix acquiring outside of source bounds + + Restrict the area we acquire from the source image to the bounds of + the source image, even when we have an identity matrix. This handles + circumstances where the pattern extents may be enlarged due to + filtering, for example when applying a bilinear filter. + + This patch replaces the open-coded rectangle intersection which has + already proven itself to be a source of bugs. + + (Patch ported to master by Chris Wilson, all bugs are his.) + + src/cairo-pattern.c | 63 +++++++++++++++++++++++++++-------------------------- + 1 file changed, 32 insertions(+), 31 deletions(-) + +commit 6d0f2c4421e34a078469a81646a52dfa47b4dcf1 +Author: Owen W. Taylor <otaylor@fishsoup.net> +Date: Mon Sep 29 00:02:18 2008 +0100 + + [pattern] Remove the hack to support cloning surface patterns. + + Remove instances (abuses) of calling _cairo_pattern_acquire_surface() on + a known-surface-pattern with a hack to say "give me the entire surface". + If you know you just want the entire surface as an image surface, that + can be done more simply. + + (Split from original patch on + https://bugs.freedesktop.org/attachment.cgi?id=15703, by Chris Wilson - + as usual all bugs are his.) + + src/cairo-pattern.c | 5 +---- + src/cairo-svg-surface.c | 16 ++------------- + src/cairo-win32-printing-surface.c | 41 ++++++++++++++++++-------------------- + 3 files changed, 22 insertions(+), 40 deletions(-) + +commit 117f643e49615295eb37af24efffd8327429cbf9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 22:42:30 2008 +0100 + + [test/filter-bilinear-extents] Extend testing. + + First, explicitly set the filter mode to BILINEAR in case the default should + ever change. And then draw a second pattern with extents that in theory + are larger than the source surface in order to test handling of acquiring + out-of-bounds extents. + + test/filter-bilinear-extents.c | 45 +++++++++++++++++++++++++++++------------- + 1 file changed, 31 insertions(+), 14 deletions(-) + +commit 3ff86a4510b718a3154b56b052be786f9495a3b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 08:38:31 2008 +0100 + + [test] Disable caching of SVG fail/pass surfaces. + + As we use cairo to convert SVG files back to an image, that process is + dependent upon changes within our library and so we cannot skip the + conversion if the SVG file happens to match a previous run. Fortunately, + librsvg is quick enough that this is not a major issue. + + boilerplate/cairo-boilerplate.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 24b22f0d2161f7a4ce75ceb2a86a77737027ee56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 29 07:52:09 2008 +0100 + + [glitz] Compile fix for typo. + + I wonder whether merely fixing a compile error in glitz will do anything + towards its utility... Anyway fix the missing comma as reported by + Shunichi Fuji and correct the asserts. + + src/cairo-glitz-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4f449107afba8ca96cd16e8dec283db124105dc8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 21:05:36 2008 +0100 + + [test/fallback-resolution] Exercise a couple of outstanding bugs. + + Use dashes to exercise bugs: + https://bugs.freedesktop.org/show_bug.cgi?id=9189 + https://bugs.freedesktop.org/show_bug.cgi?id=17223 + Note bug 17223 indicates that this is still relevant for win32 printing + where fallbacks are used if the dash offset is non-zero. + + And use a pattern to exercise the (fixed) regression: + https://bugs.launchpad.net/inkscape/+bug/234546 + + test/fallback-resolution-ppi150-ref.png | Bin 2397 -> 8043 bytes + test/fallback-resolution-ppi300-ref.png | Bin 1591 -> 5637 bytes + test/fallback-resolution-ppi37.5-ref.png | Bin 4681 -> 14098 bytes + test/fallback-resolution-ppi600-ref.png | Bin 1121 -> 4104 bytes + test/fallback-resolution-ppi72-ref.png | Bin 2497 -> 8409 bytes + test/fallback-resolution-ppi75-ref.png | Bin 3575 -> 12101 bytes + test/fallback-resolution.c | 40 +++++++++++++++++++++++++++++-- + 7 files changed, 38 insertions(+), 2 deletions(-) + +commit 0a7d781ab020171e70bd1dc66ff1556106e5be3f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 18:57:15 2008 +0100 + + [perf] Add rounded rectangle perf case. + + Add the performance test case to compare the speed of filling a rounded + rectangle (one with camphered corners) as opposed to an ordinary + rectangle. Since the majority of the pixels are identical, ideally the two + cases would take similar times (modulo the additional overhead in the more + complex path). + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/rectangles.c | 22 ++++++++- + perf/rounded-rectangles.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 135 insertions(+), 1 deletion(-) + +commit d52b55cb1b2a4e9b5fd8dd12592a227f8f6a93fc +Author: Karl Tomlinson <karlt+@karlt.net> +Date: Sun Sep 28 17:51:23 2008 +0100 + + [xlib] _surfaces_compatible() can return true for different picture formats + + _surfaces_compatible in cairo-xlib-surface returns true for surfaces with + different xrender_format when each has the same depth and no (NULL) + visual. + + Common picture formats will not have the same depth, but + it is possible to create a surface with a non-standard xrender_format + having the same depth as another xrender_format with + cairo_xlib_surface_create_with_xrender_format. + + Both cairo_xlib_surface_create_with_xrender_format and + _cairo_xlib_surface_create_similar_with_format create surfaces with no + visual. + + The same issue exists in the xcb backend. + + Fixes bug https://bugs.freedesktop.org/show_bug.cgi?id=16564. + + AUTHORS | 1 + + src/cairo-xcb-surface.c | 4 +++- + src/cairo-xlib-surface.c | 4 +++- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit b6b54e2f2736bfa9f76b7b6fc0da5d35a71fe846 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 17:13:11 2008 +0100 + + [svg] Compile fix for last commit. + + Sorry - badly merged patch (missed a chunk). + + src/cairo-svg-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit cff3bcba68233101c5518801b64e37d2f0e70ae8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 17:06:32 2008 +0100 + + [svg] Check that the mask is supported. + + During the analyze phase we also need to check whether we can emit the mask + without requiring fallbacks. + + src/cairo-svg-surface.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +commit 8ad3031359d74bdff4b1e3ef8d0af047821f1795 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 17:04:15 2008 +0100 + + [svg] Enable the assertion that paint() is supported. + + The XXX comment before the disabled assert is misleading as the final + fallback image paint operation should never trigger UNSUPPORTED. + + src/cairo-svg-surface.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +commit 95e637f9ac9e4256f7ba73e8f048f8e559631c82 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 16:54:59 2008 +0100 + + [paginated] Set paginated mode before every replay. + + Previously we were replaying full page fallbacks without updating the + mode - this was upsetting SVG. + + src/cairo-paginated-surface.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 36b98589911ab57762317ec95cbff41681c1e0b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 16:24:40 2008 +0100 + + [svg] Kill _cairo_svg_surface_force_fallbacks. + + It is not used, but refuses to die! + + src/cairo-svg-surface.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 57851464f920d52444d19d25e78293fa0f40c5f9 +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Sep 28 17:02:23 2008 +0200 + + [SVG] make backend handle new operators gracefully + + Previously, the SVG backend would rash when new operators were added to + cairo.h, now it returns UNSUPPORTED. + Also unsupported operators can now be set as NULL, so image fallbacks can + be used properly. + Should use fallbacks instead of color-dodge for CAIRO_OPERATOR_STURATE? + + src/cairo-svg-surface.c | 45 +++++++++++++++++++++++++++++++-------------- + 1 file changed, 31 insertions(+), 14 deletions(-) + +commit fda80cc852a109fe60e3277a1847bc5c24f35d8e +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Sep 28 14:57:49 2008 +0200 + + [SVG] use _cairo_operator_bounded_by_source() + + previously, the code was duplicating its functionality + + src/cairo-svg-surface.c | 27 ++++++++++++--------------- + 1 file changed, 12 insertions(+), 15 deletions(-) + +commit 3c18d95b293eddaa25232bc06398c78bc8043cb4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 15:57:37 2008 +0100 + + Compute device_transform_inverse. + + Because we can independently set either the device scale or the device + offset, we need to be careful and recompute the inverse rather than simply + assuming that the original contents of the device transform is identity. + + Fixes regression https://bugs.launchpad.net/inkscape/+bug/234546. + + src/cairo-surface.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 9841d9d58ea286f798626d325d50a85bf3f02c8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 28 13:34:50 2008 +0100 + + Automate error checking for fallback-resolution. + + For this we extend the boilerplate get_image() routines to extract a + single page out of a paginated document and then proceed to manually + check each page of the fallback-resolution test. + + (Well that's the theory, in practice SVG doesn't support multiple pages + and so we just generate a new surface for each resolution. But the + infrastructure is in place so that we can automate other tests, + e.g. test/multi-pages.) + + boilerplate/cairo-boilerplate-pdf-private.h | 5 + + boilerplate/cairo-boilerplate-pdf.c | 29 +- + boilerplate/cairo-boilerplate-pdf.h | 33 -- + boilerplate/cairo-boilerplate-ps-private.h | 9 +- + boilerplate/cairo-boilerplate-ps.c | 33 +- + boilerplate/cairo-boilerplate-ps.h | 33 -- + boilerplate/cairo-boilerplate-svg-private.h | 5 + + boilerplate/cairo-boilerplate-svg.c | 36 +- + boilerplate/cairo-boilerplate-svg.h | 33 -- + .../cairo-boilerplate-test-surfaces-private.h | 1 + + boilerplate/cairo-boilerplate-test-surfaces.c | 7 +- + boilerplate/cairo-boilerplate-win32-printing.c | 5 + + boilerplate/cairo-boilerplate-win32-private.h | 1 + + boilerplate/cairo-boilerplate.c | 74 ++-- + boilerplate/cairo-boilerplate.h | 7 + + src/cairo-svg-surface.c | 6 +- + test/Makefile.am | 6 + + test/cairo-test.c | 36 +- + test/cairo-test.h | 12 + + test/fallback-resolution-ppi150-ref.png | Bin 0 -> 2397 bytes + test/fallback-resolution-ppi300-ref.png | Bin 0 -> 1591 bytes + test/fallback-resolution-ppi37.5-ref.png | Bin 0 -> 4681 bytes + test/fallback-resolution-ppi600-ref.png | Bin 0 -> 1121 bytes + test/fallback-resolution-ppi72-ref.png | Bin 0 -> 2497 bytes + test/fallback-resolution-ppi75-ref.png | Bin 0 -> 3575 bytes + test/fallback-resolution.c | 413 +++++++++++++++------ + 26 files changed, 486 insertions(+), 298 deletions(-) + +commit cca1fc6358e9d0213dd2b41a5bfd1629eec6511e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 21:53:21 2008 +0100 + + [test] Fix target specific tests for recent SVG/PS version split. + + A few tests explicitly checked whether the "ps" or "svg" target was + enabled and this broke because of the name change. So fixup, to run + the generic test if either PS or SVG target is enabled as appropriate. + + test/create-for-stream.c | 8 ++++++-- + test/fallback-resolution.c | 8 ++++++-- + test/multi-page.c | 4 +++- + test/ps-features.c | 4 +++- + test/svg-clip.c | 4 +++- + test/svg-surface.c | 4 +++- + 6 files changed, 24 insertions(+), 8 deletions(-) + +commit 39e4a0bcd04191eecfc593653a4ba32a28fcac6a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 19:33:51 2008 +0100 + + [test] Update list of REFERENCE_IMAGES + + A few typos, deletions and additions from the inclusion of versioned + SVG/PS testing. + + test/Makefile.am | 50 +++++++++++++++++++++++++++++++------------------- + 1 file changed, 31 insertions(+), 19 deletions(-) + +commit 260362e5728e2591bb50f565ef04ba951d95de79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 19:16:34 2008 +0100 + + [cairo-test] Fix cairo_test_file_is_older(). + + It did not even compile, so no longer it wasn't deleting cached results + if you updated the reference images. + + test/cairo-test.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit ffbb67303c1a4d986096ba046bb3256314b9f1b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 18:54:45 2008 +0100 + + [test/gradient-constant-alpha] Remove ps2 reference images. + + PostScript level 2 has no support for gradients and so should uses image + fallbacks and hence do not require the GS specific reference images. + + test/Makefile.am | 2 -- + test/gradient-constant-alpha-ps2-ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha-ps2-rgb24-ref.png | Bin 124 -> 0 bytes + 3 files changed, 2 deletions(-) + +commit 4fa9f8c0608c137d9aa277039cb286c8294e6a2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 17:42:06 2008 +0100 + + [test/large-source] Remove stale comment. + + Delete a reference to an old limitation of pixman. + + test/large-source.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 35f1e2fa4f15c562e5cc41578b413c6874e131bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 17:37:32 2008 +0100 + + [test/operator*] Remove XFAIL descriptions. + + The tests should now pass, so remove the line claiming that they fail + for unknown reasons. + + test/operator-alpha.c | 3 +-- + test/operator.c | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 871f683367b1a1647b607f9221e1fc2eddc6e5dd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 17:24:57 2008 +0100 + + clone_similar(): s/device_offset/clone_offset/ + + A little bit of sleep and reflection suggested that the use of + device_offset_[xy] was confusing and clone_offset_[xy] more consistent + with the function naming. + + src/cairo-directfb-surface.c | 12 ++++++------ + src/cairo-glitz-surface.c | 18 +++++++++--------- + src/cairo-image-surface.c | 6 +++--- + src/cairo-pattern.c | 6 +++--- + src/cairo-quartz-surface.c | 16 ++++++++-------- + src/cairo-surface-fallback-private.h | 4 ++-- + src/cairo-surface-fallback.c | 8 ++++---- + src/cairo-surface.c | 16 ++++++++-------- + src/cairo-win32-private.h | 4 ++-- + src/cairo-win32-surface.c | 8 ++++---- + src/cairo-xcb-surface.c | 12 ++++++------ + src/cairo-xlib-surface.c | 12 ++++++------ + src/cairoint.h | 10 +++++----- + src/test-fallback-surface.c | 8 ++++---- + 14 files changed, 70 insertions(+), 70 deletions(-) + +commit 95c3c069326a77a28eb49053c0ace9f1977e0378 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 17:13:32 2008 +0100 + + [surface] Only return early for no traps if the operator is bounded by a mask. + + If the operator is unbounded, then its area of effect extends beyond + the definition of the mask by the trapezoids and so we must always perform + the image composition. + + Fixes test/operator*. + + src/cairo-surface-fallback.c | 4 +--- + test/Makefile.am | 2 -- + 2 files changed, 1 insertion(+), 5 deletions(-) + +commit 922a5801164c2b2340a7b4a950820b07e72adadc +Merge: 0c43170 1e45da4 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Sep 27 11:55:50 2008 +0200 + + Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo + +commit 0c4317085ecfc112214cdfe2abd66d9df8038282 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Sep 27 11:47:32 2008 +0200 + + [svg] Fix comp-op for paint, mask and show_glyphs operations. + + In paint and show_glyphs, the compositing operator was not emitted at all. + In mask, the operator was also emitted for the mask itself, which is + wrong. + + SVG clear and source differ from cairo as it also affects the + destination if the source pixel are completely transparent. We need to emit + an additional clip-to-self property. + + Librsvg does not support clip-to-self, so it renders the SVG + test outputs incorrectly. + + This patch also remove a lot of useless spaces in the style property + strings (I know, this should go in another commit). + + src/cairo-svg-surface.c | 196 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 113 insertions(+), 83 deletions(-) + +commit 1e45da48b555b707225c1521068011cabbcc976f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 27 14:38:22 2008 +0930 + + Update ref images in Makefile.am + + test/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c0535e8e3394f0b78867785e65cf89dbb31875d5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 27 14:31:50 2008 +0930 + + Remove miter-precision from XFAIL + + The miter-precision PS output prints correctly on my LaserJet 4050. So + file a Ghostscript bug, supply PS ref images and remove from XFAIL. + + test/Makefile.am | 1 - + test/README | 5 +++++ + test/miter-precision-ps2-ref.png | Bin 0 -> 865 bytes + test/miter-precision-ps3-ref.png | Bin 0 -> 865 bytes + test/miter-precision.c | 2 +- + 5 files changed, 6 insertions(+), 2 deletions(-) + +commit 5b97ee65259cafb335c1a2c53f1a55dfcb175e20 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 27 00:18:07 2008 +0100 + + Allow cloning sub-regions of similar surfaces. + + Previously the rule for clone_similar() was that the returned surface + had exactly the same size as the original, but only the contents within + the region of interest needed to be copied. This caused failures for very + large images in the xlib-backend (see test/large-source). + + The obvious solution to allow cloning only the region of interest seemed + to be to simply set the device offset on the cloned surface. However, this + fails as a) nothing respects the device offset on the surface at that + layer in the compositing stack and b) possibly returning references to the + original source surface provides further confusion by mixing in another + source of device offset. + + The second method was to add extra out parameters so that the + device offset could be returned separately and, for example, mixed into + the pattern matrix. Not as elegant, a couple of extra warts to the + interface, but it works - one less XFAIL... + + src/cairo-clip.c | 6 ++++++ + src/cairo-directfb-surface.c | 14 +++++++++----- + src/cairo-glitz-surface.c | 10 ++++++++++ + src/cairo-image-surface.c | 3 +++ + src/cairo-pattern.c | 15 +++++++++++++-- + src/cairo-quartz-surface.c | 10 +++++++++- + src/cairo-surface-fallback-private.h | 2 ++ + src/cairo-surface-fallback.c | 8 ++++++-- + src/cairo-surface.c | 24 ++++++++++++++++++------ + src/cairo-win32-private.h | 2 ++ + src/cairo-win32-surface.c | 8 ++++++-- + src/cairo-xcb-surface.c | 18 ++++++++++++++---- + src/cairo-xlib-surface.c | 21 +++++++++++++++------ + src/cairoint.h | 11 +++++++++-- + src/test-fallback-surface.c | 4 ++++ + test/Makefile.am | 1 - + 16 files changed, 126 insertions(+), 31 deletions(-) + +commit 7f3a48f90b409653a2d4fb802779ecb7508e4d6e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 13:27:42 2008 -0400 + + [cairo.h] Don't define cairo_public to __declspec(dllimport) for static build + + That define should target win32 DLL builds only. We can't tell though, + so we require user to define CAIRO_WIN32_STATIC_BUILD to signal that. + + src/cairo-system.c | 2 +- + src/cairo.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit b6e910f4b636e947cefb310125979ce742e87730 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 12:36:33 2008 -0400 + + [README.win32] Update wording from Tor Lillqvist + + README.win32 | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit fc12267405e98497c9f086d49fa6501d8f671a68 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 26 17:10:52 2008 +0100 + + [scaled-font] Spelling fix. + + Arbitrary spelling fix. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e0f214710760a0e0332207cb3009e3119867bd13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 26 16:49:57 2008 +0100 + + [boilerplate] Add a PS 2 target. + + Ensure that we can generate PS2 output when required by creating a PS + level 2 target and using GhostScript for conformance testing. + + boilerplate/cairo-boilerplate-ps-private.h | 29 ++- + boilerplate/cairo-boilerplate-ps.c | 55 +++- + boilerplate/cairo-boilerplate.c | 23 +- + test/Makefile.am | 286 ++++++++++++++------- + test/big-line-ps-ref.png | Bin 1148 -> 0 bytes + test/big-line-ps-rgb24-ref.png | Bin 830 -> 0 bytes + test/big-line-ps2-ref.png | Bin 0 -> 1148 bytes + test/big-line-ps2-rgb24-ref.png | Bin 0 -> 830 bytes + test/big-line-ps3-ref.png | Bin 0 -> 1148 bytes + test/big-line-ps3-rgb24-ref.png | Bin 0 -> 830 bytes + test/caps-joins-ps-ref.png | Bin 1459 -> 0 bytes + test/caps-joins-ps2-ref.png | Bin 0 -> 1459 bytes + test/caps-joins-ps3-ref.png | Bin 0 -> 1459 bytes + test/clip-fill-rule-ps-argb32-ref.png | Bin 310 -> 0 bytes + test/clip-fill-rule-ps-rgb24-ref.png | Bin 302 -> 0 bytes + test/clip-fill-rule-ps2-argb32-ref.png | Bin 0 -> 310 bytes + test/clip-fill-rule-ps2-rgb24-ref.png | Bin 0 -> 302 bytes + test/clip-fill-rule-ps3-argb32-ref.png | Bin 0 -> 310 bytes + test/clip-fill-rule-ps3-rgb24-ref.png | Bin 0 -> 302 bytes + test/clip-nesting-ps-argb32-ref.png | Bin 651 -> 0 bytes + test/clip-nesting-ps-rgb24-ref.png | Bin 636 -> 0 bytes + test/clip-nesting-ps2-argb32-ref.png | Bin 0 -> 651 bytes + test/clip-nesting-ps2-rgb24-ref.png | Bin 0 -> 636 bytes + test/clip-nesting-ps3-argb32-ref.png | Bin 0 -> 651 bytes + test/clip-nesting-ps3-rgb24-ref.png | Bin 0 -> 636 bytes + test/clip-operator-ps-rgb24-ref.png | Bin 3624 -> 0 bytes + test/clip-operator-ps2-rgb24-ref.png | Bin 0 -> 3624 bytes + test/clip-operator-ps3-ref.png | Bin 0 -> 8188 bytes + test/clip-operator-ps3-rgb24-ref.png | Bin 0 -> 3624 bytes + test/clip-push-group-ps-argb32-ref.png | Bin 179 -> 0 bytes + test/clip-push-group-ps-rgb24-ref.png | Bin 179 -> 0 bytes + test/clip-push-group-ps2-argb32-ref.png | Bin 0 -> 179 bytes + test/clip-push-group-ps2-rgb24-ref.png | Bin 0 -> 179 bytes + test/clip-push-group-ps3-argb32-ref.png | Bin 0 -> 179 bytes + test/clip-push-group-ps3-rgb24-ref.png | Bin 0 -> 179 bytes + test/clip-twice-ps-argb32-ref.png | Bin 575 -> 0 bytes + test/clip-twice-ps-rgb24-ref.png | Bin 541 -> 0 bytes + test/clip-twice-ps2-argb32-ref.png | Bin 0 -> 575 bytes + test/clip-twice-ps2-rgb24-ref.png | Bin 0 -> 541 bytes + test/clip-twice-ps3-argb32-ref.png | Bin 0 -> 575 bytes + test/clip-twice-ps3-rgb24-ref.png | Bin 0 -> 541 bytes + test/clipped-group-ps-ref.png | Bin 343 -> 0 bytes + test/clipped-group-ps2-ref.png | Bin 0 -> 343 bytes + test/clipped-group-ps3-ref.png | Bin 0 -> 343 bytes + test/close-path-ps-ref.png | Bin 309 -> 0 bytes + test/close-path-ps2-ref.png | Bin 0 -> 309 bytes + test/close-path-ps3-ref.png | Bin 0 -> 309 bytes + test/copy-path-ps-ref.png | Bin 474 -> 0 bytes + test/copy-path-ps2-ref.png | Bin 0 -> 474 bytes + test/copy-path-ps3-ref.png | Bin 0 -> 474 bytes + test/dash-caps-joins-ps-argb32-ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins-ps-rgb24-ref.png | Bin 3870 -> 0 bytes + test/dash-caps-joins-ps2-argb32-ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins-ps2-rgb24-ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins-ps3-argb32-ref.png | Bin 0 -> 3870 bytes + test/dash-caps-joins-ps3-rgb24-ref.png | Bin 0 -> 3870 bytes + test/dash-curve-ps-ref.png | Bin 27293 -> 0 bytes + test/dash-curve-ps2-ref.png | Bin 0 -> 27293 bytes + test/dash-curve-ps3-ref.png | Bin 0 -> 27293 bytes + test/dash-scale-ps-argb32-ref.png | Bin 6318 -> 0 bytes + test/dash-scale-ps-rgb24-ref.png | Bin 6316 -> 0 bytes + test/dash-scale-ps2-argb32-ref.png | Bin 0 -> 6318 bytes + test/dash-scale-ps2-rgb24-ref.png | Bin 0 -> 6316 bytes + test/dash-scale-ps3-argb32-ref.png | Bin 0 -> 6318 bytes + test/dash-scale-ps3-rgb24-ref.png | Bin 0 -> 6316 bytes + test/dash-state-ps-ref.png | Bin 10219 -> 0 bytes + test/dash-state-ps2-ref.png | Bin 0 -> 10219 bytes + test/dash-state-ps3-ref.png | Bin 0 -> 10219 bytes + test/dash-zero-length-ps-ref.png | Bin 319 -> 0 bytes + test/dash-zero-length-ps-rgb24-ref.png | Bin 304 -> 0 bytes + test/dash-zero-length-ps2-ref.png | Bin 0 -> 319 bytes + test/dash-zero-length-ps2-rgb24-ref.png | Bin 0 -> 304 bytes + test/dash-zero-length-ps3-ref.png | Bin 0 -> 319 bytes + test/dash-zero-length-ps3-rgb24-ref.png | Bin 0 -> 304 bytes + test/degenerate-arc-ps-ref.png | Bin 585 -> 0 bytes + test/degenerate-arc-ps2-ref.png | Bin 0 -> 585 bytes + test/degenerate-arc-ps3-ref.png | Bin 0 -> 585 bytes + test/degenerate-path-ps-argb32-ref.png | Bin 390 -> 0 bytes + test/degenerate-path-ps-rgb24-ref.png | Bin 358 -> 0 bytes + test/degenerate-path-ps2-argb32-ref.png | Bin 0 -> 390 bytes + test/degenerate-path-ps2-rgb24-ref.png | Bin 0 -> 358 bytes + test/degenerate-path-ps3-argb32-ref.png | Bin 0 -> 390 bytes + test/degenerate-path-ps3-rgb24-ref.png | Bin 0 -> 358 bytes + test/degenerate-pen-ps-ref.png | Bin 865 -> 0 bytes + test/degenerate-pen-ps2-ref.png | Bin 0 -> 865 bytes + test/degenerate-pen-ps3-ref.png | Bin 0 -> 865 bytes + test/device-offset-fractional-ps-ref.png | Bin 201 -> 0 bytes + test/device-offset-fractional-ps2-ref.png | Bin 0 -> 201 bytes + test/device-offset-fractional-ps3-ref.png | Bin 0 -> 201 bytes + test/extend-reflect-ps-ref.png | Bin 153322 -> 0 bytes + test/extend-reflect-ps2-ref.png | Bin 0 -> 153322 bytes + test/extend-reflect-ps3-ref.png | Bin 0 -> 153322 bytes + test/extend-reflect-similar-ps-ref.png | Bin 153322 -> 0 bytes + test/extend-reflect-similar-ps2-ref.png | Bin 0 -> 153322 bytes + test/extend-reflect-similar-ps3-ref.png | Bin 0 -> 153322 bytes + test/fill-alpha-pattern-ps-ref.png | Bin 4380 -> 0 bytes + test/fill-alpha-pattern-ps3-ref.png | Bin 0 -> 4380 bytes + test/fill-and-stroke-ps-argb32-ref.png | Bin 310 -> 0 bytes + test/fill-and-stroke-ps-rgb24-ref.png | Bin 319 -> 0 bytes + test/fill-and-stroke-ps2-argb32-ref.png | Bin 0 -> 310 bytes + test/fill-and-stroke-ps2-rgb24-ref.png | Bin 0 -> 319 bytes + test/fill-and-stroke-ps3-argb32-ref.png | Bin 0 -> 310 bytes + test/fill-and-stroke-ps3-rgb24-ref.png | Bin 0 -> 319 bytes + test/fill-missed-stop-ps-argb32-ref.png | Bin 564 -> 0 bytes + test/fill-missed-stop-ps-rgb24-ref.png | Bin 531 -> 0 bytes + test/fill-missed-stop-ps2-argb32-ref.png | Bin 0 -> 564 bytes + test/fill-missed-stop-ps2-rgb24-ref.png | Bin 0 -> 531 bytes + test/fill-missed-stop-ps3-argb32-ref.png | Bin 0 -> 564 bytes + test/fill-missed-stop-ps3-rgb24-ref.png | Bin 0 -> 531 bytes + test/fill-rule-ps-argb32-ref.png | Bin 2253 -> 0 bytes + test/fill-rule-ps-rgb24-ref.png | Bin 2031 -> 0 bytes + test/fill-rule-ps2-argb32-ref.png | Bin 0 -> 2253 bytes + test/fill-rule-ps2-rgb24-ref.png | Bin 0 -> 2031 bytes + test/fill-rule-ps3-argb32-ref.png | Bin 0 -> 2253 bytes + test/fill-rule-ps3-rgb24-ref.png | Bin 0 -> 2031 bytes + test/finer-grained-fallbacks-ps-argb32-ref.png | Bin 1047 -> 0 bytes + test/finer-grained-fallbacks-ps-rgb24-ref.png | Bin 819 -> 0 bytes + test/finer-grained-fallbacks-ps2-argb32-ref.png | Bin 0 -> 1047 bytes + test/finer-grained-fallbacks-ps2-rgb24-ref.png | Bin 0 -> 819 bytes + test/finer-grained-fallbacks-ps3-argb32-ref.png | Bin 0 -> 1047 bytes + test/finer-grained-fallbacks-ps3-rgb24-ref.png | Bin 0 -> 819 bytes + test/font-matrix-translation-ps-argb32-ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation-ps-rgb24-ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation-ps2-argb32-ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation-ps2-rgb24-ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation-ps3-argb32-ref.png | Bin 0 -> 748 bytes + test/font-matrix-translation-ps3-rgb24-ref.png | Bin 0 -> 748 bytes + test/ft-show-glyphs-positioning-ps-ref.png | Bin 2269 -> 0 bytes + test/ft-show-glyphs-positioning-ps2-ref.png | Bin 0 -> 2269 bytes + test/ft-show-glyphs-positioning-ps3-ref.png | Bin 0 -> 2269 bytes + test/ft-show-glyphs-table-ps-ref.png | Bin 5687 -> 0 bytes + test/ft-show-glyphs-table-ps2-ref.png | Bin 0 -> 5687 bytes + test/ft-show-glyphs-table-ps3-ref.png | Bin 0 -> 5687 bytes + test/ft-text-antialias-none-ps-argb32-ref.png | Bin 335 -> 0 bytes + test/ft-text-antialias-none-ps2-argb32-ref.png | Bin 0 -> 335 bytes + test/ft-text-antialias-none-ps3-argb32-ref.png | Bin 0 -> 335 bytes + test/ft-text-vertical-layout-type1-ps-ref.png | Bin 1846 -> 0 bytes + test/ft-text-vertical-layout-type1-ps2-ref.png | Bin 0 -> 1846 bytes + test/ft-text-vertical-layout-type1-ps3-ref.png | Bin 0 -> 1846 bytes + test/ft-text-vertical-layout-type3-ps-ref.png | Bin 1804 -> 0 bytes + test/ft-text-vertical-layout-type3-ps2-ref.png | Bin 0 -> 1804 bytes + test/ft-text-vertical-layout-type3-ps3-ref.png | Bin 0 -> 1804 bytes + test/glyph-cache-pressure-ps-ref.png | Bin 1454 -> 0 bytes + test/glyph-cache-pressure-ps2-ref.png | Bin 0 -> 1454 bytes + test/glyph-cache-pressure-ps3-ref.png | Bin 0 -> 1454 bytes + test/gradient-alpha-ps-argb32-ref.png | Bin 134 -> 0 bytes + test/gradient-alpha-ps-rgb24-ref.png | Bin 130 -> 0 bytes + test/gradient-alpha-ps2-argb32-ref.png | Bin 0 -> 134 bytes + test/gradient-alpha-ps2-rgb24-ref.png | Bin 0 -> 130 bytes + test/gradient-alpha-ps3-argb32-ref.png | Bin 0 -> 134 bytes + test/gradient-alpha-ps3-rgb24-ref.png | Bin 0 -> 130 bytes + test/gradient-constant-alpha-ps-ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha-ps-rgb24-ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha-ps2-ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha-ps2-rgb24-ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha-ps3-ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha-ps3-rgb24-ref.png | Bin 0 -> 124 bytes + test/infinite-join-ps-ref.png | Bin 218 -> 0 bytes + test/infinite-join-ps2-ref.png | Bin 0 -> 218 bytes + test/infinite-join-ps3-ref.png | Bin 0 -> 218 bytes + test/leaky-dash-ps-argb32-ref.png | Bin 286 -> 0 bytes + test/leaky-dash-ps-rgb24-ref.png | Bin 284 -> 0 bytes + test/leaky-dash-ps2-argb32-ref.png | Bin 0 -> 286 bytes + test/leaky-dash-ps2-rgb24-ref.png | Bin 0 -> 284 bytes + test/leaky-dash-ps3-argb32-ref.png | Bin 0 -> 286 bytes + test/leaky-dash-ps3-rgb24-ref.png | Bin 0 -> 284 bytes + test/leaky-dashed-rectangle-ps-ref.png | Bin 444 -> 0 bytes + test/leaky-dashed-rectangle-ps2-ref.png | Bin 0 -> 444 bytes + test/leaky-dashed-rectangle-ps3-ref.png | Bin 0 -> 444 bytes + test/leaky-polygon-ps-ref.png | Bin 354 -> 0 bytes + test/leaky-polygon-ps2-ref.png | Bin 0 -> 354 bytes + test/leaky-polygon-ps3-ref.png | Bin 0 -> 354 bytes + test/line-width-scale-ps-ref.png | Bin 3911 -> 0 bytes + test/line-width-scale-ps2-ref.png | Bin 0 -> 3911 bytes + test/line-width-scale-ps3-ref.png | Bin 0 -> 3911 bytes + test/linear-gradient-ps-ref.png | Bin 779 -> 0 bytes + test/linear-gradient-ps3-ref.png | Bin 0 -> 779 bytes + test/linear-gradient-reflect-ps-ref.png | Bin 314 -> 0 bytes + test/linear-gradient-reflect-ps3-ref.png | Bin 0 -> 314 bytes + test/long-dashed-lines-ps-ref.png | Bin 1516 -> 0 bytes + test/long-dashed-lines-ps2-ref.png | Bin 0 -> 1516 bytes + test/long-dashed-lines-ps3-ref.png | Bin 0 -> 1516 bytes + test/meta-surface-pattern-ps-argb32-ref.png | Bin 3257 -> 0 bytes + test/meta-surface-pattern-ps-rgb24-ref.png | Bin 3873 -> 0 bytes + test/meta-surface-pattern-ps2-argb32-ref.png | Bin 0 -> 3257 bytes + test/meta-surface-pattern-ps2-rgb24-ref.png | Bin 0 -> 3873 bytes + test/meta-surface-pattern-ps3-argb32-ref.png | Bin 0 -> 3257 bytes + test/meta-surface-pattern-ps3-rgb24-ref.png | Bin 0 -> 3873 bytes + test/new-sub-path-ps-argb32-ref.png | Bin 556 -> 0 bytes + test/new-sub-path-ps-rgb24-ref.png | Bin 423 -> 0 bytes + test/new-sub-path-ps2-argb32-ref.png | Bin 0 -> 556 bytes + test/new-sub-path-ps2-rgb24-ref.png | Bin 0 -> 423 bytes + test/new-sub-path-ps3-argb32-ref.png | Bin 0 -> 556 bytes + test/new-sub-path-ps3-rgb24-ref.png | Bin 0 -> 423 bytes + test/over-above-source-ps-argb32-ref.png | Bin 636 -> 0 bytes + test/over-above-source-ps2-argb32-ref.png | Bin 0 -> 636 bytes + test/over-above-source-ps3-argb32-ref.png | Bin 0 -> 636 bytes + test/over-around-source-ps-argb32-ref.png | Bin 632 -> 0 bytes + test/over-around-source-ps-rgb24-ref.png | Bin 538 -> 0 bytes + test/over-around-source-ps2-argb32-ref.png | Bin 0 -> 632 bytes + test/over-around-source-ps2-rgb24-ref.png | Bin 0 -> 538 bytes + test/over-around-source-ps3-argb32-ref.png | Bin 0 -> 632 bytes + test/over-around-source-ps3-rgb24-ref.png | Bin 0 -> 538 bytes + test/over-below-source-ps-argb32-ref.png | Bin 503 -> 0 bytes + test/over-below-source-ps2-argb32-ref.png | Bin 0 -> 503 bytes + test/over-below-source-ps3-argb32-ref.png | Bin 0 -> 503 bytes + test/over-between-source-ps-argb32-ref.png | Bin 678 -> 0 bytes + test/over-between-source-ps2-argb32-ref.png | Bin 0 -> 678 bytes + test/over-between-source-ps3-argb32-ref.png | Bin 0 -> 678 bytes + test/random-intersections-ps-ref.png | Bin 89253 -> 0 bytes + test/random-intersections-ps2-ref.png | Bin 0 -> 89253 bytes + test/random-intersections-ps3-ref.png | Bin 0 -> 89253 bytes + test/rectilinear-miter-limit-ps-ref.png | Bin 221 -> 0 bytes + test/rectilinear-miter-limit-ps2-ref.png | Bin 0 -> 221 bytes + test/rectilinear-miter-limit-ps3-ref.png | Bin 0 -> 221 bytes + test/reflected-stroke-ps-ref.png | Bin 3898 -> 0 bytes + test/reflected-stroke-ps2-ref.png | Bin 0 -> 3898 bytes + test/reflected-stroke-ps3-ref.png | Bin 0 -> 3898 bytes + test/rel-path-ps-rgb24-ref.png | Bin 243 -> 0 bytes + test/rel-path-ps2-rgb24-ref.png | Bin 0 -> 243 bytes + test/rel-path-ps3-rgb24-ref.png | Bin 0 -> 243 bytes + test/rotate-image-surface-paint-ps-ref.png | Bin 212 -> 0 bytes + test/rotate-image-surface-paint-ps2-ref.png | Bin 0 -> 212 bytes + test/rotate-image-surface-paint-ps3-ref.png | Bin 0 -> 212 bytes + test/select-font-face-ps-ref.png | Bin 959 -> 0 bytes + test/select-font-face-ps2-ref.png | Bin 0 -> 959 bytes + test/select-font-face-ps3-ref.png | Bin 0 -> 959 bytes + test/self-copy-ps-ref.png | Bin 335 -> 0 bytes + test/self-copy-ps2-ref.png | Bin 0 -> 335 bytes + test/self-copy-ps3-ref.png | Bin 0 -> 335 bytes + test/show-text-current-point-ps-ref.png | Bin 1356 -> 0 bytes + test/show-text-current-point-ps2-ref.png | Bin 0 -> 1356 bytes + test/show-text-current-point-ps3-ref.png | Bin 0 -> 1356 bytes + test/skew-extreme-ps-ref.png | Bin 1048 -> 0 bytes + test/skew-extreme-ps2-ref.png | Bin 0 -> 1048 bytes + test/skew-extreme-ps3-ref.png | Bin 0 -> 1048 bytes + test/smask-ps-ref.png | Bin 3669 -> 0 bytes + test/smask-ps2-ref.png | Bin 0 -> 3669 bytes + test/smask-ps3-ref.png | Bin 0 -> 3669 bytes + test/smask-text-ps-ref.png | Bin 2023 -> 0 bytes + test/smask-text-ps2-ref.png | Bin 0 -> 2023 bytes + test/smask-text-ps3-ref.png | Bin 0 -> 2023 bytes + test/source-clip-scale-ps-argb32-ref.png | Bin 183 -> 0 bytes + test/source-clip-scale-ps-rgb24-ref.png | Bin 183 -> 0 bytes + test/source-clip-scale-ps2-argb32-ref.png | Bin 0 -> 183 bytes + test/source-clip-scale-ps2-rgb24-ref.png | Bin 0 -> 183 bytes + test/source-clip-scale-ps3-argb32-ref.png | Bin 0 -> 183 bytes + test/source-clip-scale-ps3-rgb24-ref.png | Bin 0 -> 183 bytes + test/stroke-ctm-caps-ps-ref.png | Bin 1079 -> 0 bytes + test/stroke-ctm-caps-ps2-ref.png | Bin 0 -> 1079 bytes + test/stroke-ctm-caps-ps3-ref.png | Bin 0 -> 1079 bytes + test/stroke-image-ps-ref.png | Bin 1786 -> 0 bytes + test/stroke-image-ps2-ref.png | Bin 0 -> 1786 bytes + test/stroke-image-ps3-ref.png | Bin 0 -> 1786 bytes + test/surface-pattern-ps-argb32-ref.png | Bin 2520 -> 0 bytes + test/surface-pattern-ps2-argb32-ref.png | Bin 0 -> 2520 bytes + test/surface-pattern-ps3-argb32-ref.png | Bin 0 -> 2520 bytes + test/surface-pattern-scale-down-ps-argb32-ref.png | Bin 1400 -> 0 bytes + test/surface-pattern-scale-down-ps2-argb32-ref.png | Bin 0 -> 1400 bytes + test/surface-pattern-scale-down-ps3-argb32-ref.png | Bin 0 -> 1400 bytes + test/surface-pattern-scale-up-ps-argb32-ref.png | Bin 1011 -> 0 bytes + test/surface-pattern-scale-up-ps2-argb32-ref.png | Bin 0 -> 1011 bytes + test/surface-pattern-scale-up-ps3-argb32-ref.png | Bin 0 -> 1011 bytes + test/text-pattern-ps-argb32-ref.png | Bin 966 -> 0 bytes + test/text-pattern-ps-rgb24-ref.png | Bin 924 -> 0 bytes + test/text-pattern-ps3-argb32-ref.png | Bin 0 -> 966 bytes + test/text-pattern-ps3-rgb24-ref.png | Bin 0 -> 924 bytes + test/text-rotate-ps-ref.png | Bin 6851 -> 0 bytes + test/text-rotate-ps2-ref.png | Bin 0 -> 6851 bytes + test/text-rotate-ps3-ref.png | Bin 0 -> 6851 bytes + test/text-transform-ps-ref.png | Bin 4154 -> 0 bytes + test/text-transform-ps2-ref.png | Bin 0 -> 4154 bytes + test/text-transform-ps3-ref.png | Bin 0 -> 4154 bytes + test/transforms-ps-ref.png | Bin 418 -> 0 bytes + test/transforms-ps2-ref.png | Bin 0 -> 418 bytes + test/transforms-ps3-ref.png | Bin 0 -> 418 bytes + test/trap-clip-ps-argb32-ref.png | Bin 5591 -> 0 bytes + test/trap-clip-ps-rgb24-ref.png | Bin 5512 -> 0 bytes + test/trap-clip-ps3-argb32-ref.png | Bin 0 -> 5591 bytes + test/trap-clip-ps3-rgb24-ref.png | Bin 0 -> 5512 bytes + test/user-font-proxy-ps-ref.png | Bin 8171 -> 0 bytes + test/user-font-proxy-ps2-ref.png | Bin 0 -> 8171 bytes + test/user-font-proxy-ps3-ref.png | Bin 0 -> 8171 bytes + test/user-font-ps-ref.png | Bin 5043 -> 0 bytes + test/user-font-ps2-ref.png | Bin 0 -> 5043 bytes + test/user-font-ps3-ref.png | Bin 0 -> 5043 bytes + test/user-font-rescale-ps-ref.png | Bin 8041 -> 0 bytes + test/user-font-rescale-ps2-ref.png | Bin 0 -> 8041 bytes + test/user-font-rescale-ps3-ref.png | Bin 0 -> 8041 bytes + 289 files changed, 277 insertions(+), 116 deletions(-) + +commit 0c030d3b768718eac5d429d0c819934f32896b25 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 26 15:26:40 2008 +0100 + + [boilerplate] Add svg-1.2 target. + + SVG 1.2 is sufficiently different from 1.1 that it has separate code + paths within cairo-svg-surface and so justifies its own boilerplate + target. + + boilerplate/cairo-boilerplate-svg-private.h | 30 +++++++--- + boilerplate/cairo-boilerplate-svg.c | 48 +++++++++++++-- + boilerplate/cairo-boilerplate.c | 24 ++++++-- + test/Makefile.am | 66 ++++++++++++++------- + test/caps-joins-alpha-svg-ref.png | Bin 2454 -> 0 bytes + test/caps-joins-alpha-svg11-ref.png | Bin 0 -> 2454 bytes + test/caps-joins-alpha-svg12-ref.png | Bin 0 -> 2454 bytes + test/font-matrix-translation-svg-ref.png | Bin 970 -> 0 bytes + test/font-matrix-translation-svg11-ref.png | Bin 0 -> 970 bytes + test/font-matrix-translation-svg12-ref.png | Bin 0 -> 970 bytes + test/ft-show-glyphs-positioning-svg-ref.png | Bin 6590 -> 0 bytes + test/ft-show-glyphs-positioning-svg11-ref.png | Bin 0 -> 6590 bytes + test/ft-show-glyphs-positioning-svg12-ref.png | Bin 0 -> 6590 bytes + test/ft-text-vertical-layout-type1-svg-ref.png | Bin 3973 -> 0 bytes + test/ft-text-vertical-layout-type1-svg11-ref.png | Bin 0 -> 3973 bytes + test/ft-text-vertical-layout-type1-svg12-ref.png | Bin 0 -> 3973 bytes + test/ft-text-vertical-layout-type3-svg-ref.png | Bin 3957 -> 0 bytes + test/ft-text-vertical-layout-type3-svg11-ref.png | Bin 0 -> 3957 bytes + test/ft-text-vertical-layout-type3-svg12-ref.png | Bin 0 -> 3957 bytes + test/linear-gradient-svg-ref.png | Bin 1000 -> 0 bytes + test/linear-gradient-svg11-ref.png | Bin 0 -> 1000 bytes + test/linear-gradient-svg12-ref.png | Bin 0 -> 1000 bytes + test/mask-alpha-svg-argb32-ref.png | Bin 615 -> 0 bytes + test/mask-alpha-svg11-argb32-ref.png | Bin 0 -> 615 bytes + test/mask-alpha-svg12-argb32-ref.png | Bin 0 -> 615 bytes + test/mask-ctm-svg-argb32-ref.png | Bin 108 -> 0 bytes + test/mask-ctm-svg11-argb32-ref.png | Bin 0 -> 108 bytes + test/mask-ctm-svg12-argb32-ref.png | Bin 0 -> 108 bytes + test/mask-surface-ctm-svg-argb32-ref.png | Bin 108 -> 0 bytes + test/mask-surface-ctm-svg11-argb32-ref.png | Bin 0 -> 108 bytes + test/mask-surface-ctm-svg12-argb32-ref.png | Bin 0 -> 108 bytes + test/mask-svg-argb32-ref.png | Bin 8527 -> 0 bytes + test/mask-svg-rgb24-ref.png | Bin 7935 -> 0 bytes + test/mask-svg11-argb32-ref.png | Bin 0 -> 8527 bytes + test/mask-svg11-rgb24-ref.png | Bin 0 -> 7935 bytes + test/mask-svg12-argb32-ref.png | Bin 0 -> 8527 bytes + test/mask-svg12-rgb24-ref.png | Bin 0 -> 7935 bytes + test/mask-transformed-similar-svg-ref.png | Bin 4051 -> 0 bytes + test/mask-transformed-similar-svg11-ref.png | Bin 0 -> 4051 bytes + test/mask-transformed-similar-svg12-ref.png | Bin 0 -> 4051 bytes + test/meta-surface-pattern-svg-argb32-ref.png | Bin 3924 -> 0 bytes + test/meta-surface-pattern-svg-rgb24-ref.png | Bin 4593 -> 0 bytes + test/meta-surface-pattern-svg11-argb32-ref.png | Bin 0 -> 3924 bytes + test/meta-surface-pattern-svg11-rgb24-ref.png | Bin 0 -> 4593 bytes + test/meta-surface-pattern-svg12-argb32-ref.png | Bin 0 -> 3924 bytes + test/meta-surface-pattern-svg12-rgb24-ref.png | Bin 0 -> 4593 bytes + test/paint-source-alpha-svg-ref.png | Bin 505 -> 0 bytes + test/paint-source-alpha-svg11-ref.png | Bin 0 -> 505 bytes + test/paint-source-alpha-svg12-ref.png | Bin 0 -> 505 bytes + test/paint-with-alpha-svg-ref.png | Bin 516 -> 0 bytes + test/paint-with-alpha-svg11-ref.png | Bin 0 -> 516 bytes + test/paint-with-alpha-svg12-ref.png | Bin 0 -> 516 bytes + test/push-group-svg-argb32-ref.png | Bin 2935 -> 0 bytes + test/push-group-svg11-argb32-ref.png | Bin 0 -> 2935 bytes + test/push-group-svg12-argb32-ref.png | Bin 0 -> 2935 bytes + test/radial-gradient-svg-ref.png | Bin 91039 -> 0 bytes + test/radial-gradient-svg11-ref.png | Bin 0 -> 91039 bytes + test/radial-gradient-svg12-ref.png | Bin 0 -> 91039 bytes + test/rotate-image-surface-paint-svg-ref.png | Bin 248 -> 0 bytes + test/rotate-image-surface-paint-svg11-ref.png | Bin 0 -> 248 bytes + test/rotate-image-surface-paint-svg12-ref.png | Bin 0 -> 248 bytes + test/scale-source-surface-paint-svg-argb32-ref.png | Bin 182 -> 0 bytes + test/scale-source-surface-paint-svg-rgb24-ref.png | Bin 192 -> 0 bytes + ...scale-source-surface-paint-svg11-argb32-ref.png | Bin 0 -> 182 bytes + .../scale-source-surface-paint-svg11-rgb24-ref.png | Bin 0 -> 192 bytes + ...scale-source-surface-paint-svg12-argb32-ref.png | Bin 0 -> 182 bytes + .../scale-source-surface-paint-svg12-rgb24-ref.png | Bin 0 -> 192 bytes + test/set-source-svg-argb32-ref.png | Bin 104 -> 0 bytes + test/set-source-svg11-argb32-ref.png | Bin 0 -> 104 bytes + test/set-source-svg12-argb32-ref.png | Bin 0 -> 104 bytes + test/smask-fill-svg-ref.png | Bin 1166 -> 0 bytes + test/smask-fill-svg11-ref.png | Bin 0 -> 1166 bytes + test/smask-fill-svg12-ref.png | Bin 0 -> 1166 bytes + test/smask-mask-svg-ref.png | Bin 2529 -> 0 bytes + test/smask-mask-svg11-ref.png | Bin 0 -> 2529 bytes + test/smask-mask-svg12-ref.png | Bin 0 -> 2529 bytes + test/smask-paint-svg-ref.png | Bin 2612 -> 0 bytes + test/smask-paint-svg11-ref.png | Bin 0 -> 2612 bytes + test/smask-paint-svg12-ref.png | Bin 0 -> 2612 bytes + test/smask-svg-ref.png | Bin 3634 -> 0 bytes + test/smask-svg11-ref.png | Bin 0 -> 3634 bytes + test/smask-svg12-ref.png | Bin 0 -> 3634 bytes + test/smask-text-svg-ref.png | Bin 1886 -> 0 bytes + test/smask-text-svg11-ref.png | Bin 0 -> 1886 bytes + test/smask-text-svg12-ref.png | Bin 0 -> 1886 bytes + test/source-clip-scale-svg-ref.png | Bin 119 -> 0 bytes + test/source-clip-scale-svg11-ref.png | Bin 0 -> 119 bytes + test/source-clip-scale-svg12-ref.png | Bin 0 -> 119 bytes + test/surface-pattern-svg-ref.png | Bin 17663 -> 0 bytes + test/surface-pattern-svg11-ref.png | Bin 0 -> 17663 bytes + test/surface-pattern-svg12-ref.png | Bin 0 -> 17663 bytes + test/text-pattern-svg-argb32-ref.png | Bin 1733 -> 0 bytes + test/text-pattern-svg-rgb24-ref.png | Bin 1563 -> 0 bytes + test/text-pattern-svg11-argb32-ref.png | Bin 0 -> 1733 bytes + test/text-pattern-svg11-rgb24-ref.png | Bin 0 -> 1563 bytes + test/text-pattern-svg12-argb32-ref.png | Bin 0 -> 1733 bytes + test/text-pattern-svg12-rgb24-ref.png | Bin 0 -> 1563 bytes + test/text-rotate-svg-ref.png | Bin 18301 -> 0 bytes + test/text-rotate-svg11-ref.png | Bin 0 -> 18301 bytes + test/text-rotate-svg12-ref.png | Bin 0 -> 18301 bytes + test/user-font-proxy-svg-ref.png | Bin 17902 -> 0 bytes + test/user-font-proxy-svg11-ref.png | Bin 0 -> 17902 bytes + test/user-font-proxy-svg12-ref.png | Bin 0 -> 17902 bytes + test/user-font-rescale-svg-ref.png | Bin 15741 -> 0 bytes + test/user-font-rescale-svg11-ref.png | Bin 0 -> 15741 bytes + test/user-font-rescale-svg12-ref.png | Bin 0 -> 15741 bytes + test/user-font-svg-ref.png | Bin 6134 -> 0 bytes + test/user-font-svg11-ref.png | Bin 0 -> 6134 bytes + test/user-font-svg12-ref.png | Bin 0 -> 6134 bytes + 109 files changed, 128 insertions(+), 40 deletions(-) + +commit 86e57671dd21078215505202ef8aa2141d10fb9c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 11:08:22 2008 -0400 + + [check-*.sh] Redirect error reports to stderr + + doc/public/check-doc-coverage.sh | 6 +++--- + src/check-def.sh | 2 +- + src/check-doc-syntax.sh | 8 ++++---- + src/check-headers.sh | 2 +- + src/check-plt.sh | 2 +- + src/check-preprocessor-syntax.sh | 10 +++++----- + 6 files changed, 15 insertions(+), 15 deletions(-) + +commit 096f9def0f599e527d97bb979f7cafbc87dcddc6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 10:55:44 2008 -0400 + + Add slim markers to make check-plt.sh happy + + src/cairo-font-face.c | 4 ++++ + src/cairo-user-font.c | 4 ++++ + src/cairo.c | 5 +++++ + src/cairoint.h | 13 +++++++++++++ + 4 files changed, 26 insertions(+) + +commit 1de059b33bd2e6121e35ccf1c4a35ba7755c44d8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 09:49:50 2008 -0400 + + [RELEASING] Add ftp-release@lists.freedesktop.org + + That list is monitored by various distros to pick up new releases. + We should CC release announcements there. + + RELEASING | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 9662be8ee77e219908b64b82e828d577dcf120f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 00:22:00 2008 -0400 + + [twin-font] Adjust ascent/descent + + The font data uses a 64 int high font space with baseline at 50. + + src/cairo-font-face-twin.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 3883a371f2ba78b17a1302ba8c5df1a79f3e4075 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 26 00:20:21 2008 -0400 + + [scaled-font] Use full ctm matrix when comparing scaled-font keys + + We use the full matrix in hash computation, but only compare the + non-translation items in equality check. This is no bug though, + as we set the ctm translation components of a scaled font to zero + explicitly. But the change makes the hash and equal functions + consistent, which is good. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 48099af9fed7497a230992e41d559a19c5dbdc60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 13:24:58 2008 +0100 + + [boilerplate] Retry conversion in process if first attempt fails. + + One possibility for a read failure whilst converting the image is if the + external utility crashed. This information is important for the test suite + as knowing input that causes the converter to crash is just as vital as + identifying a crash within the library. + + boilerplate/cairo-boilerplate-pdf.c | 11 +---------- + boilerplate/cairo-boilerplate-svg.c | 11 +---------- + boilerplate/cairo-boilerplate.c | 35 +++++++++++++++++++++++++++++++++-- + boilerplate/cairo-boilerplate.h | 11 +++++++++-- + 4 files changed, 44 insertions(+), 24 deletions(-) + +commit f2c484d73ce61012a2d9925f15b55e7c51e34b85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 00:16:45 2008 +0100 + + [test/any2ppm] Handle short reads/writes. + + No excuse other than simple laziness - it manifested itself with random + "error whilst reading" failures. + + boilerplate/cairo-boilerplate.c | 24 +++++++++++++++++--- + test/any2ppm.c | 50 +++++++++++++++++++++++++++++++++++------ + 2 files changed, 64 insertions(+), 10 deletions(-) + +commit 681424cbaf94556bf1804547b42ad642c0a066ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 10:40:32 2008 +0100 + + [analysis] Merge two analysis status codes. + + Since there is an implicit precedence in the ranking of the analysis + return codes, provide a function to centralize the logic within the + analysis surface and isolate the backends from the complexity. + + src/cairo-analysis-surface-private.h | 3 +++ + src/cairo-analysis-surface.c | 50 +++++++++++++++++++++++++++--------- + src/cairo-pdf-surface.c | 31 +++++++--------------- + 3 files changed, 50 insertions(+), 34 deletions(-) + +commit 06f0cc81d227a571e011e83cc192050a34d6ea13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 10:29:27 2008 +0100 + + Add a macro to determine whether a status is a fatal error. + + In a few places we need to check whether we have a fatal error or an + internal return code, so provide a utility macro to centralise the check. + + src/cairo.c | 3 +-- + src/cairoint.h | 3 +++ + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit ba18d57339dbedbbdb7f3ca35b06ce6b5dbcd972 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 09:39:41 2008 +0100 + + [pdf] Propagate status + + Check and return a few forgotten error codes from static functions. + + src/cairo-pdf-operators.c | 14 +++++++++++--- + src/cairo-pdf-surface.c | 6 +++++- + 2 files changed, 16 insertions(+), 4 deletions(-) + +commit 907f550a1b13b0a388f9ff22663911d4aabbe2d8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 26 20:26:55 2008 +0930 + + Fix bitmap-font XFAIL + + Images in PDF are scaled to a unit square. In PS we set the + ImageMatrix to do the same. When the image is painted we scale the + graphics state to paint the image at the right size. In the case of + Type 3 fonts consisting of bitmap images we want to paint the images + at their original size so we scale the graphics state by the image + width and height. + + The bug was that we were scaling by the width/height in the glyph + metrics. For non rotated fonts this worked. However for rotated fonts + the width/height of the glyph images may be larger than the + width/height in the glyph metrics. This resulted in a Type 3 font + where the glyph images were scaled slightly smaller than they should + have been. + + src/cairo-type3-glyph-surface.c | 10 +++------- + test/Makefile.am | 1 - + test/bitmap-font-pdf-argb32-ref.png | Bin 1064 -> 0 bytes + 3 files changed, 3 insertions(+), 8 deletions(-) + +commit f8542dc9dd4dd0685f68381f21fa72dbddd8d682 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 25 19:08:24 2008 -0400 + + [twin-font] Clean up font data by joining lines and closing paths + + Two changes here: + + * Replace move_to;line_to;move_to;line_to sequences with + move_to;line_to;line_to when feasible. + + * Close paths for round glyphs. + + Both improve the stroke rendering of the joint. + + The first change also saves 3 bytes per joint (33 such joints). + Which we have just left unused for now. To reclaim them one need + to update the charset table. Something for a lazy Sunday afternoon + scripting task. + + In the saving department, we can save further by: + + - Getting rid of the left/ascent/descent values as we compute + glyph bounding box automatically. Then we can liberally use + the right value to adjust glyph advance width. Saves three + bytes per glyph (there's 96 glyphs in the font). + + - First operation is always a move_to. So we can remove the 'm' + for that. Ugly though. + + And the charset has zeros for the first 32 entries. Can get rid of + that too at the expense of handling it in the code... + + In total, combining the above we can save some 500 bytes. The font + currently takes about 3.7kb. + + src/cairo-font-face-twin-data.c | 154 ++++++++++++++++++++-------------------- + src/cairo-font-face-twin.c | 18 +++-- + 2 files changed, 91 insertions(+), 81 deletions(-) + +commit d5a998387bcee6569d33375d592190f480f12712 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 25 04:27:11 2008 -0400 + + Add an internal font face + + The font data and rendering is adapted from Keith Packard's Twin + window system. The hinting stuff is not ported yet, but hey, it renders! + + The implementation uses user fonts, and the user font backend is modified + to use this font face (which we call "twin" font face internally) when + a toy font is needed. + + The font face layer is then modified to use this font if: + + - The toy font face "cairo" is asked for, or + + - No native font backend is available, or + + - The preferred native font backend fails to return a font with + STATUS_UNSUPPORTED. No font backend does this right now but + the idea is to change FreeType to return it if no fonts found + on the system. + + We also allow building with no font backends now! + + The new doc/tutorial/src/twin.c file tests the twin face at various + sizes. + + build/configure.ac.features | 26 +- + doc/tutorial/src/twin.c | 39 ++ + src/Makefile.sources | 2 + + src/cairo-font-face-twin-data.c | 1030 +++++++++++++++++++++++++++++++++++++++ + src/cairo-font-face-twin.c | 199 ++++++++ + src/cairo-font-face.c | 33 +- + src/cairo-user-font.c | 53 +- + src/cairoint.h | 18 +- + 8 files changed, 1371 insertions(+), 29 deletions(-) + +commit dd7e2461ce748403e121a5de5e4e4c8890e39236 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 16:06:19 2008 -0700 + + Increment cairo version to 1.8.1 after the 1.8.0 release. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.pre-1.12 b/ChangeLog.pre-1.12 new file mode 100644 index 000000000..4bb61df62 --- /dev/null +++ b/ChangeLog.pre-1.12 @@ -0,0 +1,31634 @@ +commit a0bf6d25b5b68c897d63580d1ca9ee182f04cce1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 19:33:07 2012 +0000 + + version: bump for 1.12.0 release! + + NEWS | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 4 +-- + 2 files changed, 82 insertions(+), 2 deletions(-) + +commit 9cb7586fb05f72d4b10b33c9a8e8870ee4865af5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 18:08:40 2012 +0000 + + cairo: Add some missing doc entries for cairo_raster_source_pattern_t + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-raster-source-pattern.c | 2 ++ + src/cairo.h | 9 ++++++++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 8416b40f4357d0660ccb9f5b24b07b4d2f663fbc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 14:22:22 2012 +0000 + + win32: mark-dirty cannot assume the fallback has been discarded + + Flushing only releases the fallback if we flush twice with no + intervening damage (the theory is to try and reduce readbacks). So it is + possible for a correctly behaving application to call mark-dirty and there + still be a fallback. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-display-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 21218870300bfb4050b87c9a872b7664ce44d94e +Author: Igor Oliveira <igor.o@sisa.samsung.com> +Date: Fri Mar 23 16:54:22 2012 +0000 + + gl: GL_UNPACK_ROW_LENGTH does not accept negative values + + Use the slow fallback path if passed an image with a negative stride. + + Fixes negative-stride-image. + + src/cairo-gl-surface.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 60549f7a56d2b021ab612a6b66e720d31f3400ad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 13:03:27 2012 +0000 + + win32: Copy back the fallback damage to the right location + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-display-surface.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit c5b8cfab87754a0b7b41a257fdaa1b0776537cf8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 12:26:12 2012 +0000 + + test: Tweak the results summary + + Fix up the rules for the new directory structure. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 8a65d8e2de7d26bf285953a327b24a667eee62da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 00:31:58 2012 +0000 + + image: Fix leak of white solid color for masked composition of CLEAR + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit bc97bcf0efec761dff3e77499e1dfa42fdefef59 +Author: Henry Song <henry.song@samsung.com> +Date: Tue Mar 20 00:32:01 2012 +0000 + + gl: use direct mode for uploading gradient texture + + The gradient is relatively small and any differences between upload + methods should be hidden by the caching. As it stands, using pbo with + the gradient fails with fglrx. As the workaround to use a simple + TexImage2D is inconsequential (may even be a minute win) and simplifies + the code, just do it. + + src/cairo-gl-gradient.c | 52 +++++++++++++++++++------------------------------ + 1 file changed, 20 insertions(+), 32 deletions(-) + +commit 02e3b6bc80f1903352676d03102b6ca5f8def0b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 22 14:27:31 2012 +0000 + + directfb: Tweak, tweak, tweak. + + A couple of mistakes, such as inverting the logic as to when to flush + damage back from the shadow, meant that nothing happened when drawing to + the directfb surface. + + Again still only compile tested. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-directfb-surface.c | 88 ++++++++------------------------------------ + 1 file changed, 16 insertions(+), 72 deletions(-) + +commit be8a5f13b712920940c4819af59b77a291153870 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 22 12:25:58 2012 +0000 + + win32: Remove obsolete font rendering routines + + These are now done by cairo-win32-gdi-compositor. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-font.c | 187 ------------------------------------------- + 1 file changed, 187 deletions(-) + +commit 28b38312235c73aa436e8c1887db3d31620158ec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 22 12:07:06 2012 +0000 + + win32: Hook up glyph creation again + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-font.c | 80 +++++++++++++++++++++++++++++++++----------- + 1 file changed, 61 insertions(+), 19 deletions(-) + +commit 9bb5b02694e1bbd5c0cdd28606d80fb2d2d701ee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 21 20:08:15 2012 +0000 + + win32: Fix damage flushing + + The damage wasn't being created on the right surface, so the damage to + the fallback image surface was not being tracked. Perform a little bit + of juggling so that we track dirty regions on the fallback surface itself. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-display-surface.c | 42 ++++++++++++++++++++++++--------- + src/win32/cairo-win32-gdi-compositor.c | 5 ++-- + 2 files changed, 34 insertions(+), 13 deletions(-) + +commit c504dba5a76def6358a5b309ad5bc4a8dfe6199e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 21 20:07:00 2012 +0000 + + damage: Fix memcpy size + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-damage.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +commit eafa127001319942e2a5e2009979e3ffd36320ed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 21 20:07:55 2012 +0000 + + compositor: Add tracing for damage + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-compositor.c | 35 ++++++++++++++++++++++++++++++----- + 1 file changed, 30 insertions(+), 5 deletions(-) + +commit 86a89a8c1de88f279b306ac8e3461773895aa7a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 20 19:14:28 2012 +0000 + + win32: Check for damage before blitting + + During the surface flush, we reduce any pending damage and then blit. If + no damage had been accrued then the damage->region would be NULL leading + to a segfault. + + Patch suggested by Szuromi Gábor. + + Reported-by: Szuromi Gábor <kukkerman@gmail.com> + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47605 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-display-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0a778d974f2dca2555711ef79e738cb0614b2a3f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 19 19:42:01 2012 +0000 + + stroke: Adapt rectilinear stroker to handle separable non-unity scaling + + Reported-by: Christos Sotiriou <csotiriou@gmail.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-matrix.c | 15 ---- + src/cairo-path-stroke-boxes.c | 125 ++++++++++++++++-------------- + src/cairoint.h | 23 +++++- + test/reference/text-rotate.argb32.ref.png | Bin 16655 -> 0 bytes + test/reference/text-rotate.ref.png | Bin 14682 -> 16667 bytes + test/reference/text-rotate.rgb24.ref.png | Bin 16655 -> 0 bytes + 6 files changed, 84 insertions(+), 79 deletions(-) + +commit 1e4f385dec03083b2453205bf5f4bef25b3af806 +Author: Henry (Yu) Song <hsong@sisa.samsung.com> +Date: Tue Mar 13 22:06:46 2012 +0000 + + boilerplate/gl: set width and height to be at least 1 + + boilerplate/cairo-boilerplate-egl.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a473c035676168d21cd3b2fb61eaad2117b40057 +Author: Dongyeon Kim <dy5.kim@samsung.com> +Date: Fri Mar 16 10:31:05 2012 +0900 + + trace: Wrap GL surfaces + + util/cairo-trace/trace.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 183 insertions(+) + +commit a3612610b15c5c2b6155cfb7e54d6eacae7a0d92 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 19 10:30:58 2012 +0000 + + gl: Manually invert images without MESA_pack_invert extension + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-surface.c | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +commit cc98926cdea02ce4c11ed2c0d792429c25e7b5fa +Author: Kouhei Sutou <kou@clear-code.com> +Date: Mon Mar 19 10:28:56 2012 +0000 + + skia: add a missing header into archive + + src/Makefile.sources | 1 + + 1 file changed, 1 insertion(+) + +commit f5b5fad66e9c545f332a5f5cf8bd86c7d77caa93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 15 11:58:51 2012 +0000 + + trace: Add breadcrumb for cairo_image_surface_get_data() + + Just emit a marker for when cairo_image_surface_get_data() is called on + a surface so that we have a breadcrumb for when the pixels are first + exported. (Though note that pointer may be kept around and used much + later.) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit efb2018309aa7ad81b6a71dfa322fb871d94c36d +Author: Henry (Yu) Song <hsong@sisa.samsung.com> +Date: Tue Mar 13 16:35:21 2012 +0000 + + scaled-font: Ignore empty glyphs when checking for potential overlap + + A zero-sized box contains no pixels and so cannot overlap, but it does + still need to contribute to the extents. + + src/cairo-scaled-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 91113a9e4583fac275cc0fa01fc957abd9b7dc0e +Author: Chuanbo Weng <strgnm@gmail.com> +Date: Tue Mar 13 11:19:23 2012 +0000 + + subsurface: Avoid potential crash when subsurface's size is less than 0 + + When cairo_surface_create_for_rectangle() is given non-integer parameters, + the subsurface's size may be negative(e.g x = 0.2, width = 0.7, the + final width will be -1). This illegal surface may cause crash somewhere + upon later use, and although the fractional subsurface is ill-defined, + we should never crash! + + src/cairo-surface-subsurface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit d67f02e23e008b21425e319b5c95022348363749 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 13 11:16:39 2012 +0000 + + spans-compositor: Only destroy the clip if we made the copy + + The extents->clip may be replaced elsewhere and so we cannot assume that + simply because it changed from the stashed value, that it was us that + made that copy. So becareful to only free our copy. + + Fixes a double-free of a clip after a complex fallback operation. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 94a9e06a930ba985de461826ea3e64fd7c222bc6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 12 18:41:45 2012 +0000 + + clip: Intialise polygon fill-rule prior to use + + The earliest use of the clip path's polygon fill rule is now for + intersecting the original polygon with the plurality of clip boxes. + However, the initialisation of the fill rule remained after the + intersection. + + ==8968== Conditional jump or move depends on uninitialised value(s) + ==8968== at 0x4C99449: _cairo_polygon_intersect (cairo-polygon-intersect.c:1382) + ==8968== by 0x4C9B788: _cairo_polygon_intersect_with_boxes.part.12 (cairo-polygon-intersect.c:1520) + ==8968== by 0x4C6AE6E: _cairo_clip_get_polygon (cairo-clip-polygon.c:104) + ==8968== by 0x4CAA667: clip_and_composite_boxes.part.13 (cairo-spans-compositor.c:773) + ==8968== by 0x4CAAD1D: clip_and_composite_boxes (cairo-spans-compositor.c:758) + ==8968== by 0x4CAB25C: _cairo_spans_compositor_fill (cairo-spans-compositor.c:1023) + ==8968== by 0x4C6CB69: _cairo_compositor_fill (cairo-compositor.c:184) + ==8968== by 0x4C7CE3E: _cairo_image_surface_fill (cairo-image-surface.c:945) + ==8968== by 0x4CAE2B6: _cairo_surface_fill (cairo-surface.c:2047) + ==8968== by 0x4C74AB7: _cairo_gstate_fill (cairo-gstate.c:1268) + ==8968== by 0x4C6E6D3: _cairo_default_context_fill (cairo-default-context.c:1009) + ==8968== by 0x4C67944: cairo_fill (cairo.c:2105) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-polygon.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit ea0703524f1a508b4c60c7a3ea5b5da3c40bca2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 12 18:20:16 2012 +0000 + + image: Support SRC compositing with in the inline span-compositor + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 106 +++++++++++++++++++++++--- + test/reference/operator-source.argb32.ref.png | Bin 5630 -> 5625 bytes + test/reference/operator-source.rgb24.ref.png | Bin 4000 -> 3967 bytes + 3 files changed, 96 insertions(+), 10 deletions(-) + +commit e0be011207a2efdd81f9fdededa6f6ec2031cbf1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 10 11:02:13 2012 +0000 + + skia: Setup opacity for cairo_paint_with_alpha() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/skia/cairo-skia-context.cpp | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit f7897e7cbd43e6ed01b5fe13ae76a65c1d4a5e83 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 12 10:11:17 2012 +0000 + + version: Post-release version bump to 1.11.5 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a8dbc68056af9f32b6ebc6c1a0191e9ca7ec2e7d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 12 09:00:50 2012 +0000 + + version: Bump for snapshot 1.11.4 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + NEWS | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + cairo-version.h | 2 +- + 2 files changed, 89 insertions(+), 1 deletion(-) + +commit 49f03c2738f3984a7bd93687973fd20e9fe4ba5c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 12 09:24:36 2012 +0000 + + test: Restore 'release-verify-sane-tests' makefile target + + Empty for the moment as there is no need to cross-reference the files in + git against the list in the Makefile anymore, but the release process + still requires it - and it may prove to be useful again in the future. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ab0e224b999c005c0d59b887188fddf34189a74a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 10 10:46:39 2012 +0000 + + skia: compile fix + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/skia/cairo-skia-surface.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit f7d4653c1b945c93d394541e5c32397c90c2c139 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 9 14:06:58 2012 +0000 + + stroke: Do not initialise the pen if will not use it + + The pen is only used for ensuring that we generate consist vertices + around a fan used for end-capping or line-joining when set to ROUND. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-path-stroke-polygon.c | 30 +++++++++++++++++++----------- + 1 file changed, 19 insertions(+), 11 deletions(-) + +commit 5ff689c01771165d26cc272d65e01dfb1a1fd57e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 9 14:06:06 2012 +0000 + + mono-scan-converter: Use edge->is_vertical flag + + The earlier bug found in edge advancement was actually due to the missed + opportunity of not performing the increment when we know the step is + zero. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 07b540fd35d7312bbfb362f22dac20f57f6900e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 9 00:14:48 2012 +0000 + + bentley-ottmann: Sort by edge bounding boxes before computing x + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 247c42357c2aaccfbcccd0656b22fc73c0303194 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 9 00:01:21 2012 +0000 + + bentley-ottmann: Skip intersection check if the bounds do not overlap + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 2ab171467be53f190239e8cee083b2687ca66025 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 8 20:30:45 2012 +0000 + + hash: Keep a simple lut in front of the main hash + + Whilst we wait for IvyBridge with its fast integer divide, in the + meantime avoid the overhead by inspecting a smaller simpler cache before + doing the full hash table lookup. + + Shaves around 10% off glyph microbenchmarks for -image. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-hash.c | 26 ++++++++++++++++++++------ + 1 file changed, 20 insertions(+), 6 deletions(-) + +commit 002a3d8b95e5aaf795d95cdfccd16a6e78c36d6e +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 17:22:56 2012 +0100 + + doc: fix broken link + + cairo_win32_scaled_font_create_for_logfontw() does not exist. Probably + cairo_win32_font_face_create_for_logfontw() was meant instead. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/win32/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed89a3eeb08d200eb91fd003d52b6f40bb2f0a06 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 17:04:15 2012 +0100 + + doc/xcb: document cairo_xcb_device_get_connection + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit e44186fdfe1334354152744c25894e1e08dd9f81 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 16:52:22 2012 +0100 + + doc/xlib/xcb: document get/set_precision API + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 21 ++++++++++++++++++++- + src/cairo-xlib-display.c | 20 ++++++++++++++++++++ + 2 files changed, 40 insertions(+), 1 deletion(-) + +commit 423990ba7065da8f204723cdce6e4d10af1ae4fd +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 17:52:58 2012 +0100 + + doc/ps-surface: minor improvements + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ps-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 70af9e68514accd63ec9ce8fee0344e1eefe04ee +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 15:36:34 2012 +0100 + + doc/ft-font: add reference to cairo_ft_synthesize_t + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ft-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f22ecd3568ec8e0f0be2549e688f12d79f6053e0 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 13:49:17 2012 +0100 + + doc: describe cairo_recording_surface_get_extents + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-recording-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 2184bd6672ccc3dbd29799ae3d8890d36f64a3ab +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 13:20:15 2012 +0100 + + doc: avoid confusing gtk-doc by double asterisks + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/drm/cairo-drm-i915-private.h | 24 +++--- + src/drm/cairo-drm-i965-shader.c | 4 +- + src/drm/cairo-drm-intel-brw-eu.c | 26 +++---- + src/drm/cairo-drm-intel-brw-eu.h | 50 ++++++------- + src/drm/cairo-drm-intel-ioctl-private.h | 126 ++++++++++++++++---------------- + 5 files changed, 115 insertions(+), 115 deletions(-) + +commit 6d2582a22ab00f4f87966bb1f965c86d94c4f077 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 12:45:04 2012 +0100 + + doc: move value descriptions up + + to make gtk-doc happy + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ft.h | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 16d6b938c876065afb4a3b63a521b7d4d5ea17cf +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 23:43:56 2012 +0100 + + doc: ensure "compatibility" spelling + + This changes not only comments, but also code! + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-cogl-gradient-private.h | 6 +++--- + src/cairo-cogl-gradient.c | 22 +++++++++++----------- + src/cairo-xlib-surface.c | 2 +- + 3 files changed, 15 insertions(+), 15 deletions(-) + +commit 6ce412e15a22db588a9fe690724d6bee64fdb667 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 23:31:25 2012 +0100 + + doc: symbol names in header and comment must match + + The names of the function arguments in the function prototype and + in the description comment must match, otherwise gtk-doc is confused. + When the argument names differ between function prototype and + definition, use the names from the prototype. + + Also add a missing colon. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ft.h | 4 ++-- + src/cairo-quartz-image-surface.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit b42270a3f14774c6557d798b8cc4c310785f4e70 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 23:19:20 2012 +0100 + + doc: preserve whitespace by using docbook screen tag + + Using the programlisting tag is not appropriate everywhere. Use the + screen tag where the formatting shall be preserved and the text is no + code listing. + + Also add whitespace to prevent gtk-doc from inserting paragraph breaks. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-pattern.c | 4 ++-- + src/cairo-version.c | 18 +++++++++--------- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit 77da76ac6c31709962e81b2683d984bc58c412d6 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 23:00:54 2012 +0100 + + doc: fix a few typos found by codespell + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + perf/README | 4 ++-- + src/cairo-beos-surface.cpp | 2 +- + src/cairo-cogl-context.c | 2 +- + src/cairo-cogl-surface.c | 4 ++-- + src/cairo-ft-font.c | 2 +- + src/cairo-mesh-pattern-rasterizer.c | 2 +- + src/cairo-os2-surface.c | 2 +- + src/cairo-region.c | 2 +- + src/cairo-types-private.h | 2 +- + src/cairo-wideint-private.h | 2 +- + src/cairo-xcb-shm.c | 2 +- + src/cairo.c | 2 +- + src/drm/cairo-drm-intel-brw-eu-emit.c | 2 +- + src/win32/cairo-win32-font.c | 2 +- + test/Makefile.am | 2 +- + test/README | 2 +- + test/dash-offset.c | 2 +- + test/glyph-cache-pressure.c | 2 +- + util/cairo-trace/cairo-trace.in | 2 +- + 19 files changed, 21 insertions(+), 21 deletions(-) + +commit 4a1d4205580b793f46101aafe432e9eaf39cf8f2 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Mar 4 17:46:10 2012 +0100 + + doc: script_mode_t needs at least one line of text + + Gtk-doc recognizes documentation only if there is additional text. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-script.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 344d62b011a9b4ef77b76c9d4377b73133a01cfc +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 22:06:56 2012 +0100 + + doc: Add colon to Returns statement + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6b2d12e78a80dd8687b927defbe0704df9cdecf1 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 22:06:33 2012 +0100 + + doc: do not confuse gtk-doc by @ and double * + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-gl.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e1c9e7acfcea89e7e0bd5c425968b1ef8840dc4d +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 21:43:27 2012 +0100 + + doc: add missing _face to function names + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ft-font.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 95ba71812de7c754939e8e15f784ecb65d129fd6 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 21:38:39 2012 +0100 + + doc: add colon to .._padded_image_from_image + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 914448c30454e77f0204a78cae8eef8fd85c4d25 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 20:45:05 2012 +0100 + + doc: add index of new symbols in 1.12 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + doc/public/cairo-docs.xml | 3 +++ + 1 file changed, 3 insertions(+) + +commit acf50966e63598c9ef2a1479048fe2554828ad43 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 20:31:12 2012 +0100 + + doc: typo + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4353eafa32e396093f845e32c1d015c044f589fe +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Mar 3 20:28:47 2012 +0100 + + doc: add missing colons to since tags + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-ft-font.c | 12 ++++++------ + src/cairo-ft.h | 2 +- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit c0eaaa1680ff95abb1b897cd98266a4ed5ce6287 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 8 15:27:03 2012 +0000 + + test: Refresh the fallback-resolution reference images + + Despite copying across the font options from the PDF backend, it still + looks like the image surface is override the glyph placement... Odd. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/fallback-resolution.c | 20 +++++++++++++++++++- + .../fallback-resolution.ppi144x144.ref.png | Bin 8697 -> 8746 bytes + .../reference/fallback-resolution.ppi144x72.ref.png | Bin 8445 -> 8531 bytes + .../reference/fallback-resolution.ppi288x72.ref.png | Bin 7166 -> 7203 bytes + .../reference/fallback-resolution.ppi576x72.ref.png | Bin 6432 -> 6457 bytes + .../reference/fallback-resolution.ppi72x144.ref.png | Bin 8677 -> 8710 bytes + .../reference/fallback-resolution.ppi72x288.ref.png | Bin 7231 -> 7224 bytes + .../reference/fallback-resolution.ppi72x576.ref.png | Bin 6523 -> 6604 bytes + test/reference/fallback-resolution.ppi72x72.ref.png | Bin 8510 -> 8579 bytes + 9 files changed, 19 insertions(+), 1 deletion(-) + +commit 1952fec8294b6473cb1c0719d1ef0fb0b864b6b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 8 15:11:40 2012 +0000 + + surface: Relax assertion about not rendering to a snapshot + + Recently I began using the surface->snapshot_of member of a subsurface + to cache a target representation of the current subsurface. More + recently, I discovered this caused an assertion failure in epiphany, and + probably other GTK3 based programs. + + Throwaway the assertion and trust that the programmer doesn't make any + mistakes... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 04108ce4925f7de8211e3b06dcf351e4ad2700c5 +Author: Martin Robinson <mrobinson@igalia.com> +Date: Tue Mar 6 14:28:52 2012 -0800 + + gl/msaa: Do not attach a depth-stencil attachment to the default framebuffer + + Only texture surfaces need to have a depth-stencil attachment. + The default framebuffer is responsible for managing its own + depth and stencil attachments. + + src/cairo-gl-device.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 345460445973548374c171e30e6add02de1e1922 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 6 21:05:40 2012 +0000 + + xlib: Apply the glyph offset + + The (dst_x, dst_y) parameters passed to the XRenderCompositeText are + misleading and do not perform any adjustment, so we have to do it + ourselves. + + Fixes clip-operator + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-render-compositor.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit ad758280b6e7d9f7bcc3b02796b3a1d9df908471 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 6 21:03:02 2012 +0000 + + traps: The CompositeTrapezoids requires the unbounded fixup for clipping + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 70 +++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 69 insertions(+), 1 deletion(-) + +commit 753007ea0097ecd3ea9611dba69e995f755d5f5c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 6 15:01:05 2012 +0000 + + traps: Avoid double application of unaligned clip boxes + + Both combine-with-clip functions now take care of any intersection with + clip boxes so the result would be to have overdrawn the unaligned clip + box mask twice. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 59 +++++++++++++++++++++++++++----------------- + 1 file changed, 37 insertions(+), 22 deletions(-) + +commit d40b90a577f3dd159d3871185ed8d649a03a2a4e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 6 14:59:44 2012 +0000 + + clip: Use the boxes-intersection routine for computing the clip polygon + + If we have more than a single box, run the boxes intersection as a + post-processing step on the clip polygon, as it should be faster than + doing it inline. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-polygon.c | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +commit f8f0510f8929980f9b8da7ef0f39d231dfe24686 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 6 14:42:19 2012 +0000 + + image: Add unbounded support to the mono rasteriser fast-paths + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 120 +++++++++++++++++++++++++++++++++++-------- + 1 file changed, 100 insertions(+), 20 deletions(-) + +commit 5bd29eda63ee54daecfdfe36b12a1b6c4b592740 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 6 14:11:49 2012 +0000 + + surface-wrapper: Only apply the wrapped transform to the scaled-font + + And not the device_transform of the target. This smells fishy, but + appears to make the test suite happy. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit c65ed9c79dea9c906db5f34d074500c821ad3228 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 5 14:23:57 2012 +0000 + + image: Try performing span composition a row at a time + + In theory, this should be more cache efficient and allow us to trim the + operation to the width of row, shaving a few texel fetches. The cost is + that we cause pixman to evaluate the composite operation per-row. This + should only be a temporary solution until we can do something better + through pixman... + + On a i5-2520m, ymmv, + + firefox-fishtank 64585.38 -> 56823.41: 1.14x speedup + swfdec-fill-rate 1383.24 -> 1665.88: 1.20x slowdown + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 137 +++++++++++++++++++++++++++++++++++-------- + 1 file changed, 114 insertions(+), 23 deletions(-) + +commit c19bf1499a95bed5fb1be145eefd8e0c6ee2a634 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 5 10:06:49 2012 +0000 + + image: Add a simple inplace blitter for spans + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 148 ++++++++++++++++----- + .../recording-surface-extend-none.rgb24.ref.png | Bin 3133 -> 3128 bytes + .../reference/recording-surface-over.rgb24.ref.png | Bin 3133 -> 3128 bytes + 3 files changed, 116 insertions(+), 32 deletions(-) + +commit 9f83ac5c63684d6576fcbd6c902ee127c457f724 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 5 05:15:52 2012 +0000 + + image: Perform the simple solid-fill spans inplace + + Reducing the number of passes has the usual change in the antialiasing + side-effects, as well as the boon of being faster (and theorectically more + accurate through reduced loss of dynamic range.) + + On an i5-2520m: + swfdec-giant-steps-full 3240.43 -> 2651.36: 1.22x speedup + grads-heat-map 166.84 -> 136.79: 1.22x speedup + swfdec-giant-steps 940.19 -> 796.24: 1.18x speedup + ocitysmap 953.51 -> 831.96: 1.15x speedup + webkit-canvas-alpha 13924.01 -> 13115.70: 1.06x speedup + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 349 ++++++++++++++++++++- + test/reference/clip-operator.argb32.ref.png | Bin 8245 -> 8216 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3333 -> 3293 bytes + test/reference/fallback.argb32.ref.png | Bin 4070 -> 4059 bytes + test/reference/fallback.rgb24.ref.png | Bin 3141 -> 3139 bytes + test/reference/hatchings.ref.png | Bin 93586 -> 95333 bytes + test/reference/operator-source.argb32.ref.png | Bin 5612 -> 5630 bytes + test/reference/operator-source.rgb24.ref.png | Bin 3975 -> 4000 bytes + test/reference/overlapping-boxes.argb32.ref.png | Bin 187 -> 192 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 179 -> 185 bytes + .../recording-surface-extend-none.rgb24.ref.png | Bin 3128 -> 3133 bytes + .../reference/recording-surface-over.rgb24.ref.png | Bin 3128 -> 3133 bytes + 12 files changed, 348 insertions(+), 1 deletion(-) + +commit e572ae253a9fe62ba5d61bc6e98c9efc502d7414 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 5 11:49:50 2012 +0000 + + spans: Handle fallbacks from upload-boxes by reverting to the normal composite + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ac80097a31098a9ac746c3d14c1eeaa2198dbef8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 19:01:45 2012 +0000 + + traps: First attempt to convert curvy unantialiased polygon to scanlines + + If we have a curvy polygon, we can expect to generate lots of short + trapezoids. However, we may be able to reduce the transport size by + converting them into a set of boxes instead. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-boxes-private.h | 5 ++++ + src/cairo-boxes.c | 59 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-traps-compositor.c | 14 +++++++++++ + 3 files changed, 78 insertions(+) + +commit c45822886aae53def2e76ef582aac167adf7fd56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 18:31:20 2012 +0000 + + traps: Use the mono-scan-converter to reduce the number of traps + + This trick only seems effective with mono-rasterisation, with a win of + about 10% for tiger-demo --antialias=none. At other antialias setting, + performance is reduced. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 31 +++++++++++++++++++--- + src/cairo-traps-private.h | 6 +++++ + src/cairo-traps.c | 62 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 95 insertions(+), 4 deletions(-) + +commit 38a242a380d24c669f10dd542c3bab606434b8ad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 17:59:28 2012 +0000 + + spans,image,gl: Add fast-path for simple copies + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-spans-compositor.c | 65 +++++++++++++++++++++++++++++++++++- + src/cairo-image-compositor.c | 2 ++ + src/cairo-spans-compositor-private.h | 11 ++++++ + src/cairo-spans-compositor.c | 47 ++++++++++++++++++++++++-- + 4 files changed, 121 insertions(+), 4 deletions(-) + +commit aed5a1cf1e38ae451d2aeaf0a56aa1248b42c0fa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 17:22:38 2012 +0000 + + spans: Reduce composite_aligned_boxes with over to source for opaque patterns + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit cc13379ee37cc077cd728588dfbb15a38980c23c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 16:51:02 2012 +0000 + + image: Add a fast-path for mono-rasterised blits + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 195 ++++++++++++++++++++++++++++++++----------- + 1 file changed, 144 insertions(+), 51 deletions(-) + +commit 937325d6640aed9c1367627260f80a47b9ed7042 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 16:16:38 2012 +0000 + + image: Perform the general composite operation inplace for mono rasterisation + + We suffer from the large overhead in calling pixman_image_composite32 + per-span, but even will that overhead it is a net win with the usual + caveat about cache efficiency and function call overhead. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 120 ++++++++++++++++++++++++++++++--------- + test/reference/hatchings.ref.png | Bin 93764 -> 93586 bytes + 2 files changed, 92 insertions(+), 28 deletions(-) + +commit bda545dee47e6ddc4a82406262a8f2c75413fc75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 16:15:43 2012 +0000 + + spans: Retrim extents to clipped polygon + + After combining the mask polygon with the clip polygon, recompute the + extents of the operation. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 61cb5539fa81bc543781b8a3a8f1b7a2d5df9f35 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 15:07:24 2012 +0000 + + image: Add a fast path for solid-filled polygons + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles.c | 1 + + src/cairo-image-compositor.c | 209 ++++++++++++++++++++++++++++++++++++++- + 2 files changed, 207 insertions(+), 3 deletions(-) + +commit b55e7c776fadb3e730b2a5970736a2f84a1fefdc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 4 14:15:22 2012 +0000 + + spans: Pass antialiasing hint down to the backends + + The actual span rasterisers may be able to specialise if they know that + the spans will be pixel aligned. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-spans-compositor.c | 1 + + src/cairo-image-compositor.c | 1 + + src/cairo-spans-compositor-private.h | 1 + + src/cairo-spans-compositor.c | 6 ++++-- + src/test-null-compositor-surface.c | 3 ++- + 5 files changed, 9 insertions(+), 3 deletions(-) + +commit a77db2f6e290b2c06c22b7050a04276f3054f52b +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Mar 3 15:10:41 2012 +0100 + + xlib-xcb: Fix make check + + cairo_xcb_device_debug_cap_xrender_version is called by xlib-xcb's + cairo_xlib_device_debug_cap_xrender_version and thus must be marked slim_hidden. + + Checking .libs/libcairo.so for local PLT entries + 0000000000306ff8 0000024200000007 R_X86_64_JUMP_SLOT + 000000000009e720 cairo_xcb_device_debug_cap_xrender_version + 0 + FAIL: check-plt.sh + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 3 +++ + src/cairo-xcb-private.h | 1 + + 2 files changed, 4 insertions(+) + +commit f905f7100663f34542d782f97d35639ae9208d99 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Mar 3 13:45:59 2012 +0100 + + Fix docs for cairo_xlib_device_debug_cap_xrender_version + + The documentation was apparently copied from + cairo_xcb_device_debug_cap_xrender_version without changing "XCB" into "Xlib". + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-display.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 03df52a833f6d4845394e7e657dbbc5619079be7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Mar 3 12:33:24 2012 +0000 + + image: Correct origin of unbound recording surface source + + Clearly demonstrated by using the test-base with the recording surfaces + and exemplified by the fallback-resolution with PDF, which is *almost* + fixed! + + We're very close to making a release candidate for 1.12 now... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 29 ++++++++++++--------- + .../record-extend-none-similar.base.argb32.ref.png | Bin 0 -> 293 bytes + .../record-extend-none-similar.base.rgb24.ref.png | Bin 0 -> 293 bytes + .../record-extend-none.base.argb32.ref.png | Bin 0 -> 293 bytes + .../record-extend-none.base.rgb24.ref.png | Bin 0 -> 293 bytes + .../record-extend-pad-similar.base.argb32.ref.png | Bin 0 -> 298 bytes + .../record-extend-pad-similar.base.rgb24.ref.png | Bin 0 -> 298 bytes + .../record-extend-pad.base.argb32.ref.png | Bin 0 -> 298 bytes + .../reference/record-extend-pad.base.rgb24.ref.png | Bin 0 -> 298 bytes + ...cord-extend-reflect-similar.base.argb32.ref.png | Bin 0 -> 335 bytes + ...ecord-extend-reflect-similar.base.rgb24.ref.png | Bin 0 -> 335 bytes + .../record-extend-reflect.base.argb32.ref.png | Bin 0 -> 335 bytes + .../record-extend-reflect.base.rgb24.ref.png | Bin 0 -> 335 bytes + ...ecord-extend-repeat-similar.base.argb32.ref.png | Bin 0 -> 286 bytes + ...record-extend-repeat-similar.base.rgb24.ref.png | Bin 0 -> 286 bytes + .../record-extend-repeat.base.argb32.ref.png | Bin 0 -> 286 bytes + .../record-extend-repeat.base.rgb24.ref.png | Bin 0 -> 286 bytes + .../record-fill-alpha.base.argb32.ref.png | Bin 0 -> 2824 bytes + .../reference/record-fill-alpha.base.rgb24.ref.png | Bin 0 -> 2824 bytes + test/reference/record-fill-alpha.base.xfail.png | Bin 0 -> 2853 bytes + test/reference/record-mesh.base.argb32.ref.png | Bin 0 -> 15229 bytes + test/reference/record-mesh.base.rgb24.ref.png | Bin 0 -> 15229 bytes + ...ecord-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 330 bytes + ...record-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 330 bytes + .../record-paint-alpha-clip-mask.base.xfail.png | Bin 0 -> 337 bytes + .../record-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 269 bytes + .../record-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 269 bytes + ...cord-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 248 bytes + ...ecord-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 248 bytes + .../record-paint-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes + .../record-paint-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/record-paint.base.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/record-paint.base.rgb24.ref.png | Bin 0 -> 93 bytes + .../record-select-font-face.base.argb32.ref.png | Bin 0 -> 2250 bytes + .../record-select-font-face.base.rgb24.ref.png | Bin 0 -> 2250 bytes + .../record-self-intersecting.base.argb32.ref.png | Bin 0 -> 208 bytes + .../record-self-intersecting.base.rgb24.ref.png | Bin 0 -> 208 bytes + .../record-text-transform.base.argb32.ref.png | Bin 0 -> 5579 bytes + .../record-text-transform.base.rgb24.ref.png | Bin 0 -> 5579 bytes + .../record1414x-fill-alpha.base.argb32.ref.png | Bin 0 -> 4191 bytes + .../record1414x-fill-alpha.base.rgb24.ref.png | Bin 0 -> 4191 bytes + .../record1414x-fill-alpha.base.xfail.png | Bin 0 -> 4138 bytes + ...1414x-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 466 bytes + ...d1414x-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 466 bytes + ...ecord1414x-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 380 bytes + ...record1414x-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 380 bytes + ...414x-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 317 bytes + ...1414x-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 317 bytes + .../record1414x-paint-alpha.base.argb32.ref.png | Bin 0 -> 265 bytes + .../record1414x-paint-alpha.base.rgb24.ref.png | Bin 0 -> 265 bytes + .../record1414x-paint.base.argb32.ref.png | Bin 0 -> 95 bytes + .../reference/record1414x-paint.base.rgb24.ref.png | Bin 0 -> 95 bytes + ...ecord1414x-select-font-face.base.argb32.ref.png | Bin 0 -> 3177 bytes + ...record1414x-select-font-face.base.rgb24.ref.png | Bin 0 -> 3177 bytes + ...cord1414x-self-intersecting.base.argb32.ref.png | Bin 0 -> 353 bytes + ...ecord1414x-self-intersecting.base.rgb24.ref.png | Bin 0 -> 353 bytes + .../record1414x-text-transform.base.argb32.ref.png | Bin 0 -> 8706 bytes + .../record1414x-text-transform.base.rgb24.ref.png | Bin 0 -> 8706 bytes + .../record2x-fill-alpha.base.argb32.ref.png | Bin 0 -> 5896 bytes + .../record2x-fill-alpha.base.rgb24.ref.png | Bin 0 -> 5896 bytes + test/reference/record2x-fill-alpha.base.xfail.png | Bin 0 -> 5724 bytes + ...ord2x-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 488 bytes + ...cord2x-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 488 bytes + .../record2x-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 322 bytes + .../record2x-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 322 bytes + ...rd2x-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 281 bytes + ...ord2x-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 281 bytes + .../record2x-paint-alpha.base.argb32.ref.png | Bin 0 -> 291 bytes + .../record2x-paint-alpha.base.rgb24.ref.png | Bin 0 -> 291 bytes + test/reference/record2x-paint.base.argb32.ref.png | Bin 0 -> 98 bytes + test/reference/record2x-paint.base.rgb24.ref.png | Bin 0 -> 98 bytes + .../record2x-select-font-face.base.argb32.ref.png | Bin 0 -> 4407 bytes + .../record2x-select-font-face.base.rgb24.ref.png | Bin 0 -> 4407 bytes + .../record2x-self-intersecting.base.argb32.ref.png | Bin 0 -> 171 bytes + .../record2x-self-intersecting.base.rgb24.ref.png | Bin 0 -> 171 bytes + .../record2x-text-transform.base.argb32.ref.png | Bin 0 -> 13476 bytes + .../record2x-text-transform.base.rgb24.ref.png | Bin 0 -> 13476 bytes + .../record90-fill-alpha.base.argb32.ref.png | Bin 0 -> 2658 bytes + .../record90-fill-alpha.base.rgb24.ref.png | Bin 0 -> 2658 bytes + ...ord90-paint-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 332 bytes + ...cord90-paint-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 332 bytes + .../record90-paint-alpha-clip.base.argb32.ref.png | Bin 0 -> 279 bytes + .../record90-paint-alpha-clip.base.rgb24.ref.png | Bin 0 -> 279 bytes + ...rd90-paint-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 254 bytes + ...ord90-paint-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 254 bytes + .../record90-paint-alpha.base.argb32.ref.png | Bin 0 -> 105 bytes + .../record90-paint-alpha.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/record90-paint.base.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/record90-paint.base.rgb24.ref.png | Bin 0 -> 93 bytes + .../record90-select-font-face.base.argb32.ref.png | Bin 0 -> 2272 bytes + .../record90-select-font-face.base.rgb24.ref.png | Bin 0 -> 2272 bytes + .../record90-self-intersecting.base.argb32.ref.png | Bin 0 -> 208 bytes + .../record90-self-intersecting.base.rgb24.ref.png | Bin 0 -> 208 bytes + .../record90-text-transform.base.argb32.ref.png | Bin 0 -> 5811 bytes + .../record90-text-transform.base.rgb24.ref.png | Bin 0 -> 5811 bytes + 95 files changed, 16 insertions(+), 13 deletions(-) + +commit 8968f010356fc946193aa1ee0a28af39730b8338 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 1 23:24:55 2012 +0000 + + base: Remove the double application of the clip boxes + + The clipping code was modified to handle partial boxes itself, so update + the base compositor to simply use the core clipping code and avoid + double application. + + src/test-base-compositor-surface.c | 174 ++++++--------------- + .../clip-disjoint-hatching.base.argb32.ref.png | Bin 8021 -> 7948 bytes + .../clip-disjoint-hatching.base.rgb24.ref.png | Bin 8021 -> 7948 bytes + .../clip-fill-eo-unbounded.base.argb32.ref.png | Bin 3693 -> 3735 bytes + .../clip-fill-eo-unbounded.base.rgb24.ref.png | Bin 3198 -> 3224 bytes + .../clip-fill-nz-unbounded.base.argb32.ref.png | Bin 3693 -> 3735 bytes + .../clip-fill-nz-unbounded.base.rgb24.ref.png | Bin 3198 -> 3224 bytes + test/reference/clip-fill-rule.base.argb32.ref.png | Bin 412 -> 437 bytes + test/reference/clip-fill-rule.base.rgb24.ref.png | Bin 361 -> 393 bytes + test/reference/clip-fill.base.argb32.ref.png | Bin 1049 -> 1039 bytes + test/reference/clip-fill.base.rgb24.ref.png | Bin 1049 -> 1039 bytes + .../clip-group-shapes-circles.base.argb32.ref.png | Bin 1534 -> 1511 bytes + .../clip-group-shapes-circles.base.rgb24.ref.png | Bin 1534 -> 1511 bytes + ...shapes-unaligned-rectangles.base.argb32.ref.png | Bin 431 -> 415 bytes + ...-shapes-unaligned-rectangles.base.rgb24.ref.png | Bin 431 -> 415 bytes + test/reference/clip-image.base.argb32.ref.png | Bin 2686 -> 2677 bytes + test/reference/clip-image.base.rgb24.ref.png | Bin 2686 -> 2677 bytes + test/reference/clip-intersect.base.argb32.ref.png | Bin 193 -> 200 bytes + test/reference/clip-intersect.base.rgb24.ref.png | Bin 193 -> 200 bytes + test/reference/clip-nesting.base.argb32.ref.png | Bin 1031 -> 1044 bytes + test/reference/clip-nesting.base.rgb24.ref.png | Bin 936 -> 937 bytes + test/reference/clip-operator.base.argb32.ref.png | Bin 8179 -> 8182 bytes + test/reference/clip-operator.base.rgb24.ref.png | Bin 3243 -> 3244 bytes + test/reference/clip-polygons.base.argb32.ref.png | Bin 1296 -> 1336 bytes + test/reference/clip-polygons.base.rgb24.ref.png | Bin 1296 -> 1336 bytes + test/reference/clip-push-group.base.argb32.ref.png | Bin 155 -> 164 bytes + test/reference/clip-push-group.base.rgb24.ref.png | Bin 155 -> 164 bytes + .../reference/clip-rectilinear.base.argb32.ref.png | Bin 440 -> 439 bytes + test/reference/clip-rectilinear.base.rgb24.ref.png | Bin 440 -> 439 bytes + test/reference/clip-shape.base.argb32.ref.png | Bin 2943 -> 2916 bytes + test/reference/clip-shape.base.rgb24.ref.png | Bin 2943 -> 2916 bytes + .../clip-stroke-unbounded.base.argb32.ref.png | Bin 3617 -> 3655 bytes + .../clip-stroke-unbounded.base.rgb24.ref.png | Bin 3108 -> 3135 bytes + test/reference/clip-stroke.base.argb32.ref.png | Bin 1491 -> 1444 bytes + test/reference/clip-stroke.base.rgb24.ref.png | Bin 1491 -> 1444 bytes + test/reference/clip-text.base.argb32.ref.png | Bin 899 -> 921 bytes + test/reference/clip-text.base.rgb24.ref.png | Bin 899 -> 921 bytes + test/reference/clip-twice.base.argb32.ref.png | Bin 1343 -> 1341 bytes + test/reference/clip-twice.base.rgb24.ref.png | Bin 1179 -> 1194 bytes + test/reference/clipped-group.base.argb32.ref.png | Bin 316 -> 316 bytes + test/reference/clipped-group.base.rgb24.ref.png | Bin 316 -> 316 bytes + test/reference/hatchings.base.argb32.ref.png | Bin 90611 -> 94196 bytes + test/reference/hatchings.base.rgb24.ref.png | Bin 90611 -> 94196 bytes + test/reference/mask.base.argb32.ref.png | Bin 8451 -> 8439 bytes + test/reference/mask.base.rgb24.ref.png | Bin 7058 -> 7044 bytes + .../paint-with-alpha-clip-mask.base.argb32.ref.png | Bin 305 -> 330 bytes + .../paint-with-alpha-clip-mask.base.rgb24.ref.png | Bin 305 -> 330 bytes + .../paint-with-alpha-clip.base.argb32.ref.png | Bin 303 -> 269 bytes + .../paint-with-alpha-clip.base.rgb24.ref.png | Bin 303 -> 269 bytes + ...paint-with-alpha-solid-clip.base.argb32.ref.png | Bin 266 -> 248 bytes + .../paint-with-alpha-solid-clip.base.rgb24.ref.png | Bin 266 -> 248 bytes + .../pdf-isolated-group.base.argb32.ref.png | Bin 0 -> 217 bytes + .../pdf-isolated-group.base.rgb24.ref.png | Bin 0 -> 217 bytes + test/reference/random-clip.base.argb32.ref.png | Bin 521040 -> 521821 bytes + test/reference/random-clip.base.rgb24.ref.png | Bin 521040 -> 521821 bytes + ...te-clip-image-surface-paint.base.argb32.ref.png | Bin 303 -> 331 bytes + ...ate-clip-image-surface-paint.base.rgb24.ref.png | Bin 303 -> 331 bytes + test/reference/rotated-clip.base.argb32.ref.png | Bin 3922 -> 3912 bytes + test/reference/rotated-clip.base.rgb24.ref.png | Bin 3922 -> 3912 bytes + test/reference/tighten-bounds.base.argb32.ref.png | Bin 8486 -> 8490 bytes + test/reference/tighten-bounds.base.rgb24.ref.png | Bin 7856 -> 7847 bytes + test/reference/trap-clip.base.argb32.ref.png | Bin 5753 -> 5651 bytes + test/reference/trap-clip.base.rgb24.ref.png | Bin 5379 -> 5351 bytes + 63 files changed, 49 insertions(+), 125 deletions(-) + +commit 705cd6e1c642863a06b9cfc269572ceb473ac87a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 2 12:22:22 2012 +0000 + + test/record1414: Pixel align the clip for replay + + In order to match the reference image we need complete coverage, and the + purpose of the test is to check non-integer scaling of replays rather + than handling of the clip pixels. That partial coverage is better tested + elsewhere. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/record1414x.c | 1 + + test/reference/record1414x-fill-alpha.xfail.png | Bin 0 -> 4216 bytes + 2 files changed, 1 insertion(+) + +commit b8a6019e0c5f93d59faaec12de4bec454e9d8f9d +Author: Zhigang Gong <zhigang.gong@linux.intel.com> +Date: Thu Mar 1 14:38:30 2012 +0000 + + mono: Always bias initial edge advancement + + Even for a vertical edge, we still need to bias the error term otherwise + later we will find the error term is too larger and advance a pixel on + every row. + + Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 2 +- + test/reference/a1-bug.argb32.ref.png | Bin 3735 -> 0 bytes + test/reference/a1-bug.ref.png | Bin 3220 -> 3736 bytes + test/reference/a1-bug.rgb24.ref.png | Bin 3735 -> 0 bytes + 4 files changed, 1 insertion(+), 1 deletion(-) + +commit cdbf4c60fe373c896ac71e2f681e42744bcbd7e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 29 14:38:13 2012 +0000 + + spans,traps-compositor: Check for all-clipped after intersecting clip with boxes + + If the mask does not intersect the clip, then there is no drawing to be + performed and we can report NOTHING_TO_DO. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 3 +++ + src/cairo-traps-compositor.c | 3 +++ + 2 files changed, 6 insertions(+) + +commit 300e32a4a9d79c26077f33e9b67bad2106071849 +Author: Seongwon Cho <seongwon1.cho@samsung.com> +Date: Wed Feb 29 18:59:34 2012 +0900 + + mono-scan-convertor: Include space for the closing span + + When estimating the maximum number of spans required for a particular + width, we need to include a closing span. + + Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 2587b9dfd391fc1dc6e20eaa4c2d64fafe2e809b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 29 11:51:02 2012 +0000 + + ft: Export FreeType synthesis options + + Currently you can only specify that a cairo_ft_font_face_t should + synthesize a font (to make a bold variant) through an FcPattern. That is + direct consumers of the public cairo-ft API have no control over the + synthesize options. + + Rectify this by creating some public API to allow control over the + synthesis flags, and include the ability to construct an oblique as + well an embolden font. + + Based on a patch by Deokjin Kim <deokjin81.kim@samsung.com>. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + configure.ac | 2 +- + src/cairo-ft-font.c | 108 +++++++++++++++++++++++++++++++++++++++++----------- + src/cairo-ft.h | 37 ++++++++++++++++++ + 3 files changed, 124 insertions(+), 23 deletions(-) + +commit 231f0e32b916d436465fe16cfa38da27eb4df698 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 29 11:21:28 2012 +0000 + + ft: Remove unused HINT_METRICS from ft_font.extra-flags + + This is handled through the normal cairo_font_options_t and was not + used. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ft-font.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit a49a26f961bc284d496ea7e16dd79e0ddb36c98e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 29 10:03:00 2012 +0000 + + gl: Various fixes for glyphs + + Not 100% improvement, there are still a variety of failures with + GLXWindows, but getting there. At least it fixes more things than its + breaks... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-compositor.c | 5 +++++ + src/cairo-fallback-compositor.c | 5 +++++ + src/cairo-gl-composite.c | 3 +-- + src/cairo-gl-glyphs.c | 47 ++++++++++++++++++++++------------------- + src/cairo-gl-msaa-compositor.c | 6 ++---- + src/cairo-gl-operand.c | 13 ++++++++++-- + src/cairo-gl-private.h | 7 ++++-- + src/cairo-gl-source.c | 1 + + src/cairo-gl-spans-compositor.c | 43 ++++++++++++++++++++++--------------- + src/cairo-gl-surface.c | 4 ++-- + src/cairo-gl-traps-compositor.c | 12 +++++------ + src/cairo-spans-compositor.c | 13 ++++++++++++ + src/cairo-surface.c | 6 ++++++ + 13 files changed, 108 insertions(+), 57 deletions(-) + +commit 3c665102c2b7ccd69aec7658e398ce6dd6dae38b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 22:27:18 2012 +0000 + + spans+image: Fix clipping with polygons and spans + + Fixes: clip-source, random-clip + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 1 + + src/cairo-clip-private.h | 3 + + src/cairo-clip.c | 18 ++ + src/cairo-compositor-private.h | 4 + + src/cairo-image-compositor.c | 36 ++- + src/cairo-image-spans-compositor.c | 131 -------- + src/cairo-shape-mask-compositor.c | 337 +++++++++++++++++++++ + src/cairo-spans-compositor.c | 49 ++- + test/reference/a1-tiger.argb32.ref.png | Bin 20328 -> 0 bytes + test/reference/a1-tiger.rgb24.ref.png | Bin 20328 -> 0 bytes + test/reference/clip-disjoint.argb32.ref.png | Bin 5399 -> 0 bytes + test/reference/clip-disjoint.ref.png | Bin 3934 -> 5438 bytes + test/reference/clip-disjoint.rgb24.ref.png | Bin 5399 -> 0 bytes + test/reference/clip-operator.argb32.ref.png | Bin 8158 -> 8245 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3231 -> 3333 bytes + test/reference/clip-stroke.argb32.ref.png | Bin 1522 -> 0 bytes + test/reference/clip-stroke.ref.png | Bin 1206 -> 1445 bytes + test/reference/clip-stroke.rgb24.ref.png | Bin 1522 -> 0 bytes + test/reference/degenerate-arc.argb32.ref.png | Bin 653 -> 0 bytes + test/reference/degenerate-arc.ref.png | Bin 690 -> 646 bytes + test/reference/degenerate-arc.rgb24.ref.png | Bin 653 -> 0 bytes + .../finer-grained-fallbacks.argb32.ref.png | Bin 1167 -> 1068 bytes + .../finer-grained-fallbacks.rgb24.ref.png | Bin 891 -> 837 bytes + test/reference/hatchings.argb32.ref.png | Bin 92730 -> 0 bytes + test/reference/hatchings.ref.png | Bin 45496 -> 93764 bytes + test/reference/hatchings.rgb24.ref.png | Bin 92730 -> 0 bytes + test/reference/operator-source.argb32.ref.png | Bin 5585 -> 5612 bytes + test/reference/operator-source.rgb24.ref.png | Bin 3954 -> 3975 bytes + test/reference/over-around-source.argb32.ref.png | Bin 618 -> 633 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 501 -> 499 bytes + test/reference/over-below-source.argb32.ref.png | Bin 443 -> 447 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 377 -> 385 bytes + test/reference/over-between-source.argb32.ref.png | Bin 593 -> 596 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 460 -> 463 bytes + test/reference/overlapping-boxes.argb32.ref.png | Bin 210 -> 187 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 201 -> 179 bytes + test/reference/random-clip.ref.png | Bin 523342 -> 529871 bytes + test/reference/tighten-bounds.argb32.ref.png | Bin 9127 -> 9115 bytes + test/reference/tighten-bounds.rgb24.ref.png | Bin 8433 -> 8256 bytes + 39 files changed, 420 insertions(+), 159 deletions(-) + +commit be5ab6df68cba1bd0709fa4319e29141d4491d94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 18:11:22 2012 +0000 + + surface-wrapper: Apply the scaled-font ctm and non-default font-options + + Improves record*-text-transform. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-matrix.c | 15 +++++++++++++++ + src/cairo-surface-wrapper.c | 18 ++++++++++++++++-- + src/cairoint.h | 5 +++++ + 3 files changed, 36 insertions(+), 2 deletions(-) + +commit 2c908f8a42456ab0ec6f12c36a2cf68523287ba7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 17:55:41 2012 +0000 + + test: Regenerate reference images for vanilla record tests + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/record.c | 6 ++++++ + .../record-extend-none-similar.argb32.ref.png | Bin 0 -> 293 bytes + .../record-extend-none-similar.image16.rgb24.ref.png | Bin 0 -> 293 bytes + .../record-extend-none-similar.rgb24.ref.png | Bin 0 -> 293 bytes + test/reference/record-extend-none.argb32.ref.png | Bin 0 -> 293 bytes + .../record-extend-none.image16.rgb24.ref.png | Bin 0 -> 293 bytes + test/reference/record-extend-none.rgb24.ref.png | Bin 0 -> 293 bytes + .../record-extend-pad-similar.argb32.ref.png | Bin 0 -> 298 bytes + .../record-extend-pad-similar.image16.rgb24.ref.png | Bin 0 -> 298 bytes + .../reference/record-extend-pad-similar.rgb24.ref.png | Bin 0 -> 298 bytes + test/reference/record-extend-pad.argb32.ref.png | Bin 0 -> 298 bytes + .../reference/record-extend-pad.image16.rgb24.ref.png | Bin 0 -> 298 bytes + test/reference/record-extend-pad.rgb24.ref.png | Bin 0 -> 298 bytes + .../record-extend-reflect-similar.argb32.ref.png | Bin 0 -> 335 bytes + ...ecord-extend-reflect-similar.image16.rgb24.ref.png | Bin 0 -> 335 bytes + .../record-extend-reflect-similar.rgb24.ref.png | Bin 0 -> 335 bytes + test/reference/record-extend-reflect.argb32.ref.png | Bin 0 -> 335 bytes + .../record-extend-reflect.image16.rgb24.ref.png | Bin 0 -> 335 bytes + test/reference/record-extend-reflect.rgb24.ref.png | Bin 0 -> 335 bytes + .../record-extend-repeat-similar.argb32.ref.png | Bin 0 -> 286 bytes + ...record-extend-repeat-similar.image16.rgb24.ref.png | Bin 0 -> 286 bytes + .../record-extend-repeat-similar.rgb24.ref.png | Bin 0 -> 286 bytes + test/reference/record-extend-repeat.argb32.ref.png | Bin 0 -> 286 bytes + .../record-extend-repeat.image16.rgb24.ref.png | Bin 0 -> 286 bytes + test/reference/record-extend-repeat.rgb24.ref.png | Bin 0 -> 286 bytes + test/reference/record-fill-alpha.argb32.ref.png | Bin 0 -> 2736 bytes + .../reference/record-fill-alpha.image16.rgb24.ref.png | Bin 0 -> 2232 bytes + test/reference/record-fill-alpha.rgb24.ref.png | Bin 0 -> 2736 bytes + test/reference/record-fill-alpha.xfail.png | Bin 0 -> 2839 bytes + test/reference/record-mesh.argb32.ref.png | Bin 0 -> 15229 bytes + test/reference/record-mesh.image16.rgb24.ref.png | Bin 0 -> 9027 bytes + test/reference/record-mesh.rgb24.ref.png | Bin 0 -> 15229 bytes + .../record-paint-alpha-clip-mask.argb32.ref.png | Bin 0 -> 340 bytes + ...record-paint-alpha-clip-mask.image16.rgb24.ref.png | Bin 0 -> 352 bytes + .../record-paint-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 340 bytes + test/reference/record-paint-alpha-clip-mask.xfail.png | Bin 0 -> 333 bytes + test/reference/record-paint-alpha-clip.argb32.ref.png | Bin 0 -> 290 bytes + .../record-paint-alpha-clip.image16.rgb24.ref.png | Bin 0 -> 313 bytes + test/reference/record-paint-alpha-clip.rgb24.ref.png | Bin 0 -> 290 bytes + .../record-paint-alpha-solid-clip.argb32.ref.png | Bin 0 -> 248 bytes + ...ecord-paint-alpha-solid-clip.image16.rgb24.ref.png | Bin 0 -> 274 bytes + .../record-paint-alpha-solid-clip.rgb24.ref.png | Bin 0 -> 248 bytes + test/reference/record-paint-alpha.argb32.ref.png | Bin 0 -> 224 bytes + .../record-paint-alpha.image16.rgb24.ref.png | Bin 0 -> 253 bytes + test/reference/record-paint-alpha.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/record-paint.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/record-paint.image16.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/record-paint.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/record-select-font-face.argb32.ref.png | Bin 0 -> 2250 bytes + .../record-select-font-face.image16.rgb24.ref.png | Bin 0 -> 1236 bytes + test/reference/record-select-font-face.ref.png | Bin 2473 -> 2245 bytes + test/reference/record-select-font-face.rgb24.ref.png | Bin 0 -> 2250 bytes + .../reference/record-self-intersecting.argb32.ref.png | Bin 0 -> 168 bytes + .../record-self-intersecting.image16.rgb24.ref.png | Bin 0 -> 228 bytes + test/reference/record-self-intersecting.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/record-text-transform.argb32.ref.png | Bin 0 -> 5579 bytes + .../record-text-transform.image16.rgb24.ref.png | Bin 0 -> 2688 bytes + test/reference/record-text-transform.rgb24.ref.png | Bin 0 -> 5579 bytes + 58 files changed, 6 insertions(+) + +commit ef7e57f0fd1aaf96be87cc73b4d51d6ce55f231b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 17:44:15 2012 +0000 + + scaled-font: Assign a temporary hash value for the placeholder + + Fixes [large-]twin-antialias-mixed. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 050c246174e480a3e27b1665e70f1958d02d9008 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 17:38:21 2012 +0000 + + test: Add record90 to exercise replaying a rotated recording surface + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/record90.c | 495 +++++++++++++++++++++ + test/reference/record90-fill-alpha.argb32.ref.png | Bin 0 -> 2651 bytes + test/reference/record90-fill-alpha.rgb24.ref.png | Bin 0 -> 2651 bytes + test/reference/record90-fill-alpha.xfail.png | Bin 0 -> 2654 bytes + .../record90-paint-alpha-clip-mask.argb32.ref.png | Bin 0 -> 343 bytes + .../record90-paint-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 343 bytes + .../record90-paint-alpha-clip-mask.xfail.png | Bin 0 -> 324 bytes + .../record90-paint-alpha-clip.argb32.ref.png | Bin 0 -> 296 bytes + .../record90-paint-alpha-clip.rgb24.ref.png | Bin 0 -> 296 bytes + test/reference/record90-paint-alpha-clip.xfail.png | Bin 0 -> 327 bytes + .../record90-paint-alpha-solid-clip.argb32.ref.png | Bin 0 -> 254 bytes + .../record90-paint-alpha-solid-clip.rgb24.ref.png | Bin 0 -> 254 bytes + test/reference/record90-paint-alpha.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/record90-paint-alpha.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/record90-paint.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/record90-paint.rgb24.ref.png | Bin 0 -> 93 bytes + .../record90-select-font-face.argb32.ref.png | Bin 0 -> 2272 bytes + .../record90-select-font-face.rgb24.ref.png | Bin 0 -> 2272 bytes + .../record90-self-intersecting.argb32.ref.png | Bin 0 -> 167 bytes + .../record90-self-intersecting.rgb24.ref.png | Bin 0 -> 167 bytes + .../record90-text-transform.argb32.ref.png | Bin 0 -> 5811 bytes + .../record90-text-transform.rgb24.ref.png | Bin 0 -> 5811 bytes + 23 files changed, 496 insertions(+) + +commit 4429c7a3016622f9a31af6b6b9ff353e896885db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 15:05:57 2012 +0000 + + scaled-font: Refactor the hash computation + + Remove the cut'n'paste duplication and replace the hash computation with + a proper function. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 54 +++++++++++++++++++++---------------------------- + 1 file changed, 23 insertions(+), 31 deletions(-) + +commit da381da7f324497132ca547246c5299708fb968e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 28 14:50:16 2012 +0000 + + scaled-font: Key the cache on the original font face + + Complete the task started in cd4b2d843b2a8c06ba78c15ff65763b5bdf54dc6 by + remembering to compute the insertion hash on the original font face as + well as the lookup hashes. Also take advantage by deferring resolution + of the implementation for the font face until after we fail to find an + already constructed scaled font. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 181 +++++++++++++++++++++++++----------------------- + 1 file changed, 94 insertions(+), 87 deletions(-) + +commit 1cfd27851e4700270204bb39d48827eaa33b849d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 27 15:04:58 2012 +0000 + + test: Set record2x-fill-alpha as an xfail + + As the path is converted to fixed-point prior to application of the + replay scale factor, we currently do anticipate some loss in precision + and slight difference in antialiasing. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/record2x-fill-alpha.xfail.png | Bin 0 -> 5978 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 668e8eac3af27ddad050c0975d1aa43b2ccca01a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 27 15:02:30 2012 +0000 + + test/record: Fix typo in record*-text-transform + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/record.c | 2 +- + test/record1414x.c | 2 +- + test/record2x.c | 2 +- + test/reference/record-text-transform.ref.png | Bin 6200 -> 5281 bytes + .../record1414x-text-transform.argb32.ref.png | Bin 5459 -> 0 bytes + test/reference/record1414x-text-transform.ref.png | Bin 0 -> 8706 bytes + .../record1414x-text-transform.rgb24.ref.png | Bin 5459 -> 0 bytes + test/reference/record2x-text-transform.argb32.ref.png | Bin 8267 -> 0 bytes + test/reference/record2x-text-transform.ref.png | Bin 0 -> 13476 bytes + test/reference/record2x-text-transform.rgb24.ref.png | Bin 8267 -> 0 bytes + 10 files changed, 3 insertions(+), 3 deletions(-) + +commit b1b5e9b9087ff3e0679f850b36314ca38986a11d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 27 14:25:39 2012 +0000 + + surface-wrapper: Apply replay transforms to scaled font + + Improves: record2x-select-font-face, record2x-text-transform + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 78aeb0d14c7941964c232f4fc199d6d277835a79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 27 14:46:02 2012 +0000 + + test: Verify scaled replay of a recording surface + + After this works, we may also like to check simple rotations and an + affine transform. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 2 + + test/record1414x.c | 497 +++++++++++++++++++++ + test/record2x.c | 493 ++++++++++++++++++++ + .../record1414x-fill-alpha.argb32.ref.png | Bin 0 -> 4129 bytes + .../reference/record1414x-fill-alpha.rgb24.ref.png | Bin 0 -> 4129 bytes + ...ecord1414x-paint-alpha-clip-mask.argb32.ref.png | Bin 0 -> 473 bytes + ...record1414x-paint-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 473 bytes + .../record1414x-paint-alpha-clip.argb32.ref.png | Bin 0 -> 378 bytes + .../record1414x-paint-alpha-clip.rgb24.ref.png | Bin 0 -> 378 bytes + ...cord1414x-paint-alpha-solid-clip.argb32.ref.png | Bin 0 -> 317 bytes + ...ecord1414x-paint-alpha-solid-clip.rgb24.ref.png | Bin 0 -> 317 bytes + .../record1414x-paint-alpha.argb32.ref.png | Bin 0 -> 265 bytes + .../record1414x-paint-alpha.rgb24.ref.png | Bin 0 -> 265 bytes + test/reference/record1414x-paint.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/record1414x-paint.rgb24.ref.png | Bin 0 -> 95 bytes + .../record1414x-select-font-face.argb32.ref.png | Bin 0 -> 3177 bytes + .../record1414x-select-font-face.rgb24.ref.png | Bin 0 -> 3177 bytes + .../record1414x-self-intersecting.argb32.ref.png | Bin 0 -> 394 bytes + .../record1414x-self-intersecting.rgb24.ref.png | Bin 0 -> 394 bytes + .../record1414x-text-transform.argb32.ref.png | Bin 0 -> 5459 bytes + .../record1414x-text-transform.rgb24.ref.png | Bin 0 -> 5459 bytes + test/reference/record2x-fill-alpha.argb32.ref.png | Bin 0 -> 5715 bytes + test/reference/record2x-fill-alpha.rgb24.ref.png | Bin 0 -> 5715 bytes + .../record2x-paint-alpha-clip-mask.argb32.ref.png | Bin 0 -> 503 bytes + .../record2x-paint-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 503 bytes + .../record2x-paint-alpha-clip.argb32.ref.png | Bin 0 -> 322 bytes + .../record2x-paint-alpha-clip.rgb24.ref.png | Bin 0 -> 322 bytes + .../record2x-paint-alpha-solid-clip.argb32.ref.png | Bin 0 -> 281 bytes + .../record2x-paint-alpha-solid-clip.rgb24.ref.png | Bin 0 -> 281 bytes + test/reference/record2x-paint-alpha.argb32.ref.png | Bin 0 -> 291 bytes + test/reference/record2x-paint-alpha.rgb24.ref.png | Bin 0 -> 291 bytes + test/reference/record2x-paint.argb32.ref.png | Bin 0 -> 98 bytes + test/reference/record2x-paint.rgb24.ref.png | Bin 0 -> 98 bytes + .../record2x-select-font-face.argb32.ref.png | Bin 0 -> 4407 bytes + .../record2x-select-font-face.rgb24.ref.png | Bin 0 -> 4407 bytes + .../record2x-self-intersecting.argb32.ref.png | Bin 0 -> 171 bytes + .../record2x-self-intersecting.rgb24.ref.png | Bin 0 -> 171 bytes + .../record2x-text-transform.argb32.ref.png | Bin 0 -> 8267 bytes + .../record2x-text-transform.rgb24.ref.png | Bin 0 -> 8267 bytes + 39 files changed, 992 insertions(+) + +commit 2d3a1c7318df67347f65b0098cb9ea091ed93b3a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 25 16:56:08 2012 +1030 + + pdf: ensure all transparency groups are isolated + + src/cairo-pdf-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 2de75b1a3453f734feeb67de1c09d70d640c7b24 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 25 16:53:26 2012 +1030 + + test: add test to check that pdf transparency groups are non-isolated + + test/Makefile.sources | 1 + + test/pdf-isolated-group.c | 73 ++++++++++++++++++++++++++++++ + test/reference/pdf-isolated-group.ref.png | Bin 0 -> 217 bytes + 3 files changed, 74 insertions(+) + +commit 589216c1e36a2925de08929702615c593a31eff4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 25 09:52:10 2012 +1030 + + win32: fix compilation on cygwin + + boilerplate/cairo-boilerplate-win32-printing.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 7154f646d30132104f69098b1d0c2f903c32ed53 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 16:15:31 2012 +0000 + + pdf,ps: The device offset only needs to taken into account for raster patterns + + Ordinary patterns have their device offsets pre-baked into the pattern + matrix. The difference with raster patterns is that the surface is + generated upon use by the pdf,ps and so its device offset is not known + until then. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 2 -- + src/cairo-ps-surface.c | 3 +-- + 2 files changed, 1 insertion(+), 4 deletions(-) + +commit 99ec915b97e36a7576e30c45160cc2b90d0cc92f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 14:30:14 2012 +0000 + + test: a1-line-width is a test of rasterisation, so skip for the vector backends + + PDF/PS do not have the concept of aliased rendering, so like many of the + other rasterisation tests, a1-line-width cannot be tested satisfactorily + on those backends. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/line-width.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 513841263e27502646af45fad7f34e96b7f3322e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 14:07:10 2012 +0000 + + recording: Remove superfluous reset + + When merging the two-clauses, I forgot to remove the second + _cairo_recording_surface_reset() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 61050f5445000be014764cedb6da36cb357bf434 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 13:56:41 2012 +0000 + + test: Add a couple of reference images for the recording surface + + In tests where we apply a scale factor to a similar source, the + recording surface will produce different results to image as the scaling + of the source is performed on the geometry and not on a raster image and + so avoids scaling artefacts. + + .../reference/mask-transformed-similar.recording.ref.png | Bin 0 -> 3528 bytes + test/reference/source-clip-scale.recording.ref.png | Bin 0 -> 116 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit c39cb77d64afdeff522a74d31af6386f5fd3c10f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 13:00:44 2012 +0000 + + subsurface: Fix typo in snapshot creation + + I need to remember that the translation for the pattern matrix is the + inverse of the translation for drawing. + + Fixes: subsurface-modify-parent + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b2cb9ec31ea580164a3d5a267bff334a0c6b4dc5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 13:45:44 2012 +0000 + + recording: Optimize a copy of one recording surface onto another + + Rather than store a command to copy from a reference of another recording + surface onto this, just replay the other recording surface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 8028f04a919d1e6afe95c21cd16172c367f05392 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 13:46:54 2012 +0000 + + debug: Add some TRACE statements for recording surfaces and snapshots + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 10 ++++++++++ + src/cairo-surface-snapshot.c | 7 +++++++ + src/cairo-surface-subsurface.c | 7 +++++++ + 3 files changed, 24 insertions(+) + +commit 6b5199645af00a11e445e0ebdf74d8a9f6a3718a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 13:44:52 2012 +0000 + + image: Handle recursive drawing of recording surface + + Borrow the technique for installing a proxy-snapshot developed for + acquiring the image from a recording surface. + + This prevents the cairo from exploding and using up all memory due to + infinite recursion, but it does break a few tests that perform + self-copies with differing transformations. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 88 insertions(+), 1 deletion(-) + +commit 080bcfcb1a8f1c17340529e51b0d9dfaa9a66fa7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 24 12:12:24 2012 +0000 + + {mask,traps}-composite: Restore unsetting of the is-clear flags for the mask + + I forgot that creating any image by defaults results in pixman + calloc'ing the pixel data and so cairo helpfully sets the is-clear flag + on the surface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mask-compositor.c | 3 ++- + src/cairo-traps-compositor.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit b079f18fade93472db83b4decf086e30711a86d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 23 13:39:37 2012 +0000 + + xlib: Handle window-to-window copies by avoiding the use of a clip region + + Rather than compress the copies into a clip + copy, iterate over and + perform each copy separately so as to avoid the confusion for + window-to-window copies and the solitary GC->pCompositeClip. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-render-compositor.c | 96 +++++++++++++++++++++----------------- + 1 file changed, 54 insertions(+), 42 deletions(-) + +commit cc09b29752e857e55879a7d773b8be1317eb2001 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 23 13:40:59 2012 +0000 + + xlib: Tidy conversion of xrender format to cairo_content_t + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +commit d95cf87c03f2b4f2677450cae1d0be3aa15c0a97 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Feb 22 23:50:21 2012 +0100 + + boilerplate: Use any2ppm from ANY2PPM env variable + + If the environment variable ANY2PPM is set, use it as the path to the + any2ppm program. Otherwise, default to "./any2ppm" as before. + + This makes it possible to set the ANY2PPM variable in the + Makefile.win32 build system, which makes it possible to use the "test" + target on the script backend. + + boilerplate/cairo-boilerplate.c | 11 +++++++++-- + test/Makefile.win32 | 2 +- + 2 files changed, 10 insertions(+), 3 deletions(-) + +commit 716a79bfcbc97401a9c43434783068b40da9a1f4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 21:33:43 2012 +0000 + + xlib-xcb: Wrap cairo_xlib_device_debug_cap_xrender_version + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-xcb-surface.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 7e3c9631915b85acd915161cb2ba00cb24033e58 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 19:55:22 2012 +0000 + + surface-wrapper: Transform the clip by the device-transform correctly + + Fixes paginated fallbacks. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit d6908135f4fc98496bc1e9a1d48a3ae95cc30594 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 19:54:12 2012 +0000 + + image: Tidy reduction to EXTEND_NONE for replay surfaces + + As _cairo_surface_get_source() returns the limits of the source, a chunk + of code to query the source extents became redundant. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 13 +------------ + 1 file changed, 1 insertion(+), 12 deletions(-) + +commit 58639857f9fbe99f4fca6ab2b1d13306ffbfe8d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 17:42:16 2012 +0000 + + script: Update mesh pattern for earlier change of csi operators + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 1b1b1ecc6f4343295aad177d127c95af0a5e8611 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 15:57:36 2012 +0000 + + traps-compositor: add a missing release() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit e5cb567f5d7c87faf09e240fc1649eebf0b1f0f6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 15:49:34 2012 +0000 + + xlib: Trim the ximage to match the trimming of the intermediate + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1111cc50d3311fa47b0828e28085388ef746322a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 15:43:55 2012 +0000 + + xlib: Make the core compositor actually paint + + It helps to actually set the fill colour when drawing... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-core-compositor.c | 49 ++++++++++++++++++++++++++++++++++++---- + 1 file changed, 44 insertions(+), 5 deletions(-) + +commit 5b107587e7f67f1b6829b3eb64f9238a65a16528 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 15:13:26 2012 +0000 + + xlib: Correct the device-offset applied to the map-to-image result + + A typo, a typo surely, to use extents->y twice instead of the more + normal x, y. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 85110d9ce1a5ffd1cf274cf4233538fb55949078 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 15:04:45 2012 +0000 + + xlib: Trim the intermediate upload image to match the upload extents + + Rather than transform the whole image, just convert the region of + interest. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit 89fddc38ebc3cd6f02dd09cd071ef7ba0a94631d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 12:57:12 2012 +0000 + + traps-compositor: Reduce a complex clip generation to an ADD operator + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 126 ++++++++++++++++++++++++++++++++++--------- + 1 file changed, 100 insertions(+), 26 deletions(-) + +commit 9e640c7ae2cc968cbf4607efdf7f7ab26e5c0bb8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 11:42:15 2012 +0000 + + mask-compositor: Acquire the target surface when creating the composite mask + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mask-compositor.c | 52 ++++++++++++++++++++++++++++++++------------ + src/cairo-traps-compositor.c | 39 +++++++++++++++++++++++---------- + 2 files changed, 65 insertions(+), 26 deletions(-) + +commit 605f23d15562d28138ade7f0717cbcf3d01147bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 11:27:05 2012 +0000 + + xlib: Hook up copy_boxes for the mask compositor + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-render-compositor.c | 1 + + 1 file changed, 1 insertion(+) + +commit 6ab1deb5c6377828877253a7ec0ca43d97ca4a99 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 11:03:54 2012 +0000 + + boilerplate/xlib: Exercise the mask based compositor for xrender version 0.0 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-xlib.c | 73 +++++++++++++++++++++++++++++++++++- + 1 file changed, 72 insertions(+), 1 deletion(-) + +commit 08de30d8b5700040d3ff953bae8d801a4a05aff0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 10:51:30 2012 +0000 + + test: Add a set of reference images for the mask-based compositor + + Serves as another reference for some xlib targets. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/a1-bug.mask.argb32.ref.png | Bin 0 -> 3735 bytes + test/reference/a1-bug.mask.rgb24.ref.png | Bin 0 -> 3735 bytes + test/reference/a1-clip-fill-equal.mask.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill-equal.mask.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill-rule.mask.argb32.ref.png | Bin 0 -> 236 bytes + test/reference/a1-clip-fill-rule.mask.rgb24.ref.png | Bin 0 -> 218 bytes + test/reference/a1-clip-fill.mask.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill.mask.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.mask.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.mask.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.mask.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.mask.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-fill.base.argb32.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.base.rgb24.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.mask.argb32.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.mask.rgb24.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.traps.argb32.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.traps.rgb24.ref.png | Bin 0 -> 328 bytes + test/reference/a1-image-sample.mask.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.mask.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-line-width.mask.argb32.ref.png | Bin 0 -> 154 bytes + test/reference/a1-line-width.mask.rgb24.ref.png | Bin 0 -> 154 bytes + test/reference/a1-mask-sample.mask.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask-sample.mask.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask.mask.argb32.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.mask.rgb24.ref.png | Bin 0 -> 106 bytes + .../a1-rasterisation-rectangles.mask.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-rectangles.mask.rgb24.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.mask.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.mask.rgb24.ref.png | Bin 0 -> 1729 bytes + test/reference/a1-rectilinear-grid.mask.argb32.ref.png | Bin 0 -> 207 bytes + test/reference/a1-rectilinear-grid.mask.rgb24.ref.png | Bin 0 -> 207 bytes + test/reference/a1-sample.mask.argb32.ref.png | Bin 0 -> 786 bytes + test/reference/a1-sample.mask.rgb24.ref.png | Bin 0 -> 786 bytes + test/reference/a1-tiger.mask.argb32.ref.png | Bin 0 -> 20328 bytes + test/reference/a1-tiger.mask.rgb24.ref.png | Bin 0 -> 20328 bytes + test/reference/a1-traps-sample.mask.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-traps-sample.mask.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a8-clear.mask.argb32.ref.png | Bin 0 -> 271 bytes + test/reference/a8-clear.mask.rgb24.ref.png | Bin 0 -> 271 bytes + test/reference/a8-mask.mask.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/a8-mask.mask.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/aliasing.mask.argb32.ref.png | Bin 0 -> 104324 bytes + test/reference/aliasing.mask.rgb24.ref.png | Bin 0 -> 104324 bytes + test/reference/alpha-similar.mask.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.mask.rgb24.ref.png | Bin 0 -> 88 bytes + test/reference/api-special-cases.mask.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/api-special-cases.mask.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/arc-direction.base.argb32.ref.png | Bin 0 -> 5864 bytes + test/reference/arc-direction.base.rgb24.ref.png | Bin 0 -> 5864 bytes + test/reference/arc-direction.mask.argb32.ref.png | Bin 0 -> 6380 bytes + test/reference/arc-direction.mask.rgb24.ref.png | Bin 0 -> 6380 bytes + test/reference/arc-direction.traps.argb32.ref.png | Bin 0 -> 6380 bytes + test/reference/arc-direction.traps.rgb24.ref.png | Bin 0 -> 6380 bytes + test/reference/arc-infinite-loop.mask.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/arc-infinite-loop.mask.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/arc-looping-dash.mask.argb32.ref.png | Bin 0 -> 464 bytes + test/reference/arc-looping-dash.mask.rgb24.ref.png | Bin 0 -> 464 bytes + test/reference/big-empty-triangle.mask.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/big-empty-triangle.mask.rgb24.ref.png | Bin 0 -> 108 bytes + test/reference/big-line.mask.argb32.ref.png | Bin 0 -> 977 bytes + test/reference/big-line.mask.rgb24.ref.png | Bin 0 -> 977 bytes + test/reference/big-little-box.mask.argb32.ref.png | Bin 0 -> 169 bytes + test/reference/big-little-box.mask.rgb24.ref.png | Bin 0 -> 160 bytes + test/reference/big-little-triangle.mask.argb32.ref.png | Bin 0 -> 409 bytes + test/reference/big-little-triangle.mask.rgb24.ref.png | Bin 0 -> 328 bytes + test/reference/big-trap.mask.argb32.ref.png | Bin 0 -> 319 bytes + test/reference/big-trap.mask.rgb24.ref.png | Bin 0 -> 319 bytes + test/reference/bilevel-image.mask.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-image.mask.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bitmap-font.mask.argb32.ref.png | Bin 0 -> 931 bytes + test/reference/bitmap-font.mask.rgb24.ref.png | Bin 0 -> 871 bytes + test/reference/bug-40410.mask.argb32.ref.png | Bin 0 -> 429 bytes + test/reference/bug-40410.mask.rgb24.ref.png | Bin 0 -> 429 bytes + test/reference/bug-bo-rectangular.mask.argb32.ref.png | Bin 0 -> 950 bytes + test/reference/bug-bo-rectangular.mask.rgb24.ref.png | Bin 0 -> 950 bytes + test/reference/bug-bo-ricotz.base.argb32.ref.png | Bin 0 -> 2125 bytes + test/reference/bug-bo-ricotz.base.rgb24.ref.png | Bin 0 -> 2125 bytes + test/reference/bug-bo-ricotz.mask.argb32.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-bo-ricotz.mask.rgb24.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-bo-ricotz.traps.argb32.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-bo-ricotz.traps.rgb24.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-extents.mask.argb32.ref.png | Bin 0 -> 9251 bytes + test/reference/bug-extents.mask.rgb24.ref.png | Bin 0 -> 9251 bytes + test/reference/bug-seams.mask.argb32.ref.png | Bin 0 -> 1647 bytes + test/reference/bug-seams.mask.rgb24.ref.png | Bin 0 -> 1647 bytes + test/reference/caps-joins-alpha.mask.argb32.ref.png | Bin 0 -> 2662 bytes + test/reference/caps-joins-alpha.mask.rgb24.ref.png | Bin 0 -> 2662 bytes + test/reference/caps-joins-curve.mask.argb32.ref.png | Bin 0 -> 6217 bytes + test/reference/caps-joins-curve.mask.rgb24.ref.png | Bin 0 -> 6217 bytes + test/reference/caps-joins.mask.argb32.ref.png | Bin 0 -> 2893 bytes + test/reference/caps-joins.mask.rgb24.ref.png | Bin 0 -> 2893 bytes + test/reference/caps-sub-paths.mask.argb32.ref.png | Bin 0 -> 168 bytes + test/reference/caps-sub-paths.mask.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/caps-tails-curve.mask.argb32.ref.png | Bin 0 -> 53311 bytes + test/reference/caps-tails-curve.mask.rgb24.ref.png | Bin 0 -> 53311 bytes + test/reference/caps.mask.argb32.ref.png | Bin 0 -> 2115 bytes + test/reference/caps.mask.rgb24.ref.png | Bin 0 -> 2115 bytes + test/reference/checkerboard.mask.argb32.ref.png | Bin 0 -> 142 bytes + test/reference/checkerboard.mask.rgb24.ref.png | Bin 0 -> 142 bytes + test/reference/clear-source.mask.argb32.ref.png | Bin 0 -> 882 bytes + test/reference/clear-source.mask.rgb24.ref.png | Bin 0 -> 882 bytes + test/reference/clear.mask.argb32.ref.png | Bin 0 -> 692 bytes + test/reference/clear.mask.rgb24.ref.png | Bin 0 -> 617 bytes + test/reference/clip-all.mask.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-all.mask.rgb24.ref.png | Bin 0 -> 95 bytes + .../clip-complex-shape-eo-aa.mask.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-aa.mask.rgb24.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.mask.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.mask.rgb24.ref.png | Bin 0 -> 325 bytes + test/reference/clip-contexts.mask.argb32.ref.png | Bin 0 -> 98 bytes + test/reference/clip-contexts.mask.rgb24.ref.png | Bin 0 -> 98 bytes + test/reference/clip-device-offset.mask.argb32.ref.png | Bin 0 -> 175 bytes + test/reference/clip-device-offset.mask.rgb24.ref.png | Bin 0 -> 168 bytes + .../clip-disjoint-hatching.mask.argb32.ref.png | Bin 0 -> 8789 bytes + .../clip-disjoint-hatching.mask.rgb24.ref.png | Bin 0 -> 8789 bytes + test/reference/clip-disjoint.mask.argb32.ref.png | Bin 0 -> 5399 bytes + test/reference/clip-disjoint.mask.rgb24.ref.png | Bin 0 -> 5399 bytes + test/reference/clip-empty-group.mask.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-group.mask.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-save.mask.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty-save.mask.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.mask.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.mask.rgb24.ref.png | Bin 0 -> 95 bytes + .../clip-fill-eo-unbounded.mask.argb32.ref.png | Bin 0 -> 3769 bytes + .../clip-fill-eo-unbounded.mask.rgb24.ref.png | Bin 0 -> 3211 bytes + test/reference/clip-fill-no-op.mask.argb32.ref.png | Bin 0 -> 152 bytes + test/reference/clip-fill-no-op.mask.rgb24.ref.png | Bin 0 -> 152 bytes + .../clip-fill-nz-unbounded.mask.argb32.ref.png | Bin 0 -> 3764 bytes + .../clip-fill-nz-unbounded.mask.rgb24.ref.png | Bin 0 -> 3215 bytes + .../clip-fill-rule-pixel-aligned.mask.argb32.ref.png | Bin 0 -> 176 bytes + .../clip-fill-rule-pixel-aligned.mask.rgb24.ref.png | Bin 0 -> 165 bytes + test/reference/clip-fill-rule.mask.argb32.ref.png | Bin 0 -> 437 bytes + test/reference/clip-fill-rule.mask.rgb24.ref.png | Bin 0 -> 393 bytes + test/reference/clip-fill.mask.argb32.ref.png | Bin 0 -> 1039 bytes + test/reference/clip-fill.mask.rgb24.ref.png | Bin 0 -> 1039 bytes + ...group-shapes-aligned-rectangles.mask.argb32.ref.png | Bin 0 -> 378 bytes + ...-group-shapes-aligned-rectangles.mask.rgb24.ref.png | Bin 0 -> 378 bytes + .../clip-group-shapes-circles.mask.argb32.ref.png | Bin 0 -> 1511 bytes + .../clip-group-shapes-circles.mask.rgb24.ref.png | Bin 0 -> 1511 bytes + ...oup-shapes-unaligned-rectangles.mask.argb32.ref.png | Bin 0 -> 431 bytes + ...roup-shapes-unaligned-rectangles.mask.rgb24.ref.png | Bin 0 -> 431 bytes + test/reference/clip-image.mask.argb32.ref.png | Bin 0 -> 2678 bytes + test/reference/clip-image.mask.rgb24.ref.png | Bin 0 -> 2678 bytes + test/reference/clip-intersect.mask.argb32.ref.png | Bin 0 -> 200 bytes + test/reference/clip-intersect.mask.rgb24.ref.png | Bin 0 -> 200 bytes + .../reference/clip-mixed-antialias.mask.argb32.ref.png | Bin 0 -> 1084 bytes + test/reference/clip-mixed-antialias.mask.rgb24.ref.png | Bin 0 -> 1084 bytes + test/reference/clip-nesting.mask.argb32.ref.png | Bin 0 -> 1044 bytes + test/reference/clip-nesting.mask.rgb24.ref.png | Bin 0 -> 937 bytes + test/reference/clip-operator.mask.argb32.ref.png | Bin 0 -> 8680 bytes + test/reference/clip-operator.mask.rgb24.ref.png | Bin 0 -> 3519 bytes + test/reference/clip-polygons.base.argb32.ref.png | Bin 0 -> 1296 bytes + test/reference/clip-polygons.base.rgb24.ref.png | Bin 0 -> 1296 bytes + test/reference/clip-polygons.mask.argb32.ref.png | Bin 0 -> 1336 bytes + test/reference/clip-polygons.mask.rgb24.ref.png | Bin 0 -> 1336 bytes + test/reference/clip-polygons.traps.argb32.ref.png | Bin 0 -> 1336 bytes + test/reference/clip-polygons.traps.rgb24.ref.png | Bin 0 -> 1336 bytes + test/reference/clip-push-group.mask.argb32.ref.png | Bin 0 -> 164 bytes + test/reference/clip-push-group.mask.rgb24.ref.png | Bin 0 -> 164 bytes + test/reference/clip-rectilinear.base.argb32.ref.png | Bin 0 -> 440 bytes + test/reference/clip-rectilinear.base.rgb24.ref.png | Bin 0 -> 440 bytes + test/reference/clip-rectilinear.mask.argb32.ref.png | Bin 0 -> 440 bytes + test/reference/clip-rectilinear.mask.rgb24.ref.png | Bin 0 -> 440 bytes + test/reference/clip-rectilinear.traps.argb32.ref.png | Bin 0 -> 440 bytes + test/reference/clip-rectilinear.traps.rgb24.ref.png | Bin 0 -> 440 bytes + ...clip-rotate-image-surface-paint.mask.argb32.ref.png | Bin 0 -> 202 bytes + .../clip-rotate-image-surface-paint.mask.rgb24.ref.png | Bin 0 -> 202 bytes + test/reference/clip-shape.mask.argb32.ref.png | Bin 0 -> 3094 bytes + test/reference/clip-shape.mask.rgb24.ref.png | Bin 0 -> 3094 bytes + test/reference/clip-stroke-no-op.mask.argb32.ref.png | Bin 0 -> 152 bytes + test/reference/clip-stroke-no-op.mask.rgb24.ref.png | Bin 0 -> 152 bytes + .../clip-stroke-unbounded.mask.argb32.ref.png | Bin 0 -> 3991 bytes + .../reference/clip-stroke-unbounded.mask.rgb24.ref.png | Bin 0 -> 3372 bytes + test/reference/clip-stroke.mask.argb32.ref.png | Bin 0 -> 1500 bytes + test/reference/clip-stroke.mask.rgb24.ref.png | Bin 0 -> 1500 bytes + test/reference/clip-text.mask.argb32.ref.png | Bin 0 -> 918 bytes + test/reference/clip-text.mask.rgb24.ref.png | Bin 0 -> 918 bytes + .../reference/clip-twice-rectangle.mask.argb32.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice-rectangle.mask.rgb24.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice.mask.argb32.ref.png | Bin 0 -> 1306 bytes + test/reference/clip-twice.mask.rgb24.ref.png | Bin 0 -> 1215 bytes + test/reference/clip-unbounded.mask.argb32.ref.png | Bin 0 -> 100 bytes + test/reference/clip-unbounded.mask.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/clipped-group.mask.argb32.ref.png | Bin 0 -> 336 bytes + test/reference/clipped-group.mask.rgb24.ref.png | Bin 0 -> 336 bytes + test/reference/clipped-surface.mask.argb32.ref.png | Bin 0 -> 345 bytes + test/reference/clipped-surface.mask.rgb24.ref.png | Bin 0 -> 345 bytes + .../close-path-current-point.mask.argb32.ref.png | Bin 0 -> 2324 bytes + .../close-path-current-point.mask.rgb24.ref.png | Bin 0 -> 2324 bytes + test/reference/close-path.mask.argb32.ref.png | Bin 0 -> 294 bytes + test/reference/close-path.mask.rgb24.ref.png | Bin 0 -> 294 bytes + ...e-integer-translate-over-repeat.mask.argb32.ref.png | Bin 0 -> 334 bytes + ...te-integer-translate-over-repeat.mask.rgb24.ref.png | Bin 0 -> 334 bytes + ...omposite-integer-translate-over.mask.argb32.ref.png | Bin 0 -> 13998 bytes + ...composite-integer-translate-over.mask.rgb24.ref.png | Bin 0 -> 13998 bytes + ...posite-integer-translate-source.mask.argb32.ref.png | Bin 0 -> 13998 bytes + ...mposite-integer-translate-source.mask.rgb24.ref.png | Bin 0 -> 13998 bytes + test/reference/copy-disjoint.base.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-disjoint.base.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-disjoint.mask.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-disjoint.mask.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-disjoint.traps.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-disjoint.traps.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-path.mask.argb32.ref.png | Bin 0 -> 616 bytes + test/reference/copy-path.mask.rgb24.ref.png | Bin 0 -> 616 bytes + .../create-from-png-stream.mask.argb32.ref.png | Bin 0 -> 96 bytes + .../create-from-png-stream.mask.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.mask.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.mask.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.traps.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.traps.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/culled-glyphs.mask.argb32.ref.png | Bin 0 -> 440 bytes + test/reference/culled-glyphs.mask.rgb24.ref.png | Bin 0 -> 440 bytes + test/reference/curve-to-as-line-to.mask.argb32.ref.png | Bin 0 -> 109 bytes + test/reference/curve-to-as-line-to.mask.rgb24.ref.png | Bin 0 -> 109 bytes + test/reference/dash-caps-joins.mask.argb32.ref.png | Bin 0 -> 5157 bytes + test/reference/dash-caps-joins.mask.rgb24.ref.png | Bin 0 -> 5157 bytes + test/reference/dash-curve.mask.argb32.ref.png | Bin 0 -> 41040 bytes + test/reference/dash-curve.mask.rgb24.ref.png | Bin 0 -> 41040 bytes + test/reference/dash-infinite-loop.mask.argb32.ref.png | Bin 0 -> 877 bytes + test/reference/dash-infinite-loop.mask.rgb24.ref.png | Bin 0 -> 877 bytes + test/reference/dash-no-dash.mask.argb32.ref.png | Bin 0 -> 119 bytes + test/reference/dash-no-dash.mask.rgb24.ref.png | Bin 0 -> 119 bytes + .../reference/dash-offset-negative.mask.argb32.ref.png | Bin 0 -> 129 bytes + test/reference/dash-offset-negative.mask.rgb24.ref.png | Bin 0 -> 129 bytes + test/reference/dash-offset.mask.argb32.ref.png | Bin 0 -> 794 bytes + test/reference/dash-offset.mask.rgb24.ref.png | Bin 0 -> 794 bytes + test/reference/dash-scale.mask.argb32.ref.png | Bin 0 -> 8913 bytes + test/reference/dash-scale.mask.rgb24.ref.png | Bin 0 -> 8913 bytes + test/reference/dash-state.mask.argb32.ref.png | Bin 0 -> 8027 bytes + test/reference/dash-state.mask.rgb24.ref.png | Bin 0 -> 8027 bytes + test/reference/dash-zero-length.mask.argb32.ref.png | Bin 0 -> 230 bytes + test/reference/dash-zero-length.mask.rgb24.ref.png | Bin 0 -> 210 bytes + test/reference/degenerate-arc.mask.argb32.ref.png | Bin 0 -> 653 bytes + test/reference/degenerate-arc.mask.rgb24.ref.png | Bin 0 -> 653 bytes + test/reference/degenerate-arcs.mask.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-arcs.mask.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-curve-to.mask.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/degenerate-curve-to.mask.rgb24.ref.png | Bin 0 -> 280 bytes + test/reference/degenerate-dash.mask.argb32.ref.png | Bin 0 -> 2086 bytes + test/reference/degenerate-dash.mask.rgb24.ref.png | Bin 0 -> 2086 bytes + .../degenerate-linear-gradient.mask.argb32.ref.png | Bin 0 -> 336 bytes + .../degenerate-linear-gradient.mask.rgb24.ref.png | Bin 0 -> 336 bytes + test/reference/degenerate-path.mask.argb32.ref.png | Bin 0 -> 250 bytes + test/reference/degenerate-path.mask.rgb24.ref.png | Bin 0 -> 219 bytes + test/reference/degenerate-pen.mask.argb32.ref.png | Bin 0 -> 1019 bytes + test/reference/degenerate-pen.mask.rgb24.ref.png | Bin 0 -> 1019 bytes + .../degenerate-radial-gradient.mask.argb32.ref.png | Bin 0 -> 428 bytes + .../degenerate-radial-gradient.mask.rgb24.ref.png | Bin 0 -> 428 bytes + .../degenerate-rel-curve-to.mask.argb32.ref.png | Bin 0 -> 277 bytes + .../degenerate-rel-curve-to.mask.rgb24.ref.png | Bin 0 -> 277 bytes + .../device-offset-fractional.mask.argb32.ref.png | Bin 0 -> 266 bytes + .../device-offset-fractional.mask.rgb24.ref.png | Bin 0 -> 266 bytes + .../device-offset-positive.mask.argb32.ref.png | Bin 0 -> 120 bytes + .../device-offset-positive.mask.rgb24.ref.png | Bin 0 -> 111 bytes + test/reference/device-offset-scale.mask.argb32.ref.png | Bin 0 -> 109 bytes + test/reference/device-offset-scale.mask.rgb24.ref.png | Bin 0 -> 109 bytes + test/reference/device-offset.mask.argb32.ref.png | Bin 0 -> 118 bytes + test/reference/device-offset.mask.rgb24.ref.png | Bin 0 -> 111 bytes + test/reference/drunkard-tails.mask.argb32.ref.png | Bin 0 -> 6116 bytes + test/reference/drunkard-tails.mask.rgb24.ref.png | Bin 0 -> 6116 bytes + test/reference/extend-pad-border.mask.argb32.ref.png | Bin 0 -> 495 bytes + test/reference/extend-pad-border.mask.rgb24.ref.png | Bin 0 -> 495 bytes + test/reference/extend-pad-similar.mask.argb32.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad-similar.mask.rgb24.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.mask.argb32.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.mask.rgb24.ref.png | Bin 0 -> 279 bytes + .../extend-reflect-similar.mask.argb32.ref.png | Bin 0 -> 133406 bytes + .../extend-reflect-similar.mask.rgb24.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.mask.argb32.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.mask.rgb24.ref.png | Bin 0 -> 133406 bytes + .../extend-repeat-similar.mask.argb32.ref.png | Bin 0 -> 108603 bytes + .../reference/extend-repeat-similar.mask.rgb24.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.mask.argb32.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.mask.rgb24.ref.png | Bin 0 -> 108603 bytes + .../extended-blend-alpha-mask.mask.argb32.ref.png | Bin 0 -> 9221 bytes + .../extended-blend-alpha-mask.mask.rgb24.ref.png | Bin 0 -> 4597 bytes + .../reference/extended-blend-alpha.mask.argb32.ref.png | Bin 0 -> 9406 bytes + test/reference/extended-blend-alpha.mask.rgb24.ref.png | Bin 0 -> 5740 bytes + test/reference/extended-blend-mask.mask.argb32.ref.png | Bin 0 -> 3971 bytes + test/reference/extended-blend-mask.mask.rgb24.ref.png | Bin 0 -> 3643 bytes + .../extended-blend-solid-alpha.mask.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-solid-alpha.mask.rgb24.ref.png | Bin 0 -> 5740 bytes + .../reference/extended-blend-solid.mask.argb32.ref.png | Bin 0 -> 4063 bytes + test/reference/extended-blend-solid.mask.rgb24.ref.png | Bin 0 -> 3775 bytes + test/reference/extended-blend.mask.argb32.ref.png | Bin 0 -> 4063 bytes + test/reference/extended-blend.mask.rgb24.ref.png | Bin 0 -> 3775 bytes + test/reference/fallback.base.argb32.ref.png | Bin 0 -> 4156 bytes + test/reference/fallback.base.rgb24.ref.png | Bin 0 -> 3332 bytes + test/reference/fallback.mask.argb32.ref.png | Bin 0 -> 4070 bytes + test/reference/fallback.mask.rgb24.ref.png | Bin 0 -> 3141 bytes + test/reference/fallback.traps.argb32.ref.png | Bin 0 -> 4070 bytes + test/reference/fallback.traps.rgb24.ref.png | Bin 0 -> 3141 bytes + test/reference/fill-alpha-pattern.mask.argb32.ref.png | Bin 0 -> 3381 bytes + test/reference/fill-alpha-pattern.mask.rgb24.ref.png | Bin 0 -> 3381 bytes + test/reference/fill-alpha.mask.argb32.ref.png | Bin 0 -> 2736 bytes + test/reference/fill-alpha.mask.rgb24.ref.png | Bin 0 -> 2736 bytes + .../fill-and-stroke-alpha-add.mask.argb32.ref.png | Bin 0 -> 556 bytes + .../fill-and-stroke-alpha-add.mask.rgb24.ref.png | Bin 0 -> 556 bytes + .../fill-and-stroke-alpha.mask.argb32.ref.png | Bin 0 -> 508 bytes + .../reference/fill-and-stroke-alpha.mask.rgb24.ref.png | Bin 0 -> 508 bytes + test/reference/fill-and-stroke.mask.argb32.ref.png | Bin 0 -> 312 bytes + test/reference/fill-and-stroke.mask.rgb24.ref.png | Bin 0 -> 283 bytes + .../fill-degenerate-sort-order.mask.argb32.ref.png | Bin 0 -> 2400 bytes + .../fill-degenerate-sort-order.mask.rgb24.ref.png | Bin 0 -> 2049 bytes + test/reference/fill-disjoint.base.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.base.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.mask.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.mask.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.traps.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.traps.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-empty.mask.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/fill-empty.mask.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/fill-image.mask.argb32.ref.png | Bin 0 -> 1315 bytes + test/reference/fill-image.mask.rgb24.ref.png | Bin 0 -> 1315 bytes + test/reference/fill-missed-stop.mask.argb32.ref.png | Bin 0 -> 455 bytes + test/reference/fill-missed-stop.mask.rgb24.ref.png | Bin 0 -> 382 bytes + test/reference/fill-rule.mask.argb32.ref.png | Bin 0 -> 2065 bytes + test/reference/fill-rule.mask.rgb24.ref.png | Bin 0 -> 1803 bytes + .../filter-bilinear-extents.mask.argb32.ref.png | Bin 0 -> 1210 bytes + .../filter-bilinear-extents.mask.rgb24.ref.png | Bin 0 -> 1210 bytes + .../filter-nearest-offset.mask.argb32.ref.png | Bin 0 -> 201 bytes + .../reference/filter-nearest-offset.mask.rgb24.ref.png | Bin 0 -> 201 bytes + .../filter-nearest-transformed.mask.argb32.ref.png | Bin 0 -> 514 bytes + .../filter-nearest-transformed.mask.rgb24.ref.png | Bin 0 -> 514 bytes + .../finer-grained-fallbacks.mask.argb32.ref.png | Bin 0 -> 1167 bytes + .../finer-grained-fallbacks.mask.rgb24.ref.png | Bin 0 -> 891 bytes + .../font-matrix-translation.mask.argb32.ref.png | Bin 0 -> 865 bytes + .../font-matrix-translation.mask.rgb24.ref.png | Bin 0 -> 865 bytes + .../font-matrix-translation.traps.argb32.ref.png | Bin 0 -> 865 bytes + .../font-matrix-translation.traps.rgb24.ref.png | Bin 0 -> 865 bytes + .../ft-show-glyphs-positioning.mask.argb32.ref.png | Bin 0 -> 3243 bytes + .../ft-show-glyphs-positioning.mask.rgb24.ref.png | Bin 0 -> 3243 bytes + .../ft-show-glyphs-positioning.traps.argb32.ref.png | Bin 0 -> 3243 bytes + .../ft-show-glyphs-positioning.traps.rgb24.ref.png | Bin 0 -> 3243 bytes + .../reference/ft-show-glyphs-table.mask.argb32.ref.png | Bin 0 -> 9975 bytes + test/reference/ft-show-glyphs-table.mask.rgb24.ref.png | Bin 0 -> 9975 bytes + .../ft-show-glyphs-table.traps.argb32.ref.png | Bin 0 -> 9975 bytes + .../reference/ft-show-glyphs-table.traps.rgb24.ref.png | Bin 0 -> 9975 bytes + .../ft-text-antialias-none.mask.argb32.ref.png | Bin 0 -> 295 bytes + .../ft-text-antialias-none.mask.rgb24.ref.png | Bin 0 -> 295 bytes + .../ft-text-vertical-layout-type1.mask.argb32.ref.png | Bin 0 -> 3062 bytes + .../ft-text-vertical-layout-type1.mask.rgb24.ref.png | Bin 0 -> 3062 bytes + .../ft-text-vertical-layout-type3.mask.argb32.ref.png | Bin 0 -> 3610 bytes + .../ft-text-vertical-layout-type3.mask.rgb24.ref.png | Bin 0 -> 3610 bytes + test/reference/get-group-target.mask.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/get-group-target.mask.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/gl-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/gl-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/gl-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/gl-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/gl-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/gl-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + .../reference/glyph-cache-pressure.mask.argb32.ref.png | Bin 0 -> 2858 bytes + test/reference/glyph-cache-pressure.mask.rgb24.ref.png | Bin 0 -> 2858 bytes + .../glyph-cache-pressure.traps.argb32.ref.png | Bin 0 -> 2858 bytes + .../reference/glyph-cache-pressure.traps.rgb24.ref.png | Bin 0 -> 2858 bytes + test/reference/gradient-alpha.mask.argb32.ref.png | Bin 0 -> 125 bytes + test/reference/gradient-alpha.mask.rgb24.ref.png | Bin 0 -> 119 bytes + .../gradient-constant-alpha.mask.argb32.ref.png | Bin 0 -> 111 bytes + .../gradient-constant-alpha.mask.rgb24.ref.png | Bin 0 -> 106 bytes + .../gradient-zero-stops-mask.mask.argb32.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops-mask.mask.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/gradient-zero-stops.mask.argb32.ref.png | Bin 0 -> 86 bytes + test/reference/gradient-zero-stops.mask.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/group-clip.mask.argb32.ref.png | Bin 0 -> 191 bytes + test/reference/group-clip.mask.rgb24.ref.png | Bin 0 -> 191 bytes + test/reference/group-paint.mask.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/group-paint.mask.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/group-unaligned.mask.argb32.ref.png | Bin 0 -> 427 bytes + test/reference/group-unaligned.mask.rgb24.ref.png | Bin 0 -> 427 bytes + test/reference/halo-transform.mask.argb32.ref.png | Bin 0 -> 15063 bytes + test/reference/halo-transform.mask.rgb24.ref.png | Bin 0 -> 15063 bytes + test/reference/halo-transform.traps.argb32.ref.png | Bin 0 -> 15063 bytes + test/reference/halo-transform.traps.rgb24.ref.png | Bin 0 -> 15063 bytes + test/reference/halo.mask.argb32.ref.png | Bin 0 -> 8726 bytes + test/reference/halo.mask.rgb24.ref.png | Bin 0 -> 8726 bytes + test/reference/halo.traps.argb32.ref.png | Bin 0 -> 8726 bytes + test/reference/halo.traps.rgb24.ref.png | Bin 0 -> 8726 bytes + test/reference/hatchings.mask.argb32.ref.png | Bin 0 -> 94631 bytes + test/reference/hatchings.mask.rgb24.ref.png | Bin 0 -> 94631 bytes + test/reference/horizontal-clip.mask.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/horizontal-clip.mask.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/huge-linear.mask.argb32.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-linear.mask.rgb24.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-radial.mask.argb32.ref.png | Bin 0 -> 41702 bytes + test/reference/huge-radial.mask.rgb24.ref.png | Bin 0 -> 41702 bytes + .../image-bug-710072-aligned.mask.argb32.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-aligned.mask.rgb24.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-unaligned.mask.argb32.ref.png | Bin 0 -> 212 bytes + .../image-bug-710072-unaligned.mask.rgb24.ref.png | Bin 0 -> 212 bytes + .../reference/image-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/image-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/implicit-close.mask.argb32.ref.png | Bin 0 -> 251 bytes + test/reference/implicit-close.mask.rgb24.ref.png | Bin 0 -> 251 bytes + test/reference/infinite-join.mask.argb32.ref.png | Bin 0 -> 164 bytes + test/reference/infinite-join.mask.rgb24.ref.png | Bin 0 -> 164 bytes + test/reference/inverse-text.base.argb32.ref.png | Bin 0 -> 2162 bytes + test/reference/inverse-text.base.rgb24.ref.png | Bin 0 -> 2162 bytes + test/reference/inverse-text.mask.argb32.ref.png | Bin 0 -> 2162 bytes + test/reference/inverse-text.mask.rgb24.ref.png | Bin 0 -> 2162 bytes + test/reference/inverse-text.traps.argb32.ref.png | Bin 0 -> 2162 bytes + test/reference/inverse-text.traps.rgb24.ref.png | Bin 0 -> 2162 bytes + test/reference/joins-loop.mask.argb32.ref.png | Bin 0 -> 4492 bytes + test/reference/joins-loop.mask.rgb24.ref.png | Bin 0 -> 4492 bytes + test/reference/joins-retrace.mask.argb32.ref.png | Bin 0 -> 4997 bytes + test/reference/joins-retrace.mask.rgb24.ref.png | Bin 0 -> 4997 bytes + test/reference/joins-star.mask.argb32.ref.png | Bin 0 -> 4914 bytes + test/reference/joins-star.mask.rgb24.ref.png | Bin 0 -> 4914 bytes + test/reference/joins.mask.argb32.ref.png | Bin 0 -> 6970 bytes + test/reference/joins.mask.rgb24.ref.png | Bin 0 -> 6970 bytes + test/reference/large-clip.mask.argb32.ref.png | Bin 0 -> 305 bytes + test/reference/large-clip.mask.rgb24.ref.png | Bin 0 -> 305 bytes + test/reference/large-font.mask.argb32.ref.png | Bin 0 -> 6117 bytes + test/reference/large-font.mask.rgb24.ref.png | Bin 0 -> 6117 bytes + test/reference/large-source-roi.mask.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/large-source-roi.mask.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/large-source.mask.argb32.ref.png | Bin 0 -> 112 bytes + test/reference/large-source.mask.rgb24.ref.png | Bin 0 -> 112 bytes + .../large-twin-antialias-mixed.mask.argb32.ref.png | Bin 0 -> 16660 bytes + .../large-twin-antialias-mixed.mask.rgb24.ref.png | Bin 0 -> 16660 bytes + test/reference/leaky-dash.mask.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/leaky-dash.mask.rgb24.ref.png | Bin 0 -> 197 bytes + .../leaky-dashed-rectangle.mask.argb32.ref.png | Bin 0 -> 357 bytes + .../leaky-dashed-rectangle.mask.rgb24.ref.png | Bin 0 -> 357 bytes + test/reference/leaky-dashed-stroke.mask.argb32.ref.png | Bin 0 -> 9387 bytes + test/reference/leaky-dashed-stroke.mask.rgb24.ref.png | Bin 0 -> 9387 bytes + test/reference/leaky-polygon.mask.argb32.ref.png | Bin 0 -> 337 bytes + test/reference/leaky-polygon.mask.rgb24.ref.png | Bin 0 -> 337 bytes + ...line-width-large-overlap-dashed.base.argb32.ref.png | Bin 0 -> 338 bytes + .../line-width-large-overlap-dashed.base.rgb24.ref.png | Bin 0 -> 338 bytes + ...line-width-large-overlap-dashed.mask.argb32.ref.png | Bin 0 -> 343 bytes + .../line-width-large-overlap-dashed.mask.rgb24.ref.png | Bin 0 -> 343 bytes + ...ine-width-large-overlap-dashed.traps.argb32.ref.png | Bin 0 -> 343 bytes + ...line-width-large-overlap-dashed.traps.rgb24.ref.png | Bin 0 -> 343 bytes + ...ine-width-large-overlap-flipped.base.argb32.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-flipped.base.rgb24.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-flipped.mask.argb32.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-flipped.mask.rgb24.ref.png | Bin 0 -> 305 bytes + ...ne-width-large-overlap-flipped.traps.argb32.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-flipped.traps.rgb24.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-flopped.base.argb32.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-flopped.base.rgb24.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-flopped.mask.argb32.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-flopped.mask.rgb24.ref.png | Bin 0 -> 305 bytes + ...ne-width-large-overlap-flopped.traps.argb32.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-flopped.traps.rgb24.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-offset.base.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-offset.base.rgb24.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-offset.mask.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-offset.mask.rgb24.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-offset.traps.argb32.ref.png | Bin 0 -> 305 bytes + ...line-width-large-overlap-offset.traps.rgb24.ref.png | Bin 0 -> 305 bytes + ...ine-width-large-overlap-rotated.base.argb32.ref.png | Bin 0 -> 404 bytes + ...line-width-large-overlap-rotated.base.rgb24.ref.png | Bin 0 -> 404 bytes + ...ine-width-large-overlap-rotated.mask.argb32.ref.png | Bin 0 -> 427 bytes + ...line-width-large-overlap-rotated.mask.rgb24.ref.png | Bin 0 -> 427 bytes + ...ne-width-large-overlap-rotated.traps.argb32.ref.png | Bin 0 -> 427 bytes + ...ine-width-large-overlap-rotated.traps.rgb24.ref.png | Bin 0 -> 427 bytes + .../line-width-large-overlap.base.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap.base.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap.mask.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap.mask.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap.traps.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap.traps.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-overlap-dashed.mask.argb32.ref.png | Bin 0 -> 401 bytes + .../line-width-overlap-dashed.mask.rgb24.ref.png | Bin 0 -> 401 bytes + .../line-width-overlap-flipped.mask.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flipped.mask.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.mask.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.mask.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-offset.mask.argb32.ref.png | Bin 0 -> 348 bytes + .../line-width-overlap-offset.mask.rgb24.ref.png | Bin 0 -> 348 bytes + .../line-width-overlap-offset.traps.argb32.ref.png | Bin 0 -> 365 bytes + .../line-width-overlap-offset.traps.rgb24.ref.png | Bin 0 -> 365 bytes + .../line-width-overlap-rotated.mask.argb32.ref.png | Bin 0 -> 828 bytes + .../line-width-overlap-rotated.mask.rgb24.ref.png | Bin 0 -> 828 bytes + test/reference/line-width-overlap.mask.argb32.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-overlap.mask.rgb24.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-scale.mask.argb32.ref.png | Bin 0 -> 5721 bytes + test/reference/line-width-scale.mask.rgb24.ref.png | Bin 0 -> 5721 bytes + .../reference/line-width-tolerance.mask.argb32.ref.png | Bin 0 -> 168 bytes + test/reference/line-width-tolerance.mask.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/line-width.mask.argb32.ref.png | Bin 0 -> 178 bytes + test/reference/line-width.mask.rgb24.ref.png | Bin 0 -> 178 bytes + .../linear-gradient-extend.mask.argb32.ref.png | Bin 0 -> 371 bytes + .../linear-gradient-extend.mask.rgb24.ref.png | Bin 0 -> 371 bytes + .../linear-gradient-large.mask.argb32.ref.png | Bin 0 -> 4076 bytes + .../reference/linear-gradient-large.mask.rgb24.ref.png | Bin 0 -> 4076 bytes + .../linear-gradient-one-stop.mask.argb32.ref.png | Bin 0 -> 225 bytes + .../linear-gradient-one-stop.mask.rgb24.ref.png | Bin 0 -> 174 bytes + .../linear-gradient-reflect.mask.argb32.ref.png | Bin 0 -> 185 bytes + .../linear-gradient-reflect.mask.rgb24.ref.png | Bin 0 -> 185 bytes + .../linear-gradient-subset.mask.argb32.ref.png | Bin 0 -> 820 bytes + .../linear-gradient-subset.mask.rgb24.ref.png | Bin 0 -> 820 bytes + test/reference/linear-gradient.mask.argb32.ref.png | Bin 0 -> 974 bytes + test/reference/linear-gradient.mask.rgb24.ref.png | Bin 0 -> 974 bytes + .../reference/linear-step-function.mask.argb32.ref.png | Bin 0 -> 118 bytes + test/reference/linear-step-function.mask.rgb24.ref.png | Bin 0 -> 118 bytes + test/reference/linear-uniform.mask.argb32.ref.png | Bin 0 -> 128 bytes + test/reference/linear-uniform.mask.rgb24.ref.png | Bin 0 -> 128 bytes + test/reference/long-dashed-lines.mask.argb32.ref.png | Bin 0 -> 2548 bytes + test/reference/long-dashed-lines.mask.rgb24.ref.png | Bin 0 -> 2548 bytes + test/reference/long-lines.mask.argb32.ref.png | Bin 0 -> 201 bytes + test/reference/long-lines.mask.rgb24.ref.png | Bin 0 -> 201 bytes + test/reference/map-all-to-image.mask.argb32.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-image.mask.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/map-bit-to-image.mask.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-image.mask.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.mask.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.mask.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/mask-alpha.mask.argb32.ref.png | Bin 0 -> 632 bytes + test/reference/mask-alpha.mask.rgb24.ref.png | Bin 0 -> 589 bytes + test/reference/mask-ctm.mask.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-ctm.mask.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/mask-surface-ctm.mask.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-surface-ctm.mask.rgb24.ref.png | Bin 0 -> 105 bytes + .../mask-transformed-image.mask.argb32.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-image.mask.rgb24.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-similar.mask.argb32.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-similar.mask.rgb24.ref.png | Bin 0 -> 3812 bytes + test/reference/mask.mask.argb32.ref.png | Bin 0 -> 8565 bytes + test/reference/mask.mask.rgb24.ref.png | Bin 0 -> 7135 bytes + .../mesh-pattern-accuracy.mask.argb32.ref.png | Bin 0 -> 8086 bytes + .../reference/mesh-pattern-accuracy.mask.rgb24.ref.png | Bin 0 -> 8086 bytes + .../reference/mesh-pattern-conical.mask.argb32.ref.png | Bin 0 -> 8655 bytes + test/reference/mesh-pattern-conical.mask.rgb24.ref.png | Bin 0 -> 8655 bytes + .../mesh-pattern-control-points.mask.argb32.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-control-points.mask.rgb24.ref.png | Bin 0 -> 10665 bytes + test/reference/mesh-pattern-fold.mask.argb32.ref.png | Bin 0 -> 52980 bytes + test/reference/mesh-pattern-fold.mask.rgb24.ref.png | Bin 0 -> 52980 bytes + .../reference/mesh-pattern-overlap.mask.argb32.ref.png | Bin 0 -> 9129 bytes + test/reference/mesh-pattern-overlap.mask.rgb24.ref.png | Bin 0 -> 9129 bytes + .../mesh-pattern-transformed.mask.argb32.ref.png | Bin 0 -> 14463 bytes + .../mesh-pattern-transformed.mask.rgb24.ref.png | Bin 0 -> 14463 bytes + test/reference/mesh-pattern.mask.argb32.ref.png | Bin 0 -> 19566 bytes + test/reference/mesh-pattern.mask.rgb24.ref.png | Bin 0 -> 19566 bytes + test/reference/mime-data.mask.argb32.ref.png | Bin 0 -> 185 bytes + test/reference/mime-data.mask.rgb24.ref.png | Bin 0 -> 185 bytes + test/reference/miter-precision.mask.argb32.ref.png | Bin 0 -> 1030 bytes + test/reference/miter-precision.mask.rgb24.ref.png | Bin 0 -> 1030 bytes + .../reference/move-to-show-surface.mask.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/move-to-show-surface.mask.rgb24.ref.png | Bin 0 -> 96 bytes + .../negative-stride-image.base.argb32.ref.png | Bin 0 -> 81121 bytes + .../reference/negative-stride-image.base.rgb24.ref.png | Bin 0 -> 81121 bytes + .../negative-stride-image.mask.argb32.ref.png | Bin 0 -> 81121 bytes + .../reference/negative-stride-image.mask.rgb24.ref.png | Bin 0 -> 81121 bytes + .../negative-stride-image.traps.argb32.ref.png | Bin 0 -> 81121 bytes + .../negative-stride-image.traps.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/new-sub-path.mask.argb32.ref.png | Bin 0 -> 408 bytes + test/reference/new-sub-path.mask.rgb24.ref.png | Bin 0 -> 371 bytes + test/reference/nil-surface.mask.argb32.ref.png | Bin 0 -> 88 bytes + test/reference/nil-surface.mask.rgb24.ref.png | Bin 0 -> 87 bytes + .../reference/operator-alpha-alpha.mask.argb32.ref.png | Bin 0 -> 3441 bytes + test/reference/operator-alpha-alpha.mask.rgb24.ref.png | Bin 0 -> 3441 bytes + test/reference/operator-alpha.mask.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.mask.rgb24.ref.png | Bin 0 -> 205 bytes + test/reference/operator-clear.mask.argb32.ref.png | Bin 0 -> 1071 bytes + test/reference/operator-clear.mask.rgb24.ref.png | Bin 0 -> 947 bytes + test/reference/operator-source.mask.argb32.ref.png | Bin 0 -> 5612 bytes + test/reference/operator-source.mask.rgb24.ref.png | Bin 0 -> 3975 bytes + test/reference/operator.mask.argb32.ref.png | Bin 0 -> 238 bytes + test/reference/operator.mask.rgb24.ref.png | Bin 0 -> 189 bytes + test/reference/over-above-source.mask.argb32.ref.png | Bin 0 -> 564 bytes + test/reference/over-above-source.mask.rgb24.ref.png | Bin 0 -> 465 bytes + test/reference/over-around-source.mask.argb32.ref.png | Bin 0 -> 633 bytes + test/reference/over-around-source.mask.rgb24.ref.png | Bin 0 -> 499 bytes + test/reference/over-below-source.mask.argb32.ref.png | Bin 0 -> 447 bytes + test/reference/over-below-source.mask.rgb24.ref.png | Bin 0 -> 385 bytes + test/reference/over-between-source.mask.argb32.ref.png | Bin 0 -> 596 bytes + test/reference/over-between-source.mask.rgb24.ref.png | Bin 0 -> 463 bytes + test/reference/overlapping-boxes.mask.argb32.ref.png | Bin 0 -> 179 bytes + test/reference/overlapping-boxes.mask.rgb24.ref.png | Bin 0 -> 170 bytes + .../overlapping-dash-caps.mask.argb32.ref.png | Bin 0 -> 3986 bytes + .../reference/overlapping-dash-caps.mask.rgb24.ref.png | Bin 0 -> 3986 bytes + test/reference/overlapping-glyphs.mask.argb32.ref.png | Bin 0 -> 2717 bytes + test/reference/overlapping-glyphs.mask.rgb24.ref.png | Bin 0 -> 1663 bytes + test/reference/paint-clip-fill-aa.mask.argb32.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-aa.mask.rgb24.ref.png | Bin 0 -> 327 bytes + .../reference/paint-clip-fill-mono.mask.argb32.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-mono.mask.rgb24.ref.png | Bin 0 -> 327 bytes + test/reference/paint-repeat.mask.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/paint-repeat.mask.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/paint-source-alpha.mask.argb32.ref.png | Bin 0 -> 224 bytes + test/reference/paint-source-alpha.mask.rgb24.ref.png | Bin 0 -> 224 bytes + .../paint-with-alpha-clip-mask.mask.argb32.ref.png | Bin 0 -> 330 bytes + .../paint-with-alpha-clip-mask.mask.rgb24.ref.png | Bin 0 -> 330 bytes + .../paint-with-alpha-clip.mask.argb32.ref.png | Bin 0 -> 269 bytes + .../reference/paint-with-alpha-clip.mask.rgb24.ref.png | Bin 0 -> 269 bytes + .../paint-with-alpha-solid-clip.mask.argb32.ref.png | Bin 0 -> 266 bytes + .../paint-with-alpha-solid-clip.mask.rgb24.ref.png | Bin 0 -> 266 bytes + test/reference/paint-with-alpha.mask.argb32.ref.png | Bin 0 -> 224 bytes + test/reference/paint-with-alpha.mask.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/paint.mask.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/paint.mask.rgb24.ref.png | Bin 0 -> 93 bytes + .../partial-clip-text-bottom.mask.argb32.ref.png | Bin 0 -> 261 bytes + .../partial-clip-text-bottom.mask.rgb24.ref.png | Bin 0 -> 261 bytes + .../partial-clip-text-left.mask.argb32.ref.png | Bin 0 -> 301 bytes + .../partial-clip-text-left.mask.rgb24.ref.png | Bin 0 -> 301 bytes + .../partial-clip-text-right.mask.argb32.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-right.mask.rgb24.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-right.traps.argb32.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-right.traps.rgb24.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-top.mask.argb32.ref.png | Bin 0 -> 181 bytes + .../reference/partial-clip-text-top.mask.rgb24.ref.png | Bin 0 -> 181 bytes + .../partial-clip-text-top.traps.argb32.ref.png | Bin 0 -> 181 bytes + .../partial-clip-text-top.traps.rgb24.ref.png | Bin 0 -> 181 bytes + ...partial-coverage-half-reference.mask.argb32.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-half-reference.mask.rgb24.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-reference.mask.argb32.ref.png | Bin 0 -> 202 bytes + .../partial-coverage-reference.mask.rgb24.ref.png | Bin 0 -> 202 bytes + ...overage-three-quarter-reference.mask.argb32.ref.png | Bin 0 -> 186 bytes + ...coverage-three-quarter-reference.mask.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/pass-through.base.argb32.ref.png | Bin 0 -> 221 bytes + test/reference/pass-through.base.rgb24.ref.png | Bin 0 -> 158 bytes + test/reference/pass-through.mask.argb32.ref.png | Bin 0 -> 221 bytes + test/reference/pass-through.mask.rgb24.ref.png | Bin 0 -> 158 bytes + test/reference/pass-through.traps.argb32.ref.png | Bin 0 -> 221 bytes + test/reference/pass-through.traps.rgb24.ref.png | Bin 0 -> 158 bytes + test/reference/path-append.mask.argb32.ref.png | Bin 0 -> 6144 bytes + test/reference/path-append.mask.rgb24.ref.png | Bin 0 -> 6144 bytes + test/reference/path-stroke-twice.mask.argb32.ref.png | Bin 0 -> 240 bytes + test/reference/path-stroke-twice.mask.rgb24.ref.png | Bin 0 -> 240 bytes + test/reference/pattern-getters.mask.argb32.ref.png | Bin 0 -> 87 bytes + test/reference/pattern-getters.mask.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/pdf-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/pdf-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/pixman-rotate.mask.argb32.ref.png | Bin 0 -> 260 bytes + test/reference/pixman-rotate.mask.rgb24.ref.png | Bin 0 -> 225 bytes + test/reference/ps-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/ps-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/pthread-same-source.mask.argb32.ref.png | Bin 0 -> 1000 bytes + test/reference/pthread-same-source.mask.rgb24.ref.png | Bin 0 -> 1000 bytes + test/reference/pthread-show-text.mask.argb32.ref.png | Bin 0 -> 30199 bytes + test/reference/pthread-show-text.mask.rgb24.ref.png | Bin 0 -> 30199 bytes + test/reference/pthread-show-text.traps.argb32.ref.png | Bin 0 -> 30199 bytes + test/reference/pthread-show-text.traps.rgb24.ref.png | Bin 0 -> 30199 bytes + test/reference/pthread-similar.mask.argb32.ref.png | Bin 0 -> 170 bytes + test/reference/pthread-similar.mask.rgb24.ref.png | Bin 0 -> 170 bytes + test/reference/push-group-color.mask.argb32.ref.png | Bin 0 -> 2892 bytes + test/reference/push-group-color.mask.rgb24.ref.png | Bin 0 -> 2892 bytes + .../push-group-path-offset.mask.argb32.ref.png | Bin 0 -> 186 bytes + .../push-group-path-offset.mask.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/push-group.mask.argb32.ref.png | Bin 0 -> 3062 bytes + test/reference/push-group.mask.rgb24.ref.png | Bin 0 -> 2899 bytes + .../radial-gradient-extend.mask.argb32.ref.png | Bin 0 -> 466 bytes + .../radial-gradient-extend.mask.rgb24.ref.png | Bin 0 -> 466 bytes + .../radial-gradient-mask-source.mask.argb32.ref.png | Bin 0 -> 145713 bytes + .../radial-gradient-mask-source.mask.rgb24.ref.png | Bin 0 -> 150945 bytes + .../reference/radial-gradient-mask.mask.argb32.ref.png | Bin 0 -> 286065 bytes + test/reference/radial-gradient-mask.mask.rgb24.ref.png | Bin 0 -> 286065 bytes + .../radial-gradient-one-stop.mask.argb32.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-one-stop.mask.rgb24.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-source.mask.argb32.ref.png | Bin 0 -> 408848 bytes + .../radial-gradient-source.mask.rgb24.ref.png | Bin 0 -> 263908 bytes + test/reference/radial-gradient.mask.argb32.ref.png | Bin 0 -> 382283 bytes + test/reference/radial-gradient.mask.rgb24.ref.png | Bin 0 -> 382283 bytes + test/reference/radial-outer-focus.base.argb32.ref.png | Bin 0 -> 38310 bytes + test/reference/radial-outer-focus.base.rgb24.ref.png | Bin 0 -> 38310 bytes + test/reference/radial-outer-focus.mask.argb32.ref.png | Bin 0 -> 38310 bytes + test/reference/radial-outer-focus.mask.rgb24.ref.png | Bin 0 -> 38310 bytes + test/reference/radial-outer-focus.traps.argb32.ref.png | Bin 0 -> 38310 bytes + test/reference/radial-outer-focus.traps.rgb24.ref.png | Bin 0 -> 38310 bytes + test/reference/random-clip.base.argb32.ref.png | Bin 0 -> 521040 bytes + test/reference/random-clip.base.rgb24.ref.png | Bin 0 -> 521040 bytes + test/reference/random-clip.mask.argb32.ref.png | Bin 0 -> 550190 bytes + test/reference/random-clip.mask.rgb24.ref.png | Bin 0 -> 550190 bytes + .../random-intersections-curves-eo.mask.argb32.ref.png | Bin 0 -> 245848 bytes + .../random-intersections-curves-eo.mask.rgb24.ref.png | Bin 0 -> 245848 bytes + .../random-intersections-curves-nz.mask.argb32.ref.png | Bin 0 -> 265249 bytes + .../random-intersections-curves-nz.mask.rgb24.ref.png | Bin 0 -> 265249 bytes + .../random-intersections-eo.mask.argb32.ref.png | Bin 0 -> 136632 bytes + .../random-intersections-eo.mask.rgb24.ref.png | Bin 0 -> 136632 bytes + .../random-intersections-nonzero.mask.argb32.ref.png | Bin 0 -> 142139 bytes + .../random-intersections-nonzero.mask.rgb24.ref.png | Bin 0 -> 142139 bytes + test/reference/raster-source.mask.argb32.ref.png | Bin 0 -> 1209 bytes + test/reference/raster-source.mask.rgb24.ref.png | Bin 0 -> 1209 bytes + .../rectangle-rounding-error.mask.argb32.ref.png | Bin 0 -> 212 bytes + .../rectangle-rounding-error.mask.rgb24.ref.png | Bin 0 -> 212 bytes + test/reference/rectilinear-dash.mask.argb32.ref.png | Bin 0 -> 291 bytes + test/reference/rectilinear-dash.mask.rgb24.ref.png | Bin 0 -> 291 bytes + test/reference/rectilinear-fill.mask.argb32.ref.png | Bin 0 -> 151 bytes + test/reference/rectilinear-fill.mask.rgb24.ref.png | Bin 0 -> 151 bytes + test/reference/rectilinear-grid.mask.argb32.ref.png | Bin 0 -> 569 bytes + test/reference/rectilinear-grid.mask.rgb24.ref.png | Bin 0 -> 569 bytes + .../rectilinear-miter-limit.mask.argb32.ref.png | Bin 0 -> 145 bytes + .../rectilinear-miter-limit.mask.rgb24.ref.png | Bin 0 -> 145 bytes + test/reference/rectilinear-stroke.mask.argb32.ref.png | Bin 0 -> 172 bytes + test/reference/rectilinear-stroke.mask.rgb24.ref.png | Bin 0 -> 172 bytes + test/reference/reflected-stroke.mask.argb32.ref.png | Bin 0 -> 5119 bytes + test/reference/reflected-stroke.mask.rgb24.ref.png | Bin 0 -> 5119 bytes + test/reference/rel-path.mask.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/rel-path.mask.rgb24.ref.png | Bin 0 -> 216 bytes + test/reference/rgb24-ignore-alpha.mask.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/rgb24-ignore-alpha.mask.rgb24.ref.png | Bin 0 -> 97 bytes + ...rotate-clip-image-surface-paint.mask.argb32.ref.png | Bin 0 -> 331 bytes + .../rotate-clip-image-surface-paint.mask.rgb24.ref.png | Bin 0 -> 331 bytes + .../rotate-image-surface-paint.mask.argb32.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.mask.rgb24.ref.png | Bin 0 -> 220 bytes + test/reference/rotated-clip.mask.argb32.ref.png | Bin 0 -> 3697 bytes + test/reference/rotated-clip.mask.rgb24.ref.png | Bin 0 -> 3697 bytes + .../rounded-rectangle-fill.mask.argb32.ref.png | Bin 0 -> 787 bytes + .../rounded-rectangle-fill.mask.rgb24.ref.png | Bin 0 -> 787 bytes + .../rounded-rectangle-stroke.mask.argb32.ref.png | Bin 0 -> 951 bytes + .../rounded-rectangle-stroke.mask.rgb24.ref.png | Bin 0 -> 951 bytes + ...scale-down-source-surface-paint.mask.argb32.ref.png | Bin 0 -> 96 bytes + .../scale-down-source-surface-paint.mask.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/scale-offset-image.mask.argb32.ref.png | Bin 0 -> 9748 bytes + test/reference/scale-offset-image.mask.rgb24.ref.png | Bin 0 -> 9748 bytes + .../reference/scale-offset-similar.mask.argb32.ref.png | Bin 0 -> 9748 bytes + test/reference/scale-offset-similar.mask.rgb24.ref.png | Bin 0 -> 9748 bytes + .../scale-source-surface-paint.mask.argb32.ref.png | Bin 0 -> 128 bytes + .../scale-source-surface-paint.mask.rgb24.ref.png | Bin 0 -> 117 bytes + test/reference/select-font-face.mask.argb32.ref.png | Bin 0 -> 2250 bytes + test/reference/select-font-face.mask.rgb24.ref.png | Bin 0 -> 2250 bytes + test/reference/select-font-face.traps.argb32.ref.png | Bin 0 -> 2250 bytes + test/reference/select-font-face.traps.rgb24.ref.png | Bin 0 -> 2250 bytes + test/reference/self-copy-overlap.mask.argb32.ref.png | Bin 0 -> 1140 bytes + test/reference/self-copy-overlap.mask.rgb24.ref.png | Bin 0 -> 213 bytes + test/reference/self-copy.mask.argb32.ref.png | Bin 0 -> 257 bytes + test/reference/self-copy.mask.rgb24.ref.png | Bin 0 -> 257 bytes + test/reference/self-intersecting.mask.argb32.ref.png | Bin 0 -> 168 bytes + test/reference/self-intersecting.mask.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/set-source.mask.argb32.ref.png | Bin 0 -> 101 bytes + test/reference/set-source.mask.rgb24.ref.png | Bin 0 -> 101 bytes + .../reference/shape-general-convex.mask.argb32.ref.png | Bin 0 -> 2742 bytes + test/reference/shape-general-convex.mask.rgb24.ref.png | Bin 0 -> 2742 bytes + test/reference/shape-sierpinski.mask.argb32.ref.png | Bin 0 -> 63714 bytes + test/reference/shape-sierpinski.mask.rgb24.ref.png | Bin 0 -> 63714 bytes + test/reference/show-glyphs-advance.mask.argb32.ref.png | Bin 0 -> 1394 bytes + test/reference/show-glyphs-advance.mask.rgb24.ref.png | Bin 0 -> 1394 bytes + .../reference/show-glyphs-advance.traps.argb32.ref.png | Bin 0 -> 1394 bytes + test/reference/show-glyphs-advance.traps.rgb24.ref.png | Bin 0 -> 1394 bytes + test/reference/show-glyphs-many.mask.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/show-glyphs-many.mask.rgb24.ref.png | Bin 0 -> 96 bytes + .../show-text-current-point.mask.argb32.ref.png | Bin 0 -> 2151 bytes + .../show-text-current-point.mask.rgb24.ref.png | Bin 0 -> 2151 bytes + .../show-text-current-point.traps.argb32.ref.png | Bin 0 -> 2151 bytes + .../show-text-current-point.traps.rgb24.ref.png | Bin 0 -> 2151 bytes + test/reference/skew-extreme.mask.argb32.ref.png | Bin 0 -> 799 bytes + test/reference/skew-extreme.mask.rgb24.ref.png | Bin 0 -> 799 bytes + test/reference/smask-fill.mask.argb32.ref.png | Bin 0 -> 1197 bytes + test/reference/smask-fill.mask.rgb24.ref.png | Bin 0 -> 1197 bytes + test/reference/smask-image-mask.mask.argb32.ref.png | Bin 0 -> 619 bytes + test/reference/smask-image-mask.mask.rgb24.ref.png | Bin 0 -> 619 bytes + test/reference/smask-mask.mask.argb32.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-mask.mask.rgb24.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-paint.mask.argb32.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-paint.mask.rgb24.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-stroke.mask.argb32.ref.png | Bin 0 -> 1709 bytes + test/reference/smask-stroke.mask.rgb24.ref.png | Bin 0 -> 1709 bytes + test/reference/smask-text.mask.argb32.ref.png | Bin 0 -> 1660 bytes + test/reference/smask-text.mask.rgb24.ref.png | Bin 0 -> 1660 bytes + test/reference/smask-text.traps.argb32.ref.png | Bin 0 -> 1661 bytes + test/reference/smask-text.traps.rgb24.ref.png | Bin 0 -> 1661 bytes + test/reference/smask.mask.argb32.ref.png | Bin 0 -> 3413 bytes + test/reference/smask.mask.rgb24.ref.png | Bin 0 -> 3413 bytes + test/reference/smask.traps.argb32.ref.png | Bin 0 -> 3393 bytes + test/reference/smask.traps.rgb24.ref.png | Bin 0 -> 3393 bytes + .../solid-pattern-cache-stress.mask.argb32.ref.png | Bin 0 -> 87 bytes + .../solid-pattern-cache-stress.mask.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/source-clip-scale.mask.argb32.ref.png | Bin 0 -> 136 bytes + test/reference/source-clip-scale.mask.rgb24.ref.png | Bin 0 -> 136 bytes + test/reference/source-clip.mask.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/source-clip.mask.rgb24.ref.png | Bin 0 -> 111 bytes + .../source-surface-scale-paint.mask.argb32.ref.png | Bin 0 -> 120 bytes + .../source-surface-scale-paint.mask.rgb24.ref.png | Bin 0 -> 114 bytes + .../reference/spline-decomposition.mask.argb32.ref.png | Bin 0 -> 19520 bytes + test/reference/spline-decomposition.mask.rgb24.ref.png | Bin 0 -> 19520 bytes + test/reference/stride-12-image.base.argb32.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-image.base.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-image.mask.argb32.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-image.mask.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-image.traps.argb32.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-image.traps.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stroke-ctm-caps.mask.argb32.ref.png | Bin 0 -> 942 bytes + test/reference/stroke-ctm-caps.mask.rgb24.ref.png | Bin 0 -> 942 bytes + test/reference/stroke-image.mask.argb32.ref.png | Bin 0 -> 1424 bytes + test/reference/stroke-image.mask.rgb24.ref.png | Bin 0 -> 1424 bytes + test/reference/stroke-open-box.mask.argb32.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-open-box.mask.rgb24.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-pattern.base.argb32.ref.png | Bin 0 -> 1487 bytes + test/reference/stroke-pattern.base.rgb24.ref.png | Bin 0 -> 1487 bytes + test/reference/stroke-pattern.mask.argb32.ref.png | Bin 0 -> 1491 bytes + test/reference/stroke-pattern.mask.rgb24.ref.png | Bin 0 -> 1491 bytes + test/reference/stroke-pattern.traps.argb32.ref.png | Bin 0 -> 1487 bytes + test/reference/stroke-pattern.traps.rgb24.ref.png | Bin 0 -> 1487 bytes + .../subsurface-image-repeat.mask.argb32.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.mask.rgb24.ref.png | Bin 0 -> 915 bytes + .../subsurface-modify-child.mask.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-child.mask.rgb24.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-parent.mask.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-parent.mask.rgb24.ref.png | Bin 0 -> 197 bytes + .../subsurface-outside-target.mask.argb32.ref.png | Bin 0 -> 2063 bytes + .../subsurface-outside-target.mask.rgb24.ref.png | Bin 0 -> 1648 bytes + .../subsurface-outside-target.traps.argb32.ref.png | Bin 0 -> 2063 bytes + .../subsurface-outside-target.traps.rgb24.ref.png | Bin 0 -> 1648 bytes + test/reference/subsurface-pad.mask.argb32.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-pad.mask.rgb24.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-reflect.mask.argb32.ref.png | Bin 0 -> 210 bytes + test/reference/subsurface-reflect.mask.rgb24.ref.png | Bin 0 -> 210 bytes + test/reference/subsurface-repeat.mask.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-repeat.mask.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-scale.base.argb32.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface-scale.base.rgb24.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface-scale.mask.argb32.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface-scale.mask.rgb24.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface-scale.traps.argb32.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface-scale.traps.rgb24.ref.png | Bin 0 -> 5921 bytes + .../subsurface-similar-repeat.mask.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-similar-repeat.mask.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface.mask.argb32.ref.png | Bin 0 -> 1811 bytes + test/reference/subsurface.mask.rgb24.ref.png | Bin 0 -> 1811 bytes + .../surface-pattern-big-scale-down.mask.argb32.ref.png | Bin 0 -> 191 bytes + .../surface-pattern-big-scale-down.mask.rgb24.ref.png | Bin 0 -> 191 bytes + .../surface-pattern-operator.mask.argb32.ref.png | Bin 0 -> 5217 bytes + .../surface-pattern-operator.mask.rgb24.ref.png | Bin 0 -> 1942 bytes + ...-pattern-scale-down-extend-none.mask.argb32.ref.png | Bin 0 -> 329 bytes + ...e-pattern-scale-down-extend-none.mask.rgb24.ref.png | Bin 0 -> 329 bytes + ...e-pattern-scale-down-extend-pad.mask.argb32.ref.png | Bin 0 -> 320 bytes + ...ce-pattern-scale-down-extend-pad.mask.rgb24.ref.png | Bin 0 -> 320 bytes + ...ttern-scale-down-extend-reflect.mask.argb32.ref.png | Bin 0 -> 328 bytes + ...attern-scale-down-extend-reflect.mask.rgb24.ref.png | Bin 0 -> 328 bytes + ...attern-scale-down-extend-repeat.mask.argb32.ref.png | Bin 0 -> 330 bytes + ...pattern-scale-down-extend-repeat.mask.rgb24.ref.png | Bin 0 -> 330 bytes + .../surface-pattern-scale-down.mask.argb32.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-down.mask.rgb24.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-up.mask.argb32.ref.png | Bin 0 -> 4020 bytes + .../surface-pattern-scale-up.mask.rgb24.ref.png | Bin 0 -> 4020 bytes + test/reference/surface-pattern.mask.argb32.ref.png | Bin 0 -> 11088 bytes + test/reference/surface-pattern.mask.rgb24.ref.png | Bin 0 -> 11088 bytes + test/reference/svg-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/svg-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/text-antialias-gray.mask.argb32.ref.png | Bin 0 -> 966 bytes + test/reference/text-antialias-gray.mask.rgb24.ref.png | Bin 0 -> 966 bytes + .../reference/text-antialias-gray.traps.argb32.ref.png | Bin 0 -> 966 bytes + test/reference/text-antialias-gray.traps.rgb24.ref.png | Bin 0 -> 966 bytes + test/reference/text-antialias-none.mask.argb32.ref.png | Bin 0 -> 265 bytes + test/reference/text-antialias-none.mask.rgb24.ref.png | Bin 0 -> 265 bytes + .../reference/text-antialias-none.traps.argb32.ref.png | Bin 0 -> 265 bytes + test/reference/text-antialias-none.traps.rgb24.ref.png | Bin 0 -> 265 bytes + .../text-antialias-subpixel-bgr.base.argb32.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-bgr.base.rgb24.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-bgr.mask.argb32.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-bgr.mask.rgb24.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-bgr.traps.argb32.ref.png | Bin 0 -> 1005 bytes + .../text-antialias-subpixel-bgr.traps.rgb24.ref.png | Bin 0 -> 1005 bytes + .../text-antialias-subpixel-rgb.base.argb32.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-rgb.base.rgb24.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-rgb.mask.argb32.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-rgb.mask.rgb24.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel-rgb.traps.argb32.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel-rgb.traps.rgb24.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel-vbgr.base.argb32.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vbgr.base.rgb24.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vbgr.mask.argb32.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vbgr.mask.rgb24.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vbgr.traps.argb32.ref.png | Bin 0 -> 985 bytes + .../text-antialias-subpixel-vbgr.traps.rgb24.ref.png | Bin 0 -> 985 bytes + .../text-antialias-subpixel-vrgb.base.argb32.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vrgb.base.rgb24.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vrgb.mask.argb32.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vrgb.mask.rgb24.ref.png | Bin 0 -> 932 bytes + .../text-antialias-subpixel-vrgb.traps.argb32.ref.png | Bin 0 -> 1009 bytes + .../text-antialias-subpixel-vrgb.traps.rgb24.ref.png | Bin 0 -> 1009 bytes + .../text-antialias-subpixel.base.argb32.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel.base.rgb24.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel.mask.argb32.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel.mask.rgb24.ref.png | Bin 0 -> 917 bytes + .../text-antialias-subpixel.traps.argb32.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel.traps.rgb24.ref.png | Bin 0 -> 1013 bytes + test/reference/text-glyph-range.mask.argb32.ref.png | Bin 0 -> 1928 bytes + test/reference/text-glyph-range.mask.rgb24.ref.png | Bin 0 -> 1928 bytes + test/reference/text-glyph-range.traps.argb32.ref.png | Bin 0 -> 1979 bytes + test/reference/text-glyph-range.traps.rgb24.ref.png | Bin 0 -> 1979 bytes + test/reference/text-pattern.mask.argb32.ref.png | Bin 0 -> 3455 bytes + test/reference/text-pattern.mask.rgb24.ref.png | Bin 0 -> 2684 bytes + test/reference/text-rotate.mask.argb32.ref.png | Bin 0 -> 16655 bytes + test/reference/text-rotate.mask.rgb24.ref.png | Bin 0 -> 16655 bytes + test/reference/text-rotate.traps.argb32.ref.png | Bin 0 -> 16597 bytes + test/reference/text-rotate.traps.rgb24.ref.png | Bin 0 -> 16597 bytes + test/reference/text-transform.mask.argb32.ref.png | Bin 0 -> 5579 bytes + test/reference/text-transform.mask.rgb24.ref.png | Bin 0 -> 5579 bytes + test/reference/tiger.mask.argb32.ref.png | Bin 0 -> 93916 bytes + test/reference/tiger.mask.rgb24.ref.png | Bin 0 -> 93916 bytes + test/reference/transforms.mask.argb32.ref.png | Bin 0 -> 348 bytes + test/reference/transforms.mask.rgb24.ref.png | Bin 0 -> 348 bytes + .../translate-show-surface.mask.argb32.ref.png | Bin 0 -> 96 bytes + .../translate-show-surface.mask.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/trap-clip.mask.argb32.ref.png | Bin 0 -> 6162 bytes + test/reference/trap-clip.mask.rgb24.ref.png | Bin 0 -> 5606 bytes + test/reference/twin-antialias-gray.mask.argb32.ref.png | Bin 0 -> 3990 bytes + test/reference/twin-antialias-gray.mask.rgb24.ref.png | Bin 0 -> 3990 bytes + .../reference/twin-antialias-mixed.mask.argb32.ref.png | Bin 0 -> 2230 bytes + test/reference/twin-antialias-mixed.mask.rgb24.ref.png | Bin 0 -> 2230 bytes + test/reference/twin-antialias-none.mask.argb32.ref.png | Bin 0 -> 690 bytes + test/reference/twin-antialias-none.mask.rgb24.ref.png | Bin 0 -> 690 bytes + .../twin-antialias-subpixel.mask.argb32.ref.png | Bin 0 -> 3990 bytes + .../twin-antialias-subpixel.mask.rgb24.ref.png | Bin 0 -> 3990 bytes + test/reference/twin.mask.argb32.ref.png | Bin 0 -> 3990 bytes + test/reference/twin.mask.rgb24.ref.png | Bin 0 -> 3990 bytes + test/reference/unaligned-box.mask.argb32.ref.png | Bin 0 -> 496 bytes + test/reference/unaligned-box.mask.rgb24.ref.png | Bin 0 -> 496 bytes + .../reference/unantialiased-shapes.mask.argb32.ref.png | Bin 0 -> 3926 bytes + test/reference/unantialiased-shapes.mask.rgb24.ref.png | Bin 0 -> 3926 bytes + test/reference/unbounded-operator.mask.argb32.ref.png | Bin 0 -> 2666 bytes + test/reference/unbounded-operator.mask.rgb24.ref.png | Bin 0 -> 1300 bytes + test/reference/unclosed-strokes.mask.argb32.ref.png | Bin 0 -> 1901 bytes + test/reference/unclosed-strokes.mask.rgb24.ref.png | Bin 0 -> 1901 bytes + test/reference/user-font-mask.mask.argb32.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-mask.mask.rgb24.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-proxy.mask.argb32.ref.png | Bin 0 -> 16941 bytes + test/reference/user-font-proxy.mask.rgb24.ref.png | Bin 0 -> 16941 bytes + test/reference/user-font-proxy.traps.argb32.ref.png | Bin 0 -> 16854 bytes + test/reference/user-font-proxy.traps.rgb24.ref.png | Bin 0 -> 16854 bytes + test/reference/user-font-rescale.mask.argb32.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font-rescale.mask.rgb24.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font-rescale.traps.argb32.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font-rescale.traps.rgb24.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font.mask.argb32.ref.png | Bin 0 -> 6478 bytes + test/reference/user-font.mask.rgb24.ref.png | Bin 0 -> 6478 bytes + test/reference/white-in-noop.mask.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/white-in-noop.mask.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/world-map-fill.mask.argb32.ref.png | Bin 0 -> 57308 bytes + test/reference/world-map-fill.mask.rgb24.ref.png | Bin 0 -> 57308 bytes + test/reference/world-map-stroke.mask.argb32.ref.png | Bin 0 -> 65149 bytes + test/reference/world-map-stroke.mask.rgb24.ref.png | Bin 0 -> 65149 bytes + test/reference/world-map.mask.argb32.ref.png | Bin 0 -> 70474 bytes + test/reference/world-map.mask.rgb24.ref.png | Bin 0 -> 70474 bytes + test/reference/xcb-huge-image-shm.mask.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-huge-image-shm.mask.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-snapshot-assert.mask.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-snapshot-assert.mask.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-stress-cache.mask.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-stress-cache.mask.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/xcb-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + .../xcomposite-projection.mask.argb32.ref.png | Bin 0 -> 1109 bytes + .../reference/xcomposite-projection.mask.rgb24.ref.png | Bin 0 -> 1109 bytes + test/reference/xlib-expose-event.mask.argb32.ref.png | Bin 0 -> 40717 bytes + test/reference/xlib-expose-event.mask.rgb24.ref.png | Bin 0 -> 40717 bytes + test/reference/xlib-surface-source.mask.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/xlib-surface-source.mask.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/zero-alpha.mask.argb32.ref.png | Bin 0 -> 91 bytes + test/reference/zero-alpha.mask.rgb24.ref.png | Bin 0 -> 91 bytes + test/reference/zero-mask.mask.argb32.ref.png | Bin 0 -> 402 bytes + test/reference/zero-mask.mask.rgb24.ref.png | Bin 0 -> 382 bytes + 948 files changed, 0 insertions(+), 0 deletions(-) + +commit 3d499ea901b3a76cd765ddce9f4e7d3acebd1bd3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 10:41:37 2012 +0000 + + xlib: Replace obsolete disable-xrender with shiny new device debug interface + + As prototyped with xcb. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-xlib.c | 54 +++++----------------------------- + src/cairo-xlib-display.c | 57 +++++++++++++++++++++++++++++++----- + src/cairo-xlib.h | 5 ++++ + test/get-xrender-format.c | 10 ------- + test/xlib-surface.c | 23 ++------------- + 5 files changed, 66 insertions(+), 83 deletions(-) + +commit 73df8eb8db521585f1ac6abb053843b5717cd27e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 10:19:18 2012 +0000 + + test/xlib: Remove stale reference images + + We know have a swrast reference compositor for xlib (test-traps) and so + should not need these old xlib specific reference images. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/a1-image-sample.xlib.argb32.ref.png | Bin 122 -> 0 bytes + test/reference/a1-image-sample.xlib.rgb24.ref.png | Bin 122 -> 0 bytes + test/reference/arc-direction.xlib.ref.png | Bin 5864 -> 0 bytes + .../clip-rotate-image-surface-paint.xlib.argb32.ref.png | Bin 202 -> 0 bytes + .../clip-rotate-image-surface-paint.xlib.rgb24.ref.png | Bin 202 -> 0 bytes + .../image-bug-710072-aligned.xlib.argb32.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-aligned.xlib.rgb24.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-unaligned.xlib.argb32.ref.png | Bin 219 -> 0 bytes + .../image-bug-710072-unaligned.xlib.rgb24.ref.png | Bin 219 -> 0 bytes + test/reference/image-surface-source.xlib.argb32.ref.png | Bin 377 -> 0 bytes + test/reference/image-surface-source.xlib.rgb24.ref.png | Bin 301 -> 0 bytes + test/reference/map-to-image-fill.xlib.argb32.ref.png | Bin 103 -> 0 bytes + test/reference/map-to-image-fill.xlib.rgb24.ref.png | Bin 103 -> 0 bytes + .../rotate-clip-image-surface-paint.xlib.argb32.ref.png | Bin 303 -> 0 bytes + .../rotate-clip-image-surface-paint.xlib.rgb24.ref.png | Bin 303 -> 0 bytes + .../rotate-image-surface-paint.xlib.argb32.ref.png | Bin 220 -> 0 bytes + .../rotate-image-surface-paint.xlib.rgb24.ref.png | Bin 220 -> 0 bytes + test/reference/smask-image-mask.xlib.argb32.ref.png | Bin 619 -> 0 bytes + test/reference/smask-image-mask.xlib.rgb24.ref.png | Bin 619 -> 0 bytes + .../subsurface-image-repeat.xlib.argb32.ref.png | Bin 915 -> 0 bytes + .../reference/subsurface-image-repeat.xlib.rgb24.ref.png | Bin 915 -> 0 bytes + test/reference/xcb-huge-image-shm.xlib.argb32.ref.png | Bin 97 -> 0 bytes + test/reference/xcb-huge-image-shm.xlib.rgb24.ref.png | Bin 97 -> 0 bytes + 23 files changed, 0 insertions(+), 0 deletions(-) + +commit b2132eed79c60b3a70b88e5b5bbac7c541355735 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 10:18:56 2012 +0000 + + boilerplate/xlib: The xlib-fallback should be visually identical to image + + boilerplate/cairo-boilerplate-xlib.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cd4fd8a8028f3233dbfbfde283bca894700c833d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 10:11:16 2012 +0000 + + test: Update traps for changes in reference font + + test/reference/clear-source.traps.argb32.ref.png | Bin 779 -> 882 bytes + test/reference/clear-source.traps.rgb24.ref.png | Bin 779 -> 882 bytes + test/reference/culled-glyphs.traps.argb32.ref.png | Bin 435 -> 440 bytes + test/reference/culled-glyphs.traps.rgb24.ref.png | Bin 435 -> 440 bytes + test/reference/fill-image.traps.argb32.ref.png | Bin 1455 -> 1458 bytes + test/reference/fill-image.traps.rgb24.ref.png | Bin 1455 -> 1458 bytes + ...large-twin-antialias-mixed.traps.argb32.ref.png | Bin 10740 -> 16660 bytes + .../large-twin-antialias-mixed.traps.rgb24.ref.png | Bin 10740 -> 16660 bytes + .../overlapping-glyphs.traps.argb32.ref.png | Bin 2684 -> 2715 bytes + .../overlapping-glyphs.traps.rgb24.ref.png | Bin 1647 -> 1661 bytes + .../partial-clip-text-bottom.traps.argb32.ref.png | Bin 259 -> 261 bytes + .../partial-clip-text-bottom.traps.rgb24.ref.png | Bin 259 -> 261 bytes + .../partial-clip-text-left.traps.argb32.ref.png | Bin 293 -> 301 bytes + .../partial-clip-text-left.traps.rgb24.ref.png | Bin 293 -> 301 bytes + test/reference/random-clip.traps.argb32.ref.png | Bin 523342 -> 523346 bytes + test/reference/random-clip.traps.rgb24.ref.png | Bin 523342 -> 523346 bytes + test/reference/stroke-image.traps.argb32.ref.png | Bin 1458 -> 1467 bytes + test/reference/stroke-image.traps.rgb24.ref.png | Bin 1458 -> 1467 bytes + test/reference/subsurface.traps.argb32.ref.png | Bin 1281 -> 1811 bytes + test/reference/subsurface.traps.rgb24.ref.png | Bin 1281 -> 1811 bytes + .../twin-antialias-gray.traps.argb32.ref.png | Bin 4053 -> 4392 bytes + .../twin-antialias-gray.traps.rgb24.ref.png | Bin 4053 -> 4392 bytes + .../twin-antialias-mixed.traps.argb32.ref.png | Bin 1639 -> 2230 bytes + .../twin-antialias-mixed.traps.rgb24.ref.png | Bin 1639 -> 2230 bytes + .../twin-antialias-none.traps.argb32.ref.png | Bin 747 -> 738 bytes + .../twin-antialias-none.traps.rgb24.ref.png | Bin 747 -> 738 bytes + .../twin-antialias-subpixel.traps.argb32.ref.png | Bin 4053 -> 4392 bytes + .../twin-antialias-subpixel.traps.rgb24.ref.png | Bin 4053 -> 4392 bytes + test/reference/twin.traps.argb32.ref.png | Bin 4053 -> 4392 bytes + test/reference/twin.traps.rgb24.ref.png | Bin 4053 -> 4392 bytes + test/reference/user-font.traps.argb32.ref.png | Bin 5439 -> 6080 bytes + test/reference/user-font.traps.rgb24.ref.png | Bin 5439 -> 6080 bytes + 32 files changed, 0 insertions(+), 0 deletions(-) + +commit c9f18bb034c31b37692b80db47b663f14f441f6a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 10:09:05 2012 +0000 + + test: Update base reference images for new reference font + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/clear-source.base.argb32.ref.png | Bin 779 -> 882 bytes + test/reference/clear-source.base.rgb24.ref.png | Bin 779 -> 882 bytes + test/reference/clip-operator.base.argb32.ref.png | Bin 8171 -> 8179 bytes + test/reference/clip-operator.base.rgb24.ref.png | Bin 3231 -> 3243 bytes + test/reference/clip-text.base.argb32.ref.png | Bin 899 -> 899 bytes + test/reference/clip-text.base.rgb24.ref.png | Bin 899 -> 899 bytes + test/reference/culled-glyphs.base.argb32.ref.png | Bin 435 -> 440 bytes + test/reference/culled-glyphs.base.rgb24.ref.png | Bin 435 -> 440 bytes + test/reference/fill-image.base.argb32.ref.png | Bin 1455 -> 1458 bytes + test/reference/fill-image.base.rgb24.ref.png | Bin 1455 -> 1458 bytes + .../font-matrix-translation.base.argb32.ref.png | Bin 874 -> 865 bytes + .../font-matrix-translation.base.rgb24.ref.png | Bin 874 -> 865 bytes + .../ft-show-glyphs-positioning.base.argb32.ref.png | Bin 3297 -> 3243 bytes + .../ft-show-glyphs-positioning.base.rgb24.ref.png | Bin 3297 -> 3243 bytes + .../ft-show-glyphs-table.base.argb32.ref.png | Bin 9893 -> 9975 bytes + .../ft-show-glyphs-table.base.rgb24.ref.png | Bin 9893 -> 9975 bytes + .../glyph-cache-pressure.base.argb32.ref.png | Bin 2863 -> 2858 bytes + .../glyph-cache-pressure.base.rgb24.ref.png | Bin 2863 -> 2858 bytes + test/reference/halo-transform.base.argb32.ref.png | Bin 15118 -> 15122 bytes + test/reference/halo-transform.base.rgb24.ref.png | Bin 15118 -> 15122 bytes + test/reference/halo.base.argb32.ref.png | Bin 8800 -> 8594 bytes + test/reference/halo.base.rgb24.ref.png | Bin 8800 -> 8594 bytes + .../large-twin-antialias-mixed.base.argb32.ref.png | Bin 10740 -> 16660 bytes + .../large-twin-antialias-mixed.base.rgb24.ref.png | Bin 10740 -> 16660 bytes + test/reference/operator-clear.base.argb32.ref.png | Bin 1070 -> 1071 bytes + test/reference/operator-clear.base.rgb24.ref.png | Bin 950 -> 950 bytes + test/reference/operator-source.base.argb32.ref.png | Bin 5630 -> 5625 bytes + test/reference/operator-source.base.rgb24.ref.png | Bin 3979 -> 3979 bytes + .../overlapping-glyphs.base.argb32.ref.png | Bin 2684 -> 2715 bytes + .../reference/overlapping-glyphs.base.rgb24.ref.png | Bin 1647 -> 1661 bytes + .../partial-clip-text-bottom.base.argb32.ref.png | Bin 259 -> 261 bytes + .../partial-clip-text-bottom.base.rgb24.ref.png | Bin 259 -> 261 bytes + .../partial-clip-text-left.base.argb32.ref.png | Bin 293 -> 301 bytes + .../partial-clip-text-left.base.rgb24.ref.png | Bin 293 -> 301 bytes + .../partial-clip-text-right.base.argb32.ref.png | Bin 155 -> 155 bytes + .../partial-clip-text-right.base.rgb24.ref.png | Bin 155 -> 155 bytes + .../partial-clip-text-top.base.argb32.ref.png | Bin 173 -> 181 bytes + .../partial-clip-text-top.base.rgb24.ref.png | Bin 173 -> 181 bytes + .../reference/pthread-show-text.base.argb32.ref.png | Bin 29759 -> 30199 bytes + test/reference/pthread-show-text.base.rgb24.ref.png | Bin 29759 -> 30199 bytes + test/reference/select-font-face.base.argb32.ref.png | Bin 2245 -> 2250 bytes + test/reference/select-font-face.base.rgb24.ref.png | Bin 2245 -> 2250 bytes + .../show-glyphs-advance.base.argb32.ref.png | Bin 1395 -> 1394 bytes + .../show-glyphs-advance.base.rgb24.ref.png | Bin 1395 -> 1394 bytes + .../show-text-current-point.base.argb32.ref.png | Bin 2185 -> 2151 bytes + .../show-text-current-point.base.rgb24.ref.png | Bin 2185 -> 2151 bytes + test/reference/smask-text.base.argb32.ref.png | Bin 1624 -> 1660 bytes + test/reference/smask-text.base.rgb24.ref.png | Bin 1624 -> 1660 bytes + test/reference/smask.base.argb32.ref.png | Bin 3404 -> 3393 bytes + test/reference/smask.base.rgb24.ref.png | Bin 3404 -> 3393 bytes + test/reference/stroke-image.base.argb32.ref.png | Bin 1458 -> 1467 bytes + test/reference/stroke-image.base.rgb24.ref.png | Bin 1458 -> 1467 bytes + .../subsurface-outside-target.base.argb32.ref.png | Bin 1149 -> 2063 bytes + .../subsurface-outside-target.base.rgb24.ref.png | Bin 1005 -> 1648 bytes + test/reference/subsurface.base.argb32.ref.png | Bin 1281 -> 1811 bytes + test/reference/subsurface.base.rgb24.ref.png | Bin 1281 -> 1811 bytes + .../text-antialias-gray.base.argb32.ref.png | Bin 975 -> 966 bytes + .../text-antialias-gray.base.rgb24.ref.png | Bin 975 -> 966 bytes + test/reference/text-glyph-range.base.argb32.ref.png | Bin 1991 -> 1979 bytes + test/reference/text-glyph-range.base.rgb24.ref.png | Bin 1991 -> 1979 bytes + test/reference/text-pattern.base.argb32.ref.png | Bin 1695 -> 3497 bytes + test/reference/text-pattern.base.rgb24.ref.png | Bin 1397 -> 2707 bytes + test/reference/text-rotate.base.argb32.ref.png | Bin 16599 -> 16597 bytes + test/reference/text-rotate.base.rgb24.ref.png | Bin 16599 -> 16597 bytes + .../twin-antialias-gray.base.argb32.ref.png | Bin 4053 -> 4392 bytes + .../twin-antialias-gray.base.rgb24.ref.png | Bin 4053 -> 4392 bytes + .../twin-antialias-mixed.base.argb32.ref.png | Bin 1639 -> 2230 bytes + .../twin-antialias-mixed.base.rgb24.ref.png | Bin 1639 -> 2230 bytes + .../twin-antialias-none.base.argb32.ref.png | Bin 747 -> 738 bytes + .../twin-antialias-none.base.rgb24.ref.png | Bin 747 -> 738 bytes + .../twin-antialias-subpixel.base.argb32.ref.png | Bin 4053 -> 4392 bytes + .../twin-antialias-subpixel.base.rgb24.ref.png | Bin 4053 -> 4392 bytes + test/reference/twin.base.argb32.ref.png | Bin 4053 -> 4392 bytes + test/reference/twin.base.rgb24.ref.png | Bin 4053 -> 4392 bytes + .../unbounded-operator.base.argb32.ref.png | Bin 2756 -> 2764 bytes + .../reference/unbounded-operator.base.rgb24.ref.png | Bin 1289 -> 1302 bytes + test/reference/user-font-proxy.base.argb32.ref.png | Bin 16798 -> 16854 bytes + test/reference/user-font-proxy.base.rgb24.ref.png | Bin 16798 -> 16854 bytes + .../reference/user-font-rescale.base.argb32.ref.png | Bin 14852 -> 14883 bytes + test/reference/user-font-rescale.base.rgb24.ref.png | Bin 14852 -> 14883 bytes + test/reference/user-font.base.argb32.ref.png | Bin 5439 -> 6080 bytes + test/reference/user-font.base.rgb24.ref.png | Bin 5439 -> 6080 bytes + 82 files changed, 0 insertions(+), 0 deletions(-) + +commit da8841cc5ea0b45daba6b91227a2b7058a0120b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 22 09:30:32 2012 +0000 + + test/README: Update sha1sums for fonts used + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/README | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 2d74eaf92f086a1e6119241b7dd34f44bf795967 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 20 21:02:55 2012 +0000 + + image: Add the get-font-options callback again. + + In the midst of trying to simply export the + _cairo_image_surface_get_font_options() for subclassing, I accidentally + decoupled it from the image surface backend. Mea culpa. + + Fixes regression from 8bea52bb (Add preliminary damage tracking), which + should not have even touched the backend structure except for an ugly + rebasing. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 58f79a85b0d37ab9ccf9e6d706c202a6078e9140 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Feb 19 18:25:06 2012 +0100 + + perf: Don't use a boolean value as integer + + Although in this case the boolean values are guaranteed to be 1/0, + using them as true/false (in an if condition) seems much saner than + using them to limit the number of iterations on a for loop. + + Fixes: + + cairo-perf-micro.c:221:5: warning: cannot optimize possibly infinite + loops [-Wunsafe-loop-optimizations] + + perf/cairo-perf-micro.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 86a7533d0a2bd5d3c9ce0c18074d11ed633162df +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Feb 19 18:21:35 2012 +0100 + + stroke-style: Silence gcc warning + + and make it more obvious that we're not doing OOB accesses. + + They were not possible because of the parity constraint, but by + guarding the highest index with which we access the data in the loop, + the correctness information is completely contained in the loop code. + + Fixes: + + cairo-stroke-style.c:199:2: warning: cannot optimize loop, the loop + counter may overflow [-Wunsafe-loop-optimizations] + + src/cairo-stroke-style.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d3b6e151a26de7cdf5b00cf3942e25185f4b6892 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Feb 19 17:20:49 2012 +0100 + + path-fixed: Silence gcc warnings + + _cairo_path_fixed_last_op() contains an assertion, which gcc doesn't + like to inline. Since it is a static function, which basically + accesses a value, gcc will inline it anyway when assertions are + disabled, so remove the "inline" hint to reduce gcc warning noise when + doing debug builds. + + Fixes: + + cairo-path-fixed.c: In function '_cairo_path_fixed_drop_line_to': + cairo-path-fixed.c:373:1: warning: inlining failed in call to + '_cairo_path_fixed_last_op.isra.5.part.6': call is unlikely and code + size would grow [-Winline] + cairo-path-fixed.c:400:1: warning: called from here [-Winline] + ... + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f4908b3848aac2b66a7acafc60eeab0066bc1b1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 20 11:24:17 2012 +0000 + + test: Refresh reference images for antialiasing fix + + Having discovered that I had recreated the references images with a + buggy rasteriser, we now need to recreate them with the correct reference + settings. + + test/reference/a1-bug.argb32.ref.png | Bin 0 -> 3735 bytes + test/reference/a1-bug.rgb24.ref.png | Bin 0 -> 3735 bytes + test/reference/a1-clip-fill-equal.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill-equal.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-fill.argb32.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.rgb24.ref.png | Bin 0 -> 328 bytes + test/reference/a1-image-sample.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.rgb24.ref.png | Bin 0 -> 122 bytes + .../a1-image-sample.xlib-fallback.rgb24.ref.png | Bin 0 -> 122 bytes + .../a1-image-sample.xlib-window.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.xlib.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.xlib.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-line-width.argb32.ref.png | Bin 0 -> 154 bytes + test/reference/a1-line-width.rgb24.ref.png | Bin 0 -> 154 bytes + test/reference/a1-mask-sample.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask-sample.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask.argb32.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.rgb24.ref.png | Bin 0 -> 106 bytes + .../a1-rasterisation-rectangles.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-rectangles.rgb24.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.rgb24.ref.png | Bin 0 -> 1729 bytes + test/reference/a1-rectilinear-grid.argb32.ref.png | Bin 0 -> 207 bytes + test/reference/a1-rectilinear-grid.rgb24.ref.png | Bin 0 -> 207 bytes + test/reference/a1-sample.argb32.ref.png | Bin 0 -> 786 bytes + test/reference/a1-sample.rgb24.ref.png | Bin 0 -> 786 bytes + test/reference/a1-tiger.argb32.ref.png | Bin 0 -> 20328 bytes + test/reference/a1-tiger.rgb24.ref.png | Bin 0 -> 20328 bytes + test/reference/a1-traps-sample.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-traps-sample.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a8-clear.argb32.ref.png | Bin 0 -> 271 bytes + test/reference/a8-clear.rgb24.ref.png | Bin 0 -> 271 bytes + test/reference/a8-mask.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/a8-mask.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/aliasing.argb32.ref.png | Bin 0 -> 104324 bytes + test/reference/aliasing.rgb24.ref.png | Bin 0 -> 104324 bytes + test/reference/alpha-similar.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.rgb24.ref.png | Bin 99 -> 88 bytes + test/reference/api-special-cases.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/api-special-cases.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/arc-direction.argb32.ref.png | Bin 0 -> 6380 bytes + test/reference/arc-direction.rgb24.ref.png | Bin 0 -> 6380 bytes + test/reference/arc-infinite-loop.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/arc-infinite-loop.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/arc-looping-dash.argb32.ref.png | Bin 0 -> 464 bytes + test/reference/arc-looping-dash.rgb24.ref.png | Bin 0 -> 464 bytes + test/reference/big-line.argb32.ref.png | Bin 0 -> 977 bytes + test/reference/big-line.rgb24.ref.png | Bin 0 -> 977 bytes + test/reference/big-little-triangle.argb32.ref.png | Bin 408 -> 409 bytes + test/reference/big-little-triangle.rgb24.ref.png | Bin 324 -> 328 bytes + test/reference/bilevel-image.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-image.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-xlib-fallback.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-xlib-window.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-xlib.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-xlib.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bitmap-font.argb32.ref.png | Bin 0 -> 931 bytes + test/reference/bitmap-font.rgb24.ref.png | Bin 890 -> 871 bytes + test/reference/bug-40410.argb32.ref.png | Bin 0 -> 429 bytes + test/reference/bug-40410.rgb24.ref.png | Bin 0 -> 429 bytes + test/reference/bug-bo-rectangular.argb32.ref.png | Bin 0 -> 950 bytes + test/reference/bug-bo-rectangular.rgb24.ref.png | Bin 0 -> 950 bytes + test/reference/bug-bo-ricotz.argb32.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-bo-ricotz.rgb24.ref.png | Bin 0 -> 2128 bytes + test/reference/bug-extents.argb32.ref.png | Bin 0 -> 9251 bytes + test/reference/bug-extents.rgb24.ref.png | Bin 0 -> 9251 bytes + test/reference/bug-seams.argb32.ref.png | Bin 0 -> 1647 bytes + test/reference/bug-seams.rgb24.ref.png | Bin 0 -> 1647 bytes + test/reference/caps-joins-alpha.argb32.ref.png | Bin 0 -> 2662 bytes + test/reference/caps-joins-alpha.rgb24.ref.png | Bin 0 -> 2662 bytes + test/reference/caps-joins-curve.argb32.ref.png | Bin 0 -> 6217 bytes + test/reference/caps-joins-curve.rgb24.ref.png | Bin 0 -> 6217 bytes + test/reference/caps-joins.argb32.ref.png | Bin 0 -> 2893 bytes + test/reference/caps-joins.rgb24.ref.png | Bin 0 -> 2893 bytes + test/reference/caps-sub-paths.argb32.ref.png | Bin 0 -> 168 bytes + test/reference/caps-sub-paths.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/caps-tails-curve.argb32.ref.png | Bin 0 -> 53311 bytes + test/reference/caps-tails-curve.rgb24.ref.png | Bin 0 -> 53311 bytes + test/reference/caps.argb32.ref.png | Bin 0 -> 2115 bytes + test/reference/caps.rgb24.ref.png | Bin 0 -> 2115 bytes + test/reference/checkerboard.argb32.ref.png | Bin 0 -> 142 bytes + test/reference/checkerboard.rgb24.ref.png | Bin 0 -> 142 bytes + test/reference/clear-source.argb32.ref.png | Bin 0 -> 882 bytes + test/reference/clear-source.rgb24.ref.png | Bin 0 -> 882 bytes + test/reference/clear.argb32.ref.png | Bin 539 -> 692 bytes + test/reference/clear.rgb24.ref.png | Bin 484 -> 617 bytes + test/reference/clip-all.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-all.rgb24.ref.png | Bin 0 -> 95 bytes + .../reference/clip-complex-shape-eo-aa.argb32.ref.png | Bin 0 -> 325 bytes + test/reference/clip-complex-shape-eo-aa.rgb24.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.rgb24.ref.png | Bin 0 -> 325 bytes + test/reference/clip-contexts.argb32.ref.png | Bin 0 -> 98 bytes + test/reference/clip-contexts.rgb24.ref.png | Bin 0 -> 98 bytes + test/reference/clip-disjoint-hatching.argb32.ref.png | Bin 0 -> 9022 bytes + test/reference/clip-disjoint-hatching.rgb24.ref.png | Bin 0 -> 9022 bytes + test/reference/clip-disjoint.argb32.ref.png | Bin 0 -> 5399 bytes + test/reference/clip-disjoint.rgb24.ref.png | Bin 0 -> 5399 bytes + test/reference/clip-empty-group.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-group.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-save.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty-save.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-fill-eo-unbounded.argb32.ref.png | Bin 3970 -> 4197 bytes + test/reference/clip-fill-eo-unbounded.rgb24.ref.png | Bin 3409 -> 3551 bytes + test/reference/clip-fill-no-op.argb32.ref.png | Bin 0 -> 152 bytes + test/reference/clip-fill-no-op.rgb24.ref.png | Bin 0 -> 152 bytes + test/reference/clip-fill-nz-unbounded.argb32.ref.png | Bin 3970 -> 4197 bytes + test/reference/clip-fill-nz-unbounded.rgb24.ref.png | Bin 3409 -> 3551 bytes + .../clip-fill-rule-pixel-aligned.argb32.ref.png | Bin 0 -> 176 bytes + .../clip-fill-rule-pixel-aligned.rgb24.ref.png | Bin 184 -> 165 bytes + test/reference/clip-fill-rule.argb32.ref.png | Bin 371 -> 437 bytes + test/reference/clip-fill-rule.rgb24.ref.png | Bin 338 -> 393 bytes + test/reference/clip-fill.argb32.ref.png | Bin 0 -> 1031 bytes + test/reference/clip-fill.rgb24.ref.png | Bin 0 -> 1031 bytes + ...lip-group-shapes-aligned-rectangles.argb32.ref.png | Bin 0 -> 378 bytes + ...clip-group-shapes-aligned-rectangles.rgb24.ref.png | Bin 0 -> 378 bytes + .../clip-group-shapes-circles.argb32.ref.png | Bin 0 -> 1525 bytes + .../reference/clip-group-shapes-circles.rgb24.ref.png | Bin 0 -> 1525 bytes + ...p-group-shapes-unaligned-rectangles.argb32.ref.png | Bin 0 -> 415 bytes + ...ip-group-shapes-unaligned-rectangles.rgb24.ref.png | Bin 0 -> 415 bytes + test/reference/clip-image.argb32.ref.png | Bin 0 -> 2677 bytes + test/reference/clip-image.rgb24.ref.png | Bin 0 -> 2677 bytes + test/reference/clip-intersect.argb32.ref.png | Bin 0 -> 200 bytes + test/reference/clip-intersect.rgb24.ref.png | Bin 0 -> 200 bytes + test/reference/clip-mixed-antialias.argb32.ref.png | Bin 0 -> 1084 bytes + test/reference/clip-mixed-antialias.rgb24.ref.png | Bin 0 -> 1084 bytes + test/reference/clip-nesting.argb32.ref.png | Bin 1080 -> 1044 bytes + test/reference/clip-nesting.rgb24.ref.png | Bin 954 -> 937 bytes + test/reference/clip-polygons.argb32.ref.png | Bin 0 -> 1352 bytes + test/reference/clip-polygons.rgb24.ref.png | Bin 0 -> 1352 bytes + test/reference/clip-push-group.argb32.ref.png | Bin 0 -> 164 bytes + test/reference/clip-push-group.rgb24.ref.png | Bin 0 -> 164 bytes + test/reference/clip-rectilinear.argb32.ref.png | Bin 0 -> 439 bytes + test/reference/clip-rectilinear.rgb24.ref.png | Bin 0 -> 439 bytes + .../clip-rotate-image-surface-paint.argb32.ref.png | Bin 0 -> 202 bytes + .../clip-rotate-image-surface-paint.rgb24.ref.png | Bin 0 -> 202 bytes + ...te-image-surface-paint.xlib-fallback.rgb24.ref.png | Bin 0 -> 202 bytes + ...tate-image-surface-paint.xlib-window.rgb24.ref.png | Bin 0 -> 202 bytes + ...lip-rotate-image-surface-paint.xlib.argb32.ref.png | Bin 0 -> 202 bytes + ...clip-rotate-image-surface-paint.xlib.rgb24.ref.png | Bin 0 -> 202 bytes + test/reference/clip-shape.argb32.ref.png | Bin 0 -> 3073 bytes + test/reference/clip-shape.rgb24.ref.png | Bin 0 -> 3073 bytes + test/reference/clip-stroke-no-op.argb32.ref.png | Bin 0 -> 152 bytes + test/reference/clip-stroke-no-op.rgb24.ref.png | Bin 0 -> 152 bytes + test/reference/clip-stroke-unbounded.argb32.ref.png | Bin 3887 -> 4128 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 3408 -> 3546 bytes + test/reference/clip-stroke.argb32.ref.png | Bin 0 -> 1522 bytes + test/reference/clip-stroke.rgb24.ref.png | Bin 0 -> 1522 bytes + test/reference/clip-text.argb32.ref.png | Bin 0 -> 928 bytes + test/reference/clip-text.rgb24.ref.png | Bin 0 -> 928 bytes + test/reference/clip-twice-rectangle.argb32.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice-rectangle.rgb24.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice.argb32.ref.png | Bin 1068 -> 1358 bytes + test/reference/clip-twice.rgb24.ref.png | Bin 1022 -> 1195 bytes + test/reference/clip-unbounded.argb32.ref.png | Bin 0 -> 100 bytes + test/reference/clip-xlib-fallback.rgb24.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-xlib-window.rgb24.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-xlib.argb32.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-xlib.rgb24.ref.png | Bin 0 -> 2686 bytes + test/reference/clipped-group.argb32.ref.png | Bin 0 -> 342 bytes + test/reference/clipped-group.rgb24.ref.png | Bin 0 -> 342 bytes + test/reference/clipped-surface.argb32.ref.png | Bin 0 -> 345 bytes + test/reference/clipped-surface.rgb24.ref.png | Bin 0 -> 345 bytes + .../reference/close-path-current-point.argb32.ref.png | Bin 0 -> 2324 bytes + test/reference/close-path-current-point.rgb24.ref.png | Bin 0 -> 2324 bytes + test/reference/close-path.argb32.ref.png | Bin 0 -> 294 bytes + test/reference/close-path.rgb24.ref.png | Bin 0 -> 294 bytes + ...osite-integer-translate-over-repeat.argb32.ref.png | Bin 0 -> 334 bytes + ...posite-integer-translate-over-repeat.rgb24.ref.png | Bin 0 -> 334 bytes + .../composite-integer-translate-over.argb32.ref.png | Bin 0 -> 13998 bytes + .../composite-integer-translate-over.rgb24.ref.png | Bin 0 -> 13998 bytes + .../composite-integer-translate-source.argb32.ref.png | Bin 0 -> 13998 bytes + .../composite-integer-translate-source.rgb24.ref.png | Bin 0 -> 13998 bytes + test/reference/copy-disjoint.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-disjoint.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/copy-path.argb32.ref.png | Bin 0 -> 616 bytes + test/reference/copy-path.rgb24.ref.png | Bin 0 -> 616 bytes + test/reference/create-from-png-stream.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png-stream.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/culled-glyphs.argb32.ref.png | Bin 0 -> 440 bytes + test/reference/culled-glyphs.rgb24.ref.png | Bin 0 -> 440 bytes + test/reference/curve-to-as-line-to.argb32.ref.png | Bin 0 -> 109 bytes + test/reference/curve-to-as-line-to.rgb24.ref.png | Bin 0 -> 109 bytes + test/reference/dash-caps-joins.argb32.ref.png | Bin 0 -> 5157 bytes + test/reference/dash-caps-joins.rgb24.ref.png | Bin 0 -> 5157 bytes + test/reference/dash-curve.argb32.ref.png | Bin 0 -> 41040 bytes + test/reference/dash-curve.rgb24.ref.png | Bin 0 -> 41040 bytes + test/reference/dash-infinite-loop.argb32.ref.png | Bin 0 -> 877 bytes + test/reference/dash-infinite-loop.rgb24.ref.png | Bin 0 -> 877 bytes + test/reference/dash-no-dash.argb32.ref.png | Bin 0 -> 119 bytes + test/reference/dash-no-dash.rgb24.ref.png | Bin 0 -> 119 bytes + test/reference/dash-offset-negative.argb32.ref.png | Bin 0 -> 129 bytes + test/reference/dash-offset-negative.rgb24.ref.png | Bin 0 -> 129 bytes + test/reference/dash-offset.argb32.ref.png | Bin 0 -> 794 bytes + test/reference/dash-offset.rgb24.ref.png | Bin 0 -> 794 bytes + test/reference/dash-scale.argb32.ref.png | Bin 0 -> 8913 bytes + test/reference/dash-scale.rgb24.ref.png | Bin 0 -> 8913 bytes + test/reference/dash-state.argb32.ref.png | Bin 0 -> 8027 bytes + test/reference/dash-state.rgb24.ref.png | Bin 0 -> 8027 bytes + test/reference/dash-zero-length.argb32.ref.png | Bin 0 -> 230 bytes + test/reference/dash-zero-length.rgb24.ref.png | Bin 218 -> 210 bytes + test/reference/degenerate-arc.argb32.ref.png | Bin 0 -> 653 bytes + test/reference/degenerate-arc.rgb24.ref.png | Bin 0 -> 653 bytes + test/reference/degenerate-arcs.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-arcs.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-curve-to.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/degenerate-curve-to.rgb24.ref.png | Bin 0 -> 280 bytes + test/reference/degenerate-dash.argb32.ref.png | Bin 0 -> 2086 bytes + test/reference/degenerate-dash.rgb24.ref.png | Bin 0 -> 2086 bytes + .../degenerate-linear-gradient.argb32.ref.png | Bin 0 -> 336 bytes + .../degenerate-linear-gradient.rgb24.ref.png | Bin 0 -> 336 bytes + test/reference/degenerate-path.argb32.ref.png | Bin 253 -> 250 bytes + test/reference/degenerate-path.rgb24.ref.png | Bin 212 -> 219 bytes + test/reference/degenerate-pen.argb32.ref.png | Bin 0 -> 1019 bytes + test/reference/degenerate-pen.rgb24.ref.png | Bin 0 -> 1019 bytes + .../degenerate-radial-gradient.argb32.ref.png | Bin 0 -> 428 bytes + .../degenerate-radial-gradient.rgb24.ref.png | Bin 0 -> 428 bytes + test/reference/degenerate-rel-curve-to.argb32.ref.png | Bin 0 -> 277 bytes + test/reference/degenerate-rel-curve-to.rgb24.ref.png | Bin 0 -> 277 bytes + .../reference/device-offset-fractional.argb32.ref.png | Bin 0 -> 266 bytes + test/reference/device-offset-fractional.rgb24.ref.png | Bin 0 -> 266 bytes + test/reference/device-offset-positive.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/device-offset-positive.rgb24.ref.png | Bin 130 -> 111 bytes + test/reference/device-offset-scale.argb32.ref.png | Bin 0 -> 109 bytes + test/reference/device-offset-scale.rgb24.ref.png | Bin 0 -> 109 bytes + test/reference/device-offset.argb32.ref.png | Bin 0 -> 118 bytes + test/reference/device-offset.rgb24.ref.png | Bin 130 -> 111 bytes + test/reference/drunkard-tails.argb32.ref.png | Bin 0 -> 6116 bytes + test/reference/drunkard-tails.rgb24.ref.png | Bin 0 -> 6116 bytes + test/reference/extend-pad-border.argb32.ref.png | Bin 0 -> 495 bytes + test/reference/extend-pad-border.rgb24.ref.png | Bin 0 -> 495 bytes + test/reference/extend-pad-similar.argb32.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad-similar.rgb24.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.argb32.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.rgb24.ref.png | Bin 0 -> 279 bytes + test/reference/extend-reflect-similar.argb32.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect-similar.rgb24.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.argb32.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.rgb24.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-repeat-similar.argb32.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat-similar.rgb24.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.argb32.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.rgb24.ref.png | Bin 0 -> 108603 bytes + test/reference/extended-blend-solid.argb32.ref.png | Bin 4071 -> 4063 bytes + test/reference/extended-blend.argb32.ref.png | Bin 4071 -> 4063 bytes + test/reference/fallback.argb32.ref.png | Bin 3139 -> 4070 bytes + test/reference/fallback.image16.rgb24.ref.png | Bin 0 -> 2642 bytes + test/reference/fallback.rgb24.ref.png | Bin 2490 -> 3141 bytes + test/reference/fill-alpha-pattern.argb32.ref.png | Bin 0 -> 3381 bytes + test/reference/fill-alpha-pattern.rgb24.ref.png | Bin 0 -> 3381 bytes + test/reference/fill-alpha.argb32.ref.png | Bin 0 -> 2736 bytes + test/reference/fill-alpha.rgb24.ref.png | Bin 0 -> 2736 bytes + .../fill-and-stroke-alpha-add.argb32.ref.png | Bin 0 -> 556 bytes + .../reference/fill-and-stroke-alpha-add.rgb24.ref.png | Bin 0 -> 556 bytes + test/reference/fill-and-stroke-alpha.argb32.ref.png | Bin 0 -> 508 bytes + test/reference/fill-and-stroke-alpha.rgb24.ref.png | Bin 0 -> 508 bytes + test/reference/fill-and-stroke.argb32.ref.png | Bin 269 -> 312 bytes + test/reference/fill-and-stroke.rgb24.ref.png | Bin 252 -> 283 bytes + .../fill-degenerate-sort-order.argb32.ref.png | Bin 1929 -> 2400 bytes + .../fill-degenerate-sort-order.rgb24.ref.png | Bin 1689 -> 2049 bytes + test/reference/fill-disjoint.argb32.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.rgb24.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-image.argb32.ref.png | Bin 0 -> 1315 bytes + test/reference/fill-image.rgb24.ref.png | Bin 0 -> 1315 bytes + test/reference/fill-missed-stop.argb32.ref.png | Bin 0 -> 455 bytes + test/reference/fill-missed-stop.rgb24.ref.png | Bin 382 -> 382 bytes + test/reference/fill-rule.argb32.ref.png | Bin 0 -> 2065 bytes + test/reference/fill-rule.rgb24.ref.png | Bin 1591 -> 1803 bytes + test/reference/fill-xlib-fallback.rgb24.ref.png | Bin 0 -> 1458 bytes + test/reference/fill-xlib-window.rgb24.ref.png | Bin 0 -> 1458 bytes + test/reference/fill-xlib.argb32.ref.png | Bin 0 -> 1458 bytes + test/reference/fill-xlib.rgb24.ref.png | Bin 0 -> 1458 bytes + test/reference/filter-bilinear-extents.argb32.ref.png | Bin 0 -> 1210 bytes + test/reference/filter-bilinear-extents.rgb24.ref.png | Bin 0 -> 1210 bytes + test/reference/filter-nearest-offset.argb32.ref.png | Bin 0 -> 201 bytes + test/reference/filter-nearest-offset.rgb24.ref.png | Bin 0 -> 201 bytes + .../filter-nearest-transformed.argb32.ref.png | Bin 0 -> 514 bytes + .../filter-nearest-transformed.rgb24.ref.png | Bin 0 -> 514 bytes + test/reference/finer-grained-fallbacks.argb32.ref.png | Bin 993 -> 1167 bytes + test/reference/finer-grained-fallbacks.rgb24.ref.png | Bin 786 -> 891 bytes + test/reference/font-matrix-translation.argb32.ref.png | Bin 0 -> 865 bytes + test/reference/font-matrix-translation.rgb24.ref.png | Bin 0 -> 865 bytes + .../ft-show-glyphs-positioning.argb32.ref.png | Bin 0 -> 3243 bytes + .../ft-show-glyphs-positioning.rgb24.ref.png | Bin 0 -> 3243 bytes + test/reference/ft-show-glyphs-table.argb32.ref.png | Bin 0 -> 9975 bytes + test/reference/ft-show-glyphs-table.rgb24.ref.png | Bin 0 -> 9975 bytes + test/reference/ft-text-antialias-none.argb32.ref.png | Bin 0 -> 295 bytes + test/reference/ft-text-antialias-none.rgb24.ref.png | Bin 0 -> 295 bytes + .../ft-text-vertical-layout-type1.argb32.ref.png | Bin 0 -> 3062 bytes + .../ft-text-vertical-layout-type1.rgb24.ref.png | Bin 0 -> 3062 bytes + .../ft-text-vertical-layout-type3.argb32.ref.png | Bin 0 -> 3610 bytes + .../ft-text-vertical-layout-type3.rgb24.ref.png | Bin 0 -> 3610 bytes + test/reference/get-group-target.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/get-group-target.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/glyph-cache-pressure.argb32.ref.png | Bin 0 -> 2858 bytes + test/reference/glyph-cache-pressure.rgb24.ref.png | Bin 0 -> 2858 bytes + test/reference/gradient-alpha.argb32.ref.png | Bin 0 -> 125 bytes + test/reference/gradient-constant-alpha.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/gradient-zero-stops.argb32.ref.png | Bin 0 -> 86 bytes + test/reference/gradient-zero-stops.rgb24.ref.png | Bin 105 -> 86 bytes + test/reference/group-clip.argb32.ref.png | Bin 0 -> 191 bytes + test/reference/group-clip.rgb24.ref.png | Bin 0 -> 191 bytes + test/reference/group-paint.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/group-paint.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/group-unaligned.argb32.ref.png | Bin 0 -> 427 bytes + test/reference/group-unaligned.rgb24.ref.png | Bin 0 -> 427 bytes + test/reference/halo-transform.argb32.ref.png | Bin 0 -> 15063 bytes + test/reference/halo-transform.rgb24.ref.png | Bin 0 -> 15063 bytes + test/reference/halo.argb32.ref.png | Bin 0 -> 8726 bytes + test/reference/halo.rgb24.ref.png | Bin 0 -> 8726 bytes + test/reference/hatchings.argb32.ref.png | Bin 0 -> 92730 bytes + test/reference/hatchings.rgb24.ref.png | Bin 0 -> 92730 bytes + test/reference/horizontal-clip.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/horizontal-clip.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/huge-linear.argb32.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-linear.rgb24.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-radial.argb32.ref.png | Bin 0 -> 41702 bytes + test/reference/huge-radial.rgb24.ref.png | Bin 0 -> 41702 bytes + .../reference/image-bug-710072-aligned.argb32.ref.png | Bin 0 -> 151 bytes + test/reference/image-bug-710072-aligned.rgb24.ref.png | Bin 0 -> 151 bytes + ...age-bug-710072-aligned.xlib-fallback.rgb24.ref.png | Bin 0 -> 151 bytes + ...image-bug-710072-aligned.xlib-window.rgb24.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-aligned.xlib.argb32.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-aligned.xlib.rgb24.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-unaligned.argb32.ref.png | Bin 0 -> 212 bytes + .../image-bug-710072-unaligned.rgb24.ref.png | Bin 0 -> 212 bytes + ...e-bug-710072-unaligned.xlib-fallback.rgb24.ref.png | Bin 0 -> 219 bytes + ...age-bug-710072-unaligned.xlib-window.rgb24.ref.png | Bin 0 -> 219 bytes + .../image-bug-710072-unaligned.xlib.argb32.ref.png | Bin 0 -> 219 bytes + .../image-bug-710072-unaligned.xlib.rgb24.ref.png | Bin 0 -> 219 bytes + .../image-surface-source.xlib-fallback.rgb24.ref.png | Bin 0 -> 301 bytes + .../image-surface-source.xlib-window.rgb24.ref.png | Bin 0 -> 301 bytes + .../image-surface-source.xlib.argb32.ref.png | Bin 0 -> 377 bytes + .../reference/image-surface-source.xlib.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/implicit-close.argb32.ref.png | Bin 0 -> 251 bytes + test/reference/implicit-close.rgb24.ref.png | Bin 0 -> 251 bytes + test/reference/infinite-join.argb32.ref.png | Bin 0 -> 164 bytes + test/reference/infinite-join.rgb24.ref.png | Bin 0 -> 164 bytes + test/reference/joins-loop.argb32.ref.png | Bin 0 -> 4492 bytes + test/reference/joins-loop.rgb24.ref.png | Bin 0 -> 4492 bytes + test/reference/joins-retrace.argb32.ref.png | Bin 0 -> 4997 bytes + test/reference/joins-retrace.rgb24.ref.png | Bin 0 -> 4997 bytes + test/reference/joins-star.argb32.ref.png | Bin 0 -> 4914 bytes + test/reference/joins-star.rgb24.ref.png | Bin 0 -> 4914 bytes + test/reference/joins.argb32.ref.png | Bin 0 -> 6970 bytes + test/reference/joins.rgb24.ref.png | Bin 0 -> 6970 bytes + test/reference/large-clip.argb32.ref.png | Bin 0 -> 305 bytes + test/reference/large-clip.rgb24.ref.png | Bin 0 -> 305 bytes + test/reference/large-font.argb32.ref.png | Bin 0 -> 6117 bytes + test/reference/large-font.rgb24.ref.png | Bin 0 -> 6117 bytes + test/reference/large-source-roi.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/large-source-roi.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/large-source.argb32.ref.png | Bin 0 -> 112 bytes + test/reference/large-source.rgb24.ref.png | Bin 0 -> 112 bytes + .../large-twin-antialias-mixed.argb32.ref.png | Bin 0 -> 16660 bytes + .../large-twin-antialias-mixed.rgb24.ref.png | Bin 0 -> 16660 bytes + test/reference/leaky-dash.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/leaky-dash.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/leaky-dashed-rectangle.argb32.ref.png | Bin 0 -> 357 bytes + test/reference/leaky-dashed-rectangle.rgb24.ref.png | Bin 0 -> 357 bytes + test/reference/leaky-dashed-stroke.argb32.ref.png | Bin 0 -> 9387 bytes + test/reference/leaky-dashed-stroke.rgb24.ref.png | Bin 0 -> 9387 bytes + test/reference/leaky-polygon.argb32.ref.png | Bin 0 -> 337 bytes + test/reference/leaky-polygon.rgb24.ref.png | Bin 0 -> 337 bytes + .../line-width-large-overlap-flipped.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-flipped.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-flopped.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-flopped.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-offset.argb32.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-offset.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-rotated.argb32.ref.png | Bin 0 -> 427 bytes + .../line-width-large-overlap-rotated.rgb24.ref.png | Bin 0 -> 427 bytes + .../reference/line-width-large-overlap.argb32.ref.png | Bin 0 -> 305 bytes + test/reference/line-width-large-overlap.rgb24.ref.png | Bin 0 -> 305 bytes + .../line-width-overlap-flipped.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flipped.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-offset.argb32.ref.png | Bin 0 -> 348 bytes + .../reference/line-width-overlap-offset.rgb24.ref.png | Bin 0 -> 348 bytes + .../line-width-overlap-rotated.argb32.ref.png | Bin 0 -> 828 bytes + .../line-width-overlap-rotated.rgb24.ref.png | Bin 0 -> 828 bytes + test/reference/line-width-overlap.argb32.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-overlap.rgb24.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-scale.argb32.ref.png | Bin 0 -> 5721 bytes + test/reference/line-width-scale.rgb24.ref.png | Bin 0 -> 5721 bytes + test/reference/line-width-tolerance.argb32.ref.png | Bin 0 -> 168 bytes + test/reference/line-width-tolerance.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/line-width.argb32.ref.png | Bin 0 -> 178 bytes + test/reference/line-width.rgb24.ref.png | Bin 0 -> 178 bytes + test/reference/linear-gradient-extend.argb32.ref.png | Bin 0 -> 371 bytes + test/reference/linear-gradient-extend.rgb24.ref.png | Bin 0 -> 371 bytes + test/reference/linear-gradient-large.argb32.ref.png | Bin 0 -> 4076 bytes + test/reference/linear-gradient-large.rgb24.ref.png | Bin 0 -> 4076 bytes + test/reference/linear-gradient-reflect.argb32.ref.png | Bin 0 -> 185 bytes + test/reference/linear-gradient-reflect.rgb24.ref.png | Bin 0 -> 185 bytes + test/reference/linear-gradient-subset.argb32.ref.png | Bin 0 -> 820 bytes + test/reference/linear-gradient-subset.rgb24.ref.png | Bin 0 -> 820 bytes + test/reference/linear-gradient.argb32.ref.png | Bin 0 -> 974 bytes + test/reference/linear-gradient.rgb24.ref.png | Bin 0 -> 974 bytes + test/reference/linear-uniform.argb32.ref.png | Bin 0 -> 128 bytes + test/reference/linear-uniform.rgb24.ref.png | Bin 0 -> 128 bytes + test/reference/long-dashed-lines.argb32.ref.png | Bin 0 -> 2548 bytes + test/reference/long-dashed-lines.rgb24.ref.png | Bin 0 -> 2548 bytes + test/reference/map-all-to-image.argb32.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-image.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-xlib-fallback.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-xlib-window.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-xlib.argb32.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-xlib.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/map-bit-to-image.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-image.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-xlib-fallback.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-xlib-window.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-xlib.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-xlib.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.rgb24.ref.png | Bin 0 -> 103 bytes + .../map-to-image-fill.xlib-fallback.rgb24.ref.png | Bin 0 -> 103 bytes + .../map-to-image-fill.xlib-window.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.xlib.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.xlib.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/mask-alpha.argb32.ref.png | Bin 596 -> 632 bytes + test/reference/mask-alpha.rgb24.ref.png | Bin 546 -> 589 bytes + test/reference/mask-ctm.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-ctm.rgb24.ref.png | Bin 124 -> 105 bytes + test/reference/mask-surface-ctm.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-surface-ctm.rgb24.ref.png | Bin 124 -> 105 bytes + test/reference/mask-transformed-image.argb32.ref.png | Bin 0 -> 3812 bytes + test/reference/mask-transformed-image.rgb24.ref.png | Bin 0 -> 3812 bytes + .../reference/mask-transformed-similar.argb32.ref.png | Bin 0 -> 3812 bytes + test/reference/mask-transformed-similar.rgb24.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-xlib-fallback.rgb24.ref.png | Bin 0 -> 3809 bytes + .../mask-transformed-xlib-window.rgb24.ref.png | Bin 0 -> 3809 bytes + test/reference/mask-transformed-xlib.argb32.ref.png | Bin 0 -> 3809 bytes + test/reference/mask-transformed-xlib.rgb24.ref.png | Bin 0 -> 3809 bytes + test/reference/mask.argb32.ref.png | Bin 8193 -> 8579 bytes + test/reference/mask.rgb24.ref.png | Bin 6985 -> 7127 bytes + test/reference/mesh-pattern-accuracy.argb32.ref.png | Bin 0 -> 8086 bytes + test/reference/mesh-pattern-accuracy.rgb24.ref.png | Bin 0 -> 8086 bytes + test/reference/mesh-pattern-conical.argb32.ref.png | Bin 0 -> 8655 bytes + test/reference/mesh-pattern-conical.rgb24.ref.png | Bin 0 -> 8655 bytes + .../mesh-pattern-control-points.argb32.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-control-points.rgb24.ref.png | Bin 0 -> 10665 bytes + test/reference/mesh-pattern-fold.argb32.ref.png | Bin 0 -> 52980 bytes + test/reference/mesh-pattern-fold.rgb24.ref.png | Bin 0 -> 52980 bytes + test/reference/mesh-pattern-overlap.argb32.ref.png | Bin 0 -> 9129 bytes + test/reference/mesh-pattern-overlap.rgb24.ref.png | Bin 0 -> 9129 bytes + .../reference/mesh-pattern-transformed.argb32.ref.png | Bin 0 -> 14463 bytes + test/reference/mesh-pattern-transformed.rgb24.ref.png | Bin 0 -> 14463 bytes + test/reference/mesh-pattern.argb32.ref.png | Bin 0 -> 19566 bytes + test/reference/mesh-pattern.rgb24.ref.png | Bin 0 -> 19566 bytes + test/reference/mime-data.argb32.ref.png | Bin 0 -> 185 bytes + test/reference/mime-data.rgb24.ref.png | Bin 0 -> 185 bytes + test/reference/miter-precision.argb32.ref.png | Bin 0 -> 1030 bytes + test/reference/miter-precision.rgb24.ref.png | Bin 0 -> 1030 bytes + test/reference/move-to-show-surface.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/move-to-show-surface.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/negative-stride-image.argb32.ref.png | Bin 0 -> 81121 bytes + test/reference/negative-stride-image.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/new-sub-path.argb32.ref.png | Bin 331 -> 408 bytes + test/reference/new-sub-path.rgb24.ref.png | Bin 303 -> 371 bytes + test/reference/nil-surface.argb32.ref.png | Bin 0 -> 88 bytes + test/reference/nil-surface.rgb24.ref.png | Bin 106 -> 87 bytes + test/reference/operator-alpha-alpha.argb32.ref.png | Bin 0 -> 3441 bytes + test/reference/operator-alpha-alpha.rgb24.ref.png | Bin 0 -> 3441 bytes + test/reference/operator-alpha.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.rgb24.ref.png | Bin 229 -> 205 bytes + test/reference/operator-clear.argb32.ref.png | Bin 1080 -> 1071 bytes + test/reference/operator-clear.rgb24.ref.png | Bin 948 -> 947 bytes + test/reference/operator-source.argb32.ref.png | Bin 5538 -> 5585 bytes + test/reference/operator-source.rgb24.ref.png | Bin 3876 -> 3954 bytes + test/reference/operator.argb32.ref.png | Bin 0 -> 238 bytes + test/reference/operator.rgb24.ref.png | Bin 217 -> 189 bytes + test/reference/over-above-source.argb32.ref.png | Bin 0 -> 564 bytes + test/reference/over-above-source.rgb24.ref.png | Bin 421 -> 465 bytes + test/reference/over-around-source.argb32.ref.png | Bin 0 -> 618 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 454 -> 501 bytes + test/reference/over-below-source.argb32.ref.png | Bin 0 -> 443 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 372 -> 377 bytes + test/reference/over-between-source.argb32.ref.png | Bin 0 -> 593 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 440 -> 460 bytes + test/reference/overlapping-boxes.argb32.ref.png | Bin 179 -> 210 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 170 -> 201 bytes + test/reference/overlapping-dash-caps.argb32.ref.png | Bin 0 -> 3986 bytes + test/reference/overlapping-dash-caps.rgb24.ref.png | Bin 0 -> 3986 bytes + test/reference/overlapping-glyphs.argb32.ref.png | Bin 2258 -> 2717 bytes + test/reference/overlapping-glyphs.rgb24.ref.png | Bin 1390 -> 1663 bytes + test/reference/paint-clip-fill-aa.argb32.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-aa.rgb24.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-mono.argb32.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-mono.rgb24.ref.png | Bin 0 -> 327 bytes + test/reference/paint-repeat.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/paint-repeat.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/paint-source-alpha.argb32.ref.png | Bin 0 -> 224 bytes + test/reference/paint-source-alpha.rgb24.ref.png | Bin 0 -> 224 bytes + .../paint-with-alpha-clip-mask.argb32.ref.png | Bin 0 -> 340 bytes + .../paint-with-alpha-clip-mask.rgb24.ref.png | Bin 0 -> 340 bytes + test/reference/paint-with-alpha-clip.argb32.ref.png | Bin 0 -> 290 bytes + test/reference/paint-with-alpha-clip.rgb24.ref.png | Bin 0 -> 290 bytes + .../paint-with-alpha-solid-clip.argb32.ref.png | Bin 0 -> 248 bytes + .../paint-with-alpha-solid-clip.rgb24.ref.png | Bin 0 -> 248 bytes + test/reference/paint-with-alpha.argb32.ref.png | Bin 0 -> 224 bytes + test/reference/paint-with-alpha.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/paint.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/paint.rgb24.ref.png | Bin 0 -> 93 bytes + .../reference/partial-clip-text-bottom.argb32.ref.png | Bin 0 -> 261 bytes + test/reference/partial-clip-text-bottom.rgb24.ref.png | Bin 0 -> 261 bytes + test/reference/partial-clip-text-left.argb32.ref.png | Bin 0 -> 301 bytes + test/reference/partial-clip-text-left.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/partial-clip-text-right.argb32.ref.png | Bin 0 -> 155 bytes + test/reference/partial-clip-text-right.rgb24.ref.png | Bin 0 -> 155 bytes + test/reference/partial-clip-text-top.argb32.ref.png | Bin 0 -> 181 bytes + test/reference/partial-clip-text-top.rgb24.ref.png | Bin 0 -> 181 bytes + .../partial-coverage-half-reference.argb32.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-half-reference.rgb24.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-reference.argb32.ref.png | Bin 0 -> 202 bytes + .../partial-coverage-reference.rgb24.ref.png | Bin 0 -> 202 bytes + ...al-coverage-three-quarter-reference.argb32.ref.png | Bin 0 -> 186 bytes + ...ial-coverage-three-quarter-reference.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/pass-through.argb32.ref.png | Bin 0 -> 221 bytes + test/reference/pass-through.rgb24.ref.png | Bin 179 -> 158 bytes + test/reference/path-append.argb32.ref.png | Bin 0 -> 6144 bytes + test/reference/path-append.rgb24.ref.png | Bin 0 -> 6144 bytes + test/reference/path-stroke-twice.argb32.ref.png | Bin 0 -> 240 bytes + test/reference/path-stroke-twice.rgb24.ref.png | Bin 0 -> 240 bytes + test/reference/pattern-getters.argb32.ref.png | Bin 0 -> 87 bytes + test/reference/pattern-getters.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/pixman-rotate.argb32.ref.png | Bin 0 -> 260 bytes + test/reference/pixman-rotate.rgb24.ref.png | Bin 244 -> 225 bytes + test/reference/pthread-same-source.argb32.ref.png | Bin 0 -> 1000 bytes + test/reference/pthread-same-source.rgb24.ref.png | Bin 0 -> 1000 bytes + test/reference/pthread-show-text.argb32.ref.png | Bin 0 -> 30199 bytes + test/reference/pthread-show-text.rgb24.ref.png | Bin 0 -> 30199 bytes + test/reference/pthread-similar.argb32.ref.png | Bin 0 -> 170 bytes + test/reference/pthread-similar.rgb24.ref.png | Bin 0 -> 170 bytes + test/reference/push-group-color.argb32.ref.png | Bin 0 -> 2892 bytes + test/reference/push-group-color.rgb24.ref.png | Bin 0 -> 2892 bytes + test/reference/push-group-path-offset.argb32.ref.png | Bin 0 -> 186 bytes + test/reference/push-group-path-offset.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/push-group.argb32.ref.png | Bin 0 -> 3062 bytes + test/reference/push-group.rgb24.ref.png | Bin 2684 -> 2899 bytes + test/reference/radial-gradient-mask.argb32.ref.png | Bin 0 -> 286065 bytes + test/reference/radial-gradient-mask.rgb24.ref.png | Bin 0 -> 286065 bytes + .../reference/radial-gradient-one-stop.argb32.ref.png | Bin 0 -> 6306 bytes + test/reference/radial-gradient-one-stop.rgb24.ref.png | Bin 0 -> 6306 bytes + test/reference/radial-gradient.argb32.ref.png | Bin 0 -> 382283 bytes + test/reference/radial-gradient.rgb24.ref.png | Bin 0 -> 382283 bytes + .../random-intersections-curves-eo.argb32.ref.png | Bin 0 -> 245848 bytes + .../random-intersections-curves-eo.rgb24.ref.png | Bin 0 -> 245848 bytes + .../random-intersections-curves-nz.argb32.ref.png | Bin 0 -> 265249 bytes + .../random-intersections-curves-nz.rgb24.ref.png | Bin 0 -> 265249 bytes + test/reference/random-intersections-eo.argb32.ref.png | Bin 0 -> 136632 bytes + test/reference/random-intersections-eo.rgb24.ref.png | Bin 0 -> 136632 bytes + .../random-intersections-nonzero.argb32.ref.png | Bin 0 -> 142139 bytes + .../random-intersections-nonzero.rgb24.ref.png | Bin 0 -> 142139 bytes + test/reference/raster-source.argb32.ref.png | Bin 0 -> 1209 bytes + test/reference/raster-source.rgb24.ref.png | Bin 0 -> 1209 bytes + test/reference/record-fill-alpha.ref.png | Bin 2171 -> 2839 bytes + test/reference/record-paint-alpha-clip-mask.ref.png | Bin 340 -> 333 bytes + .../reference/rectangle-rounding-error.argb32.ref.png | Bin 0 -> 212 bytes + test/reference/rectangle-rounding-error.rgb24.ref.png | Bin 0 -> 212 bytes + test/reference/rectilinear-dash.argb32.ref.png | Bin 0 -> 291 bytes + test/reference/rectilinear-dash.rgb24.ref.png | Bin 0 -> 291 bytes + test/reference/rectilinear-fill.argb32.ref.png | Bin 0 -> 151 bytes + test/reference/rectilinear-fill.rgb24.ref.png | Bin 0 -> 151 bytes + test/reference/rectilinear-grid.argb32.ref.png | Bin 0 -> 569 bytes + test/reference/rectilinear-grid.rgb24.ref.png | Bin 0 -> 569 bytes + test/reference/rectilinear-miter-limit.argb32.ref.png | Bin 0 -> 145 bytes + test/reference/rectilinear-miter-limit.rgb24.ref.png | Bin 0 -> 145 bytes + test/reference/rectilinear-stroke.argb32.ref.png | Bin 0 -> 172 bytes + test/reference/rectilinear-stroke.rgb24.ref.png | Bin 0 -> 172 bytes + test/reference/reflected-stroke.argb32.ref.png | Bin 0 -> 5119 bytes + test/reference/reflected-stroke.rgb24.ref.png | Bin 0 -> 5119 bytes + test/reference/rel-path.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/rel-path.rgb24.ref.png | Bin 183 -> 216 bytes + test/reference/rgb24-ignore-alpha.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/rgb24-ignore-alpha.rgb24.ref.png | Bin 0 -> 97 bytes + .../rotate-clip-image-surface-paint.argb32.ref.png | Bin 0 -> 331 bytes + .../rotate-clip-image-surface-paint.rgb24.ref.png | Bin 0 -> 331 bytes + ...ip-image-surface-paint.xlib-fallback.rgb24.ref.png | Bin 0 -> 303 bytes + ...clip-image-surface-paint.xlib-window.rgb24.ref.png | Bin 0 -> 303 bytes + ...otate-clip-image-surface-paint.xlib.argb32.ref.png | Bin 0 -> 303 bytes + ...rotate-clip-image-surface-paint.xlib.rgb24.ref.png | Bin 0 -> 303 bytes + .../rotate-image-surface-paint.argb32.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.rgb24.ref.png | Bin 0 -> 220 bytes + ...te-image-surface-paint.xlib-fallback.rgb24.ref.png | Bin 0 -> 220 bytes + ...tate-image-surface-paint.xlib-window.rgb24.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.xlib.argb32.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.xlib.rgb24.ref.png | Bin 0 -> 220 bytes + test/reference/rotated-clip.argb32.ref.png | Bin 0 -> 3773 bytes + test/reference/rotated-clip.rgb24.ref.png | Bin 0 -> 3773 bytes + test/reference/rounded-rectangle-fill.argb32.ref.png | Bin 0 -> 787 bytes + test/reference/rounded-rectangle-fill.rgb24.ref.png | Bin 0 -> 787 bytes + .../reference/rounded-rectangle-stroke.argb32.ref.png | Bin 0 -> 951 bytes + test/reference/rounded-rectangle-stroke.rgb24.ref.png | Bin 0 -> 951 bytes + .../scale-down-source-surface-paint.argb32.ref.png | Bin 0 -> 96 bytes + .../scale-down-source-surface-paint.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/scale-offset-image.argb32.ref.png | Bin 0 -> 9748 bytes + test/reference/scale-offset-image.rgb24.ref.png | Bin 0 -> 9748 bytes + test/reference/scale-offset-similar.argb32.ref.png | Bin 0 -> 9748 bytes + test/reference/scale-offset-similar.rgb24.ref.png | Bin 0 -> 9748 bytes + .../scale-offset-xlib-fallback.rgb24.ref.png | Bin 0 -> 9120 bytes + test/reference/scale-offset-xlib-window.rgb24.ref.png | Bin 0 -> 9120 bytes + test/reference/scale-offset-xlib.argb32.ref.png | Bin 0 -> 9120 bytes + test/reference/scale-offset-xlib.rgb24.ref.png | Bin 0 -> 9120 bytes + .../scale-source-surface-paint.argb32.ref.png | Bin 0 -> 128 bytes + .../scale-source-surface-paint.rgb24.ref.png | Bin 136 -> 117 bytes + test/reference/select-font-face.argb32.ref.png | Bin 0 -> 2250 bytes + test/reference/select-font-face.rgb24.ref.png | Bin 0 -> 2250 bytes + test/reference/self-copy.argb32.ref.png | Bin 0 -> 257 bytes + test/reference/self-copy.rgb24.ref.png | Bin 0 -> 257 bytes + test/reference/self-intersecting.argb32.ref.png | Bin 0 -> 168 bytes + test/reference/self-intersecting.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/set-source.argb32.ref.png | Bin 0 -> 101 bytes + test/reference/set-source.rgb24.ref.png | Bin 120 -> 101 bytes + test/reference/shape-general-convex.argb32.ref.png | Bin 0 -> 2742 bytes + test/reference/shape-general-convex.rgb24.ref.png | Bin 0 -> 2742 bytes + test/reference/shape-sierpinski.argb32.ref.png | Bin 0 -> 63714 bytes + test/reference/shape-sierpinski.rgb24.ref.png | Bin 0 -> 63714 bytes + test/reference/show-glyphs-advance.argb32.ref.png | Bin 0 -> 1394 bytes + test/reference/show-glyphs-advance.rgb24.ref.png | Bin 0 -> 1394 bytes + test/reference/show-glyphs-many.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/show-glyphs-many.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/show-text-current-point.argb32.ref.png | Bin 0 -> 2151 bytes + test/reference/show-text-current-point.rgb24.ref.png | Bin 0 -> 2151 bytes + test/reference/skew-extreme.argb32.ref.png | Bin 0 -> 799 bytes + test/reference/skew-extreme.rgb24.ref.png | Bin 0 -> 799 bytes + test/reference/smask-fill.argb32.ref.png | Bin 0 -> 1197 bytes + test/reference/smask-fill.rgb24.ref.png | Bin 0 -> 1197 bytes + test/reference/smask-image-mask.argb32.ref.png | Bin 0 -> 619 bytes + test/reference/smask-image-mask.rgb24.ref.png | Bin 0 -> 619 bytes + .../smask-image-mask.xlib-fallback.rgb24.ref.png | Bin 0 -> 619 bytes + .../smask-image-mask.xlib-window.rgb24.ref.png | Bin 0 -> 619 bytes + test/reference/smask-image-mask.xlib.argb32.ref.png | Bin 0 -> 619 bytes + test/reference/smask-image-mask.xlib.rgb24.ref.png | Bin 0 -> 619 bytes + test/reference/smask-mask.argb32.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-mask.rgb24.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-paint.argb32.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-paint.rgb24.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-stroke.argb32.ref.png | Bin 0 -> 1709 bytes + test/reference/smask-stroke.rgb24.ref.png | Bin 0 -> 1709 bytes + test/reference/smask-text.argb32.ref.png | Bin 0 -> 1661 bytes + test/reference/smask-text.rgb24.ref.png | Bin 0 -> 1661 bytes + test/reference/smask.argb32.ref.png | Bin 0 -> 3414 bytes + test/reference/smask.rgb24.ref.png | Bin 0 -> 3414 bytes + .../solid-pattern-cache-stress.argb32.ref.png | Bin 0 -> 87 bytes + .../solid-pattern-cache-stress.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/source-clip-scale.argb32.ref.png | Bin 0 -> 136 bytes + test/reference/source-clip-scale.rgb24.ref.png | Bin 0 -> 136 bytes + test/reference/source-clip.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/source-clip.rgb24.ref.png | Bin 0 -> 111 bytes + .../source-surface-scale-paint.argb32.ref.png | Bin 0 -> 120 bytes + .../source-surface-scale-paint.rgb24.ref.png | Bin 133 -> 114 bytes + test/reference/spline-decomposition.argb32.ref.png | Bin 0 -> 19520 bytes + test/reference/spline-decomposition.rgb24.ref.png | Bin 0 -> 19520 bytes + test/reference/stride-12-image.argb32.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-image.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-xlib-fallback.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-xlib-window.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-xlib.argb32.ref.png | Bin 0 -> 81121 bytes + test/reference/stride-12-xlib.rgb24.ref.png | Bin 0 -> 81121 bytes + test/reference/stroke-ctm-caps.argb32.ref.png | Bin 0 -> 942 bytes + test/reference/stroke-ctm-caps.rgb24.ref.png | Bin 0 -> 942 bytes + test/reference/stroke-image.argb32.ref.png | Bin 0 -> 1424 bytes + test/reference/stroke-image.rgb24.ref.png | Bin 0 -> 1424 bytes + test/reference/stroke-open-box.argb32.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-open-box.rgb24.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-pattern.argb32.ref.png | Bin 0 -> 1491 bytes + test/reference/stroke-pattern.rgb24.ref.png | Bin 0 -> 1491 bytes + test/reference/stroke-xlib-fallback.rgb24.ref.png | Bin 0 -> 1467 bytes + test/reference/stroke-xlib-window.rgb24.ref.png | Bin 0 -> 1467 bytes + test/reference/stroke-xlib.argb32.ref.png | Bin 0 -> 1467 bytes + test/reference/stroke-xlib.rgb24.ref.png | Bin 0 -> 1467 bytes + test/reference/subsurface-image-repeat.argb32.ref.png | Bin 0 -> 915 bytes + test/reference/subsurface-image-repeat.rgb24.ref.png | Bin 0 -> 915 bytes + ...ubsurface-image-repeat.xlib-fallback.rgb24.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.xlib-window.rgb24.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.xlib.argb32.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.xlib.rgb24.ref.png | Bin 0 -> 915 bytes + test/reference/subsurface-modify-child.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-modify-child.rgb24.ref.png | Bin 0 -> 197 bytes + .../reference/subsurface-modify-parent.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-modify-parent.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-pad.argb32.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-pad.rgb24.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-reflect.argb32.ref.png | Bin 0 -> 210 bytes + test/reference/subsurface-reflect.rgb24.ref.png | Bin 0 -> 210 bytes + test/reference/subsurface-repeat.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-repeat.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-scale.argb32.ref.png | Bin 0 -> 5921 bytes + test/reference/subsurface-scale.rgb24.ref.png | Bin 0 -> 5921 bytes + .../subsurface-similar-repeat.argb32.ref.png | Bin 0 -> 197 bytes + .../reference/subsurface-similar-repeat.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface.argb32.ref.png | Bin 0 -> 1811 bytes + test/reference/subsurface.rgb24.ref.png | Bin 0 -> 1811 bytes + .../surface-pattern-big-scale-down.argb32.ref.png | Bin 0 -> 191 bytes + .../surface-pattern-big-scale-down.rgb24.ref.png | Bin 0 -> 191 bytes + .../reference/surface-pattern-operator.argb32.ref.png | Bin 4807 -> 5217 bytes + test/reference/surface-pattern-operator.rgb24.ref.png | Bin 1866 -> 1942 bytes + ...face-pattern-scale-down-extend-none.argb32.ref.png | Bin 0 -> 329 bytes + ...rface-pattern-scale-down-extend-none.rgb24.ref.png | Bin 0 -> 329 bytes + ...rface-pattern-scale-down-extend-pad.argb32.ref.png | Bin 0 -> 320 bytes + ...urface-pattern-scale-down-extend-pad.rgb24.ref.png | Bin 0 -> 320 bytes + ...e-pattern-scale-down-extend-reflect.argb32.ref.png | Bin 0 -> 328 bytes + ...ce-pattern-scale-down-extend-reflect.rgb24.ref.png | Bin 0 -> 328 bytes + ...ce-pattern-scale-down-extend-repeat.argb32.ref.png | Bin 0 -> 330 bytes + ...ace-pattern-scale-down-extend-repeat.rgb24.ref.png | Bin 0 -> 330 bytes + .../surface-pattern-scale-down.argb32.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-down.rgb24.ref.png | Bin 0 -> 1326 bytes + .../reference/surface-pattern-scale-up.argb32.ref.png | Bin 0 -> 4020 bytes + test/reference/surface-pattern-scale-up.rgb24.ref.png | Bin 0 -> 4020 bytes + test/reference/surface-pattern.argb32.ref.png | Bin 0 -> 11088 bytes + test/reference/surface-pattern.rgb24.ref.png | Bin 0 -> 11088 bytes + test/reference/text-antialias-gray.argb32.ref.png | Bin 0 -> 966 bytes + test/reference/text-antialias-gray.rgb24.ref.png | Bin 0 -> 966 bytes + test/reference/text-antialias-none.argb32.ref.png | Bin 0 -> 265 bytes + test/reference/text-antialias-none.rgb24.ref.png | Bin 0 -> 265 bytes + .../text-antialias-subpixel-bgr.argb32.ref.png | Bin 0 -> 1005 bytes + .../text-antialias-subpixel-bgr.rgb24.ref.png | Bin 0 -> 1005 bytes + .../text-antialias-subpixel-rgb.argb32.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel-rgb.rgb24.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel-vbgr.argb32.ref.png | Bin 0 -> 985 bytes + .../text-antialias-subpixel-vbgr.rgb24.ref.png | Bin 0 -> 985 bytes + .../text-antialias-subpixel-vrgb.argb32.ref.png | Bin 0 -> 1009 bytes + .../text-antialias-subpixel-vrgb.rgb24.ref.png | Bin 0 -> 1009 bytes + test/reference/text-antialias-subpixel.argb32.ref.png | Bin 0 -> 1013 bytes + test/reference/text-antialias-subpixel.rgb24.ref.png | Bin 0 -> 1013 bytes + test/reference/text-glyph-range.argb32.ref.png | Bin 0 -> 1928 bytes + test/reference/text-glyph-range.rgb24.ref.png | Bin 0 -> 1928 bytes + test/reference/text-pattern.argb32.ref.png | Bin 0 -> 3455 bytes + test/reference/text-pattern.rgb24.ref.png | Bin 0 -> 2684 bytes + test/reference/text-rotate.argb32.ref.png | Bin 0 -> 16655 bytes + test/reference/text-rotate.rgb24.ref.png | Bin 0 -> 16655 bytes + test/reference/text-transform.argb32.ref.png | Bin 0 -> 5579 bytes + test/reference/text-transform.rgb24.ref.png | Bin 0 -> 5579 bytes + test/reference/tiger.argb32.ref.png | Bin 0 -> 93916 bytes + test/reference/tiger.rgb24.ref.png | Bin 0 -> 93916 bytes + test/reference/tighten-bounds.argb32.ref.png | Bin 8972 -> 9127 bytes + test/reference/tighten-bounds.rgb24.ref.png | Bin 8188 -> 8433 bytes + test/reference/transforms.argb32.ref.png | Bin 0 -> 348 bytes + test/reference/transforms.rgb24.ref.png | Bin 0 -> 348 bytes + test/reference/translate-show-surface.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/translate-show-surface.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/trap-clip.argb32.ref.png | Bin 0 -> 5810 bytes + test/reference/trap-clip.rgb24.ref.png | Bin 5328 -> 5433 bytes + test/reference/twin-antialias-gray.argb32.ref.png | Bin 0 -> 3990 bytes + test/reference/twin-antialias-gray.rgb24.ref.png | Bin 0 -> 3990 bytes + test/reference/twin-antialias-mixed.argb32.ref.png | Bin 0 -> 2230 bytes + test/reference/twin-antialias-mixed.rgb24.ref.png | Bin 0 -> 2230 bytes + test/reference/twin-antialias-none.argb32.ref.png | Bin 0 -> 690 bytes + test/reference/twin-antialias-none.rgb24.ref.png | Bin 0 -> 690 bytes + test/reference/twin-antialias-subpixel.argb32.ref.png | Bin 0 -> 3990 bytes + test/reference/twin-antialias-subpixel.rgb24.ref.png | Bin 0 -> 3990 bytes + test/reference/twin.argb32.ref.png | Bin 0 -> 3990 bytes + test/reference/twin.rgb24.ref.png | Bin 0 -> 3990 bytes + test/reference/unaligned-box.argb32.ref.png | Bin 0 -> 496 bytes + test/reference/unaligned-box.rgb24.ref.png | Bin 0 -> 496 bytes + test/reference/unantialiased-shapes.argb32.ref.png | Bin 0 -> 3926 bytes + test/reference/unantialiased-shapes.rgb24.ref.png | Bin 0 -> 3926 bytes + test/reference/unbounded-operator.argb32.ref.png | Bin 2618 -> 2666 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 1223 -> 1300 bytes + test/reference/unclosed-strokes.argb32.ref.png | Bin 0 -> 1901 bytes + test/reference/unclosed-strokes.rgb24.ref.png | Bin 0 -> 1901 bytes + test/reference/user-font-mask.argb32.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-mask.rgb24.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-proxy.argb32.ref.png | Bin 0 -> 16941 bytes + test/reference/user-font-proxy.rgb24.ref.png | Bin 0 -> 16941 bytes + test/reference/user-font-rescale.argb32.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font-rescale.rgb24.ref.png | Bin 0 -> 14883 bytes + test/reference/user-font.argb32.ref.png | Bin 0 -> 6478 bytes + test/reference/user-font.rgb24.ref.png | Bin 0 -> 6478 bytes + test/reference/white-in-noop.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/white-in-noop.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/world-map-fill.argb32.ref.png | Bin 0 -> 57308 bytes + test/reference/world-map-fill.rgb24.ref.png | Bin 0 -> 57308 bytes + test/reference/world-map-stroke.argb32.ref.png | Bin 0 -> 65152 bytes + test/reference/world-map-stroke.rgb24.ref.png | Bin 0 -> 65152 bytes + test/reference/world-map.argb32.ref.png | Bin 0 -> 70463 bytes + test/reference/world-map.rgb24.ref.png | Bin 0 -> 70463 bytes + test/reference/xcb-huge-image-shm.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-huge-image-shm.rgb24.ref.png | Bin 0 -> 97 bytes + .../xcb-huge-image-shm.xlib-fallback.rgb24.ref.png | Bin 0 -> 97 bytes + .../xcb-huge-image-shm.xlib-window.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-huge-image-shm.xlib.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-huge-image-shm.xlib.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-snapshot-assert.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-snapshot-assert.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-stress-cache.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-stress-cache.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcomposite-projection.argb32.ref.png | Bin 0 -> 1108 bytes + test/reference/xcomposite-projection.rgb24.ref.png | Bin 0 -> 1108 bytes + test/reference/xlib-expose-event.argb32.ref.png | Bin 0 -> 40717 bytes + test/reference/xlib-expose-event.rgb24.ref.png | Bin 0 -> 40717 bytes + test/reference/zero-alpha.argb32.ref.png | Bin 0 -> 91 bytes + test/reference/zero-alpha.rgb24.ref.png | Bin 0 -> 91 bytes + test/reference/zero-mask.argb32.ref.png | Bin 0 -> 402 bytes + 807 files changed, 0 insertions(+), 0 deletions(-) + +commit 01ea2d31cbbc12dafbe7831ef8c08a1bc78046a7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 18 21:46:31 2012 +1030 + + type1-subset: ensure additional glyphs required by seac operator are parsed + + src/cairo-type1-subset.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit 09b90611a1bca771968417c589df00c0b2d3c0e6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 18 17:10:55 2012 +1030 + + type1-subset: some fonts have "noaccess put" instead of NP in the Subrs + + src/cairo-type1-subset.c | 47 +++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 37 insertions(+), 10 deletions(-) + +commit 6a90b407aafe6e7f4ed614fbcd1228c46b0af2a2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Feb 18 08:55:59 2012 +0100 + + build: Make 'all' the default target in the base Makefile.win32 build + + Having the 'inform' target as default is misleading. + + Makefile.win32 | 2 ++ + 1 file changed, 2 insertions(+) + +commit 93b0fcffc7a098333aa219ce0d59b7f9d1ac35e6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Feb 16 19:53:56 2012 +0100 + + test: Create output directory even on Win32 + + This avoids cluttering the test directory with thousands of PNG files + and makes the behavior more consistent with other OSes. + + test/cairo-test.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 80c46d400b0bc329ca3b09eb87684920ec1045ef +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 11 18:16:04 2011 +0100 + + test: Fix any2ppm on MSVC + + C99 initialization is not allowed. + + Error macros are used even in the non-daemon version, hence errno.h + should always be included. + + Fixes: + + any2ppm.c(107) : error C2065: 'EINTR' : undeclared identifier + any2ppm.c(107) : error C2051: case expression not constant + any2ppm.c(108) : error C2065: 'EAGAIN' : undeclared identifier + any2ppm.c(108) : error C2051: case expression not constant + any2ppm.c(271) : error C2059: syntax error : '.' + + test/any2ppm.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit b2d978a8150cb3f5bb66b3c3971fadc908d82e82 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 11 18:14:44 2011 +0100 + + test: Compile any2ppm on Windows + + any2ppm is required in order to test the script backend. + + test/Makefile.win32 | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +commit ed803a193585544d2c4a290e95700cf9b68d0f10 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Feb 16 19:21:47 2012 +0100 + + build: Add 'clean' target to Makefile.win32 build system + + The Makefile.win32 in the subdirectories provide a working 'clean' + target (defined in Makefile.win32.common), the central Makefile.win32 + 'clean' target does not do anything. + + Replace the noop 'clean' target with one that cleans all the subdirs. + + Makefile.am | 1 + + Makefile.win32 | 8 +++++++- + build/Makefile.win32.common | 15 +-------------- + build/Makefile.win32.inform | 13 +++++++++++++ + 4 files changed, 22 insertions(+), 15 deletions(-) + +commit c60627e8af240189a16d7118230bf6df6d300f21 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Feb 15 23:37:30 2012 +0100 + + device: Minor documentation fixes + + Do not list CAIRO_DEVICE_TYPE_INVALID twice. + + CAIRO_DEVICE_TYPE_WIN32 does not indicate that the type is cogl, but + win32. + + src/cairo.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 83af31f0f31bee5570148f51d9371e848b716486 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 15 19:48:07 2012 +0000 + + win32: Cast the surface to an image-surface to find its parent (compile fix) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/win32/cairo-win32-display-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df608e0fab542562eb00b4f3c84735946289226a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 15 18:25:35 2012 +0000 + + win32: Fix lifetime tracking of create_similar_image() + + As we return the child image to the user and so perform the reference + tracking on it and not the parent win32 display surface, we need to add + a call to destroy the parent from the image surface. This of course + complicates the normal scenario of destroying the parent first, and so + in that case we need to unhook the image->parent before freeing the + surface->image. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface-private.h | 13 +++++++++++++ + src/cairo-image-surface.c | 5 +++++ + src/win32/cairo-win32-display-surface.c | 6 +++++- + 3 files changed, 23 insertions(+), 1 deletion(-) + +commit dfb8b131f54752462b7888fe6401b239aab89ff8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Feb 15 19:05:09 2012 +0100 + + win32: Fix Makefile.win32 build + + The Makefile.win32 build system assumes that the files are in the same + directory level. If this is not the case, the compiler fails when it + tries to write the object files to a non-existing directory. + + This can be fixed simply by making sure that the destination directory + always exists. + + Fixes: + + fatal error C1083: Cannot open compiler generated file: + 'release/win32/cairo-win32-debug.obj': No such file or directory + + build/Makefile.win32.common | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ae3319890eacd1c8282ca6df7b263ac74abb5f8d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 12 11:25:07 2012 +0000 + + win32: Rebase on the new compositor infrastructure + + Try and undo all the damage that has acrued over the years by plugging + into the compositor pipeline. + + References: https://bugs.freedesktop.org/show_bug.cgi?id=42739 + References: https://bugs.freedesktop.org/show_bug.cgi?id=42821 + References: https://bugs.freedesktop.org/show_bug.cgi?id=33081 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 6 +- + src/cairo-image-compositor.c | 39 + + src/cairo-image-source.c | 25 + + src/cairo-image-surface-private.h | 9 + + src/cairo-image-surface.c | 25 +- + src/cairo-surface-backend-private.h | 10 + + src/cairo-surface-private.h | 10 + + src/cairo-surface.c | 20 + + src/cairo-system.c | 97 -- + src/cairo-traps-compositor.c | 62 + + src/cairo.h | 2 + + src/cairoint.h | 6 + + src/win32/cairo-win32-debug.c | 87 ++ + src/win32/cairo-win32-device.c | 189 +++ + src/win32/cairo-win32-display-surface.c | 1031 ++++++++++++++++ + src/win32/cairo-win32-font.c | 23 +- + src/win32/cairo-win32-gdi-compositor.c | 646 ++++++++++ + src/win32/cairo-win32-printing-surface.c | 324 ++--- + src/win32/cairo-win32-private.h | 183 +-- + src/win32/cairo-win32-surface.c | 1960 ++---------------------------- + src/win32/cairo-win32-system.c | 89 ++ + 21 files changed, 2623 insertions(+), 2220 deletions(-) + +commit 92c0b37d04f9df8df53a455c8e8dda1946c84c87 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 12 10:17:12 2012 +0000 + + win32: Move to separate directoy + + I suspect I may split the win32 code into a few more files, so move it + to its own directory to reduce the clutter. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 12 +- + src/cairo-win32-font.c | 2437 ------------------------------ + src/cairo-win32-printing-surface.c | 1915 ----------------------- + src/cairo-win32-private.h | 219 --- + src/cairo-win32-surface.c | 2098 ------------------------- + src/win32/cairo-win32-font.c | 2437 ++++++++++++++++++++++++++++++ + src/win32/cairo-win32-printing-surface.c | 1915 +++++++++++++++++++++++ + src/win32/cairo-win32-private.h | 219 +++ + src/win32/cairo-win32-surface.c | 2087 +++++++++++++++++++++++++ + 9 files changed, 6666 insertions(+), 6673 deletions(-) + +commit 8bea52bb0b55e2b041fbd43bc36221b5eb07b863 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 12 12:32:49 2012 +0000 + + Add preliminary damage tracking + + This is initially based around the requirements for handling internal + fallbacks to the image compositor and reducing the number of pixels + required to be transferred. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 2 + + src/cairo-compositor.c | 21 +++++ + src/cairo-damage-private.h | 82 +++++++++++++++++ + src/cairo-damage.c | 214 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-image-surface.c | 6 +- + src/cairo-region-private.h | 6 ++ + src/cairo-region.c | 32 +++++++ + src/cairo-surface-private.h | 1 + + src/cairo-surface.c | 17 ++++ + src/cairo-types-private.h | 1 + + 10 files changed, 379 insertions(+), 3 deletions(-) + +commit c7d8ec72e6d14236d20b068a404d166496872a54 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sun Feb 12 10:36:17 2012 +0100 + + doc: fix typo + + The pattern creation function call in the example code has one _mesh too + much. This hopefully fixes the mesh mismatch mess :) + + Signed-off-by: Nis Martensen <nis.martensen@web.de> + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4f81940749b680c6e48d393fd13108775efa38eb +Author: Oleg Romashin <romaxa@gmail.com> +Date: Sun Feb 12 01:34:34 2012 -0500 + + qt: Fix compilation, also minor fix for building against Qt5 + + Update to latest surface backend structure, removed obsolete functions + and fixed functions API in order to be compatible with backend definition. + + Fixed compilation with Qt5 + + boilerplate/cairo-boilerplate-qt.cpp | 4 +- + src/cairo-default-context-private.h | 4 + + src/cairo-qt-surface.cpp | 184 ++++------------------------------- + 3 files changed, 25 insertions(+), 167 deletions(-) + +commit 76df401263a45881fec557396dd4895d0af540a3 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Feb 11 23:24:27 2012 +0100 + + doc: Fix pattern name mismatch + + In the example code, the mesh pattern variable was named "mesh" and + "pattern". Just use "pattern". + + Signed-off-by: Andrea Canciani <ranma42@gmail.com> + + src/cairo-pattern.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 469994ac199179b40bafee951c92595706256cea +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 30 15:34:10 2012 +0100 + + observer: Silence gcc warning + + GCC complains that: + + cairo-surface-observer.c:289:26: warning: ignoring return value of + 'cairo_device_acquire', declared with attribute warn_unused_result + [-Wunused-result] + + Explain why it's safe to ignore it in a comment. + + src/cairo-surface-observer.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit f2567e95a164d3874909baf09b94b45288604e53 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 30 15:12:57 2012 +0100 + + observer: Return status when printing the observed data + + Making cairo_surface_observer_print() and + cairo_device_observer_print() return the status of the observer or of + the stream makes it possible to correctly track what kind of error + happens if the print is not successful. + + This makes the functions more consistent with existing API with a + similar signature like cairo_surface_write_to_png_stream(). + + src/cairo-surface-observer.c | 24 ++++++++++++------------ + src/cairo.h | 4 ++-- + 2 files changed, 14 insertions(+), 14 deletions(-) + +commit f7eaf37f0432952ce12708e32e0641fa97bfd715 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Feb 10 18:00:01 2012 +0100 + + Wrapper: Don't translate clips extents' origin + + If a bounded recording surface doesn't have its extents .x and .y at the + surface's origin, this code was translating all clips to make up for that. + However, the clip already is in device space. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41583 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 2f4645db84215f38ca0a19886de56971ce4f2d79 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Feb 10 17:52:45 2012 +0100 + + xlib-xcb: Make this compile again + + There was a typo in commit 2061cd81f26. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 154e6b052bca4189ef067dc9385b224803e6f053 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 10 09:20:21 2012 +0000 + + quartz: Add missing source hook + + Regression from 2061cd81f2. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45866 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-quartz-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8960a5d0d0ca3f92b9e727d5e35caaefd68ecd59 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 10 00:03:51 2012 +0000 + + analysis: replace open-coded _cairo_box_add_box() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 13 +++---------- + 1 file changed, 3 insertions(+), 10 deletions(-) + +commit e809cea6d055cb91fff7913985a7eba967d58818 +Author: Henry (Yu) Song <hsong@sisa.samsung.com> +Date: Thu Feb 9 23:38:37 2012 +0000 + + gl: initialize temporary surface with size same as subsurface + + Rather than the operation extents which may be larger. It would be + beneficial to trim to the intersection instead and tweak the pattern + matrices - however this is the fallback path and so hopefully less + frequently trod! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 38bf7a6526e378175b62b9c0eb92ce65c5d0e630 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 23:26:14 2012 +0000 + + gl: Transfer ownership of trapezoid mask to operand + + Signed-off-by: Henry (Yu) Song <hsong@sisa.samsung.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-traps-compositor.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 2886df60b040c6c8e7255a4385da5fb85531cbf3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 22:44:47 2012 +0000 + + polygon-intersection: The edge direction is immaterial + + When checking for continuations on the right-hand edge, the actual + direction of the edge is immaterial as it is sorted into ascending + y-order and the direction is fixed up when emitting into the output + polygon. + + Fixes assertion introduced with 658fa75a5c78c8. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon-intersect.c | 1 - + 1 file changed, 1 deletion(-) + +commit bb86e332da9a7837b6fd6476efd9be77572dd706 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 22:11:24 2012 +0000 + + traps: composite_boxes() is not a mask constructor + + Since it doesn't combine the clip in a single pass, don't claim to. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3443ad903d2ccff7d63a9116df7629d69d87d673 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 22:08:41 2012 +0000 + + spans: Pass unbounded operations to the spans compositors + + Only bail if we need to combine clipping with the spans (either for a + bounded or unbounded operation). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 16 +++++----------- + 1 file changed, 5 insertions(+), 11 deletions(-) + +commit 3023ff86d58f97f3b2d3304c337920647bc8a147 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 22:08:08 2012 +0000 + + clip: Apply the partial boxes for clip_combine_with_surface + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-surface.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit fb3a193959bbfa71308338182f208e3221ddfa04 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 22:06:18 2012 +0000 + + clip: Check whether an extents only clip contains the box + + If we steal the boxes, we leave behind an extents-only clip, i.e. only + without a path or boxes, in which case do not return FALSE for the + is-contained check on a rectangle. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit bbdb17fc1826ca50bdfc4e2666249d3e8e1fca4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 19:43:18 2012 +0000 + + tor: Restore the 256x15 sampling of the original rasteriser + + A quick hack escaped into the wild, as this was superseded by the + separate tor22 rasteriser. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 658fa75a5c78c8ca08bc5c1f8f29d50a9da0aaf5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 19:40:26 2012 +0000 + + polygon: Extend intersection edges to cover entire range + + By simply swapping the continuation edges, we end up with a set of edges + that are defined over a shorter range than their extents. Whilst this is + numerically stable at our normal precision we start to encounter issues + when using a coarser grid during rasterisation as the derivative of the + edge becomes unstable. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44722 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon-intersect.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit a349a312dcf3322d835bc3c58cecedff8914a55a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 16:20:26 2012 +0000 + + directfb: Discard long broken code and return to basics + + Rewrite the directfb backend as nothing more than a simpler image + compositor onto a shadowfb that is flushed back to the dfb surface as + required. Future refinements would be to add damage tracking, and to mix + the useful directfb operations (such as solid fills and alpha blends). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-directfb-surface.c | 2052 ++++++------------------------------- + src/cairo-image-surface-private.h | 46 + + src/cairo-image-surface.c | 10 +- + 3 files changed, 389 insertions(+), 1719 deletions(-) + +commit f4309795e90c638e1049f194e1bff30d172b52ce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 13:31:54 2012 +0000 + + test: Referesh traps (xlib) reference images for font updates + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/clip-operator.traps.argb32.ref.png | Bin 8153 -> 8160 bytes + test/reference/clip-operator.traps.rgb24.ref.png | Bin 3232 -> 3245 bytes + test/reference/clip-text.traps.argb32.ref.png | Bin 899 -> 899 bytes + test/reference/clip-text.traps.rgb24.ref.png | Bin 899 -> 899 bytes + .../font-matrix-translation.traps.argb32.ref.png | Bin 874 -> 0 bytes + .../reference/font-matrix-translation.traps.ref.png | Bin 0 -> 865 bytes + .../font-matrix-translation.traps.rgb24.ref.png | Bin 874 -> 0 bytes + .../ft-show-glyphs-positioning.traps.argb32.ref.png | Bin 3297 -> 0 bytes + .../ft-show-glyphs-positioning.traps.ref.png | Bin 0 -> 3243 bytes + .../ft-show-glyphs-positioning.traps.rgb24.ref.png | Bin 3297 -> 0 bytes + .../ft-show-glyphs-table.traps.argb32.ref.png | Bin 9893 -> 0 bytes + test/reference/ft-show-glyphs-table.traps.ref.png | Bin 0 -> 9975 bytes + .../ft-show-glyphs-table.traps.rgb24.ref.png | Bin 9893 -> 0 bytes + .../glyph-cache-pressure.traps.argb32.ref.png | Bin 2863 -> 0 bytes + test/reference/glyph-cache-pressure.traps.ref.png | Bin 0 -> 2858 bytes + .../glyph-cache-pressure.traps.rgb24.ref.png | Bin 2863 -> 0 bytes + test/reference/halo-transform.traps.argb32.ref.png | Bin 15118 -> 0 bytes + test/reference/halo-transform.traps.ref.png | Bin 0 -> 15122 bytes + test/reference/halo-transform.traps.rgb24.ref.png | Bin 15118 -> 0 bytes + test/reference/halo.traps.argb32.ref.png | Bin 8800 -> 0 bytes + test/reference/halo.traps.ref.png | Bin 0 -> 8594 bytes + test/reference/halo.traps.rgb24.ref.png | Bin 8800 -> 0 bytes + test/reference/inverse-text.base.argb32.ref.png | Bin 2166 -> 0 bytes + test/reference/inverse-text.base.rgb24.ref.png | Bin 2166 -> 0 bytes + test/reference/inverse-text.image16.ref.png | Bin 1863 -> 0 bytes + test/reference/inverse-text.ps.ref.png | Bin 776 -> 0 bytes + test/reference/inverse-text.quartz.ref.png | Bin 2565 -> 0 bytes + test/reference/inverse-text.ref.png | Bin 2166 -> 0 bytes + test/reference/inverse-text.traps.argb32.ref.png | Bin 2166 -> 0 bytes + test/reference/inverse-text.traps.ref.png | Bin 0 -> 2162 bytes + test/reference/inverse-text.traps.rgb24.ref.png | Bin 2166 -> 0 bytes + test/reference/operator-clear.traps.argb32.ref.png | Bin 1070 -> 1071 bytes + test/reference/operator-clear.traps.rgb24.ref.png | Bin 950 -> 950 bytes + test/reference/operator-source.traps.argb32.ref.png | Bin 5630 -> 5625 bytes + test/reference/operator-source.traps.rgb24.ref.png | Bin 3979 -> 3979 bytes + .../partial-clip-text-right.traps.argb32.ref.png | Bin 155 -> 0 bytes + .../reference/partial-clip-text-right.traps.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-right.traps.rgb24.ref.png | Bin 155 -> 0 bytes + .../partial-clip-text-top.traps.argb32.ref.png | Bin 173 -> 0 bytes + test/reference/partial-clip-text-top.traps.ref.png | Bin 0 -> 181 bytes + .../partial-clip-text-top.traps.rgb24.ref.png | Bin 173 -> 0 bytes + .../pthread-show-text.traps.argb32.ref.png | Bin 29759 -> 0 bytes + test/reference/pthread-show-text.traps.ref.png | Bin 0 -> 30199 bytes + .../reference/pthread-show-text.traps.rgb24.ref.png | Bin 29759 -> 0 bytes + .../radial-gradient-mask-source.traps.rgb24.ref.png | Bin 7747 -> 150945 bytes + .../reference/select-font-face.traps.argb32.ref.png | Bin 2245 -> 0 bytes + test/reference/select-font-face.traps.ref.png | Bin 0 -> 2250 bytes + test/reference/select-font-face.traps.rgb24.ref.png | Bin 2245 -> 0 bytes + .../show-glyphs-advance.traps.argb32.ref.png | Bin 1395 -> 0 bytes + test/reference/show-glyphs-advance.traps.ref.png | Bin 0 -> 1394 bytes + .../show-glyphs-advance.traps.rgb24.ref.png | Bin 1395 -> 0 bytes + .../show-text-current-point.traps.argb32.ref.png | Bin 2185 -> 0 bytes + .../reference/show-text-current-point.traps.ref.png | Bin 0 -> 2151 bytes + .../show-text-current-point.traps.rgb24.ref.png | Bin 2185 -> 0 bytes + test/reference/smask-text.traps.argb32.ref.png | Bin 1623 -> 0 bytes + test/reference/smask-text.traps.ref.png | Bin 0 -> 1661 bytes + test/reference/smask-text.traps.rgb24.ref.png | Bin 1623 -> 0 bytes + test/reference/smask.traps.argb32.ref.png | Bin 3404 -> 0 bytes + test/reference/smask.traps.ref.png | Bin 0 -> 3393 bytes + test/reference/smask.traps.rgb24.ref.png | Bin 3404 -> 0 bytes + test/reference/stroke-pattern.traps.ref.png | Bin 0 -> 1487 bytes + .../text-antialias-gray.traps.argb32.ref.png | Bin 975 -> 0 bytes + test/reference/text-antialias-gray.traps.ref.png | Bin 0 -> 966 bytes + .../text-antialias-gray.traps.rgb24.ref.png | Bin 975 -> 0 bytes + .../text-antialias-none.traps.argb32.ref.png | Bin 265 -> 0 bytes + test/reference/text-antialias-none.traps.ref.png | Bin 0 -> 265 bytes + .../text-antialias-none.traps.rgb24.ref.png | Bin 265 -> 0 bytes + .../text-antialias-subpixel-bgr.traps.ref.png | Bin 0 -> 1005 bytes + .../text-antialias-subpixel-rgb.traps.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel-vbgr.traps.ref.png | Bin 0 -> 985 bytes + .../text-antialias-subpixel-vrgb.traps.ref.png | Bin 0 -> 1009 bytes + .../text-antialias-subpixel.traps.argb32.ref.png | Bin 1004 -> 0 bytes + .../reference/text-antialias-subpixel.traps.ref.png | Bin 0 -> 1013 bytes + .../text-antialias-subpixel.traps.rgb24.ref.png | Bin 1004 -> 0 bytes + .../reference/text-glyph-range.traps.argb32.ref.png | Bin 1991 -> 0 bytes + test/reference/text-glyph-range.traps.ref.png | Bin 0 -> 1979 bytes + test/reference/text-glyph-range.traps.rgb24.ref.png | Bin 1991 -> 0 bytes + test/reference/text-pattern.traps.argb32.ref.png | Bin 1695 -> 3497 bytes + test/reference/text-pattern.traps.rgb24.ref.png | Bin 1397 -> 2707 bytes + test/reference/text-rotate.traps.argb32.ref.png | Bin 16599 -> 0 bytes + test/reference/text-rotate.traps.ref.png | Bin 0 -> 16597 bytes + test/reference/text-rotate.traps.rgb24.ref.png | Bin 16599 -> 0 bytes + .../unbounded-operator.traps.argb32.ref.png | Bin 2640 -> 2648 bytes + .../unbounded-operator.traps.rgb24.ref.png | Bin 1254 -> 1269 bytes + test/reference/user-font-proxy.traps.argb32.ref.png | Bin 16798 -> 0 bytes + test/reference/user-font-proxy.traps.ref.png | Bin 0 -> 16854 bytes + test/reference/user-font-proxy.traps.rgb24.ref.png | Bin 16798 -> 0 bytes + .../user-font-rescale.traps.argb32.ref.png | Bin 14852 -> 0 bytes + test/reference/user-font-rescale.traps.ref.png | Bin 0 -> 14883 bytes + .../reference/user-font-rescale.traps.rgb24.ref.png | Bin 14852 -> 0 bytes + 90 files changed, 0 insertions(+), 0 deletions(-) + +commit 2061cd81f26c04deb5a7092744295caab7bac077 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 13:01:17 2012 +0000 + + Replace the ad-hoc surface unwrappers with a function pointer + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 2 ++ + src/cairo-cogl-surface.c | 1 + + src/cairo-directfb-surface.c | 1 + + src/cairo-gl-surface.c | 14 ++++++++++++++ + src/cairo-image-source.c | 12 +++--------- + src/cairo-image-surface-private.h | 5 +++++ + src/cairo-image-surface.c | 14 ++++++++++++++ + src/cairo-mask-compositor.c | 25 ++++++++----------------- + src/cairo-os2-surface.c | 1 + + src/cairo-paginated-surface.c | 9 +++++++++ + src/cairo-pattern-private.h | 8 ++++++++ + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-qt-surface.cpp | 1 + + src/cairo-quartz-image-surface.c | 1 + + src/cairo-recording-surface.c | 2 ++ + src/cairo-script-surface.c | 14 ++++++++++++++ + src/cairo-spans-compositor.c | 18 ++++++------------ + src/cairo-surface-backend-private.h | 8 ++++++++ + src/cairo-surface-observer.c | 9 +++++++++ + src/cairo-surface-private.h | 4 ++++ + src/cairo-surface-snapshot.c | 9 +++++++++ + src/cairo-surface-subsurface.c | 14 ++++++++++++++ + src/cairo-surface.c | 16 ++++++++++++++++ + src/cairo-svg-surface.c | 1 + + src/cairo-tee-surface.c | 9 +++++++++ + src/cairo-traps-compositor.c | 26 +++++++++----------------- + src/cairo-type3-glyph-surface.c | 1 + + src/cairo-vg-surface.c | 1 + + src/cairo-win32-printing-surface.c | 1 + + src/cairo-win32-surface.c | 1 + + src/cairo-xcb-surface.c | 14 ++++++++++++++ + src/cairo-xlib-source.c | 17 +++++------------ + src/cairo-xlib-surface.c | 14 ++++++++++++++ + src/cairo-xlib-xcb-surface.c | 9 +++++++++ + src/cairo-xml-surface.c | 1 + + src/drm/cairo-drm-gallium-surface.c | 1 + + src/drm/cairo-drm-i915-surface.c | 2 ++ + src/drm/cairo-drm-i965-surface.c | 2 ++ + src/drm/cairo-drm-intel-surface.c | 3 +++ + src/drm/cairo-drm-radeon-surface.c | 3 +++ + src/test-compositor-surface.c | 1 + + src/test-null-compositor-surface.c | 1 + + src/test-paginated-surface.c | 1 + + 44 files changed, 232 insertions(+), 67 deletions(-) + +commit 7c34997a3ba89f2e957953aeb4bffa910dbf375b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 9 11:30:34 2012 +0000 + + gl: Just flush the context upon operand destroy + + Replace the assertion that the context is flushed when we destroy the + operation and jfdi. Easiest way to resolve it rather than untangle just + why we end up there with an unflushed context. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8c3b86787acf525df24a3b147da73398b7d1571c +Author: Martin Robinson <mrobinson@igalia.com> +Date: Fri Jan 27 15:30:12 2012 -0800 + + gl: Fix gl-source-surface test + + When painting a GL surface pattern from one context to a + a surface of another context, be careful to manage the + multiple contexts so that they do not stomp on each other. + + [ickle: Preserve fast path for GL subsurfaces] + + src/cairo-gl-operand.c | 47 ++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 40 insertions(+), 7 deletions(-) + +commit b52296a4356a52de0f5de72d90aa1e6addb3b595 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 4 16:22:40 2012 +1030 + + ps: fix extend-pad-border test failure + + src/cairo-ps-surface.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 477bcd89d716be372ebecc2b89381f4d9745f5e2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Feb 2 22:58:06 2012 +1030 + + ps: ensure shading domain is [ 0 1 ] + + Printing to a printer with an Adobe PostScript 3 interpreter fails + with rangecheck when the shading domain is not [ 0 1 ]. Workaround + this by using a type 3 function to map from [ 0 1] to the required + domain. + + src/cairo-ps-surface.c | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +commit a004fe85291f8f941248ae5d02213c5c490a232a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Feb 2 20:48:09 2012 +1030 + + ps: add missing 'Q' to end of page + + src/cairo-ps-surface.c | 27 +++++++-------------------- + 1 file changed, 7 insertions(+), 20 deletions(-) + +commit c6c02f519457299909c76cd116f6392c6d0e3a84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 2 02:06:45 2012 +0000 + + xlib: Only reduce a readback of an uninitialised source for pixmaps + + For a foreign drawable, we have to assume to that is dirty upon creation + or otherwise we fail to read back the correct pixel data when copying to + an image. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 24445f94684a10eeaebb3794dc7c4b20539d873b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 2 01:46:56 2012 +0000 + + xlib: Set IncludeInferiors when acquiring the source image + + If we need to fallback and perform a copy first to a pixmap for a + partially unviewable Window, we need to copy its inferiors as well. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit b454db4b138872121ac003d4ba953f44e1a1dc60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 2 01:07:27 2012 +0000 + + xlib: Set IncludeInferiors when using CopyArea + + cairo-xlib semantics state that we copy the contents of a Window's + children when we use a Window as a source in a cairo operation. This + requires that we set the IncludeInferiors SubwindowMode on the GC. + However, we can only set one SubwindowMode for an operation and our + semantics are that drawing performed by cairo onto a Window are clipped + by its children (the ClipByChildren SubwindowMode). Therefore if we have + to copy between two Window, we can not use CopyArea. Furthermore, we + cannot tell if an external Drawable is a Window or a Pixmap, therefore + we treat all foriegn Drawables as Window. + + Failure here means falling back to a render path, where we can + independently control the subwindow mode on the source and destination, + or to a GetImage/PutImage if the xserver does not support render. + + Reported-by: Benjamin Otte <otte@redhat.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-core-compositor.c | 37 ++++++++++++++++++++++++++++++++----- + src/cairo-xlib-render-compositor.c | 26 ++++++++++++++++++++++++++ + 2 files changed, 58 insertions(+), 5 deletions(-) + +commit d95172858bbf12ff4596493c49c4eefe562cd81c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 1 21:38:07 2012 +1030 + + ps: avoid using ps patterns to paint/fill gradients + + Patterns are slower and use more memory to print. For painting and + filling we can use the shading operator to draw gradients. + + src/cairo-ps-surface.c | 220 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 144 insertions(+), 76 deletions(-) + +commit 46ca65895fb84ab70f9506e02bca5e5bc915f750 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jan 31 22:29:01 2012 +1030 + + ps: support RASTER_SOURCE patterns + + src/cairo-ps-surface-private.h | 5 - + src/cairo-ps-surface.c | 601 +++++++++++++++++++++----------- + test/reference/raster-source.ps.ref.png | Bin 0 -> 1894 bytes + 3 files changed, 389 insertions(+), 217 deletions(-) + +commit 0f40cdea1bdeedc730dde7814cdf056a12efb2cc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 18 22:13:10 2012 +1030 + + api: add cairo_surface_supports_mime_type + + to allow querying if a surface supports a particular mime type. + + src/cairo-paginated-surface.c | 14 +++++++++++++- + src/cairo-pdf-surface.c | 14 ++++++++++++++ + src/cairo-ps-surface.c | 13 +++++++++++++ + src/cairo-surface-backend-private.h | 3 +++ + src/cairo-surface.c | 30 ++++++++++++++++++++++++++++++ + src/cairo-svg-surface.c | 18 ++++++++++++++++++ + src/cairo-win32-printing-surface.c | 16 ++++++++++++++++ + src/cairo.h | 4 ++++ + src/cairoint.h | 1 + + 9 files changed, 112 insertions(+), 1 deletion(-) + +commit a7c9c75ffae2e17288d131eac7e719c72fcd30b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 17 12:37:48 2012 +0000 + + xlib: Improve choice of bits-per-pixel for depth + + The only reliable method would be to query the xserver for the + matching bpp for a particular depth. In the absence of such information, + simply chose the next higher power-of-two(depth). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +commit a2f419b546f620ede105b5a6b5958260925d9a50 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 7 16:19:43 2012 +0100 + + rectangle: Implement _cairo_rectangle_contains_rectangle() + + And reuse it. + + src/cairo-clip-boxes.c | 7 +------ + src/cairo-image-source.c | 10 ++-------- + src/cairo-pattern.c | 26 ++++++-------------------- + src/cairo-spans-compositor.c | 10 +--------- + src/cairo-surface.c | 5 +---- + src/cairo-traps-compositor.c | 10 +--------- + src/cairoint.h | 10 ++++++++++ + 7 files changed, 22 insertions(+), 56 deletions(-) + +commit 2808bf5b95e84f3a4d8ee7b56c340860d0348a8a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 7 16:44:48 2012 +0100 + + pattern: Infinite color-only sources are always opaque + + No matter what the sampling extents are, infinite color-only sources + are opaque. + + src/cairo-pattern.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 11493eea9bcf2f100f25fc771533b79cf245be63 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 15 16:49:08 2012 +0100 + + raster-source: Do not return value in void function + + Both MSVC and Sun Studio Compiler complain about void values being + returned. + + Fixes: + cairo-raster-source-pattern.c(93) : warning C4098: + '_cairo_raster_source_pattern_release' : 'void' function returning a + value + + src/cairo-raster-source-pattern.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit c1c9424a3db1485f1529d0982af0075c1af844ff +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 7 10:16:28 2012 +0100 + + quartz: Do not export private functions + + Private functions must be marked cairo_private to avoid exporting + them. + + src/cairo-quartz-private.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7058e8c18135eddcb10fbb9fc9784c87f61f6953 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 6 16:55:06 2012 +0100 + + quartz: Make glyph antialiasing consistent with quartz-font + + CAIRO_ANTIALIAS_{FAST,GOOD,BEST} were introduced and used in + cairo-quartz-font.c by commit 70cd3b473d09e9ad3d803014a904a22639db1a24. + + Fixes the warnings: + + cairo-quartz-surface.c: In function '_cairo_quartz_cg_glyphs': + cairo-quartz-surface.c:1976: warning: enumeration value 'CAIRO_ANTIALIAS_FAST' not handled in switch + cairo-quartz-surface.c:1976: warning: enumeration value 'CAIRO_ANTIALIAS_GOOD' not handled in switch + cairo-quartz-surface.c:1976: warning: enumeration value 'CAIRO_ANTIALIAS_BEST' not handled in switch + + src/cairo-quartz-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 29145f4e483db8126aab36bf8686d41eb49a31b4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 6 17:17:30 2012 +0100 + + quartz: Fix building with QUARTZ_DEBUG + + Multiple code refactorings broke the debugging code. + + src/cairo-quartz-surface.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 2bb441fd11ba494b3a750f6412d21b720e4b5a3d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jan 12 14:29:50 2012 +0100 + + test: Add stride-12-image + + Add a test to check that all the backends can handle images with a + stride that is not width * 4. + + test/Makefile.sources | 1 + + test/reference/stride-12-image.image16.ref.png | Bin 0 -> 61197 bytes + test/reference/stride-12-image.ps.ref.png | Bin 0 -> 77159 bytes + test/reference/stride-12-image.ref.png | Bin 0 -> 81121 bytes + test/stride-12-image.c | 71 +++++++++++++++++++++++++ + 5 files changed, 72 insertions(+) + +commit 88d589aa47995e724a7723b6114ee64a0d0ed0d2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 15 21:29:15 2012 +1030 + + ps: handle different x/y fallback resolution in Fallback Image comment + + src/cairo-ps-surface.c | 26 +++++++++++++++++++------- + 1 file changed, 19 insertions(+), 7 deletions(-) + +commit 284cba1f3776b9d9e80f6f0acdca67e4828861c1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 15 20:56:25 2012 +1030 + + test: add push/pop group to fallback test + + test/fallback.c | 25 ++++++++++++++++++++----- + test/reference/fallback.argb32.ref.png | Bin 2407 -> 3139 bytes + test/reference/fallback.rgb24.ref.png | Bin 1131 -> 2490 bytes + 3 files changed, 20 insertions(+), 5 deletions(-) + +commit 9a199fd4031986dfba99e7d6ceb63ec7cea81cad +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jan 12 20:31:16 2012 +0100 + + xcb: Use int instead of uint16_t for rowstride + + Fixes negative-stride-image + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection-core.c | 2 +- + src/cairo-xcb-private.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 45d9659665fbce3484228ce5d4d94ac483f894e6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 6 16:41:41 2012 +0100 + + test: Add negative-stride-image + + Add a test to check that all the backends can handle images with + negative stride. + + test/Makefile.sources | 1 + + test/negative-stride-image.c | 71 +++++++++++++++++++++ + .../negative-stride-image.image16.ref.png | Bin 0 -> 61197 bytes + test/reference/negative-stride-image.ps.ref.png | Bin 0 -> 77159 bytes + test/reference/negative-stride-image.ref.png | Bin 0 -> 81121 bytes + 5 files changed, 72 insertions(+) + +commit 738be215dae1a98af39f68cc9ac5c338a2e44e38 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 11 12:45:41 2012 +0000 + + xlib: Fix typo in 5045155de6, lack of closing ';' + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-core-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dc80e8328ce8be6414d6483a51bce074f6e740b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 11 12:42:53 2012 +0000 + + subsurface: Add guards for creating similar surface + + If the target backend doesn't provide the entry points, just return NULL + (unsupported). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 9e4fb906b8ab3ac3ddf5372257112bc2afa62df1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 11 12:39:17 2012 +0000 + + xcb: Add dimension guards to create-similar-image + + Just create a image wrapper for a 0x0 surface, and do not try to create + an image surface that is larger than the maximum X coordinate. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 5045155de6fa7fcafc345365320f97d6a87ee063 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 9 09:43:31 2012 +0000 + + xlib: Do not upload inplace if the image does not match the surface format + + Currently we perform the conversion using XPutPixel which is hideously + slow and so it is faster to create a new surface that matches the + format correctly, upload and allow X to perform the conversion. In other + words disable the "fast" path for format mismatches. + + Based on a patch by Ginn Chen <ginn.chen@oracle.com> + + Bugzilla: https://bugzilla.mozilla.org/show_bug.cgi?id=716462 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-core-compositor.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 20a1676c28e57686dda3f7afab035d40228c0f6f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 8 09:51:15 2012 +0000 + + test: Add arc-direction + + A simple example of how to draw arcs. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/arc-direction.c | 105 +++++++++++++++++++++++++++++ + test/reference/arc-direction.base.ref.png | Bin 0 -> 5864 bytes + test/reference/arc-direction.ps.ref.png | Bin 0 -> 3295 bytes + test/reference/arc-direction.ref.png | Bin 0 -> 4124 bytes + test/reference/arc-direction.traps.ref.png | Bin 0 -> 5864 bytes + test/reference/arc-direction.xlib.ref.png | Bin 0 -> 5864 bytes + 7 files changed, 106 insertions(+) + +commit 42ad7a2385604d6c2715bc2e638e1c75245c8ffe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 4 11:03:07 2012 +0000 + + perf/chart: Make the columns transculent so that the label behind is visible + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-chart.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 44 insertions(+), 4 deletions(-) + +commit 23ca558a051ad7557476c77e6d53b5a76f3eb798 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 4 10:53:28 2012 +0000 + + perf/chart: Show values next to the column if too small to fit inside + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-chart.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +commit 56a835eb9df7055922dccbc77ba48bd12e07f342 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 4 10:26:04 2012 +0000 + + perf/chart: Tweak labels on right not to fall off the edge + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/.gitignore | 1 + + perf/cairo-perf-chart.c | 16 ++++++++-------- + 2 files changed, 9 insertions(+), 8 deletions(-) + +commit 0a10982f8c4f08018f50ec73663761ccf7b9c839 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jan 10 00:11:41 2012 +1030 + + pdf: support RASTER_SOURCE patterns + + src/cairo-pdf-surface-private.h | 4 + + src/cairo-pdf-surface.c | 473 +++++++++++++++++++++++++++------------- + 2 files changed, 323 insertions(+), 154 deletions(-) + +commit fefc273c53c39c750b27d35964ec250547b948af +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 8 21:12:17 2012 +1030 + + test: add fallback + + to get a fallback resolution test included in index.html + + test/Makefile.sources | 1 + + test/fallback.c | 64 +++++++++++++++++++++++++++++++++ + test/reference/fallback.argb32.ref.png | Bin 0 -> 2407 bytes + test/reference/fallback.rgb24.ref.png | Bin 0 -> 1131 bytes + 4 files changed, 65 insertions(+) + +commit 6816f70da54e730e88b98c8592aa6fc84e082928 +Author: Martin Robinson <mrobinson@webkit.org> +Date: Thu Dec 15 17:42:42 2011 -0800 + + gl: Fix the offset of non-texture source surfaces + + src/cairo-gl-operand.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4c3276e94f1eb8b6cbe4069be3d1d89f00bbbc0d +Author: Pekka Paalanen <ppaalanen@gmail.com> +Date: Fri Dec 16 16:27:40 2011 +0200 + + egl: do not destroy dummy_surface if it does not exist + + On deleting an EGL device, it is possible that + cairo_egl_context_t::dummy_surface is EGL_NO_SURFACE. In that case + calling eglDestroySurface() on it will lead to EGL_BAD_SURFACE error. + + Check dummy_surface before destroying it. + + Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-egl-context.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b845a191d55bb8ed07acdd06cbf3e47b3b7dd202 +Author: Martin Robinson <mrobinson@igalia.com> +Date: Thu Dec 15 17:41:50 2011 -0800 + + gl/msaa: Scissor simple rectangular clips + + Instead of using the stencil buffer to perform simple + rectangular clips, just scissor the clip rectangle. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + [ickle: fixed application to master] + + src/cairo-gl-msaa-compositor.c | 80 ++++++++++++++++++++++++++++-------------- + 1 file changed, 53 insertions(+), 27 deletions(-) + +commit 5ce6e0279308736420654fa49b47f0bdf5f782eb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 15 13:04:02 2011 -0800 + + test: Use fork() on MacOS X + + MacOS X 10.7 (and maybe some previous versions, too) can fork() + processes which use CoreGraphics. This makes it possible for + cairo-test-suite to withstand a test crash without killing the whole + suite. + + The old behavior is still available using the '-f' (foreground) + option. + + test/cairo-test-runner.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit bbe692372d593a70d80de9fdb0de521a9f012f08 +Author: Martin Robinson <mrobinson@igalia.com> +Date: Thu Dec 15 10:49:27 2011 -0800 + + gl/msaa: Ignore the antialiasing property of the clip. + + If the clip suggests anti-aliasing and we don't support it, + draw the clip anyway. Currently disabling anti-aliasing does + not disable anti-aliasing on certain clips. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-msaa-compositor.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit b98c8c126989e1158c3f78d8e5f20834a2af10b2 +Author: Martin Robinson <mrobinson@igalia.com> +Date: Thu Dec 15 10:48:16 2011 -0800 + + gl/msaa: If stenciling the clip fails, reset the color mask. + + If the clip failed, not resetting the color mask leaves the GL context + in a state in which we cannot draw anything. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-msaa-compositor.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8f74159d9295c8570c244c6e3c454937c842b9d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 15 19:12:00 2011 +0000 + + gl: Disable the msaa compositor by default (for release testing) + + One of the remaining issues with msaa is Cairo's insistence on + allocating a depth-stencil for every target. These cause massive + overallocation and prevents my machines from completing + cairo-perf-trace. So for the time being switch back to the old + fashioned span-based compositor. + + To continue development of msaa, or indeed other compositors, we + introduce the CAIRO_GL_COMPOSITOR env variable to allow the default + compositor to be selected. Use CAIRO_GL_COMPOSITOR=msaa to continue to + use the msaa compositor for instance. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 909f4a4a7f0a6082f4f1e9edaba8034a819a12ec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 12 13:52:27 2011 +0000 + + gl: Set the destination for swap buffers, required by EGL at least + + EGL mandates that the current context be valid for a call to + swapbuffers, and does not just operate upon the drawable passed in. The + current code prevents this as a side effect of calling flush decouples + the current context (so that the state can be clobbered by the + application without impacting upon Cairo). So when we try to swap, EGL + complains. + + We can get the desired behaviour by setting the surface upon the + context, thus calling MakeCurrent as necessary, and then flushing any + pending operations before swapping. This has the positive side-effect + of not clobbering our own state unnecessarily. + + Reported-by: Pekka Paalanen <ppaalanen@gmail.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 8025fcc4d38db1e2f7adabe732dbde481b6aeade +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Dec 11 13:58:10 2011 +0100 + + xcb: Add a special case for recording surface + + An unbounded recording surface will complain loudly when you call + acquire_source_image on it and thus we need a special case which draws the + recording surface to a temporary surface and then proceeds with that. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 70 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 70 insertions(+) + +commit 420110d12bd74969f84d6a1979b33f1d71d63c43 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Dec 11 13:41:39 2011 +0100 + + xcb: Move the surface picture setup into its own function + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 52 ++++++++++++++++++++++++------------------ + 1 file changed, 30 insertions(+), 22 deletions(-) + +commit fe04df11ed491db719f299213665bfe8be83c971 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Dec 11 11:17:06 2011 +0100 + + xcb: Silence compiler warnings about ignored return values + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 10 ++++++++-- + src/cairo-xcb-surface-render.c | 1 + + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit b6fcf0768c361b15db09d5732b92613a41168a25 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Dec 11 11:10:20 2011 +0100 + + xcb: Silence a compiler warning for mixing type and internal type enums + + cairo-xcb-surface-render.c:1134:35: warning: comparison between + 'cairo_surface_type_t' and 'enum _cairo_internal_surface_type' [-Wenum-compare] + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit be288ce016e4f56fac298bae603a5e5fa5f26df5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Dec 10 00:40:54 2011 +1030 + + doc: fix typos + + src/cairo.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c7ea92907a7eaaf62136755d0b6c60da913d1057 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Dec 9 23:52:00 2011 +1030 + + ps: simplify the EPS save and restore + + userdict is not permitted in EPS files. Since the PS surface does not + leave extra operators or dictionaries on the stack the EPS prolog and + trailer can be reduced to: + + save + 50 dict begin + + .... + + end + restore + + The save/restore pair is required to remove fonts and restore the + graphics state. As "restore" does not restore the dictionary stack, + using a new current dictionary for the EPS file allows the cairo dict + entries to be cleaned up at the end the EPS. + + Bug 43634 + + src/cairo-ps-surface.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit f446e57f350190f3ecc4758fe5cc2c6e949ff7b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 9 09:20:23 2011 +0000 + + gl: Track surface references through operands + + In the case where we created a surface to handle an operand, it needs to + be freed when we release the operand. However, we also have to be + careful not to introduce reference cycles into ordinary surfaces, so + always remember to teardown the composite setup! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 4 ++++ + src/cairo-gl-private.h | 1 + + 2 files changed, 5 insertions(+) + +commit 8d4425053d126ead3087fe59c69063bce3b42cb5 +Author: Chuanbo Weng <strgnm@gmail.com> +Date: Fri Dec 9 16:13:59 2011 +0800 + + gl: fix bug in _cairo_gl_surface_embedded_operand_init() + + The operand->texture.surface should be set to right value, not + NULL. Otherwise, when doing _cairo_gl_surface_operand_init(), + the texture.surface in operand struct will also be NULL, which + is incorrect. This fix regression suite in 43 test cases(such + as source-clip) in cairo/test/. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 1 - + src/cairo-gl-surface.c | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit 2a60e8deecd8f63671cd595012843a665187d695 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Dec 8 22:41:10 2011 +0100 + + xcb: Fix invalid casts from cairo_content_t to cairo_format_t + + This was introduced in a69335a84e when the second argument of + _cairo_xcb_surface_create_similar_image was changed from content to format. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d828c724c06cea151fc87ef2bb98e57be0cdba46 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 7 17:47:34 2011 +0000 + + gl: Decouple the glyph upon eviction + + In order to decouple the texture node from the scaled glyph cache, we + need to add a callback from the rtree for when the node is removed. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 4 ++ + src/cairo-gl-glyphs.c | 55 +++++++++++++------------- + src/cairo-gl-private.h | 7 ++++ + src/cairo-rtree-private.h | 6 ++- + src/cairo-rtree.c | 99 ++++++++++++++++++----------------------------- + 5 files changed, 81 insertions(+), 90 deletions(-) + +commit 98335b43907b25585c597ae0ff657fdb45c29b05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 7 13:14:58 2011 +0000 + + doc: Add documentation for cairo_raster_source_pattern + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + doc/public/cairo-sections.txt | 20 +++++ + src/cairo-raster-source-pattern.c | 151 ++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 70 ++++++++++++++++++ + 3 files changed, 241 insertions(+) + +commit cff0097954657a459707e2af30c0bc49643cd289 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 7 11:56:38 2011 +0000 + + gl: Prevent leak of the white source used with glyph masks + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-glyphs.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 5613b210fffccd74dc2c3039ca0f1b628e306411 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 7 10:19:37 2011 +0000 + + gl: Defer stencil allocation until use + + Allocating a stencil and a depth buffer for every destination surface is + simply too expensive and causes major resource issues. So defer the + allocation and attachment of a stencil buffer until just prior to first + use. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 55 ++++++++++++++++++++++++++++-------------- + src/cairo-gl-msaa-compositor.c | 2 +- + src/cairo-gl-private.h | 4 +++ + 3 files changed, 42 insertions(+), 19 deletions(-) + +commit c7565eeda0bde4f388745c3c235053054059c1fa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 6 19:00:26 2011 +0000 + + test: Exercise copy/filling unsorted rectangles + + Exercise the bug Keith found in the xlib backend, which claimed the + output from the rectangular tessellator would always be sorted. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 2 + + test/copy-disjoint.c | 87 +++++++++++++++++++++++++++++++++++ + test/fill-disjoint.c | 63 +++++++++++++++++++++++++ + test/reference/copy-disjoint.ref.png | Bin 0 -> 1098 bytes + test/reference/fill-disjoint.ref.png | Bin 0 -> 1098 bytes + 5 files changed, 152 insertions(+) + +commit 950021f8811cfc1f2394c5c5dcaf2371bb4419e7 +Author: Keith Packard <keithp@keithp.com> +Date: Tue Dec 6 09:58:18 2011 -0800 + + Clip rectangles are not necessarily YSorted + + None of the cairo clipping computations guarantee that the resulting + list of rectangles are constructed in any particular order. Promising + that they are results in an X error (BadMatch) which generally causes + applications to crash. + + I suspect this may well be implicated in many (many) bug reports about + applications which use cairo. + + Signed-off-by: Keith Packard <keithp@keithp.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-render-compositor.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d60a2930e1743ad634794472c66a303595ce1290 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 6 14:56:49 2011 +0000 + + test: reference ref images after tweaking polygon clipping + + test/reference/a1-tiger.ref.png | Bin 20330 -> 20326 bytes + test/reference/clip-nesting.argb32.ref.png | Bin 1072 -> 1080 bytes + test/reference/clip-nesting.rgb24.ref.png | Bin 949 -> 954 bytes + test/reference/clip-operator.argb32.ref.png | Bin 8180 -> 8158 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3199 -> 3231 bytes + test/reference/hatchings.ref.png | Bin 46499 -> 45496 bytes + test/reference/mask.argb32.ref.png | Bin 8218 -> 8193 bytes + test/reference/mask.rgb24.ref.png | Bin 7007 -> 6985 bytes + .../random-intersections-curves-eo.ref.png | Bin 156582 -> 156491 bytes + .../random-intersections-curves-nz.ref.png | Bin 151330 -> 151310 bytes + test/reference/record-fill-alpha.ref.png | Bin 2173 -> 2171 bytes + .../reference/record-paint-alpha-clip-mask.ref.png | Bin 325 -> 340 bytes + test/reference/rel-path.rgb24.ref.png | Bin 184 -> 183 bytes + test/reference/scale-offset-image.ref.png | Bin 7695 -> 7688 bytes + test/reference/scale-offset-similar.ref.png | Bin 7695 -> 7688 bytes + test/reference/tiger.ref.png | Bin 71110 -> 71094 bytes + 16 files changed, 0 insertions(+), 0 deletions(-) + +commit 291efa76de7572720e82b25cc105bb94fd351cd4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 6 14:45:27 2011 +0000 + + polygon: Tweak the y-coordinates of the edge so that it is inside the clip + + As we evaluate the line first using y-for-x to find the clipped + vertical range and then rasterise the line using x-for-y, we can incur + severe rounding errors that cause us to draw beyond the clipped region. + The first simple attempt at a fix is to tweak the clipped vertical range + such that the evaluated extents of the line are contained. + + Reported-by: Taekyun Kim <tkq.kim@samsung.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 19dd6e7e530275aa1ee37dea922c8396b1077758 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 6 14:44:57 2011 +0000 + + polygon: Assert that we add edges that are wholly contained by the clip + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon.c | 43 ++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 42 insertions(+), 1 deletion(-) + +commit 6b472e12ae11f7b68289cdfd616e765be9a25a98 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 6 10:27:17 2011 +0000 + + gl: Re-enable the CLEAR optimisation + + It was temporarily disabled whilst the surface API was in flux. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-surface.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit a8cbb007844b04937b36cc387d5ad29b5fc70119 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:47:14 2011 +1030 + + pdf: avoid using pdf patterns to paint/fill translucent linear/radial gradients + + src/cairo-pdf-surface.c | 93 ++++++++++++++++++++++++++++++------------------- + 1 file changed, 58 insertions(+), 35 deletions(-) + +commit 79f430e7ada4384390dc03caab2af0ffc1603885 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:46:49 2011 +1030 + + pdf: avoid using pdf patterns to paint/fill opaque linear/radial gradients + + Patterns are slower and use more memory to print. For painting and + filling we can use the shading operator to draw gradients. + + src/cairo-pdf-surface-private.h | 2 + + src/cairo-pdf-surface.c | 237 ++++++++++++++++++++++++++++++++++------ + 2 files changed, 205 insertions(+), 34 deletions(-) + +commit dee48f0dcadf96e88872894a1cef280905cd255f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:46:35 2011 +1030 + + ps: allow embedding of cmyk jpeg images + + src/cairo-ps-surface.c | 26 +++++++++++++++++++++----- + 1 file changed, 21 insertions(+), 5 deletions(-) + +commit 74c0a06105e3d08b057a770e0545849836f6babb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:46:21 2011 +1030 + + pdf: allow embedding of cmyk jpeg images + + src/cairo-pdf-surface.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 25e35b46bfd2a71a8cf0484e51351961ad1c82a3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:45:31 2011 +1030 + + ps: avoid padding images if the padding is not required to fill the extents + + src/cairo-ps-surface.c | 59 ++++++++++++++++++++++++++++++-------------------- + 1 file changed, 35 insertions(+), 24 deletions(-) + +commit c7ce1b68d5370f6e804a6edbf5be4bca3a5b7c57 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:45:14 2011 +1030 + + pdf: don't use patterns with padded images + + and avoid padding if the padding is not required to fill the extents. + + src/cairo-pdf-surface.c | 246 ++++++++++++++++++++++++++---------------------- + 1 file changed, 131 insertions(+), 115 deletions(-) + +commit 346b8fe3984acd2127285f4a57516a3deda5df25 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:44:50 2011 +1030 + + type1-subset: remove unused variables + + src/cairo-type1-subset.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ed7157d705ba9bfe3cc95f1e7b0ea11a91df7fa3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Dec 6 20:44:22 2011 +1030 + + truetype-subset: remove unused variable + + src/cairo-truetype-subset.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 3ebe0ca876c10425b88033683d7f85dcddcc09be +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Dec 5 22:55:58 2011 +0100 + + xlib-xcb: Implement surface_set_drawable + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 9ec5e9fee64cb9dd835477e3565170c522863ea9 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Dec 5 22:48:56 2011 +0100 + + xcb: Fixup some internal state in set_{drawable,size} + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 2 +- + src/cairo-xcb-surface.c | 28 +++++++++++++++++++++++++--- + src/cairoint.h | 3 +++ + test/api-special-cases.c | 8 ++++++++ + 4 files changed, 37 insertions(+), 4 deletions(-) + +commit 3dbb0f17a74e98ecf790e9d2c9fb8622e3928486 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 18:32:58 2011 +0000 + + gl: Unbreak the glyph cache + + Use the embedded operand on the surface instead of copying it across and + trying to then wrap the surface from it - as it would then unref the + glyph cache surface after the operation and so we would lose the glyphs. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-glyphs.c | 24 +++++++++++------------- + src/cairo-gl-private.h | 2 +- + 2 files changed, 12 insertions(+), 14 deletions(-) + +commit e68eb874e9cdeb087834a65cc356e94d9bbbeeb8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 16:38:05 2011 +0000 + + fallback: fix the offset for painting + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-fallback-compositor.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dd73add00c7886467d60e27cca8311e3cf5ee2e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 16:20:53 2011 +0000 + + gl: Set the device offset on map-to-image + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit f7daaa8fce8dd399500551d84cf6207824e5c28e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 16:07:45 2011 +0000 + + gl: Propagate clip region + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 1 + + src/cairo-gl-private.h | 2 ++ + src/cairo-gl-traps-compositor.c | 2 +- + 3 files changed, 4 insertions(+), 1 deletion(-) + +commit 3b1151f60d28d4e0de7160043cf24579751425cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 15:41:23 2011 +0000 + + gl: Substitute the white source for the default pattern + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-source.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0ce8dad9a2330575276b28a37098fe6cc4bf877f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 15:39:03 2011 +0000 + + gl: Decouple glyphs on shutdown from the scaled font caches + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-glyphs.c | 24 ++++++++++++++---------- + src/cairo-rtree-private.h | 5 +++++ + src/cairo-rtree.c | 28 ++++++++++++++++++++++++++++ + 3 files changed, 47 insertions(+), 10 deletions(-) + +commit 31c0726f682159e6465719c389975ec8885fa38b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 15:28:10 2011 +0000 + + gl: Embed the operand rather than a pattern into the glyph cache + + Use the native encoding for patterns. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-glyphs.c | 48 ++++++++++++++++++------------------------------ + src/cairo-gl-private.h | 2 +- + 2 files changed, 19 insertions(+), 31 deletions(-) + +commit 16038150b3691d4d4a320a727afc107cd0937ac6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 15:03:43 2011 +0000 + + gl: Use the embedded operand to allow passing sources around + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 1 + + src/cairo-gl-glyphs.c | 7 --- + src/cairo-gl-operand.c | 79 +++++------------------------- + src/cairo-gl-private.h | 16 +++++- + src/cairo-gl-source.c | 106 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-spans-compositor.c | 75 +--------------------------- + src/cairo-gl-surface.c | 2 +- + src/cairo-gl-traps-compositor.c | 59 +--------------------- + 8 files changed, 136 insertions(+), 209 deletions(-) + +commit 65cd7d3bebe12e0db61b2739a7950d1ed49c20f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 16:02:51 2011 +0000 + + gl: Propagate surface texture to embedded operand + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7dcf9d28fdf05c8acabd8ed3dc25e0cf279e61e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 14:42:15 2011 +0000 + + gl: Check against user-provided invalid sizes + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-egl-context.c | 3 +++ + src/cairo-glx-context.c | 3 +++ + src/cairo-wgl-context.c | 3 +++ + 3 files changed, 9 insertions(+) + +commit 3edf369eade8b587aeaa162bd3bbeb3546c35b84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 5 14:40:19 2011 +0000 + + gl: Make the backend struct static + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-private.h | 2 -- + src/cairo-gl-surface.c | 7 +++++-- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 934a3dcc6b218056b685885ef7d373578378caf5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 16:19:48 2011 +0000 + + doc: Drop the gtk-doc markup from _cairo_radial_pattern_focus_is_inside + + Stop confusing gtk-doc with this private function. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pattern.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit aa5a9c46e1b1b8e93db8762fec1c902704ed44a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 16:17:18 2011 +0000 + + doc: add CAIRO_DEVICE_TYPE_COGL + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo.h | 1 + + 1 file changed, 1 insertion(+) + +commit 4a0913eb52be9aa0c8bda89652f47a5e17f4eeb6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 16:16:32 2011 +0000 + + doc: Add new antialias symbols + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit d6440f2d661446e2f70047b0c986e572ab5d7336 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 16:12:02 2011 +0000 + + script: Add documentation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 160 +++++++++++++++++++++++++++++++++++++++------ + src/cairo-script.h | 11 +++- + 2 files changed, 148 insertions(+), 23 deletions(-) + +commit d86ce9ca2f39f2d39dcde632179d0be55a38abdc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 15:35:42 2011 +0000 + + doc: Add sections for cairo-script + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + doc/public/cairo-sections.txt | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 498ca4bf74b5c6202e74a71f2134baae9f5cad69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 15:16:11 2011 +0000 + + doc: Add similar-image, map-to-image, unmap-image + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + doc/public/cairo-sections.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9156339295e0223f8c806baaefa293c98a37ba93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Dec 2 15:08:40 2011 +0000 + + xcb: Silence a compiler warning for mixing status and internal status enums + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b9d4a5f1068ac038ca47fdad7dcf05dfa21b211b +Author: Keith Packard <keithp@keithp.com> +Date: Fri Dec 2 14:57:24 2011 +0000 + + Add cairo_xcb_surface_set_drawable + + Mirrors cairo_xlib_surface_set_drawable, allowing the drawable + targeted by a surface to be changed on the fly. + + Signed-off-by: Keith Packard <keithp@keithp.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + doc/public/cairo-sections.txt | 1 + + src/cairo-xcb-private.h | 1 + + src/cairo-xcb-surface.c | 68 +++++++++++++++++++++++++++++++++++++++++++ + src/cairo-xcb.h | 6 ++++ + 4 files changed, 76 insertions(+) + +commit a30013f72a4096085d1ddd60180644132ae87522 +Author: Keith Packard <keithp@keithp.com> +Date: Fri Dec 2 14:57:23 2011 +0000 + + Create XCB documentation. + + Signed-off-by: Keith Packard <keithp@keithp.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + doc/public/cairo-docs.xml | 2 +- + doc/public/cairo-sections.txt | 9 +++++++++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit d5c7d2e2f4e201166e3f0df4ae326f10bdcfe07c +Author: Keith Packard <keithp@keithp.com> +Date: Fri Dec 2 14:57:22 2011 +0000 + + cairo-xcb: gtk-doc doesn't like _ in parameter names + + Any function documented with gtk-doc must not have _ in any parameter + names, or at least that's what I've found. This patch simply renames + parameters as needed to make things work. + + Signed-off-by: Keith Packard <keithp@keithp.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface.c | 48 ++++++++++++++++++++++++------------------------ + 1 file changed, 24 insertions(+), 24 deletions(-) + +commit a6def3874ccb80b8e64ab1c750221f5525c09d0e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 12:29:51 2011 +0000 + + gl: Even repeating subsurfaces need to be cloned + + As we can't reuse the existing surface definition for a repetition of + the subsurface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit f308ba7a444741b2cb26f7b09f86553723d7a22f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 12:22:56 2011 +0000 + + subsurface: Replace any existing snapshot + + Only allow one owner to keep their snapshot on the subsurface, and + so automatically replace any previous snapshot. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 2 +- + src/cairo-surface-subsurface.c | 4 +++- + src/cairo-xlib-source.c | 2 +- + 3 files changed, 5 insertions(+), 3 deletions(-) + +commit 03be2019cd12936cf86d304a9391b5be2bf6e39e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 12:21:18 2011 +0000 + + gl: And enable subsurface caching of the clones + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 55 ++++++++++++++++++++++++++++---------------------- + 1 file changed, 31 insertions(+), 24 deletions(-) + +commit 5f6d3fe40b52785c80f210c6597328311c987eb3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 12:15:31 2011 +0000 + + gl: Temporarily clone a subsurface as required + + When the sample extents exceed the subsurface bounds we need to clone + the subsurface into a regular surface in order to correctly handle the + CAIRO_EXTEND_NONE extend mode (i.e prevent sampling out-of-bounds). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-operand.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 73 insertions(+), 4 deletions(-) + +commit 4713562eda23c299b6065bd2cca9cb29d08e0763 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 10:50:21 2011 +0000 + + trace: Remove the warning about the unstable format + + We're stuck with the PostScript style for this generation now. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 1 - + 1 file changed, 1 deletion(-) + +commit f5f303f10dd9c698e5d81d17b3fd8336508fd586 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 10:48:50 2011 +0000 + + script: Prefer polymorphorism for mesh path construction + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-script/cairo-script-operators.c | 158 +++++++++-------------------- + 1 file changed, 47 insertions(+), 111 deletions(-) + +commit 8844d50308e03e7eb1d6e1530bb4bd98be490cea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 25 00:59:31 2011 +0000 + + Convert cairo_mime_surface_t to cairo_raster_source_pattern_t + + As discussed, overloading the cairo_surface_t semantics to include + sources (i.e. read-only surfaces) was duplicating the definition of + cairo_pattern_t. So rather than introduce a new surface type with + pattern semantics, start along the thorny road of extensible pattern + types. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 2 +- + src/cairo-gl-operand.c | 55 +-- + src/cairo-image-source.c | 95 +++++ + src/cairo-mime-surface.c | 405 ---------------------- + src/cairo-pattern-private.h | 41 ++- + src/cairo-pattern.c | 130 ++++++- + src/cairo-pdf-surface.c | 4 +- + src/cairo-ps-surface.c | 5 + + src/cairo-raster-source-pattern.c | 280 +++++++++++++++ + src/cairo-script-surface.c | 32 +- + src/cairo-surface-observer.c | 6 +- + src/cairo-svg-surface.c | 1 + + src/cairo-xcb-surface-core.c | 1 + + src/cairo-xcb-surface-render.c | 3 +- + src/cairo.h | 90 +++-- + test/Makefile.sources | 2 +- + test/mime-surface.c | 174 ---------- + test/raster-source.c | 134 +++++++ + test/reference/mime-surface.base.argb32.ref.png | Bin 1209 -> 0 bytes + test/reference/mime-surface.base.rgb24.ref.png | Bin 1209 -> 0 bytes + test/reference/mime-surface.ref.png | Bin 1209 -> 0 bytes + test/reference/mime-surface.traps.argb32.ref.png | Bin 1209 -> 0 bytes + test/reference/mime-surface.traps.rgb24.ref.png | Bin 1209 -> 0 bytes + test/reference/raster-source.base.argb32.ref.png | Bin 0 -> 1209 bytes + test/reference/raster-source.base.rgb24.ref.png | Bin 0 -> 1209 bytes + test/reference/raster-source.ref.png | Bin 0 -> 1209 bytes + test/reference/raster-source.traps.argb32.ref.png | Bin 0 -> 1209 bytes + test/reference/raster-source.traps.rgb24.ref.png | Bin 0 -> 1209 bytes + util/cairo-trace/trace.c | 27 +- + 29 files changed, 801 insertions(+), 686 deletions(-) + +commit 2c4f6bbfbcaacea41386c36f42210120ee815055 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 24 01:08:30 2011 +0000 + + gl: Prevent the traps compositor from exploding + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-compositor-private.h | 3 ++ + src/cairo-gl-composite.c | 5 +-- + src/cairo-gl-glyphs.c | 10 ++++-- + src/cairo-gl-operand.c | 2 ++ + src/cairo-gl-surface.c | 2 ++ + src/cairo-gl-traps-compositor.c | 62 ++++++++++++++++++++++++++------------ + src/cairo-image-compositor.c | 8 ++++- + src/cairo-traps-compositor.c | 20 ++++++++++++ + src/cairo-xlib-render-compositor.c | 13 +++++++- + src/test-null-compositor-surface.c | 8 ++++- + 10 files changed, 105 insertions(+), 28 deletions(-) + +commit 5e4a0bd892263a5801fdaaa9fa5dbbcfc14c211a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 23:05:14 2011 +0000 + + gl: Embed a operand into the surface for pass-through + + The traps compositor expects to be able to pass either in a surface or a + source to its composite functions, so make it so. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-private.h | 93 ++++++++++++++++++++++++++------------------------ + src/cairo-gl-surface.c | 24 +++++++++++++ + 2 files changed, 72 insertions(+), 45 deletions(-) + +commit 4cf001244a589b5bf1b3745327948f87c397c22f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 22:53:50 2011 +0000 + + gl: Avoid cleaning up an uninitialised composite upon UNSUPPORTED + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-spans-compositor.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5edb3a29b9210fda9e2dc95f7a999675402b471c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 22:08:03 2011 +0000 + + gl: Fallback for complex subsurfaces + + In the process we need to supply the sampled area and operation extents + into the operands. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 24 +++----- + src/cairo-gl-glyphs.c | 3 +- + src/cairo-gl-msaa-compositor.c | 16 ++---- + src/cairo-gl-operand.c | 119 +++++++++++++++++++++++++++------------- + src/cairo-gl-private.h | 17 +++--- + src/cairo-gl-spans-compositor.c | 23 +++----- + src/cairo-gl-traps-compositor.c | 7 +-- + 7 files changed, 113 insertions(+), 96 deletions(-) + +commit 12b8f941612d131793cc053d49cd7759aa5c97ca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 21:39:25 2011 +0000 + + gl: Correctly offset sub-image uploads + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-surface.c | 33 +++++++++++++++++++++------------ + 1 file changed, 21 insertions(+), 12 deletions(-) + +commit e280e67b86040b5c0b256d24c0cc644f13761d89 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 21:20:21 2011 +0000 + + gl: Update glyphs to use cairo_gl_source_t + + It was being passed into the function but then interpreted as a + cairo_pattern_t. Fix it! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-glyphs.c | 24 +++++++++++------------- + src/cairo-gl-private.h | 9 +++++++++ + src/cairo-gl-spans-compositor.c | 25 +++++++++++++++++++------ + src/cairo-gl-traps-compositor.c | 6 ------ + 4 files changed, 39 insertions(+), 25 deletions(-) + +commit d99ebe9862743c99ebe263ea0e8526a5a082d6db +Author: Martin Robinson <mrobinson@igalia.com> +Date: Fri Nov 11 14:25:56 2011 -0800 + + gl: Properly prepare the source when compositing glyphs with a mask. + + After the architecture rewrite, glyph compositing via a mask was + disabled. This change reinstates that. + + src/cairo-gl-glyphs.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +commit 33c59030b566ef647c007858b81af6317a8d8740 +Author: Martin Robinson <mrobinson@webkit.org> +Date: Thu Oct 13 15:52:57 2011 -0700 + + gl: Fix offset for non-texture surface patterns + + Instead of drawing only a portion of the image into the intermediate + texture, draw the entire image and adjust the translation matrix to + compensate. + + src/cairo-gl-operand.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit c94c3eede088fed36866c934a2637ea49e687a1c +Author: Martin Robinson <mrobinson@igalia.com> +Date: Thu Oct 27 11:50:18 2011 -0700 + + gl/msaa: Fix scissor bounds + + Scissor bounds should depend on both the height and y coordinate + of the bounding box. Also remove _cairo_gl_y_flip() since we were + the last caller. + + src/cairo-gl-msaa-compositor.c | 5 +++-- + src/cairo-gl-private.h | 9 --------- + 2 files changed, 3 insertions(+), 11 deletions(-) + +commit e3ec127e39bfa567f5d5d795216523f334e76850 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 23 20:15:55 2011 +0100 + + subsurface: Fix 'make check' + + 2fb4a0e119b075921442dd2266f4dcc24c9f12e7 made the + _cairo_surface_subsurface_set_snapshot available with default + visibility. + + 'make check' correctly points out that it should be marked as private. + + src/cairo-surface-subsurface-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6a2b754ec9d2e6dd52b9e51fd674531b3a7e2320 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 18:22:59 2011 +0000 + + xlib: Eliminate redundant copies of subsurfaces + + If the sample is wholly contained within the subsurface of the original, + we can simply use the original with an offset; thereby only copying the + data if we are sampling outside the subsurface bounds. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-source.c | 207 +++++++++++++++++++++++++----------------------- + 1 file changed, 106 insertions(+), 101 deletions(-) + +commit 49d3a6a95e52876a8660855589d01bd0ec8ab473 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 17:34:29 2011 +0000 + + xlib: Cache the subsurface Picture + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-source.c | 79 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 52 insertions(+), 27 deletions(-) + +commit 763d98071e2bdcddb7694e993905d27345b54b2d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 17:32:53 2011 +0000 + + surface: Bump reference count around finish + + In order to handle reference cycles during finish (through snapshots) we + need to bump the reference on the surface first. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 53 ++++++++++++++++++++++++++++++-------------------- + src/cairo-xcb-screen.c | 4 ---- + 2 files changed, 32 insertions(+), 25 deletions(-) + +commit 2fb4a0e119b075921442dd2266f4dcc24c9f12e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 15:49:53 2011 +0000 + + subsurface: Support caching for cloned subsurfaces + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface-private.h | 4 ++++ + src/cairo-surface-subsurface.c | 28 ++++++++++++++++++++++++++++ + 2 files changed, 32 insertions(+) + +commit 894d8c8bf7cd83be8775c79233f21d9c11c14b2a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 15:40:15 2011 +0000 + + xlib: Handle subsurfaces correctly + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-source.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 99 insertions(+) + +commit e217677ce6a3f853144d1bc2b33423e1e0a64773 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 14:57:35 2011 +0000 + + xlib: ADD only reduces to SOURCE for alpha-only targets + + Fixes operator. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-render-compositor.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 44a868b552f0cbf22f35e8a4e4e0daee555344a3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 14:28:27 2011 +0000 + + subsurface: And remove the dead code for releasing complex source + + Following the previous commit, we only allocate a simple image when + acquiring the source so we only need to unreference it upon release. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface.c | 14 -------------- + 1 file changed, 14 deletions(-) + +commit 1fe16f75b1c7707949eaa9f5c34f908784990b60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 14:12:50 2011 +0000 + + image: Remove dubious "optimisations" for acquired source images + + By this point we have already paid the penalty for acquiring the source + image, so kiss. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 29 ----------------------------- + 1 file changed, 29 deletions(-) + +commit c52129feb429863f820928434185b6605dd4f1a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 12:25:59 2011 +0000 + + subsurface: Simplify acquire_source_image + + Remove all of the special casing and simply extract the source. The time + for special casing is to avoid calling the generic acquire in the first + place, so kiss. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface.c | 136 +++++++---------------------------------- + 1 file changed, 21 insertions(+), 115 deletions(-) + +commit 73dc2c4e272f52dfffb2c268f4e8ee5ff0d57639 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 23 12:05:43 2011 +0000 + + image: Only unwrap a subsurface if the sample is fully contained + + In order to handle out-of-bounds sampling of a subsurface target we need + to first avoid incorrectly unwrapping it. + + Fixes crash in subsurface-outside-target + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 30 ++++++++++++++++-------------- + 1 file changed, 16 insertions(+), 14 deletions(-) + +commit 8d989d2b2dfe74884e0233fbaefb02064b19ca8c +Author: Murray Cumming <murrayc@murrayc.com> +Date: Fri Nov 18 10:56:55 2011 +0100 + + cairo_surface_observer_mode_t: Remove trailing comma. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 56746110fe0a83979ceb51f7b186b2b74f7ff974 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 21 16:57:42 2011 +0000 + + polygon-intersection: Finish any edges upon intersection + + In order to keep the bookkeeping in order, and so prevent a later + assert, we need to clear any edges when swapping the active edge order + upon an intersection event. The active edges are then reconstructed. + + Fixes evince http://www.horizonhobby.com/pdf/BLH3500-Manual_EN.pdf + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon-intersect.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit adb5eb6f69db3fa26abb7cfe64cad84f82eb96bb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 18 12:23:02 2011 +0100 + + xcb: Fix typo + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9ecc3aafca25cdf215ce74fe1edbddfdf18b3e10 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 18 10:04:12 2011 +0000 + + perf: Compile fix, add the index to cairo_perf_report_load() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-graph-files.c | 2 +- + perf/cairo-perf-print.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 2283ab969801ef6c610ad20a58693a5b55382c8a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 18 10:01:55 2011 +0000 + + xcb: Handle SHM exhaustion gracefully + + Avoid the assertion failure of creating an error surface for an internal + status by handling the expected UNSUPPORTED condition. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit c8dca5dad678258ee1bf7d60f5a6f766060c7fce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 18 09:59:34 2011 +0000 + + Revert "xcb: Fix xcb-huge-image-shm" + + This reverts commit 3a94f4c7091ea6262007e7960e4cd915e17b33c0. + + We need to fallback to pushing large images over the wire if we exhaust + the SHM space. + + src/cairo-xcb-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3a94f4c7091ea6262007e7960e4cd915e17b33c0 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Nov 15 19:46:46 2011 +0100 + + xcb: Fix xcb-huge-image-shm + + The test failed with the following message: + + cairo-surface.c:2265: _cairo_surface_create_in_error: Assertion `status < + CAIRO_STATUS_LAST_STATUS' failed. + + _cairo_xcb_surface_create_shm_image() passed the error from + _cairo_xcb_connection_allocate_shm_info() to _create_in_error(). + + Fix this by never returning CAIRO_INT_STATUS_UNSUPPORTED from + _allocate_shm_info(). All other error cases in that function return + CAIRO_STATUS_NO_MEMORY, too. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit edc238b40fba2e0e10b09521d87775edbf6f7814 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Nov 15 19:10:50 2011 +0100 + + xcb: Fix some invalid casts + + cairo-xcb was deciding which type to cast a surface to based on its "type" + member. This is wrong, it should use "backend->type". + + This bug was hit via xlib-xcb. This was painting a subsurface of a xlib-xcb + surface to an xcb surface. Because surface->type said "xlib", the code was + trying to check if the xcb surface had a fallback. However, this was done on the + subsurface. The end result was dereferencing a pointer to 0x28. + + This was noticed while looking into + https://bugs.freedesktop.org/show_bug.cgi?id=42889 + + No test for this bug since I didn't manage to come up with one. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit 1501c86536fcf21ce168644de58bfbc27ff6e710 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 1 18:02:15 2011 +0100 + + test: Do not open files in non-existing dirs + + The output directory should be made before trying to open log files in + it. + + Fixes the bug causing cairo-test-suite to log to stderr on the first + run (i.e. when test/output does not exist). + + test/cairo-test.c | 38 ++++++++++++++++++++------------------ + 1 file changed, 20 insertions(+), 18 deletions(-) + +commit 603ea229b54c858d12ffc80a478f1fb0f4023a72 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 28 15:04:59 2011 +0200 + + test: Use cairo_test_list_t for the main test list + + Instead of embedding the pointer in the test structure, consistently + use the cairo_test_list_t structure for test lists. + + This cleans up the code as the reverse-list operation can be reused. + + Moreover this makes the code clearer, because each test list is now + independent and has no way to know about other test lists. + + test/cairo-test-runner.c | 24 ++++++------------------ + test/cairo-test.h | 3 +-- + 2 files changed, 7 insertions(+), 20 deletions(-) + +commit abced5b88281a2ada819ccfe670616024765b7f7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 28 17:31:00 2011 +0200 + + boilerplate: Fix svg extension + + The svg backend produces .svg files. Using the appropriate extension + allows the test suite to check the vector output in addition to the + PNG images. + + boilerplate/cairo-boilerplate-svg.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit de6a1e68fe89140d37fb4b64374c12a56b64f305 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 28 11:31:12 2011 +0200 + + Remove useless checks for NULL before freeing + + This patch has been generated by the following Coccinelle semantic patch: + + // Remove useless checks for NULL before freeing + // + // free (NULL) is a no-op, so there is no need to avoid it + + @@ + expression E; + @@ + + free (E); + + E = NULL; + - if (unlikely (E != NULL)) { + - free(E); + ( + - E = NULL; + | + - E = 0; + ) + ... + - } + + @@ + expression E; + @@ + + free (E); + - if (unlikely (E != NULL)) { + - free (E); + - } + + src/cairo-cogl-gradient.c | 3 +-- + src/cairo-cogl-surface.c | 12 ++++------ + test/cairo-test.c | 59 +++++++++++++++-------------------------------- + 3 files changed, 24 insertions(+), 50 deletions(-) + +commit c65d4e35dcdebc21d80c440944c11e1067743a8f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 26 17:46:53 2011 +0200 + + Use xstrdup instead of xmalloc when possible + + Don't open code xstrdup, just use it. + + perf/cairo-perf-report.c | 6 ++---- + test/cairo-test.c | 10 ++-------- + 2 files changed, 4 insertions(+), 12 deletions(-) + +commit 6dfb12c7d7c4ada716c86dbb9af3446d9880ed36 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 27 09:49:25 2011 +0200 + + test: Reuse cairo_test_logv() + + cairo_test_log() can be implemented on top of cairo_test_logv() to + ensure that their behavior is consistent. + + test/cairo-test.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 549b1f8d4bf6e20cecd281343f5e4630938697cc +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 26 19:16:17 2011 +0200 + + boilerplate: Remove unused thread id parameter + + The thread id is not used anymore (it is always == 0), so it can be + removed. + + boilerplate/cairo-boilerplate-cogl.c | 2 -- + boilerplate/cairo-boilerplate-directfb.c | 1 - + boilerplate/cairo-boilerplate-drm.c | 1 - + boilerplate/cairo-boilerplate-egl.c | 1 - + boilerplate/cairo-boilerplate-glx.c | 3 -- + boilerplate/cairo-boilerplate-pdf.c | 1 - + boilerplate/cairo-boilerplate-ps.c | 7 ++-- + boilerplate/cairo-boilerplate-qt.cpp | 1 - + boilerplate/cairo-boilerplate-quartz.c | 1 - + boilerplate/cairo-boilerplate-script.c | 1 - + boilerplate/cairo-boilerplate-skia.c | 1 - + boilerplate/cairo-boilerplate-svg.c | 7 ++-- + boilerplate/cairo-boilerplate-test-surfaces.c | 9 ------ + boilerplate/cairo-boilerplate-vg.c | 2 -- + boilerplate/cairo-boilerplate-wgl.c | 2 -- + boilerplate/cairo-boilerplate-win32-printing.c | 1 - + boilerplate/cairo-boilerplate-win32.c | 1 - + boilerplate/cairo-boilerplate-xcb.c | 5 --- + boilerplate/cairo-boilerplate-xlib.c | 45 +++----------------------- + boilerplate/cairo-boilerplate.c | 3 -- + boilerplate/cairo-boilerplate.h | 1 - + perf/cairo-analyse-trace.c | 1 - + perf/cairo-perf-micro.c | 1 - + perf/cairo-perf-trace.c | 1 - + test/cairo-test-trace.c | 1 - + test/cairo-test.c | 2 -- + test/fallback-resolution.c | 2 -- + test/ps-eps.c | 1 - + util/cairo-sphinx/sphinx.c | 2 +- + 29 files changed, 9 insertions(+), 98 deletions(-) + +commit b07b242220daab5b9252d9f0d889886ad74bd31d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 26 18:17:03 2011 +0200 + + test: Remove unused thread field + + The multi-threaded test path does not exist anymore and the ctx->thread + field is always 0, hence it can be removed. + + test/cairo-test.c | 310 ++++++++++++++++++++++-------------------------------- + test/cairo-test.h | 2 - + 2 files changed, 123 insertions(+), 189 deletions(-) + +commit 6ef9779a6f5cb86fc0e858ce017a5d2c9efbaa43 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 26 17:24:37 2011 +0200 + + test: Remove dead code + + This code is unused and can be removed. + + test/cairo-test-private.h | 6 -- + test/cairo-test.c | 184 ---------------------------------------------- + test/cairo-test.h | 4 - + 3 files changed, 194 deletions(-) + +commit 97b219a5e74a30c5cb80dc7012cab8d118dd753a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 26 17:16:06 2011 +0200 + + test: Re-enable pass-through + + The pass-through test was not updated to the current test conventions + and was not enabled in the Makefiles. + + test/Makefile.sources | 1 + + test/pass-through.c | 20 ++++++-------------- + 2 files changed, 7 insertions(+), 14 deletions(-) + +commit c8b5d270f6a9f36e14d6e1462dfd589475926be8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 2 16:50:37 2011 -0700 + + Improve the documentation of the flags + + Some utilities were providing incorrect or incomplete usage + information. + + perf/cairo-analyse-trace.c | 11 +++++------ + perf/cairo-perf-micro.c | 10 +++++----- + perf/cairo-perf-trace.c | 13 +++++++------ + test/cairo-test-runner.c | 9 ++++----- + test/cairo-test-trace.c | 7 +++---- + 5 files changed, 24 insertions(+), 26 deletions(-) + +commit 6a0ba303035997fcd5f28bcd32297f9bc21bd45a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 2 16:15:59 2011 -0700 + + Sort option flags + + Keep the option flags in alphabetical order. This makes it easier to + check for collisions or missing handlers. + + Avoids an internal error when passing flags -c, -r or -v to + cairo-analyse-trace. + + perf/cairo-analyse-trace.c | 2 +- + perf/cairo-perf-micro.c | 12 ++++++------ + perf/cairo-perf-trace.c | 24 ++++++++++++------------ + test/cairo-test-runner.c | 16 ++++++++-------- + test/cairo-test-trace.c | 2 +- + 5 files changed, 28 insertions(+), 28 deletions(-) + +commit 0e18cc6d27e59e42c6632b21c5502174c8a9eb08 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 11 12:20:28 2011 +0100 + + boilerplate: Provide close callback after opening any2ppm output + + cairo_boilerplate_open_any2ppm() returns a FILE* obtined from popen() + or fdopen(). It should hence be closed using pclose() or fclose() + respectively. + + Fixes the crash on every script test on MacOS X. + + boilerplate/cairo-boilerplate.c | 11 ++++++++--- + boilerplate/cairo-boilerplate.h | 4 +++- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit 90b2fd34fbd8b13b0daea7780051546d1c603a33 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 14:15:49 2011 +0100 + + cairo-script: Don't ask for inlining of a cold-path function + + Silences a lot of warnings: + + inlining failed in call to 'scan_read.part.9': call is unlikely and + code size would grow + + util/cairo-script/cairo-script-scanner.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f96e78fa546d5d9f5016fa30fb60ce5dcf9a0a8e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 13:56:50 2011 +0100 + + Silence some 'unused var' warnings + + boilerplate/cairo-boilerplate.c | 2 -- + perf/cairo-stats.c | 2 +- + test/mask-glyphs.c | 2 -- + 3 files changed, 1 insertion(+), 5 deletions(-) + +commit d883775f690ec9e6f89a1ae16cb7d9c2e7a15897 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 13:46:47 2011 +0100 + + xml: Fix backend structure + + The xml backend structure was being initialized with the wrong + functions, resulting in multiple "initialization from incompatible + pointer type" warnings. + + src/cairo-xml-surface.c | 37 +++++++++++-------------------------- + 1 file changed, 11 insertions(+), 26 deletions(-) + +commit 26d5bb0eccb05de7d34056d63802736301f31b9c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 13:34:53 2011 +0100 + + default-context: Fix 'make check' + + 'make check' reports: + + Checking that .libs/libcairo.so has the same symbol list as cairo.def + 1a2,3 + > _cairo_default_context_fini + > _cairo_default_context_init + + Checking .libs/libcairo.so for local PLT entries + 0011a274 00025f07 R_386_JUMP_SLOT 00026350 _cairo_default_context_fini + 0011a494 00027607 R_386_JUMP_SLOT 00026480 _cairo_default_context_init + + Marking these functions as cairo_private fixes the problem. + + src/cairo-default-context-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f5c00042b03c96616b5ae16e294c8b5bb220cf15 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 12:28:31 2011 +0100 + + cogl: Fix 'make check' + + 'make check' reports: + + ./cairo-cogl-context.c: * cairo_path_fixed_t in user coordinates that we can use to create a + ./cairo-cogl-context.c: * We use this hash to lookup a cairo_cogl_path_meta_t struct which + ./cairo-cogl-context.c: * need to use the cairo_path_fixed_t api to describe a rectangle in terms of + ./cairo-cogl-context.c: * passed the current cairo_t context we don't have a good way + Error: some type names in the docs are not prefixed by hash sign, + neither are the only token in the doc line followed by colon. + Fix this by searching for the following regexp in the above files: + '^[^:]*:[/ ][*]\( .*[^#']\| \|^\)\<cairo[0-9a-z_]*_t\>\($\|[^:]$\|[^:].\)' + + ./cairo-cogl-context.c: * cairo_path_fixed_t in user coordinates that we can use to create a + ./cairo-cogl-context.c: * We use this hash to lookup a cairo_cogl_path_meta_t struct which + ./cairo-cogl-context.c: * need to use the cairo_path_fixed_t api to describe a rectangle in terms of + ./cairo-cogl-context.c: * passed the current cairo_t context we don't have a good way + Error: some function names in the docs are not followed by parentheses. + Fix this by searching for the following regexp in the above files: + '^[^:]*:[/ ][*]\(\|[ ].*\)\([^#']\|^\)\<\(cairo_[][<>/0-9a-z_]*\>[^][<>(]\)' + + Checking that source files #include "cairoint.h" first (or none) + cairo-cogl-context.c:#include "cairo-cogl-context-private.h" + + These are fixed trivially by this patch. + + src/cairo-cogl-context.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 7688da22450efeb0f612495489e17828830c4db1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 12:13:53 2011 +0100 + + vg: Fix build + + Add the missing includes, fix a typo and some changes in the + signatures of the backend functions. + + The dest acquisition functions can be removed as they are not used + anymore in the new compositor architecture (this will probably cause + failures when fallbacks are tried because of unsupported operations). + + src/cairo-vg-surface.c | 151 +++++++++++-------------------------------------- + 1 file changed, 34 insertions(+), 117 deletions(-) + +commit 54c8a08f3e1d1ee90903e3b58f4d16202f16eff4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 9 11:25:32 2011 +0100 + + quartz-image: Fix build + + Add missing headers and fix some minor things (typos, missing + arguments, changed function name). + + Map and unmap now rely on the generic path. + + src/cairo-quartz-image-surface.c | 56 +++++++++++++++++++++++----------------- + 1 file changed, 32 insertions(+), 24 deletions(-) + +commit f9aa85f5fe8015204fdab228c6a7b9b0e99b277f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 2 13:10:18 2011 +0100 + + stroke: Fix typos + + The condition was comparing out with itself (always resulting in a + true result) instead of out and in. + + Pointed out by Clang as "idempotent operation". + + src/cairo-path-stroke-polygon.c | 4 ++-- + src/cairo-path-stroke-tristrip.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit c64ec4e49c1f06a451187d5f8360df09a777f61c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 2 11:00:40 2011 +0000 + + gl: Initialize spans on the context + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 2a453ee7df543441986b0a52ec2c2de72005c091 +Merge: ba855a1 8ddecc0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 27 19:00:58 2011 +0100 + + Merge branch 'master' of git://cairographics.org/git/cairo + +commit 8ddecc08a5e4fc43368c01e4e85215962b009b92 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Thu Oct 27 18:09:23 2011 +0200 + + xlib: Check pixman format before trying to create an image surface for it + + src/cairo-xlib-surface.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 5c3156667898a1b111ae586c69c66378b7dafed6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 26 15:10:59 2011 +0200 + + rectangle: Fix warning + + In 545f3085.. the cairo_spline_add_point_func_t type was modified to + accept the tangent in the point, but cairo-rectangle.c was not updated + accordingly. + + Fixes: + + cairo-rectangle.c: In function '_cairo_box_add_curve_to': + cairo-rectangle.c:297:11: warning: passing argument 1 of + '_cairo_spline_bound' from incompatible pointer type + + src/cairo-rectangle.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 26c9994393f590c43714ba8d799093b84dd94dc6 +Author: Ehsan Akhgari <ehsan@mozilla.com> +Date: Mon Oct 17 10:48:50 2011 -0400 + + Avoid defining inline when compling C++ on MSVC. + + Cairo fails to build with VC11 because it tries to #define inline, + which is a keyword in C++. VC11's xkeycheck.h catches this with an #error. + https://bugzilla.mozilla.org/show_bug.cgi?id=694797 + + src/cairo-compiler-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3813066f134d6dde7ff75f3909575beeddc685ed +Author: Martin Robinson <mrobinson@igalia.com> +Date: Sat Oct 15 09:05:19 2011 +0100 + + gl/msaa: Fix glScissor bounds + + When scissoring the compositing extents for windows, flip + the y coordinate as windows use a projection matrix that + does the same. + + src/cairo-gl-msaa-compositor.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit cc3f06a58a91bf52ca4f958c96ee1e598cdaa62d +Merge: 571a27b 10ebda8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 15 08:59:35 2011 +0100 + + Merge branch 'master' of git://cairographics.org/git/cairo + +commit ba855a12e8d686f2137f82d317791f3ec4a68fc0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 14 16:01:27 2011 +0100 + + xlib-xp + + src/cairo-surface-subsurface.c | 2 ++ + src/cairo-xlib-source.c | 17 ++++++++++------- + 2 files changed, 12 insertions(+), 7 deletions(-) + +commit 10ebda8698425a23f07b3062233500ec22ebc347 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 14 13:21:40 2011 +0100 + + xlib: Reduce the composite traps operator for when the dest is clear + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-render-compositor.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit a8c3a22f2d98d0d1e9fd182857222d304d83dc22 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 14 13:14:14 2011 +0100 + + gl/msaa: Markup the new symbols as private for PLT hiding + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e8dd13c8fa39c1e3118a4f197ee8865237be7e09 +Author: Taekyun Kim <tkq.kim@samsung.com> +Date: Wed Oct 12 20:31:33 2011 +0900 + + image: Maximum number of spans can be upto (extents->width + 1) + + The range of span's x coordinate is between xmin and xmax. So we + have to allocate the span array with size of xmax - xmin + 1. + + src/cairo-tor-scan-converter.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit c25027f2a1570b78c314896a127e518db370645c +Author: Martin Robinson <mrobinson@webkit.org> +Date: Fri Oct 7 15:34:13 2011 -0700 + + gl/msaa: Support for solid color strokes. + + Add support for basic solid color strokes using the fixed path + stroke shaper. Currently components of the stroke overlap, but + that will be handled in the following patch. + + src/cairo-gl-composite.c | 17 +++++- + src/cairo-gl-msaa-compositor.c | 131 ++++++++++++++++++++++++++++++++++++++++- + src/cairo-gl-private.h | 7 ++- + 3 files changed, 151 insertions(+), 4 deletions(-) + +commit 32aa361c5ea0c761e26bc6fd94acfddd8df3b759 +Author: Martin Robinson <mrobinson@webkit.org> +Date: Tue Sep 27 08:42:36 2011 -0700 + + gl/msaa: Add clipping support + + Adds basic clipping to the OpenGL MSAA compositor via the + depth and stencil buffers. Stenciling and depth bits are + stored in a renderbuffer. + + Note that we only attach renderbuffers to surfaces created by ourselves + and not for foreign drawables (e.g. X Windows). + + src/cairo-gl-device.c | 27 ++++++++++- + src/cairo-gl-dispatch-private.h | 5 ++ + src/cairo-gl-msaa-compositor.c | 102 +++++++++++++++++++++++++++++++++++++--- + src/cairo-gl-private.h | 11 ++++- + src/cairo-gl-surface.c | 4 +- + 5 files changed, 139 insertions(+), 10 deletions(-) + +commit 13d9d07ccd92454f8eb0a1f2d59c8829ac471cb4 +Author: Martin Robinson <mrobinson@webkit.org> +Date: Mon Sep 26 14:45:23 2011 -0700 + + gl/msaa: Implement basic solid color fill + + Introduce the very basic functionality of an MSAA compositor + for OpenGL. For this first patch only solid fills are supported. + + src/cairo-gl-composite.c | 167 ++++++++++++++++++++++++++++++++++++++--- + src/cairo-gl-device.c | 7 +- + src/cairo-gl-msaa-compositor.c | 101 ++++++++++++++++++++++++- + src/cairo-gl-private.h | 11 +++ + 4 files changed, 274 insertions(+), 12 deletions(-) + +commit 9f85eb52d834200802a05ac1dd5fa045217adf5f +Author: Martin Robinson <mrobinson@webkit.org> +Date: Tue Oct 11 09:37:51 2011 -0700 + + gl/msaa: Introduce an MSAA compositor for OpenGL + + The MSAA compositor will composite OpenGL primitives directly and + anti-alias via the GPU. + + src/Makefile.sources | 1 + + src/cairo-gl-msaa-compositor.c | 110 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 3 ++ + 3 files changed, 114 insertions(+) + +commit 7df2c113b16666d4b1f3e4c6f4cb045c40929c4f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 13 13:02:51 2011 +0100 + + ft: Add missing break to enable BGR subpixel rendering + + Reported-by: Ingo Ruhnke <grumbel@gmx.de> + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=40456 + Original-patch-by: Simon Elmir <nerd65536+freedesktop@gmail.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ft-font.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 9208df1630a535d473f656575c61a0ccf0c2a89c +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 13 12:46:03 2011 +0200 + + test: Add text-antialias-subpixel-{,v}{bgr,rgb} + + There were no tests for any subpixel order but rgb, so let's write something for + all four possibilities. + + This is mostly copy&paste from test/text-antialias.c (and + text-antialias-subpixel-rgb does the same thing as text-antialias-subpixel). + + Test for: https://bugs.freedesktop.org/show_bug.cgi?id=40456 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.sources | 1 + + .../text-antialias-subpixel-bgr.image16.ref.png | Bin 0 -> 863 bytes + test/reference/text-antialias-subpixel-bgr.ref.png | Bin 0 -> 1001 bytes + .../text-antialias-subpixel-rgb.image16.ref.png | Bin 0 -> 863 bytes + test/reference/text-antialias-subpixel-rgb.ref.png | Bin 0 -> 1004 bytes + .../text-antialias-subpixel-vbgr.image16.ref.png | Bin 0 -> 864 bytes + .../reference/text-antialias-subpixel-vbgr.ref.png | Bin 0 -> 992 bytes + .../text-antialias-subpixel-vrgb.image16.ref.png | Bin 0 -> 862 bytes + .../reference/text-antialias-subpixel-vrgb.ref.png | Bin 0 -> 1004 bytes + test/text-antialias-subpixel.c | 123 +++++++++++++++++++++ + 10 files changed, 124 insertions(+) + +commit 282cfff15663a0c1ee5f3c8e53745d2c7f47539e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 17:12:09 2011 +0100 + + recording-surface: Initialize optimize-clears before use in snapshotting + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit f84f6ecaa46d6e6ab1ebdf024fddc46bfacf2c0c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 17:09:12 2011 +0100 + + gstate: Prevent leak of old clip when creating a group with translation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gstate.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8f34fa033e741eed040ff8895fcb94b8507903b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 17:04:16 2011 +0100 + + spans: Refresh polygon limits after trimming the composite extents + + Trimming the composite extents may result in the clip being + reconstructed, but we the polygon continued to hold a reference into the + freed clip's array of boxes. So if we intend to reuse the polygon limits + after performing the clip we need to refresh them. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon.c | 44 +++++++++++++++++++++++++++++++------------- + src/cairo-spans-compositor.c | 3 +++ + src/cairoint.h | 9 +++++++++ + 3 files changed, 43 insertions(+), 13 deletions(-) + +commit d576319e1346712a54802f372f742a24dbcdadd9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 16:28:30 2011 +0100 + + recording-surface: Optimize away anything below an opaque fill + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 8f5736b8b15eb2280cde6935c00171cda5c03a29 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 16:19:58 2011 +0100 + + recording-surface: Free the contents of the command array when clearing + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +commit 9c63168b5f4cccdda5cad939f6d3f0745202069d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 16:19:33 2011 +0100 + + clip: Replace the original clip when transforming + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 17173f961369fe4210588a8cf56f9b8276d1e10f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 16:01:42 2011 +0100 + + clip: Free the freed clip pool on reset + + To keep valgrind happy. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip.c | 1 + + 1 file changed, 1 insertion(+) + +commit a7d04703579fae9c2d944feb02116fc33f86f45f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 15:56:36 2011 +0100 + + surface-clipper: Fix path leak due to typo + + When finishing the path, it is better to call fini() rather than init() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-clipper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ea50ca68832fd49e06aba2b60490175ee66f4412 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 15:10:10 2011 +0100 + + test: Add clip-polygons + + To exercise the recent bug found in handling empty clip surfaces. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/clip-polygons.c | 112 +++++++++++++++++++++++++++++ + test/reference/clip-polygons.base.ref.png | Bin 0 -> 1296 bytes + test/reference/clip-polygons.ref.png | Bin 0 -> 1355 bytes + test/reference/clip-polygons.traps.ref.png | Bin 0 -> 1268 bytes + 5 files changed, 113 insertions(+) + +commit b2aa687de6f6c3bf915c492126101311395e2692 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 14:50:41 2011 +0100 + + spans: Propagate internal status when retrieving the clip surface + + Including the information that there is nothing to do due to being + all-clipped-out. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 8 ++++++-- + src/cairo-surface-private.h | 3 +++ + src/cairo-surface.c | 21 +++++++++++++++++++++ + 3 files changed, 30 insertions(+), 2 deletions(-) + +commit 5d1a17f354987140719f439c6c105c05c9510839 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 12 14:26:08 2011 +0100 + + mono: Silence valgrind by placing a sentinel value in the sorted buckets + + If the edges finish before we complete the last scanline, we will + attempt to skip over the remaining lines using min_height of the + sentinel edge (MAX_INT). This causes us to read beyond the end of the + array of insertion buckets, unless we place a sentinel value in there to + break the loop. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 88a1b83177ecaf044a3425abc8faa571ca2b41f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 11 13:49:36 2011 +0100 + + observer: Fix typo and handle the condition of no script device + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c8bfa8c0888b16747c5e07ca4b844d5feabd8756 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 11 12:44:25 2011 +0100 + + xcb: Re-enable glyph rendering + + I lost the '&& 0' I put in to disable the glyph rendering until I had + the glyph cache integration working again. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a09f70586df52d9d3156d64de5fbc6a2b92a1cce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 11 12:01:31 2011 +0100 + + gl: Remove unused alpha argument from operand_emit + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 6 +++--- + src/cairo-gl-operand.c | 3 +-- + src/cairo-gl-private.h | 3 +-- + 3 files changed, 5 insertions(+), 7 deletions(-) + +commit 4f5d42f6e59010ceaa68bff9be4353aa5f4d2e53 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 11 11:42:45 2011 +0100 + + gl: Spans start after the mask, not coincident! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 41633913229fac2833edb6f10ab8d39d4df16aed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 11 11:30:47 2011 +0100 + + gl: Include use-coverage in shader hash + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-shaders.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 571a27b4fcfe11fec2b33c31525c353eb30c0ad7 +Author: Robert Bragg <robert@linux.intel.com> +Date: Thu Jul 21 12:15:05 2011 +0100 + + backends: Adds a new Cogl based backend + + This adds a new GPU accelerated backend for Cairo based on the Cogl 3D + graphics API. + + This backend aims to support Cairo in a way that translates as naturally + as possible to using a GPU, it does not strive to compete with the + anti-aliasing quality of the image backend if it can't be done + efficiently using the GPU - raw performance isn't the only metric of + concern, so is power usage. + + As an overview of how the backend works: + - fills are handled by tessellating paths into triangles + - the backend has an extra fill_rectangle drawing operation so we have + a fast-path for drawing rectangles which are so common. + - strokes are also tessellated into triangles. + - stroke and fill tessellations are cached to avoid the cpu overhead + of tessellation and cost of upload given that its common for apps to + re-draw the same path multiple times. The tessellations can survive + translations and rotations increasing the probability that they can be + re-used. + - sources and masks are handled using multi-texturing. + - clipping is handled with a scissor and the stencil buffer which + we're careful to only update when they really change. + - linear gradients are rendered to a 1d texture using a triangle + strip + interpolating color attributes. All cairo extend modes + are handled by corresponding texture sampler wrap modes without + needing programmable fragment processing. + - antialiasing should be handled using Cogl's multisampling API + + XXX: This is a work in progress!! + TODO: + - handle at least basic radial gradients (No need to handle full + pdf semantics, since css, svg and canvas only allow radial gradients + defined as one circle + a point that must lie within the first + circle.) - currently we fall back to pixman for radial gradients. + - support glyph rendering with a decent glyph cache design. The + current plan is a per scaled-font growable cache texture + a + scratch cache for one-shot/short-lived glyphs. + - decide how to handle npot textures when lacking hardware support. + Current plan is to add a transparent border to npot textures and use + CLAMP_TO_EDGE for the default EXTEND_NONE semantics. For anything else + we can allocate a shadow npot texture and scale the original to fit + that so we can map extend modes to texture sampler modes. + + boilerplate/Makefile.sources | 1 + + boilerplate/Makefile.win32.features | 12 + + boilerplate/cairo-boilerplate-cogl.c | 208 +++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 + + build/configure.ac.features | 1 + + configure.ac | 6 + + src/Makefile.sources | 10 + + src/Makefile.win32.features | 16 + + src/cairo-clip-private.h | 3 + + src/cairo-clip.c | 2 +- + src/cairo-cogl-context-private.h | 52 + + src/cairo-cogl-context.c | 820 ++++++++++ + src/cairo-cogl-gradient-private.h | 89 ++ + src/cairo-cogl-gradient.c | 643 ++++++++ + src/cairo-cogl-private.h | 164 ++ + src/cairo-cogl-surface.c | 2802 ++++++++++++++++++++++++++++++++++ + src/cairo-cogl-utils-private.h | 54 + + src/cairo-cogl-utils.c | 126 ++ + src/cairo-cogl.h | 69 + + src/cairo-debug.c | 4 + + src/cairo-default-context-private.h | 6 + + src/cairo-default-context.c | 36 +- + src/cairo-image-source.c | 4 +- + src/cairo-image-surface-private.h | 15 + + src/cairo.h | 5 +- + src/cairoint.h | 5 + + 27 files changed, 5141 insertions(+), 16 deletions(-) + +commit 5783bbfc750c73a4b36ad30a054de59a7ee99f34 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 9 19:53:56 2011 +0100 + + debug-traps + + src/cairo-traps.c | 35 +++++++++++++++++++++++++++++++++++ + src/cairoint.h | 3 +++ + 2 files changed, 38 insertions(+) + +commit 2cb4eb53feb9223db8db66c9f86d962cc7248f27 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Oct 9 19:53:16 2011 +0100 + + perf + + perf/cairo-perf-chart.c | 61 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 42 insertions(+), 19 deletions(-) + +commit 3d51ec8a7928f313d73023cabe0d760cf1946458 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 10 15:22:37 2011 +0100 + + botor: Remove a couple of inlines to cleanup -Winline + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-botor-scan-converter.c | 2 +- + src/cairo-freelist-private.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 34f507a919b0709caa2c0be30e43719356293dd1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 8 13:54:28 2011 +0100 + + gl: Need to increment reference count when copying operands + + Or else watch everything die with use-after-free of the cached + gradients. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 6 ++---- + src/cairo-gl-gradient.c | 6 +++--- + src/cairo-gl-operand.c | 24 ++++++++++++++++++++++++ + src/cairo-gl-private.h | 4 ++++ + 4 files changed, 33 insertions(+), 7 deletions(-) + +commit a6c27b500ba8f910ff2a731eb6989c96e8977339 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 8 11:08:43 2011 +0100 + + gl: Basic fixes to get cairo-gl running again + + Let there be textures! + + Unbreak the setup of surface operands after my lazy convertion to the + new compositor interface. This is still only the first step, but it gets + the essentials up and running again, enough to keep me happy whilst + sitting in the airport. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-gradient.c | 2 +- + src/cairo-gl-operand.c | 151 ++++++++++++++++++++++++++++++---------- + src/cairo-gl-private.h | 6 ++ + src/cairo-gl-spans-compositor.c | 2 +- + src/cairo-gl-surface.c | 9 ++- + 5 files changed, 126 insertions(+), 44 deletions(-) + +commit 22c485017df7979c47e9c4ba708279c8c35e5149 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 8 05:57:49 2011 +0100 + + gl: Declare coverage input for fragment shaders. + + The most minor of oversights which prevented compilation of any spans + based compositors. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-shaders.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit d825f6a263f9f9b27fa8160243e8a0a7c2778293 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Oct 9 09:39:25 2011 +0200 + + clip_intersect_boxes: Fix memleak + + There were two code path were we already had called + _cairo_boxes_init_for_array() on a local variable, but we tried to return + without going through _cairo_boxes_fini(). + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-clip-boxes.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit dca4e6c2dd6ebed73abbeb1dd87cb26a3b09685a +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Oct 9 09:37:03 2011 +0200 + + clip: Fix clip-double-free + + If the call to _cairo_clip_set_all_clipped() right after this is hit, + clip->boxes was freed twice. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-clip-boxes.c | 1 + + 1 file changed, 1 insertion(+) + +commit 4092e90be5aaedb1182650aa0aee0cae89883ea9 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Oct 9 09:26:28 2011 +0200 + + test: Add clip-double-free + + This test tries to exercise a double free bug in the clipping code. + + My webkit-based browser recently crashed a lot. Here is the reason why. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.sources | 1 + + test/clip-double-free.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 88 insertions(+) + +commit a419d00fbecf18736f5566e1c4e3786cc7b4586c +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Oct 8 13:40:11 2011 +0200 + + flush: Detach mime data + + Drawing directly to a surface has to be surrounded with cairo_surface_flush() + and cairo_surface_mark_dirty(). + + However, if the surface has mime data associated, this would hit the following + assert: + + lt-cairo-test-suite: cairo-surface.c:1381: cairo_surface_mark_dirty_rectangle: + Assertion `! _cairo_surface_has_mime_data (surface)' failed. + + This is now fixed by detaching all mime data in cairo_surface_flush(). + + Buzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41409 + + Fixes: create-from-png, create-from-png-stream + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit b9e5cd9572c09fb34153449163945dddda59468b +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Oct 8 13:37:20 2011 +0200 + + create-from-png*: Test mark_dirty with mime data + + This currently hits the following assertion: + + lt-cairo-test-suite: cairo-surface.c:1381: cairo_surface_mark_dirty_rectangle: + Assertion `! _cairo_surface_has_mime_data (surface)' failed. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41409 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/create-from-png-stream.c | 4 ++++ + test/create-from-png.c | 4 ++++ + 2 files changed, 8 insertions(+) + +commit 61fdaaf7e59a6238dec22feeed03b1a56b614a9d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 9 15:25:42 2011 +1030 + + cff: fallback if seac style endchar is found + + Bug 41548 + + src/cairo-cff-subset.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit e2dca74edf4c8f3cd66385b8ed931a412fc9698e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 9 14:55:46 2011 +1030 + + cff: in CID fonts the CID is the glyph index + + Need to use charset to map CID to GID. + + Bug 41548 + + src/cairo-cff-subset.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 95 insertions(+), 3 deletions(-) + +commit 5f3fd8c09c9542259d5c278eb7c0a2ef79f6e369 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Oct 8 10:48:26 2011 +0200 + + xlib: Fix compilation with --disable-xlib-xrender + + The boilerplate code tries to set PolyModePrecise on the xlib device. However, + because xrender is disabled, cairo-xlib-xrender.h wasn't included and didn't + include the needed xrender headers for this define. + + This define is copied from cairo-xlib-xrender-private.h + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xlib.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 960ae5ab2ee7910c9ef7b0b7df824d701c4d1729 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Oct 4 15:03:27 2011 +0200 + + Make the new mime-surface-api succeed + + When removing mime data, _cairo_user_data_array_set_data () is called with a + NULL argument. This leaves behind an entry with key == NULL in the user data + array. Skip those entries instead of dereferencing NULL. + + (The NULL entry in the array let's us avoid moving data around and/or doing a + memory allocation later, so I guess it might be a good idea to keep that) + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 38ce0850b8dba23c398faebb58905b5942e9c024 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Oct 4 14:58:41 2011 +0200 + + test: Add mime-surface-api + + This test checks if setting and unsetting mime data works correctly. E.g. this + verifies that we get the same pointer back which we passed in (=no copy made). + + This test currently crashes in its last call to cairo_surface_get_mime_data(). + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.sources | 1 + + test/mime-surface-api.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 152 insertions(+) + +commit 8664df767cb9dbe48647f9853e3dcf551701d3ca +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Sep 3 09:39:24 2011 -0700 + + quartz: Fix the 32-bits build on MacOSX 10.7 + + FMGetATSFontRefFromFont() is not public on Lion nor on 64-bits + Frameworks, but it seems to be available in the dynamic libs, hence we + can dlsym() it just like other private functions. + + Works around the error: + cairo-quartz-font.c: In function 'cairo_quartz_font_face_create_for_atsu_font_id': + cairo-quartz-font.c:830: error: implicit declaration of function 'FMGetATSFontRefFromFont' + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=39493 + + src/cairo-quartz-font.c | 26 ++++++++++++++++++-------- + src/cairo-quartz.h | 2 -- + 2 files changed, 18 insertions(+), 10 deletions(-) + +commit 80fff70e6c20f36cf871494391b8987294aff4a7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 30 16:30:15 2011 +0100 + + test: Add clip-rectilinear + + Exercise the clipping code with a rectilinear path (rather than a set of + boxes as per usual). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/clip-rectilinear.c | 90 ++++++++++++++++++++++++++ + test/reference/clip-rectilinear.base.ref.png | Bin 0 -> 440 bytes + test/reference/clip-rectilinear.ref.png | Bin 0 -> 439 bytes + test/reference/clip-rectilinear.traps.ref.png | Bin 0 -> 440 bytes + 5 files changed, 91 insertions(+) + +commit 538fa0d6fbfe5f03b325e2dfb296538295f3b409 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 30 15:58:14 2011 +0100 + + fill: Fix unantialiased rectilinear-fill-to-boxes + + We were calling the antialias close function from the unantialiased + paths - a function that operates on a completely different structure to + the one passed in. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 6 ++++-- + src/cairo-image-compositor.c | 2 +- + src/cairo-path-fill.c | 16 +++++++++++----- + src/cairo-traps-compositor.c | 16 +++++++++++++--- + util/cairo-script/csi-exec.c | 20 +++++++++++++++----- + 5 files changed, 44 insertions(+), 16 deletions(-) + +commit 719bef0c90b73850e373c70d627fa1f730be84a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 27 12:27:49 2011 +0100 + + image: Enable use of LERP_SRC for masked source composition + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 32 +++++++++++++++++++++++++++++++- + src/cairo-spans-compositor-private.h | 3 +++ + src/cairo-spans-compositor.c | 17 ++++++----------- + 3 files changed, 40 insertions(+), 12 deletions(-) + +commit 2994b0c634158f681d3ac2894270d609ed5af424 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 28 23:54:00 2011 +0100 + + stroke: Use the tessellator to resolve overlapping strokes + + If the stroke is too large, the strokes around the box overlap and we + fail to generate the canonical form of the boxes. So if we detect that + the boxes overlap, feed them through the tessellator to reduce them to + canonical form. + + Fixes line-width-overlap. + + Based on a patch by Paulo Zanoni <paulo.r.zanoni@intel.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-path-stroke-boxes.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 30eac7b2c5a3a2a9c5de4886cdd38666ef19cddb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 29 00:22:34 2011 +0100 + + test: Add line-width-large-overlap + + Exercise the case of stroking a box with a pen wider than the box + itself, a variation on line-width-overlap suggested by Paulo Zanoni. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/line-width-large-overlap.c | 149 +++++++++++++++++++++ + .../clip-fill-nz-unbounded.traps.rgb24.ref.png | Bin 0 -> 3198 bytes + .../line-width-large-overlap-dashed.ref.png | Bin 0 -> 338 bytes + .../line-width-large-overlap-dashed.xfail.png | Bin 0 -> 343 bytes + .../line-width-large-overlap-flipped.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-flopped.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-offset.ref.png | Bin 0 -> 305 bytes + .../line-width-large-overlap-rotated.base.ref.png | Bin 0 -> 404 bytes + .../line-width-large-overlap-rotated.ref.png | Bin 0 -> 406 bytes + .../line-width-large-overlap-rotated.traps.ref.png | Bin 0 -> 404 bytes + test/reference/line-width-large-overlap.ref.png | Bin 0 -> 305 bytes + .../line-width-overlap-offset.traps.argb32.ref.png | Bin 408 -> 0 bytes + .../line-width-overlap-offset.traps.ref.png | Bin 0 -> 365 bytes + .../line-width-overlap-offset.traps.rgb24.ref.png | Bin 408 -> 0 bytes + 15 files changed, 150 insertions(+) + +commit 82a7eac1de6a9f6896e382e55b2061cd17bf4dd6 +Author: Rob Bradford <rob@linux.intel.com> +Date: Tue Sep 27 15:29:06 2011 +0100 + + build: Specify the reference images as a directory for EXTRA_DIST + + Rather than having the reference images individually listed in + test/Makefile.refs the whole directory can be included in the EXTRA_DIST + block. + + This removes the need to have the check-ref-missing Makefile target. + + test/Makefile.am | 35 +- + test/Makefile.refs | 2922 ---------------------------------------------------- + 2 files changed, 2 insertions(+), 2955 deletions(-) + +commit add9a4092b69ba359917407e0e7f584c5dbfdc81 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 27 14:55:57 2011 +0100 + + trace: Emit an stack operation to create a pattern from an undefined surface + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit b8ae60f619d030dab48995fc6cb540b7935eb5cf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 26 14:55:03 2011 +0100 + + test: Refresh reference images + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/clip-group-shapes-circles.ref.png | Bin 1180 -> 1178 bytes + test/reference/clip-operator.argb32.ref.png | Bin 8210 -> 8180 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3212 -> 3199 bytes + test/reference/clip-stroke.ref.png | Bin 1207 -> 1206 bytes + test/reference/clip-twice.argb32.ref.png | Bin 1077 -> 1068 bytes + test/reference/clip-twice.rgb24.ref.png | Bin 976 -> 1022 bytes + test/reference/hatchings.ref.png | Bin 44151 -> 46499 bytes + .../random-intersections-curves-nz.ref.png | Bin 151318 -> 151330 bytes + test/reference/rotated-clip.ref.png | Bin 2786 -> 2713 bytes + test/reference/scale-offset-image.ref.png | Bin 7688 -> 7695 bytes + test/reference/scale-offset-similar.ref.png | Bin 7688 -> 7695 bytes + test/reference/tiger.ref.png | Bin 71094 -> 71110 bytes + 12 files changed, 0 insertions(+), 0 deletions(-) + +commit 303893681f284c734a078012e6521ebb627a54d6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 26 13:26:33 2011 +0100 + + test/random-clips: Paint clip to highlight the issues + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 ++-- + test/random-clips.c | 15 +++++++++++++++ + test/reference/random-clip.base.argb32.ref.png | Bin 313008 -> 0 bytes + test/reference/random-clip.base.argb32.xfail.png | Bin 0 -> 525726 bytes + test/reference/random-clip.base.rgb24.ref.png | Bin 313008 -> 0 bytes + test/reference/random-clip.base.rgb24.xfail.png | Bin 0 -> 525726 bytes + test/reference/random-clip.ref.png | Bin 311369 -> 523342 bytes + test/reference/random-clip.traps.argb32.ref.png | Bin 311369 -> 523342 bytes + test/reference/random-clip.traps.rgb24.ref.png | Bin 311369 -> 523342 bytes + 9 files changed, 17 insertions(+), 2 deletions(-) + +commit 9fe7022790478cfcd10a13390a6686497f2c9339 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 26 13:25:58 2011 +0100 + + polygon-intersect: Remove surplus edge direction + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon-intersect.c | 28 +++++----------------------- + 1 file changed, 5 insertions(+), 23 deletions(-) + +commit 1a1b39a9c35f8857e8ad36dc02c02ea5eae26021 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 26 10:51:03 2011 +0100 + + script: compile without + + The surface observer gained a dependency on script, make it optional. + + src/cairo-surface-observer.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit bbacfc4e836ab09896b0ca3da9d90b582e35748c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 26 10:27:23 2011 +0100 + + win32: Compile, but broken + + First step: just make it compile again but crash upon usage. + + src/cairo-win32-font.c | 16 +-- + src/cairo-win32-printing-surface.c | 13 +- + src/cairo-win32-private.h | 16 +-- + src/cairo-win32-surface.c | 246 ++----------------------------------- + 4 files changed, 18 insertions(+), 273 deletions(-) + +commit 4790bbf59681553bd3850c90e409311076431786 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 26 11:51:27 2011 +0100 + + boilerplate: Skip testing of null surfaces + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-test-surfaces.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 9c56df3904a9f6aa5c3dce1b91ab34038fc9eeb2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 23:34:29 2011 +0100 + + test: Mark the record-select-font-face as XFAIL + + The recording surface has no knowledge of the target surface when it + generates the scaled font and informs the client about the kerning and + metrics. This results in an unfortunate slight misalignment when + replaying the glyphs against the ideal case. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/reference/record-select-font-face.xfail.png | Bin 0 -> 1448 bytes + 2 files changed, 1 insertion(+) + +commit 70ac21f7bbd31799437f1152c7174468f9684df4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 23:32:37 2011 +0100 + + test: Refresh rotated-clip reference + + test/reference/rotated-clip.ref.png | Bin 2743 -> 2786 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 606e9e1c9e9b70fd3ac840f398faad5f4a06e19d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 23:28:50 2011 +0100 + + test: Refresh tighten-bounds reference image + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 3 ++- + test/reference/tighten-bounds.argb32.ref.png | Bin 0 -> 8972 bytes + test/reference/tighten-bounds.ref.png | Bin 7958 -> 0 bytes + test/reference/tighten-bounds.rgb24.ref.png | Bin 0 -> 8188 bytes + 4 files changed, 2 insertions(+), 1 deletion(-) + +commit d71ce5e0ddd871777b5d82619a847cab6c8bc2aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 23:24:25 2011 +0100 + + spans: Fix empty polygon unbounded fixup + + There is a subtle flaw in the current querying of polygon extents; it + simply returns the limits and not the point extremeties and certainly + not the tessellation extents. Computing that is likely to take long than + rendering the polygon. This does mean that we need to also fixup the + extents prior to performing the empty unbounded fast path. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-spans-compositor.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit 9a366cff2cc486818ab3ace61aeb22a2bdcfe5cd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 22:48:46 2011 +0100 + + test: Redefine success for miter-precision + + On review, that segment does exist and should not have been removed by + numerical errors! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/miter-precision.ref.png | Bin 931 -> 878 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 2c34f028a787a7e33e3410f09d6cc00caacf0a08 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 13:37:51 2011 +0100 + + test: Exercise scaling from an atlas through a subsurface + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 3 +- + test/Makefile.sources | 1 + + test/reference/subsurface-scale.base.ref.png | Bin 0 -> 5216 bytes + test/reference/subsurface-scale.ref.png | Bin 0 -> 5216 bytes + test/subsurface-scale.c | 93 +++++++++++++++++++++++++++ + 5 files changed, 96 insertions(+), 1 deletion(-) + +commit 9b3b84976ac255a5d1ce472ff4bcb623e34d5fc3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 13:20:32 2011 +0100 + + test: refresh text-pattern reference + + test/reference/text-pattern.ref.png | Bin 3442 -> 3444 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 7e5e2dd5e184c73264dd2359ca151cc0689c63d6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 23 13:20:14 2011 +0100 + + test/create-from-png: Update to point to new reference/ images + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/create-from-png.c | 29 +++++++++++++---------------- + 1 file changed, 13 insertions(+), 16 deletions(-) + +commit f162f7ebb47fe87ffadade15456699ef2b556fbf +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 22 22:03:46 2011 +0200 + + xcb: Fix device offsets with unmap_image() + + The source and target x/y coordinates were swapped. No idea why this only now + caused a test suite failure, perhaps something recently started using SHM? + + Fixes: map-bit-to-image, map-to-image-fill + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 880321ae9d678eac10e336513e7d83096683cd3a +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 22 20:46:24 2011 +0200 + + xcb: Fix a "incompatible pointer" compiler warning + + cairo-xcb-surface.c:790:2: warning: return from incompatible pointer type + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa16e3e66621099f4edc59802614d804e86e63ec +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 22 21:18:57 2011 +0200 + + xcb: Honor clips for defer clear + + This bug was accidentally introduced in fd613cb9f94daff0c8d4fdb27ff89894d41682a. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 87fdc4356f5ba48c84269c956fecb9467b95f1af +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 22 20:46:24 2011 +0200 + + xcb: Don't try to fallback more than once + + This fixes the following assert for pretty much every single xcb-fallback test: + + cairo-xcb-surface.c:320: _get_image: Assertion `surface->fallback == ((void *)0)' failed. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit d43f6d74599984162cad5a4b522c4b70596056f5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 22 23:16:53 2011 +0930 + + test: make text-pattern draw with both opaque and translucent patterns + + Poppler renders the translucent PDF output of this test correctly with + cairo 1.10.2 but fails with current git. + + test/reference/text-pattern.ref.png | Bin 1685 -> 3442 bytes + test/reference/text-pattern.rgb24.ref.png | Bin 1392 -> 0 bytes + test/text-pattern.c | 22 +++++++++++++++------- + 3 files changed, 15 insertions(+), 7 deletions(-) + +commit b30b0c14cba102a9e4f5f04226fbdbecc2268a77 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 22 22:43:07 2011 +0930 + + test: Add stroke-pattern + + Poppler renders the PDF output of this test correctly with cairo 1.10.2 but fails with current git. + + Commenting out the cairo_translate makes the PDF output render correctly with current git. + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/reference/stroke-pattern.ref.png | Bin 0 -> 1417 bytes + test/stroke-pattern.c | 68 ++++++++++++++++++++++++++++++++++ + 4 files changed, 70 insertions(+) + +commit 0e95215c01b5d7124d950f0b21fd2b0e343a34af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 21 11:18:24 2011 +0100 + + test/trace: Hack to dump out per-context images and traces + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/cairo-test-trace.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit f8c4686310b2b538cebb59f64b2ab8c6def86628 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 20 14:34:23 2011 +0100 + + image: don't offset by device transform for replay onto source surface + + It is already captured by the pattern extents. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 5f0dcf610f8714dcffe49c3ea6edea479590c34b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 20 14:05:31 2011 +0100 + + image: clip the replay to the sample extents in device space + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 29 +++++++++++++++++++++++------ + 1 file changed, 23 insertions(+), 6 deletions(-) + +commit da95bdfcd77c56a52e08544946786cff8a33ca1e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 20 14:04:29 2011 +0100 + + wrapper: transform the clip into device space + + We need more than just mere translation! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-private.h | 3 ++ + src/cairo-clip.c | 107 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-surface-wrapper.c | 8 +--- + 3 files changed, 111 insertions(+), 7 deletions(-) + +commit a810b012cf68ea56defd76556a7780c6d6aaaf08 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 20 00:02:18 2011 +0930 + + subsets: latin char map needs to belong to the font, not the subset + + src/cairo-scaled-font-subsets.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit fd613cb9f94daff0c8d4fdb27ff89894d41682a3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 2 13:51:30 2011 +0100 + + xcb: track fallback damage + + And only upload the parts of the image that are modified during the + fallback. I have to keep reminding myself that the goal is always to + reduce the amount of fallbacks required... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles-private.h | 4 + + src/cairo-composite-rectangles.c | 18 ++ + src/cairo-xcb-connection.c | 6 +- + src/cairo-xcb-private.h | 14 +- + src/cairo-xcb-surface-render.c | 122 ++++-------- + src/cairo-xcb-surface.c | 314 ++++++++++++++++++++++++------- + 6 files changed, 310 insertions(+), 168 deletions(-) + +commit 36a14230453a1fd282671a4ab7ac072b69b9a5f6 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 23:20:46 2011 +0200 + + xcb: Remove an unused variable + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit cdd75ec407f1f9148acc4267b07a874245c1ddf7 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 19:31:32 2011 +0200 + + xcb: Use a mask in _composite_boxes() when needed + + This doesn't just need a clip without any path, it also needs pixel aligned + boxes. + + This improves the result for unaligned boxes in tighten-bounds. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e580565e28c3c2999199bee1f83be60905cba8d5 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 18:28:10 2011 +0200 + + xcb: Stop using _cairo_clip_get_surface() + + This function changed its behavior and no longer does what we want. Instead, + this now uses its own function which uses _cairo_clip_combine_with_surface(). + + This fixes crashes in the tighten-bounds and random-clip tests. These happened + because cairo-xcb was trying to be clever. ;-) + + Since _cairo_clip_get_surface() did less, the resulting surface had + deferred_clear == true and picture == XCB_NONE. The code then tried using this + evil picture and either ran into an assert() or caused a BadPicture error. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 51 +++++++++++++++++++++++++++++++++--------- + 1 file changed, 40 insertions(+), 11 deletions(-) + +commit 6fb4c3ae3521fa789aa63b3b37f17336e5b7b617 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 18:16:01 2011 +0200 + + _cairo_clip_get_surface(): Don't lose errors + + If one of the _cairo_surface_fill() calls failed, this function would stop and + return an intermediate result, thus hiding the error that happened. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-clip-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 74e7f3b441e02cdb003ec235eb6ec4c86e412357 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 18 09:09:50 2011 -0700 + + quartz-font: Fix scaled font backend hooks + + In af9fbd176b145f042408ef5391eef2a51d7531f8 the show_glyphs hook has + been removed from cairo_scaled_backend_t, but quartz-font was not + updated. + + Fixes: + + cairo-quartz-font.c:798: warning: initialization from incompatible pointer type + + src/cairo-quartz-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit f8e4657d8a45cdb35c9ccdcba1d002e8a3aac5bb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 18 08:54:00 2011 -0700 + + Make cairo-missing a static library + + It was meant to be static, but my autotools-fu was not good enough. + + util/cairo-missing/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7827f46d7cafd6429088c7837fa2104734fa1c4a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 18 07:22:19 2011 -0700 + + quartz: Fix build + + Fix a bunch of typos and "wrong number of arguments" errors. + Clean up some "unused variable" errors. + + src/cairo-quartz-surface.c | 58 +++++++++++++++++++++------------------------- + 1 file changed, 27 insertions(+), 31 deletions(-) + +commit 1b4030408750a705b365ccfb6386be7e15d490bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 18 09:28:17 2011 +0100 + + traps: use the customised _cairo_clip_get_surface + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 2209ec5a15f535b1fae19c84b796f3d11a12de00 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 18 08:52:46 2011 +0100 + + test: Make cairo_test_suite depend upon the any2ppm exectuable on all platforms + + On some platforms, executables have an extension which confuses + automake into building an entirely different binary. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a7b2c28adf920333322a45bf25e2d80e44391d4f +Author: Dave Yeo <dave.r.yeo@gmail.com> +Date: Tue Sep 6 20:36:32 2011 -0700 + + On OS/2, WIFSIGNALED and WTERMSIG are prototyped in sys/wait.h + + boilerplate/cairo-boilerplate-pdf.c | 4 ++++ + boilerplate/cairo-boilerplate-ps.c | 4 ++++ + boilerplate/cairo-boilerplate-svg.c | 4 ++++ + build/configure.ac.system | 2 +- + 4 files changed, 13 insertions(+), 1 deletions(-) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-pdf.c | 4 ++++ + boilerplate/cairo-boilerplate-ps.c | 4 ++++ + boilerplate/cairo-boilerplate-svg.c | 4 ++++ + build/configure.ac.system | 2 +- + 4 files changed, 13 insertions(+), 1 deletion(-) + +commit fdd54d2b791fbd461a6cac67ea10eb8decaf5f5c +Author: Dave Yeo <daveryeo@telus.net> +Date: Tue Sep 6 19:42:32 2011 -0700 + + Fix the number of parameters for cairo_os2_surface_set_size() + + test/error-setters.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/error-setters.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 222f0846e6c1c2769f1216c87caee906c5813664 +Author: Dave Yeo <dave.r.yeo@gmail.com> +Date: Tue Sep 6 19:40:20 2011 -0700 + + os2-surface needs to include cairo-image-surface-private.h + + src/cairo-os2-surface.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-os2-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 59a5c9d34c01e398dd56c3ca9afa6a08427c1270 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 18 08:47:28 2011 +0100 + + os2: Blindly update os2 to the new fallback compositor + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-os2-surface.c | 195 ++++++++++++++++-------------------------------- + 1 file changed, 63 insertions(+), 132 deletions(-) + +commit e4ebee1cf47f5c211abb79b8e3a3bc5ff7a5cc4b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 18 08:25:11 2011 +0100 + + pdf: Use the helper functions to update the composite rectangles + + These functions also know to update the clip and recompute the sample + areas and other derived information. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +commit 6c6bd6fb292c7168b60f1cc0580c52292f99ae86 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 18 08:26:42 2011 +0100 + + composite-rectangle: Add a helper to refine source extents + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles-private.h | 4 +++ + src/cairo-composite-rectangles.c | 57 ++++++++++++++++++++++++++++++-- + 2 files changed, 58 insertions(+), 3 deletions(-) + +commit b13c2270f5b7546453f81dd0e1ebdc7fb8e4b630 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 18 13:30:12 2011 +0930 + + test: refresh pdf mask ref images + + test/reference/mask.pdf.argb32.ref.png | Bin 7866 -> 7554 bytes + test/reference/mask.pdf.rgb24.ref.png | Bin 7336 -> 7043 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit a01cc10fe16caf4fbadf9540c745dd58a75df38d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 18 13:19:57 2011 +0930 + + pdf: ensure ink extents is not larger than bounded extents + + fixes mask test pdf output + + src/cairo-pdf-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit fc011bfcb98cfcc86b8ab81a247608e13ed70cdc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 17 12:28:33 2011 +0100 + + test: Record the current status of radial-outer-focus as xfail + + Debate rages as to the correct way to handle this. In some ways the + current output is expected due to the numerical instability in handling + the inner-focus-on-the-outer-circle. However, the result looks less than + desirable so some solution (which may not be inside cairo per-se) is + sought. + + test/Makefile.refs | 1 + + test/radial-outer-focus.c | 3 +++ + test/reference/radial-outer-focus.xfail.png | Bin 0 -> 34234 bytes + 3 files changed, 4 insertions(+) + +commit cea41a61c104f235c1f896207115507aed93d9ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 17 12:01:49 2011 +0100 + + image: intersect the source extents with the replay extents for EXTEND_NONE + + Fixes up the boundary on EXTEND_NONE replays. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 09b42c748e9dbcc923560c7d8bf5298fbffe95ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 17 12:00:49 2011 +0100 + + wrapper: intersect with target extents + + Treat the target extents as an implicit clip for computing the maximal + operation extents. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 49 +++++++++++++++++++++++++++------------------ + 1 file changed, 30 insertions(+), 19 deletions(-) + +commit 242fbb010efffb3a75f2e824bbdbb3a75ad51d12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 21:55:05 2011 +0100 + + image: Use the recording surface content for the recording source + + The previous commit should have been a enormous warning that something + was horribly wrong. I was determined to preserve the optimisation of + replaying onto the matching format, however, we need to provide an alpha + channel if required. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit ab924b11a805caaa6e7a1e39ce69f0a9a31e1405 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 19:29:27 2011 +0100 + + image: Use A8 for creating a mask from a recording surface + + When applying masks, typically it is useful to have an alpha channel. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3fde219487362e1aca8207843dd75a62827a71a7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 17:42:46 2011 +0100 + + test: Refresh reference images for spans/traps + + I found a bug in my SSE2 lerp implementation which resolved quite a few + failures. + + test/Makefile.refs | 7 ++++++- + test/reference/clip-fill-eo-unbounded.rgb24.ref.png | Bin 3201 -> 3409 bytes + .../clip-fill-eo-unbounded.traps.rgb24.ref.png | Bin 0 -> 3198 bytes + test/reference/clip-fill-nz-unbounded.rgb24.ref.png | Bin 3201 -> 3409 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 3244 -> 3212 bytes + test/reference/clip-operator.traps.rgb24.ref.png | Bin 0 -> 3232 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 3063 -> 3408 bytes + .../clip-stroke-unbounded.traps.rgb24.ref.png | Bin 0 -> 3108 bytes + test/reference/hatchings.traps.rgb24.ref.png | Bin 0 -> 89997 bytes + test/reference/operator-source.argb32.ref.png | Bin 0 -> 5538 bytes + test/reference/operator-source.ref.png | Bin 5745 -> 0 bytes + test/reference/operator-source.rgb24.ref.png | Bin 4639 -> 3876 bytes + test/reference/operator-source.traps.argb32.ref.png | Bin 5803 -> 5630 bytes + test/reference/operator-source.traps.rgb24.ref.png | Bin 1854 -> 3979 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 257 -> 454 bytes + test/reference/over-around-source.traps.rgb24.ref.png | Bin 245 -> 492 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 322 -> 372 bytes + test/reference/over-below-source.traps.rgb24.ref.png | Bin 340 -> 378 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 406 -> 440 bytes + .../reference/over-between-source.traps.rgb24.ref.png | Bin 430 -> 461 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 204 -> 170 bytes + test/reference/overlapping-boxes.traps.rgb24.ref.png | Bin 201 -> 204 bytes + test/reference/tighten-bounds.traps.rgb24.ref.png | Bin 0 -> 8179 bytes + 23 files changed, 6 insertions(+), 1 deletion(-) + +commit 84d1eac61fd8b5515711bd23b2ac886efd86a42f +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 18:00:21 2011 +0200 + + path: Fix a minor oversight in 1ce5d4707cf26061 + + The plan was "path: Skip calls to zero-length memcpy". However, this skipped + calls if the buffer was still empty, which means that it skipped all calls. + + Fixes: Half the test suite, lots of assertion failures + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a1be14693bb53f1818be2dee90f642143002d6d5 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 10:49:28 2011 +0200 + + boilerplate-xcb: Print sequence numbers + + The boilerplate code will now also print the low 16 bits of the sequence number + for errors and events. This should make it a lot easier to find errors in e.g. + a long xtrace output. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 7ba28ff563ab8a8e77213789860b2d412577a309 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Sep 16 10:43:44 2011 +0200 + + cairo-xcb: Require libxcb 1.6 + + Since commit 968eb30bba1dc94, we use xcb_discard_reply(). This function was + added in libxcb 1.6. + + "Fixes": https://bugs.freedesktop.org/show_bug.cgi?id=40925 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 6 ------ + configure.ac | 5 +---- + 2 files changed, 1 insertion(+), 10 deletions(-) + +commit b6c3fea672592a77b0b6fa487b403c981921b13a +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 15 16:27:20 2011 +0200 + + xcb: Improve error cases in _clip_and_composite_combine + + This makes sure that errors from _cairo_clip_get_surface() aren't lost and that + we really got an xcb surface. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit f3a9a0c9e646ca684ee8e7bd65506cf2793178d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 16:24:23 2011 +0100 + + test: Add a1-fill + + Capture the bug report: + https://bugs.freedesktop.org/show_bug.cgi?id=31604 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 3 ++ + test/Makefile.sources | 1 + + test/a1-fill.c | 67 +++++++++++++++++++++++++++++++++++ + test/reference/a1-fill.base.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.ref.png | Bin 0 -> 328 bytes + test/reference/a1-fill.traps.ref.png | Bin 0 -> 328 bytes + 6 files changed, 71 insertions(+) + +commit 1ce5d4707cf260618bd4d61f39aad4371ffa3336 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 16:11:42 2011 +0100 + + path: Skip calls to zero-length memcpy + + We attempt to copy 0 points onto the array of path points for a + close-path. This is pointless and an unnecessary function call under + MSVC at least. + + Based on a patch by Steve Snyder, incorporating Behdad's review + comments. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=37836 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-path-fixed.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit f09361cff16776b49e9159c60eea4e8a049865d6 +Author: Krzysztof Kosinski <tweenk.pl@gmail.com> +Date: Fri Sep 16 15:59:38 2011 +0100 + + test: Add radial-outer-focus + + Numerical instability in the computation of gradients leads to random + results. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=40918 + + test/Makefile.sources | 1 + + test/radial-outer-focus.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 70 insertions(+) + +commit 26e8fa03cb411d5d6d1df32c7a5435eaaa15ffd2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 15:02:37 2011 +0100 + + base: Make sure we have fuzzy clip boxes! + + _cairo_clip_get_surface() expects the caller to handle unaligned clip + boxes in order to avoid recursion. The baseline renderer ignored this + basic tenet and so ended up with only sharp clip regions. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/test-base-compositor-surface.c | 60 +++++++++++++++++++++++++++++++++----- + 1 file changed, 52 insertions(+), 8 deletions(-) + +commit c5295981c65dcd548bc391f7194e1e378e288e21 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 15:01:11 2011 +0100 + + test: Update reference images for test-base + + Uli Schlachter spotted that I had create reference images with sharp + edges for his tighten-bounds test case, exactly as if I had ignored + unaligned clip boxes... + + Turns out I had removed the code to handle them... + + test/reference/random-clip.base.argb32.ref.png | Bin 308138 -> 313008 bytes + test/reference/random-clip.base.rgb24.ref.png | Bin 308138 -> 313008 bytes + test/reference/tighten-bounds.base.argb32.ref.png | Bin 8457 -> 8486 bytes + test/reference/tighten-bounds.base.rgb24.ref.png | Bin 7832 -> 7856 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit f1c8c00f16d3e14360c44c92a2edc4269c782ff1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 16 23:04:53 2011 +0930 + + test: refresh some pdf/ps refs + + test/Makefile.refs | 6 ++++++ + test/reference/scale-offset-image.pdf.argb32.ref.png | Bin 9981 -> 7643 bytes + test/reference/scale-offset-image.pdf.rgb24.ref.png | Bin 9981 -> 7643 bytes + .../scale-offset-similar.pdf.argb32.ref.png | Bin 11027 -> 8419 bytes + .../reference/scale-offset-similar.pdf.rgb24.ref.png | Bin 11027 -> 8419 bytes + test/reference/scale-offset-similar.ps.ref.png | Bin 7860 -> 6850 bytes + test/reference/shape-general-convex.ps.ref.png | Bin 0 -> 1632 bytes + test/reference/shape-sierpinski.pdf.argb32.ref.png | Bin 0 -> 39520 bytes + test/reference/shape-sierpinski.pdf.rgb24.ref.png | Bin 0 -> 39520 bytes + test/reference/shape-sierpinski.ps.ref.png | Bin 0 -> 39965 bytes + test/reference/shape-sierpinski.ps3.argb32.ref.png | Bin 0 -> 39965 bytes + test/reference/shape-sierpinski.ps3.rgb24.ref.png | Bin 0 -> 39965 bytes + 12 files changed, 6 insertions(+) + +commit 12ee7989a0c1d499a0c228d5312dffbab50eea3f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 16 22:50:59 2011 +0930 + + test: refresh some pdf/ps refs + + test/Makefile.refs | 6 ++++-- + test/reference/smask-fill.pdf.ref.png | Bin 0 -> 1105 bytes + test/reference/smask-image-mask.pdf.ref.png | Bin 0 -> 615 bytes + test/reference/smask-mask.pdf.ref.png | Bin 0 -> 2308 bytes + test/reference/smask-mask.pdf.xfail.png | Bin 4401 -> 0 bytes + test/reference/smask-paint.pdf.ref.png | Bin 0 -> 2431 bytes + test/reference/smask-paint.pdf.xfail.png | Bin 4513 -> 0 bytes + test/reference/stroke-image.pdf.ref.png | Bin 1475 -> 1006 bytes + test/reference/stroke-image.ps.ref.png | Bin 1682 -> 1535 bytes + 9 files changed, 4 insertions(+), 2 deletions(-) + +commit a0ec977944b7659a3fee7a97ce2e650d775bdf8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 12:35:45 2011 +0100 + + bentley-ottman: End subsumed colinear traps + + I'm not quite sure how we end up with a pair of colinear edges both with + a deferred trap... + + Fixes crash in bug-bo-ricotz + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 0aabde231431d94eec50304b3f3b428965f83a39 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 13:46:09 2011 +0100 + + test: Add bug-bo-ricotz + + Exercises an assertion failure found by Rico Tzschichholz. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 3 ++ + test/Makefile.sources | 1 + + test/bug-bo-ricotz.c | 74 +++++++++++++++++++++++++++++ + test/reference/bug-bo-ricotz.base.ref.png | Bin 0 -> 2125 bytes + test/reference/bug-bo-ricotz.ref.png | Bin 0 -> 2108 bytes + test/reference/bug-bo-ricotz.traps.ref.png | Bin 0 -> 2125 bytes + 6 files changed, 78 insertions(+) + +commit e7bcf1fd79ba96ef46ec297f82facee9c8d73e20 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 13:45:11 2011 +0100 + + test: Hack cairo-test-trace to write at trace for all contexts + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/cairo-test-trace.c | 39 +++++++++++++++++++++++++++++---------- + 1 file changed, 29 insertions(+), 10 deletions(-) + +commit 35f41d253ff09a7c144ace833901b28e961c8e14 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 13:47:17 2011 +0100 + + fdr,tee: Reorder master/slave invocation to capture death-upon-signals + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tee-surface.c | 84 +++++++++++++++++++------------------------------ + util/cairo-fdr/fdr.c | 26 +++++++++++++++ + 2 files changed, 58 insertions(+), 52 deletions(-) + +commit 983cfb2f54b6636b38744932122d43ef8ad7a12d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 16 21:37:58 2011 +0930 + + test: add mask-alpha ps ref + + test/Makefile.refs | 1 + + test/reference/mask-alpha.ps.ref.png | Bin 0 -> 594 bytes + 2 files changed, 1 insertion(+) + +commit d118ae5f648f2171754c877d27211730e6a003d8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 16 20:51:30 2011 +0930 + + analysis mask: unwrap recording surface snapshot + + fixes mask-alpha test + + src/cairo-analysis-surface.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 898e63bfc196cb80cdd5845e32ecb03bafd44f03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 11:50:50 2011 +0100 + + test: Replace xlib reference images with the traps references + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 107 --------------------- + test/reference/a1-bug.xlib.ref.png | Bin 3362 -> 0 bytes + test/reference/aliasing.xlib.ref.png | Bin 104315 -> 0 bytes + test/reference/big-line.xlib.ref.png | Bin 933 -> 0 bytes + test/reference/bug-extents.xlib.ref.png | Bin 9234 -> 0 bytes + test/reference/bug-seams.xlib.ref.png | Bin 1606 -> 0 bytes + test/reference/caps-joins-alpha.xlib.ref.png | Bin 2278 -> 0 bytes + test/reference/caps-joins-curve.xlib.ref.png | Bin 5126 -> 0 bytes + test/reference/clip-disjoint.xlib.ref.png | Bin 5395 -> 0 bytes + .../clip-fill-eo-unbounded.xlib.argb32.ref.png | Bin 3693 -> 0 bytes + .../clip-fill-eo-unbounded.xlib.rgb24.ref.png | Bin 3198 -> 0 bytes + .../clip-fill-nz-unbounded.xlib.argb32.ref.png | Bin 3693 -> 0 bytes + .../clip-fill-nz-unbounded.xlib.rgb24.ref.png | Bin 3198 -> 0 bytes + test/reference/clip-fill-rule.xlib.rgb24.ref.png | Bin 380 -> 0 bytes + test/reference/clip-fill.xlib.ref.png | Bin 1049 -> 0 bytes + .../clip-group-shapes-circles.xlib.ref.png | Bin 1534 -> 0 bytes + ...-group-shapes-unaligned-rectangles.xlib.ref.png | Bin 431 -> 0 bytes + test/reference/clip-nesting.xlib.rgb24.ref.png | Bin 955 -> 0 bytes + test/reference/clip-operator.xlib.ref.png | Bin 8271 -> 0 bytes + test/reference/clip-operator.xlib.rgb24.ref.png | Bin 3258 -> 0 bytes + test/reference/clip-push-group.xlib.ref.png | Bin 155 -> 0 bytes + test/reference/clip-shape.xlib.ref.png | Bin 2944 -> 0 bytes + .../clip-stroke-unbounded.xlib.argb32.ref.png | Bin 3620 -> 0 bytes + .../clip-stroke-unbounded.xlib.rgb24.ref.png | Bin 3109 -> 0 bytes + test/reference/clip-stroke.xlib.ref.png | Bin 1491 -> 0 bytes + test/reference/clip-text.xlib.ref.png | Bin 900 -> 0 bytes + test/reference/clip-twice.xlib.ref.png | Bin 1362 -> 0 bytes + test/reference/clip-twice.xlib.rgb24.ref.png | Bin 1198 -> 0 bytes + test/reference/clipped-group.xlib.ref.png | Bin 289 -> 0 bytes + test/reference/dash-curve.xlib.ref.png | Bin 40109 -> 0 bytes + test/reference/degenerate-arc.xlib.ref.png | Bin 616 -> 0 bytes + test/reference/degenerate-dash.xlib.ref.png | Bin 1898 -> 0 bytes + test/reference/degenerate-pen.xlib.ref.png | Bin 997 -> 0 bytes + test/reference/fill-alpha-pattern.xlib.ref.png | Bin 3653 -> 0 bytes + test/reference/fill-alpha.xlib.ref.png | Bin 2989 -> 0 bytes + test/reference/fill-and-stroke.xlib.argb32.ref.png | Bin 322 -> 0 bytes + test/reference/fill-and-stroke.xlib.rgb24.ref.png | Bin 291 -> 0 bytes + .../fill-degenerate-sort-order.xlib.ref.png | Bin 2397 -> 0 bytes + .../fill-degenerate-sort-order.xlib.rgb24.ref.png | Bin 2060 -> 0 bytes + test/reference/fill-image.xlib.ref.png | Bin 1460 -> 0 bytes + test/reference/fill-rule.xlib.ref.png | Bin 1979 -> 0 bytes + test/reference/fill-rule.xlib.rgb24.ref.png | Bin 1722 -> 0 bytes + .../reference/finer-grained-fallbacks.xlib.ref.png | Bin 1110 -> 0 bytes + .../finer-grained-fallbacks.xlib.rgb24.ref.png | Bin 856 -> 0 bytes + .../ft-text-vertical-layout-type1.xlib.ref.png | Bin 3625 -> 0 bytes + .../ft-text-vertical-layout-type3.xlib.ref.png | Bin 3597 -> 0 bytes + test/reference/group-unaligned.xlib.ref.png | Bin 466 -> 0 bytes + test/reference/halo-transform.xlib.ref.png | Bin 15346 -> 0 bytes + test/reference/halo.xlib.ref.png | Bin 8835 -> 0 bytes + test/reference/hatchings.xlib.ref.png | Bin 92532 -> 0 bytes + .../image-bug-710072-unaligned.xlib.ref.png | Bin 219 -> 0 bytes + .../large-twin-antialias-mixed.xlib.ref.png | Bin 14655 -> 0 bytes + test/reference/leaky-dashed-rectangle.xlib.ref.png | Bin 344 -> 0 bytes + test/reference/leaky-dashed-stroke.xlib.ref.png | Bin 9305 -> 0 bytes + test/reference/linear-gradient-subset.xlib.ref.png | Bin 782 -> 0 bytes + test/reference/linear-gradient.xlib.ref.png | Bin 1021 -> 0 bytes + test/reference/mask-alpha.xlib.ref.png | Bin 640 -> 0 bytes + test/reference/mask-alpha.xlib.rgb24.ref.png | Bin 599 -> 0 bytes + test/reference/mask.xlib.ref.png | Bin 8476 -> 0 bytes + test/reference/mask.xlib.rgb24.ref.png | Bin 7041 -> 0 bytes + test/reference/operator-clear.xlib.argb32.ref.png | Bin 1071 -> 0 bytes + test/reference/operator-clear.xlib.rgb24.ref.png | Bin 951 -> 0 bytes + test/reference/operator-source.xlib.ref.png | Bin 5721 -> 0 bytes + test/reference/operator-source.xlib.rgb24.ref.png | Bin 4447 -> 0 bytes + test/reference/over-above-source.xlib.ref.png | Bin 538 -> 0 bytes + .../reference/over-above-source.xlib.rgb24.ref.png | Bin 461 -> 0 bytes + test/reference/over-around-source.xlib.ref.png | Bin 614 -> 0 bytes + .../over-around-source.xlib.rgb24.ref.png | Bin 503 -> 0 bytes + test/reference/over-between-source.xlib.ref.png | Bin 575 -> 0 bytes + .../over-between-source.xlib.rgb24.ref.png | Bin 473 -> 0 bytes + test/reference/paint-with-alpha-clip.xlib.ref.png | Bin 303 -> 0 bytes + test/reference/path-append.xlib.ref.png | Bin 6461 -> 0 bytes + test/reference/push-group-color.xlib.ref.png | Bin 2964 -> 0 bytes + test/reference/push-group.xlib.ref.png | Bin 3126 -> 0 bytes + test/reference/push-group.xlib.rgb24.ref.png | Bin 2961 -> 0 bytes + ...radial-gradient-mask-source.xlib.argb32.ref.png | Bin 145801 -> 0 bytes + .../radial-gradient-mask-source.xlib.rgb24.ref.png | Bin 150362 -> 0 bytes + .../random-intersections-curves-eo.xlib.ref.png | Bin 244255 -> 0 bytes + .../random-intersections-curves-nz.xlib.ref.png | Bin 264277 -> 0 bytes + .../reference/random-intersections-eo.xlib.ref.png | Bin 134655 -> 0 bytes + .../random-intersections-nonzero.xlib.ref.png | Bin 141548 -> 0 bytes + .../recording-surface-over.xlib.argb32.ref.png | Bin 3055 -> 0 bytes + .../recording-surface-over.xlib.rgb24.ref.png | Bin 3124 -> 0 bytes + test/reference/rotated-clip.xlib.ref.png | Bin 3922 -> 0 bytes + test/reference/rounded-rectangle-fill.xlib.ref.png | Bin 890 -> 0 bytes + .../rounded-rectangle-stroke.xlib.ref.png | Bin 860 -> 0 bytes + test/reference/scale-offset-image.xlib.ref.png | Bin 9136 -> 0 bytes + test/reference/self-intersecting.xlib.ref.png | Bin 208 -> 0 bytes + test/reference/smask-fill.xlib.ref.png | Bin 1223 -> 0 bytes + test/reference/smask-stroke.xlib.ref.png | Bin 1707 -> 0 bytes + test/reference/smask-text.xlib.ref.png | Bin 1672 -> 0 bytes + test/reference/smask.xlib.ref.png | Bin 3386 -> 0 bytes + test/reference/spline-decomposition.xlib.ref.png | Bin 19158 -> 0 bytes + test/reference/stroke-image.xlib.ref.png | Bin 1440 -> 0 bytes + test/reference/subsurface.xlib.ref.png | Bin 1782 -> 0 bytes + .../surface-pattern-operator.xlib.argb32.ref.png | Bin 5171 -> 0 bytes + .../surface-pattern-operator.xlib.rgb24.ref.png | Bin 1913 -> 0 bytes + test/reference/text-rotate.xlib.ref.png | Bin 16646 -> 0 bytes + test/reference/trap-clip.xlib.ref.png | Bin 5772 -> 0 bytes + test/reference/trap-clip.xlib.rgb24.ref.png | Bin 5365 -> 0 bytes + test/reference/twin-antialias-gray.xlib.ref.png | Bin 3863 -> 0 bytes + test/reference/twin-antialias-mixed.xlib.ref.png | Bin 1760 -> 0 bytes + test/reference/twin-antialias-none.xlib.ref.png | Bin 745 -> 0 bytes + .../reference/twin-antialias-subpixel.xlib.ref.png | Bin 3863 -> 0 bytes + test/reference/twin.xlib.ref.png | Bin 4435 -> 0 bytes + .../unbounded-operator.xlib.rgb24.ref.png | Bin 1315 -> 0 bytes + test/reference/user-font-proxy.xlib.ref.png | Bin 18121 -> 0 bytes + test/reference/user-font.xlib.ref.png | Bin 5884 -> 0 bytes + 108 files changed, 107 deletions(-) + +commit fcea0f8e08e2fbd448a990b60be0cf16535b45a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 16 11:09:22 2011 +0100 + + test: Use the test-traps as the reference images for xlib/xcb + + The test-traps provides a reference implementation of the + traps-compositor as used by xlib, so we can use it to generate the + reference images as well. (Of course checking that test-traps is itself + correct and only differs in the renderer! ;-) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-test-surfaces.c | 2 +- + boilerplate/cairo-boilerplate-xcb.c | 8 +- + boilerplate/cairo-boilerplate-xlib.c | 6 +- + test/Makefile.refs | 779 ++++++++++++++++++++- + test/reference/a1-bug.traps.argb32.ref.png | Bin 0 -> 3362 bytes + test/reference/a1-bug.traps.rgb24.ref.png | Bin 0 -> 3362 bytes + .../a1-clip-fill-equal.traps.argb32.ref.png | Bin 0 -> 120 bytes + .../a1-clip-fill-equal.traps.rgb24.ref.png | Bin 0 -> 120 bytes + .../a1-clip-fill-rule.traps.argb32.ref.png | Bin 0 -> 236 bytes + .../a1-clip-fill-rule.traps.rgb24.ref.png | Bin 0 -> 218 bytes + test/reference/a1-clip-fill.traps.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill.traps.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.traps.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.traps.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.traps.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.traps.rgb24.ref.png | Bin 0 -> 120 bytes + .../reference/a1-image-sample.traps.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.traps.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-line-width.traps.argb32.ref.png | Bin 0 -> 154 bytes + test/reference/a1-line-width.traps.rgb24.ref.png | Bin 0 -> 154 bytes + test/reference/a1-mask-sample.traps.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask-sample.traps.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask.traps.argb32.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.traps.rgb24.ref.png | Bin 0 -> 106 bytes + ...1-rasterisation-rectangles.traps.argb32.ref.png | Bin 0 -> 1729 bytes + ...a1-rasterisation-rectangles.traps.rgb24.ref.png | Bin 0 -> 1729 bytes + ...a1-rasterisation-triangles.traps.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.traps.rgb24.ref.png | Bin 0 -> 1729 bytes + .../a1-rectilinear-grid.traps.argb32.ref.png | Bin 0 -> 207 bytes + .../a1-rectilinear-grid.traps.rgb24.ref.png | Bin 0 -> 207 bytes + test/reference/a1-sample.traps.argb32.ref.png | Bin 0 -> 786 bytes + test/reference/a1-sample.traps.rgb24.ref.png | Bin 0 -> 786 bytes + test/reference/a1-tiger.traps.argb32.ref.png | Bin 0 -> 20406 bytes + test/reference/a1-tiger.traps.rgb24.ref.png | Bin 0 -> 20406 bytes + .../reference/a1-traps-sample.traps.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-traps-sample.traps.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a8-clear.traps.argb32.ref.png | Bin 0 -> 248 bytes + test/reference/a8-clear.traps.rgb24.ref.png | Bin 0 -> 248 bytes + test/reference/a8-mask.traps.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/a8-mask.traps.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/aliasing.traps.argb32.ref.png | Bin 0 -> 103722 bytes + test/reference/aliasing.traps.rgb24.ref.png | Bin 0 -> 103722 bytes + test/reference/alpha-similar.traps.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.traps.rgb24.ref.png | Bin 0 -> 88 bytes + .../api-special-cases.traps.argb32.ref.png | Bin 0 -> 95 bytes + .../api-special-cases.traps.rgb24.ref.png | Bin 0 -> 95 bytes + .../arc-infinite-loop.traps.argb32.ref.png | Bin 0 -> 96 bytes + .../arc-infinite-loop.traps.rgb24.ref.png | Bin 0 -> 96 bytes + .../arc-looping-dash.traps.argb32.ref.png | Bin 0 -> 470 bytes + .../reference/arc-looping-dash.traps.rgb24.ref.png | Bin 0 -> 470 bytes + test/reference/big-empty-box.traps.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/big-empty-box.traps.rgb24.ref.png | Bin 0 -> 108 bytes + .../big-empty-triangle.traps.argb32.ref.png | Bin 0 -> 111 bytes + .../big-empty-triangle.traps.rgb24.ref.png | Bin 0 -> 108 bytes + test/reference/big-line.traps.argb32.ref.png | Bin 0 -> 933 bytes + test/reference/big-line.traps.rgb24.ref.png | Bin 0 -> 933 bytes + test/reference/big-little-box.traps.argb32.ref.png | Bin 0 -> 169 bytes + test/reference/big-little-box.traps.rgb24.ref.png | Bin 0 -> 160 bytes + .../big-little-triangle.traps.argb32.ref.png | Bin 0 -> 399 bytes + .../big-little-triangle.traps.rgb24.ref.png | Bin 0 -> 320 bytes + test/reference/big-trap.traps.argb32.ref.png | Bin 0 -> 319 bytes + test/reference/big-trap.traps.rgb24.ref.png | Bin 0 -> 319 bytes + test/reference/bilevel-image.traps.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-image.traps.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bitmap-font.traps.argb32.ref.png | Bin 0 -> 931 bytes + test/reference/bitmap-font.traps.rgb24.ref.png | Bin 0 -> 871 bytes + test/reference/bug-40410.traps.argb32.ref.png | Bin 0 -> 428 bytes + test/reference/bug-40410.traps.rgb24.ref.png | Bin 0 -> 428 bytes + .../bug-bo-rectangular.traps.argb32.ref.png | Bin 0 -> 950 bytes + .../bug-bo-rectangular.traps.rgb24.ref.png | Bin 0 -> 950 bytes + test/reference/bug-extents.traps.argb32.ref.png | Bin 0 -> 9250 bytes + test/reference/bug-extents.traps.rgb24.ref.png | Bin 0 -> 9250 bytes + test/reference/bug-seams.traps.argb32.ref.png | Bin 0 -> 1606 bytes + test/reference/bug-seams.traps.rgb24.ref.png | Bin 0 -> 1606 bytes + .../caps-joins-alpha.traps.argb32.ref.png | Bin 0 -> 2278 bytes + .../reference/caps-joins-alpha.traps.rgb24.ref.png | Bin 0 -> 2278 bytes + .../caps-joins-curve.traps.argb32.ref.png | Bin 0 -> 5368 bytes + .../reference/caps-joins-curve.traps.rgb24.ref.png | Bin 0 -> 5368 bytes + test/reference/caps-joins.traps.argb32.ref.png | Bin 0 -> 2374 bytes + test/reference/caps-joins.traps.rgb24.ref.png | Bin 0 -> 2374 bytes + test/reference/caps-sub-paths.traps.argb32.ref.png | Bin 0 -> 166 bytes + test/reference/caps-sub-paths.traps.rgb24.ref.png | Bin 0 -> 166 bytes + .../caps-tails-curve.traps.argb32.ref.png | Bin 0 -> 50228 bytes + .../reference/caps-tails-curve.traps.rgb24.ref.png | Bin 0 -> 50228 bytes + test/reference/caps.traps.argb32.ref.png | Bin 0 -> 1601 bytes + test/reference/caps.traps.rgb24.ref.png | Bin 0 -> 1601 bytes + test/reference/checkerboard.traps.argb32.ref.png | Bin 0 -> 142 bytes + test/reference/checkerboard.traps.rgb24.ref.png | Bin 0 -> 142 bytes + test/reference/clear-source.traps.argb32.ref.png | Bin 0 -> 779 bytes + test/reference/clear-source.traps.rgb24.ref.png | Bin 0 -> 779 bytes + test/reference/clear.traps.argb32.ref.png | Bin 0 -> 673 bytes + test/reference/clear.traps.rgb24.ref.png | Bin 0 -> 614 bytes + test/reference/clip-all.traps.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-all.traps.rgb24.ref.png | Bin 0 -> 95 bytes + .../clip-complex-shape-eo-aa.traps.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-aa.traps.rgb24.ref.png | Bin 0 -> 325 bytes + ...clip-complex-shape-eo-mono.traps.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.traps.rgb24.ref.png | Bin 0 -> 325 bytes + test/reference/clip-contexts.traps.argb32.ref.png | Bin 0 -> 98 bytes + test/reference/clip-contexts.traps.rgb24.ref.png | Bin 0 -> 98 bytes + .../clip-device-offset.traps.argb32.ref.png | Bin 0 -> 175 bytes + .../clip-device-offset.traps.rgb24.ref.png | Bin 0 -> 168 bytes + .../clip-disjoint-hatching.traps.argb32.ref.png | Bin 0 -> 7953 bytes + .../clip-disjoint-hatching.traps.rgb24.ref.png | Bin 0 -> 7953 bytes + test/reference/clip-disjoint.traps.argb32.ref.png | Bin 0 -> 5411 bytes + test/reference/clip-disjoint.traps.rgb24.ref.png | Bin 0 -> 5411 bytes + .../clip-empty-group.traps.argb32.ref.png | Bin 0 -> 103 bytes + .../reference/clip-empty-group.traps.rgb24.ref.png | Bin 0 -> 103 bytes + .../reference/clip-empty-save.traps.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty-save.traps.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.traps.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.traps.rgb24.ref.png | Bin 0 -> 95 bytes + .../clip-fill-eo-unbounded.traps.argb32.ref.png | Bin 0 -> 3693 bytes + .../reference/clip-fill-no-op.traps.argb32.ref.png | Bin 0 -> 152 bytes + test/reference/clip-fill-no-op.traps.rgb24.ref.png | Bin 0 -> 152 bytes + .../clip-fill-nz-unbounded.traps.argb32.ref.png | Bin 0 -> 3693 bytes + ...ip-fill-rule-pixel-aligned.traps.argb32.ref.png | Bin 0 -> 176 bytes + ...lip-fill-rule-pixel-aligned.traps.rgb24.ref.png | Bin 0 -> 165 bytes + test/reference/clip-fill-rule.traps.argb32.ref.png | Bin 0 -> 412 bytes + test/reference/clip-fill-rule.traps.rgb24.ref.png | Bin 0 -> 361 bytes + test/reference/clip-fill.traps.argb32.ref.png | Bin 0 -> 1049 bytes + test/reference/clip-fill.traps.rgb24.ref.png | Bin 0 -> 1049 bytes + ...-shapes-aligned-rectangles.traps.argb32.ref.png | Bin 0 -> 378 bytes + ...p-shapes-aligned-rectangles.traps.rgb24.ref.png | Bin 0 -> 378 bytes + .../clip-group-shapes-circles.traps.argb32.ref.png | Bin 0 -> 1530 bytes + .../clip-group-shapes-circles.traps.rgb24.ref.png | Bin 0 -> 1530 bytes + ...hapes-unaligned-rectangles.traps.argb32.ref.png | Bin 0 -> 431 bytes + ...shapes-unaligned-rectangles.traps.rgb24.ref.png | Bin 0 -> 431 bytes + test/reference/clip-image.traps.argb32.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-image.traps.rgb24.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-intersect.traps.argb32.ref.png | Bin 0 -> 193 bytes + test/reference/clip-intersect.traps.rgb24.ref.png | Bin 0 -> 193 bytes + .../clip-mixed-antialias.traps.argb32.ref.png | Bin 0 -> 1094 bytes + .../clip-mixed-antialias.traps.rgb24.ref.png | Bin 0 -> 1094 bytes + test/reference/clip-nesting.traps.argb32.ref.png | Bin 0 -> 1031 bytes + test/reference/clip-nesting.traps.rgb24.ref.png | Bin 0 -> 936 bytes + test/reference/clip-operator.traps.argb32.ref.png | Bin 0 -> 8153 bytes + .../reference/clip-push-group.traps.argb32.ref.png | Bin 0 -> 155 bytes + test/reference/clip-push-group.traps.rgb24.ref.png | Bin 0 -> 155 bytes + ...rotate-image-surface-paint.traps.argb32.ref.png | Bin 0 -> 202 bytes + ...-rotate-image-surface-paint.traps.rgb24.ref.png | Bin 0 -> 202 bytes + test/reference/clip-shape.traps.argb32.ref.png | Bin 0 -> 2944 bytes + test/reference/clip-shape.traps.rgb24.ref.png | Bin 0 -> 2944 bytes + .../clip-stroke-no-op.traps.argb32.ref.png | Bin 0 -> 152 bytes + .../clip-stroke-no-op.traps.rgb24.ref.png | Bin 0 -> 152 bytes + .../clip-stroke-unbounded.traps.argb32.ref.png | Bin 0 -> 3617 bytes + test/reference/clip-stroke.traps.argb32.ref.png | Bin 0 -> 1492 bytes + test/reference/clip-stroke.traps.rgb24.ref.png | Bin 0 -> 1492 bytes + test/reference/clip-text.traps.argb32.ref.png | Bin 0 -> 899 bytes + test/reference/clip-text.traps.rgb24.ref.png | Bin 0 -> 899 bytes + .../clip-twice-rectangle.traps.argb32.ref.png | Bin 0 -> 323 bytes + .../clip-twice-rectangle.traps.rgb24.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice.traps.argb32.ref.png | Bin 0 -> 1328 bytes + test/reference/clip-twice.traps.rgb24.ref.png | Bin 0 -> 1173 bytes + test/reference/clip-unbounded.traps.argb32.ref.png | Bin 0 -> 100 bytes + test/reference/clip-unbounded.traps.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/clipped-group.traps.argb32.ref.png | Bin 0 -> 289 bytes + test/reference/clipped-group.traps.rgb24.ref.png | Bin 0 -> 289 bytes + .../reference/clipped-surface.traps.argb32.ref.png | Bin 0 -> 345 bytes + test/reference/clipped-surface.traps.rgb24.ref.png | Bin 0 -> 345 bytes + .../close-path-current-point.traps.argb32.ref.png | Bin 0 -> 2008 bytes + .../close-path-current-point.traps.rgb24.ref.png | Bin 0 -> 2008 bytes + test/reference/close-path.traps.argb32.ref.png | Bin 0 -> 284 bytes + test/reference/close-path.traps.rgb24.ref.png | Bin 0 -> 284 bytes + ...eger-translate-over-repeat.traps.argb32.ref.png | Bin 0 -> 334 bytes + ...teger-translate-over-repeat.traps.rgb24.ref.png | Bin 0 -> 334 bytes + ...ite-integer-translate-over.traps.argb32.ref.png | Bin 0 -> 13998 bytes + ...site-integer-translate-over.traps.rgb24.ref.png | Bin 0 -> 13998 bytes + ...e-integer-translate-source.traps.argb32.ref.png | Bin 0 -> 13998 bytes + ...te-integer-translate-source.traps.rgb24.ref.png | Bin 0 -> 13998 bytes + test/reference/copy-path.traps.argb32.ref.png | Bin 0 -> 588 bytes + test/reference/copy-path.traps.rgb24.ref.png | Bin 0 -> 588 bytes + .../create-from-png-stream.traps.argb32.ref.png | Bin 0 -> 96 bytes + .../create-from-png-stream.traps.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/culled-glyphs.traps.argb32.ref.png | Bin 0 -> 435 bytes + test/reference/culled-glyphs.traps.rgb24.ref.png | Bin 0 -> 435 bytes + .../curve-to-as-line-to.traps.argb32.ref.png | Bin 0 -> 107 bytes + .../curve-to-as-line-to.traps.rgb24.ref.png | Bin 0 -> 107 bytes + .../reference/dash-caps-joins.traps.argb32.ref.png | Bin 0 -> 4521 bytes + test/reference/dash-caps-joins.traps.rgb24.ref.png | Bin 0 -> 4521 bytes + test/reference/dash-curve.traps.argb32.ref.png | Bin 0 -> 40040 bytes + test/reference/dash-curve.traps.rgb24.ref.png | Bin 0 -> 40040 bytes + .../dash-infinite-loop.traps.argb32.ref.png | Bin 0 -> 835 bytes + .../dash-infinite-loop.traps.rgb24.ref.png | Bin 0 -> 835 bytes + test/reference/dash-no-dash.traps.argb32.ref.png | Bin 0 -> 119 bytes + test/reference/dash-no-dash.traps.rgb24.ref.png | Bin 0 -> 119 bytes + .../dash-offset-negative.traps.argb32.ref.png | Bin 0 -> 151 bytes + .../dash-offset-negative.traps.rgb24.ref.png | Bin 0 -> 151 bytes + test/reference/dash-offset.traps.argb32.ref.png | Bin 0 -> 794 bytes + test/reference/dash-offset.traps.rgb24.ref.png | Bin 0 -> 794 bytes + test/reference/dash-scale.traps.argb32.ref.png | Bin 0 -> 7621 bytes + test/reference/dash-scale.traps.rgb24.ref.png | Bin 0 -> 7621 bytes + test/reference/dash-state.traps.argb32.ref.png | Bin 0 -> 7628 bytes + test/reference/dash-state.traps.rgb24.ref.png | Bin 0 -> 7628 bytes + .../dash-zero-length.traps.argb32.ref.png | Bin 0 -> 219 bytes + .../reference/dash-zero-length.traps.rgb24.ref.png | Bin 0 -> 199 bytes + test/reference/degenerate-arc.traps.argb32.ref.png | Bin 0 -> 547 bytes + test/reference/degenerate-arc.traps.rgb24.ref.png | Bin 0 -> 547 bytes + .../reference/degenerate-arcs.traps.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-arcs.traps.rgb24.ref.png | Bin 0 -> 120 bytes + .../degenerate-curve-to.traps.argb32.ref.png | Bin 0 -> 283 bytes + .../degenerate-curve-to.traps.rgb24.ref.png | Bin 0 -> 283 bytes + .../reference/degenerate-dash.traps.argb32.ref.png | Bin 0 -> 1898 bytes + test/reference/degenerate-dash.traps.rgb24.ref.png | Bin 0 -> 1898 bytes + ...degenerate-linear-gradient.traps.argb32.ref.png | Bin 0 -> 336 bytes + .../degenerate-linear-gradient.traps.rgb24.ref.png | Bin 0 -> 336 bytes + .../reference/degenerate-path.traps.argb32.ref.png | Bin 0 -> 249 bytes + test/reference/degenerate-path.traps.rgb24.ref.png | Bin 0 -> 217 bytes + test/reference/degenerate-pen.traps.argb32.ref.png | Bin 0 -> 1000 bytes + test/reference/degenerate-pen.traps.rgb24.ref.png | Bin 0 -> 1000 bytes + ...degenerate-radial-gradient.traps.argb32.ref.png | Bin 0 -> 428 bytes + .../degenerate-radial-gradient.traps.rgb24.ref.png | Bin 0 -> 428 bytes + .../degenerate-rel-curve-to.traps.argb32.ref.png | Bin 0 -> 278 bytes + .../degenerate-rel-curve-to.traps.rgb24.ref.png | Bin 0 -> 278 bytes + .../device-offset-fractional.traps.argb32.ref.png | Bin 0 -> 266 bytes + .../device-offset-fractional.traps.rgb24.ref.png | Bin 0 -> 266 bytes + .../device-offset-positive.traps.argb32.ref.png | Bin 0 -> 120 bytes + .../device-offset-positive.traps.rgb24.ref.png | Bin 0 -> 111 bytes + .../device-offset-scale.traps.argb32.ref.png | Bin 0 -> 109 bytes + .../device-offset-scale.traps.rgb24.ref.png | Bin 0 -> 109 bytes + test/reference/device-offset.traps.argb32.ref.png | Bin 0 -> 118 bytes + test/reference/device-offset.traps.rgb24.ref.png | Bin 0 -> 111 bytes + test/reference/drunkard-tails.traps.argb32.ref.png | Bin 0 -> 6036 bytes + test/reference/drunkard-tails.traps.rgb24.ref.png | Bin 0 -> 6036 bytes + .../extend-pad-border.traps.argb32.ref.png | Bin 0 -> 495 bytes + .../extend-pad-border.traps.rgb24.ref.png | Bin 0 -> 495 bytes + .../extend-pad-similar.traps.argb32.ref.png | Bin 0 -> 279 bytes + .../extend-pad-similar.traps.rgb24.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.traps.argb32.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.traps.rgb24.ref.png | Bin 0 -> 279 bytes + .../extend-reflect-similar.traps.argb32.ref.png | Bin 0 -> 133406 bytes + .../extend-reflect-similar.traps.rgb24.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.traps.argb32.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.traps.rgb24.ref.png | Bin 0 -> 133406 bytes + .../extend-repeat-similar.traps.argb32.ref.png | Bin 0 -> 108603 bytes + .../extend-repeat-similar.traps.rgb24.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.traps.argb32.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.traps.rgb24.ref.png | Bin 0 -> 108603 bytes + .../extended-blend-alpha-mask.traps.argb32.ref.png | Bin 0 -> 9221 bytes + .../extended-blend-alpha-mask.traps.rgb24.ref.png | Bin 0 -> 4597 bytes + .../extended-blend-alpha.traps.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-alpha.traps.rgb24.ref.png | Bin 0 -> 5740 bytes + .../extended-blend-mask.traps.argb32.ref.png | Bin 0 -> 3971 bytes + .../extended-blend-mask.traps.rgb24.ref.png | Bin 0 -> 3643 bytes + ...extended-blend-solid-alpha.traps.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-solid-alpha.traps.rgb24.ref.png | Bin 0 -> 5740 bytes + .../extended-blend-solid.traps.argb32.ref.png | Bin 0 -> 4063 bytes + .../extended-blend-solid.traps.rgb24.ref.png | Bin 0 -> 3775 bytes + test/reference/extended-blend.traps.argb32.ref.png | Bin 0 -> 4063 bytes + test/reference/extended-blend.traps.rgb24.ref.png | Bin 0 -> 3775 bytes + .../fill-alpha-pattern.traps.argb32.ref.png | Bin 0 -> 3379 bytes + .../fill-alpha-pattern.traps.rgb24.ref.png | Bin 0 -> 3379 bytes + test/reference/fill-alpha.traps.argb32.ref.png | Bin 0 -> 2824 bytes + test/reference/fill-alpha.traps.rgb24.ref.png | Bin 0 -> 2824 bytes + .../fill-and-stroke-alpha-add.traps.argb32.ref.png | Bin 0 -> 552 bytes + .../fill-and-stroke-alpha-add.traps.rgb24.ref.png | Bin 0 -> 552 bytes + .../fill-and-stroke-alpha.traps.argb32.ref.png | Bin 0 -> 507 bytes + .../fill-and-stroke-alpha.traps.rgb24.ref.png | Bin 0 -> 507 bytes + .../reference/fill-and-stroke.traps.argb32.ref.png | Bin 0 -> 321 bytes + test/reference/fill-and-stroke.traps.rgb24.ref.png | Bin 0 -> 293 bytes + ...fill-degenerate-sort-order.traps.argb32.ref.png | Bin 0 -> 2378 bytes + .../fill-degenerate-sort-order.traps.rgb24.ref.png | Bin 0 -> 2041 bytes + test/reference/fill-empty.traps.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/fill-empty.traps.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/fill-image.traps.argb32.ref.png | Bin 0 -> 1455 bytes + test/reference/fill-image.traps.rgb24.ref.png | Bin 0 -> 1455 bytes + .../fill-missed-stop.traps.argb32.ref.png | Bin 0 -> 447 bytes + .../reference/fill-missed-stop.traps.rgb24.ref.png | Bin 0 -> 375 bytes + test/reference/fill-rule.traps.argb32.ref.png | Bin 0 -> 1979 bytes + test/reference/fill-rule.traps.rgb24.ref.png | Bin 0 -> 1703 bytes + .../filter-bilinear-extents.traps.argb32.ref.png | Bin 0 -> 1210 bytes + .../filter-bilinear-extents.traps.rgb24.ref.png | Bin 0 -> 1210 bytes + .../filter-nearest-offset.traps.argb32.ref.png | Bin 0 -> 201 bytes + .../filter-nearest-offset.traps.rgb24.ref.png | Bin 0 -> 201 bytes + ...filter-nearest-transformed.traps.argb32.ref.png | Bin 0 -> 514 bytes + .../filter-nearest-transformed.traps.rgb24.ref.png | Bin 0 -> 514 bytes + .../finer-grained-fallbacks.traps.argb32.ref.png | Bin 0 -> 1110 bytes + .../finer-grained-fallbacks.traps.rgb24.ref.png | Bin 0 -> 856 bytes + .../font-matrix-translation.traps.argb32.ref.png | Bin 0 -> 874 bytes + .../font-matrix-translation.traps.rgb24.ref.png | Bin 0 -> 874 bytes + ...ft-show-glyphs-positioning.traps.argb32.ref.png | Bin 0 -> 3297 bytes + .../ft-show-glyphs-positioning.traps.rgb24.ref.png | Bin 0 -> 3297 bytes + .../ft-show-glyphs-table.traps.argb32.ref.png | Bin 0 -> 9893 bytes + .../ft-show-glyphs-table.traps.rgb24.ref.png | Bin 0 -> 9893 bytes + .../ft-text-antialias-none.traps.argb32.ref.png | Bin 0 -> 295 bytes + .../ft-text-antialias-none.traps.rgb24.ref.png | Bin 0 -> 295 bytes + ...text-vertical-layout-type1.traps.argb32.ref.png | Bin 0 -> 3066 bytes + ...-text-vertical-layout-type1.traps.rgb24.ref.png | Bin 0 -> 3066 bytes + ...text-vertical-layout-type3.traps.argb32.ref.png | Bin 0 -> 3597 bytes + ...-text-vertical-layout-type3.traps.rgb24.ref.png | Bin 0 -> 3597 bytes + .../get-group-target.traps.argb32.ref.png | Bin 0 -> 113 bytes + .../reference/get-group-target.traps.rgb24.ref.png | Bin 0 -> 113 bytes + .../glyph-cache-pressure.traps.argb32.ref.png | Bin 0 -> 2863 bytes + .../glyph-cache-pressure.traps.rgb24.ref.png | Bin 0 -> 2863 bytes + test/reference/gradient-alpha.traps.argb32.ref.png | Bin 0 -> 125 bytes + test/reference/gradient-alpha.traps.rgb24.ref.png | Bin 0 -> 119 bytes + .../gradient-constant-alpha.traps.argb32.ref.png | Bin 0 -> 111 bytes + .../gradient-constant-alpha.traps.rgb24.ref.png | Bin 0 -> 106 bytes + .../gradient-zero-stops-mask.traps.argb32.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops-mask.traps.rgb24.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops.traps.argb32.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops.traps.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/group-clip.traps.argb32.ref.png | Bin 0 -> 191 bytes + test/reference/group-clip.traps.rgb24.ref.png | Bin 0 -> 191 bytes + test/reference/group-paint.traps.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/group-paint.traps.rgb24.ref.png | Bin 0 -> 95 bytes + .../reference/group-unaligned.traps.argb32.ref.png | Bin 0 -> 468 bytes + test/reference/group-unaligned.traps.rgb24.ref.png | Bin 0 -> 468 bytes + test/reference/halo-transform.traps.argb32.ref.png | Bin 0 -> 15118 bytes + test/reference/halo-transform.traps.rgb24.ref.png | Bin 0 -> 15118 bytes + test/reference/halo.traps.argb32.ref.png | Bin 0 -> 8800 bytes + test/reference/halo.traps.rgb24.ref.png | Bin 0 -> 8800 bytes + test/reference/hatchings.traps.argb32.ref.png | Bin 0 -> 89997 bytes + .../reference/horizontal-clip.traps.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/horizontal-clip.traps.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/huge-linear.traps.argb32.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-linear.traps.rgb24.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-radial.traps.argb32.ref.png | Bin 0 -> 41702 bytes + test/reference/huge-radial.traps.rgb24.ref.png | Bin 0 -> 41702 bytes + .../image-bug-710072-aligned.traps.argb32.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-aligned.traps.rgb24.ref.png | Bin 0 -> 151 bytes + ...image-bug-710072-unaligned.traps.argb32.ref.png | Bin 0 -> 219 bytes + .../image-bug-710072-unaligned.traps.rgb24.ref.png | Bin 0 -> 219 bytes + .../image-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + .../image-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/implicit-close.traps.argb32.ref.png | Bin 0 -> 251 bytes + test/reference/implicit-close.traps.rgb24.ref.png | Bin 0 -> 251 bytes + test/reference/infinite-join.traps.argb32.ref.png | Bin 0 -> 160 bytes + test/reference/infinite-join.traps.rgb24.ref.png | Bin 0 -> 160 bytes + test/reference/inverse-text.traps.argb32.ref.png | Bin 0 -> 2166 bytes + test/reference/inverse-text.traps.rgb24.ref.png | Bin 0 -> 2166 bytes + test/reference/joins-loop.traps.argb32.ref.png | Bin 0 -> 4202 bytes + test/reference/joins-loop.traps.rgb24.ref.png | Bin 0 -> 4202 bytes + test/reference/joins-retrace.traps.argb32.ref.png | Bin 0 -> 4667 bytes + test/reference/joins-retrace.traps.rgb24.ref.png | Bin 0 -> 4667 bytes + test/reference/joins-star.traps.argb32.ref.png | Bin 0 -> 3583 bytes + test/reference/joins-star.traps.rgb24.ref.png | Bin 0 -> 3583 bytes + test/reference/joins.traps.argb32.ref.png | Bin 0 -> 5684 bytes + test/reference/joins.traps.rgb24.ref.png | Bin 0 -> 5684 bytes + test/reference/large-clip.traps.argb32.ref.png | Bin 0 -> 305 bytes + test/reference/large-clip.traps.rgb24.ref.png | Bin 0 -> 305 bytes + test/reference/large-font.traps.argb32.ref.png | Bin 0 -> 6117 bytes + test/reference/large-font.traps.rgb24.ref.png | Bin 0 -> 6117 bytes + .../large-source-roi.traps.argb32.ref.png | Bin 0 -> 93 bytes + .../reference/large-source-roi.traps.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/large-source.traps.argb32.ref.png | Bin 0 -> 112 bytes + test/reference/large-source.traps.rgb24.ref.png | Bin 0 -> 112 bytes + ...large-twin-antialias-mixed.traps.argb32.ref.png | Bin 0 -> 10740 bytes + .../large-twin-antialias-mixed.traps.rgb24.ref.png | Bin 0 -> 10740 bytes + test/reference/leaky-dash.traps.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/leaky-dash.traps.rgb24.ref.png | Bin 0 -> 197 bytes + .../leaky-dashed-rectangle.traps.argb32.ref.png | Bin 0 -> 344 bytes + .../leaky-dashed-rectangle.traps.rgb24.ref.png | Bin 0 -> 344 bytes + .../leaky-dashed-stroke.traps.argb32.ref.png | Bin 0 -> 9303 bytes + .../leaky-dashed-stroke.traps.rgb24.ref.png | Bin 0 -> 9303 bytes + test/reference/leaky-polygon.traps.argb32.ref.png | Bin 0 -> 325 bytes + test/reference/leaky-polygon.traps.rgb24.ref.png | Bin 0 -> 325 bytes + .../line-width-overlap-dashed.traps.argb32.ref.png | Bin 0 -> 401 bytes + .../line-width-overlap-dashed.traps.rgb24.ref.png | Bin 0 -> 401 bytes + ...line-width-overlap-flipped.traps.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flipped.traps.rgb24.ref.png | Bin 0 -> 324 bytes + ...line-width-overlap-flopped.traps.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.traps.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-offset.traps.argb32.ref.png | Bin 0 -> 408 bytes + .../line-width-overlap-offset.traps.rgb24.ref.png | Bin 0 -> 408 bytes + ...line-width-overlap-rotated.traps.argb32.ref.png | Bin 0 -> 628 bytes + .../line-width-overlap-rotated.traps.rgb24.ref.png | Bin 0 -> 628 bytes + .../line-width-overlap.traps.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap.traps.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-scale.traps.argb32.ref.png | Bin 0 -> 5692 bytes + .../reference/line-width-scale.traps.rgb24.ref.png | Bin 0 -> 5692 bytes + .../line-width-tolerance.traps.argb32.ref.png | Bin 0 -> 163 bytes + .../line-width-tolerance.traps.rgb24.ref.png | Bin 0 -> 163 bytes + test/reference/line-width.traps.argb32.ref.png | Bin 0 -> 180 bytes + test/reference/line-width.traps.rgb24.ref.png | Bin 0 -> 180 bytes + .../linear-gradient-extend.traps.argb32.ref.png | Bin 0 -> 371 bytes + .../linear-gradient-extend.traps.rgb24.ref.png | Bin 0 -> 371 bytes + .../linear-gradient-large.traps.argb32.ref.png | Bin 0 -> 4076 bytes + .../linear-gradient-large.traps.rgb24.ref.png | Bin 0 -> 4076 bytes + .../linear-gradient-one-stop.traps.argb32.ref.png | Bin 0 -> 225 bytes + .../linear-gradient-one-stop.traps.rgb24.ref.png | Bin 0 -> 174 bytes + .../linear-gradient-reflect.traps.argb32.ref.png | Bin 0 -> 185 bytes + .../linear-gradient-reflect.traps.rgb24.ref.png | Bin 0 -> 185 bytes + .../linear-gradient-subset.traps.argb32.ref.png | Bin 0 -> 773 bytes + .../linear-gradient-subset.traps.rgb24.ref.png | Bin 0 -> 773 bytes + .../reference/linear-gradient.traps.argb32.ref.png | Bin 0 -> 914 bytes + test/reference/linear-gradient.traps.rgb24.ref.png | Bin 0 -> 914 bytes + .../linear-step-function.traps.argb32.ref.png | Bin 0 -> 118 bytes + .../linear-step-function.traps.rgb24.ref.png | Bin 0 -> 118 bytes + test/reference/linear-uniform.traps.argb32.ref.png | Bin 0 -> 128 bytes + test/reference/linear-uniform.traps.rgb24.ref.png | Bin 0 -> 128 bytes + .../long-dashed-lines.traps.argb32.ref.png | Bin 0 -> 2071 bytes + .../long-dashed-lines.traps.rgb24.ref.png | Bin 0 -> 2071 bytes + test/reference/long-lines.traps.argb32.ref.png | Bin 0 -> 201 bytes + test/reference/long-lines.traps.rgb24.ref.png | Bin 0 -> 201 bytes + .../map-all-to-image.traps.argb32.ref.png | Bin 0 -> 86 bytes + .../reference/map-all-to-image.traps.rgb24.ref.png | Bin 0 -> 86 bytes + .../map-bit-to-image.traps.argb32.ref.png | Bin 0 -> 103 bytes + .../reference/map-bit-to-image.traps.rgb24.ref.png | Bin 0 -> 103 bytes + .../map-to-image-fill.traps.argb32.ref.png | Bin 0 -> 103 bytes + .../map-to-image-fill.traps.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/mask-alpha.traps.argb32.ref.png | Bin 0 -> 627 bytes + test/reference/mask-alpha.traps.rgb24.ref.png | Bin 0 -> 588 bytes + test/reference/mask-ctm.traps.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-ctm.traps.rgb24.ref.png | Bin 0 -> 105 bytes + .../mask-surface-ctm.traps.argb32.ref.png | Bin 0 -> 110 bytes + .../reference/mask-surface-ctm.traps.rgb24.ref.png | Bin 0 -> 105 bytes + .../mask-transformed-image.traps.argb32.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-image.traps.rgb24.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-similar.traps.argb32.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-similar.traps.rgb24.ref.png | Bin 0 -> 3812 bytes + test/reference/mask.traps.argb32.ref.png | Bin 0 -> 8451 bytes + test/reference/mask.traps.rgb24.ref.png | Bin 0 -> 7058 bytes + .../mesh-pattern-accuracy.traps.argb32.ref.png | Bin 0 -> 8086 bytes + .../mesh-pattern-accuracy.traps.rgb24.ref.png | Bin 0 -> 8086 bytes + .../mesh-pattern-conical.traps.argb32.ref.png | Bin 0 -> 8655 bytes + .../mesh-pattern-conical.traps.rgb24.ref.png | Bin 0 -> 8655 bytes + ...esh-pattern-control-points.traps.argb32.ref.png | Bin 0 -> 10665 bytes + ...mesh-pattern-control-points.traps.rgb24.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-fold.traps.argb32.ref.png | Bin 0 -> 52980 bytes + .../mesh-pattern-fold.traps.rgb24.ref.png | Bin 0 -> 52980 bytes + .../mesh-pattern-overlap.traps.argb32.ref.png | Bin 0 -> 9129 bytes + .../mesh-pattern-overlap.traps.rgb24.ref.png | Bin 0 -> 9129 bytes + .../mesh-pattern-transformed.traps.argb32.ref.png | Bin 0 -> 14463 bytes + .../mesh-pattern-transformed.traps.rgb24.ref.png | Bin 0 -> 14463 bytes + test/reference/mesh-pattern.traps.argb32.ref.png | Bin 0 -> 19566 bytes + test/reference/mesh-pattern.traps.rgb24.ref.png | Bin 0 -> 19566 bytes + test/reference/mime-data.traps.argb32.ref.png | Bin 0 -> 185 bytes + test/reference/mime-data.traps.rgb24.ref.png | Bin 0 -> 185 bytes + test/reference/mime-surface.traps.argb32.ref.png | Bin 0 -> 1209 bytes + test/reference/mime-surface.traps.rgb24.ref.png | Bin 0 -> 1209 bytes + .../reference/miter-precision.traps.argb32.ref.png | Bin 0 -> 818 bytes + test/reference/miter-precision.traps.rgb24.ref.png | Bin 0 -> 818 bytes + .../move-to-show-surface.traps.argb32.ref.png | Bin 0 -> 96 bytes + .../move-to-show-surface.traps.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/new-sub-path.traps.argb32.ref.png | Bin 0 -> 415 bytes + test/reference/new-sub-path.traps.rgb24.ref.png | Bin 0 -> 378 bytes + test/reference/nil-surface.traps.argb32.ref.png | Bin 0 -> 88 bytes + test/reference/nil-surface.traps.rgb24.ref.png | Bin 0 -> 87 bytes + .../operator-alpha-alpha.traps.argb32.ref.png | Bin 0 -> 3441 bytes + .../operator-alpha-alpha.traps.rgb24.ref.png | Bin 0 -> 3441 bytes + test/reference/operator-alpha.traps.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.traps.rgb24.ref.png | Bin 0 -> 205 bytes + test/reference/operator-clear.traps.argb32.ref.png | Bin 0 -> 1070 bytes + test/reference/operator-clear.traps.rgb24.ref.png | Bin 0 -> 950 bytes + .../reference/operator-source.traps.argb32.ref.png | Bin 0 -> 5803 bytes + test/reference/operator-source.traps.rgb24.ref.png | Bin 0 -> 1854 bytes + test/reference/operator.traps.argb32.ref.png | Bin 0 -> 238 bytes + test/reference/operator.traps.rgb24.ref.png | Bin 0 -> 189 bytes + .../over-above-source.traps.argb32.ref.png | Bin 0 -> 533 bytes + .../over-above-source.traps.rgb24.ref.png | Bin 0 -> 450 bytes + .../over-around-source.traps.argb32.ref.png | Bin 0 -> 610 bytes + .../over-around-source.traps.rgb24.ref.png | Bin 0 -> 245 bytes + .../over-below-source.traps.argb32.ref.png | Bin 0 -> 436 bytes + .../over-below-source.traps.rgb24.ref.png | Bin 0 -> 340 bytes + .../over-between-source.traps.argb32.ref.png | Bin 0 -> 578 bytes + .../over-between-source.traps.rgb24.ref.png | Bin 0 -> 430 bytes + .../overlapping-boxes.traps.argb32.ref.png | Bin 0 -> 216 bytes + .../overlapping-boxes.traps.rgb24.ref.png | Bin 0 -> 201 bytes + .../overlapping-dash-caps.traps.argb32.ref.png | Bin 0 -> 3952 bytes + .../overlapping-dash-caps.traps.rgb24.ref.png | Bin 0 -> 3952 bytes + .../overlapping-glyphs.traps.argb32.ref.png | Bin 0 -> 2684 bytes + .../overlapping-glyphs.traps.rgb24.ref.png | Bin 0 -> 1647 bytes + .../paint-clip-fill-aa.traps.argb32.ref.png | Bin 0 -> 327 bytes + .../paint-clip-fill-aa.traps.rgb24.ref.png | Bin 0 -> 327 bytes + .../paint-clip-fill-mono.traps.argb32.ref.png | Bin 0 -> 327 bytes + .../paint-clip-fill-mono.traps.rgb24.ref.png | Bin 0 -> 327 bytes + test/reference/paint-repeat.traps.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/paint-repeat.traps.rgb24.ref.png | Bin 0 -> 122 bytes + .../paint-source-alpha.traps.argb32.ref.png | Bin 0 -> 224 bytes + .../paint-source-alpha.traps.rgb24.ref.png | Bin 0 -> 224 bytes + ...paint-with-alpha-clip-mask.traps.argb32.ref.png | Bin 0 -> 305 bytes + .../paint-with-alpha-clip-mask.traps.rgb24.ref.png | Bin 0 -> 305 bytes + .../paint-with-alpha-clip.traps.argb32.ref.png | Bin 0 -> 269 bytes + .../paint-with-alpha-clip.traps.rgb24.ref.png | Bin 0 -> 269 bytes + ...aint-with-alpha-solid-clip.traps.argb32.ref.png | Bin 0 -> 266 bytes + ...paint-with-alpha-solid-clip.traps.rgb24.ref.png | Bin 0 -> 266 bytes + .../paint-with-alpha.traps.argb32.ref.png | Bin 0 -> 224 bytes + .../reference/paint-with-alpha.traps.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/paint.traps.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/paint.traps.rgb24.ref.png | Bin 0 -> 93 bytes + .../partial-clip-text-bottom.traps.argb32.ref.png | Bin 0 -> 259 bytes + .../partial-clip-text-bottom.traps.rgb24.ref.png | Bin 0 -> 259 bytes + .../partial-clip-text-left.traps.argb32.ref.png | Bin 0 -> 293 bytes + .../partial-clip-text-left.traps.rgb24.ref.png | Bin 0 -> 293 bytes + .../partial-clip-text-right.traps.argb32.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-right.traps.rgb24.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-top.traps.argb32.ref.png | Bin 0 -> 173 bytes + .../partial-clip-text-top.traps.rgb24.ref.png | Bin 0 -> 173 bytes + ...al-coverage-half-reference.traps.argb32.ref.png | Bin 0 -> 189 bytes + ...ial-coverage-half-reference.traps.rgb24.ref.png | Bin 0 -> 189 bytes + ...partial-coverage-reference.traps.argb32.ref.png | Bin 0 -> 202 bytes + .../partial-coverage-reference.traps.rgb24.ref.png | Bin 0 -> 202 bytes + ...ge-three-quarter-reference.traps.argb32.ref.png | Bin 0 -> 186 bytes + ...age-three-quarter-reference.traps.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/path-append.traps.argb32.ref.png | Bin 0 -> 6463 bytes + test/reference/path-append.traps.rgb24.ref.png | Bin 0 -> 6463 bytes + .../path-stroke-twice.traps.argb32.ref.png | Bin 0 -> 205 bytes + .../path-stroke-twice.traps.rgb24.ref.png | Bin 0 -> 205 bytes + .../reference/pattern-getters.traps.argb32.ref.png | Bin 0 -> 87 bytes + test/reference/pattern-getters.traps.rgb24.ref.png | Bin 0 -> 87 bytes + .../pdf-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + .../pdf-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/pixman-rotate.traps.argb32.ref.png | Bin 0 -> 260 bytes + test/reference/pixman-rotate.traps.rgb24.ref.png | Bin 0 -> 225 bytes + .../ps-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + .../ps-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + .../pthread-same-source.traps.argb32.ref.png | Bin 0 -> 1000 bytes + .../pthread-same-source.traps.rgb24.ref.png | Bin 0 -> 1000 bytes + .../pthread-show-text.traps.argb32.ref.png | Bin 0 -> 29759 bytes + .../pthread-show-text.traps.rgb24.ref.png | Bin 0 -> 29759 bytes + .../reference/pthread-similar.traps.argb32.ref.png | Bin 0 -> 170 bytes + test/reference/pthread-similar.traps.rgb24.ref.png | Bin 0 -> 170 bytes + .../push-group-color.traps.argb32.ref.png | Bin 0 -> 2902 bytes + .../reference/push-group-color.traps.rgb24.ref.png | Bin 0 -> 2902 bytes + .../push-group-path-offset.traps.argb32.ref.png | Bin 0 -> 186 bytes + .../push-group-path-offset.traps.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/push-group.traps.argb32.ref.png | Bin 0 -> 3110 bytes + test/reference/push-group.traps.rgb24.ref.png | Bin 0 -> 2947 bytes + .../radial-gradient-extend.traps.argb32.ref.png | Bin 0 -> 466 bytes + .../radial-gradient-extend.traps.rgb24.ref.png | Bin 0 -> 466 bytes + .../radial-gradient-mask-source.rgb24.ref.png | Bin 150945 -> 0 bytes + ...adial-gradient-mask-source.traps.argb32.ref.png | Bin 0 -> 145713 bytes + ...radial-gradient-mask-source.traps.rgb24.ref.png | Bin 0 -> 7747 bytes + .../radial-gradient-mask.traps.argb32.ref.png | Bin 0 -> 286065 bytes + .../radial-gradient-mask.traps.rgb24.ref.png | Bin 0 -> 286065 bytes + .../radial-gradient-one-stop.traps.argb32.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-one-stop.traps.rgb24.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-source.traps.argb32.ref.png | Bin 0 -> 408848 bytes + .../radial-gradient-source.traps.rgb24.ref.png | Bin 0 -> 263908 bytes + .../reference/radial-gradient.traps.argb32.ref.png | Bin 0 -> 382283 bytes + test/reference/radial-gradient.traps.rgb24.ref.png | Bin 0 -> 382283 bytes + test/reference/random-clip.traps.argb32.ref.png | Bin 0 -> 311369 bytes + test/reference/random-clip.traps.rgb24.ref.png | Bin 0 -> 311369 bytes + ...om-intersections-curves-eo.traps.argb32.ref.png | Bin 0 -> 244476 bytes + ...dom-intersections-curves-eo.traps.rgb24.ref.png | Bin 0 -> 244476 bytes + ...om-intersections-curves-nz.traps.argb32.ref.png | Bin 0 -> 263669 bytes + ...dom-intersections-curves-nz.traps.rgb24.ref.png | Bin 0 -> 263669 bytes + .../random-intersections-eo.traps.argb32.ref.png | Bin 0 -> 134729 bytes + .../random-intersections-eo.traps.rgb24.ref.png | Bin 0 -> 134729 bytes + ...ndom-intersections-nonzero.traps.argb32.ref.png | Bin 0 -> 141616 bytes + ...andom-intersections-nonzero.traps.rgb24.ref.png | Bin 0 -> 141616 bytes + ...record-extend-none-similar.traps.argb32.ref.png | Bin 0 -> 293 bytes + .../record-extend-none-similar.traps.rgb24.ref.png | Bin 0 -> 293 bytes + .../record-extend-none.traps.argb32.ref.png | Bin 0 -> 293 bytes + .../record-extend-none.traps.rgb24.ref.png | Bin 0 -> 293 bytes + .../record-extend-pad-similar.traps.argb32.ref.png | Bin 0 -> 298 bytes + .../record-extend-pad-similar.traps.rgb24.ref.png | Bin 0 -> 298 bytes + .../record-extend-pad.traps.argb32.ref.png | Bin 0 -> 298 bytes + .../record-extend-pad.traps.rgb24.ref.png | Bin 0 -> 298 bytes + ...ord-extend-reflect-similar.traps.argb32.ref.png | Bin 0 -> 335 bytes + ...cord-extend-reflect-similar.traps.rgb24.ref.png | Bin 0 -> 335 bytes + .../record-extend-reflect.traps.argb32.ref.png | Bin 0 -> 335 bytes + .../record-extend-reflect.traps.rgb24.ref.png | Bin 0 -> 335 bytes + ...cord-extend-repeat-similar.traps.argb32.ref.png | Bin 0 -> 286 bytes + ...ecord-extend-repeat-similar.traps.rgb24.ref.png | Bin 0 -> 286 bytes + .../record-extend-repeat.traps.argb32.ref.png | Bin 0 -> 286 bytes + .../record-extend-repeat.traps.rgb24.ref.png | Bin 0 -> 286 bytes + .../record-fill-alpha.traps.argb32.ref.png | Bin 0 -> 2824 bytes + .../record-fill-alpha.traps.rgb24.ref.png | Bin 0 -> 2824 bytes + test/reference/record-mesh.traps.argb32.ref.png | Bin 0 -> 15229 bytes + test/reference/record-mesh.traps.rgb24.ref.png | Bin 0 -> 15229 bytes + ...cord-paint-alpha-clip-mask.traps.argb32.ref.png | Bin 0 -> 305 bytes + ...ecord-paint-alpha-clip-mask.traps.rgb24.ref.png | Bin 0 -> 305 bytes + .../record-paint-alpha-clip.traps.argb32.ref.png | Bin 0 -> 269 bytes + .../record-paint-alpha-clip.traps.rgb24.ref.png | Bin 0 -> 269 bytes + ...ord-paint-alpha-solid-clip.traps.argb32.ref.png | Bin 0 -> 266 bytes + ...cord-paint-alpha-solid-clip.traps.rgb24.ref.png | Bin 0 -> 266 bytes + .../record-paint-alpha.traps.argb32.ref.png | Bin 0 -> 224 bytes + .../record-paint-alpha.traps.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/record-paint.traps.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/record-paint.traps.rgb24.ref.png | Bin 0 -> 93 bytes + ...ording-surface-extend-none.traps.argb32.ref.png | Bin 0 -> 3055 bytes + ...cording-surface-extend-none.traps.rgb24.ref.png | Bin 0 -> 3124 bytes + ...cording-surface-extend-pad.traps.argb32.ref.png | Bin 0 -> 10832 bytes + ...ecording-surface-extend-pad.traps.rgb24.ref.png | Bin 0 -> 12496 bytes + ...ing-surface-extend-reflect.traps.argb32.ref.png | Bin 0 -> 23617 bytes + ...ding-surface-extend-reflect.traps.rgb24.ref.png | Bin 0 -> 24139 bytes + ...ding-surface-extend-repeat.traps.argb32.ref.png | Bin 0 -> 24112 bytes + ...rding-surface-extend-repeat.traps.rgb24.ref.png | Bin 0 -> 24029 bytes + .../recording-surface-over.traps.argb32.ref.png | Bin 0 -> 3055 bytes + .../recording-surface-over.traps.rgb24.ref.png | Bin 0 -> 3124 bytes + .../recording-surface-source.traps.argb32.ref.png | Bin 0 -> 3049 bytes + .../recording-surface-source.traps.rgb24.ref.png | Bin 0 -> 3121 bytes + .../rectangle-rounding-error.traps.argb32.ref.png | Bin 0 -> 212 bytes + .../rectangle-rounding-error.traps.rgb24.ref.png | Bin 0 -> 212 bytes + .../rectilinear-dash.traps.argb32.ref.png | Bin 0 -> 291 bytes + .../reference/rectilinear-dash.traps.rgb24.ref.png | Bin 0 -> 291 bytes + .../rectilinear-fill.traps.argb32.ref.png | Bin 0 -> 151 bytes + .../reference/rectilinear-fill.traps.rgb24.ref.png | Bin 0 -> 151 bytes + .../rectilinear-grid.traps.argb32.ref.png | Bin 0 -> 610 bytes + .../reference/rectilinear-grid.traps.rgb24.ref.png | Bin 0 -> 610 bytes + .../rectilinear-miter-limit.traps.argb32.ref.png | Bin 0 -> 145 bytes + .../rectilinear-miter-limit.traps.rgb24.ref.png | Bin 0 -> 145 bytes + .../rectilinear-stroke.traps.argb32.ref.png | Bin 0 -> 172 bytes + .../rectilinear-stroke.traps.rgb24.ref.png | Bin 0 -> 172 bytes + .../reflected-stroke.traps.argb32.ref.png | Bin 0 -> 4994 bytes + .../reference/reflected-stroke.traps.rgb24.ref.png | Bin 0 -> 4994 bytes + test/reference/rel-path.traps.argb32.ref.png | Bin 0 -> 189 bytes + test/reference/rel-path.traps.rgb24.ref.png | Bin 0 -> 206 bytes + .../rgb24-ignore-alpha.traps.argb32.ref.png | Bin 0 -> 97 bytes + .../rgb24-ignore-alpha.traps.rgb24.ref.png | Bin 0 -> 97 bytes + ...e-clip-image-surface-paint.traps.argb32.ref.png | Bin 0 -> 303 bytes + ...te-clip-image-surface-paint.traps.rgb24.ref.png | Bin 0 -> 303 bytes + ...rotate-image-surface-paint.traps.argb32.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.traps.rgb24.ref.png | Bin 0 -> 220 bytes + test/reference/rotated-clip.traps.argb32.ref.png | Bin 0 -> 3922 bytes + test/reference/rotated-clip.traps.rgb24.ref.png | Bin 0 -> 3922 bytes + .../rounded-rectangle-fill.traps.argb32.ref.png | Bin 0 -> 890 bytes + .../rounded-rectangle-fill.traps.rgb24.ref.png | Bin 0 -> 890 bytes + .../rounded-rectangle-stroke.traps.argb32.ref.png | Bin 0 -> 1060 bytes + .../rounded-rectangle-stroke.traps.rgb24.ref.png | Bin 0 -> 1060 bytes + ...-down-source-surface-paint.traps.argb32.ref.png | Bin 0 -> 96 bytes + ...e-down-source-surface-paint.traps.rgb24.ref.png | Bin 0 -> 96 bytes + .../scale-offset-image.traps.argb32.ref.png | Bin 0 -> 9048 bytes + .../scale-offset-image.traps.rgb24.ref.png | Bin 0 -> 9048 bytes + .../scale-offset-similar.traps.argb32.ref.png | Bin 0 -> 9048 bytes + .../scale-offset-similar.traps.rgb24.ref.png | Bin 0 -> 9048 bytes + ...scale-source-surface-paint.traps.argb32.ref.png | Bin 0 -> 128 bytes + .../scale-source-surface-paint.traps.rgb24.ref.png | Bin 0 -> 117 bytes + .../select-font-face.traps.argb32.ref.png | Bin 0 -> 2245 bytes + .../reference/select-font-face.traps.rgb24.ref.png | Bin 0 -> 2245 bytes + .../self-copy-overlap.traps.argb32.ref.png | Bin 0 -> 1140 bytes + .../self-copy-overlap.traps.rgb24.ref.png | Bin 0 -> 213 bytes + test/reference/self-copy.traps.argb32.ref.png | Bin 0 -> 257 bytes + test/reference/self-copy.traps.rgb24.ref.png | Bin 0 -> 257 bytes + .../self-intersecting.traps.argb32.ref.png | Bin 0 -> 208 bytes + .../self-intersecting.traps.rgb24.ref.png | Bin 0 -> 208 bytes + test/reference/set-source.traps.argb32.ref.png | Bin 0 -> 101 bytes + test/reference/set-source.traps.rgb24.ref.png | Bin 0 -> 101 bytes + .../shape-general-convex.traps.argb32.ref.png | Bin 0 -> 2532 bytes + .../shape-general-convex.traps.rgb24.ref.png | Bin 0 -> 2532 bytes + .../shape-sierpinski.traps.argb32.ref.png | Bin 0 -> 54485 bytes + .../reference/shape-sierpinski.traps.rgb24.ref.png | Bin 0 -> 54485 bytes + .../show-glyphs-advance.traps.argb32.ref.png | Bin 0 -> 1395 bytes + .../show-glyphs-advance.traps.rgb24.ref.png | Bin 0 -> 1395 bytes + .../show-glyphs-many.traps.argb32.ref.png | Bin 0 -> 96 bytes + .../reference/show-glyphs-many.traps.rgb24.ref.png | Bin 0 -> 96 bytes + .../show-text-current-point.traps.argb32.ref.png | Bin 0 -> 2185 bytes + .../show-text-current-point.traps.rgb24.ref.png | Bin 0 -> 2185 bytes + test/reference/skew-extreme.traps.argb32.ref.png | Bin 0 -> 935 bytes + test/reference/skew-extreme.traps.rgb24.ref.png | Bin 0 -> 935 bytes + test/reference/smask-fill.traps.argb32.ref.png | Bin 0 -> 1170 bytes + test/reference/smask-fill.traps.rgb24.ref.png | Bin 0 -> 1170 bytes + .../smask-image-mask.traps.argb32.ref.png | Bin 0 -> 619 bytes + .../reference/smask-image-mask.traps.rgb24.ref.png | Bin 0 -> 619 bytes + test/reference/smask-mask.traps.argb32.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-mask.traps.rgb24.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-paint.traps.argb32.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-paint.traps.rgb24.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-stroke.traps.argb32.ref.png | Bin 0 -> 1703 bytes + test/reference/smask-stroke.traps.rgb24.ref.png | Bin 0 -> 1703 bytes + test/reference/smask-text.traps.argb32.ref.png | Bin 0 -> 1623 bytes + test/reference/smask-text.traps.rgb24.ref.png | Bin 0 -> 1623 bytes + test/reference/smask.traps.argb32.ref.png | Bin 0 -> 3404 bytes + test/reference/smask.traps.rgb24.ref.png | Bin 0 -> 3404 bytes + ...solid-pattern-cache-stress.traps.argb32.ref.png | Bin 0 -> 87 bytes + .../solid-pattern-cache-stress.traps.rgb24.ref.png | Bin 0 -> 87 bytes + .../source-clip-scale.traps.argb32.ref.png | Bin 0 -> 136 bytes + .../source-clip-scale.traps.rgb24.ref.png | Bin 0 -> 136 bytes + test/reference/source-clip.traps.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/source-clip.traps.rgb24.ref.png | Bin 0 -> 111 bytes + ...source-surface-scale-paint.traps.argb32.ref.png | Bin 0 -> 120 bytes + .../source-surface-scale-paint.traps.rgb24.ref.png | Bin 0 -> 114 bytes + .../spline-decomposition.traps.argb32.ref.png | Bin 0 -> 19075 bytes + .../spline-decomposition.traps.rgb24.ref.png | Bin 0 -> 19075 bytes + .../reference/stroke-ctm-caps.traps.argb32.ref.png | Bin 0 -> 873 bytes + test/reference/stroke-ctm-caps.traps.rgb24.ref.png | Bin 0 -> 873 bytes + test/reference/stroke-image.traps.argb32.ref.png | Bin 0 -> 1458 bytes + test/reference/stroke-image.traps.rgb24.ref.png | Bin 0 -> 1458 bytes + .../reference/stroke-open-box.traps.argb32.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-open-box.traps.rgb24.ref.png | Bin 0 -> 148 bytes + .../subsurface-image-repeat.traps.argb32.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.traps.rgb24.ref.png | Bin 0 -> 915 bytes + .../subsurface-modify-child.traps.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-child.traps.rgb24.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-parent.traps.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-parent.traps.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-pad.traps.argb32.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-pad.traps.rgb24.ref.png | Bin 0 -> 181 bytes + .../subsurface-reflect.traps.argb32.ref.png | Bin 0 -> 210 bytes + .../subsurface-reflect.traps.rgb24.ref.png | Bin 0 -> 210 bytes + .../subsurface-repeat.traps.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-repeat.traps.rgb24.ref.png | Bin 0 -> 197 bytes + .../subsurface-similar-repeat.traps.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-similar-repeat.traps.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface.traps.argb32.ref.png | Bin 0 -> 1281 bytes + test/reference/subsurface.traps.rgb24.ref.png | Bin 0 -> 1281 bytes + ...ace-pattern-big-scale-down.traps.argb32.ref.png | Bin 0 -> 191 bytes + ...face-pattern-big-scale-down.traps.rgb24.ref.png | Bin 0 -> 191 bytes + .../surface-pattern-operator.traps.argb32.ref.png | Bin 0 -> 5184 bytes + .../surface-pattern-operator.traps.rgb24.ref.png | Bin 0 -> 1913 bytes + ...ern-scale-down-extend-none.traps.argb32.ref.png | Bin 0 -> 329 bytes + ...tern-scale-down-extend-none.traps.rgb24.ref.png | Bin 0 -> 329 bytes + ...tern-scale-down-extend-pad.traps.argb32.ref.png | Bin 0 -> 320 bytes + ...ttern-scale-down-extend-pad.traps.rgb24.ref.png | Bin 0 -> 320 bytes + ...-scale-down-extend-reflect.traps.argb32.ref.png | Bin 0 -> 328 bytes + ...n-scale-down-extend-reflect.traps.rgb24.ref.png | Bin 0 -> 328 bytes + ...n-scale-down-extend-repeat.traps.argb32.ref.png | Bin 0 -> 330 bytes + ...rn-scale-down-extend-repeat.traps.rgb24.ref.png | Bin 0 -> 330 bytes + ...surface-pattern-scale-down.traps.argb32.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-down.traps.rgb24.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-up.traps.argb32.ref.png | Bin 0 -> 4020 bytes + .../surface-pattern-scale-up.traps.rgb24.ref.png | Bin 0 -> 4020 bytes + .../reference/surface-pattern.traps.argb32.ref.png | Bin 0 -> 11088 bytes + test/reference/surface-pattern.traps.rgb24.ref.png | Bin 0 -> 11088 bytes + .../svg-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + .../svg-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + .../text-antialias-gray.traps.argb32.ref.png | Bin 0 -> 975 bytes + .../text-antialias-gray.traps.rgb24.ref.png | Bin 0 -> 975 bytes + .../text-antialias-none.traps.argb32.ref.png | Bin 0 -> 265 bytes + .../text-antialias-none.traps.rgb24.ref.png | Bin 0 -> 265 bytes + .../text-antialias-subpixel.traps.argb32.ref.png | Bin 0 -> 1004 bytes + .../text-antialias-subpixel.traps.rgb24.ref.png | Bin 0 -> 1004 bytes + .../text-glyph-range.traps.argb32.ref.png | Bin 0 -> 1991 bytes + .../reference/text-glyph-range.traps.rgb24.ref.png | Bin 0 -> 1991 bytes + test/reference/text-pattern.traps.argb32.ref.png | Bin 0 -> 1695 bytes + test/reference/text-pattern.traps.rgb24.ref.png | Bin 0 -> 1397 bytes + test/reference/text-rotate.traps.argb32.ref.png | Bin 0 -> 16599 bytes + test/reference/text-rotate.traps.rgb24.ref.png | Bin 0 -> 16599 bytes + test/reference/text-transform.traps.argb32.ref.png | Bin 0 -> 5579 bytes + test/reference/text-transform.traps.rgb24.ref.png | Bin 0 -> 5579 bytes + test/reference/tiger.traps.argb32.ref.png | Bin 0 -> 94370 bytes + test/reference/tiger.traps.rgb24.ref.png | Bin 0 -> 94370 bytes + test/reference/tighten-bounds.traps.argb32.ref.png | Bin 0 -> 8769 bytes + test/reference/transforms.traps.argb32.ref.png | Bin 0 -> 299 bytes + test/reference/transforms.traps.rgb24.ref.png | Bin 0 -> 299 bytes + .../translate-show-surface.traps.argb32.ref.png | Bin 0 -> 96 bytes + .../translate-show-surface.traps.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/trap-clip.traps.argb32.ref.png | Bin 0 -> 5755 bytes + test/reference/trap-clip.traps.rgb24.ref.png | Bin 0 -> 5379 bytes + .../twin-antialias-gray.traps.argb32.ref.png | Bin 0 -> 4053 bytes + .../twin-antialias-gray.traps.rgb24.ref.png | Bin 0 -> 4053 bytes + .../twin-antialias-mixed.traps.argb32.ref.png | Bin 0 -> 1639 bytes + .../twin-antialias-mixed.traps.rgb24.ref.png | Bin 0 -> 1639 bytes + .../twin-antialias-none.traps.argb32.ref.png | Bin 0 -> 747 bytes + .../twin-antialias-none.traps.rgb24.ref.png | Bin 0 -> 747 bytes + .../twin-antialias-subpixel.traps.argb32.ref.png | Bin 0 -> 4053 bytes + .../twin-antialias-subpixel.traps.rgb24.ref.png | Bin 0 -> 4053 bytes + test/reference/twin.traps.argb32.ref.png | Bin 0 -> 4053 bytes + test/reference/twin.traps.rgb24.ref.png | Bin 0 -> 4053 bytes + test/reference/unaligned-box.traps.argb32.ref.png | Bin 0 -> 526 bytes + test/reference/unaligned-box.traps.rgb24.ref.png | Bin 0 -> 526 bytes + .../unantialiased-shapes.traps.argb32.ref.png | Bin 0 -> 3977 bytes + .../unantialiased-shapes.traps.rgb24.ref.png | Bin 0 -> 3977 bytes + .../unbounded-operator.traps.argb32.ref.png | Bin 0 -> 2640 bytes + .../unbounded-operator.traps.rgb24.ref.png | Bin 0 -> 1254 bytes + .../unclosed-strokes.traps.argb32.ref.png | Bin 0 -> 1482 bytes + .../reference/unclosed-strokes.traps.rgb24.ref.png | Bin 0 -> 1482 bytes + test/reference/user-font-mask.traps.argb32.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-mask.traps.rgb24.ref.png | Bin 0 -> 5476 bytes + .../reference/user-font-proxy.traps.argb32.ref.png | Bin 0 -> 16798 bytes + test/reference/user-font-proxy.traps.rgb24.ref.png | Bin 0 -> 16798 bytes + .../user-font-rescale.traps.argb32.ref.png | Bin 0 -> 14852 bytes + .../user-font-rescale.traps.rgb24.ref.png | Bin 0 -> 14852 bytes + test/reference/user-font.traps.argb32.ref.png | Bin 0 -> 5439 bytes + test/reference/user-font.traps.rgb24.ref.png | Bin 0 -> 5439 bytes + test/reference/white-in-noop.traps.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/white-in-noop.traps.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/world-map-fill.traps.argb32.ref.png | Bin 0 -> 57451 bytes + test/reference/world-map-fill.traps.rgb24.ref.png | Bin 0 -> 57451 bytes + .../world-map-stroke.traps.argb32.ref.png | Bin 0 -> 65217 bytes + .../reference/world-map-stroke.traps.rgb24.ref.png | Bin 0 -> 65217 bytes + test/reference/world-map.traps.argb32.ref.png | Bin 0 -> 70536 bytes + test/reference/world-map.traps.rgb24.ref.png | Bin 0 -> 70536 bytes + .../xcb-huge-image-shm.traps.argb32.ref.png | Bin 0 -> 97 bytes + .../xcb-huge-image-shm.traps.rgb24.ref.png | Bin 0 -> 97 bytes + .../xcb-snapshot-assert.traps.argb32.ref.png | Bin 0 -> 97 bytes + .../xcb-snapshot-assert.traps.rgb24.ref.png | Bin 0 -> 97 bytes + .../xcb-stress-cache.traps.argb32.ref.png | Bin 0 -> 97 bytes + .../reference/xcb-stress-cache.traps.rgb24.ref.png | Bin 0 -> 97 bytes + .../xcb-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + .../xcb-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + .../xcomposite-projection.traps.argb32.ref.png | Bin 0 -> 1112 bytes + .../xcomposite-projection.traps.rgb24.ref.png | Bin 0 -> 1112 bytes + .../xlib-expose-event.traps.argb32.ref.png | Bin 0 -> 40717 bytes + .../xlib-expose-event.traps.rgb24.ref.png | Bin 0 -> 40717 bytes + .../xlib-surface-source.traps.argb32.ref.png | Bin 0 -> 377 bytes + .../xlib-surface-source.traps.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/zero-alpha.traps.argb32.ref.png | Bin 0 -> 91 bytes + test/reference/zero-alpha.traps.rgb24.ref.png | Bin 0 -> 91 bytes + test/reference/zero-mask.traps.argb32.ref.png | Bin 0 -> 402 bytes + test/reference/zero-mask.traps.rgb24.ref.png | Bin 0 -> 382 bytes + 783 files changed, 786 insertions(+), 9 deletions(-) + +commit 62e1ded35c4d8d3139152661afea61b628152d47 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 17:10:43 2011 +0100 + + test: Update couple of refs for the improved mono rasteriser + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/reference/hatchings.ref.png | Bin 45398 -> 44151 bytes + test/reference/twin-antialias-none.ref.png | Bin 747 -> 694 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit e5d890e1ea5c3b0ec68126ecde4b957a924bc165 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 17:06:51 2011 +0100 + + test: Update refernece dir for create-from-png-stream + + It tries to load its reference image and fails because I moved it. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/create-from-png-stream.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8e827e2cbbd6920d0c2bbd87e7e40a265ac5dba1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 17:02:12 2011 +0100 + + test: Record the failure of recent freetype libraries for type1 vertical layout + + test/Makefile.refs | 1 + + test/reference/ft-text-vertical-layout-type1.xfail.png | Bin 0 -> 2683 bytes + 2 files changed, 1 insertion(+) + +commit 36dc0971eaf3bf5d6cdbd826a5f92988031a3074 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 16:59:33 2011 +0100 + + test: refresh clip-operator ref.png + + test/Makefile.refs | 2 +- + test/reference/clip-operator.argb32.ref.png | Bin 0 -> 8210 bytes + test/reference/clip-operator.ref.png | Bin 8126 -> 0 bytes + 3 files changed, 1 insertion(+), 1 deletion(-) + +commit af6ee4e82e912eec5ae0e20ed54a868d1abe98d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 16:57:52 2011 +0100 + + image: Invert recording matrix before replay + + Hmm, still not quite right but an improvement. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-source.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 9bf21c74aea1110091c9c9edec8d2d0a40e3453d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 15:55:52 2011 +0100 + + check: Make the newly added privates pass make check + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-backend-private.h | 3 +++ + src/test-compositor-surface-private.h | 3 +++ + 2 files changed, 6 insertions(+) + +commit d4c59d6a8c87e02807dc9ac52a59a873daa4671c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 15:50:29 2011 +0100 + + build: Another missing private.h + + src/Makefile.sources | 1 + + 1 file changed, 1 insertion(+) + +commit ca95e37412f7bc3a4293d24eac2f573c64e6d658 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 15:35:14 2011 +0100 + + build: Add missing cairo-surface-backend-private.h to sources + + src/Makefile.sources | 1 + + 1 file changed, 1 insertion(+) + +commit e6e672387135bb13cf166827a7e1ce281dc30fe7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 15:27:59 2011 +0100 + + test: Fix reference image for unbounded operator + + Comparing against the baseline reference highlights the error in the + previous ref.png. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 +- + test/reference/unbounded-operator.argb32.ref.png | Bin 0 -> 2618 bytes + test/reference/unbounded-operator.ref.png | Bin 2777 -> 0 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 1341 -> 1223 bytes + 4 files changed, 1 insertion(+), 1 deletion(-) + +commit f2a49e93299d89ec5734858fa9fc6d8668c0211e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 15:23:41 2011 +0100 + + script: Tag the similar surface rather than snapshot + + As we discard the snapshot immediately upon drawing to it, it serves no + purpose. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 1b2709d8c0933af254372c9b0d4fa5c011ef4586 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 15:09:24 2011 +0100 + + composite: Reduce an unaligned clip + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit c0016e6ac9ca1382a7861d67f752dea9d66935de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 14:56:17 2011 +0100 + + test: Mark some more raster-only tests + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/bug-40410.c | 2 +- + test/clip-fill-rule.c | 2 +- + test/rectilinear-grid.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit a349564e3c4ef179cb65671aa389fc8e1b514305 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 15 16:15:23 2011 +0200 + + Revert "xcb: Error on 0x0 source surfaces" + + This reverts commit 8f8149a2073e1e290b6f854595caaf27bd16a80b. + + src/cairo-xcb-surface-render.c | 5 ----- + 1 file changed, 5 deletions(-) + +commit c00e4c66714d72a524dd14e5f66add4ecc77e8fe +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 15 10:42:33 2011 +0200 + + Tee: compile fix for recent compositor API + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-tee-surface.c | 21 +++++---------------- + 1 file changed, 5 insertions(+), 16 deletions(-) + +commit 088d483043c67f0ee7795749f40a32015f4838b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 14:50:11 2011 +0100 + + ps: Check earlier for a supported mask + + Fixes crash in fill-and-stroke-alpha. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ps-surface.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 13bd9592d8d22fd1ad6fd2b8c6ef1e8f4c810845 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 14:28:53 2011 +0100 + + ps: Fix return value for mask_supported and ps2 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ps-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5f8ee79b40483bc93b448f9dbfc241d3090cb07c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 14:07:00 2011 +0100 + + test: Write the individual test logs to output/ + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 2 +- + test/cairo-test-private.h | 3 ++- + test/cairo-test-runner.c | 2 +- + test/cairo-test.c | 21 ++++++++++++--------- + test/cairo-test.h | 1 + + test/testtable.js | 6 +++--- + 6 files changed, 20 insertions(+), 15 deletions(-) + +commit 768d39f034f47679492abfeaf6f5cf2ec9929c13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 14:05:10 2011 +0100 + + test: Move all the reference images to their own directory + + With over two thousand references images now, it is starting to make the + test directory look cluttered! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4444 ++++++++++---------- + test/a1-bug.base.argb32.ref.png | Bin 3362 -> 0 bytes + test/a1-bug.base.rgb24.ref.png | Bin 3362 -> 0 bytes + test/a1-bug.image16.ref.png | Bin 3329 -> 0 bytes + test/a1-bug.quartz.xfail.png | Bin 3195 -> 0 bytes + test/a1-bug.ref.png | Bin 3220 -> 0 bytes + test/a1-bug.xlib.ref.png | Bin 3362 -> 0 bytes + test/a1-clip-fill-equal.base.argb32.ref.png | Bin 120 -> 0 bytes + test/a1-clip-fill-equal.base.rgb24.ref.png | Bin 120 -> 0 bytes + test/a1-clip-fill-equal.ref.png | Bin 120 -> 0 bytes + test/a1-clip-fill-rule.argb32.ref.png | Bin 236 -> 0 bytes + test/a1-clip-fill-rule.base.argb32.ref.png | Bin 236 -> 0 bytes + test/a1-clip-fill-rule.base.rgb24.ref.png | Bin 218 -> 0 bytes + test/a1-clip-fill-rule.rgb24.ref.png | Bin 218 -> 0 bytes + test/a1-clip-fill.base.argb32.ref.png | Bin 120 -> 0 bytes + test/a1-clip-fill.base.rgb24.ref.png | Bin 120 -> 0 bytes + test/a1-clip-fill.ref.png | Bin 120 -> 0 bytes + test/a1-clip-paint.base.argb32.ref.png | Bin 120 -> 0 bytes + test/a1-clip-paint.base.rgb24.ref.png | Bin 120 -> 0 bytes + test/a1-clip-paint.ref.png | Bin 120 -> 0 bytes + test/a1-clip-stroke.base.argb32.ref.png | Bin 120 -> 0 bytes + test/a1-clip-stroke.base.rgb24.ref.png | Bin 120 -> 0 bytes + test/a1-clip-stroke.ref.png | Bin 120 -> 0 bytes + test/a1-image-sample.base.argb32.ref.png | Bin 122 -> 0 bytes + test/a1-image-sample.base.rgb24.ref.png | Bin 122 -> 0 bytes + test/a1-image-sample.gl.xfail.png | Bin 120 -> 0 bytes + test/a1-image-sample.ref.png | Bin 148 -> 0 bytes + test/a1-line-width.base.argb32.ref.png | Bin 154 -> 0 bytes + test/a1-line-width.base.rgb24.ref.png | Bin 154 -> 0 bytes + test/a1-line-width.pdf.ref.png | Bin 177 -> 0 bytes + test/a1-line-width.ps.ref.png | Bin 179 -> 0 bytes + test/a1-line-width.ref.png | Bin 154 -> 0 bytes + test/a1-mask-sample.base.argb32.ref.png | Bin 122 -> 0 bytes + test/a1-mask-sample.base.rgb24.ref.png | Bin 122 -> 0 bytes + test/a1-mask-sample.ref.png | Bin 148 -> 0 bytes + test/a1-mask.base.argb32.ref.png | Bin 106 -> 0 bytes + test/a1-mask.base.rgb24.ref.png | Bin 106 -> 0 bytes + test/a1-mask.pdf.ref.png | Bin 106 -> 0 bytes + test/a1-mask.ps.ref.png | Bin 106 -> 0 bytes + test/a1-mask.ref.png | Bin 131 -> 0 bytes + ...a1-rasterisation-rectangles.base.argb32.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-rectangles.base.rgb24.ref.png | Bin 1729 -> 0 bytes + test/a1-rasterisation-rectangles.quartz.xfail.png | Bin 2583 -> 0 bytes + test/a1-rasterisation-rectangles.ref.png | Bin 1729 -> 0 bytes + .../a1-rasterisation-triangles.base.argb32.ref.png | Bin 1729 -> 0 bytes + test/a1-rasterisation-triangles.base.rgb24.ref.png | Bin 1729 -> 0 bytes + test/a1-rasterisation-triangles.quartz.xfail.png | Bin 2583 -> 0 bytes + test/a1-rasterisation-triangles.ref.png | Bin 1729 -> 0 bytes + test/a1-rectilinear-grid.base.argb32.ref.png | Bin 207 -> 0 bytes + test/a1-rectilinear-grid.base.rgb24.ref.png | Bin 207 -> 0 bytes + test/a1-rectilinear-grid.ref.png | Bin 207 -> 0 bytes + test/a1-sample.base.argb32.ref.png | Bin 786 -> 0 bytes + test/a1-sample.base.rgb24.ref.png | Bin 786 -> 0 bytes + test/a1-sample.ref.png | Bin 786 -> 0 bytes + test/a1-tiger.base.argb32.ref.png | Bin 20406 -> 0 bytes + test/a1-tiger.base.rgb24.ref.png | Bin 20406 -> 0 bytes + test/a1-tiger.ref.png | Bin 20330 -> 0 bytes + test/a1-traps-sample.base.argb32.ref.png | Bin 120 -> 0 bytes + test/a1-traps-sample.base.rgb24.ref.png | Bin 120 -> 0 bytes + test/a1-traps-sample.quartz.xfail.png | Bin 122 -> 0 bytes + test/a1-traps-sample.ref.png | Bin 120 -> 0 bytes + test/a8-clear.base.argb32.ref.png | Bin 248 -> 0 bytes + test/a8-clear.base.rgb24.ref.png | Bin 248 -> 0 bytes + test/a8-clear.quartz.ref.png | Bin 244 -> 0 bytes + test/a8-clear.ref.png | Bin 272 -> 0 bytes + test/a8-mask.base.argb32.ref.png | Bin 103 -> 0 bytes + test/a8-mask.base.rgb24.ref.png | Bin 103 -> 0 bytes + test/a8-mask.ref.png | Bin 128 -> 0 bytes + test/aliasing.base.argb32.ref.png | Bin 103722 -> 0 bytes + test/aliasing.base.rgb24.ref.png | Bin 103722 -> 0 bytes + test/aliasing.image16.ref.png | Bin 97251 -> 0 bytes + test/aliasing.quartz.ref.png | Bin 108801 -> 0 bytes + test/aliasing.ref.png | Bin 76314 -> 0 bytes + test/aliasing.xlib.ref.png | Bin 104315 -> 0 bytes + test/alpha-similar.base.argb32.ref.png | Bin 99 -> 0 bytes + test/alpha-similar.base.rgb24.ref.png | Bin 88 -> 0 bytes + test/alpha-similar.gl.argb32.xfail.png | Bin 99 -> 0 bytes + test/alpha-similar.gl.rgb24.xfail.png | Bin 93 -> 0 bytes + test/alpha-similar.pdf.argb32.xfail.png | Bin 95 -> 0 bytes + test/alpha-similar.pdf.rgb24.xfail.png | Bin 93 -> 0 bytes + test/alpha-similar.ps.argb32.xfail.png | Bin 95 -> 0 bytes + test/alpha-similar.ps.rgb24.xfail.png | Bin 93 -> 0 bytes + test/alpha-similar.ref.png | Bin 99 -> 0 bytes + test/alpha-similar.rgb24.ref.png | Bin 99 -> 0 bytes + test/alpha-similar.svg.argb32.xfail.png | Bin 99 -> 0 bytes + test/alpha-similar.svg.rgb24.xfail.png | Bin 95 -> 0 bytes + test/api-special-cases.base.argb32.ref.png | Bin 95 -> 0 bytes + test/api-special-cases.base.rgb24.ref.png | Bin 95 -> 0 bytes + test/api-special-cases.ref.png | Bin 95 -> 0 bytes + test/arc-infinite-loop.base.argb32.ref.png | Bin 96 -> 0 bytes + test/arc-infinite-loop.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/arc-infinite-loop.ref.png | Bin 96 -> 0 bytes + test/arc-looping-dash.base.argb32.ref.png | Bin 470 -> 0 bytes + test/arc-looping-dash.base.rgb24.ref.png | Bin 470 -> 0 bytes + test/arc-looping-dash.image16.ref.png | Bin 450 -> 0 bytes + test/arc-looping-dash.ps.ref.png | Bin 377 -> 0 bytes + test/arc-looping-dash.quartz.ref.png | Bin 470 -> 0 bytes + test/arc-looping-dash.ref.png | Bin 348 -> 0 bytes + test/big-empty-box.argb32.ref.png | Bin 111 -> 0 bytes + test/big-empty-box.base.argb32.ref.png | Bin 111 -> 0 bytes + test/big-empty-box.base.rgb24.ref.png | Bin 108 -> 0 bytes + test/big-empty-box.rgb24.ref.png | Bin 108 -> 0 bytes + test/big-empty-triangle.argb32.ref.png | Bin 111 -> 0 bytes + test/big-empty-triangle.base.argb32.ref.png | Bin 111 -> 0 bytes + test/big-empty-triangle.base.rgb24.ref.png | Bin 108 -> 0 bytes + test/big-empty-triangle.rgb24.ref.png | Bin 108 -> 0 bytes + test/big-line.base.argb32.ref.png | Bin 933 -> 0 bytes + test/big-line.base.rgb24.ref.png | Bin 933 -> 0 bytes + test/big-line.image16.ref.png | Bin 988 -> 0 bytes + test/big-line.ps.ref.png | Bin 946 -> 0 bytes + test/big-line.quartz.ref.png | Bin 993 -> 0 bytes + test/big-line.ref.png | Bin 897 -> 0 bytes + test/big-line.xlib.ref.png | Bin 933 -> 0 bytes + test/big-little-box.argb32.ref.png | Bin 169 -> 0 bytes + test/big-little-box.base.argb32.ref.png | Bin 169 -> 0 bytes + test/big-little-box.base.rgb24.ref.png | Bin 160 -> 0 bytes + test/big-little-box.rgb24.ref.png | Bin 160 -> 0 bytes + test/big-little-triangle.argb32.ref.png | Bin 408 -> 0 bytes + test/big-little-triangle.base.argb32.ref.png | Bin 399 -> 0 bytes + test/big-little-triangle.base.rgb24.ref.png | Bin 320 -> 0 bytes + test/big-little-triangle.rgb24.ref.png | Bin 324 -> 0 bytes + test/big-trap.base.argb32.ref.png | Bin 319 -> 0 bytes + test/big-trap.base.rgb24.ref.png | Bin 319 -> 0 bytes + test/bilevel-image.base.argb32.ref.png | Bin 105 -> 0 bytes + test/bilevel-image.base.rgb24.ref.png | Bin 105 -> 0 bytes + test/bilevel-image.ref.png | Bin 131 -> 0 bytes + test/bitmap-font.base.argb32.ref.png | Bin 931 -> 0 bytes + test/bitmap-font.base.rgb24.ref.png | Bin 871 -> 0 bytes + test/bitmap-font.ref.png | Bin 950 -> 0 bytes + test/bitmap-font.rgb24.ref.png | Bin 890 -> 0 bytes + test/bug-40410.base.argb32.ref.png | Bin 428 -> 0 bytes + test/bug-40410.base.rgb24.ref.png | Bin 428 -> 0 bytes + test/bug-40410.ref.png | Bin 428 -> 0 bytes + test/bug-bo-rectangular.base.argb32.ref.png | Bin 950 -> 0 bytes + test/bug-bo-rectangular.base.rgb24.ref.png | Bin 950 -> 0 bytes + test/bug-bo-rectangular.image16.ref.png | Bin 955 -> 0 bytes + test/bug-bo-rectangular.ps.xfail.png | Bin 945 -> 0 bytes + test/bug-bo-rectangular.ref.png | Bin 950 -> 0 bytes + test/bug-extents.base.argb32.ref.png | Bin 9250 -> 0 bytes + test/bug-extents.base.rgb24.ref.png | Bin 9250 -> 0 bytes + test/bug-extents.image16.ref.png | Bin 7576 -> 0 bytes + test/bug-extents.ps.ref.png | Bin 5844 -> 0 bytes + test/bug-extents.quartz.ref.png | Bin 9310 -> 0 bytes + test/bug-extents.ref.png | Bin 6364 -> 0 bytes + test/bug-extents.xlib.ref.png | Bin 9234 -> 0 bytes + test/bug-seams.base.argb32.ref.png | Bin 1606 -> 0 bytes + test/bug-seams.base.rgb24.ref.png | Bin 1606 -> 0 bytes + test/bug-seams.ref.png | Bin 1364 -> 0 bytes + test/bug-seams.xlib-fallback.ref.png | Bin 2133 -> 0 bytes + test/bug-seams.xlib.ref.png | Bin 1606 -> 0 bytes + test/cairo-test.c | 12 +- + test/caps-joins-alpha.base.argb32.ref.png | Bin 2278 -> 0 bytes + test/caps-joins-alpha.base.rgb24.ref.png | Bin 2278 -> 0 bytes + test/caps-joins-alpha.image16.ref.png | Bin 2268 -> 0 bytes + test/caps-joins-alpha.quartz.ref.png | Bin 2466 -> 0 bytes + test/caps-joins-alpha.ref.png | Bin 2345 -> 0 bytes + test/caps-joins-alpha.xlib.ref.png | Bin 2278 -> 0 bytes + test/caps-joins-curve.base.argb32.ref.png | Bin 5368 -> 0 bytes + test/caps-joins-curve.base.rgb24.ref.png | Bin 5368 -> 0 bytes + test/caps-joins-curve.image16.ref.png | Bin 4928 -> 0 bytes + test/caps-joins-curve.ps.ref.png | Bin 3715 -> 0 bytes + test/caps-joins-curve.quartz.ref.png | Bin 5199 -> 0 bytes + test/caps-joins-curve.ref.png | Bin 4527 -> 0 bytes + test/caps-joins-curve.xlib.ref.png | Bin 5126 -> 0 bytes + test/caps-joins.base.argb32.ref.png | Bin 2374 -> 0 bytes + test/caps-joins.base.rgb24.ref.png | Bin 2374 -> 0 bytes + test/caps-joins.image16.ref.png | Bin 2587 -> 0 bytes + test/caps-joins.ps.ref.png | Bin 2268 -> 0 bytes + test/caps-joins.ref.png | Bin 2621 -> 0 bytes + test/caps-sub-paths.base.argb32.ref.png | Bin 166 -> 0 bytes + test/caps-sub-paths.base.rgb24.ref.png | Bin 166 -> 0 bytes + test/caps-sub-paths.image16.ref.png | Bin 171 -> 0 bytes + test/caps-sub-paths.ps.ref.png | Bin 163 -> 0 bytes + test/caps-sub-paths.ref.png | Bin 176 -> 0 bytes + test/caps-tails-curve.base.argb32.ref.png | Bin 50228 -> 0 bytes + test/caps-tails-curve.base.rgb24.ref.png | Bin 50228 -> 0 bytes + test/caps-tails-curve.ps.ref.png | Bin 39753 -> 0 bytes + test/caps-tails-curve.ref.png | Bin 41476 -> 0 bytes + test/caps.base.argb32.ref.png | Bin 1601 -> 0 bytes + test/caps.base.rgb24.ref.png | Bin 1601 -> 0 bytes + test/caps.image16.ref.png | Bin 1936 -> 0 bytes + test/caps.ps.ref.png | Bin 1478 -> 0 bytes + test/caps.ref.png | Bin 1687 -> 0 bytes + test/checkerboard.base.argb32.ref.png | Bin 142 -> 0 bytes + test/checkerboard.base.rgb24.ref.png | Bin 142 -> 0 bytes + test/checkerboard.ref.png | Bin 142 -> 0 bytes + test/clear-source.base.argb32.ref.png | Bin 779 -> 0 bytes + test/clear-source.base.rgb24.ref.png | Bin 779 -> 0 bytes + test/clear-source.image16.ref.png | Bin 909 -> 0 bytes + test/clear-source.pdf.xfail.png | Bin 974 -> 0 bytes + test/clear-source.ps.xfail.png | Bin 552 -> 0 bytes + test/clear-source.ref.png | Bin 779 -> 0 bytes + test/clear.argb32.ref.png | Bin 539 -> 0 bytes + test/clear.base.argb32.ref.png | Bin 673 -> 0 bytes + test/clear.base.rgb24.ref.png | Bin 614 -> 0 bytes + test/clear.pdf.argb32.ref.png | Bin 790 -> 0 bytes + test/clear.ps.argb32.ref.png | Bin 790 -> 0 bytes + test/clear.quartz.argb32.ref.png | Bin 691 -> 0 bytes + test/clear.quartz.rgb24.ref.png | Bin 606 -> 0 bytes + test/clear.rgb24.ref.png | Bin 484 -> 0 bytes + test/clear.svg12.argb32.xfail.png | Bin 170 -> 0 bytes + test/clear.svg12.rgb24.xfail.png | Bin 170 -> 0 bytes + test/clip-all.base.argb32.ref.png | Bin 95 -> 0 bytes + test/clip-all.base.rgb24.ref.png | Bin 95 -> 0 bytes + test/clip-all.ref.png | Bin 118 -> 0 bytes + test/clip-complex-shape-eo-aa.base.argb32.ref.png | Bin 325 -> 0 bytes + test/clip-complex-shape-eo-aa.base.rgb24.ref.png | Bin 325 -> 0 bytes + test/clip-complex-shape-eo-aa.ref.png | Bin 349 -> 0 bytes + .../clip-complex-shape-eo-mono.base.argb32.ref.png | Bin 325 -> 0 bytes + test/clip-complex-shape-eo-mono.base.rgb24.ref.png | Bin 325 -> 0 bytes + test/clip-complex-shape-eo-mono.ref.png | Bin 349 -> 0 bytes + test/clip-contexts.base.argb32.ref.png | Bin 98 -> 0 bytes + test/clip-contexts.base.rgb24.ref.png | Bin 98 -> 0 bytes + test/clip-contexts.ref.png | Bin 98 -> 0 bytes + test/clip-device-offset.argb32.ref.png | Bin 175 -> 0 bytes + test/clip-device-offset.base.argb32.ref.png | Bin 175 -> 0 bytes + test/clip-device-offset.base.rgb24.ref.png | Bin 168 -> 0 bytes + test/clip-device-offset.rgb24.ref.png | Bin 168 -> 0 bytes + test/clip-disjoint-hatching.base.argb32.ref.png | Bin 8021 -> 0 bytes + test/clip-disjoint-hatching.base.rgb24.ref.png | Bin 8021 -> 0 bytes + test/clip-disjoint-hatching.ref.png | Bin 4390 -> 0 bytes + test/clip-disjoint.base.argb32.ref.png | Bin 5411 -> 0 bytes + test/clip-disjoint.base.rgb24.ref.png | Bin 5411 -> 0 bytes + test/clip-disjoint.image16.ref.png | Bin 3886 -> 0 bytes + test/clip-disjoint.ps.ref.png | Bin 4037 -> 0 bytes + test/clip-disjoint.quartz.ref.png | Bin 5476 -> 0 bytes + test/clip-disjoint.ref.png | Bin 3934 -> 0 bytes + test/clip-disjoint.xlib.ref.png | Bin 5395 -> 0 bytes + test/clip-empty-group.base.argb32.ref.png | Bin 103 -> 0 bytes + test/clip-empty-group.base.rgb24.ref.png | Bin 103 -> 0 bytes + test/clip-empty-group.ref.png | Bin 103 -> 0 bytes + test/clip-empty-save.base.argb32.ref.png | Bin 95 -> 0 bytes + test/clip-empty-save.base.rgb24.ref.png | Bin 95 -> 0 bytes + test/clip-empty-save.ref.png | Bin 118 -> 0 bytes + test/clip-empty.base.argb32.ref.png | Bin 95 -> 0 bytes + test/clip-empty.base.rgb24.ref.png | Bin 95 -> 0 bytes + test/clip-empty.ref.png | Bin 118 -> 0 bytes + test/clip-fill-eo-unbounded.argb32.ref.png | Bin 3970 -> 0 bytes + test/clip-fill-eo-unbounded.base.argb32.ref.png | Bin 3693 -> 0 bytes + test/clip-fill-eo-unbounded.base.rgb24.ref.png | Bin 3198 -> 0 bytes + test/clip-fill-eo-unbounded.image16.ref.png | Bin 2887 -> 0 bytes + test/clip-fill-eo-unbounded.quartz.argb32.ref.png | Bin 3382 -> 0 bytes + test/clip-fill-eo-unbounded.quartz.rgb24.ref.png | Bin 2941 -> 0 bytes + test/clip-fill-eo-unbounded.rgb24.ref.png | Bin 3201 -> 0 bytes + test/clip-fill-eo-unbounded.svg12.rgb24.xfail.png | Bin 3636 -> 0 bytes + ...p-fill-eo-unbounded.xlib-fallback.rgb24.ref.png | Bin 3208 -> 0 bytes + test/clip-fill-eo-unbounded.xlib.argb32.ref.png | Bin 3693 -> 0 bytes + test/clip-fill-eo-unbounded.xlib.rgb24.ref.png | Bin 3198 -> 0 bytes + test/clip-fill-no-op.base.argb32.ref.png | Bin 152 -> 0 bytes + test/clip-fill-no-op.base.rgb24.ref.png | Bin 152 -> 0 bytes + test/clip-fill-no-op.image16.ref.png | Bin 153 -> 0 bytes + test/clip-fill-no-op.ref.png | Bin 152 -> 0 bytes + test/clip-fill-nz-unbounded.argb32.ref.png | Bin 3970 -> 0 bytes + test/clip-fill-nz-unbounded.base.argb32.ref.png | Bin 3693 -> 0 bytes + test/clip-fill-nz-unbounded.base.rgb24.ref.png | Bin 3198 -> 0 bytes + test/clip-fill-nz-unbounded.image16.ref.png | Bin 2887 -> 0 bytes + test/clip-fill-nz-unbounded.quartz.argb32.ref.png | Bin 3382 -> 0 bytes + test/clip-fill-nz-unbounded.quartz.rgb24.ref.png | Bin 2941 -> 0 bytes + test/clip-fill-nz-unbounded.rgb24.ref.png | Bin 3201 -> 0 bytes + test/clip-fill-nz-unbounded.svg12.rgb24.xfail.png | Bin 3636 -> 0 bytes + ...p-fill-nz-unbounded.xlib-fallback.rgb24.ref.png | Bin 3208 -> 0 bytes + test/clip-fill-nz-unbounded.xlib.argb32.ref.png | Bin 3693 -> 0 bytes + test/clip-fill-nz-unbounded.xlib.rgb24.ref.png | Bin 3198 -> 0 bytes + ...lip-fill-rule-pixel-aligned.base.argb32.ref.png | Bin 176 -> 0 bytes + ...clip-fill-rule-pixel-aligned.base.rgb24.ref.png | Bin 165 -> 0 bytes + test/clip-fill-rule-pixel-aligned.ref.png | Bin 195 -> 0 bytes + test/clip-fill-rule-pixel-aligned.rgb24.ref.png | Bin 184 -> 0 bytes + test/clip-fill-rule.argb32.ref.png | Bin 371 -> 0 bytes + test/clip-fill-rule.base.argb32.ref.png | Bin 412 -> 0 bytes + test/clip-fill-rule.base.rgb24.ref.png | Bin 361 -> 0 bytes + test/clip-fill-rule.image16.ref.png | Bin 356 -> 0 bytes + test/clip-fill-rule.pdf.argb32.ref.png | Bin 509 -> 0 bytes + test/clip-fill-rule.ps.argb32.ref.png | Bin 251 -> 0 bytes + test/clip-fill-rule.ps.rgb24.ref.png | Bin 234 -> 0 bytes + test/clip-fill-rule.quartz.rgb24.ref.png | Bin 363 -> 0 bytes + test/clip-fill-rule.rgb24.ref.png | Bin 338 -> 0 bytes + test/clip-fill-rule.test-paginated.rgb24.ref.png | Bin 361 -> 0 bytes + test/clip-fill-rule.xlib.rgb24.ref.png | Bin 380 -> 0 bytes + test/clip-fill.base.argb32.ref.png | Bin 1049 -> 0 bytes + test/clip-fill.base.rgb24.ref.png | Bin 1049 -> 0 bytes + test/clip-fill.image16.ref.png | Bin 904 -> 0 bytes + test/clip-fill.ps.xfail.png | Bin 522 -> 0 bytes + test/clip-fill.quartz.ref.png | Bin 875 -> 0 bytes + test/clip-fill.ref.png | Bin 836 -> 0 bytes + test/clip-fill.xlib-fallback.ref.png | Bin 1063 -> 0 bytes + test/clip-fill.xlib.ref.png | Bin 1049 -> 0 bytes + ...p-shapes-aligned-rectangles.base.argb32.ref.png | Bin 378 -> 0 bytes + ...up-shapes-aligned-rectangles.base.rgb24.ref.png | Bin 378 -> 0 bytes + test/clip-group-shapes-aligned-rectangles.ref.png | Bin 378 -> 0 bytes + test/clip-group-shapes-circles.base.argb32.ref.png | Bin 1534 -> 0 bytes + test/clip-group-shapes-circles.base.rgb24.ref.png | Bin 1534 -> 0 bytes + test/clip-group-shapes-circles.ps.ref.png | Bin 678 -> 0 bytes + test/clip-group-shapes-circles.quartz.ref.png | Bin 1518 -> 0 bytes + test/clip-group-shapes-circles.ref.png | Bin 1180 -> 0 bytes + test/clip-group-shapes-circles.xlib.ref.png | Bin 1534 -> 0 bytes + ...shapes-unaligned-rectangles.base.argb32.ref.png | Bin 431 -> 0 bytes + ...-shapes-unaligned-rectangles.base.rgb24.ref.png | Bin 431 -> 0 bytes + .../clip-group-shapes-unaligned-rectangles.ref.png | Bin 415 -> 0 bytes + ...-group-shapes-unaligned-rectangles.xlib.ref.png | Bin 431 -> 0 bytes + test/clip-image.base.argb32.ref.png | Bin 2686 -> 0 bytes + test/clip-image.base.rgb24.ref.png | Bin 2686 -> 0 bytes + test/clip-image.image16.ref.png | Bin 2032 -> 0 bytes + test/clip-image.ps.ref.png | Bin 2498 -> 0 bytes + test/clip-image.ref.png | Bin 2679 -> 0 bytes + test/clip-intersect.base.argb32.ref.png | Bin 193 -> 0 bytes + test/clip-intersect.base.rgb24.ref.png | Bin 193 -> 0 bytes + test/clip-intersect.ref.png | Bin 201 -> 0 bytes + test/clip-mixed-antialias.base.argb32.ref.png | Bin 1094 -> 0 bytes + test/clip-mixed-antialias.base.rgb24.ref.png | Bin 1094 -> 0 bytes + test/clip-mixed-antialias.ref.png | Bin 981 -> 0 bytes + test/clip-nesting.argb32.ref.png | Bin 1072 -> 0 bytes + test/clip-nesting.base.argb32.ref.png | Bin 1031 -> 0 bytes + test/clip-nesting.base.rgb24.ref.png | Bin 936 -> 0 bytes + test/clip-nesting.pdf.argb32.ref.png | Bin 850 -> 0 bytes + test/clip-nesting.ps.argb32.ref.png | Bin 441 -> 0 bytes + test/clip-nesting.ps.rgb24.ref.png | Bin 492 -> 0 bytes + test/clip-nesting.quartz.argb32.ref.png | Bin 1048 -> 0 bytes + test/clip-nesting.quartz.rgb24.ref.png | Bin 937 -> 0 bytes + test/clip-nesting.rgb24.ref.png | Bin 949 -> 0 bytes + test/clip-nesting.test-paginated.rgb24.ref.png | Bin 936 -> 0 bytes + test/clip-nesting.xlib.rgb24.ref.png | Bin 955 -> 0 bytes + test/clip-operator.base.argb32.ref.png | Bin 8171 -> 0 bytes + test/clip-operator.base.rgb24.ref.png | Bin 3231 -> 0 bytes + test/clip-operator.gl.argb32.ref.png | Bin 8296 -> 0 bytes + test/clip-operator.image16.ref.png | Bin 3131 -> 0 bytes + test/clip-operator.pdf.argb32.ref.png | Bin 8792 -> 0 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 4683 -> 0 bytes + test/clip-operator.ps2.rgb24.ref.png | Bin 3736 -> 0 bytes + test/clip-operator.ps3.argb32.ref.png | Bin 7576 -> 0 bytes + test/clip-operator.ps3.ref.png | Bin 8188 -> 0 bytes + test/clip-operator.ps3.rgb24.ref.png | Bin 3736 -> 0 bytes + test/clip-operator.quartz.argb32.ref.png | Bin 9672 -> 0 bytes + test/clip-operator.quartz.rgb24.ref.png | Bin 4343 -> 0 bytes + test/clip-operator.ref.png | Bin 8126 -> 0 bytes + test/clip-operator.rgb24.ref.png | Bin 3244 -> 0 bytes + test/clip-operator.svg12.argb32.xfail.png | Bin 8378 -> 0 bytes + test/clip-operator.svg12.rgb24.xfail.png | Bin 4566 -> 0 bytes + test/clip-operator.test-paginated.argb32.ref.png | Bin 8189 -> 0 bytes + test/clip-operator.xlib-fallback.ref.png | Bin 3228 -> 0 bytes + test/clip-operator.xlib.ref.png | Bin 8271 -> 0 bytes + test/clip-operator.xlib.rgb24.ref.png | Bin 3258 -> 0 bytes + test/clip-push-group.base.argb32.ref.png | Bin 155 -> 0 bytes + test/clip-push-group.base.rgb24.ref.png | Bin 155 -> 0 bytes + test/clip-push-group.image16.ref.png | Bin 159 -> 0 bytes + test/clip-push-group.pdf.ref.png | Bin 164 -> 0 bytes + test/clip-push-group.ps.ref.png | Bin 120 -> 0 bytes + test/clip-push-group.quartz.ref.png | Bin 166 -> 0 bytes + test/clip-push-group.ref.png | Bin 166 -> 0 bytes + test/clip-push-group.svg.ref.png | Bin 175 -> 0 bytes + test/clip-push-group.xlib.ref.png | Bin 155 -> 0 bytes + ...-rotate-image-surface-paint.base.argb32.ref.png | Bin 202 -> 0 bytes + ...p-rotate-image-surface-paint.base.rgb24.ref.png | Bin 202 -> 0 bytes + test/clip-rotate-image-surface-paint.ref.png | Bin 202 -> 0 bytes + test/clip-shape.base.argb32.ref.png | Bin 2943 -> 0 bytes + test/clip-shape.base.rgb24.ref.png | Bin 2943 -> 0 bytes + test/clip-shape.image16.ref.png | Bin 2488 -> 0 bytes + test/clip-shape.ps.ref.png | Bin 1797 -> 0 bytes + test/clip-shape.quartz.ref.png | Bin 3229 -> 0 bytes + test/clip-shape.ref.png | Bin 2249 -> 0 bytes + test/clip-shape.xlib-fallback.ref.png | Bin 2916 -> 0 bytes + test/clip-shape.xlib.ref.png | Bin 2944 -> 0 bytes + test/clip-stroke-no-op.base.argb32.ref.png | Bin 152 -> 0 bytes + test/clip-stroke-no-op.base.rgb24.ref.png | Bin 152 -> 0 bytes + test/clip-stroke-no-op.image16.ref.png | Bin 153 -> 0 bytes + test/clip-stroke-no-op.ref.png | Bin 152 -> 0 bytes + test/clip-stroke-unbounded.argb32.ref.png | Bin 3887 -> 0 bytes + test/clip-stroke-unbounded.base.argb32.ref.png | Bin 3617 -> 0 bytes + test/clip-stroke-unbounded.base.rgb24.ref.png | Bin 3108 -> 0 bytes + test/clip-stroke-unbounded.image16.rgb24.ref.png | Bin 2778 -> 0 bytes + test/clip-stroke-unbounded.quartz.argb32.ref.png | Bin 3290 -> 0 bytes + test/clip-stroke-unbounded.quartz.rgb24.ref.png | Bin 2840 -> 0 bytes + test/clip-stroke-unbounded.rgb24.ref.png | Bin 3063 -> 0 bytes + test/clip-stroke-unbounded.svg12.rgb24.xfail.png | Bin 3569 -> 0 bytes + ...ip-stroke-unbounded.xlib-fallback.rgb24.ref.png | Bin 3123 -> 0 bytes + test/clip-stroke-unbounded.xlib.argb32.ref.png | Bin 3620 -> 0 bytes + test/clip-stroke-unbounded.xlib.rgb24.ref.png | Bin 3109 -> 0 bytes + test/clip-stroke.base.argb32.ref.png | Bin 1491 -> 0 bytes + test/clip-stroke.base.rgb24.ref.png | Bin 1491 -> 0 bytes + test/clip-stroke.image16.ref.png | Bin 1305 -> 0 bytes + test/clip-stroke.ps.xfail.png | Bin 662 -> 0 bytes + test/clip-stroke.quartz.ref.png | Bin 1305 -> 0 bytes + test/clip-stroke.ref.png | Bin 1207 -> 0 bytes + test/clip-stroke.xlib-fallback.ref.png | Bin 1491 -> 0 bytes + test/clip-stroke.xlib.ref.png | Bin 1491 -> 0 bytes + test/clip-text.base.argb32.ref.png | Bin 899 -> 0 bytes + test/clip-text.base.rgb24.ref.png | Bin 899 -> 0 bytes + test/clip-text.image16.ref.png | Bin 811 -> 0 bytes + test/clip-text.ps.xfail.png | Bin 434 -> 0 bytes + test/clip-text.quartz.ref.png | Bin 854 -> 0 bytes + test/clip-text.ref.png | Bin 796 -> 0 bytes + test/clip-text.svg.ref.png | Bin 946 -> 0 bytes + test/clip-text.xlib.ref.png | Bin 900 -> 0 bytes + test/clip-twice-rectangle.base.argb32.ref.png | Bin 323 -> 0 bytes + test/clip-twice-rectangle.base.rgb24.ref.png | Bin 323 -> 0 bytes + test/clip-twice-rectangle.ref.png | Bin 323 -> 0 bytes + test/clip-twice.argb32.ref.png | Bin 1077 -> 0 bytes + test/clip-twice.base.argb32.ref.png | Bin 1343 -> 0 bytes + test/clip-twice.base.rgb24.ref.png | Bin 1179 -> 0 bytes + test/clip-twice.image16.ref.png | Bin 1069 -> 0 bytes + test/clip-twice.pdf.argb32.ref.png | Bin 1498 -> 0 bytes + test/clip-twice.ps.argb32.ref.png | Bin 492 -> 0 bytes + test/clip-twice.ps.rgb24.ref.png | Bin 409 -> 0 bytes + test/clip-twice.quartz.argb32.ref.png | Bin 1171 -> 0 bytes + test/clip-twice.quartz.rgb24.ref.png | Bin 1095 -> 0 bytes + test/clip-twice.rgb24.ref.png | Bin 976 -> 0 bytes + test/clip-twice.test-paginated.argb32.ref.png | Bin 1361 -> 0 bytes + test/clip-twice.test-paginated.rgb24.ref.png | Bin 1199 -> 0 bytes + test/clip-twice.xlib.ref.png | Bin 1362 -> 0 bytes + test/clip-twice.xlib.rgb24.ref.png | Bin 1198 -> 0 bytes + test/clip-unbounded.base.argb32.ref.png | Bin 100 -> 0 bytes + test/clip-unbounded.base.rgb24.ref.png | Bin 97 -> 0 bytes + test/clip-unbounded.pdf.argb32.xfail.png | Bin 95 -> 0 bytes + test/clip-unbounded.pdf.rgb24.xfail.png | Bin 95 -> 0 bytes + test/clip-unbounded.ref.png | Bin 100 -> 0 bytes + test/clip-unbounded.rgb24.ref.png | Bin 97 -> 0 bytes + test/clip-unbounded.svg12.rgb24.xfail.png | Bin 100 -> 0 bytes + test/clipped-group.base.argb32.ref.png | Bin 316 -> 0 bytes + test/clipped-group.base.rgb24.ref.png | Bin 316 -> 0 bytes + test/clipped-group.image16.ref.png | Bin 270 -> 0 bytes + test/clipped-group.pdf.ref.png | Bin 334 -> 0 bytes + test/clipped-group.ps2.ref.png | Bin 214 -> 0 bytes + test/clipped-group.ps3.ref.png | Bin 214 -> 0 bytes + test/clipped-group.quartz.ref.png | Bin 308 -> 0 bytes + test/clipped-group.ref.png | Bin 289 -> 0 bytes + test/clipped-group.svg.ref.png | Bin 250 -> 0 bytes + test/clipped-group.xlib-fallback.ref.png | Bin 344 -> 0 bytes + test/clipped-group.xlib.ref.png | Bin 289 -> 0 bytes + test/clipped-surface.base.argb32.ref.png | Bin 345 -> 0 bytes + test/clipped-surface.base.rgb24.ref.png | Bin 345 -> 0 bytes + test/clipped-surface.image16.ref.png | Bin 296 -> 0 bytes + test/clipped-surface.ref.png | Bin 401 -> 0 bytes + test/clipped-trapezoids.ref.png | Bin 963 -> 0 bytes + test/close-path-current-point.base.argb32.ref.png | Bin 2008 -> 0 bytes + test/close-path-current-point.base.rgb24.ref.png | Bin 2008 -> 0 bytes + test/close-path-current-point.image16.ref.png | Bin 1804 -> 0 bytes + test/close-path-current-point.ps.ref.png | Bin 1490 -> 0 bytes + test/close-path-current-point.ref.png | Bin 1675 -> 0 bytes + test/close-path.base.argb32.ref.png | Bin 284 -> 0 bytes + test/close-path.base.rgb24.ref.png | Bin 284 -> 0 bytes + test/close-path.ps2.ref.png | Bin 309 -> 0 bytes + test/close-path.ps3.ref.png | Bin 309 -> 0 bytes + test/close-path.ref.png | Bin 271 -> 0 bytes + ...teger-translate-over-repeat.base.argb32.ref.png | Bin 334 -> 0 bytes + ...nteger-translate-over-repeat.base.rgb24.ref.png | Bin 334 -> 0 bytes + ...osite-integer-translate-over-repeat.ps2.ref.png | Bin 448 -> 0 bytes + ...osite-integer-translate-over-repeat.ps3.ref.png | Bin 448 -> 0 bytes + ...composite-integer-translate-over-repeat.ref.png | Bin 401 -> 0 bytes + ...site-integer-translate-over.base.argb32.ref.png | Bin 13998 -> 0 bytes + ...osite-integer-translate-over.base.rgb24.ref.png | Bin 13998 -> 0 bytes + ...omposite-integer-translate-over.image16.ref.png | Bin 11570 -> 0 bytes + test/composite-integer-translate-over.ps2.ref.png | Bin 15783 -> 0 bytes + test/composite-integer-translate-over.ps3.ref.png | Bin 15783 -> 0 bytes + test/composite-integer-translate-over.ref.png | Bin 16385 -> 0 bytes + ...te-integer-translate-source.base.argb32.ref.png | Bin 13998 -> 0 bytes + ...ite-integer-translate-source.base.rgb24.ref.png | Bin 13998 -> 0 bytes + ...posite-integer-translate-source.image16.ref.png | Bin 11570 -> 0 bytes + .../composite-integer-translate-source.ps2.ref.png | Bin 15783 -> 0 bytes + .../composite-integer-translate-source.ps3.ref.png | Bin 15783 -> 0 bytes + test/composite-integer-translate-source.ref.png | Bin 16385 -> 0 bytes + ...integer-translate-source.svg12.argb32.xfail.png | Bin 16392 -> 0 bytes + ...-integer-translate-source.svg12.rgb24.xfail.png | Bin 16392 -> 0 bytes + test/copy-path.base.argb32.ref.png | Bin 588 -> 0 bytes + test/copy-path.base.rgb24.ref.png | Bin 588 -> 0 bytes + test/copy-path.image16.ref.png | Bin 556 -> 0 bytes + test/copy-path.ps.ref.png | Bin 379 -> 0 bytes + test/copy-path.ref.png | Bin 513 -> 0 bytes + test/coverage-column-triangles.ref.png | Bin 208 -> 0 bytes + test/coverage-column-triangles.xlib.xfail.png | Bin 12745 -> 0 bytes + test/coverage-intersecting-quads.ref.png | Bin 253 -> 0 bytes + test/coverage-intersecting-quads.xlib.xfail.png | Bin 15296 -> 0 bytes + test/coverage-intersecting-triangles.ref.png | Bin 209 -> 0 bytes + .../coverage-intersecting-triangles.xlib.xfail.png | Bin 16728 -> 0 bytes + test/coverage-rectangles.ref.png | Bin 259 -> 0 bytes + test/coverage-rectangles.xlib.xfail.png | Bin 15981 -> 0 bytes + test/coverage-row-triangles.ref.png | Bin 208 -> 0 bytes + test/coverage-row-triangles.xlib.xfail.png | Bin 12671 -> 0 bytes + test/coverage-triangles.ref.png | Bin 253 -> 0 bytes + test/coverage-triangles.xlib.xfail.png | Bin 15859 -> 0 bytes + test/create-from-png-stream.base.argb32.ref.png | Bin 96 -> 0 bytes + test/create-from-png-stream.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/create-from-png-stream.ref.png | Bin 100 -> 0 bytes + test/create-from-png.alpha.ref.png | Bin 150 -> 0 bytes + test/create-from-png.base.argb32.ref.png | Bin 96 -> 0 bytes + test/create-from-png.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/create-from-png.gray-alpha.ref.png | Bin 142 -> 0 bytes + test/create-from-png.gray.ref.png | Bin 124 -> 0 bytes + test/create-from-png.indexed-alpha.ref.png | Bin 172 -> 0 bytes + test/create-from-png.indexed.ref.png | Bin 159 -> 0 bytes + test/create-from-png.ref.png | Bin 131 -> 0 bytes + test/culled-glyphs.base.argb32.ref.png | Bin 435 -> 0 bytes + test/culled-glyphs.base.rgb24.ref.png | Bin 435 -> 0 bytes + test/culled-glyphs.image16.ref.png | Bin 426 -> 0 bytes + test/culled-glyphs.ps.ref.png | Bin 372 -> 0 bytes + test/culled-glyphs.quartz.ref.png | Bin 493 -> 0 bytes + test/culled-glyphs.ref.png | Bin 434 -> 0 bytes + test/curve-to-as-line-to.base.argb32.ref.png | Bin 107 -> 0 bytes + test/curve-to-as-line-to.base.rgb24.ref.png | Bin 107 -> 0 bytes + test/curve-to-as-line-to.ps.xfail.png | Bin 112 -> 0 bytes + test/curve-to-as-line-to.ref.png | Bin 95 -> 0 bytes + test/dash-caps-joins.base.argb32.ref.png | Bin 4521 -> 0 bytes + test/dash-caps-joins.base.rgb24.ref.png | Bin 4521 -> 0 bytes + test/dash-caps-joins.image16.ref.png | Bin 4491 -> 0 bytes + test/dash-caps-joins.ps.ref.png | Bin 3648 -> 0 bytes + test/dash-caps-joins.quartz.xfail.png | Bin 4446 -> 0 bytes + test/dash-caps-joins.ref.png | Bin 4030 -> 0 bytes + test/dash-curve.base.argb32.ref.png | Bin 40040 -> 0 bytes + test/dash-curve.base.rgb24.ref.png | Bin 40040 -> 0 bytes + test/dash-curve.image16.ref.png | Bin 32445 -> 0 bytes + test/dash-curve.ps2.ref.png | Bin 24355 -> 0 bytes + test/dash-curve.ps3.ref.png | Bin 24355 -> 0 bytes + test/dash-curve.quartz.xfail.png | Bin 42238 -> 0 bytes + test/dash-curve.ref.png | Bin 22615 -> 0 bytes + test/dash-curve.xlib.ref.png | Bin 40109 -> 0 bytes + test/dash-infinite-loop.base.argb32.ref.png | Bin 835 -> 0 bytes + test/dash-infinite-loop.base.rgb24.ref.png | Bin 835 -> 0 bytes + test/dash-infinite-loop.ps.ref.png | Bin 601 -> 0 bytes + test/dash-infinite-loop.ref.png | Bin 626 -> 0 bytes + test/dash-no-dash.base.argb32.ref.png | Bin 119 -> 0 bytes + test/dash-no-dash.base.rgb24.ref.png | Bin 119 -> 0 bytes + test/dash-no-dash.ref.png | Bin 152 -> 0 bytes + test/dash-offset-negative.base.argb32.ref.png | Bin 151 -> 0 bytes + test/dash-offset-negative.base.rgb24.ref.png | Bin 151 -> 0 bytes + test/dash-offset-negative.pdf.ref.png | Bin 129 -> 0 bytes + test/dash-offset-negative.ref.png | Bin 171 -> 0 bytes + test/dash-offset.base.argb32.ref.png | Bin 794 -> 0 bytes + test/dash-offset.base.rgb24.ref.png | Bin 794 -> 0 bytes + test/dash-offset.ref.png | Bin 794 -> 0 bytes + test/dash-scale.base.argb32.ref.png | Bin 7621 -> 0 bytes + test/dash-scale.base.rgb24.ref.png | Bin 7621 -> 0 bytes + test/dash-scale.image16.ref.png | Bin 7748 -> 0 bytes + test/dash-scale.ps.ref.png | Bin 5965 -> 0 bytes + test/dash-scale.quartz.ref.png | Bin 7614 -> 0 bytes + test/dash-scale.ref.png | Bin 6314 -> 0 bytes + test/dash-state.base.argb32.ref.png | Bin 7628 -> 0 bytes + test/dash-state.base.rgb24.ref.png | Bin 7628 -> 0 bytes + test/dash-state.image16.ref.png | Bin 7910 -> 0 bytes + test/dash-state.ps2.ref.png | Bin 8740 -> 0 bytes + test/dash-state.ps3.ref.png | Bin 8740 -> 0 bytes + test/dash-state.quartz.xfail.png | Bin 6957 -> 0 bytes + test/dash-state.ref.png | Bin 7642 -> 0 bytes + test/dash-zero-length.base.argb32.ref.png | Bin 219 -> 0 bytes + test/dash-zero-length.base.rgb24.ref.png | Bin 199 -> 0 bytes + test/dash-zero-length.ps2.ref.png | Bin 319 -> 0 bytes + test/dash-zero-length.ps2.rgb24.ref.png | Bin 304 -> 0 bytes + test/dash-zero-length.ps3.ref.png | Bin 319 -> 0 bytes + test/dash-zero-length.ps3.rgb24.ref.png | Bin 304 -> 0 bytes + test/dash-zero-length.ref.png | Bin 232 -> 0 bytes + test/dash-zero-length.rgb24.ref.png | Bin 218 -> 0 bytes + test/degenerate-arc.base.argb32.ref.png | Bin 547 -> 0 bytes + test/degenerate-arc.base.rgb24.ref.png | Bin 547 -> 0 bytes + test/degenerate-arc.image16.ref.png | Bin 592 -> 0 bytes + test/degenerate-arc.ps2.ref.png | Bin 509 -> 0 bytes + test/degenerate-arc.ps3.ref.png | Bin 509 -> 0 bytes + test/degenerate-arc.quartz.ref.png | Bin 552 -> 0 bytes + test/degenerate-arc.ref.png | Bin 690 -> 0 bytes + test/degenerate-arc.xlib.ref.png | Bin 616 -> 0 bytes + test/degenerate-arcs.base.argb32.ref.png | Bin 120 -> 0 bytes + test/degenerate-arcs.base.rgb24.ref.png | Bin 120 -> 0 bytes + test/degenerate-arcs.image16.ref.png | Bin 120 -> 0 bytes + test/degenerate-arcs.ref.png | Bin 120 -> 0 bytes + test/degenerate-curve-to.base.argb32.ref.png | Bin 283 -> 0 bytes + test/degenerate-curve-to.base.rgb24.ref.png | Bin 283 -> 0 bytes + test/degenerate-curve-to.image16.ref.png | Bin 278 -> 0 bytes + test/degenerate-curve-to.ps.xfail.png | Bin 221 -> 0 bytes + test/degenerate-curve-to.quartz.ref.png | Bin 247 -> 0 bytes + test/degenerate-curve-to.ref.png | Bin 227 -> 0 bytes + test/degenerate-dash.base.argb32.ref.png | Bin 1898 -> 0 bytes + test/degenerate-dash.base.rgb24.ref.png | Bin 1898 -> 0 bytes + test/degenerate-dash.ps.xfail.png | Bin 1837 -> 0 bytes + test/degenerate-dash.quartz.xfail.png | Bin 1560 -> 0 bytes + test/degenerate-dash.ref.png | Bin 1845 -> 0 bytes + test/degenerate-dash.xlib.ref.png | Bin 1898 -> 0 bytes + .../degenerate-linear-gradient.base.argb32.ref.png | Bin 336 -> 0 bytes + test/degenerate-linear-gradient.base.rgb24.ref.png | Bin 336 -> 0 bytes + test/degenerate-linear-gradient.ref.png | Bin 322 -> 0 bytes + test/degenerate-path.argb32.ref.png | Bin 253 -> 0 bytes + test/degenerate-path.base.argb32.ref.png | Bin 249 -> 0 bytes + test/degenerate-path.base.rgb24.ref.png | Bin 217 -> 0 bytes + test/degenerate-path.ps.argb32.xfail.png | Bin 234 -> 0 bytes + test/degenerate-path.ps.rgb24.xfail.png | Bin 184 -> 0 bytes + test/degenerate-path.quartz.argb32.xfail.png | Bin 200 -> 0 bytes + test/degenerate-path.quartz.rgb24.xfail.png | Bin 172 -> 0 bytes + test/degenerate-path.rgb24.ref.png | Bin 212 -> 0 bytes + test/degenerate-pen.base.argb32.ref.png | Bin 1000 -> 0 bytes + test/degenerate-pen.base.rgb24.ref.png | Bin 1000 -> 0 bytes + test/degenerate-pen.image16.ref.png | Bin 954 -> 0 bytes + test/degenerate-pen.ps.ref.png | Bin 753 -> 0 bytes + test/degenerate-pen.ref.png | Bin 752 -> 0 bytes + test/degenerate-pen.xlib.ref.png | Bin 997 -> 0 bytes + .../degenerate-radial-gradient.base.argb32.ref.png | Bin 428 -> 0 bytes + test/degenerate-radial-gradient.base.rgb24.ref.png | Bin 428 -> 0 bytes + test/degenerate-radial-gradient.ref.png | Bin 428 -> 0 bytes + test/degenerate-rel-curve-to.base.argb32.ref.png | Bin 278 -> 0 bytes + test/degenerate-rel-curve-to.base.rgb24.ref.png | Bin 278 -> 0 bytes + test/degenerate-rel-curve-to.image16.ref.png | Bin 279 -> 0 bytes + test/degenerate-rel-curve-to.ps.ref.png | Bin 225 -> 0 bytes + test/degenerate-rel-curve-to.quartz.ref.png | Bin 246 -> 0 bytes + test/degenerate-rel-curve-to.ref.png | Bin 227 -> 0 bytes + test/device-offset-fractional.base.argb32.ref.png | Bin 266 -> 0 bytes + test/device-offset-fractional.base.rgb24.ref.png | Bin 266 -> 0 bytes + test/device-offset-fractional.gl.xfail.png | Bin 311 -> 0 bytes + test/device-offset-fractional.pdf.xfail.png | Bin 270 -> 0 bytes + test/device-offset-fractional.ps2.ref.png | Bin 200 -> 0 bytes + test/device-offset-fractional.ps3.ref.png | Bin 200 -> 0 bytes + test/device-offset-fractional.ref.png | Bin 269 -> 0 bytes + test/device-offset-positive.base.argb32.ref.png | Bin 120 -> 0 bytes + test/device-offset-positive.base.rgb24.ref.png | Bin 111 -> 0 bytes + test/device-offset-positive.ref.png | Bin 139 -> 0 bytes + test/device-offset-positive.rgb24.ref.png | Bin 130 -> 0 bytes + test/device-offset-scale.base.argb32.ref.png | Bin 109 -> 0 bytes + test/device-offset-scale.base.rgb24.ref.png | Bin 109 -> 0 bytes + test/device-offset-scale.ref.png | Bin 145 -> 0 bytes + test/device-offset-scale.svg.xfail.png | Bin 128 -> 0 bytes + test/device-offset.base.argb32.ref.png | Bin 118 -> 0 bytes + test/device-offset.base.rgb24.ref.png | Bin 111 -> 0 bytes + test/device-offset.ref.png | Bin 137 -> 0 bytes + test/device-offset.rgb24.ref.png | Bin 130 -> 0 bytes + test/drunkard-tails.base.argb32.ref.png | Bin 6036 -> 0 bytes + test/drunkard-tails.base.rgb24.ref.png | Bin 6036 -> 0 bytes + test/drunkard-tails.ps.ref.png | Bin 3780 -> 0 bytes + test/drunkard-tails.ref.png | Bin 3853 -> 0 bytes + test/extend-pad-border.base.argb32.ref.png | Bin 495 -> 0 bytes + test/extend-pad-border.base.rgb24.ref.png | Bin 495 -> 0 bytes + test/extend-pad-border.image16.ref.png | Bin 446 -> 0 bytes + test/extend-pad-border.pdf.ref.png | Bin 495 -> 0 bytes + test/extend-pad-border.ps.ref.png | Bin 649 -> 0 bytes + test/extend-pad-border.quartz.ref.png | Bin 432 -> 0 bytes + test/extend-pad-border.ref.png | Bin 616 -> 0 bytes + test/extend-pad-border.svg.xfail.png | Bin 1063 -> 0 bytes + test/extend-pad-similar.base.argb32.ref.png | Bin 279 -> 0 bytes + test/extend-pad-similar.base.rgb24.ref.png | Bin 279 -> 0 bytes + test/extend-pad-similar.quartz.xfail.png | Bin 270 -> 0 bytes + test/extend-pad-similar.ref.png | Bin 315 -> 0 bytes + test/extend-pad-similar.svg.xfail.png | Bin 270 -> 0 bytes + test/extend-pad.base.argb32.ref.png | Bin 279 -> 0 bytes + test/extend-pad.base.rgb24.ref.png | Bin 279 -> 0 bytes + test/extend-pad.ps.ref.png | Bin 314 -> 0 bytes + test/extend-pad.quartz.xfail.png | Bin 270 -> 0 bytes + test/extend-pad.ref.png | Bin 315 -> 0 bytes + test/extend-pad.svg.xfail.png | Bin 270 -> 0 bytes + test/extend-reflect-similar.base.argb32.ref.png | Bin 133406 -> 0 bytes + test/extend-reflect-similar.base.rgb24.ref.png | Bin 133406 -> 0 bytes + test/extend-reflect-similar.image16.ref.png | Bin 99786 -> 0 bytes + test/extend-reflect-similar.ps2.ref.png | Bin 146990 -> 0 bytes + test/extend-reflect-similar.ps3.ref.png | Bin 146990 -> 0 bytes + test/extend-reflect-similar.ref.png | Bin 153571 -> 0 bytes + test/extend-reflect.base.argb32.ref.png | Bin 133406 -> 0 bytes + test/extend-reflect.base.rgb24.ref.png | Bin 133406 -> 0 bytes + test/extend-reflect.image16.ref.png | Bin 99786 -> 0 bytes + test/extend-reflect.ps2.ref.png | Bin 146990 -> 0 bytes + test/extend-reflect.ps3.ref.png | Bin 146990 -> 0 bytes + test/extend-reflect.ref.png | Bin 153571 -> 0 bytes + test/extend-repeat-similar.base.argb32.ref.png | Bin 108603 -> 0 bytes + test/extend-repeat-similar.base.rgb24.ref.png | Bin 108603 -> 0 bytes + test/extend-repeat-similar.image16.ref.png | Bin 83738 -> 0 bytes + test/extend-repeat-similar.ps2.ref.png | Bin 119246 -> 0 bytes + test/extend-repeat-similar.ps3.ref.png | Bin 119246 -> 0 bytes + test/extend-repeat-similar.ref.png | Bin 108622 -> 0 bytes + test/extend-repeat.base.argb32.ref.png | Bin 108603 -> 0 bytes + test/extend-repeat.base.rgb24.ref.png | Bin 108603 -> 0 bytes + test/extend-repeat.image16.ref.png | Bin 83738 -> 0 bytes + test/extend-repeat.ps2.ref.png | Bin 119246 -> 0 bytes + test/extend-repeat.ps3.ref.png | Bin 119246 -> 0 bytes + test/extend-repeat.ref.png | Bin 108622 -> 0 bytes + test/extended-blend-alpha-mask.argb32.ref.png | Bin 9221 -> 0 bytes + test/extended-blend-alpha-mask.base.argb32.ref.png | Bin 9221 -> 0 bytes + test/extended-blend-alpha-mask.base.rgb24.ref.png | Bin 4597 -> 0 bytes + test/extended-blend-alpha-mask.rgb24.ref.png | Bin 4597 -> 0 bytes + test/extended-blend-alpha.argb32.ref.png | Bin 9406 -> 0 bytes + test/extended-blend-alpha.base.argb32.ref.png | Bin 9406 -> 0 bytes + test/extended-blend-alpha.base.rgb24.ref.png | Bin 5740 -> 0 bytes + test/extended-blend-alpha.image16.ref.png | Bin 4626 -> 0 bytes + test/extended-blend-alpha.quartz.argb32.ref.png | Bin 9729 -> 0 bytes + test/extended-blend-alpha.quartz.rgb24.ref.png | Bin 5598 -> 0 bytes + test/extended-blend-alpha.rgb24.ref.png | Bin 5740 -> 0 bytes + test/extended-blend-alpha.svg12.argb32.xfail.png | Bin 6658 -> 0 bytes + test/extended-blend-alpha.svg12.rgb24.xfail.png | Bin 5014 -> 0 bytes + test/extended-blend-mask.argb32.ref.png | Bin 3971 -> 0 bytes + test/extended-blend-mask.base.argb32.ref.png | Bin 3971 -> 0 bytes + test/extended-blend-mask.base.rgb24.ref.png | Bin 3643 -> 0 bytes + test/extended-blend-mask.rgb24.ref.png | Bin 3643 -> 0 bytes + test/extended-blend-solid-alpha.argb32.ref.png | Bin 9406 -> 0 bytes + .../extended-blend-solid-alpha.base.argb32.ref.png | Bin 9406 -> 0 bytes + test/extended-blend-solid-alpha.base.rgb24.ref.png | Bin 5740 -> 0 bytes + test/extended-blend-solid-alpha.image16.ref.png | Bin 4626 -> 0 bytes + test/extended-blend-solid-alpha.rgb24.ref.png | Bin 5740 -> 0 bytes + test/extended-blend-solid.argb32.ref.png | Bin 4071 -> 0 bytes + test/extended-blend-solid.base.argb32.ref.png | Bin 4063 -> 0 bytes + test/extended-blend-solid.base.rgb24.ref.png | Bin 3775 -> 0 bytes + test/extended-blend-solid.image16.ref.png | Bin 4145 -> 0 bytes + test/extended-blend-solid.rgb24.ref.png | Bin 3775 -> 0 bytes + test/extended-blend.argb32.ref.png | Bin 4071 -> 0 bytes + test/extended-blend.base.argb32.ref.png | Bin 4063 -> 0 bytes + test/extended-blend.base.rgb24.ref.png | Bin 3775 -> 0 bytes + test/extended-blend.image16.ref.png | Bin 4145 -> 0 bytes + test/extended-blend.quartz.argb32.ref.png | Bin 4284 -> 0 bytes + test/extended-blend.quartz.rgb24.ref.png | Bin 3965 -> 0 bytes + test/extended-blend.rgb24.ref.png | Bin 3775 -> 0 bytes + test/extended-blend.svg12.argb32.xfail.png | Bin 2273 -> 0 bytes + test/extended-blend.svg12.rgb24.xfail.png | Bin 1856 -> 0 bytes + test/fallback-resolution.ppi144x144.ps.ref.png | Bin 5911 -> 0 bytes + test/fallback-resolution.ppi144x144.ref.png | Bin 8697 -> 0 bytes + test/fallback-resolution.ppi144x72.ps.ref.png | Bin 7206 -> 0 bytes + test/fallback-resolution.ppi144x72.ref.png | Bin 8445 -> 0 bytes + test/fallback-resolution.ppi288x288.pdf.ref.png | Bin 8681 -> 0 bytes + test/fallback-resolution.ppi288x288.ps.ref.png | Bin 4450 -> 0 bytes + test/fallback-resolution.ppi288x288.svg.ref.png | Bin 5771 -> 0 bytes + test/fallback-resolution.ppi288x72.ps.ref.png | Bin 6444 -> 0 bytes + test/fallback-resolution.ppi288x72.ref.png | Bin 7166 -> 0 bytes + test/fallback-resolution.ppi576x576.pdf.ref.png | Bin 8732 -> 0 bytes + test/fallback-resolution.ppi576x576.ps.ref.png | Bin 3448 -> 0 bytes + test/fallback-resolution.ppi576x576.svg.ref.png | Bin 4317 -> 0 bytes + test/fallback-resolution.ppi576x72.ps.ref.png | Bin 5992 -> 0 bytes + test/fallback-resolution.ppi576x72.ref.png | Bin 6432 -> 0 bytes + test/fallback-resolution.ppi72x144.ps.ref.png | Bin 7270 -> 0 bytes + test/fallback-resolution.ppi72x144.ref.png | Bin 8677 -> 0 bytes + test/fallback-resolution.ppi72x288.ps.ref.png | Bin 6616 -> 0 bytes + test/fallback-resolution.ppi72x288.ref.png | Bin 7231 -> 0 bytes + test/fallback-resolution.ppi72x576.ps.ref.png | Bin 6349 -> 0 bytes + test/fallback-resolution.ppi72x576.ref.png | Bin 6523 -> 0 bytes + test/fallback-resolution.ppi72x72.ref.png | Bin 8510 -> 0 bytes + test/fill-alpha-pattern.base.argb32.ref.png | Bin 3379 -> 0 bytes + test/fill-alpha-pattern.base.rgb24.ref.png | Bin 3379 -> 0 bytes + test/fill-alpha-pattern.image16.ref.png | Bin 3380 -> 0 bytes + test/fill-alpha-pattern.pdf.ref.png | Bin 2945 -> 0 bytes + test/fill-alpha-pattern.ps3.argb32.ref.png | Bin 3484 -> 0 bytes + test/fill-alpha-pattern.quartz.ref.png | Bin 7943 -> 0 bytes + test/fill-alpha-pattern.ref.png | Bin 2962 -> 0 bytes + test/fill-alpha-pattern.xlib.ref.png | Bin 3653 -> 0 bytes + test/fill-alpha.base.argb32.ref.png | Bin 2824 -> 0 bytes + test/fill-alpha.base.rgb24.ref.png | Bin 2824 -> 0 bytes + test/fill-alpha.image16.ref.png | Bin 2145 -> 0 bytes + test/fill-alpha.ps.argb32.ref.png | Bin 2248 -> 0 bytes + test/fill-alpha.quartz.ref.png | Bin 2704 -> 0 bytes + test/fill-alpha.ref.png | Bin 2167 -> 0 bytes + test/fill-alpha.xlib.ref.png | Bin 2989 -> 0 bytes + test/fill-and-stroke-alpha-add.base.argb32.ref.png | Bin 552 -> 0 bytes + test/fill-and-stroke-alpha-add.base.rgb24.ref.png | Bin 552 -> 0 bytes + test/fill-and-stroke-alpha-add.image16.ref.png | Bin 536 -> 0 bytes + test/fill-and-stroke-alpha-add.quartz.ref.png | Bin 542 -> 0 bytes + test/fill-and-stroke-alpha-add.ref.png | Bin 536 -> 0 bytes + test/fill-and-stroke-alpha-add.svg12.xfail.png | Bin 631 -> 0 bytes + test/fill-and-stroke-alpha.base.argb32.ref.png | Bin 507 -> 0 bytes + test/fill-and-stroke-alpha.base.rgb24.ref.png | Bin 507 -> 0 bytes + test/fill-and-stroke-alpha.image16.ref.png | Bin 470 -> 0 bytes + test/fill-and-stroke-alpha.ref.png | Bin 462 -> 0 bytes + test/fill-and-stroke.argb32.ref.png | Bin 269 -> 0 bytes + test/fill-and-stroke.base.argb32.ref.png | Bin 321 -> 0 bytes + test/fill-and-stroke.base.rgb24.ref.png | Bin 293 -> 0 bytes + test/fill-and-stroke.image16.ref.png | Bin 251 -> 0 bytes + test/fill-and-stroke.ps.argb32.ref.png | Bin 257 -> 0 bytes + test/fill-and-stroke.ps.rgb24.ref.png | Bin 225 -> 0 bytes + test/fill-and-stroke.quartz.argb32.ref.png | Bin 273 -> 0 bytes + test/fill-and-stroke.quartz.rgb24.ref.png | Bin 249 -> 0 bytes + test/fill-and-stroke.rgb24.ref.png | Bin 252 -> 0 bytes + test/fill-and-stroke.xlib.argb32.ref.png | Bin 322 -> 0 bytes + test/fill-and-stroke.xlib.rgb24.ref.png | Bin 291 -> 0 bytes + test/fill-degenerate-sort-order.argb32.ref.png | Bin 1929 -> 0 bytes + .../fill-degenerate-sort-order.base.argb32.ref.png | Bin 2378 -> 0 bytes + test/fill-degenerate-sort-order.base.rgb24.ref.png | Bin 2041 -> 0 bytes + test/fill-degenerate-sort-order.image16.ref.png | Bin 1753 -> 0 bytes + .../fill-degenerate-sort-order.ps.argb32.xfail.png | Bin 1903 -> 0 bytes + test/fill-degenerate-sort-order.ps.rgb24.xfail.png | Bin 1638 -> 0 bytes + ...ill-degenerate-sort-order.quartz.argb32.ref.png | Bin 2451 -> 0 bytes + ...fill-degenerate-sort-order.quartz.rgb24.ref.png | Bin 2079 -> 0 bytes + test/fill-degenerate-sort-order.rgb24.ref.png | Bin 1689 -> 0 bytes + test/fill-degenerate-sort-order.xlib.ref.png | Bin 2397 -> 0 bytes + test/fill-degenerate-sort-order.xlib.rgb24.ref.png | Bin 2060 -> 0 bytes + test/fill-empty.argb32.ref.png | Bin 99 -> 0 bytes + test/fill-empty.base.argb32.ref.png | Bin 99 -> 0 bytes + test/fill-empty.base.rgb24.ref.png | Bin 97 -> 0 bytes + test/fill-empty.rgb24.ref.png | Bin 97 -> 0 bytes + test/fill-empty.svg12.rgb24.xfail.png | Bin 99 -> 0 bytes + test/fill-image.base.argb32.ref.png | Bin 1455 -> 0 bytes + test/fill-image.base.rgb24.ref.png | Bin 1455 -> 0 bytes + test/fill-image.image16.ref.png | Bin 1163 -> 0 bytes + test/fill-image.ps.ref.png | Bin 1645 -> 0 bytes + test/fill-image.quartz.ref.png | Bin 1297 -> 0 bytes + test/fill-image.ref.png | Bin 972 -> 0 bytes + test/fill-image.xlib.ref.png | Bin 1460 -> 0 bytes + test/fill-missed-stop.base.argb32.ref.png | Bin 447 -> 0 bytes + test/fill-missed-stop.base.rgb24.ref.png | Bin 375 -> 0 bytes + test/fill-missed-stop.pdf.argb32.ref.png | Bin 452 -> 0 bytes + test/fill-missed-stop.ps2.argb32.ref.png | Bin 564 -> 0 bytes + test/fill-missed-stop.ps2.rgb24.ref.png | Bin 531 -> 0 bytes + test/fill-missed-stop.ps3.argb32.ref.png | Bin 564 -> 0 bytes + test/fill-missed-stop.ps3.rgb24.ref.png | Bin 531 -> 0 bytes + test/fill-missed-stop.ref.png | Bin 455 -> 0 bytes + test/fill-missed-stop.rgb24.ref.png | Bin 382 -> 0 bytes + test/fill-rule.base.argb32.ref.png | Bin 1979 -> 0 bytes + test/fill-rule.base.rgb24.ref.png | Bin 1703 -> 0 bytes + test/fill-rule.image16.ref.png | Bin 1625 -> 0 bytes + test/fill-rule.ps2.argb32.ref.png | Bin 1878 -> 0 bytes + test/fill-rule.ps2.rgb24.ref.png | Bin 1524 -> 0 bytes + test/fill-rule.ps3.argb32.ref.png | Bin 1878 -> 0 bytes + test/fill-rule.ps3.rgb24.ref.png | Bin 1524 -> 0 bytes + test/fill-rule.quartz.argb32.ref.png | Bin 2060 -> 0 bytes + test/fill-rule.quartz.rgb24.ref.png | Bin 1771 -> 0 bytes + test/fill-rule.ref.png | Bin 1769 -> 0 bytes + test/fill-rule.rgb24.ref.png | Bin 1591 -> 0 bytes + test/fill-rule.xlib.ref.png | Bin 1979 -> 0 bytes + test/fill-rule.xlib.rgb24.ref.png | Bin 1722 -> 0 bytes + test/filter-bilinear-extents.base.argb32.ref.png | Bin 1210 -> 0 bytes + test/filter-bilinear-extents.base.rgb24.ref.png | Bin 1210 -> 0 bytes + test/filter-bilinear-extents.image16.ref.png | Bin 895 -> 0 bytes + test/filter-bilinear-extents.pdf.xfail.png | Bin 401 -> 0 bytes + test/filter-bilinear-extents.ps2.ref.png | Bin 556 -> 0 bytes + test/filter-bilinear-extents.ps3.ref.png | Bin 556 -> 0 bytes + test/filter-bilinear-extents.quartz.xfail.png | Bin 308 -> 0 bytes + test/filter-bilinear-extents.ref.png | Bin 1340 -> 0 bytes + test/filter-nearest-offset.base.argb32.ref.png | Bin 201 -> 0 bytes + test/filter-nearest-offset.base.rgb24.ref.png | Bin 201 -> 0 bytes + test/filter-nearest-offset.gl.xfail.png | Bin 260 -> 0 bytes + test/filter-nearest-offset.pdf.xfail.png | Bin 4522 -> 0 bytes + test/filter-nearest-offset.ps2.ref.png | Bin 255 -> 0 bytes + test/filter-nearest-offset.ps3.ref.png | Bin 255 -> 0 bytes + test/filter-nearest-offset.ref.png | Bin 248 -> 0 bytes + test/filter-nearest-offset.svg.xfail.png | Bin 4419 -> 0 bytes + .../filter-nearest-transformed.base.argb32.ref.png | Bin 514 -> 0 bytes + test/filter-nearest-transformed.base.rgb24.ref.png | Bin 514 -> 0 bytes + test/filter-nearest-transformed.gl.xfail.png | Bin 514 -> 0 bytes + test/filter-nearest-transformed.image16.ref.png | Bin 418 -> 0 bytes + test/filter-nearest-transformed.pdf.xfail.png | Bin 532 -> 0 bytes + test/filter-nearest-transformed.quartz.xfail.png | Bin 349 -> 0 bytes + test/filter-nearest-transformed.ref.png | Bin 570 -> 0 bytes + test/filter-nearest-transformed.svg.xfail.png | Bin 546 -> 0 bytes + test/finer-grained-fallbacks.argb32.ref.png | Bin 993 -> 0 bytes + test/finer-grained-fallbacks.base.argb32.ref.png | Bin 1110 -> 0 bytes + test/finer-grained-fallbacks.base.rgb24.ref.png | Bin 856 -> 0 bytes + test/finer-grained-fallbacks.gl.argb32.ref.png | Bin 1075 -> 0 bytes + test/finer-grained-fallbacks.image16.ref.png | Bin 862 -> 0 bytes + test/finer-grained-fallbacks.ps2.argb32.ref.png | Bin 1168 -> 0 bytes + test/finer-grained-fallbacks.ps2.ref.png | Bin 1356 -> 0 bytes + test/finer-grained-fallbacks.ps2.rgb24.ref.png | Bin 936 -> 0 bytes + test/finer-grained-fallbacks.ps3.argb32.ref.png | Bin 1168 -> 0 bytes + test/finer-grained-fallbacks.ps3.ref.png | Bin 1356 -> 0 bytes + test/finer-grained-fallbacks.ps3.rgb24.ref.png | Bin 936 -> 0 bytes + test/finer-grained-fallbacks.quartz.argb32.ref.png | Bin 988 -> 0 bytes + test/finer-grained-fallbacks.quartz.rgb24.ref.png | Bin 763 -> 0 bytes + test/finer-grained-fallbacks.rgb24.ref.png | Bin 786 -> 0 bytes + test/finer-grained-fallbacks.svg12.argb32.ref.png | Bin 190 -> 0 bytes + test/finer-grained-fallbacks.svg12.rgb24.ref.png | Bin 191 -> 0 bytes + test/finer-grained-fallbacks.xlib-fallback.ref.png | Bin 919 -> 0 bytes + test/finer-grained-fallbacks.xlib.ref.png | Bin 1110 -> 0 bytes + test/finer-grained-fallbacks.xlib.rgb24.ref.png | Bin 856 -> 0 bytes + test/font-matrix-translation.base.argb32.ref.png | Bin 874 -> 0 bytes + test/font-matrix-translation.base.rgb24.ref.png | Bin 874 -> 0 bytes + test/font-matrix-translation.image16.ref.png | Bin 852 -> 0 bytes + test/font-matrix-translation.ps2.argb32.ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation.ps2.rgb24.ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation.ps3.argb32.ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation.ps3.rgb24.ref.png | Bin 748 -> 0 bytes + test/font-matrix-translation.quartz.ref.png | Bin 996 -> 0 bytes + test/font-matrix-translation.ref.png | Bin 874 -> 0 bytes + test/font-matrix-translation.svg.ref.png | Bin 870 -> 0 bytes + .../ft-show-glyphs-positioning.base.argb32.ref.png | Bin 3297 -> 0 bytes + test/ft-show-glyphs-positioning.base.rgb24.ref.png | Bin 3297 -> 0 bytes + test/ft-show-glyphs-positioning.image16.ref.png | Bin 2772 -> 0 bytes + test/ft-show-glyphs-positioning.pdf.ref.png | Bin 3117 -> 0 bytes + test/ft-show-glyphs-positioning.ps2.ref.png | Bin 2269 -> 0 bytes + test/ft-show-glyphs-positioning.ps3.ref.png | Bin 2269 -> 0 bytes + test/ft-show-glyphs-positioning.ref.png | Bin 3297 -> 0 bytes + test/ft-show-glyphs-positioning.svg.ref.png | Bin 6018 -> 0 bytes + test/ft-show-glyphs-table.base.argb32.ref.png | Bin 9893 -> 0 bytes + test/ft-show-glyphs-table.base.rgb24.ref.png | Bin 9893 -> 0 bytes + test/ft-show-glyphs-table.image16.ref.png | Bin 8052 -> 0 bytes + test/ft-show-glyphs-table.ps2.ref.png | Bin 5687 -> 0 bytes + test/ft-show-glyphs-table.ps3.ref.png | Bin 5687 -> 0 bytes + test/ft-show-glyphs-table.quartz.xfail.png | Bin 827 -> 0 bytes + test/ft-show-glyphs-table.ref.png | Bin 9893 -> 0 bytes + test/ft-show-glyphs-table.svg.ref.png | Bin 10005 -> 0 bytes + test/ft-text-antialias-none.base.argb32.ref.png | Bin 295 -> 0 bytes + test/ft-text-antialias-none.base.rgb24.ref.png | Bin 295 -> 0 bytes + test/ft-text-antialias-none.ps2.argb32.ref.png | Bin 335 -> 0 bytes + test/ft-text-antialias-none.ps3.argb32.ref.png | Bin 335 -> 0 bytes + test/ft-text-antialias-none.ref.png | Bin 336 -> 0 bytes + ...-text-vertical-layout-type1.base.argb32.ref.png | Bin 3066 -> 0 bytes + ...t-text-vertical-layout-type1.base.rgb24.ref.png | Bin 3066 -> 0 bytes + test/ft-text-vertical-layout-type1.image16.ref.png | Bin 3072 -> 0 bytes + test/ft-text-vertical-layout-type1.pdf.ref.png | Bin 3635 -> 0 bytes + test/ft-text-vertical-layout-type1.ps.ref.png | Bin 2088 -> 0 bytes + .../ft-text-vertical-layout-type1.quartz.xfail.png | Bin 3635 -> 0 bytes + test/ft-text-vertical-layout-type1.ref.png | Bin 3591 -> 0 bytes + test/ft-text-vertical-layout-type1.svg.ref.png | Bin 3607 -> 0 bytes + test/ft-text-vertical-layout-type1.xlib.ref.png | Bin 3625 -> 0 bytes + ...-text-vertical-layout-type3.base.argb32.ref.png | Bin 3597 -> 0 bytes + ...t-text-vertical-layout-type3.base.rgb24.ref.png | Bin 3597 -> 0 bytes + test/ft-text-vertical-layout-type3.image16.ref.png | Bin 3141 -> 0 bytes + test/ft-text-vertical-layout-type3.pdf.ref.png | Bin 3639 -> 0 bytes + test/ft-text-vertical-layout-type3.ps.ref.png | Bin 2134 -> 0 bytes + test/ft-text-vertical-layout-type3.quartz.ref.png | Bin 3573 -> 0 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3222 -> 0 bytes + test/ft-text-vertical-layout-type3.svg.ref.png | Bin 3626 -> 0 bytes + test/ft-text-vertical-layout-type3.xlib.ref.png | Bin 3597 -> 0 bytes + test/generate_refs.sh | 2 +- + test/get-group-target.base.argb32.ref.png | Bin 113 -> 0 bytes + test/get-group-target.base.rgb24.ref.png | Bin 113 -> 0 bytes + test/get-group-target.ref.png | Bin 134 -> 0 bytes + test/gl-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/gl-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/gl-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/glyph-cache-pressure.base.argb32.ref.png | Bin 2863 -> 0 bytes + test/glyph-cache-pressure.base.rgb24.ref.png | Bin 2863 -> 0 bytes + test/glyph-cache-pressure.image16.ref.png | Bin 2453 -> 0 bytes + test/glyph-cache-pressure.ps2.ref.png | Bin 1454 -> 0 bytes + test/glyph-cache-pressure.ps3.ref.png | Bin 1454 -> 0 bytes + test/glyph-cache-pressure.quartz.ref.png | Bin 3284 -> 0 bytes + test/glyph-cache-pressure.ref.png | Bin 2863 -> 0 bytes + test/gradient-alpha.base.argb32.ref.png | Bin 125 -> 0 bytes + test/gradient-alpha.base.rgb24.ref.png | Bin 119 -> 0 bytes + test/gradient-alpha.ps2.argb32.ref.png | Bin 134 -> 0 bytes + test/gradient-alpha.ps2.rgb24.ref.png | Bin 130 -> 0 bytes + test/gradient-alpha.ps3.argb32.ref.png | Bin 134 -> 0 bytes + test/gradient-alpha.ps3.rgb24.ref.png | Bin 130 -> 0 bytes + test/gradient-alpha.ref.png | Bin 147 -> 0 bytes + test/gradient-alpha.rgb24.ref.png | Bin 119 -> 0 bytes + test/gradient-constant-alpha.base.argb32.ref.png | Bin 111 -> 0 bytes + test/gradient-constant-alpha.base.rgb24.ref.png | Bin 106 -> 0 bytes + test/gradient-constant-alpha.ps3.ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha.ps3.rgb24.ref.png | Bin 124 -> 0 bytes + test/gradient-constant-alpha.quartz.argb32.ref.png | Bin 214 -> 0 bytes + test/gradient-constant-alpha.ref.png | Bin 117 -> 0 bytes + test/gradient-constant-alpha.rgb24.ref.png | Bin 106 -> 0 bytes + test/gradient-zero-stops-mask.argb32.ref.png | Bin 86 -> 0 bytes + test/gradient-zero-stops-mask.base.argb32.ref.png | Bin 86 -> 0 bytes + test/gradient-zero-stops-mask.base.rgb24.ref.png | Bin 86 -> 0 bytes + test/gradient-zero-stops-mask.rgb24.ref.png | Bin 86 -> 0 bytes + test/gradient-zero-stops.base.argb32.ref.png | Bin 86 -> 0 bytes + test/gradient-zero-stops.base.rgb24.ref.png | Bin 86 -> 0 bytes + test/gradient-zero-stops.ref.png | Bin 105 -> 0 bytes + test/gradient-zero-stops.rgb24.ref.png | Bin 105 -> 0 bytes + test/group-clip.base.argb32.ref.png | Bin 191 -> 0 bytes + test/group-clip.base.rgb24.ref.png | Bin 191 -> 0 bytes + test/group-clip.image16.ref.png | Bin 193 -> 0 bytes + test/group-clip.ref.png | Bin 191 -> 0 bytes + test/group-paint.base.argb32.ref.png | Bin 95 -> 0 bytes + test/group-paint.base.rgb24.ref.png | Bin 95 -> 0 bytes + test/group-paint.ref.png | Bin 118 -> 0 bytes + test/group-unaligned.base.argb32.ref.png | Bin 468 -> 0 bytes + test/group-unaligned.base.rgb24.ref.png | Bin 468 -> 0 bytes + test/group-unaligned.image16.ref.png | Bin 395 -> 0 bytes + test/group-unaligned.ps.ref.png | Bin 321 -> 0 bytes + test/group-unaligned.ps.rgb24.xfail.png | Bin 371 -> 0 bytes + test/group-unaligned.quartz.ref.png | Bin 363 -> 0 bytes + test/group-unaligned.ref.png | Bin 325 -> 0 bytes + test/group-unaligned.svg.argb32.xfail.png | Bin 520 -> 0 bytes + test/group-unaligned.svg.rgb24.xfail.png | Bin 425 -> 0 bytes + test/group-unaligned.xlib-fallback.ref.png | Bin 474 -> 0 bytes + test/group-unaligned.xlib.ref.png | Bin 466 -> 0 bytes + test/halo-transform.base.argb32.ref.png | Bin 15118 -> 0 bytes + test/halo-transform.base.rgb24.ref.png | Bin 15118 -> 0 bytes + test/halo-transform.image16.ref.png | Bin 10983 -> 0 bytes + test/halo-transform.ps.ref.png | Bin 8691 -> 0 bytes + test/halo-transform.quartz.ref.png | Bin 14360 -> 0 bytes + test/halo-transform.ref.png | Bin 11313 -> 0 bytes + test/halo-transform.xlib.ref.png | Bin 15346 -> 0 bytes + test/halo.base.argb32.ref.png | Bin 8800 -> 0 bytes + test/halo.base.rgb24.ref.png | Bin 8800 -> 0 bytes + test/halo.image16.ref.png | Bin 6172 -> 0 bytes + test/halo.ps.ref.png | Bin 5220 -> 0 bytes + test/halo.quartz.ref.png | Bin 8601 -> 0 bytes + test/halo.ref.png | Bin 7297 -> 0 bytes + test/halo.xlib.ref.png | Bin 8835 -> 0 bytes + test/hatchings.base.argb32.ref.png | Bin 90611 -> 0 bytes + test/hatchings.base.rgb24.ref.png | Bin 90611 -> 0 bytes + test/hatchings.ref.png | Bin 45398 -> 0 bytes + test/hatchings.xlib.ref.png | Bin 92532 -> 0 bytes + test/horizontal-clip.base.argb32.ref.png | Bin 113 -> 0 bytes + test/horizontal-clip.base.rgb24.ref.png | Bin 113 -> 0 bytes + test/horizontal-clip.ref.png | Bin 129 -> 0 bytes + test/huge-linear.base.argb32.ref.png | Bin 1600 -> 0 bytes + test/huge-linear.base.rgb24.ref.png | Bin 1600 -> 0 bytes + test/huge-linear.image16.ref.png | Bin 1542 -> 0 bytes + test/huge-linear.pdf.ref.png | Bin 1586 -> 0 bytes + test/huge-linear.ps3.ref.png | Bin 1786 -> 0 bytes + test/huge-linear.quartz.ref.png | Bin 15230 -> 0 bytes + test/huge-linear.ref.png | Bin 1619 -> 0 bytes + test/huge-radial.base.argb32.ref.png | Bin 41702 -> 0 bytes + test/huge-radial.base.rgb24.ref.png | Bin 41702 -> 0 bytes + test/huge-radial.image16.ref.png | Bin 17893 -> 0 bytes + test/huge-radial.pdf.argb32.ref.png | Bin 177382 -> 0 bytes + test/huge-radial.pdf.rgb24.ref.png | Bin 225358 -> 0 bytes + test/huge-radial.ps3.ref.png | Bin 18449 -> 0 bytes + test/huge-radial.quartz.ref.png | Bin 84690 -> 0 bytes + test/huge-radial.ref.png | Bin 41702 -> 0 bytes + test/image-bug-710072-aligned.base.argb32.ref.png | Bin 151 -> 0 bytes + test/image-bug-710072-aligned.base.rgb24.ref.png | Bin 151 -> 0 bytes + test/image-bug-710072-aligned.ref.png | Bin 151 -> 0 bytes + .../image-bug-710072-unaligned.base.argb32.ref.png | Bin 219 -> 0 bytes + test/image-bug-710072-unaligned.base.rgb24.ref.png | Bin 219 -> 0 bytes + test/image-bug-710072-unaligned.ref.png | Bin 212 -> 0 bytes + test/image-bug-710072-unaligned.xlib.ref.png | Bin 219 -> 0 bytes + test/image-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/image-surface-source.base.argb32.ref.png | Bin 377 -> 0 bytes + test/image-surface-source.base.rgb24.ref.png | Bin 301 -> 0 bytes + test/image-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/image-surface-source.ps2.ref.png | Bin 376 -> 0 bytes + test/image-surface-source.ps3.ref.png | Bin 376 -> 0 bytes + test/image-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/image-surface-source.svg12.argb32.xfail.png | Bin 278 -> 0 bytes + test/image-surface-source.svg12.rgb24.xfail.png | Bin 278 -> 0 bytes + test/implicit-close.base.argb32.ref.png | Bin 251 -> 0 bytes + test/implicit-close.base.rgb24.ref.png | Bin 251 -> 0 bytes + test/implicit-close.ps.ref.png | Bin 252 -> 0 bytes + test/implicit-close.ref.png | Bin 251 -> 0 bytes + test/infinite-join.base.argb32.ref.png | Bin 160 -> 0 bytes + test/infinite-join.base.rgb24.ref.png | Bin 160 -> 0 bytes + test/infinite-join.ps2.ref.png | Bin 218 -> 0 bytes + test/infinite-join.ps3.ref.png | Bin 218 -> 0 bytes + test/infinite-join.ref.png | Bin 142 -> 0 bytes + test/inverse-text.base.argb32.ref.png | Bin 2166 -> 0 bytes + test/inverse-text.base.rgb24.ref.png | Bin 2166 -> 0 bytes + test/inverse-text.image16.ref.png | Bin 1863 -> 0 bytes + test/inverse-text.ps.ref.png | Bin 776 -> 0 bytes + test/inverse-text.quartz.ref.png | Bin 2565 -> 0 bytes + test/inverse-text.ref.png | Bin 2166 -> 0 bytes + test/joins-loop.base.argb32.ref.png | Bin 4202 -> 0 bytes + test/joins-loop.base.rgb24.ref.png | Bin 4202 -> 0 bytes + test/joins-loop.ref.png | Bin 3112 -> 0 bytes + test/joins-retrace.base.argb32.ref.png | Bin 4667 -> 0 bytes + test/joins-retrace.base.rgb24.ref.png | Bin 4667 -> 0 bytes + test/joins-retrace.ref.png | Bin 3951 -> 0 bytes + test/joins-star.base.argb32.ref.png | Bin 3583 -> 0 bytes + test/joins-star.base.rgb24.ref.png | Bin 3583 -> 0 bytes + test/joins-star.ref.png | Bin 4028 -> 0 bytes + test/joins.base.argb32.ref.png | Bin 5684 -> 0 bytes + test/joins.base.rgb24.ref.png | Bin 5684 -> 0 bytes + test/joins.image16.ref.png | Bin 5858 -> 0 bytes + test/joins.ps.ref.png | Bin 4230 -> 0 bytes + test/joins.quartz.ref.png | Bin 5833 -> 0 bytes + test/joins.ref.png | Bin 4880 -> 0 bytes + test/large-clip.base.argb32.ref.png | Bin 305 -> 0 bytes + test/large-clip.base.rgb24.ref.png | Bin 305 -> 0 bytes + test/large-clip.ref.png | Bin 350 -> 0 bytes + test/large-font.base.argb32.ref.png | Bin 6117 -> 0 bytes + test/large-font.base.rgb24.ref.png | Bin 6117 -> 0 bytes + test/large-font.image16.ref.png | Bin 5713 -> 0 bytes + test/large-font.ref.png | Bin 6936 -> 0 bytes + test/large-source-roi.base.argb32.ref.png | Bin 93 -> 0 bytes + test/large-source-roi.base.rgb24.ref.png | Bin 93 -> 0 bytes + test/large-source-roi.ref.png | Bin 112 -> 0 bytes + test/large-source.base.argb32.ref.png | Bin 112 -> 0 bytes + test/large-source.base.rgb24.ref.png | Bin 112 -> 0 bytes + test/large-source.ref.png | Bin 137 -> 0 bytes + .../large-twin-antialias-mixed.base.argb32.ref.png | Bin 10740 -> 0 bytes + test/large-twin-antialias-mixed.base.rgb24.ref.png | Bin 10740 -> 0 bytes + test/large-twin-antialias-mixed.image16.ref.png | Bin 14398 -> 0 bytes + test/large-twin-antialias-mixed.ref.png | Bin 10740 -> 0 bytes + test/large-twin-antialias-mixed.xlib.ref.png | Bin 14655 -> 0 bytes + test/leaky-dash.base.argb32.ref.png | Bin 197 -> 0 bytes + test/leaky-dash.base.rgb24.ref.png | Bin 197 -> 0 bytes + test/leaky-dash.ps2.argb32.ref.png | Bin 286 -> 0 bytes + test/leaky-dash.ps2.rgb24.ref.png | Bin 284 -> 0 bytes + test/leaky-dash.ps3.argb32.ref.png | Bin 286 -> 0 bytes + test/leaky-dash.ps3.rgb24.ref.png | Bin 284 -> 0 bytes + test/leaky-dash.quartz.ref.png | Bin 195 -> 0 bytes + test/leaky-dash.ref.png | Bin 243 -> 0 bytes + test/leaky-dashed-rectangle.base.argb32.ref.png | Bin 345 -> 0 bytes + test/leaky-dashed-rectangle.base.rgb24.ref.png | Bin 345 -> 0 bytes + test/leaky-dashed-rectangle.image16.ref.png | Bin 367 -> 0 bytes + test/leaky-dashed-rectangle.pdf.ref.png | Bin 377 -> 0 bytes + test/leaky-dashed-rectangle.ps.ref.png | Bin 358 -> 0 bytes + test/leaky-dashed-rectangle.quartz.ref.png | Bin 339 -> 0 bytes + test/leaky-dashed-rectangle.ref.png | Bin 357 -> 0 bytes + test/leaky-dashed-rectangle.xlib.ref.png | Bin 344 -> 0 bytes + test/leaky-dashed-stroke.base.argb32.ref.png | Bin 9303 -> 0 bytes + test/leaky-dashed-stroke.base.rgb24.ref.png | Bin 9303 -> 0 bytes + test/leaky-dashed-stroke.image16.ref.png | Bin 8089 -> 0 bytes + test/leaky-dashed-stroke.ps.ref.png | Bin 5293 -> 0 bytes + test/leaky-dashed-stroke.quartz.ref.png | Bin 9229 -> 0 bytes + test/leaky-dashed-stroke.ref.png | Bin 5627 -> 0 bytes + test/leaky-dashed-stroke.xlib.ref.png | Bin 9305 -> 0 bytes + test/leaky-polygon.base.argb32.ref.png | Bin 325 -> 0 bytes + test/leaky-polygon.base.rgb24.ref.png | Bin 325 -> 0 bytes + test/leaky-polygon.image16.ref.png | Bin 329 -> 0 bytes + test/leaky-polygon.ps.ref.png | Bin 289 -> 0 bytes + test/leaky-polygon.ref.png | Bin 281 -> 0 bytes + test/line-width-overlap-dashed.base.argb32.ref.png | Bin 397 -> 0 bytes + test/line-width-overlap-dashed.base.rgb24.ref.png | Bin 397 -> 0 bytes + .../line-width-overlap-flipped.base.argb32.ref.png | Bin 324 -> 0 bytes + test/line-width-overlap-flipped.base.rgb24.ref.png | Bin 324 -> 0 bytes + test/line-width-overlap-flipped.ref.png | Bin 296 -> 0 bytes + .../line-width-overlap-flopped.base.argb32.ref.png | Bin 324 -> 0 bytes + test/line-width-overlap-flopped.base.rgb24.ref.png | Bin 324 -> 0 bytes + test/line-width-overlap-flopped.ref.png | Bin 296 -> 0 bytes + test/line-width-overlap-offset.base.argb32.ref.png | Bin 365 -> 0 bytes + test/line-width-overlap-offset.base.rgb24.ref.png | Bin 365 -> 0 bytes + test/line-width-overlap-offset.ref.png | Bin 348 -> 0 bytes + .../line-width-overlap-rotated.base.argb32.ref.png | Bin 628 -> 0 bytes + test/line-width-overlap-rotated.base.rgb24.ref.png | Bin 628 -> 0 bytes + test/line-width-overlap-rotated.ref.png | Bin 719 -> 0 bytes + test/line-width-overlap.base.argb32.ref.png | Bin 324 -> 0 bytes + test/line-width-overlap.base.rgb24.ref.png | Bin 324 -> 0 bytes + test/line-width-overlap.ref.png | Bin 324 -> 0 bytes + test/line-width-scale.base.argb32.ref.png | Bin 5692 -> 0 bytes + test/line-width-scale.base.rgb24.ref.png | Bin 5692 -> 0 bytes + test/line-width-scale.image16.ref.png | Bin 4721 -> 0 bytes + test/line-width-scale.ps2.ref.png | Bin 3431 -> 0 bytes + test/line-width-scale.ps3.ref.png | Bin 3431 -> 0 bytes + test/line-width-scale.quartz.ref.png | Bin 5623 -> 0 bytes + test/line-width-scale.ref.png | Bin 3568 -> 0 bytes + test/line-width-tolerance.base.argb32.ref.png | Bin 163 -> 0 bytes + test/line-width-tolerance.base.rgb24.ref.png | Bin 163 -> 0 bytes + test/line-width-tolerance.ref.png | Bin 192 -> 0 bytes + test/line-width.base.argb32.ref.png | Bin 180 -> 0 bytes + test/line-width.base.rgb24.ref.png | Bin 180 -> 0 bytes + test/line-width.ref.png | Bin 201 -> 0 bytes + test/linear-gradient-extend.base.argb32.ref.png | Bin 371 -> 0 bytes + test/linear-gradient-extend.base.rgb24.ref.png | Bin 371 -> 0 bytes + test/linear-gradient-extend.ref.png | Bin 371 -> 0 bytes + test/linear-gradient-large.base.argb32.ref.png | Bin 4076 -> 0 bytes + test/linear-gradient-large.base.rgb24.ref.png | Bin 4076 -> 0 bytes + test/linear-gradient-large.quartz.ref.png | Bin 4074 -> 0 bytes + test/linear-gradient-large.ref.png | Bin 4076 -> 0 bytes + test/linear-gradient-one-stop.argb32.ref.png | Bin 225 -> 0 bytes + test/linear-gradient-one-stop.base.argb32.ref.png | Bin 225 -> 0 bytes + test/linear-gradient-one-stop.base.rgb24.ref.png | Bin 174 -> 0 bytes + test/linear-gradient-one-stop.rgb24.ref.png | Bin 174 -> 0 bytes + test/linear-gradient-reflect.base.argb32.ref.png | Bin 185 -> 0 bytes + test/linear-gradient-reflect.base.rgb24.ref.png | Bin 185 -> 0 bytes + test/linear-gradient-reflect.image16.ref.png | Bin 190 -> 0 bytes + test/linear-gradient-reflect.pdf.argb32.ref.png | Bin 248 -> 0 bytes + test/linear-gradient-reflect.pdf.rgb24.ref.png | Bin 248 -> 0 bytes + test/linear-gradient-reflect.ps3.ref.png | Bin 314 -> 0 bytes + test/linear-gradient-reflect.quartz.ref.png | Bin 780 -> 0 bytes + test/linear-gradient-reflect.ref.png | Bin 216 -> 0 bytes + test/linear-gradient-subset.base.argb32.ref.png | Bin 773 -> 0 bytes + test/linear-gradient-subset.base.rgb24.ref.png | Bin 773 -> 0 bytes + test/linear-gradient-subset.image16.ref.png | Bin 791 -> 0 bytes + test/linear-gradient-subset.ps3.ref.png | Bin 619 -> 0 bytes + test/linear-gradient-subset.quartz.ref.png | Bin 852 -> 0 bytes + test/linear-gradient-subset.ref.png | Bin 802 -> 0 bytes + test/linear-gradient-subset.xlib.ref.png | Bin 782 -> 0 bytes + test/linear-gradient.base.argb32.ref.png | Bin 914 -> 0 bytes + test/linear-gradient.base.rgb24.ref.png | Bin 914 -> 0 bytes + test/linear-gradient.image16.ref.png | Bin 941 -> 0 bytes + test/linear-gradient.ps3.ref.png | Bin 779 -> 0 bytes + test/linear-gradient.quartz.ref.png | Bin 951 -> 0 bytes + test/linear-gradient.ref.png | Bin 961 -> 0 bytes + test/linear-gradient.xlib.ref.png | Bin 1021 -> 0 bytes + test/linear-step-function.base.argb32.ref.png | Bin 118 -> 0 bytes + test/linear-step-function.base.rgb24.ref.png | Bin 118 -> 0 bytes + test/linear-step-function.xfail.png | Bin 116 -> 0 bytes + test/linear-uniform.base.argb32.ref.png | Bin 128 -> 0 bytes + test/linear-uniform.base.rgb24.ref.png | Bin 128 -> 0 bytes + test/linear-uniform.image16.ref.png | Bin 131 -> 0 bytes + test/linear-uniform.ref.png | Bin 128 -> 0 bytes + test/long-dashed-lines.base.argb32.ref.png | Bin 2071 -> 0 bytes + test/long-dashed-lines.base.rgb24.ref.png | Bin 2071 -> 0 bytes + test/long-dashed-lines.image16.ref.png | Bin 1974 -> 0 bytes + test/long-dashed-lines.ps2.ref.png | Bin 1329 -> 0 bytes + test/long-dashed-lines.ps3.ref.png | Bin 1329 -> 0 bytes + test/long-dashed-lines.quartz.ref.png | Bin 2068 -> 0 bytes + test/long-dashed-lines.ref.png | Bin 1453 -> 0 bytes + test/long-lines.base.argb32.ref.png | Bin 201 -> 0 bytes + test/long-lines.base.rgb24.ref.png | Bin 201 -> 0 bytes + test/map-all-to-image.base.argb32.ref.png | Bin 86 -> 0 bytes + test/map-all-to-image.base.rgb24.ref.png | Bin 86 -> 0 bytes + test/map-all-to-image.ref.png | Bin 86 -> 0 bytes + test/map-bit-to-image.base.argb32.ref.png | Bin 103 -> 0 bytes + test/map-bit-to-image.base.rgb24.ref.png | Bin 103 -> 0 bytes + test/map-bit-to-image.ref.png | Bin 103 -> 0 bytes + test/map-to-image-fill.base.argb32.ref.png | Bin 103 -> 0 bytes + test/map-to-image-fill.base.rgb24.ref.png | Bin 103 -> 0 bytes + test/map-to-image-fill.ref.png | Bin 103 -> 0 bytes + test/mask-alpha.argb32.ref.png | Bin 596 -> 0 bytes + test/mask-alpha.base.argb32.ref.png | Bin 627 -> 0 bytes + test/mask-alpha.base.rgb24.ref.png | Bin 588 -> 0 bytes + test/mask-alpha.image16.ref.png | Bin 560 -> 0 bytes + test/mask-alpha.quartz.argb32.ref.png | Bin 622 -> 0 bytes + test/mask-alpha.rgb24.ref.png | Bin 546 -> 0 bytes + test/mask-alpha.svg.rgb24.xfail.png | Bin 585 -> 0 bytes + test/mask-alpha.xlib.ref.png | Bin 640 -> 0 bytes + test/mask-alpha.xlib.rgb24.ref.png | Bin 599 -> 0 bytes + test/mask-ctm.base.argb32.ref.png | Bin 110 -> 0 bytes + test/mask-ctm.base.rgb24.ref.png | Bin 105 -> 0 bytes + test/mask-ctm.ref.png | Bin 129 -> 0 bytes + test/mask-ctm.rgb24.ref.png | Bin 124 -> 0 bytes + test/mask-glyphs.gl.ref.png | Bin 1188669 -> 0 bytes + test/mask-glyphs.image16.ref.png | Bin 1053144 -> 0 bytes + test/mask-glyphs.pdf.ref.png | Bin 1187713 -> 0 bytes + test/mask-glyphs.ref.png | Bin 1189351 -> 0 bytes + test/mask-glyphs.svg.ref.png | Bin 1211144 -> 0 bytes + test/mask-surface-ctm.base.argb32.ref.png | Bin 110 -> 0 bytes + test/mask-surface-ctm.base.rgb24.ref.png | Bin 105 -> 0 bytes + test/mask-surface-ctm.ref.png | Bin 129 -> 0 bytes + test/mask-surface-ctm.rgb24.ref.png | Bin 124 -> 0 bytes + test/mask-transformed-image.base.argb32.ref.png | Bin 3812 -> 0 bytes + test/mask-transformed-image.base.rgb24.ref.png | Bin 3812 -> 0 bytes + test/mask-transformed-image.image16.ref.png | Bin 2748 -> 0 bytes + test/mask-transformed-image.pdf.ref.png | Bin 3528 -> 0 bytes + test/mask-transformed-image.quartz.ref.png | Bin 3909 -> 0 bytes + test/mask-transformed-image.ref.png | Bin 4516 -> 0 bytes + test/mask-transformed-similar.base.argb32.ref.png | Bin 3812 -> 0 bytes + test/mask-transformed-similar.base.rgb24.ref.png | Bin 3812 -> 0 bytes + test/mask-transformed-similar.image16.ref.png | Bin 2748 -> 0 bytes + test/mask-transformed-similar.pdf.ref.png | Bin 4213 -> 0 bytes + test/mask-transformed-similar.quartz.ref.png | Bin 3909 -> 0 bytes + test/mask-transformed-similar.ref.png | Bin 4516 -> 0 bytes + test/mask-transformed-similar.svg.ref.png | Bin 3365 -> 0 bytes + test/mask.argb32.ref.png | Bin 8218 -> 0 bytes + test/mask.base.argb32.ref.png | Bin 8451 -> 0 bytes + test/mask.base.rgb24.ref.png | Bin 7058 -> 0 bytes + test/mask.image16.ref.png | Bin 5533 -> 0 bytes + test/mask.pdf.argb32.ref.png | Bin 7866 -> 0 bytes + test/mask.pdf.rgb24.ref.png | Bin 7336 -> 0 bytes + test/mask.quartz.argb32.ref.png | Bin 10669 -> 0 bytes + test/mask.quartz.rgb24.ref.png | Bin 8354 -> 0 bytes + test/mask.rgb24.ref.png | Bin 7007 -> 0 bytes + test/mask.svg.argb32.xfail.png | Bin 8641 -> 0 bytes + test/mask.svg.rgb24.xfail.png | Bin 7199 -> 0 bytes + test/mask.xlib.ref.png | Bin 8476 -> 0 bytes + test/mask.xlib.rgb24.ref.png | Bin 7041 -> 0 bytes + test/mesh-pattern-accuracy.base.argb32.ref.png | Bin 8086 -> 0 bytes + test/mesh-pattern-accuracy.base.rgb24.ref.png | Bin 8086 -> 0 bytes + test/mesh-pattern-accuracy.image16.ref.png | Bin 7209 -> 0 bytes + test/mesh-pattern-accuracy.ref.png | Bin 8086 -> 0 bytes + test/mesh-pattern-conical.base.argb32.ref.png | Bin 8655 -> 0 bytes + test/mesh-pattern-conical.base.rgb24.ref.png | Bin 8655 -> 0 bytes + test/mesh-pattern-conical.image16.ref.png | Bin 6141 -> 0 bytes + test/mesh-pattern-conical.ref.png | Bin 8655 -> 0 bytes + ...mesh-pattern-control-points.base.argb32.ref.png | Bin 10665 -> 0 bytes + .../mesh-pattern-control-points.base.rgb24.ref.png | Bin 10665 -> 0 bytes + test/mesh-pattern-control-points.image16.ref.png | Bin 7178 -> 0 bytes + test/mesh-pattern-control-points.ref.png | Bin 10665 -> 0 bytes + test/mesh-pattern-fold.base.argb32.ref.png | Bin 52980 -> 0 bytes + test/mesh-pattern-fold.base.rgb24.ref.png | Bin 52980 -> 0 bytes + test/mesh-pattern-fold.image16.ref.png | Bin 22913 -> 0 bytes + test/mesh-pattern-fold.ref.png | Bin 52980 -> 0 bytes + test/mesh-pattern-overlap.base.argb32.ref.png | Bin 9129 -> 0 bytes + test/mesh-pattern-overlap.base.rgb24.ref.png | Bin 9129 -> 0 bytes + test/mesh-pattern-overlap.image16.ref.png | Bin 5933 -> 0 bytes + test/mesh-pattern-overlap.ref.png | Bin 9129 -> 0 bytes + test/mesh-pattern-transformed.base.argb32.ref.png | Bin 14463 -> 0 bytes + test/mesh-pattern-transformed.base.rgb24.ref.png | Bin 14463 -> 0 bytes + test/mesh-pattern-transformed.image16.ref.png | Bin 9778 -> 0 bytes + test/mesh-pattern-transformed.ref.png | Bin 14463 -> 0 bytes + test/mesh-pattern.base.argb32.ref.png | Bin 19566 -> 0 bytes + test/mesh-pattern.base.rgb24.ref.png | Bin 19566 -> 0 bytes + test/mesh-pattern.image16.ref.png | Bin 12199 -> 0 bytes + test/mesh-pattern.ref.png | Bin 19566 -> 0 bytes + test/mime-data.base.argb32.ref.png | Bin 185 -> 0 bytes + test/mime-data.base.rgb24.ref.png | Bin 185 -> 0 bytes + test/mime-data.pdf.ref.png | Bin 6482 -> 0 bytes + test/mime-data.ps.ref.png | Bin 4554 -> 0 bytes + test/mime-data.ref.png | Bin 185 -> 0 bytes + test/mime-data.script.ref.png | Bin 2041 -> 0 bytes + test/mime-data.svg.ref.png | Bin 6264 -> 0 bytes + test/mime-surface.base.argb32.ref.png | Bin 1209 -> 0 bytes + test/mime-surface.base.rgb24.ref.png | Bin 1209 -> 0 bytes + test/mime-surface.ref.png | Bin 1209 -> 0 bytes + test/miter-precision.base.argb32.ref.png | Bin 818 -> 0 bytes + test/miter-precision.base.rgb24.ref.png | Bin 818 -> 0 bytes + test/miter-precision.ps2.ref.png | Bin 865 -> 0 bytes + test/miter-precision.ps3.ref.png | Bin 865 -> 0 bytes + test/miter-precision.ref.png | Bin 931 -> 0 bytes + test/move-to-show-surface.base.argb32.ref.png | Bin 96 -> 0 bytes + test/move-to-show-surface.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/move-to-show-surface.ref.png | Bin 100 -> 0 bytes + test/new-sub-path.argb32.ref.png | Bin 331 -> 0 bytes + test/new-sub-path.base.argb32.ref.png | Bin 415 -> 0 bytes + test/new-sub-path.base.rgb24.ref.png | Bin 378 -> 0 bytes + test/new-sub-path.pdf.argb32.ref.png | Bin 512 -> 0 bytes + test/new-sub-path.ps2.argb32.ref.png | Bin 398 -> 0 bytes + test/new-sub-path.ps2.rgb24.ref.png | Bin 423 -> 0 bytes + test/new-sub-path.ps3.argb32.ref.png | Bin 398 -> 0 bytes + test/new-sub-path.ps3.rgb24.ref.png | Bin 423 -> 0 bytes + test/new-sub-path.quartz.ref.png | Bin 370 -> 0 bytes + test/new-sub-path.rgb24.ref.png | Bin 303 -> 0 bytes + test/nil-surface.base.argb32.ref.png | Bin 88 -> 0 bytes + test/nil-surface.base.rgb24.ref.png | Bin 87 -> 0 bytes + test/nil-surface.ref.png | Bin 107 -> 0 bytes + test/nil-surface.rgb24.ref.png | Bin 106 -> 0 bytes + test/operator-alpha-alpha.base.argb32.ref.png | Bin 3441 -> 0 bytes + test/operator-alpha-alpha.base.rgb24.ref.png | Bin 3441 -> 0 bytes + test/operator-alpha-alpha.image16.ref.png | Bin 4140 -> 0 bytes + test/operator-alpha-alpha.pdf.xfail.png | Bin 3749 -> 0 bytes + test/operator-alpha-alpha.ps.xfail.png | Bin 3429 -> 0 bytes + test/operator-alpha-alpha.ref.png | Bin 3441 -> 0 bytes + test/operator-alpha-alpha.svg.xfail.png | Bin 838 -> 0 bytes + test/operator-alpha.base.argb32.ref.png | Bin 280 -> 0 bytes + test/operator-alpha.base.rgb24.ref.png | Bin 205 -> 0 bytes + test/operator-alpha.ref.png | Bin 280 -> 0 bytes + test/operator-alpha.rgb24.ref.png | Bin 229 -> 0 bytes + test/operator-alpha.svg12.argb32.xfail.png | Bin 274 -> 0 bytes + test/operator-alpha.svg12.rgb24.xfail.png | Bin 248 -> 0 bytes + test/operator-clear.argb32.ref.png | Bin 1080 -> 0 bytes + test/operator-clear.base.argb32.ref.png | Bin 1070 -> 0 bytes + test/operator-clear.base.rgb24.ref.png | Bin 950 -> 0 bytes + test/operator-clear.ps2.argb32.ref.png | Bin 1156 -> 0 bytes + test/operator-clear.ps3.argb32.ref.png | Bin 1156 -> 0 bytes + test/operator-clear.quartz.argb32.ref.png | Bin 1228 -> 0 bytes + test/operator-clear.quartz.rgb24.ref.png | Bin 1096 -> 0 bytes + test/operator-clear.rgb24.ref.png | Bin 948 -> 0 bytes + test/operator-clear.svg12.argb32.xfail.png | Bin 405 -> 0 bytes + test/operator-clear.svg12.rgb24.xfail.png | Bin 535 -> 0 bytes + test/operator-clear.xlib.argb32.ref.png | Bin 1071 -> 0 bytes + test/operator-clear.xlib.rgb24.ref.png | Bin 951 -> 0 bytes + test/operator-source.base.argb32.ref.png | Bin 5630 -> 0 bytes + test/operator-source.base.rgb24.ref.png | Bin 3979 -> 0 bytes + test/operator-source.image16.ref.png | Bin 3959 -> 0 bytes + test/operator-source.ref.png | Bin 5745 -> 0 bytes + test/operator-source.rgb24.ref.png | Bin 4639 -> 0 bytes + test/operator-source.xlib-fallback.ref.png | Bin 4444 -> 0 bytes + test/operator-source.xlib.ref.png | Bin 5721 -> 0 bytes + test/operator-source.xlib.rgb24.ref.png | Bin 4447 -> 0 bytes + test/operator.base.argb32.ref.png | Bin 238 -> 0 bytes + test/operator.base.rgb24.ref.png | Bin 189 -> 0 bytes + test/operator.ref.png | Bin 238 -> 0 bytes + test/operator.rgb24.ref.png | Bin 217 -> 0 bytes + test/operator.svg12.argb32.xfail.png | Bin 238 -> 0 bytes + test/operator.svg12.rgb24.xfail.png | Bin 242 -> 0 bytes + test/over-above-source.base.argb32.ref.png | Bin 533 -> 0 bytes + test/over-above-source.base.rgb24.ref.png | Bin 450 -> 0 bytes + test/over-above-source.ps2.argb32.ref.png | Bin 558 -> 0 bytes + test/over-above-source.ps3.argb32.ref.png | Bin 558 -> 0 bytes + test/over-above-source.quartz.argb32.ref.png | Bin 511 -> 0 bytes + test/over-above-source.quartz.rgb24.ref.png | Bin 437 -> 0 bytes + test/over-above-source.ref.png | Bin 511 -> 0 bytes + test/over-above-source.rgb24.ref.png | Bin 421 -> 0 bytes + test/over-above-source.svg12.rgb24.xfail.png | Bin 563 -> 0 bytes + test/over-above-source.xlib.ref.png | Bin 538 -> 0 bytes + test/over-above-source.xlib.rgb24.ref.png | Bin 461 -> 0 bytes + test/over-around-source.base.argb32.ref.png | Bin 610 -> 0 bytes + test/over-around-source.base.rgb24.ref.png | Bin 492 -> 0 bytes + test/over-around-source.image16.ref.png | Bin 491 -> 0 bytes + test/over-around-source.pdf.argb32.ref.png | Bin 576 -> 0 bytes + test/over-around-source.ps2.argb32.ref.png | Bin 508 -> 0 bytes + test/over-around-source.ps2.rgb24.ref.png | Bin 538 -> 0 bytes + test/over-around-source.ps3.argb32.ref.png | Bin 508 -> 0 bytes + test/over-around-source.ps3.rgb24.ref.png | Bin 538 -> 0 bytes + test/over-around-source.quartz.argb32.ref.png | Bin 593 -> 0 bytes + test/over-around-source.ref.png | Bin 578 -> 0 bytes + test/over-around-source.rgb24.ref.png | Bin 257 -> 0 bytes + test/over-around-source.svg12.argb32.xfail.png | Bin 559 -> 0 bytes + test/over-around-source.svg12.rgb24.xfail.png | Bin 559 -> 0 bytes + test/over-around-source.xlib.ref.png | Bin 614 -> 0 bytes + test/over-around-source.xlib.rgb24.ref.png | Bin 503 -> 0 bytes + test/over-below-source.base.argb32.ref.png | Bin 436 -> 0 bytes + test/over-below-source.base.rgb24.ref.png | Bin 378 -> 0 bytes + test/over-below-source.pdf.argb32.ref.png | Bin 464 -> 0 bytes + test/over-below-source.ps2.argb32.ref.png | Bin 368 -> 0 bytes + test/over-below-source.ps2.rgb24.ref.png | Bin 362 -> 0 bytes + test/over-below-source.ps3.argb32.ref.png | Bin 368 -> 0 bytes + test/over-below-source.ps3.rgb24.ref.png | Bin 362 -> 0 bytes + test/over-below-source.ref.png | Bin 413 -> 0 bytes + test/over-below-source.rgb24.ref.png | Bin 322 -> 0 bytes + test/over-below-source.svg12.argb32.xfail.png | Bin 224 -> 0 bytes + test/over-below-source.svg12.rgb24.xfail.png | Bin 224 -> 0 bytes + test/over-between-source.base.argb32.ref.png | Bin 578 -> 0 bytes + test/over-between-source.base.rgb24.ref.png | Bin 461 -> 0 bytes + test/over-between-source.ps2.argb32.ref.png | Bin 551 -> 0 bytes + test/over-between-source.ps3.argb32.ref.png | Bin 551 -> 0 bytes + test/over-between-source.quartz.argb32.ref.png | Bin 551 -> 0 bytes + test/over-between-source.ref.png | Bin 561 -> 0 bytes + test/over-between-source.rgb24.ref.png | Bin 406 -> 0 bytes + test/over-between-source.svg12.argb32.xfail.png | Bin 224 -> 0 bytes + test/over-between-source.svg12.rgb24.xfail.png | Bin 224 -> 0 bytes + test/over-between-source.xlib.ref.png | Bin 575 -> 0 bytes + test/over-between-source.xlib.rgb24.ref.png | Bin 473 -> 0 bytes + test/overlapping-boxes.argb32.ref.png | Bin 179 -> 0 bytes + test/overlapping-boxes.base.argb32.ref.png | Bin 216 -> 0 bytes + test/overlapping-boxes.base.rgb24.ref.png | Bin 204 -> 0 bytes + test/overlapping-boxes.rgb24.ref.png | Bin 204 -> 0 bytes + test/overlapping-dash-caps.base.argb32.ref.png | Bin 3952 -> 0 bytes + test/overlapping-dash-caps.base.rgb24.ref.png | Bin 3952 -> 0 bytes + test/overlapping-dash-caps.ref.png | Bin 2424 -> 0 bytes + test/overlapping-glyphs.argb32.ref.png | Bin 2258 -> 0 bytes + test/overlapping-glyphs.base.argb32.ref.png | Bin 2684 -> 0 bytes + test/overlapping-glyphs.base.rgb24.ref.png | Bin 1647 -> 0 bytes + test/overlapping-glyphs.pdf.argb32.xfail.png | Bin 2199 -> 0 bytes + test/overlapping-glyphs.pdf.rgb24.xfail.png | Bin 1692 -> 0 bytes + test/overlapping-glyphs.quartz.argb32.ref.png | Bin 2824 -> 0 bytes + test/overlapping-glyphs.quartz.rgb24.ref.png | Bin 1711 -> 0 bytes + test/overlapping-glyphs.rgb24.ref.png | Bin 1390 -> 0 bytes + test/overlapping-glyphs.svg.argb32.ref.png | Bin 2338 -> 0 bytes + test/overlapping-glyphs.svg.rgb24.ref.png | Bin 2338 -> 0 bytes + test/paint-clip-fill-aa.base.argb32.ref.png | Bin 327 -> 0 bytes + test/paint-clip-fill-aa.base.rgb24.ref.png | Bin 327 -> 0 bytes + test/paint-clip-fill-aa.ref.png | Bin 352 -> 0 bytes + test/paint-clip-fill-mono.base.argb32.ref.png | Bin 327 -> 0 bytes + test/paint-clip-fill-mono.base.rgb24.ref.png | Bin 327 -> 0 bytes + test/paint-clip-fill-mono.ref.png | Bin 352 -> 0 bytes + test/paint-repeat.base.argb32.ref.png | Bin 122 -> 0 bytes + test/paint-repeat.base.rgb24.ref.png | Bin 122 -> 0 bytes + test/paint-repeat.ref.png | Bin 145 -> 0 bytes + test/paint-source-alpha.base.argb32.ref.png | Bin 224 -> 0 bytes + test/paint-source-alpha.base.rgb24.ref.png | Bin 224 -> 0 bytes + test/paint-source-alpha.image16.ref.png | Bin 253 -> 0 bytes + test/paint-source-alpha.ref.png | Bin 256 -> 0 bytes + test/paint-source-alpha.svg.ref.png | Bin 693 -> 0 bytes + .../paint-with-alpha-clip-mask.base.argb32.ref.png | Bin 305 -> 0 bytes + test/paint-with-alpha-clip-mask.base.rgb24.ref.png | Bin 305 -> 0 bytes + test/paint-with-alpha-clip-mask.ref.png | Bin 348 -> 0 bytes + test/paint-with-alpha-clip.base.argb32.ref.png | Bin 303 -> 0 bytes + test/paint-with-alpha-clip.base.rgb24.ref.png | Bin 303 -> 0 bytes + test/paint-with-alpha-clip.ref.png | Bin 290 -> 0 bytes + test/paint-with-alpha-clip.xlib.ref.png | Bin 303 -> 0 bytes + ...paint-with-alpha-solid-clip.base.argb32.ref.png | Bin 266 -> 0 bytes + .../paint-with-alpha-solid-clip.base.rgb24.ref.png | Bin 266 -> 0 bytes + test/paint-with-alpha-solid-clip.ref.png | Bin 248 -> 0 bytes + test/paint-with-alpha.base.argb32.ref.png | Bin 224 -> 0 bytes + test/paint-with-alpha.base.rgb24.ref.png | Bin 224 -> 0 bytes + test/paint-with-alpha.image16.ref.png | Bin 253 -> 0 bytes + test/paint-with-alpha.ref.png | Bin 256 -> 0 bytes + test/paint-with-alpha.svg.ref.png | Bin 483 -> 0 bytes + test/paint.base.argb32.ref.png | Bin 93 -> 0 bytes + test/paint.base.rgb24.ref.png | Bin 93 -> 0 bytes + test/paint.ref.png | Bin 116 -> 0 bytes + test/partial-clip-text-bottom.base.argb32.ref.png | Bin 259 -> 0 bytes + test/partial-clip-text-bottom.base.rgb24.ref.png | Bin 259 -> 0 bytes + test/partial-clip-text-bottom.ref.png | Bin 259 -> 0 bytes + test/partial-clip-text-left.base.argb32.ref.png | Bin 293 -> 0 bytes + test/partial-clip-text-left.base.rgb24.ref.png | Bin 293 -> 0 bytes + test/partial-clip-text-left.ref.png | Bin 293 -> 0 bytes + test/partial-clip-text-right.base.argb32.ref.png | Bin 155 -> 0 bytes + test/partial-clip-text-right.base.rgb24.ref.png | Bin 155 -> 0 bytes + test/partial-clip-text-right.ref.png | Bin 155 -> 0 bytes + test/partial-clip-text-top.base.argb32.ref.png | Bin 173 -> 0 bytes + test/partial-clip-text-top.base.rgb24.ref.png | Bin 173 -> 0 bytes + test/partial-clip-text-top.ps.ref.png | Bin 107 -> 0 bytes + test/partial-clip-text-top.quartz.ref.png | Bin 174 -> 0 bytes + test/partial-clip-text-top.ref.png | Bin 173 -> 0 bytes + test/partial-clip-text-top.svg.ref.png | Bin 173 -> 0 bytes + ...ial-coverage-half-reference.base.argb32.ref.png | Bin 189 -> 0 bytes + ...tial-coverage-half-reference.base.rgb24.ref.png | Bin 189 -> 0 bytes + test/partial-coverage-half-reference.ref.png | Bin 189 -> 0 bytes + test/partial-coverage-half-triangles.ref.png | Bin 189 -> 0 bytes + test/partial-coverage-intersecting-quads.ref.png | Bin 189 -> 0 bytes + test/partial-coverage-intersecting-quads.xfail.png | Bin 262 -> 0 bytes + ...partial-coverage-intersecting-triangles.ref.png | Bin 202 -> 0 bytes + ...tial-coverage-overlap-half-triangles-eo.ref.png | Bin 189 -> 0 bytes + ...partial-coverage-overlap-half-triangles.ref.png | Bin 189 -> 0 bytes + ...overage-overlap-three-quarter-triangles.ref.png | Bin 186 -> 0 bytes + test/partial-coverage-rectangles.ref.png | Bin 202 -> 0 bytes + .../partial-coverage-reference.base.argb32.ref.png | Bin 202 -> 0 bytes + test/partial-coverage-reference.base.rgb24.ref.png | Bin 202 -> 0 bytes + test/partial-coverage-reference.ref.png | Bin 202 -> 0 bytes + ...age-three-quarter-reference.base.argb32.ref.png | Bin 186 -> 0 bytes + ...rage-three-quarter-reference.base.rgb24.ref.png | Bin 186 -> 0 bytes + ...artial-coverage-three-quarter-reference.ref.png | Bin 186 -> 0 bytes + test/partial-coverage-triangles.ref.png | Bin 202 -> 0 bytes + test/pass-through.ref.png | Bin 221 -> 0 bytes + test/pass-through.rgb24.ref.png | Bin 179 -> 0 bytes + test/path-append.base.argb32.ref.png | Bin 6463 -> 0 bytes + test/path-append.base.rgb24.ref.png | Bin 6463 -> 0 bytes + test/path-append.image16.ref.png | Bin 5252 -> 0 bytes + test/path-append.ps.ref.png | Bin 4525 -> 0 bytes + test/path-append.quartz.ref.png | Bin 6395 -> 0 bytes + test/path-append.ref.png | Bin 4424 -> 0 bytes + test/path-append.test-fallback.ref.png | Bin 6461 -> 0 bytes + test/path-append.xlib-fallback.ref.png | Bin 6320 -> 0 bytes + test/path-append.xlib.ref.png | Bin 6461 -> 0 bytes + test/path-stroke-twice.base.argb32.ref.png | Bin 205 -> 0 bytes + test/path-stroke-twice.base.rgb24.ref.png | Bin 205 -> 0 bytes + test/path-stroke-twice.image16.ref.png | Bin 210 -> 0 bytes + test/path-stroke-twice.ps.ref.png | Bin 197 -> 0 bytes + test/path-stroke-twice.ref.png | Bin 209 -> 0 bytes + test/pattern-getters.base.argb32.ref.png | Bin 87 -> 0 bytes + test/pattern-getters.base.rgb24.ref.png | Bin 87 -> 0 bytes + test/pattern-getters.ref.png | Bin 107 -> 0 bytes + test/pdf-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/pdf-surface-source.base.argb32.ref.png | Bin 377 -> 0 bytes + test/pdf-surface-source.base.rgb24.ref.png | Bin 301 -> 0 bytes + test/pdf-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/pdf-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/pdf-surface-source.svg12.argb32.xfail.png | Bin 278 -> 0 bytes + test/pdf-surface-source.svg12.rgb24.xfail.png | Bin 278 -> 0 bytes + test/pixman-rotate.base.argb32.ref.png | Bin 260 -> 0 bytes + test/pixman-rotate.base.rgb24.ref.png | Bin 225 -> 0 bytes + test/pixman-rotate.ps.argb32.ref.png | Bin 355 -> 0 bytes + test/pixman-rotate.ref.png | Bin 260 -> 0 bytes + test/pixman-rotate.rgb24.ref.png | Bin 244 -> 0 bytes + test/ps-eps.ref.png | Bin 4584 -> 0 bytes + test/ps-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/ps-surface-source.base.argb32.ref.png | Bin 377 -> 0 bytes + test/ps-surface-source.base.rgb24.ref.png | Bin 301 -> 0 bytes + test/ps-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/ps-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/ps-surface-source.svg12.argb32.xfail.png | Bin 278 -> 0 bytes + test/ps-surface-source.svg12.rgb24.xfail.png | Bin 278 -> 0 bytes + test/pthread-same-source.base.argb32.ref.png | Bin 1000 -> 0 bytes + test/pthread-same-source.base.rgb24.ref.png | Bin 1000 -> 0 bytes + test/pthread-same-source.image16.ref.png | Bin 1007 -> 0 bytes + test/pthread-same-source.quartz.xfail.png | Bin 961 -> 0 bytes + test/pthread-same-source.ref.png | Bin 1000 -> 0 bytes + test/pthread-show-text.base.argb32.ref.png | Bin 29759 -> 0 bytes + test/pthread-show-text.base.rgb24.ref.png | Bin 29759 -> 0 bytes + test/pthread-show-text.image16.ref.png | Bin 22167 -> 0 bytes + test/pthread-show-text.pdf.ref.png | Bin 47015 -> 0 bytes + test/pthread-show-text.ps.ref.png | Bin 16558 -> 0 bytes + test/pthread-show-text.quartz.ref.png | Bin 43005 -> 0 bytes + test/pthread-show-text.ref.png | Bin 29759 -> 0 bytes + test/pthread-show-text.xlib-fallback.ref.png | Bin 42073 -> 0 bytes + test/pthread-similar.base.argb32.ref.png | Bin 170 -> 0 bytes + test/pthread-similar.base.rgb24.ref.png | Bin 170 -> 0 bytes + test/pthread-similar.ref.png | Bin 170 -> 0 bytes + test/push-group-color.base.argb32.ref.png | Bin 2902 -> 0 bytes + test/push-group-color.base.rgb24.ref.png | Bin 2902 -> 0 bytes + test/push-group-color.image16.ref.png | Bin 2277 -> 0 bytes + test/push-group-color.ps2.ref.png | Bin 2863 -> 0 bytes + test/push-group-color.ps3.ref.png | Bin 2561 -> 0 bytes + test/push-group-color.quartz.ref.png | Bin 3127 -> 0 bytes + test/push-group-color.ref.png | Bin 2676 -> 0 bytes + test/push-group-color.xlib.ref.png | Bin 2964 -> 0 bytes + test/push-group-path-offset.base.argb32.ref.png | Bin 186 -> 0 bytes + test/push-group-path-offset.base.rgb24.ref.png | Bin 186 -> 0 bytes + test/push-group-path-offset.ref.png | Bin 186 -> 0 bytes + test/push-group.base.argb32.ref.png | Bin 3110 -> 0 bytes + test/push-group.base.rgb24.ref.png | Bin 2947 -> 0 bytes + test/push-group.image16.ref.png | Bin 2286 -> 0 bytes + test/push-group.quartz.argb32.ref.png | Bin 3932 -> 0 bytes + test/push-group.quartz.rgb24.ref.png | Bin 3659 -> 0 bytes + test/push-group.ref.png | Bin 2829 -> 0 bytes + test/push-group.rgb24.ref.png | Bin 2684 -> 0 bytes + test/push-group.xlib.ref.png | Bin 3126 -> 0 bytes + test/push-group.xlib.rgb24.ref.png | Bin 2961 -> 0 bytes + test/quartz-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/quartz-surface-source.ps2.ref.png | Bin 376 -> 0 bytes + test/quartz-surface-source.ps3.ref.png | Bin 376 -> 0 bytes + test/quartz-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/radial-gradient-extend.base.argb32.ref.png | Bin 466 -> 0 bytes + test/radial-gradient-extend.base.rgb24.ref.png | Bin 466 -> 0 bytes + test/radial-gradient-extend.ps3.ref.png | Bin 458 -> 0 bytes + test/radial-gradient-extend.ref.png | Bin 466 -> 0 bytes + test/radial-gradient-mask-source.argb32.ref.png | Bin 145713 -> 0 bytes + ...radial-gradient-mask-source.base.argb32.ref.png | Bin 145713 -> 0 bytes + .../radial-gradient-mask-source.base.rgb24.ref.png | Bin 150945 -> 0 bytes + test/radial-gradient-mask-source.image16.ref.png | Bin 109925 -> 0 bytes + ...dial-gradient-mask-source.quartz.argb32.ref.png | Bin 171002 -> 0 bytes + ...adial-gradient-mask-source.quartz.rgb24.ref.png | Bin 179120 -> 0 bytes + test/radial-gradient-mask-source.rgb24.ref.png | Bin 150945 -> 0 bytes + ...radial-gradient-mask-source.xlib.argb32.ref.png | Bin 145801 -> 0 bytes + .../radial-gradient-mask-source.xlib.rgb24.ref.png | Bin 150362 -> 0 bytes + test/radial-gradient-mask.base.argb32.ref.png | Bin 286065 -> 0 bytes + test/radial-gradient-mask.base.rgb24.ref.png | Bin 286065 -> 0 bytes + test/radial-gradient-mask.image16.ref.png | Bin 204585 -> 0 bytes + test/radial-gradient-mask.quartz.ref.png | Bin 296910 -> 0 bytes + test/radial-gradient-mask.ref.png | Bin 286065 -> 0 bytes + test/radial-gradient-one-stop.base.argb32.ref.png | Bin 6306 -> 0 bytes + test/radial-gradient-one-stop.base.rgb24.ref.png | Bin 6306 -> 0 bytes + test/radial-gradient-one-stop.quartz.ref.png | Bin 6316 -> 0 bytes + test/radial-gradient-one-stop.ref.png | Bin 6306 -> 0 bytes + test/radial-gradient-source.argb32.ref.png | Bin 408848 -> 0 bytes + test/radial-gradient-source.base.argb32.ref.png | Bin 408848 -> 0 bytes + test/radial-gradient-source.base.rgb24.ref.png | Bin 263908 -> 0 bytes + test/radial-gradient-source.image16.ref.png | Bin 169796 -> 0 bytes + test/radial-gradient-source.quartz.argb32.ref.png | Bin 439222 -> 0 bytes + test/radial-gradient-source.quartz.rgb24.ref.png | Bin 279249 -> 0 bytes + test/radial-gradient-source.rgb24.ref.png | Bin 263908 -> 0 bytes + test/radial-gradient.base.argb32.ref.png | Bin 382283 -> 0 bytes + test/radial-gradient.base.rgb24.ref.png | Bin 382283 -> 0 bytes + test/radial-gradient.image16.ref.png | Bin 256686 -> 0 bytes + test/radial-gradient.quartz.ref.png | Bin 389140 -> 0 bytes + test/radial-gradient.ref.png | Bin 382283 -> 0 bytes + test/random-clip.base.argb32.ref.png | Bin 308138 -> 0 bytes + test/random-clip.base.rgb24.ref.png | Bin 308138 -> 0 bytes + test/random-clip.ref.png | Bin 311369 -> 0 bytes + ...dom-intersections-curves-eo.base.argb32.ref.png | Bin 244476 -> 0 bytes + ...ndom-intersections-curves-eo.base.rgb24.ref.png | Bin 244476 -> 0 bytes + .../random-intersections-curves-eo.image16.ref.png | Bin 181565 -> 0 bytes + test/random-intersections-curves-eo.pdf.ref.png | Bin 246507 -> 0 bytes + test/random-intersections-curves-eo.ps.ref.png | Bin 151668 -> 0 bytes + test/random-intersections-curves-eo.quartz.ref.png | Bin 326366 -> 0 bytes + test/random-intersections-curves-eo.ref.png | Bin 156582 -> 0 bytes + ...m-intersections-curves-eo.xlib-fallback.ref.png | Bin 244255 -> 0 bytes + test/random-intersections-curves-eo.xlib.ref.png | Bin 244255 -> 0 bytes + ...dom-intersections-curves-nz.base.argb32.ref.png | Bin 263669 -> 0 bytes + ...ndom-intersections-curves-nz.base.rgb24.ref.png | Bin 263669 -> 0 bytes + .../random-intersections-curves-nz.image16.ref.png | Bin 204090 -> 0 bytes + test/random-intersections-curves-nz.pdf.ref.png | Bin 266977 -> 0 bytes + test/random-intersections-curves-nz.ps.ref.png | Bin 134746 -> 0 bytes + test/random-intersections-curves-nz.quartz.ref.png | Bin 324940 -> 0 bytes + test/random-intersections-curves-nz.ref.png | Bin 151318 -> 0 bytes + ...m-intersections-curves-nz.xlib-fallback.ref.png | Bin 264277 -> 0 bytes + test/random-intersections-curves-nz.xlib.ref.png | Bin 264277 -> 0 bytes + test/random-intersections-eo.base.argb32.ref.png | Bin 134729 -> 0 bytes + test/random-intersections-eo.base.rgb24.ref.png | Bin 134729 -> 0 bytes + test/random-intersections-eo.image16.ref.png | Bin 97747 -> 0 bytes + test/random-intersections-eo.ps.ref.png | Bin 78037 -> 0 bytes + test/random-intersections-eo.quartz.ref.png | Bin 179179 -> 0 bytes + test/random-intersections-eo.ref.png | Bin 85197 -> 0 bytes + test/random-intersections-eo.xlib.ref.png | Bin 134655 -> 0 bytes + ...andom-intersections-nonzero.base.argb32.ref.png | Bin 141616 -> 0 bytes + ...random-intersections-nonzero.base.rgb24.ref.png | Bin 141616 -> 0 bytes + test/random-intersections-nonzero.image16.ref.png | Bin 107644 -> 0 bytes + test/random-intersections-nonzero.ps.ref.png | Bin 76450 -> 0 bytes + test/random-intersections-nonzero.quartz.ref.png | Bin 180871 -> 0 bytes + test/random-intersections-nonzero.ref.png | Bin 83247 -> 0 bytes + test/random-intersections-nonzero.xlib.ref.png | Bin 141548 -> 0 bytes + test/record-extend-none-similar.ref.png | Bin 293 -> 0 bytes + test/record-extend-none.ref.png | Bin 293 -> 0 bytes + test/record-extend-pad-similar.ref.png | Bin 298 -> 0 bytes + test/record-extend-pad.ref.png | Bin 298 -> 0 bytes + test/record-extend-reflect-similar.ref.png | Bin 335 -> 0 bytes + test/record-extend-reflect.ref.png | Bin 335 -> 0 bytes + test/record-extend-repeat-similar.ref.png | Bin 286 -> 0 bytes + test/record-extend-repeat.ref.png | Bin 286 -> 0 bytes + test/record-fill-alpha.ref.png | Bin 2173 -> 0 bytes + test/record-mesh.ref.png | Bin 15229 -> 0 bytes + test/record-paint-alpha-clip-mask.ref.png | Bin 325 -> 0 bytes + test/record-paint-alpha-clip.ref.png | Bin 299 -> 0 bytes + test/record-paint-alpha-solid-clip.ref.png | Bin 248 -> 0 bytes + test/record-paint-alpha.ref.png | Bin 256 -> 0 bytes + test/record-paint.ref.png | Bin 116 -> 0 bytes + test/record-select-font-face.ref.png | Bin 2473 -> 0 bytes + test/record-self-intersecting.ref.png | Bin 168 -> 0 bytes + test/record-text-transform.ref.png | Bin 6200 -> 0 bytes + test/recording-surface-extend-none.argb32.ref.png | Bin 3051 -> 0 bytes + ...cording-surface-extend-none.base.argb32.ref.png | Bin 3055 -> 0 bytes + ...ecording-surface-extend-none.base.rgb24.ref.png | Bin 3124 -> 0 bytes + test/recording-surface-extend-none.rgb24.ref.png | Bin 3128 -> 0 bytes + test/recording-surface-extend-pad.argb32.ref.png | Bin 10822 -> 0 bytes + ...ecording-surface-extend-pad.base.argb32.ref.png | Bin 10832 -> 0 bytes + ...recording-surface-extend-pad.base.rgb24.ref.png | Bin 12496 -> 0 bytes + test/recording-surface-extend-pad.rgb24.ref.png | Bin 12582 -> 0 bytes + ...recording-surface-extend-reflect.argb32.ref.png | Bin 23518 -> 0 bytes + ...ding-surface-extend-reflect.base.argb32.ref.png | Bin 23617 -> 0 bytes + ...rding-surface-extend-reflect.base.rgb24.ref.png | Bin 24139 -> 0 bytes + .../recording-surface-extend-reflect.rgb24.ref.png | Bin 23881 -> 0 bytes + .../recording-surface-extend-repeat.argb32.ref.png | Bin 24047 -> 0 bytes + ...rding-surface-extend-repeat.base.argb32.ref.png | Bin 24112 -> 0 bytes + ...ording-surface-extend-repeat.base.rgb24.ref.png | Bin 24029 -> 0 bytes + test/recording-surface-extend-repeat.rgb24.ref.png | Bin 24038 -> 0 bytes + test/recording-surface-over.base.argb32.ref.png | Bin 3055 -> 0 bytes + test/recording-surface-over.base.rgb24.ref.png | Bin 3124 -> 0 bytes + test/recording-surface-over.gl.argb32.ref.png | Bin 3130 -> 0 bytes + test/recording-surface-over.image16.ref.png | Bin 2856 -> 0 bytes + test/recording-surface-over.pdf.argb32.ref.png | Bin 3908 -> 0 bytes + test/recording-surface-over.pdf.rgb24.ref.png | Bin 3760 -> 0 bytes + test/recording-surface-over.ps.argb32.ref.png | Bin 3064 -> 0 bytes + test/recording-surface-over.ps.rgb24.ref.png | Bin 3147 -> 0 bytes + test/recording-surface-over.quartz.argb32.ref.png | Bin 4570 -> 0 bytes + test/recording-surface-over.quartz.rgb24.ref.png | Bin 4058 -> 0 bytes + test/recording-surface-over.ref.png | Bin 3072 -> 0 bytes + test/recording-surface-over.rgb24.ref.png | Bin 3128 -> 0 bytes + test/recording-surface-over.svg.argb32.ref.png | Bin 3778 -> 0 bytes + test/recording-surface-over.svg.rgb24.ref.png | Bin 3760 -> 0 bytes + test/recording-surface-over.xlib.argb32.ref.png | Bin 3055 -> 0 bytes + test/recording-surface-over.xlib.rgb24.ref.png | Bin 3124 -> 0 bytes + test/recording-surface-source.argb32.ref.png | Bin 3044 -> 0 bytes + test/recording-surface-source.base.argb32.ref.png | Bin 3049 -> 0 bytes + test/recording-surface-source.base.rgb24.ref.png | Bin 3121 -> 0 bytes + test/recording-surface-source.rgb24.ref.png | Bin 3133 -> 0 bytes + test/rectangle-rounding-error.base.argb32.ref.png | Bin 212 -> 0 bytes + test/rectangle-rounding-error.base.rgb24.ref.png | Bin 212 -> 0 bytes + test/rectangle-rounding-error.ref.png | Bin 231 -> 0 bytes + test/rectilinear-dash.base.argb32.ref.png | Bin 291 -> 0 bytes + test/rectilinear-dash.base.rgb24.ref.png | Bin 291 -> 0 bytes + test/rectilinear-dash.quartz.xfail.png | Bin 494 -> 0 bytes + test/rectilinear-dash.ref.png | Bin 291 -> 0 bytes + test/rectilinear-fill.base.argb32.ref.png | Bin 151 -> 0 bytes + test/rectilinear-fill.base.rgb24.ref.png | Bin 151 -> 0 bytes + test/rectilinear-fill.ref.png | Bin 162 -> 0 bytes + test/rectilinear-grid.base.argb32.ref.png | Bin 610 -> 0 bytes + test/rectilinear-grid.base.rgb24.ref.png | Bin 610 -> 0 bytes + test/rectilinear-grid.image16.ref.png | Bin 638 -> 0 bytes + test/rectilinear-grid.ref.png | Bin 569 -> 0 bytes + test/rectilinear-miter-limit.base.argb32.ref.png | Bin 145 -> 0 bytes + test/rectilinear-miter-limit.base.rgb24.ref.png | Bin 145 -> 0 bytes + test/rectilinear-miter-limit.ps2.ref.png | Bin 221 -> 0 bytes + test/rectilinear-miter-limit.ps3.ref.png | Bin 221 -> 0 bytes + test/rectilinear-miter-limit.ref.png | Bin 145 -> 0 bytes + test/rectilinear-stroke.base.argb32.ref.png | Bin 172 -> 0 bytes + test/rectilinear-stroke.base.rgb24.ref.png | Bin 172 -> 0 bytes + test/rectilinear-stroke.quartz.xfail.png | Bin 209 -> 0 bytes + test/rectilinear-stroke.ref.png | Bin 213 -> 0 bytes + test/reference/a1-bug.base.argb32.ref.png | Bin 0 -> 3362 bytes + test/reference/a1-bug.base.rgb24.ref.png | Bin 0 -> 3362 bytes + test/reference/a1-bug.image16.ref.png | Bin 0 -> 3329 bytes + test/reference/a1-bug.quartz.xfail.png | Bin 0 -> 3195 bytes + test/reference/a1-bug.ref.png | Bin 0 -> 3220 bytes + test/reference/a1-bug.xlib.ref.png | Bin 0 -> 3362 bytes + .../a1-clip-fill-equal.base.argb32.ref.png | Bin 0 -> 120 bytes + .../a1-clip-fill-equal.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill-equal.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill-rule.argb32.ref.png | Bin 0 -> 236 bytes + .../a1-clip-fill-rule.base.argb32.ref.png | Bin 0 -> 236 bytes + .../reference/a1-clip-fill-rule.base.rgb24.ref.png | Bin 0 -> 218 bytes + test/reference/a1-clip-fill-rule.rgb24.ref.png | Bin 0 -> 218 bytes + test/reference/a1-clip-fill.base.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-fill.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.base.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-paint.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.base.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-clip-stroke.ref.png | Bin 0 -> 120 bytes + test/reference/a1-image-sample.base.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.base.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-image-sample.gl.xfail.png | Bin 0 -> 120 bytes + test/reference/a1-image-sample.ref.png | Bin 0 -> 148 bytes + test/reference/a1-line-width.base.argb32.ref.png | Bin 0 -> 154 bytes + test/reference/a1-line-width.base.rgb24.ref.png | Bin 0 -> 154 bytes + test/reference/a1-line-width.pdf.ref.png | Bin 0 -> 177 bytes + test/reference/a1-line-width.ps.ref.png | Bin 0 -> 179 bytes + test/reference/a1-line-width.ref.png | Bin 0 -> 154 bytes + test/reference/a1-mask-sample.base.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask-sample.base.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/a1-mask-sample.ref.png | Bin 0 -> 148 bytes + test/reference/a1-mask.base.argb32.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.base.rgb24.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.pdf.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.ps.ref.png | Bin 0 -> 106 bytes + test/reference/a1-mask.ref.png | Bin 0 -> 131 bytes + ...a1-rasterisation-rectangles.base.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-rectangles.base.rgb24.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-rectangles.quartz.xfail.png | Bin 0 -> 2583 bytes + test/reference/a1-rasterisation-rectangles.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.base.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.base.rgb24.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.quartz.xfail.png | Bin 0 -> 2583 bytes + test/reference/a1-rasterisation-triangles.ref.png | Bin 0 -> 1729 bytes + .../a1-rectilinear-grid.base.argb32.ref.png | Bin 0 -> 207 bytes + .../a1-rectilinear-grid.base.rgb24.ref.png | Bin 0 -> 207 bytes + test/reference/a1-rectilinear-grid.ref.png | Bin 0 -> 207 bytes + test/reference/a1-sample.base.argb32.ref.png | Bin 0 -> 786 bytes + test/reference/a1-sample.base.rgb24.ref.png | Bin 0 -> 786 bytes + test/reference/a1-sample.ref.png | Bin 0 -> 786 bytes + test/reference/a1-tiger.base.argb32.ref.png | Bin 0 -> 20406 bytes + test/reference/a1-tiger.base.rgb24.ref.png | Bin 0 -> 20406 bytes + test/reference/a1-tiger.ref.png | Bin 0 -> 20330 bytes + test/reference/a1-traps-sample.base.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/a1-traps-sample.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/a1-traps-sample.quartz.xfail.png | Bin 0 -> 122 bytes + test/reference/a1-traps-sample.ref.png | Bin 0 -> 120 bytes + test/reference/a8-clear.base.argb32.ref.png | Bin 0 -> 248 bytes + test/reference/a8-clear.base.rgb24.ref.png | Bin 0 -> 248 bytes + test/reference/a8-clear.quartz.ref.png | Bin 0 -> 244 bytes + test/reference/a8-clear.ref.png | Bin 0 -> 272 bytes + test/reference/a8-mask.base.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/a8-mask.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/a8-mask.ref.png | Bin 0 -> 128 bytes + test/reference/aliasing.base.argb32.ref.png | Bin 0 -> 103722 bytes + test/reference/aliasing.base.rgb24.ref.png | Bin 0 -> 103722 bytes + test/reference/aliasing.image16.ref.png | Bin 0 -> 97251 bytes + test/reference/aliasing.quartz.ref.png | Bin 0 -> 108801 bytes + test/reference/aliasing.ref.png | Bin 0 -> 76314 bytes + test/reference/aliasing.xlib.ref.png | Bin 0 -> 104315 bytes + test/reference/alpha-similar.base.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.base.rgb24.ref.png | Bin 0 -> 88 bytes + test/reference/alpha-similar.gl.argb32.xfail.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.gl.rgb24.xfail.png | Bin 0 -> 93 bytes + test/reference/alpha-similar.pdf.argb32.xfail.png | Bin 0 -> 95 bytes + test/reference/alpha-similar.pdf.rgb24.xfail.png | Bin 0 -> 93 bytes + test/reference/alpha-similar.ps.argb32.xfail.png | Bin 0 -> 95 bytes + test/reference/alpha-similar.ps.rgb24.xfail.png | Bin 0 -> 93 bytes + test/reference/alpha-similar.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.rgb24.ref.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.svg.argb32.xfail.png | Bin 0 -> 99 bytes + test/reference/alpha-similar.svg.rgb24.xfail.png | Bin 0 -> 95 bytes + .../api-special-cases.base.argb32.ref.png | Bin 0 -> 95 bytes + .../reference/api-special-cases.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/api-special-cases.ref.png | Bin 0 -> 95 bytes + .../arc-infinite-loop.base.argb32.ref.png | Bin 0 -> 96 bytes + .../reference/arc-infinite-loop.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/arc-infinite-loop.ref.png | Bin 0 -> 96 bytes + .../reference/arc-looping-dash.base.argb32.ref.png | Bin 0 -> 470 bytes + test/reference/arc-looping-dash.base.rgb24.ref.png | Bin 0 -> 470 bytes + test/reference/arc-looping-dash.image16.ref.png | Bin 0 -> 450 bytes + test/reference/arc-looping-dash.ps.ref.png | Bin 0 -> 377 bytes + test/reference/arc-looping-dash.quartz.ref.png | Bin 0 -> 470 bytes + test/reference/arc-looping-dash.ref.png | Bin 0 -> 348 bytes + test/reference/big-empty-box.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/big-empty-box.base.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/big-empty-box.base.rgb24.ref.png | Bin 0 -> 108 bytes + test/reference/big-empty-box.rgb24.ref.png | Bin 0 -> 108 bytes + test/reference/big-empty-triangle.argb32.ref.png | Bin 0 -> 111 bytes + .../big-empty-triangle.base.argb32.ref.png | Bin 0 -> 111 bytes + .../big-empty-triangle.base.rgb24.ref.png | Bin 0 -> 108 bytes + test/reference/big-empty-triangle.rgb24.ref.png | Bin 0 -> 108 bytes + test/reference/big-line.base.argb32.ref.png | Bin 0 -> 933 bytes + test/reference/big-line.base.rgb24.ref.png | Bin 0 -> 933 bytes + test/reference/big-line.image16.ref.png | Bin 0 -> 988 bytes + test/reference/big-line.ps.ref.png | Bin 0 -> 946 bytes + test/reference/big-line.quartz.ref.png | Bin 0 -> 993 bytes + test/reference/big-line.ref.png | Bin 0 -> 897 bytes + test/reference/big-line.xlib.ref.png | Bin 0 -> 933 bytes + test/reference/big-little-box.argb32.ref.png | Bin 0 -> 169 bytes + test/reference/big-little-box.base.argb32.ref.png | Bin 0 -> 169 bytes + test/reference/big-little-box.base.rgb24.ref.png | Bin 0 -> 160 bytes + test/reference/big-little-box.rgb24.ref.png | Bin 0 -> 160 bytes + test/reference/big-little-triangle.argb32.ref.png | Bin 0 -> 408 bytes + .../big-little-triangle.base.argb32.ref.png | Bin 0 -> 399 bytes + .../big-little-triangle.base.rgb24.ref.png | Bin 0 -> 320 bytes + test/reference/big-little-triangle.rgb24.ref.png | Bin 0 -> 324 bytes + test/reference/big-trap.base.argb32.ref.png | Bin 0 -> 319 bytes + test/reference/big-trap.base.rgb24.ref.png | Bin 0 -> 319 bytes + test/reference/bilevel-image.base.argb32.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-image.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/bilevel-image.ref.png | Bin 0 -> 131 bytes + test/reference/bitmap-font.base.argb32.ref.png | Bin 0 -> 931 bytes + test/reference/bitmap-font.base.rgb24.ref.png | Bin 0 -> 871 bytes + test/reference/bitmap-font.ref.png | Bin 0 -> 950 bytes + test/reference/bitmap-font.rgb24.ref.png | Bin 0 -> 890 bytes + test/reference/bug-40410.base.argb32.ref.png | Bin 0 -> 428 bytes + test/reference/bug-40410.base.rgb24.ref.png | Bin 0 -> 428 bytes + test/reference/bug-40410.ref.png | Bin 0 -> 428 bytes + .../bug-bo-rectangular.base.argb32.ref.png | Bin 0 -> 950 bytes + .../bug-bo-rectangular.base.rgb24.ref.png | Bin 0 -> 950 bytes + test/reference/bug-bo-rectangular.image16.ref.png | Bin 0 -> 955 bytes + test/reference/bug-bo-rectangular.ps.xfail.png | Bin 0 -> 945 bytes + test/reference/bug-bo-rectangular.ref.png | Bin 0 -> 950 bytes + test/reference/bug-extents.base.argb32.ref.png | Bin 0 -> 9250 bytes + test/reference/bug-extents.base.rgb24.ref.png | Bin 0 -> 9250 bytes + test/reference/bug-extents.image16.ref.png | Bin 0 -> 7576 bytes + test/reference/bug-extents.ps.ref.png | Bin 0 -> 5844 bytes + test/reference/bug-extents.quartz.ref.png | Bin 0 -> 9310 bytes + test/reference/bug-extents.ref.png | Bin 0 -> 6364 bytes + test/reference/bug-extents.xlib.ref.png | Bin 0 -> 9234 bytes + test/reference/bug-seams.base.argb32.ref.png | Bin 0 -> 1606 bytes + test/reference/bug-seams.base.rgb24.ref.png | Bin 0 -> 1606 bytes + test/reference/bug-seams.ref.png | Bin 0 -> 1364 bytes + test/reference/bug-seams.xlib-fallback.ref.png | Bin 0 -> 2133 bytes + test/reference/bug-seams.xlib.ref.png | Bin 0 -> 1606 bytes + .../reference/caps-joins-alpha.base.argb32.ref.png | Bin 0 -> 2278 bytes + test/reference/caps-joins-alpha.base.rgb24.ref.png | Bin 0 -> 2278 bytes + test/reference/caps-joins-alpha.image16.ref.png | Bin 0 -> 2268 bytes + test/reference/caps-joins-alpha.quartz.ref.png | Bin 0 -> 2466 bytes + test/reference/caps-joins-alpha.ref.png | Bin 0 -> 2345 bytes + test/reference/caps-joins-alpha.xlib.ref.png | Bin 0 -> 2278 bytes + .../reference/caps-joins-curve.base.argb32.ref.png | Bin 0 -> 5368 bytes + test/reference/caps-joins-curve.base.rgb24.ref.png | Bin 0 -> 5368 bytes + test/reference/caps-joins-curve.image16.ref.png | Bin 0 -> 4928 bytes + test/reference/caps-joins-curve.ps.ref.png | Bin 0 -> 3715 bytes + test/reference/caps-joins-curve.quartz.ref.png | Bin 0 -> 5199 bytes + test/reference/caps-joins-curve.ref.png | Bin 0 -> 4527 bytes + test/reference/caps-joins-curve.xlib.ref.png | Bin 0 -> 5126 bytes + test/reference/caps-joins.base.argb32.ref.png | Bin 0 -> 2374 bytes + test/reference/caps-joins.base.rgb24.ref.png | Bin 0 -> 2374 bytes + test/reference/caps-joins.image16.ref.png | Bin 0 -> 2587 bytes + test/reference/caps-joins.ps.ref.png | Bin 0 -> 2268 bytes + test/reference/caps-joins.ref.png | Bin 0 -> 2621 bytes + test/reference/caps-sub-paths.base.argb32.ref.png | Bin 0 -> 166 bytes + test/reference/caps-sub-paths.base.rgb24.ref.png | Bin 0 -> 166 bytes + test/reference/caps-sub-paths.image16.ref.png | Bin 0 -> 171 bytes + test/reference/caps-sub-paths.ps.ref.png | Bin 0 -> 163 bytes + test/reference/caps-sub-paths.ref.png | Bin 0 -> 176 bytes + .../reference/caps-tails-curve.base.argb32.ref.png | Bin 0 -> 50228 bytes + test/reference/caps-tails-curve.base.rgb24.ref.png | Bin 0 -> 50228 bytes + test/reference/caps-tails-curve.ps.ref.png | Bin 0 -> 39753 bytes + test/reference/caps-tails-curve.ref.png | Bin 0 -> 41476 bytes + test/reference/caps.base.argb32.ref.png | Bin 0 -> 1601 bytes + test/reference/caps.base.rgb24.ref.png | Bin 0 -> 1601 bytes + test/reference/caps.image16.ref.png | Bin 0 -> 1936 bytes + test/reference/caps.ps.ref.png | Bin 0 -> 1478 bytes + test/reference/caps.ref.png | Bin 0 -> 1687 bytes + test/reference/checkerboard.base.argb32.ref.png | Bin 0 -> 142 bytes + test/reference/checkerboard.base.rgb24.ref.png | Bin 0 -> 142 bytes + test/reference/checkerboard.ref.png | Bin 0 -> 142 bytes + test/reference/clear-source.base.argb32.ref.png | Bin 0 -> 779 bytes + test/reference/clear-source.base.rgb24.ref.png | Bin 0 -> 779 bytes + test/reference/clear-source.image16.ref.png | Bin 0 -> 909 bytes + test/reference/clear-source.pdf.xfail.png | Bin 0 -> 974 bytes + test/reference/clear-source.ps.xfail.png | Bin 0 -> 552 bytes + test/reference/clear-source.ref.png | Bin 0 -> 779 bytes + test/reference/clear.argb32.ref.png | Bin 0 -> 539 bytes + test/reference/clear.base.argb32.ref.png | Bin 0 -> 673 bytes + test/reference/clear.base.rgb24.ref.png | Bin 0 -> 614 bytes + test/reference/clear.pdf.argb32.ref.png | Bin 0 -> 790 bytes + test/reference/clear.ps.argb32.ref.png | Bin 0 -> 790 bytes + test/reference/clear.quartz.argb32.ref.png | Bin 0 -> 691 bytes + test/reference/clear.quartz.rgb24.ref.png | Bin 0 -> 606 bytes + test/reference/clear.rgb24.ref.png | Bin 0 -> 484 bytes + test/reference/clear.svg12.argb32.xfail.png | Bin 0 -> 170 bytes + test/reference/clear.svg12.rgb24.xfail.png | Bin 0 -> 170 bytes + test/reference/clip-all.base.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-all.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-all.ref.png | Bin 0 -> 118 bytes + .../clip-complex-shape-eo-aa.base.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-aa.base.rgb24.ref.png | Bin 0 -> 325 bytes + test/reference/clip-complex-shape-eo-aa.ref.png | Bin 0 -> 349 bytes + .../clip-complex-shape-eo-mono.base.argb32.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.base.rgb24.ref.png | Bin 0 -> 325 bytes + test/reference/clip-complex-shape-eo-mono.ref.png | Bin 0 -> 349 bytes + test/reference/clip-contexts.base.argb32.ref.png | Bin 0 -> 98 bytes + test/reference/clip-contexts.base.rgb24.ref.png | Bin 0 -> 98 bytes + test/reference/clip-contexts.ref.png | Bin 0 -> 98 bytes + test/reference/clip-device-offset.argb32.ref.png | Bin 0 -> 175 bytes + .../clip-device-offset.base.argb32.ref.png | Bin 0 -> 175 bytes + .../clip-device-offset.base.rgb24.ref.png | Bin 0 -> 168 bytes + test/reference/clip-device-offset.rgb24.ref.png | Bin 0 -> 168 bytes + .../clip-disjoint-hatching.base.argb32.ref.png | Bin 0 -> 8021 bytes + .../clip-disjoint-hatching.base.rgb24.ref.png | Bin 0 -> 8021 bytes + test/reference/clip-disjoint-hatching.ref.png | Bin 0 -> 4390 bytes + test/reference/clip-disjoint.base.argb32.ref.png | Bin 0 -> 5411 bytes + test/reference/clip-disjoint.base.rgb24.ref.png | Bin 0 -> 5411 bytes + test/reference/clip-disjoint.image16.ref.png | Bin 0 -> 3886 bytes + test/reference/clip-disjoint.ps.ref.png | Bin 0 -> 4037 bytes + test/reference/clip-disjoint.quartz.ref.png | Bin 0 -> 5476 bytes + test/reference/clip-disjoint.ref.png | Bin 0 -> 3934 bytes + test/reference/clip-disjoint.xlib.ref.png | Bin 0 -> 5395 bytes + .../reference/clip-empty-group.base.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-group.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-group.ref.png | Bin 0 -> 103 bytes + test/reference/clip-empty-save.base.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty-save.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty-save.ref.png | Bin 0 -> 118 bytes + test/reference/clip-empty.base.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/clip-empty.ref.png | Bin 0 -> 118 bytes + .../clip-fill-eo-unbounded.argb32.ref.png | Bin 0 -> 3970 bytes + .../clip-fill-eo-unbounded.base.argb32.ref.png | Bin 0 -> 3693 bytes + .../clip-fill-eo-unbounded.base.rgb24.ref.png | Bin 0 -> 3198 bytes + .../clip-fill-eo-unbounded.image16.ref.png | Bin 0 -> 2887 bytes + .../clip-fill-eo-unbounded.quartz.argb32.ref.png | Bin 0 -> 3382 bytes + .../clip-fill-eo-unbounded.quartz.rgb24.ref.png | Bin 0 -> 2941 bytes + .../reference/clip-fill-eo-unbounded.rgb24.ref.png | Bin 0 -> 3201 bytes + .../clip-fill-eo-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3636 bytes + ...p-fill-eo-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3208 bytes + .../clip-fill-eo-unbounded.xlib.argb32.ref.png | Bin 0 -> 3693 bytes + .../clip-fill-eo-unbounded.xlib.rgb24.ref.png | Bin 0 -> 3198 bytes + test/reference/clip-fill-no-op.base.argb32.ref.png | Bin 0 -> 152 bytes + test/reference/clip-fill-no-op.base.rgb24.ref.png | Bin 0 -> 152 bytes + test/reference/clip-fill-no-op.image16.ref.png | Bin 0 -> 153 bytes + test/reference/clip-fill-no-op.ref.png | Bin 0 -> 152 bytes + .../clip-fill-nz-unbounded.argb32.ref.png | Bin 0 -> 3970 bytes + .../clip-fill-nz-unbounded.base.argb32.ref.png | Bin 0 -> 3693 bytes + .../clip-fill-nz-unbounded.base.rgb24.ref.png | Bin 0 -> 3198 bytes + .../clip-fill-nz-unbounded.image16.ref.png | Bin 0 -> 2887 bytes + .../clip-fill-nz-unbounded.quartz.argb32.ref.png | Bin 0 -> 3382 bytes + .../clip-fill-nz-unbounded.quartz.rgb24.ref.png | Bin 0 -> 2941 bytes + .../reference/clip-fill-nz-unbounded.rgb24.ref.png | Bin 0 -> 3201 bytes + .../clip-fill-nz-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3636 bytes + ...p-fill-nz-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3208 bytes + .../clip-fill-nz-unbounded.xlib.argb32.ref.png | Bin 0 -> 3693 bytes + .../clip-fill-nz-unbounded.xlib.rgb24.ref.png | Bin 0 -> 3198 bytes + ...lip-fill-rule-pixel-aligned.base.argb32.ref.png | Bin 0 -> 176 bytes + ...clip-fill-rule-pixel-aligned.base.rgb24.ref.png | Bin 0 -> 165 bytes + .../reference/clip-fill-rule-pixel-aligned.ref.png | Bin 0 -> 195 bytes + .../clip-fill-rule-pixel-aligned.rgb24.ref.png | Bin 0 -> 184 bytes + test/reference/clip-fill-rule.argb32.ref.png | Bin 0 -> 371 bytes + test/reference/clip-fill-rule.base.argb32.ref.png | Bin 0 -> 412 bytes + test/reference/clip-fill-rule.base.rgb24.ref.png | Bin 0 -> 361 bytes + test/reference/clip-fill-rule.image16.ref.png | Bin 0 -> 356 bytes + test/reference/clip-fill-rule.pdf.argb32.ref.png | Bin 0 -> 509 bytes + test/reference/clip-fill-rule.ps.argb32.ref.png | Bin 0 -> 251 bytes + test/reference/clip-fill-rule.ps.rgb24.ref.png | Bin 0 -> 234 bytes + test/reference/clip-fill-rule.quartz.rgb24.ref.png | Bin 0 -> 363 bytes + test/reference/clip-fill-rule.rgb24.ref.png | Bin 0 -> 338 bytes + .../clip-fill-rule.test-paginated.rgb24.ref.png | Bin 0 -> 361 bytes + test/reference/clip-fill-rule.xlib.rgb24.ref.png | Bin 0 -> 380 bytes + test/reference/clip-fill.base.argb32.ref.png | Bin 0 -> 1049 bytes + test/reference/clip-fill.base.rgb24.ref.png | Bin 0 -> 1049 bytes + test/reference/clip-fill.image16.ref.png | Bin 0 -> 904 bytes + test/reference/clip-fill.ps.xfail.png | Bin 0 -> 522 bytes + test/reference/clip-fill.quartz.ref.png | Bin 0 -> 875 bytes + test/reference/clip-fill.ref.png | Bin 0 -> 836 bytes + test/reference/clip-fill.xlib-fallback.ref.png | Bin 0 -> 1063 bytes + test/reference/clip-fill.xlib.ref.png | Bin 0 -> 1049 bytes + ...p-shapes-aligned-rectangles.base.argb32.ref.png | Bin 0 -> 378 bytes + ...up-shapes-aligned-rectangles.base.rgb24.ref.png | Bin 0 -> 378 bytes + .../clip-group-shapes-aligned-rectangles.ref.png | Bin 0 -> 378 bytes + .../clip-group-shapes-circles.base.argb32.ref.png | Bin 0 -> 1534 bytes + .../clip-group-shapes-circles.base.rgb24.ref.png | Bin 0 -> 1534 bytes + .../reference/clip-group-shapes-circles.ps.ref.png | Bin 0 -> 678 bytes + .../clip-group-shapes-circles.quartz.ref.png | Bin 0 -> 1518 bytes + test/reference/clip-group-shapes-circles.ref.png | Bin 0 -> 1180 bytes + .../clip-group-shapes-circles.xlib.ref.png | Bin 0 -> 1534 bytes + ...shapes-unaligned-rectangles.base.argb32.ref.png | Bin 0 -> 431 bytes + ...-shapes-unaligned-rectangles.base.rgb24.ref.png | Bin 0 -> 431 bytes + .../clip-group-shapes-unaligned-rectangles.ref.png | Bin 0 -> 415 bytes + ...-group-shapes-unaligned-rectangles.xlib.ref.png | Bin 0 -> 431 bytes + test/reference/clip-image.base.argb32.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-image.base.rgb24.ref.png | Bin 0 -> 2686 bytes + test/reference/clip-image.image16.ref.png | Bin 0 -> 2032 bytes + test/reference/clip-image.ps.ref.png | Bin 0 -> 2498 bytes + test/reference/clip-image.ref.png | Bin 0 -> 2679 bytes + test/reference/clip-intersect.base.argb32.ref.png | Bin 0 -> 193 bytes + test/reference/clip-intersect.base.rgb24.ref.png | Bin 0 -> 193 bytes + test/reference/clip-intersect.ref.png | Bin 0 -> 201 bytes + .../clip-mixed-antialias.base.argb32.ref.png | Bin 0 -> 1094 bytes + .../clip-mixed-antialias.base.rgb24.ref.png | Bin 0 -> 1094 bytes + test/reference/clip-mixed-antialias.ref.png | Bin 0 -> 981 bytes + test/reference/clip-nesting.argb32.ref.png | Bin 0 -> 1072 bytes + test/reference/clip-nesting.base.argb32.ref.png | Bin 0 -> 1031 bytes + test/reference/clip-nesting.base.rgb24.ref.png | Bin 0 -> 936 bytes + test/reference/clip-nesting.pdf.argb32.ref.png | Bin 0 -> 850 bytes + test/reference/clip-nesting.ps.argb32.ref.png | Bin 0 -> 441 bytes + test/reference/clip-nesting.ps.rgb24.ref.png | Bin 0 -> 492 bytes + test/reference/clip-nesting.quartz.argb32.ref.png | Bin 0 -> 1048 bytes + test/reference/clip-nesting.quartz.rgb24.ref.png | Bin 0 -> 937 bytes + test/reference/clip-nesting.rgb24.ref.png | Bin 0 -> 949 bytes + .../clip-nesting.test-paginated.rgb24.ref.png | Bin 0 -> 936 bytes + test/reference/clip-nesting.xlib.rgb24.ref.png | Bin 0 -> 955 bytes + test/reference/clip-operator.base.argb32.ref.png | Bin 0 -> 8171 bytes + test/reference/clip-operator.base.rgb24.ref.png | Bin 0 -> 3231 bytes + test/reference/clip-operator.gl.argb32.ref.png | Bin 0 -> 8296 bytes + test/reference/clip-operator.image16.ref.png | Bin 0 -> 3131 bytes + test/reference/clip-operator.pdf.argb32.ref.png | Bin 0 -> 8792 bytes + test/reference/clip-operator.pdf.rgb24.ref.png | Bin 0 -> 4683 bytes + test/reference/clip-operator.ps2.rgb24.ref.png | Bin 0 -> 3736 bytes + test/reference/clip-operator.ps3.argb32.ref.png | Bin 0 -> 7576 bytes + test/reference/clip-operator.ps3.ref.png | Bin 0 -> 8188 bytes + test/reference/clip-operator.ps3.rgb24.ref.png | Bin 0 -> 3736 bytes + test/reference/clip-operator.quartz.argb32.ref.png | Bin 0 -> 9672 bytes + test/reference/clip-operator.quartz.rgb24.ref.png | Bin 0 -> 4343 bytes + test/reference/clip-operator.ref.png | Bin 0 -> 8126 bytes + test/reference/clip-operator.rgb24.ref.png | Bin 0 -> 3244 bytes + .../reference/clip-operator.svg12.argb32.xfail.png | Bin 0 -> 8378 bytes + test/reference/clip-operator.svg12.rgb24.xfail.png | Bin 0 -> 4566 bytes + .../clip-operator.test-paginated.argb32.ref.png | Bin 0 -> 8189 bytes + test/reference/clip-operator.xlib-fallback.ref.png | Bin 0 -> 3228 bytes + test/reference/clip-operator.xlib.ref.png | Bin 0 -> 8271 bytes + test/reference/clip-operator.xlib.rgb24.ref.png | Bin 0 -> 3258 bytes + test/reference/clip-push-group.base.argb32.ref.png | Bin 0 -> 155 bytes + test/reference/clip-push-group.base.rgb24.ref.png | Bin 0 -> 155 bytes + test/reference/clip-push-group.image16.ref.png | Bin 0 -> 159 bytes + test/reference/clip-push-group.pdf.ref.png | Bin 0 -> 164 bytes + test/reference/clip-push-group.ps.ref.png | Bin 0 -> 120 bytes + test/reference/clip-push-group.quartz.ref.png | Bin 0 -> 166 bytes + test/reference/clip-push-group.ref.png | Bin 0 -> 166 bytes + test/reference/clip-push-group.svg.ref.png | Bin 0 -> 175 bytes + test/reference/clip-push-group.xlib.ref.png | Bin 0 -> 155 bytes + ...-rotate-image-surface-paint.base.argb32.ref.png | Bin 0 -> 202 bytes + ...p-rotate-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 202 bytes + .../clip-rotate-image-surface-paint.ref.png | Bin 0 -> 202 bytes + test/reference/clip-shape.base.argb32.ref.png | Bin 0 -> 2943 bytes + test/reference/clip-shape.base.rgb24.ref.png | Bin 0 -> 2943 bytes + test/reference/clip-shape.image16.ref.png | Bin 0 -> 2488 bytes + test/reference/clip-shape.ps.ref.png | Bin 0 -> 1797 bytes + test/reference/clip-shape.quartz.ref.png | Bin 0 -> 3229 bytes + test/reference/clip-shape.ref.png | Bin 0 -> 2249 bytes + test/reference/clip-shape.xlib-fallback.ref.png | Bin 0 -> 2916 bytes + test/reference/clip-shape.xlib.ref.png | Bin 0 -> 2944 bytes + .../clip-stroke-no-op.base.argb32.ref.png | Bin 0 -> 152 bytes + .../reference/clip-stroke-no-op.base.rgb24.ref.png | Bin 0 -> 152 bytes + test/reference/clip-stroke-no-op.image16.ref.png | Bin 0 -> 153 bytes + test/reference/clip-stroke-no-op.ref.png | Bin 0 -> 152 bytes + .../reference/clip-stroke-unbounded.argb32.ref.png | Bin 0 -> 3887 bytes + .../clip-stroke-unbounded.base.argb32.ref.png | Bin 0 -> 3617 bytes + .../clip-stroke-unbounded.base.rgb24.ref.png | Bin 0 -> 3108 bytes + .../clip-stroke-unbounded.image16.rgb24.ref.png | Bin 0 -> 2778 bytes + .../clip-stroke-unbounded.quartz.argb32.ref.png | Bin 0 -> 3290 bytes + .../clip-stroke-unbounded.quartz.rgb24.ref.png | Bin 0 -> 2840 bytes + test/reference/clip-stroke-unbounded.rgb24.ref.png | Bin 0 -> 3063 bytes + .../clip-stroke-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 3569 bytes + ...ip-stroke-unbounded.xlib-fallback.rgb24.ref.png | Bin 0 -> 3123 bytes + .../clip-stroke-unbounded.xlib.argb32.ref.png | Bin 0 -> 3620 bytes + .../clip-stroke-unbounded.xlib.rgb24.ref.png | Bin 0 -> 3109 bytes + test/reference/clip-stroke.base.argb32.ref.png | Bin 0 -> 1491 bytes + test/reference/clip-stroke.base.rgb24.ref.png | Bin 0 -> 1491 bytes + test/reference/clip-stroke.image16.ref.png | Bin 0 -> 1305 bytes + test/reference/clip-stroke.ps.xfail.png | Bin 0 -> 662 bytes + test/reference/clip-stroke.quartz.ref.png | Bin 0 -> 1305 bytes + test/reference/clip-stroke.ref.png | Bin 0 -> 1207 bytes + test/reference/clip-stroke.xlib-fallback.ref.png | Bin 0 -> 1491 bytes + test/reference/clip-stroke.xlib.ref.png | Bin 0 -> 1491 bytes + test/reference/clip-text.base.argb32.ref.png | Bin 0 -> 899 bytes + test/reference/clip-text.base.rgb24.ref.png | Bin 0 -> 899 bytes + test/reference/clip-text.image16.ref.png | Bin 0 -> 811 bytes + test/reference/clip-text.ps.xfail.png | Bin 0 -> 434 bytes + test/reference/clip-text.quartz.ref.png | Bin 0 -> 854 bytes + test/reference/clip-text.ref.png | Bin 0 -> 796 bytes + test/reference/clip-text.svg.ref.png | Bin 0 -> 946 bytes + test/reference/clip-text.xlib.ref.png | Bin 0 -> 900 bytes + .../clip-twice-rectangle.base.argb32.ref.png | Bin 0 -> 323 bytes + .../clip-twice-rectangle.base.rgb24.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice-rectangle.ref.png | Bin 0 -> 323 bytes + test/reference/clip-twice.argb32.ref.png | Bin 0 -> 1077 bytes + test/reference/clip-twice.base.argb32.ref.png | Bin 0 -> 1343 bytes + test/reference/clip-twice.base.rgb24.ref.png | Bin 0 -> 1179 bytes + test/reference/clip-twice.image16.ref.png | Bin 0 -> 1069 bytes + test/reference/clip-twice.pdf.argb32.ref.png | Bin 0 -> 1498 bytes + test/reference/clip-twice.ps.argb32.ref.png | Bin 0 -> 492 bytes + test/reference/clip-twice.ps.rgb24.ref.png | Bin 0 -> 409 bytes + test/reference/clip-twice.quartz.argb32.ref.png | Bin 0 -> 1171 bytes + test/reference/clip-twice.quartz.rgb24.ref.png | Bin 0 -> 1095 bytes + test/reference/clip-twice.rgb24.ref.png | Bin 0 -> 976 bytes + .../clip-twice.test-paginated.argb32.ref.png | Bin 0 -> 1361 bytes + .../clip-twice.test-paginated.rgb24.ref.png | Bin 0 -> 1199 bytes + test/reference/clip-twice.xlib.ref.png | Bin 0 -> 1362 bytes + test/reference/clip-twice.xlib.rgb24.ref.png | Bin 0 -> 1198 bytes + test/reference/clip-unbounded.base.argb32.ref.png | Bin 0 -> 100 bytes + test/reference/clip-unbounded.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/clip-unbounded.pdf.argb32.xfail.png | Bin 0 -> 95 bytes + test/reference/clip-unbounded.pdf.rgb24.xfail.png | Bin 0 -> 95 bytes + test/reference/clip-unbounded.ref.png | Bin 0 -> 100 bytes + test/reference/clip-unbounded.rgb24.ref.png | Bin 0 -> 97 bytes + .../reference/clip-unbounded.svg12.rgb24.xfail.png | Bin 0 -> 100 bytes + test/reference/clipped-group.base.argb32.ref.png | Bin 0 -> 316 bytes + test/reference/clipped-group.base.rgb24.ref.png | Bin 0 -> 316 bytes + test/reference/clipped-group.image16.ref.png | Bin 0 -> 270 bytes + test/reference/clipped-group.pdf.ref.png | Bin 0 -> 334 bytes + test/reference/clipped-group.ps2.ref.png | Bin 0 -> 214 bytes + test/reference/clipped-group.ps3.ref.png | Bin 0 -> 214 bytes + test/reference/clipped-group.quartz.ref.png | Bin 0 -> 308 bytes + test/reference/clipped-group.ref.png | Bin 0 -> 289 bytes + test/reference/clipped-group.svg.ref.png | Bin 0 -> 250 bytes + test/reference/clipped-group.xlib-fallback.ref.png | Bin 0 -> 344 bytes + test/reference/clipped-group.xlib.ref.png | Bin 0 -> 289 bytes + test/reference/clipped-surface.base.argb32.ref.png | Bin 0 -> 345 bytes + test/reference/clipped-surface.base.rgb24.ref.png | Bin 0 -> 345 bytes + test/reference/clipped-surface.image16.ref.png | Bin 0 -> 296 bytes + test/reference/clipped-surface.ref.png | Bin 0 -> 401 bytes + test/reference/clipped-trapezoids.ref.png | Bin 0 -> 963 bytes + .../close-path-current-point.base.argb32.ref.png | Bin 0 -> 2008 bytes + .../close-path-current-point.base.rgb24.ref.png | Bin 0 -> 2008 bytes + .../close-path-current-point.image16.ref.png | Bin 0 -> 1804 bytes + test/reference/close-path-current-point.ps.ref.png | Bin 0 -> 1490 bytes + test/reference/close-path-current-point.ref.png | Bin 0 -> 1675 bytes + test/reference/close-path.base.argb32.ref.png | Bin 0 -> 284 bytes + test/reference/close-path.base.rgb24.ref.png | Bin 0 -> 284 bytes + test/reference/close-path.ps2.ref.png | Bin 0 -> 309 bytes + test/reference/close-path.ps3.ref.png | Bin 0 -> 309 bytes + test/reference/close-path.ref.png | Bin 0 -> 271 bytes + ...teger-translate-over-repeat.base.argb32.ref.png | Bin 0 -> 334 bytes + ...nteger-translate-over-repeat.base.rgb24.ref.png | Bin 0 -> 334 bytes + ...osite-integer-translate-over-repeat.ps2.ref.png | Bin 0 -> 448 bytes + ...osite-integer-translate-over-repeat.ps3.ref.png | Bin 0 -> 448 bytes + ...composite-integer-translate-over-repeat.ref.png | Bin 0 -> 401 bytes + ...site-integer-translate-over.base.argb32.ref.png | Bin 0 -> 13998 bytes + ...osite-integer-translate-over.base.rgb24.ref.png | Bin 0 -> 13998 bytes + ...omposite-integer-translate-over.image16.ref.png | Bin 0 -> 11570 bytes + .../composite-integer-translate-over.ps2.ref.png | Bin 0 -> 15783 bytes + .../composite-integer-translate-over.ps3.ref.png | Bin 0 -> 15783 bytes + .../composite-integer-translate-over.ref.png | Bin 0 -> 16385 bytes + ...te-integer-translate-source.base.argb32.ref.png | Bin 0 -> 13998 bytes + ...ite-integer-translate-source.base.rgb24.ref.png | Bin 0 -> 13998 bytes + ...posite-integer-translate-source.image16.ref.png | Bin 0 -> 11570 bytes + .../composite-integer-translate-source.ps2.ref.png | Bin 0 -> 15783 bytes + .../composite-integer-translate-source.ps3.ref.png | Bin 0 -> 15783 bytes + .../composite-integer-translate-source.ref.png | Bin 0 -> 16385 bytes + ...integer-translate-source.svg12.argb32.xfail.png | Bin 0 -> 16392 bytes + ...-integer-translate-source.svg12.rgb24.xfail.png | Bin 0 -> 16392 bytes + test/reference/copy-path.base.argb32.ref.png | Bin 0 -> 588 bytes + test/reference/copy-path.base.rgb24.ref.png | Bin 0 -> 588 bytes + test/reference/copy-path.image16.ref.png | Bin 0 -> 556 bytes + test/reference/copy-path.ps.ref.png | Bin 0 -> 379 bytes + test/reference/copy-path.ref.png | Bin 0 -> 513 bytes + test/reference/coverage-column-triangles.ref.png | Bin 0 -> 208 bytes + .../coverage-column-triangles.xlib.xfail.png | Bin 0 -> 12745 bytes + test/reference/coverage-intersecting-quads.ref.png | Bin 0 -> 253 bytes + .../coverage-intersecting-quads.xlib.xfail.png | Bin 0 -> 15296 bytes + .../coverage-intersecting-triangles.ref.png | Bin 0 -> 209 bytes + .../coverage-intersecting-triangles.xlib.xfail.png | Bin 0 -> 16728 bytes + test/reference/coverage-rectangles.ref.png | Bin 0 -> 259 bytes + test/reference/coverage-rectangles.xlib.xfail.png | Bin 0 -> 15981 bytes + test/reference/coverage-row-triangles.ref.png | Bin 0 -> 208 bytes + .../coverage-row-triangles.xlib.xfail.png | Bin 0 -> 12671 bytes + test/reference/coverage-triangles.ref.png | Bin 0 -> 253 bytes + test/reference/coverage-triangles.xlib.xfail.png | Bin 0 -> 15859 bytes + .../create-from-png-stream.base.argb32.ref.png | Bin 0 -> 96 bytes + .../create-from-png-stream.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png-stream.ref.png | Bin 0 -> 100 bytes + test/reference/create-from-png.alpha.ref.png | Bin 0 -> 150 bytes + test/reference/create-from-png.base.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/create-from-png.gray-alpha.ref.png | Bin 0 -> 142 bytes + test/reference/create-from-png.gray.ref.png | Bin 0 -> 124 bytes + .../create-from-png.indexed-alpha.ref.png | Bin 0 -> 172 bytes + test/reference/create-from-png.indexed.ref.png | Bin 0 -> 159 bytes + test/reference/create-from-png.ref.png | Bin 0 -> 131 bytes + test/reference/culled-glyphs.base.argb32.ref.png | Bin 0 -> 435 bytes + test/reference/culled-glyphs.base.rgb24.ref.png | Bin 0 -> 435 bytes + test/reference/culled-glyphs.image16.ref.png | Bin 0 -> 426 bytes + test/reference/culled-glyphs.ps.ref.png | Bin 0 -> 372 bytes + test/reference/culled-glyphs.quartz.ref.png | Bin 0 -> 493 bytes + test/reference/culled-glyphs.ref.png | Bin 0 -> 434 bytes + .../curve-to-as-line-to.base.argb32.ref.png | Bin 0 -> 107 bytes + .../curve-to-as-line-to.base.rgb24.ref.png | Bin 0 -> 107 bytes + test/reference/curve-to-as-line-to.ps.xfail.png | Bin 0 -> 112 bytes + test/reference/curve-to-as-line-to.ref.png | Bin 0 -> 95 bytes + test/reference/dash-caps-joins.base.argb32.ref.png | Bin 0 -> 4521 bytes + test/reference/dash-caps-joins.base.rgb24.ref.png | Bin 0 -> 4521 bytes + test/reference/dash-caps-joins.image16.ref.png | Bin 0 -> 4491 bytes + test/reference/dash-caps-joins.ps.ref.png | Bin 0 -> 3648 bytes + test/reference/dash-caps-joins.quartz.xfail.png | Bin 0 -> 4446 bytes + test/reference/dash-caps-joins.ref.png | Bin 0 -> 4030 bytes + test/reference/dash-curve.base.argb32.ref.png | Bin 0 -> 40040 bytes + test/reference/dash-curve.base.rgb24.ref.png | Bin 0 -> 40040 bytes + test/reference/dash-curve.image16.ref.png | Bin 0 -> 32445 bytes + test/reference/dash-curve.ps2.ref.png | Bin 0 -> 24355 bytes + test/reference/dash-curve.ps3.ref.png | Bin 0 -> 24355 bytes + test/reference/dash-curve.quartz.xfail.png | Bin 0 -> 42238 bytes + test/reference/dash-curve.ref.png | Bin 0 -> 22615 bytes + test/reference/dash-curve.xlib.ref.png | Bin 0 -> 40109 bytes + .../dash-infinite-loop.base.argb32.ref.png | Bin 0 -> 835 bytes + .../dash-infinite-loop.base.rgb24.ref.png | Bin 0 -> 835 bytes + test/reference/dash-infinite-loop.ps.ref.png | Bin 0 -> 601 bytes + test/reference/dash-infinite-loop.ref.png | Bin 0 -> 626 bytes + test/reference/dash-no-dash.base.argb32.ref.png | Bin 0 -> 119 bytes + test/reference/dash-no-dash.base.rgb24.ref.png | Bin 0 -> 119 bytes + test/reference/dash-no-dash.ref.png | Bin 0 -> 152 bytes + .../dash-offset-negative.base.argb32.ref.png | Bin 0 -> 151 bytes + .../dash-offset-negative.base.rgb24.ref.png | Bin 0 -> 151 bytes + test/reference/dash-offset-negative.pdf.ref.png | Bin 0 -> 129 bytes + test/reference/dash-offset-negative.ref.png | Bin 0 -> 171 bytes + test/reference/dash-offset.base.argb32.ref.png | Bin 0 -> 794 bytes + test/reference/dash-offset.base.rgb24.ref.png | Bin 0 -> 794 bytes + test/reference/dash-offset.ref.png | Bin 0 -> 794 bytes + test/reference/dash-scale.base.argb32.ref.png | Bin 0 -> 7621 bytes + test/reference/dash-scale.base.rgb24.ref.png | Bin 0 -> 7621 bytes + test/reference/dash-scale.image16.ref.png | Bin 0 -> 7748 bytes + test/reference/dash-scale.ps.ref.png | Bin 0 -> 5965 bytes + test/reference/dash-scale.quartz.ref.png | Bin 0 -> 7614 bytes + test/reference/dash-scale.ref.png | Bin 0 -> 6314 bytes + test/reference/dash-state.base.argb32.ref.png | Bin 0 -> 7628 bytes + test/reference/dash-state.base.rgb24.ref.png | Bin 0 -> 7628 bytes + test/reference/dash-state.image16.ref.png | Bin 0 -> 7910 bytes + test/reference/dash-state.ps2.ref.png | Bin 0 -> 8740 bytes + test/reference/dash-state.ps3.ref.png | Bin 0 -> 8740 bytes + test/reference/dash-state.quartz.xfail.png | Bin 0 -> 6957 bytes + test/reference/dash-state.ref.png | Bin 0 -> 7642 bytes + .../reference/dash-zero-length.base.argb32.ref.png | Bin 0 -> 219 bytes + test/reference/dash-zero-length.base.rgb24.ref.png | Bin 0 -> 199 bytes + test/reference/dash-zero-length.ps2.ref.png | Bin 0 -> 319 bytes + test/reference/dash-zero-length.ps2.rgb24.ref.png | Bin 0 -> 304 bytes + test/reference/dash-zero-length.ps3.ref.png | Bin 0 -> 319 bytes + test/reference/dash-zero-length.ps3.rgb24.ref.png | Bin 0 -> 304 bytes + test/reference/dash-zero-length.ref.png | Bin 0 -> 232 bytes + test/reference/dash-zero-length.rgb24.ref.png | Bin 0 -> 218 bytes + test/reference/degenerate-arc.base.argb32.ref.png | Bin 0 -> 547 bytes + test/reference/degenerate-arc.base.rgb24.ref.png | Bin 0 -> 547 bytes + test/reference/degenerate-arc.image16.ref.png | Bin 0 -> 592 bytes + test/reference/degenerate-arc.ps2.ref.png | Bin 0 -> 509 bytes + test/reference/degenerate-arc.ps3.ref.png | Bin 0 -> 509 bytes + test/reference/degenerate-arc.quartz.ref.png | Bin 0 -> 552 bytes + test/reference/degenerate-arc.ref.png | Bin 0 -> 690 bytes + test/reference/degenerate-arc.xlib.ref.png | Bin 0 -> 616 bytes + test/reference/degenerate-arcs.base.argb32.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-arcs.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-arcs.image16.ref.png | Bin 0 -> 120 bytes + test/reference/degenerate-arcs.ref.png | Bin 0 -> 120 bytes + .../degenerate-curve-to.base.argb32.ref.png | Bin 0 -> 283 bytes + .../degenerate-curve-to.base.rgb24.ref.png | Bin 0 -> 283 bytes + test/reference/degenerate-curve-to.image16.ref.png | Bin 0 -> 278 bytes + test/reference/degenerate-curve-to.ps.xfail.png | Bin 0 -> 221 bytes + test/reference/degenerate-curve-to.quartz.ref.png | Bin 0 -> 247 bytes + test/reference/degenerate-curve-to.ref.png | Bin 0 -> 227 bytes + test/reference/degenerate-dash.base.argb32.ref.png | Bin 0 -> 1898 bytes + test/reference/degenerate-dash.base.rgb24.ref.png | Bin 0 -> 1898 bytes + test/reference/degenerate-dash.ps.xfail.png | Bin 0 -> 1837 bytes + test/reference/degenerate-dash.quartz.xfail.png | Bin 0 -> 1560 bytes + test/reference/degenerate-dash.ref.png | Bin 0 -> 1845 bytes + test/reference/degenerate-dash.xlib.ref.png | Bin 0 -> 1898 bytes + .../degenerate-linear-gradient.base.argb32.ref.png | Bin 0 -> 336 bytes + .../degenerate-linear-gradient.base.rgb24.ref.png | Bin 0 -> 336 bytes + test/reference/degenerate-linear-gradient.ref.png | Bin 0 -> 322 bytes + test/reference/degenerate-path.argb32.ref.png | Bin 0 -> 253 bytes + test/reference/degenerate-path.base.argb32.ref.png | Bin 0 -> 249 bytes + test/reference/degenerate-path.base.rgb24.ref.png | Bin 0 -> 217 bytes + test/reference/degenerate-path.ps.argb32.xfail.png | Bin 0 -> 234 bytes + test/reference/degenerate-path.ps.rgb24.xfail.png | Bin 0 -> 184 bytes + .../degenerate-path.quartz.argb32.xfail.png | Bin 0 -> 200 bytes + .../degenerate-path.quartz.rgb24.xfail.png | Bin 0 -> 172 bytes + test/reference/degenerate-path.rgb24.ref.png | Bin 0 -> 212 bytes + test/reference/degenerate-pen.base.argb32.ref.png | Bin 0 -> 1000 bytes + test/reference/degenerate-pen.base.rgb24.ref.png | Bin 0 -> 1000 bytes + test/reference/degenerate-pen.image16.ref.png | Bin 0 -> 954 bytes + test/reference/degenerate-pen.ps.ref.png | Bin 0 -> 753 bytes + test/reference/degenerate-pen.ref.png | Bin 0 -> 752 bytes + test/reference/degenerate-pen.xlib.ref.png | Bin 0 -> 997 bytes + .../degenerate-radial-gradient.base.argb32.ref.png | Bin 0 -> 428 bytes + .../degenerate-radial-gradient.base.rgb24.ref.png | Bin 0 -> 428 bytes + test/reference/degenerate-radial-gradient.ref.png | Bin 0 -> 428 bytes + .../degenerate-rel-curve-to.base.argb32.ref.png | Bin 0 -> 278 bytes + .../degenerate-rel-curve-to.base.rgb24.ref.png | Bin 0 -> 278 bytes + .../degenerate-rel-curve-to.image16.ref.png | Bin 0 -> 279 bytes + test/reference/degenerate-rel-curve-to.ps.ref.png | Bin 0 -> 225 bytes + .../degenerate-rel-curve-to.quartz.ref.png | Bin 0 -> 246 bytes + test/reference/degenerate-rel-curve-to.ref.png | Bin 0 -> 227 bytes + .../device-offset-fractional.base.argb32.ref.png | Bin 0 -> 266 bytes + .../device-offset-fractional.base.rgb24.ref.png | Bin 0 -> 266 bytes + .../device-offset-fractional.gl.xfail.png | Bin 0 -> 311 bytes + .../device-offset-fractional.pdf.xfail.png | Bin 0 -> 270 bytes + .../reference/device-offset-fractional.ps2.ref.png | Bin 0 -> 200 bytes + .../reference/device-offset-fractional.ps3.ref.png | Bin 0 -> 200 bytes + test/reference/device-offset-fractional.ref.png | Bin 0 -> 269 bytes + .../device-offset-positive.base.argb32.ref.png | Bin 0 -> 120 bytes + .../device-offset-positive.base.rgb24.ref.png | Bin 0 -> 111 bytes + test/reference/device-offset-positive.ref.png | Bin 0 -> 139 bytes + .../reference/device-offset-positive.rgb24.ref.png | Bin 0 -> 130 bytes + .../device-offset-scale.base.argb32.ref.png | Bin 0 -> 109 bytes + .../device-offset-scale.base.rgb24.ref.png | Bin 0 -> 109 bytes + test/reference/device-offset-scale.ref.png | Bin 0 -> 145 bytes + test/reference/device-offset-scale.svg.xfail.png | Bin 0 -> 128 bytes + test/reference/device-offset.base.argb32.ref.png | Bin 0 -> 118 bytes + test/reference/device-offset.base.rgb24.ref.png | Bin 0 -> 111 bytes + test/reference/device-offset.ref.png | Bin 0 -> 137 bytes + test/reference/device-offset.rgb24.ref.png | Bin 0 -> 130 bytes + test/reference/drunkard-tails.base.argb32.ref.png | Bin 0 -> 6036 bytes + test/reference/drunkard-tails.base.rgb24.ref.png | Bin 0 -> 6036 bytes + test/reference/drunkard-tails.ps.ref.png | Bin 0 -> 3780 bytes + test/reference/drunkard-tails.ref.png | Bin 0 -> 3853 bytes + .../extend-pad-border.base.argb32.ref.png | Bin 0 -> 495 bytes + .../reference/extend-pad-border.base.rgb24.ref.png | Bin 0 -> 495 bytes + test/reference/extend-pad-border.image16.ref.png | Bin 0 -> 446 bytes + test/reference/extend-pad-border.pdf.ref.png | Bin 0 -> 495 bytes + test/reference/extend-pad-border.ps.ref.png | Bin 0 -> 649 bytes + test/reference/extend-pad-border.quartz.ref.png | Bin 0 -> 432 bytes + test/reference/extend-pad-border.ref.png | Bin 0 -> 616 bytes + test/reference/extend-pad-border.svg.xfail.png | Bin 0 -> 1063 bytes + .../extend-pad-similar.base.argb32.ref.png | Bin 0 -> 279 bytes + .../extend-pad-similar.base.rgb24.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad-similar.quartz.xfail.png | Bin 0 -> 270 bytes + test/reference/extend-pad-similar.ref.png | Bin 0 -> 315 bytes + test/reference/extend-pad-similar.svg.xfail.png | Bin 0 -> 270 bytes + test/reference/extend-pad.base.argb32.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.base.rgb24.ref.png | Bin 0 -> 279 bytes + test/reference/extend-pad.ps.ref.png | Bin 0 -> 314 bytes + test/reference/extend-pad.quartz.xfail.png | Bin 0 -> 270 bytes + test/reference/extend-pad.ref.png | Bin 0 -> 315 bytes + test/reference/extend-pad.svg.xfail.png | Bin 0 -> 270 bytes + .../extend-reflect-similar.base.argb32.ref.png | Bin 0 -> 133406 bytes + .../extend-reflect-similar.base.rgb24.ref.png | Bin 0 -> 133406 bytes + .../extend-reflect-similar.image16.ref.png | Bin 0 -> 99786 bytes + test/reference/extend-reflect-similar.ps2.ref.png | Bin 0 -> 146990 bytes + test/reference/extend-reflect-similar.ps3.ref.png | Bin 0 -> 146990 bytes + test/reference/extend-reflect-similar.ref.png | Bin 0 -> 153571 bytes + test/reference/extend-reflect.base.argb32.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.base.rgb24.ref.png | Bin 0 -> 133406 bytes + test/reference/extend-reflect.image16.ref.png | Bin 0 -> 99786 bytes + test/reference/extend-reflect.ps2.ref.png | Bin 0 -> 146990 bytes + test/reference/extend-reflect.ps3.ref.png | Bin 0 -> 146990 bytes + test/reference/extend-reflect.ref.png | Bin 0 -> 153571 bytes + .../extend-repeat-similar.base.argb32.ref.png | Bin 0 -> 108603 bytes + .../extend-repeat-similar.base.rgb24.ref.png | Bin 0 -> 108603 bytes + .../extend-repeat-similar.image16.ref.png | Bin 0 -> 83738 bytes + test/reference/extend-repeat-similar.ps2.ref.png | Bin 0 -> 119246 bytes + test/reference/extend-repeat-similar.ps3.ref.png | Bin 0 -> 119246 bytes + test/reference/extend-repeat-similar.ref.png | Bin 0 -> 108622 bytes + test/reference/extend-repeat.base.argb32.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.base.rgb24.ref.png | Bin 0 -> 108603 bytes + test/reference/extend-repeat.image16.ref.png | Bin 0 -> 83738 bytes + test/reference/extend-repeat.ps2.ref.png | Bin 0 -> 119246 bytes + test/reference/extend-repeat.ps3.ref.png | Bin 0 -> 119246 bytes + test/reference/extend-repeat.ref.png | Bin 0 -> 108622 bytes + .../extended-blend-alpha-mask.argb32.ref.png | Bin 0 -> 9221 bytes + .../extended-blend-alpha-mask.base.argb32.ref.png | Bin 0 -> 9221 bytes + .../extended-blend-alpha-mask.base.rgb24.ref.png | Bin 0 -> 4597 bytes + .../extended-blend-alpha-mask.rgb24.ref.png | Bin 0 -> 4597 bytes + test/reference/extended-blend-alpha.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-alpha.base.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-alpha.base.rgb24.ref.png | Bin 0 -> 5740 bytes + .../reference/extended-blend-alpha.image16.ref.png | Bin 0 -> 4626 bytes + .../extended-blend-alpha.quartz.argb32.ref.png | Bin 0 -> 9729 bytes + .../extended-blend-alpha.quartz.rgb24.ref.png | Bin 0 -> 5598 bytes + test/reference/extended-blend-alpha.rgb24.ref.png | Bin 0 -> 5740 bytes + .../extended-blend-alpha.svg12.argb32.xfail.png | Bin 0 -> 6658 bytes + .../extended-blend-alpha.svg12.rgb24.xfail.png | Bin 0 -> 5014 bytes + test/reference/extended-blend-mask.argb32.ref.png | Bin 0 -> 3971 bytes + .../extended-blend-mask.base.argb32.ref.png | Bin 0 -> 3971 bytes + .../extended-blend-mask.base.rgb24.ref.png | Bin 0 -> 3643 bytes + test/reference/extended-blend-mask.rgb24.ref.png | Bin 0 -> 3643 bytes + .../extended-blend-solid-alpha.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-solid-alpha.base.argb32.ref.png | Bin 0 -> 9406 bytes + .../extended-blend-solid-alpha.base.rgb24.ref.png | Bin 0 -> 5740 bytes + .../extended-blend-solid-alpha.image16.ref.png | Bin 0 -> 4626 bytes + .../extended-blend-solid-alpha.rgb24.ref.png | Bin 0 -> 5740 bytes + test/reference/extended-blend-solid.argb32.ref.png | Bin 0 -> 4071 bytes + .../extended-blend-solid.base.argb32.ref.png | Bin 0 -> 4063 bytes + .../extended-blend-solid.base.rgb24.ref.png | Bin 0 -> 3775 bytes + .../reference/extended-blend-solid.image16.ref.png | Bin 0 -> 4145 bytes + test/reference/extended-blend-solid.rgb24.ref.png | Bin 0 -> 3775 bytes + test/reference/extended-blend.argb32.ref.png | Bin 0 -> 4071 bytes + test/reference/extended-blend.base.argb32.ref.png | Bin 0 -> 4063 bytes + test/reference/extended-blend.base.rgb24.ref.png | Bin 0 -> 3775 bytes + test/reference/extended-blend.image16.ref.png | Bin 0 -> 4145 bytes + .../reference/extended-blend.quartz.argb32.ref.png | Bin 0 -> 4284 bytes + test/reference/extended-blend.quartz.rgb24.ref.png | Bin 0 -> 3965 bytes + test/reference/extended-blend.rgb24.ref.png | Bin 0 -> 3775 bytes + .../extended-blend.svg12.argb32.xfail.png | Bin 0 -> 2273 bytes + .../reference/extended-blend.svg12.rgb24.xfail.png | Bin 0 -> 1856 bytes + .../fallback-resolution.ppi144x144.ps.ref.png | Bin 0 -> 5911 bytes + .../fallback-resolution.ppi144x144.ref.png | Bin 0 -> 8697 bytes + .../fallback-resolution.ppi144x72.ps.ref.png | Bin 0 -> 7206 bytes + .../fallback-resolution.ppi144x72.ref.png | Bin 0 -> 8445 bytes + .../fallback-resolution.ppi288x288.pdf.ref.png | Bin 0 -> 8681 bytes + .../fallback-resolution.ppi288x288.ps.ref.png | Bin 0 -> 4450 bytes + .../fallback-resolution.ppi288x288.svg.ref.png | Bin 0 -> 5771 bytes + .../fallback-resolution.ppi288x72.ps.ref.png | Bin 0 -> 6444 bytes + .../fallback-resolution.ppi288x72.ref.png | Bin 0 -> 7166 bytes + .../fallback-resolution.ppi576x576.pdf.ref.png | Bin 0 -> 8732 bytes + .../fallback-resolution.ppi576x576.ps.ref.png | Bin 0 -> 3448 bytes + .../fallback-resolution.ppi576x576.svg.ref.png | Bin 0 -> 4317 bytes + .../fallback-resolution.ppi576x72.ps.ref.png | Bin 0 -> 5992 bytes + .../fallback-resolution.ppi576x72.ref.png | Bin 0 -> 6432 bytes + .../fallback-resolution.ppi72x144.ps.ref.png | Bin 0 -> 7270 bytes + .../fallback-resolution.ppi72x144.ref.png | Bin 0 -> 8677 bytes + .../fallback-resolution.ppi72x288.ps.ref.png | Bin 0 -> 6616 bytes + .../fallback-resolution.ppi72x288.ref.png | Bin 0 -> 7231 bytes + .../fallback-resolution.ppi72x576.ps.ref.png | Bin 0 -> 6349 bytes + .../fallback-resolution.ppi72x576.ref.png | Bin 0 -> 6523 bytes + .../reference/fallback-resolution.ppi72x72.ref.png | Bin 0 -> 8510 bytes + .../fill-alpha-pattern.base.argb32.ref.png | Bin 0 -> 3379 bytes + .../fill-alpha-pattern.base.rgb24.ref.png | Bin 0 -> 3379 bytes + test/reference/fill-alpha-pattern.image16.ref.png | Bin 0 -> 3380 bytes + test/reference/fill-alpha-pattern.pdf.ref.png | Bin 0 -> 2945 bytes + .../fill-alpha-pattern.ps3.argb32.ref.png | Bin 0 -> 3484 bytes + test/reference/fill-alpha-pattern.quartz.ref.png | Bin 0 -> 7943 bytes + test/reference/fill-alpha-pattern.ref.png | Bin 0 -> 2962 bytes + test/reference/fill-alpha-pattern.xlib.ref.png | Bin 0 -> 3653 bytes + test/reference/fill-alpha.base.argb32.ref.png | Bin 0 -> 2824 bytes + test/reference/fill-alpha.base.rgb24.ref.png | Bin 0 -> 2824 bytes + test/reference/fill-alpha.image16.ref.png | Bin 0 -> 2145 bytes + test/reference/fill-alpha.ps.argb32.ref.png | Bin 0 -> 2248 bytes + test/reference/fill-alpha.quartz.ref.png | Bin 0 -> 2704 bytes + test/reference/fill-alpha.ref.png | Bin 0 -> 2167 bytes + test/reference/fill-alpha.xlib.ref.png | Bin 0 -> 2989 bytes + .../fill-and-stroke-alpha-add.base.argb32.ref.png | Bin 0 -> 552 bytes + .../fill-and-stroke-alpha-add.base.rgb24.ref.png | Bin 0 -> 552 bytes + .../fill-and-stroke-alpha-add.image16.ref.png | Bin 0 -> 536 bytes + .../fill-and-stroke-alpha-add.quartz.ref.png | Bin 0 -> 542 bytes + test/reference/fill-and-stroke-alpha-add.ref.png | Bin 0 -> 536 bytes + .../fill-and-stroke-alpha-add.svg12.xfail.png | Bin 0 -> 631 bytes + .../fill-and-stroke-alpha.base.argb32.ref.png | Bin 0 -> 507 bytes + .../fill-and-stroke-alpha.base.rgb24.ref.png | Bin 0 -> 507 bytes + .../fill-and-stroke-alpha.image16.ref.png | Bin 0 -> 470 bytes + test/reference/fill-and-stroke-alpha.ref.png | Bin 0 -> 462 bytes + test/reference/fill-and-stroke.argb32.ref.png | Bin 0 -> 269 bytes + test/reference/fill-and-stroke.base.argb32.ref.png | Bin 0 -> 321 bytes + test/reference/fill-and-stroke.base.rgb24.ref.png | Bin 0 -> 293 bytes + test/reference/fill-and-stroke.image16.ref.png | Bin 0 -> 251 bytes + test/reference/fill-and-stroke.ps.argb32.ref.png | Bin 0 -> 257 bytes + test/reference/fill-and-stroke.ps.rgb24.ref.png | Bin 0 -> 225 bytes + .../fill-and-stroke.quartz.argb32.ref.png | Bin 0 -> 273 bytes + .../reference/fill-and-stroke.quartz.rgb24.ref.png | Bin 0 -> 249 bytes + test/reference/fill-and-stroke.rgb24.ref.png | Bin 0 -> 252 bytes + test/reference/fill-and-stroke.xlib.argb32.ref.png | Bin 0 -> 322 bytes + test/reference/fill-and-stroke.xlib.rgb24.ref.png | Bin 0 -> 291 bytes + .../fill-degenerate-sort-order.argb32.ref.png | Bin 0 -> 1929 bytes + .../fill-degenerate-sort-order.base.argb32.ref.png | Bin 0 -> 2378 bytes + .../fill-degenerate-sort-order.base.rgb24.ref.png | Bin 0 -> 2041 bytes + .../fill-degenerate-sort-order.image16.ref.png | Bin 0 -> 1753 bytes + .../fill-degenerate-sort-order.ps.argb32.xfail.png | Bin 0 -> 1903 bytes + .../fill-degenerate-sort-order.ps.rgb24.xfail.png | Bin 0 -> 1638 bytes + ...ill-degenerate-sort-order.quartz.argb32.ref.png | Bin 0 -> 2451 bytes + ...fill-degenerate-sort-order.quartz.rgb24.ref.png | Bin 0 -> 2079 bytes + .../fill-degenerate-sort-order.rgb24.ref.png | Bin 0 -> 1689 bytes + .../fill-degenerate-sort-order.xlib.ref.png | Bin 0 -> 2397 bytes + .../fill-degenerate-sort-order.xlib.rgb24.ref.png | Bin 0 -> 2060 bytes + test/reference/fill-empty.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/fill-empty.base.argb32.ref.png | Bin 0 -> 99 bytes + test/reference/fill-empty.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/fill-empty.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/fill-empty.svg12.rgb24.xfail.png | Bin 0 -> 99 bytes + test/reference/fill-image.base.argb32.ref.png | Bin 0 -> 1455 bytes + test/reference/fill-image.base.rgb24.ref.png | Bin 0 -> 1455 bytes + test/reference/fill-image.image16.ref.png | Bin 0 -> 1163 bytes + test/reference/fill-image.ps.ref.png | Bin 0 -> 1645 bytes + test/reference/fill-image.quartz.ref.png | Bin 0 -> 1297 bytes + test/reference/fill-image.ref.png | Bin 0 -> 972 bytes + test/reference/fill-image.xlib.ref.png | Bin 0 -> 1460 bytes + .../reference/fill-missed-stop.base.argb32.ref.png | Bin 0 -> 447 bytes + test/reference/fill-missed-stop.base.rgb24.ref.png | Bin 0 -> 375 bytes + test/reference/fill-missed-stop.pdf.argb32.ref.png | Bin 0 -> 452 bytes + test/reference/fill-missed-stop.ps2.argb32.ref.png | Bin 0 -> 564 bytes + test/reference/fill-missed-stop.ps2.rgb24.ref.png | Bin 0 -> 531 bytes + test/reference/fill-missed-stop.ps3.argb32.ref.png | Bin 0 -> 564 bytes + test/reference/fill-missed-stop.ps3.rgb24.ref.png | Bin 0 -> 531 bytes + test/reference/fill-missed-stop.ref.png | Bin 0 -> 455 bytes + test/reference/fill-missed-stop.rgb24.ref.png | Bin 0 -> 382 bytes + test/reference/fill-rule.base.argb32.ref.png | Bin 0 -> 1979 bytes + test/reference/fill-rule.base.rgb24.ref.png | Bin 0 -> 1703 bytes + test/reference/fill-rule.image16.ref.png | Bin 0 -> 1625 bytes + test/reference/fill-rule.ps2.argb32.ref.png | Bin 0 -> 1878 bytes + test/reference/fill-rule.ps2.rgb24.ref.png | Bin 0 -> 1524 bytes + test/reference/fill-rule.ps3.argb32.ref.png | Bin 0 -> 1878 bytes + test/reference/fill-rule.ps3.rgb24.ref.png | Bin 0 -> 1524 bytes + test/reference/fill-rule.quartz.argb32.ref.png | Bin 0 -> 2060 bytes + test/reference/fill-rule.quartz.rgb24.ref.png | Bin 0 -> 1771 bytes + test/reference/fill-rule.ref.png | Bin 0 -> 1769 bytes + test/reference/fill-rule.rgb24.ref.png | Bin 0 -> 1591 bytes + test/reference/fill-rule.xlib.ref.png | Bin 0 -> 1979 bytes + test/reference/fill-rule.xlib.rgb24.ref.png | Bin 0 -> 1722 bytes + .../filter-bilinear-extents.base.argb32.ref.png | Bin 0 -> 1210 bytes + .../filter-bilinear-extents.base.rgb24.ref.png | Bin 0 -> 1210 bytes + .../filter-bilinear-extents.image16.ref.png | Bin 0 -> 895 bytes + .../filter-bilinear-extents.pdf.xfail.png | Bin 0 -> 401 bytes + test/reference/filter-bilinear-extents.ps2.ref.png | Bin 0 -> 556 bytes + test/reference/filter-bilinear-extents.ps3.ref.png | Bin 0 -> 556 bytes + .../filter-bilinear-extents.quartz.xfail.png | Bin 0 -> 308 bytes + test/reference/filter-bilinear-extents.ref.png | Bin 0 -> 1340 bytes + .../filter-nearest-offset.base.argb32.ref.png | Bin 0 -> 201 bytes + .../filter-nearest-offset.base.rgb24.ref.png | Bin 0 -> 201 bytes + test/reference/filter-nearest-offset.gl.xfail.png | Bin 0 -> 260 bytes + test/reference/filter-nearest-offset.pdf.xfail.png | Bin 0 -> 4522 bytes + test/reference/filter-nearest-offset.ps2.ref.png | Bin 0 -> 255 bytes + test/reference/filter-nearest-offset.ps3.ref.png | Bin 0 -> 255 bytes + test/reference/filter-nearest-offset.ref.png | Bin 0 -> 248 bytes + test/reference/filter-nearest-offset.svg.xfail.png | Bin 0 -> 4419 bytes + .../filter-nearest-transformed.base.argb32.ref.png | Bin 0 -> 514 bytes + .../filter-nearest-transformed.base.rgb24.ref.png | Bin 0 -> 514 bytes + .../filter-nearest-transformed.gl.xfail.png | Bin 0 -> 514 bytes + .../filter-nearest-transformed.image16.ref.png | Bin 0 -> 418 bytes + .../filter-nearest-transformed.pdf.xfail.png | Bin 0 -> 532 bytes + .../filter-nearest-transformed.quartz.xfail.png | Bin 0 -> 349 bytes + test/reference/filter-nearest-transformed.ref.png | Bin 0 -> 570 bytes + .../filter-nearest-transformed.svg.xfail.png | Bin 0 -> 546 bytes + .../finer-grained-fallbacks.argb32.ref.png | Bin 0 -> 993 bytes + .../finer-grained-fallbacks.base.argb32.ref.png | Bin 0 -> 1110 bytes + .../finer-grained-fallbacks.base.rgb24.ref.png | Bin 0 -> 856 bytes + .../finer-grained-fallbacks.gl.argb32.ref.png | Bin 0 -> 1075 bytes + .../finer-grained-fallbacks.image16.ref.png | Bin 0 -> 862 bytes + .../finer-grained-fallbacks.ps2.argb32.ref.png | Bin 0 -> 1168 bytes + test/reference/finer-grained-fallbacks.ps2.ref.png | Bin 0 -> 1356 bytes + .../finer-grained-fallbacks.ps2.rgb24.ref.png | Bin 0 -> 936 bytes + .../finer-grained-fallbacks.ps3.argb32.ref.png | Bin 0 -> 1168 bytes + test/reference/finer-grained-fallbacks.ps3.ref.png | Bin 0 -> 1356 bytes + .../finer-grained-fallbacks.ps3.rgb24.ref.png | Bin 0 -> 936 bytes + .../finer-grained-fallbacks.quartz.argb32.ref.png | Bin 0 -> 988 bytes + .../finer-grained-fallbacks.quartz.rgb24.ref.png | Bin 0 -> 763 bytes + .../finer-grained-fallbacks.rgb24.ref.png | Bin 0 -> 786 bytes + .../finer-grained-fallbacks.svg12.argb32.ref.png | Bin 0 -> 190 bytes + .../finer-grained-fallbacks.svg12.rgb24.ref.png | Bin 0 -> 191 bytes + .../finer-grained-fallbacks.xlib-fallback.ref.png | Bin 0 -> 919 bytes + .../reference/finer-grained-fallbacks.xlib.ref.png | Bin 0 -> 1110 bytes + .../finer-grained-fallbacks.xlib.rgb24.ref.png | Bin 0 -> 856 bytes + .../font-matrix-translation.base.argb32.ref.png | Bin 0 -> 874 bytes + .../font-matrix-translation.base.rgb24.ref.png | Bin 0 -> 874 bytes + .../font-matrix-translation.image16.ref.png | Bin 0 -> 852 bytes + .../font-matrix-translation.ps2.argb32.ref.png | Bin 0 -> 748 bytes + .../font-matrix-translation.ps2.rgb24.ref.png | Bin 0 -> 748 bytes + .../font-matrix-translation.ps3.argb32.ref.png | Bin 0 -> 748 bytes + .../font-matrix-translation.ps3.rgb24.ref.png | Bin 0 -> 748 bytes + .../font-matrix-translation.quartz.ref.png | Bin 0 -> 996 bytes + test/reference/font-matrix-translation.ref.png | Bin 0 -> 874 bytes + test/reference/font-matrix-translation.svg.ref.png | Bin 0 -> 870 bytes + .../ft-show-glyphs-positioning.base.argb32.ref.png | Bin 0 -> 3297 bytes + .../ft-show-glyphs-positioning.base.rgb24.ref.png | Bin 0 -> 3297 bytes + .../ft-show-glyphs-positioning.image16.ref.png | Bin 0 -> 2772 bytes + .../ft-show-glyphs-positioning.pdf.ref.png | Bin 0 -> 3117 bytes + .../ft-show-glyphs-positioning.ps2.ref.png | Bin 0 -> 2269 bytes + .../ft-show-glyphs-positioning.ps3.ref.png | Bin 0 -> 2269 bytes + test/reference/ft-show-glyphs-positioning.ref.png | Bin 0 -> 3297 bytes + .../ft-show-glyphs-positioning.svg.ref.png | Bin 0 -> 6018 bytes + .../ft-show-glyphs-table.base.argb32.ref.png | Bin 0 -> 9893 bytes + .../ft-show-glyphs-table.base.rgb24.ref.png | Bin 0 -> 9893 bytes + .../reference/ft-show-glyphs-table.image16.ref.png | Bin 0 -> 8052 bytes + test/reference/ft-show-glyphs-table.ps2.ref.png | Bin 0 -> 5687 bytes + test/reference/ft-show-glyphs-table.ps3.ref.png | Bin 0 -> 5687 bytes + .../ft-show-glyphs-table.quartz.xfail.png | Bin 0 -> 827 bytes + test/reference/ft-show-glyphs-table.ref.png | Bin 0 -> 9893 bytes + test/reference/ft-show-glyphs-table.svg.ref.png | Bin 0 -> 10005 bytes + .../ft-text-antialias-none.base.argb32.ref.png | Bin 0 -> 295 bytes + .../ft-text-antialias-none.base.rgb24.ref.png | Bin 0 -> 295 bytes + .../ft-text-antialias-none.ps2.argb32.ref.png | Bin 0 -> 335 bytes + .../ft-text-antialias-none.ps3.argb32.ref.png | Bin 0 -> 335 bytes + test/reference/ft-text-antialias-none.ref.png | Bin 0 -> 336 bytes + ...-text-vertical-layout-type1.base.argb32.ref.png | Bin 0 -> 3066 bytes + ...t-text-vertical-layout-type1.base.rgb24.ref.png | Bin 0 -> 3066 bytes + .../ft-text-vertical-layout-type1.image16.ref.png | Bin 0 -> 3072 bytes + .../ft-text-vertical-layout-type1.pdf.ref.png | Bin 0 -> 3635 bytes + .../ft-text-vertical-layout-type1.ps.ref.png | Bin 0 -> 2088 bytes + .../ft-text-vertical-layout-type1.quartz.xfail.png | Bin 0 -> 3635 bytes + .../ft-text-vertical-layout-type1.ref.png | Bin 0 -> 3591 bytes + .../ft-text-vertical-layout-type1.svg.ref.png | Bin 0 -> 3607 bytes + .../ft-text-vertical-layout-type1.xlib.ref.png | Bin 0 -> 3625 bytes + ...-text-vertical-layout-type3.base.argb32.ref.png | Bin 0 -> 3597 bytes + ...t-text-vertical-layout-type3.base.rgb24.ref.png | Bin 0 -> 3597 bytes + .../ft-text-vertical-layout-type3.image16.ref.png | Bin 0 -> 3141 bytes + .../ft-text-vertical-layout-type3.pdf.ref.png | Bin 0 -> 3639 bytes + .../ft-text-vertical-layout-type3.ps.ref.png | Bin 0 -> 2134 bytes + .../ft-text-vertical-layout-type3.quartz.ref.png | Bin 0 -> 3573 bytes + .../ft-text-vertical-layout-type3.ref.png | Bin 0 -> 3222 bytes + .../ft-text-vertical-layout-type3.svg.ref.png | Bin 0 -> 3626 bytes + .../ft-text-vertical-layout-type3.xlib.ref.png | Bin 0 -> 3597 bytes + .../reference/get-group-target.base.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/get-group-target.base.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/get-group-target.ref.png | Bin 0 -> 134 bytes + test/reference/gl-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/gl-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/reference/gl-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../glyph-cache-pressure.base.argb32.ref.png | Bin 0 -> 2863 bytes + .../glyph-cache-pressure.base.rgb24.ref.png | Bin 0 -> 2863 bytes + .../reference/glyph-cache-pressure.image16.ref.png | Bin 0 -> 2453 bytes + test/reference/glyph-cache-pressure.ps2.ref.png | Bin 0 -> 1454 bytes + test/reference/glyph-cache-pressure.ps3.ref.png | Bin 0 -> 1454 bytes + test/reference/glyph-cache-pressure.quartz.ref.png | Bin 0 -> 3284 bytes + test/reference/glyph-cache-pressure.ref.png | Bin 0 -> 2863 bytes + test/reference/gradient-alpha.base.argb32.ref.png | Bin 0 -> 125 bytes + test/reference/gradient-alpha.base.rgb24.ref.png | Bin 0 -> 119 bytes + test/reference/gradient-alpha.ps2.argb32.ref.png | Bin 0 -> 134 bytes + test/reference/gradient-alpha.ps2.rgb24.ref.png | Bin 0 -> 130 bytes + test/reference/gradient-alpha.ps3.argb32.ref.png | Bin 0 -> 134 bytes + test/reference/gradient-alpha.ps3.rgb24.ref.png | Bin 0 -> 130 bytes + test/reference/gradient-alpha.ref.png | Bin 0 -> 147 bytes + test/reference/gradient-alpha.rgb24.ref.png | Bin 0 -> 119 bytes + .../gradient-constant-alpha.base.argb32.ref.png | Bin 0 -> 111 bytes + .../gradient-constant-alpha.base.rgb24.ref.png | Bin 0 -> 106 bytes + test/reference/gradient-constant-alpha.ps3.ref.png | Bin 0 -> 124 bytes + .../gradient-constant-alpha.ps3.rgb24.ref.png | Bin 0 -> 124 bytes + .../gradient-constant-alpha.quartz.argb32.ref.png | Bin 0 -> 214 bytes + test/reference/gradient-constant-alpha.ref.png | Bin 0 -> 117 bytes + .../gradient-constant-alpha.rgb24.ref.png | Bin 0 -> 106 bytes + .../gradient-zero-stops-mask.argb32.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops-mask.base.argb32.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops-mask.base.rgb24.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops-mask.rgb24.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops.base.argb32.ref.png | Bin 0 -> 86 bytes + .../gradient-zero-stops.base.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/gradient-zero-stops.ref.png | Bin 0 -> 105 bytes + test/reference/gradient-zero-stops.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/group-clip.base.argb32.ref.png | Bin 0 -> 191 bytes + test/reference/group-clip.base.rgb24.ref.png | Bin 0 -> 191 bytes + test/reference/group-clip.image16.ref.png | Bin 0 -> 193 bytes + test/reference/group-clip.ref.png | Bin 0 -> 191 bytes + test/reference/group-paint.base.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/group-paint.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/group-paint.ref.png | Bin 0 -> 118 bytes + test/reference/group-unaligned.base.argb32.ref.png | Bin 0 -> 468 bytes + test/reference/group-unaligned.base.rgb24.ref.png | Bin 0 -> 468 bytes + test/reference/group-unaligned.image16.ref.png | Bin 0 -> 395 bytes + test/reference/group-unaligned.ps.ref.png | Bin 0 -> 321 bytes + test/reference/group-unaligned.ps.rgb24.xfail.png | Bin 0 -> 371 bytes + test/reference/group-unaligned.quartz.ref.png | Bin 0 -> 363 bytes + test/reference/group-unaligned.ref.png | Bin 0 -> 325 bytes + .../reference/group-unaligned.svg.argb32.xfail.png | Bin 0 -> 520 bytes + test/reference/group-unaligned.svg.rgb24.xfail.png | Bin 0 -> 425 bytes + .../group-unaligned.xlib-fallback.ref.png | Bin 0 -> 474 bytes + test/reference/group-unaligned.xlib.ref.png | Bin 0 -> 466 bytes + test/reference/halo-transform.base.argb32.ref.png | Bin 0 -> 15118 bytes + test/reference/halo-transform.base.rgb24.ref.png | Bin 0 -> 15118 bytes + test/reference/halo-transform.image16.ref.png | Bin 0 -> 10983 bytes + test/reference/halo-transform.ps.ref.png | Bin 0 -> 8691 bytes + test/reference/halo-transform.quartz.ref.png | Bin 0 -> 14360 bytes + test/reference/halo-transform.ref.png | Bin 0 -> 11313 bytes + test/reference/halo-transform.xlib.ref.png | Bin 0 -> 15346 bytes + test/reference/halo.base.argb32.ref.png | Bin 0 -> 8800 bytes + test/reference/halo.base.rgb24.ref.png | Bin 0 -> 8800 bytes + test/reference/halo.image16.ref.png | Bin 0 -> 6172 bytes + test/reference/halo.ps.ref.png | Bin 0 -> 5220 bytes + test/reference/halo.quartz.ref.png | Bin 0 -> 8601 bytes + test/reference/halo.ref.png | Bin 0 -> 7297 bytes + test/reference/halo.xlib.ref.png | Bin 0 -> 8835 bytes + test/reference/hatchings.base.argb32.ref.png | Bin 0 -> 90611 bytes + test/reference/hatchings.base.rgb24.ref.png | Bin 0 -> 90611 bytes + test/reference/hatchings.ref.png | Bin 0 -> 45398 bytes + test/reference/hatchings.xlib.ref.png | Bin 0 -> 92532 bytes + test/reference/horizontal-clip.base.argb32.ref.png | Bin 0 -> 113 bytes + test/reference/horizontal-clip.base.rgb24.ref.png | Bin 0 -> 113 bytes + test/reference/horizontal-clip.ref.png | Bin 0 -> 129 bytes + test/reference/huge-linear.base.argb32.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-linear.base.rgb24.ref.png | Bin 0 -> 1600 bytes + test/reference/huge-linear.image16.ref.png | Bin 0 -> 1542 bytes + test/reference/huge-linear.pdf.ref.png | Bin 0 -> 1586 bytes + test/reference/huge-linear.ps3.ref.png | Bin 0 -> 1786 bytes + test/reference/huge-linear.quartz.ref.png | Bin 0 -> 15230 bytes + test/reference/huge-linear.ref.png | Bin 0 -> 1619 bytes + test/reference/huge-radial.base.argb32.ref.png | Bin 0 -> 41702 bytes + test/reference/huge-radial.base.rgb24.ref.png | Bin 0 -> 41702 bytes + test/reference/huge-radial.image16.ref.png | Bin 0 -> 17893 bytes + test/reference/huge-radial.pdf.argb32.ref.png | Bin 0 -> 177382 bytes + test/reference/huge-radial.pdf.rgb24.ref.png | Bin 0 -> 225358 bytes + test/reference/huge-radial.ps3.ref.png | Bin 0 -> 18449 bytes + test/reference/huge-radial.quartz.ref.png | Bin 0 -> 84690 bytes + test/reference/huge-radial.ref.png | Bin 0 -> 41702 bytes + .../image-bug-710072-aligned.base.argb32.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-aligned.base.rgb24.ref.png | Bin 0 -> 151 bytes + test/reference/image-bug-710072-aligned.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-unaligned.base.argb32.ref.png | Bin 0 -> 219 bytes + .../image-bug-710072-unaligned.base.rgb24.ref.png | Bin 0 -> 219 bytes + test/reference/image-bug-710072-unaligned.ref.png | Bin 0 -> 212 bytes + .../image-bug-710072-unaligned.xlib.ref.png | Bin 0 -> 219 bytes + test/reference/image-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../image-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../image-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + .../reference/image-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/reference/image-surface-source.ps2.ref.png | Bin 0 -> 376 bytes + test/reference/image-surface-source.ps3.ref.png | Bin 0 -> 376 bytes + test/reference/image-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../image-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + .../image-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/reference/implicit-close.base.argb32.ref.png | Bin 0 -> 251 bytes + test/reference/implicit-close.base.rgb24.ref.png | Bin 0 -> 251 bytes + test/reference/implicit-close.ps.ref.png | Bin 0 -> 252 bytes + test/reference/implicit-close.ref.png | Bin 0 -> 251 bytes + test/reference/infinite-join.base.argb32.ref.png | Bin 0 -> 160 bytes + test/reference/infinite-join.base.rgb24.ref.png | Bin 0 -> 160 bytes + test/reference/infinite-join.ps2.ref.png | Bin 0 -> 218 bytes + test/reference/infinite-join.ps3.ref.png | Bin 0 -> 218 bytes + test/reference/infinite-join.ref.png | Bin 0 -> 142 bytes + test/reference/inverse-text.base.argb32.ref.png | Bin 0 -> 2166 bytes + test/reference/inverse-text.base.rgb24.ref.png | Bin 0 -> 2166 bytes + test/reference/inverse-text.image16.ref.png | Bin 0 -> 1863 bytes + test/reference/inverse-text.ps.ref.png | Bin 0 -> 776 bytes + test/reference/inverse-text.quartz.ref.png | Bin 0 -> 2565 bytes + test/reference/inverse-text.ref.png | Bin 0 -> 2166 bytes + test/reference/joins-loop.base.argb32.ref.png | Bin 0 -> 4202 bytes + test/reference/joins-loop.base.rgb24.ref.png | Bin 0 -> 4202 bytes + test/reference/joins-loop.ref.png | Bin 0 -> 3112 bytes + test/reference/joins-retrace.base.argb32.ref.png | Bin 0 -> 4667 bytes + test/reference/joins-retrace.base.rgb24.ref.png | Bin 0 -> 4667 bytes + test/reference/joins-retrace.ref.png | Bin 0 -> 3951 bytes + test/reference/joins-star.base.argb32.ref.png | Bin 0 -> 3583 bytes + test/reference/joins-star.base.rgb24.ref.png | Bin 0 -> 3583 bytes + test/reference/joins-star.ref.png | Bin 0 -> 4028 bytes + test/reference/joins.base.argb32.ref.png | Bin 0 -> 5684 bytes + test/reference/joins.base.rgb24.ref.png | Bin 0 -> 5684 bytes + test/reference/joins.image16.ref.png | Bin 0 -> 5858 bytes + test/reference/joins.ps.ref.png | Bin 0 -> 4230 bytes + test/reference/joins.quartz.ref.png | Bin 0 -> 5833 bytes + test/reference/joins.ref.png | Bin 0 -> 4880 bytes + test/reference/large-clip.base.argb32.ref.png | Bin 0 -> 305 bytes + test/reference/large-clip.base.rgb24.ref.png | Bin 0 -> 305 bytes + test/reference/large-clip.ref.png | Bin 0 -> 350 bytes + test/reference/large-font.base.argb32.ref.png | Bin 0 -> 6117 bytes + test/reference/large-font.base.rgb24.ref.png | Bin 0 -> 6117 bytes + test/reference/large-font.image16.ref.png | Bin 0 -> 5713 bytes + test/reference/large-font.ref.png | Bin 0 -> 6936 bytes + .../reference/large-source-roi.base.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/large-source-roi.base.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/large-source-roi.ref.png | Bin 0 -> 112 bytes + test/reference/large-source.base.argb32.ref.png | Bin 0 -> 112 bytes + test/reference/large-source.base.rgb24.ref.png | Bin 0 -> 112 bytes + test/reference/large-source.ref.png | Bin 0 -> 137 bytes + .../large-twin-antialias-mixed.base.argb32.ref.png | Bin 0 -> 10740 bytes + .../large-twin-antialias-mixed.base.rgb24.ref.png | Bin 0 -> 10740 bytes + .../large-twin-antialias-mixed.image16.ref.png | Bin 0 -> 14398 bytes + test/reference/large-twin-antialias-mixed.ref.png | Bin 0 -> 10740 bytes + .../large-twin-antialias-mixed.xlib.ref.png | Bin 0 -> 14655 bytes + test/reference/leaky-dash.base.argb32.ref.png | Bin 0 -> 197 bytes + test/reference/leaky-dash.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/leaky-dash.ps2.argb32.ref.png | Bin 0 -> 286 bytes + test/reference/leaky-dash.ps2.rgb24.ref.png | Bin 0 -> 284 bytes + test/reference/leaky-dash.ps3.argb32.ref.png | Bin 0 -> 286 bytes + test/reference/leaky-dash.ps3.rgb24.ref.png | Bin 0 -> 284 bytes + test/reference/leaky-dash.quartz.ref.png | Bin 0 -> 195 bytes + test/reference/leaky-dash.ref.png | Bin 0 -> 243 bytes + .../leaky-dashed-rectangle.base.argb32.ref.png | Bin 0 -> 345 bytes + .../leaky-dashed-rectangle.base.rgb24.ref.png | Bin 0 -> 345 bytes + .../leaky-dashed-rectangle.image16.ref.png | Bin 0 -> 367 bytes + test/reference/leaky-dashed-rectangle.pdf.ref.png | Bin 0 -> 377 bytes + test/reference/leaky-dashed-rectangle.ps.ref.png | Bin 0 -> 358 bytes + .../leaky-dashed-rectangle.quartz.ref.png | Bin 0 -> 339 bytes + test/reference/leaky-dashed-rectangle.ref.png | Bin 0 -> 357 bytes + test/reference/leaky-dashed-rectangle.xlib.ref.png | Bin 0 -> 344 bytes + .../leaky-dashed-stroke.base.argb32.ref.png | Bin 0 -> 9303 bytes + .../leaky-dashed-stroke.base.rgb24.ref.png | Bin 0 -> 9303 bytes + test/reference/leaky-dashed-stroke.image16.ref.png | Bin 0 -> 8089 bytes + test/reference/leaky-dashed-stroke.ps.ref.png | Bin 0 -> 5293 bytes + test/reference/leaky-dashed-stroke.quartz.ref.png | Bin 0 -> 9229 bytes + test/reference/leaky-dashed-stroke.ref.png | Bin 0 -> 5627 bytes + test/reference/leaky-dashed-stroke.xlib.ref.png | Bin 0 -> 9305 bytes + test/reference/leaky-polygon.base.argb32.ref.png | Bin 0 -> 325 bytes + test/reference/leaky-polygon.base.rgb24.ref.png | Bin 0 -> 325 bytes + test/reference/leaky-polygon.image16.ref.png | Bin 0 -> 329 bytes + test/reference/leaky-polygon.ps.ref.png | Bin 0 -> 289 bytes + test/reference/leaky-polygon.ref.png | Bin 0 -> 281 bytes + .../line-width-overlap-dashed.base.argb32.ref.png | Bin 0 -> 397 bytes + .../line-width-overlap-dashed.base.rgb24.ref.png | Bin 0 -> 397 bytes + .../line-width-overlap-flipped.base.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flipped.base.rgb24.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-overlap-flipped.ref.png | Bin 0 -> 296 bytes + .../line-width-overlap-flopped.base.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.base.rgb24.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-overlap-flopped.ref.png | Bin 0 -> 296 bytes + .../line-width-overlap-offset.base.argb32.ref.png | Bin 0 -> 365 bytes + .../line-width-overlap-offset.base.rgb24.ref.png | Bin 0 -> 365 bytes + test/reference/line-width-overlap-offset.ref.png | Bin 0 -> 348 bytes + .../line-width-overlap-rotated.base.argb32.ref.png | Bin 0 -> 628 bytes + .../line-width-overlap-rotated.base.rgb24.ref.png | Bin 0 -> 628 bytes + test/reference/line-width-overlap-rotated.ref.png | Bin 0 -> 719 bytes + .../line-width-overlap.base.argb32.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap.base.rgb24.ref.png | Bin 0 -> 324 bytes + test/reference/line-width-overlap.ref.png | Bin 0 -> 324 bytes + .../reference/line-width-scale.base.argb32.ref.png | Bin 0 -> 5692 bytes + test/reference/line-width-scale.base.rgb24.ref.png | Bin 0 -> 5692 bytes + test/reference/line-width-scale.image16.ref.png | Bin 0 -> 4721 bytes + test/reference/line-width-scale.ps2.ref.png | Bin 0 -> 3431 bytes + test/reference/line-width-scale.ps3.ref.png | Bin 0 -> 3431 bytes + test/reference/line-width-scale.quartz.ref.png | Bin 0 -> 5623 bytes + test/reference/line-width-scale.ref.png | Bin 0 -> 3568 bytes + .../line-width-tolerance.base.argb32.ref.png | Bin 0 -> 163 bytes + .../line-width-tolerance.base.rgb24.ref.png | Bin 0 -> 163 bytes + test/reference/line-width-tolerance.ref.png | Bin 0 -> 192 bytes + test/reference/line-width.base.argb32.ref.png | Bin 0 -> 180 bytes + test/reference/line-width.base.rgb24.ref.png | Bin 0 -> 180 bytes + test/reference/line-width.ref.png | Bin 0 -> 201 bytes + .../linear-gradient-extend.base.argb32.ref.png | Bin 0 -> 371 bytes + .../linear-gradient-extend.base.rgb24.ref.png | Bin 0 -> 371 bytes + test/reference/linear-gradient-extend.ref.png | Bin 0 -> 371 bytes + .../linear-gradient-large.base.argb32.ref.png | Bin 0 -> 4076 bytes + .../linear-gradient-large.base.rgb24.ref.png | Bin 0 -> 4076 bytes + .../reference/linear-gradient-large.quartz.ref.png | Bin 0 -> 4074 bytes + test/reference/linear-gradient-large.ref.png | Bin 0 -> 4076 bytes + .../linear-gradient-one-stop.argb32.ref.png | Bin 0 -> 225 bytes + .../linear-gradient-one-stop.base.argb32.ref.png | Bin 0 -> 225 bytes + .../linear-gradient-one-stop.base.rgb24.ref.png | Bin 0 -> 174 bytes + .../linear-gradient-one-stop.rgb24.ref.png | Bin 0 -> 174 bytes + .../linear-gradient-reflect.base.argb32.ref.png | Bin 0 -> 185 bytes + .../linear-gradient-reflect.base.rgb24.ref.png | Bin 0 -> 185 bytes + .../linear-gradient-reflect.image16.ref.png | Bin 0 -> 190 bytes + .../linear-gradient-reflect.pdf.argb32.ref.png | Bin 0 -> 248 bytes + .../linear-gradient-reflect.pdf.rgb24.ref.png | Bin 0 -> 248 bytes + test/reference/linear-gradient-reflect.ps3.ref.png | Bin 0 -> 314 bytes + .../linear-gradient-reflect.quartz.ref.png | Bin 0 -> 780 bytes + test/reference/linear-gradient-reflect.ref.png | Bin 0 -> 216 bytes + .../linear-gradient-subset.base.argb32.ref.png | Bin 0 -> 773 bytes + .../linear-gradient-subset.base.rgb24.ref.png | Bin 0 -> 773 bytes + .../linear-gradient-subset.image16.ref.png | Bin 0 -> 791 bytes + test/reference/linear-gradient-subset.ps3.ref.png | Bin 0 -> 619 bytes + .../linear-gradient-subset.quartz.ref.png | Bin 0 -> 852 bytes + test/reference/linear-gradient-subset.ref.png | Bin 0 -> 802 bytes + test/reference/linear-gradient-subset.xlib.ref.png | Bin 0 -> 782 bytes + test/reference/linear-gradient.base.argb32.ref.png | Bin 0 -> 914 bytes + test/reference/linear-gradient.base.rgb24.ref.png | Bin 0 -> 914 bytes + test/reference/linear-gradient.image16.ref.png | Bin 0 -> 941 bytes + test/reference/linear-gradient.ps3.ref.png | Bin 0 -> 779 bytes + test/reference/linear-gradient.quartz.ref.png | Bin 0 -> 951 bytes + test/reference/linear-gradient.ref.png | Bin 0 -> 961 bytes + test/reference/linear-gradient.xlib.ref.png | Bin 0 -> 1021 bytes + .../linear-step-function.base.argb32.ref.png | Bin 0 -> 118 bytes + .../linear-step-function.base.rgb24.ref.png | Bin 0 -> 118 bytes + test/reference/linear-step-function.xfail.png | Bin 0 -> 116 bytes + test/reference/linear-uniform.base.argb32.ref.png | Bin 0 -> 128 bytes + test/reference/linear-uniform.base.rgb24.ref.png | Bin 0 -> 128 bytes + test/reference/linear-uniform.image16.ref.png | Bin 0 -> 131 bytes + test/reference/linear-uniform.ref.png | Bin 0 -> 128 bytes + .../long-dashed-lines.base.argb32.ref.png | Bin 0 -> 2071 bytes + .../reference/long-dashed-lines.base.rgb24.ref.png | Bin 0 -> 2071 bytes + test/reference/long-dashed-lines.image16.ref.png | Bin 0 -> 1974 bytes + test/reference/long-dashed-lines.ps2.ref.png | Bin 0 -> 1329 bytes + test/reference/long-dashed-lines.ps3.ref.png | Bin 0 -> 1329 bytes + test/reference/long-dashed-lines.quartz.ref.png | Bin 0 -> 2068 bytes + test/reference/long-dashed-lines.ref.png | Bin 0 -> 1453 bytes + test/reference/long-lines.base.argb32.ref.png | Bin 0 -> 201 bytes + test/reference/long-lines.base.rgb24.ref.png | Bin 0 -> 201 bytes + .../reference/map-all-to-image.base.argb32.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-image.base.rgb24.ref.png | Bin 0 -> 86 bytes + test/reference/map-all-to-image.ref.png | Bin 0 -> 86 bytes + .../reference/map-bit-to-image.base.argb32.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-image.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-bit-to-image.ref.png | Bin 0 -> 103 bytes + .../map-to-image-fill.base.argb32.ref.png | Bin 0 -> 103 bytes + .../reference/map-to-image-fill.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/reference/map-to-image-fill.ref.png | Bin 0 -> 103 bytes + test/reference/mask-alpha.argb32.ref.png | Bin 0 -> 596 bytes + test/reference/mask-alpha.base.argb32.ref.png | Bin 0 -> 627 bytes + test/reference/mask-alpha.base.rgb24.ref.png | Bin 0 -> 588 bytes + test/reference/mask-alpha.image16.ref.png | Bin 0 -> 560 bytes + test/reference/mask-alpha.quartz.argb32.ref.png | Bin 0 -> 622 bytes + test/reference/mask-alpha.rgb24.ref.png | Bin 0 -> 546 bytes + test/reference/mask-alpha.svg.rgb24.xfail.png | Bin 0 -> 585 bytes + test/reference/mask-alpha.xlib.ref.png | Bin 0 -> 640 bytes + test/reference/mask-alpha.xlib.rgb24.ref.png | Bin 0 -> 599 bytes + test/reference/mask-ctm.base.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-ctm.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/mask-ctm.ref.png | Bin 0 -> 129 bytes + test/reference/mask-ctm.rgb24.ref.png | Bin 0 -> 124 bytes + test/reference/mask-glyphs.gl.ref.png | Bin 0 -> 1188669 bytes + test/reference/mask-glyphs.image16.ref.png | Bin 0 -> 1053144 bytes + test/reference/mask-glyphs.pdf.ref.png | Bin 0 -> 1187713 bytes + test/reference/mask-glyphs.ref.png | Bin 0 -> 1189351 bytes + test/reference/mask-glyphs.svg.ref.png | Bin 0 -> 1211144 bytes + .../reference/mask-surface-ctm.base.argb32.ref.png | Bin 0 -> 110 bytes + test/reference/mask-surface-ctm.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/reference/mask-surface-ctm.ref.png | Bin 0 -> 129 bytes + test/reference/mask-surface-ctm.rgb24.ref.png | Bin 0 -> 124 bytes + .../mask-transformed-image.base.argb32.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-image.base.rgb24.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-image.image16.ref.png | Bin 0 -> 2748 bytes + test/reference/mask-transformed-image.pdf.ref.png | Bin 0 -> 3528 bytes + .../mask-transformed-image.quartz.ref.png | Bin 0 -> 3909 bytes + test/reference/mask-transformed-image.ref.png | Bin 0 -> 4516 bytes + .../mask-transformed-similar.base.argb32.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-similar.base.rgb24.ref.png | Bin 0 -> 3812 bytes + .../mask-transformed-similar.image16.ref.png | Bin 0 -> 2748 bytes + .../reference/mask-transformed-similar.pdf.ref.png | Bin 0 -> 4213 bytes + .../mask-transformed-similar.quartz.ref.png | Bin 0 -> 3909 bytes + test/reference/mask-transformed-similar.ref.png | Bin 0 -> 4516 bytes + .../reference/mask-transformed-similar.svg.ref.png | Bin 0 -> 3365 bytes + test/reference/mask.argb32.ref.png | Bin 0 -> 8218 bytes + test/reference/mask.base.argb32.ref.png | Bin 0 -> 8451 bytes + test/reference/mask.base.rgb24.ref.png | Bin 0 -> 7058 bytes + test/reference/mask.image16.ref.png | Bin 0 -> 5533 bytes + test/reference/mask.pdf.argb32.ref.png | Bin 0 -> 7866 bytes + test/reference/mask.pdf.rgb24.ref.png | Bin 0 -> 7336 bytes + test/reference/mask.quartz.argb32.ref.png | Bin 0 -> 10669 bytes + test/reference/mask.quartz.rgb24.ref.png | Bin 0 -> 8354 bytes + test/reference/mask.rgb24.ref.png | Bin 0 -> 7007 bytes + test/reference/mask.svg.argb32.xfail.png | Bin 0 -> 8641 bytes + test/reference/mask.svg.rgb24.xfail.png | Bin 0 -> 7199 bytes + test/reference/mask.xlib.ref.png | Bin 0 -> 8476 bytes + test/reference/mask.xlib.rgb24.ref.png | Bin 0 -> 7041 bytes + .../mesh-pattern-accuracy.base.argb32.ref.png | Bin 0 -> 8086 bytes + .../mesh-pattern-accuracy.base.rgb24.ref.png | Bin 0 -> 8086 bytes + .../mesh-pattern-accuracy.image16.ref.png | Bin 0 -> 7209 bytes + test/reference/mesh-pattern-accuracy.ref.png | Bin 0 -> 8086 bytes + .../mesh-pattern-conical.base.argb32.ref.png | Bin 0 -> 8655 bytes + .../mesh-pattern-conical.base.rgb24.ref.png | Bin 0 -> 8655 bytes + .../reference/mesh-pattern-conical.image16.ref.png | Bin 0 -> 6141 bytes + test/reference/mesh-pattern-conical.ref.png | Bin 0 -> 8655 bytes + ...mesh-pattern-control-points.base.argb32.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-control-points.base.rgb24.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-control-points.image16.ref.png | Bin 0 -> 7178 bytes + test/reference/mesh-pattern-control-points.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-fold.base.argb32.ref.png | Bin 0 -> 52980 bytes + .../reference/mesh-pattern-fold.base.rgb24.ref.png | Bin 0 -> 52980 bytes + test/reference/mesh-pattern-fold.image16.ref.png | Bin 0 -> 22913 bytes + test/reference/mesh-pattern-fold.ref.png | Bin 0 -> 52980 bytes + .../mesh-pattern-overlap.base.argb32.ref.png | Bin 0 -> 9129 bytes + .../mesh-pattern-overlap.base.rgb24.ref.png | Bin 0 -> 9129 bytes + .../reference/mesh-pattern-overlap.image16.ref.png | Bin 0 -> 5933 bytes + test/reference/mesh-pattern-overlap.ref.png | Bin 0 -> 9129 bytes + .../mesh-pattern-transformed.base.argb32.ref.png | Bin 0 -> 14463 bytes + .../mesh-pattern-transformed.base.rgb24.ref.png | Bin 0 -> 14463 bytes + .../mesh-pattern-transformed.image16.ref.png | Bin 0 -> 9778 bytes + test/reference/mesh-pattern-transformed.ref.png | Bin 0 -> 14463 bytes + test/reference/mesh-pattern.base.argb32.ref.png | Bin 0 -> 19566 bytes + test/reference/mesh-pattern.base.rgb24.ref.png | Bin 0 -> 19566 bytes + test/reference/mesh-pattern.image16.ref.png | Bin 0 -> 12199 bytes + test/reference/mesh-pattern.ref.png | Bin 0 -> 19566 bytes + test/reference/mime-data.base.argb32.ref.png | Bin 0 -> 185 bytes + test/reference/mime-data.base.rgb24.ref.png | Bin 0 -> 185 bytes + test/reference/mime-data.pdf.ref.png | Bin 0 -> 6482 bytes + test/reference/mime-data.ps.ref.png | Bin 0 -> 4554 bytes + test/reference/mime-data.ref.png | Bin 0 -> 185 bytes + test/reference/mime-data.script.ref.png | Bin 0 -> 2041 bytes + test/reference/mime-data.svg.ref.png | Bin 0 -> 6264 bytes + test/reference/mime-surface.base.argb32.ref.png | Bin 0 -> 1209 bytes + test/reference/mime-surface.base.rgb24.ref.png | Bin 0 -> 1209 bytes + test/reference/mime-surface.ref.png | Bin 0 -> 1209 bytes + test/reference/miter-precision.base.argb32.ref.png | Bin 0 -> 818 bytes + test/reference/miter-precision.base.rgb24.ref.png | Bin 0 -> 818 bytes + test/reference/miter-precision.ps2.ref.png | Bin 0 -> 865 bytes + test/reference/miter-precision.ps3.ref.png | Bin 0 -> 865 bytes + test/reference/miter-precision.ref.png | Bin 0 -> 931 bytes + .../move-to-show-surface.base.argb32.ref.png | Bin 0 -> 96 bytes + .../move-to-show-surface.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/move-to-show-surface.ref.png | Bin 0 -> 100 bytes + test/reference/new-sub-path.argb32.ref.png | Bin 0 -> 331 bytes + test/reference/new-sub-path.base.argb32.ref.png | Bin 0 -> 415 bytes + test/reference/new-sub-path.base.rgb24.ref.png | Bin 0 -> 378 bytes + test/reference/new-sub-path.pdf.argb32.ref.png | Bin 0 -> 512 bytes + test/reference/new-sub-path.ps2.argb32.ref.png | Bin 0 -> 398 bytes + test/reference/new-sub-path.ps2.rgb24.ref.png | Bin 0 -> 423 bytes + test/reference/new-sub-path.ps3.argb32.ref.png | Bin 0 -> 398 bytes + test/reference/new-sub-path.ps3.rgb24.ref.png | Bin 0 -> 423 bytes + test/reference/new-sub-path.quartz.ref.png | Bin 0 -> 370 bytes + test/reference/new-sub-path.rgb24.ref.png | Bin 0 -> 303 bytes + test/reference/nil-surface.base.argb32.ref.png | Bin 0 -> 88 bytes + test/reference/nil-surface.base.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/nil-surface.ref.png | Bin 0 -> 107 bytes + test/reference/nil-surface.rgb24.ref.png | Bin 0 -> 106 bytes + .../operator-alpha-alpha.base.argb32.ref.png | Bin 0 -> 3441 bytes + .../operator-alpha-alpha.base.rgb24.ref.png | Bin 0 -> 3441 bytes + .../reference/operator-alpha-alpha.image16.ref.png | Bin 0 -> 4140 bytes + test/reference/operator-alpha-alpha.pdf.xfail.png | Bin 0 -> 3749 bytes + test/reference/operator-alpha-alpha.ps.xfail.png | Bin 0 -> 3429 bytes + test/reference/operator-alpha-alpha.ref.png | Bin 0 -> 3441 bytes + test/reference/operator-alpha-alpha.svg.xfail.png | Bin 0 -> 838 bytes + test/reference/operator-alpha.base.argb32.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.base.rgb24.ref.png | Bin 0 -> 205 bytes + test/reference/operator-alpha.ref.png | Bin 0 -> 280 bytes + test/reference/operator-alpha.rgb24.ref.png | Bin 0 -> 229 bytes + .../operator-alpha.svg12.argb32.xfail.png | Bin 0 -> 274 bytes + .../reference/operator-alpha.svg12.rgb24.xfail.png | Bin 0 -> 248 bytes + test/reference/operator-clear.argb32.ref.png | Bin 0 -> 1080 bytes + test/reference/operator-clear.base.argb32.ref.png | Bin 0 -> 1070 bytes + test/reference/operator-clear.base.rgb24.ref.png | Bin 0 -> 950 bytes + test/reference/operator-clear.ps2.argb32.ref.png | Bin 0 -> 1156 bytes + test/reference/operator-clear.ps3.argb32.ref.png | Bin 0 -> 1156 bytes + .../reference/operator-clear.quartz.argb32.ref.png | Bin 0 -> 1228 bytes + test/reference/operator-clear.quartz.rgb24.ref.png | Bin 0 -> 1096 bytes + test/reference/operator-clear.rgb24.ref.png | Bin 0 -> 948 bytes + .../operator-clear.svg12.argb32.xfail.png | Bin 0 -> 405 bytes + .../reference/operator-clear.svg12.rgb24.xfail.png | Bin 0 -> 535 bytes + test/reference/operator-clear.xlib.argb32.ref.png | Bin 0 -> 1071 bytes + test/reference/operator-clear.xlib.rgb24.ref.png | Bin 0 -> 951 bytes + test/reference/operator-source.base.argb32.ref.png | Bin 0 -> 5630 bytes + test/reference/operator-source.base.rgb24.ref.png | Bin 0 -> 3979 bytes + test/reference/operator-source.image16.ref.png | Bin 0 -> 3959 bytes + test/reference/operator-source.ref.png | Bin 0 -> 5745 bytes + test/reference/operator-source.rgb24.ref.png | Bin 0 -> 4639 bytes + .../operator-source.xlib-fallback.ref.png | Bin 0 -> 4444 bytes + test/reference/operator-source.xlib.ref.png | Bin 0 -> 5721 bytes + test/reference/operator-source.xlib.rgb24.ref.png | Bin 0 -> 4447 bytes + test/reference/operator.base.argb32.ref.png | Bin 0 -> 238 bytes + test/reference/operator.base.rgb24.ref.png | Bin 0 -> 189 bytes + test/reference/operator.ref.png | Bin 0 -> 238 bytes + test/reference/operator.rgb24.ref.png | Bin 0 -> 217 bytes + test/reference/operator.svg12.argb32.xfail.png | Bin 0 -> 238 bytes + test/reference/operator.svg12.rgb24.xfail.png | Bin 0 -> 242 bytes + .../over-above-source.base.argb32.ref.png | Bin 0 -> 533 bytes + .../reference/over-above-source.base.rgb24.ref.png | Bin 0 -> 450 bytes + .../reference/over-above-source.ps2.argb32.ref.png | Bin 0 -> 558 bytes + .../reference/over-above-source.ps3.argb32.ref.png | Bin 0 -> 558 bytes + .../over-above-source.quartz.argb32.ref.png | Bin 0 -> 511 bytes + .../over-above-source.quartz.rgb24.ref.png | Bin 0 -> 437 bytes + test/reference/over-above-source.ref.png | Bin 0 -> 511 bytes + test/reference/over-above-source.rgb24.ref.png | Bin 0 -> 421 bytes + .../over-above-source.svg12.rgb24.xfail.png | Bin 0 -> 563 bytes + test/reference/over-above-source.xlib.ref.png | Bin 0 -> 538 bytes + .../reference/over-above-source.xlib.rgb24.ref.png | Bin 0 -> 461 bytes + .../over-around-source.base.argb32.ref.png | Bin 0 -> 610 bytes + .../over-around-source.base.rgb24.ref.png | Bin 0 -> 492 bytes + test/reference/over-around-source.image16.ref.png | Bin 0 -> 491 bytes + .../over-around-source.pdf.argb32.ref.png | Bin 0 -> 576 bytes + .../over-around-source.ps2.argb32.ref.png | Bin 0 -> 508 bytes + .../reference/over-around-source.ps2.rgb24.ref.png | Bin 0 -> 538 bytes + .../over-around-source.ps3.argb32.ref.png | Bin 0 -> 508 bytes + .../reference/over-around-source.ps3.rgb24.ref.png | Bin 0 -> 538 bytes + .../over-around-source.quartz.argb32.ref.png | Bin 0 -> 593 bytes + test/reference/over-around-source.ref.png | Bin 0 -> 578 bytes + test/reference/over-around-source.rgb24.ref.png | Bin 0 -> 257 bytes + .../over-around-source.svg12.argb32.xfail.png | Bin 0 -> 559 bytes + .../over-around-source.svg12.rgb24.xfail.png | Bin 0 -> 559 bytes + test/reference/over-around-source.xlib.ref.png | Bin 0 -> 614 bytes + .../over-around-source.xlib.rgb24.ref.png | Bin 0 -> 503 bytes + .../over-below-source.base.argb32.ref.png | Bin 0 -> 436 bytes + .../reference/over-below-source.base.rgb24.ref.png | Bin 0 -> 378 bytes + .../reference/over-below-source.pdf.argb32.ref.png | Bin 0 -> 464 bytes + .../reference/over-below-source.ps2.argb32.ref.png | Bin 0 -> 368 bytes + test/reference/over-below-source.ps2.rgb24.ref.png | Bin 0 -> 362 bytes + .../reference/over-below-source.ps3.argb32.ref.png | Bin 0 -> 368 bytes + test/reference/over-below-source.ps3.rgb24.ref.png | Bin 0 -> 362 bytes + test/reference/over-below-source.ref.png | Bin 0 -> 413 bytes + test/reference/over-below-source.rgb24.ref.png | Bin 0 -> 322 bytes + .../over-below-source.svg12.argb32.xfail.png | Bin 0 -> 224 bytes + .../over-below-source.svg12.rgb24.xfail.png | Bin 0 -> 224 bytes + .../over-between-source.base.argb32.ref.png | Bin 0 -> 578 bytes + .../over-between-source.base.rgb24.ref.png | Bin 0 -> 461 bytes + .../over-between-source.ps2.argb32.ref.png | Bin 0 -> 551 bytes + .../over-between-source.ps3.argb32.ref.png | Bin 0 -> 551 bytes + .../over-between-source.quartz.argb32.ref.png | Bin 0 -> 551 bytes + test/reference/over-between-source.ref.png | Bin 0 -> 561 bytes + test/reference/over-between-source.rgb24.ref.png | Bin 0 -> 406 bytes + .../over-between-source.svg12.argb32.xfail.png | Bin 0 -> 224 bytes + .../over-between-source.svg12.rgb24.xfail.png | Bin 0 -> 224 bytes + test/reference/over-between-source.xlib.ref.png | Bin 0 -> 575 bytes + .../over-between-source.xlib.rgb24.ref.png | Bin 0 -> 473 bytes + test/reference/overlapping-boxes.argb32.ref.png | Bin 0 -> 179 bytes + .../overlapping-boxes.base.argb32.ref.png | Bin 0 -> 216 bytes + .../reference/overlapping-boxes.base.rgb24.ref.png | Bin 0 -> 204 bytes + test/reference/overlapping-boxes.rgb24.ref.png | Bin 0 -> 204 bytes + .../overlapping-dash-caps.base.argb32.ref.png | Bin 0 -> 3952 bytes + .../overlapping-dash-caps.base.rgb24.ref.png | Bin 0 -> 3952 bytes + test/reference/overlapping-dash-caps.ref.png | Bin 0 -> 2424 bytes + test/reference/overlapping-glyphs.argb32.ref.png | Bin 0 -> 2258 bytes + .../overlapping-glyphs.base.argb32.ref.png | Bin 0 -> 2684 bytes + .../overlapping-glyphs.base.rgb24.ref.png | Bin 0 -> 1647 bytes + .../overlapping-glyphs.pdf.argb32.xfail.png | Bin 0 -> 2199 bytes + .../overlapping-glyphs.pdf.rgb24.xfail.png | Bin 0 -> 1692 bytes + .../overlapping-glyphs.quartz.argb32.ref.png | Bin 0 -> 2824 bytes + .../overlapping-glyphs.quartz.rgb24.ref.png | Bin 0 -> 1711 bytes + test/reference/overlapping-glyphs.rgb24.ref.png | Bin 0 -> 1390 bytes + .../overlapping-glyphs.svg.argb32.ref.png | Bin 0 -> 2338 bytes + .../reference/overlapping-glyphs.svg.rgb24.ref.png | Bin 0 -> 2338 bytes + .../paint-clip-fill-aa.base.argb32.ref.png | Bin 0 -> 327 bytes + .../paint-clip-fill-aa.base.rgb24.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-aa.ref.png | Bin 0 -> 352 bytes + .../paint-clip-fill-mono.base.argb32.ref.png | Bin 0 -> 327 bytes + .../paint-clip-fill-mono.base.rgb24.ref.png | Bin 0 -> 327 bytes + test/reference/paint-clip-fill-mono.ref.png | Bin 0 -> 352 bytes + test/reference/paint-repeat.base.argb32.ref.png | Bin 0 -> 122 bytes + test/reference/paint-repeat.base.rgb24.ref.png | Bin 0 -> 122 bytes + test/reference/paint-repeat.ref.png | Bin 0 -> 145 bytes + .../paint-source-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes + .../paint-source-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/paint-source-alpha.image16.ref.png | Bin 0 -> 253 bytes + test/reference/paint-source-alpha.ref.png | Bin 0 -> 256 bytes + test/reference/paint-source-alpha.svg.ref.png | Bin 0 -> 693 bytes + .../paint-with-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 305 bytes + .../paint-with-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 305 bytes + test/reference/paint-with-alpha-clip-mask.ref.png | Bin 0 -> 348 bytes + .../paint-with-alpha-clip.base.argb32.ref.png | Bin 0 -> 303 bytes + .../paint-with-alpha-clip.base.rgb24.ref.png | Bin 0 -> 303 bytes + test/reference/paint-with-alpha-clip.ref.png | Bin 0 -> 290 bytes + test/reference/paint-with-alpha-clip.xlib.ref.png | Bin 0 -> 303 bytes + ...paint-with-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 266 bytes + .../paint-with-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 266 bytes + test/reference/paint-with-alpha-solid-clip.ref.png | Bin 0 -> 248 bytes + .../reference/paint-with-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes + test/reference/paint-with-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes + test/reference/paint-with-alpha.image16.ref.png | Bin 0 -> 253 bytes + test/reference/paint-with-alpha.ref.png | Bin 0 -> 256 bytes + test/reference/paint-with-alpha.svg.ref.png | Bin 0 -> 483 bytes + test/reference/paint.base.argb32.ref.png | Bin 0 -> 93 bytes + test/reference/paint.base.rgb24.ref.png | Bin 0 -> 93 bytes + test/reference/paint.ref.png | Bin 0 -> 116 bytes + .../partial-clip-text-bottom.base.argb32.ref.png | Bin 0 -> 259 bytes + .../partial-clip-text-bottom.base.rgb24.ref.png | Bin 0 -> 259 bytes + test/reference/partial-clip-text-bottom.ref.png | Bin 0 -> 259 bytes + .../partial-clip-text-left.base.argb32.ref.png | Bin 0 -> 293 bytes + .../partial-clip-text-left.base.rgb24.ref.png | Bin 0 -> 293 bytes + test/reference/partial-clip-text-left.ref.png | Bin 0 -> 293 bytes + .../partial-clip-text-right.base.argb32.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-right.base.rgb24.ref.png | Bin 0 -> 155 bytes + test/reference/partial-clip-text-right.ref.png | Bin 0 -> 155 bytes + .../partial-clip-text-top.base.argb32.ref.png | Bin 0 -> 173 bytes + .../partial-clip-text-top.base.rgb24.ref.png | Bin 0 -> 173 bytes + test/reference/partial-clip-text-top.ps.ref.png | Bin 0 -> 107 bytes + .../reference/partial-clip-text-top.quartz.ref.png | Bin 0 -> 174 bytes + test/reference/partial-clip-text-top.ref.png | Bin 0 -> 173 bytes + test/reference/partial-clip-text-top.svg.ref.png | Bin 0 -> 173 bytes + ...ial-coverage-half-reference.base.argb32.ref.png | Bin 0 -> 189 bytes + ...tial-coverage-half-reference.base.rgb24.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-half-reference.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-half-triangles.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-intersecting-quads.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-intersecting-quads.xfail.png | Bin 0 -> 262 bytes + ...partial-coverage-intersecting-triangles.ref.png | Bin 0 -> 202 bytes + ...tial-coverage-overlap-half-triangles-eo.ref.png | Bin 0 -> 189 bytes + ...partial-coverage-overlap-half-triangles.ref.png | Bin 0 -> 189 bytes + ...overage-overlap-three-quarter-triangles.ref.png | Bin 0 -> 186 bytes + test/reference/partial-coverage-rectangles.ref.png | Bin 0 -> 202 bytes + .../partial-coverage-reference.base.argb32.ref.png | Bin 0 -> 202 bytes + .../partial-coverage-reference.base.rgb24.ref.png | Bin 0 -> 202 bytes + test/reference/partial-coverage-reference.ref.png | Bin 0 -> 202 bytes + ...age-three-quarter-reference.base.argb32.ref.png | Bin 0 -> 186 bytes + ...rage-three-quarter-reference.base.rgb24.ref.png | Bin 0 -> 186 bytes + ...artial-coverage-three-quarter-reference.ref.png | Bin 0 -> 186 bytes + test/reference/partial-coverage-triangles.ref.png | Bin 0 -> 202 bytes + test/reference/pass-through.ref.png | Bin 0 -> 221 bytes + test/reference/pass-through.rgb24.ref.png | Bin 0 -> 179 bytes + test/reference/path-append.base.argb32.ref.png | Bin 0 -> 6463 bytes + test/reference/path-append.base.rgb24.ref.png | Bin 0 -> 6463 bytes + test/reference/path-append.image16.ref.png | Bin 0 -> 5252 bytes + test/reference/path-append.ps.ref.png | Bin 0 -> 4525 bytes + test/reference/path-append.quartz.ref.png | Bin 0 -> 6395 bytes + test/reference/path-append.ref.png | Bin 0 -> 4424 bytes + test/reference/path-append.test-fallback.ref.png | Bin 0 -> 6461 bytes + test/reference/path-append.xlib-fallback.ref.png | Bin 0 -> 6320 bytes + test/reference/path-append.xlib.ref.png | Bin 0 -> 6461 bytes + .../path-stroke-twice.base.argb32.ref.png | Bin 0 -> 205 bytes + .../reference/path-stroke-twice.base.rgb24.ref.png | Bin 0 -> 205 bytes + test/reference/path-stroke-twice.image16.ref.png | Bin 0 -> 210 bytes + test/reference/path-stroke-twice.ps.ref.png | Bin 0 -> 197 bytes + test/reference/path-stroke-twice.ref.png | Bin 0 -> 209 bytes + test/reference/pattern-getters.base.argb32.ref.png | Bin 0 -> 87 bytes + test/reference/pattern-getters.base.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/pattern-getters.ref.png | Bin 0 -> 107 bytes + test/reference/pdf-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../pdf-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../pdf-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/pdf-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/reference/pdf-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../pdf-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + .../pdf-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/reference/pixman-rotate.base.argb32.ref.png | Bin 0 -> 260 bytes + test/reference/pixman-rotate.base.rgb24.ref.png | Bin 0 -> 225 bytes + test/reference/pixman-rotate.ps.argb32.ref.png | Bin 0 -> 355 bytes + test/reference/pixman-rotate.ref.png | Bin 0 -> 260 bytes + test/reference/pixman-rotate.rgb24.ref.png | Bin 0 -> 244 bytes + test/reference/ps-eps.ref.png | Bin 0 -> 4584 bytes + test/reference/ps-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../ps-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../reference/ps-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/ps-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/reference/ps-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../ps-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + .../ps-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + .../pthread-same-source.base.argb32.ref.png | Bin 0 -> 1000 bytes + .../pthread-same-source.base.rgb24.ref.png | Bin 0 -> 1000 bytes + test/reference/pthread-same-source.image16.ref.png | Bin 0 -> 1007 bytes + .../reference/pthread-same-source.quartz.xfail.png | Bin 0 -> 961 bytes + test/reference/pthread-same-source.ref.png | Bin 0 -> 1000 bytes + .../pthread-show-text.base.argb32.ref.png | Bin 0 -> 29759 bytes + .../reference/pthread-show-text.base.rgb24.ref.png | Bin 0 -> 29759 bytes + test/reference/pthread-show-text.image16.ref.png | Bin 0 -> 22167 bytes + test/reference/pthread-show-text.pdf.ref.png | Bin 0 -> 47015 bytes + test/reference/pthread-show-text.ps.ref.png | Bin 0 -> 16558 bytes + test/reference/pthread-show-text.quartz.ref.png | Bin 0 -> 43005 bytes + test/reference/pthread-show-text.ref.png | Bin 0 -> 29759 bytes + .../pthread-show-text.xlib-fallback.ref.png | Bin 0 -> 42073 bytes + test/reference/pthread-similar.base.argb32.ref.png | Bin 0 -> 170 bytes + test/reference/pthread-similar.base.rgb24.ref.png | Bin 0 -> 170 bytes + test/reference/pthread-similar.ref.png | Bin 0 -> 170 bytes + .../reference/push-group-color.base.argb32.ref.png | Bin 0 -> 2902 bytes + test/reference/push-group-color.base.rgb24.ref.png | Bin 0 -> 2902 bytes + test/reference/push-group-color.image16.ref.png | Bin 0 -> 2277 bytes + test/reference/push-group-color.ps2.ref.png | Bin 0 -> 2863 bytes + test/reference/push-group-color.ps3.ref.png | Bin 0 -> 2561 bytes + test/reference/push-group-color.quartz.ref.png | Bin 0 -> 3127 bytes + test/reference/push-group-color.ref.png | Bin 0 -> 2676 bytes + test/reference/push-group-color.xlib.ref.png | Bin 0 -> 2964 bytes + .../push-group-path-offset.base.argb32.ref.png | Bin 0 -> 186 bytes + .../push-group-path-offset.base.rgb24.ref.png | Bin 0 -> 186 bytes + test/reference/push-group-path-offset.ref.png | Bin 0 -> 186 bytes + test/reference/push-group.base.argb32.ref.png | Bin 0 -> 3110 bytes + test/reference/push-group.base.rgb24.ref.png | Bin 0 -> 2947 bytes + test/reference/push-group.image16.ref.png | Bin 0 -> 2286 bytes + test/reference/push-group.quartz.argb32.ref.png | Bin 0 -> 3932 bytes + test/reference/push-group.quartz.rgb24.ref.png | Bin 0 -> 3659 bytes + test/reference/push-group.ref.png | Bin 0 -> 2829 bytes + test/reference/push-group.rgb24.ref.png | Bin 0 -> 2684 bytes + test/reference/push-group.xlib.ref.png | Bin 0 -> 3126 bytes + test/reference/push-group.xlib.rgb24.ref.png | Bin 0 -> 2961 bytes + .../reference/quartz-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + test/reference/quartz-surface-source.ps2.ref.png | Bin 0 -> 376 bytes + test/reference/quartz-surface-source.ps3.ref.png | Bin 0 -> 376 bytes + test/reference/quartz-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../radial-gradient-extend.base.argb32.ref.png | Bin 0 -> 466 bytes + .../radial-gradient-extend.base.rgb24.ref.png | Bin 0 -> 466 bytes + test/reference/radial-gradient-extend.ps3.ref.png | Bin 0 -> 458 bytes + test/reference/radial-gradient-extend.ref.png | Bin 0 -> 466 bytes + .../radial-gradient-mask-source.argb32.ref.png | Bin 0 -> 145713 bytes + ...radial-gradient-mask-source.base.argb32.ref.png | Bin 0 -> 145713 bytes + .../radial-gradient-mask-source.base.rgb24.ref.png | Bin 0 -> 150945 bytes + .../radial-gradient-mask-source.image16.ref.png | Bin 0 -> 109925 bytes + ...dial-gradient-mask-source.quartz.argb32.ref.png | Bin 0 -> 171002 bytes + ...adial-gradient-mask-source.quartz.rgb24.ref.png | Bin 0 -> 179120 bytes + .../radial-gradient-mask-source.rgb24.ref.png | Bin 0 -> 150945 bytes + ...radial-gradient-mask-source.xlib.argb32.ref.png | Bin 0 -> 145801 bytes + .../radial-gradient-mask-source.xlib.rgb24.ref.png | Bin 0 -> 150362 bytes + .../radial-gradient-mask.base.argb32.ref.png | Bin 0 -> 286065 bytes + .../radial-gradient-mask.base.rgb24.ref.png | Bin 0 -> 286065 bytes + .../reference/radial-gradient-mask.image16.ref.png | Bin 0 -> 204585 bytes + test/reference/radial-gradient-mask.quartz.ref.png | Bin 0 -> 296910 bytes + test/reference/radial-gradient-mask.ref.png | Bin 0 -> 286065 bytes + .../radial-gradient-one-stop.base.argb32.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-one-stop.base.rgb24.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-one-stop.quartz.ref.png | Bin 0 -> 6316 bytes + test/reference/radial-gradient-one-stop.ref.png | Bin 0 -> 6306 bytes + .../radial-gradient-source.argb32.ref.png | Bin 0 -> 408848 bytes + .../radial-gradient-source.base.argb32.ref.png | Bin 0 -> 408848 bytes + .../radial-gradient-source.base.rgb24.ref.png | Bin 0 -> 263908 bytes + .../radial-gradient-source.image16.ref.png | Bin 0 -> 169796 bytes + .../radial-gradient-source.quartz.argb32.ref.png | Bin 0 -> 439222 bytes + .../radial-gradient-source.quartz.rgb24.ref.png | Bin 0 -> 279249 bytes + .../reference/radial-gradient-source.rgb24.ref.png | Bin 0 -> 263908 bytes + test/reference/radial-gradient.base.argb32.ref.png | Bin 0 -> 382283 bytes + test/reference/radial-gradient.base.rgb24.ref.png | Bin 0 -> 382283 bytes + test/reference/radial-gradient.image16.ref.png | Bin 0 -> 256686 bytes + test/reference/radial-gradient.quartz.ref.png | Bin 0 -> 389140 bytes + test/reference/radial-gradient.ref.png | Bin 0 -> 382283 bytes + test/reference/random-clip.base.argb32.ref.png | Bin 0 -> 308138 bytes + test/reference/random-clip.base.rgb24.ref.png | Bin 0 -> 308138 bytes + test/reference/random-clip.ref.png | Bin 0 -> 311369 bytes + ...dom-intersections-curves-eo.base.argb32.ref.png | Bin 0 -> 244476 bytes + ...ndom-intersections-curves-eo.base.rgb24.ref.png | Bin 0 -> 244476 bytes + .../random-intersections-curves-eo.image16.ref.png | Bin 0 -> 181565 bytes + .../random-intersections-curves-eo.pdf.ref.png | Bin 0 -> 246507 bytes + .../random-intersections-curves-eo.ps.ref.png | Bin 0 -> 151668 bytes + .../random-intersections-curves-eo.quartz.ref.png | Bin 0 -> 326366 bytes + .../random-intersections-curves-eo.ref.png | Bin 0 -> 156582 bytes + ...m-intersections-curves-eo.xlib-fallback.ref.png | Bin 0 -> 244255 bytes + .../random-intersections-curves-eo.xlib.ref.png | Bin 0 -> 244255 bytes + ...dom-intersections-curves-nz.base.argb32.ref.png | Bin 0 -> 263669 bytes + ...ndom-intersections-curves-nz.base.rgb24.ref.png | Bin 0 -> 263669 bytes + .../random-intersections-curves-nz.image16.ref.png | Bin 0 -> 204090 bytes + .../random-intersections-curves-nz.pdf.ref.png | Bin 0 -> 266977 bytes + .../random-intersections-curves-nz.ps.ref.png | Bin 0 -> 134746 bytes + .../random-intersections-curves-nz.quartz.ref.png | Bin 0 -> 324940 bytes + .../random-intersections-curves-nz.ref.png | Bin 0 -> 151318 bytes + ...m-intersections-curves-nz.xlib-fallback.ref.png | Bin 0 -> 264277 bytes + .../random-intersections-curves-nz.xlib.ref.png | Bin 0 -> 264277 bytes + .../random-intersections-eo.base.argb32.ref.png | Bin 0 -> 134729 bytes + .../random-intersections-eo.base.rgb24.ref.png | Bin 0 -> 134729 bytes + .../random-intersections-eo.image16.ref.png | Bin 0 -> 97747 bytes + test/reference/random-intersections-eo.ps.ref.png | Bin 0 -> 78037 bytes + .../random-intersections-eo.quartz.ref.png | Bin 0 -> 179179 bytes + test/reference/random-intersections-eo.ref.png | Bin 0 -> 85197 bytes + .../reference/random-intersections-eo.xlib.ref.png | Bin 0 -> 134655 bytes + ...andom-intersections-nonzero.base.argb32.ref.png | Bin 0 -> 141616 bytes + ...random-intersections-nonzero.base.rgb24.ref.png | Bin 0 -> 141616 bytes + .../random-intersections-nonzero.image16.ref.png | Bin 0 -> 107644 bytes + .../random-intersections-nonzero.ps.ref.png | Bin 0 -> 76450 bytes + .../random-intersections-nonzero.quartz.ref.png | Bin 0 -> 180871 bytes + .../reference/random-intersections-nonzero.ref.png | Bin 0 -> 83247 bytes + .../random-intersections-nonzero.xlib.ref.png | Bin 0 -> 141548 bytes + test/reference/record-extend-none-similar.ref.png | Bin 0 -> 293 bytes + test/reference/record-extend-none.ref.png | Bin 0 -> 293 bytes + test/reference/record-extend-pad-similar.ref.png | Bin 0 -> 298 bytes + test/reference/record-extend-pad.ref.png | Bin 0 -> 298 bytes + .../record-extend-reflect-similar.ref.png | Bin 0 -> 335 bytes + test/reference/record-extend-reflect.ref.png | Bin 0 -> 335 bytes + .../reference/record-extend-repeat-similar.ref.png | Bin 0 -> 286 bytes + test/reference/record-extend-repeat.ref.png | Bin 0 -> 286 bytes + test/reference/record-fill-alpha.ref.png | Bin 0 -> 2173 bytes + test/reference/record-mesh.ref.png | Bin 0 -> 15229 bytes + .../reference/record-paint-alpha-clip-mask.ref.png | Bin 0 -> 325 bytes + test/reference/record-paint-alpha-clip.ref.png | Bin 0 -> 299 bytes + .../record-paint-alpha-solid-clip.ref.png | Bin 0 -> 248 bytes + test/reference/record-paint-alpha.ref.png | Bin 0 -> 256 bytes + test/reference/record-paint.ref.png | Bin 0 -> 116 bytes + test/reference/record-select-font-face.ref.png | Bin 0 -> 2473 bytes + test/reference/record-self-intersecting.ref.png | Bin 0 -> 168 bytes + test/reference/record-text-transform.ref.png | Bin 0 -> 6200 bytes + .../recording-surface-extend-none.argb32.ref.png | Bin 0 -> 3051 bytes + ...cording-surface-extend-none.base.argb32.ref.png | Bin 0 -> 3055 bytes + ...ecording-surface-extend-none.base.rgb24.ref.png | Bin 0 -> 3124 bytes + .../recording-surface-extend-none.rgb24.ref.png | Bin 0 -> 3128 bytes + .../recording-surface-extend-pad.argb32.ref.png | Bin 0 -> 10822 bytes + ...ecording-surface-extend-pad.base.argb32.ref.png | Bin 0 -> 10832 bytes + ...recording-surface-extend-pad.base.rgb24.ref.png | Bin 0 -> 12496 bytes + .../recording-surface-extend-pad.rgb24.ref.png | Bin 0 -> 12582 bytes + ...recording-surface-extend-reflect.argb32.ref.png | Bin 0 -> 23518 bytes + ...ding-surface-extend-reflect.base.argb32.ref.png | Bin 0 -> 23617 bytes + ...rding-surface-extend-reflect.base.rgb24.ref.png | Bin 0 -> 24139 bytes + .../recording-surface-extend-reflect.rgb24.ref.png | Bin 0 -> 23881 bytes + .../recording-surface-extend-repeat.argb32.ref.png | Bin 0 -> 24047 bytes + ...rding-surface-extend-repeat.base.argb32.ref.png | Bin 0 -> 24112 bytes + ...ording-surface-extend-repeat.base.rgb24.ref.png | Bin 0 -> 24029 bytes + .../recording-surface-extend-repeat.rgb24.ref.png | Bin 0 -> 24038 bytes + .../recording-surface-over.base.argb32.ref.png | Bin 0 -> 3055 bytes + .../recording-surface-over.base.rgb24.ref.png | Bin 0 -> 3124 bytes + .../recording-surface-over.gl.argb32.ref.png | Bin 0 -> 3130 bytes + .../recording-surface-over.image16.ref.png | Bin 0 -> 2856 bytes + .../recording-surface-over.pdf.argb32.ref.png | Bin 0 -> 3908 bytes + .../recording-surface-over.pdf.rgb24.ref.png | Bin 0 -> 3760 bytes + .../recording-surface-over.ps.argb32.ref.png | Bin 0 -> 3064 bytes + .../recording-surface-over.ps.rgb24.ref.png | Bin 0 -> 3147 bytes + .../recording-surface-over.quartz.argb32.ref.png | Bin 0 -> 4570 bytes + .../recording-surface-over.quartz.rgb24.ref.png | Bin 0 -> 4058 bytes + test/reference/recording-surface-over.ref.png | Bin 0 -> 3072 bytes + .../reference/recording-surface-over.rgb24.ref.png | Bin 0 -> 3128 bytes + .../recording-surface-over.svg.argb32.ref.png | Bin 0 -> 3778 bytes + .../recording-surface-over.svg.rgb24.ref.png | Bin 0 -> 3760 bytes + .../recording-surface-over.xlib.argb32.ref.png | Bin 0 -> 3055 bytes + .../recording-surface-over.xlib.rgb24.ref.png | Bin 0 -> 3124 bytes + .../recording-surface-source.argb32.ref.png | Bin 0 -> 3044 bytes + .../recording-surface-source.base.argb32.ref.png | Bin 0 -> 3049 bytes + .../recording-surface-source.base.rgb24.ref.png | Bin 0 -> 3121 bytes + .../recording-surface-source.rgb24.ref.png | Bin 0 -> 3133 bytes + .../rectangle-rounding-error.base.argb32.ref.png | Bin 0 -> 212 bytes + .../rectangle-rounding-error.base.rgb24.ref.png | Bin 0 -> 212 bytes + test/reference/rectangle-rounding-error.ref.png | Bin 0 -> 231 bytes + .../reference/rectilinear-dash.base.argb32.ref.png | Bin 0 -> 291 bytes + test/reference/rectilinear-dash.base.rgb24.ref.png | Bin 0 -> 291 bytes + test/reference/rectilinear-dash.quartz.xfail.png | Bin 0 -> 494 bytes + test/reference/rectilinear-dash.ref.png | Bin 0 -> 291 bytes + .../reference/rectilinear-fill.base.argb32.ref.png | Bin 0 -> 151 bytes + test/reference/rectilinear-fill.base.rgb24.ref.png | Bin 0 -> 151 bytes + test/reference/rectilinear-fill.ref.png | Bin 0 -> 162 bytes + .../reference/rectilinear-grid.base.argb32.ref.png | Bin 0 -> 610 bytes + test/reference/rectilinear-grid.base.rgb24.ref.png | Bin 0 -> 610 bytes + test/reference/rectilinear-grid.image16.ref.png | Bin 0 -> 638 bytes + test/reference/rectilinear-grid.ref.png | Bin 0 -> 569 bytes + .../rectilinear-miter-limit.base.argb32.ref.png | Bin 0 -> 145 bytes + .../rectilinear-miter-limit.base.rgb24.ref.png | Bin 0 -> 145 bytes + test/reference/rectilinear-miter-limit.ps2.ref.png | Bin 0 -> 221 bytes + test/reference/rectilinear-miter-limit.ps3.ref.png | Bin 0 -> 221 bytes + test/reference/rectilinear-miter-limit.ref.png | Bin 0 -> 145 bytes + .../rectilinear-stroke.base.argb32.ref.png | Bin 0 -> 172 bytes + .../rectilinear-stroke.base.rgb24.ref.png | Bin 0 -> 172 bytes + test/reference/rectilinear-stroke.quartz.xfail.png | Bin 0 -> 209 bytes + test/reference/rectilinear-stroke.ref.png | Bin 0 -> 213 bytes + .../reference/reflected-stroke.base.argb32.ref.png | Bin 0 -> 4994 bytes + test/reference/reflected-stroke.base.rgb24.ref.png | Bin 0 -> 4994 bytes + test/reference/reflected-stroke.image16.ref.png | Bin 0 -> 4254 bytes + test/reference/reflected-stroke.ps.ref.png | Bin 0 -> 3368 bytes + test/reference/reflected-stroke.ref.png | Bin 0 -> 3410 bytes + test/reference/rel-path.base.argb32.ref.png | Bin 0 -> 189 bytes + test/reference/rel-path.base.rgb24.ref.png | Bin 0 -> 206 bytes + test/reference/rel-path.ps2.rgb24.ref.png | Bin 0 -> 243 bytes + test/reference/rel-path.ps3.rgb24.ref.png | Bin 0 -> 243 bytes + test/reference/rel-path.ref.png | Bin 0 -> 177 bytes + test/reference/rel-path.rgb24.ref.png | Bin 0 -> 184 bytes + .../rgb24-ignore-alpha.base.argb32.ref.png | Bin 0 -> 97 bytes + .../rgb24-ignore-alpha.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/rgb24-ignore-alpha.ref.png | Bin 0 -> 116 bytes + ...te-clip-image-surface-paint.base.argb32.ref.png | Bin 0 -> 303 bytes + ...ate-clip-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 303 bytes + .../rotate-clip-image-surface-paint.ref.png | Bin 0 -> 312 bytes + .../rotate-image-surface-paint.base.argb32.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.pdf.xfail.png | Bin 0 -> 442 bytes + .../rotate-image-surface-paint.ps.ref.png | Bin 0 -> 236 bytes + .../rotate-image-surface-paint.quartz.ref.png | Bin 0 -> 223 bytes + test/reference/rotate-image-surface-paint.ref.png | Bin 0 -> 220 bytes + .../rotate-image-surface-paint.svg.ref.png | Bin 0 -> 209 bytes + .../rotate-image-surface-paint.svg.xfail.png | Bin 0 -> 387 bytes + test/reference/rotated-clip.base.argb32.ref.png | Bin 0 -> 3922 bytes + test/reference/rotated-clip.base.rgb24.ref.png | Bin 0 -> 3922 bytes + test/reference/rotated-clip.image16.ref.png | Bin 0 -> 3336 bytes + test/reference/rotated-clip.ps.ref.png | Bin 0 -> 3378 bytes + test/reference/rotated-clip.quartz.ref.png | Bin 0 -> 3923 bytes + test/reference/rotated-clip.ref.png | Bin 0 -> 2743 bytes + test/reference/rotated-clip.xlib.ref.png | Bin 0 -> 3922 bytes + .../rounded-rectangle-fill.base.argb32.ref.png | Bin 0 -> 890 bytes + .../rounded-rectangle-fill.base.rgb24.ref.png | Bin 0 -> 890 bytes + .../rounded-rectangle-fill.image16.ref.png | Bin 0 -> 730 bytes + test/reference/rounded-rectangle-fill.ps.ref.png | Bin 0 -> 551 bytes + .../rounded-rectangle-fill.quartz.ref.png | Bin 0 -> 684 bytes + test/reference/rounded-rectangle-fill.ref.png | Bin 0 -> 563 bytes + test/reference/rounded-rectangle-fill.xlib.ref.png | Bin 0 -> 890 bytes + .../rounded-rectangle-stroke.base.argb32.ref.png | Bin 0 -> 1060 bytes + .../rounded-rectangle-stroke.base.rgb24.ref.png | Bin 0 -> 1060 bytes + .../rounded-rectangle-stroke.image16.ref.png | Bin 0 -> 732 bytes + test/reference/rounded-rectangle-stroke.ps.ref.png | Bin 0 -> 568 bytes + test/reference/rounded-rectangle-stroke.ref.png | Bin 0 -> 569 bytes + .../rounded-rectangle-stroke.xlib.ref.png | Bin 0 -> 860 bytes + ...e-down-source-surface-paint.base.argb32.ref.png | Bin 0 -> 96 bytes + ...le-down-source-surface-paint.base.rgb24.ref.png | Bin 0 -> 96 bytes + .../scale-down-source-surface-paint.ref.png | Bin 0 -> 133 bytes + .../scale-offset-image.base.argb32.ref.png | Bin 0 -> 9048 bytes + .../scale-offset-image.base.rgb24.ref.png | Bin 0 -> 9048 bytes + test/reference/scale-offset-image.gl.ref.png | Bin 0 -> 9197 bytes + test/reference/scale-offset-image.image16.ref.png | Bin 0 -> 7793 bytes + .../scale-offset-image.pdf.argb32.ref.png | Bin 0 -> 9981 bytes + .../reference/scale-offset-image.pdf.rgb24.ref.png | Bin 0 -> 9981 bytes + test/reference/scale-offset-image.ps.ref.png | Bin 0 -> 7697 bytes + test/reference/scale-offset-image.quartz.ref.png | Bin 0 -> 8977 bytes + test/reference/scale-offset-image.ref.png | Bin 0 -> 7688 bytes + test/reference/scale-offset-image.script.xfail.png | Bin 0 -> 9963 bytes + test/reference/scale-offset-image.xfail.png | Bin 0 -> 9961 bytes + .../scale-offset-image.xlib-fallback.xfail.png | Bin 0 -> 8686 bytes + test/reference/scale-offset-image.xlib.ref.png | Bin 0 -> 9136 bytes + .../scale-offset-similar.base.argb32.ref.png | Bin 0 -> 9048 bytes + .../scale-offset-similar.base.rgb24.ref.png | Bin 0 -> 9048 bytes + test/reference/scale-offset-similar.gl.ref.png | Bin 0 -> 9197 bytes + .../reference/scale-offset-similar.image16.ref.png | Bin 0 -> 7793 bytes + .../scale-offset-similar.pdf.argb32.ref.png | Bin 0 -> 11027 bytes + .../scale-offset-similar.pdf.rgb24.ref.png | Bin 0 -> 11027 bytes + test/reference/scale-offset-similar.ps.ref.png | Bin 0 -> 7860 bytes + test/reference/scale-offset-similar.quartz.ref.png | Bin 0 -> 8977 bytes + .../scale-offset-similar.recording.xfail.png | Bin 0 -> 10752 bytes + test/reference/scale-offset-similar.ref.png | Bin 0 -> 7688 bytes + .../scale-offset-similar.script.xfail.png | Bin 0 -> 9963 bytes + test/reference/scale-offset-similar.xfail.png | Bin 0 -> 9961 bytes + .../scale-offset-similar.xlib-fallback.xfail.png | Bin 0 -> 8686 bytes + test/reference/scale-offset-similar.xlib.xfail.png | Bin 0 -> 8698 bytes + .../scale-source-surface-paint.base.argb32.ref.png | Bin 0 -> 128 bytes + .../scale-source-surface-paint.base.rgb24.ref.png | Bin 0 -> 117 bytes + ...scale-source-surface-paint.pdf.argb32.xfail.png | Bin 0 -> 157 bytes + .../scale-source-surface-paint.pdf.rgb24.xfail.png | Bin 0 -> 152 bytes + test/reference/scale-source-surface-paint.ref.png | Bin 0 -> 147 bytes + .../scale-source-surface-paint.rgb24.ref.png | Bin 0 -> 136 bytes + ...scale-source-surface-paint.svg.argb32.xfail.png | Bin 0 -> 229 bytes + .../scale-source-surface-paint.svg.rgb24.xfail.png | Bin 0 -> 222 bytes + .../reference/select-font-face.base.argb32.ref.png | Bin 0 -> 2245 bytes + test/reference/select-font-face.base.rgb24.ref.png | Bin 0 -> 2245 bytes + test/reference/select-font-face.image16.ref.png | Bin 0 -> 1962 bytes + test/reference/select-font-face.ps2.ref.png | Bin 0 -> 959 bytes + test/reference/select-font-face.ps3.ref.png | Bin 0 -> 959 bytes + test/reference/select-font-face.quartz.ref.png | Bin 0 -> 2645 bytes + test/reference/select-font-face.ref.png | Bin 0 -> 2245 bytes + .../self-copy-overlap.base.argb32.ref.png | Bin 0 -> 1140 bytes + .../reference/self-copy-overlap.base.rgb24.ref.png | Bin 0 -> 213 bytes + test/reference/self-copy.base.argb32.ref.png | Bin 0 -> 257 bytes + test/reference/self-copy.base.rgb24.ref.png | Bin 0 -> 257 bytes + test/reference/self-copy.ps2.ref.png | Bin 0 -> 335 bytes + test/reference/self-copy.ps3.ref.png | Bin 0 -> 335 bytes + test/reference/self-copy.ref.png | Bin 0 -> 258 bytes + .../self-intersecting.base.argb32.ref.png | Bin 0 -> 208 bytes + .../reference/self-intersecting.base.rgb24.ref.png | Bin 0 -> 208 bytes + test/reference/self-intersecting.ps.ref.png | Bin 0 -> 186 bytes + test/reference/self-intersecting.quartz.xfail.png | Bin 0 -> 233 bytes + test/reference/self-intersecting.ref.png | Bin 0 -> 168 bytes + test/reference/self-intersecting.xlib.ref.png | Bin 0 -> 208 bytes + test/reference/set-source.base.argb32.ref.png | Bin 0 -> 101 bytes + test/reference/set-source.base.rgb24.ref.png | Bin 0 -> 101 bytes + test/reference/set-source.ref.png | Bin 0 -> 120 bytes + test/reference/set-source.rgb24.ref.png | Bin 0 -> 120 bytes + .../shape-general-convex.base.argb32.ref.png | Bin 0 -> 2532 bytes + .../shape-general-convex.base.rgb24.ref.png | Bin 0 -> 2532 bytes + test/reference/shape-general-convex.ref.png | Bin 0 -> 1869 bytes + .../reference/shape-sierpinski.base.argb32.ref.png | Bin 0 -> 54485 bytes + test/reference/shape-sierpinski.base.rgb24.ref.png | Bin 0 -> 54485 bytes + test/reference/shape-sierpinski.ref.png | Bin 0 -> 43504 bytes + .../show-glyphs-advance.base.argb32.ref.png | Bin 0 -> 1395 bytes + .../show-glyphs-advance.base.rgb24.ref.png | Bin 0 -> 1395 bytes + test/reference/show-glyphs-advance.image16.ref.png | Bin 0 -> 1270 bytes + test/reference/show-glyphs-advance.ps.ref.png | Bin 0 -> 901 bytes + test/reference/show-glyphs-advance.quartz.ref.png | Bin 0 -> 1464 bytes + test/reference/show-glyphs-advance.ref.png | Bin 0 -> 1395 bytes + test/reference/show-glyphs-advance.svg.ref.png | Bin 0 -> 1435 bytes + .../reference/show-glyphs-many.base.argb32.ref.png | Bin 0 -> 96 bytes + test/reference/show-glyphs-many.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/show-glyphs-many.ref.png | Bin 0 -> 118 bytes + .../show-text-current-point.base.argb32.ref.png | Bin 0 -> 2185 bytes + .../show-text-current-point.base.rgb24.ref.png | Bin 0 -> 2185 bytes + .../show-text-current-point.image16.ref.png | Bin 0 -> 1932 bytes + test/reference/show-text-current-point.ps2.ref.png | Bin 0 -> 1356 bytes + test/reference/show-text-current-point.ps3.ref.png | Bin 0 -> 1356 bytes + .../show-text-current-point.quartz.ref.png | Bin 0 -> 2773 bytes + test/reference/show-text-current-point.ref.png | Bin 0 -> 2185 bytes + test/reference/skew-extreme.base.argb32.ref.png | Bin 0 -> 935 bytes + test/reference/skew-extreme.base.rgb24.ref.png | Bin 0 -> 935 bytes + test/reference/skew-extreme.ps2.ref.png | Bin 0 -> 1048 bytes + test/reference/skew-extreme.ps3.ref.png | Bin 0 -> 1048 bytes + test/reference/skew-extreme.ref.png | Bin 0 -> 904 bytes + test/reference/smask-fill.base.argb32.ref.png | Bin 0 -> 1170 bytes + test/reference/smask-fill.base.rgb24.ref.png | Bin 0 -> 1170 bytes + test/reference/smask-fill.image16.ref.png | Bin 0 -> 925 bytes + test/reference/smask-fill.quartz.ref.png | Bin 0 -> 2076 bytes + test/reference/smask-fill.ref.png | Bin 0 -> 1134 bytes + test/reference/smask-fill.svg.ref.png | Bin 0 -> 1150 bytes + test/reference/smask-fill.xlib.ref.png | Bin 0 -> 1223 bytes + .../reference/smask-image-mask.base.argb32.ref.png | Bin 0 -> 619 bytes + test/reference/smask-image-mask.base.rgb24.ref.png | Bin 0 -> 619 bytes + test/reference/smask-image-mask.ref.png | Bin 0 -> 643 bytes + test/reference/smask-mask.base.argb32.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-mask.base.rgb24.ref.png | Bin 0 -> 2353 bytes + test/reference/smask-mask.image16.ref.png | Bin 0 -> 1358 bytes + test/reference/smask-mask.pdf.xfail.png | Bin 0 -> 4401 bytes + test/reference/smask-mask.quartz.ref.png | Bin 0 -> 3191 bytes + test/reference/smask-mask.ref.png | Bin 0 -> 2523 bytes + test/reference/smask-mask.svg.ref.png | Bin 0 -> 2376 bytes + test/reference/smask-paint.base.argb32.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-paint.base.rgb24.ref.png | Bin 0 -> 2469 bytes + test/reference/smask-paint.image16.ref.png | Bin 0 -> 1469 bytes + test/reference/smask-paint.pdf.xfail.png | Bin 0 -> 4513 bytes + test/reference/smask-paint.quartz.ref.png | Bin 0 -> 3311 bytes + test/reference/smask-paint.ref.png | Bin 0 -> 2639 bytes + test/reference/smask-paint.svg.ref.png | Bin 0 -> 2453 bytes + test/reference/smask-stroke.base.argb32.ref.png | Bin 0 -> 1703 bytes + test/reference/smask-stroke.base.rgb24.ref.png | Bin 0 -> 1703 bytes + test/reference/smask-stroke.image16.ref.png | Bin 0 -> 1330 bytes + test/reference/smask-stroke.pdf.xfail.png | Bin 0 -> 392 bytes + test/reference/smask-stroke.quartz.ref.png | Bin 0 -> 1697 bytes + test/reference/smask-stroke.ref.png | Bin 0 -> 1598 bytes + test/reference/smask-stroke.xlib.ref.png | Bin 0 -> 1707 bytes + test/reference/smask-text.base.argb32.ref.png | Bin 0 -> 1624 bytes + test/reference/smask-text.base.rgb24.ref.png | Bin 0 -> 1624 bytes + test/reference/smask-text.image16.ref.png | Bin 0 -> 1206 bytes + test/reference/smask-text.pdf.ref.png | Bin 0 -> 1874 bytes + test/reference/smask-text.ps2.ref.png | Bin 0 -> 2023 bytes + test/reference/smask-text.ps3.ref.png | Bin 0 -> 2023 bytes + test/reference/smask-text.quartz.ref.png | Bin 0 -> 1904 bytes + test/reference/smask-text.ref.png | Bin 0 -> 1623 bytes + test/reference/smask-text.script.ref.png | Bin 0 -> 1663 bytes + test/reference/smask-text.svg.ref.png | Bin 0 -> 1794 bytes + test/reference/smask-text.xlib-fallback.ref.png | Bin 0 -> 1874 bytes + test/reference/smask-text.xlib.ref.png | Bin 0 -> 1672 bytes + test/reference/smask.base.argb32.ref.png | Bin 0 -> 3404 bytes + test/reference/smask.base.rgb24.ref.png | Bin 0 -> 3404 bytes + test/reference/smask.image16.ref.png | Bin 0 -> 2213 bytes + test/reference/smask.pdf.xfail.png | Bin 0 -> 2848 bytes + test/reference/smask.ps.ref.png | Bin 0 -> 3430 bytes + test/reference/smask.quartz.ref.png | Bin 0 -> 4031 bytes + test/reference/smask.ref.png | Bin 0 -> 3401 bytes + test/reference/smask.script.ref.png | Bin 0 -> 3396 bytes + test/reference/smask.svg.ref.png | Bin 0 -> 3457 bytes + test/reference/smask.xlib-fallback.ref.png | Bin 0 -> 3423 bytes + test/reference/smask.xlib.ref.png | Bin 0 -> 3386 bytes + .../solid-pattern-cache-stress.base.argb32.ref.png | Bin 0 -> 87 bytes + .../solid-pattern-cache-stress.base.rgb24.ref.png | Bin 0 -> 87 bytes + test/reference/solid-pattern-cache-stress.ref.png | Bin 0 -> 107 bytes + .../source-clip-scale.base.argb32.ref.png | Bin 0 -> 136 bytes + .../reference/source-clip-scale.base.rgb24.ref.png | Bin 0 -> 136 bytes + test/reference/source-clip-scale.gl.ref.png | Bin 0 -> 164 bytes + test/reference/source-clip-scale.pdf.ref.png | Bin 0 -> 113 bytes + .../reference/source-clip-scale.ps2.argb32.ref.png | Bin 0 -> 183 bytes + test/reference/source-clip-scale.ps2.rgb24.ref.png | Bin 0 -> 183 bytes + .../reference/source-clip-scale.ps3.argb32.ref.png | Bin 0 -> 183 bytes + test/reference/source-clip-scale.ps3.rgb24.ref.png | Bin 0 -> 183 bytes + test/reference/source-clip-scale.quartz.ref.png | Bin 0 -> 126 bytes + test/reference/source-clip-scale.ref.png | Bin 0 -> 161 bytes + test/reference/source-clip-scale.svg.ref.png | Bin 0 -> 116 bytes + test/reference/source-clip.base.argb32.ref.png | Bin 0 -> 111 bytes + test/reference/source-clip.base.rgb24.ref.png | Bin 0 -> 111 bytes + test/reference/source-clip.ref.png | Bin 0 -> 133 bytes + .../source-surface-scale-paint.base.argb32.ref.png | Bin 0 -> 120 bytes + .../source-surface-scale-paint.base.rgb24.ref.png | Bin 0 -> 114 bytes + test/reference/source-surface-scale-paint.ref.png | Bin 0 -> 139 bytes + .../source-surface-scale-paint.rgb24.ref.png | Bin 0 -> 133 bytes + .../spline-decomposition.base.argb32.ref.png | Bin 0 -> 19075 bytes + .../spline-decomposition.base.rgb24.ref.png | Bin 0 -> 19075 bytes + .../reference/spline-decomposition.image16.ref.png | Bin 0 -> 14064 bytes + test/reference/spline-decomposition.pdf.ref.png | Bin 0 -> 19540 bytes + test/reference/spline-decomposition.ps.ref.png | Bin 0 -> 8939 bytes + .../spline-decomposition.quartz.xfail.png | Bin 0 -> 19560 bytes + test/reference/spline-decomposition.ref.png | Bin 0 -> 10005 bytes + test/reference/spline-decomposition.svg.ref.png | Bin 0 -> 19540 bytes + test/reference/spline-decomposition.xlib.ref.png | Bin 0 -> 19158 bytes + test/reference/stroke-ctm-caps.base.argb32.ref.png | Bin 0 -> 873 bytes + test/reference/stroke-ctm-caps.base.rgb24.ref.png | Bin 0 -> 873 bytes + test/reference/stroke-ctm-caps.image16.ref.png | Bin 0 -> 908 bytes + test/reference/stroke-ctm-caps.ps2.ref.png | Bin 0 -> 1079 bytes + test/reference/stroke-ctm-caps.ps3.ref.png | Bin 0 -> 1079 bytes + test/reference/stroke-ctm-caps.quartz.ref.png | Bin 0 -> 899 bytes + test/reference/stroke-ctm-caps.ref.png | Bin 0 -> 921 bytes + test/reference/stroke-image.base.argb32.ref.png | Bin 0 -> 1458 bytes + test/reference/stroke-image.base.rgb24.ref.png | Bin 0 -> 1458 bytes + test/reference/stroke-image.image16.ref.png | Bin 0 -> 1167 bytes + test/reference/stroke-image.pdf.ref.png | Bin 0 -> 1475 bytes + test/reference/stroke-image.ps.ref.png | Bin 0 -> 1682 bytes + test/reference/stroke-image.quartz.ref.png | Bin 0 -> 1350 bytes + test/reference/stroke-image.ref.png | Bin 0 -> 972 bytes + test/reference/stroke-image.xlib.ref.png | Bin 0 -> 1440 bytes + test/reference/stroke-open-box.base.argb32.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-open-box.base.rgb24.ref.png | Bin 0 -> 148 bytes + test/reference/stroke-open-box.ref.png | Bin 0 -> 148 bytes + .../subsurface-image-repeat.base.argb32.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.base.rgb24.ref.png | Bin 0 -> 915 bytes + .../subsurface-image-repeat.image16.ref.png | Bin 0 -> 776 bytes + test/reference/subsurface-image-repeat.ref.png | Bin 0 -> 915 bytes + .../subsurface-modify-child.base.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-child.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-modify-child.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-parent.base.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-modify-parent.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-modify-parent.ref.png | Bin 0 -> 197 bytes + .../subsurface-outside-target.argb32.ref.png | Bin 0 -> 2063 bytes + .../subsurface-outside-target.base.argb32.ref.png | Bin 0 -> 1149 bytes + .../subsurface-outside-target.base.rgb24.ref.png | Bin 0 -> 1005 bytes + .../subsurface-outside-target.rgb24.ref.png | Bin 0 -> 1648 bytes + test/reference/subsurface-pad.base.argb32.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-pad.base.rgb24.ref.png | Bin 0 -> 181 bytes + test/reference/subsurface-pad.quartz.xfail.png | Bin 0 -> 197 bytes + test/reference/subsurface-pad.ref.png | Bin 0 -> 181 bytes + .../subsurface-reflect.base.argb32.ref.png | Bin 0 -> 210 bytes + .../subsurface-reflect.base.rgb24.ref.png | Bin 0 -> 210 bytes + test/reference/subsurface-reflect.ref.png | Bin 0 -> 210 bytes + .../subsurface-repeat.base.argb32.ref.png | Bin 0 -> 197 bytes + .../reference/subsurface-repeat.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-repeat.ref.png | Bin 0 -> 197 bytes + .../subsurface-similar-repeat.base.argb32.ref.png | Bin 0 -> 197 bytes + .../subsurface-similar-repeat.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface-similar-repeat.ref.png | Bin 0 -> 197 bytes + test/reference/subsurface.base.argb32.ref.png | Bin 0 -> 1281 bytes + test/reference/subsurface.base.rgb24.ref.png | Bin 0 -> 1281 bytes + test/reference/subsurface.image16.ref.png | Bin 0 -> 1643 bytes + test/reference/subsurface.ps.ref.png | Bin 0 -> 1651 bytes + test/reference/subsurface.ref.png | Bin 0 -> 1281 bytes + test/reference/subsurface.xlib.ref.png | Bin 0 -> 1782 bytes + ...face-pattern-big-scale-down.base.argb32.ref.png | Bin 0 -> 191 bytes + ...rface-pattern-big-scale-down.base.rgb24.ref.png | Bin 0 -> 191 bytes + .../surface-pattern-big-scale-down.ps.ref.png | Bin 0 -> 235 bytes + .../surface-pattern-big-scale-down.quartz.ref.png | Bin 0 -> 258 bytes + .../surface-pattern-big-scale-down.ref.png | Bin 0 -> 191 bytes + .../surface-pattern-operator.argb32.ref.png | Bin 0 -> 4807 bytes + .../surface-pattern-operator.base.argb32.ref.png | Bin 0 -> 5184 bytes + .../surface-pattern-operator.base.rgb24.ref.png | Bin 0 -> 1913 bytes + .../surface-pattern-operator.image16.ref.png | Bin 0 -> 1977 bytes + .../surface-pattern-operator.pdf.argb32.xfail.png | Bin 0 -> 5485 bytes + .../surface-pattern-operator.pdf.rgb24.xfail.png | Bin 0 -> 2095 bytes + .../surface-pattern-operator.quartz.argb32.ref.png | Bin 0 -> 5721 bytes + .../surface-pattern-operator.quartz.rgb24.ref.png | Bin 0 -> 2429 bytes + .../surface-pattern-operator.rgb24.ref.png | Bin 0 -> 1866 bytes + .../surface-pattern-operator.xlib.argb32.ref.png | Bin 0 -> 5171 bytes + .../surface-pattern-operator.xlib.rgb24.ref.png | Bin 0 -> 1913 bytes + ...tern-scale-down-extend-none.base.argb32.ref.png | Bin 0 -> 329 bytes + ...ttern-scale-down-extend-none.base.rgb24.ref.png | Bin 0 -> 329 bytes + ...e-pattern-scale-down-extend-none.quartz.ref.png | Bin 0 -> 391 bytes + .../surface-pattern-scale-down-extend-none.ref.png | Bin 0 -> 329 bytes + ...ttern-scale-down-extend-pad.base.argb32.ref.png | Bin 0 -> 320 bytes + ...attern-scale-down-extend-pad.base.rgb24.ref.png | Bin 0 -> 320 bytes + ...-pattern-scale-down-extend-pad.quartz.xfail.png | Bin 0 -> 397 bytes + .../surface-pattern-scale-down-extend-pad.ref.png | Bin 0 -> 320 bytes + ...n-scale-down-extend-reflect.base.argb32.ref.png | Bin 0 -> 328 bytes + ...rn-scale-down-extend-reflect.base.rgb24.ref.png | Bin 0 -> 328 bytes + ...attern-scale-down-extend-reflect.quartz.ref.png | Bin 0 -> 475 bytes + ...rface-pattern-scale-down-extend-reflect.ref.png | Bin 0 -> 328 bytes + ...rn-scale-down-extend-repeat.base.argb32.ref.png | Bin 0 -> 330 bytes + ...ern-scale-down-extend-repeat.base.rgb24.ref.png | Bin 0 -> 330 bytes + ...pattern-scale-down-extend-repeat.quartz.ref.png | Bin 0 -> 397 bytes + ...urface-pattern-scale-down-extend-repeat.ref.png | Bin 0 -> 330 bytes + .../surface-pattern-scale-down.base.argb32.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-down.base.rgb24.ref.png | Bin 0 -> 1326 bytes + .../surface-pattern-scale-down.image16.ref.png | Bin 0 -> 1313 bytes + .../surface-pattern-scale-down.pdf.ref.png | Bin 0 -> 2189 bytes + .../surface-pattern-scale-down.ps2.ref.png | Bin 0 -> 1324 bytes + .../surface-pattern-scale-down.ps3.ref.png | Bin 0 -> 1324 bytes + .../surface-pattern-scale-down.quartz.ref.png | Bin 0 -> 2276 bytes + test/reference/surface-pattern-scale-down.ref.png | Bin 0 -> 1784 bytes + .../surface-pattern-scale-up.base.argb32.ref.png | Bin 0 -> 4020 bytes + .../surface-pattern-scale-up.base.rgb24.ref.png | Bin 0 -> 4020 bytes + .../surface-pattern-scale-up.image16.ref.png | Bin 0 -> 3864 bytes + .../reference/surface-pattern-scale-up.pdf.ref.png | Bin 0 -> 3482 bytes + .../reference/surface-pattern-scale-up.ps2.ref.png | Bin 0 -> 913 bytes + .../reference/surface-pattern-scale-up.ps3.ref.png | Bin 0 -> 913 bytes + .../surface-pattern-scale-up.quartz.xfail.png | Bin 0 -> 3294 bytes + test/reference/surface-pattern-scale-up.ref.png | Bin 0 -> 4017 bytes + test/reference/surface-pattern.base.argb32.ref.png | Bin 0 -> 11088 bytes + test/reference/surface-pattern.base.rgb24.ref.png | Bin 0 -> 11088 bytes + test/reference/surface-pattern.image16.ref.png | Bin 0 -> 11870 bytes + test/reference/surface-pattern.pdf.xfail.png | Bin 0 -> 10532 bytes + test/reference/surface-pattern.ps.xfail.png | Bin 0 -> 2188 bytes + test/reference/surface-pattern.quartz.xfail.png | Bin 0 -> 9216 bytes + test/reference/surface-pattern.ref.png | Bin 0 -> 11100 bytes + test/reference/surface-pattern.svg.xfail.png | Bin 0 -> 16069 bytes + test/reference/svg-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../svg-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../svg-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/svg-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/reference/svg-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../svg-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + .../svg-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + .../text-antialias-gray.base.argb32.ref.png | Bin 0 -> 975 bytes + .../text-antialias-gray.base.rgb24.ref.png | Bin 0 -> 975 bytes + test/reference/text-antialias-gray.image16.ref.png | Bin 0 -> 895 bytes + test/reference/text-antialias-gray.quartz.ref.png | Bin 0 -> 956 bytes + test/reference/text-antialias-gray.ref.png | Bin 0 -> 975 bytes + .../text-antialias-none.base.argb32.ref.png | Bin 0 -> 265 bytes + .../text-antialias-none.base.rgb24.ref.png | Bin 0 -> 265 bytes + test/reference/text-antialias-none.quartz.ref.png | Bin 0 -> 270 bytes + test/reference/text-antialias-none.ref.png | Bin 0 -> 298 bytes + .../text-antialias-subpixel.base.argb32.xfail.png | Bin 0 -> 925 bytes + .../text-antialias-subpixel.base.rgb24.xfail.png | Bin 0 -> 925 bytes + .../text-antialias-subpixel.image16.ref.png | Bin 0 -> 866 bytes + .../text-antialias-subpixel.quartz.ref.png | Bin 0 -> 949 bytes + test/reference/text-antialias-subpixel.ref.png | Bin 0 -> 1004 bytes + .../reference/text-glyph-range.base.argb32.ref.png | Bin 0 -> 1991 bytes + test/reference/text-glyph-range.base.rgb24.ref.png | Bin 0 -> 1991 bytes + test/reference/text-glyph-range.image16.ref.png | Bin 0 -> 1731 bytes + test/reference/text-glyph-range.ps.ref.png | Bin 0 -> 1253 bytes + test/reference/text-glyph-range.quartz.ref.png | Bin 0 -> 2191 bytes + test/reference/text-glyph-range.ref.png | Bin 0 -> 1729 bytes + test/reference/text-pattern.base.argb32.ref.png | Bin 0 -> 1695 bytes + test/reference/text-pattern.base.rgb24.ref.png | Bin 0 -> 1397 bytes + test/reference/text-pattern.pdf.argb32.ref.png | Bin 0 -> 1515 bytes + test/reference/text-pattern.pdf.rgb24.ref.png | Bin 0 -> 1339 bytes + test/reference/text-pattern.ps2.argb32.ref.png | Bin 0 -> 1646 bytes + test/reference/text-pattern.ps2.rgb24.ref.png | Bin 0 -> 1646 bytes + test/reference/text-pattern.ps3.argb32.ref.png | Bin 0 -> 881 bytes + test/reference/text-pattern.ps3.rgb24.ref.png | Bin 0 -> 862 bytes + test/reference/text-pattern.quartz.argb32.ref.png | Bin 0 -> 2148 bytes + test/reference/text-pattern.quartz.rgb24.ref.png | Bin 0 -> 1867 bytes + test/reference/text-pattern.ref.png | Bin 0 -> 1685 bytes + test/reference/text-pattern.rgb24.ref.png | Bin 0 -> 1392 bytes + test/reference/text-pattern.svg.argb32.ref.png | Bin 0 -> 1745 bytes + test/reference/text-pattern.svg.rgb24.ref.png | Bin 0 -> 1453 bytes + test/reference/text-rotate.base.argb32.ref.png | Bin 0 -> 16599 bytes + test/reference/text-rotate.base.rgb24.ref.png | Bin 0 -> 16599 bytes + test/reference/text-rotate.image16.ref.png | Bin 0 -> 12599 bytes + test/reference/text-rotate.pdf.ref.png | Bin 0 -> 16744 bytes + test/reference/text-rotate.ps.ref.png | Bin 0 -> 8765 bytes + test/reference/text-rotate.quartz.ref.png | Bin 0 -> 16655 bytes + test/reference/text-rotate.ref.png | Bin 0 -> 14682 bytes + test/reference/text-rotate.svg.ref.png | Bin 0 -> 17118 bytes + test/reference/text-rotate.xlib-fallback.ref.png | Bin 0 -> 16592 bytes + test/reference/text-rotate.xlib.ref.png | Bin 0 -> 16646 bytes + test/reference/text-transform.base.argb32.ref.png | Bin 0 -> 5579 bytes + test/reference/text-transform.base.rgb24.ref.png | Bin 0 -> 5579 bytes + test/reference/text-transform.image16.ref.png | Bin 0 -> 4469 bytes + test/reference/text-transform.pdf.argb32.ref.png | Bin 0 -> 5507 bytes + test/reference/text-transform.pdf.rgb24.ref.png | Bin 0 -> 5507 bytes + test/reference/text-transform.ps2.ref.png | Bin 0 -> 3943 bytes + test/reference/text-transform.ps3.ref.png | Bin 0 -> 3943 bytes + test/reference/text-transform.ref.png | Bin 0 -> 6200 bytes + test/reference/text-transform.svg.ref.png | Bin 0 -> 5682 bytes + test/reference/tiger.base.argb32.ref.png | Bin 0 -> 94370 bytes + test/reference/tiger.base.rgb24.ref.png | Bin 0 -> 94370 bytes + test/reference/tiger.ref.png | Bin 0 -> 71094 bytes + test/reference/tighten-bounds.base.argb32.ref.png | Bin 0 -> 8457 bytes + test/reference/tighten-bounds.base.rgb24.ref.png | Bin 0 -> 7832 bytes + test/reference/tighten-bounds.ref.png | Bin 0 -> 7958 bytes + test/reference/transforms.base.argb32.ref.png | Bin 0 -> 299 bytes + test/reference/transforms.base.rgb24.ref.png | Bin 0 -> 299 bytes + test/reference/transforms.image16.ref.png | Bin 0 -> 326 bytes + test/reference/transforms.ps2.ref.png | Bin 0 -> 418 bytes + test/reference/transforms.ps3.ref.png | Bin 0 -> 418 bytes + test/reference/transforms.ref.png | Bin 0 -> 341 bytes + .../translate-show-surface.base.argb32.ref.png | Bin 0 -> 96 bytes + .../translate-show-surface.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/reference/translate-show-surface.ref.png | Bin 0 -> 100 bytes + test/reference/trap-clip.base.argb32.ref.png | Bin 0 -> 5753 bytes + test/reference/trap-clip.base.rgb24.ref.png | Bin 0 -> 5379 bytes + test/reference/trap-clip.image16.ref.png | Bin 0 -> 4344 bytes + test/reference/trap-clip.ps2.argb32.ref.png | Bin 0 -> 4839 bytes + test/reference/trap-clip.ps2.rgb24.ref.png | Bin 0 -> 4729 bytes + test/reference/trap-clip.ps3.argb32.ref.png | Bin 0 -> 4751 bytes + test/reference/trap-clip.ps3.rgb24.ref.png | Bin 0 -> 4553 bytes + test/reference/trap-clip.quartz.argb32.ref.png | Bin 0 -> 6115 bytes + test/reference/trap-clip.quartz.rgb24.ref.png | Bin 0 -> 5801 bytes + test/reference/trap-clip.ref.png | Bin 0 -> 5741 bytes + test/reference/trap-clip.rgb24.ref.png | Bin 0 -> 5328 bytes + .../trap-clip.test-paginated.argb32.ref.png | Bin 0 -> 5898 bytes + test/reference/trap-clip.xlib.ref.png | Bin 0 -> 5772 bytes + test/reference/trap-clip.xlib.rgb24.ref.png | Bin 0 -> 5365 bytes + .../twin-antialias-gray.base.argb32.ref.png | Bin 0 -> 4053 bytes + .../twin-antialias-gray.base.rgb24.ref.png | Bin 0 -> 4053 bytes + test/reference/twin-antialias-gray.image16.ref.png | Bin 0 -> 3005 bytes + test/reference/twin-antialias-gray.ref.png | Bin 0 -> 2292 bytes + test/reference/twin-antialias-gray.xlib.ref.png | Bin 0 -> 3863 bytes + .../twin-antialias-mixed.base.argb32.ref.png | Bin 0 -> 1639 bytes + .../twin-antialias-mixed.base.rgb24.ref.png | Bin 0 -> 1639 bytes + .../reference/twin-antialias-mixed.image16.ref.png | Bin 0 -> 2049 bytes + test/reference/twin-antialias-mixed.ref.png | Bin 0 -> 1639 bytes + test/reference/twin-antialias-mixed.xlib.ref.png | Bin 0 -> 1760 bytes + .../twin-antialias-none.base.argb32.ref.png | Bin 0 -> 747 bytes + .../twin-antialias-none.base.rgb24.ref.png | Bin 0 -> 747 bytes + test/reference/twin-antialias-none.ref.png | Bin 0 -> 747 bytes + test/reference/twin-antialias-none.xlib.ref.png | Bin 0 -> 745 bytes + .../twin-antialias-subpixel.base.argb32.ref.png | Bin 0 -> 4053 bytes + .../twin-antialias-subpixel.base.rgb24.ref.png | Bin 0 -> 4053 bytes + .../twin-antialias-subpixel.image16.ref.png | Bin 0 -> 3005 bytes + test/reference/twin-antialias-subpixel.ref.png | Bin 0 -> 2292 bytes + .../reference/twin-antialias-subpixel.xlib.ref.png | Bin 0 -> 3863 bytes + test/reference/twin.base.argb32.ref.png | Bin 0 -> 4053 bytes + test/reference/twin.base.rgb24.ref.png | Bin 0 -> 4053 bytes + test/reference/twin.image16.ref.png | Bin 0 -> 3005 bytes + test/reference/twin.ps.ref.png | Bin 0 -> 2136 bytes + test/reference/twin.ref.png | Bin 0 -> 2292 bytes + test/reference/twin.svg.ref.png | Bin 0 -> 3040 bytes + test/reference/twin.xlib.ref.png | Bin 0 -> 4435 bytes + test/reference/unaligned-box.base.argb32.ref.png | Bin 0 -> 526 bytes + test/reference/unaligned-box.base.rgb24.ref.png | Bin 0 -> 526 bytes + test/reference/unaligned-box.ref.png | Bin 0 -> 496 bytes + .../unantialiased-shapes.base.argb32.ref.png | Bin 0 -> 3977 bytes + .../unantialiased-shapes.base.rgb24.ref.png | Bin 0 -> 3977 bytes + test/reference/unantialiased-shapes.quartz.ref.png | Bin 0 -> 3868 bytes + test/reference/unantialiased-shapes.ref.png | Bin 0 -> 3926 bytes + .../unbounded-operator.base.argb32.ref.png | Bin 0 -> 2756 bytes + .../unbounded-operator.base.rgb24.ref.png | Bin 0 -> 1289 bytes + .../unbounded-operator.gl.argb32.xfail.png | Bin 0 -> 2805 bytes + .../unbounded-operator.gl.rgb24.xfail.png | Bin 0 -> 1355 bytes + test/reference/unbounded-operator.image16.ref.png | Bin 0 -> 1276 bytes + .../unbounded-operator.pdf.argb32.ref.png | Bin 0 -> 2713 bytes + .../unbounded-operator.ps2.argb32.ref.png | Bin 0 -> 2713 bytes + .../unbounded-operator.ps3.argb32.ref.png | Bin 0 -> 2713 bytes + .../unbounded-operator.quartz.argb32.ref.png | Bin 0 -> 3509 bytes + .../unbounded-operator.quartz.rgb24.ref.png | Bin 0 -> 1657 bytes + test/reference/unbounded-operator.ref.png | Bin 0 -> 2777 bytes + test/reference/unbounded-operator.rgb24.ref.png | Bin 0 -> 1341 bytes + .../unbounded-operator.svg12.argb32.ref.png | Bin 0 -> 2767 bytes + .../unbounded-operator.svg12.rgb24.xfail.png | Bin 0 -> 1731 bytes + .../unbounded-operator.xlib.rgb24.ref.png | Bin 0 -> 1315 bytes + .../reference/unclosed-strokes.base.argb32.ref.png | Bin 0 -> 1482 bytes + test/reference/unclosed-strokes.base.rgb24.ref.png | Bin 0 -> 1482 bytes + test/reference/unclosed-strokes.ref.png | Bin 0 -> 1432 bytes + test/reference/user-font-mask.base.argb32.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-mask.base.rgb24.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-mask.image16.ref.png | Bin 0 -> 4948 bytes + test/reference/user-font-mask.pdf.ref.png | Bin 0 -> 1927 bytes + test/reference/user-font-mask.ps2.ref.png | Bin 0 -> 1927 bytes + test/reference/user-font-mask.ps3.ref.png | Bin 0 -> 1927 bytes + test/reference/user-font-mask.ref.png | Bin 0 -> 5476 bytes + test/reference/user-font-mask.svg.ref.png | Bin 0 -> 2030 bytes + test/reference/user-font-proxy.base.argb32.ref.png | Bin 0 -> 16798 bytes + test/reference/user-font-proxy.base.rgb24.ref.png | Bin 0 -> 16798 bytes + test/reference/user-font-proxy.image16.ref.png | Bin 0 -> 14460 bytes + test/reference/user-font-proxy.pdf.argb32.ref.png | Bin 0 -> 16937 bytes + test/reference/user-font-proxy.pdf.ref.png | Bin 0 -> 18111 bytes + test/reference/user-font-proxy.pdf.rgb24.ref.png | Bin 0 -> 16937 bytes + test/reference/user-font-proxy.ps.ref.png | Bin 0 -> 7837 bytes + test/reference/user-font-proxy.quartz.ref.png | Bin 0 -> 19795 bytes + test/reference/user-font-proxy.ref.png | Bin 0 -> 14023 bytes + test/reference/user-font-proxy.svg.ref.png | Bin 0 -> 16814 bytes + test/reference/user-font-proxy.xlib.ref.png | Bin 0 -> 18121 bytes + .../user-font-rescale.base.argb32.ref.png | Bin 0 -> 14852 bytes + .../reference/user-font-rescale.base.rgb24.ref.png | Bin 0 -> 14852 bytes + test/reference/user-font-rescale.image16.ref.png | Bin 0 -> 12590 bytes + test/reference/user-font-rescale.ps.ref.png | Bin 0 -> 6781 bytes + test/reference/user-font-rescale.quartz.ref.png | Bin 0 -> 15982 bytes + test/reference/user-font-rescale.ref.png | Bin 0 -> 14852 bytes + test/reference/user-font-rescale.svg.ref.png | Bin 0 -> 14873 bytes + test/reference/user-font.base.argb32.ref.png | Bin 0 -> 5439 bytes + test/reference/user-font.base.rgb24.ref.png | Bin 0 -> 5439 bytes + test/reference/user-font.image16.ref.png | Bin 0 -> 5814 bytes + test/reference/user-font.pdf.ref.png | Bin 0 -> 6241 bytes + test/reference/user-font.ps.ref.png | Bin 0 -> 4605 bytes + test/reference/user-font.quartz.ref.png | Bin 0 -> 5960 bytes + test/reference/user-font.ref.png | Bin 0 -> 4939 bytes + test/reference/user-font.svg.ref.png | Bin 0 -> 6379 bytes + test/reference/user-font.xlib.ref.png | Bin 0 -> 5884 bytes + test/reference/white-in-noop.base.argb32.ref.png | Bin 0 -> 95 bytes + test/reference/white-in-noop.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/reference/white-in-noop.ref.png | Bin 0 -> 95 bytes + test/reference/world-map-fill.base.argb32.ref.png | Bin 0 -> 57451 bytes + test/reference/world-map-fill.base.rgb24.ref.png | Bin 0 -> 57451 bytes + test/reference/world-map-fill.image16.ref.png | Bin 0 -> 36582 bytes + test/reference/world-map-fill.ref.png | Bin 0 -> 45440 bytes + .../reference/world-map-stroke.base.argb32.ref.png | Bin 0 -> 65217 bytes + test/reference/world-map-stroke.base.rgb24.ref.png | Bin 0 -> 65217 bytes + test/reference/world-map-stroke.image16.ref.png | Bin 0 -> 41885 bytes + test/reference/world-map-stroke.ref.png | Bin 0 -> 43370 bytes + test/reference/world-map.base.argb32.ref.png | Bin 0 -> 70536 bytes + test/reference/world-map.base.rgb24.ref.png | Bin 0 -> 70536 bytes + test/reference/world-map.image16.ref.png | Bin 0 -> 48377 bytes + test/reference/world-map.ref.png | Bin 0 -> 65880 bytes + .../xcb-huge-image-shm.base.argb32.ref.png | Bin 0 -> 97 bytes + .../xcb-huge-image-shm.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-huge-image-shm.ref.png | Bin 0 -> 97 bytes + .../xcb-snapshot-assert.base.argb32.ref.png | Bin 0 -> 97 bytes + .../xcb-snapshot-assert.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-snapshot-assert.ref.png | Bin 0 -> 97 bytes + .../reference/xcb-stress-cache.base.argb32.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-stress-cache.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-stress-cache.ref.png | Bin 0 -> 97 bytes + test/reference/xcb-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../xcb-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../xcb-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/xcb-surface-source.image16.ref.png | Bin 0 -> 305 bytes + .../reference/xcb-surface-source.ps.argb32.ref.png | Bin 0 -> 491 bytes + test/reference/xcb-surface-source.ps.rgb24.ref.png | Bin 0 -> 482 bytes + test/reference/xcb-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../xcomposite-projection.base.argb32.ref.png | Bin 0 -> 1112 bytes + .../xcomposite-projection.base.rgb24.ref.png | Bin 0 -> 1112 bytes + .../xcomposite-projection.image16.ref.png | Bin 0 -> 1000 bytes + .../reference/xcomposite-projection.quartz.ref.png | Bin 0 -> 926 bytes + test/reference/xcomposite-projection.ref.png | Bin 0 -> 1108 bytes + .../xlib-expose-event.base.argb32.ref.png | Bin 0 -> 40717 bytes + .../reference/xlib-expose-event.base.rgb24.ref.png | Bin 0 -> 40717 bytes + test/reference/xlib-expose-event.image16.ref.png | Bin 0 -> 30332 bytes + test/reference/xlib-expose-event.ps.ref.png | Bin 0 -> 39035 bytes + test/reference/xlib-expose-event.ref.png | Bin 0 -> 40736 bytes + test/reference/xlib-surface-source.argb32.ref.png | Bin 0 -> 377 bytes + .../xlib-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + .../xlib-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/reference/xlib-surface-source.image16.ref.png | Bin 0 -> 305 bytes + .../xlib-surface-source.ps.argb32.ref.png | Bin 0 -> 491 bytes + .../reference/xlib-surface-source.ps.rgb24.ref.png | Bin 0 -> 482 bytes + test/reference/xlib-surface-source.rgb24.ref.png | Bin 0 -> 301 bytes + .../xlib-surface-source.svg12.argb32.xfail.png | Bin 0 -> 278 bytes + .../xlib-surface-source.svg12.rgb24.xfail.png | Bin 0 -> 278 bytes + test/reference/zero-alpha.base.argb32.ref.png | Bin 0 -> 91 bytes + test/reference/zero-alpha.base.rgb24.ref.png | Bin 0 -> 91 bytes + test/reference/zero-alpha.ref.png | Bin 0 -> 115 bytes + test/reference/zero-mask.base.argb32.ref.png | Bin 0 -> 402 bytes + test/reference/zero-mask.base.rgb24.ref.png | Bin 0 -> 382 bytes + test/reference/zero-mask.ref.png | Bin 0 -> 402 bytes + test/reference/zero-mask.rgb24.ref.png | Bin 0 -> 382 bytes + test/reflected-stroke.base.argb32.ref.png | Bin 4994 -> 0 bytes + test/reflected-stroke.base.rgb24.ref.png | Bin 4994 -> 0 bytes + test/reflected-stroke.image16.ref.png | Bin 4254 -> 0 bytes + test/reflected-stroke.ps.ref.png | Bin 3368 -> 0 bytes + test/reflected-stroke.ref.png | Bin 3410 -> 0 bytes + test/rel-path.base.argb32.ref.png | Bin 189 -> 0 bytes + test/rel-path.base.rgb24.ref.png | Bin 206 -> 0 bytes + test/rel-path.ps2.rgb24.ref.png | Bin 243 -> 0 bytes + test/rel-path.ps3.rgb24.ref.png | Bin 243 -> 0 bytes + test/rel-path.ref.png | Bin 177 -> 0 bytes + test/rel-path.rgb24.ref.png | Bin 184 -> 0 bytes + test/rgb24-ignore-alpha.base.argb32.ref.png | Bin 97 -> 0 bytes + test/rgb24-ignore-alpha.base.rgb24.ref.png | Bin 97 -> 0 bytes + test/rgb24-ignore-alpha.ref.png | Bin 116 -> 0 bytes + ...te-clip-image-surface-paint.base.argb32.ref.png | Bin 303 -> 0 bytes + ...ate-clip-image-surface-paint.base.rgb24.ref.png | Bin 303 -> 0 bytes + test/rotate-clip-image-surface-paint.ref.png | Bin 312 -> 0 bytes + .../rotate-image-surface-paint.base.argb32.ref.png | Bin 220 -> 0 bytes + test/rotate-image-surface-paint.base.rgb24.ref.png | Bin 220 -> 0 bytes + test/rotate-image-surface-paint.pdf.xfail.png | Bin 442 -> 0 bytes + test/rotate-image-surface-paint.ps.ref.png | Bin 236 -> 0 bytes + test/rotate-image-surface-paint.quartz.ref.png | Bin 223 -> 0 bytes + test/rotate-image-surface-paint.ref.png | Bin 220 -> 0 bytes + test/rotate-image-surface-paint.svg.ref.png | Bin 209 -> 0 bytes + test/rotate-image-surface-paint.svg.xfail.png | Bin 387 -> 0 bytes + test/rotated-clip.base.argb32.ref.png | Bin 3922 -> 0 bytes + test/rotated-clip.base.rgb24.ref.png | Bin 3922 -> 0 bytes + test/rotated-clip.image16.ref.png | Bin 3336 -> 0 bytes + test/rotated-clip.ps.ref.png | Bin 3378 -> 0 bytes + test/rotated-clip.quartz.ref.png | Bin 3923 -> 0 bytes + test/rotated-clip.ref.png | Bin 2743 -> 0 bytes + test/rotated-clip.xlib.ref.png | Bin 3922 -> 0 bytes + test/rounded-rectangle-fill.base.argb32.ref.png | Bin 890 -> 0 bytes + test/rounded-rectangle-fill.base.rgb24.ref.png | Bin 890 -> 0 bytes + test/rounded-rectangle-fill.image16.ref.png | Bin 730 -> 0 bytes + test/rounded-rectangle-fill.ps.ref.png | Bin 551 -> 0 bytes + test/rounded-rectangle-fill.quartz.ref.png | Bin 684 -> 0 bytes + test/rounded-rectangle-fill.ref.png | Bin 563 -> 0 bytes + test/rounded-rectangle-fill.xlib.ref.png | Bin 890 -> 0 bytes + test/rounded-rectangle-stroke.base.argb32.ref.png | Bin 1060 -> 0 bytes + test/rounded-rectangle-stroke.base.rgb24.ref.png | Bin 1060 -> 0 bytes + test/rounded-rectangle-stroke.image16.ref.png | Bin 732 -> 0 bytes + test/rounded-rectangle-stroke.ps.ref.png | Bin 568 -> 0 bytes + test/rounded-rectangle-stroke.ref.png | Bin 569 -> 0 bytes + test/rounded-rectangle-stroke.xlib.ref.png | Bin 860 -> 0 bytes + ...e-down-source-surface-paint.base.argb32.ref.png | Bin 96 -> 0 bytes + ...le-down-source-surface-paint.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/scale-down-source-surface-paint.ref.png | Bin 133 -> 0 bytes + test/scale-offset-image.base.argb32.ref.png | Bin 9048 -> 0 bytes + test/scale-offset-image.base.rgb24.ref.png | Bin 9048 -> 0 bytes + test/scale-offset-image.gl.ref.png | Bin 9197 -> 0 bytes + test/scale-offset-image.image16.ref.png | Bin 7793 -> 0 bytes + test/scale-offset-image.pdf.argb32.ref.png | Bin 9981 -> 0 bytes + test/scale-offset-image.pdf.rgb24.ref.png | Bin 9981 -> 0 bytes + test/scale-offset-image.ps.ref.png | Bin 7697 -> 0 bytes + test/scale-offset-image.quartz.ref.png | Bin 8977 -> 0 bytes + test/scale-offset-image.ref.png | Bin 7688 -> 0 bytes + test/scale-offset-image.script.xfail.png | Bin 9963 -> 0 bytes + test/scale-offset-image.xfail.png | Bin 9961 -> 0 bytes + test/scale-offset-image.xlib-fallback.xfail.png | Bin 8686 -> 0 bytes + test/scale-offset-image.xlib.ref.png | Bin 9136 -> 0 bytes + test/scale-offset-similar.base.argb32.ref.png | Bin 9048 -> 0 bytes + test/scale-offset-similar.base.rgb24.ref.png | Bin 9048 -> 0 bytes + test/scale-offset-similar.gl.ref.png | Bin 9197 -> 0 bytes + test/scale-offset-similar.image16.ref.png | Bin 7793 -> 0 bytes + test/scale-offset-similar.pdf.argb32.ref.png | Bin 11027 -> 0 bytes + test/scale-offset-similar.pdf.rgb24.ref.png | Bin 11027 -> 0 bytes + test/scale-offset-similar.ps.ref.png | Bin 7860 -> 0 bytes + test/scale-offset-similar.quartz.ref.png | Bin 8977 -> 0 bytes + test/scale-offset-similar.recording.xfail.png | Bin 10752 -> 0 bytes + test/scale-offset-similar.ref.png | Bin 7688 -> 0 bytes + test/scale-offset-similar.script.xfail.png | Bin 9963 -> 0 bytes + test/scale-offset-similar.xfail.png | Bin 9961 -> 0 bytes + test/scale-offset-similar.xlib-fallback.xfail.png | Bin 8686 -> 0 bytes + test/scale-offset-similar.xlib.xfail.png | Bin 8698 -> 0 bytes + .../scale-source-surface-paint.base.argb32.ref.png | Bin 128 -> 0 bytes + test/scale-source-surface-paint.base.rgb24.ref.png | Bin 117 -> 0 bytes + ...scale-source-surface-paint.pdf.argb32.xfail.png | Bin 157 -> 0 bytes + .../scale-source-surface-paint.pdf.rgb24.xfail.png | Bin 152 -> 0 bytes + test/scale-source-surface-paint.ref.png | Bin 147 -> 0 bytes + test/scale-source-surface-paint.rgb24.ref.png | Bin 136 -> 0 bytes + ...scale-source-surface-paint.svg.argb32.xfail.png | Bin 229 -> 0 bytes + .../scale-source-surface-paint.svg.rgb24.xfail.png | Bin 222 -> 0 bytes + test/select-font-face.base.argb32.ref.png | Bin 2245 -> 0 bytes + test/select-font-face.base.rgb24.ref.png | Bin 2245 -> 0 bytes + test/select-font-face.image16.ref.png | Bin 1962 -> 0 bytes + test/select-font-face.ps2.ref.png | Bin 959 -> 0 bytes + test/select-font-face.ps3.ref.png | Bin 959 -> 0 bytes + test/select-font-face.quartz.ref.png | Bin 2645 -> 0 bytes + test/select-font-face.ref.png | Bin 2245 -> 0 bytes + test/self-copy-overlap.base.argb32.ref.png | Bin 1140 -> 0 bytes + test/self-copy-overlap.base.rgb24.ref.png | Bin 213 -> 0 bytes + test/self-copy.base.argb32.ref.png | Bin 257 -> 0 bytes + test/self-copy.base.rgb24.ref.png | Bin 257 -> 0 bytes + test/self-copy.ps2.ref.png | Bin 335 -> 0 bytes + test/self-copy.ps3.ref.png | Bin 335 -> 0 bytes + test/self-copy.ref.png | Bin 258 -> 0 bytes + test/self-intersecting.base.argb32.ref.png | Bin 208 -> 0 bytes + test/self-intersecting.base.rgb24.ref.png | Bin 208 -> 0 bytes + test/self-intersecting.ps.ref.png | Bin 186 -> 0 bytes + test/self-intersecting.quartz.xfail.png | Bin 233 -> 0 bytes + test/self-intersecting.ref.png | Bin 168 -> 0 bytes + test/self-intersecting.xlib.ref.png | Bin 208 -> 0 bytes + test/set-source.base.argb32.ref.png | Bin 101 -> 0 bytes + test/set-source.base.rgb24.ref.png | Bin 101 -> 0 bytes + test/set-source.ref.png | Bin 120 -> 0 bytes + test/set-source.rgb24.ref.png | Bin 120 -> 0 bytes + test/shape-general-convex.base.argb32.ref.png | Bin 2532 -> 0 bytes + test/shape-general-convex.base.rgb24.ref.png | Bin 2532 -> 0 bytes + test/shape-general-convex.ref.png | Bin 1869 -> 0 bytes + test/shape-sierpinski.base.argb32.ref.png | Bin 54485 -> 0 bytes + test/shape-sierpinski.base.rgb24.ref.png | Bin 54485 -> 0 bytes + test/shape-sierpinski.ref.png | Bin 43504 -> 0 bytes + test/show-glyphs-advance.base.argb32.ref.png | Bin 1395 -> 0 bytes + test/show-glyphs-advance.base.rgb24.ref.png | Bin 1395 -> 0 bytes + test/show-glyphs-advance.image16.ref.png | Bin 1270 -> 0 bytes + test/show-glyphs-advance.ps.ref.png | Bin 901 -> 0 bytes + test/show-glyphs-advance.quartz.ref.png | Bin 1464 -> 0 bytes + test/show-glyphs-advance.ref.png | Bin 1395 -> 0 bytes + test/show-glyphs-advance.svg.ref.png | Bin 1435 -> 0 bytes + test/show-glyphs-many.base.argb32.ref.png | Bin 96 -> 0 bytes + test/show-glyphs-many.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/show-glyphs-many.ref.png | Bin 118 -> 0 bytes + test/show-text-current-point.base.argb32.ref.png | Bin 2185 -> 0 bytes + test/show-text-current-point.base.rgb24.ref.png | Bin 2185 -> 0 bytes + test/show-text-current-point.image16.ref.png | Bin 1932 -> 0 bytes + test/show-text-current-point.ps2.ref.png | Bin 1356 -> 0 bytes + test/show-text-current-point.ps3.ref.png | Bin 1356 -> 0 bytes + test/show-text-current-point.quartz.ref.png | Bin 2773 -> 0 bytes + test/show-text-current-point.ref.png | Bin 2185 -> 0 bytes + test/skew-extreme.base.argb32.ref.png | Bin 935 -> 0 bytes + test/skew-extreme.base.rgb24.ref.png | Bin 935 -> 0 bytes + test/skew-extreme.ps2.ref.png | Bin 1048 -> 0 bytes + test/skew-extreme.ps3.ref.png | Bin 1048 -> 0 bytes + test/skew-extreme.ref.png | Bin 904 -> 0 bytes + test/smask-fill.base.argb32.ref.png | Bin 1170 -> 0 bytes + test/smask-fill.base.rgb24.ref.png | Bin 1170 -> 0 bytes + test/smask-fill.image16.ref.png | Bin 925 -> 0 bytes + test/smask-fill.quartz.ref.png | Bin 2076 -> 0 bytes + test/smask-fill.ref.png | Bin 1134 -> 0 bytes + test/smask-fill.svg.ref.png | Bin 1150 -> 0 bytes + test/smask-fill.xlib.ref.png | Bin 1223 -> 0 bytes + test/smask-image-mask.base.argb32.ref.png | Bin 619 -> 0 bytes + test/smask-image-mask.base.rgb24.ref.png | Bin 619 -> 0 bytes + test/smask-image-mask.ref.png | Bin 643 -> 0 bytes + test/smask-mask.base.argb32.ref.png | Bin 2353 -> 0 bytes + test/smask-mask.base.rgb24.ref.png | Bin 2353 -> 0 bytes + test/smask-mask.image16.ref.png | Bin 1358 -> 0 bytes + test/smask-mask.pdf.xfail.png | Bin 4401 -> 0 bytes + test/smask-mask.quartz.ref.png | Bin 3191 -> 0 bytes + test/smask-mask.ref.png | Bin 2523 -> 0 bytes + test/smask-mask.svg.ref.png | Bin 2376 -> 0 bytes + test/smask-paint.base.argb32.ref.png | Bin 2469 -> 0 bytes + test/smask-paint.base.rgb24.ref.png | Bin 2469 -> 0 bytes + test/smask-paint.image16.ref.png | Bin 1469 -> 0 bytes + test/smask-paint.pdf.xfail.png | Bin 4513 -> 0 bytes + test/smask-paint.quartz.ref.png | Bin 3311 -> 0 bytes + test/smask-paint.ref.png | Bin 2639 -> 0 bytes + test/smask-paint.svg.ref.png | Bin 2453 -> 0 bytes + test/smask-stroke.base.argb32.ref.png | Bin 1703 -> 0 bytes + test/smask-stroke.base.rgb24.ref.png | Bin 1703 -> 0 bytes + test/smask-stroke.image16.ref.png | Bin 1330 -> 0 bytes + test/smask-stroke.pdf.xfail.png | Bin 392 -> 0 bytes + test/smask-stroke.quartz.ref.png | Bin 1697 -> 0 bytes + test/smask-stroke.ref.png | Bin 1598 -> 0 bytes + test/smask-stroke.xlib.ref.png | Bin 1707 -> 0 bytes + test/smask-text.base.argb32.ref.png | Bin 1624 -> 0 bytes + test/smask-text.base.rgb24.ref.png | Bin 1624 -> 0 bytes + test/smask-text.image16.ref.png | Bin 1206 -> 0 bytes + test/smask-text.pdf.ref.png | Bin 1874 -> 0 bytes + test/smask-text.ps2.ref.png | Bin 2023 -> 0 bytes + test/smask-text.ps3.ref.png | Bin 2023 -> 0 bytes + test/smask-text.quartz.ref.png | Bin 1904 -> 0 bytes + test/smask-text.ref.png | Bin 1623 -> 0 bytes + test/smask-text.script.ref.png | Bin 1663 -> 0 bytes + test/smask-text.svg.ref.png | Bin 1794 -> 0 bytes + test/smask-text.xlib-fallback.ref.png | Bin 1874 -> 0 bytes + test/smask-text.xlib.ref.png | Bin 1672 -> 0 bytes + test/smask.base.argb32.ref.png | Bin 3404 -> 0 bytes + test/smask.base.rgb24.ref.png | Bin 3404 -> 0 bytes + test/smask.image16.ref.png | Bin 2213 -> 0 bytes + test/smask.pdf.xfail.png | Bin 2848 -> 0 bytes + test/smask.ps.ref.png | Bin 3430 -> 0 bytes + test/smask.quartz.ref.png | Bin 4031 -> 0 bytes + test/smask.ref.png | Bin 3401 -> 0 bytes + test/smask.script.ref.png | Bin 3396 -> 0 bytes + test/smask.svg.ref.png | Bin 3457 -> 0 bytes + test/smask.xlib-fallback.ref.png | Bin 3423 -> 0 bytes + test/smask.xlib.ref.png | Bin 3386 -> 0 bytes + .../solid-pattern-cache-stress.base.argb32.ref.png | Bin 87 -> 0 bytes + test/solid-pattern-cache-stress.base.rgb24.ref.png | Bin 87 -> 0 bytes + test/solid-pattern-cache-stress.ref.png | Bin 107 -> 0 bytes + test/source-clip-scale.base.argb32.ref.png | Bin 136 -> 0 bytes + test/source-clip-scale.base.rgb24.ref.png | Bin 136 -> 0 bytes + test/source-clip-scale.gl.ref.png | Bin 164 -> 0 bytes + test/source-clip-scale.pdf.ref.png | Bin 113 -> 0 bytes + test/source-clip-scale.ps2.argb32.ref.png | Bin 183 -> 0 bytes + test/source-clip-scale.ps2.rgb24.ref.png | Bin 183 -> 0 bytes + test/source-clip-scale.ps3.argb32.ref.png | Bin 183 -> 0 bytes + test/source-clip-scale.ps3.rgb24.ref.png | Bin 183 -> 0 bytes + test/source-clip-scale.quartz.ref.png | Bin 126 -> 0 bytes + test/source-clip-scale.ref.png | Bin 161 -> 0 bytes + test/source-clip-scale.svg.ref.png | Bin 116 -> 0 bytes + test/source-clip.base.argb32.ref.png | Bin 111 -> 0 bytes + test/source-clip.base.rgb24.ref.png | Bin 111 -> 0 bytes + test/source-clip.ref.png | Bin 133 -> 0 bytes + .../source-surface-scale-paint.base.argb32.ref.png | Bin 120 -> 0 bytes + test/source-surface-scale-paint.base.rgb24.ref.png | Bin 114 -> 0 bytes + test/source-surface-scale-paint.ref.png | Bin 139 -> 0 bytes + test/source-surface-scale-paint.rgb24.ref.png | Bin 133 -> 0 bytes + test/spline-decomposition.base.argb32.ref.png | Bin 19075 -> 0 bytes + test/spline-decomposition.base.rgb24.ref.png | Bin 19075 -> 0 bytes + test/spline-decomposition.image16.ref.png | Bin 14064 -> 0 bytes + test/spline-decomposition.pdf.ref.png | Bin 19540 -> 0 bytes + test/spline-decomposition.ps.ref.png | Bin 8939 -> 0 bytes + test/spline-decomposition.quartz.xfail.png | Bin 19560 -> 0 bytes + test/spline-decomposition.ref.png | Bin 10005 -> 0 bytes + test/spline-decomposition.svg.ref.png | Bin 19540 -> 0 bytes + test/spline-decomposition.xlib.ref.png | Bin 19158 -> 0 bytes + test/stroke-ctm-caps.base.argb32.ref.png | Bin 873 -> 0 bytes + test/stroke-ctm-caps.base.rgb24.ref.png | Bin 873 -> 0 bytes + test/stroke-ctm-caps.image16.ref.png | Bin 908 -> 0 bytes + test/stroke-ctm-caps.ps2.ref.png | Bin 1079 -> 0 bytes + test/stroke-ctm-caps.ps3.ref.png | Bin 1079 -> 0 bytes + test/stroke-ctm-caps.quartz.ref.png | Bin 899 -> 0 bytes + test/stroke-ctm-caps.ref.png | Bin 921 -> 0 bytes + test/stroke-image.base.argb32.ref.png | Bin 1458 -> 0 bytes + test/stroke-image.base.rgb24.ref.png | Bin 1458 -> 0 bytes + test/stroke-image.image16.ref.png | Bin 1167 -> 0 bytes + test/stroke-image.pdf.ref.png | Bin 1475 -> 0 bytes + test/stroke-image.ps.ref.png | Bin 1682 -> 0 bytes + test/stroke-image.quartz.ref.png | Bin 1350 -> 0 bytes + test/stroke-image.ref.png | Bin 972 -> 0 bytes + test/stroke-image.xlib.ref.png | Bin 1440 -> 0 bytes + test/stroke-open-box.base.argb32.ref.png | Bin 148 -> 0 bytes + test/stroke-open-box.base.rgb24.ref.png | Bin 148 -> 0 bytes + test/stroke-open-box.ref.png | Bin 148 -> 0 bytes + test/subsurface-image-repeat.base.argb32.ref.png | Bin 915 -> 0 bytes + test/subsurface-image-repeat.base.rgb24.ref.png | Bin 915 -> 0 bytes + test/subsurface-image-repeat.image16.ref.png | Bin 776 -> 0 bytes + test/subsurface-image-repeat.ref.png | Bin 915 -> 0 bytes + test/subsurface-modify-child.base.argb32.ref.png | Bin 197 -> 0 bytes + test/subsurface-modify-child.base.rgb24.ref.png | Bin 197 -> 0 bytes + test/subsurface-modify-child.ref.png | Bin 197 -> 0 bytes + test/subsurface-modify-parent.base.argb32.ref.png | Bin 197 -> 0 bytes + test/subsurface-modify-parent.base.rgb24.ref.png | Bin 197 -> 0 bytes + test/subsurface-modify-parent.ref.png | Bin 197 -> 0 bytes + test/subsurface-outside-target.argb32.ref.png | Bin 2063 -> 0 bytes + test/subsurface-outside-target.base.argb32.ref.png | Bin 1149 -> 0 bytes + test/subsurface-outside-target.base.rgb24.ref.png | Bin 1005 -> 0 bytes + test/subsurface-outside-target.rgb24.ref.png | Bin 1648 -> 0 bytes + test/subsurface-pad.base.argb32.ref.png | Bin 181 -> 0 bytes + test/subsurface-pad.base.rgb24.ref.png | Bin 181 -> 0 bytes + test/subsurface-pad.quartz.xfail.png | Bin 197 -> 0 bytes + test/subsurface-pad.ref.png | Bin 181 -> 0 bytes + test/subsurface-reflect.base.argb32.ref.png | Bin 210 -> 0 bytes + test/subsurface-reflect.base.rgb24.ref.png | Bin 210 -> 0 bytes + test/subsurface-reflect.ref.png | Bin 210 -> 0 bytes + test/subsurface-repeat.base.argb32.ref.png | Bin 197 -> 0 bytes + test/subsurface-repeat.base.rgb24.ref.png | Bin 197 -> 0 bytes + test/subsurface-repeat.ref.png | Bin 197 -> 0 bytes + test/subsurface-similar-repeat.base.argb32.ref.png | Bin 197 -> 0 bytes + test/subsurface-similar-repeat.base.rgb24.ref.png | Bin 197 -> 0 bytes + test/subsurface-similar-repeat.ref.png | Bin 197 -> 0 bytes + test/subsurface.base.argb32.ref.png | Bin 1281 -> 0 bytes + test/subsurface.base.rgb24.ref.png | Bin 1281 -> 0 bytes + test/subsurface.image16.ref.png | Bin 1643 -> 0 bytes + test/subsurface.ps.ref.png | Bin 1651 -> 0 bytes + test/subsurface.ref.png | Bin 1281 -> 0 bytes + test/subsurface.xlib.ref.png | Bin 1782 -> 0 bytes + ...face-pattern-big-scale-down.base.argb32.ref.png | Bin 191 -> 0 bytes + ...rface-pattern-big-scale-down.base.rgb24.ref.png | Bin 191 -> 0 bytes + test/surface-pattern-big-scale-down.ps.ref.png | Bin 235 -> 0 bytes + test/surface-pattern-big-scale-down.quartz.ref.png | Bin 258 -> 0 bytes + test/surface-pattern-big-scale-down.ref.png | Bin 191 -> 0 bytes + test/surface-pattern-operator.argb32.ref.png | Bin 4807 -> 0 bytes + test/surface-pattern-operator.base.argb32.ref.png | Bin 5184 -> 0 bytes + test/surface-pattern-operator.base.rgb24.ref.png | Bin 1913 -> 0 bytes + test/surface-pattern-operator.image16.ref.png | Bin 1977 -> 0 bytes + test/surface-pattern-operator.pdf.argb32.xfail.png | Bin 5485 -> 0 bytes + test/surface-pattern-operator.pdf.rgb24.xfail.png | Bin 2095 -> 0 bytes + .../surface-pattern-operator.quartz.argb32.ref.png | Bin 5721 -> 0 bytes + test/surface-pattern-operator.quartz.rgb24.ref.png | Bin 2429 -> 0 bytes + test/surface-pattern-operator.rgb24.ref.png | Bin 1866 -> 0 bytes + test/surface-pattern-operator.xlib.argb32.ref.png | Bin 5171 -> 0 bytes + test/surface-pattern-operator.xlib.rgb24.ref.png | Bin 1913 -> 0 bytes + ...tern-scale-down-extend-none.base.argb32.ref.png | Bin 329 -> 0 bytes + ...ttern-scale-down-extend-none.base.rgb24.ref.png | Bin 329 -> 0 bytes + ...e-pattern-scale-down-extend-none.quartz.ref.png | Bin 391 -> 0 bytes + .../surface-pattern-scale-down-extend-none.ref.png | Bin 329 -> 0 bytes + ...ttern-scale-down-extend-pad.base.argb32.ref.png | Bin 320 -> 0 bytes + ...attern-scale-down-extend-pad.base.rgb24.ref.png | Bin 320 -> 0 bytes + ...-pattern-scale-down-extend-pad.quartz.xfail.png | Bin 397 -> 0 bytes + test/surface-pattern-scale-down-extend-pad.ref.png | Bin 320 -> 0 bytes + ...n-scale-down-extend-reflect.base.argb32.ref.png | Bin 328 -> 0 bytes + ...rn-scale-down-extend-reflect.base.rgb24.ref.png | Bin 328 -> 0 bytes + ...attern-scale-down-extend-reflect.quartz.ref.png | Bin 475 -> 0 bytes + ...rface-pattern-scale-down-extend-reflect.ref.png | Bin 328 -> 0 bytes + ...rn-scale-down-extend-repeat.base.argb32.ref.png | Bin 330 -> 0 bytes + ...ern-scale-down-extend-repeat.base.rgb24.ref.png | Bin 330 -> 0 bytes + ...pattern-scale-down-extend-repeat.quartz.ref.png | Bin 397 -> 0 bytes + ...urface-pattern-scale-down-extend-repeat.ref.png | Bin 330 -> 0 bytes + .../surface-pattern-scale-down.base.argb32.ref.png | Bin 1326 -> 0 bytes + test/surface-pattern-scale-down.base.rgb24.ref.png | Bin 1326 -> 0 bytes + test/surface-pattern-scale-down.image16.ref.png | Bin 1313 -> 0 bytes + test/surface-pattern-scale-down.pdf.ref.png | Bin 2189 -> 0 bytes + test/surface-pattern-scale-down.ps2.ref.png | Bin 1324 -> 0 bytes + test/surface-pattern-scale-down.ps3.ref.png | Bin 1324 -> 0 bytes + test/surface-pattern-scale-down.quartz.ref.png | Bin 2276 -> 0 bytes + test/surface-pattern-scale-down.ref.png | Bin 1784 -> 0 bytes + test/surface-pattern-scale-up.base.argb32.ref.png | Bin 4020 -> 0 bytes + test/surface-pattern-scale-up.base.rgb24.ref.png | Bin 4020 -> 0 bytes + test/surface-pattern-scale-up.image16.ref.png | Bin 3864 -> 0 bytes + test/surface-pattern-scale-up.pdf.ref.png | Bin 3482 -> 0 bytes + test/surface-pattern-scale-up.ps2.ref.png | Bin 913 -> 0 bytes + test/surface-pattern-scale-up.ps3.ref.png | Bin 913 -> 0 bytes + test/surface-pattern-scale-up.quartz.xfail.png | Bin 3294 -> 0 bytes + test/surface-pattern-scale-up.ref.png | Bin 4017 -> 0 bytes + test/surface-pattern.base.argb32.ref.png | Bin 11088 -> 0 bytes + test/surface-pattern.base.rgb24.ref.png | Bin 11088 -> 0 bytes + test/surface-pattern.image16.ref.png | Bin 11870 -> 0 bytes + test/surface-pattern.pdf.xfail.png | Bin 10532 -> 0 bytes + test/surface-pattern.ps.xfail.png | Bin 2188 -> 0 bytes + test/surface-pattern.quartz.xfail.png | Bin 9216 -> 0 bytes + test/surface-pattern.ref.png | Bin 11100 -> 0 bytes + test/surface-pattern.svg.xfail.png | Bin 16069 -> 0 bytes + test/svg-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/svg-surface-source.base.argb32.ref.png | Bin 377 -> 0 bytes + test/svg-surface-source.base.rgb24.ref.png | Bin 301 -> 0 bytes + test/svg-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/svg-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/svg-surface-source.svg12.argb32.xfail.png | Bin 278 -> 0 bytes + test/svg-surface-source.svg12.rgb24.xfail.png | Bin 278 -> 0 bytes + test/text-antialias-gray.base.argb32.ref.png | Bin 975 -> 0 bytes + test/text-antialias-gray.base.rgb24.ref.png | Bin 975 -> 0 bytes + test/text-antialias-gray.image16.ref.png | Bin 895 -> 0 bytes + test/text-antialias-gray.quartz.ref.png | Bin 956 -> 0 bytes + test/text-antialias-gray.ref.png | Bin 975 -> 0 bytes + test/text-antialias-none.base.argb32.ref.png | Bin 265 -> 0 bytes + test/text-antialias-none.base.rgb24.ref.png | Bin 265 -> 0 bytes + test/text-antialias-none.quartz.ref.png | Bin 270 -> 0 bytes + test/text-antialias-none.ref.png | Bin 298 -> 0 bytes + test/text-antialias-subpixel.base.argb32.xfail.png | Bin 925 -> 0 bytes + test/text-antialias-subpixel.base.rgb24.xfail.png | Bin 925 -> 0 bytes + test/text-antialias-subpixel.image16.ref.png | Bin 866 -> 0 bytes + test/text-antialias-subpixel.quartz.ref.png | Bin 949 -> 0 bytes + test/text-antialias-subpixel.ref.png | Bin 1004 -> 0 bytes + test/text-glyph-range.base.argb32.ref.png | Bin 1991 -> 0 bytes + test/text-glyph-range.base.rgb24.ref.png | Bin 1991 -> 0 bytes + test/text-glyph-range.image16.ref.png | Bin 1731 -> 0 bytes + test/text-glyph-range.ps.ref.png | Bin 1253 -> 0 bytes + test/text-glyph-range.quartz.ref.png | Bin 2191 -> 0 bytes + test/text-glyph-range.ref.png | Bin 1729 -> 0 bytes + test/text-pattern.base.argb32.ref.png | Bin 1695 -> 0 bytes + test/text-pattern.base.rgb24.ref.png | Bin 1397 -> 0 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 1515 -> 0 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 1339 -> 0 bytes + test/text-pattern.ps2.argb32.ref.png | Bin 1646 -> 0 bytes + test/text-pattern.ps2.rgb24.ref.png | Bin 1646 -> 0 bytes + test/text-pattern.ps3.argb32.ref.png | Bin 881 -> 0 bytes + test/text-pattern.ps3.rgb24.ref.png | Bin 862 -> 0 bytes + test/text-pattern.quartz.argb32.ref.png | Bin 2148 -> 0 bytes + test/text-pattern.quartz.rgb24.ref.png | Bin 1867 -> 0 bytes + test/text-pattern.ref.png | Bin 1685 -> 0 bytes + test/text-pattern.rgb24.ref.png | Bin 1392 -> 0 bytes + test/text-pattern.svg.argb32.ref.png | Bin 1745 -> 0 bytes + test/text-pattern.svg.rgb24.ref.png | Bin 1453 -> 0 bytes + test/text-rotate.base.argb32.ref.png | Bin 16599 -> 0 bytes + test/text-rotate.base.rgb24.ref.png | Bin 16599 -> 0 bytes + test/text-rotate.image16.ref.png | Bin 12599 -> 0 bytes + test/text-rotate.pdf.ref.png | Bin 16744 -> 0 bytes + test/text-rotate.ps.ref.png | Bin 8765 -> 0 bytes + test/text-rotate.quartz.ref.png | Bin 16655 -> 0 bytes + test/text-rotate.ref.png | Bin 14682 -> 0 bytes + test/text-rotate.svg.ref.png | Bin 17118 -> 0 bytes + test/text-rotate.xlib-fallback.ref.png | Bin 16592 -> 0 bytes + test/text-rotate.xlib.ref.png | Bin 16646 -> 0 bytes + test/text-transform.base.argb32.ref.png | Bin 5579 -> 0 bytes + test/text-transform.base.rgb24.ref.png | Bin 5579 -> 0 bytes + test/text-transform.image16.ref.png | Bin 4469 -> 0 bytes + test/text-transform.pdf.argb32.ref.png | Bin 5507 -> 0 bytes + test/text-transform.pdf.rgb24.ref.png | Bin 5507 -> 0 bytes + test/text-transform.ps2.ref.png | Bin 3943 -> 0 bytes + test/text-transform.ps3.ref.png | Bin 3943 -> 0 bytes + test/text-transform.ref.png | Bin 6200 -> 0 bytes + test/text-transform.svg.ref.png | Bin 5682 -> 0 bytes + test/tiger.base.argb32.ref.png | Bin 94370 -> 0 bytes + test/tiger.base.rgb24.ref.png | Bin 94370 -> 0 bytes + test/tiger.ref.png | Bin 71094 -> 0 bytes + test/tighten-bounds.base.argb32.ref.png | Bin 8457 -> 0 bytes + test/tighten-bounds.base.rgb24.ref.png | Bin 7832 -> 0 bytes + test/tighten-bounds.ref.png | Bin 7958 -> 0 bytes + test/transforms.base.argb32.ref.png | Bin 299 -> 0 bytes + test/transforms.base.rgb24.ref.png | Bin 299 -> 0 bytes + test/transforms.image16.ref.png | Bin 326 -> 0 bytes + test/transforms.ps2.ref.png | Bin 418 -> 0 bytes + test/transforms.ps3.ref.png | Bin 418 -> 0 bytes + test/transforms.ref.png | Bin 341 -> 0 bytes + test/translate-show-surface.base.argb32.ref.png | Bin 96 -> 0 bytes + test/translate-show-surface.base.rgb24.ref.png | Bin 96 -> 0 bytes + test/translate-show-surface.ref.png | Bin 100 -> 0 bytes + test/trap-clip.base.argb32.ref.png | Bin 5753 -> 0 bytes + test/trap-clip.base.rgb24.ref.png | Bin 5379 -> 0 bytes + test/trap-clip.image16.ref.png | Bin 4344 -> 0 bytes + test/trap-clip.ps2.argb32.ref.png | Bin 4839 -> 0 bytes + test/trap-clip.ps2.rgb24.ref.png | Bin 4729 -> 0 bytes + test/trap-clip.ps3.argb32.ref.png | Bin 4751 -> 0 bytes + test/trap-clip.ps3.rgb24.ref.png | Bin 4553 -> 0 bytes + test/trap-clip.quartz.argb32.ref.png | Bin 6115 -> 0 bytes + test/trap-clip.quartz.rgb24.ref.png | Bin 5801 -> 0 bytes + test/trap-clip.ref.png | Bin 5741 -> 0 bytes + test/trap-clip.rgb24.ref.png | Bin 5328 -> 0 bytes + test/trap-clip.test-paginated.argb32.ref.png | Bin 5898 -> 0 bytes + test/trap-clip.xlib.ref.png | Bin 5772 -> 0 bytes + test/trap-clip.xlib.rgb24.ref.png | Bin 5365 -> 0 bytes + test/twin-antialias-gray.base.argb32.ref.png | Bin 4053 -> 0 bytes + test/twin-antialias-gray.base.rgb24.ref.png | Bin 4053 -> 0 bytes + test/twin-antialias-gray.image16.ref.png | Bin 3005 -> 0 bytes + test/twin-antialias-gray.ref.png | Bin 2292 -> 0 bytes + test/twin-antialias-gray.xlib.ref.png | Bin 3863 -> 0 bytes + test/twin-antialias-mixed.base.argb32.ref.png | Bin 1639 -> 0 bytes + test/twin-antialias-mixed.base.rgb24.ref.png | Bin 1639 -> 0 bytes + test/twin-antialias-mixed.image16.ref.png | Bin 2049 -> 0 bytes + test/twin-antialias-mixed.ref.png | Bin 1639 -> 0 bytes + test/twin-antialias-mixed.xlib.ref.png | Bin 1760 -> 0 bytes + test/twin-antialias-none.base.argb32.ref.png | Bin 747 -> 0 bytes + test/twin-antialias-none.base.rgb24.ref.png | Bin 747 -> 0 bytes + test/twin-antialias-none.ref.png | Bin 747 -> 0 bytes + test/twin-antialias-none.xlib.ref.png | Bin 745 -> 0 bytes + test/twin-antialias-subpixel.base.argb32.ref.png | Bin 4053 -> 0 bytes + test/twin-antialias-subpixel.base.rgb24.ref.png | Bin 4053 -> 0 bytes + test/twin-antialias-subpixel.image16.ref.png | Bin 3005 -> 0 bytes + test/twin-antialias-subpixel.ref.png | Bin 2292 -> 0 bytes + test/twin-antialias-subpixel.xlib.ref.png | Bin 3863 -> 0 bytes + test/twin.base.argb32.ref.png | Bin 4053 -> 0 bytes + test/twin.base.rgb24.ref.png | Bin 4053 -> 0 bytes + test/twin.image16.ref.png | Bin 3005 -> 0 bytes + test/twin.ps.ref.png | Bin 2136 -> 0 bytes + test/twin.ref.png | Bin 2292 -> 0 bytes + test/twin.svg.ref.png | Bin 3040 -> 0 bytes + test/twin.xlib.ref.png | Bin 4435 -> 0 bytes + test/unaligned-box.base.argb32.ref.png | Bin 526 -> 0 bytes + test/unaligned-box.base.rgb24.ref.png | Bin 526 -> 0 bytes + test/unaligned-box.ref.png | Bin 496 -> 0 bytes + test/unantialiased-shapes.base.argb32.ref.png | Bin 3977 -> 0 bytes + test/unantialiased-shapes.base.rgb24.ref.png | Bin 3977 -> 0 bytes + test/unantialiased-shapes.quartz.ref.png | Bin 3868 -> 0 bytes + test/unantialiased-shapes.ref.png | Bin 3926 -> 0 bytes + test/unbounded-operator.base.argb32.ref.png | Bin 2756 -> 0 bytes + test/unbounded-operator.base.rgb24.ref.png | Bin 1289 -> 0 bytes + test/unbounded-operator.gl.argb32.xfail.png | Bin 2805 -> 0 bytes + test/unbounded-operator.gl.rgb24.xfail.png | Bin 1355 -> 0 bytes + test/unbounded-operator.image16.ref.png | Bin 1276 -> 0 bytes + test/unbounded-operator.pdf.argb32.ref.png | Bin 2713 -> 0 bytes + test/unbounded-operator.ps2.argb32.ref.png | Bin 2713 -> 0 bytes + test/unbounded-operator.ps3.argb32.ref.png | Bin 2713 -> 0 bytes + test/unbounded-operator.quartz.argb32.ref.png | Bin 3509 -> 0 bytes + test/unbounded-operator.quartz.rgb24.ref.png | Bin 1657 -> 0 bytes + test/unbounded-operator.ref.png | Bin 2777 -> 0 bytes + test/unbounded-operator.rgb24.ref.png | Bin 1341 -> 0 bytes + test/unbounded-operator.svg12.argb32.ref.png | Bin 2767 -> 0 bytes + test/unbounded-operator.svg12.rgb24.xfail.png | Bin 1731 -> 0 bytes + test/unbounded-operator.xlib.rgb24.ref.png | Bin 1315 -> 0 bytes + test/unclosed-strokes.base.argb32.ref.png | Bin 1482 -> 0 bytes + test/unclosed-strokes.base.rgb24.ref.png | Bin 1482 -> 0 bytes + test/unclosed-strokes.ref.png | Bin 1432 -> 0 bytes + test/user-font-mask.base.argb32.ref.png | Bin 5476 -> 0 bytes + test/user-font-mask.base.rgb24.ref.png | Bin 5476 -> 0 bytes + test/user-font-mask.image16.ref.png | Bin 4948 -> 0 bytes + test/user-font-mask.pdf.ref.png | Bin 1927 -> 0 bytes + test/user-font-mask.ps2.ref.png | Bin 1927 -> 0 bytes + test/user-font-mask.ps3.ref.png | Bin 1927 -> 0 bytes + test/user-font-mask.ref.png | Bin 5476 -> 0 bytes + test/user-font-mask.svg.ref.png | Bin 2030 -> 0 bytes + test/user-font-proxy.base.argb32.ref.png | Bin 16798 -> 0 bytes + test/user-font-proxy.base.rgb24.ref.png | Bin 16798 -> 0 bytes + test/user-font-proxy.image16.ref.png | Bin 14460 -> 0 bytes + test/user-font-proxy.pdf.argb32.ref.png | Bin 16937 -> 0 bytes + test/user-font-proxy.pdf.ref.png | Bin 18111 -> 0 bytes + test/user-font-proxy.pdf.rgb24.ref.png | Bin 16937 -> 0 bytes + test/user-font-proxy.ps.ref.png | Bin 7837 -> 0 bytes + test/user-font-proxy.quartz.ref.png | Bin 19795 -> 0 bytes + test/user-font-proxy.ref.png | Bin 14023 -> 0 bytes + test/user-font-proxy.svg.ref.png | Bin 16814 -> 0 bytes + test/user-font-proxy.xlib.ref.png | Bin 18121 -> 0 bytes + test/user-font-rescale.base.argb32.ref.png | Bin 14852 -> 0 bytes + test/user-font-rescale.base.rgb24.ref.png | Bin 14852 -> 0 bytes + test/user-font-rescale.image16.ref.png | Bin 12590 -> 0 bytes + test/user-font-rescale.ps.ref.png | Bin 6781 -> 0 bytes + test/user-font-rescale.quartz.ref.png | Bin 15982 -> 0 bytes + test/user-font-rescale.ref.png | Bin 14852 -> 0 bytes + test/user-font-rescale.svg.ref.png | Bin 14873 -> 0 bytes + test/user-font.base.argb32.ref.png | Bin 5439 -> 0 bytes + test/user-font.base.rgb24.ref.png | Bin 5439 -> 0 bytes + test/user-font.image16.ref.png | Bin 5814 -> 0 bytes + test/user-font.pdf.ref.png | Bin 6241 -> 0 bytes + test/user-font.ps.ref.png | Bin 4605 -> 0 bytes + test/user-font.quartz.ref.png | Bin 5960 -> 0 bytes + test/user-font.ref.png | Bin 4939 -> 0 bytes + test/user-font.svg.ref.png | Bin 6379 -> 0 bytes + test/user-font.xlib.ref.png | Bin 5884 -> 0 bytes + test/white-in-noop.base.argb32.ref.png | Bin 95 -> 0 bytes + test/white-in-noop.base.rgb24.ref.png | Bin 95 -> 0 bytes + test/white-in-noop.ref.png | Bin 95 -> 0 bytes + test/world-map-fill.base.argb32.ref.png | Bin 57451 -> 0 bytes + test/world-map-fill.base.rgb24.ref.png | Bin 57451 -> 0 bytes + test/world-map-fill.image16.ref.png | Bin 36582 -> 0 bytes + test/world-map-fill.ref.png | Bin 45440 -> 0 bytes + test/world-map-stroke.base.argb32.ref.png | Bin 65217 -> 0 bytes + test/world-map-stroke.base.rgb24.ref.png | Bin 65217 -> 0 bytes + test/world-map-stroke.image16.ref.png | Bin 41885 -> 0 bytes + test/world-map-stroke.ref.png | Bin 43370 -> 0 bytes + test/world-map.base.argb32.ref.png | Bin 70536 -> 0 bytes + test/world-map.base.rgb24.ref.png | Bin 70536 -> 0 bytes + test/world-map.image16.ref.png | Bin 48377 -> 0 bytes + test/world-map.ref.png | Bin 65880 -> 0 bytes + test/xcb-huge-image-shm.base.argb32.ref.png | Bin 97 -> 0 bytes + test/xcb-huge-image-shm.base.rgb24.ref.png | Bin 97 -> 0 bytes + test/xcb-huge-image-shm.ref.png | Bin 97 -> 0 bytes + test/xcb-snapshot-assert.base.argb32.ref.png | Bin 97 -> 0 bytes + test/xcb-snapshot-assert.base.rgb24.ref.png | Bin 97 -> 0 bytes + test/xcb-snapshot-assert.ref.png | Bin 97 -> 0 bytes + test/xcb-stress-cache.base.argb32.ref.png | Bin 97 -> 0 bytes + test/xcb-stress-cache.base.rgb24.ref.png | Bin 97 -> 0 bytes + test/xcb-stress-cache.ref.png | Bin 97 -> 0 bytes + test/xcb-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/xcb-surface-source.base.argb32.ref.png | Bin 377 -> 0 bytes + test/xcb-surface-source.base.rgb24.ref.png | Bin 301 -> 0 bytes + test/xcb-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/xcb-surface-source.ps.argb32.ref.png | Bin 491 -> 0 bytes + test/xcb-surface-source.ps.rgb24.ref.png | Bin 482 -> 0 bytes + test/xcb-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/xcomposite-projection.base.argb32.ref.png | Bin 1112 -> 0 bytes + test/xcomposite-projection.base.rgb24.ref.png | Bin 1112 -> 0 bytes + test/xcomposite-projection.image16.ref.png | Bin 1000 -> 0 bytes + test/xcomposite-projection.quartz.ref.png | Bin 926 -> 0 bytes + test/xcomposite-projection.ref.png | Bin 1108 -> 0 bytes + test/xlib-expose-event.base.argb32.ref.png | Bin 40717 -> 0 bytes + test/xlib-expose-event.base.rgb24.ref.png | Bin 40717 -> 0 bytes + test/xlib-expose-event.image16.ref.png | Bin 30332 -> 0 bytes + test/xlib-expose-event.ps.ref.png | Bin 39035 -> 0 bytes + test/xlib-expose-event.ref.png | Bin 40736 -> 0 bytes + test/xlib-surface-source.argb32.ref.png | Bin 377 -> 0 bytes + test/xlib-surface-source.base.argb32.ref.png | Bin 377 -> 0 bytes + test/xlib-surface-source.base.rgb24.ref.png | Bin 301 -> 0 bytes + test/xlib-surface-source.image16.ref.png | Bin 305 -> 0 bytes + test/xlib-surface-source.ps.argb32.ref.png | Bin 491 -> 0 bytes + test/xlib-surface-source.ps.rgb24.ref.png | Bin 482 -> 0 bytes + test/xlib-surface-source.rgb24.ref.png | Bin 301 -> 0 bytes + test/xlib-surface-source.svg12.argb32.xfail.png | Bin 278 -> 0 bytes + test/xlib-surface-source.svg12.rgb24.xfail.png | Bin 278 -> 0 bytes + test/zero-alpha.base.argb32.ref.png | Bin 91 -> 0 bytes + test/zero-alpha.base.rgb24.ref.png | Bin 91 -> 0 bytes + test/zero-alpha.ref.png | Bin 115 -> 0 bytes + test/zero-mask.base.argb32.ref.png | Bin 402 -> 0 bytes + test/zero-mask.base.rgb24.ref.png | Bin 382 -> 0 bytes + test/zero-mask.ref.png | Bin 402 -> 0 bytes + test/zero-mask.rgb24.ref.png | Bin 382 -> 0 bytes + 4447 files changed, 2229 insertions(+), 2229 deletions(-) + +commit 1eaab086f36aeeacdcb12d377e1fd8746a2c7b79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 13:53:15 2011 +0100 + + ps: Set transparency for stencil_masks + + Fixes crash in a8-mask. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ps-surface.c | 24 ++++++++++-------------- + 1 file changed, 10 insertions(+), 14 deletions(-) + +commit 47e16d0e565fcb579148285394bafd45b53ecaff +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 15 21:52:26 2011 +0930 + + subsetting: Support unicode fontnames + + Most fonts use Window platform specific encoded font names since they + allow unicode names. + + - Make _cairo_truetype_read_font_name() read the Windows platform + names first. If this fails, fallback to reading he the Mac platform + MacRoman encoded name. + + - Use the PDF method of encoding non ASCII PS font names. Poppler will + correctly extract the unicode name. + + - Make PDF embed the font family name as AsciiHex if the name is not ASCII. + + src/cairo-cff-subset.c | 12 +- + src/cairo-pdf-surface.c | 81 +++++++++++- + src/cairo-scaled-font-subsets-private.h | 4 +- + src/cairo-truetype-subset.c | 225 ++++++++++++++++++++++++-------- + 4 files changed, 253 insertions(+), 69 deletions(-) + +commit 1e67fb4490c19085def6f7d77314cc66449288b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 12:57:18 2011 +0100 + + test: Complete set of baseline reference images + + test-base basically implements rendering ala cairo-1.0 and so serves as + a useful baseline for comparing enhancements and to regression test the + core libraries. + + boilerplate/cairo-boilerplate-test-surfaces.c | 4 +- + test/Makefile.refs | 758 +++++++++++++++++++++ + test/a1-bug.base.argb32.ref.png | Bin 0 -> 3362 bytes + test/a1-bug.base.rgb24.ref.png | Bin 0 -> 3362 bytes + test/a1-clip-fill-equal.base.argb32.ref.png | Bin 0 -> 120 bytes + test/a1-clip-fill-equal.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/a1-clip-fill-rule.base.argb32.ref.png | Bin 0 -> 236 bytes + test/a1-clip-fill-rule.base.rgb24.ref.png | Bin 0 -> 218 bytes + test/a1-clip-fill.base.argb32.ref.png | Bin 0 -> 120 bytes + test/a1-clip-fill.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/a1-clip-paint.base.argb32.ref.png | Bin 0 -> 120 bytes + test/a1-clip-paint.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/a1-clip-stroke.base.argb32.ref.png | Bin 0 -> 120 bytes + test/a1-clip-stroke.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/a1-image-sample.base.argb32.ref.png | Bin 0 -> 122 bytes + test/a1-image-sample.base.rgb24.ref.png | Bin 0 -> 122 bytes + test/a1-line-width.base.argb32.ref.png | Bin 0 -> 154 bytes + test/a1-line-width.base.rgb24.ref.png | Bin 0 -> 154 bytes + test/a1-mask-sample.base.argb32.ref.png | Bin 0 -> 122 bytes + test/a1-mask-sample.base.rgb24.ref.png | Bin 0 -> 122 bytes + test/a1-mask.base.argb32.ref.png | Bin 0 -> 106 bytes + test/a1-mask.base.rgb24.ref.png | Bin 0 -> 106 bytes + ...a1-rasterisation-rectangles.base.argb32.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-rectangles.base.rgb24.ref.png | Bin 0 -> 1729 bytes + .../a1-rasterisation-triangles.base.argb32.ref.png | Bin 0 -> 1729 bytes + test/a1-rasterisation-triangles.base.rgb24.ref.png | Bin 0 -> 1729 bytes + test/a1-rectilinear-grid.base.argb32.ref.png | Bin 0 -> 207 bytes + test/a1-rectilinear-grid.base.rgb24.ref.png | Bin 0 -> 207 bytes + test/a1-sample.base.argb32.ref.png | Bin 0 -> 786 bytes + test/a1-sample.base.rgb24.ref.png | Bin 0 -> 786 bytes + test/a1-tiger.base.argb32.ref.png | Bin 0 -> 20406 bytes + test/a1-tiger.base.rgb24.ref.png | Bin 0 -> 20406 bytes + test/a1-traps-sample.base.argb32.ref.png | Bin 0 -> 120 bytes + test/a1-traps-sample.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/a8-clear.base.argb32.ref.png | Bin 0 -> 248 bytes + test/a8-clear.base.rgb24.ref.png | Bin 0 -> 248 bytes + test/a8-mask.base.argb32.ref.png | Bin 0 -> 103 bytes + test/a8-mask.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/aliasing.base.argb32.ref.png | Bin 0 -> 103722 bytes + test/aliasing.base.rgb24.ref.png | Bin 0 -> 103722 bytes + test/alpha-similar.base.argb32.ref.png | Bin 0 -> 99 bytes + test/alpha-similar.base.rgb24.ref.png | Bin 0 -> 88 bytes + test/api-special-cases.base.argb32.ref.png | Bin 0 -> 95 bytes + test/api-special-cases.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/arc-infinite-loop.base.argb32.ref.png | Bin 0 -> 96 bytes + test/arc-infinite-loop.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/arc-looping-dash.base.argb32.ref.png | Bin 0 -> 470 bytes + test/arc-looping-dash.base.rgb24.ref.png | Bin 0 -> 470 bytes + test/big-empty-box.base.argb32.ref.png | Bin 0 -> 111 bytes + test/big-empty-box.base.rgb24.ref.png | Bin 0 -> 108 bytes + test/big-empty-triangle.base.argb32.ref.png | Bin 0 -> 111 bytes + test/big-empty-triangle.base.rgb24.ref.png | Bin 0 -> 108 bytes + test/big-line.base.argb32.ref.png | Bin 0 -> 933 bytes + test/big-line.base.rgb24.ref.png | Bin 0 -> 933 bytes + test/big-little-box.base.argb32.ref.png | Bin 0 -> 169 bytes + test/big-little-box.base.rgb24.ref.png | Bin 0 -> 160 bytes + test/big-little-triangle.base.argb32.ref.png | Bin 0 -> 399 bytes + test/big-little-triangle.base.rgb24.ref.png | Bin 0 -> 320 bytes + test/big-trap.base.argb32.ref.png | Bin 0 -> 319 bytes + test/big-trap.base.rgb24.ref.png | Bin 0 -> 319 bytes + test/bilevel-image.base.argb32.ref.png | Bin 0 -> 105 bytes + test/bilevel-image.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/bitmap-font.base.argb32.ref.png | Bin 0 -> 931 bytes + test/bitmap-font.base.rgb24.ref.png | Bin 0 -> 871 bytes + test/bug-40410.base.argb32.ref.png | Bin 0 -> 428 bytes + test/bug-40410.base.rgb24.ref.png | Bin 0 -> 428 bytes + test/bug-bo-rectangular.base.argb32.ref.png | Bin 0 -> 950 bytes + test/bug-bo-rectangular.base.rgb24.ref.png | Bin 0 -> 950 bytes + test/bug-extents.base.argb32.ref.png | Bin 0 -> 9250 bytes + test/bug-extents.base.rgb24.ref.png | Bin 0 -> 9250 bytes + test/bug-seams.base.argb32.ref.png | Bin 0 -> 1606 bytes + test/bug-seams.base.rgb24.ref.png | Bin 0 -> 1606 bytes + test/caps-joins-alpha.base.argb32.ref.png | Bin 0 -> 2278 bytes + test/caps-joins-alpha.base.rgb24.ref.png | Bin 0 -> 2278 bytes + test/caps-joins-curve.base.argb32.ref.png | Bin 0 -> 5368 bytes + test/caps-joins-curve.base.rgb24.ref.png | Bin 0 -> 5368 bytes + test/caps-joins.base.argb32.ref.png | Bin 0 -> 2374 bytes + test/caps-joins.base.rgb24.ref.png | Bin 0 -> 2374 bytes + test/caps-sub-paths.base.argb32.ref.png | Bin 0 -> 166 bytes + test/caps-sub-paths.base.rgb24.ref.png | Bin 0 -> 166 bytes + test/caps-tails-curve.base.argb32.ref.png | Bin 0 -> 50228 bytes + test/caps-tails-curve.base.rgb24.ref.png | Bin 0 -> 50228 bytes + test/caps.base.argb32.ref.png | Bin 0 -> 1601 bytes + test/caps.base.rgb24.ref.png | Bin 0 -> 1601 bytes + test/checkerboard.base.argb32.ref.png | Bin 0 -> 142 bytes + test/checkerboard.base.rgb24.ref.png | Bin 0 -> 142 bytes + test/clear-source.base.argb32.ref.png | Bin 0 -> 779 bytes + test/clear-source.base.rgb24.ref.png | Bin 0 -> 779 bytes + test/clear.base.argb32.ref.png | Bin 0 -> 673 bytes + test/clear.base.rgb24.ref.png | Bin 0 -> 614 bytes + test/clip-all.base.argb32.ref.png | Bin 0 -> 95 bytes + test/clip-all.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/clip-complex-shape-eo-aa.base.argb32.ref.png | Bin 0 -> 325 bytes + test/clip-complex-shape-eo-aa.base.rgb24.ref.png | Bin 0 -> 325 bytes + .../clip-complex-shape-eo-mono.base.argb32.ref.png | Bin 0 -> 325 bytes + test/clip-complex-shape-eo-mono.base.rgb24.ref.png | Bin 0 -> 325 bytes + test/clip-contexts.base.argb32.ref.png | Bin 0 -> 98 bytes + test/clip-contexts.base.rgb24.ref.png | Bin 0 -> 98 bytes + test/clip-device-offset.base.argb32.ref.png | Bin 0 -> 175 bytes + test/clip-device-offset.base.rgb24.ref.png | Bin 0 -> 168 bytes + test/clip-disjoint-hatching.base.argb32.ref.png | Bin 0 -> 8021 bytes + test/clip-disjoint-hatching.base.rgb24.ref.png | Bin 0 -> 8021 bytes + test/clip-disjoint.base.argb32.ref.png | Bin 0 -> 5411 bytes + test/clip-disjoint.base.rgb24.ref.png | Bin 0 -> 5411 bytes + test/clip-empty-group.base.argb32.ref.png | Bin 0 -> 103 bytes + test/clip-empty-group.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/clip-empty-save.base.argb32.ref.png | Bin 0 -> 95 bytes + test/clip-empty-save.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/clip-empty.base.argb32.ref.png | Bin 0 -> 95 bytes + test/clip-empty.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/clip-fill-eo-unbounded.base.argb32.ref.png | Bin 0 -> 3693 bytes + test/clip-fill-eo-unbounded.base.rgb24.ref.png | Bin 0 -> 3198 bytes + test/clip-fill-no-op.base.argb32.ref.png | Bin 0 -> 152 bytes + test/clip-fill-no-op.base.rgb24.ref.png | Bin 0 -> 152 bytes + test/clip-fill-nz-unbounded.base.argb32.ref.png | Bin 0 -> 3693 bytes + test/clip-fill-nz-unbounded.base.rgb24.ref.png | Bin 0 -> 3198 bytes + ...lip-fill-rule-pixel-aligned.base.argb32.ref.png | Bin 0 -> 176 bytes + ...clip-fill-rule-pixel-aligned.base.rgb24.ref.png | Bin 0 -> 165 bytes + test/clip-fill-rule.base.argb32.ref.png | Bin 0 -> 412 bytes + test/clip-fill-rule.base.rgb24.ref.png | Bin 0 -> 361 bytes + test/clip-fill.base.argb32.ref.png | Bin 0 -> 1049 bytes + test/clip-fill.base.rgb24.ref.png | Bin 0 -> 1049 bytes + ...p-shapes-aligned-rectangles.base.argb32.ref.png | Bin 0 -> 378 bytes + ...up-shapes-aligned-rectangles.base.rgb24.ref.png | Bin 0 -> 378 bytes + test/clip-group-shapes-circles.base.argb32.ref.png | Bin 0 -> 1534 bytes + test/clip-group-shapes-circles.base.rgb24.ref.png | Bin 0 -> 1534 bytes + ...shapes-unaligned-rectangles.base.argb32.ref.png | Bin 0 -> 431 bytes + ...-shapes-unaligned-rectangles.base.rgb24.ref.png | Bin 0 -> 431 bytes + test/clip-image.base.argb32.ref.png | Bin 0 -> 2686 bytes + test/clip-image.base.rgb24.ref.png | Bin 0 -> 2686 bytes + test/clip-intersect.base.argb32.ref.png | Bin 0 -> 193 bytes + test/clip-intersect.base.rgb24.ref.png | Bin 0 -> 193 bytes + test/clip-mixed-antialias.base.argb32.ref.png | Bin 0 -> 1094 bytes + test/clip-mixed-antialias.base.rgb24.ref.png | Bin 0 -> 1094 bytes + test/clip-nesting.base.argb32.ref.png | Bin 0 -> 1031 bytes + test/clip-nesting.base.rgb24.ref.png | Bin 0 -> 936 bytes + test/clip-operator.base.argb32.ref.png | Bin 0 -> 8171 bytes + test/clip-operator.base.rgb24.ref.png | Bin 0 -> 3231 bytes + test/clip-push-group.base.argb32.ref.png | Bin 0 -> 155 bytes + test/clip-push-group.base.rgb24.ref.png | Bin 0 -> 155 bytes + ...-rotate-image-surface-paint.base.argb32.ref.png | Bin 0 -> 202 bytes + ...p-rotate-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 202 bytes + test/clip-shape.base.argb32.ref.png | Bin 0 -> 2943 bytes + test/clip-shape.base.rgb24.ref.png | Bin 0 -> 2943 bytes + test/clip-stroke-no-op.base.argb32.ref.png | Bin 0 -> 152 bytes + test/clip-stroke-no-op.base.rgb24.ref.png | Bin 0 -> 152 bytes + test/clip-stroke-unbounded.base.argb32.ref.png | Bin 0 -> 3617 bytes + test/clip-stroke-unbounded.base.rgb24.ref.png | Bin 0 -> 3108 bytes + test/clip-stroke.base.argb32.ref.png | Bin 0 -> 1491 bytes + test/clip-stroke.base.rgb24.ref.png | Bin 0 -> 1491 bytes + test/clip-text.base.argb32.ref.png | Bin 0 -> 899 bytes + test/clip-text.base.rgb24.ref.png | Bin 0 -> 899 bytes + test/clip-twice-rectangle.base.argb32.ref.png | Bin 0 -> 323 bytes + test/clip-twice-rectangle.base.rgb24.ref.png | Bin 0 -> 323 bytes + test/clip-twice.base.argb32.ref.png | Bin 0 -> 1343 bytes + test/clip-twice.base.rgb24.ref.png | Bin 0 -> 1179 bytes + test/clip-unbounded.base.argb32.ref.png | Bin 0 -> 100 bytes + test/clip-unbounded.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/clipped-group.base.argb32.ref.png | Bin 0 -> 316 bytes + test/clipped-group.base.rgb24.ref.png | Bin 0 -> 316 bytes + test/clipped-surface.base.argb32.ref.png | Bin 0 -> 345 bytes + test/clipped-surface.base.rgb24.ref.png | Bin 0 -> 345 bytes + test/close-path-current-point.base.argb32.ref.png | Bin 0 -> 2008 bytes + test/close-path-current-point.base.rgb24.ref.png | Bin 0 -> 2008 bytes + test/close-path.base.argb32.ref.png | Bin 0 -> 284 bytes + test/close-path.base.rgb24.ref.png | Bin 0 -> 284 bytes + ...teger-translate-over-repeat.base.argb32.ref.png | Bin 0 -> 334 bytes + ...nteger-translate-over-repeat.base.rgb24.ref.png | Bin 0 -> 334 bytes + ...site-integer-translate-over.base.argb32.ref.png | Bin 0 -> 13998 bytes + ...osite-integer-translate-over.base.rgb24.ref.png | Bin 0 -> 13998 bytes + ...te-integer-translate-source.base.argb32.ref.png | Bin 0 -> 13998 bytes + ...ite-integer-translate-source.base.rgb24.ref.png | Bin 0 -> 13998 bytes + test/copy-path.base.argb32.ref.png | Bin 0 -> 588 bytes + test/copy-path.base.rgb24.ref.png | Bin 0 -> 588 bytes + test/create-from-png-stream.base.argb32.ref.png | Bin 0 -> 96 bytes + test/create-from-png-stream.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/create-from-png.base.argb32.ref.png | Bin 0 -> 96 bytes + test/create-from-png.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/culled-glyphs.base.argb32.ref.png | Bin 0 -> 435 bytes + test/culled-glyphs.base.rgb24.ref.png | Bin 0 -> 435 bytes + test/curve-to-as-line-to.base.argb32.ref.png | Bin 0 -> 107 bytes + test/curve-to-as-line-to.base.rgb24.ref.png | Bin 0 -> 107 bytes + test/dash-caps-joins.base.argb32.ref.png | Bin 0 -> 4521 bytes + test/dash-caps-joins.base.rgb24.ref.png | Bin 0 -> 4521 bytes + test/dash-curve.base.argb32.ref.png | Bin 0 -> 40040 bytes + test/dash-curve.base.rgb24.ref.png | Bin 0 -> 40040 bytes + test/dash-infinite-loop.base.argb32.ref.png | Bin 0 -> 835 bytes + test/dash-infinite-loop.base.rgb24.ref.png | Bin 0 -> 835 bytes + test/dash-no-dash.base.argb32.ref.png | Bin 0 -> 119 bytes + test/dash-no-dash.base.rgb24.ref.png | Bin 0 -> 119 bytes + test/dash-offset-negative.base.argb32.ref.png | Bin 0 -> 151 bytes + test/dash-offset-negative.base.rgb24.ref.png | Bin 0 -> 151 bytes + test/dash-offset.base.argb32.ref.png | Bin 0 -> 794 bytes + test/dash-offset.base.rgb24.ref.png | Bin 0 -> 794 bytes + test/dash-scale.base.argb32.ref.png | Bin 0 -> 7621 bytes + test/dash-scale.base.rgb24.ref.png | Bin 0 -> 7621 bytes + test/dash-state.base.argb32.ref.png | Bin 0 -> 7628 bytes + test/dash-state.base.rgb24.ref.png | Bin 0 -> 7628 bytes + test/dash-zero-length.base.argb32.ref.png | Bin 0 -> 219 bytes + test/dash-zero-length.base.rgb24.ref.png | Bin 0 -> 199 bytes + test/degenerate-arc.base.argb32.ref.png | Bin 0 -> 547 bytes + test/degenerate-arc.base.rgb24.ref.png | Bin 0 -> 547 bytes + test/degenerate-arcs.base.argb32.ref.png | Bin 0 -> 120 bytes + test/degenerate-arcs.base.rgb24.ref.png | Bin 0 -> 120 bytes + test/degenerate-curve-to.base.argb32.ref.png | Bin 0 -> 283 bytes + test/degenerate-curve-to.base.rgb24.ref.png | Bin 0 -> 283 bytes + test/degenerate-dash.base.argb32.ref.png | Bin 0 -> 1898 bytes + test/degenerate-dash.base.rgb24.ref.png | Bin 0 -> 1898 bytes + .../degenerate-linear-gradient.base.argb32.ref.png | Bin 0 -> 336 bytes + test/degenerate-linear-gradient.base.rgb24.ref.png | Bin 0 -> 336 bytes + test/degenerate-path.base.argb32.ref.png | Bin 0 -> 249 bytes + test/degenerate-path.base.rgb24.ref.png | Bin 0 -> 217 bytes + test/degenerate-pen.base.argb32.ref.png | Bin 0 -> 1000 bytes + test/degenerate-pen.base.rgb24.ref.png | Bin 0 -> 1000 bytes + .../degenerate-radial-gradient.base.argb32.ref.png | Bin 0 -> 428 bytes + test/degenerate-radial-gradient.base.rgb24.ref.png | Bin 0 -> 428 bytes + test/degenerate-rel-curve-to.base.argb32.ref.png | Bin 0 -> 278 bytes + test/degenerate-rel-curve-to.base.rgb24.ref.png | Bin 0 -> 278 bytes + test/device-offset-fractional.base.argb32.ref.png | Bin 0 -> 266 bytes + test/device-offset-fractional.base.rgb24.ref.png | Bin 0 -> 266 bytes + test/device-offset-positive.base.argb32.ref.png | Bin 0 -> 120 bytes + test/device-offset-positive.base.rgb24.ref.png | Bin 0 -> 111 bytes + test/device-offset-scale.base.argb32.ref.png | Bin 0 -> 109 bytes + test/device-offset-scale.base.rgb24.ref.png | Bin 0 -> 109 bytes + test/device-offset.base.argb32.ref.png | Bin 0 -> 118 bytes + test/device-offset.base.rgb24.ref.png | Bin 0 -> 111 bytes + test/drunkard-tails.base.argb32.ref.png | Bin 0 -> 6036 bytes + test/drunkard-tails.base.rgb24.ref.png | Bin 0 -> 6036 bytes + test/extend-pad-border.base.argb32.ref.png | Bin 0 -> 495 bytes + test/extend-pad-border.base.rgb24.ref.png | Bin 0 -> 495 bytes + test/extend-pad-similar.base.argb32.ref.png | Bin 0 -> 279 bytes + test/extend-pad-similar.base.rgb24.ref.png | Bin 0 -> 279 bytes + test/extend-pad.base.argb32.ref.png | Bin 0 -> 279 bytes + test/extend-pad.base.rgb24.ref.png | Bin 0 -> 279 bytes + test/extend-reflect-similar.base.argb32.ref.png | Bin 0 -> 133406 bytes + test/extend-reflect-similar.base.rgb24.ref.png | Bin 0 -> 133406 bytes + test/extend-reflect.base.argb32.ref.png | Bin 0 -> 133406 bytes + test/extend-reflect.base.rgb24.ref.png | Bin 0 -> 133406 bytes + test/extend-repeat-similar.base.argb32.ref.png | Bin 0 -> 108603 bytes + test/extend-repeat-similar.base.rgb24.ref.png | Bin 0 -> 108603 bytes + test/extend-repeat.base.argb32.ref.png | Bin 0 -> 108603 bytes + test/extend-repeat.base.rgb24.ref.png | Bin 0 -> 108603 bytes + test/extended-blend-alpha-mask.base.argb32.ref.png | Bin 0 -> 9221 bytes + test/extended-blend-alpha-mask.base.rgb24.ref.png | Bin 0 -> 4597 bytes + test/extended-blend-alpha.base.argb32.ref.png | Bin 0 -> 9406 bytes + test/extended-blend-alpha.base.rgb24.ref.png | Bin 0 -> 5740 bytes + test/extended-blend-mask.base.argb32.ref.png | Bin 0 -> 3971 bytes + test/extended-blend-mask.base.rgb24.ref.png | Bin 0 -> 3643 bytes + .../extended-blend-solid-alpha.base.argb32.ref.png | Bin 0 -> 9406 bytes + test/extended-blend-solid-alpha.base.rgb24.ref.png | Bin 0 -> 5740 bytes + test/extended-blend-solid.base.argb32.ref.png | Bin 0 -> 4063 bytes + test/extended-blend-solid.base.rgb24.ref.png | Bin 0 -> 3775 bytes + test/extended-blend.base.argb32.ref.png | Bin 0 -> 4063 bytes + test/extended-blend.base.rgb24.ref.png | Bin 0 -> 3775 bytes + test/fill-alpha-pattern.base.argb32.ref.png | Bin 0 -> 3379 bytes + test/fill-alpha-pattern.base.rgb24.ref.png | Bin 0 -> 3379 bytes + test/fill-alpha.base.argb32.ref.png | Bin 0 -> 2824 bytes + test/fill-alpha.base.rgb24.ref.png | Bin 0 -> 2824 bytes + test/fill-and-stroke-alpha-add.base.argb32.ref.png | Bin 0 -> 552 bytes + test/fill-and-stroke-alpha-add.base.rgb24.ref.png | Bin 0 -> 552 bytes + test/fill-and-stroke-alpha.base.argb32.ref.png | Bin 0 -> 507 bytes + test/fill-and-stroke-alpha.base.rgb24.ref.png | Bin 0 -> 507 bytes + test/fill-and-stroke.base.argb32.ref.png | Bin 0 -> 321 bytes + test/fill-and-stroke.base.rgb24.ref.png | Bin 0 -> 293 bytes + .../fill-degenerate-sort-order.base.argb32.ref.png | Bin 0 -> 2378 bytes + test/fill-degenerate-sort-order.base.rgb24.ref.png | Bin 0 -> 2041 bytes + test/fill-empty.base.argb32.ref.png | Bin 0 -> 99 bytes + test/fill-empty.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/fill-image.base.argb32.ref.png | Bin 0 -> 1455 bytes + test/fill-image.base.rgb24.ref.png | Bin 0 -> 1455 bytes + test/fill-missed-stop.base.argb32.ref.png | Bin 0 -> 447 bytes + test/fill-missed-stop.base.rgb24.ref.png | Bin 0 -> 375 bytes + test/fill-rule.base.argb32.ref.png | Bin 0 -> 1979 bytes + test/fill-rule.base.rgb24.ref.png | Bin 0 -> 1703 bytes + test/filter-bilinear-extents.base.argb32.ref.png | Bin 0 -> 1210 bytes + test/filter-bilinear-extents.base.rgb24.ref.png | Bin 0 -> 1210 bytes + test/filter-nearest-offset.base.argb32.ref.png | Bin 0 -> 201 bytes + test/filter-nearest-offset.base.rgb24.ref.png | Bin 0 -> 201 bytes + .../filter-nearest-transformed.base.argb32.ref.png | Bin 0 -> 514 bytes + test/filter-nearest-transformed.base.rgb24.ref.png | Bin 0 -> 514 bytes + test/finer-grained-fallbacks.base.argb32.ref.png | Bin 0 -> 1110 bytes + test/finer-grained-fallbacks.base.rgb24.ref.png | Bin 0 -> 856 bytes + test/font-matrix-translation.base.argb32.ref.png | Bin 0 -> 874 bytes + test/font-matrix-translation.base.rgb24.ref.png | Bin 0 -> 874 bytes + .../ft-show-glyphs-positioning.base.argb32.ref.png | Bin 0 -> 3297 bytes + test/ft-show-glyphs-positioning.base.rgb24.ref.png | Bin 0 -> 3297 bytes + test/ft-show-glyphs-table.base.argb32.ref.png | Bin 0 -> 9893 bytes + test/ft-show-glyphs-table.base.rgb24.ref.png | Bin 0 -> 9893 bytes + test/ft-text-antialias-none.base.argb32.ref.png | Bin 0 -> 295 bytes + test/ft-text-antialias-none.base.rgb24.ref.png | Bin 0 -> 295 bytes + ...-text-vertical-layout-type1.base.argb32.ref.png | Bin 0 -> 3066 bytes + ...t-text-vertical-layout-type1.base.rgb24.ref.png | Bin 0 -> 3066 bytes + ...-text-vertical-layout-type3.base.argb32.ref.png | Bin 0 -> 3597 bytes + ...t-text-vertical-layout-type3.base.rgb24.ref.png | Bin 0 -> 3597 bytes + test/get-group-target.base.argb32.ref.png | Bin 0 -> 113 bytes + test/get-group-target.base.rgb24.ref.png | Bin 0 -> 113 bytes + test/glyph-cache-pressure.base.argb32.ref.png | Bin 0 -> 2863 bytes + test/glyph-cache-pressure.base.rgb24.ref.png | Bin 0 -> 2863 bytes + test/gradient-alpha.base.argb32.ref.png | Bin 0 -> 125 bytes + test/gradient-alpha.base.rgb24.ref.png | Bin 0 -> 119 bytes + test/gradient-constant-alpha.base.argb32.ref.png | Bin 0 -> 111 bytes + test/gradient-constant-alpha.base.rgb24.ref.png | Bin 0 -> 106 bytes + test/gradient-zero-stops-mask.base.argb32.ref.png | Bin 0 -> 86 bytes + test/gradient-zero-stops-mask.base.rgb24.ref.png | Bin 0 -> 86 bytes + test/gradient-zero-stops.base.argb32.ref.png | Bin 0 -> 86 bytes + test/gradient-zero-stops.base.rgb24.ref.png | Bin 0 -> 86 bytes + test/group-clip.base.argb32.ref.png | Bin 0 -> 191 bytes + test/group-clip.base.rgb24.ref.png | Bin 0 -> 191 bytes + test/group-paint.base.argb32.ref.png | Bin 0 -> 95 bytes + test/group-paint.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/group-unaligned.base.argb32.ref.png | Bin 0 -> 468 bytes + test/group-unaligned.base.rgb24.ref.png | Bin 0 -> 468 bytes + test/halo-transform.base.argb32.ref.png | Bin 0 -> 15118 bytes + test/halo-transform.base.rgb24.ref.png | Bin 0 -> 15118 bytes + test/halo.base.argb32.ref.png | Bin 0 -> 8800 bytes + test/halo.base.rgb24.ref.png | Bin 0 -> 8800 bytes + test/hatchings.base.argb32.ref.png | Bin 0 -> 90611 bytes + test/hatchings.base.rgb24.ref.png | Bin 0 -> 90611 bytes + test/horizontal-clip.base.argb32.ref.png | Bin 0 -> 113 bytes + test/horizontal-clip.base.rgb24.ref.png | Bin 0 -> 113 bytes + test/huge-linear.base.argb32.ref.png | Bin 0 -> 1600 bytes + test/huge-linear.base.rgb24.ref.png | Bin 0 -> 1600 bytes + test/huge-radial.base.argb32.ref.png | Bin 0 -> 41702 bytes + test/huge-radial.base.rgb24.ref.png | Bin 0 -> 41702 bytes + test/image-bug-710072-aligned.base.argb32.ref.png | Bin 0 -> 151 bytes + test/image-bug-710072-aligned.base.rgb24.ref.png | Bin 0 -> 151 bytes + .../image-bug-710072-unaligned.base.argb32.ref.png | Bin 0 -> 219 bytes + test/image-bug-710072-unaligned.base.rgb24.ref.png | Bin 0 -> 219 bytes + test/image-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/image-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/implicit-close.base.argb32.ref.png | Bin 0 -> 251 bytes + test/implicit-close.base.rgb24.ref.png | Bin 0 -> 251 bytes + test/infinite-join.base.argb32.ref.png | Bin 0 -> 160 bytes + test/infinite-join.base.rgb24.ref.png | Bin 0 -> 160 bytes + test/inverse-text.base.argb32.ref.png | Bin 0 -> 2166 bytes + test/inverse-text.base.rgb24.ref.png | Bin 0 -> 2166 bytes + test/joins-loop.base.argb32.ref.png | Bin 0 -> 4202 bytes + test/joins-loop.base.rgb24.ref.png | Bin 0 -> 4202 bytes + test/joins-retrace.base.argb32.ref.png | Bin 0 -> 4667 bytes + test/joins-retrace.base.rgb24.ref.png | Bin 0 -> 4667 bytes + test/joins-star.base.argb32.ref.png | Bin 0 -> 3583 bytes + test/joins-star.base.rgb24.ref.png | Bin 0 -> 3583 bytes + test/joins.base.argb32.ref.png | Bin 0 -> 5684 bytes + test/joins.base.rgb24.ref.png | Bin 0 -> 5684 bytes + test/large-clip.base.argb32.ref.png | Bin 0 -> 305 bytes + test/large-clip.base.rgb24.ref.png | Bin 0 -> 305 bytes + test/large-font.base.argb32.ref.png | Bin 0 -> 6117 bytes + test/large-font.base.rgb24.ref.png | Bin 0 -> 6117 bytes + test/large-source-roi.base.argb32.ref.png | Bin 0 -> 93 bytes + test/large-source-roi.base.rgb24.ref.png | Bin 0 -> 93 bytes + test/large-source.base.argb32.ref.png | Bin 0 -> 112 bytes + test/large-source.base.rgb24.ref.png | Bin 0 -> 112 bytes + .../large-twin-antialias-mixed.base.argb32.ref.png | Bin 0 -> 10740 bytes + test/large-twin-antialias-mixed.base.rgb24.ref.png | Bin 0 -> 10740 bytes + test/leaky-dash.base.argb32.ref.png | Bin 0 -> 197 bytes + test/leaky-dash.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/leaky-dashed-rectangle.base.argb32.ref.png | Bin 0 -> 345 bytes + test/leaky-dashed-rectangle.base.rgb24.ref.png | Bin 0 -> 345 bytes + test/leaky-dashed-stroke.base.argb32.ref.png | Bin 0 -> 9303 bytes + test/leaky-dashed-stroke.base.rgb24.ref.png | Bin 0 -> 9303 bytes + test/leaky-polygon.base.argb32.ref.png | Bin 0 -> 325 bytes + test/leaky-polygon.base.rgb24.ref.png | Bin 0 -> 325 bytes + test/line-width-overlap-dashed.base.argb32.ref.png | Bin 0 -> 397 bytes + test/line-width-overlap-dashed.base.rgb24.ref.png | Bin 0 -> 397 bytes + .../line-width-overlap-flipped.base.argb32.ref.png | Bin 0 -> 324 bytes + test/line-width-overlap-flipped.base.rgb24.ref.png | Bin 0 -> 324 bytes + .../line-width-overlap-flopped.base.argb32.ref.png | Bin 0 -> 324 bytes + test/line-width-overlap-flopped.base.rgb24.ref.png | Bin 0 -> 324 bytes + test/line-width-overlap-offset.base.argb32.ref.png | Bin 0 -> 365 bytes + test/line-width-overlap-offset.base.rgb24.ref.png | Bin 0 -> 365 bytes + .../line-width-overlap-rotated.base.argb32.ref.png | Bin 0 -> 628 bytes + test/line-width-overlap-rotated.base.rgb24.ref.png | Bin 0 -> 628 bytes + test/line-width-overlap.base.argb32.ref.png | Bin 0 -> 324 bytes + test/line-width-overlap.base.rgb24.ref.png | Bin 0 -> 324 bytes + test/line-width-scale.base.argb32.ref.png | Bin 0 -> 5692 bytes + test/line-width-scale.base.rgb24.ref.png | Bin 0 -> 5692 bytes + test/line-width-tolerance.base.argb32.ref.png | Bin 0 -> 163 bytes + test/line-width-tolerance.base.rgb24.ref.png | Bin 0 -> 163 bytes + test/line-width.base.argb32.ref.png | Bin 0 -> 180 bytes + test/line-width.base.rgb24.ref.png | Bin 0 -> 180 bytes + test/linear-gradient-extend.base.argb32.ref.png | Bin 0 -> 371 bytes + test/linear-gradient-extend.base.rgb24.ref.png | Bin 0 -> 371 bytes + test/linear-gradient-large.base.argb32.ref.png | Bin 0 -> 4076 bytes + test/linear-gradient-large.base.rgb24.ref.png | Bin 0 -> 4076 bytes + test/linear-gradient-one-stop.base.argb32.ref.png | Bin 0 -> 225 bytes + test/linear-gradient-one-stop.base.rgb24.ref.png | Bin 0 -> 174 bytes + test/linear-gradient-reflect.base.argb32.ref.png | Bin 0 -> 185 bytes + test/linear-gradient-reflect.base.rgb24.ref.png | Bin 0 -> 185 bytes + test/linear-gradient-subset.base.argb32.ref.png | Bin 0 -> 773 bytes + test/linear-gradient-subset.base.rgb24.ref.png | Bin 0 -> 773 bytes + test/linear-gradient.base.argb32.ref.png | Bin 0 -> 914 bytes + test/linear-gradient.base.rgb24.ref.png | Bin 0 -> 914 bytes + test/linear-step-function.base.argb32.ref.png | Bin 0 -> 118 bytes + test/linear-step-function.base.rgb24.ref.png | Bin 0 -> 118 bytes + test/linear-uniform.base.argb32.ref.png | Bin 0 -> 128 bytes + test/linear-uniform.base.rgb24.ref.png | Bin 0 -> 128 bytes + test/long-dashed-lines.base.argb32.ref.png | Bin 0 -> 2071 bytes + test/long-dashed-lines.base.rgb24.ref.png | Bin 0 -> 2071 bytes + test/long-lines.base.argb32.ref.png | Bin 0 -> 201 bytes + test/long-lines.base.rgb24.ref.png | Bin 0 -> 201 bytes + test/map-all-to-image.base.argb32.ref.png | Bin 0 -> 86 bytes + test/map-all-to-image.base.rgb24.ref.png | Bin 0 -> 86 bytes + test/map-bit-to-image.base.argb32.ref.png | Bin 0 -> 103 bytes + test/map-bit-to-image.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/map-to-image-fill.base.argb32.ref.png | Bin 0 -> 103 bytes + test/map-to-image-fill.base.rgb24.ref.png | Bin 0 -> 103 bytes + test/mask-alpha.base.argb32.ref.png | Bin 0 -> 627 bytes + test/mask-alpha.base.rgb24.ref.png | Bin 0 -> 588 bytes + test/mask-ctm.base.argb32.ref.png | Bin 0 -> 110 bytes + test/mask-ctm.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/mask-surface-ctm.base.argb32.ref.png | Bin 0 -> 110 bytes + test/mask-surface-ctm.base.rgb24.ref.png | Bin 0 -> 105 bytes + test/mask-transformed-image.base.argb32.ref.png | Bin 0 -> 3812 bytes + test/mask-transformed-image.base.rgb24.ref.png | Bin 0 -> 3812 bytes + test/mask-transformed-similar.base.argb32.ref.png | Bin 0 -> 3812 bytes + test/mask-transformed-similar.base.rgb24.ref.png | Bin 0 -> 3812 bytes + test/mask.base.argb32.ref.png | Bin 0 -> 8451 bytes + test/mask.base.rgb24.ref.png | Bin 0 -> 7058 bytes + test/mesh-pattern-accuracy.base.argb32.ref.png | Bin 0 -> 8086 bytes + test/mesh-pattern-accuracy.base.rgb24.ref.png | Bin 0 -> 8086 bytes + test/mesh-pattern-conical.base.argb32.ref.png | Bin 0 -> 8655 bytes + test/mesh-pattern-conical.base.rgb24.ref.png | Bin 0 -> 8655 bytes + ...mesh-pattern-control-points.base.argb32.ref.png | Bin 0 -> 10665 bytes + .../mesh-pattern-control-points.base.rgb24.ref.png | Bin 0 -> 10665 bytes + test/mesh-pattern-fold.base.argb32.ref.png | Bin 0 -> 52980 bytes + test/mesh-pattern-fold.base.rgb24.ref.png | Bin 0 -> 52980 bytes + test/mesh-pattern-overlap.base.argb32.ref.png | Bin 0 -> 9129 bytes + test/mesh-pattern-overlap.base.rgb24.ref.png | Bin 0 -> 9129 bytes + test/mesh-pattern-transformed.base.argb32.ref.png | Bin 0 -> 14463 bytes + test/mesh-pattern-transformed.base.rgb24.ref.png | Bin 0 -> 14463 bytes + test/mesh-pattern.base.argb32.ref.png | Bin 0 -> 19566 bytes + test/mesh-pattern.base.rgb24.ref.png | Bin 0 -> 19566 bytes + test/mime-data.base.argb32.ref.png | Bin 0 -> 185 bytes + test/mime-data.base.rgb24.ref.png | Bin 0 -> 185 bytes + test/mime-surface.base.argb32.ref.png | Bin 0 -> 1209 bytes + test/mime-surface.base.rgb24.ref.png | Bin 0 -> 1209 bytes + test/miter-precision.base.argb32.ref.png | Bin 0 -> 818 bytes + test/miter-precision.base.rgb24.ref.png | Bin 0 -> 818 bytes + test/move-to-show-surface.base.argb32.ref.png | Bin 0 -> 96 bytes + test/move-to-show-surface.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/new-sub-path.base.argb32.ref.png | Bin 0 -> 415 bytes + test/new-sub-path.base.rgb24.ref.png | Bin 0 -> 378 bytes + test/nil-surface.base.argb32.ref.png | Bin 0 -> 88 bytes + test/nil-surface.base.rgb24.ref.png | Bin 0 -> 87 bytes + test/operator-alpha-alpha.base.argb32.ref.png | Bin 0 -> 3441 bytes + test/operator-alpha-alpha.base.rgb24.ref.png | Bin 0 -> 3441 bytes + test/operator-alpha.base.argb32.ref.png | Bin 0 -> 280 bytes + test/operator-alpha.base.rgb24.ref.png | Bin 0 -> 205 bytes + test/operator-clear.base.argb32.ref.png | Bin 0 -> 1070 bytes + test/operator-clear.base.rgb24.ref.png | Bin 0 -> 950 bytes + test/operator-source.base.argb32.ref.png | Bin 0 -> 5630 bytes + test/operator-source.base.rgb24.ref.png | Bin 0 -> 3979 bytes + test/operator.base.argb32.ref.png | Bin 0 -> 238 bytes + test/operator.base.rgb24.ref.png | Bin 0 -> 189 bytes + test/over-above-source.base.argb32.ref.png | Bin 0 -> 533 bytes + test/over-above-source.base.rgb24.ref.png | Bin 0 -> 450 bytes + test/over-around-source.base.argb32.ref.png | Bin 0 -> 610 bytes + test/over-around-source.base.rgb24.ref.png | Bin 0 -> 492 bytes + test/over-below-source.base.argb32.ref.png | Bin 0 -> 436 bytes + test/over-below-source.base.rgb24.ref.png | Bin 0 -> 378 bytes + test/over-between-source.base.argb32.ref.png | Bin 0 -> 578 bytes + test/over-between-source.base.rgb24.ref.png | Bin 0 -> 461 bytes + test/overlapping-boxes.base.argb32.ref.png | Bin 0 -> 216 bytes + test/overlapping-boxes.base.rgb24.ref.png | Bin 0 -> 204 bytes + test/overlapping-dash-caps.base.argb32.ref.png | Bin 0 -> 3952 bytes + test/overlapping-dash-caps.base.rgb24.ref.png | Bin 0 -> 3952 bytes + test/overlapping-glyphs.base.argb32.ref.png | Bin 0 -> 2684 bytes + test/overlapping-glyphs.base.rgb24.ref.png | Bin 0 -> 1647 bytes + test/paint-clip-fill-aa.base.argb32.ref.png | Bin 0 -> 327 bytes + test/paint-clip-fill-aa.base.rgb24.ref.png | Bin 0 -> 327 bytes + test/paint-clip-fill-mono.base.argb32.ref.png | Bin 0 -> 327 bytes + test/paint-clip-fill-mono.base.rgb24.ref.png | Bin 0 -> 327 bytes + test/paint-repeat.base.argb32.ref.png | Bin 0 -> 122 bytes + test/paint-repeat.base.rgb24.ref.png | Bin 0 -> 122 bytes + test/paint-source-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes + test/paint-source-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes + .../paint-with-alpha-clip-mask.base.argb32.ref.png | Bin 0 -> 305 bytes + test/paint-with-alpha-clip-mask.base.rgb24.ref.png | Bin 0 -> 305 bytes + test/paint-with-alpha-clip.base.argb32.ref.png | Bin 0 -> 303 bytes + test/paint-with-alpha-clip.base.rgb24.ref.png | Bin 0 -> 303 bytes + ...paint-with-alpha-solid-clip.base.argb32.ref.png | Bin 0 -> 266 bytes + .../paint-with-alpha-solid-clip.base.rgb24.ref.png | Bin 0 -> 266 bytes + test/paint-with-alpha.base.argb32.ref.png | Bin 0 -> 224 bytes + test/paint-with-alpha.base.rgb24.ref.png | Bin 0 -> 224 bytes + test/paint.base.argb32.ref.png | Bin 0 -> 93 bytes + test/paint.base.rgb24.ref.png | Bin 0 -> 93 bytes + test/partial-clip-text-bottom.base.argb32.ref.png | Bin 0 -> 259 bytes + test/partial-clip-text-bottom.base.rgb24.ref.png | Bin 0 -> 259 bytes + test/partial-clip-text-left.base.argb32.ref.png | Bin 0 -> 293 bytes + test/partial-clip-text-left.base.rgb24.ref.png | Bin 0 -> 293 bytes + test/partial-clip-text-right.base.argb32.ref.png | Bin 0 -> 155 bytes + test/partial-clip-text-right.base.rgb24.ref.png | Bin 0 -> 155 bytes + test/partial-clip-text-top.base.argb32.ref.png | Bin 0 -> 173 bytes + test/partial-clip-text-top.base.rgb24.ref.png | Bin 0 -> 173 bytes + ...ial-coverage-half-reference.base.argb32.ref.png | Bin 0 -> 189 bytes + ...tial-coverage-half-reference.base.rgb24.ref.png | Bin 0 -> 189 bytes + .../partial-coverage-reference.base.argb32.ref.png | Bin 0 -> 202 bytes + test/partial-coverage-reference.base.rgb24.ref.png | Bin 0 -> 202 bytes + ...age-three-quarter-reference.base.argb32.ref.png | Bin 0 -> 186 bytes + ...rage-three-quarter-reference.base.rgb24.ref.png | Bin 0 -> 186 bytes + test/path-append.base.argb32.ref.png | Bin 0 -> 6463 bytes + test/path-append.base.rgb24.ref.png | Bin 0 -> 6463 bytes + test/path-stroke-twice.base.argb32.ref.png | Bin 0 -> 205 bytes + test/path-stroke-twice.base.rgb24.ref.png | Bin 0 -> 205 bytes + test/pattern-getters.base.argb32.ref.png | Bin 0 -> 87 bytes + test/pattern-getters.base.rgb24.ref.png | Bin 0 -> 87 bytes + test/pdf-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/pdf-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/pixman-rotate.base.argb32.ref.png | Bin 0 -> 260 bytes + test/pixman-rotate.base.rgb24.ref.png | Bin 0 -> 225 bytes + test/ps-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/ps-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/pthread-same-source.base.argb32.ref.png | Bin 0 -> 1000 bytes + test/pthread-same-source.base.rgb24.ref.png | Bin 0 -> 1000 bytes + test/pthread-show-text.base.argb32.ref.png | Bin 0 -> 29759 bytes + test/pthread-show-text.base.rgb24.ref.png | Bin 0 -> 29759 bytes + test/pthread-similar.base.argb32.ref.png | Bin 0 -> 170 bytes + test/pthread-similar.base.rgb24.ref.png | Bin 0 -> 170 bytes + test/push-group-color.base.argb32.ref.png | Bin 0 -> 2902 bytes + test/push-group-color.base.rgb24.ref.png | Bin 0 -> 2902 bytes + test/push-group-path-offset.base.argb32.ref.png | Bin 0 -> 186 bytes + test/push-group-path-offset.base.rgb24.ref.png | Bin 0 -> 186 bytes + test/push-group.base.argb32.ref.png | Bin 0 -> 3110 bytes + test/push-group.base.rgb24.ref.png | Bin 0 -> 2947 bytes + test/radial-gradient-extend.base.argb32.ref.png | Bin 0 -> 466 bytes + test/radial-gradient-extend.base.rgb24.ref.png | Bin 0 -> 466 bytes + ...radial-gradient-mask-source.base.argb32.ref.png | Bin 0 -> 145713 bytes + .../radial-gradient-mask-source.base.rgb24.ref.png | Bin 0 -> 150945 bytes + test/radial-gradient-mask.base.argb32.ref.png | Bin 0 -> 286065 bytes + test/radial-gradient-mask.base.rgb24.ref.png | Bin 0 -> 286065 bytes + test/radial-gradient-one-stop.base.argb32.ref.png | Bin 0 -> 6306 bytes + test/radial-gradient-one-stop.base.rgb24.ref.png | Bin 0 -> 6306 bytes + test/radial-gradient-source.base.argb32.ref.png | Bin 0 -> 408848 bytes + test/radial-gradient-source.base.rgb24.ref.png | Bin 0 -> 263908 bytes + test/radial-gradient.base.argb32.ref.png | Bin 0 -> 382283 bytes + test/radial-gradient.base.rgb24.ref.png | Bin 0 -> 382283 bytes + test/random-clip.base.argb32.ref.png | Bin 0 -> 308138 bytes + test/random-clip.base.rgb24.ref.png | Bin 0 -> 308138 bytes + ...dom-intersections-curves-eo.base.argb32.ref.png | Bin 0 -> 244476 bytes + ...ndom-intersections-curves-eo.base.rgb24.ref.png | Bin 0 -> 244476 bytes + ...dom-intersections-curves-nz.base.argb32.ref.png | Bin 0 -> 263669 bytes + ...ndom-intersections-curves-nz.base.rgb24.ref.png | Bin 0 -> 263669 bytes + test/random-intersections-eo.base.argb32.ref.png | Bin 0 -> 134729 bytes + test/random-intersections-eo.base.rgb24.ref.png | Bin 0 -> 134729 bytes + ...andom-intersections-nonzero.base.argb32.ref.png | Bin 0 -> 141616 bytes + ...random-intersections-nonzero.base.rgb24.ref.png | Bin 0 -> 141616 bytes + ...cording-surface-extend-none.base.argb32.ref.png | Bin 0 -> 3055 bytes + ...ecording-surface-extend-none.base.rgb24.ref.png | Bin 0 -> 3124 bytes + ...ecording-surface-extend-pad.base.argb32.ref.png | Bin 0 -> 10832 bytes + ...recording-surface-extend-pad.base.rgb24.ref.png | Bin 0 -> 12496 bytes + ...ding-surface-extend-reflect.base.argb32.ref.png | Bin 0 -> 23617 bytes + ...rding-surface-extend-reflect.base.rgb24.ref.png | Bin 0 -> 24139 bytes + ...rding-surface-extend-repeat.base.argb32.ref.png | Bin 0 -> 24112 bytes + ...ording-surface-extend-repeat.base.rgb24.ref.png | Bin 0 -> 24029 bytes + test/recording-surface-over.base.argb32.ref.png | Bin 0 -> 3055 bytes + test/recording-surface-over.base.rgb24.ref.png | Bin 0 -> 3124 bytes + test/recording-surface-source.base.argb32.ref.png | Bin 0 -> 3049 bytes + test/recording-surface-source.base.rgb24.ref.png | Bin 0 -> 3121 bytes + test/rectangle-rounding-error.base.argb32.ref.png | Bin 0 -> 212 bytes + test/rectangle-rounding-error.base.rgb24.ref.png | Bin 0 -> 212 bytes + test/rectilinear-dash.base.argb32.ref.png | Bin 0 -> 291 bytes + test/rectilinear-dash.base.rgb24.ref.png | Bin 0 -> 291 bytes + test/rectilinear-fill.base.argb32.ref.png | Bin 0 -> 151 bytes + test/rectilinear-fill.base.rgb24.ref.png | Bin 0 -> 151 bytes + test/rectilinear-grid.base.argb32.ref.png | Bin 0 -> 610 bytes + test/rectilinear-grid.base.rgb24.ref.png | Bin 0 -> 610 bytes + test/rectilinear-miter-limit.base.argb32.ref.png | Bin 0 -> 145 bytes + test/rectilinear-miter-limit.base.rgb24.ref.png | Bin 0 -> 145 bytes + test/rectilinear-stroke.base.argb32.ref.png | Bin 0 -> 172 bytes + test/rectilinear-stroke.base.rgb24.ref.png | Bin 0 -> 172 bytes + test/reflected-stroke.base.argb32.ref.png | Bin 0 -> 4994 bytes + test/reflected-stroke.base.rgb24.ref.png | Bin 0 -> 4994 bytes + test/rel-path.base.argb32.ref.png | Bin 0 -> 189 bytes + test/rel-path.base.rgb24.ref.png | Bin 0 -> 206 bytes + test/rgb24-ignore-alpha.base.argb32.ref.png | Bin 0 -> 97 bytes + test/rgb24-ignore-alpha.base.rgb24.ref.png | Bin 0 -> 97 bytes + ...te-clip-image-surface-paint.base.argb32.ref.png | Bin 0 -> 303 bytes + ...ate-clip-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 303 bytes + .../rotate-image-surface-paint.base.argb32.ref.png | Bin 0 -> 220 bytes + test/rotate-image-surface-paint.base.rgb24.ref.png | Bin 0 -> 220 bytes + test/rotated-clip.base.argb32.ref.png | Bin 0 -> 3922 bytes + test/rotated-clip.base.rgb24.ref.png | Bin 0 -> 3922 bytes + test/rounded-rectangle-fill.base.argb32.ref.png | Bin 0 -> 890 bytes + test/rounded-rectangle-fill.base.rgb24.ref.png | Bin 0 -> 890 bytes + test/rounded-rectangle-stroke.base.argb32.ref.png | Bin 0 -> 1060 bytes + test/rounded-rectangle-stroke.base.rgb24.ref.png | Bin 0 -> 1060 bytes + ...e-down-source-surface-paint.base.argb32.ref.png | Bin 0 -> 96 bytes + ...le-down-source-surface-paint.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/scale-offset-image.base.argb32.ref.png | Bin 0 -> 9048 bytes + test/scale-offset-image.base.rgb24.ref.png | Bin 0 -> 9048 bytes + test/scale-offset-similar.base.argb32.ref.png | Bin 0 -> 9048 bytes + test/scale-offset-similar.base.rgb24.ref.png | Bin 0 -> 9048 bytes + .../scale-source-surface-paint.base.argb32.ref.png | Bin 0 -> 128 bytes + test/scale-source-surface-paint.base.rgb24.ref.png | Bin 0 -> 117 bytes + test/select-font-face.base.argb32.ref.png | Bin 0 -> 2245 bytes + test/select-font-face.base.rgb24.ref.png | Bin 0 -> 2245 bytes + test/self-copy-overlap.base.argb32.ref.png | Bin 0 -> 1140 bytes + test/self-copy-overlap.base.rgb24.ref.png | Bin 0 -> 213 bytes + test/self-copy.base.argb32.ref.png | Bin 0 -> 257 bytes + test/self-copy.base.rgb24.ref.png | Bin 0 -> 257 bytes + test/self-intersecting.base.argb32.ref.png | Bin 0 -> 208 bytes + test/self-intersecting.base.rgb24.ref.png | Bin 0 -> 208 bytes + test/set-source.base.argb32.ref.png | Bin 0 -> 101 bytes + test/set-source.base.rgb24.ref.png | Bin 0 -> 101 bytes + test/shape-general-convex.base.argb32.ref.png | Bin 0 -> 2532 bytes + test/shape-general-convex.base.rgb24.ref.png | Bin 0 -> 2532 bytes + test/shape-sierpinski.base.argb32.ref.png | Bin 0 -> 54485 bytes + test/shape-sierpinski.base.rgb24.ref.png | Bin 0 -> 54485 bytes + test/show-glyphs-advance.base.argb32.ref.png | Bin 0 -> 1395 bytes + test/show-glyphs-advance.base.rgb24.ref.png | Bin 0 -> 1395 bytes + test/show-glyphs-many.base.argb32.ref.png | Bin 0 -> 96 bytes + test/show-glyphs-many.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/show-text-current-point.base.argb32.ref.png | Bin 0 -> 2185 bytes + test/show-text-current-point.base.rgb24.ref.png | Bin 0 -> 2185 bytes + test/skew-extreme.base.argb32.ref.png | Bin 0 -> 935 bytes + test/skew-extreme.base.rgb24.ref.png | Bin 0 -> 935 bytes + test/smask-fill.base.argb32.ref.png | Bin 0 -> 1170 bytes + test/smask-fill.base.rgb24.ref.png | Bin 0 -> 1170 bytes + test/smask-image-mask.base.argb32.ref.png | Bin 0 -> 619 bytes + test/smask-image-mask.base.rgb24.ref.png | Bin 0 -> 619 bytes + test/smask-mask.base.argb32.ref.png | Bin 0 -> 2353 bytes + test/smask-mask.base.rgb24.ref.png | Bin 0 -> 2353 bytes + test/smask-paint.base.argb32.ref.png | Bin 0 -> 2469 bytes + test/smask-paint.base.rgb24.ref.png | Bin 0 -> 2469 bytes + test/smask-stroke.base.argb32.ref.png | Bin 0 -> 1703 bytes + test/smask-stroke.base.rgb24.ref.png | Bin 0 -> 1703 bytes + test/smask-text.base.argb32.ref.png | Bin 0 -> 1624 bytes + test/smask-text.base.rgb24.ref.png | Bin 0 -> 1624 bytes + test/smask.base.argb32.ref.png | Bin 0 -> 3404 bytes + test/smask.base.rgb24.ref.png | Bin 0 -> 3404 bytes + .../solid-pattern-cache-stress.base.argb32.ref.png | Bin 0 -> 87 bytes + test/solid-pattern-cache-stress.base.rgb24.ref.png | Bin 0 -> 87 bytes + test/source-clip-scale.base.argb32.ref.png | Bin 0 -> 136 bytes + test/source-clip-scale.base.rgb24.ref.png | Bin 0 -> 136 bytes + test/source-clip.base.argb32.ref.png | Bin 0 -> 111 bytes + test/source-clip.base.rgb24.ref.png | Bin 0 -> 111 bytes + .../source-surface-scale-paint.base.argb32.ref.png | Bin 0 -> 120 bytes + test/source-surface-scale-paint.base.rgb24.ref.png | Bin 0 -> 114 bytes + test/spline-decomposition.base.argb32.ref.png | Bin 0 -> 19075 bytes + test/spline-decomposition.base.rgb24.ref.png | Bin 0 -> 19075 bytes + test/stroke-ctm-caps.base.argb32.ref.png | Bin 0 -> 873 bytes + test/stroke-ctm-caps.base.rgb24.ref.png | Bin 0 -> 873 bytes + test/stroke-image.base.argb32.ref.png | Bin 0 -> 1458 bytes + test/stroke-image.base.rgb24.ref.png | Bin 0 -> 1458 bytes + test/stroke-open-box.base.argb32.ref.png | Bin 0 -> 148 bytes + test/stroke-open-box.base.rgb24.ref.png | Bin 0 -> 148 bytes + test/subsurface-image-repeat.base.argb32.ref.png | Bin 0 -> 915 bytes + test/subsurface-image-repeat.base.rgb24.ref.png | Bin 0 -> 915 bytes + test/subsurface-modify-child.base.argb32.ref.png | Bin 0 -> 197 bytes + test/subsurface-modify-child.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/subsurface-modify-parent.base.argb32.ref.png | Bin 0 -> 197 bytes + test/subsurface-modify-parent.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/subsurface-outside-target.base.argb32.ref.png | Bin 0 -> 1149 bytes + test/subsurface-outside-target.base.rgb24.ref.png | Bin 0 -> 1005 bytes + test/subsurface-pad.base.argb32.ref.png | Bin 0 -> 181 bytes + test/subsurface-pad.base.rgb24.ref.png | Bin 0 -> 181 bytes + test/subsurface-reflect.base.argb32.ref.png | Bin 0 -> 210 bytes + test/subsurface-reflect.base.rgb24.ref.png | Bin 0 -> 210 bytes + test/subsurface-repeat.base.argb32.ref.png | Bin 0 -> 197 bytes + test/subsurface-repeat.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/subsurface-similar-repeat.base.argb32.ref.png | Bin 0 -> 197 bytes + test/subsurface-similar-repeat.base.rgb24.ref.png | Bin 0 -> 197 bytes + test/subsurface.base.argb32.ref.png | Bin 0 -> 1281 bytes + test/subsurface.base.rgb24.ref.png | Bin 0 -> 1281 bytes + ...face-pattern-big-scale-down.base.argb32.ref.png | Bin 0 -> 191 bytes + ...rface-pattern-big-scale-down.base.rgb24.ref.png | Bin 0 -> 191 bytes + test/surface-pattern-operator.base.argb32.ref.png | Bin 0 -> 5184 bytes + test/surface-pattern-operator.base.rgb24.ref.png | Bin 0 -> 1913 bytes + ...tern-scale-down-extend-none.base.argb32.ref.png | Bin 0 -> 329 bytes + ...ttern-scale-down-extend-none.base.rgb24.ref.png | Bin 0 -> 329 bytes + ...ttern-scale-down-extend-pad.base.argb32.ref.png | Bin 0 -> 320 bytes + ...attern-scale-down-extend-pad.base.rgb24.ref.png | Bin 0 -> 320 bytes + ...n-scale-down-extend-reflect.base.argb32.ref.png | Bin 0 -> 328 bytes + ...rn-scale-down-extend-reflect.base.rgb24.ref.png | Bin 0 -> 328 bytes + ...rn-scale-down-extend-repeat.base.argb32.ref.png | Bin 0 -> 330 bytes + ...ern-scale-down-extend-repeat.base.rgb24.ref.png | Bin 0 -> 330 bytes + .../surface-pattern-scale-down.base.argb32.ref.png | Bin 0 -> 1326 bytes + test/surface-pattern-scale-down.base.rgb24.ref.png | Bin 0 -> 1326 bytes + test/surface-pattern-scale-up.base.argb32.ref.png | Bin 0 -> 4020 bytes + test/surface-pattern-scale-up.base.rgb24.ref.png | Bin 0 -> 4020 bytes + test/surface-pattern.base.argb32.ref.png | Bin 0 -> 11088 bytes + test/surface-pattern.base.rgb24.ref.png | Bin 0 -> 11088 bytes + test/svg-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/svg-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/text-antialias-gray.base.argb32.ref.png | Bin 0 -> 975 bytes + test/text-antialias-gray.base.rgb24.ref.png | Bin 0 -> 975 bytes + test/text-antialias-none.base.argb32.ref.png | Bin 0 -> 265 bytes + test/text-antialias-none.base.rgb24.ref.png | Bin 0 -> 265 bytes + test/text-antialias-subpixel.base.argb32.xfail.png | Bin 0 -> 925 bytes + test/text-antialias-subpixel.base.rgb24.xfail.png | Bin 0 -> 925 bytes + test/text-glyph-range.base.argb32.ref.png | Bin 0 -> 1991 bytes + test/text-glyph-range.base.rgb24.ref.png | Bin 0 -> 1991 bytes + test/text-pattern.base.argb32.ref.png | Bin 0 -> 1695 bytes + test/text-pattern.base.rgb24.ref.png | Bin 0 -> 1397 bytes + test/text-rotate.base.argb32.ref.png | Bin 0 -> 16599 bytes + test/text-rotate.base.rgb24.ref.png | Bin 0 -> 16599 bytes + test/text-transform.base.argb32.ref.png | Bin 0 -> 5579 bytes + test/text-transform.base.rgb24.ref.png | Bin 0 -> 5579 bytes + test/tiger.base.argb32.ref.png | Bin 0 -> 94370 bytes + test/tiger.base.rgb24.ref.png | Bin 0 -> 94370 bytes + test/tighten-bounds.base.argb32.ref.png | Bin 0 -> 8457 bytes + test/tighten-bounds.base.rgb24.ref.png | Bin 0 -> 7832 bytes + test/transforms.base.argb32.ref.png | Bin 0 -> 299 bytes + test/transforms.base.rgb24.ref.png | Bin 0 -> 299 bytes + test/translate-show-surface.base.argb32.ref.png | Bin 0 -> 96 bytes + test/translate-show-surface.base.rgb24.ref.png | Bin 0 -> 96 bytes + test/trap-clip.base.argb32.ref.png | Bin 0 -> 5753 bytes + test/trap-clip.base.rgb24.ref.png | Bin 0 -> 5379 bytes + test/twin-antialias-gray.base.argb32.ref.png | Bin 0 -> 4053 bytes + test/twin-antialias-gray.base.rgb24.ref.png | Bin 0 -> 4053 bytes + test/twin-antialias-mixed.base.argb32.ref.png | Bin 0 -> 1639 bytes + test/twin-antialias-mixed.base.rgb24.ref.png | Bin 0 -> 1639 bytes + test/twin-antialias-none.base.argb32.ref.png | Bin 0 -> 747 bytes + test/twin-antialias-none.base.rgb24.ref.png | Bin 0 -> 747 bytes + test/twin-antialias-subpixel.base.argb32.ref.png | Bin 0 -> 4053 bytes + test/twin-antialias-subpixel.base.rgb24.ref.png | Bin 0 -> 4053 bytes + test/twin.base.argb32.ref.png | Bin 0 -> 4053 bytes + test/twin.base.rgb24.ref.png | Bin 0 -> 4053 bytes + test/unaligned-box.base.argb32.ref.png | Bin 0 -> 526 bytes + test/unaligned-box.base.rgb24.ref.png | Bin 0 -> 526 bytes + test/unantialiased-shapes.base.argb32.ref.png | Bin 0 -> 3977 bytes + test/unantialiased-shapes.base.rgb24.ref.png | Bin 0 -> 3977 bytes + test/unbounded-operator.base.argb32.ref.png | Bin 0 -> 2756 bytes + test/unbounded-operator.base.rgb24.ref.png | Bin 0 -> 1289 bytes + test/unclosed-strokes.base.argb32.ref.png | Bin 0 -> 1482 bytes + test/unclosed-strokes.base.rgb24.ref.png | Bin 0 -> 1482 bytes + test/user-font-mask.base.argb32.ref.png | Bin 0 -> 5476 bytes + test/user-font-mask.base.rgb24.ref.png | Bin 0 -> 5476 bytes + test/user-font-proxy.base.argb32.ref.png | Bin 0 -> 16798 bytes + test/user-font-proxy.base.rgb24.ref.png | Bin 0 -> 16798 bytes + test/user-font-rescale.base.argb32.ref.png | Bin 0 -> 14852 bytes + test/user-font-rescale.base.rgb24.ref.png | Bin 0 -> 14852 bytes + test/user-font.base.argb32.ref.png | Bin 0 -> 5439 bytes + test/user-font.base.rgb24.ref.png | Bin 0 -> 5439 bytes + test/white-in-noop.base.argb32.ref.png | Bin 0 -> 95 bytes + test/white-in-noop.base.rgb24.ref.png | Bin 0 -> 95 bytes + test/world-map-fill.base.argb32.ref.png | Bin 0 -> 57451 bytes + test/world-map-fill.base.rgb24.ref.png | Bin 0 -> 57451 bytes + test/world-map-stroke.base.argb32.ref.png | Bin 0 -> 65217 bytes + test/world-map-stroke.base.rgb24.ref.png | Bin 0 -> 65217 bytes + test/world-map.base.argb32.ref.png | Bin 0 -> 70536 bytes + test/world-map.base.rgb24.ref.png | Bin 0 -> 70536 bytes + test/xcb-huge-image-shm.base.argb32.ref.png | Bin 0 -> 97 bytes + test/xcb-huge-image-shm.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/xcb-snapshot-assert.base.argb32.ref.png | Bin 0 -> 97 bytes + test/xcb-snapshot-assert.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/xcb-stress-cache.base.argb32.ref.png | Bin 0 -> 97 bytes + test/xcb-stress-cache.base.rgb24.ref.png | Bin 0 -> 97 bytes + test/xcb-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/xcb-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/xcomposite-projection.base.argb32.ref.png | Bin 0 -> 1112 bytes + test/xcomposite-projection.base.rgb24.ref.png | Bin 0 -> 1112 bytes + test/xlib-expose-event.base.argb32.ref.png | Bin 0 -> 40717 bytes + test/xlib-expose-event.base.rgb24.ref.png | Bin 0 -> 40717 bytes + test/xlib-surface-source.base.argb32.ref.png | Bin 0 -> 377 bytes + test/xlib-surface-source.base.rgb24.ref.png | Bin 0 -> 301 bytes + test/zero-alpha.base.argb32.ref.png | Bin 0 -> 91 bytes + test/zero-alpha.base.rgb24.ref.png | Bin 0 -> 91 bytes + test/zero-mask.base.argb32.ref.png | Bin 0 -> 402 bytes + test/zero-mask.base.rgb24.ref.png | Bin 0 -> 382 bytes + 760 files changed, 760 insertions(+), 2 deletions(-) + +commit f1ea9dd8368b77907d8cf2edf486e8c983e65731 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 11:08:04 2011 +0100 + + test: Use the trapezoid reference image for random-clip + + Oh dear it looks like we have a bug in image's polygon clipping. + + test/random-clip.ref.png | Bin 204789 -> 311369 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit ffbf6158be101553cd88eb3ad5dbcebac00a3774 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 15 10:13:40 2011 +0100 + + perf: Add an a1-pixel variant + + Just to measure the overhead and differences when switching between + antialiasing paths. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/pixel.c | 22 ++++++++++++++++++++++ + 3 files changed, 24 insertions(+) + +commit 9ab9d635cd54b36c701bed29b6029b002e9bcc36 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 23:08:19 2011 +0100 + + test: Add ref image for random-clip + + After applying geometric clip intersection, this is the acceptable + result. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/random-clip.ref.png | Bin 0 -> 204789 bytes + 2 files changed, 1 insertion(+) + +commit 8f9691f2b7e51ba1d88a879f887e4c97b069e5fa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 23:06:31 2011 +0100 + + test: Fix ref images for a1-clip-* + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/a1-clip-fill-equal.ref.png | Bin 148 -> 120 bytes + test/a1-clip-fill.ref.png | Bin 148 -> 120 bytes + test/a1-clip-paint.ref.png | Bin 148 -> 120 bytes + test/a1-clip-stroke.ref.png | Bin 148 -> 120 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 472e4515de8896abfa605fda35d6c18bfa6958d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 20:17:02 2011 +0100 + + image: fix compilation of spans with LERP + + src/cairo-image-compositor.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 872e1c87b31a1e8199ec6aa4cf5c0b0647ceb0ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 20:15:40 2011 +0100 + + skia: fix compilation + + src/skia/cairo-skia-surface.cpp | 1 - + 1 file changed, 1 deletion(-) + +commit cf71821a331f0b5243d828c66c92a26822151d03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 19:03:05 2011 +0100 + + mono: Amalgamate adjacent spans + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit db41096b38d4a9a18e534ac829d566b294576c8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 19:21:45 2011 +0100 + + perf/micro: Add the PS tiger as a measure for the antialias hints + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/tiger.c | 115 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 118 insertions(+) + +commit 9f605b0c8469db24931bd44bb7e5339fd7b902ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 18:59:32 2011 +0100 + + test: Add the PS tiger + + The classic tiger's head; a simple example of a reasonably complex shape + consisting of multiple layers. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 2 +- + test/Makefile.refs | 23 +- + test/Makefile.sources | 1 + + test/a1-tiger.ref.png | Bin 0 -> 20330 bytes + test/tiger.c | 85 ++ + test/tiger.inc | 2316 +++++++++++++++++++++++++++++++++++++++++++++++++ + test/tiger.ref.png | Bin 0 -> 71094 bytes + 7 files changed, 2422 insertions(+), 5 deletions(-) + +commit 8a80bbf78d3c3933d7a3012b26fbd2801af14031 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 19:03:59 2011 +0100 + + image: Adapt to updated pixman lerp operators + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-compositor.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit e3131242b25d2d875f1e725f74912fadc8cd43d5 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Sep 14 15:50:19 2011 +0200 + + xlib-xcb: Make this compile again + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-core-compositor.c | 4 ++++ + src/cairo-xlib-render-compositor.c | 4 ++++ + src/cairo-xlib-xcb-surface.c | 26 ++++++-------------------- + 3 files changed, 14 insertions(+), 20 deletions(-) + +commit af11d26752d73b5530f84478da7cc14a80cd9421 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Sep 3 14:09:58 2011 +0200 + + xcb: Remove some dead code + + surface->use_pixmap always had the value 0. This code is taken from cairo-xlib. + However, in cairo-xlib use_pixmap is set to 20 if XGetImage() fails. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 1 - + src/cairo-xcb-surface.c | 24 +++++++++++------------- + 2 files changed, 11 insertions(+), 14 deletions(-) + +commit cd69c8ef68496f6c6c78e375f831a81ac99c12e4 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Sep 3 14:05:44 2011 +0200 + + cairo_clip_path_t: Remove extents + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-clip-private.h | 2 -- + 1 file changed, 2 deletions(-) + +commit 7cf7ee5e299bf03f1efd100739545f66a4acc24b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 14 12:44:27 2011 +0100 + + traps: Skip compositing an empty bounded regions + + Fixes the cairo-xlib crash with tighten-bounds. (I thought I had fixed + it earlier, but I was obviously wrong.) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-traps-compositor.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit dc2ed6dca26ca97372d2d44b953a983907650168 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 13 22:25:38 2011 +0930 + + Refresh some pdf/ps ref images + + configure.ac | 5 ++--- + test/README | 8 +------- + test/a1-line-width.pdf.ref.png | Bin 0 -> 177 bytes + test/a1-line-width.ps.ref.png | Bin 0 -> 179 bytes + test/a1-mask.pdf.ref.png | Bin 0 -> 106 bytes + test/a1-mask.ps.ref.png | Bin 0 -> 106 bytes + test/caps-tails-curve.ps.ref.png | Bin 0 -> 39753 bytes + test/clip-disjoint.ps.ref.png | Bin 4680 -> 4037 bytes + test/clip-group-shapes-circles.ps.ref.png | Bin 0 -> 678 bytes + test/dash-caps-joins.ps.ref.png | Bin 3669 -> 3648 bytes + test/dash-infinite-loop.ps.ref.png | Bin 617 -> 601 bytes + test/dash-offset-negative.pdf.ref.png | Bin 0 -> 129 bytes + test/degenerate-pen.ps.ref.png | Bin 759 -> 753 bytes + test/drunkard-tails.ps.ref.png | Bin 0 -> 3780 bytes + test/extend-pad-border.pdf.ref.png | Bin 0 -> 495 bytes + test/fill-alpha-pattern.pdf.ref.png | Bin 0 -> 2945 bytes + test/fill-alpha-pattern.ps3.argb32.ref.png | Bin 4070 -> 3484 bytes + test/fill-alpha-pattern.ps3.ref.png | Bin 4380 -> 0 bytes + test/fill-alpha-pattern.ps3.rgb24.ref.png | Bin 4473 -> 0 bytes + test/fill-alpha.ps.argb32.ref.png | Bin 0 -> 2248 bytes + test/text-pattern.pdf.argb32.ref.png | Bin 1810 -> 1515 bytes + test/text-pattern.pdf.rgb24.ref.png | Bin 1559 -> 1339 bytes + test/text-pattern.ps2.argb32.ref.png | Bin 0 -> 1646 bytes + test/text-pattern.ps2.rgb24.ref.png | Bin 0 -> 1646 bytes + test/text-pattern.ps3.argb32.ref.png | Bin 966 -> 881 bytes + test/text-pattern.ps3.rgb24.ref.png | Bin 924 -> 862 bytes + test/text-transform.pdf.argb32.ref.png | Bin 0 -> 5507 bytes + test/text-transform.pdf.ref.png | Bin 5586 -> 0 bytes + test/text-transform.pdf.rgb24.ref.png | Bin 0 -> 5507 bytes + test/text-transform.ps.ref.png | Bin 3430 -> 0 bytes + test/text-transform.ps2.ref.png | Bin 0 -> 3943 bytes + test/text-transform.ps3.ref.png | Bin 0 -> 3943 bytes + 32 files changed, 3 insertions(+), 10 deletions(-) + +commit 3e655f081921c8caa0b6d2bedfbe5f6174e999a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 13 09:39:42 2011 +0100 + + traps: Send unaligned boxes as trapezoids + + According to the little fishies this performs significantly better. + As a bonus, it did not handle overlapping boxes correctly... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 2 +- + src/cairo-traps-compositor.c | 32 ++++++++++++-------------------- + 2 files changed, 13 insertions(+), 21 deletions(-) + +commit 05a73434fc5ce8157af70b4950ca9de4c6dd7a46 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 13 09:40:35 2011 +0100 + + perf/stats: Avoid overflow when summing time-squared + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-stats.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit 8218f5278e99a4f82113b6290500f0661402019e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 13 18:52:50 2011 +0930 + + ps: turn off debug + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4f2c7b8cf8cf85c485b5a41ab5bc6c589d347eaa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 12 15:49:13 2011 +0100 + + mono-scan-converter: Decrement height as we skip straight edges + + Fixes paint-clip-fill-mono. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-mono-scan-converter.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a6a48e05597e700df74384a5063f787de45a8d83 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 12 15:43:42 2011 +0100 + + test: Update ref images + + First pass after the recent turmoil in clip and antialias handling. + + perf/cairo-perf-micro.c | 6 ++++-- + test/Makefile.refs | 14 +++++++------- + test/a1-bug.ref.png | Bin 3736 -> 3220 bytes + test/a8-clear.ref.png | Bin 271 -> 272 bytes + test/aliasing.ref.png | Bin 104672 -> 76314 bytes + test/arc-looping-dash.ref.png | Bin 464 -> 348 bytes + test/big-line.ref.png | Bin 977 -> 897 bytes + test/big-little-triangle.argb32.ref.png | Bin 409 -> 408 bytes + test/big-little-triangle.rgb24.ref.png | Bin 328 -> 324 bytes + test/bug-extents.ref.png | Bin 9162 -> 6364 bytes + test/bug-seams.ref.png | Bin 1604 -> 1364 bytes + test/caps-joins-alpha.ref.png | Bin 2570 -> 2345 bytes + test/caps-joins-curve.ref.png | Bin 5725 -> 4527 bytes + test/caps-joins.ref.png | Bin 2380 -> 2621 bytes + test/caps-sub-paths.ref.png | Bin 197 -> 176 bytes + test/caps-tails-curve.ref.png | Bin 52888 -> 41476 bytes + test/caps.ref.png | Bin 1601 -> 1687 bytes + test/clear-source.ref.png | Bin 881 -> 779 bytes + test/clear.argb32.ref.png | Bin 695 -> 539 bytes + test/clear.rgb24.ref.png | Bin 618 -> 484 bytes + test/clip-disjoint-hatching.ref.png | Bin 8794 -> 4390 bytes + test/clip-disjoint.ref.png | Bin 5520 -> 3934 bytes + test/clip-fill-eo-unbounded.argb32.ref.png | Bin 3668 -> 3970 bytes + test/clip-fill-nz-unbounded.argb32.ref.png | Bin 3668 -> 3970 bytes + test/clip-fill-rule.argb32.ref.png | Bin 0 -> 371 bytes + test/clip-fill-rule.ref.png | Bin 431 -> 0 bytes + test/clip-fill-rule.rgb24.ref.png | Bin 390 -> 338 bytes + test/clip-fill.ref.png | Bin 1035 -> 836 bytes + test/clip-group-shapes-circles.ref.png | Bin 1511 -> 1180 bytes + test/clip-image.ref.png | Bin 2679 -> 2679 bytes + test/clip-intersect.ref.png | Bin 201 -> 201 bytes + test/clip-mixed-antialias.ref.png | Bin 1085 -> 981 bytes + test/clip-nesting.argb32.ref.png | Bin 0 -> 1072 bytes + test/clip-nesting.ref.png | Bin 1050 -> 0 bytes + test/clip-nesting.rgb24.ref.png | Bin 963 -> 949 bytes + test/clip-push-group.ref.png | Bin 164 -> 166 bytes + test/clip-shape.ref.png | Bin 3094 -> 2249 bytes + test/clip-stroke-unbounded.argb32.ref.png | Bin 3545 -> 3887 bytes + test/clip-stroke.ref.png | Bin 1439 -> 1207 bytes + test/clip-text.ref.png | Bin 928 -> 796 bytes + test/clip-twice.argb32.ref.png | Bin 0 -> 1077 bytes + test/clip-twice.ref.png | Bin 1342 -> 0 bytes + test/clip-twice.rgb24.ref.png | Bin 1203 -> 976 bytes + test/close-path-current-point.ref.png | Bin 1893 -> 1675 bytes + test/close-path.ref.png | Bin 312 -> 271 bytes + test/copy-path.ref.png | Bin 579 -> 513 bytes + test/dash-caps-joins.ref.png | Bin 4520 -> 4030 bytes + test/dash-curve.ref.png | Bin 41284 -> 22615 bytes + test/dash-infinite-loop.ref.png | Bin 642 -> 626 bytes + test/dash-scale.ref.png | Bin 7616 -> 6314 bytes + test/dash-state.ref.png | Bin 9389 -> 7642 bytes + test/dash-zero-length.ref.png | Bin 238 -> 232 bytes + test/dash-zero-length.rgb24.ref.png | Bin 218 -> 218 bytes + test/degenerate-arc.ref.png | Bin 646 -> 690 bytes + test/degenerate-curve-to.ref.png | Bin 276 -> 227 bytes + test/degenerate-dash.ref.png | Bin 2086 -> 1845 bytes + test/degenerate-path.argb32.ref.png | Bin 240 -> 253 bytes + test/degenerate-path.rgb24.ref.png | Bin 210 -> 212 bytes + test/degenerate-pen.ref.png | Bin 997 -> 752 bytes + test/degenerate-rel-curve-to.ref.png | Bin 270 -> 227 bytes + test/drunkard-tails.ref.png | Bin 6273 -> 3853 bytes + test/extended-blend-alpha-mask.rgb24.ref.png | Bin 4594 -> 4597 bytes + test/extended-blend-alpha.rgb24.ref.png | Bin 5743 -> 5740 bytes + test/extended-blend-solid-alpha.rgb24.ref.png | Bin 5743 -> 5740 bytes + test/extended-blend-solid.rgb24.ref.png | Bin 3772 -> 3775 bytes + test/extended-blend.rgb24.ref.png | Bin 3772 -> 3775 bytes + test/fill-alpha-pattern.ref.png | Bin 3374 -> 2962 bytes + test/fill-alpha.ref.png | Bin 2728 -> 2167 bytes + test/fill-and-stroke-alpha-add.ref.png | Bin 562 -> 536 bytes + test/fill-and-stroke-alpha.ref.png | Bin 515 -> 462 bytes + test/fill-and-stroke.argb32.ref.png | Bin 313 -> 269 bytes + test/fill-and-stroke.rgb24.ref.png | Bin 287 -> 252 bytes + test/fill-degenerate-sort-order.argb32.ref.png | Bin 0 -> 1929 bytes + test/fill-degenerate-sort-order.ref.png | Bin 2399 -> 0 bytes + test/fill-degenerate-sort-order.rgb24.ref.png | Bin 2052 -> 1689 bytes + test/fill-image.ref.png | Bin 1317 -> 972 bytes + test/fill-missed-stop.ref.png | Bin 466 -> 455 bytes + test/fill-missed-stop.rgb24.ref.png | Bin 394 -> 382 bytes + test/fill-rule.ref.png | Bin 2065 -> 1769 bytes + test/fill-rule.rgb24.ref.png | Bin 1780 -> 1591 bytes + test/finer-grained-fallbacks.argb32.ref.png | Bin 1068 -> 993 bytes + test/finer-grained-fallbacks.rgb24.ref.png | Bin 837 -> 786 bytes + test/font-matrix-translation.ref.png | Bin 1006 -> 874 bytes + test/ft-show-glyphs-positioning.ref.png | Bin 3444 -> 3297 bytes + test/ft-show-glyphs-table.ref.png | Bin 11439 -> 9893 bytes + test/ft-text-vertical-layout-type3.ref.png | Bin 3616 -> 3222 bytes + test/glyph-cache-pressure.ref.png | Bin 3223 -> 2863 bytes + test/gradient-alpha.rgb24.ref.png | Bin 142 -> 119 bytes + test/gradient-constant-alpha.rgb24.ref.png | Bin 116 -> 106 bytes + test/group-unaligned.ref.png | Bin 434 -> 325 bytes + test/halo-transform.ref.png | Bin 15086 -> 11313 bytes + test/halo.ref.png | Bin 8839 -> 7297 bytes + test/hatchings.ref.png | Bin 99316 -> 45398 bytes + test/infinite-join.ref.png | Bin 194 -> 142 bytes + test/inverse-text.ref.png | Bin 2150 -> 2166 bytes + test/joins-loop.ref.png | Bin 4646 -> 3112 bytes + test/joins-retrace.ref.png | Bin 4787 -> 3951 bytes + test/joins-star.ref.png | Bin 4362 -> 4028 bytes + test/joins.ref.png | Bin 5708 -> 4880 bytes + test/large-twin-antialias-mixed.ref.png | Bin 16668 -> 10740 bytes + test/leaky-dashed-stroke.ref.png | Bin 9387 -> 5627 bytes + test/leaky-polygon.ref.png | Bin 368 -> 281 bytes + test/line-width-overlap-rotated.ref.png | Bin 866 -> 719 bytes + test/line-width-overlap.ref.png | Bin 296 -> 324 bytes + test/line-width-scale.ref.png | Bin 5716 -> 3568 bytes + test/linear-gradient-subset.ref.png | Bin 825 -> 802 bytes + test/linear-gradient.ref.png | Bin 983 -> 961 bytes + test/long-dashed-lines.ref.png | Bin 2070 -> 1453 bytes + test/mask-alpha.argb32.ref.png | Bin 0 -> 596 bytes + test/mask-alpha.ref.png | Bin 632 -> 0 bytes + test/mask-alpha.rgb24.ref.png | Bin 599 -> 546 bytes + test/mask.argb32.ref.png | Bin 0 -> 8218 bytes + test/mask.ref.png | Bin 8603 -> 0 bytes + test/mask.rgb24.ref.png | Bin 7216 -> 7007 bytes + test/new-sub-path.argb32.ref.png | Bin 421 -> 331 bytes + test/new-sub-path.rgb24.ref.png | Bin 381 -> 303 bytes + test/operator-clear.argb32.ref.png | Bin 0 -> 1080 bytes + test/operator-clear.ref.png | Bin 1070 -> 0 bytes + test/operator-clear.rgb24.ref.png | Bin 965 -> 948 bytes + test/over-above-source.ref.png | Bin 560 -> 511 bytes + test/over-above-source.rgb24.ref.png | Bin 466 -> 421 bytes + test/over-around-source.ref.png | Bin 645 -> 578 bytes + test/over-around-source.rgb24.ref.png | Bin 503 -> 257 bytes + test/over-below-source.ref.png | Bin 434 -> 413 bytes + test/over-below-source.rgb24.ref.png | Bin 392 -> 322 bytes + test/over-between-source.ref.png | Bin 612 -> 561 bytes + test/over-between-source.rgb24.ref.png | Bin 473 -> 406 bytes + test/overlapping-boxes.argb32.ref.png | Bin 216 -> 179 bytes + test/overlapping-dash-caps.ref.png | Bin 3982 -> 2424 bytes + test/overlapping-glyphs.argb32.ref.png | Bin 2696 -> 2258 bytes + test/overlapping-glyphs.rgb24.ref.png | Bin 1650 -> 1390 bytes + test/paint-with-alpha-clip-mask.ref.png | Bin 333 -> 348 bytes + test/paint-with-alpha-clip.ref.png | Bin 302 -> 290 bytes + test/partial-clip-text-bottom.ref.png | Bin 263 -> 259 bytes + test/partial-clip-text-left.ref.png | Bin 303 -> 293 bytes + test/partial-clip-text-right.ref.png | Bin 156 -> 155 bytes + test/path-append.ref.png | Bin 6165 -> 4424 bytes + test/path-stroke-twice.ref.png | Bin 206 -> 209 bytes + test/pthread-show-text.ref.png | Bin 29885 -> 29759 bytes + test/push-group-color.ref.png | Bin 2902 -> 2676 bytes + test/push-group.ref.png | Bin 3060 -> 2829 bytes + test/push-group.rgb24.ref.png | Bin 2912 -> 2684 bytes + test/random-intersections-curves-eo.ref.png | Bin 245762 -> 156582 bytes + test/random-intersections-curves-nz.ref.png | Bin 264545 -> 151318 bytes + test/random-intersections-eo.ref.png | Bin 136018 -> 85197 bytes + test/random-intersections-nonzero.ref.png | Bin 141154 -> 83247 bytes + test/record-fill-alpha.ref.png | Bin 2728 -> 2173 bytes + test/record-paint-alpha-clip-mask.ref.png | Bin 333 -> 325 bytes + test/record-paint-alpha-clip.ref.png | Bin 302 -> 299 bytes + test/recording-surface-over.rgb24.ref.png | Bin 3162 -> 3128 bytes + test/rectilinear-miter-limit.ref.png | Bin 177 -> 145 bytes + test/reflected-stroke.ref.png | Bin 4978 -> 3410 bytes + test/rel-path.ref.png | Bin 198 -> 177 bytes + test/rel-path.rgb24.ref.png | Bin 214 -> 184 bytes + test/rotate-clip-image-surface-paint.ref.png | Bin 331 -> 312 bytes + test/rotated-clip.ref.png | Bin 3761 -> 2743 bytes + test/rounded-rectangle-fill.ref.png | Bin 787 -> 563 bytes + test/rounded-rectangle-stroke.ref.png | Bin 871 -> 569 bytes + test/scale-offset-image.ref.png | Bin 9953 -> 7688 bytes + test/scale-offset-similar.ref.png | Bin 9953 -> 7688 bytes + test/select-font-face.ref.png | Bin 2473 -> 2245 bytes + test/self-copy.ref.png | Bin 291 -> 258 bytes + test/shape-general-convex.ref.png | Bin 3470 -> 1869 bytes + test/shape-sierpinski.ref.png | Bin 54485 -> 43504 bytes + test/show-glyphs-advance.ref.png | Bin 1410 -> 1395 bytes + test/show-text-current-point.ref.png | Bin 2411 -> 2185 bytes + test/skew-extreme.ref.png | Bin 1012 -> 904 bytes + test/smask-fill.ref.png | Bin 1156 -> 1134 bytes + test/smask-stroke.ref.png | Bin 1714 -> 1598 bytes + test/smask-text.ref.png | Bin 1672 -> 1623 bytes + test/smask.ref.png | Bin 3396 -> 3401 bytes + test/spline-decomposition.ref.png | Bin 19569 -> 10005 bytes + test/stroke-ctm-caps.ref.png | Bin 873 -> 921 bytes + test/stroke-image.ref.png | Bin 1344 -> 972 bytes + test/subsurface.ref.png | Bin 1811 -> 1281 bytes + test/surface-pattern-operator.argb32.ref.png | Bin 5217 -> 4807 bytes + test/surface-pattern-operator.rgb24.ref.png | Bin 1942 -> 1866 bytes + test/text-antialias-gray.ref.png | Bin 1084 -> 975 bytes + test/text-antialias-subpixel.ref.png | Bin 1102 -> 1004 bytes + test/text-glyph-range.ref.png | Bin 2211 -> 1729 bytes + test/text-pattern.ref.png | Bin 1717 -> 1685 bytes + test/text-pattern.rgb24.ref.png | Bin 1414 -> 1392 bytes + test/text-rotate.ref.png | Bin 16722 -> 14682 bytes + test/transforms.ref.png | Bin 361 -> 341 bytes + test/trap-clip.ref.png | Bin 5820 -> 5741 bytes + test/trap-clip.rgb24.ref.png | Bin 5457 -> 5328 bytes + test/twin-antialias-gray.ref.png | Bin 3979 -> 2292 bytes + test/twin-antialias-mixed.ref.png | Bin 2338 -> 1639 bytes + test/twin-antialias-none.ref.png | Bin 718 -> 747 bytes + test/twin-antialias-subpixel.ref.png | Bin 3979 -> 2292 bytes + test/twin.ref.png | Bin 3979 -> 2292 bytes + test/unantialiased-shapes.ref.png | Bin 3968 -> 3926 bytes + test/unclosed-strokes.ref.png | Bin 1689 -> 1432 bytes + test/user-font-mask.ref.png | Bin 6011 -> 5476 bytes + test/user-font-proxy.ref.png | Bin 16937 -> 14023 bytes + test/user-font-rescale.ref.png | Bin 15937 -> 14852 bytes + test/user-font.ref.png | Bin 6270 -> 4939 bytes + test/world-map-fill.ref.png | Bin 57308 -> 45440 bytes + test/world-map-stroke.ref.png | Bin 65219 -> 43370 bytes + test/world-map.ref.png | Bin 70611 -> 65880 bytes + test/xcomposite-projection.ref.png | Bin 1112 -> 1108 bytes + 201 files changed, 11 insertions(+), 9 deletions(-) + +commit 0f26f75eda317efc9e448c875110b846b224d463 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 12 13:18:29 2011 +0100 + + perf/micro: Add measurement of setting the pixel directly using pixman + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/micro/pixel.c | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +commit 7b6586a7385a529d7bfaa463541715f74f4a904d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 12 21:46:55 2011 +0930 + + scaled-subsets: ensure different glyphs with same utf8 mapping are not merged together + + If a glyph maps to a latin char that is already assigned in the latin + subset, put the glyph in a non latin subset. + + src/cairo-scaled-font-subsets.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 497258a4cf62e526f88e44c177eec6d9adf74ed0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 12 22:01:09 2011 +0930 + + ft: fix warning + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b0d9b4ce539477bc14724369c445acde1d1f4bd6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 12 21:53:59 2011 +0930 + + pdf: add status check + + src/cairo-pdf-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 65a954d5bab9ab6fed15bd98b7018aca2fc50107 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 12 11:39:59 2011 +0100 + + test-surfaces: compilation fixes + + Update to the last minute changes in the traps compositor API. + + And so it begins. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/test-base-compositor-surface.c | 86 -------------------------------------- + src/test-null-compositor-surface.c | 8 ---- + 2 files changed, 94 deletions(-) + +commit af9fbd176b145f042408ef5391eef2a51d7531f8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 30 17:28:21 2011 +0100 + + Introduce a new compositor architecture + + Having spent the last dev cycle looking at how we could specialize the + compositors for various backends, we once again look for the + commonalities in order to reduce the duplication. In part this is + motivated by the idea that spans is a good interface for both the + existent GL backend and pixman, and so they deserve a dedicated + compositor. xcb/xlib target an identical rendering system and so they + should be using the same compositor, and it should be possible to run + that same compositor locally against pixman to generate reference tests. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + P.S. This brings massive upheaval (read breakage) I've tried delaying in + order to fix as many things as possible but now this one patch does far, + far, far too much. Apologies in advance for breaking your favourite + backend, but trust me in that the end result will be much better. :) + + boilerplate/cairo-boilerplate-test-surfaces.c | 351 +- + boilerplate/cairo-boilerplate-xlib.c | 3 +- + boilerplate/cairo-boilerplate.c | 14 +- + configure.ac | 4 +- + perf/Makefile.sources | 3 +- + perf/cairo-perf-compare-backends.c | 6 +- + perf/cairo-perf-diff-files.c | 47 +- + perf/cairo-perf-micro.c | 108 +- + perf/cairo-perf-report.c | 7 +- + perf/cairo-perf-trace.c | 136 +- + perf/cairo-perf.h | 16 +- + perf/cairo-stats.c | 66 +- + perf/micro/Makefile.sources | 5 + + perf/micro/a1-curve.c | 112 + + perf/micro/a1-line.c | 223 ++ + perf/micro/box-outline.c | 119 +- + perf/micro/composite-checker.c | 9 +- + perf/micro/curve.c | 9 +- + perf/micro/disjoint.c | 6 + + perf/micro/dragon.c | 9 +- + perf/micro/fill-clip.c | 126 + + perf/micro/fill.c | 9 +- + perf/micro/glyphs.c | 9 +- + perf/micro/hash-table.c | 9 +- + perf/micro/hatching.c | 9 +- + perf/micro/intersections.c | 9 +- + perf/micro/line.c | 9 +- + perf/micro/long-dashed-lines.c | 9 +- + perf/micro/long-lines.c | 9 +- + perf/micro/many-curves.c | 9 +- + perf/micro/many-fills.c | 9 +- + perf/micro/many-strokes.c | 13 +- + perf/micro/mask.c | 6 + + perf/micro/mosaic.c | 9 +- + perf/micro/paint-with-alpha.c | 9 +- + perf/micro/paint.c | 9 +- + perf/micro/pattern_create_radial.c | 9 +- + perf/micro/pixel.c | 177 + + perf/micro/pythagoras-tree.c | 9 +- + perf/micro/rectangles.c | 9 +- + perf/micro/rounded-rectangles.c | 9 +- + perf/micro/sierpinski.c | 94 + + perf/micro/spiral.c | 9 +- + perf/micro/stroke.c | 9 +- + perf/micro/subimage_copy.c | 9 +- + perf/micro/tessellate.c | 9 +- + perf/micro/text.c | 9 +- + perf/micro/twin.c | 9 +- + perf/micro/unaligned-clip.c | 9 +- + perf/micro/wave.c | 9 +- + perf/micro/wide-fills.c | 9 +- + perf/micro/wide-strokes.c | 9 +- + perf/micro/world-map.c | 9 +- + perf/micro/zrusin.c | 8 +- + src/Makefile.sources | 42 +- + src/cairo-analysis-surface.c | 77 +- + src/cairo-array-private.h | 90 + + src/cairo-array.c | 11 +- + src/cairo-atomic-private.h | 5 + + src/cairo-bentley-ottmann-rectangular.c | 55 +- + src/cairo-bentley-ottmann-rectilinear.c | 69 +- + src/cairo-bentley-ottmann.c | 154 +- + src/cairo-botor-scan-converter.c | 5 +- + src/cairo-box-private.h | 48 +- + src/cairo-boxes-intersect.c | 47 +- + src/cairo-boxes-private.h | 16 +- + src/cairo-boxes.c | 77 +- + src/cairo-cff-subset.c | 8 +- + src/cairo-clip-boxes.c | 42 +- + src/cairo-clip-private.h | 23 +- + src/cairo-clip-region.c | 8 +- + src/cairo-clip-surface.c | 39 +- + src/cairo-clip-tor-scan-converter.c | 1845 +++++++++ + src/cairo-clip.c | 20 +- + src/cairo-composite-rectangles-private.h | 38 +- + src/cairo-composite-rectangles.c | 179 +- + src/cairo-compositor-private.h | 355 ++ + src/cairo-compositor.c | 213 + + src/cairo-default-context.c | 3 +- + src/cairo-fallback-compositor.c | 174 + + src/cairo-freed-pool-private.h | 6 +- + src/cairo-ft-font.c | 1 - + src/cairo-gl-composite.c | 1148 +----- + src/cairo-gl-device.c | 20 +- + src/cairo-gl-glyphs.c | 382 +- + src/cairo-gl-operand.c | 538 +++ + src/cairo-gl-private.h | 106 +- + src/cairo-gl-shaders.c | 69 +- + src/cairo-gl-spans-compositor.c | 502 +++ + src/cairo-gl-surface.c | 1021 +---- + src/cairo-gl-traps-compositor.c | 550 +++ + src/cairo-gstate.c | 341 +- + src/cairo-image-compositor.c | 1545 +++++++ + src/cairo-image-mask-compositor.c | 408 ++ + src/cairo-image-source.c | 975 +++++ + src/cairo-image-spans-compositor.c | 131 + + src/cairo-image-surface-private.h | 88 +- + src/cairo-image-surface.c | 4213 +------------------- + src/cairo-mask-compositor.c | 1412 +++++++ + src/cairo-matrix.c | 6 + + src/cairo-mesh-pattern-rasterizer.c | 1 + + src/cairo-mime-surface.c | 18 +- + src/cairo-mono-scan-converter.c | 607 +++ + src/cairo-no-compositor.c | 107 + + src/cairo-output-stream.c | 2 + + src/cairo-paginated-surface.c | 29 +- + src/cairo-path-bounds.c | 28 +- + src/cairo-path-fill.c | 69 +- + src/cairo-path-fixed-private.h | 4 + + src/cairo-path-fixed.c | 57 + + src/cairo-path-stroke-boxes.c | 90 +- + src/cairo-path-stroke-polygon.c | 71 +- + src/cairo-path-stroke-tristrip.c | 1088 +++++ + src/cairo-path-stroke.c | 10 +- + src/cairo-pattern-private.h | 58 +- + src/cairo-pattern.c | 1137 +----- + src/cairo-pdf-operators.c | 2 +- + src/cairo-pdf-shading.c | 2 + + src/cairo-pdf-surface.c | 83 +- + src/cairo-polygon-intersect.c | 69 +- + src/cairo-polygon.c | 52 +- + src/cairo-ps-surface.c | 211 +- + src/cairo-quartz-image-surface.c | 160 +- + src/cairo-quartz-surface.c | 802 ++-- + src/cairo-recording-surface-private.h | 6 + + src/cairo-recording-surface.c | 131 +- + src/cairo-rectangular-scan-converter.c | 75 +- + src/cairo-reference-count-private.h | 1 + + src/cairo-scaled-font-private.h | 68 +- + src/cairo-scaled-font.c | 111 +- + src/cairo-script-private.h | 3 +- + src/cairo-script-surface.c | 179 +- + src/cairo-slope.c | 4 +- + src/cairo-spans-compositor-private.h | 96 + + src/cairo-spans-compositor.c | 1007 +++++ + src/cairo-spans-private.h | 55 +- + src/cairo-spans.c | 108 - + src/cairo-spline.c | 53 +- + src/cairo-stroke-style.c | 10 +- + src/cairo-surface-backend-private.h | 196 + + src/cairo-surface-fallback-private.h | 112 +- + src/cairo-surface-fallback.c | 1563 +------- + src/cairo-surface-observer-private.h | 24 +- + src/cairo-surface-observer.c | 227 +- + src/cairo-surface-private.h | 1 + + src/cairo-surface-snapshot-private.h | 3 +- + src/cairo-surface-snapshot.c | 17 +- + src/cairo-surface-subsurface-private.h | 22 +- + src/cairo-surface-subsurface.c | 21 +- + src/cairo-surface-wrapper-private.h | 1 + + src/cairo-surface-wrapper.c | 6 +- + src/cairo-surface.c | 1212 +----- + src/cairo-svg-surface.c | 26 +- + src/cairo-time-private.h | 19 +- + src/cairo-time.c | 37 +- + src/cairo-tor-scan-converter.c | 265 +- + src/cairo-tor22-scan-converter.c | 1707 ++++++++ + src/cairo-traps-compositor.c | 2032 ++++++++++ + src/cairo-traps-private.h | 126 + + src/cairo-traps.c | 61 + + src/cairo-tristrip-private.h | 94 + + src/cairo-tristrip.c | 185 + + src/cairo-truetype-subset.c | 2 + + src/cairo-type1-fallback.c | 2 + + src/cairo-type1-subset.c | 2 + + src/cairo-type3-glyph-surface.c | 35 +- + src/cairo-types-private.h | 34 +- + src/cairo-wideint-private.h | 6 + + src/cairo-wideint.c | 16 + + src/cairo-win32-printing-surface.c | 19 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-xcb-connection.c | 2 +- + src/cairo-xcb-private.h | 4 +- + src/cairo-xcb-surface-core.c | 1 + + src/cairo-xcb-surface-render.c | 507 +-- + src/cairo-xcb-surface.c | 33 +- + src/cairo-xlib-core-compositor.c | 524 +++ + src/cairo-xlib-display.c | 243 +- + src/cairo-xlib-fallback-compositor.c | 54 + + src/cairo-xlib-private.h | 254 +- + src/cairo-xlib-render-compositor.c | 1685 ++++++++ + src/cairo-xlib-screen.c | 20 +- + src/cairo-xlib-source.c | 938 +++++ + src/cairo-xlib-surface-private.h | 71 +- + src/cairo-xlib-surface.c | 4210 ++++--------------- + src/cairo.c | 1 + + src/cairo.h | 45 +- + src/cairoint.h | 631 +-- + src/skia/cairo-skia-context.cpp | 1 + + src/skia/cairo-skia-surface.cpp | 220 +- + src/test-base-compositor-surface.c | 942 +++++ + src/test-compositor-surface-private.h | 53 + + src/test-compositor-surface.c | 259 ++ + src/test-compositor-surface.h | 71 + + src/test-fallback-surface.c | 244 -- + src/test-fallback-surface.h | 50 - + src/test-fallback16-surface.c | 241 -- + src/test-fallback16-surface.h | 52 - + src/test-null-compositor-surface.c | 480 +++ + src/test-null-compositor-surface.h | 60 + + src/test-null-surface.c | 195 - + src/test-null-surface.h | 46 - + src/test-paginated-surface.c | 24 +- + src/test-wrapping-surface.c | 281 -- + src/test-wrapping-surface.h | 51 - + test/Makefile.refs | 9 +- + test/Makefile.sources | 5 +- + test/a1-clip-fill-rule.argb32.ref.png | Bin 0 -> 236 bytes + test/a1-clip-fill-rule.rgb24.ref.png | Bin 0 -> 218 bytes + test/a1-rectilinear-grid.ref.png | Bin 0 -> 207 bytes + test/cairo-test-trace.c | 195 +- + test/clear-source.c | 2 +- + test/clip-fill-rule.c | 13 + + test/map-to-image.c | 4 +- + test/overlapping-boxes.argb32.ref.png | Bin 0 -> 216 bytes + test/overlapping-boxes.c | 96 + + test/overlapping-boxes.rgb24.ref.png | Bin 0 -> 204 bytes + test/rectilinear-grid.c | 14 + + test/shape-sierpinski.c | 85 + + test/shape-sierpinski.ref.png | Bin 0 -> 54485 bytes + test/test-fallback16-surface-source.c | 43 - + test/test-fallback16-surface-source.ps.ref.png | Bin 292 -> 0 bytes + ...allback16-surface-source.svg12.argb32.xfail.png | Bin 278 -> 0 bytes + ...fallback16-surface-source.svg12.rgb24.xfail.png | Bin 278 -> 0 bytes + test/zero-mask.c | 6 +- + util/cairo-script/cairo-script-interpreter.c | 1 + + util/cairo-script/cairo-script-operators.c | 12 +- + util/cairo-trace/trace.c | 114 +- + util/show-polygon.c | 31 +- + 229 files changed, 28243 insertions(+), 18653 deletions(-) + +commit 0540bf384aed344899417d3b0313bd6704679c1c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 10 23:39:15 2011 +0930 + + ps: improve formatting of fallback image comment + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d887d99c74f2097021a1f4f7c1d2306b8f9b429 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 10 23:21:28 2011 +0930 + + ps: use reusable stream for mesh pattern data + + File data used by a shading pattern must reusable since the pattern + may read the file multiple times. As currentfile is not reusable, use + the /ReusableStreamDecode to make it reusable. + + src/cairo-ps-surface.c | 29 ++++++++++++++++++----------- + 1 file changed, 18 insertions(+), 11 deletions(-) + +commit d8ac76bcec6518f99b21feb0981c4887e89700b7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 9 19:43:48 2011 +0100 + + perf/Makefile.am: Add missing '\' line continuation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit ee15e030d8c76df1163706b99369151a93a03524 +Author: Paulo Zanoni <paulo.r.zanoni@intel.com> +Date: Fri Sep 9 14:17:39 2011 -0300 + + cairo-test-runner: don't leak argv + + If CAIRO_TESTS is set, argv will be replaced by a xmaloc'ed variable. We + need to free it. + + This can be easily detected by running: + CAIRO_TESTS=user-font make check-valgrind TARGETS=image + + Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/cairo-test-runner.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 572479ec20c967f91c22a4e49e705c105d37a1dc +Author: Paulo Zanoni <paulo.r.zanoni@intel.com> +Date: Fri Sep 9 14:16:21 2011 -0300 + + test/README: add missing "S" + + Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 669242c2c8009b2a257131ba1a3cf497b9472cc4 +Author: Paulo Zanoni <paulo.r.zanoni@intel.com> +Date: Fri Sep 9 14:14:48 2011 -0300 + + test: fix append_argv() + + When I ran "CAIRO_TESTS=a1-bug make test", no test executed because of a + bug in append_argv(). The "olen" variable was assuming that we always + only append a single argument to argv and the resulting argc was also + wrong. + + Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/cairo-test-runner.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 166be70cb8f7232b71916261d5e2b14f709c08bf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 9 22:30:49 2011 +0930 + + pdf: latin text must use character codes in the toUnicode CMap, not glyph indices + + src/cairo-pdf-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 80fc566eaf9ba0307d3f556e20b4a20c47b37afc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 8 19:29:16 2011 +0930 + + cff: strip subset tag when reading font name + + so we don't end up with two subset tags in the font name when cairo + appends its own subset tag. + + src/cairo-cff-subset.c | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit 7dca94fbc48b20280fa0a27cd46b00dba42aea97 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 6 23:50:46 2011 +0930 + + pdf: use interpolate in image smask + + src/cairo-pdf-surface.c | 37 ++++++++++++++++++++----------------- + 1 file changed, 20 insertions(+), 17 deletions(-) + +commit d47e05f8c222c0b7641af85d7ed6f50ee03297c4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 6 23:41:12 2011 +0930 + + ps/pdf: fix the polarity of stencil masks + + src/cairo-pdf-surface.c | 3 ++- + src/cairo-ps-surface.c | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit a7ed3dd9143601c4e70696cece6d2b78f2c6053a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 6 23:21:35 2011 +0930 + + ps: support stencil masks + + When the mask is an A1 image (or can be reduced to A1) use the imagemask operator. + + src/cairo-ps-surface.c | 295 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 206 insertions(+), 89 deletions(-) + +commit c34d6adfccfe9dc7f76a0ab970914dd8f6e626b0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 6 21:36:54 2011 +0930 + + pdf: use _emit_smask() instead of _emit_imagemask to emit stencil mask + + Now that _emit_smask() can generate A1 masks, the _emit_imagemask() + code can be removed and emit_smask() used instead. An additional + benefit is stencil masks can be generated from ARGB32 and A8 images as + well as A1 providing that the analysis of the transparency shows that + the image is opaque or has bilevel alpha. + + src/cairo-pdf-surface-private.h | 2 +- + src/cairo-pdf-surface.c | 143 +++++++++++++++++++--------------------- + 2 files changed, 68 insertions(+), 77 deletions(-) + +commit d6d3825b51f51f5897099ffd7989fa7ca4cb0378 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 5 22:31:53 2011 +0930 + + ps: each row of 1-bit image data needs to begin on a byte boundary + + src/cairo-ps-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3614892d8d4d527cc98e44f72a9caaff05c8f86b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 5 22:30:15 2011 +0930 + + pdf: each row of 1-bit image data needs to begin on a byte boundary + + src/cairo-pdf-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 42fecf37dc2e8f63fbe4c9560f224fe141c59f3b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 4 22:39:57 2011 +0930 + + pdf: use ink extents in content stream XObjects + + src/cairo-pdf-surface.c | 67 ++++++++++++++++++++++++++----------------------- + 1 file changed, 36 insertions(+), 31 deletions(-) + +commit d1f146b54f2c13c8786e389eb4d731dfc33d8bb7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 4 20:52:02 2011 +0930 + + pdf: use ink extents for pattern bbox + + src/cairo-pdf-surface-private.h | 1 + + src/cairo-pdf-surface.c | 89 ++++++++++++++++++++++++++--------------- + 2 files changed, 57 insertions(+), 33 deletions(-) + +commit 37a22669d80cf970dab3aa3e7a8ec673c1462342 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 4 20:43:07 2011 +0930 + + pdf: use ink extents for smask bbox + + There are some inkscape bugs reporting very slow rendering of inkscape + generated PDFs (inkscape uses cairo for PDF output). These bugs are + caused by cairo specifying a page sized bounding box in XObjects and + Patterns. PDF renderers usually use the BBox as the image size when + compositing. As PDFs generated from SVG tends to use a lot of XObjects + and Patterns this can lead to very long rendering times. + + These three patches tighten up all the BBoxes in PDF output. + + src/cairo-pattern.c | 44 +++++++++++++++++ + src/cairo-pdf-surface-private.h | 2 + + src/cairo-pdf-surface.c | 102 ++++++++++++++++++++++++++++++---------- + src/cairo-types-private.h | 5 ++ + src/cairoint.h | 4 ++ + 5 files changed, 132 insertions(+), 25 deletions(-) + +commit 6ad63946d4374ad30ef7fbdad421d85bfd8da423 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 4 15:19:21 2011 -0700 + + cairo-missing: Fix build + + The cairo-missing code contains multiple typos and uses + _cairo_*alloc*() functions without including cairo-malloc-private.h + + util/cairo-missing/Makefile.win32 | 4 ++-- + util/cairo-missing/getline.c | 9 +++++---- + util/cairo-missing/strndup.c | 7 +++++-- + 3 files changed, 12 insertions(+), 8 deletions(-) + +commit ed84cb522cc9a65ac89b2b008010ecfe78dde7de +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 4 15:18:34 2011 -0700 + + wideint: Fix build on suncc + + "static cairo_private" means nothing and suncc complains loudly about + it. The visibility of _cairo_double_to_uint64() and + _cairo_uint64_to_double() should just be "static". + + src/cairo-wideint-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 01729606fb5026ca5b4c8ac67a083c065be8d7a0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 4 15:17:20 2011 -0700 + + malloc: Fix build on suncc + + cairo-malloc-private.h depends on malloc() and realloc() being + declared, hence it should include stdlib.h. + + src/cairo-malloc-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 761ef7ae8bad6d76f0f5e550882c5991fc0f92b1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 4 15:16:30 2011 -0700 + + cairo-missing: Fix and cleanup ssize_t type definition + + The definition of ssize_t is needed in cairo-missing.h and can be + dropped from files which include it. + + perf/cairo-analyse-trace.c | 2 -- + perf/cairo-perf-report.c | 6 ------ + perf/cairo-perf-trace.c | 2 -- + util/cairo-missing/cairo-missing.h | 8 ++++++++ + 4 files changed, 8 insertions(+), 10 deletions(-) + +commit 60e04ff49eb818e9628c2e1421f5368655c61bea +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 4 14:09:54 2011 -0700 + + observer: Fix build on suncc + + Returning a void value is an error on suncc and causes a warning on msvc: + cairo-surface-observer.c(1273) : warning C4098: + '_cairo_surface_observer_release_source_image' : 'void' function + returning a value + + src/cairo-surface-observer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b0aec95c8e43622c942c08d6dd8f6ab032983ed5 +Author: Jesse van den Kieboom <jessevdk@gnome.org> +Date: Sun Aug 14 18:12:28 2011 +0200 + + quartz: Rename declaration of _cairo_quartz_create_cgimage + + The function was renamed in 81efbc1847c4b9c08440d76bbc1636b21cac16d8 + but the prototype was not updated. + + Silences the warning: + cairo-quartz-surface.c:165: warning: no previous prototype for 'CairoQuartzCreateCGImage' + + Along with 0c620080afa892f7bb642cc90fb72aafbebad16d, fixes + https://bugs.freedesktop.org/show_bug.cgi?id=40082 + + src/cairo-quartz-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 968eb30bba1dc942ccd31e4450fdd3bb74c83cb6 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Sep 1 13:34:43 2011 +0200 + + xcb: Steal from the pending list for GetImage + + Before using some piece of SHM again, we must be sure that the X11 server is no + longer working with it. For this, we send a GetInputFocus when we are done with + the SHM locally and will only use the memory again when the reply comes in. + + However, if we are allocating the memory for SHM GetImage, then we can re-use + memory earlier, because the server processes requests in order. So it will only + start writing to the memory after it is done with earlier requests for this + memory. So instead of using GetInputFocus for synchronisation, the SHM GetImage + request will automatically do this for us. + + Thanks to Chris Wilson for this idea. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 2 ++ + src/cairo-xcb-shm.c | 18 ++++++++++++++++++ + src/cairo-xcb-surface-core.c | 4 ++-- + src/cairo-xcb-surface.c | 3 +++ + 4 files changed, 25 insertions(+), 2 deletions(-) + +commit ea5255653176dfab0fdfe78a3186587b01559735 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Aug 31 12:24:20 2011 +0200 + + xcb: Fix fixup_unbounded_with_mask + + This code was casting a pixman_box32_t* to cairo_box_t*. However, a box uses + fixed point numbers while the pixman box uses integers which means the result + was off by factor 256. + + The fix is to replace the use of _cairo_boxes_limit() with + _cairo_boxes_init_with_clip(). However, this means this function no needs to be + passed a clip instead of a clip region which causes some minor changes to + _composite_boxes(). + + This improves the result for tighten-bounds again. Out of the tested + combinations, 10 are fixed by this. This bug was hit by code similar to this + (Repeating here since that test has so many different cases): + + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_rectangle (cr, SIZE / 4, SIZE / 4, SIZE / 2, SIZE / 2); + cairo_clip_preserve (cr); + cairo_fill (cr); + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit ed7f992c1345e46aadf7b5b60350e483c11bf518 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Aug 31 11:41:00 2011 +0200 + + xcb: Skip drawing if bounded extents are empty + + This only wraps the whole code block in an if which checks if the bounded + extents are empty. No other changes are done in here. + + This fixes the failed assertion from the tighten-bounds test. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 52 ++++++++++++++++++++++-------------------- + 1 file changed, 27 insertions(+), 25 deletions(-) + +commit 1bcc27985fe76a674ea5b8a24b1bad544390b301 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Sep 2 12:51:10 2011 +0200 + + perf: Fix win32 build + + Microsoft C Compiler complains about: + + hash-table.c(44) : error C2466: cannot allocate an array of constant + size 0 + + Adding an unused element makes it happy. + + perf/micro/hash-table.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit b1a1dfcdcfb865a4867541f91897f7dda556d206 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Sep 2 12:34:04 2011 +0200 + + win32: Fix linking + + round() is not available on win32 and causes the linking to fail with: + + cairo-surface-observer.obj : error LNK2019: unresolved external symbol + round referenced in function percent + + src/cairo-surface-observer.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 04a7bad9237a1e0f2887328860ba29695ad32199 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Sep 2 12:25:48 2011 +0200 + + surface: Fix make check + + cairo_surface_map_to_image() and cairo_surface_unmap_image() are + called by cairo-surface-observer but they are not slim_hidden: + + Checking .libs/libcairo.so for local PLT entries + 00000000002e27a8 0000019d00000007 R_X86_64_JUMP_SLOT + 000000000005df30 cairo_surface_unmap_image + 0 + 00000000002e2b90 0000026100000007 R_X86_64_JUMP_SLOT + 000000000005f5c0 cairo_surface_map_to_image + 0 + + src/cairo-surface.c | 2 ++ + src/cairoint.h | 2 ++ + 2 files changed, 4 insertions(+) + +commit 14fab8f84a18aca57d0426944b161fe85cc51444 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Sep 2 12:25:02 2011 +0200 + + script: Fix make check + + make check fails because cairo-script-private.h cannot be compiled + standalone: + + ./cairo-script-private.h:45:1: error: unknown type name ‘cairo_private’ + ... + + ./cairo-script-private.h:48:40: error: unknown type name ‘cairo_output_stream_t’ + + src/cairo-script-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 297aa4d4a0a007461f998588e80b9fbde1718876 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Aug 31 17:08:27 2011 +0200 + + perf: Fix readme + + The README in perf/ was not updated when cairo-perf.c was renamed to + cairo-perf-micro.c + + perf/README | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dcd3e2cde13dcf56c3281911c98b2356b41ae877 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Aug 31 17:03:33 2011 +0200 + + perf: Get rid of cairo_perf_ticks_per_second() + + The cairo_time_from_s() and cairo_time_to_s() functions should be used + instead. + + perf/cairo-perf-micro.c | 16 ++++++++-------- + perf/cairo-perf-trace.c | 46 +++++++++++++++++++++++----------------------- + perf/cairo-perf.c | 6 ------ + perf/cairo-perf.h | 3 --- + 4 files changed, 31 insertions(+), 40 deletions(-) + +commit 9172e2aec0bfd7ac9ae464726bc79ace2d4d7113 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Aug 31 17:55:07 2011 +0200 + + perf: Drop cairo_perf_ticks_t in favor of cairo_time_t + + cairo_time_t offers a superset of the functions provided by + cairo_perf_ticks_t. + + perf/README | 2 +- + perf/cairo-perf-micro.c | 6 +++--- + perf/cairo-perf-report.c | 8 ++++---- + perf/cairo-perf-trace.c | 4 ++-- + perf/cairo-perf.h | 16 +++++++--------- + perf/cairo-stats.c | 9 ++++----- + perf/cairo-stats.h | 6 +++--- + perf/micro/box-outline.c | 4 ++-- + perf/micro/composite-checker.c | 2 +- + perf/micro/curve.c | 4 ++-- + perf/micro/disjoint.c | 2 +- + perf/micro/dragon.c | 16 ++++++++-------- + perf/micro/fill.c | 6 +++--- + perf/micro/glyphs.c | 4 ++-- + perf/micro/hash-table.c | 2 +- + perf/micro/hatching.c | 16 ++++++++-------- + perf/micro/intersections.c | 12 ++++++------ + perf/micro/line.c | 30 +++++++++++++++--------------- + perf/micro/long-dashed-lines.c | 2 +- + perf/micro/long-lines.c | 10 +++++----- + perf/micro/many-curves.c | 8 ++++---- + perf/micro/many-fills.c | 10 +++++----- + perf/micro/many-strokes.c | 10 +++++----- + perf/micro/mask.c | 18 +++++++++--------- + perf/micro/mosaic.c | 10 +++++----- + perf/micro/paint-with-alpha.c | 2 +- + perf/micro/paint.c | 2 +- + perf/micro/pattern_create_radial.c | 2 +- + perf/micro/pythagoras-tree.c | 2 +- + perf/micro/rectangles.c | 6 +++--- + perf/micro/rounded-rectangles.c | 6 +++--- + perf/micro/spiral.c | 34 +++++++++++++++++----------------- + perf/micro/stroke.c | 4 ++-- + perf/micro/subimage_copy.c | 2 +- + perf/micro/tessellate.c | 8 ++++---- + perf/micro/text.c | 2 +- + perf/micro/twin.c | 2 +- + perf/micro/unaligned-clip.c | 2 +- + perf/micro/wave.c | 2 +- + perf/micro/wide-fills.c | 10 +++++----- + perf/micro/wide-strokes.c | 10 +++++----- + perf/micro/world-map.c | 8 ++++---- + perf/micro/zrusin.c | 4 ++-- + 43 files changed, 161 insertions(+), 164 deletions(-) + +commit 2855ff4666922f2c38505414270d47f659b0d499 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Aug 31 16:42:03 2011 +0200 + + perf: Reuse cairo-time + + Instead of redefining time getters, use the generic one provided by + _cairo_time_*. + + perf/Makefile.am | 1 + + perf/Makefile.sources | 7 +- + perf/cairo-perf-os2.c | 99 ------------------- + perf/cairo-perf-posix.c | 257 ------------------------------------------------ + perf/cairo-perf-win32.c | 93 ------------------ + perf/cairo-perf.c | 101 +++++++++++++++++++ + perf/cairo-perf.h | 3 +- + perf/cairo-stats.c | 46 ++++----- + 8 files changed, 126 insertions(+), 481 deletions(-) + +commit 6d6bfbd641bbb4de62df704e724e507a7e55b883 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Aug 30 16:16:04 2011 +0200 + + Introduce the cairo-missing library + + The cairo-missing library provides the functions which are needed in + order to correctly compile cairo (or its utilities) and which were not + found during configuration. + + Fixes the build on MacOS X Lion, which failed because of collisons + between the cairo internal getline and strndup and those in libc: + + cairo-analyse-trace.c:282: error: static declaration of ‘getline’ follows non-static declaration + /usr/include/stdio.h:449: error: previous declaration of ‘getline’ was here + cairo-analyse-trace.c:307: error: static declaration of ‘strndup’ follows non-static declaration + ... + + build/configure.ac.system | 2 +- + configure.ac | 1 + + perf/Makefile.am | 5 +++ + perf/cairo-analyse-trace.c | 52 +--------------------- + perf/cairo-perf-report.c | 67 +--------------------------- + perf/cairo-perf-trace.c | 52 +--------------------- + test/Makefile.am | 6 ++- + test/cairo-test-trace.c | 47 +------------------- + util/Makefile.am | 2 +- + util/cairo-missing/Makefile.am | 10 +++++ + util/cairo-missing/Makefile.sources | 8 ++++ + util/cairo-missing/Makefile.win32 | 10 +++++ + util/cairo-missing/cairo-missing.h | 49 ++++++++++++++++++++ + util/cairo-missing/getline.c | 89 +++++++++++++++++++++++++++++++++++++ + util/cairo-missing/strndup.c | 54 ++++++++++++++++++++++ + 15 files changed, 237 insertions(+), 217 deletions(-) + +commit 0101a545793291d0fe76b765ba8392ade5faa1a1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Aug 30 16:15:28 2011 +0200 + + time: Add cairo_time_t type + + Add the cairo_time_t type (currently based on cairo_uint64_t) and use + it in cairo-observer and in the perf suite. + + Fixes the build on MacOS X (for the src/ subdir) and Win32, whch + failed because they don't provide clock_gettime: + + cairo-surface-observer.c:629: error: implicit declaration of function 'clock_gettime' + cairo-surface-observer.c:629: warning: nested extern declaration of 'clock_gettime' + cairo-surface-observer.c:629: error: 'CLOCK_MONOTONIC' undeclared (first use in this function) + ... + + build/configure.ac.system | 7 +- + configure.ac | 2 +- + perf/Makefile.am | 1 - + src/Makefile.sources | 2 + + src/cairo-surface-observer-private.h | 13 ++- + src/cairo-surface-observer.c | 169 ++++++++++++--------------- + src/cairo-time-private.h | 93 +++++++++++++++ + src/cairo-time.c | 215 +++++++++++++++++++++++++++++++++++ + src/cairo-wideint-private.h | 12 ++ + src/cairo-wideint.c | 16 +++ + 10 files changed, 421 insertions(+), 109 deletions(-) + +commit e7204a3631d29d334511f291db8c31ce0026e2ce +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Sep 1 07:16:43 2011 -0700 + + win32: Fix compilation + + cairo-image-surface-private.h is needed in order to access + cairo_image_surface_t fields. + + Fixes multiple build errors: + + error C2037: left of '...' specifies undefined struct/union + '_cairo_image_surface' + + src/cairo-win32-font.c | 1 + + src/cairo-win32-printing-surface.c | 1 + + src/cairo-win32-surface.c | 1 + + 3 files changed, 3 insertions(+) + +commit 0c620080afa892f7bb642cc90fb72aafbebad16d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Aug 30 16:15:57 2011 +0200 + + quartz: Fix compilation + + cairo-image-surface-private.h is needed in order to access + cairo_image_surface_t fields. + + Fixes multiple build errors: dereferencing pointer to incomplete type + + src/cairo-quartz-font.c | 1 + + src/cairo-quartz-surface.c | 1 + + 2 files changed, 2 insertions(+) + +commit 6fd174b4233f92fd4a2f490728cbff824c8d404a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Aug 31 18:29:40 2011 +0200 + + perf: Silence gcc warning + + Silence: + + dragon.c: In function 'do_dragon_solid': + dragon.c:167: warning: unused variable 'r' + + perf/micro/dragon.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d66d9cd777c362e2f99a41aa77bbe3428cf0c60d +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Aug 30 22:19:33 2011 +0200 + + xcb: Fix fallback for *_shm_put_image + + This function shouldn't ever be called is xcb-shm is disabled. However, it is + still defined to avoid lots of #ifdefs. + + Additionally, this removes the only use of uint64_t from cairo-xcb. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5f45f696d0a82dd9f9d4534d135fe75ce11b5223 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Aug 30 22:10:34 2011 +0200 + + xcb: Add an assert for the tighten-bounds test + + This code casts the result of _cairo_xcb_surface_create_similar() to + cairo_xcb_surface_t*. However, the tighten-bounds test makes this run with + bounded extents of size 0x0 and thus _cairo_xcb_surface_create_similar() falls + back to an image surface. Ugly. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 70118ee119c352322860926bd7ce3d0af7c1a3a4 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Aug 30 22:03:33 2011 +0200 + + test: Add tighten-bounds + + In the spirit of the new big-{little,empty}-{box,triangle} tests, this test + combines various paths. However, these paths are not only filled but also used + for clipping, resulting in 120 different combinations. + + No backend currently succeeds the test. The reference image is a gimp-ination of + the image and test-fallback results and thus certainly wrong. Feel free to fix. + + Additionally, this makes the xcb backend die with an ugly failed assert. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/tighten-bounds.c | 172 ++++++++++++++++++++++++++++++++++++++++++++ + test/tighten-bounds.ref.png | Bin 0 -> 7958 bytes + 4 files changed, 174 insertions(+) + +commit 7df796433357ec1bb9e448406ded9ba48c6d839f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 30 15:17:41 2011 +0100 + + observer: Add missing return codes + + Upon detecting the user error, supply an error code! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 70cd3b473d09e9ad3d803014a904a22639db1a24 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 30 14:24:12 2011 +0100 + + api: Extend cairo_antialias_t to include performace/quality hints + + The existing API only described the method to be used for performing + rasterisation and unlike other API provided no opportunity for the user + to give a hint as to how to trade off performance against speed. So in + order to no be overly prescriptive, we extend the NONE/GRAY/SUBPIXEL + methods with FAST/GOOD/BEST hints and leave the backend to decide how + best to achieve those goals. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ft-font.c | 3 +++ + src/cairo-quartz-font.c | 3 +++ + src/cairo-script-surface.c | 5 ++++- + src/cairo-surface-observer-private.h | 2 +- + src/cairo-surface-observer.c | 5 ++++- + src/cairo-user-font.c | 3 +++ + src/cairo-vg-surface.c | 5 ++++- + src/cairo-win32-font.c | 3 +++ + src/cairo-xcb-surface-render.c | 3 +++ + src/cairo-xlib-surface.c | 21 ++++++--------------- + src/cairo-xml-surface.c | 11 +++++++---- + src/cairo.h | 25 ++++++++++++++++++++++++- + util/cairo-gobject/cairo-gobject-enums.c | 6 ++++++ + util/cairo-script/cairo-script-operators.c | 3 +++ + util/cairo-trace/trace.c | 5 +++++ + 15 files changed, 79 insertions(+), 24 deletions(-) + +commit 6b1daace578673c72a22a2fac72df9af2312cb10 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 25 18:43:02 2011 +0100 + + perf: Print a summary of each operation for a trace (using '-s') + + In order for this to be effective on small system we also need to + disable the recording of the long traces which exhaust all memory... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-analyse-trace.c | 4 +- + perf/cairo-perf-trace.c | 117 ++++++++++++++++++----- + src/cairo-surface-observer.c | 219 ++++++++++++++++++++++++++++++------------- + src/cairo.h | 23 ++++- + 4 files changed, 276 insertions(+), 87 deletions(-) + +commit 7ae2708fc8cf5a4983b4a805a4abe3b018b4aff4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 29 15:56:46 2011 +0100 + + test: Add big-empty-triangle + + One last variant to make sure we handle the case of the disappearing + unbounded triangle. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 + + test/Makefile.sources | 1 + + test/big-empty-triangle.argb32.ref.png | Bin 0 -> 111 bytes + test/big-empty-triangle.c | 75 +++++++++++++++++++++++++++++++++ + test/big-empty-triangle.rgb24.ref.png | Bin 0 -> 108 bytes + 5 files changed, 78 insertions(+) + +commit f71cfe84fe14959f41be0658db04a260bfb091e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 29 15:54:11 2011 +0100 + + test: Add big-empty-box + + Another variant on big-little-box, to make sure we trim the extents + before doing the empty unbounded fixup. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 ++ + test/Makefile.sources | 1 + + test/big-empty-box.argb32.ref.png | Bin 0 -> 111 bytes + test/big-empty-box.c | 64 ++++++++++++++++++++++++++++++++++++++ + test/big-empty-box.rgb24.ref.png | Bin 0 -> 108 bytes + 5 files changed, 67 insertions(+) + +commit 249c89c313598487b5eab1a93a06ac9ebcc173b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 29 15:48:42 2011 +0100 + + test: Add big-little-triangle + + A variant on big-little-triangle to exercise the non-rectangular paths. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 + + test/Makefile.sources | 1 + + test/big-little-triangle.argb32.ref.png | Bin 0 -> 409 bytes + test/big-little-triangle.c | 76 ++++++++++++++++++++++++++++++++ + test/big-little-triangle.rgb24.ref.png | Bin 0 -> 328 bytes + 5 files changed, 79 insertions(+) + +commit 2927d13ab260562dc269dc249fb5275da0b82d63 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 29 21:31:09 2011 +0930 + + pdf: use a new clipper object in recording_subsurface + + src/cairo-pdf-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit c317e215fb743e81b82f359022b845ddee4c97ba +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 29 21:27:23 2011 +0930 + + ps/pdf: use a new clipper object when emitting a recording surface + + src/cairo-pdf-surface.c | 6 ++++++ + src/cairo-ps-surface.c | 14 ++++++++++++++ + 2 files changed, 20 insertions(+) + +commit 8d91de49261662bc920739bbb91d22a49016eb81 +Author: Krzysztof Kosiński <tweenk.pl@gmail.com> +Date: Fri Aug 26 22:59:01 2011 +0100 + + test: Add test case from bug-40410 + + Exercises a case where we failed to fill a rectangle... + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/bug-40410.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ + test/bug-40410.ref.png | Bin 0 -> 428 bytes + 4 files changed, 74 insertions(+) + +commit 09d8fc926f685a834020c0c6ae2c26798f770650 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 26 09:36:53 2011 +0100 + + test: Add clip-mixed-antialias + + The wonders one sees when looking at webpages. Who knew people would be + so inventive with clips? + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 6 +- + test/Makefile.sources | 1 + + test/clip-mixed-antialias.c | 128 ++++++++++++++++++++++++++++++++++++++ + test/clip-mixed-antialias.ref.png | Bin 0 -> 1085 bytes + 4 files changed, 134 insertions(+), 1 deletion(-) + +commit bd4445513137821c6165461210372d02a72f72bb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 24 20:35:10 2011 +0930 + + font-subsets: fix wrong string length + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c13249c63af865823c4a6fd940a6f39084eff8c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 2 13:22:58 2011 -0400 + + [ft] Minor + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6cdad1931a585e2f1a6a11c7a9a4687660037cd2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 23 14:39:20 2011 +0100 + + observe: Provide the sum of the elapsed time of the individual operations + + We can use the elapsed time of the indiividual operations to profile the + synchronous throughput of a trace and eliminate all replay overhead. At + the cost of running the trace synchronously of course. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-compare-backends.c | 3 +-- + perf/cairo-perf-trace.c | 36 +++++++++++++++++++++----- + perf/cairo-perf.h | 1 + + src/cairo-surface-observer.c | 52 +++++++++++++++++++++++++++++++++----- + src/cairo.h | 5 ++++ + 5 files changed, 83 insertions(+), 14 deletions(-) + +commit ba1060fbbc62bd364d65787bb0c88281c67a534a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 23 00:32:51 2011 +0930 + + cff-subset: fix decoding of real numbers + + src/cairo-cff-subset.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit cdb00dec4231d2dd3c2f9c98c3533a716d71cf8c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 21 20:12:42 2011 +0930 + + cff-subset: don't easily give up parsing a charstring if we already have the width + + The 2 byte operators can be ignored of we don't need or have already found + the width. + + src/cairo-cff-subset.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 23dfd92b29508623fce8570fc625a79df12bd883 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 21 18:27:07 2011 +0930 + + cff-subset: fallback when parsing the charstrings in bare cff fonts fails + + We need to parse all used charstrings in bare CFF fonts to extract the widths. + + src/cairo-cff-subset.c | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +commit c3e990ea7ddc59d73d27d65420062855de265b72 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 16:29:00 2011 +0100 + + observer: correct classification of aligned paths + + We were misclassifying rectilinear paths as aligned strokes, which is + bogus until we analyse the offset path. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit bb3d06a5dc6cd1eef368a9679a67ff8341860ac1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 16:00:13 2011 +0100 + + test: Add shape-general-concave + + A discussion that we've been having is the use of contours in filling, + and for optimizing for convex contours in particular. A devious mind + quickly generates a shape using a convex "contour" whose hull is larger + than its area. This is due to the self-intersection of the "contour" + which if properly excised causes the contour to be classed as concave. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 +- + test/Makefile.sources | 1 + + test/shape-general-convex.c | 88 ++++++++++++++++++++++++++++++++++++++ + test/shape-general-convex.ref.png | Bin 0 -> 3470 bytes + 4 files changed, 90 insertions(+), 3 deletions(-) + +commit 2134306eaf3fda10ca89f0acac9ef6d69888690e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 19 12:22:52 2011 +0100 + + test: Extend rotate-image-surface-paint + + Apply two common clipping methods just to add a little bit of further + complication. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 5 ++ + test/clip-rotate-image-surface-paint.ref.png | Bin 0 -> 202 bytes + test/rotate-clip-image-surface-paint.ref.png | Bin 0 -> 331 bytes + test/rotate-image-surface-paint.c | 73 +++++++++++++++++++++++++++ + 4 files changed, 78 insertions(+) + +commit 9f6820210d992a860c88e2a42c1f4bcd4a2de816 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 19 13:30:46 2011 +0100 + + test: Extend record-extend to exercise similar surface sources + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 ++ + test/record-extend-none-similar.ref.png | Bin 0 -> 293 bytes + test/record-extend-pad-similar.ref.png | Bin 0 -> 298 bytes + test/record-extend-reflect-similar.ref.png | Bin 0 -> 335 bytes + test/record-extend-repeat-similar.ref.png | Bin 0 -> 286 bytes + test/record-extend.c | 112 +++++++++++++++++++++++------ + 6 files changed, 94 insertions(+), 22 deletions(-) + +commit f8f25f52ecbe5934e17eb6ba6dcea9f9359ba83c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 19 12:52:33 2011 +0100 + + test: Add record-mesh + + Test capture and replay of mesh patterns. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/record-mesh.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++ + test/record-mesh.ref.png | Bin 0 -> 15229 bytes + 4 files changed, 168 insertions(+) + +commit 4226bfd695d39cff758491eb792bb85c5395b5dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 19 15:02:11 2011 +0100 + + test: Add big-little-box + + This exercises the bug + + https://bugzilla.mozilla.org/show_bug.cgi?id=668921 + + which is caused by a failure to tighten the extents after tessellating + the path and the unbounded fixup is skipped as it is believed the path + covers the whole area. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 ++ + test/Makefile.sources | 1 + + test/big-little-box.argb32.ref.png | Bin 0 -> 169 bytes + test/big-little-box.c | 69 +++++++++++++++++++++++++++++++++++++ + test/big-little-box.rgb24.ref.png | Bin 0 -> 160 bytes + 5 files changed, 72 insertions(+) + +commit 2eeae45cc71817a803c911f2fba4771bc40d3045 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 19 09:53:40 2011 +0100 + + test: Add checkerboard + + Simply tests the rendering of the checkerboard commonly used as a + background in the test suite. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 +--- + test/Makefile.sources | 1 + + test/checkerboard.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ + test/checkerboard.ref.png | Bin 0 -> 142 bytes + 4 files changed, 50 insertions(+), 3 deletions(-) + +commit 4d6c62514ccd9604af29df0d24e74e5d24f4607d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 13:02:00 2011 +0100 + + observer: bypass surface mid-layer and call into recording surface directly + + As we want to record the exact command pass to us, we want to bypass any + further optimisations that the surface mid-layer might perform before + passing the operation to the recording surface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 115 ++++++++++++++++++++++++++----------------- + 1 file changed, 69 insertions(+), 46 deletions(-) + +commit f49dae8013cf089e18b333a686a7e30c212e4fae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 13:01:01 2011 +0100 + + observer: copy glyphs around call into backend + + As the backend is allowed to modify the glyph array, we need to copy it + for recoding. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +commit cb243acee59be4802153d7e18ef25d24815bb2e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 12:48:25 2011 +0100 + + recording: optionally disable optimise away clears + + The observer wants to get an accurate recording of all operations, + including clears. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles.c | 2 -- + src/cairo-recording-surface-private.h | 1 + + src/cairo-recording-surface.c | 12 ++++++------ + src/cairo-surface-observer.c | 25 +++++++++++++++++++++---- + 4 files changed, 28 insertions(+), 12 deletions(-) + +commit 236cb8aa22f780b24e1d1485dc1f5384946fe181 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 12:01:09 2011 +0100 + + xlib: Fix typo in snapshotting. + + We want to only copy up to the maximum height, not width... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0efdc8d27e40c72b426407b83291a28e5553ffa7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 20 09:36:07 2011 +0100 + + observer: record all operations and their timings + + The immediate use of this is to print out the slowest operation of each + type in a replayable manner. A continuing demonstration of how we may + analyse traces... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-analyse-trace.c | 2 - + src/Makefile.sources | 1 + + src/cairo-recording-surface-private.h | 5 + + src/cairo-recording-surface.c | 90 ++++++++++ + src/cairo-script-private.h | 56 +++++++ + src/cairo-script-surface.c | 51 +++++- + src/cairo-surface-observer-private.h | 9 + + src/cairo-surface-observer.c | 307 ++++++++++++++++++++++++++++------ + 8 files changed, 464 insertions(+), 57 deletions(-) + +commit 713c8069bea1f2391679cbfa611727703a78eb7e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 19 21:13:42 2011 +0100 + + perf: Cleanup target after each run + + As the trace may leak surfaces over its lifetime, we are forced to + teardown the connection between runs. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-trace.c | 351 ++++++++++++++++++++++++------------------------ + 1 file changed, 172 insertions(+), 179 deletions(-) + +commit 5d92ce3a181c439e0b5a160a5820bf20ccaf5414 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 18 15:37:13 2011 +0200 + + xcb-shm: Fix a logic error while allocating mem + + The "continue;" in the old code never worked, because it first checked the loop + condition. Since "FALSE" (hopefully) never evaluates to true, the loop was still + left. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-shm.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 73e7391e6e53b894f763f4715590d3be7e7ec243 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 18 15:20:35 2011 +0200 + + xcb: Handle SHM exhaustion via falling back + + When we couldn't get an image from the X11 server via SHM because we ran out + shared memory, we should try again via a normal GetImage request. + + Fixes: xcb-huge-image-shm + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit aeba5acbad463db3a9eeb44e26a15979d1831472 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 18 15:10:47 2011 +0200 + + test: Add a test that maps a huge surface + + This test currently fails in the xcb backend if xcb-shm is enabled. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/xcb-huge-image-shm.c | 67 ++++++++++++++++++++++++++++++++++++++++ + test/xcb-huge-image-shm.ref.png | Bin 0 -> 97 bytes + 4 files changed, 69 insertions(+) + +commit 8951c51d9e63dc175bc1eff6592833de627bce74 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 18 12:51:28 2011 +0200 + + xcb: Merge two functions for creating shm images + + This merges most of _cairo_xcb_surface_create_similar_image() into + _cairo_xcb_shm_image_create(). + + These two functions where already doing almost the same thing with only some + differences in error handling. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 2 ++ + src/cairo-xcb-surface-core.c | 3 +++ + src/cairo-xcb-surface.c | 46 +++++--------------------------------------- + 3 files changed, 10 insertions(+), 41 deletions(-) + +commit 0da3d3efd21e4a8bf1356c0829ac5b0a30f2df88 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Aug 8 22:35:20 2011 +0200 + + xcb: Fallback to image if allocating SHM fails + + This turns an !!!ERROR!!! for scale-offset-similar with xcb-fallback into a + failed test and might fix other problems. However, since the problem here partly + is a race, those other problems might only be hit sometimes. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2f020c4ade1d26a01605cd908bdaa983e7fe1106 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 18 14:10:20 2011 +0100 + + obsever: include the operation timings + + Seeing the relative amounts of time spent in each operation and the + slowest one of each, gives further insight into the peculiarities of a + trace. And hopefully point out areas of improvement. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + configure.ac | 2 +- + src/cairo-surface-observer-private.h | 29 ++ + src/cairo-surface-observer.c | 646 ++++++++++++++++++++++++++++------- + 3 files changed, 554 insertions(+), 123 deletions(-) + +commit 4d5502503c2c6f3c04cf21750ba71caafecf06d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 18 12:41:20 2011 +0100 + + observer: put a comma between array items when printing + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit d03b0057b2865b2d51f80d874f030e52ee0c4aca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 18 12:37:57 2011 +0100 + + observer: further classify general clips + + A clip with only a single path or can be reduced to a single polygon are + easier to handle than a clip containing a mixture of paths (typically + ANTIALIAS_NONE vs ANTIALIAS_DEFAULT). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-polygon.c | 17 +++++++++++++++++ + src/cairo-clip-private.h | 3 +++ + src/cairo-surface-observer-private.h | 2 +- + src/cairo-surface-observer.c | 11 ++++++++--- + 4 files changed, 29 insertions(+), 4 deletions(-) + +commit 76a3d0dc11624049115cf84859eec5168194e873 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 16 17:20:00 2011 +0100 + + observer: only print out the non-zero clip types + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit a8232ff77cc6eff866494c5a408d914907d643ad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 16 17:18:09 2011 +0100 + + observer: only print out the non-zero path types + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit e4b4b6bfd92000dee2d8384ad64d2e2cfd998bf5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 16 17:15:37 2011 +0100 + + obverser: only print out the active patterns + + I prefer the reduced output as exemplified by the operator message. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit e8ed203da3d132d98c2c1ac73a0ca9955907313e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 16 17:07:52 2011 +0100 + + observer: print path antialias modes + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 75b32d6196ae985434a8fbb0fd0ce63da249cf53 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 16 22:42:35 2011 +0930 + + pdf: change end of line in pdf output from \r\n to \n + + src/cairo-pdf-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c715d52af547741f5e57182331ccd566efcd8835 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 11:50:44 2011 +0100 + + snapshot: restore the order of detach vs callback + + Mucking around in 99fa5ff6c211, I tweaked the order to mark the + snapshot as detached before calling the callback. xcb relies on the old + ordering so that it can correctly update its fallbacks. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2a694a969ca795979c572fd08b877680f579e765 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 11:27:24 2011 +0100 + + observer: print stroke caps/joins frequencies + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 65 ++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 54 insertions(+), 11 deletions(-) + +commit f3b414abfad24219d0fbff531ed994b766a48e0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 11:19:56 2011 +0100 + + observer: print operator frequencies + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 67 insertions(+) + +commit 7ad4c8e711cc4bdae7b22332fb2d4d95ad484e79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 11:06:17 2011 +0100 + + observer: report number of solid patterns first + + As these tend to be the quickest, and putting them first keeps the reports + are in an estimated fast->slow order. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-observer.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 545f30856aac98199a49cf66c72dbcb66c1f3a4f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 09:44:03 2011 +0100 + + stroke: Convert the outlines into contour and then into a polygon + + In step 1 of speeding up stroking, we introduce contours as a means for + tracking the connected edges around the stroke. By keeping track of + these chains, we can analyse the edges as we proceed and eliminate + redundant vertices speeding up rasterisation. + + Coincidentally fixes line-width-tolerance (looks like a combination of + using spline tangent vectors and tolerance). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 2 + + src/cairo-contour-private.h | 159 ++++++ + src/cairo-contour.c | 453 +++++++++++++++ + src/cairo-path-fixed.c | 2 +- + src/cairo-path-in-fill.c | 2 +- + src/cairo-path-stroke-polygon.c | 1205 +++++++++++++++++++++++++-------------- + src/cairo-path-stroke.c | 2 +- + src/cairo-polygon.c | 48 +- + src/cairo-spline.c | 27 +- + src/cairo-types-private.h | 6 +- + src/cairoint.h | 6 + + util/.gitignore | 2 + + util/Makefile.am | 7 +- + util/show-contour.c | 667 ++++++++++++++++++++++ + util/show-polygon.c | 4 + + 15 files changed, 2143 insertions(+), 449 deletions(-) + +commit bbe704406ca97cd51ed1fcc76da7648abde36331 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 08:23:38 2011 +0100 + + stroke: move normal stroker to new file + + Step 1 of enhancing the speed of the stroker is to segregate from the + rest of the complex code. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 1 + + src/cairo-path-stroke-polygon.c | 1002 +++++++++++++++++++++++++++++++++++++++ + src/cairo-path-stroke.c | 12 +- + src/cairoint.h | 8 + + 4 files changed, 1017 insertions(+), 6 deletions(-) + +commit 2e1726a05b7283bc515e215a10c1bfa6ffe33a17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 00:34:35 2011 +0100 + + recording: Defend against bad user-input + + Adjusting the _cairo_surface_is_recording() to check the value + in the backend exposed us to a potential NULL pointer dereference + on validating user-input. So add an explicit status check which + has the added bonus of being more correct! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit edf2d3e8b21e2bcc1bebb7159d71a4f9e4979a6c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 15 00:26:09 2011 +0100 + + check: make check-headers happy + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles-private.h | 1 + + src/cairo-pattern-private.h | 1 + + src/cairo-pdf-operators-private.h | 1 + + src/cairo-rtree-private.h | 1 + + src/cairo-surface-observer-private.h | 2 ++ + src/cairo-surface-snapshot-private.h | 2 ++ + src/cairo-surface-subsurface-private.h | 2 ++ + 7 files changed, 10 insertions(+) + +commit 2220693a40a4f8d13603b3fb29273ec59fd433bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 2 22:31:49 2011 +0100 + + Introduce cairo_mime_surface_t + + The mime surface is a user-callback surface designed for interfacing + cairo with an opaque data source. For instance, in a web browser, the + incoming page may be laid out and rendered to a recording surface before + all the image data has finished being downloaded. In this circumstance + we need to pass a place holder to cairo and to supply the image data + later upon demand. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/Makefile.win32.features | 10 + + build/Makefile.win32.features-h | 1 + + build/configure.ac.features | 1 + + configure.ac | 1 + + src/Makefile.sources | 1 + + src/Makefile.win32.features | 10 + + src/cairo-mime-surface.c | 411 ++++++++++++++++++++++++++++++++++++ + src/cairo.c | 11 +- + src/cairo.h | 89 ++++++-- + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/mime-surface.c | 174 +++++++++++++++ + test/mime-surface.ref.png | Bin 0 -> 1209 bytes + util/cairo-trace/trace.c | 49 +++++ + 14 files changed, 739 insertions(+), 21 deletions(-) + +commit eed1f2efdf36173e23b7177bb34ab9a5f015fb2a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 21:02:08 2011 +0100 + + xml: Include 'cairo-image-surface-private.h' + + Reported-by: James Cloos <cloos@jhcloos.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xml-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 08627ed0f3992de44ed622dea5c4c76117ac24cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 21:01:42 2011 +0100 + + tee: compile fix for migration of _cairo_is_recording_surface() + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tee-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 62e48b01b456ee07081c14ed8f3a1f5475db3b57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 20:56:15 2011 +0100 + + script: enable by default + + I'm willing to make this a supported backend as I find it to be an + invaluable debugging tool... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/Makefile.win32.features | 2 +- + build/Makefile.win32.features | 2 +- + configure.ac | 2 +- + src/Makefile.win32.features | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit eee66899cdbd2d431b08b468ac2b285bb855e6da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 18:11:26 2011 +0100 + + Introduce cairo_surface_observer_t for performance analysis + + Another logging passthrough surface that records the style of operations + performed trying to categorise what is slow/fast/important. + + In combination with perf/cairo-analyse-trace it is very useful for + understanding what a trace does. The next steps for this tool would be + to identify the slow operations that the trace does. Baby steps. + + This should be generally useful in similar situations outside of perf/ + and should be extensible to become an online performance probe. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/Makefile.win32.features | 10 + + build/Makefile.win32.features-h | 1 + + build/configure.ac.features | 1 + + configure.ac | 1 + + perf/.gitignore | 1 + + perf/Makefile.am | 35 +- + perf/Makefile.sources | 3 + + perf/cairo-analyse-trace.c | 646 ++++++++++++++++++++++ + src/Makefile.sources | 2 + + src/Makefile.win32.features | 10 + + src/cairo-surface-observer-private.h | 168 ++++++ + src/cairo-surface-observer.c | 1009 ++++++++++++++++++++++++++++++++++ + src/cairo-surface.c | 12 +- + src/cairo-types-private.h | 6 + + src/cairo.h | 13 + + 15 files changed, 1905 insertions(+), 13 deletions(-) + +commit f6fc6f1ad0315d51b6b395749f8035fb7dcccbbc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 15:29:08 2011 +0100 + + gstate: Copy clusters for an untransformed unbounded surface + + Fixes record-select-font-face + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gstate.c | 2 ++ + src/cairo.c | 18 +++++++++++------- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit 5bc7c059fdbfa4d3c89389f2272a3781c0a4e75e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 14:57:41 2011 +0100 + + script: Hook image caching into the snapshot mechanism + + So that we remember to forget the old image when the surface is dirtied. + + Fixes filter-bilinear-extents. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 74 +++++----------------------------------------- + 1 file changed, 7 insertions(+), 67 deletions(-) + +commit d4a32baed1ffd409a7f46651d6bc7bf7acf43c91 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 14:49:56 2011 +0100 + + surface: Rearrange nothing_to_do? to catch OVER + clear source + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 0053a44f6b9806eb61452859ba1eb2ca8c72f564 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 14:45:00 2011 +0100 + + record: Offset the clip by the replay transformation as well + + Fixes push-group-offset which reduces to a replay of a recording surface + inside a recording surface and forgot to offset the clip imposed by the + extents of the first recording surface into device space. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface-private.h | 15 +++++++++++++-- + src/cairo-recording-surface.c | 14 -------------- + src/cairo-surface-wrapper.c | 15 +++++++++++---- + src/cairoint.h | 3 --- + 4 files changed, 24 insertions(+), 23 deletions(-) + +commit eb09a686388b889f67f3a9b2c820575a1cfbc304 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 13:52:11 2011 +0100 + + xlib: Move the Display pointer nullify into destroy from finish + + Oops, should have checked with more than just the one test before + claiming victory. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-display.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 84a3b6e2d0b8103cdc17558b502ecfc4c99b98a3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 13:47:14 2011 +0100 + + xlib: Mark surfaces as finished when the Display is finished/destroyed/closed. + + Fixes xlib-surface-source with the recording-surface + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-snapshot.c | 5 +- + src/cairo-xlib-display.c | 107 ++++++++++++++++++++------------------- + src/cairo-xlib-private.h | 2 + + src/cairo-xlib-screen.c | 10 ++++ + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 4 ++ + 6 files changed, 76 insertions(+), 53 deletions(-) + +commit 2c885a275349c65ec831738ed917ecd16fdd8c65 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 12:31:12 2011 +0100 + + script: Missed break for creating unbounded recording surfaces. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-script/cairo-script-operators.c | 1 + + 1 file changed, 1 insertion(+) + +commit 0c6b892ce355466b9b7098aadfece0383346de54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 12:08:42 2011 +0100 + + script: take advantage of the polymorphism of the interpreter + + If a function expects a surface but receives a context, it automatically + queries the context's target. We can take advantage of this to short-cut + a few operations. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 35 +++++++++++++++++++---------------- + 1 file changed, 19 insertions(+), 16 deletions(-) + +commit 9dc9f24884e1b580448f12ccd50909b6aee3cb53 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 11:33:27 2011 +0100 + + script: leave the tail of the RGB24 data unmolested + + We clear past the end of the row so that we don't trigger valgrind + warning leaving harmless uninitialised bits inside the input image. + However, for RGB24 the input rowlen is 3*width, whereas we write 4*width + of data, so we need to take account of that and ensure we clear beyond + the end of the written data, not the read data. + + Fixes reading of RGB24 input. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-script/cairo-script-operators.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 23b1a82e88aab0413f832dbf445df5e302f1c30a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 10:25:29 2011 +0100 + + pdf: If the recording surface is unbounded, limit the pattern to the ink extents + + It is better than crashing! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit 3db39deee2f32f005cb4824669e57c56c0e4ca03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 09:47:04 2011 +0100 + + wrapper: Use the backend->snapshot function + + Create the snapshot now, rather than a new lazy snapshot surface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 320f40ef89cc310c932399f54741987b0683af9f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 09:46:26 2011 +0100 + + paginated: Use the backend->snapshot + + The high-level function creates a new lazy snapshot which is not what we + what - we want a snapshot now! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-paginated-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 47874aaceaa49f7b08adaf57e7accb0723668f71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 09:46:01 2011 +0100 + + snapshot: Assert that we do not generate a snapshot clone + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 6 ++---- + src/cairo-surface-snapshot.c | 3 ++- + 2 files changed, 4 insertions(+), 5 deletions(-) + +commit 161836ab499237d1b1a1c5e0a51af15997a7ea0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 01:56:43 2011 +0100 + + ps: unwrap recording surface snapshots + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ps-surface.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit b8f09f08c4ca3569581a3e39056adb0b5a6752ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 01:41:44 2011 +0100 + + analysis: prevent recursion whilst analysing recording patterns + + Thanks to subsurface recursion. There's a pattern here, but no clean + solution has yet presented itself. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 73 ++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 61 insertions(+), 12 deletions(-) + +commit 8f99e926c8b1a8fa7f7e0d828a96bac6dc1fe39c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 01:21:42 2011 +0100 + + paginated: unwrap subsurfaces during context creation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-paginated-surface.c | 8 +++++++- + src/cairo-surface-subsurface-private.h | 12 ++++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +commit 6b3d53646eb7aa3f13a0a6d133ec2ffcd1df8fdd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 00:43:09 2011 +0100 + + image: peek through a snapshot to the recording surface behind + + Fixes record-* after the recent overhaul. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 2 +- + src/cairo-image-surface.c | 8 ++++++-- + src/cairo-pdf-surface.c | 8 ++++---- + src/cairo-script-surface.c | 2 +- + src/cairo-surface-snapshot-private.h | 6 ++++++ + src/cairo-surface-subsurface.c | 2 +- + src/cairo-xcb-surface-render.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + 8 files changed, 21 insertions(+), 11 deletions(-) + +commit 8a90b22897b6460b3396b9959383131039bd9ce2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 14 00:25:15 2011 +0100 + + subsurface+recording: handle recursion + + Ouch, a nasty bug surfaces after rearranging code to fix the others. + Another self-copy loop this time through a subsurface of a recording + surface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 111 ++++++++++++++++++++++++++++++----- + src/cairo-script-surface.c | 129 ++++++++++++++++++++++------------------- + src/cairo-surface-snapshot.c | 12 ++++ + src/cairo-surface-subsurface.c | 105 ++++++++++++++++++--------------- + 4 files changed, 238 insertions(+), 119 deletions(-) + +commit 7971c678f18b9a078dc921e8c9a9d8175038cd1c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 21:47:19 2011 +0100 + + subsurface: call the high-level cairo_surface_flush + + And not the backend directly as this bypasses the extra steps taken in + the higher level to do common actions such as detach snapshots. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-subsurface.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit bca9400aec5c11e402758a2e06c8be560e64b78f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 21:22:21 2011 +0100 + + recording: break self-copy loop + + This is the root cause of the issue why we never succeeded in + implementing deferred snapshot correctly; that is we decoupled the + source from the target in the upper layers before we make the coupling + inside the lowest level of recording surface. By deferring the copy, we + never saw the detach-snapshot in time. + + Fortunately this was only an issue for backends that implemented strong + immutable source semantics! The oversight implies that we need to push + down a similar flush mechanism into all backends. + + Fixes self-copy. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +commit 9f6428c517d222d7e222a5407e6f0b1fe1647c12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 21:15:39 2011 +0100 + + recording: remove the duplicate 'content' field + + Just use the member in the base class. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface-private.h | 2 -- + src/cairo-recording-surface.c | 6 ++---- + src/cairo-script-surface.c | 4 ++-- + src/cairo-surface-subsurface.c | 2 +- + src/cairo-svg-surface.c | 4 ++-- + 5 files changed, 7 insertions(+), 11 deletions(-) + +commit 4a990925e91a91c1d9d5a81f5ad91c1000bf5cce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 20:29:22 2011 +0100 + + script: Support unbounded native recording surfaces + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface-private.h | 12 +++++ + src/cairo-script-surface.c | 98 +++++++++++++++++++---------------- + 2 files changed, 66 insertions(+), 44 deletions(-) + +commit 99fa5ff6c211b96326484f80fe91ead0860c3a23 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 20:07:57 2011 +0100 + + snapshot: Defer acquisition + + Fixes 'xlib-expose-event' but triggers an infinite loop in self-copy. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 3 + + src/cairo-image-surface.c | 33 ++++++++- + src/cairo-pdf-surface.c | 19 ++++-- + src/cairo-script-surface.c | 128 +++++++++++++++++++++++++++-------- + src/cairo-surface-snapshot-private.h | 12 ++++ + src/cairo-surface-snapshot.c | 73 +++++--------------- + src/cairo-surface.c | 6 +- + 7 files changed, 181 insertions(+), 93 deletions(-) + +commit 79aa04fd50463629b3ab2e2efbcd8084038f6c09 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 14 19:19:34 2011 +0930 + + ps: use deflate compression for ps level 3 + + src/cairo-ps-surface.c | 109 +++++++++++++++++++++++++++++++++---------------- + 1 file changed, 74 insertions(+), 35 deletions(-) + +commit 0f4cc1f11804137fb6df8688451fe97428eab47a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 17:39:25 2011 +0100 + + script: Emit sequences of boxes to as 'rectangle' for clarity + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 93 +++++++++++++++++++++++++++++++++++----------- + 1 file changed, 72 insertions(+), 21 deletions(-) + +commit 6b7539d96b0968a00cf91d9d7a780727d37bdd34 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 17:24:28 2011 +0100 + + test/xlib-expose-event: Be kinder to recording surfaces + + And only create the source image once. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/xlib-expose-event.c | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +commit bc34c1c4efb2e252f4263e3fef0024ba92e8d326 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 20:46:21 2011 +0100 + + Add missing 'cairo-image-surface-private.h' + + It was supposed to be the centre point of e849e7c92, but I had a little + battle with git and lost... + + Reported-by: James Cloos <cloos@jhcloos.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface-private.h | 86 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +commit ba406866be320c3a344b4e4a8d4bd19f48fa158d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 15:20:03 2011 +0100 + + stroke: Rely on the tessellator to remove self-intersections + + As handling joins/caps between line segments shorter than + half_line_width is tricky. + + Rather than also fixing the bug in traps, remove that code. The plan is + to avoiding hitting the traps code, short-circuiting several steps along + the fast rectangular paths. + + Fixes line-width-overlap. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 3 + + src/cairo-path-fill.c | 245 ------------ + src/cairo-path-stroke-boxes.c | 658 ++++++++++++++++++++++++++++++++ + src/cairo-path-stroke.c | 812 +--------------------------------------- + src/cairo-stroke-dash-private.h | 70 ++++ + src/cairo-stroke-dash.c | 96 +++++ + src/cairo-surface-fallback.c | 116 +++--- + src/cairoint.h | 13 - + 8 files changed, 884 insertions(+), 1129 deletions(-) + +commit 54c8e8ccfc242fd17144c64202f628c87edbb6f4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 13:24:52 2011 +0100 + + test: Add a couple of variants to line-width-overlap + + The bug may be in only the fast-path, but future bugs may lie elsewhere. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 ++ + test/line-width-overlap-flipped.ref.png | Bin 0 -> 296 bytes + test/line-width-overlap-flopped.ref.png | Bin 0 -> 296 bytes + test/line-width-overlap-offset.ref.png | Bin 0 -> 348 bytes + test/line-width-overlap-rotated.ref.png | Bin 0 -> 866 bytes + test/line-width-overlap.c | 81 +++++++++++++++++++++++++++++++- + 6 files changed, 83 insertions(+), 2 deletions(-) + +commit 829eabfc9531a3e4490760b6bbd33286cd280e95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 16:13:41 2011 +0100 + + test/line-width: Refactor and tidy + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/line-width.c | 27 +++------------------------ + 1 file changed, 3 insertions(+), 24 deletions(-) + +commit 279f6ceb595412bef165a808f05caa3044ef102c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 12:33:21 2011 +0100 + + Only reduce the clip if it is not in active use for the operation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles-private.h | 12 +++++++++--- + src/cairo-composite-rectangles.c | 26 +++++++++++++++++++++++++- + src/cairo-pdf-surface.c | 17 ++++------------- + src/cairo-ps-surface.c | 18 ++++-------------- + src/cairo-recording-surface.c | 7 ++----- + 5 files changed, 44 insertions(+), 36 deletions(-) + +commit d391f0908c404344aa6873fbca2b7bd6499009e0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 12:26:30 2011 +0100 + + pdf: composite-rectangles now require freeing after use + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 301 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 191 insertions(+), 110 deletions(-) + +commit afe84fa77f392a9748319efee01db6b3c6d870fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 12:09:08 2011 +0100 + + pdf: Compute fill-stroke extents first before trying to use it to set the clip + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 47 ++++++++++++++++++++++------------------------- + 1 file changed, 22 insertions(+), 25 deletions(-) + +commit 487c5e4d3a5aa5e723bd7b5d418a6b7a9313f5a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 11:54:19 2011 +0100 + + recording: replay_all is meant to mean REPLAY && ALL! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 73b87334a401a7705f674429d55bb5d0bc559c17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 11:48:37 2011 +0100 + + surface: Don't modify operator + + Specifically don't transform SOURCE into a CLEAR as the paginated + backends may not be able to handle the new operator. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 49 +++++++++++++++++++++---------------------------- + 1 file changed, 21 insertions(+), 28 deletions(-) + +commit a37ed264ed96d1b9f5ebc634d64137b71872c762 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 11:38:03 2011 +0100 + + pdf: Propagate NOTHING_TO_DO + + It is taken care of by the higher layers. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 50 +++++++++---------------------------------------- + 1 file changed, 9 insertions(+), 41 deletions(-) + +commit dea24ef012360877d8c363d283834e76d9938dbb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 11:30:25 2011 +0100 + + surface: propagate internal statuses + + They are internal and used as such, but we still need to prevent them + from escaping into the public domain. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 16 +++++++++++----- + src/cairoint.h | 4 ++-- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit ed324fb3a114faeab4b7844869d2269892a2417e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 11:21:20 2011 +0100 + + recording-surface: Don't store the transient error when returning the path + + As we report the status back to the caller who then decides whether to + take appropriate action. + + "Fixes" user-font. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7a17e4362e3b149ccb3590df690b91974416bfdf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 11:05:45 2011 +0100 + + boilerplate: improve fidelity of surface extraction + + Create an image surface of equivalent content to the original. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 9d5d46e8466f9417febfdefef6707bae9818b02d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 10:59:12 2011 +0100 + + bo-rect: One step too far... + + Fixes a1-rasterisation-rectangles. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4862aadb0fd1e5b7ea2710d56ff4984f3761611d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 10:48:21 2011 +0100 + + surface-wrapper: Initialise clip to NULL + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6d1c0e6d28ef61efbfa8f06f13840fd151cfb07e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 10:04:33 2011 +0100 + + Fix pollution from skia commit + + I forgot to proof-read the patch before pushing and forgot I had left in + some damage from trying to get skia to link using libtool. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + build/Makefile.am.changelog | 2 +- + configure.ac | 3 +-- + perf/Makefile.am | 5 ++--- + 3 files changed, 4 insertions(+), 6 deletions(-) + +commit 1ccd269a3f33684bfbedcd94ad9bca56b1404143 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 24 00:50:33 2010 +0100 + + skia: Update to use cairo_backend_t interface + + Still hopelessly broken. Requires compiling cairo to use static linking + and then still requires manual linkage to workaround libtool. Lots of + functionality is still absent - we need to either find analogues to some + Cairo operations or implement fallbacks - but it is sufficient to + investigate how Skia functions in direct comparison with Cairo for + tessellation/rasterisation. + + Caveat emptor. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + build/Makefile.am.changelog | 2 +- + configure.ac | 15 +- + perf/Makefile.am | 5 +- + src/Makefile.sources | 5 +- + src/cairo-arc-private.h | 4 + + src/cairo-backend-private.h | 1 + + src/cairo-clip-private.h | 1 + + src/cairo-composite-rectangles-private.h | 2 + + src/cairo-error-private.h | 8 +- + src/cairo-freed-pool-private.h | 4 + + src/cairo-skia.h | 18 - + src/cairo-types-private.h | 11 +- + src/cairoint.h | 1 + + src/skia/cairo-skia-context.cpp | 1740 ++++++++++++++++++++++++++++++ + src/skia/cairo-skia-private.h | 110 ++ + src/skia/cairo-skia-surface.cpp | 525 +++++++++ + test/Makefile.am | 4 +- + 17 files changed, 2422 insertions(+), 34 deletions(-) + +commit e849e7c9291d57c3749f499c7e410e7be452b455 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 4 00:19:42 2011 +0100 + + image: move surface definition to new header for subclassing + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 1 + + src/cairo-debug.c | 1 + + src/cairo-ft-font.c | 1 + + src/cairo-gl-composite.c | 4 +- + src/cairo-gl-glyphs.c | 1 + + src/cairo-gl-surface.c | 4 +- + src/cairo-image-surface.c | 47 +++++++++++--------- + src/cairo-paginated-surface.c | 1 + + src/cairo-pattern.c | 1 + + src/cairo-pdf-surface.c | 1 + + src/cairo-png.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-recording-surface.c | 1 + + src/cairo-scaled-font.c | 1 + + src/cairo-script-surface.c | 1 + + src/cairo-surface-fallback.c | 1 + + src/cairo-surface-snapshot.c | 1 + + src/cairo-surface-subsurface.c | 1 + + src/cairo-surface.c | 1 + + src/cairo-svg-surface.c | 1 + + src/cairo-type3-glyph-surface.c | 1 + + src/cairo-xcb-private.h | 2 +- + src/cairo-xcb-surface-core.c | 1 + + src/cairo-xcb-surface-render.c | 1 + + src/cairo-xcb-surface.c | 98 ++++++++++++++++++++--------------------- + src/cairo-xlib-surface.c | 1 + + src/cairo-xlib-xcb-surface.c | 1 + + src/cairoint.h | 28 ++---------- + 28 files changed, 107 insertions(+), 98 deletions(-) + +commit ee001b0b9fcafe14e0650d7b5c6f5e133f9d1e46 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 12 23:26:03 2011 +0100 + + bo-rect: Micro-optimisation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 51 ++++++++++++++------------------- + 1 file changed, 22 insertions(+), 29 deletions(-) + +commit 2e545672ba14fb49455ce501ded21efd18df1a65 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 12 23:49:12 2011 +0100 + + perf/micro: diagonal lines + + The ideal benchmark for spans?... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 3 +- + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/line.c | 219 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 223 insertions(+), 1 deletion(-) + +commit e9d41054f954e84b317ca756edb4cd58dcad6362 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 12 21:58:55 2011 +0100 + + perf/micro: Test wide vs hairline strokes + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 8 +- + perf/cairo-perf.h | 2 + + perf/micro/Makefile.sources | 2 + + perf/micro/many-curves.c | 19 ++++- + perf/micro/many-fills.c | 10 +-- + perf/micro/many-strokes.c | 10 +-- + perf/micro/wide-fills.c | 184 +++++++++++++++++++++++++++++++++++++++++++ + perf/micro/wide-strokes.c | 185 ++++++++++++++++++++++++++++++++++++++++++++ + 8 files changed, 404 insertions(+), 16 deletions(-) + +commit ccbd7281b25f4b25a4c324aa815b94d7de76ac90 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 13 09:22:15 2011 +0100 + + test/line-width: Add a non-antialiased variant + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/a1-line-width.ref.png | Bin 0 -> 154 bytes + test/line-width.c | 38 ++++++++++++++++++++++++++++++++++++-- + 3 files changed, 37 insertions(+), 2 deletions(-) + +commit be1ff2f45fdbc69537e513834fcffa0435e63073 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 12 20:36:13 2011 +0100 + + xlib: Set the clip_region for glyphs + + Broken (never set!) since the clipping overhaul. We could emulate the + xcb code to avoid setting it unnecessarily... + + Fixes partial-clip-test. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-surface.c | 35 ++--------------------------------- + 1 file changed, 2 insertions(+), 33 deletions(-) + +commit e7fcbed63ac19d894cb94fd0a7589f4580a072f1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 11 18:43:56 2011 +0100 + + bo: Perform an initial bucket sort on the start events + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann.c | 47 ++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 38 insertions(+), 9 deletions(-) + +commit 64bcabfe4bcc5d95ee47e0bc7eed5b4544640279 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 11 23:12:44 2011 +0100 + + tor: Micro-optimise + + Inline sub-step edges and combine non-zero/even-odd paths by using a + winding_mask. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 583 ++++++++++++++++------------------------- + 1 file changed, 222 insertions(+), 361 deletions(-) + +commit 02da8c7efb007d046f95456734968d7e9335a7af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 11 13:46:16 2011 +0100 + + default-context: Tidy push-group + + Fix a couple of instances of the older style clipping code. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-default-context.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit a3d2d5b42b769241e888a34c3edd015619560431 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 12 19:02:35 2011 +0100 + + script: Remove reference to image-surface-private + + That header doesn't exist yet. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit e7bd4c93e320325b09e6a2cc8c3d9547c7b0d1f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 12 20:15:19 2011 +0100 + + util/show-traps: Cache the rendering of the traps+edges + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/show-traps.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 86 insertions(+), 14 deletions(-) + +commit b8e8c4cf9a10834923d7185d379d6457687912a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 11 23:12:32 2011 +0100 + + util/show-polygon: Show end-points + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/show-polygon.c | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +commit 99c129dd1302faaa1b10dca494d414a5738ddaf3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 10 14:51:25 2011 +0100 + + test: Add record-extend + + Exercise the extend modes with a clipped paint, because once upon a time + we had a bug... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 + + test/Makefile.sources | 1 + + test/record-extend-none.ref.png | Bin 0 -> 293 bytes + test/record-extend-pad.ref.png | Bin 0 -> 298 bytes + test/record-extend-reflect.ref.png | Bin 0 -> 335 bytes + test/record-extend-repeat.ref.png | Bin 0 -> 286 bytes + test/record-extend.c | 220 +++++++++++++++++++++++++++++++++++++ + 7 files changed, 225 insertions(+) + +commit deb88cca133b4f6ae89061662c06bca0c0573d0e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 10 14:03:10 2011 +0100 + + recording: do not reduce required clips + + When painting with an unbound source, we would miss that the clip + extents were smaller than the mask extents and remove the solitary clip + (believing we were bound by a tight mask). For painting this is + obviously wrong, and due to a combination of bugs that set the mask to + the bound extents and then the failure to spot when that mask was larger + than the clip. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles.c | 2 +- + src/cairo-recording-surface.c | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 69c1ec9f131936ca5fcdb48bd0f957b2c1f6d52c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 10 13:22:58 2011 +0100 + + script: Compile fix + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-script-surface.c | 3 ++- + src/cairo-surface-wrapper.c | 7 +++++-- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit b13266ba0fcd275a5936f31f69405b7e25853ef6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 10 12:50:04 2011 +0100 + + script: Include an operator to replay a recording surface to a file + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-script/cairo-script-operators.c | 42 ++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit 40fa6c867cf371bad4a169abe9a4cea74c431680 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 10 12:43:49 2011 +0100 + + trace: Pop the surface after write-to-png + + It is convenient if the user can simply enable the use of the commented + write-to-png operation just by removing the preceding '%'. However, to + do so we need to make sure that the line is stack-neutral and so need to + pop the surface that we place onto the stack after writing the png. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 34ce4680d12aecc5565e09fcc6a6a9103e1c752d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 23:39:07 2011 +0100 + + fixed: Allow the implicit close of the last fill path to complete a fill-box + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-path-fixed.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f8a30380084ae3d6ac4aa7b18d738d6e6980cb05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 22:21:33 2011 +0100 + + tor: update is-vertical along with min-height + + Similar to the minimum height property, is-vertical can only change + after an insertion or deletion event. So we only need to update the + flags after one of those events, so simply update it along side + min-height. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 24 ++++++++++-------------- + 1 file changed, 10 insertions(+), 14 deletions(-) + +commit d22cf3dfbeebcdd03fc17f367f54b7d2ebed2075 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 20:12:42 2011 +0100 + + perf: add curve + + Time how long it takes to stroke and fill a single Bezier curve. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/curve.c | 108 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 111 insertions(+) + +commit aa6df71228719a5c9f254a58677e3c36b8f7c3b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 19:46:21 2011 +0100 + + perf: add many-curves + + Continuing the theme of stressing the tessellators, draw lots of Bezier + curves! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/many-curves.c | 119 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 122 insertions(+) + +commit 2ef3a50a842b580f0ccd502e321bc32fb5bcff54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 19:00:32 2011 +0100 + + tor: Fix mergesort to handle doubly-linked list + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 36 ++++++++++++++---------------------- + 1 file changed, 14 insertions(+), 22 deletions(-) + +commit b823d4d28fa2d96bd9385809bf9b95466f922f16 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 00:42:04 2011 +0100 + + tor: trivial changes + + Some trivial cleanups that escaped my noticed during a tired review. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +commit 17e34b6eab1faecf46795ae7bf51eee9ffea5d75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 17:57:43 2011 +0100 + + bo-rectangular: Correctly mergesort a doubly-linked list + + Saves having to fixup the pointers afterwards by only having to update + them on the list boundaries during merge. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit a4e4e2bdd74bd686e24f95839a095e1afd280a13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 14:32:09 2011 +0100 + + bo-rectangular: Use a mergesort to speedup insertion + + However, this is only useful for inserting multiple boxes within the + pixel, so we maintain the cached insert cursor as this speeds up the + general case (and aides this optimisation as well). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 244 +++++++++++++++++++++++--------- + 1 file changed, 178 insertions(+), 66 deletions(-) + +commit 014e5e5ec19d1a315e279a6d618ed832f2bd1346 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 13:47:50 2011 +0100 + + bo-rectangular: Eliminate allocation for pqueue + + Since we only allocate a pointer to the rectangle after it is started + and so decoupled from the start queue, we reuse the memory allocated for + the start queue for the stop binary heap. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 260 ++++++++++---------------------- + 1 file changed, 82 insertions(+), 178 deletions(-) + +commit 323e48f8ec2b6de467971d4e4a7fb45f56416e1e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 15:15:41 2011 +0100 + + fill: A horizontal/vertical line is also a degenerate fill box + + Since we discard empty fill boxes whilst filling, we can also treat + horizontal/vertical lines as a filled box and so proceed with the + rectangular fast path in the presence of + cairo_rectangle (x, y, w, h) + with w == 0 || h == 0. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-path-fixed.c | 34 +++++++++++++++++++++------------- + 1 file changed, 21 insertions(+), 13 deletions(-) + +commit 786d4b2a2af53efc6121fd4be04038f2262adf39 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 11:10:52 2011 +0100 + + perf: Add many-fills + + A variant of many-strokes tries to answer the question of how much + overhead is there in stroking, i.e. if we fill an equivalent path to a + set of strokes, do we see an equivalence in performance? + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/many-fills.c | 184 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 187 insertions(+) + +commit 2d8c63671a5eeca2703cab7506ad59144fe74219 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 9 16:06:02 2011 +0100 + + build: Add a missing cairo-backend-private.h + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 1 + + 1 file changed, 1 insertion(+) + +commit 7b97533221aa5713168b9ddefb4a647cff98c510 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Aug 5 21:32:03 2011 +0200 + + map-to-image: Handle non-32bpp formats + + Fixes: map-all-to-image, map-bit-to-image for image16 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/map-to-image.c | 42 ++++++++++++++++++++++++++++++++++++------ + 1 file changed, 36 insertions(+), 6 deletions(-) + +commit 5a26018313f40a832a1ec378c1a137ee4a852742 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Aug 5 22:03:19 2011 +0200 + + map_to_image: Verify the given extents + + User shouldn't be able to use extents that are not completely inside of the + surface's extents. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 03cda5c0e51ec6ef78ee56cb4d72b6213d6d89e4 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Aug 5 21:07:38 2011 +0200 + + xlib-xcb: Fix a double free in surface_unmap + + cairo_surface_unmap_image() destroys the image that was passed to it. Since + xlib-xcb calls cairo_surface_unmap_image() again for the underlying xcb surface, + the surface was destroyed twice. + + Work around this problem by incrementing the image's reference count via + cairo_surface_reference(). + + No idea why I didn't catch this problem when implementing these functions, I'm + sure I ran the relevant tests. :-( + + lt-cairo-test-suite: cairo-surface.c:853: cairo_surface_destroy: Assertion + `((*&(&surface->ref_count)->ref_count) > 0)' failed. + + Fixes: map-to-image-fill map-bit-to-image map-all-to-image + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 73e93078554849673c54d82b229f76bfb918b7d0 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 4 22:51:37 2011 +0200 + + cairo.h: Document CAIRO_DEVICE_TYPE_INVALID + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo.h | 1 + + 1 file changed, 1 insertion(+) + +commit 2d79276c495cd0dba330575ebc11e22646242dd6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 7 21:58:28 2011 +0100 + + tor: Inline reverse insertion sort for handling intersections + + The majority of intersections are with the nearest neighbour only, or + within a few neighbours (in a dense intersection of lines) so if walk + the active list backwards and find the new place to insert upon an + intersection it is faster than performing a mergesort afterwards. + + Given enough intersections, the win is quite huge (15-20% on many-strokes). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 286 +++++++++++++++++++++-------------------- + 1 file changed, 146 insertions(+), 140 deletions(-) + +commit 221c117f5d949896e70b01150249b2111e4b2003 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 7 21:05:40 2011 +0100 + + tor: First perform a bucket sort before merge the sub-edges from the polygon + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 66 +++++++++++++++++++----------------------- + 1 file changed, 29 insertions(+), 37 deletions(-) + +commit f646cb07a93975a67ed3b9ba1b468b014fcf1675 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 7 12:26:41 2011 +0100 + + perf: add the usual special cases to many-strokes + + For completeness, also compare [aligned] horizontal and vertical + strokes. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/micro/many-strokes.c | 110 +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 109 insertions(+), 1 deletion(-) + +commit d953161f881d1e5646574362d296a80afc0ff6e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 7 12:12:10 2011 +0100 + + perf: Add many-strokes + + An intersection variant to exercise the stroker with many, many lines. A + silly benchmark, but a popular one in the wild. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/many-strokes.c | 75 +++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 78 insertions(+) + +commit 4236821d11407eb4af5a02bac78aff1fc19be017 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 6 22:40:32 2011 +0100 + + test: Add unclosed-strokes + + Checks that coincident end-points are not converted to joins. It briefly + passed through my mind that was a good thing... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 3 +- + test/unclosed-strokes.c | 83 ++++++++++++++++++++++++++++++++++++++++++ + test/unclosed-strokes.ref.png | Bin 0 -> 1689 bytes + 4 files changed, 86 insertions(+), 1 deletion(-) + +commit 37e1a1b3ed8ab698d5b58573e1c6a25edc3f1cde +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 6 22:32:47 2011 +0100 + + test: Add a1-sample + + Ensures that only a box that covers the centre pixel is filled with + antialiasing disabled. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/a1-sample.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ + test/a1-sample.ref.png | Bin 0 -> 786 bytes + 4 files changed, 61 insertions(+) + +commit 307cb2a9738374f31d2900e62103524fdf27df42 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 7 09:00:56 2011 +0100 + + util: Add show-polygons + + Another variant of the utility apps that understand the output of + _cairo_debug_print_polygon(). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-debug.c | 3 +- + util/Makefile.am | 7 +- + util/show-polygon.c | 560 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 568 insertions(+), 2 deletions(-) + +commit 61c0f67ee0376e3a2f0d1fbe431d901d9b8cb2c0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 6 11:10:26 2011 +0100 + + test: Add joins-retrace + + The complexity in this shape is that the stroke is reversed upon + itself and retraces the same path in the opposite direction. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/joins-retrace.c | 109 +++++++++++++++++++++++++++++++++++++++++++++ + test/joins-retrace.ref.png | Bin 0 -> 4787 bytes + 4 files changed, 111 insertions(+) + +commit 93c9d4cefb0bfa7846f33e57f395e6944ae878e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 6 10:25:59 2011 +0100 + + test: Add an loopy I-bar stroker test + + A second relatively simple closed concave shape, all the better for + debugging with. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/joins-loop.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/joins-loop.ref.png | Bin 0 -> 4646 bytes + 4 files changed, 102 insertions(+) + +commit b280114c5e87490baf3a0f99fe9d6e051168a6a9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 6 09:15:57 2011 +0100 + + test: Add join-star, another stroker exercise + + A simple convex shape, useful for debugging. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/joins-star.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ + test/joins-star.ref.png | Bin 0 -> 4362 bytes + 4 files changed, 101 insertions(+) + +commit 588e5a24fad80269437aebc36dc316616504edab +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Aug 5 19:44:33 2011 +0200 + + clipper: Fix crashes + + The end of the clip path list is marked with NULL, so we should stop + iterating paths when we reach it. + + The assertion was meant to check if paths had the same content, not if + they have the same address. + + Fixes clip-fill-rule and clip-twice in cairo-quartz. + + src/cairo-surface-clipper.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 9ef003c5fce30956fefb2f4d9a1ded85cb296b4f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 5 18:21:26 2011 +0100 + + clipper: Don't emit an empty clip-path for no clip boxes + + If there are no clip boxes, we do not need to emit an empty clip which + only confuses the users of the surface-clipper. + + Spotted by Andrea Canciani and cairo-quartz + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-clipper.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3424e91ec767c8a8f1c4adb3917759e6c59d409a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 5 17:04:08 2011 +0100 + + test: Add a couple of tests to exercise stroking of short tail segments + + Are the reference images correct? Discuss. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 + + test/Makefile.sources | 2 + + test/caps-tails-curve.c | 127 +++++++++++++++++++++++++++++++++++++++ + test/caps-tails-curve.ref.png | Bin 0 -> 52888 bytes + test/drunkard-tails.c | 135 ++++++++++++++++++++++++++++++++++++++++++ + test/drunkard-tails.ref.png | Bin 0 -> 6273 bytes + 6 files changed, 266 insertions(+) + +commit 8a6d7643f09946b31d14e9bd57276747b025604a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 6 00:24:55 2011 +0930 + + subsets: use show_text_glyphs supplied utf8 to determine latin character + + PS files printed from PDF do not have a cmap in the subsetted + fonts. If the unicode mapping has ben supplied by _show_text_glyphs we + should use this instead of the reverse lookup to determine if the + glyph is a latin chartacter. + + src/cairo-scaled-font-subsets.c | 33 +++++++++++++++++++++++++++++---- + 1 file changed, 29 insertions(+), 4 deletions(-) + +commit 1a4714b61f194d6b69855cfd48dd1a6aff4efda5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 6 00:23:14 2011 +0930 + + ps: use show_text_glyphs + + to ensure that when the PS is converted to PDF the text can be extracted. + + src/cairo-ps-surface.c | 41 +++++++++++++++++++++++++++++------------ + 1 file changed, 29 insertions(+), 12 deletions(-) + +commit b11b89e8e0c6cb0a05c9de69e3235bedc0c27756 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Aug 5 22:09:57 2011 +0930 + + pdf: check if smask is bilevel and encode as such + + src/cairo-pdf-surface.c | 64 ++++++++++++++++++++++++++----------------------- + 1 file changed, 34 insertions(+), 30 deletions(-) + +commit 16bc8d93615ce3e92c86dcbd7fbbcd6de0890ce8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Aug 5 21:15:21 2011 +0930 + + image: check if A8 image is bilevel when analyzing transparency + + src/cairo-image-surface.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit dd73fe9262d206e9dabb2ac8dba84b297248003b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 5 09:45:41 2011 +0100 + + test: Add world-map from the perf-suite + + As we use this a performance benchmark, it behooves us to check that we + are rendering it correctly. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 6 ++ + test/Makefile.sources | 5 +- + test/world-map-fill.image16.ref.png | Bin 0 -> 36582 bytes + test/world-map-fill.ref.png | Bin 0 -> 57308 bytes + test/world-map-stroke.image16.ref.png | Bin 0 -> 41885 bytes + test/world-map-stroke.ref.png | Bin 0 -> 65219 bytes + test/world-map.c | 151 ++++++++++++++++++++++++++ + test/world-map.h | 196 ++++++++++++++++++++++++++++++++++ + test/world-map.image16.ref.png | Bin 0 -> 48377 bytes + test/world-map.ref.png | Bin 0 -> 70611 bytes + 10 files changed, 357 insertions(+), 1 deletion(-) + +commit 1e8d56ceeb7ca3114651ec7c98a69510c9dcc4ff +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 3 15:57:18 2011 +0100 + + perf: Add stroke/fill variants to world-map + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/micro/world-map.c | 42 ++++++++++++++++++++++++++++++++++++------ + 1 file changed, 36 insertions(+), 6 deletions(-) + +commit 5ab1eced5f82c9e54f171afe5bf9a2b72c778e71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 2 14:38:50 2011 +0100 + + bo-rectangular: handle in==out specifically for the single box case + + In this case we do not need to copy anything, but may still need to + re-orientate the box. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +commit 0e135d9f5aa5402ac3566c1fdd1bd13f0e343946 +Author: Nis Martensen <nis.martensen@web.de> +Date: Thu Aug 4 22:08:19 2011 +0200 + + Mark the new API as such + + cairo_surface_create_similar_image, cairo_surface_map_to_image and + cairo_surface_unmap_image were added in + a69335a84eb9225b477cc8c753470eb3805b852c. + + src/cairo-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 95d6235bbecc7a646590edac07d6a68f150b1b8b +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 4 21:18:13 2011 +0200 + + Clarify the API docs for the newest functions + + Recently cairo_surface_create_similar_image(), cairo_surface_map_to_image() and + cairo_surface_unmap_image() were introduced. However, the documentation was + slightly misleading and recommended a wrong usage. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 29 +++++++++++++++-------------- + 1 file changed, 15 insertions(+), 14 deletions(-) + +commit 971d42302cf52fa5007fc1faa94542fcad9bacfb +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Aug 4 21:06:53 2011 +0200 + + perf: Also build the code in perf/micro + + This fixes weird and occasional build failures when updating the source, e.g.: + + cairo-perf-micro.o:(.rodata+0xb0): undefined reference to `hash_table' + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + perf/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 78f7db1a7f668dbcc80366511ecaf9ff30b77a98 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Aug 3 22:29:42 2011 +0200 + + xlib-xcb: Implement the new backend functions + + This implements create_similar_image, map_to_image and unmap. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 41 ++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 38 insertions(+), 3 deletions(-) + +commit 51faa5a1c2d3d13b2d4b63c92ad1f12f63277d10 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Aug 3 21:38:27 2011 +0200 + + surface_unmap_image: Fix fallback + + The fallback code assumed that the caller mapped the complete surface to an + image. If only parts of a surface were mapped, the code didn't correctly + translate and clip its operations. + + Fixes map-bit-to-image for xlib-xcb and improves the result for recording. + + Thanks to Chris Wilson for some simplifications. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +commit 61ae9867ab091c4862cf5481b3c354e02878ea36 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Aug 4 20:49:16 2011 +0930 + + ps: check if images are grayscale or monochrome and encode as such + + Printing PDFs with large monochrome or grayscale images would result + in the images being blown up to 24-bit color images. Some printers are + very slow to print huge color images. + + src/cairo-ps-surface.c | 162 +++++++++++++++++++++++++++++++++---------------- + 1 file changed, 110 insertions(+), 52 deletions(-) + +commit 372ded27c9b9773a34bb8a076d11b13c51532f76 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Aug 4 21:16:14 2011 +0930 + + image: fix bug in analyze_color + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3fbfa1beed291c58daa56b0a962c30b81c4248cb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Aug 2 10:50:51 2011 +0200 + + hash: Code cleanup + + Simplify arrangements by keeping only table sizes, remove some useless + code and fix make check. + + src/cairo-hash.c | 114 +++++++++++++++++++++++++------------------------------ + 1 file changed, 52 insertions(+), 62 deletions(-) + +commit aaa10fbf125a80e5379172b8564384a945728cba +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Aug 2 10:50:00 2011 +0200 + + hash: Improve handling of dead entries + + When there are no free entries to terminate a search, checking that a + key is not in the table requires probing every entry in the table, + i.e. it degenerates in an O(n) operation. + + Rehashing when the number of free entries is less than 25% makes the + expected lookup time O(1). + + The hash-table micro benchmark become 4-6x faster. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=17399 + + src/cairo-hash.c | 91 +++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 53 insertions(+), 38 deletions(-) + +commit 374b26ff03b9f36a7be974e65e42938a3c11b04c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Aug 3 09:49:08 2011 +0200 + + perf: Add hash table benchmark + + A benchmark to test the speed of hash tables when inserting and + removing a huge number of elements. + + Although originally hash tables were assumed not to get many + deletions, in practice they are now being used as caches in multiple + places. This means that they often have a fixed number of live + elements and an element is evicted whenever a new element is inserted + (this happens explicitly for cairo_cache_t objects, but also, for + example, in scaled_font_map + holdovers). This access pattern is very + inefficient with the current implementation. + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/hash-table.c | 107 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 110 insertions(+) + +commit 7b5b29cc0ffc44066589d371d872e355ce56343b +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Aug 2 22:34:54 2011 +0200 + + xcb: Handle deferred clear in _upload_image_inplace + + Fixes: clip-device-offset, image-surface-source, + composite-integer-translate-source, move-to-show-surface, + source-surface-scale-paint, translate-show-surface, perhaps even more? + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit d356deb18201dd8054cff158c95c6fd6f0f38dcd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 2 15:37:50 2011 +0100 + + test: Add a second ring to overlapping-dash-caps + + Demonstrate a second artefact when using SQUARE. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/overlapping-dash-caps.c | 17 +++++++++++++---- + test/overlapping-dash-caps.ref.png | Bin 3127 -> 3982 bytes + 2 files changed, 13 insertions(+), 4 deletions(-) + +commit 3f2126f092d86d3a217fe256df682bb45ee6ab2a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 2 23:10:17 2011 +0930 + + pdf: check if images are grayscale or monochrome and encode as such + + Printing PDFs with large monochrome or grayscale images would result + in the images being blown up to 24-bit color images. Some printers are + very slow to print huge color images. + + src/cairo-image-surface.c | 59 +++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 90 +++++++++++++++++++++++++++++++++++------------ + src/cairo-types-private.h | 8 +++++ + src/cairoint.h | 4 +++ + 4 files changed, 138 insertions(+), 23 deletions(-) + +commit 953a4a2e55e304be4ec1f91aec5131edd02f53f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 2 14:35:36 2011 +0100 + + test: Add an test case to exercise overlapping caps between dash segments + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/overlapping-dash-caps.c | 58 +++++++++++++++++++++++++++++++++++++ + test/overlapping-dash-caps.ref.png | Bin 0 -> 3127 bytes + 4 files changed, 60 insertions(+) + +commit 1e02ffd9a99f0f4917a4bb7c0755cc81f88fc80f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Aug 1 13:56:10 2011 +0200 + + scaled-font: Make unscaled font utility functions static + + They are only used within cairo-scaled-font.c + + src/cairo-ft-font.c | 16 +++++++++++++--- + src/cairo-ft-private.h | 9 --------- + 2 files changed, 13 insertions(+), 12 deletions(-) + +commit daca1d999f487fd089421591061f9bf36d47f11f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Aug 1 10:47:01 2011 +0200 + + scaled-font: Remove _cairo_ft_scaled_font_get_unscaled_font() + + It is unused since 068df654daa74cdf516657af432002471a03c161. + + src/cairo-ft-font.c | 12 ------------ + src/cairo-ft-private.h | 3 --- + 2 files changed, 15 deletions(-) + +commit 400d055f3cd2eecd2cc4b91a40eac4146ec61932 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Aug 1 19:01:16 2011 +0200 + + hash: Compare hash values before calling keys_equal + + If the hash value is different, the keys cannot be equal. Testing this + beforehand can avoid a few function calls and shares this optimization + across all cairo-hash uses. + + src/cairo-hash.c | 31 ++++++++++++++++++++++++++++--- + src/cairo-scaled-font-subsets.c | 11 +---------- + src/cairo-scaled-font.c | 14 +------------- + src/cairo-xcb-connection.c | 11 ++--------- + src/cairo-xcb-screen.c | 6 ------ + 5 files changed, 32 insertions(+), 41 deletions(-) + +commit 02665975d3ef0204bc512de1be55f898637f2d21 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Aug 1 18:18:31 2011 +0200 + + hash: Improve double hashing + + Instead of artificially introducing collisions in the step value by + replacing 0 with 1 (which causes the value 1 to have twice the + frequency of any other value), the step value can simply be computed + as an uniformly distributed value in the range [1, rehash], extremes + included. + + This is safe because any step value smaller than the hash modulus is + co-prime with it, hence induces an orbit which includes every integer + in [0, table_size - 1]. + + src/cairo-hash.c | 18 +++++------------- + 1 file changed, 5 insertions(+), 13 deletions(-) + +commit c5405f732410fe851b8d4c73365336ec2490358b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 1 12:59:11 2011 +0100 + + perf: Save/restore gstate across runs + + Reset the cairo_t to the initial state so that subsequent tests are not + affected by earlier tests. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit c4f4c5726194c9cd800e5d6d9a09c7d01a4dadd7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 1 00:12:24 2011 +0100 + + bo-rectangular: perform an incremental sort + + Bucketing the rectangles together on their top-scanline and then sorting + within that scanline is significantly faster for dragon despite the extra + passes. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 54 ++++++++++++++++++++++++++++++--- + 1 file changed, 50 insertions(+), 4 deletions(-) + +commit fec80f11990adbb4c1220d444186ed600082956d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 31 22:29:48 2011 +0100 + + perf: Add a few more variations to dragon to exercise unaligned lines/spans + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/micro/dragon.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit 4a8f638c9a7772e9e8eaa7246b892eedb1d784d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 31 21:48:47 2011 +0100 + + tor: Suppress repeated spans + + Under certain circumstances we will emit identical spans for when the + edge covers the entire pixel and then for the subsequent pixels. These + can be squashed into a single span. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c0407e84e919bca08f8cd2e1e350e54f36122968 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 31 18:10:40 2011 +0100 + + test: Extend PDF blend tests to include an opacity mask + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 +++ + test/extended-blend-alpha-mask.argb32.ref.png | Bin 0 -> 9221 bytes + test/extended-blend-alpha-mask.rgb24.ref.png | Bin 0 -> 4594 bytes + test/extended-blend-mask.argb32.ref.png | Bin 0 -> 3971 bytes + test/extended-blend-mask.rgb24.ref.png | Bin 0 -> 3643 bytes + test/extended-blend.c | 45 ++++++++++++++++++++++++++ + 6 files changed, 49 insertions(+) + +commit 3520aecfe5567d4f99e299aefec3346879f982aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 31 11:24:20 2011 +0100 + + image: the boxes are already pixel-aligned so skip the extra rounding step + + src/cairo-image-surface.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit d5537547069babb338e7e27b97d219aace4d348a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 31 12:28:33 2011 +0100 + + tor: Sort the initial edge correctly + + Don't assume that the initial edge on the active list has the lower + position. + + src/cairo-tor-scan-converter.c | 40 ++++++++++++++++++++++++++++------------ + 1 file changed, 28 insertions(+), 12 deletions(-) + +commit bca402a8e362f1f93a0866de5dabdca132c04684 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 1 11:45:11 2011 +0100 + + clip: Mark __cairo_clip_all as private and do not export + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e04e3687485a1988fd4084cca07ca4db4e2e7b96 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 11:04:16 2011 +0200 + + Remove useless checks for NULL before freeing + + This patch has been generated by the following Coccinelle semantic patch: + // Remove useless checks for NULL before freeing + // + // free (NULL) is a no-op, so there is no need to avoid it + + @@ + expression E; + @@ + + free (E); + + E = NULL; + - if (unlikely (E != NULL)) { + - free(E); + ( + - E = NULL; + | + - E = 0; + ) + ... + - } + + @@ + expression E; + @@ + + free (E); + - if (unlikely (E != NULL)) { + - free (E); + - } + + perf/cairo-perf-report.c | 3 +-- + perf/cairo-perf-trace.c | 3 +-- + src/cairo-cff-subset.c | 54 +++++++++++++------------------------- + src/cairo-directfb-surface.c | 6 ++--- + src/cairo-ft-font.c | 6 ++--- + src/cairo-gl-surface.c | 3 +-- + src/cairo-gstate.c | 3 +-- + src/cairo-misc.c | 6 ++--- + src/cairo-path.c | 3 +-- + src/cairo-pdf-surface.c | 15 ++++------- + src/cairo-png.c | 6 ++--- + src/cairo-quartz-surface.c | 6 ++--- + src/cairo-scaled-font-subsets.c | 21 +++++---------- + src/cairo-scaled-font.c | 6 ++--- + src/cairo-script-surface.c | 20 ++++++-------- + src/cairo-stroke-style.c | 7 +++-- + src/cairo-surface-fallback.c | 3 +-- + src/cairo-surface.c | 3 +-- + src/cairo-truetype-subset.c | 18 +++++-------- + src/cairo-type1-subset.c | 9 +++---- + src/cairo-win32-font.c | 25 +++++++----------- + src/cairo-win32-printing-surface.c | 3 +-- + src/cairo-xcb-connection-core.c | 3 +-- + src/cairo-xcb-surface-render.c | 3 +-- + src/cairo-xlib-surface.c | 6 ++--- + test/cairo-test-trace.c | 6 ++--- + util/backtrace-symbols.c | 6 ++--- + util/cairo-trace/lookup-symbol.c | 3 +-- + 28 files changed, 88 insertions(+), 168 deletions(-) + +commit 8f8da19fd47a51724e035a076628d38fde48863c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 18:29:29 2011 +0200 + + font-face: Cleanup backend-specific destruction code + + The check for NULL and nil font faces is performed in the shared + code. There is no need to duplicate it (in fact, quartz-font and + ft-font don't do it). + + src/cairo-toy-font-face.c | 4 ---- + src/cairo-win32-font.c | 4 ---- + 2 files changed, 8 deletions(-) + +commit 1f2dc2e06a2c2daabeefbea4c32cdf55bdf6b338 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jul 18 11:19:35 2011 +0200 + + pattern: Do not provide type field in cairo_pattern_union_t + + The type field is accessible through the base.type field. This makes + it possible to change the layout of cairo_pattern_t and move the type + field without breaking cairo_pattern_union_t. + + src/cairo-gstate.c | 2 +- + src/cairo-pattern-private.h | 1 - + src/cairo-pattern.c | 2 +- + 3 files changed, 2 insertions(+), 3 deletions(-) + +commit b39d3d4b53951f951a3af188dd55acf2e0fa8eda +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 15:35:24 2011 +0200 + + surface: Set errors through _cairo_surface_set_status() + + The status should never be set directly. Instead, it should be set by + _cairo_surface_set_status(). + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed928c51fb33d36619d74367b1ebd06300f80417 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 11:44:12 2011 +0200 + + Tighten error validation + + CAIRO_STATUS_LAST_STATUS is not an error, it is just the number of + possible status values. + + src/cairo-error-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 90216cfde01900839a722424ae0047f1fbd0c01f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 15:37:45 2011 +0200 + + Update FSF address + + I updated the Free Software Foundation address using the following script. + + for i in $(git grep Temple | cut -d: -f1 ) + do + sed -e 's/59 Temple Place[, -]* Suite 330, Boston, MA *02111-1307[, ]* USA/51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA/' -i "$i" + done + + src/cairo-backend-private.h | 2 +- + src/cairo-default-context-private.h | 2 +- + src/cairo-pattern-private.h | 2 +- + src/cairo-pdf-shading-private.h | 2 +- + src/cairo-pdf-shading.c | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit f6b30686ca637b504d6caabb40773f1aadcee3fe +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 18:14:51 2011 +0200 + + Fix make check + + This fixes multiple failures when checking if headers can be used + standalone. + + src/cairo-boxes-private.h | 3 +++ + src/cairo-error-private.h | 1 + + src/cairo-surface-wrapper-private.h | 1 + + src/cairo-types-private.h | 1 + + src/cairoint.h | 4 ++-- + 5 files changed, 8 insertions(+), 2 deletions(-) + +commit 5e223c1c73a7c3af550987a30246e7f1761808f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 23:06:48 2011 +0100 + + image: Reduce compositing bounded boxes with a clip-mask to a polygon + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit 7ca1d87645930a2f5e4be36819859928f4e6e601 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 31 00:44:06 2011 +0100 + + tor: Use longjmp to throw an error whilst generating spans + + Similar to the technique used by the other span converters, we can avoid + the frequent error checking by instead throwing an error from the deep + malloc. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-tor-scan-converter.c | 505 ++++++++++++++--------------------------- + 1 file changed, 165 insertions(+), 340 deletions(-) + +commit 1c3b0ebb32eb35d07a7d8b9a4c6849edfc88e3f7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 30 18:46:50 2011 +0100 + + spans: fast-path common case of a single box. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-rectangular-scan-converter.c | 71 ++++++++++++++++++++++++++++++++++ + 1 file changed, 71 insertions(+) + +commit b231bb0a0b971a9b424292be065229ffe234352e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 23:34:58 2011 +0100 + + test: Exercise extend modes with recording patterns + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 8 + + test/Makefile.sources | 1 + + test/recording-surface-extend-none.argb32.ref.png | Bin 0 -> 3051 bytes + test/recording-surface-extend-none.rgb24.ref.png | Bin 0 -> 3128 bytes + test/recording-surface-extend-pad.argb32.ref.png | Bin 0 -> 10822 bytes + test/recording-surface-extend-pad.rgb24.ref.png | Bin 0 -> 12582 bytes + ...recording-surface-extend-reflect.argb32.ref.png | Bin 0 -> 23518 bytes + .../recording-surface-extend-reflect.rgb24.ref.png | Bin 0 -> 23881 bytes + .../recording-surface-extend-repeat.argb32.ref.png | Bin 0 -> 24047 bytes + test/recording-surface-extend-repeat.rgb24.ref.png | Bin 0 -> 24038 bytes + test/recording-surface-extend.c | 174 +++++++++++++++++++++ + 11 files changed, 183 insertions(+) + +commit f3a3c29e2bc1f834089747994b8aba171f4d81d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 23:21:00 2011 +0100 + + paginated: Remove an impossible test + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-paginated-surface.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit c13324311137a01286d1712ac8a33644f294c1ad +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 10:54:07 2011 +0200 + + clip: Fix copy of clip rectangles list + + _cairo_clip_get_region() returns NULL both for non-region clips and + for memory allocaiton failures. They must be distinguished by checking + _cairo_clip_is_region(). + + Fixes get-clip. + + src/cairo-clip.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6155348966b89a216d2e5ee0b4784507a0226a9f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jul 30 09:46:33 2011 +0200 + + default-context: Do not allow restoring pushed gstates + + The brackets defined by push/pop and save/restore are independent ad + should match properly. + + This means that cairo_push()-ed gstates cannot be cairo_restore()-d + and cairo_save()-d gstates cannot be cairo_pop()-ed. + + Fixes group-state. + + src/cairo-default-context.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0ae32437af5e73ad61eba1447dd32dd525c39808 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 22:00:10 2011 +0100 + + image: Free clip_surface after use + + The clip surface is no longer cached on the clip and the caller is + responsible for destroying it after use. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 2342e4da4fdbeed5672d586742fa19cf1018264c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 18:36:52 2011 +0100 + + image: extend support of direct replay for paginated surfaces + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 72 +++++++++++++++++++++++++++++++++++-------- + src/cairo-paginated-private.h | 3 ++ + src/cairo-paginated-surface.c | 12 +++++++- + 3 files changed, 74 insertions(+), 13 deletions(-) + +commit d2ea8bd070f3bff87ec952af490093375cbc1f05 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 19:12:55 2011 +0200 + + build: Respect CFLAGS and LIBS env settings + + The build system does not honor the flags set externally and replaces + it with the pthread-only flags when detecting pthread + availability. This breaks the configuration of cairo in some + cross-compilation environments: + + conftest.c:1: note: someone does not honour COPTS correctly, passed 0 times + + The test for pthread should append the new flags to the old one. + + build/configure.ac.pthread | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b2ee7d9a21df56bf68851930448bc91f49a93e3d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 17:14:42 2011 +0100 + + trace: Emit the content type for image surfaces + + Currently we only emit the format, but if you want to later convert + the images to a normal surface for replay it is handy to have the + content. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +commit 6448022a05682eb77f69d621c76532c4447f6a27 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 16:29:10 2011 +0100 + + xcb: Convert the box back to integer coordinates for uploading the image + + Silly bug of the day. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 40 ++++++++++++++++++++++------------------ + 1 file changed, 22 insertions(+), 18 deletions(-) + +commit 0660f62fe5ffdd86eedf8262f3ac50fb039491c1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 15:28:49 2011 +0100 + + gl: Rectilinear fast path + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 186 ++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 185 insertions(+), 1 deletion(-) + +commit c2150b344123823098a57a0653b9857f7dc8c8d6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 15:06:20 2011 +0100 + + gl: Rectangular fast path + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-compiler-private.h | 13 +- + src/cairo-gl-composite.c | 331 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 20 +++ + src/cairo-gl-surface.c | 137 ++++++++++------- + src/cairo-recording-surface.c | 10 +- + 5 files changed, 443 insertions(+), 68 deletions(-) + +commit 7fbe430e2a6aa8131b11f874731507be28c629b1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jul 29 21:51:04 2011 +0930 + + ps: remove unnecessary flush + + that was preventing string of glyphs from separate calls to + cairo_show_glyphs() being merged. + + src/cairo-ps-surface.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 488c94220d46f10a0fa8fa4dfb1beda88d80988e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 13:12:48 2011 +0100 + + ps: Apply the clip reduction techniques from pdf + + If the clip wholly covers the operation, we do not need to set one, and + if the current clip similarly covers the operation we do not to unset + it. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ps-surface.c | 36 ++++++++++++++++++++++++++++++++---- + 1 file changed, 32 insertions(+), 4 deletions(-) + +commit ccf67c7d748aa10005fb47b4d565c34e41c1a327 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 13:06:49 2011 +0100 + + pdf: Don't remove the current clip if redundant + + If the surface already has a clip set and that clip does not interfere + with the operation then we can leave it set. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 6ed0c6224b763e9cbcfb0d46f188883d8425bab5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 13:03:59 2011 +0100 + + pdf: Remove redundant clip regions + + If the extents of the operation is wholly contained within the clip + region, then we can safely not invoke any clipping. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-surface.c | 27 +++++++++++++++++++++------ + 1 file changed, 21 insertions(+), 6 deletions(-) + +commit 29a302cc4bc7734129bca8fe242dc7ecb626895d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 12:57:31 2011 +0100 + + clipper: Also need to guard against the incoming clip being NULL + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-clipper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fb9ed9bb0d3a4d4ac71f5d472f63a04ffbc4c110 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 12:35:36 2011 +0100 + + clip: Fix clip-equal to handle one or the other being NULL/all-clipped + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 7c6e1b8db89420fa69ebd8d2ba12dde1aeb47ea8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 12:33:07 2011 +0100 + + xcb: Short-circuit multiplying the alpha mask by 1.0 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 4032c86127a5f1658c2bddbf1c642fb62e21a208 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 12:31:14 2011 +0100 + + fallback: Prevent recursion when combining with the clip + + We need to special case the handling of unaligned clip regions in order + to prevent the treatment of those as a general path requiring a + clip+mask... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-fallback.c | 129 ++++++++++++++++++++++++++++++++++++------- + 1 file changed, 109 insertions(+), 20 deletions(-) + +commit 2787ef4e73fe668edbb938aa82ab569789a39116 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 22 17:58:14 2011 +0100 + + pattern: Complete the list of possible pattern errors + + A mesh pattern is put in CAIRO_STATUS_INVALID_MESH_CONSTRUCTION when + an invalid patch construction operation is performed. + + A mesh pattern is put in CAIRO_STATUS_INVALID_INDEX when an operation + is performed with an out-of-bound index. + + Any pattern is put in CAIRO_STATUS_INVALID_MATRIX when its matrix is + set to a singular matrix. + + src/cairo-pattern.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit c1b0e73578fe2528c8e68e309fd602acaef42e67 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 12:06:02 2011 +0100 + + record: Only reduce fill+stroke if the clip doesn't change between the commands + + Pointed out by Adrian Johnson. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6ec24760b32da5ca1f0a67f6ff344b91f8bc020c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 5 21:37:40 2011 +0200 + + device: Flush on a finished device is a no-op + + In order to have a behavior which is coherent with that of surfaces, + flushing a finished devices should be a no-op and should not affect + the status of the device. + + src/cairo-device.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 74a86a76a9c32a74d63712b718c90669889820e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 11:57:01 2011 +0100 + + clipper: Detect a incremental change in the general clip-path + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-clipper.c | 34 ++++++++++++++++++++++++++++++---- + 1 file changed, 30 insertions(+), 4 deletions(-) + +commit aac9b261762cdb8039daedfe63a56a83faa0155f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 11:42:59 2011 +0100 + + clip: Fix cairo_clip_equal() + + In haste, I completely removed the implementation... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip.c | 36 +++++++++++++++++++++++++++++++++++- + 1 file changed, 35 insertions(+), 1 deletion(-) + +commit ecafad7149cb80bad56cc042ced4bb06c106ce1a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 29 11:18:36 2011 +0100 + + record: Assume recording surface targets are clear + + The replay of the recording surface will not function correctly unless + the target surface region is already clear. So assume that is and + optimise away the initial clear. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface-private.h | 2 -- + src/cairo-recording-surface.c | 39 ++++++++++++++++------------------- + 2 files changed, 18 insertions(+), 23 deletions(-) + +commit 81efbc1847c4b9c08440d76bbc1636b21cac16d8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 11:33:46 2011 +0200 + + quartz: Silence some clang warnings + + Clang static analysis relies on the Core Foundation naming convention + for the object ownership tracking. + + Functions that return an object whose ownership is given to the + caller, should contain "Create" or "Copy" in their name. + + src/cairo-quartz-surface.c | 50 ++++++++++++++++++++++------------------------ + 1 file changed, 24 insertions(+), 26 deletions(-) + +commit 93c8b1090b887847c44780ea0e311a454e7978c1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 11:56:40 2011 +0200 + + cff-subset: Do not use garbage values + + The code incorrectly initialized the fields of the data structure, + which are about to be overwritten, instead of the temporary variables + which are used to compute them. + + src/cairo-cff-subset.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ad3ef3a8fb560a2bd528ccd15469bbe9a1ddcee8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 10:46:42 2011 +0200 + + Silence Clang static analyzer reports + + Clang static analysis triggers some reports in non-buggy code. + + Silence them trying to follow better coding practices. + + src/cairo-script-surface.c | 2 ++ + src/cairo-xcb-shm.c | 6 +++++- + src/cairo-xcb-surface-render.c | 3 +-- + src/cairo-xcb-surface.c | 2 +- + 4 files changed, 9 insertions(+), 4 deletions(-) + +commit e8e765605c2ae69710affadd3f450aef17932258 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 10:46:14 2011 +0200 + + Silence gcc warnings + + perf/micro/dragon.c | 1 - + 1 file changed, 1 deletion(-) + +commit 15b6b2832b373cd09986d2f9595f9930b256894d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 10:44:57 2011 +0200 + + directfb: Unbreak compilation + + The recent changes to the clip code caused build failure in directfb. + + src/cairo-directfb-surface.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 89cb071d14f02f062d6960b9c49bced8212d032b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 29 10:39:43 2011 +0200 + + script: Initialize recording extents + + The 2-arguments recording operator was passing a garbage pointer to + the surface creation function. + + Spotted by the clang static analyzer. + + util/cairo-script/cairo-script-operators.c | 1 + + 1 file changed, 1 insertion(+) + +commit e06a3b97618ec19a26003fd02bc6054f11039ef4 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 29 10:27:31 2011 +0200 + + xcb: Handle fallback in map_to_image + + Fixes (for xcb-fallback): map-all-to-image map-bit-to-image map-to-image-fill + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 27702768bf684ed7c91b505451414237af0f5853 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 29 10:18:55 2011 +0200 + + xcb: _get_image only works without fallback + + This turns the test suite-failures for map-all-to-image map-bit-to-image + map-to-image-fill with xcb-fallback into failed assertions. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 1beab6cca431c0c4a9e9feda6121922fa7f71623 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 29 10:09:10 2011 +0200 + + xcb: Handle deferred clear in map_to_image + + Fixes: map-all-to-image map-bit-to-image map-to-image-fill + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +commit 8f8149a2073e1e290b6f854595caaf27bd16a80b +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 28 18:18:07 2011 +0200 + + xcb: Error on 0x0 source surfaces + + Recording surfaces can be unbounded which causes + _cairo_surface_acquire_source_image to return a 0x0 image surface for them. + Since X11 doesn't like anything with a size of 0x0, we should reject such source + images. Users might still try to mess with 0x0 surfaces, so we will eventually + need a better idea for handling this. + + Instead of failing the assertion that was added in the previous commit, this + commit makes cairo-xcb return an error. + + This makes the recording-* tests fail instead of crash. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 5d72e59982edc21f3e15c46dc77408bce849e4f3 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jul 27 20:30:12 2011 +0200 + + xcb: Assert that pixmap sizes are positive + + Currently, all the recording-* tests fail with an X11 error. This commit turns + those errors into failed assertions. Now someone just has to figure out why this + happens in the first place... + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection-core.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit ec74912eeeb08a32170bbbf3a83290f21171c730 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 28 17:21:33 2011 +0100 + + record: Recording surfaces need an explicit clear + + As a recording surface will be replayed onto a destination target, it is + unknown at the time of creation as to whether or not the target is + clear. So we need to make sure to record any initial clear in order + to replay that clear onto the destination. (If the destination is clear + anyway it will be suppressed.) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 65e13cd20154f1f19b2d06ea7cf8779b0fb2158b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 28 17:16:25 2011 +0100 + + record: We can only skip the clear so long as we know the destination is clear + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7abdab931c1219314c07c0ecf21b0afef19108a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 18:58:03 2011 +0200 + + polygon: Fix generic case of edge clipping + + The edge clipper is more complicated than it should be and contains a + subtle bug: when an edge is almost horizontal, it is always considered + as having a positive slope. + + Explain what should be done and do it in a simpler way. + + Fixes horizontal-clip. + + src/cairo-polygon.c | 127 +++++++++++++++++++++------------------------------- + 1 file changed, 51 insertions(+), 76 deletions(-) + +commit 6aa6b7daa8277785f431a07fe3d8d492d62df946 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 18:57:59 2011 +0200 + + polygon: Simplify code for edge clipping + + Add some comments about what's going on and clean up the branches by + sharing common computations. + + src/cairo-polygon.c | 80 ++++++++++++++++++++++------------------------------- + 1 file changed, 33 insertions(+), 47 deletions(-) + +commit de25fec06bbdbb3cf458aefb4e3b9d2271022b9c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 21:50:45 2011 +0200 + + test: Improve horizontal-clip + + The bug pointed out by this test now causes failures in xcb and xlib. + + test/horizontal-clip.c | 39 ++++++++++++++++++++------------------- + test/horizontal-clip.ref.png | Bin 115 -> 129 bytes + 2 files changed, 20 insertions(+), 19 deletions(-) + +commit 80b7a1aa9b600aa3cc746d662b4090e76838f17a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 22:13:44 2011 +0200 + + test: Update image references + + Makefile.refs was missing some images. + + test/Makefile.refs | 4 ++++ + 1 file changed, 4 insertions(+) + +commit aad2c3dd0f7a512e6d3db087bf94ab53e30e92ed +Author: Matt Peterson <revcompgeek@gmail.com> +Date: Wed Jul 27 14:48:31 2011 -0600 + + gl: Use cairo_rectangle_int_t + + src/cairo-gl-glyphs.c | 10 ++++++++-- + src/cairo-gl-surface.c | 12 +++++++----- + 2 files changed, 15 insertions(+), 7 deletions(-) + +commit 96abd9b887a4d663950b79d055572f9f2f09efbe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 28 16:42:41 2011 +0100 + + record: And remember to offset the index of unbounded playback + + When we don't generate the set of visible indices, we need to iterate + over all the currently active commands and so need to offset the + iterator to the start of those commands. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fe34d7041aae57af5a49ba7b6e8ca64ff774dcad +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 19:03:11 2011 +0100 + + record: Use a bbtree to reduce is-visible checking overheads + + By using a bounding-box rtree, we are able to reject invisible branches + of the tree and so find the visible leafs with fewer intersection + checks. Overhead reduction is strongly dependent upon the ability to + spatially partition the geometry and so performance correlates with + small tiles and small operations. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-combsort-private.h | 23 +++ + src/cairo-recording-surface-private.h | 11 ++ + src/cairo-recording-surface.c | 321 ++++++++++++++++++++++++++++++++-- + 3 files changed, 344 insertions(+), 11 deletions(-) + +commit 1b888c4c3a3f7002dc092fd48088cd0b5031e12c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 27 19:48:36 2011 +0100 + + test: Add horizontal clip test + + Doesn't actually hit the code path but it should... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/horizontal-clip.c | 76 +++++++++++++++++++++++++++++++++++++++++++ + test/horizontal-clip.ref.png | Bin 0 -> 115 bytes + 3 files changed, 77 insertions(+) + +commit 44140e3dd692938ac3823eb6f4f295788716bb8b +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jul 27 19:54:30 2011 +0200 + + Make _cairo_xcb_surface_get_extents no_warn + + This function never fails. However, since it's used to implement a operation for + cairo_surface_backend_t, the return value can't be void. This commit instead + uses cairo_private_no_warn to get rid of the warnings. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8877ca23f5781741669bd5a7e072840a5c6658b5 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jul 27 19:52:58 2011 +0200 + + xcb: Check that the extents are inside our surface + + The previous commit fixed a bug in cairo-xlib found by a similar assert, so this + seems to be a good idea to have. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 73e8384ac82ef7721096a78db998d6a658a44c33 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jul 27 18:30:37 2011 +0200 + + xlib: Fix a typo + + This was introduced in a69335a84eb9225b477cc8c75. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=39581 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cac96c8083214f8e5aa65e9a527f9fa3e813b149 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 27 17:02:53 2011 +0100 + + polygon: Fix clipping of edges outside of their range + + Uli Schlachter analysed the error behind the polygon reduction and + discovered that it was due to the clipping of a line which intersects + the clip box (p1, p2) but is range limited by (top, bottom) to be inside + the clip box. + + Fixes hatching + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 030de5144d6c84b2b690e178ecc03a9bddb52181 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 27 17:00:48 2011 +0100 + + polygon: Don't skip clipped horizontal edges + + As Andrea Canciani pointed out even if it is horizontal within the clip + box, it may still have vertical extents outside of the clip box for + which we need to project onto the clip boundary in order to maintain + the correct polygon winding. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-polygon.c | 3 --- + 1 file changed, 3 deletions(-) + +commit fc98fd9db5a619013ffcd671aacb5b8494443c8d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 09:22:31 2011 +0200 + + win32: Fix typos in documentation + + The documentation of the win32 surface backend contained a typo, + pointed out by Andrej Mitrovic in + http://lists.cairographics.org/archives/cairo/2011-July/022084.html + + Another imprecision was found reviewing the public API documentation. + + src/cairo-win32-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2fd20e5c1e3a54cfe060820f1841b92743891607 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 09:10:19 2011 +0200 + + surface: Check image parameter in cairo_surface_unmap_image() + + The image argument must be a cairo-image surface. + + src/cairo-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 3f9717347eebbb0f0d517b215f763d738c4a476c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 27 09:10:34 2011 +0200 + + win32: Constify + + Silences some compiler warnings. + + src/cairo-surface-subsurface.c | 2 +- + src/cairo-win32-printing-surface.c | 6 +++--- + src/cairoint.h | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 9ef178ff350b68c7a7983429e07ff10f4ea0b265 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 26 22:14:22 2011 +0200 + + win32: Fix compilation + + a69335a84eb9225b477cc8c753470eb3805b852c broke compilaiton of win32 + surfaces because of some typos. + + src/cairo-win32-surface.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 87016112c5ce486607b5e28ad873cda3d1db65ec +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 26 20:48:55 2011 +0200 + + Fix surface backend structures + + a69335a84eb9225b477cc8c753470eb3805b852c introduced some new members + in the backend structure, but quartz, qt and xlib-xcb were not + updated. + + src/cairo-qt-surface.cpp | 7 ++++++- + src/cairo-quartz-surface.c | 7 ++++++- + src/cairo-xlib-xcb-surface.c | 7 ++++++- + 3 files changed, 18 insertions(+), 3 deletions(-) + +commit ca53fed93953821f3bc95e1d8b142128c8c1bba8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 26 20:51:30 2011 +0200 + + quartz: Silence const cast warnings + + b132fae5e843c329d1414d1a65b2e8d66b99852f const-ified some arguments, + but missed others. + + src/cairo-quartz-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b492b69d4f6e4fba41558b1ca066203c4e88c856 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 16:37:29 2011 +0100 + + wrapper: translate the clip by the device transform + + A stepping stone, the translation was accidentally dropped when + changing the clipping to be performed first. + + Fixes twin. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 91faf9c1cf79f44b48c0f14d2d551a68bf38b5a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 15:50:32 2011 +0100 + + composite: Pass unbounded extents to initialisation + + For an unbounded surface we cannot assume (0, 0, surface_width, + surface_height) as that is wrong and causes the operation to appear + clipped. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles-private.h | 24 +++++++------- + src/cairo-composite-rectangles.c | 33 ++++++++----------- + src/cairo-image-surface.c | 56 ++++++++++++++++---------------- + src/cairo-pdf-surface.c | 42 +++++++++++++----------- + src/cairo-ps-surface.c | 29 ++++++++++------- + src/cairo-recording-surface.c | 21 +++--------- + src/cairo-surface-fallback.c | 19 +++-------- + src/cairo-xcb-private.h | 4 +++ + src/cairo-xcb-surface-render.c | 29 +++++++++-------- + src/cairo-xcb-surface.c | 2 +- + 10 files changed, 123 insertions(+), 136 deletions(-) + +commit a69335a84eb9225b477cc8c753470eb3805b852c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 22 00:36:03 2011 +0100 + + API: map-to-image and create-similar-image + + A common requirement is the fast upload of pixel data. In order to + allocate the most appropriate image buffer, we need knowledge of the + destination. The most obvious example is that we could use a + shared-memory region for the image to avoid the transfer cost of + uploading the pixels to the X server. Similarly, gl, win32, quartz... + + The other side of the equation is that for manual modification of a + remote surface, it would be more efficient if we can create a similar + image to reduce the transfer costs. This strategy is already followed + for the destination fallbacks and this merely exposes the same + capability for the application fallbacks. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-analysis-surface.c | 12 +- + src/cairo-directfb-surface.c | 7 +- + src/cairo-error-private.h | 9 + + src/cairo-gl-surface.c | 5 +- + src/cairo-image-surface.c | 37 ++- + src/cairo-os2-surface.c | 6 +- + src/cairo-paginated-surface.c | 7 +- + src/cairo-pdf-surface.c | 7 +- + src/cairo-ps-surface.c | 7 +- + src/cairo-quartz-image-surface.c | 7 +- + src/cairo-recording-surface.c | 7 +- + src/cairo-rectangle.c | 10 + + src/cairo-script-surface.c | 7 +- + src/cairo-surface-snapshot.c | 5 +- + src/cairo-surface-subsurface.c | 80 +++++- + src/cairo-surface.c | 182 +++++++++++++ + src/cairo-svg-surface.c | 7 +- + src/cairo-tee-surface.c | 7 +- + src/cairo-type3-glyph-surface.c | 7 +- + src/cairo-vg-surface.c | 5 +- + src/cairo-win32-printing-surface.c | 7 +- + src/cairo-win32-surface.c | 66 ++++- + src/cairo-xcb-private.h | 9 +- + src/cairo-xcb-surface-core.c | 2 - + src/cairo-xcb-surface-render.c | 2 - + src/cairo-xcb-surface.c | 422 ++++++++++++++--------------- + src/cairo-xlib-surface.c | 133 ++++----- + src/cairo-xml-surface.c | 6 +- + src/cairo.h | 93 ++++--- + src/cairoint.h | 24 +- + src/test-fallback-surface.c | 6 +- + src/test-fallback16-surface.c | 6 +- + src/test-null-surface.c | 6 +- + src/test-paginated-surface.c | 6 +- + src/test-wrapping-surface.c | 6 +- + test/Makefile.sources | 1 + + test/map-all-to-image.ref.png | Bin 0 -> 86 bytes + test/map-bit-to-image.ref.png | Bin 0 -> 103 bytes + test/map-to-image-fill.ref.png | Bin 0 -> 103 bytes + test/map-to-image.c | 126 +++++++++ + util/cairo-script/cairo-script-operators.c | 96 +++++++ + util/cairo-trace/trace.c | 92 +++++++ + 42 files changed, 1169 insertions(+), 361 deletions(-) + +commit c6812c6a3679c3b8b9584e119e0d7fd93e09ae49 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 12:00:53 2011 +0100 + + rectangle: speed up the is-intersecting test. + + cut'n'paste before coffee. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairoint.h | 16 ++++------------ + 1 file changed, 4 insertions(+), 12 deletions(-) + +commit 168b5a5348beb66977e5948c43a1e4855c24d95b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 09:03:37 2011 +0100 + + wrapper: target to recording needs the inverse transform + + Gah, I thought about this and noted that I need the inverse of the + normal transformation, yet failed to remember to actually use it. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +commit c596483f854a14840ee591304ce08dee3f0edeee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 08:33:09 2011 +0100 + + record: Check the operation against the target device extents. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 11 ++++++++-- + src/cairo-surface-wrapper-private.h | 4 ++++ + src/cairo-surface-wrapper.c | 44 +++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 18 +++++++++++++++ + 4 files changed, 75 insertions(+), 2 deletions(-) + +commit 8ba8534d6225a4340acd1469858067e40f48acc3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 26 08:02:59 2011 +0100 + + record: Store the untransformed operation extents along with the command + + This allows us to actually clip out the geometry before we record it, as + suggested by allowing the user to supply an extents... But it will be + advantageous in later patches for reducing the amount of work we need to + perform to replay. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip.c | 7 - + src/cairo-recording-surface-private.h | 3 +- + src/cairo-recording-surface.c | 295 +++++++++++++++++++++++----------- + src/cairo-rectangle.c | 7 + + src/cairoint.h | 2 + + 5 files changed, 210 insertions(+), 104 deletions(-) + +commit f5d602cb59ad8eec19dc07043635a50eb7616e09 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 19:45:31 2011 +0100 + + xcb: Make composite_opacity_boxes slightly less silly + + Being called with no clip, might be unexpected, but it means to fill the + whole extents with the opacity. So do so. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit 8dc9139fb291605f93ce8409aa203c87d3a5d035 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 18:10:43 2011 +0100 + + recording: Combine the clip to the recording + target surface extents + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 40 +++++++++++++++++-------------------- + src/cairo-surface-wrapper-private.h | 6 +++--- + src/cairo-surface-wrapper.c | 15 +++++++------- + 3 files changed, 28 insertions(+), 33 deletions(-) + +commit 15d5014efd8f3b4d01feb39259f2df0e69ac1b46 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 17:36:51 2011 +0100 + + clip: Short-cut the common condition of intersecting with a single box + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 52e3814824235ff236bc013f9adc85ed85eb8fb8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 17:31:39 2011 +0100 + + clip: Skip processing of rectangle-intersection if it wholly subsumes the clip + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +commit 4c72c4df661b4cc24f40d8719da15a13adc7bb9b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 16:27:07 2011 +0100 + + wrapper: Correct translation of clip for wrapper extents + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-private.h | 3 +++ + src/cairo-clip.c | 36 ++++++++++++++++++++++++++++++++++++ + src/cairo-surface-wrapper.c | 23 ++++++++--------------- + 3 files changed, 47 insertions(+), 15 deletions(-) + +commit cc745f5c2f5a513e195a9a3b66e4428ec932bfe3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 15:48:27 2011 +0100 + + wrapper: show-text-glyphs can now operate on constant array of glyphs + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper-private.h | 4 ++-- + src/cairo-surface-wrapper.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 415d5d8fce8b685a92eef7d0ae2568e1ee7e02e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 15:45:57 2011 +0100 + + wrapper: Use the stack for small glyph allocations + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +commit 8102bd868105770a97e7d895b76b1b3ad40dcee9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 15:33:21 2011 +0100 + + wrapper: Factor out the common clip handling + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 231 ++++++++++++++------------------------------ + 1 file changed, 73 insertions(+), 158 deletions(-) + +commit 87e9c8a5ea84bd00311a6a6ea3cea1fd87823172 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 15:10:18 2011 +0100 + + recording: Move the glyph allocation into the wrapper after checking clip status + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 21 +---------- + src/cairo-surface-wrapper.c | 88 +++++++++++++++++++++++++++++-------------- + 2 files changed, 60 insertions(+), 49 deletions(-) + +commit 59612847e31ac6f22f7a59c57ff39c179aab9bca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 15:08:03 2011 +0100 + + xcb: set the right members of cairo_color_t for generating the opacity mask + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +commit 080f81bf5c360398a9376cf75ed245603483236b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 13:05:55 2011 +0100 + + image: Fix clip-intersect + + Explicitly convert the clearing of the unbounded area. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 19 ++++++++++++------- + src/cairoint.h | 8 ++++++++ + 2 files changed, 20 insertions(+), 7 deletions(-) + +commit e4b3f84d4c3f23ad6e33bb53dcc3a88f480977c0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 13:05:24 2011 +0100 + + test: Add clip-intersect + + Exercises a bug in the unbounded drawing of an empty polygon... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/Makefile.sources | 1 + + test/clip-intersect.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ + test/clip-intersect.ref.png | Bin 0 -> 201 bytes + 4 files changed, 96 insertions(+) + +commit 4d5c95f6296b606c7fba31a75211129119ad9e2c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 10:41:10 2011 +0100 + + test: Exercise replaying basic painting paths + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 10 + + test/Makefile.sources | 1 + + test/paint-with-alpha-clip-mask.ref.png | Bin 0 -> 333 bytes + test/paint-with-alpha.c | 34 ++ + test/record-fill-alpha.ref.png | Bin 0 -> 2728 bytes + test/record-paint-alpha-clip-mask.ref.png | Bin 0 -> 333 bytes + test/record-paint-alpha-clip.ref.png | Bin 0 -> 302 bytes + test/record-paint-alpha-solid-clip.ref.png | Bin 0 -> 248 bytes + test/record-paint-alpha.ref.png | Bin 0 -> 256 bytes + test/record-paint.ref.png | Bin 0 -> 116 bytes + test/record-select-font-face.ref.png | Bin 0 -> 2473 bytes + test/record-self-intersecting.ref.png | Bin 0 -> 168 bytes + test/record-text-transform.ref.png | Bin 0 -> 6200 bytes + test/record.c | 485 +++++++++++++++++++++++++++++ + 14 files changed, 530 insertions(+) + +commit 2b19dd3fbd9ea8d44c9cccbb9ae28b81992b4483 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 10:09:43 2011 +0100 + + recording: Only look for a fill-stroke operation if the target supports one + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-recording-surface.c | 78 ++++++++++++++++++------------------- + src/cairo-surface-wrapper-private.h | 6 +++ + 2 files changed, 45 insertions(+), 39 deletions(-) + +commit dc67d8e7f907062c7d0f02b57498c7503cb72f69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 10:03:48 2011 +0100 + + composite: Perform a quick is-clipped for glyphs + + Computing the exact bbox of the glyphs and whether they are overlapped + is expensive. However, we can often check whether they are visible just + by looking at the maximal extents of the fonts along with the bbox of + the positions; much cheaper. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-composite-rectangles.c | 11 +++++++++++ + src/cairo-scaled-font.c | 27 +++++++++++++-------------- + src/cairo.h | 8 ++++---- + 3 files changed, 28 insertions(+), 18 deletions(-) + +commit 05bed4c574a9e6577bca93bfce837804c3dc6d19 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 01:05:40 2011 +0100 + + scaled-font: Single glyph extent computations are worryingly frequent + + But easy to optimise. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 45 insertions(+) + +commit 5ac9e3e2812a240e9e1b19ccf2199784d5739ced +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 10:05:43 2011 +0100 + + freed-pool: Enlarge the freed cache + + Clips end up recursing more than 4 levels and so we need a larger stash + to avoid mallocs. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-freed-pool-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 04ef07ee3bdeab9b2b3d74547214c6735ebb27b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 24 00:58:06 2011 +0100 + + clip: Embed a single box to avoid a common allocation + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 61 ++++++++++++++++++++++++++++-------------------- + src/cairo-clip-private.h | 2 ++ + src/cairo-clip.c | 33 ++++++++++++++++++-------- + 3 files changed, 61 insertions(+), 35 deletions(-) + +commit 926287aeeae8e96d96cdc18c829eef6430c270db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 22:57:48 2011 +0100 + + surface-wrapper: Fix use of uninitialised variable + + Introduced recently in a30a7402f73485dabdb6a016178247f9844017a1, + + ==32234== Conditional jump or move depends on uninitialised value(s) + ==32234== at 0x6BCA326: _cairo_surface_wrapper_needs_device_transform (cairo-surface-wrapper.c:549) + ==32234== by 0x6BCB47D: _cairo_surface_wrapper_set_inverse_transform (cairo-surface-wrapper.c:579) + ==32234== by 0x6BCB55A: _cairo_surface_wrapper_init (cairo-surface-wrapper.c:621) + ==32234== by 0x6BB87A6: _cairo_recording_surface_replay_internal (cairo-recording-surface.c:854) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface-wrapper.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7f77e2f36a0803e3ec08bc70f4923bb2d043658e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 22:48:15 2011 +0100 + + trace: Create a new opcode for recording surface + + During replay we want to handle recording surfaces specially, and not + redirect the creation of those to the target surface. This is similar to + the need to keep image surfaces as images during replay. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-script/cairo-script-operators.c | 64 ++++++++++++++++++++++++++++++ + util/cairo-trace/trace.c | 11 +---- + 2 files changed, 66 insertions(+), 9 deletions(-) + +commit 1578530557481346f98f449d0f2885a7c985a222 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 19:45:30 2011 +0100 + + region: Directly handle single rectangle creation in create_rectangles() + + In order to avoid the copy and transformation of the single rectangle, + we can simply pass it to pixman and create the region from it. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-region.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit 69e52c670739f23ceb344a780dbc04f3cacebf56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 15:51:49 2011 +0100 + + tests: Another missing ref, this time clip-disjoint-hatching + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 1 + + test/clip-disjoint-hatching.ref.png | Bin 0 -> 8794 bytes + 2 files changed, 1 insertion(+) + +commit 9b039a65a6edca50f7ad350d3b0b4301ce35adc0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 15:48:10 2011 +0100 + + tests: Missing ref images for new recording-surface test + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 3 +++ + test/recording-surface-over.ref.png | Bin 0 -> 3072 bytes + test/recording-surface-source.argb32.ref.png | Bin 0 -> 3044 bytes + test/recording-surface-source.rgb24.ref.png | Bin 0 -> 3133 bytes + 4 files changed, 3 insertions(+) + +commit 7e42276ffc52c417f8119517485b609ef7f7743e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 15:13:42 2011 +0100 + + image: Apply mask-opacity to clip boxes + + In the simple condition where the user is applying an opacity mask to a + misaligned rectangle, we can treat it as a series of simpler composites + by combining the opacity with the coverage of the box. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 445 +++++++++++++++++++++++++++++++--------------- + 1 file changed, 299 insertions(+), 146 deletions(-) + +commit a30a7402f73485dabdb6a016178247f9844017a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 12:19:17 2011 +0100 + + image: replay the recording surface directly onto the target + + 백현기 reported a use-case where he was recording an entire web-page + onto the recording surface, in order to facilitate panning. In this + scenario, where there may be lots of similar surfaces within the + recording we generate thousands of unused snapshot-images bloating + memory usage and impairing performance. + + Under the right conditions we can replay directly onto the destination + which not only bypasses the snapshots but also skips the following + resampling. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 17 +++ + src/cairo-clip-private.h | 15 +++ + src/cairo-clip.c | 67 +++++++++++- + src/cairo-image-surface.c | 64 +++++++++++- + src/cairo-recording-surface-private.h | 6 ++ + src/cairo-recording-surface.c | 68 ++++++++---- + src/cairo-surface-wrapper-private.h | 13 +++ + src/cairo-surface-wrapper.c | 190 ++++++++++++++++++++-------------- + 8 files changed, 337 insertions(+), 103 deletions(-) + +commit bff8e22eb6b7faeac04ca585cb739e7880a3335c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 14:11:42 2011 +0100 + + image: Fix partial clipping of text + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 82 ++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 63 insertions(+), 19 deletions(-) + +commit c2dada9722df2aa56a625679ea21f1356b33c758 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 15:32:40 2011 +0100 + + test: Add a paint-with-alpha variant to test clip-boxes fast path + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 4 +- + test/paint-with-alpha-clip.ref.png | Bin 0 -> 302 bytes + test/paint-with-alpha-clip.xlib.ref.png | Bin 0 -> 303 bytes + test/paint-with-alpha-solid-clip.ref.png | Bin 0 -> 248 bytes + test/paint-with-alpha.c | 63 ++++++++++++++++++++++++++++--- + 5 files changed, 60 insertions(+), 7 deletions(-) + +commit 5de02329370257290404dae244cb14ac544140d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 14:22:19 2011 +0100 + + test: Extend recording-surface-pattern to include a SOURCE operator test + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 26 ++-- + test/recording-surface-over.gl.argb32.ref.png | Bin 0 -> 3130 bytes + test/recording-surface-over.image16.ref.png | Bin 0 -> 2856 bytes + test/recording-surface-over.pdf.argb32.ref.png | Bin 0 -> 3908 bytes + test/recording-surface-over.pdf.rgb24.ref.png | Bin 0 -> 3760 bytes + test/recording-surface-over.ps.argb32.ref.png | Bin 0 -> 3064 bytes + test/recording-surface-over.ps.rgb24.ref.png | Bin 0 -> 3147 bytes + test/recording-surface-over.quartz.argb32.ref.png | Bin 0 -> 4570 bytes + test/recording-surface-over.quartz.rgb24.ref.png | Bin 0 -> 4058 bytes + test/recording-surface-over.rgb24.ref.png | Bin 0 -> 3162 bytes + test/recording-surface-over.svg.argb32.ref.png | Bin 0 -> 3778 bytes + test/recording-surface-over.svg.rgb24.ref.png | Bin 0 -> 3760 bytes + test/recording-surface-over.xlib.argb32.ref.png | Bin 0 -> 3055 bytes + test/recording-surface-over.xlib.rgb24.ref.png | Bin 0 -> 3124 bytes + test/recording-surface-pattern.c | 149 +++++++++++++-------- + test/recording-surface-pattern.gl.argb32.ref.png | Bin 3130 -> 0 bytes + test/recording-surface-pattern.image16.ref.png | Bin 2856 -> 0 bytes + test/recording-surface-pattern.pdf.argb32.ref.png | Bin 3908 -> 0 bytes + test/recording-surface-pattern.pdf.rgb24.ref.png | Bin 3760 -> 0 bytes + test/recording-surface-pattern.ps.argb32.ref.png | Bin 3064 -> 0 bytes + test/recording-surface-pattern.ps.rgb24.ref.png | Bin 3147 -> 0 bytes + ...recording-surface-pattern.quartz.argb32.ref.png | Bin 4570 -> 0 bytes + .../recording-surface-pattern.quartz.rgb24.ref.png | Bin 4058 -> 0 bytes + test/recording-surface-pattern.ref.png | Bin 3072 -> 0 bytes + test/recording-surface-pattern.rgb24.ref.png | Bin 3162 -> 0 bytes + test/recording-surface-pattern.svg.argb32.ref.png | Bin 3778 -> 0 bytes + test/recording-surface-pattern.svg.rgb24.ref.png | Bin 3760 -> 0 bytes + test/recording-surface-pattern.xlib.argb32.ref.png | Bin 3055 -> 0 bytes + test/recording-surface-pattern.xlib.rgb24.ref.png | Bin 3124 -> 0 bytes + 29 files changed, 108 insertions(+), 67 deletions(-) + +commit abd8fcc833eedc916addbd688a40303e4c78affd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 23 14:11:12 2011 +0100 + + test: Expand partial-clip-text + + Test partial clipping along each edge. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 11 ++-- + test/partial-clip-text-bottom.ref.png | Bin 0 -> 263 bytes + test/partial-clip-text-left.ref.png | Bin 0 -> 303 bytes + test/partial-clip-text-right.ref.png | Bin 0 -> 156 bytes + test/partial-clip-text-top.ps.ref.png | Bin 0 -> 107 bytes + test/partial-clip-text-top.quartz.ref.png | Bin 0 -> 174 bytes + test/partial-clip-text-top.ref.png | Bin 0 -> 173 bytes + test/partial-clip-text-top.svg.ref.png | Bin 0 -> 173 bytes + test/partial-clip-text.c | 86 +++++++++++++++++++++++++++--- + test/partial-clip-text.ps.ref.png | Bin 107 -> 0 bytes + test/partial-clip-text.quartz.ref.png | Bin 174 -> 0 bytes + test/partial-clip-text.ref.png | Bin 175 -> 0 bytes + test/partial-clip-text.svg.ref.png | Bin 173 -> 0 bytes + 13 files changed, 85 insertions(+), 12 deletions(-) + +commit abf97c8874430e40439aae254b16a79dc3d81c4d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jul 22 21:37:01 2011 +0930 + + Check glyph_index range in _index_to_glyph_name + + A broken font such as the PDF file at + https://bugzilla.gnome.org/show_bug.cgi?id=638011 can mean there are + less glyph names in the array than there should be. + + src/cairo-ft-font.c | 4 +++- + src/cairo-win32-font.c | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit aa646e47f31cabff6731aa0212d6b9de55823fad +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 21 19:54:46 2011 +0200 + + Use new pixman formats + + b132fae5e843c329d1414d1a65b2e8d66b99852f introduced the usage of two + new pixman formats. This requires pixman 0.22, but makes it possible + to fix some TODO's left behind in gl and vg. + + configure.ac | 2 +- + src/cairo-gl-surface.c | 14 +++++--------- + src/cairo-vg-surface.c | 6 +++--- + 3 files changed, 9 insertions(+), 13 deletions(-) + +commit b60694cbc75f87a8dbc454bbbe2f663f3132d28d +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 17:15:08 2011 +0200 + + xcb: Work around wrong extent computation in the X server + + This is basically the same fix as e6c3efdd650a. However, this was lost in + b132fae5e843 and thus had to be fixed again. + + Fixes: clip-fill-eo-unbounded clip-fill-nz-unbounded + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit e2150185fc85a8b3c786b8a9ac5606c42f8af167 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 17:53:39 2011 +0200 + + xcb: Unset the deferred_clear flag on fallback + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit de686f1938d19001d287e15f0bb72a01cbff4171 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 17:50:47 2011 +0200 + + xcb: Handle deferred_clear in _get_image + + Fixes: arc-infinite-loop clip-all clip-empty-group clip-fill-no-op + pattern-getters + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit adf026fffece49e6ae5939d53b2ec3fbc1d914cc +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 17:33:13 2011 +0200 + + xcb: Fix a NULL dereference + + This fixes a crash in the hatchings test case. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 1aa077e129485789803ad050f461067b4fe374d7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jul 4 12:36:23 2011 +0200 + + xcb,xlib: Cleanup GC cache handling + + Device mutexes guarantee the consistency between multiple threads, + hence GC cache does not rely anymore on atomic operations. + + This makes it possible to avoid bit twiddling and to use a simple + array. + + src/cairo-xcb-private.h | 7 +++++-- + src/cairo-xcb-screen.c | 13 ++++++------- + src/cairo-xlib-private.h | 6 ++++-- + src/cairo-xlib-screen.c | 16 ++++++++-------- + 4 files changed, 23 insertions(+), 19 deletions(-) + +commit 5eb8eacde0ec3267e55e9b63a33ed2d4642867a7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 21 18:01:34 2011 +0100 + + xcb: Always send a clip region along with clipped glyphs + + As we do not control the geometry used for the individual glyphs, we + must always send a clip-region so that X can trim the glyph + appropriately. However, in order to avoid sending unnecessary data we + only do so if the clip extents is less than the ink extents of the + glyphs. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 23 +++++++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +commit 93ab2171d036166d333d6d3f1ab15f346803d49c +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 16:50:48 2011 +0200 + + xcb: Parse $CAIRO_DEBUG just like cairo-xlib does + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +commit 0858533419dc1a38ef7c2bf6e07fb89714af5598 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 16:03:36 2011 +0200 + + Xlib,xcb: Make *_debug_[sg]et_precision() more robust + + This adds checks for NULL pointers, devices in an error state and devices which + aren't owned by the right backend. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 22 ++++++++++++++++++---- + src/cairo-xlib-display.c | 22 ++++++++++++++++++---- + src/cairo-xlib-xcb-surface.c | 22 ++++++++++++++++++++++ + 3 files changed, 58 insertions(+), 8 deletions(-) + +commit 7c2ccef3eb636661ee45c501c8345b6bde9a827c +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 15:41:25 2011 +0200 + + xcb: Make it possible to undo _cairo_xcb_device_debug_cap_* + + We now remember the original flags before any call to + cairo_xcb_device_debug_cap_xshm_version() or + cairo_xcb_device_debug_cap_xrender_version() was done and re-set these flags on + any new call to these functions. This makes it possible to raise e.g. the used + RENDER version again. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 12 ++++++++++++ + src/cairo-xcb-private.h | 15 ++++++++++++++- + 2 files changed, 26 insertions(+), 1 deletion(-) + +commit 83df0ab2b6ccaf623303b606a99303b5d054b145 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Jul 21 15:28:18 2011 +0200 + + XCB: Store the flags per-connection only + + Every xcb surface had its own copy of the flags from the time that it was + created. This means that, if you want to make use of + cairo_xcb_device_debug_cap_xrender_version() and + cairo_xcb_device_debug_cap_xshm_version(), you first had to create a dummy xcb + surface, use that to get access to the cairo_device_t so that you can use these + functions and only then create your real surface, because the change only + affected new surfaces. + + This commit changes everything to use the connection's flag and removes the + per-surface flags. This avoids the dummy surfaces completely. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 45 ++++++++++------------------ + src/cairo-xcb-private.h | 1 - + src/cairo-xcb-surface-render.c | 58 ++++++++++++++++++------------------- + src/cairo-xcb-surface.c | 10 +++---- + 4 files changed, 49 insertions(+), 65 deletions(-) + +commit 99628d06cd7943bf20e84a050595c33da6e3ff7d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 21 15:37:31 2011 +0100 + + gstate: Handle NULL clip for in_clip() + + A NULL clip implies no clipping at all, and therefore every point is + inside. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gstate.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 69cc802e61cd49871b84547131e59b99c9e48640 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 21 13:42:30 2011 +0100 + + Fix proxying of ->context_create() + + Adrian Johnson found that I had broken show_page() and pinpointed the + cause to being that cairo_show_page() was being called on the recording + surface and not the pagination surface after my overhaul for + cairo_backend_t. In fact, the problem was far more severe as the mistake + caused the created context to point to the wrong surface entirely, + bypassing the surface proxy. + + What is desired is for the proxy's target surface to choose what manner + of context is should use, but for all calls into the surface backend to + go through the proxy surface. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-paginated-surface.c | 2 +- + src/cairo-surface-subsurface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 8938f58e7065fe89d46d0bebc28143f0e7e72f48 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jul 21 21:50:29 2011 +0930 + + type1-subset: Subset the subroutines + + src/cairo-type1-subset.c | 415 ++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 338 insertions(+), 77 deletions(-) + +commit f6043b06d658d307b9e3ac36f14d049f0a8664bf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jul 21 21:17:18 2011 +0930 + + Add support for subsetting bare CFF fonts + + This avoids fallback when using poppler cairo for printing PDFs with + CFF fonts. + + The current CFF subsetting only works with Opentype/CFF fonts. CFF + fonts inside PDF files are usually embedded as a bare CFF font without + the Opentype wrapper. + + Making the CFF subset work with bare CFF fonts requires doing a bit of + extra work to extract the fontname, font bbox, and glyph widths from + the CFF data instead of using the Opentype tables. + + src/cairo-cff-subset.c | 577 +++++++++++++++++++++++++++++++++++++++---------- + src/cairo-ft-font.c | 12 +- + 2 files changed, 478 insertions(+), 111 deletions(-) + +commit 6b3e5cd39c81941a73ed709eadf8beae5407dc05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 20 14:32:10 2011 +0100 + + xcb: Reduce one pass for masking, now just 2 passes required! + + Another 10% off fishbowl for both snb and pnv. + + [Note this exposes the bugs in the polygon clipper; naive *and* broken.] + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 259 ++++++++++++++++++++++++++++++++++++----- + 1 file changed, 228 insertions(+), 31 deletions(-) + +commit a585a092ee188381c0f0e93e9eee03cf1fed3692 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 20 15:28:34 2011 +0100 + + xcb: squash initial ChangePicture request for precision + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 11 ++++++++++- + src/cairo-xcb-surface.c | 5 ++++- + 2 files changed, 14 insertions(+), 2 deletions(-) + +commit d5d4a0f24031580db93d3b7909482687458718e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 19 11:29:49 2011 +0100 + + xcb: Take advantage of clip-boxes + + A demonstration of step 2, improves performance for selected benchmarks + on selected GPUs by up to 30%. + + firefox-fishbowl on snb {i5-2520m): 42s -> 29s. + firefox-talos-gfx on snb: 7.6 -> 5.2s. + firefox-fishbowl on pnv (n450): 380 -> 360s. + + Whist this looks like it is getting close to as good as we can achieve, + we are constrained by both our API and Xrender and fishbowl is about 50% + slower than peak performance (on snb). + + And it fixes the older performance regression in firefox-planet-gnome. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-xcb.c | 92 +++- + src/cairo-boxes-intersect.c | 5 +- + src/cairo-clip-private.h | 3 + + src/cairo-clip.c | 32 ++ + src/cairo-composite-rectangles-private.h | 4 + + src/cairo-composite-rectangles.c | 33 ++ + src/cairo-debug.c | 10 + + src/cairo-xcb-private.h | 1 + + src/cairo-xcb-surface-render.c | 777 +++++++++++++++++++++---------- + src/cairo-xcb-surface.c | 1 + + 10 files changed, 691 insertions(+), 267 deletions(-) + +commit b419fdcacd636dc2274695f922f758a8b521ca01 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 20 10:53:19 2011 +0100 + + clip-boxes: Intersection with 0 boxes means clip-all + + Fixes clip-fill-no-op + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip-boxes.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 41190afacfb53eebc2e47d6d5924c91080293e7f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 20 10:30:19 2011 +0100 + + win32: Fixup clip-mask fallback after API changes + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-win32-surface.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 3d1ee0e22dc0483189dc427b530418cbc3212810 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jul 20 19:08:38 2011 +0930 + + analysis: CAIRO_INT_STATUS_NOTHING_TO_DO should not cause fallback + + src/cairo-analysis-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 12b27778e230eb078c19d695ad11db713963aa25 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jul 20 19:05:33 2011 +0930 + + ps: Don't return CAIRO_INT_STATUS_NOTHING_TO_DO for empty glyphs + + src/cairo-ps-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit aaa1ed81c20b359cf2d96fe1831273d91abeeb9b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jul 20 18:36:21 2011 +0930 + + win32: Fix build breakage + + src/cairo-win32-private.h | 4 ++-- + src/cairo-win32-surface.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 73ff0de345f0974652de4888220fa12ed86c08a5 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jul 20 10:55:32 2011 +0200 + + xlib-xcb: Fix 'incompatible pointer type' warnings + + This was introduced in b132fae5e843c329d14. + + Fixes warnings of the following kind: + + cairo-xlib-xcb-surface.c:261:5: warning: initialization from incompatible + pointer type + cairo-xlib-xcb-surface.c:261:5: warning: (near initialization for + '_cairo_xlib_xcb_surface_backend.paint') + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit ac9482bdf00ec2295273ec69d3bca3e93e2ce183 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jul 20 10:42:52 2011 +0200 + + xcb: Fix a GC leak when a screen is finished + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-screen.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit c28196d9451f006b91906b68564f3959ce48af46 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Jul 18 20:03:18 2011 +0200 + + xcb: Fix _set_clip_region for many rectangles + + Fixes a failed assert in the hatchings test. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 34 +++++++++++++++++++++++++++------- + 1 file changed, 27 insertions(+), 7 deletions(-) + +commit 4fd20fe903ebd698ec6d6fe0741d3dffb4eca74f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jul 20 08:37:03 2011 +0930 + + Remove HAS_FT_FONT from cairo-scaled-font-subsets-private.h + + Should have been removed when the FT dependency was removed from type 1. + + src/cairo-ps-surface.c | 19 ------------------- + src/cairo-scaled-font-subsets-private.h | 5 ----- + 2 files changed, 24 deletions(-) + +commit b132fae5e843c329d1414d1a65b2e8d66b99852f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 21:19:54 2011 +0100 + + clip: Rudimentary support for clip-polygon extraction + + Step 1, fix the failings sighted recently by tracking clip-boxes as an + explicit property of the clipping and of composition. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 7 + + src/cairo-analysis-surface.c | 98 +- + src/cairo-bentley-ottmann-rectangular.c | 4 +- + src/cairo-bentley-ottmann-rectilinear.c | 2 +- + src/cairo-boxes-intersect.c | 666 +++++++++++++ + src/cairo-boxes-private.h | 27 + + src/cairo-boxes.c | 78 ++ + src/cairo-cff-subset.c | 14 +- + src/cairo-clip-boxes.c | 559 +++++++++++ + src/cairo-clip-polygon.c | 127 +++ + src/cairo-clip-private.h | 149 +-- + src/cairo-clip-region.c | 117 +++ + src/cairo-clip-surface.c | 142 +++ + src/cairo-clip.c | 1414 ++++------------------------ + src/cairo-composite-rectangles-private.h | 19 +- + src/cairo-composite-rectangles.c | 54 +- + src/cairo-debug.c | 37 +- + src/cairo-default-context.c | 5 +- + src/cairo-error-private.h | 54 ++ + src/cairo-error.c | 4 + + src/cairo-fixed-private.h | 6 + + src/cairo-font-face-twin.c | 31 +- + src/cairo-ft-font.c | 52 +- + src/cairo-gl-glyphs.c | 134 ++- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-surface-legacy.c | 601 ++++++++++++ + src/cairo-gl-surface.c | 126 +-- + src/cairo-gstate-private.h | 2 +- + src/cairo-gstate.c | 206 ++--- + src/cairo-image-info.c | 2 + + src/cairo-image-surface.c | 507 +++------- + src/cairo-misc.c | 2 +- + src/cairo-paginated-surface.c | 27 +- + src/cairo-path-bounds.c | 1 + + src/cairo-path-fill.c | 112 ++- + src/cairo-path-stroke.c | 34 +- + src/cairo-pattern.c | 4 +- + src/cairo-pdf-operators-private.h | 14 +- + src/cairo-pdf-operators.c | 12 +- + src/cairo-pdf-surface.c | 82 +- + src/cairo-png.c | 2 +- + src/cairo-polygon-intersect.c | 1466 +++++++++++++++++++++++++++++ + src/cairo-polygon-reduce.c | 1491 ++++++++++++++++++++++++++++++ + src/cairo-polygon.c | 111 +++ + src/cairo-ps-surface.c | 41 +- + src/cairo-quartz-surface.c | 28 +- + src/cairo-recording-surface-private.h | 5 +- + src/cairo-recording-surface.c | 82 +- + src/cairo-scaled-font-subsets-private.h | 4 +- + src/cairo-scaled-font-subsets.c | 8 +- + src/cairo-scaled-font.c | 14 +- + src/cairo-script-surface.c | 73 +- + src/cairo-spans.c | 29 + + src/cairo-surface-clipper-private.h | 5 +- + src/cairo-surface-clipper.c | 122 ++- + src/cairo-surface-fallback-private.h | 14 +- + src/cairo-surface-fallback.c | 259 ++---- + src/cairo-surface-offset-private.h | 14 +- + src/cairo-surface-offset.c | 102 +- + src/cairo-surface-subsurface.c | 79 +- + src/cairo-surface-wrapper-private.h | 16 +- + src/cairo-surface-wrapper.c | 228 ++--- + src/cairo-surface.c | 82 +- + src/cairo-svg-surface.c | 42 +- + src/cairo-tee-surface.c | 30 +- + src/cairo-tee.h | 2 +- + src/cairo-tor-scan-converter.c | 22 +- + src/cairo-traps.c | 95 +- + src/cairo-truetype-subset.c | 11 +- + src/cairo-type1-fallback.c | 2 +- + src/cairo-type3-glyph-surface.c | 40 +- + src/cairo-types-private.h | 11 +- + src/cairo-user-font.c | 9 +- + src/cairo-win32-printing-surface.c | 12 +- + src/cairo-win32-surface.c | 8 +- + src/cairo-xcb-private.h | 38 +- + src/cairo-xcb-surface-cairo.c | 14 +- + src/cairo-xcb-surface-render.c | 615 +++++------- + src/cairo-xcb-surface.c | 28 +- + src/cairo-xlib-surface.c | 32 +- + src/cairo-xml-surface.c | 27 +- + src/cairoint.h | 79 +- + src/test-null-surface.c | 16 +- + src/test-paginated-surface.c | 14 +- + src/test-wrapping-surface.c | 14 +- + test/clip-group-shapes-circles.ref.png | Bin 1510 -> 1511 bytes + test/clip-shape.ref.png | Bin 2935 -> 3094 bytes + test/clip-stroke.ref.png | Bin 1447 -> 1439 bytes + 88 files changed, 7469 insertions(+), 3501 deletions(-) + +commit f58ade7bace8c82d0ea6740f56d227696181d616 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 19 21:14:08 2011 +0100 + + ps: Add HAS_FT_FONT guards for type1 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ps-surface.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 29d19c683b99b6bc3f59e771c273a32721995887 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 19 07:50:47 2011 +0200 + + build: Fix compilation + + 83bfd85a1378e61b8bdc3f554f5e07900311f61f and + 2458120dee350cd1b49f999f64b17a895a4b6607 did not update some backends + properly, breaking their compilation. + + src/cairo-directfb-surface.c | 1 + + src/cairo-quartz-image-surface.c | 1 + + src/cairo-quartz-surface.c | 4 ++++ + src/cairo-script-surface.c | 1 + + src/cairo-win32-font.c | 1 + + src/cairo-win32-surface.c | 1 + + 6 files changed, 9 insertions(+) + +commit e5dfac245f8252a30e39f682f73a7e0065e7ffca +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 19 07:26:59 2011 +0200 + + build: Fix automake error + + b8f43617a98aeb6c10d554ed11b48a83fc9b5129 regressed the generation of + Makefiles. automake 1.10 fails when executed during ./autogen.sh: + + automake: cairo_test_suite_OBJECTS should not be defined + test/Makefile.am:76: while processing program `cairo-test-suite' + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9ab9ecfdbd8597131885a33e0d5d495cfc9066bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 19 00:31:18 2011 +0100 + + test,perf: Another hatching! + + This one illustrates the quadratic explosion lurking in the clipping + code. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/disjoint.c | 95 ++++++++++++++++++++++++++++++++++++++ + test/Makefile.sources | 1 + + test/clip-disjoint-hatching.c | 104 ++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 203 insertions(+) + +commit bf5892e2a6ff85e550f82c6b1fe8c0d4a0fb01f0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 22:31:34 2011 +0930 + + Add win32 font backend functions for Type 1 subsetting + + Native Type 1 font subsetting now works on Windows. + + src/cairo-win32-font.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 65 insertions(+), 1 deletion(-) + +commit 068df654daa74cdf516657af432002471a03c161 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 22:26:43 2011 +0930 + + type1-subset: Remove FT dependency part 6 + + Remove all remaining FT dependencies from the Type1 subsetting. + + src/cairo-pdf-surface.c | 4 -- + src/cairo-ps-surface.c | 4 -- + src/cairo-scaled-font-subsets.c | 3 - + src/cairo-type1-subset.c | 124 ++++++++++++---------------------------- + 4 files changed, 38 insertions(+), 97 deletions(-) + +commit 895dfc628a3c77ecfc0d81b9cc7bc261ed1e9031 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 22:23:21 2011 +0930 + + type1-subset: Remove FT dependency part 5 + + Add a font backend function, load_type1_data, for loading Type 1 font + data. Replace the FT code for loading the font with a call + load_type1_data. + + src/cairo-ft-font.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-type1-subset.c | 51 +++++++++++++-------------------------- + src/cairoint.h | 20 ++++++++++++++++ + 3 files changed, 98 insertions(+), 35 deletions(-) + +commit a94644f1774a67741686b6ff50cd4b4607d423f2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 22:18:22 2011 +0930 + + type1-subset: Remove FT dependency part 4 + + Remove the dependency on FT for getting the font name. + + The font name is obtained directly from the font. + + src/cairo-type1-subset.c | 64 ++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 48 insertions(+), 16 deletions(-) + +commit 549acc4beb59be9ad05a1d61d6a2ec3a42e2f879 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 22:16:07 2011 +0930 + + type1-subset: Remove FT dependency part 3 + + Remove the dependency on FT for getting the bbox and EM size. + + The FontBBox and FontMatrix in the font file are parsed to obtain this data. + + src/cairo-type1-subset.c | 94 ++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 87 insertions(+), 7 deletions(-) + +commit b83fcf7d52720105a143b057aa56c4a04f827d17 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 22:12:06 2011 +0930 + + type1-subset: Remove FT dependency part 2 + + Remove the dependency on getting the number of glyphs in the font from + FT. The number of glyphs is instead obtained by counting the + charstrings. + + Some fixed size malloced data is replaced with cairo_array_t so they + can be populated before we know the number of glyphs. + + src/cairo-type1-subset.c | 97 ++++++++++++++++++++++++------------------------ + 1 file changed, 49 insertions(+), 48 deletions(-) + +commit d46df1dffbb151bee6d2709664c7888e5fc5dd3c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 21:55:37 2011 +0930 + + type1-subset: Remove FT dependency part 1 + + Remove cairo_type1_font_subset_get_glyph_names_and_widths(). + + The glyph names are read from the font file instead of via FT. The + charstrings are parsed to extract the glyph widths. + + A new font backend function, index_to_glyph_name, has been added for + obtaining the glyph name for a given glyph index. This function is + supplied with the array of glyph names and a glyph index and is + required to return the array index of the glyph name corresponding to + the glyph index. + + The reason for passing in the array of glyph names is that: + + 1) On windows there is no API for accessing glyph names so we will + use knowledge of how the glyphs in a Type 1 font are numbered to + perform name lookup. + + 2) We can also use knowledge of how FT assigns the glyph numbers in a + Type 1 font to optimize the name lookup. + + src/cairo-ft-font.c | 61 +++++++++- + src/cairo-type1-subset.c | 310 +++++++++++++++++++++++++++-------------------- + src/cairoint.h | 19 +++ + 3 files changed, 255 insertions(+), 135 deletions(-) + +commit 9fc3f1086c30d28eb1a2c5795f17e9d4ff4353b9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 21:47:16 2011 +0930 + + cff-subset: Fix /guillemotright SID encoding + + src/cairo-cff-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 722e976044a30b237c9011e7e19ba022cb488f69 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jul 18 21:44:18 2011 +0930 + + png: fix type1 encoding bugs + + glyphs outside of the StandardEncoding were not being displayed by acroread + + src/cairo-pdf-surface.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 3a293657133145e1ecc4e7c047069cb465f6b4ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 18 09:16:21 2011 +0100 + + tests,perf: Add a hatchings clip-test + + A benchmark to test how close we get to reducing paint+clip to an ordinary + fill, and to check correctness. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/Makefile.am | 2 + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/Makefile.sources | 1 + + perf/micro/hatching.c | 199 ++++++++++++++++++++++++++++++++++++++++++++ + test/Makefile.refs | 2 + + test/Makefile.sources | 1 + + test/hatchings.c | 153 ++++++++++++++++++++++++++++++++++ + test/hatchings.ref.png | Bin 0 -> 99316 bytes + test/hatchings.xlib.ref.png | Bin 0 -> 92532 bytes + 10 files changed, 360 insertions(+) + +commit 2786864306eeb353ca873b63e471224d5ab8d0c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 18 10:08:16 2011 +0100 + + gl: Compile fix, missing include cairo-pattern-private.h + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-gradient-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 43b57d59a1e48125ed41e2a356b698522704c023 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jul 17 18:18:21 2011 +0200 + + cairo-xcb: Drop some unused definitions/file + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 1 - + src/cairo-xcb-surface-private.h | 37 ------------------------------------- + src/cairo-xcb-surface.c | 2 -- + 3 files changed, 40 deletions(-) + +commit 2e264e73df0b5a2f6d6a7f906f483d4a827a5375 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jul 17 17:55:26 2011 +0200 + + xlib-xcb: Fix an "extension leak" + + When the xlib-xcb backend created a new cairo_device_t for a Display*, it called + XAddExtension to get a callback on XCloseDisplay(). However, when the last + surface using this device is destroyed, this extension isn't unregistered + because there is no API for this. + + I noticed that gvim was quite slow after a while with xlib-xcb. The reason is + that xlib has a linked list of registered extensions that it has to walk through + for various callbacks. Since xlib-xcb caused lots of "dead" extension, this got + quite slow when there were about 20k entries in this list. + + The fix is to make sure that the cairo_device_t isn't finished/destroyed when + the last surface using it is destroyed. For this, we keep an internal reference + which is only dropped when the device is finished. This happens when someone + explicitly calls cairo_device_finish or when our XCloseDisplay hook runs. + + The same thing is done by cairo-xlib. I didn't port this over to xlib-xcb + because at that time I didn't understand why it was needed. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 0dc63f5bb409de0013bf845f96383cc9dca27980 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jul 16 16:47:30 2011 +0200 + + cairo-trace: Fix mark-dirty with xcb backend + + cairo-xcb's acquire_source_image implementation will attach the image it returns + as a snapshot to the xcb surface. cairo_surface_mark_dirty_rectangle asserts + that the surface doesn't have any snapshots attached. cairo-trace will emit the + surface to the trace when it was marked dirty by drawing it to an image surface. + + The combination of these three things caused a failed assertion when cairo-trace + was used on something which uses xcb/Xlib and which uses mark_dirty. + I found this with firefox and xlib-xcb. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + util/cairo-trace/trace.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit 27692ca75967b482ff1bd0ffbca8b4e3551776f7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 16 20:45:43 2011 +0100 + + test: Add random-clips to stress test clipping + + Not sure what the right results are, so refs will come later. The output + looks superficially right, but the *code* is known to be buggy... + + (And hopefully this has captured a few of those bugs.) + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.sources | 1 + + test/random-clips.c | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 218 insertions(+) + +commit b8f43617a98aeb6c10d554ed11b48a83fc9b5129 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jul 16 20:45:03 2011 +0100 + + test: Always compile cairo-test-suite + + I'm tired of having to explicitly type make cairo-test-suite. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 54ae2e1619ba2f1039c8e652b2f24d7a72ab8395 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 23:40:38 2011 +0100 + + xcb: Remove more bits of drm integration + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-private.h | 3 -- + src/cairo-xcb-surface-render.c | 4 --- + src/cairo-xcb-surface.c | 65 ++---------------------------------------- + 3 files changed, 2 insertions(+), 70 deletions(-) + +commit 2458120dee350cd1b49f999f64b17a895a4b6607 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 18:35:32 2011 +0100 + + pattern: Add observer hooks + + In order for custom context to automatically track when a pattern is + modify after being set on the context (and before it is used in an + operator), we need for there to be a callback when the pattern is + modified. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 1 + + src/cairo-clip.c | 1 + + src/cairo-composite-rectangles.c | 1 + + src/cairo-debug.c | 1 + + src/cairo-default-context.c | 1 + + src/cairo-ft-font.c | 1 + + src/cairo-gstate.c | 1 + + src/cairo-image-surface.c | 1 + + src/cairo-mesh-pattern-rasterizer.c | 2 + + src/cairo-pattern-private.h | 362 ++++++++++++++++++++++++++++++++++ + src/cairo-pattern.c | 17 ++ + src/cairo-pdf-shading-private.h | 1 + + src/cairo-recording-surface-private.h | 1 + + src/cairo-scaled-font.c | 1 + + src/cairo-surface-fallback.c | 1 + + src/cairo-surface-offset.c | 1 + + src/cairo-surface-wrapper.c | 1 + + src/cairo-types-private.h | 114 ----------- + src/cairo-xcb-private.h | 1 + + src/cairo-xlib-surface.c | 3 +- + src/cairo.c | 1 + + src/cairoint.h | 171 +--------------- + 22 files changed, 402 insertions(+), 283 deletions(-) + +commit 83bfd85a1378e61b8bdc3f554f5e07900311f61f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 23 19:45:26 2010 +0100 + + Implement cairo_backend_t + + Allow a backend to completely reimplement the Cairo API as it wants. The + goal is to pass operations to the native backends such as Quartz, + Direct2D, Qt, Skia, OpenVG with no overhead. And to permit complete + logging contexts, and whatever else the imagination holds. Perhaps to + experiment with double-paths? + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/Makefile.sources | 2 + + src/cairo-analysis-surface.c | 4 + + src/cairo-backend-private.h | 170 +++++ + src/cairo-clip.c | 7 +- + src/cairo-debug.c | 2 +- + src/cairo-default-context-private.h | 58 ++ + src/cairo-default-context.c | 1406 +++++++++++++++++++++++++++++++++++ + src/cairo-directfb-surface.c | 3 + + src/cairo-gl-surface.c | 3 + + src/cairo-gstate-private.h | 39 +- + src/cairo-gstate.c | 142 ++-- + src/cairo-image-surface.c | 3 + + src/cairo-os2-surface.c | 3 + + src/cairo-paginated-surface.c | 9 + + src/cairo-path-private.h | 4 +- + src/cairo-path-stroke.c | 4 +- + src/cairo-path.c | 98 +-- + src/cairo-pdf-surface.c | 3 + + src/cairo-private.h | 25 +- + src/cairo-ps-surface.c | 3 + + src/cairo-qt-surface.cpp | 3 + + src/cairo-quartz-image-surface.c | 2 + + src/cairo-recording-surface.c | 3 + + src/cairo-scaled-font-subsets.c | 1 + + src/cairo-script-surface.c | 2 + + src/cairo-surface-snapshot.c | 1 + + src/cairo-surface-subsurface.c | 9 + + src/cairo-svg-surface.c | 3 + + src/cairo-tee-surface.c | 3 + + src/cairo-type3-glyph-surface.c | 3 + + src/cairo-types-private.h | 14 +- + src/cairo-vg-surface.c | 3 + + src/cairo-win32-printing-surface.c | 3 + + src/cairo-win32-surface.c | 3 + + src/cairo-xcb-surface-core.c | 1 + + src/cairo-xcb-surface-render.c | 1 + + src/cairo-xcb-surface.c | 3 + + src/cairo-xlib-surface.c | 3 + + src/cairo-xlib-xcb-surface.c | 6 +- + src/cairo-xml-surface.c | 3 + + src/cairo.c | 1039 ++++++++++---------------- + src/cairoint.h | 9 +- + src/drm/cairo-drm-gallium-surface.c | 3 + + src/drm/cairo-drm-i915-surface.c | 2 + + src/drm/cairo-drm-i965-surface.c | 2 + + src/drm/cairo-drm-intel-surface.c | 2 + + src/drm/cairo-drm-radeon-surface.c | 2 + + src/test-fallback-surface.c | 3 + + src/test-fallback16-surface.c | 3 + + src/test-null-surface.c | 2 + + src/test-paginated-surface.c | 2 + + src/test-wrapping-surface.c | 3 + + 52 files changed, 2321 insertions(+), 809 deletions(-) + +commit 2055732ffcd6316c3feb05ac330fbaf8698df5c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 17:58:31 2011 +0100 + + tests: Add paint-clip-fill + + A false reduction bug found by Taekyun Kim. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 3 ++ + test/Makefile.sources | 1 + + test/paint-clip-fill-aa.ref.png | Bin 0 -> 352 bytes + test/paint-clip-fill-mono.ref.png | Bin 0 -> 352 bytes + test/paint-clip-fill.c | 106 ++++++++++++++++++++++++++++++++++++++ + 5 files changed, 110 insertions(+) + +commit 524809759b7c1c9f01bcdd9f195ec4366ebe8223 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 17:51:00 2011 +0100 + + tests: Add clip-complex-shape + + Contributed by Taekyun Kim to exercise a major bug he found in the + treatment of complex clips. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 2 + + test/Makefile.sources | 1 + + test/clip-complex-shape-eo-aa.ref.png | Bin 0 -> 349 bytes + test/clip-complex-shape-eo-mono.ref.png | Bin 0 -> 349 bytes + test/clip-complex-shape.c | 114 ++++++++++++++++++++++++++++++++ + 5 files changed, 117 insertions(+) + +commit 41b5469b9523c9a8784d230e929518367dbda751 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 5 11:49:50 2011 +0100 + + image: Only discard the outer boxes + + This is necessary as the callers do not propagate the clip extents after + finding the singular clip path. *sigh* + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit ebe665867c2ff22c098ede4d4e909d42cca8b39c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 16:45:54 2011 +0100 + + scaled-font: Fix assertions for original font-face vs font-face + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 507b8abcf6326bbbe8c188016043b21438256b71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 12:46:26 2011 +0100 + + Excise xcb-drm + + The experiment was at best a pyrrhic victory. Whilst it did show that + you could successfully subvert cairo_xcb_surface_t and provide the + rendering locally faster (than the xlib driver at that time), any + performance benefits were lost in the synchronisation overheads and + server-side buffer allocation. + + Once cairo-gl is mature, we need to look at how we can overcome these to + improve client-side rendering + + In the meantime, cairo-xcb is no longer my playground for + experimentation and is shaping up to become a stable backend... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/Makefile.win32.features | 12 ----- + build/Makefile.win32.features | 2 - + build/Makefile.win32.features-h | 6 --- + build/configure.ac.features | 1 - + configure.ac | 11 ---- + src/Makefile.win32.features | 16 ------ + src/cairo-xcb-connection.c | 47 ---------------- + src/cairo-xcb-private.h | 2 - + src/cairo-xcb-screen.c | 88 ------------------------------ + src/cairo-xcb-surface-render.c | 73 ------------------------- + src/cairo-xcb-surface.c | 104 ------------------------------------ + src/drm/cairo-drm-i915-shader.c | 24 --------- + src/drm/cairo-drm-i965-shader.c | 24 --------- + 13 files changed, 410 deletions(-) + +commit 5d9da3decff06015d03413713714552095dfa616 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 14 12:35:19 2011 +0100 + + Excise DRM-Xr + + I've since incorporated (nearly) all the features from cairo-drm into + xf86-video-intel, making this experiment defunct. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/Makefile.win32.features | 12 - + build/configure.ac.features | 1 - + configure.ac | 13 - + src/Makefile.sources | 5 - + src/Makefile.win32.features | 16 - + src/cairo-drm-xr.h | 66 - + src/drm/cairo-drm-xr.c | 2378 ----------------------------------- + 7 files changed, 2491 deletions(-) + +commit cd4b2d843b2a8c06ba78c15ff65763b5bdf54dc6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 13 12:33:48 2011 +0100 + + scaled-font: Key the cache on the orignal font_face + + We check the incoming scaled font using the original font fce, so we + need to also store it in the cache using the same face, and not the + resolved font_face (which will remain the same unless the fontconfig + configuration is updated). + + Hides the quadratic behaviour of font retrieval in recent cairo-traces. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 84c66589bc6f6a9f924863e578a49e4f2492ec87 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 13 12:32:24 2011 +0100 + + ft-font: If the pattern is already resolved, use it immediately + + This skips an relatively expensive search for the a good match if the + pattern already contains a face or a filename. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-ft-font.c | 36 +++++++++++++++++++++++------------- + 1 file changed, 23 insertions(+), 13 deletions(-) + +commit 727a0092d1128f8dd6e6054efb586f26e47fa2d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 8 21:58:07 2011 +0100 + + test: Test a1 clipping semantics + + If I've written the tests correctly, these should produce identical + images as the a1 rasterisation tests. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.refs | 6 +- + test/Makefile.sources | 1 + + test/a1-clip-fill-equal.ref.png | Bin 0 -> 148 bytes + test/a1-clip-fill.ref.png | Bin 0 -> 148 bytes + test/a1-clip-paint.ref.png | Bin 0 -> 148 bytes + test/a1-clip-stroke.ref.png | Bin 0 -> 148 bytes + test/a1-clip.c | 175 ++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 181 insertions(+), 1 deletion(-) + +commit af71e7717e3eb89f6ebaa6b43b1267341dc15116 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jul 8 21:56:32 2011 +0100 + + png: Fix support of depth-30 images + + Rename the variable depth to bpc to prevent future confusion. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-png.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit cc3e4c6ec96c3319abaae889198f0fbab8e1f90d +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jul 9 11:19:49 2011 +0200 + + Handle CAIRO_STATUS_DEVICE_FINISHED in switches + + Fixes all warnings that looked like this: + + warning: enumeration value 'CAIRO_STATUS_DEVICE_FINISHED' not handled in switch + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-device.c | 1 + + src/cairo-misc.c | 2 ++ + src/cairo-region.c | 1 + + src/cairo-spans.c | 2 ++ + src/cairo-surface.c | 1 + + util/cairo-trace/trace.c | 1 + + 6 files changed, 8 insertions(+) + +commit 508990af8d83c83ae6ea0c3e66bd736d3446027d +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 8 21:31:47 2011 +0200 + + xcb: Don't use xcb surfaces as snapshots + + Eventually someone might try to paint to the xcb surface again. However, + _cairo_surface_begin_modification doesn't like that: + + cairo-surface.c:385: _cairo_surface_begin_modification: Assertion + `surface->snapshot_of == ((void *)0)' failed. + + There was only a single place in the xcb backend where a cairo_xcb_surface_t + could be used as a snapshot, so the _cairo_surface_has_snapshot that checked for + such a surface can be removed, too. + + This does *not* remove all snapshots from the xcb backend, but all the remaining + snapshots are instances of cairo_xcb_picture_t. These surfaces are only ever + created internally and thus can't be modified by users directly. + + Fixes: xcb-snapshot-assert + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 28 ---------------------------- + 1 file changed, 28 deletions(-) + +commit 5b8c01ec777538a110c5dc79fee04294b29f9721 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 8 22:04:29 2011 +0200 + + Add a test case that asserts on xcb + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.sources | 1 + + test/xcb-snapshot-assert.c | 67 +++++++++++++++++++++++++++++++++++++++ + test/xcb-snapshot-assert.ref.png | Bin 0 -> 97 bytes + 3 files changed, 68 insertions(+) + +commit 4153de46892b47b5b21fbef8939ef732935bfe03 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 8 16:51:19 2011 +0200 + + xcb: Track cairo_xcb_picture_t surfaces + + When e.g. using an image surface as the source for a xcb surface, a + cairo_xcb_picture_t is created and attached to that image surface as a snapshot. + This contains the Picture that was created on the X11 server. + + However, as soon as the cairo_xcb_picture_t's cairo_xcb_screen_t is finished and + destroyed, this picture can't be used anymore. This commit now makes sure all + these Pictures are freed when the screen is finished. + + This was found because my X server's memory usage grew quite large. Every time + the app was done drawing, it destroyed its last surface which also destroyed the + last reference to the cairo_xcb_screen_t. This meant that the existing Picture + snapshots couldn't be used anymore, but they were still kept around and used up + memory until there wasn't any free memory left. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 3 +++ + src/cairo-xcb-screen.c | 13 +++++++++++++ + src/cairo-xcb-surface-render.c | 3 +++ + 3 files changed, 19 insertions(+) + +commit e775db35d9306b74867f981a08d253562b15cffd +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 8 17:09:45 2011 +0200 + + xcb: Move cairo_xcb_picture_t to cairo-xcb-private.h + + The next commit will make cairo-xcb-screen.c use this struct and add new + members. Splitting off the move into its own commits makes that easier to + understand. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 20 ++++++++++++++++++++ + src/cairo-xcb-surface-render.c | 19 ------------------- + 2 files changed, 20 insertions(+), 19 deletions(-) + +commit 5b9205cc52f50f997c9cd6c5a64faf783d83310f +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jul 3 17:45:58 2011 +0200 + + xlib-xcb: Register a XCloseDisplay hook + + This commits makes the xlib-xcb backend produce its own cairo_device_t. This + per-Display* device is used to manage the registration of a XCloseDisplay hook + via XAddExtension/XESetCloseDisplay in the same way that the xlib backend does + this. The device is necessary to see if we already registered an extension. + + This fixes weird errors when running cairo-test-suite with -a -s. They were + caused because the backend didn't see the XCloseDisplay and the next + XOpenDisplay happened to create a xcb_connection_t with the same address as the + last display. This caused the xcb backend to assume lots of wrongness. + + This commit makes use of _cairo_xlib_display_mutex which is otherwise compiled + in but not used anywhere when xlib-xcb is enabled. + + Patch v2: Fixed the xcb_device == NULL case and made sure the xcb_device is only + finished on XCloseDisplay, not when all xlib-xcb surfaces are destroyed. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 145 ++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 142 insertions(+), 3 deletions(-) + +commit 05a0b24ecbafccf63e0114889301fc23268a9efc +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 8 11:24:16 2011 +0200 + + device: Fix documentation of device types + + The documentation of device types incorrectly talks about surfaces and + lacks the new INVALID type. + + src/cairo.h | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 02a331de13313085d671716031a3b61778014b87 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 6 22:49:29 2011 +0200 + + device: Define the CAIRO_DEVICE_TYPE_INVALID device type + + Define a new device type to indicate that the device is not valid. + The -1 value is along the same line as CAIRO_FORMAT_INVALID (and is + likely to have the same issues). + + src/cairo-device.c | 2 +- + src/cairo.h | 4 +++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 35d8d206355b281d09d50b61d6497cea39e09624 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 6 22:45:02 2011 +0200 + + device: Add CAIRO_STATUS_DEVICE_FINISHED + + Instead of abusing CAIRO_STATUS_SURFACE_FINISHED to indicate the use + of a finished device, define and use the new error status + CAIRO_STATUS_DEVICE_FINISHED. + + src/cairo-device.c | 2 +- + src/cairo.c | 3 ++- + src/cairo.h | 2 ++ + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit 780534cd31af6f4837a4f5a0e445ae609c3559c3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 6 22:23:05 2011 +0200 + + gstate: Remove useless code + + gstate->source has been initialized as the static black pattern, so + its status is success. + + src/cairo-gstate.c | 12 +----------- + 1 file changed, 1 insertion(+), 11 deletions(-) + +commit 4679b28e211613391764919578161d400bc9075f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 7 18:28:42 2011 +0200 + + color: Remove unused functions + + _cairo_color_init() and _cairo_color_init_rgb() are basically unused + (except in some experimantal code, which is trivial to fix). + + src/cairo-color.c | 13 ------------- + src/cairoint.h | 7 ------- + src/drm/cairo-drm-xr.c | 9 +++++---- + 3 files changed, 5 insertions(+), 24 deletions(-) + +commit 9374cf0a9730843881043c39ab4c6f6d31af7cce +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 6 15:14:55 2011 +0200 + + pattern: Implement _rgb functions as wrappers over _rgba functions + + cairo_pattern_create_rgb() and cairo_pattern_add_color_stop_rgb() + implement the same logic as cairo_pattern_create_rgba() and + cairo_pattern_add_color_stop_rgba() with an alpha == 1.0. + + Instead of duplicating the code, they can simply call into the more + general functions. + + src/cairo-pattern.c | 31 +++---------------------------- + src/cairoint.h | 1 + + 2 files changed, 4 insertions(+), 28 deletions(-) + +commit d7cc30eb0112010533d05b4579a12e7a2910b08d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jul 3 19:22:34 2011 +0200 + + Make error contexts static + + Dynamically creating error contexts requires locking and failure + handling. The code logic can be simplified by statically defining all + the possible error contexts. + + src/cairo-mutex-list-private.h | 1 - + src/cairo.c | 148 ++++++++++++++++++----------------------- + 2 files changed, 65 insertions(+), 84 deletions(-) + +commit ef659649d3acfb5f91996dd2bbdfd2a2833d9f38 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jul 3 18:19:07 2011 +0200 + + Clean up context_pool upon static data reset + + In commit f46ba56d5b8c54be5f0379aca204c0ce05d0f58a the static context + stash was replaced by a dynamic freed pool, which needs to be cleared + upon resets. + + Fixes: + cairo.c:181: warning: ‘context_pool’ defined but not used + + Reported-by: Uli Schlachter <psychon@znc.in> + + src/cairo.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit fe3ca9c36f15403d8d93263acb758100836ad3cb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jul 3 18:40:08 2011 +0200 + + Remove conditional compilation of freed-pools + + Conditional compilation was needed to avoid warnings: + cairo-clip.c:51: warning: ‘clip_path_pool’ defined but not used + cairo.c:181: warning: ‘context_pool’ defined but not used + + They can be avoided by making sure that _freed_pool_reset(ptr) + actually consumes its argument. This has the pleasant side-effect that + forgetting to properly reset a freed-pool now results in a warning if + atomic ops are disabled/not available. + + src/cairo-clip.c | 2 -- + src/cairo-freed-pool-private.h | 6 +++++- + src/cairo-pattern.c | 4 ---- + src/cairo.c | 3 --- + 4 files changed, 5 insertions(+), 10 deletions(-) + +commit b6c972897b9d7cb898fb08363115e721a3ff758c +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jul 3 13:13:37 2011 +0200 + + Xlib: Fix boilerplate to work with xlib-xcb + + Xlib boilerplate includes cairo-xlib-surface-private.h, so that it can cast the + xlib cairo_surface_t to cairo_xlib_surface_t and then mess with some internals + of that struct. + + However, xlib-xcb doesn't use that struct and thus this results in random memory + corruption. "Luckily", all the fields that this messes with don't corrupt any + fields in cairo_xlib_xcb_surface_t, but instead this writes past the end of the + buffer that was returned from malloc. + + This commit just adds an #if to disable this code section since I have no idea + what a proper fix would be. This means that the xlib-fallback backend doesn't + actually test any fallbacks with xlib-xcb, however it never did so anyway. + + If you have any idea how to fix xlib-fallback with xlib-xcb, please speak up. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xlib.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit eea31cc4ee02f81554f04c3db60ab371c1cb212f +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jul 2 23:11:48 2011 +0200 + + xlib-xcb: Don't call directly into the xcb backend + + Instead, this now uses the surface wrapper functions for this job. + These functions make sure that e.g. snapshots are detached and that is_clear is + reset correctly. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 33 ++++++++++++++++++--------------- + 1 file changed, 18 insertions(+), 15 deletions(-) + +commit 9e4c73a40d6eb72a5110936ab310acbaef99baa8 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jul 2 23:00:24 2011 +0200 + + xlib-xcb: Fix some use-after-free + + Also, this now sets surface->xcb to NULL after the dereference. Segfaults are + way more prominent anyway. :-) + + All the backend callbacks shouldn't need any checks since the public entry point + already checks for finished surfaces. Only the public functions in xlib-xcb need + to do checks for finished surfaces. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit 880566e14b335ddb5bf1c768f6ca4f02b2dd2add +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jul 2 17:40:36 2011 +0200 + + xcb: Remove an unused function argument + + Since commit f1d313e0, the 'force' argument to _copy_to_picture() isn't used + anymore. Said commit should have removed it. Whoops. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit 7e1a9f1db0471f238a954a1fd248695a2a6920d7 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 1 21:48:31 2011 +0200 + + xlib-xcb: Fix cairo_surface_flush() + + This function called directly into the xcb's surface flush function. This means + that snapshots for that surface weren't detached since that's normally done in + cairo_surface_flush() before calling into the backend. + + Fix this by using surface_flush() instead of calling into the backend directly. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=31931 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 26ee41435b864b266f6c2c06544d95f7cd125733 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 1 18:53:18 2011 +0200 + + xlib-xcb: Verify we really have an xcb surface + + If the X11 server doesn't have the RENDER extension, the xcb backend falls back + to the image backend in some cases (e.g. create_similar). xlib-xcb didn't handle + this properly which means it used the result like a xcb surface. + + Found while debugging https://bugs.freedesktop.org/show_bug.cgi?id=31931, + firefox died from a BadDrawable error when it tried to use the (bogous) result + from cairo_xlib_surface_get_drawable(). + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit 59fadcf7d93a179554a3f615c02e48547d6b141e +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 1 10:26:28 2011 +0200 + + xlib-xcb: Fix api-special-cases test + + The functions cairo_xlib_surface_set_size and cairo_xlib_surface_set_drawable + didn't set the expected error when called with a finished surface. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xlib-xcb-surface.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 4495e08e9e5fbcd386bf398097c8276f7f5c862d +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jul 1 10:12:15 2011 +0200 + + xlib-xcb: Use slim_hidden_proto correctly + + There are debug functions for setting the precision on a xlib device, so + xlib-xcb must redirect that to the xcb backend, too. However this means that + these public functions now are also called internally, thus we have to make them + go through the slim_hidden_* macros. + + This commit fixes the following error from "make check": + + Checking .libs/libcairo.so for local PLT entries + 00000000002bb6d8 000001e300000007 R_X86_64_JUMP_SLOT 000000000006d8a0 cairo_xcb_device_debug_set_precision + 0 + 00000000002bb750 0000025e00000007 R_X86_64_JUMP_SLOT 000000000006d8b0 cairo_xcb_device_debug_get_precision + 0 + FAIL: check-plt.sh + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 6 ++++++ + src/cairo-xcb-private.h | 2 ++ + 2 files changed, 8 insertions(+) + +commit ea645913ba8739377ee2e2b51480310befc19b76 +Author: Søren Sandmann Pedersen <ssp@redhat.com> +Date: Mon Jun 27 23:11:32 2011 -0400 + + Include pixman.h in cairo-xlib-private.h + + Otherwise "make cairo-perf-trace" fails. Reported by Matt Turner on + IRC. + + src/cairo-xlib-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8996287d94b159c922282e0b6434b0637f8f32aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 25 20:02:47 2011 +0100 + + xlib: Create an exact match for the image surface if possible using Xrender + + In order to defer the pixel conversion till as late in the pipeline as + possible, we want to try and preserve the pixman image format whilst + uploading the pixel data. To do this, we want to create an XRender + surface with a matching PictFormat to the source image. Then we need to + make sure we take the quick path through _draw_image_surface for none + and direct conversions. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xlib-display.c | 134 ++++++++++++++++++++++++++++++++++++++++------- + src/cairo-xlib-private.h | 4 ++ + src/cairo-xlib-surface.c | 111 ++++++++++++++++++++++++++++++++------- + 3 files changed, 211 insertions(+), 38 deletions(-) + +commit f46ba56d5b8c54be5f0379aca204c0ce05d0f58a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 25 15:35:48 2011 +0200 + + Do not open-code freed-pool + + Reuse the freed-pool system to reduce allocation pressure of context + creation/destruction. + + As a side effect, this removes the use of ffs() on Win32, cleaning up + some MSVC-specific code and fixing a mingw-related build issue. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=30277 + + src/cairo-compiler-private.h | 15 ------- + src/cairo.c | 94 ++++++-------------------------------------- + 2 files changed, 12 insertions(+), 97 deletions(-) + +commit a6d4d840d324de55a973663e5a416751619dc490 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 25 14:35:38 2011 +0200 + + test: Fix check-ref-missing + + ce3806510f8a20621f3daf7bd1afb18811fa1e92 changed the format of + Makefile.refs, breaking the check-ref-missing target. + + Ignoring any line not containing a .png file fixes check-ref-missing + and makes it more robust. + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce3806510f8a20621f3daf7bd1afb18811fa1e92 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jun 25 13:05:19 2011 +0100 + + test: Add a Makefile.refs generator + + Generates the lexicographical Makefile.refs based on the *.ref.png and + *.xfail.png checked into git. + + This might be nice to automate as a Makefile target. But for now play + safe and do the updates manually. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 2 +- + test/Makefile.refs | 5 ++++- + test/generate_refs.sh | 12 ++++++++++++ + 3 files changed, 17 insertions(+), 2 deletions(-) + +commit ffdfdf2fa99dab340e03884267218b134d68265b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 25 10:29:04 2011 +0200 + + test: Merge text-antialias-* + + The test-antialias-* tests perform the same operation with just a + different antialias flag. Sharing the code ensures that they are kept + in sync and permits adding new flags combinations easily. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=14268 + + test/Makefile.sources | 4 +- + test/text-antialias-gray.c | 76 ----------------------------- + test/text-antialias-none.c | 76 ----------------------------- + test/text-antialias-subpixel.c | 74 ---------------------------- + test/text-antialias.c | 106 +++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 107 insertions(+), 229 deletions(-) + +commit a468489270faabacbf89febc250c2d393fda1a13 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 24 16:23:28 2011 +0200 + + win32: Fallback upon PDF blend operators + + GDI does not support PDF blend modes, so they are implemented by + falling back. + + Fixes extended-blend-solid, extended-blend-solid-alpha. + + Bug pointed out by Peter Frentrup <peter_frentrup@gmx.de> in + http://lists.cairographics.org/archives/cairo/2011-April/021908.html + + src/cairo-win32-surface.c | 24 +++++++++++++++++++++--- + 1 file changed, 21 insertions(+), 3 deletions(-) + +commit acfc00168571928a882787d3c6622efde22172e0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 25 08:41:52 2011 +0200 + + test: Add extended-blend-solid tests + + Unify extended-blend* tests and add a solid pattern version, which + crashes on the win32 backend. + + Bug pointed out by Peter Frentrup <peter_frentrup@gmx.de> in + http://lists.cairographics.org/archives/cairo/2011-April/021908.html + + test/Makefile.refs | 6 + + test/Makefile.sources | 1 - + test/extended-blend-alpha.c | 115 ---------------- + test/extended-blend-solid-alpha.argb32.ref.png | Bin 0 -> 9406 bytes + test/extended-blend-solid-alpha.image16.ref.png | Bin 0 -> 4626 bytes + test/extended-blend-solid-alpha.rgb24.ref.png | Bin 0 -> 5743 bytes + test/extended-blend-solid.argb32.ref.png | Bin 0 -> 4071 bytes + test/extended-blend-solid.image16.ref.png | Bin 0 -> 4145 bytes + test/extended-blend-solid.rgb24.ref.png | Bin 0 -> 3772 bytes + test/extended-blend.c | 170 ++++++++++++++++++------ + 10 files changed, 138 insertions(+), 154 deletions(-) + +commit 5fffa3fae122da624aa79923ff13c781842e005d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 24 23:04:11 2011 +0200 + + test: Ignore \r when parsing test log files + + This fixes the log parsing on win32. + + test/testtable.js | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0baf009b39c75dbc604800b9bd4c9f017a87d763 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 24 23:02:25 2011 +0200 + + test: Make parsing of log files more solid + + The old code considered every even "word" as a key and every odd + "word" as a value when parsing a test log file. + All of the keys end with ':', so restrict with this requirement. + + test/testtable.js | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a447e949799000760835beeafd2d45c76580fb9e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 24 15:52:24 2011 +0200 + + clip: Fix boxes extents computation in intersect_with_boxes + + The extents of the boxes were being computed by taking into account + just the first box instead of all of them. + + Based on a patch by James Cloos. + + Fixes clip-disjoint, clip-stroke-unbounded, clip-fill-nz-unbounded, + clip-fill-eo-unbounded, clip-fill, clip-stroke, trap-clip. + + See https://bugs.freedesktop.org/show_bug.cgi?id=38641 + + Reviewed-by: James Cloos <cloos@jhcloos.com> + Tested-by: James Cloos <cloos@jhcloos.com> + + src/cairo-clip.c | 26 ++++++++++++++------------ + 1 file changed, 14 insertions(+), 12 deletions(-) + +commit 1a4e9f1e9189e9dcb69afff009a10d6eb3bd2bd4 +Author: Nis Martensen <nis.martensen@web.de> +Date: Mon May 2 20:58:28 2011 +0200 + + Fix typos + + Reported in + http://lists.cairographics.org/archives/cairo/2011-May/021921.html + + perf/cairo-perf-compare-backends.c | 2 +- + perf/cairo-perf-diff-files.c | 2 +- + src/cairo.h | 6 +++--- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 6835421003d4ecf9d9ac32f0bc8db7395f6a5980 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 25 09:39:41 2011 +0200 + + test: Fix typo + + scrdir -> srcdir + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5c798bcf86ce113b961f0b62d924e78d0be65614 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Mar 21 11:08:46 2011 +0100 + + test: Improve check-ref-missing + + On linux it is impossible to check the missing references because of + argument length constraints: + make: execvp: /bin/bash: Argument list too long + + Using a temporary file instead of variable expansion makes it possible + to work around this. + + Makefile.refs is now required to be in lexicographical order, which + avoids ordering problems and the risk of duplicated entries (like + clipped-surface.ref.png). + + test/.gitignore | 1 + + test/Makefile.am | 1399 +--------------------------------------------------- + test/Makefile.refs | 1348 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 1367 insertions(+), 1381 deletions(-) + +commit 77b6563c218dcff641820d2555ac93ad10a095e8 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jun 24 15:59:08 2011 +0200 + + xcb: Use defines instead of magic numbers + + render.h gives us nice descriptive names for the precise/imprecise poly modes. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 3 ++- + src/cairo-xcb-surface-render.c | 4 ++-- + src/cairo-xcb-surface.c | 2 +- + 3 files changed, 5 insertions(+), 4 deletions(-) + +commit 144c912860af6e60e1bdbeee31fe686c9c5e550d +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Jun 24 15:52:59 2011 +0200 + + xcb: Initialize the new precision fields + + In 63bdae27a83, new fields were added to cairo_xcb_connection_t and + cairo_xcb_surface_t. The same change was done in the xlib backend. + + However, in the xlib backend these new fields were properly initialized. This + was forgotten in the xcb backend. + + Hopefully-Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=38482 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 1 + + src/cairo-xcb-surface.c | 1 + + 2 files changed, 2 insertions(+) + +commit d246d97592fc9df7ac914e1f97e2d834c7b975a5 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Jun 13 11:26:55 2011 +0200 + + xcb: Prettify some code + + Instead of having each case do the same thing, this code will now fall through + to the default case. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit cb3d91201c3de6c9cd1fd97b8471d322b75eec5a +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Jun 13 11:25:04 2011 +0200 + + xcb: Don't hardcode the RENDER version number + + This now uses the macros XCB_RENDER_{MAJOR,MINOR}_VERSION which xcb defines. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d938e744461f78d9030659b6672a79f06aaa12f8 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Jun 13 11:20:26 2011 +0200 + + xcb,xlib,surface: Check for too small sizes + + This adds checks for negative sizes in cairo_surface_create_similar() and for + non-positive sizes in all public surface-creation functions in the xcb and xlib + backends. + + X11 doesn't allow 0 as width/height, so if anyone claims to have a drawable of + that size, he can't be right. However, cairo allows such sizes which is why + create_similar doesn't reject 0. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 2 ++ + src/cairo-xcb-surface.c | 8 +++++++- + src/cairo-xlib-surface.c | 10 +++++----- + 3 files changed, 14 insertions(+), 6 deletions(-) + +commit 463a8b67a3e2dfacede3f4e2ed1f65afc8ae5662 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 21 18:12:29 2011 +0200 + + perf: Fix build on win32 + + The performance tools build system for Win32 hasn't been maintained + for some time. The makefiles are now structured as in other + directories (Makefile.sources used by both Makefile.am and + Makefile.win32) and some additional code hides os-specific parts. + + Makefile.win32 | 3 ++ + configure.ac | 1 + + perf/Makefile.am | 111 +++++++++++--------------------------------- + perf/Makefile.sources | 35 ++++++++++++++ + perf/Makefile.win32 | 104 +++++++++++++++++++++++++++-------------- + perf/cairo-perf-os2.c | 8 +++- + perf/cairo-perf-posix.c | 8 +++- + perf/cairo-perf-trace.c | 53 +++++++++++++++++---- + perf/cairo-perf-win32.c | 8 +++- + perf/dirent-win32.h | 102 ++++++++++++++++++++++++++++++++++++++++ + perf/micro/Makefile.am | 16 +++++++ + perf/micro/Makefile.sources | 35 ++++++++++++++ + perf/micro/Makefile.win32 | 12 +++++ + 13 files changed, 363 insertions(+), 133 deletions(-) + +commit 33403cfb378de03a2cff707b4b1cc16025378822 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 21 18:11:58 2011 +0200 + + perf: Ensure M_SQRT2 is defined + + pythagoras-tree uses M_SQRT2, which on Win32 is defined by math.h if + and only if _USE_MATH_DEFINES is defined. + + perf/micro/pythagoras-tree.c | 1 + + 1 file changed, 1 insertion(+) + +commit 5291f7ccad54b587bd1bee3a89426cf1d158c5bb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 22 14:40:23 2011 +0200 + + script-interpreter: Build on win32 + + Restructure the Makefiles in .sources, .am and .win32 to enable + building cairo-script-interpreter on Win32. + + Some minor changes are needed to compile on MSVC: + - include stdint.h to define INT_MAX-like macros + - redefine "inline" + - avoid deprecated functions (snprintf, replaced by _snprintf) + - define _USE_MATH_DEFINES so that math.h defines M_PI, M_SQRT2 and + M_LN2 + + util/cairo-script/Makefile.am | 12 ++++-------- + util/cairo-script/Makefile.sources | 13 +++++++++++++ + util/cairo-script/Makefile.win32 | 10 ++++++++++ + util/cairo-script/cairo-script-operators.c | 6 ++++++ + util/cairo-script/cairo-script-private.h | 5 +++++ + util/cairo-script/cairo-script-scanner.c | 1 + + 6 files changed, 39 insertions(+), 8 deletions(-) + +commit 3a5c8b2c74e73c8a35e80b369f043e62dc2ad26c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 21 18:11:38 2011 +0200 + + test: Cleanup build on Win32 + + Put cairo-test-suite.exe in a $(CFG)-dependent folder and link to + libraries from $(top_builddir). + + test/Makefile.win32 | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit f21ac5b13b4a2a5455349da29529692a02c2a5e0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 23 10:09:30 2011 +0200 + + error: Do not define _cairo_error twice + + cairo-perf-trace uses cairo-hash.c, which calls _cairo_error. + + Instead of redefining it in cairo-perf-trace.c it can be abstracted in + a separate source which is directly included in the build of + cairo-perf-trace. + + This avoids visibility issues when compiling cairo-perf-trace with a + statically linked cairo library on architectures which do not support + hidden visibility (example: win32). + + perf/Makefile.am | 1 + + perf/cairo-perf-trace.c | 6 ----- + src/Makefile.sources | 1 + + src/cairo-error.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 26 ------------------- + 5 files changed, 71 insertions(+), 32 deletions(-) + +commit 0740c8e4f37e5ff17d2bf294c37c438de0be0a41 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 23 10:08:52 2011 +0200 + + Hide private symbols on MacOSX + + gcc provides the hidden visibility attribute on Darwin, which can be + used to deny access to private cairo symbols. + + src/cairo-compiler-private.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 441f9c5037dd32464bd87e21108b702c0a3c508a +Author: Taekyun Kim <tkq.kim@samsung.com> +Date: Tue Jun 21 17:19:58 2011 +0900 + + Fix intersect_with_boxes() to produce tight clip extents + + Previous code was intersecting extents with infinitely large rectangle. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-clip.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 8fb9a6727e2b769bfa388c6027ebad0a53ffa02b +Author: Haithem Rahmani <haithem.rahmani@gmail.com> +Date: Mon Jun 20 11:16:14 2011 +0200 + + boilerplate: Use correct flag type in DFBWindowDescription + + The window description flag macros are prefixed with DWDESC_. + + The issue was not noticed because DWDESC_CAPS and DSDESC_CAPS have the + same value. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=37049 + + boilerplate/cairo-boilerplate-directfb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 190d8d72902b930d7cddb042fa3386d100dd072c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jun 20 11:07:33 2011 +0200 + + build: Silence autoconf warnings + + Autoconf 2.86 reports: + + warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body + + build/aclocal.cairo.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b6d593dc71e276576ce2af9fa2267eebdddd578a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 18 17:06:52 2011 +0200 + + build: Clean up environment variables and flags for the win32 build + + Avoid ovverriding LINK, as it has a special meaning for the MSVC build + tools. + + boilerplate/Makefile.win32 | 4 +--- + build/Makefile.win32.common | 24 ++++++++++++++---------- + src/Makefile.win32 | 4 ++-- + test/Makefile.win32 | 4 ++-- + test/pdiff/Makefile.win32 | 4 +--- + 5 files changed, 20 insertions(+), 20 deletions(-) + +commit 5534c305241e078c9a5745e511c0700545e045bb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 18 16:59:00 2011 +0200 + + build: Use common rules for making pdiff + + Instead of providing special rules for compiling C files in pdiff, use + the common ones and build a different pdiff for debug and release. + + test/Makefile.win32 | 6 +++--- + test/pdiff/Makefile.win32 | 9 +++------ + 2 files changed, 6 insertions(+), 9 deletions(-) + +commit f9b50cec2b05a9371c90a1e6996af927e47b1d34 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 18 17:07:17 2011 +0200 + + build: Improve dependencies in win32 Makefiles + + Test targets now explicitly depend on the cairo library and build it + appropriately. + + Phony targets depend on inform, so that they print a warning if the + environment is not set up appropriately. + + Makefile.win32 | 23 +++++------------------ + test/Makefile.win32 | 25 +++++++++++-------------- + 2 files changed, 16 insertions(+), 32 deletions(-) + +commit c7c3475cdb429a996190c2c95c20a60984a1bba9 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jun 18 16:37:34 2011 +0200 + + build: Improve generation of cairo-features.h on win32 + + All of the build depends on cairo-features.h. By having a target to + generate it that can be run from anywhere, it is possible to delegate + the dependency handling to 'make'. + + Makefile.win32 | 1 - + build/Makefile.win32.common | 5 ++- + build/Makefile.win32.features-h | 96 ++++++++++++++++++++--------------------- + build/configure.ac.features | 12 +++--- + 4 files changed, 57 insertions(+), 57 deletions(-) + +commit 101fab7cd8a90f7cf3d8113c792b3f8c2a9afb7d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 15 11:37:36 2011 +0200 + + win32-font: Improve static data reset function + + The hashtable is guaranteed to only contain font faces which are + currently referenced, hence there is no need to remove any font face + when it is reset (just like for toy-font). + + This makes the function simpler and fixes the assertion + + Assertion failed: predicate != NULL, file cairo-hash.c, line 373 + + hit by multiple tests (the first one being "clear"). + + See https://bugs.freedesktop.org/show_bug.cgi?id=38049 + + src/cairo-win32-font.c | 32 +++++++++----------------------- + 1 file changed, 9 insertions(+), 23 deletions(-) + +commit 94bc20da50c5984e5c04929a7fde4c2f04e66380 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 17 19:15:44 2011 +0200 + + win32-font: Implement destroy function + + Win32 font faces can be removed from the hashtable upon destruction. + Based on the toy-font destruction code. + + See https://bugs.freedesktop.org/show_bug.cgi?id=38049 + + src/cairo-win32-font.c | 40 +++++++++++++++++++++++++++++++++++----- + 1 file changed, 35 insertions(+), 5 deletions(-) + +commit 94b14c929d75408958d4451253251fb3631a09bf +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 17 16:30:45 2011 +0200 + + win32-font: Do not return font in error status + + If the hashtable cointains a font matching the font being created, + only reuse it if it is not in an error status. Otherwise, remove it + from teh hashtable and create a new one. + + src/cairo-win32-font.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit b9d9ca281c9b686ea6df2b211b6100095640063e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 15 10:31:53 2011 +0200 + + Avoid deprecated functions on win32 + + Some POSIX functions are deprecated in MSVC and should instead be used + with an alternative name beginning with '_'. + + src/cairo-compiler-private.h | 11 ++++++++--- + test/cairo-test.c | 3 --- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 00a5a136123cf2b66c5e8fc9fb5d20feffbd4dcd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 15 10:34:03 2011 +0200 + + boilerplate: Silence MSVC warnings + + On Win32 INT_MIN/MAX macros are defined in stdint.h, which makes MSVC + complain about the following redefinitions: + + ...\stdint.h(73) : warning C4005: 'INT16_MIN' : macro redefinition + ...\boilerplate\cairo-boilerplate.h(64) : see previous definition of 'INT16_MIN' + ...\stdint.h(77) : warning C4005: 'INT16_MAX' : macro redefinition + ...\cairo-boilerplate.h(67) : see previous definition of 'INT16_MAX' + ...\stdint.h(80) : warning C4005: 'UINT16_MAX' : macro redefinition + ...\boilerplate\cairo-boilerplate.h(70) : see previous definition of 'UINT16_MAX' + + boilerplate/cairo-boilerplate.h | 1 + + 1 file changed, 1 insertion(+) + +commit cbf11fa26109a6c725c7d7a356d4acc16a7be0e2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jun 17 16:29:00 2011 +0200 + + toy-font: Do not open-code cairo_font_face_reference () + + Since 03be41151d06d48d55bc1e172535829ec45a10cf, it is safe to use + cairo_font_face_reference () to increment the reference count of a + font taken from the hashtable, because no mutex is being locked twice. + + src/cairo-toy-font-face.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 5a79e9f536771234f5460ef35e8ed63dc5ecf82a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jun 20 09:41:27 2011 +0200 + + script: Return status when flushing device + + Since 92d7b1eee96e6b1448aaf3c95a44238fa0eeff48 the flush vfunction + should return a cairo_status_t. + + Silences the warning: + + cairo-script-surface.c: At top level: + cairo-script-surface.c:3528:5: warning: initialization from + incompatible pointer type [enabled by default] + cairo-script-surface.c:3528:5: warning: (near initialization for + '_cairo_script_device_backend.flush') [enabled by default] + + src/cairo-script-surface.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit ced061124d0b402c5ce471ce04e9a936dc46da94 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 16 14:43:56 2011 +0200 + + xlib-xcb: Implement cairo_xlib_device_debug_{g,s}et_precision + + 63bdae27a83381fb8c3786c2d7a6c2592e388ee9 introduced a new public API + cairo_xlib_device_debug_set_precision(), exported by cairo-xlib. + cairo-xlib-xcb must implement it as well, because it must provide the + same public API. + + Fixes the compilation of cairo-sphinx with --enable-tee + --enable-xlib-xcb --enable-script. + + Reported-by: James Cloos <cloos@jhcloos.com> + + src/cairo-xlib-xcb-surface.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 3a504282ef2c3383ad91209a522aa049898bd2c4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 16 09:22:54 2011 +0200 + + build: Don't build cairo-sphinx when the tee surface is off + + cairo-sphinx depends on cairo-tee, which is not always enabled. + + Reported-by: James Cloos <cloos@jhcloos.com> + + util/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit f409f74decf63b3dbf68b713317a1eb17cd71a0f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jun 16 08:47:56 2011 +0200 + + xlib: Fix build of xlib-xcb + + 45665c0d48396af7bd653d546115a5f36cfa9ae1 breaks the build of + cairo-xlib-xcb because it does not disable the compilation of + cairo-xlib implementation files when cairo-xlib-xcb is enable. This + results in collisions when linking. + + Reported-by: James Cloos <cloos@jhcloos.com> + + src/cairo-xlib-display.c | 4 ++++ + src/cairo-xlib-screen.c | 4 ++++ + src/cairo-xlib-surface.c | 4 ++++ + src/cairo-xlib-visual.c | 4 ++++ + 4 files changed, 16 insertions(+) + +commit a2cd83a98670b7dd03aeb41334d6e2fb030048af +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 15 15:27:21 2011 +0200 + + toy-font-face: Do not assume hash != 0 + + The assumption that no font face will hash to 0 is not correct. + Moreover, no special value is needed to mark fonts in error status, as + they can simply be detected upon lookup and destruction. + + src/cairo-toy-font-face.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit a06668fabef17daff5f8cea125b8b33ea7568a81 +Author: Andrea Canciani <ranma42@nirvana-fedora.(none)> +Date: Thu Jun 9 14:16:48 2011 +0200 + + path-stroke: Avoid mixing cap and join values + + Silence the warning: + + cairo-path-stroke.c: In function '_cairo_stroker_add_caps': + cairo-path-stroke.c:861:29: warning: comparison between + 'cairo_line_cap_t' and 'enum _cairo_line_join' [-Wenum-compare] + + CAIRO_LINE_JOIN_ROUND and CAIRO_LINE_CAP_ROUND have the same value, + hence this defect went unnoticed so far. + + src/cairo-path-stroke.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8e7589abcc4075d4a1de9151e79fda5d093d03bb +Author: Taekyun Kim <podain77@gmail.com> +Date: Wed Jun 15 23:23:02 2011 +0900 + + tessellator: Fixed to produce an output box with x1 <= x2 for single box input + + Winding of a box is toggled by swapping x1, x2 coordinates. So + we have to swap those coordinate rather than just copying. + + Many routines assume that boxes are left-top to right-bottom + convention. So tessellator should produce such output boxes. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 3b9c8744898823a4b09917f0540a324318fef726 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 14 15:33:18 2011 +0200 + + test: Use POSIX-compatible unlink + + On Win32, the POSIX-compatible unlink function is named "_unlink". + + A function named "unlink" exists, but does not have the same behavior + as the POSIX-specified one. This function makes the cairo test suite + behave incorrectly and immediately terminate with the message: + + Error: Cannot remove cairo-test-suite.log: No error + + test/cairo-test.c | 1 + + 1 file changed, 1 insertion(+) + +commit 5cb18fcec7d973595e4e8ae992ce84836b815ce4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 14 15:34:09 2011 +0200 + + test: Fix compilation on win32 + + The Microsoft C Compiler does not accept empty-initialized arrays: + + cairo-boilerplate-win32-printing.c(373) : error C2059: syntax error : '}' + cairo-boilerplate-win32-printing.c(374) : warning C4034: sizeof returns 0 + + boilerplate/cairo-boilerplate-pdf.c | 9 ++++++--- + boilerplate/cairo-boilerplate-private.h | 4 ++++ + boilerplate/cairo-boilerplate-ps.c | 10 ++++++++-- + boilerplate/cairo-boilerplate-svg.c | 10 ++++++++-- + boilerplate/cairo-boilerplate-win32-printing.c | 10 ++++++++-- + 5 files changed, 34 insertions(+), 9 deletions(-) + +commit 0cbe3d1020fae0fdd601f48ca8c67861390c78ad +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 14 16:30:01 2011 +0200 + + test: Update generation of constructors on win32 + + 51bd27afa147f78c8f4f3778cee725b6444e7eb0 removed + make-cairo-test-constructors.c but did not update the win32 Makefiles + accordingly. + + cairo-test-constructors.c is now generated by a make target which runs + make-cairo-test-constructors.sh. + + test/Makefile.win32 | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 510f0f391cf07a6357468493a3b9aacbd0069a8d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 14 16:15:57 2011 +0200 + + boilerplate: Add generation of constructors on win32 + + cairo-boilerplate-constructors.c is one of the sources required to + build the boilerplate. + + This file is generated by a script, invoked by the appropriate make + target during the build. + + boilerplate/Makefile.win32 | 3 +++ + 1 file changed, 3 insertions(+) + +commit 45665c0d48396af7bd653d546115a5f36cfa9ae1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jun 14 10:45:18 2011 +0200 + + Remove if's from Makefile.sources + + make on win32 complains that: + + make[1]: Entering directory `/home/ranma42/Code/fdo/cairo/src' + ../src/Makefile.sources:220: *** missing separator. Stop. + + Makefile.sources should not contain if's, which are aoutomake-only + conditionals. The correct way to conditionally include files is to + enable/disable them using C preprocessor macros. + + configure.ac | 5 ++--- + src/Makefile.sources | 29 +++++------------------------ + src/cairo-deflate-stream.c | 5 +++++ + src/cairo-xcb-connection-shm.c | 4 ++++ + src/cairo-xcb-shm.c | 4 ++++ + src/cairo-xlib-xcb-surface.c | 4 ++++ + src/cairoint.h | 4 ++++ + 7 files changed, 28 insertions(+), 27 deletions(-) + +commit 9d256b7db90ba0517a2d06a7c99f8e59021c1d6a +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jun 12 15:42:01 2011 +0200 + + xcb: Fallback to image surface for create similar + + We can't use an X11 surface in create_similar if the specified coordinates are + too small/large. However, we can still use SHM-backed memory for the image + surface which will be used instead. + + Thanks to Chris Wilson for the hint. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit fb0a40fc10849eb6e972be27c98685f6ab7bc344 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jun 11 21:32:29 2011 +0200 + + XCB: Implement PDF blend operators natively + + The PDF blend operators, as offered by cairo, where added in RENDER 0.11. This + commit makes the XCB backend use them, if they are available. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 4 ++++ + src/cairo-xcb-surface-render.c | 43 ++++++++++++++++++++++++++---------------- + 2 files changed, 31 insertions(+), 16 deletions(-) + +commit ad01d571dd4f9240275a1d4c49cbd961e3f62c3c +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Jun 11 20:18:27 2011 +0200 + + Revert "xcb: Never return NULL from create_similar" + + This reverts commit f6e6891b59656c944a7e758a53e07ed5f29f5c39. + + Returning NULL in these cases is actually the right thing to do, because the + caller expects and handles this case. + + cairo_surface_create_similar() won't return NULL due to this, because + _cairo_surface_create_similar_solid() will fall back to an image surface. + + I think I missed that part when I wrote the bad commit. + + This was found via the test suite's "zero-mask" test. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 753a4cdf307c600d27cf79ac41c314aacb9647c5 +Author: Dagobert Michelsen <dam@opencsw.org> +Date: Wed Jun 8 11:16:21 2011 +0200 + + Use detected EGREP instead of generic grep + + https://bugs.freedesktop.org/show_bug.cgi?id=38069 + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 00de16b7ac54d4c620e0be3565c83f58e01567ac +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Jun 4 13:47:15 2011 +0200 + + image: Don't crash on weird pixman formats + + _pixel_to_solid() used to assert that it got a known cairo_format_t. + However, this might not be the case when backends decide to use a pixman + format that is not representable by a cairo format (X and DirectFB are + examples for backends that do that). + + This patch makes _pixel_to_solid() return NULL in that case and fixes + the callers to deal with it. + + https://bugs.freedesktop.org/show_bug.cgi?id=37916 + + src/cairo-image-surface.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit d0615633dc1529af44740f8326ca1886a8b3bf5c +Author: Murray Cumming <murrayc@murrayc.com> +Date: Mon May 9 09:45:06 2011 +0200 + + cairo: Remove trailing comma from cairo_format_t + + Fixes warnings when building with C++. + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=36989 + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6edc5ca55f35a3705ef324b78b4d10183df9d4af +Author: Taekyun Kim <tkq.kim@samsung.com> +Date: Wed Jun 8 13:05:54 2011 +0900 + + tessellator: Fix boxes tessellator to handle num_boxes <= 1 correctly + + We cannot assume that parameter 'out' is empty. So we should make it + empty before returning CAIRO_STATUS_SUCCESS when 'in' contains no boxes. + + When 'in' contains a single box, we should copy 'in' to 'out' rather + than just returning CAIRO_STATUS_SUCCESS. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-bentley-ottmann-rectangular.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 27d26bb8b5552915a63f5e9d65597f0ab99102b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 6 15:07:01 2011 +0100 + + cairo-perf-diff-files: Don't print size/content for trace results + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-diff-files.c | 27 +++++++++++++++++---------- + 1 file changed, 17 insertions(+), 10 deletions(-) + +commit 61fd10376fd89a0c5aa504924594d12fa9899b80 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 6 15:05:51 2011 +0100 + + cairo-trace: Fix use of buf outside of scope + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=37746 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit d673b9547f29bec74ccaa74e2660223cc2feb5c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 2 09:11:32 2011 +0100 + + boilerplate: Introduce create_similar hook + + A deficiency of cairo-perf-trace is that it currently always uses similar + surfaces for new surface which are kindly cleared by Cairo. This does + not accurately reflect the captured trace and introduces large bandwidth + overheads that distort the profiles. + + So we introduce a new boilerplate hook so that the targets can create a + surface without incurring additional overheads. + + [Fixes the broken partial commit of bf1b08d066e.] + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-directfb.c | 2 ++ + boilerplate/cairo-boilerplate-drm.c | 2 ++ + boilerplate/cairo-boilerplate-egl.c | 1 + + boilerplate/cairo-boilerplate-pdf.c | 2 ++ + boilerplate/cairo-boilerplate-ps.c | 4 ++++ + boilerplate/cairo-boilerplate-quartz.c | 2 ++ + boilerplate/cairo-boilerplate-script.c | 1 + + boilerplate/cairo-boilerplate-skia.c | 2 ++ + boilerplate/cairo-boilerplate-svg.c | 4 ++++ + boilerplate/cairo-boilerplate-test-surfaces.c | 8 ++++++++ + boilerplate/cairo-boilerplate-vg.c | 4 ++++ + boilerplate/cairo-boilerplate-wgl.c | 1 + + boilerplate/cairo-boilerplate-win32-printing.c | 2 ++ + boilerplate/cairo-boilerplate-win32.c | 2 ++ + 14 files changed, 37 insertions(+) + +commit 72b6299c1239c53baa38f44bc898c0c184ce3c71 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 2 08:57:19 2011 +0100 + + gl: Mark the use-once vertex buffers as DYNAMIC + + As we write, use and then immediately discard the vertex buffers, our + usage pattern more closely matches DYNAMIC (as opposed to STREAM). This + improve performance by about 10% on intel. + + firefox-talos-gfx(snb) 20.226 -> 18.402 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bf1b08d066ebcffa71f5e728dc333f4494ff4ba3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 1 23:03:36 2011 +0100 + + perf + + boilerplate/cairo-boilerplate-glx.c | 4 ++ + boilerplate/cairo-boilerplate-xcb.c | 67 +++++++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate-xlib.c | 58 +++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 72 ++++++++++++++++++++++++++++++++++-- + boilerplate/cairo-boilerplate.h | 11 +++++- + perf/cairo-perf-trace.c | 54 +++++++++++++++------------ + src/cairo-xcb-connection.c | 9 +++++ + src/cairo-xcb.h | 3 ++ + 8 files changed, 248 insertions(+), 30 deletions(-) + +commit 52f79bfcf34c504c7baa7d996983a7283f02f51e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 1 19:16:02 2011 +0100 + + perf/micro: Add wave + + Benjamin just demonstrated this funky trick for generating pixel + outlines, and as no good deed should go unpunished, I've added his code + to the perf suite. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/Makefile.am | 1 + + perf/cairo-perf-micro.c | 1 + + perf/cairo-perf.h | 1 + + perf/micro/wave.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 115 insertions(+) + +commit 1b33552a6d9bb7ace2787522c3641736f2cc5ef4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 1 18:02:24 2011 +0100 + + test: Add unaligned-box + + Test the handling of the various pixel-alignment boundary points of + rectangles. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/unaligned-box.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ + test/unaligned-box.ref.png | Bin 0 -> 496 bytes + 4 files changed, 75 insertions(+) + +commit 9bdfae6e218185dd9cc2770f5e7d4ca887ce4775 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 1 16:55:50 2011 +0100 + + boilerplate/xcb: Fix silly cut'n'paste errors in previous commit + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-xcb.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 63bdae27a83381fb8c3786c2d7a6c2592e388ee9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 27 15:59:37 2011 +0100 + + xlib,xcb: Force strict adherence to the Render specification when testing + + Introduce cairo_xlib_device_debug_set_precision() to override the + automatic selection of rendering precision and force the Xorg/DDX to + strictly adhere to the precise rendering mode of the Render + specification. This allows us to test drivers without worrying, too + much, about minor discrepancies in antialiasing. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-xcb.c | 14 ++++++++++++++ + boilerplate/cairo-boilerplate-xlib.c | 23 ++++++++++++++++++++++- + src/cairo-xcb-connection.c | 20 ++++++++++++++++++++ + src/cairo-xcb-private.h | 3 +++ + src/cairo-xcb-surface-render.c | 32 ++++++++++++++++++++++++++++++++ + src/cairo-xcb.h | 11 +++++++++++ + src/cairo-xlib-display.c | 21 +++++++++++++++++++++ + src/cairo-xlib-private.h | 6 ++++++ + src/cairo-xlib-surface.c | 7 +++++-- + src/cairo-xlib.h | 13 +++++++++++++ + 10 files changed, 147 insertions(+), 3 deletions(-) + +commit e21b373c94b1edb2828d4fee7ff45060fb22dbda +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 26 16:26:40 2011 +0100 + + cairo-trace: Fix an obscure bug recording the fishtank + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 371 ++++++++++++++++++++++++----------------------- + 1 file changed, 191 insertions(+), 180 deletions(-) + +commit 6936a2b4178803506de279de56b98a138cc6288b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 22 20:41:18 2011 +0930 + + PS: Use tight bounding box + + Now that the page size is specified by %%DocumentMedia + we can make %%BoundingBox compliant. + + src/cairo-ps-surface.c | 15 ++++----------- + 1 file changed, 4 insertions(+), 11 deletions(-) + +commit d11b39ea274edea1fe4aab87791101da0783be3c +Author: Benjamin Otte <otte@redhat.com> +Date: Fri May 20 20:57:33 2011 +0200 + + build: Use $GREP -e instead of plain grep -e + + https://bugs.freedesktop.org/show_bug.cgi?id=37388 + + build/configure.ac.warnings | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit bdfd860ae7a4e5fd7157748f90b0d8c6cc04e5ca +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu May 19 14:43:34 2011 -0400 + + Avoid implicit conversion to double when rounding + + src/cairo-scaled-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4d96859ba5eb6018ae257ef6bfead228583908cf +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Mar 21 16:23:30 2011 +0200 + + gl: Add fallback path for GLES2 implementations not supporting GL_OES_mapbuffer + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 18 ++++++++++++++---- + src/cairo-gl-device.c | 14 ++++++++++++++ + src/cairo-gl-dispatch.c | 3 +-- + src/cairo-gl-private.h | 2 ++ + 4 files changed, 31 insertions(+), 6 deletions(-) + +commit c2b4bc6dead3e1fd0aacd9d767a299259f895e4d +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Mar 21 16:12:00 2011 +0200 + + gl: Fall back to dlsym() if *GetProcAddress() fails + + In strictly conforming EGL implementations, eglGetProcAddress() can be used + only to get extension functions, but some of the functions we want belong to + core GL(ES). If the *GetProcAddress function provided by the context fails, + try to get the address of the wanted GL function using standard system + facilities (eg dlsym() in *nix systems). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + configure.ac | 11 ++++++++++ + src/cairo-gl-dispatch.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 65 insertions(+) + +commit 2001d2074723c64b1e5a6cb4c550d6a0a8cea812 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Mar 9 18:17:42 2011 +0200 + + gl: Define the float precision in the fragment shader for GLES2 + + According to the GLSL ES standard, the precision of variables in the fragment + shader should be explicitly defined (although mesa's compiler is not that + strict). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-shaders.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 1595f20bb70ebba8d192500d4de455170c8d81a0 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Mar 4 18:09:44 2011 +0200 + + boilerplate/egl: Add GLES2 support + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-egl.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +commit 2472ed899cc8bfd97b3cec1f322b601038d28731 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 23:11:06 2011 +0200 + + gl: Fix build issues for GLES2 + + The glReadBuffer/glDrawBuffer functions are not present in GLES2, only + a single buffer is supported. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 4 ++++ + src/cairo-gl-ext-def-private.h | 4 ++++ + src/cairo-gl-gradient-private.h | 5 +++++ + src/cairo-gl-private.h | 6 ++++++ + src/cairo-gl.h | 2 +- + 5 files changed, 20 insertions(+), 1 deletion(-) + +commit f84653422a79aec98299ac7c9f989fe4dfa8b973 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 23:17:31 2011 +0200 + + gl: Add GLESv2 backend to build system + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/Makefile.win32.features | 12 ++++++++++++ + build/Makefile.win32.features | 1 + + build/Makefile.win32.features-h | 3 +++ + build/configure.ac.features | 1 + + configure.ac | 14 ++++++++++++++ + src/Makefile.sources | 4 ++++ + src/Makefile.win32.features | 16 ++++++++++++++++ + 7 files changed, 51 insertions(+) + +commit b990dfb06774864ab33dcb195d3442b8f5f3715b +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 23:07:12 2011 +0200 + + gl: Require the GL_OES_texture_npot extension for GLES2 + + The default support for GLES2 NPOT textures is very limited. We need the + additional features provided by the GL_OES_texture_npot extension. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +commit faa031f6d5660b1ce5cc29f58db0ba2f675dc283 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 23:05:04 2011 +0200 + + gl: Use GL_MAX_TEXTURE_IMAGE_UNITS to query the maximum texture units + + The previous used value, GL_MAX_TEXTURE_UNITS, is only appropriate for the + fixed pipeline. It is replaced with GL_MAX_TEXTURE_IMAGE_UNITS that refers to + the number of texture units available in the fragment shader. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1f1255689b7469193eb7bc0efbd5248b748164ad +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 23:01:36 2011 +0200 + + gl: Remove unnecessary call to glDisableClientState() + + This function has no effect when using shaders and is not supported at all in + GLES2. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 2 -- + 1 file changed, 2 deletions(-) + +commit bbb244c7f2fe632cfee453f01dbde64e71dd3c88 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 22:48:51 2011 +0200 + + gl: Add GLES2 support for drawing image surfaces on gl surfaces + + Work around GLES2 limitations in texture pixel formats and options for + pixel packing/unpacking. + + Depending on the endianness and the image pixel format, we may need to + manually swap the elements in a pixel group. This is not currently + implemented, but for little-endian architectures the common pixman BGRA + formats don't need a swap. + + Due to GL_UNPACK_ROW_LENGTH missing in GLES2 we have to extract the image + data ourselves in some cases, so we can provide it to glTexSubImage2D + using a layout it can understand. We must extract the pixels if: + a. we don't want full-length lines or + b. the row stride cannot be handled by GL itself using a 4 byte + alignment constraint + + We use GL_PACK_ALIGNMENT 4 by default because that is the default pixman + alignment value and in some cases it allows us to avoid the manual pixel + extraction. However, when we extract image data manually we use an alignment + of 1. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-ext-def-private.h | 20 ++++ + src/cairo-gl-private.h | 6 +- + src/cairo-gl-surface.c | 240 +++++++++++++++++++++++++++++++++++++---- + 3 files changed, 244 insertions(+), 22 deletions(-) + +commit 14db3d23c7d7862fe335a94f24962b715ad30c85 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Mar 3 15:55:22 2011 +0200 + + gl: Add support for creating image surfaces for GLES2 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-ext-def-private.h | 4 +++ + src/cairo-gl-surface.c | 55 +++++++++++++++++++++++++++++++++--------- + 2 files changed, 47 insertions(+), 12 deletions(-) + +commit 0e41145a75fa957fc3813fc1cae0b937ad5e77e1 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Mar 2 18:16:56 2011 +0200 + + gl: Use conventional texture upload for GLES2 + + GLES2 doesn't support Pixel Buffer Objects. Use conventional texture upload + for GLES2 (using client-side memory). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 3 ++- + src/cairo-gl-gradient.c | 43 ++++++++++++++++++++++++++----------------- + 2 files changed, 28 insertions(+), 18 deletions(-) + +commit d20f66608c030f52cad5575cca5d1bdd7c31ac20 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Mar 2 02:10:05 2011 +0200 + + gl: Require the GL_EXT_texture_format_BGRA8888 extension for GLES2 + + This extension adds limited BGRA support to GLES2. It is better than + nothing... + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 7 ++++++- + src/cairo-gl-ext-def-private.h | 12 ++++++++++++ + src/cairo-gl-gradient.c | 23 ++++++++++++++++++++--- + 3 files changed, 38 insertions(+), 4 deletions(-) + +commit 777ed8b4c4bf7a099041a16c079e22b68dae70ad +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Tue Mar 8 12:05:48 2011 +0200 + + Extract function to query endianness from xlib/xcb and make it common + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 12 ++---------- + src/cairo-xlib-surface.c | 19 ++++--------------- + src/cairoint.h | 7 +++++++ + 3 files changed, 13 insertions(+), 25 deletions(-) + +commit 7bfcf1deaf572dcc948e4093dcb864aeaa65e6b4 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Mar 2 01:28:13 2011 +0200 + + gl: Store gradients in 2D textures of height 1 instead of 1D textures + + 1D textures are not available in GLES2. We use 2D textures with height 1 + instead, which are equivalent to 1D textures and exist across all GL flavors. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 6 +++--- + src/cairo-gl-gradient.c | 6 +++--- + src/cairo-gl-shaders.c | 44 ++++++++++++++++++++++---------------------- + 3 files changed, 28 insertions(+), 28 deletions(-) + +commit d308eee918f569227d289208e3ef1b5152bbd3f5 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Tue Mar 1 16:41:21 2011 +0200 + + gl: Provide a shader implementation of GL_CLAMP_TO_BORDER for GLES2 + + The GL_CLAMP_TO_BORDER wrapping method (used with CAIRO_EXTEND_NONE) is not + available in GLES2. We use shaders to implement similar functionality for + GLES2. + + If bilinear filtering is used, the shader performs a linear fade to + transparency effect in the texel coordinate intervals [-1/2n, 1/2n] + and [1 - 1/2n, 1 + 1/2n] (n: texture size). + + If nearest filtering is used, the shader ensures that a clear color is + used for all texel coordinate values outside [0, 1). + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 33 +++++- + src/cairo-gl-ext-def-private.h | 4 + + src/cairo-gl-shaders.c | 221 ++++++++++++++++++++++++++++++++++++----- + 3 files changed, 229 insertions(+), 29 deletions(-) + +commit 63aa65cfbb0fa25d679c24cd78139d2557bbed37 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Tue Mar 1 14:50:25 2011 +0200 + + gl: Add functions to get the filter and extend of gl operands. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 8 +++++++ + 2 files changed, 65 insertions(+) + +commit 7185ce4ddb0d291ecbecd31b5855be798cca2058 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Feb 28 17:28:46 2011 +0200 + + gl: Pass more information to the shader emitter functions + + This makes the shader emitter functions more versatile. It allows them to use + all information provided by the operands and the context to decide what shader + to produce. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 8 ++++---- + src/cairo-gl-private.h | 4 ++-- + src/cairo-gl-shaders.c | 34 +++++++++++++++++----------------- + 3 files changed, 23 insertions(+), 23 deletions(-) + +commit 1f9200ffbf19e73ec2f11a56ec77a104f07c7ec0 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Feb 14 16:36:09 2011 +0200 + + gl: Add GLES2 support to dispatch table initialization + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-dispatch-private.h | 30 +++++++----- + src/cairo-gl-dispatch.c | 105 +++++++++++++++++++++++++++------------- + 2 files changed, 90 insertions(+), 45 deletions(-) + +commit 4804160fd16912559acfaed55c8d4aeaecb18190 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Feb 14 15:11:07 2011 +0200 + + gl: Store the GL flavor (Desktop or ES) in the device struct + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-device.c | 1 + + src/cairo-gl-info.c | 16 ++++++++++++++++ + src/cairo-gl-private.h | 11 +++++++++++ + 3 files changed, 28 insertions(+) + +commit f1eef40c2a2c865999d29230c84cd709784ca294 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Feb 14 14:45:52 2011 +0200 + + gl: Correctly extract GL version from OpenGL ES version strings + + The GL version string returned by glGetString() for GLES doesn't have the + version number at the beginning of the string. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-info.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit b1c96f18526ad09f8a972feecaefe465c61307b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 4 08:04:43 2011 +0100 + + Silence the compiler for another couple of RGB30 switches + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-glyphs.c | 1 + + src/cairo-scaled-font.c | 1 + + 2 files changed, 2 insertions(+) + +commit 5559dd0bbce877e801f2b02c8127a1d15e60003f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 4 08:02:56 2011 +0100 + + image: Fix pixman format to RGB30 conversion + + Søren Sandmann Pedersen spotted that we had reversed the channel order + in the conversion back from the pixman format codes to + CAIRO_FORMAT_RGB30. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 356c4ed9ccb317b29fa7a9bb89b43f73cd70053e +Author: Jesse Barnes <jbarnes@virtuousgeek.org> +Date: Wed Apr 20 10:34:05 2011 -0700 + + Expose 30bpp/10bpc support: CAIRO_FORMAT_RGB30 + + This is a common format used by framebuffers to drive 10bpc displays + and is often hardware accelerated by XRender with underlying support + from pixman's x2r10g10b10 format (which provides coercion paths for + fallbacks). + + Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-debug.c | 1 + + src/cairo-image-surface.c | 25 +++++++++++++++++++++++-- + src/cairo-png.c | 4 ++++ + src/cairo-xlib-display.c | 1 + + src/cairo.h | 4 +++- + src/cairoint.h | 2 +- + util/cairo-script/cairo-script-operators.c | 4 ++++ + util/cairo-trace/trace.c | 4 ++++ + 8 files changed, 41 insertions(+), 4 deletions(-) + +commit bf75c9542d97533d419ba19c8e2b91e03b0370da +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Apr 21 17:53:21 2011 -0400 + + win32: Explain the purpose of the surface extents + + It wasn't immediately obvious to me what the purpose of having + extents instead of just a size was. + + src/cairo-win32-private.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 9f92901b0910563f2523ebe7289abd9094271c98 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Apr 21 15:23:14 2011 -0400 + + Remove quartz-image extents. + + We never used the x,y portion of the extents so we might as well take it out. + + src/cairo-quartz-image-surface.c | 15 ++++++++++----- + src/cairo-quartz-private.h | 2 +- + 2 files changed, 11 insertions(+), 6 deletions(-) + +commit b377380b7a5fe0982d057975cd87f6b652d3b0ff +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Apr 5 19:08:31 2011 +0200 + + test/Makefile.am: Don't reference non-existant files + + In commit 532cbcfbc7d1b 'Add unaligned boxes to "operator-source" test', I + removed some reference images from the test suite, but I forgot to also remove + these files from test/Makefile.am. This caused "make dist" to fail. + + Thanks to Alexandros Frantzis for noticing this. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.am | 5 ----- + 1 file changed, 5 deletions(-) + +commit a80bf9ed43ebb510027f95f623a012c55f7566b3 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Mar 21 18:46:32 2011 +0100 + + image: Don't use the fast path if it's wrong + + Fixes the new "operator-source" test and the original report from: + http://lists.cairographics.org/archives/cairo/2011-March/021827.html + + I tested this code path with all operators and "source" is the only one which + causes issues with rendering outside of the boxes. + + Possibly fixes: https://bugs.freedesktop.org/show_bug.cgi?id=35407 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-image-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 532cbcfbc7d1b710daf7b506bfd87048dd8d44db +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Mar 21 18:42:27 2011 +0100 + + Add unaligned boxes to "operator-source" test + + These ref images might be wrong. Since the test failed here already before this + change, I took the old ref images and copied the new part from the test output + underneath it. For the backends that I don't have, I deleted the images (sorry). + + After this, the "operator-source" test still fails for me on all backends, but + much more prominently so for the image backend. xcb-render-0.0/argb32 gets + compared against a rgb24 ref image, but apparently this was already the case + before(?). The rest are minor differences. + + This reveals a bug in the image backend. This was originally reported here: + http://lists.cairographics.org/archives/cairo/2011-March/021827.html + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/operator-source.c | 25 +++++++++++++++++++++---- + test/operator-source.image16.ref.png | Bin 2756 -> 3959 bytes + test/operator-source.pdf.rgb24.ref.png | Bin 3645 -> 0 bytes + test/operator-source.quartz.argb32.ref.png | Bin 4936 -> 0 bytes + test/operator-source.quartz.rgb24.ref.png | Bin 3771 -> 0 bytes + test/operator-source.ref.png | Bin 4395 -> 5745 bytes + test/operator-source.rgb24.ref.png | Bin 3231 -> 4639 bytes + test/operator-source.svg12.argb32.xfail.png | Bin 2967 -> 0 bytes + test/operator-source.svg12.rgb24.xfail.png | Bin 2976 -> 0 bytes + test/operator-source.xlib-fallback.ref.png | Bin 3177 -> 4444 bytes + test/operator-source.xlib.ref.png | Bin 4420 -> 5721 bytes + test/operator-source.xlib.rgb24.ref.png | Bin 3201 -> 4447 bytes + 12 files changed, 21 insertions(+), 4 deletions(-) + +commit 90156f6ab7b94e9e576e34f6a2d8cb809242f8d0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Mar 21 09:58:29 2011 +0100 + + Fix visibility issues found by make check + + src/cairo.c | 1 + + src/cairoint.h | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 7ea7a7714b1937f4a772cab9b8a67ea04b729ff8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Mar 15 23:40:35 2011 +0100 + + Fix warning by check-doc-syntax + + The check-doc-syntax step of 'make check' reports: + + ./cairo-gl.h: * cairo_device_t, which represents an GL context created by the user. + Error: some function names in the docs are not followed by parentheses. + Fix this by searching for the following regexp in the above files: + '^[^:]*:[/ ][*]\(\|[ ].*\)\([^#']\|^\)\<\(cairo_[][<>/0-9a-z_]*\>[^][<>(]\)' + + src/cairo-gl.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4c042d0594bf1f3403fee5a8ed11f8473c3cf26 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Mar 15 23:08:16 2011 +0100 + + Improve headers-standalone target + + make check reports multiple: + warning: control reaches end of non-void function + + and on MacOS X it complains that: + error: unable to open executable '' + + src/Makefile.am.analysis | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit cec4c9c91ae1848c095e9c7ecd8ddcc60cf2810a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Mar 19 11:05:21 2011 +0100 + + Revert "Add an implementation of fmax for use with MSVC" + + This reverts commit de2c5bfa19ce6b3fda50bca3445aabc040947bc9. + + fmax() is not used anymore and should not be used in future. + + src/cairo-compiler-private.h | 14 -------------- + 1 file changed, 14 deletions(-) + +commit 5339533737f0c3cb02ced551960a34574b7a4e58 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Mar 19 11:04:08 2011 +0100 + + Do not use fmax() + + fmin() and fmax() are not available on all the supported + architectures. MIN() and MAX() should be used in their place. + + src/cairo-matrix.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 058227004e2eabc99ccfbebe3fcf86b0a13b96b4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jan 20 15:45:04 2011 +0100 + + Remove unused function declarations + + These functions have no implementation and are never called. + + src/cairo-gstate-private.h | 8 -------- + src/cairo-recording-surface-private.h | 5 ----- + src/cairo-scaled-font-subsets-private.h | 17 ----------------- + src/cairoint.h | 7 ------- + 4 files changed, 37 deletions(-) + +commit ab8c108b88edf49959b95a8d7cc12edb239d361c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Mar 18 16:57:04 2011 +0100 + + Do not warn when ignoring the return value of _cairo_rectangle_intersect() + + gcc complains that + + cairo-surface-wrapper.c:647: warning: ignoring return value of + ‘_cairo_rectangle_intersect’, declared with attribute warn_unused_result + + It can be silenced by making _cairo_rectangle_intersect() + cairo_private_no_warn. This makes it possible to avoid unused + temporary variables in other places and reduces the dead assignments + reported by clang static analyzer from 114 to 98. + + src/cairo-analysis-surface.c | 21 +++++++-------------- + src/cairo-clip.c | 10 ++++------ + src/cairo-gstate.c | 4 +--- + src/cairo-pattern.c | 7 +------ + src/cairo-pdf-surface.c | 8 ++------ + src/cairo.c | 2 +- + src/cairoint.h | 2 +- + src/drm/cairo-drm-i915-shader.c | 8 ++------ + 8 files changed, 19 insertions(+), 43 deletions(-) + +commit 628ef17aca98ea3b0816a7dfa9e990275af6c791 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Mar 18 16:46:24 2011 +0100 + + image: Silence gcc warning + + gcc does not know thta num_glyph is guaranteed to be strictly + positive, so it complains that: + + cairo-image-surface.c:3787: warning: ‘status’ may be used uninitialized in this function + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e0444a458a2a03077e88ce326fb316530204276b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Mar 18 16:39:58 2011 +0100 + + image: Silence missing enum value warning + + cairo-image-surface.c:101: warning: enumeration value ‘PIXMAN_x14r6g6b6’ not handled in switch + + src/cairo-image-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit ad458d816a60613ee408d96bee8b77c64e6633e3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Mar 18 16:36:12 2011 +0100 + + trace: Always emit a function name for write-to-png-stream + + By emitting an empty function name when it it impossible to perform + the lookup, we can get rid of the warning: + + trace.c:3714: warning: unused variable ‘symbol’ + + Additionally, this makes the syntax (or, rather, the parameter count) + for write-to-png-stream the same on every configuration. + + util/cairo-trace/trace.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit f2eb3f2178b6b7a75da4fb5e5bd880b769b69e62 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Mar 18 16:10:39 2011 +0100 + + Improve cairo_rectangle_list_t error handling + + Unify the _cairo_rectangle_list_create_in_error() functions, keeping + the best features from both (the one in cairo-clip.c statically + allocates the most common cases, the one in cairo.c throws a NO_MEMORY + error when it cannot malloc() instead of rethrowing the same error). + + The same function can be used to return an error-list in + _cairo_gstate_copy_clip_rectangle_list() when _cairo_clip_rectangle() + fails (for example becaouse of an OOM). + + src/cairo-clip-private.h | 3 +++ + src/cairo-clip.c | 5 ++--- + src/cairo-gstate.c | 8 +++++++- + src/cairo.c | 20 -------------------- + 4 files changed, 12 insertions(+), 24 deletions(-) + +commit 7db5e3fdc8ea368547bb0b8f15d190c4f6891e20 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 18 13:11:50 2011 -0300 + + Don't cache _CAIRO_ENABLE results + + Caching is fragile sinle the enable commands cannot have any side-effects + when caching. And doesn't have significant speedup at this level. Just + remove it. + + build/aclocal.enable.m4 | 74 ++++++++----------------------------------------- + 1 file changed, 11 insertions(+), 63 deletions(-) + +commit df1dd838809ed64b06595541d237e0f6bb6d23cb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 18 13:22:24 2011 +0000 + + trace: Fix hint_style/hint_metrics typo + + Compiler warning saves the day! + + trace.c: In function ‘_emit_font_options’: + trace.c:2973:20: warning: comparison between ‘cairo_hint_style_t’ and + ‘enum _cairo_hint_metrics’ + + A genuine bug, thanks gcc! + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + util/cairo-trace/trace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8a4299bf7ee3173cf956ef481bf08e5f99808272 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Feb 4 22:48:30 2011 +0100 + + quartz-font: Remove unused variables + + x_scale and y_scale are computed but never used. + + src/cairo-quartz-font.c | 12 ------------ + 1 file changed, 12 deletions(-) + +commit fd1fca8010cc91e12a852f224e672de2d60e16b7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Feb 5 10:43:04 2011 +0100 + + Make cairo_set_font_size() a wrapper of cairo_set_font_matrix() + + cairo_set_font_size() should be equivalent to setting the font matrix + to an appropriate scale matrix. + + Implementing it this way saves some code and makes sure that the same + code path is used whenever the font matrix is changed. + + src/cairo-gstate-private.h | 4 ---- + src/cairo-gstate.c | 11 ----------- + src/cairo.c | 9 +++------ + 3 files changed, 3 insertions(+), 21 deletions(-) + +commit f99358acf70e976a6cf8e5084770d540e08d22ad +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Mar 18 10:50:23 2011 +0100 + + script: Fix stroking of 3 sided boxes + + 3-sided boxes can be replaced with rectangles when clipping and + filling, but not when stroking. _emit_path() is used for all of these + operations, so it cannot perform the optimization except for 4-sided + boxes. + + Fixes stroke-open-box. + + src/cairo-script-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c0fe55651565fa63586b7e4d675149a98c7e549c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Mar 8 10:26:06 2011 +0100 + + path: Fix _cairo_path_fixed_is_rectangle() + + __cairo_path_fixed_is_rectangle() is used by the PS and PDF backends + to check if a path is equivalent to a rectangle when stroking. This is + different from being a rectangle when filling, because of the implicit + close_path appended to every subpath when filling. + + Fixes stroke-open-box. + + See https://bugs.freedesktop.org/show_bug.cgi?id=34560 + + src/cairo-path-fixed.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 43692559614e841dc169e3cec213033b0298da87 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Mar 8 10:13:24 2011 +0100 + + test: Add stroke-open-box + + Add a new test to check that the stroking of a 3-sided box is not + "optimized" to a 4-sided box. + + Test case based on the code by Simon Kellner in + https://bugs.freedesktop.org/show_bug.cgi?id=34560 + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/stroke-open-box.c | 51 +++++++++++++++++++++++++++++++++++++++++++ + test/stroke-open-box.ref.png | Bin 0 -> 148 bytes + 4 files changed, 53 insertions(+) + +commit 6521bab6e8d8c44e8a790ec6e10ae160ecaf8bc9 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Mar 5 10:59:22 2011 +0100 + + xcb,xlib: Fallback upon generic radial gradients + + The RENDER specification requires radial gradients to have the first + circle completely inside the second one, but the error is not actually + generated. + + The implementation produces the expected results if either circle + contains the other one, so only fall back in these cases. + + src/cairo-pattern.c | 29 +++++++++++++++++++++++++++++ + src/cairo-xcb-surface-render.c | 8 ++++++++ + src/cairo-xlib-surface.c | 6 ++++++ + src/cairoint.h | 3 +++ + 4 files changed, 46 insertions(+) + +commit 426fe6fadffc50f1845b114fc3f41c27f96e8e79 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Mar 5 10:59:09 2011 +0100 + + xcb,xlib: Fix 1-stop gradients + + The RENDER specification does not specify the constraints on the + gradient stops, but its implementation returns an error if less than 2 + stops are used. + + Xlib and XCB can work around this because gradients with just one stop + are by-definition the same as gradients with that stop repeated twice. + + Fixes radial-gradient-one-stop. + + src/cairo-xcb-surface-render.c | 36 +++++++++++++++++++++++++++--------- + src/cairo-xlib-surface.c | 29 +++++++++++++++++++++-------- + 2 files changed, 48 insertions(+), 17 deletions(-) + +commit c42d7f7acfaf8f67d0df2bda7c54148030705b12 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 16 17:12:59 2011 +0100 + + quartz: Fix y glyph advance + + The advances must be transformed by the "quartz inverse scale", + i.e. (scale_inverse * scale(1,-1)). + + Fixes show-glyph-advance. + + src/cairo-quartz-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit db04ab8f6357a682fbf31b8d34592fde0def961b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 16 16:24:51 2011 +0100 + + test: Add show-glyphs-advance + + This new test (based on show-glyphs-many) checks that the glyphs + advances are respected along both axes. + + 9c0d761bfcdd28d52c83d74f46dd3c709ae0fa69 introduced a bug which + regresses this test in quartz. + + Thanks to Jeff Muizelaar for the report! + + test/Makefile.am | 5 ++ + test/Makefile.sources | 1 + + test/show-glyphs-advance.c | 107 +++++++++++++++++++++++++++++++ + test/show-glyphs-advance.image16.ref.png | Bin 0 -> 1270 bytes + test/show-glyphs-advance.ps.ref.png | Bin 0 -> 901 bytes + test/show-glyphs-advance.quartz.ref.png | Bin 0 -> 1464 bytes + test/show-glyphs-advance.ref.png | Bin 0 -> 1410 bytes + test/show-glyphs-advance.svg.ref.png | Bin 0 -> 1435 bytes + 8 files changed, 113 insertions(+) + +commit 0ce4face45392cd4a44179062fb4a5715f18bb85 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 16 16:55:50 2011 +0100 + + test: Use ARRAY_LENGTH() macro + + Some tests hand-code ARRAY_LENGTH(). It is now provided by + cairo-test.h, so it can be reused. + + test/a1-bug.c | 2 +- + test/clip-disjoint.c | 2 +- + test/clip-draw-unbounded.c | 2 +- + test/dash-caps-joins.c | 2 +- + test/dash-scale.c | 6 +++--- + test/fallback-resolution.c | 2 +- + test/filter-nearest-transformed.c | 2 +- + test/joins.c | 2 +- + test/long-dashed-lines.c | 2 +- + test/mask-glyphs.c | 2 +- + test/path-precision.c | 2 +- + test/pattern-getters.c | 2 +- + test/reflected-stroke.c | 2 +- + 13 files changed, 15 insertions(+), 15 deletions(-) + +commit 75fea162d985bea622afa59771fb2d07f5241d1b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 16 16:48:18 2011 +0100 + + test: Cleanup macros + + The ARRAY_LENGTH macro is used by many tests, although sometimes it is + named ARRAY_SIZE. Define it just once in cairo-test.h and reuse it. + + In a similar way, MAX() and MIN() are currently defined in some + specific tests, while they could be reused. + + test/aliasing.c | 6 ++---- + test/api-special-cases.c | 1 - + test/cairo-test.h | 12 ++++++++++++ + test/clear-source.c | 1 - + test/clip-group-shapes.c | 2 -- + test/clip-operator.c | 5 ++--- + test/dash-offset.c | 16 +++++++--------- + test/degenerate-dash.c | 4 ---- + test/degenerate-path.c | 4 +--- + test/line-width-scale.c | 2 -- + test/mask.c | 13 ++++++------- + test/operator-clear.c | 9 ++++----- + test/operator-source.c | 9 ++++----- + test/pdf-features.c | 4 +--- + test/ps-features.c | 4 +--- + test/radial-gradient.c | 4 ++-- + test/subsurface-outside-target.c | 2 -- + test/trap-clip.c | 13 ++++++------- + test/unbounded-operator.c | 9 ++++----- + test/zero-mask.c | 2 -- + 20 files changed, 52 insertions(+), 70 deletions(-) + +commit 4ef32a36ba1e457e8dd6244a6483866d33477aac +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Mar 17 09:27:02 2011 +0100 + + test: Silence gcc warnings + + warning: cannot optimize possibly infinite loops + + gcc does not detect that the "infinite" loops are actually just one or + two iterations, depending on the has_similar value being FALSE or + TRUE. It realizes it if the iteration variable and the iteration stop + value are both enum values. + + test/cairo-test-private.h | 7 ++++++- + test/cairo-test-runner.c | 8 ++++---- + test/cairo-test.c | 19 +++++++++++-------- + 3 files changed, 21 insertions(+), 13 deletions(-) + +commit d6efb2a0b78ec8c3cc520e7a1ddebc8a5c5dc706 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Mar 17 09:24:55 2011 +0100 + + test: Silence gcc warning + + cairo-test-runner.c:180: warning: unused variable ‘buf’ + + test/cairo-test-runner.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 2b84d82bcfb6c89ececfdfe4f4e10bb631050131 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Mar 16 17:04:10 2011 +0100 + + test: Silence gcc + + api-special-cases.c:94:1: warning: "Cursor" redefined + api-special-cases.c:81:1: warning: this is the location of the previous definition + + test/api-special-cases.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit e45077612d789eaf77fea727135d4b4bdb6c90f2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Mar 17 16:38:51 2011 +0100 + + test: Fix missing REFERENCE_IMAGES + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit ed7851015404c3c186cf631c219f72dba5e129ae +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Mar 16 16:01:35 2011 +0100 + + xcb-drm: Fix undeclared variable error + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 1 + + 1 file changed, 1 insertion(+) + +commit 02b2e3c93fcc724815e8bda21c6874b0d050ae02 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 12 10:50:21 2010 +0000 + + xcb: Compile fix when using xcb-drm + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=31368 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f6e6891b59656c944a7e758a53e07ed5f29f5c39 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Mar 15 19:41:41 2011 +0100 + + xcb: Never return NULL from create_similar + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 59fec48cd617c15d5ea8d867fcf4d1fc409697c1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 15 13:21:40 2011 +0000 + + configure: Test for funlockfile + + cairo-trace already depended upon HAVE_FUNLOCKFILE for its + thread-safety. + + [This is a candidate for 1.10.] + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + build/configure.ac.system | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f2f65684f0c6e1a26741bf96bb9bec286457a571 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 13 19:30:21 2011 +1030 + + cff: Fix heap corruption + + caused by holding a pointer into a cairo_array after a realloc + + https://bugs.freedesktop.org/show_bug.cgi?id=35161 + + src/cairo-cff-subset.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit f1d313e042af89b2f5f5d09d3eb1703d0517ecd7 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Mar 3 19:14:36 2011 +0100 + + xcb: Remove _cairo_xcb_picture_copy + + All cairo_xcb_picture_t now get their own, private Picture instead of possibly + sharing it with a cairo_xcb_surface_t. + + This solves a cyclic dependency which caused cairo_xcb_picture_t to be leaked + until their device was finished. + + When an xcb surface was used as a source, a cairo_xcb_picture_t was created + which kept a reference to the surface. This picture was then added as a snapshot + to the surface which caused the surface to own a reference to the picture. + + As a result, the Picture and possibly its associated Pixmap were not freed on + the X11 server which could thus run out of memory. + + This change causes more Pictures to be created which could possibly slow down + cairo-xcb. There seems to be no measurable difference with cairo-perf-trace. For + the micro benchmarks, this has the most impact on paint_similar-rgba_source.512: + + min(ticks) min(ms) median(ms) stddev. iterations overhead + before 158732 0.159 0.159 0.11% 4: 1651.49 + after 162579 0.163 0.163 0.18% 4: 1612.41 + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=34912 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 77 ++++++++---------------------------------- + 1 file changed, 15 insertions(+), 62 deletions(-) + +commit f9344911250ea347fb0eb54d7ab1f97c8f685a20 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Feb 13 19:40:57 2011 +0100 + + xcb boilerplate: Handle device offsets correctly + + When running cairo-test-suite with "-a", backends are also tested with a + non-zero device offset. However, for "xcb-window&" the boilerplate incorrectly + overwrote the device offset with a zero offset again. + + This caused all test results to be offset by 25 pixels which obviously makes all + tests fail. + + Just removing the call to cairo_surface_set_device_offset solves the problem. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 1 - + 1 file changed, 1 deletion(-) + +commit de2c5bfa19ce6b3fda50bca3445aabc040947bc9 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Mar 3 16:34:43 2011 -0500 + + Add an implementation of fmax for use with MSVC + + src/cairo-compiler-private.h | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit aca492eb3f4a0d472e6fdb2e4dac9d52edefbff9 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Mar 3 16:31:03 2011 -0500 + + Add UINT32_MAX define. + + This is needed for building with MSCV + + src/cairo-wideint-type-private.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9669b300a06eb793bb112737cb9085ff020de682 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 2 18:30:47 2011 +0000 + + surface: Don't pass INT_UNSUPPORTED to _cairo_surface_set_error + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-surface.c | 27 ++++++++++++--------------- + 1 file changed, 12 insertions(+), 15 deletions(-) + +commit c0dc933efda7672b07e188a1195821340f911a66 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Feb 28 15:54:02 2011 +0100 + + xcb: Remove CAIRO_XCB_RENDER_HAS_COMPOSITE_SPANS + + This flag was only ever tested, but never set. Also, there is no X11 server out + there which actually supports this. + + AFAIK it was just an experiment which turned into dead code. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection-render.c | 73 ------------------ + src/cairo-xcb-private.h | 23 ++---- + src/cairo-xcb-surface-render.c | 153 ++------------------------------------ + 3 files changed, 11 insertions(+), 238 deletions(-) + +commit 6cd96f966f94cb4f9bf38f2b2c603068f10b55e8 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Feb 28 15:45:14 2011 +0100 + + xcb: Fix for PDF operators with RENDER 0.11 + + RENDER 0.11 added PDF operators and the cairo-xcb backend is already prepared + for handling them. However, it doesn't actually handle them. + + If you used such an operator with RENDER 0.11, _operator_is_supported() would + return TRUE, but later on an ASSERT_NOT_REACHED in _render_operator() is hit. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit da9d6db11538bbec159155b2c30d9d77f181e78d +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Feb 28 15:42:57 2011 +0100 + + xcb: Remove some unused code + + All of these defines where not used anymore and this '#if 0'd code was so for + ages and most likely would stay commented out for more ages, too. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 22 ---------------------- + src/cairo-xcb-private.h | 2 -- + 2 files changed, 24 deletions(-) + +commit 17169a1e5130b8a287f07eb43d41f0b51307cc57 +Author: Eric Anholt <eric@anholt.net> +Date: Mon Feb 21 13:37:00 2011 -0800 + + gl: Bind samplers just once at program compile time. + + We never bound any other value to the sampler uniforms, so why bother + resetting them all the time? + + [ 0] before firefox-talos-gfx 29.972 30.493 0.89% 3/3 + [ 0] after firefox-talos-gfx 29.397 29.599 1.27% 3/3 + + Signed-off-by: Eric Anholt <eric@anholt.net> + + src/cairo-gl-composite.c | 6 +---- + src/cairo-gl-private.h | 5 ----- + src/cairo-gl-shaders.c | 58 ++++++++++++++++++++++++++++-------------------- + 3 files changed, 35 insertions(+), 34 deletions(-) + +commit 2fae22a3f2914a6e79436bafe94d19100d7cf6bf +Author: Eric Anholt <eric@anholt.net> +Date: Mon Jan 31 20:47:15 2011 -0800 + + gl: Take advantage of GLX_MESA_multithread_makecurrent to avoid unbinding. + + Because of GLX's unfortunate requirement that only one context have a + thread current at a time, we had to unbind the context, triggering a + flush, and eating of all the CPU. With a small tweak to the GLX spec + by GLX_MESA_multithread_makecurrent, and a small tweak to Mesa that + consisted mostly of deleting the "is this thread already bound + elsewhere?" check, we can bind our context to any thread and use it + safely as long as our usage of it is mutexed, which cairo-gl should + already be doing. + + [ 0] before firefox-talos-gfx 50.260 50.525 0.25% 3/3 + [ 0] after firefox-talos-gfx 32.091 32.422 0.65% 3/3 + + src/cairo-glx-context.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 2e67809be0a2febd52c75948fabd7ac81227e5e3 +Author: Eric Anholt <eric@anholt.net> +Date: Sun Jan 30 23:41:39 2011 -0800 + + gl: Add a first bit of general documentation on cairo-gl usage. + + Since its inception, cairo-gl has been plagued by the "how am I really + supposed to use it?" problem. This lays down my expectations for how + cairo-gl will interact with other usage of the GL API. + + src/cairo-gl.h | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +commit 90e1ef2d80b252cdc528d8d8d57cace109034e0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 20 18:16:10 2011 -0500 + + Bug 34011 - headers-standalone target is incorrect for some non-gcc compilers + + src/Makefile.am.analysis | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 47f70537b8baa0afdd28dd5c523d1956f17455cd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Feb 19 19:13:59 2011 +0100 + + image: Fix surface acquisition if PIXMAN_HAS_ATOMIC_OPS + + If PIXMAN_HAS_ATOMIC_OPS, ix and iy will be changed if the source + surface is of subsurface type. They need to be reset to 0 before being + passed to _cairo_matrix_to_pixman_matrix_offset() or the acquired + surface will have an incorrect offset . + + src/cairo-image-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 71e8a4c23019b01aa43b334fcb2784c70daae9b5 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Feb 19 17:46:45 2011 +0200 + + image: Avoid reusing pixman images for threadsafety. + + The pixman_image_ref() and pixman_image_unref() functions + aren't threadsafe in current pixman, so we can't share + pixman images across contexts where they may end up + moving between threads. The main use of these functions + is in keeping a global cache of pixman_image_ts for + solid colours and reusing the same pixman_image_t for + patterns pointing to the same image data where possible. + + This patch removes those uses from cairo by wrapping + them in a PIXMAN_HAS_ATOMIC_OPS conditional. There is + no automatic test this, so we will have to manually + turn this code back on when pixman does gain atomic + ops. + + The only two remaining calls to pixman_image_ref() are + done on locally created images so they are safe. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=34177 + + src/cairo-image-surface.c | 60 ++++++++++++++++++++++++++++------------------- + 1 file changed, 36 insertions(+), 24 deletions(-) + +commit 48774c09d04a0b8d3533bdd6d5de6cfe58f54c2b +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Feb 19 11:33:22 2011 +0100 + + test: Fix gcc signedness warning + + test/clip-draw-unbounded.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94612bc0323a0af0053ebec769040a7506fc5c22 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Feb 19 10:40:01 2011 +0100 + + arc: Remove erroneous return statement + + Introduced in e46dc9e17a6f6737d5624dbcdd3c42c2353a72f1. + + src/cairo.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 9fc5ff797ac6f4cf9029319907fb5556a585108b +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Feb 19 10:32:19 2011 +0100 + + test: Fix copy/paste error + + test/get-path-extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f847b3c2162029ee0b0ae4906d48a0d7c1312df3 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Feb 19 10:25:22 2011 +0100 + + test: Fix gcc complaints about old style definitions + + test/cairo-test-runner.c | 2 +- + test/xcb-stress-cache.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 7386960d063e4a3642fb281aaae071404d837bdb +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Feb 19 10:23:46 2011 +0100 + + test: Add a test for 0-radius negative arcs + + This test checks the behavior of + e46dc9e17a6f6737d5624dbcdd3c42c2353a72f1 + + test/get-path-extents.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit b2bda24e42a3a5487177b9cb7354dc33f98da349 +Author: Benjamin Otte <otte@redhat.com> +Date: Sat Feb 19 10:22:45 2011 +0100 + + Declare variables first so gcc shuts up + + src/cairo-atomic-private.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0fc65a10084064cb9758e1b52ff65e31b79481cf +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 19:57:22 2011 +0100 + + Revert accidental checkin in last commit + + Today is not my day... + + test/Makefile.sources | 1 - + 1 file changed, 1 deletion(-) + +commit e46dc9e17a6f6737d5624dbcdd3c42c2353a72f1 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 19:51:44 2011 +0100 + + arc: Handle radius == 0 the same no matter the arc direction + + Commit a0ea0b63fdd38a73d6696da5cd4800d9a7289240 fixed cairo_arc() but + did not apply the same patch to cairo_arc_negative(). This patch fixes + that oversight. + + src/cairo.c | 7 ++++++- + test/Makefile.sources | 1 + + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit ea0595c5ec125d201b159fd7128c1a86c857a0a6 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 19:06:16 2011 +0100 + + surface: Actually return a value from _cairo_surface_set_error() + + This is what happens when there's too many warnings on the screen: I + don't see the important ones. Oops. + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9dcd29bef48071fcc28f5fa93d6369dfc1eed3da +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 18:53:29 2011 +0100 + + test: Add missing format to any2ppm to silence gcc + + test/any2ppm.c | 1 + + 1 file changed, 1 insertion(+) + +commit 056250775f15ea8fd337e3f37d6906f01b8c09a6 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 18:52:11 2011 +0100 + + surface: Allow NOTHING_TO_DO as a valid error for now + + Lots of code relies on it, so we'd better not break that immediately. ;) + + src/cairo-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4a3ab4b60a80b01c17ce1789019d57d5d7430fdc +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 18:30:17 2011 +0100 + + region: Don't be nice to people setting internal error code + + Just DIE DIE DIE in the _cairo_status_set_status() assertion. + + src/cairo-region.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 3823c486f7d5b10ba3109fe547ed10eef8e87700 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 18:26:14 2011 +0100 + + device: Don't be nice to people setting internal error codes + + Just DIE DIE DIE in the _cairo_status_set_status() assertion. + + src/cairo-device.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit badf32290ff894351e0f6879aafeac6db8e0d846 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 18:23:25 2011 +0100 + + surface: Don't be nice to people setting internal error codes + + Just DIE DIE DIE in the _cairo_status_set_status() assertion. + + src/cairo-surface.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 3b3cfbfffe9e9acd1da753600c1e00044f065760 +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 18:21:54 2011 +0100 + + Assert that an error is valid when set + + src/cairo-atomic-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 9c5833638499f9faa740c1681342bce78596dc8a +Author: Benjamin Otte <otte@redhat.com> +Date: Fri Feb 18 17:56:46 2011 +0100 + + xcb: Don't operate on a status variable that is never set + + src/cairo-xcb-surface-render.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 00ffb09593b25a603cb5c1ad6d3712ea7776a027 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Feb 11 17:46:51 2011 +0200 + + boilerplate/egl: Ensure that we are using an RGBA32 egl config + + boilerplate/cairo-boilerplate-egl.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +commit 2181a53f61c08c3461c74932add4bac7bfa0cf27 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Feb 11 16:11:43 2011 +0200 + + egl: Ensure that the dummy pbuffer surface is compatible with the supplied context + + In order to be able to make an egl context current when using a + pbuffer surface, that surface must have been created with a config + that is compatible with the context config. For Mesa, this means that + the configs must be the same. + + src/cairo-egl-context.c | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +commit 3245d6e120a1b8502cf36c3869db40341fb20b2e +Author: Benjamin Franzke <benjaminfranzke@googlemail.com> +Date: Thu Feb 10 18:07:43 2011 +0200 + + egl: Fix eglMakeCurrent for egl surfaces + + src/cairo-egl-context.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 303f56a2d34a23d933a02fa625873211fb51eb3b +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Feb 17 18:17:08 2011 +0100 + + test: Add line-width-overlap + + Test case taken from the WebKit test suite, failure originally reported + by Zan Dobersek <zandobersek@gmail.com>. WebKit test is + LayoutTests/canvas/philip/tests/2d.path.rect.selfintersect.html + + test/Makefile.sources | 1 + + test/line-width-overlap.c | 72 ++++++++++++++++++++++++++++++++++++++++ + test/line-width-overlap.ref.png | Bin 0 -> 296 bytes + 3 files changed, 73 insertions(+) + +commit 937465b15e25cbc37c09861bc33a572440df0cbe +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Feb 17 18:09:22 2011 +0100 + + tests: Fix gcc complaint + + warning: ‘static’ is not at beginning of declaration + + test/radial-gradient.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4d4056872db94573183473610ad1d81d5439fdc6 +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Feb 15 20:40:23 2011 +0100 + + tests: Add line-width-tolerance + + Test case taken from the WebKit test suite, failure originally reported + by Zan Dobersek <zandobersek@gmail.com> at + https://bugs.webkit.org/show_bug.cgi?id=54471 + + test/Makefile.sources | 1 + + test/line-width-tolerance.c | 66 ++++++++++++++++++++++++++++++++++++++ + test/line-width-tolerance.ref.png | Bin 0 -> 192 bytes + 3 files changed, 67 insertions(+) + +commit 07c0b7c284a71a8d5a3836cd8ab9bbb2d119c59f +Author: Benjamin Otte <otte@redhat.com> +Date: Tue Nov 9 10:05:39 2010 -0500 + + AUTHORS: Use correct email for me + + AUTHORS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d866bb0405bc989666f886e2c0e293a1fe718d74 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Feb 7 22:13:53 2011 +0100 + + xlib: Fix compilation when gradient functions are not available + + It is not correct to rely on the version defined in render.h. The + Xrender.h header is independent and might not define some functions + available in RENDER 0.10. + + Their availability must be detected at configure time and the stubs + must be defined only if the functions are not available. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=31906 + + configure.ac | 9 +++++++++ + src/cairo-xlib-xrender-private.h | 23 ++++++++++++++--------- + 2 files changed, 23 insertions(+), 9 deletions(-) + +commit 219f0d49a33d553711e92fcc61fd794b98f31234 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Feb 14 09:58:13 2011 +0100 + + test: Fix REFERENCE_IMAGES + + Makefile.am not updated along with changing the reference images in + 6825007ac6d46e8d8a7a3bc065453af5d6e755a8 and + 070bc5dd891ba698aeb3eaa899f662d4123f6928. + + test/Makefile.am | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 81d2434b7595095e485019b38f8a348153c6bc93 +Author: Eric Anholt <eric@anholt.net> +Date: Sun Jan 30 20:11:11 2011 -0800 + + gl: Don't reset the FBO draw/readbuffers every time we bind the FBO. + + Draw/readbuffers are a property of the framebuffer, not of the + context. So we can leave them in place across bindings. I left the + window drawbuffer setting in place until we decide how to handle + interoperating of cairo-gl with normal GL usage. + + [ 0] before firefox-talos-gfx 67.552 67.561 0.22% 3/3 + [ 0] after firefox-talos-gfx 66.689 66.913 0.41% 3/3 + + src/cairo-gl-device.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5fa49462be24b7fc7f32032d8577703f1d0f463a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Feb 13 18:36:12 2011 +0100 + + test: Fix surface-pattern-scale-down-extend + + This test creates a similar surface using cairo_push_group () and + assumes its size will be w x h. This is not true when testing similar + surfaces with "cairo-test-suite -a", because they are bigger than the + actual ROI, which corresponds to the rectangle (0,0) - (w,h). + + Clipping to the ROI guarantees that the surface created by + cairo_push_group () always has the same size. + + Fixes surface-pattern-scale-down-extend. + + test/surface-pattern-scale-down-extend.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 34612c400d3b66daf265529d90a3dcd1a8afdbcb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Feb 13 17:28:31 2011 +0100 + + test: Fix clip-device-offset + + The test was incorrectly translating the "target" of the context + instead of the "group target" (i.e. the current destination). + + "cairo-test-suite -a" runs the tests on similar surfaces created using + cairo_push_group (), thus without this change the device-offset did + not affect the real destination surface. + + Fixes clip-device-offset. + + test/clip-device-offset.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7ad3aebbe612ef560d4a73f85db226c8e7caa4b2 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Feb 12 20:49:02 2011 +0100 + + arc-looping-dash: Add a missing cairo_restore () + + This test called cairo_save () without restoring again. Normally, this doesn't + cause a problem. However, when cairo-test-suite is called with "-a", it also + executes the tests on a similar surface. This then caused + cairo_pop_group_to_source to be called on a cairo_save state which causes a + CAIRO_STATUS_INVALID_RESTORE since commit 5d95ae924ed1520. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/arc-looping-dash.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 788bdec628ca004a73446414961f74e2443a8b06 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Feb 12 14:51:30 2011 +0100 + + Fix errors from src/check-plt.sh + + All of these symbols are used in cairo-script-surface.c for emitting mesh + patterns. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-path.c | 1 + + src/cairo-pattern.c | 4 ++++ + src/cairoint.h | 5 +++++ + 3 files changed, 10 insertions(+) + +commit 12e41acf9c23618748036052f3403e6ece295796 +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Feb 11 22:25:12 2011 +0100 + + xcb: Remove the surface pattern cache + + Whenever a surface is used as a source, cairo-xcb creates a Picture for it and + adds it as a snapshot to the source. Additionally, there is a per-screen cache + that makes sure old Pictures are destroyed when more than 16 MiB of image data + is used. + + There are two problems here: + - Normally, the Picture would be destroyed once it is no longer a snapshot for + the original source surface. However, the cache kept it alive for longer which + means it was using memory but couldn't actually be used any more. (The + Pictures are found via _cairo_surface_has_snapshot) + - When a xcb surface is used as a source, we create a new Picture for it, but + when that surface is cairo_surface_finish'd, we don't FreePicture this + Picture. When the drawable was a window, this may later on cause a BadPicture + error when cairo tries to explicitly free a picture that was already + implicitly freed when its window was destroyed. + + The second point caused lots of tests in the test suite to fail on an assert due + to the above-mentioned BadPicture error, but just removing the cache makes both + these problems go away. + + The only downside is that the cache enforced a limit of 16 MiB of pixel data + that was used for source surfaces on the server. After this commit the Picture + will be kept alive until the snapshot is detached. If this becomes a problem + memory-wise, a new solution will have to be invented... + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 9 ----- + src/cairo-xcb-screen.c | 86 +----------------------------------------- + src/cairo-xcb-surface-render.c | 7 ---- + 3 files changed, 1 insertion(+), 101 deletions(-) + +commit 050a877a9e6a0066200783f1e200eaaf6792e5de +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Feb 10 17:33:52 2011 +0100 + + xcb: Fix a crash when finishing a device + + The xcb backend uses caches for linear, radial and surface patterns so that it + doesn't have to create a new cairo_xcb_picture_t on every use. Whenever any + picture is finished, the surface pattern cache is checked on whether it still + contains that picture. + + This means that we cannot destroy the surface_pattern_cache until after the + linear and radial_pattern_cache are destroyed or else we'll be querying the + surface pattern cache after it was finished. + + This wasn't noticed before because _cairo_xcb_picture_finish couldn't acquire + the cairo_xcb_connection_t and thus failed earlier. The previous commit changed + this and now lots of tests in the test suite trigger the crash. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-screen.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit ae669fb8aba1b2437d10c08e36c5ff593397626d +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Feb 9 19:41:03 2011 +0100 + + Finish devices after their finish callback returns + + The problem is that the finish callback might still have to work with the + device, so it can't be made unusable yet. This is in contrast to what + cairo_surface_finish() does, but when finishing a surface it's quite unlikely + that its cairo_surface_t still has to be passed around to functions outside of + the backend. + + This "fixes" some problems with the xcb-surface-source test where + _cairo_surface_snapshot()-style snapshots break when the underlying + cairo_device_t is finished. (In the following backtrace, cairo_device_acquire + fails because the device's ->finished member is already TRUE) + + #0 cairo_device_acquire (device=0x690f70) at cairo-device.c:414 + #1 0x00007ffff7b884fb in _cairo_xcb_connection_acquire (surface=0x69c610, use_shm=<value optimized out>, image_out=0x7fffffffcc58) at cairo-xcb-private.h:246 + #2 _get_image (surface=0x69c610, use_shm=<value optimized out>, image_out=0x7fffffffcc58) at cairo-xcb-surface.c:425 + #3 0x00007ffff7b893cf in _cairo_xcb_surface_acquire_source_image (abstract_surface=0x69c610, image_out=0x7fffffffcce8, image_extra=0x7fffffffcce0) + at cairo-xcb-surface.c:561 + #4 0x00007ffff7b601d4 in _cairo_surface_acquire_source_image (surface=0x690f70, image_out=0x7fffffffcce8, image_extra=0x0) at cairo-surface.c:1458 + #5 0x00007ffff7b65dcf in _cairo_surface_snapshot_copy_on_write (surface=<value optimized out>) at cairo-surface-snapshot.c:125 + #6 0x00007ffff7b609b1 in _cairo_surface_detach_snapshot (snapshot=0x690f70) at cairo-surface.c:330 + #7 0x00007ffff7b606dc in _cairo_surface_detach_snapshots (surface=0x69c610) at cairo-surface.c:315 + #8 cairo_surface_flush (surface=0x69c610) at cairo-surface.c:1126 + #9 0x00007ffff7b6074d in cairo_surface_finish (surface=0x690f70) at cairo-surface.c:718 + #10 0x00007ffff7b881ff in _cairo_xcb_screen_finish (screen=0x691920) at cairo-xcb-screen.c:61 + #11 0x00007ffff7b8629c in _device_finish (device=0x690f70) at cairo-xcb-connection.c:546 + #12 0x0000000000446f7c in cleanup (data=0x69c370) at xcb-surface-source.c:47 + #13 0x00007ffff7b1e56a in _cairo_user_data_array_fini (array=0x693628) at cairo-array.c:390 + #14 0x00007ffff7b60868 in cairo_surface_destroy (surface=0x693600) at cairo-surface.c:651 + #15 0x0000000000447599 in draw (cr=0x7ffff7ddc288, width=<value optimized out>, height=<value optimized out>) at surface-source.c:149 + #16 0x000000000040c1c3 in cairo_test_for_target (ctx=0x7fffffffe640, target=0x669668, dev_offset=<value optimized out>, similar=<value optimized out>) + at cairo-test.c:984 + #17 0x000000000040d997 in _cairo_test_context_run_for_target (ctx=<value optimized out>, target=<value optimized out>, similar=<value optimized out>, + dev_offset=<value optimized out>) at cairo-test.c:1617 + #18 0x000000000040ee09 in _cairo_test_runner_draw (argc=<value optimized out>, argv=<value optimized out>) at cairo-test-runner.c:269 + #19 main (argc=<value optimized out>, argv=<value optimized out>) at cairo-test-runner.c:924 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-device.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 070bc5dd891ba698aeb3eaa899f662d4123f6928 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Feb 9 20:08:28 2011 +0100 + + xcb-surface-source: Add image16 and ps ref images + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/xcb-surface-source.image16.ref.png | Bin 0 -> 305 bytes + test/xcb-surface-source.ps.argb32.ref.png | Bin 0 -> 491 bytes + test/xcb-surface-source.ps.rgb24.ref.png | Bin 0 -> 482 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 6825007ac6d46e8d8a7a3bc065453af5d6e755a8 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Feb 9 19:58:05 2011 +0100 + + ps: Update xlib-surface-source ref images + + Since 9948b5180a, the *-surface-source tests draw a different image (a + translucent region was added). However, the ref images for xlib-surface-source + with cairo-ps weren't updated and thus the test failed. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/xlib-surface-source.ps.argb32.ref.png | Bin 0 -> 491 bytes + test/xlib-surface-source.ps.rgb24.ref.png | Bin 0 -> 482 bytes + test/xlib-surface-source.ps2.ref.png | Bin 376 -> 0 bytes + test/xlib-surface-source.ps3.ref.png | Bin 376 -> 0 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit e4fdd9a1cd4c0d074dd20417e66de5856b6ba5a7 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Feb 3 23:06:26 2011 +0200 + + gl: Replace built-in vertex attributes with custom attributes + + Built-in vertex attributes like gl_Vertex and gl_Color, have been obsoleted + and removed in recent GL versions and they are not supported at all in GLES2.0. + Custom attributes are supported in all GL versions >= 2.0, in GL 1.x with + ARB shader extensions and in GLES2.0. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 42 ++++++++++++++++++++++-------------------- + src/cairo-gl-private.h | 10 ++++++++++ + src/cairo-gl-shaders.c | 20 +++++++++++++++++--- + 3 files changed, 49 insertions(+), 23 deletions(-) + +commit e68062d9caafe21b53af22173fff40ad973a8d73 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Feb 3 22:06:27 2011 +0200 + + gl: Add gl dispatch entries for functions related to vertex attributes + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-dispatch-private.h | 7 +++++++ + src/cairo-gl-private.h | 9 +++++++++ + 2 files changed, 16 insertions(+) + +commit 80a92b6d799900057ac40c0c0bb63be48eece9ef +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Jan 31 18:02:02 2011 +0200 + + gl: Use a custom shader uniform for the ModelViewProjection matrix + + The built-in gl_ModelViewProjectionMatrix uniform (and others) has been + deprecated and removed in recent GLSL versions and is not supported + at all in GLSL ES. A custom uniform for the same purpose works across + all versions. + + [ickle: base _gl_identity_ortho on the 2D variant of glOrtho i.e. with + fixed near/far values of [-1, 1]] + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-composite.c | 2 ++ + src/cairo-gl-device.c | 51 +++++++++++++++++++++++++++++++++++++++++------- + src/cairo-gl-private.h | 1 + + src/cairo-gl-shaders.c | 3 ++- + 4 files changed, 49 insertions(+), 8 deletions(-) + +commit d88ada384fcb045cc9899339f9e8c1cbb8280c16 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Thu Jan 27 16:10:38 2011 +0200 + + gl: Replace ftransform() with manual coordinate calculation in shaders + + The ftransform() shader function was deprecated and removed in recent + GLSL versions and is not included at all in GLSL ES. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-shaders.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b13198348ce053445ca97b513611207e34aa4528 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Jan 31 16:18:29 2011 +0200 + + gl: Add function to bind a 4x4 float matrix shader uniform + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-private.h | 5 +++++ + src/cairo-gl-shaders.c | 26 ++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+) + +commit 966e4a1738c5dc97149ff7bd58e54fa86f048c16 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Jan 31 15:55:07 2011 +0200 + + gl: Add entry for UniformMatrix4fv in the gl dispatch table + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-dispatch-private.h | 1 + + src/cairo-gl-private.h | 2 ++ + 2 files changed, 3 insertions(+) + +commit 0984c9ea27318e852d78ce76a62e08db20e02f4d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 8 21:40:08 2011 +1030 + + Type1-subset: Fallback if font contains more than one /Encoding + + https://bugzilla.gnome.org/show_bug.cgi?id=641704 + + src/cairo-type1-subset.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 5f039f0f894082c383884595220f6f0368ab72cf +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Feb 3 22:55:53 2011 +0100 + + mesh: Rename cairo_pattern_mesh_* functions to cairo_mesh_pattern_* + + This is consistent with the naming of most cairo types/functions + (example: cairo_foo_surface_*). + + The substitution in the code has been performed using: + + sed -i 's/cairo_pattern_mesh_/cairo_mesh_pattern_/' <files> + + doc/public/cairo-sections.txt | 24 ++--- + doc/public/language-bindings.xml | 24 ++--- + src/cairo-pattern.c | 150 ++++++++++++++--------------- + src/cairo-script-surface.c | 8 +- + src/cairo.h | 26 ++--- + src/cairoint.h | 8 +- + test/mesh-pattern-accuracy.c | 40 ++++---- + test/mesh-pattern-conical.c | 16 +-- + test/mesh-pattern-control-points.c | 52 +++++----- + test/mesh-pattern-fold.c | 30 +++--- + test/mesh-pattern-overlap.c | 22 ++--- + test/mesh-pattern-transformed.c | 44 ++++----- + test/mesh-pattern.c | 44 ++++----- + test/pattern-getters.c | 34 +++---- + util/cairo-script/cairo-script-operators.c | 14 +-- + 15 files changed, 268 insertions(+), 268 deletions(-) + +commit fda784793edc3da789954df7fc2f0c86d9ed4f94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 6 18:11:25 2011 +0000 + + test: Attempt to capture out-of-bounds spans compositing bug + + Attempt to provoke out-of-bounds accesses as demonstrated by + https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/710072 + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 3 + + test/Makefile.sources | 1 + + test/image-bug-710072-aligned.ref.png | Bin 0 -> 151 bytes + test/image-bug-710072-unaligned.ref.png | Bin 0 -> 212 bytes + test/image-bug-710072-unaligned.xlib.ref.png | Bin 0 -> 219 bytes + test/image-bug-710072.c | 80 +++++++++++++++++++++++++++ + 6 files changed, 84 insertions(+) + +commit d558f40c44f3d4f4a8a613318ff556c5d26914f7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Feb 6 14:11:30 2011 +0000 + + image: Limit span rendering to bounded extents + + We make the presumption that the incoming geometry is appropriately + clipped to the bounded extents and can simply memset without being out + of bounds. + + However, this was not always the case as we were removing the clip boxes + in order to optimise the common case where the operation is naturally + limited to the surface. + + (This is a candidate for 1.10) + + Bugzilla: https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/710072 + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit fc8c54dafe8e607053523e80447507fb57bc0fc0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 4 15:43:40 2011 -0500 + + Don't err on non-invertible font matrix + + The scaled-font layer handles that later if it actually is a problem: + + scaled_font->scale_inverse = scaled_font->scale; + status = cairo_matrix_invert (&scaled_font->scale_inverse); + if (unlikely (status)) { + /* If the font scale matrix is rank 0, just using an all-zero inverse matrix + * makes everything work correctly. This make font size 0 work without + * producing an error. + * + * FIXME: If the scale is rank 1, we still go into error mode. But then + * again, that's what we do everywhere in cairo. + * + * Also, the check for == 0. below may be too harsh... + */ + if (_cairo_matrix_is_scale_0 (&scaled_font->scale)) { + cairo_matrix_init (&scaled_font->scale_inverse, + 0, 0, 0, 0, + -scaled_font->scale.x0, + -scaled_font->scale.y0); + } else + return status; + } + + src/cairo-gstate.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 7f15319621a71fb01ea41c4efc34bf1f54505ef5 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Jan 28 15:02:54 2011 +0200 + + gl: Remove fixed-function related code paths + + Fixed-function related code paths are no longer used, as we require shader + support for the gl backend. + + Reviewed-by: Eric Anholt <eric@anholt.net> + + src/cairo-gl-composite.c | 106 ++--------------------------------------------- + src/cairo-gl-device.c | 6 --- + src/cairo-gl-private.h | 1 - + 3 files changed, 3 insertions(+), 110 deletions(-) + +commit f6ca11694b7935408446b36a17bfee024237dbbf +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Jan 28 15:02:53 2011 +0200 + + gl: Remove unnecessary checks for NULL shader implementation + + Due to the fact that we fail if the system doesn't support shaders, we + now always have a valid shader implementation. + + Reviewed-by: Eric Anholt <eric@anholt.net> + + src/cairo-gl-shaders.c | 29 ++++++++--------------------- + 1 file changed, 8 insertions(+), 21 deletions(-) + +commit 037c9ba7e27bdd33a4fefa43dad68ce0d25e35ad +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Jan 28 15:02:52 2011 +0200 + + gl: Fail if GL implementation doesn't support shaders + + The non-shaders implementation was never tuned for fixed-function GL + implementation, the maintainers are not interested in supporting it, + and the hardware is rather rare at this point. This lets us focus on + the implementation for modern hardware, which needs plenty of work + still. + + Reviewed-by: Eric Anholt <eric@anholt.net> + + src/cairo-gl-shaders.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 0e08e7adfc33eb048c7e88bb22a0ac35b1a14a72 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Jan 31 22:39:39 2011 +0100 + + XCB: Fix build with xcb-shm disabled + + The function _cairo_xcb_shm_image_create is defined and needed even when XCB-SHM + is disabled. In this case it just falls back to an image surface. + + Thanks to Benjamin Otte for noticing this. + + cairo-xcb-surface-render.c: In function ‘_render_to_picture’: + cairo-xcb-surface-render.c:749: error: implicit declaration of function ‘_cairo_xcb_shm_image_create’ + cairo-xcb-surface-render.c:749: warning: nested extern declaration of ‘_cairo_xcb_shm_image_create’ + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2e81f79e95a60a706f517b1bd989039b302dba8a +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jan 30 16:29:50 2011 +0100 + + xcb: Use a normal image surface if SHM fails + + If we can't use SHM, we still have PutImage. So instead of returning the error + to the caller, it makes sense to retry with a normal image surface. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 72788a06604ca50fe14354b92d2fd3b186a959bb +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jan 30 15:43:00 2011 +0100 + + xcb: Move the allocation of a shm surface into its own function + + This simplifies the fallback to an image surface when something causes an error. + + Additionally, this causes errors from _cairo_xcb_connection_allocate_shm_info to + be handled via falling back to a normal image surface while previously those + were returned to the caller. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-core.c | 111 ++++++++++++++++++++++++++++--------------- + 1 file changed, 73 insertions(+), 38 deletions(-) + +commit 48cb9186a23923ad5e9e3c31a193ab3d99ec6c5d +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jan 30 15:35:36 2011 +0100 + + xcb: Remove a duplicate static function + + Both cairo-xcb-surface-core.c and cairo-xcb-surface-render.c contained an + identical definition of _cairo_xcb_shm_image_create. This commits removes the + one from cairo-xcb-surface-render.c and adds the other one to + cairo-xcb-private.h. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-private.h | 7 +++++ + src/cairo-xcb-surface-core.c | 2 +- + src/cairo-xcb-surface-render.c | 61 ------------------------------------------ + 3 files changed, 8 insertions(+), 62 deletions(-) + +commit 274289d8c6c8a04060cd9c3a3cf0f819899c1353 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jan 30 16:19:50 2011 +0100 + + xcb: Limit the amount of SHM used + + Without this, one could make cairo attach to lots of shared memory. I managed to + make cairo use 1.5 GiB of shared memory according to top. This was done by + disabling XRENDER and thus causing lots of fallbacks. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-shm.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit a8e8d2aba811487dbb5b682c4f55065008e7ebbd +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 25 16:29:58 2011 +0100 + + scaled font: Fix the docs for cairo_scaled_font_get_font_face + + With the toy font API, it is possible that cairo_scaled_font_get_font_face() + doesn't return the font face which was passed to cairo_scaled_font_create() + despite the docs saying otherwise. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-scaled-font.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 23f87951bae73d174131abdebfbcf5ae79b55779 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 25 16:19:27 2011 +0100 + + User fonts: Make it clear what should NOT be freed + + This is a misunderstanding that I actually saw in some real-world code that used + to work fine with cairo 1.8. Once you spend some time trying to debug such a + problem, you wish the docs would have said so. ;-) + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 00b1eac4b0df7a169ce0796850ed7a17bef69416 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jan 26 21:10:59 2011 +0100 + + xcb: Document all public functions + + These docs are based upon cairo-xlib and the existing documentations for + cairo_xcb_surface_create_with_xrender_format. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 26 +++++++++++++++++ + src/cairo-xcb-surface.c | 70 +++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 95 insertions(+), 1 deletion(-) + +commit 9e7ce0c3525064aa32da90be89e805aff6829c9b +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Jan 26 17:54:13 2011 +0100 + + xcb: Automatically enable the backend if the libs are available + + It looks like the cairo-xcb backend is in a good shape and hopefully will be a + supported backend for cairo 1.12.0. Let's see if this causes lots of new bugs to + be uncovered. :-) + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/Makefile.win32.features | 2 +- + configure.ac | 2 +- + src/Makefile.win32.features | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 0e199ccc574d77041e19b29cb9a228e2588d5dca +Author: Pino Toscano <toscano.pino@tiscali.it> +Date: Tue Jan 25 14:33:11 2011 +0100 + + LD_PRELOAD is supported on Hurd + + LD_PRELOAD is supported on Hurd. Adding Hurd to the list of supported + systems makes cairo-trace available on them as well. + + See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=608492 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f60e8f0bb231547ff473dd23807193c847c99a3d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jan 25 08:41:27 2011 +0100 + + xcb: Fix compositing of pixel-aligned rectangles + + bef8b28300ab1f9b46db9d54b072f6f9318dca30 introduced a regression in + the compositing of pixel-aligned rectangles, because it only + translates the destination, instead of destination, source and mask, + by the extents offset. + + The same commit introduces some memleaks when the acquisition of an + xcb picture fails. + + 74374fce9d71d373287cddc3a0bf4aaf4bda568b causes incorrect rendering + whenever extents are not tight. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=33448 + + src/cairo-xcb-surface-render.c | 56 +++++++++++++++++++++++++----------------- + 1 file changed, 34 insertions(+), 22 deletions(-) + +commit 062e78b620cd6161f0a2fd2644866fb5d957a9db +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 24 10:35:23 2011 +0100 + + Fix regressions from 1.10 merge + + d6dc6e8e396506d5160266dda6575ddfce671c2d introduced two regressions: + + - the compiler warns about _gradient_stops_are_opaque being unused in + cairo-pdf-surface.c + + - get-path-extents now checks for the wrong extents, thus it fails + + src/cairo-pdf-surface.c | 12 ------------ + test/get-path-extents.c | 3 +-- + 2 files changed, 1 insertion(+), 14 deletions(-) + +commit c7b16098bd700c6cc82e8fce49eda606ac84ad24 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jan 23 22:10:20 2011 +0100 + + xcb: Fix a BadPicture when clearing a surface + + This bug was introduced in 6f431886 "xcb: Prefer RenderFillRectangles to perform + the deferred clear". The problem is that we are trying to clear a surface before + we created a Picture for it. This resulted in a FillRectangles call with + dst=XCB_NONE. + + I noticed this problem via cairo-perf-micro's dragon-solid-circle-clip. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 1 + + 1 file changed, 1 insertion(+) + +commit 74374fce9d71d373287cddc3a0bf4aaf4bda568b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 18:32:12 2011 +0000 + + xcb: Only use clip rectangles for more than 1 pixel-aligned box + + If there is only a single box, then it is naturally equivalent to the + single call to Composite. So need to incur the addition protocol + overhead of setting up the CompositeClip. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 5809c6ff32b10c7c07ae96e5b0f7b98de66ecea5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 16:52:50 2011 +0000 + + version: Post-snapshot bump + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac9ee388faf3c8c5df502f6cc7b039f043154954 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 16:32:13 2011 +0000 + + version: Bump for 1.11.2 snapshot + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7e75e2d14afe295bb100849b081e9c568f3f1260 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 16:31:40 2011 +0000 + + NEWS: 1.11.2 snapshot + + NEWS | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 48 insertions(+) + +commit d6dc6e8e396506d5160266dda6575ddfce671c2d +Merge: 6c65168 c84730d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 16:05:01 2011 +0000 + + Merge branch '1.10' into tmp + + Synchronize stable bug-fixes with development snapshot + + Conflicts: + cairo-version.h + src/cairo-path-bounds.c + src/cairo-pdf-surface.c + test/get-path-extents.c + +commit 6c65168dcfd969bd1d6aade3cd33f679e2314dea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 15:46:32 2011 +0000 + + Makefile: add missing cairo-box-private.h + + src/Makefile.sources | 1 + + 1 file changed, 1 insertion(+) + +commit 6f4318869cf551f4ed349459b7afd50e4b10941c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 13:29:51 2011 +0000 + + xcb: Prefer RenderFillRectangles to perform the deferred clear + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +commit bef8b28300ab1f9b46db9d54b072f6f9318dca30 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 23 12:28:06 2011 +0000 + + xcb: Apply a clip region for compositing many-pixel-aligned-boxes + + Based on a patch by Uli Schlachter. + + Uli found that the "fast-path" for compositing pixel-aligned boxes did + not live up to its name; using multiple Composite is many times slower, + because of the extra protocol and driver overheads, than specifying a + clip region and a single Composite. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 120 +++++++++++++++++++++++------------------ + 1 file changed, 68 insertions(+), 52 deletions(-) + +commit ff9e962165905f9b3477e125de227c69aebf9510 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 19 23:22:31 2011 +0100 + + gstate: Remove unused code + + _cairo_gstate_redirect_target asserts that this surface is NULL + immediately before destroying it. If the code is compiled with + assertions disabled and the assert would be false, it is now safer + because instead of an invalid access it will only memleak. + + _cairo_gstate_get_parent_target () is not used anymore in + cairo_pop_group () and the related code can be removed. + + _cairo_gstate_is_redirected () has never been used. + + The comment about the clipping is misleading, because the clip is + translated as expected since fb7f7c2f27f0823d7702f960204d6e638d697624. + + src/cairo-gstate-private.h | 6 ------ + src/cairo-gstate.c | 33 --------------------------------- + 2 files changed, 39 deletions(-) + +commit 5d95ae924ed15200a17d240d8f0744c74df7c61b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jan 20 01:44:29 2011 +0100 + + gstate: Set an error status when restoring a push_group + + cairo_push_group (cr) followed by cairo_restore (cr) should put cr in + an error status of CAIRO_STATUS_INVALID_RESTORE. + + Fixes group-state. + + src/cairo-gstate-private.h | 3 +++ + src/cairo-gstate.c | 16 ++++++++++++++++ + src/cairo.c | 26 +++++++++++--------------- + 3 files changed, 30 insertions(+), 15 deletions(-) + +commit e0b741de9006a02acd9b05c8fae52f6b7f775163 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jan 18 14:48:15 2011 +0100 + + test: Add group-state + + The interaction between the group and the state API is currently + untested and buggy. This test tries to use them incorrectly and check + that cairo notices the problem and marks the cr object with an error + status. + + test/Makefile.sources | 1 + + test/group-state.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 97 insertions(+) + +commit b51520628de73d5f560720c20987e5be5440edb0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 22 11:56:37 2011 +0100 + + clip: Improve _cairo_clip_contains_* + + _cairo_clip_contains_rectangle() considered a NULL clip empty instead + of containing everything. + + _cairo_clip_contains_rectangle() checks for NULL clips, so we don't + have to check for them in _cairo_clip_contains_extents(). + + src/cairo-clip.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 47d14586f5d56b2c926a2ddbca6cfbd284c3b3f1 +Author: Mats Palmgren <matspal@gmail.com> +Date: Fri Jan 21 09:52:19 2011 +0100 + + win32: Improve error logging + + On win32 stderr is fully buffered, so fflush() should be called after + each error to ensure it is printed to the console. + + There is no need to use fwprintf if the format string can be + represented as char*. + + See https://bugs.freedesktop.org/show_bug.cgi?id=33319 + + src/cairo-win32-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 72a9d49a530456e7002675235333885c70580abb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 19 15:04:49 2011 +0100 + + Bump pixman requirements to 0.20.2 for radial gradients + + Pixman has PDF-like radial gradients since 0.20.0, but the + implementation of the tangent circles case was not correct. This has + been fixed in 0.20.2, along with some invalid operations fixes. + + README | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 67cfb20bd0908b73efc208b3c5ca0d027f858864 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 19 14:35:46 2011 +0100 + + test: Workaround pixman limits in large-source-roi + + Since 1cc750ed92a936d84b47cac696aaffd226e1c02e pixman won't perform + the compositing if it can't prove that this the computations it has to + perform will fit within the size of the variables it uses. + + It looks like in this case it cannot prove that no overflow will + happen unless surface_width <= 30582. Instead of this size (discovered + by bisection), a safer looking 30000 was chosen. It should still + trigger the problems the original test was looking for, because + backends which support 30000xheight surfaces will likely support + 32767xheight as well. + + test/large-source-roi.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b8e7bfdff0478f0515ea470b32fc15ca081d637e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jan 6 17:40:05 2011 +0100 + + quartz: Respect pattern filter settings + + CAIRO_FILTER_FAST and CAIRO_FILTER_NEAREST both map to nearest + neighbor filtering, whereas all other filter modes are names for + bilinear filtering. + + Additionally, translations matrices are transformed into integer + translations when possible (i.e. when they are used on an nearest + neighbor filtered surface pattern), which makes Quartz behave as + cairo-image for these simple transformations. + + Fixes a1-image-sample, a1-mask-sample, filter-nearest-offset. + + Improves the output of filter-nearest-transformed and + rotate-image-surface-paint. They are not blurry anymore, but they are + different from the reference images because of different in/out rules + between Quartz and cairo-image. + + src/cairo-quartz-surface.c | 166 ++++++++++++++++++++++++++++----------------- + 1 file changed, 105 insertions(+), 61 deletions(-) + +commit 45da39dda729be4c61c92d30e9373282941000fa +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 7 18:00:37 2011 +0100 + + quartz: Avoid using private APIs + + CGContextSetCTM() is not part of the public API and can easily be + replaced by CGContextConcatCTM()-ing an appropriate matrix. + + src/cairo-quartz-surface.c | 50 ++++++++++++++++++++++++++-------------------- + 1 file changed, 28 insertions(+), 22 deletions(-) + +commit ca9068839bf28f914a5066d7846f4d4b95fee4a2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 5 16:12:34 2011 +0100 + + quartz: Use CGLayer to implement unbounded operators + + Quartz operators are not unbounded, but it is possible to implement + unbounded operators by using a temporary destination. + + Fixes clip-stroke-unbounded, clip-fill-nz-unbounded, + clip-fill-eo-unbounded, clip-operator, operator-alpha-alpha, + overlapping-glyphs, surface-pattern-operator, unbounded-operator. + + src/cairo-quartz-surface.c | 663 +++++++++++++++++++-------------------------- + 1 file changed, 281 insertions(+), 382 deletions(-) + +commit d7e3637af2ce31c35281c87c4ca064322de0d948 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 1 23:16:11 2011 +0100 + + quartz: Cleanup extents computation + + All the draw operations use the same code to compute the gradient + parameter range. It can be moved to the function which sets up the + source. + + src/cairo-quartz-surface.c | 45 +++++++++++++++------------------------------ + 1 file changed, 15 insertions(+), 30 deletions(-) + +commit aa2fb0c05fefeea97a2d72f882a6b2c40d98af39 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 1 22:36:45 2011 +0100 + + quartz: Do not use opaque patterns as masks + + When an opaque surface is used as a mask, Quartz converts it to + greyscale and uses the result as an alpha value. Cairo expects the + mask operation to ignore the color components and only use the alpha + of the pattern. + + The expected behavior can be achieved by drawing the mask on a + temporary surface with an alpha channel. + + Fixes clear-source. + + src/cairo-quartz-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 7d89d69c494bb438ca1caddf1a2226a48297e4b6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 5 12:15:06 2011 +0100 + + quartz: Make huge domain handling more stable + + Quartz cannot correctly handle arbitrary domains. Falling back is + needed to get correct results on very large (in parameter space) + gradients. + + For PAD extended gradients, limiting the domain to (at most) [-0.5, + 1.5] is sufficient to guarantee that it will correctly sample the + extreme stops and improves the accuracy (over having a much bigger + domain). + + Fixes radial-gradient, radial-gradient-mask, radial-gradient-source, + radial-gradient-mask-source, radial-gradient-one-stop. + + Improves the quality of the linear gradients in linear-gradient, + linear-gradient-subset, mask, operator-source, trap-clip. + + src/cairo-quartz-surface.c | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +commit 4874dab984fe73ae687b354aff45b879e1de9db2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 1 22:57:27 2011 +0100 + + quartz: Use standard stack allocation size + + Make cairo-quartz respect the convention that stack-allocated data + structures use the size computed by CAIRO_STACK_ARRAY_LENGTH (). + + Additionally this increases the size of the dash and glyph arrays, + making dynamic memory allocation less likely. + + src/cairo-quartz-surface.c | 24 ++++++++---------------- + 1 file changed, 8 insertions(+), 16 deletions(-) + +commit 5a1e590b122d99ad91ba104b8fc68e8adaa2d6cd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Jan 8 00:56:38 2011 +0100 + + test: Update quartz ref images + + The following commits fix and/or improve the output of some tests. + Updating the ref images before fixing the code allows to check that + the fix is correct and makes it easy to find out which tests are fixed + by each commit. + + test/Makefile.am | 24 ++++++++++++++++----- + test/a1-bug.quartz.xfail.png | Bin 0 -> 3195 bytes + test/a1-image-sample.quartz.xfail.png | Bin 972 -> 0 bytes + test/a1-mask-sample.quartz.xfail.png | Bin 972 -> 0 bytes + test/a1-rasterisation-rectangles.quartz.xfail.png | Bin 0 -> 2583 bytes + test/a1-rasterisation-triangles.quartz.xfail.png | Bin 0 -> 2583 bytes + test/a8-clear.quartz.ref.png | Bin 0 -> 244 bytes + test/aliasing.quartz.ref.png | Bin 0 -> 108801 bytes + test/clip-fill-eo-unbounded.quartz.argb32.ref.png | Bin 3366 -> 3382 bytes + test/clip-fill-eo-unbounded.quartz.rgb24.ref.png | Bin 3061 -> 2941 bytes + test/clip-fill-nz-unbounded.quartz.argb32.ref.png | Bin 3366 -> 3382 bytes + test/clip-fill-nz-unbounded.quartz.rgb24.ref.png | Bin 3061 -> 2941 bytes + test/clip-operator.quartz.argb32.ref.png | Bin 14959 -> 9672 bytes + test/clip-operator.quartz.rgb24.ref.png | Bin 8835 -> 4343 bytes + test/clip-stroke-unbounded.quartz.argb32.ref.png | Bin 3362 -> 3290 bytes + test/clip-stroke-unbounded.quartz.rgb24.ref.png | Bin 3061 -> 2840 bytes + test/filter-nearest-offset.quartz.xfail.png | Bin 2130 -> 0 bytes + test/filter-nearest-transformed.quartz.xfail.png | Bin 534 -> 349 bytes + test/linear-gradient-subset.quartz.ref.png | Bin 994 -> 852 bytes + test/linear-gradient.quartz.ref.png | Bin 1073 -> 951 bytes + test/mask.quartz.argb32.ref.png | Bin 11136 -> 10669 bytes + test/operator-source.quartz.argb32.ref.png | Bin 5499 -> 4936 bytes + test/operator-source.quartz.rgb24.ref.png | Bin 4345 -> 3771 bytes + test/overlapping-glyphs.quartz.argb32.ref.png | Bin 0 -> 2824 bytes + test/overlapping-glyphs.quartz.rgb24.ref.png | Bin 0 -> 1711 bytes + test/partial-clip-text.quartz.ref.png | Bin 0 -> 174 bytes + test/pthread-same-source.quartz.xfail.png | Bin 957 -> 961 bytes + test/pthread-show-text.quartz.ref.png | Bin 42996 -> 43005 bytes + ...dial-gradient-mask-source.quartz.argb32.ref.png | Bin 0 -> 171002 bytes + ...adial-gradient-mask-source.quartz.rgb24.ref.png | Bin 0 -> 179120 bytes + test/radial-gradient-mask.quartz.ref.png | Bin 0 -> 296910 bytes + test/radial-gradient-one-stop.quartz.ref.png | Bin 0 -> 6316 bytes + test/radial-gradient-source.quartz.argb32.ref.png | Bin 0 -> 439222 bytes + test/radial-gradient-source.quartz.rgb24.ref.png | Bin 0 -> 279249 bytes + test/radial-gradient.quartz.ref.png | Bin 0 -> 389140 bytes + test/rotate-image-surface-paint.quartz.ref.png | Bin 356 -> 223 bytes + test/scale-offset-image.quartz.ref.png | Bin 9054 -> 8977 bytes + test/scale-offset-similar.quartz.ref.png | Bin 9054 -> 8977 bytes + .../surface-pattern-operator.quartz.argb32.ref.png | Bin 0 -> 5721 bytes + ...urface-pattern-operator.quartz.argb32.xfail.png | Bin 5917 -> 0 bytes + test/surface-pattern-operator.quartz.rgb24.ref.png | Bin 0 -> 2429 bytes + ...surface-pattern-operator.quartz.rgb24.xfail.png | Bin 2546 -> 0 bytes + test/trap-clip.quartz.argb32.ref.png | Bin 6926 -> 6115 bytes + test/trap-clip.quartz.rgb24.ref.png | Bin 6503 -> 5801 bytes + test/unbounded-operator.quartz.argb32.ref.png | Bin 0 -> 3509 bytes + test/unbounded-operator.quartz.rgb24.ref.png | Bin 0 -> 1657 bytes + test/xcomposite-projection.quartz.ref.png | Bin 639 -> 926 bytes + 47 files changed, 19 insertions(+), 5 deletions(-) + +commit 2e75bf5a25cc5b7fd33702e2b1474f94caeab158 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 5 16:00:37 2011 +0100 + + test: Fix operator-alpha-alpha + + The test is checking the compositing of color-alpha sources although + it was meant to check the compositing of alpha-only sources on + alpha-only destinations. + + This commit fixes the code to respect the test description. + + test/operator-alpha-alpha.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 45505fc5fb14d774c8e13bdca6ca6f75d4b2f9df +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 14 12:51:54 2011 +0100 + + Add a results.tar.gz target to the test Makefile + + Sometimes it is useful to be able to package the result of a run of + the testsuite. This new target creates an archive containing the html + page and at least all the files it links to. + + The archive might contain some unneeded images. + + test/Makefile.am | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 8c031c029d45d65dac22be9a809cc43f4449d41e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 3 16:41:34 2011 +0100 + + pdf,ps,quartz: Use correct tolerance for gradient domain computation + + The tolerance argument of _cairo_gradient_pattern_box_to_parameter () + is in pattern space, so to have it constant in device space, it should + depend on the pattern matrix. + + In ps and pdf the fallback resolution alone is not meaningful. The + resolution/fallback_resolution ratio should be used instead. + + src/cairo-pattern.c | 3 ++- + src/cairo-pdf-surface.c | 10 +++++++--- + src/cairo-ps-surface.c | 10 +++++++--- + src/cairo-quartz-surface.c | 12 +++++++++--- + 4 files changed, 25 insertions(+), 10 deletions(-) + +commit 78eade13b196d43a46d84b53e2e0f6cdf27de877 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jan 4 22:14:46 2011 +0100 + + gl: Don't ignore offset for gradient sources + + _cairo_gl_operand_init() has parameters to specify an offset for the + source and another for the destination. + + _cairo_gl_gradient_operand_init() incorrectly assumed that the two + offsets were identical. + + Fixes mask, radial-gradient-mask-source. + + src/cairo-gl-composite.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 49171fb53474531a22fcd98882f97bdbf9a4d521 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jan 4 13:17:57 2011 +0100 + + gl: Update radial gradient implementation + + Cairo assumes that radial gradients are drawn as defined in ISO3200 + since b661bc871220fd67d673c44a8e3cb305812d8c38. + + To implement them in GLSL, three different shaders are required: + - tangent circles (a=0 in the parameter equation) + - none-extended gradient (solutions outside [0,1] must be ignored) + - extended gradient + + Moreover, texcoords are used instead of gl_FragCoord, to fix the + flipping as per 31e116f084d0ff073bed9d0e9c1c6ca1e5db4843. + + Fixes huge-radial, radial-gradient, radial-gradient-extend, + radial-gradient-mask, radial-gradient-source. + + src/cairo-gl-composite.c | 219 +++++++++++++++++++++++------------------------ + src/cairo-gl-private.h | 21 ++--- + src/cairo-gl-shaders.c | 115 +++++++++++++++++-------- + 3 files changed, 193 insertions(+), 162 deletions(-) + +commit 922bbd432011728304fe5647467545a52b9ab9b0 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Tue Jan 18 13:52:21 2011 +0100 + + tee: Do not apply two times the master device transform + + cairo_tee_surface_create copies the device transform from 'master' to + the new surface. This is wrong since all the cairo_surface_wrapper + functions apply master's device transform themselves. + + Reviewed-by: Benjamin Otte <otte@redhat.com> + + src/cairo-tee-surface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit b0e1c837acea2d6a78d5e5b1a011b1d43354b3ac +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 7 13:27:27 2011 +0200 + + gl: Ensure that gl surface resizes are properly applied + + If a gl surface is resized (with cairo_gl_surface_set_size()) while being the + current target, the resize does not take effect until the target changes to a + different surface and back to the original one. This patch allows a gl_context + to track when the current target surface has been changed and ensures that a + resize always take effect the next time a resized surface is used as the target. + + src/cairo-gl-device.c | 3 ++- + src/cairo-gl-private.h | 1 + + src/cairo-gl-surface.c | 8 ++++++-- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 45331fe87c319a899fc3cb661dc842fd815282d6 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Jan 7 13:01:19 2011 +0200 + + gl: Fix condition that prevents setting the size of window surfaces + + A typo in cairo_gl_surface_set_size() prevents resizing of window surfaces + while incorrectly allows resizing of texture-backed surfaces. + + src/cairo-gl-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 55c57a5b3d5700db05cc19d8e6107ef4addc0b76 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jan 12 23:21:02 2011 +0100 + + mesh: Do not declare min and max functions + + Using the names "min" and "max" is likely to cause collisions. Instead + of them, use the MIN and MAX macros provided by cairoint.h + + Reviewed-by: Uli Schlachter <psychon@znc.in> + + src/cairo-mesh-pattern-rasterizer.c | 56 +++++++++++++++++-------------------- + 1 file changed, 25 insertions(+), 31 deletions(-) + +commit e6e0161b7e54854422b84f934c9610c5b8114a0b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 17 23:09:27 2011 +0100 + + xcb: Add a short comment to the Picture cache + + When we create a temporary cairo_xcb_picture_t, we want to be able to + reuse it, but we don't want the Picture to be alive forever to eat up + resources when it is not being used anymore. + + When a surface pattern is about to be used for compositing, if it has + a cairo_xcb_picture_t snapshot, the latter is just reused. Otherwise a + new cairo_xcb_picture_t with the same content is created and attached + as a snapshot to the surface. + + To keep the resource usage bounded we keep a per-screen cache of + cairo_xcb_picture_t. When the cache is full, a random entry is evicted + and we detach this snapshot from the surface that it is a snapshot + for. It will be immediately destroyed if nothing else holds a + reference to it. Otherwise it will be charged against the holder of + the reference, so it won't count anymore in the resources occupied by + the cache elements. This makes sure that the cached surface isn't + kept alive indefinitely because of caching. + + Based on a patch by Uli Schlachter. + + src/cairo-xcb-screen.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 7f83b4e949b85fc604e9a7841c566eebd0aa1452 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Jan 17 18:38:16 2011 +0100 + + xcb: Don't finish snapshots when they are detached + + Some code might own a reference to the snapshot when it is + detached. For this reason, we shouldn't finish the snapshot except + when its reference count drops to zero. + + This avoids destroying source patterns which get evicted from the + cache while acquiring the mask. + + Fixes xcb-stress-cache. + + Big "thank you" to Andrea Canciani for helping in figuring this one out. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 44095f3dde22b2c379902e56adc47408b630c5e7 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Jan 16 20:52:01 2011 +0100 + + Add a test case for a bug in the xcb backend + + This was found via cairo-perf-micro which sometimes triggered this bug in its + mask-similar_image-* test. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/xcb-stress-cache.c | 118 ++++++++++++++++++++++++++++++++++++++++++ + test/xcb-stress-cache.ref.png | Bin 0 -> 97 bytes + 4 files changed, 120 insertions(+) + +commit 01799bf0523d11e1bdb239caa265ce40cdcdfafa +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 17 10:25:30 2011 +0100 + + Fix optimization of white IN dest compositing + + The optimization of any opaque color IN an alpha-only surface is a + noop (it multiplies the alpha of each pixel of the destination by 1). + The same does not apply to colored destinations, because IN replaces + the original color with the color of the source. + + Fixes white-in-noop. + + src/cairo-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 9e6d8ff86c9a8584ba25c78b1c4f3d50dba03e08 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 17 12:17:30 2011 +0100 + + test: Add missing ref image to REFERENCE_IMAGES + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 2af0b0f5dae88469113e5b10ccd8405f041bf109 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 17 10:21:06 2011 +0100 + + test: Add white-in-noop + + Exercise an incorrect optimization in cairo-surface.c. It replaces + with a noop any region-based fill with solid white source and an IN + operator. + + test/Makefile.sources | 1 + + test/white-in-noop.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ + test/white-in-noop.ref.png | Bin 0 -> 95 bytes + 3 files changed, 53 insertions(+) + +commit a35180714798ace2299aad531e2eacfa7968f16e +Author: Maarten Bosmans <mkbosmans@gmail.com> +Date: Tue Dec 28 13:32:27 2010 +0100 + + doc: Fix some broken references and gtk-doc warnings + + The gtk-doc comments contain some typos and are missing some escaping. + + doc/public/cairo-sections.txt | 1 + + doc/public/language-bindings.xml | 2 +- + src/cairo-clip.c | 2 +- + src/cairo-font-face.c | 6 +++--- + src/cairo-font-options.c | 2 +- + src/cairo-pattern.c | 6 ++++-- + src/cairo-ps-surface.c | 39 +++++++++++++++++++------------------- + src/cairo-recording-surface.c | 10 +++++----- + src/cairo-surface.c | 2 +- + src/cairo-win32-printing-surface.c | 2 +- + src/cairo.c | 27 ++++++++++++++------------ + src/cairo.h | 33 +++++++++++++++++--------------- + 12 files changed, 71 insertions(+), 61 deletions(-) + +commit 32241cde01a2a095f04c0b110067d4c1571f9cbd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 16 18:40:42 2011 +0100 + + doc: Add links to flush() and mark_dirty() in direct access functions + + cairo_image_get_data() and other direct access functions are often + misused by applications because they don't call cairo_surface_flush() + and/or cairo_surface_mark_dirty() around the code which accesses the + surface data directly. + + Although this information is already available in the description of + the cairo_surface_t type, adding a reminder about it in the direct + access functions should make it easier to use them correctly. + + src/cairo-image-surface.c | 5 +++++ + src/cairo-quartz-surface.c | 7 +++++++ + src/cairo-win32-surface.c | 6 ++++++ + 3 files changed, 18 insertions(+) + +commit 01c66d34c387a2d2b9114a9fccc7491ad7ff1315 +Author: Maarten Bosmans <mkbosmans@gmail.com> +Date: Tue Dec 28 11:34:02 2010 +0100 + + doc: Add a remark about toy status of the PNG API + + The PNG API is just a toy API whose main purpose is to make it easy to + write minimal examples of cairo features or testcases for bugs. For + these purposes there is no need to tune the output PNG file or to + provide additional information in optional PNG chuncks, but real + applications need to do that quite often. The documentation now points + out what is the correct procedure to write image data to a file. + + src/cairo-png.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 14afb69d3dc889715451cab6f54ec6ce73b431dd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jan 7 00:19:55 2011 +0100 + + xlib: Handle a wider range of glyph positions + + Backport the change from 588dead005d69c022245ff017f53ff403b50e9db to + Xlib. + + src/cairo-xlib-surface.c | 44 ++++++++++++++++++++++---------------------- + 1 file changed, 22 insertions(+), 22 deletions(-) + +commit 588dead005d69c022245ff017f53ff403b50e9db +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Dec 22 11:30:45 2010 +0100 + + xcb: Handle a wider range of glyph positions + + _can_composite_glyphs() checks that the position of each glyph can be + represented as a 16-bit offset from the destination origin. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=31897 + + src/cairo-xcb-surface-render.c | 26 +++++++++----------------- + 1 file changed, 9 insertions(+), 17 deletions(-) + +commit 10bae9d9ce5ece5bc5b4a929e791d9906a6b24b5 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Dec 22 00:24:59 2010 +0100 + + xcb: Stricter glyph validation + + To ensure that we can correctly issue the glyph operation, glyph size + must fit in an XCB request and its position must be within the + representable range (16-bit offset). + + src/cairo-xcb-surface-render.c | 102 +++++++++++++++++++++++++++++++---------- + 1 file changed, 77 insertions(+), 25 deletions(-) + +commit c3f9a0cf473f3ef9fd89b2a9738e1ce61fd0b6cc +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Dec 22 00:21:19 2010 +0100 + + xcb: Correct handling of index 0 glyphs + + Glyph caches (with direct glyph index matching) cannot be completely + initialized with zeroes, otherwise the code will incorrectly believe + that the lookup for the 0-index glyph has already been performed. + + src/cairo-xcb-surface-render.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit a87001c0631da31f9caccdd99f31739c6e85a4e9 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 4 12:39:12 2011 +0100 + + xcb: Fix premature pixmap free in boilerplate cleanup + + A xcb surface has to be finished before the associated drawable can be freed or + there will be X11 errors when the surface is later finished or used again. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 1 + + 1 file changed, 1 insertion(+) + +commit 673c44d3e85e31d6411598706dc025cd474b7dcf +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 4 12:36:42 2011 +0100 + + xcb: Check the check for errors in boilerplate + + We have to make sure we received all errors that the X server sent out before we + can be sure there are none. To do so, we just have to send some request and wait + for its reply, because that guarantees that the replies/errors to all previous + requests were received. + + _cairo_boilerplate_xcb_synchronize doesn't need this, because the GetImage + request already makes sure we received everything. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 51626ed2eed1abd7c540160988017c101da28952 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 4 12:33:28 2011 +0100 + + xcb: Check harder for X11 errors in boilerplate + + This commit makes the boilerplate code check for errors from the X server before + disconnecting and during synchronize. This should make sure no errors are ever + lost and silently ignored. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 74 +++++++++++++++++++++++-------------- + 1 file changed, 47 insertions(+), 27 deletions(-) + +commit f8277dfdaf60ebb1d6c60780cff559497780b5b6 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 4 13:05:03 2011 +0100 + + xcb: Only print the first error and ignore subsequent ones + + It is quite likely that following errors are caused by the previous ones. To + avoid flooding users we now silently discard all the errors and events after the + first one. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 8a65279ee1a5b7170bad552691ce5f96ef6cd8bd +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 4 12:29:11 2011 +0100 + + xcb: Add a define for some magic number + + In X11, errors look like events with response_type == 0. Using a define looks + better than just a "trust me!". + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 8957e506321c4dc1ca59c8a88012801509b0d338 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Jan 4 12:27:33 2011 +0100 + + xcb: Handle events in boilerplate + + Cairo shouldn't cause any events during a test run. Verify this by explicitly + handling events, too. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + boilerplate/cairo-boilerplate-xcb.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit f0bb3a29b36f85973ba678b19c5bf057f18506ed +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Jan 3 20:12:07 2011 +0100 + + pattern: Remove unused _cairo_pattern_size function + + 'git log -S_cairo_pattern_size' only finds the commit + a856371bef496da0e84226f4fd2fc3cb72e955ac, in which this function was + added, thus it looks like it has never been used. + + src/cairo-pattern.c | 39 --------------------------------------- + src/cairoint.h | 3 --- + 2 files changed, 42 deletions(-) + +commit e5f54bb9f34a463cd10240451dd5d29a735c4506 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Dec 25 14:46:43 2010 +0100 + + XCB: Make sure SHM memory isn't reused too early + + This commit delays the return of a SHM area to the free pool. When + _cairo_xcb_shm_info_destroy is called, it now adds the cairo_xcb_shm_info_t to a + list of pending memory areas and sends a GetInputFocus request to the server. + + This cairo_xcb_shm_info_t is only really freed when the GetInputFocus request + completes. To avoid unnecessarily waiting for the X server, we check via + xcb_poll_for_reply for the reply which returns immediately if the reply isn't + received yet. + + This commits fixes a race where the shared memory area is reused before the X + server finished reading data from it. This does NOT fix races where cairo draws + something new to the same cairo_xcb_shm_info_t while the X server still reads + from it. However, there doesn't seem to exist any code currently where the shm + info isn't immediately destroyed after it was used. + + This commit fixes the following tests for xcb-render-0.0 if SHM is enabled: + + joins mask mask-transformed-image push-group push-group-color radial-gradient + radil-gradient-mask radial-gradient-mask-source radial-gradient-one-stop + radial-gradient-source smask smask-mask smask-paint + + This also fixes mesh-pattern-transformed for all the xcb boilerplate "backends". + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection.c | 11 +++++++ + src/cairo-xcb-private.h | 6 ++++ + src/cairo-xcb-shm.c | 75 +++++++++++++++++++++++++++++++++++++++++++--- + 3 files changed, 88 insertions(+), 4 deletions(-) + +commit 6b4e07d1430c704fc976edf63c27c46f16a8751f +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Dec 25 14:47:29 2010 +0100 + + Switch the order of two functions in the C file + + The following commit adds a call to _cairo_xcb_shm_info_destroy to some function + in-between, but it also renames it and does some other changes to this. Thus, + move this function first to make the diff easier to read. :) + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-shm.c | 68 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 34 insertions(+), 34 deletions(-) + +commit 30b961f895f924ceb65574f15ecbe0ff1948c8aa +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Dec 25 14:17:33 2010 +0100 + + Remove an unused field from cairo_xcb_shm_info_t + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection-shm.c | 10 ++++------ + src/cairo-xcb-private.h | 3 +-- + src/cairo-xcb-surface-core.c | 19 +++++++++---------- + src/cairo-xcb-surface-render.c | 19 +++++++++---------- + src/cairo-xcb-surface.c | 21 ++++++++++----------- + 5 files changed, 33 insertions(+), 39 deletions(-) + +commit c72c7aa6d69ed4a08bde62f12b34907c7cce8bce +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Jan 2 19:32:26 2011 +0100 + + matrix: Fix warnings about documentation by 'make check' + + 'make check' complains about the syntax of the documentation: the + space between the function name and the parenthesis is not allowed. + + src/cairo-matrix.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 200e147322a7a17dec91ad5f678a07fdfaf38de2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 17 11:04:53 2010 +0100 + + pattern: Use double precision for gradient extreme objects + + Using double precision for gradient extreme objects ensures that they + are preserved as specified when constructing the gradient pattern. + + Fixes huge-linear, huge-radial. + + Fixes part of https://bugs.freedesktop.org/show_bug.cgi?id=32215 + + src/cairo-gl-composite.c | 20 ++-- + src/cairo-pattern.c | 211 ++++++++++++++++++------------------- + src/cairo-qt-surface.cpp | 38 +++---- + src/cairo-script-surface.c | 18 ++-- + src/cairo-skia-surface.cpp | 8 +- + src/cairo-svg-surface.c | 40 +++---- + src/cairo-types-private.h | 10 +- + src/cairo-vg-surface.c | 18 ++-- + src/cairo-win32-printing-surface.c | 8 +- + src/cairo-xml-surface.c | 14 +-- + src/drm/cairo-drm-i915-shader.c | 28 ++--- + src/drm/cairo-drm-i965-shader.c | 28 ++--- + 12 files changed, 205 insertions(+), 236 deletions(-) + +commit 6472864b2c424c0dfe4ff4e76eff8dfb896e60e8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 16 23:07:30 2010 +0100 + + test: Huge means more than MAX_INT + + Cairo makes it possible to create gradients whose extreme objects are + defined with double precision coordinates, but it internally + represents them with 24.8 fixed point precision. + + This shows that coordinates that don't fit the valid range are + mishandled and don't even trigger an error status. + + test/huge-linear.c | 2 +- + test/huge-radial.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 38dce5d14473e1106c8ea7a67b9be0f400d442a2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 17 11:03:03 2010 +0100 + + pattern: Factor out pattern rescaling + + The same code was duplicated (incorrectly and with some minor + differences) in pattern, image, xlib and xcb. + + _cairo_gradient_pattern_max_val() abstracts that code in a function + that can be used whenever a gradients extremes need to be rescaled to + fit within a given range. + + Fixes huge-linear, huge-radial. + + Fixes part of https://bugs.freedesktop.org/show_bug.cgi?id=32215 + + src/cairo-image-surface.c | 64 ++++------------- + src/cairo-pattern.c | 156 ++++++++++++++++++++++++++--------------- + src/cairo-xcb-surface-render.c | 75 +++++++------------- + src/cairo-xlib-surface.c | 64 ++++------------- + src/cairoint.h | 6 ++ + 5 files changed, 156 insertions(+), 209 deletions(-) + +commit 7b188f852ef502306c8bd0a72ee3857b5f29e724 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 16 22:39:09 2010 +0100 + + test: Make huge-* test gradients not within pixed_fixed_t range + + Cairo represents gradients coordinate with 24.8 fixed point precision, + but pixman uses 16.16 fixed point coordinates. + + This shows that cairo is currently unable to handle gradients with + coordinates which are valid for cairo but not for pixman. + + test/huge-linear.c | 2 +- + test/huge-linear.image16.ref.png | Bin 1542 -> 1542 bytes + test/huge-radial.c | 2 +- + 3 files changed, 2 insertions(+), 2 deletions(-) + +commit 51594d9787905618de608a367c3a5fc0544c52e3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 17 11:04:41 2010 +0100 + + matrix: Cairo matrix to pixman transform/offset conversion + + Xlib, XCB and image use the same code to convert a cairo_matrix_t to a + backend-specific transform. + + The code did not handle correctly some matrices, thus a new function + that performs the conversion in a more generic way was added and used + in the backends instead of fixing the repeated code. + + Fixes part of https://bugs.freedesktop.org/show_bug.cgi?id=32215 + + src/cairo-image-surface.c | 164 ++++++--------------- + src/cairo-matrix.c | 315 ++++++++++++++++++++++++++++++++--------- + src/cairo-pattern.c | 25 ++-- + src/cairo-xcb-surface-render.c | 75 ++-------- + src/cairo-xlib-surface.c | 35 +++-- + src/cairoint.h | 19 ++- + 6 files changed, 357 insertions(+), 276 deletions(-) + +commit ada6057b8ccab133909b127850c41abb3216a842 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 31 13:01:50 2010 +0100 + + test: New radial-gradient tests + + The old radial gradient tests were actually drawing the same gradients + with different operators (OVER/SOURCE) and operations (paint/mask). + + It is possible to refactor them to share the gradient construction + code. This makes it easy to change the gradient shape in all of them + to test more interesting combinations. + + Instead of testing 16 generic positions we are now testing just 7 + cases, which correspond to every possible combination of the relative + size and position of the two circles defining the gradient. In + particular we are now testing a constant radius gradient and gradients + with tangent circles. + + test/Makefile.am | 25 +-- + test/Makefile.sources | 4 - + test/radial-gradient-mask-source.argb32.ref.png | Bin 105572 -> 145713 bytes + test/radial-gradient-mask-source.c | 111 --------- + test/radial-gradient-mask-source.image16.ref.png | Bin 76287 -> 109925 bytes + ...adial-gradient-mask-source.pdf.argb32.xfail.png | Bin 90399 -> 0 bytes + ...radial-gradient-mask-source.pdf.rgb24.xfail.png | Bin 103447 -> 0 bytes + ...dial-gradient-mask-source.quartz.argb32.ref.png | Bin 112421 -> 0 bytes + ...adial-gradient-mask-source.quartz.rgb24.ref.png | Bin 120173 -> 0 bytes + test/radial-gradient-mask-source.rgb24.ref.png | Bin 115808 -> 150945 bytes + ...radial-gradient-mask-source.xlib.argb32.ref.png | Bin 0 -> 145801 bytes + .../radial-gradient-mask-source.xlib.rgb24.ref.png | Bin 0 -> 150362 bytes + test/radial-gradient-mask.argb32.ref.png | Bin 105572 -> 0 bytes + test/radial-gradient-mask.c | 110 --------- + test/radial-gradient-mask.image16.ref.png | Bin 76287 -> 204585 bytes + test/radial-gradient-mask.pdf.argb32.xfail.png | Bin 90399 -> 0 bytes + test/radial-gradient-mask.pdf.rgb24.xfail.png | Bin 103447 -> 0 bytes + test/radial-gradient-mask.quartz.argb32.ref.png | Bin 112421 -> 0 bytes + test/radial-gradient-mask.quartz.rgb24.ref.png | Bin 120173 -> 0 bytes + test/radial-gradient-mask.ref.png | Bin 0 -> 286065 bytes + test/radial-gradient-mask.rgb24.ref.png | Bin 115808 -> 0 bytes + test/radial-gradient-one-stop.argb32.ref.png | Bin 1575 -> 0 bytes + test/radial-gradient-one-stop.c | 107 --------- + test/radial-gradient-one-stop.ps3.argb32.ref.png | Bin 1444 -> 0 bytes + test/radial-gradient-one-stop.ps3.rgb24.ref.png | Bin 1314 -> 0 bytes + test/radial-gradient-one-stop.ref.png | Bin 0 -> 6306 bytes + test/radial-gradient-one-stop.rgb24.ref.png | Bin 1307 -> 0 bytes + test/radial-gradient-source.argb32.ref.png | Bin 251063 -> 408848 bytes + test/radial-gradient-source.c | 115 ---------- + test/radial-gradient-source.image16.ref.png | Bin 119942 -> 169796 bytes + test/radial-gradient-source.pdf.argb32.xfail.png | Bin 192993 -> 0 bytes + test/radial-gradient-source.pdf.rgb24.xfail.png | Bin 165642 -> 0 bytes + test/radial-gradient-source.quartz.argb32.ref.png | Bin 264308 -> 0 bytes + test/radial-gradient-source.quartz.rgb24.ref.png | Bin 180829 -> 0 bytes + test/radial-gradient-source.rgb24.ref.png | Bin 179609 -> 263908 bytes + test/radial-gradient.c | 248 ++++++++++++++++----- + test/radial-gradient.image16.ref.png | Bin 188481 -> 256686 bytes + test/radial-gradient.pdf.xfail.png | Bin 211493 -> 0 bytes + test/radial-gradient.quartz.ref.png | Bin 248130 -> 0 bytes + test/radial-gradient.ref.png | Bin 262931 -> 382283 bytes + test/radial-gradient.svg.xfail.png | Bin 264425 -> 0 bytes + 41 files changed, 200 insertions(+), 520 deletions(-) + +commit b4aa01f72f98d71bded5f6fa3eaf3d12ad30eb2c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 16 22:46:50 2010 +0100 + + pattern: Make functions not used elsewhere static + + _cairo_pattern_init_linear() and _cairo_pattern_init_radial() are only + called from within cairo-pattern.c + + src/cairo-pattern.c | 4 ++-- + src/cairoint.h | 9 --------- + 2 files changed, 2 insertions(+), 11 deletions(-) + +commit b0aef7202d40f3f45b8914e8bd0edfcc6e5112ad +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 17 10:44:41 2010 +0100 + + pattern: Use cairo_color_stop_t when hashing gradient stops + + Since 18b48a6ebc044c07f08bafd0abcb68c595c5746c the color of each + gradient stop is stored in a cairo_color_stop_t, but + _cairo_gradient_color_stops_hash() was not updated accordingly. + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0501777598cf8fc4e8668e9121eac6b389591f22 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 17 11:02:02 2010 +0100 + + pattern: Remove unused 'opaque' variable + + opaque is never read, thus it can be removed. + + src/cairo-pattern.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 5d5d24c6a26cbabfc25067f0ea885f5705c4987c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 23 11:44:09 2010 +0100 + + doc: Add documentation for the mesh API + + The documentation content is in the comments of the functions. + + doc/public/cairo-sections.txt | 13 +++++++++++++ + doc/public/language-bindings.xml | 13 +++++++++++++ + 2 files changed, 26 insertions(+) + +commit a8344f98e7f4d463c85629d00420f2c8433aff9f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Dec 24 16:43:53 2010 +0100 + + test: Add tests for mesh patterns + + mesh-pattern tests a mesh pattern with non-opaque two overlapping + patches. + + mesh-pattern-accuracy tests the accuracy of the color computed in each + point of a patch. It can point out defects in rasterizers which rely + on mesh subdivision only use the mesh shape instead of both shape and + color to decide when the tensor-product patches can be approximated + with Gouraud-shaded triangles. + + mesh-pattern-conical is an example of how a conical gradient can be + approximated with a mesh pattern. + + mesh-pattern-control-points tests a mesh pattern with control points + in non-default position to verify that their position affects the + color as expected. + + mesh-pattern-fold tests a mesh pattern with a patch which folds along + both sides. + + mesh-pattern-overlap tests a mesh pattern with a patch which folds + along just one side. + + mesh-pattern-transformed tests a mesh pattern with non-identity + transform matrix. + + test/Makefile.am | 14 +++ + test/Makefile.sources | 7 ++ + test/mesh-pattern-accuracy.c | 99 +++++++++++++++++ + test/mesh-pattern-accuracy.image16.ref.png | Bin 0 -> 7209 bytes + test/mesh-pattern-accuracy.ref.png | Bin 0 -> 8086 bytes + test/mesh-pattern-conical.c | 135 +++++++++++++++++++++++ + test/mesh-pattern-conical.image16.ref.png | Bin 0 -> 6141 bytes + test/mesh-pattern-conical.ref.png | Bin 0 -> 8655 bytes + test/mesh-pattern-control-points.c | 114 +++++++++++++++++++ + test/mesh-pattern-control-points.image16.ref.png | Bin 0 -> 7178 bytes + test/mesh-pattern-control-points.ref.png | Bin 0 -> 10665 bytes + test/mesh-pattern-fold.c | 82 ++++++++++++++ + test/mesh-pattern-fold.image16.ref.png | Bin 0 -> 22913 bytes + test/mesh-pattern-fold.ref.png | Bin 0 -> 52980 bytes + test/mesh-pattern-overlap.c | 76 +++++++++++++ + test/mesh-pattern-overlap.image16.ref.png | Bin 0 -> 5933 bytes + test/mesh-pattern-overlap.ref.png | Bin 0 -> 9129 bytes + test/mesh-pattern-transformed.c | 107 ++++++++++++++++++ + test/mesh-pattern-transformed.image16.ref.png | Bin 0 -> 9778 bytes + test/mesh-pattern-transformed.ref.png | Bin 0 -> 14463 bytes + test/mesh-pattern.c | 94 ++++++++++++++++ + test/mesh-pattern.image16.ref.png | Bin 0 -> 12199 bytes + test/mesh-pattern.ref.png | Bin 0 -> 19566 bytes + 23 files changed, 728 insertions(+) + +commit b164187ff6e8e643428165370dd53f9ac5f87bb3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 24 16:43:23 2010 +0100 + + test: Extend pattern-get-type and pattern-getters for mesh patterns + + Add testing for mesh patterns to pattern-get-type and pattern-getters. + + test/pattern-get-type.c | 7 ++++- + test/pattern-getters.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 88 insertions(+), 1 deletion(-) + +commit 96426fdf0154a9438595541a3b86d328ef730075 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Dec 21 11:20:50 2010 +0100 + + script: Add support for mesh patterns + + Extend CairoScript with operators based on the mesh pattern API. + + src/cairo-script-surface.c | 85 ++++++++++++ + util/cairo-script/cairo-script-operators.c | 201 +++++++++++++++++++++++++++++ + 2 files changed, 286 insertions(+) + +commit c243f3ac9c451e0c203c820a80fb869bbec4c06d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Dec 9 11:01:46 2010 +0100 + + pattern: Add public mesh pattern API + + Add public funcions to create and define mesh patterns and getters to + examine their definition. + + src/cairo-pattern.c | 1004 ++++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo.h | 62 ++++ + src/cairoint.h | 4 + + 3 files changed, 1069 insertions(+), 1 deletion(-) + +commit 30636206b0e2d50834cf75148cef351b8e49a52e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 17 18:45:22 2010 +0100 + + pdf,ps: Add native mesh pattern support + + PS and PDF have native support for mesh patterns, but they have encode + mesh points and colors in an appropriate binary stream. + + cairo_pdf_shading_* functions implement the encoding, which is the + same for PDF and PS. + + src/Makefile.sources | 4 +- + src/cairo-pdf-shading-private.h | 99 ++++++++++++++ + src/cairo-pdf-shading.c | 277 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 153 +++++++++++++++++++++- + src/cairo-ps-surface.c | 84 ++++++++++++ + 5 files changed, 614 insertions(+), 3 deletions(-) + +commit 8df122cb4bc7348025a74a890e9082073553d557 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 24 20:36:23 2010 +0100 + + Add mesh gradient rasterizer + + Add an implementation of a fast and reasonably accurate + non-antialiased mesh gradient rasterizer. + + src/Makefile.sources | 1 + + src/cairo-image-surface.c | 25 + + src/cairo-mesh-pattern-rasterizer.c | 943 ++++++++++++++++++++++++++++++++++++ + src/cairo-pattern.c | 54 +++ + src/cairoint.h | 12 + + 5 files changed, 1035 insertions(+) + +commit f3c34887bd59377f003e790a4039a3074ca01f7d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Dec 7 18:21:35 2010 +0100 + + gstate: Disallow incomplete mesh gradient sources + + Mesh gradients are constructed using multiple commands, bracketed by + explicit begin/end pairs. Using a mesh gradient inside a begin/end + pair is not allowed. + + src/cairo-gstate.c | 44 ++++++++++++++++++++++++++++++++------------ + 1 file changed, 32 insertions(+), 12 deletions(-) + +commit ed24deaa2eaefb5e11ff900d4466474592f66d33 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Dec 9 10:34:31 2010 +0100 + + mesh: Add mesh pattern type and enum values + + Add the mesh pattern type and an error status to be used to report an + incorrect construction of the pattern. + + Update the backends to make them ready to handle the new pattern type, + even if it cannot be created yet. + + src/cairo-device.c | 1 + + src/cairo-gl-composite.c | 1 + + src/cairo-misc.c | 2 + + src/cairo-pattern.c | 208 ++++++++++++++++++++++++++++++- + src/cairo-region.c | 1 + + src/cairo-spans.c | 2 + + src/cairo-surface.c | 1 + + src/cairo-svg-surface.c | 6 + + src/cairo-types-private.h | 46 +++++++ + src/cairo-win32-printing-surface.c | 3 + + src/cairo-xcb-surface-core.c | 1 + + src/cairo-xcb-surface-render.c | 3 +- + src/cairo-xlib-surface.c | 1 + + src/cairo.h | 9 +- + src/cairoint.h | 7 ++ + util/cairo-gobject/cairo-gobject-enums.c | 2 + + util/cairo-trace/trace.c | 1 + + 17 files changed, 292 insertions(+), 3 deletions(-) + +commit 19b840a9044f873657f0c0dbb3ccf82a13d43888 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 17 14:56:08 2010 +0100 + + Keep makefiles in alphabetical order + + Recording surfaces were at first called meta surfaces. When the name + was changed, makefiles were not updated to keep alphabetical order. + + src/Makefile.sources | 4 ++-- + test/Makefile.am | 28 ++++++++++++++-------------- + test/Makefile.sources | 2 +- + 3 files changed, 17 insertions(+), 17 deletions(-) + +commit 8f598dd69d3f98da8a59cbd87640aedf22473290 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Jul 23 08:20:52 2010 +0200 + + quartz: Use native PDF blend modes + + Quartz supports PDF blend modes since 10.4 and exposes Porter-Duff + compositing operators through the public API since 10.5. + + src/cairo-quartz-surface.c | 240 ++++++++++++++---------- + test/Makefile.am | 4 + + test/extended-blend-alpha.quartz.argb32.ref.png | Bin 0 -> 9729 bytes + test/extended-blend-alpha.quartz.rgb24.ref.png | Bin 0 -> 5598 bytes + test/extended-blend.quartz.argb32.ref.png | Bin 0 -> 4284 bytes + test/extended-blend.quartz.rgb24.ref.png | Bin 0 -> 3965 bytes + 6 files changed, 143 insertions(+), 101 deletions(-) + +commit fabbc16253c68234b881af25abf734ba786d234f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 30 19:32:30 2010 +0100 + + quartz: Don't dynamically load unused functions + + Remove an unused variable. + + src/cairo-quartz-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 1bc7d948c73397c453526f6e66b3f72668ce2910 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jun 23 17:34:13 2010 +0200 + + quartz: Clean up dynamically loaded functions + + README indicates MacOSX 10.4 as a requirement for quartz and we are + directly using some functions that have been added to the public + CoreGraphics API in 10.4. + + rop 10.3-specific workarounds and link to 10.4 API functions instead + of loading them at runtime. + + src/cairo-quartz-surface.c | 62 +++++++++++----------------------------------- + 1 file changed, 14 insertions(+), 48 deletions(-) + +commit 7f68461e0b64fefc002920cc23f5617a9084f1cb +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Dec 26 11:04:30 2010 +0100 + + Detach snapshots after flushing in cairo_surface_finish() + + Flushing a surface can attach snapshots to it, thus we have to detach + the snapshots after the flush, to make sure they aren't leaked. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 59ac884c607c024d0608cf7dec52509d9e9e328e +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Dec 25 23:39:21 2010 +0100 + + Verify that surfaces leak no snapshots + + Finished surfaces should own no snapshots, because finished surfaces + can't be used as sources, thus their snapshots would never be used. + + When free'ing the surface in cairo_surface_destroy(), it should have + no snapshots, or they will be leaked. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit c84730d88983623dddd6b9980d82648b7297444d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 25 23:04:47 2010 +0000 + + version: Post release version bump + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4938e11ffe11781e4e294092807ebc67f362eac6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 25 13:25:14 2010 +0000 + + version: Bump for 1.10.2 release + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit de464ea7781707984a1e1d5f98a8ff23c5ee18ed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 25 13:24:37 2010 +0000 + + NEWS: Add entry for 1.10.2 + + NEWS | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +commit 888eeb187f542b96e722725f616720038e700b84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 25 10:19:38 2010 +0000 + + Add a KNOWN_ISSUES file to track WONTFIX(?) bugs + + KNOWN_ISSUES | 10 ++++++++++ + Makefile.am | 1 + + 2 files changed, 11 insertions(+) + +commit a4ae7d59be2e545afc30c35b2235b89860e2003a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Dec 25 09:39:08 2010 +0000 + + gl: Enable PLT symbol hiding for dispatch entries + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-gl-dispatch-private.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 109fcb39502239ff87c70cc99f2baea6e46b36a5 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Dec 4 16:36:28 2010 +0100 + + XCB: Stop taking the xcb socket + + This makes the xcb backend use the auto-generated xcb API instead of + hand-writing each request. This should also improve parallelism with non-cairo + threads that use the same xcb connection. + + Big thanks to Andrea Canciani for taking a look at this and finding lots of good + improvements (especially finding xcb_send_request was great). + + cairo-perf-trace and cairo-perf-diff-files between master + (6732dbf2992891be4b1f08b14a5c449fd08b637c) and this change: + + $ ./cairo-perf-diff-files ../master_perf ../xcb_no_socket_perf + old: master_perf + new: xcb_no_socket_perf + Speedups + ======== + xcb-rgba evolution-0 23558.86 (23558.86 0.00%) -> 19338.78 (19338.78 0.00%): 1.22x speedup + ▎ + xcb-rgba poppler-bug-12266-0 98.43 (98.43 0.00%) -> 82.36 (82.36 0.00%): 1.20x speedup + ▎ + xcb-rgba gnome-terminal-vim-0 5518.08 (5518.08 0.00%) -> 4905.92 (4905.92 0.00%): 1.12x speedup + ■+ xcb-rgba gnome-terminal-20090601-0 45648.46 (45648.46 0.00%) -> 41231.25 (41231.25 0.00%): 1.11x speedup + ■+ xcb-rgba evolution-20090607-0 71643.69 (71643.69 0.00%) -> 66314.95 (66314.95 0.00%): 1.08x speedup + ■+ xcb-rgba poppler-0 3501.69 (3501.69 0.00%) -> 3322.26 (3322.26 0.00%): 1.05x speedup + + Slowdowns + ========= + xcb-rgba gnome-system-monitor-0 7500.01 (7500.01 0.00%) -> 7923.70 (7923.70 0.00%): 1.06x slowdown + + xcb-rgba swfdec-youtube-full-0 26409.89 (26409.89 0.00%) -> 28430.76 (28430.76 0.00%): 1.08x slowdown + ■+ xcb-rgba gnome-system-monitor-20090821-0 34801.61 (34801.61 0.00%) -> 37891.14 (37891.14 0.00%): 1.09x slowdown + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-connection-core.c | 336 ++++-------------- + src/cairo-xcb-connection-render.c | 716 +++----------------------------------- + src/cairo-xcb-connection-shm.c | 105 +----- + src/cairo-xcb-connection.c | 41 --- + src/cairo-xcb-private.h | 22 +- + src/cairo-xcb-shm.c | 3 +- + src/cairo-xcb-surface-core.c | 16 +- + src/cairo-xcb-surface-render.c | 28 +- + src/cairo-xcb-surface.c | 30 +- + 9 files changed, 125 insertions(+), 1172 deletions(-) + +commit cf0a4ed862d93b7e6d7d26942cfe98a50beccd4c +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Nov 29 19:11:26 2010 +0100 + + xcb: Remove a wrong optimization + + Clear surfaces with an alpha channel are already replaced with a + transparent color in gstate, so this code was never hit. + + Clear surfaces without an alpha channel, can be replaced with solid + black only if the surface pattern has an extend other than + CAIRO_EXTEND_NONE. + + Fixes the clear-source test for xcb. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Reviewed-by: Andrea Canciani <ranma42@gmail.com> + + src/cairo-xcb-surface-render.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit e6c3efdd650a4eadceb003a5e1bf9d871f61a48f +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Nov 27 21:52:59 2010 +0100 + + xcb: Work around wrong extent computation in the X server + + The X server calculates the bounding box for traps and then allocates + a temporary picture for this. When the X server calculates different + values than cairo got in extents->bounded, unbounded operators will + have wrong results. The X server only ever calculates bounds that are + larger than the correct values. + + Fix this by explicitly clipping the drawing to the expected bounds. + + Fixes clip-fill-{eo,nz}-unbounded and clip-stroke-unbounded. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Reviewed-by: Andrea Canciani <ranma42@gmail.com> + + src/cairo-xcb-surface-render.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 4e3eb5e8ed6271511fb2b8fec78c82abbd011bed +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 17 19:21:51 2010 +0100 + + gl: Fix #include's to pass 'make check' + + 'make check' complains that: + Checking that private header files #include "some cairo header" first (or none) + cairo-gl-dispatch-private.h:#include <stddef.h> + Checking that source files #include "cairoint.h" first (or none) + cairo-gl-dispatch.c:#include "cairo-gl-private.h" + cairo-gl-info.c:#include "cairo-gl-private.h" + + src/cairo-gl-dispatch-private.h | 2 +- + src/cairo-gl-dispatch.c | 1 + + src/cairo-gl-info.c | 1 + + 3 files changed, 3 insertions(+), 1 deletion(-) + +commit a27e3bc6d08feeac8e4ee5315a0ad974efee0ee9 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Nov 17 00:07:03 2010 +1030 + + PS: fix embedding of grayscale jpegs + + https://bugs.freedesktop.org/show_bug.cgi?id=31632 + (cherry picked from commit 653ceb517fe756b042a3cf8322a36cbfe71ddbd8) + + src/cairo-ps-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 10e58a4a1638a67da132f3bc3f4ebdbc36691b13 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Nov 17 18:25:27 2010 +0100 + + Avoid some unneeded 'is_clear = FALSE' + + When a drawing operator doesn't actually have any effect, we don't have to set + the surface's is_clear flag to FALSE. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-surface.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +commit 2a632b1f54bfa2f6466860fcdd151cb6187128d2 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Dec 6 14:01:20 2010 +0200 + + gl: Remove GLEW from the build system and the source tree + + build/configure.ac.features | 1 - + configure.ac | 21 - + doc/public/Makefile.am | 1 - + src/Makefile.am | 2 - + src/Makefile.sources | 7 +- + src/glew/GL/glew.h | 12255 ------------------------------------------ + src/glew/GL/glxew.h | 1399 ----- + src/glew/LICENSE.txt | 73 - + src/glew/glew.c | 12189 ----------------------------------------- + 9 files changed, 1 insertion(+), 25947 deletions(-) + +commit 7cf989354679793e3ffd9c058e0e0c8e5a641d35 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Dec 8 15:01:34 2010 +0200 + + gl: Replace GLEW by using the facilities provided by cairo-gl-info + + src/cairo-gl-device.c | 52 ++++++++++++++--------------------------- + src/cairo-gl-gradient-private.h | 5 ++-- + src/cairo-gl-private.h | 6 ++--- + src/cairo-gl-shaders.c | 16 ++++++------- + src/cairo-gl-surface.c | 6 +++-- + 5 files changed, 34 insertions(+), 51 deletions(-) + +commit 6373db844172365787b67d5992e4daa0e2a12596 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Dec 8 14:44:05 2010 +0200 + + gl: Remove GL 1.x ARB shader implementation + + Shaders for GL 1.x ARB are served by the same implementation as GL 2.x and therefore + a dedicated ARB implementation is not needed any more. + + src/cairo-gl-shaders.c | 187 ------------------------------------------------- + 1 file changed, 187 deletions(-) + +commit a6facced8d6a17ed26b103d995a2d61e772aaa8b +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Wed Dec 8 14:39:31 2010 +0200 + + gl: Use the GL core 2.0 shader implementation for both GL 1.x ARB and GL 2.x + + The GL core 2.0 shader implementation can be used by both GL 1.x and 2.x + thanks to the dispatch table. + + src/cairo-gl-shaders.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit cf518b29e06328715837accd3a4390adde898624 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Dec 6 13:36:22 2010 +0200 + + gl: Use the dispatch table for calling ARB/EXT functions + + Use the dispatch table for calling GL functions that can have multiple name + variants. Also, always use the core variant names for GL constants. + + src/cairo-gl-composite.c | 12 ++- + src/cairo-gl-device.c | 52 +++++----- + src/cairo-gl-gradient.c | 14 +-- + src/cairo-gl-private.h | 2 +- + src/cairo-gl-shaders.c | 256 +++++++++++++++++++++++++++-------------------- + src/cairo-gl-surface.c | 4 +- + 6 files changed, 195 insertions(+), 145 deletions(-) + +commit ed862d3f7bd11c6d60f48efd69c0fa035b5b17a1 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Mon Dec 6 13:03:28 2010 +0200 + + gl: Add definitions for the core variant names of used GL constants + + This allows us to use the core variant of the needed GL constants regardless of the + GL header version that is being used for compilation. + + src/Makefile.sources | 1 + + src/cairo-gl-ext-def-private.h | 99 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 1 + + 3 files changed, 101 insertions(+) + +commit e0ab932c611ec172f3999595386126b4e9ca46da +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Dec 3 20:49:39 2010 +0200 + + gl: Embed the GL dispatch table in the cairo-gl context and initialize it. + + src/cairo-egl-context.c | 6 ++++++ + src/cairo-gl-private.h | 2 ++ + src/cairo-glx-context.c | 7 +++++++ + src/cairo-wgl-context.c | 7 +++++++ + 4 files changed, 22 insertions(+) + +commit 357c2f46a77aebd8caac8ac0c6491b0db68351c7 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Dec 3 19:35:05 2010 +0200 + + gl: Add infrastructure for calling GL functions using a dispatch table + + Some GL functions can be called using different names depending on the + GL version and available extensions (ARB, EXT). The dispatch table + abstracts these differences and provides a uniform API for dealing with + these functions. + + src/Makefile.sources | 2 + + src/cairo-gl-dispatch-private.h | 99 +++++++++++++++++++++++++++ + src/cairo-gl-dispatch.c | 144 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 58 ++++++++++++++++ + 4 files changed, 303 insertions(+) + +commit cd7c0df2bb036fddca4b874f12171121ae740a50 +Author: Alexandros Frantzis <alexandros.frantzis@linaro.org> +Date: Fri Dec 3 18:48:20 2010 +0200 + + gl: Add functions to query GL version and extensions + + src/Makefile.sources | 1 + + src/cairo-gl-info.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-gl-private.h | 10 ++++++++ + 3 files changed, 81 insertions(+) + +commit 07abd21a033a429e337632557d4bc91ca230fe2e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Dec 15 15:28:49 2010 +0000 + + test/arc-infinite-loop: Random return value fun. + + test/arc-infinite-loop.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 65040d3e3f5e00bea8be0d33a200d8d62e11e053 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Dec 14 20:15:28 2010 +0100 + + test: Add bug-extents + + Add a test for the computation of approximate extents used by most + backends to esimate the region affected by drawing operations. + + Based on: + http://lists.cairographics.org/archives/cairo/2010-December/021331.html + + test/Makefile.am | 5 ++++ + test/Makefile.sources | 1 + + test/bug-extents.c | 59 +++++++++++++++++++++++++++++++++++++++ + test/bug-extents.image16.ref.png | Bin 0 -> 7576 bytes + test/bug-extents.ps.ref.png | Bin 0 -> 5844 bytes + test/bug-extents.quartz.ref.png | Bin 0 -> 9310 bytes + test/bug-extents.ref.png | Bin 0 -> 9162 bytes + test/bug-extents.xlib.ref.png | Bin 0 -> 9234 bytes + 8 files changed, 65 insertions(+) + +commit 4aabff8f6740e2027febd97c1863f7ba5a46cb92 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Dec 14 17:56:00 2010 +0100 + + path-bounder: Update current point after curve_to op + + Even if the curve_to is completely within the current extents box, the + current point needs to be updated because the shape of following ops + depends on the position of the current point. + + Fixes bug-extents. + + src/cairo-path-bounds.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5996652364efa4fb4ae6c984ddf6ddad8868782b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Dec 14 20:15:28 2010 +0100 + + test: Add bug-extents + + Add a test for the computation of approximate extents used by most + backends to esimate the region affected by drawing operations. + + Based on: + http://lists.cairographics.org/archives/cairo/2010-December/021331.html + + test/Makefile.am | 5 ++++ + test/Makefile.sources | 1 + + test/bug-extents.c | 59 +++++++++++++++++++++++++++++++++++++++ + test/bug-extents.image16.ref.png | Bin 0 -> 7576 bytes + test/bug-extents.ps.ref.png | Bin 0 -> 5844 bytes + test/bug-extents.quartz.ref.png | Bin 0 -> 9310 bytes + test/bug-extents.ref.png | Bin 0 -> 9162 bytes + test/bug-extents.xlib.ref.png | Bin 0 -> 9234 bytes + 8 files changed, 65 insertions(+) + +commit f10b3105d3e662616ce2ee928776cac73f536d94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 13 16:25:58 2010 +0000 + + scaled-font: assert that we hold the scaled-font mutex when looking up glyphs + + Holding the mutex over glyph lookup not only prevents multi-threaded + races between insertion and deletion that spell disaster for memory + integrity, but also implies that the glyph cache is frozen. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-scaled-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5eadc286d87fa5bdd6bd5583db52742da9acfc70 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Dec 10 11:21:26 2010 +0100 + + path: Silence warnings + + gcc complains that: + + cairo-path-fixed.c:400: warning: inlining failed in call to + '_cairo_path_fixed_drop_line_to': call is unlikely and code size + would grow + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c05135a3480a2d5c0e1d594ab0d111dac648fe4d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Dec 12 23:40:37 2010 +0100 + + test: Update ref images + + The recent (and not-so-recent) changes in gradient code changed the + results of some tests involving gradients. + + radial-gradient-* tests are marked XFAIL for pdf because poppler is + not sampling the color function with a sufficient frequency, but they + look correct in Adobe Reader. + + test/Makefile.am | 22 +++++++++++++++++++-- + test/clip-operator.pdf.argb32.ref.png | Bin 9437 -> 8792 bytes + test/clip-operator.pdf.rgb24.ref.png | Bin 5391 -> 4683 bytes + test/clip-operator.quartz.argb32.ref.png | Bin 9586 -> 14959 bytes + test/clip-operator.quartz.rgb24.ref.png | Bin 4104 -> 8835 bytes + test/huge-linear.pdf.ref.png | Bin 1577 -> 1586 bytes + test/huge-linear.quartz.ref.png | Bin 0 -> 15230 bytes + test/linear-gradient-large.quartz.ref.png | Bin 0 -> 4074 bytes + test/linear-gradient-large.ref.png | Bin 4079 -> 4076 bytes + test/linear-gradient-subset.quartz.ref.png | Bin 887 -> 994 bytes + test/linear-gradient.quartz.ref.png | Bin 1060 -> 1073 bytes + test/mask.quartz.argb32.ref.png | Bin 10575 -> 11136 bytes + test/operator-source.quartz.argb32.ref.png | Bin 4754 -> 5499 bytes + test/operator-source.quartz.rgb24.ref.png | Bin 3535 -> 4345 bytes + test/push-group-color.ps2.ref.png | Bin 0 -> 2863 bytes + test/radial-gradient-extend.ps3.ref.png | Bin 0 -> 458 bytes + ...adial-gradient-mask-source.pdf.argb32.xfail.png | Bin 0 -> 90399 bytes + ...radial-gradient-mask-source.pdf.rgb24.xfail.png | Bin 0 -> 103447 bytes + ...dial-gradient-mask-source.quartz.argb32.ref.png | Bin 0 -> 112421 bytes + ...adial-gradient-mask-source.quartz.rgb24.ref.png | Bin 0 -> 120173 bytes + test/radial-gradient-mask.pdf.argb32.xfail.png | Bin 0 -> 90399 bytes + test/radial-gradient-mask.pdf.rgb24.xfail.png | Bin 0 -> 103447 bytes + test/radial-gradient-mask.quartz.argb32.ref.png | Bin 0 -> 112421 bytes + test/radial-gradient-mask.quartz.rgb24.ref.png | Bin 0 -> 120173 bytes + test/radial-gradient-one-stop.ps3.argb32.ref.png | Bin 0 -> 1444 bytes + test/radial-gradient-one-stop.ps3.rgb24.ref.png | Bin 0 -> 1314 bytes + test/radial-gradient-source.pdf.argb32.ref.png | Bin 235290 -> 0 bytes + test/radial-gradient-source.pdf.argb32.xfail.png | Bin 0 -> 192993 bytes + test/radial-gradient-source.pdf.rgb24.xfail.png | Bin 0 -> 165642 bytes + test/radial-gradient-source.quartz.argb32.ref.png | Bin 0 -> 264308 bytes + test/radial-gradient-source.quartz.rgb24.ref.png | Bin 0 -> 180829 bytes + test/radial-gradient.pdf.ref.png | Bin 280944 -> 0 bytes + test/radial-gradient.pdf.xfail.png | Bin 0 -> 211493 bytes + test/radial-gradient.quartz.ref.png | Bin 0 -> 248130 bytes + test/smask-mask.quartz.ref.png | Bin 3357 -> 3191 bytes + test/smask-paint.quartz.ref.png | Bin 3499 -> 3311 bytes + test/smask.quartz.ref.png | Bin 4067 -> 4031 bytes + test/trap-clip.quartz.argb32.ref.png | Bin 6060 -> 6926 bytes + test/trap-clip.quartz.rgb24.ref.png | Bin 5694 -> 6503 bytes + 39 files changed, 20 insertions(+), 2 deletions(-) + +commit 3cbe82fe586f64dd11a0b2bc9f58619968965369 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Dec 12 22:29:56 2010 +0000 + + ps,pdf: Deal with empty domain gradients. + + If all the stops of the gradient have the same offset and the + pattern's extend mode is EXTEND_PAD, then we cannot use the stops' + domain as the interpolation parameter range because this would produce + a gradient with the same start and end objects. Such ranges tickle + bad behaviour in rasterisers. + + We replace the color function with an appropriate step function + defined on [0 1]. + + Fixes radial-gradient-one-stop for pdf and ps3. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pdf-surface.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-ps-surface.c | 50 ++++++++++++++++++++++++++++++++++++----- + 2 files changed, 104 insertions(+), 6 deletions(-) + +commit 36e58aea51c3de1e2621e083bb82add7f25ddfef +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 19 20:16:08 2010 +0100 + + ps: Unify gradient emitters and support all extend modes. + + To draw repeated gradients in ps, which only supports none and pad + extended gradients, we need an appropriate reparametrization of the + gradients that will cover the whole clip region without needing + repeats. + + This commit adds support for the drawing of reflect/repeat-extended + radial gradients through native ps patterns, using pad-extension and + no fallbacks. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-ps-surface.c | 256 +++++++++++++++++-------------------------------- + 1 file changed, 88 insertions(+), 168 deletions(-) + +commit 20ef062511e224ef098671c923a4cd4d461139c2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 19 20:16:16 2010 +0100 + + pdf: Unify gradient emitters and support all extend modes. + + To draw repeated gradients in pdf, which only supports none and pad + extended gradients, we need an appropriate reparametrization of the + gradients that will cover the whole clip region without needing + repeats. + + This commit adds support for the drawing of reflect/repeat-extended + radial gradients through native pdf patterns using pad-extension and + no fallbacks. + + This fixes https://bugs.freedesktop.org/show_bug.cgi?id=28870 + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pdf-surface.c | 414 +++++++++++++++--------------------------------- + 1 file changed, 132 insertions(+), 282 deletions(-) + +commit ca7f141dd7931041887dc96a542c2a47da25e12f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 17 22:07:09 2010 +0100 + + quartz: Unify gradient construction and fix radial gradients. + + Share code between linear and radial gradients, using + _cairo_gradient_pattern_box_to_parameter() instead of open coding the + parameter range computation. + + As a side effect this fixes parameter range computation for radial + gradients, because the previous code assumed that the focal point was + inside the circles. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-quartz-surface.c | 400 ++++++++------------------------------------- + 1 file changed, 68 insertions(+), 332 deletions(-) + +commit 341e5b3246f785a4791606ea62873cfb180efae6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 23 17:49:50 2010 +0100 + + pattern: Add a function to interpolate gradient objects. + + This will be a common function used by the quartz, ps, and pdf + backends when rewriting EXTEND_REFLECT/REPEAT gradients in terms + of EXTEND_PAD gradients. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pattern.c | 32 ++++++++++++++++++++++++++++++++ + src/cairo-types-private.h | 5 +++++ + src/cairoint.h | 5 +++++ + 3 files changed, 42 insertions(+) + +commit 08cb6db5206203fda919e3d258ce7fdbb3e3c9d8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 23 19:31:40 2010 +0100 + + pattern: Use pattern parameter range when analysing all gradients. + + This patch adds support for analysing the transparency of a + radial gradient within some area of interest. Before the code + would ignore the extents for radial gradients. Linear gradients + now use _cairo_linear_pattern_box_to_parameter() allowing us + to remove the superfluous _extents_to_linear_parameter(). + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pattern.c | 95 +++++++++++++++++++++++++---------------------------- + 1 file changed, 44 insertions(+), 51 deletions(-) + +commit 790837ac68e51bdd55f13b70d54ba32917cebb45 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 23 19:31:26 2010 +0100 + + pattern: Compute a covering parameter range of a gradient for a box. + + This makes it possible to compute the interpolation range needed to + correctly draw a gradient so that it covers an area of interest. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pattern.c | 463 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 7 + + 2 files changed, 470 insertions(+) + +commit d1e9bdf7f15fd2ba7d42c6fe18650618d29c4942 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Dec 4 14:58:52 2010 +0100 + + ps: Avoid unneeded fallbacks for gradients with opaque stops. + + _cairo_pattern_is_opaque() returns false for none-extended linear + gradients and for radial gradients, but fallback is only needed if + they have non-opaque stops. + This can be tested using _cairo_pattern_alpha_range(), which only + analyses the part of the pattern which is drawn. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-ps-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit ec4c085624d12cef51e583c18306fd4f4c2b6aaa +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 19 19:18:53 2010 +0100 + + ps, pdf, pattern: Implement _cairo_pattern_alpha_range to analyse patterns. + + Both the ps and pdf backends are open coding analyses of the + range of pattern alphas. This patch factors out a new function + _cairo_pattern_alpha_range() to do that for them. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pattern.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 18 ++++----------- + src/cairo-ps-surface.c | 12 ++++------ + src/cairoint.h | 4 ++++ + 4 files changed, 70 insertions(+), 22 deletions(-) + +commit 6579bf728f802e13b45292b11e3782db1844316f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Nov 18 13:53:51 2010 +0100 + + pattern: Improve extents computation of radial gradients. + + Use the tests for degeneracy and new radial gradient definition + when computing pattern extents. Degenerate gradients are optimised + away by cairo-gstate into solid or clear patterns, and + the radial gradients semantics have changed to match PDF semantics. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pattern.c | 50 ++++++++++++++++++++++++-------------------------- + 1 file changed, 24 insertions(+), 26 deletions(-) + +commit 86695aced9fc3210766abae7141c89b2c2c1a273 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 17 21:31:07 2010 +0100 + + pattern: Specialise signatures of pattern specific functions + + Change the signature of type-specific functions to make them only + accept the correct pattern type instead of the abstract cairo_pattern_t. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pattern.c | 32 ++++++++++++-------------------- + 1 file changed, 12 insertions(+), 20 deletions(-) + +commit ac9ed746b03e7c01c5997702d0694faa0938268d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 17 19:09:04 2010 +0100 + + ps: Use switch instead of multiple if's + + This ensures that the compiler is able to automatically point out any + unhandled pattern type. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-ps-surface.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit e6ab2e6821301301873ab329af53939807a004b3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 17 19:05:58 2010 +0100 + + pdf: Use switch instead of multiple if's + + This ensures that the compiler is able to automatically point out any + unhandled pattern type. + + Reviewed-by: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> + + src/cairo-pdf-surface.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 790d6140e79f979c8646ffee1304589db55ed3d1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Dec 13 09:37:02 2010 +0100 + + test: Update reference images list + + Some reference images were added or removed in + f85af7fe8d92f5ac304d742fcbfdaac512bace33, + e2dcbfd895463d674d55c826ba72030f5f6daa91 and + 670eb260eb2f0cbe897ce92d3a7ab4542fb17307, but Makefile.am was not + updated accordingly. + + test/Makefile.am | 37 ++++++++++++++++++++++--------------- + 1 file changed, 22 insertions(+), 15 deletions(-) + +commit 85a489f0f212d68c69dbe5807b379b874daef4d1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 22:00:15 2010 +0100 + + polygon: Merge _cairo_polygon_init and _cairo_polygon_limit + + _cairo_polygon_limit() had to be called immediately after + _cairo_polygon_init() (or never at all). + + Merging the two calls is a simple way to enforce this rule. + + src/cairo-bentley-ottmann.c | 3 +-- + src/cairo-clip.c | 3 +-- + src/cairo-gl-surface.c | 6 ++---- + src/cairo-image-surface.c | 6 ++---- + src/cairo-path-fill.c | 16 ++++++---------- + src/cairo-path-stroke.c | 4 +--- + src/cairo-polygon.c | 17 ++++++----------- + src/cairo-surface-fallback.c | 6 ++---- + src/cairo-xcb-surface-render.c | 6 ++---- + src/cairoint.h | 9 +++------ + src/drm/cairo-drm-i915-surface.c | 6 ++---- + src/drm/cairo-drm-i965-surface.c | 6 ++---- + 12 files changed, 30 insertions(+), 58 deletions(-) + +commit 75f34b595aead729b6f6a7017c8790d68dfa0326 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 22:00:10 2010 +0100 + + fill: Simplify path to polygon conversion + + Using _cairo_path_fixed_interpret_flat() greatly simplifies the path + to polygon conversion (because it already converts curve_to's to + line_to's). + + This commit also removes the optimization which merges two consecutive + lines if they have the same slope, because it's unlikely (since it + should already happen during path construction), it doesn't provide + better performance (at least not measurable with the currently + available cairo-traces) and bloats the code. + + src/cairo-path-fill.c | 91 +++++++++++++++++++++-------------------------- + src/cairo-polygon.c | 88 --------------------------------------------- + src/cairo-types-private.h | 7 ---- + src/cairoint.h | 11 ------ + 4 files changed, 41 insertions(+), 156 deletions(-) + +commit df453b7aca5ad7c4b796f150c8a90e78c1b96e04 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 22:00:06 2010 +0100 + + path: Remove support for inverse direction interpretation + + The previous commit guarantees that paths are always interpreted in + the forward direction, so the code allowing both directions is not + needed anymore. + + src/cairo-path-fixed.c | 45 +++++++++++---------------------------------- + 1 file changed, 11 insertions(+), 34 deletions(-) + +commit a8ae8759f51a283fc1d65b055eda8e401d9ccf2e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 22:00:01 2010 +0100 + + path: Always interpret in forward direction + + Path are always interpreted in forward direction, so the ability of + interpreting in the opposite direction (which is very unlikely to be + useful at all) can be removed. + + src/cairo-debug.c | 1 - + src/cairo-path-bounds.c | 2 +- + src/cairo-path-fill.c | 1 - + src/cairo-path-fixed-private.h | 1 - + src/cairo-path-fixed.c | 11 ++++------- + src/cairo-path-in-fill.c | 1 - + src/cairo-path-stroke.c | 4 ---- + src/cairo-path.c | 4 ---- + src/cairo-pdf-operators.c | 1 - + src/cairo-qt-surface.cpp | 1 - + src/cairo-quartz-surface.c | 1 - + src/cairo-recording-surface.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-script-surface.c | 1 - + src/cairo-skia-surface.cpp | 1 - + src/cairo-svg-surface.c | 1 - + src/cairo-type1-fallback.c | 1 - + src/cairo-vg-surface.c | 1 - + src/cairo-win32-printing-surface.c | 1 - + src/cairo-xml-surface.c | 1 - + src/cairoint.h | 2 -- + 21 files changed, 7 insertions(+), 34 deletions(-) + +commit 83605de9958696d47b15baa2c95731bc076ff368 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 21:59:43 2010 +0100 + + path: Cleanup unused current_point + + The code keeps track of the current point but doesn't use it. + + Remove it to clean up. + + src/cairo-path.c | 18 ------------------ + 1 file changed, 18 deletions(-) + +commit f317a31b3fd14949edaca70f896c8a3cdecfce18 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 23 23:36:14 2010 +0100 + + surface: Remove _cairo_surface_*_extents + + They have been replaced by cairo_composite_rect_t functions. + + src/cairo-surface.c | 162 ---------------------------------------------------- + src/cairoint.h | 49 ---------------- + 2 files changed, 211 deletions(-) + +commit 0ae9b547415a71126848f61f76f895d38584435c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 23 23:58:09 2010 +0100 + + pdf: Use composite rectangles in fill_stroke + + All other pdf drawing functions have been updated to use + cairo_composite_rectangles_t to compute the extents affected by the + operation in 3a5d71c431dfb251308c3e4e02d2ea4acec90a91, but fill_stroke + was not changed. + + This removes the last usage of the old _cairo_surface_*_extents() + functions. + + src/cairo-pdf-surface.c | 63 ++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 47 insertions(+), 16 deletions(-) + +commit 71e6520fa6a695710482eafd022f9e44c45c0610 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 15 21:08:06 2010 +0100 + + surface: Remove _cairo_surface_fill_rectangle + + It is not used anymore. + + src/cairo-surface.c | 39 --------------------------------------- + src/cairoint.h | 9 --------- + 2 files changed, 48 deletions(-) + +commit 17fef8c437483ca082226b41e1850eb383f0251a +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Dec 1 16:16:00 2010 +0100 + + test: Add arc-infinite-loop + + The handling of angles above 2pi in cairo_arc is not very solid and is + basically untested. + + This test should ensure that huge inputs don't hang cairo. + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/arc-infinite-loop.c | 59 +++++++++++++++++++++++++++++++++++++++++ + test/arc-infinite-loop.ref.png | Bin 0 -> 96 bytes + 4 files changed, 61 insertions(+) + +commit 670eb260eb2f0cbe897ce92d3a7ab4542fb17307 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Dec 1 16:13:33 2010 +0100 + + test: Add arc-looping-dash + + The handling of angles above 2pi in cairo_arc is not very solid and is + basically untested. + + This test should ensure that changes in the behavior will be noticed + by the testsuite. + + test/Makefile.am | 3 ++ + test/Makefile.sources | 1 + + test/arc-looping-dash.c | 77 ++++++++++++++++++++++++++++++++++ + test/arc-looping-dash.image16.ref.png | Bin 0 -> 450 bytes + test/arc-looping-dash.ps.ref.png | Bin 0 -> 377 bytes + test/arc-looping-dash.quartz.ref.png | Bin 0 -> 470 bytes + test/arc-looping-dash.ref.png | Bin 0 -> 464 bytes + 7 files changed, 81 insertions(+) + +commit 1784fd403e3dce357f018639730dd75e138904b5 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 14:38:40 2010 +0100 + + arc: Clamp to 65536 full circles + + To limit the amount of memory used for arcs describing a circle + wrapped multiple times we ignore the circles after the 65536th (but + preserve the same start and end angle mod 2pi). + + src/cairo-arc.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 4314a86aa7813bcd4131827181ecf44994142a72 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Dec 9 14:38:10 2010 +0100 + + arc: Avoid infinite loop + + Adding/subtracting 2 * M_PI to a huge floating point number doesn't + change it (because of rounding) and for smaller numbers it still + requires a lot of cycles before the angle is in the desired range. + + The same computation can be performed using fmod, which should provide + more accurate results and only requires O(1) time. + + src/cairo.c | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +commit 028797a729ca74b4ce2d1062fc8c90c111bf2870 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Dec 6 18:04:10 2010 +0100 + + test: Handle crashed tests + + Crashed tests are reported as "CRASH!" in cairo-test-suite.log + + test/testtable.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d3accefd3b9a4db5f07fb1f7bb05fb4238bf36c1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Dec 4 23:58:48 2010 +1030 + + PDF: Output a stencil mask for cairo_mask() with solid source and A1 mask + + In https://bugs.launchpad.net/ubuntu/+source/libcairo/+bug/680628 a + 65K PDF printed to PDF using poppler-cairo turns into an 8MB PDF. The + original PDF contains a very large number of stencil mask images (an + A1 image used as a mask for the current color). The PDF surface was + not optimized for this particular case. It was drawing a solid color + in a group and then using an smask with the image in another group. + + Fix this by checking for source = solid and mask = A1 image and + emitting a stencil mask image. + + src/cairo-pdf-surface-private.h | 1 + + src/cairo-pdf-surface.c | 160 +++++++++++++++++++++++++++++++++++----- + 2 files changed, 144 insertions(+), 17 deletions(-) + +commit f832ff7f22499bfa8e907f9fb059d56857d11e68 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Nov 28 16:58:20 2010 +0100 + + test: Fix ref images + + The corners of the boxes in these ref images were not correct. + + test/clip-stroke.image16.ref.png | Bin 1308 -> 1305 bytes + test/clip-stroke.ref.png | Bin 1442 -> 1447 bytes + test/clipped-group.image16.ref.png | Bin 281 -> 270 bytes + test/clipped-group.ref.png | Bin 289 -> 289 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit ff35af3fd73e59ea29b1a322c833f7dd24b0b8bc +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Nov 28 14:32:51 2010 +0100 + + image: Fix compositing of unaligned boxes + + The input of _fill_unaligned_boxes is (supposed to be) composed only + of disjoint rectangles, that can safely be passed to the rectilinear + span converter, but this function artificially introduces intersecting + rectangles when drawing non-aligned boxes. + + Using non-intersecting rectangles is easy and makes the code correct. + + Fixes rectilinear-grid. + + Reviewed-by: Uli Schlachter <psychon@znc.in> + + src/cairo-image-surface.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 7b29f1d5d85ebb7e92e9759692233c80a4687a07 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 26 17:55:35 2010 +0100 + + test: Add rectilinear-grid + + The rectilinear scan converter assumes disjoint rects as input, but + cairo-image passes intersecting rectangles to it. + + This test shows that image and any backends passing through it for the + rasterization (fallbacks, vector backends whose renderer is + cairo-based) fail in compute the corners of intersecting rectangles + correctly. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/rectilinear-grid.c | 78 ++++++++++++++++++++++++++++++++++ + test/rectilinear-grid.image16.ref.png | Bin 0 -> 638 bytes + test/rectilinear-grid.ref.png | Bin 0 -> 569 bytes + 5 files changed, 81 insertions(+) + +commit 6732dbf2992891be4b1f08b14a5c449fd08b637c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 30 21:55:50 2010 +1030 + + CFF Subsetting: Subset subroutines + + Go through each Charstring looking for the local and global + subroutines called. To avoid modifying the Charstrings [1], the unused + subroutines are reduced to a single byte return op [2] leaving the + remaining subroutines in their original array index position. + + Results of testing with some CFF fonts with a 26 glyph [a-z] subset: + + Font Subset size: Before After + ------------------------------------------------------- + LinBiolinum_Re-0.6.4.otf 48,423 8,295 + LinBiolinum_It-0.5.1.otf 88,942 11,501 + LinBiolinum_Sl-0.4.9.otf 89,231 11,505 + LinLibertine_Re-4.7.5.otf 51,125 8,654 + LinLibetine_It-4.2.6.otf 59,333 9,632 + Inconsolata.otf 13,826 8,407 + + [1] Further reductions could be obtained by stripping out unused + subroutines and renumbering the remaining subroutines but is more + complicated due to the encoding used for subroutine numbers that is + both variable length and a function of the size of the subroutine + array. + + [2] Poppler and Fontforge do not seem to like zero length unused + subroutines. + + src/cairo-cff-subset.c | 345 ++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 329 insertions(+), 16 deletions(-) + +commit 4e60a164d42d80474d897d7e58c41fb3941bd8e2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Nov 28 16:58:20 2010 +0100 + + test: Fix ref images + + The corners of the boxes in these ref images were not correct. + + test/clip-stroke.image16.ref.png | Bin 1308 -> 1305 bytes + test/clip-stroke.ref.png | Bin 1442 -> 1447 bytes + test/clipped-group.image16.ref.png | Bin 281 -> 270 bytes + test/clipped-group.ref.png | Bin 289 -> 289 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 8d7486a6ea3eff4976dacd2629d07ed5b143af23 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Nov 28 14:33:41 2010 +0100 + + image: Fix _pixel_to_solid + + An A1 image with full alpha should be opaque black, not opaque white. + + Use specialized solid black image instead of the generic constructor + for an A8 image with full alpha (it is likely to be cached). + + src/cairo-image-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 72b0a44a1f77c818921a699c55d4b2df0c1d1536 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Nov 28 14:32:51 2010 +0100 + + image: Fix compositing of unaligned boxes + + The input of _fill_unaligned_boxes is (supposed to be) composed only + of disjoint rectangles, that can safely be passed to the rectilinear + span converter, but this function artificially introduces intersecting + rectangles when drawing non-aligned boxes. + + Using non-intersecting rectangles is easy and makes the code correct. + + Fixes rectilinear-grid. + + Reviewed-by: Uli Schlachter <psychon@znc.in> + + src/cairo-image-surface.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 10389730832998567c3abad893c3a1274d71baa7 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 26 17:55:35 2010 +0100 + + test: Add rectilinear-grid + + The rectilinear scan converter assumes disjoint rects as input, but + cairo-image passes intersecting rectangles to it. + + This test shows that image and any backends passing through it for the + rasterization (fallbacks, vector backends whose renderer is + cairo-based) fail in compute the corners of intersecting rectangles + correctly. + + test/Makefile.am | 2 + + test/Makefile.sources | 1 + + test/rectilinear-grid.c | 78 ++++++++++++++++++++++++++++++++++ + test/rectilinear-grid.image16.ref.png | Bin 0 -> 638 bytes + test/rectilinear-grid.ref.png | Bin 0 -> 569 bytes + 5 files changed, 81 insertions(+) + +commit cfafa3924b983a38056893b5fd8e836574deee17 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Nov 28 09:31:02 2010 +0100 + + array: Fix comment + + The comment was talking about using 0 as index, but was using + "num_elements" instead. + + src/cairo-array.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f238da5291cdb347daa0be64ecc393fc519c4ead +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 28 11:45:00 2010 +1030 + + CFF subset: fix bug with euro glyph in fallback fonts + + src/cairo-cff-subset.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 7feefc75f6dcb9381cd5bc1bdc3e2d722789b155 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 28 03:46:10 2010 +1030 + + CFF subset: fix subsetting of Euro glyph + + https://bugs.freedesktop.org/show_bug.cgi?id=31878 + + src/cairo-cff-subset.c | 51 +++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 38 insertions(+), 13 deletions(-) + +commit f85af7fe8d92f5ac304d742fcbfdaac512bace33 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 21 23:41:33 2010 +1030 + + Change fallback resolution test to use resolutions in multiples of 72 + + With integer aligned clipping the test output has no seams. + + test/fallback-resolution.c | 26 ++++++++---------------- + test/fallback-resolution.ppi144x144.ps.ref.png | Bin 0 -> 5911 bytes + test/fallback-resolution.ppi144x144.ref.png | Bin 0 -> 8697 bytes + test/fallback-resolution.ppi144x72.ps.ref.png | Bin 0 -> 7206 bytes + test/fallback-resolution.ppi144x72.ref.png | Bin 0 -> 8445 bytes + test/fallback-resolution.ppi150x150.ref.png | Bin 8058 -> 0 bytes + test/fallback-resolution.ppi150x72.ref.png | Bin 8303 -> 0 bytes + test/fallback-resolution.ppi288x288.pdf.ref.png | Bin 0 -> 8681 bytes + test/fallback-resolution.ppi288x288.ps.ref.png | Bin 0 -> 4450 bytes + test/fallback-resolution.ppi288x288.svg.ref.png | Bin 0 -> 5771 bytes + test/fallback-resolution.ppi288x72.ps.ref.png | Bin 0 -> 6444 bytes + test/fallback-resolution.ppi288x72.ref.png | Bin 0 -> 7166 bytes + test/fallback-resolution.ppi300x300.ref.png | Bin 5639 -> 0 bytes + test/fallback-resolution.ppi300x72.ref.png | Bin 7014 -> 0 bytes + test/fallback-resolution.ppi37.5x37.5.ref.png | Bin 14092 -> 0 bytes + test/fallback-resolution.ppi37.5x72.ref.png | Bin 12906 -> 0 bytes + test/fallback-resolution.ppi576x576.pdf.ref.png | Bin 0 -> 8732 bytes + test/fallback-resolution.ppi576x576.ps.ref.png | Bin 0 -> 3448 bytes + test/fallback-resolution.ppi576x576.svg.ref.png | Bin 0 -> 4317 bytes + test/fallback-resolution.ppi576x72.ps.ref.png | Bin 0 -> 5992 bytes + test/fallback-resolution.ppi576x72.ref.png | Bin 0 -> 6432 bytes + test/fallback-resolution.ppi600x600.ref.png | Bin 4090 -> 0 bytes + test/fallback-resolution.ppi600x72.ref.png | Bin 6326 -> 0 bytes + test/fallback-resolution.ppi72x144.ps.ref.png | Bin 0 -> 7270 bytes + test/fallback-resolution.ppi72x144.ref.png | Bin 0 -> 8677 bytes + test/fallback-resolution.ppi72x150.ref.png | Bin 8061 -> 0 bytes + test/fallback-resolution.ppi72x288.ps.ref.png | Bin 0 -> 6616 bytes + test/fallback-resolution.ppi72x288.ref.png | Bin 0 -> 7231 bytes + test/fallback-resolution.ppi72x300.ref.png | Bin 6911 -> 0 bytes + test/fallback-resolution.ppi72x37.5.ref.png | Bin 13167 -> 0 bytes + test/fallback-resolution.ppi72x576.ps.ref.png | Bin 0 -> 6349 bytes + test/fallback-resolution.ppi72x576.ref.png | Bin 0 -> 6523 bytes + test/fallback-resolution.ppi72x600.ref.png | Bin 6214 -> 0 bytes + test/fallback-resolution.ppi72x72.ref.png | Bin 8416 -> 8510 bytes + test/fallback-resolution.ppi72x75.ref.png | Bin 10620 -> 0 bytes + test/fallback-resolution.ppi75x72.ref.png | Bin 10119 -> 0 bytes + test/fallback-resolution.ppi75x75.ref.png | Bin 12127 -> 0 bytes + 37 files changed, 9 insertions(+), 17 deletions(-) + +commit 126108a6ac5aa5e615071e0cbd1901e5a5de3ca6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 24 21:43:07 2010 +1030 + + Boilerplate: Set fallback resolution using force_fallbacks function + + cairo_set_fallback_resolution() does not work when testing rgb24 surfaces + + boilerplate/cairo-boilerplate-pdf.c | 6 +++++- + boilerplate/cairo-boilerplate-ps.c | 6 +++++- + boilerplate/cairo-boilerplate-svg.c | 6 +++++- + boilerplate/cairo-boilerplate.h | 3 ++- + test/fallback-resolution.c | 4 +--- + 5 files changed, 18 insertions(+), 7 deletions(-) + +commit 59661f8af428b88125db033867d662e9393d0a41 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 21 23:25:21 2010 +1030 + + Fix fallback-resolution test + + The recording surface source image painted onto fallback images always + had the resolution 72ppi instead of the fallback resolution of the + target surface. Fix this by passing adding a new + acquire_source_image_transformed backend function for the recording + surface to use and passing the target device transform through to the + recording surface when the image is acquired. + + Based on Carl Worth's experimental acquired_source_image_transformed + branch. + + https://bugs.freedesktop.org/show_bug.cgi?id=24692 + + src/cairo-image-surface.c | 57 +++++++++++++++++++++++++++++++------------ + src/cairo-recording-surface.c | 32 +++++++++++++++++++----- + src/cairo-surface.c | 27 ++++++++++++++++++++ + src/cairoint.h | 12 +++++++++ + 4 files changed, 106 insertions(+), 22 deletions(-) + +commit 063a3894d7ed98ba36f416a285acc88c50d3bb34 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 26 13:46:31 2010 +0100 + + pdf: Silence compiler warnings + + The compiler complains about a const pointer being free'd and memcpy'd + to: + + cairo-pdf-surface.c: In function ‘_cairo_pdf_surface_add_source_surface’: + cairo-pdf-surface.c:1208: warning: passing argument 1 of ‘__builtin___memcpy_chk’ discards qualifiers from pointer target type + cairo-pdf-surface.c:1208: warning: passing argument 1 of ‘__inline_memcpy_chk’ discards qualifiers from pointer target type + cairo-pdf-surface.c: In function ‘_cairo_pdf_source_surface_entry_pluck’: + cairo-pdf-surface.c:1666: warning: passing argument 1 of ‘free’ discards qualifiers from pointer target type + + src/cairo-pdf-surface-private.h | 2 +- + src/cairo-pdf-surface.c | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 1ab64965786208b94ed40aa5f7f9be59d58fbf96 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Nov 26 13:13:16 2010 +0100 + + array: Silence warnings + + 493aaf0f15bfedc88371ffab07d862a400b0da38 made all cairo_array + functions use unsigned int for indexes and sizes. + + This commit fixes the compiler warnings about those values being + compared to signed int's. + + src/cairo-cff-subset.c | 2 +- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-type1-fallback.c | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 9ec51baa779a30041ea944643d4d0b8333bb759b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Nov 26 21:41:17 2010 +1030 + + PDF: Add missing clipper_reset + (cherry picked from commit 2ae2be36d4551906fd4edbc8bf07aaa7fe0c93cf) + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 47b81b9fea50328bd089db4e5ef8dcb1b181515b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Nov 26 21:51:25 2010 +1030 + + Truetype subset: add missing unicode ranges to cmap + + A couple of unicode ranges were missing from the cmap generated for latin fonts. + + https://bugs.freedesktop.org/show_bug.cgi?id=31878 + + src/cairo-truetype-subset.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2ae2be36d4551906fd4edbc8bf07aaa7fe0c93cf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Nov 26 21:41:17 2010 +1030 + + PDF: Add missing clipper_reset + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 841a2df7359e2b491aed7ed8c043cce669357ae3 +Author: Markus Stange <mstange@themasta.com> +Date: Fri Nov 5 09:23:44 2010 +0100 + + Fix type of _cairo_memory_stream_destroy parameter + + In 9b9952ab4f64a476bbadfd3e6cf1e66c1137ccd7 + _cairo_memory_stream_destroy was changed to take an unsigned long + instead of unsigned int, and the two callsites in cairo-gl-shaders.c + weren't updated. + + src/cairo-gl-shaders.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b6a97499c71af60a3f15d131d51eb53fb21b48ff +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 5 10:36:38 2010 +0200 + + xcb: Do not return value in void function + + Sun Studio Compiler complains: + "cairo-xcb-surface.c", line 585: void function cannot return value + even if the returned value is void. + Some minor code restructuring removes the issue. + + src/cairo-xcb-surface.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit e71588c80d5c6112fa9f7c6ea369d90f9284199f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 24 16:40:53 2010 +0200 + + test: Add romedalen images copyright information + + romedalen.png and romedalen.jpg have been bundled into the test + suite without an explicit copyright notice. + + test/COPYING | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 2b3d8de11a536d668084ea6d2bf295da1d1cdc11 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 16 22:51:28 2010 +0200 + + Fix degenerate arcs + + Make sure that degenerate arcs become a move_to-line_to sequence + instead of just a move_to. + + Fixes get-path-extents. + + src/cairo-arc.c | 4 ++++ + src/cairo.c | 1 + + 2 files changed, 5 insertions(+) + +commit fafca7ace250e3f4f9c60584f0ddff187c690068 +Author: Joerg Sonnenberger <joerg@NetBSD.org> +Date: Tue Oct 12 22:07:37 2010 +0200 + + LD_PRELOAD is supported on DragonFly. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c20d55eb1c1eb1c6f51a21c7eb205ba4c2c125e8 +Author: Erik Zeek <zeekec@mad.scientist.com> +Date: Thu Nov 4 17:57:03 2010 +0100 + + Fix build on gentoo + + The problem is probably caused by a change in the behavior of autoconf + (2.67). + + See http://bugs.gentoo.org/336329 + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8ef5161da307361e20dad68df74512c5afcbb012 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Nov 6 15:46:48 2010 +0100 + + configure: Correct reporting of tee backend + + Since 9f33f8453b4949cfdc63169d3acd7238f89379c2 tee is not compiled in + anymore by default. Reporting it as always enabled is misleading. + + build/configure.ac.features | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2a1e7e18de7c071bb7c445ae3e6c94b8f2a1590b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 26 09:46:57 2010 +0000 + + wgl: Use CreateWindowA with an ASCII string + + ... or else compilation with fail on Windows if UNICODE is defined + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-wgl-context.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 493aaf0f15bfedc88371ffab07d862a400b0da38 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 24 12:08:03 2010 +0100 + + array: Cleanup types + + Const-ify where appropriate and make all index and element counts + unsigned int. + + This is needed to enable accessing const cairo_array_t's without + having to manually remove the const qualifier (which happens in the + to-be-merged mesh pattern code, for example). + + src/cairo-array.c | 19 +++++++++++-------- + src/cairoint.h | 18 +++++++++--------- + 2 files changed, 20 insertions(+), 17 deletions(-) + +commit 9960f299ac3476d6d4c0d25d95a5891f6eab15dd +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 24 12:07:51 2010 +0100 + + array: Add read-only accessor + + It is sometimes useful to read the elements of a const cairo_array_t, + but it is currently only possible by ignoring the const qualifier. + The _cairo_array_index_const function allows read-only access to the + array elements. + + This is needed to enable accessing const cairo_array_t's without + having to manually remove the const qualifier (which happens in the + to-be-merged mesh pattern code, for example). + + src/cairo-array.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- + src/cairoint.h | 3 +++ + 2 files changed, 49 insertions(+), 5 deletions(-) + +commit ae6a0de23b11e1cf34a2751fd6d4339b20340e67 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Nov 24 11:16:56 2010 +0100 + + array: Remove snapshot support + + Array snapshots are not used anymore and just bloat the implementation + of cairo_array_t. + + In particular, double indirection was needed to implement array + snapshots, as explained in c78685399307431903613733ddc936a104376943. + + src/cairo-array.c | 57 +++++------------------------------------------ + src/cairo-types-private.h | 4 +--- + src/cairoint.h | 4 ---- + 3 files changed, 6 insertions(+), 59 deletions(-) + +commit a6b503961b7ffd6a0725ad7d98ec1c46e2f15f25 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 22 23:41:33 2010 +0100 + + ps: Fix painting + + Painting of some pattern was broken because the paint operation was + implemented as a fill to a rect containing the clip, but this rect was + not transformed as appropriate (using the cairo_to_ps matrix). + PDF simply fills the whole surface rect, so we implement the same + behavior in PS. + + Fixes clip-group-shapes-circles, clip-stroke, linear-gradient-extend, + linear-gradient-one-stop, radial-gradient-one-stop. + + src/cairo-ps-surface.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 520206e99122f8b5c0440640afc1b35e14030a80 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Oct 31 18:26:59 2010 +0100 + + xcb: Handle deferred_clear in _copy_to_picture + + This ensures that surfaces with the deferred_clear flag on are cleared + before being used as sources. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 56528d7b9dd1dcd74cd1806f8b22d2d8189f0a03 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 22 23:41:33 2010 +0100 + + ps: Fix painting + + Painting of some pattern was broken because the paint operation was + implemented as a fill to a rect containing the clip, but this rect was + not transformed as appropriate (using the cairo_to_ps matrix). + PDF simply fills the whole surface rect, so we implement the same + behavior in PS. + + Fixes clip-group-shapes-circles, clip-stroke, linear-gradient-extend, + linear-gradient-one-stop, radial-gradient-one-stop. + + src/cairo-ps-surface.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit e2c9964c3e1bbf253b20f3e7b747eeedcb3f56e6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Nov 23 13:24:25 2010 +0100 + + quartz-font: Implement new load_truetype_table semantics + + fb0304e2a9c99fa00e68bf4b37074a6885f19cff changed and specified the + behavior of load_truetype_table. + This commit makes quartz-font implement the new behavior. + + src/cairo-quartz-font.c | 23 ++++++++++------------- + 1 file changed, 10 insertions(+), 13 deletions(-) + +commit 8db239660fab35970784bfa3bd7e7ba0cdaf46d4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 23 23:26:49 2010 +1030 + + Check is_synthetic() font backend exists before calling it + + src/cairo-cff-subset.c | 2 +- + src/cairo-truetype-subset.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 12b1cbb07e5e23dac9f84793924080171deda37f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 23 23:20:25 2010 +1030 + + Fix xml-surface use of load_truetype_font + + src/cairo-xml-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2dcbfd895463d674d55c826ba72030f5f6daa91 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 23 00:12:10 2010 +1030 + + Automate error checking for ps-eps test + + test/Makefile.am | 1 - + test/ps-eps.c | 338 +++++++++++++++++++++++++++++++++++++++++++++++----- + test/ps-eps.ref.eps | 84 ------------- + test/ps-eps.ref.png | Bin 0 -> 4584 bytes + 4 files changed, 311 insertions(+), 112 deletions(-) + +commit 67a90e8035d1d7abef45c552e75348f993a3bc93 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 23 22:02:55 2010 +1030 + + Check table size in cairo_truetype_get_style() + + src/cairo-truetype-subset.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit fb0304e2a9c99fa00e68bf4b37074a6885f19cff +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 23 21:44:31 2010 +1030 + + Document load_truetype_table function and ensure ft-font and Win32-font are compliant + + There were some difference between how the FT and Win32 + load_truetype_table font backend functions worked due to the + difference between FT_Load_Sfnt_Table() and GetFontData(). eg FT + returns an error if less than the requested number of bytes could be + read while Win32 returns success and sets the length to the number of + bytes read. + + src/cairo-ft-font.c | 15 ++++++++++++--- + src/cairo-win32-font.c | 7 +++++-- + src/cairoint.h | 18 ++++++++++++++++++ + 3 files changed, 35 insertions(+), 5 deletions(-) + +commit abff335348c4f3b1c694cf44bf089d2a437937b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 22 18:49:22 2010 +0000 + + pdf: Silence compiler for an impossible case + + Make the default case be an assert to catch a silly programming error + and silence the compiler: + + cairo-pdf-operators.c: In function ‘_word_wrap_stream_write’: + cairo-pdf-operators.c:300: warning: ‘count’ may be used uninitialized in + this function + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-pdf-operators.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1effa1e8230e16c59ce5f42692095f7fb6622c99 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 23 00:13:56 2010 +1030 + + win32: add synthetic font subsetting support + + src/cairo-scaled-font-subsets-private.h | 23 +++++++++++++++++++++++ + src/cairo-truetype-subset-private.h | 13 +++++++++++++ + src/cairo-truetype-subset.c | 32 ++++++++++++++++++++++++++++++++ + src/cairo-win32-font.c | 27 +++++++++++++++++++++++++++ + 4 files changed, 95 insertions(+) + +commit 7f0029c31e15dfd34f57bdeca18f27e9e7b8f9aa +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Nov 22 22:46:54 2010 +1030 + + Use fallback font for synthetic fonts + + If the font has been synthesized we can't use the native subsetters as + the outlines won't be the same. Instead force the use of the fallback + subsetters so the synthesized outlines will used to generate the font. + + src/cairo-cff-subset.c | 4 ++++ + src/cairo-ft-font.c | 14 +++++++++++++- + src/cairo-truetype-subset.c | 4 ++++ + src/cairo-type1-subset.c | 5 +++++ + src/cairoint.h | 3 +++ + 5 files changed, 29 insertions(+), 1 deletion(-) + +commit 9862c38fc71c6dcd444da3b079e5404cd14594c3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 2 22:39:57 2010 +1030 + + Add unique_id mime type + + to ensure surfaces with the same unique_id mime type are not embedded + more than once in PDF files. + + src/cairo-pdf-surface-private.h | 2 ++ + src/cairo-pdf-surface.c | 38 ++++++++++++++++++++++++++++++++++++-- + src/cairo-surface.c | 8 ++++++++ + src/cairo.h | 1 + + 4 files changed, 47 insertions(+), 2 deletions(-) + +commit b8347e33539402ef64d652bc0f67522e4d02d51c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 21 00:37:29 2010 +1030 + + PS: Fix regression - incorrect EPS bounding box + + https://bugs.freedesktop.org/show_bug.cgi?id=24688 + (cherry picked from commit bb4055dac6a937b3412170a332b5effe4bbeff7d) + + src/cairo-analysis-surface.c | 40 ++++++++++------------------------------ + 1 file changed, 10 insertions(+), 30 deletions(-) + +commit cfff4f30a0eaa29b817cb32616c2da5a27921332 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 20 23:54:00 2010 +1030 + + PS: Fix regression - missing page content in EPS output + + https://bugs.freedesktop.org/show_bug.cgi?id=24688 + (cherry picked from commit d3746448d78fcedf8f8f9a7d0fca47f1bd6a5b67) + + src/cairo-ps-surface.c | 9 --------- + 1 file changed, 9 deletions(-) + +commit ed87ddddb3994f126e0f2d18fa23da6bc5ed579e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 20 00:50:04 2010 +1030 + + PS/PDF: Fix regression when changing page size to a larger size + + https://bugs.freedesktop.org/show_bug.cgi?id=24691 + (cherry picked from commit e7c5f470436220668e50201d775a9fec47162a67) + + src/cairo-paginated-surface.c | 28 ++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 10 ++++++++-- + src/cairo-ps-surface.c | 6 ++++++ + 3 files changed, 42 insertions(+), 2 deletions(-) + +commit ccff76433e1cd068e5534d0ab633c27b0faf47d2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 10 20:09:53 2010 +1030 + + PDF: Restrict ActualText to PDF version >= 1.5 + + The use of ActualText in a marked content sequence is a PDF 1.5 + feature. + + A 'use_actual_text' flag linked to the PDF version has already been + implemented in pdf-operators but for some reason this flag had not + been used to control the use of ActualText. + (cherry picked from commit 3afd7cd031ab9097e37c3e89d86ec41d015fdeb8) + + src/cairo-pdf-operators.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +commit e0967ff83c24aaf6d6b3a93a627872820be9012b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 6 21:15:30 2010 +1030 + + Fix type1-fallback bbox + (cherry picked from commit 74873c82242e9c124b69e05d0f8abdf78983d62d) + + src/cairo-type1-fallback.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 1413a44f64982e5196ca338c7cee5dfe19cd4b40 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 6 18:44:54 2010 +1030 + + configure.ac.features: s/Meta/Recording/ + (cherry picked from commit 8f2f5e5ad4f8e5f18da903865bb2d2afce3a544e) + + build/configure.ac.features | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3445401ae6bc8687fc76f690016cc281c388005d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 21 20:09:13 2010 +1030 + + Fix regression in fallback-resolution test + + a2254e56 caused the fallback-resolution test to display empty fallback + images for to push_group/pop_group part of the test. + + src/cairo-surface-wrapper.c | 12 ------------ + 1 file changed, 12 deletions(-) + +commit bb4055dac6a937b3412170a332b5effe4bbeff7d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 21 00:37:29 2010 +1030 + + PS: Fix regression - incorrect EPS bounding box + + https://bugs.freedesktop.org/show_bug.cgi?id=24688 + + src/cairo-analysis-surface.c | 40 ++++++++++------------------------------ + 1 file changed, 10 insertions(+), 30 deletions(-) + +commit d3746448d78fcedf8f8f9a7d0fca47f1bd6a5b67 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 20 23:54:00 2010 +1030 + + PS: Fix regression - missing page content in EPS output + + https://bugs.freedesktop.org/show_bug.cgi?id=24688 + + src/cairo-ps-surface.c | 9 --------- + 1 file changed, 9 deletions(-) + +commit e7c5f470436220668e50201d775a9fec47162a67 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 20 00:50:04 2010 +1030 + + PS/PDF: Fix regression when changing page size to a larger size + + https://bugs.freedesktop.org/show_bug.cgi?id=24691 + + src/cairo-paginated-surface.c | 28 ++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 10 ++++++++-- + src/cairo-ps-surface.c | 6 ++++++ + 3 files changed, 42 insertions(+), 2 deletions(-) + +commit 6e3e329170ab4b96bc0d587c8071e869e228e758 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 18 23:07:45 2010 +1030 + + win32: fix font_face hashing + + some bugs were discovered while testing with firefox + + src/cairo-win32-font.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 268cb0a2bb5c8eef00c88ed6e3044a00e85ea47e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Nov 17 13:30:28 2010 -0500 + + Add note re gtk-doc.make + + build/Makefile.am.gtk-doc | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 653ceb517fe756b042a3cf8322a36cbfe71ddbd8 +Author: Koji Otani <sho@bbr.jp> +Date: Wed Nov 17 00:07:03 2010 +1030 + + PS: fix embedding of grayscale jpegs + + https://bugs.freedesktop.org/show_bug.cgi?id=31632 + + src/cairo-ps-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit d5656394787c29daf31fff085639066287b0f7b7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 16 23:53:05 2010 +1030 + + win32-print: print as unicode where possible + + One of the problems identified in + https://bugzilla.mozilla.org/show_bug.cgi?id=454532 is that there are + some older printer drivers that do not work with ExtTextOut and the + ETO_GLYPH_INDEX option. + + Fix this by where possible mapping glyph indices back to unicode and + calling ExtTextOut without ETO_GLYPH_INDEX. Glyphs that can not be + mapped back to unicode are printed with ETO_GLYPH_INDEX. + + src/cairo-win32-printing-surface.c | 157 +++++++++++++++++++++++-------------- + src/cairo-win32-private.h | 11 +++ + src/cairo-win32-surface.c | 54 ++++++++----- + 3 files changed, 141 insertions(+), 81 deletions(-) + +commit eb29a25dd6dddc511388bf883c9b95843ecdb823 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 16 23:48:39 2010 +1030 + + win32: Use a font_face hash table to provide unique font faces + + Similar to the freetype and toy font backends, use a hash table + to map logfont,hfont to font faces. + + This fixes the multiple embedding of the same font in PDF. + + https://bugs.freedesktop.org/show_bug.cgi?id=24849 + + src/cairo-debug.c | 4 + + src/cairo-mutex-list-private.h | 4 + + src/cairo-win32-font.c | 163 +++++++++++++++++++++++++++++++++++++++-- + src/cairoint.h | 3 + + 4 files changed, 169 insertions(+), 5 deletions(-) + +commit 31e116f084d0ff073bed9d0e9c1c6ca1e5db4843 +Author: Eric Anholt <eric@anholt.net> +Date: Sat Nov 13 15:48:03 2010 -0800 + + gl: Avoid using gl_FragCoord for linear gradients. + + The issue is that we store our data flipped based on whether we're + rendering to an FBO or to a window. By not flipping our gl_FragCoord + usage based on that (either with math or ARB_frag_coord_conventions), + this caused linear gradients to be flipped when rendering either to a + window or to an FBO. To avoid this, pass in appropriate texcoords. + And, if we're passing in texcoords, just do the projection to the + linear gradient factor on the CPU side per vertex instead of providing + a bunch of uniforms to do the math per fragment. + + Fixes 18 testcases. + + src/cairo-gl-composite.c | 74 +++++++++++++++++++++++++++++------------------- + src/cairo-gl-private.h | 4 +-- + src/cairo-gl-shaders.c | 12 +++----- + 3 files changed, 51 insertions(+), 39 deletions(-) + +commit 7237eb62be34370b34e0ba31504b5ae2708e44e5 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Nov 10 14:21:58 2010 -0500 + + Sync get-path-extents test with the one on 1.10. + + The problem fixed by e9bb70d2dee4ef7a54e3971f09a08df30c2b5287 + had already been fixed on master by always computing exact extents: + 89e1261dd0fdb6c6c0271f71dd84d72504969ab1 + + test/get-path-extents.c | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit 3afd7cd031ab9097e37c3e89d86ec41d015fdeb8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 10 20:09:53 2010 +1030 + + PDF: Restrict ActualText to PDF version >= 1.5 + + The use of ActualText in a marked content sequence is a PDF 1.5 + feature. + + A 'use_actual_text' flag linked to the PDF version has already been + implemented in pdf-operators but for some reason this flag had not + been used to control the use of ActualText. + + src/cairo-pdf-operators.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +commit 7ee313d7b86b8c9eeaa5bf9b42a47d3f1feaeeee +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Nov 8 14:22:38 2010 -0500 + + xcb: Add more _cairo_error() calls + + We still don't track various error conditions... + + src/cairo-xcb-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 78dadf11ca3d13a399b5942ab2a5c1c399689729 +Author: Benjamin Otte <otte@redhat.com> +Date: Mon Nov 8 14:17:37 2010 -0500 + + xlib: Add more _cairo_error() calls + + We still don't track various error conditions... + + src/cairo-xlib-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5f2e647dcf94eefd233c84881987b3dead2fbd85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 7 14:37:05 2010 +0000 + + drm/intel: Drop the bo cache. + + As this remains experimental, rely on the highly experimental kernel + caching... + + src/drm/cairo-drm-intel-private.h | 10 -- + src/drm/cairo-drm-intel.c | 210 +------------------------------------- + 2 files changed, 3 insertions(+), 217 deletions(-) + +commit b4e55b84e20999e410d0ba04ebb83b81c21c8447 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Oct 30 10:43:46 2010 +0200 + + test/README: Change suggested screen size + + The dash-state test needs a surface with a width of 1500 pixels. If the screen + size is smaller than that, the boilerplate backends that create a window on the + X server can't properly do their job because part of the window would be outside + of the screen. This means people should use a screen large enough for all the + needed test surfaces. 1680 seemed like a more-or-less realistic value here. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 95f6f7a174ca096a3d3dbe84ff220d166d1e2baa +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Oct 22 11:54:57 2010 +0200 + + Make both versions of _cairo_lround consistent again + + Commit c0008242b0f made cairo use libm's lround instead of its own _cairo_lround + by default. However, since commit ce58f874 from 2006, _cairo_lround does + arithmetic rounding instead of away-from-zero rounding (before said commit, it + was using baker's rounding). + + So to make the rounding of _cairo_lround be independent from + DISABLE_SOME_FLOATING_POINT, we have to use another function. Turns out that + _cairo_round already does the same thing that _cairo_lround does. Their only + difference is the return type. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairoint.h | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 5d5a7d6b22156e5bbb9bf6d4f706740af3ca05ac +Author: Uli Schlachter <psychon@znc.in> +Date: Fri Oct 22 16:33:55 2010 +0200 + + _cairo_round: Fix documentation + + Despite what the comment says, this function rounds halfway cases towards + positive infinity. + + _cairo_round ( 0.5) => floor ( 1.0) => 1.0 + _cairo_round (-0.5) => floor ( 0.0) => 0.0 + _cairo_round (-1.5) => floor (-1.0) => -1.0 + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6383e1442cf3918ea71378ce46144e1bb5707882 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Oct 25 09:11:05 2010 +0200 + + XCB: Check screen size in boilerplate + + Trying to create a window for drawing that is larger than the available screen + space is a bad idea. When the test finishes and tries to grab the resulting + image from the X server, the window's area that is outside of the screen will + have undefined content. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + boilerplate/cairo-boilerplate-xcb.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit daaef055b57a5cd91c0bd9ef2b774e0bce41043d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 7 21:50:56 2010 +1030 + + PDF: Fix toUnicode for CID fonts + + 1047dc6b introduced a regression for text that is using 16-bit glyphs + in the content stream. + + src/cairo-pdf-surface.c | 38 ++++++++++++++++++++++++-------------- + src/cairo-scaled-font-subsets.c | 1 - + 2 files changed, 24 insertions(+), 15 deletions(-) + +commit f1d1928d13f4f83cc37d68ab4773f7c796d08c6e +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 21 13:38:30 2010 +0200 + + xcb: Fix transformation matrix setting + + _cairo_xcb_picture_set_matrix() checked if the matrix that it should + set is an identity matrix. In this case this function simply didn't do + anything at all. The assumption here seems to be that a picture's + matrix is the identity matrix by default. + + The problem here is that we might first set a picture's matrix to + something else and then later need an identity transform again. Fix + this by still setting the new matrix if it is an identify matrix. We + just skip some unneeded checks and optimizations in this case. + + This fixes the "finer-grained-fallbacks" test in the test suite. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit d51ab091422fc64831578bffb3a502c83ec8bdf5 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Nov 6 15:46:48 2010 +0100 + + configure: Correct reporting of tee backend + + Since 9f33f8453b4949cfdc63169d3acd7238f89379c2 tee is not compiled in + anymore by default. Reporting it as always enabled is misleading. + + build/configure.ac.features | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5906e64000b35c9a6b5ea52f6842a572d812d7bb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 6 22:45:11 2010 +1030 + + Type 1 glyph names: Do not use an array of pointers for winansi glyph names + + Similar to ps_standard_encoding array, use a string pool and lookup + indices for the winansi glyph names to reduce .data size. As + ps_encoding and winansi share mostly the same names, the perl script + has been modified to merge the symbols into the one string pool and + generate separate lookup indices for ps_encoding and winansi. + + src/cairo-type1-glyph-names.c | 342 ++++++++++++++++++++++++++---------------- + 1 file changed, 211 insertions(+), 131 deletions(-) + +commit 048a43e5c464adfcd0aeb682cb812ae228ef4a83 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 6 22:31:46 2010 +1030 + + Move glyph names into separate file + + The latin subsets feature requires these names. As + cairo-type1-subsets.c depends on FreeType, move these names out to a + separate file to allow compilation without FT. + + src/Makefile.sources | 1 + + src/cairo-scaled-font-subsets-private.h | 3 + + src/cairo-type1-glyph-names.c | 330 ++++++++++++++++++++++++++++++++ + src/cairo-type1-subset.c | 281 +-------------------------- + 4 files changed, 335 insertions(+), 280 deletions(-) + +commit 74873c82242e9c124b69e05d0f8abdf78983d62d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 6 21:15:30 2010 +1030 + + Fix type1-fallback bbox + + src/cairo-type1-fallback.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 8f2f5e5ad4f8e5f18da903865bb2d2afce3a544e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 6 18:44:54 2010 +1030 + + configure.ac.features: s/Meta/Recording/ + + build/configure.ac.features | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9bb70d2dee4ef7a54e3971f09a08df30c2b5287 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Fri Nov 5 11:40:00 2010 -0400 + + Fix degenerate vertical path bounds. + + 6b77567b6ef28710c7707ab82c7fa95c810152d1 made vertical + path bounds with no area return extents of 0,0. This fixes + the problem by not assuming degenerate path bounds are 0,0 + + src/cairo-path-bounds.c | 4 +++- + test/get-path-extents.c | 40 ++++++++++++++++++++++++++++++++-------- + 2 files changed, 35 insertions(+), 9 deletions(-) + +commit b53084b7c530ed0473137ee8ebfab70fdd8e3c23 +Author: Markus Stange <mstange@themasta.com> +Date: Fri Nov 5 09:23:44 2010 +0100 + + Fix type of _cairo_memory_stream_destroy parameter + + In 9b9952ab4f64a476bbadfd3e6cf1e66c1137ccd7 + _cairo_memory_stream_destroy was changed to take an unsigned long + instead of unsigned int, and the two callsites in cairo-gl-shaders.c + weren't updated. + + src/cairo-gl-shaders.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6dda9c4465fa229f3fe9927e8318121642b41c14 +Author: Erik Zeek <zeekec@mad.scientist.com> +Date: Thu Nov 4 17:57:03 2010 +0100 + + Fix build on gentoo + + The problem is probably caused by a change in the behavior of autoconf + (2.67). + + See http://bugs.gentoo.org/336329 + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 84a7fe8a5c5326d77b0954be439799202e947d6b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 2 21:47:36 2010 +1030 + + CFF Subset: Remove debug code + + src/cairo-cff-subset.c | 13 ------------- + 1 file changed, 13 deletions(-) + +commit 1047dc6b944d802eca441ec4956f7b5e1745fe60 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 2 21:38:06 2010 +1030 + + PDF: Use correct bfchar size in toUnicode for latin fonts + + poppler was printing warnings about the wrong size + + src/cairo-pdf-surface.c | 27 +++++++++++++-------------- + src/cairo-scaled-font-subsets.c | 1 + + 2 files changed, 14 insertions(+), 14 deletions(-) + +commit 91a6fe64236985d30f5794d760698deafd9e6511 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 1 21:15:07 2010 +0100 + + image: Use correct size for allocation + + In 06e9caf86199e8261a07db6d4774628fa147728d the type of the variables + was changed, but the type used to compute the allocation size was not. + + Fixes a crash in user-font-mask (test-fallback backend). + (cherry picked from commit c7027c9d89d9a13d6cbc1727fc8513c908878db9) + + src/cairo-image-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c7027c9d89d9a13d6cbc1727fc8513c908878db9 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 1 21:15:07 2010 +0100 + + image: Use correct size for allocation + + In 06e9caf86199e8261a07db6d4774628fa147728d the type of the variables + was changed, but the type used to compute the allocation size was not. + + Fixes a crash in user-font-mask (test-fallback backend). + + src/cairo-image-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 852e789b756f9589b102a4b24b85642f199d0915 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 1 15:53:10 2010 +0100 + + quartz-font: Do not leak CFDataRef's + + CFData is allocated and thus needs to be freed. + + src/cairo-quartz-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 947d35c19539b84c866d792c067a0cc63485e94e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Mon Nov 1 14:06:32 2010 +0100 + + quartz-font: Add truetype font table tags accessor + + Improves the quality of embedded fonts. + + src/cairo-quartz-font.c | 39 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 38 insertions(+), 1 deletion(-) + +commit bb30dae210da3fc71bb242c7a73b8f9308eec2a1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 30 11:33:33 2010 +0200 + + script: Fix compilation + + Use accessors instead of directly accessing path optimization flags. + + Change the conditions for outputting tolerance (was 'when + path->is_rectilinear is FALSE', now is 'whenever the path includes a + curve'). + + Always output tolerance for strokes, because pen depends on tolerance + (for round caps/joins and for cusps). + + src/cairo-script-surface.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit e43ae002118992961ce2b55b18774cec350e662c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 30 11:31:19 2010 +0200 + + cff: Fixes for 'make check' + + Fixed some complaints by 'make check' about exported symbols in cff. + + src/cairo-cff-subset.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 22ea4609be03584de2f2985e55bf169b7af4f868 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 30 11:28:03 2010 +0200 + + path: Solve co-dependency problem + + FALSE and TRUE are defined in cairoint.h, but cairoint.h depends on + cairo-path-fixed-private.h, so just use 0/1 to avoid the depencency + loop. + + Fixes a number of errors reported by 'make check'. + + src/cairo-path-fixed-private.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 330b343952c103d902841a1da7422dd4d0623117 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 30 11:26:13 2010 +0200 + + drm: Do not access path flags directly + + Fixes compilation + + src/drm/cairo-drm-i915-surface.c | 6 +++--- + src/drm/cairo-drm-i965-surface.c | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 5b2ed2422dffb407d80ec38ac0502ba951368ad2 +Author: Uli Schlachter <psychon@znc.in> +Date: Sat Oct 30 09:57:40 2010 +0200 + + xcb: Do not access flags directly + + This fixes compilation of the xcb backend by porting commit e9c1fc31887c5bfbb's + changes from the image backend. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b8444a5c78c5d254b21331353884bcfe8efb0a5e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 23:16:21 2010 +0200 + + path: Tighten transformed extents + + The transformation code should produce tight extents if they are to be + used in the new simple extents functions. + + src/cairo-path-fixed.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 89e1261dd0fdb6c6c0271f71dd84d72504969ab1 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 12:35:40 2010 +0200 + + path-bounder: Simplify code + + If the path extents are tight, all the extents computations and + approximations become trivial except for the stroke extents. + + src/cairo-path-bounds.c | 249 +++++++++++------------------------------------- + src/cairoint.h | 5 + + 2 files changed, 61 insertions(+), 193 deletions(-) + +commit 958c56e2b4f5447cc5a1cc137a8d287aebabe5dc +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 23:03:51 2010 +0200 + + path: Tighten curve_to extents + + The additional time spent in the computation of tight extents for the + curve_to operation doesn't seem to be significant, but it makes the + extents computations faster and the approximations more accurate. + + src/cairo-path-fixed.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 0655198301ec60b387b581a10b991ee442743374 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 16 22:51:28 2010 +0200 + + Fix degenerate arcs + + Make sure that degenerate arcs become a move_to-line_to sequence + instead of just a move_to. + + Fixes get-path-extents. + + src/cairo-arc.c | 4 ++++ + src/cairo.c | 1 + + 2 files changed, 5 insertions(+) + +commit a1d8763236ccbb7bc11724a87b25bacafce44a7c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 23:06:36 2010 +0200 + + path: Replace _cairo_path_fixed_extents_add with _cairo_box_add_point + + Path extents now satisfy _cairo_box_add_point requirements, so it can + be used instead of _cairo_path_fixed_extents_add. + + src/cairo-path-fixed.c | 21 +++------------------ + 1 file changed, 3 insertions(+), 18 deletions(-) + +commit 02687065509aa4dead4528b2c8dd9aa31dc76332 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 21 17:25:46 2010 +0200 + + path: Fix _cairo_path_fixed_transform + + current_point and last_move_to were previously left in their old + position (which could lead to incorrect flag computation if other + operations were added to the path) and flags were not updated. + + src/cairo-path-fixed.c | 50 ++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 34 insertions(+), 16 deletions(-) + +commit 29d5b18cba05357dc4885447035e65f93e7d7728 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 28 18:38:50 2010 +0200 + + path: Recompute flags in _cairo_path_fixed_scale_and_offset + + Only fill_maybe_region can change its value because the transformation + preserves vertical and horizontal lines, but can move the points and + make them integer if they were not or non-integer if they were. + + Recomputing it is just as easy as checking if all the points are + integer and the path is fill_is_rectilinear. + + src/cairo-path-fixed.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +commit 634fcf2c0a66b342ae81faa0e0a75ae72491a313 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 28 18:36:42 2010 +0200 + + path: Transform current_point and last_move_to in _cairo_path_fixed_scale_and_offset + + They were previously left in their old position (which could lead to + incorrect flag computation if other operations were added to the + path). + + src/cairo-path-fixed.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 9c0e4db570d9de506eb48de0e9a27497b8cf2f61 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 22:19:48 2010 +0200 + + path: Recompute flags in _cairo_path_fixed_translate + + Only fill_maybe_region can change its value because the transformation + preserves vertical and horizontal lines, but can move the points and + make them integer if they were not or non-integer if they were. + + Recomputing it is just as easy as checking if all the points are + integer and the path is fill_is_rectilinear. + + src/cairo-path-fixed.c | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +commit 9d84dff0c6a7be5abf1f931eabe77afca21f04aa +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 15:02:54 2010 +0200 + + path: Cleanup close_path + + Instead of explicitly calling _cairo_fixed_move_to, setting the + needs_move_to flags is sufficient because the current_point is already + updeted correctly. + + src/cairo-path-fixed.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 17fef2fe4ddcba8d0811922f012add50109eb0e2 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 11:56:49 2010 +0200 + + path: Make _cairo_path_fixed_last_op assert on empty path + + _cairo_path_fixed_last_op should now only be used on non-empty path + (to test if the previous operation was a line_to). + + src/cairo-path-fixed.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 568a975a62fde8d4dfaef2086c4f40e3354ba43b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 21 17:24:30 2010 +0200 + + path: Cleanup _cairo_path_fixed_iter_at_end + + The last operation of a path cannot be a move_to anymore (since + move_to is only added if another operation is added after it). + + src/cairo-path-fixed.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit 929571b4b56d56c669eb4cbb3e109e2bd4620fb0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 21 17:11:48 2010 +0200 + + path: Cleanup _cairo_path_fixed_transform + + Clean up the code and make sure that _cairo_path_fixed_translate is + used whenever the _cairo_fixed_to_double rounding would result in the + matrix being approximated with a translation. + + src/cairo-path-fixed.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +commit 34f1db13a13f80733a7eb5bef4693c4df7a6fb4e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 21 16:59:01 2010 +0200 + + path: Log flags + + When logging path operations, also log computed flags. + + src/cairo-path-fixed.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit e8e614db92c43ed1b22251a1903396c99022326c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 28 18:02:59 2010 +0200 + + path: Rename fill optimization flags + + Rename fill optimization flags making fill_ their common prefix. + + src/cairo-path-fixed-private.h | 15 ++++++++++---- + src/cairo-path-fixed.c | 47 +++++++++++++++++++++++------------------- + src/cairo.c | 8 +++---- + 3 files changed, 41 insertions(+), 29 deletions(-) + +commit e48cb95493c1dc9532ae0d689238ff3bc317cc4c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 28 17:56:37 2010 +0200 + + path: Add stroke_is_rectilinear flag + + Stroke and fill rectilinearity cannot be represented by a single flag + without missing the opportunity of considering some strokes + rectilinear. + + src/cairo-path-fixed-private.h | 9 +++++---- + src/cairo-path-fixed.c | 45 ++++++++++++++++++++++-------------------- + src/cairo.c | 6 ++++-- + 3 files changed, 33 insertions(+), 27 deletions(-) + +commit 166453c1abf2279b884a4d878729fa4fcfa550cb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 21 15:14:31 2010 +0200 + + path: New path construction logic + + Now move_to's are actually added to the path when followed by a + drawing operation (line_to, curve_to or close_path). + + This is implemented by updating the current_point and setting the + needs_move_to when a move_to operation is requested. + + Whenever a drawing operation is requested and the needs_move_to flag + is set, a move_to is added before the drawing operation. + + src/cairo-path-bounds.c | 6 +-- + src/cairo-path-fixed-private.h | 9 ++-- + src/cairo-path-fixed.c | 111 ++++++++++++++++++++++------------------- + src/cairo.c | 6 ++- + 4 files changed, 72 insertions(+), 60 deletions(-) + +commit a2ac91eb5f66f4c633abbcd6945f6015837ff211 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 14:10:58 2010 +0200 + + path: Drop degenerate line_to in _cairo_path_fixed_curve_to + + When a degenerate line_to is followed by a curve_to operation, the + line_to can be safely dropped, just like for degenerate line_to + followed by line_to. + + src/cairo-path-fixed.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 2352b48f9e9b54b4586548df74aaaa28d5308c0b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 14:21:07 2010 +0200 + + path: Move _cairo_path_fixed_add at the end of line_to and curve_to + + src/cairo-path-fixed.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit d6c3451ee24555abd0e9dcb5e5b8e4f85b70b7f0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 13:43:01 2010 +0200 + + box: Add _cairo_box_add_curve_to + + Add a function to extend a box with the extents of a curve_to + operation. + + src/cairo-rectangle.c | 29 +++++++++++++++++++++++++++++ + src/cairoint.h | 7 +++++++ + 2 files changed, 36 insertions(+) + +commit 46584e01a8acfb43bb4af1b4e3b89b5cb5ebe246 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 22 13:41:51 2010 +0200 + + box: Add box header + + Add a new header implementing very simple box functions: + - initialization with the two extrema + - extension with a point + - in/out test + + src/cairo-box-private.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-path-fixed.c | 1 + + src/cairo-path-stroke.c | 1 + + src/cairo-rectangle.c | 11 ++------ + src/cairoint.h | 4 --- + 5 files changed, 79 insertions(+), 13 deletions(-) + +commit 65d57313f00b3775eb443f0c0069b996b44941d8 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 12:33:40 2010 +0200 + + path: Cleanup _cairo_path_fixed_line_to + + The low-level line_to optimizations can be implemented in a more + abstract way using _cairo_path_fixed_penultimate_point and + _cairo_path_fixed_drop_line_to. + + src/cairo-path-fixed.c | 22 ++++++++-------------- + 1 file changed, 8 insertions(+), 14 deletions(-) + +commit f3e7677109d7ac0b775f2d373796f444cc3bff54 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 11:40:34 2010 +0200 + + path: Simplify close_path + + Instead of explicitly computing the flag in close_path, manually close + the path with a line_to, then drop the last operation if it is a + line_to (it might be another operation if the line_to was ignored + because it would have been degenerate). + + src/cairo-path-fixed.c | 37 +++++++++++++++++-------------------- + 1 file changed, 17 insertions(+), 20 deletions(-) + +commit 641d314b9a3c670ddade74df99f1443063bd991b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 11:54:19 2010 +0200 + + path: Add utility functions + + Add a function to get the penultimate point and another one to drop + the last operation (assuming it is a line_to). + + This allows some more abstraction in the line_to and close_path code. + + src/cairo-path-fixed.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit 4075ed9686483defa9fb1cffca6509f079f9a91d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 11:53:58 2010 +0200 + + path: Rename _cairo_path_last_op to _cairo_path_fixed_last_op + + Aestetical change, to make the naming consistent with that of the + other functions. + + src/cairo-path-fixed.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit a8763d8fdeeb16323b8641e168475f77d73908a3 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 11:38:23 2010 +0200 + + path: Make path equality independent of flags + + Flags for the same path can be different depending on its "history" + (in particular if it was constructed and transformed they might be + different from what they would be if each point was transformed and + then the path constructed). + + src/cairo-path-fixed.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit f4b2ce1c78c05c0a551aab7c84451c7ee1759213 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 17 10:55:15 2010 +0200 + + path: Improve hashing + + Make the hash independent of buf bucketing, extents and flags. + + This makes the hash depend only on the actual content of the path, not + on how it is stored or on any computed property. + + src/cairo-path-fixed.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit e9c1fc31887c5bfbb7d086f923a7628b7cfa739c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 16 23:57:06 2010 +0200 + + path: Do not access flags directly + + Use inline accessors to hide the flags in the code. + + This ensures that flags that need additional computations (example: + is_rectilinear for the fill case) are always used correctly. + + src/cairo-clip.c | 18 +++++++++--------- + src/cairo-gstate.c | 2 +- + src/cairo-image-surface.c | 6 +++--- + src/cairo-path-fill.c | 8 ++++---- + src/cairo-path-fixed-private.h | 26 +++++++++++++++++++------- + src/cairo-path-in-fill.c | 2 +- + src/cairo-path-stroke.c | 6 +++--- + src/cairo-surface-fallback.c | 6 +++--- + 8 files changed, 43 insertions(+), 31 deletions(-) + +commit 14cc9846b302a990e65d7572e7f095a8873a213d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sat Oct 16 23:08:03 2010 +0200 + + path: Replace _cairo_path_fixed_is_equal with _cairo_path_fixed_equal + + Remove _cairo_path_fixed_is_equal and use _cairo_path_fixed_equal + instead. + The latter function can recognize that two paths are equal even if the + drawing commands have been partitioned in a different way in the buf + list. + + src/cairo-path-fixed.c | 35 ----------------------------------- + src/cairo-recording-surface.c | 4 ++-- + src/cairoint.h | 4 ---- + 3 files changed, 2 insertions(+), 41 deletions(-) + +commit ac7b2a972097f4080ab6e5a29974c830b8b57a4f +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 15 21:51:12 2010 +0200 + + test: Fix get-path-extents + + The test was considering all the empty rects equals, but this is + not correct when testing the results of cairo_path_extents(). + + test/get-path-extents.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 253374d6ada14796b5ec55ceb7983de62be34f62 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 29 15:00:03 2010 +0100 + + configure: Remove noisy -Wlogical-op + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + build/configure.ac.warnings | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 5a762edc28310a59968230ccb5354c57808606bf +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Oct 28 13:57:05 2010 +0200 + + build: Don't build cairo-fdr when the tee surface is off + + util/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 83259f6ed60e00d0c25ca81c9ff9adfc017ebf5f +Author: Benjamin Otte <otte@redhat.com> +Date: Thu Oct 28 13:57:05 2010 +0200 + + build: Don't build cairo-fdr when the tee surface is off + + util/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit efc2440526c609338d68354ddf38031d1fa7c2c4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 28 21:21:00 2010 +1030 + + PDF: Don't use the currently set color after a 'Q' operator + + https://bugs.freedesktop.org/show_bug.cgi?id=31140 + (cherry picked from commit e23bcfd4300870034f07b1ecd1bb4d2ac95d9785) + + src/cairo-pdf-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit e23bcfd4300870034f07b1ecd1bb4d2ac95d9785 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 28 21:21:00 2010 +1030 + + PDF: Don't use the currently set color after a 'Q' operator + + https://bugs.freedesktop.org/show_bug.cgi?id=31140 + + src/cairo-pdf-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 147fa7a2bea74bfc02059d99df72b998d45eb843 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Oct 24 16:40:53 2010 +0200 + + test: Add romedalen images copyright information + + romedalen.png and romedalen.jpg have been bundled into the test + suite without an explicit copyright notice. + + test/COPYING | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit f47830dbbc34c7068ccdd8f7f9042e8734c9e408 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 24 11:32:41 2010 +1030 + + Type 1 subset: Fix glyph advance + + https://bugs.freedesktop.org/show_bug.cgi?id=31062 + (cherry picked from commit 6dc0b19adb6da690ad5944623081b9cdb42de066) + + src/cairo-type1-subset.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit f747ea81fb91239690b1785bce9ed29cb58c9098 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 14 19:28:13 2010 +1030 + + PDF: Fix regression in EXTEND_NONE gradients + + The test for opaque gradients in _cairo_pdf_surface_add_pdf_pattern() + must be identical to the test in + _cairo_pdf_surface_emit_pattern_stops() other wise the PDF file will + reference a smask that does not exist. + + The _cairo_pattern_is_opaque() test is too strict for PDF as PDF can + draw EXTEND_NONE gradients with opaque color stops without requiring a + smask. + (cherry picked from commit 7a17ef31760c49b81fd2890814f5b2aeb8c6b3a3) + + src/cairo-pdf-surface.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 6dc0b19adb6da690ad5944623081b9cdb42de066 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 24 11:32:41 2010 +1030 + + Type 1 subset: Fix glyph advance + + https://bugs.freedesktop.org/show_bug.cgi?id=31062 + + src/cairo-type1-subset.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit cee1dadc66107e1cc6bcac7718e0b67969141876 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 21 22:14:57 2010 +0200 + + Other backends: Set round_glyph_positions to OFF + + This sets CAIRO_ROUND_GLYPH_POS_OFF in all surface backends that didn't use + CAIRO_ROUND_GLYPH_POS_ON. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-svg-surface.c | 1 + + src/cairo-vg-surface.c | 1 + + 4 files changed, 4 insertions(+) + +commit d24e9881de7b392cfce1d82c9861553ece558aaf +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 21 14:03:38 2010 +0200 + + raster backends: Set round_glpyh_positions to ON + + This fixes "text-rotate" in the test suite for the image backend and + "overlapping-glyphs" for the xcb backend. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-gl-surface.c | 1 + + src/cairo-image-surface.c | 1 + + src/cairo-win32-printing-surface.c | 1 + + src/cairo-xcb-surface.c | 1 + + src/cairo-xlib-screen.c | 1 + + 5 files changed, 5 insertions(+) + +commit b514863a0ee8e6c4f0a994f6f5e7db18ce290e79 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 21 13:59:25 2010 +0200 + + Actually implement round_glpyh_positions + + The previous commit only added this option and made sure it gets set, but it + didn't actually have any effect. This commit now implements this option. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-scaled-font.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 6bfe71124b56b496056b77b3b51eef4d656ccf54 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 21 13:52:33 2010 +0200 + + font options: Add private round_glpyh_positions field + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-font-options.c | 49 +++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo-surface.c | 3 ++- + src/cairo-types-private.h | 7 +++++++ + src/cairoint.h | 7 +++++++ + 4 files changed, 63 insertions(+), 3 deletions(-) + +commit fae88051c18722566d15b96a1b23bfde1844c3ee +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Oct 17 17:47:22 2010 +0200 + + XCB: Use consistent rounding modes for a1 rasterisation. + + This ports commits 36b4b0631 and 7ab9ce1b9 from the image backend to xcb. Look + there for an explanation of why this is correct, I only copied this over and the + test suite said it was good. :-) + + This fixes unantialiased-shapes, a1-rasterisation-rectangles and + a1-rasterisation-triangles. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 80 ++++++++++++++++++++++++++---------------- + 1 file changed, 50 insertions(+), 30 deletions(-) + +commit b80bcf66b284deeb4d44d68a860a1e7857136982 +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 14 20:38:35 2010 +0200 + + XCB: Fix for all unbounded operators + + _cairo_xcb_surface_fixup_unbounded_boxes() calculated a list of boxes that it + has to clear to make an unbounded operator work correctly. Then it cleared the + boxes that were drawn instead of clearing the list of boxes that it has to + clear. + + The reason that this wasn't noticed before is that there is an optimization in + case we have only one box instead of a whole list of boxes. This hid the bug. + + This fixes the "unbounded-operator" test case. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4465ff779aae506194e8bf0a649947ee67bbc5fc +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 14 18:12:39 2010 +0200 + + XCB: Move the assert from 5a0f8f7320c916c + + Calling _cairo_xcb_surface_ensure_picture() on a XCB surface whose fallback + member is non-null is always an error. It's possible that the surface first gets + a picture assigned and later it's fallback member is set. In this situation, + it's still wrong to use the surface's picture for any drawing- + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c6c3bdba4b43a1f678dae46bfe52d37fc292c6d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 20 14:26:37 2010 +0100 + + perf: Only print description once per backend + + Currently we print the backend description before every time, which is + overly verbose. As the information doesn't^Wshouldn't change, simply + print it before running the first test of each target. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + perf/cairo-perf-trace.c | 5 +++++ + perf/cairo-perf.h | 1 + + 2 files changed, 6 insertions(+) + +commit 0d93468efc7f7337b63c0cd746d5185e14d345f1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 15 10:37:25 2010 +0100 + + xcb: Pass clip to composite_glyphs_via_mask + + Spotted by Uli Schlachter. + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 42ecc427f361bcce68d529ae308ab65ff14ecea8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 15 10:28:32 2010 +0100 + + xcb,image: Fix a missing clip fini + + Spotted by Uli Schlachter when I copied the image glyphs clipping to + xcb. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 4 +++- + src/cairo-xcb-surface-render.c | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 22cdb7041f4ecbcac708583bc195d13934be6cf7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 13 19:23:45 2010 +1030 + + PS: Remove radial gradient fallback + + when one circle not inside the other. Pixman now follows the PDF + specification. + + src/cairo-ps-surface.c | 19 ++----------------- + 1 file changed, 2 insertions(+), 17 deletions(-) + +commit d3655e04b2e27bacdeeddbaf0c4a212b9b93b6ee +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 13 19:20:07 2010 +1030 + + PDF: Remove radial gradient fallback + + when one circle not inside the other. Pixman now follows the PDF + specification. + + src/cairo-pdf-surface.c | 17 +---------------- + 1 file changed, 1 insertion(+), 16 deletions(-) + +commit 34d929962413136ac127245c4347df5c6a5387b3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 14 19:32:51 2010 +1030 + + PS: Remove redundant code + + The test for zero stops is now in gstate. + + src/cairo-ps-surface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 7a17ef31760c49b81fd2890814f5b2aeb8c6b3a3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 14 19:28:13 2010 +1030 + + PDF: Fix regression in EXTEND_NONE gradients + + The test for opaque gradients in _cairo_pdf_surface_add_pdf_pattern() + must be identical to the test in + _cairo_pdf_surface_emit_pattern_stops() other wise the PDF file will + reference a smask that does not exist. + + The _cairo_pattern_is_opaque() test is too strict for PDF as PDF can + draw EXTEND_NONE gradients with opaque color stops without requiring a + smask. + + src/cairo-pdf-surface.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 6fecbb000d29dde153ce35ec08f663249f234b8e +Author: Uli Schlachter <psychon@znc.in> +Date: Thu Oct 14 13:26:48 2010 +0200 + + XCB: Remove an incorrect clipping optimizations + + It seems like the idea here was to optimize for the special case of a + rectangular clip, where the region operation could be replace by + direction operation on the draw extents. However, we cannot modify the + geometry for all operations, and in particular the glyphs. So remove + this from the common compositing path. + + This fixes partial-clip-text in the test suite. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 408033b4641ba66de0cb60df1c89e437d7422040 +Author: Uli Schlachter <psychon@znc.in> +Date: Wed Oct 13 20:15:16 2010 +0200 + + Add myself to AUTHORS + + I was looking around for changes that I could do. This what I came up with. + Seems boring, but nothing better came up this time. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + [ickle: Apologies for not doing it on your behalf.] + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + AUTHORS | 1 + + 1 file changed, 1 insertion(+) + +commit 8b6e0809955f01c369838f7c73db8d92d5953d72 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 14 14:20:46 2010 +0100 + + xcb: Fix reduction of clipping for bounded glyphs. + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 38 ++++---------------------------------- + 1 file changed, 4 insertions(+), 34 deletions(-) + +commit e6ce65fb82c2df09330f31fd9251fdf96f0cab50 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Oct 5 19:40:52 2010 +0200 + + xcb: Correctly handle ARGB visuals + + We want surface->depth to end up as "32", so we have to invent an alpha mask. + This mask is not used anyway (only its popcount), but still this should get a + less ugly fix. + + This was found because "assert (reply->depth == surface->depth);" in + _get_image() failed. + + Original-patch-by: Ross Alexander <Ross.Alexander@EU.NEC.COM> + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit da62cc21da4f250850050d0ead947858fb804223 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Oct 12 21:59:14 2010 +0200 + + _cairo_xcb_surface_picture: Check for fallback + + If a cairo surface's fallback member is set, the current content of that surface + is in-memory and the X server has an outdated version of stuff. Our + optimizations for doing in-server copies are wrong in this case and we should do + stuff in cairo instead of the X server. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5a0f8f7320c916c86c4fd66a5aa8cb8545c00643 +Author: Uli Schlachter <psychon@znc.in> +Date: Tue Oct 12 21:56:46 2010 +0200 + + _cairo_xcb_surface_ensure_picture: Check fallback + + When an XCB surface's fallback member is not NULL, we did some rendering that + the X server couldn't do for us and thus did that internally in cairo instead. + This means the X drawable's content is out of date and should not be used for + drawing anything. + + This adds an assert which checks for that situation. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 1 + + 1 file changed, 1 insertion(+) + +commit 35b1688c92d2c0e1353fc2b5e89abb29c2acda8d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 13 00:13:42 2010 +0200 + + quartz: Remove unused imageSurface field + + imageSurface was used to store a reference to the fallback image + generated by during fallbacks for gradients. The fallback code + has been removed as it is not needed anymore, thus this field can + be removed as well. + + src/cairo-quartz-surface.c | 5 ----- + 1 file changed, 5 deletions(-) + +commit ce455994a36cabe4a39a666556282ef2bf8b8daf +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Oct 13 00:10:09 2010 +0200 + + quartz: Cleanup gradient setup functions + + Gradient setup does not depend anymore on the surface on which the + gradient will be composited. + + src/cairo-quartz-surface.c | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +commit 1061c80d79e0e282617669397b45e0776d23bfb6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 29 16:48:30 2010 +0200 + + quartz: Move drawing state out of surface + + Some pattern types (gradients, surface patterns) require some + temporary information to be stored as "graphic state", because it + doesn't belong to CGContext. Previously all of this data was stored + inside the surface during the drawing operations, now it's in a + stack-allocated structure (of type cairo_quartz_drawing_state_t). + Based on a patch by Robert O'Callahan <robert@ocallahan.org>. + See https://bugzilla.mozilla.org/show_bug.cgi?id=522859 + + src/cairo-quartz-private.h | 12 ---- + src/cairo-quartz-surface.c | 166 ++++++++++++++++++++++++++------------------- + 2 files changed, 95 insertions(+), 83 deletions(-) + +commit bbaca9598292eaee2da3c8a7c275d53bf1a1a652 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 29 15:50:21 2010 +0200 + + quartz: Unify DO_SHADING, DO_IMAGE and DO_TILED_IMAGE + + DO_SHADING, DO_IMAGE and DO_TILED_IMAGE sources all require the source + to be painted over the whole surface (inside the clip region), thus can + share the same code path in drawing functions. + + src/cairo-quartz-surface.c | 54 ++++++++++++++-------------------------------- + 1 file changed, 16 insertions(+), 38 deletions(-) + +commit 51a6ae9d71daefdca214fdc48e1bb8fcba10029d +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 29 15:06:39 2010 +0200 + + quartz: Unify DO_SOLID and DO_PATTERN + + Both DO_SOLID and DO_PATTERN setup the underlying CGContext to directly + use the chosen color/pattern when filling and stroking, thus require no + additional drawing operations and can share the same drawing code. + + src/cairo-quartz-private.h | 4 +--- + src/cairo-quartz-surface.c | 22 +++++++++------------- + 2 files changed, 10 insertions(+), 16 deletions(-) + +commit c22e75e9f6cb471c764af0d721ad07cdf30a3bad +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 28 19:03:13 2010 +0200 + + quartz: Set operator when setting up source + + Share some code between the drawing functions by saving the state + and setting the operator when setting up the source and by restoring + the state during teardown. + Based on a patch by Robert O'Callahan <robert@ocallahan.org>. + See https://bugzilla.mozilla.org/show_bug.cgi?id=522859 + + src/cairo-quartz-private.h | 2 -- + src/cairo-quartz-surface.c | 69 ++++++++++++++-------------------------------- + 2 files changed, 21 insertions(+), 50 deletions(-) + +commit 6bc1376cf52a9815b75f8c0ce66e149fbc64495e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 8 09:49:51 2010 +0200 + + quartz: Remove DO_NOTHING and DO_UNSUPPORTED actions + + DO_NOTHING and DO_UNSUPPORTED are not actual actions and are better + handled by returning an appropriate cairo_int_status_t (and falling + back, if needed). + + src/cairo-quartz-private.h | 9 +++ + src/cairo-quartz-surface.c | 147 ++++++++++++++++++++++----------------------- + 2 files changed, 82 insertions(+), 74 deletions(-) + +commit 08c59c6bf3296cc8c70b71a270a3685227c1621b +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Oct 8 16:57:27 2010 +0200 + + quartz: Improve gradient quality + + Instead of extending the range of the interpolation parameter to make + sure that pixels exactly on the edge get drawn, we are now asking + quartz to extend the gradient. + + src/cairo-quartz-surface.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit 620c43f50c2c613b8fb334b97d9edcbede0e61bb +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Sep 7 08:49:05 2010 +0200 + + quartz: Fix EXTEND_PAD gradients + + Make PAD extended gardients more robust, by computing the color + explicitly like for REPEAT and REFLECT extend modes. + This removes a hack introducing a small but non-0 negative value + that ensured that the gradient started with the correct color (but + not that it ended with the correct one, too). + + Fixes linear-gradient-large. + + src/cairo-quartz-surface.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +commit 2af3ae92ebe91e39b835eae048addc442533fb67 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 12 22:52:54 2010 +0200 + + quartz: Improve gradient consistency + + By keeping "virtual extents", quartz surfaces now keep track of + the extents where they want the gradients to be consistent. + This works across various API for surface creation and editing: + - cairo_surface_create_for_rectangle + - cairo_surface_create_similar + cairo_surface_set_device_offset + - cairo_push_group/cairo_pop_group + + This method does not use clip extents, so it also makes gradient + rasterization independent of clip/path extents. + + src/cairo-quartz-private.h | 1 + + src/cairo-quartz-surface.c | 114 ++++++++++++++++++--------------------------- + 2 files changed, 46 insertions(+), 69 deletions(-) + +commit d21b4f31665d409e1bfa6eae82b3c10dd77c4b28 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 12 22:35:36 2010 +0200 + + Add _cairo_rectangle_union + + Implement _cairo_rectangle_union(), a function to compute a rectangle + containing two input rectangles. + + src/cairo-rectangle.c | 23 +++++++++++++++++++++++ + src/cairoint.h | 7 +++++++ + 2 files changed, 30 insertions(+) + +commit 2b3d9b3a3aedc37481639dff923c97b8ff956c80 +Author: Joerg Sonnenberger <joerg@NetBSD.org> +Date: Tue Oct 12 22:07:37 2010 +0200 + + LD_PRELOAD is supported on DragonFly. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1c36766d27173c5e4751e131d6bf26441d95a10e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 12 16:06:45 2010 +0200 + + quartz: Remove unused code + + The gradient fallback path is not used anymore. + + src/cairo-quartz-surface.c | 53 ---------------------------------------------- + 1 file changed, 53 deletions(-) + +commit 2cea2bb085a34650defbc18a477ddf468060b58c +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 12 15:37:23 2010 +0200 + + quartz: Make radial gradients follow PDF specification + + Pixman master (soon to become pixman 0.20) implements radial + gradients based on the PDF specification (section 8.7.4.5.4). + Quartz natively implements them, so falling back is not needed + anymore. + + src/cairo-quartz-surface.c | 14 -------------- + 1 file changed, 14 deletions(-) + +commit 5054727927ee86c5952f8956aa0225f49e9ff66e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 12 16:04:53 2010 +0200 + + quartz: Remove linear gradient fallback + + Degenerate linear gradients are reduced to solid gradients in + gstate, so backends do not need to handle them. + + src/cairo-quartz-surface.c | 10 ---------- + 1 file changed, 10 deletions(-) + +commit b661bc871220fd67d673c44a8e3cb305812d8c38 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 12 20:13:53 2010 +0200 + + test: Update ref images for radial tests + + Pixman master now rasterizes radial gradients following the PDF + specification (see section 8.7.4.5.4 of PDF 32000-1:2008). + + test/radial-gradient-mask-source.argb32.ref.png | Bin 116311 -> 105572 bytes + test/radial-gradient-mask-source.image16.ref.png | Bin 82800 -> 76287 bytes + test/radial-gradient-mask-source.rgb24.ref.png | Bin 129093 -> 115808 bytes + test/radial-gradient-mask.argb32.ref.png | Bin 116311 -> 105572 bytes + test/radial-gradient-mask.image16.ref.png | Bin 82800 -> 76287 bytes + test/radial-gradient-mask.rgb24.ref.png | Bin 129093 -> 115808 bytes + test/radial-gradient-one-stop.argb32.ref.png | Bin 1392 -> 1575 bytes + test/radial-gradient-one-stop.rgb24.ref.png | Bin 1153 -> 1307 bytes + test/radial-gradient-source.argb32.ref.png | Bin 272428 -> 251063 bytes + test/radial-gradient-source.image16.ref.png | Bin 132037 -> 119942 bytes + test/radial-gradient-source.rgb24.ref.png | Bin 193364 -> 179609 bytes + test/radial-gradient.image16.ref.png | Bin 202415 -> 188481 bytes + test/radial-gradient.ref.png | Bin 280971 -> 262931 bytes + 13 files changed, 0 insertions(+), 0 deletions(-) + +commit f96187e31ed68aef9f92f008bc3f36469ffdeef4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 8 20:29:06 2010 +1030 + + Rewrite pdf-operators word wrapping + + to fix some bugs + + src/cairo-pdf-operators.c | 231 +++++++++++++++++++++++----------------------- + 1 file changed, 113 insertions(+), 118 deletions(-) + +commit dd96c4accb546870b7bf7db4af10c2762de58d78 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 8 23:05:42 2010 +1030 + + Refresh ft-show-glyphs-positioning pdf ref image + + The new image is more accurate as a result of the fix in 165a14b5 + + test/ft-show-glyphs-positioning.pdf.ref.png | Bin 3133 -> 3117 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a0b208fc71db586d3793fa4e2f4c01b275608261 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 8 23:01:12 2010 +1030 + + Don't put Type3 glyphs in latin subsets + + it is not yet implemented + + src/cairo-scaled-font-subsets.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit b50d9d0783939ff9e68484c6d9ab7e64c31044fa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Oct 7 17:41:36 2010 -0400 + + Fix typo + + test/testtable.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 425e68590b94d4701d81b73ef2232ea76dd97f48 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Sun Sep 26 11:05:35 2010 +0200 + + test: Remove old html infrastructure + + The new dynamic html page supersedes the old make-generated static + html page. + + test/.gitignore | 1 - + test/Makefile.am | 29 ++--- + test/Makefile.win32 | 13 +-- + test/make-html.pl | 303 ---------------------------------------------------- + 4 files changed, 9 insertions(+), 337 deletions(-) + +commit f29e7d155f3a2ee75daf63719460348ea2ca0f76 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Aug 6 18:23:07 2010 +0200 + + test: Add a new test result html page + + This page uses JavaScript to parse test log files and create the + test table according to the results. It also allows dynamic selection + and hiding of rows/columns based on a chosen parameter and table + structure change, by dragging a field from rows to columns and vice + versa. + + Left click selects the cells with the chosen parameter-value association. + If these cells are exactly the only show cells, it hides them and shows + all the other ones, instead. + + Right click inverts the visibility of the cells with the chosen + parameter-value association. + + When some rows are hidden, the PASS/NEW/FAIL/XFAIL/CRASH counters show + both the currently shown test case count and the total count, if they are + different: "23[62]" means that there are 62 test case in that category, + but only 23 are currently visible. + + Dragging a field from the row (or column) header to the column (or row) + header rebuilds the table to have that field along the columns (or rows), + updating PASS/NEW/FAIL/... counters and showing the whole table again. + + Test names are hyperlinks to the test log. + Images are hyperlinks to themselves. + + test/index.html | 42 ++++++ + test/testtable.js | 426 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 468 insertions(+) + +commit 4e064b3a32e4d699a6494bf9d8dbcd7b8d9cbc64 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Fri Aug 6 18:20:49 2010 +0200 + + test: Make tests run in natural order + + When tests are registered, they are prepended to a list. + Reverting the list, we get a list whose order is the same as that + of registration. + + test/cairo-test-runner.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 5500d072e0e3d66d762a147caa803d036766b629 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 21:22:02 2010 +0200 + + quartz: Handle failures in _cairo_quartz_setup_fallback_source + + If the fallback surface creation or painting fail, the fallback + surface needs to be destroyed. + + src/cairo-quartz-surface.c | 44 +++++++++++++------------------------------- + 1 file changed, 13 insertions(+), 31 deletions(-) + +commit 17bb0f8b1fc6d209ad53b7b995bc013c85a4e058 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Wed Jul 28 10:26:50 2010 +0200 + + quartz: Improve _cg function types + + src/cairo-quartz-surface.c | 25 ++++++++++--------------- + 1 file changed, 10 insertions(+), 15 deletions(-) + +commit 3b4f7c36626d2d08295ebc1ec2548060c1728b67 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Oct 7 18:59:22 2010 +0200 + + quartz: Improve handling of surface creation failure + + Don't paint on a surface whose status is not SUCCESS. + + src/cairo-quartz-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit b13a8035c1c164c6fe6382467a53ceb463d2d3ff +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 19:05:25 2010 +0200 + + quartz: Remove useless code + + The condition is always true (since surface creation returns non-NULL + even upon failure). + + src/cairo-quartz-surface.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit f156f89db071cc09e35e30de0c9ac7b5824f6849 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 18:55:38 2010 +0200 + + quartz: Simplify cairo_quartz_surface_create_for_cg_context + + Only retaining the context when the surface cration is successful + avoids needless retaining and simplifies the code. + + src/cairo-quartz-surface.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit c5fc8fa62fa92a80a5d8ee84cfe610ec4497fef6 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 18:48:00 2010 +0200 + + quartz: Use NOTHING_TO_DO instead of SUCCESS where appropriate + + Returning CAIRO_INT_STATUS_NOTHING_TO_DO removes some code that + specifically handles it to convert to CAIRO_STATUS_SUCCESS. This + is already performed out of the backend, in the upper layers, so + it is not needed here. + + src/cairo-quartz-surface.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit eae5fafc89d35f76d1eb49f3a0dcee509e735b5e +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Jul 29 16:05:51 2010 +0200 + + quartz: Beautify code + + Remove redundant parentheses and reference/dereferences. + + src/cairo-quartz-surface.c | 35 ++++++++++++----------------------- + 1 file changed, 12 insertions(+), 23 deletions(-) + +commit f93603fda094c149deeb77afa11cc12f4d1d5c19 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 17:24:08 2010 +0200 + + quartz: Whitespace cleanup + + src/cairo-quartz-surface.c | 33 +++++++++++++++------------------ + 1 file changed, 15 insertions(+), 18 deletions(-) + +commit 6ff5cbd8a9c7d8e9d226c0eedc5c278c4afe7700 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 16:51:30 2010 +0200 + + quartz: Mark failures as unlikely + + src/cairo-quartz-surface.c | 71 +++++++++++++++++++++++----------------------- + 1 file changed, 35 insertions(+), 36 deletions(-) + +commit 2f4a47c6bfd10594ec31830d45bc218ebe4eafb0 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 15:59:31 2010 +0200 + + quartz: Fix function call coding style + + Cairo coding style specifies a single space between the function + name and the parentheses. + + src/cairo-quartz-surface.c | 273 +++++++++++++++++++++++---------------------- + 1 file changed, 138 insertions(+), 135 deletions(-) + +commit 692f20a8592ed2730b63c084224d996225912b53 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 16:06:27 2010 +0200 + + quartz: Don't typecast surfaces + + Casting to (cairo_surface_t *) is considered bad practice. The + correct way to get a reference to the generic surface information + is &(surface->base) + + src/cairo-quartz-surface.c | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +commit b922477e4e31198739098dff1bc1ed49f81e4745 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 14:44:17 2010 +0200 + + quartz: Check for valid patterns + + The pattern handling code ensures that 0 stops patterns are reduced + to clear solid patterns before being passed down to the backend. + An assertion is used to make sure that the assumption actually holds, + removing the duplication of the reduce-to-solid-clear logic. + + src/cairo-quartz-surface.c | 15 +++------------ + 1 file changed, 3 insertions(+), 12 deletions(-) + +commit c9aa393a4db15eeb1ea29aaf5bca4b2570a0cfab +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 14:43:15 2010 +0200 + + quartz: Assert upon invalid enum values + + Invalid enum values were being ignored (and replaced by a default + value). This behavior is not desirable on development builds, + because an explicit failure is much easier to track. + Assertions allow release builds to keep on with the old behaviour, + while development builds fail as soon as the invalid operaiton is + performed. + + src/cairo-quartz-surface.c | 56 +++++++++++++++++++++++++++++----------------- + 1 file changed, 35 insertions(+), 21 deletions(-) + +commit 9c22f97ebdcc9303d1a1530e7909d6b0d74d30e4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Jul 27 14:38:28 2010 +0200 + + quartz: Remove unused argument from _cairo_surface_to_cgimage + + src/cairo-quartz-surface.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit ef60650bd6e0b3a354c85dc2e1be8550be6f7c91 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 7 23:09:52 2010 +1030 + + Fix bug in subsetting check for winansi characters + + src/cairo-scaled-font-subsets.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +commit 390a6aa99771615763ed7349060e493f15c1d6d3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 6 22:43:36 2010 +1030 + + remove unused variable + + src/cairo-scaled-font-subsets.c | 12 ------------ + src/cairoint.h | 2 -- + 2 files changed, 14 deletions(-) + +commit ea45bc1b4b655b6e85be14669fdea97da2b6edae +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 3 13:41:17 2010 +0930 + + PS: Allow %%BoundingBox and %%PageBoundingBox to be overriden using DSC comments + + src/cairo-ps-surface.c | 38 +++++++++++++++++++++++++++----------- + 1 file changed, 27 insertions(+), 11 deletions(-) + +commit b950212a2a6aca7784b637d93b13b10daef8d801 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 4 23:11:56 2010 +1030 + + CFF subset: add support for latin subsets + + src/cairo-cff-subset.c | 410 +++++++++++++++++++++++++++----- + src/cairo-pdf-surface.c | 142 +++++++---- + src/cairo-scaled-font-subsets-private.h | 6 +- + src/cairo-scaled-font-subsets.c | 31 ++- + src/cairo-type1-subset.c | 13 +- + src/cairoint.h | 2 + + 6 files changed, 487 insertions(+), 117 deletions(-) + +commit f20814e07e7032c14f273d712f35e19addfdae80 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Tue Oct 5 10:36:38 2010 +0200 + + xcb: Do not return value in void function + + Sun Studio Compiler complains: + "cairo-xcb-surface.c", line 585: void function cannot return value + even if the returned value is void. + Some minor code restructuring removes the issue. + + src/cairo-xcb-surface.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit e675660ca7b50ce16108e11215bbb9aff05c7262 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 4 22:08:33 2010 +0100 + + xcb: Correct a minor typo prevent an assert from firing + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-xcb-surface-render.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit b6f830bab07e7e2ea7c3a8cb895d7a37c990c550 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Oct 4 18:11:50 2010 +0200 + + xcb: Correctly clear the composite surface + + Calling _cairo_xcb_surface_render_paint() with CAIRO_OPERATOR_CLEAR and no clip + just results in the surface's deferred_clear flag to be set to TRUE. Fix this by + calling _cairo_xcb_surface_clear() directly instead. + + This half-fixes the clip-shape test in the test-suite. The difference to the + reference image becomes much smaller at least. :( + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 0a651b93a45f8c43399188a95870ca0055becced +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Oct 4 12:48:23 2010 +0200 + + xcb: Fix compiler warning about unused result + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit be50c32ed594ccc90d6502c23cbf8c3d0f1dae67 +Author: Uli Schlachter <psychon@znc.in> +Date: Mon Oct 4 12:41:46 2010 +0200 + + xcb: Fix CAIRO_OPERATOR_IN + + The if that is being removed here resulted in no drawing done at all when it + skipped the call to _render_fill_boxes(). This is obviously not what + CAIRO_OPERATOR_IN wants. + + This fixes the "operator" test in the test suite. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit c200560929f1d14667c9b2133a3591665f36c0d3 +Author: Uli Schlachter <psychon@znc.in> +Date: Sun Oct 3 21:15:07 2010 +0200 + + XCB: Fix some weird code + + In the XCB backend, drawing a surface pattern always caused an extend of + CAIRO_EXTEND_NONE to be used. This caused e.g. all the + surface-pattern-scale-down-extend-* tests in the test suite to fail. + + Signed-off-by: Uli Schlachter <psychon@znc.in> + + src/cairo-xcb-surface-render.c | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +commit 7d2979e446e2e10b6c5ace711549d25690b477ed +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 2 16:58:06 2010 +0930 + + Don't embed cmap in TrueType fonts embedded in PostScript + + it doesn't print on a LaserJet 4050 + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 28 +++++++++++++++++++++++++--- + src/cairo-truetype-subset.c | 31 ++++++++++++++++++++++++------- + 4 files changed, 51 insertions(+), 12 deletions(-) + +commit cd74f5edabf653d1c1c6daacea3626ba2548d5e0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 2 12:34:42 2010 +0930 + + pdf-operators: word wrap latin text strings + + src/cairo-pdf-operators.c | 73 +++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 65 insertions(+), 8 deletions(-) + +commit 7450a3c8a7843334d6e16af3ecef88915b5d9f26 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 19:18:28 2010 +0930 + + pdf-operators: fix bug that was causing unnecessary repositioning of text + + This optimizes the output to increase the maximum amount of text that + is emitted with a single Tj operator. + (cherry picked from commit 165a14b5646d582781d119874f549ec9a02d7f53) + + src/cairo-pdf-operators-private.h | 1 + + src/cairo-pdf-operators.c | 7 ++++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 43c93f2b101f534f8aa4213403af3281fcdc17fb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:41:28 2010 +0930 + + Fix font metrics in PDF Type 1 fonts + + edcefa87 introduced a bug in the Type 1 font metrics in PDF files. + (cherry picked from commit 3f817dcfd39ffdb73ac694fd90a47d9d3a42af74) + + src/cairo-type1-subset.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 165a14b5646d582781d119874f549ec9a02d7f53 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 19:18:28 2010 +0930 + + pdf-operators: fix bug that was causing unnecessary repositioning of text + + This optimizes the output to increase the maximum amount of text that + is emitted with a single Tj operator. + + src/cairo-pdf-operators-private.h | 1 + + src/cairo-pdf-operators.c | 7 ++++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit af3b550bc186361a0b6a779df0fc57799c3f163d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 18:07:01 2010 +0930 + + PDF: Add support for latin subsets + + Add support for Type 1 and TrueType latin subsets. + + CFF latin subsets are not yet implemented. + + src/cairo-cff-subset.c | 20 ++++ + src/cairo-pdf-surface.c | 191 ++++++++++++++++++++++---------- + src/cairo-scaled-font-subsets-private.h | 9 ++ + src/cairo-scaled-font-subsets.c | 11 +- + 4 files changed, 170 insertions(+), 61 deletions(-) + +commit 85c25d79f7e77ae35a68b9444609aef8d5397011 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 18:05:34 2010 +0930 + + TrueType subsetting: embed a cmap for latin subsets + + To support latin subsets in PDF, TrueType fonts require a cmap to map + unicode to glyph indices for all characters in the winansi encoding. + + src/cairo-scaled-font-subsets-private.h | 3 + + src/cairo-scaled-font-subsets.c | 7 +- + src/cairo-truetype-subset.c | 123 ++++++++++++++++++++++---------- + 3 files changed, 94 insertions(+), 39 deletions(-) + +commit 7c268bc8382350ab803eecb898d4650999a3a6bb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 18:01:07 2010 +0930 + + PS: Enable support for latin subsets + + Make PS TrueType embedding use the winansi glyph mapping for latin subsets. + + Enable use of latin subsets in PS. + + src/cairo-ps-surface.c | 32 ++++++++++++++++++++++++-------- + 1 file changed, 24 insertions(+), 8 deletions(-) + +commit 52f3db92a747eb694b94f28d6862abd573f3b378 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:58:40 2010 +0930 + + Type 1 fallback: add support for latin subsets + + For latin subsets the /Encoding array maps the latin encoding to the + font glyphs. + + src/cairo-type1-fallback.c | 27 +++++++++++++++++++++------ + 1 file changed, 21 insertions(+), 6 deletions(-) + +commit 4a0e5b7ced989b2c1a17757ba17142eb55e3924d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:58:20 2010 +0930 + + Type 1 subsetting: add support for latin subsets + + For latin subsets the /Encoding array maps the latin encoding to the + font glyphs. + + src/cairo-type1-subset.c | 32 ++++++++++++++++++++++++-------- + 1 file changed, 24 insertions(+), 8 deletions(-) + +commit 01ee091ee98bc0544d9a3d5665cdecddd8f368cc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:57:43 2010 +0930 + + Add winansi glyph names + + for the PS backend and Type 1 subsetters to use with latin fonts. + + src/cairo-scaled-font-subsets-private.h | 3 +- + src/cairo-scaled-font-subsets.c | 7 ++- + src/cairo-type1-subset.c | 92 +++++++++++++++++++++++++++++++++ + 3 files changed, 100 insertions(+), 2 deletions(-) + +commit e62891cd8f27b62c3ee04d822524c9cee69a2e62 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:55:53 2010 +0930 + + Return latin to glyph mapping in cairo_scaled_font_subset_t + + so that font subsetters can include the latin to glyph encoding in the + subsetted font. + + src/cairo-scaled-font-subsets.c | 22 +++++++++++++++++++++- + src/cairoint.h | 2 ++ + 2 files changed, 23 insertions(+), 1 deletion(-) + +commit 807e690de4fda63a42a49a4342b563a6d54377ce +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:55:02 2010 +0930 + + pdf-operators: output (abc) style strings when font is latin + + src/cairo-pdf-operators-private.h | 1 + + src/cairo-pdf-operators.c | 57 ++++++++++++++++++++++++++++----------- + 2 files changed, 43 insertions(+), 15 deletions(-) + +commit f1ca978032e973c4dc5cfa385074dea675a6c76d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:53:11 2010 +0930 + + Add capability for font subsets to put latin glyphs in a separate subset + + This is required to allow PDF/PS output to use "(this is ascii)" style + strings that can be post processed by applications like psfrag. It + will also reduce the file size when a large amount of latin text is + used due to the 8-bit encoding instead of the 16-bit used for CID + fonts. + + The winansi encoding (CP1252) is used for the latin subset as this is + a standard PDF encoding. Some PDF readers have buggy support for non + standard PDF 8-bit encodings. + + src/cairo-scaled-font-subsets-private.h | 13 ++ + src/cairo-scaled-font-subsets.c | 306 ++++++++++++++++++++++---------- + 2 files changed, 228 insertions(+), 91 deletions(-) + +commit 3f817dcfd39ffdb73ac694fd90a47d9d3a42af74 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 1 17:41:28 2010 +0930 + + Fix font metrics in PDF Type 1 fonts + + edcefa87 introduced a bug in the Type 1 font metrics in PDF files. + + src/cairo-type1-subset.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 877bc14eaf188ddf5ca747a0b7c808cccd2d1c5f +Merge: 7b308fd 66ace8c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 29 13:57:36 2010 +0100 + + Merge branch '1.10' + +commit 66ace8cd33c0ebe88972f0c4d5c0effeacb1cea3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 29 13:46:02 2010 +0100 + + image: The a8 in-place span compositing is only valid for SOURCE + + Fixes test/a8-clear. + + Reported-by: Jeremy Moles <jeremy@emperorlinux.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 05faebd5845c68005f5b96428952faae5a67208f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 29 13:23:24 2010 +0100 + + test: Add a8-clear + + Reported-by: Jeremy Moles <jeremy@emperorlinux.com> + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/Makefile.am | 1 + + test/Makefile.sources | 1 + + test/a8-clear.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ + test/a8-clear.ref.png | Bin 0 -> 271 bytes + 4 files changed, 66 insertions(+) + +commit ac6fd51fe4e500973e0939983d00aa81c8acf556 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 29 13:25:08 2010 +0100 + + image: Silence a compile warning + + cairo-image-surface.c: In function ‘_cairo_image_reset_static_data’: + cairo-image-surface.c:1006: warning: old-style function definition + + Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7b308fdcc9cda8291176f1f614fe416d80e330dd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 24 11:31:03 2010 +0100 + + version: 1.11.1 + + Mark the opening of master for new development work. A few quiets have + passed since 1.10 with no major brown bag incident, so lets start + harvesting the work for 1.12. + + Go Andrea, go! + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 75e2b7c7b52be6663fac05925b9b4cc5f3b42f9f +Author: Tim Janik <timj@gtk.org> +Date: Thu Sep 23 13:55:11 2010 +0200 + + cairo: docu fix for cairo_set_source_surface + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4cf5260e99e3e7588e45ee179c57b75588b95987 +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Sun Sep 12 10:36:27 2010 +0900 + + xml: fix a typo to correct the indentation after <path></path> + + Signed-off-by: Kouhei Sutou <kou@cozmixng.org> + + src/cairo-xml-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f070bd5ff9ad17b90852e8a7ba102c6b4b050f6 +Author: Tomáš Chvátal <scarabeus@gentoo.org> +Date: Sat Sep 11 22:55:23 2010 +0200 + + Fix posix calls in configure.ac test code. + + Fixes https://bugs.gentoo.org/show_bug.cgi?id=336779 + + Signed-off-by: Tomáš Chvátal <scarabeus@gentoo.org> + + configure.ac | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f59771051badc2ea708437c5faa27d0895f787d6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 18 08:48:36 2010 +0100 + + drm: Add missing header file for tarball + + src/Makefile.sources | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 8fca990be7fca609e834703e60dd888c13fc637f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 10 13:35:11 2010 +0100 + + cairo: Remove trailing comma from cairo_device_t + + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=30115 + Reported-by: Murray Cumming <murrayc@murrayc.com> + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 291876ad3477330143bbb814ea72c658dc8ca584 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Sep 9 22:53:38 2010 +0200 + + test: do not leak resources + + Silence some leak reports by check-valgrind. + + test/subsurface-outside-target.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8fda4ab1cc7f60196b232d194c33e592ecdec9b5 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Aug 26 11:15:46 2010 +0200 + + image: add _cairo_image_reset_static_data + + Image has static caches which needs to be reset to make + cairo_debug_reset_static_data behave as expected. + Silences a bunch of leak reports by check-valgrind. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + src/cairo-debug.c | 2 ++ + src/cairo-image-surface.c | 42 ++++++++++++++++++++++++++++++++++-------- + src/cairoint.h | 3 +++ + 3 files changed, 39 insertions(+), 8 deletions(-) + +commit ca775cbf5a7245092cabdda43db9d06e96613ff4 +Author: Andrea Canciani <ranma42@gmail.com> +Date: Thu Aug 26 11:13:51 2010 +0200 + + test: do not leak resources + + Silence two leak reports by check-valgrind. + + Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> + + test/linear-gradient-large.c | 1 + + test/nil-surface.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 2b6c4c2a64c585cb815089e83719e00b1cfc985f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Sep 9 11:28:03 2010 +0200 + + recording: Document CAIRO_HAS_RECORDING_SURFACE macro + + src/cairo-recording-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit d8f88cf3f97af6771a4d77bf81e1025eb7bcfd1d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Sep 9 11:00:42 2010 +0200 + + recording: Fix cairo_recording_surface_create() doc comments + + The name of the parameters in the docs should match the name of the + function parameters. Added also return value docs. + + src/cairo-recording-surface.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 737880260f1895667baf25bcc6814052e6a6a027 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Sep 9 10:57:13 2010 +0200 + + recording: Add section doc comments + + src/cairo-recording-surface.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 1ddc1bfa01e4c17001504c886bc5fb97625f5861 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Sep 9 10:54:50 2010 +0200 + + doc: Add section for recording surface + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 7 +++++++ + 2 files changed, 8 insertions(+) + +commit a48eccbf77874e00a57ab7f1ab96ed0f359b3963 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 7 13:58:29 2010 +0100 + + configure: Fix typo "(requires both --enable-xcb)" + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit faeb6caaeba76c9797db0cd917bff4f102512d59 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 6 18:40:27 2010 +0100 + + version: 1.10.1 open for bugfixing + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.pre-1.2 b/ChangeLog.pre-1.2 new file mode 100644 index 000000000..4998eb521 --- /dev/null +++ b/ChangeLog.pre-1.2 @@ -0,0 +1,11746 @@ +commit 61404bd5022b913f58ecda8dc9e8922b4fc6f80b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 27 15:44:52 2006 +0200 + + Update version to 1.2.0 and add notes to NEWS file. + + Also update libtool version information to 11:0:9. + + NEWS | 40 ++++++++++++++++++++++++++++++++++++++++ + ROADMAP | 8 ++++---- + configure.in | 8 ++++---- + 3 files changed, 48 insertions(+), 8 deletions(-) + +commit cea70741e851993fe181a76872fb97549d0769d5 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 03:24:21 2006 +0200 + + Add src/cairo-features.h and test/*.ps to CLEANFILES + + src/Makefile.am | 2 +- + test/Makefile.am | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 55b5fedbc1df32e4dc9d1fccf40e12e14f7b6cd0 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 02:54:22 2006 +0200 + + Add many references images (and a font) missing from EXTRA_DIST + + test/Makefile.am | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 74 insertions(+), 3 deletions(-) + +commit 3d4a8fd741df328bd969454791163bc945d3ad8b +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 02:53:26 2006 +0200 + + Don't remove INSTALL during maintainer-clean + + Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit cfddf93afb692819548adb85c5b75f60be7e7349 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jul 1 01:55:12 2006 +0200 + + Make CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD not crash on surface patterns, + + but return error. + + src/cairo-surface.c | 30 ++++++++++++++++++++++++++++++ + src/cairo.h | 5 +++-- + 2 files changed, 33 insertions(+), 2 deletions(-) + +commit 01b1f3572c3c15a08dd6f32788106c0e42fd2436 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 22:01:24 2006 +0200 + + Detect and report crashes in tests. + + test/cairo-test.c | 59 +++++++++++++++++++++++++++++++++++++++++++------------ + test/cairo-test.h | 3 ++- + 2 files changed, 48 insertions(+), 14 deletions(-) + +commit 19c4700101bfce7d73a50017021b4ec198ddd783 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 01:05:30 2006 +0200 + + Even _more_ valgrind suppresions for Xrm (XrmGetFileDatabase this time) + + test/.valgrind-suppressions | 190 ++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 176 insertions(+), 14 deletions(-) + +commit 84b06eed4e53eb34b0ec378216fa246286998acd +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 00:47:59 2006 +0200 + + SVG: Fix leak in _cairo_svg_surface_mask + + src/cairo-svg-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 35ec5747ca5eb8a63ec334d61eb13357b4aa3802 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 00:38:06 2006 +0200 + + Add yet another XrmGetStringDatabase valgrind suppression. + + test/.valgrind-suppressions | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 80cb0d5ba1e3622b4b71639cf03e7dc277cbb457 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 00:37:44 2006 +0200 + + Fix some leaks in the test suite itself. + + test/cairo-test.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 14e7883fae58e51c2deab5b97c9a405c5dbb3aeb +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 00:00:43 2006 +0200 + + Fix a memory leak by removing accidentally duplicated code. + + test/cairo-test.c | 5 ----- + 1 file changed, 5 deletions(-) + +commit 8919b6b3243db5db59a73f804854364a00a8586d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 23:24:23 2006 +0200 + + Add valgrind suppressions for pthread initialization still reachable/possibly lost memory + + test/.valgrind-suppressions | 39 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 39 insertions(+) + +commit 98cc1651cf19699a0c90e8e2e7f2c2da2ae83760 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 23:21:06 2006 +0200 + + Add valgrind suppressions for still-reachable memory from XGetDefault and XrmGetStringDatabase + + test/.valgrind-suppressions | 142 ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 142 insertions(+) + +commit f6b10a6aabb121e1a4ca092ca175aad39b3c828d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 23:06:56 2006 +0200 + + Add another suppression due to mysterious occurences in libc + + test/.valgrind-suppressions | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit c6c943f3cfefa535e6c2da6adcac15507a8f0952 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 23:00:39 2006 +0200 + + ps: Fix to not walk off the end of the data array. + + This fixes a bug recently introduced with the special case for the ~> sequence. + + src/cairo-ps-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 0853ccd05314d618afd0d640a33f0a744842a0d2 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 22:58:36 2006 +0200 + + Add new libz/libpng suppressions. + + It would appear we have to keep updating these for new library versions. + + test/.valgrind-suppressions | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit ee75e1e6853ada5c4218788148e2f5a09669a2b3 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 17:07:42 2006 +0200 + + Add ps-specific reference image for test/degenerate-path + + test/degenerate-path-ps-argb32-ref.png | Bin 0 -> 197 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit e0db22c6bc40d4576d9c1131d3192f1df3b942ca +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 16:54:16 2006 +0200 + + ps: Fix degenerate-path test failure. + + This is as simple as simply not emitting any degenerate sub-paths when the cap + style is CAIRO_LINE_CAP_SQUARE or CAIRO_LINE_CAP_BUTT. + + src/cairo-ps-surface.c | 84 ++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 68 insertions(+), 16 deletions(-) + +commit 057c0abeea1ee80c7156be5a1c15594765d88fe0 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 30 16:07:11 2006 +0200 + + ps: Fix transformation of source surfaces. + + This makes the following four tests pass, (which were previously + failing on the ps backend). + + move-to-show-surface + scale-source-surface-paint + source-surface-scale-paint + translate-show-surface + + src/cairo-ps-surface.c | 63 +++++++++++++++++++++++++++++++------------------- + 1 file changed, 39 insertions(+), 24 deletions(-) + +commit 54ce585817d78ffeeb0ba6b03b868e63b9552cb8 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 23:34:29 2006 +0200 + + Update PDF-specific reference image for scale-source-surface-paint + + test/scale-source-surface-paint-pdf-argb32-ref.png | Bin 152 -> 182 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a6fc321d1793e97e4601429a98c36bed9af365a0 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 23:28:48 2006 +0200 + + Add PDF-specific reference image for paint-source-alpha + + test/paint-source-alpha-pdf-argb32-ref.png | Bin 0 -> 475 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit aaef92f8307fedd864fca66054b06c8bfe7ae40d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 23:27:05 2006 +0200 + + Add PDF-specific reference image for composite-integer-translate-over + + .../composite-integer-translate-over-pdf-argb32-ref.png | Bin 0 -> 12946 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 45ebf2d1f3c6cb4588c3bebf6acf1818eb723515 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 01:45:47 2006 +0200 + + Fix an oops. + + src/cairo-xlib-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit e5d18d7696eb9a48369b89517738dbaa101106d7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 01:44:55 2006 +0200 + + Use $no_x in configure.in. + + configure.in | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 6c3deb0be1b9d6db0104af02fb193849a8329133 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 01:33:14 2006 +0200 + + Minor doc syntax fixes. + + src/cairo-surface.c | 2 +- + src/cairo.h | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 8860263c6a18a0b196e2b462a538dfc166fbea04 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 01:29:54 2006 +0200 + + Remove CAIRO_SVG_VERSION_LAST from public header file. + + src/cairo-svg-surface.c | 8 ++++++-- + src/cairo-svg.h | 13 ++++++++++--- + 2 files changed, 16 insertions(+), 5 deletions(-) + +commit 6672529541e01b0da53fff279cb1f8030c931ffb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 00:58:01 2006 +0200 + + Hook some more symbols into docs. + + doc/public/cairo-sections.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit 66436d132772af627447a929ced3a8a18cc6915f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 30 00:46:48 2006 +0200 + + Update lots of docs. + + doc/public/Makefile.am | 9 ++++- + doc/public/cairo-sections.txt | 90 ++++++++++++++++++++++++------------------- + src/cairo-pdf-surface.c | 10 ++--- + src/cairo-ps-surface.c | 16 ++++---- + src/cairo-svg-surface.c | 14 +++---- + src/cairo-win32-font.c | 19 ++++++++- + src/cairo-win32-surface.c | 3 ++ + src/cairo-xlib-surface.c | 72 ++++++++++++++++++++++++++++++++++ + src/cairo.h | 18 ++++----- + 9 files changed, 177 insertions(+), 74 deletions(-) + +commit de939f52061ba9a1c739c193e3e4f549668855cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 29 18:54:02 2006 +0200 + + Require gtk-doc 1.6, and make it ignore cairo_public and cairo_private + + decorators. + + configure.in | 2 +- + doc/public/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 647ca37ca3d4b1954f7400deeeaaf245b5c90e69 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 29 18:47:35 2006 +0200 + + Mark enum additions as "Since 1.2" too. + + src/cairo.h | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 320ce67d630e4aac1f0007982aef27c831b04b66 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 29 18:36:53 2006 +0200 + + Add "Since: 1.2" to docs for most new API functions. + + src/cairo-font.c | 2 ++ + src/cairo-image-surface.c | 6 ++++++ + src/cairo-pattern.c | 2 ++ + src/cairo-pdf-surface.c | 6 ++++++ + src/cairo-ps-surface.c | 14 +++++++++++++- + src/cairo-scaled-font.c | 12 ++++++++++++ + src/cairo-surface.c | 14 +++++++------- + src/cairo-svg-surface.c | 14 ++++++++++---- + src/cairo.c | 14 ++++++++++++++ + 9 files changed, 72 insertions(+), 12 deletions(-) + +commit bd92eb7f3c58fdcbe05f67b9a879798246c616bc +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 19:47:26 2006 +0200 + + Move device_transform of path to before floating->fixed conversion. + + This is an attempt to fix the following bug: + + http://bugzilla.gnome.org/show_bug.cgi?id=332266 + + With the recent rewrite of the device-offset code, which pushed things + from the gstate to the surface layer, the 16-bit limitations on coordinates + which previously applied to device space only, have lately been applying to + user space. This commit moves the device_transform back up above the conversion + from floating-point to fixed-point values so that once again the limitation + only applies to device space. + + src/cairo-clip.c | 10 -------- + src/cairo-gstate.c | 8 ++++--- + src/cairo-surface-fallback.c | 1 + + src/cairo-surface.c | 54 +++++++++++++++++++------------------------- + src/cairo-xlib-surface.c | 1 + + src/cairoint.h | 1 + + 6 files changed, 31 insertions(+), 44 deletions(-) + +commit 29caf8915f822778f0e59add7d364a03bcdb8327 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 29 16:09:46 2006 +0200 + + Fix support for non-pkg-config cflags and libs (needed for supporting + freetype-config) + + configure.in | 20 ++++++++++++-------- + src/cairo-backend.pc.in | 4 ++-- + 2 files changed, 14 insertions(+), 10 deletions(-) + +commit 195b1142e7a1652e0f65cfd822bba7ea8b6ba505 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 29 15:22:44 2006 +0200 + + Prefix "cairo_*_test_*" symbols with underscore. + + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-pdf-test.h | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-ps-test.h | 4 ++-- + src/cairo-scaled-font-test.h | 4 ++-- + src/cairo-scaled-font.c | 2 +- + src/cairo-svg-surface.c | 4 ++-- + src/cairo-svg-test.h | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo-xlib-test.h | 4 ++-- + test/fallback-resolution.c | 6 +++--- + test/glyph-cache-pressure.c | 2 +- + test/xlib-surface.c | 2 +- + 13 files changed, 24 insertions(+), 24 deletions(-) + +commit f26da6c464c60ab2ed87175ab0a9b81e3cf363fb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 29 12:32:58 2006 +0200 + + Remove cairo_public from source files. + + src/cairo-atsui-font.c | 2 +- + src/cairo-svg-surface.c | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 8effd25c1b05607ff6501821f1d80745677d8e72 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 06:25:24 2006 +0200 + + Update PDF and PS reference images for test/text-pattern. + + test/text-pattern-pdf-argb32-ref.png | Bin 0 -> 1632 bytes + test/text-pattern-ps-argb32-ref.png | Bin 0 -> 1681 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit a64b946ee0512d85d3c790c67aad8a882c5c3533 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 06:24:44 2006 +0200 + + Mark test/leaky-dash as an expected failure. + + test/Makefile.am | 1 + + test/leaky-dash.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 734e10709f5c62c0b64e51a03df8e109e7eebe0d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 06:12:48 2006 +0200 + + Add several more stress tests to test/dash-zero-length + + test/dash-zero-length-ps-argb32-ref.png | Bin 214 -> 272 bytes + test/dash-zero-length-ref.png | Bin 235 -> 238 bytes + test/dash-zero-length-rgb24-ref.png | Bin 222 -> 218 bytes + test/dash-zero-length.c | 85 +++++++++++++++++++++----------- + 4 files changed, 56 insertions(+), 29 deletions(-) + +commit 8aa306caac99ebe074a6cde8b424b1780cafefee +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 05:13:37 2006 +0200 + + PS: Fix for dash-zero-length + + src/cairo-ps-surface.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 75 insertions(+), 4 deletions(-) + +commit 7285499700a4f0f4bb95f003d0c730246bf3eabd +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 05:07:51 2006 +0200 + + Squelch some bogus compiler warnings about possibly uninitialized values. + + pixman/src/fbcompose.c | 9 +++++---- + src/cairo-font-subset.c | 4 ++-- + 2 files changed, 7 insertions(+), 6 deletions(-) + +commit 20e3a99bbaa2624ecad7b505158edc8dce706ea8 +Author: Keith Packard <keithp@neko.keithp.com> +Date: Thu Jun 29 04:10:35 2006 +0200 + + Skip TrueType font output for PS/PDF until it handles vertical layout. + + The TrueType font subsetting code fails to emit VHEA/VMTX headers for the + font, so WMode 1 doesn't work to switch to vertical metrics. Added a bug + about this, and changed the PS/PDF output code to just use Type3 in this + case until the bug is fixed. Updated the reference images to match the + output for PDF/PS backends for the vertical font check. + + BUGS | 7 +++++++ + src/cairo-font-subset.c | 3 +++ + src/cairo-ft-font.c | 16 +++++++++++++++- + src/cairo-ft-private.h | 3 +++ + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 1018 -> 956 bytes + test/ft-text-vertical-layout-pdf-rgb24-ref.png | Bin 1037 -> 0 bytes + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 351 -> 349 bytes + test/ft-text-vertical-layout-ps-rgb24-ref.png | Bin 1086 -> 0 bytes + 8 files changed, 28 insertions(+), 1 deletion(-) + +commit 2e2799d4f921b22030eb63585dcec2ed4503fd5b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 02:41:46 2006 +0200 + + Ignore degenerate-path + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit c90cc4e33f1549cde1d7a6a94599dbb3de84d387 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 29 02:41:17 2006 +0200 + + Update reference images for ft-text-vertical-layout + + test/ft-text-vertical-layout-ref.png | Bin 1130 -> 1130 bytes + test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 1100 -> 1098 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 92021d169fea48eed9349e5821353f976df56be1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 28 04:14:07 2006 +0200 + + Make docs not build by "make all", but by "make doc", "make dist", and "make + install". + + Makefile.am | 4 ++++ + doc/Makefile.am | 4 +++- + doc/public/tmpl/cairo-types.sgml | 4 +--- + doc/public/tmpl/cairo-version.sgml | 7 +++++++ + gtk-doc.make | 8 ++++++-- + 5 files changed, 21 insertions(+), 6 deletions(-) + +commit 0d073c2e86ced3a94ef76e7e4c2a00f8fb76efb1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 28 03:25:08 2006 +0200 + + Use $RELEASE_OR_SNAPSHOT to determine upload directory. + Turn distcheck on release-check on again, as CAIRO_TEST_TARGET="" can be used + to disable all failures now. + + Makefile.am | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit b37562868d2254d2dbd93a8808d32f0a0d769195 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 28 03:16:33 2006 +0200 + + Ignore *.bak + + doc/public/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 9fe0ea16d344d5b9bed1cd7f6046e378ce76ae1f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 28 03:15:41 2006 +0200 + + Update list of ignored header files. + + doc/public/Makefile.am | 44 ++++++++++++++++++++++++++++---------------- + 1 file changed, 28 insertions(+), 16 deletions(-) + +commit ddb81d3cade326fecfe1ed05037542e958e734b5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 27 16:55:53 2006 +0200 + + Report Xlib Xrender status. + + configure.in | 29 +++++++++++++++-------------- + 1 file changed, 15 insertions(+), 14 deletions(-) + +commit 34f24d2aad90d4a737b513ac6858ed879316e132 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 27 15:38:45 2006 +0200 + + ROADMAP: Note that degenerate path stuff has been pushed out now. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 988a28e259924e7ce50f4d3119bcef7a3b18c931 +Merge: 973c9ab ce2b9e1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 27 15:37:58 2006 +0200 + + Merge branch 'degenerate-path' into cairo + +commit 973c9abd53df4e6d6583de045514e003827bc7b9 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jun 27 15:33:47 2006 +0200 + + PS: Workaround to avoid splitting final ~> terminating sequence. + + src/cairo-ps-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 5d60ceb9b85a6b39865bc760ef7467c10f2ec7b6 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Mon Jun 26 22:27:14 2006 -0700 + + Added major updates fixes and enhancements by + Claudio Ciccani klan@directfb.org + Almost a full rewrite + + src/cairo-directfb-surface.c | 2175 +++++++++++++++++++++++++++++------------- + 1 file changed, 1523 insertions(+), 652 deletions(-) + +commit 289e8b8af30ae3f00e7649109a933a673f346b37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 26 12:26:15 2006 +0200 + + Remove config.cache in make distclean. + + Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 73a0e792b4115a1012c5f618650a6265377cc6e5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 26 12:21:18 2006 +0200 + + More configure foo fixes for .pc files. + + configure.in | 14 ++++++++------ + src/Makefile.am | 9 ++++++++- + src/cairo-backend.pc.in | 4 ++-- + 3 files changed, 18 insertions(+), 9 deletions(-) + +commit 5ba974ea0b7974e8c985d7414fcf6a8a5e415c12 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 26 11:54:04 2006 +0200 + + Fix circular dependency in cairo.pc and cairo-xlib.pc. + + configure.in | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 53a478d233e7b8e02ecbc93bf102fb4dc29e0d57 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 25 17:43:27 2006 +0200 + + Rewrite configure caching. + + configure.in | 285 +++++++++++++++++++++++++------------------------------- + src/cairo.pc.in | 2 +- + 2 files changed, 128 insertions(+), 159 deletions(-) + +commit ce2b9e1b5cc816e4a6a4345daab539cc58e2d043 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 16:57:59 2006 +0200 + + Prefer TRUE and FALSE over 1 and 0 for assigning cairo_bool_t values + + src/cairo-path-stroke.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 58a60ed9fdd53a4cf29d33624b866bf6ccd637ae +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 16:53:13 2006 +0200 + + Prefer sub-path over subpath in documentation. + + src/cairo.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 773cb6475b68199e5ef0839cd22c9f3445d7d5d3 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 16:51:25 2006 +0200 + + Prefer sub_path over subpath in identifiers. + + src/cairo-path-stroke.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 8f0dd658b1fff3f4e9225b8fb23884f0bbcdb822 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 16:49:45 2006 +0200 + + Add documentation for how degenerate segments and sub-paths are treated. + + src/cairo.c | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +commit 15caa88c6416ce8e0c4c026e76f84ccaf7a3c840 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jun 25 16:12:38 2006 +0200 + + Initial support for degenerate-path stroking + + This follows the PDF and SVG specifications which only draw degenerate paths when + round caps are in effect. + + With this commit, the degenerate-path test passes with the image, xlib, and pdf + backends, (but still fails with ps and svg backends). + + src/cairo-path-stroke.c | 54 +++++++++++++++++++++++++++++++------------------ + 1 file changed, 34 insertions(+), 20 deletions(-) + +commit 20df4af12617ad6459dcb234dfd98954282710f5 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jun 25 15:48:48 2006 +0200 + + Add new test case degenerate-path to show current 'bug' + + test/Makefile.am | 4 +++ + test/degenerate-path-ref.png | Bin 0 -> 193 bytes + test/degenerate-path-rgb24-ref.png | Bin 0 -> 174 bytes + test/degenerate-path.c | 68 +++++++++++++++++++++++++++++++++++++ + 4 files changed, 72 insertions(+) + +commit e747bbd350e9630c18849dd7975036d1260264be +Author: Torsten Schoenfeld <kaffeetisch@gmx.de> +Date: Sun Jun 25 15:07:19 2006 +0200 + + Fix build after recent pixman.h change. + + The recent pixman.h change to use configure-generated defines + accidentally broke the build. Pulling in config.h fixes it. + + pixman/src/pixman.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e32138aa93ba37d760af87294fbb47046bfe6dec +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 14:42:27 2006 +0200 + + Prefer using configure-generated variable for finding stdint.h or similar. + + We were doing something more complicated originally, and that was because + pixman.h was an installed public header file at one time. But that hasn't + been the case for quite a long time. + + pixman/src/pixman.h | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 14ffde038038deda66973856a5f3b9442c8d3c7d +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 12:16:36 2006 +0200 + + ROADMAP: Note that bug 6759 is now fixed. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d2ea21b4aef8ab5338718ddd6ccdff35609e9f6c +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 11:48:32 2006 +0200 + + ft-text-antialias-none: Update reference images and igore list. + + Add a new ps reference image due to slightly different rasterization. Also + update pdf and svg backends to ignore this test since those backends do not + support ANTIALIAS_NONE. + + Note in ROADMAP that bug 6759 is fixed now. + + test/cairo-test.c | 2 ++ + test/ft-text-antialias-none-ps-argb32-ref.png | Bin 0 -> 335 bytes + 2 files changed, 2 insertions(+) + +commit 7e0e503fba80767dc68556054e937123fdcea359 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 11:32:36 2006 +0200 + + xlib: Fix failure path to do cache thawing cleanup. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4bff3d559e1d931cd47701f11765b1a574a7eac4 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 11:28:03 2006 +0200 + + ROADMAP: Note that cairo_xlib_surface_get_width/height exist now. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ddead8e0612162e121868ba561498b8565112f8b +Author: Robert O'Callahan <rocallahan@novell.com> +Date: Wed Jun 21 15:47:03 2006 +1200 + + Surface size getters for xlib + + When accessing the underlying drawable etc of an xlib surface, it is + also helpful to be able to get the width and height without a server + round trip. This patch provides those functions. + + src/cairo-xlib-surface.c | 26 ++++++++++++++++++++++++++ + src/cairo-xlib.h | 6 ++++++ + test/xlib-surface.c | 7 ++++++- + 3 files changed, 38 insertions(+), 1 deletion(-) + +commit 113bef399a2ca27f4c49a3d917ac1e6075449616 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 11:20:50 2006 +0200 + + ROADMAP: Note that bug 6617 might already be fixed. + + ROADMAP | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 9ab5678e53219f95de7183e300bba3edac7fe72d +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 10:02:10 2006 +0200 + + Fix bug 7268: Fix coordinate space for _cairo_surface_get_extents + + Previously this function was attempting to return values in surface + space, (but even then it was doing it wrong). However, all callers + actually expect values in backend space. Fixing this cleans up bug + 7268 quite nicely. + + ROADMAP | 2 +- + src/cairo-surface.c | 31 +++++++++++++------------------ + 2 files changed, 14 insertions(+), 19 deletions(-) + +commit 95355c854f1894e7bbcd370f3bb0d00223c077b6 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 02:25:16 2006 +0200 + + ROADMAP: Note that SVG bitmap glyphs now work. Move some bugs to a punt list. + + ROADMAP | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 4c7074ceb42c50fc55929291330658f693c66bc7 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jun 25 02:23:14 2006 +0200 + + Remove comment which had been incorrectly copied + + src/cairo-ft-font.c | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +commit 3a313070e5b5a1168225dec008f63ff68ed20559 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri Jun 23 20:13:58 2006 +0200 + + SVG: fix bit order for bitmap font data and use a group with matrix + + transformation instead of applying the same matrix on each rect + coordinates. + + src/cairo-svg-surface.c | 55 +++++++++++++++++++++---------------------------- + 1 file changed, 23 insertions(+), 32 deletions(-) + +commit 8b6fcaf8ff17786ab5394a4aa2d6289f5d9601c2 +Author: Jonathon Jongsma <jonathon.jongsma@gmail.com> +Date: Fri Jun 23 08:29:17 2006 -0500 + + Fix a minor documentation typo in cairo_pop_group_to_source + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bfa133f9e6dbe511ab696cb1d4b1cea59451f1c1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 22 22:39:39 2006 -0700 + + ROADMAP: Note that bug 6955 is fixed. + + ROADMAP | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5488c3b462260126a000928aa599684d7b1041e7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 22 22:38:17 2006 -0700 + + xlib: Prefer BAIL over FAIL when the cleanup code is also used in succesful cases. + + src/cairo-xlib-surface.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit 7e457cb4c1e69670f27e3e8e134a9e32a8f75788 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 22 22:32:57 2006 -0700 + + Bug 6955: Fix by adding freeze/thaw around scaled_font glyph cache in _cairo_xlib_surface_show_glyphs + + src/cairo-scaled-font.c | 12 ++++++++++++ + src/cairo-xlib-surface.c | 15 ++++++++++++++- + src/cairoint.h | 6 ++++++ + test/glyph-cache-pressure.c | 7 +++++++ + 4 files changed, 39 insertions(+), 1 deletion(-) + +commit 6a58658b73924fa6897bd1e290d754ce1df44b0d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 22 22:05:20 2006 -0700 + + Add test/glyph-cache-pressure to demonstrate xlib failure (bug 6955) + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/glyph-cache-pressure-pdf-argb32-ref.png | Bin 0 -> 2879 bytes + test/glyph-cache-pressure-ps-argb32-ref.png | Bin 0 -> 591 bytes + test/glyph-cache-pressure-ref.png | Bin 0 -> 3223 bytes + test/glyph-cache-pressure-svg-argb32-ref.png | Bin 0 -> 3635 bytes + test/glyph-cache-pressure-svg-rgb24-ref.png | Bin 0 -> 3165 bytes + test/glyph-cache-pressure.c | 89 +++++++++++++++++++++++++++ + 8 files changed, 92 insertions(+) + +commit 333ac8f4d9ccc356cb91e7118ed56bfc07e78c2f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 22 22:03:06 2006 -0700 + + Add 'private' cairo_scaled_font_test_set_max_glyphs_cached_per_font for testing + + src/Makefile.am | 1 + + src/cairo-scaled-font-test.h | 49 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-scaled-font.c | 17 ++++++++++++++- + 3 files changed, 66 insertions(+), 1 deletion(-) + +commit d5197c1e0defc1018320efcb461977557a7d5d6e +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Jun 22 22:32:47 2006 +0200 + + SVG: dumb implementation of bitmap glyphs. + + Bitmap glyphs are emited as tiny svg rectangles. An improvement would be + to calculate glyph outline from bitmap data. + + src/cairo-svg-surface.c | 39 ++++++++++++++++++++++++++++++++------- + 1 file changed, 32 insertions(+), 7 deletions(-) + +commit cd5eb70e4e45962c88b4bfe13de6f26211601e55 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 21 22:36:27 2006 -0700 + + ROADMAP: Update with 1.1.10 notes as well as new blockers and fixes + + ROADMAP | 23 +++++++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +commit 25e0acfee0ae790329c2f558ce6a9f997eeace6d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 21 17:23:35 2006 -0700 + + PDF: Fix display of bitmapped glyphs (bitmap-font test now passes) + + src/cairo-pdf-surface.c | 37 ++++++++++++++++++++++++++++++++----- + 1 file changed, 32 insertions(+), 5 deletions(-) + +commit b4720ca51d4b1de02d6beb898b7d04a33e1d99fd +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 23:12:58 2006 -0700 + + PDF: Push glyph stream creation down from emit glyph to outline/bitmap variants + + src/cairo-pdf-surface.c | 42 +++++++++++++++++++++++++----------------- + 1 file changed, 25 insertions(+), 17 deletions(-) + +commit 83a8a50735746a4591c3bcc1aaa46fb7a0f87224 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 21 19:57:40 2006 -0400 + + Pass --cache-file=config.cache and --disable-static to configure from + autogen.sh. + + autogen.sh | 2 +- + src/Makefile.am | 6 ++++++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit f5ee9557c3dc7bc72098cd08698f147ed685ccb2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 21 07:22:50 2006 -0400 + + Removed excess mkdir. + + configure.in | 1 - + 1 file changed, 1 deletion(-) + +commit f71313d427565cb37a25393ff8a5a2ffdcfb798b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 21 07:00:34 2006 -0400 + + Minor refinements, mostly to configure.in. + + configure.in | 113 ++++++++++++++++++++++++++++++------------------------- + test/.gitignore | 1 + + test/Makefile.am | 3 +- + 3 files changed, 65 insertions(+), 52 deletions(-) + +commit c88bab66ab258e0bbd2cb80eaf4edc9e5f1ad6f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 21 06:25:01 2006 -0400 + + Make configure generate cairo-features.h. Generate AC_DEFINE and AM_CONDITIONALS + + for all CAIRO_HAS_* in CAIRO_BACKEND_ENABLE. + + configure.in | 198 +++++++++++++++++++++++------------------------- + src/Makefile.am | 2 + + src/cairo-features.h.in | 86 --------------------- + 3 files changed, 96 insertions(+), 190 deletions(-) + +commit c6c1da2a2346de6c1df82fab2e7bafec7f37db50 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 17:49:05 2006 -0700 + + PS: Add support for emitting bitmapped glyphs into type3 fonts. + + The bitmap-font now passes when run against the ps backend. + + src/cairo-ps-surface.c | 45 +++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 39 insertions(+), 6 deletions(-) + +commit cca08d9bce1647444acdb78aedb6ad6967c07661 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 17:48:06 2006 -0700 + + New bitmap-font test with bundled 6x13 font. + + The 6x13 font is a public-domain terminal font from the X + distribution. + + test/.gitignore | 1 + + test/6x13.pcf | Bin 10560 -> 5239 bytes + test/Makefile.am | 3 ++ + test/bitmap-font-ref.png | Bin 0 -> 552 bytes + test/bitmap-font-rgb24-ref.png | Bin 0 -> 513 bytes + test/bitmap-font.c | 106 +++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 110 insertions(+) + +commit ab8ae66f9d5c92af96b4a530957537ec7d33c128 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 17:15:07 2006 -0700 + + SVG: Fix to not crash on bitmapped glyphs + + This is similar to a change that was recently made to the PDF and PS backends. + Bitmap glyphs are not yet drawn correctly, (drawn as filled rectangles instead), + but the crash is at least eliminated. + + src/cairo-svg-surface.c | 87 +++++++++++++++++++++++++++++++++++------------- + test/6x13.pcf | Bin 0 -> 10560 bytes + 2 files changed, 63 insertions(+), 24 deletions(-) + +commit 2f43a79e4e87341dd0df49fc6c11fd17a21350c2 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 11:28:23 2006 -0700 + + ft-font: Use compile-time test (WORDS_BIGENDIAN) rather than run-time function to test endian-ness. + + src/cairo-ft-font.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +commit b806b50cfe890b534dbf86f0b4d2cc0c22b880ff +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 10:59:22 2006 -0700 + + Add new CAIRO_BITSWAP8 macro for swapping the bits within a byte. + + This uses a technique devised by Sean Anderson, July 13, 2001 as found + at http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits + This technique uses 3 multiplies rather than just shifts and masks, but + performance seems comparable to the old approach, (but more significantly, + the new approach is easier to implement as a macro, and I plan to start + using this bit-swapping elsewhere very soon). + + src/cairo-ft-font.c | 9 +++------ + src/cairoint.h | 12 ++++++++++++ + 2 files changed, 15 insertions(+), 6 deletions(-) + +commit 3465ae1c58a87382c33117f6c5dec52403c9694e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 20 10:43:53 2006 -0700 + + output-stream: Support %X in addition to %x + + src/cairo-output-stream.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit bb11980f14560ea16174c6531678b9b7a623f813 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jun 20 02:16:17 2006 -0400 + + Add 'x' case to printf switch so we actually implement %02x. + + src/cairo-output-stream.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 651b2a9ab0bdb5f8fa952e47e95c21d2f530950d +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 19 21:16:03 2006 -0700 + + test/fallback-resolution: Remove extra call to cairo_show_page + + test/fallback-resolution.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 7026e24548fd0e4fbfb2bd3af7cffab8eab88d44 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 19 21:15:26 2006 -0700 + + PS PDF: Drop unused hex_digit functions, (now that output stream supports %02x) + + src/cairo-pdf-surface.c | 8 -------- + src/cairo-ps-surface.c | 8 -------- + 2 files changed, 16 deletions(-) + +commit cd5e08a9fee70b1ed2252d24e04db806769babcd +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 19 22:42:32 2006 -0400 + + Implement 0-padding and field width for _cairo_output_stream_printf(). + + Use it instead of %c%c in PS and PDF surfaces. + + src/cairo-output-stream.c | 46 ++++++++++++++++++++++++++++++---------------- + src/cairo-pdf-surface.c | 5 ++--- + src/cairo-ps-surface.c | 5 ++--- + 3 files changed, 34 insertions(+), 22 deletions(-) + +commit a3f2d92f11a1ab4d30dd0e33a0cd5ee19495eeb1 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 19 11:03:32 2006 -0700 + + PDF: Don't fallback due to CAIRO_ANTIALIAS_NONE + + This was a gratuitous thing that was causing excessive fallbacks in + mozilla printing to PDF. The only reason it was ever there was to + get some of the tests that rely on CAIRO_ANTIALIAS_NONE to pass. + Instead we now simply don't run those tests against the PDF backend. + + src/cairo-pdf-surface.c | 16 ++-------------- + test/cairo-test.c | 15 ++++++++++++++- + 2 files changed, 16 insertions(+), 15 deletions(-) + +commit 72e7667ed904b93475d7e4540778c498aa781cdf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 19 04:29:49 2006 -0400 + + Replace noinst_ with check_, such that nothing is built with default make + target. + + test/Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fdc109dc5902f362bfec2f90b5d357c2d16b96d6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 19 04:17:19 2006 -0400 + + Add create-for-stream.* to .gitignore. + + test/.gitignore | 3 +++ + 1 file changed, 3 insertions(+) + +commit d12afb7eac80d66cc140721031940feddc2586c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 19 04:10:56 2006 -0400 + + Update .gitignore + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit a28557f55a49ac812e69b59fe803fd0cba10d10b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 19 04:10:19 2006 -0400 + + Reference images for new test... + + test/device-offset-positive-ref.png | Bin 0 -> 139 bytes + test/device-offset-positive-rgb24-ref.png | Bin 0 -> 130 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 2f59dd4a5e9f4ce3853b055620bbada4526e3f58 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Jun 19 15:52:36 2006 +0800 + + Turn hinting off to get consistent results for ft-text-vertical-layout test case. + + test/ft-text-vertical-layout-ref.png | Bin 1145 -> 1130 bytes + test/ft-text-vertical-layout-rgb24-ref.png | Bin 1059 -> 0 bytes + test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 1106 -> 1021 bytes + test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 1106 -> 1100 bytes + test/ft-text-vertical-layout.c | 5 +++++ + 5 files changed, 5 insertions(+) + +commit f5b6fc139c8e455b27df52139578d2546a826e6d +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Jun 19 15:51:43 2006 +0800 + + Turn hinting off to get consistent results for ft-text-antialias-none test case. + + test/ft-text-antialias-none-ref.png | Bin 332 -> 336 bytes + test/ft-text-antialias-none.c | 3 +++ + 2 files changed, 3 insertions(+) + +commit ddc01a3c5530aa9480eb19aded7ba08f97529440 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 19 03:22:53 2006 -0400 + + Correct comment about expected result in device-offset-positive test. + + test/device-offset-positive.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70d3719ec9d0dbe7e37f3ad3c5cfbe596be4f409 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 19 03:13:56 2006 -0400 + + Add test device-offset-positive. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/device-offset-positive.c | 88 +++++++++++++++++++++++++++++++++++++++++++ + test/device-offset.c | 2 +- + 4 files changed, 92 insertions(+), 1 deletion(-) + +commit fde08da55f293cd40927c8a1d41db0e478785e8e +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Jun 19 14:49:46 2006 +0800 + + freetype: Don't ignore antialias in some cases. + + src/cairo-ft-font.c | 57 +++++++++++++++++++++++++++-------------------------- + 1 file changed, 29 insertions(+), 28 deletions(-) + +commit c9de7b1286309fc2da1a5ea798674b528aa2eab6 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Jun 19 14:17:24 2006 +0800 + + freetype: Compare all elements in ft_options but not use memcmp. + + src/cairo-ft-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e4736fcf76855c7ca5c9e8b922622dfffe08e4e1 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 18 23:50:51 2006 +0800 + + freetype: Clear target mode correctly in _cairo_ft_options_merge. + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1e0e56e0223116bf48e5acd4a974f16fae824df2 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 18 17:30:39 2006 +0800 + + freetype: Fix warnings in _decompose_glyph_outline. + + src/cairo-ft-font.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 117b062756de9fc99f635b3e712ea3e258c53165 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 18 17:26:19 2006 +0800 + + freetype: cleanup _cairo_ft_scaled_glyph_init. + + src/cairo-ft-font.c | 32 ++++++++++++++++++-------------- + 1 file changed, 18 insertions(+), 14 deletions(-) + +commit 54b4a2fccdcaa4fbc126818c7cb7b96a1a8acf35 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 18 17:20:38 2006 +0800 + + freetype: Respect configurations in font pattern. + + cairo freetype font backend doesn't handle fontconfig configurations + quiet well, it always renders glyphs using configurations in + scaled_font->base.options which usually isn't corresponding to + font pattern used to create the font face and the load flags. As a + result, turning antialias off with fontconfig doesn't work with cairo + HEAD, subpixel order either. + + This commit make cairo respect configurations in font pattern and handle + load flags correctly. The ft-text-antialias-none test case passess now. + And should fix bug #6759 and #4792. + + src/cairo-ft-font.c | 232 +++++++++++++++++++++++++++++----------------------- + 1 file changed, 129 insertions(+), 103 deletions(-) + +commit 4b2b8f939a9e786ead080f85d1b101680230f168 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sat Jun 17 16:29:54 2006 +0800 + + Add ft-text-antilaias-none test case demonstrating bug #6759. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/ft-text-antialias-none-ref.png | Bin 0 -> 332 bytes + test/ft-text-antialias-none.c | 128 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 130 insertions(+) + +commit efaf88d4092db5e4ca37508d87fdb8ac39496018 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sat Jun 17 15:52:05 2006 +0800 + + Add missing prototype for _cairo_lzw_compress. + + src/cairoint.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6f0a85c8f76ba2fb77862f2da506bfd405ce218d +Author: Ian Osgood <iano@quirkster.com> +Date: Fri Jun 16 08:18:37 2006 -0700 + + Update the XCB backend for screen sensitivity. + + src/cairo-xcb-surface.c | 87 +++++++++++++++++++++++++++++++++++++------------ + src/cairo-xcb-xrender.h | 1 + + src/cairo-xcb.h | 1 + + test/cairo-test.c | 2 +- + 4 files changed, 69 insertions(+), 22 deletions(-) + +commit bc4a6796f851a9f10764feb783988641d26cf2ce +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 16 19:01:20 2006 -0400 + + Accept CAIRO_TEST_TARGET being empty or containing a list of backends to test. + The list can be separated by any of space, tab, comma, colon, or semicolon. + Moreover, a CAIRO_TEST_TARGET of e.g. "glitz" matches any subtarget like + "glitz-glx". + + test/cairo-test.c | 33 ++++++++++++++++++++++++--------- + 1 file changed, 24 insertions(+), 9 deletions(-) + +commit 8bc05f15ab3f2054f802cfbc9564476a4acbb4a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 16 18:39:36 2006 -0400 + + Note that create_similar clears surface. + + src/cairo-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3bad1f0b0c431f1e5832d8755d0e22fe31120007 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 16 10:09:54 2006 -0700 + + Increment CAIRO_VERSION to 1.1.11 after making the 1.1.10 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 65e73c81b83222de873935cf384e514ea20ac854 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 16 09:45:44 2006 -0700 + + Update version to 1.1.10 and add notes to NEWS file. + + Also update libtool version information to 10:0:8. + + NEWS | 17 +++++++++++++++++ + configure.in | 6 +++--- + 2 files changed, 20 insertions(+), 3 deletions(-) + +commit b992e1e29d6d63de2a6b5b48b93d23be50fc29ca +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 16 09:44:33 2006 -0700 + + Annoying doc template churn. + + doc/public/tmpl/cairo-image.sgml | 1 + + 1 file changed, 1 insertion(+) + +commit 4a5111695c25ce9178f1eb69acd825b3466fcb11 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 16 09:22:36 2006 -0700 + + Update release rules in Makefile to add git signature information. + + Makefile.am | 25 ++++++++++++++++++++++--- + RELEASING | 2 +- + 2 files changed, 23 insertions(+), 4 deletions(-) + +commit c6164d0d2a9ca16a00c2768f24a0230de6cbc6f6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 15 16:22:52 2006 -0700 + + New API: Add support for new CAIRO_FORMAT_RGB16_565 + + pixman/src/icformat.c | 6 ++++++ + pixman/src/pixman.h | 3 ++- + src/cairo-image-surface.c | 17 ++++++++++++++++- + src/cairo.h | 6 +++++- + 4 files changed, 29 insertions(+), 3 deletions(-) + +commit 36e59ca5f854de2740c7ef4f0b6022785dd9dc4c +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Fri Jun 16 21:13:21 2006 +0800 + + xlib: free resources before return if looking up glyph surface fails. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bf2c0e44d8c8e1e692eafba7bccddd26f1f31c1b +Merge: b8231f8 a8b736c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 16 00:13:18 2006 -0400 + + Merge branch 'cairo' into cairo-origin + +commit a8b736c1608c3d0b98b81f79ab1f5607cce245ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 16 00:08:44 2006 -0400 + + Use enum time instead of int (shuts intel compiler up.) + + pixman/src/pixregion.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b8231f8949818099c4e6ed4e0669de6f8c8bf856 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu Jun 15 22:07:17 2006 -0400 + + Add cairo-output-stream-private.h to libcairo_la_SOURCES. + + We now pass distcheck again. + + src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit abe1bfad8d8a3252bdc65da40bf303626881b163 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 15 15:43:00 2006 -0700 + + Add missing breaks in switch statement. + + Yes, I am an idiot. + + src/cairo-image-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9fa24975b4b9cc9983331991d2a3c53a37272162 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 15 15:33:45 2006 -0700 + + Drop _cairo_surface_is_opaque now that we have cairo_surface_get_content + + src/cairo-pattern.c | 2 +- + src/cairo-surface.c | 37 +------------------------------------ + src/cairoint.h | 1 + + 3 files changed, 3 insertions(+), 37 deletions(-) + +commit 0ba040d7f63c62e482d40fc6db0e1f0714806839 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 15 14:56:59 2006 -0700 + + Remove _cairo_image_surface_is_alpha_only in favor of just looking at content value. + + src/cairo-image-surface.c | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +commit 82496a6f7c5b0a9f91db6abc9e34202b8ffa77c4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 15 14:15:42 2006 -0700 + + _cairo_format_from_pixman_format: Add useful error mesage and assertion when failing. + + src/cairo-image-surface.c | 62 +++++++++++++++++++++++++++-------------------- + 1 file changed, 36 insertions(+), 26 deletions(-) + +commit dedc51ba51eaa61e4b11f274fac06c6f0acd8a87 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 14 19:25:37 2006 -0400 + + Only call close function for output streams if it's non-NULL. + + src/cairo-output-stream.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 9ef99d10bb7eb6cde421e0d93ae55988882d9b56 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 14 19:15:50 2006 -0400 + + Add test case for the PDF, PS and SVG stream constructors. + + test/Makefile.am | 1 + + test/create-for-stream.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 219 insertions(+) + +commit 8c8bcaf99b1c8d6cb26dfc89751d71de535c11e7 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Jun 14 20:57:42 2006 +0200 + + SVG: Update of reference images. + + test/linear-gradient-svg-argb32-ref.png | Bin 947 -> 1000 bytes + test/linear-gradient-svg-rgb24-ref.png | Bin 947 -> 1000 bytes + test/mask-svg-argb32-ref.png | Bin 87715 -> 87728 bytes + test/mask-svg-rgb24-ref.png | Bin 81874 -> 81753 bytes + test/paint-source-alpha-svg-argb32-ref.png | Bin 353 -> 505 bytes + test/paint-source-alpha-svg-rgb24-ref.png | Bin 353 -> 505 bytes + test/paint-with-alpha-svg-argb32-ref.png | Bin 420 -> 516 bytes + test/paint-with-alpha-svg-rgb24-ref.png | Bin 420 -> 516 bytes + test/push-group-svg-argb32-ref.png | Bin 2945 -> 2935 bytes + test/push-group-svg-rgb24-ref.png | Bin 2901 -> 2887 bytes + test/scale-source-surface-paint-svg-argb32-ref.png | Bin 146 -> 182 bytes + test/scale-source-surface-paint-svg-rgb24-ref.png | Bin 158 -> 192 bytes + test/text-pattern-svg-argb32-ref.png | Bin 1720 -> 1708 bytes + test/text-pattern-svg-rgb24-ref.png | Bin 1567 -> 1563 bytes + test/trap-clip-svg-argb32-ref.png | Bin 71765 -> 71728 bytes + test/trap-clip-svg-rgb24-ref.png | Bin 73066 -> 73082 bytes + 16 files changed, 0 insertions(+), 0 deletions(-) + +commit 2cea3a2710cd4c6eb68e25eadaaf96cdc921ef14 +Merge: 17ea755 4932d09 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 14 15:00:33 2006 -0400 + + Merge branch 'svg-rewrite' + +commit 4932d09a06228a08d1c8f4d2892378c004ff3313 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Jun 14 14:12:55 2006 -0400 + + Actually add src/cairo-output-stream-private.h. + + src/cairo-output-stream-private.h | 156 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 156 insertions(+) + +commit 17ea7552355d9925fb99cd4ca98cf38946f99421 +Author: Torsten Schönfeld <kaffeetisch@gmx.de> +Date: Wed Jun 14 11:09:00 2006 -0700 + + Add missing cairo_public tag for cairo_image_surface_get_stride + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1599ab8fa91fd2b5b611825d1e1b46fcacfb7982 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 10:41:29 2006 -0700 + + Increment CAIRO_VERSION to 1.1.9 after making the 1.1.8 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dd859b8736bb4d1bcf3ed78d0bd1f72a7aad9ca9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 08:14:43 2006 -0700 + + Update version to 1.1.8 and add notes to NEWS file. + + Also update libtool version information to 9:0:7. + + NEWS | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 6 +-- + 2 files changed, 135 insertions(+), 3 deletions(-) + +commit 65c9c072d207b04cac8da21b40b2dd5c14791547 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 06:39:23 2006 -0700 + + Update refefence images due to pattern source shift. + + The commit that introduced this change is: + + commit b104a79502e2c01c508e40d83613ecfa001a2a4e + Author: Bertram Felgenhauer <int-e@gmx.de> + Date: Tue Jun 13 20:07:28 2006 -0400 + + Patch to fix pixman samping location bug (#2488). + + test/gradient-alpha-ref.png | Bin 155 -> 147 bytes + test/gradient-alpha-rgb24-ref.png | Bin 142 -> 142 bytes + test/linear-gradient-ref.png | Bin 972 -> 1023 bytes + test/mask-ref.png | Bin 87837 -> 87890 bytes + test/mask-rgb24-ref.png | Bin 71069 -> 70978 bytes + test/operator-source-ref.png | Bin 19684 -> 19726 bytes + test/operator-source-rgb24-ref.png | Bin 14699 -> 14701 bytes + test/push-group-ref.png | Bin 3012 -> 2996 bytes + test/push-group-rgb24-ref.png | Bin 2858 -> 2840 bytes + test/text-pattern-ref.png | Bin 1721 -> 1721 bytes + test/text-pattern-rgb24-ref.png | Bin 1423 -> 1418 bytes + test/trap-clip-ref.png | Bin 71785 -> 71753 bytes + test/trap-clip-rgb24-ref.png | Bin 63087 -> 63049 bytes + 13 files changed, 0 insertions(+), 0 deletions(-) + +commit 4bdfff477a1d7fa19890f0a5c4f3cc6533e39149 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 06:00:11 2006 -0700 + + PS PDF: Update reference images due to truetype subsetting + + test/select-font-face-pdf-argb32-ref.png | Bin 2782 -> 2237 bytes + test/select-font-face-ps-argb32-ref.png | Bin 528 -> 481 bytes + test/show-text-current-point-pdf-argb32-ref.png | Bin 3838 -> 2157 bytes + test/show-text-current-point-ps-argb32-ref.png | Bin 645 -> 602 bytes + test/text-antialias-gray-pdf-argb32-ref.png | Bin 1004 -> 950 bytes + test/text-antialias-gray-ps-argb32-ref.png | Bin 306 -> 310 bytes + test/text-antialias-none-pdf-argb32-ref.png | Bin 1004 -> 950 bytes + test/text-antialias-none-ps-argb32-ref.png | Bin 306 -> 310 bytes + test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 1004 -> 950 bytes + test/text-antialias-subpixel-ps-argb32-ref.png | Bin 306 -> 310 bytes + 10 files changed, 0 insertions(+), 0 deletions(-) + +commit 7e0be461b595c3561fa75472fdfd5954e4666cfc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 13 22:40:50 2006 -0400 + + Rename cairo-wideint.h to cairo-wideint-private.h. + + RELEASING | 2 +- + src/Makefile.am | 2 +- + src/cairo-wideint-private.h | 313 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-wideint.h | 313 -------------------------------------------- + src/cairoint.h | 2 +- + 5 files changed, 316 insertions(+), 316 deletions(-) + +commit b9cfe941c8e1ae427780117fedfd47d458e29f02 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 13 22:37:34 2006 -0400 + + Add backend-specific pkg-config files. + + .gitignore | 1 - + configure.in | 56 +++++++++++++++++++++++++++++++++---------------- + src/.gitignore | 1 + + src/Makefile.am | 35 ++++++++++++++++++++++++------- + src/cairo-backend.pc.in | 12 +++++++++++ + 5 files changed, 78 insertions(+), 27 deletions(-) + +commit 2249fb89ae36859d1d3f6c9d0b72e95e45726170 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 13 19:13:05 2006 -0400 + + Move cairo.pc into src/. + + Makefile.am | 8 ++------ + cairo.pc.in | 12 ------------ + configure.in | 2 +- + src/Makefile.am | 3 +++ + src/cairo.pc.in | 12 ++++++++++++ + 5 files changed, 18 insertions(+), 19 deletions(-) + +commit e346eca1386e8ec14f9bda7d76662a16706f1e7c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 04:58:54 2006 -0700 + + Add zero-alpha reference image to Makefile.am for the sake of make dist + + test/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 211741cce61075b526edfacd728c9c5de8dd1aac +Author: Bertram Felgenhauer <bertram.felgenhauer@googlemail.com> +Date: Wed Jun 14 04:51:27 2006 -0700 + + Bug 4723: configure.in: Fix m4 quoting when examining pkg-config version + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b8e93f9c5598d5452e08728546677a977e41617f +Author: Brian Cameron <brian.cameron@sun.com> +Date: Wed Jun 14 04:44:01 2006 -0700 + + Bug 4882: Flag Sun's X server has having buggy_repeat. + + This is the Sun labelling of Xorg 6.8 as shipped with Solaris 10. + + src/cairo-xlib-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 32d049a7bf9549f8c797c50654546b6526518f0a +Author: Dom Lachowicz <cinamod@hotmail.com> +Date: Wed Jun 14 04:37:08 2006 -0700 + + Bug 5306: test/pdf2png: Add missing include of stdio.h + + test/pdf2png.c | 1 + + 1 file changed, 1 insertion(+) + +commit e9269aefcbc96a417012107c17ec2bc4de608cc1 +Author: Behdad Esfahbod <freedesktop@behdad.org> +Date: Wed Jun 14 04:07:29 2006 -0700 + + Bug 7075: Fix make clean to remove cairo.def + + src/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit c8e7ff096648a53b780f14c2cd2467157fae8385 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 04:04:21 2006 -0700 + + ROADMAP: Update with PDF bugs from minefield test. Slip non-1.0 regressions off of 1.2. + + ROADMAP | 32 +++++++++++++++++++------------- + 1 file changed, 19 insertions(+), 13 deletions(-) + +commit c515b15cfc8c88b330f16a9263841476c29ded99 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 14 03:53:18 2006 -0700 + + ft: If glyph->format is not OUTLINE use _render_glyph_bitmap to coerce to a bitmap + + src/cairo-ft-font.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 61a3260e44b40b8aa344f806979b60a82400105e +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Wed Jun 14 15:57:23 2006 +0800 + + ROADMAP: Mark bugs FC_ADVANCE and _transform_glyph_bitmap as fixed. + + ROADMAP | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0d2900477cd6edfe6025be06c3f1eda63cbe5230 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Wed Jun 14 15:56:17 2006 +0800 + + freetype: Return an error if the glyph format isn't outline or bitmap + while getting glyph surface. + + src/cairo-ft-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b104a79502e2c01c508e40d83613ecfa001a2a4e +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Tue Jun 13 20:07:28 2006 -0400 + + Patch to fix pixman samping location bug (#2488). + + pixman/src/fbcompose.c | 21 +++++++++++++++------ + test/pixman-rotate-rgb24-ref.png | Bin 385 -> 244 bytes + test/pixman-rotate-svg-argb32-ref.png | Bin 0 -> 258 bytes + test/pixman-rotate-svg-rgb24-ref.png | Bin 0 -> 358 bytes + 4 files changed, 15 insertions(+), 6 deletions(-) + +commit 0ee64b84689c22bba1d9bb2758170bbc104f5cf1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 16:50:43 2006 -0700 + + Bug 4196: undef MIN an MAX before defining to avoid duplicate definition + + pixman/src/icint.h | 2 ++ + pixman/src/pixregion.c | 2 ++ + 2 files changed, 4 insertions(+) + +commit 1b11d3830b26f6ce7f0d8ddcc315a9c19f56658a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 16:42:06 2006 -0700 + + test/zero-alpha: Drop REPS from 100 to 10 for a faster test. + + Hopefully this still triggers the bug of interest. I think it should. + + test/zero-alpha.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d269664f166c4fc835e70a176ad46b2d7ccb41d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 16:13:23 2006 -0700 + + Add new zero-alpha test to demonstrate (X server?) bug found by Paul Giblock + + test/.gitignore | 1 + + test/Makefile.am | 3 +- + test/zero-alpha-ref.png | Bin 0 -> 115 bytes + test/zero-alpha.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 100 insertions(+), 1 deletion(-) + +commit 1d18af9f5adb0ce2e01bc42578fe117c4e924ce8 +Merge: c7b194c 27e9e3c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 15:51:57 2006 -0700 + + Merge branch 'type1-subsetting' into cairo + + Conflicts: + + src/cairo-ps-surface.c + +commit c7b194c59544ff441d1e83827242667c0e86dc5a +Merge: 4b063c6 127fab4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 15:46:14 2006 -0700 + + Merge branch 'truetype-subsetting' into cairo + + Conflicts: + + src/Makefile.am + src/cairo-font-subset.c + src/cairo-pdf-surface.c + src/cairo-ps-surface.c + +commit cdf07a9be87515b75156a6f02f050bc5b1e6b5d1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jun 13 17:45:55 2006 -0400 + + Remove libxml2 checks from configure.in. + + configure.in | 14 -------------- + 1 file changed, 14 deletions(-) + +commit ed60128bd0822e56c8002f3503044d5b0efaec79 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jun 13 17:25:24 2006 -0400 + + Rewrite SVG backend to just use cairo output stream instead of libxml2. + + src/cairo-svg-surface.c | 1161 +++++++++++++++++++---------------------------- + 1 file changed, 471 insertions(+), 690 deletions(-) + +commit 17d41d1f71a5d5af489bc395e3bb3cf414aeda57 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Jun 13 17:24:36 2006 -0400 + + Only run fallback-resolution test case when all of PDF, PS and SVG are enabled. + + test/Makefile.am | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 4b063c607208935fad040d481d42085c4ed6e64d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 12:48:00 2006 -0700 + + PS, PDF: Re-organize handling of bitmapped fonts to avoid invalid output. + + Previously, using the ps or pdf backend with a bitmapped font would + result in a coorupt output file, filled with uninitialized values and + missing procedures for drawing the glyphs. + + Now, the file should actually be valid, but it's simply drawing black + boxes instead of the correct glyphs. + + src/cairo-pdf-surface.c | 92 ++++++++++++++++++++++++++++++++++--------------- + src/cairo-ps-surface.c | 91 ++++++++++++++++++++++++++++++++++-------------- + 2 files changed, 129 insertions(+), 54 deletions(-) + +commit d2045c1f7465f7f3625ce14a7b0e395b35ba8dc0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 13 12:45:16 2006 -0700 + + Change return type of _cairo_scaled_glyph_lookup to allow UNSUPPORTED. + + This allows graceful recovery when first requesting a path from a font + that only supports bitmapped glyph. The changed return type is also + pushed down into the scaled_glyph_init function of the + cairo_scaled_font backend. + + src/cairo-atsui-font.c | 2 +- + src/cairo-ft-font.c | 4 ++-- + src/cairo-scaled-font.c | 10 ++++++++-- + src/cairoint.h | 4 ++-- + 4 files changed, 13 insertions(+), 7 deletions(-) + +commit 0e30fc44363435c52c762fa8a353de43fe087822 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 12 08:45:58 2006 -0700 + + Add aliases for deprecated cairo_{pdf,ps,svg}_surface_set_dpi + + The aliases should allow binaries with the old symbols to continue to run. + + Meanwhile, the macros in cairo.h prevent any code from being compiled without + using the new, future-proof function names. + + This is a temporary, transition strategy and the aliases will be dropped + before the next major release. + + src/cairo-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 7015cc0b90f99898852ca276368854f9465f4c82 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 12 08:18:09 2006 -0700 + + Add cairo-ps-test.h and cairo-svg-test.h to Makefile.am + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8581447e7b26f34c7be43fef7dfa5458f2278556 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 12 03:15:33 2006 -0400 + + Add an in-memory output-stream implementation. + + src/cairo-output-stream.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +commit d43321066081eacca2e0c86258c68bae49036087 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 12 03:10:40 2006 -0400 + + Convert the word wrap stream, the base85 stream and the ps string stream. + + src/cairo-base85-stream.c | 27 ++++++++++++--------------- + src/cairo-ps-surface.c | 44 +++++++++++++++++++++----------------------- + 2 files changed, 33 insertions(+), 38 deletions(-) + +commit 45cbe055d9cf4ac2cf2fbcd21b020c8f869a0380 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 12 03:08:51 2006 -0400 + + Convert the stdio output stream to use the new output stream interface. + + src/cairo-output-stream.c | 50 +++++++++++++++++++++++++++++++++++------------ + 1 file changed, 37 insertions(+), 13 deletions(-) + +commit 3575c942f81d54c88fd48aee2352ecd29406e711 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Jun 12 03:07:19 2006 -0400 + + Make cairo_output_stream_t an embeddable type. + + Most internal cairo types are transparent within cairo and have init and fini + functions to intialize and finialize them in place. This way they can be + easily be embedded in other structs or derived from. Initially, the + cairo_output_stream_t type was proposed as a publically visible type and + thus kept opaque. However, now it's only used internally and derived from + in a number of places so let's make it an embeddable type for consistency + and ease of use. + + The patch keeps _cairo_output_stream_create() and _cairo_output_stream_close() + around for (internal) backwards compatibility by deriving a + cairo_output_stream_with_closure_t stream type. + + The patch also moves all cairo_output_stream_t functions out of cairoint.h + and into new file cairo-output-stream-private.h, thus chipping away at the + monolithic cairoint.h. + + src/cairo-base85-stream.c | 1 + + src/cairo-output-stream.c | 76 +++++++++++++++++++++++++++++++----------- + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-svg-surface.c | 1 + + src/cairoint.h | 84 ----------------------------------------------- + 6 files changed, 60 insertions(+), 104 deletions(-) + +commit 9d3443e86ab32711d332b1474bc2fe23f9796723 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Jun 12 14:18:25 2006 +0800 + + xlib: bugfix for #7172. + + When the glyph format does not match the font format, the glyph will + be rendered incorrectly. Setting the {x, y}_offset correctly when + converting glyph format fix that. + + src/cairo-xlib-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 79928101352a84af1884e993fd06bf6cd44f2af3 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Jun 11 20:56:09 2006 +0200 + + SVG: Sets fallback resolution when compositing a meta surface. + + For doing so, I've changed document owner to be the paginated surface, + instead of the svg surface like previously. That's because fallback + resolution is stored in paginated surface. + + src/cairo-svg-surface.c | 29 ++++++++++++++--------------- + 1 file changed, 14 insertions(+), 15 deletions(-) + +commit 7e1a01092c94c7b67e95f4f4ff27c76fb5b21295 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 11 18:37:59 2006 +0800 + + freetype: build fix for _transform_glyph_bitmap. + + I sorry for this noise, I didn't notice cworth's device_{x, y}_offset + changes. Now cairo builds again. + paths... + + src/cairo-ft-font.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 4af28e639dcf7fe3332c0302295e6d590a505af7 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 11 18:16:46 2006 +0800 + + ignore FC_MATRIX in font pattern. + + With previous commit, freetype font backend is able to transform + both bitmap and outline glyphs, so ignores FC_MATRIX from now, + cairo doesn't need this for artificial oblique. And cairo doesn't + use FC_MATRIX direct anyway, it has its own font matrix that may be not + equal to FC_MATRIX in the font pattern! You should pass the matrix + (usually the matrix is multiplied by font's pixel size) to cairo when + creating scaled font. + + src/cairo-ft-font.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit f5bc26b75dd030ada70f87113e2d132dfcb0b0f3 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Jun 11 18:09:05 2006 +0800 + + freetype: rework _transform_glyph_bitmap. + + This function is used to shape bitmap glyphs(outline glyphs are + transformed by freetype). That means freetype backend is able to + tranform both bitmap & outline glyphs now. This is needed for glyph + rotating, artificial oblique etc. + + src/cairo-ft-font.c | 58 ++++++++++++++++++++++++++++++----------------------- + 1 file changed, 33 insertions(+), 25 deletions(-) + +commit da9cd55afbb55ae70991e3f5b4c0dc5b9a58e0d6 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 16:31:05 2006 -0700 + + ROADMAP: Note that cairo_surface_set_fallback_resolution is in place now. + + ROADMAP | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +commit 2f4210d346d10a2bff9a1ba74e6e9279cd4dddc3 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 11:20:21 2006 -0700 + + Change _cairo_meta_surface_get_extents to return a bounded size. + + The old behavior of returning "infinite" extents is inconsistent with + the current usage of meta-surface where it is always created for + replay against a particular (sized) target surface and that size is + passed to _cairo_meta_surface_create. + + Also clarify documentation of _cairo_surface_get_extents to eliminate + the possibility of inifinite extents. + + src/cairo-meta-surface.c | 25 ++++++++++++++++--------- + src/cairo-surface.c | 20 +++++++++++--------- + 2 files changed, 27 insertions(+), 18 deletions(-) + +commit d758d5104a09019b65c1b2e93fd5ab80b0e4d056 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 10:42:32 2006 -0700 + + Don't create a new scaled_font if there's a device_offset but no device_scale. + + (This is covering up my mistake from the last batch of 12 commits which + wasn't ready to be pushed yet. This fixes some of the crashes which + were introduced, and is a good thing to do regardless.) + + src/cairo-surface.c | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +commit 0662928e4fd7bd432fdd815b95271d5c74eaba70 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 09:44:30 2006 -0700 + + Clarify that fallback_resolution acts on a per-page granularity. + + This explains why the SVG result from the fallback-resolution test + doesn't actually show multiple resolutions in effect at the same time. + + src/cairo-surface.c | 5 +++++ + test/fallback-resolution.c | 16 ++++++++++++++++ + 2 files changed, 21 insertions(+) + +commit 13ba5316fbc4b9d2aac13da644f4c87069447246 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 09:15:31 2006 -0700 + + Test PS and SVG backends in addition to PDF in test/fallback-resolution. + + test/.gitignore | 2 + + test/fallback-resolution.c | 112 ++++++++++++++++++++++++++++++++------------- + 2 files changed, 83 insertions(+), 31 deletions(-) + +commit 6ca30e108f32862948fa332b31f60fa79b566d77 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 09:14:47 2006 -0700 + + Add cairo_{ps,svg}_test_force_fallbacks so tests can force fallbacks. + + src/cairo-ps-surface.c | 24 ++++++++++++++++++++++ + src/cairo-ps-test.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-svg-surface.c | 24 ++++++++++++++++++++++ + src/cairo-svg-test.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 156 insertions(+) + +commit 100b30d1c09cb7fe73414c4d3466032a8c99b088 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 08:35:01 2006 -0700 + + Fix font size when drawing text with a device_scale. + + The trick is to create a new scaled_font with the device_transform + multiplied into the CTM within _cairo_surface_show_glyphs before + calling into the backend. The fallback-resolution test shows that + the font size is now correct. + + src/cairo-surface.c | 27 +++++++++++++++++++++++++-- + 1 file changed, 25 insertions(+), 2 deletions(-) + +commit 74857181c96c734d7e735cfc9862e22b01599913 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 08:29:14 2006 -0700 + + Fix line width for stroking with a device_scale. + + The trick is to simply multiply the device_transform into the CTM + within _cairo_surface_stroke before passing the CTM down to the + backend. The fallback-resolution test shows that the stroke width is + now correct. + + src/cairo-surface.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit ebb53b2572cc74f90d2afd03807b7d4f41a4965a +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 08:21:18 2006 -0700 + + Add text and stroke to falback-resolution test (showing bugs in each). + + test/fallback-resolution.c | 42 +++++++++++++++++++++++++++++++++++------- + 1 file changed, 35 insertions(+), 7 deletions(-) + +commit 6efeb1e19b4c30d6a88bd9248a1d67b791b8df0d +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 08:19:41 2006 -0700 + + Hook up device scaling so fallback_resolution starts working. + + Add new, private _cairo_surface_set_device_scale for getting at the + scaling components of device_transform. Use this in paginated surface + when replaying to an image surface. The fallback-resolution test now + clearly shows that image fallback resolution can be controlled by the + user. Hurrah! + + src/cairo-paginated-surface.c | 11 +++++++++-- + src/cairo-surface.c | 39 +++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 5 +++++ + 3 files changed, 53 insertions(+), 2 deletions(-) + +commit b129f747c5c7edc37982f286940d3583c74cfee9 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jun 10 00:12:51 2006 -0700 + + Change {x,y}_device_offset values to a device_transform matrix. + + This is a step toward allowing device scaling in addition to device offsets. + So far, the scale values are still always 1.0 so only the translation is + actually being used. But most of the code is in place for doing scaling as + well and it just needs to be hooked up. + + There are some fragile parts in this code, all of which involve using the + translation without the scale, (so grep for device_transform.x0 or + device_transform->x0). Some of these are likely bugs that will hopefully + be obvious once we start using the scale. Others are OK if only because + we 'know' that we aren't ever setting device scaling on a surface that + has a device offset (we only set device scaling on surfaces we create + internally and we don't export device scaling to the user). + + All of these fragile parts in the code have been marked with comments of + the form: XXX: FRAGILE. + + src/cairo-clip.c | 15 +++-- + src/cairo-directfb-surface.c | 5 +- + src/cairo-ft-font.c | 12 ++-- + src/cairo-glitz-surface.c | 8 +-- + src/cairo-gstate.c | 13 ++--- + src/cairo-matrix.c | 8 +++ + src/cairo-path.c | 29 ++++++++-- + src/cairo-scaled-font.c | 5 +- + src/cairo-surface-fallback.c | 3 +- + src/cairo-surface.c | 129 +++++++++++++++++++++++-------------------- + src/cairo-xlib-surface.c | 8 +-- + src/cairo.c | 4 +- + src/cairoint.h | 13 +++-- + 13 files changed, 144 insertions(+), 108 deletions(-) + +commit 24da744d03e961078e68691225fb1363e47b2b22 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 9 23:59:24 2006 -0700 + + doc: SGML template churn + + doc/public/tmpl/cairo-pdf.sgml | 7 +++++++ + doc/public/tmpl/cairo-ps.sgml | 7 +++++++ + doc/public/tmpl/cairo-status.sgml | 7 ------- + doc/public/tmpl/cairo-svg.sgml | 7 +++++++ + 4 files changed, 21 insertions(+), 7 deletions(-) + +commit 999315cc0ad326d31c66f2e6fa1ae72dfb9bb57e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 9 21:12:44 2006 -0700 + + Rename device_{x,y}_offset to {x,y}_device_offset for better consitency/grepability + + src/cairo-clip.c | 4 ++-- + src/cairo-directfb-surface.c | 4 ++-- + src/cairo-ft-font.c | 8 +++---- + src/cairo-glitz-surface.c | 8 +++---- + src/cairo-gstate.c | 8 +++---- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-surface-fallback.c | 4 ++-- + src/cairo-surface.c | 56 ++++++++++++++++++++++---------------------- + src/cairo-xlib-surface.c | 8 +++---- + src/cairo.c | 4 ++-- + src/cairoint.h | 4 ++-- + 11 files changed, 56 insertions(+), 56 deletions(-) + +commit 6f6bdb6663fc439387db6b410bf742de6b501015 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 9 16:54:09 2006 -0700 + + Add REPLACED_BY macros to help porting to new set_fallback_resolution + + src/cairo.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit b2f274b3e86983b312ec19e33b3a1231bd3e51d0 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 9 16:52:17 2006 -0700 + + New API: Replace cairo_{ps,pdf,svg}_set_dpi with new cairo_surface_set_fallback_resolution. + + This just provides the mechanics for storing the value and removing the old + function calls. The new value is still not used anywhere (though nor where + the old values), so there should be no functional change (other than forcing + any programs calling the old API to be updated). + + src/cairo-pdf-surface.c | 35 ----------------------------------- + src/cairo-pdf.h | 5 ----- + src/cairo-ps-surface.c | 35 ----------------------------------- + src/cairo-ps.h | 5 ----- + src/cairo-surface.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-svg-surface.c | 38 -------------------------------------- + src/cairo-svg.h | 5 ----- + src/cairo.h | 5 +++++ + src/cairoint.h | 5 +++++ + test/cairo-test.c | 6 +++--- + test/fallback-resolution.c | 2 +- + 11 files changed, 58 insertions(+), 127 deletions(-) + +commit a812b3c4908ff296877a648915d5f06696eebe9e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 9 15:37:50 2006 -0700 + + Ignore ft-text-vertical-layout binary + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit ac20c80960ccf233f9582da88f0d7aa4a181099e +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Fri Jun 9 07:06:51 2006 +0800 + + freetype: Ignore global advance unconditionally. + + Global advance exists for historical reasons. Nowadays, most of fonts + support unicode, means it's no guaranteed to every glyphs in the font + has the same advance.Sometimes it maybe is biger/smaller then the global + advance even for monospace fonts!So forcing their advance to global + advance, it's obviously wrong. + + src/cairo-ft-font.c | 3 +++ + src/cairo-xlib-surface.c | 3 +++ + 2 files changed, 6 insertions(+) + +commit d3c782320a76d8e79099e5c5dc03c7dd819573d7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 7 17:38:09 2006 -0700 + + Rename ft-text-vertical-layout reference image according to standard convention. + + The standard convention is that the ARGB32 reference image has no + -argb32- component in its name (no real important reason, just + historical). So let's be consist and rename: + test/ft-text-vertical-layout-argb32-ref.png -> test/ft-text-vertical-layout-ref.png + + test/ft-text-vertical-layout-argb32-ref.png | Bin 1145 -> 0 bytes + test/ft-text-vertical-layout-ref.png | Bin 0 -> 1145 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit b7b3d05d78f22b6b45c6a54f2647dbdaeb034d37 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 7 13:51:58 2006 -0700 + + Fix bug in get-group-target (in the test itself) letting it now pass. + + test/get-group-target.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 45ca22e5e1a177a4dc9854cd310e5c683df058cb +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Thu Jun 8 04:06:30 2006 +0800 + + Make image-*-ref.png image as reference image. + + test/ft-text-vertical-layout-argb32-ref.png | Bin 0 -> 1145 bytes + test/ft-text-vertical-layout-image-argb32-ref.png | Bin 1145 -> 0 bytes + test/ft-text-vertical-layout-image-rgb24-ref.png | Bin 1059 -> 0 bytes + test/ft-text-vertical-layout-rgb24-ref.png | Bin 0 -> 1059 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 5ae2a78a297730cd9d2f45be9f23fbf6e2bffe7d +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Thu Jun 8 03:45:38 2006 +0800 + + freetype: Fix for test case ft-text-vertial-layout. + + Fix scaled font metrics and glyph metrics calculation for vertical + layout. Test case ft-text-vertial-layout passes now. + + src/cairo-ft-font.c | 130 +++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 97 insertions(+), 33 deletions(-) + +commit 6b5be506ed160675232bea31b17f458040f6b2d8 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Thu Jun 8 03:33:38 2006 +0800 + + Add ft-text-vertical-layout test case for vertical layout. + + test/Makefile.am | 1 + + test/ft-text-vertical-layout-image-argb32-ref.png | Bin 0 -> 1145 bytes + test/ft-text-vertical-layout-image-rgb24-ref.png | Bin 0 -> 1059 bytes + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 0 -> 1018 bytes + test/ft-text-vertical-layout-pdf-rgb24-ref.png | Bin 0 -> 1037 bytes + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 0 -> 351 bytes + test/ft-text-vertical-layout-ps-rgb24-ref.png | Bin 0 -> 1086 bytes + test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 0 -> 1106 bytes + test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 0 -> 1106 bytes + test/ft-text-vertical-layout.c | 131 ++++++++++++++++++++++ + 10 files changed, 132 insertions(+) + +commit bb66d15a7998740b6ce2525ab5d852fb2966f8f8 +Merge: 3594fd2 b7c7d2e +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Thu Jun 8 02:38:17 2006 +0800 + + Merge branch 'master' of git+ssh://jinghua@git.cairographics.org/git/cairo + +commit 3594fd2d273398b10748c8ed03c7a9da7af377fa +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Thu Jun 8 02:35:42 2006 +0800 + + glitz: Don't hardcode content type when initializing cairo surface + since we can compute it from glitz format. + + src/cairo-glitz-surface.c | 23 ++++++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +commit b7c7d2e57c2721c3a900694d5620b3f45f495233 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 7 10:37:29 2006 -0700 + + Add new test get-group-target (currently failing with paginated). + + This test exercises the combination of cairo_get_group_target along + with cairo_surface_get_device_offset. Something funny is currently + going on with the surfaces based on the paginated surface. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/get-group-target-ref.png | Bin 0 -> 134 bytes + test/get-group-target.c | 80 ++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 83 insertions(+) + +commit 53bf2f8d5dd82e9cff0960ebec536597bc7701e9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 7 10:29:33 2006 -0700 + + Remove debugging "prints" of images from test/device-offset.c + + test/device-offset.c | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +commit 32c0e85d45ee26c34ba1af0e4ba6ced044e469cc +Author: Zakharov Mikhail <zmey20000@yahoo.com> +Date: Wed Jun 7 18:32:16 2006 +0400 + + pixman: fix compilation on HP-UX 11.11 + + pixman/src/pixman.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3690eeb44cd86ac02eb21163d9a5e84784f6417d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 7 02:59:51 2006 -0700 + + Change all instances of UINT16_MAX to INT16_MAX to avoid new bug. + + A recent renaming from CAIRO_MAXSHORT also changed the range of some + values from INT16_MAX to UINT16_MAX. The test suite shows one case + where this introduces a bug, (push/pop_group with SVG and RGB24 + surfaces). + + I haven't tracked the bug down, (presumably there's overflow of the + unsigned value at some point), but I'm now reverting this to avoid + triggering the bug. + + src/cairo-meta-surface.c | 4 ++-- + src/cairo-pattern.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 7f2cf378d595fa559401c76f051ca9b5e6809763 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 7 01:17:53 2006 -0700 + + Fix MAX vs. MIN bug introduced with rename away from CAIRO_MINSHORT + + src/cairo-traps.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bf458c9c67120a2d175f18447dd710060f0ba014 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 17:06:57 2006 -0700 + + win32: Add conditional definitions for INT16_{MIN,MAX} and UINT16_MAX now that we use them. + + src/cairo-wideint.h | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit c1855f17624c62e1f7451b3c673bca23a4575ff7 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 16:59:59 2006 -0700 + + Remove CAIRO_{MIN,MAX}SHORT which did not distinguish signed vs. unsigned. + + Instead, use the standard INT16_{MIN,MAX} and UINT16_{MIN,MAX} as + appropriate. + + src/cairo-meta-surface.c | 4 ++-- + src/cairo-pattern.c | 8 ++++---- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-traps.c | 4 ++-- + src/cairoint.h | 3 --- + 5 files changed, 10 insertions(+), 13 deletions(-) + +commit 746f66c3fce6de39ac9afa7be8bcf8f74c750e85 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 16:54:03 2006 -0700 + + Fix bogus cairo_rectangle_fixed_t to be cairo_rectangle_int16_t. + + This rectangle has regular integer values, not fixed-point values. + So the old name was horribly wrong and misleading, (and yes I think + it was even I that had suggested it). + + src/cairo-analysis-surface.c | 2 +- + src/cairo-atsui-font.c | 2 +- + src/cairo-clip-private.h | 6 ++--- + src/cairo-clip.c | 6 ++--- + src/cairo-directfb-surface.c | 16 ++++++------- + src/cairo-glitz-surface.c | 16 ++++++------- + src/cairo-image-surface.c | 12 +++++----- + src/cairo-meta-surface.c | 2 +- + src/cairo-paginated-surface.c | 6 ++--- + src/cairo-pattern.c | 4 ++-- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-quartz-private.h | 2 +- + src/cairo-quartz-surface.c | 10 ++++---- + src/cairo-rectangle.c | 10 ++++---- + src/cairo-region.c | 8 +++---- + src/cairo-scaled-font.c | 2 +- + src/cairo-surface-fallback-private.h | 2 +- + src/cairo-surface-fallback.c | 42 +++++++++++++++++----------------- + src/cairo-surface.c | 36 ++++++++++++++--------------- + src/cairo-svg-surface.c | 2 +- + src/cairo-win32-private.h | 4 ++-- + src/cairo-win32-surface.c | 12 +++++----- + src/cairo-xcb-surface.c | 18 +++++++-------- + src/cairo-xlib-surface.c | 20 ++++++++-------- + src/cairo.c | 2 +- + src/cairoint.h | 44 ++++++++++++++++++------------------ + src/test-fallback-surface.c | 10 ++++---- + src/test-meta-surface.c | 4 ++-- + src/test-paginated-surface.c | 2 +- + 30 files changed, 155 insertions(+), 155 deletions(-) + +commit 5570bf0a9e99019ac24b2b856455afcf360c14fc +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 16:36:24 2006 -0700 + + CODING_STYLE: Fix misspellings. + + CODING_STYLE | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a21a2e935d3a75b045ce5f7e917524052f018758 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 16:28:15 2006 -0700 + + CODING_STYLE: Add notes on avoiding trailing whitespace. + + CODING_STYLE | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +commit ef10a0403a8a466199615e34a34df9ea860ef9c0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 15:50:33 2006 -0700 + + Remove initial, final, and duplicate blank lines. + + This patch was produced by running git-stripspace on all *.[ch] files + within cairo. Note that this script would have also created all the changes + from the previous commits to remove trailing whitespace. + + doc/tutorial/src/include/cairo-tutorial.h | 1 - + pixman/src/fbcompose.c | 15 --------------- + pixman/src/fbedge.c | 1 - + pixman/src/fbmmx.c | 7 ------- + pixman/src/fbpict.c | 4 ---- + pixman/src/fbpict.h | 1 - + pixman/src/icbltone.c | 1 - + pixman/src/icimage.c | 1 - + pixman/src/icimage.h | 1 - + pixman/src/icint.h | 11 ----------- + pixman/src/icpixels.c | 1 - + pixman/src/icrect.c | 2 -- + pixman/src/ictransform.c | 1 - + pixman/src/ictri.c | 1 - + pixman/src/icutil.c | 1 - + pixman/src/pixman-xserver-compat.h | 1 - + pixman/src/pixman.h | 10 ---------- + pixman/src/pixregion.c | 12 ------------ + pixman/src/pixregionint.h | 1 - + pixman/src/renderedge.c | 1 - + src/cairo-analysis-surface.c | 2 -- + src/cairo-array.c | 1 - + src/cairo-atsui-font.c | 6 ------ + src/cairo-base85-stream.c | 1 - + src/cairo-beos.h | 1 - + src/cairo-cache.c | 2 -- + src/cairo-clip.c | 2 -- + src/cairo-debug.c | 1 - + src/cairo-directfb-surface.c | 11 ----------- + src/cairo-directfb.h | 9 --------- + src/cairo-font-subset-private.h | 1 - + src/cairo-font-subset.c | 2 -- + src/cairo-ft-font.c | 1 - + src/cairo-glitz-surface.c | 1 - + src/cairo-matrix.c | 3 --- + src/cairo-output-stream.c | 2 -- + src/cairo-path-fill.c | 1 - + src/cairo-path.c | 1 - + src/cairo-pdf-surface.c | 2 -- + src/cairo-pdf-test.h | 1 - + src/cairo-png.c | 1 - + src/cairo-ps-surface.c | 1 - + src/cairo-quartz-surface.c | 1 - + src/cairo-quartz.h | 1 - + src/cairo-region.c | 1 - + src/cairo-scaled-font-subsets.c | 1 - + src/cairo-scaled-font.c | 1 - + src/cairo-slope.c | 4 ---- + src/cairo-spline.c | 1 - + src/cairo-stroke-style.c | 1 - + src/cairo-svg-surface.c | 1 - + src/cairo-traps.c | 1 - + src/cairo-unicode.c | 3 --- + src/cairo-win32-font.c | 3 --- + src/cairo-win32-surface.c | 2 -- + src/cairo-xcb-surface.c | 1 - + src/cairo-xlib-surface.c | 3 --- + src/cairo-xlib-test.h | 1 - + src/cairo-xlib-xrender.h | 1 - + src/cairo-xlib.h | 1 - + src/cairo.c | 3 --- + src/cairo.h | 3 --- + src/cairoint.h | 4 ---- + test/buffer-diff.c | 1 - + test/buffer-diff.h | 2 -- + test/cairo-test-directfb.c | 4 ---- + test/cairo-test.c | 2 -- + test/font-face-get-type.c | 4 ---- + test/push-group.c | 2 -- + test/read-png.c | 1 - + test/surface-finish-twice.c | 1 - + test/text-cache-crash.c | 1 - + test/xmalloc.c | 1 - + 73 files changed, 184 deletions(-) + +commit 5278de09973c3e41028dc80a8862db01fc70cf11 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 15:41:31 2006 -0700 + + Remove all remaining trailing whitespace. + + This patch was produced with the following (GNU) sed script: + + sed -i -r -e 's/[ \t]+$//' + + run on all *.[ch] files within cairo. + + Note that the above script would have also created all the changes + from the previous commits to remove trailing whitespace. + + doc/tutorial/src/include/cairo-tutorial-gtk.h | 6 +- + doc/tutorial/src/include/cairo-tutorial-pdf.h | 2 +- + doc/tutorial/src/include/cairo-tutorial-png.h | 2 +- + pixman/src/fbcompose.c | 2 +- + pixman/src/fbmmx.c | 8 +- + pixman/src/fbpict.c | 10 +- + pixman/src/icblt.c | 42 ++++----- + pixman/src/icbltone.c | 8 +- + pixman/src/icformat.c | 4 +- + pixman/src/icimage.c | 6 +- + pixman/src/icimage.h | 2 +- + pixman/src/icint.h | 8 +- + pixman/src/icrect.c | 16 ++-- + pixman/src/ictransform.c | 2 +- + pixman/src/ictrap.c | 4 +- + pixman/src/ictri.c | 4 +- + pixman/src/pixman-xserver-compat.h | 2 +- + pixman/src/pixman.h | 8 +- + pixman/src/pixregion.c | 22 ++--- + pixman/src/pixregionint.h | 8 +- + pixman/src/slim_internal.h | 2 +- + src/cairo-atsui-font.c | 18 ++-- + src/cairo-clip.c | 4 +- + src/cairo-directfb-surface.c | 60 ++++++------ + src/cairo-directfb.h | 4 +- + src/cairo-font-options.c | 4 +- + src/cairo-font-subset.c | 4 +- + src/cairo-font.c | 8 +- + src/cairo-ft-font.c | 34 +++---- + src/cairo-gstate.c | 32 +++---- + src/cairo-hash.c | 6 +- + src/cairo-matrix.c | 28 +++--- + src/cairo-meta-surface.c | 4 +- + src/cairo-path.c | 2 +- + src/cairo-pattern.c | 4 +- + src/cairo-pen.c | 6 +- + src/cairo-polygon.c | 2 +- + src/cairo-ps-surface.c | 8 +- + src/cairo-quartz-surface.c | 6 +- + src/cairo-scaled-font-subsets.c | 2 +- + src/cairo-scaled-font.c | 34 +++---- + src/cairo-slope.c | 2 +- + src/cairo-surface-fallback.c | 12 +-- + src/cairo-surface.c | 8 +- + src/cairo-svg-surface.c | 126 +++++++++++++------------- + src/cairo-traps.c | 2 +- + src/cairo-unicode.c | 2 +- + src/cairo-wideint.c | 2 +- + src/cairo-win32-font.c | 30 +++--- + src/cairo-win32-surface.c | 12 +-- + src/cairo-xcb-surface.c | 4 +- + src/cairo-xlib-surface.c | 32 +++---- + src/cairo.c | 18 ++-- + src/cairo.h | 14 +-- + src/cairoint.h | 56 ++++++------ + test/cairo-test-directfb.c | 16 ++-- + test/cairo-test.c | 28 +++--- + test/cairo-test.h | 2 +- + test/imagediff.c | 2 +- + test/write-png.c | 2 +- + 60 files changed, 404 insertions(+), 404 deletions(-) + +commit 00592e075754594605fddfb2a702f3d2caa7c55c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 15:38:58 2006 -0700 + + Remove trailing whitespace from lines with a single brace. + + This patch was produced with the following (GNU) sed script: + + sed -i -r -e '/^[ \t]*[{}][ \t]*/ s/[ \t]+$//' + + run on all *.[ch] files within cairo. + + pixman/src/fbmmx.c | 6 +++--- + pixman/src/icimage.c | 4 ++-- + src/cairo-atsui-font.c | 2 +- + src/cairo-clip.c | 2 +- + src/cairo-directfb-surface.c | 4 ++-- + src/cairo-font-options.c | 2 +- + src/cairo-font-subset.c | 2 +- + src/cairo-font.c | 2 +- + src/cairo-ft-font.c | 2 +- + src/cairo-hash.c | 4 ++-- + src/cairo-image-surface.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-png.c | 2 +- + src/cairo-rectangle.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-svg-surface.c | 4 ++-- + src/cairo-win32-surface.c | 4 ++-- + test/clip-operator.c | 2 +- + test/operator-clear.c | 4 ++-- + test/operator-source.c | 4 ++-- + test/unbounded-operator.c | 4 ++-- + 21 files changed, 31 insertions(+), 31 deletions(-) + +commit 4670366ede0b0ed1abf47f4595a64bc5cd3c19fc +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 15:35:48 2006 -0700 + + Remove trailing whitespace from lines that look like comments. + + This patch was produced with the following (GNU) sed script: + + sed -i -r -e '/^[ \t]*\/?\*/ s/[ \t]+$//' + + run on all *.[ch] files within cairo, (though I manually excluded + src/cairo-atsui-font.c which has a code line that appears as a comment + to this script). + + doc/tutorial/src/include/cairo-tutorial-xlib.h | 2 +- + pixman/src/fbmmx.c | 8 +- + pixman/src/fbmmx.h | 2 +- + pixman/src/icbltone.c | 10 +- + pixman/src/iccolor.c | 2 +- + pixman/src/icformat.c | 2 +- + pixman/src/icimage.c | 4 +- + pixman/src/icint.h | 8 +- + pixman/src/icrop.h | 2 +- + pixman/src/ictransform.c | 2 +- + pixman/src/pixregion.c | 12 +- + pixman/src/slim_internal.h | 2 +- + src/cairo-arc.c | 4 +- + src/cairo-array.c | 32 ++--- + src/cairo-base85-stream.c | 2 +- + src/cairo-cache.c | 30 ++--- + src/cairo-clip-private.h | 2 +- + src/cairo-debug.c | 2 +- + src/cairo-font-options.c | 46 +++---- + src/cairo-font.c | 22 ++-- + src/cairo-ft-font.c | 22 ++-- + src/cairo-gstate.c | 14 +-- + src/cairo-hash.c | 30 ++--- + src/cairo-hull.c | 2 +- + src/cairo-image-surface.c | 30 ++--- + src/cairo-matrix.c | 28 ++--- + src/cairo-meta-surface.c | 6 +- + src/cairo-output-stream.c | 2 +- + src/cairo-path-data.c | 14 +-- + src/cairo-path-stroke.c | 6 +- + src/cairo-pattern.c | 60 ++++----- + src/cairo-pdf-surface.c | 2 +- + src/cairo-pen.c | 2 +- + src/cairo-png.c | 20 +-- + src/cairo-ps-surface.c | 16 +-- + src/cairo-region.c | 6 +- + src/cairo-scaled-font-subsets-private.h | 12 +- + src/cairo-scaled-font.c | 38 +++--- + src/cairo-surface-fallback.c | 6 +- + src/cairo-surface.c | 68 +++++----- + src/cairo-svg-surface.c | 18 +-- + src/cairo-svg.h | 2 +- + src/cairo-traps.c | 8 +- + src/cairo-unicode.c | 10 +- + src/cairo-win32-font.c | 14 +-- + src/cairo-win32-surface.c | 16 +-- + src/cairo-xcb-surface.c | 20 +-- + src/cairo-xlib-surface.c | 24 ++-- + src/cairo.c | 166 ++++++++++++------------- + src/cairo.h | 6 +- + src/cairoint.h | 8 +- + test/buffer-diff.c | 2 +- + test/buffer-diff.h | 2 +- + test/cairo-test.c | 4 +- + test/cairo-test.h | 2 +- + test/imagediff.c | 2 +- + test/rectangle-rounding-error.c | 8 +- + 57 files changed, 446 insertions(+), 446 deletions(-) + +commit 80b8deb1e4f9d0b856106031c6a7a629cca7552c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jun 6 15:25:49 2006 -0700 + + Remove extraneous whitespace from "blank" lines. + + This patch was produced with the following (GNU) sed script: + + sed -i -r -e 's/^[ \t]+$//' + + run on all *.[ch] files within cairo. + + doc/tutorial/src/include/cairo-tutorial-gtk.h | 2 +- + doc/tutorial/src/include/cairo-tutorial-pdf.h | 2 +- + doc/tutorial/src/include/cairo-tutorial-png.h | 2 +- + doc/tutorial/src/lca.c | 6 +- + pixman/src/fbcompose.c | 6 +- + pixman/src/fbedge.c | 4 +- + pixman/src/fbedgeimp.h | 8 +- + pixman/src/fbmmx.c | 530 +++++++++++++------------- + pixman/src/fbpict.c | 8 +- + pixman/src/fbpict.h | 2 +- + pixman/src/fbtrap.c | 24 +- + pixman/src/icblt.c | 54 +-- + pixman/src/icbltone.c | 38 +- + pixman/src/icformat.c | 24 +- + pixman/src/icimage.c | 18 +- + pixman/src/icimage.h | 6 +- + pixman/src/icint.h | 26 +- + pixman/src/icrect.c | 12 +- + pixman/src/icrop.h | 4 +- + pixman/src/icstipple.c | 6 +- + pixman/src/ictrap.c | 8 +- + pixman/src/ictri.c | 26 +- + pixman/src/icutil.c | 2 +- + pixman/src/pixregion.c | 32 +- + pixman/src/renderedge.c | 12 +- + src/cairo-analysis-surface.c | 2 +- + src/cairo-arc.c | 2 +- + src/cairo-atsui-font.c | 24 +- + src/cairo-base85-stream.c | 2 +- + src/cairo-clip.c | 26 +- + src/cairo-directfb-surface.c | 6 +- + src/cairo-font-options.c | 8 +- + src/cairo-font-subset.c | 6 +- + src/cairo-font.c | 10 +- + src/cairo-ft-font.c | 196 +++++----- + src/cairo-gstate-private.h | 2 +- + src/cairo-gstate.c | 80 ++-- + src/cairo-hash.c | 14 +- + src/cairo-image-surface.c | 28 +- + src/cairo-lzw.c | 2 +- + src/cairo-matrix.c | 84 ++-- + src/cairo-meta-surface.c | 10 +- + src/cairo-operator.c | 8 +- + src/cairo-output-stream.c | 14 +- + src/cairo-paginated-surface.c | 8 +- + src/cairo-path-bounds.c | 8 +- + src/cairo-path-fill.c | 2 +- + src/cairo-path-stroke.c | 16 +- + src/cairo-pattern.c | 44 +-- + src/cairo-pen.c | 10 +- + src/cairo-png.c | 12 +- + src/cairo-ps-surface.c | 36 +- + src/cairo-quartz-surface.c | 16 +- + src/cairo-region.c | 2 +- + src/cairo-scaled-font-subsets.c | 2 +- + src/cairo-scaled-font.c | 90 ++--- + src/cairo-spline.c | 2 +- + src/cairo-surface-fallback.c | 82 ++-- + src/cairo-surface.c | 44 +-- + src/cairo-svg-surface.c | 100 ++--- + src/cairo-traps.c | 38 +- + src/cairo-unicode.c | 30 +- + src/cairo-wideint.c | 16 +- + src/cairo-wideint.h | 2 +- + src/cairo-win32-font.c | 106 +++--- + src/cairo-win32-private.h | 6 +- + src/cairo-win32-surface.c | 96 ++--- + src/cairo-xcb-surface.c | 36 +- + src/cairo-xlib-private.h | 4 +- + src/cairo-xlib-screen.c | 32 +- + src/cairo-xlib-surface.c | 154 ++++---- + src/cairo.c | 18 +- + src/cairo.h | 8 +- + src/cairoint.h | 34 +- + src/test-fallback-surface.c | 4 +- + src/test-meta-surface.c | 2 +- + test/cairo-test.c | 24 +- + test/caps-joins.c | 2 +- + test/clip-all.c | 2 +- + test/clip-nesting.c | 4 +- + test/clip-operator.c | 12 +- + test/dash-offset-negative.c | 8 +- + test/fill-and-stroke.c | 2 +- + test/filter-nearest-offset.c | 2 +- + test/font-face-get-type.c | 2 +- + test/get-and-set.c | 2 +- + test/gradient-alpha.c | 2 +- + test/linear-gradient.c | 8 +- + test/mask.c | 8 +- + test/operator-clear.c | 12 +- + test/operator-source.c | 14 +- + test/ps-features.c | 2 +- + test/rectangle-rounding-error.c | 2 +- + test/rel-path.c | 4 +- + test/self-copy.c | 6 +- + test/source-clip.c | 2 +- + test/surface-pattern.c | 2 +- + test/svg-clip.c | 2 +- + test/text-pattern.c | 10 +- + test/text-rotate.c | 2 +- + test/transforms.c | 2 +- + test/trap-clip.c | 4 +- + test/unbounded-operator.c | 12 +- + test/user-data.c | 2 +- + test/write-png.c | 2 +- + test/xlib-surface.c | 18 +- + 106 files changed, 1311 insertions(+), 1311 deletions(-) + +commit 28d47d332aafa81bcbc669603357298cb0a14322 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 5 14:25:13 2006 -0700 + + Move rectangle functions to new cairo-rectangle.c + + src/Makefile.am | 1 + + src/cairo-gstate.c | 46 ---------------------------- + src/cairo-rectangle.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 86 insertions(+), 46 deletions(-) + +commit 3d9dc96d186c9093da24c7bbf36614f3d8df1758 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 25 02:28:09 2006 -0700 + + New API: Add cairo_image_surface_get_{data,format,stride} + + src/cairo-image-surface.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 9 +++++++ + 2 files changed, 78 insertions(+) + +commit 0c49666231e42a3f968ad46a0aa58fc7b854b258 +Author: Jeff Muizelaar <jeff@freiheit.infidigm.net> +Date: Sat May 27 02:23:09 2006 -0400 + + Only destroy scaled glyphs if they are not in the cache. + + Previously, when scaled_glyph_init failed we would destroy the scaled glyph in + CLEANUP. However, this causes trouble later because there is still a reference + to the glyph in the cache. This remaining reference causes a number of bad things, + including a double destruction when the cache is destroyed. + + src/cairo-scaled-font.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit bafdded8ee43632e5f60307e53f0489be0afc3c4 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun May 28 13:25:57 2006 -0400 + + Remove cairo_public from _cairo_lzw_compress() definition. + + src/cairo-lzw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 84c6f879631b3d3ca63c3fd99b9cb68b111d283f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Sun May 28 13:38:50 2006 -0400 + + Clarify licensing of float formatting code. + + src/cairo-output-stream.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 79c86b04a7848830998e1a5344c6a9ecf9113789 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun May 28 16:50:54 2006 +0200 + + Add "html" Makefile target to run make-html.pl + + test/Makefile.am | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 508d0955fb3a851919233f27b5fe9408c85fa053 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Thu May 25 21:54:54 2006 +0200 + + Distribute make-html.pl + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit f072d4ed66f78bd4fba4fb44e30f3ddd3f10fc33 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Thu May 25 21:21:31 2006 +0200 + + Add missing reference images to EXTRA_DIST + + test/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0b63baba6e8c3f2f6da52d4476ec595ff87dfc93 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Thu May 25 17:29:01 2006 +0200 + + Make BeOS compile again + + ..by passing the cairo_content_t to _cairo_surface_init + + src/cairo-beos-surface.cpp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 22232be7592dadc22fef614aefee9c9398a8510c +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 24 17:24:52 2006 -0700 + + Note the changed semantics of cairo_surface_set_device_offset + + Specifically, device offsets now affect using the offset surface in + a source pattern as well as drawing to the surface. This behavior + os also verified with a new test case: test/device-offset.c + + src/cairo-surface.c | 4 +- + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/device-offset-ref.png | Bin 0 -> 137 bytes + test/device-offset-rgb24-ref.png | Bin 0 -> 130 bytes + test/device-offset.c | 93 +++++++++++++++++++++++++++++++++++++++ + 6 files changed, 97 insertions(+), 2 deletions(-) + +commit d0dd3b822e98358e88f8c9261ef633331548ccfd +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 24 17:05:51 2006 -0700 + + New API: Add new function cairo_surface_get_content + + This assumes that the directfb, glitz, and quartz backends + always create surfaces with content of COLOR_ALPHA which might + be totally wrong. + + src/cairo-analysis-surface.c | 5 ++- + src/cairo-directfb-surface.c | 4 +- + src/cairo-glitz-surface.c | 4 +- + src/cairo-image-surface.c | 3 +- + src/cairo-meta-surface.c | 6 ++- + src/cairo-paginated-surface.c | 3 +- + src/cairo-pdf-surface.c | 3 +- + src/cairo-ps-surface.c | 3 +- + src/cairo-quartz-surface.c | 4 +- + src/cairo-surface.c | 22 +++++++++- + src/cairo-svg-surface.c | 3 +- + src/cairo-win32-surface.c | 6 ++- + src/cairo-xcb-surface.c | 29 +++++++++++++- + src/cairo-xlib-surface.c | 93 ++++++++++++++++++++++++------------------- + src/cairo.h | 3 ++ + src/cairoint.h | 5 ++- + src/test-fallback-surface.c | 3 +- + src/test-meta-surface.c | 3 +- + src/test-paginated-surface.c | 3 +- + test/cairo-test.c | 18 +++++++++ + 20 files changed, 162 insertions(+), 61 deletions(-) + +commit 0796845ae6923f3ccef5df231b7d9a2c145063fd +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 24 14:03:49 2006 -0700 + + Add new fallback-resolution test for bug in cairo_pdf_surface_set_dpi + + test/.gitignore | 2 ++ + test/Makefile.am | 1 + + test/fallback-resolution.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 87 insertions(+) + +commit 11b2481862e15a2cdedae347eab4347f7b63f715 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 24 14:02:30 2006 -0700 + + PDF: Add new, private test function: cairo_pdf_test_force_fallbacks + + doc/public/Makefile.am | 1 + + src/Makefile.am | 2 +- + src/cairo-pdf-surface.c | 26 ++++++++++++++++++++++- + src/cairo-pdf-test.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 82 insertions(+), 2 deletions(-) + +commit 65b9217cadcd09f1ed18aa0da38d0b72b6438780 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 24 11:37:05 2006 -0700 + + cairo-xlib-test: Rename cairo_test_xlib function prefix to cairo_xlib_test + + src/cairo-xlib-surface.c | 4 ++-- + src/cairo-xlib-test.h | 2 +- + test/xlib-surface.c | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 5acce60291fe0b61a67ff1e803b6226db576c233 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 24 10:35:24 2006 -0700 + + Typo fixes + + test/pdf-features.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a5a72676bd34ac6bfdf5e0bcfd3fb21fcbada673 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 13:41:44 2006 -0700 + + ROADMAP: Note that the cairo_set_line_width issue is resolved + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4476dda49b709875b8204567168752c15927480 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 13:41:00 2006 -0700 + + PDF: Move dash operator before path construction operators. + + I don't recall anything about this in the PDF reference, (though I + also didn't look specifically for it), but without this acroread + is quite unhappy with cairo's PDF output when it includes dashing. + + src/cairo-pdf-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 59885c6a122f593b417cb47dbd676eeac0cd8f69 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 12:08:20 2006 -0700 + + Clarify the documentation for cairo_set_dash + + Note that dash length units are evaluated in the user space + at the time of the stroke operation, (not the user space at + the time of cairo_set_dash). + + src/cairo.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 68b41cfd06dd6c798f8045ba1580342669ef5539 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 11:23:27 2006 -0700 + + PDF: Share path callbacks for fill and stroke. + + src/cairo-pdf-surface.c | 112 ++++++++++++++++-------------------------------- + 1 file changed, 36 insertions(+), 76 deletions(-) + +commit 7e5bef2439be93e46583c0922f68ad770179fa1e +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 11:17:01 2006 -0700 + + PDF: Rename pdf_stroke_t to pdf_path_into_t for future sharing with fill + + src/cairo-pdf-surface.c | 38 +++++++++++++++++++------------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +commit 1b1b59a4a9cdeab0f3c360c09721aff23154015f +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 11:12:09 2006 -0700 + + New test: dash-scale + + Tests interactions of cairo_set_dash and cairo_scale, (in particular with a + non-uniformly scaled pen). + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/dash-scale-ps-argb32-ref.png | Bin 0 -> 2950 bytes + test/dash-scale-ref.png | Bin 0 -> 7791 bytes + test/dash-scale.c | 125 ++++++++++++++++++++++++++++++++++++++ + 5 files changed, 128 insertions(+) + +commit 0755a619a101b89f5c5439f12e0544ab5ecac997 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 10:54:54 2006 -0700 + + SVG: Fix for line-width-scale + + Use the same approach as the PDF backend: emit the pen matrix as the + SVG transform for the stroke, and compensate by first transforming all path + coordinates by the ctm_inverse. + + src/cairo-svg-surface.c | 63 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 41 insertions(+), 22 deletions(-) + +commit b1231e2ef349af1c0b130880603a924ff67b2967 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 23 10:45:18 2006 -0700 + + Codify 1.0 behavior of cairo_set_line_width as a feature, not a bug. + + Clarify the documentation of cairo_set_line_width to indicate that the + value will be interpreted within the user space at the time of the + stroke. + + Also adjust the comments in test/line-width-scale as well as the + reference images for that test to match. + + src/cairo.c | 25 +++++++++++++++++++------ + test/line-width-scale-ps-argb32-ref.png | Bin 1470 -> 1599 bytes + test/line-width-scale-ref.png | Bin 4884 -> 6445 bytes + test/line-width-scale.c | 28 +++++++++++++++------------- + 4 files changed, 34 insertions(+), 19 deletions(-) + +commit 0a1ec91977ef05f04e2cc52895fd98a903f1c8eb +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 22 09:22:42 2006 -0700 + + Move prototype of cairo_debug_reset_static_data from uninstalled cairo-debug.h to cairo.h + + src/Makefile.am | 4 +--- + src/cairo-debug.h | 48 ------------------------------------------------ + src/cairo.h | 4 ++++ + src/cairoint.h | 1 - + test/cairo-test.h | 1 - + 5 files changed, 5 insertions(+), 53 deletions(-) + +commit 27e9e3cecd354475047ac268d5ef52eba3f041f1 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri May 19 02:17:35 2006 -0400 + + Handle seac charstring commands correctly. + + - Include PS standard encoding table so we can map from standard + encoding indices to glyph names and then make sure to include the + glyph of that name. + - Cut out verbose debugging code. + - Fix a couple of bugs in glyph name to index lookup code. + + src/cairo-type1-subset.c | 218 +++++++++++++++++++---------------------------- + 1 file changed, 90 insertions(+), 128 deletions(-) + +commit 89384ae12474c257fb47e4231229235207ab8f85 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 18 21:48:38 2006 -0700 + + PDF: Squelch a couple of bogus "may be used uninitialized" warnings. + + src/cairo-pdf-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e2713057f80c412a3ba947f9c7af2f18dd26105e +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 15 14:10:59 2006 -0800 + + Define kCGBitmapByteOrder32Host for when the SDK doesn't define it + (cherry picked from bd9b5d29e39f424e912184dcd0dc2610637d5fdf commit) + + src/cairo-atsui-font.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 5bdcfd14136d02ccaec275b2bcd5fb2744352f87 +Author: Vladimir Vukicevic <vladimir@cyclone.vlad1.com> +Date: Thu Mar 16 14:14:35 2006 -0800 + + Whitespace fix + (cherry picked from 0bb567a2f1807d83508e2d7598a8bd8f4d94208d commit) + + src/cairo-win32-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e8069da97bc5c09d9bac91cf401d9e3c3ba91607 +Author: Vladimir Vukicevic <vladimir@cyclone.vlad1.com> +Date: Thu Mar 16 17:00:37 2006 -0800 + + CAIRO_SCALED_FONT_TYPE_* -> CAIRO_FONT_TYPE_* + + Some of these were missed when CAIRO_SCALED_FONT_TYPE_* was renamed. + (cherry picked from 33dba4a690a5e4ec13ed294307b89cceac1ca696 commit) + + src/cairo-win32-surface.c | 2 +- + src/cairo.h | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit fb7ae2a28e46895f764754c6961cb99989be7a04 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 21:01:20 2006 -0400 + + Remember to call cairo_type1_font_subset_destroy(). + + src/cairo-type1-subset.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1d2b60454fb1e7a1e4b7614029f02dfb0e33acb3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 20:50:36 2006 -0400 + + Consolidate a few arrays into a array of structs. + + src/cairo-type1-subset.c | 76 +++++++++++++++++++++++------------------------- + 1 file changed, 37 insertions(+), 39 deletions(-) + +commit 9b84b3da58a62b25c129626f918713036e41cc88 +Author: Vladimir Vukicevic <vladimir@cyclone.vlad1.com> +Date: Fri Mar 17 00:06:21 2006 -0800 + + [win32] GDI is nearly always faster than pixman; use it whenever possible + + Remove local image check from fill_rectangles and fix check for whether + we can AlphaBlend or not (ARGB->ARGB AlphaBlend works fine) + (cherry picked from f099783b3e7f895a59d4d4a67a8534f1d21d44e1 commit) + + src/cairo-win32-surface.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +commit 2a89526edf1f42dfc3e8592b82a51b9970015bda +Author: Vladimir Vukicevic <vladimir@cyclone.vlad1.com> +Date: Thu Mar 16 14:04:49 2006 -0800 + + [win32] Add GdiFlush() calls after DIB creation, as per MSDN docs + + Also fixes some spacing/tab issues + (cherry picked from 123ca7c9f9d8984be5ed4fb42a2897508e8ff44a commit) + + src/cairo-win32-surface.c | 38 +++++++++++++++++++++----------------- + 1 file changed, 21 insertions(+), 17 deletions(-) + +commit a9c42e8fc264e3d07e4888d5965eea130c1e9d0a +Author: Stuart Parmenter <stuart@mozilla.com> +Date: Wed Mar 15 14:20:35 2006 -0800 + + [win32] fix win32_show_glyphs glyph offsets + (cherry picked from 947a4a1bc6a0a0ee78c44b71fef32c924ebc9397 commit) + + src/cairo-win32-surface.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 59a45f1c4a914c9640bbea37c72b1ec222f56ff3 +Author: Stuart Parmenter <pavlov@pavlov.net> +Date: Fri Mar 10 12:25:07 2006 -0800 + + [win32] implement win32 show_glyphs + (cherry picked from 9c7d0cbde415d02b6e8298a02b3b62cf4513a59e commit) + + src/cairo-win32-font.c | 14 +++--- + src/cairo-win32-private.h | 1 + + src/cairo-win32-surface.c | 115 +++++++++++++++++++++++++++++++++++++++++++++- + 3 files changed, 121 insertions(+), 9 deletions(-) + +commit a10bbecaf8f122726c3e5b55b07bcd7882f6f319 +Author: Stuart Parmenter <pavlov@pavlov.net> +Date: Fri Mar 10 12:12:36 2006 -0800 + + [win32] Allow for creating a font from a HFONT + (cherry picked from 677f6c84f9beae3afd375663fed0a440007ebca2 commit) + + src/cairo-win32-font.c | 35 +++++++++++++++++++++++++++++++---- + src/cairo-win32.h | 3 +++ + 2 files changed, 34 insertions(+), 4 deletions(-) + +commit 244c111fca042b15d6718295ca2f7c7843fa7ab5 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 10 11:56:27 2006 -0800 + + [win32] Add SHADEBLENDCAPS and SB_NONE definitions for older SDKs + (cherry picked from 7a68b7d035b1c63076d6fa6c54d40944459d206d commit) + + src/cairo-win32-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 92a015ff8ec5c11aac6d9c0c6702fa4873c04381 +Author: Vladimir Vukicevic <vladimir@cyclone.vlad1.com> +Date: Mon Mar 27 13:49:58 2006 -0800 + + [xlib] only do glyph extents computation if non-solid source. + + xlib_show_glyphs was always calculating the glyph extents, even when it + didn't need to; this only does it when necessary. + + Also adds an implementation of surface_flush() for xlib that just calls + XSync. + (cherry picked from 8770ac5b5cdba8007c4c6a6a980e6e06acf6aeb6 commit) + + src/cairo-xlib-surface.c | 49 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 31 insertions(+), 18 deletions(-) + +commit 108431414faa8792659616bae35584b8fced3b21 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 8 21:08:57 2006 -0800 + + [xlib] implement _cairo_xlib_surface_show_glyphs + + Avoid using the fallback paths as much as possible; implement real + show_glyphs, falling back for OPERATOR_SOURCE (due to Render bug), and all + unbounded operators (let the fallback code deal with fixup). Also fall + back if we have a fallback mask clip set. + + (cherry picked from 3225a4ec820fd4051dd893ffc4258b182bd62dca commit) + + src/cairo-xlib-surface.c | 276 ++++++++++++++++++++++++++--------------------- + 1 file changed, 152 insertions(+), 124 deletions(-) + +commit 6d53687058dc35bb1abd1f9552f43fccad61474f +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 20:03:53 2006 -0400 + + Look for /-| or /RD tokens to determine the charstring delimiter tokens. + + src/cairo-type1-subset.c | 35 +++++++++++++++++++++++++++++------ + 1 file changed, 29 insertions(+), 6 deletions(-) + +commit 3487191b2230571323201ed045263433e77e5345 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 18 15:36:43 2006 -0700 + + xlib: Style cleanups for _cairo_xlib_surface_create_similar + + Including style cleanups for _xrender_format_matches_content. + + There's even a bug fix here as well. Previously, we would miss compatibility + if the existing xlib surface had a NULL visual, (even if it had a compatible + xrender_format). We now catch this case, and don't bother even trying to + store a visual into the resulting surface. + + src/cairo-xlib-surface.c | 97 ++++++++++++++++++++++++++---------------------- + 1 file changed, 53 insertions(+), 44 deletions(-) + +commit a96bd2b4f9ab399eee5198c0d27a6cd67798931b +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 18 15:20:25 2006 -0700 + + xlib: Rename surface->format to surface->xrender_format to avoid confusion + + With both XRenderPictFormat* and cairo_format_t values being manipulated in the same + functions, this really needed to be done. + + src/cairo-xlib-surface.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit ea05e027111d5f336b7e3f2170f929b0b1e37692 +Author: Robert O'Callahan <rocallahan@novell.com> +Date: Fri May 19 08:26:08 2006 +1200 + + [xlib] Have create_similar try harder to create the right surface + + I recently discovered that cairo_create_similar on a 16-bit xlib surface + creates a surface backed by a 24-bit pixmap. This results in absymal + performance --- I can actually watch a copy from the similar to the + original move down the screen, on my dual Xeon, NVidia vendor driver + machine. It also means xlib-based code like GTK themes can't render to + the surface because it doesn't match the screen depth. + + The attached patch makes _cairo_xlib_surface_create_similar match the + characteristics of the input surface as closely as I know how, and fixes + my issues. + + src/cairo-xlib-surface.c | 54 +++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 51 insertions(+), 3 deletions(-) + +commit d09d95a3231d9137c00da72e5bf56fe246671e15 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 15:10:05 2006 -0400 + + Track glyph subset indices and use them in the output. + + src/cairo-type1-subset.c | 50 +++++++++++++++++++++++++----------------------- + 1 file changed, 26 insertions(+), 24 deletions(-) + +commit 5f55ae7d91174d29f83b2a15e4def0f6baea7344 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 13:57:03 2006 -0400 + + Make ps surface use type1 subset code. + + - Add _cairo_ps_surface_emit_type1_font_subset() which just dumps the + type1 subset into the ps document. + - Add a 'name' parameter to _cairo_type1_subset_init() so it will be + defined under the right name in the ps document. + - Quiet down debug output from type1 subset code. + - Reenable code to output custom /Encoding table. + + src/cairo-pdf-surface.c | 5 ++++- + src/cairo-ps-surface.c | 34 +++++++++++++++++++++++++++++++++ + src/cairo-scaled-font-subsets-private.h | 1 + + src/cairo-type1-subset.c | 26 +++++++++++++++++++------ + 4 files changed, 59 insertions(+), 7 deletions(-) + +commit fe58e7a81fe9f787ef262615bc1802243770a432 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 13:35:57 2006 -0400 + + Only use the word wrap stream when emitting paths. + + This patch also factors the word wrap stream setup and teardown + and the call to _cairo_path_fixed_interpret() out into a new function, + _cairo_ps_surface_emit_path(). + + src/cairo-ps-surface.c | 287 ++++++++++++++++++++++++------------------------- + 1 file changed, 140 insertions(+), 147 deletions(-) + +commit 2fafbac390f13c8c47464defc8c30e705be98bbb +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 02:24:02 2006 -0400 + + Use RD and ND for delimiting glyph data instead of -| and |-. + + We probably should figure out from the private dictionary which of the two + pairs the font defines and uses, but I don't actually have fonts that + use -| and |-, so for now for flip the default. + + src/cairo-type1-subset.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 466d3da4ef2267287095e67342da8eb360198542 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 17 17:17:02 2006 -0400 + + Add code to emit type1 dicts to the pdf backend. + + src/cairo-pdf-surface.c | 110 ++++++++++++++++++++++++++++++++ + src/cairo-scaled-font-subsets-private.h | 2 + + src/cairo-type1-subset.c | 12 ++-- + 3 files changed, 120 insertions(+), 4 deletions(-) + +commit c36de5b7c5173639712074d0f98365b107707ae7 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 17 12:05:16 2006 -0400 + + Pull in type1 subset code from the cvs repo it was sitting in. + + src/Makefile.am | 1 + + src/cairo-font-subset.c | 1 - + src/cairo-scaled-font-subsets-private.h | 41 ++ + src/cairo-type1-subset.c | 1035 +++++++++++++++++++++++++++++++ + 4 files changed, 1077 insertions(+), 1 deletion(-) + +commit 127fab4695ef849364e755e10c2b960add78782b +Author: Kristian Høgsberg <krh@redhat.com> +Date: Thu May 18 02:12:06 2006 -0400 + + Remember to call _cairo_truetype_subset_fini() after outputting subset. + + src/cairo-ps-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit b16c29ff0c38b8fa8e5753770bb93ad9ff084579 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed May 17 01:30:43 2006 -0400 + + Set libcairo_font_subset_sources for ps, pdf, and svg backends. + + Backends that use the font subsetting code should add the font subsetting + sources to the build. This is dont by setting libcairo_font_subset_sources, + in the conditional section for each backend. If any one is enabled, the + sources will be added to the build. + + src/Makefile.am | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit d42b2c7a89451e95e6e9ec6bc439f06855c66802 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 16 23:56:38 2006 -0400 + + Remember to destroy cairo_pdf_ft_font_t once we've generated the subset. + + Also, remove cairo_private from function definitions. + + src/cairo-font-subset.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit f3209660c33bc128c58ec487c51440271f30a923 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 16 23:24:09 2006 -0400 + + Print out ps comment in the truetype emit code and update type3 ps comment. + + src/cairo-ps-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 3975d7f8a26b53d4d2c7d587fbcfe9ed6ddf78d8 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 16 23:20:08 2006 -0400 + + Add support for truetype subset to ps backend. + + Same story as for the pdf backend: try to output a truetype subset if + possible, otherwise fall back to a type3 font. Ajdust text output code + to scale font accordingly and scale type3 fonts to unity. + + src/cairo-ps-surface.c | 113 +++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 105 insertions(+), 8 deletions(-) + +commit 2c6e799ee64cfc00145ecbe0d0b93256c237dcf4 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 16 22:53:05 2006 -0400 + + Switch to using Tm for text positioning and scale type3 fonts to unit size. + + This change changes the text output code to use the Tm operator for + positioning the glyphs. This allows us to set the scale matrix from + the cairo_scaled_font_t so truetype glyphs get transformed correctly. + However, we now need to scale type3 glyph to unity to compensate. + Longer term we should just only output one unit sized type3 subset for + a cairo_font_face_t and use that for all cairo_scaled_font_t's coming from + that font face. + + Also, this fixes a num_glyphs initialization bug. + + src/cairo-font-subset.c | 2 +- + src/cairo-pdf-surface.c | 25 ++++++++++++++++++++++--- + 2 files changed, 23 insertions(+), 4 deletions(-) + +commit e846dca44e8c60bf45ab84d7adaf7eefe3088f43 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue May 16 21:41:07 2006 -0400 + + Hook _cairo_truetype_subset_init() up to existing truetype subset code. + + This is a minimal first change to get things working. The truetype + subset code still needs to be renamed and moved around a bit. + + src/cairo-font-subset.c | 151 +++++++++++++++++++++++++++++------------------- + 1 file changed, 91 insertions(+), 60 deletions(-) + +commit f4f11eba5b6daa6f82b967dcb21715b7f16d9719 +Author: Kristian Høgsberg <krh@dinky.bitplanet.net> +Date: Tue May 16 19:01:15 2006 -0400 + + Output pdf dicts for truetype subset fonts. + + src/cairo-font-subset.c | 21 +++++++ + src/cairo-pdf-surface.c | 97 ++++++++++++++++++++++++++++++++- + src/cairo-scaled-font-subsets-private.h | 41 ++++++++++++++ + 3 files changed, 158 insertions(+), 1 deletion(-) + +commit 13a05830f5e524cd69b75796888c7a99ba9ce106 +Author: Kristian Høgsberg <krh@dinky.bitplanet.net> +Date: Tue May 16 16:42:44 2006 -0400 + + Update pdf font emit code to try to emit a truetype subset before type3. + + src/cairo-pdf-surface.c | 34 +++++++++++++++++++++++++++++----- + 1 file changed, 29 insertions(+), 5 deletions(-) + +commit 05b1d2f9c5b827d52f3eb837c6c591c877dde419 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 16 01:04:16 2006 -0700 + + PDF: Fix broken per-page sizes in PDF output. + + This was first broken in: + + PDF: Fold (unused) cairo_pdf_document_t into cairo_pdf_surface_t + f500cef19f049a4a0ed296172618db2f26794932 + + Thanks, git bisect! + + src/cairo-pdf-surface.c | 17 +++++------------ + 1 file changed, 5 insertions(+), 12 deletions(-) + +commit d70ade00fb67c6f77d23653481079996ec1e1292 +Merge: 41d4354 c7ef4cb +Author: Kristian Høgsberg <krh@dinky.bitplanet.net> +Date: Mon May 15 17:53:56 2006 -0400 + + Merge branch 'master' of git://git.freedesktop.org/git/cairo + +commit 41d435418c414405035eb911239dc6580edabd6b +Author: Kristian Høgsberg <krh@dinky.bitplanet.net> +Date: Mon May 15 17:36:12 2006 -0400 + + Documentation fixes (cairo_font_create -> cairo_scaled_font_create). + + src/cairo-ft-font.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit c7ef4cb3f3b14543842bf538dcb216d1ea51d89f +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 10:25:44 2006 -0700 + + ROADMAP: Note that PDF type 3 font support is done + + ROADMAP | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 621ebc4726c075c183028818af1944f67a60b7ce +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 10:16:06 2006 -0700 + + pixman: Remove unused code to quiet compiler warnings + + pixman/src/fbpict.c | 14 ----------- + pixman/src/icimage.c | 66 ---------------------------------------------------- + 2 files changed, 80 deletions(-) + +commit 636cbe5a191cf8065facfbe45f32620cea2009a5 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 10:14:39 2006 -0700 + + pixman: Add default case to quiet compiler warning + + pixman/src/fbpict.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2e4c8924ad1c27d807e86a155c6582fd506c66c0 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 10:07:57 2006 -0700 + + pixman: Fix build to enable warnings again + + configure.in | 2 ++ + pixman/src/Makefile.am | 4 ++-- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit bf2ab0de927dae4a1dd67a0cbacefabaf0e4255b +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 10:04:53 2006 -0700 + + PDF: Add Type3 font support to PDF output. + + This uses the recently added cairo-scaled-font-subsets interface in a + style very similar to what the PS surface does. + + src/cairo-pdf-surface.c | 242 +++++++++++++++++++++++++++++-- + test/select-font-face-pdf-argb32-ref.png | Bin 2781 -> 2782 bytes + 2 files changed, 231 insertions(+), 11 deletions(-) + +commit 6f417fed51672ccca305b7fcc8b1bc3af7609534 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 10:00:18 2006 -0700 + + PDF: Move Resources dictionary up from Page objects to Pages object. + + This allows for more sharing of resource objects. It also avoids some + confusion in trying to set independent resources at a global and a + per-page level, (which doesn't work since the inheritance only works + for an entire resources object---it can only be overriden in its + entirety, not for subsets of the resources). + + src/cairo-pdf-surface.c | 118 ++++++++++++++++++++++++------------------------ + 1 file changed, 58 insertions(+), 60 deletions(-) + +commit 049100fb870bee89b28bd14a9625add33f38a2bd +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 09:52:57 2006 -0700 + + PDF: Use consistent style for typedef struct and macro naming. + + src/cairo-pdf-surface.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +commit 45d0540c3375bfdb09973a809c08b5dec1ae2219 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 09:41:36 2006 -0700 + + PS: Remove the fallback case from _cairo_ps_surface_show_glyphs + + The only expected errors that would lead to this fallback are serious + problems such as out of memory. There's no reason to go to heroic + efforts to draw as much as possible in face of an error like that. + + Prefer simpler code instead. + + src/cairo-ps-surface.c | 26 ++++++-------------------- + 1 file changed, 6 insertions(+), 20 deletions(-) + +commit cb32b41a4e24df612dc0cabbe1e22098584759e9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 09:39:16 2006 -0700 + + PS: Fix arguments to setcachedevice + + Since we are only ever displaying a single glyph at a time we don't + care about the width values passed to setcachedevice at all---we only + care about the bounding box. + + That's what the code was trying to do before, but the arguments were + misaligned and we were instead passing bounding-box values for the + widths and hard-coding half of the bounding-box values as 0. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2c03d51daa60bf18b66ace148e6f8df7c454e2c +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 15 09:28:32 2006 -0700 + + Change scaled_font_subsets_callback to have return type of void. + + The return of status from this callback was misleading. The function + actually calling the callback was also a hash table callback function, + which itself is void---so any status value returned was being lost. + + Instead, we now stash any errors that occur during the fallback into + surface->status. + + src/cairo-ps-surface.c | 30 +++++++++++++++--------------- + src/cairo-scaled-font-subsets-private.h | 2 +- + src/cairo-svg-surface.c | 25 ++++++++++--------------- + 3 files changed, 26 insertions(+), 31 deletions(-) + +commit f500cef19f049a4a0ed296172618db2f26794932 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 12 14:56:11 2006 -0700 + + PDF: Fold (unused) cairo_pdf_document_t into cairo_pdf_surface_t + + src/cairo-pdf-surface.c | 932 ++++++++++++++++++++---------------------------- + 1 file changed, 392 insertions(+), 540 deletions(-) + +commit d84a1cac1cc2da8a34fb6aa91c3c4f4058527207 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 12 13:31:12 2006 -0700 + + PDF: Use cairo_pdf_resource_t more consistently. + + Eliminate the named structure cairo_pdf_stream_t. This structure was + being dynamically allocated, passed around, and leaked when only an ID + was actually needed to be passed around. + + Similarly, many other uses of PDF resources were passing bare unsigned + int types rather than the safer and more legible cairo_pdf_resource_t. + + src/cairo-pdf-surface.c | 487 +++++++++++++++++++++++------------------------- + 1 file changed, 236 insertions(+), 251 deletions(-) + +commit b7e9506707878367493a8a45c74bb6eb048b7e88 +Author: Tim Mooney <enchanter@users.sourceforge.net> +Date: Wed May 10 20:51:53 2006 -0700 + + bug #6890: fix the signature for main() in pthread-show-text + + test/pthread-show-text.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1ba537be18316154781e36fb66545f82afb3c3a0 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 19:01:40 2006 -0700 + + Fix memory leak in _cairo_scaled_font_subsets_foreach + + src/cairo-scaled-font-subsets.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7bd3a037daadaed5b720d9590a479320de533af5 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 18:52:36 2006 -0700 + + Add documentation for the _cairo_scaled_font_subsets interface. + + src/cairo-scaled-font-subsets-private.h | 109 +++++++++++++++++++++++++++++++- + 1 file changed, 106 insertions(+), 3 deletions(-) + +commit 7c137b7e2ccbe76bb7870756a8fd29458b571a71 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 15:14:10 2006 -0700 + + SVG: Discard custom font subsetting in favor of sharing cairo-scaled-font-subsets + + ROADMAP | 2 +- + src/cairo-svg-surface.c | 272 ++++++++---------------------------------------- + 2 files changed, 45 insertions(+), 229 deletions(-) + +commit f459c1f0de1d874da55ab9eff075834c4b8633b8 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 15:12:53 2006 -0700 + + Tweak names to match those of cairo-scaled-font-subsets + + Also, remove a now obsolete field from cairo_ps_surface_t + + src/cairo-ps-surface.c | 19 ++++++++----------- + 1 file changed, 8 insertions(+), 11 deletions(-) + +commit 8a209e6ad9a77b8b922687e08731c4b3bbd5621b +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 14:50:31 2006 -0700 + + Fix cairo_output_stream_destroy to do nothing on nil stream objects. + + src/cairo-output-stream.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 0544515279f9051a418f2079dd4fbeafd256b3ac +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 14:47:28 2006 -0700 + + Generalize font subsetting code in cairo-scaled-font-subsets for use by more than just PS backend + + ROADMAP | 1 + + src/Makefile.am | 2 +- + src/cairo-ps-surface.c | 228 ++++++++----------- + src/cairo-scaled-font-subsets-private.h | 82 +++---- + src/cairo-scaled-font-subsets.c | 378 ++++++++++++++++++++++++-------- + 5 files changed, 416 insertions(+), 275 deletions(-) + +commit 906a17a6b1ba1fc120d90f9f3cec29b914300a93 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 10 14:40:32 2006 -0700 + + Rename cairo-ps-font to cairo-scaled-font-subsets (file names only) + + src/cairo-ps-font-private.h | 101 ------------------ + src/cairo-ps-font.c | 181 -------------------------------- + src/cairo-scaled-font-subsets-private.h | 101 ++++++++++++++++++ + src/cairo-scaled-font-subsets.c | 181 ++++++++++++++++++++++++++++++++ + 4 files changed, 282 insertions(+), 282 deletions(-) + +commit f7f9bdc05bd0afc4b709ab6a83074b7e66b1cc60 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 9 10:05:44 2006 -0700 + + PS: Put functions in more logical order. + + src/cairo-ps-surface.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit f3703b1806d1086be30323ca0576819b70a47771 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 9 09:55:23 2006 -0700 + + PS: Move type 3 support out into cairo-ps-font.c + + This is in preparation for generalizing this code for sharing among + several backends. + + src/Makefile.am | 2 +- + src/cairo-ps-font-private.h | 101 ++++++++++++++++++++++++ + src/cairo-ps-font.c | 181 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-ps-surface.c | 181 +++----------------------------------------- + 4 files changed, 295 insertions(+), 170 deletions(-) + +commit 7ebdf4825d677b3b63671eb44298ea2764df2966 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 8 17:47:31 2006 -0700 + + PS: Remove stale comment (the stuff TODO is done already) + + src/cairo-ps-surface.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit 172fd2f6a668b6b0e4a7cbce24e006b65417d9b1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 9 14:39:08 2006 -0700 + + Fix typo in select-font-face.c and update reference images + + test/select-font-face-pdf-argb32-ref.png | Bin 0 -> 2781 bytes + test/select-font-face-ps-argb32-ref.png | Bin 0 -> 528 bytes + test/select-font-face-ref.png | Bin 2460 -> 2481 bytes + test/select-font-face-svg-argb32-ref.png | Bin 0 -> 3064 bytes + test/select-font-face-svg-rgb24-ref.png | Bin 0 -> 3064 bytes + test/select-font-face.c | 4 ++-- + 6 files changed, 2 insertions(+), 2 deletions(-) + +commit f0d7e3f858858937168c6cfdfae12dbe751ee683 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 9 14:15:27 2006 -0700 + + Add select-font-face test for whosing multiple faces at once. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/select-font-face-ref.png | Bin 0 -> 2460 bytes + test/select-font-face.c | 83 ++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 86 insertions(+) + +commit 9595de96ac96bbfdc20177c0228c1673ad701d96 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 8 17:41:17 2006 -0700 + + ROADMAP: non-substantive changes + + ROADMAP | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +commit 7d0bcc3f1cf5dff292289420c3e5e73410997993 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat May 6 15:31:53 2006 +0200 + + SVG: Emit glyphs at the beginning of defs section. + + src/cairo-svg-surface.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 1da2ca0f3575fe00e7e3f2ce27cf0e3416517573 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat May 6 14:56:20 2006 +0200 + + SVG: Implementation of glyph cache + + This is an adaptation of Keith ps-type3 branch for SVG backend. + Main differences with ps stuff are font cache is a property of + document, and there's no need of subfonts. + + src/cairo-svg-surface.c | 571 ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 450 insertions(+), 121 deletions(-) + +commit 09e94c6a31e58ff85c597d4791b6ec5006f73797 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri May 5 20:31:48 2006 +0200 + + SVG: Add reference images for fill-and-stroke-alpha. + + It fails on a one digit color error. + + test/fill-and-stroke-alpha-svg-argb32-ref.png | Bin 0 -> 509 bytes + test/fill-and-stroke-alpha-svg-rgb24-ref.png | Bin 0 -> 509 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit ac470b02384528f9fda3ee7c80b64d27825b927a +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 5 07:57:10 2006 -0700 + + Don't build pdf2svg until we start depending on newer poppler + + test/Makefile.am | 5 ----- + 1 file changed, 5 deletions(-) + +commit 44572fdcc8627a5c13d8fc68b55290f414166095 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 5 07:51:59 2006 -0700 + + Revert "pdf2png: Use new poppler_page_render to render directly through cairo." + + This introduced a rather gratuitous dependency on a newer version of + poppler, which caused a fair amount of pain for no significant + benefit. + + This reverts 253472492ee2a690646a30b32cf8180f5b6e3299 commit. + + test/pdf2png.c | 38 +++++++++++--------------------------- + 1 file changed, 11 insertions(+), 27 deletions(-) + +commit d76701f465669f843c12aee6b533c9fb6399ec99 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri May 5 16:47:06 2006 +0200 + + Use CLEAR operator for initialisation of similar surface with a transparent color. + + src/cairo-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 36fcaa76d66c16fcedddf3c3e967afa3f4a96615 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri May 5 16:02:04 2006 +0200 + + SVG: Fix cairo_svg_surface_restrict_to_version. + + surface parameter is actually a paginated surface. + Use the same logic as pdf backend. + + src/cairo-svg-surface.c | 62 ++++++++++++++++++++++++++++++++----------------- + src/cairo-svg.h | 2 +- + 2 files changed, 42 insertions(+), 22 deletions(-) + +commit 6b40ba283b6d09a7bf3bd0ec795a19b05b9bfec4 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri May 5 12:59:29 2006 +0200 + + SVG: Remove special case for unclipped CLEAR and SOURCE in paint when + we're in analysis mode. + + intersect_clip_path is not analyzed, so we can't know if we're clipped + when we're in analysis mode. + + src/cairo-svg-surface.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit fb269aac0887711298241113717aa8bddecbd097 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri May 5 11:10:02 2006 +0200 + + SVG: Sets something sane in width and height if acquire source image fails. + + In composite_image_pattern. + + src/cairo-svg-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit c399b7a04777823fc32c65020616b39196795214 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 23:48:28 2006 -0700 + + Increment CAIRO_VERSION to 1.1.7 after making the 1.1.6 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ba3b75efd56113411ed141a86675099ae82d5d5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 23:44:07 2006 -0700 + + Fix typos in EXTRA_DIST list of reference images. + + test/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5b3425972dd8864a754ca4551f375151b409fdb5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 23:39:12 2006 -0700 + + Update version to 1.1.6 and add notes to NEWS file. + + Also update libtool version information to 8:0:6. + + NEWS | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + ROADMAP | 16 +++++----- + configure.in | 6 ++-- + 3 files changed, 108 insertions(+), 11 deletions(-) + +commit cfdb9a1c5372f261e6d495392aa6c052a6ebdee3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 23:33:44 2006 -0700 + + RELEASING: Add a few more steps that we've been somtimes forgetting + + RELEASING | 19 ++++++++++++++----- + ROADMAP | 2 +- + 2 files changed, 15 insertions(+), 6 deletions(-) + +commit b948683917e26315fdec773db8780662071554a1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 22:43:22 2006 -0700 + + Flesh out the documentation for cairo_push_group, cairo_pop_group and friends + + src/cairo.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 99 insertions(+), 20 deletions(-) + +commit 344c2c7acd0a87a7a28b4a73ba340b333fefb2bf +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 21:35:23 2006 -0700 + + Add a couple more group-using tests: fill-and-stroke-alpha[-add] + + test/.gitignore | 2 + + test/Makefile.am | 4 ++ + test/fill-and-stroke-alpha-add-ref.png | Bin 0 -> 588 bytes + test/fill-and-stroke-alpha-add.c | 112 +++++++++++++++++++++++++++++++++ + test/fill-and-stroke-alpha-ref.png | Bin 0 -> 532 bytes + test/fill-and-stroke-alpha.c | 106 +++++++++++++++++++++++++++++++ + 6 files changed, 224 insertions(+) + +commit a16f0b4223a5cc9faa68d844b8fd3ff1bfb996b7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 15:34:15 2006 -0700 + + Add push-group to test/.gitignore + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 57a0242d0621020279bd33c3b0312463bf78cc42 +Author: Ian Osgood <iano@quirkster.com> +Date: Thu May 4 14:29:03 2006 -0700 + + Additional piece of "Fix the XCB backend build for the XCB 0.9 release." + + test/cairo-test.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8c9da52dc285576e47b4e527487f0b2451ab87cc +Author: Ian Osgood <iano@quirkster.com> +Date: Thu May 4 14:29:03 2006 -0700 + + Fix the XCB backend build for the XCB 0.9 release. + + * use split out xcb-render package + * fix deprecated calls + * use XCB-specific symbols + + configure.in | 2 +- + src/cairo-xcb-surface.c | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 450e29ce091e352569518bb5d6a9bf5236f14bfe +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 14:24:18 2006 -0700 + + pixman: Remove potential memory leak in failure path. + + Thanks to Petr Kobalicek <kobalicek.petr@gmail.com> for pointing this out. + + pixman/src/ictri.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit ec94f0a7e2e82bee3973f4c64eb23bb60cac846c +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 12:50:50 2006 -0700 + + Remove trailing comma in enum to pander to non-C99-conformant compilers + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 457132fc2b1380cfd189ecec2f4ab1c02cd22fe4 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 21:41:36 2006 +0200 + + SVG: Don't test rectangle-rounding-error. + + This test uses CAIRO_ANTIALIAS_NONE, which is not supported yet by + the SVG backend. + + test/cairo-test.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit f6748ad030a6b6b7fdf5e43d7636c6641c48c673 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 21:40:17 2006 +0200 + + SVG: Add reference image for tests failing on composited image misplacement. + + There's a bug in librsvg/cairo that offsets composited images by half a pixel. + http://bugzilla.gnome.org/show_bug.cgi?id=330055 + + .../composite-integer-translate-over-svg-argb32-ref.png | Bin 0 -> 15465 bytes + test/composite-integer-translate-over-svg-rgb24-ref.png | Bin 0 -> 15465 bytes + test/paint-source-alpha-svg-argb32-ref.png | Bin 0 -> 353 bytes + test/paint-source-alpha-svg-rgb24-ref.png | Bin 0 -> 353 bytes + test/paint-with-alpha-svg-argb32-ref.png | Bin 0 -> 420 bytes + test/paint-with-alpha-svg-rgb24-ref.png | Bin 0 -> 420 bytes + test/scale-source-surface-paint-svg-argb32-ref.png | Bin 0 -> 146 bytes + test/scale-source-surface-paint-svg-rgb24-ref.png | Bin 0 -> 158 bytes + 8 files changed, 0 insertions(+), 0 deletions(-) + +commit 720edfe865fde9dff49198edaa9029a989045334 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 18:53:51 2006 +0200 + + SVG: Add reference images for push-groups test. + + Tests just fail for a one digit color on error. + + test/push-group-svg-argb32-ref.png | Bin 0 -> 2945 bytes + test/push-group-svg-rgb24-ref.png | Bin 0 -> 2901 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit a3997501fad548988135e1aff6b906e96a9b744c +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 18:40:37 2006 +0200 + + SVG: Update reference images for shrinked tests. + + test/linear-gradient-svg-argb32-ref.png | Bin 12707 -> 947 bytes + test/linear-gradient-svg-rgb24-ref.png | Bin 12707 -> 947 bytes + test/text-pattern-svg-argb32-ref.png | Bin 2643 -> 1720 bytes + test/text-pattern-svg-rgb24-ref.png | Bin 2490 -> 1567 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 135449ae03e74910c9ac359772d4ad790f6b7bed +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 18:06:06 2006 +0200 + + SVG: Fix the previous fix for xlink namespace. + + It seems libxml2 2.6.24 now requires a node using xlink + namespace to be linked to a node where it can find this + namespace. + + src/cairo-svg-surface.c | 34 +++++++++++++++++++--------------- + 1 file changed, 19 insertions(+), 15 deletions(-) + +commit a428f11738a52ffabbde3925254278585a72aadb +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 14:18:59 2006 +0200 + + SVG: Fix bug in test suite causing SVG to fail with rgb24 and device offsets. + + Same fix as for PDF and PS surfaces. + + test/cairo-test.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 1431a9d4d3655f488b6f6698fdc18c6d65d733b5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 04:01:06 2006 -0700 + + Clean up error management of xlib surface getter functions. + + src/cairo-xlib-surface.c | 61 ++++++++++++++++++++++++------------------------ + src/cairo-xlib.h | 8 +++---- + 2 files changed, 34 insertions(+), 35 deletions(-) + +commit 4a4603d5517f4e0b014a34ec05bee42fc3640ed3 +Author: Robert O'Callahan <rocallahan@novell.com> +Date: Thu May 4 03:59:56 2006 -0700 + + Add Xlib surface getter functions. + + Add the following five functions: + + cairo_public Display * + cairo_xlib_surface_get_display (cairo_surface_t *surface); + + cairo_public Drawable + cairo_xlib_surface_get_drawable (cairo_surface_t *surface); + + cairo_public Screen * + cairo_xlib_surface_get_screen (cairo_surface_t *surface); + + cairo_public Visual * + cairo_xlib_surface_get_visual (cairo_surface_t *surface); + + cairo_public int + cairo_xlib_surface_get_depth (cairo_surface_t *surface); + + src/cairo-xlib-surface.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib.h | 15 +++++++++++ + 2 files changed, 81 insertions(+) + +commit 68915fdfcb7a1c99ebd237b08192732a7409b5ec +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu May 4 12:56:06 2006 +0200 + + SVG: Fix xml namespace declaration. + + It looks like since libxml2 2.6.24, we can't just use xmlSetProp + for namespace declaration anymore. + + src/cairo-svg-surface.c | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +commit 7aa2b05e48f4431639b821661c91103d2b60b482 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 03:44:26 2006 -0700 + + Add missing prototype for _cairo_clip_translate + + src/cairo-clip-private.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 7bcf957b4e2a986a94bbc29192f61b8c9c0067be +Author: Robert O'Callahan <rocallahan@novell.com> +Date: Thu May 4 03:43:34 2006 -0700 + + Rename cairo_rectangle_t to cairo_rectangle_fixed_t. + + This is in preparation for a later function addition for extracting + clip rectangles from a cairo_t, (which will add a public + cairo_rectangle_t). + + src/cairo-analysis-surface.c | 4 +- + src/cairo-atsui-font.c | 2 +- + src/cairo-beos-surface.cpp | 44 +++++----- + src/cairo-clip-private.h | 18 ++-- + src/cairo-clip.c | 18 ++-- + src/cairo-directfb-surface.c | 42 ++++----- + src/cairo-glitz-surface.c | 42 ++++----- + src/cairo-gstate.c | 10 +-- + src/cairo-image-surface.c | 28 +++--- + src/cairo-meta-surface.c | 4 +- + src/cairo-paginated-surface.c | 8 +- + src/cairo-pattern.c | 6 +- + src/cairo-pdf-surface.c | 6 +- + src/cairo-ps-surface.c | 6 +- + src/cairo-quartz-private.h | 2 +- + src/cairo-quartz-surface.c | 26 +++--- + src/cairo-region.c | 10 +-- + src/cairo-scaled-font.c | 8 +- + src/cairo-surface-fallback-private.h | 6 +- + src/cairo-surface-fallback.c | 164 +++++++++++++++++------------------ + src/cairo-surface.c | 58 ++++++------- + src/cairo-svg-surface.c | 4 +- + src/cairo-win32-private.h | 4 +- + src/cairo-win32-surface.c | 20 ++--- + src/cairo-xcb-surface.c | 32 +++---- + src/cairo-xlib-surface.c | 40 ++++----- + src/cairo.c | 2 +- + src/cairoint.h | 72 +++++++-------- + src/test-fallback-surface.c | 24 ++--- + src/test-meta-surface.c | 4 +- + src/test-paginated-surface.c | 4 +- + 31 files changed, 358 insertions(+), 360 deletions(-) + +commit d71ddec8dfcfd4a8eb39edc9f34f93dc1683a62d +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 03:05:12 2006 -0700 + + ROADMAP: Note that device-offset and push-pop-group have landed. + + ROADMAP | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit fb7f7c2f27f0823d7702f960204d6e638d697624 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Mar 14 15:56:08 2006 -0800 + + Fix up clip at pop_group time, to keep it in surface backend coordinates + + We keep the clip in surface-backend coordinates always, so it needs + fixing whenever we change the target surface out in the gstate. The + only place this happens is in push_group, so fix it as part of + gstate_redirect(). + + src/cairo-clip-private.h | 5 ++++ + src/cairo-clip.c | 77 +++++++++++++++++++++++++++++++++++++++++++++--- + src/cairo-gstate.c | 32 +++++--------------- + src/cairo.c | 9 ++++-- + 4 files changed, 93 insertions(+), 30 deletions(-) + +commit 7fa3c6eee5a19d3486a200a6a14b96210f2b6dab +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 1 17:19:45 2006 +0100 + + Add push-group test and reference images + + test/push-group-ref.png | Bin 0 -> 3012 bytes + test/push-group-rgb24-ref.png | Bin 0 -> 2858 bytes + test/push-group.c | 119 ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 119 insertions(+) + +commit ee02c1b91452e5b34af4f02d7132840a4bf44fe1 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Feb 15 13:46:53 2006 -0800 + + Implement push_group/pop_group + + This patch adds the following API calls: + + cairo_push_group + cairo_push_group_with_content + cairo_pop_group + cairo_pop_group_to_source + cairo_get_group_target + + These methods support implementing layers on top of a cairo context, + allowing for drawing with transparency and temporary buffering. + cairo_get_group_target allows an app to get access to the actual surface + created by the last push_group call, in case itneeds to perform native + drawing to it. + + src/cairo-gstate-private.h | 4 +- + src/cairo-gstate.c | 214 ++++++++++++++++++++++++++++++--------------- + src/cairo.c | 150 ++++++++++++++++++++++++++++--- + src/cairo.h | 51 ++++++----- + src/cairoint.h | 19 ++++ + test/Makefile.am | 3 +- + 6 files changed, 332 insertions(+), 109 deletions(-) + +commit 5e708b38e00f6b2066028c60a5526bf5d5e66356 +Merge: a6b1b01 99719bd +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 01:46:34 2006 -0700 + + Merge branch 'device-offset-history' into cairo + +commit a6b1b014bbd12be0f20c44d38d8847181be6d3ae +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 4 01:45:41 2006 -0700 + + Implement the device_offset functionality at surface, not gstate layer + + This is a mega-patch that has the advantage that the entire test suite + passes both immediately before and immediately after this commit. + + The disadvantage of the mega-patch is that it does not reflect the + development history of the device-offset branch, (with its various + fumblings and flailings). To capture that history, we will next merge + in that branch. + + src/cairo-clip.c | 11 ++ + src/cairo-gstate.c | 61 +++------ + src/cairo-path.c | 46 +++++++ + src/cairo-ps-surface.c | 6 +- + src/cairo-scaled-font.c | 8 +- + src/cairo-surface-fallback.c | 64 +++++----- + src/cairo-surface.c | 292 +++++++++++++++++++++++++++++++++++-------- + src/cairo-traps.c | 49 +++++++- + src/cairo-xlib-surface.c | 4 +- + src/cairo.h | 5 + + src/cairoint.h | 19 ++- + test/buffer-diff.c | 8 +- + test/cairo-test.c | 23 ++++ + 13 files changed, 444 insertions(+), 152 deletions(-) + +commit 99719bde9ee0697bd43d97f034ccf4058c9484a0 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 10 14:57:08 2006 -0800 + + Move device-offset touchups from the surface layer up to the gstate. + + This fixes the self-copy test which was the last one that was really + failing due to device offsets. + + src/cairo-gstate.c | 16 ++++++++++++++++ + src/cairo-surface.c | 12 ------------ + 2 files changed, 16 insertions(+), 12 deletions(-) + +commit ee687d722a315ff9cefd8755ca38b194187a693c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 14:39:44 2006 -0800 + + Add support to handle the device-offset of a source surface. + + This change caused all self-copy failures to now pass. + But, it also causes all previous self-copy passes to now fail. + + src/cairo-surface.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit ea2faa5fae619a6b813348eda925060f3ed16ee3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 14:38:20 2006 -0800 + + Rip out device_{x,y}_scale. + + This device scale stuff is currently not being used. However it is also adding + complexity to the current device-offset rework. And since it's not being tested + I'm sure we're getting it wrong. It's better to not even have it here rather + than having it be broken. + + src/cairo-clip.c | 8 +++---- + src/cairo-path.c | 25 +++++++++++++------- + src/cairo-ps-surface.c | 6 ++--- + src/cairo-surface-fallback.c | 2 -- + src/cairo-surface.c | 56 +++++++++++--------------------------------- + src/cairoint.h | 12 ++++------ + 6 files changed, 41 insertions(+), 68 deletions(-) + +commit 0e230727f8f925b85fffd0359195be4a704fed69 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 14:01:30 2006 -0800 + + Prefer classic C style comments rather than C++/C99-style + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9333e9975cbb3a0e167de1f78076eb779da4317 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 14:01:10 2006 -0800 + + Remove dead code from _cairo_surface_{acquire,release}_dest_image + + src/cairo-surface.c | 35 ++++------------------------------- + 1 file changed, 4 insertions(+), 31 deletions(-) + +commit f66ce88e0ec1ef91bb85e795fd53a99f71877e4a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 13:42:16 2006 -0800 + + cairo_surface_mark_dirty_rectangle: correct sense of device-offset handling + + src/cairo-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 460820cb58b9a9e893cdb2d48d1457defe797246 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 13:39:55 2006 -0800 + + Remove undesired device-offset handling during unbounded fixups. + + This code was already commented as being suspicious and its removal causes some + tests to start passing once again. + + src/cairo-surface.c | 12 ------------ + 1 file changed, 12 deletions(-) + +commit b0c047ad95957b46922bbb4f6320a4a7b0c32726 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 13:37:32 2006 -0800 + + _cairo_surface_show_glyphs: Fix reversed device-offset handling so text works again. + + src/cairo-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ee1c642cd85fc4d5408d65578cc9ca48ee4b58cc +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 9 13:36:30 2006 -0800 + + cairo-surface.c: Correct reversed semantics of SURFACE_TO_BACKEND and BACKEND_TO_SURFACE + + src/cairo-surface.c | 56 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 28 insertions(+), 28 deletions(-) + +commit a5cb54621259d0a6057543bc0e4edd4d16216007 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 15:02:35 2006 -0800 + + _cairo_surface_set_clip_region: Remove device-offset handling that is + + now taken care of in _cairo_clip_clip. + + src/cairo-surface.c | 36 ------------------------------------ + 1 file changed, 36 deletions(-) + +commit 69affa5fafe41edf6c88af7722538b550804284c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 14:51:57 2006 -0800 + + Move device-offset handling for clipping from _cairo_surface_interesect_clip_path + + to the more general _cairo_clip_clip to handle more cases correctly. + + src/cairo-clip.c | 13 +++++++++++++ + src/cairo-surface.c | 17 +---------------- + src/cairoint.h | 3 +++ + 3 files changed, 17 insertions(+), 16 deletions(-) + +commit 50dcd4d1ac3d4b90bcea04e53836d73b8e7c1aa4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 12:58:13 2006 -0800 + + _cairo_surface_copy_pattern_for_destination: Don't do any transform if there is no offset + + src/cairo-surface.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit 6d212c9e391ad8fc5b273269a54740790cbb1ee3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 12:51:46 2006 -0800 + + _cairo_surface_copy_pattern_for_destination: Remove leaking second call to pattern_init_copy + + src/cairo-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 81e469523fbc83b9ddcd74a6be5d8137a6d71c38 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 12:44:49 2006 -0800 + + Abstract away repeated test as _cairo_surface_has_device_offset_or_scale + + src/cairo-surface.c | 34 ++++++++++++++-------------------- + 1 file changed, 14 insertions(+), 20 deletions(-) + +commit 4ed3e60a25a877f65b82cf7c426659a89d195728 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 11:56:27 2006 -0800 + + _cairo_surface_copy_pattern_for_destination: Fix transformation sign/order. + + This allows the scale-source-surface-paint test to start passing again + at least. + + src/cairo-surface.c | 26 ++++++++++++-------------- + 1 file changed, 12 insertions(+), 14 deletions(-) + +commit d3ff6f0e4b17972361c28f490eaf05222ac97e10 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 11:54:33 2006 -0800 + + _cairo_surface_fallback_composite_trapezoids: Remove unused variable. + + src/cairo-surface-fallback.c | 1 - + 1 file changed, 1 deletion(-) + +commit 46a1f40b7d1787b570a8381a914a372400ef39a9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 2 15:05:32 2006 +0100 + + Move device offsets handling into high-level operations only (stroke/fill/paint/etc) + + Remove all device offsets handling from internal cairo_surface methods, + which will become truly internal shortly. Have all device offsets + handled by top-level entry points (stroke/fill/paint/show_glyphs/mask, and + clipping). + + src/cairo-scaled-font.c | 3 +- + src/cairo-surface.c | 402 ++++++++++++++++++++++++------------------------ + 2 files changed, 201 insertions(+), 204 deletions(-) + +commit 6197d5a7618900f25155af16b91f082ee05ddd03 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 1 11:54:21 2006 +0100 + + Fix bug in test suite causing PS and PDF to fail with rgb24 and device offsets. + + Patch from cworth@cworth.org. + + The trick with this one is that the test suite is using device offsets + in a rather fabricated way, and the final copy from an offset surface + to a non-offset surface is between two surfaces of the same size, so + must be 1:1. To get this we turn the device offset off before the + copy. + + In a more conventional use of device offsets the surfaces would be of + different sizes, and the offset would be desired during the copy. + + test/cairo-test.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 51cf7900e4987d18173ded806988d412752717f5 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 1 11:23:15 2006 +0100 + + Take device offsets into account when compositing scaled glyph images + + Scaled glyph image surfaces have device offsets set on them to indicate + the location of the glyph origin; however, those offsets weren't being + taken into account for the call to composite, so the glyphs were + being doubly-offset by this amount. + + src/cairo-scaled-font.c | 11 ++++++----- + src/cairo-xlib-surface.c | 4 ++-- + 2 files changed, 8 insertions(+), 7 deletions(-) + +commit 4894f5a234959a0e50269c1adcc6b4faf08ba053 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Feb 15 13:46:52 2006 -0800 + + Implement device offset/scale at cairo-surface layer + + This patch implements device offset/scale at the cairo-surface layer, + instead of them just being multiplied into the CTM at operation time. + This allows identical drawing operations/clips/paths/etc. to operate + identically on a surface with or without a device offset (and still + have things end up in the same place relative to the dev offset). + + src/cairo-gstate.c | 47 +----- + src/cairo-path.c | 37 +++++ + src/cairo-surface-fallback.c | 65 ++++---- + src/cairo-surface.c | 375 +++++++++++++++++++++++++++++++++++++++---- + src/cairo-traps.c | 49 +++++- + src/cairo.h | 5 + + src/cairoint.h | 14 ++ + test/buffer-diff.c | 8 +- + test/cairo-test.c | 5 + + 9 files changed, 488 insertions(+), 117 deletions(-) + +commit 40b39dddf9cd919fb2f456a8e296a60cc8296fbf +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 10 16:37:50 2006 -0800 + + Shrink the size of a couple of tests (and update reference images). + + Shrink linear-gradient and text-pattern test outuput. + + The real motivation for this is to hide an annoying difference in the + gradient output that occurs when under the influence of a device + offsets. My opinion is that the gradient output should not change due + to just an integer offset, but we currently don't have a precise + gradient specification, so this minor deviation really isn't relevant. + + A better fix for this might have been to make the test suite more + forgiving of tiny differences, (perhaps on a per-test basis), but + another advantage of shrinking these tests is that they now run a lot + faster. + + It is true that these tests now also exercise fewer different output + values, but that's not the designed purpose of the tests so I don't + feel bad about losing that characteristic. + + test/linear-gradient-ref.png | Bin 12750 -> 972 bytes + test/linear-gradient.c | 6 +++--- + test/text-pattern-ref.png | Bin 2725 -> 1721 bytes + test/text-pattern-rgb24-ref.png | Bin 2339 -> 1423 bytes + test/text-pattern.c | 4 ++-- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit b3e2252b94297b7fbdbd3a3776781ea6df7c8bc6 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Feb 15 13:46:52 2006 -0800 + + Augment test framework to test everything under device offsets as well. + + [With this change, two tests with gradients exhibit subtle differences + under device offsets. I don't think we actually care about them + though. -cworth] + + test/.gitignore | 36 ++------------- + test/buffer-diff.c | 98 +++++++++++++++++++++++++++++------------ + test/buffer-diff.h | 21 +++++++-- + test/cairo-test.c | 111 +++++++++++++++++++++++++++++----------------- + test/imagediff.c | 45 +++++-------------- + test/make-html.pl | 124 ++++++++++++++++++++++++++++------------------------ + test/xlib-surface.c | 4 ++ + 7 files changed, 244 insertions(+), 195 deletions(-) + +commit 7beb3e27a552c724bbdb147bc27b775af0d61063 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 16:45:33 2006 -0700 + + Quiet some 'may be used uninitialized' warnings. + + src/cairo-lzw.c | 4 ++-- + src/cairo-pdf-surface.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 8a174a11395af97bf1bffeca7a6ee8e5c1d50281 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 13:20:07 2006 -0700 + + Add test/pdf-features.c missing from an earlier commit + + test/pdf-features.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 150 insertions(+) + +commit 7c825797c85fca79ea1229d49cf3ae1b24b6daf2 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 13:18:40 2006 -0700 + + Add pdf2svg utility for manual testing (not used in test suite) + + test/.gitignore | 1 + + test/Makefile.am | 5 +++ + test/pdf2svg.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 107 insertions(+) + +commit 6f9aa014aeee03bd6acc31124de05cfd931a88e1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 13:13:10 2006 -0700 + + ROADMAP: Note that PDF per-page size setting is done. Sort things that appear in 1.1.4 + + ROADMAP | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit c35bfffa1057cfe2aeca6fe681ea59aa628f5315 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 12:39:45 2006 -0700 + + Add new pdf-features test to exercise cairo_pdf_surface_set_size + + test/.gitignore | 2 ++ + test/Makefile.am | 5 +++++ + 2 files changed, 7 insertions(+) + +commit eb1b102e9a9e16cfc38948f8d37e08f263d10f7c +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 12:39:23 2006 -0700 + + PDF: Add new cairo_pdf_surface_set_size for doing per-page size changes + + src/cairo-pdf-surface.c | 90 ++++++++++++++++++++++++++++++++++++++++--------- + src/cairo-pdf.h | 5 +++ + 2 files changed, 80 insertions(+), 15 deletions(-) + +commit 5448278d6e9c7452f855f8b262295818b27c5a11 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 12:38:49 2006 -0700 + + ps-features: Minor touchups (missing include, typo in error message) + + test/ps-features.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit a4fc0c2e2c9ce52750f43dabc2be5daeb8aee9c4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 11:10:24 2006 -0700 + + PS: Use ceil, not rounding when computing integers for BoundingBox + + src/cairo-ps-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e91b2c87ccf75e1c4935f1593dfdd10b1992de34 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed May 3 14:53:25 2006 +0200 + + SVG: Emit "svg" version in document_finish. + + At least when there's something valid in document->svg_version. + + src/cairo-svg-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 5336cf5a984cdeb4d4887cd3c643a3e051aca338 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed May 3 14:47:01 2006 +0200 + + SVG: Only "comp-op" property when svg_version >= 1.2 + + src/cairo-svg-surface.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 57ddc7a8699eac61af2086546130081b897aa3a2 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed May 3 14:29:54 2006 +0200 + + SVG: Emit correct version property of "svg" element. + + src/cairo-svg-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 3ee4bae92071b63ace5570795cf57cb94b06257d +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 01:58:03 2006 -0700 + + Increment CAIRO_VERSION to 1.1.5 after making the 1.1.4 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 044bc5b2a51558046bc2d0bc3a8a50897571674a +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 01:31:51 2006 -0700 + + Update version to 1.1.4 and add notes to NEWS file. + + Also update libtool version information to 7:0:5. + + NEWS | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 65 insertions(+) + +commit 7cf6bcaeca168394074413925c35c0cf2f3fb12a +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 01:29:24 2006 -0700 + + RELEASING: Replace references to ChangeLog with git log commands (and improve those) + + RELEASING | 25 ++++++++++++++----------- + configure.in | 6 +++--- + 2 files changed, 17 insertions(+), 14 deletions(-) + +commit 65dd361c49a984a508cb53153a45612028fa49ef +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 01:18:06 2006 -0700 + + SVG: Enable the SVG backend to be built by default (if dependencies are met) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6acc836df28e0e97e4d0a146c96f04f9a4db30c4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 00:57:28 2006 -0700 + + Add backend-specific reference images to EXTRA_DIST so they'll go out in the tar file. + + test/Makefile.am | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit b6fefaef9bd280715366a44d9f0bef91471e8e3a +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 00:56:34 2006 -0700 + + ROADMAP: Indicate that PS printing-oriented API is done now. + + ROADMAP | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 09dfd6c3c16ed36b0e9693cfcbb3b679bd18f585 +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 3 00:26:22 2006 -0700 + + PS: Add three new public functions for emitting DSC comments. + + This commit adds the following new functions to the cairo-ps API: + + cairo_ps_surface_dsc_comment + cairo_ps_surface_dsc_begin_setup + cairo_ps_surface_dsc_begin_page_setup + + Many thanks are due to Michael Sweet who provided invaluble guidance + during the design of this API. + + It is hoped that with this API in place, basically all printer control + that is likely to be desired to be performed with cairo PostScript + output is now possible. + + This commit augments the ps-features test to exercise the new API. + + doc/public/tmpl/cairo-status.sgml | 1 + + src/cairo-array.c | 4 +- + src/cairo-ps-surface.c | 271 +++++++++++++++++++++++++++++++++++++- + src/cairo-ps.h | 12 +- + src/cairo.c | 4 +- + src/cairo.h | 4 +- + test/ps-features.c | 54 +++++--- + 7 files changed, 325 insertions(+), 25 deletions(-) + +commit 253472492ee2a690646a30b32cf8180f5b6e3299 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 2 16:54:49 2006 -0700 + + pdf2png: Use new poppler_page_render to render directly through cairo. + + ...as opposed to using poppler_page_render_to_pixbuf. + + test/pdf2png.c | 38 +++++++++++++++++++++++++++----------- + 1 file changed, 27 insertions(+), 11 deletions(-) + +commit e7459428dc87f7372dd7d5bd903341d619ee726f +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue May 2 23:37:23 2006 +0200 + + SVG: Convert SVG file with a resolution of 72 dpi. + + That means 1 point = 1 pixel + + test/svg2png.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 1264ae9af4f4aa3bc9f6495e84a7888cd16809da +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue May 2 23:35:06 2006 +0200 + + SVG: Really use width and height in point unit. + + I guess it makes more sense to use a unit for + specifying image size that doesn't depend on context. + + src/cairo-svg-surface.c | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +commit 773692b7df9f0ccf250f259c1bc430c343765651 +Merge: bd85701 8488aae +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue May 2 21:52:41 2006 +0200 + + Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo + +commit bd85701b4f97f0750df050c1a8d995f103a52fc1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue May 2 21:48:11 2006 +0200 + + SVG: Minor documentation fixes. + + src/cairo-svg-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 8488aaee1a8f25d3cc9bf2af986b32710cea91f0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 2 12:36:23 2006 -0700 + + PS: Add cairo_ps_surface_set_size along with ps-features test + + Add a new cairo_ps_surface_set_size which can be used to produce a + PostScript file consisting of pages of various different sizes (or + orientations). + + Also add a new test (ps-features.c) for testing this and subsequent + ps-specific function calls. + + src/.gitignore | 1 + + src/cairo-ps-surface.c | 113 ++++++++++++++++++++++++++++++++++------- + src/cairo-ps.h | 5 ++ + test/.gitignore | 2 + + test/Makefile.am | 5 ++ + test/ps-features.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 243 insertions(+), 18 deletions(-) + +commit e59f35291fa5f97acfe408b7bce8652ec20566c8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 2 11:36:41 2006 -0700 + + atsui: Add missing check of return-value of malloc. + + This addresses the original problem noted in mozilla's bug #336129: + + Missing out-of-memory check at gfx/cairo/cairo/src/cairo-atsui-font.c:185 + https://bugzilla.mozilla.org/show_bug.cgi?id=336129 + + This also adds a comment pointing out another malloc that is not + checked, (but does not fix it). + + src/cairo-atsui-font.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 41e288a88023cac9ced77099bceced41cf526a99 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 1 15:44:58 2006 -0700 + + Make backend-specific function set a surface error on type mismatch. + + If any backend-specific, surface-modifying function is called with + the wrong surface type we set an error on that surface. + + src/cairo-surface.c | 2 +- + src/cairo-xcb-surface.c | 5 +++-- + src/cairo-xlib-surface.c | 19 +++++++++++-------- + src/cairoint.h | 4 ++++ + 4 files changed, 19 insertions(+), 11 deletions(-) + +commit 0e4527c67e623801544be05de32f21a0c10e5b5d +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue May 2 14:50:40 2006 +0200 + + SVG: Rework of API for SVG selection. + + I've removed cairo_svg_surface_create_xxx functions, and instead implemented + the following ones: + + cairo_svg_surface_restrict_to_version + cairo_svg_get_versions + cairo_svg_version_to_string + + doc/public/cairo-sections.txt | 7 +- + doc/public/tmpl/cairo-svg.sgml | 79 ---------------- + src/cairo-svg-surface.c | 209 +++++++++++++++++------------------------ + src/cairo-svg.h | 41 ++++---- + 4 files changed, 109 insertions(+), 227 deletions(-) + +commit 32f120e4888fd9344f699fd47c1aea6a5ec3df8e +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 1 15:12:46 2006 -0700 + + Don't return void from void-returning function (fix #6792). + + It's a dumb part of the C standard and it's even dumber when compilers are + picky about it. But oh, well. + + src/cairo-paginated-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df2f05876d754ecc4fbc5aee53080bdd672d0de9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 1 14:54:57 2006 -0700 + + ROADMAP: Mark bug #4705 as fixed. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87bd00326e0b6ac2ac29939d0ab1e59d9ab05a47 +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 1 14:52:25 2006 -0700 + + Fix silly typo from previous commit. + + src/cairo-xlib-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8dff692db6e7083633fc9b81548b0554a985fabd +Author: Carl Worth <cworth@cworth.org> +Date: Mon May 1 10:17:08 2006 -0700 + + Support multiple glyph image formats within the same font (fix #4705). + + If we find a glyph image of a format that is different from the font's + format, then we use a temporary image and convert to the font's + format. + + This provides a simple fix for the crash identified in bug #4705: + + crash at XRenderAddGlyphs + https://bugs.freedesktop.org/show_bug.cgi?id=4705 + + A later improvement would guarantee that the "font's format" was + carefully chosen to be able to contain all glyphs in the font without + information loss. + + src/cairo-xlib-surface.c | 61 +++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 48 insertions(+), 13 deletions(-) + +commit 0c927c53880f9ece2903a9b2c7843aaff1c78dec +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 23:23:02 2006 +0200 + + SVG: Add reference images for tests failing on 1 digit error on color. + + test/caps-joins-alpha-svg-argb32-ref.png | Bin 0 -> 2454 bytes + test/caps-joins-alpha-svg-rgb24-ref.png | Bin 0 -> 2454 bytes + test/linear-gradient-svg-argb32-ref.png | Bin 0 -> 12707 bytes + test/linear-gradient-svg-rgb24-ref.png | Bin 0 -> 12707 bytes + test/mask-ctm-svg-argb32-ref.png | Bin 0 -> 108 bytes + test/mask-ctm-svg-rgb24-ref.png | Bin 0 -> 118 bytes + test/mask-surface-ctm-svg-argb32-ref.png | Bin 0 -> 108 bytes + test/mask-surface-ctm-svg-rgb24-ref.png | Bin 0 -> 118 bytes + test/mask-svg-argb32-ref.png | Bin 0 -> 87715 bytes + test/mask-svg-rgb24-ref.png | Bin 0 -> 81874 bytes + test/set-source-svg-argb32-ref.png | Bin 0 -> 104 bytes + test/set-source-svg-rgb24-ref.png | Bin 0 -> 104 bytes + test/trap-clip-svg-argb32-ref.png | Bin 0 -> 71765 bytes + test/trap-clip-svg-rgb24-ref.png | Bin 0 -> 73066 bytes + 14 files changed, 0 insertions(+), 0 deletions(-) + +commit e3b3402eb82786c4b1faf0d25b6ed322bf5545aa +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 23:21:37 2006 +0200 + + SVG: Correct use of paginated surface. Fix emit of alpha filter. + + src/cairo-svg-surface.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit 8e5ada5201dd8a39026e8973d2590fec5ebf2d00 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:53:46 2006 +0200 + + SVG: Trivial indentation and comment fixes. + + src/cairo-svg-surface.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +commit 62831dc10ec7601869a01041c845d5dc2f15db49 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:53:12 2006 +0200 + + SVG: Remove outdated comment. + + src/cairo-svg-surface.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 22c799d5b3cae2a98ab927b2b38911ac89cac61e +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:52:47 2006 +0200 + + SVG: Fix error handling in create_for_document and in composite_image_pattern. + + src/cairo-svg-surface.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit 6f49f7b76d69c185d6f97e50d8a57914a9a9fca1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:51:25 2006 +0200 + + SVG: Add an additionnal API for creating SVG 1.1 or 1.2 files. + + And update documentation. + + doc/public/cairo-sections.txt | 4 + + doc/public/tmpl/cairo-svg.sgml | 46 ++++++++++++ + src/cairo-svg-surface.c | 164 ++++++++++++++++++++++++++++++++++------- + src/cairo-svg.h | 18 +++++ + 4 files changed, 206 insertions(+), 26 deletions(-) + +commit 2e4d0e5ba71fc320e2b96526a28b654231cb9dbe +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:50:42 2006 +0200 + + SVG: Some variable/type renaming. + + src/cairo-svg-surface.c | 50 ++++++++++++++++++++++++------------------------- + 1 file changed, 25 insertions(+), 25 deletions(-) + +commit e5ea8268b0c693b7b0940d2f638c94dff93e8d9b +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:49:58 2006 +0200 + + SVG: Reenable optimisation of CLEAR and SOURCE in paint when there's + no active clipping path. + + src/cairo-svg-surface.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 55685d7173adc2e13c21f8830aa38ffc7d1e026f +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:49:29 2006 +0200 + + SVG: Code cleanup. + + src/cairo-svg-surface.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 926bb6480c0542a0928e8b109009be4b24c81344 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:47:41 2006 +0200 + + SVG: Initial support of operators support via image fallbacks. + + We need to add a public API that will let user select + a compatibility level regarding produced SVG files. + + This patch also plugs a memleak. + + src/cairo-svg-surface.c | 100 ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 67 insertions(+), 33 deletions(-) + +commit 061d5088985a5e0b16202a4f031938772749940a +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:43:15 2006 +0200 + + SVG: Sort of working implementation of a SVG backend with paginated surface + support. + + Unoptimized and with memory leaks. + + src/cairo-svg-surface.c | 134 +++++++++++++++++++++++++++++++++++------------- + 1 file changed, 97 insertions(+), 37 deletions(-) + +commit 59dcb95ce5fed8264bc161979e615609c38ace2d +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:41:12 2006 +0200 + + SVG: First pass for analyze-surface support + + src/cairo-svg-surface.c | 92 +++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 85 insertions(+), 7 deletions(-) + +commit 0625d4cd3fb6145e7f9a7474d03945a497b12406 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:15:38 2006 +0200 + + SVG: Ignore SVG test files. + + test/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit d1dcbbb8c34ed160d2b24a9afc8f30ac9de87d91 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Apr 25 22:48:21 2006 +0200 + + SVG: Update rgb24 reference files. + (cherry picked from 7173951535f4b95da37cbf3d51143deeec95e47a commit) + + test/show-text-current-point-svg-rgb24-ref.png | Bin 4236 -> 2398 bytes + test/text-antialias-gray-svg-rgb24-ref.png | Bin 1077 -> 1033 bytes + test/text-antialias-none-svg-rgb24-ref.png | Bin 1077 -> 1033 bytes + test/text-antialias-subpixel-svg-rgb24-ref.png | Bin 1077 -> 1033 bytes + test/text-pattern-svg-rgb24-ref.png | Bin 2428 -> 2490 bytes + 5 files changed, 0 insertions(+), 0 deletions(-) + +commit bdc1c1ac783f1d2bda742ea7150de2c4b0751a29 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:12:20 2006 +0200 + + Copy content property when doing a snapshot of a meta surface. + + src/cairo-meta-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 6a33993b1510d1c0d311f4a10832ab2bc5ea8f4e +Merge: b920dfd 3aa5d76 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 22:01:38 2006 +0200 + + Merge branch 'origin' + +commit b920dfd3df7ac1a0e49b7417b710f111a3780700 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon May 1 21:59:53 2006 +0200 + + SVG: Reenable operator tests, and rgb24 surface are meta-surfaces. + + test/cairo-test.c | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +commit 3aa5d76d23ad9005d296fbb852e75924b0933c82 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Apr 29 14:28:21 2006 -0700 + + Add missing file leaky-dash-ref.png + + test/leaky-dash-ref.png | Bin 0 -> 241 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 516ac16de1ac0cab8e2972e2ac1443fd58c39746 +Author: Henning Noren <henning.noren.402@student.lu.se> +Date: Fri Apr 28 07:04:56 2006 -0700 + + Fix PS Surface Memleak + + Fixes leak of 16 bytes when calling _cairo_ps_surface_finish by never freeing + the closure allocated in _word_wrap_stream_create. + + src/cairo-ps-surface.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 9729fe60246c7d98ddc1f690b924cd10daabf096 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 27 09:54:58 2006 -0700 + + Add line-width-scale test to demonstrate cairo_set_line_width bug + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/line-width-scale-ps-argb32-ref.png | Bin 0 -> 1470 bytes + test/line-width-scale-ref.png | Bin 0 -> 4884 bytes + test/line-width-scale.c | 184 ++++++++++++++++++++++++++++++++ + 5 files changed, 187 insertions(+) + +commit 5821d88119740dbbd489909f3bde2f41c7e7ce71 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 27 11:45:26 2006 -0700 + + Correct documentation to say "user space", not "user-space" where appropriate. + + src/cairo.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 5515191f84bb837383278495f1f7034e7a97bdce +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Apr 25 21:55:56 2006 +0200 + + Use CLEAR operator in mask.c in order to not trig image fallback + for polygon masking. + (cherry picked from 30b2d1c5df9d1c6b536838a6a3407fdfa7198e29 commit) + + test/mask.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 9bca27a1adc89b12905ec95ebb4e006830010df1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Apr 23 22:55:37 2006 +0200 + + Optimisation of CLEAR operator in meta-surface. + + This optimisation takes care to not replay what was done + before surface is cleared. We don't erase recorded commands + since we may have earlier snapshots of this surface. + (cherry picked from 926e2494ca2211e9117ab70fc427208d125e1bd5 commit) + + src/cairo-meta-surface-private.h | 3 +++ + src/cairo-meta-surface.c | 14 +++++++++++++- + 2 files changed, 16 insertions(+), 1 deletion(-) + +commit a7320589207088351c035df55644f1d94600f313 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Apr 20 22:07:52 2006 +0200 + + Implement paginated create_similar, moving similar images down to PS and PDF. + + The new paginated create_similar simply forwards to target backend create_similar. + + We maintain the fact that PS and PDF surfaces are returning image + surfaces for create_similar by moving that explicitly to their own + create_similar functions. + + (This commit is the combination of the following original commits: + + 6b69e8c012adb4f2fc2ee9c1579fed8214e8f510 + 2589db92a4395f8e900dbc4eafc45982f0d985d3 + ) + + src/cairo-paginated-surface.c | 9 +-------- + src/cairo-pdf-surface.c | 7 ++++--- + src/cairo-ps-surface.c | 15 ++++++++++++++- + 3 files changed, 19 insertions(+), 12 deletions(-) + +commit e1be80b02080955e29d17c50118471158593b86f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 27 06:02:46 2006 -0700 + + paginated: Remove memory leak of analysis surface from _paint_page + + Thanks to Henning Noren <henning.noren.402@student.lu.se> for pointing this out. + + src/cairo-paginated-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 09a51a4e037473fc104c788c87730b7e97d9fd26 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 27 05:44:57 2006 -0700 + + Add reference to cairo_surface_set_user_data in docs. for cairo_image_surface_create_for_data + + src/cairo-image-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 08733a2228ac4b2739355b536adf955d982a40f0 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 21:22:58 2006 -0700 + + Move 1.4 schedule up. Add more bugs from sunmoon1997 + + To hit the Firefox 3 schedule in early 2007 we'll need to have a 1.4 release + out much sooner. Let's shoot for October 2006 which gives 6 months between + 1.2 and 1.4. + + Also, sunmoon1997 has identified a couple more important issues to be fixed + before 1.2 releases. + + ROADMAP | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b10a0a9a21216bd4ddcc53a566aac409333ef294 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 15:13:41 2006 -0700 + + Add a couple more items to the 1.2.0 ROADMAP + + ROADMAP | 2 ++ + 1 file changed, 2 insertions(+) + +commit c7a45ab49b98225152542370905b593bb8a14188 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 14:42:20 2006 -0700 + + Update ROADMAP with suggestions from discussion of 1.1.2 snapshot + + ROADMAP | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 9ab4b81a096bd5f9839b90cb2a3cdafa2460fd55 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Thu Apr 27 00:51:01 2006 +0200 + + Use a single LDADD variable instead of a per-test one + to avoid repeating the list of tests. + + test/Makefile.am | 93 +++++--------------------------------------------------- + 1 file changed, 7 insertions(+), 86 deletions(-) + +commit 7601a07ae942be8e63263ab7c7e559d7665c3b81 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 14:34:02 2006 -0700 + + Remove cairo.def from the generated tar file. It's not useful there. + + ROADMAP | 230 +++++++++++++++++++++++++++++--------------------------- + src/Makefile.am | 3 - + 2 files changed, 118 insertions(+), 115 deletions(-) + +commit 74ec21b2a7f3435cb4f8ab152fdfb9381bb9eef6 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 14:02:14 2006 -0500 + + WIN32: Define SHADEBLENDCAPS and SB_NONE if they are not defined. (from Tor Lillqvist) + (cherry picked from d3ff5228a205ffb29e85907830d5fc72e2ef5358 commit) + + src/cairo-win32-private.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit e0a2e1fd14a53e646fb6b1a861fd9ca78aa6b603 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 12:51:54 2006 -0700 + + Add leaky-dash test case demonstrating bug #4863. + + Test case for bug #4863: + + stroking problems with wide dashed lines + https://bugs.freedesktop.org/show_bug.cgi?id=4863 + + test/.gitignore | 1 + + test/Makefile.am | 3 +++ + test/leaky-dash.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 72 insertions(+) + +commit e4b3cb1e71549af6910665e99d2a0dd57e30cede +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 12:49:58 2006 -0700 + + Remove deleted reference images from Makefile.am + + test/Makefile.am | 33 +-------------------------------- + 1 file changed, 1 insertion(+), 32 deletions(-) + +commit 7110c168f7edadcedaea74a73b7ac6f095165931 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 26 12:36:22 2006 -0700 + + Remove redeundant -rgb24-ref.png images. + + In several cases the -rgb24 reference images were identical to the -ref images. + So we change the logic to find the latter if the former doesn't exist, and then + we remove the redundant images. + + test/a8-mask-rgb24-ref.png | Bin 128 -> 0 bytes + test/cairo-test.c | 20 +++++++++++++------- + test/caps-joins-alpha-rgb24-ref.png | Bin 2283 -> 0 bytes + test/caps-joins-rgb24-ref.png | Bin 1398 -> 0 bytes + test/caps-sub-paths-rgb24-ref.png | Bin 186 -> 0 bytes + test/clip-all-rgb24-ref.png | Bin 114 -> 0 bytes + ...site-integer-translate-over-repeat-rgb24-ref.png | Bin 353 -> 0 bytes + test/composite-integer-translate-over-rgb24-ref.png | Bin 13041 -> 0 bytes + ...composite-integer-translate-source-rgb24-ref.png | Bin 14017 -> 0 bytes + test/create-from-png-rgb24-ref.png | Bin 115 -> 0 bytes + test/create-from-png-stream-rgb24-ref.png | Bin 115 -> 0 bytes + test/dash-caps-joins-rgb24-ref.png | Bin 2465 -> 0 bytes + test/dash-offset-negative-rgb24-ref.png | Bin 170 -> 0 bytes + test/filter-nearest-offset-rgb24-ref.png | Bin 254 -> 0 bytes + test/imagediff.c | 15 +++++++++------ + test/leaky-polygon-rgb24-ref.png | Bin 344 -> 0 bytes + test/line-width-rgb24-ref.png | Bin 199 -> 0 bytes + test/linear-gradient-rgb24-ref.png | Bin 11700 -> 0 bytes + test/move-to-show-surface-rgb24-ref.png | Bin 115 -> 0 bytes + test/paint-rgb24-ref.png | Bin 116 -> 0 bytes + test/paint-source-alpha-rgb24-ref.png | Bin 248 -> 0 bytes + test/paint-with-alpha-rgb24-ref.png | Bin 255 -> 0 bytes + test/path-data-rgb24-ref.png | Bin 523 -> 0 bytes + test/rectangle-rounding-error-rgb24-ref.png | Bin 298 -> 0 bytes + test/self-copy-rgb24-ref.png | Bin 291 -> 0 bytes + test/show-glyphs-many-rgb24-ref.png | Bin 115 -> 0 bytes + test/show-text-current-point-rgb24-ref.png | Bin 2173 -> 0 bytes + test/source-clip-rgb24-ref.png | Bin 180 -> 0 bytes + test/surface-pattern-rgb24-ref.png | Bin 194 -> 0 bytes + test/text-antialias-gray-rgb24-ref.png | Bin 995 -> 0 bytes + test/text-antialias-none-rgb24-ref.png | Bin 284 -> 0 bytes + test/text-antialias-subpixel-rgb24-ref.png | Bin 1121 -> 0 bytes + test/transforms-rgb24-ref.png | Bin 318 -> 0 bytes + test/translate-show-surface-rgb24-ref.png | Bin 115 -> 0 bytes + test/unantialiased-shapes-rgb24-ref.png | Bin 4449 -> 0 bytes + 35 files changed, 22 insertions(+), 13 deletions(-) + +commit fe8bf47afc11b12034fd2c92caf424c8911d630b +Author: Zhe Su <james.su@gmail.com> +Date: Tue Apr 25 10:20:42 2006 -0700 + + Support fontconfig embeddedbitmap option/handle transformation issue as well. + + src/cairo-ft-font.c | 24 +++++++++++++++++++++--- + 1 file changed, 21 insertions(+), 3 deletions(-) + +commit 90b7a2d5fc5d195a0e521e48d17a78a98b53b224 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 09:47:30 2006 -0700 + + Increment CAIRO_VERSION to 1.1.3 after making the 1.1.2 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d5dd5e6ebc43db103071b8b86284f4e38572b053 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 09:12:30 2006 -0700 + + Remove from EXTRA_DIST reference images which don't exist + + test/Makefile.am | 7 ------- + 1 file changed, 7 deletions(-) + +commit e89de1030eae71da469c9c4c7176d0fdfe0df595 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 08:56:23 2006 -0700 + + Change release targets as appropriate for a snapshot, not a release. + + The big change here is to change the upload directory to be the snapshots directory + rather than the releases directory. We also use make dist rather than make distcheck + since there are currently a few tests still failing. + + Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 3d6cdc996f3a3f4d54d0d8926daa3973d69e4dc2 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 08:54:59 2006 -0700 + + Add release vs. snapshot distinction to version increment instructions + + RELEASING | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 68c5382b6cdc442f3057b8e4eed2dfe7084ef7f1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 08:51:08 2006 -0700 + + Increment CAIRO_VERSION to 1.1.2 and libtool versioning to 6:0:4 + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 3002c6cc8b4722a324de27a20f04ae810b6dc573 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 08:44:45 2006 -0700 + + Add some notes for the 1.1.2 snapshot + + NEWS | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + RELEASING | 4 ++- + 2 files changed, 116 insertions(+), 1 deletion(-) + +commit a0df6fa696d44533adec1ecec7398e851b2eb37a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 07:07:48 2006 -0700 + + Update PS and PDF reference images for change in font options + + test/show-text-current-point-pdf-argb32-ref.png | Bin 2143 -> 3838 bytes + test/show-text-current-point-ps-argb32-ref.png | Bin 638 -> 645 bytes + test/text-antialias-gray-pdf-argb32-ref.png | Bin 945 -> 1004 bytes + test/text-antialias-gray-ps-argb32-ref.png | Bin 305 -> 306 bytes + test/text-antialias-none-pdf-argb32-ref.png | Bin 945 -> 1004 bytes + test/text-antialias-none-ps-argb32-ref.png | Bin 305 -> 306 bytes + test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 945 -> 1004 bytes + test/text-antialias-subpixel-ps-argb32-ref.png | Bin 305 -> 306 bytes + 8 files changed, 0 insertions(+), 0 deletions(-) + +commit 6237437f412d9d007e1c49c33f6e81117b612d39 +Merge: 22ab0e5 f1c3754 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 07:02:41 2006 -0700 + + Merge branch 'behdad-colored-fails' into cairo + +commit f1c37547530c0c6c134526ea4bac7d11013160f1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 25 09:58:48 2006 -0400 + + Use white on red for failures. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9668b6592f805b6e05f9e75354956e4119483b6a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 25 09:03:26 2006 -0400 + + Set background color to red for test failures printing on a terminal. + + test/cairo-test.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 22ab0e5f1615e28f77d8dc0c8a26929e0f0279b6 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 05:44:08 2006 -0700 + + Fix default font options for PS and PDF backends. + + The paginated surface layer was missing its get_font_options function. + It now defers to the target surface. The PDF backend already had a + get_font_options function, but the PS backend was also missing it. + + This should fix the problem with 72DPI hinting seen in glyph paths in + PostScript output. + + Thanks to Owen Taylor for identifying this problem and the correct + fix. + + src/cairo-paginated-surface.c | 11 ++++++++++- + src/cairo-pdf-surface.c | 6 +++--- + src/cairo-ps-surface.c | 12 +++++++++++- + 3 files changed, 24 insertions(+), 5 deletions(-) + +commit 6723547f0035e6c41abee165ebefb7406e40b7d8 +Merge: 8d635a3 e912512 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 25 08:28:59 2006 -0400 + + Merge branch 'configure-backends' + +commit e912512c6ddff517f3afa4635bbaa81a869475c8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 25 08:26:35 2006 -0400 + + Better message when backends are disabled. + + configure.in | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 05fc4ca32363366a3637443d525834bc91b5203d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 25 07:30:16 2006 -0400 + + Unified handling of --enable-backend options. + + configure.in | 203 ++++++++++++++++++++++++++++------------------------------- + 1 file changed, 96 insertions(+), 107 deletions(-) + +commit 8d635a3aa967b16de5047eceadf3d350d1169a76 +Author: Keith Packard <keithp@keithp.com> +Date: Tue Apr 25 04:04:10 2006 -0700 + + PDF: Execute entire path in user coordinates when stroking so that line params are interpreted correctly + + src/cairo-pdf-surface.c | 95 ++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 86 insertions(+), 9 deletions(-) + +commit 134c508bf04d8674af632644095b78256f2e350d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 03:45:37 2006 -0700 + + PDF: Add SMask output and simplify analysis to support all OVER operations. + + With this SMask support, the PDF backend is now able to handle a very + large subset of the things that are likely to be thrown at it in + common operation, (for example, when handling images and text from web + pages). + + src/cairo-pdf-surface.c | 289 +++++++++++++++++++++++++++++++++--------------- + 1 file changed, 199 insertions(+), 90 deletions(-) + +commit c0721190438826d7222ed87c36b4e48e57ad0323 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 02:33:18 2006 -0700 + + PDF: Remove unused backend functions. + + Since the switch to using paginated, we have a guarantee that the following functions + will never be called. So we drop them now: + + _cairo_pdf_surface_composite + _cairo_pdf_surface_fill_rectangles + _cairo_pdf_surface_composite_trapezoids + _cairo_pdf_surface_old_show_glyphs + + src/cairo-pdf-surface.c | 366 +----------------------------------------------- + 1 file changed, 4 insertions(+), 362 deletions(-) + +commit bef621e870e3d4038e00ed56ad40d726d5a7ca77 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 25 01:56:51 2006 -0700 + + Augment tests to do better testing of paths/images with alpha. + + Add a new cairo_test_paint_checkered function so that tests that draw + with alpha can easily put an easy-to-see checkered background in place + first. + + Add new tests caps-joins-alpha and paint-source-alpha that do simple + tests of strokes and image painting with source pattern alpha. + + Also, add the checkered background to paint-with-alpha for + consistency. + + test/.gitignore | 2 + + test/Makefile.am | 8 +++ + test/cairo-test.c | 45 ++++++++++++++++ + test/cairo-test.h | 3 ++ + test/caps-joins-alpha-ref.png | Bin 0 -> 2434 bytes + test/caps-joins-alpha-rgb24-ref.png | Bin 0 -> 2283 bytes + test/caps-joins-alpha.c | 94 ++++++++++++++++++++++++++++++++++ + test/paint-source-alpha-ref.png | Bin 0 -> 258 bytes + test/paint-source-alpha-rgb24-ref.png | Bin 0 -> 248 bytes + test/paint-source-alpha.c | 67 ++++++++++++++++++++++++ + test/paint-with-alpha-ref.png | Bin 164 -> 268 bytes + test/paint-with-alpha-rgb24-ref.png | Bin 142 -> 255 bytes + test/paint-with-alpha.c | 9 ++-- + 13 files changed, 225 insertions(+), 3 deletions(-) + +commit a5afc59d0ad90125c0593ab60c8e1e01f51bdc3c +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 24 16:16:19 2006 -0700 + + Add PDF-specific reference image for scale-source-surface-paint + + It only fails because the PDF ouput doesn't preserve the NEAREST filter attribute. + There might be a way to get something like this in the PDF, but it's not the point + of the test. + + test/scale-source-surface-paint-pdf-argb32-ref.png | Bin 0 -> 152 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 32a7edc42dae507678e4eed98fcb41802b8ee69c +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 24 16:11:21 2006 -0700 + + PDF: Fix surface pattern transformation and support for EXTEND_NONE. + + There's a bunch of careful matrix transformation here needed to + resolve the differences between cairo and PDF pattern matrices, + (primarily due to the different location for the origin). + + This fixes the several PDF test suite failures that recently appeared + when we switched from ARGB32 to RGB24 source surface patterns. + + src/cairo-pdf-surface.c | 85 +++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 72 insertions(+), 13 deletions(-) + +commit a1bba71eb9442a1c3a5f9fb227353971d58cecba +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 24 14:51:31 2006 -0700 + + Trivial indentation fix + + test/mask-ctm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 893239248a9a6ef1a7b9f770aec334f20c5c0861 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 24 14:50:52 2006 -0700 + + Prefer RGB24 over ARGB32 for source surfaces in tests. + + Some tests were using source surfaces created as ARGB32 even though all + alpha values are entirely opaque. This meant these tests were triggering + more fallbacks than strictly necessary for what the tests are ttrying to + do. + + test/filter-nearest-offset.c | 2 +- + test/move-to-show-surface.c | 2 +- + test/paint-with-alpha.c | 2 +- + test/scale-source-surface-paint.c | 2 +- + test/source-surface-scale-paint.c | 2 +- + test/translate-show-surface.c | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +commit 28e25e1cce0a4e4c612743effb8927c5cb6b3c5b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 24 12:40:30 2006 -0700 + + Fix broken error-checking in cairo_{ps,pdf}_surface_set_dpi + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 12c4c375af7efe367bb6128babd14b4c1d05be65 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 21 02:46:20 2006 -0700 + + Fix invalid restore that was causing subsequent pages after first to be inverted + + src/cairo-pdf-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e0bf1378044d606273ee876663498878e0b2edd4 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Apr 23 21:20:55 2006 +0200 + + Fix create_xcb_surface signature + + test/cairo-test.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 810d9d19854f671d6a5d985b950d7442e59176e3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 20 10:54:01 2006 -0700 + + PDF: Fix reference images inadvertently committed as PDF not PNG + + test/text-antialias-gray-pdf-argb32-ref.png | Bin 7264 -> 945 bytes + test/text-antialias-none-pdf-argb32-ref.png | Bin 7264 -> 945 bytes + test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 7264 -> 945 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 7fa8bfd738f939c06480c40162e347a2ecadd4d6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 20 10:01:45 2006 -0700 + + PDF: Cleanup error handling of emit_image_rgb_data + + src/cairo-pdf-surface.c | 37 ++++++++++++++++++++----------------- + 1 file changed, 20 insertions(+), 17 deletions(-) + +commit c5d5687ac09049ca5b942993fc259e54ad5b6721 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 19 11:04:37 2006 -0700 + + PDF: Add simple implementation of _cairo_pdf_surface_show_glyphs (text as paths). + + This isn't very exciting text output---it simply turns every call to + cairo_show_glyphs into a single filled path. But at the very least, + text will no longer trigger image fallbacks for the PDF backend. + + With this commit, the following tests change from all-fallback to + all-native for the PDF backend: + + show-text-current-point + text-antialias-gray + text-antialias-none + text-antialias-subpixel + text-cache-crash + text-rotate + + There are rasterization differences in the output (cairo vs. freetype) + so this commit also adds new PDF-specific reference images for some of + those tests so that the suite continues to report PASS. + + src/cairo-pdf-surface.c | 27 +++++++- + test/show-text-current-point-pdf-argb32-ref.png | Bin 0 -> 2143 bytes + test/text-antialias-gray-pdf-argb32-ref.png | 80 ++++++++++++++++++++++++ + test/text-antialias-none-pdf-argb32-ref.png | 80 ++++++++++++++++++++++++ + test/text-antialias-subpixel-pdf-argb32-ref.png | 80 ++++++++++++++++++++++++ + 5 files changed, 264 insertions(+), 3 deletions(-) + +commit ab2546009ff246bd0e7bbc07437330cf307e00f7 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 23:31:16 2006 -0700 + + Use fallbacks in PDF backend for CAIRO_ANTIALIAS_NONE. + + Perhaps there's a way to preserve that hint in PDF output, but until + we have code that actually does that, the correct thing to do is to + call it unsupported and let the fallbacks do their thing. + + With this commit, the two regressions that were recently introduced + now pass again. Specifically: + + rectangle-rounding-error + unantialiased-shapes + + src/cairo-pdf-surface.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit 241c6480cd9a5f63ea67f8cb1407f22503697ca3 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 23:24:14 2006 -0700 + + Add implementation of _cairo_pdf_surface_paint (and fix emit_surface_pattern). + + Fix general broken-ness in emit_surface_pattern, enough so that a new + implementation of _cairo_pdf_surface_paint does something useful. With + this commit, the following tests switch from all-fallback to + all-native and still pass the test suite with flying colors: + + caps-joins + caps-sub-paths + clip-fill-rule + clip-fill-rule-pixel-aligned + clip-nesting + clip-twice + dash-caps-joins + dash-offset-negative + leaky-polygon + line-width + paint + path-data + transforms + + Meanwhile, the following two tests also switch from fallback to + native, but cause the test suite to complain about failures. These + both look like a mostly harmless failure to respect the ANTIALIAS_NONE + hint in the PDF output: + + rectangle-rounding-error-pdf-argb32-out.pdf + unantialiased-shapes-pdf-argb32-out.pdf + + src/cairo-pdf-surface.c | 65 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 46 insertions(+), 19 deletions(-) + +commit 8be1697f2bd8026b28f2f24c2fab967ee01b6d8c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 23:18:39 2006 -0700 + + Fix stale code in comment. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a98b44a1deab5fd15607b50df63189a74a269909 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Wed Apr 19 02:34:24 2006 +0200 + + Fixing bad merge + + The merge in 66ed9811cc542d99cb5a6b6b792c9a9f0832fbf9 + re-added this line, which makes cairo link to C++ + libraries even on non-BeOS systems. + + This was originally fixed in 69acfa6576e8d2b97e3e3b8c06badf5486ae0315 + + src/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit b1b699593b820ac4e011f89ad700f052b2f20205 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 16:53:23 2006 -0700 + + Add support for _cairo_pdf_surface_stroke. + + Generalize all functions that emit a source pattern to emit both + for the stroking and non-stroking PDF properties. Also add an + implementation of _cairo_pdf_surface_stroke. + + With this commit in place, the following tests change from + all-fallback to all-native output while no tests report any new + failures: + + dash-zero-legnth + fill-and-stroke + multi-page + new-sub-path + rel-path + self-intersecting + + src/cairo-pdf-surface.c | 144 +++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 130 insertions(+), 14 deletions(-) + +commit efbe40bb8f770fbf60de794488803d3edacd7ed6 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Wed Apr 19 00:29:48 2006 +0200 + + Use calloc rather than malloc+memset + + pixman/src/icpixels.c | 3 +-- + pixman/src/ictrap.c | 6 +----- + src/cairo-glitz-surface.c | 4 +--- + 3 files changed, 3 insertions(+), 10 deletions(-) + +commit eadb26a1c13da1af292f0262e108878133cbadf0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 15:19:36 2006 -0700 + + Add new PS-specific reference image for new-sub-path. + + test/new-sub-path-ps-argb32-ref.png | Bin 0 -> 316 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 448e904b2a64769aa9cfd8ea011c2b5fb6ec883b +Merge: cb77876 ffab259 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 15:18:31 2006 -0700 + + Merge branch 'cairo' into new-sub-path + + Conflicts: + + src/cairo-path-stroke.c + src/cairo-pdf-surface.c + src/cairo-ps-surface.c + +commit ffab2592fc5d0ccd498aff2f4e645eefe351b61b +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Apr 18 21:52:06 2006 +0200 + + Clear completely the temporary surface between each subtest in mask.c + + That helps SVG backend to pass this test, since CAIRO_OPERATOR_CLEAR on a part of a surface use "comp-op" element which is not supported with current librsvg. + + test/mask.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 9c65dee86b469c1eedf2690334d5a2b4afc849c8 +Merge: 36fb36f 3f84df9 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Apr 18 21:23:59 2006 +0200 + + Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo + +commit 36fb36fe8c4d8b2ac2b2de3f53842ae196bdca04 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Apr 18 21:22:58 2006 +0200 + + SVG: Add validating ref file for unantialias tests. + + Antialias property is not directly supported by SVG, and probably not the most wanted feature. In the future, we could use an image fallback in order to emulate it, or try to use text-rendering, shape-rendering and image-rendering + properties (http://www.w3.org/TR/SVG/painting.html#RenderingProperties). + + test/text-antialias-none-svg-argb32-ref.png | Bin 0 -> 1077 bytes + test/text-antialias-none-svg-rgb24-ref.png | Bin 0 -> 1077 bytes + test/text-antialias-subpixel-svg-argb32-ref.png | Bin 0 -> 1077 bytes + test/text-antialias-subpixel-svg-rgb24-ref.png | Bin 0 -> 1077 bytes + test/unantialiased-shapes-svg-argb32-ref.png | Bin 0 -> 19689 bytes + test/unantialiased-shapes-svg-rgb24-ref.png | Bin 0 -> 19689 bytes + 6 files changed, 0 insertions(+), 0 deletions(-) + +commit 3f84df97ddd639c9e1d3706be7c9c86eba22c5bb +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 18 11:31:59 2006 -0700 + + Enable real analysis for _cairo_pdf_surface_paint. + + After this patch we have three PDF tests passing with native output: + + clip-all + fill-rule + nil-surface + + src/cairo-pdf-surface.c | 61 ++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 55 insertions(+), 6 deletions(-) + +commit 170a028bfa00286324d8598d831e570d868a26f1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Apr 17 23:26:30 2006 +0200 + + SVG: Fix mask and try to support CAIRO_CONTENT_ALPHA. + + Cairo and SVG differ in their implementation of mask. Cairo only uses alpha channel where SVG uses all channels. So, before using a surface for masking, we use a filter that sets RGB channels to 1.0. + + Support for CAIRO_CONTENT_ALPHA is similar and use the same filter when a SVG alpha surface is composited. + + src/cairo-svg-surface.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 44 insertions(+), 5 deletions(-) + +commit 9e2a2ea0da93065c46a6d6249f98a319ee6158dd +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Apr 17 11:07:15 2006 +0200 + + SVG: Don't insert /n/r in base64 encoded image data + + That doesn't work since libxml replace them by + They were intended to ease readability of generated files. + + src/cairo-svg-surface.c | 7 ------- + 1 file changed, 7 deletions(-) + +commit c01805bafd5ad68263a3e644787cd7c04838124b +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Apr 17 10:21:50 2006 +0200 + + SVG: Don't check for content type in create_similar, and mark surface as modified when clearing it. + + src/cairo-svg-surface.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 62d2f7cbf3718cfc982286ec62878c9d6eff09fa +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Apr 17 09:54:03 2006 +0200 + + SVG: Return UNTESTED for test involving operators. + + unbounded-operator, operator-clear, operator-source, clip-operator + + test/cairo-test.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 347083b3f0be2f07d1953278b8516774253752f1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Apr 16 16:00:27 2006 +0200 + + SVG: Add reference files for antialiased text tests. + + Currently, text are rendered as paths in SVG files, so, when rendered to png through librsvg, they don't match general reference images. + + test/show-text-current-point-svg-argb32-ref.png | Bin 0 -> 4236 bytes + test/show-text-current-point-svg-rgb24-ref.png | Bin 0 -> 4236 bytes + test/text-antialias-gray-svg-argb32-ref.png | Bin 0 -> 1077 bytes + test/text-antialias-gray-svg-rgb24-ref.png | Bin 0 -> 1077 bytes + test/text-pattern-svg-argb32-ref.png | Bin 0 -> 2643 bytes + test/text-pattern-svg-rgb24-ref.png | Bin 0 -> 2428 bytes + 6 files changed, 0 insertions(+), 0 deletions(-) + +commit 714bb88832f0e6324cd4737aaa37a4ba39f8d14e +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Apr 16 15:42:49 2006 +0200 + + SVG: Add support for CAIRO_CONTENT_COLOR in create_similar. + + Also add support for testing this feature in test/cairo-test.c + And a bunch of unwanted commit of sgml files. + + doc/public/tmpl/cairo-beos.sgml | 3 ++ + doc/public/tmpl/cairo-font-options.sgml | 3 ++ + doc/public/tmpl/cairo-font.sgml | 3 ++ + doc/public/tmpl/cairo-ft.sgml | 3 ++ + doc/public/tmpl/cairo-glitz.sgml | 3 ++ + doc/public/tmpl/cairo-image.sgml | 3 ++ + doc/public/tmpl/cairo-matrix.sgml | 3 ++ + doc/public/tmpl/cairo-paths.sgml | 3 ++ + doc/public/tmpl/cairo-pattern.sgml | 3 ++ + doc/public/tmpl/cairo-pdf.sgml | 3 ++ + doc/public/tmpl/cairo-png.sgml | 3 ++ + doc/public/tmpl/cairo-ps.sgml | 3 ++ + doc/public/tmpl/cairo-quartz.sgml | 3 ++ + doc/public/tmpl/cairo-scaled-font.sgml | 3 ++ + doc/public/tmpl/cairo-status.sgml | 3 ++ + doc/public/tmpl/cairo-surface.sgml | 3 ++ + doc/public/tmpl/cairo-text.sgml | 3 ++ + doc/public/tmpl/cairo-transforms.sgml | 3 ++ + doc/public/tmpl/cairo-types.sgml | 3 ++ + doc/public/tmpl/cairo-version.sgml | 3 ++ + doc/public/tmpl/cairo-win32-fonts.sgml | 3 ++ + doc/public/tmpl/cairo-win32.sgml | 3 ++ + doc/public/tmpl/cairo-xcb-xrender.sgml | 3 ++ + doc/public/tmpl/cairo-xcb.sgml | 3 ++ + doc/public/tmpl/cairo-xlib-xrender.sgml | 3 ++ + doc/public/tmpl/cairo-xlib.sgml | 3 ++ + doc/public/tmpl/cairo.sgml | 3 ++ + src/cairo-svg-surface.c | 69 ++++++++++++++++++++++++++------- + test/cairo-test.c | 36 +++++++++++++++-- + 29 files changed, 167 insertions(+), 19 deletions(-) + +commit d0356a87f7b274a0721c2644c4a62a8424923eb9 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Sat Apr 15 03:58:42 2006 -0400 + + Implement cairo_set_scaled_font(). + + doc/public/tmpl/cairo-beos.sgml | 3 --- + doc/public/tmpl/cairo-font-options.sgml | 3 --- + doc/public/tmpl/cairo-font.sgml | 3 --- + doc/public/tmpl/cairo-ft.sgml | 3 --- + doc/public/tmpl/cairo-glitz.sgml | 3 --- + doc/public/tmpl/cairo-image.sgml | 3 --- + doc/public/tmpl/cairo-matrix.sgml | 3 --- + doc/public/tmpl/cairo-paths.sgml | 3 --- + doc/public/tmpl/cairo-pattern.sgml | 3 --- + doc/public/tmpl/cairo-pdf.sgml | 3 --- + doc/public/tmpl/cairo-png.sgml | 3 --- + doc/public/tmpl/cairo-ps.sgml | 3 --- + doc/public/tmpl/cairo-quartz.sgml | 3 --- + doc/public/tmpl/cairo-scaled-font.sgml | 3 --- + doc/public/tmpl/cairo-status.sgml | 3 --- + doc/public/tmpl/cairo-surface.sgml | 3 --- + doc/public/tmpl/cairo-text.sgml | 3 --- + doc/public/tmpl/cairo-transforms.sgml | 3 --- + doc/public/tmpl/cairo-types.sgml | 3 --- + doc/public/tmpl/cairo-version.sgml | 3 --- + doc/public/tmpl/cairo-win32-fonts.sgml | 3 --- + doc/public/tmpl/cairo-win32.sgml | 3 --- + doc/public/tmpl/cairo-xcb-xrender.sgml | 3 --- + doc/public/tmpl/cairo-xcb.sgml | 3 --- + doc/public/tmpl/cairo-xlib-xrender.sgml | 3 --- + doc/public/tmpl/cairo-xlib.sgml | 3 --- + doc/public/tmpl/cairo.sgml | 3 --- + src/cairo.c | 40 +++++++++++++++++++++++++++++++++ + src/cairo.h | 4 ++++ + 29 files changed, 44 insertions(+), 81 deletions(-) + +commit db111197ac436ace0c3aceb88a6d7c1abca03b02 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 17:29:19 2006 -0700 + + Fix _cairo_surface_is_opaque to return FALSE not TRUE for non-image surfaces. + + src/cairo-surface.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit e890bfd2bf04a973ead9f5d53d06728165faa28d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 17:26:23 2006 -0700 + + Ignore dash-zero-length + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit b7309d065e49ae73ff8d90feca35f6b8f35922d2 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 17:25:54 2006 -0700 + + Farm out the surface and pattern analysis functions away from cairo-ps-surface.c. + + We're setting things up here for better sharing as PDF surface (and + others) now want to do some of the same analysis. + + src/cairo-pattern.c | 44 +++++++++++++++++++++++++++++-- + src/cairo-pdf-surface.c | 6 ++++- + src/cairo-ps-surface.c | 69 +------------------------------------------------ + src/cairo-surface.c | 28 ++++++++++++++++++++ + src/cairoint.h | 8 +++++- + 5 files changed, 83 insertions(+), 72 deletions(-) + +commit a7f4f1b350e158eca394da63eed0e14a97480a5a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 17:03:39 2006 -0700 + + Move analysis of operators from cairo-ps-surface.c to cairo-operator.c + + src/Makefile.am | 1 + + src/cairo-operator.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-ps-surface.c | 73 +++--------------------------- + src/cairoint.h | 7 +++ + 4 files changed, 132 insertions(+), 68 deletions(-) + +commit c7fd35fac2bc7c93e85ccbe50b20529ae4d9479d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 16:50:16 2006 -0700 + + Add tests for PAGINATED_MODE_ANALYZE to PDF (no real analysis yet) + + src/cairo-pdf-surface.c | 39 +++++++++++++++++++++++++++++++++++---- + 1 file changed, 35 insertions(+), 4 deletions(-) + +commit 0e44e798b5f6fd58cc586e40f926d363cd8fff50 +Author: Dom Lachowicz <cinamod@hotmail.com> +Date: Fri Apr 14 16:15:29 2006 -0700 + + Change cairo_image_surface_create to zero out surface contents. + + This closes bug #5816: + + Image surfaces do not start out blank by default + https://bugs.freedesktop.org/show_bug.cgi?id=5816 + + This also fixes all of the test suite failures introduced by moving + the CLEAR on blank page optimization up to the paginated surface from + the PS surface. + + pixman/src/icpixels.c | 1 + + src/cairo-image-surface.c | 7 ++++--- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit e8a0da637fda4a29281cfb4f463169e51c300c42 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 16:18:36 2006 -0700 + + Move optimization of CLEAR on blank page up from PS to paginated surface. + + src/cairo-paginated-surface-private.h | 8 ++++++++ + src/cairo-paginated-surface.c | 30 ++++++++++++++++++++++++++++++ + src/cairo-ps-surface.c | 27 --------------------------- + 3 files changed, 38 insertions(+), 27 deletions(-) + +commit b8fb8dc375d2828a962bac2e1f50f44d8ec8cbee +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 15:23:30 2006 -0700 + + Add stub implementations of drawing operations for the PDF backend. + + These new stubs explicitly return UNSUPPORTED unconditionally. This is + no different than the implicit UNSUPPORTED which the analysis surface + was inferring from NULL for 4 of the functions before. + + However, _cairo_pdf_surface_fill was actually trying to draw things, + but without correctly characterizing it during the analysis stage. + This was just an oversight, as the PDF surface was always triggereing + full page fall backs anway due to the initial unsupported paint with + CLEAR. + + Now, we explicitly return UNSUPPORTED for all drawing operations so we + get image fallbacks by design and not by accident. + + src/cairo-pdf-surface.c | 160 +++++++++++++++++++++++++++++++----------------- + 1 file changed, 103 insertions(+), 57 deletions(-) + +commit 2726f684547de7d381e56dce13bb7c025cd75b80 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 14:53:13 2006 -0700 + + Update documentation of cairo_paginated_surface + + src/cairo-paginated-surface-private.h | 12 ++++++++++++ + src/cairo-paginated-surface.c | 29 ++--------------------------- + 2 files changed, 14 insertions(+), 27 deletions(-) + +commit 8d3a800b82ccd4a39bf04cc1d602eb84d90f81d1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 14:46:59 2006 -0700 + + Add a start_page function to the paginated_surface_backend. + + This allows for any surface using the paginated_surface backend to + easily do stuff at the beginning of each page, (such as writing out + any per-page header necessary). + + This replaces some of the per-page state tracking that the PS surface + was doing, (though it still has some left for its optimization of + CLEAR on a blank page). + + src/cairo-paginated-surface-private.h | 60 ++++++++++++++++++++++++++- + src/cairo-paginated-surface.c | 19 +++++++++ + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 78 +++++++++++++++-------------------- + src/test-paginated-surface.c | 1 + + 5 files changed, 112 insertions(+), 47 deletions(-) + +commit 687802cca67ce4157725316d769fc28bc75f5dcd +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 14:44:16 2006 -0700 + + Obnoxious churn of gtk-doc templates. + + We really need to get these built files out from under version control, (or + else abandon gtk-doc altogether). + + doc/public/tmpl/cairo-svg.sgml | 2 -- + 1 file changed, 2 deletions(-) + +commit d284c2b5a475ff1672dad10e7bf76763877690a3 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri Apr 14 23:11:35 2006 +0200 + + SVG: enable SVG backend API documentation in /doc + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 8 +++++++ + doc/public/tmpl/cairo-svg.sgml | 54 ++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 63 insertions(+) + +commit b9eb4f018e77a3f797116f0915f261d8453b3993 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri Apr 14 22:55:48 2006 +0200 + + PDF: Fix typo in documentation. + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e952e0aff89412e67fb72ba2cf3a30c3ddd332b4 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri Apr 14 22:53:58 2006 +0200 + + SVG: Add documentation for public API. Fix test filenames and add testing of CAIRO_CONTENT_COLOR + + src/cairo-svg-surface.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + test/cairo-test.c | 6 +++++- + 2 files changed, 52 insertions(+), 1 deletion(-) + +commit f919ba858f405aa5c1cc64e7c25c3de5ffbce88f +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri Apr 14 22:06:28 2006 +0200 + + SVG: Emulate CLEAR and SOURCE operators on paint call when no clipping region is defined. + + src/cairo-svg-surface.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 8f3c60096d88b3c0368970273828e7a011c5e9dd +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 11:33:48 2006 -0700 + + Add a new cairo_paginated_surface_backend_t rather than just a single function pointer. + + src/cairo-paginated-surface-private.h | 17 ++++++++++------- + src/cairo-paginated-surface.c | 29 +++++++++++++++-------------- + src/cairo-pdf-surface.c | 17 +++++++++-------- + src/cairo-ps-surface.c | 27 ++++++++++++++------------- + src/test-paginated-surface.c | 25 +++++++++++++++---------- + 5 files changed, 63 insertions(+), 52 deletions(-) + +commit 5461f25df9888aa5fd79e1e371cd1af2cf8964ab +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 11:01:39 2006 -0700 + + Fix _composite_trap_region to restore the original clip when done. + + src/cairo-surface-fallback.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit c81569d2f1b8c396f789f4c49d87772a596862d9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 10:38:11 2006 -0700 + + Flesh test-paginated-surface out into a complete surface. + + This adds an aactual test_paginated_surface_backend rather than just + having this test surface create a paginated surface around an image + surface. This is a more realistic test of what a paginated surface is + and should be more useful as an example of how to use the paginated + surface, (and in particular the analysis portions). + + src/cairo-image-surface.c | 2 +- + src/cairoint.h | 13 +++ + src/test-paginated-surface.c | 219 ++++++++++++++++++++++++++++++++++++++++--- + test/cairo-test.c | 4 +- + 4 files changed, 222 insertions(+), 16 deletions(-) + +commit 41dc06d7111d246d4b5802c700a83e4be9091449 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 14 10:08:31 2006 -0700 + + Add new PS-specific image for dash-zero-length test. + + This reference image demonstrates the bug that occurs when we emit zero-length + dash segments into a PostScript file with butt caps. + + test/dash-zero-length-ps-argb32-ref.png | Bin 222 -> 214 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 11b4d24671a0527a45971e9fdf245ac28facc822 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 13 12:56:58 2006 -0700 + + Move cairo_pdf_surface_backend to file end so it's easier to find. + + src/cairo-pdf-surface.c | 66 ++++++++++++++++++++++++------------------------- + 1 file changed, 33 insertions(+), 33 deletions(-) + +commit 2078557c5c9e10cf8ae16fb3fa8a225f908ab528 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 9 23:11:27 2006 -0400 + + Fix skipping zero length dash segments in dash_start. + + The extra check makes sure zero length segments are not skipped when computing + the dash start state. This is needed so that we get proper line capping if, for + example, the first dash segment has zero length and we have a dash offset of + zero. + + src/cairo-path-stroke.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 5eaf71e77bd975f5865cc059b4aa4d57c096688e +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 9 23:11:11 2006 -0400 + + Move the test for zero length sub edges below the computation of faces. + + Face computation still works if a line has zero length, all that is needed is a + slope and a point. This patch fixes bug #5561 because the faces are initialized + even if the segment has zero length as expected by + _cairo_stroker_line_to_dashed. + + src/cairo-path-stroke.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 20fca01a2cc539df017e442be0cc6ad35353571f +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 9 23:10:59 2006 -0400 + + Move calculation of slope outside of _cairo_stroker_add_sub_edge. + + This makes the slope calculation more accurate for dashed lines by computing it + once for the entire line instead for each individual dash segment. It also + adjusts stroker_line_to() to match the new convention for + stroker_add_sub_edge(). + + src/cairo-path-stroke.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 8a2ea660fb59beb4eacaf73978368c8db7a6b584 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 9 23:10:46 2006 -0400 + + Check for zero length dashed lines. + + This makes line_to_dashed more like line_to by returning immediately on + degenerate paths. This is needed so that we can do the slope calculation for + the entire line. + + src/cairo-path-stroke.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 584109d5e6160c1e74da0e79b6e024701a354293 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 9 23:11:47 2006 -0400 + + Add test case for dashed lines. + + The new test case tests a variety of circumstances involved with zero length dashing. + + test/Makefile.am | 4 ++ + test/dash-zero-length-ps-argb32-ref.png | Bin 0 -> 222 bytes + test/dash-zero-length-ref.png | Bin 0 -> 235 bytes + test/dash-zero-length-rgb24-ref.png | Bin 0 -> 222 bytes + test/dash-zero-length.c | 88 ++++++++++++++++++++++++++++++++ + 5 files changed, 92 insertions(+) + +commit f17b347ab443fcc12f9098f9b601334f85d20a30 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 13 07:59:52 2006 -0700 + + Fix page numbers in PostScript output to start at 1 + + src/cairo-ps-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6beababd47aabfb4896a878de09d729f287aa714 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 16:19:08 2006 -0700 + + Optimize PostScript file size with procedures instead of builtin operators. + + This is based on a suggestion by Michael Sweet. + + src/cairo-ps-surface.c | 42 +++++++++++++++++++++++++++--------------- + 1 file changed, 27 insertions(+), 15 deletions(-) + +commit d60eaab222fb1ce19ef7bbbf496ad444f07aa703 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 15:48:59 2006 -0700 + + Add simple word wrapping to keep PostScript output within 80 columns or less. + + src/cairo-ps-surface.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 109 insertions(+) + +commit 6a5d8fc7ffb5f425ceffd313b8a875f38126b324 +Merge: b30e281 0727e3c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 14:15:08 2006 -0700 + + Merge branch 'ps-type3' into cairo (no bitmap support for type 3 yet). + + Conflicts: + + src/cairo-hash.c + src/cairo-ps-surface.c + +commit b30e281627d86f3c0d0f4d5008bbbf7e77c09350 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 13:55:24 2006 -0700 + + Add documentation for _cairo_output_stream_create_for_file. + + src/cairoint.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 193b43001de11945b0ae7ca4ee685590d9f79137 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 14:06:26 2006 -0700 + + Propagate stream status values through _cairo_ps_surface_finish + + src/cairo-ps-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit d9137e56b6a8f1ddb44a01bf34301117b0696f0b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 13:44:14 2006 -0700 + + Use ferror to get error checking for stdio-based output streams. + + src/cairo-output-stream.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 32994379db92ef8208ba11b825b1246e2b442566 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 13:40:05 2006 -0700 + + Fix missing argument to printf in _cairo_ps_surface_stat_page + + src/cairo-ps-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 5444aa55b35aff7d6cff8b5e8a5ab020711562ac +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 13:34:03 2006 -0700 + + Clean up output_stream error handling in _cairo_ps_surface_create. + + We teach the output stream to catch a NULL file error here, which + allows for less checking in ps_surface_create. We also fix the ps + surface code to look for the status of a nil stream rather than + checking for NULL. + + src/cairo-output-stream.c | 3 +++ + src/cairo-ps-surface.c | 23 ++++++++++++----------- + 2 files changed, 15 insertions(+), 11 deletions(-) + +commit a7abf8e4513a7ca03cdb7db6f80a438a4897d208 +Merge: 0386a72 ade195c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 12:54:28 2006 -0700 + + Merge 'Save PS output in temp file' from ps-type3 branch + +commit 0386a728957bdb3549da8e772c31b86295175a4b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 11:06:06 2006 -0700 + + Add some documentation to string_array_stream + + src/cairo-ps-surface.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 39592788b38a8e8db5335d836a8eaa7ace08fc1c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 12 10:56:42 2006 -0700 + + Print both page label and number in PostScript %%Page headers. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 523f9e46d87392a539c26ade18d99a3db7ed833d +Author: Kristian Høgsberg <krh@dinky.bitplanet.net> +Date: Tue Apr 11 20:49:55 2006 -0400 + + Make cairo_t and cairo_output_stream_t destructors handle NULL. + All other cairo destructors and reference functions accept and ignore NULL, + so fix up cairo_destroy(), cairo_reference(), and cairo_output_stream_destroy() + to do so too. + + src/cairo-output-stream.c | 3 +++ + src/cairo.c | 6 ++++++ + 2 files changed, 9 insertions(+) + +commit 6e77a0e248c337bf3f39c0de239a7743c6969efe +Author: Keith Packard <keithp@keithp.com> +Date: Tue Apr 11 12:28:41 2006 -0700 + + Allow hash entry deletion during cairo_hash_foreach + + I discovered that _cairo_hash_table_foreach walks over the hash table + without preventing it from being resized as a result of deletions + occuring from the callback. + + Kinda nasty when you're trying to free everything from a hash table. + + It was also easy to fix; just prevent the table from being resized while + iterating and clean it up after the iteration is completed. + + src/cairo-hash.c | 43 ++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 38 insertions(+), 5 deletions(-) + +commit 9231ab40437e70818c9525fa9648ff7a5d11e44a +Merge: 1e5f5ae baa3436 +Author: Anders Carlsson <andersca@luminoth.local> +Date: Tue Apr 11 01:09:30 2006 +0200 + + Merge with git+ssh://git.cairographics.org/git/cairo + +commit 1e5f5aed07137d3a823c2d22e29eb0e53e359fef +Author: Anders Carlsson <andersca@luminoth.local> +Date: Tue Apr 11 01:07:33 2006 +0200 + + Make the API more like Vlad's new API.# + + src/cairo-quartz-private.h | 2 +- + src/cairo-quartz-surface.c | 11 ++++++----- + src/cairo-quartz.h | 4 ++-- + 3 files changed, 9 insertions(+), 8 deletions(-) + +commit 3ed576522df8a4e41e856a500539ca3e6f69e2da +Author: Anders Carlsson <andersca@luminoth.local> +Date: Mon Apr 10 22:29:51 2006 +0200 + + Remove unused function + + src/cairo-quartz-surface.c | 8 -------- + 1 file changed, 8 deletions(-) + +commit 8ba59b0336ddc581c8f43b4aa5cf9acdb2c001ad +Author: Anders Carlsson <andersca@luminoth.local> +Date: Mon Apr 10 22:24:02 2006 +0200 + + Rework the quartz backend to not always hold an image but instead to create it on demand.# + + src/cairo-quartz-private.h | 8 +- + src/cairo-quartz-surface.c | 220 ++++++++++++++++++++++----------------------- + 2 files changed, 111 insertions(+), 117 deletions(-) + +commit df3c02c9ca0c704df3960416fbe689af0cedf2fa +Author: Anders Carlsson <andersca@luminoth.local> +Date: Mon Apr 10 22:23:39 2006 +0200 + + Don't set can_draw_directly to FALSE. + + src/cairo-atsui-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit baa3436e9d8ea37c1204f752cac78a8cbc891f18 +Author: Laxmi Harikumar <laxmi.harikumar@digital.com> +Date: Mon Apr 10 12:04:01 2006 -0700 + + Simple fix for build failure on DEC/OSF1. + + Apparently this platform also requires inttypes.h rather than + stdint.h. + + This should fix the bug reported here: + + https://bugzilla.mozilla.org/show_bug.cgi?id=331428 + + pixman/src/pixman.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 08b109fb9a8c54f4764fe7a94ce7833e832bc157 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Mon Apr 10 11:00:26 2006 -0700 + + Add new ps-specific reference image for dash-caps-joins test. + + With the recent fix to the treatment of sub-paths with respect to + dashing, this test is now correct except for slight difference in + ghostscript vs. cairo rasterization. This commit records the + ghostscript output as the new reference image against which the ps + output should be tested. + + test/dash-caps-joins-ps-argb32-ref.png | Bin 0 -> 1247 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 65e706ee14b9bfbc2ce0e83b35a813d51d97592f +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Apr 9 23:13:36 2006 -0400 + + Reset dashing for new subpaths. + + Fixes the bug mentioned in b87726ee2aa0220b66ee4d97513c0ac89ffc4621 by reseting + the dash pattern for each new subpath. This is correct behaviour according to + the end of PDF Reference v1.6 section 4.3.2. + + This commit now makes the dash-caps-joins test case pass for all + backends except for the PostScript backend. + + src/cairo-path-stroke.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit f02aacbb5f8068f6b0101b3200bd3a0d73746dd4 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Mon Apr 10 10:54:24 2006 -0700 + + Update dash-caps-joins test cases to show independent dashing of sub-paths. + + We would like to be compatible with PostScript/PDF dash semantics. And + according to the description of the setdash operator in section 8.2 of + the PostScript Language Reference Manual, (as well as the description + of the line dash pattern in section 4.3.2 of the PDF Reference), each + sub-path should be treated independently with respect to dashing. + + With this change, this test now fails for most backends for which it + previously passed. + + test/dash-caps-joins-ref.png | Bin 3219 -> 2583 bytes + test/dash-caps-joins-rgb24-ref.png | Bin 2946 -> 2465 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 807f64d57c616e2ce8a61202cd9b59ac7a6a26cb +Merge: 5ee26e3 732e062 +Author: Anders Carlsson <andersca@luminoth.local> +Date: Mon Apr 10 19:32:47 2006 +0200 + + Merge with git+ssh://git.cairographics.org/git/cairo + +commit 5ee26e3b0eec85ac2e9c07d828eae0c8e1a57364 +Author: Anders Carlsson <andersca@luminoth.local> +Date: Mon Apr 10 19:18:36 2006 +0200 + + * Save and restore state when drawing glyphs using the short circuit. + + src/cairo-atsui-font.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0727e3c1a980f57d48f3dfaee801f05e5395a71a +Author: Keith Packard <keithp@neko.keithp.com> +Date: Sun Apr 9 00:38:43 2006 -0700 + + Use Type3 fonts for PostScript output. No bitmap support yet. + + src/cairo-ps-surface.c | 737 +++++++++++++++++++++++++++++-------------------- + 1 file changed, 440 insertions(+), 297 deletions(-) + +commit da2c5e44abd98f1f1aed4f716b7e9bc97a667058 +Author: Keith Packard <keithp@neko.keithp.com> +Date: Sun Apr 9 00:37:58 2006 -0700 + + Allow hash entry deletion during cairo_hash_foreach + + src/cairo-hash.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit ade195cdba5b0d13c121e44709151bfbb0c44085 +Author: Keith Packard <keithp@neko.keithp.com> +Date: Sat Apr 8 21:29:14 2006 -0700 + + Save PS output in temp file so we can prepend global data (like fonts) + + src/cairo-output-stream.c | 20 ++++++++++++++-- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 59 ++++++++++++++++++++++++++++++++++++++--------- + src/cairo-svg-surface.c | 2 +- + src/cairoint.h | 5 +++- + 5 files changed, 72 insertions(+), 16 deletions(-) + +commit 732e06258c81427cf7fedfca98107e21244264eb +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 7 15:46:32 2006 -0700 + + Rename write_data to write_func in cairo_output_stream_t. + + src/cairo-base85-stream.c | 8 ++++---- + src/cairo-output-stream.c | 12 ++++++------ + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit bfd467453c5213341ae2c396ac3d32ba76df8de9 +Author: Anders Carlsson <andersca@luminoth.local> +Date: Fri Apr 7 17:40:30 2006 +0200 + + * Fix build + + * Add shortcut to cairo-atsui-font.c for the common case. + + src/cairo-atsui-font.c | 148 +++++++++++++++++++++++++-------------------- + src/cairo-quartz-surface.c | 1 + + 2 files changed, 84 insertions(+), 65 deletions(-) + +commit b87726ee2aa0220b66ee4d97513c0ac89ffc4621 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 6 09:43:39 2006 -0700 + + Tweak initial erase so it doesn't trigger fallbacks for every PS test case. + + Add an optimization to cairo-ps-surface.c so that it ignores any + CAIRO_OPERATOR_CLEAR drawing operation that occurs on a blank page. + Also change the test suite to erase with OPERATOR_CLEAR instead of + OPERATOR_SOURCE with an all-0 source pattern. + + With this change, 32 of the 61 test cases change from all-fallback to + all-native for the ps backend. + + Of these 32 test cases, 13 pass the test suite with the original + reference images. Another 18 cases differ only in the single-pixel + boundary of objects due to cairo vs. ghostscript rasterization + differences. We ignore these by adding new ps-specific reference + images, (included in this commit). + + Finally, there appears to be one genuine failure, (dash-caps-joins), + in which the PostScript dashes (at least as rendered by ghostscript) + differ significantly from the cairo-rendered dashes. + + src/cairo-ps-surface.c | 69 +++++++++++++++++------- + test/cairo-test.c | 3 +- + test/caps-joins-ps-argb32-ref.png | Bin 0 -> 995 bytes + test/caps-sub-paths-ps-argb32-ref.png | Bin 0 -> 170 bytes + test/clip-fill-rule-ps-argb32-ref.png | Bin 0 -> 280 bytes + test/clip-nesting-ps-argb32-ref.png | Bin 0 -> 488 bytes + test/clip-twice-ps-argb32-ref.png | Bin 0 -> 460 bytes + test/dash-offset-negative-ps-argb32-ref.png | Bin 0 -> 170 bytes + test/fill-and-stroke-ps-argb32-ref.png | Bin 0 -> 243 bytes + test/fill-rule-ps-argb32-ref.png | Bin 0 -> 1078 bytes + test/leaky-polygon-ps-argb32-ref.png | Bin 0 -> 233 bytes + test/line-width-ps-argb32-ref.png | Bin 0 -> 201 bytes + test/path-data-ps-argb32-ref.png | Bin 0 -> 322 bytes + test/rectangle-rounding-error-ps-argb32-ref.png | Bin 0 -> 258 bytes + test/show-text-current-point-ps-argb32-ref.png | Bin 0 -> 638 bytes + test/text-antialias-gray-ps-argb32-ref.png | Bin 0 -> 305 bytes + test/text-antialias-none-ps-argb32-ref.png | Bin 0 -> 305 bytes + test/text-antialias-subpixel-ps-argb32-ref.png | Bin 0 -> 305 bytes + test/transforms-ps-argb32-ref.png | Bin 0 -> 287 bytes + test/unantialiased-shapes-ps-argb32-ref.png | Bin 0 -> 4076 bytes + 20 files changed, 50 insertions(+), 22 deletions(-) + +commit c4fc7b06b53c811ddc20def91aaccd756c28a924 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 6 08:54:59 2006 -0700 + + Revert "Use ghostscript's pngalpha rather than png16m target for PS->PNG" + + This reverts 3b873c66be54522d6cc3f025572a78bbef0efba7 commit. + + It seemed like a good idea at the time, but... + The pngalpha target only gets the fully transparent regions correct. + But we still need to get the partially translucent regions correct. + The pngalpha target doesn't help here---instead we were already + flattening the reference image during testing. And in that case, + having anything other than alpha==1 in the output png doesn't really + help, (and meanwhile it was tripping up the current buffer_diff code). + + test/cairo-test.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit e01047a76a5c44302c24e2ab285cf1b1cd490677 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 5 17:15:48 2006 -0700 + + Build fix for typo from recent commit. + + test/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 3b873c66be54522d6cc3f025572a78bbef0efba7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 5 17:03:23 2006 -0700 + + Use ghostscript's pngalpha rather than png16m target for PS->PNG + + This target allows the output files to actually be transparent where + there is no PostScript "ink", which allows for much better testing. + + test/cairo-test.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 6d5627ca2a5b96edf0b37fe6e16002726f72d86d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 5 17:00:13 2006 -0700 + + Add a call to _cairo_ps_surface_start_page in _cairo_ps_surface_intersect_clip_path. + + If clipping occurs before any drawing, then we still need to issue a start page call. + Otherwise, the clip ends up being inverted since the scaling + transformation that puts PostScript into a cairo-oriented coordinate + system only happens in start_page. + + src/cairo-ps-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 341d61cda0247eebd26da1e3b71c43ee8f761833 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 5 16:55:51 2006 -0700 + + Disable show-glyphs-many test to avoid abusing ghostscript too badly. + + test/Makefile.am | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +commit 5baae7ff21a4236ebc9eaff087eb29fd1432c7ff +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Apr 5 21:24:06 2006 +0200 + + SVG: Fix typo and stream status handling + + src/cairo-svg-surface.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 4fd30e6f402ae031c2084c20f136b84307a128cc +Merge: a8e5a77 66ed981 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 4 15:04:36 2006 -0700 + + Merge branch 'analysis-surface' into cairo + +commit a8e5a77ad496c1716acdd279d5d5bebf1bc71eee +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 23 16:02:02 2006 -0800 + + Add attribution for Bdale Garbee to the AUTHORS file. + + AUTHORS | 1 + + 1 file changed, 1 insertion(+) + +commit 66ed9811cc542d99cb5a6b6b792c9a9f0832fbf9 +Merge: edb83e3 45bbdf9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 4 14:58:52 2006 -0700 + + Merge branch 'cairo-origin' into analysis-surface + + With the string-array-stream stuff that this merge picks up, the + analysis-surface branch is now passing all of the test suite again. + +commit 45bbdf94cbac736c9f854012581e8f914a6e27df +Author: Carl Worth <cworth@raht.cworth.org> +Date: Tue Apr 4 12:50:44 2006 -0700 + + Break PostScript image data into chunks that each fit into a string. + + This solves the problem with the previous commit that made strings + longer than the "standard" 65k implementation limit for strings. + It's achieved by removing the line-wrapping from the base85 stream and + instead adding a new string-array stream between the base85 stream and + the output stream (the string-array stream does the line wrapping and + enforces the 65k characters per string limit). + + src/cairo-base85-stream.c | 30 ++++------- + src/cairo-ps-surface.c | 129 +++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 124 insertions(+), 35 deletions(-) + +commit d1134cd7e25a78c70819df879336f895134bafe1 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Tue Apr 4 11:21:17 2006 -0700 + + Emit images into PostScript output as strings rather than inline. + + This is a baby step toward having shared source patterns in the + PostScript output. This patch is based on original work by Keith + Packard in the following commit: + + 06b83b89fc4271060c63b284d7909162b92152f1 + + One problem with this approach is that it attempts to put an entire + image into a PostScript string object. However, PostScript strings are + typically limited to 65k bytes. So, as is, this commit causes a few + failures for tests in the suite with large output images. + + src/cairo-ps-surface.c | 58 +++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 43 insertions(+), 15 deletions(-) + +commit 0114393a132471cbf87bc3abc2f298b4ca38c69c +Author: Carl Worth <cworth@raht.cworth.org> +Date: Tue Apr 4 11:17:25 2006 -0700 + + Explicitly remove the output png image before creating it during testing. + + What was happening here is that some backends (such as the PS surface + backend) directly generate an output file, and then run a conversion + process to generate the png file. Some bugs were such that a broken + file would successfully be generated, the conversion would fail (the + failure was unnoticed), and the test suite would happily verify the + old image from a previously successful run. + + This fix eliminates this source of false positives. + + test/cairo-test.c | 1 + + 1 file changed, 1 insertion(+) + +commit dd67cf6616c2e819e7e8e4452c1e14e68b4a66bd +Author: Carl Worth <cworth@raht.cworth.org> +Date: Tue Apr 4 10:45:38 2006 -0700 + + Implement proper cairo-style error-handling for cairo_output_stream_t. + + The cairo_output_stream_t object already had an internal status value, + but it was annoyingly returning status values from various functions. + It also was missing proper shutdown-on-error as well as nil-create + semantics. + + This fixes those shortcomings and adjusts all callers for the new + semantics, (leading to simpler and more correct calling + code---particularly in the case of cairo-base85-stream.c). + + src/cairo-base85-stream.c | 40 +++++++---------------- + src/cairo-output-stream.c | 82 +++++++++++++++++++++++++++++++---------------- + src/cairo-pdf-surface.c | 12 ++++--- + src/cairo-ps-surface.c | 27 ++++++++-------- + src/cairo-svg-surface.c | 16 ++++++--- + src/cairoint.h | 35 +++++++++++++++----- + 6 files changed, 125 insertions(+), 87 deletions(-) + +commit 5a06133eb2e13a4c0354dad7f7da414c85733c4e +Author: Carl Worth <cworth@raht.cworth.org> +Date: Mon Apr 3 23:44:51 2006 -0700 + + Implement cairo-base85-stream as a filtering output stream not just a write function. + + Now _cairo_output_stream_create accepts a new close callback, (which + the base85 stream uses to write its trailer). This eliminates the + former kludge used to fclose the stdio output streams, and required a + bit of touchup to the pdf, ps, and svg-surface usage of streams. + + src/cairo-base85-stream.c | 142 +++++++++++++++++++++++++++++++++------------- + src/cairo-output-stream.c | 52 ++++++++++------- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 22 +++++-- + src/cairo-svg-surface.c | 2 +- + src/cairoint.h | 23 ++++++-- + 6 files changed, 169 insertions(+), 74 deletions(-) + +commit 57fe9b17b0a1a36acf0d8d524df05215ea48361f +Author: Carl Worth <cworth@raht.cworth.org> +Date: Mon Apr 3 15:26:17 2006 -0700 + + Move base85 code out of cairo-output-stream.c into new cairo-base85-stream.c + + src/Makefile.am | 1 + + src/cairo-base85-stream.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-output-stream.c | 63 ------------------------------ + 3 files changed, 99 insertions(+), 63 deletions(-) + +commit 9bdb4f6ff713db0d101a0c0735dbb27e54fd7846 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Apr 2 15:55:27 2006 +0200 + + Use more portable shell syntax + + Reported by Dave Yeo in + http://lists.freedesktop.org/archives/cairo/2006-April/006600.html + + Fixed for the other tests in 0883155111ab9597d335c7d43ae47c163b5c0e4d + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03eb1b85a906fac4acfbf3ee2839d13ccac97668 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 10 11:57:41 2006 -0800 + + [win32] Add missing depth-16 format check + (cherry picked from 969d624db8d32d35361bbcc89dbcc354f3d48eaa commit) + + src/cairo-win32-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6a430478f508361767bff91132c3978234b76e95 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Tue Mar 14 13:25:51 2006 +0100 + + Add an assert for the unsupported image surface formats + + src/cairo-beos-surface.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit 8fbd0d448dbdf8f556315366b64abe2468588ea6 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Mar 27 02:31:51 2006 +0200 + + Implement create_similar for BeOS + + src/cairo-beos-surface.cpp | 202 +++++++++++++++++++++++++++++++++++---------- + 1 file changed, 158 insertions(+), 44 deletions(-) + +commit edb83e306bda8a78a8a72006f257922cda7adc69 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 24 12:07:21 2006 -0800 + + cairo-ps-surface: Simplify operation analysis. + + Introduce a new pattern_operation_analyze function which allows a much + simpler idiom to be used by all of the drawing operations. This also + provides new assertions that when we are not analyzing we are never + called to perform an operation that we would analyze as + unsupported. + + src/cairo-ps-surface.c | 57 +++++++++++++++++++++++++++++++------------------- + 1 file changed, 35 insertions(+), 22 deletions(-) + +commit 29dad9867aa5f00f4f38da5da7df6aded794682c +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 24 11:58:45 2006 -0800 + + cairo-ps-surface: Don't support meta-surfaces. This isn't ready yet. + + src/cairo-ps-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 7cee03957b805db55df6f54deef5012535dfa7f4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 24 11:57:18 2006 -0800 + + cairo-ps-surface: Fix characterization of CLEAR and SOURCE operators. + + CLEAR should always be considered a translucent operator, while SOURCE is not + necessarily always opaque. + + src/cairo-ps-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 498094027e18fbc8f190a225a87787a5b445e547 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 24 11:49:48 2006 -0800 + + Back out use of meta-surface for similar-paginated-surface. It's not ready yet. + + src/cairo-paginated-surface.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +commit ecb062a6792d39f7ddb670ef35ea89b868e79353 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 24 11:48:35 2006 -0800 + + Update PDF backend for new paginated API so it at least doesn't crash. + + src/cairo-pdf-surface.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +commit 3259efed7690670754d7c1e76176ff26464111c3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 23 15:36:41 2006 -0800 + + _cairo_lzw_compress: Remove unused code which we had for testing + conformance with the LZW compression from libtiff. + + src/cairo-lzw.c | 13 ------------- + 1 file changed, 13 deletions(-) + +commit bcfe344608150aa56b1cb37dbc774455bfcf6830 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 23 15:27:00 2006 -0800 + + Optimize the implementation of _cairo_lzw_compress. + + This switches the implementation of _cairo_lzw_compress from using + cairo-hash.c to a custom implementation of the same algorithm that + takes advantage of the specific details of what is needed here. + + This final version now has comparable performance to the libtiff code, + but should hopefully be easier to understand. + + Add a bunch of comments explaining how the various pieces work. + + src/cairo-lzw.c | 377 ++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 217 insertions(+), 160 deletions(-) + +commit 639c2fe4df880546d71b2c73ea972fb08b609603 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 23 15:23:29 2006 -0800 + + cairo-lzw: Replace LZW code from libtiff with an original implementation. + + This new implementation is an entirely original work directly from the + description of the LZWDecode filter in the PostScript Language + Reference, (and in spite of the bugs in the examples provided in that + reference). + + This implementation uses the existing cairo-hash.c for the symbol + table. This implementation is somewhat easier to read than the libtiff + code, and avoids any code that may have an advertising clause + attached. This new implementation is the simplest thing I could + implement. It is not as efficient as the libtiff code, (though I did + expect better things from cairo-hash.c). + + src/cairo-lzw.c | 709 ++++++++++++++++++++++---------------------------------- + src/cairoint.h | 4 +- + 2 files changed, 285 insertions(+), 428 deletions(-) + +commit ec60bb0a606cadf3120d1cebc88e248a3e056c19 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 23 15:00:40 2006 -0800 + + Rename _cairo_compress_lzw to _cairo_lzw_compress and tighten the parameter list. + + src/cairo-lzw.c | 8 ++++---- + src/cairo-ps-surface.c | 3 ++- + src/cairoint.h | 4 +--- + 3 files changed, 7 insertions(+), 8 deletions(-) + +commit cabe94a15c277bb8a5f0c71f25cc8bc9e22ecb41 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Wed Mar 22 23:12:23 2006 -0800 + + Make all hash/cache keys_equal function accept const pointers. + + src/cairo-cache-private.h | 2 +- + src/cairo-font.c | 12 ++++++------ + src/cairo-ft-font.c | 12 ++++++------ + src/cairo-hash-private.h | 2 +- + src/cairo-scaled-font.c | 14 +++++++------- + 5 files changed, 21 insertions(+), 21 deletions(-) + +commit a193f70b94667808f573caa5b82a1bf50281555e +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Mar 22 11:48:44 2006 +0100 + + SVG: return len in _cairo_svg_document_write when operation succeed. + + src/cairo-svg-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ef04471b1b90057c00ec51e1f3d7c7ed4ab1e34c +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Mar 18 18:08:20 2006 +0100 + + More consistent naming for the BeOS surface functions + + src/cairo-beos-surface.cpp | 44 ++++++++++++++++++++++---------------------- + 1 file changed, 22 insertions(+), 22 deletions(-) + +commit 69acfa6576e8d2b97e3e3b8c06badf5486ae0315 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Mar 17 21:26:27 2006 +0100 + + Don't link to C++ libraries on non-BeOS systems + + src/Makefile.am | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 0623f8a7d1452c27892f938fe28e6e173e67e136 +Merge: 26b06b3 a7f58f8 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 15:25:59 2006 -0500 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo + +commit 26b06b3638ec768da01839cfa3c75e9807b14ee8 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 15:17:26 2006 -0500 + + Clarify that git tag -s does GPG signing. + (cherry picked from e94251861565ed154e15ca3a7198ffe3828536fe commit) + + RELEASING | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit f5013b6dc6442493ea38949fdcc137e5c44b6872 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 14:19:08 2006 -0500 + + Add a release-publish-message target to only get the message. + (cherry picked from 98facc6c2d0f57f05de7b98c2aaa592c895d1a09 commit) + + Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 46e5ed66d3329f1608950d817e7248c91087893a +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 11:25:02 2006 -0500 + + Note using "git diff" instead of "git status" as the latter is a bit tricky when it says nothing to commit... + (cherry picked from a1621eadb655806de8bb47c2e701de6eaa9d2090 commit) + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f00a1833341699135e792e3a77e19dca0d1dba86 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 11:18:40 2006 -0500 + + Update release infra to reflect git transition. + (cherry picked from 508b0be5f2023dabe9561f4ca62481d6a4c8c5ae commit) + + INSTALL | 2 +- + Makefile.am | 4 ++-- + RELEASING | 21 +++++++++------------ + configure.in | 2 +- + 4 files changed, 13 insertions(+), 16 deletions(-) + +commit 037732cac9ff402e51d80d6ed54cc32d669aa0d9 +Author: Behdad Esfahbod <behdad@home.(none)> +Date: Wed Mar 15 10:59:59 2006 -0500 + + Add make bits to autogenerate ChangeLog + (cherry picked from 393000021c2e082d4b3c235939009a90035b0daf commit) + + .gitignore | 1 + + Makefile.am | 39 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 40 insertions(+) + +commit a7f58f886253f4ae66c9b0ed4472f575eaf2ec1d +Author: Alexander Larsson <alexl@redhat.com> +Date: Wed Mar 15 10:44:09 2006 -0800 + + Add LZW image compression and ASCII85 encoding for PostScript image output. + + * src/Makefile.am: + Add cairo-lzw.c to sources + Remove erronous space at start of line + + * src/cairo-lzw.c: + New file implementing _cairo_compress_lzw which does Lempel-Ziv & Welch + compression as used by postscript. Based on code from libtiff. + + * src/cairo-output-stream.c: + Add _cairo_output_stream_write_base85_string which implements + an encoder for the ASCII85Decode postscript filter. + + * src/cairoint.h: + Add _cairo_compress_lzw and _cairo_output_stream_write_base85_string. + + * src/cairo-ps-surface.c: + Write Images LZW + Base85 encoded. + Change ps level to 2 (we only needed level 3 for FlateDecode). + Change DocumentData to Clean7Bit as we don't include binary data + anymore. + + src/Makefile.am | 3 +- + src/cairo-lzw.c | 499 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-output-stream.c | 63 ++++++ + src/cairo-ps-surface.c | 37 +--- + src/cairoint.h | 10 + + 5 files changed, 582 insertions(+), 30 deletions(-) + +commit d6f8df7417bdab75dbcfe9658616dd3367276ed0 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 15 07:31:48 2006 -0800 + + Remove annoyinc RCS magic lines that are not being used, but cause conflicts. + + pixman/src/fbedge.c | 2 -- + pixman/src/fbedgeimp.h | 2 -- + pixman/src/fbpict.c | 2 -- + pixman/src/fbpict.h | 2 -- + pixman/src/icpixels.c | 2 -- + pixman/src/ictrap.c | 2 -- + pixman/src/pixman.h | 2 -- + pixman/src/pixregionint.h | 2 -- + pixman/src/renderedge.c | 2 -- + pixman/src/renderedge.h | 2 -- + 10 files changed, 20 deletions(-) + +commit 2af29f720faac0a9ee3961a81b81acae9a716220 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Mar 14 23:02:39 2006 +0100 + + SVG: use xmlOutputBuffer for file creation, instead of dumping xml tree in a memory buffer. + + src/cairo-svg-surface.c | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +commit 5d89faf6b37bb0367c8ba8f8637fc80bd745c888 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 13 13:20:29 2006 -0800 + + fbCompositeTrans_0888xnx0888: Fix suspicious logical negation of pointer value. + + Surely, the ! instead of ~ here was just a typo. I'd feel better if I + had a failing test case for this though, (time to break out gcov + again). + + Fixes bug #6185: + + Strange pointer operations in fbCompositeTrans_0888xnx0888 (pixman/src/fbpict.c) + https://bugs.freedesktop.org/show_bug.cgi?id=6185 + + pixman/src/fbpict.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6f0d8eedc504e8af2224c502be25dc82b5df70f4 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 13 12:25:25 2006 -0800 + + _clip_and_composite_trapezoids: Avoid NULL pointer dereference due to OOM. + + This closes bug #6197: + + Null pointer dereference on OOM in _clip_and_composite_trapezoids() + https://bugs.freedesktop.org/show_bug.cgi?id=6197 + + src/cairo-surface-fallback.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 79075b2cb1ce1397506fc10572df96f6fd00ecc3 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 13 12:20:23 2006 -0800 + + cairo-clip: Fix memory leak during OOM handling. + + This closes bug #6196: + + Memory leak in _cairo_clip_intersect_path (src/cairo-clip.c) + https://bugs.freedesktop.org/show_bug.cgi?id=6196 + + src/cairo-clip.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit fc51a78a1ed5f7649ce55ab30fc42939a9b295d1 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 13 12:14:47 2006 -0800 + + cairo-pdf-surface: Close memory leak during OOM handling. + + This fixes bug #6186: + + Memory leak in emit_image_rgb_data (src/cairo-pdf-surface.c) + https://bugs.freedesktop.org/show_bug.cgi?id=6186 + + src/cairo-pdf-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 25cccaaa1f6d337a1a0423a298f94456e72a820a +Merge: c780f4a 118f71b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 13 12:05:37 2006 -0800 + + Merge branch 'cairo-origin' into cairo + +commit c780f4a5624f27a6cbf7829e10e8cd3544ae4f38 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 13 12:05:13 2006 -0800 + + cairo-output-stream: Don't dereference a NULL pointer due to OOM. + + This close bug #6176: + + Null pointer dereference on OOM in _cairo_output_stream_create_for_file() + https://bugs.freedesktop.org/show_bug.cgi?id=6176 + + src/cairo-output-stream.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 118f71b43870551db520ad56234c650aa4b61296 +Merge: 6659991 92e09ee +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Mar 12 19:30:29 2006 +0100 + + Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo + +commit 66599911e0664afd145975e3afb0f580e6d1bb3c +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Mar 9 22:09:14 2006 +0100 + + Don't duplicate unmodified SVG surfaces + + src/cairo-svg-surface.c | 30 ++++++++++++++++++++++++------ + 1 file changed, 24 insertions(+), 6 deletions(-) + +commit 92e09ee72fdde9059300b2b63d87e2bbd4286605 +Author: Mart Raudsepp <leio@dustbite.net> +Date: Thu Mar 9 08:23:43 2006 -0800 + + Complete the CAIRO_PATTERN_TYPE renaming + + This fixes compilation of the glitz backend, and also fixes missing + renames in win32, atsui, and directfb backends. + + src/cairo-atsui-font.c | 2 +- + src/cairo-directfb-surface.c | 6 +++--- + src/cairo-glitz-surface.c | 14 +++++++------- + src/cairo-win32-surface.c | 4 ++-- + 4 files changed, 13 insertions(+), 13 deletions(-) + +commit 1cffb39ff04bbb29bb070e42c51aa1ae6aaf5a4c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 8 08:16:49 2006 -0800 + + cairo_show_glyphs: Do nothing if num_glyphs == 0 + + src/cairo.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 7563a23921a4d6f9f826a13b42d61f3ba3c31c10 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Mar 5 23:49:38 2006 +0100 + + Fix self-copy test + + src/cairo-svg-surface.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +commit 3333bba82d26a0b11961af3cb5c29c79a1a0d07b +Merge: 62812b2 3370cd6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 3 15:41:14 2006 -0800 + + Merge branch 'show-glyphs-many' into cairo + +commit 3370cd631858cac0fd3ce33c74db3af40991e6f1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 3 15:40:58 2006 -0800 + + _cairo_xlib_surface_old_show_glyphs: Break up rendering into chunks to fit + into X max request length protocol limits. + + This fixes bug #5528: + + _XError from XRenderCompositeText8 + https://bugs.freedesktop.org/show_bug.cgi?id=5528 + (cherry picked from 7d498ca91279a4e793d704c5b878f070be4c878f commit) + + src/cairo-xlib-surface.c | 49 ++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 35 insertions(+), 14 deletions(-) + +commit 34a4ad1e5bca8db34933718db245a232ebe30ce2 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 2 10:32:38 2006 -0800 + + test/show-glyphs-many: New test case to demonstrate bug #5528 + + This demonstrates an Xlib crash when rendering many glyphs. See: + + _XError from XRenderCompositeText8 + https://bugs.freedesktop.org/show_bug.cgi?id=5528 + + for more details. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/show-glyphs-many-ref.png | Bin 0 -> 118 bytes + test/show-glyphs-many-rgb24-ref.png | Bin 0 -> 115 bytes + test/show-glyphs-many.c | 127 ++++++++++++++++++++++++++++++++++++ + 5 files changed, 130 insertions(+) + +commit 62812b25c7f0c11aa6c973b722fa8e1bd088d4b8 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Mar 2 14:54:37 2006 +0100 + + Fix gcc 4.0 signedness warnings + + src/cairo-svg-surface.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 3490ed989672eaf2c08468ba81e3376fa362e41f +Author: Christian Biesinger <cbiesinger@web.de> +Date: Wed Mar 1 19:16:01 2006 +0100 + + Remove trailing comma in enumeration + + This fixes a gcc -pedantic warning and compilation with the xlc compiler. + + src/cairo-meta-surface-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2fb016c75b950b3b1fe077dc349713f61118fd7c +Merge: 8176c93 3490ed9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 1 11:26:48 2006 +0100 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo + +commit 8176c93bc481414c1584bf4721ac1680ed827d97 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 1 11:26:30 2006 +0100 + + Revert "Remove ft-font's usage of device offset surface fields for storing bearings" + + Bogus fix; misunderstood the relationship between the font bearings + and the computed device offsets. Real fix on my device offsets branch. + + This reverts 49b4fe10d0acdf6b9776d2908e98f2f0c596fbe5 commit. + + src/cairo-ft-font.c | 22 +++++++++++++++++++++- + src/cairo-scaled-font.c | 6 +++--- + src/cairo-xlib-surface.c | 4 ++-- + 3 files changed, 26 insertions(+), 6 deletions(-) + +commit e2855502f2f2e701b96a2a7eee4cda8c374bcbb9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 14:10:36 2006 -0800 + + Fix last piece of merge resolution missing from previous commit + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e3017c3c8de2b90e1d3470866f9bd6cc2cd313fa +Merge: ce683a2 2984f60 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 12:07:14 2006 -0800 + + Merge in upstream 'ps-surface' changes + +commit f5566c9b20edf04b44f60bba164c226f2718a935 +Merge: 49b4fe1 d985a9d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 28 16:29:45 2006 +0100 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo + +commit d985a9d6696f1ed653a48d95bc401ede3ba86d5f +Author: Christian Biesinger <cbiesinger@web.de> +Date: Wed Mar 1 00:40:35 2006 +0100 + + Fixing BeOS surface part II + + src/cairo-beos-surface.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 566bb18dfee2daaaaf86e7a22e8a7883e81efd97 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Wed Mar 1 00:06:43 2006 +0100 + + Updating BeOS surface per the get_type changes + + src/cairo-beos-surface.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit a69b3f211654d1f221859f8e7f9608f8030e1ac4 +Author: manu <manu@hobbes.localdomain> +Date: Tue Feb 28 23:44:01 2006 +0100 + + s/CAIRO_PATTERN/CAIRO_PATTERN_TYPE/ + + src/cairo-svg-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 0341305fd2f303a23d10b448ac385a981b8b35fe +Author: manu <manu@hobbes.localdomain> +Date: Tue Feb 28 23:33:00 2006 +0100 + + Revert "Git test" + + This reverts ef1c5c3961c2dff1a48606a45a6c9877924e5f15 commit. + + src/cairo-svg-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit ef1c5c3961c2dff1a48606a45a6c9877924e5f15 +Author: manu <manu@hobbes.localdomain> +Date: Tue Feb 28 22:52:45 2006 +0100 + + Git test + + src/cairo-svg-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 49b4fe10d0acdf6b9776d2908e98f2f0c596fbe5 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 28 16:21:46 2006 +0100 + + Remove ft-font's usage of device offset surface fields for storing bearings + + cairo-ft-font was being naughty and storing glyph bearings in the + surface device_[xy]_offset fields -- this had no effect previously, + because _cairo_surface_composite ignored those fields, but once it + starts handling device offsets itself, this causes ft text rendering + to break. + + src/cairo-ft-font.c | 22 +--------------------- + src/cairo-scaled-font.c | 6 +++--- + src/cairo-xlib-surface.c | 4 ++-- + 3 files changed, 6 insertions(+), 26 deletions(-) + +commit 6fe93cbf5b368a9a6daf54370aa0e7735b411474 +Merge: f2245a7 210dd59 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 02:36:45 2006 -0800 + + Merge branch 'get-type' into cairo + +commit 210dd59a7441424f71658ca248f6657482c74c7e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 02:30:27 2006 -0800 + + Add some basic testing of cairo_font_face_get_type and + cairo_scaled_font_get_type. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/font-face-get-type.c | 64 +++++++++++++++++++++++++++++++++++++++ + test/ft-font-create-for-ft-face.c | 14 +++++++++ + 4 files changed, 81 insertions(+) + +commit bd2136a23f8a3d5f6a1306d18499fdcfc1e87f48 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 01:31:15 2006 -0800 + + Correct copyright date + + test/pattern-get-type.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9534c856a71b0f56a1e5bc58141b7bc192a27e8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 01:30:58 2006 -0800 + + test/pattern-get-type: Add new test case for cairo_pattern_get_type. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/pattern-get-type.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 77 insertions(+) + +commit 1dd6e417c10c90894c87565d4f7fa3f63e97f212 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 28 00:55:27 2006 -0800 + + Add testing for cairo_surface_get_type. + + All test targets now list an expected cairo_surface_type_t. Add notes + on current limitations of PDF/PS/meta-surface support that causes + CAIRO_CONTENT_COLOR similar surfaces of PDF and PS surfaces to be + returned as image surfaces. + + Add cairo_internal_surface_type_t for the meta, paginated, and various + test surfaces. + + src/cairo-paginated-surface.c | 20 +++++++- + src/cairoint.h | 6 ++- + src/test-fallback-surface.c | 1 + + src/test-meta-surface.c | 1 + + test/cairo-test.c | 107 ++++++++++++++++++++++++++++++------------ + 5 files changed, 103 insertions(+), 32 deletions(-) + +commit cd84e2ab32fe4648f9d172cdefe08798336938d2 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 23:15:45 2006 -0800 + + Add documentation for cairo_font_face_get_type, + cairo_scaled_font_get_type, cairo_surface_get_type, and + cairo_pattern_get_type. + + src/cairo-font.c | 6 ++++++ + src/cairo-pattern.c | 6 ++++++ + src/cairo-scaled-font.c | 6 ++++++ + src/cairo-surface.c | 6 ++++++ + 4 files changed, 24 insertions(+) + +commit 5797f814852bb4f6ef559890640b8cd24ec5fa45 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 23:12:43 2006 -0800 + + Implement cairo_pattern_get_type + + src/cairo-pattern.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 5ae0b9f912b7f5fd1700cbf18763a05493f55b62 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 23:11:32 2006 -0800 + + Implement cairo_surface_get_type + + src/cairo-directfb-surface.c | 1 + + src/cairo-glitz-surface.c | 1 + + src/cairo-image-surface.c | 1 + + src/cairo-meta-surface.c | 1 + + src/cairo-paginated-surface.c | 5 +++++ + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-surface.c | 15 +++++++++++++++ + src/cairo-svg-surface.c | 1 + + src/cairo-win32-surface.c | 1 + + src/cairo-xcb-surface.c | 1 + + src/cairo-xlib-surface.c | 1 + + src/cairoint.h | 12 ++++++++++++ + 13 files changed, 42 insertions(+) + +commit 2984f60a3a4571a8d4179fdc64a9e67ce9854f21 +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 20:09:24 2006 -0800 + + Need cairo_analyze_surface_get_extents + + src/cairo-analyze-surface.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 9ca67992a5816db49e8dca866816481483896814 +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 20:05:57 2006 -0800 + + Support meta surface patterns + + src/cairo-paginated-surface.c | 11 ++++++++++- + src/cairo-ps-surface.c | 39 ++++++++++++++++++++++++++------------- + 2 files changed, 36 insertions(+), 14 deletions(-) + +commit ad247974ebcfc5ede9fd3856eeaee4860318d118 +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 19:34:32 2006 -0800 + + Release pattern source image when done with it + + src/cairo-ps-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 59e4a32d550d14cfaa0687e716c7df0cadf56adc +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 19:23:47 2006 -0800 + + Primitive ps glyph support. Fix ps strokes to not leave path defined + + src/cairo-ps-surface.c | 52 +++++++++++++++++++++++++++++++++++++++++++++---- + src/cairo-scaled-font.c | 2 +- + src/cairoint.h | 2 +- + 3 files changed, 50 insertions(+), 6 deletions(-) + +commit 06b83b89fc4271060c63b284d7909162b92152f1 +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 17:49:53 2006 -0800 + + Support image surface patterns + + src/cairo-ps-surface.c | 39 +++++++++++++++++++++++++++++++-------- + 1 file changed, 31 insertions(+), 8 deletions(-) + +commit 1769830e6eea08744830c1c7ea9220d56808831a +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 17:22:45 2006 -0800 + + Implement cairo_scaled_font_get_type + + src/cairo-atsui-font.c | 1 + + src/cairo-ft-font.c | 1 + + src/cairo-scaled-font.c | 6 ++++++ + src/cairo-win32-font.c | 1 + + src/cairoint.h | 2 ++ + 5 files changed, 11 insertions(+) + +commit f2245a7932b857ff70dc0476490090d906ae61f8 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 17:07:22 2006 -0800 + + Remove unused RCS $Id:$ tags. + + src/cairo-wideint.c | 3 +-- + src/cairo-wideint.h | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit ce683a240236fbe8083f284195acf0f78aa05048 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 15:12:15 2006 -0800 + + Drop gratuitous structure with single function pointer. Rename + paginated_set_mode to set_paginated_mode. + + src/cairo-paginated-surface-private.h | 10 +++------- + src/cairo-paginated-surface.c | 12 ++++++------ + src/cairo-ps-surface.c | 31 +++++++++++++++---------------- + 3 files changed, 24 insertions(+), 29 deletions(-) + +commit aecb07a26d1db73cf6eee183de0f77615dea6830 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 14:58:51 2006 -0800 + + cairo_analysis_surface: Rename region_[un]supported() to get_[un]supported(). + + src/cairo-analysis-surface-private.h | 4 ++-- + src/cairo-analysis-surface.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2660e79e674a55e71014f83e9247372edd9ab531 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 27 14:56:41 2006 -0800 + + Rename cairo_analyze_surface_t to cairo_analysis_surface_t. + + src/Makefile.am | 6 +- + src/cairo-analysis-surface-private.h | 55 ++++++++ + src/cairo-analysis-surface.c | 246 +++++++++++++++++++++++++++++++++++ + src/cairo-analyze-surface-private.h | 55 -------- + src/cairo-analyze-surface.c | 246 ----------------------------------- + src/cairo-paginated-surface.c | 18 +-- + 6 files changed, 313 insertions(+), 313 deletions(-) + +commit f9d4482137e7f13e634cc578c64d84ffdea16bca +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 17:14:57 2006 -0500 + + rename evaluate surface to analyze surface, pull to separate files + + src/Makefile.am | 2 + + src/cairo-analyze-surface-private.h | 55 ++++++++ + src/cairo-analyze-surface.c | 246 ++++++++++++++++++++++++++++++++++ + src/cairo-paginated-surface-private.h | 2 +- + src/cairo-paginated-surface.c | 210 ++--------------------------- + src/cairo-ps-surface.c | 10 +- + 6 files changed, 319 insertions(+), 206 deletions(-) + +commit cb3a445150e3771d23854849c2a1c991eaee712c +Author: Keith Packard <keithp@evo.keithp.com> +Date: Mon Feb 27 19:47:14 2006 +0100 + + Primitive "real" postscript output for stroke/fill/paint + + src/cairo-paginated-surface-private.h | 15 +- + src/cairo-paginated-surface.c | 241 ++++++++++++++++- + src/cairo-pdf-surface.c | 3 +- + src/cairo-ps-surface.c | 470 ++++++++++++++++------------------ + 4 files changed, 467 insertions(+), 262 deletions(-) + +commit 1a1441912604c89e2912ec764fe26b7a9db995a3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Feb 17 23:37:54 2006 -0800 + + Win32: Handle BitBlt in get_image failure and AlphaBlend not being supported + + If the BitBlt in get_image fails, we pretty much can't do anything -- so + fill the destination with white and hope for the best. This enables + somewhat accurate printing of complex operations. Also, check the + destination device caps before calling AlphaBlend; return UNSUPPORTED if + the destination DC can't do AlphaBlend. + (cherry picked from 9831de538e347a624af5b0ca38242b198b64bd45 commit) + + src/cairo-win32-surface.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit 2d784815ffac1ca8c10dac12525f2e8d0b412c1a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Feb 17 23:34:51 2006 -0800 + + Win32: Set surface format based on device caps + + If the DC is a display DC, inspect its depth and set out local format + appropriately. If it's not a display DC, assume RGB24. + (cherry picked from 6dd0a70d271f93df95f4bcaff5073b9bf90cecb6 commit) + + src/cairo-win32-surface.c | 27 +++++++++++++++++++++++++-- + 1 file changed, 25 insertions(+), 2 deletions(-) + +commit 68ed40b6da242816a43cd68cc2c7feb779cf0acf +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Feb 17 23:24:06 2006 -0800 + + Win32: Fix up src coords before calling AlphaBlend/BitBlt to avoid invalid calls + + Fixes up src coords and width/height before calling AlphaBlend/BitBlt; it's + an error to try to use a region that extents outside of the source surface + as a source DC. + + Doesn't repair the extra region relative to the operator -- e.g. regions + outside of an ARGB source surface with SOURCE operator should be cleared + to fully transparent black in the destination. + (cherry picked from bc19c5b64b0e38e9d20045907d7b47d79f6afc60 commit) + + src/cairo-win32-surface.c | 31 +++++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +commit 0852cd449259eb9a52bfa63f19428c47c78baf91 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 27 12:49:27 2006 +0100 + + Win32: rename cairo_surface_create_dib to cairo_surface_create_with_dib + + Also adds some documentation for the win32 creation functions. + (cherry picked from 3a148bd620d709237d98a72f65118759bfc5a76d commit) + + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 55 +++++++++++++++++++++++++++++------------------ + src/cairo-win32.h | 6 +++--- + 3 files changed, 38 insertions(+), 25 deletions(-) + +commit 0fe8a93d95ab0b2235133fa089be8ec99d1a5248 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Feb 17 23:17:23 2006 -0800 + + Win32: expose win32 DIB (image) surface creation function, and DC getter + + Adds cairo_win32_surface_create_dib() for creating a win32 DIB-backed + surface with a particular format. Also exposes + cairo_win32_surface_get_dc() to obtain the DC of a win32 surface. + (cherry picked from 0813a1b9b6f35d786fe8cb0d4748771023956cde commit) + + src/cairo-win32-font.c | 2 +- + src/cairo-win32-private.h | 5 ----- + src/cairo-win32-surface.c | 31 ++++++++++++++++++++++++++++--- + src/cairo-win32.h | 8 ++++++++ + 4 files changed, 37 insertions(+), 9 deletions(-) + +commit f4b34df6b6c07024a1b552236d8e0db959771b15 +Author: Vladimir Vukicevic <vladimir@h-216.office.mozilla.org> +Date: Wed Feb 15 13:14:52 2006 -0800 + + Have mark_dirty always invalidate the last clip set on the surface + + mark_dirty will force cairo to set its own clip the next time the cairo clip + is applied after mark_dirty; otherwise we run the risk of cairo's cached + clip and the device clip getting out of sync if any clip-related functions + are used on the native device back-end. + (cherry picked from 1935a28949da8569f924e37714ec19571fa95987 commit) + (cherry picked from ef8b472f0ffab7b8b828d7297c7e454bb22bd5ec commit) + + src/cairo-surface.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +commit e0f4eecb91c8f7f09ef4977703d4ca21b06797a9 +Author: Vladimir Vukicevic <vladimir@h\-216.office.mozilla.org> +Date: Wed Feb 15 12:43:01 2006 -0800 + + Win32: Rework clip and extents handling + + - Save extents at surface creation and always return these + - Simplify clipping paths + (cherry picked from a67722b3d7280e6c2375778c2d46556cca261bfc commit) + (cherry picked from 7ce09732a978749a4da814feb77f50161dc42c91 commit) + + src/cairo-win32-private.h | 2 +- + src/cairo-win32-surface.c | 92 ++++++++++++++++++----------------------------- + 2 files changed, 36 insertions(+), 58 deletions(-) + +commit f6b4fabaf59227d6cafcdd7e27cf0d8e26b4eeb8 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 14 11:55:00 2006 -0800 + + Misc compilation fixes (C++-style comments, M_PI decls, etc.) + (cherry picked from d0cc56b9a24fa59febc15ac5de073da0e785e1cc commit) + (cherry picked from a6a054abe45287eb950c294e20366594313138f5 commit) + + pixman/src/fbcompose.c | 8 ++++++++ + pixman/src/pixregion.c | 6 +++--- + src/cairo-atsui-font.c | 10 ++++++++++ + src/cairoint.h | 4 ++++ + 4 files changed, 25 insertions(+), 3 deletions(-) + +commit dba214b944a16dd7ee781f495cd5fbe83f678451 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Feb 26 10:46:04 2006 +0100 + + Use C-style comments rather than C++-style + + pixman/src/fbcompose.c | 4 ++-- + pixman/src/pixman-xserver-compat.h | 2 +- + src/cairo-atsui-font.c | 23 ++++++++++++----------- + src/cairo-directfb-surface.c | 2 +- + src/cairo-quartz-surface.c | 11 ++++++----- + 5 files changed, 22 insertions(+), 20 deletions(-) + +commit 5a3c30eafe0b77f69434e139a2e247c8eb4230d7 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 24 15:32:26 2006 -0800 + + Implement cairo_font_face_get_type. + + Add font type to font_face_backend. + Also export new CAIRO_FONT_TYPE_TOY. + + src/cairo-atsui-font.c | 1 + + src/cairo-font.c | 7 +++++++ + src/cairo-ft-font.c | 1 + + src/cairo-win32-font.c | 1 + + src/cairo.h | 1 + + src/cairoint.h | 3 +++ + 6 files changed, 14 insertions(+) + +commit 5928d03b496420b2d0a89cf8e2d294081a60cc67 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 24 15:25:19 2006 -0800 + + Remove private cairo_pattern_type in favor of new public one. Rename + all values to now include TYPE. Drop _GRADIENT from LINEAR and RADIAL. + + src/cairo-meta-surface.c | 2 +- + src/cairo-pattern.c | 68 ++++++++++++++++++++++---------------------- + src/cairo-pdf-surface.c | 10 +++---- + src/cairo-ps-surface.c | 26 ++++++++--------- + src/cairo-surface-fallback.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo.h | 12 ++++---- + src/cairoint.h | 7 ----- + 8 files changed, 61 insertions(+), 68 deletions(-) + +commit f58f39d7afee8d8a663569f149651c789aa95da8 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 24 15:06:50 2006 -0800 + + cairo.h: Fix typo (thanks to Torsten Schoenfeld) + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2fc9fd79e794129b26cc8f9b62a5aa4604cb99d9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 24 11:37:50 2006 -0800 + + cairo.h: Fix two typos in the documentation. + + src/cairo.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9287d60d60f55ae3838a7cecfa9fa04a5f95e8de +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 24 11:24:03 2006 -0800 + + Add get_type functions: cairo_surface_get_type, + cairo_pattern_get_type, cairo_font_face_get_type, and + cairo_scaled_font_get_type. + + src/cairo-surface.c | 3 +- + src/cairo.h | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 134 insertions(+), 3 deletions(-) + +commit d0e02a948e83e3b1b330c9cb0aa4930b42bf485c +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 24 09:18:17 2006 -0800 + + autogen.sh: Pass --foreign option to automake so that it doesn't + complain that ChangeLog does not exist. + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb778760cb87e727a701603bcea3a2cdc063d785 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 23 22:07:13 2006 -0800 + + cairo_close_path: Document that there will be a current point after + cairo_close_path. + + src/cairo.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 1dc1b57b4eaa55b7a5cafe39f818f7c87352ea6d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 23 22:01:07 2006 -0800 + + cairo_new_sub_path: Making cairo_arc easier to use and more. + + This adds a new function which has as its only effect the elimination + of + the current point. This makes it much easier to use the various + cairo_arc calls when the initial line_to is not actually desired. + + This function also unifies and generalizes the long-existing behavior + of cairo_line_to being treated as cairo_move_to when there is no + current point. With the addition of cairo_new_sub_path this becomes a + documented feature with similar behavior in cairo_curve_to as well. + + .gitignore | 1 + + src/cairo-path-stroke.c | 24 +++--------- + src/cairo-path.c | 40 +++++++++++++++----- + src/cairo-pdf-surface.c | 48 ++++++------------------ + src/cairo-ps-surface.c | 53 ++++++++------------------- + src/cairo-svg-surface.c | 17 +-------- + src/cairo.c | 60 ++++++++++++++++++++++++++---- + src/cairo.h | 3 ++ + src/cairoint.h | 3 ++ + test/.gitignore | 1 + + test/Makefile.am | 4 ++ + test/new-sub-path-ref.png | Bin 0 -> 386 bytes + test/new-sub-path-rgb24-ref.png | Bin 0 -> 355 bytes + test/new-sub-path.c | 79 ++++++++++++++++++++++++++++++++++++++++ + 14 files changed, 209 insertions(+), 124 deletions(-) + +commit 0354956a09cf5a45feed256c1d880bbb9b7c7c42 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 23 20:45:30 2006 -0800 + + Remove ChangeLog as it is no longer maintained as a separate file (instead it is implicitly generated) + + ChangeLog | 13825 ------------------------------------------------------------ + 1 file changed, 13825 deletions(-) + +commit 07205ddc4b3f7ee0416e487fffcf59d324d18bfe +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Feb 24 00:04:05 2006 +0100 + + Mark private functions as cairo_private + (cherry picked from a1c72cd8f244e97d4b6fe3e5d3efa622c8b3f7f9 commit) + + src/cairo-paginated-surface-private.h | 2 +- + src/cairoint.h | 14 +++++++------- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit b2912241f63bf3f8ee14ab4309fc820afdf33e1c +Author: Christian Biesinger <chb@neuromancer.(none)> +Date: Tue Feb 21 21:00:48 2006 +0100 + + Add missing gradient functions to pixman-remap.h + + pixman/src/pixman-remap.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0fc25c9853441f1fc2e49e7c77dbf9a99f590868 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Feb 18 21:45:58 2006 +0100 + + Don't call _cairo_error when returning an error + + Only return it when returning a nil surface. + + src/cairo-beos-surface.cpp | 26 +++++++------------------- + 1 file changed, 7 insertions(+), 19 deletions(-) + +commit 5c5ea6d5233a669f6a7dff57ed0afba01131b7b5 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Feb 18 19:36:18 2006 +0100 + + Fix typo. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f4d9e5596258284fa7fef01c91ad854544e2b9a2 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Thu Feb 16 23:37:16 2006 +0100 + + Use TRUE/FALSE instead of 1/0 for boolean values + (cherry picked from e1703520169e0cf972a6edcaa8660d14806d8c6f commit) + + src/cairo-xcb-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 57edf3f28fa09d2ec24d85dcc91a220d901a4452 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Thu Feb 16 09:05:52 2006 -0800 + + Normalize indentation after previous commit. + + src/cairo-ft-font.c | 312 ++++++++++++++++++++++++++-------------------------- + 1 file changed, 155 insertions(+), 157 deletions(-) + +commit 0152bd3a562442853ab930eaea316c08b34f6ba6 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Thu Feb 16 09:02:29 2006 -0800 + + Allow _get_bitmap_surface to work for 0x0 glyphs, (fix for bug #5734). + + Patch from: Behdad Esfahbod <freedesktop@behdad.org> + Reviewed by: Carl Worth <cworth@cworth.org> + + src/cairo-ft-font.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit f12aa15466844b67ec22544c4feee17389ba4aeb +Author: Carl Worth <cworth@raht.cworth.org> +Date: Wed Feb 15 16:50:57 2006 -0800 + + Add Mozilla patches to ROADMAP + + ROADMAP | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit fd9566ebd921f1d5b06ac25d466e15f28fd3112b +Author: Carl Worth <cworth@raht.cworth.org> +Date: Wed Feb 15 16:36:12 2006 -0800 + + Slip 1.2.0 release date out to 2006-03-08 + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 32ec3ccf1729fbf6da73924238e4a30f1975bbd2 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Wed Feb 15 15:40:41 2006 -0800 + + Annoying churn of tmpl file. (We really need to get all of these built files out of version control.) + + doc/public/tmpl/cairo-beos.sgml | 19 ------------------- + 1 file changed, 19 deletions(-) + +commit d88c19071f6748b190cb17e6724b67705863a9b0 +Author: Carl Worth <cworth@raht.cworth.org> +Date: Wed Feb 15 15:00:26 2006 -0800 + + Rename .cvsignore to .gitignore. Add *~ and *.o. + + .cvsignore | 20 ------- + .gitignore | 24 +++++++++ + doc/.cvsignore | 2 - + doc/.gitignore | 3 ++ + doc/public/.cvsignore | 16 ------ + doc/public/.gitignore | 17 ++++++ + doc/public/tmpl/.cvsignore | 1 - + doc/public/tmpl/.gitignore | 3 ++ + doc/tutorial/slides/.cvsignore | 7 --- + doc/tutorial/slides/.gitignore | 7 +++ + doc/tutorial/src/.cvsignore | 7 --- + doc/tutorial/src/.gitignore | 8 +++ + pixman/.cvsignore | 19 ------- + pixman/.gitignore | 20 +++++++ + pixman/src/.cvsignore | 8 --- + pixman/src/.gitignore | 10 ++++ + src/.cvsignore | 11 ---- + src/.gitignore | 13 +++++ + test/.cvsignore | 114 ---------------------------------------- + test/.gitignore | 116 +++++++++++++++++++++++++++++++++++++++++ + 20 files changed, 221 insertions(+), 205 deletions(-) + +commit f4270b3dfc5e6905c58adb2f6b5d9a049dc616fa +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Feb 13 14:11:36 2006 +0000 + + convert _cairo_svg_surface_old_show_glyphs to _cairo_svg_surface_show_glyphs. + + ChangeLog | 5 +++++ + src/cairo-svg-surface.c | 22 ++++++++-------------- + 2 files changed, 13 insertions(+), 14 deletions(-) + +commit 921dcc16f980fcf9a8df4c193720e8ec1e53f1dd +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Feb 13 12:41:10 2006 +0000 + + Add mask support and switch to SVG 1.2 for compositing operators. + return xml node instead of cairo status. (emit_composite_svg_pattern): ditto. (emit_composite_pattern): ditto. (emit_operator): use SVG 1.2 operators, since feComposite filter always composite resulting surface to current canvas. (_cairo_svg_surface_composite): removed. (_cairo_svg_surface_fill_rectangles): removed. (intersect): removed. (_cairo_svg_surface_composite_trapezoids): removed. (emit_paint): new. (_cairo_svg_surface_paint): new. (_cairo_svg_surface_mask): new. (_cairo_svg_surface_stroke): emit operator. + + ChangeLog | 19 ++++ + src/cairo-svg-surface.c | 294 ++++++++++++++---------------------------------- + 2 files changed, 105 insertions(+), 208 deletions(-) + +commit 8ff1866724a8c82a3332db828ffada4ebd4ca144 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Feb 11 12:57:56 2006 +0000 + + Adds the BeOS surface functions to the list of functions for which to generate documentation. + + ChangeLog | 10 ++++++++++ + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 7 +++++++ + doc/public/language-bindings.xml | 1 + + doc/public/tmpl/cairo-beos.sgml | 38 ++++++++++++++++++++++++++++++++++++++ + 5 files changed, 57 insertions(+) + +commit 9c05d2aab15b589197436af5287ae9297c0314bd +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Feb 2 12:47:58 2006 +0000 + + fix filename. + shh! + + ChangeLog | 5 +++++ + test/.cvsignore | 4 ++-- + test/cairo-test.c | 2 +- + 3 files changed, 8 insertions(+), 3 deletions(-) + +commit be7b6251f3ff6b86df3456fad561f4c0acb3c3ab +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Jan 29 13:25:10 2006 +0000 + + fix offset of pattern stops. + + ChangeLog | 5 +++++ + src/cairo-svg-surface.c | 6 ++---- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit d157e1fcd5f74e51587fc9eb342ce38ccbf73433 +Author: Keith Packard <keithp@keithp.com> +Date: Wed Jan 25 19:17:34 2006 +0000 + + Make watermark consistently translucent Use fill for dung outline Fix text locations + + ChangeLog | 12 +++++ + doc/tutorial/slides/cairo-code.svg | 4 +- + doc/tutorial/slides/cairo-large-content.svg | 2 +- + doc/tutorial/slides/cairo-separator.svg | 8 +-- + doc/tutorial/slides/cairo-title.svg | 4 +- + doc/tutorial/slides/cairo.svg | 79 ++++++++++++----------------- + 6 files changed, 54 insertions(+), 55 deletions(-) + +commit 3bcaab9fe1cd05ace2073922975d07f6fb01a20f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 25 15:34:30 2006 +0000 + + Add a CONTROL-Q keybinding to quit. + + ChangeLog | 5 +++++ + doc/tutorial/src/include/cairo-tutorial-gtk.h | 17 +++++++++++++++++ + 2 files changed, 22 insertions(+) + +commit 29479a8b12e3f2575de6ef899142dcd0cd8e21a4 +Author: Keith Packard <keithp@keithp.com> +Date: Wed Jan 25 15:29:25 2006 +0000 + + Adopt proposed new cairo color scheme. Recolor scarab, eliminate gradient in dung Use new blue background color. Rework font sizes, use bold for titles. Change tutorial title. + reviewed by: cworth + + ChangeLog | 17 + + doc/tutorial/slides/cairo-blank.svg | 22 +- + doc/tutorial/slides/cairo-code.svg | 114 ++++-- + doc/tutorial/slides/cairo-large-content.svg | 102 +++-- + doc/tutorial/slides/cairo-separator.svg | 97 +++-- + doc/tutorial/slides/cairo-title.svg | 563 +++++++++++++++++++++++++++- + doc/tutorial/slides/cairo.svg | 113 ++++-- + doc/tutorial/slides/tutorial.xml | 4 +- + 8 files changed, 869 insertions(+), 163 deletions(-) + +commit 2d2c5fd5b003d681b57380a5d11ffc4dd3903b35 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 25 14:31:17 2006 +0000 + + Shrink the font size to make the tutorial instructions fit. + Format text to solve all problematic line wrapping. + Add my name to the README. + + ChangeLog | 10 +++++ + doc/tutorial/slides/cairo-blank.svg | 2 +- + doc/tutorial/slides/tutorial.xml | 89 +++++++++++++++++++------------------ + doc/tutorial/src/README | 4 +- + 4 files changed, 58 insertions(+), 47 deletions(-) + +commit dc64fcc68ccbe92392a88167e83cc5994f69cf66 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 25 10:22:32 2006 +0000 + + Move the magic header files to be down in an include directory and more out of the way. + Look for the headers in -I./include. + Make the circle track the width and height of the window dynamically. + Remove boring expander example. + Add more interesting LCA exmaple. + Add some notes about how to use this stuff. + + ChangeLog | 28 +++ + doc/tutorial/src/Makefile | 12 +- + doc/tutorial/src/README | 66 +++++++ + doc/tutorial/src/cairo-tutorial-gtk.h | 116 ------------ + doc/tutorial/src/cairo-tutorial-pdf.h | 74 -------- + doc/tutorial/src/cairo-tutorial-png.h | 74 -------- + doc/tutorial/src/cairo-tutorial-xlib.h | 219 --------------------- + doc/tutorial/src/cairo-tutorial.h | 41 ---- + doc/tutorial/src/circle.c | 13 +- + doc/tutorial/src/expander.c | 13 -- + doc/tutorial/src/include/cairo-tutorial-gtk.h | 116 ++++++++++++ + doc/tutorial/src/include/cairo-tutorial-pdf.h | 74 ++++++++ + doc/tutorial/src/include/cairo-tutorial-png.h | 74 ++++++++ + doc/tutorial/src/include/cairo-tutorial-xlib.h | 251 +++++++++++++++++++++++++ + doc/tutorial/src/include/cairo-tutorial.h | 41 ++++ + doc/tutorial/src/lca.c | 32 ++++ + 16 files changed, 696 insertions(+), 548 deletions(-) + +commit 9abe21ac70e0d1ae75397f40455f1d55fc5b5018 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 25 08:41:14 2006 +0000 + + Here's the actual template I was referring to in my previous commit. + Add a bunch more slides. Most of the text is in place now---just missing some formatting and a bunch of examples. + + ChangeLog | 9 + + doc/tutorial/slides/cairo-large-content.svg | 855 ++++++++++++++++++++++++++++ + doc/tutorial/slides/tutorial.xml | 434 +++++++------- + 3 files changed, 1084 insertions(+), 214 deletions(-) + +commit 649d8a09187490c68c9b110385f043ceb13a8972 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 25 07:33:56 2006 +0000 + + Add Red Hat logos to slide templates. + Add header/footer-less slide variant for slides needed an extra bit of space. + Start getting slides ready for linux.conf.au 2006 tutorial, updating for cairo 1.0 API, and adding better organization. Verify and fix all the little example shell programs. + Really remove the building of the + -pdf programs this time. + + ChangeLog | 18 ++ + doc/tutorial/slides/cairo-blank.svg | 2 +- + doc/tutorial/slides/cairo-code.svg | 367 ++++++++++++++++++++++++++++++- + doc/tutorial/slides/cairo-separator.svg | 367 ++++++++++++++++++++++++++++++- + doc/tutorial/slides/cairo.svg | 368 +++++++++++++++++++++++++++++++- + doc/tutorial/slides/rendering-model.png | Bin 0 -> 63917 bytes + doc/tutorial/slides/tutorial.xml | 105 ++++++--- + doc/tutorial/src/Makefile | 2 +- + 8 files changed, 1200 insertions(+), 29 deletions(-) + +commit ea9f65b0d4cc88b504a6c104b242477264fef1e7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 25 02:10:23 2006 +0000 + + A few random changes to the slides. + Remove pdf build by default, (since it is disabled by defalt in cairo 1.0.2). + Change draw interface to accept a width and height. + Fix the destroy event handler so that clicking on the window manager's 'close window' button works. + + ChangeLog | 20 ++++++++++++++++++++ + doc/tutorial/slides/tutorial.xml | 29 ++++++++++++++++------------- + doc/tutorial/src/Makefile | 1 + + doc/tutorial/src/cairo-tutorial-gtk.h | 6 +++--- + doc/tutorial/src/cairo-tutorial-pdf.h | 4 ++-- + doc/tutorial/src/cairo-tutorial-png.h | 4 ++-- + doc/tutorial/src/cairo-tutorial-xlib.h | 4 ++-- + doc/tutorial/src/circle.c | 5 +---- + doc/tutorial/src/expander.c | 5 +---- + 9 files changed, 48 insertions(+), 30 deletions(-) + +commit d6ff77c297ebfd97707479d3850f4c2c86f0678f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 22 02:33:26 2006 +0000 + + Add cairo_scaled_font_text_extents. + New function. + Improve documentation. + + ChangeLog | 11 ++++++++++ + src/cairo-scaled-font.c | 55 +++++++++++++++++++++++++++++++++++++++++++++---- + src/cairo.h | 5 +++++ + 3 files changed, 67 insertions(+), 4 deletions(-) + +commit bfc2b49ad921c62a36154dd761ebca7490a57d9f +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Jan 21 11:54:17 2006 +0000 + + Updating BeOS reference images, the tests use a black background now. + + ChangeLog | 13 +++++++++++++ + test/mask-beos-rgb24-ref.png | Bin 73512 -> 71028 bytes + test/mask-beos_bitmap-argb32-ref.png | Bin 87641 -> 87641 bytes + test/mask-beos_bitmap-rgb24-ref.png | Bin 73512 -> 71028 bytes + test/set-source-beos-rgb24-ref.png | Bin 124 -> 124 bytes + test/set-source-beos_bitmap-rgb24-ref.png | Bin 124 -> 124 bytes + test/trap-clip-beos-rgb24-ref.png | Bin 64729 -> 63088 bytes + test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 64729 -> 63088 bytes + 8 files changed, 13 insertions(+) + +commit 9fe49346354e1785ff83be69bc1b775a41b7960a +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Jan 21 09:46:13 2006 +0000 + + Update BeOS test code per the cairo_format_t -> cairo_content_t changes. + + ChangeLog | 9 +++++++++ + test/cairo-test-beos.cpp | 8 ++++---- + test/cairo-test-beos.h | 4 ++-- + 3 files changed, 15 insertions(+), 6 deletions(-) + +commit 2afe78c0c2c61186d532d3fa5717e295c8c6272b +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Jan 21 09:39:10 2006 +0000 + + Don't mix declarations and code. This makes the code valid ISO C, fixes a gcc -pedantic warning, and unbreaks the build with the compiler Zeta ships with. + + ChangeLog | 11 +++++++++++ + pixman/src/fbpict.c | 6 +++--- + src/cairo-paginated-surface.c | 5 +++-- + test/cairo-test.c | 2 +- + 4 files changed, 18 insertions(+), 6 deletions(-) + +commit f1fd1cc7a9043ae277e4abe421b13812214a3c64 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 20 15:25:54 2006 +0000 + + Add getter functions for cairo_scaled_font_t. + + ChangeLog | 8 +++++ + src/cairo-scaled-font.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo.h | 15 ++++++++++ + 3 files changed, 99 insertions(+), 1 deletion(-) + +commit a6ad853ee1a78585859ed77d5d8707fcfd448eab +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 20 15:15:40 2006 +0000 + + Fix test to use fontconfig properly so that the test no longer fails. Fixes bug #4674. (Thnks to sunmoon1997 for the fix). + + ChangeLog | 6 ++++++ + test/ft-font-create-for-ft-face.c | 24 +++++++++++++++++++----- + 2 files changed, 25 insertions(+), 5 deletions(-) + +commit 13511972b612c322815a2849fa8f812249d71d8e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 20 14:48:07 2006 +0000 + + Check font_face->status and return a nil scaled font if it is in an error state. (Thanks to Christian Biesinger and sunmoon1997 who pointed this out as part of bug #4674). + With this bug fix, the ft-font-create-for-ft-face test fails (as it should) since it is abusing fontconfig. + + ChangeLog | 10 ++++++++++ + src/cairo-scaled-font.c | 5 ++++- + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit 074f886c00d560daec90f1d6f6212ecf923f4d66 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 19 17:48:22 2006 +0000 + + Rip the cairo_content_t argument out of ps/pdf_surface_create as per discussion on cairo mailing list. Instead these surface will behave as if CONTENT_COLOR_ALPHA had been passed (that is, compositing operators will behave as if destination alpha were available). + This also has the benefit of preserving the API that has been in place for PS/PDF surface since the (experimental) stuff in 1.0.0. + Track API change. + Continue testing PS/PDF surfaces in the CAIRO_CONTENT_COLOR mode but do it by rendering to an intermediate similar surface rather than constructing the target surface differently. + + ChangeLog | 29 ++++++++++++++++++++ + src/cairo-pdf-surface.c | 27 ++++--------------- + src/cairo-pdf.h | 2 -- + src/cairo-ps-surface.c | 24 ++--------------- + src/cairo-ps.h | 2 -- + test/cairo-test.c | 71 +++++++++++++++++++++++++++++++++++++++++-------- + test/multi-page.c | 4 +-- + 7 files changed, 98 insertions(+), 61 deletions(-) + +commit 14acc7f132fd90d1ba37ddf7ffe9688261cd587b +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Jan 19 12:44:00 2006 +0000 + + add missing header. Fix #5544. + + ChangeLog | 4 ++++ + test/svg2png.c | 1 + + 2 files changed, 5 insertions(+) + +commit ec45efa57cded99f70e65b23989625243d57eb1e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 18 16:44:19 2006 +0000 + + Fix compilation-breaking typo. + + ChangeLog | 5 +++++ + src/cairo-pdf-surface.c | 6 ++++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit c634e547758aa73d229ed209a8c6e56f06a90d0d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 18 16:40:17 2006 +0000 + + Change documentation to recommend cairo_paint rather than cairo_rectangle;cairo_fill for clearing a surface. + Add documentation. Add a cairo_content_t argument to PDF surface constructors. + Add documentation. Add a cairo_content_t argument to PS surface constructors. + Track changes in PS/PDF surface constructor API. + + ChangeLog | 20 ++++++++++++ + src/cairo-image-surface.c | 4 +-- + src/cairo-pdf-surface.c | 79 ++++++++++++++++++++++++++++++++++++++--------- + src/cairo-pdf.h | 2 ++ + src/cairo-ps-surface.c | 70 +++++++++++++++++++++++++++++++++++------ + src/cairo-ps.h | 2 ++ + test/cairo-test.c | 4 +-- + test/multi-page.c | 4 +-- + 8 files changed, 155 insertions(+), 30 deletions(-) + +commit ba69dfefa793d26805ba2ffb17c67d31f5a99ad1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 18 09:46:42 2006 +0000 + + Fix documentation of cairo_arc which erroneously claimed M_PI radians == 90 degrees to correctly say that M_PI/2.0 radians == 90 degrees. This closes bug #5649 (with thanks to kengruven@gmail.com). + + ChangeLog | 7 +++++++ + src/cairo.c | 4 ++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit b5c5fb613d5d554f6ebb3e1a10dbb1e7038b47c7 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 17 16:59:08 2006 +0000 + + Big change to the test infrastructure and supporting internals. The goal now is to test both a COLOR_ALPHA and a COLOR content for each surface backend, (since the semantics are different and we probably need to support both in each backend. + The PS/PDF backends don't allow a content to be passed in right now, so they fail against the rgb24 tests, but the trivial addition to the constructors will allow them to pass all tests with both content values. + And new constructors (currently internal only) to create an image surface with a cairo_content_t rather than a cairo_format_t. + Add a cairo_content_t argument to the constructor. + Add a cairo_content_t to the constructor and use this content value when constructing intermediate image surfaces in acquire_source, show_page, copy_page, and snapshot. + Add image flattening by compositing over white, as is done in cairo-ps-surface.c. + Track changes to cairo-paginates-surface which now requires a cairo_content_t value (no change to public PS/PDF constructors yet). + Track change in meta-surface and paginated-surface interfaces by now accepting a cairo_content_t rather than a cairo_format_t. + Ignore new output files (argb32 from pdf and ps as well as rgb24 from test-fallback, test-meta, and test-paginated). + Add new utility for flattening PNG images in order to generate the -argbf-ref.png images. + Add image_diff_flattened for comparing flattened output from PS and PDF backend with ARGB reference images by first blending the reference images over white. + Get rid of conditional, format-specific background-color initialization before running tests. Now uses ARGB(0,0,0,0) in all cases. Switch from specifying tests with a format value to specifying tests with a content value. Add support for a 'fake' COLOR_ALPHA_FLATTENED content for testing the PS and PDF output against a flattened version of the argb32 reference images (first blended over white). + Track change in cairo_ps_surface_create (now requires cairo_content_t value). + Adjust tests that draw in default (black) to first paint white so that the results are visible. + Adjust ARGB32 reference images for new white background for changed tests. + Adjust RGB24 reference images for new black background due to changed initialization (and the tests themselves being unchanged). + + ChangeLog | 143 ++++++++++++ + src/cairo-image-surface.c | 31 ++- + src/cairo-meta-surface-private.h | 6 +- + src/cairo-meta-surface.c | 7 +- + src/cairo-paginated-surface-private.h | 1 + + src/cairo-paginated-surface.c | 25 ++- + src/cairo-pdf-surface.c | 87 +++++-- + src/cairo-pdf.h | 6 +- + src/cairo-ps-surface.c | 16 +- + src/cairo-ps.h | 6 +- + src/cairoint.h | 12 + + src/test-fallback-surface.c | 6 +- + src/test-fallback-surface.h | 2 +- + src/test-meta-surface.c | 11 +- + src/test-meta-surface.h | 2 +- + src/test-paginated-surface.c | 17 +- + src/test-paginated-surface.h | 10 +- + test/.cvsignore | 8 + + test/Makefile.am | 3 +- + test/buffer-diff.c | 94 ++++++++ + test/buffer-diff.h | 7 + + test/cairo-test.c | 287 +++++++++++++++--------- + test/caps-joins-ref.png | Bin 1262 -> 1488 bytes + test/caps-joins.c | 6 + + test/caps-sub-paths-ref.png | Bin 164 -> 197 bytes + test/caps-sub-paths.c | 6 + + test/clip-fill-rule-pixel-aligned-rgb24-ref.png | Bin 194 -> 184 bytes + test/clip-fill-rule-rgb24-ref.png | Bin 495 -> 380 bytes + test/clip-nesting-rgb24-ref.png | Bin 846 -> 955 bytes + test/clip-operator-rgb24-ref.png | Bin 20991 -> 16507 bytes + test/clip-twice-rgb24-ref.png | Bin 1278 -> 1120 bytes + test/dash-caps-joins-ref.png | Bin 2347 -> 3219 bytes + test/dash-caps-joins.c | 6 + + test/dash-offset-negative-ref.png | Bin 155 -> 171 bytes + test/dash-offset-negative.c | 6 + + test/fill-and-stroke-rgb24-ref.png | Bin 299 -> 257 bytes + test/fill-rule-rgb24-ref.png | Bin 2320 -> 1722 bytes + test/gradient-alpha-rgb24-ref.png | Bin 152 -> 142 bytes + test/leaky-polygon-ref.png | Bin 255 -> 368 bytes + test/leaky-polygon.c | 6 + + test/line-width-ref.png | Bin 171 -> 201 bytes + test/line-width.c | 4 + + test/mask-ctm-rgb24-ref.png | Bin 140 -> 124 bytes + test/mask-rgb24-ref.png | Bin 73292 -> 71069 bytes + test/mask-surface-ctm-rgb24-ref.png | Bin 140 -> 124 bytes + test/multi-page.c | 2 +- + test/nil-surface-rgb24-ref.png | Bin 106 -> 106 bytes + test/operator-clear-rgb24-ref.png | Bin 5677 -> 4218 bytes + test/operator-source-rgb24-ref.png | Bin 16746 -> 14699 bytes + test/paint-with-alpha-rgb24-ref.png | Bin 146 -> 142 bytes + test/path-data-ref.png | Bin 387 -> 579 bytes + test/path-data.c | 6 + + test/png-flatten.c | 77 +++++++ + test/rel-path-rgb24-ref.png | Bin 115 -> 228 bytes + test/scale-source-surface-paint-rgb24-ref.png | Bin 146 -> 136 bytes + test/set-source-rgb24-ref.png | Bin 114 -> 120 bytes + test/show-text-current-point-ref.png | Bin 1606 -> 2411 bytes + test/show-text-current-point.c | 6 + + test/source-surface-scale-paint-rgb24-ref.png | Bin 136 -> 133 bytes + test/text-antialias-gray-ref.png | Bin 740 -> 1084 bytes + test/text-antialias-gray.c | 6 + + test/text-antialias-none-ref.png | Bin 276 -> 298 bytes + test/text-antialias-none.c | 6 + + test/text-pattern-rgb24-ref.png | Bin 2704 -> 2339 bytes + test/transforms-ref.png | Bin 302 -> 361 bytes + test/transforms.c | 6 + + test/trap-clip-rgb24-ref.png | Bin 64728 -> 63087 bytes + test/unbounded-operator-rgb24-ref.png | Bin 7555 -> 6047 bytes + 68 files changed, 756 insertions(+), 174 deletions(-) + +commit 0b48d620f11a1efb611d2ad6888c8e5d8f64db03 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Jan 15 04:44:45 2006 +0000 + + Update BeOS reference images per the recent gradient changes + + ChangeLog | 9 +++++++++ + test/mask-beos-rgb24-ref.png | Bin 73554 -> 73512 bytes + test/mask-beos_bitmap-argb32-ref.png | Bin 87543 -> 87641 bytes + test/mask-beos_bitmap-rgb24-ref.png | Bin 73554 -> 73512 bytes + test/trap-clip-beos-rgb24-ref.png | Bin 64724 -> 64729 bytes + test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 64724 -> 64729 bytes + 6 files changed, 9 insertions(+) + +commit c79cda6150a71846ce546b27f243d858ec5fd037 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sat Jan 14 06:53:43 2006 +0000 + + Ignore glitz-glx test output + + ChangeLog | 4 ++++ + test/.cvsignore | 2 ++ + 2 files changed, 6 insertions(+) + +commit 59eff46fdf201f6269daf5fa101eafdf4f881e30 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 13 13:41:45 2006 +0000 + + Fix things up to conform with Adobe PostScript Document Structuring Conventions Specification. Thanks to Michael Sweet for bringing several items to our attention. Things that are fixed: Add Pages: (atend) to header, add Pages: N to trailer, properly advertise DocumentData of Binary rather than Clean7Bit, remove fictitious EndPage, move showpage to after the grestore. + + ChangeLog | 12 ++++++++++++ + src/cairo-ps-surface.c | 25 +++++++++---------------- + 2 files changed, 21 insertions(+), 16 deletions(-) + +commit 6f3cb04d9c8bb1e72de3b6ea71b475f9457ffcb9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 13 11:02:25 2006 +0000 + + Rip out the misguided paint-with-white and RGB24 surface code and go back to using ARGB32. It turns out that the PS backend already has its own blend-with-white code, and the test-paginated-surface really wants ARGB32. + + ChangeLog | 10 ++++++++++ + src/cairo-paginated-surface.c | 28 ++++------------------------ + 2 files changed, 14 insertions(+), 24 deletions(-) + +commit b4e4568962e53c6b85027165da62b73020ec4586 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 13 09:25:28 2006 +0000 + + Eliminate cast of state->dx.elements which has been wrong since the internals of cairo_array_t changed on 2005-12-21. Now, hopefully less than all text will be broken on win32. + + ChangeLog | 7 +++++++ + src/cairo-win32-font.c | 4 +++- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 4e4b38e75930e3da8c33a02eae77fb736659ff44 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 12 16:47:05 2006 +0000 + + Add a call to cairo_copy_page, so that that gets called at least once within the test suite. + Fix broken implementation of copy_page in the paginated surface by hiding it from the target surface which sees only show_page operations. (It's hard to do better than that unless we can guarantee thathe subsequent page won't trigger any image fallbacks.) + + ChangeLog | 13 +++++++++++++ + src/cairo-paginated-surface.c | 29 ++++++++--------------------- + test/multi-page.c | 20 ++++++++++++++------ + 3 files changed, 35 insertions(+), 27 deletions(-) + +commit 25882cd5e9d51f84338af6278c50d268b3d0091c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 12 16:35:12 2006 +0000 + + Add a new CAIRO_HAS_MULTI_PAGE_SURFACES automake conditional. + Remove backend-specific tests (ps-surface, pdf-surface, and pdf-clip) that are now redundant with the ps and pdf support in the rest of the test suite. + Add a new one-off test for testing show_page with both the ps and pdf backends. + + ChangeLog | 17 ++++++ + configure.in | 2 + + test/.cvsignore | 9 +-- + test/Makefile.am | 21 +++---- + test/multi-page.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + test/pdf-clip.c | 134 ----------------------------------------- + test/pdf-surface.c | 111 ---------------------------------- + test/ps-surface.c | 122 -------------------------------------- + 8 files changed, 199 insertions(+), 387 deletions(-) + +commit 3647ff95f968a68f938fa7cdea9d48880f1064bd +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 12 13:36:36 2006 +0000 + + Some fixes for the fact that multi-page output was totally broken for cairo_ps_surface_t (at least): + Move the Y-axis-flipping to be on a per-page basis (as it was before and as it must be). Put page number back in, (still missing th number of pages from the header). + Add multi-page output for better testing. + + ChangeLog | 20 ++++++++++++++ + src/cairo-ps-surface.c | 72 ++++++++++++++++++++++++++++++++++++-------------- + test/ps-surface.c | 29 +++++++++++++------- + 3 files changed, 92 insertions(+), 29 deletions(-) + +commit 107a52ed6190a72882598eec5f2cf0fab24f4cb1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 11 16:29:17 2006 +0000 + + Paint with white to intermediate RGB24 images before replaying meta-surface to preserve default white background instead of forcing a black background instead. + + ChangeLog | 9 +++++++++ + src/cairo-paginated-surface.c | 22 +++++++++++++++++++++- + 2 files changed, 30 insertions(+), 1 deletion(-) + +commit ebeaeeccece1a6cbe68db347ad782f2dd482afc3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 11 16:01:25 2006 +0000 + + Note that PS backend has now been switched over to use cairo_paginated_surface_t. + Switch from ARGB32 to RGB24 for intermediate image surface since that's all that the current users of cairo_paginated_surface support anyway. + Switch cairo_ps_surface_t over to use the new cairo_paginated_surface_t. This drastically simplifies the implementation, but temporarily puts the PostScript output back into the land of one-image-per-page. To be fixed soon though with improvements to cairo_paginated_surface_t. Everything still passes the test suite which is good. The test suite currently does no testing of multi-page output, which is quite bad. + + ChangeLog | 34 ++ + ROADMAP | 11 +- + src/cairo-paginated-surface.c | 6 +- + src/cairo-ps-surface.c | 758 ++++++++++++------------------------------ + 4 files changed, 254 insertions(+), 555 deletions(-) + +commit c23d7d4758c7915505437b0fc8b57df9ef628289 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 11 11:53:33 2006 +0000 + + Note that from here on out, the PDF output should always pass the entire test suite! + Add new functions needed by users of cairo_paginated_surface_t. + Always snapshot a paginated surface to an image surface, rather than a surface similar to the target. We do this since paginated target surfaces are allowed to not be complete surfaces, (such as not implementing acquire_source_surface). + Switch the implementation of cairo_pdf_surface_t to use cairo_paginated_surface_t. For now this means that all PDF output is fallback images, but this can change incrementally as we go forward. + + ChangeLog | 25 +++++++++++++++++++++++++ + ROADMAP | 22 ++++++++++++---------- + src/cairo-paginated-surface-private.h | 6 ++++++ + src/cairo-paginated-surface.c | 24 ++++++++++++++++++++---- + src/cairo-pdf-surface.c | 32 +++++++++++++++++++++++++++----- + 5 files changed, 90 insertions(+), 19 deletions(-) + +commit 953561ebbd7e58ecb3e6cec0e2446cf3dac3f146 +Author: Anders Carlsson <andersca@imendio.com> +Date: Tue Jan 10 07:54:17 2006 +0000 + + Remove old scale matrix since it exists in our base class. + (_cairo_atsui_font_set_metrics): Fix descent calculation. + + ChangeLog | 12 ++++++++++++ + src/cairo-atsui-font.c | 18 +++++++----------- + 2 files changed, 19 insertions(+), 11 deletions(-) + +commit ae807fc9361fcb77b1cefc09cb180f045510768b +Author: Anders Carlsson <andersca@imendio.com> +Date: Tue Jan 10 05:28:59 2006 +0000 + + Add cairo-quartz-private.h + If the destination surface is a quartz surface, get the clip mask from it. + Added. + Keep a copy of the clip mask around. + (_cairo_surface_is_quartz): New function which determines if a given surface is a quartz surface. + + ChangeLog | 21 ++++++++++++++++ + src/Makefile.am | 2 +- + src/cairo-atsui-font.c | 33 ++++++++++++++++++++++++- + src/cairo-quartz-private.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-quartz-surface.c | 37 ++++++++++++++++------------ + 5 files changed, 136 insertions(+), 18 deletions(-) + +commit d6cb82c37284aa0b5fb8e427faf0b360c9b26168 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 9 17:18:12 2006 +0000 + + Add printf format attribute to cairo_test_log. + + ChangeLog | 4 ++++ + test/cairo-test.h | 9 ++++++++- + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit ff5207ed11ed04df8f436c5d59e04ed0c3f4cc7f +Author: Anders Carlsson <andersca@imendio.com> +Date: Mon Jan 9 10:29:22 2006 +0000 + + Use uint32_t instead of uint; + + pixman/ChangeLog | 7 +++++++ + pixman/src/icimage.c | 8 ++++---- + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit 7ce7b20a821c93c0edb9b2899c52b13f8067d860 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 6 14:24:55 2006 +0000 + + Reviewed by keithp + Change the paginated surface to force all output to come from an image surface (to be refined incrementally as we hook real surface backends up to it). + + ChangeLog | 10 ++++++++++ + src/cairo-paginated-surface.c | 24 ++++++++++++++++++++++-- + 2 files changed, 32 insertions(+), 2 deletions(-) + +commit fbb8a62797657a98905b92bd01bfa995cc823def +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 6 14:11:07 2006 +0000 + + Reviewed by keithp + Implement copy_page for paginated surface. Fix show_page to destroy the meta-surface and create a new one. + Change these functions to advertise when they are not supported, so that _cairo_paginated_copy_page can implement things differently depending on whether or not it is personal. + Check return values from _cairo_surface_show/copy_page. + + ChangeLog | 21 +++++++++++++++++ + src/cairo-gstate.c | 20 ++++++++++++++-- + src/cairo-paginated-surface.c | 54 ++++++++++++++++++++++++++++++++++++++++++- + src/cairo-surface.c | 16 ++++++++----- + src/cairoint.h | 4 ++-- + 5 files changed, 104 insertions(+), 11 deletions(-) + +commit 88875100d6910d62edcaf7fadc2146594ad3268b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 5 15:17:02 2006 +0000 + + Slip 1.2.0 projected data (again) out to 2006-01-13. Note that win32 is now incorporated into the test suite and is only failing two tests (self-copy and trap-clip). Note new progress on cairo_push/pop_group. Add item to support pango's hex-box drawing. Note that gradient computation performance has been improved. Note that experimental SVG backend has been added. + + ChangeLog | 10 ++++++++++ + ROADMAP | 28 ++++++++++++++++++++++++---- + 2 files changed, 34 insertions(+), 4 deletions(-) + +commit 6995a83597217bd422e74d79ce3c989334ada871 +Author: David Reveman <davidr@novell.com> +Date: Thu Jan 5 15:00:37 2006 +0000 + + Gradient updates in SVG backend and no sorting of color stops in SVG or PDF backend + + ChangeLog | 7 +++++ + src/cairo-pdf-surface.c | 20 -------------- + src/cairo-svg-surface.c | 73 +++++++++++++++++++++++-------------------------- + 3 files changed, 41 insertions(+), 59 deletions(-) + +commit 421504802570978aa6a107a96587cc8014fbd58c +Author: David Reveman <davidr@novell.com> +Date: Thu Jan 5 05:14:14 2006 +0000 + + Update gradient code in glitz backend + + ChangeLog | 3 +++ + src/cairo-glitz-surface.c | 30 +++++++++++++++--------------- + 2 files changed, 18 insertions(+), 15 deletions(-) + +commit 5ac6e85455fce862989033d5ff98576d159664bd +Author: David Reveman <davidr@novell.com> +Date: Thu Jan 5 05:06:50 2006 +0000 + + Update gradient code in PDF backend + + ChangeLog | 5 +++++ + src/cairo-pdf-surface.c | 30 +++++++++++++++--------------- + 2 files changed, 20 insertions(+), 15 deletions(-) + +commit 9737b4de39162a86844e07f50aa76e881063dab9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 4 17:59:03 2006 +0000 + + 2005-10-10 David Reveman <davidr@novell.com> + Throw away old gradient code from within cairo-pattern.c in favor of using new support in pixman for gradients. + Update reference images for all tests involving gradients since the gradient output has changed slightly. + + ChangeLog | 40 +++ + src/cairo-image-surface.c | 14 +- + src/cairo-matrix.c | 17 + + src/cairo-pattern.c | 594 +++++++++------------------------- + src/cairoint.h | 29 +- + test/clip-operator-ref.png | Bin 37134 -> 36956 bytes + test/clip-operator-rgb24-ref.png | Bin 21014 -> 20991 bytes + test/gradient-alpha-ref.png | Bin 154 -> 155 bytes + test/gradient-alpha-rgb24-ref.png | Bin 147 -> 152 bytes + test/linear-gradient-ref.png | Bin 12719 -> 12750 bytes + test/linear-gradient-rgb24-ref.png | Bin 12719 -> 11700 bytes + test/mask-ref.png | Bin 87846 -> 87837 bytes + test/mask-rgb24-ref.png | Bin 73124 -> 73292 bytes + test/operator-clear-ref.png | Bin 4971 -> 4933 bytes + test/operator-clear-rgb24-ref.png | Bin 5704 -> 5677 bytes + test/operator-source-ref.png | Bin 19982 -> 19684 bytes + test/operator-source-rgb24-ref.png | Bin 16909 -> 16746 bytes + test/text-pattern-ref.png | Bin 2731 -> 2725 bytes + test/text-pattern-rgb24-ref.png | Bin 2686 -> 2704 bytes + test/trap-clip-ref.png | Bin 71701 -> 71785 bytes + test/trap-clip-rgb24-ref.png | Bin 64724 -> 64728 bytes + test/unbounded-operator-ref.png | Bin 11994 -> 11964 bytes + test/unbounded-operator-rgb24-ref.png | Bin 7581 -> 7555 bytes + 23 files changed, 221 insertions(+), 473 deletions(-) + +commit 19441311e471b661b6b2a6854f030aafa7715d5d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 4 16:39:23 2006 +0000 + + 2005-10-10 David Reveman <davidr@novell.com> + Some major performance improvements to the general composite code used for gradients and transformed images. Like fetching of mask scanline before source scanline so that only the necessary pixels from source needs to be computed in case of gradients or transformed images as source. This patch also include some gradient specific fixes and performance improvement. + + pixman/ChangeLog | 22 +- + pixman/src/fbcompose.c | 1187 ++++++++++++++++++++++++++++++------------------ + pixman/src/icimage.c | 17 +- + pixman/src/icimage.h | 9 + + 4 files changed, 776 insertions(+), 459 deletions(-) + +commit 305a83721f5c6423fc1e7fbb0cf1d67c0f92ecb7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 4 16:26:10 2006 +0000 + + Originally: 2005-10-10 David Reveman <davidr@novell.com> + Add entries for gradient support. + Add PictureGradientColor. + Add necessary functionality for gradient support. + Enable gradient support. + + pixman/ChangeLog | 13 ++ + pixman/src/fbcompose.c | 91 +++++++++----- + pixman/src/icimage.c | 334 ++++++++++++++++++++++++++++++++++++++++++++++--- + pixman/src/icimage.h | 72 +++++++++++ + pixman/src/icint.h | 7 ++ + pixman/src/pixman.h | 48 +++++-- + 6 files changed, 510 insertions(+), 55 deletions(-) + +commit c6cdfc5770c6bfb5d708cb1c13921079f611299a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Jan 3 09:23:48 2006 +0000 + + Clamp surface dimensions to a minimum of 1. (_cairo_glitz_surface_get_image): Set the glitz clip to NULL before calling glitz_get_pixels, to return the full surface contents. Restore clip afterwards. (_cairo_glitz_surface_composite_trapezoid): Return UNSUPPORTED if the antialias is anything other than DEFAULT/GRAY. + Try to recover a standard cairo_format_t from given pixman format masks, so that various things that only work with a standard format work correctly. + Remove cairo_glitz_surface_write_to_png, replace with generic cairo_surface_write_to_png (since it works with image-surface create_with_masks fix) + + ChangeLog | 19 +++++++++++++++++++ + src/cairo-glitz-surface.c | 30 ++++++++++++++++++++++++++++-- + src/cairo-image-surface.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- + test/cairo-test.c | 46 +++++++++++++--------------------------------- + 4 files changed, 104 insertions(+), 36 deletions(-) + +commit bd265e008b6cb48565569733d48cb5bd2d4ba1b9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Jan 3 07:29:57 2006 +0000 + + Clean up output some; show only images that fail, otherwise just show pass/fail squares. + + ChangeLog | 5 ++++ + test/make-html.pl | 81 ++++++++++++++++++++++++++++++++++++++++++------------- + 2 files changed, 68 insertions(+), 18 deletions(-) + +commit 71369489d831ef0ec050f3e9da6226617e2ffa1b +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Fri Dec 30 14:16:10 2005 +0000 + + no more has_clip boolean. Init clip_level. (_cairo_surface_intersect_clip_path): a NULL path means reset of clipping region, not back to previous clipping level. + + ChangeLog | 11 +++++++++-- + src/cairo-svg-surface.c | 12 ++++++------ + 2 files changed, 15 insertions(+), 8 deletions(-) + +commit 23e5e558414cbbb5e20a6b8b5e68f21c6a3ed15d +Author: Michael Emmel <mike.emmel@gmail.com> +Date: Thu Dec 29 07:17:01 2005 +0000 + + New directfb backend for cairo includes test suite and example to run the test is in the comment at the top of cairo-test-directfb.c enable with + --enable-directfb + + configure.in | 25 ++ + src/Makefile.am | 9 +- + src/cairo-directfb-surface.c | 804 +++++++++++++++++++++++++++++++++++++++++++ + src/cairo-directfb.h | 60 ++++ + src/cairo-features.h.in | 2 + + test/Makefile.am | 4 + + test/cairo-test-directfb.c | 127 +++++++ + test/cairo-test-directfb.h | 23 ++ + test/cairo-test.c | 11 + + 9 files changed, 1064 insertions(+), 1 deletion(-) + +commit f7236b84603c45d9c67cc5dfed6305a8a1241f6c +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Dec 28 02:28:56 2005 +0000 + + namespace declarations for SVG and XLINK (#5411). + + ChangeLog | 5 +++++ + src/cairo-svg-surface.c | 5 ++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 78d892d70eb28a92f3300727ecc753cd564a5fe7 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Tue Dec 27 09:47:58 2005 +0000 + + Add BeOS-specific reference images for tests where the maximum color difference is 1. + + ChangeLog | 13 +++++++++++++ + test/mask-beos-rgb24-ref.png | Bin 0 -> 73554 bytes + test/mask-beos_bitmap-argb32-ref.png | Bin 0 -> 87543 bytes + test/mask-beos_bitmap-rgb24-ref.png | Bin 0 -> 73554 bytes + test/set-source-beos-rgb24-ref.png | Bin 0 -> 124 bytes + test/set-source-beos_bitmap-rgb24-ref.png | Bin 0 -> 124 bytes + test/trap-clip-beos-rgb24-ref.png | Bin 0 -> 64724 bytes + test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 0 -> 64724 bytes + 8 files changed, 13 insertions(+) + +commit f036c28fa3aa7f9d18cd47b4b5dc7f728af04d5f +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Dec 26 19:08:53 2005 +0000 + + Implement composite for the beos backend. Don't map CAIRO_OPERATOR_ADD to B_OP_ADD for now, something's broken there. + + ChangeLog | 6 +++ + src/cairo-beos-surface.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 104 insertions(+), 1 deletion(-) + +commit 4fe93bcf92f4aeb5ea78bf48e109b4f5b7555181 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Dec 26 16:44:41 2005 +0000 + + Don't require that the caller locks the view; do it in cairo code. + Remove the now-unneeded locking + + ChangeLog | 6 ++++++ + src/cairo-beos-surface.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++- + test/cairo-test-beos.cpp | 19 +++++++---------- + 3 files changed, 65 insertions(+), 12 deletions(-) + +commit 36850c7f32c25031a1ed8387a78c6edc43d9f67d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 17:08:28 2005 +0000 + + Remove some unneeded backend functions (composite, fill_rectangles, composite_trapezoids, old_show_glyphs). + + ChangeLog | 6 +++ + src/cairo-ps-surface.c | 128 ++----------------------------------------------- + 2 files changed, 10 insertions(+), 124 deletions(-) + +commit 0a009c925f34ad82f2130a6dae731c7cda0bcb35 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 17:04:01 2005 +0000 + + Don't implement create_similar for the test-meta or the paginated surface. This was slowing things down a _lot_ (about 11× for the mask test for example) without any improvement in output quality. We can revisit this again later if there's any output improvement to be had down the road. + + ChangeLog | 10 ++++++++++ + src/cairo-paginated-surface.c | 11 +---------- + src/test-meta-surface.c | 14 +------------- + 3 files changed, 12 insertions(+), 23 deletions(-) + +commit e71e2fc4f186eecde0b987c3e82ffbecafeebcad +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 16:46:44 2005 +0000 + + Add a private cairo_paginated_surface_t which builds on top of the meta surface and is intended to provide an easy interface with common functionality for the various paginated surface types (ps, pdf, etc.). + Add test_paginated_surface_t which is another test surface enabled with --enable-test-surfaces. The test_meta_surface code served as the basis for cairo_paginated_surface_t so that test surface may be entirely superfluous now. + + ChangeLog | 32 ++++ + src/Makefile.am | 5 +- + src/cairo-paginated-surface-private.h | 46 +++++ + src/cairo-paginated-surface.c | 337 ++++++++++++++++++++++++++++++++++ + src/test-paginated-surface.c | 67 +++++++ + src/test-paginated-surface.h | 52 ++++++ + test/cairo-test.c | 85 +++++++++ + 7 files changed, 623 insertions(+), 1 deletion(-) + +commit c78685399307431903613733ddc936a104376943 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 16:35:32 2005 +0000 + + Here is a cleaner implementation of the _cairo_array_t change which was previously committed inadvertently. + Fix buggy implementation of _cairo_array_snapshot by changing array->elements to be a pointer to a pointer. This extra level of indirection allows the snapshot array to point to a pointer which will itself get changed when new storage is needed for a growing array. Previously, the snapshot would be left pointing at stale storage. + Fix to call _cairo_array_index rather than grabbing array->elements directly and casting (which cast is now wrong with the change in implementation of array->index). + + ChangeLog | 23 +++++++++++++++++++++++ + src/cairo-array.c | 42 ++++++++++++++++++++++++++++++++++-------- + src/cairo-meta-surface.c | 4 ++-- + src/cairo-win32-font.c | 4 +++- + src/cairoint.h | 2 +- + 5 files changed, 63 insertions(+), 12 deletions(-) + +commit 122a83643b79ec197979e01620dd5dc21620e0e0 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 12:20:06 2005 +0000 + + Revert inadvertent commit (immediately previous). + + ChangeLog | 13 ++++++++++++ + src/cairo-array.c | 53 ++++++++++++++++-------------------------------- + src/cairo-meta-surface.c | 15 +++++--------- + src/cairo-win32-font.c | 18 ++++++++-------- + src/cairoint.h | 2 +- + 5 files changed, 44 insertions(+), 57 deletions(-) + +commit 5280c09b7d5d903455cad75dd4885478e8fa2761 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 12:08:57 2005 +0000 + + Fix indentation. + + ChangeLog | 4 ++++ + src/cairo-array.c | 53 ++++++++++++++++++++++++++++++++---------------- + src/cairo-meta-surface.c | 15 +++++++++----- + src/cairo-win32-font.c | 18 ++++++++-------- + src/cairoint.h | 2 +- + src/test-meta-surface.h | 4 ++-- + test/.cvsignore | 1 + + 7 files changed, 64 insertions(+), 33 deletions(-) + +commit 3eb2a252ad22295725281908448e88a2c53462ae +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 21 12:07:25 2005 +0000 + + Remove cruft from old commands that the meta surface no longer implements (composite, fill_rectangles, composite_trapezoids, and set_clip_region). + + ChangeLog | 6 +++++ + src/cairo-meta-surface-private.h | 49 ---------------------------------------- + 2 files changed, 6 insertions(+), 49 deletions(-) + +commit 088c664b9c891580b4f92bf5419f6757a09e96cc +Author: Christian Biesinger <cbiesinger@web.de> +Date: Wed Dec 21 08:19:47 2005 +0000 + + Fix some typos + + ChangeLog | 8 ++++++++ + src/cairo-ft-font.c | 2 +- + src/cairo-gstate.c | 4 ++-- + src/cairoint.h | 2 +- + 4 files changed, 12 insertions(+), 4 deletions(-) + +commit 90c1837e175f3380b29ad8bb929f9e5787371e24 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Dec 21 07:25:01 2005 +0000 + + store surfaces in a <g> node, and clip to surface area. Now SVG backend should pass pixman-rotate test. (emit_composite_svg_pattern): emit transformation matrix. (_cairo_svg_surface_intersect_clip_path): don't use xmlBuffer here. + + ChangeLog | 8 ++++++ + src/cairo-svg-surface.c | 72 ++++++++++++++++++++++++++++++------------------- + 2 files changed, 52 insertions(+), 28 deletions(-) + +commit e95376c1c3d586d52808e16a4b13a8eef9a9abad +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 20 10:30:11 2005 +0000 + + Add some comments describing what a cairo_meta_surface_t is. + Remove unused _test_fallback_surface_create_for_data. + Remove unused _test_meta_surface_create_for_data. Add missing source file src/test-meta-surface.h. + + ChangeLog | 14 +++++++++++++ + src/cairo-meta-surface.c | 19 +++++++++++++++++ + src/test-fallback-surface.c | 28 ------------------------- + src/test-fallback-surface.h | 7 ------- + src/test-meta-surface.c | 38 ---------------------------------- + src/test-meta-surface.h | 50 +++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 83 insertions(+), 73 deletions(-) + +commit 7cc38be7d1e5967cf4f09bd6c0a1ac8f7b059ad8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 20 09:37:15 2005 +0000 + + Move more fallback code from cairo-gstate.c to cairo-surface-fallback.c where it belongs. In the process, clean up the function names a bit and make the whole mess static. + + ChangeLog | 16 ++ + src/cairo-gstate.c | 538 -------------------------------------- + src/cairo-surface-fallback.c | 607 ++++++++++++++++++++++++++++++++++++++++--- + src/cairoint.h | 25 -- + 4 files changed, 592 insertions(+), 594 deletions(-) + +commit ff486bec0fb1f991217ac9023c0559176ba19a0f +Author: Carl Worth <cworth@cworth.org> +Date: Mon Dec 19 22:45:41 2005 +0000 + + Begin moving fallback code out of cairo-surface.c and into cairo-surface-fallback.c. + + ChangeLog | 22 ++ + src/Makefile.am | 2 + + src/cairo-surface-fallback-private.h | 119 +++++++ + src/cairo-surface-fallback.c | 625 +++++++++++++++++++++++++++++++++ + src/cairo-surface.c | 644 ++--------------------------------- + 5 files changed, 797 insertions(+), 615 deletions(-) + +commit 75b2fe93f09324b509630d86e0b01de830d853cf +Author: Carl Worth <cworth@cworth.org> +Date: Mon Dec 19 22:01:39 2005 +0000 + + Use _cairo_surface_paint rather than _cairo_surface_fill_rectangle as only the former is guaranteed to work with all backends. + Refine the comment describing this test surface. + Add new test surface for exercising cairo_meta_surface. + Simplify the image and test_fallback targets by not using create_for_data. Allow for NULL cleanup target functions. Add support for the test_meta_surface. + + ChangeLog | 31 ++++ + src/Makefile.am | 3 +- + src/cairo-surface.c | 15 +- + src/test-fallback-surface.c | 8 +- + src/test-meta-surface.c | 375 ++++++++++++++++++++++++++++++++++++++++++++ + test/.cvsignore | 1 + + test/cairo-test.c | 53 ++----- + 7 files changed, 444 insertions(+), 42 deletions(-) + +commit 606d23b2874288c18f7373ffa47b0fb6b63b3451 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Dec 19 17:16:28 2005 +0000 + + Use correct color when OPERATOR_SOURCE is used on a surface without alpha information. + + ChangeLog | 5 +++++ + src/cairo-beos-surface.cpp | 11 +++++++++++ + 2 files changed, 16 insertions(+) + +commit d0eaab305c69b386fde72fb0a325df2c5d62385d +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Dec 19 15:33:32 2005 +0000 + + fix stroke linewidth and dashes, I hope. Emit stroke-dashoffset. + + ChangeLog | 5 +++++ + src/cairo-svg-surface.c | 12 ++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit a83a42b248a8fe22e513b0b61dd7ca1981d7b4dd +Author: Keith Packard <keithp@keithp.com> +Date: Mon Dec 19 15:08:05 2005 +0000 + + Use NULL clip instead of special serial zero cairo_clip_t Should make using surfaces easier. + + ChangeLog | 11 +++++++++++ + src/cairo-clip.c | 6 ++++++ + src/cairo-gstate.c | 31 ++++++++++++++++++------------- + src/cairo-surface.c | 28 +++++++++++++++++++--------- + 4 files changed, 54 insertions(+), 22 deletions(-) + +commit ffe10b7c877ef71ee4e982fcf4a1de5b4476b243 +Author: Emmanuel Pacaud <emmanuel.pacaud@univ-poitiers.fr> +Date: Mon Dec 19 14:18:06 2005 +0000 + + Shhhh... + + test/.cvsignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit ec574cd6f0a4244a45d69894f41db1910585e05d +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Dec 19 13:59:34 2005 +0000 + + CAIRO_CAN_TEST_SVG_SURFACE depends on librsvg. + cairo_svg_surface_t owns a xml node, for support of svg_surface_composite. (_cairo_svg_surface_create_for_document): init xml_node. All surfaces except first one are stored in defs node. (emit_composite_image_pattern): returns pattern size, and don't call emit_transform if is_pattern == TRUE. (emit_composite_svg_pattern): do something. (emit_composite_pattern): returns pattern size. (_cairo_svg_surface_composite): xml_node is stored in cairo_svg_surface_t now. (emit_surface_pattern): emit surface pattern width here. Fix property names. (_cairo_svg_path_close_path): don't close path if no current point. (_cairo_svg_surface_fill_rectangles): new. (_cairo_svg_surface_fill): emit fill rule. xml_node is in surface now. (_cairo_svg_surface_composite_trapezoids): xml_node is in surface now. (_cairo_svg_surface_stroke): ditto. (_cairo_svg_surface_intersect_clip_path): ditto. Emit fill rule. + ignore svg2png. + build svg2png utility. + test SVG backend if CAIRO_HAS_SVG_SURFACE && CAIRO_CAN_TEST_SVG_SURFACE. + new. + + ChangeLog | 30 ++++++++ + configure.in | 10 +++ + src/cairo-svg-surface.c | 178 ++++++++++++++++++++++++++++++++++++++++-------- + test/.cvsignore | 1 + + test/Makefile.am | 8 ++- + test/cairo-test.c | 69 +++++++++++++++++++ + test/svg2png.c | 62 +++++++++++++++++ + 7 files changed, 329 insertions(+), 29 deletions(-) + +commit 70c45dd5020af78ee2532ceb8d55eea619bc4aaa +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Dec 19 11:01:42 2005 +0000 + + Some final changes to the beos backend before checkin were wrong, fixing. + + ChangeLog | 6 ++++++ + configure.in | 2 +- + src/cairo-beos-surface.cpp | 4 ++-- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 9af7220b68f97db4dd2b91ce414d2d7ac3194410 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Dec 19 10:17:22 2005 +0000 + + Use gtk-doc syntax rather than doxygen syntax for internal functions (to avoid warnings from gtk-doc when it processes this file) + + ChangeLog | 6 ++++++ + src/cairo-beos-surface.cpp | 30 +++++++++++++++++++++--------- + 2 files changed, 27 insertions(+), 9 deletions(-) + +commit 6142bc534850dda7ecf823c2a672ed65c13978eb +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Dec 18 17:20:06 2005 +0000 + + Mention new --enable-svg option + Add notes for the new BeOS backend + Add disabled by default BeOS backend + Add BeOS files + New + New + BEOS_SURFACE_FEATURE + BeOS mutex functions + Ignore files generates by the BeOS tests + Add cairo-test-beos.* + New. + Test BeOS backend. + + ChangeLog | 17 ++ + INSTALL | 1 + + README | 5 + + configure.in | 44 +++ + src/Makefile.am | 11 + + src/cairo-beos-surface.cpp | 731 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-beos.h | 61 ++++ + src/cairo-features.h.in | 2 + + src/cairoint.h | 11 + + test/.cvsignore | 3 + + test/Makefile.am | 6 + + test/cairo-test-beos.cpp | 239 +++++++++++++++ + test/cairo-test-beos.h | 26 ++ + test/cairo-test.c | 13 + + 14 files changed, 1170 insertions(+) + +commit 93da7fa203a8e4bce40aab590a8c245400013787 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Dec 18 16:37:14 2005 +0000 + + Move enum to cairoint.h + add CAIRO_BEGIN_DECLS and CAIRO_END_DECLS, and move an enum from cairo-clip-private.h here (C++ doesn't like forward-declarations of enums). Final patch for allowing C++ backends. + reviewed by: cworth + + ChangeLog | 10 ++++++++++ + src/cairo-clip-private.h | 6 ------ + src/cairoint.h | 10 +++++++++- + 3 files changed, 19 insertions(+), 7 deletions(-) + +commit 2c8859c8b51b10fd52b032aef54bb394e9acb011 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Dec 16 16:23:04 2005 +0000 + + make the SVG backend freetype message actually mention SVG rather than PDF. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 464d3fc563442ebe0efcdd1689e4b83cc92c794b +Author: Carl Worth <cworth@cworth.org> +Date: Fri Dec 16 11:48:48 2005 +0000 + + Return a test_fallback_surface_t rather than a cairo_image_surface_t for better testing, (otherwise, an image surface would meet the semantic demands of create_similar just fine). + + ChangeLog | 8 ++++++++ + src/test-fallback-surface.c | 10 +++++++--- + 2 files changed, 15 insertions(+), 3 deletions(-) + +commit c75232f8abfb1dc56ff669d3b102f71f9cd892c1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Dec 16 11:31:10 2005 +0000 + + Add a new option --enable-test-surfaces. + New surface backend for testing only. It has as many NULL backend entries as possible. + Add support to test the new test_fallback backend. + + ChangeLog | 22 +++++ + configure.in | 19 +++- + src/Makefile.am | 11 ++- + src/test-fallback-surface.c | 225 ++++++++++++++++++++++++++++++++++++++++++++ + src/test-fallback-surface.h | 57 +++++++++++ + test/.cvsignore | 1 + + test/Makefile.am | 18 ++-- + test/cairo-test.c | 34 +++++++ + 8 files changed, 373 insertions(+), 14 deletions(-) + +commit 79eee2c303c09c33d2f5bc4fc4d88b9608c201d6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Dec 16 11:21:24 2005 +0000 + + Don't export cairo_image_surface_set_clip_region. + Eliminate some unnecessary _cairo_image_abstract_surface variations of backend function. + Remove errant include of cairo-pdf.h. + + ChangeLog | 11 +++++++++++ + src/cairo-font-subset.c | 4 ++-- + src/cairo-image-surface.c | 32 +++++++++----------------------- + src/cairoint.h | 4 ---- + 4 files changed, 22 insertions(+), 29 deletions(-) + +commit 6ba7772138d5ce64cef13b296cb61f94b49f9c24 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Dec 16 03:02:35 2005 +0000 + + Globally rename "operator" to "op", to allow writing backends in C++ + reviewed by: cworth + + CODING_STYLE | 2 +- + ChangeLog | 88 ++++++++++++++++++++++++++++ + src/cairo-atsui-font.c | 2 +- + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 4 +- + src/cairo-ft-font.c | 2 +- + src/cairo-gstate-private.h | 2 +- + src/cairo-gstate.c | 90 ++++++++++++++--------------- + src/cairo-image-surface.c | 24 ++++---- + src/cairo-meta-surface-private.h | 16 ++--- + src/cairo-meta-surface.c | 30 +++++----- + src/cairo-pdf-surface.c | 10 ++-- + src/cairo-ps-surface.c | 90 ++++++++++++++--------------- + src/cairo-scaled-font.c | 10 ++-- + src/cairo-surface.c | 122 +++++++++++++++++++-------------------- + src/cairo-svg-surface.c | 20 +++---- + src/cairo-win32-font.c | 8 +-- + src/cairo-win32-surface.c | 16 ++--- + src/cairo-xcb-surface.c | 18 +++--- + src/cairo-xlib-surface.c | 80 ++++++++++++------------- + src/cairoint.h | 56 +++++++++--------- + test/get-and-set.c | 8 +-- + 22 files changed, 394 insertions(+), 306 deletions(-) + +commit 11d20940b28906af2d9dac687b96d38895c7eec1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 15 08:58:08 2005 +0000 + + Make poppler check require poppler >= 0.4.1. + + ChangeLog | 4 ++++ + configure.in | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 88615148caa317200efcb9768a9f310323546697 +Author: Stuart Parmenter <pavlov@pavlov.net> +Date: Wed Dec 14 19:56:09 2005 +0000 + + #define access _access and #define F_OK to 0 on for MSVC + add CAIRO_BEGIN_DECLS and CAIRO_END_DECLS + + ChangeLog | 6 ++++++ + test/cairo-test.c | 2 ++ + test/cairo-test.h | 4 ++++ + 3 files changed, 12 insertions(+) + +commit 9becae35c085d5f7afe08781c4e2546ee7c7287c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 14 16:45:39 2005 +0000 + + Remove dead code from cairo-meta-surface: vestiges of meta-surface backend implementations of composite, fill_rectangles, composite_trapezoids, set_clip_region, and old_show_glyphs. + + ChangeLog | 9 ++ + pixman/src/.cvsignore | 2 + + src/cairo-meta-surface-private.h | 6 +- + src/cairo-meta-surface.c | 233 +-------------------------------------- + 4 files changed, 15 insertions(+), 235 deletions(-) + +commit 77540a2dfafeea1de9d45847bd93621d7cafa92d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 14 16:22:06 2005 +0000 + + Add preliminary support for --enable-gcov. Thanks to Pierre-Alain Joye (with inspiration from the PHP gcov support by Jani Taskinen and Ilia Alshanetsky). + Ignore *.gcda and *.gcno gcov data files. + + ChangeLog | 9 +++++++ + configure.in | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- + src/.cvsignore | 2 ++ + test/.cvsignore | 1 + + 4 files changed, 85 insertions(+), 3 deletions(-) + +commit bb418ab4e538b035f3a5d7a56d142198d8e432ff +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 13 16:31:14 2005 +0000 + + Make creator be cairo, not Cairo. + + ChangeLog | 5 +++++ + src/cairo-ps-surface.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit c2c4f0bb251423737d46fcde7ffe8711547abf09 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Dec 12 11:56:40 2005 +0000 + + bump glitz req to 0.5.1, test for backends + Add glitz backend (original patches from sunmoon1997@gmail.com), including glx, wgl, and agl support. Add CAIRO_TEST_TARGET environment variable for limiting backends to test. + Takes all *.log files and spits out html to stdout that can be used to view all test results at once. + + ChangeLog | 12 ++ + configure.in | 31 +++- + src/Makefile.am | 21 ++- + test/Makefile.am | 14 ++ + test/cairo-test.c | 540 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + test/make-html.pl | 161 ++++++++++++++++ + 6 files changed, 753 insertions(+), 26 deletions(-) + +commit 840f93698d5a89634c573f25911e9dc6020a46e1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Dec 8 13:22:09 2005 +0000 + + shhh... + + ChangeLog | 4 ++++ + test/.cvsignore | 4 ++++ + 2 files changed, 8 insertions(+) + +commit b2f973e7f4a5bf4d953d52dfb71cb84472d32770 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Dec 8 13:09:26 2005 +0000 + + add optionnal disabled by default SVG backend. + include SVG backend files. + include SVG_SURFACE_FEATURE. + rename dtostr to _cairo_dtostr for use in cairo-svg-surface.c. + _cairo_dtostr declaration. + new. + new. + build svg-surface and svg-clip. + new. + new. + + ChangeLog | 16 + + configure.in | 50 +- + src/Makefile.am | 7 + + src/cairo-features.h.in | 2 + + src/cairo-output-stream.c | 6 +- + src/cairo-svg-surface.c | 1330 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-svg.h | 63 +++ + src/cairoint.h | 3 + + test/Makefile.am | 10 +- + test/svg-clip.c | 134 +++++ + test/svg-surface.c | 115 ++++ + 11 files changed, 1723 insertions(+), 13 deletions(-) + +commit 73df5f2d6222d4847e4a4b821867be6b6963abf6 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 7 16:16:20 2005 +0000 + + Note that that PDF backend has been incorporated into the test suite. + + ChangeLog | 5 +++++ + ROADMAP | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 45c350e32810fecc09adecf5941ce9640543fb75 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 7 16:06:11 2005 +0000 + + Add checks for poppler and friends which are needed by pdf2png. Set CAIRO_CAN_TEST_PDF_SURFACE as both a #define and an automake conditional. + Build pdf2png if possible. + Add support for testing the PDF backend. + New utility program to convert a PDF file into a PNG image using poppler (thanks to Kristian Høgsberg). + Ignore new stuff generated by PDF backend testing. + + ChangeLog | 18 ++++++++++++ + configure.in | 11 +++++++ + test/.cvsignore | 3 ++ + test/Makefile.am | 6 ++++ + test/cairo-test.c | 70 +++++++++++++++++++++++++++++++++++++++++-- + test/pdf2png.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 194 insertions(+), 2 deletions(-) + +commit 964c56e72bf5d4b1911b59070413e3424b88b6f4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 7 12:19:10 2005 +0000 + + Note that self-copy now works with the PS backend. + Add _cairo_array_init_snapshot and checks for is_snapshot throughout. + Add a new surface->backend->snapshot function. + Implement _cairo_meta_surface_snapshot and _cairo_meta_surface_acquire/release_source_image. Change _cairo_meta_surface_create to require the width and height in pixels to be used when replaying for purposed of _cairo_meta_surface_aquire_source_image. + Track change in prototype of _cairo_meta_surface_create. Implement _cairo_ps_surface_snapshot by deferring down into _cairo_meta_surface_snapshot. + + ChangeLog | 35 ++++++++++++ + ROADMAP | 6 +- + src/cairo-array.c | 36 ++++++++++++ + src/cairo-meta-surface-private.h | 12 +++- + src/cairo-meta-surface.c | 116 ++++++++++++++++++++++++++++++++++++--- + src/cairo-ps-surface.c | 23 +++++++- + src/cairo-surface.c | 53 +++++++++++------- + src/cairoint.h | 12 ++++ + 8 files changed, 257 insertions(+), 36 deletions(-) + +commit 96be55124f3abcb03ed3a901bc4f099185ab8864 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 7 11:53:30 2005 +0000 + + Fix to check cairo_surface_status rather than !surface which is always false. (cleanup_ps): Fix leak of filename memory. + + ChangeLog | 6 ++++++ + test/cairo-test.c | 4 +++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 0883155111ab9597d335c7d43ae47c163b5c0e4d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 7 11:44:28 2005 +0000 + + Use more portable shell syntax, ('test =' rather than 'test =='). Thanks to Richard Lloyd and Klaus Heinz. Closes bug #4823. + + ChangeLog | 6 ++++++ + configure.in | 8 ++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 4484830d6cbb5792304e3b6e4c4a07b6172f1a72 +Author: David Reveman <davidr@novell.com> +Date: Mon Dec 5 08:33:04 2005 +0000 + + glitz backend gradient fix + + ChangeLog | 5 +++++ + src/cairo-glitz-surface.c | 6 +++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 57fe7920195474a865cc18f0c976f3ae5df87973 +Author: David Reveman <davidr@novell.com> +Date: Sun Dec 4 07:47:44 2005 +0000 + + More updates to track latest changes to glitz + + ChangeLog | 6 ++++++ + src/cairo-glitz-surface.c | 3 +++ + 2 files changed, 9 insertions(+) + +commit 2802950123c808246d0e9c40b1b7cc45043f9335 +Author: David Reveman <davidr@novell.com> +Date: Tue Nov 29 15:48:34 2005 +0000 + + Track changes to glitz + + ChangeLog | 5 ++++ + src/cairo-glitz-surface.c | 68 +++++++++++++++++------------------------------ + 2 files changed, 29 insertions(+), 44 deletions(-) + +commit 9e7076fd27b69b4de21a617a9cb0fa74f91f6bec +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 21 11:46:40 2005 +0000 + + Remove duplicate definitions of pixman_color_to_pixel and pixman_composite. + + ChangeLog | 5 +++++ + pixman/ChangeLog | 5 +++++ + pixman/src/pixman-remap.h | 2 -- + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 674ed1932e2264493e5f746989f02a6f2e0259a9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 21 10:50:20 2005 +0000 + + Add reminder to fix all memory leaks (as determined by the test suite) before release 1.2.0. + Patch leak of patterns as noted in bug #5100 (thanks to Richard Stellingwerff <remenic@gmail.com>). + + ChangeLog | 9 +++++++++ + ROADMAP | 4 ++++ + src/cairo-gstate.c | 4 ++++ + 3 files changed, 17 insertions(+) + +commit 345ba540b1977db7e1a31f88aa8c8b2cdb32f11d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 18 09:15:43 2005 +0000 + + Remove spurios INT_ prefixes which break the build with very recent binutils. + + ChangeLog | 5 +++++ + pixman/ChangeLog | 5 +++++ + pixman/src/pixman-remap.h | 4 ++-- + 3 files changed, 12 insertions(+), 2 deletions(-) + +commit 49136c04f2fcbf463334bf256c72b7b280e2e819 +Author: Stuart Parmenter <pavlov@pavlov.net> +Date: Thu Nov 17 11:55:20 2005 +0000 + + Hooked up tests to run on Windows with a Windows surface + + ChangeLog | 6 ++++++ + test/cairo-test.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++------- + 2 files changed, 52 insertions(+), 7 deletions(-) + +commit a16d93f367af721a535ed13fc5bc07636e6549d2 +Author: Anders Carlsson <andersca@imendio.com> +Date: Mon Nov 14 12:57:31 2005 +0000 + + If the surface is flipped, flip the CG coordinate system before drawing the images. + (cairo_quartz_surface_create): + Add "flipped" argument to cairo_quartz_surface_create. + + ChangeLog | 11 +++++++++++ + src/cairo-quartz-surface.c | 13 +++++++++++++ + src/cairo-quartz.h | 1 + + 3 files changed, 25 insertions(+) + +commit b5759f9e0746b48064c031009be8cd203f9bbaa5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 10 16:25:18 2005 +0000 + + Change scheduled release date of 1.2.0 out to 2005-12-15. + + ChangeLog | 5 +++++ + ROADMAP | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 5b6c912667f62f808b9cf533b4486ce906197543 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 8 17:43:13 2005 +0000 + + Note that PS is now passing all tests except for self-copy. + Add missing glue to hook up PS backend with new meta-surface support for the 5 basic drawing operations. Currently, this forces image fallbacks for all operations. + Switch from gs device of pngalpha to png16m which for some reason gives the correct result for nil-surface now, while pngalpha does not. + Key off of N_OPERATORS as the loop control for easier trimming down of this test case when debugging. + Rename stroke_style parameter to style in backend->stroke parameter list. + Remove PS-specific reference images for many tests which are now using more fallback paths than before. + + ChangeLog | 46 ++++++ + ROADMAP | 10 +- + src/cairo-ps-surface.c | 196 ++++++++++++++++++++++--- + src/cairoint.h | 2 +- + test/cairo-test.c | 2 +- + test/caps-joins-ps-rgb24-ref.png | Bin 1420 -> 0 bytes + test/caps-sub-paths-ps-rgb24-ref.png | Bin 237 -> 0 bytes + test/clip-fill-rule-ps-rgb24-ref.png | Bin 309 -> 0 bytes + test/clip-nesting-ps-rgb24-ref.png | Bin 517 -> 0 bytes + test/clip-operator.c | 2 +- + test/clip-twice-ps-rgb24-ref.png | Bin 605 -> 0 bytes + test/dash-caps-joins-ps-rgb24-ref.png | Bin 2362 -> 0 bytes + test/dash-offset-negative-ps-rgb24-ref.png | Bin 202 -> 0 bytes + test/fill-and-stroke-ps-rgb24-ref.png | Bin 328 -> 0 bytes + test/fill-rule-ps-rgb24-ref.png | Bin 2167 -> 0 bytes + test/leaky-polygon-ps-rgb24-ref.png | Bin 353 -> 0 bytes + test/line-width-ps-rgb24-ref.png | Bin 242 -> 0 bytes + test/path-data-ps-rgb24-ref.png | Bin 440 -> 0 bytes + test/rectangle-rounding-error-ps-rgb24-ref.png | Bin 365 -> 0 bytes + test/show-text-current-point-ps-rgb24-ref.png | Bin 1477 -> 0 bytes + test/text-antialias-gray-ps-rgb24-ref.png | Bin 714 -> 0 bytes + test/text-antialias-none-ps-rgb24-ref.png | Bin 714 -> 0 bytes + test/text-antialias-subpixel-ps-rgb24-ref.png | Bin 714 -> 0 bytes + test/transforms-ps-rgb24-ref.png | Bin 418 -> 0 bytes + test/unantialiased-shapes-ps-rgb24-ref.png | Bin 9899 -> 0 bytes + 25 files changed, 231 insertions(+), 27 deletions(-) + +commit 48218fec48d1bfa2a93cc21f8f9df569e40ca79e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 8 17:16:21 2005 +0000 + + Add support to cairo_meta_surface for the 5 basic drawing operations. Remove _cairo_meta_surface_get_extents and _cairo_meta_surface_old_show_glyphs. + Remove size for _cairo_meta_surface_create. It is no longer needed now that get_extents is not a required backend function. + Track change in cairo_meta_surface_create no longer requiring a size + Qualify the glyphs argument to backend->show_glyphs as const. + Whitespace style cleanup. + + ChangeLog | 31 +++ + src/cairo-meta-surface-private.h | 99 ++++--- + src/cairo-meta-surface.c | 553 ++++++++++++++++++++++++--------------- + src/cairo-ps-surface.c | 6 +- + src/cairo-scaled-font.c | 4 +- + src/cairo-surface.c | 10 +- + src/cairoint.h | 8 +- + 7 files changed, 451 insertions(+), 260 deletions(-) + +commit c66a3db4c3e33f10ebadfa818f532e21e9b8927f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 8 11:44:18 2005 +0000 + + Split the 1.2.0 features into "essential" and "desired". + + ChangeLog | 5 +++++ + ROADMAP | 12 ++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit 75881041f009af01a7f13b3488db493d7a91b456 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 8 11:39:21 2005 +0000 + + Slip the 1.2 release by two weeks to 2005-11-15. + + ChangeLog | 4 ++++ + ROADMAP | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 632b948c8c162b90c8d8bc5eb56c505af89e61de +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 13:23:31 2005 +0000 + + Add new _cairo_array_allocate function for growing the array and getting a pointer to the buffer of new data. This is intended to be used in place of the abuse of passing data=NULL to _cairo_array_append_multiple. + Add new function to be used instead of the abuse of pasing data=NULL to cairo_pdf_ft_font_write. + Just return a status now instead of a pointer to the written buffer, since cairo_pdf_ft_font_allocate_write_buffer should now be used instead when a pointer is needed. + Switch to use cairo_pdf_ft_font_allocate_write_buffer. + Fix use of uninitialized status value. + initialization just to keep the compiler quiet about possibly uninitialized variables. + + ChangeLog | 39 +++++++++++++++++++++++++++++++++ + src/cairo-array.c | 46 +++++++++++++++++++++++++++++---------- + src/cairo-font-subset.c | 56 +++++++++++++++++++++++++++++++++++++----------- + src/cairo-meta-surface.c | 6 ++---- + src/cairo-pattern.c | 3 ++- + src/cairoint.h | 10 +++++++-- + 6 files changed, 130 insertions(+), 30 deletions(-) + +commit 3930b6ab775113cbeae7375cab3ed5854a795755 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:50:39 2005 +0000 + + Use field-by-field copying rather than whole structure copying. This avoids the hidden copies being overlooked in future code modifications. + + ChangeLog | 7 +++++++ + src/cairo-gstate.c | 28 +++++++++++++++++++--------- + 2 files changed, 26 insertions(+), 9 deletions(-) + +commit 9cf7fafffc4a6275f30bd946626ec9932a74caa0 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:48:01 2005 +0000 + + Fix to copy region if NULL. + + ChangeLog | 5 +++++ + src/cairo-clip.c | 4 +++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit 80e4c6307d0967b2a9ab0f1ca95443d5b00540e5 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:46:23 2005 +0000 + + Reorder function bodies to match the order of fields in the structure definition. Some style cleanups. + Fix bug in that several fields were not being copied. + + ChangeLog | 9 +++++++++ + src/cairo-clip.c | 43 ++++++++++++++++++++++++++----------------- + 2 files changed, 35 insertions(+), 17 deletions(-) + +commit 8d09247fcd456881ede2ef277baa7a9c71721b2c +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:29:37 2005 +0000 + + Two more instances of copy-and-reference in a single step. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 66e69f18ec4e61a195039dc100ac5db3f389f476 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:26:18 2005 +0000 + + Perform copy and reference in a single step. + Remove unnecessary checks for NULL before _destroy() functions. Reset pointers to NULL after _destroy(). + + ChangeLog | 9 +++++++++ + src/cairo-gstate.c | 21 +++++++++------------ + 2 files changed, 18 insertions(+), 12 deletions(-) + +commit 36523b96565a4b4015ddb3172c14690774edb92c +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:17:37 2005 +0000 + + Reorder function bodies to match to match the order of the fields in the structure definition. + + ChangeLog | 6 ++++++ + src/cairo-gstate.c | 14 +++++++------- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit 9796a54fa197206df914252a3511bfb30ce95039 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 10:02:06 2005 +0000 + + Style fix: test-and-bail rather than making the working body conditional. + Allow destroy to work on a NULL object. + + ChangeLog | 9 +++++++++ + src/cairo-gstate.c | 44 +++++++++++++++++++++++++------------------- + 2 files changed, 34 insertions(+), 19 deletions(-) + +commit 201d4e2ce76fe534009c6910cf42c5456b497047 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 09:49:51 2005 +0000 + + Add functions to initialize and copy cairo_stroke_style_t objects. + Use new _cairo_stroke_style functions rather than direct modification. + Add missing prototype for _cairo_font_options_init_copy. + + ChangeLog | 15 +++++++++ + src/Makefile.am | 1 + + src/cairo-gstate.c | 26 ++++----------- + src/cairo-stroke-style.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 16 +++++++++ + 5 files changed, 126 insertions(+), 19 deletions(-) + +commit a9e2cf8d9b6e49375cb6051b749c72b8dea97bfd +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 09:33:38 2005 +0000 + + Remove unused prototypes for _cairo_gstate_begin_group and _cairo_gstate_end_group. + + ChangeLog | 5 +++++ + src/cairoint.h | 6 ------ + 2 files changed, 5 insertions(+), 6 deletions(-) + +commit ed160b63a12a8018f6fa40a026c8b9bb942523c7 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 09:30:38 2005 +0000 + + Add documentation for _cairo_gstate_create, _cairo_gstate_init_copy, and _cairo_gstate_clone. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 31 +++++++++++++++++++++++++++++++ + 2 files changed, 36 insertions(+) + +commit fe324c44153cf37a51b51883780daee5500173be +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 7 09:26:47 2005 +0000 + + Add a function for copying font options rather than just using direct structure copying. + + ChangeLog | 6 ++++++ + src/cairo-font-options.c | 12 +++++++++++- + 2 files changed, 17 insertions(+), 1 deletion(-) + +commit f79d48640f26fd5c02d949ac759090dafaa002ec +Author: Carl Worth <cworth@cworth.org> +Date: Sat Nov 5 22:43:06 2005 +0000 + + Add missing declarations for status variables. Thanks to Mikael Hallendal for pointing this out. + + ChangeLog | 6 ++++++ + src/cairo-ps-surface.c | 2 ++ + 2 files changed, 8 insertions(+) + +commit 9341c254a00c732c9ce415233447ed47a7cbce7c +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 4 16:13:30 2005 +0000 + + Rename old, rarely used _cairo_array_append to _cairo_array_append_multiple. Add much more common _cairo_array_append. Fix both to return a cairo_status_t. Remove undocumented code to allow a non-copying append when elements is NULL, (let's not encourage unintialized data, shall we?) + Cleanup to not rely on undocumented copy-avoidance in _cairo_array_append. + Track change in number of arguments and return value of _cairo_array_append. + + ChangeLog | 31 ++++++++++++++++ + src/cairo-array.c | 96 +++++++++++++++++++++++++++++++----------------- + src/cairo-font-subset.c | 11 +++--- + src/cairo-meta-surface.c | 57 +++++++++++++++++++--------- + src/cairo-pdf-surface.c | 29 +++++++++++---- + src/cairo-ps-surface.c | 9 ++++- + src/cairo-win32-font.c | 19 +++++++--- + src/cairoint.h | 9 +++-- + 8 files changed, 185 insertions(+), 76 deletions(-) + +commit feef096e2586d162c4ccd072bfadc39f1de4502a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 4 15:15:30 2005 +0000 + + Add documentation for all _cairo_array interface functions. + + ChangeLog | 5 ++++ + src/cairo-array.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 78 insertions(+) + +commit 39eca22bfe2af91c926d00a4c3f19c03280b6c8b +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 4 11:16:38 2005 +0000 + + Rework support in the surface backend for the five basic drawing operations (paint, mask, stroke, fill, and show_glyphs). Now, all 5 operations have backend functions, and all use a consistent convention for argument naming and ordering. The old fill_path has been replaced with a new fill. The old show_glyphs function was recently renamed to old_show_glyphs and has not yet been ported to the new show_glyphs, (so all backends have a NULL show_glyphs function). In fact, of the 5 new backend functions, fill is the only one that has an implementation in any backend. As part of this cleanup a new cairo_stroke_style_t object is introduced to capture the many settings unique to the stroke operation, (line_width, line_cap, line_join, miter_limit, dash, num_dashes, and dash_offset). + Track changes in surface backend from fill_path to fill. + Track the new canonical argument naming and ordering for the 5 drawing operations. + Move various stroke style settings into new cairo_stroke_style_t. + Drop NULL fill_path backend function which no longer exists. + + ChangeLog | 57 +++++++++ + src/cairo-glitz-surface.c | 1 - + src/cairo-gstate-private.h | 10 +- + src/cairo-gstate.c | 161 ++++++++++-------------- + src/cairo-meta-surface-private.h | 8 +- + src/cairo-meta-surface.c | 71 ++++++----- + src/cairo-path-stroke.c | 142 ++++++++------------- + src/cairo-pdf-surface.c | 31 +++-- + src/cairo-ps-surface.c | 87 +++++++------ + src/cairo-surface.c | 265 ++++++++++++++++++--------------------- + src/cairo-win32-surface.c | 1 - + src/cairo-xcb-surface.c | 1 - + src/cairo-xlib-surface.c | 1 - + src/cairoint.h | 142 ++++++++++++--------- + 14 files changed, 497 insertions(+), 481 deletions(-) + +commit 719334c52cd8dd8aaf10284632b018fd1a3b9d6c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 1 16:40:37 2005 +0000 + + Rename surface->backend->show_glyphs to surface->backend->old_show_glyphs. + Move show_glyphs fallback from gstate to surface where it belongs. + Reviewed by: keithp + + ChangeLog | 29 ++++++++ + src/cairo-atsui-font.c | 26 +++---- + src/cairo-glitz-surface.c | 26 +++---- + src/cairo-gstate.c | 109 +++------------------------ + src/cairo-image-surface.c | 2 +- + src/cairo-meta-surface.c | 28 +++---- + src/cairo-pdf-surface.c | 26 +++---- + src/cairo-ps-surface.c | 78 ++++++++++---------- + src/cairo-quartz-surface.c | 2 +- + src/cairo-surface.c | 180 ++++++++++++++++++++++++++++++++++++++++----- + src/cairo-win32-surface.c | 2 +- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 104 +++++++++++++------------- + src/cairoint.h | 34 +++++---- + 14 files changed, 372 insertions(+), 276 deletions(-) + +commit a3ae0aecc47863145e5dd9f461d696e89c9e7c30 +Author: Keith Packard <keithp@keithp.com> +Date: Tue Nov 1 10:33:34 2005 +0000 + + Clean up argument order for _fallback_stroke to match other functions + + ChangeLog | 6 ++++++ + src/cairo-surface.c | 6 +++--- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit a7228cc37a0cd967296e41639e624e9af1520a22 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 31 16:55:21 2005 +0000 + + Originally 2005-10-28 Keith Packard <keithp@keithp.com>: + Remove pen_regular field from the gstate. + Move stroke fallback from gstate to surface where it belongs. + Eliminate dependence on cairo_gstate_t object. + Fix to include just cairo-clip-private.h rather than cairo-gstate.private.h. + + ChangeLog | 28 +++++++ + src/cairo-gstate-private.h | 2 - + src/cairo-gstate.c | 113 ++++++++++++--------------- + src/cairo-meta-surface.c | 2 +- + src/cairo-path-stroke.c | 185 ++++++++++++++++++++++++++++++--------------- + src/cairo-pen.c | 27 +++---- + src/cairo-surface.c | 90 +++++++++++++++++++++- + src/cairoint.h | 41 +++++++++- + 8 files changed, 335 insertions(+), 153 deletions(-) + +commit 3cae05c4c503ce71c4967bd3f748cdfa3bb76ebc +Author: Tor Lillqvist <tml@novell.com> +Date: Mon Oct 31 11:10:13 2005 +0000 + + Call _cairo_scaled_glyph_set_path(). + + ChangeLog | 5 +++++ + src/cairo-win32-font.c | 4 ++++ + 2 files changed, 9 insertions(+) + +commit 1a25220634013c4ef475f92110ede366e0847572 +Author: Keith Packard <keithp@keithp.com> +Date: Fri Oct 28 21:00:42 2005 +0000 + + Use _cairo_pattern_get_extents in _fallback_paint to bound paint operators. + + ChangeLog | 6 ++++++ + src/cairo-surface.c | 27 ++++++++++++++++++--------- + 2 files changed, 24 insertions(+), 9 deletions(-) + +commit 83ff8ea194763659be84e7cfa59ad2e1711fb3da +Author: Keith Packard <keithp@keithp.com> +Date: Fri Oct 28 20:49:59 2005 +0000 + + Bound mask fallback operation by transformed mask and source. This should speed up any applications calling cairo_mask with a bounded source or mask operand. + + ChangeLog | 9 ++++++ + src/cairo-pattern.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-surface.c | 23 ++++++++++----- + src/cairoint.h | 4 +++ + 4 files changed, 113 insertions(+), 8 deletions(-) + +commit 93cbc71a7998485d768a3b4cb4f26b2a443c81c5 +Author: Keith Packard <keithp@keithp.com> +Date: Fri Oct 28 20:41:22 2005 +0000 + + Split _cairo_operator_bounded into two separate functions _cairo_operator_bounded_by_mask and _cairo_operator_bound_by_source to distinguish between how operators use source and mask operands. + + ChangeLog | 18 +++++++++++++++ + src/cairo-gstate.c | 56 ++++++++++++++++++++++++++++++++++++++++------- + src/cairo-image-surface.c | 6 ++--- + src/cairo-xlib-surface.c | 8 +++---- + src/cairoint.h | 5 ++++- + 5 files changed, 75 insertions(+), 18 deletions(-) + +commit 1540504bd66a75a2fed8352ebfe8b029b3f199dd +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 27 17:16:46 2005 +0000 + + Fix leak of pattern (missing _cairo_pattern_fini). + Move mask fallback from gstate to surface where it belongs. + Temporarily export some previously private cairo_gstate functions, (soon to become private cairo_fallback functions). + + ChangeLog | 17 +++++++++++ + src/cairo-gstate.c | 76 ++++++------------------------------------------- + src/cairo-surface.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 25 ++++++++++++++++- + 4 files changed, 131 insertions(+), 68 deletions(-) + +commit ce7b19fc3434ff733fd6f00add017386ad4a7974 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 27 15:06:53 2005 +0000 + + Move paint fallback from gstate to surface where it belongs. + Add clip pointer to surface. + + ChangeLog | 11 +++++++++ + src/cairo-gstate.c | 27 +++++----------------- + src/cairo-surface.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++- + src/cairoint.h | 7 ++++++ + 4 files changed, 89 insertions(+), 22 deletions(-) + +commit e406f4b0f0fc90dc6ad8aba000122a7345195478 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 25 16:02:08 2005 +0000 + + Add explicit NULLs for unimplmented backend functions to better document what might be improved here. + + ChangeLog | 5 +++++ + src/cairo-xcb-surface.c | 8 +++++++- + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit 8471ad29abb7abf96b5762675dd05b6ca3cca186 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 25 15:57:28 2005 +0000 + + Add critical bug #4863 to the 1.0.4 roadmap. + + ChangeLog | 4 ++++ + ROADMAP | 1 + + 2 files changed, 5 insertions(+) + +commit 09114cc62759efaee4102d05d6e0331193dba75e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 25 15:55:57 2005 +0000 + + Add mention of suspected bug in PS backend. + + BUGS | 10 ++++++++++ + ChangeLog | 4 ++++ + 2 files changed, 14 insertions(+) + +commit 16d79e212986d814bdc03b2f83c03371811ebb9f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 18 16:09:21 2005 +0000 + + Mark the composite-integer-translate-source test as now passing for the PS backend (6 to go). + Use fallbacks for any operation using a pattern other than a solid pattern, since it's the only type that will actually emit anything right now. + Add comments indicating these functions are not yet implemented. + + ChangeLog | 14 ++++++++++++++ + ROADMAP | 2 +- + src/cairo-ps-surface.c | 13 +++++++++++++ + 3 files changed, 28 insertions(+), 1 deletion(-) + +commit 85abc42302529192a3e3eecf0bc3ff54258cbb4e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 18 15:58:32 2005 +0000 + + Mark the operator-source and trap-clip tests as now passing for the PS backend (7 to go). + Replace the surface->fallback_region with a page-level surface->fallback Boolean instead, since that's all it was being used as anyway. + Do nothing in the ps_output->fallback case. + Do nothing in the ! ps_output->fallback case. + Reviewed by: keithp + + ChangeLog | 20 ++++++++++++++++++++ + ROADMAP | 4 ++-- + src/cairo-ps-surface.c | 38 ++++++++++++++++++++++++-------------- + 3 files changed, 46 insertions(+), 16 deletions(-) + +commit c88dbd077a8f501409f7a9ecd5b3f93aad21bdfa +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 18 12:41:01 2005 +0000 + + Added list of 9 remaining PS backend test suite failures to the 1.2.0 roadmap. + + ChangeLog | 5 +++++ + ROADMAP | 10 +++++++++- + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit d93767c6ee4ca18ad2c93d8fce2ec82dca7ee21c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 18 12:04:41 2005 +0000 + + Add reference images for antialiasing modes which are basically not applicable to the PS output. + + ChangeLog | 7 +++++++ + test/text-antialias-none-ps-rgb24-ref.png | Bin 0 -> 714 bytes + test/text-antialias-subpixel-ps-rgb24-ref.png | Bin 0 -> 714 bytes + 3 files changed, 7 insertions(+) + +commit 99d02f2adc24c98b6f2e2d49f4cb909ff35d7926 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 13 21:04:28 2005 +0000 + + Add verified image for PS output for dash-offset-negative. + + ChangeLog | 6 ++++++ + test/Makefile.am | 1 + + test/dash-offset-negative-ps-rgb24-ref.png | Bin 0 -> 202 bytes + 3 files changed, 7 insertions(+) + +commit 4f97b2edb533c9b0329a8d7ec8e4f16447a04f12 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 13 21:00:52 2005 +0000 + + New function to create a snapshot copy of a pattern. + Port code to use _init_pattern_with_snapshot rather than _cairo_pattern_init_copy for all source and mask patterns. + New function to create a snapshot copy of a surface (still preliminary---no support for meta-surfaces or any other surface for which acquire_source_surface will fail). + Add new surface->is_snapshot and initialize to FALSE. + Assert that none of these surface-modifying functions are ever called with a snapshot surface. + Reviewed by: keithp, otaylor + + ChangeLog | 37 +++++++++++++++++++ + src/cairo-meta-surface.c | 33 ++++++++++++++--- + src/cairo-surface.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++- + src/cairoint.h | 6 +++ + 4 files changed, 165 insertions(+), 6 deletions(-) + +commit 9d27993cedf512f17b232986b6667e26c3a06ed0 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 13 20:15:29 2005 +0000 + + Add comment for obviously broken function. + + ChangeLog | 5 +++++ + src/cairo-pdf-surface.c | 2 ++ + 2 files changed, 7 insertions(+) + +commit 31a561e2c233ab93c6e644e00d8e6d26e12b9bef +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 13 16:55:14 2005 +0000 + + Push fill_path fallbacks down from gstate into the surface where all the other fallbacks are. + Add _cairo_surface_is_meta. + Add antialias to the fill_path meta-surface command. + Add an antialias parameter to the backend fill_path function. + Fix test description. + Reviewed by: keithp + + ChangeLog | 26 ++++++++++++++++ + src/cairo-gstate.c | 27 +++-------------- + src/cairo-meta-surface-private.h | 3 ++ + src/cairo-meta-surface.c | 22 ++++++++++++-- + src/cairo-pdf-surface.c | 9 +++--- + src/cairo-ps-surface.c | 22 ++++++++++++-- + src/cairo-surface.c | 65 +++++++++++++++++++++++++++++++++------- + src/cairoint.h | 21 +++++++------ + test/fill-and-stroke.c | 2 +- + 9 files changed, 144 insertions(+), 53 deletions(-) + +commit 097f240c6d2403f1a3530c61a8c437444f936d97 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 13 07:33:07 2005 +0000 + + Fix indentation. + + ChangeLog | 5 +++++ + src/cairo-gstate.c | 22 +++++++++++----------- + 2 files changed, 16 insertions(+), 11 deletions(-) + +commit d31d5db04fe5706e26f117def1fffda627ccf8cf +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 13 07:30:15 2005 +0000 + + Increment libtool versioning to 5:0:3 in anticipation of 1.2.0 which will add interfaces. The motivation for this is to make the 1.1.1 release install a library which will be considered newer than 1.0.2. + Add a release-verify-soname-major check to verify that the soname major number is always 2 as part of the release-publish target. + Reviewed by: otaylor + + ChangeLog | 13 +++++++++++++ + Makefile.am | 10 +++++++++- + configure.in | 6 +++--- + 3 files changed, 25 insertions(+), 4 deletions(-) + +commit cd859a23d022d2aa84649e6e076cd75834800263 +Author: Tor Lillqvist <tml@novell.com> +Date: Wed Oct 12 15:05:09 2005 +0000 + + Intersect clip region with target surface so we don't waste time and memory. + Reviewed by: cworth + + ChangeLog | 7 +++++++ + src/cairo-clip.c | 9 ++++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 1fa004f2a6a8cb7147657c74a3b3fc469b778f34 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 12 14:23:11 2005 +0000 + + Add extend-reflect to the 1.2.0 roadmap. Mark dashed splines and clip-all as fixed. + Mark extend-reflect as an expected failure. + + ChangeLog | 9 +++++++++ + ROADMAP | 6 ++++-- + test/Makefile.am | 1 + + test/extend-reflect.c | 3 ++- + 4 files changed, 16 insertions(+), 3 deletions(-) + +commit 7dcbcdf75c5d9a7a691d741ecd1d36160fb725e3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 12 13:37:00 2005 +0000 + + Add a couple of tests to improve our coverage (clipping under both fill rules). + + ChangeLog | 14 ++++ + test/.cvsignore | 2 + + test/Makefile.am | 6 ++ + test/clip-fill-rule-pixel-aligned-ref.png | Bin 0 -> 195 bytes + test/clip-fill-rule-pixel-aligned-rgb24-ref.png | Bin 0 -> 194 bytes + test/clip-fill-rule-pixel-aligned.c | 95 ++++++++++++++++++++++++ + test/clip-fill-rule-ps-rgb24-ref.png | Bin 0 -> 309 bytes + test/clip-fill-rule-ref.png | Bin 0 -> 431 bytes + test/clip-fill-rule-rgb24-ref.png | Bin 0 -> 495 bytes + test/clip-fill-rule.c | 79 ++++++++++++++++++++ + 10 files changed, 196 insertions(+) + +commit 990dfde44762a2e85f4d85f1e2a93a7b976533cd +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 12 13:33:38 2005 +0000 + + Add return value at ASSERT_NOT_REACHED. + + ChangeLog | 5 +++++ + src/cairo-pdf-surface.c | 1 + + 2 files changed, 6 insertions(+) + +commit 67d20cd4b247c4c9fef88067915d27e934b4356d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 12 13:24:35 2005 +0000 + + Doc churn + + doc/public/tmpl/cairo-pattern.sgml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d794c624cc81512ab89301f0bb7bc033a9006d00 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Oct 11 13:20:44 2005 +0000 + + Implement non-uniformly spaced color stops for PDF gradients. Patch from Jens Taprogge (#4722). + + ChangeLog | 8 +++ + src/cairo-pdf-surface.c | 155 +++++++++++++++++++++++++++++++++++++----------- + 2 files changed, 127 insertions(+), 36 deletions(-) + +commit f1044bb3c7753e17833a2dc0db508a80eeb810b7 +Author: Billy Biggs <vektor@dumbterm.net> +Date: Mon Oct 10 12:45:15 2005 +0000 + + Call it CAIRO_EXTEND_PAD instead of CAIRO_EXTEND_NEAREST. + Update everybody to use _PAD instead of _NEAREST. + + ChangeLog | 14 ++++++++++++++ + src/cairo-glitz-surface.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + src/cairo.h | 4 ++-- + src/cairoint.h | 2 +- + 8 files changed, 22 insertions(+), 8 deletions(-) + +commit f39816e0161d357d8a23ae943d1bd70633795d63 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Oct 10 09:36:39 2005 +0000 + + Transform source pattern for _cairo_surface_fill_path() also (#4673). + Use cairo_fill_preserve() instead of cairo_save()/cairo_restore(). + Add missing return values. + + ChangeLog | 11 +++++++++++ + src/cairo-gstate.c | 7 ++++++- + src/cairo-pdf-surface.c | 7 +++---- + test/pdf-surface.c | 6 +----- + test/ps-surface.c | 6 +----- + 5 files changed, 22 insertions(+), 15 deletions(-) + +commit 7fdf45ce61f958aaecf6e8c7042947d3ebbcfd9d +Author: Billy Biggs <vektor@dumbterm.net> +Date: Mon Oct 10 09:16:21 2005 +0000 + + Add documentation for the extend modes. + Document the extend functions for patterns. + Remove some redundancy in the documentation. + + ChangeLog | 10 ++++++++++ + src/cairo-pattern.c | 20 ++++++++++++++++++++ + src/cairo.c | 4 ---- + src/cairo.h | 13 +++++++++++++ + 4 files changed, 43 insertions(+), 4 deletions(-) + +commit 935764d91c6fee4aa30ea59464f4670e5f70f7c8 +Author: Keith Packard <keithp@keithp.com> +Date: Sun Oct 9 20:40:12 2005 +0000 + + Switch fallback from list of rects to region. Check operator and patterns for non-ps drawing ability. Operators can sometimes be always opaque, independent of the pattern, sometimes always translucent, independent of the pattern and sometimes depend on whether is translucent. + reviewed by: cworth + + ChangeLog | 20 ++++++ + src/cairo-ps-surface.c | 183 +++++++++++++++++++++++++++++++++++++++---------- + 2 files changed, 165 insertions(+), 38 deletions(-) + +commit a0e970fad268c90ab79a682116773b21d4120ccc +Author: Keith Packard <keithp@keithp.com> +Date: Sun Oct 9 20:31:44 2005 +0000 + + Add const to _cairo_surface_is_image parameter + + ChangeLog | 6 ++++++ + src/cairo-image-surface.c | 2 +- + src/cairoint.h | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit 2a3593e35ccedb9f9eb82390652e566dc651896b +Author: Carl Worth <cworth@cworth.org> +Date: Sun Oct 9 20:01:42 2005 +0000 + + Doc SGML churn + + doc/public/tmpl/cairo-pattern.sgml | 1 + + 1 file changed, 1 insertion(+) + +commit b207dfe8228d624b88ee871c1f82d0321df4a3ef +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Oct 9 14:51:55 2005 +0000 + + Add a new test to start investigating bug 4183. + The new test. + Ignore the new test. + + ChangeLog | 6 ++++++ + test/.cvsignore | 1 + + test/Makefile.am | 4 ++++ + test/extend-reflect.c | 37 +++++++++++++++++++++++++++++++++++++ + 4 files changed, 48 insertions(+) + +commit bb86d6664d607cb4f6b88618209d1c5dc74683ba +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Oct 9 14:29:54 2005 +0000 + + Make space for the new bits needed by expand. + + pixman/ChangeLog | 4 ++++ + pixman/src/icimage.h | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit eeb56e713b26e55cf1a5704d1e09b65457a7c457 +Author: Keith Packard <keithp@keithp.com> +Date: Sun Oct 9 14:28:15 2005 +0000 + + The comment said 'blend over white', the code did 'blend under garbage'. I made the code look like the comment. More tests pass now. mmm. + reviewed by: cworth + + ChangeLog | 9 +++++++++ + src/cairo-ps-surface.c | 7 ++++++- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 951c7a65924146c6acf6658ea17eca946fe0f069 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Oct 9 13:33:21 2005 +0000 + + Make surface image data static to work around a bug in cairo-meta-surface.c (not copying source surface pattern data). + + ChangeLog | 11 +++++++++++ + test/filter-nearest-offset.c | 2 +- + test/mask-ctm.c | 2 +- + test/mask-surface-ctm.c | 2 +- + test/paint-with-alpha.c | 2 +- + test/scale-source-surface-paint.c | 2 +- + test/source-surface-scale-paint.c | 2 +- + 7 files changed, 17 insertions(+), 6 deletions(-) + +commit ea7ac21d3b5c488e3d1ec82c18d66ae3f356d16f +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Oct 9 09:18:16 2005 +0000 + + Add a "nearest" extend mode, where the closest pixel is repeated for pixels outside of the source area. Note that for gradients, applications which had explicitly set a repeat mode of NONE will now need to change to use NEAREST to get the same behaviour. + Split CARIO_EXTEND_DEFAULT to indicate defaults for surfaces and gradients. The default for gradients is still the NEAREST beaviour. + Support the NEAREST mode, change NONE to be TRANSPARENT. + Update the extend mode code to use the pixman support. + Handle NEAREST, note that support for NONE is not yet handled for gradients. + Add a check for NEAREST but don't do anything useful. + Add a check for NEAREST but don't do anything useful. + Update a comment about the extend support in the image backend. + reviewed by: davidr, cworth, otaylor + + ChangeLog | 26 ++++++++++++++++++++++++++ + src/cairo-glitz-surface.c | 5 ++++- + src/cairo-image-surface.c | 18 ++++++------------ + src/cairo-pattern.c | 16 +++++++++++----- + src/cairo-pdf-surface.c | 2 -- + src/cairo-xcb-surface.c | 2 ++ + src/cairo-xlib-surface.c | 1 + + src/cairo.h | 3 ++- + src/cairoint.h | 3 ++- + 9 files changed, 54 insertions(+), 22 deletions(-) + +commit 32eb6ce206e225c5ae972d44fcd704b807555dd1 +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Oct 9 09:09:53 2005 +0000 + + Add extended repeat modes, copied from XRender. + Cleanup to use the new repeat modes. + Be explicit about which repeat mode we want. + reviewed by: davidr, cworth, otaylor + + pixman/ChangeLog | 10 ++++++++++ + pixman/src/icimage.c | 9 +++++---- + pixman/src/icrect.c | 2 +- + pixman/src/pixman.h | 14 +++++++++++--- + 4 files changed, 27 insertions(+), 8 deletions(-) + +commit a8dbfc42a75d1304bd1ddb6f885f507d47e96e76 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Oct 8 22:44:56 2005 +0000 + + Remove 1.0.2 entries now that it is out. Note that the PS backend has now been added to the test suite. + + ChangeLog | 5 +++++ + ROADMAP | 17 +++++------------ + 2 files changed, 10 insertions(+), 12 deletions(-) + +commit e26dbd950084477ffe26ba405fd7558ed74196cf +Author: Carl Worth <cworth@cworth.org> +Date: Sat Oct 8 13:04:18 2005 +0000 + + Add ps-backend-specific reference images for test for which the current output is fine, but just happens to not be identical to the existing reference images, (ie. just minor differences shape-boundary pixels). + + ChangeLog | 17 +++++++++++++++++ + test/caps-sub-paths-ps-rgb24-ref.png | Bin 0 -> 237 bytes + test/dash-caps-joins-ps-rgb24-ref.png | Bin 0 -> 2362 bytes + test/fill-and-stroke-ps-rgb24-ref.png | Bin 0 -> 328 bytes + test/fill-rule-ps-rgb24-ref.png | Bin 0 -> 2167 bytes + test/leaky-polygon-ps-rgb24-ref.png | Bin 0 -> 353 bytes + test/line-width-ps-rgb24-ref.png | Bin 0 -> 242 bytes + test/path-data-ps-rgb24-ref.png | Bin 0 -> 440 bytes + test/rectangle-rounding-error-ps-rgb24-ref.png | Bin 0 -> 365 bytes + test/show-text-current-point-ps-rgb24-ref.png | Bin 0 -> 1477 bytes + test/text-antialias-gray-ps-rgb24-ref.png | Bin 0 -> 714 bytes + test/transforms-ps-rgb24-ref.png | Bin 0 -> 418 bytes + 12 files changed, 17 insertions(+) + +commit 94dece56a5dca2f10b9c8d2914ff62177a88410b +Author: Carl Worth <cworth@cworth.org> +Date: Sat Oct 8 11:58:20 2005 +0000 + + Ignore output of PS tests. + Fix the PS tests to work again, (track change in create_surface interface). + + ChangeLog | 7 +++++++ + test/.cvsignore | 2 ++ + test/cairo-test.c | 9 +++++++-- + 3 files changed, 16 insertions(+), 2 deletions(-) + +commit 24dce0dbb30ca7864416185b11cafff42db9a2b7 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Oct 8 11:57:45 2005 +0000 + + Enable PS and PDF backends by default, (in preparation for 1.2.0) + + ChangeLog | 5 +++++ + configure.in | 15 ++++----------- + 2 files changed, 9 insertions(+), 11 deletions(-) + +commit 4d84a70b9f4799d66641a3a0c5438098011690c2 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Oct 8 10:50:08 2005 +0000 + + Fix typo leading to truncated error message (Christian Biesinger <cbiesinger@web.de>). + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 27e12fc1dbbed563788a8088b31459ae6cffb77a +Author: Kristian Høgsberg <krh@redhat.com> +Date: Fri Oct 7 13:21:01 2005 +0000 + + Apply patch from #4672 by Jens Taprogge to implement color stop sorting and multiple color stops for gradients. + + ChangeLog | 11 +++++ + src/cairo-pdf-surface.c | 117 +++++++++++++++++++++++++++++++++++------------- + 2 files changed, 98 insertions(+), 30 deletions(-) + +commit e6239b1d93bb88594310e57d8e7a2fd9e655ca58 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 6 12:50:08 2005 +0000 + + Add ChangeLog information for code that was accidentally committed along with an earlier bug fix: + Add missing initialization for ximage.xoffset. + Ignore the -argb32-out.png and -rgb24-out.png images as well. + Pass a format to the surface create functions. (create_image_surface): Condense create_argb_image_surface and create_rgb_image_surface into a single function. (create_xlib_surface): Add support for CAIRO_FORMAT_RGB24 in addition to CAIRO_FORMAT_ARGB32. Add a new target for testing xlib with CAIRO_FORMAT_RGB24. + + ChangeLog | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 74af57339c271ab26b5e32647ef26b23929a57a7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 6 11:32:54 2005 +0000 + + Add missing initialization for ximage.xoffset. + + ChangeLog | 5 +++++ + src/cairo-xlib-surface.c | 1 + + test/.cvsignore | 6 ++++++ + test/cairo-test.c | 45 +++++++++++++++++++++++---------------------- + 4 files changed, 35 insertions(+), 22 deletions(-) + +commit de3358f883eabfe819f68bc2c2c8c4d43a4d0056 +Author: Anders Carlsson <andersca@imendio.com> +Date: Tue Oct 4 13:48:25 2005 +0000 + + Invoke PKG_PROG_PKG_CONFIG so $PKG_CONFIG will be set early on. + + ChangeLog | 5 +++++ + configure.in | 4 ++++ + 2 files changed, 9 insertions(+) + +commit 1810eaf8f2317faa976d0be3f538e8d036227f22 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 3 17:49:25 2005 +0000 + + Add notes for the 1.0.2 release. + + ChangeLog | 4 ++++ + NEWS | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 86 insertions(+) + +commit 9529d20d323ecf9012b010cf16b2df52e405ba2b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 3 17:39:33 2005 +0000 + + Add a couple of potential bugs to BUGS. + + BUGS | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit cdaa48655c328fd2fd34c264b6f8e1d9ec2af1f7 +Author: Anders Carlsson <andersca@imendio.com> +Date: Fri Sep 30 08:31:36 2005 +0000 + + Bring the ATSUI backend up to date wrt the new font backend changes. Also, add cairo_atsui_font_face_create_for_atsu_font_id which takes an ATSUFontID and returns a cairo_font_face_t. + + ChangeLog | 24 ++ + src/cairo-atsui-font.c | 708 +++++++++++++++++++++++-------------------------- + src/cairo-atsui.h | 3 + + 3 files changed, 359 insertions(+), 376 deletions(-) + +commit a0286781793bf2da6ba67029c8719eb614cb345a +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Thu Sep 29 20:00:14 2005 +0000 + + simplify id initialisation of last patch + reviewed by: keithp + + ChangeLog | 5 +++++ + src/cairo-hull.c | 13 +++++++------ + 2 files changed, 12 insertions(+), 6 deletions(-) + +commit 04170ed2854c7cb4506ddc3c64470748f1e67ffd +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Thu Sep 29 17:34:31 2005 +0000 + + ChangeLog cosmetics. + + ChangeLog | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit fa2d0ab5b7744fa929e77ee61e93476c425777e3 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Thu Sep 29 17:26:20 2005 +0000 + + Using a pointer comparison as the fallback total order was wrong - these pointers are not stable. So we introduce our own total order instead. + mark 4599 as fixed + reviewed by: cworth + + ChangeLog | 10 ++++++++++ + ROADMAP | 2 +- + src/cairo-hull.c | 14 +++++++++----- + 3 files changed, 20 insertions(+), 6 deletions(-) + +commit d3e7dad53eb25aff2608af08057bb86d864de145 +Author: Keith Packard <keithp@keithp.com> +Date: Thu Sep 29 14:31:08 2005 +0000 + + Add rgb24 surface tests, support per-target reference images and support PS surface testing + reviewed by: cworth + + ChangeLog | 69 ++++++++ + test/Makefile.am | 159 +++++++++++++------ + test/a8-mask-rgb24-ref.png | Bin 0 -> 128 bytes + test/cairo-test.c | 176 ++++++++++++++++++--- + test/caps-joins-ps-rgb24-ref.png | Bin 0 -> 1420 bytes + test/caps-joins-rgb24-ref.png | Bin 0 -> 1398 bytes + test/caps-sub-paths-rgb24-ref.png | Bin 0 -> 186 bytes + test/clip-all-rgb24-ref.png | Bin 0 -> 114 bytes + test/clip-nesting-ps-rgb24-ref.png | Bin 0 -> 517 bytes + test/clip-nesting-rgb24-ref.png | Bin 0 -> 846 bytes + test/clip-operator-rgb24-ref.png | Bin 0 -> 21014 bytes + test/clip-twice-ps-rgb24-ref.png | Bin 0 -> 605 bytes + test/clip-twice-rgb24-ref.png | Bin 0 -> 1278 bytes + ...ite-integer-translate-over-repeat-rgb24-ref.png | Bin 0 -> 353 bytes + .../composite-integer-translate-over-rgb24-ref.png | Bin 0 -> 13041 bytes + ...omposite-integer-translate-source-rgb24-ref.png | Bin 0 -> 14017 bytes + test/create-from-png-rgb24-ref.png | Bin 0 -> 115 bytes + test/create-from-png-stream-rgb24-ref.png | Bin 0 -> 115 bytes + test/dash-caps-joins-rgb24-ref.png | Bin 0 -> 2946 bytes + test/dash-offset-negative-rgb24-ref.png | Bin 0 -> 170 bytes + test/fill-and-stroke-rgb24-ref.png | Bin 0 -> 299 bytes + test/fill-rule-rgb24-ref.png | Bin 0 -> 2320 bytes + test/filter-nearest-offset-rgb24-ref.png | Bin 0 -> 254 bytes + test/gradient-alpha-rgb24-ref.png | Bin 0 -> 147 bytes + test/leaky-polygon-rgb24-ref.png | Bin 0 -> 344 bytes + test/line-width-rgb24-ref.png | Bin 0 -> 199 bytes + test/linear-gradient-rgb24-ref.png | Bin 0 -> 12719 bytes + test/mask-ctm-rgb24-ref.png | Bin 0 -> 140 bytes + test/mask-rgb24-ref.png | Bin 0 -> 73124 bytes + test/mask-surface-ctm-rgb24-ref.png | Bin 0 -> 140 bytes + test/move-to-show-surface-rgb24-ref.png | Bin 0 -> 115 bytes + test/nil-surface-rgb24-ref.png | Bin 0 -> 106 bytes + test/operator-clear-rgb24-ref.png | Bin 0 -> 5704 bytes + test/operator-source-rgb24-ref.png | Bin 0 -> 16909 bytes + test/paint-rgb24-ref.png | Bin 0 -> 116 bytes + test/paint-with-alpha-rgb24-ref.png | Bin 0 -> 146 bytes + test/path-data-rgb24-ref.png | Bin 0 -> 523 bytes + test/pixman-rotate-rgb24-ref.png | Bin 0 -> 385 bytes + test/rectangle-rounding-error-rgb24-ref.png | Bin 0 -> 298 bytes + test/rel-path-rgb24-ref.png | Bin 0 -> 115 bytes + test/scale-source-surface-paint-rgb24-ref.png | Bin 0 -> 146 bytes + test/self-copy-rgb24-ref.png | Bin 0 -> 291 bytes + test/self-intersecting-rgb24-ref.png | Bin 0 -> 304 bytes + test/set-source-rgb24-ref.png | Bin 0 -> 114 bytes + test/show-text-current-point-rgb24-ref.png | Bin 0 -> 2173 bytes + test/source-clip-rgb24-ref.png | Bin 0 -> 180 bytes + test/source-surface-scale-paint-rgb24-ref.png | Bin 0 -> 136 bytes + test/surface-pattern-rgb24-ref.png | Bin 0 -> 194 bytes + test/text-antialias-gray-rgb24-ref.png | Bin 0 -> 995 bytes + test/text-antialias-none-rgb24-ref.png | Bin 0 -> 284 bytes + test/text-antialias-subpixel-rgb24-ref.png | Bin 0 -> 1121 bytes + test/text-pattern-rgb24-ref.png | Bin 0 -> 2686 bytes + test/text-rotate-rgb24-ref.png | Bin 0 -> 16508 bytes + test/transforms-rgb24-ref.png | Bin 0 -> 318 bytes + test/translate-show-surface-rgb24-ref.png | Bin 0 -> 115 bytes + test/trap-clip-rgb24-ref.png | Bin 0 -> 64724 bytes + test/unantialiased-shapes-ps-rgb24-ref.png | Bin 0 -> 9899 bytes + test/unantialiased-shapes-rgb24-ref.png | Bin 0 -> 4449 bytes + test/unbounded-operator-rgb24-ref.png | Bin 0 -> 7581 bytes + 59 files changed, 330 insertions(+), 74 deletions(-) + +commit 76634781e20b1854e4b49a70b98d9f6900c3aedf +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 29 10:09:59 2005 +0000 + + Oops. Reverting debug output that was mistakenly committed. + + ChangeLog | 5 +++++ + src/cairo-surface.c | 31 ------------------------------- + 2 files changed, 5 insertions(+), 31 deletions(-) + +commit 4ef5f08563c3f149d52eed26aa16965740ad8de6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 29 06:49:47 2005 +0000 + + Add date of 2005-10-03 for 1.0.2. Add 4630 to the 1.0.2 roadmap. + + ChangeLog | 5 +++++ + ROADMAP | 6 +++--- + src/cairo-surface.c | 31 +++++++++++++++++++++++++++++++ + 3 files changed, 39 insertions(+), 3 deletions(-) + +commit 303e3e9748b6e1970c06203c192ea1b2743f10df +Author: Tor Lillqvist <tml@novell.com> +Date: Wed Sep 28 10:35:55 2005 +0000 + + Use _cairo_utf8_to_utf16 for character conversion. + + ChangeLog | 5 +++++ + src/cairo-atsui-font.c | 24 ++++++------------------ + 2 files changed, 11 insertions(+), 18 deletions(-) + +commit dc711cd88d6cc5aa87b41bd72a2ab2fe67554760 +Author: Tor Lillqvist <tml@novell.com> +Date: Wed Sep 28 10:25:23 2005 +0000 + + Note that Bug #4612 (Text not being drawn if first character entirely out of surface) is now fixed. + Add cast so that sign conversion doesn't alter comparison. + + ChangeLog | 8 ++++++++ + ROADMAP | 2 +- + src/cairo-win32-font.c | 8 ++++---- + 3 files changed, 13 insertions(+), 5 deletions(-) + +commit f41377bc0cbd2dd9df13d1d09437349eb2bcf62a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 27 15:07:15 2005 +0000 + + Add 4612 to the 1.0.2 roadmap. + + ChangeLog | 4 ++++ + ROADMAP | 2 ++ + 2 files changed, 6 insertions(+) + +commit 58113099f987c003eba22ae6e084520ea920e688 +Author: Tor Lillqvist <tml@novell.com> +Date: Tue Sep 27 13:22:46 2005 +0000 + + Note that Bug #4602 (use of 0x0 images causes win32 backend failure) is now fixed. + Avoid creating size-0 bitmap, which fails. + + ChangeLog | 8 ++++++++ + ROADMAP | 2 +- + src/cairo-win32-surface.c | 4 ++-- + 3 files changed, 11 insertions(+), 3 deletions(-) + +commit abaf346810dc5756d3c12b1cc24e24b1d6acf165 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 27 12:44:32 2005 +0000 + + Note that bug #4409 (Dashes are missing initial caps) is now fixed. + Move face-flipping from inside _cairo_stroker_add_caps to new _cairo_stroker_add_leading_cap variant of _cairo_stoker_add_cap. + Change to call _cairo_stroker_add_leading_cap or _cairo_stroker_add_trailing_cap as appropriate. + Remove dash-caps-joins from the XFAIL list and add reference image. + + ChangeLog | 21 ++++++++++++++++++ + ROADMAP | 2 +- + src/cairo-path-stroke.c | 51 +++++++++++++++++++++++++++++-------------- + test/Makefile.am | 1 - + test/dash-caps-joins-ref.png | Bin 0 -> 2347 bytes + test/dash-caps-joins.c | 3 +-- + 6 files changed, 58 insertions(+), 20 deletions(-) + +commit 8a6792fe4128a4c15d6d0e798643626416e82a6c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 27 11:35:18 2005 +0000 + + Add two test cases. One for caps and joins (passes), and one for dashed caps and joins, (fails, see bug #4409). + + ChangeLog | 10 +++++ + test/.cvsignore | 2 + + test/Makefile.am | 7 ++++ + test/caps-joins-ref.png | Bin 0 -> 1262 bytes + test/caps-joins.c | 85 +++++++++++++++++++++++++++++++++++++++++++ + test/dash-caps-joins.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 199 insertions(+) + +commit 38d526f8bedeab53a1cbd5b8424e0c4f15f3b705 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 26 17:21:47 2005 +0000 + + Added bug 4599 and 4602 to the 1.0.2 roadmap. + + ChangeLog | 4 ++++ + ROADMAP | 2 ++ + 2 files changed, 6 insertions(+) + +commit 1010e9052ff7e2283bb4fb6ada81dd1c8bb785ca +Author: Tor Lillqvist <tml@novell.com> +Date: Mon Sep 26 07:48:10 2005 +0000 + + Set LOGFONT::lfHeight negative. A negative lfHeight means "em height" which is what we want, and matches how other toolkits interpret font sizes on Win32. (Positive lfHeight means "cell height".) (#4593) (_cairo_win32_scaled_font_init_glyph_metrics): If GetGlyphOutlineW() fails, print error message and set metrics to zero. (#3927, Hans Breuer) (cairo_win32_scaled_font_select_font): Add detail on what API failed to the error messages. + + ChangeLog | 13 +++++++++++++ + src/cairo-win32-font.c | 26 ++++++++++++++++---------- + 2 files changed, 29 insertions(+), 10 deletions(-) + +commit 8649fc9f18f991ef1e02b58bb6a0a874aef16cda +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 19 17:30:27 2005 +0000 + + Note that the clip-all test now passes. + + ChangeLog | 4 ++++ + ROADMAP | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 8fc9e099fd0c53c4e2119cfd0f6c63b48b293043 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 19 17:24:52 2005 +0000 + + Avoid attempting to create a size-0 Pixmap, (to prevent the associated X error). This actually showed up when the clip region is empty. Thanks to Radek Doulík for the bug report. + Remove clip-all from the XFAIL list since it works now. + + ChangeLog | 11 +++++++++++ + src/cairo-xlib-surface.c | 3 ++- + test/Makefile.am | 1 - + test/clip-all.c | 3 +-- + 4 files changed, 14 insertions(+), 4 deletions(-) + +commit fa5d17f4667719803fe27207ca1ec1e7a5882080 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 19 14:24:00 2005 +0000 + + Originally: 2005-09-19 Hans Breuer <hans@breuer.org> + src/cairoint.h : win32 specific definitions for CAIRO_MUTEX_DECLARE, CAIRO_MUTEX_LOCK etc. [not based on win32 mutex but critical sections] + src/cairo-win32-surface.c : add DllMain() to do global, single-threaded 'mutex' (de)initialization. No ifdefs needed, some variables would simply not be used when the respective backend would not be compiled in. + + ChangeLog | 13 +++++++++++++ + src/cairo-win32-surface.c | 34 ++++++++++++++++++++++++++++++++++ + src/cairoint.h | 10 ++++++++++ + 3 files changed, 57 insertions(+) + +commit d7bdc9477552382163ee0a0521a13c212015a4e8 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 19 14:14:03 2005 +0000 + + Add cairo-cache-private.h which was missing from the list, (thanks to sunmoon1997). + + ChangeLog | 5 +++++ + src/Makefile.am | 1 + + 2 files changed, 6 insertions(+) + +commit 80561375c43d1769c9e1f05b700137b424f20565 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 19 11:56:27 2005 +0000 + + Note that 4414 is now fixed. + + ChangeLog | 4 ++++ + ROADMAP | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 91e188bc78f0f2b3703c249c2fac4e3f6e3c5bcc +Author: David Reveman <davidr@novell.com> +Date: Mon Sep 19 07:18:51 2005 +0000 + + Add missing break to switch statement + + src/cairo-glitz-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 079ee492b518c735046032a118f8662ec8982f71 +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Sep 18 19:53:23 2005 +0000 + + Fix the MMX test to only check for MMX intrinsics and not the SSE intrinsics. + + ChangeLog | 5 +++++ + configure.in | 4 ++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 759166f795ab960ddf679f467638be49657f91c1 +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Sep 18 19:52:08 2005 +0000 + + Only include xmmintrin.h if USE_SSE is defined. + + pixman/ChangeLog | 4 ++++ + pixman/src/fbmmx.c | 2 ++ + 2 files changed, 6 insertions(+) + +commit 0978f97e9e606c2ec62fe369b584ece6ad4905ef +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Sep 18 19:37:44 2005 +0000 + + Bug #4414, reviewed by otaylor, cworth. + Remove -msse from the MMX CFLAGS as it causes gcc to emit SSE instructions, however the detection code only checks for processors supporting MMX and does not require SSE. + + ChangeLog | 8 ++++++++ + configure.in | 2 +- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit b7c02401b9c0470f5a95b33f8fde3adebfcec397 +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sun Sep 18 19:34:36 2005 +0000 + + Bug #4414, reviewed by otaylor, cworth. + Remove CPU detection code. + Move CPU detection code out of the MMX file and into the generic code to avoid compiling it with -mmmx and -msse. Using these options causes gcc to use MMX and SSE instructions in the CPU detection code which causes SIGILLs on older processors. + + pixman/ChangeLog | 11 +++++ + pixman/src/fbmmx.c | 113 ------------------------------------------------- + pixman/src/fbpict.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 3 files changed, 129 insertions(+), 114 deletions(-) + +commit 6d14b3c1fc6c8dfb389495e88a8c63ff10110ec4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 16 10:49:48 2005 +0000 + + Prefer cairo_bool_t, TRUE, and FALSE over int, 1, and 0. + + ChangeLog | 6 ++++++ + src/cairo-path-stroke.c | 18 +++++++++--------- + 2 files changed, 15 insertions(+), 9 deletions(-) + +commit 9cb31827aa81d175309b8c81b99482ebde3ba6d6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 16 10:27:32 2005 +0000 + + Mark 4408 as resolved. + + ChangeLog | 4 ++++ + ROADMAP | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 5b9be26d269d7e120d73652f7c6d2894cc556939 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 16 10:24:54 2005 +0000 + + Tested by: John Ellson Closes bug #4408 https://bugs.freedesktop.org/show_bug.cgi?id=4408 + Add support for dashed splines. (The antialiasing quality isn't perfect, but at least the curves are dashed now). + + ChangeLog | 11 +++++++ + src/cairo-path-stroke.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 86 insertions(+), 1 deletion(-) + +commit a7459e0057e1a73b7eeb7f6d88e86061b198cbf9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 16 10:11:52 2005 +0000 + + Mark 4260 as resolved. Add 4414 to the 1.0.2 roadmap. + + ChangeLog | 4 ++++ + ROADMAP | 3 ++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 34c6f5de9be6102741db455e8447d39deb1289b7 +Author: David Reveman <davidr@novell.com> +Date: Wed Sep 14 09:25:07 2005 +0000 + + Change Carl's comment about saturate operator + + ChangeLog | 1 + + src/cairo-glitz-surface.c | 13 +++++++------ + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 6121df6b72b56ebe9e775c1b12494dc29817f311 +Author: David Reveman <davidr@novell.com> +Date: Wed Sep 14 09:12:13 2005 +0000 + + White-space cleanups to glitz backend + + src/cairo-glitz-surface.c | 200 +++++++++++++++++++++++----------------------- + 1 file changed, 102 insertions(+), 98 deletions(-) + +commit 82cb5baeb2440545708d66573b29b69c0951de71 +Author: David Reveman <davidr@novell.com> +Date: Wed Sep 14 09:07:00 2005 +0000 + + Track changes to glitz and update glyph caching in glitz backend + + ChangeLog | 5 + + configure.in | 2 +- + src/cairo-glitz-surface.c | 675 ++++++++++++++++++++++------------------------ + 3 files changed, 331 insertions(+), 351 deletions(-) + +commit c9ad68e6e9a86ea0c6c020c9073b4f86c00bb4a6 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 13 15:53:19 2005 +0000 + + Set return-value *glyphs to NULL after freeing it in the error case. + + ChangeLog | 5 +++++ + src/cairo-scaled-font.c | 3 ++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit b18a3c0580a9ab9dc130b5908d4f21da382f6243 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 13 15:47:59 2005 +0000 + + Mark bug #4299 fixed (by the several lock-related commits below). Add clip-all XFAIL to the 1.0.2 roadmap. + + ChangeLog | 5 +++++ + ROADMAP | 9 +++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 56e7e9d5bd6ccc0a94d4b41058cab200f9dc2654 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 13 12:40:36 2005 +0000 + + Add missing locking around the call into the thread-shared cache here. + + ChangeLog | 5 +++++ + src/cairo-scaled-font.c | 42 +++++++++++++++++++++++++----------------- + 2 files changed, 30 insertions(+), 17 deletions(-) + +commit e8708af118458c95ec08148375411627c03c0fca +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 13 12:37:45 2005 +0000 + + Adjust parameters to stress things a bit more, (better exposing another locking bug). + + ChangeLog | 5 +++++ + test/pthread-show-text.c | 10 +++++----- + 2 files changed, 10 insertions(+), 5 deletions(-) + +commit ef35d00615fcd95d9db8c22378caa5cb934465b5 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 13 12:26:29 2005 +0000 + + Expand locking to encapsulate any modification to the reference count of a scaled font, rather than just modifcations of the scaled_font_map, since scaled fonts are shared between threads. + + ChangeLog | 8 +++++ + src/cairo-scaled-font.c | 87 ++++++++++++++++++++++++++++--------------------- + 2 files changed, 57 insertions(+), 38 deletions(-) + +commit 258f6f4903eb91187384c2df7591413d9041f184 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 13 12:11:32 2005 +0000 + + Add documentation for cairo_test functions. + Abstract log fie creation into cairo_test_init for use by tests that don't use cairo_test(). + Add new test for bug #4299 as reported by Alexey Shabalin. + + ChangeLog | 13 ++++++ + test/.cvsignore | 3 +- + test/Makefile.am | 7 ++- + test/cairo-test.c | 30 ++++++++----- + test/cairo-test.h | 48 +++++++++++++++++++-- + test/pthread-show-text.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 195 insertions(+), 16 deletions(-) + +commit 999c2a8a2b27412ac2fb59041837c780e6d7eec3 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 12 11:15:52 2005 +0000 + + Originally 2005-09-06 Carl Worth <cworth@cworth.org>: + _cairo_cache_preserve -> _cairo_cache_freeze _cairo_cache_release -> _cairo_cache_thaw + Track rename of _cairo_cache_freeze/thaw. + Track rename. Add stacking behavior to _cairo_cache_freeze/thaw. Abstract out shrinking from _cairo_cache_insert so that _cairo_cache_thaw will also shrink as necessary. + Make this function static since its current limitation to accept an entry rather than a key makes it not as externally useful as would be desirable. Document this limitation. + + ChangeLog | 24 +++++++++ + src/cairo-cache-private.h | 8 +-- + src/cairo-cache.c | 121 +++++++++++++++++++++++++++++++--------------- + src/cairo-scaled-font.c | 7 ++- + 4 files changed, 112 insertions(+), 48 deletions(-) + +commit b1a38efd34c6b87581846de88b134b0dd6656753 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 12 11:11:33 2005 +0000 + + Fix for bug #4401 as reported by Tim Mooney: + Don't bother checking for sincos function. + Don't use sincos function since it is apparently buggy on some platforms, (Tru64 at least). + + ChangeLog | 10 ++++++++++ + configure.in | 2 -- + src/cairo-matrix.c | 6 ++---- + 3 files changed, 12 insertions(+), 6 deletions(-) + +commit a1bca924b9296d769d735d8abaf1353143770def +Author: Owen Taylor <otaylor@redhat.com> +Date: Mon Sep 12 05:55:11 2005 +0000 + + Bug #4260, Reviewed by B. Biggs + Use & not && for bitwise AND. + src/fbpict.c src/fbmmx.c: Take 'dest' as an argument, if pict and dest don't match for RGB, BGR, swap result. + + pixman/ChangeLog | 11 +++++++++++ + pixman/src/fbcompose.c | 4 ++-- + pixman/src/fbmmx.c | 14 +++++++------- + pixman/src/fbpict.c | 20 ++++++++++---------- + pixman/src/fbpict.h | 12 ++++++++++-- + 5 files changed, 40 insertions(+), 21 deletions(-) + +commit e06df6a38aa949730ca5497c4e6210b95dc0f117 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 9 17:10:52 2005 +0000 + + Add two bugs to the 1.0.2 roadmap: 4408 Missing dashes on stroked curves 4409 Dashes are missing initial caps + + ChangeLog | 6 ++++++ + ROADMAP | 2 ++ + 2 files changed, 8 insertions(+) + +commit 761cef26677bc7c928d64aa78084e0389de9679f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 8 16:18:00 2005 +0000 + + Add open bug list for 1.0.2. + + ChangeLog | 4 ++++ + ROADMAP | 14 ++++++-------- + 2 files changed, 10 insertions(+), 8 deletions(-) + +commit 0b9c0efc3a939c2078f0200e9bfaa14651fd7529 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 7 16:57:59 2005 +0000 + + Put win32 mutex locking on the 1.2.0 roadmap. + Portability improvements for win32 thanks to Hans Breuer <hans@breuer.org>: + Defined sized-integer types when under the influence of _MSC_VER and without stdint.h. + Use #error which is more portable than #warning, (and more indicative of where we want to be before the next release). + + AUTHORS | 1 + + ChangeLog | 14 ++ + ROADMAP | 4 + + doc/public/tmpl/cairo-font-options.sgml | 136 ---------- + doc/public/tmpl/cairo-font.sgml | 48 ---- + doc/public/tmpl/cairo-ft.sgml | 45 ---- + doc/public/tmpl/cairo-glitz.sgml | 9 - + doc/public/tmpl/cairo-image.sgml | 42 ---- + doc/public/tmpl/cairo-matrix.sgml | 119 --------- + doc/public/tmpl/cairo-paths.sgml | 186 -------------- + doc/public/tmpl/cairo-pattern.sgml | 165 ------------- + doc/public/tmpl/cairo-pdf.sgml | 33 --- + doc/public/tmpl/cairo-png.sgml | 40 --- + doc/public/tmpl/cairo-ps.sgml | 33 --- + doc/public/tmpl/cairo-quartz.sgml | 11 - + doc/public/tmpl/cairo-scaled-font.sgml | 60 ----- + doc/public/tmpl/cairo-status.sgml | 9 - + doc/public/tmpl/cairo-surface.sgml | 119 --------- + doc/public/tmpl/cairo-text.sgml | 123 --------- + doc/public/tmpl/cairo-transforms.sgml | 106 -------- + doc/public/tmpl/cairo-types.sgml | 4 +- + doc/public/tmpl/cairo-version.sgml | 16 -- + doc/public/tmpl/cairo-win32-fonts.sgml | 36 --- + doc/public/tmpl/cairo-win32.sgml | 9 - + doc/public/tmpl/cairo-xcb-xrender.sgml | 13 - + doc/public/tmpl/cairo-xcb.sgml | 35 --- + doc/public/tmpl/cairo-xlib-xrender.sgml | 14 -- + doc/public/tmpl/cairo-xlib.sgml | 47 ---- + doc/public/tmpl/cairo.sgml | 424 -------------------------------- + pixman/src/pixman.h | 19 +- + src/cairoint.h | 3 +- + 31 files changed, 37 insertions(+), 1886 deletions(-) + +commit 63c208d83d4a6e66ee2b15af8e1cd92ed67626b9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 7 16:31:22 2005 +0000 + + Give cairo_public an empty definition by default. + Add new cairo_public macro before every public function call prototype. + + ChangeLog | 18 +++ + src/cairo-features.h.in | 4 + + src/cairo-ft.h | 10 +- + src/cairo-glitz.h | 2 +- + src/cairo-pdf.h | 6 +- + src/cairo-ps.h | 6 +- + src/cairo-quartz.h | 2 +- + src/cairo-win32.h | 10 +- + src/cairo-xcb-xrender.h | 2 +- + src/cairo-xcb.h | 6 +- + src/cairo-xlib-xrender.h | 2 +- + src/cairo-xlib.h | 8 +- + src/cairo.h | 338 +++++++++++++++++++++++------------------------ + 13 files changed, 218 insertions(+), 196 deletions(-) + +commit 05c0c98aee3c67f7a708ad9bfb248ae5c4066312 +Author: Tor Lillqvist <tml@novell.com> +Date: Wed Sep 7 09:07:13 2005 +0000 + + Pass appropriate pointer for image_extra to release_dest_image. + + ChangeLog | 5 +++++ + src/cairo-atsui-font.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit c00698ebf5730d2d0bff35e1b6cb69914789529f +Author: Tor Lillqvist <tml@novell.com> +Date: Wed Sep 7 08:38:43 2005 +0000 + + Pass scratch space instead of NULL for image_extra to acquire/release_dest_image. + + ChangeLog | 6 ++++++ + src/cairo-atsui-font.c | 5 +++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit f2dc1ebe82e9b26346d2948de33ffef0f5bf921b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 6 15:19:00 2005 +0000 + + Ignore cairo.def. + Remove cairo_private since we only use it in .h files, not .c files. + + ChangeLog | 7 +++++++ + src/.cvsignore | 1 + + src/cairo-gstate.c | 4 ++-- + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 5b5eecc2e16109e16b9da78e023274197cb3082c +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 2 16:17:48 2005 +0000 + + Make a very preliminary attempt at 1.0.2, 1.2.0, and 1.4.0 roadmaps. + + ChangeLog | 5 ++ + ROADMAP | 173 ++++++++++++++++++++++++++++++++------------------------------ + 2 files changed, 94 insertions(+), 84 deletions(-) + +commit 7d93d26e1edd9d0340e7a00b1a74b56667e84b44 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 2 13:42:34 2005 +0000 + + Add description of cairo's versioning scheme. + + ChangeLog | 5 ++ + doc/public/tmpl/cairo-version.sgml | 102 ++++++++++++++++++++++++++++++++++++- + 2 files changed, 106 insertions(+), 1 deletion(-) + +commit 93289f14ccc3d1db5c0b64672b8cd49703542010 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 2 11:22:40 2005 +0000 + + Clean up some documentation issues pointed out by otaylor. + + ChangeLog | 6 ++++++ + src/cairo-cache-private.h | 10 ++++------ + src/cairo-cache.c | 24 ++++++++++++------------ + 3 files changed, 22 insertions(+), 18 deletions(-) + +commit 0cfa350fa86c7894eec4e1b99ac7b69bc0c8f296 +Author: Keith Packard <keithp@keithp.com> +Date: Thu Sep 1 20:38:07 2005 +0000 + + Oops. Call _cairo_scaled_font_set_metrics to set user-space metrics for scaled fonts. + reviewed by: otaylor deserves credit for noticing a problem + + ChangeLog | 8 ++++++++ + src/cairo-ft-font.c | 22 ++++++++++++---------- + 2 files changed, 20 insertions(+), 10 deletions(-) + +commit 25edf235f090a95f30ea877aa00bc7ee642d4cc5 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Thu Sep 1 06:13:46 2005 +0000 + + Add missing pair of braces. This fixes a crash on text output. + + ChangeLog | 5 +++++ + src/cairo-scaled-font.c | 9 +++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 7e4465819b7f0da3f16a18c6ffcf2b8f7a9ee04a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 1 02:14:31 2005 +0000 + + Add includes to get sized-integer types such as uint32_t. + Fix declaration of image data array to be uint32_t rather than unsigned long. Fixes four out of the remaining five failures in bug #4245. + + ChangeLog | 17 +++++++++++++++++ + test/cairo-test.h | 26 ++++++++++++++++++++++++++ + test/filter-nearest-offset.c | 2 +- + test/mask-ctm.c | 2 +- + test/mask-surface-ctm.c | 2 +- + test/move-to-show-surface.c | 2 +- + test/paint-with-alpha.c | 2 +- + test/scale-source-surface-paint.c | 2 +- + test/set-source.c | 2 +- + test/source-surface-scale-paint.c | 2 +- + test/translate-show-surface.c | 2 +- + 11 files changed, 52 insertions(+), 9 deletions(-) + +commit 0f4beab5070ce6f7129ca52953eb002ac7f40b93 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 31 19:11:22 2005 +0000 + + Add call to XSynchronize, (the expected clip-all failure isn't occuring without it for some reason). + Note reason for expected failure. + src/cairo-scaled-font.c: Add an optional text_to_glyphs() virtual function that the backend can implement instead of ucs4_to_index(). + Protect inclusion of fontconfig.h with HAVE_FCFINI. + + ChangeLog | 19 ++ + src/cairo-ft-font.c | 1 + + src/cairo-scaled-font.c | 10 +- + src/cairo-win32-font.c | 403 ++++++++++++++++++++++++------------------ + src/cairoint.h | 12 ++ + test/cairo-test.c | 2 + + test/create-from-png-stream.c | 6 +- + test/nil-surface.c | 2 +- + 8 files changed, 277 insertions(+), 178 deletions(-) + +commit f25ebec368caa6b88d39a5c42cd48b8459396505 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 31 16:17:28 2005 +0000 + + Add call to XSynchronize, (the expected clip-all failure isn't occuring without it for some reason). + Note reason for expected failure. + + ChangeLog | 8 ++++++++ + test/cairo-test.c | 2 ++ + test/clip-all.c | 3 ++- + 3 files changed, 12 insertions(+), 1 deletion(-) + +commit d56b0d1d80032a26501465106dc76abc713c77bf +Author: Owen Taylor <otaylor@redhat.com> +Date: Wed Aug 31 15:09:35 2005 +0000 + + Handle displays which don't match the local endianness by byteswapping on GetImage/PutImage. (#4321, reported by Sjoerd Simons) + + ChangeLog | 7 ++ + src/cairo-xlib-surface.c | 170 ++++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 147 insertions(+), 30 deletions(-) + +commit b0c58593b30c1fa085b1e7c8e4897da623b8686d +Author: Keith Packard <keithp@keithp.com> +Date: Wed Aug 31 15:08:02 2005 +0000 + + Split out scaled font code to cairo-scaled-font.c + Replace cairo cache implementation (this code from cworth) + No more global glyph cache to clean up + Store glyphs in new per-scaled font caches which hold user-space metrics and device space bounding boxes + Refactor glyph drawing APIs so that the surface API is invoked directly from the gstate code. + Add path creation/destruction routines (to hold glyph paths) + New implementation of scaled fonts which uses per-scaled_font caches for glyphs and keeps user-space metrics, device-space bboxes along with glyph images and/or glyph paths. + Adapt to new scaled font API changes. + New cache and scaled_font APIs + Repond to bug fix in metrics computation for glyphs where y values were rounded up instead of down because of a sign difference between cairo and FreeType. + Reviewed by: otaylor, cworth + + ChangeLog | 95 +++ + src/Makefile.am | 1 + + src/cairo-cache-private.h | 131 ++++ + src/cairo-cache.c | 660 +++++++------------ + src/cairo-debug.c | 1 - + src/cairo-font.c | 847 ------------------------ + src/cairo-ft-font.c | 1130 ++++++++++++--------------------- + src/cairo-gstate.c | 47 +- + src/cairo-path.c | 18 + + src/cairo-scaled-font.c | 1165 ++++++++++++++++++++++++++++++++++ + src/cairo-xlib-surface.c | 801 +++++++---------------- + src/cairoint.h | 391 +++++------- + test/clip-operator-ref.png | Bin 37330 -> 37134 bytes + test/operator-clear-ref.png | Bin 4988 -> 4971 bytes + test/operator-source-ref.png | Bin 19958 -> 19982 bytes + test/text-antialias-gray-ref.png | Bin 727 -> 740 bytes + test/text-antialias-gray.c | 2 +- + test/text-antialias-none-ref.png | Bin 278 -> 276 bytes + test/text-antialias-none.c | 2 +- + test/text-antialias-subpixel-ref.png | Bin 1081 -> 1121 bytes + test/text-antialias-subpixel.c | 2 +- + test/unbounded-operator-ref.png | Bin 11929 -> 11994 bytes + 22 files changed, 2460 insertions(+), 2833 deletions(-) + +commit 568ce860264e63f86ae45258eb106fb7a74a33a3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 31 14:43:31 2005 +0000 + + Increment CAIRO_VERSION to 1.1.1 after making branch tag BRANCH_1_0. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 41c321fffaaa035b71aa8d149e748e1aae6d2317 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 31 13:52:19 2005 +0000 + + Add note to use ./autogen.sh instead of ./configure when working with source from cvs. + + ChangeLog | 5 +++++ + INSTALL | 4 ++++ + 2 files changed, 9 insertions(+) + +commit eb2316ecc7dfe2f7a87153c0094bda8754f6d36f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 31 13:33:42 2005 +0000 + + Fix test to not try to set a non-invertible matrix. (We'd gotten away with this due to round-off error on many systems). Fixes one out of six failures in bug #4245. + + ChangeLog | 6 ++++++ + test/get-and-set.c | 4 ++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 464c6dffcf251d4b0089e50b716979da5e3b9a5a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 31 09:00:01 2005 +0000 + + Add Radek Doulík. + Add test exposing a BadValue (0-size pixmap) bug in cairo-xlib-surface when everything is clipped away (thanks to Radek Doulík <rodo@novell.com>). + + AUTHORS | 1 + + ChangeLog | 10 ++++++++ + test/.cvsignore | 1 + + test/Makefile.am | 4 +++ + test/clip-all-ref.png | Bin 0 -> 118 bytes + test/clip-all.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 85 insertions(+) + +commit 44d6afc8a82c2ede19ccc1e27a123b241be6dc67 +Author: Owen Taylor <otaylor@redhat.com> +Date: Tue Aug 30 10:50:27 2005 +0000 + + Liberalize the ServerVendor check so that we can handle the Mandriva vendor string. (#4298, Frederic Crozat) + + ChangeLog | 6 ++++++ + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit a4418a63d7b837f0f7c20f5ce6a0e8b31edd97d7 +Author: Owen Taylor <otaylor@redhat.com> +Date: Tue Aug 30 10:42:17 2005 +0000 + + Use a 8xN rather than a 1xN strip for a vertical gradient. This is much more tolerant of slow compositing code, and is worth some extra expense computing the gradient. (#4263, found in test case from Richard Stellingwerff) + + ChangeLog | 8 ++++++++ + src/cairo-pattern.c | 11 +++++++++-- + 2 files changed, 17 insertions(+), 2 deletions(-) + +commit 2120864edfb1bc51251dca3aeefbfadffb442ad0 +Author: Owen Taylor <otaylor@redhat.com> +Date: Sun Aug 28 12:52:10 2005 +0000 + + Use local labels rather than global labels in the assembly, to be robust if the code is inlined in multiple places. (#4283, Reported by Marco Manfredini) + + pixman/ChangeLog | 6 ++++++ + pixman/src/fbmmx.c | 8 ++++---- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit a83537fe02d29fc36a78be0f5599421edf75dc62 +Author: Billy Biggs <vektor@dumbterm.net> +Date: Sat Aug 27 19:32:57 2005 +0000 + + Some fixes for warnings from sparse (Part of bug #4208, Kjartan Maraas) + Use NULL not 0. + + pixman/ChangeLog | 15 ++++++++++++ + pixman/src/fbcompose.c | 66 +++++++++++++++++++++++++------------------------- + pixman/src/fbpict.c | 4 +-- + pixman/src/icbltone.c | 6 ++--- + pixman/src/icimage.c | 10 ++++---- + pixman/src/icrect.c | 2 +- + pixman/src/ictrap.c | 6 ++--- + 7 files changed, 62 insertions(+), 47 deletions(-) + +commit 96342fe7beee1d0c2084cb6e0f44969d5b05b100 +Author: Owen Taylor <otaylor@redhat.com> +Date: Sat Aug 27 18:54:03 2005 +0000 + + Make the check for rectangular trapezoids simpler and more accurate. (#4220, found using test case from Richard Stellingwerff) + reviewed by: cworth + + ChangeLog | 8 ++++++++ + src/cairo-traps.c | 16 +++++----------- + 2 files changed, 13 insertions(+), 11 deletions(-) + +commit 30e3d538dfbd763872117760ec473481e2c5926d +Author: Owen Taylor <otaylor@redhat.com> +Date: Sat Aug 27 18:49:06 2005 +0000 + + Make the vendor string check for XFree86 more liberal, to deal with older versions of gentoo that modified it in a different way. (#4231, fix from Billy Biggs) + + ChangeLog | 7 +++++++ + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +commit a6acc962f76c1eba9dec3ee1646413f6c82ac6e0 +Author: Owen Taylor <otaylor@redhat.com> +Date: Sat Aug 27 18:46:34 2005 +0000 + + Undef MIN/MAX before defining them in case some system header happens to define them. (#4196, Christian Biesinger) + + ChangeLog | 8 +++++++- + src/cairoint.h | 3 +++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 3c53414cf34d2027284bdbd4836d10a2c0d998c0 +Author: Owen Taylor <otaylor@redhat.com> +Date: Sat Aug 27 18:40:46 2005 +0000 + + Fix docs not to talk about %NULL returns. #4271, Duncan Coutts. + + ChangeLog | 6 ++++++ + src/cairo-image-surface.c | 18 ++++++++++++++---- + 2 files changed, 20 insertions(+), 4 deletions(-) + +commit c0da73e1b8e5933ca117512499ccac4e208bd8e0 +Author: Owen Taylor <otaylor@redhat.com> +Date: Sat Aug 27 18:36:09 2005 +0000 + + Make the code work with + -fomit-frame-pointer by making sure that %esp isn't modified at the point where we access output operands. (#4269, Patch from Ronald Wahl) + + pixman/ChangeLog | 7 +++++++ + pixman/src/fbmmx.c | 24 +++++++++++++++++------- + 2 files changed, 24 insertions(+), 7 deletions(-) + +commit 03c3935471ad69e8e2d0e6543b7667f972ef1f0c +Author: Tor Lillqvist <tml@novell.com> +Date: Thu Aug 25 02:59:40 2005 +0000 + + Include the documentation, too. + + ChangeLog | 4 ++++ + Makefile.am | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 1f975f4e82f3090b5f677241c1ca4d344788d27c +Author: Billy Biggs <vektor@dumbterm.net> +Date: Wed Aug 24 19:20:08 2005 +0000 + + Update formatting of the title and short description, as this actually changes how the TOC appears in devhelp. + + ChangeLog | 30 ++++++++++++++++++++++++++++++ + doc/public/tmpl/cairo-font-options.sgml | 6 ++---- + doc/public/tmpl/cairo-font.sgml | 6 ++---- + doc/public/tmpl/cairo-ft.sgml | 6 ++---- + doc/public/tmpl/cairo-glitz.sgml | 6 ++---- + doc/public/tmpl/cairo-image.sgml | 6 ++---- + doc/public/tmpl/cairo-matrix.sgml | 6 ++---- + doc/public/tmpl/cairo-paths.sgml | 6 ++---- + doc/public/tmpl/cairo-pattern.sgml | 6 ++---- + doc/public/tmpl/cairo-pdf.sgml | 6 ++---- + doc/public/tmpl/cairo-png.sgml | 6 ++---- + doc/public/tmpl/cairo-ps.sgml | 6 ++---- + doc/public/tmpl/cairo-quartz.sgml | 6 ++---- + doc/public/tmpl/cairo-scaled-font.sgml | 6 ++---- + doc/public/tmpl/cairo-status.sgml | 6 ++---- + doc/public/tmpl/cairo-surface.sgml | 6 ++---- + doc/public/tmpl/cairo-text.sgml | 6 ++---- + doc/public/tmpl/cairo-transforms.sgml | 6 ++---- + doc/public/tmpl/cairo-types.sgml | 6 ++---- + doc/public/tmpl/cairo-version.sgml | 6 ++---- + doc/public/tmpl/cairo-win32-fonts.sgml | 6 ++---- + doc/public/tmpl/cairo-win32.sgml | 6 ++---- + doc/public/tmpl/cairo-xcb-xrender.sgml | 6 ++---- + doc/public/tmpl/cairo-xcb.sgml | 6 ++---- + doc/public/tmpl/cairo-xlib.sgml | 6 ++---- + doc/public/tmpl/cairo.sgml | 6 ++---- + 26 files changed, 80 insertions(+), 100 deletions(-) + +commit 241a4eb8f76fcd1e6ca7db127410fcca8adf907e +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Wed Aug 24 17:44:16 2005 +0000 + + add docs-publish as a phony target + + ChangeLog | 4 ++++ + Makefile.am | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 0bcad6002a62cb5ba2eb733fe1863ac045db1c86 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 24 10:16:14 2005 +0000 + + Increment CAIRO_VERSION to 1.0.1 after tagging RELEASE_1_0_0. + + ChangeLog | 5 +++++ + configure.in | 2 +- + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ChangeLog.pre-1.4 b/ChangeLog.pre-1.4 new file mode 100644 index 000000000..eb6e70f64 --- /dev/null +++ b/ChangeLog.pre-1.4 @@ -0,0 +1,13227 @@ +commit 5dfa8c23f13f5cafac5cf56f34888a6e01dc79ba +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 6 01:25:17 2007 -0800 + + NEWS: Note the x86 nature of the quoted performance results + + And mention that embedded systems often did even better. + + NEWS | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit d7df4d4d4c52c0934bec0c8edad96bb2ea82dc04 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 6 01:20:45 2007 -0800 + + Increment cairo version to 1.4.0 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d0d2c4030741619accd1eb554531bb6a97dd7ae4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 6 01:20:03 2007 -0800 + + Clarify that extra elements in cairo_path_data is only available in cairo >= 1.4 + + src/cairo.h | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 0578929fa4add0cf366e200a5bd6b9f2dfcd0b79 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 6 01:09:02 2007 -0800 + + NEWS: Add release notes for 1.4.0 release + + NEWS | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 250 insertions(+), 1 deletion(-) + +commit 66d1dc8b9c3d7c1e26321bdb621ef55779c2fd6d +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 5 23:55:05 2007 -0800 + + Update AUTHORS with 47 (!) new authors since 1.0 + + AUTHORS | 52 +++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 47 insertions(+), 5 deletions(-) + +commit 2f4ddc85a50641a7f6e1f467fa94610875f8ed02 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 5 22:48:27 2007 -0800 + + Mark 5 tests that are currently failing as XFAIL (that is, not to be fixed before 1.4) + + The 5 additional bugs that will be shipped with 1.4 are + + ft-text-vertical-layout-type1 + radial-gradient + surface-pattern + surface-pattern-scale-down + surface-pattern-scale-up + + Most of these are non-issues, (unbundled font for + ft-text-vertical-layout-type1), or very minor issues (radial-gradient + and surface-pattern). The only things in here that look like a real + bug are the surface-pattern-scale-down and surface-pattern-scale-up + tests where the xlib backend results have some non-1.0 alpha that is + very unexpected. + + test/Makefile.am | 5 +++++ + test/radial-gradient.c | 3 ++- + test/surface-pattern-scale-down.c | 3 ++- + test/surface-pattern-scale-up.c | 3 ++- + test/surface-pattern.c | 3 ++- + 5 files changed, 13 insertions(+), 4 deletions(-) + +commit aa883123d2af905c846a8c0a67ff63fa6b16cd2b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 5 16:48:05 2007 -0800 + + Optimize filling of a path that is a single device-axis-aligned rectangle. + + It turns out that this case is extremely common and worth avoiding + the overhead of the path iteration and tessellation code. + + The optimization here works only for device-axis-aligned rectangles + It should be possible to generalize this to catch more cases, (such + as any convex quadrilateral with 4 or fewer points). + + This fix results in a 1.4-1.8x speedup for the rectangles perf case: + + image-rgb rectangles-512 7.80 1.22% -> 4.35 1.62%: 1.79x speedup + ▊ + image-rgba rectangles-512 7.71 4.77% -> 4.37 0.30%: 1.77x speedup + ▊ + xlib-rgba rectangles-512 8.78 5.02% -> 5.58 5.54%: 1.57x speedup + ▋ + xlib-rgb rectangles-512 11.87 2.71% -> 8.75 0.08%: 1.36x speedup + ■+ + Which conveniently overcomes the ~ 1.3x slowdown we had been seeing + for this case since 1.2. Now, compared to 1.2.6 we see only a speedup: + + image-rgba rectangles-512 6.19 0.29% -> 4.37 0.30%: 1.42x speedup + ▎ + image-rgb rectangles-512 6.12 1.68% -> 4.35 1.62%: 1.41x speedup + ▎ + xlib-rgba rectangles-512 7.48 1.07% -> 5.58 5.54%: 1.34x speedup + ■+ xlib-rgb rectangles-512 10.35 1.03% -> 8.75 0.08%: 1.18x speedup + ■+ + src/cairo-path-fill.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 93 insertions(+) + +commit e15bb8efe62a4d2ffd1df31b092ca1fdd2743e43 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue Mar 6 00:40:56 2007 +0000 + + [quartz] remove unnecessary flushes + + Removing calls to CGContextFlush; these were slowing down the + mac and on other platforms it is up to the client to flush + the surface. + + src/cairo-quartz-surface.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit 393908c34dbf2484b811b84581984563a7115e38 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 19:22:41 2007 -0500 + + [test] Modify extend-reflect to need a smaller reference image + + test/extend-reflect-ref.png | Bin 589279 -> 153571 bytes + test/extend-reflect.c | 17 ++++++----------- + 2 files changed, 6 insertions(+), 11 deletions(-) + +commit 4716ed760c1cc8095587af130964fbc3432ed14d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 19:15:35 2007 -0500 + + [test] Remove some ref images from random-intersections + + Each one is larger than 100kb, so paint background black to reuse + same ref image for rgb24 and argb32 cases. Also remove Quartz ref + images for now. + + test/Makefile.am | 3 --- + test/random-intersections-ps-argb32-ref.png | Bin 107578 -> 89416 bytes + test/random-intersections-quartz-ref.png | Bin 203877 -> 0 bytes + test/random-intersections-quartz-rgb24-ref.png | Bin 179204 -> 0 bytes + test/random-intersections-ref.png | Bin 177153 -> 132210 bytes + test/random-intersections-rgb24-ref.png | Bin 132210 -> 0 bytes + test/random-intersections.c | 4 ++++ + 7 files changed, 4 insertions(+), 3 deletions(-) + +commit feba319413bde73f8c1454fc0f3a1b3af03dfde4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 19:02:59 2007 -0500 + + [test] Remove unused variable + + test/clip-operator.c | 2 -- + test/operator-clear.c | 2 -- + test/operator-source.c | 2 -- + 3 files changed, 6 deletions(-) + +commit e1a598211b1944bad6b32148da052208d9b58093 +Author: Emmanuel Pacaud <emmanuel.pacaud@lapp.in2p3.fr> +Date: Mon Mar 5 16:03:40 2007 -0800 + + Use the offset attribute to improve cairo-svg handling of EXTEND_REPEAT and EXTEND_REFLECT + + With this change, the cairo-svg output is perfectly fine with + CAIRO_EXTEND_REPEAT, but is still very slightly wrong with + CAIRO_EXTEND_REFLECT, (though *much* better than it was before + this fix). + + src/cairo-svg-surface.c | 30 +++++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +commit 47f2bf4e28b80102f10505916be2bf4c01ce9354 +Author: Emmanuel Pacaud <emmanuel.pacaud@lapp.in2p3.fr> +Date: Mon Mar 5 15:57:28 2007 -0800 + + Remove broken special-casing of radial gradient fx,fy under CAIRO_EXTEND_NONE + + Carl can't explain why he added this special-case, and removing it + eliminates one failure case from the radial-gradient test matrix. + + src/cairo-svg-surface.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit a724f816e17bfe3d9abefb1f6dcfe30480a0d143 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Mar 5 23:19:24 2007 +0000 + + [quartz,atsui] separate the quartz surface and atsui font backend + + Make it possible to use the --enable-quartz and --enable-atsui + independently. Quartz on its own will use the ft font backend. + + configure.in | 17 +++++++---------- + src/cairo-atsui-font.c | 12 ++++++------ + src/cairo-quartz-private.h | 8 +++++--- + src/cairo-quartz-surface.c | 8 +++++++- + 4 files changed, 25 insertions(+), 20 deletions(-) + +commit 83fcce0e93071cffe20377ab3fe6281204b2f80d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 17:56:57 2007 -0500 + + [quartz] Make utility functions static + + src/cairo-quartz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d25548d679b8a7fce12c9a55e728539e408c75a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 17:11:39 2007 -0500 + + In cairo_append_path(), allow excess path_data elements + + src/cairo-path.c | 8 ++++---- + src/cairo.h | 11 +++++++++-- + 2 files changed, 13 insertions(+), 6 deletions(-) + +commit 3ab9ca54aa490438dbbfae7b5f1cde0bd98352cd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 16:33:46 2007 -0500 + + In cairo_text_path(), bail out if zero glyphs + + src/cairo.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 4f138e4af56da60a83fd187f87cde19544ba3ab1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 16:28:31 2007 -0500 + + Uniform object handling in _reference(), _destroy(), and _get_reference_count() + + All three now regard NULL and nil inputs the same. This is new for + _get_reference_count(). It now returns 0 on NULL too, like it does on + nil objects. + + src/cairo-font.c | 12 +++--------- + src/cairo-pattern.c | 12 +++--------- + src/cairo-scaled-font.c | 12 +++--------- + src/cairo-surface.c | 12 +++--------- + src/cairo.c | 12 +++--------- + 5 files changed, 15 insertions(+), 45 deletions(-) + +commit cc12c5acc41f452edff3f4ad8fafe1aebf1810aa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 16:19:28 2007 -0500 + + Make cairo_text_path() set current point correctly + + This fixes the bitmap-text test that I just made reveal a bug. + + src/cairo.c | 38 +++++++++++++++++++++++++++++++++----- + 1 file changed, 33 insertions(+), 5 deletions(-) + +commit b63f5ae58f6617b9a2c9f3434bc1c9f3c72612ac +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 16:15:09 2007 -0500 + + [test] In the bitmap-font test, break cairo_text_path() call into two + such that it checks current-point handling after that call. It fails now, + because cairo_text_path does not set current-point explicitly. + + test/bitmap-font.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit a487d094212d6bc4a06d5bfc774ba6d575165aa5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:59:43 2007 -0500 + + Rename all mutex variables to start with an underscore + since they are not static in some of the implementations (win32, ...) + + src/cairo-beos-surface.cpp | 12 ++++++------ + src/cairo-font.c | 24 ++++++++++++------------ + src/cairo-ft-font.c | 12 ++++++------ + src/cairo-os2-surface.c | 30 +++++++++++++++--------------- + src/cairo-scaled-font.c | 12 ++++++------ + src/cairo-win32-surface.c | 18 +++++++++--------- + src/cairoint.h | 2 +- + 7 files changed, 55 insertions(+), 55 deletions(-) + +commit c8b84a4735c46a33620260de0618296df1e12574 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:46:19 2007 -0500 + + [beos] Update mutex initializers + + This should be the last one. We are going to move to a central + mutex initialization scheme right after 1.4.0 is out. + + src/cairo-beos-surface.cpp | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit b8e2888fbed2aefa368d9bab4010c1e807d6389f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:45:45 2007 -0500 + + [OS2] Add mutex initializer for cairo_font_face_mutex + + src/cairo-os2-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 403b4b7c163e78446035ec5144ad9e3674577d5d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:39:09 2007 -0500 + + [OS2] Remove unused mutex cairo_toy_font_face_hash_table_mutex + + src/cairo-os2-surface.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 6358ec539df67ec7725b0687c16f2175386f1b0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:38:52 2007 -0500 + + [WIN32] Make cairo_ft_unscaled_font_map_mutex initialization conditional of ft + + src/cairo-win32-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 972f7d9fc8d40fb5c698e1a94fba4f28600b215d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:36:51 2007 -0500 + + [WIN32] Remove unused mutex cairo_toy_font_face_hash_table_mutex + + src/cairo-win32-surface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 0cdb96544eda163de050c65f7e7cd413b21f61cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 15:10:35 2007 -0500 + + [SVG] Cast -1 values to unsigned to indicate we really did mean to type them + + src/cairo-svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bbc341614455b22210c818eca01cf4618989565c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 5 14:51:25 2007 -0500 + + [ROADMAP] Remove 1.3.14 items, add 1.4.2 ones + + ROADMAP | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +commit d6ac9b47704d671c192da509571b3721756c1347 +Author: Dave Yeo <daveryeo@telus.net> +Date: Mon Mar 5 13:36:32 2007 -0500 + + [test] Fix build on Win32 + + test/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ffa86b17abbaa2190a4d7eadcc555aac6770bd6c +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Sun Mar 4 16:39:00 2007 -0500 + + [test/pdiff] Fix build problem with certain flavors of make + + test/pdiff/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 325e75239098e640ed05ade39ec2b9f74ae30d3d +Author: Hans Breuer <hans@breuer.org> +Date: Sat Mar 3 22:50:16 2007 -0800 + + Fix mutex initialization for win32 (missing cairo_font_face_mutex) + + We've currently got a problem where it's easy to add a mutex + for a POSIX system and easy to forget to add its intialization + for other systems. Behdad has cooked up a plan for fixing this + properly: + + http://lists.freedesktop.org/archives/cairo/2007-February/009679.html + + In the meantime, we'll just kkeping breaking things, and patches + like this will be needed to fix up our mistakes. + + This fix closes the following bug report: + + cairo_font_face_mutex missing from cairo-win32-surface.c + https://bugs.freedesktop.org/show_bug.cgi?id=10175 + + src/cairo-win32-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 5f2b5f1f92d74fbc2d8f97fb547e160e370d4c40 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Mar 4 03:01:22 2007 +0000 + + [configure.in] --enable-quartz should require atsui and no xlib + + Recent changes have made quartz and atsui interdependent. It is also + no longer possible to build quartz with xlib enabled due to a redefinition + of the 'Picture' symbol. This change makes '--enable-atsui' unnecessary + and refuses to switch on quartz when it cannot be built because xlib + is enabled. + + configure.in | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 1720d0b9508b70ac0c5f2436c3b80a2ab801f138 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 15:42:09 2007 -0500 + + [Makefile.am] --enable-test-surfaces in distcheck + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 79acd268d9ac91f0e9f03467b220241cda3457a5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 15:41:32 2007 -0500 + + [Makefile.am] Remove releasing instructions that are in RELEASING already + + Makefile.am | 15 ++------------- + 1 file changed, 2 insertions(+), 13 deletions(-) + +commit f9f71457a5d1e002f7f6b08232892ba61fef8ead +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 15:37:45 2007 -0500 + + [RELEASING] Update announcement mail instructions + + RELEASING | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 454c6a62a93d4d9e933a4e401997a16f1b0a569b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 15:35:25 2007 -0500 + + [RELEASING] Note that two versions should be added to bugzilla + + RELEASING | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 57e1b6fa98d688b72dd3617e8313ea35f8ce78e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 15:34:19 2007 -0500 + + [RELEASING] Reorder pushing tag and commits + + We should push the tag only after pushing the actually release commit. + + RELEASING | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 052acc95e9c354981eea0968c5727e4a0568a959 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 15:32:42 2007 -0500 + + [RELEASING] Fix git-tag invocation + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9f0a1648b7886714e5c742119083414fcc92dc82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 00:22:53 2007 -0500 + + [configure.in] Increase version to 1.3.17 post-release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b3e1fd8c1cbfc4db88bec4bb52821ed9380dbb4f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 00:07:34 2007 -0500 + + [configure.in] Increase version to 1.3.16 in preparation for release + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit c6541b9ac23bcd88202049960ee5a7503a4f0449 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 00:07:03 2007 -0500 + + [RELEASING] Add note about ChangeLog sanity + + RELEASING | 2 ++ + 1 file changed, 2 insertions(+) + +commit 9aecd7c815b81b61ff408d51bdf8e1c6663a3954 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 3 00:05:40 2007 -0500 + + [test] Include romedalen.png in dist, oops + + test/Makefile.am | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 2f497c25f98cdb4be60b7391a672280ae09f1d67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 23:59:55 2007 -0500 + + [Makefile.am] Check for ChangeLog sanity in release-publish + + Makefile.am | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit eb8214c9602319d716b8cd39a1c5dd1dd278b96e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 23:49:27 2007 -0500 + + [ChangeLog.mk] Adapt to latest git-describe output format + + ChangeLog.mk | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit 8a69a327952173a714dfbe1e8967ebb7bdbbacbd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 23:21:39 2007 -0500 + + [test] Update list of refrerence images + + test/Makefile.am | 392 ++++++++++++++++++++++++++++++------------------------- + 1 file changed, 216 insertions(+), 176 deletions(-) + +commit 55d480612754dca652b5324d815e0429c745fec3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 22:52:38 2007 -0500 + + [NEWS] Add note about documentation improvements + + NEWS | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 77b27fd06b9f0e7ff5dedd4b41327e456d33e3cf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 22:45:50 2007 -0500 + + [doc] Update templates + + doc/public/tmpl/cairo-font.sgml | 33 +++++++++------ + doc/public/tmpl/cairo-pattern.sgml | 37 +++++++++++++++-- + doc/public/tmpl/cairo-scaled-font.sgml | 31 ++++++++++++++ + doc/public/tmpl/cairo-surface.sgml | 74 +++++++++++++++++++--------------- + doc/public/tmpl/cairo-text.sgml | 33 +++++++++------ + doc/public/tmpl/cairo.sgml | 40 ++++++++++++++++++ + 6 files changed, 188 insertions(+), 60 deletions(-) + +commit 1082fed6929a696455f27821819c6af4f575156d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 22:42:17 2007 -0500 + + [doc] Docuemnt all symbols but cairo_filter_t and cairo_operator_t + + Lets see if this is enough to push Carl Worth document those two. + + src/cairo-font.c | 5 +++- + src/cairo-pattern.c | 3 ++ + src/cairo-scaled-font.c | 3 ++ + src/cairo-surface.c | 3 ++ + src/cairo.c | 3 ++ + src/cairo.h | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- + 6 files changed, 88 insertions(+), 3 deletions(-) + +commit e37b6ca3e2c55256debf1fdfde83934fa9b28c1d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 22:03:27 2007 -0500 + + Beautify cairo.h + + src/cairo.h | 42 +++++++++++++++++++++--------------------- + 1 file changed, 21 insertions(+), 21 deletions(-) + +commit 9be961eb0c8c85b04287a5b85f7fd72dac160949 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 22:01:15 2007 -0500 + + [doc] Some documentation love + + src/cairo-font.c | 2 +- + src/cairo-pattern.c | 19 ++++++++++++ + src/cairo-surface.c | 6 ++-- + src/cairo-win32-font.c | 24 +++++++++++++-- + src/cairo-win32-surface.c | 1 + + src/cairo.c | 76 ++++++++++++++++++++++++++++++++++++++++++----- + src/cairo.h | 40 ++++++++++++++++++++++++- + 7 files changed, 154 insertions(+), 14 deletions(-) + +commit 8a6308e1448f402bd4f32b18ba2c60a4bcdbbe6f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 22:00:25 2007 -0500 + + [doc] Update list of header files to ignore + + doc/public/Headers.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fed13e77e1de071ddaaf829aced10b02f6bc8c90 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 16:49:47 2007 -0500 + + [NEWS] Fix typos + + NEWS | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit ab1887f4b08784789f39396b3012dffede845466 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 2 13:30:31 2007 -0800 + + [quartz] Bug 3939 - Fix Quartz backend endianness problem + + Add kCGBitmapByteOrder32Host to CGImageCreate call in release_dest_image + of Quartz surface. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2640aa7e99453f17e9a2cb9084e0760d767cfeab +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 13:18:11 2007 -0800 + + Add notes for 1.3.16 + + Now, maybe we won't actually make a 1.3.16 snapshot, but these are all + the things that will be new in 1.4.0 compared to 1.3.14. + + NEWS | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 139 insertions(+) + +commit a0bc2ada784f24ca784617ac18b470745e8152c0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 2 15:45:02 2007 -0500 + + [test] Support passing extra valgrind flags + using EXTRA_VALGRIND_FLAGS make variable or CAIRO_EXTRA_VALGRIND_FLAGS + env variable. + + test/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit cd43c03d162efc87a1845c7ffbadfab00ac23d1f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 12:30:53 2007 -0800 + + Fix leak of an output stream in cairo_type1_font_destroy + + src/cairo-type1-fallback.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 8c579ef8354720c06db702db1e6e2aaab0efed82 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 12:30:14 2007 -0800 + + More tightening of test cleanup to avoid valgrind complaints. + + test/cairo-test.c | 8 ++++---- + test/fallback-resolution.c | 2 ++ + test/font-face-get-type.c | 2 ++ + test/pdf-features.c | 9 +-------- + test/ps-features.c | 9 +-------- + test/pthread-show-text.c | 8 +------- + 6 files changed, 11 insertions(+), 27 deletions(-) + +commit 9854d01a8d3a1f9f6148dfd6e22623c4586aaa96 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 11:32:47 2007 -0800 + + Fix leak in pattern-getters test (missing cairo_pattern_destroy) + + test/pattern-getters.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b52dda62fea0745cc28d6149dc4688ade524b4df +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 11:31:13 2007 -0800 + + Augment cairo_test_init with cairo_test_fini to avoid leak + + Without this, any tests that were using cairo_test_init rather than + cairo_test would end up leaking a FILE* for the log file. So this + keeps valgrind much more happy with the test suite. + + test/cairo-test.c | 8 +++++++- + test/cairo-test.h | 14 +++++++++----- + test/copy-path.c | 2 ++ + test/create-for-stream.c | 2 ++ + test/in-fill-empty-trapezoid.c | 2 ++ + test/multi-page.c | 2 ++ + test/pattern-get-type.c | 2 ++ + test/svg-clip.c | 2 ++ + test/svg-surface.c | 2 ++ + test/truetype-tables.c | 2 ++ + test/xlib-surface.c | 32 +++++++++++++------------------- + 11 files changed, 45 insertions(+), 25 deletions(-) + +commit 7d6e21c7e298e1795f36fdf021d61ef4ed0ca0fa +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 11:29:40 2007 -0800 + + Add even more XrmGetFileDatabase leaks to the valgrind suppressions file + + test/.valgrind-suppressions | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit e054314e5ec1f3fbdc97ed2175dd3d26d7581a5f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 09:34:46 2007 -0800 + + Add a couple of missing test cases to .gitignore + + test/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 02f2ece88dbceaf2466bd61410dd8e88a4c95e08 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 09:32:14 2007 -0800 + + Fix leak in pdiff lpyramid + + This was a leak in the test suite only, (and then only when tests failed). + + test/pdiff/lpyramid.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6da7f140334835be9a972db75de78d99b8bd24b1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 03:49:11 2007 -0800 + + Fix INVALID_RESTORE case to avoid crashes + + Previously, an INVALID_RESTORE error would leave cr->gstate as NULL, + (which is generally impossible/invalid). This seems safe enough as + most cairo functions check cr->status first and bail if anything + looks fishy. + + However, the many cairo_get functions happily march along in spite + of any current error. We could instrument all of those functions to + check for the error status and return some dummy value in that case. + But it's much easier to get the same basic effect by simply creating + a non-NULL cr->gstate which will hold all those dummy values, and + we can eliminate the crashes without having to touch up every + cairo_get function. + + This fixes the bug reported here: + + evolution crash to _cairo_gstate_backend_to_user() + https://bugs.freedesktop.org/show_bug.cgi?id=9906 + + It also eliminates the crash that was added to the nil-surface test + with the previous commit. + + src/cairo.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 36590fd4702cc24acacd20e4394c902e44be46c6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 03:43:46 2007 -0800 + + Add test of cairo_get_* after INVALID_RESTORE to nil-surface + + This new test demonstrates a crash condition as reported here: + + evolution crash to _cairo_gstate_backend_to_user() + https://bugs.freedesktop.org/show_bug.cgi?id=9906 + + test/nil-surface.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 712447856dc5cf559fcdbceaf902a39fd5eddef9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 03:15:35 2007 -0800 + + Fix yet another backend (quartz) for the gradient renaming + + So it looks like it took us three commits before we finally got + all of the users of inner/outer switched to c1/c2. Hopefully + someday we'll have the compiler passing over all of cairo's + source code even if the backends aren't available to be run + on a particular system. + + src/cairo-quartz-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 4e0f0d9425e2677e75681b2416e7ee4c4e87440c +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 03:11:10 2007 -0800 + + Don't crash if backend->create_similar returns a nil surface + + This fixes the bug reported here: + + cairo crashes in cairo_create_simular if nil surface returned by other->backend->create_similar + https://bugs.freedesktop.org/show_bug.cgi?id=9844 + + src/cairo-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit b0c086fce45a72ea3bf0052641de63bf08e5e5d5 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 02:51:53 2007 -0800 + + Update documentation for cairo_get_scaled_font and cairo_get_font_face + + There was some leftover cut-and-paste description of get_font_face + in the documentation for get_scaled_font. That turned out to be a + good thing as it alerted me to the fact that the get_font_face + documentation was stale as well. + + Add description of the 'nil' object return values, rather than NULL. + + src/cairo.c | 32 +++++++++++++++++++++++--------- + 1 file changed, 23 insertions(+), 9 deletions(-) + +commit 5f386bb15a234983090beb4f85dfee200dac1b4b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Feb 28 13:37:21 2007 -0500 + + Use a closed interval when eliminating outliers from performance measurements + + When choosing the samples that are not outliers we use a half-open interval + (outlier_min <= x < outlier_max). This causes all of the samples to be + discarded when the interquartile range is 0 because none of them are less + than outlier_max. Fix the problem and make the test more consistent by + using a closed interval (outliner_min <= x <= outlier_max). + + perf/cairo-stats.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d48f31370172cddb85ae17a12faed2abf651ee83 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Fri Mar 2 18:37:06 2007 +0800 + + glitz: fix build error. + + Rename radial gradient inner/outer to c1/c2. + + src/cairo-glitz-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit c12a4571affe9fdd2bb4620c448aded43584bb54 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 00:37:21 2007 -0800 + + Cast -1 values to unsigned to quiet the compiler. + + Marking the magic values to indicate we really did mean to type them. + + src/cairo-pattern.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3685a66b5b9cb0af10b44985dc1e9ef1c82ad77b +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 2 00:22:57 2007 -0800 + + Cast away a const to quiet a compiler warning. + + src/cairo-ps-surface.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit d48bb4fbe876a93199ba48fcf5f32734fbe18ba9 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 1 23:34:34 2007 -0800 + + Implement CAIRO_MUTEX_INIT with memcpy instead of pthread_mutex_init + + The trick here is that with the weak symbol support for pthreads, + pthread_mutex_init can be a NOP leaving the mutex uninitialized. + Then, if some pthread-using library is dynamically loaded, the + non-NOP pthread functions get used and we end up trying to lock + an uninitialized mutex. + + This should fix the bugs reported here: + + Cairo 1.3.14 deadlocks in cairo_scaled_font_glyph_extents or _cairo_ft_unscaled_font_lock_face + https://bugs.freedesktop.org/show_bug.cgi?id=10035 + + src/cairoint.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit df2d42ac7fb71997abd406fb5716c0bd85037c04 +Merge: ec11ca3 97dbbae +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 1 17:08:03 2007 -0800 + + Merge branch 'radial-gradient-fixes' into cairo + +commit ec11ca33a7ebcc752218e63c57f861de6e23a86a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 19:14:40 2007 -0500 + + [PS/PDF] Mark CAIRO_EXTEND_PAD for surface patterns as natively supported + since the image surface does not implement that case either, so image + fallbacks have no benefit. + + src/cairo-pdf-surface.c | 12 +++++++----- + src/cairo-ps-surface.c | 12 +++++++----- + 2 files changed, 14 insertions(+), 10 deletions(-) + +commit 4ee6cda6e5e69361d3ca247322c92d0ae30e0458 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 19:13:19 2007 -0500 + + [test] Move .la dependencies around + + test/Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit ff06ea1abf2dcfe28a4c1f192782bc85aebfdd92 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 19:12:58 2007 -0500 + + [boilerplate] Add correct dependency on libcairo.la + + boilerplate/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4b1f450f4cf056b4cc28502dcf72eaf54f257c3a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 18:36:27 2007 -0500 + + [test] Add more valgrind suppressions + + test/.valgrind-suppressions | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit dcdcb7ac2acf39c54da855b6a2af4d02a7165a24 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 18:36:16 2007 -0500 + + Fix leak in rectilinear stroking code + + The code was not cleaning up after itself when rejecting a path as + rectilinear. + + src/cairo-path-stroke.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 2acd5b52774e2324df3e6b5b07a0d2790df3a60b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 18:34:53 2007 -0500 + + [test] Add leak-revealing path to rectilinear-stroke + + Based on this thread: + http://lists.freedesktop.org/archives/cairo/2007-March/009860.html + + test/rectilinear-stroke.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 97dbbae62182c2e40f5f98278e08c92e14b92731 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 1 15:17:19 2007 -0800 + + SVG: Support CAIRO_EXTEND_NONE for radial gradients. + + This is as simple as adding transparent color stops on either end. + + src/cairo-svg-surface.c | 31 +++++++++++++++++++++++++++---- + 1 file changed, 27 insertions(+), 4 deletions(-) + +commit bd2cd2c868864d5ec2a2c2e4bf16ff406be8afe2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 18:14:33 2007 -0500 + + [test] Plug a leak in the test suite + + test/buffer-diff.c | 1 + + 1 file changed, 1 insertion(+) + +commit 7de96a1faabfc2aa84dac38f5b63c2ba3538bb3c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 18:00:23 2007 -0500 + + [xlib] Drop XrmFinalize() stuff. That didn't ever exist in any public X server + + configure.in | 4 ---- + src/cairo-xlib-screen.c | 5 ----- + 2 files changed, 9 deletions(-) + +commit fe68e8aa32cc5a9f4d9f9302644ca66d8b691d65 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 28 00:41:47 2007 -0800 + + Fix gradient walker to not reset needlessly + + Previously the gradient walker was doing excessive resets, (such + as on every pixel in constant-colored regions or outside the + gradient with CAIRO_EXTEND_NONE). Don't do that. + + pixman/src/fbcompose.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit 9a5dfe1415dce9d726c93cd08c532f26512a70ee +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 1 14:53:48 2007 -0800 + + Fix implementation of radial gradients for inner radius != 0 + + The previous implementation fell apart quite badly when neither radius + value was equal to 0.0. I derived the math from scratch, (much thanks to + Vincent Torri <vtorri@univ-evry.fr> for guiding me to a simpler derivation + than I was doing originally), and it's working much better now without + being any slower, (in fact, cairo-perf shows speedup of 1.05x to 1.58x on + my laptop here). + + This work also provides groundwork for defining the behavior of radial + gradients where neither circle is wholly contained within the other, (though + we haven't done that definition yet---it will require a new test case and a + very little bit of work on the implementation). + + This is a fix for the following bug report: + + Radial Gradients with nonzero inner radius misplace stops + https://bugs.freedesktop.org/show_bug.cgi?id=7685 + + pixman/src/fbcompose.c | 196 +++++++++++++++++++++++++++++++++++++------------ + pixman/src/icimage.c | 22 ++---- + pixman/src/icimage.h | 13 ++-- + pixman/src/icint.h | 1 + + 4 files changed, 165 insertions(+), 67 deletions(-) + +commit 0439f4c4f7e7374b4f9699f664fc0e157628b190 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Feb 25 16:01:10 2007 +0100 + + Rename radial gradient inner/outer to c1/c2 + + The inner/outer names were totally bogus. It is quite + legitimate to have the first circle's radius be larger than + that of the second. + + pixman/src/icimage.c | 12 ++++++------ + pixman/src/pixman.h | 4 ++-- + src/cairo-pattern.c | 36 ++++++++++++++++++------------------ + src/cairo-pdf-surface.c | 12 ++++++------ + src/cairo-svg-surface.c | 12 ++++++------ + 5 files changed, 38 insertions(+), 38 deletions(-) + +commit d65455ed3800f9ec3115bbed96a5b2328ee60b57 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 23 07:12:03 2007 +0100 + + Add radial-gradient test case + + Embarrassingly enough, the test suite previously never called + into cairo_pattern_create_radial at all. Unsurprisingly, this + has led to bugs creeping into the radial gradient implementation. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/radial-gradient-ref.png | Bin 0 -> 91159 bytes + test/radial-gradient.c | 110 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 112 insertions(+) + +commit 17f6174bb2b877447e524715792c7adc84fb25e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 13:50:23 2007 -0500 + + [TODO] Add cairo_surface_copy_page() + + TODO | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit c9ddb86e67154624f08a30599ba6f8d77f731b3a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 1 13:49:13 2007 -0500 + + [paginated] Also increase page number in copy_page + + src/cairo-paginated-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit dc0043383b24425282ce38ba06422991c37c1d7e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Mar 1 23:39:10 2007 +1030 + + PDF: Ensure ToUnicode CMap name is unique + + and remove an unused printf argument. + + src/cairo-pdf-surface.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 7d03fe94d76eee7b3e4bcc274effaa26bc9bd9af +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 17:08:23 2007 -0500 + + [RELEASING] Add notifying desktop-devel-list + + RELEASING | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 1dd647e26552961d2823ce4ee7cbd354450adf60 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 16:55:30 2007 -0500 + + [TODO] Add/remove items + + TODO | 49 ++++++++++++++++------------------------- + boilerplate/cairo-boilerplate.c | 1 + + 2 files changed, 20 insertions(+), 30 deletions(-) + +commit d0fe666a6ab1664af36a7b242d763c72f4e9f81b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 14:58:57 2007 -0500 + + Revert the solid-pattern cache + + This reverts the following commits: + + 2715f2098127d04d2f9e304580a26cd0842c0e64 + 67e3b3c53bdd69e4d3503eed2db66953f1ac038c + + See this thread for an analysis of the problems it caused: + + http://lists.freedesktop.org/archives/cairo/2007-February/009825.html + + In short, a single cache for all backends doesn't work, as one thread + using any backend can cause an unused xlib pattern to be evicted from + the cache, and trigger an xlib call while the display is being used + from another thread. Xlib is not prepared for this. + + src/cairo-color.c | 7 ---- + src/cairo-debug.c | 2 - + src/cairo-directfb-surface.c | 12 +----- + src/cairo-glitz-surface.c | 24 +----------- + src/cairo-pattern.c | 91 ++++---------------------------------------- + src/cairo-surface.c | 26 ------------- + src/cairo-win32-surface.c | 13 +------ + src/cairo-xcb-surface.c | 17 +-------- + src/cairo-xlib-surface.c | 17 +-------- + src/cairoint.h | 15 -------- + 10 files changed, 12 insertions(+), 212 deletions(-) + +commit 5f5afac8f470ae13ab2827f04e05ca585d69b898 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 14:32:11 2007 -0500 + + [boilerplate/test-paginated] Issue a show_page before writing buffer + + This is needed since cairo-test does not issue a show_page now, and + the one coming from paginated layer is too late (around finish). + + The way we force the show_page is kinda funny. That is, we create + a temporary cairo_t and call cairo_show_page() on it. But works. + + boilerplate/cairo-boilerplate.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit efe8c82738bd417402a18871c40cf831e4df31e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 14:19:18 2007 -0500 + + [paginated] Also do an automatic show page if nothing ever drawn + + That is, we always emit at least one page of output. Otherwise our + PS/PDF/SVG files would be corrupt, and output with zero pages does + not make much sense. + + src/cairo-paginated-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 07d61af8093be501e93d64cc7df69f95ecb83b6c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 13:46:27 2007 -0500 + + [paginated] Automatically issue a final cairo_show_page() + + This means, PS/PDF/SVG do not need the final cairo_show_page() anymore. + If there is any drawing in the page, a cairo_show_page() is done + automatically. + + src/cairo-paginated-surface.c | 18 +++++++++++++----- + test/cairo-test.c | 2 -- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit d30178b3dcebcdd89dc773881fc1b9097f1f50a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 20:22:05 2007 -0500 + + [doc] Add new APIs to cairo-sections.txt + + doc/public/cairo-sections.txt | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +commit ef53465a032a74fd50b7edaef19cae08586f44d4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 20:18:16 2007 -0500 + + Slim-hidden cairo_scale() + + src/cairo.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit ed75e24898a5ccd7836596122b9a801294122874 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 20:09:22 2007 -0500 + + Implement cairo_get_scaled_font() + + TODO | 2 -- + doc/public/cairo-sections.txt | 7 ++++--- + src/cairo-gstate.c | 15 +++++++++++++++ + src/cairo-scaled-font.c | 2 +- + src/cairo.c | 30 ++++++++++++++++++++++++++++++ + src/cairo.h | 3 +++ + src/cairoint.h | 5 +++++ + test/font-face-get-type.c | 14 ++++++++++++-- + 8 files changed, 70 insertions(+), 8 deletions(-) + +commit d64b194a45d90b24d1cc01de0fa2cb4edc3a240b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 20:03:26 2007 -0500 + + [quartz] Remove comment syntax that is recognized by gtkdoc from regular comments + + src/cairo-quartz-surface.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 65ab63cb8dc1da949dc831691cf1db5b6b92d749 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 19:45:10 2007 -0500 + + [cairo.c] Reorder some function implementations for clarity + + src/cairo.c | 56 ++++++++++++++++++++++++++++---------------------------- + 1 file changed, 28 insertions(+), 28 deletions(-) + +commit ed933a199c07997cf1dfb5ef2e345d754e2433f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 19:43:18 2007 -0500 + + [cairo.h] Reorder function prototypes a bit for clarity + + src/cairo.h | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 153465bfe5346b9e1ebdbd4f794bd11868ee7458 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 19:28:37 2007 -0500 + + [test] Add ref images for new tests + + test/surface-pattern-scale-down-pdf-argb32-ref.png | Bin 0 -> 1565 bytes + test/surface-pattern-scale-down-ps-argb32-ref.png | Bin 0 -> 1400 bytes + test/surface-pattern-scale-down-ref.png | Bin 0 -> 1784 bytes + test/surface-pattern-scale-down.c | 3 +-- + test/surface-pattern-scale-up-pdf-argb32-ref.png | Bin 0 -> 3886 bytes + test/surface-pattern-scale-up-ps-argb32-ref.png | Bin 0 -> 1011 bytes + test/surface-pattern-scale-up-ref.png | Bin 0 -> 3825 bytes + test/surface-pattern-scale-up.c | 3 +-- + test/surface-pattern.c | 3 +-- + 9 files changed, 3 insertions(+), 6 deletions(-) + +commit e2ce27db302a185e6e80ead699c01e43921939ca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 18:47:47 2007 -0500 + + [PS/PDF] Fix xstep/ystep values for CAIRO_EXTEND_NONE + + This fixes the fallback-resolution test, as well as the two of + surface-pattern-scale-up and surface-pattern-scale-down. + + src/cairo-pdf-surface.c | 36 +++++++++++++++--------------------- + src/cairo-ps-surface.c | 43 ++++++++++++++++++++++++++++--------------- + 2 files changed, 43 insertions(+), 36 deletions(-) + +commit de0a6522b00822305fa5a0e32c4821628425ebdc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 17:33:17 2007 -0500 + + [test] Add tests that show xstep/ystep failures in PS/PDF backends + with surface patterns. One test scaled the pattern up, another scales + down. We observe that both PS and PDF are broken when scaling down. + This is the reason that PDF is failing in the fallback-resolution test + too. + + test/.gitignore | 2 ++ + test/Makefile.am | 2 ++ + test/surface-pattern-scale-down.c | 69 +++++++++++++++++++++++++++++++++++++++ + test/surface-pattern-scale-up.c | 69 +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 142 insertions(+) + +commit 4c1d788219ae62bb9e8a7723d5a73d70eb42e69a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 13:33:53 2007 -0500 + + [Makefile.am] Remove ChangeLog.cache-* in distclean + + ChangeLog.mk | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7185c00e15aecf14d1957ba2e4f386ecb4e2a635 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 16:21:28 2007 -0500 + + [PS] Add note about possible need for fix. + + src/cairo-ps-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit aa3ebdbd01eb27e205b44728f9f5d9332c5ad450 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 16:19:04 2007 -0500 + + [TODO] More TODO items + + TODO | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit 38b590d8b7f1f955653bca5cf4cceb723e173ade +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 16:18:00 2007 -0500 + + [SVG] Fix warnings + + src/cairo-svg-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 69edcd4623ae4e1ef16c5a8d16a5ebd0c79d685f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 16:15:44 2007 -0500 + + [SVG] Rename a local variable for clarity + + src/cairo-svg-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 11b3f43e927919a46909900a63386a1af788529a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 16:14:37 2007 -0500 + + [TODO] Add various TODO items + + src/cairo-image-surface.c | 1 + + src/cairo-pattern.c | 1 + + 2 files changed, 2 insertions(+) + +commit 2d908e6a957c8b1e7f369621aaace2fc7277a941 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 18:24:19 2007 -0500 + + [test] Add a new, XFAIL, extend-pad test + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/extend-pad-ref.png | Bin 0 -> 616 bytes + test/extend-pad.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 78 insertions(+) + +commit 289ac33fa28216cc6cc3e3d415cc4ff96cb17e12 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 18:23:10 2007 -0500 + + [PS] Fix surface patterns with transforms + + Previously we were generating an image object with the desired + transform and then a pattern with only a translation. This means, + the pattern was alwasys axis-aligned. Obviously this does not + work correctly with repeated rotated patterns. + + We now use an identity matrix for the image and put all the + pattern transformation (well, it's inverse) into the pattern. + This fixes the issue nicely. + + The surface-pattern test is still failing even with a reference + image, because the gs rendering of the normal case and the + device-offset=25 case are different and both have seams. + + src/cairo-ps-surface.c | 42 +++++++++++---------------------- + test/surface-pattern-ps-argb32-ref.png | Bin 0 -> 2520 bytes + 2 files changed, 14 insertions(+), 28 deletions(-) + +commit 16013ced09c8d6e2a967b9192f8545716a423504 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 18:07:22 2007 -0500 + + [test] Remove non-existing test extend-pad + + test/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c87edd9e10c2a60e11c8cd954860fb03f6425132 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 16:03:47 2007 -0500 + + [test] Update surface-pattern test to include transformations + + The surface-pattern test was very naive, painting a surface pattern + repeated at identity size. With the new test, the surface pattern + is scaled and rotated. This reveals a serious bug in the PS backend. + + test/surface-pattern-pdf-argb32-ref.png | Bin 0 -> 14880 bytes + test/surface-pattern-ref.png | Bin 194 -> 11439 bytes + test/surface-pattern-svg-ref.png | Bin 0 -> 17663 bytes + test/surface-pattern.c | 94 +++++++++++++++----------------- + 4 files changed, 43 insertions(+), 51 deletions(-) + +commit 7c39276366f91de151c775fa8293783f39247896 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 13:40:55 2007 -0500 + + [PS/PDF] Accept CAIRO_EXTEND_REFLECT surface patterns natively + + With the hack in _cairo_pattern_acquire_surface to return a 2x2 + surface for reflected patterns, we can now accept REFLECT surface + patterns natively in all backends. SVG was already doing that. + The PDF case needed some changes to go through + _cairo_pattern_acquire_surface. A similar change to the recent + change in SVG. + + src/cairo-pdf-surface.c | 19 +++++++++++++++---- + src/cairo-ps-surface.c | 4 ++-- + 2 files changed, 17 insertions(+), 6 deletions(-) + +commit 3405fb870e520bcc5588602317693837b59d1ee4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 13:10:34 2007 -0500 + + [test] Increase size of extend-reflect test to see that pattern repeats + + test/Makefile.am | 1 + + test/extend-reflect-ref.png | Bin 287611 -> 589279 bytes + test/extend-reflect.c | 2 +- + 3 files changed, 2 insertions(+), 1 deletion(-) + +commit 63c011bb6bcbe484915b5bb28da087b14bd572a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 18:29:25 2007 -0500 + + [surface] Copy device_transform_inverse in _cairo_surface_clone_similar + + src/cairo-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 3516d8092b6297b8e4a3919c09e47f2bd4dd600a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 18:13:16 2007 -0500 + + [SVG] Use _cairo_pattern_acquire_surface instead of _cairo_surface_acquire_source_image + + This change is required for the upcoming hack to support + CAIRO_EXTEND_REFLECT. In short, the idea is that the surface returned + by _cairo_pattern_acquire_surface may look different from the one + returned by _cairo_surface_acquire_source_image, to support some pattern + modes not supported by the backends directly. + + src/cairo-svg-surface.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +commit 8d812ae9a670b2eeff4f0508e2c8c082e7900a7c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 14:13:33 2007 -0500 + + [cairo-pattern] Correctly delegate device_transform so tests pass again + + src/cairo-pattern.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 7cbfb9556d869310c48c106a9929c292110685ce +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 12:56:05 2007 -0500 + + [cairo-pattern] Fall back on cairo_surface_create_similar in _cairo_pattern_acquire_surface_for_surface + + This was needed for SVG backend because it does not implement clone_similar. + However, I'm worried about possible infinite recursion here. Not sure what + to do. + + src/cairo-pattern.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 5562050bcf68923986b597f3aca1e285a466fa6c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 18:16:34 2007 -0500 + + Support CAIRO_EXTEND_REFLECT on surface patterns + + We do this through a hack, that is, we make + _cairo_pattern_acquire_surface to return a surface that has four + copies of the original surface painted such that this image can + be simply repeated to get the effect of reflecting the original + surface. + + This fixes the formerly XFAIL test extend-reflect. + + src/cairo-pattern.c | 58 +++++++++++++++++++++++++++++++++++++++++++- + test/Makefile.am | 2 +- + test/extend-reflect-ref.png | Bin 287611 -> 287611 bytes + test/extend-reflect.c | 4 +-- + 4 files changed, 59 insertions(+), 5 deletions(-) + +commit 81935bb13120898a8581d8266041d3292558710a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 18:06:02 2007 -0500 + + [PS] Update surface_pattern_supported() from PDF + + The PS backend was accepting all surface patterns, just to ASSERT_NOT_REACHED + later if extend type of the pattern was PAD or REFLECT. That didn't make + sense and was causing crash for PAD (surprisingly not for REFLECT. Not sure + why). So now it rejects those types of surface patterns, just like the PDF + surface does. + + src/cairo-ps-surface.c | 24 +++++++++++++++++++++++- + 1 file changed, 23 insertions(+), 1 deletion(-) + +commit 4e30919f30e7618dbb62d7de2931efaac26c1785 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 18:03:52 2007 -0500 + + [cairo-surface] Do not err on CAIRO_EXTEND_PAD and CAIRO_EXTEND_REFLECT + + for surface patterns. + + Right before releasing cairo 1.2, Carl and I decided to return error on + CAIRO_EXTEND_PAD and CAIRO_EXTEND_REFLECT for surface patterns, as they + are not implemented and one was causing crashes. Well, that was probably + the worst decision we could make (other than ignoring the problem). A + much better decision would have been to make them act like + CAIRO_EXTEND_NONE and CAIRO_EXTEND_REPEAT respectively. Anyway, remove + the error paths. + + src/cairo-surface.c | 30 ------------------------------ + 1 file changed, 30 deletions(-) + +commit a57bc6b6973a270ef85d73089ebd9d10b3bc5aa8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 17:59:28 2007 -0500 + + [test] Add ref image for extend-reflect + + test/extend-reflect-ref.png | Bin 0 -> 287611 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 5a72aac5982015a2b237afeb13164e0c5f5185ed +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Feb 23 14:24:04 2007 -0800 + + [core] put back REF_COUNT_INVALID to be -1, fix finish + + Previous commit broke cairo_surface_finish, since it was checking for + ref_count == CAIRO_REF_COUNT_INVALID and bailing. But, that condition + was reached from destroy, so finish was bailing out early. + + src/cairo-font.c | 3 +++ + src/cairo-pattern.c | 3 +++ + src/cairo-scaled-font.c | 3 +++ + src/cairo-surface.c | 3 +++ + src/cairo.c | 3 +++ + src/cairoint.h | 2 +- + 6 files changed, 16 insertions(+), 1 deletion(-) + +commit cf7311852298e7d86d065a12fa962ba10fe60dcc +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Feb 23 13:05:18 2007 -0800 + + [core] Add user_data and reference count getters to all objects + + user_data setters/getters were added to public refcounted objects + that were missing them (cairo_t, pattern, scaled_font). Also, + a refcount getter (cairo_*_get_reference_count) was added to all + public refcounted objects. + + src/cairo-font.c | 18 ++++++++++++ + src/cairo-pattern.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-private.h | 2 ++ + src/cairo-scaled-font.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo-surface.c | 17 +++++++++++ + src/cairo.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 45 ++++++++++++++++++++++++++++ + src/cairoint.h | 17 ++++++----- + 8 files changed, 319 insertions(+), 9 deletions(-) + +commit 67e3b3c53bdd69e4d3503eed2db66953f1ac038c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 10:59:57 2007 -0500 + + [xlib/xcb] Check for same_screen in is_compatible + + Two drawables can be used in an X and Render operation only if they share + the same screen. Previously we were only checking for the same display + in is_compatible. Check for the same screen now. + + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit a1e5b91588a4f51c03487b480f13c100d07f64f8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 23 22:55:29 2007 +1030 + + Subsetting: Add check for malloc() error + + src/cairo-scaled-font-subsets.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 27312591fe7ce14f65aac88ee7206ddcf3cbd0b1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 23 22:14:42 2007 +1030 + + Win32: Fix _cairo_win32_scaled_font_map_glyphs_to_unicode return type + + src/cairo-win32-font.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 3b168e45510e02caf54e4b3cd0df76df6420d304 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 22 23:14:58 2007 -0500 + + [FreeType] Truely return unhinted advance width if metrics hinting is off + + David Turner said: + The returned 26.6 advance is always rounded, even with FT_LOAD_NO_HINTING. + You can however retrieve the linearly scaled value as a 16.16 fixed float + number through face->glyph->linearHoriAdvance. This works even with hinted + glyphs. + + src/cairo-ft-font.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit 0ff5192e4cb5b1113bed3c9cf1c0275065aafd14 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 15:57:21 2007 -0500 + + [Makefile.am] Include boilerplate/ in SUBDIRS + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1bc1f8ef46a27aa21f8d29b39e645ee5a0e95cda +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Feb 21 23:23:32 2007 +0100 + + Set overflow to visible for symbols. + + It makes viewers implementing correctly the SVG specification show texts. + + src/cairo-svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7d91c8a2cb3f2a5e0afe0d0c90956add51a4e27c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 15:47:43 2007 -0500 + + [test] Fix syntax typo in text-rotate + + test/text-rotate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 155a1b48f6c8265ad5dd594354b66b3e8341bade +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 13:52:17 2007 -0500 + + [test] Remove text-rotate test from XFAIL as the bugs are fixed now + + All missing is subpixel text positioning, but we don't need an XFAIL test + to remind us for that. + + test/Makefile.am | 6 +++--- + test/text-rotate-ps-argb32-ref.png | Bin 0 -> 7198 bytes + test/text-rotate-ref.png | Bin 12300 -> 17775 bytes + test/text-rotate-rgb24-ref.png | Bin 5640 -> 0 bytes + test/text-rotate-svg-ref.png | Bin 0 -> 18301 bytes + test/text-rotate.c | 12 +++++++++++- + 6 files changed, 14 insertions(+), 4 deletions(-) + +commit b54174e917e273143455661d565412fb9a185bfb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 13:43:08 2007 -0500 + + [PS] Fix rotated image pattern emission by correcting setting the bbox + + The bug was that the bounding box of the image was computed by transforming + the vector (width,height) and then using 0,0,width,height as the bounding box. + This is obviously wrong. We use _cairo_matrix_transform_bounding_box() now. + This fixes the XFAIL test rotate-image-surface-paint. + + src/cairo-ps-surface.c | 31 +++++++++++++++------- + test/Makefile.am | 1 - + test/rotate-image-surface-paint-ps-argb32-ref.png | Bin 0 -> 276 bytes + 3 files changed, 21 insertions(+), 11 deletions(-) + +commit 6ae4a4fd71b030376ec373f2a787eac32b21d7f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 12:57:09 2007 -0500 + + [test] Remove ft-text-vertical-layout-type1 from XFAIL + and update reference images. This test was fixed some time ago + where I disabled type1 subsetting for vertical layouts, then + turned XFAIL again when Carl Worth didn't have the same fonts as me. + I've not updated reference images to work on FC6 and hoping that it + works for Carl too. + + test/Makefile.am | 1 - + test/ft-text-vertical-layout-type1-ref.png | Bin 3970 -> 3960 bytes + test/ft-text-vertical-layout-type1-svg-ref.png | Bin 3948 -> 3934 bytes + 3 files changed, 1 deletion(-) + +commit c6a067f967f9b92328e7d1ca2a4eba6fb4c6dfdf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 11:50:24 2007 -0500 + + [test] Add test case for bug #7965 to the get-path-extents test + + test/get-path-extents.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 363b1a40b5719582c670bdb9e7cd8087bcbf9666 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 20 16:18:27 2007 -0800 + + [quartz] Remove (disabled) support for rendering via AGL/CGGL + + src/cairo-quartz-private.h | 10 ----- + src/cairo-quartz-surface.c | 106 ++------------------------------------------- + src/cairo-quartz.h | 11 ----- + 3 files changed, 3 insertions(+), 124 deletions(-) + +commit e4a1410514471c2cb290d691ca77c4ab24a6541c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 20 16:16:18 2007 -0800 + + [quartz] Rename public function parameter from surf -> surface + + src/cairo-quartz-surface.c | 8 ++++---- + src/cairo-quartz.h | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 28c1e46b8e082f65fc94c984ea3b66df5adaa529 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 20 13:22:11 2007 -0800 + + [quartz] rename test override images from nquartz to quartz + + test/caps-joins-alpha-nquartz-ref.png | Bin 2466 -> 0 bytes + test/caps-joins-alpha-quartz-ref.png | Bin 0 -> 2466 bytes + test/clip-nesting-nquartz-ref.png | Bin 1067 -> 0 bytes + test/clip-nesting-nquartz-rgb24-ref.png | Bin 956 -> 0 bytes + test/clip-nesting-quartz-ref.png | Bin 0 -> 1067 bytes + test/clip-nesting-quartz-rgb24-ref.png | Bin 0 -> 956 bytes + test/clip-push-group-nquartz-ref.png | Bin 203 -> 0 bytes + test/clip-push-group-quartz-ref.png | Bin 0 -> 203 bytes + test/clip-twice-nquartz-ref.png | Bin 1171 -> 0 bytes + test/clip-twice-nquartz-rgb24-ref.png | Bin 1111 -> 0 bytes + test/clip-twice-quartz-ref.png | Bin 0 -> 1171 bytes + test/clip-twice-quartz-rgb24-ref.png | Bin 0 -> 1111 bytes + test/dash-caps-joins-nquartz-ref.png | Bin 4727 -> 0 bytes + test/dash-caps-joins-quartz-ref.png | Bin 0 -> 4727 bytes + test/degenerate-path-nquartz-rgb24-ref.png | Bin 188 -> 0 bytes + test/degenerate-path-quartz-rgb24-ref.png | Bin 0 -> 188 bytes + test/fill-and-stroke-alpha-add-nquartz-ref.png | Bin 603 -> 0 bytes + test/fill-and-stroke-alpha-add-quartz-ref.png | Bin 0 -> 603 bytes + test/fill-and-stroke-alpha-nquartz-ref.png | Bin 550 -> 0 bytes + test/fill-and-stroke-alpha-quartz-ref.png | Bin 0 -> 550 bytes + test/fill-and-stroke-nquartz-ref.png | Bin 286 -> 0 bytes + test/fill-and-stroke-nquartz-rgb24-ref.png | Bin 264 -> 0 bytes + test/fill-and-stroke-quartz-ref.png | Bin 0 -> 286 bytes + test/fill-and-stroke-quartz-rgb24-ref.png | Bin 0 -> 264 bytes + test/fill-degenerate-sort-order-nquartz-ref.png | Bin 2470 -> 0 bytes + test/fill-degenerate-sort-order-nquartz-rgb24-ref.png | Bin 2098 -> 0 bytes + test/fill-degenerate-sort-order-quartz-ref.png | Bin 0 -> 2470 bytes + test/fill-degenerate-sort-order-quartz-rgb24-ref.png | Bin 0 -> 2098 bytes + test/fill-rule-nquartz-ref.png | Bin 2079 -> 0 bytes + test/fill-rule-nquartz-rgb24-ref.png | Bin 1790 -> 0 bytes + test/fill-rule-quartz-ref.png | Bin 0 -> 2079 bytes + test/fill-rule-quartz-rgb24-ref.png | Bin 0 -> 1790 bytes + test/new-sub-path-nquartz-ref.png | Bin 386 -> 0 bytes + test/new-sub-path-nquartz-rgb24-ref.png | Bin 357 -> 0 bytes + test/new-sub-path-quartz-ref.png | Bin 0 -> 386 bytes + test/new-sub-path-quartz-rgb24-ref.png | Bin 0 -> 357 bytes + test/operator-clear-nquartz-ref.png | Bin 1195 -> 0 bytes + test/operator-clear-nquartz-rgb24-ref.png | Bin 1244 -> 0 bytes + test/operator-clear-quartz-ref.png | Bin 0 -> 1195 bytes + test/operator-clear-quartz-rgb24-ref.png | Bin 0 -> 1244 bytes + test/random-intersections-nquartz-ref.png | Bin 203877 -> 0 bytes + test/random-intersections-nquartz-rgb24-ref.png | Bin 179204 -> 0 bytes + test/random-intersections-quartz-ref.png | Bin 0 -> 203877 bytes + test/random-intersections-quartz-rgb24-ref.png | Bin 0 -> 179204 bytes + test/rel-path-nquartz-ref.png | Bin 212 -> 0 bytes + test/rel-path-nquartz-rgb24-ref.png | Bin 228 -> 0 bytes + test/rel-path-quartz-ref.png | Bin 0 -> 212 bytes + test/rel-path-quartz-rgb24-ref.png | Bin 0 -> 228 bytes + test/source-clip-scale-nquartz-ref.png | Bin 148 -> 0 bytes + test/source-clip-scale-quartz-ref.png | Bin 0 -> 148 bytes + test/trap-clip-nquartz-ref.png | Bin 5814 -> 0 bytes + test/trap-clip-nquartz-rgb24-ref.png | Bin 5385 -> 0 bytes + test/trap-clip-quartz-ref.png | Bin 0 -> 5814 bytes + test/trap-clip-quartz-rgb24-ref.png | Bin 0 -> 5385 bytes + 54 files changed, 0 insertions(+), 0 deletions(-) + +commit be451cd83d8178bfaf28a1c7dec59601d97cff8d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 20 12:54:03 2007 -0800 + + [quartz] rename NQUARTZ -> QUARTZ in defines + + perf/cairo-perf.c | 1 - + src/cairo-quartz-private.h | 4 +++- + src/cairo-quartz-surface.c | 18 +++++++++--------- + src/cairo-quartz.h | 10 +++++----- + 4 files changed, 17 insertions(+), 16 deletions(-) + +commit 4c201723ce8139c2e6620881583bc08e3aa1bad7 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 20 12:15:35 2007 -0800 + + [quartz] Rename nquartz to quartz + + boilerplate/cairo-boilerplate.c | 47 +- + configure.in | 7 - + src/Makefile.am | 6 - + src/cairo-atsui-font.c | 33 +- + src/cairo-nquartz-surface.c | 1864 -------------------------------------- + src/cairo-nquartz.h | 80 -- + src/cairo-quartz-private.h | 30 +- + src/cairo-quartz-surface.c | 1899 ++++++++++++++++++++++++++++++++++++--- + src/cairo-quartz.h | 39 +- + src/cairo.h | 1 - + test/get-clip.c | 3 +- + 11 files changed, 1819 insertions(+), 2190 deletions(-) + +commit 641f0919d53691e561aa665d31cc43524d861215 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 21 00:32:07 2007 +1030 + + PDF/PS: Don't embed multiple copies of the same font + + cairo-scaled-font-subsets stores two sets of subsets - + scaled and unscaled. The first time each glyph is mapped, + _cairo_scaled_glyph_lookup() is called to determine if + the glyph is bitmap or outline. Outline glyphs are put + in the unscaled subsets. Bitmap glyphs are put in the + scaled subsets. The unscaled subsets hash table keyed is + the scaled_font->font_face to ensure only one font for + each font face is created. The scaled subsets hash + table is keyed by scaled_font. + + _cairo_scaled_font_subsets_create() now takes two arguments + to specify the maximum size of the scaled and unscaled subsets. + If the unscaled max size is set to 0 all glyphs are mapped + to scaled subsets. + + A separate foreach function is provided for scaled and unscaled + subsets. The PDF and PS backends iterate over the unscaled + subsets to emit CFF, TrueType, and Type1 fonts. The scaled + subsets are iterated to emit Type3 bitmap fonts. + + src/cairo-pdf-surface.c | 24 +++- + src/cairo-ps-surface.c | 24 +++- + src/cairo-scaled-font-subsets-private.h | 61 +++++++-- + src/cairo-scaled-font-subsets.c | 235 ++++++++++++++++++++++++++------ + src/cairo-svg-surface.c | 8 +- + 5 files changed, 288 insertions(+), 64 deletions(-) + +commit f65c33edbecc1f0e285814995dc1a51748310e36 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 20 01:00:53 2007 -0500 + + [win32] Make win32-surface compile without win32-font + + Hacking on the win32 code, thanks to winelib. Yay! + + src/cairo-win32-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 2335a23a16d84e6ebdde7afbeb1fbceb3bdbe6b6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 20 01:00:17 2007 -0500 + + [test/Makefile.am] Document why svg2png and pdf2png use LDADD + + This is to make librsvg and poppler to use the compiled cairo instead + of whatever is on the system, such that the test suite does not depend + on a good version of cairo being installed already. + + test/Makefile.am | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 8133530ae5848b0a34c299e0c71360931fe383df +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 20 00:57:25 2007 -0500 + + [configure] Improve win32 detection + + We now test for windows.h availability to automatically enable win32 + backends. This nicely enables compiling cairo against libwine by just + setting CC=winegcc LD=winegcc during configure. This currently only + generates static libs though. + + configure.in | 27 ++++++++++++++++++--------- + src/Makefile.am | 7 +++++-- + 2 files changed, 23 insertions(+), 11 deletions(-) + +commit 0fcd6cfe0edff25ad3d11af056ba611bd8d9d8c8 +Author: Jeff Smith <whydoubt@yahoo.com> +Date: Mon Feb 19 16:06:57 2007 -0500 + + Clean up some inconsistent spacing in the stroking code + + src/cairo-path-stroke.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 89010db3ad3ce0a9afaf28fd313da86ebc864c7c +Author: Jeff Smith <whydoubt@yahoo.com> +Date: Mon Feb 19 16:06:57 2007 -0500 + + Add or reword several comments in the stroking code + + src/cairo-path-stroke.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit adb573d0bafd7b555bda0effcbd94b9144981ad6 +Author: Jeff Smith <whydoubt@yahoo.com> +Date: Mon Feb 19 16:06:57 2007 -0500 + + Minor changes to shorten the stroking code + + src/cairo-path-stroke.c | 26 +++++++++----------------- + 1 file changed, 9 insertions(+), 17 deletions(-) + +commit fb29fddd40aeb4c2f1a42f88eddec5c06adf0583 +Author: Jeff Muizelaar <jrmuizel@uwaterloo.ca> +Date: Mon Feb 19 16:06:57 2007 -0500 + + Rename tmp to step_length because that is what it actually is. + + src/cairo-path-stroke.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit afd5f92195335a88d7c1ff181a1bd03ca01b424f +Author: Jeff Muizelaar <jrmuizel@uwaterloo.ca> +Date: Mon Feb 19 16:06:57 2007 -0500 + + Fix several issues with dashed stroking code, particularly 'leaky-dash' + + Adds some state, 'dash_starts_on', to keep track of whether a dashed path + starts with dash_on or not. This fixes the 'leaky-dash' bug (#4863) and + some other degenerate cases. The new version is, in my opinion, + considerably cleaner and more understandable than the old code. + + Finally, the rewrite changes the behaviour of dashing to add degenerate + caps around corners that start at the same place as a dash begins. This + matches the behaviour seen in acroread. + + This rewrite is based on an initial rewrite done by Jeff Smith. + + src/cairo-path-stroke.c | 85 +++++++++++++++++--------------------- + test/Makefile.am | 1 - + test/dash-caps-joins-ref.png | Bin 4680 -> 4718 bytes + test/dash-scale-ref.png | Bin 7791 -> 7908 bytes + test/leaky-dash-ps-argb32-ref.png | Bin 0 -> 286 bytes + test/leaky-dash-ref.png | Bin 241 -> 243 bytes + 6 files changed, 39 insertions(+), 47 deletions(-) + +commit 78ae474d96b48ccba3d18dc26c416ebd6daab502 +Author: Jeff Muizelaar <jrmuizel@uwaterloo.ca> +Date: Mon Feb 19 16:06:56 2007 -0500 + + Rename has_sub_path to has_initial_sub_path + + has_initial_sub_path more accurately describes the condition we want to + track. This flag is used to indicate when an initial sub_path needs capping + but has no associated slope and thus no associated faces. + + src/cairo-path-stroke.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 9f3fb4f753eabc84f19d808df64a718991269670 +Author: Jeff Muizelaar <jrmuizel@uwaterloo.ca> +Date: Mon Feb 19 16:06:56 2007 -0500 + + Add a comment about the point choice when capping degenerate paths + + src/cairo-path-stroke.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit a1a4d6966e1d9c8ccf84c9972a4f9560553948f6 +Author: Jeff Smith <whydoubt@yahoo.com> +Date: Mon Feb 19 16:06:56 2007 -0500 + + Modify how _cairo_stroker_add_caps handles zero-length sub-paths + + For zero-length sub-paths, _cairo_stroker_add_caps sets up a dummy face, + then lets later parts of the function add the caps. + + src/cairo-path-stroke.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 849a9ef81b99d05d8f3ceb4f73bf5e52c90b24af +Author: Jeff Smith <whydoubt@yahoo.com> +Date: Mon Feb 19 16:06:56 2007 -0500 + + Change type of cairo_stroker_t's dash_on from int to cairo_bool_t + + src/cairo-path-stroke.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 74ded42327e87b40de434a28620d0a3fc8e4d249 +Author: Jeff Muizelaar <jrmuizel@uwaterloo.ca> +Date: Mon Feb 19 16:06:56 2007 -0500 + + Add a new dashing test + + This new dashing test, based on some code from Jeff Smith, does a pretty + good job exploring all the cases that the dashing code needs to deal with. + + test/Makefile.am | 2 ++ + test/dash-state-ps-argb32-ref.png | Bin 0 -> 8652 bytes + test/dash-state-ref.png | Bin 0 -> 9389 bytes + test/dash-state.c | 72 ++++++++++++++++++++++++++++++++++++++ + 4 files changed, 74 insertions(+) + +commit 1c1697398c5ef17e38bc031e8c067113a6c10287 +Author: Jeff Muizelaar <jrmuizel@uwaterloo.ca> +Date: Mon Feb 19 16:06:56 2007 -0500 + + Add two new test cases to degenerate-path test + + These new cases deal with degenerate paths at the end of dashed paths. They + currently fail. + + test/degenerate-path-ps-argb32-ref.png | Bin 303 -> 390 bytes + test/degenerate-path-ref.png | Bin 216 -> 257 bytes + test/degenerate-path-rgb24-ref.png | Bin 189 -> 224 bytes + test/degenerate-path.c | 23 ++++++++++++++++++++++- + 4 files changed, 22 insertions(+), 1 deletion(-) + +commit 9927dde5334322c97942982f9bf632e74502d628 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 17 10:55:14 2007 +1030 + + TrueType: fix bug #9998 - build error with gcc 2.95 + + src/cairo-truetype-subset-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9bae496a0a057bb0de70b078ee5cde265663dc86 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Feb 15 23:08:40 2007 +0000 + + [ATSUI] implement load_truetype_table + + Implements load truetype table, allowing selection of + text and searching in pdfs generated using the atsui + font backend. + + src/cairo-atsui-font.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +commit 16e20568a502b86d96c3087515e663bb7996f167 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 16 08:38:26 2007 +1030 + + TrueType: Add post table and 3,0 cmap encoding + + Commit 05ff2c77da86c7be95924f9af4d3ad944afbbf66 contained + a fix for the acroread printing problem. However this + patch caused a problem for the Mac Preview PDF viewer. + + http://lists.freedesktop.org/archives/cairo/2007-February/009615.html + + This patch fixes the Mac Preview problem. The patch + + - Adds a platform 3, encoding 0 cmap table + - Adds a post table that maps the glyph names in the + PDF truetype font dictionary (/g0 /g1 /g2 ...) + to glyph indices in the font. + + src/cairo-truetype-subset-private.h | 1 + + src/cairo-truetype-subset.c | 69 +++++++++++++++++++++++++++++++++---- + 2 files changed, 63 insertions(+), 7 deletions(-) + +commit 2715f2098127d04d2f9e304580a26cd0842c0e64 +Author: Jorn Baayen <jorn@openedhand.com> +Date: Wed Feb 14 18:28:56 2007 -0800 + + [cairo-pattern] Cache surface for solid patterns + + We use a small cache of size 16 for surfaces created for solid patterns. + This mainly helps with the X backends where we don't have to create a + pattern for every operation, so we save a lot on X traffic. Xft uses a + similar cache, so cairo's text rendering traffic with the xlib backend + now completely matches that of Xft. + + The cache uses an static index variable, which itself acts like a cache of + size 1, remembering the most recently used solid pattern. So repeated + lookups for the same pattern hit immediately. If that fails, the cache is + searched linearly, and if that fails too, a new surface is created and a + random member of the cache is evicted. + + Only surfaces that are "compatible" are used. The definition of compatible + is backend specific. For the xlib backend, it means that the two surfaces + are allocated on the same display. Implementations for compatibility are + provided for all backends that it makes sense. + + src/cairo-color.c | 7 ++++ + src/cairo-debug.c | 2 + + src/cairo-directfb-surface.c | 12 +++++- + src/cairo-glitz-surface.c | 24 +++++++++++- + src/cairo-pattern.c | 91 ++++++++++++++++++++++++++++++++++++++++---- + src/cairo-surface.c | 26 +++++++++++++ + src/cairo-win32-surface.c | 13 ++++++- + src/cairo-xcb-surface.c | 17 ++++++++- + src/cairo-xlib-surface.c | 17 ++++++++- + src/cairoint.h | 15 ++++++++ + 10 files changed, 212 insertions(+), 12 deletions(-) + +commit b31179478bf8c18245917caa1bee19bb61f336c1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 14 00:48:42 2007 -0800 + + Bump cairo version to 1.3.15 after making the 1.3.14 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 90e453fc22398f31996a6fdbeec6da98e25a160e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 14 00:34:18 2007 -0800 + + Increment cairo version to 1.3.14 (and libtool versioning to 12:4:10) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 513f21140bae549e088909333598e73e5dac4a44 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 14 00:32:54 2007 -0800 + + NEWS: Add notes for the 1.3.14 snapshot + + NEWS | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 56 insertions(+) + +commit 51ca187d3e5d613a583daf4fa5b244157e3a2c4f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 13 23:55:03 2007 -0800 + + Mark test/rotate-image-surface-paint as XFAIL + + This test has always failed with the ps backend since the test + was initially written. + + test/Makefile.am | 1 + + test/rotate-image-surface-paint.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 9966551dc7640ae7901ffed0e15f0fbf7e603d5d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 13 23:49:26 2007 -0800 + + Fix cairo_ft_unscaled_font_t to have a lock_count again not an is_locked Boolean + + This was inadvertently changed as part of fdffde8b9e7a2308b822ddef7b02a8e85cc8ba1e + + With the Boolean, pango-using programs that locked the same + unscaled_font multiple times would crash with a message such as: + + cairo-ft-font.c:569: _cairo_ft_unscaled_font_unlock_face: Assertion `unscaled->is_locked' failed. + + src/cairo-ft-font.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 7adab2866be21207a15f07aab01fb17edd0e661f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 13 22:05:57 2007 -0800 + + Add missing call to set_scale of unscaled_font in scaled_glyph init + + This fixes a regression introduced with commit: + + 25a370d7992d7f70d8cf79f1b328e40437b40ac4 + + This was showing up as a failure of the bitmap-font test case + with the ps, pdf, and svg backends. + + src/cairo-ft-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 17b4496ae9df539c48c830b21c4477e763ba4e5d +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Wed Feb 14 11:52:11 2007 +0800 + + type1-subset: fix error handling. + + This fixes potenial memory leak and leaving font face locked on error. + + src/cairo-type1-subset.c | 34 +++++++++++++++++++++++----------- + 1 file changed, 23 insertions(+), 11 deletions(-) + +commit 01a133167c48e7985515ae29f4a87de7952d1373 +Author: Dan Amelang <dan@amelang.net> +Date: Sun Feb 11 00:16:52 2007 -0800 + + Update Win32 makefiles + + Since the last time these makefiles were last updated some new source + files have been added and one renamed. In addition, a "clean" rule + needed to be added to the pixman makefile. And the "clean" rule in the + main cairo makefile wasn't working properly for me. + + pixman/src/Makefile.win32 | 2 ++ + src/Makefile.win32 | 8 ++++++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit b8987dd12c3269c1d7978338cd356b9fe3ad420e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 13 16:47:30 2007 -0800 + + ROADMAP: Note that text spacing issues for win32 are fixed + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f0a16b5bddc5c162c78ae976093fe8bb2b756e04 +Author: Dan Amelang <dan@amelang.net> +Date: Sun Feb 11 03:34:27 2007 -0800 + + Fix Win32 text spacing problem + + Thanks to Jordan Miner for reporting the problem and a fix. + + src/cairo-win32-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aad1374caab3a05893c9f1f2605131edd9f62409 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 10 09:39:24 2007 -0800 + + Rename cairo_toy_font_face_hash_table_mutex to cairo_font_face_mutex + + The new name more accurately reflects its recently expanded role. + + src/cairo-font.c | 31 +++++++++++++++++++------------ + 1 file changed, 19 insertions(+), 12 deletions(-) + +commit e107b70b4d282d78ebe32f4d2381fcf98df324f6 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 10 09:39:09 2007 -0800 + + Add locking to cairo_font_face_reference/destroy + + The reference count of cairo_font_face_t is rather intimately tied, + (for toy font faces), with the cairo_font_face_hash_table, so we + expand the existing cairo_toy_font_face_hash_table_mutex to cover + the manipulation of font_face->ref_count as well. + + This commit eliminates an assertion failure that is (occasionally) + exposed by the pthread-show-text test case: + + lt-pthread-show-text: cairo-hash.c:196: _cairo_hash_table_destroy: Assertion `hash_table->live_entries == 0' failed. + + src/cairo-font.c | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +commit d6d1767f9a89bf7e16288d0a90e5fafc5ad2d9d6 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 10 09:38:13 2007 -0800 + + Increase pthread-show-text thread count and add cairo_select_font_face to expose more bugs. + + test/pthread-show-text.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit fdffde8b9e7a2308b822ddef7b02a8e85cc8ba1e +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 10 09:14:07 2007 -0800 + + Add mutex to implement _cairo_ft_unscaled_font_lock_face and _cairo_ft_unscaled_font_unlock_face + + Previously we just had an integer counter here, but that is not + sufficient as multiple cairo_scaled_font_t objects, (which are + implicitly shared through the font caches), can reference the + same cairo_ft_unscaled_font_t so real locking is needed here. + + This commit eliminates an assertion failure exposed by the + pthread-show-text test case: + + lt-pthread-show-text: cairo-ft-font.c:562: _cairo_ft_unscaled_font_unlock_face: Assertion `unscaled->lock > 0' failed. + + src/cairo-ft-font.c | 82 ++++++++++++++++++++++++++++++++++------------------- + 1 file changed, 53 insertions(+), 29 deletions(-) + +commit 25a370d7992d7f70d8cf79f1b328e40437b40ac4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 13 10:40:53 2007 -0800 + + Avoid public cairo_ft_scaled_font_lock_face for internal use + + We're planning to change the implementation of the public function, + (which will remove some locking safety), so use the safe, locked + _cairo_ft_unscaled_font_lock_face for internal use instead. + + src/cairo-ft-font.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7e1301ffb066b04d95dc71144d86e660f0155bba +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 10 09:12:38 2007 -0800 + + Add missing _cairo_ft_unscaled_font_unlock_face to _cairo_ft_scaled_font_create + + src/cairo-ft-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6f7cfdf5c79c3c09a0241ae25ff540fb0d893d31 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 13 23:53:38 2007 +1030 + + PDF: Add missing character code to Differences array + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 88cae7766d6006e4169da1dcddc14a52e210cae5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 13 23:29:05 2007 +1030 + + output-stream: coding style fix + + src/cairo-output-stream.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 88f7ea4ad7926b135c987d3d75c029310c328010 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 13 22:52:53 2007 +1030 + + CFF: Fix Visual C++ compile problem + + Don't use structure intitialization for assigning + structure values. + + Add a new field to cff_charset_t to point to the sids + charset array instead of casting it into the data field. + + src/cairo-cff-subset.c | 25 ++++++++++++++----------- + 1 file changed, 14 insertions(+), 11 deletions(-) + +commit ac01dcb5ad077d8ea08a93348fc23d4a891abaae +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 11 23:14:40 2007 +1030 + + PDF: Remove dead code + + The function _cairo_pdf_surface_write_fonts is the + original PDF TrueType font embedding function that was + disabled in commit f500cef19f049a4a0ed296172618db2f26794932 + shortly before Type3 font support was added. + + TrueType font embedding was later reintroduced as new code + making this function obsolete. + + src/cairo-pdf-surface.c | 108 ------------------------------------------------ + 1 file changed, 108 deletions(-) + +commit d6f15b26009ff8e1d52a037265bcaa80c5ce6735 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 11 22:20:58 2007 +1030 + + Output-stream: Omit the minus sign from negative zero + + src/cairo-output-stream.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit a2fefcc9e962e81a00fb16ae3d1bc29d9e61eaa0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 11 21:57:43 2007 +1030 + + PDF: Compress Type3 fonts + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9f47879ae31f003be3b32f9ecb3efb3486d72cc7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 11 21:50:46 2007 +1030 + + PDF: Fix Type3 font metrics to make text selection work + + src/cairo-pdf-surface.c | 66 +++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 56 insertions(+), 10 deletions(-) + +commit 9dce321a113871ade7de244d3abf9ed08f43dd85 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Feb 11 01:42:22 2007 +0000 + + [ATSUI] scale fonts using font size not font matrix + + Mozilla bug #327522 - fonts scaled up over 16pt on mac + had nonsensical extents. The scaling was being done using + the font matrix, it turns out this does not work for 16x + scaling and up. This patch switches back to using the + font size to scale fonts, with emboldening and condensing + effects applied separately using the font matrix. + + src/cairo-atsui-font.c | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +commit eec62c297589ca20f4128c889ecad9e96736a07f +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Feb 10 00:20:40 2007 +0000 + + Unreleased lock typo in cairo-scaled-font.c + + One path through _cairo_scaled_font_text_to_glyphs grabbed + the mutex but didn't release it, causing hangs in all + text rendering on the mac. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a37f21cb17a24643f7513dff06bc2b5fd38e2583 +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Thu Feb 8 15:29:58 2007 -0800 + + [PS/PDF/SVG] Return a write_error nil surface on write errors + + src/cairo-pdf-surface.c | 4 +++- + src/cairo-ps-surface.c | 4 +++- + src/cairo-surface.c | 1 + + src/cairo-svg-surface.c | 4 +++- + src/cairoint.h | 1 + + 5 files changed, 11 insertions(+), 3 deletions(-) + +commit bf3cbe7660f03f6b4139f4cf79a4007c682a84bd +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Thu Feb 8 15:28:14 2007 -0800 + + [cairo-surface] Use a macro definition for all nil surfaces + + src/cairo-surface.c | 139 ++++++++++++++-------------------------------------- + 1 file changed, 38 insertions(+), 101 deletions(-) + +commit aea0831d24c3fca59b9eb9dd8acce9d9cdd13f26 +Author: Kalle Vahlman <kalle.vahlman@gmail.com> +Date: Thu Feb 8 15:07:45 2007 -0800 + + [cairoint] Make it compile with libpng disabled + + src/cairoint.h | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 4773b8a6d25e4b228471ad48616c08367ee84809 +Author: Peter Weilbacher <pmw@avila.aip.de> +Date: Thu Feb 8 20:34:26 2007 +0100 + + Oops, correct typo in previous commit + + FALSA -> FALSE + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e711700d5d766b4b923a10bfaabb57163b55a21d +Author: Peter Weilbacher <pmw@avila.aip.de> +Date: Thu Feb 8 20:29:18 2007 +0100 + + Correct scaled font mutex definitions for OS/2 + + Using a zero without brackets to quiet remaining GCC compilation warning. + Use FALSE so that the mutex does not block on creation. + + src/cairoint.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2d1db24d1e7f3967b7ab498ce0ed29508c08a04b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 7 23:10:47 2007 +1030 + + PDF: Another fix for TrueType metrics + + Not all TrueType fonts have an em size of 2048. + + src/cairo-pdf-surface.c | 20 ++++++++++---------- + src/cairo-scaled-font-subsets-private.h | 6 +++--- + src/cairo-truetype-subset.c | 22 +++++++++++++--------- + 3 files changed, 26 insertions(+), 22 deletions(-) + +commit 274dfa4598bcb11b9f8330d23934a4ef1797fdbf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 7 22:35:59 2007 +1030 + + PDF: Make text selection and extraction work + + - Add a to_unicode array to the scaled_font_subsets + for mapping glyphs to unicode characters + + - Add a function to the TrueType subsetting for + performing a reverse cmap for mapping glyph indices + to unicode characters. + + - Add a new scaled font backend function for mapping + glyph indices to unicode characters. Provide FreeType + and Win32 implementations of the font backend mapping + function. + + - Modify the PDF backend to embed ToUnicode streams + into each font. The unicode mapping is obtained by + first trying the reverse cmap. If this fails the font + backend mapping function is called. + + src/cairo-atsui-font.c | 2 + + src/cairo-ft-font.c | 33 ++++++++ + src/cairo-pdf-surface.c | 126 ++++++++++++++++++++++++++-- + src/cairo-scaled-font-subsets-private.h | 29 ++++--- + src/cairo-scaled-font-subsets.c | 15 +++- + src/cairo-truetype-subset-private.h | 23 +++++ + src/cairo-truetype-subset.c | 144 ++++++++++++++++++++++++++++++++ + src/cairo-win32-font.c | 17 ++++ + src/cairoint.h | 18 ++++ + 9 files changed, 385 insertions(+), 22 deletions(-) + +commit 97a2522e0bbe8464028b9b42c79e0b3559b532be +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 21:19:30 2007 -0800 + + Add missing locking to _cairo_scaled_font_text_to_glyphs + + We recently added locking to cairo_scaled_font_glyph_extents and + to _cairo_surface_show_glyphs, but we had neglected the third + separate entry point into scaled_font code that does cache-using + glyph lookups, namely: _cairo_scaled_font_text_to_glyphs. + + These three separate functions are plainly visible in the + implementation of cairo_show_text. + + src/cairo-scaled-font.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 1503a41c7f115033b10470574027cffab0730687 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 20:32:08 2007 -0800 + + Expand font_map locking to cover call to backend->scaled_font_create + + It seemed like a good idea to avoid holding the lock over the call + into the backend. But the procedure in place was quite broken: + + LOCK + Fail to find font in hash table + UNLOCK + Create font + LOCK + Insert font into hash table + UNLOCK + + since while we're busy creating the font and unlocked, another thread + can insert the font. Our paranoid hash table implementation noted + the problem quite readily. + + This patch simply removes the internal UNLOCK/LOCK to hold the mutex + over the whole procedure. + + src/cairo-scaled-font.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit fc3ce1e80a89aab4f1ec75946771f6c2a79f0b90 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 20:41:58 2007 -0800 + + test/pthread-show-text: Increease iterations to expose locking bug + + With 50 iterations I'm seeing the following assertion failure: + + cairo-hash.c:477: _cairo_hash_table_insert: Assertion `NOT_REACHED' failed. + + Thanks to Jan Slupski <jslupski@juljas.net> for pointing out this bug. + + test/pthread-show-text.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit d07827ba2a225f880f4bbf6980872f5ae8898288 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 19:06:23 2007 -0800 + + ROADMAP: Drop 1.3.6 which is already in the past and note 8379 fix and pixman gradient improvements + + ROADMAP | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 672a668da1002dbcecda2e4805c6b54c86d4cff7 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 19:05:07 2007 -0800 + + ROADMAP: Note that the 8801 locking bug is fixed. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit db3493bef7dba1e960f59563925fd9c5e75cb4ca +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 18:28:44 2007 -0800 + + Remove dead cff_dict_remove function + + I assume this was just a leftover that was meant to be removed + earlier. If not, please feel free to bring it back again. + + src/cairo-cff-subset.c | 14 -------------- + 1 file changed, 14 deletions(-) + +commit 89cf8dbf522ce7ada0ee4cf9ea016ac2a89c8a75 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 18:27:33 2007 -0800 + + Remove half-leftover debugging code from previous commit + + This was leading to link failures on CAIRO_LOCK_FILE, etc. + + src/cairoint.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 5d58e7ee66166b19e673c247fe41eae51f72fd92 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 5 16:45:25 2007 -0800 + + Add scaled_font->mutex to allow locking for all subordinate objects + + A cairo_scaled_font_t can be implicitly shared among multiple threads + as the same cairo_scaled_font_t can be returned from different calls + to cairo_scaled_font_create. To retain the illusion that these + different calls produce distinct objects, cairo must internally lock + access when modifying them. + + Each glyph in the scaled font is represented by a cairo_surface_t + which is used when rendering the glyph. Instead of attempting to push + fine-grained locking of these surfaces down to the backend rendering + functions, a simple per-cairo_scaled_font_t lock has been introduced + which protects the entire rendering path against re-entrancy. + + Some care was required to ensure that existing re-entrancy was handled + appropriately; these cases are in the wrapping surfaces + (cairo-paginated, test-meta and test-paginated). + + Thanks to Vladimir Vukicev and Peter Weilbacher for testing/providing + the mutex definitions for win32 and os2 (respectively). + + src/cairo-paginated-surface.c | 21 +++++++++++++--- + src/cairo-scaled-font.c | 17 +++++++++---- + src/cairo-surface.c | 19 ++++++++------ + src/cairoint.h | 58 +++++++++++++++++++++++++++++++++++++++++-- + src/test-meta-surface.c | 21 +++++++++++++--- + src/test-paginated-surface.c | 19 ++++++++++++-- + 6 files changed, 132 insertions(+), 23 deletions(-) + +commit 765715ad93d3daad1b8b53f6ea9fee82737923ea +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 17:29:03 2007 -0800 + + Move scaled font holdovers magic from reference to create to fix race condition + + Previously, with the magic in _cairo_scaled_font_reference(), + cairo_scaled_font_create() was releasing its lock just before + calling into reference() which would re-acquire the lock. + That left a window open during which a font we just discovered + in the holdovers table could be destroyed before we had a chance + to give it its initial reference back. + + src/cairo-scaled-font.c | 57 ++++++++++++++++++++++--------------------------- + 1 file changed, 26 insertions(+), 31 deletions(-) + +commit 9c359d61fc5df3e925e4b63503d60dc8fe8be6b3 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 17:40:17 2007 -0800 + + Avoid holding lock when calling _cairo_scaled_font_fini + + As in the previous commit with the backend->scaled_font_create + function, we also don't want to hold the lock when calling into + the backend's fini function. + + src/cairo-scaled-font.c | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +commit 258175ffcd89dcc949c3dc6ee3cd660d057a1966 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Feb 6 17:21:22 2007 -0800 + + Don't hold mutex over backend->scaled_font_create + + This also allows some cleanup of the error-handling in + cairo_scaled_font_create, (no more goto statements). + + src/cairo-scaled-font.c | 48 ++++++++++++++++++++++++------------------------ + 1 file changed, 24 insertions(+), 24 deletions(-) + +commit fc660511ec7a51be909e5ed940354d39ef7ad633 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 7 11:05:33 2007 +1030 + + PDF: Correct the y value of Td in show_glyphs + + This bug would occur if the y coordinate of all the glyphs + in a single cairo_show_glyphs() call was not the same. + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 908469b5fcdc311a89868ab44baa85d0744985d1 +Author: Soren Sandmann Pedersen <ssp@dhcp83-218.boston.redhat.com> +Date: Tue Feb 6 16:37:45 2007 -0500 + + Apply patch from Marco Gritti and Jordan Crouse to correctly detect + AMD CPU's. Bug 9615. + + pixman/src/fbpict.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 9d3f537423b3cc0cb6a4b2607e9307c1eef9e074 +Author: Soren Sandmann Pedersen <ssp@dhcp83-218.boston.redhat.com> +Date: Tue Feb 6 16:27:42 2007 -0500 + + Remove left-over assert and some alpha checks from + fbCompositeSrc_8888x0565mmx(). Bug 9893. + + pixman/src/fbmmx.c | 52 +++++++++++++--------------------------------------- + 1 file changed, 13 insertions(+), 39 deletions(-) + +commit a8f8efb750fd3a8857c7f519b8645e578f75442b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Feb 5 18:29:30 2007 +1030 + + PS: Correct the TrueType Encoding and Charstrings + + The offsets and count was out by one as a result of the + change to include .notdef on the TrueType font. + + src/cairo-ps-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 28e3a20d79c3390547d3e53435c06442ca8ac8a2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 4 23:47:28 2007 +1030 + + PDF: Fix TrueType font metrics + + src/cairo-pdf-surface.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +commit 05ff2c77da86c7be95924f9af4d3ad944afbbf66 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 4 19:00:16 2007 +1030 + + PDF: Add Encoding dictionary to TrueType fonts + + This is a fix for the bugs reported here + + http://lists.freedesktop.org/archives/cairo/2006-December/008984.html + + http://lists.freedesktop.org/archives/cairo/2007-January/009387.html + + Cairo PDFs will not print correctly from Adobe Reader. The symptoms are + that all the glyphs on the page are replaced with the same glyph. + + According to the PDF Reference an Encoding dictionary is not required + for the symbolic fonts used by cairo. However including the Encoding + dictionary fixes the printing problem. + + src/cairo-pdf-surface.c | 21 +++++++++++++++++++-- + 1 file changed, 19 insertions(+), 2 deletions(-) + +commit 3f8d5f505af4d7569ce38452f1be5d40bf6a00b4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 4 18:21:50 2007 +1030 + + TrueType: Include notdef glyph in the subset + + Required by the TrueType specification. + + src/cairo-truetype-subset.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit d22ba141e6c78bf1fc3dfc02c9aaf6d725233444 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 4 16:54:57 2007 +1030 + + TrueType Subsetting: Whitespace change + + src/cairo-truetype-subset.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit e4a5011a2787bbb7ced338aaff2752aa23ac7892 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 4 16:51:44 2007 +1030 + + TrueType Subsetting: Add comment + + src/cairo-truetype-subset.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 7d05b9bdd328c7ec0422f45893fa0e0d6e9bb135 +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Sun Feb 4 16:26:18 2007 +1030 + + TrueType Subsetting: Sort table directory + + The TrueType specification requires the table directory + to be sorted by tag. + + src/cairo-truetype-subset.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit 8b3176158351e62185294d512030c7af1ec4fabc +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Sun Feb 4 16:22:12 2007 +1030 + + TrueType Subsetting: Correct the checksum calculation of 'head' table + + Checksum field should be zero before calculating checksum. + + src/cairo-truetype-subset.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0bf5e18b14f2bbaf3be3b31c4eb54ea3183f488a +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Sun Feb 4 16:19:05 2007 +1030 + + TrueType Subsetting : Correct the checksum calculation + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2bd590b64987b7f0eb7310666ac20a8309e32842 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Feb 2 16:43:27 2007 -0800 + + ROADMAP: Note that linear gradient bug is fixed. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ae4f37e0a32c3e231c38434846e80fd90162d888 +Author: David Turner <digit@mounini.par.corp.google.com> +Date: Fri Feb 2 10:30:24 2007 +0100 + + fixing gradient repeat mode computations + + This fixes the regression of linear gradient as demonstrated + by the recently added linear-gradient-reflect test. + + pixman/src/fbcompose.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 0b7ba5ccfa21265c1b36919ff08bd3a1f0d1075b +Author: T Rowley <tor@cs.brown.edu> +Date: Fri Feb 2 16:36:12 2007 -0800 + + Add linear-gradient-reflect test case + + This testcase works before the + e9bef30d2bcdf41c7b7f20b3517839c37e752f75 landing, and has visual + artifacts afterwards. + + test/Makefile.am | 2 + + test/linear-gradient-reflect-ref.png | Bin 0 -> 216 bytes + test/linear-gradient-reflect.c | 74 +++++++++++++++++++++++++++++++++++ + 3 files changed, 76 insertions(+) + +commit 1757b49ebda3ec464a442d8c4f5ba39c88c1e3e5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 1 16:17:29 2007 -0800 + + ROADMAP: Add bug about broken cairo_show_text on win32 + + ROADMAP | 1 + + 1 file changed, 1 insertion(+) + +commit c621201a41639be8ba9ee735c2859aa117ba4216 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 1 16:05:59 2007 -0800 + + Don't finish a finished surface in cairo_surface_destroy + + Calling cairo_surface_finish from cairo_surface_destroy was + triggering an error due to finish being called twice. The + error was usually hidden as the surface would still eventually + be destroyed. But it did clutter things up quite badly if a + user was trying to break on _cairo_error to track down a + problem. + + Thanks again to Stuart Parmenter <stuartp@gmail.com> + for pointing out the problem. + + src/cairo-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 159359325d4f8306feef6bebabecb31cbf0b9bf5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 1 15:22:27 2007 -0800 + + Fix crashes in cairo_surface_finish for NULL or nil + + Thanks to Stuart Parmenter for alerting us of this bug. + + src/cairo-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 26ef4746e66dccd8e0eb651db3e7f2826c068029 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 1 15:21:12 2007 -0800 + + Add two tests of cairo_surface_finish to test/nil-surface.c + + This tests calling cairo_surface_finish with either NULL or + with a nil surface, (either currently causes a crash). + + test/nil-surface.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 382e021ccb657ab1e342e0d0eee402ff5eb89e5d +Author: Dan Amelang <dan@amelang.net> +Date: Wed Jan 31 11:53:06 2007 -0800 + + Add "rectangles" perf test + + This test draws many small, solid pixel-aligned rectangles one at a + time. + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/rectangles.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 74 insertions(+) + +commit 7abfb39709342fc3d95269ad2d76a5e1e8f8d38f +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Sun Jan 28 19:01:38 2007 +1030 + + CFF Subsetting: Add charset data to embedded font + + Current code for subsetting CFF fonts does not write charset information + into it. According to spec this means that font have ISOAdobe charset. + This charset contains only 228 names (excluding .notdef). This is not + enough for subfonts with 256 glyphs and causes bugs when viewing + generated PDFs. + + src/cairo-cff-subset.c | 253 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 252 insertions(+), 1 deletion(-) + +commit a63ceef06c2c015c8e5f0ad7b756ff6801996096 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 26 18:03:18 2007 -0800 + + Fix _cairo_pattern_acquire_surface_for_surface to not clone outside surface extents + + Rotation and other transformations would cause extents to be + computed which were outside the bounds of the surface to be + cloned, (and for non repeating patterns). Now we simply + restrict the computed extents to the surface extents. + + This fixes the xlib failure of the recent rotate-image-surface-paint + test, (the apparently distinct ps failure remains). + + ROADMAP | 2 +- + src/cairo-pattern.c | 21 +++++++++++++++------ + 2 files changed, 16 insertions(+), 7 deletions(-) + +commit ebc1cd91f80ee154c02651b2db034a4335ca021c +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 00:50:38 2007 -0800 + + Add rotate-image-surface-paint test case + + This test exercises a clone_similar extents bug noticed by + Benjamin Otte. As expected, the xlib backend fails due to + that bug, (and interestingly, the ps backend is showing a + failure as well). + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/rotate-image-surface-paint-pdf-argb32-ref.png | Bin 0 -> 209 bytes + test/rotate-image-surface-paint-ref.png | Bin 0 -> 232 bytes + test/rotate-image-surface-paint-svg-ref.png | Bin 0 -> 248 bytes + test/rotate-image-surface-paint.c | 97 +++++++++++++++++++++ + 6 files changed, 99 insertions(+) + +commit 691f9d1c0c4c98f6e6aa7b2f41fa0b8670e6205d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jan 24 17:34:57 2007 -0800 + + [mmx] avoid casts between int32 and __m64 types + + The MS compiler doesn't like this; _mm_cvtsi32_si64 and _mm_cvtsi64_si32 + must be used. + + pixman/src/fbmmx.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 8ff70d6b9106b2dc57e903104237285a7062c2f0 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jan 24 16:47:48 2007 -0800 + + [win32] regression with win32 glyph y-offsets (mozbug#365021) + + src/cairo-win32-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0231d18a57dd31d9d619d53b70e71c1b916e0d75 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jan 24 16:46:36 2007 -0800 + + [atsui] add function prototype for a public 10.4 function that's + + src/cairo-atsui-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 50136a78063137ebca16bcb839bec33e2917824e +Author: Eugeniy Meshcheryakov <eugen@debian.org> +Date: Wed Jan 24 15:51:00 2007 -0500 + + [PDF-CFF] Fix bad /LastChar value for CFF fonts in PDF backend + + PDF backend sets /LastChar value in Type1C font dictionary incorrectly. + acroread then complains about incorrect /Widths in font. + The last char is numchars - 1, since it's zero-based. + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bb02b4e5ec40ac37462f487f2ad74b0123814277 +Merge: 48c2896 3b77512 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Tue Jan 23 22:22:20 2007 -0800 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit 48c2896f694872a55a43e12fc375bde2ce2650a9 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Tue Jan 23 22:17:24 2007 -0800 + + Turned off acclerated rectangle drawing in dfb backend + causes bugs in gtk + + src/cairo-directfb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3b7751279c034caf2f86464cd1936d7ce1736ccc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 22 14:42:48 2007 -0500 + + [pixman/src/fbmmx.c] Add comment around M64 + + /* cast to void* in the middle to shut gcc up warning about + * "dereferencing type-punned pointers". + */ + + pixman/src/fbmmx.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit c316b7220dcd59653533a487d81c5e3d71729218 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jan 22 01:13:50 2007 +0000 + + [ATSUI] Some glyph operations cannot be 'unsupported'. (#9530) + + The atsui font backend returned the internal 'unsupported' error + code for errors in operations that do not have fallbacks. Now that + the underlying cause, deleted glyphs, has been fixed, I'm changing + the status code returned to the public 'no memory' one; it should + be the only condition triggering the failure now. + + src/cairo-atsui-font.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit 49b9f0c082944029af8dab84da87f7746c5f72b9 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jan 22 01:10:52 2007 +0000 + + [ATSUI] out-of-range glyphs should be treated as deleted. (#9530) + + Glyphs outside the range 0x0-0xffff are not valid in atsui, but + scaled_glyph stores unsigned long. Ensure that invalid values do + not cause errors. + + src/cairo-atsui-font.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 4dfa5d33e451886b05cf767ae5a538e152ec534d +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jan 22 01:09:49 2007 +0000 + + [ATSUI] Handle deleted glyphs correctly. (#9530) + + This code ensures that deleted glyphs are not drawn. + + src/cairo-atsui-font.c | 36 +++++++++++++++++++++++++++++++----- + 1 file changed, 31 insertions(+), 5 deletions(-) + +commit 1a9d3b5185f454a63bc96c2e570c931c3ecabbb5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 21 15:11:31 2007 -0500 + + [configure.in] Use AC_MSG_RESULT in PKG_CHECK_MODULES's second branch + + If PKG_CHECK_MODULES fails, it does not print out any check results and so, no + newlines. This is kinda silly, at least in the case that no second branch is + provided, but I think that's the way it is, to let users decide what to print. + + We now just do a AC_MSG_RESULT(no) and continue with what we used to do. + Inspired by Tor Lillqvist's similar change in Pango. + + configure.in | 38 ++++++++++++++++++++++++-------------- + 1 file changed, 24 insertions(+), 14 deletions(-) + +commit 6aa8e80cc722774191c4418c9a2cd434c0538508 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 21 15:06:02 2007 -0500 + + [pixman/src/fbmmx.c] Hide "dereferencing type-punned pointer" warnings + + The warning happens all the place when the code converts from ullong to __m64. + The way the conversion is done is a C idiom: 1) get a pointer to the value, 2) + convert it to the suitable pointer type for the target, 3) dereference it. + That is "*(__m64*)(&m)" in this case. This is necessarily (as opposed to just + casting to target type) because the two types may not be "compatible" from the + compiler's point of view. Example of types that are not compatbile is structs + vs anything. + + The "dereferencing type-punned pointer will break strict-aliasing rules" from + gcc exactly means: "some code may be assuming that pointers with different + types do not compare equal (or otherwise share the same target object). If + you case a pointer to a different type and dereference it, it may happen + here." However, in our usecase, it's clear that the compiler cannot make any + false assumptions. So we just go ahead and hide it by using a middle cast to + "void *". Since the compiler does not many any aliasing assumptions about + generic pointers, it will not warn either. (Though the problems if any, will + still occure. So this is not an ideal solution to this problem and should be + used very carefully, to no hide useful warnings for when things go loose on + some weird architecture.) + + Another solution would have been to use gcc's "may_alias" function attribute, + but trying to define a may_alias version of __m64 hit a bug in gcc. That is, + try replacing "__m64" with "m64" and define: + + typedef __m64 m64 __attribute__((may_alias)); + + and see it fail to compile. This seems to be because of the special vector + type that __m64 has. + + pixman/src/fbmmx.c | 34 ++++++++++++++++++---------------- + 1 file changed, 18 insertions(+), 16 deletions(-) + +commit 1a8d0a33ce589367f0e46006caecb544a3945048 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 20 13:01:35 2007 -0500 + + PDF: Fix approximate diagonal in recent commit + + Use x+y as an upper bound for sqrt(x*x+y*y), not x*y. + + src/cairo-pdf-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 1e52ce5a0981aac72452f1f7d7988e6382b0abcc +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 03:20:30 2007 -0800 + + doc tmpl churn + + doc/public/tmpl/cairo.sgml | 11 ----------- + 1 file changed, 11 deletions(-) + +commit 53358ddc73b985b5cf6493dc48c54073fd7c59fc +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 03:20:18 2007 -0800 + + configure.in: Increment version to 1.3.13 after making the 1.3.12 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c34a1a75fdb886b7a69875fb92d30c6dfd9d39cb +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 03:04:31 2007 -0800 + + configure.in: Increment cairo version to 1.3.12 + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 26e6c73aab3fbfb4e2c893b4064cd8e85dc25346 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 02:58:15 2007 -0800 + + NEWS: Add notes for 1.3.12 snapshot + + NEWS | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 93 insertions(+) + +commit 87b3ac10af6b18d57236ae7e595e84e11e12eaad +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 02:01:29 2007 -0800 + + cairo-wideint: Fix to eliminate comparison of signed and unsigned values + + src/cairo-wideint.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit d6bb0d772018809caaa215d562292c8aeb2990d3 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 01:47:06 2007 -0800 + + .gitignore: Add text-glyph-range + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit b06222b99091796486cc0f938dd7487c66dd8420 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 20 00:56:07 2007 -0800 + + ROADMAP: Add 3 bugs to fix before the next snapshot + + ROADMAP | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 6c40575a225e3d6d138adae9d492881b8358f881 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 19 23:23:32 2007 -0800 + + Fix two misspellings in a recent comment. + + src/cairo-pdf-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5f9d70a56158e468683dba953d6eaceea4dfd644 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 19 23:11:09 2007 -0800 + + PDF: Fix CAIRO_EXTEND_NONE for source surface patterns + + The former workaround for the lack of non-repeating patterns in PDF + (as far as we can tell) was broken for a source pattern matrix that + resulted in scaling the source surface pattern down. This was + demonstrated by the failure of the scale-down-source-surface-paint + test which now passes. + + The old code would have also allowed for bogus repeated pattern + instances to appear if the source surface pattern was translated + sufficiently far off the destination surface in just the right + direction. This bug is also fixed. + + src/cairo-pdf-surface.c | 41 +++++++++++++++++++++++++++++++++-------- + 1 file changed, 33 insertions(+), 8 deletions(-) + +commit 2f6d184e6659e91909ed933d36bef441f1b5df4d +Author: Kalle Vahlman <kalle.vahlman@gmail.com> +Date: Sat Jan 13 12:36:03 2007 +0200 + + Add --use-ms option to cairo-perf-diff-files + + This allows for comparing perf files generation on different hardware + platforms, (since the ticks can be very different on different hardware). + + perf/cairo-perf-diff-files.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit 8354906381b2ccc3211214bad55c1f505d3dce3a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Dec 16 22:21:36 2006 +0200 + + Make UTF-8 output from cairo-perf-diff-files optional + + This patch adds options to disable the UTF-8 change bars and replace + them with ASCII '*' gfx. The motivation is that UTF-8 really does some + damage to some terminals, and some always forget to pipe stuff through + a pager to make it safe. The new options for cairo-perf-diff-files are: + + --no-utf + --no-bars + + perf/cairo-perf-diff-files.c | 135 +++++++++++++++++++++++++++++++------------ + 1 file changed, 98 insertions(+), 37 deletions(-) + +commit d91d5d12f3a40beebefcd8a5d8b912f5492e112b +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 19 15:52:06 2007 -0800 + + Add new scale-down-source-surface-paint test + + This new test case demonstrates a bug in the PDF backend, (source + surface patterns are repeated even with a pattern extend of NONE). + + Thanks to Romuald <mydevel@free.fr> and Claudio Saavedra + <csaavedra@alumnos.utalca.cl> for pointing out the bug. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/scale-down-source-surface-paint-ref.png | Bin 0 -> 133 bytes + test/scale-down-source-surface-paint.c | 72 +++++++++++++++++++++++++++ + 4 files changed, 75 insertions(+) + +commit d08502d939b44956591f2865a73264713427194b +Merge: eefcfbf 28d6a22 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Jan 18 16:50:41 2007 -0800 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo + +commit eefcfbf5a168569518a8dcf099b5f41b570f504b +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Jan 18 16:49:42 2007 -0800 + + [nquartz] add test reference files for nquartz backend + + test/caps-joins-alpha-nquartz-ref.png | Bin 0 -> 2466 bytes + test/clip-nesting-nquartz-ref.png | Bin 0 -> 1067 bytes + test/clip-nesting-nquartz-rgb24-ref.png | Bin 0 -> 956 bytes + test/clip-push-group-nquartz-ref.png | Bin 0 -> 203 bytes + test/clip-twice-nquartz-ref.png | Bin 0 -> 1171 bytes + test/clip-twice-nquartz-rgb24-ref.png | Bin 0 -> 1111 bytes + test/dash-caps-joins-nquartz-ref.png | Bin 0 -> 4727 bytes + test/degenerate-path-nquartz-rgb24-ref.png | Bin 0 -> 188 bytes + test/fill-and-stroke-alpha-add-nquartz-ref.png | Bin 0 -> 603 bytes + test/fill-and-stroke-alpha-nquartz-ref.png | Bin 0 -> 550 bytes + test/fill-and-stroke-nquartz-ref.png | Bin 0 -> 286 bytes + test/fill-and-stroke-nquartz-rgb24-ref.png | Bin 0 -> 264 bytes + test/fill-degenerate-sort-order-nquartz-ref.png | Bin 0 -> 2470 bytes + test/fill-degenerate-sort-order-nquartz-rgb24-ref.png | Bin 0 -> 2098 bytes + test/fill-rule-nquartz-ref.png | Bin 0 -> 2079 bytes + test/fill-rule-nquartz-rgb24-ref.png | Bin 0 -> 1790 bytes + test/new-sub-path-nquartz-ref.png | Bin 0 -> 386 bytes + test/new-sub-path-nquartz-rgb24-ref.png | Bin 0 -> 357 bytes + test/operator-clear-nquartz-ref.png | Bin 0 -> 1195 bytes + test/operator-clear-nquartz-rgb24-ref.png | Bin 0 -> 1244 bytes + test/random-intersections-nquartz-ref.png | Bin 0 -> 203877 bytes + test/random-intersections-nquartz-rgb24-ref.png | Bin 0 -> 179204 bytes + test/rel-path-nquartz-ref.png | Bin 0 -> 212 bytes + test/rel-path-nquartz-rgb24-ref.png | Bin 0 -> 228 bytes + test/source-clip-scale-nquartz-ref.png | Bin 0 -> 148 bytes + test/trap-clip-nquartz-ref.png | Bin 0 -> 5814 bytes + test/trap-clip-nquartz-rgb24-ref.png | Bin 0 -> 5385 bytes + 27 files changed, 0 insertions(+), 0 deletions(-) + +commit 7b67c20a013ed45a10676cb129794ccfb66dc04c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Jan 18 16:49:14 2007 -0800 + + [nquartz] use pattern snapshots, and correctly setup/teardown source + + Use a snapshot for the pattern, to avoid the pattern being freed undreneath + us before we actually render (as when rendering to a CG PDF context). Also + correctly return UNSUPPORTED from setup source, avoiding brokenness when + the source isn't torn down correctly. + + src/cairo-nquartz-surface.c | 81 +++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 68 insertions(+), 13 deletions(-) + +commit 28d6a228f030dbec05ab5b0ba680db272df67c49 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 18 13:01:53 2007 -0800 + + Fix cairo_get_dash and cairo_get_dash_count APIs + + Make these functions consistent with other cairo_get functions + by making cairo_get_dash_count return the count directly, and + removing the cairo_status_t return value from cairo_get_dash. + + src/cairo.c | 37 +++++++++++-------------------------- + src/cairo.h | 6 +++--- + test/get-and-set.c | 17 ++++++----------- + 3 files changed, 20 insertions(+), 40 deletions(-) + +commit bc7072064e421e4c5e5043aada6cae1d8250938f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 17 15:07:12 2007 -0800 + + cairo-path-fixed: Don't add redundant, succesive MOVE_TO operations to the path + + Instead, we can simply tweak the argument value for the last + MOVE_TO operation that's already at the end of the path. + + This helps backends like pdf that are currently emitting all + of the redundant MOVE_TO operations in the output. + + src/cairo-path-fixed.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit d9df44d8071d038060e0cc987871c185f7733a3d +Merge: 4e1c2b1 b02b86d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jan 17 15:08:21 2007 -0800 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo + +commit 4e1c2b1ad84a695662dea9fbe60a975c928eb277 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Wed Jan 17 15:07:31 2007 -0800 + + Rename cairo_copy_clip_rectangles to cairo_copy_clip_rectangle_list + + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 2 +- + src/cairo-gstate.c | 4 ++-- + src/cairo.c | 6 +++--- + src/cairo.h | 2 +- + src/cairoint.h | 2 +- + test/get-clip.c | 26 +++++++++++++------------- + 7 files changed, 22 insertions(+), 22 deletions(-) + +commit b02b86da5c6c82f9b653698f8480855a35777155 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 24 00:55:20 2006 +0930 + + PDF: Compress the content stream + + Use cairo-deflate-stream to compress all content streams emitted by the + PDF surface. + + src/cairo-pdf-surface.c | 32 +++++++++++++++++++++++++++++--- + 1 file changed, 29 insertions(+), 3 deletions(-) + +commit 7f246462eb3cc2576387755fa2d554394e86225c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 24 00:52:01 2006 +0930 + + Add cairo-deflate-stream.c + + Add a new stream type that compresses the stream using the zlib deflate method. + This is intended for use by the PDF surface. + + src/Makefile.am | 1 + + src/cairo-deflate-stream.c | 142 ++++++++++++++++++++++++++++++++++++++ + src/cairo-output-stream-private.h | 4 ++ + 3 files changed, 147 insertions(+) + +commit b3440e85305af4f5ceef9437af7c26d3232dc55a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 24 00:48:36 2006 +0930 + + PDF: Use Td where possible instead of Tm for positioning glyphs + + This avoids emitting the font matrix for every single glyph. + + src/cairo-pdf-surface.c | 38 ++++++++++++++++++++++++++------------ + 1 file changed, 26 insertions(+), 12 deletions(-) + +commit 5c2136ea7c3aea1ae90b46b0dd645a4e1b5cc9a1 +Author: Dan Williams <dcbw@redhat.com> +Date: Wed Jan 17 15:47:24 2007 -0500 + + Implement pixman fbCompositeSrc_8888x0565mmx + + MMX-accelerate for fbCompositeSrc_8888x0565. Upstream X bug for the + same issue: + + http://bugs.freedesktop.org/show_bug.cgi?id=9682 + + pixman/src/fbmmx.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/fbmmx.h | 13 +++++ + pixman/src/fbpict.c | 14 +++++- + pixman/src/pixman-remap.h | 1 + + 4 files changed, 148 insertions(+), 2 deletions(-) + +commit a2ec383ff128617d33efa5760ec4b5f9688e8a13 +Author: Pavel Roskin <proski@gnu.org> +Date: Sun Aug 13 01:57:56 2006 -0400 + + Clean up _fbOnes() + + The implementation of _FbOnes in iccolor.c would not work on 64-bit + longs correctly. Fortunately, it's only used on integers, so make it + explicit in the declaration. + + Use an inline function for the gcc builtin implementation to make sure + that it's never used with arguments of incorrect size. + + There is no __INT_MIN__ in gcc 4.1.1, but it's not an issue now because + the argument is 32-bit. + + Signed-off-by: Pavel Roskin <proski@gnu.org> + + pixman/src/iccolor.c | 4 ++-- + pixman/src/icint.h | 12 ++++++------ + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit 9e332eadad00e115fdcdbc816608a0537f5a9b9c +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue Jan 16 01:25:53 2007 +0000 + + [test] Test handling of out-of-range glyph indexes. (#9530) + + Adds a test for missing and out-of-range glyph indexes. The expected + ATSUI renderings are added as references, please replace these with + FT renderings when they become available. + + test/Makefile.am | 4 ++ + test/text-glyph-range-ref.png | Bin 0 -> 1810 bytes + test/text-glyph-range-rgb24-ref.png | Bin 0 -> 1645 bytes + test/text-glyph-range.c | 133 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 137 insertions(+) + +commit 9cabf5b5f7dd840f91b5be29567cf11cf40fc998 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 15 00:26:20 2007 -0500 + + [TODO] Move some items from ROADMAP, and some new ones, into TODO + + ROADMAP | 17 ----------------- + TODO | 40 ++++++++++++++++++++++++++++++++++------ + 2 files changed, 34 insertions(+), 23 deletions(-) + +commit 1002d016834926a771aa0a6cc4bdf83cb009173a +Author: Kjartan Maraas <kmaraas@gnome.org> +Date: Thu Jan 11 17:59:16 2007 -0500 + + Remove unused variables (#7963) + + src/cairo-pdf-surface.c | 3 +-- + src/cairo-ps-surface.c | 3 +-- + src/cairo-svg-surface.c | 3 +-- + 3 files changed, 3 insertions(+), 6 deletions(-) + +commit eff6d3c7a013476a7e4cf56c05ad95c9f01fe793 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 15:49:50 2006 -0500 + + [cairo-type1-subset] Do not use an array of pointers, to reduce .data size + + We use a string pool plus lookup indices tables now, generated by perl code + embedded before the tables. The table in question is the default PS encoding + table, so no changes are expected in the future. + + src/cairo-type1-subset.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 105 insertions(+), 2 deletions(-) + +commit cf1d95e714d0814e52910c4306d090ef6d989093 +Author: Soeren Sandmann <sandmann@daimi.au.dk> +Date: Tue Jan 9 15:05:29 2007 -0800 + + Add SRC and IN implementations to avoid CompositeGeneral in some cases hit by PDF rendering + + The patch implements a few more operations with special cases MMX + code. On my laptop, applying the patch to cairo speeds up the + benchmark (rendering page 14 of a PDF file[*]) from 20.9 seconds + to 14.9 seconds, which is an improvement of 28.6%. + + [*] http://people.redhat.com/jakub/prelink.pdf + + This also benefits the recently added unaligned_clip perf case: + + image-rgb unaligned_clip-100 0.11 -> 0.06: 1.65x speedup + ▋ + image-rgba unaligned_clip-100 0.11 -> 0.06: 1.64x speedup + ▋ + + pixman/src/fbmmx.c | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/fbmmx.h | 43 ++++++++++ + pixman/src/fbpict.c | 98 ++++++++++++++++++++++- + 3 files changed, 366 insertions(+), 1 deletion(-) + +commit d5531c4f506caa9ad66fbeef1822a7036d4dd528 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 9 14:27:32 2007 -0800 + + Add unaligned_clip perf case courtesy of Jeff Muizelaar + + Conflicts: + + perf/Makefile.am + perf/cairo-perf.c + perf/cairo-perf.h + + perf/Makefile.am | 9 +++---- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/unaligned-clip.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 73 insertions(+), 4 deletions(-) + +commit 504cbdae37232d65f5c1f8913e55ac63397ad4f0 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 03:12:53 2007 +0000 + + [ATSUI] [2/2] Implement CAIRO_SCALED_GLYPH_INFO_SURFACE support.(#9467) + + All non-quartz surfaces need to fall back to using glyph surfaces, + in order to clip correctly. This second patch implements glyph + surface support, correcting the unclipped text seen in the clip-operator + test. + + src/cairo-atsui-font.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 111 insertions(+), 2 deletions(-) + +commit 77171cb8e23704db3eeddfe92cc4e0e83d02b36b +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 02:16:47 2007 +0000 + + [ATSUI] [1/2] Implement CAIRO_SCALED_GLYPH_INFO_SURFACE support.(#9467) + + All non-quartz surfaces need to fall back to using glyph surfaces, + in order to clip correctly. The bug being fixed is visible in the + clip-operator test. This first patch takes out direct rendering support + for non-quartz surfaces, causing all image tests to fail. + + src/cairo-atsui-font.c | 77 ++++++++++++++++++++++++++++---------------------- + 1 file changed, 44 insertions(+), 33 deletions(-) + +commit 116ae23fc64a8477a116bd6f3b60c7b5404af1c5 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Jan 8 16:51:28 2007 +0800 + + Glitz: position large glyph correctly. + + I introduced this bug while fixing test glyph-cache-pressure + (commit 3b1d0d3519a7d0328f897927d3534f10750d30db). I also changed + GLYPH_CACHE_MAX_HEIGHT and GLYPH_CACHE_MAX_HEIGHT to 96, then we + still can cache at least 28 glyphes per font(512 ^ 2 / 96 ^ 2). + This make us not hit slow path too much and improve performance + a lot. + + src/cairo-glitz-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit aed4029a104d22cbd363ab9e365320980d22bc86 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 02:13:05 2007 +0000 + + [ATSUI] Refactor code for creating CGBitmapContexts from cairo surfaces. + + No changes to test output. This just prepares code for reuse when + implementing support for CAIRO_SCALED_GLYPH_INFO_SURFACE. + + src/cairo-atsui-font.c | 85 ++++++++++++++++++++++++++++---------------------- + 1 file changed, 48 insertions(+), 37 deletions(-) + +commit 9a005c6221cc279e65d94956c74028a84baf1716 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 02:09:16 2007 +0000 + + [ATSUI] correct the rotation of glyph paths. (#9378) + + This fixes a bug visible in the text-rotate test when + CAIRO_TEST_GENERATE_REFERENCE_IMAGE is defined. + + src/cairo-atsui-font.c | 92 +++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 65 insertions(+), 27 deletions(-) + +commit 58265f3508959298eabab55ec28dc6d9516eedc3 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 05:54:52 2007 +0000 + + [ATSUI] Select Bitstream Vera and CSS font families reliably. + + Previously the code selected using the family name; this intermittently + selected a bold or italic face instead of the regular one. The new approach + is to select the desired font instance directly if possible, and only use + the family lookup if that fails. This isn't 100% correct but should always + provide the correct font instance for CSS generic font families. The + bug was sometimes reproducible with the select-font-face test. + + src/cairo-atsui-font.c | 56 +++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 40 insertions(+), 16 deletions(-) + +commit 22e271d687ad871a4e8a069ee2945c42062c1cb4 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 15:06:48 2007 +0000 + + [perf/cairo-perf-diff] Pass CAIRO_AUTOGEN_OPTIONS to autogen. + + Makes it was possible to run cairo-perf-diff with different + configurations, eg with quartz enabled. + + perf/cairo-perf-diff | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit d30b1bf157126668c4309731022b2ded2ad09571 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jan 4 01:36:32 2007 +0000 + + [ATSUI] Scale glyphs using _cairo_matrix_compute_scale_factor (#9350) + This bug shows up in the text-rotate test. + + src/cairo-atsui-font.c | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +commit ded08256ef7fdc9e9468342cf5635c5e99d4d64d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 7 02:08:15 2007 -0500 + + Spell check the docs + + doc/public/tmpl/cairo-version.sgml | 10 +++++----- + src/cairo-array.c | 2 +- + src/cairo-cache.c | 12 ++++++------ + src/cairo-font-options.c | 6 +++--- + src/cairo-ft-font.c | 6 +++--- + src/cairo-gstate.c | 4 ++-- + src/cairo-image-surface.c | 4 ++-- + src/cairo-lzw.c | 2 +- + src/cairo-meta-surface.c | 2 +- + src/cairo-path-stroke.c | 4 ++-- + src/cairo-pattern.c | 10 +++++----- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-surface.c | 2 +- + src/cairo-type1-fallback.c | 4 ++-- + src/cairo-unicode.c | 4 ++-- + src/cairo-wideint.c | 2 +- + src/cairo-win32-surface.c | 4 ++-- + 19 files changed, 44 insertions(+), 44 deletions(-) + +commit caa3c2e1e7901031488f5dae243a755a4e4daec9 +Author: Alp Toker <alp@atoker.com> +Date: Sun Jan 7 02:03:30 2007 +0000 + + Fix various code/comment typos + + pixman/src/pixregion.c | 2 +- + src/cairo-matrix.c | 2 +- + src/cairo-pdf-surface.c | 20 ++++++++++---------- + src/cairo-win32-surface.c | 2 +- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 10 +++++----- + 6 files changed, 20 insertions(+), 20 deletions(-) + +commit c96a71e709e537f690da6d4a184aa4c64fe11028 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 5 15:56:06 2007 -0800 + + Restrict _clip_and_composite_trapezoids to destination extents + + This is a fix for a huge performance bug (as measured by perf/long-lines). + Previously, if no explicit clip was set, _clip_and_composite_trapezoids + would allocate a mask as large as the trapezoids and rasterize into it. + With this fix, it restricts the mask by the extents of the destination + surface. + + This doesn't address the identical performance problem with the xlib + backend, which is due to a very similar bug in the X server. + + image-rgb long-lines-uncropped-100 465.42 -> 5.03: 92.66x speedup + █████████████████████████████████████████████▉ + image-rgba long-lines-uncropped-100 460.80 -> 5.02: 91.87x speedup + █████████████████████████████████████████████■+ + src/cairo-surface-fallback.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +commit cc11c264ec0c7d6586c9349bcdbe3f4156e7ab6e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 3 16:27:52 2007 -0800 + + Add long-lines perf case + + This shows some very bad slowness for lines that are mostly + offscreen (like 100x slower than just drawing the visible + portion). + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/long-lines.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 120 insertions(+) + +commit 11dd9eab693297961b988a73e22bf4d5850eb485 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 4 23:35:51 2007 -0500 + + [src/Makefile.am] Don't remove cairo-features.h in "make clean" + + That's generated by configure, so it should be removed by "make distclean". + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d4a58b2437a21794562d874f3d390e0e59688bc0 +Author: Jonathan Watt <jwatt@jwatt.org> +Date: Thu Jan 4 16:46:22 2007 +0100 + + Remove WINVER from public header file + + src/cairo-win32-surface.c | 10 ++++++++++ + src/cairo-win32.h | 10 ---------- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit e6369f9478e84e32ca19d5f204dbe3eee828c429 +Author: Peter Weilbacher <pmw@avila.aip.de> +Date: Thu Jan 4 00:11:44 2007 +0100 + + Fix for OS/2 display drivers that cannot handle 32bit output (feed them a 24bit buffer instead). + + src/cairo-os2-surface.c | 70 ++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 60 insertions(+), 10 deletions(-) + +commit 26b06516a77fbbe88f2eb081e2763c1434959137 +Author: Dan Amelang <dan@amelang.net> +Date: Sat Dec 30 21:14:14 2006 -0800 + + Use the "-" option (instead of "-a") when calling "strings" + + This is needed to fix the AX_C_FLOAT_WORDS_BIGENDIAN macro on Mac OS X 10.2, + which was brought up here: + + https://bugs.freedesktop.org/show_bug.cgi?id=9124 + + acinclude.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit eafd6e454a85c807f2addf7768046fea58aea3f9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 28 20:01:18 2006 -0500 + + In _cairo_scaled_font_text_to_glyphs, bail if text is zero-length (#5177) + + src/cairo-scaled-font.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ab29396ef9f68f5534f927b2b5bb0a7ffac86509 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 28 19:51:20 2006 -0500 + + [test] Add new test text-zero-len (#5177) + + The test passes an empty string to cairo_show_text, cairo_text_path, and + cairo_text_extents, and NULL and an invalid pointer, with zero num_glyphs to + cairo_show_glyphs, cairo_glyph_path, and cairo_glyph_extents. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/text-zero-len-ref.png | Bin 0 -> 130 bytes + test/text-zero-len.c | 88 +++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 91 insertions(+) + +commit 2d30161e8922e66b276341810c21ce1b740f6699 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Dec 24 18:31:02 2006 +0800 + + glitz: fix all compiler warnings in glitz backend. + + src/cairo-glitz-surface.c | 31 +++++++++++++++++++++++-------- + 1 file changed, 23 insertions(+), 8 deletions(-) + +commit 8fd7328ebb77b0a641cf30bded85e482ea63ad97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 23 17:08:04 2006 -0500 + + Don't call into backends if num_glyphs is zero (#5177) + + Just return success in _cairo_scaled_font_show_glyphs() and + _cairo_surface_show_glyphs() if num_glyphs is zero. + + src/cairo-scaled-font.c | 3 +++ + src/cairo-surface.c | 3 +++ + 2 files changed, 6 insertions(+) + +commit 3212fc4f0fcc66ec3a93994f253c1477eb434572 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 23 16:55:44 2006 -0500 + + [cairo-scaled-font] Skip invisible glyphs (like space) in glyph_extents() (#9422) + + When computing extents for an array of glyphs, just taking min/max of x/y for + the bounding box of each glyph doesn't work. The reason being that an + invisible glyph (like the space glyph) should not modify the resulting + extents, but it will. So now we skip invisible glyphs. + + src/cairo-scaled-font.c | 58 ++++++++++++++++++++++++++++++------------------- + 1 file changed, 36 insertions(+), 22 deletions(-) + +commit 8368fa2fcfcf851b9a5b070d22905472f1f76234 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Dec 23 15:44:16 2006 -0500 + + [test/text-rotate] Use the same text for measuring and printing + + test/text-rotate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 261d6b805c77dacb27d29d054e48ed548f1fbcc5 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Dec 23 15:33:52 2006 -0500 + + [ATSUI] Compute glyph extents from the bounding boxes of their paths (#9350) + + src/cairo-atsui-font.c | 156 ++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 116 insertions(+), 40 deletions(-) + +commit ee01bd9e173b6d36d6255553d0fcf1b54027dffd +Author: Carl Worth <cworth@cworth.org> +Date: Sat Dec 23 00:47:40 2006 -0800 + + Bump version to 1.3.11 after making 1.3.10 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b35cfde7f0e2896ccc1453f9716cb9b61c42cf94 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Dec 23 00:35:14 2006 -0800 + + Increment cairo version to 1.3.10 (and libtool versioning to 12:3:10) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d6895af9f165a033fc7e53233994a0885c2f817f +Author: Carl Worth <cworth@cworth.org> +Date: Sat Dec 23 00:29:21 2006 -0800 + + NEWS: Add notes for 1.3.10 snapshot + + NEWS | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +commit f46fcd1847031b46a73780177f9cb16033169a44 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Dec 23 00:29:01 2006 -0800 + + Annoying template churn + + doc/public/tmpl/cairo-text.sgml | 1 - + 1 file changed, 1 deletion(-) + +commit c08bd4ec377c6b97c9edb75a25101beb9568fd5e +Author: Carl Worth <cworth@cworth.org> +Date: Sat Dec 23 00:03:31 2006 -0800 + + Ignore another test case binary + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit ba531642f79d492ecbad8f086f1e44b56e157e36 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 19 21:34:16 2006 -0800 + + Add optimization for rectilinear stroke + + This custom stroking code allows backends to use optimized region-based + drawing operations for rectilinear strokes. This results in a 5-25x + performance improvement when drawing rectilinear shapes: + + image-rgb box-outline-stroke-100 0.18 -> 0.01: 25.58x speedup + ████████████████████████▋ + image-rgba box-outline-stroke-100 0.18 -> 0.01: 25.57x speedup + ████████████████████████▋ + xlib-rgb box-outline-stroke-100 0.49 -> 0.06: 8.67x speedup + ███████▋ + xlib-rgba box-outline-stroke-100 0.22 -> 0.04: 5.39x speedup + ████■+ + In other words, using cairo_stroke instead of cairo_fill to draw the + same shape was 5-15x slower before, but is 1.2-2x faster now. + + src/cairo-path-fixed-private.h | 3 +- + src/cairo-path-fixed.c | 4 + + src/cairo-path-stroke.c | 318 ++++++++++++++++++++++++- + src/cairo.c | 11 +- + test/ft-text-vertical-layout-type3-ref.png | Bin 3933 -> 3934 bytes + test/ft-text-vertical-layout-type3-svg-ref.png | Bin 3956 -> 3957 bytes + 6 files changed, 329 insertions(+), 7 deletions(-) + +commit b1189118532a1fe93e126843af739809d38a62bd +Author: Carl Worth <cworth@cworth.org> +Date: Fri Dec 22 17:11:08 2006 -0800 + + Put ft-text-vertical-layout-type1 back on the XFAIL list + + I must not have the right font available, (test result is coming out + looking like the result of ft-text-vertical-layout-type3, Vera?). + + We should switch this test to load a bundled font, (should do that for + all font-using tests, too). + + test/Makefile.am | 1 + + test/ft-text-vertical-layout-type1.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 7b1509f4f37118d14bd5d70365d1608ead5e2819 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 19 13:13:11 2006 -0800 + + Reimplement path.has_current point as a 1-bit bitfield + + src/cairo-path-fixed-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9d2d3b95e359cd2829c8d02a378dbfec2065e832 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 21 08:20:20 2006 -0800 + + Add new rectilinear-stroke test + + This is in preparation for an optimized implementation of cairo_stroke + for rectilinear paths. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/rectilinear-stroke-ref.png | Bin 0 -> 213 bytes + test/rectilinear-stroke.c | 138 ++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 141 insertions(+) + +commit 39ce31ade64e1c3b9e5880134ab77ca96f48f1b9 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Fri Dec 22 22:05:20 2006 +0800 + + Glitz: fix a potential use after free bug in _cairo_glitz_surface_old_show_glyphs. + + There is a race condition between glyph unlocking and glyph cache thawing. + Moving down _cairo_scaled_font_thaw_cache a few lines fixes the problem and make + crashes go away. + + src/cairo-glitz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 344901a1a128b7e843c3bff0a4a12c36be7acbc8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 20 18:03:33 2006 -0500 + + [test] Fix typo in test comment, again + + test/ft-text-vertical-layout-type1.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 473ae3aa9510b750f54cbf889180e3c4784da1b7 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Dec 18 17:00:17 2006 -0800 + + Rename remaining cairo_path_data to cairo_path in function names, etc. + + src/cairo-path-private.h | 19 ++-- + src/cairo-path.c | 237 ++++++++++++++++++++++++----------------------- + src/cairo.c | 10 +- + 3 files changed, 134 insertions(+), 132 deletions(-) + +commit def0e6d41d1a9108693db112f95d76bb6cfd0aaa +Author: Carl Worth <cworth@cworth.org> +Date: Mon Dec 18 16:37:53 2006 -0800 + + Rename cairo-path-data.c to cairo-path.c (and similar) + + src/Makefile.am | 4 +- + src/cairo-path-data-private.h | 58 ----- + src/cairo-path-data.c | 497 ------------------------------------------ + src/cairo-path-private.h | 58 +++++ + src/cairo-path.c | 497 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 2 +- + 6 files changed, 558 insertions(+), 558 deletions(-) + +commit 13c143bb52cab62a7a857a38a8463a8fa56f4632 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Dec 18 16:33:32 2006 -0800 + + Rename cairo-path.c to cairo-path-fixed.c + + src/Makefile.am | 2 +- + src/cairo-path-fixed.c | 639 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-path.c | 639 ------------------------------------------------- + 3 files changed, 640 insertions(+), 640 deletions(-) + +commit 267afe7be398db4ab90956660828ed25cfd19acf +Author: Carl Worth <cworth@cworth.org> +Date: Mon Dec 18 16:05:42 2006 -0800 + + test/.gitignore: Ignore binarries for some recently added tests + + test/.gitignore | 3 +++ + 1 file changed, 3 insertions(+) + +commit f3b9f486cd763c7805ec041319817cfb8c51128a +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Dec 17 22:26:02 2006 -0500 + + [ATSUI] Use screen metrics instead of ideal metrics to compute glyph extents + + The glyph extent computation was totally busted. It was using "logical" + extents and it was not correctly handling rotations, etc. It all looks a lot + better now. + + src/cairo-atsui-font.c | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +commit c6ec6ed696f55f65abbcfccb1e9d2c5678cf491a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 18:42:05 2006 -0500 + + [tests/ft-text-vertical-layout-type3] Remove comment that this emits Type3 font + + This test used to be named -truetype, which reflected the type of font used in + the test, in contrast to the -type1 test that uses a Type1 font. However, we + renamed this test to -type3 to emphasize the fact that a TrueType subset is + not emitted for vertical fonts and a Type3 fallback font is generated. + + Now things have changed: we try generating a Type1 fallback font which is what + is happening for this test. Moreover, the -typ1 test also is generating a + Type1 fallback font since the Type1 subset font is not useful for vertical + fonts. + + test/ft-text-vertical-layout-type3.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 50efd71935d0aa8d5b780b3ea2c3fd4c5333ca82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 18:35:16 2006 -0500 + + [type1-subset] Return UNSUPPORTED for vertical fonts + + This fixes the last problem with vertical fonts in PS/PDF. As such, remove + ft-text-vertical-layout-type1 test from XFAIL and add PS-specific ref image + to pass. + + src/cairo-type1-subset.c | 3 +++ + test/Makefile.am | 2 +- + test/ft-text-vertical-layout-type1-ps-argb32-ref.png | Bin 0 -> 1877 bytes + 3 files changed, 4 insertions(+), 1 deletion(-) + +commit 207e38e8ba009a5e4d7994ee490d478c6a695336 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 18:25:48 2006 -0500 + + [PS] Fix typo in comment emitted for Type1 fallback font subsets + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0bea2ce7f7e9c4b46d1125b07ed719fbb8b7102c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 14:31:39 2006 -0500 + + [pdiff] Define _GNU_SOURCE to get correct symbols out of <math.h> + + math.h does not define __USE_ISOC99 otherwise. + + test/pdiff/pdiff.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2ca6a767ee067742205ee76f891e36c8ec36135e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 14:24:57 2006 -0500 + + [pdiff] Don't use float math functions if not using gcc with C99 + + The float version of many math functions were introduced in C99, and were + causing compile failure on systems like OS X. We now define them to their + double variant if __USE_ISOC99 is not defined. We may want to expand it later + to cover non-gcc compilers too, but since this is pdiff only, it's not really + important. + + test/pdiff/pdiff.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 0d9b2d041578c183b026b90c3760ce8dc59e2834 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 14:09:15 2006 -0500 + + [configure] Use AC_C_INLINE to correctly define inline + + Previously we were defining a symbol INLINE and use that in one place, while + other places were using straight inline. With the AC_C_INLINE macro we can + just leave it to autoconf to correctly choose what inline should be defined + to. + + configure.in | 1 + + src/cairo-png.c | 2 +- + src/cairoint.h | 7 +------ + 3 files changed, 3 insertions(+), 7 deletions(-) + +commit 294d1a3c4e1865763ba1c9ac8d55827cd470280b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 17 01:06:16 2006 -0500 + + [test] Add ft-text-vertical-layout-type3-ps-argb32-ref.png + + The PS output for ft-text-vertical-layout-type3 looks correct, except for some + antialiasing mismatch. Ading ref image to fix this, and so, remove the test + from XFAIL. + + test/Makefile.am | 4 ++-- + test/ft-text-vertical-layout-type3-ps-argb32-ref.png | Bin 0 -> 1879 bytes + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit cab3f84ad334050739e6fa05e8dbc2a7dcb9eca7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 16 18:48:59 2006 -0500 + + [test] Fix typo in test comment + + test/ft-text-vertical-layout-type1.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 46add53973de5ba4ae4d6d02d1dd87e5487336c3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 16 18:46:54 2006 -0500 + + [cairo-gstate] Don't bypass glyph transformation if font_matrix has translation (#9365) + + We have tests for this (ft-text-vertical-*), but unfortunately they didn't + prevent the regression here because they have been marked XFAIL, since we didn't + quite fix them for PS. + + src/cairo-gstate.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 57589a90490f9bb9e4926c0b138eb95f16db374b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 16 18:18:47 2006 -0500 + + [pdiff] Use CAIRO_CFLAGS, to make sure warnings are enabled + + test/pdiff/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8f2ad0affd4fe4821992e87487bc2737e9c538e5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 16 18:16:46 2006 -0500 + + [pdiff] Fix compiler warnings, that were causing crashes + + test/pdiff/pdiff.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit be6edd64a3f45f7fb33f7d57b71b1ef467b474e1 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Dec 16 15:43:46 2006 -0500 + + [ATSUI] Round glyph locations to nearest pixel + + This is what cairo_scaled_font_show_glyphs() does, as well as backends like + xlib and win32. + + src/cairo-atsui-font.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit bf1c2ef1e2b6cffffb0f02fe5cb8df0728026642 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Dec 16 15:40:21 2006 -0500 + + [ATSUI] Support disabling antialiased text + + src/cairo-atsui-font.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4c95e2b7bf15c2c12498ae07a16d95ae98501431 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Dec 16 20:00:56 2006 +0200 + + New performance test case "mosaic" for splines. + + perf/Makefile.am | 4 +- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/mosaic.c | 168 ++ + perf/mosaic.h | 4387 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 4560 insertions(+), 1 deletion(-) + +commit fe21f9d8ca1e509952b1dd84a5c0430953ca663a +Author: Frederic Crozat <fcrozat@mandriva.com> +Date: Sat Dec 16 13:55:21 2006 -0500 + + [check-defs.sh] Fix make check for OPD platforms + + Make symbol checks work on OPD platform (such as IA64 or PPC64). + + src/check-def.sh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit fa618df6e216f9418d4769ba01cd305f3f12a113 +Merge: 2b946cb 81a620f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 21:10:21 2006 -0800 + + Merge branch 'master' of git.cairographics.org:/git/cairo into cairo + +commit 2b946cba0e2e0bc1ddfda2aad87f1e482568c1b1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 21:09:45 2006 -0800 + + Bump cairo version to 1.3.9 after making 1.3.8 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 129b55f5fcc4c2ae5b63ac6eb73fce8a708e4874 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 20:44:25 2006 -0800 + + Increment cairo version to 1.3.8 (and libtool versioning to 12:2:10) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8fa86e897091ad8ce4c286896df56d44892040ee +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 20:43:31 2006 -0800 + + NEWS: Add notes for cairo 1.3.8 snapshot + + NEWS | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit 81a620fb66a1eb341fefaad26c9d452e494890cb +Author: Jonathan Watt <jwatt@jwatt.org> +Date: Fri Dec 15 04:52:28 2006 +0100 + + revert accidental mode changes in my previous commit + + src/cairo-win32-surface.c | 0 + src/cairo-win32.h | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 15e8486ef1558b8049a4c7a5c2f50a7e4a2599da +Merge: bf78be6 8b31038 +Author: U-JONATHAN-X60S\jonathan <jonathan@Jonathan-X60s.(none)> +Date: Fri Dec 15 02:31:13 2006 +0100 + + Merge branch 'master' of git://git.cairographics.org/git/cairo + +commit bf78be63fc35dc13899209ee818f37fe3f564fed +Author: U-JONATHAN-X60S\jonathan <jonathan@Jonathan-X60s.(none)> +Date: Fri Dec 15 00:48:54 2006 +0100 + + Fix a couple of character spacing issues on Windows + + src/cairo-win32-surface.c | 105 +++++++++++++++++++++++++--------------------- + src/cairo-win32.h | 10 +++++ + src/cairoint.h | 10 ++++- + 3 files changed, 76 insertions(+), 49 deletions(-) + +commit 8b31038b9fb7f8fc3eb2729c3d14de5c0b130873 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 10:16:34 2006 -0800 + + Fix a couple of more stale images holding up 'make distcheck' + + test/Makefile.am | 2 -- + 1 file changed, 2 deletions(-) + +commit e9bef30d2bcdf41c7b7f20b3517839c37e752f75 +Author: David Turner <david@alice.localdomain> +Date: Thu Dec 14 06:55:58 2006 -0800 + + Optimize gradient computations + + We update the test suite reference images where needed, (pdiff + avoided a few, but most still needed updating). We take advantage + of the need for new reference images to shrink some of the giant + tests to speed them up a bit. + + This optimization provides a 2x improvement in linear gradient + generation performance (numbers from an x86 laptop): + + image-rgb paint_linear_rgba_source-512 26.13 -> 11.13: 2.35x speedup + █■+ image-rgb paint_linear_rgba_source-256 6.47 -> 2.76: 2.34x speedup + █■+ image-rgba paint_linear_rgb_over-256 6.51 -> 2.86: 2.28x speedup + █▎ + image-rgb paint_linear_rgba_over-512 28.62 -> 13.70: 2.09x speedup + █■+ image-rgba fill_linear_rgb_over-256 3.24 -> 1.94: 1.66x speedup + ▋ + image-rgb stroke_linear_rgba_over-256 5.68 -> 4.10: 1.39x speedup + ■+ + pixman/src/fbcompose.c | 425 ++++++++++++++++++++++++---------- + test/clip-operator-ref.png | Bin 36956 -> 8262 bytes + test/clip-operator-rgb24-ref.png | Bin 16507 -> 3258 bytes + test/clip-operator.c | 6 +- + test/mask-ref.png | Bin 87899 -> 8381 bytes + test/mask-rgb24-ref.png | Bin 71010 -> 7041 bytes + test/mask-svg-argb32-ref.png | Bin 87728 -> 8405 bytes + test/mask-svg-rgb24-ref.png | Bin 81753 -> 0 bytes + test/mask.c | 6 +- + test/operator-clear-ref.png | Bin 4933 -> 1084 bytes + test/operator-clear-rgb24-ref.png | Bin 4218 -> 965 bytes + test/operator-clear.c | 6 +- + test/operator-source-ref.png | Bin 19763 -> 4422 bytes + test/operator-source-rgb24-ref.png | Bin 14666 -> 3201 bytes + test/operator-source.c | 6 +- + test/text-pattern-ref.png | Bin 1721 -> 1717 bytes + test/text-pattern-rgb24-ref.png | Bin 1418 -> 1414 bytes + test/trap-clip-ref.png | Bin 71832 -> 5723 bytes + test/trap-clip-rgb24-ref.png | Bin 63049 -> 5365 bytes + test/trap-clip-svg-argb32-ref.png | Bin 71728 -> 0 bytes + test/trap-clip.c | 6 +- + test/unbounded-operator-ref.png | Bin 11964 -> 2777 bytes + test/unbounded-operator-rgb24-ref.png | Bin 6047 -> 1315 bytes + test/unbounded-operator.c | 6 +- + 24 files changed, 316 insertions(+), 145 deletions(-) + +commit af9cce6aa295327b5256f55900b3debf9112b6ca +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 09:18:26 2006 -0800 + + Fix 'make distcheck' after recent file removals + + pixman/src/Makefile.am | 3 +-- + test/Makefile.am | 20 -------------------- + 2 files changed, 1 insertion(+), 22 deletions(-) + +commit 4888a02666972e9c09d9ffd9854538191cf59d77 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 04:56:19 2006 -0800 + + test: Remove ps-specific reference images no longer needed thanks to pdiff + + test/caps-joins-ps-argb32-ref.png | Bin 1463 -> 0 bytes + test/caps-sub-paths-ps-argb32-ref.png | Bin 240 -> 0 bytes + test/close-path-ps-argb32-ref.png | Bin 311 -> 0 bytes + test/dash-offset-negative-ps-argb32-ref.png | Bin 204 -> 0 bytes + test/glyph-cache-pressure-ps-argb32-ref.png | Bin 1672 -> 0 bytes + test/infinite-join-ps-argb32-ref.png | Bin 220 -> 0 bytes + test/leaky-polygon-ps-argb32-ref.png | Bin 355 -> 0 bytes + test/line-width-ps-argb32-ref.png | Bin 244 -> 0 bytes + test/select-font-face-ps-argb32-ref.png | Bin 1333 -> 0 bytes + test/show-text-current-point-ps-argb32-ref.png | Bin 1479 -> 0 bytes + test/transforms-ps-argb32-ref.png | Bin 420 -> 0 bytes + 11 files changed, 0 insertions(+), 0 deletions(-) + +commit 5e0818d79d13f5942485b411a04a4eebd56d36f8 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 04:33:08 2006 -0800 + + test: Remove svg-specific reference images no longer needed thanks to pdiff + + This doesn't get rid of all the SVG reference images, but it + does clean up quite a few. + + test/fill-and-stroke-alpha-svg-ref.png | Bin 509 -> 0 bytes + test/glyph-cache-pressure-svg-ref.png | Bin 3165 -> 0 bytes + test/mask-ctm-svg-rgb24-ref.png | Bin 118 -> 0 bytes + test/mask-surface-ctm-svg-rgb24-ref.png | Bin 118 -> 0 bytes + test/push-group-svg-rgb24-ref.png | Bin 2887 -> 0 bytes + test/select-font-face-svg-ref.png | Bin 2430 -> 0 bytes + test/set-source-svg-rgb24-ref.png | Bin 104 -> 0 bytes + test/show-text-current-point-svg-ref.png | Bin 2398 -> 0 bytes + test/trap-clip-svg-rgb24-ref.png | Bin 73082 -> 0 bytes + 9 files changed, 0 insertions(+), 0 deletions(-) + +commit c426e71141d75dbfd39730bf9c4847309fcd9d9e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 04:17:07 2006 -0800 + + Hook up pdiff to the test suite now that its written in C + + test/Makefile.am | 2 ++ + test/buffer-diff.c | 30 ++++++++++++++++++++++++++++++ + test/cairo-test.c | 12 +++++------- + 3 files changed, 37 insertions(+), 7 deletions(-) + +commit 305cbd8e71a2d21a2c71ed2c382daa5bfcec3992 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 04:14:24 2006 -0800 + + pdiff: Remove casts since we're out of the land of X++ where void* is stupidly broken + + test/pdiff/lpyramid.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit f175b23559f3ba759d222538fd28922c1cbe2196 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 03:49:31 2006 -0800 + + pdiff: Rename everything to .c and fix an last littele C++ isms. + + The only things we had missed were a few new/delete pairs, and some + obvious header file fixups, (like not doing <string>). + + test/pdiff/CompareArgs.cpp | 114 ------------- + test/pdiff/Makefile.am | 6 +- + test/pdiff/PerceptualDiff.cpp | 101 ------------ + test/pdiff/args.c | 119 ++++++++++++++ + test/pdiff/args.cpp | 118 -------------- + test/pdiff/args.h | 2 +- + test/pdiff/lpyramid.c | 113 +++++++++++++ + test/pdiff/lpyramid.cpp | 113 ------------- + test/pdiff/pdiff.c | 361 ++++++++++++++++++++++++++++++++++++++++++ + test/pdiff/pdiff.cpp | 347 ---------------------------------------- + test/pdiff/pdiff.h | 16 +- + test/pdiff/perceptualdiff.c | 101 ++++++++++++ + 12 files changed, 706 insertions(+), 805 deletions(-) + +commit 18a4fa448fcdb6a72f427e997ee2b234f96a56f7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 03:25:51 2006 -0800 + + pdiff: Replace CompareArgs class with args_t struct + + This gets rid of nearly the last vestiges of C++ from the pdiff code. + + test/pdiff/CompareArgs.cpp | 4 +- + test/pdiff/CompareArgs.h | 41 --------------- + test/pdiff/Makefile.am | 4 +- + test/pdiff/PerceptualDiff.cpp | 39 +++++++------- + test/pdiff/args.cpp | 118 ++++++++++++++++++++++++++++++++++++++++++ + test/pdiff/args.h | 46 ++++++++++++++++ + 6 files changed, 190 insertions(+), 62 deletions(-) + +commit 871aba6c80b8f3101eac51cc055ad9ca26770a95 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 03:16:18 2006 -0800 + + pdiff: Fix return value from perceptualdiff program + + test/pdiff/PerceptualDiff.cpp | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 2174ee247554feef6a24792390d858b12fd44acd +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 03:15:14 2006 -0800 + + pdiff: Remove all uses of std::string + + test/pdiff/CompareArgs.cpp | 18 ++++++------------ + test/pdiff/CompareArgs.h | 1 - + test/pdiff/PerceptualDiff.cpp | 24 ++++++++---------------- + 3 files changed, 14 insertions(+), 29 deletions(-) + +commit 91b156b82e0219b2b851c218813f24024cad7c69 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 03:02:48 2006 -0800 + + pdiff: Remove RGBAImage classes now that we're just using cairo image surfaces + + test/pdiff/CompareArgs.cpp | 1 - + test/pdiff/CompareArgs.h | 3 - + test/pdiff/Makefile.am | 4 +- + test/pdiff/PerceptualDiff.cpp | 1 - + test/pdiff/RGBAImage.cpp | 144 ------------------------------------------ + test/pdiff/RGBAImage.h | 105 ------------------------------ + test/pdiff/pdiff.cpp | 80 +++++++++++++++++++---- + test/pdiff/pdiff.h | 2 + + 8 files changed, 69 insertions(+), 271 deletions(-) + +commit 4c812c38e4ec9885b9451185127e5c8877354d75 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 02:10:35 2006 -0800 + + pdiff: Remove hideous C++ reference passing + + test/pdiff/pdiff.cpp | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 2457756afd66b69840640eff3aaf72e7ea0f64e8 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 02:08:30 2006 -0800 + + pdiff: Remove intermingled statements and declarations + + test/pdiff/pdiff.cpp | 74 +++++++++++++++++++++++++++++++--------------------- + 1 file changed, 44 insertions(+), 30 deletions(-) + +commit e947f5a4bdf4a4134faa8961406a10f32cf4e2d6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 01:09:05 2006 -0800 + + pdiff: Add .gitignore for perceptualdiff binary + + test/pdiff/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit bb4d4dc77117ded253d1f507e771de7f98c69fb8 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 01:06:42 2006 -0800 + + pdiff: Remove old, unused Yee_Compare interface + + test/pdiff/Makefile.am | 2 +- + test/pdiff/Metric.cpp | 295 ------------------------------------------------- + test/pdiff/pdiff.cpp | 281 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 282 insertions(+), 296 deletions(-) + +commit 53c3a2f75b7f065b4c769ad087bbc9aaaaf6d7ee +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 01:00:43 2006 -0800 + + pdiff: Rewrite main program to use cairo-based pdiff_compare interface + + test/pdiff/CompareArgs.cpp | 23 +++++++++------------ + test/pdiff/CompareArgs.h | 5 +++-- + test/pdiff/Makefile.am | 1 - + test/pdiff/Metric.cpp | 35 ++++++++++++++++---------------- + test/pdiff/Metric.h | 32 ----------------------------- + test/pdiff/PerceptualDiff.cpp | 47 ++++++++++++++++++++++++++++++++----------- + 6 files changed, 65 insertions(+), 78 deletions(-) + +commit 358645d6eb68b4eaf79159e7aefa01bca4cb0acf +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 00:42:52 2006 -0800 + + pdiff: Rip out unused ImgDiff code, (dropping -output option) + + test/pdiff/CompareArgs.cpp | 7 ------- + test/pdiff/CompareArgs.h | 1 - + test/pdiff/Metric.cpp | 11 ----------- + test/pdiff/PerceptualDiff.cpp | 14 -------------- + test/pdiff/README.txt | 4 ++-- + 5 files changed, 2 insertions(+), 35 deletions(-) + +commit 4438fb6dca1b4b6c0a30d66508339c3997ee94a4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 00:38:39 2006 -0800 + + pdiff: Move function that depends on command-line argument class to same file as main + + test/pdiff/Metric.cpp | 61 ------------------------------------------- + test/pdiff/Metric.h | 9 +++++-- + test/pdiff/PerceptualDiff.cpp | 54 ++++++++++++++++++++++++++++++++++++++ + test/pdiff/RGBAImage.h | 2 +- + 4 files changed, 62 insertions(+), 64 deletions(-) + +commit c7379fcea478fbd3fc5e09a10828586e641e2375 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 00:30:54 2006 -0800 + + pdiff: Rewrite Laplacian pyramid code from C++ to C + + test/pdiff/LPyramid.cpp | 87 -------------------------------- + test/pdiff/LPyramid.h | 38 -------------- + test/pdiff/Makefile.am | 4 +- + test/pdiff/Metric.cpp | 22 ++++---- + test/pdiff/PerceptualDiff.cpp | 2 +- + test/pdiff/lpyramid.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++ + test/pdiff/lpyramid.h | 32 ++++++++++++ + 7 files changed, 159 insertions(+), 139 deletions(-) + +commit 29456d38658b8ba7267fadeac9820a68227df787 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Dec 14 00:13:23 2006 -0800 + + pdiff: Convert C++-style comments to good old-fashioned C-style comments + + test/pdiff/CompareArgs.cpp | 2 +- + test/pdiff/CompareArgs.h | 20 ++++++++++---------- + test/pdiff/LPyramid.cpp | 12 ++++++------ + test/pdiff/LPyramid.h | 4 ++-- + test/pdiff/Metric.cpp | 24 +++++++++++++----------- + test/pdiff/Metric.h | 5 +++-- + test/pdiff/RGBAImage.cpp | 6 +++--- + test/pdiff/RGBAImage.h | 2 +- + 8 files changed, 39 insertions(+), 36 deletions(-) + +commit 34a6af3c55cf8bba292cec8dc42fdc1917759a08 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 13 18:10:21 2006 -0800 + + pdiff: Delete all trailing whitespace. + + test/pdiff/CompareArgs.cpp | 4 ++-- + test/pdiff/CompareArgs.h | 4 ++-- + test/pdiff/LPyramid.cpp | 4 ++-- + test/pdiff/LPyramid.h | 4 ++-- + test/pdiff/Metric.cpp | 52 +++++++++++++++++++++---------------------- + test/pdiff/PerceptualDiff.cpp | 2 +- + test/pdiff/RGBAImage.cpp | 8 +++---- + test/pdiff/RGBAImage.h | 2 +- + 8 files changed, 40 insertions(+), 40 deletions(-) + +commit d421a856d08fba2fa0fdbd362d947497a952b347 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 13 18:08:25 2006 -0800 + + pdiff: Re-indent all code + + I've given up on trying to preserve the old code formatting + for compatibility. We're not planning on augmenting the algorithm + itself, just integrating it into cairo. So I don't expect to + make changes that we'll be all that interested in pushing + upstream. + + test/pdiff/CompareArgs.cpp | 162 ++++++------- + test/pdiff/CompareArgs.h | 46 ++-- + test/pdiff/LPyramid.cpp | 100 ++++---- + test/pdiff/LPyramid.h | 38 ++-- + test/pdiff/Metric.cpp | 514 +++++++++++++++++++++--------------------- + test/pdiff/PerceptualDiff.cpp | 52 ++--- + test/pdiff/RGBAImage.cpp | 168 +++++++------- + test/pdiff/RGBAImage.h | 86 +++---- + test/pdiff/pdiff.h | 20 +- + 9 files changed, 593 insertions(+), 593 deletions(-) + +commit 4f6611ef6cac3928427b6fc28dab40829ef0d748 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 13 17:40:59 2006 -0800 + + pdiff: Fix line endings + + test/pdiff/LPyramid.cpp | 174 ++++++++++++++++++++++++------------------------ + test/pdiff/LPyramid.h | 76 ++++++++++----------- + 2 files changed, 125 insertions(+), 125 deletions(-) + +commit ccb3a6c4deadeaecf133dce6f1b152507ab5a14f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 12 16:49:27 2006 -0800 + + pdiff: Compile pdiff algorithm as a libtool convenience library + + The convenience library provides a pdiff_compare function with a + cairo interface into the perceptual diff algorithm. + + test/Makefile.am | 2 +- + test/pdiff/Makefile.am | 14 +++++++++----- + test/pdiff/Metric.cpp | 18 ++++++++++++++++++ + test/pdiff/RGBAImage.h | 2 +- + test/pdiff/pdiff.h | 38 ++++++++++++++++++++++++++++++++++++++ + 5 files changed, 67 insertions(+), 7 deletions(-) + +commit 55f776876d231a035cdc5da9bb90cbba14f19248 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 12 16:37:35 2006 -0800 + + test: Rework buffer_diff interface as new compare_surfaces + + This is a slightly kinder interface that accepts cairo_image_surface_t + pointers rather than pointers to the raw image data and width, height, + stride. This brings us closer to hooking up the pdiff code. + + test/buffer-diff.c | 28 +++++++++++++--------------- + test/buffer-diff.h | 15 ++++++--------- + 2 files changed, 19 insertions(+), 24 deletions(-) + +commit 0d7870b6bf13edfe513e2de25a5814a0a1b78c79 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 12 16:15:08 2006 -0800 + + pdiff: Teach pdiff code to accept cairo image surfaces + + This is a second small step in enabling cairo's test suite and the + pdiff code to start working together. + + test/pdiff/CompareArgs.cpp | 49 +++++++++++++++-------------------- + test/pdiff/CompareArgs.h | 1 + + test/pdiff/Makefile.am | 1 + + test/pdiff/RGBAImage.h | 64 ++++++++++++++++++++++++++++++++++++++++------ + 4 files changed, 79 insertions(+), 36 deletions(-) + +commit a87f494d4b91f3acc78d6d7dd737939633f28d71 +Author: Dan Amelang <dan@amelang.net> +Date: Tue Dec 12 16:34:50 2006 -0800 + + Don't use the GNU-only grep option "-a" + + We now use strings first, then grep to find the magic value, as suggested + by various people in the reports for the bugs that this fixes: + + https://bugs.freedesktop.org/show_bug.cgi?id=9247 + https://bugs.freedesktop.org/show_bug.cgi?id=9124 + + acinclude.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 41e01d95edd7eb573a8b79acd0ab2b9de8cdab40 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 12 03:13:38 2006 -0800 + + pdiff: Factor out a comparison function that doesn't read the 'args' structure + + This is one small step in "libifying" pdiff which will make it + easier to share this code inside cairo's test suite. + + test/pdiff/Metric.cpp | 112 ++++++++++++++++++++++++++++++++------------------ + 1 file changed, 72 insertions(+), 40 deletions(-) + +commit b50b8db6d7d3d0a887ee18ad5e8e0455ed794429 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 12 02:17:19 2006 -0800 + + test: Simplify buffer_diff by handling device offset in advance + + In a manner similar to flattening in advance, we now extract the sub- + surface of interest (when testing with device offsets) before calling + into the buffer_diff functions. This allows these functions to accept + a single stride value once again instead of one for each of the three + images. + + test/buffer-diff.c | 103 +++++++++++++++++++++++++++++++++------------------- + test/buffer-diff.h | 8 +--- + test/xlib-surface.c | 4 -- + 3 files changed, 67 insertions(+), 48 deletions(-) + +commit 1781e6018c17909311295a9cc74b70500c6b4d0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 11 03:31:10 2006 -0500 + + [Xlib] Rewrite an optimized cairo_xlib_show_glyphs() + + The old implementation was a very naive one that used to generate one XRender + glyph element per glyph. That is, position glyphs individually. This was + raised here: + + http://lists.freedesktop.org/archives/cairo/2006-December/008835.html + + The new implmentation is a free rewriting of the Xft logic, that is, + compressing glyphs with "natural" advance into elements, but with various + optimizations and improvements. + + In short, it works like this: glyphs are looped over, skipping those that are + not desired, and computing offset from "current position". Whenever a glyph + has non-zero offsets from the current position, a new element should be + started. All these are used to compute the request size in the render + protocol. Whenever the request size may exceed the max request size, or at + the end, glyphs are flushed. For this to work, we now set non-zero glyph + advances when sending glyphs to the server. + + Notable optimizations and improvements include: + + - Reusing the input glyph array (with double glyph positions) as a working + array to compute glyph offsets. + + - Reusing the input glyph array as the output glyph-index array to be passed + to XRender. + + - Marking glyphs to be skipped as so, avoiding a copy of the glyph array, + which is what the old code was doing. + + - Skip glyphs with positions "out-of-range". That is, those with positions + that would cause an overflow in Xrender's glyph offset calculations. + + On my Fedora desktop on Pentium 4, and on a Nokia 770, it shows a 6% speedup on + the timetext test. + + src/cairo-xlib-surface.c | 477 +++++++++++++++++++++++++---------------------- + 1 file changed, 257 insertions(+), 220 deletions(-) + +commit 198c1439ab21b1b19310335d93242709d1398ff3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 11 03:16:50 2006 -0500 + + Cache rounded glyph advance values + + This is done in cairo_scaled_glyph_t->x/y_advance. The value is mostly useful + for raster backends, for example to set as default advance of a glyph, and + later on optimize glyph positionings that use the default advance. + + src/cairo-scaled-font.c | 10 ++++++++++ + src/cairoint.h | 2 ++ + 2 files changed, 12 insertions(+) + +commit e7ed9eee767c85853d6d2fb823ff3317c490948c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 11 03:13:34 2006 -0500 + + [cairo-gstate] Use a local buffer on the stack for small glyph operations + + We duplicate the incoming glyph array for two reasons: 1) applying + transformations, and 2) to let the lower level functions have a glyph array + they can modify. By using a 2kb array on the stack we can avoid malloc() for + requests of less than 100 glyphs. The size of the array can be tuned by + setting CAIRO_STACK_BUFFER_SIZE. + + src/cairo-gstate.c | 30 +++++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +commit da60bc45f295b15c62089874fb30cedc1d70bcd2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 11 03:10:05 2006 -0500 + + [cairoint] Define CAIRO_STACK_BUFFER_SIZE (defaults to 2kb) + + This is the suggested size in bytes of buffers allocated on the stack per + function, mostly used for glyph rendering. We typically use a local buffer on + the stack to avoid mallocing for small requests. Requests that do not fit are + malloc()ed automatically. The default value should be enough for about a + 100-glyph cairo_show_glyphs() operation. + + src/cairoint.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 5a9642c5746fd677aed35ce620ce90b1029b1a0c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 11 01:39:51 2006 -0500 + + Add/remove const to cairo_glyph_t* arguments consistently + + The rule is: cairo_glyph_t* is always passed as const for measurement + purposes. This was not reflected in our public api previously. Fixed + + Showing glyphs used to have cairo_glyph_t* always as const. With this + changed, it is only const on cairo_t and cairo_gstate_t operations. + cairo_surface_t, cairo_scaled_font_t, and individual backends receive + cairo_glyph_t* as non-const. The desired semantics is that they may modify + the contents of the array as long as they do not return + CAIRO_STATUS_UNSUPPORTED. This makes it possible to avoid copying the glyph + array again and again, and edit it in-place. Backends are in fact free to use + the array as a generic buffer as they see fit. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-atsui-font.c | 2 +- + src/cairo-directfb-surface.c | 2 +- + src/cairo-glitz-surface.c | 2 +- + src/cairo-gstate.c | 12 ++++++------ + src/cairo-meta-surface.c | 2 +- + src/cairo-nquartz-surface.c | 2 +- + src/cairo-paginated-surface.c | 2 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-surface-fallback-private.h | 2 +- + src/cairo-surface-fallback.c | 4 ++-- + src/cairo-surface.c | 4 ++-- + src/cairo-svg-surface.c | 2 +- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo.c | 4 ++-- + src/cairo.h | 6 +++--- + src/cairoint.h | 28 +++++++++++----------------- + src/test-meta-surface.c | 2 +- + src/test-paginated-surface.c | 2 +- + 24 files changed, 47 insertions(+), 53 deletions(-) + +commit 70695f5c62b89b417c1e8b42451470a5a8920bf3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 10 02:32:52 2006 -0500 + + [FreeType] Remove "UNSUPPORTED" show_glyphs stub and NULL its entry + + The fallback paths always assume UNSUPPORTED if a method is NULL, so, no need + for a method to just return UNSUPPORTED. + + src/cairo-ft-font.c | 19 +------------------ + 1 file changed, 1 insertion(+), 18 deletions(-) + +commit fea60c7283172be5efb42332a96fe322466bd6ed +Author: Dan Amelang <dan@amelang.net> +Date: Sat Dec 9 18:54:47 2006 -0800 + + Change _cairo_lround to correctly handle edge cases previously missed + + A nice side effect of this new approach is that the valid input range + was expanded back to (INT_MIN, INT_MAX]. No performance regressions observed. + Also included is documentation about the internal mysteries of _cairo_lround, + as previously promised. + + src/cairo.c | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 179 insertions(+), 26 deletions(-) + +commit cc75159587a4479951da354cfa282d81c74b0377 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 8 16:10:57 2006 -0500 + + [FreeType] Do not return large structs from functions + + Pass cairo_ft_options_t around by pointer, not by value. That's what we do + with cairo_font_options_t anyway, and there is no reason to not do the same + here. (makes -Waggregate-return warnings go away btw). + + src/cairo-ft-font.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit beadc7da864c974558b8e98723e9d2533baab630 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 8 15:42:24 2006 -0500 + + [docs] Update templates + + doc/public/tmpl/cairo-pattern.sgml | 76 ++++++++++++++++++++++ + doc/public/tmpl/cairo-status.sgml | 50 +++++++-------- + doc/public/tmpl/cairo-surface.sgml | 114 ++++++++++++++++----------------- + doc/public/tmpl/cairo-text.sgml | 1 + + doc/public/tmpl/cairo-win32-fonts.sgml | 18 ++++++ + doc/public/tmpl/cairo-win32.sgml | 21 ++++++ + doc/public/tmpl/cairo.sgml | 69 ++++++++++++++++++++ + 7 files changed, 267 insertions(+), 82 deletions(-) + +commit cdd79c104dd940077b1f3193c31272f9a4673bb5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 8 15:41:52 2006 -0500 + + [docs] Generate index of new symbols in 1.4 + + doc/public/cairo-docs.xml | 3 +++ + 1 file changed, 3 insertions(+) + +commit 16c7587f2dcab5abbbe62505e64c1ac9441dfb8e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 8 15:40:59 2006 -0500 + + [slim] Define slim macros to dummy prototypes for non-gcc compilers (#9150) + + src/cairoint.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6122c30930525c0d672166eab8b05e0951c7b039 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 8 15:38:34 2006 -0500 + + [pixman] Remove unused slim_internal.h + + pixman/src/slim_internal.h | 103 --------------------------------------------- + 1 file changed, 103 deletions(-) + +commit 734b321aab3df046716a54cfdcefbe42fa6b1a8b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 7 00:14:37 2006 -0500 + + [doc] Minor wording improvement. + + doc/public/tmpl/cairo-version.sgml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit eedd86165efed065bf79469b1cf57c0127012b98 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 7 00:08:09 2006 -0500 + + [docs] Document CAIRO_VERSION_STRING. + + doc/public/tmpl/cairo-version.sgml | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 9b87fab8ce283e966da7ac850980397cb9e199cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 6 23:52:22 2006 -0500 + + [docs] Hook various new API into cairo-sections.txt + + doc/public/cairo-sections.txt | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 0e028ee0f3bfb95d8483bb4c84b84c4bd53b8c53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 6 23:40:08 2006 -0500 + + [doc/public/Makefile.am] Move the list of private headers generatable + + Move the list of private headers into separate file Headers.mk that + Makefile.am includes (using automake). To update the list, just remove + Headers.mk and make. + + doc/public/Headers.mk | 31 ++++++++++++++++++++++++++ + doc/public/Makefile.am | 59 ++++++++++++++++++++------------------------------ + 2 files changed, 55 insertions(+), 35 deletions(-) + +commit b8e1f3778e61e3c5a809f610a1af97ea56a9960e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 6 23:38:20 2006 -0500 + + [docs] Document various CAIRO_VERSION_* macros + + doc/public/tmpl/cairo-version.sgml | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit fd03991a6a78d849e2184f53a2b1b6915a6a64d0 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Dec 7 04:46:07 2006 +0200 + + test: random-intersections + + The purpose of this test case is to help make + sure that changes to the trapezoid generation or + intersection computation in the tessellator + don't break it. + + test/Makefile.am | 4 ++ + test/random-intersections-ps-argb32-ref.png | Bin 0 -> 107578 bytes + test/random-intersections-ref.png | Bin 0 -> 177153 bytes + test/random-intersections-rgb24-ref.png | Bin 0 -> 132210 bytes + test/random-intersections.c | 79 ++++++++++++++++++++++++++++ + 5 files changed, 83 insertions(+) + +commit 6301f92d2af2fd7928352965bcab42bab9deb59d +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Dec 7 02:30:41 2006 +0200 + + Rework the in-fill-empty-trapezoid test to not use the cairo_test() framework. + + As suggested by Behdad Esfahbod, we can not use the cairo_test() framework + when it is getting in the way. The test itself doesn't depend on any + particular backend. + + http://lists.freedesktop.org/archives/cairo/2006-December/008809.html + + test/Makefile.am | 2 -- + test/in-fill-empty-trapezoid-ref.png | Bin 108 -> 0 bytes + test/in-fill-empty-trapezoid-rgb24-ref.png | Bin 107 -> 0 bytes + test/in-fill-empty-trapezoid.c | 54 +++++++++++++++++------------ + 4 files changed, 31 insertions(+), 25 deletions(-) + +commit c13a1a2ed0ce8ba2b43e4e70c66cdc5b98e80eb4 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Dec 7 01:42:07 2006 +0200 + + Replace point sampling in the fill-degenerate-sort-order with rendering. + + Clean up the test to not even check the ps backend as per: + + http://lists.freedesktop.org/archives/cairo/2006-December/008806.html + + boilerplate/cairo-boilerplate.c | 3 +++ + test/fill-degenerate-sort-order-ref.png | Bin 643 -> 2397 bytes + test/fill-degenerate-sort-order-rgb24-ref.png | Bin 611 -> 2060 bytes + test/fill-degenerate-sort-order.c | 32 +++----------------------- + 4 files changed, 6 insertions(+), 29 deletions(-) + +commit 565a715d119d00ac141d1b235dab7985ed78113a +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Dec 7 01:16:43 2006 +0200 + + Change license of tessellator tests to the MIT license. + + The blurb for the fill-degenerate-sort-order, fill-missed-stop and + in-fill-empty-trapezoid tests changed to this one: + + http://www.opensource.org/licenses/mit-license.php + + c.f. http://lists.freedesktop.org/archives/cairo/2006-December/008806.html + + test/fill-degenerate-sort-order.c | 35 ++++++++++++++++++----------------- + test/fill-missed-stop.c | 35 ++++++++++++++++++----------------- + test/in-fill-empty-trapezoid.c | 35 ++++++++++++++++++----------------- + 3 files changed, 54 insertions(+), 51 deletions(-) + +commit e857ac325a048799016196bc65ce6ff279c01431 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Dec 7 00:52:43 2006 +0200 + + tessellator bug fix: linking fails on x86_64 due to superfluous inline attribute. + + Remove inline attribute from cairo_bo_event_compare_abstract() + to fix the linking issue reported by Jinghua Luo on the mailing list: + + http://lists.freedesktop.org/archives/cairo/2006-November/008574.html + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 16c0db0d6843184e79b73a3613f65c0cc06a684d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 6 19:02:09 2006 -0500 + + [test] Break the "make clean" target into serveral rm calls + + Some systems cannot handle very long list of arguments. Carl was hitting this + for "make clean". Break it out into several rm calls triggered by the + clean-local target. + + test/Makefile.am | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 3cf994779580fe3355356c00e20a93ddb676355e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 6 18:52:45 2006 -0500 + + [.gitignore] Add big-trap + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 4b43a3a1c4d4f4659e604cea1d79e1b5e18ce107 +Author: Peter Weilbacher <pmw@avila.aip.de> +Date: Thu Dec 7 00:27:29 2006 +0100 + + Add OS/2 backend and its requirement to INSTALL and README, following the example of BeOS. + + INSTALL | 1 + + README | 9 ++++++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 652f73f0907c0d4b4bee155a73acb4a6a0cf5f37 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 6 13:40:52 2006 -0800 + + Bump version to 1.3.7 after making 1.3.6 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 648ef4487dfa43f20fb2c73e7b8e567f8a25497a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 6 13:22:24 2006 -0800 + + Increment cairo version to 1.3.6 (and libtool versioning to 12:1:10) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f0459b3c53d3319822ef6e5f8bc118e742dcbf5f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 6 13:20:04 2006 -0800 + + NEWS: Add notes for 1.3.6 snapshot + + NEWS | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 65 insertions(+) + +commit e840c120ddc5ad3adeba95c2baf5262aae57d9d1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 6 13:19:30 2006 -0800 + + Fix 'make distcheck' by mentioning test/pdiff in DIST_SUBDIRS + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit b83f9e766a0925a59f0db488ef8c905f3fcbcbe4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 6 13:17:41 2006 -0800 + + ROADMAP: Note that the Banker's rounding bug is fixed + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce58f874fe25334961807a2cecf6066b18569c05 +Author: Dan Amelang <dan@amelang.net> +Date: Tue Dec 5 23:45:15 2006 -0800 + + Change _cairo_lround to use arithmetic rounding + + This fixes the text rendering bug reported here: + + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=217819 + + No performance impact on x86. On the 770, I see minor speedups in text_solid + and text_image (~1.05x). + + src/cairo.c | 57 +++++++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 45 insertions(+), 12 deletions(-) + +commit d0eff3919646e8a4c9981c349e33060fdb27c94e +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Dec 6 05:53:53 2006 +0200 + + tessellator: input validation and guard bit removal + + This patch removes the guard bits from the tessellator internal + coordinates and reworks the input validation to make sure that the + tessellator code should never die on an assert. When the extent of a + polygon exceeds a width or height of 2^31-1, then the rightmost + (resp. bottommost) points are clamped to within 2^31-1 of the leftmost + (resp. topmost) point of the polygon. The clamping produces bad + rendering for really large polygons, and needs to be fixed in a saner + manner. + + Cleaned up as per + + http://lists.freedesktop.org/archives/cairo/2006-December/008806.html + + src/cairo-bentley-ottmann.c | 147 +++++++++++++++++++++++--------------------- + 1 file changed, 78 insertions(+), 69 deletions(-) + +commit f8ba74917296be226f7a957ad1a26685bb6d846c +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 22:56:22 2006 +0200 + + tessellator: offset working coordinates to be nonnegative + + This patch improves the translation invariance of the tessellator + by offsetting all input coordinates to be nonnegative and paves + the way for future optimisations using the coordinate range. + + Also changes the assertions to make sure that it is safe to add + the guard bits. This needs to be changed to do something sensible + about input coordinates that are too large instead of croaking. + The plan is to steal the guard bits from the least significant + instead of the most significant user bits, and having all coordinates + nonnegative will make the rounding involved there easier. + + src/cairo-bentley-ottmann.c | 126 +++++++++++++++++++++++++++++++++----------- + 1 file changed, 96 insertions(+), 30 deletions(-) + +commit 633c51b4426f5405db0eac5edb81651b7e1491ef +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 21:55:50 2006 +0200 + + tessellator bug fix: in-fill-empty-trapezoid + + The cairo_in_fill() function sometimes gives false positives + when it samples a point on the edge of an empty trapezoid. + This patch alleviates the bug (but doesn't fix it completely), + for the common(?) case where the left and right edges of the + empty trapezoid have equal top and bottom points. + + src/cairo-bentley-ottmann.c | 31 +++++++++++++++++++++---------- + 1 file changed, 21 insertions(+), 10 deletions(-) + +commit e6c8febca7a24f6cf4138a25c96a36e4e7721a92 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 21:38:25 2006 +0200 + + tessellator bug fix: fill-missed-stop + + Fixes the regression exhibited by the test fill-missed-stop, + where the tessellator would sometimes extend a trapezoid + too far below the end of the right edge. + + src/cairo-bentley-ottmann.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 614117e487f36c66f2a479c96e1cb4daef625608 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 21:31:23 2006 +0200 + + tessellator bug fix: fill-degenerate-sort-order + + Fixes the regression fill-degenerate-sort-order, where + confusion arises in the event order for collinear edges. + Also fixes (or at least hides) the issues with zrusin-another + sometimes generating different trapezoids depending on the + state of the random number generator in cairo-skiplist.c. + + src/cairo-bentley-ottmann.c | 40 +++++++++++++++++++++++++++++----------- + 1 file changed, 29 insertions(+), 11 deletions(-) + +commit 48b42efcfee470a1224d6ad0646525964ac640c6 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 13:02:47 2006 +0200 + + test: check for tessellator regression from missed stop events + + The new tessellator contains a regression where stop events + that aren't followed by start events sometimes cause the + trapezoid to the left of an edge to be too high. + + test/Makefile.am | 4 ++ + test/fill-missed-stop-ps-argb32-ref.png | Bin 0 -> 564 bytes + test/fill-missed-stop-ref.png | Bin 0 -> 466 bytes + test/fill-missed-stop-rgb24-ref.png | Bin 0 -> 394 bytes + test/fill-missed-stop.c | 89 ++++++++++++++++++++++++++++++++ + 5 files changed, 93 insertions(+) + +commit e94e0a1ca262ef67b527b13a5e9691ad42a43204 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 12:20:17 2006 +0200 + + test: check if cairo_in_fill() is reporting false positives for empty trapezoids. + + cairo_in_fill() may report true if a query point lands on an edge of an + empty trapezoid. + + test/Makefile.am | 3 + + test/in-fill-empty-trapezoid-ref.png | Bin 0 -> 108 bytes + test/in-fill-empty-trapezoid-rgb24-ref.png | Bin 0 -> 107 bytes + test/in-fill-empty-trapezoid.c | 89 +++++++++++++++++++++++++++++ + 4 files changed, 92 insertions(+) + +commit 00d7b6acdd263f7b46ea98c4a5b777fc93a65be5 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 11:21:14 2006 +0200 + + test: tessellator event comparator test case for degenerate edges. + + There's currently a regression bug in the tessellation code from + switching to the new tessellator. The bug is caused by + confusion in the comparator used to order events when there are + degenerate edges. This test is derived from the zrusin-another + performance test case. + + test/Makefile.am | 3 + + test/fill-degenerate-sort-order-ref.png | Bin 0 -> 643 bytes + test/fill-degenerate-sort-order-rgb24-ref.png | Bin 0 -> 611 bytes + test/fill-degenerate-sort-order.c | 110 ++++++++++++++++++++++++++ + 4 files changed, 113 insertions(+) + +commit c92f23caa549651a05863ecda19c55c112350528 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Dec 5 11:14:49 2006 -0800 + + ROADMAP: Add _cairo_lround bug for 1.3.6. Note some completed items for 1.4.0 + + ROADMAP | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 4057a98f88947730bb0678f361278cc71cc33751 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Tue Dec 5 05:46:26 2006 +0200 + + cairo-perf-diff-files: Don't segfault reading cooked perf reports. + + Fixes cairo-perf-diff-files for non-raw cairo-perf reports. Similar + to the patch on the mailing list, only applied to the caller of + _cairo_stats_compute(): + + http://lists.freedesktop.org/archives/cairo/2006-December/008720.html + + perf/cairo-perf-diff-files.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a4f5463cdd5e2b088cd009de332db821ef0bd806 +Author: Mathieu Lacage <Mathieu.Lacage@sophia.inria.fr> +Date: Tue Dec 5 03:59:11 2006 +0200 + + bugfix: fix cairo-wideint.c uint64_t usage and const return qualifiers + + These patches were sent to the cairo mailing list by Mathieu Lacage + <Mathieu.Lacage@sophia.inria.fr>: + + http://lists.freedesktop.org/archives/cairo/2006-December/008741.html + + _cairo_uint_96by64_32x64_divrem(): fixes misuse of the uint64_t type + and cairo-wideint-private.h functions. + + http://lists.freedesktop.org/archives/cairo/2006-December/008742.html + + Remove const qualifiers from return types from cairo-wideint.c functions. + + http://lists.freedesktop.org/archives/cairo/2006-December/008747.html + + Fixes a typo in cairo-wideint-private.h: _cairo_uint128_to_int128_ + had an extra trailing underscore. + + src/cairo-wideint-private.h | 2 +- + src/cairo-wideint.c | 14 +++++++------- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit 94e086b7b9f4129bde3e32b7005e2a33788f334a +Author: Dan Amelang <dan@amelang.net> +Date: Sat Dec 2 11:24:35 2006 -0800 + + [configure] Fix --disable-some-floating-point to force value to 'no' if none given + + As suggested by Behdad here: + + http://lists.freedesktop.org/archives/cairo/2006-December/008700.html + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 392f27bf2b210aec6f511e5dba890d5f4c3b8802 +Author: Dan Amelang <dan@amelang.net> +Date: Sat Dec 2 11:02:36 2006 -0800 + + [configure] Add -a option to grep calls in AX_C_FLOAT_WORDS_BIGENDIAN + + This fixes bug #9124 reported here: + + https://bugs.freedesktop.org/show_bug.cgi?id=9124 + + acinclude.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3dbe468fd6071adfba5f608da788502f1840af36 +Author: Dan Amelang <dan@amelang.net> +Date: Fri Dec 1 14:12:16 2006 -0800 + + [perf] Provide watered-down implementations of getline and strndup for + building on non-GNU toolchains. + + perf/cairo-perf-diff-files.c | 58 +++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 55 insertions(+), 3 deletions(-) + +commit d5fcbfc29f2ae6eacdab1d00d9e7ce8d1cf39431 +Author: Dan Amelang <dan@amelang.net> +Date: Fri Dec 1 12:46:55 2006 -0800 + + Purge cairo-test of all calls to round() + + Although round() is in the C99 standard, it isn't available in all + toolchains on which cairo is compiled (VC++, for example). + + test/clip-operator.c | 4 ++-- + test/operator-clear.c | 4 ++-- + test/operator-source.c | 4 ++-- + test/unbounded-operator.c | 4 ++-- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit cb9a3c264086d0d11b74c504e5d3f891f929b00e +Author: Dan Amelang <dan@amelang.net> +Date: Fri Dec 1 12:41:55 2006 -0800 + + Add configure option --disable-some-floating-point + + See discussion here: http://lists.freedesktop.org/archives/cairo/2006-November/008602.html + + configure.in | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 7fb4e978735bd7c9f3cff970ac6757feff3e74bb +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 30 09:15:00 2006 -0800 + + BIBLIOGRAPHY: Add Joseph O'Rourke's book as recommended by Rafael Villar Burke + + BIBLIOGRAPHY | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 7fbe594d3d04137daca4d3c3a28057b71b03f33d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 30 08:43:27 2006 -0800 + + Add a textbook recommendation to the bibliography + + Thanks to Mathieu Lacage for the recommendation of: + + "Computational Geometry, Algorithms and Applications", M. de + Berg, M. van Kreveld, M. Overmars, M. Schwarzkopf + + BIBLIOGRAPHY | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +commit 170d35b034150b69717e52dd85f0f93c392d9f3c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 29 23:01:30 2006 -0800 + + pdiff: Add missing newlins at end of files. + + test/pdiff/CompareArgs.h | 2 +- + test/pdiff/LPyramid.cpp | 1 - + test/pdiff/LPyramid.h | 2 +- + test/pdiff/Metric.cpp | 2 +- + test/pdiff/Metric.h | 2 +- + test/pdiff/RGBAImage.h | 2 +- + 6 files changed, 5 insertions(+), 6 deletions(-) + +commit c863315285911d38b64b8429e279c5e55d0089b8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 21 14:19:35 2006 -0800 + + Hook up Makefiles for perceptualdiff. + + configure.in | 1 + + test/pdiff/Makefile.am | 14 ++++++++++++++ + 2 files changed, 15 insertions(+) + +commit 6e06b68452ec68b7ab227c54284f28a605512ce4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 21 14:19:55 2006 -0800 + + Remove all libtiff-related code by #ifdef + + test/pdiff/CompareArgs.cpp | 8 ++++++++ + test/pdiff/RGBAImage.cpp | 3 +++ + 2 files changed, 11 insertions(+) + +commit 2b92556abe440e9834174aed7395e2827f62897c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 29 22:55:00 2006 -0800 + + Use uint32_t instead of the non-standard uint32 + + test/pdiff/RGBAImage.cpp | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 812fd53499d308ff881751e57c1e3287498ddd0f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 21 12:15:16 2006 -0800 + + Add perceptualdiff program totest/pdiff. + + The perceptualdiff program was written by Hector Yee with contributions + from Scott Corley and Mick Weiss. It is hosted at http://pdiff.sourceforge.net + The source code added here was obtained by: + + svn co https://svn.sourceforge.net/svnroot/pdiff/trunk pdiff + + which gave revision 22 of the source code. + + The perceptualdiff program is available under the terms of the GNU GPL, + so I've added a note to COPYING about this program, (and the fact that + it is auxiliary only, and does not affect the license of the implementation + of cairo itself). + + COPYING | 21 ++- + test/pdiff/CMakeLists.txt | 55 +++++++ + test/pdiff/CompareArgs.cpp | 128 ++++++++++++++++ + test/pdiff/CompareArgs.h | 44 ++++++ + test/pdiff/LPyramid.cpp | 88 +++++++++++ + test/pdiff/LPyramid.h | 38 +++++ + test/pdiff/Metric.cpp | 316 +++++++++++++++++++++++++++++++++++++++ + test/pdiff/Metric.h | 26 ++++ + test/pdiff/PerceptualDiff.cpp | 45 ++++++ + test/pdiff/README.txt | 45 ++++++ + test/pdiff/RGBAImage.cpp | 141 ++++++++++++++++++ + test/pdiff/RGBAImage.h | 57 +++++++ + test/pdiff/gpl.txt | 340 ++++++++++++++++++++++++++++++++++++++++++ + 13 files changed, 1341 insertions(+), 3 deletions(-) + +commit d9fd942e4774aa29967f908001b62dbc987d2f66 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 29 17:18:50 2006 -0800 + + Add an initial BIBLIOGRAPHY for cairo + + BIBLIOGRAPHY | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 70 insertions(+) + +commit 8f08daade0430bf965050a81e654aac2a2375b07 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 29 17:15:29 2006 -0800 + + RELEASING: Fix typo + + RELEASING | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit facffb7ea3e03d131a79486b80d4efc58c303b87 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 28 19:41:52 2006 -0500 + + [configure] Remove the pkg-config minimum version requirement + + It was added in commit 157663e1fdf120a71c6cc8222b88d2915a5a73eb because there + was a serious bug in the pkg.m4 file from pkg-config 0.18. However, it was + fixed two days later. So, instead of requireing 0.18.1 or greater which is + not available on Nokia 770 SDK, we just ignore the broken pkg-config 0.18. + The problem only happens if one runs autogen.sh with against a broken + pkg-config. Configuring tarballs is not affected. + + configure.in | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 72a4a9834626ddd05c57c6b3f59e936969f0eee9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Nov 27 13:23:13 2006 -0500 + + [test|perf|boilerplate/Makefile.am] Add -I$(top_builddir)/src to INCLUDES + needed to find cairo-features.h when building out of tree. + + boilerplate/Makefile.am | 1 + + perf/Makefile.am | 1 + + test/Makefile.am | 1 + + 3 files changed, 3 insertions(+) + +commit 9c3b161c7067d8eda7f8d1cfb36ca285e4e7fa35 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 19:31:56 2006 -0800 + + Bump version to 1.3.5 after making 1.3.4 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 143c56cb12ee5d0b0fbc5e4039dd4fc88764254d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 19:15:31 2006 -0800 + + Increment cairo version to 1.3.4 + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9dd52a337082cebbab2224e3a09702ada8f8e87 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 19:15:00 2006 -0800 + + NEWS: Add notes for 1.3.4 snapshot + + NEWS | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 152 insertions(+) + +commit 3329abba391ebd502ba74b00ff02b7902a39945a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 19:11:51 2006 -0800 + + Add Daniel Amelang and Joonas Pihlaja to the AUTHORS file + + AUTHORS | 2 ++ + 1 file changed, 2 insertions(+) + +commit a8f6d27fba582cc8e935676d26c703fa7b253822 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 18:42:48 2006 -0800 + + Add some missing cairo_private decorators + + src/cairo-freelist-private.h | 12 +++++++----- + src/cairo-skiplist-private.h | 14 ++++++++------ + src/cairoint.h | 4 ++-- + 3 files changed, 17 insertions(+), 13 deletions(-) + +commit fac3684e686a259658151dac13907fa69f43f727 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Nov 22 08:30:28 2006 +0200 + + perf: new-tessellator: Deferred trapezoid generation (first try) + + src/Makefile.am | 2 + + src/cairo-bentley-ottmann.c | 163 +++++++++++++++++++++++++++++++++++++------ + src/cairo-freelist-private.h | 71 +++++++++++++++++++ + src/cairo-freelist.c | 72 +++++++++++++++++++ + 4 files changed, 285 insertions(+), 23 deletions(-) + +commit 6bd72ce74aba4a576e5aa76a5c92bd5557ae97f1 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Nov 20 04:19:17 2006 +0200 + + Sort pointers instead of cairo_bo_events in the tessellator. + + We were spending a lot of time in memcpy. + + src/cairo-bentley-ottmann.c | 54 ++++++++++++++++++++++++++++----------------- + 1 file changed, 34 insertions(+), 20 deletions(-) + +commit b177573b729401117a061cd6f07743fa81c01724 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Nov 20 03:56:07 2006 +0200 + + Make the skip list check for uniqueness. + + This patch removes a redundant call to skip_list_find() + that was being used to detect duplicate intersection events. + Instead, skip_list_insert() now takes an additional parameter + letting it know what to do with duplicates. + + src/cairo-bentley-ottmann.c | 12 ++++-------- + src/cairo-skiplist-private.h | 8 +++++--- + src/cairo-skiplist.c | 25 +++++++++++++++---------- + 3 files changed, 24 insertions(+), 21 deletions(-) + +commit 8bec0bac56785434f5e5860cf5f3560cac82ebb2 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Nov 20 03:45:26 2006 +0200 + + Malloc less using a free list of nodes. + + src/cairo-skiplist-private.h | 1 + + src/cairo-skiplist.c | 45 ++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 38 insertions(+), 8 deletions(-) + +commit de0e327b3d9aec50d970d8cfc881fb3949df59cc +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Mon Nov 20 03:14:20 2006 +0200 + + Tweak comparators. + + src/cairo-bentley-ottmann.c | 60 ++++++++++++++++++++++----------------------- + 1 file changed, 29 insertions(+), 31 deletions(-) + +commit 67359d7a58c14851936345417833b1e610987c19 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Nov 18 14:59:23 2006 +0200 + + Separate start and stop events from intersections (first try.) + + Don't use the skip list for start and stop events, but presort + those first. + + src/cairo-bentley-ottmann.c | 119 +++++++++++++++++++++++++++++++++++-------- + src/cairo-skiplist-private.h | 7 +++ + src/cairo-skiplist.c | 10 ++++ + 3 files changed, 114 insertions(+), 22 deletions(-) + +commit 97f02dca5d97c9ab815abf881525542ba86cbb11 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Nov 18 01:08:56 2006 +0200 + + Avoid a skip-list lookup when deactivating edges. + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 99f8a5313d336a2779689122feef03b874ed930e +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Sat Nov 18 01:01:04 2006 +0200 + + Special cases for skip list comparators. + + src/cairo-bentley-ottmann.c | 39 +++++++++++++++++++++++++++++++++++++-- + 1 file changed, 37 insertions(+), 2 deletions(-) + +commit fd8cd39cda7bfde429d840ffd7d5c78ac3045505 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Nov 17 12:24:44 2006 +0200 + + Use an LFSR instead of random(). + + src/cairo-skiplist.c | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 188 insertions(+), 1 deletion(-) + +commit d957e59744ba6fc482d3ddbce041877e703c0489 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Nov 15 19:58:54 2006 +0200 + + Replace the 128 bit divrem by a 96/64 bit one. + + src/cairo-bentley-ottmann.c | 78 ++++++++++++++++++++++++--------------------- + 1 file changed, 42 insertions(+), 36 deletions(-) + +commit 1da14262ea059836ae63b875c987fdb5c526db83 +Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Nov 15 19:57:04 2006 +0200 + + A 96 by 64 bit divrem that produces a 32 bit quotient and 64 bit remainder. + + src/cairo-wideint-private.h | 8 +++ + src/cairo-wideint.c | 152 ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 160 insertions(+) + +commit 762bd1330d5e3148ddd60949866227cb75b782d6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 22 17:28:00 2006 -0700 + + Make event_queue_insert ignore duplicate intersection events (not duplicate start/stop events) + + This fixes the failures of the new tessellator with the 3 tests: + bitmap-font, rectangle-rounding-error, and close-path + The problem was that identical edges from separate polygons + were not being added to the event queue, (because of a check + that was actually only intended to prevent an intersection + event from being scheduled multiple times). + + src/cairo-bentley-ottmann.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 4cd871b6f371e86c252c2fa8d8af481d822a1dec +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 20 10:47:58 2006 -0700 + + Switch from old tessellator to new tessellator + + src/Makefile.am | 3 +++ + src/cairo-path-fill.c | 6 +++--- + src/cairo-path-stroke.c | 2 +- + src/cairo-pen.c | 2 +- + src/cairo-traps.c | 7 +------ + src/cairoint.h | 10 ++++++++++ + 6 files changed, 19 insertions(+), 11 deletions(-) + +commit 0f7c488906128557807ca98aed5c442abf0a0b75 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 20 10:47:01 2006 -0700 + + Adapt new tessellator to match the interface provided by the old tessellator. + + src/cairo-bentley-ottmann.c | 163 +++++++++++++++++++++++++++++++------------- + 1 file changed, 114 insertions(+), 49 deletions(-) + +commit 8921f733995bc003c6977fd071f0be9e346e0f79 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 20 10:41:42 2006 -0700 + + Add new tessellator (unused) in cairo-bentley-ottmann.c + + This is the implementation as it cooked in the new-tessellator branch + available from: + + git://people.freedesktop.org/~cworth/cairo + + The file here comes from commit eee4faf79900be2c5fda1fddd49737681a9e37d6 in + that branch. It's sitting here not hooked up to anything in cairo yet, + and still with a main function with test cases, etc. + + src/cairo-bentley-ottmann.c | 1383 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 1383 insertions(+) + +commit c2509f8a721ec489e1b44fa8a68be165363787a7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 20 10:27:35 2006 -0700 + + Add skip list implementation (many thanks to Keith Packard) + + The files here are copied directly from the standalone skiplist module + available from: + + git clone git://cworth.org/~cworth/skiplist + + In particular the files come from the double branch and the following + commit on that branch: + + 8b5a439c68e220cf1514d9b3141a1dbdce8af585 + + Also of interest is the original skiplist module hosted by Keith Packard + that is the original implementation on which these files were based. + Since the cworth/skiplist branched off of keithp's, Keith has also + now implemented a doubly-linked variant which might be interesting for + further simplification of the code. See: + + git clone git://keithp.com/git/skiplist + + and the double-link branch there. + + src/cairo-skiplist-private.h | 87 ++++++++++++++++ + src/cairo-skiplist.c | 238 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 325 insertions(+) + +commit 02804773e7ef521adfbd26f90f303879198acde5 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 16:52:18 2006 -0800 + + give the big-trap test the XFAIL treatment. + + We'll need to rewrite this test (and the way cairo is compiled for + testing) before it can exercise the bug of interest. In the + meantime, let's just give it an "expected failure" status. + + test/Makefile.am | 1 + + test/big-trap.c | 36 +++++++++++++++++++++++++++++++++++- + 2 files changed, 36 insertions(+), 1 deletion(-) + +commit fdbb820ece5e6ab970cf6a9b756eebf7283c0597 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 22 16:43:45 2006 -0800 + + test: Use round to pass only integers to cairo_show_glyphs (in 3 more tests) + + This is the same fix as in the recent commit (166dffc96aa26b21f87f12af22b11630583cc85b) + but for the same idiom that appears in the operator-clear, + operator-source, and unbounded-operator tests. This fixes + the failures that were introduced by the recent switch to + _cairo_lround. + + test/operator-clear.c | 4 ++-- + test/operator-source.c | 4 ++-- + test/unbounded-operator.c | 4 ++-- + 3 files changed, 6 insertions(+), 6 deletions(-) + +commit 11d21dbaa3604951f73b641e4d88723696157a8e +Author: Dan Amelang <dan@amelang.net> +Date: Tue Nov 21 14:50:29 2006 -0800 + + Change _cairo_matrix_to_pixman_matrix to use a pixman_transform_t as the template, thus avoiding a forced memcpy + + src/cairo-matrix.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 8a5e296239d1cac705c3c397ab1fd7f7f2ff8d58 +Author: Dan Amelang <dan@amelang.net> +Date: Tue Nov 21 12:14:05 2006 -0800 + + Optimize _cairo_matrix_to_pixman_matrix for the common case of an identity matrix + + src/cairo-matrix.c | 35 ++++++++++++++++++++++++----------- + 1 file changed, 24 insertions(+), 11 deletions(-) + +commit b7cd46ddc2a2523b4d33b22e07cdbdc09b90fa7d +Author: Dan Amelang <dan@amelang.net> +Date: Mon Nov 20 14:31:28 2006 -0800 + + Add and incorporate _cairo_gstate_transform_glyphs_to_backend + + After changing _cairo_gstate_show_glyphs and _cairo_gstate_glyph_path to use + this function, we see a significant speedup due to the elimination of redundant + FP calculations. + + src/cairo-gstate.c | 92 ++++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 72 insertions(+), 20 deletions(-) + +commit 6cfb4a01e005cb0f4f797ff9aa02e80b3d755a9e +Author: Dan Amelang <dan@amelang.net> +Date: Mon Nov 20 14:08:46 2006 -0800 + + Refactor _cairo_matrix_is_integer_translation + + Now that we have _cairo_matrix_is_translation, we can change + _cairo_matrix_is_integer_translation to use it and thus reduce code + duplication. + + src/cairo-matrix.c | 42 +++++++++++++++++++----------------------- + 1 file changed, 19 insertions(+), 23 deletions(-) + +commit ca79307bdf9bc8042c9afd570bf10d605d3dfc1e +Author: Dan Amelang <dan@amelang.net> +Date: Mon Nov 20 10:42:50 2006 -0800 + + Add _cairo_matrix_is_translation + + src/cairo-matrix.c | 7 +++++++ + src/cairoint.h | 3 +++ + 2 files changed, 10 insertions(+) + +commit 57fba8d9b6915fe4b0f506ecb2ef18a9002de370 +Author: Daniel Amelang <dan@ereba.localdomain> +Date: Thu Nov 2 22:24:34 2006 -0800 + + Replace existing rounding code with _cairo_lround + + src/cairo-directfb-surface.c | 12 ++++++------ + src/cairo-ft-font.c | 4 ++-- + src/cairo-glitz-surface.c | 4 ++-- + src/cairo-scaled-font.c | 14 ++++++-------- + src/cairo-win32-font.c | 14 ++++++++------ + src/cairo-win32-surface.c | 7 ++++--- + src/cairo-xcb-surface.c | 28 ++++++++++++++-------------- + src/cairo-xlib-surface.c | 16 ++++++++-------- + 8 files changed, 50 insertions(+), 49 deletions(-) + +commit efb483c3a36f8168d52086c2f61162f5a0306c15 +Author: Daniel Amelang <dan@ereba.localdomain> +Date: Thu Nov 2 22:22:17 2006 -0800 + + Add _cairo_lround for much faster rounding + + This function uses the same "magic number" approach as _cairo_fixed_from_double. + + src/cairo.c | 25 +++++++++++++++++++++++++ + src/cairoint.h | 3 +++ + 2 files changed, 28 insertions(+) + +commit 166dffc96aa26b21f87f12af22b11630583cc85b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 21 20:57:01 2006 -0800 + + test/clip-operator: Use round to pass only integers to cairo_show_glyphs + + We were previously passing half-integer values here, which will + not be robust to changes in the rounding mode used for + cairo_show_glyphs. Use round() to match the rounding expected + by the reference images. + + test/clip-operator.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit eaaeba170d4c8313443412d88ee63311723b546d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 21 19:05:16 2006 -0500 + + [SVG] Fix compiler warning + + cairo-svg-surface.c:980: warning: 'id' might be used uninitialized in this function + + src/cairo-svg-surface.c | 112 ++++++++++++++++++++++++------------------------ + 1 file changed, 55 insertions(+), 57 deletions(-) + +commit c6fceb6721a26d801be0fa8ed3028f9dc8b7dfed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 21 17:52:58 2006 -0500 + + [PS] Rename n_glyphs to num_glyphs_unsigned + + Follow-up on my previous commit. Use a more descriptive name to avoid + confusion between n_glyphs and num_glyphs. + + src/cairo-ps-surface.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 75eeb889767468b374df5f0aa6fb7ba1fe6addf9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 21 12:10:36 2006 -0500 + + [PS] Eliminate compiler warnings about unoptimizable loops + + An innocient-looking loop like this: + + for (j = 0; j <= last; j++) + something(); + + cannot be optimized, because it may loop forever! + Imagine the case that last is MAXINT, the loop will never end. The correct + way to write it is: + + for (j = 0; j < last+1; j++) + something(); + + In this case, if last is MAXINT, the loop will never run. Not correct, but + better than looping forever. + + Still better would be to correctly handle the MAXINT case (even though it + doesn't make any sense to show MAXINT number of glyphs in one operation!) To + do that, we can use the fact that the input num_glyphs is a signed. If + there is one good thing about using signed int as input length, it's that you + can use an unsigned looping variable to avoid looping forever. That is + exactly what this patch does. + + src/cairo-ps-surface.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit 2dbb3dfd5f7e3d802f1c3c57b39f9d69b2b7ee1e +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Nov 21 14:43:43 2006 +0100 + + SVG: plug a memory leak + + What's the point in creating a memory stream if we overload the + pointer a couple of lines below ? + + src/cairo-svg-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 12f8718a3ed40e51e3edd678874d0a13e0eaaa74 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 21 00:10:03 2006 -0500 + + [SVG] Define enum _cairo_svg_version. + + src/cairo-svg.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9cffc56228498e9d9fb1c047e1e1f2daaabac698 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Nov 20 15:30:04 2006 -0800 + + [test] add big-trap test + + This test fills a single path (a trapezoid, even) that's larger than the + 16.16 precision used in pixman and other code. It leads to memory + scribbling and a crash. Note that there is no crash if a clip is not set. + + test/Makefile.am | 1 + + test/big-trap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+) + +commit a91c1e3ea6c5d338f2d7cd61db5eede5076de3b2 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 20 14:01:50 2006 -0800 + + Require librsvg 2.15.0 (was 2.14.0) for testing of SVG backend. + + Bryce Harrington saw off-by-one errors in output image size with + a 2.14.x version of librsvg. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e5bd21136cc43f569cdf424d2fd47d8298b53fb6 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 20 09:32:00 2006 -0800 + + Add const qualifier to cairo_path_t* parameter of cairo_append_path + + src/cairo-path-data-private.h | 4 ++-- + src/cairo-path-data.c | 4 ++-- + src/cairo.c | 4 ++-- + src/cairo.h | 4 ++-- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 10920c1326362b4fadfa01019223647c23351127 +Merge: 1ed3811 2928f6e +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Nov 18 12:59:12 2006 +0100 + + Merge branch 'svgprint' + +commit 1ed3811338a03068b7ce60f83fdd23fe01fec972 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 17 17:50:14 2006 -0800 + + perf: Add box_outline test case. + + This test shows that drawing a 100x100 single-pixel wide box outline is + currently 5 to 16 times slower when using the natural cairo_stroke() as + compared to a rather awkward cairo_fill() of two rectangles. + + [ # ] backend-content test-size min(ticks) min(ms) median(ms) stddev. iterations + [ 0] image-rgba box-outline-stroke-100 301321 0.218 0.219 0.39% 5 + [ 1] image-rgba box-outline-fill-100 18178 0.013 0.013 0.43% 5 + [ 0] xlib-rgba box-outline-stroke-100 379177 0.275 0.276 1.39% 6 + [ 1] xlib-rgba box-outline-fill-100 83355 0.060 0.060 0.17% 5 + + perf/Makefile.am | 1 + + perf/box-outline.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 2 ++ + 4 files changed, 97 insertions(+) + +commit a8faa0aef11abbd743ac9dc0b3127f9384325ee2 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 17 17:48:39 2006 -0800 + + cairo-perf: When iteration count is given on command-line, never execute fewer + + perf/cairo-perf.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit a97b697d8fbba4ffc5a45a256603232ab5a4e86d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 16 10:38:53 2006 -0800 + + ROADMAP: Set cairo 1.4 to early January for sake of Gnome 2.18 + + ROADMAP | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit db603d66476a7a8e6b7e52b907212d289f9fbdb4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 15 15:33:52 2006 -0800 + + Increment cairo version to 1.3.3 after 1.3.2 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 804e20b55d049a26fe4d96bb6d79890c65e43ab5 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 15 13:32:15 2006 -0800 + + Update cairo version and libtool version for 1.3.2 snapshot + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit c63fd9437b69bd2ce5d9e0f5784d13a05ac7b867 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 15 13:30:16 2006 -0800 + + NEWS: Add notes for 1.3.2 snapshot + + NEWS | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 179 insertions(+) + +commit a2d625edc62f35b4fbcefa6986918060f23fa1e6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Nov 2 19:52:03 2006 -0500 + + Add notes for the 1.2.6 release. + + NEWS | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 60 insertions(+) + +commit eeb1fa42aa44e1422dcfcdc6eb772b764c3ced58 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 14 14:44:03 2006 -0800 + + Add missing pattern-getters-ref.png to Makefile to avoid breaking distcheck target + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 28a9f1dd1407b0070a2ba1c780a6f763acb47810 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 14 14:35:35 2006 -0800 + + Fix get-clip test for surfaces not implementing set_clip_region + + test/get-clip.c | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +commit 7b86cf513e9f6bdf68e391f6df6f859eba05ba9c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 14 14:34:36 2006 -0800 + + Remove non-existent reference images from Makefile to avoid breaking distcheck target + + test/Makefile.am | 9 --------- + 1 file changed, 9 deletions(-) + +commit 0f7381b26eae74903754b4fb5c1220a8626df5f4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 14 13:27:52 2006 -0800 + + cairo-perf-diff: Run git-ls-tree from the correct directory + + Before this change, cairo-perf-diff would work correctly only + if run from the top-level directory, (and if run from any other + directory it would not pull in the latest boilerplate and perf + files). + + perf/cairo-perf-diff | 1 + + 1 file changed, 1 insertion(+) + +commit f3f6ea3092072defb958ee3a6b2271cb51b4a4ca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 14 17:58:09 2006 -0500 + + Fix typo. + + src/cairo-traps.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 29b01f93ca9b29699420700ea9e2817898afa3ca +Author: Carl Worth <cworth@cworth.org> +Date: Sat Nov 11 10:43:11 2006 -0800 + + Make miter join code use tessellate_convex_quad rather than tessellate_polygon + + This provides an additional 22-29% speedup on top of the previous + fix for stroking paths with many miter joins: + + image-rgba world_map-800 459.73 0.27% -> 356.80 0.32%: 1.29x speedup + ▎ + image-rgb world_map-800 458.83 0.37% -> 358.08 0.41%: 1.28x speedup + ▎ + xlib-rgba world_map-800 566.57 0.23% -> 463.84 0.31%: 1.22x speedup + ▎ + xlib-rgb world_map-800 562.31 0.64% -> 460.51 0.83%: 1.22x speedup + ▎ + + src/cairo-path-stroke.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +commit 3d53f623faed4aed2517e207d77a6da7e3b74fbd +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 12:56:32 2006 -0800 + + Make _cairo_stroker_add_sub_edge use tessellate_convex_quad rather than tessellate_polygon + + This gives a 17-20% speedup for stroking polygons with many + straight line segments as seen in the world_map test case: + + Speedups + ======== + image-rgba world_map-800 555.41 0.17% -> 460.69 0.20%: 1.21x speedup + ▎ + image-rgb world_map-800 554.91 0.25% -> 460.73 0.26%: 1.20x speedup + ▎ + xlib-rgb world_map-800 669.85 3.70% -> 570.31 0.24%: 1.17x speedup + ■+ xlib-rgba world_map-800 663.71 0.46% -> 567.74 0.19%: 1.17x speedup + ■+ + src/cairo-path-stroke.c | 31 ++++++------------------------- + 1 file changed, 6 insertions(+), 25 deletions(-) + +commit fefa7d9b993b1fc0759cfe1f8faff8dec9dc5c85 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 12:53:33 2006 -0800 + + Rewrite tessellate_rectangle as tessellate_convex_quad to make it more useful + + Currently there aren't even any users of this code, (they had + stopped using it when they realized what they really wanted + was tessellate_convex_quad). + + src/cairo-traps.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++------- + src/cairoint.h | 2 +- + 2 files changed, 112 insertions(+), 17 deletions(-) + +commit e324bbcbc6ca86a714aa91fe5cd010a4ce4f1753 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 12:37:01 2006 -0800 + + Add a status field to cairo_traps_t to enable less error checking + + src/cairo-traps.c | 148 ++++++++++++++++++++++++------------------------------ + src/cairoint.h | 2 + + 2 files changed, 67 insertions(+), 83 deletions(-) + +commit 74f5fe241e6ce424a7d56a0ae48ddad202b82248 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 13 14:44:07 2006 -0800 + + cairo-perf-diff: rsync only git-managed files from boilerplate/perf + + Previously, we were using rsync to recursively copy all files + from boilerplate and perf when doing the performance tests. This + had the fatal flaw that pre-built binaries would be hard coded to + link against the cairo library from $CAIRO_DIR with an absolute + path, (due to libtool rpath stuff). + + By only copying git-managed files, we only get source and the compiled + binaries (or libtool wrappers) will now be hard-coded to link against + the library under test. + + perf/cairo-perf-diff | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 2928f6eb5f5bd207f8f41a628ad95d6552aa8246 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Nov 12 20:49:34 2006 +0100 + + test/pixman-rotate.c: Don't issue a show_page, it's already done in cairo-test.c + + test/pixman-rotate.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 4f02395267dc0cccef231e548a914329dce2831f +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Nov 12 20:45:50 2006 +0100 + + Use SVG multipage capability. + + test/fallback-resolution.c | 33 +++------------------------------ + 1 file changed, 3 insertions(+), 30 deletions(-) + +commit ad6d3a8369569cefde4984c0102cacf56b159cc7 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Nov 12 20:45:10 2006 +0100 + + Add SVGPrint support. + + It's only activated when svg version >= 1.2. + Last page without a show page call is ignored if blank. + + src/cairo-svg-surface.c | 127 ++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 113 insertions(+), 14 deletions(-) + +commit 26b74049e79a6137e8556e1b3e5c3aedd780abb0 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 10:31:14 2006 -0800 + + cairo-perf-diff: Use rsync instead of cp to avoid some unnecessary rebuilding + + perf/cairo-perf-diff | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f1f189b81a24730b7c5b5761165ab30bb8310bca +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 10:20:49 2006 -0800 + + cairo-perf-diff: Separate old and new build directories + + With the fancy new, incremental cairo-perf-diff we don't want to keep + resetting the same working tree back and forth between the old and new + versions and rebuilding everything all over again. So use two different + build directories instead of one. + + This fixes the rebuild of the library itself, but the perf stuff is still + being rebuilt, (since it's being re-copied each time). + + perf/cairo-perf-diff | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit d9b697c46ceb4849436df162d0574b08856680bb +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 10:04:01 2006 -0800 + + cairo-perf-diff: Allow incremental refinement of performance results + + cairo-perf-diff now accepts a -f command-line option to force it to + re-generate performance results even if something exists in the cache + already. It also now uses raw mode and appends to the cached file + rather than rewriting the results. + + Finally, it also now allows a -- option on the command line and passes + all the subsequent command-line options to cairo-perf. This is handy for + limiting cairo-perf to run only on a subset of the tests of interest. + + perf/cairo-perf-diff | 50 +++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 41 insertions(+), 9 deletions(-) + +commit 439bf81e56955ea543a890d5e89622745598c8ea +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 10 10:00:31 2006 -0800 + + Fix broken size calculation for xrealloc + + Another one of those "untested code == broken code" situations. + + perf/cairo-perf-diff-files.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit f6b400a292759a7d603843afa6030ebb01349855 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 8 05:45:09 2006 -0800 + + perf: Add world-map performance test case. + + The map for this test case was originally demonstrated as a + performance problem in this mozilla bug report: + + A very slow SVG file with <path>s + https://bugzilla.mozilla.org/show_bug.cgi?id=332413 + + I obtained permission from the creator of the original file to + include the data here, (see comments in world-map.h for details). + + perf/Makefile.am | 2 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/world-map.c | 107 +++++++++++++++++++++++++++++ + perf/world-map.h | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 307 insertions(+) + +commit 2d927eaefa1188d11c056a055321763faf43573e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 8 05:40:17 2006 -0800 + + perf/Makefile.am: Add missing zrusin-another.h file to list + + perf/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0d1340f7169920c901a0f6d6f8ecb4529e57ada4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 8 05:39:06 2006 -0800 + + perf: Eliminate CAIRO_STATS_MIN_VALID_SAMPLES + + We don't need this at this deep level since callers can now + implement this limiting manually since stats.iterations is + now returned. Also, this was interfering with the -i option + to cairo-perf anyway. + + perf/cairo-perf.c | 7 ++----- + perf/cairo-stats.c | 7 +------ + perf/cairo-stats.h | 9 +-------- + 3 files changed, 4 insertions(+), 19 deletions(-) + +commit 6d5df0e3e2e9804cede77cfd0d3659bd2d36a918 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 13:06:01 2006 -0800 + + cairo-perf-diff-files: Add support for diffing "raw" files from "cairo-perf -r" + + perf/cairo-perf-diff-files.c | 161 ++++++++++++++++++++++++++++++++++--------- + 1 file changed, 128 insertions(+), 33 deletions(-) + +commit d1e1192090c56b5fa0794faae319cfaa88fc1788 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 12:59:57 2006 -0800 + + cairo-perf: Print ticks_per_ms value in raw mode so raw analysis tools can report times + + perf/cairo-perf.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 5393989272881f9128df3c4a3fc6bb2c08b06a1e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 12:57:48 2006 -0800 + + perf: Move statistics code into new cairo-stats.h for sharing + + perf/Makefile.am | 6 ++- + perf/cairo-perf.c | 106 +++------------------------------------------------- + perf/cairo-perf.h | 6 ++- + perf/cairo-stats.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-stats.h | 51 +++++++++++++++++++++++++ + 5 files changed, 174 insertions(+), 103 deletions(-) + +commit 7673e3ac3fc36042efcbccc3836d8bc81bdb94b3 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 12:50:52 2006 -0800 + + boilerplate: Add xrealloc function + + boilerplate/xmalloc.c | 12 ++++++++++++ + boilerplate/xmalloc.h | 3 +++ + 2 files changed, 15 insertions(+) + +commit 1e4515c548bd2a1440c630d779a948e5b02890e9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Nov 7 13:15:28 2006 -0800 + + [win32] implement EXTEND_REPEAT in composite when possible + + Optimizes EXTEND_REPEAT, especially when DDBs are in use through the + use of PatBlt or manually expanding out the repeated blits (up to a + limit). Will still fall back to fallback code as necessary. + + src/cairo-win32-surface.c | 386 ++++++++++++++++++++++++++++++++-------------- + 1 file changed, 266 insertions(+), 120 deletions(-) + +commit 6db219c3a16bbbe736653946ea5a4758656a9cd9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Nov 3 10:04:28 2006 -0800 + + [win32] clean up win32_surface_composite + + Make sure that all operations are correct (the operations chosen + are listed in cairo-win32-surface.c); in particular, deal with the extra + byte present in FORMAT_RGB24 surfaces correctly. + + Also adds support for calling StretchDIBits to draw RGB24 + cairo_image_surfaces directly. + + src/Makefile.win32 | 3 +- + src/cairo-win32-private.h | 5 +- + src/cairo-win32-surface.c | 318 ++++++++++++++++++++++++++++++---------------- + src/cairoint.h | 5 + + test/Makefile.win32 | 1 - + 5 files changed, 218 insertions(+), 114 deletions(-) + +commit 3e002a474b64c83f8768ba8918209eca9d7599a3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Nov 3 09:47:31 2006 -0800 + + [win32] Update pixman MMX code to work with MSVC + + Patch from Tor Lillqvist. + + pixman/src/Makefile.win32 | 3 +- + pixman/src/fbmmx.c | 187 ++++++++++++++++++++++++++++------------------ + pixman/src/fbpict.c | 57 ++++++++++++++ + 3 files changed, 174 insertions(+), 73 deletions(-) + +commit fc87d4148131ce01f645aec12a5e1b6d6b55d337 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Nov 7 15:07:33 2006 -0500 + + [configure] Err if a suitable pkg-config is not found + + configure.in | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit fc584e1fbb87752f6123fbc02c1c27e538dd13f0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 01:42:21 2006 -0800 + + Rewrite _cairo_matrix_transform_bounding_box to actually accept a box not a rectangle + + It turns out that all of the callers want a box anyway, so this + simplfies the code in addition to being more honest to the name. + + (For those new to the convention, a "box" is an (x1,y2),(x2,y2) + pair while a "rectangle" is an (x,y),(width,height) pair.) + + src/cairo-gstate.c | 9 ++------- + src/cairo-matrix.c | 39 +++++++++++++++++---------------------- + src/cairo-pattern.c | 19 ++++++++----------- + src/cairoint.h | 4 ++-- + 4 files changed, 29 insertions(+), 42 deletions(-) + +commit 777eaf326a56bb3b2ec3e6408309336d2bf6754f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 01:33:40 2006 -0800 + + test/Makefile.am: Fix typo in EXTRA_DIST that was breaking distcheck + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0564b5074c431c3e723d906769b5383eddae659d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Nov 7 01:29:38 2006 -0800 + + cairo-perf: Add command line options for test cases to run, listing tests, and new raw mode. + + perf/cairo-perf.c | 163 +++++++++++++++++++++++++++++++++++++++++++----------- + perf/cairo-perf.h | 7 +++ + 2 files changed, 139 insertions(+), 31 deletions(-) + +commit 49b72f004d4de50de86f7f350ce01aa5b48f35ae +Author: Carl Worth <cworth@cworth.org> +Date: Mon Nov 6 23:56:19 2006 -0800 + + Add zrusin-another test cases (tessellate and fill). + + This new test case is the 0th polygon polygon from Zack Rusin's + recent cairorender program as made avaialable here: + + http://ktown.kde.org/~zrusin/examples/cairorender.tar.bz2 + + This polygon contains about 1000 coordinates and looks like a + hand-drawn version of the word another. + + perf/Makefile.am | 3 +- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/zrusin-another.h | 668 ++++++++++++++++++++++++++++++++++++++++++++++++++ + perf/zrusin.c | 90 +++++++ + 5 files changed, 762 insertions(+), 1 deletion(-) + +commit 52eb7134bd22c648a10e2b9b8c5d1409de309887 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 3 15:32:57 2006 -0800 + + cairo-perf-diff: Use two-part hash to avoid stale data when perf suite changes. + + The perf tree's sha1 is now in the cache file name, so that + if the performance suite itself ever changes then new data + will be generated rather than using stale stuff from the cache. + + Also, we now use the src tree's sha1 rather than the commit's + so that commits that don't change the src directory are also + treated as identical, (which they really should be as far as + performance of the library itself is concerned). + + perf/cairo-perf-diff | 18 +++++++++++++++--- + perf/cairo-perf.c | 2 +- + 2 files changed, 16 insertions(+), 4 deletions(-) + +commit e760d0927ee5b732392284fc19fda225f137f909 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 3 14:58:30 2006 -0800 + + Don't rely on NQUARTZ or OS2 surface types unless they exist. + + This allows the cairo-perf stuff to build on older checkouts, + (such as 1.2.4), so that we can usefully do things like: + + cairo-perf-diff 1.2.4 HEAD + + perf/cairo-perf.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4cd50965a1935bf934f39f9e35b7d1a055ae7e16 +Author: Dan Amelang <dan@amelang.net> +Date: Sun Oct 29 21:31:23 2006 -0800 + + Change _cairo_fixed_from_double to use the "magic number" technique + + See long thread here: + http://lists.freedesktop.org/archives/cairo/2006-October/008285.html + + This patch provides a 3x performance improvement (on x86) for the + conversion of floating-point to fixed-point values as measured by + the recent pattern_create_radial performance test: + + image-rgba pattern_create_radial-16 8.98 3.36% -> 2.97 1.03%: 3.38x speedup + ██■+ image-rgb pattern_create_radial-16 8.94 3.21% -> 2.97 0.18%: 3.36x speedup + ██■+ xlib-rgb pattern_create_radial-16 9.55 3.17% -> 3.64 0.51%: 2.93x speedup + █▉ + xlib-rgba pattern_create_radial-16 9.63 3.53% -> 3.69 0.66%: 2.91x speedup + █▉ + + src/cairo-fixed.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 47 insertions(+), 1 deletion(-) + +commit 5376e474255b80d084dd250cab6ea5c14220a3f3 +Author: Dan Amelang <dan@amelang.net> +Date: Sun Oct 29 21:30:08 2006 -0800 + + Add autoconf macro AX_C_FLOAT_WORDS_BIGENDIAN + + The symbol that this macro defines (FLOAT_WORDS_BIGENDIAN) can be used + to make double arithmetic tricks portable. + + acinclude.m4 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 1 + + 2 files changed, 66 insertions(+) + +commit 941b517024c79dfd157337565477b0a440924702 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 3 13:26:48 2006 -0800 + + cairo-perf-diff: Build and run latest cairo-perf program rather than whatever was in the old checkout + + perf/cairo-perf-diff | 5 +++++ + 1 file changed, 5 insertions(+) + +commit e2ede57fbb8d729f066bc592e33bae23a11fa4d9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 3 12:40:09 2006 -0800 + + cairo-perf-diff: Fix to still function if run from the top-level directory containing .git + + perf/cairo-perf-diff | 3 +++ + 1 file changed, 3 insertions(+) + +commit 8e74f9f945f4a498ec64930ddd46cc89129812bc +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Mon Nov 6 12:21:25 2006 +0800 + + glitz: fix a memory leak in _cairo_glitz_surface_composite_trapezoids. + + src/cairo-glitz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit e759959fd6a59d439fe5fe147326401619cb939b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Nov 2 21:15:41 2006 -0500 + + [Makefile.am] Pass tag message to git-tag in release-publish + + (cherry picked from 7cac87c8041f63fac2e0a2f5a29e36ed80d8d51a commit) + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 91ffb36faa121ccfaa57d8857c239dd3a6bb3e95 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Nov 2 21:13:49 2006 -0500 + + [Makefile.am] Minor fixes in release-publish output + + (cherry picked from 953332d128120e7c4f4197390984be11a80a368b commit) + + Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 16bc72feafac4f78552cd003680ae7133562b6f4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 2 17:16:52 2006 -0800 + + Increment CAIRO_VERSION to 1.3.1 now that a 1.2.6 release exists + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5500c59b9be9f7f32e8b3d0d9b5fa775e50fbe98 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 2 12:27:17 2006 -0800 + + Remove typo (mean vs median) + + This didn't end up making a difference in practice since the + median is assigned again later on. + + perf/cairo-perf.c | 1 - + 1 file changed, 1 deletion(-) + +commit b717e987776d60cbc37434f7c918ad438e29b1a4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Nov 2 12:21:26 2006 -0800 + + cairo-perf: Change outlier elimination and report minimum times. + + Instead of just discarding the worst 15% of the results, we now + do IQR-based detection and elimination of outliers. Also, instead + of reporting mean times we now report minimum and median times. + We still do compute the mean and standard deviation for the + detection of when results seem stable for early bailout. And we + do still report the standard deviation. + + A statistician might complain that it looks funny to report the + median and the standard deviation together, (instead of median + and average absolute deviation from the median, say), but I liked + the standard deviation since it is always larger, so it might + ensure better separatation if we use it to determine when two + sets of results are sufficiently different to be interesting. + + perf/cairo-perf-diff-files.c | 43 ++++++++++----------- + perf/cairo-perf.c | 92 +++++++++++++++++++++++++++++++++++--------- + 2 files changed, 94 insertions(+), 41 deletions(-) + +commit d2d0d11bdefa012d65364b24477bb86c8475ca86 +Author: Dan Amelang <dan@amelang.net> +Date: Tue Oct 31 23:47:35 2006 -0800 + + Add new perf test "pattern_create_radial" + + This test is really just for hammering the double to fixed-point conversion + (in _cairo_fixed_from_double) that happens as doubles from API calls gets + translated into internal cairo fixed-point numbers. + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/pattern_create_radial.c | 98 ++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 101 insertions(+) + +commit a618fd2cf90575ac7695b614328f1123db86b372 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Oct 27 00:51:24 2006 -0700 + + cairo-perf-diff: Simplify git usage and just run cairo-perf that gets built with cairo revision + + Many thanks to Josh Triplett for help with theses fixes: + + 1. Simplify the usage of git to eliminate the fragile and nasty + stuff we were doing previously, (such as manually symlinking + things under .git rather than just using git-clone -s). + + 2. Don't try running latest cairo-perf with LD_LIBRARY_PATH + pointing to built cairo version. Apparently stupid libtool + and its use of rpath is foiling us here. Instead just run + whatever cairo-perf gets built as part of the source that + gets checked out. + + This second point means that cairo-perf-diff won't yet be useful + for comparing the performance of old cairo revisions that pre-date + cairo-perf. I've since been reasing and we might be able to use + --disable-rpath to the configure script to get what we want. + + perf/cairo-perf-diff | 22 ++++++---------------- + 1 file changed, 6 insertions(+), 16 deletions(-) + +commit 504ea250f7c052525cf28536c767d4f9f57e7cc9 +Author: Jamey Sharp <jamey@minilop.net> +Date: Sun Oct 29 13:48:14 2006 -0800 + + XCB/perf: implement boilerplate_xcb_synchronize for fair performance tests. + + It sure was nice when some tests showed XCB to be 1300 times faster + than Xlib though... + + boilerplate/cairo-boilerplate.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit bc983700c463671128822e2eb9f74cbe834a1c1b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Oct 29 14:49:06 2006 -0500 + + [autogen.sh] Make sed script portable + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7442b4086667ed67d9086e817af3d3c081a2b6f1 +Author: Jamey Sharp <jamey@minilop.net> +Date: Sun Oct 29 11:18:09 2006 -0800 + + perf: cairo-perf-diff-files.c should generate cairo-perf-diff-files + + ... rather than overwriting the new cairo-perf-diff script, which + should (by the way) be included in dist tarballs. + + perf/Makefile.am | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit b0f5af3b473e5d58e0fc07a38948c83897e1b1fc +Author: Jamey Sharp <jamey@minilop.net> +Date: Sun Oct 29 10:59:30 2006 -0800 + + Add clip-push-group to .gitignore. + + test/.gitignore | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a34ba73136a1b34c413eff78a44c28a6f1ba80f6 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Oct 27 23:50:57 2006 +0200 + + [beos] Allow a pixel error of 1 for BeOS tests + + That allows us to delete the BeOS-specific reference images. + + boilerplate/cairo-boilerplate.c | 9 ++++++--- + test/mask-beos-bitmap-argb32-ref.png | Bin 87641 -> 0 bytes + test/mask-beos-bitmap-rgb24-ref.png | Bin 71028 -> 0 bytes + test/mask-beos-rgb24-ref.png | Bin 71028 -> 0 bytes + test/set-source-beos-bitmap-rgb24-ref.png | Bin 124 -> 0 bytes + test/set-source-beos-rgb24-ref.png | Bin 124 -> 0 bytes + test/trap-clip-beos-bitmap-rgb24-ref.png | Bin 63088 -> 0 bytes + test/trap-clip-beos-rgb24-ref.png | Bin 63088 -> 0 bytes + 8 files changed, 6 insertions(+), 3 deletions(-) + +commit 2ec0237051cd4f756a8205cb9ecafc7bfe285a06 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Oct 27 23:47:15 2006 +0200 + + [beos] make tests compile again + + boilerplate/cairo-test-beos.cpp | 44 ++++++++++++++++++++++++++++++----------- + boilerplate/cairo-test-beos.h | 16 +++++++++++---- + 2 files changed, 45 insertions(+), 15 deletions(-) + +commit e29aea745aa2c23ac9d60612813d5e415e1f8e57 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Fri Oct 27 12:07:26 2006 +0200 + + [win32] Add parentheses around & operator + + This fixes a GCC warning. Also, it fixes a bug: The precedence + of & is not what you might expect. + + src/cairo-win32-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 61bf9b009b47312c20d54198790542cd20fc5576 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 26 15:52:21 2006 -0700 + + Make xlib and xcb backends tolerant of single-bit errors in the test suite output. + + boilerplate/cairo-boilerplate.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 05a259d49368fb128b99d99f3776f8783df9d4ed +Author: Christian Biesinger <cbiesinger@web.de> +Date: Thu Oct 26 21:40:35 2006 +0200 + + [beos] Fix build error + + Rename cairo_rectangle_fixed_t to cairo_rectangle_int16_t + as needed per commit 746f66c3fce6de39ac9afa7be8bcf8f74c750e85. + + src/cairo-beos-surface.cpp | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit acac0c19667d2166e2a26b07445fa78640dc8a33 +Author: Ian Osgood <iano@quirkster.com> +Date: Thu Oct 26 09:56:13 2006 -0700 + + don't squish tiny images in test/index.html + + test/make-html.pl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bd0f9919086f2978eb1df22cd5c1fffb7621d33f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Oct 27 00:00:24 2006 +0930 + + Add OpenType/CFF Subsetting + + src/Makefile.am | 1 + + src/cairo-cff-subset.c | 1452 +++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 107 +++ + src/cairo-scaled-font-subsets-private.h | 40 + + src/cairo-truetype-subset-private.h | 1 + + 5 files changed, 1601 insertions(+) + +commit e4c3da80806804574c99170b1df3cb92f6493283 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Oct 26 23:41:57 2006 +0930 + + PS: Use xshow/yshow/xyshow for strings of glyphs + + Optimize show glyphs by looking for strings of glyphs from the same subset + and use the xyshow operator to display. As a further optimization the xshow + and yshow operators are used for displaying horizontal and vertical text. + + src/cairo-ps-surface.c | 149 +++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 121 insertions(+), 28 deletions(-) + +commit e1ded5b1e042c8cefa7f136228d5a63a7bdf84b5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 25 21:40:08 2006 -0400 + + [PDF] Set CTM before path construction + + The previous order is undefined according to the PDF spec. The resulting PDF + was being misrendered using OS X Preview viewer. This was reported in this + thread: + + http://lists.freedesktop.org/archives/cairo/2006-October/008271.html + + src/cairo-pdf-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit a9f51c29733a5124e0d04d8dcc00d55ff3aeb05a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 25 17:15:22 2006 -0700 + + Add new cairo-perf-diff for finding the performance difference between any 2 revisions. + + The old cairo-perf-diff is now named cairo-perf-diff-files, but + the new one calls out to it and can still be used in an identical + way. + + The new cairo-perf-diff can also be used to see what the performance + impact of a single commit is like so: + + cairo-perf-diff HEAD + + or between two commits: + + cairo-perf-diff 1.2.4 HEAD + + The script is careful to always run the latest cairo-perf program + even when testing old versions of the library. Also, the output + from any given performance run is cached so it gets less painful + to run as the cache gets primed (the cache is in .perf next to + .git). + + The script is still a bit fragile in spots. In particular it depends + on cairo-perf being built in advance but doesn't do anythin to ensure + that happens. + + perf/.gitignore | 2 +- + perf/Makefile.am | 7 +- + perf/cairo-perf-diff | 106 ++++++++++ + perf/cairo-perf-diff-files.c | 482 +++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf-diff.c | 482 ------------------------------------------- + 5 files changed, 594 insertions(+), 485 deletions(-) + +commit c7b9f84744cd3fe4a6c9dead1e128d91f9cfc3cb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 25 16:07:15 2006 -0400 + + Require automake 1.7 again + + We are not using the slash-in-SUBDIRS feature of automake 1.9 anymore, so bump + required version down. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f85aca4c3ff02a38b83da48b618e420b79b29c37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 25 16:06:42 2006 -0400 + + Make autogen.sh extract required versions from configure.in + + autogen.sh | 42 ++++++++++++++++++++++++++---------------- + configure.in | 19 +++++++++++-------- + 2 files changed, 37 insertions(+), 24 deletions(-) + +commit 838ff68cd5d866ca373af95f43afe0219fdd6159 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 25 15:44:03 2006 -0400 + + [perf] Remove SUBDIRS=../boilerplate and add explicit dependencies + + This is quite like what I just did in test/. We can now require an older + version of automake as we used to. + + perf/Makefile.am | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 02096f66f365c109ddf41432b9a818726d45cbae +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 25 12:51:35 2006 -0700 + + Fix typo + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7955fe63cc6bdb3a525535c7f052ea354cc7497c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 25 12:51:17 2006 -0700 + + Fix offset/extent bug in ps output for repeating source surface patterns + + The bug was exposed by the recent addition of the paint-repeat test. + The ps output was crashing various interpreters by using infinite + extents for repeating patterns. Fixing that was easy enough, but + the offset of the repeating pattern was still being lost. The fix + for both involved imitating the style of emit_surface_pattern as + it exists in cairo-pdf-surface.c, (though the details are quite + different due to differences in the models of PS and PDF). + + src/cairo-ps-surface.c | 84 ++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 57 insertions(+), 27 deletions(-) + +commit 76f816c765a19a4fcda0500b5495bb969d014958 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 25 10:44:53 2006 -0700 + + test/paint-repeat: Use offset larger than source surface for better stress testing + + test/paint-repeat.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 06d3786b2c76e05939bff1065a57db3059ccbc95 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 25 10:43:19 2006 -0700 + + Add new paint-repeat test + + I added this test originally to make it easier to debug + some recent bugs, (the test suite did have some repeating + in the checkered backgrounds, but with an offset of 0, + and then also in trap clip with an offset larger than the + surface itself). This test exercises repeating more directly. + + It also triggers a bug in the PostScript backend that I've + not yet investigated. So the test does fail currently. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/paint-repeat-ref.png | Bin 0 -> 145 bytes + test/paint-repeat.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 69 insertions(+) + +commit 7421e8af0ca3b5c80dd3c7b145c639196f6036a5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 25 15:28:36 2006 -0400 + + [test] Make sure tests are not relinked unnecessarily + + What was causing it was making all tests depend on all, to make sure + ../boilerplate is built first. I'm not making all tests depend on + ../boilerplate/libcairoboilerplate.la and ../src/libcairo.ls and added rules + to build those (by changing dir and making them). + + test/Makefile.am | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 7e9aad228971a81783e09edfef58c5165a3c932e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 25 10:32:37 2006 -0700 + + Fix repeating source surface patterns with xlib backend. + + This broke with the clone_similar optimization in + 8d7a02ed58e06584eb09575e6ca11d0a81094ab6 The optimization added an + interest rectangle to clone_similar, but with a repeating source + pattern, the interest rectangle might not intersect the extents of the + surface at all. + + The test suite caught this with the trap-clip case. + + The fix here is to clone the entire surface if the pattern has an + extend mode of REPEAT. + + src/cairo-pattern.c | 54 +++++++++++++++++++++++++++++++++-------------------- + src/cairoint.h | 10 ++++++++++ + 2 files changed, 44 insertions(+), 20 deletions(-) + +commit 804e5b58cd3a4032bfa1d0c8cccac92a70c3c635 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Wed Oct 25 13:29:06 2006 +0800 + + glitz: further fix for clone_similar. + + Don't try to get pixels outside image extent. The failure number of + tests cut down to 19 with this fix, not too bad;). + + src/cairo-glitz-surface.c | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +commit 69f740913d6841708831668ef2a3bf124f373031 +Author: Ian Osgood <iano@quirkster.com> +Date: Tue Oct 24 08:24:30 2006 -0700 + + bug: wrong xcb_copy_area param order + + src/cairo-xcb-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8381e53cc741af73fddebe61d9a0b28a8329c18b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 23 20:44:29 2006 -0700 + + 8711: Fix transformed source surface patterns with xlib backend. + + This broke with the clone_similar optimization in + 8d7a02ed58e06584eb09575e6ca11d0a81094ab6 + The optimization added an interest rectangle to clone_similar, + but the acquire_surface path was neglecting to transform its + rectangle by the pattern matrix. + + The test suite did catch this, but apparently we were too + distracted by the performance improvements to notice. Only + backends other than image that implemented clone_similar + would be affected by the bug, (which meant I only saw xlib + failures in my testing). + + This fixes bug #8711 + + src/cairo-pattern.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 670b3ce2432154cc0611a31c5b5e37c8a3ddf1f5 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 23 11:57:16 2006 -0700 + + test: Update reference images due to previous change to _cairo_color_compute_shorts + + The previous change was in b62710d4f8602203d848daf2d444865b611fff09 + We just forgot to update the reference images at the time so there + have been false failure results in the test suite until now. + + test/caps-joins-alpha-ref.png | Bin 2434 -> 2463 bytes + test/fill-and-stroke-alpha-add-ref.png | Bin 588 -> 591 bytes + test/fill-and-stroke-alpha-ref.png | Bin 532 -> 519 bytes + test/linear-gradient-ref.png | Bin 1023 -> 1021 bytes + test/mask-ref.png | Bin 87890 -> 87899 bytes + test/mask-rgb24-ref.png | Bin 70978 -> 71010 bytes + test/operator-source-ref.png | Bin 19726 -> 19763 bytes + test/operator-source-rgb24-ref.png | Bin 14701 -> 14666 bytes + test/paint-source-alpha-pdf-argb32-ref.png | Bin 475 -> 471 bytes + test/paint-source-alpha-ref.png | Bin 258 -> 256 bytes + test/paint-with-alpha-ref.png | Bin 268 -> 256 bytes + test/push-group-ref.png | Bin 2996 -> 3005 bytes + test/push-group-rgb24-ref.png | Bin 2840 -> 2849 bytes + test/set-source-ref.png | Bin 120 -> 120 bytes + test/set-source.c | 4 +--- + test/trap-clip-ref.png | Bin 71753 -> 71832 bytes + 16 files changed, 1 insertion(+), 3 deletions(-) + +commit 9e4a48557ee42f13c427adfd7e097942ef315006 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 23 23:17:06 2006 +0930 + + type1 fallback: ensure all functions perform correct status checking + + src/cairo-type1-fallback.c | 58 ++++++++++++++++++++++++++++++---------------- + 1 file changed, 38 insertions(+), 20 deletions(-) + +commit bd5d7c1fb2331c487c934c20f6067455e0a4ca3d +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Oct 22 20:08:07 2006 +0200 + + Don't return an uninitialized value if _cairo_output_stream_create fails + + src/cairo-type1-fallback.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 2313f69066152034ac977776bee88f0c77b76aca +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Oct 22 20:07:57 2006 +0200 + + Fix prototype warning by including cairo-test-directfb.h + + boilerplate/cairo-test-directfb.c | 1 + + 1 file changed, 1 insertion(+) + +commit 153f2d1cad171eba7b63d6ceefea2a26ffd8b532 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Oct 22 20:07:25 2006 +0200 + + Actually return a value from _cairo_type1_fallback_init_* + + src/cairo-type1-fallback.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit d6ebe07be214461b6d456ebdbdc5acfd432e0178 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Sun Oct 22 12:47:43 2006 +0200 + + Add missing ) in comment + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f29a1920b0447be9e0fe21afc2d3a3d03fd097fc +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sun Oct 22 12:31:40 2006 +0800 + + glitz: my previous changes in _cairo_glitz_surface_create_similar is + incorrect. + + src/cairo-glitz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1a90d28c3f70d6347746779354713c3de515f3c4 +Author: Ian Osgood <iano@quirkster.com> +Date: Sat Oct 21 11:57:03 2006 -0700 + + XCB: make create_internal match Xlib + + minus font options and buggy repeat + plus some cleanup and removal of more Xlib diffs + + src/cairo-xcb-surface.c | 149 +++++++++++++++++++++--------------------------- + 1 file changed, 66 insertions(+), 83 deletions(-) + +commit 343d9ef030a6a15f779f12e13a03a9451d2fff8b +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sat Oct 21 17:27:28 2006 +0800 + + glitz: don't go fackback path for bitmap glyphs. + + Test case bitmap font still passes with changes and improves performance + a lot. + + src/cairo-glitz-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 3b1d0d3519a7d0328f897927d3534f10750d30db +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sat Oct 21 17:23:11 2006 +0800 + + glitz: fix test case glyph-cache-pressure. + + Glitz backend need freeze glyph cache as xlib backend otherwise it'll + crash, let's fix it now. + + src/cairo-glitz-surface.c | 47 +++++++++++++++-------------------------------- + 1 file changed, 15 insertions(+), 32 deletions(-) + +commit f3c58350713b46c6e0e26a40898dc4da85e10279 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sat Oct 21 17:18:51 2006 +0800 + + glitz: fix for clone similar. + + This corrects mosts of changes in clone similar commit. But it's + still a problem in _cairo_glitz_surface_set_image, it'll crash if + source region is outside image extents. + + src/cairo-glitz-surface.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit 2ef9c7d9e8fcd0bda138f2b1965b3b06491cae00 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Sat Oct 21 17:07:19 2006 +0800 + + glitz: fix a crash in _cairo_glitz_surface_get_image. + + The previous changes in _cairo_glitz_surface_get_image causes test + clip-fill-rule-pixel-aligned and clip-fill-rule fail with a pretty + crash, this fix that. + + src/cairo-glitz-surface.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit a34a4a2bd745c07f0d6034acf066252ae55fbb81 +Author: Ian Osgood <iano@quirkster.com> +Date: Fri Oct 20 11:17:03 2006 -0700 + + XCB: bring composite, trapezoids up-to-date with Xlib + + Categorize & recategorize + Distinguish DO_COPYAREA and DO_XTILE + Create trapezoid mask + Fixup unbounded + + src/cairo-xcb-surface.c | 268 +++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 241 insertions(+), 27 deletions(-) + +commit b1944e1672ee6faa034dba4d8cf730886c35e848 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 19 15:48:13 2006 -0700 + + Fix bug in _cairo_clip_init_deep_copy (fixes clip-push-group crash) + + Thanks to Miklós Erdélyi <erdelyim@gmail.com> for reporting + the original problem and suggesting the fix. + + src/cairo-clip.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit f894ebf98022ecf5844cd50840e916d6ddbea0bf +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 19 15:45:53 2006 -0700 + + clip-push-group: Adjust test slightly to ensure mask-based clip is not anchored at the origin + + This should help us test if there's an offset problem in copying + the mask-based clip during cairo_push_group. + + test/clip-push-group-ref.png | Bin 200 -> 199 bytes + test/clip-push-group.c | 3 ++- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit f880f5e57bc44c2c2e70a80f0df21ea89084cd8c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 19 15:43:02 2006 -0700 + + test: Add clip-push-group to demonstrate crash in cairo_push_group + + The crash happens anytime mask-based clipping is in effect + at the time of cairo_push_group. The crash was first reported + here: + http://lists.freedesktop.org/archives/cairo/2006-August/007698.html + + test/Makefile.am | 2 ++ + test/clip-push-group-ref.png | Bin 0 -> 200 bytes + test/clip-push-group.c | 74 +++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 76 insertions(+) + +commit 8d2f0367527cb23f5902db0526b69b7d83b97f9c +Author: Ian Osgood <iano@quirkster.com> +Date: Thu Oct 19 13:42:04 2006 -0700 + + XCB: implement subimage_copy fix + + Needs further testing and review. + + src/cairo-xcb-surface.c | 80 +++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 64 insertions(+), 16 deletions(-) + +commit 8d7a02ed58e06584eb09575e6ca11d0a81094ab6 +Author: Christopher (Monty) Montgomery <xiphmont@gmail.com> +Date: Wed Oct 18 17:06:23 2006 -0700 + + Add extents to clone_similar (fixing subimage_copy performance bug) + + This fixes a huge performance bug (entire image was being pushed to X + server in order to copy a tiny piece of it). I see up to 50x improvement + from subimage_copy (which was designed to expose this problem) but also + a 5x improvement in some text performance cases. + + xlib-rgba subimage_copy-512 3.93 2.46% -> 0.07 2.71%: 52.91x faster + ███████████████████████████████████████████████████▉ + xlib-rgb subimage_copy-512 4.03 1.97% -> 0.09 2.61%: 44.74x faster + ███████████████████████████████████████████▊ + xlib-rgba subimage_copy-256 1.02 2.25% -> 0.07 0.56%: 14.42x faster + █████████████■+ xlib-rgba text_image_rgb_over-256 63.21 1.53% -> 11.87 2.17%: 5.33x faster + ████■+ xlib-rgba text_image_rgba_over-256 62.31 0.72% -> 11.87 2.82%: 5.25x faster + ████▎ + xlib-rgba text_image_rgba_source-256 67.97 0.85% -> 16.48 2.23%: 4.13x faster + ███■+ xlib-rgba text_image_rgb_source-256 68.82 0.55% -> 16.93 2.10%: 4.07x faster + ███■+ xlib-rgba subimage_copy-128 0.19 1.72% -> 0.06 0.85%: 3.10x faster + ██■+ + src/cairo-clip.c | 7 ++++++- + src/cairo-directfb-surface.c | 18 +++++++++++++----- + src/cairo-glitz-surface.c | 30 ++++++++++++++++++++++-------- + src/cairo-image-surface.c | 4 ++++ + src/cairo-nquartz-surface.c | 9 +++++++-- + src/cairo-pattern.c | 38 ++++++++++++++++++++------------------ + src/cairo-surface.c | 14 ++++++++++++-- + src/cairo-xcb-surface.c | 9 +++++++++ + src/cairo-xlib-surface.c | 18 ++++++++++++++---- + src/cairoint.h | 8 ++++++++ + 10 files changed, 115 insertions(+), 40 deletions(-) + +commit 99e2e99a78e492196a76e76cb47e463223db3012 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 18 15:47:18 2006 -0700 + + Use zero-size change bar for a speedup/slowdown of 1.0 + + Also use speedup/slowdown rather than faster/slower in the output + + perf/cairo-perf-diff.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 40e1c0246da1e79b70d4b89b7735e6fec329c56e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 18 15:18:11 2006 -0700 + + Add neglected reference images for infinite-join test + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/infinite-join-ps-argb32-ref.png | Bin 0 -> 220 bytes + test/infinite-join-ref.png | Bin 0 -> 194 bytes + 4 files changed, 3 insertions(+) + +commit e21c155e73569f6533dd01bdd7ec62461e7f215f +Merge: a53eabf 10cd23d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 18 15:03:04 2006 -0700 + + Merge branch '8379' into cairo + +commit 10cd23d51fbfc99d6e3e401440eebb56df3b3327 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 21 15:17:59 2006 -0700 + + Fix infinite-join test case (bug #8379) + + The trick for this was to carefully ensure that the pen always has + at least 4 vertices. There was a previous attempt at this in the + code already but the test case had a combination of matrix and radius + that resulted in a value that was just able to sneak past the previous + check. + + src/cairo-pen.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 5b7a7f39ad8b726e9ee582bcd10500a1e5b16554 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 18 15:01:58 2006 -0700 + + test/infinite-join: Modify to draw something visible, and make the output a more reasonable size. + + The modification was performed with care to ensure that the bug + is still exercised. Also, reference images are added. + + test/infinite-join.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit a53eabf0a505bcf01e52af1b47b194a482eddf51 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 18 12:14:38 2006 -0700 + + Add cairo-perf-diff program for comparing two cairo-perf reports. + + perf/.gitignore | 1 + + perf/Makefile.am | 6 +- + perf/cairo-perf-diff.c | 478 +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 483 insertions(+), 2 deletions(-) + +commit 5c7798a646ecad59dfabac1f9afb96006470054e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 18 12:10:00 2006 -0700 + + perf: Print ticks as well as ms in output. + + The ticks value is a bit more reliable since it won't exhibit + variation due to estimating the CPU frequency like the ms value + will. + + perf/cairo-perf.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit bb3d4b2f88dca258389d7ca4cae51a5b64c0dfc9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 17 19:18:22 2006 -0700 + + cairo-perf: Remove wasted whitespace in output. Squelch wanring. + + perf/cairo-perf.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit d8c23d5ed747fa216d8070accdb80d665033233b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 17 17:53:43 2006 -0700 + + perf: Change minimum size of paint test to 256 + + The paint tests at sizes less than 256 were just too fast to be + significant. + + perf/cairo-perf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c1f134fa13928f31c903d513920448b127749a4b +Merge: 968ceee 157663e +Author: Ian Osgood <iano@quirkster.com> +Date: Wed Oct 18 08:15:47 2006 -0700 + + Merge branch 'master' of git+ssh://iano@git.cairographics.org/git/cairo + +commit 968ceeec1d2223e823ec56883bc00da512549ea5 +Author: Ian Osgood <iano@quirkster.com> +Date: Wed Oct 18 08:14:55 2006 -0700 + + XCB: find_standard_format using wrong enumeration. + + Requires latest xcb/util/renderutil library from git. + + boilerplate/cairo-boilerplate.c | 8 ++++---- + src/cairo-xcb-surface.c | 20 ++++++++++---------- + 2 files changed, 14 insertions(+), 14 deletions(-) + +commit 157663e1fdf120a71c6cc8222b88d2915a5a73eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 18 10:59:10 2006 -0400 + + [configure.in] Require pkg-config 0.19. (#8686) + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2a0c57c1fc20f3e2ee641273b5f059ca221d265 +Author: Ian Osgood <iano@quirkster.com> +Date: Tue Oct 17 08:09:29 2006 -0700 + + XCB: glyph rendering support + + todo: get_font_options, testing + + src/cairo-xcb-surface.c | 926 +++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 885 insertions(+), 41 deletions(-) + +commit 25353fdb57cd987fff01538be2c0fd27e7155879 +Author: Jamey Sharp <jamey@minilop.net> +Date: Mon Oct 16 11:44:08 2006 -0700 + + XCB: Move slim_hidden_def to cairo-xcb-surface.c, not cairo-xcb-xrender.h. + + I didn't understand that the _def does not need to be public any more + than the _proto does. + + src/cairo-xcb-surface.c | 1 + + src/cairo-xcb-xrender.h | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit aa017161a59bd643f3b369875ae3ba54e4a6c425 +Author: Ian Osgood <iano@quirkster.com> +Date: Thu Oct 12 20:17:22 2006 -0700 + + Move XCB sections next to XLIB sections. + + configure.in | 16 ++++++++-------- + src/Makefile.am | 14 +++++++------- + 2 files changed, 15 insertions(+), 15 deletions(-) + +commit 8dabfc7ffe36649f85873043f8fc4f06714e5845 +Author: Jamey Sharp <jamey@minilop.net> +Date: Mon Oct 16 11:23:38 2006 -0700 + + XCB: Add the have_clip_rects field to cairo_xcb_surface, to match the Xlib surface. + + Correction to my previous commit. *sigh* + + src/cairo-xcb-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 7988f2cc6ac596de61ef4378df66cbafece5f747 +Author: Ian Osgood <iano@quirkster.com> +Date: Mon Oct 16 07:20:15 2006 -0700 + + XCB: Remove unnecessary differences with the Xlib surface. + + src/cairo-xcb-surface.c | 84 +++++++++++++++++++++++++------------------------ + 1 file changed, 43 insertions(+), 41 deletions(-) + +commit b62710d4f8602203d848daf2d444865b611fff09 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 30 14:43:21 2006 -0700 + + Bug #7497: Change _cairo_color_compute_shorts to not rely on any particular floating-point epsilon value. + + src/cairo-color.c | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +commit 71037f3612da9d11431567c05c17807499ab1746 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 16 09:07:40 2006 -0700 + + Rename wait_for_rendering to syncrhonize + + We're not using this call both before and after rendering + so the old name just didn't make sense anymore. + + boilerplate/cairo-boilerplate.c | 6 +++--- + boilerplate/cairo-boilerplate.h | 2 +- + perf/cairo-perf.c | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 6c9508340620c5981393a3455304e774712ddc83 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Oct 16 17:51:41 2006 +0200 + + Fix win32 build when pthreads are available + + _cairo_win32_initialize always needs a definition. + + src/cairo-win32-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 7d136864382f8b17e6c672892a00d4bb0ea3ed90 +Author: Christian Biesinger <cbiesinger@web.de> +Date: Mon Oct 16 17:27:23 2006 +0200 + + [win32] Add missing void + + This fixes a GCC compile warning + + src/cairo-win32-private.h | 2 +- + src/cairo-win32-surface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 445251cc79d87b73a2ccd7891f9a5a33b89927a4 +Author: Jamey Sharp <jamey@minilop.net> +Date: Sun Oct 15 17:23:58 2006 -0700 + + [slim] hide cairo_version_string() + + Adrian's recent commits broke PLT hiding by calling cairo_version_string + from inside cairo. Add slim_hidden_def and slim_hidden_proto for it. + + src/cairo.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit 830804c7aec0334953bdc6f4704da6d404fc030a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 15 23:11:30 2006 +0930 + + PDF: Add cairo version to document info dictionary + + src/cairo-pdf-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 5aaa1988c7e27ed7acd002ee0fb8d344444b46dd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 15 23:11:01 2006 +0930 + + PS: Add cairo version to PS header + + src/cairo-ps-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 753763ff258760688ef5a594a204fa8f2be7e4a4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 15 23:09:35 2006 +0930 + + Type1 subsetting: Don't put .notdef in Encoding when there are 256 glyphs + + Type1 subsetting adds the .notdef glyph to the subset because the Type 1 + spec requires that it be defined. However if the subset already has + 256 glyphs, this will cause the Encoding vector to have 257 entries + which ghostscript does not like. + + src/cairo-type1-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 216c759d463ca407e1baea4090c782074567cbe2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 15 23:07:38 2006 +0930 + + Type 1 fallback fonts - use binary encoding in PDF files + + PDF files require that embedded Type 1 fonts have the encrypted + portion of the font encoded in binary. + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 32 ++++++++++++++++++++++++----- + src/cairo-type1-fallback.c | 36 ++++++++++++++++++++++++++------- + 4 files changed, 58 insertions(+), 14 deletions(-) + +commit d1fb02b5b93c9a456411e9eb56f3ee136b33d9e7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 15 23:02:20 2006 +0930 + + Correct an unsigned to signed conversion problem in truetype subsetting bbox + + src/cairo-truetype-subset.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 9ee0c15941b029ea3fb4fbf30e78bb917b7f8c66 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 15 22:48:43 2006 +0930 + + cairo-type1-fallback.c: return correct error status + + src/cairo-type1-fallback.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f7068de7f78890df9fbadba8b15d1c3b58166c2d +Author: Jamey Sharp <jamey@minilop.net> +Date: Thu Oct 12 23:43:45 2006 -0700 + + Update .gitignore in boilerplate and test. + + boilerplate/.gitignore | 1 + + test/.gitignore | 4 ++++ + 2 files changed, 5 insertions(+) + +commit 2d30e58ccd14ae707afcc311f49e32fe6d6d4061 +Author: Jamey Sharp <jamey@minilop.net> +Date: Thu Oct 12 23:42:50 2006 -0700 + + XCB: update cairo-boilerplate to test for an error connection rather than NULL. + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 02e7b892bcb75a69eb28902e7f67e2e7778bfe7b +Merge: 151e29d 648f4bc +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Oct 12 20:40:11 2006 -0700 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit 151e29d8070986b9e60b4c70ebedb25e9fe71ab8 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Oct 12 20:39:26 2006 -0700 + + Fixed test to compile + + boilerplate/cairo-test-directfb.h | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 29f483326f127ec60e26801732da2486eb84b7ef +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Oct 12 20:39:16 2006 -0700 + + Fixed test to compile + + boilerplate/cairo-test-directfb.c | 75 ++++++++++++++++++++++++--------------- + 1 file changed, 47 insertions(+), 28 deletions(-) + +commit e521562ebf9c827508b997acda2d4292014d6938 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Oct 12 20:38:47 2006 -0700 + + Fixed directfb test code + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 648f4bc830ab7cc89ffa2ba03d2757d0979a5671 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 12 15:12:01 2006 -0700 + + perf: Make iterations adaptive (bailing as soon as std. deviation is <= 3% for 5 consecutive iterations + + This makes the entire performance test suite about 10 times faster + on my system. And I don't think that the results are significantly + worse, (many tests are stable after only 5 iterations while some + still run to 100 iterations without reaching our stability criteria). + + perf/cairo-perf.c | 30 +++++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +commit 78ad834d81b1fb2a49150ce224a5f25b5190b5a4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 12 14:21:55 2006 -0700 + + Fix typo of , instead of || which was causing a test to be ignored + + Thanks to a gcc warning for catching this one, (statement with + no effect, or similar). + + test/pattern-getters.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 20375d5cef560e7277635a0bdba3872f31cb4479 +Author: Jamey Sharp <jamey@minilop.net> +Date: Wed Oct 11 22:20:27 2006 -0700 + + XCB: add slim_hidden_proto and slim_hidden_def for cairo_xcb_surface_create_with_xrender_format. + + src/cairo-xcb-surface.c | 2 ++ + src/cairo-xcb-xrender.h | 1 + + 2 files changed, 3 insertions(+) + +commit 339fe5c7b0d694c547c27a6a98ef8448f1ff2e43 +Author: Ian Osgood <iano@quirkster.com> +Date: Wed Oct 11 21:32:32 2006 -0700 + + Replace static fn with xcb-renderutil library fn. + + boilerplate/cairo-boilerplate.c | 99 +++-------------------------------------- + 1 file changed, 5 insertions(+), 94 deletions(-) + +commit 7d0ff885df7029f96568ac7fad3f15b002bec1b3 +Author: Ian Osgood <iano@quirkster.com> +Date: Sat Sep 30 13:23:06 2006 -0700 + + Update XCB names for XCB 1.0 RC2 release. + + New names are in line with cairo naming standards. + XIDs are now typedefs not structs. + xcb_generate_id replaces *_new functions. + Also fixed all warnings (one const, new enums in switch statements). + + boilerplate/cairo-boilerplate.c | 56 ++++---- + configure.in | 2 +- + src/cairo-xcb-surface.c | 303 ++++++++++++++++++++-------------------- + src/cairo-xcb-xrender.h | 12 +- + src/cairo-xcb.h | 14 +- + 5 files changed, 194 insertions(+), 193 deletions(-) + +commit 38dcddd79ef95b04bf8d6ff8336cb997875df41b +Author: Christian Biesinger <cbiesinger@web.de> +Date: Tue Oct 10 12:38:33 2006 -0700 + + fix comment: pixman_private needs to be before the type of a variable + + Makes the documentation match the code. + Compare also commit 34d11aa3c45ba672b34d0a17f672f907305f3893 + + pixman/src/slim_internal.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f6a2811c87def7b1bc70a2014d93df8feab2e2f4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Oct 8 17:07:17 2006 -0400 + + [slim] hide cairo_glitz_surface_create() (#8551) + + src/Makefile.am | 2 +- + src/cairo-glitz-private.h | 41 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-glitz-surface.c | 2 ++ + 3 files changed, 44 insertions(+), 1 deletion(-) + +commit a13d58ff3af5ed85313b5af651c1d69f5e38fa06 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Oct 8 17:06:44 2006 -0400 + + [slim] hide cairo_pattern_status() #8551 + + src/cairo-pattern.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit d7c2f7e2d74c7e383f6933b974066221bcc5faa5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 5 15:14:14 2006 -0700 + + perf: Rename finalize to synchronize as it is used in both start() and stop() now + + perf/cairo-perf-posix.c | 20 ++++++++++---------- + perf/cairo-perf-win32.c | 20 ++++++++++---------- + perf/cairo-perf.c | 4 ++-- + perf/cairo-perf.h | 6 +++--- + 4 files changed, 25 insertions(+), 25 deletions(-) + +commit 8af5e14fd8056408bc46698b7186655ec8e60062 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 5 15:07:52 2006 -0700 + + perf: Do backend synchronization in cairo_perf_timer_start as well as cairo_perf_timer_stop + + perf/cairo-perf-posix.c | 20 +++++++++++--------- + perf/cairo-perf-win32.c | 12 +++++++----- + 2 files changed, 18 insertions(+), 14 deletions(-) + +commit 5412343a77b7b336886ed763a3518ff4602f27aa +Author: Carl Worth <cworth@cworth.org> +Date: Thu Oct 5 12:13:48 2006 -0700 + + perf: Add subimage_copy test to demonstrate performance bug found by monty + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/subimage_copy.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 74 insertions(+) + +commit 9285a1f7fe88db760b7cf49c87ac9be613f21630 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 18:35:16 2006 -0700 + + perf: Add text test + + perf/Makefile.am | 3 ++- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/text.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 65 insertions(+), 1 deletion(-) + +commit f1db0135476a039ea43dfd67c56763b05aea2ec4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 18:34:09 2006 -0700 + + Fix typo that was resulting in device glyph_extents of INT16_MAX in some cases. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2041db91968c7c06cdb2e454f572c50d75144d29 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Oct 5 11:51:25 2006 -0400 + + [Makefile.am] Pass srcdir down to the tests + + src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit bda77f505c911aea8ce684cb22a1469d1b7a9049 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 16:35:20 2006 -0700 + + perf: Bail if cairo_status returns non-success at the end of a test. + + perf/cairo-perf.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit d15b8f2d6e0b0c2279fb0b17368f1110396e4bf8 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 16:32:14 2006 -0700 + + perf: Add linear and radial gradients to the coverage + + perf/cairo-perf-cover.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 71 insertions(+), 1 deletion(-) + +commit 933d84572849a7ad61aca2c381f11a572fa9e9b7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 16:17:46 2006 -0700 + + Shorten test names in output (drop unneeded _source and _surface) + + perf/cairo-perf-cover.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit fb61fe82d3b360f09f2984bd3ac7de6720f75662 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 16:16:03 2006 -0700 + + perf: Add stroke and fill tests + + perf/Makefile.am | 2 ++ + perf/cairo-perf.c | 8 +++++--- + perf/cairo-perf.h | 5 ++--- + perf/fill.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + perf/stroke.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 109 insertions(+), 6 deletions(-) + +commit d52256df7c0147c29246dfc930644b6bdbff3c3f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 15:39:05 2006 -0700 + + perf: Move iteration over sources and operators from paint to new cairo-perf-cover + + This will finally allow us to very easily add lots of other + tests that will similarly involve iterating over the various + sources and operators of interest. + + perf/Makefile.am | 1 + + perf/cairo-perf-cover.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf.c | 9 --- + perf/cairo-perf.h | 13 +++- + perf/paint.c | 133 +------------------------------------- + 5 files changed, 180 insertions(+), 142 deletions(-) + +commit ad02773e9babe935250b810f8f9f490eb3d02a64 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 15:24:19 2006 -0700 + + Remove unused variable + + src/cairo-gstate.c | 1 - + 1 file changed, 1 deletion(-) + +commit 783b69a8d33f913949247cc3ba018c35a4a83aa7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 15:00:57 2006 -0700 + + Rename the create_for_status pattern to create_in_error. + + src/cairo-path-data-private.h | 2 +- + src/cairo-path-data.c | 2 +- + src/cairo-pattern.c | 4 ++-- + src/cairo.c | 8 ++++---- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 01502471e31aa28a910039a918ff2aec3810d3c1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 14:58:06 2006 -0700 + + Add new _cairo_pattern_create_for_status so that patterns properly propagate errors. + + In particular, many possible error values on a surface provided + to cairo_pattern_create_for_surface were previously being swallowed + and a nil pattern was returned that erroneously reported + CAIRO_STATUS_NO_MEMORY. + + src/cairo-pattern.c | 52 ++++++++++++++++------------------------------------ + 1 file changed, 16 insertions(+), 36 deletions(-) + +commit c9c259903d03e35fe98781fc6fedf326c40c0c4c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 15:23:36 2006 -0700 + + Cast to squelch warning message + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4d2b54a271f722de9802ca68246ce6afba89f830 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 14:56:33 2006 -0700 + + Fix cairo_image_surface_create to report INVALID_FORMAT errors. + + This adds a new nil cairo_image_surface to hold CAIRO_STATUS_INVALID_FORMAT. + Previously the detected error was being lost and a nil surface was + returned that erroneously reported CAIRO_STATUS_NO_MEMORY. + + src/cairo-image-surface.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 50 insertions(+), 2 deletions(-) + +commit 7d5fb687af2ec2da94a10200309fa362d694d23f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 14:13:54 2006 -0700 + + perf/paint: Test image surface as well as similar surface sources + + perf/cairo-perf.c | 4 +-- + perf/paint.c | 85 ++++++++++++++++++++++++++++++++++++++++--------------- + 2 files changed, 64 insertions(+), 25 deletions(-) + +commit 94759a14daac63d05e5399982be56e73abf552c4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 13:54:39 2006 -0700 + + perf/paint: Use loops for sources and operators rather than open coding. + + This looks a bit more complicated for now, but will + scaled much better to provide complete coverage as + we extend the cases covered. + + perf/paint.c | 73 ++++++++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 54 insertions(+), 19 deletions(-) + +commit 37bc39d82c8d2c2cd8b04ea554925102b4831856 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 13:35:27 2006 -0700 + + perf/paint: Dramatically simplify now that we don't need one callback per run. + + This commit begins to show the benefits of the reorganization + from the last few commits. Specifically, we don't need a callback + for every run anymore, and now that the cairo_t* is available to + the paint entry function and the size changes only on the outer + loop, (rather than inside cairo_perf_run), there's no need for + the ugly, static cache for the source surface. + + perf/paint.c | 146 ++++++++++++++--------------------------------------------- + 1 file changed, 33 insertions(+), 113 deletions(-) + +commit d0aae4dbcf6d3ca67a4a7b364fba80f719af2ac1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 13:23:50 2006 -0700 + + perf: Make cairo_t* available to perf functions + + perf/README | 27 +++++++++++++-------------- + perf/cairo-perf.c | 2 +- + perf/cairo-perf.h | 2 +- + perf/paint.c | 2 +- + perf/tessellate.c | 2 +- + 5 files changed, 17 insertions(+), 18 deletions(-) + +commit 4406ab1b9e8a618aae4d709a370d4ace0e9897e9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Oct 4 12:55:54 2006 -0700 + + perf: Move the per-size loop from cairo_perf_run to main + + The motivation here is to have the cairo_t context available + to the perf funcs before they call into cairo_perf_run, (so + that they can do one-time setup of source etc. for several + runs). + + perf/cairo-perf.c | 95 +++++++++++++++++++++++++++++-------------------------- + 1 file changed, 50 insertions(+), 45 deletions(-) + +commit 251bed86400f72a4ec90618d0d41566ab9969cfa +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 3 17:27:27 2006 -0700 + + perf/paint: Make all sizes use a consistent number of iterations + + This effectively reverts the change made in: + + 3c407aa80a43e1724e732482ada5ad6718fe33ae + + The justification is that we want to be able to see the + trends of increasing the image size while keeping the test + the same. But changing the number of iterations in a size- + specific way interferes with that. Also, the standard deviation + is almost always better this way, (though it now varies more + by size). + + And as a bonus, the total time required to run the suite is now + less. + + perf/paint.c | 19 +------------------ + 1 file changed, 1 insertion(+), 18 deletions(-) + +commit 1e0e2075090c181dcd9f431833a8a9c2665d763e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Oct 2 14:35:35 2006 -0400 + + [check-headers.sh] Don't use '\>' regexp syntax + + src/check-headers.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b58d92f5a449e7d5edf39484465e2ce6acf4874 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 17:47:01 2006 -0700 + + Add missing 'Since: 1.4' tags to documentation of 'clip getter' functions. + + The following documented symbols were missing this tag: + + cairo_clip_extents + cairo_copy_clip_rectangles + CAIRO_STATUS_INVALID_INDEX + cairo_rectangle_t + cairo_rectangle_list_t + + src/cairo.c | 4 ++++ + src/cairo.h | 6 +++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 9cacced88fa9dbaa53ff8dec6ff31c8e56c85f08 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 17:44:34 2006 -0700 + + Add documentation for cairo_rectangle_list_destroy + + src/cairo-clip.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 34d11aa3c45ba672b34d0a17f672f907305f3893 +Author: Alfred Peng <alfred.peng@sun.com> +Date: Fri Sep 29 17:17:27 2006 -0700 + + Use pixman_private consistently as prefix not suffix + + pixman/src/icint.h | 2 +- + pixman/src/icrop.h | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit c1495742f76ce380aaa48389bc331723b7a3a141 +Author: Alfred Peng <alfred.peng@sun.com> +Date: Fri Sep 29 17:16:47 2006 -0700 + + Add Sun Pro C definition of pixman_private + + pixman/src/slim_internal.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 28cc64aa20cd15f78109f4481bd1c08627c87e46 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 17:08:53 2006 -0700 + + Fix dependency of 'make doc' so that necessary header files are built first. + + Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit deef1a667536ec67ff1d7b42a1f8179e1eac4715 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 16:59:27 2006 -0700 + + Rename docs-publish target to doc-publish in order to be consistent with the doc target. + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6575fb3c76ec2cda742e05c24958a7000d488dd +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 16:58:51 2006 -0700 + + Fix Makefile bug preventing 'make doc' from succeeding + + doc/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit beb778f482645650b129762a0a37400c12a04b32 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 16:56:36 2006 -0700 + + Use consistent wording to document cairo_in_fill, cairo_in_stroke, cairo_fill_extents, and cairo_stroke_extents. + + src/cairo.c | 32 ++++++++++++++++++++------------ + 1 file changed, 20 insertions(+), 12 deletions(-) + +commit 516ca57dd835da17fb6b43f00d1b1f37f25f49c4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 16:55:22 2006 -0700 + + tmpl: obnoxious churn + + doc/public/tmpl/cairo-image.sgml | 1 - + doc/public/tmpl/cairo-status.sgml | 48 ++++++++-------- + doc/public/tmpl/cairo-surface.sgml | 112 +++++++++++++++++++------------------ + 3 files changed, 82 insertions(+), 79 deletions(-) + +commit b99d41a0b075ec405d14ea8b6bbcaa50aa35e890 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 16:46:39 2006 -0700 + + Fix typo in documentation of cairo_in_fill (thanks to Jonathan Watt) and clarify a bit. + + src/cairo.c | 24 +++++++++++++++--------- + 1 file changed, 15 insertions(+), 9 deletions(-) + +commit 3c19a6413cf77d86d75501f531af08b13db1f411 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 29 16:42:44 2006 -0700 + + perf: Rework the suite to allow multiple performance tests to be defined in one file. + + perf/README | 66 ++++++++++++++--------- + perf/cairo-perf.c | 159 +++++++++++++++++++++++++++++------------------------- + perf/cairo-perf.h | 23 ++++---- + perf/paint.c | 32 +++++++---- + perf/tessellate.c | 22 +++++--- + 5 files changed, 176 insertions(+), 126 deletions(-) + +commit cd6b44e9c924d230c9647e63553198a947f53307 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Sep 29 14:44:00 2006 -0700 + + [test] Fix composite-integer-translate-over test + + This test wasn't translating by an integer, but instead by 5.5. Fixed + test and reference image. + + ...osite-integer-translate-over-pdf-argb32-ref.png | Bin 12946 -> 0 bytes + test/composite-integer-translate-over-ref.png | Bin 15397 -> 16385 bytes + test/composite-integer-translate-over-svg-ref.png | Bin 15465 -> 0 bytes + test/composite-integer-translate-over.c | 27 +++++++++++++++++++-- + 4 files changed, 25 insertions(+), 2 deletions(-) + +commit b05400b5590ab0303ef5802ac4952633e2b14d18 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Sep 28 14:58:49 2006 -0700 + + [nquartz] Return correct values from operation setup function + + Leftovers from an old half-completed patch that was breaking the world. + This fixes the world, or at least one tiny part of it. + + src/cairo-nquartz-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 17eeacfba844ea5f9592dff4621e6f721c27d6c5 +Author: Robert O'Callahan <rocallahan@novell.com> +Date: Mon Sep 25 16:24:33 2006 -0700 + + Remove redundant call to _cairo_surface_get_extents + + We called it just above with the same parameters. + + src/cairo-surface-fallback.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit e4dc73ab1cafeb8dd77d3ee3dc92d9a92be69542 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 25 16:16:35 2006 -0700 + + Rename test from stale path-data name to copy-path + + test/Makefile.am | 6 +- + test/copy-path-ps-argb32-ref.png | Bin 0 -> 442 bytes + test/copy-path-ref.png | Bin 0 -> 579 bytes + test/copy-path.c | 234 +++++++++++++++++++++++++++++++++++++++ + test/path-data-ps-argb32-ref.png | Bin 442 -> 0 bytes + test/path-data-ref.png | Bin 579 -> 0 bytes + test/path-data.c | 234 --------------------------------------- + 7 files changed, 237 insertions(+), 237 deletions(-) + +commit 5f833c134bd002853b9d1458b58350cfb1d40a94 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 25 16:03:02 2006 -0700 + + Fix cairo_copy_path and cairo_copy_path_flat to propagate errors. + + One of these functions was already documented to be doing this, and + the other one should have been. Now the documentation and behavior + for both are consistent, (and the path-data test case verifies this). + + src/cairo-path-data-private.h | 3 +++ + src/cairo-path-data.c | 16 ++++++++++++++++ + src/cairo.c | 16 ++++++++++------ + test/path-data.c | 28 +++++++++++++++++++++++++++- + 4 files changed, 56 insertions(+), 7 deletions(-) + +commit f9165638bf485591abae52b759fba82caf048dc5 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Tue Sep 26 17:33:29 2006 -0400 + + Compute right index when looking up left side bearing. + + When looking up the short entries in the second part of + the hmtx table, compute the size of the first part correctly. + + Fix from Adrian, see: + + https://bugs.freedesktop.org/show_bug.cgi?id=8180#c12 + + src/cairo-truetype-subset.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 7c3062240ac036c8091ee9f0acce0aa3ea9df8ea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 26 13:54:03 2006 -0400 + + [configure] Print out whether SVG and PDF surfaces can be tested + + configure.in | 8 ++++++-- + src/check-def.sh | 2 +- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 191e108b93ef6d39832e78323a18cc4c795c7ca3 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Mon Sep 25 23:22:45 2006 -0700 + + Add clip getters API + tests + + Add new public API methods: + + void cairo_clip_extents (cairo_t *cr, double *x1, double *y1, + double *x2, double *y2); + cairo_rectangle_list_t *cairo_copy_clip_rectangles (cairo_t *); + void cairo_rectangle_list_destroy (cairo_rectangle_list_t *); + + Also add 'get-clip' and 'get-path-extents' tests. + + src/cairo-clip-private.h | 5 + + src/cairo-clip.c | 127 +++++++++++++++++++++- + src/cairo-gstate.c | 34 ++++++ + src/cairo.c | 63 +++++++++++ + src/cairo.h | 36 +++++- + src/cairoint.h | 10 ++ + test/Makefile.am | 2 + + test/Makefile.win32 | 2 + + test/get-clip.c | 277 +++++++++++++++++++++++++++++++++++++++++++++++ + test/get-path-extents.c | 199 ++++++++++++++++++++++++++++++++++ + 10 files changed, 753 insertions(+), 2 deletions(-) + +commit a8ca155f83098c02fb8d3acc57b0492d5b753d54 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Mon Sep 25 23:16:54 2006 -0700 + + Fix stroke/fill extents bounding boxes + + Correctly return the transformed bounding box for stroke/fill extents, + instead of just transforming the two corners separately. + + src/cairo-gstate.c | 75 ++++++++++++++++++++++++++++++++++-------------------- + src/cairo.c | 26 +++++++++++++++++++ + src/cairoint.h | 6 +++++ + 3 files changed, 80 insertions(+), 27 deletions(-) + +commit 37fa632e59b7325041f689bf1a56e08d04379c96 +Author: Robert O'Callahan <robert@ocallahan.org> +Date: Mon Sep 25 23:14:43 2006 -0700 + + Fix _cairo_matrix_transform_bounding_box to return tightness info + + Add return is_tight value to the internal function, indicating whether + the transformed bounds still remain axis-aligned. + + src/cairo-matrix.c | 18 +++++++++++++++++- + src/cairoint.h | 3 ++- + 2 files changed, 19 insertions(+), 2 deletions(-) + +commit de1915ffd2fe7f973529104a1041b33f2abfdfed +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 25 10:44:08 2006 -0700 + + ROADMAP: Add a couple of URLs for user-font API discussion + + ROADMAP | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b146255fa45807a195fb3a7eb55d6c593bd1a5c9 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 21 15:30:23 2006 -0700 + + ROADMAP: Add infinite-join bug (#8379) to the list for 1.4 + + ROADMAP | 1 + + 1 file changed, 1 insertion(+) + +commit 5492a7c7618a747130b844a509fb79b886f1bc54 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 21 15:15:02 2006 -0700 + + Add assert statement so the infinite-join test simply exits rather than looping infinitely. + + src/cairo-pen.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8744929030ed8d42c271d9abb202975f62de166c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 21 15:13:47 2006 -0700 + + Add test case from bug #8379 demonstrating infinite loop during round join + + test/Makefile.am | 1 + + test/infinite-join.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 74 insertions(+) + +commit 303b52919519854b9b5bbc38a9ac115e422dddad +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 19 12:17:34 2006 -0700 + + dash and pattern getter functions + + Adds API functions for inspecting the current dash state, as well as + the contents of pattern objects: + + cairo_get_dash + cairo_get_dash_count + cairo_pattern_get_rgba + cairo_pattern_get_surface + cairo_pattern_get_color_stop_rgba + cairo_pattern_get_color_stop_count + cairo_pattern_get_linear_points + cairo_pattern_get_radial_circles + + src/cairo-pattern.c | 238 ++++++++++++++++++++++++++++++++++++++++++- + src/cairo.c | 63 +++++++++++- + src/cairo.h | 40 +++++++- + test/Makefile.am | 1 + + test/Makefile.win32 | 1 + + test/get-and-set.c | 39 +++++-- + test/pattern-getters-ref.png | Bin 0 -> 107 bytes + test/pattern-getters.c | 175 +++++++++++++++++++++++++++++++ + 8 files changed, 546 insertions(+), 11 deletions(-) + +commit a56b962428c487d1c341f86e6719bad86374386c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 19 12:10:12 2006 -0700 + + Add win32 output files to gitignore + + boilerplate/.gitignore | 7 +++++++ + perf/.gitignore | 7 +++++++ + pixman/src/.gitignore | 3 +++ + src/.gitignore | 7 +++++++ + test/.gitignore | 6 ++++++ + 5 files changed, 30 insertions(+) + +commit 8a9b99e596a93049abeb8bbbe502f895df72f678 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Sep 14 12:59:31 2006 -0700 + + [perf] Change perf output format, report times in ms, add a few paint tests + + This changes the perf test output format to be a little more human friendly, + reporting times in ms instead of seconds. It also adds a test number + that could be used in the future for specifying an explicit test to run + (test number, target surface, test name, and size uniquiely identify + a test). + + Also adds a few paint tests. + + perf/Makefile.win32 | 16 +++++++ + perf/cairo-perf.c | 45 +++++++++++++------- + perf/cairo-perf.h | 13 +++++- + perf/paint.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 4 files changed, 173 insertions(+), 19 deletions(-) + +commit e42905b01bd5bab11008b7d6a78bc263ae2f9f5d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Sep 13 16:12:52 2006 -0700 + + [win32,perf] Fix cairo-perf-win32 + + Make cairo-perf work on win32 + + perf/cairo-perf-win32.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 82b710ebc214c46df6666ede486c0174b335bfdb +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 19 10:13:36 2006 -0700 + + Add missing pixman_private to _FbOnes when a function. + + This was thanks to a report from crucible (run #2113) since it tested + with older versions of gcc (3.3.6) than most of the cairo developers + use, (so we had been getting the _FbOnes macro not the function). + + pixman/src/icint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42a0c6bd59e41c22a88386b389af36f37418de82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 19 13:05:29 2006 -0400 + + check-def.sh: Only allow _cairo_.*_test_.* symbols, not all _cairo.* ones + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ae355453d849f870fc67cae0442db49548df0103 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 18 13:32:41 2006 -0400 + + cairo-nquartz.h: Add missing cairo_public decorators. + + src/cairo-nquartz.h | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 6c01b2ffb3c7a023f3932328b8067f4f5b83936c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 18 13:32:19 2006 -0400 + + cairo-directfb.h: Add missing cairo_public decorators + + src/cairo-directfb.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7bb72f645325960e0bef4595ed7e9f1bb391796c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 18 13:32:00 2006 -0400 + + cairo-pdf.h: Add missing cairo_public decorators + + src/cairo-pdf.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 01f10fb27a675ff26bb0c0ca6748479215e6d6bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 18 13:28:29 2006 -0400 + + check-headers.sh: Add a test for cairo_public decorators in public headers + Test fails currently because of bug 8313 and similar issues. + + src/Makefile.am | 2 +- + src/check-headers.sh | 21 +++++++++++++++++++++ + 2 files changed, 22 insertions(+), 1 deletion(-) + +commit 38ed0eeb5bedb4af32bfc42b7f2b99b1805c8c17 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 15 15:35:12 2006 -0400 + + [ROADMAP] Add polling API + + ROADMAP | 2 ++ + 1 file changed, 2 insertions(+) + +commit b9cbfba7d234c1cb66968d99cf527e1305febfea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 15 15:34:44 2006 -0400 + + [ROADMAP] Check RGB16_565 deprecated + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2fd0ad948931f4be43c81d2c4c56d264605bd737 +Author: Peter Weilbacher <pmw@schnurps.(none)> +Date: Fri Sep 15 11:18:47 2006 +0200 + + OS/2 build changes + + configure.in | 18 ++++++++++++++++++ + src/Makefile.am | 8 ++++++++ + src/cairo.h | 4 +++- + src/cairoint.h | 11 +++++++++++ + 4 files changed, 40 insertions(+), 1 deletion(-) + +commit 8c6baacefacbfb9e826d05ae253ead60d4e8e146 +Author: Peter Weilbacher <pmw@schnurps.(none)> +Date: Fri Sep 15 11:18:14 2006 +0200 + + OS/2 backend files + + src/cairo-os2-private.h | 77 ++++ + src/cairo-os2-surface.c | 1135 +++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-os2.h | 201 +++++++++ + 3 files changed, 1413 insertions(+) + +commit edfceea853dd6ae189843f138478c7d43fb98367 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 13 15:25:07 2006 -0700 + + Fix typo in error message (enhacement -> enhancement) + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3623da441a2b9dcec1effef71a41967ad5ff1363 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Sep 13 14:48:40 2006 -0700 + + [nquartz] Initial commit of native quartz surface + + Inital commit of Native Quartz surface. The main missing functionality + is mask() support (which is just a noop right now, except for the simple + solid-alpha case). + + boilerplate/cairo-boilerplate.c | 44 + + configure.in | 7 + + src/Makefile.am | 8 + + src/cairo-atsui-font.c | 122 ++- + src/cairo-nquartz-surface.c | 1797 +++++++++++++++++++++++++++++++++++++++ + src/cairo-nquartz.h | 80 ++ + src/cairo-quartz-private.h | 9 + + src/cairo.h | 3 +- + 8 files changed, 2037 insertions(+), 33 deletions(-) + +commit f1bd0b9f9815ac838f30216d810bdd4eb2b67997 +Author: Stuart Parmenter <pavlov@pavlov.net> +Date: Tue Sep 12 16:27:40 2006 -0700 + + [win32] correct win32 show_glyphs for non-y-aligned text + + Correctly calculate destination glyph coordinates for win32_show_glyphs. + + src/cairo-win32-font.c | 16 ++++++++++++++++ + src/cairo-win32-surface.c | 27 ++++++++++++++++++++++----- + src/cairo-win32.h | 8 ++++++++ + 3 files changed, 46 insertions(+), 5 deletions(-) + +commit 016653812640cddcc51d0500d62c5c65b33bdd04 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 12 16:08:40 2006 -0700 + + [win32] Support for DDBs, AlphaBlend fix + + Add support for the win32 surface using DDBs for similar surfaces and the + like when the orignal surface is created from a DC, or when a DDB is + explicitly created. A DIB is still created if alpha is required. + + Also fixes a case where blitting win32 RGB24 -> ARGB32 surfaces was causing + alpha to leak into the ARGB32 surface instead of being set to fully opaque. + + src/cairo-win32-private.h | 22 +- + src/cairo-win32-surface.c | 529 ++++++++++++++++++++++++++++++++++++++-------- + src/cairo-win32.h | 9 + + 3 files changed, 466 insertions(+), 94 deletions(-) + +commit 924bbd06f35f55886f808a7a9d3ee08e479389ad +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Sep 11 12:36:41 2006 -0700 + + Check for valid path status value before calling _cairo_set_error + + cairo_status_t is a signed type, so we need to check for invalid codes + that are < 0 as well. + + Also removes the MSVC goop in path-data.c that was attempting to work + around the assert earlier. + + src/cairo.c | 3 ++- + test/path-data.c | 11 ----------- + 2 files changed, 2 insertions(+), 12 deletions(-) + +commit bcc13ede9b820dd640748d9dc2ec9d15130427be +Author: Carl Worth <cworth@cworth.org> +Date: Mon Sep 11 11:12:47 2006 -0700 + + Move the REPLACED/DEPRECATED_BY macros from cairo.h to cairo-deprecated.h + + src/cairo-deprecated.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 86 -------------------------------------------- + 2 files changed, 98 insertions(+), 86 deletions(-) + +commit 79aed8c5fc82439f6724e8820ebcdaa585657574 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 15:05:56 2006 -0700 + + Deprecated CAIRO_FORMAT_RGB16_565. Add cairo-deprecated.h . + + src/Makefile.am | 1 + + src/cairo-deprecated.h | 41 +++++++++++++++++++++++++++++++++++++++++ + src/cairo-image-surface.c | 5 ----- + src/cairo-xlib-surface.c | 2 -- + src/cairo.h | 17 +++++++---------- + 5 files changed, 49 insertions(+), 17 deletions(-) + +commit cb6aed0a816cc5f09bb5660d4961ca196243eb10 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 20:17:08 2006 -0700 + + perf: Make xlib testing wait for the X server to finish rendering. + + We do this by adding a new cairo_perf_timer_set_finalize function and + in the case of the xlib backend passing a callback to that function + that does a 1x1 XGetImage. + + boilerplate/cairo-boilerplate.c | 17 +++++++++++++++-- + boilerplate/cairo-boilerplate.h | 4 ++++ + perf/cairo-perf-posix.c | 12 ++++++++++++ + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 7 +++++++ + 5 files changed, 39 insertions(+), 2 deletions(-) + +commit e1a8a8b65a41691521d89fba7737c093dfdf7926 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 23:54:40 2006 -0700 + + [win32] Set win32 assertion failure handlers for tests to stderr + + assert() will default to displaying a dialog box, which makes it hard + to run tests automatically. Set the reporting mode to only report + to stderr in cairo_test(), and in path-data, since that triggers + an early assert. + + test/cairo-test.c | 7 +++++++ + test/path-data.c | 11 +++++++++++ + 2 files changed, 18 insertions(+) + +commit 00d5a2ed48d999a29708d4750c034bbf1b91de12 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 23:29:17 2006 -0700 + + [win32] Makefile.win32: use correct (/MD) runtime library flag everywhere + + There was a bad mix of LIBCMT (the static runtime lib) and MSVCRT (the dynamic + one) before, because LIBCMT is the default. This specifies /MD everywhere. + + Makefile.win32 | 3 ++- + boilerplate/Makefile.win32 | 2 +- + pixman/src/Makefile.win32 | 2 +- + src/Makefile.win32 | 4 ++-- + test/Makefile.win32 | 6 ++---- + 5 files changed, 8 insertions(+), 9 deletions(-) + +commit d78fd375d3f99a5bb4a4799ce5d90a2a946a854c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 22:18:47 2006 -0700 + + [win32] Makefile.win32: fix test and add html targets + + Add html target to toplevel and test/ Makefile.win32 + + Makefile.win32 | 13 ++++++++++++- + test/Makefile.win32 | 10 ++++++++++ + 2 files changed, 22 insertions(+), 1 deletion(-) + +commit 5ab72579ef2a9fce1aedf3068825ccba683b6e79 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 19:52:48 2006 -0700 + + Correctly acquire/release mutex in _cairo_scaled_font_map_destroy + + _cairo_scaled_font_map_destroy needs to both lock/unlock the mutex, + not just unlock it. + + src/cairo-scaled-font.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit d3076a1843bc2f05bab0df913d0c27f125bea162 +Merge: dfe3e20 78b8555 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 18:57:57 2006 -0700 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo into cairo-master + +commit dfe3e20a4a44db71270dd50b2e4bac84ff97dbb8 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 18:56:58 2006 -0700 + + [win32] Fix boilerplate for win32 surfaces to use new _with_dib function + + Create test surfaces for win32 using _with_dib instead of creating the + dib locally; also test CONTENT_COLOR and CONTENT_COLOR_ALPHA. + + boilerplate/cairo-boilerplate.c | 46 ++++++++++------------------------------- + 1 file changed, 11 insertions(+), 35 deletions(-) + +commit 9735cb9a246627c9e4710c0f7d2955e3e0fbec69 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 18:55:46 2006 -0700 + + Improve make-html.pl, add self-contained output format + + Setting CAIRO_TEST_SHOW_INLINE in the environment before running + make-html.pl will generate a html file with all the logs and necessary + images inlined as data URI's. + + test/make-html.pl | 100 +++++++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 81 insertions(+), 19 deletions(-) + +commit 78b8555c9a7181ebee59a6fbdefe671d97dc9535 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 17:31:49 2006 -0700 + + perf: Don't skip COLOR tests + + perf/cairo-perf.c | 2 -- + 1 file changed, 2 deletions(-) + +commit d3a5d90665f82dd7a58bc22ccede6f2c73d0f900 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 17:31:19 2006 -0700 + + boilerplate-xlib: New perf-specific surface creation for xlib backend. + + When testing the xlib backend do different things for TEST vs. PERF: + + TEST: Always use pixmap, call Xsynchronize. + + PERF: Use pixmap for COLOR_ALPHA and DefaultVisual window for COLOR. + + boilerplate/cairo-boilerplate.c | 137 +++++++++++++++++++++++++++++++--------- + 1 file changed, 106 insertions(+), 31 deletions(-) + +commit aeca64f6cdbf6af154a4fb8b19cb40ee0ecd0bd8 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 16:40:58 2006 -0700 + + boilerplate: Allow targets to distinguish between test and perf. + + Add a new cairo_boilerplate_mode_t so that the boilerplate targets can + do slightly different things if being tested for correctness vs. being + run for performance. + + boilerplate/cairo-boilerplate.c | 143 ++++++++++++++++++++++------------------ + boilerplate/cairo-boilerplate.h | 16 +++-- + perf/cairo-perf.c | 1 + + test/cairo-test.c | 1 + + 4 files changed, 91 insertions(+), 70 deletions(-) + +commit 97f26c523590dcb208a7c0e4d00fd66f4ca58605 +Merge: 0e59041 416e945 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 17:09:03 2006 -0700 + + Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo into cairo-master + +commit 0e59041321e49e1eae330567e0c7d27e7d71699d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 17:08:18 2006 -0700 + + [win32] win32-specific Makefiles for building with MSVC + + This patch adds a bunch of makefiles for building cairo with Visual C++. + gnu make is still required, and make must be run from a command prompt + that has the Visual C++ paths set up, as well as has the cygwin environment + in the path. Run 'make -f Makefile.win32'. + + Makefile.win32 | 18 ++++++++ + boilerplate/Makefile.win32 | 18 ++++++++ + pixman/src/Makefile.win32 | 34 ++++++++++++++ + src/Makefile.win32 | 107 +++++++++++++++++++++++++++++++++++++++++++++ + test/Makefile.win32 | 102 ++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 279 insertions(+) + +commit 3c5a02c3edf300494cebfe746292b1eeeea08595 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 17:06:21 2006 -0700 + + [win32] Misc win32 compilation fixes + + Fix win32/MSVC defines for snprintf, inline, and M_PI + + src/cairoint.h | 5 +++++ + test/cairo-test.h | 6 ++++++ + 2 files changed, 11 insertions(+) + +commit dbd0fa193c77a6cb112b4862c72c3a18209a755e +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Sep 9 17:05:00 2006 -0700 + + [win32] Make cairo as a win32 static library possible + + This adds a win32 initialization function that is called from all + surface creation and font creation functions to ensure that the win32 + mutexes are initialized. + + src/cairo-win32-font.c | 10 ++++++++++ + src/cairo-win32-private.h | 3 +++ + src/cairo-win32-surface.c | 29 ++++++++++++++++++++++++----- + 3 files changed, 37 insertions(+), 5 deletions(-) + +commit 416e94532b1584b2ff23dd270c70ab900d55c326 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 16:04:19 2006 -0700 + + test/bitmap-font: Fix arguments to FcFreeTypeQuery to avoid warnings. + + test/bitmap-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a37e6675333da8f0c5ebe4b8d199f74b8ec30b43 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 16:03:41 2006 -0700 + + Use unsigned consistently to avoid compiler warning. + + boilerplate/cairo-boilerplate.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 195fd5cde610377ffb34c98fed308b2e4d881cbc +Author: Carl Worth <cworth@cworth.org> +Date: Sat Sep 9 14:55:57 2006 -0700 + + boilerplate: Rename cairo_test_target_t to cairo_boilerplate_target_t + + boilerplate/cairo-boilerplate.c | 4 ++-- + boilerplate/cairo-boilerplate.h | 18 +++++++++--------- + perf/cairo-perf.c | 12 ++++++------ + test/cairo-test.c | 28 ++++++++++++++-------------- + 4 files changed, 31 insertions(+), 31 deletions(-) + +commit 99360bd35d77e1a3f536e72f5729455580c980c2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 8 15:12:07 2006 -0400 + + cairo_show_glphs: Mark glyphs argument as const. + + src/cairo-gstate.c | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 2 +- + src/cairoint.h | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit c475d2ca69fa8fbdf1c50f1d5d1b6b558b8fd6cd +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 17:46:21 2006 -0700 + + Fix bitmap-font test failure by not generating a type1 font for a bitmap font. + + This was simply a matter of ensuring that the UNSUPPORTED + return value was checked for and propagated all the way + out of cairo-type1-fallback.c + + src/cairo-type1-fallback.c | 35 ++++++++++++++++++++++++----------- + 1 file changed, 24 insertions(+), 11 deletions(-) + +commit f6bd76a4b26848fb5cc8e40e65f4393d3bd684ae +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 17:36:36 2006 -0700 + + type1: Enforce pre-allocation usage and fail-proof behavior of charstring_encode functions + + These functions were previously returning a status value that + was almost never being checked. Instead we now make these + functions void and enforce a usage pattern that the destination + array must be pre-grown to accomodate the results. This is + verified with a couple of assert statements. + + The pre-allocation was already happening with all but one call. + That call is now also fixed up. + + src/cairo-type1-fallback.c | 49 +++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 42 insertions(+), 7 deletions(-) + +commit 942cd2e026431bd5ae347c264fb3a0469eb53cf4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 17:33:35 2006 -0700 + + Add _cairo_array_size to allow querying the allocated size + + src/cairo-array.c | 12 ++++++++++++ + src/cairoint.h | 3 +++ + 2 files changed, 15 insertions(+) + +commit 8796b19b5d2e203f5f8724cef1d3ae8d2d02fc85 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 17:09:37 2006 -0700 + + cairo-type1-fallback.c: Regularize some whitespace. + + src/cairo-type1-fallback.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 8364251db55c2451eca9b8162aa32ae00f433251 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 17:07:54 2006 -0700 + + cairo_type1_font_create: Fix missing NO_MEMORY check and cleanup style. + + src/cairo-type1-fallback.c | 42 +++++++++++++++++++++++++++--------------- + 1 file changed, 27 insertions(+), 15 deletions(-) + +commit 75ac7ee171d4bbe2b590e444bde9eb95138a2452 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 16:54:31 2006 -0700 + + Remove font->status from cairo_type1_font_t + + This object doesn't act like a status-holding object, (there are no + "if (status) return;" inertness-enforcing statements for example), + so it shouldn't pretend like it is. + + src/cairo-type1-fallback.c | 76 +++++++++++++++++++++++----------------------- + 1 file changed, 38 insertions(+), 38 deletions(-) + +commit c28c33a5888bc1ec4ce2067a7215b7f74d4323d1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 16:42:04 2006 -0700 + + Check status value of output_stream object at time of destroy + + src/cairo-ps-surface.c | 2 ++ + src/cairo-type1-fallback.c | 4 +++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 179f7defdffb254936592a02208c338c13466253 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 16:10:40 2006 -0700 + + Use new return value from _cairo_output_stream_destroy + + This is a little simpler than the old idiom of calling + _cairo_output_stream_get_status just before calling + _cairo_output_stream_destroy. + + I had hoped this technique would apply in more cases, but + many cases want to separate the two actions anyway to do + conditional assignment of the status value, (in order to + not overwrite an earlier error value). + + src/cairo-pdf-surface.c | 3 +-- + src/cairo-svg-surface.c | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 89e7d5d4208bd943c884d4261dc7484ac654132c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 16:01:07 2006 -0700 + + Make _cairo_output_stream_destroy return the stream's status as a last gasp. + + src/cairo-output-stream-private.h | 12 +++++++++--- + src/cairo-output-stream.c | 26 ++++++++++++++++---------- + 2 files changed, 25 insertions(+), 13 deletions(-) + +commit 3a92ab69c89d227bdfbb1bd5d609b83a59fc013f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 7 13:09:25 2006 -0700 + + test: Report details errors when image output files cannot be found. + + test/buffer-diff.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit d598cd8d61863ff91f505241a773595aec7e8445 +Author: Nicholas Miell <nmiell@gmail.com> +Date: Wed Sep 6 15:45:00 2006 -0700 + + Fix the AMD64 final link by removing SLIM from pixman + + In order for SLIM's PLT indirection avoidance to work, everything in + the library that makes internal function calls needs to see the + relevant slim_hidden_proto() macro in addition to the function's + prototype. However, external headers used by clients of the shared + library should not use the SLIM macros at all. + + Pixman is a rather odd case -- it's mostly independent from cairo, so + it has it's own public interface, but it's built as a part of cairo + instead of its own shared library. This means that cairo would need to + see all of pixman's slim_hidden_proto() macros in order to function + and it doesn't currently, which results in a link failure on AMD64 + systems and on i386 systems (I think, I haven't actually verified + this) it produces a shared object that isn't actally sharable. + + I have no idea why exactly the link failure only showed up as a result + of commit e06246b9b1015eb89112f628d5820fcb350a7335. I think it has + something to do with the pixman functions no longer having PLT entries + at all, but the exact interaction isn't clear to me. + + However, all of these pixman functions aren't part of the cairo ABI + (which is why they were marked pixman_private in the first place), + which means that the SLIMification of pixman is largely pointless -- + they aren't externally visible, so they don't need PLT entries at + all. Furthermore, while pixman may eventually be shared among cairo + and X, I'm told that this sharing will be source-level only, which + means it won't ever be an actual shared library and thus won't ever + need SLIM at all. + + So, I just removed all use of SLIM in pixman (leaving behind + slim_internal.h for the future edification of anyone who cares).This + fixes the AMD64 link failure and passes the check-plt & check-def + parts of make check. + + Signed-off-by: Nicholas Miell <nmiell@gmail.com> + + pixman/src/fbpict.c | 1 - + pixman/src/iccolor.c | 1 - + pixman/src/icformat.c | 1 - + pixman/src/icimage.c | 4 ---- + pixman/src/icint.h | 13 ------------- + pixman/src/icrect.c | 1 - + pixman/src/pixregion.c | 8 -------- + 7 files changed, 29 deletions(-) + +commit 203d70a562ce3ffca51069aecda01a9f2bb61ff5 +Author: Nicholas Miell <nmiell@gmail.com> +Date: Wed Sep 6 14:43:44 2006 -0700 + + Make the SLIM macros robust in the face of macro-renamed symbols + + This doesn't actually fix the AMD64 link failure, but it does make the + foo/EXT_foo/INT_foo symbol names generated by the slim_hidden_proto() + and slim_hidden_def() macros consistent in the face of the meddling of + pixman-remap.h. + + Signed-off-by: Nicholas Miell <nmiell@gmail.com> + + pixman/src/slim_internal.h | 5 +++-- + src/cairoint.h | 5 +++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit 404e88ea6a08371280fb9fbc1f903e16ac868bf4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 17:46:29 2006 -0400 + + configure.in: Require automake version 1.9 here too + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8a25471c2535206343e46ea90ac8875fed948363 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 14:19:32 2006 -0700 + + autogen.sh: Require automake version 1.9 + + This is the first version of automake to support a slash in SUBDIRS, (as + used by the recent addition of cairo/boilerplate). Thanks to Frederic Peters + for pointing this out (fixes bug #8152). + + autogen.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b5a64138bb9be97b96e6bf248c559e8d3c6d4ac1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 16:39:18 2006 -0400 + + [x86-64] check-plt.sh: match on JU?MP_SLO as on x86-64 "SLOT" is truncated + + src/check-plt.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e25add77df1cc6c89ded371f7f63b36073cb1389 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 13:58:31 2006 -0400 + + Add + + boilerplate/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit cd1b6650648b5a688b4b6c2d696d9434c824a13f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 13:54:12 2006 -0400 + + Add scripts to sanity check the shared object for exported and PLT symbols + + src/check-def.sh checks that the list of symbols exported is the same as the + list of symbols in cairo.def, ie. symbols in public header files. (except for + symbols starting with _cairo) + + src/check-plt.sh checks that no PLT entries exist for local function calls. + This makes sure we keep the 'slim' annotations uptodate. + + These two are defined as tests in src/ and will be run during "make distcheck". + However, they are skipped if the commands 'nm' and 'readelf' are not found. + (We don't really rely on any functionality of eu-readelf, so using readelf + proper which should be more commonlly installed.) + + RELEASING | 36 +++++++----------------------------- + src/Makefile.am | 3 +++ + src/check-def.sh | 31 +++++++++++++++++++++++++++++++ + src/check-plt.sh | 17 +++++++++++++++++ + 4 files changed, 58 insertions(+), 29 deletions(-) + +commit 3d398b1a214a4e30806773a5198db0dace061608 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 13:49:53 2006 -0400 + + [test/Makefile] Unset DIST_SUBDIRS + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit c4d863afad7f45a0360c732b5b6d1c29064dc1f5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 13:49:27 2006 -0400 + + [perf/Makefile] Unset DIST_SUBDIRS + + perf/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6b377b62ac45b92e08e7dee2378d50d87f0ab410 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 13:49:02 2006 -0400 + + Update + + perf/.gitignore | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94c361cd2a775a94a6e770ea81f6e81edf6165b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 13:47:37 2006 -0400 + + [Makefile] Add perf to DIST_SUBDIRS + + Makefile.am | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 8c9ea020cab66c9f133571db2b56f96d4c28cdbd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 6 12:45:07 2006 -0400 + + [Makefile] Fix typo + + boilerplate/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a7844338da31785e8bc4261feaf4ea16adc6abdb +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 05:17:01 2006 -0700 + + perf: Add tessellate test case (in -16, -64, and -256 varieties) + + perf/.gitignore | 1 + + perf/Makefile.am | 3 +- + perf/cairo-perf.c | 3 + + perf/cairo-perf.h | 3 + + perf/tessellate.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 175 insertions(+), 1 deletion(-) + +commit 221c02098f81d16b642693356afb1f4cf7fca5fd +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 05:09:19 2006 -0700 + + perf: Allow CAIRO_TEST_TARGET to limit targets tested. + + Also, don't print the image size for a test if there is only one. + + perf/cairo-perf.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit b866069210e2a86ab54770b3c762c8f31b75a55e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 05:07:08 2006 -0700 + + perf: Handle 32-bit wraparound of performance counter + + perf/cairo-perf-posix.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit b64645c567182795b050f909673aea523ae6f505 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 03:32:07 2006 -0700 + + perf: Fix cairo_perf_ticks_per_second to avoid wraparound + + perf/cairo-perf-posix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d9082d59db90a4373ec52d932b87234e3c39b21b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 01:37:13 2006 -0700 + + Prefer CPU performance counters (if available) over gettimeofday. + + I've seen this improve the std. deviation often by a factor of 2 + and occasionally up to a factor of 10. It is sometimes not much + better, but never seems to be appreciably worse compared to using + gettimeofday. + + Thanks to David A. Schleef <ds@schleef.org> and his liboil for + the implementation. + + perf/cairo-perf-posix.c | 124 ++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 116 insertions(+), 8 deletions(-) + +commit 1085d99bc3c2f12ae37be0489deedac2475ab376 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 00:56:56 2006 -0700 + + perf/README: Update due to cairo_perf_timer API changes + + perf/README | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +commit 3c407aa80a43e1724e732482ada5ad6718fe33ae +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 00:53:52 2006 -0700 + + perf-paint: Spend more iterations on smaller sizes to balance testing. + + The values here are chosen to try to equalize the standard deviation + of the various tests. + + perf/paint.c | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 3519887f1838a8ea67784eecec31feb9a37b4828 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 00:52:06 2006 -0700 + + perf: Move sorting and discarding outside of compute_stats. Adjust discard to slowest 15% only. + + perf/cairo-perf.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit d31037e421e275cd1d6d1440d6b5bdb817f992bc +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 6 00:15:49 2006 -0700 + + perf: Report times not rates. Interface in integers not doubles. + + boilerplate/cairo-boilerplate.h | 31 +++++++++++++++++++++++++++++++ + perf/cairo-perf-posix.c | 15 ++++++++++----- + perf/cairo-perf-win32.c | 12 ++++++++---- + perf/cairo-perf.c | 23 ++++++++++++----------- + perf/cairo-perf.h | 12 +++++++++--- + perf/paint.c | 8 ++++---- + 6 files changed, 74 insertions(+), 27 deletions(-) + +commit 9d0d38e0a0307580ba69a96e239507cc9559cd99 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 22:58:33 2006 -0700 + + perf: Rename functions in line with cairo's naming guidelines + + perf/cairo-perf-posix.c | 24 ++++++++++++------------ + perf/cairo-perf-win32.c | 20 ++++++++++---------- + perf/cairo-perf.c | 2 +- + perf/cairo-perf.h | 10 ++++------ + perf/paint.c | 6 +++--- + 5 files changed, 30 insertions(+), 32 deletions(-) + +commit 9f51fcc888c4b036c535a6a4042ae8c6859f3261 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 22:53:12 2006 -0700 + + perf: Fold cairo-perf-timer.h into cairo-perf.h + + perf/Makefile.am | 4 +-- + perf/cairo-perf-posix.c | 74 +++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf-timer-posix.c | 74 ------------------------------------------- + perf/cairo-perf-timer-win32.c | 71 ----------------------------------------- + perf/cairo-perf-timer.h | 51 ----------------------------- + perf/cairo-perf-win32.c | 71 +++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf.h | 18 ++++++++++- + 7 files changed, 164 insertions(+), 199 deletions(-) + +commit 499a3a7c4772bb0f446f89a9c6e9430bd31c1218 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 22:50:25 2006 -0700 + + perf: Remove unused alarm functions + + perf/cairo-perf-timer-posix.c | 29 ----------------------------- + perf/cairo-perf-timer-win32.c | 20 -------------------- + perf/cairo-perf-timer.h | 10 ---------- + perf/cairo-perf.c | 2 -- + perf/cairo-perf.h | 2 -- + 5 files changed, 63 deletions(-) + +commit df8cc10073b0cacd198eda5a24f2b2f61a0a7085 +Author: Benjamin Otte <in7y118@public.uni-hamburg.de> +Date: Tue Sep 5 22:48:38 2006 -0700 + + perf: Make cairo_perf_timer structure private. Make timer functions void. + + perf/cairo-perf-timer-posix.c | 22 +++++++++++++++------- + perf/cairo-perf-timer-win32.c | 20 ++++++++++++++------ + perf/cairo-perf-timer.h | 17 ++++------------- + perf/paint.c | 7 +++---- + 4 files changed, 36 insertions(+), 30 deletions(-) + +commit 1bb6f9fb10dfdb59779ec159569ed6a44c4e8e5f +Author: Benjamin Otte <in7y118@public.uni-hamburg.de> +Date: Tue Sep 5 22:36:56 2006 -0700 + + perf: Add yield and fix double comparison + + - add a yield () function that's called before every test. It reduced the std + dev slightly for me + - fix double comparisons to not just compare the integer part + + perf/cairo-perf-timer-posix.c | 12 ++++++++++++ + perf/cairo-perf-timer-win32.c | 7 +++++++ + perf/cairo-perf-timer.h | 5 +++++ + perf/cairo-perf.c | 10 ++++++++-- + 4 files changed, 32 insertions(+), 2 deletions(-) + +commit bcb7863f00b4cfdf0985993067fc32d07b81540b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 22:25:21 2006 -0700 + + Move target tolerance to cairo_test_target structure (should let single-pixel SVG errors pass) + + Previously we were setting the target tolerance based on the surface + type. But that doesn't work as multiple backends will provide a surface + of type meta. So instead we put the tolerance as a value in the + cairo_test_target data structure. + + With this change, some single-pixel errors of 1 in the SVG backend + should now be ignored. + + boilerplate/cairo-boilerplate.c | 68 +++++++++++++++++++++++------------------ + boilerplate/cairo-boilerplate.h | 1 + + test/cairo-test.c | 40 +----------------------- + 3 files changed, 40 insertions(+), 69 deletions(-) + +commit 4620b929ae84dfa08c1c9a4072e114f6b38e1bd9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 17:12:43 2006 -0700 + + RELEASING: Add note on checking for local symbol PLT entries. + + RELEASING | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +commit 60c4add26abe6b624d7569f35fa846d529ccea18 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 16:52:34 2006 -0700 + + slim_hidden_proto: Move smeicolon from definition to use for consistency and legibility + + src/cairo-ft-private.h | 6 +- + src/cairo-xlib-private.h | 2 +- + src/cairoint.h | 166 ++++++++++++++++++++++---------------------- + src/test-fallback-surface.c | 2 +- + 4 files changed, 88 insertions(+), 88 deletions(-) + +commit d7f08794ef194d0b86a749381472bfeb0a32d993 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 16:48:49 2006 -0700 + + Add many missing slim_hidden calls to bypass PLT entries for local use of public functions + + src/cairo-font-options.c | 9 +++++ + src/cairo-font.c | 2 ++ + src/cairo-ft-font.c | 3 ++ + src/cairo-ft-private.h | 7 ++-- + src/cairo-image-surface.c | 4 +++ + src/cairo-matrix.c | 1 + + src/cairo-pattern.c | 8 +++++ + src/cairo-png.c | 1 + + src/cairo-scaled-font.c | 9 +++++ + src/cairo-surface.c | 10 ++++++ + src/cairo-xlib-private.h | 7 ++++ + src/cairo-xlib-surface.c | 1 + + src/cairo.c | 12 +++++++ + src/cairoint.h | 84 +++++++++++++++++++++++++++++++++++++-------- + src/test-fallback-surface.c | 3 ++ + 15 files changed, 145 insertions(+), 16 deletions(-) + +commit e06246b9b1015eb89112f628d5820fcb350a7335 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 5 16:45:01 2006 -0700 + + pixman: Add pixman_private decorations to hide pixman symbols from public interface + + pixman/src/fbmmx.h | 21 ++++++++++ + pixman/src/icimage.h | 2 +- + pixman/src/pixman.h | 108 ++++++++++++++++++++++++++---------------------- + pixman/src/renderedge.h | 10 ++--- + 4 files changed, 85 insertions(+), 56 deletions(-) + +commit d716020db272839717ff71d91534f3125029b47a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 5 15:57:47 2006 -0400 + + Generate Type 1 fonts from glyph outlines + + This patch generates Type 1 fonts for the PS/PDF backends when TrueType + or Type 1 subsetting fails. This has the advantage over the current + Type 3 fallback of reduced font size and better quality rendering + in some PDF viewers. xpdf shows a large improvement in text display + quality with this patch. + + src/Makefile.am | 1 + + src/cairo-pdf-surface.c | 93 +++-- + src/cairo-ps-surface.c | 32 ++ + src/cairo-scaled-font-subsets-private.h | 31 ++ + src/cairo-type1-fallback.c | 682 ++++++++++++++++++++++++++++++++ + 5 files changed, 809 insertions(+), 30 deletions(-) + +commit ad78eb7692f6d080430bceb7b358403f6e91a637 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 5 14:53:33 2006 -0400 + + Improve error checking in TrueType subsetting + + TrueType subsetting will SEGV when using OpenType fonts with CFF outlines. + + src/cairo-truetype-subset.c | 36 ++++++++++++++++++++++++------------ + 1 file changed, 24 insertions(+), 12 deletions(-) + +commit 49fa8d353b2926760fa92684546b2fc79985c782 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 5 14:19:48 2006 -0400 + + Correct the value of /LastChar in the PDF Type 1 font dictionary. + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d81de15804f210afe9905a4163a5e34ff2be5b5b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 5 14:19:26 2006 -0400 + + Fix Type 1 embedding in PDF + + PDF Files with Type 1 fonts fail to open in any version of + ghostscript prior to 8.54. The problem is the hex encoding of the + encrypted portion of the font. The PDF reference says this should + only be in binary. + + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 4 +++- + src/cairo-type1-subset.c | 11 ++++++----- + 4 files changed, 11 insertions(+), 8 deletions(-) + +commit e5a9c2330867ae11befa8a966aa0a50c31c82a32 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 2 19:51:54 2006 -0400 + + [configure] Invalidate cached warning flags if list of flags changes + + such that one doesn't need to remove config.cache when when we add + new warning flags to be checked. + + configure.in | 34 ++++++++++++++++++++++++---------- + 1 file changed, 24 insertions(+), 10 deletions(-) + +commit 7c97a787ebce4880d6b9fe47a13ad018ff2ecd31 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Sep 1 16:10:25 2006 -0700 + + bug 8104: Eliminate unused variables. Replicate assert statement to identify branch of interest. + + src/cairo-ft-font.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 0a1aef157ef6cfea8608e7d037583c29cb2da5fe +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 18:25:04 2006 -0700 + + perf/README: Fix typo + + perf/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 91d55417053d3c0b615787432ff0a618e76f864f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 18:11:25 2006 -0700 + + perf: Add README file explaining how to add a new test + + perf/README | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 92 insertions(+) + +commit 2fa0228d63713f6274ca3228f236f1ee362ba11f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 17:43:40 2006 -0700 + + Two big improvements to bring the std. deviation down to where we want it. + + 1. Remove all the alarm/signal code, which just isn't doing what we want for some reason. + Instead, for now we'll simply run for a fixed number of iterations, (perhaps we + can tune that per test later). + + 2. Before computing mean and stdandard deviation of runs, sort them all and discard the + top and bottom 20% of the values. + + Now the standard deviation for the paint test is generally 2% or less. + + perf/cairo-perf.c | 29 +++++++++++++++++++---------- + perf/cairo-perf.h | 30 ------------------------------ + perf/paint.c | 12 +++++++----- + 3 files changed, 26 insertions(+), 45 deletions(-) + +commit 6ae6d91c0c3a2f8fdff39c1c84fbef3aa45bf958 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 14:08:43 2006 -0700 + + perf: Switch from alarm to setitimer for more fine-grained control of timers + + perf/cairo-perf-timer-posix.c | 17 +++++++++++++++-- + perf/cairo-perf-timer-win32.c | 2 +- + perf/cairo-perf-timer.h | 2 +- + perf/cairo-perf.c | 4 ++-- + perf/cairo-perf.h | 2 +- + 5 files changed, 20 insertions(+), 7 deletions(-) + +commit 2ebb9af4346c5e60d2497cfb9c5809d0c8045878 +Author: Benjamin Otte <in7y118@public.uni-hamburg.de> +Date: Thu Aug 31 13:30:10 2006 -0700 + + boilerplate: Fix compilation for glitz. + + boilerplate/Makefile.am | 14 ++++++++++++++ + boilerplate/cairo-boilerplate.c | 1 + + test/Makefile.am | 13 ------------- + 3 files changed, 15 insertions(+), 13 deletions(-) + +commit 19a5b8b9b53219dc8ae508a2fcd7b2ca617bc9b8 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 13:22:17 2006 -0700 + + perf: Run for multiple iterations and print std. deviation + + perf/cairo-perf.c | 61 ++++++++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 49 insertions(+), 12 deletions(-) + +commit 689e9c446eb0ec69cb560fa44f4a1f6a0b28cb17 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 12:34:21 2006 -0700 + + perf: Add indication of content to output + + perf/cairo-perf.c | 23 +++++++++++++++++++++-- + 1 file changed, 21 insertions(+), 2 deletions(-) + +commit 7917e1201fd38089111bb7723256747ae32347e0 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:53:16 2006 -0700 + + perf: Fix typo in backend blackballing so that image tests now run + + perf/cairo-perf.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0c741675e1d43168f42ee530486bfa4b8ec54920 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:51:28 2006 -0700 + + Make perf interface return a rate. Start print target and test names. + + perf/cairo-perf.c | 18 ++++++++++++------ + perf/cairo-perf.h | 4 ++-- + perf/paint.c | 12 ++++++------ + 3 files changed, 20 insertions(+), 14 deletions(-) + +commit fd13e874a778eeac4e2d358cc19b040aa20bcdf3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:42:51 2006 -0700 + + perf: Drop separate setup function from each test case. + + We are already doing loop measurement internally, so each function + can already do any setup it needs without it affecting the measurement. + + perf/cairo-perf.c | 6 ++---- + perf/cairo-perf.h | 3 +-- + perf/paint.c | 31 ++++++++++++++++++------------- + 3 files changed, 21 insertions(+), 19 deletions(-) + +commit 578b74473de4c70f907db38eac6f8e9039d72aa1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:31:21 2006 -0700 + + perf: More consistency improvements for names. + + Rename bench_timer_t to cairo_perf_timer_t. + Rename PERF_LOOP macros to CAIRO_PERF_LOOP + Rename DECL_PERF_FUNC to CAIRO_PERF_DECL + + perf/cairo-perf-timer-posix.c | 6 +++--- + perf/cairo-perf-timer-win32.c | 6 +++--- + perf/cairo-perf-timer.h | 17 ++++++++++++++--- + perf/cairo-perf.h | 27 ++++++++------------------- + perf/paint.c | 8 ++++---- + 5 files changed, 32 insertions(+), 32 deletions(-) + +commit cf75da4842ca1191719e9f100c6af901a14dda5c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:25:04 2006 -0700 + + perf: Rename timer-alarm files to cairo-perf-timer + + perf/Makefile.am | 12 +++---- + perf/cairo-perf-timer-posix.c | 70 +++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf-timer-win32.c | 76 +++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf-timer.h | 54 ++++++++++++++++++++++++++++++ + perf/cairo-perf.h | 2 +- + perf/timer-alarm-posix.c | 70 --------------------------------------- + perf/timer-alarm-win32.c | 76 ------------------------------------------- + perf/timer-alarm.h | 54 ------------------------------ + 8 files changed, 207 insertions(+), 207 deletions(-) + +commit 7ad6e941017e070bf7d93afba4de5c49cd1ff533 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 31 14:21:51 2006 -0400 + + [test] Use FcFreeTypeQuery + + test/bitmap-font.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 7f6e901a236ed267d396310fc56fa6bde697bfa2 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:19:48 2006 -0700 + + perf: More simplification of PERF_LOOP macros. + + Here we drop both the start_timing and stop_timing functions, + foliding their contents into main, PERF_LOOP_INIT and + PERF_LOOP_FINI. + + perf/cairo-perf.c | 23 ++++------------------- + perf/cairo-perf.h | 28 +++++++++++++--------------- + 2 files changed, 17 insertions(+), 34 deletions(-) + +commit b9f629d54239c43eef4746293bcffd58ada442f2 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 11:02:20 2006 -0700 + + perf: Don't require a separate counter from the timer for perf loops. + + perf/cairo-perf.c | 14 ++++-------- + perf/cairo-perf.h | 58 ++++++++++++++++++++++++++++-------------------- + perf/paint.c | 7 +++--- + perf/timer-alarm-posix.c | 4 ++-- + perf/timer-alarm-win32.c | 6 ++--- + perf/timer-alarm.h | 11 --------- + 6 files changed, 46 insertions(+), 54 deletions(-) + +commit 13bcba68ae6f0d29b82def09e7a6e356266dc2e7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 10:39:24 2006 -0700 + + perf: Collapse timing.[ch] down into cairo-perf.[ch] + + perf/Makefile.am | 2 -- + perf/cairo-perf.c | 40 +++++++++++++++++++++++----- + perf/cairo-perf.h | 49 +++++++++++++++++++++++++++++----- + perf/paint.c | 1 - + perf/timer-alarm-posix.c | 2 +- + perf/timer-alarm-win32.c | 3 --- + perf/timing.c | 56 --------------------------------------- + perf/timing.h | 68 ------------------------------------------------ + 8 files changed, 77 insertions(+), 144 deletions(-) + +commit a60ed68daebc15e87ededbca80211508f624bcb6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 10:33:24 2006 -0700 + + perf: Remove unused util.c + + perf/util.c | 177 ------------------------------------------------------------ + 1 file changed, 177 deletions(-) + +commit 739c4767673ace4f566d395d770924617ddebaff +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 10:27:20 2006 -0700 + + Initial hookup of Vlad's timer/alarm code + + boilerplate/cairo-boilerplate.h | 1 + + perf/Makefile.am | 9 ++++ + perf/cairo-bench.h | 110 ---------------------------------------- + perf/cairo-perf.h | 6 +-- + perf/paint.c | 9 +++- + perf/timer-alarm-posix.c | 70 +++++++++++++++++++++++++ + perf/timer-alarm-win32.c | 79 +++++++++++++++++++++++++++++ + perf/timer-alarm.h | 65 ++++++++++++++++++++++++ + perf/timing.c | 56 ++++++++++++++++++++ + perf/timing.h | 68 +++++++++++++++++++++++++ + perf/util.c | 12 +++-- + 11 files changed, 364 insertions(+), 121 deletions(-) + +commit 3d279da6214d43de05eba4af381e451cec3cfd72 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Aug 31 09:01:23 2006 -0700 + + Add useful pieces from Vladimir's cairo-bench + + perf/cairo-bench.h | 110 +++++++++++++++++++++++++++++++++ + perf/util.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 285 insertions(+) + +commit 851dd63719d51f9b839784ba2761a1e2b2ecfbe5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 31 13:18:37 2006 -0400 + + [test] Use $(srcdir) to find valgrind supressions + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2c16aa63044afe75c00518c2cb7e5ba6288e905a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 08:53:58 2006 -0700 + + perf: Don't measure meta-surface-backed surface types. + + boilerplate/cairo-boilerplate.h | 3 +++ + perf/.gitignore | 1 - + perf/cairo-perf.c | 37 +++++++++++++++++++++++++++++++++++++ + test/cairo-test.h | 8 -------- + 4 files changed, 40 insertions(+), 9 deletions(-) + +commit 4915e0baa761f1179023f2ad5d5cd3dd6aeaba2f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 08:36:29 2006 -0700 + + boilerplate: Fix missing include of config.h which was preventing many backends from being tested + + boilerplate/cairo-boilerplate.c | 26 +++++++++++++++----------- + boilerplate/cairo-boilerplate.h | 4 ++++ + test/cairo-test.c | 15 --------------- + 3 files changed, 19 insertions(+), 26 deletions(-) + +commit 8d834c3a34a17de0e03841501ea107dee7b373d0 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 08:35:39 2006 -0700 + + Require librsvg >= 2.14.0 to test SVG backend + + configure.in | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit e153c55dffca6b95a8ad9c731156a579f8979f42 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 07:19:05 2006 -0700 + + perf: Add initial skeleton of performance monitoring suite + + Makefile.am | 2 ++ + configure.in | 1 + + perf/.gitignore | 2 ++ + perf/Makefile.am | 26 ++++++++++++++++++++ + perf/cairo-perf.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + perf/cairo-perf.h | 45 ++++++++++++++++++++++++++++++++++ + perf/paint.c | 49 +++++++++++++++++++++++++++++++++++++ + 7 files changed, 197 insertions(+) + +commit d1834cca192fe6f8e429be0461fab6914e04024d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 04:01:10 2006 -0700 + + test: Ignore single-bit errors for SVG backend. + + The interface of the various buffer/image_diff functions is improved to + provide the maximum pixel difference in addition to the number of pixels + that differ. This value can then be used to compare against a per-backend + tolerance. + + Currently I've set the SVG backend's tolerance to 1 to handle some issues + we're currently seeing of single-bit differences on different systems, (but + we're not exactly sure why yet). + + Also I improved the image_diff routines to properly report a status value + on failure rather than the bogus value of -1 for pixels_changed. + + Makefile.am | 2 +- + test/buffer-diff.c | 96 +++++++++++++++++++++++++++++++++-------------------- + test/buffer-diff.h | 63 ++++++++++++++++++++++++++--------- + test/cairo-test.c | 67 ++++++++++++++++++++++++++++++++----- + test/imagediff.c | 19 ++++++++--- + test/xlib-surface.c | 75 +++++++++++++++++++++++------------------ + 6 files changed, 222 insertions(+), 100 deletions(-) + +commit d52a1f762d33f3ada919b581e0d62f8ba1c2314c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 31 01:39:06 2006 -0700 + + Move test-specific stuff out of boilerplate/ and back into test/ + + This now gives us two separate libtool convenience libraries, + so they have to have separate names now: + libcairoboilerplate.la and libcairotest.la. + + boilerplate/Makefile.am | 14 +- + boilerplate/buffer-diff.c | 306 --------------------- + boilerplate/buffer-diff.h | 80 ------ + boilerplate/cairo-test.c | 683 ---------------------------------------------- + boilerplate/cairo-test.h | 136 --------- + boilerplate/xmalloc.c | 6 +- + test/Makefile.am | 13 +- + test/buffer-diff.c | 306 +++++++++++++++++++++ + test/buffer-diff.h | 80 ++++++ + test/cairo-test.c | 683 ++++++++++++++++++++++++++++++++++++++++++++++ + test/cairo-test.h | 136 +++++++++ + 11 files changed, 1225 insertions(+), 1218 deletions(-) + +commit 95475218858792ccb20ac6ad28db22e233c783d7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 30 23:41:48 2006 -0700 + + boilerplate: Remove custom read/write-png code in favor of using cairo surfaces + + Also combine image_diff and image_diff_flattened into a single function + + boilerplate/Makefile.am | 4 - + boilerplate/buffer-diff.c | 260 +++++++++++++++++----------------------- + boilerplate/cairo-boilerplate.c | 2 +- + boilerplate/cairo-boilerplate.h | 10 +- + boilerplate/cairo-test.c | 2 - + boilerplate/read-png.c | 196 ------------------------------ + boilerplate/read-png.h | 45 ------- + boilerplate/write-png.c | 99 --------------- + boilerplate/write-png.h | 35 ------ + test/imagediff.c | 2 - + 10 files changed, 119 insertions(+), 536 deletions(-) + +commit 37ce7058906a9a8c7e80bf4ed59c17ec912087cf +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 30 22:56:36 2006 -0700 + + Separate the sharable stuff out of cairo-test.c into cairo-boilerplate.c + + boilerplate/Makefile.am | 3 +- + boilerplate/cairo-boilerplate.c | 1511 +++++++++++++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.h | 80 +++ + boilerplate/cairo-test.c | 1484 +------------------------------------- + boilerplate/cairo-test.h | 13 +- + 5 files changed, 1607 insertions(+), 1484 deletions(-) + +commit a0ca4369ff71ca76e593ea8db3e728218814814d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 30 22:33:53 2006 -0700 + + Add boilerplate/README explaining its purpose + + boilerplate/README | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 5ef4c991f6ad00a37fc0645a38ba2cb9f832d9f1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 30 15:38:15 2006 -0700 + + test: Add link to test log file in HTML output + + test/make-html.pl | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7f4e83ceeba912167df05f62ddd0798b112979a3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 30 15:34:27 2006 -0700 + + Split libcairotest files out from test/ and into boilerplate/ + + The idea here is to setup boilerplate to allow code sharing between + test/ and the upcoming perf/ + + .gitignore | 5 + + boilerplate/Makefile.am | 35 + + boilerplate/buffer-diff.c | 348 ++++++ + boilerplate/buffer-diff.h | 80 ++ + boilerplate/cairo-test-beos.cpp | 236 ++++ + boilerplate/cairo-test-beos.h | 26 + + boilerplate/cairo-test-directfb.c | 123 +++ + boilerplate/cairo-test-directfb.h | 23 + + boilerplate/cairo-test.c | 2147 +++++++++++++++++++++++++++++++++++++ + boilerplate/cairo-test.h | 143 +++ + boilerplate/read-png.c | 196 ++++ + boilerplate/read-png.h | 45 + + boilerplate/write-png.c | 99 ++ + boilerplate/write-png.h | 35 + + boilerplate/xmalloc.c | 58 + + boilerplate/xmalloc.h | 37 + + configure.in | 1 + + test/Makefile.am | 33 +- + test/buffer-diff.c | 348 ------ + test/buffer-diff.h | 80 -- + test/cairo-test-beos.cpp | 236 ---- + test/cairo-test-beos.h | 26 - + test/cairo-test-directfb.c | 123 --- + test/cairo-test-directfb.h | 23 - + test/cairo-test.c | 2147 ------------------------------------- + test/cairo-test.h | 143 --- + test/read-png.c | 196 ---- + test/read-png.h | 45 - + test/write-png.c | 99 -- + test/write-png.h | 35 - + test/xmalloc.c | 58 - + test/xmalloc.h | 37 - + 32 files changed, 3642 insertions(+), 3624 deletions(-) + +commit a5f068e10d72c20a55d20ca9f79508361d13fb80 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 30 13:17:08 2006 -0400 + + [test] Add 128 to any diff component such that differences are visible + + test/buffer-diff.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 3252ad5ca630fe292babc061c01b8759ef49cde4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 28 22:44:15 2006 -0400 + + [PNG] Mark status volatile to fix gcc warning + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b6e5f2b0fef00352930dfcc47a13f330a13b1d68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 28 22:30:38 2006 -0400 + + [xlib] Bug 7593: rewrite loop to be more readable, and fix warnings + + Basically, it's evil to write a loop like: + + while ((c -= 4) > 0) { + ... + } + + for one reason that doesn't work if c is unsigned. And when c is signed, if + for some reason c is about -MAXINT, then it will overflow and not work as + expected. + + It's much safer (and more gcc warning friendly) to rewrite it as: + + unsigned int c; + + while (c >= 4) { + ... + c -= 4; + } + + src/cairo-xlib-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 06a962886806be5e68061e24223c617980ac8248 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 28 19:00:48 2006 -0700 + + Eliminate conditions checking for unsigned or enum values less than 0. + + src/cairo-array.c | 2 +- + src/cairo-svg-surface.c | 4 ++-- + src/cairoint.h | 3 +-- + 3 files changed, 4 insertions(+), 5 deletions(-) + +commit 7d1399a4bb0d8d74a4294700e6040accccefff2a +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 28 18:58:27 2006 -0700 + + Put static first to avoid compiler warning. + + src/cairo-type1-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1b7ced6614d809262cca08e7c5141b7ce740bfca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 28 18:47:37 2006 -0700 + + Bug #7593: Avoid unsigned loop control variable to eliminate infinite, memory-scribbling loop. + + Behdad chased this bug down when looking into bug #7593. This + bug is what finally motivated us to figure out how to get -Wextra + (for the "always true" comparisons of unsigned variables against + negative values). + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 50003615f28862f68b609aa290ebffee24d5d643 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 28 18:54:35 2006 -0700 + + Add -Wextra (as well as -Wno-missing-field-initializers -Wno-unused-parameter) + + We'd been wanting some of the warnings in -Wextra for a long time, + but we had failed in tryingto squelch some of the undesired warnings. + We finally figured out how to do this correctly by simply ordering + the warnings correctly. + + configure.in | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +commit 5492946b0ced9b3e97f94ef097ee745c8a59df42 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 23 12:29:49 2006 -0400 + + [image] Print out cairo version in the unsupported-format message + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 96c8f92883322a785fa9fa55de93b8eb56afab64 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 22 22:00:58 2006 -0400 + + [test] bufferdiff: take abs of the pixel diffs. Oops! + + test/buffer-diff.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 988b5dcb7e50d9e08ff94cb98f6d9c91915bb9b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 21 23:27:17 2006 -0400 + + [ROADMAP] Remove 1.2.4 stuff out of the way + + ROADMAP | 13 +------------ + 1 file changed, 1 insertion(+), 12 deletions(-) + +commit edf6f24e1b9673655f2b1c6e2060f9f2e46833e9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 21 23:25:40 2006 -0400 + + [TODO] Add cairo_get_scaled_font + + TODO | 1 + + 1 file changed, 1 insertion(+) + +commit 3d6aec7334881168277877e7d69514568d08c322 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 21 23:24:49 2006 -0400 + + [ROADMAP] Add glyph cache inspection to 1.4 roadmap + + ROADMAP | 3 +++ + 1 file changed, 3 insertions(+) + +commit 782e3eb65b143a6e658eda69ba15da3ac432c711 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 21 12:52:56 2006 -0400 + + Get correct unhinted outlines on win32. + + The documentation for GetGlyphOutline() states that outline returned is grid + fitted and if an application requires an unmodified outline it can request an + outline for a font whose size is equal to the font's em unit. + + This seems to suggest that the solution to this bug would be to obtain the + unmodified outline data and scale it to the required size. + + https://bugs.freedesktop.org/show_bug.cgi?id=7603 + + src/cairo-win32-font.c | 86 +++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 61 insertions(+), 25 deletions(-) + +commit 6de226be0e879709c4068cb7836d485e75928287 +Author: Yevgen Muntyan <muntyan@tamu.edu> +Date: Mon Aug 21 03:52:40 2006 -0400 + + Define WINVER if it's not defined. (bug 6456) + + src/cairoint.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6ed1613b5175ea9c431fff2df2cd1cf2e2edbf93 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Aug 20 13:44:56 2006 -0400 + + [Makefile.am] Remove unnecessary parantheses that were causing trouble with old bash + Reported by Tor Lillqvist + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 047251db4337583075f6888fceecfb0c383d658a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 18:30:31 2006 -0700 + + Increment version to 1.2.5 after making the 1.2.4 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 54755b2d9891981d813384bccde84998def96abf +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 18:19:10 2006 -0700 + + Remove stray ] that was breaking RELEASE_OR_PUBLISH and many make targets (release-publish, etc.) + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fadde879fbf8547aaa55e80d21611e7674cd5f8f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 17:36:42 2006 -0700 + + Update version to 1.2.4 and libtool version to 11:2:9. + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 43a25b818749d31268a60e2fcdaa11a73e41f7fd +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 17:35:33 2006 -0700 + + NEWS: Add notes for the 1.2.4 release. + + NEWS | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 68 insertions(+) + +commit 790a359f89303875d58ff514d62ecff981836c86 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 16:46:57 2006 -0700 + + EXTRA_DIST: Add missing source-clip-scale-svg-ref.png + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 4f5bb53032d6d0509ef86bcc152ce2b52be49d38 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 16:35:58 2006 -0700 + + Ignore ChangeLog* in addition to ChangeLog + + .gitignore | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2860af3ce230cde87cc4623d1eb4a920b71bc0d6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 16:35:27 2006 -0700 + + bitmap-font: Add missing pdf-specific reference image + + test/Makefile.am | 3 +-- + test/bitmap-font-pdf-argb32-ref.png | Bin 0 -> 1064 bytes + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit b8b507c0920ddef35363ba1d75e4ba0ca141a028 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 16:12:43 2006 -0700 + + Use &image->base as appropriate to avoid warnings. + + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-svg-surface.c | 6 +++--- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 5f94275a4b667d8b1f41f87f1a6b84b3fa3f0616 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 16:09:53 2006 -0700 + + Update .gitignore due to recent rename. + + test/.gitignore | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d04b8148c2ccf714eb3f31855ca8b61d518423c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 18 18:55:52 2006 -0400 + + [TODO] Add some items from memory + + TODO | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 33b62f47a451cb3ee70e7343976f5d1f06adb443 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 15:08:58 2006 -0700 + + Move unscheduled features and bugs from ROADMAP to TODO + + ROADMAP | 101 ++------------------------------------------ + TODO | 146 ++++++++++++++++++++++++++++++++++++++++++++-------------------- + 2 files changed, 103 insertions(+), 144 deletions(-) + +commit d1be19e1604f77a0a156bea6d40914aa672c6d81 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 15:02:24 2006 -0700 + + Add notes on reporting bugs to BUGS file and move bugs listed there to ROADMAP instead. + + BUGS | 101 +++++++++++++++++++++++++++++++++++++++++----------------------- + ROADMAP | 51 ++++++++++++++++++++++++++++++++ + 2 files changed, 116 insertions(+), 36 deletions(-) + +commit 76fca1898c395a576dadffb35de0253b79b669c5 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 14:30:01 2006 -0700 + + EXTRA_DIST: Add several files to the tar file releases, (BUGS, CODING_STYLE, ROADMAP, etc. + + Makefile.am | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit ab092a9a5db70ac16e782cf0d7d3629cc902cc1e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 14:25:53 2006 -0700 + + ROADMAP: Remove stray conflict marker + + ROADMAP | 1 - + 1 file changed, 1 deletion(-) + +commit 328024cc25cba67c939cf51da6ab6409635fa227 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 14:23:14 2006 -0700 + + ROADMAP: Punt the AIX -lpthread bug off of the 1.2.4 roadmap. + + ROADMAP | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3cf3d4343b6f403b55014f2d259483e1fb688741 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 14:22:08 2006 -0700 + + Mark ft-text-vertical-layout tests as XFAIL since we'repunting these from the 1.2.4 release. + + ROADMAP | 6 +++++- + test/Makefile.am | 2 ++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit ccdaaf7b950ea68c1149e2649e8379e564b636d8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 18 17:18:34 2006 -0400 + + [ROADMAP] Mark xlib detection problem as fixed + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0e78e7144353703cbd28aae6a67cd9ca261f1d68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 18 17:17:28 2006 -0400 + + [configure] Check for x11 pkg-config module before using AC_PATH_XTRA + Fixes bug 7491. + + configure.in | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +commit 0c6c0a9e0b3e8cd1caa25a2ee65b8384840295b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 18 17:02:24 2006 -0400 + + [configure] Use _NONPKGCONFIG_LIBS if no xrender pkg-config modele is found + + configure.in | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 84a9ca1835998a11b78f5989ce927166c2baa00f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 13:07:08 2006 -0700 + + Rename ft-text-vertical-layout-truetype to ft-text-vertical-layout-type3 + + test/Makefile.am | 8 +- + test/ft-text-vertical-layout-truetype-ref.png | Bin 3933 -> 0 bytes + test/ft-text-vertical-layout-truetype-svg-ref.png | Bin 3956 -> 0 bytes + test/ft-text-vertical-layout-truetype.c | 154 ---------------------- + test/ft-text-vertical-layout-type3-ref.png | Bin 0 -> 3933 bytes + test/ft-text-vertical-layout-type3-svg-ref.png | Bin 0 -> 3956 bytes + test/ft-text-vertical-layout-type3.c | 154 ++++++++++++++++++++++ + 7 files changed, 157 insertions(+), 159 deletions(-) + +commit aa2260cfbbf5fd5c923409962814c6795e5ecc41 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 18 15:49:38 2006 -0400 + + [ROADMAP] Add using alloca + + ROADMAP | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9c2d9d590b218db7edd74cb1ab7e24799bbb62eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 18 12:04:16 2006 -0400 + + [test] text-rotate: Update ref images to make image pass again + after the font_options change we made in the test suite a while back. + + test/text-rotate-ref.png | Bin 12446 -> 12300 bytes + test/text-rotate-rgb24-ref.png | Bin 16508 -> 5640 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 861f1cb4f70cdbd7702eaf642b999a21ad01037d +Merge: c2d92d4 fbb1758 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 07:56:52 2006 -0700 + + Merge branch 'jrmuizel-stroking-fixes' into cairo + + Conflicts: + + test/dash-caps-joins-ps-argb32-ref.png + test/degenerate-path-ps-argb32-ref.png + test/degenerate-path.c + +commit c2d92d4397f7ed7a8b7fdfa24a4e339ecb0d6d69 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 06:32:43 2006 -0700 + + ROADMAP: Mark the close path bug as fixed. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c78c0110179f8f832e9096ad5e26f5887100cd59 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 06:31:15 2006 -0700 + + Don't set current point to (0,0) in close_path. + + The setting of current point to (0,0) is actually harmless, but it + definitely looks like a bug, (since after close_path the current point + is really the last move point). + + We don't keep track of last move point here, nor do we even need to. + So we can be consistent with _cairo_path_fixed_close_path by not + adjusting current point at all, (the subsequent move_to coming right + behind the close_path will fix up the current point). + + src/cairo-path-data.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 53f74e59faf1af78f2f0741ccf1f23aa5dad4efc +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 06:27:45 2006 -0700 + + Fix close-path failure by adding explicit move_to after close_path. + + Besides the bug fix, this is a user-visible change since the new + move_to element after the close_path element can be seen in the + results of cairo_copy_path, so we document that here. + + We are also careful to fix up _cairo_path_fixed_line_to to defer to + _cairo_path_fixed_move_to to avoid letting the last_move_point state + get stale. This avoids introducing the second bug that is also tested + by the close-path test case. + + src/cairo-path.c | 15 +++++++++++---- + src/cairo.c | 8 ++++++++ + 2 files changed, 19 insertions(+), 4 deletions(-) + +commit 200a2d811efab2e48d6b584b9da202effaddf99f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 18 06:15:02 2006 -0700 + + close-path: New test case to demonstrate corner case discovered by Tim Rowley + + The bug shows up when doing cairo_copy_path_flat for a path that has + a curve_to immediately after a close_path. When the curve is flattened + the flattener is using (0,0) as the initial point rather than the proper + close_to point. + + This test also serves to ensure a similar bug doesn't crop up when + closing a path that begins with an implicit move_to, (as from cairo_arc). + In that bug the path state may have no last-move-point and the path + is closed to (0,0). This bug is not present currently, but did appear + during the development of a fix for the bug above. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/close-path-ps-argb32-ref.png | Bin 0 -> 311 bytes + test/close-path-ref.png | Bin 0 -> 312 bytes + test/close-path.c | 84 ++++++++++++++++++++++++++++++++++++++ + 5 files changed, 88 insertions(+) + +commit 8330f4dbd123da57850756a194ba9f7558e6f9cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 22:12:21 2006 -0400 + + [ROADMAP] Mark Type1 on win32 as done + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 64dd7a8203b6e393d9f763d49eea6dfb7bd13e0d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 22:10:27 2006 -0400 + + [SVG] Make dependent on --enable-png (and increase cache-version to 2) + + ROADMAP | 2 +- + configure.in | 5 ++++- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 6f8cf53b1e1ccdbe1ab6a275656b19c6e5120e40 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 22:02:02 2006 -0400 + + [test] Don't use signals if signal.h is not available + + configure.in | 2 +- + test/cairo-test.c | 10 ++++++++++ + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 474daa449325850b6427fb0d3fe511ca6d7c12ac +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 22:01:33 2006 -0400 + + [PNG] Include png.h after cairoint.h to avoid macro problems (bug 7744) + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit da1019c9138695cb838a54f8b871bbfd0e8996d7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Aug 17 21:46:38 2006 -0400 + + Only use GGO_GLYPH_INDEX for truetype and opentype fonts on win32. + + src/cairo-win32-font.c | 52 +++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 43 insertions(+), 9 deletions(-) + +commit 9878a033531e6b96b5f27e69e10e90dee7440cd9 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 17:48:40 2006 -0700 + + Add (primitive) bitmap glyph tracing to fix bug #7889 + + ROADMAP | 4 +-- + src/cairo-scaled-font.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 96 insertions(+), 4 deletions(-) + +commit e4e5002c48ec9cea37b4347689f193b54439383e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 17:45:14 2006 -0700 + + bitmap-font: Add cairo_text_path;fill to demonstrate bug #7889 + + test/bitmap-font.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 0bfa6d4f33b8ddb5dc55bbe419c15df4af856ff9 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 15:23:32 2006 -0700 + + Fix assertion failures in bitmap-font test by coercing A8 images to A1 + + There are still some problems in the resulting output: + + PDF: Rotated font ends up being blurry in final PNG (not too important) + PS and SVG: There's an incorrect offset being applied somewhere. + + src/cairo-image-surface.c | 26 ++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 9 ++++++++- + src/cairo-ps-surface.c | 9 ++++++++- + src/cairo-svg-surface.c | 10 +++++++++- + src/cairoint.h | 4 ++++ + 5 files changed, 55 insertions(+), 3 deletions(-) + +commit e8e7ccf602fdaa2f2e98743f96589f5b7b3faf17 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 13:54:06 2006 -0700 + + Add rotation to bitmap-font to demonstrate failure of bug #7888 + + test/bitmap-font-ref.png | Bin 552 -> 950 bytes + test/bitmap-font-rgb24-ref.png | Bin 513 -> 890 bytes + test/bitmap-font.c | 11 ++++++++++- + 3 files changed, 10 insertions(+), 1 deletion(-) + +commit 751ff78ff2acba36614bae17744427c385413264 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 20:50:24 2006 -0400 + + [ROADMAP] Add close_path behavior to 1.2.4. + + ROADMAP | 1 + + 1 file changed, 1 insertion(+) + +commit d7b52a8f448e39518a03b92acdf5db10c5527669 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 16:14:21 2006 -0700 + + Add long-lines to the XFAIL list, (we're not fixing it before 1.2.4) + + test/Makefile.am | 1 + + test/long-lines.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 74f6afcdd694d679535d28835740469a08f8ef72 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 16:11:58 2006 -0700 + + ROADMAP: Add fix of EXTEND_PAD and deprecation of FORMAT_RGB16_565 to 1.4 roadmap. + + ROADMAP | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 75b9395d0744ff77da588a101271ff765a177b27 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 13:47:32 2006 -0700 + + ROADMAP: Note that source-clip-scale is fixed + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ccf60202d32aa6ade83231e7255ca20e38f216be +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 13:34:26 2006 -0700 + + Add SVG-specific reference image for source-clip-scale test + + The difference here is that the SVG backend uses a meta-surface for + its similar surface, so there are no rasterization/filtering + artefacts when scaling the source surface. + + test/source-clip-scale-svg-ref.png | Bin 0 -> 119 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 72e25648c4c4bc82ddd938aa4e05887a293f0d8b +Author: Vladimir Vukicevic <vladimirv@gmail.com> +Date: Thu Aug 17 13:28:58 2006 -0700 + + pixman: Use pSourceClip rather than pCompositeClip when fetching + + This fixes the source-clip-scale test failures for most backends. + + pixman/src/fbcompose.c | 38 +++++++++++++++++++------------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +commit 64d2feb9f62d32f8189ea6a43420782e0c4a9373 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 17 10:37:46 2006 -0700 + + Harmonize implementations of source-clip and source-clip-scale to make similarities more evident. + + test/.gitignore | 1 + + test/source-clip-ref.png | Bin 180 -> 133 bytes + test/source-clip-scale-ref.png | Bin 243 -> 161 bytes + test/source-clip-scale.c | 56 +++++++++++++++++------------------------ + test/source-clip.c | 38 +++++++++++++--------------- + 5 files changed, 42 insertions(+), 53 deletions(-) + +commit 524507c39f2f495af426a8c41c6311efe3eb633f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 16 16:18:18 2006 -0700 + + Rename src-clip test to source-clip-scale + + test/Makefile.am | 3 +- + test/source-clip-scale-ref.png | Bin 0 -> 243 bytes + test/source-clip-scale.c | 100 +++++++++++++++++++++++++++++++++++++++++ + test/src-clip-ref.png | Bin 243 -> 0 bytes + test/src-clip.c | 100 ----------------------------------------- + 5 files changed, 102 insertions(+), 101 deletions(-) + +commit afb50580ce0eaefe466ff63a2e0e597f35317f6b +Author: Vladimir Vukicevic <vladimirv@gmail.com> +Date: Wed Aug 16 16:04:24 2006 -0700 + + Add src-clip test case to demonstrate bug with clipping applying to a source surface. + + test/Makefile.am | 1 + + test/src-clip-ref.png | Bin 0 -> 243 bytes + test/src-clip.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 101 insertions(+) + +commit 540db69aefd9874d71af6102c5f9572288de09be +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 15:28:47 2006 -0400 + + [ROADMAP] Add more entries for 1.2.4. + + ROADMAP | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 6122cc85c8f71b1ba2df3ab86907768edebe1781 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 16 20:07:06 2006 -0400 + + [test] Add $(LDADD) to svg2png_LDADD, to link to correct cairo + Previously it was using the cairo found in system. + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 30cd66fe9a017af9ab2e5b25a13ff70b66b62d17 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 16 19:43:55 2006 -0400 + + [test] Add ft-text-vertical-layout-truetype. + + test/ft-text-vertical-layout-truetype-ref.png | Bin 0 -> 3933 bytes + test/ft-text-vertical-layout-truetype-svg-ref.png | Bin 0 -> 3956 bytes + test/ft-text-vertical-layout-truetype.c | 154 ++++++++++++++++++++++ + 3 files changed, 154 insertions(+) + +commit 158e1602119d6cb1169a15b41c4fcac7edf735ab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 16 19:43:41 2006 -0400 + + [.gitignore] Add truetype-tables + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit cbcf1ddd646cfe9a9f7b993d2b69ca1faa353f45 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 16 14:27:40 2006 -0400 + + [test] New torture tests ft-text-vertical-layout-truetype/type1 + that combine vertical layout with font_matrix rotation and translation. + Currently Type3 and Type1 font paths both show broken behavior. + The type1 test uses "Nimbus Sans L" as the font. + + test/.gitignore | 5 +- + test/Makefile.am | 15 ++- + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 715 -> 0 bytes + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 611 -> 0 bytes + test/ft-text-vertical-layout-ref.png | Bin 829 -> 0 bytes + test/ft-text-vertical-layout-svg-ref.png | Bin 770 -> 0 bytes + test/ft-text-vertical-layout-type1-ref.png | Bin 0 -> 3970 bytes + test/ft-text-vertical-layout-type1-svg-ref.png | Bin 0 -> 3948 bytes + test/ft-text-vertical-layout-type1.c | 154 ++++++++++++++++++++++++ + test/ft-text-vertical-layout.c | 136 --------------------- + 10 files changed, 167 insertions(+), 143 deletions(-) + +commit c385922c198012c46f0c7638ce0ac36a41b9a014 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 14:15:47 2006 -0400 + + [ROADMAP] Add two assertion failures to 1.2.4 plans + + ROADMAP | 2 ++ + 1 file changed, 2 insertions(+) + +commit 89008ad1c7dc7539d1b41315f18910af7e638b75 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 13:53:08 2006 -0400 + + [FreeType] Use _cairo_ft_scaled_font_is_vertical where appropriate + instead of poking at the loadflags. + + src/cairo-ft-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b7bc263842a798d657a95e539e1693372448837f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 08:33:20 2006 -0400 + + [FreeType] Fix vertical metrics adjustment to work with non-identity shapes + + src/cairo-ft-font.c | 29 ++++++++++++++++++----------- + 1 file changed, 18 insertions(+), 11 deletions(-) + +commit d47388ad759b0a1a0869655a87d9b5eb6ae2445d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 07:29:18 2006 -0400 + + [PS] Set correct ImageMatrix in _cairo_ps_surface_emit_bitmap_glyph_data + which should be set to device_transform_inverse, not device_transform. + Moreover, no negation is needed anymore, as that has been working around + the inverse matrix :-). + + src/cairo-ps-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 91eb56998c416cc21a1bbe2a6e66e85316ef4ddb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 05:49:21 2006 -0400 + + [test] ft-text-vertical-layout: Update ref images + + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 720 -> 715 bytes + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 613 -> 611 bytes + test/ft-text-vertical-layout-ref.png | Bin 832 -> 829 bytes + test/ft-text-vertical-layout-svg-ref.png | Bin 778 -> 770 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 4b3fadefc835cf627c3887a72d8cbb117d7ad5f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 05:48:12 2006 -0400 + + [FreeType] Fix comment about font coordinate + + src/cairo-ft-font.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit db779b5121ae548753b4559bd59b269e489c6567 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 05:27:59 2006 -0400 + + [test] ft-text-vertical-layout: Use the string "i-W" to better show vertical metrics + + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 804 -> 720 bytes + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 644 -> 613 bytes + test/ft-text-vertical-layout-ref.png | Bin 907 -> 832 bytes + test/ft-text-vertical-layout-svg-ref.png | Bin 880 -> 778 bytes + test/ft-text-vertical-layout.c | 12 ++++++------ + 5 files changed, 6 insertions(+), 6 deletions(-) + +commit f183b835b111d23e838889178aa8106ec84663b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 15 04:59:48 2006 -0400 + + Respect font_matrix translation in _cairo_gstate_glyph_path + + src/cairo-gstate.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 17ec33aa4f33919377d241bce01e2c395b2aa1b8 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Mon Aug 14 20:19:15 2006 +0200 + + New test for long line bug. + + This shows at least an issue in cairo_fixed_from_double where values + > 32767 are converted to -32768, instead of being clamped to 32767. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/long-lines-ref.png | Bin 0 -> 247 bytes + test/long-lines.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 95 insertions(+) + +commit 09e1eb04ca06aa5c188dc3bdad0dadadaa9fe31f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 14 00:15:44 2006 -0400 + + [ROADMAP] Update. Adding 1.2.4 milestone and a few other items + + ROADMAP | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit c802cd2d62be5fd0b11d6da10360788f20b721c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Aug 13 20:16:22 2006 -0400 + + [Type1] Synch comments in the encoding table + + src/cairo-type1-subset.c | 126 ++++++++++++++++++++++++++++++----------------- + 1 file changed, 80 insertions(+), 46 deletions(-) + +commit e5f36a54daf376f34596a285402a3e30ee0a6a64 +Author: Pavel Roskin <proski@gnu.org> +Date: Sun Aug 13 05:09:28 2006 -0400 + + [Type1] Use NULL instead of 0 + + Using NULL is encouraged for pointers. While fixing that, it turned out + that the comments indicating the current index were wrong, so I'm fixing + them too. + + src/cairo-type1-subset.c | 33 ++++++++++++++++++++------------- + 1 file changed, 20 insertions(+), 13 deletions(-) + +commit fdd7518b8be1975ae8f804eba7cf4738bd957e4a +Author: Pavel Roskin <proski@gnu.org> +Date: Sun Aug 13 05:02:46 2006 -0400 + + Update nil surface structs to the surface struct + + Quite a few fields were missing, but all zero, so didn't matter + practically, but comments were out of synch. + + src/cairo-surface.c | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +commit a06af40c35ba8b5d9a0688cefc7eb8bd2e31e92d +Author: Pavel Roskin <proski@gnu.org> +Date: Sun Aug 13 04:47:11 2006 -0400 + + [test] Fix warnings in tests on 64-bit systems + + Cast argiments from size_t to int. size_t is 64-bit on 64-bit systems, + which causes a warning. The actual data should fit 32 bit comfortably. + + test/cairo-test.c | 2 +- + test/clip-operator.c | 4 ++-- + test/operator-clear.c | 4 ++-- + test/operator-source.c | 4 ++-- + test/trap-clip.c | 4 ++-- + test/truetype-tables.c | 2 +- + test/unbounded-operator.c | 4 ++-- + 7 files changed, 12 insertions(+), 12 deletions(-) + +commit 58963a2bf962559d579a84edde9af13d9f51d014 +Author: Pavel Roskin <proski@gnu.org> +Date: Sun Aug 13 04:44:39 2006 -0400 + + [test] Allow overriding Valgrind flags on the command line + + Don't hardcode Valgrind flags in tests/Makefile.am so that + tests/Makefile doesn't need to be rebuilt to use different flags. Not + everybody is looking for memory leaks. + + test/Makefile.am | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit b29cc61facbe75ff3afea58308e93b86d25cb03d +Author: Pavel Roskin <proski@gnu.org> +Date: Sun Aug 13 04:41:43 2006 -0400 + + [pixman] Don't cast pointers to integers + + This causes warnings on 64-bit platforms that may indicate very serious + problems. Fortunately, not in this case. + + pixman/src/fbmmx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit abd16e47d6331bd3811c908e524b4dcb6bd23bf0 +Author: Jens Granseuer <jensgr@gmx.net> +Date: Fri Aug 11 13:06:37 2006 -0400 + + [configure] Let env-vars override backend CFLAGS/LIBS (bug 7838) + In particular, $png_REQUIRES can be used now to set the name of the pkg-config + module that contains libpng. + + configure.in | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +commit 97524a8fdb899de1ae4a3e920fb7bda6d76c5571 +Author: Jens Granseuer <jensgr@gmx.net> +Date: Fri Aug 11 11:51:10 2006 -0400 + + [warnings] Only use supported compiler warning flags + Also cache the result. + + configure.in | 53 +++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 37 insertions(+), 16 deletions(-) + +commit 22eee1db000ac03a8cbd0b0bdb689b6d3a127737 +Author: Kjartan Maraas <kmaraas@gnome.org> +Date: Fri Aug 11 11:18:24 2006 -0400 + + [warnings] Fixes for sparse. This fixes a lot of instances of 0 vs NULL + + pixman/src/fbcompose.c | 20 ++++++++++---------- + pixman/src/icimage.c | 22 +++++++++++----------- + pixman/src/icutil.c | 2 +- + 3 files changed, 22 insertions(+), 22 deletions(-) + +commit ab3b400bda61a8fc48bb74dc3134237ddce4a81f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 11 00:43:24 2006 -0400 + + [Makefile.am] Move ChangeLog creation voodoo to ChangeLog.mk + + ChangeLog.mk | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Makefile.am | 83 +----------------------------------------------------------- + 2 files changed, 83 insertions(+), 82 deletions(-) + +commit affc9c71acc1ea206dee0a4056c4f5b307fc7f38 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 11 00:24:01 2006 -0400 + + [Makefile.am] Add $(AM_MAKEFLAGS) to recursive make invocations + + Makefile.am | 21 ++++++++++----------- + doc/Makefile.am | 2 +- + test/Makefile.am | 14 +++++++------- + 3 files changed, 18 insertions(+), 19 deletions(-) + +commit c04ccc95fa3cd4272889b1e66e4de5e1bef53ae0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 23:49:50 2006 -0400 + + [ChangeLog] Make ChangeLog creation faster by caching partial results + The ChangeLog.pre-* files once generated, cannot be outdated and don't need + update anymore, but the main ChangeLog needs update everytime a git operation + is performed (commit, checkout, etc.) Previously, we were forcing a ChangeLog + recreation by making it a phony target. Now, we break it into two parts: One + up to the latest tag (as returned by git-describe), and another from there. + The former is, again, up-to-date when it exists. The latter, we make it + depend on .git. And since the latter is pretty short anyway, you get a very + first regeneration of it when you change your repo (and that only happens + during 'make dist' by the way.) + + Makefile.am | 41 ++++++++++++++++++++++++++++++++--------- + 1 file changed, 32 insertions(+), 9 deletions(-) + +commit 9b5c5b75701e8f8d5270d248c0eaac07aa5eb52a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 20:41:05 2006 -0400 + + [ChangeLog] Remove 'fmt' formatting of the ChangeLogs + We assume that people write wrapped commit messages, which is true these days + but was not back in the CVS days. + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 91a59251806c3836cbc58b009aae8b016feab5a4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 20:36:16 2006 -0400 + + Create multiple ChangeLog files segmented around major releases + For an imaginary cairo-3.6.4 version, we now will generate the following + ChangeLog files: + + ChangeLog + ChangeLog.pre-3.4 + ChangeLog.pre-3.2 + ChangeLog.pre-3.0 + ChangeLog.pre-2.0 + ChangeLog.pre-1.0 + + Makefile.am | 64 +++++++++++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 50 insertions(+), 14 deletions(-) + +commit ee885c76af0c715ffd316d4c7cc1b61db46af1ae +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 18:54:18 2006 -0400 + + [test] Update EXTRA_DIST after beos_bitmap -> beos-bitmap change + + test/Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 915448e50f18d518c065dbde6d8857e4c91d2a51 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 15:35:36 2006 -0400 + + [test] Add target check-ref-dups that lists reference images having duplicate sha1sum hash + This is useful to review every once in a while to drop duplicate images that + can be dropped. For example, if there are two identical images one named + some-test-svg-rgb24-ref.png and other some-test-svg-argb32-ref.png, those two + can be replaced with some-test-svg-ref.png. + + test/.gitignore | 1 + + test/Makefile.am | 14 +++++++------- + 2 files changed, 8 insertions(+), 7 deletions(-) + +commit cecf396f6fe8424ec80f6f143df3622b92a5522e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 15:11:46 2006 -0400 + + [test] Point out to the test log file on failures + + test/cairo-test.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 15074cbb04498b59af4f3d9d3f2e99a2113e6730 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 14:58:33 2006 -0400 + + [test] Behave better if no ref image was found for a test + + test/cairo-test.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +commit 67ff765e30af538a7955267c046af446dd8844ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 13:53:24 2006 -0400 + + [test] Rename beos_bitmap target to beos-bitmap. Same for directfb-bitmap. + + test/cairo-test.c | 6 +++--- + test/mask-beos-bitmap-argb32-ref.png | Bin 0 -> 87641 bytes + test/mask-beos-bitmap-rgb24-ref.png | Bin 0 -> 71028 bytes + test/mask-beos_bitmap-argb32-ref.png | Bin 87641 -> 0 bytes + test/mask-beos_bitmap-rgb24-ref.png | Bin 71028 -> 0 bytes + test/set-source-beos-bitmap-rgb24-ref.png | Bin 0 -> 124 bytes + test/set-source-beos_bitmap-rgb24-ref.png | Bin 124 -> 0 bytes + test/trap-clip-beos-bitmap-rgb24-ref.png | Bin 0 -> 63088 bytes + test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 63088 -> 0 bytes + 9 files changed, 3 insertions(+), 3 deletions(-) + +commit c6869b741578be8d93053c8313f71e87061d0202 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 13:21:57 2006 -0400 + + [ROADMAP] Add generating EPS. + + ROADMAP | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 1af80b70c08654faeb9c6d041d37ca10d6008fe5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 13:10:24 2006 -0400 + + Test for libz only once and reuse result for PS and PDF + This causes configure to check for libz even if PS/PDF are disabled + or their results is already cached. But that's not much of a problem + as if the cache is enabled, libz results are cached too. + + configure.in | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit d1520a99d4f9be9206cfcb5febb606eaeb4ccaa9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 13:05:26 2006 -0400 + + Remove the ft_load_sfnt_table check from PS/PDF/SVG backends + and make sure that _cairo_ft_load_truetype_table returns UNSUPPORTED + if the version of FreeType used doesn't support FT_Load_Sfnt_Table. + + configure.in | 16 +--------------- + src/cairo-ft-font.c | 3 +++ + 2 files changed, 4 insertions(+), 15 deletions(-) + +commit aea83b908d020e26732753830bb3056e6702a774 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 12:47:47 2006 -0400 + + Fix typos in configure.in for PS/PDF/SVG backends + + configure.in | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit dc8da1ca06971677e203718db1429f82fe3f05bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 12:47:11 2006 -0400 + + Save configure cache after checking all backends + This makes sure that backend enabling results are cached even + if a later test in configure fails. + + configure.in | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6d0e3260444a2d5b6fb0cb223ac79f1c0e7b3a6e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 12:45:35 2006 -0400 + + Don't link to -lm unconditionally in cairo.pc + Reuse $LIBM results. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 24374ad61379273945cda913884b562513d86ed2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 10 12:44:35 2006 -0400 + + Implement configure cache versioning for backend enabling results + such that removing config.cache is not needed as frequently as it + is currently. We just detect and stale the cache results for our + own backends. If the user installs missing libraries, they still + need to remove the cache manually. + + Note that everytime a change is made to configure.in and may change + the results of at least one CAIRO_BACKEND_ENABLE call, the + cairo_cache_version number should be increased. + + configure.in | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit c3c706873ef6a0e1318b1d4b4d4b6841758ea18d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 16:56:20 2006 -0700 + + ROADMAP: Remove 1.2.2 stuff now that that release is out the door + + ROADMAP | 29 +---------------------------- + 1 file changed, 1 insertion(+), 28 deletions(-) + +commit 27842ff06f0f4cb764516e91ad51c8a92078e0fa +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 16:51:48 2006 -0700 + + NEWS: Fix some misspellings + + NEWS | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit c96e1b6d8ff06eba7b09b5ff3c60fe09d56eb80c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 16:32:26 2006 -0700 + + README: Update backend list. + + PDF, PS, and SVG are no longer experimental. And DirectFB and BeOS now exist as well. + + README | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 38b42c50252198afac2480a24085f01722d1b471 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 16:23:07 2006 -0700 + + Increment CAIRO_VERSION to 1.2.3 after making the 1.2.2 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac1c748868bdf4ca6fd195b184ec90827f6e8c94 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 16:06:57 2006 -0700 + + Update version to 1.2.2 and libtool version to 11:1:9. + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6b3e674211f12e1a30a23c2698f314f6317bd54a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 16:04:54 2006 -0700 + + NEWS: Add notes for cairo 1.2.2 + + NEWS | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 157 insertions(+) + +commit 5b2c84549f72d449d5c44034e15babbd29d290e8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 14:30:20 2006 -0700 + + RELEASING: Add --stat option to recommended git-log command + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e3c7840d2283a8e30242c9749e991f02e93b878a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 14:29:29 2006 -0700 + + Fix EXTRA_DIST so that 'make distcheck' works again + + test/Makefile.am | 56 +++++++++++++------------------------------------------- + 1 file changed, 13 insertions(+), 43 deletions(-) + +commit d5d529c0f349962f8c96e2005d67e0c3dd57fbc9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 14:28:48 2006 -0700 + + gtk-doc template file churn + + doc/public/tmpl/cairo-font-options.sgml | 134 +++++++++ + doc/public/tmpl/cairo-font.sgml | 67 +++++ + doc/public/tmpl/cairo-ft.sgml | 45 ++++ + doc/public/tmpl/cairo-image.sgml | 69 +++++ + doc/public/tmpl/cairo-matrix.sgml | 119 ++++++++ + doc/public/tmpl/cairo-paths.sgml | 194 +++++++++++++ + doc/public/tmpl/cairo-pattern.sgml | 182 +++++++++++++ + doc/public/tmpl/cairo-pdf.sgml | 28 +- + doc/public/tmpl/cairo-png.sgml | 40 +++ + doc/public/tmpl/cairo-ps.sgml | 53 +++- + doc/public/tmpl/cairo-scaled-font.sgml | 113 ++++++++ + doc/public/tmpl/cairo-status.sgml | 16 ++ + doc/public/tmpl/cairo-surface.sgml | 170 ++++++++++++ + doc/public/tmpl/cairo-svg.sgml | 53 +++- + doc/public/tmpl/cairo-text.sgml | 133 ++++++++- + doc/public/tmpl/cairo-transforms.sgml | 104 +++++++ + doc/public/tmpl/cairo-version.sgml | 37 +++ + doc/public/tmpl/cairo-win32-fonts.sgml | 45 ++++ + doc/public/tmpl/cairo-win32.sgml | 29 ++ + doc/public/tmpl/cairo-xlib-xrender.sgml | 14 + + doc/public/tmpl/cairo-xlib.sgml | 110 ++++++++ + doc/public/tmpl/cairo.sgml | 465 ++++++++++++++++++++++++++++++++ + 22 files changed, 2216 insertions(+), 4 deletions(-) + +commit ca99478d4309ee66bfd0196d3d53991a46fa8367 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 12:48:56 2006 -0700 + + Fix some memory leaks in a few of the tests. + + test/push-group.c | 2 ++ + test/text-antialias-gray.c | 2 ++ + test/text-antialias-none.c | 2 ++ + test/zero-alpha.c | 2 ++ + 4 files changed, 8 insertions(+) + +commit d6e204b9d58069ba34969e6f23cf0bdb4c73b9e1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 12:48:20 2006 -0700 + + Add a variation of an existing valgrind suppression + + test/.valgrind-suppressions | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 16c18aea52f668caf9cd0b9774f8fa209468662f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 15:30:56 2006 -0400 + + [PDF] Fix leak: free glyphs + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ac4922bd07db7a513b6dbe5443e95221d7827f79 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 15:27:21 2006 -0400 + + [TrueType] Zero out padding memory in generated TrueType subset + to make the output deterministic and fix valgrind errors. + + src/cairo-truetype-subset.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 356e646dc66f3df0d97e2c26e9328650df745c1e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 13:39:17 2006 -0400 + + [FreeType] Unset and set to FC_RGBA_NONE the FC_RGBA attribute on pattern + + if we don't want it. This stuff is tricky, but I hope to explain: In your + fontconfig configuration, you may match on "font", or on "pattern". Turning + subpixel on typically looks like: + + <match target="font"> + <test qual="all" name="rgba"> + <const>unknown</const> + </test> + <edit name="rgba" mode="assign"><const>rgb</const></edit> + </match> + + This works good enough, and if you set to ANTIALIAS_GRAY, this will not + override that. Now one may forget to match on "font" target, or intentionally + match on the pattern. That happens before cairo font options are substituted + in the pattern. So, to give a hint of subpixel in your config file, you can + write: + + <match target="pattern"> + <edit name="rgba" mode="assign"><const>rgb</const></edit> + </match> + + You don't really need to check for current values, as FcConfigSubstitute is + run before merging cairo_font_options_t in. What this patch does, is to reset + pattern's rgba property if the font options explicitly ask for ANTIALIAS_GRAY. + This is the only place in cairo-ft-font.c that we use FcPatternDel, so I + thought some explanation is needed. + + src/cairo-ft-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit db06681b487873788b51a6766894fc619eb8d8f2 +Author: Alfred Peng <alfred.peng@sun.com> +Date: Tue Aug 8 10:57:33 2006 -0700 + + Fix leaks in failure paths in pixman gradient creation + + pixman/src/icimage.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6ff531c1823421ff60d084f94e7221cfb1d3c9b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 13:13:18 2006 -0400 + + [TrueType] Add comment block describing why we only use int16_t + + src/cairo-truetype-subset-private.h | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +commit 23f388861803ca18746da2573424014c333fb63b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 07:38:34 2006 -0400 + + [TrueType] More leak fixes + + src/cairo-truetype-subset.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 519bd3d3e972a88adea5bcf6ea7f582fe69c305c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 07:24:01 2006 -0400 + + [TrueType] Fix leaks. + + src/cairo-truetype-subset.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 501e5cc8839e104ec21a5aba61cff3580d34f26b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 06:12:13 2006 -0400 + + Restructure subpixel_order handling such that the code doesn't look suspicious! + Shouldn't make /any/ difference at all in any case. + + src/cairo-ft-font.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 89fc22de871d61517a4955875f12326b4dc3389a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 06:08:53 2006 -0400 + + [fontconfig] Set FC_RGBA_NONE on the pattern if we don't want subpixel. + + otherwise, it looks like "I don't care" and fontconfig configuration is + allowed to decide to turn subpixel on. This fixes the bug that subpixel + colors where showing up in fallback images in PS/PDF/SVG backends, observed + in the test fallback-resolution. + + src/cairo-ft-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1f854fcf32e6909e4c52779f093132d8c749c285 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 06:04:01 2006 -0400 + + Set antialiasing to gray in default font options for PS/PDF/SVG + + This only affects the image fallback in those backends, and avoids getting + colored pixels there if user's fontconfig configuration turns subpixel on. + This doesn't quite fix that problem though, more changes are needed/coming. + + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-svg-surface.c | 7 ++++--- + 3 files changed, 6 insertions(+), 3 deletions(-) + +commit 2d483e0785b18a8bb51f5b1c1a0267029f68a64a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 02:24:48 2006 -0700 + + test-paginated: Fix memory leak within _test_paginated_surface_create_for_data + + src/test-paginated-surface.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit cb5edb6c35f7c80d1f91172b98f25ee33f21bce9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 01:38:24 2006 -0700 + + Eliminate warning due to the test suite's private 'FLATTENEND' format value + + test/cairo-test.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit f089a07679535959fe7b12acb0550ff16d560788 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 04:36:13 2006 -0400 + + Fix misplaced volatile keyword + + test/cairo-test.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9d542a29cba71fe4b4067fa9a9c0fe98a7d8a7a8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 01:30:40 2006 -0700 + + Disable warning options that are not available in gcc 3.3.5 at least. + + We'll want to turn these back on eventually with a nice conditional check on the + appropriate version of gcc. + + configure.in | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit c3b912d7db34c5881cf14725b7d29266cbf24877 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 01:16:49 2006 -0700 + + Eliminate most compiler warnings from the test suite + + src/cairo-paginated-surface.c | 2 +- + test/bitmap-font.c | 2 +- + test/buffer-diff.c | 2 +- + test/cairo-test.c | 16 ++++++++++------ + test/cairo-test.h | 3 ++- + test/clip-operator.c | 2 +- + test/create-for-stream.c | 4 +++- + test/degenerate-path.c | 2 +- + test/fallback-resolution.c | 2 +- + test/mask.c | 2 +- + test/multi-page.c | 2 +- + test/operator-clear.c | 2 +- + test/operator-source.c | 2 +- + test/pdf-features.c | 4 ++-- + test/ps-features.c | 4 ++-- + test/push-group.c | 1 - + test/read-png.c | 4 ++-- + test/svg-surface.c | 2 ++ + test/trap-clip.c | 2 +- + test/unbounded-operator.c | 2 +- + test/write-png.c | 2 +- + 21 files changed, 36 insertions(+), 28 deletions(-) + +commit c7d11ad2b4778cb7399eae990a410cb72568af11 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 00:43:09 2006 -0700 + + Remove stale SVG-specific reference images for pixman-rotate test + + test/pixman-rotate-svg-argb32-ref.png | Bin 258 -> 0 bytes + test/pixman-rotate-svg-rgb24-ref.png | Bin 358 -> 0 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 401f0ce3c444e263f03055174791e993e6270c39 +Merge: 77fd0ef 02b54ca +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 8 00:19:51 2006 -0700 + + Merge branch 'surface-font-options' into cairo + +commit 77fd0efa9a055c13e685f4c6b01597ae67a36fb7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 02:58:50 2006 -0400 + + Fix few remaining compiler warnings, revealed by -O3 + + pixman/src/ictri.c | 6 +++--- + src/cairo-lzw.c | 11 +++++------ + src/cairo-type1-subset.c | 8 ++++---- + 3 files changed, 12 insertions(+), 13 deletions(-) + +commit 02b54ca6200b3e5a914b293dd4a0d56f432a5a9b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 2 11:18:14 2006 -0400 + + Improve docs for cairo_surface_create_similar() + + src/cairo-surface.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 9136c217703d1d6aab1742f522aa0279517fb36a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 20:40:54 2006 -0400 + + Update reference images, mostly PDF and SVG + Also replace some SVG ref images for rgb24 and argb32 with a single + one where the two have been similar. + + test/caps-joins-alpha-svg-argb32-ref.png | Bin 2454 -> 0 bytes + test/caps-joins-alpha-svg-ref.png | Bin 0 -> 2454 bytes + test/caps-joins-alpha-svg-rgb24-ref.png | Bin 2454 -> 0 bytes + ...omposite-integer-translate-over-svg-argb32-ref.png | Bin 15465 -> 0 bytes + test/composite-integer-translate-over-svg-ref.png | Bin 0 -> 15465 bytes + ...composite-integer-translate-over-svg-rgb24-ref.png | Bin 15465 -> 0 bytes + test/fill-and-stroke-alpha-svg-argb32-ref.png | Bin 509 -> 0 bytes + test/fill-and-stroke-alpha-svg-ref.png | Bin 0 -> 509 bytes + test/fill-and-stroke-alpha-svg-rgb24-ref.png | Bin 509 -> 0 bytes + test/font-matrix-translation-svg-ref.png | Bin 0 -> 970 bytes + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 725 -> 804 bytes + test/ft-text-vertical-layout-ref.png | Bin 907 -> 907 bytes + test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 799 -> 0 bytes + test/ft-text-vertical-layout-svg-ref.png | Bin 0 -> 880 bytes + test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 808 -> 0 bytes + test/glyph-cache-pressure-pdf-argb32-ref.png | Bin 2879 -> 0 bytes + test/glyph-cache-pressure-svg-argb32-ref.png | Bin 3635 -> 0 bytes + test/glyph-cache-pressure-svg-ref.png | Bin 0 -> 3165 bytes + test/glyph-cache-pressure-svg-rgb24-ref.png | Bin 3165 -> 0 bytes + test/linear-gradient-svg-argb32-ref.png | Bin 1000 -> 0 bytes + test/linear-gradient-svg-ref.png | Bin 0 -> 1000 bytes + test/linear-gradient-svg-rgb24-ref.png | Bin 1000 -> 0 bytes + test/paint-source-alpha-svg-argb32-ref.png | Bin 505 -> 0 bytes + test/paint-source-alpha-svg-ref.png | Bin 0 -> 505 bytes + test/paint-source-alpha-svg-rgb24-ref.png | Bin 505 -> 0 bytes + test/paint-with-alpha-svg-argb32-ref.png | Bin 516 -> 0 bytes + test/paint-with-alpha-svg-ref.png | Bin 0 -> 516 bytes + test/paint-with-alpha-svg-rgb24-ref.png | Bin 516 -> 0 bytes + test/pixman-rotate-svg-argb32-ref.png | Bin 0 -> 258 bytes + test/pixman-rotate-svg-rgb24-ref.png | Bin 0 -> 358 bytes + test/rectangle-rounding-error-ps-argb32-ref.png | Bin 258 -> 0 bytes + test/select-font-face-pdf-argb32-ref.png | Bin 2237 -> 0 bytes + test/select-font-face-ps-argb32-ref.png | Bin 1443 -> 1333 bytes + test/select-font-face-ref.png | Bin 2481 -> 2473 bytes + test/select-font-face-svg-argb32-ref.png | Bin 3064 -> 0 bytes + test/select-font-face-svg-ref.png | Bin 0 -> 2430 bytes + test/select-font-face-svg-rgb24-ref.png | Bin 3064 -> 0 bytes + test/show-text-current-point-pdf-argb32-ref.png | Bin 2157 -> 0 bytes + test/show-text-current-point-svg-argb32-ref.png | Bin 4236 -> 0 bytes + test/show-text-current-point-svg-ref.png | Bin 0 -> 2398 bytes + test/show-text-current-point-svg-rgb24-ref.png | Bin 2398 -> 0 bytes + test/text-antialias-gray-pdf-argb32-ref.png | Bin 950 -> 0 bytes + test/text-antialias-gray-ps-argb32-ref.png | Bin 310 -> 0 bytes + test/text-antialias-gray-svg-argb32-ref.png | Bin 1077 -> 0 bytes + test/text-antialias-gray-svg-rgb24-ref.png | Bin 1033 -> 0 bytes + test/text-antialias-none-pdf-argb32-ref.png | Bin 950 -> 0 bytes + test/text-antialias-none-ps-argb32-ref.png | Bin 310 -> 0 bytes + test/text-antialias-none-svg-argb32-ref.png | Bin 1077 -> 0 bytes + test/text-antialias-none-svg-rgb24-ref.png | Bin 1033 -> 0 bytes + test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 950 -> 0 bytes + test/text-antialias-subpixel-ps-argb32-ref.png | Bin 310 -> 0 bytes + test/text-antialias-subpixel-svg-argb32-ref.png | Bin 1077 -> 0 bytes + test/text-antialias-subpixel-svg-rgb24-ref.png | Bin 1033 -> 0 bytes + test/text-pattern-pdf-argb32-ref.png | Bin 1632 -> 0 bytes + test/text-pattern-ps-argb32-ref.png | Bin 1681 -> 0 bytes + test/text-pattern-svg-argb32-ref.png | Bin 1708 -> 1749 bytes + test/unantialiased-shapes-ps-argb32-ref.png | Bin 4076 -> 0 bytes + test/unantialiased-shapes-svg-argb32-ref.png | Bin 19689 -> 0 bytes + test/unantialiased-shapes-svg-rgb24-ref.png | Bin 19689 -> 0 bytes + 59 files changed, 0 insertions(+), 0 deletions(-) + +commit 56791ab31d484452cd1ddefd653590095d9f6191 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 02:46:38 2006 -0400 + + Make "make html" not trigger test reruns + "make index.html" can still be used to force up-to-date test results, + causing test reruns if necessary. + + test/Makefile.am | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit caba7f6bda9ba7c1a0738f3b34996c50bde60697 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 8 02:17:43 2006 -0400 + + Document a few more functions + + cairo_show_page + cairo_copy_page + cairo_in_stroke + cairo_in_fill + + src/cairo.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 42 insertions(+) + +commit 789785cd357de14af23a4d2ae8ca49c4838426b9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 7 11:58:35 2006 -0700 + + Document CAIRO_FORMAT_RGB16_565 as deprecated. + + src/cairo.h | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit fdc805a52949bf3b040bfef57d170025010816c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 22:28:59 2006 -0400 + + More doc syntax update + + src/cairo-scaled-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit bbc9a1290a964edf50f571be8766b38df10adac7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 22:27:15 2006 -0400 + + Update doc syntax + Annoying, but a function doc should have a body, not only "Returns", or + gtk-doc will not pick it up. + + src/cairo-font.c | 5 ++++- + src/cairo-pattern.c | 5 ++++- + src/cairo-scaled-font.c | 5 ++++- + src/cairo-surface.c | 5 ++++- + 4 files changed, 16 insertions(+), 4 deletions(-) + +commit fef0251d15814ce9f135b548579e51c6e4a0653d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 22:15:15 2006 -0400 + + Add cairo-truetype-subset-private.h to list of ignored headers + + doc/public/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit c2ea56e5e075f9e75350b3c54956a70e6fb9a58c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 21:37:16 2006 -0400 + + Add test truetype-tables that checks sizeof truetype tables + + test/Makefile.am | 1 + + test/truetype-tables.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 60 insertions(+) + +commit 50be7951c981468a3a2acf2cd77931a46ca1e824 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 21:23:08 2006 -0400 + + Split the TrueType table definitions into a private header file + such that we can test the struct sizes in a test. + + src/Makefile.am | 1 + + src/cairo-truetype-subset-private.h | 159 ++++++++++++++++++++++++++++++++++++ + src/cairo-truetype-subset.c | 126 ++-------------------------- + 3 files changed, 165 insertions(+), 121 deletions(-) + +commit ec895202e008356492ae0c9e40c9f40c6bf8cbb3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 21:13:48 2006 -0400 + + Remove the __attribute__ ((packed)) and the need for it + as it's not portable and lack of it could seriously break the truetype + subsetting code. Now, instead of using int32_t and int64_t, we use + multiple int16_t items, to avoid any alignments. Fortunately, we are + not using any of the fields involved, so no code changes necessary. + + src/cairo-truetype-subset.c | 58 ++++++++++++++++++++++++++------------------- + 1 file changed, 34 insertions(+), 24 deletions(-) + +commit 20c3ff96de05365ee65301ccd3c43e7bcb19f49b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 7 15:18:38 2006 -0700 + + Fix some signed/unsigned comparison warnings that cropped up during the warnings-cleanup branch + + src/cairo-meta-surface-private.h | 2 +- + src/cairo-pdf-surface.c | 6 +++--- + src/cairo-ps-surface.c | 5 ++--- + src/cairo-scaled-font-subsets-private.h | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-truetype-subset.c | 14 +++++++------- + src/cairo-type1-subset.c | 4 ++-- + 7 files changed, 17 insertions(+), 18 deletions(-) + +commit 959b85e98c8a0f546c9117da83f84c99ed00370f +Merge: f1c70a0 7ee94c0 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 7 15:06:47 2006 -0700 + + Merge branch 'warnings-cleanup' into cairo + + Conflicts: + + src/cairo-font-subset.c + +commit f1c70a01391705a22dd882f2a88c6dffbc08f0fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 17:32:02 2006 -0400 + + Mark x86_64 subsetting as fixed in ROADMAP. + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ee94c0285b0f7352506622d16aff9339ba65d0c +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 31 12:03:40 2006 -0700 + + Squelch an annoying -Wswitch-enum warning by not using switch + + src/cairo-pattern.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 43b579d757ded66f71da8a0e215abd7bccdfd695 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jul 31 11:47:45 2006 -0700 + + Add -Wswitch-enum compiler flag and fix all trivial warnings + + configure.in | 2 +- + pixman/src/fbpict.c | 11 +++++++++++ + src/cairo-ft-font.c | 5 +++++ + src/cairo-image-surface.c | 9 +++++++++ + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 6 +++++- + src/cairo-xlib-surface.c | 12 ++++++++++++ + 7 files changed, 44 insertions(+), 3 deletions(-) + +commit d1f9bef30ea7268fee74af50c0e9325e1ec0929c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 14:24:32 2006 -0700 + + Add -Wunsafe-loop-optimizations compiler flag and fix all warnings + + configure.in | 1 + + pixman/src/fbmmx.c | 8 ++++---- + src/cairo-xlib-surface.c | 2 +- + 3 files changed, 6 insertions(+), 5 deletions(-) + +commit 744ef3bf698f9109e82244c5889d0d809b2df70c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 13:47:01 2006 -0700 + + Add several compiler warning flags (no code changes needed) + + The flags added here are as follows: + + -Werror-implicit-function-declaration Wstrict-aliasing=2 + -Wwrite-strings Winit-self Wpacked Wmissing-format-attribute + -Wdeclaration-after-statement + + configure.in | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 00711022089936e08b8651591629ca344a3fa71e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 7 13:13:33 2006 -0700 + + Add -Wwrite-strings compiler flag and fix all warnings + + configure.in | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-xlib-surface.c | 4 ++-- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 9ae66174e774b57f16ad791452ed44efc2770a59 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 4 16:06:59 2006 -0700 + + Fix bug 7294 by adding pixman BGR formats and internal cairo BGR formats. + + This approach to fixing the bug is valid since there is code in pixman + for rendering to BGR images, (which is why cairo 1.0 worked with BGR X + servers for example). But, since we don't want to advertise additional + image formats we implement this through a new cairo_internal_format_t. + + This is rather fragile since we don't want to leak any internal formats + nor do we ever want an internal format to be used somewhere a real + format is expected, (and trigger a CAIRO_FORMAT_VALID assertion failure). + More comments than code are added here to help compensate for the + fragility and to give some guidance in fixing this mess in a better way + in the future. + + pixman/src/icformat.c | 12 ++++++++++ + pixman/src/pixman.h | 4 +++- + src/cairo-image-surface.c | 48 +++++++++++++++++++++++++++++--------- + src/cairo-xlib-surface.c | 3 +++ + src/cairoint.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 114 insertions(+), 12 deletions(-) + +commit f4b12e497b7ac282b2f6831b8fb68deebc412e60 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 7 11:07:08 2006 -0700 + + Make truetype subsetting work on x86_64 + + This fixes the bug reported against GTK+ here: + http://bugzilla.gnome.org/show_bug.cgi?id=349826 + + ROADMAP | 2 +- + src/cairo-truetype-subset.c | 195 ++++++++++++++++++++++---------------------- + 2 files changed, 99 insertions(+), 98 deletions(-) + +commit 7724c575b028140fd671d4ef853096a24112146f +Author: Declan Naughton <piratepenguin@gmail.com> +Date: Mon Aug 7 10:33:15 2006 -0700 + + Fix typos in internal documentation. + + src/cairo-arc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit caa9abc9ee33b660f158ac9f5d420bb39c0b47cb +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 7 10:28:40 2006 -0700 + + Fix file handle leak in failure path (bug 7616) + + src/cairo-output-stream.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 04757a3aa8deeff3265719ebe01b021638990ec6 +Author: Alfred Peng <alfred.peng@sun.com> +Date: Mon Aug 7 08:41:13 2006 -0700 + + Add definition of cairo_private for some Sun compilers. + + In addition to helping us preserve a sharp line between which symbols are + part of the public API and which are private parts of the implementation, + this can also help mozilla avoid clashes between its modified, internal + copy of cairo and the system version of cairo. See the mozilla bug here: + + https://bugzilla.mozilla.org/show_bug.cgi?id=341874 + + src/cairoint.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e2fddcccb43d06486d3680a19cfdd5a54963fcbd +Author: Chris Wilson <cpwilson@taz.qinetiq.com> +Date: Fri Aug 4 17:16:35 2006 -0700 + + Fix memory leak in _cairo_surface_show_glyphs (bug 7766) + + src/cairo-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit aec39338033196f2942e9ff0ef6beffd6612030e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 4 16:54:25 2006 -0700 + + ROADMAP: Mark 7533 as fixed and add broken truetype subsetting on x86_64 + + ROADMAP | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 761b30792d56f635fe1fb8641fdee21587505475 +Author: Dominic Lachowicz <domlachowicz@gmail.com> +Date: Fri Aug 4 16:39:40 2006 -0700 + + Add binary garbage to PDF header as recommended in section 3.4.1 of PDF Reference v1.6 + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2815d9ad38f2df45c58fbeb38591afba28b4917b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 3 19:28:11 2006 -0700 + + Use base pointer to avoid compiler warning. + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1feb4291cf7813494355459bb547eec604c54ffb +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 3 19:25:53 2006 -0700 + + Apply device_transform during meta-surface replay to fix bug 7533 + + src/cairo-meta-surface.c | 86 +++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 77 insertions(+), 9 deletions(-) + +commit 8c953167ba045ffdfc25ac4f19faff83720f2473 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 3 17:48:25 2006 -0700 + + Simplify common set_clip operation in meta-surface replay. + + src/cairo-meta-surface.c | 32 ++++++++------------------------ + 1 file changed, 8 insertions(+), 24 deletions(-) + +commit 34a0b728fb0e19a4d03152318a002362791c30d1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 3 00:20:35 2006 -0400 + + Fail FreeType load_truetype_table on vertical fonts as we don't do it + right now. Failing disables the subsetting for vertical fonts, like + it was being done before the recent changes to the TrueType subsetter. + + src/cairo-ft-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2c0959141ae89bde6c773933b41f4d965d6a1ae7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 2 16:40:23 2006 -0700 + + Update ROADMAP now that several of the 1.2.2-targeted bugs are fixed + + ROADMAP | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 30f004d55ad7c426e979964a49e7a8c8d8db31f3 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Aug 2 19:29:17 2006 -0400 + + Rename truetype subset function to _cairo_truetype_*. + + Used to be _cairo_pdf_ft_*, a left over from when this code was + specific to the PDF backend. + + src/cairo-truetype-subset.c | 256 +++++++++++++++++++++++--------------------- + 1 file changed, 133 insertions(+), 123 deletions(-) + +commit f664a3b7a087272a27eb893b7ee5a1775eb92c4d +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Aug 2 19:14:19 2006 -0400 + + Renamed cairo-font-subset.c to cairo-truetype-subset.c + + src/Makefile.am | 2 +- + src/cairo-font-subset.c | 957 -------------------------------------------- + src/cairo-truetype-subset.c | 957 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 958 insertions(+), 958 deletions(-) + +commit a0989f427be87c60415963dd6822b3c5c3781691 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 2 19:12:51 2006 -0400 + + Remove freetype dependency for truetype subsetting code. + + Add a load_truetype_table function to cairo_scaled_font_backend_t and + use it to load the truetype sfnt tables. Implement this with freetype + for the freetype font backend and use GetFontData for win32. Atsui + remains unimplemented, and still falls back to type3 fonts. + + src/Makefile.am | 4 +- + src/cairo-atsui-font.c | 1 + + src/cairo-font-subset.c | 451 +++++++++++++++++++++++++++++------------------- + src/cairo-ft-font.c | 26 +++ + src/cairo-pdf-surface.c | 5 +- + src/cairo-ps-surface.c | 6 +- + src/cairo-svg-surface.c | 1 - + src/cairo-win32-font.c | 28 +++ + src/cairoint.h | 6 + + 9 files changed, 347 insertions(+), 181 deletions(-) + +commit c05dd48ac1afe0e4f3ec0c24797a9fbc3f98ce85 +Merge: e0bec64 0da4b93 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Wed Aug 2 14:32:50 2006 -0700 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit e0bec64c98f98fb2d4b460e8641b1b09f808d233 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Wed Aug 2 14:32:24 2006 -0700 + + Fixed debug statement that broke compile + + src/cairo-directfb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0da4b9319f53379e0ae61b90337f49bd0f0fc9c5 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Aug 2 15:18:56 2006 -0400 + + Drop unused src/cairo-font-subset-private.h. + + src/Makefile.am | 1 - + src/cairo-font-subset-private.h | 68 ----------------------------------------- + 2 files changed, 69 deletions(-) + +commit 067d97eb1793a6b0d0dddfbd0b54117844511a94 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 2 15:17:09 2006 -0400 + + This patch fixes the problem where the postscript output + does not print when the size of the embedded truetype font + exceeds 64k. + + src/cairo-font-subset-private.h | 3 +- + src/cairo-font-subset.c | 60 +++++++++++++++++++++++++++++---- + src/cairo-ps-surface.c | 27 ++++++++++----- + src/cairo-scaled-font-subsets-private.h | 2 ++ + 4 files changed, 77 insertions(+), 15 deletions(-) + +commit 127704c225d4b9f2a4c72749f59a8dfcaecfddc6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 20:39:56 2006 -0400 + + Look for per-target reference image too + + test/cairo-test.c | 96 ++++++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 70 insertions(+), 26 deletions(-) + +commit fc715ffd80f5ec9ac57e3b110dd20298029a6350 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 18:21:27 2006 -0400 + + New PS ref images, matching the recent png16m->pngalpha driver change + + test/caps-joins-ps-argb32-ref.png | Bin 995 -> 1463 bytes + test/caps-sub-paths-ps-argb32-ref.png | Bin 170 -> 240 bytes + test/clip-fill-rule-ps-argb32-ref.png | Bin 280 -> 322 bytes + test/clip-nesting-ps-argb32-ref.png | Bin 488 -> 651 bytes + test/clip-twice-ps-argb32-ref.png | Bin 460 -> 575 bytes + test/dash-caps-joins-ps-argb32-ref.png | Bin 1247 -> 2189 bytes + test/dash-offset-negative-ps-argb32-ref.png | Bin 170 -> 204 bytes + test/dash-scale-ps-argb32-ref.png | Bin 2950 -> 6318 bytes + test/dash-zero-length-ps-argb32-ref.png | Bin 272 -> 319 bytes + test/degenerate-path-ps-argb32-ref.png | Bin 197 -> 264 bytes + test/fill-and-stroke-ps-argb32-ref.png | Bin 243 -> 310 bytes + test/fill-rule-ps-argb32-ref.png | Bin 1078 -> 2253 bytes + test/font-matrix-translation-ps-argb32-ref.png | Bin 0 -> 785 bytes + test/ft-text-antialias-none-ps-argb32-ref.png | Bin 335 -> 335 bytes + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 298 -> 644 bytes + test/glyph-cache-pressure-ps-argb32-ref.png | Bin 591 -> 1672 bytes + test/leaky-polygon-ps-argb32-ref.png | Bin 233 -> 355 bytes + test/line-width-ps-argb32-ref.png | Bin 201 -> 244 bytes + test/line-width-scale-ps-argb32-ref.png | Bin 1599 -> 3903 bytes + test/new-sub-path-ps-argb32-ref.png | Bin 316 -> 559 bytes + test/path-data-ps-argb32-ref.png | Bin 322 -> 442 bytes + test/select-font-face-ps-argb32-ref.png | Bin 481 -> 1443 bytes + test/show-text-current-point-ps-argb32-ref.png | Bin 602 -> 1479 bytes + test/transforms-ps-argb32-ref.png | Bin 287 -> 420 bytes + 24 files changed, 0 insertions(+), 0 deletions(-) + +commit 3e24f516a2f5435306ee8491e7955177b960a797 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 16:13:29 2006 -0400 + + Change the text string "cd" to "AB" in test to match the other string + that is drawn. The reason, one is draw using show_text, the other + using text_path. The difference is more emphasized when rendering the + same string. + + test/ft-text-vertical-layout-ref.png | Bin 834 -> 907 bytes + test/ft-text-vertical-layout.c | 2 +- + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 3d95919fab2e47dea9e7b266849db7a4c05eb9a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 15:27:11 2006 -0400 + + Switch from ghostscript's png16m driver to pngalpha for PS->PNG again. + We have switched back and forth quite a few times. This time I'm switching + because with pngalpha we get gray antialiased text and graphics while with + png16m all we get is no antialiasing. This is definitely a bug in the png16m + driver, but I won't wait until it gets fixed upstream. + + Previously Carl Worth switched to pngalpha and reverted it immediately in + commit c4fc7b06b53c811ddc20def91aaccd756c28a924. I've now fixed image-diff to + work with the output of pngalpha, so we can switch. It requires lots of + reference image updates, but still doesn't help with reducing the number of + PS-specific reference images we need. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5a23fd70a0af5c2b0cb990b89ebc5ed7a01aae82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 15:20:39 2006 -0400 + + Change the way diff images highlight differences. + Previously it was using the equation 128+diff/3, which results in + lots of gray and de-emphasized difference. Now it's using + MIN(255,diff*4) which more emphasizes the real difference. + + test/buffer-diff.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit d85f30e789c74cc8f1d83ba609d8b02886686440 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 15:18:19 2006 -0400 + + Make image_diff_flattened flatten the first image too. + This is useful to use the ghostscript pngalpha driver for example. + + test/buffer-diff.c | 34 ++++++++++++++++++++++++++-------- + 1 file changed, 26 insertions(+), 8 deletions(-) + +commit 556a4d8405a4f53e465425ccc1f6506e51b29344 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 1 15:16:10 2006 -0400 + + Add vector_ignored_tests that is tests ignored for ps/pdf/svg + that includes all tests depending on CAIRO_ANTIALIAS_NONE and + CAIRO_ANTIALIAS_SUBPIXEL. + This removes separate pdf_ignored_tests and svg_ignored_tests + arrays that were out of synch and otherwise the same. + + test/cairo-test.c | 43 ++++++++++++++++++++++--------------------- + 1 file changed, 22 insertions(+), 21 deletions(-) + +commit 226178539ad72ffa414925e094297e12c566083d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 16:05:34 2006 -0400 + + Add comments about CAIRO_ENABLE_BACKEND. + + configure.in | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 2fa709d6af58713f7b362748a728a6f8c983d2ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 15:17:15 2006 -0400 + + Set font options in the test context and make tests not do that + This should help with not requiring many backend-specific reference + images, and some should be removed now. + + test/cairo-test.c | 10 ++++++++++ + test/clip-operator.c | 9 --------- + test/font-matrix-translation.c | 9 --------- + test/ft-font-create-for-ft-face.c | 2 ++ + test/ft-text-antialias-none.c | 3 +-- + test/ft-text-vertical-layout.c | 5 +---- + test/glyph-cache-pressure.c | 10 ---------- + test/operator-clear.c | 9 --------- + test/operator-source.c | 9 --------- + test/select-font-face.c | 11 ----------- + test/show-glyphs-many.c | 9 --------- + test/show-text-current-point.c | 10 ---------- + test/text-antialias-gray.c | 5 +---- + test/text-antialias-none.c | 5 +---- + test/text-antialias-subpixel.c | 8 ++------ + test/text-pattern.c | 9 --------- + test/text-rotate.c | 3 +-- + test/unbounded-operator.c | 9 --------- + 18 files changed, 19 insertions(+), 116 deletions(-) + +commit 9fcb3c32c1f16fe6ab913e27eb54d18b7d9a06b0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 14:50:50 2006 -0400 + + Set fallback resolution in create_similar. Update docs to reflect that. + + src/cairo-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit a61ac1aeedca3a032b9d53715afb5d52c06efec0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 14:47:10 2006 -0400 + + Set font_options on image surfaces we create. + This may not be really necessary as we only create image surfaces as + temporary surfaces and their font options should not be sampled normally. + + src/cairo-paginated-surface.c | 37 ++++++++++++++++++++++++++++--------- + 1 file changed, 28 insertions(+), 9 deletions(-) + +commit b3341b4eda274036a74eea3187d47ef257688828 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 14:45:54 2006 -0400 + + Let backends return NULL in create_similar to take the fallback path. + Make xlib backend use it. + + src/cairo-surface.c | 5 +++-- + src/cairo-xlib-surface.c | 5 +++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit bdb4e1edadb78a2118ff70b28163f8bd4317f1ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 14:44:42 2006 -0400 + + Implement per-surface font options. + New internal function _cairo_surface_set_font_options is used to set them. + cairo_surface_create_similar propagates the font options of the other + surface into the newly created surface. Fixes bugs with font options in + fallback images and bug 4106. + + src/cairo-surface.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++------ + src/cairoint.h | 12 ++++++++++++ + 2 files changed, 61 insertions(+), 6 deletions(-) + +commit a8a0082c53d060e07c10c6efda9bb808e354fd59 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 14:41:27 2006 -0400 + + Remove dummy create_similar in PS/PDF and let fallback do the same + which is simply creating an image surface. + + src/cairo-pdf-surface.c | 15 +-------------- + src/cairo-ps-surface.c | 15 +-------------- + 2 files changed, 2 insertions(+), 28 deletions(-) + +commit 72b51b6f0c49f9eac7d8ef4caff59733312b1ca6 +Author: Ian Osgood <iano@quirkster.com> +Date: Wed Jun 21 07:06:20 2006 -0700 + + XCB: implement set_clip_region + + src/cairo-xcb-surface.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 93 insertions(+), 1 deletion(-) + +commit 2eeb338590957a90bdebfc6a00fc05323e76f9ee +Author: Jamey Sharp <jamey@minilop.net> +Date: Mon Jun 12 17:47:55 2006 -0700 + + XCB: Use xcb-renderutil where cairo-xlib used libXrender. + + configure.in | 2 +- + src/cairo-xcb-surface.c | 199 ++++++++++-------------------------------------- + 2 files changed, 41 insertions(+), 160 deletions(-) + +commit 6b0d3433b7073ece1f7959475e6058911dc382ad +Author: Jamey Sharp <jamey@minilop.net> +Date: Mon Jul 31 08:53:57 2006 -0700 + + XCB: XCBRenderTRAP was renamed to XCBRenderTRAPEZOID. + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 88675958efbe57c7cc5135d6fb73e99f42d848d8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 31 01:03:15 2006 -0400 + + Remove config.cache in autogen.sh. + + autogen.sh | 2 ++ + 1 file changed, 2 insertions(+) + +commit eb9caf083353f3430f786da717b6c56b13f82ecb +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jul 28 16:59:54 2006 -0700 + + Add -Wsign-compare compiler flag and fix all warnings + + configure.in | 2 +- + pixman/src/fbpict.c | 2 +- + pixman/src/icformat.c | 12 ++++++------ + pixman/src/pixman.h | 10 +++++----- + src/cairo-array.c | 6 +++--- + src/cairo-font-subset.c | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-hash.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-output-stream.c | 2 +- + src/cairo-path-stroke.c | 4 ++-- + src/cairo-pattern.c | 4 ++-- + src/cairo-pdf-surface.c | 7 +++---- + src/cairo-png.c | 8 ++++---- + src/cairo-ps-surface.c | 2 +- + src/cairo-scaled-font-subsets.c | 6 +++--- + src/cairo-scaled-font.c | 2 +- + src/cairo-svg-surface.c | 6 +++--- + src/cairo-xlib-surface.c | 2 +- + src/cairoint.h | 16 ++++++++-------- + 20 files changed, 49 insertions(+), 50 deletions(-) + +commit 5e0f46cdebb5e086b344cc09b4537982a07e45cd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 28 15:41:11 2006 -0700 + + Standardize on unsigned for ref_count type and add CAIRO_REF_COUNT_INVALID + + The CAIRO_REF_COUNT_INVALID macro simply hides the ((unsigned int)-1) cast + to avoid warnings about comparison between signed and unsigned values. + + src/cairo-font.c | 8 ++++---- + src/cairo-pattern.c | 12 ++++++------ + src/cairo-scaled-font.c | 6 +++--- + src/cairo-surface.c | 12 ++++++------ + src/cairo.c | 6 +++--- + src/cairoint.h | 8 +++++--- + 6 files changed, 27 insertions(+), 25 deletions(-) + +commit 84b37568e1485c461df663f875ba5546b44e5c5c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 28 15:13:00 2006 -0700 + + Add -Wold-style-definition compiler falg and fix all warnings. + + configure.in | 2 +- + pixman/src/pixregion.c | 53 +++++++++++++++++++++----------------------------- + 2 files changed, 23 insertions(+), 32 deletions(-) + +commit 811f7af1b2cf659b3a3c9b0749c65742207cb946 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 28 18:18:50 2006 -0400 + + s/dist-hook/dist-hook-local/ + Should drop spurious make warning. + + gtk-doc.make | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 84114949488c7b9a2ae60edb33903b541ce1dadf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 28 15:12:10 2006 -0400 + + Move font-matrix translation and device transform from surface to gstate + + Fixes the bug that paginated backends had font-matrix translation + applied twice, AND removes a second copy of the glyphs. It's + essentially similar to what cworth did for stroke/fill/clip in + this commit: bd92eb7f3c58fdcbe05f67b9a879798246c616bc + + Reviewed by: Carl Worth + + src/cairo-gstate.c | 10 ++++++---- + src/cairo-surface.c | 54 +++++++++++++++++------------------------------------ + 2 files changed, 23 insertions(+), 41 deletions(-) + +commit 2f7da1aafb5ca050446fe3645eac3f95b9636b19 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jul 28 10:51:24 2006 -0700 + + INSTALL: Mention DYLD_LIBRARY_PATH for mac OS X + + INSTALL | 3 +++ + 1 file changed, 3 insertions(+) + +commit e5f4b922618ca2e56d6a66e20761e78d42211ec9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 27 15:20:14 2006 -0400 + + Make "double *dash" argument const in cairo_set_dash + + src/cairo-gstate.c | 2 +- + src/cairo.c | 8 ++++---- + src/cairo.h | 8 ++++---- + src/cairoint.h | 2 +- + 4 files changed, 10 insertions(+), 10 deletions(-) + +commit e92d693e073dc5fba871b615909206f0049ead41 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 27 14:58:46 2006 -0400 + + Make "CAIRO_TEST_TARGET=... make check" work again + + Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that + one can limit tested targets both through CAIRO_TEST_TARGET env var + and TARGETS make var on the command line. + + test/Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 6ced3edb69f5f5a25a5c40c0bad7dc638cc216cb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 21 18:46:16 2006 -0400 + + Don't make doc upon make install. + + gtk-doc.make | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 280823173dce520a43eb54c0b18d2e2eae6a55a0 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 27 00:57:53 2006 -0700 + + Update ROADMAP with 1.2.2 and 1.4 plans now that 1.2.0 is out + + ROADMAP | 209 ++++++++++++++++++---------------------------------------------- + 1 file changed, 59 insertions(+), 150 deletions(-) + +commit 456cdb3058f3b416109a9600167cd8842300ae14 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jul 26 15:48:56 2006 -0700 + + Elide size-zero glyphs from calls to XRender functions. + + There appears to be a bug in some X servers which is triggered by + rendering 1-bit glyphs with zero size via the functions + XRenderAddGlyphs and XRenderCompositeText8 (and likely its variants). + + We avoid this bug by making a copy of the glyphs array which does not + include any of the size-zero glyphs so that the X server never sees them. + + src/cairo-xlib-surface.c | 28 ++++++++++++++++++++++------ + 1 file changed, 22 insertions(+), 6 deletions(-) + +commit 8601c2c68306c956744399099a941363d446b906 +Merge: cd2f50e b719188 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Jul 20 23:04:37 2006 -0700 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit cd2f50e6c421d35c3d5b0d76ed0fdd03a033b2c2 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Jul 20 23:01:06 2006 -0700 + + Check for zero before freeing region + + src/cairo-directfb-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b7191885c88068dad57d68ced69a752d1162b12c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jul 17 11:33:47 2006 -0700 + + [xlib] Remove XSync implementation of surface_flush + + Remove the xlib implementation of surface_flush which just called XSync + before. + + src/cairo-xlib-surface.c | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +commit fbb1758ba8384650157b2bbbc93d161b0c2a05f0 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jun 25 16:12:38 2006 +0200 + + Fix degenerate-path stroking with dashed lines. + + This draws dashed degenerate-paths if the dash is on at the point of the + path and otherwise draws nothing. + + src/cairo-path-stroke.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit fdebc369d28f70ceba228d3131753225b2dbf844 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sun Jun 25 15:48:48 2006 +0200 + + Modify degenerate-path test case to test dashed degenerate paths. + + test/degenerate-path-ps-argb32-ref.png | Bin 197 -> 220 bytes + test/degenerate-path-ref.png | Bin 193 -> 216 bytes + test/degenerate-path-rgb24-ref.png | Bin 174 -> 189 bytes + test/degenerate-path.c | 54 +++++++++++++++++++++++++++------ + 4 files changed, 44 insertions(+), 10 deletions(-) + +commit b607cdff98e621a6650bccef20f9877a0e7aa1d9 +Author: Jeff Muizelaar <jeff@freiheit.infidigm.net> +Date: Sat Jul 15 14:39:26 2006 -0400 + + Test closed dashed paths where the first and last sub-path do not join. + + This tests the situation reported by Keith Wells where the start point of a + closed dashed path was not being properly capped. + + test/dash-caps-joins-ps-argb32-ref.png | Bin 1247 -> 2205 bytes + test/dash-caps-joins-ref.png | Bin 2583 -> 4680 bytes + test/dash-caps-joins.c | 45 ++++++++++++++++++++------------- + 3 files changed, 27 insertions(+), 18 deletions(-) + +commit 84840e6bba6e72aa88fad7a0ee929e8955ba9051 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 14 21:42:41 2006 -0400 + + Use font matrix offset to reposition glyph origin instead of adjusting advance + + As the font matrix includes translation, which is otherwise unused for glyph + transformation, the interpretation of translation is fairly arbitrary. For + 1.2.0, we choose to have this translation affect the glyph advance with the + thought that it could be used to do letter spacing/kerning. That is fairly + useless in practice, and a far more useful interpretation is to relocate + the origin of each glyph. + + This patch uses the translation in the font matrix as an offset for the + glyph origin in user space. It turns out glyph extents were already correctly + shifted. + + The end result with this patch is to have cairo match the 1.0 behaviour for + font matrix translations, but now we know why :-) + + Explanation above courtesy of Keith Packard. + + src/cairo-scaled-font.c | 6 +++--- + src/cairo-surface.c | 12 +++++++----- + 2 files changed, 10 insertions(+), 8 deletions(-) + +commit 47d3c5a2c63478288345235f26533f2d6059e815 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jul 14 20:06:34 2006 -0400 + + Flush stdout after writing \r, to remove artifacts. + + test/cairo-test.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit c70edff0842bc6f7238e17a5fe92dddceec283d3 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jul 14 12:45:48 2006 -0700 + + Add font-matrix-translation test case. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/font-matrix-translation-ref.png | Bin 0 -> 1006 bytes + test/font-matrix-translation.c | 113 +++++++++++++++++++++++++++++++++++ + 4 files changed, 115 insertions(+) + +commit b390e2c45632a4974b85a6a5ea414e249adb62a3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 16:01:57 2006 -0700 + + pixman-rotate: remove stale svg backend reference images + + test/pixman-rotate-svg-argb32-ref.png | Bin 258 -> 0 bytes + test/pixman-rotate-svg-rgb24-ref.png | Bin 358 -> 0 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 2b30f85cade33653afddf536aa7e775dd360f501 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 15:56:12 2006 -0700 + + ft-text-vertical-layout: Update stale reference images + + test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 956 -> 725 bytes + test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 808 -> 808 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 5d64efdbb8fc4e17d4fa44d21068870cd2aea7ce +Merge: 9907813 6a5d66f +Author: Michael Emmel <memmel@debian.localdomain> +Date: Fri Jul 14 09:37:22 2006 -0700 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit 9907813d575cefdda20c77d69ad911fa70d2cf4c +Author: Michael Emmel <memmel@debian.localdomain> +Date: Fri Jul 14 09:36:35 2006 -0700 + + Fixed debug message to use new member name + + src/cairo-directfb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6a5d66f651b7fe94e74ee803a452bac5b54c95ca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 18:53:25 2006 -0400 + + Go back to "!!!CRASHED!!!" message now that there's no confusion. + + test/cairo-test.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6c7099b0ccc926b4f427c3cceb1fed5534c693ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 18:49:52 2006 -0400 + + Only generate HTML for log files passed on the command line. + + With the make bits already in place, this means that make retest + creates HTML for only the retested tests. + + test/make-html.pl | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4b22cb41a9c1fbfc310ae7fd024ceffdb4bf3947 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 15:23:06 2006 -0700 + + Use 'FAIL' instead of 'UNEXPECTED FAILURE' in test output. + + There's no ambiguity anymore due to duplicated printing, so go + back to the classic, and easier to read wording. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b2d04d7f1a14c961ea10b76581436ae07dfe6ef5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 15:21:02 2006 -0700 + + Rename no_fail_on_stdout to eliminate confusing negative inside a Boolean variable name + + test/cairo-test.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit ff1280ce98ecc9ddee7b63e21eaec3d47ed3df8b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 15:08:19 2006 -0700 + + cairo-test.c: Prefer FALSE and TRUE for cairo_bool_t values. + + test/cairo-test.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ebc736730615021b07b851b41c6de79248ca00e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 18:17:39 2006 -0400 + + Fix test result formatting. + + test/cairo-test.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 3f7593612f52f88eabb87de0c1efbf86bf31e8c2 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 15:00:16 2006 -0700 + + Make the various test and check targets depend on all as well. + + Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 307a17f78cd2adda8a59ef16385df3be5786d2bd +Merge: 5ed64e3 1409b8b +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Jul 13 12:17:25 2006 -0700 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit 5ed64e3915a45785696fd741b69a03cc5050be88 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Thu Jul 13 12:15:42 2006 -0700 + + Rewrote to remove intermediate surfaces + + src/cairo-directfb-surface.c | 402 +++++++++++++++++++------------------------ + 1 file changed, 178 insertions(+), 224 deletions(-) + +commit 1409b8be0ca00a0904b1732661915d3eba753a51 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 14:33:41 2006 -0400 + + Fix Name tag in backend .pc files to include "cairo-". + + src/cairo-backend.pc.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b2668e944d1819f2b8f9973f1f42b1ca36bb193d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 14:02:58 2006 -0400 + + Use cairo_bool_t. + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 510d23acef9fc75eb968795191091cbc1d33bc09 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 13:39:04 2006 -0400 + + Fix doc typo. + + src/cairo.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 601c0503f7906151698929051852d13c377cfef1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 13:30:52 2006 -0400 + + Send grep errors to hell^Wnull. + + test/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 09dfae5fbf34fb19b283973df7112b14638d6466 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 13:22:49 2006 -0400 + + Don't write FAIL messages on stdout if both stdout/err are going to screen. + + test/cairo-test.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 778c4730a86296bf0a71080cf7008d7291792256 +Author: Kent Worsnop <kworsnop@accesswave.ca> +Date: Thu Jul 13 10:20:12 2006 -0700 + + PDF: Fix for dash-no-dash test case, (so that dashing can be turned off) + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit d2d9a74c77d6bbc51502cee2288fd7d76c30f926 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jul 12 14:49:14 2006 -0700 + + Add dash-no-dash test case to demonstrate PDF failure to turn off dashing. + + test/.gitignore | 3 +- + test/Makefile.am | 8 ++-- + test/dash-no-dash-ref.png | Bin 0 -> 152 bytes + test/dash-no-dash.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 102 insertions(+), 4 deletions(-) + +commit f3d45d17902cb109dacf30d826ea8f93408473ba +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 10:04:55 2006 -0700 + + Eliminate a few simple compiler warnings + + test/cairo-test.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 65d0431b98e7e8d966bbcb43a542a86a9c95e0dc +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 13 10:04:19 2006 -0700 + + Add retest and recheck targets to the top-level Makefile + + Makefile.am | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit da0f348350c3ca28d40601aefbca12903632cc18 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 13:16:10 2006 -0400 + + ***cworth finds them [the background colors] a bit too bright + + test/make-html.pl | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit cf1b23a4c57d436098619443068611a48b88187e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 12:58:24 2006 -0400 + + Add prototype for draw in each test file and remove it from the header. + + test/a8-mask.c | 2 ++ + test/bitmap-font.c | 2 ++ + test/cairo-test.h | 1 - + test/caps-joins-alpha.c | 2 ++ + test/caps-joins.c | 2 ++ + test/caps-sub-paths.c | 2 ++ + test/clip-all.c | 2 ++ + test/clip-fill-rule-pixel-aligned.c | 2 ++ + test/clip-fill-rule.c | 2 ++ + test/clip-nesting.c | 2 ++ + test/clip-operator.c | 2 ++ + test/clip-twice.c | 2 ++ + test/composite-integer-translate-over-repeat.c | 2 ++ + test/composite-integer-translate-over.c | 2 ++ + test/composite-integer-translate-source.c | 2 ++ + test/create-from-png-stream.c | 2 ++ + test/create-from-png.c | 2 ++ + test/dash-caps-joins.c | 2 ++ + test/dash-offset-negative.c | 2 ++ + test/dash-scale.c | 2 ++ + test/dash-zero-length.c | 2 ++ + test/degenerate-path.c | 2 ++ + test/device-offset-positive.c | 2 ++ + test/device-offset.c | 2 ++ + test/extend-reflect.c | 2 ++ + test/fill-and-stroke-alpha-add.c | 2 ++ + test/fill-and-stroke-alpha.c | 2 ++ + test/fill-and-stroke.c | 2 ++ + test/fill-rule.c | 2 ++ + test/filter-nearest-offset.c | 2 ++ + test/ft-font-create-for-ft-face.c | 2 ++ + test/ft-text-antialias-none.c | 2 ++ + test/ft-text-vertical-layout.c | 2 ++ + test/get-and-set.c | 2 ++ + test/get-group-target.c | 2 ++ + test/glyph-cache-pressure.c | 2 ++ + test/gradient-alpha.c | 2 ++ + test/leaky-dash.c | 2 ++ + test/leaky-polygon.c | 2 ++ + test/line-width-scale.c | 2 ++ + test/line-width.c | 2 ++ + test/linear-gradient.c | 2 ++ + test/mask-ctm.c | 2 ++ + test/mask-surface-ctm.c | 2 ++ + test/mask.c | 2 ++ + test/move-to-show-surface.c | 2 ++ + test/new-sub-path.c | 2 ++ + test/nil-surface.c | 2 ++ + test/operator-clear.c | 2 ++ + test/operator-source.c | 2 ++ + test/paint-source-alpha.c | 2 ++ + test/paint-with-alpha.c | 2 ++ + test/paint.c | 2 ++ + test/path-data.c | 2 ++ + test/pixman-rotate.c | 2 ++ + test/push-group.c | 2 ++ + test/rectangle-rounding-error.c | 2 ++ + test/rel-path.c | 2 ++ + test/scale-source-surface-paint.c | 2 ++ + test/select-font-face.c | 2 ++ + test/select-font-no-show-text.c | 2 ++ + test/self-copy.c | 2 ++ + test/self-intersecting.c | 2 ++ + test/set-source.c | 2 ++ + test/show-glyphs-many.c | 2 ++ + test/show-text-current-point.c | 2 ++ + test/source-clip.c | 2 ++ + test/source-surface-scale-paint.c | 2 ++ + test/surface-finish-twice.c | 2 ++ + test/surface-pattern.c | 2 ++ + test/text-antialias-gray.c | 2 ++ + test/text-antialias-none.c | 2 ++ + test/text-antialias-subpixel.c | 2 ++ + test/text-cache-crash.c | 2 ++ + test/text-pattern.c | 2 ++ + test/text-rotate.c | 2 ++ + test/transforms.c | 2 ++ + test/translate-show-surface.c | 2 ++ + test/trap-clip.c | 2 ++ + test/unantialiased-shapes.c | 2 ++ + test/unbounded-operator.c | 2 ++ + test/zero-alpha.c | 2 ++ + 82 files changed, 162 insertions(+), 1 deletion(-) + +commit f8eeca97684f7c8eba7b918c34fe5ccbf32e2f5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 11:48:42 2006 -0400 + + Tiny doc typo fix. + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0ac2bbbf52737b2e368de269651c56dab90c928a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 13 11:27:05 2006 -0400 + + Improve test HTML generation: + - Make "make retest" not generate all .log files. + - Format improvements in the generated HTML file. + + test/Makefile.am | 27 +++++++++++++++++++-------- + test/cairo-test.c | 16 ++++++++-------- + test/make-html.pl | 49 ++++++++++++++++++++++++++++--------------------- + 3 files changed, 55 insertions(+), 37 deletions(-) + +commit f79a9f5a5259f33284d5e63ef2ddac0be4ea7d41 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jul 12 04:27:55 2006 -0400 + + Improve backend .pc files generation: + - Add all non-pkgconfig libs to Libs.private in cairo.pc + - Make cairo-xlib-xrender.pc Require cairo-xlib.pc + + configure.in | 56 ++++++++++++++++++++++++++++++------------------- + src/Makefile.am | 2 +- + src/cairo-backend.pc.in | 2 +- + src/cairo.pc.in | 5 +++-- + 4 files changed, 39 insertions(+), 26 deletions(-) + +commit 973d3a3d1466830dcaa94e9fe39fa6fdf510fbbc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 11 22:19:39 2006 -0400 + + More test suite infrastructure improvements: + - Remove cairo_test_expect_failure. cairo-test.c now checks + env var CAIRO_XFAIL_TESTS to see if the running test is + expected to fail. The reason for expected failure is + appended to the test description. + - Test description is written out. + - Failed/crashed tests also write a line out to stderr (in red), + so one can now redirect stdout to /dev/null to only see failures. + - cairo_test() has been changed to not take the draw function + anymore, instead, draw function is now part of the test struct. + - "make check" doesn't allow limiting backends to test using env + var anymore. To limit backends to test, one should use the + TARGETS variable on the make command line. + - "make check-valgrind" now writes its log to valgrind-log instead + of valgrind.log, to not interfere with test log file processing. + + test/.gitignore | 1 + + test/Makefile.am | 9 ++- + test/README | 6 +- + test/a8-mask.c | 9 +-- + test/bitmap-font.c | 5 +- + test/cairo-test.c | 98 ++++++++++++++++++-------- + test/cairo-test.h | 24 +++---- + test/caps-joins-alpha.c | 5 +- + test/caps-joins.c | 5 +- + test/caps-sub-paths.c | 5 +- + test/clip-all.c | 5 +- + test/clip-fill-rule-pixel-aligned.c | 5 +- + test/clip-fill-rule.c | 5 +- + test/clip-nesting.c | 5 +- + test/clip-operator.c | 7 +- + test/clip-twice.c | 5 +- + test/composite-integer-translate-over-repeat.c | 5 +- + test/composite-integer-translate-over.c | 5 +- + test/composite-integer-translate-source.c | 5 +- + test/create-for-stream.c | 29 +++++--- + test/create-from-png-stream.c | 5 +- + test/create-from-png.c | 5 +- + test/dash-caps-joins.c | 5 +- + test/dash-offset-negative.c | 5 +- + test/dash-scale.c | 5 +- + test/dash-zero-length.c | 5 +- + test/degenerate-path.c | 5 +- + test/device-offset-positive.c | 5 +- + test/device-offset.c | 5 +- + test/extend-reflect.c | 9 +-- + test/fallback-resolution.c | 6 +- + test/fill-and-stroke-alpha-add.c | 5 +- + test/fill-and-stroke-alpha.c | 5 +- + test/fill-and-stroke.c | 5 +- + test/fill-rule.c | 5 +- + test/filter-nearest-offset.c | 9 +-- + test/ft-font-create-for-ft-face.c | 5 +- + test/ft-text-antialias-none.c | 5 +- + test/ft-text-vertical-layout.c | 5 +- + test/get-and-set.c | 7 +- + test/get-group-target.c | 5 +- + test/glyph-cache-pressure.c | 5 +- + test/gradient-alpha.c | 5 +- + test/leaky-dash.c | 9 +-- + test/leaky-polygon.c | 5 +- + test/line-width-scale.c | 5 +- + test/line-width.c | 5 +- + test/linear-gradient.c | 5 +- + test/mask-ctm.c | 5 +- + test/mask-surface-ctm.c | 5 +- + test/mask.c | 7 +- + test/move-to-show-surface.c | 5 +- + test/multi-page.c | 8 +-- + test/new-sub-path.c | 5 +- + test/nil-surface.c | 5 +- + test/operator-clear.c | 7 +- + test/operator-source.c | 7 +- + test/paint-source-alpha.c | 5 +- + test/paint-with-alpha.c | 5 +- + test/paint.c | 5 +- + test/path-data.c | 5 +- + test/pdf-features.c | 2 +- + test/pixman-rotate.c | 5 +- + test/ps-features.c | 2 +- + test/push-group.c | 5 +- + test/rectangle-rounding-error.c | 5 +- + test/rel-path.c | 5 +- + test/scale-source-surface-paint.c | 5 +- + test/select-font-face.c | 5 +- + test/select-font-no-show-text.c | 7 +- + test/self-copy.c | 5 +- + test/self-intersecting.c | 9 +-- + test/set-source.c | 5 +- + test/show-glyphs-many.c | 5 +- + test/show-text-current-point.c | 5 +- + test/source-clip.c | 5 +- + test/source-surface-scale-paint.c | 5 +- + test/surface-finish-twice.c | 5 +- + test/surface-pattern.c | 5 +- + test/svg-clip.c | 2 +- + test/svg-surface.c | 10 +-- + test/text-antialias-gray.c | 5 +- + test/text-antialias-none.c | 5 +- + test/text-antialias-subpixel.c | 5 +- + test/text-cache-crash.c | 7 +- + test/text-pattern.c | 5 +- + test/text-rotate.c | 9 +-- + test/transforms.c | 5 +- + test/translate-show-surface.c | 5 +- + test/trap-clip.c | 7 +- + test/unantialiased-shapes.c | 5 +- + test/unbounded-operator.c | 7 +- + test/xlib-surface.c | 2 +- + test/zero-alpha.c | 5 +- + 94 files changed, 386 insertions(+), 260 deletions(-) + +commit 94bdbc15f79308269f1bcd74b3d8899f8458babc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 11 17:27:08 2006 -0400 + + Improve test suite build infrastructure + - Add new target recheck, that checks only failed tests + - Add targets test and retest, and make html after (re)checking + - Make targets html and index.html lazy, only update if any tests changed + - Improve build system such that checking one test (using TESTS=...) doesn't + build all tests + - Remove pixman-rotate from XFAIL + + Makefile.am | 4 ++- + test/Makefile.am | 69 +++++++++++++++++++++++++++++++++++++++++++--------- + test/cairo-test.c | 7 +++--- + test/pixman-rotate.c | 3 +-- + 4 files changed, 66 insertions(+), 17 deletions(-) + +commit c45a9321759e5cc0fcf6eda85f91d09ebb4db0d2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 11 16:07:13 2006 -0400 + + Use Bitstream Vera Sans and Latin text in ft-text-vertical. + We don't really rely on the Japanese text and font, as FreeType + synthesizes vertical metrics for all fonts. + + test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 349 -> 298 bytes + test/ft-text-vertical-layout-ref.png | Bin 1130 -> 834 bytes + test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 1021 -> 799 bytes + test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 1098 -> 808 bytes + test/ft-text-vertical-layout.c | 4 ++-- + 5 files changed, 2 insertions(+), 2 deletions(-) + +commit fe647ca42b24ff844dd0d94642adaf46ea7a28dd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 11 15:18:14 2006 -0400 + + Oops. Fix doc format. + + src/cairo.h | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 90a46affe626c9afafd687ac2d71a57f4583e216 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 11 13:36:52 2006 -0400 + + Add note to docs for some enums about possible future additions. + + src/cairo.h | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit d27a00874bc044b4c9aefacbc850d5f7ee106b6f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 11 09:23:18 2006 -0400 + + Disable PDF backend if zlib not found. + Explicitly add -lm to CAIRO_LIBS + + configure.in | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit e0ad1aa995bcec4246c0b8ab0d5a5a79871ce235 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 10 13:45:51 2006 -0400 + + Change version number of Sun's Xorg server with buggy repeat from 60800000 to + 60900000. (#7483, pointed by Brian Cameron) + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b006bf9d2c7d39c413527017fc792a38b598555a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 10 11:52:58 2006 -0400 + + Add change stat to ChangeLog. + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ccb54b35ed2252ae9ece95204a5ad7b43cde936e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 10 10:35:42 2006 -0400 + + Small doc fix. + + src/cairo.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit defa23206cfa83ad4460a868f78289ba7f7c1c53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 10 10:26:19 2006 -0400 + + Fix nil surface initializations for surface type. (#7322) + + src/cairo-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a1143d120fbc142fc6ae15f394cfbe400a4a0b3e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jul 8 21:04:21 2006 -0400 + + Generate index of new symbols in 1.2. + + doc/public/cairo-docs.xml | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 6efd145882155971be85b23807bd5c52d1025cc3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jul 8 17:52:24 2006 -0400 + + Better creation rules for cairo.def. + + src/Makefile.am | 39 +++++++++++++-------------------------- + 1 file changed, 13 insertions(+), 26 deletions(-) + +commit f3f374fb8066e09da1948674decadc6c764f2a1b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jul 8 16:39:52 2006 -0400 + + Include cairo-svg.h in cairo_win32_api_headers. (bug 7462) + + src/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a443a4215869b3556d9d703c80061879020064ad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 6 23:06:14 2006 -0400 + + Fix doc typo. + + src/cairo-matrix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 731925f00a7391755cabb9253c9a9f2b2dccbdb8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 6 23:05:13 2006 -0400 + + Fix doc syntax. + + src/cairo-matrix.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 9c37cac22b071f9fb00f9000779bb988df6e010c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 6 17:52:13 2006 -0400 + + Fix typo when printing error for unsupported X formats. It was mistakenly + marking Green and Blue swapped. + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 807cb2fd8e4867d5aab7bd2c887e17160cf9a22f +Author: David Reveman <davidr@novell.com> +Date: Thu Jul 6 13:50:41 2006 -0400 + + Ignore color for CAIRO_OPERATOR_CLEAR in glitz backend. + + src/cairo-glitz-surface.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit 95016b3274f4eedf6bd917a5b8bf8f6745c54581 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 6 13:48:18 2006 -0400 + + Make CAIRO_TEST_TARGET="" make check pass tests. + + test/cairo-test.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit f90182fe2ad383bf240e2b02003fd7cd0a7e90ff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 6 13:42:25 2006 -0400 + + Update test/README + + test/README | 50 +++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 37 insertions(+), 13 deletions(-) + +commit 83dcbe05b5bce6619e650d63be58a35fcb1609c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jul 5 04:29:54 2006 +0200 + + For check-valgrind, call the version of libtool in our source distribution, + not the one found in PATH. + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1cb0bc40a3ab9373d19c186d98059007f288fa13 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jul 5 04:22:32 2006 +0200 + + Do not use sighandler_t. Bug 7401. + + test/cairo-test.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 91ad3ae78400d2d942354b8cde514480dffc5090 +Author: Jonathon Jongsma <jonathon.jongsma@gmail.com> +Date: Tue Jul 4 16:23:24 2006 -0500 + + Fix documentation typo in cairo_scaled_font_get_font_options() + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94c5537924da3a6b00b106eda80e61a6f4a9a1f0 +Author: Jonathon Jongsma <jonathon.jongsma@gmail.com> +Date: Tue Jul 4 14:58:58 2006 -0500 + + Fix a typo in cairo_font_extents_t documentation + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 57a644fb04bfd4831aa1ec1e5f82c989bbf90c8c +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 05:06:11 2006 +0200 + + RELEASING: Mention README as the source for blurbs + + RELEASING | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 7bff2eb81905b2d1d01f087612fe8c1354166a94 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jul 1 04:37:50 2006 +0200 + + Increment CAIRO_VERSION to 1.2.1 after making the 1.2.0 release + + RELEASING | 2 +- + configure.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog.pre-1.6 b/ChangeLog.pre-1.6 new file mode 100644 index 000000000..8bab8ee50 --- /dev/null +++ b/ChangeLog.pre-1.6 @@ -0,0 +1,23951 @@ +commit d6263bec89bcd1565fb0f56a9840cd6f7761097f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 10 17:34:41 2008 -0700 + + Increment cairo version to 1.6.0 + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 709805c26f567b7fa90d04e701ccbf1cccc34da7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 10 17:33:51 2008 -0700 + + NEWS: Add notes for 1.6.0 release + + NEWS | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 190 insertions(+), 8 deletions(-) + +commit aadbaf7d990d0d5cd7c25cc856dbcfcc357b44f1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 02:45:56 2008 -0700 + + Increment version to 1.5.20 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8f123d035af0c02dc0a668a073410756edafbdd6 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 02:45:31 2008 -0700 + + NEWS: Add notes for 1.5.20 snapshot + + NEWS | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 47 insertions(+) + +commit f7dea9a8d3da7f57286db4b1b6300726483a0d76 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 02:28:52 2008 -0700 + + Fix distcheck by renaming large-source-ref.c to large-source-ref.png (oops!) + + test/large-source-ref.c | Bin 137 -> 0 bytes + test/large-source-ref.png | Bin 0 -> 137 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit c26a7de9707e26d0552b0fedcd4bf2e0ba6542b2 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 01:54:27 2008 -0700 + + Prevent potentially infinite wandering through memeory in _cairo_hull_prev_valid + + It is possible for _cairo_hull_prev_valid to be called just once + right before the calling loop is going to terminate. In this + case we really don't want to walk off the beginning of the + array and start wandering. + + Thanks to Jonathan Watt for noticing this problem: + + https://bugzilla.mozilla.org/show_bug.cgi?id=306649#c21 + + src/cairo-hull.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit c19133eb9ab31bbdc7e82573033e513e9eb867f2 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 01:34:37 2008 -0700 + + Revert "[test] Repeat tests using cairo_push_group()." + + This reverts commit 07122e64fa9529e7ba9323988a5af1d1e7c2c55f. + + The extra testing did find a pdf bug, and that should be fixed, + but the extra maintenance burden of running another iteration + of all tests does not seem justfied at all---particularly since + it looks like dozens of new reference images would be needed + for the svg backend. + + Also, the new "failures" of the image backend with this new + testing look like a misunderstanding of exactly what the new + testing is actually drawing. + + test/cairo-test.c | 119 ++++++++---------------------------------------------- + 1 file changed, 16 insertions(+), 103 deletions(-) + +commit c1f7655f2fd5373a74d3fbf5977ebbd84e401e25 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 00:40:58 2008 -0700 + + Check surface->status and finished in cairo_surface_write_to_png + + Without these checks, a user could hit an assertion failure + by passing a finished surface to cairo_surface_write_to_png. + Now we return a nice CAIRO_STATUS_SURFACE_FINISHED error in + that case instead. + + src/cairo-png.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 33c54ed240b319acb28ef370eef5188ad42a5737 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 22:14:04 2008 +0100 + + [test] Add large-source to exercise handling of massive images. + + This test exercises https://bugzilla.mozilla.org/show_bug.cgi?id=424333. + + The test is expected to fail due to issues with pixman, but cairo + should fail gracefully and neither crash nor cause XErrors. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/large-source-ref.c | Bin 0 -> 137 bytes + test/large-source.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 113 insertions(+) + +commit 4924d4d928666981f3e64bec685e8f90e524e62e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 23:48:36 2008 +0100 + + [cairo-xlib] Do not create surface with mismatching Visual and PictFormat. + + As identified by Vladimir Vukicevic, + _cairo_xlib_surface_create_similar_with_format() was erroneously passing + down the source Visual when creating a surface with a different + XRenderPictFormat. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9aac5916bcb4a3e62194315b12961d97f193a585 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 23:42:47 2008 +0100 + + [test/xlib-surface] Check for mismatching Visuals and XRenderPictFormats + + Vladimir Vukicevic reported that surfaces were being created with + mismatching Visuals and XRenderPictFormats - and demonstated here. + + test/xlib-surface.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 63 insertions(+) + +commit f6afba8f5453b8e3af9101fa2cde4c05a67f6d4b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 23:25:57 2008 +0100 + + [cairo-xlib] Create Pixmap using depth from xrender_format. + + Use the depth as specified by the xrender_format when creating the + pixmap (as opposed to a guess based on the cairo_format_t). + + src/cairo-xlib-surface.c | 21 ++------------------- + 1 file changed, 2 insertions(+), 19 deletions(-) + +commit 922fefdde4af28f9fc1e42fcba1b315980b01dc7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 23:06:18 2008 +0100 + + [cairo-xlib] Handle missing RENDER during similar surface creation + + If the xserver doesn't support the RENDER extension or simply doesn't + have the matching PictFormat then xrender_format might be NULL. Check + and fallback in this case. + + src/cairo-xlib-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 07122e64fa9529e7ba9323988a5af1d1e7c2c55f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 22:00:51 2008 +0100 + + [test] Repeat tests using cairo_push_group(). + + Test surfaces using similar surfaces with both CONTENT_COLOR and + CONTENT_COLOR_ALPHA, if applicable. This seems justified by the apparent + bugs in the pdf backend when going from an ARGB32 similar surface to + a destination RGB24 surface as well as isolated bugs in the image + backend. + + The original goal was to try and trick the test suite into producing + a xlib surface with mismatching Visual/XRenderPictFormat. This succeeds, + although with a little bit of brute force in the xlib backend, but the + search to reproduce a BadMatch error fruitless. + + test/cairo-test.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 103 insertions(+), 16 deletions(-) + +commit e04e4262386b8735d2ceabbc187405cace89dc80 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 10:56:38 2008 +0100 + + [test/get-xrender-format] Free static data on exit. + + Free the internal caches so that valgrind reports zero leaks. + + test/get-xrender-format.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit e57ef66fab7cb05b84175b3cfb5c032150cfa682 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 10:51:27 2008 +0100 + + [test/xlib-surface] Zero pixel buffers before use. + + As we only use RGB24 surface data the alpha channel is undefined, so + zero it to prevent valgrind warnings. + + test/xlib-surface.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +commit d0672e85ef120a4e3cd0dfcbdb717afbf9526f17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 10:42:57 2008 +0100 + + [test/surface-source] Skip tests if we cannot create the source surface. + + Check that the test environment supports the desired source and avoid + triggering asserts in the test routines. + + test/glitz-surface-source.c | 15 ++++++++++----- + test/surface-source.c | 8 ++++++++ + 2 files changed, 18 insertions(+), 5 deletions(-) + +commit 056d3c853e6660db31ee4a50d0e990a6013aa703 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 7 10:35:04 2008 +0100 + + [test/stroke-image] Fix memleak. + + Release the temporary image surface after setting it as the source. + + test/stroke-image.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e460e586d7d093c1e03052efa3bfb45a2d5cf6ef +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 22:02:44 2008 -0700 + + Update several pdf-specific reference images + + I don't know if we made minor changes to the pdf backend, or + if this was due to a poppler change, (we recently bumped the + poppler required for testing up to 0.8.0), but any way around + it these test results look just as good as the reference images + they are replacing. + + test/Makefile.am | 2 ++ + test/clip-operator-pdf-argb32-ref.png | Bin 11429 -> 11145 bytes + test/ft-text-vertical-layout-type1-pdf-ref.png | Bin 0 -> 3604 bytes + test/ft-text-vertical-layout-type3-pdf-ref.png | Bin 0 -> 3634 bytes + test/push-group-pdf-ref.png | Bin 2694 -> 2807 bytes + test/push-group-pdf-rgb24-ref.png | Bin 2611 -> 2714 bytes + 6 files changed, 2 insertions(+) + +commit fdcd1445846b59d2ffd1780dd0f6d70169036ad4 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 13:30:59 2008 -0700 + + Add filter-bilinear-extents to the XFAIL list + + This test case does show a bug, and we have lots of ideas on how + to fix the bug, but we want to wait until after the 1.6 release + before we fix it. See: + + http://bugs.freedesktop.org/show_bug.cgi?id=15349 + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 36246c51ba720713ebf93573da29b098e87f0bd0 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 12:10:24 2008 -0700 + + Revert "_cairo_pattern_get_extents: Fix to allow for expansion based on filter" + + This reverts commit 731e121c802a7b1c3429d1bde7a93bc471d70880. + + This commit introduced various problems, (some likely noticeable + in the test suite, and others perhaps not). For some details, see + the latest comments in the original bug report leading to the + fix now being reverted: + + http://bugs.freedesktop.org/show_bug.cgi?id=15349 + + src/cairo-pattern.c | 22 ---------------------- + 1 file changed, 22 deletions(-) + +commit c88adb6aee650c8c544b212f539bd5da9ed88734 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 16:09:03 2008 -0700 + + Add svg-specific reference images for smask and smask-mask + + The most recent change for the mask_id allocation fixes these + two test, (it fixes mask-image-mask as well, but it didn't need + a new reference image). + + test/Makefile.am | 2 ++ + test/smask-mask-svg-ref.png | Bin 0 -> 2529 bytes + test/smask-svg-ref.png | Bin 0 -> 3634 bytes + 3 files changed, 2 insertions(+) + +commit 164e9c195c16fbed08539b859a06cc6f042fb5d9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 15:50:22 2008 -0700 + + SVG: Fix generation of mask_id identifiers + + In tests such as smask-mask (and others) the cairo_mask operation + is used in the construction of a mask. In this case, the single + document->mask_id value was being incremented at inappropriate + times. + + We fix this by adding a new _cairo_svg_document_allocate_mask_id + that returns the current value and increments it. That way, + callers can hold onto this reliable value for the desired lifetime + that the code needs the identifier. + + src/cairo-svg-surface.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 8aa306ec08dcf0ae8803cdb1bda0fb31658f9e83 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 14:17:40 2008 -0700 + + Add svg-specific reference images for smask-fill, smask-paint, and smask-text tests + + test/Makefile.am | 3 +++ + test/smask-fill-svg-ref.png | Bin 0 -> 1166 bytes + test/smask-paint-svg-ref.png | Bin 0 -> 2612 bytes + test/smask-text-svg-ref.png | Bin 0 -> 1886 bytes + 4 files changed, 3 insertions(+) + +commit 3d86023281d7d18ad72be85ad8b53c29f20dfc7e +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 14:09:32 2008 -0700 + + Add ps-specific reference images for smask and smask-text tests + + test/Makefile.am | 2 ++ + test/smask-ps-ref.png | Bin 0 -> 3669 bytes + test/smask-text-ps-ref.png | Bin 0 -> 2023 bytes + 3 files changed, 2 insertions(+) + +commit f2a94c84a160f205ee72cc0c538a556d7d611e7b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 7 13:03:58 2008 -0700 + + Add underscore prefix to private _cairo_pdf_surface_set_size_internal + + src/cairo-pdf-surface.c | 48 ++++++++++++++++++++++++------------------------ + 1 file changed, 24 insertions(+), 24 deletions(-) + +commit 3d22902fa37623a56dee9e4a20d0dc215deabd72 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 6 19:29:25 2008 +0930 + + Add PDF ref images for the smask tests + + These tests render correctly in acroread 8.1. + + test/Makefile.am | 7 +++++++ + test/smask-fill-pdf-ref.png | Bin 0 -> 1075 bytes + test/smask-image-mask-pdf-ref.png | Bin 0 -> 421 bytes + test/smask-mask-pdf-ref.png | Bin 0 -> 3731 bytes + test/smask-paint-pdf-ref.png | Bin 0 -> 3800 bytes + test/smask-pdf-ref.png | Bin 0 -> 3800 bytes + test/smask-stroke-pdf-ref.png | Bin 0 -> 449 bytes + test/smask-text-pdf-ref.png | Bin 0 -> 1806 bytes + 8 files changed, 7 insertions(+) + +commit 688fbc24c38119a505e54a8a2fd0e71e988bf969 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 6 19:04:27 2008 +0930 + + PDF: Add a function for changing the surface size + + The smask-fill test was failing for PDF output because in some places + where the surface size is changed (eg when emitting patterns or + smasks) the cairo_to_pdf matrix was not updated. + + Fix this by adding a function to handle the surface size change and + replace all the duplicated code for changing surface size with a call + to this function. + + src/cairo-pdf-surface.c | 69 +++++++++++++++++++++++-------------------------- + 1 file changed, 33 insertions(+), 36 deletions(-) + +commit 6e5e852f739b63f0325927c70e4d4456c60d0ba9 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 03:25:58 2008 -0700 + + Increment cairo version to 1.5.19 after the 1.5.18 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6d6c8aa643603c2b5fd7baedc897d4698ba8bafb +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 03:11:04 2008 -0700 + + Increment cairo version to 1.5.18 and library versioning to 19:1:17 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 44cd51ada62f831e4fddd363797b3ad4568fb443 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 03:10:07 2008 -0700 + + NEWS: Add notes for 1.5.18 snapshot + + NEWS | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 111 insertions(+) + +commit 3f5ce00e99bcbb17594441301ad0845007d0aedf +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 03:09:45 2008 -0700 + + Add missing parens() to function name in gtk-doc comment + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c08e2ba974ad7f5d9343d0d815a00a8e9ad51f81 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 02:56:19 2008 -0700 + + Document default opaque black source pattern. + + src/cairo.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit e07e1b7bbbac59ae2ea25ed762c017b477e22cc4 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 02:47:32 2008 -0700 + + Document many more defaults + + Including: fallback_resolution, fill_rule, line_cap, line_join, + miter_limit, font_face, font_size, and operator. + + src/cairo-surface.c | 3 +++ + src/cairo.c | 30 ++++++++++++++++++++++++++---- + src/cairo.h | 10 +++++++++- + 3 files changed, 38 insertions(+), 5 deletions(-) + +commit a55669c325c341fa6175a193cb0d6fa30b8247c9 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 02:17:33 2008 -0700 + + Document toy nature of cairo_select_font_face + + src/cairo.c | 32 ++++++++++++++++++++++++++------ + 1 file changed, 26 insertions(+), 6 deletions(-) + +commit d1fe0084405a49f33d4ab6d80e9398e281483900 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 02:17:09 2008 -0700 + + Document default extend modes + + src/cairo-pattern.c | 3 +++ + src/cairo.h | 9 +++++++-- + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit abe6f9541eb1fe10c063540dbffe3499ec8a9d3e +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 02:01:04 2008 -0700 + + Document EXTEND_REFLECT and EXTEND_PAD as implemented for surfaces since 1.6 + + src/cairo.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 657b348e0172f3b5f2c91a406c2eca039a790ca1 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 01:57:45 2008 -0700 + + README: Update dependencies + + README | 139 +++++++++++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 89 insertions(+), 50 deletions(-) + +commit c642a401959c183de2afa3fba2c4206aa0fdbc0c +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 01:13:17 2008 -0700 + + Revert "[README] Remove the Dependencies section as it falls out of date easily" + + This reverts commit 5f38e215ed4ec930492ee373db37a767d85a6ee8. + + It's true that the dependencies can fall out of date, but it's really + unkind to not provide users with this information. I think we can + compromise by committing to update this information before major + releases. + + README | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 89 insertions(+) + +commit b61d1b01e94b3d8daa288b8d5d183f093d989582 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 01:07:32 2008 -0700 + + Change default filter from BEST to GOOD + + Right now the two filters are implemented identically, so there's + no real change for now. But in the future, it's conceivable that an + X server could implement some crazy, high-quality filter for BEST + without regard to performance, (since that's what BEST means). + + Meanwhile, GOOD actually captures what we want by default which is + a good mix of both quality and performance. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14b056945cef7e016ec07c87725348f3f0649d9f +Author: Carl Worth <cworth@cworth.org> +Date: Sun Apr 6 00:34:59 2008 -0700 + + Update smask-text reference image + + It appears the reference image wasn't generated on a gold-standard + machine, (and yes, the gold standard is, *ahem* whatever happens + to match what Carl's machine does---eventually we'll make the test- + based tests less picky about system configuration like this). + + test/smask-text-ref.png | Bin 1796 -> 1739 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 3a89bf4a1dd37852ca603c2ba472de73959dc69a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 5 22:01:24 2008 +0100 + + [test] Remove some redundant evals from the summary. + + In a couple of places we used eval to execute a simple assignment - + complete overkill. + + test/Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fc0a2988cdcbc54292377b00fe9a82b4a7407918 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 5 21:58:10 2008 +0100 + + [test] Disable jobserver with make check. + + make -j check has the unfortunate side-effect of performing the summary + before the TESTS have completed, both hiding in the stream of test + output and making it useless. Forcibly disable the jobserver so that the + summary is always last at the expense of not compiling the tests in parallel. + + test/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ae6fbe9e6e153a917f3ae8d733e88303e2816b2b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 6 01:08:31 2008 +1030 + + scaled-font-subsets: Special case .notdef in a new subset + + If the .notdef glyph is the first glyph in the subset to be mapped in + scaled font, we do not know if the subset will scaled or unscaled. We + can put it in the unscaled subset as Type1-fallback will embded an + empty glyph if it can not get the path. + + src/cairo-scaled-font-subsets.c | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +commit 0d5902b7167f8cb4bfc96fd813003cd220441151 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Apr 5 23:33:29 2008 +1030 + + Type1-fallback: Use correct glyph metrics for .notdef glyph + + Bug 15348 references the following PDF that was printing incorrectly + when running through poppler and cairo to generate PostScript. + + http://launchpadlibrarian.net/12921700/UbuntuDesktop.pdf + + The PostScript output had too much space between each word causing + strings of glyphs printed with the TJ operator to overlap. + + The original PDF file contains an CFF font with CID Identity-H + encoding. The PDF file is using character code 0 (glyph 0 due to + Identity-H encoding) as a space character. The CFF specification + defines glyph 0 to be the .notdef glyph. + + The PS backend subsets CFF fonts as a Type1-fallback + font. Type1-fallback creates it's own empty .notdef glyph with an + arbitrary glyph advance of 500. The problem here is the TJ operator + used to output the glyphs depends on the glyph advance being + correct. pdf-operators.c uses the glyph advance returned by + _scaled_glyph_init(). However the PostScript interpreter sees the + glyph advance of 500 for .notdef. This problem does not occur when + generating PDF as the PDF font dictionary contains an list of glyph + advances that override the font metrics. + + Fix this by making Type1-fallback not treat .notdef as special and to + create it the path and metrics obtained from _scaled_glyph_init(). As + a special case, make it not fail if _scaled_glyph_init() is unable to + return a path for .notdef. This was probably the reason Type1-fallback + previously created it's own .notdef glyph as calling + _scaled_glyph_init(_GLYPH_INFO_PATH) for glyph 0 returns + CAIRO_INT_STATUS_UNSUPPORTED for some fonts. + + This ensures the Type1-fallback font metrics match the metrics used + by pdf-operators.c to position the glyphs. This also results in the + removal of some duplicated code. + + src/cairo-type1-fallback.c | 92 +++++++++++++++------------------------------- + 1 file changed, 29 insertions(+), 63 deletions(-) + +commit 03d2b098ff245ff6724b1d83a121f5ce9dcd0b51 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Apr 5 21:15:15 2008 +1030 + + Type1-fallback: Use correct glyph advance in Type 1 charstrings + + 5050c55f93af fixed type1-fallback to use the glyph advance instead of + glyph width in the stored glyph metrics in the font. However it did + not fix the same bug in Type 2 charstrings (used by CFF fallback in + PDF). This problem was not noticed since the glyph widths in the PDF + font dictionary overrides these values. + + Fix this in case any software reading cairo PDFs uses these values. + + src/cairo-type1-fallback.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 40cee8c57879d37d77c5a93de8f7bdef28851923 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Apr 5 20:53:39 2008 +1030 + + Add assert to scaled_glyph_lookup in scaled-font-subsets + + If _cairo_scaled_glyph_lookup() returns CAIRO_INT_STATUS_UNSUPPORTED + it will be caught by the ASSERT_NOT_REACHED in + _emit_unscaled_font_subset in PS/PDF. It is more useful to catch this + closer to the source. + + src/cairo-scaled-font-subsets.c | 1 + + 1 file changed, 1 insertion(+) + +commit 93536bf3ac251d17c4d8630cad93c37b0d4a8326 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 5 09:31:22 2008 +0100 + + [test] Summarise failures per backend. + + Enhance the test failure summary to list the tests that failed per + backend. + + test/Makefile.am | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 731e121c802a7b1c3429d1bde7a93bc471d70880 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 4 19:00:28 2008 -0700 + + _cairo_pattern_get_extents: Fix to allow for expansion based on filter + + This fixes the filter-bilinear-extents test case and the + related bug entry: + + bad clipping with EXTEND_NONE + http://bugs.freedesktop.org/show_bug.cgi?id=15349 + + Though there are still differences in the PDF and PostScript + backends, (primarily because we can't capture cairo's filter + modes in those file formats). + + src/cairo-pattern.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit 04608952e2efb9bffaa131ab39780c3e1a7430ba +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 4 18:56:38 2008 -0700 + + Replace open-coded transformation with a call to _cairo_matrix_transform_bounding_box + + It's a wonderful feeiling to remove duplicate code. + + src/cairo-pattern.c | 61 ++++++++++++++++++++++++----------------------------- + 1 file changed, 27 insertions(+), 34 deletions(-) + +commit 89567f9278c002ac5e4e25ddccec88b1b1eea420 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 4 18:28:23 2008 -0700 + + Add new filter-bilinear-extents test + + This test exercises code that computes the extents of a surface + pattern with CAIRO_FILTER_BILINEAR, (where the filtering + effectively increases the extents of the pattern). + + The original bug was reported by Owen Taylor here: + + bad clipping with EXTEND_NONE + http://bugs.freedesktop.org/show_bug.cgi?id=15349 + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/filter-bilinear-extents-ref.png | Bin 0 -> 1340 bytes + test/filter-bilinear-extents.c | 91 +++++++++++++++++++++++++++++++++++ + 4 files changed, 94 insertions(+) + +commit 80f7aa03b35921a96683a0442f885c4b8335f3d9 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 4 11:29:47 2008 -0700 + + Enable buggy_repeat workaround for X.Org servers < 1.4 + + This covers the known-to-broken 1.3 servers such as appeared + in Fedora 8. It also leaves the workaround off, (since it's + a severe slowdown), for the known-to-be-working 1.4.99.901 + server as appears in Fedora 9 Betas. + + src/cairo-xlib-display.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 2c8ead12a64d0deff4dc9e32c60f2815fe7c4a63 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 4 17:46:54 2008 +0100 + + [xlib] Avoiding sending glyphs > XMaxRequestSize. + + XRenderAddGlyph() does not split its image data across multiple requests + and so the glyph surface must be smaller than XMaxRequestSize or else + the server will disconnect the client, causing "Fatal IO error 104". + As this will require an extension to the XRender spec, we can work + around the issue by using our fallbacks if we detect that the glyph will + be too large for a single request. + + See bugs https://bugs.freedesktop.org/show_bug.cgi?id=4339 and + http://bugs.freedesktop.org/show_bug.cgi?id=13266 for examples. + + src/cairo-xlib-surface.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit a4f94624b2f4a85bafbc2dc01b08788a7a88deba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 4 15:56:22 2008 +0100 + + [test] Add bilevel image test case. + + Add a simple test to exercise the embedding of an image with a bilevel + alpha channel into a postscript level 3 document. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/bilevel-image-ref.png | Bin 0 -> 131 bytes + test/bilevel-image.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 71 insertions(+) + +commit f72799a2520feb7ed04fd14e53db59fe697a58d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 4 14:15:58 2008 +0100 + + [configure.in] Add a link to the LTP homepage. + + If ./configure --enable-gcov fails due to a missing LTP package, then + include a link to LTP homepage in the error message. + + configure.in | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit c0593d16c7f2ca9c1ba4d05b6cbf3cf9c2f0524b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 4 12:53:13 2008 +0100 + + [pdf] Copy the glyphs for use within an smask group. + + When constructing an smask group using PDF_SHOW_GLYPHS, we need a copy + of the glyphs else they'll be freed be we use them (in _show_page()). + + src/cairo-pdf-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit a74db7e7bc092533d244123ea2ae272edf3f5d8f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 4 12:34:40 2008 +0100 + + [test] Exercise "soft" masks. + + PDF has a concept of "soft" masks, for which it is able to construct a + mask out of PDF drawing operations. These tests exercise constructing + various masks using the high level drawing operations. + + test/.gitignore | 7 +++ + test/Makefile.am | 14 +++++ + test/smask-fill-ref.png | Bin 0 -> 1223 bytes + test/smask-fill.c | 83 +++++++++++++++++++++++++++ + test/smask-image-mask-ref.png | Bin 0 -> 643 bytes + test/smask-image-mask.c | 92 ++++++++++++++++++++++++++++++ + test/smask-mask-ref.png | Bin 0 -> 2523 bytes + test/smask-mask.c | 107 ++++++++++++++++++++++++++++++++++ + test/smask-paint-ref.png | Bin 0 -> 2639 bytes + test/smask-paint.c | 90 +++++++++++++++++++++++++++++ + test/smask-ref.png | Bin 0 -> 3587 bytes + test/smask-stroke-ref.png | Bin 0 -> 1845 bytes + test/smask-stroke.c | 83 +++++++++++++++++++++++++++ + test/smask-text-ref.png | Bin 0 -> 1796 bytes + test/smask-text.c | 92 ++++++++++++++++++++++++++++++ + test/smask.c | 130 ++++++++++++++++++++++++++++++++++++++++++ + 16 files changed, 698 insertions(+) + +commit 2d42f5ac27494f2bfd75e7bba42fd36783e053eb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 4 20:29:12 2008 +1030 + + TrueType: Fix buffer check + + bb76eb50 added some checks to ensure we do not read past the end of + the buffer for the loaded glyph. However the checks assumed + tt_composite_glyph_t has a fixed size. tt_composite_glyph_t has a + variable size that depends on the values with the struct. + + src/cairo-truetype-subset.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 7dbb2dec33bb91b3d89a8072283297025817d0c6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 4 19:48:55 2008 +1030 + + TrueType: Remove assert + + If the status is UNSUPPORTED we should let type1-fallback subset it. + + src/cairo-truetype-subset.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6192001816053403b8e51fc2aa44cf6d0a9baece +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 4 19:26:00 2008 +1030 + + Add PS reference image for ft-show-glyphs-table + + test/Makefile.am | 1 + + test/ft-show-glyphs-table-ps-ref.png | Bin 0 -> 5687 bytes + 2 files changed, 1 insertion(+) + +commit e50324d3cc66df83120f908845657382e0020868 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 4 19:21:40 2008 +1030 + + PS: Fix emulation of 'Td' pdf operator + + src/cairo-ps-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 759793cad1459c2b70daa6adb3deb7af5fe705aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 4 09:43:32 2008 +0100 + + Add links to the font specifications. + + Add links to specifications for the Type1, CFF, and TrueType font file + formats, provided by Adrian Johnson. + + src/cairo-cff-subset.c | 5 +++++ + src/cairo-truetype-subset.c | 6 ++++++ + src/cairo-type1-subset.c | 5 +++++ + 3 files changed, 16 insertions(+) + +commit 8a78760f15c29c72e6a945b2157fd214e8045e1e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 3 17:12:14 2008 -0700 + + Add new ft-show-glyphs-table test to exercise recent glyph positioning bug fix + + Interestingly, this test case does demonstrate that cairo-pdf + is fixed, (where without commit f6509933a4e0 the Y positions + of the glyphs were inverted); however, cairo-ps is failing + with this test, (all the glyphs are ending up on top of each + other). + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/ft-show-glyphs-table-ref.png | Bin 0 -> 11439 bytes + test/ft-show-glyphs-table.c | 116 ++++++++++++++++++++++++++++++++++++++ + 4 files changed, 119 insertions(+) + +commit f6509933a4e0abde3b7bca861f65e433b7e8dcf0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 4 08:41:08 2008 +1030 + + PDF: Fix glyph positioning bug + + src/cairo-pdf-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bb76eb508b2d97a4455393a12540ceb7427bc271 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 18:36:16 2008 +0100 + + [cairo-truetype-subset] Check reads are within valid data. + + Check cairo_truetype_font_remap_composite_glyph() does not read beyond + the end of the buffer loaded for the glyf. + + src/cairo-truetype-subset.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit a5e2a2ad2d03c217b9b27c537ee6a945bdc98a44 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 18:24:00 2008 +0100 + + [cairo-truetype-subset] Prevent accesses beyond the end of the glyph array. + + Reject the font if we try to remap a composite glyph that exists outside + the known set of glyphs. + + src/cairo-truetype-subset.c | 43 ++++++++++++++++++++++++++++++------------- + 1 file changed, 30 insertions(+), 13 deletions(-) + +commit 13cdfed894d48b30e28296c3a27c8361bf5506fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 17:43:37 2008 +0100 + + [cairo-truetype-subset] Perform a quick sanity check that glyf end >= begin. + + Check for a bogus glyf position and prevent an integer overflow. + + src/cairo-truetype-subset.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit cfff3c3bd04df5257176d9e43add52fc6daba329 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 17:23:48 2008 +0100 + + [cairo-array] Guard against integer overflow whilst growing the array. + + Sanity check the arguments to _cairo_array_grow_by() such that the + array size does not overflow, similar to the defensive checking of + parameters to malloc. + + src/cairo-array.c | 12 ++++++++---- + src/cairoint.h | 2 +- + 2 files changed, 9 insertions(+), 5 deletions(-) + +commit 6101dc3e93b20294c75734d7f29e55694ed58e74 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 14:53:17 2008 +0100 + + [cairo-pdf-surface] Do not bitswap big-endian A1 masks. + + Pixman stores the bits A1 surfaces in native byte order, PDF stores + A1 masks in MSb - so only perform swapping for little-endian machines. + + Note this also removes the extraneous packing as per the PDF spec 4.8.2: + "Byte boundaries are ignored, except that each row of sample data must + begin on a byte boundary. If the number of data bits per row is not a + multiple of 8, the end of the row is padded with extra bits to fill out + the last byte." + + src/cairo-pdf-surface.c | 30 +++++++----------------------- + 1 file changed, 7 insertions(+), 23 deletions(-) + +commit 7901eb29efb04e469f4bf94e2da6fd6b79b140b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 12:12:25 2008 +0100 + + [test] Add a1-mask. + + Add a variant of the a8-mask test case that exercises the FORMAT_A1 code + paths instead. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/a1-mask-ref.png | Bin 0 -> 131 bytes + test/a1-mask.c | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 201 insertions(+) + +commit 5aa5aeb1f56493cf7a6bafd22c6921d8415db64e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 12:09:03 2008 +0100 + + [cairo-font-face] Cleanup up the font_face on the error path. + + A missing _cairo_toy_font_face_fini() was leaking the strdup(family). + + src/cairo-font-face.c | 1 + + 1 file changed, 1 insertion(+) + +commit 048160d44c564b0265b2e740b13d6ed3b367661d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 3 12:11:44 2008 +0100 + + [.gitignore] Add test/stroke-image + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 9e749d0a287b8038d8a8524ed74626b2d3071538 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Apr 2 23:37:24 2008 -0700 + + [cgfont] typo fix + + src/cairo-quartz-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f9b1ceac78976f34a18b551eec376c07db40775 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Apr 2 16:13:53 2008 -0700 + + [cgfont] Implement missing scaled font metrics + + src/cairo-quartz-font.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 71 insertions(+), 3 deletions(-) + +commit eb3eb0252b13b3d2a3b6acfd13306ff3c6b0506e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 2 14:53:25 2008 +0100 + + [cairo-xlib-surface] Avoid writing to the error surface. + + Insert status checks during construction of temporary glyph surfaces + to avoid potentially writing to the inert error object. + + src/cairo-xlib-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit c1062bf20ab60f6335be0814de245616a8d24bd2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 2 10:43:39 2008 +0100 + + [cairo-xlib-surface] Preserve Visuals for non-TrueColor similar surfaces. + + Previously, given a valid XRenderFormat the Visual was discarded + when creating similar surfaces. However the original Visual is + required to support reading back from non-TrueColor surfaces. + + src/cairo-xlib-surface.c | 32 ++++++++++++++++++++------------ + 1 file changed, 20 insertions(+), 12 deletions(-) + +commit b3a70629f8d1f5d7c23f4369d3395af73318eb28 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 2 09:19:11 2008 +0100 + + [test/text-transform] Fix pattern leak. + + Add missing cairo_pattern_destroy. + + test/text-transform.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 37c69c0d54c4b77c96497db4d6633558d4e1300d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 21:49:34 2008 +0100 + + [cairo-xlib] Handle malloc failures for cairo_xlib_visual_info_t. + + Tidy the error paths whilst handling visuals, in particular avoiding a + couple of potential NULL deferences, missed status checks and fresh + leaks. + + src/cairo-xlib-private.h | 15 ++++++++++---- + src/cairo-xlib-screen.c | 52 +++++++++++++++++++++++++++++++++--------------- + src/cairo-xlib-surface.c | 30 +++++++++++++++++++--------- + src/cairo-xlib-visual.c | 19 ++++++++++++++---- + 4 files changed, 83 insertions(+), 33 deletions(-) + +commit 0cd42c25a6f4be1ff27ed3a9ba7fa9a91d076e0d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 19:15:48 2008 +0100 + + [cairo-svg-surface] Check surface status before extracting the svg target. + + We need to check and report the existent status, else we may try to + modify the inert error object. + + src/cairo-svg-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 013bbda6373d84d39e080c5e0b305581a2c6919c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 19:15:16 2008 +0100 + + [cairo-ps-surface] Check surface status before extracting the ps target. + + We need to check and report the existent status, else we may try to + modify the inert error object. + + src/cairo-ps-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit cebb1eef431a38c7c3a96ae60a5bee188f41dc0b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 19:09:21 2008 +0100 + + [cairo-svg-surface] Missing status check. + + Check and, if necessary, propagate the error status - do not allow the + status to be overwritten, potentially masking the original error. + + src/cairo-svg-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 94db91b65ef42228c963f2d6d82da085f9148895 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 15:47:45 2008 +0100 + + [cairo-pdf-surface] Do not mask error during cleanup. + + Be careful to preserve the original error status whilst on the common + cleanup path for _cairo_pdf_surface_emit_meta_surface(). + + src/cairo-pdf-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3580b99a8f99db207b54529f5ac7d0e4325cc123 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 14:25:17 2008 +0100 + + [cairo-pdf-surface] Check surface status before extracting the pdf target. + + We need to check and report the existent status, else we may try to + modify the inert error object. + + src/cairo-pdf-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 34d734365bdc1c02cf1880804ab15af48c8d03e1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 11:27:10 2008 +0100 + + [cairo-svg-surface] Release acquired surface on error path. + + Ensure the surface returned from _cairo_pattern_acquire_surface() is + released on the error path. + + src/cairo-svg-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit ba2e82d138eecb451c3d0bf53d9c349fb560f039 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 10:55:39 2008 +0100 + + [cairo-ps-surface] Check error status before potential illegal dereference. + + After acquiring the source image, check for the error status to ensure + that we do not attempt to deference an invalid surface. + + src/cairo-ps-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 767add1ee356660075aaf02283f62a23ef9bcb24 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 28 11:51:13 2008 +0000 + + [cairo-pdf-operators] Destroy stream on error. + + We cannot guarantee that a newly created error stream is a static error + object, so we need to always destroy the stream on the error path. (One + day this may change with the global pool of error objects...) + + src/cairo-pdf-operators.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2f06284ad6154d1f5fac1a195edbcbc9ed3432cb +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 16:07:22 2008 -0700 + + Increment cairo version to 1.5.17 after 1.5.16 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5366c8f483dc7bd40b5d0a184c9b16826007c032 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 15:52:41 2008 -0700 + + Increment version to 1.5.16 and library versioning to 19:0:17 + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit eb6721f4ccc6ac861e16ec21c7b420645c4f572b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 15:51:57 2008 -0700 + + NEWS: Add notes for the cairo 1.5.16 snapshot + + NEWS | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 109 insertions(+) + +commit 8707892b218cb79ef544ba396d4501827b900c32 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 15:40:54 2008 -0700 + + Doc SGML template churn + + doc/public/tmpl/cairo-ft.sgml | 7 +++++++ + doc/public/tmpl/cairo-xlib.sgml | 7 +++++++ + 2 files changed, 14 insertions(+) + +commit 5d0b2ede52eb6d05a7d5579e6bcd1d4d1850300c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 15:24:48 2008 -0700 + + Mark cairo-quartz as officially supported + + An especial thanks to Vladimir Vukicevic and the Mozilla + Foundation for a tremendous amount of work on cairo-quartz + while it has been marked as "experimental" + + configure.in | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit 07130a9061b012bb5c206dc547b4cc0cc69dcbf1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 15:20:42 2008 -0700 + + Include cairoint.h first to satisfy the test suite + + Forgetting to include cairoint.h (or not including it first) can + cause some subtle bugs due to specific feature flags not being + set, etc. + + src/cairo-quartz-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 46ea00d829bc50ab5316d2257e0d1ed1d8e3f4b6 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 14:53:55 2008 -0700 + + More quieting of subtle potentially-uninitialized warnings + + The compiler isn't clever enough to notice that these + variables are always initialized (in either the TrueColor + or ! TrueColor conditions corresponding to the later + identical conditions in which the variables are used). + + src/cairo-xlib-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 1489e66d250c070c46cb42a1db9ea9f447f464b9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 14:49:03 2008 -0700 + + Quiet a more subtle potentially-uninitialized warning + + The compiler isn't clever enough to notice that these + variables are always initialized. + + src/cairo-rectangle.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit afc6e3b69dcadc63b1dd26a6d67a7da20d7397fe +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 1 14:40:18 2008 -0700 + + Quiet some trivial unused and potentially-uninitialized compiler warnings + + src/cairo-gstate.c | 2 +- + src/cairo-hull.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-xlib-visual.c | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit d09b0394d59b50ffd3ea8e58f9f57ea4717de754 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 31 16:50:24 2008 -0700 + + Add some reference images that were missing from the distribution list + + test/Makefile.am | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 56800e6ea0f7153e44f0cba14c89c4239067a60e +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Apr 1 13:28:03 2008 -0700 + + [quartz] Remove cairo-atsui-font.c + + src/cairo-atsui-font.c | 1028 ------------------------------------------------ + 1 file changed, 1028 deletions(-) + +commit 8ddae11b544c35057a96ca0bdea34b4f473ee261 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Apr 1 13:26:00 2008 -0700 + + [quartz] Update documentation + + doc/public/tmpl/cairo-ft.sgml | 8 -------- + doc/public/tmpl/cairo-quartz-fonts.sgml | 25 +++++++++++++++++++++++++ + doc/public/tmpl/cairo-quartz.sgml | 25 +++++++------------------ + doc/public/tmpl/cairo-xlib.sgml | 8 -------- + src/cairo-quartz-font.c | 14 ++++++++++++-- + src/cairo-quartz-surface.c | 18 ++++++++---------- + 6 files changed, 52 insertions(+), 46 deletions(-) + +commit 9a7162cfdf48f47bb8ee0a7c24c55c061e4fbc90 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Apr 1 13:17:14 2008 -0700 + + [doc] Add some Quartz/CGFont documentation templates + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 14 ++++++++++++++ + doc/public/tmpl/cairo-quartz-fonts.sgml | 23 +++++++++++++++++++++++ + 3 files changed, 38 insertions(+) + +commit 56cabc352e44ee7cb2989dd81688f6c37c33fc21 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Apr 1 13:01:41 2008 -0700 + + [quartz] Update Quartz test reference images + + test/Makefile.am | 3 +++ + test/clip-operator-quartz-ref.png | Bin 9364 -> 9539 bytes + test/clip-operator-quartz-rgb24-ref.png | Bin 4359 -> 4412 bytes + test/font-matrix-translation-quartz-ref.png | Bin 1041 -> 1090 bytes + test/glyph-cache-pressure-quartz-ref.png | Bin 3491 -> 3654 bytes + test/linear-gradient-reflect-quartz-ref.png | Bin 0 -> 878 bytes + test/operator-clear-quartz-ref.png | Bin 1368 -> 1459 bytes + test/operator-clear-quartz-rgb24-ref.png | Bin 1201 -> 1293 bytes + test/operator-source-quartz-ref.png | Bin 4572 -> 4637 bytes + test/operator-source-quartz-rgb24-ref.png | Bin 3452 -> 3533 bytes + test/select-font-face-quartz-ref.png | Bin 2958 -> 2970 bytes + test/show-text-current-point-quartz-ref.png | Bin 3198 -> 3093 bytes + test/surface-pattern-scale-down-quartz-ref.png | Bin 0 -> 3188 bytes + test/text-antialias-gray-quartz-ref.png | Bin 1039 -> 1041 bytes + test/text-antialias-none-quartz-ref.png | Bin 304 -> 300 bytes + test/text-antialias-subpixel-quartz-ref.png | Bin 1100 -> 1065 bytes + test/text-pattern-quartz-ref.png | Bin 0 -> 2158 bytes + test/text-pattern-quartz-rgb24-ref.png | Bin 1867 -> 1874 bytes + test/text-rotate-quartz-ref.png | Bin 17405 -> 17820 bytes + test/unbounded-operator-quartz-ref.png | Bin 4325 -> 4066 bytes + test/unbounded-operator-quartz-rgb24-ref.png | Bin 1972 -> 1918 bytes + 21 files changed, 3 insertions(+) + +commit 94b67d13f38d860f1a768f9a088e3b6f5d188f7b +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Apr 1 12:44:32 2008 -0700 + + [quartz] Handle further 10.4 vs. 10.5 differences; fix text AA handling + + src/cairo-quartz-surface.c | 74 +++++++++++++++++++++++++++------------------- + 1 file changed, 43 insertions(+), 31 deletions(-) + +commit a1d1be4234f7787c078ff096b4101e300494e7d1 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 27 23:46:53 2008 -0700 + + [cgfont] Round surface rectangle outwards to ensure whole-pixel dimensions + + src/cairo-quartz-font.c | 60 +++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 48 insertions(+), 12 deletions(-) + +commit c064ad1b56d11950786a3fd0363e543f5aec1761 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 27 11:42:53 2008 -0700 + + [cgfont] Fix whitespace errors + + src/cairo-quartz-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2be3e67db24ac34f772b5fc1182dfb9b730dce11 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Mar 25 22:44:39 2008 -0700 + + [cgfont] Add CGFont backend to replace deprecated ATSUI backend + + Create a new font backend that uses the CGFont API on MacOS X + 10.4 and beyond. + + src/cairo-quartz-font.c | 124 +++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 107 insertions(+), 17 deletions(-) + +commit 30f7fae6475c36549badf1fcc11ae39d1d79b532 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 20 13:24:48 2008 -0700 + + [cgfont] Add start of CGFont font backend to replace ATSUI + + configure.in | 10 +- + src/Makefile.am | 3 +- + src/cairo-atsui-font.c | 2 +- + src/cairo-quartz-font.c | 590 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-quartz-private.h | 5 + + src/cairo-quartz-surface.c | 1 - + src/cairo-quartz.h | 5 +- + src/cairoint.h | 4 +- + 8 files changed, 611 insertions(+), 9 deletions(-) + +commit 9e6d6798700cf629abbd921cf744babeb49215a1 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue Apr 1 16:48:04 2008 +0200 + + [SVG] Fix stroke-image test failure. + + The pattern transform inherit the object transform matrix, and that was not + taken into account. + + src/cairo-svg-surface.c | 96 ++++++++++++++++++++++++++++++------------------- + 1 file changed, 60 insertions(+), 36 deletions(-) + +commit a571cc56a3e708e37fe112212fbd41ae9071a16b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 31 12:17:39 2008 -0700 + + Update pixman dependency to recent 0.10.0 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9adba9a57177a1b5755734db25d08513a30c0b7 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 31 12:15:06 2008 -0700 + + Update ps-specifc reference image for ft-text-vertical-layout-type1 + + Presumably this minor change happened due to a recent fix in + cairo-ps glyph positioning. + + test/ft-text-vertical-layout-type1-ps-ref.png | Bin 1911 -> 1910 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a30ed53a1ce37f68f2ee8abf0f631bcc180e0e57 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 30 00:13:35 2008 +1030 + + Add stroke-image PS/PDF ref images + + test/stroke-image-pdf-ref.png | Bin 0 -> 1554 bytes + test/stroke-image-ps-ref.png | Bin 0 -> 1786 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit a729f27f3c5770277d691257d2355ffb97e3172f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 30 00:07:05 2008 +1030 + + Add clip-operator PS/PDF rgb24 ref images + + test/clip-operator-pdf-rgb24-ref.png | Bin 0 -> 6530 bytes + test/clip-operator-ps-rgb24-ref.png | Bin 0 -> 4620 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 9058b9260acce8839263fccf451a982bcb1c54f3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 29 23:49:51 2008 +1030 + + Add operator-source PDF ref images + + Required due to gradient rendering differences between poppler and + cairo. + + test/operator-source-pdf-argb32-ref.png | Bin 0 -> 4694 bytes + test/operator-source-pdf-rgb24-ref.png | Bin 0 -> 3848 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 47981226db1650799ddb5efba01df2564aa1a3b5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 29 23:45:31 2008 +1030 + + Fix PDF analysis of OPERATOR_SOURCE surface patterns + + src/cairo-pdf-surface.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 53d1a4b0dcb3a1fa62face9d2b5b086d74b6e397 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 29 23:03:02 2008 +1030 + + Update operator-source PS ref images + + test/operator-source-ps-argb32-ref.png | Bin 3893 -> 3890 bytes + test/operator-source-ps-rgb24-ref.png | Bin 3241 -> 3181 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit b3b3e3810d6ea9e75d5accd8e0d2ad00f664b4a5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 29 19:14:18 2008 +1030 + + PS: Clear pattern background to when using OPERATOR_SOURCE + + Set pattern background to white if surface content is COLOR_ALPHA or + black if surface content is COLOR when operator is SOURCE. + + src/cairo-ps-surface.c | 43 +++++++++++++++++++++++++++---------------- + 1 file changed, 27 insertions(+), 16 deletions(-) + +commit 5b8b3a9765d292d554b50df0981652d3bb4ec56f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 29 01:07:30 2008 +1030 + + PS/PDF: Save/Restore surface clip when emitting a meta-surface pattern + + src/cairo-pdf-surface.c | 6 ++++++ + src/cairo-ps-surface.c | 6 ++++++ + src/cairo-surface.c | 6 ++++++ + src/cairoint.h | 3 +++ + 4 files changed, 21 insertions(+) + +commit e4fd9b4ea2e8cc378471c4f536236faa73467977 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Mar 27 09:06:11 2008 +1030 + + Bump poppler version required for testing to 0.8.0 + + The poppler specific reference images are created from the latest + version of poppler in git. The main reason has been for support for + knockout groups that had not yet been available in a stable release. + + Poppler 0.8.0 is the first stable release to include the support for + knockout groups. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit af8928fa8bb8905515f36b4ddc51e665b4b8da56 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 26 14:21:58 2008 -0700 + + Add svg-specific reference image for ft-show-glyphs-positioning test + + There was no failure here, just minor rasterization differences. + + test/ft-show-glyphs-positioning-svg-ref.png | Bin 0 -> 6590 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit fbab4bbb06d875313e9cd0dc38673b79b8460edb +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 26 13:47:06 2008 -0700 + + Update clip-operator and operator-clear reference images + + There were legitimate bugs in the ps and pdf backends for these + tests, (particularly with the row of glyphs), but these bugs + were recently fixed with: + + commit d89edde84de9cec9ce6f76f4f2c44dd9c1220528 + Author: Vladimir Vukicevic <vladimir@pobox.com> + Date: Tue Mar 4 00:15:46 2008 -0800 + + [meta] always copy glyph array before passing to _cairo_surface_show_glyphs + + and we just failed to notice the fix at the time. + + test/clip-operator-pdf-argb32-ref.png | Bin 11005 -> 11429 bytes + test/clip-operator-ps-argb32-ref.png | Bin 9084 -> 9102 bytes + test/operator-clear-ps-argb32-ref.png | Bin 1400 -> 1435 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 75972167a277687b1434c52e791ffe9c18fa2a7a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 26 11:31:04 2008 -0700 + + Use floating-point offsets for color stops + + Previously we were using the cairo_fixed_t type which meant we've + historically only been using 16 bits of precision for these offsets, + and recently only 8 bits. Meanwhile, all manipulatons of offsets + have been in floating-point anyway, so we might as well store them + that way. + + This change also prevents a rendering regression introduced with the + 24.8->16.16 change betwen snapshots 1.5.10 and 1.5.12 . + + This change affected gradient-rendering details for the clip-operator + and operator-source tests, so the corresponding reference images are + updated here. + + src/cairo-glitz-surface.c | 2 +- + src/cairo-pattern.c | 10 ++++------ + src/cairo-pdf-surface.c | 6 +++--- + src/cairo-ps-surface.c | 6 +++--- + src/cairo-quartz-surface.c | 6 +++--- + src/cairo-svg-surface.c | 31 ++++++++++++++----------------- + src/cairo-win32-printing-surface.c | 2 +- + src/cairoint.h | 2 +- + test/clip-operator-ref.png | Bin 8263 -> 8271 bytes + test/operator-source-ref.png | Bin 4422 -> 4420 bytes + 10 files changed, 30 insertions(+), 35 deletions(-) + +commit 80dc1714c87c3902e70fa94e4911945986cc7920 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 26 10:31:36 2008 -0700 + + Remove unused variable + + src/cairo-image-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit f676f18050383ecf26c36cdbba4ac81d2d45b042 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 26 08:43:23 2008 +0000 + + [cairo] Fixup make check. + + make check demands that all function references in the docs are suffixed + with (). + + src/cairo.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 452a1de2a06b57a3ed1b149e152487505dbc04f8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 25 16:50:33 2008 +0000 + + [cairo-gstate] Remove dead code. + + Eliminate _cairo_gstate_recursive_apply_clip_path, as its last caller + was removed over 2 years ago. + + src/cairo-gstate.c | 21 --------------------- + 1 file changed, 21 deletions(-) + +commit ed42916028e4f51949210de6ecf4ebc5095aa45c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Mar 26 23:04:35 2008 +1030 + + Win32: Fix bug in cairo_win32_font_face_create_for_hfont() + + Use GetObjectW for LOGFONTW. + + src/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6dc75ab0f8370154aae7719ed805c5a8bdf1c9f4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 25 10:21:50 2008 -0700 + + Quiet compiler warnings about unhandled PIXMAN_yuy2 and PIXMAN_yv12 + + We still don't handle these format codes of course, (they're meaningless + for the context in which they're used here). + + Note that we previously avoided adding these to avoid people being forced + to upgrade pixman just to get two enum values that cairo doesn't really + care about. But now we're depending on a new pixman anyway, (for the + pixman_format_code_to_masks function), so we'll go ahead and do this now. + + src/cairo-image-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 1675713aff7311461e26d7badccb9942573f2bca +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 25 16:45:21 2008 -0700 + + Depend on pixman 0.9.7 for new pixman_format_supported_destination function + + This allows us to do a much more general and complete implementation of + _pixman_format_from_masks and _pixman_format_to_masks so that we'll + even pick up new pixman formats as they get added. + + configure.in | 2 +- + src/cairo-image-surface.c | 200 ++++++++++++++++++++-------------------------- + 2 files changed, 86 insertions(+), 116 deletions(-) + +commit d7e5f6b6a00912e22cb5ca837d0a56d30cf59124 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 25 16:32:24 2008 -0700 + + Rename _popcount to _cairo_popcount and make it available for internal use + + Both cairo-image-surface.c and cairo-xlib-surface.c want to + use this function now. + + src/cairo-xlib-surface.c | 25 ++----------------------- + src/cairoint.h | 21 +++++++++++++++++++++ + 2 files changed, 23 insertions(+), 23 deletions(-) + +commit 90cf7c2faf167b4b86443eb340af23cf853b146a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 25 10:40:01 2008 -0700 + + Quiet warning about signed vs. unsigned comparison + + src/cairo-surface-fallback.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 770633c05acf12b911cdbdaa94b20ccf34ce742a +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 25 10:27:36 2008 -0700 + + Quiet warnings about unhandled enum values in _cairo_surface_create_in_error + + src/cairo-surface.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit d15c7c94bdfc714845bd88f9e3ed5317afcfce72 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 25 12:12:40 2008 -0700 + + Document performance advantage of cairo_path_extents + + The cairo_path_extents function can perform better than either + cairo_stroke_extents or cairo_fill_extents, so provide that + pointer from the documentation of the other two functions. + + src/cairo.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 8aba5b802946530ef481f1461f9894529498cd8a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Mar 25 11:53:52 2008 -0700 + + [win32] Prevent crash in create_similar if win32_surface_create fails + + src/cairo-win32-surface.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 49a140b04bda85c03f824dcf565f1fcdd70b8965 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Mar 25 11:22:43 2008 -0700 + + [osx] additional fix to configure for multi-arch OSX builds + + configure.in | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ae143d779ba5765f55754cb89af87b065d84ef04 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Mar 25 11:17:57 2008 -0700 + + [quartz] When stroking with an image source, use the right CTM for the image + + Since the CTM was modified for the stroke transform, we need to reset + it before calling ConcatCTM for the source transform. + + src/cairo-quartz-surface.c | 9 ++++- + test/Makefile.am | 3 ++ + test/stroke-image-quartz-ref.png | Bin 0 -> 1802 bytes + test/stroke-image-ref.png | Bin 0 -> 1866 bytes + test/stroke-image.c | 77 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 88 insertions(+), 1 deletion(-) + +commit e9906ae2021904c8c3d3a4083786475c102196f7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 25 21:56:19 2008 +1030 + + Win32-Printing: Fix fallback resolution when DC ctm is not identity + + And also move the _cairo_surface_set_resolution() into + _cairo_win32_printing_surface_start_page as the DC ctm may be changed + between pages. + + This bug was found in Inkscape now that they are using the cairo + win32-printing surface for printing on Windows. + + src/cairo-win32-printing-surface.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +commit ee3981fb92ee5fa9b049dae32421cc0015fd4bf6 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 24 16:24:36 2008 -0700 + + Add new text-transform test + + Previously, the test suite wasn't supplying any coverage of transformed + text rendering. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/README | 1 + + test/text-transform-pdf-ref.png | Bin 0 -> 3796 bytes + test/text-transform-ps-ref.png | Bin 0 -> 4154 bytes + test/text-transform-ref.png | Bin 0 -> 6200 bytes + test/text-transform.c | 113 ++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 116 insertions(+) + +commit 184d9cbf9c8967b741209b9d891848c9bd37dd60 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 24 12:36:37 2008 +1030 + + Update REFERENCE_IMAGES with PS ref images + + for finer finer-grained-fallbacks. + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2ad39157975d71735da936977dd10e66d055ece7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 24 12:32:07 2008 +1030 + + Add PS reference images for finer-grained-fallbacks test + + test/finer-grained-fallbacks-ps-argb32-ref.png | Bin 0 -> 1047 bytes + test/finer-grained-fallbacks-ps-rgb24-ref.png | Bin 0 -> 819 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit ae9635bf33cb989f5c525800b82b81daad699e01 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 24 12:16:20 2008 +1030 + + Fix assertion in PS/PDF/Win32-print when fallback image is off the page + + If during analysis the bounding box of an operation or the number of + traps is 0, the operation is marked as natively supported. The problem + here is if the operation is unsupported by the backend, we get an + assertion when the operation is replayed during + CAIRO_PAGINATED_MODE_RENDER. + + This bug was found in Inkscape when printing to the + win32_printing_surface a page that has been layed out as landscape but + landscape paper had not been selected in the print dialog. + + Fix this by being careful not to mark unsupported operations as + supported during analysis even they may not be visible on the page. + + src/cairo-analysis-surface.c | 73 +++++++++++++++++++++++++++++++++----------- + 1 file changed, 55 insertions(+), 18 deletions(-) + +commit 179ab7d2860b8ff94fe491896c50505fde7cf6af +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 24 11:43:29 2008 +1030 + + Add finer-grained-fallbacks test + + This reproduces the bug in PS/PDF/Win32-printing where an unsupported + operation that is off the page causes an unsupported operation + assertion in the backend. + + test/.gitignore | 1 + + test/Makefile.am | 3 + + test/finer-grained-fallbacks-ref.png | Bin 0 -> 796 bytes + test/finer-grained-fallbacks-rgb24-ref.png | Bin 0 -> 590 bytes + test/finer-grained-fallbacks.c | 111 +++++++++++++++++++++++++++++ + 5 files changed, 115 insertions(+) + +commit 9a1f7bbc357ecce351b459f883b4ebeaa6640b65 +Author: Benjamin Otte <otte@gnome.org> +Date: Sun Mar 23 15:31:24 2008 +0100 + + [API] unbreak CAIRO_FONT_TYPE_ATSUI + + commit 9d61f7db8082baf3a223c4ea41a53de372676e40 broke API by making the + CAIRO_FONT_TYPE_ATSUI symbol not work anymore. However, this symbol was part of + Cairo's public API and should continue working this way. + + src/cairo-deprecated.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 104c2825ea66d7d5f405cc8d690d90b45e752c46 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 21 09:11:48 2008 +0000 + + [cairo-png] Set bKGD gray value. + + For PNG_COLOR_TYPE_GRAY images the bKGD value is read from white.gray + which was uninitialized, triggering the "PNG warning = Ignoring attempt + to write bKGD chunk out-of-range for bit_depth" reported by Emmanuel + Pacaud. This patch sets the background gray value to white, the same as + for RGB images. + + src/cairo-png.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit c4599324820cfb46700bf2f059c46e9245f98ea5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 21 18:12:03 2008 +1030 + + Update PS reference images + + Some of the text tests require new PS specific reference images as a + result of the PS glyph positioning fix. + + test/font-matrix-translation-ps-argb32-ref.png | Bin 749 -> 748 bytes + test/font-matrix-translation-ps-rgb24-ref.png | Bin 749 -> 748 bytes + test/glyph-cache-pressure-ps-ref.png | Bin 1413 -> 1454 bytes + test/select-font-face-ps-ref.png | Bin 1079 -> 959 bytes + test/show-text-current-point-ps-ref.png | Bin 1454 -> 1356 bytes + test/text-pattern-ps-argb32-ref.png | Bin 984 -> 966 bytes + test/text-pattern-ps-rgb24-ref.png | Bin 936 -> 924 bytes + 7 files changed, 0 insertions(+), 0 deletions(-) + +commit f3a5f7570104c8d48c99a2b6bd34f4142e52f099 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 21 16:34:01 2008 +1030 + + Add PS/PDF ref images for ft-show-glyphs-positioning + + test/Makefile.am | 2 ++ + test/ft-show-glyphs-positioning-pdf-ref.png | Bin 0 -> 3114 bytes + test/ft-show-glyphs-positioning-ps-ref.png | Bin 0 -> 2269 bytes + 3 files changed, 2 insertions(+) + +commit 4f56a6324f16fa58c21180cc362ee18520a59179 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 21 16:30:53 2008 +1030 + + Finish the PDF text operator decimal reduction commit + + Commit 158b32b60bc7e0f6488383c1d4f83203ffe97c98 reduced excess + decimals emitted for the TJ operator. However it only fixed the first + of the two locations in pdf-operators where the TJ position + adjustments are emitted. + + src/cairo-pdf-operators.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 13e05bffd5cae5690fada24c7a7e2457c39e4dbf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 21 15:41:31 2008 +1030 + + Fix PS glyph positioning bug in PDF operator emulation + + The emulation of the PDF 'TJ' operator in the PS prolog was + incorrectly updating the glyph position between strings. The glyph + position values are a negative x offset that are in 1/1000 unit of + text space. We were incorrectly multiplying the number by -0.0001 + instead of -0.001. We also need to transform this to device space + before calling rmoveto. + + src/cairo-ps-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 83486684520f3fd27d1118aa23462d013def83df +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 21 16:06:12 2008 +1030 + + Add ft-show-glyphs-positioning test + + This demonstrates the glyph positioning bug in the PS backend. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/ft-show-glyphs-positioning-ref.png | Bin 0 -> 3444 bytes + test/ft-show-glyphs-positioning.c | 167 ++++++++++++++++++++++++++++++++ + 4 files changed, 170 insertions(+) + +commit 37fedd108e3defc10f2f749a3a9971287e41706c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 17:02:01 2008 -0700 + + Increment cairo version to 1.5.15 after the 1.5.14 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f4d4d7b3d0bd62af6ffd50ba9cd8df0b9a12be71 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 16:13:28 2008 -0700 + + Cleanup up png-test.png file in 'make clean' + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 4ad5937648b27cd7a73a6a245ed875de92fa1c07 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 15:55:28 2008 -0700 + + Enable PLT avoidance for cairo_image_surface_get_data/stride + + src/cairo-image-surface.c | 2 ++ + src/cairoint.h | 2 ++ + 2 files changed, 4 insertions(+) + +commit 5d9eefccd6ff4d51e16caa8f3092d3acc33b5549 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 15:37:04 2008 -0700 + + Disable enum_regexp test in check-doc-syntax.h + + It's returning false positives on non-gtk-doc comments with non-public + enum values. Ick. + + src/check-doc-syntax.sh | 29 +++++++++++++++++++---------- + 1 file changed, 19 insertions(+), 10 deletions(-) + +commit 0c17ca52aa63a9c77cff47c4ae42bc16e5220552 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 15:33:37 2008 -0700 + + Mark new cairo_xlib_visual_info functions as private. + + src/cairo-xlib-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f32f81fa1badce15403d922002f4fc59fe8b563a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 13:49:29 2008 -0700 + + Increment cairo version to 1.5.14 and libtool versioning to 18:1:16 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ffa50c31d38c761b4bf247d3ac27933974b819d3 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 13:49:19 2008 -0700 + + Doc template churn + + doc/public/tmpl/cairo-font-face.sgml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3bb0474ea7d453793199d3ce7674fbe1ee8a324d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 13:48:29 2008 -0700 + + NEWS: Add notes for 1.5.14 snapshot + + NEWS | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 128 insertions(+), 1 deletion(-) + +commit 191440101e815fe9be23bb6fbb36114de65d8c2d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 12:33:17 2008 -0700 + + Fix the REFERENCE_IMAGES list, (like always before a snapshot) + + test/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 46bbead898186349094ae69d2b16f88b80cb820e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 12:18:39 2008 -0700 + + RELEASING: Clarify steps for verifying no unpushed modifications + + RELEASING | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit c91a2a2e80f2172a4174cfc3b5e821cb49633da5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 20 11:51:31 2008 -0700 + + Track minor change in pixman filtering sample location + + This change in reference image was triggered by the following commit + in the pixman library: + + commit f2d8a5caa63596739b4dc47c00daaaafd9f522e2 + Author: Søren Sandmann <sandmann@redhat.com> + Date: Mon Mar 10 23:41:52 2008 -0400 + + Add rounding epsilon for NEAREST filter after transformation, not before. + + This hasn't appeared in a pixman release yet. So for now, getting + correct results is a matter of "use latest pixman". Soon we'll + have a new pixman release and we'll make cairo depend on that. + + test/rotate-image-surface-paint-ref.png | Bin 209 -> 232 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit e96f382549eb3411d461162fdd8989f4ade8b448 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 19 13:00:47 2008 -0700 + + Add support for 8-bit PseudoColor visuals + + This support involves allocating a 16-bit grayscale ramp as well + as a 5x5x5 RGB color cube. Afterwards, the 256 colors are queried + and an array is generated mapping from r3g3b3 colors to the closest + available color. Both the queried colors and the reverse mapping + are stored in a new visual-specific cairo_xlib_visual_info_t + structure which hangs off of the cairo_xlib_screen_info_t. + + Both the color-cube allocation and the distance metric could be + improved by someone sufficiently motivated, (for example, allocating + and matching in a perceptually linear color space rather than just + in RGB space). Also, making this work well in the face of a changing + color map, or in the case of GrayScale, StaticGray, or DirectColor + visuals are left entirely as exercises for the reader. StaticColor + support should be fine as is, but is entirely untested. + + src/Makefile.am | 1 + + src/cairo-xlib-private.h | 15 ++++++ + src/cairo-xlib-screen.c | 49 +++++++++++++++++ + src/cairo-xlib-surface.c | 122 +++++++++++++++++++++++++---------------- + src/cairo-xlib-visual.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 278 insertions(+), 46 deletions(-) + +commit d413c5ab21efb2ccc6a4847ff387f8e39ba2f3e1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 19 14:23:35 2008 -0700 + + xlib: Add support for arbitrary TrueColor visuals + + This fixes the following bugs: + + cairo doesn't support 8-bit truecolor visuals + https://bugs.freedesktop.org/show_bug.cgi?id=7735 + + cairo doesn't support 655 xlib format + https://bugs.freedesktop.org/show_bug.cgi?id=9719 + + src/cairo-xlib-surface-private.h | 5 + + src/cairo-xlib-surface.c | 342 +++++++++++++++++++++++++++++++-------- + 2 files changed, 276 insertions(+), 71 deletions(-) + +commit aeaec94fd03b9098efce9d7455f813acf22ec026 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Mar 20 16:05:34 2008 +0100 + + [SVG] Replace the color property by stroke. + + Color property doesn't support URL as value. This pacth fixes + http://bugs.freedesktop.org/show_bug.cgi?id=14556 . + + src/cairo-svg-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 158b32b60bc7e0f6488383c1d4f83203ffe97c98 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 18 22:29:59 2008 +1030 + + PDF: Reduce excess decimals in text position offsets + + The numbers output in the TJ array for adjusting the horizontal + position of the next glyph are in 1/1000 of the text space + units. Rounding these numbers to an integer should still provide + sufficient precision. + + We use the rounded numbers to update the text position in + pdf-operators so subsequent numbers in the TJ array will compensate + for the rounding error. + + src/cairo-pdf-operators.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit 222041530cd5d7f1ef6b41ea1738bf395ef1678a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 18 22:28:37 2008 +1030 + + Use %g for printing path coordinates in pdf-operators + + to eliminate unnecessary decimal places in the output. + + src/cairo-pdf-operators.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d78013470b11677df88f246d893c1f019f4ae228 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 18 22:27:25 2008 +1030 + + Add %g conversion specifer to output-stream for limited precision + + The %g conversion specifier is for printing numbers that were at some + time stored in a cairo_fixed_t type and as a result have their + precision limited by the size of CAIRO_FIXED_FRAC_BITS. + + Using %g will limit the number of digits after the decimal point to + the minimum required to preserve the available precision. + + src/cairo-output-stream.c | 87 ++++++++++++++++++++++++++++++----------------- + 1 file changed, 56 insertions(+), 31 deletions(-) + +commit f3734085a1d1d9b08004a243e28a0233f621847c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 18 22:25:46 2008 +1030 + + Make _cairo_dtostr() static + + It is only used in cairo-output-stream.c + + src/cairo-output-stream-private.h | 3 --- + src/cairo-output-stream.c | 2 +- + 2 files changed, 1 insertion(+), 4 deletions(-) + +commit 4d9e5b51aa4164cf758c6a1f84c7f831becc098b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 18 22:25:18 2008 +1030 + + Rescale CTM used for PS/PDF stroking to reduce rounding error + + The PS/PDF CTM is transformed to the user space CTM when emitting + paths to be stroked to ensure the correct pen shape used. However this + can result in rounding errors. + + For example the device space point (1.234, 3.142) when transformed to + a user space CTM of [100 0 0 100 0 0] will be emitted as + (0.012, 0.031). + + Fix this by rescaling the user space CTM so that the path coordinates + emitted to the PDF file stay within the range the maximizes the + precision. The line width and dashing is also rescaled to be the same + size in the rescaled CTM. + + src/cairo-pdf-operators.c | 70 ++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 63 insertions(+), 7 deletions(-) + +commit 7f4b967c020042779748021fa32fddfc3f0def28 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 14 16:51:24 2008 +0100 + + Make CAIRO_FORMAT_STRIDE_FOR_WIDTH_BPP available to the cairo internals. + + src/cairo-image-surface.c | 7 ++----- + src/cairoint.h | 5 +++++ + 2 files changed, 7 insertions(+), 5 deletions(-) + +commit eb31c52febd615a92ef0c7204f9fa056ef01b536 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 14 16:48:41 2008 +0100 + + Make _pixman_format_to_masks accept a cairo_format_masks_t structure + + This makes it work similarly to _pixman_format_from_masks + + src/cairo-image-surface.c | 48 ++++++++++++++++++++++------------------------- + src/cairo-xlib-surface.c | 12 ++++++------ + src/cairoint.h | 5 +---- + 3 files changed, 29 insertions(+), 36 deletions(-) + +commit cdb1ae97f241ec6b24d64b0fa5447d26f6bc5318 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jan 27 10:31:58 2008 -0800 + + Move assertion failure for unsupported masks up one level + + We're moving the assertion up from inside _pixman_format_to_mask + to its callers. This will allow us to selectively eliminate the + assertion from the supported xlib backend, while leaving it in + the unsupported glitz and xcb backends for now. + + src/cairo-image-surface.c | 62 ++++++++++++++++++++++++++++------------------- + src/cairo-xlib-surface.c | 20 +++++++++++++-- + src/cairoint.h | 5 ++-- + 3 files changed, 58 insertions(+), 29 deletions(-) + +commit b83b8c26f5d64fa07b56a747dec681c6626a0297 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 17 23:38:34 2008 +1030 + + Optimize generated PostScript when EXTEND_PAD is used + + Allow image patterns with EXTEND_PAD to use the currentfile + optimization. + + src/cairo-ps-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 1ab804891bb71fd742ccc7a228483c53aee282a4 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 17 17:37:24 2008 -0700 + + [quartz] Additional test reference images for quartz + + test/Makefile.am | 10 ++++++++++ + test/clip-operator-quartz-ref.png | Bin 0 -> 9364 bytes + test/clip-operator-quartz-rgb24-ref.png | Bin 0 -> 4359 bytes + test/dash-curve-quartz-ref.png | Bin 0 -> 47965 bytes + test/dash-state-quartz-ref.png | Bin 0 -> 8698 bytes + test/degenerate-path-quartz-ref.png | Bin 0 -> 232 bytes + test/degenerate-path-quartz-rgb24-ref.png | Bin 0 -> 198 bytes + test/operator-source-quartz-ref.png | Bin 0 -> 4572 bytes + test/operator-source-quartz-rgb24-ref.png | Bin 0 -> 3452 bytes + test/unbounded-operator-quartz-ref.png | Bin 0 -> 4325 bytes + test/unbounded-operator-quartz-rgb24-ref.png | Bin 0 -> 1972 bytes + 11 files changed, 10 insertions(+) + +commit df5087992be5f0f1e42d968559c47bf43de9cfb7 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 17 17:37:22 2008 -0700 + + [quartz] Fix bogus CGContextGetType warning that's printed on the console + + This is caused by 0x0 surfaces being special, and not having an + associated cgContext. + + src/cairo-quartz-surface.c | 104 ++++++++++++++++++++++++++++++--------------- + 1 file changed, 69 insertions(+), 35 deletions(-) + +commit 9d61f7db8082baf3a223c4ea41a53de372676e40 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 17 17:37:19 2008 -0700 + + [quartz] Rename ATSUI font to Quartz font + + configure.in | 35 +++++++--------------------- + src/Makefile.am | 17 ++++++-------- + src/cairo-atsui-font.c | 39 +++++++++++++------------------ + src/cairo-atsui.h | 58 ---------------------------------------------- + src/cairo-deprecated.h | 2 ++ + src/cairo-quartz-private.h | 14 +++-------- + src/cairo-quartz-surface.c | 14 +++++------ + src/cairo-quartz.h | 15 +++++++++++- + src/cairo.h | 4 ++-- + src/cairoint.h | 10 ++++---- + 10 files changed, 65 insertions(+), 143 deletions(-) + +commit e4f087b8b944a26d688afeef4b9ea7a0d0a6e9ec +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 16 17:29:48 2008 +1030 + + Factor out common stroke code in pdf-operators + + src/cairo-pdf-operators.c | 68 ++++++++++++++++++++++------------------------- + 1 file changed, 32 insertions(+), 36 deletions(-) + +commit 8238a9fd4fa672299fd99aa95f5fcec03647f7c8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 15 22:08:52 2008 +1030 + + Add stroke-ctm-caps to .gitignore + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 344af99d356203dce8cb97d3effa380cad0c9238 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 15 22:07:01 2008 +1030 + + Improve the PDF operators word wrapping + + to correctly count the columns and avoid breaking hex strings + immediately after the '<' and before any hex digits have been written. + + src/cairo-pdf-operators.c | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +commit 0a8478ca1aa37695e84b4875e1efb3d93c7b8434 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 14 23:23:16 2008 -0700 + + [quartz] don't say we forced subpixel AA when we didn't + + Whoops. Net result was that this was disabling subpixel AA on + contexts if CAIRO_ANTIALIAS_DEFAULT was being used. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 028d352286991f7ec1da168f7f91bed6449f64e4 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 14 23:22:08 2008 -0700 + + [quartz] compare gradient stops as doubles, not as fixed point + + We use the floating-point value later, and we can end up with weirdness + such as negative colors due to the precision mismatch of our fixed + point vs. floating point type. So just do everything in floating + point. + + src/cairo-quartz-surface.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 112bbacea3c06f844af400f34a4a2eadf25d13dd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 15 00:28:21 2008 +1030 + + Don't use fill-stroke during analysis + + Instead ensure the fill and stroke are each analyzed separately. + + This fixes a bug in the PS output where if a fill-stroke with a + translucent fill resulted in a fallback image with the stroke clipped + to the fill path. + + src/cairo-meta-surface.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +commit 112b43452d302eb4ac62a20bca01bdecbfdcaaf5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Mar 15 00:18:59 2008 +1030 + + Fix bug in _cairo_path_fixed_is_equal + + Ensure the entire path is compared. + + src/cairo-path-fixed.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 7e83d6e6fb8c4b11d5d95acac4a35df8969e0944 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 14 21:26:04 2008 +1030 + + Do not use PDF fill-stroke operator with transparent fill + + because the PDF rendering does not match cairo. See + PDF Reference 7.6.3. + + Bug report at + https://bugs.launchpad.net/inkscape/+bug/202096 + + src/cairo-pdf-surface.c | 15 +++++---------- + 1 file changed, 5 insertions(+), 10 deletions(-) + +commit 0aef7c1a34b2522d400b5a1a74567a79696216c9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 10 22:19:52 2008 +1030 + + PDF/PS: Optimize away the stroke ctm when not required + + The PDF/PS backends change the ctm to user space when emitting and + stroking a path. When the user space ctm does not alter the pen shape + we can avoid changing the ctm. + + This patch optimizes the most common case where the user ctm is + [1 0 0 -1 0 y] due to conversion from cairo to PDF coordinates. + + src/cairo-pdf-operators.c | 36 ++++++++++++++++++++++++++++-------- + 1 file changed, 28 insertions(+), 8 deletions(-) + +commit 2bd15d080c562bfcbced1f6bb586cc1e3cae4555 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 14 19:46:15 2008 +1030 + + Add PS reference image for stroke-ctm-caps + + test/stroke-ctm-caps-ps-ref.png | Bin 0 -> 1079 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 761b4ce8dd40b8e5536a19018656c2440a61e71a +Author: Jeremy Huddleston <jeremyhu@apple.com> +Date: Thu Mar 13 17:45:25 2008 -0700 + + [mac] Correctly handle endianness in multi-architecture compiles on MacOS X + + configure.in | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 4cc93881d9603c90f1318b2eb822cf2c516ecf7d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 13 17:30:59 2008 -0700 + + [test] Add testcase for previous stroker regression fix + + Add Adrian's original testcase for reproducing the stroker device + vector issue. (b4f518f917f5062537ee3c6a7a54180017b2c588) + + test/Makefile.am | 3 ++ + test/stroke-ctm-caps-quartz-ref.png | Bin 0 -> 1109 bytes + test/stroke-ctm-caps-ref.png | Bin 0 -> 1057 bytes + test/stroke-ctm-caps.c | 86 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 89 insertions(+) + +commit a33351f9c677144437bef25a794b97f2ac4bb17a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 13 15:37:26 2008 -0700 + + [quartz] remove some compiler warnings + + src/cairo-atsui-font.c | 2 +- + src/cairo-quartz-image-surface.c | 4 ---- + 2 files changed, 1 insertion(+), 5 deletions(-) + +commit b4f518f917f5062537ee3c6a7a54180017b2c588 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 13 15:36:30 2008 -0700 + + Correctly pass the device-space vector through to stroker + + Part of the earlier optimization caused the wrong slope to be used for + some computations; this passes the correct slope vector down to + _compute_face. + + src/cairo-path-stroke.c | 37 +++++++++++++++++++++++-------------- + test/dash-scale-ref.png | Bin 8035 -> 8058 bytes + test/reflected-stroke-ref.png | Bin 4802 -> 5704 bytes + 3 files changed, 23 insertions(+), 14 deletions(-) + +commit 5050c55f93afef9b0d0651a78f2c99e06e19b55a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Mar 13 21:35:12 2008 +1030 + + Use the correct glyph metrics in Type1 fallback + + Now that the PS backend is using PDF operators, it uses the glyph + metrics in the font to position each glyph in a string. This exposed a + bug in Type 1 fallback where the glyph width and height was used in + the charstrings instead of x_advance/y_advance. This was causing + strings to print diagonally due to the no zero y_advance. + + src/cairo-type1-fallback.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ed452713cfa16e5facca8f918ef4ee4fe2ec41c3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 12 18:33:05 2008 -0700 + + [win32] Use a DIB when cloning a surface for a WIN32_PRINTING dest + + In some cases we were creating a 1bpp temporary surface, losing all + color/grayscale data while printing. + + Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=399388 + + src/cairo-win32-surface.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 6ac3eb487cf0de0d28bf6b14852de91b09fecb05 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 12 18:19:59 2008 -0700 + + [quartz] correctly force subpixel AA on a context, even if defaults say otherwise + + In some cases (in my case, having an external monitor attached to my + MBP), Quartz seems to default to grayscale AA even when it should be + using subpixel AA. CGContextGetAllowsFontSmoothing returns FALSE in + this case (pretty sure this is a Quartz bug). We can force subpixel + AA in this case by setting CGContextSetAllowsFontSmoothing. + + src/cairo-quartz-surface.c | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +commit 5d11b937f1b769355a3dc7971ded40f60b001630 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Mar 12 18:11:57 2008 -0700 + + [quartz] Apply fixup to unbounded operators to clear area outside of mask + + src/cairo-quartz-surface.c | 249 ++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 236 insertions(+), 13 deletions(-) + +commit c86cbcdd644e043dc5ae2eabf5dd6afa020e2358 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 12 17:54:54 2008 +0000 + + [cairoint.h] Mark _cairo_image_analyze_transparency as private. + + Add the required cairo_private markup for make check. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 222eb6f1400ab7a51632cbc18b1526664e50c2e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 12 17:52:16 2008 +0000 + + Define _BSD_SOURCE to enable prototypes for strdup, snprintf. + + strdup() and friends require at least _BSD_SOURCE or + _XOPEN_SOURCE >= 500 to be defined for the prototypes to be included. + For the time being, add the define to each source file that requires one + of the BSD functions. + + src/cairo-cff-subset.c | 1 + + src/cairo-font-face.c | 1 + + src/cairo-ft-font.c | 1 + + src/cairo-output-stream.c | 1 + + src/cairo-pdf-surface.c | 1 + + src/cairo-ps-surface.c | 1 + + src/cairo-scaled-font-subsets.c | 1 + + src/cairo-svg-surface.c | 3 ++- + src/cairo-truetype-subset.c | 1 + + src/cairo-type1-fallback.c | 1 + + src/cairo-type1-subset.c | 1 + + 11 files changed, 12 insertions(+), 1 deletion(-) + +commit 2d9203c349ffba863368e85567b2e89443d51746 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 10 22:30:16 2008 +1030 + + win32-printing: Don't scale the miter limit + + since the miter is a ratio it should not be scaled like the other + stroke parameters when the user ctm is scaled. + + src/cairo-win32-printing-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f534fe434db38c2c24605bdfc251e0186dc7cafc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 10 17:18:07 2008 +1030 + + PDF: Use cairo_image_analyse_transparency during analysis + + OPERATOR_SOURCE is only supported for opaque images. Check if and ARGB + image really contains transparency before returing unsupported. + + src/cairo-pdf-surface.c | 38 +++++++++++++++++++++++++++++++++++++- + 1 file changed, 37 insertions(+), 1 deletion(-) + +commit 61d45c9d1f2322c7c2ee7a58e7b3d5ccfac92db2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 16 22:34:39 2008 +1030 + + Remember the results of _cairo_image_analyze_transparency + + As _cairo_image_analyze_transparency() is only used on images in the + meta surface, we can store the results of the image analysis and + return the saved value on second and subsequent calls to analyze the + same image. + + Previously each image was analyzed twice - once during + CAIRO_PAGINATED_MODE_ANALYZE and once during + CAIRO_PAGINATED_MODE_RENDER. + + src/cairo-image-surface.c | 21 +++++++++++++++------ + src/cairo-ps-surface.c | 3 +++ + src/cairo-types-private.h | 3 ++- + src/cairoint.h | 1 + + 4 files changed, 21 insertions(+), 7 deletions(-) + +commit 7eb8f497d8ac8ee76809f958170f1e5370744ba8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 16 22:13:43 2008 +1030 + + Move analyze_image_transparency in to cairo-image-surface.c + + src/cairo-image-surface.c | 29 +++++++++++++++++++++++++++++ + src/cairo-ps-surface.c | 44 ++------------------------------------------ + src/cairo-types-private.h | 6 ++++++ + src/cairoint.h | 3 +++ + 4 files changed, 40 insertions(+), 42 deletions(-) + +commit 00091d50a6187acd0fd35aef16a4fa5fab3c8aa9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 9 16:44:18 2008 +1030 + + Add fallback image comment to PS output + + To help better understand when fallback images are used, a comment + similiar to the following is included with each fallback image in the + PS output. + + % Fallback Image: x=101, y=478, w=50, h=10 res=300dpi size=31500 + + src/cairo-ps-surface.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 95acec69d8ee4fd37937f5b466c2baf612e9113a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 9 16:40:25 2008 +1030 + + Round fallback image size up instead of down + + to ensure the fallback image completely covers the fallback region. + + src/cairo-paginated-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 94e41d5565ef72a0ef6e0235545c660aaf92b825 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Mar 8 17:45:47 2008 -0800 + + [quartz] Don't force interpolation off for images + + Creating a CGImage with interpolation set to FALSE means that + it will never be interpolated; otherwise the interoplation + is controlled by the destination context's interpolation + quality setting. + + src/cairo-quartz-image-surface.c | 4 ++-- + src/cairo-quartz-surface.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 08e38d3f204911a793d3aa24bf2636caf3e58e20 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Mar 8 16:06:01 2008 -0800 + + [quartz] align strides to 16 bytes, as per apple docs + + The docs indicate that doing so can yield a peformance win, so we align + ARGB32/RGB24 surface strides to 16 bytes. + + src/cairo-quartz-surface.c | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit 73444f16fa82b63a19aa938eb42001b5731326da +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Mar 8 15:31:15 2008 -0800 + + [quartz] Don't try to call CGBitmapContextCreateImage on non-bitmap contexts + + src/cairo-quartz-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 091df2c59b6dbd53a748955db359443d5d445ba4 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Mar 8 15:16:05 2008 -0800 + + [quartz] properly honor text antialiasing modes in show_glyphs + + src/cairo-quartz-surface.c | 35 ++++++++++++++++++++++++---- + test/Makefile.am | 2 ++ + test/text-antialias-none-quartz-ref.png | Bin 0 -> 304 bytes + test/text-antialias-subpixel-quartz-ref.png | Bin 0 -> 1100 bytes + 4 files changed, 32 insertions(+), 5 deletions(-) + +commit 4f7ac14b8fdafd9fa85e797fb6e4c974788f70fc +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Mar 8 19:22:13 2008 -0800 + + [quartz] implement REPEAT/REFLECT for gradients + + Implement REPEAT/REFLECT for gradients in Quartz: for linear gradients, + they're implemented natively (by extending the gradient region); for + radial gradients, we generate a fallback image using pixman and render + that. + + src/cairo-quartz-surface.c | 203 +++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 179 insertions(+), 24 deletions(-) + +commit 869942a97e34b09a7bd5b8cfc54832ce9dbd08b6 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 7 16:55:47 2008 -0800 + + [quartz] some more quartz ref images + + test/Makefile.am | 2 ++ + test/big-line-quartz-ref.png | Bin 0 -> 1075 bytes + test/big-line-quartz-rgb24-ref.png | Bin 0 -> 941 bytes + 3 files changed, 2 insertions(+) + +commit 2e33d5f57bde82b953ebc5f9c1355327a7ac4967 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 7 16:46:53 2008 -0800 + + [quartz] Update a bunch of reference images + + Generated with Bitstream Vera font family installed, using ATSUI + font backend. + + test/Makefile.am | 14 ++++++++++++++ + test/font-matrix-translation-quartz-ref.png | Bin 0 -> 1041 bytes + test/glyph-cache-pressure-quartz-ref.png | Bin 0 -> 3491 bytes + test/linear-gradient-quartz-ref.png | Bin 0 -> 1164 bytes + test/long-dashed-lines-quartz-ref.png | Bin 0 -> 2313 bytes + test/mask-quartz-ref.png | Bin 10657 -> 10682 bytes + test/operator-clear-quartz-ref.png | Bin 1195 -> 1368 bytes + test/operator-clear-quartz-rgb24-ref.png | Bin 1244 -> 1201 bytes + test/radial-gradient-quartz-ref.png | Bin 0 -> 92334 bytes + test/random-intersections-quartz-ref.png | Bin 0 -> 197778 bytes + test/reflected-stroke-quartz-ref.png | Bin 0 -> 5293 bytes + test/rotate-image-surface-paint-quartz-ref.png | Bin 257 -> 257 bytes + test/select-font-face-quartz-ref.png | Bin 0 -> 2958 bytes + test/show-text-current-point-quartz-ref.png | Bin 0 -> 3198 bytes + test/text-antialias-gray-quartz-ref.png | Bin 0 -> 1039 bytes + test/text-pattern-quartz-rgb24-ref.png | Bin 0 -> 1867 bytes + test/text-rotate-quartz-ref.png | Bin 0 -> 17405 bytes + test/trap-clip-quartz-ref.png | Bin 6171 -> 6041 bytes + test/unantialiased-shapes-quartz-ref.png | Bin 0 -> 4394 bytes + 19 files changed, 14 insertions(+) + +commit fb1378a24b5c6cd65b73aa611bb049ebb6f2b57a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 7 16:46:15 2008 -0800 + + [quartz] Correctly handle gradients with non-identity pattern transform + + Fixes http://bugs.freedesktop.org/show_bug.cgi?id=14248 + + src/cairo-quartz-private.h | 3 +- + src/cairo-quartz-surface.c | 68 ++++++++++++++++++++-------------------------- + 2 files changed, 31 insertions(+), 40 deletions(-) + +commit 6c7610067f8a131a4fbba8d2b6a88c27ef229bbe +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 7 15:35:31 2008 -0800 + + [quartz] handle antialiasing correctly in stroke() and clip() + + A CoreGraphics bug was fixed so strokes are no longer incorrectly + drawn with antialiasing disabled; we no longer have to ignore + antialiasing for stroke(). Also, antialiasing was not being + correctly set for clip(). This fixes both issues. + + src/cairo-quartz-surface.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 21dab3c5e9fe1ff344ff809053618c2c8f0710f3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 7 14:49:46 2008 -0800 + + [quartz] look up the right symbol name for CGContextGetType + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e52bad5e33e0b69b868525056c95ebd473fd6b10 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Mar 7 14:49:15 2008 -0800 + + [quartz] split out (experimental) quartz-image into separate file + + configure.in | 15 ++++++++++ + src/Makefile.am | 5 ++++ + src/cairo-quartz-image-surface.c | 21 +++++++++----- + src/cairo-quartz-image.h | 59 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-quartz-surface.c | 10 +++---- + src/cairo-quartz.h | 6 ---- + 6 files changed, 97 insertions(+), 19 deletions(-) + +commit b52f127c12fd7ee2b4f532954cb1e9e4eb8561b4 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Mar 6 16:52:54 2008 -0800 + + [quartz] fix text rendering with gradient or image source + + A quirk in how CGContextShowGlyphsWithAdvances works was causing all + non-solid glyphs to be rendered on top of eachother. This fixes the problem. + + src/cairo-quartz-surface.c | 65 +++++++++++++++++++++++++--------------------- + 1 file changed, 36 insertions(+), 29 deletions(-) + +commit de515e0f9a46162dcdef3bce81702a56ac6f29bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 6 08:10:16 2008 +0000 + + [cairo-png] Revert accidental chunk from FORMAT_A1 support. + + Whilst splitting the patches, I left in this line which would preserve + 1-bit grayscale unexpanded, but without any of the other FORMAT_A1 + support. + + src/cairo-png.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8ba8a1192497ff89215f8a1657cbe88609083fb1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 4 13:59:57 2008 +0000 + + [win32] make check doc fixup. + + Add the missing '%' to the macro as demanded by make check. + + src/cairo-win32-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1dd894115e03aa202941ecebe9fd3420c73645ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 4 09:04:17 2008 +0000 + + [cairo-pattern] Raise an error for _cairo_pattern_create_solid() failure. + + Add a missing _cairo_error() for the malloc failure in + _cairo_pattern_create_solid(). + + src/cairo-pattern.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 5efc5238d548599a90a02d922d031a899424d1c1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 17:06:30 2008 +0000 + + [cairo-hull] Propagate error during hull computation. + + Propagate the original error status instead of returning a new NO_MEMORY + error. + + src/cairo-hull.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit 11a2444ec875aaaed12c1f1cfed5eb8e139c306d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 18 14:53:50 2008 +0000 + + [cairo-png] Support generating CAIRO_FORMAT_RGB24 from PNGs. + + If the PNG does not have an alpha channel, then create an opaque image. + + src/cairo-png.c | 69 +++++++++++++++++++------- + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/png.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 204 insertions(+), 17 deletions(-) + +commit 06b375aee999220ce294c22fa50a3040c19d5492 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:55:01 2008 +0000 + + [cairo-png] Use cairo_format_stride_for_width() + + Use cairo_format_stride_for_width() instead of assuming the pixel size + and manually calculating the row stride. This should make it easier to + support loading multiple image formats in future. + + src/cairo-image-surface.c | 1 + + src/cairo-png.c | 16 ++++++++++------ + src/cairoint.h | 1 + + 3 files changed, 12 insertions(+), 6 deletions(-) + +commit b181f40949a855c957dc6e7a1033981a2ed7d05a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 28 16:04:08 2008 +0000 + + [test/a8-mask] Check negative strides as well. + + Check that we also allow surfaces to be created using a negative stride. + + test/a8-mask.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +commit b6eb1c5c92321849661198facd53510366050d45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:49:14 2008 +0000 + + [cairo-image-surface] Harden cairo_format_stride_for_width(). + + Check the user supplied values for validity and potential overflow, + returning -1 in such cases, and update the documentation to warn of the + new error return. + + src/cairo-image-surface.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit c06d929325710c1a2cbecb8a64803ca8e1ffbec0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 28 16:07:57 2008 +0000 + + [cairo-png] Further hardening against malloc failures. + + On some OOM paths, libpng raises a warning as opposed to an error, + these were not being propagated back to the caller. We were also not + checking that we did not overwrite a pre-existing error status when + raising an error whilst performing I/O. + + src/cairo-png.c | 38 +++++++++++++++++++++++++++++--------- + 1 file changed, 29 insertions(+), 9 deletions(-) + +commit c985096e6d7c04a780c055387e17ec4bb9334db3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:16:39 2008 +0000 + + [cairo-xlib] Tidy usage of _cairo_error(). + + Avoid a duplicate call to _cairo_error() and add a missing one. + + src/cairo-xlib-display.c | 1 + + src/cairo-xlib-surface.c | 12 ++++++------ + 2 files changed, 7 insertions(+), 6 deletions(-) + +commit 914f4a3ec5a310c823558c27e500a23be808b9fe +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:15:26 2008 +0000 + + [cairo-pattern] Tidy usage of _cairo_error(). + + Remove the duplicate calls to _cairo_error() along the constructor + error paths and a missing call to _cairo_error(). + + src/cairo-pattern.c | 20 +++++--------------- + 1 file changed, 5 insertions(+), 15 deletions(-) + +commit d9fb4d4bc55eae42f6348b142e667be454064e2c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:12:57 2008 +0000 + + [cairo-ft-font] Simplify return of the nil font face during construction. + + Simply return the nil font face from the internal constructor rather + than returning NULL and repeating the same fixup in the callers. + + src/cairo-ft-font.c | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +commit fd7d5d6e1dbad6c44a607d91ee59361ee19d32f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:11:47 2008 +0000 + + [cairo-clip] Raise _cairo_error() at original error site. + + In a couple of places where we detect an error and return an error + object to the user, we did not throw a _cairo_error(). + + src/cairo-clip.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 1654510a349d99167247d1004a481a95388cf0be +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 11:10:34 2008 +0000 + + [cairo-cff-subset] Propagate error status. + + Remove duplicate _cairo_error() by ensuring that the error status is + always propagated from the original error site. Note that in one case + this eliminates a potential _cairo_error(CAIRO_INT_STATUS_UNSUPPORTED)! + + src/cairo-cff-subset.c | 47 +++++++++++++++++++++++++---------------------- + 1 file changed, 25 insertions(+), 22 deletions(-) + +commit 3b93d90edde7c065c6484e03e056b8605af85c4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 10:16:05 2008 +0000 + + [cairo-type1-fallback] Propagate original error status. + + _cairo_error() has already been called at the originating error site, so + remove the duplicate (hard-coded!) call at the return statement. + + src/cairo-type1-fallback.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 141c54cd276ae86f6677fa8f66a118264d4287bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 29 08:54:33 2008 +0000 + + [cairo-truetype-subset] Remove duplicate _cairo_error(). + + _cairo_error() has already been called at the originating error site, so + remove the duplicate call at the return statement. + + src/cairo-truetype-subset.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit d89edde84de9cec9ce6f76f4f2c44dd9c1220528 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Mar 4 00:15:46 2008 -0800 + + [meta] always copy glyph array before passing to _cairo_surface_show_glyphs + + _cairo_surface_show_glyphs is allowed to mutate the glyph array; if it's + handed the internal array that the meta surface holds, then any subsequent + playback (such as for fine-grained fallbacks) will result in incorrect + glyph rendering. + + Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=419917 + (I was unable to create a simple cairo testcase to demonstrate the problem.) + + src/cairo-meta-surface.c | 24 +++++++++++++++--------- + 1 file changed, 15 insertions(+), 9 deletions(-) + +commit 4a1f65b63e891436f5896b1ccb0af26dd4b9cfe1 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 3 21:16:12 2008 -0800 + + Fix msvc compilation issue in cairo-compiler-private.h + + __WIN32__ is not a standard define set by MSVC; we have to check for + __WIN32__ (for mingw/gcc) and for _MSC_VER, for MSVC. + + src/cairo-compiler-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4588b016d389bb678ab55f7dbbf2bf8cdf597bc1 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 3 20:00:08 2008 -0800 + + [quartz] compilation fix + + I'm an idiot and forgot to stg refresh, apparently. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2f9350424fd7eb03ecbdbdee2831944d4e9c35af +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 3 17:43:41 2008 -0800 + + [win32] Treat all incoming HDCs as RGB24, regardless of depth + + Assuming A8/A1 doesn't really make sense in any case, and doing + this allows for rendering to 8bpp displays. + + src/cairo-win32-surface.c | 28 ++++++---------------------- + 1 file changed, 6 insertions(+), 22 deletions(-) + +commit 9dd55f6fe854ec2365a5c1d264e39ca03f6eceb5 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Mar 3 17:40:21 2008 -0800 + + [quartz] use CGContextGetType API if available + + We need to have a way to figure out if a context is a bitmap context; + the current method works, but it prints a warning to the system console + if called on a non-bitmap context. There's a private CGContextGetType + API that seems to let us get this information. + + src/cairo-quartz-surface.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 5b334b274778f588c997d674c111a8bbf91be1df +Author: Antoine Azar <cairo@antoineazar.com> +Date: Fri Feb 29 03:49:55 2008 -0500 + + fixed compilation typo on win32 + + src/cairo-win32-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 39d18ecbfda6b3c1234c5ef4a4723099990b3502 +Author: Claudio Ciccani <klan@directfb.org> +Date: Sat Mar 1 11:07:47 2008 +0100 + + [cairo-directfb] Fixed bug in clone_similar() (src_x added twice). + + src/cairo-directfb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6295c46569de13a96816ed8e30dcefd73af1eb18 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 17:08:40 2008 -0800 + + INSTALL: Add notes on running autogen.sh if there is no configure script + + INSTALL | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 65 insertions(+), 6 deletions(-) + +commit e7e4a03dd387d264226105dc29c8541f0528fd2c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 16:39:42 2008 -0800 + + get-path-extents: Fix APPROX_EQUALS to round values on both sides of the comparison + + test/get-path-extents.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 602489b150e879bc5cab6b1ad37c107799bf05ae +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 16:33:51 2008 -0800 + + get-path-extents: Use APPROX_EQUALS instead of EQUALS for text path tests + + This is done grudgingly due to freetype rounding the coordinates + of the extents when hinting is enabled. + + test/get-path-extents.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 50a6fe1a2aa88e1f5ba40eda21142319f98f3d0d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 16:32:55 2008 -0800 + + Remove unnecessary cairo_set_tolerance call from get-path-extents test + + test/get-path-extents.c | 1 - + 1 file changed, 1 deletion(-) + +commit 4a73471087f42baf07988e0f2de323ed3b18dac9 +Merge: 54a6191 523c7db +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 16:21:11 2008 -0800 + + Merge branch 'master' of git.cairographics.org:/git/cairo + +commit 54a61911f26b46b6d9b7335ac7dda746081261d9 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 16:20:56 2008 -0800 + + Increment version to 1.5.13 after the 1.5.12 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 523c7dbf6db85e75624ae111179dedb570212bb2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 28 18:53:08 2008 -0500 + + [cairo-scaled-font] Pedantic check for zero-area glyphs + + src/cairo-scaled-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3ec4b9a4fc96572f099d0e9679fec9e5eb97a32e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 15:46:22 2008 -0800 + + Increment cairo version to 1.5.12 and libtool versioning to 18:0:16 + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bf99e355d9d24a4820dc93b49321b15318501b61 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 15:45:11 2008 -0800 + + Clarify that 16-bit limit still exists in pixman + + NEWS | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit 4cc174f72f635e885b5f5fdc3d67789d3952cd2e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 15:41:36 2008 -0800 + + Mark the big-line test as XFAIL + + test/Makefile.am | 1 + + test/big-line.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 5d0bc97b2000a7b7e40a7a3918f09d90bdf5376a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 15:35:46 2008 -0800 + + Fix incorrect reference images for big-line test + + I mistakenly generated the original reference images with + a 16.16 version of cairo, (which manifests a different + buggy behavior than does the current 24.8 cairo). + + test/big-line-ps-ref.png | Bin 1161 -> 1148 bytes + test/big-line-ps-rgb24-ref.png | Bin 809 -> 830 bytes + test/big-line-ref.png | Bin 1421 -> 1486 bytes + test/big-line-rgb24-ref.png | Bin 1231 -> 1308 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 4c7784e91eb953b905f187dda2a76dc102d73d01 +Author: Jody Goldberg <jody@gnome.org> +Date: Thu Feb 28 15:23:53 2008 -0800 + + Fix PDF ouput when cross-compiling with mingw + + Need to use __WIN32__ instead of _MSC_VER to select _snprintf in + place of snprintf when cross compiling. Otherwise all all %ld + arguments get misprinted resulting in broken PDF output. + + src/cairo-compiler-private.h | 5 ++++- + src/cairo-output-stream.c | 5 +---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 3d9db511c6990481add24f14225e36ea4d3f62d5 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 15:07:50 2008 -0800 + + Remove references to PIXMAN_yuy2 and PIXMAN_yv12 enum values + + These were added in cb5ea8abfdf2c92241d4dea8bb827648697fd8e9 to + quiet a compiler warning. We're reverting them now to avoid + gratuitously requiring a new pixman version just to pick up two + enum values that we aren't actually using. + + src/cairo-image-surface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit a8e5c6b924447bb1303589cc31792a6c4bcc27ec +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 15:05:12 2008 -0800 + + Fix typo in comment + + src/cairo-fixed-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 307a7448ea89c5cf2805bc3a8da31c5ea77e4542 +Author: Larry Ewing <lewing@novell.com> +Date: Thu Feb 28 15:02:23 2008 -0800 + + Add big-line test showing a 24.8 failure + + test/.gitignore | 1 + + test/Makefile.am | 5 +++ + test/big-line-ps-ref.png | Bin 0 -> 1161 bytes + test/big-line-ps-rgb24-ref.png | Bin 0 -> 809 bytes + test/big-line-ref.png | Bin 0 -> 1421 bytes + test/big-line-rgb24-ref.png | Bin 0 -> 1231 bytes + test/big-line.c | 69 +++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 75 insertions(+) + +commit 81175110ab44e74fe04f2bc8ed3c9983e23a82c6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 14:36:47 2008 -0800 + + NEWS: Add notes for cairo 1.5.12 + + NEWS | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 94 insertions(+) + +commit fbd29a4025fc3bca3812d205230151e8c6e80f49 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 14:36:32 2008 -0800 + + Fix 'make doc-publish' for when run twice on the same day + + Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 8d515344c4ecded58566b704a740766f85359876 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 14:35:57 2008 -0800 + + Add cairo-quartz to the manual + + doc/public/Makefile.am | 1 - + doc/public/cairo-docs.xml | 2 +- + doc/public/cairo-sections.txt | 11 +++++++++ + doc/public/tmpl/cairo-quartz.sgml | 49 ++++++++++++++++++++++++++++++++++++++ + doc/public/tmpl/cairo-surface.sgml | 1 + + 5 files changed, 62 insertions(+), 2 deletions(-) + +commit c8c77f01f7429b43dba4840698497187ff4d5779 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 13:02:27 2008 -0800 + + Fix typo in documentation + + src/cairo-quartz-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa4b91fcac9b83cb66ac98dbcb395bd7b75c7560 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 12:56:31 2008 -0800 + + Add missing reference images to make distcheck happily + + test/Makefile.am | 28 ++++++++++++++++++++++------ + 1 file changed, 22 insertions(+), 6 deletions(-) + +commit a95b22858fa5d65600faf5163966e18760a3cf35 +Merge: c84ec58 67d5437 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 28 12:30:13 2008 -0800 + + Merge branch '24.8' + +commit 67d543716e294f4af330c52dcc9597e16267425e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 27 20:39:53 2008 -0800 + + PS: Fix to never break the final ~> that terminates a base85 stream. + + This was recently broken in commit 40d5082c24819968a5ee5a8f72e3b9cd61cb6105 + which uses a base85-stream but without strings for encapsulating image + data. The bug was that the protection for ~> was only being applied + to the string encodings rather than all base85 streams. + + We got lucky recently that the 24.8 change just happened to put the ~> + sequence on the line-wrap boundary so the test suite tripped up the + bug. Otherwise, we could have missed this for quite some time. + + src/cairo-ps-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit c84ec585123be1802b50665e192b80daf14fdd2b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 27 16:24:10 2008 -0800 + + Add some missing .gitignore entries + + test/.gitignore | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 1df0b001b5b3e1062fa3c3a9070391105fe3d4ba +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 27 15:08:18 2008 -0800 + + Change cairo's fixed-point format from 16.16 to 24.8 + + The additional 8 bits of integer allows device space to be 256 + times larger before applications need to start worrying about + any issues with overflow. So this should help in many cases. + And the loss of 8 bits of sub-pixel precision shouldn't cause + any harm at all---16 was really much more than necessary. + + With this change the details of rasterization for several tests + are changed slightly, (particularly on arcs, for example), so + many reference images are updated here. + + NOTE: This change is currently breaking get-path-extents for + ps/pdf/svg as well as push-group for ps. We do not yet know + the reasons for these new failures. + + src/cairo-fixed-type-private.h | 2 +- + test/clip-operator-ref.png | Bin 8262 -> 8263 bytes + test/clip-twice-ref.png | Bin 1191 -> 1362 bytes + test/clip-twice-rgb24-ref.png | Bin 1120 -> 1198 bytes + test/copy-path-ps-argb32-ref.png | Bin 442 -> 0 bytes + test/copy-path-ps-ref.png | Bin 0 -> 474 bytes + test/copy-path-ps-rgb24-ref.png | Bin 440 -> 0 bytes + test/linear-gradient-ps-ref.png | Bin 718 -> 779 bytes + test/mask-ref.png | Bin 8381 -> 8476 bytes + test/mask-svg-argb32-ref.png | Bin 8389 -> 8527 bytes + test/meta-surface-pattern-svg-argb32-ref.png | Bin 3896 -> 3924 bytes + test/operator-clear-ps-argb32-ref.png | Bin 1437 -> 1400 bytes + test/operator-source-ref.png | Bin 4422 -> 4422 bytes + test/push-group-ref.png | Bin 3005 -> 3126 bytes + test/push-group-rgb24-ref.png | Bin 2849 -> 2961 bytes + test/random-intersections-ps-ref.png | Bin 89253 -> 89253 bytes + test/random-intersections-ref.png | Bin 132210 -> 148722 bytes + test/text-pattern-svg-argb32-ref.png | Bin 1749 -> 1733 bytes + test/text-rotate-ps-ref.png | Bin 6859 -> 6878 bytes + test/trap-clip-ref.png | Bin 5723 -> 5772 bytes + test/unantialiased-shapes-ref.png | Bin 3968 -> 4459 bytes + 21 files changed, 1 insertion(+), 1 deletion(-) + +commit 0532cb5c03bac394e22ac4200e8bebc3d959b21c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 27 13:18:39 2008 -0800 + + Remove reference images for text-zero-len + + This test isn't generating any image output, so it's silly to + have a 60x60 reference image for that. Not only that, but the + rgb24 cases have always been failing due to a missing rgb24- + specific reference image, (but pdiff had been hiding that). + + test/Makefile.am | 1 + + test/text-zero-len-ref.png | Bin 130 -> 0 bytes + test/text-zero-len.c | 4 +--- + 3 files changed, 2 insertions(+), 3 deletions(-) + +commit 427a73ab31e2dce9d98820ba921b216176cde182 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 27 12:43:37 2008 -0800 + + Add ps-specific reference images for two recently-added tests + + test/Makefile.am | 2 ++ + test/long-dashed-lines-ps-ref.png | Bin 0 -> 1516 bytes + test/reflected-stroke-ps-ref.png | Bin 0 -> 3898 bytes + 3 files changed, 2 insertions(+) + +commit 676c869d794f824b6e624d0b9b5c960870102406 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 27 11:24:59 2008 -0800 + + Add some new ps-specific reference images + + These are necessary now due to the recent change to use pdiff + only when the differences are less than a particular threshold. + + test/Makefile.am | 8 ++++++++ + test/caps-joins-ps-ref.png | Bin 0 -> 1459 bytes + test/close-path-ps-ref.png | Bin 0 -> 309 bytes + test/infinite-join-ps-ref.png | Bin 0 -> 218 bytes + test/leaky-polygon-ps-ref.png | Bin 0 -> 354 bytes + test/rectilinear-miter-limit-ps-ref.png | Bin 0 -> 221 bytes + test/self-copy-ps-ref.png | Bin 0 -> 335 bytes + test/skew-extreme-ps-ref.png | Bin 0 -> 1048 bytes + test/text-rotate-ps-ref.png | Bin 0 -> 6859 bytes + test/transforms-ps-ref.png | Bin 0 -> 418 bytes + 10 files changed, 8 insertions(+) + +commit 1889427e78f2501df78a42c5e75c696745b517a7 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Feb 27 12:35:56 2008 -0500 + + Fix usage of rectangle_int16_t in ps surface, and rename types + + The rectangle_int16_t usage was causing failures on 24.8 (due to a wrong + pointer used to get_extents); I removed all the specific int16/int32 typedefs + to avoid this situation in the future. + + src/cairo-ps-surface.c | 2 +- + src/cairo-types-private.h | 47 +++++++++++++++++++++-------------------------- + 2 files changed, 22 insertions(+), 27 deletions(-) + +commit 4f7d3063520b987d3df3bcebfaeed9489b16b12d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 27 10:11:08 2008 +0000 + + [cairo-paginated-surface] Fix enum compiler warning. + + Add a CAIRO_SURFACE_TYPE_QUARTZ_IMAGE to the switch to suppress a + compiler warning. + + src/cairo-paginated-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit cb5ea8abfdf2c92241d4dea8bb827648697fd8e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 21 16:03:42 2008 +0000 + + [cairo-image-surface] Compiler warnings and whitespace. + + Silence a couple of enum compiler warnings and tweak the whitespace. + + src/cairo-image-surface.c | 45 ++++++++++++++++++++++++--------------------- + 1 file changed, 24 insertions(+), 21 deletions(-) + +commit 22600e2393f2ec5ebe40213c49599167523ddf20 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 22 17:07:45 2008 +0000 + + [cairo-gstate] Remove a couple of impossible guards. + + Delete a couple of superfluous gstate != NULL guards. + + src/cairo-gstate.c | 6 ------ + 1 file changed, 6 deletions(-) + +commit 37e597f1e553a98d06c5334aa95b918ed303e89e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 22 17:03:51 2008 +0000 + + [cairo-gstate] Propagate the error from _cairo_gstate_clone(). + + Propagate the true status value back from the _cairo_gstate_init_copy() + instead of assuming that is a NO_MEMORY and re-raising the error in the + caller. + + src/cairo-gstate.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 127d7f43ea7043bba1d276d9721e80a702d9fd46 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 21 15:56:34 2008 +0000 + + [cairo-path-bounds] _cairo_path_fixed_bounds() can fail... + + I was wrong in my assertion that the call to + _cairo_path_fixed_interpret_flat() could not possibly fail with the + given _cairo_path_bounder_* callbacks - as I had missed the implicit + spline decomposition. (An interesting exercise would be to avoid the + spline allocation...) As a result we do have to check and propagate the + status return through the call stack. + + src/cairo-analysis-surface.c | 8 ++++++-- + src/cairo-gstate.c | 12 +++++++++--- + src/cairo-path-bounds.c | 10 +++++----- + src/cairo.c | 10 +++++++--- + src/cairoint.h | 4 ++-- + 5 files changed, 29 insertions(+), 15 deletions(-) + +commit 65a8a279430a08e6f28b1e0354e9f18fda1a0ad7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 26 14:14:38 2008 +0000 + + [test] Add reflected-stroke to exercise stroking with a reflected ctm. + + Parts of the stroker depend upon whether we have in effect a reflection + matrix (one whose determinant < 0). This test incopororates the same + drawing under the a couple of reflections to exercise stroking under + matrices with both positive and negative determinants. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/reflected-stroke-ref.png | Bin 0 -> 4802 bytes + test/reflected-stroke.c | 100 ++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 103 insertions(+) + +commit 76f0613e5f1244557eab31945d7e7c757d987304 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 26 09:50:51 2008 +0000 + + [test] Add long-dashed-lines to exercise _cairo_box_intersects_line_segment(). + + Draw a few rectangles whose vertices are outside the bounds of the + surface, but whose segments cross the surface. This exercises the new + dashed stroker optimisation which tries to determine whether the line + segment is visible. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/long-dashed-lines-ref.png | Bin 0 -> 2116 bytes + test/long-dashed-lines.c | 75 +++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 78 insertions(+) + +commit cdeffc69d9daa931c3c4ffcbb9e093180da45fe5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 26 13:04:33 2008 +0000 + + [cairo-quartz-surface] Make check fixup. + + A couple of minor corrections to satisfy make check. + + src/cairo-quartz-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 40f4750f5ec53ca9ca6e3d621fefb2bd1687909e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 26 23:17:04 2008 +1030 + + Use PDF 're' operator for rectangle paths + + Modify cairo-pdf-operators.c to emit to 're' path operator when the + path contains only a rectangle. This can only be done when the path is + logically equivilent to the the path drawn by the 're' + operator. Otherwise dashed strokes may start on the wrong line. + + ie the path must be equivalent to: + + cairo_move_to (cr, x, y); + cairo_rel_line_to (cr, width, 0); + cairo_rel_line_to (cr, 0, height); + cairo_rel_line_to (cr, -width, 0); + cairo_close_path (cr); + + which is also equivilent to cairo_rectangle(). + + src/cairo-path-fixed.c | 24 ++++++++++++++++++++++++ + src/cairo-pdf-operators.c | 36 +++++++++++++++++++++++++++++------- + src/cairo-ps-surface.c | 2 ++ + src/cairoint.h | 4 ++++ + 4 files changed, 59 insertions(+), 7 deletions(-) + +commit 7acfee38b1ac6ef2292d754c7103bd65d58f72d8 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:44:04 2008 -0500 + + [atsui] Make default font 'Helvetica' + + The previous default font was Monaco, which is a fixed-pitch font; Helvetica + is more inline with the other platform defaults. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9979f786acaf0ebba1bf97e40aeba66287a3c743 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:27:33 2008 -0500 + + [test] update degenerate-pen test + + pdiff was hiding a rgb24 failure here, as the test was drawing using + black ink on the default black background. Instead, explicitly fill + the surface with white first. + + test/degenerate-pen-ps-argb32-ref.png | Bin 795 -> 0 bytes + test/degenerate-pen-ps-ref.png | Bin 0 -> 865 bytes + test/degenerate-pen-quartz-ref.png | Bin 0 -> 1144 bytes + test/degenerate-pen-ref.png | Bin 788 -> 1139 bytes + test/degenerate-pen.c | 4 ++++ + 5 files changed, 4 insertions(+) + +commit baec928a69b5b763b30766cddfb1473e4e05fc3c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:06:36 2008 -0500 + + [quartz] More mask fixes -- handle all types via fallback mask image + + src/cairo-quartz-surface.c | 79 ++++++++++++++++++++++++++++++++--------- + test/mask-quartz-ref.png | Bin 0 -> 10657 bytes + test/mask-quartz-rgb24-ref.png | Bin 0 -> 8418 bytes + 3 files changed, 62 insertions(+), 17 deletions(-) + +commit 3fcd0be52215e1d8a59560d6b0919fb3f53b7a28 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:06:35 2008 -0500 + + Use pdiff only if the pixel difference is less than a limit + + test/buffer-diff.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +commit 1dfb1bd45fbe08392e233af67f464b2776de9f19 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:06:28 2008 -0500 + + [quartz] update test suite images for quartz + + test/dash-scale-quartz-ref.png | Bin 0 -> 8079 bytes + test/leaky-dash-quartz-ref.png | Bin 0 -> 241 bytes + test/line-width-scale-quartz-ref.png | Bin 0 -> 6434 bytes + test/mask-alpha-quartz-argb32-ref.png | Bin 0 -> 641 bytes + test/meta-surface-pattern-quartz-ref.png | Bin 0 -> 4572 bytes + test/meta-surface-pattern-quartz-rgb24-ref.png | Bin 0 -> 4063 bytes + test/new-sub-path-quartz-ref.png | Bin 386 -> 383 bytes + test/over-above-source-quartz-ref.png | Bin 0 -> 530 bytes + test/over-above-source-quartz-rgb24-ref.png | Bin 0 -> 456 bytes + test/over-around-source-quartz-ref.png | Bin 0 -> 612 bytes + test/over-around-source-quartz-rgb24-ref.png | Bin 0 -> 491 bytes + test/over-between-source-quartz-ref.png | Bin 0 -> 570 bytes + test/over-between-source-quartz-rgb24-ref.png | Bin 0 -> 467 bytes + test/rotate-image-surface-paint-quartz-ref.png | Bin 0 -> 257 bytes + test/trap-clip-quartz-ref.png | Bin 5814 -> 6171 bytes + 15 files changed, 0 insertions(+), 0 deletions(-) + +commit b439e638087d6e76d14ca42cd59dba3915dcc8e8 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:06:25 2008 -0500 + + [quartz] fix mask to correctly take CTM into account + + src/cairo-quartz-surface.c | 40 ++++++++-------------------------------- + 1 file changed, 8 insertions(+), 32 deletions(-) + +commit a4975ab1173957a293aad8ccac51d1e43cab86da +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:06:23 2008 -0500 + + [quartz] Optimize path handling where possible + + src/cairo-path-fill.c | 66 ++----------------------------------- + src/cairo-path-fixed.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-quartz-surface.c | 11 +++++++ + src/cairoint.h | 7 ++++ + 4 files changed, 101 insertions(+), 64 deletions(-) + +commit 63711b1d4a61f21db070f30b9c153d0923cc24bb +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 25 21:06:21 2008 -0500 + + [quartz] Add quartz-image-surface type + + src/Makefile.am | 2 +- + src/cairo-quartz-image-surface.c | 370 ++++++++++++++++++++++++++++++ + src/cairo-quartz-private.h | 31 ++- + src/cairo-quartz-surface.c | 476 ++++++++++++++++++--------------------- + src/cairo-quartz.h | 6 + + src/cairo.h | 4 +- + 6 files changed, 634 insertions(+), 255 deletions(-) + +commit ecb54b96967ae0d1b5ec3a4d0955f46dd68f2b8b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 25 19:48:58 2008 -0500 + + [test/get-path-extents] Don't use short-circuit && operators + + That causes some tests to be skipped if the preceding test failed. + + test/get-path-extents.c | 143 +++++++++++++++++++++--------------------------- + 1 file changed, 62 insertions(+), 81 deletions(-) + +commit be316b7cfae90878d05869329c85c9617019bbec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 25 19:36:22 2008 -0500 + + [test]/get-path-extents] Use %g instead of %f to print doubles + + test/get-path-extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7c8c9cf334b8687ffe2d6f614e234bd1662689e6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Feb 25 21:50:37 2008 +1030 + + PDF: Support OPERATOR_SOURCE when pattern is opaque + + src/cairo-pdf-surface.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 35295546ef63821c5eee5336ec73eef2e03a035d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 22 22:06:25 2008 +1030 + + Add mask pdf ref images + + The mask test pdf output is now correct. Poppler ref images + are required due to minor gradient rendering differences. + + test/mask-pdf-argb32-ref.png | Bin 0 -> 7834 bytes + test/mask-pdf-rgb24-ref.png | Bin 0 -> 7383 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 1df969158c83b31acbcf0963913bc4d4a9d20730 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 22 21:59:47 2008 +1030 + + Refresh clip-operator ps/pdf ref images + + Because the meta surface analysis fix increased the size of some of + the fallback images. + + test/clip-operator-pdf-argb32-ref.png | Bin 9096 -> 11005 bytes + test/clip-operator-ps-argb32-ref.png | Bin 9062 -> 9084 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit eae259168fc4318f2a67f3107f953648e7ab925e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 22 21:07:31 2008 +1030 + + Using correct surface size and clip when analyzing meta surface patterns + + The surface size and clip needs to be saved before and restored after + replaying meta surface patterns back to the analysis surface. The clip + is reset and the correct surface size is set before replaying the meta + surface. + + src/cairo-analysis-surface.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 0db2c67cc5b29623070465f2cf6eafbff174ed30 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Feb 21 20:51:20 2008 +1030 + + PS: Replace gsave/grestore with q/Q + + src/cairo-ps-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 187ace8024ffadc3ee0b69bbd99c52d189cb7be2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 22 19:36:11 2008 +1030 + + PS: Make debug code compile + + src/cairo-ps-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8f0ec1174ad3c7a59ecdcf7724b8e8b96801b3e0 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 21 08:05:27 2008 -0800 + + Patch hole in fabric of time-space continuum + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70bb2abed04ed25abccbb2d6a5bdc58136701b0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 20 20:54:01 2008 -0500 + + [cairo-ft] Handle font sizes smaller than 1px correctly + + The FT_Set_Char_Size() docs say it replaces sizes smaller than 1.0 with 1.0. + So, we can't use x_scale and y_scale values less than one. The fix is easy thouh, + cap them to 1.0 and let the FT transform do the scaling down. + + src/cairo-ft-font.c | 36 ++++++++++++++++++++++-------------- + 1 file changed, 22 insertions(+), 14 deletions(-) + +commit dcab5019d5d9cb70aed0f473642ee840b785c4af +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 17:35:48 2008 -0800 + + Add poppler-specific reference image for radial-gradient + + This is justified by the previously mentioned bug on poppler + gradients. Note that this test only passes with a patch + to fix a bug in poppler (not yet upstream). Here it is: + + PATCH: Keep 'cairo_shape' and 'cairo' consistent + https://bugs.freedesktop.org/show_bug.cgi?id=14593 + + test/Makefile.am | 1 + + test/README | 1 + + test/radial-gradient-pdf-ref.png | Bin 0 -> 79490 bytes + 3 files changed, 2 insertions(+) + +commit 70b683363f6e37d8952c8f857dd687022a02ada5 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Feb 20 23:46:27 2008 +0100 + + [SVG] Fix a8-mask test failure. + + For A8 and A1 masks, the embedded mask image doesn't have an alpha channel. + In this case, the feColorMatrix should not be used, since it's goal is to + discard the color channels and to only keep the alpha one (which is what + we want when we have an ARGB32 mask image, since SVG uses all the channels + for the mask operation, where cairo only use the alpha channel). + + src/cairo-svg-surface.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit c5d056aaebe51d2c3430807de559b0d8ab3431d5 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Wed Feb 20 21:42:24 2008 +0100 + + [SVG] Fix the extend-reflect-similar test failure. + + SVG doesn't support extend reflect for image pattern, and there isn't + any trivial way to emulate this feature. So we use the image fallback + for now. This fix also forces an image fallback for extend-reflect, but + in the end, it generates more or less the same file (one big image for + the pattern). No other test is forced to use an image fallback by this + patch. + + src/cairo-svg-surface.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 1d236521a527d8b07962d1d671daff35134f4d31 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 10:00:41 2008 -0800 + + Increment cairo version to 1.5.11 after the 1.5.10 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 83489f623f1239a731c5377d634ea8e9b782d448 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 10:00:31 2008 -0800 + + SGML churn + + doc/public/tmpl/cairo-paths.sgml | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 0f2ecb5ec65ff13c3aafbe57600c1906f3fe7978 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 08:24:32 2008 -0800 + + Update REFERENCE_IMAGES for distcheck + + test/Makefile.am | 64 +++++++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 47 insertions(+), 17 deletions(-) + +commit ee62a5fad6a32a6997600caac8b292aef4e2fe54 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 08:08:52 2008 -0800 + + Mention that cairo_get_current_point is void again + + NEWS | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 118657136d3323f4769bee28ec2435a61540f0eb +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 08:06:39 2008 -0800 + + Increment cairo version to 1.5.10 and libtool versioning to 17:0:15 + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5aacc54c430a982b51992d6fac186b955e478045 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 08:02:45 2008 -0800 + + NEWS: Add notes for cairo 1.5.10 + + NEWS | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 94 insertions(+), 5 deletions(-) + +commit f954db72dd33de837296ede353ad9823b0e32fcd +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 06:24:48 2008 -0800 + + Add svg-specific reference image for mask-alpha + + There's no apparent bug here. + + test/mask-alpha-svg-argb32-ref.png | Bin 0 -> 615 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit c197c684a6b002ad8549d92f15d7f68b7c0068bd +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 05:58:42 2008 -0800 + + Update ps-specific reference images for ghostscript 8.61 + + I was wrong in the previous message where I said I had ghostscript 8.61 + installed. I do now, (and "gs --version" says the same thing), and + here are the new reference images. + + test/clip-fill-rule-ps-argb32-ref.png | Bin 322 -> 310 bytes + test/clip-fill-rule-ps-rgb24-ref.png | Bin 309 -> 302 bytes + test/dash-caps-joins-ps-argb32-ref.png | Bin 3854 -> 3870 bytes + test/dash-caps-joins-ps-rgb24-ref.png | Bin 3852 -> 3870 bytes + test/dash-curve-ps-ref.png | Bin 27206 -> 27293 bytes + test/dash-state-ps-argb32-ref.png | Bin 8652 -> 0 bytes + test/dash-state-ps-ref.png | Bin 0 -> 10219 bytes + test/dash-state-ps-rgb24-ref.png | Bin 8650 -> 0 bytes + test/dash-zero-length-ps-argb32-ref.png | Bin 319 -> 0 bytes + test/dash-zero-length-ps-ref.png | Bin 0 -> 319 bytes + test/dash-zero-length-ps-rgb24-ref.png | Bin 0 -> 304 bytes + test/degenerate-pen-ps-argb32-ref.png | Bin 771 -> 795 bytes + test/font-matrix-translation-ps-argb32-ref.png | Bin 785 -> 749 bytes + test/font-matrix-translation-ps-rgb24-ref.png | Bin 783 -> 749 bytes + test/ft-text-vertical-layout-type1-ps-ref.png | Bin 1894 -> 1911 bytes + test/ft-text-vertical-layout-type3-ps-ref.png | Bin 1879 -> 1867 bytes + test/glyph-cache-pressure-ps-ref.png | Bin 1667 -> 1413 bytes + test/gradient-alpha-ps-argb32-ref.png | Bin 179 -> 189 bytes + test/line-width-scale-ps-argb32-ref.png | Bin 3903 -> 0 bytes + test/line-width-scale-ps-ref.png | Bin 0 -> 3911 bytes + test/line-width-scale-ps-rgb24-ref.png | Bin 3901 -> 0 bytes + test/linear-gradient-ps-argb32-ref.png | Bin 613 -> 0 bytes + test/linear-gradient-ps-ref.png | Bin 0 -> 718 bytes + test/linear-gradient-ps-rgb24-ref.png | Bin 613 -> 0 bytes + test/linear-gradient-reflect-ps-ref.png | Bin 315 -> 314 bytes + test/meta-surface-pattern-ps-argb32-ref.png | Bin 3246 -> 3257 bytes + test/meta-surface-pattern-ps-rgb24-ref.png | Bin 3823 -> 3873 bytes + test/new-sub-path-ps-argb32-ref.png | Bin 559 -> 556 bytes + test/operator-clear-ps-argb32-ref.png | Bin 1409 -> 1437 bytes + test/operator-source-ps-argb32-ref.png | Bin 4026 -> 3893 bytes + test/operator-source-ps-rgb24-ref.png | Bin 3366 -> 3241 bytes + test/pixman-rotate-ps-argb32-ref.png | Bin 411 -> 0 bytes + test/pixman-rotate-ps-rgb24-ref.png | Bin 392 -> 0 bytes + test/random-intersections-ps-argb32-ref.png | Bin 89733 -> 0 bytes + test/random-intersections-ps-ref.png | Bin 0 -> 89253 bytes + test/random-intersections-ps-rgb24-ref.png | Bin 89733 -> 0 bytes + test/select-font-face-ps-ref.png | Bin 1352 -> 1079 bytes + test/show-text-current-point-ps-ref.png | Bin 1475 -> 1454 bytes + test/text-pattern-ps-argb32-ref.png | Bin 998 -> 984 bytes + test/text-pattern-ps-rgb24-ref.png | Bin 969 -> 936 bytes + test/text-rotate-ps-argb32-ref.png | Bin 7156 -> 0 bytes + test/text-rotate-ps-rgb24-ref.png | Bin 7156 -> 0 bytes + test/trap-clip-ps-argb32-ref.png | Bin 5715 -> 5591 bytes + test/trap-clip-ps-rgb24-ref.png | Bin 5630 -> 5512 bytes + 44 files changed, 0 insertions(+), 0 deletions(-) + +commit 8d2d4130146d16676c9ed6cf7d82d6aeaadf1c56 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 05:11:53 2008 -0800 + + Expand the documentation of cairo/test/README + + Add notes on CAIRO_REF_DIR and the version requirements of + poppler and ghostscript necessary for getting no failures. + + test/README | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 87 insertions(+), 12 deletions(-) + +commit 4d42f569007f23e4cf9713c14f8c3dc640cf0f2c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 04:22:58 2008 -0800 + + Update ps-specific reference images + + Presumably these are due to ghostscript version churn. I don't + know what version was used in the past, but we're going to be + more careful about documenting versions now. + + The ghostscript package I used here advertises itself as "8.61" + and "gs --version" reports 8.15.3. + + test/ft-text-vertical-layout-type1-ps-argb32-ref.png | Bin 1879 -> 0 bytes + test/ft-text-vertical-layout-type1-ps-ref.png | Bin 0 -> 1894 bytes + test/ft-text-vertical-layout-type3-ps-argb32-ref.png | Bin 1882 -> 0 bytes + test/ft-text-vertical-layout-type3-ps-ref.png | Bin 0 -> 1879 bytes + test/text-pattern-ps-rgb24-ref.png | Bin 969 -> 969 bytes + 5 files changed, 0 insertions(+), 0 deletions(-) + +commit 78b270601ce54545a0c68075a60a3b85a2f37adb +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 03:49:16 2008 -0800 + + Add poppler-specific reference image for source-clip-scale + + This one doesn't have any associated poppler bug report. The + rendering by poppler is totally reasonable, and not problematic + at all with respect to what the test is actually testing for. + + test/source-clip-scale-pdf-ref.png | Bin 0 -> 113 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 64b7489a50808bd660a47615d0775842c77dd0f2 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 03:47:34 2008 -0800 + + Add poppler-specific reference image for push-group + + This is justified by the following new bug report: + + Incorrect clipping of group object (regression?) + https://bugs.freedesktop.org/show_bug.cgi?id=14580 + + test/README | 5 +++++ + test/push-group-pdf-ref.png | Bin 0 -> 2694 bytes + test/push-group-pdf-rgb24-ref.png | Bin 0 -> 2611 bytes + 3 files changed, 5 insertions(+) + +commit 7aaa3e67c5016357e28476b10d768101e1e5bd41 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 03:38:07 2008 -0800 + + Add poppler-specific reference images for tests needing EXTEND_PAD + + This is justified by the following new bug report: + + Poppler should paint images with CAIRO_EXTEND_PAD + https://bugs.freedesktop.org/show_bug.cgi?id=14578 + + The four affected tests are: + + paint-source-alpha + paint-with-alpha + rotate-image-surface-paint + scale-source-surface-paint + + test/README | 9 +++++++-- + test/paint-source-alpha-pdf-ref.png | Bin 0 -> 473 bytes + test/paint-with-alpha-pdf-ref.png | Bin 0 -> 466 bytes + test/rotate-image-surface-paint-pdf-rgb24-ref.png | Bin 0 -> 207 bytes + test/scale-source-surface-paint-pdf-rgb24-ref.png | Bin 0 -> 198 bytes + 5 files changed, 7 insertions(+), 2 deletions(-) + +commit fdd046edccf283bfedb59733516f6110cc96ea82 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 03:23:38 2008 -0800 + + Add poppler-specific reference image for text-pattern + + This is justified with the following new bug report: + + Poppler renders patterned text as black + https://bugs.freedesktop.org/show_bug.cgi?id=14577 + + test/README | 6 ++++++ + test/text-pattern-pdf-argb32-ref.png | Bin 0 -> 1823 bytes + test/text-pattern-pdf-rgb24-ref.png | Bin 0 -> 508 bytes + 3 files changed, 6 insertions(+) + +commit 43302f0408d92138ac12afcd855d44c430074859 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 03:15:17 2008 -0800 + + Re-enable pdf tests with gradients and add poppler-based reference images + + This freezes the current (buggy) poppler result in the test suite + so that we will notice any future regressions. + + boilerplate/cairo-boilerplate-pdf.c | 42 --------------------- + test/README | 47 ++++++++++++++++++++++++ + test/gradient-alpha-pdf-argb32-ref.png | Bin 0 -> 126 bytes + test/gradient-alpha-pdf-rgb24-ref.png | Bin 0 -> 121 bytes + test/gradient-alpha.c | 3 +- + test/linear-gradient-pdf-ref.png | Bin 0 -> 935 bytes + test/linear-gradient-reflect-pdf-argb32-ref.png | Bin 0 -> 248 bytes + test/linear-gradient-reflect-pdf-rgb24-ref.png | Bin 0 -> 248 bytes + test/linear-gradient.c | 3 +- + test/text-pattern.c | 3 +- + test/trap-clip-pdf-argb32-ref.png | Bin 0 -> 5809 bytes + test/trap-clip-pdf-rgb24-ref.png | Bin 0 -> 5768 bytes + test/trap-clip.c | 3 +- + 13 files changed, 51 insertions(+), 50 deletions(-) + +commit 635fed77676f2446cbedfcf52a85f96e32c3a241 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 02:24:28 2008 -0800 + + Re-enable some pdf tests now that poppler has knockout support + + We had several pdf tests disabled waiting for this bug fix: + + Poppler does not correctly handle knockout groups + https://bugs.freedesktop.org/show_bug.cgi?id=12185 + + That's in place for poppler now, so we're turning the tests + back on. Some of the affected tests now pass perfectly: + + over-above-source + over-around-source + over-below-source + over-between-source + + Some just needed new reference images: + + operator-clear + clip-operator-pdf-argb32 + + The remaining tests still fail, but none of the failures can + obviously be ascribed to just poppler problems: + + clip-operator-pdf-rgb24 + operator-source + unbounded-operator + + The first two have some serious problems, while in the case + of unbounded-operator the problem is extremely minor (a white + grid appears in the background where the reference image is + all black). + + boilerplate/cairo-boilerplate-pdf.c | 13 ------------- + test/clip-operator-pdf-argb32-ref.png | Bin 0 -> 9096 bytes + test/operator-clear-pdf-argb32-ref.png | Bin 0 -> 1438 bytes + test/operator-clear-pdf-rgb24-ref.png | Bin 0 -> 1170 bytes + 4 files changed, 13 deletions(-) + +commit 98189d860e2c4219f994dd19fb199fcf4b457852 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 01:43:51 2008 -0800 + + svg: Add support for flattening SOURCE painting when there's nothing beneath it + + This avoids unnecessary rasterization in many cases when using + cairo_surface_create_similar with an SVG surface. Because of that + it eliminates test-suite failures for the -similar cases where we + have svg-specific reference images. Namely: + + font-matrix-translation, ft-text-vertical-layout-type1, + ft-text-vertical-layout-type3, mask, meta-surface-pattern, + paint-source-alpha, paint-with-alpha, rotate-image-surface-paint, + scale-source-surface-paint, source-clip-scale, text-pattern, + text-rotate + + In all of these cases the test suite was kindly noticing that we + weren't getting the same 'native' SVG output that was desired. + + src/cairo-svg-surface.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit e7c6e291a64391004ae7bafc4d69830af5b0c8b1 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 01:43:22 2008 -0800 + + Add svg-specific reference images for meta-surface-pattern test + + test/meta-surface-pattern-svg-argb32-ref.png | Bin 0 -> 3896 bytes + test/meta-surface-pattern-svg-rgb24-ref.png | Bin 0 -> 4593 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit a1867412210db667a02e7b656729e2cf6a64a2d7 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 20 01:38:59 2008 -0800 + + cairo-svg: Make operation_supported depend on analyze_operation instead of the other way around. + + This prepares for analyze_operation to be able to return more than + just two values, (which will allow the svg backend to take advantage + of CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY). + + src/cairo-svg-surface.c | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +commit 8f11c4583f58f97c348aafcd71db059ac7791fe7 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Feb 18 17:32:35 2008 -0800 + + Revert "[meta-surface] Adjust tolerance when replaying to surfaces with device scale" + + This reverts commit 7f21bfb0a8265095d68bb5ff6afae7553683a776. + + We don't yet have consensus on whether this is a good change or not. + So for now, we're favoring the existing behavior until we can work + that out. + + src/cairo-meta-surface.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit 1747718406b3450bc8869f0e050f9a18b3036030 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 14 12:27:47 2008 -0800 + + Add a spline to the degenerate-pen test case + + This was triggering an infinite loop (with 24.8 fixed-point) just before + the previous fix. + + NOTE: I usually put bug demonstrations just before the fixes, but this + one was quite harsh---not only was cairo looping infinitely, but it + was appending to an array on each iteration---so not kind at all. + + test/degenerate-pen-ps-argb32-ref.png | Bin 374 -> 771 bytes + test/degenerate-pen-ref.png | Bin 278 -> 788 bytes + test/degenerate-pen.c | 3 +++ + 3 files changed, 3 insertions(+) + +commit d6d81c92b501b32be6c48d134683ebd51f63c134 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 16 13:27:02 2008 -0800 + + Eliminate a potential infinite loop in spline stroking + + Sometimes > rather than >= can make a bug difference. The infinite loop + was noticed here: + + Infinite loop when scaling very small values using 24.8 + http://bugs.freedesktop.org/show_bug.cgi?id=14280 + + Note that that particular test case only exposes the infinite + loop when using 24.8 instead of 16.16 fixed-point values by + setting CAIRO_FIXED_FRAC_BITS to 8. + + src/cairo-pen.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 770b058c9e53c6d0e3a3f600cd5a9631eee39dff +Author: Carl Worth <cworth@cworth.org> +Date: Sat Feb 16 13:17:49 2008 -0800 + + Remove _cairo_slope_[counter_]clockwise + + These two functions were hiding away some important details + about strictness of inequalities. Also, the callers differ + on the strictness they need. Everything is cleaner and more + flexible by making the callers just call _cairo_slope_compare + directly. + + src/cairo-path-stroke.c | 2 +- + src/cairo-pen.c | 30 ++++++++++++++++-------------- + src/cairo-slope.c | 23 ----------------------- + src/cairoint.h | 6 ------ + 4 files changed, 17 insertions(+), 44 deletions(-) + +commit 2d22d698d32575fd883d2be072c041709254c86d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Feb 14 11:50:26 2008 -0800 + + Make _cairo_slope_compare return a non-zero result for slopes that differ by pi + + This was an initial attempt to fix the infinite loop bug + described here: + + Infinite loop when scaling very small values using 24.8 + http://bugs.freedesktop.org/show_bug.cgi?id=14280 + + This doesn't actually fix that bug, but having a more robust + comparison function can only be a good thing. + + src/cairo-slope.c | 30 ++++++++++++++++++++++++++++-- + 1 file changed, 28 insertions(+), 2 deletions(-) + +commit 9292c0a1b509ecea8415cdbc21415d9ce7615e04 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 20 10:54:14 2008 +0000 + + [gitignore] Ignore cairo-no-features.h + + Add the autogenerated header to the ignore list. + + src/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit e6a8768a0446b9e537bb77bd309ad5719fe74451 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 20 10:53:15 2008 +0000 + + [cairo-scaled-font-subsets] Fix memleak on failure to reserve .notdef glyph. + + Remember to destroy the sub_font if we fail to reserve the .notdef glyph + during construction. + + Whilst in the vicinity, adjust the function prototype to remove + duplicated calls to _cairo_error(). + + src/cairo-scaled-font-subsets.c | 57 ++++++++++++++++++++++------------------- + 1 file changed, 30 insertions(+), 27 deletions(-) + +commit e208f31236af6b2012d725696485f96fe4acd863 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 19 15:14:37 2008 +0000 + + [cairo-surface] Check surface status on internal paths as well. + + Return any error status on the surface to the caller. + + src/cairo-surface.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 49 insertions(+), 1 deletion(-) + +commit 1d59daecfe1078ba2ad56f80b35c934312dc4f6b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 19 15:13:53 2008 +0000 + + [cairo-pdf-operators] Cleanup word_wrap_stream + + Ensure that the stream is destroyed on the error paths. + + src/cairo-pdf-operators.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit aac5650beebb40068767a7d3ffedf634a3da5002 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 19 14:39:13 2008 +0000 + + [pdf-operators] Missing private markup. + + Fixup make check by adding the required cairo_private markup. + + src/cairo-pdf-operators-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eaaa1415a9becb8f11ddde4094fcf0aec6d1458f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 20 21:05:23 2008 +1030 + + Change PDF newline characters from \r\n to \n + + The PDF backend has always used "\r\n" for the newline character. + There was no particular reason for this choice. PDF allows "\n", "\r", + or "\r\n" as the end of line marker. + + Since the PS backend (which uses "\n") has started sharing + cairo-pdf-operators.c with the PDF backend, the PS output has been + getting mixed "\n" and "\r\n" newlines. + + Fix this by changing the PDF backend to use "\n". + + src/cairo-pdf-operators.c | 40 +-- + src/cairo-pdf-surface.c | 878 +++++++++++++++++++++++----------------------- + 2 files changed, 459 insertions(+), 459 deletions(-) + +commit 24c319fbae9ea4a43bf4e1fdf94d069b4ad78904 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Sat Feb 16 09:22:01 2008 +0100 + + [perf] add tests for magnified and minified image sources. + With this change, cairo's performance testsuite will catch performance + regressions in pixman's fbFetchTransformed path. + + perf/cairo-perf-cover.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit 21049a9a5eb7ba0873771428bde0db8f8b1ece08 +Author: Antoine Azar <cairo@antoineazar.com> +Date: Mon Feb 18 23:57:38 2008 -0500 + + Added cairo-misc.c to makefile + + src/Makefile.win32 | 1 + + 1 file changed, 1 insertion(+) + +commit f2d21e73827d81da559ee4cd046bfb02dfd66a83 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 18 17:18:51 2008 -0800 + + [stroker] fix _compute_normalized_device_slope to return correct sign + + The optimization to avoid sqrt() for horizontal/vertical lines in + _compute_normalized_device_slope was causing us to return a negative + magnitude with a positive slope for left-to-right and bottom-to-top + lines, instead of always returning a positive magnitude and a slope + with an appropriate sign. + + src/cairo-path-stroke.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 8fb624dbf2c660fbbf6d6964f7876656e1b62e41 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 17 19:49:39 2008 +1030 + + Use correct prefix for _cairo_pdf_operators_stroke + + s/operator/operators/ + + src/cairo-pdf-operators-private.h | 10 +++++----- + src/cairo-pdf-operators.c | 10 +++++----- + src/cairo-pdf-surface.c | 20 ++++++++++---------- + src/cairo-ps-surface.c | 10 +++++----- + 4 files changed, 25 insertions(+), 25 deletions(-) + +commit d2a1576941e46fb71eda8b27bd3df4de691df6ff +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 17 19:48:01 2008 +1030 + + PDF/PS: Fix mismatched save restore when using fill-stroke + + src/cairo-pdf-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 3a05b5d2d5989386e1500ffcf8738ca89ef8457d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 17 19:45:45 2008 +1030 + + PDF/PS: No need to use save/restore for solid colors + + src/cairo-pdf-surface-private.h | 1 + + src/cairo-pdf-surface.c | 7 +++++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit c7204adcf3ff6614aae75c4c1c5ef0fc5269d834 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 17 02:32:00 2008 -0500 + + [cairo-misc.c] Add misc functions to this file + + Anything functions that doesn't group with other functions enough to + justify its own file should go here now. + + src/Makefile.am | 1 + + src/cairo-gstate.c | 79 ----------- + src/cairo-misc.c | 407 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 287 ------------------------------------- + 4 files changed, 408 insertions(+), 366 deletions(-) + +commit a1360322c4e2867d7060a7f65bf0d96d9af36174 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 17 17:16:53 2008 +1030 + + PS: Remove unused code + + src/cairo-ps-surface.c | 9 --------- + 1 file changed, 9 deletions(-) + +commit 2dfe32a0ff9272ade481796f0f25fd83863c7600 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 17 16:45:15 2008 +1030 + + Implement PDF fill-stroke + + src/cairo-meta-surface.c | 15 ++++++- + src/cairo-pdf-operators-private.h | 8 ++++ + src/cairo-pdf-operators.c | 51 +++++++++++++++++++++- + src/cairo-pdf-surface.c | 92 +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 164 insertions(+), 2 deletions(-) + +commit 1e7fa4b9f5c478bcb7c49667192f239c2bd1d03e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 16 22:47:31 2008 -0500 + + [cairo-pdf-operators] Pass matrix by reference, not by value + + src/cairo-pdf-operators-private.h | 4 ++-- + src/cairo-pdf-operators.c | 8 ++++---- + src/cairo-pdf-surface.c | 12 ++++++------ + src/cairo-ps-surface.c | 9 +++++---- + 4 files changed, 17 insertions(+), 16 deletions(-) + +commit 357f2334f0bd518815c80905e451b6ac1ba43553 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 16 20:37:16 2008 +1030 + + PDF: Allow word_wrap_stream to split hex strings + + src/cairo-pdf-operators.c | 50 +++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 44 insertions(+), 6 deletions(-) + +commit 204a27aadb2390b62bd75857d8736b34870f79b1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 16 20:35:42 2008 +1030 + + PDF: Word wrap _cairo_pdf_operators_show_glyphs output + + src/cairo-pdf-operators.c | 38 ++++++++++++++++++++++++-------------- + 1 file changed, 24 insertions(+), 14 deletions(-) + +commit bcb0395288128da7dd8f24c503b8badacc806720 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 15 15:56:29 2008 -0500 + + [docs] Fix typo + + src/cairo-font-options.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 536e1963b774038d9afc7fbf63303e118b0250a2 +Author: Shailendra Jain <shailen.n.jain@gmail.com> +Date: Fri Feb 15 13:21:29 2008 +0000 + + Compile fix for AIX. + + Minor correction for a build failure on AIX: + "mozilla/gfx/cairo/cairo/src/cairo-gstate.c", line 45.43: 1506-294 (S) + Syntax error in expression on #if directive. + + (Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=415867.) + + src/cairo-gstate.c | 2 +- + src/cairo-matrix.c | 2 +- + test/invalid-matrix.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 31a67c5f22eb2cbb94878d47be19b32ff319c5b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 15 13:16:58 2008 +0000 + + [pdf] Minor make check fix. + + Add a missing '%' in the documentation. + + src/cairo-pdf-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9e9fda047879f0336c2627483c78499af8ef5458 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Feb 12 11:16:37 2008 +0000 + + [test/bitmap-font] Destroy the font options after use. + + Fix the leak of the font options. + + test/bitmap-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 92970ec83687435e75e60110cb7434670515ae57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 17:00:30 2008 +0000 + + [test/invalid-matrix] Test detection of infinities. + + Feed infinities into the API and check that we correctly return + INVALID_MATRIX. + + test/invalid-matrix.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 122 insertions(+), 1 deletion(-) + +commit 012f68e043d3594fa6cb5235eafb1ca1bfe2d099 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 16:48:24 2008 +0000 + + [test/invalid-matrix] Check scale(0,0) + + Test that INVALID_MATRIX is returned if the user calls cairo_scale(0,0) + or a variant thereof. + + test/invalid-matrix.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit eb7488e1e67b872d29d1bd459bb7994ad3789576 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 16:45:18 2008 +0000 + + [test/invalid-matrix] Promote incorrect status warning to an error. + + As the last warning for an incorrect status has been resolved, throw an + error if we regress and no longer report an INVALID_MATRIX under testing. + + test/invalid-matrix.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fc732c3aaa53d8abcea46ad28da696ad08d09b63 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 16:17:34 2008 +0000 + + [cairo-scaled-font] Create error objects on demand. + + In order to correctly report the error back to the user during the + creation of a scaled font, we need to support a nil object per error. + Instead of statically allocating all possible errors, lazily allocate + the nil object the first time we need to report a particular error. + + This fixes the misreporting of an INVALID_MATRIX or NULL_POINTER that + are common user errors during the construction of a scaled font. + + src/cairo-debug.c | 2 ++ + src/cairo-mutex-list-private.h | 1 + + src/cairo-scaled-font.c | 65 +++++++++++++++++++++++++++++++++++++----- + src/cairo.c | 10 ++----- + src/cairo.h | 2 +- + src/cairoint.h | 15 +++++++++- + test/font-options.c | 2 +- + 7 files changed, 79 insertions(+), 18 deletions(-) + +commit 38fcc015a5106e5007035c22355da863b3bc9def +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 16:14:40 2008 +0000 + + [cairo-ft-font] Propagate error detected during determination of scale factors. + + Ensure that if an invalid matrix is detected when creating the toy font, + the error is propagated to the caller. + + src/cairo-ft-font.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit ad265cc9f26a20f2336747d69b28bc6ca0d91f4b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 14:58:21 2008 +0000 + + [cairo-font-options] Disallow use of NULL font-options. + + Partial revert of commit 0086db893cba90dc73824d77c661d2965ad48112. + + This is a follow to the earlier commit that allowed creation of scaled + fonts using a NULL font options (by interpreting the NULL as meaning + use the default options) to reflect the comments made by Behdad + (http://lists.cairographics.org/archives/cairo/2008-January/012714.html). + + The intent is that the public font options getter/setter API has similar + defensive behaviour to that of the core objects - i.e. do not overwrite + the nil object and if the object is in error then return the default + value. For the indirect use of a NULL/nil font options (e.g. creation of + scaled fonts), then an error should be returned rather than crashing. + + src/cairo-font-face.c | 8 +++----- + src/cairo-font-options.c | 36 +++++++++++++--------------------- + src/cairo-ft-font.c | 8 +++----- + src/cairo-scaled-font.c | 13 ++++-------- + src/cairo-win32-font.c | 4 ++-- + src/cairo.c | 10 ++++------ + test/font-options.c | 51 +++++++++++++++++++++++++++--------------------- + 7 files changed, 59 insertions(+), 71 deletions(-) + +commit 790eaef71cbd30e1994c9499ab553f2ef5e5d620 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Feb 11 10:31:33 2008 +0000 + + [boilerplage] Add getopts to the boilerplate library. + + Remember to compile the _cairo_getopts() function into the boilerplate + convenience library for cairo-perf. + + boilerplate/Makefile.am | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit fe93038ef343c769b38b9e7f15c1be415e6bcdd9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Feb 8 08:36:34 2008 +0000 + + [test/font-options] Check for HAVE_FCFINI + + Only pull in the fontconfig headers if we actually use FcFini(). + + test/font-options.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2eb03b8cf2b2c0520d018127b377071a8a63799d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 7 17:07:43 2008 +0000 + + [cairo-ps-surface] Tidy return from _analyze_image_transparency(). + + _analyze_image_transparency() only returned SUCCESS, so use the return + parameter to pass back the transparency type instead of using an out + parameter. + + src/cairo-ps-surface.c | 37 +++++++++++++------------------------ + 1 file changed, 13 insertions(+), 24 deletions(-) + +commit bc83e028b8d12223164263a9f9cfc822ed40f8c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 7 11:47:11 2008 +0000 + + [cairo-output-stream] Add format(printf) markup. + + Add CAIRO_PRINTF_FORMAT attribute to the printf-esque output stream + functions, and fixup the one warning caught by the compiler. + + src/cairo-output-stream-private.h | 6 ++++-- + src/cairo-pdf-surface.c | 4 ++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit 4430157841d4b55061c6af58576cfe6ec66fcfe5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Feb 6 11:37:13 2008 +0000 + + [test] Summarise the tests failures per backend. + + After the summary, show the total number of failures per backend. + + test/Makefile.am | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit af88d4d9ae66152ac885531bfc73a47eb78d1d03 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 30 15:20:50 2008 +0000 + + [test/a8-mask] Fix memleak. + + Destroy the auxiallary surfaces and contexts. + + test/a8-mask.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit a3f071aee707e66e637587f1e9ae327b21243a60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 30 15:19:49 2008 +0000 + + [cairo-ft-font] Tidy usage of cairo_error(). + + Remove a redundant use of cairo_error(NO_MEMORY). + + src/cairo-ft-font.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit a4c960a93cf5f37819b933d19f92e17e6c047c66 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 18 17:14:17 2008 +0000 + + [test] Add tests using each backend as a source. + + Inspired by bug 7362 (painting a glitz surface onto an xlib surface + crashes cairo) and the lack of coverage for + _cairo_paginated_surface_acquire_source_image(), these tests attempt + to use each backend as a source surface for all the other backends. + For example, this checks that one can construct a PS file ready for + printing and then copy that surface to an image/xlib for previewing. + + test/.gitignore | 6 ++ + test/Makefile.am | 19 +++- + test/glitz-surface-source-ref.png | Bin 0 -> 268 bytes + test/glitz-surface-source.c | 196 ++++++++++++++++++++++++++++++++++++++ + test/image-surface-source-ref.png | Bin 0 -> 268 bytes + test/image-surface-source.c | 35 +++++++ + test/pdf-surface-source-ref.png | Bin 0 -> 268 bytes + test/pdf-surface-source.c | 41 ++++++++ + test/ps-surface-source-ref.png | Bin 0 -> 268 bytes + test/ps-surface-source.c | 41 ++++++++ + test/surface-source.c | 93 ++++++++++++++++++ + test/svg-surface-source-ref.png | Bin 0 -> 268 bytes + test/svg-surface-source.c | 41 ++++++++ + test/xlib-surface-source-ref.png | Bin 0 -> 268 bytes + test/xlib-surface-source.c | 76 +++++++++++++++ + 15 files changed, 544 insertions(+), 4 deletions(-) + +commit f59f22eecba7cbf2151e01533ba936ca94d25056 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 29 09:29:10 2008 +0000 + + [check] Only build documents during make check if we have GTK_DOC + + Check that gtk-doc has been enabled before running attempting to build + the docs during make check. + + doc/public/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit e5f0253b67801ad79eb881e189b9835aea0fcf57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 29 09:07:14 2008 +0000 + + [cairo-surface] Hide the compiler warnings. + + Assign the return value from _cairo_surface_set_error() to hide the + compiler warnings. + + src/cairo-surface.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +commit 53c1ed25abb7e8e22b24aa64fcd29d210c6b7903 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 29 08:52:28 2008 +0000 + + [test/a1-sample-image] Fix the memleak. + + Destroy the surface after use. + + test/a1-image-sample.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5efc88e9108df2331772cc22dc52ef0a9cc93869 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 29 08:50:25 2008 +0000 + + [xmalloc] Hide valgrind warning. + + Allocate the string to the next integer boundary to hide a valgrind + warning. + + boilerplate/xmalloc.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +commit 1faf208093a8cce77d2f7d6b248bc1eb1bd19a8a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 18 14:41:03 2008 +0000 + + [cairo-png] Improve error return for invalid parameters. + + Only translate an UNSUPPORTED error into a SURFACE_TYPE_MISMATCH, all + others can be returned to the user unadulterated. + + PNG doesn't support width==0 or height==0 and generates an error + whilst writing - which without further information is assumed to be + a NO_MEMORY error. So check the image size at the start and return a + WRITE_ERROR for a zero sized image. + + src/cairo-png.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +commit d0cc1d929119d2e05578a60af3b873af1d7f6b13 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 18 14:34:41 2008 +0000 + + [cairo-pdf-surface] Minor code tidy. + + Remove code duplication. + + src/cairo-pdf-surface.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit d7ce0582f1eb86b2af5964820378b75297822dd1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 23:18:46 2008 +0000 + + [test/font-options] Check the defaults values. + + Exercise the getters by checking that a fresh cairo_font_options_t has + the default values. + + test/font-options.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +commit f40f24e272cf05a7a727217ae7a35844bf95f5d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 23:05:53 2008 +0000 + + [test/invalid] Test cairo_translate() and friends for NaN safety. + + Pass NaNs to cairo_translate() and friends and check that they raise + an INVALID_MATRIX error. + + test/invalid-matrix.c | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit 896da0305a09e53518d6d1af6f58bbfaf3ddc89c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 15 23:54:55 2008 +1030 + + Win32-printing: Fix meta surface patterns + + Ensure the win32-printing surface has the same fixes for meta surface + patterns with more than one level of push/pop group that PS/PDF + received in 060f384310e887f7f431a98e847b8a36fc303a0c + + src/cairo-win32-printing-surface.c | 28 ++++++++++++++++------------ + 1 file changed, 16 insertions(+), 12 deletions(-) + +commit fbde0fb872a3af78236f4cbc8024d4df245de9c8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Feb 15 08:17:25 2008 +1030 + + Update PS ref images + + test/degenerate-pen-ps-argb32-ref.png | Bin 390 -> 374 bytes + test/extend-reflect-ps-ref.png | Bin 0 -> 153322 bytes + test/extend-reflect-similar-ps-ref.png | Bin 0 -> 153322 bytes + test/glyph-cache-pressure-ps-ref.png | Bin 0 -> 1667 bytes + test/meta-surface-pattern-ps-argb32-ref.png | Bin 0 -> 3246 bytes + test/meta-surface-pattern-ps-rgb24-ref.png | Bin 0 -> 3823 bytes + test/random-intersections-ps-argb32-ref.png | Bin 89416 -> 89733 bytes + test/random-intersections-ps-rgb24-ref.png | Bin 89414 -> 89733 bytes + test/select-font-face-ps-ref.png | Bin 0 -> 1352 bytes + test/show-text-current-point-ps-ref.png | Bin 0 -> 1475 bytes + test/text-pattern-ps-argb32-ref.png | Bin 997 -> 998 bytes + test/text-rotate-ps-argb32-ref.png | Bin 7198 -> 7156 bytes + test/text-rotate-ps-rgb24-ref.png | Bin 7196 -> 7156 bytes + test/trap-clip-ps-argb32-ref.png | Bin 5700 -> 5715 bytes + test/trap-clip-ps-rgb24-ref.png | Bin 5616 -> 5630 bytes + 15 files changed, 0 insertions(+), 0 deletions(-) + +commit 40d5082c24819968a5ee5a8f72e3b9cd61cb6105 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 10 14:53:17 2008 +1030 + + PS: Use currentfile as the image data source + + When the emitted image is not inside a PS procedure we can use the + currentfile operator as the datasource instead of an array of strings. + This avoids having to read to entire image data into printer memory + before the image can be decoded. This improves the performance and + reduces the chance of running out of memory on printers with limited + memory. + + src/cairo-ps-surface-private.h | 1 + + src/cairo-ps-surface.c | 268 +++++++++++++++++++++++++---------------- + 2 files changed, 168 insertions(+), 101 deletions(-) + +commit fe334bb476bb1d7496b197b47ac60167e3fb10bd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 10 14:52:39 2008 +1030 + + PS: Use InterleaveType 2 for image and mask + + To be able to use the currentfile operator we need to combine the + image data and mask data into the one data source. InterleaveType 2 + scan line interleaves the image and data. + + src/cairo-ps-surface.c | 129 ++++++++++++++++++------------------------------- + 1 file changed, 47 insertions(+), 82 deletions(-) + +commit b053aaba80e1118ddd7f9c695f6491458f4f5794 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 5 22:46:01 2008 +1030 + + PS: Don't use patterns for fill surface extend none + + _ps_surface_fill() can also avoid using PS patterns for EXTEND_NONE + surface patterns. A clip path is set around the fill path then the + surface is painted. + + src/cairo-ps-surface.c | 38 ++++++++++++++++++++++++++++++-------- + 1 file changed, 30 insertions(+), 8 deletions(-) + +commit 2324a48c95d88ae0b6a066bfc9b6722f42945efa +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 5 22:35:06 2008 +1030 + + Update rotate-image-surface-paint ps ref image + + test/rotate-image-surface-paint-ps-argb32-ref.png | Bin 276 -> 0 bytes + test/rotate-image-surface-paint-ps-ref.png | Bin 0 -> 275 bytes + test/rotate-image-surface-paint-ps-rgb24-ref.png | Bin 274 -> 0 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 67374af22fe60c27517dd3bef2c8f3cc2f683b12 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 5 22:31:58 2008 +1030 + + PS: Don't use patterns for paint surface extend none + + This is the first of four patches intended to fix the bug reported in + + http://lists.cairographics.org/archives/cairo/2007-December/012226.html + + Previously the PS backend would draw all cairo patterns (except solid + colors) by emitting a PS pattern. As PS does not support non repeating + patterns, the PS backend would set a large repeat step to ensure that + only one copy of the pattern is on the page. + + Some printers with limited memory are unable to print large images + inside a pattern. This was probably because when using patterns the + printer tries to keep the uncompressed image in memory so it can tile + the pattern. + + When painting surface patterns with the extend mode EXTEND_NONE we do + not need to use PS patterns. The image or meta surface commands can be + emitted directly. + + src/cairo-ps-surface-private.h | 2 + + src/cairo-ps-surface.c | 234 ++++++++++++++++++++++++++++------------- + 2 files changed, 162 insertions(+), 74 deletions(-) + +commit 6f9d71c10bf3e38c88378950037d1c81a2413617 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Feb 7 00:28:19 2008 +1030 + + Make PS backend use cairo-pdf-operators.c + + Changes include: + - Replace PS prolog with new prolog that emulates PDF operators + - Remove the [1 0 0 -1 0 height] ctm on each page. PS and PDF surfaces + now both transform all output to PS/PDF coordinates. + - Invert images to match PDF images where (0,0) is top left + - emit_surface_pattern now uses the same transform as PDF + - move the special dash handling into cairo-pdf-operators.c + + src/cairo-pdf-operators.c | 82 ++++- + src/cairo-ps-surface-private.h | 4 + + src/cairo-ps-surface.c | 767 ++++++++--------------------------------- + 3 files changed, 219 insertions(+), 634 deletions(-) + +commit 49f755ed2d517adabcdbe9f3834ff18b220dfa7f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 30 20:42:28 2008 +1100 + + PS: Remove the Type 3 outline glyph code + + This code is never used because outline glyphs that go through the + fallback path are always embedded with Type 1 fallback. The only fonts + that are embedded as Type 3 are bitmap fonts. + + src/cairo-ps-surface.c | 54 +++++--------------------------------------------- + 1 file changed, 5 insertions(+), 49 deletions(-) + +commit 0c6a362122657d5c9804fa7f45c3404aef052688 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 30 20:38:17 2008 +1100 + + pdf-operators: only one path matrix is required + + The PDF emit path orginally had two matrix transforms in the path + struct. One for strokes and one for fill/clip. As only one transform + at a time is ever used this can be simplified. + + src/cairo-pdf-operators.c | 41 ++++++++--------------------------------- + 1 file changed, 8 insertions(+), 33 deletions(-) + +commit 5639643efe12bee4252e8cb433d343999e34ec32 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 30 20:16:08 2008 +1100 + + Add PS linecap path workarounds to pdf_operators + + So that pdf_operators can be used by the PS backend. PDF also needs + this workaround. + + src/cairo-pdf-operators.c | 123 ++++++++++++++++++++++++++++++++-------------- + 1 file changed, 86 insertions(+), 37 deletions(-) + +commit 0987fdee24d60573249a7fa3acc15e67454bd8b3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 30 17:22:52 2008 +1100 + + Add word_wrap stream to pdf-operators + + The word_wrap stream in ps-surface will be removed in a later commit. + + src/cairo-pdf-operators.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 114 insertions(+) + +commit d05f08bceebe832844ab97a5660af4fa1452697d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 12 15:44:21 2008 -0500 + + [configure.in] Make PS/PDF/SVG default enabled + + Previously they were default auto-detected. We really want people + have to go out of their way to not build them, hence the change. + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit fd3181c7bfdb468557d8c845a016b19c5a897955 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 12 20:22:38 2008 +1030 + + PDF: Remove stale comments + + src/cairo-pdf-surface.c | 23 ----------------------- + 1 file changed, 23 deletions(-) + +commit bdb857a78b41d926b1c239cf988539842a72130b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 12 20:19:03 2008 +1030 + + PDF: Fix uninitialized variable in previous commit + + src/cairo-pdf-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit ba6788fc968477cfae6ed76414dd91b21671d028 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Mon Feb 11 13:44:48 2008 -0500 + + [pdf] Use compressed PDF stream instead of compress_dup() + + The deflate stream has bounded (constant) memory overhead, whereas + compress_dup() allocates memory proportional to the uncompressed data. + + This replaces compress_dup() usage with a compressed PDF stream for + emitting images, alpha masks and font subsets, and eliminates the + compress_dup() function. + + src/cairo-pdf-surface.c | 204 +++++++++++++----------------------------------- + 1 file changed, 55 insertions(+), 149 deletions(-) + +commit e68584d3a16da7db30bc53a42fa8367c8356bd7e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 8 17:36:59 2008 -0500 + + [xlib] Move multiple CAIRO_MUTEX_INITIALIZE into one place they all end up anyway + + src/cairo-xlib-surface.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 0626cac6dba91d0ee20458858275745b7c6a1bfd +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Fri Feb 8 15:09:19 2008 +0100 + + [os2] fix typo in comment + + src/cairo-os2-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b4fe25d9afff5d5b0ebaa315ad0e42f36853d5d1 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Fri Feb 8 15:04:49 2008 +0100 + + [os2] only call FcInit/Fini when compiled with FT font backend + + src/cairo-os2-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 5e9cdcca00a490f3a36b4229f5353d795ca53a5d +Author: Antoine Azar <cairo@antoineazar.com> +Date: Thu Feb 7 17:09:41 2008 -0500 + + Fixed rounding function call + + test/get-path-extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 80e11a85a95c5f2c814eef90a8e6ab60c8835104 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Feb 7 14:36:39 2008 -0800 + + [pdf] restore alpha_size back to correct bit size + + src/cairo-pdf-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 95db215cc15d228fcb38bc43d2d918fccec0a9cd +Author: Azar@.(none) <Azar@.(none)> +Date: Fri Feb 1 18:45:59 2008 -0800 + + Some fixes and improvements to the Win32 build + + Makefile.win32 | 32 ++++- + boilerplate/Makefile.win32 | 25 +++- + boilerplate/cairo-boilerplate-getopt.c | 250 +++++++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate-getopt.h | 63 +++++++++ + boilerplate/cairo-boilerplate.h | 4 + + perf/Makefile.win32 | 54 ++++++- + perf/cairo-perf.c | 7 +- + perf/cairo-perf.h | 2 +- + perf/world-map.c | 2 + + src/Makefile.win32 | 36 +++-- + test/Makefile.win32 | 25 +++- + test/font-matrix-translation.c | 2 +- + test/pdiff/Makefile.win32 | 3 + + 13 files changed, 470 insertions(+), 35 deletions(-) + +commit 7800cfd7de347bb8c54fc36ed886018a2d9ec503 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Feb 6 17:00:29 2008 -0800 + + Add several Makefile.win32 files to EXTRA_DIST + + Otherwise, these files were being omitted from the tar files. + + Makefile.am | 2 ++ + boilerplate/Makefile.am | 2 ++ + perf/Makefile.am | 2 ++ + src/Makefile.am | 2 ++ + test/Makefile.am | 2 ++ + 5 files changed, 10 insertions(+) + +commit ac743e25fa7f8bd720219a5c909fe8bbd20b11b2 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 31 16:13:44 2008 +1100 + + cairo_xlib_surface_create_similar: Pass the original drawable to XCreatePixmap + + Previously we were passing the root window of the same screen. + Letting the X server know the actual Drawable for which we're + trying to be similar allows the X server to be more efficient. + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cb9f9086a1c8ad312cfc5314fc8e352a6046d75e +Merge: c11b036 a9b0e54 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Thu Feb 7 00:07:20 2008 +0100 + + Merge branch 'master' of ssh://pmw@git.freedesktop.org/git/cairo + +commit c11b036b75f3c71ff57ff4578b388bf5e35b2057 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Thu Feb 7 00:03:33 2008 +0100 + + [os2] Improve documentation + + Move the API documentation for the OS/2 backend from the .h file to the .c file and use the correct format. + + src/cairo-os2-surface.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-os2.h | 115 --------------------------------------- + 2 files changed, 139 insertions(+), 115 deletions(-) + +commit a9b0e54d386811dc750b5e676a0dfd84c32f4625 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Feb 6 13:52:33 2008 -0800 + + Avoid buffer overflow in ps/pdf surface + + A few places weren't using _cairo_malloc_*; fixed. + + src/cairo-pdf-surface.c | 22 ++++++++++++++++------ + src/cairo-ps-surface.c | 4 ++-- + 2 files changed, 18 insertions(+), 8 deletions(-) + +commit bf1f7f70b61b5bb657b2531dab63c541ac8fb59d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Feb 6 13:01:52 2008 -0800 + + Do correct calculation of pen dimensions for stroke optimization + + src/cairo-path-stroke.c | 33 +++++++++++++-------------------- + src/cairo-rectangle.c | 2 +- + src/cairo-stroke-style.c | 17 +++++++++++++++++ + src/cairoint.h | 11 ++++++++++- + 4 files changed, 41 insertions(+), 22 deletions(-) + +commit e104fcab1c8c8d9a7a7962a1dbea0c87867c8f9a +Author: Alp Toker <alp@atoker.com> +Date: Thu Jan 31 01:33:50 2008 +0000 + + Introduce cairo_has_current_point() + + cairo_has_current_point() can be used to determine whether a current + point is defined. We introduce this new symbol with a boolean return + value to avoid the versioning ambiguity of modifying + cairo_get_current_point(). This way we also don't have to map what + should be a routine operation to an error condition as was previously + proposed. + + doc/public/cairo-sections.txt | 1 + + src/cairo.c | 25 +++++++++++++++++++++++-- + src/cairo.h | 3 +++ + 3 files changed, 27 insertions(+), 2 deletions(-) + +commit 1f0c3d06895ebcbfbae252e6b7298da0b64b37a9 +Author: Alp Toker <alp@atoker.com> +Date: Thu Jan 31 00:54:52 2008 +0000 + + Revert "Change cairo_get_current_point() to return cairo_status_t instead of void" + + This reverts commit b3eea75d1f7b56c2046b5387a5eb186d8f154184. + + Reverted in favour of an alternative approach. + + Conflicts: + + src/cairo.c + + src/cairo.c | 22 ++++------------------ + src/cairo.h | 2 +- + 2 files changed, 5 insertions(+), 19 deletions(-) + +commit 4c005f7ce385f3f8b161cffac11bb9766f4ef9a9 +Author: Azar@.(none) <Azar@.(none)> +Date: Fri Feb 1 14:29:24 2008 -0800 + + replaced round with _cairo_lround. Round doesn't compile on Win32 + + test/get-path-extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d93e148766ded8f3105277f944849f6297974fb +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 5 16:14:51 2008 -0800 + + Followup patch to dashed stroke optimization + + Make sure that we don't test lines that start or end inside the box, + since our algorithm will find intersections on the wrong ends on the + line, and not count them. + + src/cairo-rectangle.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 7b788ce7cace4fd24c568248c22b4ec6c88b563b +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 5 15:04:38 2008 -0800 + + Update test ref images that changed with stroking changes + + test/dash-scale-ref.png | Bin 7908 -> 8035 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 4471e58c12c20723f1ddac3d0284239be6eb27a8 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Feb 4 03:55:55 2008 -0800 + + Optimize dashed strokes, part 2 + + Pass down the bounding box to the stroker, and avoid doing expensive + calculations for dash segments that are outside the box. + + src/cairo-path-stroke.c | 122 ++++++++++++++++++++++++++++++++---------------- + src/cairo-rectangle.c | 94 +++++++++++++++++++++++++++++++++++++ + src/cairo-traps.c | 8 ++++ + src/cairoint.h | 10 ++++ + 4 files changed, 195 insertions(+), 39 deletions(-) + +commit afbd82671fe5ebebe5d58bef3d372312be1c5aeb +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Feb 2 23:48:16 2008 -0800 + + Optimize stroker by hoisting some calculations out of loops + + sqrt and a few other floating-point operations were being done + repeatedly within a loop; those are now precalculated and passed + down where needed. + + src/cairo-path-stroke.c | 142 +++++++++++++++++++++++++++++------------------- + 1 file changed, 87 insertions(+), 55 deletions(-) + +commit bda0baa255801dbc21b63b364eff32de98dd6c7f +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 5 15:04:15 2008 -0800 + + Fix text-zero-len on ATSUI to not infinite loop + + src/cairo-atsui-font.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 03256d0f2be15e7ba57bc041f8cdfc1c3e718660 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Feb 5 15:04:11 2008 -0800 + + Remove get-xrender-format from list of tests to be run on all platforms + + test/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 6140776b4e7d5787467606fbe8a961dbee6bd9fb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 5 00:22:26 2008 +1030 + + Update operator-source ps ref images + + test/operator-source-ps-argb32-ref.png | Bin 4053 -> 4026 bytes + test/operator-source-ps-rgb24-ref.png | Bin 2567 -> 3366 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit dee6e27537a26e93266c0a2d2071ad8d4ed2c9ee +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 5 00:12:48 2008 +1030 + + Add dash-curve ps ref image + + test/dash-curve-ps-ref.png | Bin 0 -> 27206 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 2b0da0503baba111085a23e5e5e5feb8788d6650 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Feb 5 00:02:17 2008 +1030 + + Ensure PS/PDF miter is >= 1.0 + + The PS Language Reference requires the PS miter to be >= 1. + + The PDF Reference does not specify miter limits however acroread fails + to display pages when the miter is < 1. Older versions of ghostscript + crash when the PDF miter is < 1. + + src/cairo-pdf-operators.c | 2 +- + src/cairo-ps-surface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 381fcf01d71d6c83183f9764507ebbafd783d18a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 20:05:41 2008 +1030 + + Update over-around-source ps ref image + + test/over-around-source-ps-argb32-ref.png | Bin 637 -> 632 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 9dda017af9bffeda59756cb3b15028ae83ed19ef +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 19:53:35 2008 +1030 + + Update gradient-alpha ps ref images + + test/gradient-alpha-ps-argb32-ref.png | Bin 187 -> 179 bytes + test/gradient-alpha-ps-rgb24-ref.png | Bin 184 -> 179 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 3f943a98f69b90b066217b19c47851ce03e50551 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 19:49:23 2008 +1030 + + Add linear-gradient-reflect ps ref image + + test/linear-gradient-reflect-ps-ref.png | Bin 0 -> 315 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a74e6692341daeff9ab266b3b29fcc8b8e917d88 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 19:34:53 2008 +1030 + + PS: Implement reflected surface patterns + + The image/meta-pattern is written once. A PS pattern twice the size of + the cairo pattern is created and the surface drawn four times in a + reflect pattern inside the PS pattern. + + This fixes the extend-reflect and extend-reflect-similar PS test + failures. + + src/cairo-ps-surface.c | 41 +++++++++++++++++++++++++++++++++-------- + 1 file changed, 33 insertions(+), 8 deletions(-) + +commit 7c5bc5fde819014f62ebb9bac86d4529f056956d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 18:58:02 2008 +1030 + + Add operator-clear ps ref image + + test/operator-clear-ps-argb32-ref.png | Bin 0 -> 1409 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 06b2d009ba50a2908fd9c93ff3e467f511b233cf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 18:50:14 2008 +1030 + + Update clip-operator ps ref image + + test/clip-operator-ps-argb32-ref.png | Bin 8594 -> 9062 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 13663d1d500a6c2254097011e66199d6dd81c62d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Feb 3 17:10:56 2008 +1030 + + PS: Implement linear gradient repeat and reflect + + src/cairo-ps-surface.c | 250 ++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 196 insertions(+), 54 deletions(-) + +commit 92a2e851df6668f60c63165466d2ee85dd600f47 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 2 23:00:30 2008 +1030 + + Update operator-source PS ref images + + test/operator-source-ps-argb32-ref.png | Bin 3885 -> 4053 bytes + test/operator-source-ps-rgb24-ref.png | Bin 3548 -> 2567 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 367e50137eb1b2b3952a87c580eed08a79fd211f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Feb 2 20:59:56 2008 +1030 + + PDF: Use correct surface size when emitting patterns + + Store the surface size in each pattern and smask group and use this + size when the pattern/group is emitted. This is required as a pattern + or group may be used from a meta surface with a different size to the + PDF surface. However the pattern or group is emitted after the the meta + surface content has been emitted and the surface size has been + restored to the the page size. + + This fixes the following pdf test failures: + extend-reflect-similar + extend-repeat-similar + mask + + src/cairo-pdf-surface-private.h | 4 ++++ + src/cairo-pdf-surface.c | 53 ++++++++++++++++++++++++++++++++++++----- + 2 files changed, 51 insertions(+), 6 deletions(-) + +commit d08d5c421a45c4e5f30b308823e90a86f1ec2052 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 05:35:50 2008 -0800 + + Increment cairo version to 1.5.9 after the 1.5.8 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4ccb8cb29546432858e778e1b88cada1327f6f45 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 05:16:26 2008 -0800 + + Add some more reference images to REFERENCE_IMAGES + + test/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit b31a7a904f8413c34970beabce6fecf6e1fdc925 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 05:13:53 2008 -0800 + + Increment cairo version to 1.5.8 and libtool version to 16:0:14 + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ca10920cc9f3a673e2199112541d5a1472423c47 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 05:07:20 2008 -0800 + + Add a1-image-sample and a1-traps-sample reference images to the dist list + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2fee01e2d40715defe9143456101533c1f1aafcf +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 04:54:39 2008 -0800 + + check-doc-syntax.sh: Fix for non-srcdir builds (such as make distcheck) + + src/check-doc-syntax.sh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 78022f3aa16cf8a629aec4595c5a542ca68a78cc +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 04:54:05 2008 -0800 + + Add doc/public test scripts to EXTRA_DIST + + This prevents failures of make distcheck + + doc/public/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit d49b1220b2feeca82050de05c9c01012e8420acb +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 04:52:23 2008 -0800 + + Remove extend-pad-similar test case + + This seems redundant with the recent testing of all test cases + against similar surfaces. Plus, it hasn't had a reference image + anyway which was causing problems with the recent extra checks + for missing reference images. + + test/Makefile.am | 3 -- + test/extend-pad-similar.c | 105 ---------------------------------------------- + 2 files changed, 108 deletions(-) + +commit 7d2fda54f9bf6ae48cf8048b4836dea7f20cccee +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 30 04:23:19 2008 -0800 + + NEWS: Add notes for the 1.5.8 snapshot + + NEWS | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 103 insertions(+) + +commit 3b0adf4f5ac78e3f19b4e19267da2aa1b3c7d57b +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Jan 29 09:07:54 2008 -0800 + + Use ADD instead of IN for clipping. + + ADD is already special-cased by pixman, so using it instead avoids hitting + the slower general path. + + src/cairo-clip.c | 34 ++++++++++++++++++++++++++++++++-- + 1 file changed, 32 insertions(+), 2 deletions(-) + +commit fa6aedf2d68941bf8532bf487d5412cfc508e0a9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 29 09:01:47 2008 -0800 + + Fix typo in printf arguments in error message + + test/font-matrix-translation.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2bb36fe08546e6461fcbd40f5f3f81e5efc7686 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 29 08:41:21 2008 -0800 + + wAdd proper error propagation to _cairo_matrix_compute_scale_factors + + Before there was just an assert statement here that the + determinant of the matrix was not infinite. That was bogus + since a user-provided can end up here. So instead, do the + correct error propagation of any CAIRO_STATUS_INVALID_MATRIX + error as necessary. + + This eliminates the current failure of the invalid-matrix + test case. + + src/cairo-atsui-font.c | 56 ++++++++++++++++++++++++++++++++++++------------- + src/cairo-ft-font.c | 20 ++++++++++++------ + src/cairo-matrix.c | 7 +++++-- + src/cairo-scaled-font.c | 13 ++++++++---- + src/cairo-win32-font.c | 20 +++++++++++------- + src/cairoint.h | 4 ++-- + 6 files changed, 83 insertions(+), 37 deletions(-) + +commit 849322235764f570a4a3a1217960d096d16165cf +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 29 05:40:39 2008 -0800 + + Initialize return values for cairo_*_extents in case of error + + Previously we left the return values alone, which set the + user up for a nasty trap, (using potentially uninitialized + values with no indication that there was an error). So now + we initialize these values to 0.0 if the cairo_t is in error. + + The fixed functions include: + + cairo_path_extents + cairo_stroke_extents + cairo_fill_extents + cairo_clip_extents + cairo_font_extents + + src/cairo.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 50 insertions(+), 4 deletions(-) + +commit 6bdba4b4be5e66ffa61e164f8098b76d848e8f32 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 29 05:27:10 2008 -0800 + + Add missing libcairo_font_subset_sources to fix the build + + src/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3d82056cee0ba960ebb61877fec8aa646e60e990 +Author: Nis Martensen <nis.martensen@web.de> +Date: Tue Jan 29 05:32:24 2008 -0500 + + Fix typos + + src/cairo.h | 4 ++-- + src/check-doc-syntax.sh | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit b28f4f57f21ac4091c9457873abe1465ec3f7fed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 04:32:39 2008 -0500 + + [src/Makefile.am] Reorganize + + Main goal was to be able to pass list of all cairo sources, enabled or + not, to check-doc-syntax.sh such that it doesn't check *.h, *.c, *.cpp + because that can be annoying when bisecting. + + src/Makefile.am | 352 ++++++++++++++++++++++++++---------------------- + src/check-doc-syntax.sh | 5 +- + 2 files changed, 195 insertions(+), 162 deletions(-) + +commit 41a57007939a3e206647fda1b6e5a554ca125c5f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jan 29 20:27:06 2008 +1100 + + Fix undefined macro that was preventing the tests from compiling + + test/pattern-getters.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit cfce362375963502c4d29089b369d8e5ce2b7dcb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 01:27:47 2008 -0500 + + [cairo_operator_t] Mark DestAtop unbounded and document boundedness + + src/cairo.h | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit f9b90e475ed6009e58e5f11ac713f9ea639a6900 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 01:20:03 2008 -0500 + + [doc] Fix cairo_operator_t docs to make Carl (and Keith) happy + + src/cairo.h | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +commit 9ee7a48b33f11a42b0ffd12a9192a328e35233f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 00:50:48 2008 -0500 + + [Makefile.am] Minor wording change + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 013781137ff4940d0b9e04b656c20af37bbd5333 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 00:42:51 2008 -0500 + + [cairo-image-surface.c] Cleanup stride checking and improve docs + + src/cairo-image-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 8e3250b8564a346c61e926a6aa61f18ae3f60c93 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 00:36:38 2008 -0500 + + [Makefile.am] Remove ROADMAP and TODO from dist files + + Makefile.am | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 81e4cc3bd7d1fec659a19f8b37253aaebe12c99b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 00:36:16 2008 -0500 + + [cairo_image_surface_create_for_data] Document stride error status + + src/cairo-image-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6153a3b620641b1fb7b64a050a168482d2a42f2c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 00:34:00 2008 -0500 + + [doc] Run check-doc-syntax.sh for SGML docs too + + doc/public/Makefile.am | 4 ++-- + doc/public/check-doc-syntax.sh | 11 +++++++++++ + src/check-doc-syntax.sh | 33 ++++++++++++++++++++++++--------- + 3 files changed, 37 insertions(+), 11 deletions(-) + +commit 3f7d301786ce345cc4221f434bda6751e9b97ad1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:56:23 2008 -0500 + + [src/check-doc-syntax.sh] Skip test if GNU grep is not available + + src/check-doc-syntax.sh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 247e1011995b0241526262cc36eb34c7e5edd47c +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 21:24:56 2008 -0800 + + Fix bitmap-font test by using near-equality for double comparison + + test/bitmap-font.c | 11 ++++++----- + test/cairo-test.h | 2 ++ + test/pattern-getters.c | 4 +--- + 3 files changed, 9 insertions(+), 8 deletions(-) + +commit 468caac068d3d25507d901f069e3e55731a27ae9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:30:09 2008 -0500 + + [configure.in] Minor change to cairo-features.h comments to make tests pass + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b4c7a0dc6e996e47390ae544f82024afbb7859ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:27:10 2008 -0500 + + [doc] Document CAIRO_HAS_* macros. We now finally have real 100% coverage. + + doc/public/Makefile.am | 2 ++ + doc/public/cairo-sections.txt | 9 +++++++++ + doc/public/tmpl/cairo-ft.sgml | 8 ++++++++ + doc/public/tmpl/cairo-pdf.sgml | 8 ++++++++ + doc/public/tmpl/cairo-png.sgml | 9 +++++++++ + doc/public/tmpl/cairo-ps.sgml | 8 ++++++++ + doc/public/tmpl/cairo-svg.sgml | 8 ++++++++ + doc/public/tmpl/cairo-win32-fonts.sgml | 8 ++++++++ + doc/public/tmpl/cairo-win32.sgml | 8 ++++++++ + doc/public/tmpl/cairo-xlib-xrender.sgml | 8 ++++++++ + doc/public/tmpl/cairo-xlib.sgml | 8 ++++++++ + 11 files changed, 84 insertions(+) + +commit 47e0ecbea51cae73a85db277972b80eff0c4b9f6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:26:35 2008 -0500 + + [configure.in] Generate a cairo-no-features.h with macros for disabled supported backends + to trick gtk-doc with it. + + configure.in | 33 ++++++++++++++++++++++++++++++++- + src/Makefile.am | 6 +++--- + src/check-headers.sh | 2 +- + 3 files changed, 36 insertions(+), 5 deletions(-) + +commit 9d8990b6bdec8e574e37346c363b3a850a246452 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:23:00 2008 -0500 + + [doc] Remove excess paranthesis + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6e495e94886dfa80f11f675a4b7fa3a767671cc0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:10:28 2008 -0500 + + [doc] More syntax fixes + + doc/public/tmpl/cairo-version.sgml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a00d71968285fc8c49903c1c84835a8be32cfbd3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 23:05:00 2008 -0500 + + [configure.in] Add commented-out #undef's for disable stable backends in cairo-features.h + + configure.in | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 6a089247a180cbc85e222520d2d93914434027be +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 22:45:06 2008 -0500 + + [doc] Rename cairo-font.sgml to cairo-font-face.sgml + + doc/public/cairo-docs.xml | 2 +- + doc/public/cairo-sections.txt | 2 +- + doc/public/tmpl/cairo-font-face.sgml | 112 +++++++++++++++++++++++++++++++++++ + doc/public/tmpl/cairo-font.sgml | 112 ----------------------------------- + 4 files changed, 114 insertions(+), 114 deletions(-) + +commit 1d17a7f7811b15c72a4091663e01a448f538bc68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 22:42:46 2008 -0500 + + [doc] Document the surface type of win32-printing surface being different + + doc/public/tmpl/cairo-win32.sgml | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit a55f65b5d29060a7f8033ceea211252431d20b77 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 22:25:37 2008 -0500 + + [doc] Fix typo + + src/cairo-pattern.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 52cc603db1a805a0b3a8d7eba3171cd2785f10a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 22:10:20 2008 -0500 + + [doc] Stricter syntax check for type names, update test + + src/cairo-array.c | 2 +- + src/cairo-cache-private.h | 2 +- + src/cairo-font-face.c | 4 ++-- + src/cairo-ft-font.c | 4 ++-- + src/cairo-image-surface.c | 2 +- + src/cairo-paginated-private.h | 8 ++++---- + src/cairo-ps-surface.c | 2 +- + src/cairo-ps.h | 2 +- + src/cairo-region-private.h | 2 +- + src/cairo-scaled-font-subsets-private.h | 16 ++++++++-------- + src/cairo-scaled-font.c | 2 +- + src/cairo-svg.h | 2 +- + src/cairo-types-private.h | 2 +- + src/cairo-win32-font.c | 2 +- + src/cairo.c | 2 +- + src/cairo.h | 24 ++++++++++++------------ + src/cairoint.h | 2 +- + src/check-doc-syntax.sh | 9 +++++---- + 18 files changed, 45 insertions(+), 44 deletions(-) + +commit b790c5a6bcdd890c16d21753407188ed200ce445 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:53:44 2008 -0500 + + [doc] Replace 'NOTE' by 'Note' and add it to test + + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-cache.c | 4 ++-- + src/cairo-ft-font.c | 4 ++-- + src/cairo-lzw.c | 4 ++-- + src/cairo-output-stream-private.h | 2 +- + src/cairo-paginated-private.h | 4 ++-- + src/cairo-path.c | 2 +- + src/cairo-pen.c | 4 ++-- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-slope.c | 2 +- + src/cairo-surface.c | 4 ++-- + src/cairo-win32-surface.c | 4 ++-- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo.c | 4 ++-- + src/check-doc-syntax.sh | 7 +++++++ + 16 files changed, 33 insertions(+), 26 deletions(-) + +commit f0633f4449c39a8f78c582790fb5dc85899b5d82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:49:57 2008 -0500 + + [doc] Make sure all function names in docs are followed by () + + src/cairo-array.c | 2 +- + src/cairo-base85-stream.c | 3 +-- + src/cairo-beos-surface.cpp | 2 +- + src/cairo-cache-private.h | 4 ++-- + src/cairo-debug.c | 4 ++-- + src/cairo-deflate-stream.c | 3 +-- + src/cairo-ft-font.c | 4 ++-- + src/cairo-image-surface.c | 4 ++-- + src/cairo-output-stream-private.h | 3 +-- + src/cairo-output-stream.c | 3 +-- + src/cairo-paginated-private.h | 2 +- + src/cairo-path-fixed-private.h | 2 +- + src/cairo-path.c | 6 +++--- + src/cairo-pdf-surface.c | 4 ++-- + src/cairo-ps-surface.c | 6 +++--- + src/cairo-quartz-surface.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 2 +- + src/cairo-scaled-font.c | 8 ++++---- + src/cairo-surface.c | 6 +++--- + src/cairo-svg-surface.c | 4 ++-- + src/cairo-traps.c | 2 +- + src/cairo-types-private.h | 4 ++-- + src/cairo-unicode.c | 3 +-- + src/cairo.c | 30 ++++++++++++++---------------- + src/cairo.h | 22 +++++++++++----------- + src/cairoint.h | 8 ++++---- + 26 files changed, 68 insertions(+), 75 deletions(-) + +commit 9ba8f6b1b0a4fbf2407e0dbd767f043c6920344c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:49:26 2008 -0500 + + [src/check-doc-syntax.sh] Check for various doc syntax consistency rules + + src/Makefile.am | 2 +- + src/check-doc-syntax.sh | 36 ++++++++++++++++++++++++++++++++++++ + 2 files changed, 37 insertions(+), 1 deletion(-) + +commit e15fcdd74734e922183afd4732ec4ba090f313c9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:48:23 2008 -0500 + + [doc] Improve syntax + + doc/public/tmpl/cairo-font.sgml | 7 +++++-- + doc/public/tmpl/cairo-matrix.sgml | 2 +- + doc/public/tmpl/cairo-pattern.sgml | 12 +++++++++--- + doc/public/tmpl/cairo-status.sgml | 5 +++-- + doc/public/tmpl/cairo-surface.sgml | 8 +++++++- + doc/public/tmpl/cairo-xcb-xrender.sgml | 3 ++- + doc/public/tmpl/cairo-xcb.sgml | 3 ++- + doc/public/tmpl/cairo-xlib-xrender.sgml | 3 ++- + doc/public/tmpl/cairo-xlib.sgml | 3 ++- + 9 files changed, 33 insertions(+), 13 deletions(-) + +commit 587508528c4a318649ecb347b96fbc89a40175ea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:12:16 2008 -0500 + + [doc] Minor improvement + + doc/public/tmpl/cairo-beos.sgml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit fd5dfedbb75593539eeda92013042ce5423a65c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:02:44 2008 -0500 + + [doc/public/check-doc-coverage.sh] Test that doc coverage is 100% + + Yay! + + doc/public/Makefile.am | 2 ++ + doc/public/check-doc-coverage.sh | 43 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 45 insertions(+) + +commit c133ee5acc7c97fcd43d61f5aad160ca96c47941 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:00:21 2008 -0500 + + [doc] Improve docs for new API + + src/cairo-image-surface.c | 8 ++++---- + src/cairo-xlib-surface.c | 20 +++++++++++++------- + 2 files changed, 17 insertions(+), 11 deletions(-) + +commit 0d898f2badf41d3b0ae5ee88943c44cf49690f5d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 20:49:44 2008 -0500 + + [doc] Make sure all type names in docs are prefixed by # + + src/cairo-array.c | 2 +- + src/cairo-bentley-ottmann.c | 4 ++-- + src/cairo-cache-private.h | 4 ++-- + src/cairo-cache.c | 2 +- + src/cairo-fixed-type-private.h | 2 +- + src/cairo-font-face.c | 12 ++++++------ + src/cairo-font-options.c | 2 +- + src/cairo-ft-font.c | 12 ++++++------ + src/cairo-gstate.c | 8 ++++---- + src/cairo-hash.c | 2 +- + src/cairo-image-surface.c | 4 ++-- + src/cairo-matrix.c | 10 +++++----- + src/cairo-mutex-type-private.h | 6 +++--- + src/cairo-pattern.c | 10 +++++----- + src/cairo-pdf-surface.c | 2 +- + src/cairo-png.c | 2 +- + src/cairo-ps-surface.c | 12 ++++++------ + src/cairo-quartz-surface.c | 2 +- + src/cairo-rectangle.c | 8 ++++---- + src/cairo-region.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 8 ++++---- + src/cairo-scaled-font.c | 8 ++++---- + src/cairo-traps.c | 2 +- + src/cairo-types-private.h | 2 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo.c | 4 ++-- + src/cairo.h | 16 ++++++++-------- + src/cairoint.h | 4 ++-- + 29 files changed, 79 insertions(+), 79 deletions(-) + +commit 9ecde82d35ead4975ce110bb2012264e3ca9d2e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 20:48:48 2008 -0500 + + [doc] Make sure all macro names in docs are prefixed by % + + src/cairo-array.c | 6 ++--- + src/cairo-bentley-ottmann.c | 8 +++---- + src/cairo-cache.c | 6 ++--- + src/cairo-deprecated.h | 2 +- + src/cairo-directfb.h | 4 ++-- + src/cairo-fixed-type-private.h | 2 +- + src/cairo-freelist-private.h | 4 ++-- + src/cairo-ft-font.c | 6 ++--- + src/cairo-gstate.c | 14 +++++------ + src/cairo-hash.c | 36 ++++++++++++++-------------- + src/cairo-image-surface.c | 4 ++-- + src/cairo-lzw.c | 14 +++++------ + src/cairo-meta-surface.c | 6 ++--- + src/cairo-mutex-private.h | 4 ++-- + src/cairo-mutex-type-private.h | 24 +++++++++---------- + src/cairo-os2.h | 6 ++--- + src/cairo-output-stream-private.h | 6 ++--- + src/cairo-paginated-private.h | 4 ++-- + src/cairo-path-fill.c | 2 +- + src/cairo-path.c | 12 +++++----- + src/cairo-pattern.c | 2 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-png.c | 10 ++++---- + src/cairo-ps-surface.c | 12 +++++----- + src/cairo-scaled-font-subsets-private.h | 42 ++++++++++++++++----------------- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-surface-fallback.c | 6 ++--- + src/cairo-surface.c | 10 ++++---- + src/cairo-svg-surface.c | 4 ++-- + src/cairo-types-private.h | 4 ++-- + src/cairo-win32-font.c | 4 ++-- + src/cairo-win32-surface.c | 10 ++++---- + src/cairo-xcb-surface.c | 2 +- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo.c | 26 ++++++++++---------- + src/cairo.h | 10 ++++---- + src/cairoint.h | 6 ++--- + src/test-fallback-surface.c | 4 ++-- + 38 files changed, 166 insertions(+), 166 deletions(-) + +commit 099c3c2602b59fbf9424044caa1fec7eb92f71df +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 20:32:35 2008 -0500 + + [doc] Another enum nick expansion + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 72feed5b54e1aa725c3c5238b21946b6250503fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 20:16:01 2008 -0500 + + [doc] Update templates for recently added APIs + + doc/public/cairo-sections.txt | 2 ++ + doc/public/tmpl/cairo-image.sgml | 10 ++++++++++ + doc/public/tmpl/cairo-paths.sgml | 2 +- + doc/public/tmpl/cairo-status.sgml | 1 + + doc/public/tmpl/cairo-xlib-xrender.sgml | 9 +++++++++ + 5 files changed, 23 insertions(+), 1 deletion(-) + +commit b7d43d235c01480b5a5a34db6fea8a3d86161d91 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 20:14:52 2008 -0500 + + [src/check-*] Shut make up + + src/check-def.sh | 4 ++-- + src/check-plt.sh | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit dd7ce762946ec03fc115310c7e295b3327d7e805 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 19:54:27 2008 -0500 + + [doc] Expand a couple nicks to full enum names + + src/cairo.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c624ff46541b311c226ad7a026db3495b59dee41 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 19:45:10 2008 -0500 + + [cairo_operator_t] Improve docs + + src/cairo.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit f1271babcd4df1140019b258ca0af0d7da0d1328 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 19:37:46 2008 -0500 + + [doc] Add Long_Description and some See_Also for all chapters + + doc/public/tmpl/cairo-atsui.sgml | 6 ++++-- + doc/public/tmpl/cairo-beos.sgml | 7 +++++-- + doc/public/tmpl/cairo-font-options.sgml | 11 ++++++++--- + doc/public/tmpl/cairo-font.sgml | 12 ++++++++++-- + doc/public/tmpl/cairo-ft.sgml | 7 +++++-- + doc/public/tmpl/cairo-glitz.sgml | 7 +++++-- + doc/public/tmpl/cairo-image.sgml | 15 ++++++++------- + doc/public/tmpl/cairo-matrix.sgml | 5 +++-- + doc/public/tmpl/cairo-paths.sgml | 4 +++- + doc/public/tmpl/cairo-pattern.sgml | 13 +++++++++---- + doc/public/tmpl/cairo-pdf.sgml | 7 +++++-- + doc/public/tmpl/cairo-png.sgml | 7 +++++-- + doc/public/tmpl/cairo-ps.sgml | 7 +++++-- + doc/public/tmpl/cairo-quartz.sgml | 7 +++++-- + doc/public/tmpl/cairo-scaled-font.sgml | 13 +++++++++---- + doc/public/tmpl/cairo-status.sgml | 19 ++++++++++++++++-- + doc/public/tmpl/cairo-surface.sgml | 8 ++++++-- + doc/public/tmpl/cairo-svg.sgml | 7 +++++-- + doc/public/tmpl/cairo-text.sgml | 34 ++++++++++++++++++++++++++++++--- + doc/public/tmpl/cairo-transforms.sgml | 10 ++++++++-- + doc/public/tmpl/cairo-types.sgml | 4 ++-- + doc/public/tmpl/cairo-win32-fonts.sgml | 7 +++++-- + doc/public/tmpl/cairo-win32.sgml | 7 +++++-- + doc/public/tmpl/cairo-xcb-xrender.sgml | 10 ++++++++-- + doc/public/tmpl/cairo-xcb.sgml | 8 +++++++- + doc/public/tmpl/cairo-xlib-xrender.sgml | 12 +++++++++--- + doc/public/tmpl/cairo-xlib.sgml | 8 +++++++- + doc/public/tmpl/cairo.sgml | 4 +++- + 28 files changed, 202 insertions(+), 64 deletions(-) + +commit 73b184fb9c41f26365c99dbb5f81aa5166632722 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 19:19:27 2008 -0500 + + [src] Fix gtk-doc warnings + + src/cairo-scaled-font.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo.c | 6 +++--- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 8709b943c6f0025c65081b23ea24ce606150cf49 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 16:15:28 2008 -0800 + + Fix some documentation typos + + src/cairo.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e48d7ca802acba300aee99def0eb01727fe2f58a +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 16:11:39 2008 -0800 + + Add example to documentation of cairo_pattern_set_filter + + It's helpful to let the reade know about cairo_get_source here. + + src/cairo-pattern.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit cd26fa266b51ffd91aa9f2c60dd353c53729291e +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 16:10:10 2008 -0800 + + Add documentation for cairo_filter_t + + src/cairo.h | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 7c00269e00332974c3a2843272f84960a90b9fb7 +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jan 27 12:36:19 2008 -0800 + + Add pdf-specific reference images for meta-surface-pattern + + This test has been "failing" ever since we had native + replay of metasurfaces to pdf. But looking at the results, + they are actually superior to the image-backend reference + images. + + test/meta-surface-pattern-pdf-ref.png | Bin 0 -> 4111 bytes + test/meta-surface-pattern-pdf-rgb24-ref.png | Bin 0 -> 4009 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 9cd198d200e4470d3451581b9e672a87d5d91719 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 15:37:22 2008 -0800 + + Test the no-Render-extension-available case in get-xrender-format + + test/get-xrender-format.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit d7fd3bd536465881446686305622d31fdc6fd48f +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jan 27 12:14:51 2008 -0800 + + Add get-xrender-format test to test cairo_xlib_surface_get_xrender_format + + test/.gitignore | 1 + + test/Makefile.am | 5 +++ + test/get-xrender-format.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 110 insertions(+) + +commit cc94dce25085fef936b7cb36cf9fc41569668eba +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 15:26:15 2008 -0800 + + Return NULL from cairo_xlib_surface_get_xrender_format without an error + + The NULL return value will only happen if the X Render extension + is not available. We've already got that NULL return value + documented, so it's not an error if the user asks for it. In + particular, it's definitely not a surface-type mismatch. + + src/cairo-xlib-surface.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit 3c018a6e5abe099fa916f45ecf0c8e9dd5771fae +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jan 27 12:13:13 2008 -0800 + + Add new API cairo_xlib_surface_get_render_format + + src/cairo-xlib-surface.c | 27 +++++++++++++++++++++++++++ + src/cairo-xlib-xrender.h | 3 +++ + 2 files changed, 30 insertions(+) + +commit 88811540722d891b987efa6fa8edcbab7e10feeb +Author: Carl Worth <cworth@cworth.org> +Date: Sun Jan 27 11:12:14 2008 -0800 + + Add missing cairo_private (for _pixman_format_to_masks) + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3841cc0932ac77540c306c1c70a6171d7d00cf3e +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 15:12:38 2008 -0800 + + Clarify the documentation of stride within cairo_image_surface_create_for_data + + src/cairo-image-surface.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +commit 13a5624277adf7e87f66d674ce8073013b53bece +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 28 14:29:36 2008 -0800 + + Rename cairo_image_surface_stride_for_width to cairo_format_stride_for_width + + Thanks for Behdad for the suggested name improvement. Also, make + it more clear that the stride passed to cairo_image_surface_create_for_data + should come from calling cairo_format_stride_for_width with the + same width. + + src/cairo-image-surface.c | 21 +++++++++++---------- + src/cairo.h | 4 ++-- + test/a8-mask.c | 11 ++++++----- + 3 files changed, 19 insertions(+), 17 deletions(-) + +commit dc67de3d8b6154b74a243cd7b63e45f343520256 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 26 23:12:14 2008 -0800 + + Add cairo_image_surface_stride_for_width + + Document this function as a required call to get the correct + stride value before calling cairo_image_surface_create_for_data. + This means that previously-failing calls with non-multiple-of-4 + stride values are now documented as errors. Also, we now have + the possibility of moving to more stringent alignment constraints, + (one can imagine doing 64-bit or 128-bit boundaries for example). + + src/cairo-image-surface.c | 60 +++++++++++++++++---- + src/cairo-surface.c | 3 ++ + src/cairo.c | 4 +- + src/cairo.h | 8 ++- + test/Makefile.am | 4 -- + test/a8-mask.c | 132 ++++++++++++++++++++++++++++++++++++++++------ + 6 files changed, 179 insertions(+), 32 deletions(-) + +commit b151cb0709364bed03e4918b79f26ef3243948ca +Author: Carl Worth <cworth@cworth.org> +Date: Sat Jan 26 16:42:26 2008 -0800 + + Rename cairo_format_width to cairo_format_bits_per_pixel and correct its logic + + src/cairo-image-surface.c | 6 +++--- + src/cairo-scaled-font.c | 3 ++- + src/cairoint.h | 4 ++-- + 3 files changed, 7 insertions(+), 6 deletions(-) + +commit 538ace5b51c968a81ea1d4c8d7538f0a227661c6 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Jan 26 19:11:26 2008 +0100 + + re-indent xml after removal of structuring level + + doc/public/cairo-docs.xml | 76 +++++++++++++++++++++++------------------------ + 1 file changed, 38 insertions(+), 38 deletions(-) + +commit 642e1af892353d55edd6ebe71720fb541c9deb22 +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Jan 26 19:05:16 2008 +0100 + + remove empty tutorial stub and one level of structuring + + doc/public/cairo-docs.xml | 6 ------ + 1 file changed, 6 deletions(-) + +commit be93e61d70f4e32069448b79cca7eacab6035c6c +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Jan 26 18:44:32 2008 +0100 + + Add index of new symbols in 1.6 + + doc/public/cairo-docs.xml | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0874834ec4606c5ff960588077d5310927d560ba +Author: Nis Martensen <nis.martensen@web.de> +Date: Sat Jan 26 16:59:21 2008 +0100 + + Describe cairo_operator_t, add link to operators/ wiki page + + src/cairo.h | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit b18bc660c6d5d5018b4cfaf0eaf0278669cac1ac +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 02:33:58 2008 -0500 + + [test/font-matrix-translation] Fix function signature + + test/font-matrix-translation.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 936edecb35b94213997fdb172f0256c658f416aa +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sun Jan 27 16:52:39 2008 -0800 + + [quartz] only use DrawTiledImage if transformed image is integer aligned + + This Quartz API seems to only tile at integer coordinates; if the source image is + scaled to anything less than integer-aligned, seams appear between tiles. Detect + this and fall back to slower but more general CGPattern path. + + src/cairo-quartz-surface.c | 144 ++++++++++++++++++++++++--------------------- + 1 file changed, 77 insertions(+), 67 deletions(-) + +commit 182b02240192c03b1fae5367573962d527f8aad4 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sat Jan 26 10:57:20 2008 -0800 + + [win32] Fix initial clip region test + + I misread the docs; GetClipBox's return value doesn't necessarily correspond to + GetClipRgn's region type. + + src/cairo-win32-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 0e737632905e61f4d76b6b2c4e5908d75a5cddda +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 27 02:19:47 2008 -0500 + + [src] Fix make check + + src/cairo-quartz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b3eea75d1f7b56c2046b5387a5eb186d8f154184 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 13:56:08 2008 -0500 + + Change cairo_get_current_point() to return cairo_status_t instead of void + + So we can return CAIRO_STATUS_NO_CURRENT_POINT. Previously it wasn't easy + to fetch that information. + + src/cairo.c | 22 ++++++++++++++++++---- + src/cairo.h | 2 +- + 2 files changed, 19 insertions(+), 5 deletions(-) + +commit 79383841520af3a7de3018befca37be6a037f9ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 19:48:36 2008 -0500 + + [doc] Update list of private header files + + doc/public/Headers.mk | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 58f6aed93d137b77a2550bcace16f8d5573d45ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 19:47:07 2008 -0500 + + [doc] Update for recent API changes + + doc/public/tmpl/cairo-paths.sgml | 2 ++ + doc/public/tmpl/cairo-status.sgml | 1 + + doc/public/tmpl/cairo-surface.sgml | 2 -- + 3 files changed, 3 insertions(+), 2 deletions(-) + +commit 45e7ba356d308f67f674a20484a55d41fe922d13 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 19:46:43 2008 -0500 + + [cairo-pdf-operators] Reformat typedef to not confuse gtk-doc + + src/cairo-pdf-operators-private.h | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 756420a780e870bed6f174ca7f3f14421d1ff7d2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 19:38:27 2008 -0500 + + [cairo_surface_show/copy_page()] Make them return void, like cairo_show/copy_page() do + + src/cairo-gstate.c | 6 ++++-- + src/cairo-paginated-surface.c | 12 ++++++++---- + src/cairo-surface.c | 33 ++++++++++++++++++--------------- + src/cairo-svg-surface.c | 5 +++-- + src/cairo.h | 4 ++-- + 5 files changed, 35 insertions(+), 25 deletions(-) + +commit c4ec5539ca7380dccf1a2f797e536c7273b5c2b5 +Author: Nis Martensen <nis.martensen@web.de> +Date: Fri Jan 25 19:13:13 2008 -0500 + + [cairo-surface] Fix doc typo + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ab188f2e90b49fc4e07f04dc512f9fb9864efa0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 17:44:26 2008 -0500 + + [cairo-ft] Disable embedded bitmaps if hinting style NONE is requested + + src/cairo-ft-font.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 2df9944a8ac48cb43845e56c5483bf77dafda584 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 17:12:34 2008 -0500 + + [.gitignore] Add check-has-hidden-symbols.i + + src/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 3d2144b6af07ca44b6fbf1c96080b7e2b7c0285c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 17:06:11 2008 -0500 + + [cairo-ft] Fix font metrics computation for bitmap fonts and no metrics-hinting + + Preivously we were returning NAN font metrics. Fixed now. Makes bitmap-font + test pass again. + + src/cairo-ft-font.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit c621d8d7191bfa8c1bca533bf9d53d514d01f529 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Jan 25 15:01:44 2008 -0800 + + [ps] Pad image mask lines out to full lines + + The PostScript backend was generating image masks with packed mask + bits, when PS seems to expect each line of the mask to be padded out + to 8 bytes. + + Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=407360 + + src/cairo-ps-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit bae496df11247a1e4aff8b0df3356701f8a11792 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 08:03:32 2008 -0500 + + [test/bitmap-font] Test under all combinations of hinting, test font metrics too + + This is now failing as we compute NAN font metrics for bitmap-only fonts under + disabled metrics hinting. A very infamous bug excercised with PangoCairo's PDF + output. + + test/bitmap-font.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 94 insertions(+), 8 deletions(-) + +commit 20c8531243c2f2ee220bd1f234cdba6fc3d6d4c7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 07:14:07 2008 -0500 + + [test/text-zero-len] Test text and font extents for font size 0 + + test/text-zero-len.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 50 insertions(+), 2 deletions(-) + +commit 83bd590760629b61898ed403e273046545f26767 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 07:02:25 2008 -0500 + + [test] Test that cairo_text_extents() and cairo_scaled_font_text_extents() match + in results. + + test/font-matrix-translation.c | 31 ++++++++++++++++++++++++++++++- + 1 file changed, 30 insertions(+), 1 deletion(-) + +commit 4c432b09557f52fa35be981743272b33baca6232 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 04:16:44 2008 -0500 + + [cairo-scaled-font] Fix bug in glyphs bounding box computation + + In 02970ac8cf27bc9d42cf27848a97019d9dd13b6d Vlad introduced the following + innocent-looking change: + + - short min_x = INT16_MAX, max_x = INT16_MIN; + - short min_y = INT16_MAX, max_y = INT16_MIN; + + cairo_point_int_t min = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; + + cairo_point_int_t max = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; + + Well, read it carefully... yeah. That caused each show glyph operation + upload a mask the size of the surface. With evince/poppler and certain + PDF files that each glyph is rendered in its own cairo_show_glyphs() + call, that meant a 20x slowdown in rendering a page of PDF. + + If still wondering what's wrong with that change, here is the answer: + + - cairo_point_int_t min = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; + - cairo_point_int_t max = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; + + cairo_point_int_t min = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; + + cairo_point_int_t max = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; + + Yay for git-bisect. + + src/cairo-scaled-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8983208f456c6f570698df46174faa0208d6de5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 01:00:21 2008 -0500 + + [configure.in] Require pixman >= 0.9.6 + + I was experiencing very weird rendering problems and crashes in evince with + pixman 0.9.4. Upgrading to pixman 0.9.6 fixed the all. Lets just require it. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5dfe47a3f14ee8597395dc53ff57fd429e9804cd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 00:35:11 2008 -0500 + + [cairo-scaled-font] Unbreak it after my recent commit + + Sigh. + + src/cairo-scaled-font.c | 41 +++++++++++++++++++---------------------- + 1 file changed, 19 insertions(+), 22 deletions(-) + +commit efd3a965244305a069ec231b7ec28cff8d6c67c8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 24 23:35:06 2008 -0500 + + [cairo-scaled-font] Don't err on font size 0, really + + First, seems like we were rejecting degenerate font matrix right away + at the constructor. Don't do that. + + Next, PS/PDF were inverting the font scale matrix, assuming that it's + invertible. We now keep the inverse too, so they can use it. For the + case of a size 0 font, both the scale matrix and its invert are set to + 0,0,0,0. That's safe, even if slightly inconsistent. + + src/cairo-pdf-surface.c | 5 +---- + src/cairo-ps-surface.c | 5 +---- + src/cairo-scaled-font-private.h | 1 + + src/cairo-scaled-font.c | 19 ++++++++----------- + 4 files changed, 11 insertions(+), 19 deletions(-) + +commit 45f269e33020d8d7cf247926712b9c64c1fb8959 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 24 22:39:28 2008 -0500 + + [cairo-scaled-font] Oops, return err if not handling it + + src/cairo-scaled-font.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6d0dc3e0760e6bc6b0eceab48674410b4e865287 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 24 22:24:23 2008 -0500 + + [cairo-scaled-font] Don't err on font size 0 + + src/cairo-scaled-font.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +commit ea9afecc9aaa87c2df14dc9126c75ac0e3e5b13f +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Jan 24 11:48:02 2008 -0800 + + [quartz] Do dynamic symbol lookups for 10.4/10.5 optimization symbols + + The gcc-__attribute-__ based weak linking was causing all sorts of problems; + do dlsym lookups at runtime instead. + + src/cairo-quartz-surface.c | 39 ++++++++++++++++++++++++++++----------- + 1 file changed, 28 insertions(+), 11 deletions(-) + +commit 287de2ce5883daa4238c534e0d4890cb640d7fb7 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jan 23 21:30:42 2008 -0800 + + [quartz] Clean up unused APIs a bit + + The data parameter from get_image was never really used; get rid of it and clean up + callers. Also get rid of a chunk of dead code in release_dest_image. + + src/cairo-quartz-surface.c | 76 ++++++++-------------------------------------- + 1 file changed, 13 insertions(+), 63 deletions(-) + +commit b96c6c26c2d6b0b5f79ee569ece602338c4146b2 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Jan 24 11:04:26 2008 -0800 + + [win32] Print non-black/white text correctly in show_glyphs + + src/cairo-win32-printing-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8e7c0db8018b258fc367da1e5502e9e13bad098c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Jan 24 11:01:55 2008 -0800 + + [win32] Better tracking of initial clip + + There were a few corner cases that the win32 surface was failing + at when there was an initial clip set; the win32-printing surface + had more serious problems when painting meta surface patterns. + This cleans up the initial DC clip tracking for both surfaces. + + src/cairo-win32-printing-surface.c | 69 +++++------- + src/cairo-win32-private.h | 23 +++- + src/cairo-win32-surface.c | 221 +++++++++++++++++++++++++------------ + 3 files changed, 197 insertions(+), 116 deletions(-) + +commit c05e3b08b4cfa820a18e33b5012a6138b931788f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jan 24 09:51:58 2008 -0800 + + Remove ROADMAP and TODO, mentioning their URLs in README + + We're maintaining these as part of cairo's website now, + rather than as part of the source code. + + README | 18 ++++---- + ROADMAP | 149 ---------------------------------------------------------------- + TODO | 111 ----------------------------------------------- + 3 files changed, 8 insertions(+), 270 deletions(-) + +commit 21823842775988c0b58e3868dce053544ed246e2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 23 15:06:52 2008 -0500 + + [test] Minor fix for check-ref-dups rule + + test/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e7c0a69dcb627abb677f84473a9e3857b2d89a69 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 23 14:57:42 2008 -0500 + + [test] Also check for reference images listed in Makefile.am but missing + in git, and if this is not a git checkout, in source directory. + + test/Makefile.am | 36 +++++++++++++++++++++++++++--------- + 1 file changed, 27 insertions(+), 9 deletions(-) + +commit 188765c8e857c88a66656a454a3dbd27c32170f7 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Wed Jan 23 19:22:18 2008 +0100 + + improve comments for the pixman transformation anchoring math. + + src/cairo-matrix.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit b6c723644302c43b7aae098338092e578fe2f007 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Wed Jan 23 18:09:20 2008 +0100 + + update reference images for some non-aa testcases + + test/rectangle-rounding-error-ref.png | Bin 298 -> 231 bytes + test/rotate-image-surface-paint-ref.png | Bin 232 -> 209 bytes + test/unantialiased-shapes-ref.png | Bin 4449 -> 3968 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 5a0b15d2c9b5e9ef3aed1f01e8ea28a3f2c36216 +Author: Bertram Felgenhauer <int-e@gmx.de> +Date: Wed Jan 23 18:02:02 2008 +0100 + + anchor pattern transformations at the pattern origin + This keeps the rounding errors due to the conversion to 16.16 fixed point + numbers small and improves cairo's translation invariance. + + src/cairo-matrix.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 431e846c03b39495ac57834a8b65b7499472ef1b +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Jan 22 16:30:37 2008 -0800 + + cairo_point_int32_t is really int32_t, not int16_t + + Oops. + + src/cairo-types-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 02970ac8cf27bc9d42cf27848a97019d9dd13b6d +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Jan 22 15:32:11 2008 -0800 + + Fix usage of cairo_rectangle_int16_t leading to memory corruption + + cairo_rectangle_int16_t was being used in a number of places instead + of cairo_rectangle_int_t, which led to memory corruption when cairo was + using a fixed point format with a bigger space than 16.16 (such as 24.8). + + src/cairo-analysis-surface.c | 3 +++ + src/cairo-pdf-surface.c | 6 +++--- + src/cairo-scaled-font.c | 24 ++++++++++++------------ + src/cairo-surface-fallback.c | 9 ++------- + src/cairo-win32-private.h | 2 +- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + src/cairoint.h | 2 +- + 8 files changed, 26 insertions(+), 28 deletions(-) + +commit 1109ccfb4e5b078581a3b4a7e2d152681fa863ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 22 17:44:47 2008 -0500 + + [ROADMAP] Add item: Make cairo-ft respect FC_FT_FACE pattern element + + ROADMAP | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5024650d4d8d4fa890a531d9e54fed7beef8e2c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 22 12:45:50 2008 -0500 + + [test] Only summarize check results for the tests tested! + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 18181f12ae6c412fea984484355ff8bc1dfccb54 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 22 06:25:19 2008 -0800 + + Make Carl return from his time-traveling expedition + + test/rectilinear-miter-limit.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 95f3b425e6fb31b364b08e53e072fac4f5ed0733 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 22 01:03:02 2008 -0500 + + [cairo-path-stroke] Use M_SQRT2 for constant value + + src/cairo-path-stroke.c | 8 ++++---- + src/cairoint.h | 4 ++++ + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 1931ce1b3d491afe4f23670c82e428f95eb25e6d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 22 00:36:25 2008 -0500 + + [cairo-operator] Remove unused cairo-operator.c + + src/Makefile.am | 1 - + src/cairo-operator.c | 119 --------------------------------------------------- + src/cairoint.h | 7 --- + 3 files changed, 127 deletions(-) + +commit 47cf7ed769891b00abf96d14de6e79c0fa893cf9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 16:45:41 2008 -0800 + + Test and document that fill rule has no effect on cairo_path_extents + + src/cairo.c | 4 ++-- + test/get-path-extents.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 51 insertions(+), 2 deletions(-) + +commit 1ca186f51134e7d5969937760b068caba0070d31 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 16:34:24 2008 -0800 + + Disable rectilinear stroke optimization for small miter limit values + + This fixes the bug that was causing the recently added + rectilinear-miter-limit test case to fail. It passes + quite happily now. + + src/cairo-path-stroke.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 32efcc94627e8890969c4b36a78c831ced6f8d62 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 16:32:48 2008 -0800 + + Add new rectilinear-miter-limit test to demonstrate bug + + We're failing to respect the miter limit in the rectilinear + stroke optimization code. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/rectilinear-miter-limit-ref.png | Bin 0 -> 177 bytes + test/rectilinear-miter-limit.c | 80 +++++++++++++++++++++++++++++++++++ + 4 files changed, 83 insertions(+) + +commit 326342962daa694d876c03194e8a6c1b13f9a8d2 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 15:20:07 2008 -0800 + + Rename trailing_move_to_point to move_to_point + + And prefer TRUE and FALSE literals over 1 and 0. + + src/cairo-path-bounds.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +commit c480eedbb58dd03dd4b9b87b3985758ffbce7113 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 14:56:21 2008 -0800 + + Test and document extents of degenerate "dots" + + It's a common idiom to stroke degenerate sub-paths made with + cairo_move_to(x,y);cairo_rel_line_to(0,0) to draw dots. Test + that we get the desired extents from cairo_fill_extents, + cairo_stroke_extents, and cairo_path_extents for these cases. + + Also document that the cairo_path_extents result is equivalent + to the limit of stroking with CAIRO_LINE_CAP_ROUND, (so that + these "dot" points are included), as the line width + approaches 0.0 . + + src/cairo.c | 6 +++--- + test/get-path-extents.c | 28 ++++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+), 3 deletions(-) + +commit 55e0dddf0408046ea0ded419ebe45099a4eb563e +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 14:45:06 2008 -0800 + + Add cairo_path_extents testing to several cases missing it + + With these degenerate shapes, cairo_path_extents still returns + a zero-area rectangle, but with a non-zero offset. + + test/get-path-extents.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 63df3a82a3a4a035edf89152995a324449616059 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 13:47:05 2008 -0800 + + Fix cairo_path_extents to ignore lone cairo_move_to points. + + Update the documentation as well. + + src/cairo-path-bounds.c | 11 ++++++++++- + src/cairo.c | 40 +++++++++++++++++++++++++--------------- + 2 files changed, 35 insertions(+), 16 deletions(-) + +commit c15cab8b6855540436e457465c4766812c6def55 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 13:34:53 2008 -0800 + + Correct near-pangram to be an actual pangram + + This wasn't affecting the test quality at all, but it did annoy + me to see this mistake. + + test/get-path-extents.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ed695bdb9b1e4500f796c7f07a7cc2f3832b2a39 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 13:33:46 2008 -0800 + + Define repeated string literal once + + test/get-path-extents.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 80df194b77a4caac1d58132341f034596e500bda +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jan 21 12:14:49 2008 -0800 + + Clarify documentation of cairo_{fill,stroke,path}_extents + + Mostly just adding more cross-references between the documentation + of these three similar functions. + + src/cairo.c | 36 +++++++++++++++++++++++++----------- + 1 file changed, 25 insertions(+), 11 deletions(-) + +commit eba04b7fbcc7fdbf075ad1372208908634459178 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Jan 20 03:22:12 2008 +0000 + + [path] use new interpret_flat infrastructure for path_populate + + refactor to reduce duplication of flattening code. + + src/cairo-path.c | 50 +++++++++++++------------------------------------- + 1 file changed, 13 insertions(+), 37 deletions(-) + +commit 3270ae6a65105787942da8309fa874ee65bc79fe +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Jan 20 03:21:41 2008 +0000 + + [path] Use new interpret_flat infrastructure for path_count. + + Refactor to reduce duplication of path flattening code. + + src/cairo-path-bounds.c | 6 ----- + src/cairo-path.c | 62 ++++++++++++++----------------------------------- + 2 files changed, 18 insertions(+), 50 deletions(-) + +commit 4177208be63caa3128eaf07428f3d4617fcd18e0 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Fri Nov 16 22:43:43 2007 +0000 + + [cairo] Add cairo_path_extents() + + This new function gets the extents of the current path, whether + or not they would be inked by a 'fill'. It differs from + cairo_fill_extents() when the area enclosed by the path is 0. + + Includes documentation and updated test. + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-paths.sgml | 10 ++++++++++ + src/cairo-gstate.c | 11 +++++++++++ + src/cairo.c | 30 ++++++++++++++++++++++++++++++ + src/cairo.h | 5 +++++ + src/cairoint.h | 7 +++++++ + test/get-path-extents.c | 33 +++++++++++++++++++++++---------- + 7 files changed, 87 insertions(+), 10 deletions(-) + +commit d923457c0f40c9b34ee75d4d47b9bd0c3edfe669 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Jan 19 22:31:49 2008 +0000 + + [path-fixed] make _cairo_path_fixed_bounds use _cairo_path_fixed_interpret_flat + + _cairo_path_fixed_bounds can use the new _interpret_flat mechanism; this + results in tighter bounds; previously the bounds followed the control + points of the beziers, whereas now they are the bounds of the curve. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-path-bounds.c | 39 ++++++++++++++------------------------- + src/cairoint.h | 3 ++- + 3 files changed, 17 insertions(+), 27 deletions(-) + +commit 1471b3f00acddecdfc2617a62ab0e584f319dc1c +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Jan 19 22:31:10 2008 +0000 + + [path-fixed] add _cairo_path_fixed_interpret_flat + + _cairo_path_fixed_interpret_flat flattens the path as it + interprets it, meaning that a curve_to callback is not + required. + + src/cairo-path-fixed.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 9 +++++ + 2 files changed, 108 insertions(+) + +commit 3339c32b0aa44c4bae6e534f90d26aa342e3d717 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 20 02:56:26 2008 -0500 + + [cairoint.h] Move MSC inline macros into cairo-compiler-private.h + where they belong + + src/cairo-compiler-private.h | 10 ++++++++++ + src/cairoint.h | 11 ----------- + 2 files changed, 10 insertions(+), 11 deletions(-) + +commit ac17ce0f89b494a404756c8d24b21a7fb354218e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 20 02:54:16 2008 -0500 + + [cairo-fixed/wideint-private.h] Split out typedefs from prototypes + such that the type definitions can be used from boilerplate without exposing + the prototypes. + + src/Makefile.am | 2 + + src/cairo-fixed-private.h | 34 +--------- + src/cairo-fixed-type-private.h | 70 +++++++++++++++++++++ + src/cairo-types-private.h | 2 +- + src/cairo-wideint-private.h | 71 +-------------------- + src/cairo-wideint-type-private.h | 130 +++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 1 + + 7 files changed, 208 insertions(+), 102 deletions(-) + +commit f072d815d40e6fd44369424b68d54cea22da3a26 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Sat Jan 19 20:48:39 2008 -0500 + + [cairo-ft] Fix typo in comment + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0fb800ff2258d4642a2188a7f219db9620450bc2 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Sat Jan 19 20:47:59 2008 -0500 + + [cairo-ft] Add FC_PIXEL_SIZE as double, not int + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8887fb35936bb48acadc19a0c71d1b81ec8b481d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 20 01:14:19 2008 +1030 + + Fix PS/PDF Type 1 font embedding when glyph 0 is used + + cairo-scaled-fonts-subsets.c reserves position 0 in each subset for + glyph 0 (.notdef) as the font embedding of each font type requires + .notdef as the first glyph. For some reason this was done by reserving + the position then inserting glyph 0 in the collect function instead of + just adding the glyph to the hash table when the subset is + created. The problem this caused was that when an application called + show_glyphs() with glyph 0, the glyph was added to the hash table + (because it was not already there) resulting in two .notdef glyphs in + the subset. This resulted in breakage in the Type 1 subsetting where + the second .notdef was not emitted and all subsequent glyphs were + moved up one place resulting in incorrect font encoding in the PS/PDF + output. + + Fix this by adding .notdef to the subset hash table when the subset is + created. + + This fixes #13841. + + src/cairo-scaled-font-subsets.c | 36 +++++++++++++++++++----------------- + 1 file changed, 19 insertions(+), 17 deletions(-) + +commit 574bdd01fd5df8f378c901de5cd9b24bd720ad37 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 20 00:26:09 2008 +1030 + + Type1-subset: Add newline to the end of the font + + as some fonts do not have a newline at the end of the last line + + src/cairo-type1-subset.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit ec272fbd0980e8124d87ff5c17a5b751876fc9e2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jan 19 12:46:24 2008 +1030 + + Fix PDF extend-reflect test failure + + Previously, when emitting image patterns the PDF backend used + _cairo_pattern_acquire_surface to get the image. For reflected images + this would return an image containing four images in a reflect + pattern. When drawn in a PDF pattern (which only does repeating + patterns) this would create the reflected pattern in PDF. + + For some reason _cairo_pattern_acquire_surface is no longer returning + a reflected image pattern. + + This is fixed by only using _cairo_surface_acquire_source_image to get + the image and using the same code as is used for reflected + meta-surface patterns to created a reflected pattern by drawing four + transformed copies of the image inside the PDF patten. + + This is the better way to implement reflected images as we are no + longer embedding an image four times larger than the original. + + src/cairo-pdf-surface.c | 67 +++++++++++++++++++++++-------------------------- + 1 file changed, 32 insertions(+), 35 deletions(-) + +commit 50d0767c8bf4c738b86e10be09d5c4fd7e14a05f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 18 12:41:57 2008 -0800 + + Add a1-image-sample and a1-traps-sample tests + + Both of these currently fail due to bugs in the way pixman does + its sampling. + + test/.gitignore | 2 ++ + test/Makefile.am | 2 ++ + test/a1-image-sample-ref.png | Bin 0 -> 148 bytes + test/a1-image-sample.c | 83 +++++++++++++++++++++++++++++++++++++++++++ + test/a1-traps-sample-ref.png | Bin 0 -> 148 bytes + test/a1-traps-sample.c | 72 +++++++++++++++++++++++++++++++++++++ + test/cairo-test.c | 2 ++ + 7 files changed, 161 insertions(+) + +commit c11790fded69ed476e7740ed86e4a66bf878d2d3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 16:32:36 2008 -0800 + + Quiet a warning about switch without some cairo_surface_type_t enum values + + src/cairo-paginated-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 1d6c2d578fa717906ba8fd0a897c52033179e938 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 16:19:40 2008 -0800 + + Remove some gratuitous assert statements + + Calling assert immediately after assigning a literal value is + very bad form. + + src/cairo-image-surface.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit eabd28a655f8ddc73ff71583bb658db796e932cd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 18 21:53:04 2008 +1030 + + win32-printing: define GRADIENT_FILL_RECT_H bug #14107 + + Older versions of mingw do not define this. + + src/cairo-win32-printing-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0086db893cba90dc73824d77c661d2965ad48112 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 22:31:05 2008 +0000 + + [cairo-font-options] Treat NULL as a default cairo_font_options_t + + Interpret a NULL cairo_font_options_t as the default values - i.e + as if it were a fresh pointer returned by cairo_font_options_create(). + + src/cairo-font-face.c | 8 +++-- + src/cairo-font-options.c | 51 ++++++++++++++++++++++----- + src/cairo-ft-font.c | 16 +++++---- + src/cairo-gstate.c | 2 +- + src/cairo-scaled-font.c | 18 ++++++---- + src/cairo-win32-font.c | 4 +-- + src/cairo.c | 10 +++--- + test/.gitignore | 1 + + test/Makefile.am | 12 ++++--- + test/font-options.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ + 10 files changed, 177 insertions(+), 36 deletions(-) + +commit 02d0e070638f668bf50a8ce2174c21e5614dd6c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 21:39:31 2008 +0000 + + [cairo-font-options] Use cairo_font_options_status() rather open-coding. + + By switching to cairo_font_options_status() instead of checking against + the _cairo_font_options_nil error object, the API is protected from NULL + dereferences. + + src/cairo-font-options.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit b15e91d2b6c229dfe3da4a354306915cc42f75bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 21:11:00 2008 +0000 + + [cairo-font-options] Check for a NULL cairo_font_options_t + + On IRC Drakou reported a user error whereby cairo_scaled_font_create() + was called with a NULL cairo_font_options_t. However, instead of + reporting the error back to the user, cairo instead segfaulted trying + to dereference the NULL pointer! + + Add a guard to check that the options is not NULL. + + src/cairo-font-options.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 630536f17681b083db658414d68db2c0eb167af3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 17:44:57 2008 +0000 + + [test/extend-*] Add various cairo_pattern_set_extend() test cases. + + Add various test cases to exercise + _cairo_pattern_acquire_surface_for_surface(), most notably using similar + source surfaces to provide coverage of the non-image surface branch. + + test/.gitignore | 4 ++ + test/Makefile.am | 11 +++- + test/cairo-test.c | 2 - + test/extend-pad-similar.c | 105 ++++++++++++++++++++++++++++++++++++ + test/extend-reflect-similar-ref.png | Bin 0 -> 153571 bytes + test/extend-reflect-similar.c | 56 +++++++++++++++++++ + test/extend-reflect.c | 2 + + test/extend-repeat-ref.png | Bin 0 -> 108622 bytes + test/extend-repeat-similar-ref.png | Bin 0 -> 108622 bytes + test/extend-repeat-similar.c | 56 +++++++++++++++++++ + test/extend-repeat.c | 34 ++++++++++++ + 11 files changed, 267 insertions(+), 3 deletions(-) + +commit dec2daeaf396be9dc6e8952417cc615d3a607926 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 15:34:51 2008 +0000 + + [cairo-{ps,pdf}-surface] Assert the font is supported during emission. + + Add an ASSERT_NOT_REACHED to the tail of the font subset emission + functions - as they should always, at least, be supported by the + fallbacks. + + src/cairo-pdf-surface.c | 2 ++ + src/cairo-ps-surface.c | 2 ++ + 2 files changed, 4 insertions(+) + +commit bde68fd4d6271daf8ca374e472deab95a9a7acff +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 15:06:13 2008 +0000 + + [cairo-scaled-font] Propagate the error to the font. + + If we encounter an error whilst using the font backend to convert the + text to the glyphs, flag the scaled font with that error. + + src/cairo-scaled-font.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit d664e3253e3c310c34264eb0070c2c3c309e071b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 15:05:10 2008 +0000 + + [cairo-scaled-font] Typo. + + s/ZERO_EXENTS/ZERO_EXTENTS/ + + src/cairo-scaled-font.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fcdc525dde52c3bf7124d00a98b6be64ca522cb9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 14:47:43 2008 +0000 + + [cairo-xlib] Remove the NULL safeguards. + + No need to guarding against the pointer being NULL on internal functions + as no path can call the function will a NULL pointer and no path should + ever try, which in any case it would be better to crash immediately. + + src/cairo-xlib-display.c | 7 +------ + src/cairo-xlib-screen.c | 6 ------ + 2 files changed, 1 insertion(+), 12 deletions(-) + +commit 7b1a0eddacb290ae0d67fa974da1697b2c9ce38c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 13:51:21 2008 +0000 + + [test/get-path-extents] Exercise cairo_scaled_font_text_extents() + + Compare cairo_scaled_font_text_extents() to cairo_text_extents() in + order to provide test coverage of cairo_scaled_font_text_extents(). + + test/get-path-extents.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +commit dbc97c2576320126e0cddd833ac88320af995d77 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 13:41:19 2008 +0000 + + [text] Set the extents on the error paths. + + Ensure the text extents are initialized (zeroed) if we encounter an + error along for any of the text extents functions. + + src/cairo-scaled-font.c | 19 ++++++++++++++++--- + src/cairo.c | 35 +++++++++++++++++++---------------- + 2 files changed, 35 insertions(+), 19 deletions(-) + +commit aec7ae67aa72f3105232fa7a66c1ea013c840da1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 13:28:55 2008 +0000 + + [test/text-zero-len] Test the public cairo_scaled_font_* with NULLs. + + Pass NULL to cairo_scaled_font_(text|glyph)_extents() to test the + consistency of the extents API. + + test/text-zero-len.c | 33 +++++++++++++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + +commit 390e22894b093184e489ea762ffc29eeb1c81d2b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 13:13:40 2008 +0000 + + [test/in-fill-trapezoid] Add a few holes. + + Complete the coverage of _cairo_trap_contains() by cutting holes out of + the simple shapes. + + test/in-fill-trapezoid.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit da9c43329ad09ccf48f8a71d28848f111af7ecb5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 11:22:19 2008 +0000 + + [test/in-fill-trapezoid] Add test to exercise _cairo_trap_contains(). + + A simple test to provide coverage of _cairo_trap_contains(), though + not yet seeking boundary conditions. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/in-fill-trapezoid.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 68 insertions(+) + +commit f638e5ea355cf0268a4b099ce7b8b98c69df6b67 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 11:03:50 2008 +0000 + + [cairo-region] Review status propagation. + + Check that the error status is propagated from _cairo_region_*. + + src/cairo-clip.c | 2 +- + src/cairo-glitz-surface.c | 50 +++++++++++++++++++++++++---------------------- + src/cairo-surface.c | 7 ++----- + 3 files changed, 30 insertions(+), 29 deletions(-) + +commit 248f0060e5317f53a688ea0e0aea2997824fa996 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 10:10:55 2008 +0000 + + [cairo-analysis-surface] Return the nil surface rather than NULL. + + On error return a nil surface that represents the error rather than + making the assumption of a NO_MEMORY error in the caller. + + src/cairo-analysis-surface.c | 5 +---- + src/cairo-paginated-surface.c | 5 ++--- + 2 files changed, 3 insertions(+), 7 deletions(-) + +commit dd13a00541ebd85bb7687add8b76fa3fb1d82b95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 17 10:09:22 2008 +0000 + + [test/get-path-extents] Check extents of degenerate paths. + + Ensure that degenerate paths have zero extents. + + test/get-path-extents.c | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit 3f202c081d211d5ac6c28ce96cd0f57f8bb26aac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 23:42:24 2008 +0000 + + [Makefile.am] Another path massage for lcov. + + Beware the inline functions in the headers that are now being pulled + into the boilerplate code. + + Makefile.am | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 9ebfa8b5fb82596341b9ca0f19c362f24a7ff782 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 20:35:41 2008 +0000 + + [Makefile.am] Couple check-ref-missing into release-check + + Verify that all the reference images checked into git will be included + within the distribution tarball as early as possible in the release + process. + + Makefile.am | 6 +++++- + test/Makefile.am | 16 ++++++++++++---- + 2 files changed, 17 insertions(+), 5 deletions(-) + +commit f9a80c06b40634ffef00770731d3b433e465a1b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 23:28:27 2008 +0000 + + [cairo-path-stroke] Convert degenerate splines into lines. + + This fixes a discrepancy in the stoker between splines and lines, + whereby the stroker failed to add a dash for a zero length spline. + + src/cairo-path-stroke.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2621a323a0ccfe33ff42ed17536db0dc89473a9f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 23:24:41 2008 +0000 + + [test/dash-curve] Add a new test case for dashes along splines. + + Modify the dash-state test case and use curves instead of lines - + exercises _cairo_stroker_curve_to_dashed() and degenerate splines. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/dash-curve-ref.png | Bin 0 -> 39642 bytes + test/dash-curve.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 77 insertions(+) + +commit bb41fa22e3d3b1fe4b3e802ecf7d8041eacda3fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 23:21:53 2008 +0000 + + [Makefile.am] Further massage lcov paths for srcdir != builddir. + + The lcov scripts generate incorrect absolute paths to the builddir for + source files - so convert them to srcdir using sed. + + Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0a4ced5a2659b168fe8d1a6e3917f79fd5c66ae5 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 10:47:46 2008 -0800 + + Increment version to 1.5.7 after the 1.5.6 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d2a02d4f5ccb1c6dc7f8cca0c322b72f1638d25b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 10:34:17 2008 -0800 + + Remove check-has-hidden-symbols.i on 'make distclean' + + Without this, 'make distcheck' fails so releases don't happen. + + src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 5c3a0b5c0044bff1262d583e38f84d48d407f0d9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 10:22:44 2008 -0800 + + Add miter-precision-ref.png tothe distribution. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit cb1ddc4e475ff783960925139e85f6fada56213a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 10:10:39 2008 -0800 + + Replace -I($builddir) with -I. to avoid breaking non-srcdir builds. + + This variable was expanding to an empty string, so the next -I flag + was getting completely swallowed. Let's avoid being clever and just + use . which is what we want in the expansion anyway. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad8d03967a2b68ab88a428df6b9d68e76002a88f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 15 15:50:54 2008 -0800 + + Increment version to 1.5.6 and to 15:0:13 + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fe27f4b9a34946b121b4259f057fdf3c52d1371b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Jan 15 15:47:48 2008 -0800 + + NEWS: Add notes for cairo 1.5.6 + + NEWS | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 95 insertions(+), 5 deletions(-) + +commit 1bccbd88c38c4438e94cf8936228c75e47be0af4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 16:33:22 2008 +0000 + + [cairo-pdf-surface] Review error propagation from output stream. + + Ensure that errors encountered whilst processing the output stream are + propagated back to the surface (and the user). + + src/cairo-pdf-surface.c | 291 ++++++++++++++++++++++++------------------------ + 1 file changed, 147 insertions(+), 144 deletions(-) + +commit 20151fc53401dcc53ef3ab6a78c91a0a02afe497 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 16:33:22 2008 +0000 + + [cairo-ps-surface] Review error propagation during surface creation. + + Track the error during surface creation so that it can be returned to + the user via _cairo_surface_create_in_error(). + + src/cairo-ps-surface.c | 36 +++++++++++++++++------------------- + 1 file changed, 17 insertions(+), 19 deletions(-) + +commit 3daa63693c2f8f9cc3c7fa41ef1e4d69bd67b3cc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 16:33:22 2008 +0000 + + [cairo-svg-surface] Review error propagation during surface creation. + + Track the error during surface creation so that it can be returned to + the user via _cairo_surface_create_in_error(). + + src/cairo-svg-surface.c | 124 ++++++++++++++++++++++++++---------------------- + 1 file changed, 66 insertions(+), 58 deletions(-) + +commit 7111b18c27d7ee0439339a6aa72f0e4244f883f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 16:23:23 2008 +0000 + + [cairo-surface] Introduce _cairo_surface_create_in_error(). + + Unexport all the static error surfaces and use a function to select + the appropriate error surface for the status. + + src/cairo-array.c | 3 +- + src/cairo-glitz-surface.c | 20 ++---- + src/cairo-image-surface.c | 136 ++++--------------------------------- + src/cairo-meta-surface.c | 12 ++-- + src/cairo-os2-surface.c | 22 +++--- + src/cairo-paginated-surface.c | 8 ++- + src/cairo-pdf-surface.c | 11 ++- + src/cairo-png.c | 38 ++++++----- + src/cairo-ps-surface.c | 9 +-- + src/cairo-quartz-surface.c | 32 ++++----- + src/cairo-surface-fallback.c | 6 +- + src/cairo-surface.c | 62 +++++++++++------ + src/cairo-svg-surface.c | 20 ++---- + src/cairo-win32-printing-surface.c | 10 +-- + src/cairo-win32-surface.c | 37 ++++------ + src/cairo-xcb-surface.c | 18 ++--- + src/cairo-xlib-surface.c | 26 +++---- + src/cairo.c | 4 +- + src/cairoint.h | 6 +- + src/test-fallback-surface.c | 5 +- + src/test-meta-surface.c | 18 +++-- + src/test-paginated-surface.c | 5 +- + 22 files changed, 185 insertions(+), 323 deletions(-) + +commit 5cbc45488e276cb6e6ecfa7bc7dd4fae342de85e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 16:29:19 2008 +0000 + + [cairo-output-stream] Introduce _cairo_output_stream_create_in_error() + + Use a utility function to wrap an incoming error status into a new + error stream. As a side-effect, all error streams must be destroyed as + in the general case the caller can not distinguish between a static + error object and one allocated to hold an unusual error status. + + src/cairo-base85-stream.c | 3 +++ + src/cairo-deflate-stream.c | 7 ++----- + src/cairo-output-stream-private.h | 3 +++ + src/cairo-output-stream.c | 26 ++++++++++++++++++++++++-- + src/cairo-ps-surface.c | 10 +++++++--- + src/cairo-type1-fallback.c | 8 ++++---- + src/cairo-type1-subset.c | 5 +++-- + 7 files changed, 46 insertions(+), 16 deletions(-) + +commit 2c10c7559db11ccf511e119f4d4fb2da97508786 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 16 13:37:48 2008 +0000 + + [Makefile.am] Add -I$(builddir) for .c.i target + + Updated the CPP command so that it can find <cairo-features.h> in the + local build directory. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e49db8ed3ea5727e00e2734a8877af860371be69 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jan 16 08:11:51 2008 -0800 + + Fix create-for-stream test to log its failure properly + + Without this, a failure of this test won't be nicely reported + in the post-make-check summary. (Also fix a silly little typo + in the svg-clip test.) + + test/Makefile.am | 1 - + test/create-for-stream.c | 13 +++++++++++-- + test/svg-clip.c | 2 +- + 3 files changed, 12 insertions(+), 4 deletions(-) + +commit 57c2b75c229ac7811c573548ae50e6b0e4ecf862 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Jan 15 14:27:14 2008 -0800 + + [quartz] Store the CGFontRef and reuse it for rendering + + Previously the CGFontRef was recreated each time in show_glyphs; this + caused the font to get re-embedded in any PDF files that were being + generated through Quartz. + + src/cairo-atsui-font.c | 18 ++++++++++++++++++ + src/cairo-quartz-private.h | 3 +++ + src/cairo-quartz-surface.c | 10 ++-------- + 3 files changed, 23 insertions(+), 8 deletions(-) + +commit 968eaf3c44f37ada9c1d7005fc84ead797e11b58 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 14 18:09:32 2008 +0000 + + [cairo-xlib] Fixup --disable-xlib-xrender + + Fixup the headers and boilerplate to compile and run correctly when + configured with --disable-xlib-xrender. + + boilerplate/Makefile.am | 2 +- + boilerplate/cairo-boilerplate-xlib-private.h | 2 ++ + boilerplate/cairo-boilerplate-xlib.c | 29 ++++++++++++++++------------ + boilerplate/cairo-boilerplate.c | 2 +- + src/Makefile.am | 2 +- + src/cairo-freelist-private.h | 3 +-- + src/cairo-xlib-display.c | 1 + + src/cairo-xlib-private.h | 6 +----- + src/cairo-xlib-screen.c | 1 + + src/cairo-xlib-surface-private.h | 2 ++ + src/cairo-xlib-surface.c | 6 ++++++ + src/cairo-xlib-xrender-private.h | 3 --- + src/cairo-xlib-xrender.h | 8 ++++---- + test/xlib-surface.c | 1 - + 14 files changed, 38 insertions(+), 30 deletions(-) + +commit 22d7f311f7733a57ece5d91708b2b5da9b71de86 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 14 16:14:02 2008 -0500 + + [scaled-font] Upgrade glyph mask as needed in case of mixed-format glyphs + + In ecb895803b9d2a3fd142f4a2c694ca08c5581f0e Carl made fallback show_glyphs + always use a A8 mask in case of mixed-format glyphs. That's suboptimal if + there are ARGB32 glyphs. Using masks smartly we can implement the desired + behavior. Done now. + + src/cairo-image-surface.c | 18 ++++++++++++++++ + src/cairo-scaled-font.c | 54 ++++++++++++++++++++++++++--------------------- + src/cairoint.h | 3 +++ + 3 files changed, 51 insertions(+), 24 deletions(-) + +commit a5e5c1b5b04dd1d1138e96b7f4c097f14a1cd2cd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 13 15:00:58 2008 +0000 + + [test] Add a custom hook to summarise the failures. + + Add a check-local hook that scans the log fails and displays a list + of failed tests (and the failing targets). + + test/Makefile.am | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 8d6249b2c1200dfaf3e98c40e82ab2796e9ef28c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 13 11:40:53 2008 +0000 + + [cairo-scaled-font] Add missing matrix guard to cairo_scaled_font_create(). + + cairo_scaled_font_create() did not check the user supplied ctm was valid, + triggering an assertion later when computing the scale factors. + + src/cairo-scaled-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3f59ef95482db478230bb7634209bb826b6a06d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 13 11:21:39 2008 +0000 + + [cairo-matrix] Tidy usage of HAVE_ISFINITE. + + Use a macro to switch between isfinite() and its fallback in order to + avoid using an #ifdef from within a function. + + src/cairo-gstate.c | 25 ++++++------------------- + src/cairo-matrix.c | 25 ++++++------------------- + 2 files changed, 12 insertions(+), 38 deletions(-) + +commit 5e32dcf863cc8f40e2679c8c8c42e3ac927ab3c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 13 11:10:28 2008 +0000 + + [cairo-gstate] Check that the matrix remains invertible. + + Ensure that the ctm remains invertible after multiplying the user + supplied matrices. Although the arguments are checked so that they are + valid per se, we double check that the result after multiplication is + still a valid invertible matrix. This should catch pathological cases + where the user concatenates a long series of matrix operations, which + either exceed our numerical limits or become degenerate through rounding + errors. + + src/cairo-gstate.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 2f600affaa9ac3537013c69643878731a2f4389e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 13 11:02:55 2008 +0000 + + [cairo-gstate] Add isfinite guards to the transformation ops. + + If we have isfinite() available use it to check that the user supplied + arguments are valid. + + src/cairo-gstate.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit 3fed79d1c24f07618243bb197b44a9fd106aebbc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jan 13 10:28:11 2008 +0000 + + [cairo-paginated-surface] Set error on surface for operations done its behalf. + + Ensure that the error is propagated to the target surface if we fail + whilst performing an operation on its behalf, for example set the size + of the paginated surface. + + src/cairo-paginated-surface.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 481b88dd6b19c267feaf05652974225e86aa8007 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 12 20:35:56 2008 +0000 + + [cairo-pattern] Add an ASSERT_NOT_REACHED + + On the default case for an unknown pattern type, add an assert that the + code is never reached, and just in case upgrade the error to a fatal + PATTERN_TYPE_MISMATCH. + + src/cairo-pattern.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 973d5fa8a50fbb0fb760f2e32a227a6238d074da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 12 11:04:03 2008 +0000 + + [test] Sort TESTS + + A couple of tests were out of order, causing a bit of confusion in the + user. + + test/.gitignore | 2 +- + test/Makefile.am | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit ac98c9e572135f5f46303ce49e6a04f86efe2676 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 12 10:49:48 2008 +0000 + + [test/rel-path] Check that invalid relative paths raise an error. + + Check that NO_CURRENT_PATH is raised if a relative path op is used + on a new path. + + test/rel-path.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 66 insertions(+) + +commit 6cc75cfe5b962566938189b5a7dd63135e981300 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 12 10:30:15 2008 +0000 + + [cairo] Harden the text API against NULL strings. + + Handle NULL strings in cairo_show_(text|glyph), + cairo_(text|glyph)_(extents|path) without crashing. + + src/cairo.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 864dab828b4c860668adb48ff9361e9969b5259f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 12 10:01:36 2008 +0000 + + [test/text-zero-len] Test passing NULLs to the API. + + Check that the public API handles NULL - at the moment the code + is a little inconsistent and crashes! + + test/text-zero-len.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 44 insertions(+), 1 deletion(-) + +commit ae1e044e328deec7a430de3724a7ae0ad958d22d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 12 00:31:42 2008 +0000 + + [cairo-matrix] Use isfinite() to check matrix determinant. + + The current NaN check is insufficient as it classifies inf as a valid + determinant. We can improve the test by using isfinite() - but only + when it is available. We use the feature test macros as being the + simplest way of determining the presence of isfinite() as it may be + implemented as a macro, making checking for its usability troublesome + during configure. + + src/cairo-matrix.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 3610841910714f0bca07caeb606be9c69fd9d4c8 +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Fri Jan 11 14:36:05 2008 -0800 + + Fix typo in comment. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0b9124069271593be390d9835fcd1527b20770e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 21:55:52 2008 +0000 + + [check-plt.sh] Ensure that $MAKE is defined. + + Copy the check from check-def.sh now that $MAKE is also used in + check-plt.sh + + src/check-plt.sh | 1 + + 1 file changed, 1 insertion(+) + +commit 92c744978f0c08456cf0ec8dca87abebf6a6d150 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 21:54:58 2008 +0000 + + [Makefile.am] Tweak the flags passed to CPP. + + Adjust the flags passed to $(CPP) to match those used in the + surrounding targets (splint and sparse), which should improve their + reliability. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36f5d69a1165f81e97b50c64dde33fa19db36326 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 11 16:48:55 2008 -0500 + + [src/Makefile.am] Tweak includes a bit + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ed113ef4229e23d137b2673f233a23064f51ff24 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 21:13:05 2008 +0000 + + [check] Move the hidden symbol check into check-{def,plt}.sh + + Behdad, once again the arbiter of good taste, objected to the use of + the dotfile within the Makefile, and suggested that one calls $MAKE to + pre-process the source file from within the check scripts. + + Doing so removes the ugly wart added to Makefile.am... + + src/Makefile.am | 14 +++++--------- + src/check-def.sh | 4 ++-- + src/check-has-hidden-symbols.c | 11 +---------- + src/check-plt.sh | 4 ++-- + 4 files changed, 10 insertions(+), 23 deletions(-) + +commit bcf0c442b91b553b226c78d254906f7127013391 +Merge: ecb8958 8a6a0b4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 11 12:30:15 2008 -0800 + + Merge branch 'master' of git.cairographics.org:/git/cairo into cairo + +commit ecb895803b9d2a3fd142f4a2c694ca08c5581f0e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jan 11 12:28:49 2008 -0800 + + Migrate glyph mask to A8 in case of mixed-format glyphs. + + This fixes the remaining image-backend problems with bug 13479: + + Ugly Courier New font with cairo 1.4.12 + https://bugs.freedesktop.org/show_bug.cgi?id=13479 + + although the xlib-backend had been fixed previously. + + Specifically, if an A1 glyph is first encountered, then subsequent + glyphs will still be rendered with antialiasing, (previously they + would be rendered very poorly without antialiasing). + + Similarly, if the first glyph encountered has component-alpha + sub-pixel antialiasing and then an A1 or A8 glyph is encountered + then all glyphs will rendered in A8 (grayscale antialiasing). + Previously, the non-subpixel-antialiased glyphs would not appear + at all. + + src/cairo-scaled-font.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 47 insertions(+), 3 deletions(-) + +commit 8a6a0b43dc249acb0ad8cb9c6f16360294bcfdc3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 18:47:19 2008 +0000 + + [check] Replace compiled symbol visibility checker with shell script. + + Behdad Esfahbod objected to the execution of a compiled program to check + symbol visibility as it makes cross-compilation more difficult. + + Instead of executing the program, this method conditionally exports + a variable if cairo uses symbol hiding and scans the executable for + that symbol in a similar manner to check-def.sh. This has the slight + advantage of using the Makefile for performing the compilation, rather + than attempting to invoke $(CPP) from a shell script within the test + environment. + + src/Makefile.am | 12 ++++++++---- + src/cairo-compiler-private.h | 5 ++--- + src/check-def.sh | 11 ++++++----- + src/check-has-hidden-symbols.c | 12 ++++++++++++ + src/check-plt.sh | 14 ++++++++------ + src/compiler-supports-visibility.c | 6 ------ + 6 files changed, 36 insertions(+), 24 deletions(-) + +commit 982f65081f987e2c44f05942411c031bd32fd968 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 17:25:33 2008 +0000 + + [cairoint.h] Compile time check for a font backend. + + Add a paranoid check that at least one font backend is available - this + should have been already caught by configure, but it should help if a new + font backend is ever added. + + src/cairoint.h | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 6d3ed950ea075ff2a5a569365b46c3cfc4152787 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 16:16:20 2008 +0000 + + [check] Skip def/plt tests if the compiler doesn't support symbol hiding. + + Compile a trivial program such that it reports whether cairo is hiding + its internal symbols and skip the tests that depend upon it. + + This prevents false errors, such as bug 12726, where the user is + presented with a scary make check failure. + + src/Makefile.am | 5 +++++ + src/cairo-compiler-private.h | 3 +++ + src/check-def.sh | 5 +++++ + src/check-plt.sh | 5 +++++ + src/compiler-supports-visibility.c | 6 ++++++ + 5 files changed, 24 insertions(+) + +commit be146f02e0e220aa70217bf348beef301a56f898 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 15:28:52 2008 +0000 + + [Makefile.am] Update cairo.def after the set of enabled features is modified. + + Bug 13342 corresponds with a rebuild of cairo after removing + --enable-glitz from the configure line. Under these circumstances, + the remaining installable headers are not modified and therefore + cairo.def is not rebuilt and still expects to find a reference to + cairo_glitz_surface_create. The solution is to rebuild cairo.def after + any modification to the 'public' headers (installable or otherwise). + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c26784dbb6d3c90f9e3fa722efa0f9f4fd59bd4c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 11 14:04:56 2008 +0000 + + [configure] Version bump for $(EXEEXT) + + Adrian Johnson found that adding $(EXEEXT) to TESTS broke the build + under mingw. After a bit of investigation, the issue was tracked down + to being caused by automake-1.7. Bump the autotools version + requirements to avoid the breakage. + + configure.in | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 2574cc35b3478e7333bd4953e90a3edc5f7c4f16 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 11 22:07:26 2008 +1030 + + win32-printing: Do not clip and paint with an empty path + + For non solid patterns _fill and _show_glyphs sets a clip + path then paints the pattern. Previously if the path is empty + SelectClipPath did not set clip. This was probably the cause + of bug 13657 where the entire page was black. + + Fix this by not painting anything if the path is empty. + + src/cairo-win32-printing-surface.c | 8 ++++++-- + src/cairo-win32-private.h | 1 + + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 7ef4caaf11379cb50a08520f729552553de60660 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 11 22:06:51 2008 +1030 + + win32-printing: use fill instead of clip for non win32 fonts + + Non Windows fonts are drawn by getting the outline path, setting + this is the clip path, and painting the source pattern. For + solid colors this can avoid the clip and just do a fill. + + src/cairo-win32-printing-surface.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit ef56a6fd93d6192ee1f1948d11c75878aea40f4e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 11 22:05:54 2008 +1030 + + PS: Don't use language level check in EPS + + As 'showpage' and 'quit' can not be used in EPS. + + src/cairo-ps-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit b703199525ca02274ef5a8474cdae0cb70705964 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 11 22:05:13 2008 +1030 + + Type1-subset: Font name may be NULL + + If the FreeType face->family_name is NULL use a CairoFont-x-y name. + + src/cairo-type1-subset.c | 37 ++++++++++++++++++++++++------------- + 1 file changed, 24 insertions(+), 13 deletions(-) + +commit 6418a8be8719c9a969d9ec1f8624c841db9d2b90 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 21:35:05 2008 +0000 + + [test/.valgrind-suppressions] Update for amd64/sid + + Update the valgrind suppressions for the libz and Xrm spam. + + test/.valgrind-suppressions | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +commit 2e5f278da11369073eefeeedff7211bacb31ace1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 22:11:42 2008 +0000 + + [cairo-pattern] Free the copied pattern on error. + + Free the locally allocated pattern if the copy fails. + + src/cairo-pattern.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit db246f2fa22920a996a32f11233228e9af1d1abb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 21:32:47 2008 +0000 + + [cairo-traps] Typo caught by valgrind. + + ==3429== Conditional jump or move depends on uninitialised value(s) + ==3429== at 0x4E3FB0F: _cairo_box_round_to_rectangle (cairo-fixed-private.h:196) + ==3429== by 0x4E34B29: _cairo_clip_intersect_to_rectangle (cairo-clip.c:162) + ==3429== by 0x4E31943: cairo_push_group_with_content (cairo.c:495) + ==3429== by 0x403044: draw (clip-zero.c:48) + ==3429== by 0x404221: cairo_test_expecting (cairo-test.c:377) + ==3429== by 0x64701C3: (below main) (libc-start.c:222) + + Caused by setting extents->p2.y to zero twice. + + src/cairo-traps.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 10f6ef98f645d9f9f54d88fcf18683771258d36f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 17:50:45 2008 +0000 + + [gitignore] Add mkinstalldirs. + + Ignore another autoconf utility script. + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit da769b53e89b1f1ff91886a12a388e5fadec47bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 17:23:56 2008 +0000 + + [configure.in] Fixup usage of _CHECK_FUNCS_WITH_FLAGS within PKG_CHECK_MODULE. + + An unwanted side-effect of the recent fix for the paranoid extra check + for a usable library was that it broke the logic for the absence of the + module. + + configure.in | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 409e91b576ad992b41c66c952931c4a3e652dbf9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 15:53:54 2008 +0000 + + [cairo-pdf-surface] Review error handling. + + Ensure all errors are propagated back to the caller with locally + allocated resources destroy as required. + + src/cairo-pdf-surface.c | 261 ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 177 insertions(+), 84 deletions(-) + +commit 6134600988a6b5fcbc72f7897bfc83b37949b677 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jan 8 14:14:33 2008 +0000 + + [cairo-pdf-surface] Skip emitting the font subset if not among resources. + + Do not emit the font_subset if we did not successfully add it to the list + of font resources - can only happen after an error + + src/cairo-pdf-surface.c | 35 +++++++++++++++++++++++------------ + 1 file changed, 23 insertions(+), 12 deletions(-) + +commit 755a4bb51b458fbc059b6306e371d9dc1c906b04 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 15:30:42 2008 +0000 + + [test] Win32 printing backend testing depends upon ghostscript + + Using the Win32 printing backend requires ghostscript, so only enable + those tests if we detect 'gs' during configure. + + boilerplate/cairo-boilerplate.c | 2 ++ + configure.in | 17 +++++++++++++++++ + 2 files changed, 19 insertions(+) + +commit 02b0743458655f44ffc4d429b4ac355df42071f1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 15:22:16 2008 +0000 + + [cairo-pattern] Rearrange CAIRO_MUTEX_INITIALIZE. + + test/pattern-get-type exposes a bug whereby we try to acquire the + _cairo_pattern_solid_pattern_cache_lock before initializing the + mutexes. To fix this move the CAIRO_MUTEX_INITIALIZE() from the + depths of _cairo_pattern_init() and perform it at the public entry + points. + + src/cairo-pattern.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit cbe8d3855efd1254089c1c855c337df326ea52d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 15:14:15 2008 +0000 + + [test] Fixup make check for mingw + + Add EXEEXT to TESTS so that mingw builds the correct target. + + perf/Makefile.am | 8 +- + test/Makefile.am | 313 ++++++++++++++++++++++++++++--------------------------- + 2 files changed, 161 insertions(+), 160 deletions(-) + +commit 9ae4b219e1c5b7a8c139b004a97d86a1ce1d408c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 14:47:16 2008 +0000 + + [test/solid-pattern-cache-stress] Check for drand48(). + + Apply an alternative rand() function if drand48() is not available for + the platform. + + configure.in | 2 +- + test/solid-pattern-cache-stress.c | 12 ++++++++++-- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit 648289c639618cc31394f889f6e329ddcaca41ee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 14:36:57 2008 +0000 + + [configure.in] Add paranoid double checking for (svg|pdf)2png + + Due to my incomplete cross-build environment, configure detects the + presence of rsvg and poppler, but they cannot be used. To make my life + easier, add a check similar to that used for fontconfig to ensure the + libraries are usable before compiling the optional test utilites. + + configure.in | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 909c57ce158e41bf2761f82b2678dc1f390051d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 12:45:58 2008 +0000 + + [cairo-pdf-operators] Be consistent in error checks. + + Consistently check the output status at the end of each function - + helps with early error detection and even improves test code coverage! + + src/cairo-pdf-operators.c | 39 ++++++++++++++++++++------------------- + 1 file changed, 20 insertions(+), 19 deletions(-) + +commit 4ffb0a80b3aa9e54804082a24c58db0d2527073d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 12:51:07 2008 +0000 + + [cairo-paginated-surface] Call the abstract cairo_surface_show_page (). + + Use the generic surface layer cairo_surface_show_page() instead of + directly calling cairo_paginated_surface_show_page(), as the higher + level performs more error checking. + + src/cairo-paginated-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9d49c4b10e636c0868d15c50cb1d2a724000fc07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 14:18:25 2008 +0000 + + [configure] Print version info in summary. + + Add the cairo version to the configure summary. + + configure.in | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit ea4dec08f7c62ad3c3e81aa06ce0dd5a08936c45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 13:50:42 2008 +0000 + + [configure.in] Fixup fontconfig check. + + Correct the check for FcFini() so that the result is actually used. + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f4e7e7d6b4bb8e96dc8aef1ac673b8d64f65634c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 13:08:23 2008 +0000 + + [cairo-path-bounds] _cairo_path_fixed_bounds() should never fail. + + _cairo_path_fixed_bounds() should never fail so change return type + to void and update caller. + + src/cairo-analysis-surface.c | 12 ++++-------- + src/cairo-path-bounds.c | 8 ++++---- + 2 files changed, 8 insertions(+), 12 deletions(-) + +commit 5fad969317186520ebbe09f3767907fb3bfd6164 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jan 7 10:03:51 2008 +0000 + + [cairo-ft-font] Destroy unscaled font ref on error. + + Destroy the local reference taken to the unscaled font if we encounter + an error whilst creating the derived scaled font. + + src/cairo-ft-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3b1411167c7d9fd94536c69de54dacfaf820e916 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 12:55:08 2008 +0000 + + [headers] Brute force fixup of including cairoint.h from boilerplate. + + More the majority of the typedefs from cairoint.h to + cairo-types-private.h and fixup cairo-pdf-operators-private.h to + avoid including cairoint.h. + + A better approach would seem to be to rationalise cairoint.h so that it + only provides the symbol aliasing, moving the types and functions to + more appropriate private headers. However, this fixes the immediate + problem of running make check! + + src/cairo-pdf-operators-private.h | 3 +- + src/cairo-types-private.h | 169 +++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 170 +------------------------------------- + 3 files changed, 172 insertions(+), 170 deletions(-) + +commit 40142d4bf4184dcae21c85d909d33ddaa4822636 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jan 10 02:57:30 2008 +1030 + + Set the PS level to to minimum required + + A problem with the previous commit for checking the PS level is that + with the default PS level of 3 it prevents PS files from printing on + Level 2 printers even if no Level 3 operators are used. + + As the PS header is created after the page content has been generated, + it is easy to check the PS Level actually required and set this in the + header and PS level check code. + + src/cairo-ps-surface-private.h | 1 + + src/cairo-ps-surface.c | 10 +++++++--- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 9bccc968466e6b83ceccb76680d5f54912424e8e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jan 10 02:34:02 2008 +1030 + + Add PS Level check to PS output + + http://bugzilla.mozilla.org/show_bug.cgi?id=406376 + + reported problems with cairo PostScipt output printing black boxes + instead of images. This was found to caused by printing Level 3 + PostScript to a Level 2 printer. + + Add some PostScript code to to the cairo PS prolog to check the + language level of the printer. If the printer can not print the job, a + message stating the required language level is printed and the job is + aborted. + + src/cairo-ps-surface.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit f20a1a40c3f6d95b4dc89ae4198ad81b7092450c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 9 01:20:34 2008 +1030 + + Fix MSVC 2008 compiler warnings - bug 13698 + + src/cairo-win32-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 47bebc8f1d0b6524f8d1eff1fa3f981f1e4c4c33 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jan 9 01:18:44 2008 +1030 + + Fix win32-font problems with Type 1 fonts + + This should fix the problems reported in + + http://lists.cairographics.org/archives/cairo/2007-November/012172.html + + The problem is that GetCharacterPlacement() used in + _win32_scaled_font_text_to_glyphs returns utf16 instead of glyph + indices when Type 1 fonts are used. + + This has been fixed by using GetGlyphIndices instead of + GetCharacterPlacement if the font is a Type 1. + + _win32_scaled_font_map_glyphs_to_unicode has been fixed work with Type 1 + glyph indices. It now uses GetFontUnicodeRanges and GetGlyphIndices + to do the reverse lookup. + + src/cairo-win32-font.c | 261 +++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 218 insertions(+), 43 deletions(-) + +commit 25f24e79f84e0c04a8c6944cc6e018e9eb2df997 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:19:35 2008 +1030 + + PDF: Update the PDF page structure comment + + src/cairo-pdf-surface.c | 68 ++++++------------------------------------------- + 1 file changed, 8 insertions(+), 60 deletions(-) + +commit 21f842f0dfd5dd3cc1fd3b56db034fc4e209adaa +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:17:26 2008 +1030 + + PDF: Remove copy_page + + Now that the content stream is no longer split into multiple streams + it is not possible to implement a copy_page function that shares the + common content between pages. + + Remove this function so the paginated surface will rewrite the + content from the meta surface. + + src/cairo-pdf-surface.c | 15 +-------------- + 1 file changed, 1 insertion(+), 14 deletions(-) + +commit e2adb921f8b7619410db971d1524cbeab2dd6102 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:15:18 2008 +1030 + + PDF: Put each fallback image in a separate group + + Each fallback image needs to be in a separate group in the knockout + group. Otherwise transparent edges of adjacent fallback images will + composite with each other creating visible seams between the images. + + src/cairo-pdf-surface-private.h | 2 +- + src/cairo-pdf-surface.c | 26 ++++++++++++++++++++------ + 2 files changed, 21 insertions(+), 7 deletions(-) + +commit d6a84302a07d2b7e67584029fdb7a882ad246a09 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:11:46 2008 +1030 + + Fix analysis of transformed meta surfaces + + src/cairo-analysis-surface.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 3c725d50db43b848b4ad8f35bcabd5b1d0395924 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:09:04 2008 +1030 + + PDF: Make _SOURCE operator work inside meta surface patterns + + src/cairo-pdf-surface.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 6d6b74ac4ce3a9bcab45c338fc31e5a83823cde6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:08:09 2008 +1030 + + PDF: Support _OPERATOR_SOURCE when nothing under the operation + + CAIRO_OPERATOR_SOURCE operations on the PDF backend are now natively + supported when there is nothing already underneath the operation. + + src/cairo-pdf-surface.c | 64 ++++++++++++++++++++++--------------------------- + 1 file changed, 29 insertions(+), 35 deletions(-) + +commit e195cb551caa40f309127ac7a39e4a17653966c8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:05:36 2008 +1030 + + Add FALLBACK mode to paginated surface + + The PDF surface needs to know when the fallback images start so it can + close off the content stream and create a knockout transparency group + for the fallback images. Currently it does this by looking for + operations with CAIRO_OPERATOR_SOURCE. PDF returns unsupported for + _SOURCE during the analysis phase so _SOURCE will never appear during + native operations. However this prevents the PDF surface from + supporting _SOURCE operations that can be natively supported. For + example a _SOURCE operation with nothing painting under it can be + converted to _OVER and natively supported. + + A third mode, CAIRO_PAGINATED_MODE_FALLBACK, has been added. The + paginated surface will set this mode before it paints finer-grained + fallback images. + + src/cairo-paginated-private.h | 22 +++++++++++++--------- + src/cairo-paginated-surface.c | 4 +++- + src/cairo-pdf-surface.c | 2 +- + src/cairo-types-private.h | 3 ++- + 4 files changed, 19 insertions(+), 12 deletions(-) + +commit d2a5d1ace64cb9efabcb065e7fc28667dd8f779d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 21:04:06 2008 +1030 + + PDF: Remove the remaining code for splitting the content + + across multiple streams. This fixes the problem reported here + + http://lists.cairographics.org/archives/cairo/2007-December/012197.html + + src/cairo-pdf-surface-private.h | 20 +- + src/cairo-pdf-surface.c | 429 +++++++++++----------------------------- + 2 files changed, 123 insertions(+), 326 deletions(-) + +commit 099810b6c39cc6b5529f740282b64185cf56c8d7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 20:59:22 2008 +1030 + + PDF: Perform all clipping in the content stream + + Previously this was done in a separate group. Now that the PDF backend + has been re-organized to not interrupt the content stream the clipping + can be done in the same stream. + + src/cairo-pdf-surface.c | 104 ++++++------------------------------------------ + 1 file changed, 12 insertions(+), 92 deletions(-) + +commit 83630b1c70b24035b333ccfbbda8b67bd5fdd32e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 20:55:56 2008 +1030 + + PDF: Emit all patterns after content stream + + To fix this performance issue + + http://lists.cairographics.org/archives/cairo/2007-December/012197.html + + the PDF surface needs to avoid starting and stopping the content + stream every time it emits a pattern. This patch makes the PDF surface + store a list of all patterns used while the content stream is written + out then write out all the patterns after the content stream is + closed. + + src/cairo-pdf-surface-private.h | 48 +- + src/cairo-pdf-surface.c | 1128 ++++++++++++++++++++++----------------- + 2 files changed, 687 insertions(+), 489 deletions(-) + +commit b4e0864b960887fd71de85d514cb3e855c276080 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 20:42:15 2008 +1030 + + Use _cairo_pattern_create_copy() in cairo-surface.c + + Use _cairo_pattern_create_copy()/cairo_pattern_destroy() instead of + _cairo_pattern_init_copy()/_cairo_pattern_fini() so the PDF backend + can reference the patterns and destroy them later. + + src/cairo-surface.c | 84 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 42 insertions(+), 42 deletions(-) + +commit 6ead8feaf3f87e12e686092386dddcc2faa62b7f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 20:41:43 2008 +1030 + + Add _cairo_pattern_create_copy() + + src/cairo-pattern.c | 28 ++++++++++++++++++++++++++++ + src/cairoint.h | 4 ++++ + 2 files changed, 32 insertions(+) + +commit 26c6159b1e2f5481fb18f5f06f01063002dd6c98 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 20:36:32 2008 +1030 + + Move the PDF drawing operators into cairo-pdf-operators.c + + By defining PostScript functions the same as the PDF drawing + operators, this code can be shared by both the PDF and PS backends. + + src/Makefile.am | 1 + + src/cairo-pdf-operators-private.h | 106 ++++++++ + src/cairo-pdf-operators.c | 531 ++++++++++++++++++++++++++++++++++++++ + src/cairo-pdf-surface-private.h | 3 +- + src/cairo-pdf-surface.c | 442 ++++--------------------------- + 5 files changed, 687 insertions(+), 396 deletions(-) + +commit a0e0aae32dfe44cca088736d10d208f328d50a34 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jan 7 20:34:55 2008 +1030 + + PDF: Remove the Type 3 outline glyph code + + This code is never used because outline glyphs that go through the + fallback path are always embedded with Type 1 fallback. The only fonts + that are embedded as Type 3 are bitmap fonts. + + src/cairo-pdf-surface.c | 90 ++++--------------------------------------------- + 1 file changed, 6 insertions(+), 84 deletions(-) + +commit 5b3f6405d8045d73d31d7e2e30db08e81e9e2360 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 6 16:15:32 2008 +1030 + + PDF: Fix gradient-zero-stops test failure + + src/cairo-pdf-surface.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit fb7407c9c4548fc033164790759c4e480b9d8fa0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 6 15:58:46 2008 +1030 + + PS: Fix gradient-zero-stops test failure + + src/cairo-ps-surface.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit f440d894e668994721248dc6c95a936a839870db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 5 21:20:45 2008 +0000 + + Check errno for appropriate error return. + + After using fopen() and friends check the global errno to determine the + most appropriate error return - especially important when running + memfault, where correct reporting of NO_MEMORY errors is required. + + src/cairo-output-stream.c | 12 ++++++++++-- + src/cairo-png.c | 10 ++++++++-- + src/cairo-ps-surface.c | 11 ++++++++++- + 3 files changed, 28 insertions(+), 5 deletions(-) + +commit 68a441e582c6c887e65800302906ddd35cb0291e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 5 19:34:42 2008 +0000 + + [cairo-analysis-surface] Return early if the traps is empty. + + If the mask is empty, there is nothing to do, so return an early SUCCESS. + + src/cairo-analysis-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 481fd3b4c8d3972ce21399f81b2021a57ed58f00 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 5 19:33:21 2008 +0000 + + [cairo-traps] Return zero extents if it contains no traps. + + Previously, _cairo_traps_extents () returned the extents + p1={INT_MAX, INT_MAX} p2={INT_MIN, INT_MIN} for an empty traps leading + to integer overflow when computing the width using p2-p1 and causing + further overflows within libpixman. [For example this caused the + allocation of massive regions with test/mask and the PS backend.] + + src/cairo-gstate.c | 6 +++--- + src/cairo-traps.c | 6 +++++- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit be126b6842e979dbcb306b2f9f41a2114a149b9a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Jan 5 19:22:57 2008 +0000 + + [cairo-analysis-surface] Check for an empty transformed bbox. + + After transforming the bbox, check that it has not been projected into + an empty box. + + src/cairo-analysis-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit d9461733af36f2960525a9b33accf500447f5c64 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jan 4 16:43:54 2008 +0000 + + [cairo-ps-surface] Use ctime_r when available. + + Use the thread-safe (and non-allocating) ctime_r() instead of ctime() + if supported by the platform. + + configure.in | 2 +- + src/cairo-ps-surface.c | 7 ++++++- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 7cf9a6e4e39b18f4967afdb7c3c71eca5f4ba8c7 +Author: Keith Packard <keithp@keithp.com> +Date: Thu Jan 3 18:37:53 2008 -0800 + + Directly check the miter corner to detect wild miters. + + The original test for wild miters would only work with a square transform + (and, in fact, the original code required an identity transform). Instead of + fixing that, I replaced it with a more obvious test which makes sure the + miter corner lies between the two faces and not out in space somewhere. + + src/cairo-path-stroke.c | 139 ++++++++++++++++++++---------------------------- + 1 file changed, 57 insertions(+), 82 deletions(-) + +commit 552cf1dbd32eb5933bc93bb3c1ef0fca9d4066aa +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Jan 4 16:19:14 2008 -0800 + + Fix cairo_surface_fallback_snapshot's use of release_source_image + + &image_extra was being passed instead of image_extra to release; the + bug only manifested itself when the particular backend did something + with image_extra. + + src/cairo-surface-fallback.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 81e029edda8c0404c6f0bd1b618e77fb55777c64 +Author: Keith Packard <keithp@keithp.com> +Date: Thu Jan 3 18:17:24 2008 -0800 + + Add new miter-precision test. Checks miter joins at many scales. + + This demonstrates an error in cairo where miter joins are replaced with + bevels at high scale factors due to a test added to eliminate wild miters + drawn when the line faces are nearly parallel. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/miter-precision-ref.png | Bin 0 -> 931 bytes + test/miter-precision.c | 80 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 82 insertions(+) + +commit b796a2f69d043f6884f42befdc156cb1c527d217 +Author: Chris Wilson <ickle@cube.(none)> +Date: Thu Jan 3 23:00:27 2008 +0000 + + [cairo] Update CAIRO_STATUS_LAST_STATUS + + A couple of new errors have been added without updating the LAST_STATUS + value... + + src/cairo.c | 2 +- + src/cairo.h | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit c67d99787cb75cd4d773871675b4201b3bf3d5bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 3 17:33:33 2008 +0000 + + [test/surface-pattern-big-scaled-down] Kill the surface leaks. + + Destroy the surface and pattern after use. + + test/Makefile.am | 1 + + test/surface-pattern-big-scale-down-ref.png | Bin 0 -> 226 bytes + test/surface-pattern-big-scale-down.c | 11 ++++++++--- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 6a7a07adf98729fc054ea9e7727c5b3c099ae7ee +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 3 16:37:17 2008 +0000 + + [test] Update distribution list of ref images. + + Add missing *-ps-rgb24-ref.png images, and a couple of tests to .gitignore. + + test/.gitignore | 3 +++ + test/Makefile.am | 34 ++++++++++++++++++++++++++++++++++ + 2 files changed, 37 insertions(+) + +commit 399f7c24e31a802e623cf9d63311f3ed7f3a3659 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 23:24:35 2007 +0100 + + [cairo-pdf-surface] Continue to close streams even after error. + + Do not return after encountering the first error whilst closing streams, + but continue to close any auxiliary streams before finally reporting the + error. Also during finalize check that we have closed any streams that + may have been left open after encountering an error. + + src/cairo-pdf-surface.c | 54 ++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 44 insertions(+), 10 deletions(-) + +commit 42e77c1077f389357faab214d7ad8bc18709cb31 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 16:59:45 2007 +0100 + + [cairo-pdf-surface] Destroy closed streams. + + Destroy the streams when closing groups in order to free the associated + resources. + + src/cairo-pdf-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 42bfe370f8df800419c1c7acbec1a7e51077d462 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 3 14:46:40 2008 +0000 + + [cairo-pdf-surface] Propagate error from emit_glyph(). + + Propagate the error and return early rather than setting the error on + the surface and continuing. + + src/cairo-pdf-surface.c | 31 ++++++++++++++++++++----------- + 1 file changed, 20 insertions(+), 11 deletions(-) + +commit 2a8e80f59ef61cff30d643bdd6ad2306d6068c5c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 3 10:34:37 2008 +0000 + + [cairo-gstate] Rearrange invalid-matrix guards. + + Test for an invalid matrix before use. Whilst this has no effect on the + result, an INVALID_MATRIX error will be raised on the context, placing + the guards first makes the code obviously safe and avoids manipulation + of invalid matrices. + + src/cairo-gstate.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit e89cc8fa15ac418175e58ee41359a923bbc26f73 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Dec 18 09:23:29 2007 +0000 + + [cairo-scaled-fonts-subsets] Memleak and error reporting. + + Fix leaks of strings and hash table from + _cairo_scaled_font_subset_create_glyph_names(). + + Whilst we are in the vicinity, review the error handling. + + src/cairo-ft-font.c | 8 ++-- + src/cairo-pdf-surface.c | 12 +++++- + src/cairo-scaled-font-subsets.c | 94 +++++++++++++++++++++-------------------- + src/cairo-win32-font.c | 6 ++- + src/cairoint.h | 2 +- + 5 files changed, 68 insertions(+), 54 deletions(-) + +commit 51f37995c9cb5efa22a36a0199e24a684fa61279 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 11:06:03 2008 +0000 + + Remove cairo_private from *.c files. + + The cairo_private markup is only required in the headers, so cleanup the + couple of remaining occurrences in the source files. + + src/cairo-clip.c | 2 +- + src/cairo-scaled-font-subsets.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 48fd65cdb50cd1fa0a6ada5edf7ef307586eb5fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:59:44 2008 +0000 + + [cairo-svg-surface] Propagate the original error status. + + Return the error status from the paginated surface instead of + hard-coding a bare CAIRO_STATUS_NO_MEMORY. + + src/cairo-svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ba392488cb926c2697b8ccfa7337da1e66d78baa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:58:13 2008 +0000 + + [cairo-ps-surface] Wrap error site with _cairo_error(). + + Wrap the original allocation error site with _cairo_error(). + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4442acc96601db21a788e088040cb1f2fccdf400 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:54:30 2008 +0000 + + [cairo-atsui-font] Minor _cairo_error() tidy. + + Inline the use of _cairo_error() for slightly improved readability. + + src/cairo-atsui-font.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 2a0267639a39cacada89c59451faa8051041e436 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:52:28 2008 +0000 + + [cairo-ps-surface] Wrap error site with _cairo_error(). + + Markup the original error site for CAIRO_STATUS_TEMP_FILE_ERROR with + _cairo_error(). + + src/cairo-ps-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cc5bd4725564d0add79c764b35acff78e43d0c00 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:50:55 2008 +0000 + + [cairo-svg-surface] Wrap a couple of error sites with _cairo_error(). + + Wrap a couple of bare CAIRO_STATUS_NO_MEMORY with a call to + _cairo_error(). + + src/cairo-svg-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit daf77ed3cb0d24f35ebb43760d6ba6de639d4636 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:41:06 2008 +0000 + + [cairo-type1-subset] Remove the unused return value. + + Nobody actually used the index returned by + cairo_type1_font_subset_use_glyph(), so remove it. + + src/cairo-type1-subset.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit fd8bf678536877d9b016264d40a101a1fd2d9e25 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jan 2 10:37:58 2008 +0000 + + [cairo-truetype-subset] Propagate error from failing to allocate padding. + + Before filling the padding, check that we have successfully allocated + the buffer - otherwise propagate the failure. + + src/cairo-truetype-subset.c | 51 ++++++++++++++++++++++++++++----------------- + 1 file changed, 32 insertions(+), 19 deletions(-) + +commit ad0a2524ffdc9cc949d11de3aa51c429f13e12b7 +Author: Claudio Ciccani <klan@directfb.org> +Date: Wed Jan 2 15:09:58 2008 +0100 + + [cairo-directfb] Optimize blend functions in fill_rectangles(), too. + + src/cairo-directfb-surface.c | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +commit 060f384310e887f7f431a98e847b8a36fc303a0c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Dec 29 00:26:11 2007 +1030 + + Fix PS/PDF meta surface patterns + + This was failing with more than one level of push/pop group. The + problem was that the meta surface replay in PS/PDF emit_meta_surface + was replaying all the meta surface commands insteads of only the + natively supported commands. The analysis surface has also been + changed to replay meta surface patterns back to the one analysis + surface instead of creating a separate analysis surface for each + pattern. The analysis surface now transforms bounding boxes with the + meta surface pattern matrix so that fallback regions are correctly + tracked. + + src/cairo-analysis-surface.c | 44 +++++++++++++++++++++++++++++++++---------- + src/cairo-meta-surface.c | 18 +----------------- + src/cairo-paginated-surface.c | 1 + + src/cairo-pdf-surface.c | 4 +++- + src/cairo-ps-surface.c | 20 +++++++++++++------- + 5 files changed, 52 insertions(+), 35 deletions(-) + +commit 4fa46e3caaffb54f4419887418d8d0ea39816092 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Dec 29 00:15:03 2007 +1030 + + Implement a win32 tmpfile() function + + Bug report and proposed patch at: + http://lists.cairographics.org/archives/cairo/2007-December/012529.html + + On Windows the tmpfile() function creates the file in the root + directory. This will fail if the user does not have write access to the + root directory. + + Implement _cairo_win32_tmpfile() that is #defined as tmpfile() on + Windows. This function uses GetTempPath() and GetTempFileName() to + create the temporary file. CreateFile() is used to open the file so + the DELETE_ON_CLOSE flag can be set. + + src/Makefile.am | 3 +- + src/cairo-win32.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 6 ++++ + 3 files changed, 106 insertions(+), 1 deletion(-) + +commit dcacad932334bbcc3cf6b1df3b37412db5017116 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Dec 29 00:13:24 2007 +1030 + + PS: Use _TEMP_FILE_ERROR for temp file errors + + src/cairo-ps-surface.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit bd44d114a6d4271a4a15cf7d70a996e73a86751c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Dec 29 00:12:44 2007 +1030 + + Add CAIRO_STATUS_TEMP_FILE_ERROR + + src/cairo.c | 2 ++ + src/cairo.h | 4 +++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit e82b0f46b2ea6ebcee5ea5cc09e9ab5c6cc383fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 14 00:45:24 2007 +0000 + + [cairo-path-fixed] Consolidate cairo_path_buf_t when copying. + + When copying the cairo_path_fixed_t, consolidate the list of + dynamically allocated cairo_path_buf_t into a single buffer. + + src/cairo-path-fixed.c | 33 +++++++++++++++++++++++++-------- + 1 file changed, 25 insertions(+), 8 deletions(-) + +commit e0187ad49b754c4024f1999155ed248616028582 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 27 12:46:13 2007 +0000 + + [cairo-path-fixed] Ensure the points array is naturally aligned, take 2. + + By enlarging buf_size to ensure the correct alignment of the points + array with the cairo_path_buf_t block, we can efficiently use the + padding bytes to store more ops. + + src/cairo-path-fixed.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit d8169b8cef041b4dbcea44e050df28659f4846aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 27 10:45:25 2007 +0000 + + [cairo-path-fixed] Ensure the array of points is correctly aligned. + + In http://bugs.gentoo.org/show_bug.cgi?id=203282, it was identified that + the cairo_path_buf was causing unaligned accesses (thus generating SIGBUS + on architectures like the SPARC) to its array of points. As we manually + allocate a single block of memory for the cairo_path_buf_t and its + arrays, we must also manually ensure correct alignment - as opposed to + cairo_path_buf_fixed_t for which the compiler automatically aligns the + embedded arrays. + + src/cairo-path-fixed.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 7f69c2588b33d415f544c2ee24d85c83a8d7cd69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 21:15:41 2007 +0000 + + [cairo-ps-surface] Missing status checks. + + Check and propagate the error status. + + src/cairo-ps-surface.c | 53 +++++++++++++++++++++++++++++++------------------- + 1 file changed, 33 insertions(+), 20 deletions(-) + +commit 51523aec8177224d3f64f55ca2e61c64fe801a56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 21:15:08 2007 +0000 + + [cairo-meta-surface] Remove redundant _cairo_error(). + + Remove the _cairo_error() from the return, as it has already been called + immediately after the error was first detected. + + src/cairo-meta-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 146484e3122958212d4a69fff97d392451dcbeaa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 21:13:31 2007 +0000 + + [valgrind] Update zlib suppressions. + + Match the zlib library as found on hardy+dbgsym. + + test/.valgrind-suppressions | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +commit d4d3873bccea82bb3ae20bfcbab3158fa5df41b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 18:21:46 2007 +0000 + + [cairo] Correct the documentation for cairo_get_group_target(). + + cairo_get_group_target() can never return NULL, but will always + return the current destination surface. + + src/cairo.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit 3bf06c336629d9a485fdb150058897e5a6a30b45 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 18:15:48 2007 +0000 + + [test/*] Create new surfaces using the group target. + + cairo_get_target() returns the original surface passed to + cairo_create(), and not the current destination as required when + testing drawing to the same surface using multiple contexts. + + For completeness we also use the group target when creating similar + surfaces within the tests (to check that similar surfaces of similar + surfaces also work). + + perf/cairo-perf-cover.c | 4 ++-- + test/cairo-test.c | 2 +- + test/clip-nesting.c | 2 +- + test/clip-operator.c | 2 +- + test/clip-zero.c | 2 +- + test/device-offset-positive.c | 2 +- + test/device-offset.c | 2 +- + test/get-clip.c | 2 +- + test/get-path-extents.c | 2 +- + test/invalid-matrix.c | 2 +- + test/mask.c | 4 ++-- + test/meta-surface-pattern.c | 2 +- + test/operator-clear.c | 2 +- + test/operator-source.c | 4 ++-- + test/pixman-rotate.c | 2 +- + test/self-copy.c | 2 +- + test/source-clip-scale.c | 2 +- + test/source-clip.c | 2 +- + test/svg-clip.c | 2 +- + test/unbounded-operator.c | 2 +- + 20 files changed, 23 insertions(+), 23 deletions(-) + +commit 643834e7aa3e90678276453439017359ef942c9e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 17:51:48 2007 +0000 + + [cairo-surface] Return UNSUPPORTED for acquire_(dest|source)_image. + + If the backend does not support fallbacks ie backend->acquire_dest_image + or backend->acquire_source_image is NULL, then return + CAIRO_INT_STATUS_UNSUPPORTED rather than attempt to jump to the NULL + hooks. + + src/cairo-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 14454e12d8df606ed4b79c6e7cda4071b00ee581 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 17:49:06 2007 +0000 + + [cairo-test] Wrap test function with cairo_save/restore(). + + Restore the context to the original state before blitting the + group surface in order to remove any residual state such as a clip path. + + test/cairo-test.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit d0119a5aa24a8b426ec64bb2eaa205b7f08ae58a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 20 12:30:35 2007 -0500 + + [cairo-unicode] Don't compile _cairo_utf8_to_utf16 on Linux + + The _cairo_utf8_to_utf16() is only used in win32 and atsui font backends. + Don't build it if none of those two are available. + + src/cairo-unicode.c | 2 ++ + src/cairoint.h | 5 +++++ + 2 files changed, 7 insertions(+) + +commit 281b11aef14f04b12639028e2a76bbdc7a1a32bf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Dec 20 17:11:03 2007 +0000 + + [cairo-test] Use CAIRO_OPERATOR_SOURCE when painting the group surface. + + To correctly copy a surface onto the destination irrespective of its + content requires the SOURCE operator. Forgetting to do so here causes + uninitialized pixels to be mixed into the result and the failure of + many tests for the similar surface. Oops... + + test/cairo-test.c | 1 + + 1 file changed, 1 insertion(+) + +commit ed3fccec01257a7c52694150cda9ea1059c33585 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 17 22:37:31 2007 +0000 + + [pdiff] Avoid the memleak for small surfaces. + + Allocate the arrays after the guard against small surfaces to avoid + leaking them. + + test/pdiff/pdiff.c | 40 +++++++++++++++++++++++++++------------- + 1 file changed, 27 insertions(+), 13 deletions(-) + +commit df938a515bd59138421b6ab4419966805d027b52 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 17 21:39:25 2007 +0000 + + [cairo-path-bounds] Check for the empty path. + + Avoid returning uninitialized variables if we're asked to find the + bounds of an empty path - in which case we just return a rectangle + of zero width and height similar to the empty clip region. + + src/cairo-path-bounds.c | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit c2adfb4052f72e1e6e6d283de3428b5453dac537 +Author: Jim Meyering <jim@meyering.net> +Date: Sat Dec 15 16:42:25 2007 +0100 + + Don't leak memory upon failed realloc. + + * cairo-glitz-surface.c (_cairo_glitz_surface_composite_trapezoids): + + Signed-off-by: Jim Meyering <meyering@redhat.com> + + src/cairo-glitz-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 45951345983f100e935af2fe2f5397d64c195f98 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Dec 18 16:00:21 2007 -0500 + + [directfb] Fix header include order to include cairoint.h first + + src/cairo-directfb-surface.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 18f4f02f723cd005c159c8a0044dd385d551f022 +Author: Nis Martensen <nis.martensen@web.de> +Date: Tue Dec 18 15:59:19 2007 -0500 + + [src/check-cairoint.sh] Fix typo in shell script + + src/check-cairoint.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8343d6cc2a5e9198e1205e431de018f74107d9d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 17 13:42:07 2007 +0000 + + Replace various uses of CAIRO_STACK_BUF_SIZE with a single macro. + + In http://bugs.freedesktop.org/show_bug.cgi?id=13699, Pavel Vozenilek + reports a duplicate define for computing the appropriate length for an + on-stack array. The macro in question, and a few other places, was + performing CAIRO_STACK_BUF_SIZE/sizeof(stack[0]) so we can simplify + them slightly by using a common macro. + + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-gstate.c | 10 ++++------ + src/cairo-image-surface.c | 12 ++---------- + src/cairo-region.c | 4 +--- + src/cairo-surface.c | 2 +- + src/cairo-traps.c | 4 +--- + src/cairo-xlib-surface.c | 7 ++----- + src/cairoint.h | 2 ++ + 8 files changed, 14 insertions(+), 29 deletions(-) + +commit 627a8b4a2f2824f156893382561f563d0aa9e90d +Author: Benjamin Otte <otte@gnome.org> +Date: Mon Dec 17 12:42:14 2007 +0100 + + [directfb] replace u32 with uint32_t + + This fix makes it compile for me again + + src/cairo-directfb-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9637ffc62fab1b42ceb764d1b42e70654e0cbe2b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 17 01:55:15 2007 -0500 + + [cairo-xlib] Minor cleanup and add comment + + src/cairo-xlib-surface.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 83963d2a9ec445e23cfbe692b877177a9d9d135e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 17 01:19:53 2007 -0500 + + [cairo-ft] Revert "Force non-AA text when using a bitmap strike with only scaling transform." (#13479) + + The reasoning for that commit was that fonts with bitmap strikes should be + rendered with antialiasing off for those (hopefully) few glyphs that don't + have a bitmap. + + However, it turns out, there are fonts that have some, but very few, bitmaps, + and this changed forces non-AA rendering on them. We now support multiple + glyph formats per font in the Xlib backend, so backing this out to let every + glyph render as is. Fontconfig rules can be used to force AA off on a per-font + basis. + + This reverts commit 06af5c2891b89da28581c30afcde06c5442884db. + + src/cairo-ft-font.c | 24 ------------------------ + 1 file changed, 24 deletions(-) + +commit 805b668260c47e6d3d854361fcc53f12bd2a57e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 17 01:14:27 2007 -0500 + + [cairo-xlib] Support scale fonts with glyphs of multiple formats (#13479) + + We maintain three Xrender glyphsets per scaled font, one for each of A1, A8, + and ARGB32. This is required to correctly support fonts with bitmaps for + some glyphs but not all. + + src/cairo-xlib-surface.c | 179 +++++++++++++++++++++++++++++++++++------------ + 1 file changed, 136 insertions(+), 43 deletions(-) + +commit f6dd037cf3231c2dd0550b0f2e6f3179202c299f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Dec 14 14:02:43 2007 -0800 + + Remove rasterization when a paginated surace is used as a source + + This was an old workaround for a bug that seems to no longer + exist. Thanks to Donn Ingle for pointing out the problem. + + src/cairo-paginated-surface.c | 34 ---------------------------------- + 1 file changed, 34 deletions(-) + +commit 9b3ce8b17ab8179131ae45a227d76241916f42e8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Dec 12 23:41:53 2007 +1030 + + PS: Use the correct bounding box in Type 3 fonts + + Previously this was a fixed size. + + src/cairo-ps-surface.c | 44 +++++++++++++++++++++++++++++++++++++------- + 1 file changed, 37 insertions(+), 7 deletions(-) + +commit afdd53d35f53cfe3440c38531c112a586d3d7486 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Dec 12 23:35:56 2007 +1030 + + PS: Return the status for emit_image and gradients + + src/cairo-ps-surface.c | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +commit 55f5c4ffda5df9064bd0a5a6a2cf1a09b058afbb +Author: Boying Lu <brian.lu@sun.com> +Date: Wed Dec 12 21:05:57 2007 +1030 + + Remove cairo_private from static declaration + + src/cairo-paginated-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 942e3d53088a4d2b05c86d3f82b76cfbe707b3b5 +Author: Claudio Ciccani <klan@directfb.org> +Date: Tue Dec 11 15:50:05 2007 +0100 + + [cairo-directfb] Support some environment variables + + Added a couple of (boolean) env. vars affecting the backend: + CAIRO_DIRECTFB_NO_ACCEL, disables acceleration + CAIRO_DIRECTFB_ARGB_FONT, enables using ARGB fonts instead of A8 + + src/cairo-directfb-surface.c | 99 ++++++++++++++++++++++++++++++++++---------- + src/cairo-directfb.h | 12 +++++- + 2 files changed, 88 insertions(+), 23 deletions(-) + +commit f3cec9d1c2a4d43cd734aae4bc7f8e7410a5e89a +Merge: 08516d9 c26084a +Author: Claudio Ciccani <klan@directfb.org> +Date: Mon Dec 10 22:58:06 2007 +0100 + + Merge branch 'master' of git+ssh://klan@git.freedesktop.org/git/cairo + +commit c26084a45fcb6ac467cad8bdcedfb2f524b857fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 10 14:38:09 2007 -0500 + + Pass $(MAKE) to test shell scripts (#13591) + + src/Makefile.am | 2 +- + src/check-def.sh | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 78dac47399038cc9a05b82b01c4e4b35132f0784 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 3 02:31:40 2007 -0500 + + [util/malloc-stats.c] Add a public function malloc_stats() + + Apparently glibc already provides the function: + + void malloc_stats (void); + + So, like we do for backtrace_symbols(), override the public symbol. + It still is defined as __destructor__ and runs at program finalization. + + util/malloc-stats.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 08516d97a1b34cbb119d6d842ae31e4cb4e08740 +Author: Claudio Ciccani <klan@directfb.org> +Date: Mon Dec 10 18:54:01 2007 +0100 + + [cairo-directfb] Merging from directfb.org + + - Improved performance in case of surface conversion: allocate a shadow buffer that can only grow + - Fixed support for small surfaces (less than 8x8) + - Optimize the blending function according to the surface format + - Added _directfb_categorize_operation(): selects the blitting function according to the transform matrix + - Avoid inverting the matrix when doing a simple StretchBlit() + - Use TextureTriangles() instead of StretchBlit() when scale factors are negative + - Added support for ARGB32 fonts (converted to A8 internally) + - Removed unused functions (flush() and mark_dirty_rectangle()) + - Code cosmetics + + src/cairo-directfb-surface.c | 847 ++++++++++++++++++++++++------------------- + 1 file changed, 466 insertions(+), 381 deletions(-) + +commit dd71ac910c3c176687fe4da582876bf46becf6d5 +Author: Benjamin Otte <otte@gnome.org> +Date: Mon Dec 10 13:17:09 2007 +0100 + + typo + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1f1f96d6459014a236611edf811a60225a652044 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Dec 8 22:32:16 2007 +0100 + + [SVG] Fix a minor issue when emitting a radial gradient with r1 == r2. + + Minor because I don't know how the output is supposed to look in this case. + + src/cairo-svg-surface.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 19680f545a1620d944322775c1b85b0e5f93fa0f +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Dec 6 21:31:15 2007 +0000 + + [quartz] fix gradient-zero-stops crash (moz#407104) + + Fixes failure in gradient-zero-stops test, reported + by Boris Zbarsky (thanks!) as Mozill a bug#407104. + + src/cairo-quartz-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit e6c34bb6912d2801ee6c0d56ec0e98739c786e9f +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Dec 6 21:31:14 2007 +0000 + + [quartz] refactor gradient handling + + Avoid checking the gradient type twice. This refactor + also makes it easier to check when the gradient has no stops, + and will make it easier to separate out the different + implementations of EXTEND_REPEAT, REFLECT for linear and + radial gradients. + + src/cairo-quartz-surface.c | 206 +++++++++++++++++++++++---------------------- + 1 file changed, 107 insertions(+), 99 deletions(-) + +commit b81c8473bd0b8b829dc7eba9a105890f0c2f1158 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Dec 6 21:31:10 2007 +0000 + + [test] add test for gradient with no stops + + Boris Zbarsky reported a bug where having zero stops in a + gradient pattern would crash in the quartz surface. This + test checks for that case. Mozilla bug#407104. + + This also crashes testing pdf; and the ps, svg surfaces + look suspicious (they reference stops[0]) but I havent + been able to test them yet. + + test/Makefile.am | 3 ++ + test/gradient-zero-stops-ref.png | Bin 0 -> 105 bytes + test/gradient-zero-stops-rgb24-ref.png | Bin 0 -> 105 bytes + test/gradient-zero-stops.c | 66 +++++++++++++++++++++++++++++++++ + 4 files changed, 69 insertions(+) + +commit a7ae9c45d924effdd61390267eb216302a270d8e +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Thu Dec 6 16:46:28 2007 +0100 + + [os2] add memory allocation wrappers for pixel buffers + + Add ability to use OS/2 APIs instead of C library functions to manage + pixel buffer allocations. This is to work around heap fragmentation. + This implements two wrapper functions which replace _cairo_alloc_abc and + free and when compiled with OS2_USE_PLATFORM_ALLOC the OS/2 functions + DosAllocMem and DosFreeMem will be used for allocation/deallocation. + + Also try to minimize the heap when shutting down the cairo library. + + src/cairo-os2-surface.c | 108 ++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 81 insertions(+), 27 deletions(-) + +commit be79779331ee29c0bfb74b728227719bb5dead6e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 5 09:24:17 2007 -0800 + + Restrict initial buggy version to X.Org 6.7 rather than 6.0 + + Also add some comments describing the test. + + src/cairo-xlib-display.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit d4138d1161c6b683fd0ef62a8d49ccf4ec4674bc +Author: Bernardo Innocenti <bernie@codewiz.org> +Date: Wed Dec 5 07:04:09 2007 -0500 + + Fix version check for buggy_repeat on modular Xserver 1.x + + The versioning of the X server has restarted from 1.0 in the + modular build. So we adjust the text to avoid considering + the new servers buggy. + + src/cairo-xlib-display.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 946b8fedb57fc0c70e4f82b2151433768479a11c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 5 02:30:58 2007 -0800 + + Fix misspellings + + NEWS | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 94a35c7b71b2219d68e81272ce6328e46ae0e91e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 5 02:28:20 2007 -0800 + + Fix version number typo + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6f2ec12b882e49b425b22145592243b8ce75b6a4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 5 02:26:05 2007 -0800 + + Increment version to 1.5.5 after the 1.5.4 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e0c0275e1764502cfd1d0e93e374b4ed396f0073 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 5 02:06:33 2007 -0800 + + Increment version to 1.5.4 and to 14:1:12 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 11aaf992fb5d3d86f261ba48306adfaace9f96ea +Author: Carl Worth <cworth@cworth.org> +Date: Wed Dec 5 01:52:03 2007 -0800 + + NEWS: Add notes for 1.5.4 + + NEWS | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 57 insertions(+) + +commit 150564c7f8792fa2217fc2574e9e1925c9cd500f +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Dec 4 14:05:47 2007 -0800 + + [quartz] use rectangle_int_t, not rectangle_int16_t + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e8574022f949559c069da30f11dee8680fc59586 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Dec 4 13:54:32 2007 -0800 + + [quartz] cleanup: remove trailing whitespace + + src/cairo-quartz-surface.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit ee01a94726b3c0782fa182c9e874b2ed57e71aca +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Dec 4 13:53:03 2007 -0800 + + [quartz] Use CGContextDrawTiledImage if available + + Use this 10.5-only method if available, as it greatly speeds up + tiled image rendering (EXTEND_REPEAT). + + src/cairo-quartz-surface.c | 96 ++++++++++++++++++++++++++++++---------------- + 1 file changed, 64 insertions(+), 32 deletions(-) + +commit 2c25033e14d7d9f705c27683dfb093318d67910b +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Dec 4 13:49:59 2007 -0800 + + [quartz] Handle creating 0x0 surfaces + + Make all 0x0 surfaces be no-ops when used in a rendering operation. + + src/cairo-quartz-surface.c | 109 +++++++++++++++++++++++++++++++++++---------- + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/clip-zero.c | 80 +++++++++++++++++++++++++++++++++ + 4 files changed, 168 insertions(+), 23 deletions(-) + +commit 407ed0a6e7183c4fc6da1e988fada19c82ccef8a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Dec 3 09:59:52 2007 +0000 + + [Makefile.am] Add lcov-clean to distclean. + + Clean the gcov temporary files when doing a full clean - spotted in a + patch by Patrick Hulin to adapt cairo's lcov targets to glib. + + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 9c732594039b164a1e08125c35ec9d04278f0cbf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Dec 2 17:55:35 2007 +0000 + + [Makefile.am] Wrap lcov make targets within an AM_CONDITIONAL. + + Hide 'make lcov' and friends unless the user has actually enabled lcov + supported during configure. + + Makefile.am | 17 ++++++++++++----- + configure.in | 4 ++++ + 2 files changed, 16 insertions(+), 5 deletions(-) + +commit 5f38e215ed4ec930492ee373db37a767d85a6ee8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 1 22:44:54 2007 -0500 + + [README] Remove the Dependencies section as it falls out of date easily + + README | 89 ------------------------------------------------------------------ + 1 file changed, 89 deletions(-) + +commit b46bb58e11f9d7b7fa68a64ca887c9b996b8f6f2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 1 20:41:55 2007 -0500 + + [configure.in] Bump freetype required version to 2.1.9 (#13482) + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b701b4263048c3641f77796b9ea7bdc60b9815f7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 2 01:36:43 2007 +1030 + + win32: Implement _cairo_win32_scaled_font_init_glyph_surface() + + This is required when using win32 bitmap fonts with PS/PDF surfaces. + + src/cairo-win32-font.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 61 insertions(+), 2 deletions(-) + +commit 1441e165f2338bc6a8e2945baca77611ff417b2f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 2 00:50:28 2007 +1030 + + Fix regression in Type1 Fallback + + As a result of the changes to improve the status checking, + _cairo_type2_charstrings_init() was failing due to the failure + status returned when the font->output stream is destroyed. + This is because _cairo_type2_charstrings_init() does not + create an output stream. + + Fix this by initializing font->output to NULL and only + destroy it if not NULL. + + src/cairo-type1-fallback.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit e6166f7b442ae55128b417559e48250c287e49b6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Dec 1 04:19:39 2007 -0500 + + Convert bash scripts to regular sh ones for greater portability + + perf/cairo-perf-diff | 31 ++++++++++++++++--------------- + src/check-def.sh | 12 ++++++------ + src/check-plt.sh | 6 +++--- + 3 files changed, 25 insertions(+), 24 deletions(-) + +commit 0d932f43fe17b2b65d9e52ff8f9c16122b525223 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Nov 30 16:19:45 2007 -0800 + + Explicitly call bash for bash-specific scripts + + Thanks to Solaris-using Brian Cameron for pointing out that our + shell scripts are bash-specific. We'd be glad if someone cared to + rewrite them to not require bash, but for now let's have truth in + advertising at least. + + perf/cairo-perf-diff | 2 +- + src/check-def.sh | 2 +- + src/check-plt.sh | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit f4b93cceb7fb83de558ed058915f92d4f75c1a6a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 29 23:18:45 2007 +1030 + + PS: Use correct glyphs widths for Type 3 fonts + + Previously the widths were set to 0. + + src/cairo-ps-surface.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 2729af6c123983c1599fae9f7a0fac88ad320d7c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 29 23:07:47 2007 +1030 + + PS: Fix the Type 3 FontBBox + + This was previously a fixed size. Make it [0 0 0 0] the same as the + other fonts. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 77aab8fdbb62e4e0ec0260651db7255d168cb25e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 29 23:03:40 2007 +1030 + + PS: Don't emit an image for Type 3 .notdef glyph + + Make the .notdef procedure an empty procedure instead + of creating an empty image mask. This reduced the size + of the PS file. + + src/cairo-ps-surface.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit 78e8d3d9bd2d4652f636a668a3fa53ef9edfd9ae +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 29 22:54:54 2007 +1030 + + PS: Fix the bounding boxes of Type 3 glyphs + + When viewing with ghostscript the glyphs were clipped + + src/cairo-ps-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 97b0d8b3c376f7848514debbe0697a2159a26eb9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 29 22:36:07 2007 +1030 + + PS: Make Type 3 fonts text selectable + + Put the glyph names in the Encoding array the same as is done for + Type 1 and Type42 fonts. + + Acroread and Evince are still unable to correctly extract the text + after conversion with ps2pdf. However examining the pdf file shows + the glyph names are correct so this is probably a limitation of + Acroread and Evince. + + src/cairo-ps-surface.c | 46 ++++++++++++++++++++++++++++++---------------- + 1 file changed, 30 insertions(+), 16 deletions(-) + +commit 5e8f60531a09f357db38c4b646b1bbd29b97a891 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 29 09:20:01 2007 +1030 + + PS: Ensure that xyshow operator has a pair of offsets for each glyph + + The last entry should have been "0 0" instead of "0". + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ba239a474a5cab36098b8f4a98f36aa6281f7da9 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Nov 18 20:30:49 2007 +0000 + + [quartz] zero memory on bitmap creation + + 7 quartz/argb32/similar tests were showing failures due to + random bits being set. The problem turned out to be that the + initial test surface was not cleared before the similar surface + was created by push_group. The problem behaviour is more obvious + if you run the tests with MallocScribble=1. + + Fix this by calling memset after bitmap allocation; the multiplication + here cannot overflow since we already checked that in malloc_ab. + + src/cairo-quartz-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 58e828a9a31b91c80336fc4ce323b061226dde2b +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Jul 1 16:11:07 2007 +0100 + + [quartz] fill with alpha for EXTEND_NONE + + The implementation of EXTEND_NONE was not filling areas outside + the image with rgba(0,0,0,0). This showed up on the operator-source + test, the fix makes the quartz and image renderings identical. + + src/cairo-quartz-surface.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit 39b8ddf07994747c039ee74c64a0cc97a4c7776a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Nov 15 11:57:40 2007 -0800 + + [win32] Remove double-free in win32 font code in init_glyph_path + + Fixes bug #13243. + + src/cairo-win32-font.c | 1 - + 1 file changed, 1 deletion(-) + +commit 50d5f5a4e6d7424694b0b27fc0c3a00c9eb203bb +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Nov 15 11:56:56 2007 -0800 + + [quartz] Fix gradients; the wrong color field was being used + + The wrong color field was being used, effectively making gradients always + have transparent black as their color stops. + + src/cairo-quartz-surface.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit bcb0f57e5eca58480e24251777f0b967e1aadefe +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Wed Nov 14 01:50:34 2007 +0000 + + [quartz] remove double malloc in dashing code. + + fdash is reallocated without being released, and is + allocated at the wrong size too. + + src/cairo-quartz-surface.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit e6bc049465730a9640a1038104210d14aad4b3cb +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue Nov 13 00:43:59 2007 +0000 + + [quartz] typo checking for malloc failure + + The check after the malloc of cg_advances looked at the wrong + variable. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bb2674207cf01386c6338511d2462694187fff36 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Nov 12 23:56:01 2007 +0000 + + [quartz] fix leak in show_glyphs + + In cairo_quartz_show_glyphs we may leak the source if + there is a failure to malloc the glyph arrays. Fix this. + + src/cairo-quartz-surface.c | 30 ++++++++++++++++++------------ + 1 file changed, 18 insertions(+), 12 deletions(-) + +commit 7ad34c1bdc6417ca0e2e1075b67ca09c5318db75 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Nov 12 23:52:52 2007 +0000 + + [quartz] fix for cairo_reset_clip() + + src/cairo-quartz-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 717ccbcf0c12fcfa840396378812919c9e151d57 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Nov 12 23:51:39 2007 +0000 + + Revert "[quartz] handle 0x0 surfaces." + + This reverts commit 2fd50a7897efaed4dabaf75a6ed8828f16c14d36. + Spoke too soon, quartz doesn't like creating those 0x0 + images; while the tests pass, its putting warnings in the logs. + Reverting to make a better fix. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2fd50a7897efaed4dabaf75a6ed8828f16c14d36 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Nov 11 01:29:00 2007 +0000 + + [quartz] handle 0x0 surfaces. + + Some tests, like invalid-matrix, generate a 0x0 bitmap; in + the quartz backend this caused a nil surface to be returned, + whereas the tests expect a quartz surface. Other surfaces + return a backend-specific surface with a zero-sized bitmap, + quartz should do the same. + + Fixes the tests ft-font-create-for-ft-face, get-and-set, + get-clip, invalid-matrix, line-width-zero, + select-font-no-show-text, solid-pattern-cache-stress, + surface-finish-twice, and text-cache-crash. + + src/cairo-quartz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0359ad6c8da56a44697498bd8b74fbc029cbe930 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Nov 11 00:18:19 2007 +0100 + + Compilation warning suppression (char as array subscript). + + cairo_path_op_t is a char, and can't be directly used as array subscript. + + src/cairo-path-fixed.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1b71af7e61bd6c55b78e1a9a4c56b93d0b1134ed +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Nov 11 00:14:34 2007 +0100 + + Fix _cairo_path_fixed_init_copy. + + All the copied data buffers except the first one weren't completely + initialized (num_ops and num_points). That was the cause of the failure + of some vector surface tests, like random-intersections. + + src/cairo-path-fixed.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3554c31e3d28ad5aad35c8fe4c6bb8ce7d297dde +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Nov 10 10:43:43 2007 +0100 + + [SVG] Add missing image to REFERENCE_IMAGES list. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 916d82586ec196bfb3124850e68ef66a63464e72 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Nov 10 10:24:21 2007 +0100 + + [SVG] Indentation fixes. + + src/cairo-svg-surface.c | 130 ++++++++++++++++++++++++------------------------ + 1 file changed, 65 insertions(+), 65 deletions(-) + +commit 8edc3ed4857795387007e7c4997f30d7ceec57ac +Merge: 3bc8a8d 77e9b05 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Nov 10 10:10:50 2007 +0100 + + Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo + +commit 3bc8a8d1d0e07e857b203a7872862437b8333b25 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Nov 10 10:10:03 2007 +0100 + + [SVG] Remove spurious semicolon when emitting mask url. + + src/cairo-svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b68968ffd1864d591e4fc08fed55c12ece95ec55 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Nov 10 10:07:12 2007 +0100 + + [SVG] Fix opacity of combined stroke and fill. + + When emitting combined stroke and fill, cairo SVG backend was using the opacity + two times, instead of using fill-opacity and stroke-opacity, leading to + incorrect output. + + I've updated the mask test reference images for the SVG output, since it seems + there's a bug in librsvg when fill-opacity is used in the mask image. + I've checked the SVG output with batik, and it looks fine. + + src/cairo-svg-surface.c | 27 ++++++++++++++------------- + test/mask-svg-argb32-ref.png | Bin 8405 -> 8389 bytes + test/mask-svg-rgb24-ref.png | Bin 0 -> 7935 bytes + 3 files changed, 14 insertions(+), 13 deletions(-) + +commit 77e9b05b2b011ce964287ff493c2b421977107ee +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Nov 10 01:34:03 2007 +0000 + + [test] support using a previous build as a reference + + Allow using a previous test output directory as a source of + reference images. To make use of this, set the environment + variable 'CAIRO_REF_DIR' to point at an old test directory, + relative to the current test directory. + + This is useful for testing backends when reference images haven't + been created yet, or which the current reference image structure + can't accomodate, like multiple font backends. + + test/README | 8 ++++++++ + test/cairo-test.c | 17 ++++++++++++++++- + 2 files changed, 24 insertions(+), 1 deletion(-) + +commit f8ee0cdf186bfb30bdeb487b63d42f274c1073ce +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Nov 10 01:34:01 2007 +0000 + + [test] Link to the correct reference image. + + The generated test html guesses the names of the reference + images used in the tests. This is quite often wrong, and + makes it harder to change policy in cairo-test. Teach + make-html.pl to parse the log for the path to the reference image. + + test/make-html.pl | 102 ++++++++++++++++++++++++------------------------------ + 1 file changed, 45 insertions(+), 57 deletions(-) + +commit 15fc1bbefb49fefedca53c47ccfc7edace0acbfe +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Nov 10 01:33:47 2007 +0000 + + [test] log tested paths so that they can be parsed. + + The test logs currently do not record the paths of + image output, the reference images tested against, and + the diffs created. This means that make-html.pl has to + duplicate the policy in cairo-test.c. Fix this by teaching + cairo-test.c to log the paths. + + test/cairo-test.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 28412f780ebf52914aa374bb2bdd3d539bd29241 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Nov 6 16:11:06 2007 -0800 + + [win32-printing] bail out early if we don't have anything to do in paint_surf + + src/cairo-win32-printing-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit d72bb8c12efcffe7c576afe63212b2fe47e8154c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Nov 6 16:08:59 2007 -0800 + + [win32] Fix FIXED_to_fixed when cairo's fixed format isn't 16.16 + + src/cairo-win32-font.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 0901b83ca56e197d5c96d71ab8cfe53f21b4c8bb +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Nov 6 15:49:57 2007 -0800 + + [win32] Don't use GetGlyphOutline on non-TrueType fonts + + win32-glyph-metrics.patch: GetGlyphOutline only works on Truetype fonts, + so for non-Truetype fonts, assume no left or right bearing and use the + font ascent and descent for the glyph extents. + + src/cairo-win32-font.c | 44 +++++++++++++++++++++++++++++++------------- + 1 file changed, 31 insertions(+), 13 deletions(-) + +commit f11f7524b62df29aa377382f5ceeda8c3beb2d54 +Author: Vladimir Vukicevic <vladimir@h-232.office.mozilla.org> +Date: Tue Nov 6 15:40:30 2007 -0800 + + [quartz] work around Quartz bugs with images bigger than a certain size + + Quartz has a bug with images greater than (signed) 16 bits in height; avoid + creating or working with those. Also fixes some memory leaks. + + Patch from John Daggett. + + src/cairo-quartz-surface.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 59 insertions(+), 2 deletions(-) + +commit 95ede9ea59eb1e2d7fe10fbc698f3f9fff192e79 +Author: Vladimir Vukicevic <vladimir@h-232.office.mozilla.org> +Date: Tue Nov 6 15:06:06 2007 -0800 + + Use correct surface resolution when creating paginated fallback image + + If a surface resolution is set via _cairo_surface_set_resolution, it + needs to be used when the fallback image is created. The user sets + the fallback resolution on the paginated surface, so we need + to divide that by the resolution of the actual (target) surface, not + the paginated surface. + + src/cairo-paginated-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9b8d9f2859ce66b742c887eb673407a84095f488 +Author: Vladimir Vukicevic <vladimir@h-232.office.mozilla.org> +Date: Tue Nov 6 14:54:59 2007 -0800 + + [win32] Skip doing some work if we can't call StretchDIBits + + src/cairo-win32-printing-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit fa7e36669ae24fdbb5bd89a9fc1b6906408a5823 +Author: Vladimir Vukicevic <vladimir@h-232.office.mozilla.org> +Date: Tue Nov 6 14:53:09 2007 -0800 + + [quartz] Fix for 10.5 SDK; the FloatToFixed macro started doing strange things + + src/cairo-quartz-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 236c52b095661be395021d511d2dca0b532f83e9 +Author: Vladimir Vukicevic <vladimir@h-232.office.mozilla.org> +Date: Tue Nov 6 14:52:24 2007 -0800 + + Handle overflow/underflow gracefully when converting to 16.16 fixed + + src/cairo-fixed-private.h | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +commit 5b0a0fe7a230f99a43916a16bfd2d26882bad46b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Nov 7 11:17:59 2007 -0800 + + Mention cairo_new_sub_path in documentation of cairo_arc + + src/cairo.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 62d64e12aa9264a17c9bb7d6ae154a1778f0c7e1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 6 14:24:52 2007 +0000 + + [cairo-pdf-surface] Create a new path for an empty clip. + + If the clip path is empty, then we need to start a new path otherwise + the clip is ineffective. + + src/cairo-pdf-surface.c | 36 ++++++++++++++++++++++-------------- + 1 file changed, 22 insertions(+), 14 deletions(-) + +commit b4057b8643cf02439b6033d7443d0d4c42220a62 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 6 09:45:54 2007 +0000 + + [cairo-clip] Special case using an empty clip path. + + Detect when the user calls cairo_clip() with an empty clip path and + mark the clip as all_clipped. + + src/cairo-clip.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 2f0867b43fbc9a385a32a2a39895f4c3559f6ddf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Nov 6 09:44:03 2007 +0000 + + [cairo-surface] Handle the all clipped out case. + + Explicitly handle a clip which represents that the entire surface is + clipped out. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=13084. + + src/cairo-surface.c | 61 +++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 52 insertions(+), 9 deletions(-) + +commit 641215b2b018e98b298db5042360e2e22ab5a0aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Nov 5 22:22:42 2007 +0000 + + [test/clip-all] Combine text and everything clipped out. + + https://bugs.freedesktop.org/show_bug.cgi?id=13084 demonstrates a + regression where the clip is ignored by the xlib backend whilst + rendering text. Therefore we extend the current test cases to combine + a clip that represents everything clipped out with the rendering of + text. For completeness, we add a new test case that exactly mimics the + sequence of cairo operations that lead to the discovery of this bug - + namely the rendering of text with an empty clip path. + + test/Makefile.am | 2 ++ + test/clip-all.c | 10 +++++++ + test/clip-empty-ref.png | Bin 0 -> 118 bytes + test/clip-empty.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 84 insertions(+) + +commit 55b530ffef2bce96d57919563c6c9b58f02f8fb8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Nov 5 14:47:27 2007 -0500 + + [PS] Fix compiler warnings + + src/cairo-ps-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 570714b2b4e0b7aea58142bcba37a9eb7945cf09 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 14 21:34:40 2006 -0400 + + [test/fallback-resolution] set tolerance to a large value to see how it performs + in different fallback resolutions. + + test/fallback-resolution.c | 1 + + 1 file changed, 1 insertion(+) + +commit 5acbef20213ad354cc835f6d15811e333ee38e74 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 14 21:34:03 2006 -0400 + + [test] fallback-resolution: center text + + test/fallback-resolution.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 7f21bfb0a8265095d68bb5ff6afae7553683a776 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 14 21:33:13 2006 -0400 + + [meta-surface] Adjust tolerance when replaying to surfaces with device scale + + such that we get a consistent look with different fallback resolutions. + + src/cairo-meta-surface.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 4270cd3358fabf0d3e6ac4e866099b172082b592 +Author: Richard Hult <richard@imendio.com> +Date: Mon Nov 5 10:05:07 2007 +0000 + + [atsui] Use ascent+descent+leading to get the distance between baselines + + The height is currently mapped to the atsui metrics property capHeight, which + is documented as "The height of a capital letter in the font from the baseline + to the top of the letter". + + That doesn't match what height is in cairo, it should be the disctance between + baselines. This patch that fixes that (and makes webkit on GTK+ OS X + layout nicely). + + src/cairo-atsui-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3141b21c0c581dabc09a6ec9cdf0a071701b0e42 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Nov 5 10:05:04 2007 +0000 + + [configure.in] fix atsui experimental warning + + The 'experimental' warning for atsui was appearing + for --enable-quartz not --enable-atsui as it should. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b3ef306f84944a45b389c1f4bfeae910baf5bcb0 +Author: Chris Wilson <ickle@cube.localdomain> +Date: Mon Nov 5 09:09:14 2007 +0000 + + [cairo-atomic] Add a few more cpus that are known to have atomic access. + + Add x86_64 and arm to the list of cpus which do not require memory + barriers for reading and writing integers/pointers atomically. + + configure.in | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit bd5ed9a3988910a41748b7d78a265a2968a48f23 +Author: Chris Wilson <ickle@cube.localdomain> +Date: Mon Nov 5 09:05:25 2007 +0000 + + [cairo-atomic] Declare the mutex for NEEDS_MEMORY_BARRIER. + + Whilst NEED_MEMORY_BARRIER should be a subset of ! HAS_ATOMIC_OPS, + until we have accurate configure tests NEED_MEMORY_BARRIER may be + invoked independently. + + src/cairo-mutex-list-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 901b0c97523a2da00ccf91cf4cee3bf55ce989b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Nov 4 11:55:25 2007 +0000 + + [cairo-path-fixed] Exponentially enlarge cairo_path_buf_t. + + Allocate subsequent path bufs twice as large as the previous buf, + whilst still embedding a small initial buf into cairo_path_fixed_t + that handles the most frequent usage. + + src/cairo-path-fill.c | 2 +- + src/cairo-path-fixed-private.h | 20 ++++++---- + src/cairo-path-fixed.c | 89 +++++++++++++++++++++++++----------------- + 3 files changed, 68 insertions(+), 43 deletions(-) + +commit 92a18464bae40b19a26402eb2aa4950cac04c3a0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Nov 3 10:41:55 2007 +0000 + + [cairo-surface] Avoid allocation for common case of 1 box. + + _cairo_surface_fill_region(): avoid allocating the array of boxes if we + know that the region only contains one box and is therefore defined by its + extents. + + src/cairo-surface.c | 48 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 28 insertions(+), 20 deletions(-) + +commit e60a7c39cdcdfd474c4f6cc3b4612870726f55dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 25 10:24:01 2007 +0100 + + [cairo-atomic] Check whether we can access int/pointers atomically. + + Add a configure check to determine whether the host cpu can read/write + cairo_atomic_t without an explicit memory barrier, and update the macros + within cairo-atomic-private.h to reflect this knowledge. + + configure.in | 15 +++++++++++++++ + src/cairo-atomic-private.h | 20 +++++++++++++++----- + 2 files changed, 30 insertions(+), 5 deletions(-) + +commit 76667b4c2a4243a52ab0dbe372151a9ca7dfe931 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 3 16:53:54 2007 +1030 + + ROADMAP: Mark set PS level complete + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6d2615d449a9df6a8a7e3b5e5370b06dc14912f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Nov 2 09:17:59 2007 +0000 + + [test/degenerate-pen] Add missing return value. + + Carl - he likes to test us occasionally to make sure we're paying + attention. Well, that's the excuse I use... + + test/degenerate-pen.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit eb0b16837b7cbf63e4b49fb5c22cd392658033d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 1 22:11:01 2007 +0000 + + [cairo-spline] Eliminate redundant _cairo_fixed_to_double(). + + Inline and unroll PointDistanceSquaredToSegment() and eliminate the + multiple conversions between fixed point and doubles. This simple + transformation both shrinks the code and wins a few percent in path + intensive benchmarks such as fuckhergently.swf + + src/cairo-spline.c | 107 ++++++++++++++++++++++++++--------------------------- + 1 file changed, 52 insertions(+), 55 deletions(-) + +commit 2a25e226588404da2970f473bdeb0d2ce106ce58 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 1 19:49:19 2007 +0000 + + [cairo-spline] Reduce stack requirements during recursive refinement. + + By splitting out the knot vectors into a smaller, separate structure, we + can dramatically reduce the stack allocation for each level of recursion. + Secondly we can have the storage requirements by modifying the first set + of knots in-place, thus we need only allocate stack space for the knots + covering the deferred half of the spline. + + src/cairo-spline.c | 94 +++++++++++++++++++++++++++--------------------------- + src/cairoint.h | 13 +++++--- + 2 files changed, 55 insertions(+), 52 deletions(-) + +commit b311c414a27b7374540671b3ef7153b30def0451 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 1 19:40:25 2007 +0000 + + [cairo] Use NULL instead of a bare 0. + + Silence a sparse warning. + + src/cairo.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit fd5c5178189d2035f3e25919c7453fa4e1c5a76a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 1 19:39:02 2007 +0000 + + [cairo-scaled-font] Zero extents on early error. + + Ensure that the output extents of cairo_scaled_font_glyph_extents(), + are zeroed if we return early due to being passed by the user a + cairo_scaled_font_t with an error set. + + src/cairo-scaled-font.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit cee6aa016b9d96d3430187d44397df2b311de8bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 1 19:30:19 2007 +0000 + + [cairo-paginated-surface] Mark the backend static. + + Only used within the file, so do not expose outside the library. + + src/cairo-paginated-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6e0151df469b67ea56c36f7b0050b5d5c959c67d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 1 19:29:00 2007 +0000 + + [cairo-atomic] Rearrange code under the correct ifdefs. + + The atomic get/set depend upon NEED_MEMORY_BARRIER which is separate + from HAVE_ATOMIC_OPS. + + src/cairo-atomic.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +commit a26118cf5bf4063a4bdac2bece1bba0be776c801 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 31 16:37:09 2007 +0000 + + [cairo-png] Check for feof whilst reading. + + We need to check for both ferror() and feof() when handling short reads. + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 61143e5b21ea4c2687c1cef012eb0758a7cb378a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 31 16:34:51 2007 +0000 + + [cairo-png] Handle missing PNG_SETJMP_SUPPORTED + + If libpng has not been compiled with jmpbuf support, then we cannot + atempt to use it - in which case we fall back to png's default error + handler and abort. + + src/cairo-png.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit c37a8ace818770ce3f07c2a7147088231d559e44 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Nov 1 00:01:16 2007 +1030 + + Round floats in output-stream to 6 significant digits after decimal + + The previous commit increased the precision of floats from 6 digits + after the decimal point to 18 digits to correct rounding errors with + very small numbers. However most of the time this extra precision is + not required and results in increased PS/PDF output. + + This commit makes the precision after the decimal point 6 significant + digits. For example: + + 1.234567 + 0.123456 + 0.00123456 + 0.00000000123456 + + src/cairo-output-stream.c | 41 +++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 39 insertions(+), 2 deletions(-) + +commit 8297daff896ca9d803959edb3c1955977594fab9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Oct 31 02:41:33 2007 -0400 + + [cairo-output-stream] Write out floats to 18 digits after decimal point + + We write floats using %f as the scientific format used by smarter %g is + invalid in PS/PDF. %f however by default rounds to five digits after + decimal point. This was causing precision loss and making the newly + added degenerate-pen test fail for PDF. We now print up to 18 digits + which is as many bits doubles can accomodate. We can be smarter, but + that's for another commit. + + src/cairo-output-stream.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 04793175ace1312ac88570407ee28db4dde9a93c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 22:49:10 2007 -0700 + + Increment cairo version to 1.5.3 after the 1.5.2 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ee5dc04aaf81d6ce9c496c7966ceebfbd6ab12fb +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 22:33:24 2007 -0700 + + Add missing images to REFERENCE_IMAGES list + + Otherwise, these don't get included in the generated tar file + and the test suite doesn't pass when run from that tar file, + (like 'make distcheck' tests). + + test/Makefile.am | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 194029b63afa24eff8264f10a1c5a79d90e7fdd9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 22:15:55 2007 -0700 + + Increment cairo version to 1.5.2 and libtool versioning to 14:0:12 + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 06af5c2891b89da28581c30afcde06c5442884db +Author: Keith Packard <keithp@koto.keithp.com> +Date: Tue Oct 30 22:00:59 2007 -0700 + + Force non-AA text when using a bitmap strike with only scaling transform. + + When the current font size matches one of the available fixed sizes, and + the overall transform has only scaling components, FreeType will use the + fixed size bitmaps by default. For glyphs which do not have bitmaps, + force them to be rendered in monochrome instead of anti-aliased so + that they all match nicely. + + src/cairo-ft-font.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit f09f02a6e82df0efb66696fca857a412e7d12672 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 21:57:47 2007 -0700 + + Add notes for 1.5.2 snapshot + + NEWS | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 252 insertions(+) + +commit 448c9314252bba779194d2b01950b8738b26fd13 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 17:09:56 2007 -0700 + + Fix degenerate-pen test case by removing the triggering assertion + + Instead we choose either the first or last pen vertex as + appropriate. + + This makes the degenerate-pen pass stop failing on an + assertion, and passes for most backends. It's still failing + for the PDF backend, but that looks like a new, PDF-specific + bug. + + src/cairo-pen.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit 5e76f652842d36086f500735f67cfd1d2f3e3edf +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 17:00:33 2007 -0700 + + Add degenerate-pen test case. + + This demonstrates the assertion failure pointed out by + Benjamin Otte here: + + [cairo] Assertion 'i < pen->num_vertices' failed in 1.4.10 + http://lists.cairographics.org/archives/cairo/2007-August/011282.html + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/degenerate-pen-ps-argb32-ref.png | Bin 0 -> 390 bytes + test/degenerate-pen-ref.png | Bin 0 -> 278 bytes + test/degenerate-pen.c | 104 ++++++++++++++++++++++++++++++++++ + 5 files changed, 106 insertions(+) + +commit 53378301d42eabc1ebedca983092f522299bd18e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 13:13:29 2007 -0700 + + Update URLs for pixman to point to cairographics.org + + README | 7 ++++--- + configure.in | 2 +- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 6957aa27e8df55ed3ef1e0cfc62c714ad9b644ee +Merge: 00d701f 8d8724e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 09:45:59 2007 -0700 + + Merge in fix for get-path-extents test case. + + With independent fixes on both branches, the test case now + passes completely. Hurrah! + +commit 8d8724e80462593f6fee434cf972a67cb4ded282 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 09:45:45 2007 -0700 + + Improve brace readability for multi-line conditional + + src/cairo.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit f43f0c104045a88de87c5ebf28309a5ba728203e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Oct 30 09:44:42 2007 -0700 + + Fix remaining two calls to _cairo_path_fixed_get_current_point + + The previous commit failed to fix up two callers to the + _cairo_path_fixed_get_current_point function, (and since + C doesn't distinguish between an enum and our integer-as- + Boolean, the compiler didn't complain). + + Fortunately, though, the test suite did complain, as the + bug introduced a new failure into the get-path-extents + test, and git-bisect helpfully pointed to the previous + commit. + + With this fix, the new failure of get-path-extents is + eliminated, (though, in this branch the arc-based failure + of that test still exists). + + src/cairo-ft-font.c | 3 +-- + src/cairo-win32-font.c | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 00d701ff7de68609aa8cec7871d93b27a108fd14 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 29 17:55:28 2007 -0700 + + Limit miters for small angles + + This fixes the current failure get-path-extents, which is a + demonstration of the following bug: + + cairo_stroke_extents() gives wrong result for arcs in some cases + https://bugs.freedesktop.org/show_bug.cgi?id=7245 + + Many thanks to Michael Urman whose review of early versions of + this work found a fatal mistake in my algebra. + + src/cairo-path-stroke.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 75 insertions(+), 1 deletion(-) + +commit 9bf0a640d203a880cae5c6a8bf3602344d03cb68 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 29 16:24:13 2007 -0700 + + Add figure illustrating derivation of miter limit + + And use sin in the first place rather than the more awkward + secant. + + src/cairo-path-stroke.c | 43 ++++++++++++++++++++++++++++++++++++------- + 1 file changed, 36 insertions(+), 7 deletions(-) + +commit abeba1e69be3d4500107f10e50e1f0e7cae8c78f +Author: Carl Worth <cworth@cworth.org> +Date: Mon Oct 29 16:22:15 2007 -0700 + + Annoying churn of sgml templates + + doc/public/tmpl/cairo-ps.sgml | 53 ++++++++++++++++++++++++++++++++++ + doc/public/tmpl/cairo-surface.sgml | 19 ++++++++++++ + doc/public/tmpl/cairo-win32-fonts.sgml | 10 +++++++ + doc/public/tmpl/cairo-win32.sgml | 9 ++++++ + 4 files changed, 91 insertions(+) + +commit 0d42af2427d1de27845cb8a6b3d290a562c28fc6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 30 11:13:44 2007 +0000 + + [cairo-surface] Fix typo in doc. + + s/INVALUE_FORMAT/INVALID_FORMAT/ + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 39664b7cac7244ac901cb361442ca2967d74a542 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 30 11:01:40 2007 +0000 + + [cairo-path] Return CAIRO_STATUS_SUCCESS. + + If we have already returned the error status, then it is cleaner (and + the common idiom) to use 'return CAIRO_STATUS_SUCCESS' rather than + 'return status'. + + src/cairo-path.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e57df319633f8ebd0249096d76c9058f31f9835b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 30 10:58:16 2007 +0000 + + [cairo-path] Make _cairo_path_nil static. + + _cairo_path_nil is only used within cairo-path.c, so there is no reason + to expose it to the rest of the libary. + + src/cairo-path-private.h | 2 -- + src/cairo-path.c | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit 6fdb7f129c8154e288ee40765fa63ffaeebaf8fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 30 10:42:22 2007 +0000 + + Simplify return value from cairo_path_fixed_get_current_point(). + + The only caller of cairo_path_fixed_get_current_point(), used the status + return to determine whether or not the path had a current point (and did + not propagate the error) - for which we had already removed the + _cairo_error() markup. Now we reduce the boolean status return to a + cairo_bool_t, with a net reduction in code. + + src/cairo-path-fixed.c | 11 ++++------- + src/cairo.c | 13 +++++-------- + src/cairoint.h | 2 +- + 3 files changed, 10 insertions(+), 16 deletions(-) + +commit 4a2ab87e1a19921e2ae496f375c1144d2710d0c4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 29 12:04:33 2007 +0000 + + [cairo-surface] Add the usual guards to _cairo_surface_set_font_options(). + + Adrian Johnson hit a SEGV after + _cairo_paginaged_surface_create_image_surface() tried to set the font + options on an error surface after running out of memory. So add the + usual checks that the surface is not a snapshot, or in an error state or + finished before modifying its font options. + + src/cairo-surface.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit bb6d36561c5f50d869236b2bb4d10afd627f9a1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Oct 27 17:29:54 2007 +0100 + + [test/get-path-extents] Add link to bug report. + + Add a link to the original bug report for the broken extents with arcs. + [http://bugs.freedesktop.org/show_bug.cgi?id=7245] + + test/get-path-extents.c | 1 + + 1 file changed, 1 insertion(+) + +commit a69d4731300b430b802222d317698c313c75a31a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Oct 26 22:58:57 2007 -0700 + + Fix typo in _cairo_gstate_fini + + Obrigado a Luiz Americo Pereira Camara <luizmed@oi.com.br> + + src/cairo-gstate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0c02b998f9e8589a90b2e744392995903b94414f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 26 18:06:36 2007 +0100 + + [cairo-gstate] Allow angle==0 whilst rotating. + + Cut'n'paste error whilst copying the NaN check from + _cairo_gstate_scale() flagged the no rotation case as an error. + + src/cairo-gstate.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit ce44cd65238d38dd6958bf1f7b8ffb9d0e8723c3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 25 00:01:21 2007 +0100 + + [cairo-gstate] Add a missing _cairo_error() markup. + + Missed calling _cairo_error() for the CAIRO_STATUS_NULL_POINTER + returned by _cairo_gstate_init(). Rearrange the code to avoid the + overly complicated return statement. We note that _cairo_gstate_init() + is special as _cairo_gstate_fini() will always be called, even if an + error is thrown, and so do not do the usual cleanup in the case of an + aborted initialization. + + src/cairo-gstate.c | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +commit 4ce785e6a9433e7c862efaa6ef9c113412bf51a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 24 21:58:08 2007 +0100 + + [cairo-gstate] Add NaN check to rotate. + + Check the user input to _cairo_gstate_rotate() for invalid numbers. + + src/cairo-gstate.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6295a296b0064f0959ca7f39e1d8d00fa51b6251 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 24 21:29:54 2007 +0100 + + [cairo-gstate] Check scale sx * sy != 0. + + Bill Spitzak said + "If you really want to match when the determinant is non-zero in the + resulting matrix, use sx*sy != 0. This appears the same as sx&&sy but + may also catch when underflow makes the determinant zero." + + Return CAIRO_STATUS_INVALID_MATRIX if we know the user input will + generate a degenerate matrix. For additional paranoia we could recompute + and validate the inverse each time as well. + + src/cairo-gstate.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 483ebe866df539460861a05f5d5e8e56ab2f5430 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 24 19:32:00 2007 +0100 + + [cairo-test] Remove executable flag from source files. + + chmod a-x test/cairo-test.[ch] + + test/cairo-test.c | 0 + test/cairo-test.h | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 1651359ffbda4c14eaf4e79b6deced4f2c247686 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 24 18:35:41 2007 +0100 + + [cairo-perf-diff-files] Only use a valid initializer for min_test. + + Do not assume that the tests[0] is a valid test, but instead scan for + the first test that has a name (i.e. is not a terminator). + + perf/cairo-perf-diff-files.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 38c779e7d672151d25cd596149485fcc9f21c298 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 23 12:57:26 2007 +0100 + + [cairo-perf-diff-files] Check for terminator before comparing tests. + + Only the name of the terminating test is set so check that the current + test is not the terminator before comparing. + + perf/cairo-perf-diff-files.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +commit e3248a21841cfcbc285d76e2299485f9822857f1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 22 09:34:55 2007 +0100 + + [cairo-matrix] Check user input for invalid numbers. + + Supplement the guards for scale==0 with checks that the user does not + attempt to translate or scale by invalid numbers. + + src/cairo-gstate.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 8888afe9a4269e2d740d309186159fe946e57eaf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 22 23:05:25 2007 +0930 + + PDF: Fix meta surface patterns with EXTEND_REFLECT + + src/cairo-pdf-surface.c | 34 +++++++++++++++++++++++++++++----- + 1 file changed, 29 insertions(+), 5 deletions(-) + +commit f073a83251e56f641a522764c5cab1d71a786a60 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 22 00:02:23 2007 +0930 + + win32-printing: fix error in comment + + boilerplate/cairo-boilerplate-win32-printing.c | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit fb2bf3e250b39078476d3df4bdbb81201ef00a96 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:50:57 2007 +0930 + + win32-printing: remove unused code + + src/cairo-win32-printing-surface.c | 17 ----------------- + 1 file changed, 17 deletions(-) + +commit b854d1e1b57680f244939b90b03911a5300f34d6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:50:28 2007 +0930 + + win32-printing: fix typo in comment + + src/cairo-win32-printing-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d68c46b779909b5cc493a62db1228ea504ff52a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:49:58 2007 +0930 + + win32-printing: fix dash-caps-joins test failure + + src/cairo-win32-printing-surface.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 5fa62250456745907dd97fdb9030481bdc91a8dd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:49:33 2007 +0930 + + win32-printing: Add test boilerplate + + Testing win32-printing requires setting the default printer to + a PostScript level 3 color printer. The PostScript output is + saved to a file and converted to png using ghostscript. + + boilerplate/Makefile.am | 2 + + boilerplate/cairo-boilerplate-win32-printing.c | 308 +++++++++++++++++++++++++ + boilerplate/cairo-boilerplate-win32-private.h | 15 ++ + boilerplate/cairo-boilerplate.c | 11 + + 4 files changed, 336 insertions(+) + +commit e63b5e5201a79a8af4bd1d5acb524f067b5f2794 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:47:35 2007 +0930 + + win32-printing: Use the surface ctm in show_glyphs + + show_glyphs needs to scale the font by the current CTM. + + src/cairo-win32-printing-surface.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit ac9831ea55bd62f0ed427230ad80348768415852 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:46:52 2007 +0930 + + win32-printing: fix stroke rounding problems + + The win32 CTM is changed to user space to set the stroke parameters. + As win32 uses integers for stroke parameters this will cause rounding + problems depending on the CTM used. + + This is fixed by factoring out a scale from the user space CTM so that + xx, xy, yx, and yy in the CTM are all < 1. This preserves the shape + of the transformation while ensuring that the CTM does not cause + rounding problems. The stroke parameters are multiplied by the scale + value. + + src/cairo-win32-printing-surface.c | 35 +++++++++++++++++++++++++++++------ + 1 file changed, 29 insertions(+), 6 deletions(-) + +commit 89fe7b2ff09d19d3bdc84a8ee871e15716ff3539 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:45:40 2007 +0930 + + win32-printing: fix rounding problems when using pattern matrix + + When using meta surface patterns, the win32 CTM is changed to the + inverted pattern matrix then the meta surface is replayed to the + surface. The problem with this is that win32 uses integer coordinates + for GDI functions. A pattern matrix that scale the CTM up will cause + rounding errors in the position of each path in the pattern. + + This is fixed by always keeping the win32 CTM set to the identity + matrix. The CTM is stored in the surface and all coordinates are + transformed by the CTM before calling GDI functions. + + src/cairo-win32-printing-surface.c | 167 ++++++++++++++++++++++++++++++------- + src/cairo-win32-private.h | 2 + + 2 files changed, 138 insertions(+), 31 deletions(-) + +commit af01d9b8fabc2422eb7db144171d52fab95c4387 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:43:27 2007 +0930 + + win32-printing: add meta surface pattern support + + src/cairo-win32-printing-surface.c | 251 +++++++++++++++++++++++++++++-------- + src/cairo-win32-private.h | 1 + + 2 files changed, 200 insertions(+), 52 deletions(-) + +commit dae1b352c60e6a63ec2131f788fec230fd583d3d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:42:54 2007 +0930 + + update cairo-sections.txt + + doc/public/cairo-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit c8da2a7dedb8352bb623954c3ac40244b86eeb24 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:42:22 2007 +0930 + + win32-printing: check if images are opaque + + Don't use fallback for argb32 images with all alpha == 255. + + src/cairo-win32-printing-surface.c | 57 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 57 insertions(+) + +commit 9eb5747755f8c57bd6ba04925e193503fe194462 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 21 23:41:31 2007 +0930 + + win32-printing: Add missing struct initializers + + src/cairo-win32-printing-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8f6abdbc26ee15451b5a386610f7d5a7a9114d63 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Oct 20 23:41:46 2007 +0100 + + [quartz] return status instead of CGPatternRef + + Returning status improves error handling, since + returning NULL doesn't let us distinguish different + types of error. + + src/cairo-quartz-surface.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit cfb26fdf0f490b4902106b50d02628cffd53a0eb +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Oct 20 23:41:32 2007 +0100 + + [quartz] return status instead of cairo_quartz_surface_t + + Returning status improves error handling, since + returning NULL doesn't let us distinguish different + types of error. + + src/cairo-quartz-surface.c | 32 ++++++++++++++++++-------------- + 1 file changed, 18 insertions(+), 14 deletions(-) + +commit dec3099585eeb184ed51b5c720eb891314d7ea51 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Oct 20 22:45:30 2007 +0100 + + [quartz] return status instead of CGShadingRef + + Returning status improves error handling, since + returning NULL doesn't let us distinguish different + types of error. Suggested by Chris Wilson. + + src/cairo-quartz-surface.c | 30 ++++++++++++++++-------------- + 1 file changed, 16 insertions(+), 14 deletions(-) + +commit 481ce2b8cb2dc376419e7d6cbdd73bd4ebcd5b5b +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Jul 1 14:37:57 2007 +0100 + + implement clipping with surface masks. + + This implements clipping using CGContextClipToMask, which + means that it will only have an effect on OS X 10.4+. + No additional tests pass with this fix - mainly due to + text effects and problems with the IN, OUT, DEST_IN, DEST_ATOP + operators. + + src/cairo-quartz-surface.c | 43 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + +commit b9c065df74027b06e15e105fee5e4a4d350e0abf +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Jun 24 23:53:47 2007 +0100 + + fix dash-zero-length test + + Quartz was failing the dash-zero-length test for odd numbers + of dashes; it seems cairo wants 3 dashes to be on-off-on, + off-on-off, wheras quartz uses on-off-on, on-off-on. Fixed + by doubling the number of dashes used. + + src/cairo-quartz-surface.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit f334ee0397963e12c9efcb2690792aac83734661 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Jun 24 01:17:58 2007 +0100 + + Implement EXTEND_NONE for gradients. + + Fixes linear and radial gradients, which were displaying with + extend_pad when extend_none was requested. Makes the + radial-gradient test pass. + + src/cairo-quartz-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 0eeec372c0e7849d81bde8c8c5bf491919f51a6e +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Jun 23 23:36:32 2007 +0100 + + call _cairo_error on failure + + Call _cairo_error to enable setting a breakpoint on quartz errors. + + src/cairo-quartz-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8c8ec63903f8ad67a88394eff1359607bb93cf88 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Jun 23 12:34:24 2007 +0100 + + do not return a cairo_status_t of UNSUPPORTED + + We had a bug which converted cairo_int_status_t to cairo_status_t, + causing an assertion; reported at http://developer.imendio.com/node/128. + Return the generic out of memory error instead. + + src/cairo-quartz-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 6fec51990e90901ebafbb872a9e618cb70d17911 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jun 18 00:07:33 2007 +0100 + + do not ignore errors, return NULL instead (moz#874315) + + In the quartz backend there are occasional errors where returning NULL + can be used to signal that an error has occured. + + Mozilla bug #874315. + + src/cairo-quartz-surface.c | 37 ++++++++++++++++++++++++++++--------- + 1 file changed, 28 insertions(+), 9 deletions(-) + +commit 07fd091e3e6b925c588b9a16f6f10efcd46615c2 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jun 18 00:07:33 2007 +0100 + + do not ignore errors in setup_source + + In setup_source we were ignoring a return value, but we can't relay + it to the caller. This patch treats the error as an unsupported + operation. + + src/cairo-quartz-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit b6b9cef7136453f97543173bcb2ade46b1c46b77 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue Jun 19 21:13:39 2007 +0100 + + do not ignore errors when creating styles. + + This fixes statuses being ignored when calling + CreateSizedCopyOfStyle. As a side effect, it cleans up + two other bugs - the font object was sometimes not + freed, and a the scaled font mutex was aquired recursively, + causing a hang in the invalid-matrix test. + + src/cairo-atsui-font.c | 37 ++++++++++++++++++++++++++----------- + 1 file changed, 26 insertions(+), 11 deletions(-) + +commit 4885a12c6863321a566e7103bf6dccdd5d13a986 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jun 18 00:07:33 2007 +0100 + + do not ignore ATSUI errors. + + This fixes multiple instances where the return value of an ATSUI + call was ignored and converts them into CAIRO_STATUS_NO_MEMORY. + As a side effect it fixes a utf8 array not being freed. + + src/cairo-atsui-font.c | 74 ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 65 insertions(+), 9 deletions(-) + +commit b498c928be73635614596243d17a922e9d5ff008 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jun 18 00:07:33 2007 +0100 + + do not ignore errors in glyph paths + + When interpreting glyph paths in ATSUI callbacks we were ignoring + the cairo status. We need to return this to the caller. In order + to do this we introduce a custom OSStatus code in the range that + Apple reccommend. + + src/cairo-atsui-font.c | 30 ++++++++++++++++++++++++------ + 1 file changed, 24 insertions(+), 6 deletions(-) + +commit 95c708c717a367205845cefc81ae0afd9bd3d18f +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Jun 18 00:07:33 2007 +0100 + + propagate cairo_status_t return values + + There are several places in the quartz surface where we ignored + the returned status. This fixes the simple cases where the error + can just be returned to the caller. + + src/cairo-quartz-surface.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 7072959e3da0e8814cfd5193f8915aeb1341cc37 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Oct 20 11:46:54 2007 +0100 + + Fix to support new similar tests. + + The patch to repeat tests for similar surfaces changed the + format of the test log files, which were parsed to produce + index.html. This fixes the parser to understand those changes. + + test/make-html.pl | 136 ++++++++++++++++++++++++++++++------------------------ + 1 file changed, 75 insertions(+), 61 deletions(-) + +commit ae2535e4cb7c09eda1be13079d7a23b262aaef7b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 19 23:25:57 2007 +0100 + + [cairo-perf] Run performance tests over similar surfaces as well. + + Immediately repeat the performance test against a similar surface to + ensure that they introduce no regressions. Primarily introduced to + sanity check the change to use XShmPixmaps instead of XPixmaps in the + xlib backend, but it should be generally useful. + + perf/cairo-perf.c | 121 +++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 75 insertions(+), 46 deletions(-) + +commit 081507a09e61e1e4a048e40f8ba67a76aa76bbef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 19 22:26:28 2007 +0100 + + [cairo-test] Repeat tests for similar surfaces. + + Having noticed strange discrepancies creeping into similar surfaces + whilst working on the xlib backend, I thought it wise to also run + the test harness against similar targets. For consistency, only + targets whose similar surface use the same backend are included. + + This can be disabled by exporting CAIRO_TEST_IGNORE_SIMILAR=1. + + test/cairo-test.c | 173 +++++++++++++++++++++++++++++++++++------------------- + 1 file changed, 113 insertions(+), 60 deletions(-) + +commit 3211d810d31a6607c8d78a50f577a8ca8eb705e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 19 22:45:15 2007 +0100 + + [cairo-xlib] Check source for XRender support. + + Do not rely on the assumption that if the destination has render support + then the source has it as well - breaks when the boilerplate disables + render support for a surface. + + Similarly do not set the XRender attributes on the source surface + unless it actually has a xrender_format. + + src/cairo-xlib-surface.c | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 5c08226a0f7bc373a96fe75d15ad854910eb3265 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 19 16:04:33 2007 +0100 + + [cairo-clip] Avoid work when all clipped out. + + When the clip mask is empty we perform actions like composite 0x0 + surfaces, which results in a lot of unnecessary work and allocations. + Avoid doing work when we know everything is clip out and take the + liberty of freeing any memory associated with the clop state. + + src/cairo-clip-private.h | 2 ++ + src/cairo-clip.c | 86 +++++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 79 insertions(+), 9 deletions(-) + +commit c70c2cf6d6a71df54515175af0cb1651b67bdb86 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 19 23:31:36 2007 +0100 + + [Makefile.am] Fix ${top_srcdir}/libtool + + libtool exists in the top level build directory, but in a couple of + places we refer to the top level source directory. + + perf/Makefile.am | 4 ++-- + test/Makefile.am | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 76e3b3cdc3dda986d420637cfc2445aca481a863 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Oct 19 15:02:03 2007 -0400 + + [cairo-xlib] Release glyph surfaces if we made them to be generated + + The reasoning is that right now, applications render glyphs to images, + upload it to the X server, and keep a local copy in the cache. The X + server works hard to reuse glyph renderings, by hashing glyph images and + reusing them. So we are wasting memory in cairo apps that don't use the + glyph surface after uploading to the server, which is the case if you + don't use the glyph in an image surface. The patch does not release the + glyph surface if it already existed in the cache, so, worst case + scenario is that we render the glyph twice, if you first use it with + xlib, then with image surface. That effect should be negligible. + + src/cairo-xlib-surface.c | 83 ++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 63 insertions(+), 20 deletions(-) + +commit 8ae778273799ee9f6d3c13e9c41730daeda2c743 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 18 20:07:12 2007 +0100 + + [cairo-xlib-surface] Match content to xrender_format using the channel masks. + + _xrender_format_to_content() was using the channel offset to determine + whether the format supported a content type. + For example, the XRenderPictFormat for the A8 format looks like: + direct.alpha = 0; direct.alphaMask = 0xff; + direct.red = 0; direct.redMask = 0x00; + direct.green = 0; direct.greenMask = 0x00; + direct.blue = 0; direct.blueMask = 0x00; + which _xrender_format_to_content() matched as CAIRO_CONTENT_COLOR. + + Switch to using the channel masks for deducing content type. + + src/cairo-xlib-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b7d8763c58165817f3238def4d1771ce8575139e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 18 19:42:21 2007 +0100 + + [check-plt] Use -W flag to readelf. + + Pass -W to readelf so that the output (in particular the function name) + is not clipped to fit within 80 characters. + + src/check-plt.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 01eb16977359c7953dbabb52e1f6a132d93839f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 18 19:28:00 2007 +0100 + + [test/.gitignore] Add *.exe.so + + Ignore these winegcc output files. + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit c64335a9a846ba18411a720f6e69e511b15e2c6b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 17 23:12:49 2007 +0100 + + [cairo-scaled-font-subsets] Simplify boolean return code. + + _cairo_sub_font_lookup_glyph() was returning either a NULL_POINTER + error or success whereas its only caller was using it as a simple + predicate and handled the 'error' rather than propagate it upwards. + + src/cairo-scaled-font-subsets.c | 20 +++++++++----------- + 1 file changed, 9 insertions(+), 11 deletions(-) + +commit 379b9b79fa77be1bf9b5e0581b2363e80b0a8c88 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 17 20:41:57 2007 +0100 + + [cairo-xlib] Move the buggy_repeat discovery to the display_t. + + The VendorString parsing (to detect broken Xserver versions) was being + performed for each surface creation, but as it is a display invariant + we can save a small amount of work by storing the result on the + cairo_xlib_display_t. + + src/cairo-xlib-display.c | 9 +++++++++ + src/cairo-xlib-private.h | 1 + + src/cairo-xlib-surface.c | 9 +-------- + 3 files changed, 11 insertions(+), 8 deletions(-) + +commit 5e09653e5dca60902423938737195e38ccde1b95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 16 15:30:50 2007 +0100 + + [test/rgb24-ignore-alpha] Destroy the surface after use. + + Destroy the surface so that valgrind doesn't complain about the memory + leak. + + test/rgb24-ignore-alpha.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit bd3dd72262772f1b2dfd8335630163f2e3bfacac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 16 15:29:59 2007 +0100 + + [pdiff] Reorganise the inner loops of the convolution. + + Reorder the indices and introduce a couple of temporary accumulators to + improve cache access. + + test/pdiff/lpyramid.c | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +commit fa9201b9c98b18ea18fbee1e5608f20335a02131 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 16 15:27:33 2007 +0100 + + [pdiff] Check for too small images. + + The Laplacian pyramid can only work on images larger than 3x3 due to the + size of its convolution kernel. So if the image is too small return an + error (-1) before attempting to construction the pyramid. + + test/pdiff/pdiff.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3b1cc128dc4223ac88f7824dca223ed0f84df5d9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 16 10:55:04 2007 +0100 + + [cairo-ft-font] Add paranoid error checking to Fc* operations. + + Check the return status when using Fc*() functions to modify the pattern + and propagate the failure (if necessary). + + src/cairo-ft-font.c | 178 ++++++++++++++++++++++++++++++------------------- + src/cairo-ft-private.h | 1 - + 2 files changed, 108 insertions(+), 71 deletions(-) + +commit a55f1abf7cdc0276fe1eb85db969f33d0df4fe75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 16 10:29:45 2007 +0100 + + [cairo-clip] Pass the local pattern to create_similar_solid(). + + Avoid the short-lived pattern allocation within + _cairo_surface_create_similar_solid() by providing the local solid + pattern to use as the source. + + src/cairo-clip.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 7ff80234e3823547395819f96d7f7673df9ce9df +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 16 10:37:45 2007 +0100 + + [cairo-path-fixed] Drop the _cairo_error() markup. + + Do not use _cairo_error(CAIRO_STATUS_NO_CURRENT_POINT) within + _cairo_path_fixed_get_current_point() as the only caller, + cairo_get_current_point(), expects and handles that status. + + src/cairo-path-fixed.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 189feaf352f59b0a049202552024578715ef8cc7 +Author: Chris Heath <chris@heathens.co.nz> +Date: Mon Oct 15 17:31:50 2007 -0400 + + [autogen.sh] Tolerate tput failure (#12757) + + autogen.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4660561cb548ab8d1eca724fda4d3658c95d4c04 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 14 19:05:06 2007 +0930 + + PDF: Add support for CAIRO_FORMAT_A1 images + + src/cairo-pdf-surface.c | 43 ++++++++++++++++++++++++++++++++++++------- + 1 file changed, 36 insertions(+), 7 deletions(-) + +commit 39044157da03d598b816a459979f3d0e6285e023 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 14 19:04:33 2007 +0930 + + PDF: Add support for linear gradients with REPEAT and REFLECT + + src/cairo-pdf-surface.c | 228 +++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 189 insertions(+), 39 deletions(-) + +commit 5af1b2280b2cf952624d587496158a98df0ee504 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 14 00:04:21 2007 +0930 + + Make PostScript output text selectable + + The glyph names used in the Type42 and Type1 fallback fonts are now of + the form "/uniXXXX" where XXXX is the unicode character for each + glyph. When converted to pdf (eg using ps2pdf), pdf viewers are now + able to correctly extract the text. + + src/cairo-ps-surface.c | 36 ++++++-- + src/cairo-scaled-font-subsets-private.h | 15 +++ + src/cairo-scaled-font-subsets.c | 159 ++++++++++++++++++++++++++++++++ + src/cairo-type1-fallback.c | 18 +++- + src/cairoint.h | 1 + + 5 files changed, 219 insertions(+), 10 deletions(-) + +commit e347a7a7c394fc2638faa2ff52e4b96545ac1ee3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 22:59:20 2007 +0930 + + PS: Add support for images with bilevel alpha + + This patch eliminates two sources of fallback images. The alpha value + of each pixel in argb32 images are checked. If all alpha values are + 255 the image is treated the same as rgb24 images. If all alpha values + are either 0 or 255 and the PS level is 3, a Type 3 image (image + + mask) is emitted. + + src/cairo-ps-surface.c | 519 ++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 388 insertions(+), 131 deletions(-) + +commit af5cdde34d003b7d5943b169c160b91b8f7d10f3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 22:15:48 2007 +0930 + + PS/Win32-printing: remove redundant checks from _analyze_operation + + The check for supported operators is performed earlier in this + functions so these two checks in not required. + + src/cairo-ps-surface.c | 6 ------ + src/cairo-win32-printing-surface.c | 6 ------ + 2 files changed, 12 deletions(-) + +commit ff35ffd2a7baa775e2ef73b844e783434c149057 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 22:09:04 2007 +0930 + + Add meta-surface-pattern test + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/meta-surface-pattern-ref.png | Bin 0 -> 3072 bytes + test/meta-surface-pattern-rgb24-ref.png | Bin 0 -> 3162 bytes + test/meta-surface-pattern.c | 131 ++++++++++++++++++++++++++++++++ + 5 files changed, 133 insertions(+) + +commit 0b3f530973049737f942219452d991d76b65b724 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 21:49:50 2007 +0930 + + Add PS reference images for tests using gradients + + test/clip-operator-ps-argb32-ref.png | Bin 0 -> 8594 bytes + test/gradient-alpha-ps-argb32-ref.png | Bin 0 -> 187 bytes + test/gradient-alpha-ps-rgb24-ref.png | Bin 0 -> 184 bytes + test/linear-gradient-ps-argb32-ref.png | Bin 0 -> 613 bytes + test/linear-gradient-ps-rgb24-ref.png | Bin 0 -> 613 bytes + test/operator-source-ps-argb32-ref.png | Bin 0 -> 3885 bytes + test/operator-source-ps-rgb24-ref.png | Bin 0 -> 3548 bytes + test/text-pattern-ps-argb32-ref.png | Bin 0 -> 997 bytes + test/text-pattern-ps-rgb24-ref.png | Bin 0 -> 969 bytes + test/trap-clip-ps-argb32-ref.png | Bin 5810 -> 5700 bytes + test/trap-clip-ps-rgb24-ref.png | Bin 0 -> 5616 bytes + 11 files changed, 0 insertions(+), 0 deletions(-) + +commit e66ce8cbc6e53b4b07a9af6bb7d2294ada0782c0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 21:28:19 2007 +0930 + + PS: Add linear and radial gradient support + + src/cairo-ps-surface.c | 321 ++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 291 insertions(+), 30 deletions(-) + +commit 583059e4a3e86c937de13c07a50486f7ca77b335 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 21:16:49 2007 +0930 + + Fix bug in _gradient_is_opaque() + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b5c36010edc92ca129a0498cf04592f8f692f800 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 21:14:28 2007 +0930 + + Add cairo_ps_surface_restrict_to_level() API + + doc/public/cairo-sections.txt | 4 ++ + src/cairo-ps-surface-private.h | 2 + + src/cairo-ps-surface.c | 99 +++++++++++++++++++++++++++++++++++++++++- + src/cairo-ps.h | 25 +++++++++++ + 4 files changed, 129 insertions(+), 1 deletion(-) + +commit b5fa273c9a4f730882c6edade785236e72b2b4db +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 21:04:51 2007 +0930 + + Add PS reference images for tests using create_similar + + before the PS meta surface pattern patch these tests + had image fallacks in the PS output and did not require + a PS reference image. + + test/clip-fill-rule-ps-rgb24-ref.png | Bin 0 -> 309 bytes + test/clip-nesting-ps-rgb24-ref.png | Bin 0 -> 636 bytes + test/clip-push-group-ps-argb32-ref.png | Bin 0 -> 179 bytes + test/clip-push-group-ps-rgb24-ref.png | Bin 0 -> 179 bytes + test/clip-twice-ps-rgb24-ref.png | Bin 0 -> 541 bytes + test/copy-path-ps-rgb24-ref.png | Bin 0 -> 440 bytes + test/dash-caps-joins-ps-rgb24-ref.png | Bin 0 -> 3852 bytes + test/dash-scale-ps-rgb24-ref.png | Bin 0 -> 6316 bytes + test/dash-state-ps-rgb24-ref.png | Bin 0 -> 8650 bytes + test/degenerate-path-ps-rgb24-ref.png | Bin 0 -> 358 bytes + test/fill-and-stroke-ps-rgb24-ref.png | Bin 0 -> 319 bytes + test/fill-missed-stop-ps-rgb24-ref.png | Bin 0 -> 531 bytes + test/fill-rule-ps-rgb24-ref.png | Bin 0 -> 2031 bytes + test/font-matrix-translation-ps-rgb24-ref.png | Bin 0 -> 783 bytes + test/leaky-dash-ps-rgb24-ref.png | Bin 0 -> 284 bytes + test/line-width-scale-ps-rgb24-ref.png | Bin 0 -> 3901 bytes + test/new-sub-path-ps-rgb24-ref.png | Bin 0 -> 423 bytes + test/pixman-rotate-ps-argb32-ref.png | Bin 0 -> 411 bytes + test/pixman-rotate-ps-rgb24-ref.png | Bin 0 -> 392 bytes + test/random-intersections-ps-rgb24-ref.png | Bin 0 -> 89414 bytes + test/rel-path-ps-rgb24-ref.png | Bin 0 -> 243 bytes + test/rotate-image-surface-paint-ps-rgb24-ref.png | Bin 0 -> 274 bytes + test/source-clip-scale-ps-argb32-ref.png | Bin 0 -> 183 bytes + test/source-clip-scale-ps-rgb24-ref.png | Bin 0 -> 183 bytes + test/text-rotate-ps-rgb24-ref.png | Bin 0 -> 7196 bytes + 25 files changed, 0 insertions(+), 0 deletions(-) + +commit 8520ce31be13bc939357cd45bd1b4c1967d7ff53 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 13 20:17:43 2007 +0930 + + PS: Add meta surface pattern support + + boilerplate/cairo-boilerplate.c | 11 +- + src/cairo-ps-surface-private.h | 2 +- + src/cairo-ps-surface.c | 257 +++++++++++++++++++++++++++------------- + 3 files changed, 177 insertions(+), 93 deletions(-) + +commit e5b01e67975578797b4f7875a9ba02121ff935b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 11 17:54:55 2007 +0100 + + [Makefile.am] Add missing headers and reference images. + + Andrew Jorgensen spotted that make dist was missing a few headers needed + for compilation and running make distcheck had spurious failures. Add + the missing files to the distribution and a silly one-liner to check for + missing reference images. + + src/Makefile.am | 2 ++ + test/Makefile.am | 25 ++++++++++++++++++++++++- + 2 files changed, 26 insertions(+), 1 deletion(-) + +commit b7adcf67f8c640c146bada1fbeaa1cda1cfa825a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 11 14:11:06 2007 +0100 + + [cairo-path-stroke] Jump to cleanup after error. + + Incorrect early return in _cairo_stroker_curve_to() after + _cairo_stroker_join() resulted in leaking the local spline and pen. + + src/cairo-path-stroke.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0222c02d9525dc8ff1ad5a2bea46e623d9db1e43 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 11 14:01:20 2007 +0100 + + [cairo-pdf-surface] Return UNSUPPORTED from _to_unicode_stream(). + + Distinguish the UNSUPPORTED case where the font backend does not + support conversion to unicode from other fatal errors by returning a + status value rather than using stream.id == 0 to indicate any error. + + src/cairo-pdf-surface.c | 71 +++++++++++++++++++++++++++---------------------- + 1 file changed, 39 insertions(+), 32 deletions(-) + +commit 981bc12e5b9b91ce1c5abe343ace837561059658 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 10 23:58:43 2007 +0100 + + [cairo-ps-surface] Close a couple of memory leaks. + + Adjust error paths to free local resources. + + src/cairo-ps-surface.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit c1db44b26501cd905fb9ca858f41632c148b6b07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 10 15:15:55 2007 +0100 + + [cairo-png] Clean up volatile warning. + + gcc warns that 'rows' is missing a volatile qualifier - so add it. + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 05702b8b6ea73fecd04dc5cc4b26ad1d46fa8850 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 23:37:34 2007 +0100 + + [cairo-pdf-surface] Free the clip path on error. + + If we fail to add the clip path to the current group, destroy it. + + src/cairo-pdf-surface.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 8fa5f638a5f8eee4f9efe267ede20344fc7bd4e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 23:36:52 2007 +0100 + + [cairo-pdf-surface] Restore old_group for failed emit_meta_surface(). + + Ensure we restore the surface->current_group if we encounter an error + during _cairo_pdf_surface_emit_meta_surface() lest we leak the + current_group array. + + src/cairo-pdf-surface.c | 27 ++++++++++++++++----------- + 1 file changed, 16 insertions(+), 11 deletions(-) + +commit 8eb9fcf67336a8e4f95366956ae6f1880af4a93e +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Oct 10 14:05:22 2007 -0700 + + [win32] mask win32 printing vertex colors with 0xff00 per docs + + The range for the vertex color structures is 0x0000 .. 0xff00; I + think that this is an error in the docs, but strip out the low bits + just in case. + + src/cairo-win32-printing-surface.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 3545ebc1357969616e2f4fa6b36565f211ea36b3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Oct 10 14:01:30 2007 -0700 + + Fix win32 printing surface copyright notice + + Bad copy-and-paste of license. + + src/cairo-win32-printing-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0b65c301a72836f46cdcda8b8fa1e995100c7727 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 23:17:42 2007 +0100 + + [Makefile.am] Change lcov-clean to use more portable constructs. + + Replace xargs and rm with the binaries found by configure and drop the + passing of NUL-terminated strings as that is a GNU extension. + + Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit b8d7d62b08576364c8c402490b6f5e4a1472d5d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 23:12:52 2007 +0100 + + Fix some trivial syntax warnings for -ansi. + + gcc -ansi -pedantic gives a few syntax warnings, principally for use of + '//' comments and a comma at the end of enumerators. Apply these + corrections as they are trivial. + + configure.in | 2 +- + src/cairo-directfb-surface.c | 16 ++++++++-------- + src/cairo-meta-surface-private.h | 2 +- + src/cairo-type1-fallback.c | 2 +- + src/cairo-types-private.h | 7 +++---- + src/cairoint.h | 5 +++++ + 6 files changed, 19 insertions(+), 15 deletions(-) + +commit 7e6ac74de17cf82f224d9f5fad3ad60e92d7690b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 10 14:00:56 2007 +0100 + + [win32] Clean up compiler warnings. + + Fix up a few instances of unused status returns. + + src/cairo-win32-font.c | 89 +++++++++++++++++++++----------------- + src/cairo-win32-printing-surface.c | 26 +++++++---- + src/cairo-win32-surface.c | 24 +++++----- + 3 files changed, 76 insertions(+), 63 deletions(-) + +commit bee05467a5f398eaaaa8d79b3ff0a8b119856143 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 10 12:32:16 2007 +0100 + + [configure.in] Initialise test_svg. + + Set test_svg to no prior for checking for SVG availability so that the + printed summary is correct if the user explicitly disables the SVG + surface on the configure command line. + + configure.in | 1 + + 1 file changed, 1 insertion(+) + +commit 785cb5b7e11a2786b60a995c43e9ee411ec5ec2d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 16:58:46 2007 +0100 + + [cairo-image-surface] Dead code elimination. + + Remove an unreachable return and unused variable - tidy up after + a bad merge. + + src/cairo-image-surface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit 2268c5907ce80fe40d54ccfac8435ee5e22d36de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 13:23:34 2007 +0100 + + [cairo-glitz-surface] Propagate errors from set_image(). + + Propagate errors from _cairo_glitz_surface_set_image(). + + src/cairo-glitz-surface.c | 28 ++++++++++++++++++++-------- + 1 file changed, 20 insertions(+), 8 deletions(-) + +commit 4958789b9e8bf531259b3d1ea27887a8319f7696 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 12:49:08 2007 +0100 + + [cairo-xlib-surface] Propagate error from _draw_image_surface() to surface. + + Instead of simply ignoring the error that may occur when we upload the + destination image to the xlib surface (via XPutImage) record the error + on the xlib surface. + + src/cairo-xlib-surface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 9c65efeeb108c39e6f55c9247e7d11bfea35cb66 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 11:51:48 2007 +0100 + + [boilerplate-test-surfaces] Check show page for errors. + + Check that cairo_surface_show_page() did not generate any errors before + reading back the image buffer and saving it as a png. + + boilerplate/cairo-boilerplate-test-surfaces.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit caf04b1bb89c1a7668e36d5f334765a2323bd564 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 11:22:46 2007 +0100 + + [cairo-cff-subset] Propagate error status from failed append_copy(). + + Add a couple of missing status checks for the result of + cff_index_append_copy(). + + src/cairo-cff-subset.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit ef275cd65a9f20a8a3b1fb3883aff0cc8a3bf401 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 11:19:45 2007 +0100 + + [test-meta-surface] Propagate error from show_page(). + + Add a missing error propagation for _test_meta_surface_show_page(). + + src/test-meta-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 7758e56d0c96fd113a12b2adc92c783e962feebf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 11:16:40 2007 +0100 + + [cairo-hull] Remove a couple of redundant status returns. + + Those two functions unconditionally returned success, so change the + return to void. + + src/cairo-hull.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 1dabfc2b271a57b4eaa13922a031ccd38a586dd1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 11:15:27 2007 +0100 + + [cairo-clip] Propagate error status from clip_intersect_path(). + + Propagate the error status (filtering out UNSUPPORTED) from + intersect_path() when reapplying the clip path during a deep copy. + + src/cairo-clip.c | 51 +++++++++++++++++++++++++++++++-------------------- + 1 file changed, 31 insertions(+), 20 deletions(-) + +commit 32b78fffc3b8441029ee6b48762a7d0c06bb44a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 11:08:58 2007 +0100 + + [cairo-traps] Simplify the status interaction of traps_grow(). + + Simply return the error status from the traps_grow() function rather + than having an assignment in the return function and then immediately + another assignment of the error to the status member at its callsite. + + src/cairo-traps.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit 66563eddd8ba2610fa59341b9337a30533e70d56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Oct 9 09:28:35 2007 +0100 + + [cairo-pdf-surface] Check status return after emit_meta_pattern(). + + Add the missing status propagation. + + src/cairo-pdf-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit be7d1f0f8f84ddac9e8c7dda4aa39f88806a5e39 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 9 14:27:53 2007 -0700 + + Simplify CAIRO_REFERENCE_COUNT_INVALID macro + + MSVC doesn't like the previous anonymous structure/cast, so simplify + to just a bare {} structure for use as an initializer. + + src/cairo-reference-count-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 712c3cda44d7023316b93a1241e66aabde15d668 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 9 13:56:51 2007 -0700 + + [win32] reduce GDI object usage + + Only create region objects if they're necessary; this significantly reduces + the number of GDI objects in use by cairo surfaces. + + src/cairo-win32-surface.c | 159 ++++++++++++++++++++++++++-------------------- + 1 file changed, 89 insertions(+), 70 deletions(-) + +commit c99d33b10e84883ade1402c3c1d1efdb4b46f66e +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 2 10:54:44 2007 -0700 + + [win32] return a nil surface, not NULL + + Missed an error return + + src/cairo-win32-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4dbf495515d6de933de7f567b935c5fdceed5f6f +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Oct 2 10:48:59 2007 -0700 + + [win32] report error correctly if CreateCompatibleBitmap fails + + These errors were being dropped on the floor, leading to + rendering errors in out of video memory conditions. + + src/cairo-win32-surface.c | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +commit 61ba63f3a0947bc89310f04e9bc1694fb6451c11 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Sep 21 11:18:17 2007 -0700 + + [win32] remove ignore_operators flag from win32 printing surface + + Remove the ignore_operators fallback-avoiding workaround; if apps + want that same behaviour, they'll have to implement it themselves + by taking care when calling cairo_set_operator(). + + src/cairo-win32-printing-surface.c | 16 ++++------------ + src/cairo-win32-private.h | 5 ----- + src/cairo-win32.h | 3 ++- + 3 files changed, 6 insertions(+), 18 deletions(-) + +commit b12ed375cf7ad02a30324616e121a1e9ab8998cb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Oct 9 15:54:58 2007 -0400 + + [ChangeLog.mk] Fix changelog generation rules + + Previously it was trying to get logs of 1.2.0..1.4 while I really meant + was 1.2.0..1.4.0. It was a simple typo. + + ChangeLog.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cbc4087a40aa7c6039ddadfca2a9876cb14e1bc6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Oct 6 19:18:31 2007 +0930 + + Type1 subset: Add check for CFF fonts + + src/cairo-type1-subset.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit a1633df6eebd9b1252d832c7a70cea6150c818d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 17:21:00 2007 +0100 + + [cairo-scaled-font-subsets] Increment the sub_font counter after insertion. + + Do not modify the parent subsets->num_sub_font until after we have + successfully created the sub_font and inserted it into the hash table. + + src/cairo-scaled-font-subsets.c | 24 +++++++++++++++--------- + 1 file changed, 15 insertions(+), 9 deletions(-) + +commit cf2f994a319da1230c5d53f3dd81e7715e44a162 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 17:15:29 2007 +0100 + + [cairo-paginated-surface] Propagate backend errors to the surface. + + If we call a srface backend function directly, then it our + responsibility to propagate any fatal errors to the surface. + + src/cairo-paginated-surface.c | 57 ++++++++++++++++++++++++++----------------- + 1 file changed, 34 insertions(+), 23 deletions(-) + +commit 3da62fdd2848bd9d06b83534adfee2afa17828ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 13:41:39 2007 +0100 + + [cairo-xlib-display] Rescan the displays list during shutdown. + + As we drop the list mutex whilst calling the hooks during the + XCloseDisplay callback, we must rescan the list when we reacquire the + mutex in order to remove the display from the list. + + src/cairo-xlib-display.c | 48 +++++++++++++++++++++++++++--------------------- + 1 file changed, 27 insertions(+), 21 deletions(-) + +commit 737cbd25a6cb0bec87563926ad644da019fc9800 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 13:03:47 2007 +0100 + + [cairo-ps-surface] Cleanup ps surface after creation failure. + + If we fail to create the paginated wrapper for the ps surface, cleanup + the resources allocated for the surface. + + src/cairo-ps-surface.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit 31b52779bad4122d101cdffdb03153baf6cd011e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 12:55:13 2007 +0100 + + [cairo-boilerplate-xlib] Cleanup fallback after creation failure. + + Cleanup the local resource if we fail to create the X window and + surface for the xlib fallback test target. + + boilerplate/cairo-boilerplate-xlib.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit b210bea6c1867ef9d5c344747d17ca216f6071bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 12:45:36 2007 +0100 + + [cairo-pdf-surface] Check for pdf_resource_t allocation failure. + + Check that the resources are actually allocated or propagate the error. + + src/cairo-pdf-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 5ac7ba9821cba076d7f53f6b8836a8619661018c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 12:16:23 2007 +0100 + + [cairo-pdf-surface] Destroy local resources on failed surface creation. + + During _cairo_pdf_surface_create_for_stream_internal() destroy all + locally allocated resources and the output stream if we fail to create + the pdf surface or its paginated wrapper. + + src/cairo-pdf-surface.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +commit 63ddfa077c498780d46f752ec7f255b143c9f692 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 12:08:40 2007 +0100 + + [cairo-pdf-surface] Propagate error status. + + Add a few missing propagations of error status. + + src/cairo-pdf-surface.c | 45 ++++++++++++++++++++++++++++++++++----------- + 1 file changed, 34 insertions(+), 11 deletions(-) + +commit f1b6e2735c48d5a54190068c038047942f40f1d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 11:59:13 2007 +0100 + + [cairo-ps-surface] Propagate errors from emit_pattern(). + + Do not discard the error status from _cairo_ps_surface_emit_pattern(), + but propagate it back to the caller. + + src/cairo-ps-surface.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit 709f3160368417d9a9a78974b16d93ec3e5e3c14 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 17:37:05 2007 +0100 + + Cleanup a couple of warnings for use of uninitialized statuses. + + The compiler spotted a couple of potential uses of an uninitialized + status variable - apply the obvious fixes. + + src/cairo-svg-surface.c | 2 +- + src/cairo-type1-subset.c | 4 +++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 2f22510e22237283869fb2e23585504077566adf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 16:23:12 2007 +0100 + + [cairo-xlib] Initialize the global mutexes. + + The xlib surface creation routines will eventually attempt to lock the + global _cairo_xlib_display_mutex. Under the default environment this is + a non-issue as the CAIRO_MUTEX_INITIALIZE/FINALIZE become no-ops under + pthreads. However, for the sake of correctness (i.e. to silence the + lockdep debugger!) insert a call to initialize the global mutexes at the + start of the public entry points. + + src/cairo-xlib-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit d2557cd5eec7e51496d6b1b57899b2a028898a7c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 00:57:38 2007 +0100 + + [test-paginated] Free resources if fail to create the test surface. + + Ensure that all the locally allocated resources are freed if we fail + to allocate the paginated test surface. + + src/test-paginated-surface.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 60ffeecd4888fdf824b4095c945e1b27e05c0e1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 00:56:11 2007 +0100 + + [test-surfaces] Mark the test backend as static. + + There is no need to export the test surface backends, so mark them + static. + + src/test-fallback-surface.c | 4 ++-- + src/test-meta-surface.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 6598973661490ce90b9f42155d8397af491b90c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 10:23:13 2007 +0100 + + [cairo-scaled-font-subset] Propagate errors during collection. + + Propagate the errors encountered whilst iterating over the scaled font + subsets ie _cairo_scaled_font_subsets_foreach_scaled() and co. + + src/cairo-pdf-surface.c | 20 ++++++++++++-------- + src/cairo-ps-surface.c | 27 +++++++++++++++++++-------- + src/cairo-scaled-font-subsets-private.h | 2 +- + src/cairo-scaled-font-subsets.c | 20 ++++++++++++++++---- + src/cairo-svg-surface.c | 4 +++- + 5 files changed, 51 insertions(+), 22 deletions(-) + +commit 3a2dd9d33686d6a6d1549965cacf48a7f401c086 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 10:10:16 2007 +0100 + + [cairo-png] Markup a couple of original error sites with _cairo_error(). + + Add the _cairo_error() markup to the original error sites within the png + read/write functions. + + src/cairo-png.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 81243ee7ef1c3fdf3d571778c414adb64e05fa9d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 09:57:56 2007 +0100 + + [cairo-scaled-font] Mask cannot be NULL so remove redundant check. + + We either generate a mask for the glyphs or throw an error and bypass + the check, so at that point mask can never be NULL and we do not need + the test. + + src/cairo-scaled-font.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +commit f3d921baca02af4db5f8f1743f32e800d2f492bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 09:53:36 2007 +0100 + + [cairo-scaled-font] Destroy the zombie font. + + If we do not transfer the font to the holdovers array (because it has + been removed from the cache and left in a zombie state), destroy it. + + src/cairo-scaled-font.c | 46 ++++++++++++++++++++++++---------------------- + 1 file changed, 24 insertions(+), 22 deletions(-) + +commit 41aab58f3ae044f1baf668363376532381270ff4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 09:44:29 2007 +0100 + + [cairo-surface] Add the usual guards to the API entry point. + + Add the checks for unmodifiable surfaces (snapshots, finished and error) to + cairo_surface_set_fallback_resolution. + + src/cairo-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit f3ae783c9c81106bdb3aa2d15b848d131c39cd93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 09:42:23 2007 +0100 + + [cairo-surface-fallback] Release the acquired image on error. + + Add _cairo_surface_release_source_image() to the error paths. + + src/cairo-surface-fallback.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 29a5aae958fd9c6a8ec71326c7dad679c0bf5938 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 09:39:20 2007 +0100 + + [cairo-type1-fallback] Propagate error from closing the stream. + + Propagate the error from destroying the font and closing the output stream. + + src/cairo-type1-fallback.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit dd0f2d851cd4c4b2bab05668800e5379712f8ac6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 15:22:13 2007 +0100 + + [cairo-atomic] Hide compiler warnings for _cairo_status_set_error(). + + gcc treats cairo_status_t as an unsigned integer and so generates a + warning when passing it address as signed integer pointer to + _cairo_atomic_int_cmpxchg(). Use an ugly cast to hide the warning and + similarly to hide the warning about the unused result. + + src/cairo-atomic-private.h | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 91d18eefe7be6ad3d1fa951c7424d5843e4718f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 15:16:28 2007 +0100 + + [cairo-type1-subset] Propagate error status (correctly!) + + Adrian Johnson pointed out a couple of mistakes in my previous attempt, + 535e7c161b907292eac098b6b4305373558948df, to ensure propagation of errors + throughout the generation of the type1 subset. + + This time the status member of the cairo_type1_font_subset_t is removed + in favour of simply return the error status from each function. This + completely avoids the issue of whether we overwrite a pre-existing error + status and confustion of status returns and the status member. The + removal of the status from the structure is possible due to its + short-lived nature - it is not exposed outside of the + _cairo_type1_subset_init() function, and is not shared by any other + piece of code. + + src/cairo-type1-subset.c | 293 +++++++++++++++++++++++------------------------ + 1 file changed, 146 insertions(+), 147 deletions(-) + +commit bd2245f8b87d85f5ea61200838c10de70e776cf5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Oct 5 00:45:00 2007 +0100 + + [cairo-svg-surface] Review error propagation. + + Ensure that the error status is propagated and all local resources + are freed on the error path. + + src/cairo-svg-surface.c | 374 +++++++++++++++++++++++++++++++++++------------- + 1 file changed, 271 insertions(+), 103 deletions(-) + +commit 853b29c56fdb50c627b27fc3a767300c7551dba0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 23:30:21 2007 +0100 + + [cairo-pdf-surface] Add some missing error propagation. + + Add a couple of returns where the status was being assigned but not + checked. + + src/cairo-pdf-surface.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 323511088d0c9057c1b0fa5e7aacda5e44e2e139 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 23:22:49 2007 +0100 + + [cairo-pdf-surface] Propagate errors from close_stream. + + Propagate the status return from _cairo_pdf_surface_close_stream(). + + src/cairo-pdf-surface.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 0e3f5caf9f0bbdb5acf34ae1b92eab32bf08acbf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 23:18:33 2007 +0100 + + [cairo-pdf-surface] Propagate errors during pattern selection. + + Propagate error from _cairo_pdf_surface_select_pattern (). + + src/cairo-pdf-surface.c | 34 ++++++++++++++++++++++++++-------- + 1 file changed, 26 insertions(+), 8 deletions(-) + +commit 7940e39c1820b87c5b96dec6bc59eab97be4a793 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 23:15:21 2007 +0100 + + [cairo-pdf-surface] Propagate errors from opening/closing groups. + + Propagate the any error encountered during _cairo_pdf_surface_open_group + and friends. + + src/cairo-pdf-surface.c | 193 ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 152 insertions(+), 41 deletions(-) + +commit 7601939a6524ad97a333fef910f3b5e69c46776c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 23:07:36 2007 +0100 + + [cairo-deflate-stream] Return the nil stream if creating from an error stream. + + If _cairo_deflate_stream_create() is passed a stream in the error state, + return a stream also in the error state, namely the _cairo_output_stream_nil. + + src/cairo-deflate-stream.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit dbbcb5c26fba77d2a828b253c97e4770b81cf90b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 21:18:47 2007 +0100 + + [Makefile] Correct parameters to lcov reset. + + lcov uses -z to zero its counters, not --reset. + + Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 717dcd1a2c109f48f0a419a5178fc58d5d4f9a2d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 21:17:31 2007 +0100 + + [cairo-pdf-surface] Propagate resource allocation failure. + + Propagate failure of _cairo_pdf_surface_new_object(). + + src/cairo-pdf-surface.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 159 insertions(+), 4 deletions(-) + +commit 8fb40aee97fdb3ae2cbbfa5c6a350c7b8b030005 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 19:20:35 2007 +0100 + + [cairo-image-surface] Check for errors whilst cloning. + + After attempting to clone an image, check the context status and return + the nil surface if there was an error. + + src/cairo-image-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit b61931640d384707a6fc48f9ba4a4f2ddf675c32 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 19:12:10 2007 +0100 + + [cairo-ps-surface] Check the creation of output streams. + + Check for allocation errors during the creation of the output streams. + + src/cairo-ps-surface.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +commit 353c2ab5c0e10f267a1adf3957b5d6af4e6a2e29 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 19:10:42 2007 +0100 + + [cairo-output-stream] Guard against destroying the nil streams. + + Add a guard to return early if we attempt to call + _cairo_output_stream_destroy() on the nil cairo_output_stream_t streams. + + src/cairo-output-stream.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 7cc7bf09c1a61f407fdb054640ebf24039f985db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 18:52:50 2007 +0100 + + [cairo-meta-surface] Propagate errors during replay to the surface. + + Store any fatal errors raised during the replay on the surface object. + + src/cairo-meta-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 042821b566daf4aa17d662e7422d1b98858954d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 20:05:58 2007 +0100 + + [cairo-surface] Propagate fatal errors to the surface. + + Store errors raised by the backend on the surface. + + src/cairo-surface.c | 131 +++++++++++++++++++++++++++++----------------------- + 1 file changed, 72 insertions(+), 59 deletions(-) + +commit 535e7c161b907292eac098b6b4305373558948df +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 18:45:17 2007 +0100 + + [cairo-type1-subset] Do not mask error returns. + + When propagating errors, check that we do not overwrite a pre-existing + error. + + src/cairo-type1-subset.c | 123 +++++++++++++++++++++++++++++++---------------- + 1 file changed, 81 insertions(+), 42 deletions(-) + +commit bb8d4c0b14ec175637f57a3b51c4997c0be12a0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 18:33:24 2007 +0100 + + [cairo-truetype-subset] Do mask error status returns. + + Be careful not to overwrite existing the error status when propagating + errors and to not blindly return INT_STATUS_UNSUPPORTED from + load_truetype_table() as this will mask fatal errors. + + src/cairo-truetype-subset.c | 363 ++++++++++++++++++++++++++------------------ + 1 file changed, 219 insertions(+), 144 deletions(-) + +commit 37fd0d8967df21695d6536af1d7aedbeef2d2449 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 17:12:26 2007 +0100 + + [cairo-cff-subset] Propagate errors and review error paths. + + Ensure that errors get duly propagated back to the caller and all + locally allocated resources are freed along error paths. + + src/cairo-cff-subset.c | 291 +++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 209 insertions(+), 82 deletions(-) + +commit add0959328117e2023db0ba2432ed29ecb93275e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 17:00:26 2007 +0100 + + [cairo-debug] Finalize mutexes along with other static data. + + Initialize (so repeated calls of cairo_debug_reset_static_data() is + safe) and finalize the mutexes with the reset of the static data. + + src/cairo-debug.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit a4f20610afd18d58a964dbe84cc90c5723b2996d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 16:37:44 2007 +0100 + + [cairo] Protect the getters when operating on the nil object. + + Put a guard that checks the context's status at the start of each + getter that prevents the function from trying to dereference NULL state. + Use the status, as opposed to the invalid reference count, for + consistency with the existing guards on some of the getters. + + src/cairo.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 49 insertions(+), 2 deletions(-) + +commit 80c06f4539962231df771b38e64834a238f410dd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 16:16:41 2007 +0100 + + [cairo-scaled-font] Don't hold onto to a dropped font. + + Mark fonts that have been removed from the cache due to an error on a + shared object and do not put them into the holdovers array. + + src/cairo-scaled-font.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 6e93941a7605a3958269de195dc16f255dda7bfd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 16:04:49 2007 +0100 + + [cairo-scaled-font] Acquire mutex around _cairo_scaled_font_glyph_path(). + + All calls that manipulate the scaled_font->cache must hold its mutex. + + src/cairo-gstate.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 261971a3fb9c10c267cced53a440161f1acb4b5d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 16:03:12 2007 +0100 + + [cairo-gstate] Fix resource leaks on error paths. + + Ensure that all locally allocated (or referenced) resources are freed + if we later encounter an error. + + src/cairo-gstate.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 4e44d54f3e99b65f5e80485b22d31890ea3d6561 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 15:58:21 2007 +0100 + + [cairo-matrix] Check whether a matrix is invertible before use. + + Provide an early check as to whether the font matrix is invertible. + + src/cairo-gstate.c | 3 +++ + src/cairo-matrix.c | 10 ++++++++++ + src/cairo-scaled-font.c | 3 +++ + src/cairoint.h | 3 +++ + 4 files changed, 19 insertions(+) + +commit 528da4e5e131fe385a60431eb6656a542b27c70f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 15:50:40 2007 +0100 + + [cairo-scaled-font] Freeze the font cache whilst iterating over glyphs. + + Prevent glyph cache removal whilst iterating over a glyph string. + + src/cairo-scaled-font.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 4b81eeb20ebe070692ef8099c00de3829da8bf69 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 15:46:13 2007 +0100 + + [cairo-scaled-font] Destroy the mask on the error path. + + Do not leak the mask if we encounter an error whilst tracing. + + src/cairo-scaled-font.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit d0b1308cd73a6b3602e5414abf03a3bdf8d2d001 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 15:43:09 2007 +0100 + + [cairo-scaled-font] Store fatal errors on the cairo_scaled_font_t. + + Ensure that all fatal errors raised whilst using the font are stored on + the font. + + src/cairo-scaled-font.c | 35 +++++++++++++++++++++++------------ + 1 file changed, 23 insertions(+), 12 deletions(-) + +commit 4c32e6bfde5d613e0eeef407b9b50c557b1878e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 15:31:25 2007 +0100 + + [cairo-scaled-font] Return the error status from _cairo_scaled_font_set_error() + + Similar to the other _cairo_*_set_error() return the error status. + + src/cairo-ft-font.c | 4 ++-- + src/cairo-scaled-font.c | 18 +++++++++--------- + src/cairoint.h | 2 +- + 3 files changed, 12 insertions(+), 12 deletions(-) + +commit 06ae5f1ba3bb679c145d2f7e9ed8c244abf7ff17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 15:26:09 2007 +0100 + + [cairo-font-face] Set the error on the font. + + Similar to the other shared objects, store fatal errors on the shared + font_face. And do not return a cached reference to an object in an + error state. + + src/cairo-font-face.c | 46 +++++++++++++++++++++++++++++++++++++--------- + src/cairo-scaled-font.c | 1 + + src/cairoint.h | 4 ++++ + 3 files changed, 42 insertions(+), 9 deletions(-) + +commit 4cffdf2681ba254587bd774ea49718e71535b067 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 14:59:55 2007 +0100 + + [cairo-ft-font] Always call _cairo_ft_unscaled_font_fini (). + + The _cairo_ft_unscaled_font_fini() was skipped during the destroy for + fonts generated by cairo_ft_font_face_create_for_ft_face(). However + this causes a mutex to be 'leaked' for each font. + + src/cairo-ft-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit de1f92ae14bfc4d74d8df88ae81d7b90dd6739f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 14:51:16 2007 +0100 + + [cairo-output-stream] Propagate error status when copying streams. + + During _cairo_memory_stream_copy(), if set, copy the incoming error over + to the destination stream and return early. + + src/cairo-output-stream.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 2c256f292fc4a9fd8414e29c4df32d347e360900 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 14:35:08 2007 +0100 + + [cairo-error] Another _cairo_error (CAIRO_STATUS_SUCCESS)! + + Despite double checking, I still ended up converting one too many + status values. + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bed8239f03773ad1584c8ba48ceb0b34bbe69453 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 13:15:46 2007 +0100 + + [cairo-error] Clean up all the warnings and missing _cairo_error() calls. + + Every time we assign or return a hard-coded error status wrap that value + with a call to _cairo_error(). So the idiom becomes: + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + or + return _cairo_error (CAIRO_STATUS_INVALID_DASH); + + This ensures that a breakpoint placed on _cairo_error() will trigger + immediately cairo detects the error. + + src/cairo-analysis-surface.c | 4 +- + src/cairo-array.c | 9 +-- + src/cairo-atsui-font.c | 18 +++--- + src/cairo-base85-stream.c | 2 +- + src/cairo-bentley-ottmann.c | 22 +++----- + src/cairo-cache.c | 4 +- + src/cairo-cff-subset.c | 122 +++++++++++++++------------------------- + src/cairo-clip.c | 18 +++--- + src/cairo-deflate-stream.c | 2 +- + src/cairo-directfb-surface.c | 49 ++++++++-------- + src/cairo-font-face.c | 6 +- + src/cairo-font-options.c | 4 +- + src/cairo-ft-font.c | 111 +++++++++++++++--------------------- + src/cairo-glitz-surface.c | 89 +++++++++++++---------------- + src/cairo-gstate.c | 37 +++++------- + src/cairo-hash.c | 10 ++-- + src/cairo-hull.c | 2 +- + src/cairo-image-surface.c | 47 +++++++--------- + src/cairo-lzw.c | 6 +- + src/cairo-matrix.c | 4 +- + src/cairo-meta-surface.c | 48 ++++++---------- + src/cairo-os2-surface.c | 24 ++++---- + src/cairo-output-stream.c | 18 +++--- + src/cairo-paginated-surface.c | 8 +-- + src/cairo-path-fixed.c | 14 ++--- + src/cairo-path-stroke.c | 6 +- + src/cairo-path.c | 16 +++--- + src/cairo-pattern.c | 65 ++++++++++----------- + src/cairo-pdf-surface.c | 62 +++++++++----------- + src/cairo-pen.c | 19 +++---- + src/cairo-png.c | 24 ++++---- + src/cairo-polygon.c | 6 +- + src/cairo-ps-surface.c | 63 +++++++++------------ + src/cairo-quartz-surface.c | 15 ++--- + src/cairo-region.c | 22 +++----- + src/cairo-scaled-font-subsets.c | 20 +++---- + src/cairo-scaled-font.c | 16 +++--- + src/cairo-skiplist.c | 2 +- + src/cairo-spline.c | 6 +- + src/cairo-stroke-style.c | 6 +- + src/cairo-surface-fallback.c | 10 ++-- + src/cairo-surface.c | 82 ++++++++++++++------------- + src/cairo-svg-surface.c | 24 +++----- + src/cairo-traps.c | 9 +-- + src/cairo-truetype-subset.c | 43 ++++++-------- + src/cairo-type1-fallback.c | 27 ++++----- + src/cairo-type1-subset.c | 30 +++++----- + src/cairo-unicode.c | 20 +++---- + src/cairo-win32-font.c | 40 ++++++------- + src/cairo-win32-surface.c | 23 ++++---- + src/cairo-xcb-surface.c | 50 +++++++--------- + src/cairo-xlib-display.c | 2 +- + src/cairo-xlib-surface.c | 88 ++++++++++++++--------------- + src/cairo.c | 8 +-- + src/cairoint.h | 8 ++- + src/test-fallback-surface.c | 2 +- + src/test-meta-surface.c | 6 +- + src/test-paginated-surface.c | 6 +- + 58 files changed, 648 insertions(+), 856 deletions(-) + +commit d90d4bb6b99e0a912650234e28d097ea76c1cecc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 11:30:13 2007 +0100 + + [cairo-error] Make _cairo_error() return the error status. + + As pointed out by Jeff Muizelaar, this allows for more concise code, as + _cairo_error(CAIRO_STATUS_NO_MEMORY) + return CAIRO_STATUS_NO_MEMORY + can become + return _cairo_error(CAIRO_STATUS_NO_MEMORY); + + src/cairo.c | 6 +++++- + src/cairoint.h | 2 +- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 71120727e190dfaf3ccbe63b3d91d90e36cff6f6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 11:13:33 2007 +0100 + + [cairo-atomic] Use an atomic operation to set the status on a shared resource. + + Since the objects can be shared and may be in use simultaneously across + multiple threads, setting the status needs to be atomic. We use a + locked compare and exchange in order to avoid overwriting an existing + error - that is we use an atomic operation that only sets the new status + value if the current value is CAIRO_STATUS_SUCCESS. + + src/cairo-atomic-private.h | 8 ++++++++ + src/cairo-atomic.c | 15 +++++++++++++++ + src/cairo-pattern.c | 17 ++++++++--------- + src/cairo-scaled-font.c | 13 ++++++------- + src/cairo-surface.c | 13 ++++++------- + src/cairo.c | 12 +++++------- + 6 files changed, 48 insertions(+), 30 deletions(-) + +commit f4356efb64a043e7a459fe77616f3b7c92b25c49 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 09:30:32 2007 +0100 + + [malloc/error] Fixup _cairo_error (CAIRO_STATUS_SUCCESS)! + + At some point during the blitz, I accidentally wrote + _cairo_error (CAIRO_STATUS_SUCCESS) and then proceeded to paste it into + the next 30 error sites! s/CAIRO_STATUS_SUCCESS/CAIRO_STATUS_NO_MEMORY/ + + src/cairo-glitz-surface.c | 24 ++++++++++++------------ + src/cairo-gstate.c | 8 ++++---- + src/cairo-hash.c | 6 +++--- + src/cairo-hull.c | 2 +- + src/cairo-image-surface.c | 12 +++++++----- + src/cairo-lzw.c | 4 ++-- + src/cairo-meta-surface.c | 10 +++++----- + 7 files changed, 34 insertions(+), 32 deletions(-) + +commit ef5f460eb1f86a73e016c1150723ae1e70b3b037 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 09:08:46 2007 +0100 + + [cairo-path] Check for an empty path in cairo_append_path(). + + As we now generate empty paths, we must be able to handle empty paths + in the user facing API. cairo_append_path() has an explicit check, and + raises an error, for a NULL path->data, so we need to check the + path->num_data first for empty paths. + + src/cairo.c | 3 +++ + test/copy-path.c | 15 +++++++++++++++ + 2 files changed, 18 insertions(+) + +commit 8ad56b308ae8bbecfe9873c21551a6d4b2302420 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 4 00:38:12 2007 +0100 + + [malloc/error] Add call to _cairo_error() after a failed malloc. + + Blitz all allocations to ensure that they raise a + _cairo_error(CAIRO_STATUS_NO_MEMORY) on failure. + + src/cairo-array.c | 6 +++- + src/cairo-atsui-font.c | 1 + + src/cairo-base85-stream.c | 4 ++- + src/cairo-bentley-ottmann.c | 12 +++++-- + src/cairo-cache.c | 4 ++- + src/cairo-cff-subset.c | 72 +++++++++++++++++++++++++++++++---------- + src/cairo-clip.c | 4 ++- + src/cairo-deflate-stream.c | 4 ++- + src/cairo-directfb-surface.c | 32 ++++++++++++------ + src/cairo-font-face.c | 4 ++- + src/cairo-font-options.c | 11 +++++-- + src/cairo-ft-font.c | 13 +++++--- + src/cairo-glitz-surface.c | 33 +++++++++++++++---- + src/cairo-gstate.c | 13 ++++++-- + src/cairo-hash.c | 9 ++++-- + src/cairo-hull.c | 4 ++- + src/cairo-image-surface.c | 10 ++++-- + src/cairo-lzw.c | 2 ++ + src/cairo-meta-surface.c | 26 +++++++++++---- + src/cairo-output-stream.c | 21 +++++++++--- + src/cairo-paginated-surface.c | 4 ++- + src/cairo-path-fixed.c | 8 +++-- + src/cairo-path-stroke.c | 5 ++- + src/cairo-pattern.c | 5 ++- + src/cairo-pdf-surface.c | 10 ++++-- + src/cairo-ps-surface.c | 19 ++++++++--- + src/cairo-quartz-surface.c | 14 ++++++++ + src/cairo-region.c | 4 ++- + src/cairo-scaled-font-subsets.c | 18 ++++++++--- + src/cairo-scaled-font.c | 3 ++ + src/cairo-skiplist.c | 5 ++- + src/cairo-spline.c | 1 + + src/cairo-stroke-style.c | 4 ++- + src/cairo-surface-fallback.c | 2 ++ + src/cairo-surface.c | 1 + + src/cairo-traps.c | 5 ++- + src/cairo-truetype-subset.c | 13 ++++++-- + src/cairo-type1-fallback.c | 7 +++- + src/cairo-type1-subset.c | 26 +++++++++++---- + src/cairo-unicode.c | 8 +++-- + src/cairo-win32-font.c | 9 ++++-- + src/cairo-win32-surface.c | 5 ++- + src/cairo-xcb-surface.c | 23 ++++++++++--- + src/cairo-xlib-display.c | 4 ++- + src/cairo-xlib-surface.c | 19 ++++++++--- + src/cairo.c | 9 ++++-- + src/test-meta-surface.c | 4 ++- + 47 files changed, 404 insertions(+), 116 deletions(-) + +commit 66664596559c55913fb0b9c8784fe8ab862c217b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 3 23:25:10 2007 +0100 + + [malloc] Take advantage of calloc() argument checking. + + calloc() will check its arguments for integer overflows so it is safer + not to pre-multiply them. + + src/cairo-ft-font.c | 4 ++-- + src/cairo-glitz-surface.c | 2 +- + src/cairo-image-surface.c | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit e49bcde27f88e21d5b8037a0089a226096f6514b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 3 23:19:10 2007 +0100 + + [malloc] Check for integer overflow when realloc'ing. + + Perform similar sanity checks to Vlad's _cairo_malloc_ab() but on the + arguments to realloc instead. + + src/cairo-array.c | 4 ++-- + src/cairo-lzw.c | 6 +++++- + src/cairo-malloc-private.h | 30 ++++++++++++++++++++++++++---- + src/cairo-path-stroke.c | 3 ++- + src/cairo-pattern.c | 4 +++- + src/cairo-pen.c | 3 ++- + src/cairo-polygon.c | 3 ++- + src/cairo-spline.c | 3 ++- + src/cairo-traps.c | 3 ++- + 9 files changed, 46 insertions(+), 13 deletions(-) + +commit 8cba73a36c4ec42601388bb9374f3182651bfe60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 3 22:27:09 2007 +0100 + + [cairo-polygon] Add a _cairo_error(). + + Add a _cairo_error() to an originating error site. + + src/cairo-polygon.c | 1 + + 1 file changed, 1 insertion(+) + +commit e767c8b50af578209f1dac3b8f2ae22835e1fee7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Oct 3 22:26:03 2007 +0100 + + [cairo-pen] Add _cairo_error(). + + Markup a couple of originating error sites with _cairo_error(). + + src/cairo-pen.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 7047a091748577754845a6ed7f35837e41e7d5fb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 3 23:10:15 2007 +0930 + + TODO: Remove PDF encoding issues + + All PDF font encoding issues are fixed now that TrueType fonts are + embedded in PDF as CIDFontType2. + + TODO | 2 -- + 1 file changed, 2 deletions(-) + +commit 3e70b0a388c04c61816078de058c323774edeb96 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 3 23:01:59 2007 +0930 + + ROADMAP: Mark EPS support done + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a4627177663beacd3d15699fee072f7ad2eff4a9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Oct 3 19:55:05 2007 +0930 + + PDF: Fix bug in font resources + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c9a9f1299c2bd5b6a8e53fdb264c233a43e0c44a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 1 17:00:38 2007 +0100 + + [cairo-image-surface] Avoid trying to create surfaces with invalid strides. + + pixman does not (yet?) support arbitrary strides and will fail to + generate an image for the data. We misinterpret that failure as a + CAIRO_STATUS_NO_MEMORY, so instead return CAIRO_STATUS_INVALID_FORMAT + before attempting to create the pixman image. + + src/cairo-image-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e241205f0c6d823150cf018c0deb6652dd8b8d02 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 1 16:54:16 2007 +0100 + + [cairo-image-surface] Return correct error surfaces. + + Avoid returning the "generic" _cairo_surface_nil (which corresponds to + CAIRO_STATUS_NO_MEMORY) when the user asks us to create a surface with + an invalid format or content. + + src/cairo-image-surface.c | 65 ++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 59 insertions(+), 6 deletions(-) + +commit b4f86638cc4b87bfaf10568ae9beb89626e26613 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Oct 1 17:59:57 2007 +0100 + + [cairo-path] Don't raise an error when attempting to create an empty path. + + Generate a real empty path structure instead of returning + _cairo_path_nil, if we have been asked to create an empty path. + + (Also add a couple of missing _cairo_error()s and an appropriate test + case.) + + Spotted by Fred Kiefer. + + src/cairo-path.c | 36 ++++++++++++++++++++++++------------ + test/copy-path.c | 17 +++++++++++++++++ + 2 files changed, 41 insertions(+), 12 deletions(-) + +commit 042c382c094d1ea6f9a5a162d4d1d9ac83413233 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 29 07:55:48 2007 +0930 + + CFF Subetting: Fix for #10849 + + This fixes the problem Apple Preview has with viewing PDFs with CFF + font subsets. + + src/cairo-cff-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d837a458b95c0e1866eecaf3688dfa36e7dafe8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 27 17:45:51 2007 +0100 + + [configure] Work-around bad interaction of libtool and lcov + + libtool causes the .gcda files to be generated in the .libs/ directory, + separate from the .c source file. lcov expects them to be in the same + directory - so massage the lcov.info file to remove the reference to the + .libs/. + + Also separate the target for generating the lcov output, so that it can + be run independently from triggering the tests. And improve convenience + of using the other lcov targets. + + Makefile.am | 29 ++++++++++++++++++++--------- + 1 file changed, 20 insertions(+), 9 deletions(-) + +commit abe1b89da4a2aa255a218103c7a05711d0f73b1c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 27 14:49:30 2007 +0100 + + [test/get-path-extents] Test extents of cairo_text_path(). + + Check that the text path extents match the computed metrics. + + test/get-path-extents.c | 38 ++++++++++++++++++++++++++++---------- + 1 file changed, 28 insertions(+), 10 deletions(-) + +commit 0618818f7a4a323d2c2d0dd122e08aeaa025b3f3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 26 14:40:36 2007 +0100 + + [test/get-path-extents] Test extents of an arc. + + Add the test case from bug 7245, + https://bugs.freedesktop.org/show_bug.cgi?id=7245. + + test/get-path-extents.c | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +commit 54d5dccffa402835db57231f7a6cd98d71688359 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 26 22:21:26 2007 +0930 + + PDF: Compress pattern and group streams + + src/cairo-pdf-surface.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit a0a51977f48cc14c442357f472ed20e43c42829c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 26 22:21:07 2007 +0930 + + PDF: Fix bug in font resources when same font is in multiple groups + + src/cairo-pdf-surface.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit 76b9b1819251c8f3df0a5ada92a501ad83baa5a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 26 00:41:31 2007 +0100 + + [test/create-for-stream] Add the missing cairo_surface_finish(). + + Moments after pushing the new test case did I realise the issue... + We do not attempt to write out the surface to the user stream until + we perform the cairo_surface_destroy() by which point we have lost + the ability to interrogate the error status. We can avoid this by + explicitly calling cairo_surface_finish() and then checking the + error status - and we see that the error is indeed reported + correctly. + + No bug. Nothing to see here. Please move along. (Apart from the + request for the status to be return from cairo_surface_destroy!) + + test/create-for-stream.c | 1 + + 1 file changed, 1 insertion(+) + +commit 1e7f0bd4d5148940fe963eb20782bffe5ee735bd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 26 00:28:47 2007 +0100 + + [test/create-for-stream] Add test case for user error propagation. + + From bug https://bugs.freedesktop.org/show_bug.cgi?id=7049, we find + that the error status from the user supplied write function to + cairo_*_surface_create_for_stream is ignored and not propagated back + to the surface/context - leading to silent data loss. Incorporate + the suggested test case, a write function that simply returns + CAIRO_STATUS_WRITE_ERROR, into create-for-stream.c. + + test/create-for-stream.c | 57 +++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 44 insertions(+), 13 deletions(-) + +commit 1469de5211e84e40490fa612538986768748bd55 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 25 23:35:25 2007 +0100 + + [cairo-png] Propagate error from read and write funcs. + + Use the png_struct->error_ptr to propagate the error status from the + user/stdio read and write functions through the png_error() to the + cairo_surface_write_to_png*() and cairo_surface_read_from_png*() + functions. From there the error is returned back to the user either + directly or as the most appropriate error surface. + + (Fixes https://bugs.freedesktop.org/show_bug.cgi?id=6909) + + src/cairo-png.c | 57 ++++++++++++++++++++++------------ + test/create-from-png.c | 84 ++++++++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 113 insertions(+), 28 deletions(-) + +commit f1d84271d363cc80cdef92ec9cac2cf29783bfe0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 25 21:58:24 2007 +0100 + + [cairo-atomic] Do not use Intel atomic primitives on i386. + + When limiting the target instruction set for compatibility with older + processors, e.g. -march=i386, the Intel atomic primitives generate a + call to a non-existent function, __sync_fetch_and_add_4(). To detect + this scenario change the configure test from AC_TRY_COMPILE to + AC_TRY_LINK which will then cause Cairo to fall back to using mutexes + for its atomic operations. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03be41151d06d48d55bc1e172535829ec45a10cf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 23 21:08:09 2007 +0100 + + [cairo-atomic] Rewrite reference counting using atomic ops. + + Introduce an opaque cairo_reference_count_t and define operations on it + in terms of atomic ops. Update all users of reference counters to use + the new opaque type. + + src/Makefile.am | 1 + + src/cairo-clip-private.h | 12 +++--- + src/cairo-clip.c | 11 ++++-- + src/cairo-font-face.c | 49 +++++++++++------------ + src/cairo-ft-font.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-pattern.c | 50 ++++++++++++------------ + src/cairo-private.h | 3 +- + src/cairo-reference-count-private.h | 66 +++++++++++++++++++++++++++++++ + src/cairo-scaled-font-private.h | 3 +- + src/cairo-scaled-font.c | 77 ++++++++++++++++++------------------- + src/cairo-surface-private.h | 3 +- + src/cairo-surface.c | 33 ++++++++-------- + src/cairo-xlib-display.c | 42 +++++++++----------- + src/cairo-xlib-private.h | 5 ++- + src/cairo-xlib-screen.c | 12 +++--- + src/cairo.c | 23 ++++++----- + src/cairoint.h | 27 +++++++------ + 18 files changed, 244 insertions(+), 177 deletions(-) + +commit 8b6c871c9084739460f1320cd36560a09477a83e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 21 10:45:55 2007 +0100 + + [cairo-atomic] Introduce atomic ops. + + Test for the availability of the Intel __sync_* atomic primitives and + use them to define a few operations useful for reference counting - + providing a generic interface that may be targeted at more architectures + in the future. If no atomic primitives are available, use a mutex based + variant. If the contention on that mutex is too high, we can consider + using an array of mutexes using the address of the atomic variable as + the hash. + + configure.in | 16 +++++++++ + src/Makefile.am | 2 ++ + src/cairo-atomic-private.h | 81 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-atomic.c | 79 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-mutex-list-private.h | 3 ++ + 5 files changed, 181 insertions(+) + +commit 42de1a0a7f5cc10c2bad98ef69da302ed2a1ca84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 23 21:00:23 2007 +0100 + + Move GCC attributes wrapping into a separate header. + + The wrapping of GCC attributes (such as cairo_private) needs to be + visible to any header file, including those that avoid cairoint.h such + as cairo-boilerplate. To achieve this we move the pre-processor magic to + its own header file and include it as required. + + src/Makefile.am | 1 + + src/cairo-cache-private.h | 1 + + src/cairo-clip-private.h | 1 + + src/cairo-compiler-private.h | 115 ++++++++++++++++++++++++++++++++++++++ + src/cairo-hash-private.h | 1 + + src/cairo-mutex-private.h | 1 + + src/cairo-output-stream-private.h | 1 + + src/cairo-region-private.h | 2 + + src/cairo-wideint-private.h | 2 + + src/cairo-xlib-private.h | 5 +- + src/cairoint.h | 71 +---------------------- + 11 files changed, 131 insertions(+), 70 deletions(-) + +commit be327a7b49a62c684e133aad5d5d6adec30b60e6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 25 23:04:03 2007 +0930 + + PDF: Compress the content stream + + The content stream compression that was previously implemented was + inadvertently bypassed when the new stream handling for meta surface + patterns was implemented. + + src/cairo-pdf-surface-private.h | 4 +++ + src/cairo-pdf-surface.c | 65 ++++++++++++++++++++++++++++++++++------- + 2 files changed, 58 insertions(+), 11 deletions(-) + +commit 99fd9449c24055fd7b3623157397fe61282e2de0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 25 21:57:46 2007 +0930 + + PDF: Remove duplication from the resource dictionary + + The same font identifer was being added the resources every time it + was referenced. + + src/cairo-pdf-surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit dc23ecb6198f1e28b6096cbef931e15407cc20a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 23 21:02:31 2007 +0100 + + [cairo-boilerplate] Do not throw an error if an exclude target is not found. + + If we fail to exclude a target because it was not in the list of + targets - job done and no need to throw a tantrum. + + boilerplate/cairo-boilerplate.c | 5 ----- + 1 file changed, 5 deletions(-) + +commit 4f7c5a5033f41de94a7ea284a64f4afa0900fff1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 23 21:04:36 2007 +0100 + + [cairo-region] Call _cairo_error() at original error site. + + Before returning a fresh CAIRO_STATUS_NO_MEMORY, remember to call + cairo_error(). + + src/cairo-region.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 45feb13c2689a8f5813e60fb0c2d17e9e02fd4b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 23 21:34:50 2007 +0100 + + [cairo-clip] Avoid a malloc(0). + + Avoid a potential allocation of 0 bytes, and a potential NULL leading to an + incorrect CAIRO_STATUS_NO_MEMORY, when copying an empty clip region. + + src/cairo-clip.c | 36 +++++++++++++++++++++--------------- + 1 file changed, 21 insertions(+), 15 deletions(-) + +commit 77f1aa78872aa108199afd41247cf21827f7e33a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 23 17:43:44 2007 +0930 + + Add Encapsulated PostScript support + + The analysis surface will calculated the tight bounding box for each + page. A new paginated-surface backend function set_bounding_box() has + been added for passing the page bounding box to the target surface at + the end of the analysis phase. + + The changes to the PS file when EPS is enabled are: + - Add EPS header + - Use tight bounding box instead of page size + - Use save/restore to ensure PS interpreter is left in the same state + + src/cairo-analysis-surface-private.h | 10 ++- + src/cairo-analysis-surface.c | 32 ++++++++ + src/cairo-paginated-private.h | 19 ++++- + src/cairo-paginated-surface.c | 15 +++- + src/cairo-ps-surface-private.h | 3 +- + src/cairo-ps-surface.c | 151 ++++++++++++++++++++++++----------- + 6 files changed, 171 insertions(+), 59 deletions(-) + +commit beefbdd63864d10924360f41b244de7edf7b5f5b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 23 14:23:33 2007 +0930 + + Add Encapsulated PostScript API + + doc/public/cairo-sections.txt | 2 ++ + src/cairo-ps-surface-private.h | 2 ++ + src/cairo-ps-surface.c | 57 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-ps.h | 7 ++++++ + 4 files changed, 68 insertions(+) + +commit b20e08999e2f6e7a72ee75a7c3fd865bf0368794 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 23 11:37:02 2007 +0930 + + Truetype Subsetting: Avoid failing when fonts are missing optional tables + + Previously, the TrueType subsetting would fail if any of the "cvt", + "fpgm", or "prep" tables were missing from the source font. However + these tables are optional and not required in the subsetted font if + they do not appear in the source font. + + The "name" table has been removed from the subsetted font as the + Type42 specification does not require this table. + + src/cairo-truetype-subset.c | 153 +++++++++++++++++++++++++++++++------------- + 1 file changed, 110 insertions(+), 43 deletions(-) + +commit 8132b8b417c75388ce4c4671fffddaa44a5d1be0 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Sep 23 02:52:01 2007 +0100 + + [type1-subset] only subset ft fonts + + If atsui and ft were both enabled, the code crashed trying to subset + type-1 fonts; fixed by checking if fonts really are ft before using + them as ft fonts. This is a temporary fix until we support subsetting + across all font backends. + + src/cairo-type1-subset.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6020f67f1a49cfe3844c4938d4af24c63c8424cc +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Sep 21 11:02:42 2007 -0700 + + Avoid divide-by-zero when trying to allocate a 0-sized array + + Fix up the _cairo_malloc_* wrappers to avoid blindly dividing by zero; + any attempt to allocate a zero-sized chunk of memory will result in + NULL. + + src/cairo-malloc-private.h | 35 +++++++++++++++++++++++++---------- + 1 file changed, 25 insertions(+), 10 deletions(-) + +commit c79fc9af334fd6f2d1078071d64178125561b187 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 20 16:01:43 2007 -0700 + + Add rgb24-specific reference imag for mask-alpha test + + test/mask-alpha-rgb24-ref.png | Bin 0 -> 599 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 59dd59ce8d4c2a35788f3f0baf3409d3a8555744 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 9 22:32:36 2007 +0930 + + Add mask-alpha test + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/mask-alpha-ref.png | Bin 0 -> 640 bytes + test/mask-alpha.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 92 insertions(+) + +commit 12b2ab630c2343c7bd7d885cc0e773023e3d8fa8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 20 22:51:39 2007 +0930 + + PDF: Add support for CAIRO_FORMAT_A8 images + + src/cairo-pdf-surface.c | 44 ++++++++++++++++++++++++++++++++------------ + 1 file changed, 32 insertions(+), 12 deletions(-) + +commit 8a4adcf5f3c893505a53882a0532a220f79f4409 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 20 08:57:19 2007 +0930 + + ROADMAP: Add metadata API + + ROADMAP | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 6e78c6589d4af6291158b7cd9d94e3a80139e279 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 18 19:50:16 2007 -0400 + + [ROADMAP] Mark xlib IncludeInferior support done + + ROADMAP | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit d8b0de01d67cdf73d8266a73f54ba1ac42fee3c9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 18 09:26:05 2007 -0700 + + fix trailing whitespace + + src/cairo-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4fd9acc1b321d75623a66d37c0ff299ae06fb98b +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 4 10:30:08 2007 -0700 + + [win32] add new win32 printing surface + + src/Makefile.win32 | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e3c16e15e39d98f96e2ce20e397d88214f5a821e +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Aug 29 16:30:49 2007 -0700 + + Make NO_MUTEX really mean no mutexes + + src/cairo-mutex-type-private.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ffc16c4be2fb5a0d214cb186dee52e74dbd584cf +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Aug 29 16:25:58 2007 -0700 + + [win32] Add win32 printing surface + + Add win32 surface intended for use with printer DCs; GDI will be used + as much as possible, and the surface will be a paginated surface + that supports fine-grained fallback. + + (Original work from Adrian Johnson; additional fixes by me.) + + src/Makefile.am | 2 +- + src/cairo-paginated-surface.c | 37 +- + src/cairo-win32-font.c | 7 +- + src/cairo-win32-printing-surface.c | 1220 ++++++++++++++++++++++++++++++++++++ + src/cairo-win32-private.h | 66 +- + src/cairo-win32-surface.c | 78 ++- + src/cairo-win32.h | 3 + + src/cairo.h | 4 +- + 8 files changed, 1376 insertions(+), 41 deletions(-) + +commit 284ed91ee4418baf6dd1a437a904980a2156fa48 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Aug 29 15:34:04 2007 -0700 + + Let surfaces specify their native resolution, for fallback purposes + + src/cairo-image-surface.c | 2 ++ + src/cairo-paginated-surface.c | 4 ++-- + src/cairo-surface-private.h | 8 ++++++++ + src/cairo-surface.c | 24 ++++++++++++++++++++++++ + src/cairoint.h | 6 ++++++ + 5 files changed, 42 insertions(+), 2 deletions(-) + +commit 79d975f84bcc32e91db517d71a7312e2e1d653d4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 12 17:45:11 2007 -0400 + + [cairo-ft-font] Ignore FT_Load_Glyph errors other than out-of-memory + Same for FT_Render_Glyph. + + When the user asks us to render a glyph that is not available in the font, + it's mostly an unavoidable kind of error for them, as in, they can't + avoid such a call. So it's not nice to put cairo_t in an error state and + refuse any further drawying. + + Many PDF files are created using buggy software and cause such glpyh-not-found + errors for CID 0 for example. + + Eventually we should propagate these kind of errors up and return it from + the function call causing it, but that needs API change to add return value + to all text functions, so for now we just ignore these errors. + + src/cairo-ft-font.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 21ab44f11d3d20eead5d988c7a6cf48eebff08c7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 17 16:41:52 2007 -0400 + + [ChangeLog.mk] Make make rule depend on .git/HEAD, not .git + That is exactly what we want. Kristian Høgsberg suggested it. + + ChangeLog.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f4875dbe20e1d093d70f49c32f7ddf6a6e6ef61 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 16 20:26:33 2007 +0930 + + Analysis-surface: Use pattern extents to limit show_glyphs extents + + src/cairo-analysis-surface.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 14786385b40aa0ae83e3b077a82e3f34aba63f22 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 16 19:43:28 2007 +0930 + + Change paginated surface size when PS/PDF _set_size() called + + The finer-grained fallbacks would not work correctly if the page + was set to a larger size. + + Add _cairo_paginated_surface_set_size() function that is called + from cairo_ps_surface_set_size() and cairo_pdf_surface_set_size(). + + src/cairo-paginated-private.h | 5 +++++ + src/cairo-paginated-surface.c | 23 +++++++++++++++++++++++ + src/cairo-pdf-surface-private.h | 2 ++ + src/cairo-pdf-surface.c | 14 ++++++++++---- + src/cairo-ps-surface-private.h | 2 ++ + src/cairo-ps-surface.c | 14 ++++++++++---- + 6 files changed, 52 insertions(+), 8 deletions(-) + +commit 46cb7e69526e8b5663077e7409dc232a0f56800b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 16 16:32:54 2007 +0930 + + PS: Remove initclip operator + + The DSC and EPS specifications do not allow the use of initclip. + Instead each page is wrapped in a gsave/restore pair and a + "grestore gsave" is emitted when the clip path is reset. + + src/cairo-ps-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e9d85235f9cceed92af428e0ab43503fe0850636 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 16 16:21:10 2007 +0930 + + PDF: Fix copy_page() bug + + src/cairo-pdf-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit a5cb48fcf269c16dd138c0ee31b138b1f13e623d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 16 16:15:10 2007 +0930 + + PS: Remove copy_page() + + The DSC specification recommends not using the copypage operator as it + breaks page independence. + + src/cairo-paginated-surface.c | 3 +-- + src/cairo-ps-surface.c | 14 +------------- + 2 files changed, 2 insertions(+), 15 deletions(-) + +commit 03f7a51f47717af45afbc439ce2178789449ab32 +Author: Ken Herron <kherron+cairo@fmailbox.com> +Date: Sun Sep 16 15:56:16 2007 +0930 + + PS output optimizations (#11442) + + This patches cairo-ps-surface.c to use the aliases for moveto, lineto, curveto, + and closepath. It also uses selectfont to select fonts. + + src/cairo-ps-surface.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit 1274147ce3ec855488fe4e437838b1134c494413 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 15 04:03:08 2007 -0400 + + [cairo-gstate] Fix comment about font_matrix having zero translation + + src/cairo-gstate.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 6fbe2432c6072522b9003a1e46180392010a7aad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 15 04:02:39 2007 -0400 + + [PDF] Fix typo in comments + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dca93eb76d64194f1325d7b941fa523da7801634 +Author: Jeff Muizelaar <jeff@freiheit.infidigm.net> +Date: Wed Sep 12 23:12:59 2007 -0400 + + Fix theoretical NULL return from cairo_pop_group() + + This also makes the code more consistent as group_pattern always holds a valid + pattern. + + src/cairo.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5eae45c55b3cd240945cd225631c9c782f69b50f +Author: Jonathan Gramain <jonathan.gramain@gmail.com> +Date: Wed Sep 12 17:43:55 2007 -0400 + + [cairo-gstate] Fix order of matrices in _cairo_gstate_backend_to_user_rectangle() + + The cairo_matrix_multiply(out,a,b) docs say that it is equivalent to applying + matrix a first, followed by b. Looking at _cairo_gstate_backend_to_user() we should + apply device_transform_inverse followed by ctm_inverse. That's what we do now. + + src/cairo-gstate.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit f2910ad3e9bfd279af7f9f43013489a32b5c1747 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 11 13:32:26 2007 -0700 + + Update cairo-sections.txt + + doc/public/cairo-sections.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9e975757a2820303d67e8497ab6cef9368237eb5 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 11 13:30:35 2007 -0700 + + Export cairo_surface_{copy,show}_page + + This patch adds cairo_surface_copy_page and cairo_surface_show_page + as public methods, leaving the previous cairo_show_page variants as + shorthands. copy_page/show_page are specific to the surface, not + to the context, so they need to be surface methods. + + TODO | 5 ----- + boilerplate/Makefile.win32 | 4 ++++ + boilerplate/cairo-boilerplate-test-surfaces.c | 5 +---- + src/cairo-gstate.c | 4 ++-- + src/cairo-paginated-surface.c | 6 +++--- + src/cairo-surface.c | 27 +++++++++++++++++++++++++-- + src/cairo-svg-surface.c | 2 +- + src/cairo.c | 6 ++++++ + src/cairo.h | 6 ++++++ + src/cairoint.h | 8 ++------ + 10 files changed, 50 insertions(+), 23 deletions(-) + +commit 7dd05b7f86da6a465bb979c2ba955655ddcf66ed +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Sep 11 11:27:35 2007 -0700 + + [mlk] Free boxes in copy_rectangle_list on success + + Fix memory leak when copy_rectangle_list is used. + + src/cairo-clip.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 897350c6c5cba29b8bd7890a33ecc4d7fa9b7795 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 9 19:11:12 2007 +0930 + + PDF: Remove BC entry from Smask dictionary + + The BC (background color) in the smask of the recently added + cairo_mask() support was causing Ghostscript to crash due to the wrong + number of BC values. The BC entry has been removed as BC default color + is already what we want. + + src/cairo-pdf-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 909e0be2416aa6833639439279583d1ae61777fc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 9 11:20:02 2007 +0930 + + Add PDF support for cairo_mask() + + src/cairo-pdf-surface.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 125 insertions(+), 4 deletions(-) + +commit d62f8861689d8b9a9a837043fb78813f0407abd4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 5 08:07:41 2007 +0100 + + [cairo-ft-font] Early detection of a zero sized bitmap. + + Under rare circumstances we may need to extract a surface that + represents a bitmap with width==0 and rows==0. Detect this case at the + start and simply return a zero-sized surface. + + Fixes https://bugs.freedesktop.org/show_bug.cgi?id=12284. + + src/cairo-ft-font.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit d635e0103346f22e578d17c59153d292820e00d2 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Sep 6 12:56:59 2007 -0700 + + Add b8g8r8 formats to cairo-image-surface + + Add recognition code for x8b8g8r8 and a8b8g8r8 to cairo-image-surface. + (Used as the default for 24bpp by some older VNC servers.) + + src/cairo-image-surface.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit 3c01efb0ee0c8911fba7627d056ec3b53dfab6e3 +Merge: 0682b9a 1e21220 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 5 14:38:40 2007 -0700 + + Merge branch adrianj/pdf-meta-surface-pattern into cairo + + This does introduce some reported failures from the cairo-pdf backend + into the test suite. However, in all cases the output PDF files look + fine when viewed with acroread. It looks like all of the problems + could be fixed by using cairo_rectangle;cairo_fill along with + CAIRO_EXTEND_PAD when drawing images with cairo inside poppler. + + However, I'm not yet filing a bug against poppler and disabling these + tests because we need to _implement_ CAIRO_EXTEND_PAD before we can + tell poppler to start using it. + +commit 0682b9a9c18640c284c7cc8ba8792a329414998e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 4 16:47:49 2007 -0700 + + Add rgb24-ignore-alpha test + + This test demonstrates a bug when compositing an rgb24 image over an argb32 + image, (the implementation appears to be examining the alpha channel + rather than ignoring it). + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/rgb24-ignore-alpha-ref.png | Bin 0 -> 116 bytes + test/rgb24-ignore-alpha.c | 65 ++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 67 insertions(+) + +commit 84a2c8968a57ed7593db1515718115218072bc0d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 5 12:38:27 2007 -0400 + + [test,perf] Support TARGETS_EXCLUDE make variable + + perf/Makefile.am | 6 ++++-- + test/Makefile.am | 5 +++-- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 1e21220f0e2540e3befa66e4764f75589d0eef82 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 5 22:53:43 2007 +0930 + + Create meta-surface source image with same content type as the + meta-surface + + src/cairo-meta-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 875e32178e5d990a09f3c41262d890888035f04f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 5 22:51:13 2007 +0930 + + Eliminate unclipped CLEAR from meta-surface playback + + The optimization that avoids replaying commands prior to an unclipped + CLEAR operation now starts playback from the first command after the + CLEAR. This avoids the need to handle the unclipped CLEAR in the PDF + surface. + + src/cairo-meta-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit d24f019101dd014983aeb0bf186fe2011694e2ed +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 5 22:26:16 2007 +0930 + + Add support for PDF meta-surface patterns + + boilerplate/cairo-boilerplate.c | 11 +- + src/cairo-analysis-surface.c | 66 +++++++++ + src/cairo-meta-surface-private.h | 4 + + src/cairo-meta-surface.c | 43 +++++- + src/cairo-pdf-surface.c | 282 ++++++++++++++++++++++++++++----------- + src/cairo-types-private.h | 3 +- + 6 files changed, 317 insertions(+), 92 deletions(-) + +commit b85032584b32af968dc8d8a0fcfc9f3e1d2770a0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 5 00:26:56 2007 -0400 + + [configure.in] Fix non-pkgconfig Xrender detection path (#4724) + + configure.in | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 1d788da5175dac34ed0298204753bf1b40dfc2b0 +Merge: 49ae376 e1819a2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 4 19:12:48 2007 -0400 + + Merge branch 'no-xrender.h' into cairo + +commit e1819a24fb0196218c4045616c2ba458819b7d31 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 4 19:12:14 2007 -0400 + + [cairo-xlib-xrender-private] Remove some protocol-specific macros + + src/cairo-xlib-xrender-private.h | 48 ---------------------------------------- + 1 file changed, 48 deletions(-) + +commit 5e09126ce13c72222719b73ed3a8f504cf352583 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 4 18:40:54 2007 -0400 + + [cairo-xlib-xrender-private] Add copyright/license info for copied files + + src/cairo-xlib-xrender-private.h | 163 +++++++++++++++++++++++---------------- + 1 file changed, 95 insertions(+), 68 deletions(-) + +commit 49ae376840a5851bf4cc281a0562acdfe03337df +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 4 11:35:40 2007 -0700 + + Fix error in description of cairo version numbers + + And eliminate a bit of redundant text. + + configure.in | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit b60c0a672f1711c20f898ac76c15b6b65a63d46e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 3 14:33:11 2007 +0100 + + [cairo-boilerplate] Introduce CAIRO_TEST_TARGET_EXCLUDE. + + As opposed to the CAIRO_TEST_TARGET env var which lists the exact + targets to test, CAIRO_TEST_TARGET_EXCLUDE instead supplies a list of + targets to filter from the testing set. This is useful under + circumstances where the build environment prevents testing of a target, + for example no DirectFB support or the glitz library is broken, but where + you still want to perform the minimal check that the code compiles. + + boilerplate/cairo-boilerplate.c | 39 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 38 insertions(+), 1 deletion(-) + +commit 740fed62d236224fdfbfccf8c49a199851189107 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 31 20:52:43 2007 -0400 + + [xlib] Make it compile without Xrender available at compile time (#12210) + + src/Makefile.am | 3 +- + src/cairo-xlib-display.c | 1 - + src/cairo-xlib-private.h | 10 +- + src/cairo-xlib-screen.c | 2 - + src/cairo-xlib-surface.c | 7 +- + src/cairo-xlib-xrender-private.h | 1102 ++++++++++++++++++++++++++++++++++++++ + 6 files changed, 1110 insertions(+), 15 deletions(-) + +commit c8ed3e1827dd1e6e85f2a40de67c4013432ba3bf +Author: Jody Goldberg <jody@gnome.org> +Date: Fri Aug 31 17:00:36 2007 -0400 + + [PDF] The symbol 'GROUP' is already used on some win32 systems; add a prefix + + src/cairo-pdf-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit c14cf02f61105b755b380bd0a5d5b9e83a97d2c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 31 17:20:54 2007 +0100 + + [cairo-surface] Add a comment about why the glyph array is not const. + + As penance for attempting to make the glyph array constant, add a + comment block to explain that the backends rely on being able to modify + the array. + + src/cairo-surface.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit e8e3bfc1308aa30ea08ec530b6a5ddf532fd3088 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 31 16:53:21 2007 +0100 + + Revert "[cairo-gstate] Avoid copying untransformed glyphs." + + This reverts commit 919bea6dbb32746f11781cd3a94eb44f5c4a32e6. + + Sadly as Behdad points out some backends do modify the glyph array and, + for example cairo-xlib-surface, hide this from the compiler with some + evil casts. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-directfb-surface.c | 2 +- + src/cairo-glitz-surface.c | 2 +- + src/cairo-gstate.c | 41 +++++++++--------------------------- + src/cairo-meta-surface.c | 2 +- + src/cairo-paginated-surface.c | 2 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-quartz-surface.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-surface-fallback-private.h | 2 +- + src/cairo-surface-fallback.c | 4 ++-- + src/cairo-surface.c | 4 ++-- + src/cairo-svg-surface.c | 2 +- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-xcb-surface.c | 20 +++++++++--------- + src/cairo-xlib-surface.c | 4 ++-- + src/cairoint.h | 12 +++++------ + src/test-meta-surface.c | 2 +- + src/test-paginated-surface.c | 2 +- + 21 files changed, 47 insertions(+), 68 deletions(-) + +commit 919bea6dbb32746f11781cd3a94eb44f5c4a32e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 31 11:24:06 2007 +0100 + + [cairo-gstate] Avoid copying untransformed glyphs. + + Skip the memory duplication of the incoming glyphs if we do not need + to transform them into the backend coordinate system. + + As a consequence we need to constify the glyphs passed to the backend + functions. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-directfb-surface.c | 2 +- + src/cairo-glitz-surface.c | 2 +- + src/cairo-gstate.c | 41 +++++++++++++++++++++++++++--------- + src/cairo-meta-surface.c | 2 +- + src/cairo-paginated-surface.c | 2 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-quartz-surface.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-surface-fallback-private.h | 2 +- + src/cairo-surface-fallback.c | 4 ++-- + src/cairo-surface.c | 4 ++-- + src/cairo-svg-surface.c | 2 +- + src/cairo-win32-font.c | 2 +- + src/cairo-win32-surface.c | 2 +- + src/cairo-xcb-surface.c | 20 +++++++++--------- + src/cairo-xlib-surface.c | 4 ++-- + src/cairoint.h | 12 +++++------ + src/test-meta-surface.c | 2 +- + src/test-paginated-surface.c | 2 +- + 21 files changed, 68 insertions(+), 47 deletions(-) + +commit 62377cbac17779fd51ec108e9704be8d3eed4935 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 30 19:45:44 2007 -0400 + + [cairo-path-fixed] Remove leftover typedef keyword + + Oops! + + src/cairo-path-fixed-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dd406b1ffa411b100950c0156d842e3022e4029d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 30 18:45:26 2007 -0400 + + [cairo-path-fixed] typedef char cairo_path_fixed_op_t + + So it consumes one byte only, instead of the previous enum with + the __attribute__((packed)) that didn't do anything on non-gcc systems. + + src/cairo-path-fixed-private.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit e7324454a06e1f090d4e654c9cdcb774f9fb39ab +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 29 15:26:41 2007 -0700 + + Disable radial-gradient and unbounded-operator tests for pdf + + These are failing due to (already reported) poppler bugs. + + There were also problems with the gradients in the PDF + files previously, but these have recently been fixed. + + boilerplate/cairo-boilerplate-pdf.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit f72078fb7660b3c8a369e7bca19628416176a55e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 29 20:18:09 2007 +0930 + + Fix unbounded operator bug in analysis surface + + src/cairo-analysis-surface.c | 117 ++++++++++++++++++++++++------------------- + 1 file changed, 65 insertions(+), 52 deletions(-) + +commit 3216275fd9a9cd8d51b1c3a8671393912d50d899 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 28 23:40:18 2007 +0930 + + Fix PDF gradients bug + + The PDF surface was adding extra stops at the 0.0 and 1.0 offset when + there was not already stops at these offsets. This has been replaced + with code to move the coordinates of the linear gradient line in to + the position of the first and last offset. + + src/cairo-pdf-surface.c | 63 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 41 insertions(+), 22 deletions(-) + +commit bdc70d1fc2a31aa829571244c54f98210e97a2cf +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Aug 29 12:52:00 2007 -0700 + + [win32] call scaled_font_fini in create before returning NULL + + src/cairo-win32-font.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 114b07881e8b09f97394dd4fe8f2900ee9f4c348 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 29 12:18:16 2007 -0400 + + [configure.in] Make PS backend require zlib too (#12210) + + The PS backend uses zlib these days. Make it depend on zlib being available + like PDF has been doing. + + configure.in | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 7f726e57546dba4cdd96086515a372d18c1ee2a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 29 12:15:36 2007 -0400 + + [configure.in] Document version scheme + + configure.in | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 93aee43690c329f43be9e7b840851267ceb17956 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Aug 28 16:47:24 2007 -0700 + + Fix previous create_similar fallback patch + + We can't use composite, as some backends don't implement it. + Use paint() instead. + + src/cairo-pattern.c | 32 -------------------------- + src/cairo-surface-fallback.c | 28 ++++++++++++---------- + src/cairo-surface.c | 55 +++++++++++++++++++++++--------------------- + 3 files changed, 45 insertions(+), 70 deletions(-) + +commit 6525d4debb6df67126b04609bb04d23d9c9bd7a6 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Aug 28 10:47:52 2007 -0700 + + [win32] call free() and not scaled_font_destroy() if scaled init fails + + If scaled_font_destroy() is called, a deadlock can result; there's no + reason to call destroy since the initialization failed (and, indeed, + it might not be valid to do so anyway). + + src/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ae19b1c9911f95f64657f6ddaa0c924ca7a34b88 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Aug 28 10:40:33 2007 -0700 + + [win32] Add cairo_win32_font_face_create_for_logfontw_hfont + + Patch from: Robert O'Callahan <roc@ocallahans.org> + + Add cairo_win32_font_face_create_for_logfontw_hfont, allow win32 + scaled_fonts to rescale themselves properly to the required CTM and + only use the font_face's hfont if we're sure it's appropriate. + + src/cairo-win32-font.c | 107 +++++++++++++++++++++++++++++++++++++++---------- + src/cairo-win32.h | 3 ++ + 2 files changed, 88 insertions(+), 22 deletions(-) + +commit 69dae7ee4ace8a92226140ce5ccb690e7f62e35c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Aug 27 16:30:52 2007 -0700 + + Implement fallback for clone_similar + + src/cairo-surface-fallback-private.h | 10 +++++++++ + src/cairo-surface-fallback.c | 41 ++++++++++++++++++++++++++++++++++++ + src/cairo-surface.c | 6 +++++- + 3 files changed, 56 insertions(+), 1 deletion(-) + +commit 19fa097f515e72c195d10ddd64920ec71fa903ec +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Aug 27 15:29:24 2007 -0700 + + [win32] Update win32 Makefiles + + Happy building with msys, one location for CFLAGS/etc changes (toplevel), + new pdiff makefile. + + Makefile.win32 | 45 +++++++++++++++++++++++++++++++++++++++------ + boilerplate/Makefile.win32 | 13 +++++++------ + src/Makefile.win32 | 18 ++++++------------ + test/Makefile.win32 | 18 +++++++++++++----- + test/pdiff/Makefile.win32 | 18 ++++++++++++++++++ + 5 files changed, 83 insertions(+), 29 deletions(-) + +commit f4a8633fce5262c09b323eef212fd6efe57d8f10 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Aug 27 14:26:19 2007 -0700 + + [win32] check correct surface for BitBlt support in get_subimage + + src/cairo-win32-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 9aad6efd2b2ee14b0a8960a8e4de91b330ad0c4c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Aug 27 14:17:50 2007 -0700 + + Fix image_extra arg in call to _cairo_release_source_image + + src/cairo-surface-fallback.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ccae2de6d859fcac93cedbd3ecd1121e0d0a72b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 28 13:45:02 2007 -0400 + + [perf] Make cairo-perf-diff build cairo-perf-diff-files + + perf/cairo-perf-diff | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 766346aa5cffb699206cc17114221ba7a0323565 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 28 20:35:49 2007 +0930 + + PDF: Remove unused code + + src/cairo-pdf-surface-private.h | 1 - + src/cairo-pdf-surface.c | 18 ------------------ + 2 files changed, 19 deletions(-) + +commit ad43b7fe6bba3ba597b28b6f6668ee98cdc04a88 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 28 20:35:23 2007 +0930 + + PDF: Clean up comments + + src/cairo-pdf-surface.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit a60beb2eef46b03bcb81f5204dcde49cbc090928 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 28 20:34:55 2007 +0930 + + Fix PDF regression with multipage documents + + src/cairo-pdf-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 1a6b62e5995aac27527c37fd5cb6ec5e36a3f890 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 27 14:45:51 2007 -0700 + + Disable 7 cairo-pdf tests due to poppler knockout-group bug + + The following 7 tests currently fail with poppler due to: + + Poppler does not correctly handle knockout groups + https://bugs.freedesktop.org/show_bug.cgi?id=12185 + + and we've verified with acroread that the cairo-pdf output + does render as intended there. The disabled tests are + clip-operator, operator-clear, operator-source, over-above-source, + over-around-source, over-below-source, and over-between-source. + + boilerplate/cairo-boilerplate-pdf.c | 25 ++++++++++++++++++------- + 1 file changed, 18 insertions(+), 7 deletions(-) + +commit 1cdd11873b18ec55521ffd744ad12c619cf9b227 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 25 06:44:08 2007 +0930 + + Add finer-grained fallback support to the PDF surface + + The stream handling has been changed to support writing the content to + one or more group objects. Each page has a top level knockout + group. The first operation in the knockout group paints another group + containing the content. Fallback images are painted from the knockout + group. This ensures that fallback images do not composite with any + content under the image. + + src/cairo-paginated-surface.c | 6 +- + src/cairo-pdf-surface-private.h | 55 +- + src/cairo-pdf-surface.c | 1402 ++++++++++++++++++++++++++------------- + 3 files changed, 980 insertions(+), 483 deletions(-) + +commit 1e8446609b01a3a60c3cc5b69d95d26cc9df460b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 27 14:02:55 2007 -0700 + + Add explanation of pdf_ignored_tests with links to upstream poppler bug reports + + boilerplate/cairo-boilerplate-pdf.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit 463493af73a644c7031df0e396c722cf2cb227b1 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 27 10:39:14 2007 -0700 + + Remove svg2pdf and pdf2svg programs from test directory + + These are useful programs, but they don't belong in test/. + They are never used in the test suite at all. Instead, these + should exist in some demo package, or as applications in their + own right. + + (The motivation for the removal is that someone just encountered + a build error with one of these. And I'm not interested in debugging + build errors for unused components.) + + test/.gitignore | 1 - + test/Makefile.am | 12 ------- + test/pdf2svg.c | 101 ------------------------------------------------------- + test/svg2pdf.c | 85 ---------------------------------------------- + 4 files changed, 199 deletions(-) + +commit 495c9d19bf27150783b563ed8a7a9b2e6e8c2115 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Aug 25 23:39:28 2007 -0700 + + One more PS-specific reference image (for over-between-source) + + A pixman bug had kept this from being correct earlier. It + works now as long as pixman includes the following fix: + + 8ff7213f39edc1b2b8b60d6b0cc5d5f14ca1928d + rasterize traps that extend outside of the image bounds correctly + + test/over-between-source-ps-argb32-ref.png | Bin 0 -> 678 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a3c3fe2296a7e8f1fdffc9f922fb647237504818 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Aug 25 19:23:13 2007 -0700 + + Modify ps-specific reference images for ft-text-vertical tests + + I've been seeing failures with the PS backend for these tests + for a while. This is in spite of the face that we've had a PS- + specific reference image for each of these tests. I'm not sure + what the difference is between my current system and the + system used to generate the original ps-specific reference + images. + + One thing we definitely need to do is to bundle fonts with the + test suite to avoid problems like this. Another is to start + documenting the systems used to generate reference images. + I get very confused with ghostscript versioning, but I can + at least say that "gs --version" reports 8.15.3 here, (though + the package appears to have an 8.56 version). + + test/ft-text-vertical-layout-type1-ps-argb32-ref.png | Bin 1877 -> 1879 bytes + test/ft-text-vertical-layout-type3-ps-argb32-ref.png | Bin 1879 -> 1882 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 71cc245d5a99eb6593e104b5e6727a7db13a4503 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Aug 25 19:18:44 2007 -0700 + + Add PS-specific reference images for 4 tests + + The following 4 tests recently started drawing with native operations + in the place of image fallbacks, so we need ps-specific reference images + to account for minor rasterization differences: over-above-source, + over-around-source, over-below-source, and trap-clip. + + test/over-above-source-ps-argb32-ref.png | Bin 0 -> 636 bytes + test/over-around-source-ps-argb32-ref.png | Bin 0 -> 637 bytes + test/over-below-source-ps-argb32-ref.png | Bin 0 -> 503 bytes + test/trap-clip-ps-argb32-ref.png | Bin 0 -> 5810 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit ae185f803a95248bcb6a8232cabedbc992b66502 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Aug 25 18:57:46 2007 -0700 + + Add four new test to exercise interactions of native and fallback objects + + The new tests are: over-above-source, over-around-source, over-below-source, + and over-between-source + + test/.gitignore | 4 ++ + test/Makefile.am | 4 ++ + test/over-above-source-ref.png | Bin 0 -> 538 bytes + test/over-above-source-rgb24-ref.png | Bin 0 -> 461 bytes + test/over-above-source.c | 80 +++++++++++++++++++++++++++++ + test/over-around-source-ref.png | Bin 0 -> 614 bytes + test/over-around-source-rgb24-ref.png | Bin 0 -> 503 bytes + test/over-around-source.c | 91 +++++++++++++++++++++++++++++++++ + test/over-below-source-ref.png | Bin 0 -> 434 bytes + test/over-below-source-rgb24-ref.png | Bin 0 -> 392 bytes + test/over-below-source.c | 80 +++++++++++++++++++++++++++++ + test/over-between-source-ref.png | Bin 0 -> 575 bytes + test/over-between-source-rgb24-ref.png | Bin 0 -> 473 bytes + test/over-between-source.c | 91 +++++++++++++++++++++++++++++++++ + 14 files changed, 350 insertions(+) + +commit 5929a1defbc9816a6faa6dca94ae6dc3a2dbf3df +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Aug 25 21:28:33 2007 +0200 + + [SVG] Suppress code duplication by using _cairo_svg_surface_emit_stroke_style + from _cairo_svg_surface_stroke. + + src/cairo-svg-surface.c | 65 +++---------------------------------------------- + 1 file changed, 3 insertions(+), 62 deletions(-) + +commit 726ed304018915815d232822cd9efb83ee1339bc +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Jul 29 16:46:21 2007 +0200 + + [SVG] Don't emit transform property when matrix is identity. + + src/cairo-svg-surface.c | 44 +++++++++++++++++++++++++------------------- + 1 file changed, 25 insertions(+), 19 deletions(-) + +commit 89881187f22b40b4afd15eed0b2c19edcba2ca09 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sun Jul 29 13:33:50 2007 +0200 + + [SVG] Implement fill_stroke method. + + src/cairo-svg-surface.c | 132 +++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 124 insertions(+), 8 deletions(-) + +commit ac51fff0db73c5917a38af3f610d4751b8fec626 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Aug 25 20:49:50 2007 +0200 + + Add a new fill_stroke surface backend method. + + This method is for use in vector backends, where fill immediatly followed by + stroke command with the same path can be emited in the same backend command. + This commit also factorize the detection of such cases in the meta surface + backend and automatically call the fill_stroke method on replay. + + src/cairo-meta-surface.c | 54 ++++++++++++++++++++++++++++++++++++++------ + src/cairo-path-fixed.c | 27 ++++++++++++++++++++++ + src/cairo-surface.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 36 +++++++++++++++++++++++++++++ + 4 files changed, 169 insertions(+), 7 deletions(-) + +commit 43d35e01106659ac689846a8d5875d235b0d3c9f +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Sat Jul 28 17:37:24 2007 +0200 + + [SVG] fix modeline for vim. + + src/cairo-svg-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3ceaa6e74e4bd3f5935016c3639411b26d7f576f +Merge: e3b5a65 24075f1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 24 08:03:44 2007 -0700 + + Merge branch 'cairo-origin' into cairo + +commit e3b5a650213b98c3514a850cdb86f1178fe06833 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 24 08:03:03 2007 -0700 + + Remove build-breaking debugging helper. + + Sorry! Totally my fault on this one. + + src/cairoint.h | 2 -- + 1 file changed, 2 deletions(-) + +commit 24075f1bddbda1d90dfd6f041b8d6bdaf9c786dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 24 14:16:43 2007 +0100 + + [cairo-perf] Blacklist xlib-fallback. + + Do not try and create non-Render xlib surfaces as they explicitly do + not support performance testing. + + perf/cairo-perf.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 8894894d9d34d169efa39d6d86ebefcb2ba69fe1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 24 13:40:26 2007 +0100 + + [cairo-boilerplate-xlib] Check that the surface will fit in the screen. + + Whilst testing the fallback surface, the resultant image was being + clipped to the screen size. Be conservative and refuse to create + windows (for CAIRO_CONTENT_COLOR surfaces) that are larger than the + screen. + + boilerplate/cairo-boilerplate-xlib.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +commit a29544a0b6f150384fd652aad950d1cae9809c42 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 24 12:24:20 2007 +0100 + + [cairo-boilerplate-xlib] Clear Render data for the non-Render fallback. + + As well as marking the XRender extension unavailable in + _cairo_boiler_player_xlib_disable_render(), we need to clear any + XRender derived information stored during the surface creation. + + boilerplate/cairo-boilerplate-xlib.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 177a3b8a32f13ce92d45899367fb7758600f7b93 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Aug 23 16:13:04 2007 -0700 + + Remove include of cairoint.h from *-private.h header files. + + These were recently added, (as part of sparse integration?), but they + break boilerplate which reaches into at least cairo-types-private.h + and cairo-scaled-font-private.h. But boilerplate cannot see cairoint.h + or else it gets the internal sybol renaming, (with the INT_ prefix), + and then all the test suite tests refuse to link. + + If this change reverts some recently-added functionality, (or + cleanliness), then we'll just need to find some other way to add that + back again without the breakage. + + src/cairo-cache-private.h | 1 - + src/cairo-clip-private.h | 1 - + src/cairo-fixed-private.h | 1 - + src/cairo-ft-private.h | 1 - + src/cairo-gstate-private.h | 1 - + src/cairo-hash-private.h | 1 - + src/cairo-malloc-private.h | 1 - + src/cairo-mutex-private.h | 4 +++- + src/cairo-mutex-type-private.h | 4 +++- + src/cairo-os2-private.h | 3 +-- + src/cairo-output-stream-private.h | 1 - + src/cairo-paginated-surface-private.h | 2 +- + src/cairo-path-fixed-private.h | 2 -- + src/cairo-pdf-surface-private.h | 2 -- + src/cairo-private.h | 1 - + src/cairo-ps-surface-private.h | 2 -- + src/cairo-region-private.h | 2 -- + src/cairo-scaled-font-private.h | 2 +- + src/cairo-surface-private.h | 2 +- + src/cairo-svg-surface-private.h | 2 -- + src/cairo-type1-private.h | 2 -- + src/cairo-wideint-private.h | 2 -- + src/cairo-xlib-surface-private.h | 2 -- + src/cairoint.h | 2 ++ + 24 files changed, 12 insertions(+), 32 deletions(-) + +commit fa41ebfb7c074a6ffa6a8fe7c43207e594c6534c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 23 13:55:19 2007 -0400 + + Fix header inclusion order + + Enough for now, until I figure out the right way to break cairoint.h. + + src/cairo-types-private.h | 105 +++++++++++++++++++++++++++------------------- + src/cairoint.h | 23 +--------- + 2 files changed, 64 insertions(+), 64 deletions(-) + +commit d66f1ee82a10de325ee4e7579bbbaa1d301292e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 23 13:54:37 2007 -0400 + + [boilerplate] Build libcairoboilerplate.la in make check and make test + + boilerplate/Makefile.am | 2 ++ + boilerplate/cairo-boilerplate.c | 15 --------------- + 2 files changed, 2 insertions(+), 15 deletions(-) + +commit 5594f8b0356fc209749d01e2043559fccd3966d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 23 00:38:00 2007 -0400 + + [Makefile.am] Run sparse and splint once per source file + + Also skip .h files for splint as it causes lots of unused-function warnings. + + src/Makefile.am | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit 503ab85e44bfa02ef8391f7849826cbe07ff15d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 23 15:01:02 2007 +0100 + + Fix inadvertent executable mode flip. + + Clear the executable bit for cairo-scaled-font.c + + src/cairo-scaled-font.c | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 735757a17a7c72f8598c8958b600daad941a0431 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 22 02:58:37 2007 -0400 + + [Makefile.am] Add target sparse to run sparse static source code analyzer + + There are still some bits not quite working. + + src/Makefile.am | 23 ++++++++++++++++++----- + src/cairo-cache-private.h | 1 + + src/cairo-clip-private.h | 1 + + src/cairo-fixed-private.h | 1 + + src/cairo-ft-private.h | 1 + + src/cairo-gstate-private.h | 1 + + src/cairo-hash-private.h | 1 + + src/cairo-malloc-private.h | 1 + + src/cairo-mutex-private.h | 4 +--- + src/cairo-mutex-type-private.h | 4 +--- + src/cairo-os2-private.h | 3 ++- + src/cairo-output-stream-private.h | 1 + + src/cairo-paginated-surface-private.h | 2 +- + src/cairo-path-fixed-private.h | 2 ++ + src/cairo-pdf-surface-private.h | 2 ++ + src/cairo-private.h | 1 + + src/cairo-ps-surface-private.h | 2 ++ + src/cairo-quartz-private.h | 2 +- + src/cairo-region-private.h | 2 ++ + src/cairo-scaled-font-private.h | 2 +- + src/cairo-surface-private.h | 2 +- + src/cairo-svg-surface-private.h | 2 ++ + src/cairo-type1-private.h | 2 ++ + src/cairo-types-private.h | 2 ++ + src/cairo-wideint-private.h | 2 ++ + src/cairo-xlib-surface-private.h | 2 ++ + src/cairoint.h | 12 ++++++------ + 27 files changed, 59 insertions(+), 22 deletions(-) + +commit bfdc3b6642a36a7728f82ae87de83244d86ba29e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 22 01:16:50 2007 -0400 + + [Makefile.am] Move -DHAVE_CONFIG_H to the right place + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit af6a123e95b359234d70f7a766457ff3a427c3cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 22 01:09:21 2007 -0400 + + [Makefile.am] Inhibit unrecognized options to splint + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9d709b5caf4bc3c48259d6b40e6b95f730aa348 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 22 01:07:59 2007 -0400 + + [cairo-image-surface] Fix comment syntax + Found by splint. + + src/cairo-image-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ef878345c87c57a79eda079fa5e765aba5ddf163 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 22 01:07:38 2007 -0400 + + [Makefile.am] Add target splint to run splint static source code analyzer + + src/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit f015091bb5361552eebfafc007bcf9e77ba5bfbf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 22 01:03:50 2007 -0400 + + [Makefile.am] Use libcairo_la_CFLAGS instead of INCLUDES + for clarity. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3e5859c58f8749eaae16149577d52399a2fcf952 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 21 23:02:03 2007 -0400 + + [ROADMAP] Mark fine-grained fallbacks done + + ROADMAP | 7 +++++++ + TODO | 7 ------- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 333b96f0e0a7d775b96014b91c6887cdcda3e93a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 17 10:41:03 2007 -0700 + + Add support for image fallbacks for X servers with 555 visuals + + This fixes bugzilla #9993: + + Cairo fails with 555 X server visual + https://bugs.freedesktop.org/show_bug.cgi?id=9993 + + ROADMAP | 2 +- + src/cairo-image-surface.c | 14 ++++++++++++++ + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit f00fb10f87d1341b91f025bb068d935355c68c70 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 17 10:36:14 2007 -0700 + + Add support for image fallbacks for X servers with 565 visuals + + This fixes bugzilla #10461: + + Cairo doesn't support 565 xlib visual + https://bugs.freedesktop.org/show_bug.cgi?id=1046 + + ROADMAP | 2 +- + src/cairo-image-surface.c | 16 ++++++++++++++++ + 2 files changed, 17 insertions(+), 1 deletion(-) + +commit ddb78df4c92fc8e51ca18202b59bcef7d1e1d66d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 17 10:33:25 2007 -0700 + + Restore the error message for unsupported X server visuals + + Apparently, our much-beloved error message, (just look at how many people + love to quote it in bugzilla entries), was removed during the switch to + the new pixman. It was replaced with an obscure failure of a nil surface + being returned, (leading to obscure failures or false "out of memory" + errors). + + So we're putting this back now, (even though we _really_ want to ensure + that this message never gets printed in practice). + + src/cairo-image-surface.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 72fab3675c46a773dac315fffff72cd7f887f79f +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 17 10:29:37 2007 -0700 + + Use a pixman_format_code to describe the image surface used for xlib fallbacks + + Previously, the code was just using cairo_format_t which is much more limited + than the formats supported by pixman, (so many "odd" X server visuals would + just fall over). + + src/cairo-image-surface.c | 87 ++++++++++++++++++++++------------ + src/cairo-xlib-surface.c | 117 +++++----------------------------------------- + src/cairoint.h | 19 +++++++- + 3 files changed, 87 insertions(+), 136 deletions(-) + +commit a9662d0aaed8685292ffe13c458182046a644fa7 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Aug 17 08:15:50 2007 -0700 + + Eliminate fragile cairo_internal_format_t + + Instead we take advantage of the pixman_format_code_t + that now exists in the public interface of the new, external + pixman library. + + src/cairo-image-surface.c | 152 +++++++++++++++++++++++++++++++++------------- + src/cairo-pattern.c | 2 +- + src/cairoint.h | 44 +------------- + 3 files changed, 113 insertions(+), 85 deletions(-) + +commit 9f4e6436496fe561aa124bb2b89e1c6711684d98 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 21 10:03:00 2007 -0700 + + Ensure the Render extension is initialized before calling XESetCloseDisplay + + This avoids a potential crash from the Render extension being cleaned + up during XCloseDisplay before the cairo CloseDisplay hook goes on to + call into XRenderFreePicture. + + src/cairo-xlib-display.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit d05593a5fb9fef586171cb9973a9942a105d50d7 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 20 14:50:02 2007 -0700 + + Add a new xlib-fallback target to test xlib using image fallbacks instead of the Render extension + + boilerplate/cairo-boilerplate-xlib-private.h | 8 ++++ + boilerplate/cairo-boilerplate-xlib.c | 72 ++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 9 ++++ + test/fill-rule.c | 2 +- + 4 files changed, 90 insertions(+), 1 deletion(-) + +commit 590717f03b4a396600734c4dac1dd0a9f140283c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 22 07:58:14 2007 +0930 + + PS: Remove debug info from PS output + + The debug code is now conditionally compiled. + + src/cairo-ps-surface.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +commit e66b2b68ab456d779524d9b4ab34acf5d38362b5 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Aug 21 14:52:54 2007 -0700 + + Use 8-bit math to flatten color when emitting a solid pattern to PostScript + + This isn't necessarily more correct than the old code using the doubles, + but it does result in bit-for-bit color equivalence when comparing the + results against the image backend. So that's both good consistency, and + more ease is using the test suite to verify things. + + src/cairo-ps-surface.c | 26 +++++++++++++++----------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +commit bf92255edd20595a6eb220c6ee9d6aa40b244eef +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 21 22:27:57 2007 +0930 + + PS: Add finer-grained image fallback support + + The analysis surface now keeps track of two regions: supported + operations, and unsupported operations. If the target surface returns + CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY, the analysis surface will check + if any previous operation intersects with this operation. If there is + nothing previously drawn under the operation, the status is changed to + supported. + + The meta surface has two new functions: + _cairo_meta_surface_replay_region() + _cairo_meta_surface_replay_and_create_regions() + + During the analysis stage, the paginated surface replays the meta + surface using _cairo_meta_surface_replay_and_create_regions(). The + return status from each analyzed operation is saved in the meta + surface. The _cairo_meta_surface_replay_region() function allows only + operations from either the supported or unsupported region to be + replayed. This allows the paginated surface to replay only the + supported operations before emitting a fallback image for each + rectangle in the unsupported region. + + src/cairo-analysis-surface-private.h | 3 + + src/cairo-analysis-surface.c | 358 ++++++++++++++++++++++++++++++----- + src/cairo-meta-surface-private.h | 34 +++- + src/cairo-meta-surface.c | 78 ++++++-- + src/cairo-paginated-surface.c | 131 ++++++++++--- + src/cairo-ps-surface.c | 93 +++++---- + src/cairo-region-private.h | 4 + + src/cairo-region.c | 13 ++ + src/cairoint.h | 4 +- + 9 files changed, 585 insertions(+), 133 deletions(-) + +commit bf4bdbb6076dbe3b74534bc4308dbc9213bf628d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 20 20:29:51 2007 -0400 + + [cairo-scaled-font] Document how glyph surfaces use device offsets + + src/cairo-scaled-font.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 106 insertions(+) + +commit 31f5aafa36015ee6ea8ff769c2e1d5841f62642f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 5 20:46:48 2007 -0500 + + Fix device_offset misuse in all glyph surface uses + + Seems like all over the code, we have been using negated device_offset + values for glyph surfaces. Here is all the math(!): + + A device_transform converts from device space (a conceptual space) to + surface space. For simple cases of translation only, it's called a + device_offset and is public API (cairo_surface_[gs]et_device_offset). + A possibly better name for those functions could have been + cairo_surface_[gs]et_origing. So, that's what they do: they set where + the device-space origin (0,0) is in the surface. If the origin is inside + the surface, device_offset values are positive. It may look like this: + + Device space: + (-x,-y) <-- negative numbers + +----------------+ + | . | + | . | + |......(0,0) <---|-- device-space origin + | | + | | + +----------------+ + (width-x,height-y) + + Surface space: + (0,0) <-- surface-space origin + +---------------+ + | . | + | . | + |......(x,y) <--|-- device_offset + | | + | | + +---------------+ + (width,height) + + In other words: device_offset is the coordinates of the device-space + origin relative to the top-left of the surface. + + We use device offsets in a couple of places: + + - Public API: To let toolkits like Gtk+ give user a surface that + only represents part of the final destination (say, the expose + area), but has the same device space as the destination. In these + cases device_offset is typically negative. Example: + + application window + +---------------+ + | . | + | (x,y). | + |......+---+ | + | | | <--|-- expose area + | +---+ | + +---------------+ + + In this case, the user of cairo API can set the device_space on + the expose area to (-x,-y) to move the device space origin to that + of the application window, such that drawing in the expose area + surface and painting it in the application window has the same + effect as drawing in the application window directly. Gtk+ has + been using this feature. + + - Glyph surfaces: In most font rendering systems, glyph surfaces + have an origin at (0,0) and a bounding box that is typically + represented as (x_bearing,y_bearing,width,height). Depending on + which way y progresses in the system, y_bearing may typically be + negative (for systems similar to cairo, with origin at top left), + or be positive (in systems like PDF with origin at bottom left). + No matter which is the case, it is important to note that + (x_bearing,y_bearing) is the coordinates of top-left of the glyph + relative to the glyph origin. That is, for example: + + Scaled-glyph space: + + (x_bearing,y_bearing) <-- negative numbers + +----------------+ + | . | + | . | + |......(0,0) <---|-- glyph origin + | | + | | + +----------------+ + (width+x_bearing,height+y_bearing) + + Note the similarity of the origin to the device space. That is + exactly how we use the device_offset to represent scaled glyphs: + to use the device-space origin as the glyph origin. + + Now compare the scaled-glyph space to device-space and surface-space + and convince yourself that: + + (x_bearing,y_bearing) = (-x,-y) = - device_offset + + That's right. If you are not convinced yet, contrast the definition + of the two: + + "(x_bearing,y_bearing) is the coordinates of top-left of the + glyph relative to the glyph origin." + + "In other words: device_offset is the coordinates of the + device-space origin relative to the top-left of the surface." + + and note that glyph origin = device-space origin. + + So, that was the bug. Fixing it removed lots of wonders and magic + negation signs. + + The way I discovered the bug was that in the user-font API, to make + rendering the glyph from meta-surface to an image-surface work I had + to do: + + cairo_surface_set_device_offset (surface, -x_bearing, -y_bearing); + _cairo_meta_surface_replay (meta_surface, surface); + cairo_surface_set_device_offset (surface, x_bearing, y_bearing); + + This suggested that the use of device_offset for glyph origin is + different from its use for rendering with meta-surface. This reminded + me of the large comment in the xlib backend blaming XRender for having + weird glyph space, and of a similar problem I had in the PS backend + for bitmap glyph positioning (see d47388ad759b0a1a0869655a87d9b5eb6ae2445d) + + ...those are all fixed now. + + src/cairo-atsui-font.c | 4 ++-- + src/cairo-directfb-surface.c | 4 ++-- + src/cairo-ft-font.c | 46 +++++++++++++++++++++++--------------------- + src/cairo-glitz-surface.c | 8 ++++---- + src/cairo-ps-surface.c | 12 ++++++------ + src/cairo-scaled-font.c | 8 +++----- + src/cairo-svg-surface.c | 2 +- + src/cairo-xcb-surface.c | 40 ++------------------------------------ + src/cairo-xlib-surface.c | 40 ++------------------------------------ + 9 files changed, 46 insertions(+), 118 deletions(-) + +commit d55da1aa621d76b1411300932be5d37883b25dfa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 00:20:29 2007 -0800 + + [scaled-font] Really ignore ctm translation + + Previously we were ignoring ctm translation in scaled fonts when hashing, but + still storing it into the scaled font. Now we zero the translation components + when storing. + + src/cairo-scaled-font.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit a394e5870e2c5ccedfd9d116b4a42c58b459334d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 5 16:53:18 2007 -0500 + + [cairo-image-surface] Simplify device-offset usage + + src/cairo-image-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 61f736d0d1166b050ee948ce2738feab0327ece9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 5 15:51:30 2007 -0500 + + [cairo-paginated-surface] Add XXX mark to integer width,height arguments + + src/cairo-paginated-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit f97bb5613a7fb3d92f2d730460f9c721ee13a41a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Aug 20 17:32:05 2007 -0700 + + Fix path_fixed_offset_and_scale to apply scale and offset in right order + + src/cairo-path-fixed.c | 24 +++++++++--------------- + 1 file changed, 9 insertions(+), 15 deletions(-) + +commit 51b6cca8de3181d7b42b612ff491451c765d5811 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Aug 18 00:54:30 2007 +0100 + + [cairo-perf-diff] Remove reference to pixman. + + Remove the use of pixman as part of the perf id as pixman is no longer + an integral component of cairo. + + perf/cairo-perf-diff | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 39367b26120b6e1ad0f556911a49f28ef370115b +Author: Martin Ejdestig <marejde@gmail.com> +Date: Fri Aug 17 02:28:35 2007 +0200 + + Plug possible leak of pixman_traps in _cairo_image_surface_composite_trapezoids. + + If width and height are 0 and pixman_traps is allocated on the heap, + it would leak. Fix by simply checking width and height prior to + allocating pixman_traps. + + src/cairo-image-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 507d7ee09951a35df8b80f0e1507ba17dbd9bfa9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 27 12:34:35 2007 +0100 + + [cairo-xlib-surface] Avoid a malloc(0). + + Avoid a zero byte allocation (potentially returning NULL) for an array + of 0 trapezoids. + + src/cairo-xlib-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 85d911d86c9f1dd55d79b7c429ad2b617ec345d1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 27 08:05:35 2007 +0100 + + [cairo-image-surface] Avoid malloc(0) + + Special case width==0, height==0 to avoid allocating a 0 byte image. + + src/cairo-image-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 7332a5e9949ca19869b003fe5a0a777adac41307 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 27 11:32:50 2007 +0100 + + [boilerplate/xmalloc] Special case malloc(0) and friends. + + malloc(0) can return NULL so double check the requested size before + exiting with an out-of-memory error. + + boilerplate/xmalloc.c | 6 +++--- + src/cairo-image-surface.c | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 56e505298c0f5de360380ca7e968baa0e60ac828 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 27 23:01:44 2007 +0100 + + [cairo-truetype-subset] Avoid malloc(0). + + Avoid attempting to allocate a zero length subset as malloc(0) may return + NULL. + + src/cairo-truetype-subset.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 7bd1d5ba3d081ae188fe7f8bc346071d0b8d2278 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jul 3 14:14:56 2007 +0100 + + [cairo-png] Protect against malloc(0). + + Avoid calling malloc(0) for an empty image. + + src/cairo-png.c | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit 06134df0d0670a7d00d58ebd7a20ba7174f56d16 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jul 4 19:11:29 2007 +0100 + + [cairo-pdf-surface] Check for errors during compression. + + Check status return from zlib's compress(). + + src/cairo-pdf-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 76b871d710cd81bee5fe7c2f6175f8d678ebeea5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 16 15:29:11 2007 +0100 + + [cairo-image-surface] Remove status return for hard-coded CAIRO_STATUS_SUCCESS. + + Remove the status return if the function can only return + CAIRO_STATUS_SUCCESS, and remove the then surplus conditionals. + + src/cairo-image-surface.c | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit 4e39e30d83fc1866a44f0b746c406ee2efb3bf6a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 16 09:25:38 2007 +0100 + + [cairo-pen] Remove status from _cairo_pen_find_active_vertex_*() + + This pair of functions unconditionally return SUCCESS, so remove the + status return and supporting tests from their callers. + + src/cairo-path-stroke.c | 24 ++++++------------------ + src/cairo-pen.c | 16 +++++----------- + src/cairoint.h | 4 ++-- + 3 files changed, 13 insertions(+), 31 deletions(-) + +commit b72b06cc222d88015ce78a5cddf061e903d032b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 16 09:40:47 2007 +0100 + + [cairo-pen] Remove hard-coded CAIRO_STATUS_SUCCESS from _stroke_spline_half() + + Remove the status return and update callers as + _cairo_pen_stroke_spline_half() unconditionally returned SUCCESS. + + src/cairo-pen.c | 15 ++++----------- + 1 file changed, 4 insertions(+), 11 deletions(-) + +commit e24969a94ac5670a13c2737db435ac7b5bebb19c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 16 09:36:54 2007 +0100 + + [cairo-pdf-surface] cairo_pattern_set_matrix guarantees invertibility. + + Be consistent in asserting that the pattern matrix is inverted + successfully and remove a couple of redundant checks. + + src/cairo-pdf-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 50ebdda3a97334e5411749cd0c309843ba8cdf44 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 19 10:26:37 2007 +0100 + + [cairo-pattern] Assert that the pattern->matrix is invertible. + + We guarantee when setting the pattern->matrix that it is invertible, so + merely assert that it is so when we attempt to use its inverse. + + src/cairo-pattern.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7d853bcabcc1c55b79a05280a0eb35828b93163d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 16 14:34:07 2007 +0100 + + [cairo-boilerplate-xlib] Check for NULL xrender_format before use. + + Testing for XRender support (xrender_format != NULL) after + dereferencing said format doesn't work as intended. + + boilerplate/cairo-boilerplate-xlib.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit bc635da45a32eb9b7aff6fa5f7f560ebf99092a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 16 12:21:49 2007 +0100 + + [cairo-ft-font] Decrement lock count on error. + + As noted in http://bugs.freedesktop.org/show_bug.cgi?id=12026 the error + path of _cairo_ft_unscaled_font_lock_face() failed to reset the + unscaled->lock_count before releasing the mutex and returning NULL. + + src/cairo-ft-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8881265cca73790a49068b3bab5362cb73f8deb6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Aug 10 20:10:29 2007 +0930 + + PDF: Fix regression in pdf_surface_set_size() + + src/cairo-pdf-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 4ca0ca153a847337452bbb237d42f6d7b0a163d0 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Mon Aug 6 19:24:31 2007 -0400 + + Bump pixman dependency to 0.9.4 + + Also print the download location if the library wasn't found. + + configure.in | 11 +++++++---- + src/cairo-region-private.h | 2 +- + src/cairoint.h | 2 +- + test/buffer-diff.c | 2 +- + 4 files changed, 10 insertions(+), 7 deletions(-) + +commit 13cae8b5e6d3fc93c4eb1853b91ba356b572b551 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Aug 6 11:06:47 2007 -0700 + + Ensure that a copied pattern gets its own user_data array + + This fixes the bug reported here: + + Segfault with cairo_pattern_set_user_data + https://bugs.freedesktop.org/show_bug.cgi?id=11855 + + src/cairo-pattern.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 027915717df6e203826d10da7bfdf8e26af13ee1 +Author: Nis Martensen <nis.martensen@web.de> +Date: Wed Jul 4 07:09:00 2007 -0700 + + Typo fixes in README files + + README | 4 ++-- + perf/README | 6 +++--- + test/README | 6 +++--- + 3 files changed, 8 insertions(+), 8 deletions(-) + +commit 72c1f5d802c32f97ae5c0cbf899dc3a12fc28222 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 5 00:50:23 2007 +0930 + + PDF: Fix gradients regression + + src/cairo-pdf-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 9bcedd3d6f0de8c380e7ab4981d32377e3c5a778 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Aug 3 14:18:40 2007 -0700 + + [win32] compilation fix for win32 + + src/cairo-win32-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit f52aa4c13e91339e575ca2c52c9e3a1f4d95b106 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Aug 2 21:25:46 2007 +0930 + + CFF Subsetting: fix integer encoding bug + + Bug report at https://bugzilla.mozilla.org/show_bug.cgi?id=368668 + + src/cairo-cff-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ef93f1897c0703c3284c85206cb1c70e23ff3fe5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jul 31 17:52:13 2007 -0400 + + [configure.in] Cleanup after pixman removal and correctly check for pixman + + configure.in | 24 ++++-------------------- + 1 file changed, 4 insertions(+), 20 deletions(-) + +commit 4cce3135e0e50d5edb3a7cc54cf413fc2242a521 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 26 18:04:39 2007 -0400 + + Clear executable flag off .c file + + util/malloc-stats.c | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 5b0e2e3e2b6823580bbc40dd1be415b7461bcbf0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jul 23 13:05:13 2007 +0100 + + [cairo-glitz-surface] Compile fix. + + Minor corrections to reflect updated structures. + + src/cairo-glitz-surface.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +commit c0a7d33ac6c81dd74ee2a9daaa3749a346ef4897 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jul 4 13:54:03 2007 +0200 + + [fixpt] Fixup malloc usage to use _cairo_malloc_* + + Fix some introduced mallocs as a result of the fixed point patches. + + src/cairo-clip.c | 2 +- + src/cairo-glitz-surface.c | 2 +- + src/cairo-image-surface.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + 6 files changed, 8 insertions(+), 8 deletions(-) + +commit b719592428907d2010645303fb65d38dcb8b30c0 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jul 4 12:16:27 2007 +0200 + + [fixpt] Fix up compilation post pixman merge + + src/cairo-pattern.c | 1 - + src/cairo-region-private.h | 2 +- + src/cairo-region.c | 9 +++++---- + src/cairo-svg-surface.c | 6 +++--- + 4 files changed, 9 insertions(+), 9 deletions(-) + +commit 866b485314bfd5d8bbf865d19f6a589d08292e2a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 18:38:54 2007 -0700 + + [fixpt] Let the compiler calculate the magic double-to-fixed value + + src/cairo-fixed-private.h | 14 ++------------ + 1 file changed, 2 insertions(+), 12 deletions(-) + +commit 0abe5324a5b03149630a5b6496c980f83be4fd75 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 18:33:29 2007 -0700 + + [fixpt] Create cairo_region wrapper around pixman_region16_t + + Insulate region-using code from implementation details; + at some point we'll want to switch to using 32-bit regions. + + src/cairo-analysis-surface-private.h | 4 +- + src/cairo-analysis-surface.c | 4 +- + src/cairo-clip-private.h | 4 +- + src/cairo-clip.c | 182 ++++++++++++++++++----------------- + src/cairo-directfb-surface.c | 25 +++-- + src/cairo-glitz-surface.c | 65 +++++++++++-- + src/cairo-image-surface.c | 4 +- + src/cairo-pattern.c | 16 +-- + src/cairo-region-private.h | 105 ++++++++++++++++++++ + src/cairo-region.c | 173 +++++++++++++++++++++++++++++++-- + src/cairo-surface-fallback.c | 29 +++--- + src/cairo-surface.c | 63 ++++++------ + src/cairo-traps.c | 50 +++++----- + src/cairo-win32-surface.c | 28 ++++-- + src/cairo-xcb-surface.c | 26 ++--- + src/cairo-xlib-surface.c | 28 +++--- + src/cairoint.h | 38 ++++++-- + src/test-paginated-surface.c | 2 +- + 18 files changed, 598 insertions(+), 248 deletions(-) + +commit dc035fecda0070e18a68e06f567f268fc39483f1 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 17:34:36 2007 -0700 + + [fixpt] Fix xcb surface to handle conversion to 16.16 + + src/cairo-xcb-surface.c | 87 +++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 66 insertions(+), 21 deletions(-) + +commit 58d9664702308639ead888c7167e71ca605a8fe3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 17:33:44 2007 -0700 + + [fixpt] Fix xlib surface to handle conversion to 16.16 + + src/cairo-xlib-surface.c | 87 ++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 66 insertions(+), 21 deletions(-) + +commit aaf94ef6c4656d7e836e52c2a71db214a1c01b57 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 17:29:04 2007 -0700 + + [fixpt] remove dependency on some pixman types + + Introduce cairo_gradient_stop_t, and remove pixman dependency + for core pattern types. Perform conversion from cairo types + to pixman types as necessary in fallback code. + + src/cairo-matrix.c | 12 +++--- + src/cairo-pattern.c | 97 ++++++++++++++++++++++++++++++++------------ + src/cairo-pdf-surface.c | 8 ++-- + src/cairo-scaled-font.c | 6 +-- + src/cairo-surface-fallback.c | 10 ++++- + src/cairo-svg-surface.c | 87 +++++++++++++++++++-------------------- + src/cairoint.h | 27 ++++++------ + 7 files changed, 150 insertions(+), 97 deletions(-) + +commit e5fdacae1c5b7005b95db8f9065cce51ef19bf20 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 17:05:34 2007 -0700 + + [fixpt] fix up image surface to translate to 16.16 for pixman + + src/cairo-image-surface.c | 76 ++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 65 insertions(+), 11 deletions(-) + +commit be3516335cda8587d9baf5bd0097d3ce1cb64ab1 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 16:56:24 2007 -0700 + + [fixpt] Replace cairo_rectangle_int16_t with cairo_rectangle_int_t + + Mostly s/cairo_rectangle_int16_t/cairo_rectangle_int_t/, + as well as definitions to pick cairo_rectangle_int_t. + + src/cairo-analysis-surface.c | 2 +- + src/cairo-clip-private.h | 6 ++--- + src/cairo-clip.c | 12 ++++----- + src/cairo-directfb-surface.c | 16 +++++------ + src/cairo-glitz-surface.c | 20 +++++++------- + src/cairo-gstate.c | 2 +- + src/cairo-image-surface.c | 12 ++++----- + src/cairo-meta-surface.c | 2 +- + src/cairo-os2-surface.c | 10 +++---- + src/cairo-paginated-surface.c | 6 ++--- + src/cairo-pattern.c | 12 ++++----- + src/cairo-pdf-surface.c | 4 +-- + src/cairo-ps-surface.c | 4 +-- + src/cairo-quartz-private.h | 2 +- + src/cairo-quartz-surface.c | 24 ++++++++--------- + src/cairo-rectangle.c | 10 +++---- + src/cairo-region.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-surface-fallback-private.h | 2 +- + src/cairo-surface-fallback.c | 52 ++++++++++++++++++------------------ + src/cairo-surface.c | 40 +++++++++++++-------------- + src/cairo-svg-surface.c | 4 +-- + src/cairo-win32-private.h | 4 +-- + src/cairo-win32-surface.c | 16 +++++------ + src/cairo-xcb-surface.c | 18 ++++++------- + src/cairo-xlib-surface.c | 18 ++++++------- + src/cairo.c | 2 +- + src/cairoint.h | 48 ++++++++++++++++++++------------- + src/test-fallback-surface.c | 12 ++++----- + src/test-meta-surface.c | 4 +-- + src/test-paginated-surface.c | 2 +- + 31 files changed, 191 insertions(+), 179 deletions(-) + +commit 9c38aa3b96a1e926ef422837fc3102e902a796fc +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 16:30:09 2007 -0700 + + [fixpt] Use _cairo_fixed_mul insted of manual multiplication + + src/cairo-fixed-private.h | 1 - + src/cairo-path-fixed.c | 11 +++-------- + src/cairo-traps.c | 26 +++++++++++--------------- + 3 files changed, 14 insertions(+), 24 deletions(-) + +commit 0048a26a4477d3acb5dd0231756cfaae92d240a9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 16:26:14 2007 -0700 + + [fixpt] Make fixed point methods static inline and generic + + Move the fixed point methods to static inline versions in + cairo-fixed-private.h, and don't hardcode fixed to be 16.16. + + src/cairo-fixed-private.h | 256 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-fixed.c | 100 +----------------- + src/cairo-quartz-surface.c | 2 +- + src/cairoint.h | 37 +------ + 4 files changed, 259 insertions(+), 136 deletions(-) + +commit 76c32f899af63649bf911533a2ed6b42e617da41 +Author: Vladimir Vukicevic <vladimir@frankenmac.mshome.net> +Date: Mon Jul 2 15:09:21 2007 +0200 + + [fixpt] Update quartz surface for new types + + src/cairo-quartz-surface.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 290daee4ce26a931a15425f380ed4f495a4bd3c1 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Tue Jul 10 10:31:23 2007 -0400 + + Add note about pixman dependency in README + + README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1fac791537d2333b084e3fbabc1a6a890433e9ed +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Tue Jul 10 15:09:04 2007 +0800 + + [Glitz] fix compilation. + + Separating pixman broke the compilation if glitz backend is enabled, + fix it and all compiler warning as well. + + src/cairo-glitz-surface.c | 104 ++++++++++++++++++++++++++++------------------ + 1 file changed, 64 insertions(+), 40 deletions(-) + +commit 5819be398c4eada9a6cfc8e37a532991751b4a51 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 5 18:59:31 2007 +0100 + + [check-plt] Ignore entries for pixman. + + pixman is now an external library, so we now expect PLT entries. + + src/check-plt.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 35ef8419a981929b65157407485ec001b69b3391 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 5 18:52:21 2007 +0100 + + [cairo-matrix] Check determinant for invalid numbers. + + By checking matrices for invalid determinants, we can prevent the + setting and application of invalid matrices. + + The trick used here is that NaNs, as specified by IEE754, always + return FALSE in comparisons. Since we know that the square of the + determinant must be positive definite, then if the comparison is + FALSE the computation must have resulted in a NaN. + + src/cairo-matrix.c | 4 +++ + test/invalid-matrix.c | 94 ++++++++++++++++++++++++++++++++++++++++++++------- + 2 files changed, 86 insertions(+), 12 deletions(-) + +commit 7eaba5d5fbf83f66b39db42a89db3e7a892c2ea0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jul 5 15:24:11 2007 +0100 + + [configure] Only run PostScript tests if we have ghostscript. + + During configure check for the ghostscript command line tool (gs) before + enabling the PostScript surface tests for make check. + + boilerplate/cairo-boilerplate.c | 2 +- + configure.in | 14 ++++++++++++++ + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit ef967be630dd8d0bf81ad5889d6264bebe7631d4 +Merge: 0c42dbb 5c7d2d1 +Author: Søren Sandmann Pedersen <sandmann@annarchy.freedesktop.org> +Date: Mon Jul 2 08:33:29 2007 -0700 + + Merge branch 'master' of git+ssh://sandmann@git.freedesktop.org/git/cairo + + Conflicts: + + pixman/src/fbcompose.c + pixman/src/icimage.c + pixman/src/pixmanint.h + pixman/src/pixregionint.h + src/cairo-clip.c + +commit 5c7d2d14d78e4dfb1ef6d2c40f0910f177e07360 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Jun 19 13:15:21 2007 -0700 + + [fix] Avoid int overflow when allocating large buffers + + This patch introduces three macros: _cairo_malloc_ab, + _cairo_malloc_abc, _cairo_malloc_ab_plus_c and replaces various calls + to malloc(a*b), malloc(a*b*c), and malloc(a*b+c) with them. The macros + return NULL if int overflow would occur during the allocation. See + CODING_STYLE for more information. + + CODING_STYLE | 25 ++++++++++ + pixman/src/fbcompose.c | 4 +- + pixman/src/icimage.c | 8 ++-- + pixman/src/pixman.h | 7 +++ + pixman/src/pixmanint.h | 17 +++++++ + pixman/src/pixregion.c | 59 ++++++++++++++++++----- + pixman/src/pixregionint.h | 1 - + src/cairo-atsui-font.c | 2 +- + src/cairo-bentley-ottmann.c | 6 +-- + src/cairo-beos-surface.cpp | 4 +- + src/cairo-clip.c | 10 ++-- + src/cairo-directfb-surface.c | 2 +- + src/cairo-ft-font.c | 4 +- + src/cairo-glitz-surface.c | 34 +++++++++++-- + src/cairo-gstate.c | 6 +-- + src/cairo-hull.c | 2 +- + src/cairo-malloc-private.h | 104 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-meta-surface.c | 4 +- + src/cairo-os2-surface.c | 9 ++-- + src/cairo-path.c | 2 +- + src/cairo-pattern.c | 6 +-- + src/cairo-pdf-surface.c | 6 +-- + src/cairo-pen.c | 4 +- + src/cairo-png.c | 6 +-- + src/cairo-polygon.c | 2 +- + src/cairo-ps-surface.c | 4 +- + src/cairo-quartz-surface.c | 8 ++-- + src/cairo-scaled-font-subsets.c | 4 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-stroke-style.c | 2 +- + src/cairo-surface-fallback.c | 4 +- + src/cairo-surface.c | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-traps.c | 2 +- + src/cairo-unicode.c | 4 +- + src/cairo-win32-font.c | 6 +-- + src/cairo-win32-surface.c | 6 +-- + src/cairo-xcb-surface.c | 8 ++-- + src/cairo-xlib-surface.c | 6 +-- + src/cairoint.h | 1 + + 41 files changed, 308 insertions(+), 89 deletions(-) + +commit fc34073464c487405b6e2e0a5fa269a1ae15a02a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 14:38:41 2007 -0700 + + Increment version to 1.5.1 after the 1.4.10 release + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 107a74885a25e585b467c7841c6929a12aa62565 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 14:05:56 2007 -0700 + + Increment cairo version to 1.4.10 (and libtool versioning to 13:5:11) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f595ad2348dbd97b57d22471fdec7664f8ca7bf6 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 14:04:27 2007 -0700 + + Add notes to NEWS for 1.4.10 + + NEWS | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 45 insertions(+) + +commit 2bf3e31da99f34328973a0866346af40748097f6 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 11:11:36 2007 -0700 + + Prefer local dpy variable instead of display->display + + This was a tiny piece of cleanup that had been erroneously included + with some earlier functional changes, (so it went through a cycle + of being applied and reverted). It's back now in its own commit. + + src/cairo-xlib-display.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit eebb0df512da50f883a417bb5e8e368dc81e35a9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 11:08:53 2007 -0700 + + Revert "[cairo-xlib-display] Hide XErrors during processing of the work queue." + + This reverts commit 285b702ef6f73e7eb4ca0da235a287ad1e1f412f. + + The recent commit of 0791f342b93225849d9171aac8b738014b18bdf5 fixes + the same bug that 285b702e was fixing, but without introducing any + performance-killing calls to XSync. So we can drop those now. + + src/cairo-xlib-display.c | 17 +++-------------- + 1 file changed, 3 insertions(+), 14 deletions(-) + +commit b019cb8a7a910879c7af304edbd06fd105c9d89e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 11:07:07 2007 -0700 + + Revert "[cairo-xlib-surface] Check for errors before installing a NOOP error handler." + + This reverts commit 7016614dd90798247524f0c118f462aa2e7ef673. + + We want to avoid any negative performance impacts due to extra calls + to XSync. The fact that X errors can be missed with this appraoch is + undesirable of course---a proper fix will likely involve moving to + XCB which will hopefully allow us to do the error-checking the way + we want without any performance penalty. + + src/cairo-xlib-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 6d021eb4b6e319dd2bb3e5e126de07c6844d5c07 +Merge: 9109946 0791f34 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Jun 27 11:01:00 2007 -0700 + + Merge branch 'ooo-fix' into cairo + +commit 0791f342b93225849d9171aac8b738014b18bdf5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Jun 27 10:53:29 2007 -0700 + + Avoid deferring resource cleanup for application drawables + + This eliminates X errors propagated from cairo due to cleaning up + Render Pictures after the application had already destroyed the + Drawable they reference. (It would be nice if the X server wouldn't + complain that some cleanup work is already done, but there you + have it.) + + This fix has been verified to fix the bug causing OpenOffice.org to + crash as described here: + + XError on right click menus in OOo. + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 + + And unlike other proposed fixes for this bug, this fix does not + introduce any new calls to XSync, (and thereby avoids performance + concerns from those). + + src/cairo-xlib-surface.c | 47 ++++++++++++++++++++++++++--------------------- + 1 file changed, 26 insertions(+), 21 deletions(-) + +commit 0c42dbb1925efb8228fb5246e0715bee0a5ded28 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Fri Jun 15 00:39:27 2007 -0400 + + pixman_image_set_transform() returns FALSE on failure + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e0cff78b34558f0eed29aff5d818d1591c7bf966 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Thu Jun 14 13:42:08 2007 -0400 + + Fix bug where _cairo_image_surface_composite_trapezoids() computed the wrong stride for aliased masks + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ca5760a289f287a7fafe36e69c6bdf47710c17e7 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Thu Jun 14 13:12:01 2007 -0400 + + Fix initialization of radial patterns + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12cc32b674d3f1b705ef1a66bbce1ef8c4488daf +Author: Søren Sandmann <sandmann@redhat.com> +Date: Wed Jun 13 00:15:34 2007 -0400 + + [pixman] Initial port to standalone pixman library. + + Makefile.am | 4 +- + configure.in | 14 +- + pixman/.gitignore | 20 - + pixman/AUTHORS | 19 - + pixman/COPYING | 92 - + pixman/ChangeLog | 1534 ------------- + pixman/ChangeLog.libic | 300 --- + pixman/ChangeLog.libpixregion | 47 - + pixman/ChangeLog.slim | 39 - + pixman/INSTALL | 9 - + pixman/Makefile.am | 7 - + pixman/NEWS | 135 -- + pixman/README | 47 - + pixman/RELEASING | 81 - + pixman/TODO | 10 - + pixman/autogen.sh | 53 - + pixman/configure.in | 92 - + pixman/libpixman.pc.in | 10 - + pixman/src/.gitignore | 13 - + pixman/src/Makefile.am | 46 - + pixman/src/Makefile.win32 | 37 - + pixman/src/check-config.sh | 17 - + pixman/src/check-pixmanint.sh | 17 - + pixman/src/fbcompose.c | 4354 ------------------------------------ + pixman/src/fbedge.c | 303 --- + pixman/src/fbedgeimp.h | 136 -- + pixman/src/fbmmx.c | 2821 ----------------------- + pixman/src/fbmmx.h | 298 --- + pixman/src/fbpict.c | 2181 ------------------ + pixman/src/fbpict.h | 355 --- + pixman/src/fbtrap.c | 236 -- + pixman/src/icblt.c | 951 -------- + pixman/src/icbltone.c | 743 ------ + pixman/src/iccolor.c | 83 - + pixman/src/icformat.c | 220 -- + pixman/src/icimage.c | 744 ------ + pixman/src/icimage.h | 384 ---- + pixman/src/icint.h | 1070 --------- + pixman/src/icpixels.c | 116 - + pixman/src/icrect.c | 404 ---- + pixman/src/icrop.h | 137 -- + pixman/src/icstipple.c | 81 - + pixman/src/ictransform.c | 63 - + pixman/src/ictrap.c | 200 -- + pixman/src/ictri.c | 293 --- + pixman/src/icutil.c | 287 --- + pixman/src/pixman-xserver-compat.h | 125 -- + pixman/src/pixmanint.h | 1076 --------- + pixman/src/pixregionint.h | 75 - + pixman/src/renderedge.c | 196 -- + pixman/src/renderedge.h | 157 -- + pixman/update.pl | 159 -- + src/Makefile.am | 6 +- + src/cairo-clip.c | 36 +- + src/cairo-glitz-surface.c | 126 +- + src/cairo-image-surface.c | 314 ++- + src/cairo-pattern.c | 82 +- + src/cairo-pdf-surface.c | 40 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-surface-fallback.c | 5 +- + src/cairo-surface.c | 9 +- + src/cairo-svg-surface.c | 31 +- + src/cairo-traps.c | 4 +- + src/cairo-xlib-surface.c | 43 +- + src/cairoint.h | 14 +- + test/buffer-diff.c | 16 +- + 66 files changed, 398 insertions(+), 21221 deletions(-) + +commit 9109946a1a7f9341e60da7358da6535c5fac52db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 21 15:40:23 2007 +0100 + + [cairo-directfb] Correct minor typo. + + Correct the reference to _cairo_directfb_surface_is_similar. + + src/cairo-directfb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1e76aa66b23aa7b3fd7b9f7de2b563b4db814517 +Author: Nis Martensen <nis.martensen@web.de> +Date: Tue Jun 19 17:04:48 2007 +0200 + + Update INSTALL about status of backends + + INSTALL | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 02f753c23ad0db7d677ae41f8d69dc566c8aaa0b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Jun 18 18:23:06 2007 -0700 + + Fix cairo-perf-diff to compile cairo-perf explicitly + + perf/cairo-perf-diff | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2477e57de532fb3ebd1f6113cf51619b84b303d9 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 18 13:58:15 2007 -0700 + + [perf] Add pixman_region_init_rects and use in extract_region + + Avoid O(N*N) loop in traps_extract_region by letting us hand pixman + an array of rects all at once. + + perf/Makefile.am | 3 ++- + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/long-dashed-lines.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ + pixman/src/pixman-remap.h | 1 + + pixman/src/pixman.h | 2 ++ + pixman/src/pixregion.c | 29 ++++++++++++++++++++ + src/cairo-traps.c | 58 ++++++++++++++++++++++++++++------------ + 8 files changed, 144 insertions(+), 18 deletions(-) + +commit 285b702ef6f73e7eb4ca0da235a287ad1e1f412f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 15 20:38:01 2007 +0100 + + [cairo-xlib-display] Hide XErrors during processing of the work queue. + + It is possible for the resources that we defer freeing to be already + destroyed and trigger an XError whilst processing the work queue. For + example, the application renders to a Window and then destroys the + Drawable before proceeding with more rendering. This will trigger an + invalid Picture from RenderFreePicture whilst attempting to free the + resources. + + By ignoring the possibility that the application could allocate a fresh + resource with the same ID, we can simply hide the XErrors... + + Fixes: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 + + src/cairo-xlib-display.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit 7016614dd90798247524f0c118f462aa2e7ef673 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Jun 15 20:45:53 2007 +0100 + + [cairo-xlib-surface] Check for errors before installing a NOOP error handler. + + Call XSync before ignoring errors from XGetImage to avoid hiding + unassociated errors. Similarly, call XSync before reinstalling the old + error handler to ensure no errors creep out of the ignored section. + + src/cairo-xlib-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0c5d28a4e5ce5e4dd72c0f416ce5e960e92b808b +Author: Ryan Lortie <desrt@desrt.ca> +Date: Wed Jun 13 18:59:22 2007 -0400 + + [xlib] Create source xrender Picture with IncludeInferiors + + When an xlib surface is used as the source of a draw operation this + will cause the contents of child windows to be included in the source + data. The semantics of drawing to xlib surfaces are unchanged (ie: + draws are still clipped by child windows overlapping the destination + window). + + src/cairo-xlib-surface.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 817d4b0c9a354526389290c6d5a7662713d67cd8 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Jun 9 19:14:05 2007 +0100 + + [atsui] Document ATSUI + + Add cairo_atsui_font_face_create_for_atsu_font_id + and ATSUI to the documentation. Don't enable it yet, + since this is still unsupported. + + doc/public/tmpl/cairo-atsui.sgml | 2 +- + src/cairo-atsui-font.c | 13 +++++++++++++ + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit fd1edaa5d386f15edacfd5596b550593ed45d627 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Wed Jun 13 01:27:36 2007 +0100 + + [quartz] remove unused code + + clean up warnings about unused code: removing + _cairo_quartz_cairo_path_to_quartz_path and the functions + it calls. + + src/cairo-quartz-surface.c | 47 ---------------------------------------------- + 1 file changed, 47 deletions(-) + +commit d7a0816ec3d750939dd935f34b217980ee27af3f +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Wed Jun 13 01:27:36 2007 +0100 + + [quartz] move glyph array declarations + + Move declarations causing a warning. A separate patch from + the other warning cleanups because it moves where the allocation + happens. + + src/cairo-quartz-surface.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit bf39b28b77a83160e5aa037031d82f8c0843f387 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Wed Jun 13 01:04:54 2007 +0100 + + commit 75be87b4093aaa7f477d587d5a68308cade1b29c + + [quartz] move glyph array declarations + + Move declarations causing a warning. A separate patch from + the other warning cleanups because it moves where the allocation + happens. + + src/cairo-quartz-surface.c | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +commit 2034d1dbd5888c393c57f0feeb707b0411fa4480 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Wed Jun 13 01:27:36 2007 +0100 + + [quartz] pass quartz_stroke_t not CGContextRef + + Fix a typo where an incompatible pointer was being passed. + + src/cairo-quartz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 54bbe44b08b37041c8982634837dbc79b19e6c18 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 11 17:51:37 2007 -0400 + + [TODO] Add link to Adrian's finer-grain fallback thread + + TODO | 2 ++ + 1 file changed, 2 insertions(+) + +commit ef3c64fd13d66648f4e00affb304e8b404249f92 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Mon Jun 11 09:27:11 2007 -0700 + + [misc] Blow away last remaining $Id$ directives in sources + + pixman/src/fbtrap.c | 2 -- + src/cairo-analysis-surface-private.h | 3 +-- + test/rel-path.c | 2 -- + 3 files changed, 1 insertion(+), 6 deletions(-) + +commit 853f23e18c28548bce4647d4e54a5cfb317ac3dc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 11 02:42:04 2007 -0400 + + [test] Use check_PROGRAMS instead of custom made SUPPORT_PROGS + + It better handles $(EXEEXT) and is exactly made for this purpose. + + test/Makefile.am | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit 1d86c7fa888918c32eb13adb084de78883e17c84 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jun 9 13:48:13 2007 -0400 + + [perf] Link to librt if available + + This is needed on Solaris, but also works on Linux. + + configure.in | 4 ++++ + perf/Makefile.am | 3 ++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit 85d045f2675cf191ea1d1af66ad4cd9e57d58e67 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 8 16:08:44 2007 -0700 + + Update version to 1.4.9 after the 1.4.8 release. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fea4f344c46cf5f85c6af3102333008768c55063 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 8 15:49:12 2007 -0700 + + Update version to 1.4.8 (and libtool info to 13:4:11) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0b19ff1d3f493067fa5484151e71dfcedcd14fd1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Jun 8 15:34:35 2007 -0700 + + Add include of X11/Xlib.h to cairo-xlib-xrender.h + + This makes this header file self-sufficient. Thanks to + Sam Sirlin <samuel.w.sirlin@jpl.nasa.gov> for pointing + this out. + + src/cairo-xlib-xrender.h | 1 + + 1 file changed, 1 insertion(+) + +commit 8223c976d54319b58906de03fcb8fb1967105e53 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Fri Jun 8 01:56:10 2007 +0100 + + [NEWS] add note about quartz fixes + + We've got 11 less failures in the quartz tests this time around, + worth a mention. + + NEWS | 3 +++ + 1 file changed, 3 insertions(+) + +commit 00063a65f758265f3ad5c0caa374d9c7d5e89932 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Jun 8 01:17:09 2007 +0100 + + [quartz] fix DO_IMAGE + + The implementation of DO_IMAGE leaks memory via a referenced surface, + and wasn't applied for strokes and glyphs. This patch corrects those + issues. + + src/cairo-quartz-private.h | 5 ++- + src/cairo-quartz-surface.c | 83 ++++++++++++++++++++++++++++------------------ + 2 files changed, 55 insertions(+), 33 deletions(-) + +commit 39e6a0090faa4e73a658c1ca0ead3040309b84a2 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Fri Jun 8 01:12:24 2007 +0100 + + [quartz] fall back on extended gradients + + A temporary fix for mozilla bug 379321, use an image fallback for + gradients that use EXTEND_REPEAT or EXTEND_REFLECT. + + src/cairo-quartz-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 7c1afdcd597331c14f256f406a3e95743f7fdad6 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Mar 26 00:06:23 2007 +0100 + + [quartz] fixes the offsets in the font-matrix test + + Apply the font matrix offset to text on the quartz surface, if necessary. + + src/cairo-quartz-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 55f1dbd0fbcbc587823ef8fa291a0af08441c775 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Apr 1 00:04:24 2007 +0100 + + [quartz] ensure that line widths are scaled. + + cairo-gstate applies the ctm to the coordinates used in paths, + but not to the line width. In quartz this ends up drawing unscaled + lines. This is a minimal fix - it undoes the scaling applied to the + points and then draws the path scaled correctly. + + src/cairo-quartz-surface.c | 72 ++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 57 insertions(+), 15 deletions(-) + +commit 5a9de1b5c9f6cc445f9f6230937c2254ee49e7cb +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jun 7 23:22:30 2007 +0100 + + [atsui] remove unused code + + Remove CGAffineTransformMakeWithCairoFontScale. + + src/cairo-atsui-font.c | 8 -------- + 1 file changed, 8 deletions(-) + +commit 807c5ab613e7df60be452d6683c4f9f045ef62a0 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jun 7 23:22:29 2007 +0100 + + [atsui] clean up warnings + + Refactor code to get rid of compiler warnings. + + src/cairo-atsui-font.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit b210b09e2de2f048debad6e8881f0226b6b17060 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jun 7 23:22:27 2007 +0100 + + [quartz] implement CAIRO_EXTEND_REFLECT + + Implement extend-reflect by tiling a larger 2x2 grid of reflected + images. + + src/cairo-quartz-surface.c | 64 ++++++++++++++++++++++------------------------ + 1 file changed, 30 insertions(+), 34 deletions(-) + +commit fa5dd548b0dd2dfe523501bd40cafe7916240be1 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue May 29 23:11:49 2007 +0100 + + [quartz] implement CAIRO_EXTEND_NONE + + Implement extend-none for surface patterns, by using a single + DrawImage where possible. There is some code duplication in this + patch, to make it easier to edit this patch series without conflicts. + A patch to remove duplicate code will be required later.. + + src/cairo-quartz-surface.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 59 insertions(+), 2 deletions(-) + +commit 147288864c8c512f3ae17c8117d3c36dbbc6d5f8 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Thu Jun 7 23:22:05 2007 +0100 + + [quartz] Refactor code to create a CGImageRef from a pattern + + In order to implement CAIRO_EXTEND_NONE we will need to create + a CGImageRef without also creating a CGPattern. Separate the two + pieces of code. + + src/cairo-quartz-surface.c | 40 +++++++++++++++++++++------------------- + 1 file changed, 21 insertions(+), 19 deletions(-) + +commit a5ee983e1cb97aff63b0c9c3a57125b37d0e3f74 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 7 15:03:43 2007 -0700 + + Update release notes for 1.4.8 + + NEWS | 75 +++++++++++++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 48 insertions(+), 27 deletions(-) + +commit e19c49269d0b236de91a5a9b5230bed7d76282ed +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jun 7 12:19:46 2007 -0700 + + Remove stale reference to cairo-xlib-test.h + + src/Makefile.am | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 5ded4479d6ddbbe16c631144ef987c4c02e706a6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 31 15:35:14 2007 -0700 + + Fix return value of cairo_surface_write_to_png for unsupported formats + + For some reason this was returning CAIRO_STATUS_NULL_POINTER. + Now fixed to return CAIRO_STATUS_INVALID_FORMAT. + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ec63a7839457e2d14c7b1a5b64d1a79daf044222 +Author: Carl Worth <cworth@cworth.org> +Date: Thu May 31 14:28:50 2007 -0700 + + Add CAIRO_INTERNAL_FORMAT_RGB16_565 and prefer it over deprecated CAIRO_FORMAT_RGB16_565 + + Also clarify the documentation for cairo_internal_format_t + + src/cairo-image-surface.c | 6 +++--- + src/cairoint.h | 52 ++++++++++++++++++++++++++++------------------- + 2 files changed, 34 insertions(+), 24 deletions(-) + +commit b6ee6c531c41adb57512fe0eaf21558e5d03f04b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 7 12:22:20 2007 -0400 + + [NEWS] Add par about Chris 'ickle' Wilson's error-handling improvements work + + NEWS | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 2399f923d504fba6b3dcbd0a185cd3d4b29b4dcf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 4 19:55:23 2007 +0100 + + [cairo-bentley-ottmann] Malloc reduction. + + Attempt to allocate the edges during tessellate_polygon() from the stack, + if the polygon size is sufficiently small and amalgamate the separate + allocations for the list of events and their sorted index into a single + block. + + src/cairo-bentley-ottmann.c | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit ecf6f7f5147195276b3b479879cbd3db402df688 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Jun 4 16:35:15 2007 +0100 + + [cairo-scaled-font] Skip the mask composition onto the surface on error. + + If we fail to composite the glyph onto the mask, skip compositing the + mask onto the surface. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2e60029392bca904f7035a8f403de0593193b6b9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Jun 5 09:08:51 2007 +0100 + + [cairo-ft-font] Markup error paths with _cairo_error(). + + Behdad Esfahbod noted that in ff5af0f540ec4 I had introduce new error + paths without the appropriate _cairo_error(). So review cairo-ft-font + to ensure that _cairo_error() is called at the start of every error path, + as close to the originating error as possible. + + src/cairo-ft-font.c | 58 +++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 41 insertions(+), 17 deletions(-) + +commit a5e12cd9f212b12a32230263188be38c175dc0a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 31 19:21:30 2007 -0400 + + [ROADMAP] Add link for a8mask patch + + ROADMAP | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ff5af0f540ec407beb3d2a105b22f041cd770ce4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 30 15:44:59 2007 +0100 + + [cairo-ft-font] Propagate error rather than asserting. + + FT_Set_Char_Size can fail due to an out-of-memory condition, so + propagate the error status instead of asserting that it never fails. + + src/cairo-ft-font.c | 41 ++++++++++++++++++++++++++++++----------- + 1 file changed, 30 insertions(+), 11 deletions(-) + +commit de4dd4263cb5183b128a8fc80576ed7ddb239319 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 15:15:11 2007 +0100 + + [cairo] Propagate surface->status on cairo_t creation. + + Set the cairo_t status to be the surface->status when the context is + created, and special case the NO_MEMORY status in order to avoid a + redundant allocation. + + src/cairo-gstate.c | 2 +- + src/cairo.c | 12 +++++------- + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit 9f4efa8a3ae6cbc194d89012286990582a6c8f5d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 09:48:47 2007 +0100 + + [cairo-ps-surface] Check status of glyph_lookup. + + Check for failure of _cairo_scaled_glyph_lookup() before preceeding to + access the glyph and propagate the failure up the callstack as far as + possible. + + src/cairo-ps-surface.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 8010d46de4056e6c15b6891a06ef3d784c641b82 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun May 27 11:40:47 2007 +0100 + + [cairo-gstate] Check scaled font status. + + After using the public API to access the scaled font, which only sets + the status field in the font, check the scaled font status. This will + then correctly propagate errors during glyph loading to the context. + + src/cairo-gstate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit faf986bb25eab34eee16415f4dab6f7d5d3460d3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 29 12:39:16 2007 +0100 + + [cairo-gstate] Check status on existing fonts. + + Add an initial guard in _cairo_gstate_ensure_scaled_font() and + _cairo_gstate_ensure_font_face() to check that there is no prior + error status on the objects. + + src/cairo-gstate.c | 41 +++++++++++++++++++++++------------------ + 1 file changed, 23 insertions(+), 18 deletions(-) + +commit ac4b20082dd6b2e2b280d3615eebf5387da87e2f +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue May 29 20:50:02 2007 -0700 + + [misc] make _cairo_image_surface_nil_invalid static const + + src/cairo-image-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0b34e958f18f0bcfb8bc9b054fb3bbb2343d2c32 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue May 29 17:14:41 2007 -0700 + + [test] add XFAIL test surface-pattern-big-scale down + + Add test for image downscaling with large images severely limiting + the destination coordinate space. See the test for more information. + + test/Makefile.am | 2 + + test/surface-pattern-big-scale-down.c | 121 ++++++++++++++++++++++++++++++++++ + 2 files changed, 123 insertions(+) + +commit 0898411d0abdfa6a02c2fb959b3a668e728fd87c +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Mon May 28 17:05:40 2007 -0400 + + [doc] Minor documentation fixes + + src/cairo-matrix.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo.c | 22 +++++++++++++++------- + src/cairo.h | 2 +- + 5 files changed, 19 insertions(+), 11 deletions(-) + +commit 4da50dfa02d7c03c32ee20c15f8304eafa0844e0 +Author: Luo jinghua <sunmoon1997@gmail.com> +Date: Sun May 27 17:09:49 2007 +0800 + + [cairo-xlib-surface]: flush work queue before sending glyphs to X server. + + After introducing a work queue for deferred destruction of X resource + my firefox crashes over and over again because XRenderFreeGlyphs is trying + to free a non-exist glyph (already freed). The problematic call sequence is + something like below: + XRenderAddGlyphs (20990204, 20069) + XRenderAddGlyphs (20990204, 20069) + XRenderFreeGlyphs (20990204, 20069) + XRenderFreeGlyphs (20990204, 20069) + You can see the two add/free glyphs is interlaced. And obviously, we'll crash + at the last one. To fix this bug, we must be ensure here's no pending work + to free the glyph that we want to sent. + + src/cairo-xlib-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 69bf823db1b256f19487d2f002e7b0811859e58e +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Fri May 25 01:35:37 2007 +0100 + + [atsui] use ATSGlyphGetScreenMetrics to measure glyphs. + + I don't know how I managed to get glyph measurement so badly wrong + before, but tracing paths was not necessary, and 6x slower. The fix + switches to using ATSGlyphGetScreenMetrics for all metrics, and remove + the old measuring code. + + src/cairo-atsui-font.c | 88 ++++---------------------------------------------- + 1 file changed, 6 insertions(+), 82 deletions(-) + +commit 5b2b008048d2bcbb0b558a6c02aee1093311db39 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 10:14:57 2007 +0100 + + [cairo-scaled-font-subsets] Shortcut empty subset. + + If the font_subset if empty, avoid allocating zero bytes and iterating + over the empty hash table. + + src/cairo-scaled-font-subsets.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit c175cf7b833b03c38c8ddea183333ce84c6fdfec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 17 17:04:14 2007 +0100 + + [cairo-ft-font] Remove erroneous cached font faces. + + Only return a font face from the cache if it is not in an error condition. + Otherwise unlink the bad font face from the cache and construct a new one. + + src/cairo-ft-font.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit f382c3e110f8078e83cbb9d73cfbb43b1506a11b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 15:31:33 2007 +0100 + + [cairo-pattern] Fully initialise the error pattern. + + _cairo_pattern_fini depends on the pattern being correctly initialised, + for example when calling _cairo_user_data_array_fini(), so we need to + initialize the whole pattern and not just set the type to SOLID when + creating a pattern for a surface in error. + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fcdfda83655faf0eecbb2b5af09a05340fe422e6 +Author: Boris Zbarsky <bzbarsky@MIT.EDU> +Date: Mon May 14 23:46:14 2007 -0500 + + [quartz] implementing release_source_image (#11059) + + The image surface that _cairo_quartz_surface_acquire_source_image creates never + seems to be released, probably because there is no release_source_image callback + in the quartz code. + + The attached patch fixes that problem, at least insofar as the image surface + itself is no longer leaking. I'm not sure whether any other cleanup needs to + happen here. + + -Boris + + src/cairo-quartz-surface.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 2c8598aafb4a8779ce94940ce91033a8c5a62ea4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 18 13:23:04 2007 -0700 + + Fix typo in comment. + + src/cairo-pattern.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3cb67435f805a8ea39f38194379f216ea4a69ed6 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 18 13:22:36 2007 -0700 + + Document behavior of color stops added with identical offsets. + + src/cairo-pattern.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 1cf4ed989473e2468ea2d64bb7759084c9f6a1e4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 18 13:16:23 2007 -0700 + + ROADMAP: Add bugs for 565 and 655 Visuals to the list + + ROADMAP | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 7260ee23ecb08e72a938a194e70dfb5e7a48c599 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 18 11:55:37 2007 -0400 + + [Type1] #include <ctype.h> (#10989) + + src/cairo-type1-subset.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6a42ddf0f9e9e4b8dc5fa6a98ef4448f1c149789 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu May 17 12:45:22 2007 +0930 + + TrueType Subsetting: Remove post table + + The post table is not used now that TrueType fonts are embedded + in PDF as CID fonts. + + src/cairo-truetype-subset.c | 34 +--------------------------------- + 1 file changed, 1 insertion(+), 33 deletions(-) + +commit 67e752f75fdc561aca419f798a1650feb22e59a4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu May 17 11:48:25 2007 +0930 + + CFF Subsetting: Filter out Unique ID from subset + + The subsetted font is not the same as the original font so it should not + have the same XUID and UniqueID. + + src/cairo-cff-subset.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 99a6983017e1cd27f8a598487f8a72cfa6d411f1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu May 17 10:17:09 2007 +0930 + + Ensure surface backend finish() is never called more than once. + + Previously if the backend finish() function returned an error status, + surface->finished was not set true. This would result in the backend + finish() function being called twice which in the case of the PostScript + backend caused a seg fault. + + src/cairo-surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit c5ae0f1232e8cef860bc1fc0b449ddf9d9063d22 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 16:11:02 2007 +0100 + + [cairo-truetype-subset] Avoid a potential 0 byte allocation. + + During _cairo_truetype_subset_init skip copying the string_offsets if + the vector is empty. + + src/cairo-truetype-subset.c | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +commit e37bee3f52282a042251f2dfc8e051943fd8f1d7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 16 14:47:33 2007 +0100 + + [cairo-pdf-surface] emit_pattern_stops() array overrun. + + _cairo_pdf_surface_emit_pattern_stops() tried to set the last element + to have an offset of exactly 1.0, but missed and set the next element + after the end of the array. + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 27de1869f5a837b79812cd4b04e17621ec0f848c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 16 13:10:58 2007 +0100 + + [cairo-pdf-surface] Free allstops on error. + + Ensure the locally allocated resources are freed on the error paths. + + src/cairo-pdf-surface.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 79e6c0207cb65b6bc1f38537f42632d623a1bc9a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 18:27:58 2007 +0100 + + [cairo-pattern] Check for the nil surface. + + cairo_surface_create_similar() does not return NULL as was being checked + for, but the nil surface on error. Also ensure that the returned surface + is destroyed if we encounter an error whilst compositing. + + src/cairo-pattern.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit 32c0ef9f145cec8b997c011b13208362eaf03004 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 16:20:00 2007 +0100 + + [cairo-gstate] Remove a redundant conditional. + + Simplify _cairo_gstate_text_to_glyphs() with a tail call. + + src/cairo-gstate.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 37d8c18b3fc489d6336131bae6ec219cafc35718 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 15:42:59 2007 +0100 + + [cairo-scaled-font-subsets] Destroy the glyph if we fail to cache it. + + If we fail to insert the glyph into the sub_font glyph cache then we + must destroy it before propagating the error. + + src/cairo-scaled-font-subsets.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 76e758df5b99fd4dee64481b9039b0d44dd01587 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 15:40:39 2007 +0100 + + [cairo-truetype-subset] Destroy the arrays on error. + + Growing the arrays may successfully allocate the indirect pointer, but + fail whilst allocating the actual array - so always call + _cairo_array_fini after _cairo_array_grow_by(). + + src/cairo-truetype-subset.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit b63b32958e690409448ddc14e19b1856b9ef555a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 15:32:34 2007 +0100 + + [cairo-scaled-font-subsets] Destroy the parent and subfont on error. + + If we fail to create the sub font destroy the local reference to the + parent font and if we fail to insert the sub font into the hash table, + destroy the newly create sub font. + + src/cairo-scaled-font-subsets.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit fcd1076bcffa20b7770a1b447a46232760972e2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 14:36:11 2007 +0100 + + [cairo-ft-font] Destroy the path on error. + + During _decompose_glyph_outline() destroy the fixed path if we + encounter an error. + + src/cairo-ft-font.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit abb19e61cf076c62c7626094c70de0530bd9fd00 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 14:32:52 2007 +0100 + + [cairo-ft-font] Destroy the unscaled reference on error. + + Release the reference to the unscaled font if we encounter an error + whilst initialising the cairo_ft_scaled_font_t. + + src/cairo-ft-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit e4055f02a1f5a3d7942c7c2bb4f460ce0a8b5481 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 14:29:28 2007 +0100 + + [cairo-ft-font] Race between unscaled removal from hash table and creation + + Small window of opportunity for the unscaled font to be destroyed and + removed from the hash table before + _cairo_ft_unscaled_font_create_for_pattern() takes a reference on behalf + of its cairo. Close the window by taking the reference with the font + map lock held. + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f239308ef1014174d554ccaeab1fe7c2d84e26dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 13:27:09 2007 +0100 + + [cairo-deflate-stream] Free the stream on error. + + Before returning the nil output stream, free the locally allocated + stream when encountering an error during _cairo_deflate_stream_Create(). + + src/cairo-deflate-stream.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 35a2ed03352a1abc42e441ce5f52f2704de9be85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 12:36:47 2007 +0100 + + [cairo-ft-font] Destroy surface if glyph transformation fails. + + As we allocated the surface we need to destroy it if we encounter an + error. + + src/cairo-ft-font.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 6a43c027238d2302f9e01ee7a780370d330def6c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 09:43:30 2007 +0100 + + [cairo-xlib-screen] Increase number of GC depths. + + Add support for depths 12 and 30, and a separate unknown. + + src/cairo-xlib-private.h | 2 +- + src/cairo-xlib-screen.c | 14 ++++++++------ + 2 files changed, 9 insertions(+), 7 deletions(-) + +commit 70611846ded98ffa0f085f5a704979384b37e84c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 09:40:13 2007 +0100 + + [cairo-xlib-surface] Always nullify GC after pushing to screen. + + The status return from _cairo_xlib_screen_put_gc() indicates the failure + to queue a job to free an old GC - the current GC is always transferred + away from the caller, so always nullify it in the surface. + + src/cairo-xlib-surface.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit 58c35e6d7b2e153dc9cd6ff89fa91497c507afaf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 00:10:26 2007 +0100 + + [cairo-paginated-surface] Check surface status during finish. + + Propagate children status during finish. + + src/cairo-paginated-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 9ffd8154e2ec2ccbeeefd3e4a34b2aa16844c1ce +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 23:43:53 2007 +0100 + + [cairo-scaled-font-subsets] Correctly destroy the hash table. + + After an allocation failure in + _cairo_scaled_font_subsets_create_internal() call + _cairo_hash_table_destroy() instead of a mere free(). + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bcfc5f0bdbd4c1eedc22bde5eed464a8bd18211e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 20:57:12 2007 +0100 + + [pixman] Propagate allocation failure. + + pixman_op() failed to propagate the failure from + pixman_region_appendNonO() and the generic op. + + pixman/src/pixregion.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +commit 9e99f0611c834f80903e3554663f71682ef59ef3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 20:38:24 2007 +0100 + + [cairo-traps] Initialize traps to use embedded buffer. + + Set the traps to use the embedded buffer during initialization which will + save one redundant _cairo_traps_grow() + + src/cairo-traps.c | 26 ++++++-------------------- + 1 file changed, 6 insertions(+), 20 deletions(-) + +commit 35eb65b7772459266e2f954fb370bfdca12b5b64 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 18:25:13 2007 +0100 + + [cairo-path] Check for errors during the count. + + Return the nil object if we encounter any error whilst trying to + generate the path. + + Also special case the NO_MEMORY error object to return the nil object. + + src/cairo-path.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit a60afb0e78ab42498158ef852fcea35c8f71e8ec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 11 16:01:26 2007 +0100 + + [cairo-scaled-font] Return status of _cairo_scaled_font_glyph_path() + + The status return of _cairo_path_fixed_interpret() was being ignored, + propagate it. + + src/cairo-scaled-font.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit d46f6872a5fe601862e2f63455c97a15c4667cf2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 13 21:52:52 2007 -0400 + + [docs] Update to latest source changes and kill warnings + + doc/public/Headers.mk | 1 + + doc/public/Makefile.am | 2 -- + doc/public/cairo-docs.xml | 6 +++--- + 3 files changed, 4 insertions(+), 5 deletions(-) + +commit 40558cb15e5f7276a29847b00c9dae08b9d9380e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 12 10:10:49 2007 +0100 + + [cairo-xlib-screen] Clear the gc_needs_clip_reset after use. + + After consuming the GC we need to unset the clip reset flag, so that + if we try and get a new GC without first putting a fresh one we do not + try to call XSetClipMask on a NULL GC. + + (Fixes http://bugs.freedesktop.org/show_bug.cgi?id=10921) + + src/cairo-xlib-screen.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit abba3f2375c58401b7722837b3be37c3de9beca4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 23:05:46 2007 +0100 + + [valgrind-suppressions] Update to cover XrmGetStringDatabase + + By dropping the top frame from suppression, the XrmGetFileDatabase + suppressions will also match XrmGetStringDatabase leaks which are + starting to occur. + + test/.valgrind-suppressions | 42 ++++++++++++++---------------------------- + 1 file changed, 14 insertions(+), 28 deletions(-) + +commit c4abc3a0e3ebb27bc0aa178651e496c514eb1fae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 21:28:48 2007 +0100 + + [cairo-truetype-subset] Set CAIRO_STATUS_NO_MEMORY on malloc failure. + + _cairo_truetype_font_create() failed to update the status before + returning after detecting an allocation failure, leaving its callers + none the wishing - and eventually triggering a segmentation fault when + the font was used in anger. + + src/cairo-truetype-subset.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit ebababc0cf83f828d48200b8e316f57912fb0128 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 19:24:54 2007 +0100 + + [cairo-pattern] Return the nil cairo_pattern_t for CAIRO_STATUS_NO_MEMORY. + + If we asked to create a pattern after encountering an allocation failure, + we can avoid another allocation by returning the nil pattern object. + + src/cairo-pattern.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit e8e5f93ffec8321c029c0b95abcb3cd8cadcff31 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 20:50:58 2007 +0100 + + [cairo-meta-surface] Add a surface->status guard to meta_surface_replay() + + Before attempting to access the cairo_meta_surface_t specific members, + we need to ensure that _cairo_meta_surface_replay() has received a true + meta surface rather than an error surface (e.g. _cairo_surface_nil). + + src/cairo-meta-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 195112697fac77e70ef36e00a2d557eda1e0e145 +Author: elaine <elaine.xiong@sun.com> +Date: Thu May 10 13:58:44 2007 -0400 + + [xlib] The buggy_repeat path should be removed for Xsun now + + Sun never released a version of Solaris with Xorg with the buggy repeat + problem. This patch was only needed for development versions of Solaris + Nevada (roughly builds 25-30). The latest S10U release and Nevada releases + have a fixed Xorg. So no users should ever encounter this bug. + + We need to remove this test because Xsun has the same VendorString and a lower + VendorRelease number so it falsely triggers buggy_repeat to be turned on. + They just added Xrender support recently to Xsun, so this wasn't an issue + before recently. + + src/cairo-xlib-surface.c | 3 --- + 1 file changed, 3 deletions(-) + +commit ab6a767cf476c98b466c62dd410d0f61f8dd6bbb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 17:17:30 2007 +0100 + + [cairo-scaled-font] Check for allocation failure. + + cairo_scaled_font_create() returns a nil object on failure whereas a few + callers were checking for NULL. + + Secondly review the public entry points for cairo_scaled_font_*() to + ensure that all check that they will not attempt to overwrite the + read-only nil object. + + src/cairo-gstate.c | 7 +++---- + src/cairo-scaled-font-subsets.c | 2 ++ + src/cairo-scaled-font.c | 10 ++++++++-- + src/cairo-type1-fallback.c | 2 +- + 4 files changed, 14 insertions(+), 7 deletions(-) + +commit aec92188f1cf4ca34e890b0a4266425532f669d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 09:29:24 2007 +0100 + + [cairo-clip] Correctly report allocation failure + + Distinguish between the unrepresentable clip and the failure to allocate + the clip extents. + + src/cairo-clip.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 1a719d1189243a76120b98371f84e074c8cd611e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 10 09:28:20 2007 +0100 + + [cairo] Use _cairo_clip_nil for CAIRO_STATUS_NO_MEMORY + + When creating a error clip list for CAIRO_STATUS_NO_MEMORY, simply + reuse the nil object rather than allocate a fresh list. + + src/cairo.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3fbc4bb5ae27809f417ec2627fa515375e63a0e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 21:41:17 2007 +0100 + + [cairo-clip] Add missing error status for _cairo__clip_intersect_region() + + An out-of-memory error path missed setting CAIRO_STATUS_NO_MEMORY. + + src/cairo-clip.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b5d25068796d572b4b0c6e33eecc5f0736fb8f78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 16:27:42 2007 +0100 + + [cairo] cairo_pop_group() returns a NULL pattern + + cairo_pop_group() checks for a NULL return from + cairo_pattern_create_for_surface() instead of the nil cairo_pattern_t, + and then returns a NULL pattern instead of the nil object. + + src/cairo.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 6f09e93ad7ac4c941ba6c72b21ea4536d248f8d5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 13:39:08 2007 +0100 + + [ciro-surface-fallback] Propagate status for _clip_and_composite_trapezoids + + The result of _clip_and_composite_trapezoids() was ignored by 2/3 of + its callers - simply propagate the status. + + src/cairo-surface-fallback.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit ae5d4a1c17a46c0a6ea2e4c825ecce7a5cbbe28b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 13:19:54 2007 +0100 + + [cairo] Return after detecting the invalid font-options. + + Do not continue to copy the contents of the nil cairo_font_options_t, + but set the error on the context and return. + + src/cairo.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit dfd4d41ac99dbe5d8ea16aa4ce4809b66308c803 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 12:30:40 2007 +0100 + + [cairo-xlib-surface] Free the allocation if we fail to queue the work. + + Avoid the leak of the allocated argument if we fail to queue the work to + free the glyph. + + src/cairo-xlib-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 8ddfc1b2e4aeefb704e05e64661b5c9985788e99 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 16:13:08 2007 +0100 + + [cairo-pattern] Return status from _cairo_pattern_init_copy() + + During the copy, allocation of the gradient may fail and so the callers + need to check for a pattern that returned in an error state. No callers + did so and in order to force all callers to check the error status, + the status return was added to _cairo_pattern_init_copy(). The early + error checking may appear redundant for an object with an embedded + structure, however it does fix an error where an uninitialised pattern + was being used: + + ==1922== Process terminating with default action of signal 11 (SIGSEGV) + ==1922== Access not within mapped region at address 0x55555555 + ==1922== at 0x402CF6F: _cairo_array_index (cairo-array.c:208) + ==1922== by 0x402D4F3: _cairo_user_data_array_fini (cairo-array.c:370) + ==1922== by 0x4046464: _cairo_pattern_fini (cairo-pattern.c:188) + ==1922== by 0x404992A: _cairo_meta_surface_paint (cairo-meta-surface.c:266) + ==1922== by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331) + ==1922== by 0x405CB5E: _test_meta_surface_paint (test-meta-surface.c:195) + ==1922== by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331) + ==1922== by 0x4032A60: _cairo_gstate_paint (cairo-gstate.c:822) + ==1922== by 0x402B2D1: cairo_paint (cairo.c:1879) + ==1922== by 0x804A4F7: draw (radial-gradient.c:73) + ==1922== by 0x804AFA4: cairo_test_expecting (cairo-test.c:326) + ==1922== by 0x804A57C: main (radial-gradient.c:109) + ==1922== Injected fault at: + ==1922== at 0x4020EA5: malloc (vg_replace_malloc.c:207) + ==1922== by 0x404475C: _cairo_pattern_init_copy (cairo-pattern.c:136) + ==1922== by 0x403F779: _cairo_surface_copy_pattern_for_destination (cairo-surface.c:2153) + ==1922== by 0x403FCC1: _cairo_surface_paint (cairo-surface.c:1328) + ==1922== by 0x405CB5E: _test_meta_surface_paint (test-meta-surface.c:195) + ==1922== by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331) + ==1922== by 0x4032A60: _cairo_gstate_paint (cairo-gstate.c:822) + ==1922== by 0x402B2D1: cairo_paint (cairo.c:1879) + ==1922== by 0x804A4F7: draw (radial-gradient.c:73) + ==1922== by 0x804AFA4: cairo_test_expecting (cairo-test.c:326) + ==1922== by 0x804A57C: main (radial-gradient.c:109) + + src/cairo-glitz-surface.c | 12 +++++++--- + src/cairo-gstate.c | 55 ++++++++++++++++++++++++++++++++-------------- + src/cairo-meta-surface.c | 6 ++++- + src/cairo-pattern.c | 30 ++++++++++++++++++------- + src/cairo-quartz-surface.c | 6 ++++- + src/cairo-surface.c | 47 +++++++++++++++++++++++++++------------ + src/cairoint.h | 2 +- + 7 files changed, 113 insertions(+), 45 deletions(-) + +commit dbdaf0690e1121d0f810dfb035e7a9f0dae17248 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 09:22:31 2007 +0100 + + [cairo-scaled-font] Check _cairo_scaled_glyph_loop() status + + In _cairo_scaled_font_glyph_path() we forgot to check the status return + of _cairo_scaled_glyph_loop() - propagate any failures. + + src/cairo-scaled-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b744c2705184c24845423d661258b39bbb17749b +Author: James Cloos <cloos@jhcloos.com> +Date: Wed May 9 02:50:59 2007 -0400 + + [cairo-directfb-surface] Fix typo from commit a8c8e17d + Fix typo in name of _cairo_directfb_surface_is_similar(). + + src/cairo-directfb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cbc9218cd3f664682bcb5095c602adf9615535d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 9 09:03:04 2007 +0100 + + [cairo-xcb-surface] Fix compilation + + As spotted by James Cloos <cloos@jbcloos.com>, I broke the compilation... + This is a minimal fix with no claims of completeness. + + src/cairo-xcb-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 069514a10ff2ca9ac86cc3dc1703aa19caa538e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 18:19:56 2007 +0100 + + [test/in-fill-empty-trapezoid] Cleanup after test failure. + + Ensure that the failure path also calls cairo_test_fini(). + + test/in-fill-empty-trapezoid.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 43645eb486da1af91b3264af6c84ac18a1eddcaa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 20:25:21 2007 +0100 + + [test/fallback-resolution] Cleanup after test failure + + Be valgrind clean even for test failures. + + test/fallback-resolution.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 21c6643b09c771454f913b444b6b040aaaacd3a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 21:28:48 2007 +0100 + + [cairo-surface] Check for errors when generating the scaled font. + + cairo_surface_show_glyphs() attempts to generate a device specific + scaled font and so needs to check for failure before attempting to use + it. + + src/cairo-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ede76a97ea5b68c3bd042dc6a93ecb1aa7c9761c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 17:26:22 2007 +0100 + + [cairo-font-options] Check for the nil-object. + + The design is for the user to create a cairo_font_options_t object with + cairo_font_options_create() and then is free to use it with any Cairo + operation. This requires us to check when we may be about to overwrite + the read-only nil object. + + src/cairo-font-face.c | 5 +++++ + src/cairo-font-options.c | 7 ++++++- + src/cairo-gstate.c | 4 +--- + src/cairo-scaled-font.c | 10 ++++++++++ + src/cairo-surface.c | 3 +++ + src/cairo.c | 12 ++++++++---- + src/cairoint.h | 3 ++- + 7 files changed, 35 insertions(+), 9 deletions(-) + +commit c441938569ed78123a57662a70ef5a74dcf73851 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 21:40:26 2007 +0100 + + [cairo-pattern] Cleanly handle an invalid pattern in cairo_pattern_transform() + + Simply return without writing to potentially read-only members of an + invalid pattern rather than assert. This is cleaner than tracking down + all the error paths that may call into cairo_pattern_transform()... + + src/cairo-pattern.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 409f9734297be250de5e462e2d52e653bd893125 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 8 14:18:42 2007 -0400 + + [test] If a test target fails, end the test + otherwise cairo is left in a dirty state and further tests are + unreliable. + + test/cairo-test.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit aad66d05fd0f310564e80c9ff59526028871751c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 16:40:24 2007 +0100 + + [test/nil-surface] Destroy the auxiliary context on failure paths. + + Just to be tidy, and aim to be valgrind-clean. + + test/nil-surface.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit e3acacc096d7db947e7c8f2167a6d97f04c403b1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 16:35:14 2007 +0100 + + [cairo-boilerplate-ps] Destroy the target on creation failure + + Remember to destroy the ptc->target as well as the ordinary surface, if + we need to. + + boilerplate/cairo-boilerplate-ps.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit efd212bfa25cb44b9499b89f93aa7167a9544ccb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 16:23:07 2007 +0100 + + [cairo-boilerplate] Protect against the nil cairo_scaled_font_t + + Beware the NULL pointer deference when trying to adjust the max glyph + cache size... + + boilerplate/cairo-boilerplate.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit b85920684f8feaba8d2d5b0262c60b4960c223b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 14:01:00 2007 +0100 + + [cairo-test] Destroy the check image on failure + + If drawing the checker pattern should fail, we need to free the + resources allocated locally. + + test/cairo-test.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 0bf3ffacda5dbfc4fd8a5a0d5fd37d9630f5bcdb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 13:55:04 2007 +0100 + + [test-fallback-surface] Destroy the backing image on malloc failure. + + Ensure we free all local resource should we encounter an allocation + failure during _cairo_test_fallback_surface_create(). + + src/test-fallback-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit eac18d44c7559fe393abf6706b52e5a8edbfd5e9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 8 12:46:42 2007 +0100 + + [cairo-paginated-surface] Propagate malloc failure + + Check for an allocation failure during _cairo_analysis_surface_create() + and propagate to caller - where we discover that the callers themselves + missed the status checks... + + src/cairo-paginated-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 0d8a1540ec53ecc309a10e77ea7788fcd16d8345 +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Tue May 8 09:11:57 2007 +0200 + + SVG: Don't clip SVG element, as clipping region is implicit. + + That makes editing of produced SVG easier. + + src/cairo-svg-surface-private.h | 1 + + src/cairo-svg-surface.c | 53 ++++++++++++++++++++--------------------- + 2 files changed, 27 insertions(+), 27 deletions(-) + +commit 936c965777c867bd4de7fd2278335837cc24eb22 +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Tue May 8 13:24:40 2007 +0800 + + glitz: kill some compiler warnings. + + src/cairo-glitz-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 413705872e321288bff1368c62eacad11805c2fc +Author: Jinghua Luo <sunmoon1997@gmail.com> +Date: Tue May 8 13:19:35 2007 +0800 + + glitz: fix a typo preventing build glitz backend from succeeding. + + src/cairo-glitz-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d81907734e18fb9302e78eccb1e25a838223b726 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 5 12:33:29 2007 +0100 + + [cairo-color] Only compare the shorts for equality. + + By only checking the premultiplied shorts inside the cairo_color_t we + only have to compare at most 8 bytes instead of the full 24 bytes. + + src/cairo-color.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 966a39396eb75d9d4ecc9997bb21d62fba176f78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 4 15:25:18 2007 +0100 + + [NEWS] Surface cache for solid patterns + + Add an entry describing the surface cache to NEWS. + + NEWS | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit 056d149212ce4999f8984db62b880ff2eb998ab3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 2 12:54:49 2007 +0100 + + [cairo-pattern] Don't cache fallback surfaces + + _cairo_surface_create_similar_solid() may return an image surface, + should the backend not support the required content or should it + encounter an error whilst creating the surface. In those circumstances + we choose not to cache the fallback surface. + + src/cairo-pattern.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit a8c8e17d845c7060286dac58b553fb717b270788 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 2 10:00:22 2007 +0100 + + [cairo-pattern] Cache surface for solid patterns + + Original work by Jorn Baayen <jorn@openedhand.com>, + 2715f2098127d04d2f9e304580a26cd0842c0e64 + + We use a small cache of size 16 for surfaces created for solid patterns. + This mainly helps with the X backends where we don't have to create a + pattern for every operation, so we save a lot on X traffic. Xft uses a + similar cache, so cairo's text rendering traffic with the xlib backend + now completely matches that of Xft. + + The cache uses an static index variable, which itself acts like a cache of + size 1, remembering the most recently used solid pattern. So repeated + lookups for the same pattern hit immediately. If that fails, the cache is + searched linearly, and if that fails too, a new surface is created and a + random member of the cache is evicted. + + A cached surface can only be reused if it is similar to the destination. + In order to check for similar surfaces a new test is introduced for the + backends to determine that the cached surface is as would be returned by + a _create_similar() call for the destination and content. + + As surfaces are in general complex encapsulation of graphics state we + only return unshared cached surfaces and reset them (to clear any error + conditions and graphics state). In practice this makes little difference + to the efficacy of the cache during various benchmarks. However, in order + to transparently share solid surfaces it would be possible to implement a + COW scheme. + + Cache hit rates: (hit same index + hit in cache) / lookups + cairo-perf: (42346 + 28480) / 159600 = 44.38% + gtk-theme-torturer: (3023 + 3502) / 6528 = 99.95% + gtk-perf: (8270 + 3190) / 21504 = 53.29% + + This translates into a reduction of about 25% of the XRENDER traffic during + cairo-perf. + + src/cairo-directfb-surface.c | 15 ++++- + src/cairo-glitz-surface.c | 40 +++++++++++- + src/cairo-image-surface.c | 29 ++++++++- + src/cairo-mutex-list-private.h | 3 +- + src/cairo-pattern.c | 135 ++++++++++++++++++++++++++++++++++++----- + src/cairo-pdf-surface.c | 3 + + src/cairo-surface.c | 57 +++++++++++++++++ + src/cairo-win32-surface.c | 29 ++++++++- + src/cairo-xcb-surface.c | 39 +++++++++++- + src/cairo-xlib-surface.c | 45 +++++++++++++- + src/cairoint.h | 16 +++++ + 11 files changed, 388 insertions(+), 23 deletions(-) + +commit 52472b740e821dee444ede1fff041a99d344daab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 1 18:34:47 2007 +0100 + + [cairo-xlib-surface] Defer application of clip mask until required. + + By deferring the issuing of the X requests to set the clip mask we can + theoretically avoid some redundant requests, but primarily we remove + another path where X requests are emitted. + + src/cairo-xlib-surface-private.h | 7 ++++ + src/cairo-xlib-surface.c | 72 +++++++++++++++++++--------------------- + 2 files changed, 41 insertions(+), 38 deletions(-) + +commit a81823cdf9a147d02bb2365558ba667ab52fb3c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 20 17:32:25 2007 +0100 + + [cairo-xlib-display] Allocate the close_display hooks from a freelist. + + Similar to job allocation, but only useful for toolkits like GTK+ which + recreate a new xlib surface for each expose. + + src/cairo-xlib-display.c | 105 +++++++++++++++++++++++++---------------------- + src/cairo-xlib-private.h | 1 + + 2 files changed, 57 insertions(+), 49 deletions(-) + +commit c29ffc64ca341623d21a7861f1b5f131b420d20f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 20 16:33:56 2007 +0100 + + [cairo-xlib-display] Cache the screen_info for the lifetime of the display. + + Hold an extra reference to the screen_info and explicitly destroy the + list of screens on CloseDisplay. + + src/cairo-xlib-display.c | 19 +++++++++++++++++++ + src/cairo-xlib-screen.c | 3 +-- + 2 files changed, 20 insertions(+), 2 deletions(-) + +commit 1d6f7b7a0282d1b24bec82d9ad113b0d0a0cde98 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 13:01:52 2007 +0100 + + [cairo-xlib] Cache freed GCs + + Maintain a cache of freed GCs, one for each used depth. + + src/cairo-xlib-display.c | 6 ++++- + src/cairo-xlib-private.h | 10 +++++++ + src/cairo-xlib-screen.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib-surface.c | 22 ++++++++------- + 4 files changed, 98 insertions(+), 10 deletions(-) + +commit 88c6d25d4e53ddad6f3d465b2f5249c76a421b82 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 17 12:03:07 2007 +0100 + + [cairo-xlib-surface] Defer xlib resource cleanup. + + Due to caching, destruction of X11 resources may occur outside of a + usable X11 context. To avoid this, we defer the destruction onto a work + queue which will be run the next time we try to use the X11 connection + on behalf of the user (at which point we must have a usable X11 context!) + or we are closing the Display. + + src/cairo-xlib-surface.c | 180 ++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 156 insertions(+), 24 deletions(-) + +commit 8ad30ccdb0a00701b15003edb2fe0cd4a8a9dfb7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 12:15:04 2007 +0100 + + [cairo-xlib] Introduce a workqueue for deferred destruction of X resources. + + Due to the nature of the reference counting, an X resource may be + destroyed later than anticipated and possibly from a different thread + than the original context. This becomes an issue for applications that + carefully manage their single X connection from a single thread and do + not use locking and are then suprised when cairo triggers X traffic when + performing work for a different part of the application in another thread. + + src/cairo-xlib-display.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-xlib-private.h | 18 +++++ + src/cairo-xlib-screen.c | 1 - + src/cairo-xlib-surface.c | 21 +++++- + 4 files changed, 205 insertions(+), 6 deletions(-) + +commit dd8681b76b088bab45c99510258920f027490f70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 16 15:04:08 2007 +0100 + + [cairo-xlib] Split per-display attributes from per-screen. + + Previously, we stored the per-display attributes inside a special + screen=NULL _cairo_xlib_screen_info_t. Now we keep track of known X + displays and store the screen information beneath the display structure + alongside the per-display hooks. + + src/Makefile.am | 8 +- + src/cairo-debug.c | 4 - + src/cairo-mutex-list-private.h | 2 +- + src/cairo-xlib-display.c | 258 ++++++++++++++++++++++++++++++++++ + src/cairo-xlib-private.h | 37 +++-- + src/cairo-xlib-screen.c | 309 +++++++++-------------------------------- + src/cairo-xlib-surface.c | 2 +- + src/cairoint.h | 6 - + 8 files changed, 359 insertions(+), 267 deletions(-) + +commit 9919f1ed9ccbec637252e06dd1de5f4665c873b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 3 19:54:31 2007 -0400 + + [TODO] Add link to cairo_copy_clip() proposal + + TODO | 1 + + 1 file changed, 1 insertion(+) + +commit e5d9d51e55eb45704de6d98ac9265743af56711f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 3 19:04:21 2007 -0400 + + [cairo-mutex] Fix typo. + + src/cairo-mutex.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 5ec27eef9566faa22fb1cbaf1a103a57ba5296c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 3 13:46:25 2007 +0100 + + [pixman] Free the old rects if we fail to allocate new. + + During the pixman_op, a complicated dance is performed to handle + enlarging the rectangle array to accommodate the op. One consequence + of this is to, under certain circumstances, replace the current + rectangle array with emptyData and track the old array with oldData. + Hence if we fail to realloc the enlarged array we need to free oldData. + + pixman/src/pixregion.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit ef3070821713c33fab78abb191e27a62e165f6c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 2 16:22:13 2007 -0400 + + [boilerplate] Fix typo + + boilerplate/xmalloc.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c412e42c72c0ff53c678119638357ed95897ed78 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 2 21:17:39 2007 +0100 + + [cairo-xlib-surface] Check that the acquire surfaces are xlib surfaces + + _cairo_pattern_acquire_surfaces() may substitute an image surface for + either the source or the mask should the backend not support creation + of similar scratch surfaces or an error occurs during creation. For + composition we require xlib surfaces and so we must trigger the + fallback path if this happens. + + src/cairo-xlib-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit f3153091b742daffa853f2c31b76aa9689c5165a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 20:10:39 2007 -0400 + + [cairo-mutex] Document the API for adding cairo_mutex_t implementations + + src/cairo-mutex-type-private.h | 83 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 83 insertions(+) + +commit 5bfd6553fd028f1429d72c60d04788de4a3c0d58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 19:48:33 2007 -0400 + + [cairo-mutex] Define a NOOP CAIRO_MUTEX_FINALIZE() for pthread + as now the mutex layer will define a generic CAIRO_MUTEX_FINALIZE() + whenever the implementation defines CAIRO_MUTEX_FINI(). In the + case of pthread however we don't need finalization as we don't + have any place to call it, and pthread_mutex_destroy() doesn't + do much anyway. + + src/cairo-mutex-type-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit c4e0a059feb9c2e0c32966dcb168861e75a244b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 19:46:51 2007 -0400 + + [cairo-mutex] Remove NOOP definition of CAIRO_MUTEX_INITIALIZE + as now the mutex layer will use a NOOP CAIRO_MUTEX_INITIALIZE + by default if the implementation does not define CAIRO_MUTEX_INIT. + + src/cairo-mutex-type-private.h | 1 - + 1 file changed, 1 deletion(-) + +commit 06cc74d974a99526829df558606174b41b0ee6e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 19:45:29 2007 -0400 + + [cairo-mutex] Rewrite defaults for CAIRO_MUTEX macros not defined by the implementation + to make them better match the design I have in mind, that I will + document in a minute. They are a lot more readable and understandable + now. + + src/cairo-mutex-private.h | 93 ++++++++++++++++++++++++++++++++++------------- + src/cairo-mutex.c | 18 +++++++-- + 2 files changed, 82 insertions(+), 29 deletions(-) + +commit e87a25dc7c73a44b0cdfc4ef368736e7f77fb522 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 19:24:26 2007 -0400 + + [cairo-mutex] Fix usage of CAIRO_MUTEX_DECLARE() + + Previously cairo-mutex.c was abusing cairo-mutex-private.h by + defining CAIRO_MUTEX_DECLARE before including it, and + cairo-mutex-private.h was simply not overriding any available + CAIRO_MUTEX_DECLARE. This is not the way it should be. + cairo-mutex.c should instead define CAIRO_MUTEX_DECLARE and + include cairo-mutex-list-private.h for itself. + + src/cairo-mutex-private.h | 4 +--- + src/cairo-mutex.c | 9 +++++---- + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit 1a33e44aa5d73f568c4164c41f9595964e9f1bbb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 18:13:19 2007 -0400 + + [RELEASING] Update GNOME URL to point to 2.19 planning page + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4764e6222bf4d5223fc2fbb139bb31a24819b2b5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 00:50:03 2007 -0400 + + [cairo-mutex] Improve error message if no thread implementation found + + to put back Carl's "acknowledge and accept" clause (!) before suggesting + use of CAIRO_NO_MUTEX. + + src/cairo-mutex-type-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b5f015f21f3c800919a85f03a081a3ec1648a794 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 00:48:33 2007 -0400 + + [cairo-mutex] Make sure mutex implementation declares enough macros + + We have defaults for the rest. + + src/cairo-mutex-private.h | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit b0a0a1779dc5cc16423473b6d80ee5099793a47f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 00:47:02 2007 -0400 + + [cairo-mutex] Make CAIRO_MUTEX_INIT/FINI take mutex object, not pointer to it + + This is more consistent with CAIRO_MUTEX_LOCK/UNLOCK. + + src/cairo-ft-font.c | 4 ++-- + src/cairo-mutex-private.h | 2 +- + src/cairo-mutex-type-private.h | 19 +++++++------------ + src/cairo-mutex.c | 4 ++-- + src/cairo-scaled-font.c | 4 ++-- + 5 files changed, 14 insertions(+), 19 deletions(-) + +commit f9154f7eda4272ff99cc8a894082cc5aa1b008ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 00:44:42 2007 -0400 + + [cairo-mutex] Make sure CAIRO_MUTEX_FINI() evaluates its argument once + + src/cairo-mutex-private.h | 2 +- + src/cairo-mutex-type-private.h | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit a8d47d0c001a36ddd6c9f09247e6eada408edb24 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 00:43:15 2007 -0400 + + [cairo-mutex] Rename macro arguments from "name" to "mutex" + + src/cairo-mutex-private.h | 6 +++--- + src/cairo-mutex-type-private.h | 20 ++++++++++---------- + src/cairo-mutex.c | 4 ++-- + 3 files changed, 15 insertions(+), 15 deletions(-) + +commit f57a536fceec73435bb13c44275717792b9b3a8c +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 1 13:45:58 2007 -0700 + + Increment version to 1.4.7 after the 1.4.6 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ddca8fec07ff95caeda6e4ce9efc3239b146bd2d +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 1 13:37:16 2007 -0700 + + perf: Add $(EXTRA_PROGRAMS) to CLEANFILES + + Otherwise these programs stick around and break distclean, + distcheck, and hence release-publish targets. + + perf/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 0390ed4f189365d595b40a45b0cf9eef5aa0c6ba +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 1 13:24:43 2007 -0700 + + Increment version to 1.4.6 (and library versioning to 13:3:11) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c9e0bb5c79abfc50ae6a24f603c5493c3ac68e40 +Author: Carl Worth <cworth@cworth.org> +Date: Tue May 1 13:20:56 2007 -0700 + + NEWS: Add notes for cairo 1.4.6 + + NEWS | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 116 insertions(+) + +commit 7f7f4d4f35cd640733b990fcff924a090b43d360 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 1 12:37:38 2007 +0100 + + [cairo-xlib-surface.c] Free the Pixmap on surface construction failure. + + If we create the Pixmap whilst constructing a similar xlib surface, then + it our responsibility to free the Pixmap should we fail to allocate the + surface. + + src/cairo-xlib-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3e3bd4df7e810a9acd14cd6f3717633f71691b9e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 1 11:28:45 2007 +0100 + + Minor typo in cairo_surface_destroy() documentation. + + The type of @surface is #cairo_surface_t, not #cairo_t. + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f7cdbd385a02d023e35357cd27dcc165ada667f2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 1 00:41:07 2007 -0400 + + [cairo-mutex-private.h] Move implementation-specific parts to cairo-mutex-type-private.h + + This fixes the problem reported by Dave Yeo that boilerplate wasn't building: + + In file included from ../src/cairo-scaled-font-private.h:44, + from cairo-boilerplate.c:65: + ../src/cairo-mutex-private.h:183: error: syntax error before "extern" + ../src/cairo-mutex-private.h:184: error: syntax error before "void" + ../src/cairo-mutex-private.h:185: error: syntax error before "void" + make[3]: *** [cairo-boilerplate.lo] Error 1 + + src/Makefile.am | 1 + + src/cairo-mutex-private.h | 81 +------------------------ + src/cairo-mutex-type-private.h | 131 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-scaled-font-private.h | 2 +- + 4 files changed, 135 insertions(+), 80 deletions(-) + +commit 6de0f2d15775a451ead2cc3e80530b7dc6b321a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 30 22:38:00 2007 -0400 + + [cairo-mutex] Fix CAIRO_MUTEX_FINALIZE definition to take parantheses + This was breaking build on some systems as reported by Adrian Johnson + on the list. + + src/cairo-mutex-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f297a0fccb01f4e10a093ddc44a25a937364447 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 30 22:00:31 2007 -0400 + + [TODO] Add various items discussed recently + + TODO | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 51440ad9027bd9ccf7d987c234995470f7699043 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 30 21:57:29 2007 -0400 + + [ROADMAP] Mark clipping trapezoids done + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8ea48710dc933cd5dd52fb7d0c29eb8994a5d160 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 30 19:20:56 2007 -0400 + + [perf] Check availability before including nonstandard headers + + configure.in | 4 ++++ + perf/cairo-perf-diff-files.c | 2 ++ + perf/cairo-perf.c | 6 +++++- + 3 files changed, 11 insertions(+), 1 deletion(-) + +commit fbc8bf05033a652d26c1defa56d12183e4009870 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 30 19:11:31 2007 -0400 + + [perf] Don't build cairo-perf in "make all" + + perf/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4be608399f0d196a792f84fe4ddfce9acd2ea943 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 29 19:29:24 2007 +0930 + + Fix cygwin compile error + + The WINVER macros need to be defined before including <windows.h>. + As a result of some recent include file rearranging, <windows.h> + was included indirectly before WINVER was defined. + + src/cairo-mutex-private.h | 12 ------------ + src/cairo-win32-surface.c | 11 ++++++----- + 2 files changed, 6 insertions(+), 17 deletions(-) + +commit a5d1fc923fdef354ceed8478c93e8b7cb734158a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 30 16:05:36 2007 +0100 + + Free all memory when cairo-perf exits. + + Similar to cairo-test, we free any global memory used by cairo for its + caches through the debug interfaces. We do this so that valgrind does + not unnecessary warn about memory leaks for the cached data and any true + leak is then not lost in the noise. + + perf/cairo-perf.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 7e6ab5461c2eb75c948bcb4725613ebe826c697a +Author: Carl Worth <cworth@cworth.org> +Date: Sat Apr 28 07:46:56 2007 -0700 + + Add missing prototypes for getline and strndup + + This is needed to prevent breaking the build for non-GNU systems. + + perf/cairo-perf-diff-files.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 422798db1d73c1a8ecc5877133b0325023f38e61 +Author: Carl Worth <cworth@cworth.org> +Date: Sat Apr 28 07:46:15 2007 -0700 + + cairo-perf-diff-files: Add missing include of libgen.h for basename + + perf/cairo-perf-diff-files.c | 1 + + 1 file changed, 1 insertion(+) + +commit d89d8e6b45b7c13b77aa7c2f1c480f58429b08af +Author: Carl Worth <cworth@cworth.org> +Date: Sat Apr 28 07:45:26 2007 -0700 + + pixman.h: Add missing definition of WARN_UNUSED_RESULT + + This was breaking the build on systems without support for the + __warn_unused_result__ attribute. + + pixman/src/pixman.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit cb6fcdae92503964448144413e48ac388861d95f +Author: Carl Worth <cworth@cworth.org> +Date: Sat Apr 28 07:38:56 2007 -0700 + + Fix typo in Makefile preventing builds from succeeding + + The cairo-ps-surface-private.h file was not getting included in the + distribution. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a392cc85081dd1e0fa3342c313af94a1e0c289b1 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 27 22:46:47 2007 -0700 + + Clarify documentation of cairo_in_stroke and cairo_in_fill + + Like cairo_stroke_extents and cairo_fill_extents, these functions + work without regard to the surface dimensions or the current clip + region. + + src/cairo.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 8286b8741675ae163fc40187cd04e84395954c6e +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 27 17:23:08 2007 -0700 + + Clip trapezoids that are partially (or wholly) outside the clip region. + + It's quite simple to add a new _cairo_traps_limit call which installs + a box into the cairo_traps_t structure. Then at the time of + _cairo_traps_add we can discard any trapezoid that is wholly outside + the box and also clip any trapezoid that is partially outside the box. + + We take advantage of this for both cairo_stroke and cairo_fill, (when + cairo is computing the trapezoids in cairo-surface-fallback.c). Note + that we explicitly do not do any clipping for cairo_stroke_extents, + cairo_fill_extents, cairo_in_stroke, or cairo_in_fill which are + defined to ignore clipping. + + As seen by the long-lines perf case, this fix successfully works + around the bug in the X server where it creates overly large masks for + partially-outside-the-destination-surface trapezoids: + + xlib-rgba long-lines-uncropped-100 545.84 -> 5.83: 93.09x speedup + ██████████████████████████████████████████████ + xlib-rgb long-lines-uncropped-100 554.74 -> 8.10: 69.04x speedup + ██████████████████████████████████ + + src/cairo-surface-fallback.c | 52 +++++++++++++++++++++++++++++++++ + src/cairo-traps.c | 68 +++++++++++++++++++++++++++++++++++++++++++- + src/cairoint.h | 7 +++++ + 3 files changed, 126 insertions(+), 1 deletion(-) + +commit 2dcfb944b044172640a3784246d6b3129b686b60 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 27 16:41:17 2007 -0700 + + Don't test PDF tests known to fail due to poppler limitations + + The following four tests are disabled: + + gradient-alpha, linear-gradient, text-pattern, trap-clip + + We don't use XFAIL as that would disable all backends, (but + we can still usefully use these tests on backends other than + PDF). + + boilerplate/cairo-boilerplate-pdf.c | 15 +++++++++++++++ + test/gradient-alpha.c | 3 ++- + test/linear-gradient.c | 3 ++- + test/text-pattern.c | 3 ++- + test/trap-clip.c | 3 ++- + 5 files changed, 23 insertions(+), 4 deletions(-) + +commit 179e3399101b5a0daa907dcfe1f9f11ae8fe691e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 27 16:01:56 2007 -0700 + + PDF: Change CTM to identity + + Some PDF viewers forget the CTM when drawing gradient patterns + with SMasks. This patch works around these bugs by using the default + identity matrix for the CTM. All paths are transformed from + cairo to pdf coordinates before writing to the pdf file. + + src/cairo-pdf-surface-private.h | 1 + + src/cairo-pdf-surface.c | 135 ++++++++++++++++++++-------------------- + 2 files changed, 67 insertions(+), 69 deletions(-) + +commit 1816d7c590ae4d423f9314a8a7794e2cae854da3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 27 09:49:45 2007 -0700 + + Add support for transparent gradients + + This is based on the gradient patch written by Miklós Erdélyi at + http://lists.freedesktop.org/archives/cairo/2006-August/007648.html + + Currently only EXTEND_NONE and EXTEND_PAD are supported. Other extend + types will go through the image fallback path. + + src/cairo-pdf-surface-private.h | 13 + + src/cairo-pdf-surface.c | 950 +++++++++++++++++++++++++++++++--------- + 2 files changed, 752 insertions(+), 211 deletions(-) + +commit 050dad71734739f1eaf8976ca5bb88e47c76409c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 26 11:30:27 2007 -0700 + + cairo-perf-diff-files: Always print old and new configuration names + + Previously, if the change in the first test case was small enough + to be considered insignificant, then the header lines showing the + names of the old and new configurations would be omitted. This + commit fixes that bug. + + perf/cairo-perf-diff-files.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 6035d3b47e635f53b361dc7924e161a214e038b3 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 25 16:28:14 2007 -0700 + + cairo-perf-diff: Repair command-line option parsing. + + Apparently --force and --html have been broken since the attempt + to address --help in ef5611df6c6bc8d9c6877af3a59c66fa6fc5c13a . + + perf/cairo-perf-diff | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 0a1d2070e252921e097fec89537537675f8b7161 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Wed Apr 25 16:01:29 2007 -0700 + + Fix bugs in fbCompositeSrc_8888x8x8888mmx and fbCompositeSrc_x888x8x8888mmx + + And re-enable fbCompositeSrc_8888x8x8888mmx now that it should work. + + This gives another little boost to the paint-with-alpha perf test: + + image-rgba paint-with-alpha_image_rgba_over-512 11.76 -> 5.20: 1.85x speedup + ▉ + image-rgb paint-with-alpha_image_rgba_over-512 11.76 -> 5.26: 1.84x speedup + ▉ + + pixman/src/fbmmx.c | 20 +++++++++----------- + pixman/src/fbpict.c | 8 +++----- + 2 files changed, 12 insertions(+), 16 deletions(-) + +commit 342de46eb4033e1cccfec8b905c0002cc880c9fb +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 25 10:25:57 2007 -0700 + + Make the traditional speedup vs. slowdown report style available again + + Now, if you pass exactly two performance reports on the command line + you'll get the traditional report style again, (so the tool remains + backwards compatible). If you really want the new style with two + reports you can get it by adding /dev/null as a third argument. + + perf/cairo-perf-diff-files.c | 112 +++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 103 insertions(+), 9 deletions(-) + +commit db2a761ae7055a61d3705a76526cbd0b71fcc95d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 25 08:53:46 2007 -0700 + + Implement support for generating a report from more than two files + + This support is intended to compare the identical backends across multiple + reports from several different configurations, (of one sort or another). + The configuration names used in the report are taken from the filenames + of the report files, (which will format most nicely if 8 characters or + less). + + The traditional two-input report mode, (showing one line perdiff with + all speedups before all slowdowns), is removed with this commit, but + is intended to return again shortly. + + perf/cairo-perf-diff-files.c | 270 +++++++++++++++++++++++++------------------ + 1 file changed, 157 insertions(+), 113 deletions(-) + +commit 5030cfce5df507a0338e1070a5dab3851ed9df7c +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 16:32:57 2007 -0700 + + cairo-perf-diff-files: Use pointers instead of indexing to iterate over reports + + We terminate the iteration by adding a final report with a NULL + name. This will simplify future code that iterates over more than + two reports simultaneously. + + perf/cairo-perf-diff-files.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +commit 6121f4fccfe8d98fb09c096402da05d29d10b9e8 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 16:21:39 2007 -0700 + + cairo-perf-diff-files: Simplify code to grow report->tests + + perf/cairo-perf-diff-files.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +commit cc03f0499e7b133a2e5c14e55207259ea000b8c2 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 16:09:06 2007 -0700 + + cairo-perf-diff-files: Sort and compute stats at the time of loading a report + + perf/cairo-perf-diff-files.c | 150 +++++++++++++++++++++---------------------- + 1 file changed, 75 insertions(+), 75 deletions(-) + +commit 228c83c9d2d1fdb6fa3af8a650640a47c8e21e36 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 14:35:51 2007 -0700 + + cairo-perf-diff: Separate command-line options within the args structure + + A function like cairo_perf_report_diff wants the options, but really + doesn't want/need to see the filenames for example, + + perf/cairo-perf-diff-files.c | 44 +++++++++++++++++++++++++------------------- + 1 file changed, 25 insertions(+), 19 deletions(-) + +commit 876786b3f7316b99a51ba8225e34581be13a883d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 13:54:50 2007 -0700 + + Move implementation of getline and strndup + + These kept getting in my way as I looked for structure declarations + at the top of the file. + + perf/cairo-perf-diff-files.c | 108 +++++++++++++++++++++---------------------- + 1 file changed, 53 insertions(+), 55 deletions(-) + +commit 90d532e08f25644c4e621b0b7e592f4531a39d88 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 13:52:03 2007 -0700 + + Replace old and new reports with reports array + + Another baby step toward allowing comparison of more than two reports. + + perf/cairo-perf-diff-files.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit c6c17633e40f549ede5761095a0652c08adeee08 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 13:31:37 2007 -0700 + + Replace old_filename and new_filename with a filenames array + + More preparation for comparing more than two perf reports. + + perf/cairo-perf-diff-files.c | 30 +++++++++++++----------------- + 1 file changed, 13 insertions(+), 17 deletions(-) + +commit 1849a7a8bededb281fbb07ec0939f8d1f4954771 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 12:55:04 2007 -0700 + + cairo-perf-diff-files: Add new --min-change option, (replacing third positional argument) + + An upcoming change will allow cairo-perf-diff-files to generate + a report based on more than two files. This prepares for that by + moving the minimum-change support from the 3rd positional argument + to a new --min-change option. + + perf/cairo-perf-diff-files.c | 39 +++++++++++++++++++++++---------------- + 1 file changed, 23 insertions(+), 16 deletions(-) + +commit ef5611df6c6bc8d9c6877af3a59c66fa6fc5c13a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 11:26:47 2007 -0700 + + cairo-perf-diff: Fix implementation of --help + + Previously only "--" would givethe usage, and not "--help" + as intended. The new approach has been tested with ash, bash, + and dash, (hopefully that's good enough). + + perf/cairo-perf-diff | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a8d4fed67a32c6040c27615e063466d654b55a3a +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 19 10:02:22 2007 -0700 + + cairo-perf-diff-files: Remove some overzealous option parsing. + + The code was complicated and confusing, and only existed to implement + undocumented and unneeded command-line options. + + perf/cairo-perf-diff-files.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit fe9dd719561048af1f2c3c8c43e46f7d97575053 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 18 17:01:36 2007 -0700 + + Correct misattribution of Mathias' work to Chris + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 29670d37665d184d78d568070cb409acf98ee797 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 23 10:24:03 2007 -0700 + + Add a content value to solid patterns + + This allows for the surface acquired from the pattern to have the + same content. In particular, in a case such as cairo_paint_with_alpha + we can now acquire an A8 mask surface instead of an ARGB32 mask + surface which can be rendered much more efficiently. This results + in a 4x speedup when using the OVER operator with the recently + added paint-with-alpha test: + + Speedups + ======== + image-rgb paint-with-alpha_image_rgb_over-256 2.25 -> 0.60: 4.45x speedup + ███▌ + + It does slowdown the same test when using the SOURCE operator, but + I don't think we care. Performing SOURCE with a mask is already a very + slow operation, (hitting compositeGeneral), so the slowdown here is + likely from having to convert from A8 back to ARGB32 before the + generalized compositing. So if someone cares about this slowdown, + (though SOURCE with cairo_paint_with_alpha doesn't seem extremely + useful), they will probably be motivated enough to contribute a + customized compositing function to replace compositeGeneral in which + case this slowdown should go away: + + image-rgba paint-with-alpha_image_rgb_source-256 3.84 -> 8.86%: 1.94x slowdown + █ + + src/cairo-clip.c | 3 ++- + src/cairo-glitz-surface.c | 5 ++++- + src/cairo-gstate.c | 3 ++- + src/cairo-pattern.c | 41 ++++++++++++++++++++++++++--------------- + src/cairo-surface-fallback.c | 12 ++++++++---- + src/cairo-surface.c | 2 +- + src/cairo-xcb-surface.c | 3 ++- + src/cairo-xlib-surface.c | 3 ++- + src/cairo.c | 2 +- + src/cairoint.h | 9 ++++++--- + 10 files changed, 54 insertions(+), 29 deletions(-) + +commit fea5336e2db201be69256ef1bafd418fee98a21e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 25 10:36:12 2007 -0700 + + Allow fbCompositeSrc_x888x8x8888mmx when destination has alpha + + Previously the check for this optimized function would only allow + the function to be called if the source and destination had + identical formats. But the function doesn't read the destination + alpha (if any) so can be used when it exists as well. + + (Thanks to Jeff Muizelaar for pointing out this problem.) + + pixman/src/fbpict.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 72b812be8c69108c46334841823a2e9103b69516 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 23 09:35:35 2007 -0700 + + perf: Add new paint-with-alpha test + + MacSlow noticed that cairo_paint_with_alpha is much slower than + it should be, (and jrmuizel has a nice plan for fixing the + performance bug). + + perf/Makefile.am | 1 + + perf/cairo-perf.c | 1 + + perf/cairo-perf.h | 1 + + perf/paint-with-alpha.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 48 insertions(+) + +commit 302f1146da5b179e5016e2d523e891437c1a256b +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 23 09:26:32 2007 -0700 + + Fix two bugs in documentation code sample of cairo_arc + + The sample code for drawing an ellipse had width and height + reversed in the call to cairo_scale, and also had both + incorrectly inverted. + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e37c9edac02ccd9fbcbc4622a2f421f4be0d597e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 24 17:33:37 2007 -0400 + + [ROADMAP] Add cairo_xlib_surface_get_xrender_format() + + ROADMAP | 5 +++++ + 1 file changed, 5 insertions(+) + +commit ac0ef0302e68ba17ec5a59c689579f1854c7386c +Merge: d3cf214 260dcb3 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Mon Apr 23 23:18:05 2007 +0200 + + Merge branch 'master' of git+ssh://pmw@git.freedesktop.org/git/cairo + +commit 260dcb316e14945e7600406954e4876e8827a777 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 23 13:54:37 2007 +0100 + + Add a _cairo_error() to png_simple_error_callback() + + With the introduction of the error callbacks for PNG, we have the + opportunity for the user to set a breakpoint (via _cairo_error) at the + point the error is first rasied. + + src/cairo-png.c | 1 + + 1 file changed, 1 insertion(+) + +commit 0fce7e85a1c853216866ddf6a40725e7ce57fe93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 23 13:00:40 2007 +0100 + + Do not print out libpng error messages to stderr. + + We wish to avoid writing to file descriptors (and streams) that are + outside cairo's control. In this case, the messages are superfluous as + the errors are propagated via the cairo_status_t returns. + + src/cairo-png.c | 31 +++++++++++++++++++++++++------ + 1 file changed, 25 insertions(+), 6 deletions(-) + +commit 59670dd5d3854af1f7cbdef984df7802c338330b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 23 05:19:56 2007 -0400 + + [ROADMAP] Add URL to David Turner's patchset + + ROADMAP | 1 + + 1 file changed, 1 insertion(+) + +commit ce91a176489f4cb8f40c5ec29f23881d1e013a9f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 22 16:13:22 2007 -0400 + + [cairo-mutex] Add a poor man's mutex implementation in case of CAIRO_NO_MUTEX + just for fun. + + src/cairo-mutex-private.h | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 97b50e99bfa785d77b4900d3070f22a22827db22 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 22 16:05:25 2007 -0400 + + [BeOS] Remove old-style mutex initialization cruft + + src/cairo-beos-surface.cpp | 34 ---------------------------------- + 1 file changed, 34 deletions(-) + +commit 0fd13a3db00e7e11915b5a7bbe81bf8f43f1941f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 22 16:04:49 2007 -0400 + + [BeOS] Add mutex implementation + + src/cairo-mutex-private.h | 17 ++++++----------- + 1 file changed, 6 insertions(+), 11 deletions(-) + +commit fc83784525d3f2bb3e09d931cc9c83261c0b73ae +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 22 15:56:18 2007 -0400 + + [cairo-mutex] Properly paranthesize macro arguments + + src/cairo-mutex-private.h | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 406fc63b68203e86c9236d06448e2ffa2c259669 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 22 07:11:47 2007 -0400 + + [util] Change make target from "tools" to "util" + to match targets like "test", "perf", and "doc", that match + their directory names. + + util/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5bc1f3365d0002f2864bc30638df85c392a495f5 +Author: Peter Weilbacher <pmw@avila.aip.de> +Date: Sun Apr 22 07:11:00 2007 -0400 + + [perf] Add OS/2 implementation for timer routines + + perf/Makefile.am | 4 +++ + perf/cairo-perf-os2.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 99 insertions(+) + +commit 3b46e105bd781d7a4081068a14668334a7c82986 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 08:21:01 2007 -0400 + + [util] Import my malloc wrapper that prints simple statistics + + To build, do: + + make malloc-stats.so + + inside util/, and to use, run: + + LD_PRELOAD=malloc-stats.so some-program + + For binaries managed by libtool, eg, cairo-perf, do: + + ../libtool --mode=execute /bin/true ./cairo-perf + LD_PRELOAD="../util/malloc-stats.so" .libs/lt-cairo-perf + + The code also includes Jeff Muizelaar's libbacktracesymbols that + is a much better implementation of backtrace_symbols() than what + is provided by glibc. That can be built by: + + make backtrace-symbols.so + + util/.gitignore | 17 +++ + util/Makefile.am | 22 +++ + util/backtrace-symbols.c | 361 +++++++++++++++++++++++++++++++++++++++++++++++ + util/malloc-stats.c | 301 +++++++++++++++++++++++++++++++++++++++ + 4 files changed, 701 insertions(+) + +commit d3cf2144dbd42737d5e2c45908fbca082dd54022 +Merge: 6c12961 abdcbf8 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Sat Apr 21 13:50:30 2007 +0200 + + Merge branch 'master' of git+ssh://pmw@git.freedesktop.org/git/cairo + +commit 6c129611408ddb5cf0a9a821b30bbb8148af08d9 +Author: Peter Weilbacher <mozilla@weilbacher.org> +Date: Sat Apr 21 13:49:04 2007 +0200 + + Use deprecated png symbol only when compiling against old version + + png_set_gray_1_2_4_to_8 is deprecated in libpng >= 1.2.9, the identical + substitute for it is png_set_expand_gray_1_2_4_to_8 + + src/cairo-png.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 515491334cc32d8be856f25b7d2e36e63cb72246 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 07:48:10 2007 -0400 + + Add util/ to distribution + We already reference an script in util/ in PORTING_GUIDE, but was + not shipping it! + + Makefile.am | 2 +- + configure.in | 1 + + util/Makefile.am | 4 ++++ + 3 files changed, 6 insertions(+), 1 deletion(-) + +commit abdcbf896af69677058490d1d08ba58672c429ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 07:23:30 2007 -0400 + + [boilerplate] Add missing headers. Oops! + I blame git for it... + + boilerplate/cairo-boilerplate-pdf.h | 33 +++++++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate-xlib.h | 33 +++++++++++++++++++++++++++++++++ + 2 files changed, 66 insertions(+) + +commit 781f2533a32d84ca43a1bdf646bb69b7adab7a77 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 07:21:38 2007 -0400 + + [.gitignore] Add cairo-*.*.* + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit febcd689e7a4b277bbebffd8ebdc0970a04f68eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 07:19:47 2007 -0400 + + Update .gitignore to ignore .perf + + .gitignore | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit de425ada871c71277a53687dcd8a93a607d4faab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:46:18 2007 -0400 + + [doc/public/Headers.mk] Update. + + doc/public/Headers.mk | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 519b722747d606170741ccc520d6ec7332b2481f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:45:51 2007 -0400 + + [RELEASING] Remove *-test.h from instructions + as they are all removed now. + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0108f9c69f2f5391ff6b1066ae6b58fe3f71255a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:44:53 2007 -0400 + + [check-def.sh] Do not allow _cairo_.*_test_ symbols anymore + as all are removed now. + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 79098c037043f45df0a18265417e96d6214d68e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:43:04 2007 -0400 + + [scaled-font] Get rid of _cairo_scaled_font_test_set_max_glyphs_cached_per_font + in favor of cairo_boilerplate_scaled_font_set_max_glyphs_cached. + + boilerplate/Makefile.am | 1 + + boilerplate/cairo-boilerplate-scaled-font.h | 34 ++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 11 +++++++ + src/Makefile.am | 1 - + src/cairo-scaled-font-private.h | 1 + + src/cairo-scaled-font-test.h | 49 ----------------------------- + src/cairo-scaled-font.c | 14 ++------- + test/glyph-cache-pressure.c | 6 ++-- + 8 files changed, 53 insertions(+), 64 deletions(-) + +commit 44563161de82a5ee7bbf8f100213ea1a3af6d5db +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:38:24 2007 -0400 + + Move a couple typedefs to cairo-types-private.h + + src/cairo-types-private.h | 2 ++ + src/cairoint.h | 2 -- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 737d20a5702a18a1480c3b45f876e886b82b065c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:35:07 2007 -0400 + + Move cairo_hash_entry_t to cairo-types-private.h + + src/cairo-hash-private.h | 38 -------------------------------------- + src/cairo-scaled-font-private.h | 2 ++ + src/cairo-types-private.h | 38 ++++++++++++++++++++++++++++++++++++++ + 3 files changed, 40 insertions(+), 38 deletions(-) + +commit 51ce92c3db093c8d26c8002ddbc105b11e7607bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:24:31 2007 -0400 + + [scaled-font] Move cairo_scaled_font_t to cairo-scaled-font-private.h + + src/Makefile.am | 1 + + src/cairo-scaled-font-private.h | 109 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-scaled-font.c | 1 + + src/cairoint.h | 66 +----------------------- + 4 files changed, 112 insertions(+), 65 deletions(-) + +commit 91f1056caf46d71c99eb044afbc943b92fb5550c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:18:30 2007 -0400 + + Move cairo_cache_t to cairo-types-private.h + + src/cairo-cache-private.h | 2 +- + src/cairo-cache.c | 11 ----------- + src/cairo-hash-private.h | 4 ++-- + src/cairo-types-private.h | 14 ++++++++++++++ + 4 files changed, 17 insertions(+), 14 deletions(-) + +commit d2bb5f30079badf1029fa71faab9d6781092a271 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:08:26 2007 -0400 + + [svg] Get rid of _cairo_svg_test_force_fallbacks + in favor of cairo_boilerplate_svg_surface_force_fallbacks. + + boilerplate/Makefile.am | 1 + + boilerplate/cairo-boilerplate-svg.c | 19 +++++++++++++ + boilerplate/cairo-boilerplate-svg.h | 33 +++++++++++++++++++++++ + src/Makefile.am | 4 +-- + src/cairo-svg-surface-private.h | 2 ++ + src/cairo-svg-surface.c | 20 +------------- + src/cairo-svg-test.h | 54 ------------------------------------- + test/fallback-resolution.c | 4 +-- + 8 files changed, 60 insertions(+), 77 deletions(-) + +commit ea1b7c2d8a55d694d575c0bb711e60f70a33ff77 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 03:04:03 2007 -0400 + + [paginated] Include cairo-surface-private.h + + src/cairo-paginated-surface-private.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7e0ae8bd43dfd8b052d021601912b46956b2921e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 02:57:55 2007 -0400 + + [svg] Move cairo_svg_surface_t to cairo-svg-surface-private.h + + boilerplate/cairo-boilerplate-ps.c | 6 +++- + src/Makefile.am | 2 +- + src/cairo-svg-surface-private.h | 71 ++++++++++++++++++++++++++++++++++++++ + src/cairo-svg-surface.c | 24 +------------ + 4 files changed, 78 insertions(+), 25 deletions(-) + +commit 3885fff3e6215023e801dd2c72fc39560a4e22fd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 03:33:58 2007 -0400 + + [ps] Get rid of _cairo_ps_test_force_fallbacks + + in favor of cairo_boilerplate_ps_surface_force_fallbacks. + + boilerplate/Makefile.am | 1 + + boilerplate/cairo-boilerplate-ps.c | 15 +++++++++++ + boilerplate/cairo-boilerplate-ps.h | 33 +++++++++++++++++++++++ + src/Makefile.am | 2 +- + src/cairo-ps-surface-private.h | 3 ++- + src/cairo-ps-surface.c | 24 ++--------------- + src/cairo-ps-test.h | 54 -------------------------------------- + test/fallback-resolution.c | 4 +-- + 8 files changed, 56 insertions(+), 80 deletions(-) + +commit 57dc972d6e5fe715a83cbcaad9c6cc3d38bf8129 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 03:02:48 2007 -0400 + + [ps] Move cairo_ps_surface_t to cairo-ps-surface-private.h + + src/Makefile.am | 2 +- + src/cairo-ps-surface-private.h | 79 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-ps-surface.c | 33 +----------------- + 3 files changed, 81 insertions(+), 33 deletions(-) + +commit 3e69fbca6233e9f568935dbb69bf14bc34812d77 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 03:00:21 2007 -0400 + + [pdf] Fix header file header! + + src/cairo-pdf-surface-private.h | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 29247e5010632f0453367b64a38c865076605681 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 02:57:12 2007 -0400 + + [ps/pdf/svg] Fix minor coding style issue + + src/cairo-pdf-surface.c | 12 ++++++------ + src/cairo-ps-surface.c | 2 +- + src/cairo-svg-surface.c | 14 +++++++------- + 3 files changed, 14 insertions(+), 14 deletions(-) + +commit 20ce190e71f838dea598cbd5267f047b75945cee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 02:50:53 2007 -0400 + + [pdf] Get rid of _cairo_pdf_test_force_fallbacks + in favor of cairo_boilerplate_pdf_surface_force_fallbacks. + + boilerplate/Makefile.am | 1 + + boilerplate/cairo-boilerplate-pdf.c | 19 +++++++++++++ + src/cairo-pdf-surface-private.h | 2 ++ + src/cairo-pdf-surface.c | 25 +++-------------- + src/cairo-pdf-test.h | 54 ------------------------------------- + test/fallback-resolution.c | 4 +-- + 6 files changed, 27 insertions(+), 78 deletions(-) + +commit 03477064fa639ab1c735467d1889bde7c99313c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 21 02:25:51 2007 -0400 + + [paginated] Move cairo_paginated_surface_t to cairo-paginated-surface-private.h + The old cairo-paginated-surface-private.h is cairo-paginated-private.h now. + + src/Makefile.am | 1 + + src/cairo-analysis-surface.c | 2 +- + src/cairo-paginated-private.h | 136 ++++++++++++++++++++++++++++++++++ + src/cairo-paginated-surface-private.h | 116 +++++++---------------------- + src/cairo-paginated-surface.c | 32 +------- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-types-private.h | 1 + + src/test-paginated-surface.c | 2 +- + 10 files changed, 170 insertions(+), 126 deletions(-) + +commit 21a7de61c26faaaa1ce96cddab6d777dbb37d0bb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 02:52:53 2007 -0400 + + [boilerplate] Add cairo-boilerplate-xlib.h to Makefile.am + + boilerplate/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 68e2158aaeacefcff8e6df11c25bb61ab0e89606 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 02:37:15 2007 -0400 + + [pdf] Move cairo_pdf_surface_t to cairo-pdf-surface-private.h + + src/Makefile.am | 3 +- + src/cairo-output-stream-private.h | 2 +- + src/cairo-pdf-surface-private.h | 83 +++++++++++++++++++++++++++++++++ + src/cairo-pdf-surface.c | 42 +---------------- + src/cairo-scaled-font-subsets-private.h | 2 - + src/cairo-types-private.h | 3 ++ + 6 files changed, 90 insertions(+), 45 deletions(-) + +commit 183c6af4f1730861a604a912a0609e315da65ecc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 02:30:46 2007 -0400 + + [paginated] Move cairo_paginated_mode_t to cairo-types-private.h + + as it is used in surface structs for PS/PDF/SVG and we will need + it. + + src/cairo-paginated-surface-private.h | 5 ----- + src/cairo-types-private.h | 5 +++++ + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit cd72167ede50b44aa3559ee63b95e12e4b51d80f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 02:27:19 2007 -0400 + + [xlib] Get rid of _cairo_xlib_test_disable_render + + in favor of cairo_boilerplate_xlib_surface_disable_render. + + boilerplate/cairo-boilerplate-xlib.c | 15 ++++++++++ + src/Makefile.am | 2 +- + src/cairo-xlib-surface.c | 23 +-------------- + src/cairo-xlib-test.h | 54 ------------------------------------ + test/xlib-surface.c | 8 ++++-- + 5 files changed, 22 insertions(+), 80 deletions(-) + +commit 908418cb4d43e387d06698a43626ac9a663d6c2a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 02:25:55 2007 -0400 + + [cairo-surface] Move cairo_surface_t struct in cairo-surface-private.h + + src/Makefile.am | 2 + + src/cairo-surface-private.h | 96 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-types-private.h | 65 +++++++++++++++++++++++++++ + src/cairo-xlib-private.h | 1 - + src/cairo-xlib-surface-private.h | 2 + + src/cairoint.h | 74 +------------------------------ + 6 files changed, 167 insertions(+), 73 deletions(-) + +commit 8ae02fa470eace1b449c09b6cd0f86cc09b81ec2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 01:54:35 2007 -0400 + + [boilerplate] Minor indentation fix + + boilerplate/cairo-boilerplate-xlib-private.h | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 1345552ac24099900acdb968f905d6e75cc20593 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 01:46:23 2007 -0400 + + [xlib] Move cairo_xlib_surface_t definition into cairo-xlib-surface-private.h + + src/Makefile.am | 3 +- + src/cairo-xlib-surface-private.h | 91 ++++++++++++++++++++++++++++++++++++++++ + src/cairo-xlib-surface.c | 54 +----------------------- + 3 files changed, 94 insertions(+), 54 deletions(-) + +commit 735be3f09d1d150909305ff3232fda42efcb87bd +Author: Peter Weilbacher <pmw@avila.aip.de> +Date: Fri Apr 20 20:46:55 2007 +0200 + + Fix build break related to mutexes on OS/2 + + cairo_mutex_t is HTMX which is ULONG on OS/2, so we have to set the + mutex itself to 0 and not the address... + + src/cairo-mutex-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5135bcf414abc91e7777e2c024c9b6e10bf6115c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 20 19:08:07 2007 +0100 + + cairo-boilerplate - use xmalloc and friends + + Prefer to abort gracefully if we run out of memory (or simply to protect + them from memfault). + + boilerplate/cairo-boilerplate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b6be361d0ef3b81ef5cbc28852f323a671e3d030 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 20 17:49:10 2007 +0100 + + Clean up compiler warnings from cairo-png + + I introduced some compiler warnings into read_png() with the superfluous + introduction of a couple of volatile qualifiers. I'm sure at the time, + the reason was that gcc suggested adding them - however, ATM gcc issues + no warnings without them. + + src/cairo-png.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit fc455c53ecb0aa496915b1eae68dc0275af78e09 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Apr 21 00:26:25 2007 +0930 + + Ensure _cairo_scaled_font_subsets_map_glyph() returns correct values + + The CID font subsetting exposed a bug where the subset_glyph->is_scaled + return argument of _cairo_scaled_font_subsets_map_glyph() is sometimes + not assigned a value. + + src/cairo-scaled-font-subsets.c | 55 ++++++++++++++++------------------------- + 1 file changed, 21 insertions(+), 34 deletions(-) + +commit 9d8eb42c013d197b3365af88e372d1c2c1617173 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 20 22:45:12 2007 +0930 + + Exclude Type1 fonts from CID subsets + + Make cairo-scaled-font-subsets.c limit Type1 font subsets to + 256 glyphs. This allows Type1 subsetting to be enabled again + with type1-fallback as the fallback option for Type1 fonts. + + src/cairo-pdf-surface.c | 42 ++++++++++++++++----------------- + src/cairo-scaled-font-subsets-private.h | 11 ++++++++- + src/cairo-scaled-font-subsets.c | 36 ++++++++++++++++++---------- + src/cairo-type1-subset.c | 27 +++++++++++++++++++++ + src/cairoint.h | 1 + + 5 files changed, 82 insertions(+), 35 deletions(-) + +commit 56ad56263b86a9678387fe8dd994e77c183c6328 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 20 22:44:04 2007 +0930 + + Enable embedding of CID fonts in PDF + + Update cairo-pdf-surface.c to embed CFF and TrueType fonts + as CID fonts. Update the ToUnicode CMap to handle CID fonts. + + src/cairo-pdf-surface.c | 285 ++++++++++++++++++++++++++++++------------------ + 1 file changed, 177 insertions(+), 108 deletions(-) + +commit ca3662d6fc630e5390b3a8f8dbaa1d65aebc3fe8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 20 22:43:37 2007 +0930 + + Make cairo-output-stream.c accept variable width printf fields + + src/cairo-output-stream.c | 27 +++++++++++++++++++++++---- + 1 file changed, 23 insertions(+), 4 deletions(-) + +commit 0c2a653033e0b631a1cb6591263cbd6125ccc00c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 20 22:30:55 2007 +0930 + + Add CFF CID Fallback + + Switching to CID font embedding requires a fallback font for + the case where CFF CID or TrueType CID subsetting fails. + + The new function _cairo_type2_charstrings_init() added to + cairo-type1-fallback.c creates Type2 charstrings from glyph + paths. _cairo_cff_fallback_init() in cairo-cff-subset.c + wraps these charstrings in a CFF CID font. + + src/cairo-cff-subset.c | 212 ++++++++++++++++++++++++++++++++ + src/cairo-scaled-font-subsets-private.h | 68 ++++++++++ + src/cairo-type1-fallback.c | 211 ++++++++++++++++++++++--------- + 3 files changed, 432 insertions(+), 59 deletions(-) + +commit c68a2389f51880b0fa9df6750abdd840258666fc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 20 22:30:05 2007 +0930 + + Make CFF Subsetting create CID subsets + + OpenType/CFF fonts come in two types: CID and non CID. + CFF CID font subsetting was previously disabled in cairo + due 1) to the need to embed CFF CID fonts in PDF as a CID fonts + and 2) there is no easy way to convert CFF CID to CFF non CID. + + With the switch to CID fonts cairo-cff-subset.c has been + updated to subset CID fonts and to covert non CID fonts to + CID. A further advantage of converting non CID CFF fonts + to CID is the reduction in size due to not embedding the + name of each glyph in the font subset. + + src/cairo-cff-subset.c | 858 +++++++++++++++++++++++++++++++----------------- + src/cairo-pdf-surface.c | 2 + + 2 files changed, 561 insertions(+), 299 deletions(-) + +commit 073fce5a85ab90b1bc6915e41d6a420a47e540e6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 20 22:29:41 2007 +0930 + + Add support for creating CID/composite font subsets + + cairo-scaled-font-subsets.c now provides three functions for creating subsets: + + _cairo_scaled_font_subsets_create_scaled() + Create a subset for each scaled font with maximum size INT_MAX. + + _cairo_scaled_font_subsets_create_simple() + Create subsets suitable for embedding as simple fonts in PS/PDF. + + _cairo_scaled_font_subsets_create_composite() + Create subsets suitable for embedding as composite fonts in PS/PDF. + + The _create_simple() and _create_composite() functions both merge + scaled fonts with the same face and an outline path available into + the same subset. _create_composite() has a maximum subset size of + 65536 for outline fonts. Bitmap fonts have a separate subset for + each scale with a maximum subset size of 256. + + The _create_simple() and _create_composite() functions both reserve + the first glyph in the subset for the .notdef glyph. CID fonts require + CID 0 to be .notdef. + + Update Type1, TrueType and CFF subsetting to expect glyph 0 of each + subset to be the .notdef. + + src/cairo-cff-subset.c | 9 +-- + src/cairo-pdf-surface.c | 5 +- + src/cairo-ps-surface.c | 13 ++-- + src/cairo-scaled-font-subsets-private.h | 61 +++++++++++---- + src/cairo-scaled-font-subsets.c | 127 +++++++++++++++++++++++--------- + src/cairo-svg-surface.c | 2 +- + src/cairo-truetype-subset.c | 21 ++---- + src/cairo-type1-fallback.c | 2 +- + src/cairo-type1-subset.c | 3 - + 9 files changed, 156 insertions(+), 87 deletions(-) + +commit bf957ee0f29ff49970b4791718eccdb92f3d6886 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 23 12:59:38 2007 +0000 + + cairo-png - handle short reads + + During MT cairo testing we get the error "libpng: Read Error" which is + emitted should the fread return fewer bytes than asked. However, this is + not necessarily an error, so double-check the ferror() status before + raising a png_error(). + + src/cairo-png.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +commit d00aa44206f474e11c66c585d09bfd55e747cc5b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 01:28:56 2007 -0400 + + [Makefile.am] Add a "make snapshot" target + that creates a tarball named with version, date, and git hash of + the tree. Like cairo-1.4.5-20070420-2a0389.tar.gz. + + Makefile.am | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 2a038956635e27f61fb2147527d2262eebf9bb26 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:55:03 2007 -0400 + + [pixman] Fix typo in Makefile.am + + pixman/src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit abcd929c57459f95e93504e0ef07b012b497a363 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:50:48 2007 -0400 + + [boilerplate] Add cairo_boilerplate_format_from_content + + boilerplate/cairo-boilerplate-quartz.c | 9 +-------- + boilerplate/cairo-boilerplate-test-surfaces.c | 13 +------------ + boilerplate/cairo-boilerplate-win32.c | 8 ++------ + boilerplate/cairo-boilerplate.c | 18 ++++++++++++++++++ + boilerplate/cairo-boilerplate.h | 3 +++ + 5 files changed, 25 insertions(+), 26 deletions(-) + +commit 97624dc488b41eb83d70b2c44a595daa5d833e7f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:45:42 2007 -0400 + + [boilerplate] Strip test-surfaces boilerplate into cairo-boilerplate-test-surfaces* + + boilerplate/Makefile.am | 5 + + .../cairo-boilerplate-test-surfaces-private.h | 63 ++++++++ + boilerplate/cairo-boilerplate-test-surfaces.c | 170 +++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 146 +----------------- + 4 files changed, 241 insertions(+), 143 deletions(-) + +commit 2e709321d858a048731eeaaca4a13a96de739e3f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:34:51 2007 -0400 + + [boilerplate] Move xasprintf to xmalloc.c + + boilerplate/cairo-boilerplate.c | 45 ------------------------------------- + boilerplate/cairo-boilerplate.h | 32 +++++++++++++------------- + boilerplate/xmalloc.c | 50 ++++++++++++++++++++++++++++++++++++++--- + boilerplate/xmalloc.h | 9 +++++++- + test/cairo-test.h | 2 +- + 5 files changed, 71 insertions(+), 67 deletions(-) + +commit 5331445c12756293a915420a26ab5553fc7db3fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:26:17 2007 -0400 + + [boilerplate] Cleanup includes in cairo-boilerplate-beos.cpp + + boilerplate/cairo-boilerplate-beos.cpp | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 56e916d40cf2a5f061347254657592f7bfc90d02 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:25:44 2007 -0400 + + [boilerplate] Fix typos in cairo-boilerplate-glitz.c + + boilerplate/cairo-boilerplate-glitz.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 06718b0da642d39b7b4dbfc009f08acb24e5e802 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:15:19 2007 -0400 + + [boilerplate] Remove leftover call to cairo_test_log + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 99737a60cb8cae1643b84782768e8c6d50ac7d0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:13:25 2007 -0400 + + [boilerplate] Clean up includes and remove unnecessary ones + + boilerplate/cairo-boilerplate-directfb.c | 9 +++++---- + boilerplate/cairo-boilerplate-pdf.c | 2 +- + boilerplate/cairo-boilerplate-svg.c | 2 +- + boilerplate/cairo-boilerplate-xcb.c | 2 +- + boilerplate/cairo-boilerplate.c | 30 +++++++++--------------------- + 5 files changed, 17 insertions(+), 28 deletions(-) + +commit 4b569f13d758015f33ad258a70ad4f472da771ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 20 00:08:44 2007 -0400 + + [boilerplate] Strip win32 boilerplate into cairo-boilerplate-win32* + + boilerplate/Makefile.am | 5 +++ + boilerplate/cairo-boilerplate-win32-private.h | 38 ++++++++++++++++++++ + boilerplate/cairo-boilerplate-win32.c | 51 +++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 31 +++------------- + 4 files changed, 99 insertions(+), 26 deletions(-) + +commit 0a03d66fffe7388d8fb4ffdb7bb5501a214c6342 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 23:58:51 2007 -0400 + + [boilerplate] Rename create_win32_surface to _cairo_boilerplate_win32_create_surface + + boilerplate/cairo-boilerplate.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 5ee882d3941a9df61d539e056933564a758a6bbc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 23:53:34 2007 -0400 + + [boilerplate] Remove empty cleanup_win32 + + boilerplate/cairo-boilerplate.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +commit a684fd80e750bea5661262e29a59c4f8c4d9cee3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 23:36:00 2007 -0400 + + [directfb] Silence compiler warning + + src/cairo-directfb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 23e6abc3fc01e3d722adfc48cd1df9c8db73adc1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 22:40:52 2007 -0400 + + [boilerplate] Strip glitz boilerplate into cairo-boilerplate-glitz* + + boilerplate/Makefile.am | 30 +- + boilerplate/cairo-boilerplate-glitz-private.h | 73 ++++ + boilerplate/cairo-boilerplate-glitz.c | 477 +++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 480 +------------------------- + 4 files changed, 582 insertions(+), 478 deletions(-) + +commit 7d576a376706aad427915b4872429f5605104886 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 22:25:28 2007 -0400 + + [boilerplate] Minor indentation fix + + boilerplate/cairo-boilerplate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 06b657ccf129f6f154c0db7886e5cca6191f93ca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 22:20:38 2007 -0400 + + [boilerplate] Strip xcb boilerplate into cairo-boilerplate-xcb* + + boilerplate/Makefile.am | 5 ++ + boilerplate/cairo-boilerplate-xcb-private.h | 44 +++++++++++ + boilerplate/cairo-boilerplate-xcb.c | 115 ++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 90 +--------------------- + 4 files changed, 167 insertions(+), 87 deletions(-) + +commit 65f636649d54348722354b2400c3a191309da0e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 22:13:08 2007 -0400 + + [boilerplate] Strip svg boilerplate into cairo-boilerplate-svg* + + boilerplate/Makefile.am | 5 ++ + boilerplate/cairo-boilerplate-svg-private.h | 44 ++++++++++ + boilerplate/cairo-boilerplate-svg.c | 129 ++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 106 +---------------------- + 4 files changed, 181 insertions(+), 103 deletions(-) + +commit 8c9960675b82978acbd5a85ef358c674c3407ee3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 22:10:09 2007 -0400 + + [boilerplate] Strip pdf boilerplate into cairo-boilerplate-pdf* + + boilerplate/Makefile.am | 5 ++ + boilerplate/cairo-boilerplate-pdf-private.h | 44 +++++++++ + boilerplate/cairo-boilerplate-pdf.c | 134 ++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 111 +---------------------- + 4 files changed, 186 insertions(+), 108 deletions(-) + +commit d9ce7de57514710f425bdee613edc4ea79ac0f0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 22:08:24 2007 -0400 + + [boilerplate] Rename xcairo_surface_set_user_data to cairo_boilerplate_surface_set_user_data + + and make it public. + + boilerplate/cairo-boilerplate.c | 48 ++++++++++++++++++++++------------------- + boilerplate/cairo-boilerplate.h | 6 ++++++ + 2 files changed, 32 insertions(+), 22 deletions(-) + +commit df6b8ecc8963518c897648d82aab1aa090b4721a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 21:46:51 2007 -0400 + + [boilerplate] Strip ps boilerplate into cairo-boilerplate-ps* + + boilerplate/Makefile.am | 5 ++ + boilerplate/cairo-boilerplate-ps-private.h | 44 +++++++++ + boilerplate/cairo-boilerplate-ps.c | 138 +++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 115 +----------------------- + 4 files changed, 190 insertions(+), 112 deletions(-) + +commit 6461f0d120bf5fabd08b7621233229b223b3de89 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 20:45:10 2007 -0400 + + [boilerplate] Remove unused variables + + boilerplate/cairo-boilerplate.c | 3 --- + 1 file changed, 3 deletions(-) + +commit f2d6275352142df631e00e27456d7e6ceb83804c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 20:41:34 2007 -0400 + + [boilerplate] Fix renaming typo + + boilerplate/cairo-boilerplate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d5535c993b5cde5df29a7a29339aa500992128bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 20:36:14 2007 -0400 + + [boilerplate/test] Move vector_ignored_tests from boilerplate/ to test/ + + boilerplate/cairo-boilerplate.c | 28 ------------------- + test/cairo-test.c | 62 ++++++++++++++++++++++++++++++----------- + 2 files changed, 45 insertions(+), 45 deletions(-) + +commit d6dc4f978364d287367d239e5594c7ffe50a2571 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 20:28:22 2007 -0400 + + [boilerplate] Add a boolean is_vector to boilerplate target type + + This is used to move the skip-these-tests-for-vector code into + cairo-test which it belongs. + + boilerplate/cairo-boilerplate.c | 18 ++++++++++++------ + boilerplate/cairo-boilerplate.h | 1 + + 2 files changed, 13 insertions(+), 6 deletions(-) + +commit 0b5e2dbaa84225452a0935f61d2348bce88a3e69 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 20:23:55 2007 -0400 + + [boilerplate] Sort backend entries in Makefile.am alphabetically + + boilerplate/Makefile.am | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit be0320c4f8082a9274899959dc82297a04aa7800 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 20:17:26 2007 -0400 + + [boilerplate] Properly namespace boilerplate methods + + in preparation for ripping them into per-backend files. + + boilerplate/cairo-boilerplate-beos.cpp | 24 +-- + boilerplate/cairo-boilerplate-directfb.c | 33 ++-- + boilerplate/cairo-boilerplate-quartz.c | 12 +- + boilerplate/cairo-boilerplate-xlib.c | 24 +-- + boilerplate/cairo-boilerplate.c | 328 ++++++++++++++++++------------- + 5 files changed, 236 insertions(+), 185 deletions(-) + +commit 9b660a3d54940c68eb48f2afeca7e87e1d2bffa6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 19:56:05 2007 -0400 + + [boilerplate] Strip xlib boilerplate into cairo-boilerplate-xlib* + + boilerplate/Makefile.am | 5 + + boilerplate/cairo-boilerplate-xlib-private.h | 44 ++++++ + boilerplate/cairo-boilerplate-xlib.c | 196 +++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 183 ++----------------------- + 4 files changed, 254 insertions(+), 174 deletions(-) + +commit d945f6434643ac35f0e86352cfe3ccf021f568de +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 19:44:57 2007 -0400 + + [boilerplate] Move includes around + + boilerplate/cairo-boilerplate.c | 23 ++++++++++------------- + 1 file changed, 10 insertions(+), 13 deletions(-) + +commit 0130cca6924f5c0969ca285585c68a458301a882 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 19:39:58 2007 -0400 + + [boilerplate] Rename test-directfb to boilerplate-directfb + + boilerplate/Makefile.am | 3 +- + boilerplate/cairo-boilerplate-directfb-private.h | 23 ++++ + boilerplate/cairo-boilerplate-directfb.c | 143 +++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 6 +- + boilerplate/cairo-test-directfb.c | 143 ----------------------- + boilerplate/cairo-test-directfb.h | 23 ---- + 6 files changed, 171 insertions(+), 170 deletions(-) + +commit fb2c0daa09af083278024c3da6f7e9e3f851984f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 19:38:20 2007 -0400 + + [boilerplate] Rename test-beos to boilerplate-beos + + boilerplate/Makefile.am | 3 +- + boilerplate/cairo-boilerplate-beos-private.h | 34 ++++ + boilerplate/cairo-boilerplate-beos.cpp | 258 +++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 8 +- + boilerplate/cairo-test-beos.cpp | 258 --------------------------- + boilerplate/cairo-test-beos.h | 34 ---- + 6 files changed, 298 insertions(+), 297 deletions(-) + +commit 01760286b388870e5bebf3851b4bef1350d89852 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 19:32:52 2007 -0400 + + [boilerplate] Rename quartz-boilerplate to boilerplate-quartz + + boilerplate/Makefile.am | 4 +- + boilerplate/cairo-boilerplate-quartz-private.h | 41 ++++++++++++++++++ + boilerplate/cairo-boilerplate-quartz.c | 60 ++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 10 ++--- + boilerplate/cairo-quartz-boilerplate-private.h | 41 ------------------ + boilerplate/cairo-quartz-boilerplate.c | 60 -------------------------- + 6 files changed, 108 insertions(+), 108 deletions(-) + +commit d64ef355217db7a555da0029187d19c80ec12609 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 23:12:09 2007 +0100 + + Include cairo-perf in make check + + Although cairo-perf is not written to perform explicit failure testing of + cairo, it does generate long sequences of cairo operations which often + trigger unexpected errors. By including it with make check, it becomes + even easier for the programmer to check that one has not broken cairo in + terms of expected behaviour or performance. + + Makefile.am | 3 ++- + perf/Makefile.am | 30 +++++++++++++++++++----------- + 2 files changed, 21 insertions(+), 12 deletions(-) + +commit 0ffb021e9b0cc2ec9afc3eaa360b4518327afa6c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:52:51 2007 -0400 + + [cairo-mutex] If no mutex implementation is found, should #error instead of #warning + + otherwise we will cause compile errors before the sanity check macros get + a chance to err. + + src/cairo-mutex-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 813cdd71503ca2d77da011c91368e55cf20ad657 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:49:35 2007 -0400 + + [configure.in] Support --disable-pthread + + Also allows for --enable-pthread=yes which will make configure abort + if pthread is not found (as opposed to silently disabling it). + + configure.in | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 6d01e89988ea89ae21f3461825583d89b6eef55e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 21:46:00 2007 +0100 + + Add callgrind output files to CLEANFILES and .gitignore. + + perf/.gitignore | 2 ++ + perf/Makefile.am | 1 + + 2 files changed, 3 insertions(+) + +commit 2c79f8b75bd5bb0bb3bf054fb2b3cae6de382a7c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 21:41:43 2007 +0100 + + Fix command line for running cairo-perf under valgrind. + + The CAIRO_PERF_ENVIRONMENT slipped into the middle of the command line + instead of at the start. + + perf/Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3631c11eb4ab49f2bb3b9ef0478e5516793f221f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:38:23 2007 -0400 + + [cairo-mutex] Switch to HAVE_WINDOWS_H to use Win32 mutexes + + src/cairo-mutex-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d2a824a191e6b0d10a1f495d970b0406e37e0a39 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:37:36 2007 -0400 + + [cairo-commit] Update attribution headers in cairo-mutex-private.h + + src/cairo-mutex-private.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 12dfd8bb4bf72483c835e169003fa00b114beb13 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:36:43 2007 -0400 + + [cairo-mutex] Warn if no mutex definition found and let sanity macros err + about undefined CAIRO_MUTEX macros. + + src/cairo-mutex-private.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 6aa823841d6c1d59d4d972f0236f0e6a43199970 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:36:10 2007 -0400 + + [cairo-mutex] Support non-reentrant compilation if CAIRO_NO_MUTEX defined + to 1. + + src/cairo-mutex-private.h | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit e5980f69ad2d59ee305fe9aae62070a74d2df58b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:31:47 2007 -0400 + + [cairo-commit] Just warn for BeOS and let the sanity check macros err + about undefined CAIRO_MUTEX macros. + + src/cairo-mutex-private.h | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 8ebb054ff9d2fe12faa7b1807aef24b2bf916e64 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:28:44 2007 -0400 + + [cairo-mutex] Prefer "#if CAIRO_SOMETHING" over "#if defined CAIRO_SOMETHING" + + src/cairo-mutex-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 97c197478023ceb5477a203d058eaec2cb18f987 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:26:21 2007 -0400 + + [cairo-mutex] Add default implementation for CAIRO_MUTEX_INIT + that uses CAIRO_MUTEX_NIL_INITIALIZER. This used to be the + implementation for pthread because pthread_mutex_init() is + broken. See d48bb4fbe876a93199ba48fcf5f32734fbe18ba9. + + src/cairo-mutex-private.h | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 6d2a2dd6d9190c62b209e47c083b7df72e7134fb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:24:16 2007 -0400 + + [cairo-mutex] Add default no-op implementation for CAIRO_MUTEX_FINI + + src/cairo-mutex-private.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 2067d6fa90dae80aa666fb7328d51e2f92bec5bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:23:14 2007 -0400 + + [cairo-mutex] Use CAIRO_MUTEX_NOOP when applicable + + src/cairo-mutex-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5dda76c90f8886b6017ca8bbdf81be2b97201962 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:22:02 2007 -0400 + + [cairo-mutex] Err if at least one of mutex macros are not defined + + src/cairo-mutex-private.h | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit f771b9157c26430949f4dd1412c7a7b35367f81a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:21:13 2007 -0400 + + [cairo-mutex] Define and use CAIRO_MUTEX_USE_GENERIC_INITIALIZATION + We use the generic initialization if CAIRO_MUTEX_INITIALIZE is not + defined. + + src/cairo-mutex-private.h | 9 +++++++++ + src/cairo-mutex.c | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 4fc52e2d49c1299f8f175e22472ebe08baa41fa4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:19:48 2007 -0400 + + [cairo-mutex] Define CAIRO_MUTEX_NOOP + + src/cairo-mutex-private.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit f9dd8fd0ef0ad95921723155b951cd113ccb2d0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 16:19:25 2007 -0400 + + [cairo-mutex] Inlucde cairo-features.h and config.h + Previously we were lucky enough to have them included before us + + src/cairo-mutex-private.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 4e754cf3df9855c1d442578e555b7fb17c3dd4a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 15:31:24 2007 -0400 + + [cairo-truetype-subset] Shut gcc warning up + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4141e752e2eb0f40f2eb298bad398e6390e00ef8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 15:04:11 2007 -0400 + + [cairo-freelist] Remove redundant struct declarations + + src/cairo-freelist-private.h | 2 -- + 1 file changed, 2 deletions(-) + +commit ea817c560c429f445e4c450b60d499dae27f6024 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 14:50:38 2007 -0400 + + [cairo-mutex] Remove unneeded #undef CAIRO_MUTEX_EXTERNAL + + src/cairo-mutex-private.h | 8 -------- + 1 file changed, 8 deletions(-) + +commit 0b281085b55aae70876c6ef022266b73461800ab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 14:45:41 2007 -0400 + + [cairo-mutex] Err on unintended inclusion of cairo-mutex-list-private.h + + src/cairo-mutex-list-private.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit 47be7280bfe751c9f635f1e17c158f04b2927ae3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 19 14:42:55 2007 -0400 + + [cairo-mutex] Remove multiple-inclusion guards from cairo-mutex-list-private.h + + This is a list header file. We should not prevent it from multiple + inclusions. + + src/cairo-mutex-list-private.h | 3 --- + src/cairo-mutex.c | 2 -- + 2 files changed, 5 deletions(-) + +commit 55ea0466e25de2c60171a9d6c96536bc2e7fb9e3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 20:24:27 2007 +0100 + + Embed simple clip XRectangles in cairo_xlib_surface_t + + Toolkits like GTK+ almost always set a simple rectangular clip mask before + any cairo operation, so avoid the allocation for this simple case by + embedding a small number of XRectangles into the surface structure. + + src/cairo-xlib-surface.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit 7906a993403e75aa34b32d2d9338ec179896d765 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Apr 19 14:54:30 2007 +0200 + + Define INT32 limits on MSVC as noticed by Hans-Jürgen Schäler + + src/cairo-wideint-private.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit cc8841645cd7aa06ae48cbad804b31b3c0c2146b +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Apr 19 13:47:45 2007 +0200 + + Properly use CAIRO_MUTEX_{INIT,FINI} and remove CAIRO_MUTEX_LIST_PRIVATE_H sentinal before explicitly including the mutex list. + + src/cairo-mutex.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 39a633a8f3618f3b1adb3eefdf36e2fc6d896054 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Apr 19 13:15:08 2007 +0200 + + Reintroduce DllMain as deterministic mutex initialization path + + src/cairo-win32-surface.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +commit 9b348929b51fb45f5985914350a10955d6df17ae +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Apr 19 13:13:42 2007 +0200 + + Introduce CAIRO_MUTEX_FINALIZE as counter-part for CAIRO_MUTEX_INITIALIZE + + src/cairo-mutex-private.h | 8 +++++++- + src/cairo-mutex.c | 12 ++++++++++++ + src/cairo-os2-surface.c | 6 +++--- + 3 files changed, 22 insertions(+), 4 deletions(-) + +commit 67767afa09e3622988b9ac67b754114ea9f84105 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Apr 19 12:35:10 2007 +0200 + + Update _cairo_mutex_initialized during initialization. + + src/cairo-mutex.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 41c6eebcd1fab94fd3a91d09f1ef6ee0d8c7a044 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 11:56:15 2007 +0100 + + Optionally provide a pattern to use for creating a similar solid surface. + + _cairo_surface_create_similar_solid() creates a fresh pattern to wrap + color, however sometimes the caller already has that pattern available. + In those circumstances we can pass the pattern as well as the color and + avoid the extra allocation. + + src/cairo-clip.c | 3 ++- + src/cairo-glitz-surface.c | 3 ++- + src/cairo-pattern.c | 3 ++- + src/cairo-surface.c | 24 +++++++++++++++--------- + src/cairoint.h | 6 +++++- + 5 files changed, 26 insertions(+), 13 deletions(-) + +commit ef60e7c65144edd1aa14757b269f2c196df732a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 18 18:08:45 2007 +0100 + + cairo-xlib-surface - track picture properties. + + By tracking picture properties we can dramatically reduce the amount of + X11 traffic by avoiding redundant changes. + + src/cairo-xlib-surface.c | 35 ++++++++++++++++++++++++----------- + 1 file changed, 24 insertions(+), 11 deletions(-) + +commit 9cf09556339e64bdf1273e95938b657112df07b6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 09:27:51 2007 +0100 + + Create opaque similar solid surfaces when possible. + + For opaque surfaces the backends may use simpler code paths - for + example, the xlib backend may be able to use the Core protocol rather + than Render. So we only generate a surface with an alpha component if + the color is not opaque. + + src/cairo-pattern.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit f7b6fc474651311356f116b7d8d7a5ef1cbab570 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 19 09:22:08 2007 +0100 + + Define a CAIRO_ALPHA_IS_OPAQUE variant that operates on uint16. + + Introducing this variant also fixed a bug in _gradient_is_opaque() + which was using the fractional test on a uint16. + + src/cairo-pattern.c | 6 +++--- + src/cairoint.h | 3 +++ + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 157074c794903f1dbe68c1ba5b129b4176dc7975 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 19:46:30 2007 -0400 + + [boilerplate] Add cairo_boilerplate_get/free_targets + This means, test and perf suites now share the same target handling + code, including parsing CAIRO_TEST_TARGET. + + boilerplate/cairo-boilerplate.c | 73 +++++++++++++++++++++++++++++++++++++++-- + boilerplate/cairo-boilerplate.h | 6 +++- + perf/cairo-perf.c | 20 +++++------ + test/cairo-test.c | 54 ++++-------------------------- + 4 files changed, 92 insertions(+), 61 deletions(-) + +commit 47c02a6bd67e8b7e50977cc87d5e35358d5c4c2e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 19:15:16 2007 -0400 + + [boilerplate] s/_cairo_test_content_name/cairo_boilerplate_content_name/g + + boilerplate/cairo-boilerplate.c | 8 ++++---- + boilerplate/cairo-boilerplate.h | 2 +- + test/cairo-test.c | 10 +++++----- + 3 files changed, 10 insertions(+), 10 deletions(-) + +commit b9026d0b137520247b4a93287bd518fc79774e93 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 19:09:53 2007 -0400 + + [perf] Make targets more consistent with the test suite + That is: + 1) no VALGRING vs VG abbreviations + 2) setting TARGETS and ITERS on the make command line works now + + perf/Makefile.am | 26 +++++++++++++++++--------- + perf/cairo-perf.c | 8 ++++++-- + 2 files changed, 23 insertions(+), 11 deletions(-) + +commit 9f3e0694e644d2279c7f4835f8035d4ecccb5711 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 19:08:54 2007 -0400 + + [test] Allow bypassing all test targets by setting CAIRO_TEST_TARGET=" " + + test/cairo-test.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 52d4e0f3191440e8ebe366b593c2e9c955328258 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 18:27:28 2007 -0400 + + [doc] Make section title capitalization more consistent + + doc/public/cairo-sections.txt | 2 +- + doc/public/language-bindings.xml | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit beadcdf9bd7c1dde48c8c751ba8af75c60b93a5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 18:24:09 2007 -0400 + + Rename cairo-font.c to cairo-font-face.c + + src/Makefile.am | 2 +- + src/Makefile.win32 | 2 +- + src/cairo-font-face.c | 514 ++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-font.c | 514 -------------------------------------------------- + src/cairoint.h | 2 +- + 5 files changed, 517 insertions(+), 517 deletions(-) + +commit f56582ef06bbf56edcc6ecc26698abaeba1306b0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 17:50:36 2007 -0400 + + Put back __inline definition for MSC compilers, in both cairo and pixman + Apparently it's too much to expect people compiling on windows to fill + in sensible values for config.h... /sigh + + pixman/src/pixmanint.h | 10 ++++++++-- + src/cairoint.h | 2 ++ + 2 files changed, 10 insertions(+), 2 deletions(-) + +commit a54b6ed0784dd00375424e581bc7349dd8a2a2d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 17:45:31 2007 -0400 + + [pixman] Rename icint.h to pixmanint.h + + pixman/src/Makefile.am | 4 +- + pixman/src/check-pixmanint.sh | 17 + + pixman/src/fbcompose.c | 4 +- + pixman/src/fbedge.c | 4 +- + pixman/src/fbmmx.c | 4 +- + pixman/src/fbpict.c | 4 +- + pixman/src/fbtrap.c | 4 +- + pixman/src/icblt.c | 4 +- + pixman/src/icbltone.c | 4 +- + pixman/src/iccolor.c | 6 +- + pixman/src/icformat.c | 6 +- + pixman/src/icimage.c | 4 +- + pixman/src/icpixels.c | 4 +- + pixman/src/icrect.c | 6 +- + pixman/src/icstipple.c | 4 +- + pixman/src/ictransform.c | 6 +- + pixman/src/ictrap.c | 5 +- + pixman/src/ictri.c | 5 +- + pixman/src/icutil.c | 4 +- + pixman/src/pixman-xserver-compat.h | 4 +- + pixman/src/pixman.h | 4 - + pixman/src/pixmanint.h | 1070 ++++++++++++++++++++++++++++++++++++ + pixman/src/pixregion.c | 4 +- + pixman/src/renderedge.c | 4 +- + 24 files changed, 1110 insertions(+), 75 deletions(-) + +commit 48121e97ac4f0114a0d5bc35aec76d2aba23a783 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 18 17:04:07 2007 -0400 + + [cairoint.h] Define WARN_UNUSED_RESULT if undefined + + src/cairoint.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit a396e0b05731db3acbf1e8d82ab77592b697e417 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 18 14:24:10 2007 +0100 + + cairo-perf - add the missing newline. + + Oops, missed out the newline for the fprintf in the previous commit. + + perf/cairo-perf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 383e9d5368706168498a87d1b7f023f2b59c2f92 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 18 14:12:20 2007 +0100 + + cairo-perf - Check that the surface is created. + + Exit(1) if we fail to create the target surface. + + perf/cairo-perf.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 7131f4e6aea11d94e38375a6be71887825008e48 +Author: Dave Yeo <daveryeo@telus.net> +Date: Tue Apr 17 15:30:20 2007 -0400 + + [OS2] Fix #include "cairo-mutex-list-private.h" + + src/cairo-os2-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f7a2787685d640dd35ef7ef1314c4e754771c512 +Merge: 2efaf3a cab4d41 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Mon Apr 16 23:05:10 2007 +0200 + + Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo + +commit cab4d41cae4463841bca297a7e16c970633c8c21 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 16 16:57:24 2007 +0100 + + create-for-stream - free resources after test failure. + + create-for-stream often fails whilst running under valgrind due to the + postscript output containing a CreationDate with seconds resolution, + hence the visibility of the resource leaks during failure. + + test/create-for-stream.c | 37 ++++++++++++++++++++----------------- + 1 file changed, 20 insertions(+), 17 deletions(-) + +commit 9d435d5fbfae0f64053f6596f73410bc352cd2de +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 16 15:42:07 2007 +0100 + + Add suppression for leak from XauFileName. + + The string is statically allocated by XauFileName() and so ignore the fact + that is not freed upon termination. + + test/.valgrind-suppressions | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 3a3fb0031decec26260cd94e60f1b0bf06541a6d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 16 15:08:54 2007 +0100 + + Update .gitignore + + Add .*.sw? (vim swapfiles). + Add *~ (backup files). + Add *.gcno and *.gcda (gcov intermediates). + + .gitignore | 1 + + boilerplate/.gitignore | 4 ++++ + perf/.gitignore | 4 ++++ + src/.gitignore | 1 + + test/.gitignore | 3 +++ + 5 files changed, 13 insertions(+) + +commit 7ff95c7230471be3ffa231ebc71e1d63ba4621b0 +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Mon Apr 16 02:48:14 2007 -0400 + + Support MinGW DLL compilation + + configure.in | 1 + + src/cairo-win32-surface.c | 4 ++++ + 2 files changed, 5 insertions(+) + +commit ca9df759b4eda8f19a92b2e0b1092fa7b618d25b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Apr 14 15:28:29 2007 +0100 + + Change of email address. + + Update to my new email address and drop my old work one. + + AUTHORS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 96ee8d5ebe6c6494a140c5424137f26de5fd5d85 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 17:47:25 2007 -0700 + + Update version to 1.4.5 after the 1.4.4 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ebba4a6d1467a8e5db5cc43eb08e8fc98c39b30a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 17:37:14 2007 -0700 + + Increment version to 1.4.4 (and library versioning to 13:2:11) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e21a58ce4c2f550198de9ed35f7a37df764e7cdf +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 17:36:31 2007 -0700 + + NEWS: Add notes for cairo 1.4.4 + + NEWS | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 91 insertions(+) + +commit e1a1f6ff251582b2293098a55953f81a13bb9cc0 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 16:37:52 2007 -0700 + + AUTHORS: Update descriptions for Mathias Hasselmann and Chris Wilson + + Both have contributed a tremendous amount of effort to cairo 1.4.4. + Well done! + + AUTHORS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ef3e13337e513cf470801cff5cd2b8fdcff1b6eb +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 13:34:20 2007 -0700 + + cairo-perf-diff: Use median not minimum to report differences + + Ideally, the minimum value would indicate the best possible performance, + but I've encountered situations where a bogus minimum value gets lodged + into the cached results for some reason, (and yet doesn't also get + discarded as an outlier). The downside of that situation is that running + more iterations never changes the result, so it's hard to fix the problem, + (resulting in cairo-perf-diff feeling just plain broken as more runs + change nothing). + + So let's try using the median time instead. + + perf/cairo-perf-diff-files.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 7ead3e64f17fe302398ec60c61eaeaae4e9b18cf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 13 16:34:31 2007 -0400 + + [ROADMAP] Put back bug 10508 into 1.4.4 roadmap and mark it fixed + + Yay! + + ROADMAP | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 84c10a79ffd233a953434bd787dcfe57787552f8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 13 16:33:07 2007 -0400 + + [cairo-pattern] Slightly hackish fix for bug #10508 + + The so-attributed-to-X-server bug was that cairo maps the drawing + region to the pattern space, rounds the box, and uploads only that + part of the source surface to the X server. Well, this only works for + NEAREST filter as any more sophisticated filter needs to sneak a peek + at the neighboring pixels around the edges too. + + The right fix involves taking into account the filter used, and the + pattern matrix, but for most cases, a single pixel should be enough. + Not sure about scaling down... + + Anyway, this is just a workaround to get 1.4.4 out of the door. I'll + commit a proper fix soon. + + src/cairo-pattern.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit fcf49a56130ede8c6aa9f84a8c59ecef54714b7b +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 12:02:11 2007 -0700 + + boilerplate: Cleanup conditional compilation ofcairo-quartz-boilerplate.c + + It's much nicer to use automake to conditionally compile a file, + instead of always compiling it and conditionally having the compiler + see an empty file. + + boilerplate/Makefile.am | 6 +++- + boilerplate/cairo-boilerplate-private.h | 45 -------------------------- + boilerplate/cairo-boilerplate.c | 5 ++- + boilerplate/cairo-quartz-boilerplate-private.h | 41 +++++++++++++++++++++++ + boilerplate/cairo-quartz-boilerplate.c | 6 +--- + 5 files changed, 51 insertions(+), 52 deletions(-) + +commit cea107c9800a4414f57a874dd52924efdff725ec +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 13 11:28:21 2007 -0700 + + Punt bug #10508 off of 1.4.4 + + It looks like this is an X server bug, and we don't have an + imminent fix. Meanwhile, the bug is avoidable by preferring + to use xlib surface sources for transformed rendering to xlib + instead of using image surface sources. + + ROADMAP | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 4e3be548615f8ce8a45f0e887f19eb39ba21f8a4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 21:34:49 2007 -0400 + + [cairo-pattern] Add a TODO item to code + + src/cairo-pattern.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit ec639449de9b630cdb4e7bca4ba8487b3a263184 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 12 18:16:52 2007 -0700 + + Fix typo in loop control for computation of std. deviation + + Thanks to Chris Wilson for pointing out this problem. + + perf/cairo-stats.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 537a795b3b5698d4aa02f2f14e479e9bfd27fe0d +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 12 17:01:41 2007 -0700 + + Remove ft-text-vertical-layout-type1 + + This test can fail if the wrong font is loaded, but that's no + different than many other text tests---so it doesn't really + deserve special XFAIL treatment because of that. + + test/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 04164c996cad242a25c2af596ffcd3b07ba19289 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 20:14:23 2007 -0400 + + [cairo-surface] Make sure cairo_surface_get_font_options() fully initializes + the font_options passed in. + + src/cairo-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7224e1a6e6eb474a3809d07f9540c959b3da10b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 17:54:32 2007 -0400 + + [image] Set hint-metrics on in default font options + + src/cairo-image-surface.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 57434e249aba93f3b478a3c701e260093711d13f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 17:45:33 2007 -0400 + + [xlib] Turn metrics-hinting on by default + + src/cairo-xlib-screen.c | 1 + + 1 file changed, 1 insertion(+) + +commit 8a4c108a4be6c4650cefe80e68d4c9974ccc27ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 22:19:03 2007 +0100 + + Add a reference count to cairo_xlib_screen_info_t + + Due to the interaction between multiple threads showing glyphs and + asynchronous CloseDisplays, it is possible for a font to maintain a + cairo_xlib_screen_info_t beyond the CloseDisplay. The simple solution + is to add a reference count in order to track the lifetime of the + cairo_xlib_screen_info_t correctly. + + src/cairo-xlib-private.h | 6 ++++ + src/cairo-xlib-screen.c | 77 +++++++++++++++++++++++++++++++++++++----------- + src/cairo-xlib-surface.c | 4 +++ + 3 files changed, 70 insertions(+), 17 deletions(-) + +commit 50ef5bcf7b5e6cc903f9247256fbd4439887ab5e +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 12 13:44:32 2007 -0700 + + Revert cairo_public_warn addition to cairo.h + + This new feature isn't appropriate for a minor cairo release, + (we're between 1.4.2 and 1.4.4 right now), but will make a + lot of sense during 1.5. + + The code being reverted here was originally added with the + following commit: + + 46eab95698e101e41407778eda22089b508a8984 + + but this change reverts only the public-facing parts of it. + + configure.in | 11 ----------- + src/cairo.h | 40 ++++++++++++++++++++-------------------- + 2 files changed, 20 insertions(+), 31 deletions(-) + +commit 35bb2152c06ef2621b14a8b2153cc327be8b43a1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 21:30:39 2007 +0100 + + Hold the scaled_font->mutex whilst operating on the shared members. + + Obey the locking rules whilst resetting the scaled_font after a + CloseDisplay. + + src/cairo-xlib-surface.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 97d897a7475f540ad901cb2a2cd6885e885ee02a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 21:17:42 2007 +0100 + + cairo_xlib_close_display - drop the mutex whilst calling the hooks + + In order to avoid recursive dead-locks where whilst one thread holds the + scaled font lock and is waiting on the XLockDisplay() another thread catches + the CloseDisplay and then tries to acquire the scaled font lock, we drop + the list mutex whilst processing the callbacks. + + src/cairo-xlib-screen.c | 33 ++++++++++++++++++++++++--------- + 1 file changed, 24 insertions(+), 9 deletions(-) + +commit 13b0aa669fd9ce6abc930730a941782e2baba215 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 12 13:29:56 2007 -0700 + + Rebuild doc/public/Headers.mk + + Add a sort so that future update changes will be more legible. + + doc/public/Headers.mk | 47 ++++++++++++++++++++++++----------------------- + doc/public/Makefile.am | 3 ++- + 2 files changed, 26 insertions(+), 24 deletions(-) + +commit ae80d375f829b076a8d1450c54b00b3750428366 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 12 13:02:26 2007 -0700 + + Rename cairo-mutex-list.h to cairo-mutex-list-private.h + + Also add it (and cairo-mutex-private.h) to Makefile.am + where they should have been. + + src/Makefile.am | 2 ++ + src/cairo-mutex-list-private.h | 50 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-mutex-list.h | 50 ------------------------------------------ + src/cairo-mutex-private.h | 2 +- + src/cairo-mutex.c | 2 +- + 5 files changed, 54 insertions(+), 52 deletions(-) + +commit 29adf591b7026092a809e9a27878b5b4e35051fb +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 12 12:47:27 2007 -0700 + + move show-glyphs-many to the DISABLED_TESTS list + + And add a detailed comment explaining the reasons for disabling each + test in the list. + + test/Makefile.am | 62 +++++++++++++++++++++++++++++++++++++++----------------- + 1 file changed, 43 insertions(+), 19 deletions(-) + +commit c5b2f9d5c22c2259a11f0cbfbca8128cd3ac5794 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 01:22:49 2007 +0100 + + cairo_xlib_screen_info_t - always perform an exact match + + This ensures that only one cairo_xlib_screen_info_t holds the + close_display_hooks, an assumption used later. + + src/cairo-xlib-screen.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8c9f0f607b992c47b555b5eaff3c599a8c1eac57 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 01:21:03 2007 +0100 + + cairo-xlib-screen - avoid dereferencing a NULL screen. + + Do not initialize font options when setting up the + cairo_xlib_screen_info_t corresponding to the display itself and not + associated with any screen. This avoids a potential NULL dereferences. + + (Fixes https://bugs.freedesktop.org/show_bug.cgi?id=10517) + + src/cairo-xlib-screen.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit dc1de86680b59def00ce1e9f11997cf554cdfec1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 15:06:37 2007 -0400 + + [ROADMAP] Add cairo_object_t + + ROADMAP | 2 ++ + 1 file changed, 2 insertions(+) + +commit 12b962d648d307d7a6b94035b6c4ffdeaadd68e2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 14:56:36 2007 -0400 + + [ROADMAP] Mark bug #5777 as fixed + + ROADMAP | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e391d3eaee65d65f267f86d1ef1e1fd8898e6556 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 14:42:41 2007 -0400 + + [test] Disable text-glyph-range that was crashing + + Disabled tests are defined in DISABLED_TESTS. This has the benefit + that they will still be buildable and be shipped. Just not run by + default. + + test/Makefile.am | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit d3c7942fb271fe8d1df7ca3205b41601abdcb5c8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 12 14:22:02 2007 -0400 + + [pixman] Mark some small functions that are called per-pixel inline + + These uses were introduced in the previous commit. + + pixman/src/fbcompose.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e3b3d22999a130f7017e8e20a432a0d8a7f48f3b +Author: David Reveman <davidr@novell.com> +Date: Thu Apr 12 14:14:12 2007 -0400 + + [pixman] Fix fbcompose.c that was broken for some composite operations (#5777) + + pixman/src/fbcompose.c | 244 ++++++++++++++++++++++++++++++------------------- + 1 file changed, 151 insertions(+), 93 deletions(-) + +commit c8d2d1e8764c7ba754e46a3af68af2b4460d2e04 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Apr 12 10:51:17 2007 -0700 + + add licenses to test files + + test/composite-integer-translate-over-repeat.c | 26 ++++++++++++++++++++++++++ + test/composite-integer-translate-source.c | 26 ++++++++++++++++++++++++++ + 2 files changed, 52 insertions(+) + +commit e240048a14333d5c61a0d4ae5c30acd12bcb5805 +Merge: 29a1fe1 977a898 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Wed Apr 11 21:43:15 2007 -0700 + + Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo + +commit 29a1fe12cf33a68713a4ddf7f59217fd40f6e967 +Author: Michael Emmel <memmel@debian.localdomain> +Date: Wed Apr 11 21:42:57 2007 -0700 + + Fixed compile error from missing directfb.h include + + src/cairo-directfb.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 977a8982ab17760af0d69cb2e018ed50f4c7b992 +Author: Kristian Høgsberg <krh@redhat.com> +Date: Wed Apr 11 23:49:01 2007 -0400 + + Add missing copyright notice. + + test/pixman-rotate.c | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +commit 9193b29645ef1625a599471e3b0cb5279d2c05cb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 11 23:30:31 2007 -0400 + + [ROADMAP] Mark done items + + ROADMAP | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 284edb86484de8ccf3adf35d5cb9ff6ba64759ec +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 03:01:31 2007 +0100 + + Do not raise an error if we fail to locate 'find' or 'xargs' + + Whilst not being able to delete all of the test output is messy it is + however not fatal, so do not abort configuration simply because we + cannot find either program. + + configure.in | 6 ++---- + test/Makefile.am | 15 +++++++++------ + 2 files changed, 11 insertions(+), 10 deletions(-) + +commit a8974223dc6376a11588c6ecf1e54da5329b9c72 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 02:29:33 2007 +0100 + + Check for find and xargs during configure + + Replace hard-coded find, xargs and rm with the paths determined during + configure. This also gives us an opportunity to detect missing programs + and inform the developer. + + configure.in | 9 +++++++++ + test/Makefile.am | 12 ++++++------ + 2 files changed, 15 insertions(+), 6 deletions(-) + +commit 632ec8088cef5e9d4c2ff2886cfd550d706433e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 11 20:18:11 2007 -0400 + + [test] Add copyright headers for my tests + + test/extend-pad.c | 26 ++++++++++++++++++++++++++ + test/surface-pattern-scale-down.c | 26 ++++++++++++++++++++++++++ + test/surface-pattern-scale-up.c | 26 ++++++++++++++++++++++++++ + test/surface-pattern.c | 26 ++++++++++++++++++++++++++ + 4 files changed, 104 insertions(+) + +commit 82397a631410af343f14cafdb31f48de9373f4a7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 12 00:55:04 2007 +0100 + + Avoid using GNU find extensions. + + Replace the complex single find with a series of simple but POSIX correct + equivalents. + + test/Makefile.am | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit 06382092e5e911ad2648f26e8ba5a6f8f7953e1b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 11 19:42:34 2007 -0400 + + [pdiff] Ship gpl.txt + + test/pdiff/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit c8645c85de94b83fe2fd60a4d881cb639eb79b46 +Merge: be98123 52435e9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 16:38:46 2007 -0700 + + Merge branch 'master' of git.cairographics.org:/git/cairo into cairo + +commit 52435e99f31f06c18273a5a7351a2c21f7c0ecf6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 23:34:24 2007 +0100 + + Move pixman_format_t from heap to stack allocations. + + pixman_format_t is a simple structure used in short-term allocations and + suitable for on-stack allocation. + + Killing the pixman_format_create()/pixman_format_destroy() pairs avoid + around 6% of the allocations during cairo-perf (e.g. 426,158 allocs out + of a total of 7,063,469). + + pixman/src/icformat.c | 118 ++++++++++++++------------- + pixman/src/icint.h | 12 +-- + pixman/src/icrect.c | 2 +- + pixman/src/ictrap.c | 36 +++------ + pixman/src/ictri.c | 199 +++++++++++++++------------------------------- + pixman/src/pixman.h | 27 ++++--- + src/cairo-image-surface.c | 103 ++++++++++-------------- + 7 files changed, 202 insertions(+), 295 deletions(-) + +commit be98123b2c30a3102629afff74b9233c18e0535d +Merge: efedf57 a6506c6 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 16:02:08 2007 -0700 + + Merge cached-scaled-font-in-error into cairo + + Conflicts: + + src/cairo-scaled-font.c + +commit a6506c67f24331c703dd56502a1bc4504b7b2311 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 23:27:52 2007 +0100 + + Don't return scaled fonts in the error state from the cache. + + It is possible for a scaled_font to be flagged as in error, though only + through a "true error" e.g. a malloc failure. However, when returning a font + from the cache it should not be in error. So if we find a error font in the + cache we remove it and return a new font. + + src/cairo-scaled-font.c | 55 ++++++++++++++++++++++++++++--------------------- + 1 file changed, 32 insertions(+), 23 deletions(-) + +commit efedf57f43540ad79eddcc5ee79dc0d86846891e +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 15:25:18 2007 -0700 + + cairo-truetype-subset.c: Add missing error checks and propagation + + These are all to satisfy new warnings caused by the preceding commit, + (which added cairo_warn to various function tables). While fixing the + propoagation, fix functions to declare a return type of cairo_status_t + instead of int. + + src/cairo-truetype-subset.c | 178 +++++++++++++++++++++++++++++--------------- + 1 file changed, 120 insertions(+), 58 deletions(-) + +commit e6ca34e718859b40dc8eb75a6c68b056751a6deb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 22:59:10 2007 +0100 + + Mark function tables with attribute(warn_unused_result) + + src/cairo-paginated-surface-private.h | 2 +- + src/cairoint.h | 52 +++++++++++++++++------------------ + 2 files changed, 27 insertions(+), 27 deletions(-) + +commit 3bc413343a0b846c9501ee870db0424412aea701 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 01:08:17 2007 +0100 + + Define cairo_public_warn in terms of cairo_public. + + By defining cairo_public_warn as an extension of cairo_public, the + programmer need only to override cairo_public in order to export the + complete API for different architectures i.e. existing configurations + will continue to work with no alterations. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 54134dd901d6dc94aa56d45486223e7d4f6ba569 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 10 23:09:13 2007 +0100 + + Only enable warn-unused-result for recent gcc + + The attribute was introduced with gcc-3.4, but the ability to suppress + warnings from misapplied attributes (-Wno-attributes) was only introduced + later. Without the supression, gcc will emit tens of warnings for each + compilation completely drowning the real errors that the programmer + must see. + + configure.in | 19 +++++++++++++++++-- + pixman/src/pixman.h | 10 +++++++--- + src/cairoint.h | 13 ++++++------- + 3 files changed, 30 insertions(+), 12 deletions(-) + +commit f53c2b418cb4a36fbc1c30cdb1bf0ba9dba77bd0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 9 16:24:11 2007 +0100 + + _pixman_create_source_image() - check for malloc failure + + Fix an unchecked malloc by propagating the NULL pointer up to its callers, + which were already checking for failures. + + pixman/src/icimage.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit d0745c08b782d79fc7ccfd59cab0ae841a56c428 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Apr 12 06:32:29 2007 +0930 + + PDF: Fix glyph positioning bug when glyphs are not horizontal + + Bug reported in + http://lists.freedesktop.org/archives/cairo/2007-April/010337.html + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e36794ad34282a4d671d7cc5527e9c650c2736fe +Merge: b692472 b745126 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 13:15:57 2007 -0700 + + Merge branch 'warn-unused-result' into cairo + +commit b745126a04c126acc695e8abb6372c1890b03f07 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 12:26:21 2007 +0100 + + Use find | xargs to overcome shell command line limit. + + Once again we have hit the command line limit with the sheer volume of + generated test output. So replace the glob with a find which has the + additional advantage of only needing to walk the tree once to generate + the file lists - this begins to be noticeable with such large directories. + + test/Makefile.am | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 61b8e346135f8b61b22257541c97b9f262c17826 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 11:59:27 2007 +0100 + + Unexport fbSolidFillmmx and fbCopyAreammx. + + By unexporting these function we have exact control over their call sites + and so can convert the initial guards into asserts which transforms the + two functions to return unconditional success and hence conversion to + void. + + pixman/src/fbmmx.c | 215 ++++++++++++++++++++++------------------------ + pixman/src/fbmmx.h | 19 ---- + pixman/src/pixman-remap.h | 1 - + 3 files changed, 101 insertions(+), 134 deletions(-) + +commit efee2087387ba49e36d8d6104c4e2dd3ffeba081 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 11:26:27 2007 +0100 + + Propagate errors up through pixman_composite_trapezoids() + + Change the return type to indicate errors detected during + pixman_composite_trapezoids() and add checking for failures during + region ops. + + pixman/src/ictrap.c | 37 +++++++++++++++++++++---------------- + pixman/src/pixman.h | 2 +- + 2 files changed, 22 insertions(+), 17 deletions(-) + +commit bec097b5e281fcf2453de53946e89c13b37ecd1a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 11:13:30 2007 +0100 + + Propagate region errors from pixman_color_rects(). + + Region operations within pixman_color_rects can fail, so cleanup and + propagate. + + pixman/src/icrect.c | 74 +++++++++++++++++++++++++++++++++++------------ + pixman/src/pixman.h | 4 +-- + src/cairo-image-surface.c | 6 ++-- + 3 files changed, 61 insertions(+), 23 deletions(-) + +commit 909334ee00701e18b2f2033b1c3a27714ce988fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 10:45:55 2007 +0100 + + FbClipImage* should check for errors during region operations. + + Propagate the error from pixman_region_intersect(). + + pixman/src/icimage.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 5b67efcbd8acad60080129e0a8a307671b18b4fc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 10:38:09 2007 +0100 + + Propagate region failures during pixman_image_set_clip_region(). + + Operating on regions can fail so check the status and return an error, + after any necessary cleanup. + + pixman/src/icimage.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit e1abc3c26dd797ba9a888362713c5e5c1257867b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 11 09:51:58 2007 +0100 + + Provide a private entry point for cairo_scaled_font_status(). + + Add slim_hidden* markup for cairo_scaled_font_status() as we now use + it internally. + + src/cairo-scaled-font.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit 054c28a09de2c8ec2dc7111d786bca41a94f5a83 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 02:26:08 2007 -0700 + + boilerplate: Add error checking for cairo_surface_write_to_png + + boilerplate/cairo-boilerplate.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 0a54ca2d2340c55896ee6951efe6917322813431 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 02:22:22 2007 -0700 + + boilerplate: Add error checking for cairo_surface_set_user_data + + boilerplate/cairo-boilerplate.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +commit 5661de9e1c93bd548b400de2619b6de6133d6483 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 02:08:36 2007 -0700 + + SVG: Add missing error checking for calls to _cairo_output_stream_destroy + + src/cairo-svg-surface.c | 28 +++++++++++++++++++++------- + 1 file changed, 21 insertions(+), 7 deletions(-) + +commit 8d5aa0fb8d3ac6302dd5e832425f3285ad84280a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 02:03:10 2007 -0700 + + SVG: Add missing error checks and propagation + + The function calls that get the new treatment here are: + + _cairo_meta_surface_replay + _cairo_surface_show_page + _cairo_array_append + + all within _cairo_svg_surface_emit_meta_surface + + src/cairo-svg-surface.c | 39 +++++++++++++++++++++++++++++---------- + 1 file changed, 29 insertions(+), 10 deletions(-) + +commit 9c810625e796704e32e76caae18d2129219f46db +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 01:55:59 2007 -0700 + + PDF: Added error checking and propagation for _cairo_array_append + + src/cairo-pdf-surface.c | 89 +++++++++++++++++++++++++++++++------------------ + 1 file changed, 56 insertions(+), 33 deletions(-) + +commit 5ae82deb6942fae1515740551c71e9eb24750a7c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 01:47:21 2007 -0700 + + PS: Add missing check for return value of _cairo_meta_surface_replay + + Here we have to change the return type of a couple of functions in + order to propagate the error condition. + + src/cairo-ps-surface.c | 25 ++++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +commit 8c31cca2af11c544a6028bf42c2187625b978f56 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 01:42:02 2007 -0700 + + PS: Add missing checks for return value of _cairo_pattern_get_extents + + Propagation is extremely straightforward in this case. + + src/cairo-ps-surface.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 01ac5f1aea298434b617d935512e2e72033989fd +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 11 01:35:11 2007 -0700 + + Assert that cairo_matrix_invert succeeds rather than ignoring tis return value + + This assertion is safe as an internal consistency check thanks to + the recent checks added to cairo_pattern_set_matrix. + + src/cairo-pdf-surface.c | 4 +++- + src/cairo-ps-surface.c | 5 ++++- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit bd0b328f7e07b3a292190aef6f82622800230f6f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 22:55:00 2007 -0700 + + test/invalid-matrix: Add new test to exercise CAIRO_STATUS_INVALID_MATRIX paths + + This new test exercises every path where the user might possibly + pass in an invalid matrix. Currently the test fails if no error + is reported. Also, if an incorrect error is reported, (such as + CAIRO_STATUS_NO_MEMORY instead of CAIRO_STATUS_INVALID_MATRIX), + this is logged as a warning in invalid-matrix.log, but the test + still passes. + + It would still be worthwhile to follow up quickly and fix those + cases to propagate the correct error value. + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/invalid-matrix.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 144 insertions(+) + +commit a6186604f794f2746089abc9c1716384c23aafc4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 22:52:37 2007 -0700 + + cairo_pattern_set_matrix: Validate that matrix is invertible + + If not, set an error in the pattern. + + src/cairo-pattern.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 8e72852f0b9f2cd8558eb6c11acb326e73fceb12 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 22:51:44 2007 -0700 + + _cairo_gstate_ensure_scaled_font: Add missing propagation for error hiding inside the scaled_font + + src/cairo-gstate.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2f1221e0f225f305c3f9c8e7311fe8f3fecab34b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 22:50:46 2007 -0700 + + _cairo_gstate_ensure_scaled_font: Prefer to treat a pointer as a pointer, not a Boolean value + + src/cairo-gstate.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit dca69f73e3a11d397a701f82331d5aaa7194bd7f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 17:16:39 2007 -0700 + + Check (and assert) return values of cairo_matrix_invert + + Now that we have matrix validation at the time of _cairo_scaled_font_init + we know that it is safe to invert this matrix. + + src/cairo-pdf-surface.c | 5 ++++- + src/cairo-ps-surface.c | 5 ++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 4ce2b62bcea49eccc0a4ee3781a115e4a34d3ad4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 17:12:51 2007 -0700 + + _cairo_scaled_font_init: Detect an invalid matrix and return an error. + + Also fix all callers to notice and propagate the error, (though + some paths will still lose the CAIRO_STATUS_INVALID_MATRIX value + due to a return value of NULL at one point). + + src/cairo-atsui-font.c | 9 +++++++-- + src/cairo-scaled-font.c | 24 +++++++++++++++++------- + src/cairo-win32-font.c | 10 ++++++---- + 3 files changed, 30 insertions(+), 13 deletions(-) + +commit fd8c1e4dc851dd4ce8f84a3e47abdc4906c83b0f +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 16:43:50 2007 -0700 + + Fix cairo_scaled_font_create to return a nil scaled font, not NULL + + src/cairo-scaled-font.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 0f0ed88ee26f22c1b0e0ec7c95b8a258d137dde4 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 23:01:55 2007 -0700 + + paginated: Add missing error check for _cairo_surface_show_page + + Fixing this uncovered a leak of a CAIRO_INT_STATUS_UNSUPPORTED value + up to cairo_show_page, (and similarly to cairo_copy_page). There was + really no good reason for _cairo_surface_show_page and + _cairo_surface_copy_page to be returning cairo_int_status_t. Fix + this by simply handling the UNSUPPORTED return at the surface layer + instead of the gstate layer. + + src/cairo-gstate.c | 20 ++------------------ + src/cairo-paginated-surface.c | 4 +++- + src/cairo-surface.c | 16 ++++++---------- + src/cairoint.h | 4 ++-- + 4 files changed, 13 insertions(+), 31 deletions(-) + +commit 381f0bcafc86cefa665368cbbe2026adda1d98c9 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 16:33:34 2007 -0700 + + paginated: Add missing error check for _cairo_surface_get_extents + + src/cairo-paginated-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 41911002d754f187618ab310ab93c85c4b038943 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 16:32:09 2007 -0700 + + test-meta-surface.c: Fix memory leak on error recovery path. + + src/test-meta-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit d954e4c1488c6478852dcc02641e66df1d4e9317 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 16:31:21 2007 -0700 + + Fix indentation of CLEANUP_IMAGE label. + + src/cairo-paginated-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c011c37ba086f0c8d0dac6437318822927543955 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 16:30:43 2007 -0700 + + paginated: Fix missing errors checks for _cairo_meta_surface_replay + + src/cairo-paginated-surface.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit e73a55ad3cc30b0ea69379b12283515523015751 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 14:17:42 2007 -0700 + + cairo-truetype-subset: Fix missing error propagation + + src/cairo-truetype-subset.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 97b8fd8117160cfea9864c81cbb8a06b321618f1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 14:16:01 2007 -0700 + + cairo-truetype-subset: Check resturn value from _cairo_array_append and propagate + + src/cairo-truetype-subset.c | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +commit 84639e563ddfbd70ca48dcde4d3631418fd1cd82 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 14:11:43 2007 -0700 + + test-meta-surface: Add missing check for error from _cairo_surface_get_extents + + src/test-meta-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 866b2296b4a8b347011f1c8ae2e0f3a987a29d0c +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 14:09:56 2007 -0700 + + test-meta-surface: Add missing checks for errors from _cairo_meta_surface_replay + + src/test-meta-surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit ec1fc931257ff90fe190c52ed0a3bed9f218c350 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:59:42 2007 -0700 + + Add missing error check of return value of _cairo_path_fixed_close_path + + src/cairo-ft-font.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 3d21037a8fb69bde0765871f53fe461ac397367e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:57:41 2007 -0700 + + Add assertion check to quiet warn_unused_result warning. + + This is a somewhat useful internal consistency check. + + src/cairo-xlib-surface.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 2f468677160080e9dd1db52a2ad7ca4adbf48149 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:53:58 2007 -0700 + + Rename _cairo_pdf_surface_emit_toUnicode_stream to eliminate StudlyCaps + + Obviously, the new name is _cairo_pdf_surface_emit_to_unicode_stream which + is consistent with the to_unicode_stream identifiers already existing in + the implementation. + + src/cairo-pdf-surface.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit cc6c115e3c5b931be4ab0210ce7f8cecaccf6241 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:51:46 2007 -0700 + + PDF: Check return value of _cairo_output_stream_destroy and propagate + + src/cairo-pdf-surface.c | 56 ++++++++++++++++++++++++++++++------------------- + 1 file changed, 35 insertions(+), 21 deletions(-) + +commit 8873928f09a78d3e6e8e57d5d4e0b94cf1f78ab7 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:40:04 2007 -0700 + + PS: Add missing error checks for _cairo_output_stream_destroy + + src/cairo-ps-surface.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit ab5eccbbf6cc361e864e0d75c0299cf7b5d6122d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:28:48 2007 -0700 + + Make _cairo_clip_reset void + + Yet another unconditionally successful function---so it's easier to return nothing. + + src/cairo-clip-private.h | 2 +- + src/cairo-clip.c | 4 +--- + src/cairo-gstate.c | 4 +++- + src/cairo-meta-surface.c | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit 7a0ae5b7057798106b5e1a82431178f6c5f148e7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 10 21:09:36 2007 +0100 + + Disable warnings for cairo_*_reference functions. + + This class of functions modify their argument and return it as a + *convenience* for the caller. For example, within cairo a common idiom is: + + cairo_object_reference (new); + cairo_object_unreference (this->obj); + this->obj = new; + + which updates the member to the new object irrespective of whether the + new object is the same as the one being replaced. Other issues arise + with subtypes, as the return type is the parent's and so require more + complicated handling to compile cleanly. + + Disabling the warning is therefore preferred over adding code which + decreases readibility and reduces maintainability. We need to make the + compiler work for us, not against us... + + src/cairoint.h | 26 +++++++++++++++----------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +commit b82e595449e6eebbe6024454aaaaee31e6c43c73 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 9 15:31:28 2007 +0100 + + pixman region operations can fail, propagate the error. + + Copying the clip region could fail, add error returns and propagate up + the call stack. + + src/cairo-clip-private.h | 4 ++-- + src/cairo-clip.c | 53 ++++++++++++++++++++++++++++++++++-------------- + src/cairo-gstate.c | 14 ++++++++++--- + src/cairo.c | 2 +- + src/cairoint.h | 2 +- + 5 files changed, 53 insertions(+), 22 deletions(-) + +commit b0a256aaf3f0fd4491a28fca797aef1ef4b1251d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 13:07:09 2007 -0700 + + Change _cairo_dtostr to have a void return type + + As previously implemented, there's no essential information in the + return value from _cairo_dotostr, (the caller can simply use strlen + to recompute the same value, which is what the only caller is already + doing). + + There would be real information in a return value which would return + the result from the call to snprintf for the case where the buffer is + not large enough for the number being printed. + + src/cairo-output-stream-private.h | 2 +- + src/cairo-output-stream.c | 5 +---- + src/cairoint.h | 3 --- + 3 files changed, 2 insertions(+), 8 deletions(-) + +commit 5303980f82431a9d084177998a68527b60610241 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 12:56:56 2007 -0700 + + _cairo_output_stream_vprintf: Add assertion to detect internal inconsitency + + This will catch any inconsistency between the length of a single + format specifier and the fixed size of the single_fmt buffer. + + src/cairo-output-stream.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 97a69bc82e023d139d997ef69c7eba50d2708686 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 12:13:27 2007 -0700 + + Fix mis-indented _cairo_dtostr + + src/cairo-output-stream.c | 64 +++++++++++++++++++++++------------------------ + 1 file changed, 32 insertions(+), 32 deletions(-) + +commit 5c95800cded4e906baf8ddd10bfb4abc59151b13 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 12:13:10 2007 -0700 + + Fix mis-indented _cairo_traps_init_box + + src/cairo-traps.c | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 57188b4dcbcc2625dfc1817f8fe3b8ffeade5dc5 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 12:06:09 2007 -0700 + + Fix cairo_traps_t status handling + + Add a _cairo_traps_status function and use it instead of adding + error checks to callers of _cairo_traps_add_trap and + _cairo_traps_add_trap_from_points, (both of which are now given + a void return type). + + src/cairo-bentley-ottmann.c | 14 +++++++------- + src/cairo-traps.c | 24 ++++++++++++++---------- + src/cairoint.h | 5 ++++- + 3 files changed, 25 insertions(+), 18 deletions(-) + +commit 67bc608603b9baf8de8bcd2fedcf8ec315432a37 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 11:11:32 2007 -0700 + + Add missing error checking to _trace_mask_to_path + + Note: It looks like it would be convenient to shove a status value + into cairo_path_fixed_t to reduce this sequence of error checks. + But I tried that first, and it actually makes things worse overall + due to many things like _cairo_path_fixed_move_to called by + cairo_move_to where the result must be immediately checked anyway. + So I've already rejected that approach. + + src/cairo-scaled-font.c | 54 +++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 41 insertions(+), 13 deletions(-) + +commit b1086caf3b108b0df19f70a2b6df161ad51bb280 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 10 10:45:15 2007 -0700 + + Add a status field to cairo_polygon_t + + Now, the functions to add new data to a polygon all become void, + and there's a new _cairo_polygon_status call to query the status + at the end of a sequence of operations. + + With this change, we fix many callerswhich were previously not + checking the return values of _cairo_polygon functions by adding + only a single call to _cairo_polygon_status rathern than several + new checks. + + src/cairo-path-fill.c | 36 +++++++++-------------------- + src/cairo-path-stroke.c | 8 ++++++- + src/cairo-pen.c | 9 ++++---- + src/cairo-polygon.c | 60 +++++++++++++++++++++++++++---------------------- + src/cairoint.h | 11 ++++++--- + 5 files changed, 64 insertions(+), 60 deletions(-) + +commit bff45ec9f90b5949a8ffa19cb03c140a08119e4d +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:44:12 2007 -0700 + + Invert condition to more intuitive form. + + The idiom for checking the return value of malloc is: + + if (pointer == NULL) { ... } + + rather than: + + if (pointer != NULL) { ... } + + src/cairo-pattern.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 01955a6e82ee28dd1377a3f2242aa2ddeebadac9 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:42:04 2007 -0700 + + Rename ARRAY_LEN to ARRAY_LENGTH + + Yet another victim in my hunt against abbreviations within cairo's implementation. + + src/cairo-arc.c | 2 +- + src/cairo-atsui-font.c | 4 ++-- + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-cff-subset.c | 6 +++--- + src/cairo-hash.c | 2 +- + src/cairo-pattern.c | 8 ++++---- + src/cairo-polygon.c | 2 +- + src/cairo-spline.c | 4 ++-- + src/cairo-surface.c | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-traps.c | 2 +- + src/cairo-truetype-subset.c | 6 +++--- + src/cairoint.h | 4 ++-- + 13 files changed, 23 insertions(+), 23 deletions(-) + +commit d317e8175de04c73c4a1f84db4a7e5354411ca06 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:38:17 2007 -0700 + + Prefer FALSE over 0 for initializing a cairo_bool_t value + + src/cairo.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9a33dab96988b94940a917921accc1bf19960a53 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:37:30 2007 -0700 + + Fix an incorrectly indented condition + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4bfc8c98ccf29fc11d11ee35996be9aab5a63f36 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:36:41 2007 -0700 + + ATSUI: Fix broken error checks for NULL surface + + The cairo_image_surface_create function never returns NULL so + the previous error checks would never have triggered. The correct + approach is to check the result of cairo_surface_status(). + + src/cairo-atsui-font.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit bd98295100ce84a9dfffd16bc6e50ef0ced4d4bc +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:30:06 2007 -0700 + + Add a couple of missing newline characters + + A return statement that's not at the end of a function really needs + a line of whitespace after it. + + src/cairo-bentley-ottmann.c | 1 + + src/cairo-type1-fallback.c | 1 + + 2 files changed, 2 insertions(+) + +commit a7d8e52cc4be2376429f567abc2be853da7d5fbc +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:24:18 2007 -0700 + + Cleanup multi-line if condition + + The standard idiom of assigning to a local status variable looks much, + much nicer here. + + src/cairo-path.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit 7c97696af98a6dab9e0c5cdc72ff08c19892c95f +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:16:30 2007 -0700 + + Make _cairo_path_bounder_add_point void + + Yet another function that cannot fail under any circumstances. + + src/cairo-path-bounds.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 93776772edbadeab90ea199a115750310be91e4e +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:15:33 2007 -0700 + + Make _cairo_matrix_compute_scale_factors void + + Yet another function that cannot fail under any circumstances. + + src/cairo-matrix.c | 4 +--- + src/cairoint.h | 2 +- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit d5b35d7d7666634f1f98d6c0141a2a29976e7e2f +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:12:11 2007 -0700 + + Make _cairo_pen_init_empty void + + Yet another function that cannot fail under any circumstances. + + src/cairo-pen.c | 4 +--- + src/cairoint.h | 2 +- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 9077da99abd163ebd0c52e8375e6f40ce60cf7d2 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:09:51 2007 -0700 + + Make _cairo_gstate_user_to_device (and friends) void. + + This is just multiplication after all, so there's nothing that can fail. + And we can get rid of a lot of useless error-checking code this way. + The corrected functions are: + + _cairo_gstate_user_to_device + _cairo_gstate_user_to_device_distance + _cairo_gstate_device_to_user + _cairo_gstate_device_to_user_distance + + src/cairo-gstate.c | 16 ++++---------- + src/cairo.c | 62 ++++++++++++++++-------------------------------------- + src/cairoint.h | 8 +++---- + 3 files changed, 26 insertions(+), 60 deletions(-) + +commit 628ec8eb91fb246b8a44be3451163a5d8592a860 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 9 17:03:29 2007 -0700 + + Make _cairo_gstate_identity_matrix void + + Now that we have the warn_unused_result attribute enabled, (thanks + Chris!), it's actually harmful to have a function return an + uncoditional value of CAIRO_STATUS_SUCCESS. The harm is that + it would force lots of unnecessary error-checking paths that + just add clutter. + + It is much better to simply give a function that cannot fail + a return type of void. + + src/cairo-gstate.c | 9 ++------- + src/cairo.c | 6 +----- + src/cairoint.h | 2 +- + 3 files changed, 4 insertions(+), 13 deletions(-) + +commit 90803eca0fa8d49c54c465580707009aae382d28 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 4 11:17:23 2007 +0100 + + Implement clone_surface for test-fallback-surface. + + A few tests were failing due to clip_init_deep_copy() not being able to + clone the target surface. Before propagating the failure, this was being + silently ignored. + + Copy the simple implementation from cairo-image-surface. + + src/test-fallback-surface.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +commit 4456ecbf2694f0b71a431353e0dea0515b72926b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 23:40:31 2007 +0100 + + Fix detection of FcFini(). + + It is customary to check for a FontConfig function in the FontConfig + library rather than the FreeType library. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cd2394c076e2f6b14a9a3281461026b811692f2e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 3 21:50:15 2007 +0100 + + Free the bitmap->buffer on failure + + Currently if the ownership of the bitmap->buffer is passed to + _get_bitmap_surface() then the status of the buffer is inconsistent + should the function detect an error (i.e. CAIRO_STATUS_NO_MEMORY). + Fix it up that should we encounter an error and we own the buffer then + we always free it on behalf of the caller. + + src/cairo-ft-font.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit ac33953a81114dddc25ceb57f6df57e01d4d937b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 23:37:29 2007 +0100 + + Correct handling of a malloc failure during pattern_create_in_error() + + Confusion had been introduced as to who provided the fixup after + the malloc failed which resulted in a NULL deference whilst checking for + an erroneous pattern in _cairo_pattern_create_in_error. + + src/cairo-pattern.c | 24 ++++++------------------ + 1 file changed, 6 insertions(+), 18 deletions(-) + +commit b6924722b8c8e5f4356d3c8ba438a702ffb8a5ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 23:35:01 2007 -0400 + + [cairo-skiplist] Use one random number per insertion, instead of two + + src/cairo-skiplist-private.h | 3 +++ + src/cairo-skiplist.c | 7 +++++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit ce1651f1ea57b53ad91f5115524d33f6424d5797 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 3 16:53:17 2007 +0100 + + Free the pixman_image if we fail to wrap it with a surface. + + src/cairo-image-surface.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit bd99507f15dd8a2d162f13e691cc5f8d71795577 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 30 14:00:50 2007 +0100 + + Initialise cairo_spline_t to use its embedded buffer. + + Currently the code defaults to setting its points to NULL and fixing it up + on the first add_point() to use the embedded buffer. Skip this extra step + by initialising points to the embedded buffer. + + src/cairo-spline.c | 24 +++++++----------------- + 1 file changed, 7 insertions(+), 17 deletions(-) + +commit 6daaf8a89d24fb3022687fe8d52c8001dc270265 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 23:32:27 2007 -0400 + + [cairo-skiplist] Reduce MAX_LEVEL from 31 to 15 + + The probability that a node of level L is generated is + 0.25^(L-1) * 0.75. It means, a node of level 15 or + more will be used with a probability of about 3 * 10^-9. + That's really rare... + + Actually that's not still true, because the level of a new + node is capped by current max-level plus one. So to really + get a node with a level of 15 one should first get a node + of level 2, then 3, then 4, ..., finally 15. Now that's + REALLY rare. + + And guess what, the skiplist only start behaving bad with a + max level cap of MAX_LEVEL when having on the order of + 4**MAX_LEVEL items in it. I really hope we don't get there. + + src/cairo-skiplist-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a7de9501f6d0f3a574c5246b81d78aa749b64e67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 23:24:50 2007 -0400 + + [cairo-skiplist] Group levels two-by-two in freelists + + Most memory allocators allocate in multiples of twice the size of + a pointer. So there is no point in keeping freelists for both + even and odd levels. We now round odd levels up to the next + even level for freelist computations. This reduces the number of + node mallocations. + + src/cairo-skiplist-private.h | 10 +++++++++- + src/cairo-skiplist.c | 21 ++++++++++++++------- + 2 files changed, 23 insertions(+), 8 deletions(-) + +commit b2280c5ac25e752c4462acdc8d2ded916fce7c34 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 30 11:24:18 2007 +0100 + + Do not overwrite cr->status + + The idiom for cairo.c is to do + cr->status = _cairo_op (); + if (cr->status) _cairo_set_error (cr, cr->status); + + Unfortunately a trivial mistake for a _cairo_op () is to call a cairo_op () + and forget to check cr->status but return CAIRO_STATUS_SUCCESS which will + mask the earlier error. + + Obviously this is a bug in the lower level but the impact can be reduced + by chaning cairo.c to use a local status variable for its return: + cairo_status_t status = _cairo_op (); + if (status) _cairo_set_error (cr, cr->status); + + src/cairo.c | 537 ++++++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 319 insertions(+), 218 deletions(-) + +commit 14ac5dd78b38aaaa118e8ac39fa50f485bff516d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 23:11:57 2007 +0100 + + Return the correct status from _cairo_pen_stroke_spline(). + + The return value is shared before the normal cleanup and error paths, + so do not simply return a hard-coded CAIRO_STATUS_SUCCESS. + + src/cairo-pen.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b823e2f68ff613b2c4f537aba6bbbcf413412eb2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 23:09:31 2007 +0100 + + cairo-xlib-surface - propagate status returns. + + These were found during a cairo_static pass on an alternative branch... + + A critical one in particular was setting the have added glyph flag to + TRUE even if _cairo_xlib_surface_add_glyph() fails. This can cause an + application crash due to a RenderBadGlyph error later when the scaled + font is cleaned and we attempt to remove the glyph. + + src/cairo-xlib-surface.c | 44 +++++++++++++++++++++++++++++++------------- + 1 file changed, 31 insertions(+), 13 deletions(-) + +commit 4a624b8e8b0a14dd03e551b28257d8a54b9ee6f6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 29 13:36:07 2007 +0100 + + Remove the entry if we return an error code during _cair_hash_table_insert. + + Previously if we detected an error during resize we would report a + failure to insert the entry into the hash table having already done so. + + src/cairo-hash.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 1cdb54f8835446b23769b7771445201a9b5d165e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Mar 29 09:11:21 2007 +0100 + + Reorder cleanup cairo_xlib_surface_show_glyphs() + + _cairo_pattern_release_surface() asserts that it is passed a pattern + surface. This itself is bad as breaks the symmetry with + _cairo_pattern_acquire_surface under() error conditions, however reorder + the cleanup to avoid this assertion. + + src/cairo-xlib-surface.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit a1331fb043051ac10f8555b2ad2fe85183db96df +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 19:32:25 2007 +0100 + + Detect failure to allocate glyphs during _cairo_scaled_font_init() + + If _cairo_cache_create fails, return CAIRO_STATUS_NO_MEMORY. + + src/cairo-scaled-font.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 1237eedff3d557b94db9c940fd8de48be9ba41ba +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 22:56:43 2007 +0100 + + Check for error whilst trying to advance along a text string. + + The text perf-case tries to fill the region with a single text string, + but fails to detect when the current point does not advance due to an + error. This causes the perf-case to enter an infinite loop, so we break + out when the cairo_status() has been set. + + perf/text.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ea4945850ae3ce3614bcadc0fa413eb836344430 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 16 20:04:26 2007 +0000 + + Avoid using substituted surfaces for xlib operations. + + Detect when a substitute image surface is returned for a solid pattern, + and avoid mixed image/xlib composite operations. This can happen for example + if there is a resource allocation failure during creating a similar surface. + + src/cairo-xlib-surface.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 751976970bb0ec9b810c1f58a05d53b7bfb7d90f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Mar 16 19:35:02 2007 +0000 + + Handle failure to allocate a GC. + + src/cairo-xlib-surface.c | 51 ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 34 insertions(+), 17 deletions(-) + +commit c6055dc349c3f96e8d6f0e4166540871a59cb0e2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 22:50:44 2007 +0100 + + Reset cairo_scaled_font_map after freeing. + + Along the error path the global font map was freed but not reset, + causing segfaults on any subsequent use of a cairo_scaled_font_t. + + src/cairo-scaled-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit 65de47d8bc7865c6bf6318fd7bd861acf4e4af05 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 22:47:19 2007 +0100 + + cairo-bentley-ottmann - check init for failure + + This was found during a cairo_static pass on an alternative branch... + Add the trivial error propagation for _cairo_bo_event_queue_init() + + src/cairo-bentley-ottmann.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit b4cb0306b4415f2ddf0acd84043b72c8b8485726 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 15:55:06 2007 +0100 + + cairo-type1-fallback - propagate error returns + + Add status returns in order to propagate a matrix inversion failure + up through the call stack. + + src/cairo-type1-fallback.c | 25 ++++++++++++++++++------- + 1 file changed, 18 insertions(+), 7 deletions(-) + +commit b29d78dda169ee58b82cdbd04e3af2eedcc58edd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 15:43:37 2007 +0100 + + cairo-svg-surface - propagate some error returns + + Add status returns to functions in order to propagate an error up + the call stack. + + For the emit_*_pattern we add a new status return even when when + the functon return CAIRO_STATUS_SUCCESS unconditionally in order for + the caller to handle all cases in a consistent manner. + + src/cairo-svg-surface.c | 56 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 37 insertions(+), 19 deletions(-) + +commit 3f7ca6ef5b09263607ff2f9862950393815c5d2c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 14:57:44 2007 +0100 + + cairo-pen - cairo_pen_init() can fail propagate its error. + + Add status returns in order to propagate an intialisation failure + back up the call chain. + + src/cairo-path-stroke.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +commit 67f13b3518c5fc98d1e3fb184bc6c2f5ea96f4c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:54:41 2007 +0100 + + cairo-bentley-ottmann/skip-list - catch and propagate out-of-memory errors + + The skip list inserts could return NULL indicating an out-of-memory error. + In order to handle this, propagate the error up the call stack. + + src/cairo-bentley-ottmann.c | 50 +++++++++++++++++++++++++++++++-------------- + src/cairo-skiplist.c | 2 ++ + 2 files changed, 37 insertions(+), 15 deletions(-) + +commit 293122279fd87098a00386bb4c9310f3fc1bb373 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:50:48 2007 +0100 + + cairo-path-stroke - add trivial missing status checks + + Propagate the error status. + + src/cairo-path-stroke.c | 33 +++++++++++++++++++++++++-------- + 1 file changed, 25 insertions(+), 8 deletions(-) + +commit 2f2bff038cb0e59865a0405b19da4805213d718e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:47:01 2007 +0100 + + buffer-diff - check for any errors whilst writing the png + + Propagate any errors from writing out the png. + + test/buffer-diff.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 79424fc64640db4b518eaf4a23477f1bbc26db5a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:45:58 2007 +0100 + + cairo - add missing status checks + + Add a few missing status checks and set the error on the context when + applicable. + + src/cairo.c | 74 +++++++++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 48 insertions(+), 26 deletions(-) + +commit a34a32fd99145733df9290f7c72bf7d9759e212b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:36:42 2007 +0100 + + cairo-type1-fallback - check for an error during cleanup + + The cleanup path is shared between the error path and the true path, and + so any error along it can not be ignored. + + src/cairo-type1-fallback.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit d2efadc84d0716498cec0510916f5375fbb7acf0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:35:28 2007 +0100 + + cairo-svg-surface - propagate error returns + + Add a couple of missing checks for error statues. + + src/cairo-svg-surface.c | 34 ++++++++++++++++++++++++---------- + 1 file changed, 24 insertions(+), 10 deletions(-) + +commit 02264b40f5ab4831e52c0ad156471045c62c9e85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:34:25 2007 +0100 + + cairo-surface-fallback - propagate error returns + + _cairo_surface_composite() can fail so check for and error return and + propagate. + + src/cairo-surface-fallback.c | 44 ++++++++++++++++++++++++++------------------ + 1 file changed, 26 insertions(+), 18 deletions(-) + +commit 76b27fb0e81cc557c7348f6ba98b72552d781aed +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:33:00 2007 +0100 + + cairo-ps-surface - add a couple of status checks + + Handle a couple more error returns. + + src/cairo-ps-surface.c | 54 +++++++++++++++++++++++++++++--------------------- + 1 file changed, 31 insertions(+), 23 deletions(-) + +commit 619425a8b3bff79fb453f4b84e3a8e75db369b40 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:29:19 2007 +0100 + + cairo-polygon - trivial propagation of error status + + _cairo_polygon_move_to() returns an error status so use it. + + src/cairo-polygon.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 4b195779a465f69b035e9fd6695ef5c137a6b342 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:28:25 2007 +0100 + + cairo-pen - trivial propagation of error status + + Add a couple of missing checks for error statuses and correct the + error path cleanup for _cairo_pen_stroke_spline(). + + src/cairo-pen.c | 24 +++++++++++++++++------- + 1 file changed, 17 insertions(+), 7 deletions(-) + +commit 66d3e252025cf7f8a624fad83bffa1488a98910d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:26:33 2007 +0100 + + cairo-pdf-surface - propagate error status + + Catch and propagate any error status. + + src/cairo-pdf-surface.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit b32a5b1dc6d66a4477fb8df1461821a27192600f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:25:46 2007 +0100 + + cairo-pattern - propagate status + + Catch, cleanup and propagate after an error return. + + src/cairo-pattern.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit fd49bbb4b21b73247b4d391c2cb1b028a596f6eb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:24:59 2007 +0100 + + cairo-path - check for failure during _cairo_path_fixed_interpret + + Catch an error return from _cairo_path_fixed_interpret() and return + it. Similary check for an error code in cairo_status() before returning + success. + + src/cairo-path.c | 55 ++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 32 insertions(+), 23 deletions(-) + +commit 814830f63b72f69198e92564c53f2683e5bda269 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:22:56 2007 +0100 + + cairo-path-fill - trivial missing unused result + + Actually assign the result that is tested on the next line... + + src/cairo-path-fill.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ab1f62c60141d5c0e989d55f4a49537a6b52c4d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:21:49 2007 +0100 + + cairo-paginated-surface - fix up the trivial unused result + + Check for status returns and propagate, cleaning up as necessary. + + src/cairo-paginated-surface.c | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +commit 78c0d62ba7c650a6dc8137e6d1375e21f9477c2b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:20:42 2007 +0100 + + cairo-meta-surface - propagate trivial status return + + _cairo_path_fixed_init_copy() could fail so propagate it's status. + + src/cairo-meta-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 75cc5e04d5b854a1eefe116c2be4a3c2bb21d6ac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:19:49 2007 +0100 + + cairo-image-surface - propagate error returns from pixman. + + pixman does occasionally return an error - in such circumstances we + should propagate it. + + src/cairo-image-surface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit dee9a53029bd3e42c60a855edfb54591bf1782b5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:18:30 2007 +0100 + + cairo-gstate - fix the trivial unchecked returns + + Check for an error return and propagate. + + src/cairo-gstate.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +commit de264af2c659b32c8bc71060da85037ac7e1d44f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:17:26 2007 +0100 + + cairo-ft-font - handle trivial failures + + Catch the status return, cleanup and propagate the error. + + src/cairo-ft-font.c | 82 +++++++++++++++++++++++++++++++++++------------------ + 1 file changed, 54 insertions(+), 28 deletions(-) + +commit 14c8dfb0b9bcc26a02057e5636d8bf35c3b4ef29 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 9 15:03:34 2007 +0100 + + cairo-clip - handle trivial pixman failures + + Detect the simple cases when pixman returns an error, ie an OOM + condition, and propagate the error status. + + src/cairo-clip.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +commit 274c20c27a094c05afa62579cacb5749013abd60 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 21:14:09 2007 +0100 + + cairo-boilerplate - handle failure to set user data + + After failing to set the user data on a surface, clean up and return NULL. + + boilerplate/cairo-boilerplate.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 46eab95698e101e41407778eda22089b508a8984 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Apr 8 20:50:08 2007 +0100 + + Add attribute(warn_unused_result) + + This adds a compiler check that the function result is used by the caller + and enables it by default for all cairo_private functions and for public + API that returns a cairo_status_t. + + It has been discussed that to extend the warnings to all functions, a + new function type could been introduced to cover static functions: + cairo_static. This has not been done at the present time in order to + minimise the churn and focus on the more common errors. + + In order to reduce the warning spew generated by gcc for invalid use of + this attribute, -Wno-attributes is added to CFLAGS. This has the + unfortunate side-effect of masking future warnings for all attributes - + be warned! + + configure.in | 13 ++++++++++++- + pixman/configure.in | 3 ++- + pixman/src/pixman.h | 2 +- + src/cairo.h | 40 ++++++++++++++++++++-------------------- + src/cairoint.h | 8 +++++--- + src/check-headers.sh | 2 +- + 6 files changed, 41 insertions(+), 27 deletions(-) + +commit 9da86e4a386505288c3a933f30583abf7706c950 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 22:56:30 2007 -0400 + + Add references to the skiplist paper + + BIBLIOGRAPHY | 8 ++++++++ + src/cairo-skiplist-private.h | 6 ++++++ + 2 files changed, 14 insertions(+) + +commit ad0e13805c036941a03e49215b1bb525b4666033 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 22:50:51 2007 -0400 + + [cairo-skiplist] Clarify MAX_LEVEL in comment, and adjust accordingly + + Reading the code, MAX_LEVEL is in fact what could have been named + MAX_NUM_LEVELS. That is, it is maximum possible level plus one. + All code is correct: it uses MAX_LEVEL as array size and never produces + a level of MAX_LEVEL. The comment is fixed. + + src/cairo-skiplist.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e8072e6e0ac86b2b0baefb54dcc551ee548164af +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 22:03:46 2007 -0400 + + [test,perf] Make them rebuild boilerplate when src is changed + + perf/Makefile.am | 2 +- + test/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 6f9309221704a799ca36917c65abfc0941119b13 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 21:58:54 2007 -0400 + + Rename pixman_region_uninit to pixman_region_fini + + pixman/src/fbcompose.c | 2 +- + pixman/src/fbpict.c | 2 +- + pixman/src/icimage.c | 8 ++++---- + pixman/src/icrect.c | 4 ++-- + pixman/src/ictrap.c | 4 ++-- + pixman/src/pixman-remap.h | 2 +- + pixman/src/pixman.h | 2 +- + pixman/src/pixregion.c | 2 +- + src/cairo-clip.c | 12 ++++++------ + src/cairo-glitz-surface.c | 4 ++-- + src/cairo-surface-fallback.c | 6 +++--- + src/cairo-surface.c | 4 ++-- + src/cairo-traps.c | 2 +- + 13 files changed, 27 insertions(+), 27 deletions(-) + +commit 4f8a04b1c93630c2556db5e3a0657076167e1ea3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 8 21:55:45 2007 -0400 + + [pixman-image] Simply initialization given that there is no clip + + pixman/src/icimage.c | 32 +++++++++----------------------- + 1 file changed, 9 insertions(+), 23 deletions(-) + +commit df9ea31df5857ee7aacd6ba002881233e9c4a9b4 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Mar 15 14:42:13 2007 +0100 + + [pixman-region] Separate pixman_region_init + + Most of the time pixman_region_init is called without any extents, and + followed by a pixman_region_union_rect, used to used to initialize + rectangular regions. pixman_region_union_rect is not that cheap, but + the sequence is called quite often. So it should be worth introducing + a specialized and fast function for this sequence. + + This introduces pixman_region_init_rect. This new function makes + _cairo_region_init_from_rectangle obsolete. + + Also removes the extent argument from pixman_region_init as it was + called with NULL most of the time. A pixman_region_init_with_extents + is added for the general case. + + pixman/src/fbcompose.c | 3 +-- + pixman/src/fbpict.c | 3 +-- + pixman/src/icimage.c | 25 +++++++++++-------------- + pixman/src/icrect.c | 10 +++++----- + pixman/src/ictrap.c | 6 ++---- + pixman/src/pixman-remap.h | 2 ++ + pixman/src/pixman.h | 7 ++++++- + pixman/src/pixregion.c | 37 +++++++++++++++++++++---------------- + src/cairo-clip.c | 18 ++++++++++-------- + src/cairo-glitz-surface.c | 2 +- + src/cairo-region.c | 25 ------------------------- + src/cairo-surface-fallback.c | 7 +++---- + src/cairo-surface.c | 16 ++++++---------- + src/cairo-traps.c | 2 +- + src/cairoint.h | 4 ---- + 15 files changed, 70 insertions(+), 97 deletions(-) + +commit 9436959a838412b5336279c7d5c35bf4e586f984 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 01:37:28 2007 +0100 + + Update function map + + pixman/src/pixman-remap.h | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 99f4bfada807aa7062051bb81fd29d4d3a87fbd1 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 01:35:40 2007 +0100 + + Remove abdoned pixman_region_{create,destroy} + + pixman/src/pixman.h | 6 ------ + pixman/src/pixregion.c | 25 ------------------------- + 2 files changed, 31 deletions(-) + +commit 4532c023e0810c2e8d0d5928074bcae8865c5e14 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 01:31:53 2007 +0100 + + Make clientClip region static, remove abdoned CT_PIXMAP code paths + + pixman/src/icimage.c | 208 ++------------------------------------------------- + pixman/src/icimage.h | 2 +- + pixman/src/icint.h | 2 +- + 3 files changed, 9 insertions(+), 203 deletions(-) + +commit 65f269f3a4148a6cf3b2158ea893bb8452c3ad5e +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 01:24:11 2007 +0100 + + Avoid pixman_region_create in pixman_composite{,General} + + pixman/src/fbcompose.c | 32 +++++++++--------------- + pixman/src/fbpict.c | 32 +++++++++--------------- + pixman/src/icimage.c | 68 ++++++++++++++++++-------------------------------- + 3 files changed, 48 insertions(+), 84 deletions(-) + +commit 82cc451148eec1703d001f2b814d5b3712d31727 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 01:21:18 2007 +0100 + + Make clip regions of pixman_image_t static + + pixman/src/fbcompose.c | 38 ++++++++-------- + pixman/src/icimage.c | 121 +++++++++++++++++++++++++++---------------------- + pixman/src/icimage.h | 8 ++-- + pixman/src/icrect.c | 7 ++- + 4 files changed, 96 insertions(+), 78 deletions(-) + +commit 041371533746d4aae3245a74459c0b0d1a4628fb +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 00:59:36 2007 +0100 + + Avoid pixman_region_create in pixman_color_rects + + pixman/src/icrect.c | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit 5a6ca4794bfd96026937cd8736a8bcb723b2b2ff +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 00:55:46 2007 +0100 + + Replace pixman_region_create_simple by pixman_region_init + + pixman/src/ictrap.c | 14 +++++++------- + pixman/src/pixman.h | 3 --- + pixman/src/pixregion.c | 13 +------------ + 3 files changed, 8 insertions(+), 22 deletions(-) + +commit f9057f27520842159f73dbfd6de49cb8feee1c39 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 00:48:43 2007 +0100 + + Avoid pixman_create_region in glitz-surface + + src/cairo-glitz-surface.c | 49 +++++++++++++++++++++++------------------------ + 1 file changed, 24 insertions(+), 25 deletions(-) + +commit 82cbb6886cf621fd6b10be5e04ce11ff05127fc6 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 00:46:34 2007 +0100 + + Remove redundant _cairo_clip_fini function + + src/cairo-clip-private.h | 3 --- + src/cairo-clip.c | 17 ----------------- + src/cairo-gstate.c | 4 ++-- + src/cairo-meta-surface.c | 2 +- + 4 files changed, 3 insertions(+), 23 deletions(-) + +commit 5ae309c4561418fb057a8049f047ffcb03f3b698 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 00:40:44 2007 +0100 + + Avoid pixman_region_create in _cairo_traps_extract_region + + src/cairo-traps.c | 18 +++++++++--------- + src/cairoint.h | 6 +++--- + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 241482b5505427d221f4aaa970e7500a78fb2da1 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 00:28:49 2007 +0100 + + Avoid malloc in _cairo_region_create_from_rectangle + + src/cairo-clip.c | 42 ++++---- + src/cairo-region.c | 34 +++--- + src/cairo-surface-fallback.c | 250 +++++++++++++++++++++++-------------------- + src/cairo-surface.c | 52 +++++---- + src/cairoint.h | 5 +- + 5 files changed, 199 insertions(+), 184 deletions(-) + +commit efc9775149c4c87645c58235c7626cc4f72e69c3 +Author: Mathias Hasselmann <mathias@pergamaunz.(none)> +Date: Tue Mar 13 23:58:14 2007 +0100 + + Make sure clip->region is always initialized + + src/cairo-clip.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 0e7df34e07d7816b29c1ac1f67608b87c5e0efc2 +Author: Mathias Hasselmann <mathias@pergamaunz.(none)> +Date: Tue Mar 13 23:38:20 2007 +0100 + + Make region of cairo_clip_t static + + src/cairo-clip-private.h | 3 +- + src/cairo-clip.c | 87 +++++++++++++++++++++++++----------------------- + src/cairo-surface.c | 4 +-- + 3 files changed, 49 insertions(+), 45 deletions(-) + +commit ced7b4a4ab4b5a8d639bfca0dd5db38f1ae4825d +Author: Mathias Hasselmann <mathias@pergamaunz.(none)> +Date: Tue Mar 13 22:34:23 2007 +0100 + + Make pixman_region_{init,uninit} public + + pixman/src/pixman.h | 5 +++++ + pixman/src/pixregion.c | 18 ++++++------------ + 2 files changed, 11 insertions(+), 12 deletions(-) + +commit 4d9065fcebbaf857d8d5fe49bcbb33f270c0bf26 +Author: Mathias Hasselmann <mathias@pergamaunz.(none)> +Date: Tue Mar 13 21:51:46 2007 +0100 + + Move struct pixman_region16 to pixman.h + + pixman/src/pixman.h | 7 ++++++- + pixman/src/pixregionint.h | 7 +------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit dce3e5e6b556b817bf95182122adbf6f816b71e9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 6 17:20:49 2007 -0400 + + [TODO] Add 4945 Cairo doesn't support 8-bit pseudocolor visuals + + ROADMAP | 1 + + 1 file changed, 1 insertion(+) + +commit 8bb0e5939c0694e88ea9ede4137d7306a067bd17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 20:27:29 2007 +0100 + + _get_bitmap_surface - check for calloc failure + + src/cairo-ft-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b95577a931645b3013d5acaa5b1bd2d892c3932f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 17:58:31 2007 +0100 + + Protect boilerplate_xlib_synchronize from alloc failure. + + Don't call XDestroyImage on a NULL image. + + boilerplate/cairo-boilerplate.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2a74fd5c7ff21f27013f709dc626be8087cb6a10 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 28 15:50:12 2007 +0100 + + Propagate one error return through pdf. + + src/cairo-pdf-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit a2a8f2ce7a0a9bcef7a4a29624725a77c2abe95a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 5 20:03:51 2007 -0400 + + [ROADMAP] Move David Turner's cairo-ft rewrite to 1.6. + + ROADMAP | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 94460a9790ece7a436d6681ab41d7b2365f0775f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 5 16:35:03 2007 -0700 + + ROADMAP/TODO: Update with 1.4.4 and 1.6 items from recent meeting + + ROADMAP | 164 ++++++++++++++++++++++++++------------------ + TODO | 236 +++++++++++++++++++++++----------------------------------------- + 2 files changed, 183 insertions(+), 217 deletions(-) + +commit d801aa59f84d95568e36d02a0ecf3544b9914187 +Author: Robert O'Callahan <roc@ocallahan.org> +Date: Fri Apr 6 00:00:33 2007 +0100 + + [quartz] fix floating point precision issue (#10531) + + This ensures that error due to double-to-float conversion + does not accumulate; the position of any glyph will be off by + at most one double-to-float conversion error. + + src/cairo-quartz-surface.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 106f8590457a7ebb5335d67f16277e8d5a6b04a8 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Apr 4 15:59:50 2007 -0700 + + Move misplaced CLEANUP_FONT label to avoid crash. + + Previously, a failure in _cairo_win32_scaled_font_init_glyph_path leading + to the CLEANUP_FONT label would set the path into the glyph, then destroy + the path, and return an error status, (which in turn would cause a double + free when the glyph was destroyed). + + The double-free apparently leads to a crash in some cases, as described + here: + + SVG/Cairo related crash when opening specific webpage + https://bugzilla.mozilla.org/show_bug.cgi?id=376498 + + This should eliminate the double-free, but does not address the original + error case, (attempting to get a path from a bitmap font?). + + src/cairo-win32-font.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 5c24711ee65cdb8ac0fdb7419e6466e2b7cb7d9e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 4 10:13:13 2007 +0100 + + Restore gcov functionality + + Add -lgcov to the shared library else the test programs fail to link. + Add a couple of lcov convenience targets to generate the coverage reports. + + Makefile.am | 13 ++++++++++++- + boilerplate/Makefile.am | 2 +- + configure.in | 14 ++++++++++++-- + pixman/src/Makefile.am | 5 ++++- + src/Makefile.am | 2 +- + test/Makefile.am | 5 +++-- + 6 files changed, 33 insertions(+), 8 deletions(-) + +commit 59e5189818321c8a62ad107548facbcfce9e517a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 20:46:14 2007 -0400 + + [Makefile.am] Distribute BIBLIOGRAPHY + Also include all automatically distributed CAPITAL files in there, + to remove any doubts. + + Makefile.am | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a1287e483ce8efcf3f1eca97bdaaccac2393a1bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 20:30:30 2007 -0400 + + [pixman/src/check-config.sh] Test that all source files #include <config.h> + as their first include. + + pixman/src/Makefile.am | 3 +++ + pixman/src/check-config.sh | 17 +++++++++++++++++ + src/check-cairoint.sh | 2 +- + 3 files changed, 21 insertions(+), 1 deletion(-) + +commit 8fbf50d31da9e13f1e55c7ee19586b7c394684ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 20:25:30 2007 -0400 + + [src] Make sure all source files #include "cairoint.h" as their first include + + This is necessary to avoid many portability problems as cairoint.h includes + config.h. Without a test, we will regress again, hence add it. + + The inclusion idiom for cairo now is: + + #include "cairoint.h" + + #include "cairo-something.h" + #include "cairo-anotherthing-private.h" + + #include <some-library.h> + #include <other-library/other-file.h> + + Moreover, some standard headers files are included from cairoint.h and need + not be included again. + + src/cairo-arc.c | 2 ++ + src/cairo-atsui-font.c | 5 ++--- + src/cairo-beos-surface.cpp | 7 ++++--- + src/cairo-directfb-surface.c | 10 +++------- + src/cairo-freelist.c | 5 +++-- + src/cairo-ft-font.c | 4 +++- + src/cairo-gstate.c | 2 -- + src/cairo-matrix.c | 1 - + src/cairo-os2-surface.c | 11 ++++++----- + src/cairo-output-stream.c | 7 ++++--- + src/cairo-path-fixed.c | 1 - + src/cairo-path.c | 2 ++ + src/cairo-png.c | 3 ++- + src/cairo-polygon.c | 1 - + src/cairo-quartz-surface.c | 4 ++-- + src/cairo-region.c | 2 +- + src/cairo-skiplist.c | 6 +----- + src/cairo-surface-fallback.c | 2 ++ + src/cairo-surface.c | 3 +-- + src/cairo-truetype-subset.c | 2 +- + src/cairo-unicode.c | 4 +--- + src/cairo-win32-font.c | 3 +-- + src/cairo-win32-surface.c | 10 +++++----- + src/cairo-xlib-screen.c | 4 ++-- + src/cairoint.h | 1 + + src/check-cairoint.sh | 2 +- + src/test-fallback-surface.c | 4 ++-- + src/test-meta-surface.c | 4 ++-- + src/test-paginated-surface.c | 4 ++-- + 29 files changed, 56 insertions(+), 60 deletions(-) + +commit ffc7d06da0f97390025a510b9532e4a64e9230f4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 20:22:44 2007 -0400 + + [src/check-cairoint.h] Test to check that all source files #include "cairoint.h" + + as their first include. + + src/Makefile.am | 2 +- + src/check-cairoint.sh | 17 +++++++++++++++++ + 2 files changed, 18 insertions(+), 1 deletion(-) + +commit 3646839060de7ab51c805bf5614fc3d1ea8b7fc3 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Wed Apr 4 01:16:30 2007 +0100 + + [boilerplate] split quartz out to avoid symbol clash. + + Quartz and Xlib both define Picture and Cursor, and clashed in + cairo-boilerplate.c. Splitting quartz out allows a single mac + build with --enable-quartz --enable-atsui. + + boilerplate/Makefile.am | 1 + + boilerplate/cairo-boilerplate-private.h | 45 +++++++++++++++++++++++ + boilerplate/cairo-boilerplate.c | 44 +++-------------------- + boilerplate/cairo-quartz-boilerplate.c | 64 +++++++++++++++++++++++++++++++++ + 4 files changed, 115 insertions(+), 39 deletions(-) + +commit 174ebc43fe84854876d642e67fc3a442d280b59e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 20:01:32 2007 -0400 + + [pixman] Make sure all source files include config.h + as their first include. + + pixman/src/fbcompose.c | 2 ++ + pixman/src/fbpict.c | 1 + + pixman/src/fbtrap.c | 4 ++++ + pixman/src/icblt.c | 4 ++++ + pixman/src/icbltone.c | 4 ++++ + pixman/src/iccolor.c | 4 ++++ + pixman/src/icformat.c | 4 ++++ + pixman/src/icpixels.c | 4 ++++ + pixman/src/icrect.c | 4 ++++ + pixman/src/icstipple.c | 4 ++++ + pixman/src/ictransform.c | 4 ++++ + pixman/src/ictrap.c | 4 ++++ + pixman/src/ictri.c | 4 ++++ + pixman/src/icutil.c | 4 ++++ + pixman/src/renderedge.c | 4 ++++ + 15 files changed, 55 insertions(+) + +commit 208c32b245d7f50e1e9d71695269128b28a675fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 19:56:29 2007 -0400 + + [cairoint.h] Remove inline definition for MS compilers + + Such things should go to config.h. For one thing, cairoint.h is not + included in pixman. + + src/cairoint.h | 2 -- + 1 file changed, 2 deletions(-) + +commit 313a6f732112ca88fa4d590a604ce8219065655c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 19:53:28 2007 -0400 + + [pixman] Cleanup inline mess (#10150) + + Simply use "inline" instead of "INLINE" or "__inline__" and let + configure figure out what to use. + + pixman/src/fbcompose.c | 8 ++++---- + pixman/src/fbedge.c | 8 ++++++-- + pixman/src/fbmmx.c | 45 +++++++++++++++++++++++---------------------- + pixman/src/fbpict.h | 6 ------ + pixman/src/icimage.c | 8 ++++++-- + pixman/src/icint.h | 12 +----------- + pixman/src/pixregion.c | 14 ++++++-------- + 7 files changed, 46 insertions(+), 55 deletions(-) + +commit 88dc0c5f19475888c19db437661b290f3a8902f8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 19:26:18 2007 -0400 + + Make sure all nil objects start with _cairo_ + + Previously, the convention was that static ones started with cairo_, but + renamed to start with _cairo_ when they were needed from other files and + became cairo_private instead of static... + + This is error prune indeed, and two symbols were already violating. Now + all nil objects start with _cairo_. + + src/cairo-base85-stream.c | 2 +- + src/cairo-clip-private.h | 2 +- + src/cairo-deflate-stream.c | 4 ++-- + src/cairo-font-options.c | 22 +++++++++++----------- + src/cairo-output-stream-private.h | 2 +- + src/cairo-output-stream.c | 20 ++++++++++---------- + src/cairo-pattern.c | 14 +++++++------- + src/cairo-ps-surface.c | 4 ++-- + src/cairo.c | 8 ++++---- + src/cairoint.h | 2 +- + 10 files changed, 40 insertions(+), 40 deletions(-) + +commit 114be945db6c02aeb60cf1123b43680bd12cccdb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 16:47:39 2007 -0400 + + [test] Add svg2pdf + + test/Makefile.am | 6 ++++ + test/svg2pdf.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 91 insertions(+) + +commit b121468f14a6a05a823e06cf7c51caaa1e342556 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 16:27:50 2007 -0400 + + [configure.in] Bump version up to 1.4.3, oops! + Supposed to be done after 1.4.2 was out, but apparently didn't happen. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9710c48df31c66d8931a75b6578c7c861d497baa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 16:26:48 2007 -0400 + + [doc] Update Headers.mk + + doc/public/Headers.mk | 1 + + 1 file changed, 1 insertion(+) + +commit 040c68cb2ca6c893d9ba11291c21b1cf84fec980 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 16:23:35 2007 -0400 + + [test] Make pdf2svg build (and distributed) + + test/Makefile.am | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 17f5706d1730662bce0cd49f60cb150773fac051 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 16:04:04 2007 -0400 + + [pdiff] Make stdint.h inclusion portable (#10441) + by copying magic bits from cairo-wideint-private.h. + + test/pdiff/pdiff.c | 37 ++++++++++++++++++++++++++++++++++++- + 1 file changed, 36 insertions(+), 1 deletion(-) + +commit c2b1908f9b0d8c59abf79c3462471d1c3960b153 +Author: Benjamin Berg <benjamin@sipsolutions.net> +Date: Tue Apr 3 15:46:51 2007 -0400 + + Fix typo in cairo_arc_negative() docs (#10497) + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 814295f5fad43ec1d8b18fac045e3c0d27ec7c29 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 3 15:37:40 2007 -0400 + + [autogen.sh] Add --enable-test-surfaces to configure flags + + Also remove --enable-maintainer-mode since we removed AM_MAINTAINER_MODE + from configure.in in b0d05f7421c457120b9d86a83c4935c67b217fab. + + autogen.sh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 38c9909e2948f089bbec89e2d43b0e6f930c1ab1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 3 15:34:30 2007 -0400 + + [autogen.sh] Borrow version comparison from GNOME autogen.sh (#9566) + + Our previous version check code was thinking that 1.10 is older than 1.7 + + autogen.sh | 186 ++++++++++++++++++++++++++++++++----------------------------- + 1 file changed, 97 insertions(+), 89 deletions(-) + +commit 00cc44373705665824d53c8ebde5df397b834e41 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Mar 26 21:44:33 2007 +0100 + + [test/degenerate-path] remove quartz reference image + + The reference image is no longer the correct size, so isn't + providing a comparison at all. In the absence of a better + replacement, removing it at least gives us diffs. + + test/Makefile.am | 1 - + test/degenerate-path-quartz-rgb24-ref.png | Bin 188 -> 0 bytes + 2 files changed, 1 deletion(-) + +commit 256f3e09a8a0d152a33df00604bf2245604b72bc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 26 10:33:32 2007 +0100 + + Destroy the current pattern before replacing with cairo_set_source(). + + Frequently cairo_set_source_rgb[a]() is used to replace the current + solid-pattern source with a new one of a different colour. The current + pattern is very likely to be unshared and unmodified and so it is likely + just to be immediately freed [or rather simply moved to recently freed + cache]. However as the last active pattern it is likely to cache-warm and + suitable to satisfy the forthcoming allocation. So by setting the current + pattern to 'none' we can move the pattern to the freed list before we + create the new pattern and hopefully immediately reuse it. + + src/cairo-pattern.c | 10 ++++++++++ + src/cairo.c | 9 +++++++++ + src/cairoint.h | 1 + + 3 files changed, 20 insertions(+) + +commit 38442d4948e0a93f06cd86e6841729bc3f25ed3b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 26 10:12:46 2007 +0100 + + Back out the solid-pattern-cache from 9b53bc7c6585db7ae647bb992fb9817d7bd75b38. + + Unfortunately one cannot cache live patterns and return a fresh reference + instead of creating new ones as patterns can be modified by the user and + so cannot be transparently shared between different users. However, + solid colour allocation is still a frequent operation, so we maintain a + small cache of recently freed patterns to reduce the malloc pressure. + + src/cairo-pattern.c | 100 +++++++++++++++++++++++++--------------------------- + 1 file changed, 48 insertions(+), 52 deletions(-) + +commit c8e37af4b06fffe1aa1a1c3d2cd6481cc2cf8938 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Mar 25 23:31:40 2007 +0100 + + [quartz] fix order of fields in matrix conversion + + There was a typo flipping the xy and yx fields when a + cairo matrix was converted to a quartz matrix. + + src/cairo-quartz-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d2cdd5eba801fc5f696d1095f237ae53c54b4e2a +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sat Mar 24 13:25:03 2007 +0000 + + [atsui] fix scaling of glyph surfaces (#9568) + + Atsui glyph surface were clipped incorrectly when the text is scaled, + visible in the text-pattern test. + + src/cairo-atsui-font.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 2efaf3a7a47a281ca02009d371cd7a06a8a4f282 +Merge: abac4d2 25ddc08 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Sat Mar 24 00:29:04 2007 +0100 + + Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo + +commit abac4d251dd02151dced296afa9d6e1b383868ee +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Fri Mar 23 23:36:15 2007 +0100 + + [cairo-perf] Use full 64 bit of the clock cycle counters to avoid overflows + + perf/cairo-perf-posix.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit 25ddc0800490ca0222668e389412f92ccfdab91c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 23 23:19:30 2007 +1030 + + PS: Remove unused variable + + src/cairo-ps-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit e9a26966484171f94df41bd3abc83aae22682caa +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 23 23:08:46 2007 +1030 + + PDF: Use the TJ operator to show glyphs + + src/cairo-pdf-surface.c | 125 +++++++++++++++++++++++++++----- + src/cairo-ps-surface.c | 11 +-- + src/cairo-scaled-font-subsets-private.h | 25 ++++++- + src/cairo-scaled-font-subsets.c | 83 ++++++++++++++++----- + src/cairo-svg-surface.c | 7 +- + 5 files changed, 201 insertions(+), 50 deletions(-) + +commit 820341b4c503fbd5ca3b8f6c3e5ff6eca5562b98 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 15:44:18 2007 -0400 + + [test/nil-surface] Test that cairo_get_target() returns non-NULL + + test/nil-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ef8515b4a6b468e589639e794a959cb37d592359 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 15:29:18 2007 -0400 + + cairo_push/pop_group(), bail out if cairo_t is in error status + + Fixes the new test added to test/nil-surface to not crash + + src/cairo.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 52341f7e855c93fc8e58895c3a318c43c3d58474 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 15:21:05 2007 -0400 + + [test/nil-surface] Test cairo_create(NULL). Crashing in cairo_push_group! + + test/nil-surface.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 9cea8a4bb26f7de2ac56e318c72e7d048b8b6c0f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 15:03:02 2007 -0400 + + [cairo.c] Don't access gstate members directly + + src/cairo-gstate.c | 18 ++++++++++++++++++ + src/cairo.c | 23 +++++++++++------------ + src/cairoint.h | 3 +++ + 3 files changed, 32 insertions(+), 12 deletions(-) + +commit 39ae64ff0391c40077b63d214727ca0c25e03e37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 14:56:34 2007 -0400 + + [cairo-path] Don't access gstate members directly + + src/cairo-path.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit bd275c19782700f2cfc6905f348e4d4b3f15d311 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 12:34:37 2007 -0400 + + [cairo-pattern] Make sure cached solid patterns are not put in error status + + src/cairo-pattern.c | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +commit e76d3cfa4f06ba813528a018fa77ba4d210a44e3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 12:33:31 2007 -0400 + + [cairo-gstate] Make sure gstate->next is initialized + + src/cairo-gstate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1469ea22ba659ba7afa6892e9b6b2a3f26d0dddb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 21 11:22:33 2007 -0400 + + [cairo-gstate] Move save/restore logic into gstate instead of cairo_t + by adding _cairo_gstate_save/restore(). This is in preparation for + adding copy-on-write behavior to gstate. + + src/cairo-gstate.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- + src/cairo.c | 32 ++++++++++---------------------- + src/cairoint.h | 8 ++++---- + 3 files changed, 65 insertions(+), 28 deletions(-) + +commit 5f83a1b542a1932a59299a45f36dff22268dca14 +Author: Jeff Smith <whydoubt@yahoo.com> +Date: Wed Mar 21 10:41:03 2007 -0400 + + [cairo-output-stream] Remove use of strtol + + src/cairo-output-stream.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit bba7169805cec96b442d15241b0fdf8c38d0cd0e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 22:55:02 2007 -0400 + + Fix file permissions again + + Where do these a+x attributes coming from every once in a while? + + src/cairo-scaled-font.c | 0 + src/cairoint.h | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit ad51ee5aa0d1fc03c4ebe7f0454949995420a710 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 18:59:19 2007 -0400 + + Define and use ARRAY_LEN + + src/cairo-arc.c | 2 +- + src/cairo-atsui-font.c | 6 ++---- + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-cff-subset.c | 8 +++----- + src/cairo-hash.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-polygon.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo-svg-surface.c | 2 +- + src/cairo-traps.c | 2 +- + src/cairo-truetype-subset.c | 8 +++----- + src/cairoint.h | 3 +++ + 13 files changed, 20 insertions(+), 23 deletions(-) + +commit 1de12714a9623e66309279eb9edaf6053fd92c56 +Author: Chris Wilson <chris at chris-wilson.co.uk> +Date: Wed Mar 14 01:31:58 2007 +0000 + + [cairo-surface] Use a stack buffer for small numbers of rectangles + + src/cairo-surface.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 9b53bc7c6585db7ae647bb992fb9817d7bd75b38 +Author: Chris Wilson <chris at chris-wilson.co.uk> +Date: Tue Mar 13 22:51:12 2007 +0000 + + Cache solid patterns + + We use a small cache of size 16 for patterns created from solid colors, + e.g. cairo_set_source_rgb(). This helps with toolkits that draw many + widgets using the same colour scheme. + + The cache uses a static index variable, which itself acts like a cache + of size 1, remembering the most recently used colour. So repeated + lookups for the same colour hit immediately. If that fails, the cache + is searched linearly, and if that fails too, a new pattern is created + and a random member of the cache is evicted. + + src/cairo-color.c | 7 ++++ + src/cairo-debug.c | 2 + + src/cairo-mutex-list.h | 2 + + src/cairo-pattern.c | 63 ++++++++++++++++++++++++++++- + src/cairoint.h | 7 ++++ + test/Makefile.am | 1 + + test/solid-pattern-cache-stress.c | 83 +++++++++++++++++++++++++++++++++++++++ + 7 files changed, 163 insertions(+), 2 deletions(-) + +commit 39679b1b21b07b0fbc05ee21745f384a123ba8da +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 18:01:41 2007 -0400 + + [cairo-path-fixed] Fix "comparison between signed and unsigned" warnings + + src/cairo-path-fixed.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c939421e16fcf098f8d6196e86705173be8e40fd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 08:54:01 2007 -0400 + + Oops. Remove cairo-mutex-private.h include from test surfaces + as that file is included from cairoint.h now. + + src/test-fallback-surface.c | 1 - + src/test-meta-surface.c | 1 - + src/test-paginated-surface.c | 1 - + 3 files changed, 3 deletions(-) + +commit 0d3e886b182b55b147f2ba1a298c2f5ec8a53d87 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 08:49:28 2007 -0400 + + Include cairo-mutex-private.h in test backends + + src/test-fallback-surface.c | 1 + + src/test-meta-surface.c | 2 ++ + src/test-paginated-surface.c | 1 + + 3 files changed, 4 insertions(+) + +commit 0263f18f843175e478bd3a14e24445e31e7b0952 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 08:47:45 2007 -0400 + + [configure.in] Define PIXMAN_CFLAGS, to pass -fno-strict-aliasing to pixman + + configure.in | 10 +++++++--- + pixman/src/Makefile.am | 4 +--- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 94c367f7d7637fc74ed6d1fbe13d73662c08246b +Merge: c4bd7cf d3177a6 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Tue Mar 20 13:33:50 2007 +0100 + + Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo + +commit c4bd7cf6f85770552c0b0284db219f27ffa702f2 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Tue Mar 20 13:32:33 2007 +0100 + + Move declaration of cairo_mutex_t to cairo-mutex-private.h + + src/cairo-font.c | 1 - + src/cairo-ft-font.c | 1 - + src/cairo-mutex-private.h | 53 +++++++++++++++++++++++++++++++++++-------- + src/cairo-mutex.c | 6 +++-- + src/cairo-paginated-surface.c | 1 - + src/cairo-pattern.c | 1 - + src/cairo-scaled-font.c | 1 - + src/cairo-surface.c | 1 - + src/cairo-xlib-screen.c | 1 - + src/cairoint.h | 37 +----------------------------- + 10 files changed, 49 insertions(+), 54 deletions(-) + +commit 9c52a9e7d8a70d21ecdd4fa241fa2594361dd5df +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Tue Mar 20 13:05:48 2007 +0100 + + Remove _global_image_glyph_cache_mutex which is not used anymore. + + src/cairo-mutex-list.h | 4 ---- + 1 file changed, 4 deletions(-) + +commit d3177a68752ac2c8d20b1a8a3616298f04f31078 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 20 07:59:47 2007 -0400 + + [cairo-mutex] Rename _xlib_screen_mutex to _cairo_xlib_screen_mutex + + src/cairo-mutex-list.h | 2 +- + src/cairo-xlib-screen.c | 20 ++++++++++---------- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit be52178443ffd19fc7848dfc78c477883ccb943b +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Tue Mar 20 10:11:14 2007 +0100 + + Initialize mutexes at central location. + + All mutex declarations have been moved to cairo-mutex-list.h. + This should avoid breaking of less frequently tested backends, + when mutexes are introduced or when existing mutexes are renamed. + + Instead of initializing mutexes on library startup, mutexes are + lazily initialized within the few entry points of now by calling + CAIRO_MUTEX_INITIALIZE(). Currently only the OS/2 backend takes + care about releasing global mutexes. Therefore there is no counter + part of that macro for finalizing all global mutexes yet - but + as cairo-backend-os2.c shows such a function would be quite + easy to implement. + + src/Makefile.am | 1 + + src/cairo-font.c | 7 ++- + src/cairo-ft-font.c | 3 +- + src/cairo-mutex-list.h | 52 ++++++++++++++++++ + src/cairo-mutex-private.h | 123 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-mutex.c | 51 ++++++++++++++++++ + src/cairo-os2-surface.c | 45 ++-------------- + src/cairo-paginated-surface.c | 1 + + src/cairo-pattern.c | 3 ++ + src/cairo-scaled-font.c | 3 +- + src/cairo-surface.c | 5 +- + src/cairo-win32-font.c | 10 ---- + src/cairo-win32-private.h | 3 -- + src/cairo-win32-surface.c | 65 ---------------------- + src/cairo-xlib-screen.c | 3 +- + src/cairoint.h | 71 +++++------------------- + 16 files changed, 257 insertions(+), 189 deletions(-) + +commit aba2b299db163d8a5b9d0a0214cd8a485fb87162 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 23:50:13 2007 -0700 + + boilerplate: Add EXTRA_LTLIBRARIES to CLEANFILES to allow make distcleancheck to pass. + + boilerplate/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 2483542b74ac71851cc766de3468d0df833cdec2 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 23:37:28 2007 -0700 + + Add skew-extreme-ref.png to the tar file for the release. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit b91ff39214675faea5d3627ecf86a24aeb8b178f +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 23:24:26 2007 -0700 + + Increment cairo version to 1.4.2 (and libtool versioning to 13:1:11) + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 04b3de48f5269cae483b4af425402679a35e7d33 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 23:22:39 2007 -0700 + + NEWS: Add notes for cairo 1.4.2 + + NEWS | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 130 insertions(+) + +commit 1401f20eb91f34d992612162db0c9e04bd666114 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 22:39:40 2007 -0700 + + Temporarily remove extend-reflect from the list of tests. + + This test is known to sometimes cause an X server to enter a near- + infinite loop. That's a reall unkind thing to inflict upon our + users who are being nice enough to test cairo. Let's disable + this test for the 1.4.2 release. + + test/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 725a4de42dfaf0d9d98447c9fbefed99fbf99ac1 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 16:50:55 2007 -0700 + + Propagate a nil surface out of _cairo_surface_create_similar_scratch + + We detect an error in the surface before calling into private surface-modifying + functions, (such as _cairo_surface_set_font_options), that don't have the + nil-surface protection of public functions. + + This should fix the problem reported (again) in this bug report: + + cairo crashes in cairo_create_simular if nil surface returned by other->backend->create_similar + https://bugs.freedesktop.org/show_bug.cgi?id=9844 + + Though I haven't succeeded in replicating the bug yet, (perhaps a system + difference in allowing writes to read-only memory or not, or something + like that). + + src/cairo-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit eb472a9d9cbaea754907a261b459693b9c27ac79 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 19 13:13:41 2007 -0700 + + xlib: Prefer surface->format over surface->visual for identifying masks + + The original test for 'if (surface->visual)' dates back to a very old + assumption that if the xlib surface was created with an XRenderFormat + that the surface->visual field would be set to NULL. This assumption + was broken years ago with the following commit: + + 0c05b23b3165ec6908c28f56b3446cf43dff44a2 + + This fixes the crash reported here: + + BadMatch when running gnome-terminal with the murrine-0.51 gtk engine + https://bugs.freedesktop.org/show_bug.cgi?id=10250 + + src/cairo-xlib-surface.c | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +commit d27c42cc3fcd4376fc69aa68d997e6077c3eca90 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Mar 19 17:42:06 2007 -0400 + + [boilerplate] Don't build in make all + + boilerplate/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12feb1f98627637bf83ba70f739bb5b2699085aa +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Mar 19 18:22:44 2007 +0000 + + [quartz] apply ctm to text (#9568) + + Applies the ctm to text output on the quartz surface. This corrects + the text-pattern test, and also corrects the size of text when the + ctm includes a scale. + + src/cairo-quartz-surface.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 986b0ff83813b68a19490fe8629bfdaeed68cbe2 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Mon Mar 19 18:21:27 2007 +0000 + + [atsui] make text_to_glyphs return positions in user units. (#9568) + + text_to_glyphs was returning positions in device units; correct this + to use user units. + + src/cairo-atsui-font.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 06a44839270354c7f74aa66352fb4234095dee4e +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Mar 18 20:20:11 2007 +0000 + + [atsui] store sizes in the atsui font + + The ATSUStyle that we store in the font contains references to + the size and font matrix; we need to store them in the font so that + they are not released before the style. + + src/cairo-atsui-font.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 240479d10d3263719b0c8a4426fda088899551a2 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Mar 18 20:20:10 2007 +0000 + + [atsui] refactor CreateSizedCopyOfStyle + + This is just to make it easier to use with passed-in matrices, + which I'll make use of in a subsequent patch. + + src/cairo-atsui-font.c | 36 ++++++++++++++++++++---------------- + 1 file changed, 20 insertions(+), 16 deletions(-) + +commit 43577e26b4c2285499ebfddba6cfa62cbbb15feb +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Sun Mar 18 20:20:10 2007 +0000 + + [atsui] remove the unused old_show_glyphs function. + + _cairo_atsui_old_show_glyphs was a relic of the old quartz + surface and is no longer required. + + src/cairo-atsui-font.c | 180 +++++-------------------------------------------- + 1 file changed, 15 insertions(+), 165 deletions(-) + +commit 5aaf584bf44d762af5e486f21a037eb0cc6e1197 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 16 17:45:31 2007 -0700 + + XCB: Fix parameter-order confusion with xcb_create_pixmap + + This fixes mask-based clipping with the XCB backend, (which also makes + the xcb backend pass all tests that the xlib backend passes). + + src/cairo-xcb-surface.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 6f96a5dd9954418b252ec45752dcf2c3b289fed4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 16 18:21:36 2007 -0400 + + [win32] Really return unhinted font metrics if metrics hinting is off + + src/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 47e71eef5f903fa1a96d82a79a75d89c52032913 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 16 17:56:53 2007 -0400 + + [win32] Fix font descent computation + + src/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dd4601b0d03bba021b11dcf96e09584f40d1621f +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Fri Mar 16 20:43:29 2007 +0100 + + [cairo-perf] Emit warning, if cairo-perf is not CPU bound + + cairo-perf and the X server should be bound to CPUs (either the same + or separate) on SMP systems. Not doing so causes random results when + the X server is moved to or from cairo-perf's CPU during the + benchmarks. + + configure.in | 11 +++++++++++ + perf/cairo-perf.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 63 insertions(+) + +commit d02aa5b23eb6243b21697de203db0a5f1b49def9 +Author: Gilles Dauphin <dauphin@enst.fr> +Date: Fri Mar 16 10:35:23 2007 -0700 + + Don't use unsupported visibily attribute hidden on Solaris + + Thanks to Thomas Klausner for passing the report along. + This fixes the following bug report: + + hidden attribute does not work with Solaris ld + https://bugs.freedesktop.org/show_bug.cgi?id=10227 + + And as Behdad points out, an even better fix would be to + move checks for supported visibility attribute to configure. + + pixman/src/pixman.h | 2 +- + src/cairoint.h | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 8236282c5d58320173b17659e488384e710d0ea7 +Author: Thomas Klausner <wiz@danbala.tuwien.ac.at> +Date: Fri Mar 16 10:04:56 2007 -0700 + + Use "find !" rather than "find -not" for better portability + + The man page for GNU find says: + -not expr + Same as ! expr, but not POSIX compliant. + + And actually, on e.g. NetBSD, "-not" is not supported. + + This resolved the following bug: + + https://bugs.freedesktop.org/show_bug.cgi?id=10226 + + RELEASING | 2 +- + src/check-headers.sh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 332c38b6c34bde4829607e534f39522f8001acf7 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 15 23:25:06 2007 -0700 + + Avoid pulling in -lz for the ps backend. + + Quite some time ago we switched from using deflate-based compression to LZW + for the ps backend, (which allows it to target PostScript Level 2 instead of + PostScript Level 3). Now, we finally drop the fact that the ps backend was + still requiring zlib in order to build. + + configure.in | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit 2242550b489472d4d9b6505fd3db89541e101425 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 15 23:17:19 2007 -0700 + + Make compilation of cairo-deflate-stream.c conditional on compilation of PDF backend. + + Otherwise we risk pulling in an otherwise-unneeded dependency on zlib. + + This fixes the bug reported here: + + Without PDF surface backend we don't need cairo-deflate-stream + https://bugs.freedesktop.org/show_bug.cgi?id=10202 + + src/Makefile.am | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 1234064fa4aa20d0875473709d2fa74600af485b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 15 22:38:42 2007 -0700 + + Allow NULL pointers for functions that accept pointers for multiple return values. + + When a single function accepts pointers for multiple return values, + the convention is that it's legal for the user to pass NULL for + those pointers in case the user is only interested in some subset + of the values. + + This was already properly implemented for functions such as + cairo_pattern_get_rgba, etc. + + Here we fix four functions to follow the same convention: + + cairo_stroke_extents + cairo_fill_extents + cairo_clip_extents + cairo_surface_get_device_offset + + src/cairo-gstate.c | 44 +++++++++++++++++++++++++++++++++----------- + src/cairo-surface.c | 6 ++++-- + 2 files changed, 37 insertions(+), 13 deletions(-) + +commit 133183d858aa632da3cec2a789dcc1e1203d778b +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 15 22:08:55 2007 -0700 + + Fix cairo_stroke_extents and cairo_in_stroke to not crash with line width of 0.0 + + This fixes the line-width-zero test case and the bug reported here: + + Crash in cairo_stroke_extents whe line width is 0 and line cap is ROUND + (_cairo_pen_find_active_cw_vertex_index) + https://bugs.freedesktop.org/show_bug.cgi?id=10231 + + src/cairo-gstate.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 23caa0f43ba199371ab178cf3e827e449ee5935f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Mar 15 21:58:20 2007 -0700 + + Add line-width-zero test which currently crashes. + + The crash is described in this bug report: + + Crash in cairo_stroke_extents whe line width is 0 and line cap is ROUND + (_cairo_pen_find_active_cw_vertex_index) + https://bugs.freedesktop.org/show_bug.cgi?id=10231 + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/line-width-zero.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 81 insertions(+) + +commit 562bd551bc5ca3f3858a66b9884a8525531153c8 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Thu Mar 15 12:47:41 2007 +0100 + + [cairo-perf-diff] Update usage screen to mention --html. + + perf/cairo-perf-diff | 73 ++++++++++++++++++++++++++++++---------------------- + 1 file changed, 42 insertions(+), 31 deletions(-) + +commit 6ff2439b33a9da9a517325bfd472e8cb1fdd4992 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 14 16:33:01 2007 -0700 + + Implement _cairo_traps_tessellate_triangle with _cairo_traps_tessellate_convex_quad + + The newly rewritten convex_quad code is actually simpler than the + triangle code being replaced here. This also allows us to throw + away the problematic _compute_x function which can't handle + horizontal lines, (divide by zero). So the cairo world becomes a + better place. + + src/cairo-traps.c | 89 ++++++------------------------------------------------- + 1 file changed, 9 insertions(+), 80 deletions(-) + +commit 53ae6ea957bac141c033f41276d93bab3a25009f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 14 16:30:48 2007 -0700 + + Fix _cairo_traps_tessellate_convex_quad to handle a == b + + This case was found in an attempt to use the convex_quad function + for tessellating triangles as well. Fortunately the fix is very + easy. + + src/cairo-traps.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 96d8f58daf279238d3a1dfcd4ed3710014e2aeea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 13 20:17:22 2007 +0000 + + Clear the XRender data on display closure. + + Use the new hook functions to register a callback for xlib to clear + the private glyph data when the display is closed. In order to do this + we need to reset the glyph cache inside the generic scaled font as well. + + src/cairo-xlib-surface.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +commit 52405533b1b191ff98ef3cbc20eaf55e97c8049c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 13 20:42:09 2007 +0000 + + Privately export a function to reset the scaled font's glyph caches. + + src/cairo-scaled-font.c | 9 +++++++++ + src/cairoint.h | 3 +++ + 2 files changed, 12 insertions(+) + +commit ad7698feb5f818ba2657b01bbc04f7fb537c1297 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Mar 13 20:11:49 2007 +0000 + + Introduce hooks for _cairo_xlib_close_display() + + This patch adds a simple hook data type for a notifier style callback + and introduces two functions to manipulate a list of callbacks for + cleaning up on display closure. + + src/cairo-xlib-private.h | 15 +++++ + src/cairo-xlib-screen.c | 153 +++++++++++++++++++++++++++++++++++++---------- + 2 files changed, 136 insertions(+), 32 deletions(-) + +commit 3d3173d176bc959682a35674c31d3155e8642c41 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 14 16:56:45 2007 -0700 + + Add svg-specific reference image for radial-gradient test. + + This isn't strictly needed, (pdiff allows the test to pass without the + image), but it sure runs faster this way. + + test/radial-gradient-svg-ref.png | Bin 0 -> 91039 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 75201c12be74055d6209d48d1d698797665a70b4 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 14 15:48:15 2007 -0700 + + check-def.sh: Adjust test to exempt _cairo_test_* functions as well as _cairo_*_test_* + + This test started failing with the recent renaming of the following + three functions, (before they had no cairo in their names so they + were not getting picked up at all): + + _cairo_test_fallback_surface_create + _cairo_test_meta_surface_create + _cairo_test_paginated_surface_create_for_data + + With this change, the failure now goes away again. + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5d23d0c90c31b233d5916c12eaf2a1dafc441243 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Mar 14 15:23:01 2007 -0700 + + Remove dead-code remnants of old tessellator + + src/cairo-traps.c | 372 ------------------------------------------------------ + 1 file changed, 372 deletions(-) + +commit 1f3a5b4e1283cc0e55f7ea6baca6d0fe67fd14b1 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 13 17:42:39 2007 -0700 + + Fix bugs in _cairo_traps_tessellate_convex_quad + + The previous code was not handling all cases correctly, (yes, + even something as simple as a quadrilateral can exhibit a + remarkably large number of different cases when tessellation + is attempted). + + This fix now introduces slope comparison which handles several + cases that were mis-handled with the previous implementation which + only used independent sorting of the X and Y values of the + coordinates. + + This fixes the skew-extreme test case and the bug reported here: + + Skew transforms were broken by the cairo update in December + https://bugzilla.mozilla.org/show_bug.cgi?id=373632 + + src/cairo-traps.c | 101 +++++++++++++++++++++++++++++++----------------------- + 1 file changed, 59 insertions(+), 42 deletions(-) + +commit 0a6ae06c35d99e5e8397c58ee94291e7ee45eb4e +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 13 17:39:48 2007 -0700 + + Add new skew-extreme test case. + + This test currently fails, demonstrating the bug reported here: + + Skew transforms were broken by the cairo update in December + https://bugzilla.mozilla.org/show_bug.cgi?id=373632 + + test/.gitignore | 1 + + test/Makefile.am | 1 + + test/skew-extreme-ref.png | Bin 0 -> 1012 bytes + test/skew-extreme.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 128 insertions(+) + +commit 40b6d8842e1bcb5fbb3a7dffd0c05b7d3bf6cc6b +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 13 13:07:42 2007 -0700 + + Remove radial-gradient test from XFAIL list + + This test has not been failing since the fix in: + + 772edc9133d41dfd667ae5915dfa6ace0bcbfd0d + + So get rid of the '1 unexpected passes' complaint. + + test/Makefile.am | 1 - + test/radial-gradient.c | 3 +-- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit e803e2e69ba02a1db316c97eb9a8d386709380e2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 14 17:23:57 2007 -0400 + + [cairo-pattern] Add a cache of two color stops to cairo_gradient_pattern_t + + Most of gradients have only two color stops. This avoids + calling malloc() for those cases. + + src/cairo-pattern.c | 25 +++++++++++++++++++++---- + src/cairoint.h | 1 + + 2 files changed, 22 insertions(+), 4 deletions(-) + +commit 4514fdca1ba0f3922c2797744f4b0d42d37f8b42 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 20:49:52 2007 -0400 + + [cairo-pattern] Grow color-stops array exponentially + + src/cairo-pattern.c | 61 +++++++++++++++++++++++++++++++++++++---------------- + src/cairoint.h | 3 ++- + 2 files changed, 45 insertions(+), 19 deletions(-) + +commit e878f2259b2512f0411d698bf078fe91b7373246 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 11:42:41 2007 +0100 + + Include pixman/src in cairo-perf hash + + perf/cairo-perf-diff | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1a3f5df5ff4a80bb199e296491e3a5c9887fd4f7 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 21:42:50 2007 +0100 + + Add index.html to .gitignore + + perf/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit c40be43aef735deba7605fde14300b7810701011 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 21:41:40 2007 +0100 + + Transform the output of cairo-perf-diff into HTML + + perf/Makefile.am | 8 ++++- + perf/cairo-perf-diff | 20 +++++++++--- + perf/make-html.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 111 insertions(+), 6 deletions(-) + +commit f1dd48475a34a038ebdb6426b04fc3728a0f0782 +Author: Mathias Hasselmann <mathias.hasselmann@gmx.de> +Date: Wed Mar 14 21:18:09 2007 +0100 + + Improve CPU utilization when building cairo-perf + + perf/cairo-perf-diff | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit a7595c1295ba1a58b452b1df31d02776e5c17c0f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 17:21:19 2007 -0400 + + [Makefile.am] Do not distribute cairo-features.h, Ouch! + + We were accidentally doing that by not marking it noinst. + Moreover, no need to mark it as BUILD_SOURCES, since it's + created by configure, not make. + + src/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f3c8d82d6d6a759364c4228d9b0badf846debcea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 16:51:34 2007 -0400 + + [test] If backends are limited and all untested, pass the test + This is necessary to ensure that limiting backends using + CAIRO_TEST_TARGET does not increase the number of tests failing, + which is a desirable invariant. + + test/cairo-test.c | 44 +++++++++++++++++++++++++++++--------------- + 1 file changed, 29 insertions(+), 15 deletions(-) + +commit 30b5f1baa8cbd01ac0a3ff376e294775b600b4e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 16:50:10 2007 -0400 + + [test] In pattern-getters test, log what went wrong + + test/pattern-getters.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 9267cb042418250614db83bd3b2dcb0e7615af79 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 16:49:42 2007 -0400 + + [cairo-pattern] Use _cairo_color_double_to_short() to fix color conversion + + src/cairo-pattern.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 60502ba3481ea751df6f379e1c38850172826695 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 16:13:35 2007 -0400 + + [cairo-color] Add cairo-private _cairo_color_double_to_short() + + src/cairo-color.c | 11 ++++++----- + src/cairoint.h | 3 +++ + 2 files changed, 9 insertions(+), 5 deletions(-) + +commit 956fdfbb62ac82da1e6fbd467c50e449ec621937 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 06:30:11 2007 -0400 + + [cairo-pattern] Fix color conversion from short to double + We should divide by 65535.0, not 65536.0. + + src/cairo-pattern.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 20304908626f0af40aeda145b2967a40151728c5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 06:20:21 2007 -0400 + + [cairo-pattern] Add XXX note + + src/cairo-pattern.c | 1 + + 1 file changed, 1 insertion(+) + +commit deed0f473400bc2e91dde8bad2537d499a5941ea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 06:09:09 2007 -0400 + + [polygon,spline,traps] Avoid free(NULL) + + src/cairo-polygon.c | 2 +- + src/cairo-spline.c | 2 +- + src/cairo-traps.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit b706bd9b38d505d2b09e932a8f362fac76ef64de +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 06:07:03 2007 -0400 + + [cairo-polygon] Add a cache of eight edges to cairo_polygon_t + + Many, if not most, of polygons have very few edges. This avoids + calling malloc() for those cases. + + src/cairo-polygon.c | 30 +++++++++++++++++++++++------- + src/cairoint.h | 1 + + 2 files changed, 24 insertions(+), 7 deletions(-) + +commit d8165d5424718404946c3a72d59396fc604d1bce +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 05:59:33 2007 -0400 + + [cairo-spline] Fix typo in comment + + src/cairo-spline.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cca7e3fec3a3ec68f812690aa7efafa7dc237849 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 05:56:38 2007 -0400 + + [cairo_polygon_t] Change has_current_point from int to cairo_bool_t + + src/cairo-polygon.c | 8 ++++---- + src/cairoint.h | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 81e15a454b188aa8dd03eb599d0fb4af834695f1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 05:55:45 2007 -0400 + + [cairo_polygon_t] Remove unused member 'closed' + + src/cairoint.h | 2 -- + 1 file changed, 2 deletions(-) + +commit 2bf4ce389d05e07698e03374c3d05436f5d2b2e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 05:53:13 2007 -0400 + + [cairo_polygon_t] Reorder struct members for clarity + + src/cairoint.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3ce84390de8be69f369a4da80c3039b716ebb0e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 05:51:39 2007 -0400 + + [cairo-polygon] Clean-up realloc algorithm for clarity + + src/cairo-polygon.c | 18 +++++++----------- + 1 file changed, 7 insertions(+), 11 deletions(-) + +commit 6976ab1392e0fd07a081e6d6056510070e1d6df9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 9 16:23:35 2007 -0500 + + [cairo-slope] Make comparison stable if both vectors are zero + + src/cairo-slope.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 9eee167210b6cc562014652572872cf0a7ccb00e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 22:34:44 2007 -0500 + + [cairo-spline] Add a cache of eight points to cairo_spline_t + + Most of the splines need not more than eight points. This avoids + calling malloc() for those cases, and eight-points take only 64 bytes. + + src/cairo-spline.c | 28 +++++++++++++++++++++++----- + src/cairoint.h | 1 + + 2 files changed, 24 insertions(+), 5 deletions(-) + +commit 1e64ecf0758a208b469ae0a87a747b3a70c70ceb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 22:17:30 2007 -0500 + + [cairo-spline] Clean-up realloc algorithm for clarity + + src/cairo-spline.c | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +commit cee687a33fb46b68d39bbfa64c44f0b28e10a9ee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 22:19:49 2007 -0500 + + [cairo_traps_t] Reorder struct members for clarity + + src/cairoint.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 24aec99ffb9abce659146ea6ecbfb92856355855 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 20:32:36 2007 -0500 + + [cairo-traps] Add a cache of one trapezoid to cairo_traps_t + + Seems like half the time, we just need one trap. This avoids + calling malloc() for those cases. + + src/cairo-traps.c | 30 +++++++++++++++++++++++------- + src/cairoint.h | 2 ++ + 2 files changed, 25 insertions(+), 7 deletions(-) + +commit 4737416c6e7829ec21230103a1b993d2bd08cc0e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 20:05:13 2007 -0500 + + [cairo-traps] Clean-up realloc algorithm for clarity + + src/cairo-traps.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +commit a9d8cb3e8aceb5831dfb3920df1502bf3b9450a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 19:34:43 2007 -0500 + + [cairo-traps] Use INT32_MIN/MAX instead of INT16_MIN/MAX << 16 + + src/cairo-traps.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5d28bf605fee84520e82818dd35cae8899ecc2ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 19:22:57 2007 -0500 + + [test] Make pdiff if necessary + + test/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit e765ac745e0438296d2c852fd8231bd8f1fff034 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 18:13:55 2007 -0500 + + [skiplist] Prefix symbols with _cairo + + src/cairo-bentley-ottmann.c | 24 ++++++++++++------------ + src/cairo-skiplist-private.h | 22 +++++++++++----------- + src/cairo-skiplist.c | 20 ++++++++++---------- + 3 files changed, 33 insertions(+), 33 deletions(-) + +commit cd78da36f663b99c67d50dcd692cd7b67677c82a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 18:08:37 2007 -0500 + + [test-surfaces] Prefix public symbols with _cairo + + boilerplate/cairo-boilerplate.c | 6 +++--- + src/test-fallback-surface.c | 8 ++++---- + src/test-fallback-surface.h | 2 +- + src/test-meta-surface.c | 2 +- + src/test-meta-surface.h | 2 +- + src/test-paginated-surface.c | 2 +- + src/test-paginated-surface.h | 2 +- + 7 files changed, 12 insertions(+), 12 deletions(-) + +commit 8997b3a023b0edb8877675ce520fbb883d6fa188 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 17:54:00 2007 -0500 + + [skiplist] Move static variable out of function + + Part of my secrect plan to make cairo compilable with: + + #define static + + Useful for some weird debugging purposes. + + src/cairo-skiplist.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit d40126f5aba481e4f4d9582cb5c37478f8ef37e7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 17:47:33 2007 -0500 + + [cairo_t] Embed a gstate into cairo_t + + So we don't have to malloc the first gstate. + + src/cairo-gstate.c | 44 ++------------------------------------------ + src/cairo-private.h | 1 + + src/cairo.c | 32 ++++++++++++++------------------ + src/cairoint.h | 10 +++++++--- + 4 files changed, 24 insertions(+), 63 deletions(-) + +commit 01f9ee39feb6ca48b9e07fdec62d8ab1b94ab75d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 17:42:23 2007 -0500 + + [cairo-clip] Make _cairo_clip_init tolerate NULL target + + (needed for upcoming patches.) + + src/cairo-clip.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit bc8987068d1849cf7c16c38132fcc3c8d3b4e12e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 17:15:35 2007 -0500 + + [cairo_t] Make path an array of size one + + This is more natural since cr->path can be used as if it was a pointer. + This means, for example, if we move on to making it a pointer, most of + the code using it does not need any change. So we get some level of + encapsulation of implementation details, if you prefer the terminology :). + + src/cairo-private.h | 2 +- + src/cairo.c | 52 ++++++++++++++++++++++++++-------------------------- + 2 files changed, 27 insertions(+), 27 deletions(-) + +commit 74e6a24e98baf70284b65d5f4ed41bdf7449d72d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 17:04:43 2007 -0500 + + [Quartz] Don't include cairo-private.h + + src/cairo-quartz-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 6bc543a0ebe4076da31bad4d3ccca4d713948587 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 16:58:18 2007 -0500 + + [cairo_t] Move gstate pointer before cairo_path_fixed_t for better cache behavior + + src/cairo-private.h | 4 ++-- + src/cairo.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 85aff353ca38e607599282bc955e467df82fa01b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 16:52:09 2007 -0500 + + [cairo-path-fixed] Fine-tune size of buffer + + such that cairo_path_fixed_t fits in 512 bytes. + + src/cairo-path-fixed-private.h | 10 ++++++---- + src/cairo.c | 4 ++-- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 1bd073a1a2951bbb09fdab6637baae0172a223f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 16:23:49 2007 -0500 + + [cairo-path-fixed] Merge op and arg bufs + + This means, we have to malloc only one buffer, not two. Worst case + is that one always draws curves, which fills the arg (point) buffer + six times faster than op buffer. But that's not a big deal since + each op takes 1 byte, while each point takes 8 bytes. So op space + is cheap to spare, so to speak (about 10% memory waste at worst). + + src/cairo-path-fill.c | 51 ++++--- + src/cairo-path-fixed-private.h | 22 ++- + src/cairo-path-fixed.c | 313 ++++++++++++++--------------------------- + src/cairo.c | 3 +- + 4 files changed, 141 insertions(+), 248 deletions(-) + +commit 5750d669af24fe1d2707326b9d74dfbb18adf636 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 8 14:30:10 2007 -0500 + + [cairo-path-fixed] Avoid malloc for small paths + + We do this by including an initial op and arg buf in cairo_path_fixed_t, + so for small paths we don't have to alloc those buffers. + + The way this is done is a bit unusual. Specifically, using an array of + length one instead of a normal member: + + - cairo_path_op_buf_t *op_buf_head; + + cairo_path_op_buf_t op_buf_head[1]; + + Has the advantage that read-only use of the buffers does not need any + change as arrays act like pointers syntactically. All manipulation code + however needs to be updates, which the patch supposed does. Still, there + seems to be bugs remaining as cairo-perf quits with a Bad X Request error + with this patch. + + src/cairo-path-fixed-private.h | 4 +-- + src/cairo-path-fixed.c | 66 ++++++++++++++++++++++++------------------ + src/cairo.c | 4 +-- + 3 files changed, 42 insertions(+), 32 deletions(-) + +commit 994dd1a134484d7a1ee246906f21f02d916014a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 04:56:54 2007 -0400 + + [boilerplate] Prefer top_builddir to top_srcdir + + This may fix some build problems the Ubuntu guys are experiencing + with out-of-tree builds. + + boilerplate/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2894ed19a3acd955a5d0e2f5a231a6f1eee8ac06 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 13 04:55:18 2007 -0400 + + [directfb,os2] #error if the backend is not compiled in, like others do + + src/cairo-directfb.h | 3 +++ + src/cairo-os2.h | 2 ++ + 2 files changed, 5 insertions(+) + +commit 073d06d4661feb16b15ece5282a5134e3f05d8e7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 13 18:45:38 2007 +1030 + + Fix incorrect file permission in previous commit + + src/cairo-truetype-subset.c | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a944f42b3d58825e8def292001e3738651b7584a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 13 18:35:59 2007 +1030 + + Fix buffer overflow warning + + src/cairo-truetype-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f78eb8ccf60c60a4b66441958a7498dc9f7fa47 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Mar 12 16:24:58 2007 -0700 + + perf/README: Add notes on using cairo-perf-diff + + perf/README | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 93 insertions(+), 12 deletions(-) + +commit 14cab8b020f429d346561d8ab70b154b2e3f0668 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 11 21:55:19 2007 +0000 + + Correct an off-by-one in the reflection of the convolution index. + + Currently the convolution code uses the formula 2*(N-1)-n to reflect the index + n when n is greater than or equal to N. + This is wrong as n=N -> 2*(N-1)-N = N-2 instead of N-1. + + Furthermore when the image is small, e.g. at the highest levels of the + pyramid, this causes the code to index before the start of the array and + causes valgrind to issue a warning. + + test/pdiff/lpyramid.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 789aada06b52e068662f0ac0f7a424c51bcba510 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Mar 11 20:55:26 2007 +0000 + + Avoid the struct copy when source and destination are the same. + + On some architectures, gcc will emit a memcpy for structure copies which will + produce a valgrind warning when the source and destination pointers are the + same. Workaround this issue by explicitly checking the source and destination + for inequality before doing the structure assignment. + + src/cairo-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ef284a2d6bbeae8711226f1f1f2cf4936f6937eb +Author: Carl Worth <cworth@cworth.org> +Date: Fri Mar 9 13:36:03 2007 -0800 + + Fix a LOCK vs. UNLOCK typo, (yes, I'm that stupid). + + Thanks to M.Drochner@fz-juelich.de for noticing the bug. + + This fixes bug #10235: + + locking bug in cairo_ft_scaled_font_unlock_face() + http://bugs.freedesktop.org/show_bug.cgi?id=10235 + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 772edc9133d41dfd667ae5915dfa6ace0bcbfd0d +Author: Emmanuel Pacaud <emmanuel.pacaud@free.fr> +Date: Thu Mar 8 21:32:59 2007 +0100 + + SVG: fix a radial gradient failure when using CAIRO_EXTEND_REFLECT. + + Assume from the beginning we're using a circle with a radius equal to + 2 * ( r1 - r0 ) when emulating CAIRO_EXTEND_REFLECT. + + src/cairo-svg-surface.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit c07867c545d7ab7c4a104944768f8a5b69ef9596 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:55:02 2007 -0500 + + [glitz] Mark some constant static structures as const + + src/cairo-glitz-surface.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 88632575bfae348a63e3e6228d5ceaa64715ae5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:54:20 2007 -0500 + + [PS/PDF/SVG] Rename internal symbols to have _cairo_*_surface prefix + + src/cairo-pdf-surface.c | 74 +++++++++++++------------- + src/cairo-ps-surface.c | 52 +++++++++--------- + src/cairo-svg-surface.c | 136 ++++++++++++++++++++++++------------------------ + 3 files changed, 131 insertions(+), 131 deletions(-) + +commit 2cc1c73705d70f834b43996f70080860ac66e57d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:53:27 2007 -0500 + + [cairoint] Move endian-conversion routines into cairoint.h + + src/cairo-cff-subset.c | 28 ---------------------------- + src/cairo-truetype-subset.c | 37 ------------------------------------- + src/cairoint.h | 35 +++++++++++++++++++++++++++++++++++ + 3 files changed, 35 insertions(+), 65 deletions(-) + +commit 62e864e73cd1136b3c0e889dca43a1c0cc648b21 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:51:35 2007 -0500 + + [Type1] Add cairo-type1-private.h that Type1 fallback and subset code share + + doc/public/Headers.mk | 1 + + src/Makefile.am | 1 + + src/cairo-type1-fallback.c | 14 +++++--------- + src/cairo-type1-private.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-type1-subset.c | 18 +++++++----------- + 5 files changed, 59 insertions(+), 20 deletions(-) + +commit ef9799d596600aea334707d2ff00fcca82280d83 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:49:51 2007 -0500 + + [cosmetic] Remove static var from testing code in bentley-ottman. + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 92d331a23407c79d83bf0b2a7d003ba3525641d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 7 13:31:54 2007 +0000 + + Fix up the trivial leaks found by valgrind. + + perf/cairo-perf.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 7d972086d6ea6a6bfa47b5fb47f7a21be61e10e8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Mar 7 12:19:44 2007 +0000 + + Add valgrind/callgrind targets to Makefile. + + perf/Makefile.am | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 734d32ed7a50284fcc8984af67734bb306735691 +Author: Emmanuel Pacaud <emmanuel.pacaud@lapp.in2p3.fr> +Date: Tue Mar 6 15:49:53 2007 -0800 + + SVG: Fix CAIRO_EXTEND_REFLECT for radial gradients. + + This patch also handles cases where r0 > r1, (one circle must still + be wholly contained within the other as that's all SVG supports). + + This patch should also prevent a crash when r0 == r1. + + src/cairo-svg-surface.c | 337 +++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 277 insertions(+), 60 deletions(-) + +commit 32536a7b794c38ff1944b8af5e56e8962e76c311 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue Mar 6 23:45:23 2007 +0000 + + [atsui] clean up warnings + + Just tidying up warnings left behind by previous fixes. + + src/cairo-atsui-font.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit 9032bf4e2d3bffe84d11a771ba4072cdd8926b77 +Author: Brian Ewins <Brian.Ewins@gmail.com> +Date: Tue Mar 6 23:24:33 2007 +0000 + + [quartz] rename remaining nquartz symbols to quartz. + + Renaming any nquartz symbols and files left to quartz. + + doc/public/Makefile.am | 1 - + src/Makefile.am | 2 - + src/cairo-quartz-private.h | 6 +- + src/cairo-quartz-surface.c | 238 ++++++++++++++++++++++----------------------- + 4 files changed, 122 insertions(+), 125 deletions(-) + +commit b0d05f7421c457120b9d86a83c4935c67b217fab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 6 14:26:51 2007 -0500 + + [configure.in] Remove AM_MAINTAINER_MODE + + Maintainer-mode is known broken behavior and discouraged. It has + created headaches before when you run configure and all in a sudden + editing Makefile.am's does not trigger a Makefile update... + + configure.in | 2 -- + 1 file changed, 2 deletions(-) + +commit f7beb220df74fef60c102fb5cc827fb2d3962296 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 6 10:33:09 2007 -0500 + + Remove extra word in docs + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 81b98c93b68839d20d3033170eeb5026257d52b8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Mar 6 23:11:38 2007 +1030 + + PDF: Set page group color space to DeviceRGB + + See http://lists.freedesktop.org/archives/cairo/2006-November/008551.html + + src/cairo-pdf-surface.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 8f0ff52cf74fe4b18c46f9a62689b991645295d0 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Mar 6 01:39:37 2007 -0800 + + Increment version to 1.4.1 after making the 1.4.0 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.pre-1.8 b/ChangeLog.pre-1.8 new file mode 100644 index 000000000..87e76cf1f --- /dev/null +++ b/ChangeLog.pre-1.8 @@ -0,0 +1,11558 @@ +commit 6b3aa86b1c5b2fce3e56b43142c4ec2664a37032 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 15:48:14 2008 -0700 + + Increment cairo version to 1.8.0. + + cairo-version.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e1560eceab109a051926d04d9aa578c3c991fe88 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 15:27:08 2008 -0700 + + NEWS: Add notes for the 1.8.0 release. + + Heavily cribbed from 1.7.x snapshot NEWS of course. + + NEWS | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 166 insertions(+), 4 deletions(-) + +commit 9a210ab228a3afa9d19b699b772893ea3303f38f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 15:53:44 2008 -0700 + + Add missing reference images REFERENCE_IMAGES list. + + The standard ritual before being able to release. + + test/Makefile.am | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 1d896aa9d89ff79239b3754da617201968072ea1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 15:40:28 2008 -0700 + + Actually remove cairo_has_show_text_glyphs + + The release notes for 1.7.6 say that we had dropped this + function, but apparently we had only planned to do that + and didn't actually get around to it until now. + + Thanks to the RELEASING insctructions which gave a diff + command that pointed out this problem. + + doc/public/cairo-sections.txt | 1 - + doc/public/tmpl/cairo-text.sgml | 9 --------- + src/cairo-gstate.c | 8 +------- + src/cairo.c | 36 +++++------------------------------- + src/cairo.h | 3 --- + src/cairoint.h | 4 ---- + 6 files changed, 6 insertions(+), 55 deletions(-) + +commit 483ab915c0fd891dffc0390ba4a1c96c1f06e30f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 15:25:54 2008 -0700 + + Remove excessive whitespace. + + It looks sloppy (and wastes space) to have two blank lines + where one will do. + + README.win32 | 10 ---------- + 1 file changed, 10 deletions(-) + +commit e52f0fe8bdfea16dad5a32b646b57c7734e79e0f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 14:09:34 2008 -0700 + + Ignore test/png-test.png + + Finally, "git status" is clean after "make distcheck". + + test/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit c62b4c73863efa3948df8bdd57ac604ef6d195be +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Sep 25 16:57:38 2008 -0400 + + [user-font-rescale] Do proper ref-counting of substitute font + + The problem showed up on OS X because the freetype backend reuses font_face_t's + which kept the reference count high enough for long enough to avoid the problem. + + test/user-font-rescale.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit cd540dc22e1145781119fb9a973dd9ae6bb7401f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 13:37:53 2008 -0700 + + Update text-antialias-subpixel reference image. + + Now that we reverted back to cairo's code for sub-pixel + text rendering, we need to update the reference image + to match it. + + test/text-antialias-subpixel-ref.png | Bin 974 -> 1102 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 5d887ad5dca5af0f8216830d1b04d08a5aba9bee +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 13:31:20 2008 -0700 + + Remove all lcd_filter code. + + We reverted the public API for setting lcd_filter font options + back in 1b42bc8033bc , but we had left the implementation which + would examine fontconfig and Xft properties for the option, and + which would call into freetype for subpixel glyph rasterization. + + However, I recently realized, (and the test suite had been trying + to tell me for a while), that this approach would cause a + regression for users who were previously using sub-pixel text, + but without sub-pixel rendering built directly into freetype. + That's not acceptable, so all the code is coming out for now. + + src/cairo-font-options.c | 51 +--- + src/cairo-ft-font.c | 672 +++++++++++++--------------------------------- + src/cairo-surface.c | 1 - + src/cairo-types-private.h | 26 -- + src/cairo-xlib-screen.c | 28 -- + src/cairoint.h | 7 - + 6 files changed, 190 insertions(+), 595 deletions(-) + +commit 3d32e7110ba1fedb0bec96238d14245579f5bce1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 02:58:01 2008 -0700 + + Note that we're using ghostscript 8.62 now for reference images. + + As opposed to 8.61. + + I had actually forgotten we had documented this. If I had + remembered I could have put more meaningful messages with + some of my recent updates to ps-specific reference images. + + test/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a172d87b4cbcc0bda9c376ab5c5cfdea2e20db63 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 02:49:44 2008 -0700 + + Make device-offset-scale an XFAIL test due to SVG failure. + + It's sad to have to do this. Back with commit 1a9809baa was the + original fix for device-offset-scale, (right after the test was + added), and it fixed it for all backends, including SVG. The fix + involved combining device_transform and CTM into the pattern matrix. + + But then, we added the mask-transformed-image and + mask-transformed-similar tests, and commit 20be3182ef29 for fixing an + SVG-specific bug with masks. That fix involved subtracting away the + pattern matrix when emitting a mask to adhere to SVG semantics. + + Unfortunately, this change also made the device-offset-scale test + start failing. A correct fix would probably subtract away only the CTM + portion and not the devive_transform. However, the + _cairo_svg_surface_mask function sees only a pattern matrix and + doesn't know how to separate it into CTM and device_transform pieces. + + So fixing this will probably require a change to the surface-backend + interface. And since we're not willing to do that so close to a major + release, we're adding yet another XFAIL. + + test/Makefile.am | 1 + + test/device-offset-scale.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 36eef09b583077a899e446d5f28b5cc15335cf5f +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 02:30:00 2008 -0700 + + Update pdf-specific reference images for mask test. + + Something had changed to introduce some very minor rasterization + details around the circles. + + test/mask-pdf-argb32-ref.png | Bin 7834 -> 8881 bytes + test/mask-pdf-rgb24-ref.png | Bin 7383 -> 8267 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 503506bf0dbfbc0be92f1461afa8683227732809 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 02:16:47 2008 -0700 + + Add pdf-specific reference image for mask-transformed-similar + + Thanks to help from Chris, we fixed the bug that was making this + test fail with the PDF backend. All that was left was differing + treatment of the edges of the image---easy enough to address + with a pdf-specific reference image. + + test/mask-transformed-similar-pdf-ref.png | Bin 0 -> 4213 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 31ff6c863ff82bd7339a03297e4b5a9adea0b1c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 09:47:58 2008 +0100 + + [pdf] Explicitly order the sequence of checks when analyzing masks + + There is an implicit precedence when analyzing patterns for + compatibilty, in order of descending precedence: + fatal error + unsupported + needs image fallback + needs meta-surface analysis + success. + + So wehen we have two patterns, we need to check both analysis statuses + simulataneously, in order to correctly report the combined status. + + src/cairo-pdf-surface.c | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +commit 69635bc054a823afe1ca378fffac1b2daabdf594 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 01:52:45 2008 -0700 + + Fix the analysis of mask operations (fixing mask-transformed-similar test case) + + The primary bug here was some missing braces. The code was conditionally + assigning to backend_status, but then unconditionally checking for the + value assigned. The result was the leaking of an internal status value + (CAIRO_INT_STATUS_ANALYZE_META_SURFACE) which finally resulted in + an incomplete PDF file in the mask-transformed-similar test case. + + While fixing this, also avoid re-using the backend_status variable so + much so that the code is more readable. + + src/cairo-analysis-surface.c | 37 ++++++++++++++++++++++++++----------- + 1 file changed, 26 insertions(+), 11 deletions(-) + +commit 5599b08dfaf5897f58b3456732dc9c241502b4c4 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 01:42:03 2008 -0700 + + Drop _cairo_analysis_surface prefix from some static functions + + Since these functions are static we don't really need the full + name. And these two functions were both so long that they were + causing some serious line-wrap issues. + + src/cairo-analysis-surface.c | 43 ++++++++++++++++++------------------------- + 1 file changed, 18 insertions(+), 25 deletions(-) + +commit aae476807c079c6514fb7013092c5c303336d8df +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 00:18:23 2008 -0700 + + Update ps-specific reference image for rotate-image-surface-paint + + The only difference here is a tie-breaker condition for image- + sampling position. While we care about that when it's under our + control, (pixman rasterization), we don't have precise + requirements for ghostscript's sampling. So we can capture the + current result as a reference. + + test/rotate-image-surface-paint-ps-ref.png | Bin 275 -> 212 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a501f8f6d84bcac12b48e226ab653ae237b1a603 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 00:14:13 2008 -0700 + + Mark degenerate-path and miter-precision as XFAIL. + + These two tests currently fail only for the PS backend, + but they've done so since before the last major release. + The final image result we're getting is definitely wrong + in both cases, but we have not yet been able to verify + if this is due to bugs in cairo (generating PostScript) + or in ghostscript (interpreting and rasterzing the + PostScript). + + test/Makefile.am | 2 ++ + test/degenerate-path.c | 3 ++- + test/miter-precision.c | 2 +- + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit e279eeb7ddae445015ac1a582d4aab2e68f03c94 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 25 00:08:03 2008 -0700 + + Make the bitmap-font an XFAIL. + + We've had these PDF and PS failures here for a *long* time, + (before the last major release for sure). It's a bug, but + we expect it to be there, so advertise it that way. + + test/Makefile.am | 1 + + test/bitmap-font.c | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit 261dd83b31adb4a6b4d80f626b9d5fde5eb4d8f6 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 21:55:53 2008 -0700 + + Eliminate paranoid check for PNG_INTERLACE_NONE. + + Commit 20b1b33c0fc7 added some "paranoid checks" to our png + loading code. One of these was checking that if png_get_IHDR + first reports an interlace value other than PNG_INTERLACE_NONE + that after we call png_set_interlace_handling then we do + get PNG_INTERLACE_NONE from the next call to png_get_IHDR. + + However, libpng doesn't seem to actually have that behavior. + When testing cairo_image_surface_create_from_png with an + interlanced PNG file, (which the test suite happens not to + do---even now), the call to png_set_interlace_handling is + doing the trick, but the check for PNG_INTERLACE_NONE is + failing. + + So, with the check in place, loading an interlaced PNG image + fails with CAIRO_STATUS_READ_ERROR. By simply removing + that check, an interlaced image loads just fine. + + src/cairo-png.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94d2820c6f64a2da13e6aeb4698198a3d4d0669b +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 18:38:21 2008 -0700 + + Update ps-specific reference image for ft-text-vertical-layout-type3 + + Something, (gs interpreter version?), changed and caused a + very minor rasterization change. + + test/ft-text-vertical-layout-type3-ps-ref.png | Bin 1867 -> 1804 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 8a49cfa03a23ed29ea0b310536a3d332af76332c +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 18:34:43 2008 -0700 + + Update all reference images for ft-text-vertical-layout-type1. + + This is one of those chronically fragile tests. I'm assuming + some font changed or something, because the glyph positions + shifted (consistently) across all the backend. Doesn't look + like a bug. + + We'll really need to do proper bundling of all font data to + avoid issues like this. + + test/ft-text-vertical-layout-type1-pdf-ref.png | Bin 3604 -> 3968 bytes + test/ft-text-vertical-layout-type1-ps-ref.png | Bin 1910 -> 1846 bytes + test/ft-text-vertical-layout-type1-ref.png | Bin 3960 -> 3980 bytes + test/ft-text-vertical-layout-type1-svg-ref.png | Bin 3934 -> 3973 bytes + 4 files changed, 0 insertions(+), 0 deletions(-) + +commit 3ae894a9fd5152821e1b427aff298c3f8ae00298 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 18:29:00 2008 -0700 + + Update reference image for smask-text test. + + Very minor rasterization differences crept in here + from somewhere. Of course, it would be easier to + identify from *where* if we documented all the versions + of the various external libraries used in creating + reference images. But for now, the versions on the + machine of the person making the release win. + + test/smask-text-ref.png | Bin 1739 -> 1777 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit ab406eeac1817e62d2c0a737db898ba56c3031ff +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 18:24:46 2008 -0700 + + Add svg-specific reference image for user-font-rescale. + + The difference here was just edge effects, (the kind of + thing that looks like glyph rasterization differences + but might in fact be due to minor rounding differences + in glyph positions). Either way, there's no problem + with respect to what the test is exercising. + + test/user-font-rescale-svg-ref.png | Bin 0 -> 15741 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 453443d77acadc705a4b9ddeb96f853364c96ad2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 25 01:08:46 2008 +0100 + + [test] Write the OUTPUT filename to the log if we match the vector surface. + + If the vector surface matches the output from last time, then the + rasterisation is skipped - but we need to write the expected OUTPUT + filename to the log so that the image is referenced from index.html. + + test/cairo-test.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit e84ef3c54e0f95d321be8d8f47c5c9c60a2c6b3f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 20:00:30 2008 -0400 + + [.gitignore] Remove Makefile.*.config + + I renamed those generated files to Makefile.*.features but forgot to + update ignore lists. Carl already added the new ones, but didn't + remove the old ones. + + boilerplate/.gitignore | 2 -- + src/.gitignore | 2 -- + 2 files changed, 4 deletions(-) + +commit 62107b8015f0d359397a02d4f0fecf22647330b9 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 16:51:44 2008 -0700 + + Mark several new tests added during 1.7 as XFAIL. + + The following tests were added during the 1.7 cycle to + demonstrate bugs: + + alpha-similar operator operator-alpha self-copy-overlap + + In all cases, the identical bug existed in the last major + release, (1.6.4), so these are not new regressions, but merely + bugs that we're now aware of. The correct way to handle bugs + such as these is to mark them as expected failures (XFAIL). + + test/Makefile.am | 4 ++++ + test/alpha-similar.c | 3 ++- + test/operator-alpha.c | 3 ++- + test/operator.c | 3 ++- + test/self-copy-overlap.c | 3 ++- + 5 files changed, 12 insertions(+), 4 deletions(-) + +commit c3750cf2187e6b590a93761cb28ad63d2806f81d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 16:32:58 2008 -0700 + + Remove the device-offset testing (-25 cases) for the release. + + The reasoning behind the -25 testing is that we want to ensure + that cairo provides translation invariance. However, for + many vector backends we use external rasterizers that don't + necessarily provide that translation invariance. + + So this testing makes a bunch of failures appear that we don't + really care about, (and we don't even have a mechanism to turn + them off with custom reference images). For the release, I'm + just turning this off. + + After the release, I plan to turn this back on, and then we could + fix this by ensuring that the vector output itself is unaffected + by a device offset, or by moving away from external rasterizers, + (see Chris's micro-gs work to test PostScript with cairo-based + rasterization). + + test/cairo-test.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ea4d0bafb3d374e491f3956347c7510ea7b0d2b8 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 16:25:38 2008 -0700 + + Add svg-specific reference image for mask-transformed-similar. + + The only difference in this case is whether there is blurring + of the image around the edges. That's a rasterization issue + that we don't care about, (we're testing that the correct + transformation is applied). + + test/mask-transformed-similar-svg-ref.png | Bin 0 -> 4051 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit f939e46304093cad4d8bc3f545cc49a2888fd59f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 16:21:57 2008 -0700 + + Add pdf-specific reference images for gradient-constant-alpha. + + Like many other gradient tests, we're just capturing the buggy + output of poppler here, (though this time I *did* verify with + Adobe acroread that our PDF output seems to be correct). + + test/README | 1 + + test/gradient-constant-alpha-pdf-argb32-ref.png | Bin 0 -> 116 bytes + test/gradient-constant-alpha-pdf-rgb24-ref.png | Bin 0 -> 115 bytes + 3 files changed, 1 insertion(+) + +commit 9335ad313fdc97c3c8d0e532319ac3f58c7f69fc +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 16:20:35 2008 -0700 + + Ignore generated files. + + I know that I didn't create these Makefile.win32.features files, + so I assume that they are the result of Behdad's build magic and + that he just forgot to add them to .gitignore. + + boilerplate/.gitignore | 2 ++ + build/.gitignore | 2 ++ + src/.gitignore | 2 ++ + 3 files changed, 6 insertions(+) + +commit 06594abc6b74a8260f92f7d9686f2ae5ce84e59f +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 16:03:12 2008 -0700 + + Add pdf-specific reference images for fill-alpha-pattern. + + These capture the current poppler output, (rather than the + ideal output). We're still waiting for poppler to start + using cairo gradients before this test will run through + cleanly. And even with these new reference images, there's + still some translation variance, so the -25 tests still + fail. + + test/README | 1 + + test/fill-alpha-pattern-pdf-argb32-ref.png | Bin 0 -> 3887 bytes + test/fill-alpha-pattern-pdf-rgb24-ref.png | Bin 0 -> 3840 bytes + 3 files changed, 1 insertion(+) + +commit 64541a58aeafece3956bbe4cc4ec3bc2226d3d2a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 24 15:52:05 2008 -0700 + + Add pdf- and ps-specific reference images for device-offset-fractional + + We don't care about the specifics of rasterization in the viewer + here, (though it still might be worth being more careful about + how we set /Interpolate---but that's not the point of this test). + + test/device-offset-fractional-pdf-ref.png | Bin 0 -> 277 bytes + test/device-offset-fractional-ps-ref.png | Bin 0 -> 201 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit ba7ef8b40e5615de295932b654806345065019c1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 22:35:40 2008 +0100 + + [configure.ac] Bump poppler dependency to 0.9.2 + + poppler-0.9.2 is required for replaying user-fonts correctly. + + configure.ac | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit dfe9f7093f9a226e58dc531b54b32a3f169fea96 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 22:16:39 2008 +0100 + + Revert "[pdf] Tweak the mask analysis to avoid an assertion failure." + + This reverts commit c9ec82f3a89cdd57277be6a9a6cb3e05d82fb206, which + notably caused regresions in the mask and clip-operator tests. + + Obviously I'm not smart enough to fix bugs. Since the computer found the + assertion failure, I need to train the computer to fix the bugs as well. + + src/cairo-pdf-surface.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit ab682a6ff28ca89cc0dd8fd641a0bbc42487f613 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 17:22:51 2008 -0400 + + Add README.win32, courtesy of Damian Frank + + AUTHORS | 1 + + HACKING | 2 +- + Makefile.am | 1 + + README.win32 | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 74 insertions(+), 1 deletion(-) + +commit 5a06ca852c909f8225d7b6e7f29668b0ac79898f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 17:16:15 2008 -0400 + + [Makefile.win32] Also report installing cairo-version.h and cairo-features.h + + Those two files needs special care and hence are not listed in + enabled_cairo_sources. + + src/Makefile.win32 | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a91101df319e11eb3d6e38b5cfa85d9ac9e7d815 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 17:15:44 2008 -0400 + + [Makefile.sources] Remove mention of cairo-features-win32.h + + That file is not generated anymore. Instead, cairo-features.h is + generated from Makefile.win32 on the fly. + + src/Makefile.sources | 4 ---- + 1 file changed, 4 deletions(-) + +commit 55e06745a639d86921e48ff56aa0c375a46d6421 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Thu Sep 25 00:17:57 2008 +0300 + + [perf-suite] Explicitly read the results of rdtsc from edx:eax. + + The =A format used to read a 64 bit result from rdtsc works on x86, + but not on x86-64. + + perf/cairo-perf-posix.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2fb59b3ebd885e109160326825325be3907ed48e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 17:09:54 2008 -0400 + + [Makefile.win32] Report which files to install + + The win32 build system has no way to install anything, but it has + full knowledge of what needs to be installed (which headers). So + we now report files to be installed at the end of the build. + + src/Makefile.win32 | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 6eee90784ea8174b346e389c2f61b599543685e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 15:01:06 2008 -0400 + + Enable CAIRO_HAS_UTF8_TO_UTF16 if PDF_OPERATORS is enabled + + We are being cheap and don't define the cairo_utf8_to_utf16 function + if no one is using it. Previously PS surface was not using it, but + after the pdf-operators merge, it was. + + Before this commit, building with PS but without PDF failed. Fixing. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bb125689d3d3e623f84a02f4b6f2a0c8f5a7901f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 14:55:20 2008 -0400 + + Simplify preprocessor conditional syntax + + We never do #ifdef-type conditions on CAIRO_HAS_* macros, because we + want to allow setting them to zero. Then if we need to enable a feature + if either of PS or PDF is enabled, the proper syntax is: + + #if CAIRO_HAS_PS_SURFACE || CAIRO_HAS_PDF_SURFACE + + This works because the preprocessor replaces any unknown identifiers with + zero. Some versions of gcc had a bug that got them very confused with + complex versions of the above. As a workaround for that I have been using + the uglier version: + + #if CAIRO_HAS_PS_SURFACE+0 || CAIRO_HAS_PDF_SURFACE+0 + + which magically worked around that bug. Or more recently replacing that + with the duplicated version: + + #if CAIRO_HAS_PS_SURFACE + ... + #endif + #if CAIRO_HAS_PDF_SURFACE + ... + #endif + + Both are uglier than the original. Since the gcc bug was very short lived + and there's lots of software out there relying on the original form to work, + moving back to the simple version seems harmless. + + src/cairoint.h | 15 +++------------ + 1 file changed, 3 insertions(+), 12 deletions(-) + +commit adece69ae362bdfb018f5886d76a792c44dafd7e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 19:17:22 2008 +0100 + + [test] Add a test case to question the mutability of sources. + + Are patterns mutable? The image backend is quite happy to write and read + from the same surface, whereas the vector targets create snapshots... This + test case exploits that inconsistency. + + Also the interested reader will note that not only does this demonstrate + translational invariance, but a discrepancy with similar surfaces. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/self-copy-overlap-ref.png | Bin 0 -> 1140 bytes + test/self-copy-overlap-rgb24-ref.png | Bin 0 -> 608 bytes + test/self-copy-overlap.c | 56 +++++++++++++++++++++++++++++++++++ + 5 files changed, 60 insertions(+) + +commit 88188eababa7c6dafeb064662a77b8f5f3719593 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 09:49:09 2008 +0100 + + [test] Memleak in new mask-ctm-* tests. + + Add the forgotten cairo_surface_destroy(). + + test/mask-transformed-image.c | 3 +++ + test/mask-transformed-similar.c | 3 +++ + 2 files changed, 6 insertions(+) + +commit 8f157303681a3d58471ffbe004bc140b7a3a48be +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 18:39:29 2008 +0100 + + [test] Rename mask-ctm-* to avoid conflict with mask-ctm. + + Using mask-ctm-image as a test name was causing a naming conflict with + mask-ctm, so rename the new tests. + + test/.gitignore | 4 +- + test/Makefile.am | 8 +-- + test/mask-ctm-image-ref.png | Bin 4516 -> 0 bytes + test/mask-ctm-image.c | 100 --------------------------------- + test/mask-ctm-similar-ref.png | Bin 4516 -> 0 bytes + test/mask-ctm-similar.c | 102 ---------------------------------- + test/mask-transformed-image-ref.png | Bin 0 -> 4516 bytes + test/mask-transformed-image.c | 100 +++++++++++++++++++++++++++++++++ + test/mask-transformed-similar-ref.png | Bin 0 -> 4516 bytes + test/mask-transformed-similar.c | 102 ++++++++++++++++++++++++++++++++++ + 10 files changed, 208 insertions(+), 208 deletions(-) + +commit 444d44acde4ac73641c789c19ec7a3199211b594 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 18:12:22 2008 +0100 + + [stroke] Cap trailing segment when skipping invisible segments. + + If we do not maintain the current_face even for invisible dashed segments, + then we will generate spurious line segments when attempting to close the + path (ala leaky-dashed-rectangle). + + This fixes the long standing regression introduced just prior to 1.6 and + captured in these bug reports: + http://lists.cairographics.org/archives/cairo/2008-April/013912.html + http://bugs.freedesktop.org/show_bug.cgi?id=17177 + + src/cairo-path-stroke.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 9fc745ae9fbbc24ce3f6fa5728c36fa6819b85a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 24 13:17:22 2008 -0400 + + Revert "[build] Use mkdir -p portability macros" + + This reverts commit 03c37f56b2d3ecc0e197194364b216183dacc24a. + + The AC_PROG_MKDIR_P is also one of those autoconf macros defined + in newer versions only. Since we use mkdir -p in releasing scripts + only, it's not a big deal if it's not portable. + + build/Makefile.am.releasing | 2 +- + build/configure.ac.tools | 1 - + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit b5b1134c2c84996bd8e019d5908b18db876137dc +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Sep 24 17:39:33 2008 +0100 + + [tessellator] Skip edges that lie outside the region of interest. + + We don't need to tessellate edges strictly above or below the + the limits of the traps. + + src/cairo-bentley-ottmann.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 018a64bf7f3ccdf3982655c93701eafc99fd0b93 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Sep 24 17:33:36 2008 +0100 + + [traps] Impose limits on traps for cairo_in_(fill|stroke) + + We don't need to tessellate edges strictly above or below the + hit-test point. + + (Patch split and modified by Chris Wilson to apply to cairo_in_stroke() + as well - all bugs are his alone.) + + src/cairo-gstate.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit 8c0ff8b5856a8a7cb61dffaad7d72ed2dcdb5cf3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 17:03:49 2008 +0100 + + [cairo] Define min-tolerance in terms of cairo_fixed_t + + By using the cairo_fixed_t macros we can compute the correct minimum + tolerance for any configuration. + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c9ec82f3a89cdd57277be6a9a6cb3e05d82fb206 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 15:01:25 2008 +0100 + + [pdf] Tweak the mask analysis to avoid an assertion failure. + + Both the source and mask need to be analyzed and checked for an + UNSUPPORTED operation before determining the best course of action. + As before this is simply decided based on the requirements of the + source. + + src/cairo-pdf-surface.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit b9c92842d9c091e34738d14f7baf6f357a1f085c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 11:38:21 2008 +0100 + + [trap] Trivial reject if trapezoid is entirely above or below + + Also check whether is vertically within limits. + + src/cairo-traps.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 911d5f1a254f800fe18f4554b738006aa0a693a2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 11:34:27 2008 +0100 + + [traps] Adjust lines if either point is on the boundary. + + If either point lies on the limit and the other outside, adjust the line + to be parallel to the boundary. This adjusts the previous test where both + points needed to be entirely outside. + + src/cairo-traps.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 7357e80054b80a9906783ed910282bb79f31cdfd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 11:32:11 2008 +0100 + + [clip] Limit traps. + + Apply prior knowledge to limit the traps during clipping to avoid + generating extra work. + + src/cairo-clip.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +commit c36a242303c99f59ba210d6c0dae831b2efb83fc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 11:12:05 2008 +0100 + + [traps] Replace open-coding of box->rectangle->box + + Use the utility functions _cairo_box_from_rectangle and + _cairo_box_round_to_rectangle() instead of open-coding. Simultaneously + tweak the whitespace so that all users of traps look similar. + + src/cairo-analysis-surface.c | 47 +++++++++++--------------------------------- + src/cairo-clip.c | 4 ++-- + src/cairo-surface-fallback.c | 16 +++------------ + 3 files changed, 17 insertions(+), 50 deletions(-) + +commit 49b9a21e0bfeed5a1e2f33162a7b1c9e67de1d75 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 01:56:44 2008 +0100 + + [test/any2ppm] Handle filenames with multiple-dots. + + Use strrchr() to find the extension, as strchr() is fooled too easily. + + As spotted by Carlos Garcia Campos. + + test/any2ppm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 651c6598c98118ba04bc4970557c24241b91dab0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 24 00:49:03 2008 +0100 + + [traps] Limit extents to imposed constraints. + + When reporting the extents of the traps, constrain them to the imposed + limits. This is relied upon in the analysis-surface which sets the + limits on the traps (based on clip/surface extents) and then reports the + extents of the traps as the region of the operation. + + src/cairo-traps.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +commit 0baf12f450e12b9f2fb4e55bfeb7738dd5145cbd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 23 19:18:00 2008 -0400 + + [scaled-font] Another typo fix in the comments + + Both this and previous one kindly pointed out by Carl. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70207aadfdb580029c81ac87e2d1aa66cc6c5b30 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 23 19:11:08 2008 -0400 + + [mutex] Fix typo in comments + + src/cairo-mutex-impl-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0a4a6213e2ab915098b6fdc8bd2652cd5026599c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 21:12:55 2008 +0100 + + [fill] Check for the most common rectilinear case first. + + Avoid the iterative search for the extreme points by first checking the + most likely arrangement (as produced by cairo_rectangle() under no + transformation). + + src/cairo-path-fill.c | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit 8f51ea4657d872f75e1a6493aadcc769fd3b9324 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 23 23:19:02 2008 +0100 + + [pattern] Beware unsigned wrap-around with pathological surface patterns. + + A surface pattern under an extreme transformation could lie entirely in + the negative quadrant. This would trigger the fixup such that it's lower + left corner was clamped to the origin, but the upper right corner was left + unchecked. This could result in the width,height being negative and + wrapping around to large values instead of being clamped to 0. + + src/cairo-pattern.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3c6d3684e965523acdeec9f24ccf71bf4e974622 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 23 22:52:42 2008 +0100 + + [test] Add a test case for create_similar(CONTENT_ALPHA) + + Application of a pure-alpha similar source is inconsistently handled + across the backends. The PDF/PS backends allow the rgb channels to bleed + through and the SVG backend mixes in pure white. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/alpha-similar-ref.png | Bin 0 -> 99 bytes + test/alpha-similar-rgb24-ref.png | Bin 0 -> 99 bytes + test/alpha-similar.c | 76 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 80 insertions(+) + +commit 5e5408412694bf067e47d12c9c739801452d8f41 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 23 21:49:37 2008 +0100 + + [test-meta] Use real meta-surface snapshot. + + The meta-surface workaround an old bug, which is no longer present in the + tree and open-coded the surface snapshot. However, the workaround itself + was buggy (not respecting the surface content). The lesson to take away + from this is not to add workarounds in test code for bugs in the library! + + src/test-meta-surface.c | 35 ----------------------------------- + 1 file changed, 35 deletions(-) + +commit 03c37f56b2d3ecc0e197194364b216183dacc24a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 23 17:15:07 2008 -0400 + + [build] Use mkdir -p portability macros + + build/Makefile.am.releasing | 2 +- + build/configure.ac.tools | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit ae0511fbbe6c01b5fe8dfa531b3eaa791314931f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 23 20:00:18 2008 +0100 + + [pdf] Do not modify the dashes in-place. + + As PS has different semantics regarding a zero-length dash, we need to + adjust the dash array before emitting. However, we need to modify a copy + of the dash array since the same array may be used by the meta-surface + when replaying to an image fallback. + + src/cairo-pdf-operators.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit b7ab1fc791139f5d0fd38692b63514ed02bc8b51 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 23 10:51:13 2008 +0100 + + Return the real error status for set_user_data() + + Instead of returning a new NO_MEMORY error, return the status from the + error object. + + src/cairo-font-face.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-scaled-font.c | 2 +- + src/cairo-surface.c | 2 +- + src/cairo.c | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit 0204d2f4e2dd89f1fcf06f2d18e68f6ab7452f91 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 23 22:38:55 2008 +0930 + + Replace two boolean args with one enum arg + + The use of multiple booleans in a function call can make it easy to + mix up the parameters. + + src/cairo-scaled-font-subsets.c | 31 +++++++++++++++++++++++-------- + 1 file changed, 23 insertions(+), 8 deletions(-) + +commit 5a3f03623c7ac0414bafc490c927e1f2282839d1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 23 04:11:48 2008 -0400 + + [Makefile.win32] Add comments about where to edit for customization + + Makefile.win32 | 3 +++ + build/Makefile.win32.common | 3 +++ + 2 files changed, 6 insertions(+) + +commit afb32c7f076dbbe4c965fc02226208596f41f59e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 23 03:52:43 2008 -0400 + + [src/Makefile.am.analysis] Fix out-of-tree build + + src/Makefile.am.analysis | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit fba0211ed6f649b9d61a9f2b3d83096dd801cb14 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 23:41:07 2008 -0400 + + [Makefile.win32] Add makefile rules to generate cairo-features.h + + Makefile.am | 2 ++ + Makefile.win32 | 5 +---- + build/configure.ac.features | 20 ++++++++++++++++++++ + src/Makefile.am | 4 ++-- + 4 files changed, 25 insertions(+), 6 deletions(-) + +commit 0bedbe78fe236cc9dabec87dea0f71714acfb76a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 22:34:57 2008 -0400 + + [Makefile.win32] Misc cleanup + + build/Makefile.win32.common | 29 +++++++++++++++++++++-------- + src/Makefile.win32 | 8 ++++---- + 2 files changed, 25 insertions(+), 12 deletions(-) + +commit ebb5eb57b7cab7e5fc4b3215969a459f49d95fbb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 21:18:09 2008 -0400 + + Generate build/Makefile.win32.features + + Makefile.am | 10 +++++++- + boilerplate/Makefile.am | 7 +++--- + build/Makefile.win32.common | 6 +++-- + build/aclocal.makefile.m4 | 57 +++++++++++++++++++++++++++++++++------------ + build/configure.ac.features | 5 +++- + src/Makefile.am | 8 ++++--- + 6 files changed, 67 insertions(+), 26 deletions(-) + +commit fd5cef50a7c856ef80b0a2191170c6a377071e78 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 20:48:14 2008 -0400 + + [aclocal] Add support for automake-only or win32-only makefiles + + build/aclocal.makefile.m4 | 66 ++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 56 insertions(+), 10 deletions(-) + +commit 42e4103015981b874035fac4f5e70018568db0d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 20:33:23 2008 -0400 + + [aclocal] Don't do automake conditionals for builtin features + + build/aclocal.makefile.m4 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 79bc967a0dd1319035f0b915759eb86a49007f8d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 20:20:02 2008 -0400 + + [build] Make including Makefile.win32.features files more robust + + By using top_srcdir if available. Make's include is relative to + current dir, not the Makefile being processed. That makes it hard + to include Makefile's relatively. + + build/aclocal.makefile.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e686a00da8a84d28b7a00698a4fd744cd4dfd867 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 20:11:10 2008 -0400 + + [build] Add CAIRO_CONFIG_MAKEFILE_PRIVATE + + build/aclocal.makefile.m4 | 24 ++++++++++++++++++------ + 1 file changed, 18 insertions(+), 6 deletions(-) + +commit 0ac7a242f829bd31fd7fe12e886fba687ea6dc5e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 19:43:08 2008 -0400 + + [build] Add Makefile.win32.common + + Makefile.win32 | 57 ++------------------------------------------- + boilerplate/Makefile.win32 | 21 ++--------------- + build/Makefile.win32.common | 47 +++++++++++++++++++++++++++++++++++++ + perf/Makefile.win32 | 26 ++------------------- + src/Makefile.win32 | 23 +++--------------- + test/Makefile.win32 | 22 ++--------------- + test/pdiff/Makefile.win32 | 6 ++--- + 7 files changed, 60 insertions(+), 142 deletions(-) + +commit 984320dff11d42d698ff5355c6befe0c5d32df59 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 19:29:17 2008 -0400 + + [build] Don't define feature variables in Makefile.win32.features + + This is not the right place to do that as one also needs to adjust + cairo-features.h. Working on a proper fix. + + build/aclocal.makefile.m4 | 27 --------------------------- + build/configure.ac.features | 22 ---------------------- + 2 files changed, 49 deletions(-) + +commit eb9ce580597b9ac639dd3dc15576774d753c44b6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 19:23:41 2008 -0400 + + [build] Don't generate Makefile conditionals for default=always features + + build/aclocal.makefile.m4 | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit caa3dbd61be8a46f576a60f00845269269200c99 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 19:11:52 2008 -0400 + + [build] Make Makefile.*.features files more readable + + By inserting a new line before each feature entry. + + build/aclocal.makefile.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 23b9767bb3b35995099ae9c7b3d84f18e7a76dcc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 22 17:34:36 2008 -0400 + + Rename Makefile.*.config to Makefile.*.features as they should not be modified + + The .config naming was giving people the impression that they can modify it. + That's not the case. + + autogen.sh | 6 +++--- + boilerplate/Makefile.am | 2 +- + build/aclocal.makefile.m4 | 10 +++++----- + doc/public/Makefile.am | 2 +- + src/Makefile.am | 2 +- + 5 files changed, 11 insertions(+), 11 deletions(-) + +commit 20be3182ef29bb07ffac749f5cf1844b4781e1bb +Author: Kai-Uwe Behrmann <ku.b@gmx.de> +Date: Mon Sep 22 10:10:51 2008 +0100 + + [svg] Counteract application of object matrix to mask. + + The expected behaviour for masking in Cairo is to set the mask according + to the current active matrix and apply unchanged to the masked surface. + + In SVG, the mask element is bound to the masked object and thus the local + matrix from that image object applies to the nested mask as well. + + Attached is a small patch for substracting the matrix of a image + surface from the matrix of the mask to comply to Cairo's behaviour. + I did not test for other stuff like vectors or text and would expect this + part is incomplete. + + AUTHORS | 1 + + src/cairo-svg-surface.c | 9 +++++---- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit 223e7b9ed0053f9569df4bafc7688439aeb12572 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 22 08:03:41 2008 +0100 + + [test] Add an exercise for masking an image using the ctm. + + Quote Kai-Uwe Behrmann: + "The expected behaviour for masking in Cairo is to set the mask according + to the current active matrix and apply unchanged to a to be masked + surface. + + In SVG the mask element is bound to the masked object and thus the local + matrix from that image object applies to the nested mask as well." + + This is a test case to exercise applying a mask to an image under + separate transformations. + + Original patch by Kai-Uwe Behrmann, altered to run the test against all + backends (where it causes poppler to crash on my machine <evil grin>). + + test/.gitignore | 2 + + test/Makefile.am | 4 ++ + test/mask-ctm-image-ref.png | Bin 0 -> 4516 bytes + test/mask-ctm-image.c | 100 +++++++++++++++++++++++++++++++++++++++++ + test/mask-ctm-similar-ref.png | Bin 0 -> 4516 bytes + test/mask-ctm-similar.c | 102 ++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 208 insertions(+) + +commit 3a45ff0e2fd624e52ddbf2b36fa70231405d79fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 18:35:10 2008 -0400 + + Make checks happy again + + Minor syntax changes and improved check regexps. + + src/cairo-mutex-impl-private.h | 2 +- + src/cairo-os2-surface.c | 4 ++-- + src/check-preprocessor-syntax.sh | 8 ++++---- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 9084f6baf6ab2ce9942b69720dac8201fd5e86cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 18:24:37 2008 -0400 + + [Makefile.win32] Fix various issues reported by Damian Frank + + We now compile cairo-system.c twice when building static library, but + that's fine because cairo-systemc. includes no other code. Indeed + that's why cairo-system.c was born in the first place. + + src/Makefile.win32 | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +commit 45609d840078288bf0fc096ee8bac642fed6674f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 18:17:19 2008 -0400 + + Add cairo-system.c for platform system-specific code + + This is where DLL initialization/finalization should be done for example. + Moved the one for win32. For OS/2 just left a comment as the code needs + more work. + + This change simplifies building shared and static libraries in the win32 + makefiles. + + src/Makefile.sources | 1 + + src/cairo-mutex-impl-private.h | 8 ++++ + src/cairo-os2-surface.c | 6 +++ + src/cairo-system.c | 97 ++++++++++++++++++++++++++++++++++++++++++ + src/cairo-win32-surface.c | 28 ------------ + 5 files changed, 112 insertions(+), 28 deletions(-) + +commit 9c2732395987a29ee764c575cce2b13e94152151 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 18:05:01 2008 -0400 + + [aclocal] In generated Makefile.win32.config, don't overwrite feature vars + + When I designed this first I thought people can define make vars on the + command line to override default features. That works. However, it's + natural to want to define the list of features in the toplevel Makefile + and not on command line. So, we don't override user's var now. They + can set a make feature var to 0 to disable it. + + build/aclocal.makefile.m4 | 5 ++++- + build/configure.ac.features | 16 ++++++++-------- + 2 files changed, 12 insertions(+), 9 deletions(-) + +commit 6d0d5e7ba07c084deafed7118f626415a6c23764 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 17:52:19 2008 -0400 + + Define cairo_public correctly for win32 + + I'm conditioning on _MSC_VER. Is this accurate? + Note that we never overwrite cairo_public. So one can define it to + something else. + + src/cairo.h | 6 +++++- + src/cairoint.h | 4 ++++ + 2 files changed, 9 insertions(+), 1 deletion(-) + +commit 11e96487d8994dd15b39b5ede5be189491f1c14a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 17:51:24 2008 -0400 + + [Makefile.win32] Remove a few unused macro declarations + + An undefined PACKAGE_BUGREPORT is not properly handled where it's used. + The other two were not being used after build system revamp. + + Makefile.win32 | 2 -- + 1 file changed, 2 deletions(-) + +commit fee72c26afff2120315ebbab32708520307e7a5e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 17:20:36 2008 -0400 + + Make sure feature macros are checked using #if, not #ifdef; add a test for it + + This is more robust to cases where people want to assign 0 to those variables. + (win32/alternate build systems, etc) + + src/Makefile.am | 6 ++--- + src/cairo-atomic-private.h | 4 +-- + src/cairo-atomic.c | 2 +- + src/cairo-directfb.h | 2 +- + src/cairo-mutex-list-private.h | 2 +- + src/cairo-quartz-private.h | 11 ++++---- + src/cairo-quartz.h | 4 +-- + src/cairo-win32.h | 8 ++++++ + src/cairoint.h | 13 +++++++-- + src/check-includes.sh | 58 ---------------------------------------- + src/check-preprocessor-syntax.sh | 57 +++++++++++++++++++++++++++++++++++++++ + 11 files changed, 91 insertions(+), 76 deletions(-) + +commit e00565fa3c9579566abb31b71af3f13f44c45139 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 20 15:38:29 2008 -0400 + + [src/check-includes.sh] Check that there is no #include <cairo.*.h> + + The correct syntax to include cairo headers from other cairo headers and + sources is using "...", not <...>. Check that. + + src/check-includes.sh | 34 ++++++++++++++++++++++------------ + 1 file changed, 22 insertions(+), 12 deletions(-) + +commit 9c36a5f3f19ca5bb2e0bb23baeaa625ad6833ab4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 18:51:03 2008 -0400 + + [src/Makefile.am.analysis] Check that all headers can be compiled standalone + + This ensures that each header includes all headers it depends on. + This is now enforced by "make check". + + src/Makefile.am | 6 +++++- + src/Makefile.am.analysis | 23 +++++++++++++++++------ + src/cairo-mutex-impl-private.h | 4 ---- + src/cairo-mutex-list-private.h | 5 +++++ + 4 files changed, 27 insertions(+), 11 deletions(-) + +commit 2dd90a6c94559374d995475fff8ffff5d0d3ff6f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 18:45:44 2008 -0400 + + [cairo-mutex] Move semicolons out of cairo-mutex-list-private.h + + Previously cairo-mutex-list-private.h assumed that every use of the file + will produce a statement for each mutex by including a semicolon after + each. But some uses (like enumerating all static mutexes in an array + for example, can't be implemented with the semicolon in place. So, move + the semicolon out to the users of the header file. + + src/cairo-mutex-list-private.h | 17 ++++++++--------- + src/cairo-mutex-private.h | 2 +- + src/cairo-mutex.c | 6 +++--- + 3 files changed, 12 insertions(+), 13 deletions(-) + +commit 8ae8189327f383fa033032d7d4280b91d650171d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 18:43:43 2008 -0400 + + [configure.ac.warnings] Add -Wp,-D_FORTIFY_SOURCE=2 to warning flags + + It enables various checks in glibc and gcc preprocessor. + + build/configure.ac.warnings | 3 +++ + 1 file changed, 3 insertions(+) + +commit 54b60dadb9f8393f834c4709b37ffb163a00445c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 18:42:54 2008 -0400 + + [Makefile.am.common] Remove gcc precompiled headers in "make clean" + + Stale gcc precompiled headers can cause bugs very tricky to pin down. + + build/Makefile.am.common | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d84752605a4aee96fa872a97a50e59a44ee7051a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 17:17:03 2008 -0400 + + Make sure (and check) that all private headers include some cairo header first + + The macros CAIRO_BEGIN_DECLS and CAIRO_END_DECLS are declared in two + places: config.h and cairo.h. On Win32 build there is no config.h. So, + we can't rely on pulling CAIRO_BEGIN_DECLS from there. Hence, we now: + + * Not add those declarations to config.h anymore, + + * Test that every cairo private header includes some other cairo + header before any other includes. + + These two are fairly enough to ensure that cairo.h is seen from all + private headers. There's still the case of headers not including + any header file at all. I'll fix that later. + + build/aclocal.cairo.m4 | 13 ---------- + build/configure.ac.system | 2 -- + src/Makefile.am | 2 +- + src/cairo-atomic-private.h | 4 ++-- + src/cairo-compiler-private.h | 2 ++ + src/cairo-mutex-impl-private.h | 2 ++ + src/cairo-mutex-private.h | 4 ---- + src/cairo-os2-private.h | 6 ++--- + src/cairo-reference-count-private.h | 8 ------- + src/cairo-region-private.h | 8 +++++-- + src/cairo-types-private.h | 2 -- + src/cairo-wideint-type-private.h | 2 ++ + src/check-cairoint.sh | 22 ----------------- + src/check-includes.sh | 48 +++++++++++++++++++++++++++++++++++++ + 14 files changed, 66 insertions(+), 59 deletions(-) + +commit eb89bf049a4c2ab0946c45a1277bfd8b1519efa1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 16:52:59 2008 -0400 + + Check for _MSC_VER in mutex implementation code + + Previously I made the mutex implementation code to use Windows mutexes + conditional on HAVE_WINDOWS_H. This was suppposed to be a more wine-friendly + version of checking for a Windows platform. However, it also meant that + when compiling without config.h, one had to stuff a #define for HAVE_WINDOWS_H + somewhere. Traditionally it was put in cairo-features-win32.h, and that + practice was carried over even after my build system rewrite. + + Somewhere along the road I also decided that the mutex implementation header + does not need to include anything other than config.h. So the hacked up + HAVE_WINDOWS_H in cairo-features-win32.h was not being seen by its lone + user. + + We now condition on any of HAVE_WINDOWS_H and _MSC_VER. So the hack can be + removed altogether. + + build/configure.ac.features | 2 -- + src/cairo-mutex-impl-private.h | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit 33b6d2b5eb4f5d424cec51970d9b72bef49a5fc8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 16:48:12 2008 -0400 + + [src/check-cairoint.sh] Escape dot in regexp + + No why, just that it's more robust :). + + src/check-cairoint.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d635c941b2d046c5edfef84ef870009069fb4004 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 19 14:50:24 2008 -0400 + + [image] Check for PACKAGE_BUGREPORT availability + + Building using win32, there is no config.h. So PACKAGE_BUGREPORT may + not be defined. + + src/cairo-image-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit a6c0ebee7aa9298af24859c37d8005eba772c4c6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 16:15:55 2008 +0100 + + [tessellator] Only run sweep-line validator when debugging + + The tessellator is well-proven now. However, the sweep-line validator + consumes around 50% of the total time required to draw the fractal + Pythagoras tree (the leaves are sub-pixel rectangles, so lots of edges + to sweep through). So disable the validator, but keep it available for + debugging. + + src/cairo-bentley-ottmann.c | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit 91f0b8b1eac967d4534201794c9ba7880ddfaa17 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 13:29:01 2008 +0100 + + [fill] Construct trap using rectangle directly. + + Avoid the overhead in sorting the edges within + _cairo_traps_tessellate_convex_quad() by using our prior knowledge that we + have a simple rectangle and construct the trap from the extreme points. + + src/cairo-path-fill.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit e749b58af827e4cc28353bcc6bc4b2ab8d47aaf6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 13:19:51 2008 +0100 + + [test] Add rectilinear-fill + + Add a test-case to exercise pixel-aligned fills to verify the optimised + rectilinear filler. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/rectilinear-fill-ref.png | Bin 0 -> 162 bytes + test/rectilinear-fill.c | 92 ++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 95 insertions(+) + +commit d5cd7ee74fb64b00597880a75b2e62065fac59b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 13:22:51 2008 +0100 + + [stroke] Optimise rectilinear strokes. + + Avoid the overhead of sorting the rectangle in + _cairo_traps_tessellate_convex_quad() by constructing the trap directly + from the line segment. This also has secondary effects in only passing + the non-degenerate trap to _cairo_traps_add_trap(). + + For rectilinear Hilbert curves this makes the rectilinear stoker over 4x + faster. + + src/cairo-path-stroke.c | 42 +++++++++++++++++++++++++----------------- + src/cairo-traps.c | 18 ++++++++++++++++++ + src/cairoint.h | 5 +++++ + 3 files changed, 48 insertions(+), 17 deletions(-) + +commit 9930eefbbd4448d598faff12fc0f7127555c8c94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 10:54:13 2008 +0100 + + Simple perf tweaks for a rectilinear Hilbert curve. + + Some tweaks to avoid stack copies and branches that save ~25% in + _cairo_traps_tessellate_convex_quad(). + + src/cairo-bentley-ottmann.c | 36 ++++----- + src/cairo-slope.c | 6 +- + src/cairo-surface-fallback.c | 12 +-- + src/cairo-traps.c | 175 ++++++++++++++++--------------------------- + src/cairoint.h | 25 ++++--- + 5 files changed, 105 insertions(+), 149 deletions(-) + +commit 27ee8dd9c64ac0fd36ce7b58729ee732e3396ee1 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 19 11:48:57 2008 +0100 + + [trap] Fixup a double _cairo_traps_fini(). + + The rectilinear stroke finalized the cairo_traps_t passed to it - which + was then subsequently used without re-initialized. So instead of + finalizing the structure, just remove any traps that we may have added + (leaving the limits and memory intact). + + src/cairo-path-stroke.c | 5 ++--- + src/cairo-traps.c | 8 ++++++++ + src/cairoint.h | 3 +++ + 3 files changed, 13 insertions(+), 3 deletions(-) + +commit b9c432862a25e4b18dfa2e7a2c5631cf9b235a21 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 19:35:28 2008 -0400 + + [Makefile.am.releasing] Make release-publish work with parallel build + + Carl had this confusing problem today making the snapshot, which was + "make release-publish" erring. This commit reworks the release-publish + machinery to enforce serialization of some of the tasks such that it + works with make -j. Don't expect any speedup though as "make distcheck" + is inherently sequential. + + build/Makefile.am.releasing | 30 +++++++++++++++++++++++------- + 1 file changed, 23 insertions(+), 7 deletions(-) + +commit 9eee0e935859082d8798846a8e6b16cbceb1f779 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 18:33:05 2008 -0400 + + [Makefile.am] Move sticky-bit clearing to dist-hook + + It's a more natural place. It also means that we just change permissions + on the dist directory, not the user's source directory. + + build/Makefile.am.releasing | 22 +++++++++++++++------- + 1 file changed, 15 insertions(+), 7 deletions(-) + +commit bdaaf3574a596e3ab31d0bdf0f84667d868c10d1 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 18 15:06:12 2008 -0700 + + Increment version number to 1.7.7 + + Just after the 1.7.6 snapshot went out. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 005dd8499bca9521ab934a56c68d2b85042359b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 16:39:23 2008 -0400 + + [src/Makefile.win32] Remove recursive cairo_headers var + + The cairo_headers variable in Makefile.win32 was unused and + from before the new build system was put in place. One can + use enabled_cairo_headers if need be. + + src/Makefile.win32 | 4 ---- + 1 file changed, 4 deletions(-) + +commit 567be443a2add00b4ea9b888ee35aeac5b41dc16 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 16:27:02 2008 -0400 + + [configure.ac] Make sure version information do not end up in config.h + + By introducing $(top_srcdir)/cairo-version.h I tried to make it + unnecessary to rebuild the entire library when the version changes. + That comes handy around releases and when bisecting. + + However this was not working as the version info was also ending + up in config.h and hence forcing a full rebuild upon change. + I now undefine the PACKAGE_VERSION* macros that autoconf defines, + so config.h does not change when cairo-version.h changes. + + build/configure.ac.version | 7 +++++++ + src/cairoint.h | 7 ------- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 73c70488f36b595fdfa47068309cc886bf0861ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 15:56:53 2008 -0400 + + [src/check-*.sh] Use computed list of source files instead of running "find" + + When the lists are available use them. They will be available to test + programs by make. + + src/Makefile.am | 6 ++++++ + src/check-cairoint.sh | 9 +++++++-- + src/check-headers.sh | 9 +++++++-- + 3 files changed, 20 insertions(+), 4 deletions(-) + +commit 1ee675d6a00ecd70447459f098e469c71b748d77 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 15:55:23 2008 -0400 + + [src/check-doc/syntax.sh] Fix test for out-of-tree build + + Now that our build system can compute a list of all cairo files, + we prefer to use that in the tests instead of running "find". + However, we were not switching to $(srcdir) so the test was not + finding source files in out-of-tree builds. Noticed that from + the grep error in distcheck. + + src/check-doc-syntax.sh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit dc260f1c0b432658cfa64e98c777609d0cbe7f3b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 15:35:03 2008 -0400 + + [doc] Remove lcd_filter API from doc listing + + Carl removed the API but not the listing in the docs. + The docs tests are passing again now. + + doc/public/cairo-sections.txt | 3 --- + 1 file changed, 3 deletions(-) + +commit d02fb0fd2044652255da0922f70199e7a84a31c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 15:33:10 2008 -0400 + + [doc/public/check-doc-coverage.sh] Make doc building needed for the test faster + + We used to do a full doc build to just to run the coverage test. That's + way too slow to expect people to run regularly. Instead now we just do the + source code scanning part of the doc build system that is just enough to + know if all symbols are documented. + + A full doc build can be done as always by invoking "make doc", and indeed + will be called as part of "make dist" or "make distcheck". + + doc/public/Makefile.am | 6 ++++-- + doc/public/check-doc-coverage.sh | 3 +++ + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit c6a7971a1e83d80050c4e2cfb42401a8d3c1b321 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 15:28:43 2008 -0400 + + [doc/public/check-doc-coverage.sh] Fix typo in checking cairo-undeclared.txt + + Copy/paste error meant we were not checking cairo-undeclared.txt there. + Indeed the test was passing even though Carl forgot to remove lcd-fitlering + API from docs. The test fails now. + + doc/public/check-doc-coverage.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cf80c78f0cc14c5c07950dd0d0120954a446ab56 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 18 12:12:42 2008 -0700 + + Correct NEWS mention to talk about fontconfig setting not Xsetting. + + Thanks to Behdad for helping me get the terminology right. + + NEWS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7fa5e0eb3af005521da5e6bb43a92fadd392a867 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 18 12:11:55 2008 -0700 + + Add user-font-rescale-ps-ref.png to REFERENCE_IMAGES. + + As caught by make distcheck. + + test/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit f39c5b40c79b139f1efcfdf393e15e2aaedc5e36 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 18 11:58:22 2008 -0700 + + Increase cairo version to 1.7.6. + + We're finally going to get this overdue snapshot out. + + cairo-version.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e00d7941200cee1eefc9a8758702811b7d018cce +Author: Carl Worth <cworth@cworth.org> +Date: Thu Sep 18 11:55:28 2008 -0700 + + NEWS: Add notes for 1.7.6 snapshot. + + Note 1.7 API changes: Remove lcd_filter, cairo_has_show_glyphs, and + add cairo_text_cluster_flags_t. Also mention a few major bug fixes, + Behdad's build-system rework, and Chris's customary robustness + improvements. + + NEWS | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 80 insertions(+), 4 deletions(-) + +commit 46ed92e699e902cb890f202c425603cdcc953106 +Author: Carl Worth <cworth@cworth.org> +Date: Wed Sep 17 10:50:28 2008 -0700 + + Remove text-lcd-filter tests + + The lcd_filter API is gone now, and these tests were all failing + anyway. + + test/Makefile.am | 8 --- + test/text-lcd-filter-fir3-ref.png | Bin 974 -> 0 bytes + test/text-lcd-filter-fir3.c | 85 ------------------------------- + test/text-lcd-filter-fir5-ref.png | Bin 974 -> 0 bytes + test/text-lcd-filter-fir5.c | 85 ------------------------------- + test/text-lcd-filter-intra-pixel-ref.png | Bin 974 -> 0 bytes + test/text-lcd-filter-intra-pixel.c | 85 ------------------------------- + test/text-lcd-filter-none-ref.png | Bin 974 -> 0 bytes + test/text-lcd-filter-none.c | 85 ------------------------------- + 9 files changed, 348 deletions(-) + +commit 1b42bc8033bc4682c9688086c08ca3ad306a2ae8 +Author: Carl Worth <cworth@cworth.org> +Date: Tue Sep 16 17:04:38 2008 -0700 + + Make the lcd_filter API private + + During the cairo summit it was decided that this API is to freetype- + specific to be in the general cairo interface for now. This will + likely come back again soon as a cairo_ft-specific interface. + + doc/public/tmpl/cairo-font-options.sgml | 29 ----------------------------- + src/cairo-font-options.c | 11 +++++------ + src/cairo-types-private.h | 25 +++++++++++++++++++++++++ + src/cairo-xlib-screen.c | 2 +- + src/cairo.h | 28 ---------------------------- + src/cairoint.h | 8 +++++++- + test/font-options.c | 4 ---- + test/text-antialias-subpixel.c | 1 - + 8 files changed, 38 insertions(+), 70 deletions(-) + +commit 0ab14a6b218097721535e1d6d9b3341b7336bb70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 18 09:04:01 2008 +0100 + + [polygon] Reduce number of branches. + + Minimise the number of conditionals taken whilst constructing the polygon. + + src/cairo-polygon.c | 71 ++++++++++++++++------------------------------------- + src/cairoint.h | 14 +++++------ + 2 files changed, 27 insertions(+), 58 deletions(-) + +commit 24c51ee177436190d691507ab84aae6a70fc2962 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 03:12:03 2008 -0400 + + [acinclude.m4] Add compat macros for autoconf 2.59 + + acinclude.m4 | 33 ++++++++++++++++++++++++++++++++- + build/aclocal.cairo.m4 | 3 --- + 2 files changed, 32 insertions(+), 4 deletions(-) + +commit 61317dac18a78b7b8420f354a59be896d60dd05c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 02:42:38 2008 -0400 + + [acinclude.m4] Define m4_foreach_w if not available + + Has been missing at least as of autoconf 2.59. + + acinclude.m4 | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit cb10dfe7153eeac749c64ce6a61f2fd3faf385d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 00:30:57 2008 -0400 + + Update tests to new cairo_text_cluster_flags_t API + + test/user-font-proxy.c | 19 +++++++++---------- + test/user-font-rescale.c | 6 ++---- + 2 files changed, 11 insertions(+), 14 deletions(-) + +commit 1fe7088a113f8a9cb40d436f10af4967662cd02a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 00:26:07 2008 -0400 + + [show_text_glyphs] Replace the bool backward with cairo_text_cluster_flags + + Chris rightfully complained that having a boolean function argument is + new in cairo_show_text_glyphs, and indeed avoiding them has been one + of the API design criteria for cairo. Trying to come up with alternatives, + Owen suggested using a flag type which nicely solves the problem AND + future-proofs such a complex API. + + Please welcome _flags_t APIs to cairo.h + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-scaled-font.sgml | 2 +- + doc/public/tmpl/cairo-text.sgml | 9 +++++- + doc/public/tmpl/cairo-user-fonts.sgml | 2 +- + src/cairo-analysis-surface.c | 5 ++- + src/cairo-gstate.c | 26 ++++++++-------- + src/cairo-meta-surface-private.h | 2 +- + src/cairo-meta-surface.c | 6 ++-- + src/cairo-misc.c | 4 +-- + src/cairo-paginated-surface.c | 4 +-- + src/cairo-pdf-operators-private.h | 2 +- + src/cairo-pdf-operators.c | 14 ++++----- + src/cairo-pdf-surface-private.h | 2 +- + src/cairo-pdf-surface.c | 6 ++-- + src/cairo-scaled-font.c | 44 ++++++++++++-------------- + src/cairo-surface.c | 8 ++--- + src/cairo-user-font.c | 23 +++++++------- + src/cairo.c | 19 ++++++------ + src/cairo.h | 56 +++++++++++++++++++++------------- + src/cairoint.h | 48 ++++++++++++++--------------- + src/test-meta-surface.c | 5 ++- + src/test-paginated-surface.c | 5 ++- + 22 files changed, 152 insertions(+), 141 deletions(-) + +commit a8cd426a4c79a7165b312f550ecc6a87b61303a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 18 00:25:02 2008 -0400 + + [doc] Fix glob for doc sources + + doc/public/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 32d3bfdde826e0f92a619c8c157fd5467aff729d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 17 19:16:25 2008 -0400 + + [configure.ac] Set pixman required version back to 0.12.0 + + I accidentally committed and pushed changing that version to 0.11.0. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3867d99ad7be391704a2b0d3d4542bd23c82fd73 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 17 17:54:40 2008 -0400 + + [configure.ac] Err, don't pass argument to AC_PROG_LIBTOOL + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e55d5a76d75d78c8a1e9ac4e9f5eda32f378f413 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 22:23:43 2008 +0100 + + [ps] Silence compiler warning. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e83675dee14581c3938191a4bbaf3c4e091a4304 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 22:12:35 2008 +0100 + + [test] Add missing operator-alpha ref image. + + test/operator-alpha-rgb24-ref.png | Bin 0 -> 229 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 998310ef4d710bf1a9505038b0fa411b29c958ca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 22:07:00 2008 +0100 + + [gcov] Use --coverage instead. + + --coverage is a synonym for "--fprofile-arcs --ftest-coverage" during + compilation *and* "--lgcov" during linking. One might think this would + be a perfect workaround for the broken debian libtool which stopped the + linker seeing -lgcov - but they strip CFLAGS as well. Oh well. + + build/configure.ac.analysis | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit d83a4d9905a68c3060e689015bffb03137fcbb0f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 21:19:48 2008 +0100 + + [svg] Emit user-fonts. + + Iterate over the user fonts subsets and emit the scaled glyphs. + + src/cairo-svg-surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit eb39151fdc4e72f0836d6fbb5df54885352b3b87 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 21:19:13 2008 +0100 + + [scaled-fonts] Correct the order of scaled/user arguments. + + src/cairo-scaled-font-subsets.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 85a4f0dcee6e6d954f0e458f1bd5b26ff1e70464 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 01:05:16 2008 +0100 + + Workaround undefined functions required by rsvg & poppler. + + If the native windowing system is disable (e.g. --disable-xlib) then the + test suite fails to build since the vector converters typically depend + upon gdk-pixbuf-2.0, which in turn depends upon a native gdk which + requires cairo to be built with support for the native windowing system. A + mess that should be resolved by separating rsvg and poppler into core and + higher-level libraries, but which we can workaround by simply ignoring + errors from undefined functions at link time. + + build/configure.ac.warnings | 7 +++++++ + test/Makefile.am | 3 +++ + 2 files changed, 10 insertions(+) + +commit e6f66ef65bb347974e0ceb58351844ba63389a87 +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Wed Sep 17 15:15:14 2008 -0400 + + Require pixman 0.12.0 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 86485e76b7e9ef1621dcd516266898246711c0ca +Author: Søren Sandmann Pedersen <sandmann@redhat.com> +Date: Wed Sep 17 15:14:16 2008 -0400 + + [xlib] Use _cairo_matrix_to_pixman_matrix() to compute the XTransform + + The adjustments done to the pixman matrix also need to be done for + XTransform. Since an XTransform is just a pixman_transform_t with + another name, we can reuse the conversion function. + + src/cairo-xlib-surface.c | 19 ++++++------------- + 1 file changed, 6 insertions(+), 13 deletions(-) + +commit dbb692325b328011f2202fced750cc785edb82da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 19:09:16 2008 +0100 + + [ps] Consume dictionary after where. + + where either pushes 'dict true' or 'false' so the true procedure needs to + consume the dictionary as well - for our purposes we just pop it off the + operand stack. + + src/cairo-ps-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7761a106ceac445212ff86d8c585374aa406a63f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 17 11:57:32 2008 +0100 + + [test] Check set_operator() + + Draw a pair of rectangles with each operator in turn - seems to trigger an + issue with the PDF/PS backends. + + test/.gitignore | 2 ++ + test/Makefile.am | 6 ++++ + test/operator-alpha-ref.png | Bin 0 -> 280 bytes + test/operator-alpha.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ + test/operator-ref.png | Bin 0 -> 238 bytes + test/operator-rgb24-ref.png | Bin 0 -> 217 bytes + test/operator.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 156 insertions(+) + +commit 1de35c04e020a203169fda30591733056662abd5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 17 02:10:35 2008 -0400 + + Revert "[Makefile.am] Add CAIRO_LIBS to check-link." + + This reverts commit a341cb5a98e3eadd5ccb47f9b1e696cb52f7ce9e. + The change introduced in that commit should not be needed and libtool + should just do the right thing. I cannot reproduce the problem + Chris was having no matter how hard I tried. + + boilerplate/Makefile.am | 2 +- + src/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 511db7b9a83bdef181cc5d0dbb50103ffb1aeb0e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 23:16:21 2008 -0400 + + [util/Makefile.am] Cleanup + + util/Makefile.am | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit d857c4d7653e06003b7b75fb92da988664b2545d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 19:56:47 2008 -0400 + + [autogen.sh] Remove --enable-gtk-doc from configure options + + Cause cworth doesn't like it. + + autogen.sh | 1 - + 1 file changed, 1 deletion(-) + +commit a5a18dbf610ef6562d7ee9d6d927d89af6839c60 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 19:44:49 2008 -0400 + + [INSTALL] Update + + INSTALL | 67 +++++++++++++++++++++++++++++++++-------------------------------- + 1 file changed, 34 insertions(+), 33 deletions(-) + +commit ff9a2af19e406807b3a962b930ec66b22a6a5974 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 16:05:57 2008 -0400 + + [test] Make test programs depend on check programs + + Since they use them when being run. + + test/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit 9e2ef481aa86b01fbdc91d4908ad312bca85db89 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 04:36:23 2008 -0400 + + [configure.ac] Clean up report syntax + + build/configure.ac.features | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 2161cb5baf1287a4a1a448f09e7fa885f635bfd1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 04:33:37 2008 -0400 + + [configure.ac] Warn if no native surface backend is enabled, err if no native font + + build/aclocal.cairo.m4 | 1 + + build/configure.ac.features | 50 +++++++++++++++++++++++++++++++++------------ + 2 files changed, 38 insertions(+), 13 deletions(-) + +commit a341cb5a98e3eadd5ccb47f9b1e696cb52f7ce9e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 13:07:12 2008 +0100 + + [Makefile.am] Add CAIRO_LIBS to check-link. + + With --enable-gcov, make check aborts with gcov errors on check-link - it + appears that -lgcov is magic and requires explicit invovation on the + command-line. + + boilerplate/Makefile.am | 2 +- + src/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit e880d0f956317c760c565cd69ea2966e7c7f24f1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 16 19:13:50 2008 +0930 + + Change user-font-rescale test to use opaque colors + + The combination of the initial cairo_paint() and the translucent text + colors were causing image fallbacks that prevented the PS type 3 font + embedding from being tested. + + test/user-font-rescale-ps-ref.png | Bin 0 -> 8041 bytes + test/user-font-rescale-ref.png | Bin 15679 -> 15937 bytes + test/user-font-rescale.c | 6 +++--- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 840218e0a0747ae741258fad12d420ae59e59d1c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 03:55:12 2008 -0400 + + [src/Makefile.am.analysis] Fix typos and improve scripts + + src/Makefile.am.analysis | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 49c8c62040cdeb6b280392da9355593e1e8292fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 03:10:53 2008 -0400 + + [src/Makefile.am.analysis] Split off from src/Makefile.am + + src/Makefile.am | 21 +-------------------- + src/Makefile.am.analysis | 21 +++++++++++++++++++++ + 2 files changed, 22 insertions(+), 20 deletions(-) + +commit eb749d75632cfce6dfc56e6e28dac1cfcd8a66f9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 03:05:26 2008 -0400 + + [.gitignore] Update + + boilerplate/.gitignore | 4 ++++ + src/.gitignore | 1 + + 2 files changed, 5 insertions(+) + +commit a908fc04a7bd536edfcd0e620f0f70cb5655085f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 03:03:43 2008 -0400 + + [boilerplate/Makefile.am] Distribute Makefile.win32.config + + boilerplate/Makefile.am | 2 ++ + src/Makefile.am | 3 +-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 88a3998a1d7e251e77ca9f39071866142cb50aa9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 02:45:00 2008 -0400 + + [aclocal] Fix pkgconfig file collection + + build/aclocal.makefile.m4 | 7 ++++--- + build/configure.ac.features | 4 ++-- + 2 files changed, 6 insertions(+), 5 deletions(-) + +commit 8151c506700ad286f683797c6c0767f35edaa2de +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 01:33:07 2008 -0400 + + [*/Makefile.win32] Use Makefile.win32.config + + boilerplate/Makefile.win32 | 12 +++----- + src/Makefile.win32 | 77 +++------------------------------------------- + 2 files changed, 8 insertions(+), 81 deletions(-) + +commit 310908ce2d2e35ca332c0f16c466ee652bb1b5a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 01:32:55 2008 -0400 + + [Makefile.win32] Don't declare CAIRO_NO_MUTEX + + Makefile.win32 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6892daf77cd44dca988c7305d430659d08813beb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 16 01:29:47 2008 -0400 + + Create cairo-features-win32.h + + build/aclocal.makefile.m4 | 34 ++++++++++++++++++++++++++++++---- + build/configure.ac.features | 30 ++++++++++++++++++++++++++++-- + src/Makefile.sources | 5 ++--- + src/cairo-features-win32.h | 14 -------------- + 4 files changed, 60 insertions(+), 23 deletions(-) + +commit 20daa425d8c46b6885653d2433f6027e4990d618 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 23:42:51 2008 -0400 + + [configure.ac] Generate boilerplate/Makefile.am.config + + Same scheme as in src/ + + autogen.sh | 6 +- + boilerplate/Makefile.am | 87 ++-------- + boilerplate/Makefile.sources | 56 ++++++ + build/aclocal.enable.m4 | 29 +++- + build/aclocal.makefile.m4 | 143 +++++++++++++++ + build/configure.ac.enable | 404 ------------------------------------------- + build/configure.ac.features | 351 +++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + 8 files changed, 595 insertions(+), 483 deletions(-) + +commit 1a3863688c0c09d047e5ee5b65e87c71c6393e3f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 03:00:21 2008 +0100 + + [test/user-font-rescale] Tidy + + Behdad warned that the static UNICODE_TO_GLYPH converter was not portable, + and needed to be replaced. And do a quick coding-style blitz. + + test/user-font-rescale.c | 174 ++++++++++++++++++++++++++--------------------- + 1 file changed, 98 insertions(+), 76 deletions(-) + +commit be9df58b5d6415c516f3fe397c985230d7cc5bea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 02:40:33 2008 +0100 + + [test/user-font-rescale] Fixup use of NAN + + Kill the use of the C99 feature, and replace with strtod("NaN"). + + test/user-font-rescale.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit b4b65a7890c5b8d95f5bbc39d0f35a3d54088036 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 21:50:27 2008 -0400 + + Revert "[configure] Append -lz to LIBS" + + This reverts commit 9c207b24542edb2e8e388329471ab9e7d7d61ff9. + + I pushed a proper fix in last commit. + + configure.ac | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit eb092eadbb3439b579866564eee003683f2abc5c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 21:45:25 2008 -0400 + + [configure] Add non-pkgconfig cflags/libs before substitution + + build/configure.ac.enable | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 09d7eb6c35da2819d9e254d8b7675eb39aa965c3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 19:54:35 2008 -0400 + + [configure.ac.version] Quote m4_define arguments + + build/configure.ac.version | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 60ab0f79f8d109fa662374f642d2961bb20a820b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 02:08:47 2008 +0100 + + [pdf] Kill a compiler warning. + + Older versions of gcc complain about the use of a guard variable, and warn + that solid_color may be used uninitialized. As it happens the guard + variable is redundant and we can just use solid_color directly. + + src/cairo-pdf-surface.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit e53fe3ec244833437fb35674258b983f9dcefa2d +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Tue Sep 16 01:45:10 2008 +0100 + + [test] Add a test case for drawing glyphs with different metrics. + + The ability to draw glyphs with different metrics is useful when doing + font substitution with fixed layout like in pdf and I eventually plan on + adding code to poppler to do something similar. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/user-font-rescale-ref.png | Bin 0 -> 15679 bytes + test/user-font-rescale.c | 329 +++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 332 insertions(+) + +commit 9c207b24542edb2e8e388329471ab9e7d7d61ff9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 01:34:14 2008 +0100 + + [configure] Append -lz to LIBS + + After going to the effort of detecting zlib for cairo-deflate-stream.c, it + rather defects the purpose of the exercise (and the mingw32 build) if we + forget to add the library to LIBS. + + configure.ac | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 87094e8c78d99b0ae9fed287acaf8ba7abb4e43a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 16 01:09:45 2008 +0100 + + [Makefile] Amend checks for horrible msys environment. + + automake-1.8 requires $(EXEEXT) for TESTS and feeds lt-check-*.c to + check-cairoint.h. Workaround both misfeatures. + + src/Makefile.am | 2 +- + src/check-cairoint.sh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 7880ddd101e7a6f3f19d0d395c5881b188c11e49 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 16 10:04:34 2008 +0930 + + Fix scaling of glyphs in type3 subset glyphs + + src/cairo-type3-glyph-surface.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit e31462d399dfad3b798efc56020cd9bb54c75dd9 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Mon Sep 15 19:31:28 2008 -0400 + + Check for poppler_page_render instead of poppler_page_render_to_pixbuf + + We now use poppler_page_render for testing. Further, poppler can be built + without poppler_page_render_to_pixbuf to avoid a dependency on gdk. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fb0bf165950cf85add6c187e5ec432f8c07b2cc2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 19:21:03 2008 -0400 + + [aclocal] Don't use m4_defn + + Apparently autoconf 2.59 on msys is not quite happy it + + build/aclocal.enable.m4 | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 879b5c705726ce6d1a5035cfef41aba06b0cb4dc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 19:18:06 2008 -0400 + + [aclocal] Move CAIRO_PARSE_VERSION to acinclude.m4 + + It belongs there as it includes other files. It was breaking build + on older autoconf it seems. + + acinclude.m4 | 13 +++++++++++++ + build/aclocal.cairo.m4 | 11 ----------- + 2 files changed, 13 insertions(+), 11 deletions(-) + +commit 656b0e3ea7117ceb28080e1c8605254bbec92a75 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 19:17:27 2008 -0400 + + [configure.ac] Avoid sed -i (#17563) + + build/configure.ac.enable | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 4619c76d2fc4285f2417e54870041cc07c968ce6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 18:51:50 2008 -0400 + + [scaled_font] Improve readability + + src/cairo-scaled-font.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit e079ec03cb8c2272162db86ec263b893df40460a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 18:51:24 2008 -0400 + + [scaled-font] Fix bug unlocking the wrong mutex (#16819) + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 096408d80e2ca13deccea7930aeca9fbd1b5850e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 18:51:04 2008 -0400 + + [scaled-font] Improve comment + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bdb6f609d8a40e03fa9ceef65bc522d025732e7b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 18:03:50 2008 -0400 + + [configure.ac] Build -uninstalled.pc files + + build/configure.ac.enable | 57 ++++++++++++++++++++++------------------------- + 1 file changed, 27 insertions(+), 30 deletions(-) + +commit 856fedd2359604ad2dca67c505e16111f23f1b61 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 16:19:12 2008 -0400 + + [doc] Make "make check" build without gtk-doc + + doc/public/Makefile.am | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 2ab77236f87b435d41c5429b7b3059d10058e421 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 15:48:57 2008 -0400 + + [Makefile.am] Add util to SUBDIRS + + We do nothing by default there right now, but it's correct to include it + anyway. And we will be installing utilities from there soon (cairo-trace for + example.) + + Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b4bbcda1c31d10d199db86170bcf924947e59ff2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 15:47:53 2008 -0400 + + [Makefile.am] Add doc back to SUBDIRS + + This reverts cac2ea0fcda2222f36ebd3414f91302dad691b85 + We need doc in SUBDIRS to install docs even if gtk-doc is not available. + The real fix for the build issue without gtk-doc should go under doc/ + and is coming in a followup commit. + + Makefile.am | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit e4753c82ff1aeb404b1cbac9e891f4353fb882f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 14:50:29 2008 -0400 + + [src/README] s/Source.mk/Makefile.sources/ + + src/README | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 50f45d7768976b489df2d4eddc90ae2cdaf464db +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 15 14:50:07 2008 -0400 + + [src/Makefile.am] Add comment referring to Makefile.sources + + src/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit b24d2e4214cc7a7ec59f6c6c2033b7315626f3f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 15 17:17:30 2008 +0100 + + [autogen] Delete Makefile.am.config + + Cause the Makefile.am.config to be regenerated every time as its contents + may be invalid for the current run - e.g. if a developer is switching + between branches with experimental surfaces. + + autogen.sh | 1 + + 1 file changed, 1 insertion(+) + +commit 5c7c2b5187800fd09e659305d58f61f4945e62a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 15 17:06:13 2008 +0100 + + [test] Test handling of fractional device offsets. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/device-offset-fractional-ref.png | Bin 0 -> 269 bytes + test/device-offset-fractional.c | 80 ++++++++++++++++++++++++++++++++++ + 4 files changed, 83 insertions(+) + +commit 2617d68a7b7ccaa8d82fe225926a1bf5f160ed30 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 15 17:07:11 2008 +0100 + + [boilerplate] Restrict number of retries to create an error surface. + + Sometimes we just cannot get what we want, so give up - it's only an error + surface after all! + + boilerplate/cairo-boilerplate.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 77b43da99f759fb970b90fd61eb3ace0f7224795 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 15 15:52:27 2008 +0100 + + [test] Fixup potential use of uninitialized test_image. + + In the churn of reordering the tests, some of the error paths were left + unaltered - causing potential invalid dereferences. + + test/cairo-test.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 34f250643212146c964f7e1c30524a4d585af156 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 15 15:41:36 2008 +0100 + + [surface] Trivial rejection of fill/stroke if clip extents is zero + + Avoid tessellating the path if we know that the target extents is zero. + Besides the rare occurrence when everything is clipped out, a zero-sized + surface is often intended as a no-op surface for benchmarking. + + src/cairo-surface-fallback.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit cac2ea0fcda2222f36ebd3414f91302dad691b85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 14 11:20:25 2008 +0100 + + [Makefile] Disable doc/ if we don't have gtk-doc. + + make check dies in the documentation even if we have explicitly disabled + gtk-doc - so only enter doc/ with gtk-doc enabled. + + Makefile.am | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 4e731f7c907a3b5bf2da0d73a699bcf79c1f2c85 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Fri Sep 12 09:39:58 2008 +0300 + + [test] Only test truetype-tables if we can. + + Doesn't build without CAIRO_HAS_FONT_SUBSET. + + test/truetype-tables.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 93325a3f086914c6836d6ca81c777e738f0ae6a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 19:12:31 2008 -0400 + + [configure.ac.enable] Cleanup Makefile.*.config generation + + build/configure.ac.enable | 26 ++++++++++++++++++-------- + src/Makefile.am | 6 ------ + src/Makefile.sources | 2 +- + 3 files changed, 19 insertions(+), 15 deletions(-) + +commit 66d6cb642c936916e4b1bfcaa48e6fb345f6daf5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 18:06:57 2008 -0400 + + [Makefile.am.common] Unify more common rules + + boilerplate/Makefile.am | 4 ---- + build/Makefile.am.common | 2 ++ + perf/Makefile.am | 1 - + src/Makefile.am | 2 -- + test/Makefile.am | 3 +-- + util/Makefile.am | 2 +- + 6 files changed, 4 insertions(+), 10 deletions(-) + +commit 171a5edbff3d893f32601de563f34c2395a3a55c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 17:53:30 2008 -0400 + + [boilerplate/Makefile.am] Add unneeded rule + + The check target by default depends on $(check_PROGRAMS). + + boilerplate/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit fe31c35d8672117a8586591abada4aa1b42a07ff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 17:31:07 2008 -0400 + + [doc] Don't rebuild after every configure run + + The version.xml file was rebuilt all the time and forcing a full + doc rebuild. Not anymore unless cairo-version.h was changed. + + configure.ac | 1 - + doc/public/Makefile.am | 13 +++++++------ + doc/public/version.xml.in | 1 - + 3 files changed, 7 insertions(+), 8 deletions(-) + +commit 694fee9e7c3073613359d9734f64f65964c3aa53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 16:04:06 2008 -0400 + + Update gtk-doc makefile fragment + + Also move it to build/. + + We still do not call gtkdocize from autogen.sh. + + acinclude.m4 | 1 + + autogen.sh | 9 ++- + build/Makefile.am.gtk-doc | 180 ++++++++++++++++++++++++++++++++++++++++++++++ + build/configure.ac.tools | 4 -- + configure.ac | 3 + + doc/public/Makefile.am | 6 +- + gtk-doc.make | 157 ---------------------------------------- + 7 files changed, 195 insertions(+), 165 deletions(-) + +commit de5b8bce37f2ddb87fca7ae6b844eec7fbbbc7e9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 15:49:09 2008 -0400 + + Makefile.am cleanup + + Use a common build/Makefile.am.common file. + + Makefile.am | 13 ++++++++----- + boilerplate/Makefile.am | 13 ++++++------- + build/Makefile.am.common | 12 ++++++++++++ + doc/Makefile.am | 5 ++++- + doc/public/Makefile.am | 7 +++---- + perf/Makefile.am | 10 ++++++---- + src/Makefile.am | 11 ++--------- + test/Makefile.am | 13 ++++++------- + test/pdiff/Makefile.am | 10 ++++------ + util/Makefile.am | 8 ++++---- + 10 files changed, 55 insertions(+), 47 deletions(-) + +commit 66f0d56a8a2c8dd3b4678d495d5652bfdfd690ea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 15:30:43 2008 -0400 + + [aclocal.enable.m4] Escape shell arguments + + build/aclocal.enable.m4 | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit 90210ac4ac7c70c58980fa3e70a9c16da6de6f75 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 15:24:45 2008 -0400 + + [autogen.sh] Quote ORIGDIR + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9e439a7a84fab0b888029801f62ea8d7f0a2ecf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 11 10:33:23 2008 +0100 + + [test] Check for updated reference images. + + Delete the results of previous runs if the reference images are more + recent. + + There's still potential error if the conversion utility or its required + libraries are modified... + + test/cairo-test.c | 83 +++++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 63 insertions(+), 20 deletions(-) + +commit e1c1bba3ff2ad6271778203b82e14448e9418bf5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 19:00:17 2008 +0930 + + Update user-font-proxy PDF/PS ref images + + test/user-font-proxy-pdf-ref.png | Bin 10174 -> 18111 bytes + test/user-font-proxy-ps-ref.png | Bin 7227 -> 8171 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 140ffa6e271c6e27bafbaf5edc2f026dedf4ed49 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 11 10:00:57 2008 +0100 + + [test] Fix order of deleting images vs checks. + + The early-checks assume that the images are still available - so it helps + not to unlink them before comparing results to the previous run. + + test/cairo-test.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 1cf1b723c79c1359c5daccc38a90fa7b931ce818 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 18:36:55 2008 +0930 + + Return correct status + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 15dd80c89437f0ef2f2458e3d115778ac161b500 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 18:26:04 2008 +0930 + + Don't overwrite previous status + + src/cairo-pdf-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit d1560bd68728c726b926d6460a466d073ed37285 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 04:23:05 2008 -0400 + + Mark private symbol so + + src/cairo-output-stream-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2b4a26f0977f325df7d154e80030a152f340e000 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 04:21:29 2008 -0400 + + [configure.ac] Add CAIRO_BEGINEND_DECLS + + build/aclocal.cairo.m4 | 13 +++++++++++++ + build/configure.ac.system | 2 ++ + configure.ac | 10 ---------- + 3 files changed, 15 insertions(+), 10 deletions(-) + +commit b7a838261bd2aace4466a725a8de08cdd4dccc9c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 04:17:43 2008 -0400 + + Move m4 macros into build/aclocal.*.m4 files + + Makefile.am | 2 + + acinclude.m4 | 261 -------------------- + autogen.sh | 16 +- + build/aclocal.cairo.m4 | 146 +++++++++++ + build/aclocal.enable.m4 | 439 +++++++++++++++++++++++++++++++++ + build/aclocal.float.m4 | 64 +++++ + build/aclocal.gtk-doc.m4 | 39 +++ + build/aclocal.pkg.m4 | 155 ++++++++++++ + build/configure.ac.enable | 447 ---------------------------------- + configure.ac | 1 + + doc/public/tmpl/cairo-image.sgml | 1 - + doc/public/tmpl/cairo-user-fonts.sgml | 1 - + 12 files changed, 847 insertions(+), 725 deletions(-) + +commit ac6e4b83e7eac8cf99849b3c4b60da7fdace8625 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 03:44:17 2008 -0400 + + [configure.ac.enable] Use AS_CASE + + build/configure.ac.enable | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 7c4fdafc8cb9f80e338df7581af1a8f40771dc67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 03:30:25 2008 -0400 + + [configure.ac.enable] Add some dnl's + + build/configure.ac.enable | 376 +++++++++++++++++++++++----------------------- + 1 file changed, 187 insertions(+), 189 deletions(-) + +commit c358abfb156ceb552ded2daad4068d6f0f0044a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 03:08:15 2008 -0400 + + [configure.ac.enable] Implement accumulators + + build/configure.ac.enable | 298 +++++++++++++++++++++++++++++++++------------- + 1 file changed, 217 insertions(+), 81 deletions(-) + +commit 1efb5e0810025d560addbbf690fd4d65f9405b8f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 01:12:48 2008 -0400 + + [configure.ac.enable] Don't collect .pc files for builtin features + + build/configure.ac.enable | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +commit 2bc53fb152ef4e6a443c177c7ac0cd2193c252ad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 01:04:13 2008 -0400 + + [configure.ac] Really fix pixman config + + configure.ac | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit f9a332c8fda32136a99299ac73a1737028fa8795 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 11 00:49:17 2008 -0400 + + [configure.ac] Fix pixman requires + + configure.ac | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 391bef58fcb301014adc8b06db7265c5c9b3bee3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 23:23:08 2008 -0400 + + Add support for always-builtin features in the build system + + Like image surface and user fonts. + + build/configure.ac.enable | 43 +++++++++++++++++++++++------------ + configure.ac | 30 ++++++++++++------------ + doc/public/cairo-sections.txt | 2 ++ + doc/public/tmpl/cairo-image.sgml | 11 +++++++++ + doc/public/tmpl/cairo-user-fonts.sgml | 12 ++++++++++ + 5 files changed, 68 insertions(+), 30 deletions(-) + +commit 4a01b1d9c94beb4b3df9d4c7c8d7411c6afa1034 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 21:36:27 2008 -0400 + + Build -uninstalled.pc files + + .gitignore | 1 + + build/configure.ac.enable | 28 +++++++++++++++++++++++++++- + src/cairo-features-uninstalled.pc.in | 7 +++++++ + src/cairo-uninstalled.pc.in | 8 ++++++++ + 4 files changed, 43 insertions(+), 1 deletion(-) + +commit a18c75c3e9a63dc23aaad0faf2e963973a306d65 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 21:24:50 2008 -0400 + + [configure.ac.enable] More fixes for private features + + Don't expect pkgconfig files for them. Also, don't give them a chance + to install public headers. + + build/configure.ac.enable | 34 ++++++++++++++++++++++++++++------ + 1 file changed, 28 insertions(+), 6 deletions(-) + +commit 771ff1a06e93255cd0015c59f5e4f33c25490546 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 21:21:58 2008 -0400 + + [configure.ac.enable] Don't collect .pc files in win32 Makefile + + We only generate them using autotools. No point. + + build/configure.ac.enable | 2 -- + 1 file changed, 2 deletions(-) + +commit c73f58e3a7a83faa687a148d2363979f3e7d001f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 21:19:25 2008 -0400 + + [doc] Don't include *.h as sources + + No idea why this was done initially but other projects I checked did not + do it. + + doc/public/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d878924cf8ec2aea9a4f1bd27ac3a83566c0af5f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 08:46:55 2008 +0930 + + PS: execute type3 glyphs in their own dictionary + + The PS emulation of the PDF text operators stores some data on the + user dict between calls to operators. When using the PDF text + operators in type 3 glyphs, the PDF operators were overwriting the + same data as the PDF operators in the page. Fix this by creating a new + dictionary to execute each type 3 glyph in. + + src/cairo-ps-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b56075ee51aaf570f85c1d59513e5e5116ae2b06 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 08:41:39 2008 +0930 + + Enable show_glyphs inside of in user-font glyphs + + src/cairo-pdf-surface.c | 24 +++++++++++++-- + src/cairo-ps-surface.c | 7 +++-- + src/cairo-type3-glyph-surface-private.h | 8 ++++- + src/cairo-type3-glyph-surface.c | 53 +++++++++++++++++++++++++++++---- + 4 files changed, 81 insertions(+), 11 deletions(-) + +commit c3663324fd417a281e9cd872aa1d60101ff4602b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 08:38:39 2008 +0930 + + Add _cairo_type3_glyph_surface_analyze_glyph() + + This function emits the glyph to a null stream with the side effect + that other glyphs referenced by this user-font glyph will be added to + the font subsets. + + src/cairo-pdf-surface.c | 28 +++++++++++++++++++++++ + src/cairo-ps-surface.c | 30 +++++++++++++++++++++++++ + src/cairo-type3-glyph-surface-private.h | 4 ++++ + src/cairo-type3-glyph-surface.c | 39 +++++++++++++++++++++++++++++++++ + 4 files changed, 101 insertions(+) + +commit b74533b5a56c1d063f288343f2e8e484f3c6571f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 08:37:30 2008 +0930 + + Add null output stream + + src/cairo-output-stream-private.h | 4 ++++ + src/cairo-output-stream.c | 23 +++++++++++++++++++++++ + 2 files changed, 27 insertions(+) + +commit 6772efcdf6b6710c839ab58a7218866cc9f409b6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Sep 11 08:37:02 2008 +0930 + + Put user fonts in a separate subset + + src/cairo-pdf-surface.c | 6 ++++++ + src/cairo-ps-surface.c | 5 +++++ + src/cairo-scaled-font-subsets-private.h | 35 +++++++++++++++++++++++++++++++++ + src/cairo-scaled-font-subsets.c | 23 ++++++++++++++++++++-- + 4 files changed, 67 insertions(+), 2 deletions(-) + +commit 59fafcee8d6f3b5ba81e0bb1d90eb65b8e5daf93 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 18:22:07 2008 -0400 + + [configure.ac.build] Keep private features private + + For private features: + + - Don't list them in cairo-features.h; Define them in config.h instead, + - Don't generate/install a .pc file, + - Don't warn if enabled. + + build/configure.ac.enable | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +commit e0b4f8dc8fd9861359f913dd69daa0ffeb66907a +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 27 16:13:57 2008 -0700 + + Avoid missing enum warnings with pixman 0.11.9 + + src/cairo-image-surface.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit bdcdc8400ef8c199eb7dea961ea13b75ae93176d +Author: Carl Worth <cworth@cworth.org> +Date: Wed Aug 27 15:54:15 2008 -0700 + + Rename _init_pattern_with_snapshot to _cairo_pattern_init_snapshot + + src/cairo-meta-surface.c | 38 ++++++-------------------------------- + src/cairo-pattern.c | 30 ++++++++++++++++++++++++++++++ + src/cairoint.h | 4 ++++ + 3 files changed, 40 insertions(+), 32 deletions(-) + +commit 9016504e2ab2718603838aa2504513fa5aeefd7e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 17:22:49 2008 -0400 + + [configure.ac.enable] Don't report CFLAGS + + It's long and not that useful. + + build/configure.ac.enable | 3 --- + 1 file changed, 3 deletions(-) + +commit 4059d356b8c2c8175cd9e232d2c34aaabd1932b1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 17:22:05 2008 -0400 + + [autogen.sh] Make libtoolize silent + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8abb252b0e4fa3b77eb85dd0276ce5112b538c3d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 10 20:29:05 2008 +0100 + + [test/Makefile.am] Update list of reference images. + + Remove the references to the deleted PS images and the premature + addition of the PDF images. + + test/Makefile.am | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit e895ab81f397359ee0224cc6ec61737ff87a591d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 10 19:00:40 2008 +0100 + + [test/Makefile.am] Remove reference to clip-operator-ps-argb32-ref.png + + The test passes using the general reference image since the PS now + correctly uses the image fallback for the alpha gradients. + + test/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 042ef899a26fbb008641a86ad7b14df42a1024cd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 13:57:17 2008 -0400 + + [test/pdiff] Fix include syntax + + test/pdiff/pdiff.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7709f51e1378fb39af01bf7c50762b3c6cc032f2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 10 18:30:45 2008 +0100 + + [boilerplate] Include cairo-compiler-private.h + + Actually use the compiler specific diverts and defines. + + boilerplate/cairo-boilerplate.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 84a7a9955c8af99bc2224ee630473bbee137598e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 10 18:23:31 2008 +0100 + + [test] Typo in Makefile.am + + s/AC_CPPFLAGS/AM_CPPFLAGS/g + + test/pdiff/Makefile.am | 2 +- + test/pdiff/pdiff.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit bf62798b1284533e28b78717dac8070ca6d29e54 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 10 18:21:50 2008 +0100 + + [cairo-compiler-private.h] Divert popen to _popen for MSVC + + Microsoft uses _popen instead of popen - required to build the + boilerplate but not actually used on Windows (by default)! + + src/cairo-compiler-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 5e5a2b9da70f559afa00bfd6e2011d573e729071 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 12:41:57 2008 -0400 + + More fixes for pkgconfig files + + Should all work now. + + build/configure.ac.enable | 44 ++++++++++++++++++++++++++++---------------- + src/cairo-features.pc.in | 10 +++++----- + 2 files changed, 33 insertions(+), 21 deletions(-) + +commit 43a42d0a195422260dbef0961e1cff34b1a36010 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 12:41:32 2008 -0400 + + [test/pdiff/Makefile.am] Another automake warning fix + + test/pdiff/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 95214e80a55d362ece30d8f2cd513b2771aeaa3e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 12:19:21 2008 -0400 + + [configure.ac.enable] Fix warning messages + + build/configure.ac.enable | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9dd9289c4ad517abf1d9013d5d6f85e418f9dd78 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 12:18:27 2008 -0400 + + Rename cairo-backend.pc.in to cairo-features.pc.in + + build/configure.ac.enable | 2 +- + src/cairo-backend.pc.in | 12 ------------ + src/cairo-features.pc.in | 12 ++++++++++++ + 3 files changed, 13 insertions(+), 13 deletions(-) + +commit cf71e7c39b431b5b85aefe0249c9870d240e390b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 10 12:15:20 2008 -0400 + + [configure.ac.enable] Actually install pkgconfig files + + Oops. Reported by Shunichi Fuji. + + build/configure.ac.enable | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit c9a90a808db6bcc2ac8f03aeeed334931655ce90 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 9 14:36:40 2008 -0400 + + [autogen.sh] Make sure ChangeLog exists + + autogen.sh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 378b11aaf39496919fd10108c00946cffe1fafc4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 9 09:06:10 2008 +0100 + + [test] fill-alpha + + Update alpha value to non-divisable-by-256 number to expose a bug in + pixman where it appears to be mixing in empty registers. + + test/fill-alpha-pattern-ps-ref.png | Bin 4519 -> 4380 bytes + test/fill-alpha-pattern-ref.png | Bin 3855 -> 3653 bytes + test/fill-alpha-pattern.c | 9 +++++---- + test/fill-alpha-ref.png | Bin 3182 -> 2989 bytes + test/fill-alpha.c | 9 +++++---- + 5 files changed, 10 insertions(+), 8 deletions(-) + +commit c20179b65ff887b4c5dc7f984ede1cb986de859d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 8 15:17:52 2008 -0400 + + [{test,perf}/Makefile.am] Define html-local target instead of html + + Fixes automake warning. + + perf/Makefile.am | 4 ++-- + test/Makefile.am | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 87dfceb9ec4d32077ad7961a6875793dc5d723f1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 8 15:13:07 2008 -0400 + + [Makefile.am] Rename INCLUDES to AM_CPPFLAGS + + Fixes automake warnings + + boilerplate/Makefile.am | 2 +- + doc/public/Makefile.am | 5 ----- + perf/Makefile.am | 2 +- + src/Makefile.am | 10 +++++----- + test/Makefile.am | 2 +- + 5 files changed, 8 insertions(+), 13 deletions(-) + +commit f84e7b6e656678e105171be12ef265ae60e4b1f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 8 15:10:06 2008 -0400 + + [configure.ac] Opt for more automake warnings and checks + + autogen.sh | 2 +- + configure.ac | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit a374b349bfe5dc4afa23ceea8d808560c5d7ac84 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Sep 7 17:43:30 2008 -0400 + + [configure.ac.enable] Make feature hooks take an ENABLED argument + + Simplifies code. + + build/configure.ac.enable | 130 ++++++++++++++++++++++------------------------ + 1 file changed, 63 insertions(+), 67 deletions(-) + +commit 1affc3192bbc4db93213a7053255f6fbafbab8a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 8 13:34:45 2008 +0100 + + [test] Add fill-alpha-pattern. + + A slight variation on the simple fill-alpha theme is that if Company is + truly seeing a regression where we dither, the error on a constant + background will be small and might be missed by the test suite. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/fill-alpha-pattern-ps-ref.png | Bin 0 -> 4519 bytes + test/fill-alpha-pattern-ref.png | Bin 0 -> 3855 bytes + test/fill-alpha-pattern.c | 94 +++++++++++++++++++++++++++++++++++++ + 5 files changed, 98 insertions(+) + +commit ee5e6c821fedaf8c374d41438e1ca8cf606cd57c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 8 12:34:36 2008 +0100 + + [test] Add fill-alpha. + + Benjamin Otte reported "who broke rgba fills? they look dithered with + recent git." + + This commit is the result of a skim through the test-suite which revealed + no single test responsible for checking the basic operation of + "set_rgba(); fill();". + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/fill-alpha-ref.png | Bin 0 -> 3182 bytes + test/fill-alpha.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 92 insertions(+) + +commit cdee34c5b77b7d6b16bd0b8d22e25211064dbc23 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Sep 7 16:53:14 2008 -0400 + + Back to using autoconf 2.58 + + acinclude.m4 | 4 ++++ + build/configure.ac.enable | 12 ++++++------ + configure.ac | 2 +- + 3 files changed, 11 insertions(+), 7 deletions(-) + +commit d478b3e1ef25ac9b19938bc8ee801afc9ebd89ae +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 18:31:29 2008 +0100 + + [cairoint.h] Update LAST_STATUS. + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7960fc94dccdf4f4e7362e1cd69eeb3c132939e5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 12:56:14 2008 +0100 + + [ps] Set used level to 3 only if we use native gradients. + + Set the used level after performing the checks that the native Type2/3 + gradients support the pattern. + + src/cairo-ps-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7439c45039a2c4342f626864324a5b4989a3153d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 14:57:16 2008 +0100 + + [ps] Only use fallback images if the gradient has non-constant alpha. + + If the gradient has constant alpha, then we can express it as a flattened + linear gradient. Otherwise, should the opacity vary across the gradient we + need to fallback. + + src/cairo-ps-surface.c | 14 ++++++++++++++ + test/.gitignore | 1 + + test/Makefile.am | 1 - + test/clip-operator-ps-argb32-ref.png | Bin 9102 -> 0 bytes + test/clip-operator-ps-rgb24-ref.png | Bin 4620 -> 3624 bytes + test/gradient-alpha-ps-argb32-ref.png | Bin 189 -> 134 bytes + test/gradient-alpha-ps-rgb24-ref.png | Bin 179 -> 130 bytes + test/gradient-constant-alpha-ps-ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha-ps-rgb24-ref.png | Bin 0 -> 124 bytes + test/gradient-constant-alpha-ref.png | Bin 0 -> 117 bytes + test/gradient-constant-alpha-rgb24-ref.png | Bin 0 -> 116 bytes + test/operator-clear-ps-argb32-ref.png | Bin 1435 -> 0 bytes + test/operator-source-ps-argb32-ref.png | Bin 3890 -> 0 bytes + test/operator-source-ps-rgb24-ref.png | Bin 3181 -> 0 bytes + 14 files changed, 15 insertions(+), 1 deletion(-) + +commit 94fd60d5ec2ef7705a8dc53f74817c1e067ba8e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 12:12:59 2008 +0100 + + [test] Add gradient-constant-alpha. + + PostScript can handle alpha gradients, iff they have a constant alpha. So + exercise that path. + + test/Makefile.am | 7 +++++ + test/gradient-constant-alpha.c | 69 ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 76 insertions(+) + +commit a33f2f6962a5cb09eca60825fa1a022c3e00991c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 10:26:32 2008 +0100 + + Revert "[ps] A flattened gradient is not linear." + + This reverts commit 85ed37da33522efa101eb508a4091bcfa24ae944. + + Adrian Johnson pointed out that iff the gradient has constant alpha then + it can be flattened. Reverting this commit in order to restore the + capability to handle gradient flattening. + + src/cairo-ps-surface.c | 46 +++++++++++++++++++-------------- + test/Makefile.am | 2 ++ + test/clip-operator-ps-argb32-ref.png | Bin 0 -> 9102 bytes + test/clip-operator-ps-rgb24-ref.png | Bin 0 -> 4620 bytes + test/gradient-alpha-ps-argb32-ref.png | Bin 0 -> 189 bytes + test/gradient-alpha-ps-rgb24-ref.png | Bin 0 -> 179 bytes + test/operator-clear-ps-argb32-ref.png | Bin 0 -> 1435 bytes + test/operator-source-ps-argb32-ref.png | Bin 0 -> 3890 bytes + test/operator-source-ps-rgb24-ref.png | Bin 0 -> 3181 bytes + 9 files changed, 28 insertions(+), 20 deletions(-) + +commit 1a6f2b08a16ffe2af28ddb3fcf0e7295226ad73d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 10:24:46 2008 +0100 + + [ps] Support B PDF operator. + + Add the procedure definition for fill-stroke path operators, B and B*. + + src/cairo-ps-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit ab3bb369d5d531446f4a5482672204dc479f10b2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 10:23:28 2008 +0100 + + [ps] Add comments about design of output. + + Add some snippets from Adrian Johnson about how and why the PS output is + factored in terms of PDF operators. + + src/cairo-ps-surface.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit ddb529a59c96077dd29b3bcfbc9749cb2d6de703 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Sep 7 12:16:29 2008 +0100 + + [configure.ac] Bump the required version. + + 2.62!!! Hopefully Behdad will notice and rewrite his excellent build + scripts to avoid m4_newline() and m4_expand(). + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c3b05a796ed015350887cf8220b087058e493571 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 18:02:21 2008 -0400 + + [configure.ac.enable] Sanitize feature default value + + build/configure.ac.enable | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit c881226afd03a95e9b94f497477315d69197c238 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 17:26:51 2008 -0400 + + [configure.ac.enable] Further break feature configuration hooks + + build/configure.ac.enable | 231 +++++++++++++++++++++++++++------------------- + 1 file changed, 138 insertions(+), 93 deletions(-) + +commit 31b09965b7c6210e5602167e260fa21b4c310bd1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 16:59:41 2008 -0400 + + [configure.ac.enable] Move macros around + + build/configure.ac.enable | 247 ++++++++++++++++++++++++---------------------- + 1 file changed, 128 insertions(+), 119 deletions(-) + +commit e19103e38d0a23e3d49c8a63945b80069e2d949b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 16:34:18 2008 -0400 + + [configure.ac.enable] Redo cache invalidation to be automatic + + build/configure.ac.enable | 49 ++++++++++++++++++++++++++++++++++------------- + 1 file changed, 36 insertions(+), 13 deletions(-) + +commit d520d5432bb94eb664652b09322cd254987bde6c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 15:54:23 2008 -0400 + + [configure.ac.enable] Simplify _CAIRO_ENABLE_FULL + + build/configure.ac.enable | 61 +++++++++++++++++++---------------------------- + 1 file changed, 24 insertions(+), 37 deletions(-) + +commit ee97873e0dad3ac60f6c39fb46bb5a7bb7480ae7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 15:34:29 2008 -0400 + + [configure.ac.bulid] Break feature config into smaller hooks + + build/configure.ac.enable | 38 ++++++++++++++++++++++---------------- + 1 file changed, 22 insertions(+), 16 deletions(-) + +commit 3ed9787f4358048965bbc35acf958a75a95261dd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 15:27:24 2008 -0400 + + [configure.ac.enable] Add CAIRO_FEATURE_IF_ENABLED + + build/configure.ac.enable | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit aba88e3437d88ebdf5bbeba72f0130ff4297bcdc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 15:12:32 2008 -0400 + + [configure.ac.enable] Move all feature configureation to a single hook + + To be broken up in followup commits. + + build/configure.ac.enable | 209 ++++++++++++++++++++++++---------------------- + 1 file changed, 111 insertions(+), 98 deletions(-) + +commit 7d39e4cbd722e39396904a43798c4743321b174c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 15:10:24 2008 -0400 + + [configure.ac.enable] Add all-powerful hook registration macro + + build/configure.ac.enable | 82 +++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 73 insertions(+), 9 deletions(-) + +commit 61ef0ebdc39828fd8f1e10de914694e22c6b6aa1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 14:51:57 2008 -0400 + + [.gitignore] Update + + .gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit eddb3f6a849a22bed0946e0f5031133e82429812 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Sep 6 09:50:57 2008 -0400 + + [configure.ac.enable] More macro cleanup + + acinclude.m4 | 1 + + build/configure.ac.enable | 218 +++++++++++++++++++++++++--------------------- + 2 files changed, 119 insertions(+), 100 deletions(-) + +commit 96e45e6779320cb0bed2a8d5f601180167c8a706 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 5 01:18:39 2008 -0400 + + [configure.ac] Cosmetic + + build/configure.ac.enable | 41 +++++++++++++++++++++++++++-------------- + 1 file changed, 27 insertions(+), 14 deletions(-) + +commit a37806a9da21a196e94dfa99500c3551ff119231 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 5 01:07:30 2008 -0400 + + [configure.ac] Quote version macros + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4edda79e711c3d82b5596694abb307ffa3fe855b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Sep 5 00:57:15 2008 -0400 + + [configure.ac] Sanitize feature names + + build/configure.ac.enable | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit c2062dc8b73d031e596d0b6c0f6fcc76839eb251 +Author: Benjamin Otte <otte@gnome.org> +Date: Sat Sep 6 22:26:56 2008 +0200 + + [doc] get rid of various markers that aren't interpreted by gtk-doc + + doc/public/tmpl/cairo-version.sgml | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit d45b3168db2362eaaa8ee29fc653509bc8f67e65 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 5 06:58:56 2008 +0100 + + [ps] Use a color_t rather than open-code. + + Simplify the code by tracking the current solid color with a + cairo_color_t. + + src/cairo-ps-surface-private.h | 5 +---- + src/cairo-ps-surface.c | 10 ++-------- + src/cairo-types-private.h | 18 ++++++++++++++++++ + src/cairoint.h | 18 ------------------ + 4 files changed, 21 insertions(+), 30 deletions(-) + +commit 85ed37da33522efa101eb508a4091bcfa24ae944 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat Sep 6 09:10:25 2008 +0100 + + [ps] A flattened gradient is not linear. + + We cannot express an alpha-gradient as a simple linear interpolation + between 2 flattened colors. So fallback. + + src/cairo-ps-surface.c | 46 ++++++++++++++------------------- + test/Makefile.am | 2 -- + test/clip-operator-ps-argb32-ref.png | Bin 9102 -> 0 bytes + test/clip-operator-ps-rgb24-ref.png | Bin 4620 -> 0 bytes + test/gradient-alpha-ps-argb32-ref.png | Bin 189 -> 0 bytes + test/gradient-alpha-ps-rgb24-ref.png | Bin 179 -> 0 bytes + test/operator-clear-ps-argb32-ref.png | Bin 1435 -> 0 bytes + test/operator-source-ps-argb32-ref.png | Bin 3890 -> 0 bytes + test/operator-source-ps-rgb24-ref.png | Bin 3181 -> 0 bytes + 9 files changed, 20 insertions(+), 28 deletions(-) + +commit c1c86afa877b80a284365bcdaee11986bdd7da1f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Sep 5 05:04:09 2008 +0100 + + [ps] Use floating point values when flattening color. + + Use the full-precision color values when computing the alpha-blended + color. + + src/cairo-ps-surface.c | 24 +++++++++++------------- + test/Makefile.am | 1 + + test/over-around-source-ps-rgb24-ref.png | Bin 0 -> 538 bytes + 3 files changed, 12 insertions(+), 13 deletions(-) + +commit e583fb061d2302b94188aabd381c566ac833bd94 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 4 13:47:05 2008 +0100 + + [type1] Allocate the temporary subsetter on the stack. + + Avoid a reasonably small, short-lived malloc by allocating the + cairo_type1_font_subset_t on the stack. + + src/cairo-type1-subset.c | 75 ++++++++++++++++++++---------------------------- + 1 file changed, 31 insertions(+), 44 deletions(-) + +commit 0cadd4ab027c3196c8bfa3361f2507ceb62c7876 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 4 10:25:54 2008 +0100 + + [CODING_STYLE] Add vim modeline + + Add my vim recipe that most closely matches the coding style. If you can + improve it, please do so! + + CODING_STYLE | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit 22de0f6b8d3d680f29d781e1d71cf35a29cd26a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 23:26:19 2008 -0400 + + [configure.ac] Add some automake options + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 82c91ec681bbd4fa8e64c411a94570a20a341ef0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 23:25:57 2008 -0400 + + [util] Fix an automake warning + + util/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 965b0e51ec8e1f57aaa7f7cdd86ef8968f059b7b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 23:25:27 2008 -0400 + + [test] Do not include "xmalloc.h" directly + + Not needed, it's renamed and included by boilerplate directly. + + test/buffer-diff.c | 1 - + test/cairo-test.c | 1 - + test/imagediff.c | 1 - + test/pthread-show-text.c | 1 - + 4 files changed, 4 deletions(-) + +commit 620e19e849f3dcc5747abe5b6d1adca4a08df9c7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 23:09:58 2008 -0400 + + [configure.ac] Add AM_PROG_CC_C_O + + Needed for per-target flags in test/Makefile.am + + build/configure.ac.tools | 1 + + 1 file changed, 1 insertion(+) + +commit 4edfdb4b15ff9f1eacaae0fb0739a54e51ca8742 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 22:30:49 2008 -0400 + + Rename build/*.ac to build/configure.ac.*. + + Also rename configure.in to configure.ac (finally) + + configure.in -> configure.ac + build/analysis.ac -> build/configure.ac.analysis + build/enable.ac -> build/configure.ac.enable + build/system.ac -> build/configure.ac.system + build/tools.ac -> build/configure.ac.tools + build/version.ac -> build/configure.ac.version + build/warnings.ac -> build/configure.ac.warnings + + autogen.sh | 9 +- + build/analysis.ac | 76 ------- + build/configure.ac.analysis | 76 +++++++ + build/configure.ac.enable | 428 +++++++++++++++++++++++++++++++++++++++ + build/configure.ac.system | 74 +++++++ + build/configure.ac.tools | 28 +++ + build/configure.ac.version | 43 ++++ + build/configure.ac.warnings | 65 ++++++ + build/enable.ac | 428 --------------------------------------- + build/system.ac | 74 ------- + build/tools.ac | 28 --- + build/version.ac | 43 ---- + build/warnings.ac | 65 ------ + configure.ac | 482 ++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 482 -------------------------------------------- + 15 files changed, 1200 insertions(+), 1201 deletions(-) + +commit 49f060252a2f40c727909d9e55463f40dcea2cdf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 22:25:33 2008 -0400 + + Rename build/*.mk to build/Makefile.am.* + + Namely: + + build/Analysis.mk -> build/Makefile.am.analysis + build/ChangeLog.mk -> build/Makefile.am.changelog + build/Releasing.mk -> build/Makefile.am.releasing + + Makefile.am | 6 +- + build/Analysis.mk | 35 ---------- + build/ChangeLog.mk | 82 ------------------------ + build/Makefile.am.analysis | 35 ++++++++++ + build/Makefile.am.changelog | 82 ++++++++++++++++++++++++ + build/Makefile.am.releasing | 153 ++++++++++++++++++++++++++++++++++++++++++++ + build/Releasing.mk | 153 -------------------------------------------- + 7 files changed, 273 insertions(+), 273 deletions(-) + +commit 7ad076442d70c239c963c574849b2fb352ccd63a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 22:21:29 2008 -0400 + + Rename src/*.mk to src/Makefile.* + + Namely: + + src/Sources.mk -> src/Makefile.sources + src/Config.mk -> src/Makefile.am.config + src/Config.mk.win32 -> src/Makefile.win32.config + + autogen.sh | 4 +- + build/enable.ac | 8 +- + doc/public/Makefile.am | 2 +- + src/.gitignore | 4 +- + src/Makefile.am | 6 +- + src/Makefile.sources | 246 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/Makefile.win32 | 2 +- + src/README | 2 +- + src/Sources.mk | 246 ------------------------------------------------- + 9 files changed, 260 insertions(+), 260 deletions(-) + +commit 8da361470fb8a4e11c7292dbfc57e3dafef7b7f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 21:59:27 2008 -0400 + + [configure.in] Forbid arbitrary CAIRO_ patterns in the output + + acinclude.m4 | 11 +++++++++-- + build/enable.ac | 7 +++++++ + 2 files changed, 16 insertions(+), 2 deletions(-) + +commit 33ed2fffb571fd50e07417d93ecaa288749b79d2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 21:13:39 2008 -0400 + + [build/enable.ac] Add a feature "type" argument (font, surface, ...) + + build/enable.ac | 73 ++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 41 insertions(+), 32 deletions(-) + +commit c8e75f10079e410cc1925000b14f6d1606216723 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 21:13:17 2008 -0400 + + [acinclude.m4] Disallow "_CAIRO" patterns in the output + + Eases m4 writing. + + acinclude.m4 | 2 ++ + 1 file changed, 2 insertions(+) + +commit 86ef1dff59c5f1f11b8a672c6d3a16babc8fd8f9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 19:50:32 2008 -0400 + + [configure.in] Break CAIRO_BACKEND_ENABLE into feature-specific ones + + build/enable.ac | 48 +++++++++++++++++++++++++++++++++++++++++++++--- + configure.in | 37 +++++++++++++++++++------------------ + 2 files changed, 64 insertions(+), 21 deletions(-) + +commit 4a96eb79ce75b60025c3da0a7782ffc2bd712ee7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 17:50:15 2008 -0400 + + [build/enable.ac] Reformat for readability + + build/enable.ac | 216 +++++++++++++++++++++++++++++--------------------------- + 1 file changed, 112 insertions(+), 104 deletions(-) + +commit c28882728cbdc7e70caa2a869ded2b4f180a2f33 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 17:22:07 2008 -0400 + + [configure.in] Remove unused variables + + build/enable.ac | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 47547cf05140a539fff0a2afb7e9d155e5d40f27 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 16:41:51 2008 -0400 + + [configure.in] Move report generation to build/enable.ac + + build/enable.ac | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++----- + configure.in | 57 +-------------------------- + 2 files changed, 110 insertions(+), 65 deletions(-) + +commit 37f82a4d1b95586859552958306376fd72a4a1cd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 16:13:05 2008 -0400 + + Get rid of CAIRO_LDADD in favor of CAIRO_LIBS + + build/analysis.ac | 2 +- + build/enable.ac | 2 -- + src/Makefile.am | 2 +- + 3 files changed, 2 insertions(+), 4 deletions(-) + +commit 44155f7e5941351b224b60644632b55448369e49 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 16:00:40 2008 -0400 + + Cleanup configure.in macros + + acinclude.m4 | 107 +++++++++++++++++++++++++----------- + build/enable.ac | 11 ++-- + build/system.ac | 122 +++++++++++++++++------------------------ + src/cairo-atomic-private.h | 13 +++-- + src/cairo-atomic.c | 2 +- + src/cairo-mutex-list-private.h | 2 +- + 6 files changed, 139 insertions(+), 118 deletions(-) + +commit 0e01534bf0bd64af840ccfa8aeaa1ac1a7cb31b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 09:13:49 2008 -0400 + + [boilerplate] Rename xmalloc.[ch] to boilerplate namespace + + boilerplate/Makefile.am | 5 +- + boilerplate/cairo-boilerplate-system.c | 147 +++++++++++++++++++++++++++++++++ + boilerplate/cairo-boilerplate-system.h | 51 ++++++++++++ + boilerplate/cairo-boilerplate.h | 2 +- + boilerplate/xmalloc.c | 147 --------------------------------- + boilerplate/xmalloc.h | 51 ------------ + 6 files changed, 202 insertions(+), 201 deletions(-) + +commit c16b4520ecc9114a7052c7afc54b264b764e5be6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Sep 4 09:07:52 2008 -0400 + + [autogen.sh] Only search in build/*.ac + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f92c7c2b25b37bb7c64411222089b7198d6f6c7d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Sep 4 03:06:58 2008 +0100 + + [autogen] Check build/ for versions. + + Add the build/*.mk to extract_version() so that it correctly identifies + our requirements. + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 097c4ac022be6e1b86c0acf3e6a4f06d784dd661 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 20:51:51 2008 -0400 + + [Makefile.am] Use check_PROGRAMS + + boilerplate/Makefile.am | 2 +- + src/Makefile.am | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 308a2ca928f8a36f07a758c443e77d0e2bdc02d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 20:50:49 2008 -0400 + + [doc/public/check-doc-coverage.sh] Also test cairo-undeclared + + doc/public/check-doc-coverage.sh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit b1ced45f064fca66e570d4f2b5e87a4c5160e17c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 20:50:26 2008 -0400 + + [doc] Fix out-of-tree build + + build/enable.ac | 2 +- + src/Makefile.am | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 5c45aa130865f2b279ac0b391f2bd5833ff891bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 20:06:26 2008 -0400 + + [configure.in] Split in various files + + Now the configure.in file mostly holds the backend enabling logic. + The usual cruft has been moved in smaller files named build/*.ac. + + acinclude.m4 | 93 +++++++ + build/analysis.ac | 76 ++++++ + build/enable.ac | 263 ++++++++++++++++++++ + build/system.ac | 98 ++++++++ + build/tools.ac | 28 +++ + build/version.ac | 43 ++++ + build/warnings.ac | 65 +++++ + configure.in | 717 ++---------------------------------------------------- + 8 files changed, 688 insertions(+), 695 deletions(-) + +commit 06ec8b7743ab2a184b0c748a43ba67085920cbe6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 19:09:57 2008 -0400 + + Move some top-level build files into build/ + + .gitignore | 8 --- + Analysis.mk | 35 ------------ + ChangeLog.mk | 82 ---------------------------- + Makefile.am | 22 ++++---- + Releasing.mk | 153 ----------------------------------------------------- + build/.gitignore | 8 +++ + build/Analysis.mk | 35 ++++++++++++ + build/ChangeLog.mk | 82 ++++++++++++++++++++++++++++ + build/Releasing.mk | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 10 files changed, 290 insertions(+), 290 deletions(-) + +commit 2cf4b3161c19b9b0349bd2aa94855fd0822968be +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Sep 3 15:34:40 2008 -0700 + + [quartz] move _cairo_quartz_create_cgimage to cairo-quartz-surface.c + + src/cairo-quartz-image-surface.c | 86 ---------------------------------------- + src/cairo-quartz-surface.c | 86 +++++++++++++++++++++++++++++++++++++++- + 2 files changed, 85 insertions(+), 87 deletions(-) + +commit e3fb4921a37ede88d3ecc6578ea96fcbb7776c0f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 17:53:15 2008 -0400 + + [configure.in] No, OS X sed is broken in much more than one way, really + + configure.in | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 62136640423b519aef8c40e5f5cadcfc676d7249 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 17:21:05 2008 -0400 + + [configure.in] Travis says this time it will work... + + configure.in | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 190a328204ea87ffe4bc527a32a7cd503d0450bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 17:15:07 2008 -0400 + + [configure.in] I'm reminded that it's more portable to do -i first... + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 55690639c7cdb3dd9c426d0a8e14d66f004a200d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 17:05:53 2008 -0400 + + [configure.in] Don't use sed -e. Fixes build on Macs + + configure.in | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit df7e365662649b9c434f0b558eb881183faed282 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 16:48:43 2008 -0400 + + [configure.in] Oops, this m4 quoting is tricky. Another try. + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f2f1653fcf7bbd56befe8d297dca5149b5536275 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 16:40:35 2008 -0400 + + [configure.in] m4 voodoo + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3760a0192600f5c179d09273e89e018fdca894ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 16:40:24 2008 -0400 + + [configure.in] Use $SED instead of sed + + configure.in | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 5ea2555c12e8a511759f8dbb4fe8b6f1d8b4af8d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 12:16:36 2008 -0400 + + [Makefile.am] Move lcov rules to Analysis.mk + + Analysis.mk | 35 ++++++++++++++++++++++++++++++ + Makefile.am | 72 +++++++++++++++---------------------------------------------- + 2 files changed, 52 insertions(+), 55 deletions(-) + +commit c8f23c2fcc034f6a0cb62ed72659ce748ec3871d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 12:06:51 2008 -0400 + + [Makefile.am] Move releasing rules to Releasing.mk + + Makefile.am | 150 ++------------------------------------------------------- + Releasing.mk | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 157 insertions(+), 146 deletions(-) + +commit 99e2e2d0bbe8ec3b57576da7d72184fb1df230fa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 12:06:35 2008 -0400 + + [src/Makefile.am] Minor fix in MAINTAINERCLEANFILES + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2791d51f6e0c9ac7bfeb82ba158dd5465983121a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 11:41:07 2008 -0400 + + [src/README] Refer to BIBLIOGRAPHY + + src/README | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 8992312df016f5112a3e9907bd34fb153330f162 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 3 16:12:53 2008 +0100 + + [scaled-fonts] Cleanup a couple of valgrind warnings. + + Beware the propagation of uninitialised variables and forgotten error + codes. + + src/cairo-scaled-font-subsets.c | 38 ++++++++++++++++++++------------------ + src/cairo-truetype-subset.c | 5 ++--- + 2 files changed, 22 insertions(+), 21 deletions(-) + +commit 855310bc1f226292646931add0a5e6e6604730ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Sep 3 11:31:48 2008 -0400 + + [HACKING] Write some more paragraphs + + HACKING | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +commit 3b7726e3d460d961f3acc055f70778c0b3e1dce4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 3 14:06:43 2008 +0100 + + [src/Makefile.am] s/libcairo_la_CFLAGS/INCLUDES/ + + Update the custom rules after the overall to the build system. + + src/Makefile.am | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit c18cc5b44176ba0916a3fb9deb1548db149f01d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Sep 3 10:00:14 2008 +0100 + + [src/Makefile.am] make check compile fix + + Minor typo preventing TESTS from building. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cf212ddacaf012f506c680ebd10477018b7e936a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 22:05:06 2008 -0400 + + Also test linking when cross-compiling + + We build the test. Just don't run it. + + boilerplate/Makefile.am | 1 + + src/Makefile.am | 1 + + 2 files changed, 2 insertions(+) + +commit 78127c7fb43db9e020551b04d8f85e0bdcc4c894 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 22:03:05 2008 -0400 + + [boilerplate/check-link.c] Oops. Add it. + + boilerplate/check-link.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit bd9743b318c0f3a76f72d2e05eb71eb918acdfae +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 22:01:37 2008 -0400 + + [HACKING] Improve win32 note. + + HACKING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0234fb9197edbba14a4cb8cc7dda1778f49e3fed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 22:00:05 2008 -0400 + + [boilerplate/check-link.c] Check that we can link to the built boilerplate + + boilerplate/.gitignore | 1 + + boilerplate/Makefile.am | 16 ++++++++++++---- + 2 files changed, 13 insertions(+), 4 deletions(-) + +commit 7e45937e21101648fd8dc01e1684a0515c10715b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 21:56:37 2008 -0400 + + [boilerplate] Add cairo_boilerplate_version[_string]() functions + + boilerplate/cairo-boilerplate.c | 18 ++++++++++++++++++ + boilerplate/cairo-boilerplate.h | 6 ++++++ + 2 files changed, 24 insertions(+) + +commit a7951081f153934cbf93215c5e255b99ec3e1157 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 21:50:08 2008 -0400 + + Move _GNU_SOURCE declarations to where it's used + + Such that we don't rely on more GNU extensions accidentally. + + perf/Makefile.am | 5 ----- + perf/cairo-perf-posix.c | 2 ++ + perf/cairo-perf.c | 2 ++ + test/Makefile.am | 6 ------ + test/cairo-test.c | 2 ++ + test/invalid-matrix.c | 5 ++++- + 6 files changed, 10 insertions(+), 12 deletions(-) + +commit b4cee2bd88f36b2eddacfe91726b698ae61c819b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 21:35:53 2008 -0400 + + [boilerplate] Remove obsolete reference to pixman + + boilerplate/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit e3d190c92f16c3b6cd3bf3791959c247b7aaa7ac +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 21:35:18 2008 -0400 + + [boilerplate] Cleanup + + boilerplate/Makefile.am | 5 ----- + boilerplate/xmalloc.c | 2 ++ + 2 files changed, 2 insertions(+), 5 deletions(-) + +commit af0069c1c4599a93b1f55a0a4aa0b67d8d754c0d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 21:31:47 2008 -0400 + + [autogen.sh] Create dummy src/Config.mk so we can bootstrap + + autogen.sh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2823ebaa6e0a14c4270ec973467fc0f76dc34fd5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 20:59:38 2008 -0400 + + [src/check-link.c] Simple test to check we can link to the built cairo.so + + configure.in | 1 + + src/.gitignore | 1 + + src/Makefile.am | 30 ++++++++++++++++++++++++++---- + src/check-cairoint.sh | 2 +- + src/check-link.c | 24 ++++++++++++++++++++++++ + 5 files changed, 53 insertions(+), 5 deletions(-) + +commit 59262577708ddb656851624377efb2a671fa8ca3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 20:20:49 2008 -0400 + + Revamp the build system. + + Quick summary of changes: + + - Move list of cairo source files out of src/Makefile.am and into + src/Sources.mk, + + - Generate files src/Config.mk and src/Config.mk.win32 that choose + the right set of source files and headers based on configured + backends and features. This drastically simplifies building + using other build systems. The src/Makefile.win32 file needs + to be updated to reflect these changes. + + - Add README files to various directories, + + - Add toplevel HACKING file. + + CODING_STYLE | 9 +- + ChangeLog.mk | 3 +- + HACKING | 165 ++++++++++++++ + Makefile.am | 1 + + RELEASING | 2 +- + boilerplate/.gitignore | 1 + + configure.in | 136 ++++++++---- + doc/public/Headers.mk | 52 ----- + doc/public/Makefile.am | 30 +-- + doc/public/README | 37 +++ + perf/.gitignore | 2 + + src/.gitignore | 5 +- + src/Makefile.am | 383 ++++---------------------------- + src/Makefile.win32 | 3 +- + src/README | 58 +++++ + src/Sources.mk | 246 ++++++++++++++++++++ + src/cairo-cff-subset.c | 5 + + src/cairo-clip-private.h | 3 + + src/cairo-compiler-private.h | 6 +- + src/cairo-freelist-private.h | 1 + + src/cairo-misc.c | 68 ++++++ + src/cairo-mutex-impl-private.h | 6 - + src/cairo-mutex-private.h | 4 + + src/cairo-mutex-type-private.h | 6 - + src/cairo-output-stream-private.h | 4 + + src/cairo-path-fixed-private.h | 2 + + src/cairo-pdf-operators-private.h | 1 - + src/cairo-pdf-operators.c | 5 + + src/cairo-ps-surface-private.h | 2 + + src/cairo-reference-count-private.h | 4 + + src/cairo-region-private.h | 1 + + src/cairo-scaled-font-subsets-private.h | 10 + + src/cairo-scaled-font-subsets.c | 5 + + src/cairo-truetype-subset-private.h | 4 + + src/cairo-truetype-subset.c | 4 + + src/cairo-type1-fallback.c | 5 + + src/cairo-type1-private.h | 6 + + src/cairo-type1-subset.c | 10 + + src/cairo-type3-glyph-surface-private.h | 6 + + src/cairo-type3-glyph-surface.c | 5 + + src/cairo-types-private.h | 29 +-- + src/cairo-user-font-private.h | 1 + + src/cairo-win32.c | 98 -------- + src/cairo-xlib-xrender-private.h | 7 +- + src/cairoint.h | 14 +- + src/check-doc-syntax.sh | 2 +- + test/.gitignore | 1 + + test/Makefile.am | 3 + + test/pdiff/.gitignore | 2 + + util/README | 69 ++++++ + 50 files changed, 932 insertions(+), 600 deletions(-) + +commit 5cb3e66305b25a3380f2ca5829ac81e4a27e76d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 15:32:54 2008 -0400 + + [configure.in] Create temp file in current dir + + Such that we can use the CAIRO_CONFIG_COMMANDS macro to regenerate + files in $srcdir and still be readonly-source-tree happy if nothing + changed in the target file. + + configure.in | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit e977f32346a602b9644a2c59e612896f34af2c74 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Sep 2 00:14:46 2008 -0400 + + [configure.in] Create backend .pc files using CAIRO_CONFIG_COMMANDS + + configure.in | 26 +++++++++++++++++--------- + 1 file changed, 17 insertions(+), 9 deletions(-) + +commit 1bdd6110f6d5df6556f201e06e519e68640e6215 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 23:35:03 2008 -0400 + + [configure.in] Consistently use _save_cflags/libs + + configure.in | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 004012f1bc2b5c359e3c00bb3c2e893c73fd5471 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 23:28:39 2008 -0400 + + [configure.in] Cache WARN_UNUSED_RESULT test results + + configure.in | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +commit ac246426148ddf9b33aa2b03cbafec867509e814 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 22:58:57 2008 -0400 + + [configure.in] Use warning-flag facilities for -fno-strict-aliasing + + configure.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d28243785a234648c4c4c60faa44658041400f81 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 22:52:44 2008 -0400 + + [configure.in] Remove unused MMX checks + + Leftover from pixman days + + configure.in | 23 ----------------------- + 1 file changed, 23 deletions(-) + +commit 74cd03be7085bf33dc122387df3e2fb25ee35c53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 22:49:16 2008 -0400 + + [configure.in] Cache atomic-ops check results + + configure.in | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +commit 7af228ab836d1871160c3b89079bcd660bac2074 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 22:37:28 2008 -0400 + + [configure.in] Make unsupported-backend warning generation automatic + + configure.in | 40 ++++++++++------------------------------ + 1 file changed, 10 insertions(+), 30 deletions(-) + +commit 7510aa803355faae3c8abe9fb79238185cb2ce95 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 22:15:03 2008 -0400 + + [configure.in] Define CAIRO_CONFIG_COMMANDS for easier file creation + + configure.in | 94 +++++++++++++++++++++++++++++------------------------------- + 1 file changed, 46 insertions(+), 48 deletions(-) + +commit 5f1993c53a11d87ee0506287f206bd0e400b76e9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 21:51:05 2008 -0400 + + [configure] Add user-fonts to list of configured components + + configure.in | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 33859070975ebc164f4f02093a2fe3335ccdb855 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 21:50:31 2008 -0400 + + [configure.in] Don't include cairo-features.h in cairo-no-features.h + + No idea why I did before. + + configure.in | 2 -- + 1 file changed, 2 deletions(-) + +commit 5f571290db05858133634f3d075030e1b3a3d121 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 21:49:59 2008 -0400 + + [configure.in] Add CAIRO_BEGIN/END_DECLS to config.h + + configure.in | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 2553579cc89d2ea2084983efd41b60ae5e32816b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Sep 1 21:48:07 2008 -0400 + + [doc] Clean up doc file names + + doc/public/cairo-docs.xml | 12 +++++----- + doc/public/cairo-sections.txt | 52 +++++++++++++++++++++---------------------- + 2 files changed, 32 insertions(+), 32 deletions(-) + +commit a5a896aae831e5224dd5bd4bc711f3212f738ba1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 28 19:36:12 2008 -0400 + + Update header glob + + doc/public/Makefile.am | 7 +++---- + doc/public/tmpl/cairo-version.sgml | 3 +-- + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit 7b2e8035f253e4667ebdb285d7b49aaece88f3b3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 2 10:54:13 2008 +0100 + + [cairo-test] Fixup a few memleaks on failure. + + Free the test image before jumping to UNWIND_CAIRO. + + test/cairo-test.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a5d33bcbb43cd1738e45b803c1aa968aff55e7ab +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 2 10:28:17 2008 +0100 + + [xlib] Keep a pointer to the cairo_xlib_display_t on the surface. + + Cleanup the code somewhat by passing cairo_xlib_display_t around + internally as opposed to a Display and then having to lookup the + corresponding cairo_xlib_display_t each time. + + [To get a cairo_xlib_display_t from a Display is a list traversal under + mutex (though the element we're looking for is most likely at the start), + but to get the Display is just a lockless pointer dereference.] + + src/cairo-xlib-display.c | 29 +++++---------------- + src/cairo-xlib-private.h | 10 ++++---- + src/cairo-xlib-screen.c | 14 +++------- + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 55 +++++++++++++++++++++++----------------- + 5 files changed, 48 insertions(+), 61 deletions(-) + +commit 939b836bfa95df759aca96936bb9a6d89d3130b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 2 10:08:04 2008 +0100 + + [xlib] Use an embedded doubly-linked list for the close display hooks. + + Kill the allocation and linear search of the close display list on remove, + by embedding a list node into the parent structure. + + Original patch by Karl Tomlinson <karlt+@karlt.net>, Mozilla Corporation. + https://bugzilla.mozilla.org/show_bug.cgi?id=453199#c5 + + src/cairo-xlib-display.c | 90 ++++++++++++++++++---------------------- + src/cairo-xlib-private.h | 13 +++--- + src/cairo-xlib-surface-private.h | 1 + + src/cairo-xlib-surface.c | 35 ++++++++++++---- + src/cairoint.h | 10 +++++ + 5 files changed, 88 insertions(+), 61 deletions(-) + +commit 38f779afcb84d48a1a146eec11a6db5c484d3578 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Sep 2 09:12:44 2008 +0100 + + [user-font] Propagate status return. + + An error return possible went unpropagated - fix that. Also whilst in the + vicinity avoid the non-constant initialisation of the local variable + before the antiquated compilers moan. + + src/cairo-user-font.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 83f390cfc5f594444413dfed3346e8412cb4c973 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 1 18:23:00 2008 +0100 + + [ps] Initialise has_creation_date. + + Slipped by check-valgrind, since the boilerplate always initialised it + when explicitly setting the date. + + src/cairo-ps-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit e955b7399ef5741c8f2fda1c4aa73e02c2ce39d0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Sep 1 15:33:05 2008 +0100 + + Check that lvalue of BITSWAP8() is a uint8_t. + + The bit-swapping macro uses the full register for intermediate storage so + we need to be careful to only read the low byte when using the result. + + [Only the use in ps-surface.c was incorrect, I just converted the other + unsigned chars to uint8_t for consistency.] + + src/cairo-ft-font.c | 2 +- + src/cairo-pdf-surface.c | 2 +- + src/cairo-ps-surface.c | 23 +++++++++++------------ + src/cairo-scaled-font.c | 2 +- + src/cairo-svg-surface.c | 4 ++-- + 5 files changed, 16 insertions(+), 17 deletions(-) + +commit d756a4d6323d23cecb928822cdac7528859e7cf3 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Aug 28 23:58:29 2008 -0700 + + [xlib] check for too-large surface size in create similar to avoid UNSUPPORTED loop + + src/cairo-xlib-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 894940b81f0272a2993d3a785fd505b3a4375e6e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 28 18:18:23 2008 -0400 + + Some nasty tracks to make changing version number not cause a total rebuild + + Quite slick! This comes handy when git-bisect'ing. The canonical version + number is in toplevel cairo-version.h now. + + Makefile.am | 3 +- + RELEASING | 6 ++-- + cairo-version.h | 8 +++++ + configure.in | 2 +- + src/Makefile.am | 2 ++ + src/cairo-misc.c | 44 --------------------------- + src/cairo-version.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-version.h | 12 ++++++-- + 8 files changed, 113 insertions(+), 52 deletions(-) + +commit ab5c528de2fc744d77c44ea1a9a3467f1ec5f81d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 28 17:36:43 2008 -0400 + + Undefine PACKAGE* macros defined by autotools + + We use our own macros. This makes it easier for other build systems. + + src/cairoint.h | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 47b3c9aa3f7860326e624a053675112a7ad24419 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 28 17:29:32 2008 -0400 + + Move version functions to cairo-misc.c + + src/cairo-misc.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 43 ------------------------------------------- + 2 files changed, 44 insertions(+), 43 deletions(-) + +commit 89900525fb78b20c532b8d983c238896f6e4820c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 28 17:21:37 2008 -0400 + + Move version number to src/cairo-version.h + + Makefile.am | 2 +- + Makefile.win32 | 15 ++------------- + RELEASING | 10 +++------- + Version.mk | 10 ---------- + configure.in | 29 +++++------------------------ + doc/public/cairo-sections.txt | 3 +++ + doc/public/tmpl/cairo-surface.sgml | 4 ++-- + doc/public/tmpl/cairo-version.sgml | 16 ++++++++++++++++ + src/Makefile.am | 1 + + src/cairo-features-win32.h | 26 -------------------------- + src/cairo-image-surface.c | 3 ++- + src/cairo-version.h | 8 ++++++++ + src/cairo.h | 37 +++++++++++++++++++++++++++++++------ + 13 files changed, 74 insertions(+), 90 deletions(-) + +commit 82303d6170aa541a3dc8c2519c7cc1445fc18842 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 28 14:40:56 2008 -0400 + + [autogen.sh] Handle case of no aclocal found + + autogen.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1c6556f6566b7bdfd2c8f46e8a6b6a35c9ae6891 +Author: Antoine Azar <cairo@antoineazar.com> +Date: Thu Aug 28 11:06:40 2008 -0700 + + Fixed cairo version in win32 makefile + + Makefile.win32 | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 22552dae517c25e4eadd44e76d06469a4c95db93 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 27 20:08:49 2008 -0400 + + Rename _cairo_matrix_compute_scale_factors to _cairo_matrix_compute_basis_scale_factors + + src/cairo-ft-font.c | 2 +- + src/cairo-matrix.c | 33 +++++++++++++++++++++++---------- + src/cairo-quartz-font.c | 6 +++--- + src/cairo-scaled-font.c | 2 +- + src/cairo-user-font.c | 2 +- + src/cairo-win32-font.c | 2 +- + src/cairoint.h | 2 +- + 7 files changed, 31 insertions(+), 18 deletions(-) + +commit f7a91e5bd7f3b799287f136adfd8a7b04dacce64 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 27 19:06:13 2008 -0400 + + [configure.in] Autogenerate libtool version info + + For unstable version 1.7.5 we create libcairo.so.2.10705.0 + For stable version 1.8.5 we create libcairo.so.2.10800.5 + + No more manual work. + + configure.in | 32 ++++++++++++++++++++------------ + 1 file changed, 20 insertions(+), 12 deletions(-) + +commit df64e0e632bf180f83a64fb51e8e7da5eed503bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 27 18:41:22 2008 -0400 + + Cleanup libtool version handling + + In preparation to remove the manual numbering completely + + Makefile.am | 12 ++---------- + configure.in | 48 ++++++++++++++++++++++++------------------------ + src/Makefile.am | 4 ++-- + 3 files changed, 28 insertions(+), 36 deletions(-) + +commit 50b2076a54c76e051305981280c7fe443f517d61 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 27 17:59:13 2008 -0400 + + [autogen.sh] Prefer glibtoolize to libtoolize if available + + Makes OS X users happy. + + INSTALL | 5 ----- + autogen.sh | 3 +-- + 2 files changed, 1 insertion(+), 7 deletions(-) + +commit 98942f99f3e10a1898a11d29e5f40f894d74c0a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 27 17:53:02 2008 -0400 + + [configure.in] Move library version information to Version.mk + + Makefile.am | 1 + + Version.mk | 10 ++++++++++ + configure.in | 13 +++++-------- + 3 files changed, 16 insertions(+), 8 deletions(-) + +commit 2cf82eaf0d08e68b787bb0792da97e73d8d4ce38 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Aug 27 21:14:51 2008 -0700 + + [xlib] Check CreatePixmap dimensions before calling, to avoid unnecessary size errors + + src/cairo-xlib-surface.c | 47 +++++++++++++++++++++++++++++++++-------------- + 1 file changed, 33 insertions(+), 14 deletions(-) + +commit 719c17c293a6971ab1f79e4df95887350429f827 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 27 17:08:52 2008 -0400 + + [src/Makefile.am] Remove gcc dependency + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a8c0998baf17357ce962dec795c9d6134e76e94a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 27 14:58:53 2008 +0100 + + [ps] Check tmpfile status after reading. + + Be paranoid and check to see if we encountered an error whilst reading the + temporary file. + + src/cairo-ps-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit bd21b2f6307549d9ade94bbe3f32f92efae97f72 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 26 21:06:26 2008 +0100 + + [test] Ensure that the output is always saved. + + Do the saving of the output first before checking for various failures + with respect to the reference images. + + test/cairo-test.c | 54 +++++++++++++++++++++++++++--------------------------- + 1 file changed, 27 insertions(+), 27 deletions(-) + +commit de6742c5f190664556658e35f5ea5ede979671af +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 26 18:41:22 2008 +0100 + + [ps] Mark the hex data as unsigned char. + + Use unsigned char to avoid sign extensions issues when bit shifting. + + src/cairo-output-stream-private.h | 2 +- + src/cairo-output-stream.c | 2 +- + src/cairo-ps-surface.c | 2 +- + src/cairo-scaled-font-subsets-private.h | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 92fcb9d2f7fa143d1f6707ead7d4a85e9f739bcb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 26 14:36:46 2008 +0100 + + [configure.in] Autoconf strikes back + + Need to disable references to *.cpp to convince autoconf + not to use the g++ linker (and fail miserably). + + boilerplate/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 08ea9d1f2a2210a1f333f3425eb141c2f5f1399c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 22 23:09:13 2008 +0100 + + [pdiff] Get the surface data pointer once. + + Don't call cairo_image_surface_get_data() for every single component of + the two surfaces to compare. + + test/pdiff/pdiff.c | 38 ++++++++++++++++---------------------- + 1 file changed, 16 insertions(+), 22 deletions(-) + +commit 590ccb900605f9bdf30f02f76b7dd622acb9a27d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 22 14:54:19 2008 +0100 + + [ps] Convert a few residual CRLF to LF. + + Just a few CRLF eol-terminators remained, cluttering the output. + + src/cairo-ps-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 78758b6acc0d7eca6bd2919e5fb039599a6e9a52 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Aug 23 14:18:45 2008 -0400 + + [Makefile.am] Add autogen.sh to dist. Oops! + + Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 17a6d541f88bb5627da436c5e516049c3317098a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 21 08:20:31 2008 +0100 + + [test] Explicity save a fail image. + + Be explicit about handling cached FAIL images, instead of relying on the + sequences of failed matches as the files are an external resource and we + can not guarantee their individual accessibility. + + Note this also changes the filename, so you may want to run: + $ find -name '*-last.*' -print | xargs rm + after this checkout. + + test/.gitignore | 2 +- + test/Makefile.am | 4 ++-- + test/cairo-test.c | 22 +++++++++++----------- + 3 files changed, 14 insertions(+), 14 deletions(-) + +commit b9287e6669fde571a9f0cb57462cb3815fbd8d27 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 20 19:44:30 2008 +0100 + + [test] Cache last output and compare next time. + + Compare the current output against a previous run to determine if there + has been any change since last time, and only run through imagediff if + there has been. For the vector surfaces, we can check the vector output + first and potentially skip the rasterisation. On my machine this reduces + the time for a second run from 6 minutes to 2m30s. As most of the time, + most test output will remain unchanged, so this seems to be a big win. On + unix systems, hard linking is used to reduce the amount of storage space + required - others will see about a three-fold increase in the amount of + disk used. The directory continues to be a stress test for file selectors. + + In order to reduce the changes between runs, the current time is no longer + written to the PNG files (justified by that it only exists as a debugging + aid) and the boilerplate tweaks the PS surface so that the creation date + is fixed. To fully realise the benefits here, we need to strip the + creation time from all the reference images... + + The biggest problem with using the caches is that different runs of the + test suite can go through different code paths, introducing potential + Heisenbergs. If you suspect that caching is interfering with the test + results, use 'make -C test clean-caches check'. + + boilerplate/cairo-boilerplate-pdf-private.h | 7 +- + boilerplate/cairo-boilerplate-pdf.c | 18 +-- + boilerplate/cairo-boilerplate-ps-private.h | 3 + + boilerplate/cairo-boilerplate-ps.c | 35 ++++- + boilerplate/cairo-boilerplate-svg-private.h | 7 +- + boilerplate/cairo-boilerplate-svg.c | 17 +-- + boilerplate/cairo-boilerplate-win32-printing.c | 2 + + boilerplate/cairo-boilerplate.c | 105 +++++++++----- + boilerplate/cairo-boilerplate.h | 5 + + boilerplate/xmalloc.c | 14 ++ + boilerplate/xmalloc.h | 4 + + configure.in | 2 +- + src/cairo-png.c | 9 +- + src/cairo-ps-surface-private.h | 2 + + src/cairo-ps-surface.c | 5 +- + test/.gitignore | 7 +- + test/Makefile.am | 10 +- + test/README | 6 + + test/cairo-test.c | 186 ++++++++++++++++++++++--- + 19 files changed, 341 insertions(+), 103 deletions(-) + +commit 98bb04cf93549455583d95b693c01b243b712c61 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 20 19:39:27 2008 +0100 + + [ps] Check for end-of-stream after advancing character. + + Whilst writing the base85 stream we advance an extra character if we spot + a '~', however we need to be paranoid that we have not stepped beyond the + end of the data for this write. + + src/cairo-ps-surface.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit b47c772934571ffcabc3ec9b3468f4ef1a6d6863 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 20 19:37:56 2008 +0100 + + [test/bufferdiff] Move unused code. + + Only imagediff calls png_diff, so it makes sense to move that function out + of the cairo-test and into the utility. + + test/buffer-diff.c | 295 ----------------------------------------------------- + test/buffer-diff.h | 36 ------- + test/imagediff.c | 217 ++++++++++++++++++++++++++++++++++++++- + 3 files changed, 216 insertions(+), 332 deletions(-) + +commit 186e7a2602cf140ac03b730b95ed10f25f9319c6 +Author: Alex Rostovtsev <tetromino@gmail.com> +Date: Tue Aug 19 23:45:40 2008 +0100 + + [png] Specify a no-op flush callback (NULL deref) + + libpng changed behaviour in v1.2.30 to call the png_ptr->output_flush_fn + in png_write_end(). If no flush function is provided with + png_set_write_fn(), libpng will use its default fflush() instead - which + assumes that closure passed is a FILE* and not an arbitrary user pointer. + + Consequently, we must actually set a dummy output_flush_fn to avoid + segfaulting. + + src/cairo-png.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 5712a2c619b265a7ede5cd32049bce456131c64b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 19 15:17:45 2008 +0100 + + [test] Destroy test ouput image on failure. + + Add the missing cairo_surface_destroy(). Sigh, less haste more speed. + + test/cairo-test.c | 1 + + 1 file changed, 1 insertion(+) + +commit 0354457bedf278c6504856148c51495754d94ebb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 19 15:10:51 2008 +0100 + + [test] Always write the test output to a png. + + Always write the test output to a png so that it can be copied and used as + a reference image with CAIRO_REF_DIR. + + test/cairo-test.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 86d221521bc187bc8ee4f81f840de2a5ce277207 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 19 14:55:18 2008 +0100 + + [test] Pass extended output name to ref_name_for_test(). + + Having included some extra details in the test output PNG filename, we + need to pass the extra information to + cairo_ref_name_for_test_target_format() in order to find the match. + + test/cairo-test.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit b30b1c5e2cdb3de62a20b13b7b699db1de32affb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 19 11:52:38 2008 +0100 + + [perf] Continue testing after we fail to create a surface. + + Sometimes we cannot create a surface because it is larger than the screen. + Ignore these non-fatal errors and move on to the next performance case. + + perf/cairo-perf.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +commit 776844eb9e4b0eb70621242212d732dfefcb6d8e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 18:50:00 2008 +0100 + + [boilerplate] Daemonic conversion utility. + + In order to achieve substantial speed improvements the external conversion + utilities are rewritten as a daemon that communicates with the test suite + over a local socket. This is faster as it avoids the libtool and dynamic + linker overhead for each invocation, the caches persist between tests and + we no longer require a round trip through libpng. + + The daemon is started automatically by the test suite and if communication + cannot be established then it falls back to using a pipe to a normal + conversion utility. The daemon will then persist for 60 seconds waiting + for further connections. + + Of course any memory leak (stares at poppler) is exacerbated. + + boilerplate/cairo-boilerplate-pdf.c | 63 ++-- + boilerplate/cairo-boilerplate-svg.c | 63 ++-- + boilerplate/cairo-boilerplate.c | 141 +++++++++ + boilerplate/cairo-boilerplate.h | 7 + + configure.in | 9 + + test/.gitignore | 3 + + test/Makefile.am | 7 + + test/any2ppm.c | 594 ++++++++++++++++++++++++++++++++++++ + 8 files changed, 851 insertions(+), 36 deletions(-) + +commit 00bc650455219e41fa20d3ec99321f4cbe97cbf1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 18 14:52:43 2008 -0400 + + Add new public API cairo_surface_has_show_text_glyphs() + + We added cairo_has_show_text_glyphs() before. Since this is really a + surface property, should have the surface method too. Like we added + cairo_surface_show_page()... + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-surface.sgml | 9 ++++++++ + src/cairo-analysis-surface.c | 2 +- + src/cairo-gstate.c | 2 +- + src/cairo-paginated-surface.c | 2 +- + src/cairo-surface.c | 44 +++++++++++++++++++++++++++++++++++++- + src/cairo.c | 3 +++ + src/cairo.h | 3 +++ + src/cairoint.h | 4 +--- + src/test-meta-surface.c | 2 +- + src/test-paginated-surface.c | 2 +- + 11 files changed, 65 insertions(+), 9 deletions(-) + +commit 4cd478b95f0ae803d1a0ab75197b1d389e2eba4c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 17:51:21 2008 +0100 + + [test] Initialise test context. + + Fixup a couple more tests that do not initialise a test context for + themselves. + + test/font-options.c | 19 +++++----------- + test/png.c | 64 ++++++++++++++++++++++++++--------------------------- + test/user-data.c | 10 +++++++-- + 3 files changed, 46 insertions(+), 47 deletions(-) + +commit cdd021b5fbeb53247e6e1aa7224a8faa60249dc7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 17:48:55 2008 +0100 + + [boilerplate] Check exit code from system for trapped signals. + + If the external conversion utility was killed by a signal (e.g. the user + sent SIGINT), raise that signal within our process as well. This means + that a crash inside poppler or rsvg will be flagged as a crash inside the + test suite, and makes interrupting the test suite far more responsive. + + boilerplate/cairo-boilerplate-pdf.c | 13 ++++++++++++- + boilerplate/cairo-boilerplate-ps.c | 17 ++++++++++++++--- + boilerplate/cairo-boilerplate-svg.c | 13 ++++++++++++- + 3 files changed, 38 insertions(+), 5 deletions(-) + +commit 95575d7a6977a21960818f81aa267725edcd8d93 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 17:13:25 2008 +0100 + + [configure.in] Add release status + + Print out whether the current version represents a release, a development + snapshot or is being compiled from git. + + configure.in | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit da83f405caeb2474e0a46f85148b3944c61a5d49 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 18 12:22:46 2008 -0400 + + Tone down comment + + src/cairo-ft-font.c | 2 +- + src/cairo-xlib-screen.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 5379af109ca65c40ea2b7a74b7660267da7c8d2f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 18 12:22:34 2008 -0400 + + [cairo-ft] Add useless cairo_warn decorator + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c56385eacc076a149ffe0fb6690b7b128fdc9e50 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 16:08:16 2008 +0100 + + [test/make-html.pl] Don't include links to non-existent images. + + Some tests do not generate output images, so do not insert a link if we + don't have an image. + + test/make-html.pl | 2 ++ + 1 file changed, 2 insertions(+) + +commit 17fbb652b1c74ba0ccced48c14c63a4d24bb3891 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 12:53:43 2008 +0100 + + [test] Avoid redundant writes/reads of test surfaces via png. + + As Behdad suggested, we can dramatically speed up the test suite by + short-circuiting the write to a png file, only to then immediately read it + back in. So for the raster based surfaces, we avoid the round-trip through + libpng by implementing a new boilerplate method to directly extract the image + buffer from the test result. A secondary speedup is achieved by caching the + most recent reference image. + + boilerplate/cairo-boilerplate-pdf-private.h | 5 + + boilerplate/cairo-boilerplate-pdf.c | 26 ++ + boilerplate/cairo-boilerplate-ps-private.h | 5 + + boilerplate/cairo-boilerplate-ps.c | 29 +- + boilerplate/cairo-boilerplate-svg-private.h | 5 + + boilerplate/cairo-boilerplate-svg.c | 26 ++ + .../cairo-boilerplate-test-surfaces-private.h | 5 + + boilerplate/cairo-boilerplate-test-surfaces.c | 58 +++- + boilerplate/cairo-boilerplate-win32-printing.c | 26 ++ + boilerplate/cairo-boilerplate-win32-private.h | 5 + + boilerplate/cairo-boilerplate.c | 135 +++++++++ + boilerplate/cairo-boilerplate.h | 62 ++-- + test/buffer-diff.c | 327 +++++++++++++-------- + test/buffer-diff.h | 38 ++- + test/cairo-test.c | 160 ++++++++-- + test/cairo-test.h | 4 + + test/imagediff.c | 2 +- + test/xlib-expose-event.c | 10 +- + 18 files changed, 721 insertions(+), 207 deletions(-) + +commit 9b0b55cea724f91eb2835294f929c49224bd0bac +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 18 08:07:25 2008 +0100 + + [test/leaky-dashed-rectangle] Add ref to bug report. + + Yevgen Muntyan has filed a bug report with the same symptoms as + leaky-dashed-rectangle, so add a reminder for when it is finally fixed. + + test/leaky-dashed-rectangle.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 212cbd3f1b089c1b1948072db515dbf81cc32580 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 21:48:06 2008 +0100 + + [test/user-font] Correct the lifetime of the user font face. + + By keeping a static reference to the user font face, it is erroneously kept + alive during a call to cairo_debug_reset_static_data(). (A violation of + the caller's contract to ensure that no active reference to a cairo object + is held by the caller.) + + test/user-font.c | 91 ++++++++++++++++++++++++++++---------------------------- + 1 file changed, 46 insertions(+), 45 deletions(-) + +commit 19d721d84c550b091927d22e00b34291cedd92aa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 21:43:14 2008 +0100 + + [cairo-compiler-private.h] Clear definition of __attribute__ + + Avoid a redefinition error when playing silly tricks with 'cpp -U__GNUC__'. + + src/cairo-compiler-private.h | 1 + + 1 file changed, 1 insertion(+) + +commit 12d3d32f2251c78189cf3eaca61bc690ad17e1bb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 21:41:36 2008 +0100 + + [Makefile.am] Support uno. + + For the extreme masochist only. At the moment, it only generate syntax + errors, but the command line appears functional. + + src/Makefile.am | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 6808174e72c923ebabe61846617496e25df92363 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 20:28:34 2008 +0100 + + [win32-font] Review error handling. + + The test-suite for win32 shows less than ideal error detection whilst + running on mingw32. Looking at the code, I spotted a few places where the + error propagation could be improved, and lo... + + src/cairo-win32-font.c | 244 +++++++++++++++++++++++++++---------------------- + 1 file changed, 133 insertions(+), 111 deletions(-) + +commit 5ef52cd08f586d4ca0b30ff7d47575f0dfba9172 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 18:01:15 2008 +0100 + + [svg] Tweak base64_write_func(). + + On a wild goose chase to eliminate a valgrind warning (caused by libpng, + alas) tweak the code for a bit of simplification. + + src/cairo-svg-surface.c | 31 ++++++++++++++----------------- + 1 file changed, 14 insertions(+), 17 deletions(-) + +commit c745a622db7844ad0dc0da14446457eed1133eb5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 17:33:29 2008 +0100 + + [test/toy-font-face] Use cairo_test_init/fini(). + + Minor step to harmonise the test with the rest of the suite. + + test/toy-font-face.c | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +commit 37bca38772af1ff206f6bba00f217dc59504ecca +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 15:30:51 2008 +0100 + + [test/create-from-png] Return the failure. + + Having checked all the possible PNG formats, report any failures. + + test/create-from-png.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3dc8e2dd0d42572c6e97af8bd676c02dded13d7f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 15:28:49 2008 +0100 + + [boilerplate] Dead store elimination. + + Value stored to 'found' is never read. + + boilerplate/cairo-boilerplate.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit d5f90a241c24a7f10c8f03d2a830729f85bb2945 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 15:08:57 2008 +0100 + + [ft-font] Dead store elimination. + + Value stored to 'stride' is never read. + + src/cairo-ft-font.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 5109fdb1e6867439d45da5a7cc8effb9bcc75d85 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 15:05:51 2008 +0100 + + [xlib] Return the integer from XGetDefault(). + + If the default value does not match a fontconfig constant, actually return + the parsed token. + + src/cairo-xlib-screen.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 4f4621adbfa67fb61b02e7e650a59a96a8c974ef +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 15:02:31 2008 +0100 + + [scaled-font-subsets] Check for a failed malloc. + + Missing NULL check after malloc. + + src/cairo-scaled-font-subsets.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 418ebb09303aa4b9b212fad4b45e458332a3afde +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 15:01:21 2008 +0100 + + [scaled-font-subsets] Propagate error status from index_to_ucs4(). + + Check for an error status from ->index_to_ucs4() and propagate. + + src/cairo-scaled-font-subsets.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 2ab700f21af7a98d82e74fd4d04884b2b0ca1b20 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:59:53 2008 +0100 + + [type3-glyph] Propagate error from image emission. + + Return the error status from ->emit_image(). + + src/cairo-type3-glyph-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0549fcfd85bed5b03c9eb4502042f6ce6f76f5a0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:57:03 2008 +0100 + + [pdf-operators] Propagate status from end_text(). + + Check for an error status after end_text(). + + src/cairo-pdf-operators.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 96d45cfeeeb6dba94f134589486b894eeac82651 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:55:30 2008 +0100 + + [pdf-operators] Propagate error from emit_glyph_string*(). + + Do not overwrite the error status if returned by either of the + emit_glyph_string*() routines. + + src/cairo-pdf-operators.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 63f64ff3369f3768fe80a1b002a1d057e3886d4c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:53:55 2008 +0100 + + [pdf-operators] Propagate error from begin_actualtext(). + + Check the status return from begin_actualtext(). + + src/cairo-pdf-operators.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 56c5f9954aca52327eedac3bc88a32ab4cbea619 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:51:48 2008 +0100 + + [pdf] Propagate error from open_stream() failure. + + Check status return for _cairo_pdf_surface_open_stream(). + + src/cairo-pdf-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 311464ad50edfa2e6dfbe10b021041229cdebda6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:50:35 2008 +0100 + + [pdf] Propagate status return. + + Check status return from type3_glyph_surface_emit_glyph(). + + src/cairo-pdf-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit b14c6ac685b45797657e406c5a02f94bffef4ffc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:49:02 2008 +0100 + + [pdf] dead code elimination. + + Value stored to 'matrix' is never read. + + src/cairo-pdf-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 97a2038c76978847127b164f639f41348badf5a6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:47:27 2008 +0100 + + [ps] Dead store elimination. + + Value stored to 'matrix' is never read. + + src/cairo-ps-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit e3b6a0c89a814ce469bee8f5e186c318a41004fb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:44:44 2008 +0100 + + [cairo-output-stream] Dead store. + + Value stored to 'p' is never read. + + src/cairo-output-stream.c | 1 - + 1 file changed, 1 deletion(-) + +commit 4517ef05200a11115c59acef9a20163544e69409 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:34:54 2008 +0100 + + [cairo-image-surface] Dead store. + + Value stored to 'ret' is never read. + Value stored to 'mask_bpp' is never read. + + src/cairo-image-surface.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 4114a7bf065ab180a21617c0b71e9dfc9161298b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:33:38 2008 +0100 + + [cairo-clip] Dead store. + + Value stored to 'status' is never read. + + src/cairo-clip.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 32843260ae303fafaecfabf07ed38108f369a5d2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:31:12 2008 +0100 + + [cairo-scaled-font] Dead store. + + Value stored to 'status' is never read. + + src/cairo-scaled-font.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 6c0da32b068de2124993fa8932c450843eba77ff +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:30:04 2008 +0100 + + [cairo-scaled-font] Actually use bytes_per_row. + + bytes_per_row was precomputed but not actually used in the inner loop. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c7d803fc91f29763a51d398033a117b11fb09454 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:03:33 2008 +0100 + + [cairo-surface] Add the lcd_filter default to the nil surfaces. + + The nil surfaces did not correctly initialize the lcd filter font option + to the default value. + + src/cairo-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 3b2d49e567ec3de4df18189e22f2077a92d941f0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 14:01:57 2008 +0100 + + Ensure ranges of wideint types are always defined. + + Define the range of the fixed types (int16, int32 etc) if the standard + headers fail to provide the definitions. + + src/cairo-wideint-type-private.h | 31 ++++++++++++++++--------------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +commit 3d548f673bfa6dea63fcc00f775ae318a7f912a8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 13:40:32 2008 +0100 + + [configure] Add -Werror to CC_TRY_FLAG + + g++ only warns about using C-only warning flags, but add -Werror promotes + the warning to an error and enables correct detection of the unsupported + flags. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3501eef6988ebcef5b169b004615d54bcee15460 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 12:13:14 2008 +0100 + + [cairo-cache] Fixup doc comment. + + Missing % before the macro name in the comment. + + src/cairo-cache.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 586dbaafe6ac8803c7d7b9ed38297486d47f60e9 +Author: Peter O'Gorman <pogma@thewrittenword.com> +Date: Fri Aug 15 14:46:22 2008 -0500 + + Compile with old compilers + + Some compilers fail to compile non-constant struct initializers. + + src/cairo-clip.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit 3998040c1151ffbc3f8748ca430af5bd81ca92e4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 17 11:35:58 2008 +0100 + + [cairo-cache] Simplify a status return to boolean. + + _cairo_cache_remove_random() just returned whether it found an entry to + remove and so the code can be simplified by returning a boolean as opposed + to a status code. + + src/cairo-cache.c | 23 ++++++++--------------- + src/cairo-types-private.h | 1 - + 2 files changed, 8 insertions(+), 16 deletions(-) + +commit 841fe91c0e0ef0b88f84e8130b8e2afaa8abb610 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 15 17:09:51 2008 +0100 + + [ps] Promote char to an int to avoid valgrind warnings. + + valgrind warns about an uninitialized read after a single char is promoted + to an int when passed to the printf. Silence the warning by using a + explicitly promoting the output byte to a full int. + + src/cairo-ps-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8f567279869432b4748dda2fed5c30056c68d44c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 18:22:47 2008 +0100 + + [perf] Beware $OS may not be set. + + Avoid a warning by ensuring that the two strings in the equality check are + not empty. + + perf/cairo-perf-diff | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c44f2ab4d1c975dfc6ba2f8a271da6b578c08983 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 18:21:22 2008 +0100 + + [perf] Silence trivial compiler warning. + + The compiler complained about passing a non-string literal as the format + to printf, so just to sanitize the code and keep the compiler happy, add + the magic "%s" format. + + perf/cairo-perf-diff-files.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit db7e3cb85467496686289d1a666b4ca274524fdd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 16:30:54 2008 +0100 + + [Makefile.am] Delete intermediates + + Clean up after calling 'gcc -save-temps'. + + boilerplate/Makefile.am | 4 ++++ + src/Makefile.am | 4 ++++ + test/Makefile.am | 1 + + test/pdiff/Makefile.am | 4 ++++ + 4 files changed, 13 insertions(+) + +commit 67326b728bca24dc02df7f144b9471636d5e1d4c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 16:25:49 2008 +0100 + + [gitignore] Ignore *.[is] + + Playing with 'gcc -save-temps' understandably leaves behind large amounts + of clutter. + + src/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit bafcbc633a12ae50cbafd579a03d12260ac3e04a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 8 22:27:39 2007 +0000 + + [cairo-scaled-font] Check the most recently used font used first. + + When searching for a matching font, check the most recently used font + first. This optimizes the common case where pango calls save() and restore() + around rendering each layout, but almost all consecutive layouts use the + same font. + + src/cairo-scaled-font.c | 120 +++++++++++++++++++++++++++++++++--------------- + 1 file changed, 83 insertions(+), 37 deletions(-) + +commit a1e5d4037600b05024e25b83fa5f666967fb5f63 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Aug 17 00:11:34 2008 -0400 + + [doc] Another typo fix + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 20d178c1c2f7da00993b31c6d2ae95b0cbba3f66 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Aug 16 21:27:03 2008 -0400 + + [doc] Fix typo + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7a0f29d2f35e31ad30f7dc67ec3e5c3ee06fec53 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 11:57:36 2008 +0100 + + [test] Update prototype of win32-printing create_surface() + + Missed the recent addition of the win32-printing surface to boilerplate. + + boilerplate/cairo-boilerplate-win32-printing.c | 3 +++ + boilerplate/cairo-boilerplate-win32-private.h | 13 ++++++++----- + 2 files changed, 11 insertions(+), 5 deletions(-) + +commit 63befc6ab124059a8078493345d21463c4609f41 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 09:14:51 2008 +0100 + + [xlib] Remove the key parameter from the close display hook. + + By inspecting all the users of the close display hooks, we can see that + (a) the key is redundant and (b) the data is unique to the hook. This + means we can trim the interface and stop the linear searches as soon as + we've found the correct element. + + src/cairo-xlib-display.c | 13 ++++++------- + src/cairo-xlib-private.h | 5 ++--- + src/cairo-xlib-surface.c | 5 +++-- + 3 files changed, 11 insertions(+), 12 deletions(-) + +commit 84a541a041c6bb22c57517e267dc7adcfd7e84dc +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Nov 7 00:12:00 2007 +0000 + + [cairo-xlib-surface] Remove status return for SUCCESS only function. + + Convert _cairo_xlib_surface_set_repeat() to a void return type, and + update caller, as the function can only return CAIRO_STATUS_SUCCESS. + + src/cairo-xlib-surface.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +commit 2699a986d3fe81d604c952513c62c896a95f1a3d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Nov 8 11:47:31 2007 +0000 + + [cairo-gstate] Guard against unsetting the font unnecessary. + + Only unset the current font if we change any of the font settings, i.e. + font_face, font_options, font_matrix and ctm. + + src/cairo-gstate.c | 33 +++++++++++++++++++++++++-------- + 1 file changed, 25 insertions(+), 8 deletions(-) + +commit 8552e76ee5b2da2f4c39f916981fad7873974506 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 14 08:25:58 2008 +0100 + + [xlib] Fix leak of pending_free_glyphs on CloseDisplay. + + Missing free of the pending_free_glyphs array in + _cairo_xlib_surface_remove_scaled_font. + + src/cairo-xlib-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit e3665bde5dbeef3473df95eed0b1550ee679765f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 13 17:41:40 2008 +0100 + + [test/Makefile.am] Match *-out.{pdf,ps,svg} + + When cleaning files, limit the glob to only match *-out.{pdf,ps,svg} in + order to distinguish the current practice of naming vector output files + from possible future vector target/reference files. + + test/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 49ea4fbb25393d214a88678d0aa0e1e0c4ba9916 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 13 16:45:32 2008 +0100 + + [test/create-from-png-stream] Correct check for png loading error. + + The test for failure to load the image surface from the png stream + incorrectly checked for a NULL surface, instead of the error surface. + + test/create-from-png-stream.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 93af67d7fd0fab93d8f9e1bc2de1c38aa65a7a59 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 13 16:04:41 2008 +0100 + + [test] Pass a 'complete' name to create_surface(). + + Construct the test name to pass to the boilerplate creation routines such + that it uniquely identifies the test in terms of test, target, content and + pass (similar, offset, thread). This allows the vector targets to create + output different output files for each test, whereas before, later tests + would overwrite existing files making debugging more difficult. + + boilerplate/cairo-boilerplate-pdf.c | 3 +- + boilerplate/cairo-boilerplate-ps.c | 3 +- + boilerplate/cairo-boilerplate-svg.c | 3 +- + boilerplate/cairo-boilerplate-win32-printing.c | 3 +- + test/cairo-test.c | 69 ++++++++++++-------------- + 5 files changed, 35 insertions(+), 46 deletions(-) + +commit 517e532fb70df7ce5f1d5d9ebf94243ede1307da +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 13 11:03:52 2008 +0100 + + [test] Run fallback-resolution if we have at least one vector surface. + + Currently fallback-resolution is included in the test suite if we have all + of the vector surfaces available. This commit enables individual support + for the vector surfaces, so that the test can be run even if one or more + of the surfaces are not available. + + test/Makefile.am | 10 +++++++--- + test/fallback-resolution.c | 26 ++++++++++++++++++++++++-- + 2 files changed, 31 insertions(+), 5 deletions(-) + +commit d56ea9cc879650db0ad2e6b05e483f30f9f21566 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 12 13:33:04 2008 +0100 + + [test] Set CAIRO_TEST_UNTESTED to 77 + + 77 is the magic exit code used by automake to indicate a skipped test, so + by using it we can get a slightly more informative test log. + + test/cairo-test.c | 13 ------------- + test/cairo-test.h | 4 ++-- + test/create-for-stream.c | 11 ++++++++++- + test/fallback-resolution.c | 5 ++++- + test/get-xrender-format.c | 35 ++++++++++++++++++++--------------- + test/multi-page.c | 10 +++++++--- + test/surface-source.c | 5 ++++- + test/xlib-expose-event.c | 10 +++------- + test/xlib-surface.c | 18 +++++++++--------- + 9 files changed, 59 insertions(+), 52 deletions(-) + +commit f85a4aec1f94f8fbd8e4db770ff1f70c3286fc90 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jan 10 13:04:52 2008 +0000 + + [test] Export a function to check whether a target is enabled. + + Allow individuals tests to check whether a test target is enabled - + useful for those tests that circumvent cairo_test() and perform + feature testing. + + test/cairo-test.c | 19 ++++++++++++++++ + test/cairo-test.h | 4 ++++ + test/create-for-stream.c | 54 ++++++++++++++++++++++++-------------------- + test/fallback-resolution.c | 31 ++++++++++++++++--------- + test/get-xrender-format.c | 4 ++++ + test/multi-page.c | 56 +++++++++++++++++++++++++--------------------- + test/pdf-features.c | 4 ++++ + test/ps-features.c | 4 ++++ + test/svg-clip.c | 4 ++++ + test/svg-surface.c | 4 ++++ + test/xlib-expose-event.c | 4 ++++ + test/xlib-surface.c | 4 ++++ + 12 files changed, 131 insertions(+), 61 deletions(-) + +commit 436c0c8be28546813139f391a62303d4c1894fc3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 11 21:12:45 2008 +0100 + + [test] Preparatory work for running under memfault. + + In order to run under memfault, the framework is first extended to handle + running concurrent tests - i.e. multi-threading. (Not that this is a + requirement for memfault, instead it shares a common goal of storing + per-test data). To that end all the global data is moved into a per-test + context and the targets are adjusted to avoid overlap on shared, global + resources (such as output files and frame buffers). In order to preserve + the simplicity of the standard draw routines, the context is not passed + explicitly as a parameter to the routines, but is instead attached to the + cairo_t via the user_data. + + For the masochist, to enable the tests to be run across multiple threads + simply set the environment variable CAIRO_TEST_NUM_THREADS to the desired + number. + + In the long run, we can hope the need for memfault (runtime testing of + error paths) will be mitigated by static analysis. A promising candidate + for this task would appear to be http://hal.cs.berkeley.edu/cil/. + + boilerplate/cairo-boilerplate-beos-private.h | 6 + + boilerplate/cairo-boilerplate-directfb-private.h | 3 + + boilerplate/cairo-boilerplate-directfb.c | 5 +- + boilerplate/cairo-boilerplate-getopt.c | 7 +- + boilerplate/cairo-boilerplate-glitz-private.h | 9 + + boilerplate/cairo-boilerplate-glitz.c | 68 +- + boilerplate/cairo-boilerplate-pdf-private.h | 3 + + boilerplate/cairo-boilerplate-pdf.c | 45 +- + boilerplate/cairo-boilerplate-ps-private.h | 3 + + boilerplate/cairo-boilerplate-ps.c | 54 +- + boilerplate/cairo-boilerplate-quartz-private.h | 13 +- + boilerplate/cairo-boilerplate-quartz.c | 3 + + boilerplate/cairo-boilerplate-svg-private.h | 3 + + boilerplate/cairo-boilerplate-svg.c | 45 +- + .../cairo-boilerplate-test-surfaces-private.h | 9 + + boilerplate/cairo-boilerplate-test-surfaces.c | 35 +- + boilerplate/cairo-boilerplate-win32-private.h | 3 + + boilerplate/cairo-boilerplate-win32.c | 3 + + boilerplate/cairo-boilerplate-xcb-private.h | 3 + + boilerplate/cairo-boilerplate-xcb.c | 11 +- + boilerplate/cairo-boilerplate-xlib-private.h | 6 + + boilerplate/cairo-boilerplate-xlib.c | 50 +- + boilerplate/cairo-boilerplate.c | 41 +- + boilerplate/cairo-boilerplate.h | 11 +- + boilerplate/xmalloc.c | 10 +- + configure.in | 4 +- + perf/cairo-perf.c | 11 +- + test/Makefile.am | 3 +- + test/a1-image-sample.c | 2 +- + test/a1-mask.c | 36 +- + test/a1-traps-sample.c | 2 +- + test/a8-mask.c | 36 +- + test/big-line.c | 2 +- + test/big-trap.c | 2 +- + test/bilevel-image.c | 4 +- + test/bitmap-font.c | 23 +- + test/buffer-diff.c | 122 +++- + test/buffer-diff.h | 9 +- + test/cairo-test.c | 692 ++++++++++++++------- + test/cairo-test.h | 56 +- + test/caps-joins-alpha.c | 2 +- + test/caps-joins.c | 2 +- + test/caps-sub-paths.c | 2 +- + test/clip-all.c | 2 +- + test/clip-empty.c | 2 +- + test/clip-fill-rule-pixel-aligned.c | 2 +- + test/clip-fill-rule.c | 2 +- + test/clip-nesting.c | 2 +- + test/clip-operator.c | 9 +- + test/clip-push-group.c | 2 +- + test/clip-twice.c | 2 +- + test/clip-zero.c | 2 +- + test/clipped-group.c | 2 +- + test/close-path.c | 2 +- + test/composite-integer-translate-over-repeat.c | 2 +- + test/composite-integer-translate-over.c | 5 +- + test/composite-integer-translate-source.c | 5 +- + test/copy-path.c | 81 ++- + test/create-for-stream.c | 42 +- + test/create-from-png-stream.c | 12 +- + test/create-from-png.c | 190 +++--- + test/dash-caps-joins.c | 2 +- + test/dash-curve.c | 2 +- + test/dash-no-dash.c | 2 +- + test/dash-offset-negative.c | 2 +- + test/dash-scale.c | 2 +- + test/dash-state.c | 2 +- + test/dash-zero-length.c | 2 +- + test/degenerate-arc.c | 2 +- + test/degenerate-path.c | 2 +- + test/degenerate-pen.c | 2 +- + test/device-offset-positive.c | 2 +- + test/device-offset-scale.c | 2 +- + test/device-offset.c | 2 +- + test/extend-pad.c | 2 +- + test/extend-reflect-similar.c | 7 +- + test/extend-reflect.c | 5 +- + test/extend-repeat-similar.c | 7 +- + test/extend-repeat.c | 5 +- + test/fallback-resolution.c | 7 +- + test/fill-and-stroke-alpha-add.c | 2 +- + test/fill-and-stroke-alpha.c | 2 +- + test/fill-and-stroke.c | 2 +- + test/fill-degenerate-sort-order.c | 2 +- + test/fill-missed-stop.c | 2 +- + test/fill-rule.c | 2 +- + test/filter-bilinear-extents.c | 2 +- + test/filter-nearest-offset.c | 4 +- + test/finer-grained-fallbacks.c | 2 +- + test/font-face-get-type.c | 17 +- + test/font-matrix-translation.c | 14 +- + test/ft-font-create-for-ft-face.c | 13 +- + test/ft-show-glyphs-positioning.c | 2 +- + test/ft-show-glyphs-table.c | 2 +- + test/ft-text-antialias-none.c | 4 +- + test/ft-text-vertical-layout-type1.c | 4 +- + test/ft-text-vertical-layout-type3.c | 4 +- + test/get-and-set.c | 8 +- + test/get-clip.c | 66 +- + test/get-group-target.c | 2 +- + test/get-path-extents.c | 126 ++-- + test/get-xrender-format.c | 30 +- + test/glyph-cache-pressure.c | 2 +- + test/gradient-alpha.c | 2 +- + test/gradient-zero-stops.c | 2 +- + test/group-paint.c | 5 +- + test/imagediff.c | 2 +- + test/in-fill-empty-trapezoid.c | 20 +- + test/in-fill-trapezoid.c | 11 +- + test/infinite-join.c | 2 +- + test/invalid-matrix.c | 7 +- + test/large-clip.c | 2 +- + test/large-font.c | 4 +- + test/large-source.c | 2 +- + test/leaky-dash.c | 2 +- + test/leaky-dashed-rectangle.c | 2 +- + test/leaky-polygon.c | 2 +- + test/line-width-scale.c | 5 +- + test/line-width-zero.c | 2 +- + test/line-width.c | 2 +- + test/linear-gradient-reflect.c | 2 +- + test/linear-gradient.c | 4 +- + test/long-dashed-lines.c | 3 +- + test/long-lines.c | 21 +- + test/mask-alpha.c | 2 +- + test/mask-ctm.c | 4 +- + test/mask-surface-ctm.c | 4 +- + test/mask.c | 23 +- + test/meta-surface-pattern.c | 3 +- + test/miter-precision.c | 6 +- + test/move-to-show-surface.c | 2 +- + test/multi-page.c | 16 +- + test/new-sub-path.c | 2 +- + test/nil-surface.c | 13 +- + test/operator-clear.c | 11 +- + test/operator-source.c | 11 +- + test/over-above-source.c | 2 +- + test/over-around-source.c | 2 +- + test/over-below-source.c | 2 +- + test/over-between-source.c | 2 +- + test/paint-repeat.c | 4 +- + test/paint-source-alpha.c | 4 +- + test/paint-with-alpha.c | 4 +- + test/paint.c | 2 +- + test/pattern-get-type.c | 25 +- + test/pattern-getters.c | 13 +- + test/pdf-features.c | 7 +- + test/pixman-rotate.c | 2 +- + test/ps-features.c | 7 +- + test/pthread-show-text.c | 11 +- + test/push-group.c | 2 +- + test/radial-gradient.c | 2 +- + test/random-intersections.c | 2 +- + test/rectangle-rounding-error.c | 2 +- + test/rectilinear-miter-limit.c | 2 +- + test/rectilinear-stroke.c | 2 +- + test/reflected-stroke.c | 2 +- + test/rel-path.c | 9 +- + test/rgb24-ignore-alpha.c | 2 +- + test/rotate-image-surface-paint.c | 2 +- + test/scale-down-source-surface-paint.c | 4 +- + test/scale-source-surface-paint.c | 4 +- + test/select-font-face.c | 2 +- + test/select-font-no-show-text.c | 2 +- + test/self-copy.c | 2 +- + test/self-intersecting.c | 2 +- + test/set-source.c | 2 +- + test/show-text-current-point.c | 2 +- + test/skew-extreme.c | 2 +- + test/smask-fill.c | 3 +- + test/smask-image-mask.c | 5 +- + test/smask-mask.c | 3 +- + test/smask-paint.c | 3 +- + test/smask-stroke.c | 3 +- + test/smask-text.c | 3 +- + test/smask.c | 5 +- + test/solid-pattern-cache-stress.c | 2 +- + test/source-clip-scale.c | 2 +- + test/source-clip.c | 2 +- + test/source-surface-scale-paint.c | 4 +- + test/stroke-ctm-caps.c | 2 +- + test/stroke-image.c | 2 +- + test/surface-finish-twice.c | 2 +- + test/surface-pattern-big-scale-down.c | 2 +- + test/surface-pattern-scale-down.c | 2 +- + test/surface-pattern-scale-up.c | 2 +- + test/surface-pattern.c | 2 +- + test/surface-source.c | 2 +- + test/svg-clip.c | 14 +- + test/svg-surface.c | 15 +- + test/text-antialias-gray.c | 4 +- + test/text-antialias-none.c | 4 +- + test/text-antialias-subpixel.c | 4 +- + test/text-cache-crash.c | 4 +- + test/text-lcd-filter-fir3.c | 4 +- + test/text-lcd-filter-fir5.c | 4 +- + test/text-lcd-filter-intra-pixel.c | 4 +- + test/text-lcd-filter-none.c | 4 +- + test/text-pattern.c | 2 +- + test/text-rotate.c | 4 +- + test/text-transform.c | 7 +- + test/text-zero-len.c | 21 +- + test/transforms.c | 2 +- + test/translate-show-surface.c | 2 +- + test/trap-clip.c | 27 +- + test/truetype-tables.c | 10 +- + test/unantialiased-shapes.c | 2 +- + test/unbounded-operator.c | 9 +- + test/user-font-proxy.c | 2 +- + test/user-font.c | 2 +- + test/xlib-expose-event.c | 32 +- + test/xlib-surface.c | 40 +- + test/zero-alpha.c | 2 +- + 213 files changed, 1732 insertions(+), 1079 deletions(-) + +commit c73b3e43e120065e40d8fc48c9bdbd88ebe8ab40 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Aug 12 21:21:20 2008 +0100 + + [cairo-surface] Check for the error surface in _get_font_options() + + cairo_surface_get_font_options() has the side effect of initialising the + font options on the surface, but fails to check that the surface is + valid first. Therefore if we are passed a read-only error object, we will + trigger a segmentation fault. + + Most likely this is the bug behind: + http://bugs.freedesktop.org/show_bug.cgi?id=17096. + + src/cairo-surface.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 922df7fc231b2499ce0651476083afe158a7639c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 12 07:34:24 2008 +0930 + + Win32: Fix uninitialized variable + + src/cairo-win32-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 31565677dbbc3212635ec95951a236e4243a2552 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 11 18:21:53 2008 +0100 + + [pattern] Unbounded patterns should have infinite extents. + + Fix a slight typo that produced negative sized extents instead of the + maximum. + + src/cairo-pattern.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 5ace0cb17a6e4719df1a32944595bd26a8f7f436 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 11 17:28:20 2008 +0100 + + [cairo-test] Exclude lcd-filter tests for vector targets. + + Add text-lcd-filter-* to vector_ignored_tests. + + test/cairo-test.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 52a8e528694aed3e918398e7d8e2d773eaa04c07 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 15:28:04 2008 -0400 + + [RELEASING] Document how to release with failing tests + + RELEASING | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 75acb51a0940916f545f0ffba99ccf7669d0d745 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 15:19:28 2008 -0400 + + [configure.in] Post release version increment to 1.7.5 + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 012a12a67b66f3809fa203f91ff8920936c25361 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 13:54:55 2008 -0400 + + [configure.in,NEWS] Release 1.7.4 + + NEWS | 8 ++++++++ + configure.in | 6 +++--- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit b176b5c29d931bfab16601dcb89dd6b6728bc386 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 15:06:10 2008 -0400 + + [test/get-xrender-format.c] Don't fail if DISPLAY is not set + + test/get-xrender-format.c | 2 +- + test/xlib-surface.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit bbd5f03fd8b04b92c9f8f06a386894d88650c0b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 14:28:00 2008 -0400 + + [test/xlib-surface-source] Skip test if DISPLAY not set + + test/xlib-surface-source.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 5d307b58b9a056ee866ea56305900f2eaa88441a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 13:54:39 2008 -0400 + + [doc] More template changes. Donno why they keep changing. + + doc/public/tmpl/cairo-font-options.sgml | 18 +++++++++--------- + doc/public/tmpl/cairo-status.sgml | 4 ++-- + doc/public/tmpl/cairo-text.sgml | 24 ++++++++++++------------ + 3 files changed, 23 insertions(+), 23 deletions(-) + +commit 2c53acea0bc474fb46310384da5df0b32a675181 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 13:54:26 2008 -0400 + + [src/Makefile.am] Include missing header file + + src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 0e8afe87eca795be9e820ad73aed31deb1c0bf62 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 13:09:46 2008 -0400 + + [RELEASING] Mention git-shortlog + + RELEASING | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit c6273564602e603d8caa59a7010ca5991ff1c03d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 12:12:32 2008 -0400 + + [configure.in] Increment version to 1.7.3 post release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 057a832f9e806f9321648e47ee314a62e82e6ba4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 03:28:32 2008 -0400 + + [configure.in,NEWS] Release 1.7.2 + + NEWS | 218 +++++++++++++++++++++++++++++++++++++++++++++++++---------- + configure.in | 6 +- + 2 files changed, 186 insertions(+), 38 deletions(-) + +commit 3dc2fc4cd953206313255b01aa382a8dbef50be1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 04:45:52 2008 -0400 + + [doc] Update templates + +commit d266648276cbd293a5cfa82bdc323695517098d8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Aug 11 08:40:22 2008 +0100 + + [configure.in] Revert addition of MACRO_DIR() + + Without it we get a three line warning under Ubuntu. However, it just + causes more problems than it is worth with older autoconf/automake. + + Makefile.am | 2 -- + configure.in | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit d073b6f1459cdc1584da1061b1f5d36c7981fbca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 01:58:32 2008 -0400 + + [RELEASING] Update for cairo-features-win32.h + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 177729ba938d544e470625d519e9126023aac8d7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 01:54:21 2008 -0400 + + [ChangeLog.mk] Revert 21ab44f11d3d20eead5d988c7a6cf48eebff08c7 + + That commit made the ChangeLog regenration rule to depend on .git/HEAD, + not .git/. However, the contents and timestamp of that file does not + change when you commit something locally. Hence, ChangeLog could remain + stale. Depending on .git/ does the job. + + ChangeLog.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 650a6a32762576063069d9c87dd23d9d0f30ea09 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 01:48:10 2008 -0400 + + [RELEASING] Easier to see API diff than log + + RELEASING | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6e4ed9ce84ba98be3050e5a6b0da2c65cfdc75fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 01:44:54 2008 -0400 + + Fix doc syntax + + src/cairo-scaled-font-subsets-private.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 591d5160f810656bf394306570ed5154e4285a37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 01:41:37 2008 -0400 + + [RELEASING] Update for external pixman + + RELEASING | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 549dd9adb53aff95640a3c113887f04aa8c8de65 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 11 01:40:27 2008 -0400 + + [test] Update ref image list + + test/Makefile.am | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit f2db80bf9ef5c454da77beeb263193d46f6b3d8c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Aug 10 23:39:44 2008 -0400 + + [gstate] Revert Check for NULL font_face in _cairo_gstate_set_font_face + + Revert commit b67d34e960fa07cfafb13e3a5b5b4a63cfb024d3. + cairo_set_font_face() is documented to accept NULL to restore default + font face. Revert commit that made it reject NULL. + + src/cairo-gstate.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit e797f6791ec17b490e9cddf8eddc695ec1631e3c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Aug 10 23:39:28 2008 -0400 + + [test/Makefil.am] Cosmetic + + test/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fef03ef98a116021a688d9f39b80844bc1c332e6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Aug 10 08:31:19 2008 +0100 + + [xlib] Check for depth == 0 in create_surface_internal(). + + Validate that we find an appropriate depth for the Xlib surface, before + attempting to create the surface. This was manifesting itself with + XInitImage() failures during _draw_image_surface() (actually detected as + a segmentation fault in XPutPixel() due to an incomplete XImage). So we + also add a couple of asserts to ensure that XInitImage() is successful - + which to the best of our knowledge, they should always be. + + src/cairo-xlib-surface.c | 87 +++++++++++++++++++++++++++++------------------- + 1 file changed, 52 insertions(+), 35 deletions(-) + +commit c014e51dc9288ca999b91ed078ee318bcd9fe4d1 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 10 14:49:30 2008 +0930 + + NEWS: Win32 font backend has been fixed + + NEWS | 3 --- + 1 file changed, 3 deletions(-) + +commit ac2781ec0820e9352b28335e7d9553926d069ff2 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sun Aug 10 05:05:28 2008 -0700 + + [dfb] fix crashes due to cached glyphs going away during operation + + src/cairo-directfb-surface.c | 73 ++++++++++++++++++++++++++++++++------------ + 1 file changed, 54 insertions(+), 19 deletions(-) + +commit 7fbda72137d8685718a8e8fe1d3af5b1d377521c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sun Aug 10 05:05:27 2008 -0700 + + [dfb] optimize DirectFB blits + + boilerplate/cairo-boilerplate-directfb.c | 28 ++- + src/cairo-directfb-surface.c | 399 +++++++++---------------------- + 2 files changed, 140 insertions(+), 287 deletions(-) + +commit a097bafd287ae3ee5ed3677a83b31d8d9d225a0c +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sun Aug 10 05:05:27 2008 -0700 + + [dfb] correctly handle case of 0 boxes in clip region + + src/cairo-directfb-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit a0cfd9962f5c7bbb047698d966923af30e9c3221 +Author: Vladimir Vukicevic <vladimir@slide.(none)> +Date: Sun Aug 10 05:05:27 2008 -0700 + + [dfb] Propagate clip correctly to surface returned from acquire_dest_image + + If the internal buffer is wrapped in an image surface in acquire_dest_image, + that image surface needs the current clip region propagated to it. If not, + then the clip needs to be applied at release_dest_image time. + + src/cairo-directfb-surface.c | 63 +++++++++++++++++++++++++++++++++++++------- + 1 file changed, 54 insertions(+), 9 deletions(-) + +commit 71f010bb522dd9387d749703a170de026a3fa8d6 +Author: Vladimir Vukicevic <vladimir@slide.(none)> +Date: Sun Aug 10 05:05:26 2008 -0700 + + [dfb] convert RUN_CLIPPED macro to function with helpers + + This helps with debugging and prepares the way for some future + code cleanup. + + src/cairo-directfb-surface.c | 241 +++++++++++++++++++++++++++++++++---------- + 1 file changed, 186 insertions(+), 55 deletions(-) + +commit bc4635f07729d6a73054971f0e7ec04433f414da +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 10 14:24:48 2008 +0930 + + Update _cairo_scaled_font_subsets_map_glyph() docs + + src/cairo-scaled-font-subsets-private.h | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 4c8317941815971f1d060243e1f6153df06866ca +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 10 14:24:16 2008 +0930 + + Win32-printing: Fix Type 1 font printing so fallback is not used + + Using glyph indices with Type 1 fonts on a printer DC does not work. + Previously there was a temporary fix where Type 1 fonts were printed + as filled paths. + + Now that _cairo_scaled_font_subsets_map_glyph() provides the reverse + mapping of the glyph index fix this by converting the glyph indices + back to the unicode values when printing Type 1 fonts. + + src/cairo-win32-printing-surface.c | 63 ++++++++++++++++++++++++++++++++------ + src/cairo-win32-private.h | 1 + + src/cairo-win32-surface.c | 22 ++++++++++++- + 3 files changed, 75 insertions(+), 11 deletions(-) + +commit b34c248b92b2d1544a23c20ecaa12f64792cb1d3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 10 14:18:52 2008 +0930 + + Fix _cairo_sub_font_map_glyph() to return correct unicode value + + src/cairo-scaled-font-subsets.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d1c619bc7d51a8e96eaf391691bec142dbd34e0e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 10 14:17:01 2008 +0930 + + win32-font: Make cairo_show_text() work again + + For now implement _ucs4_to_index() and leave _text_to_glyphs() + disabled. + + src/cairo-win32-font.c | 34 ++++++++++++++++++++++++++++++++-- + 1 file changed, 32 insertions(+), 2 deletions(-) + +commit e9933ba28cad1fc2219f145f5da47750b19acc7b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 17:12:07 2008 -0400 + + [NEWS] Add some notes about recent happenings + + NEWS | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 52 insertions(+) + +commit 8f6e52b0681384a5188277641d700f0e80e2c202 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 17:10:35 2008 -0400 + + [doc] Add short user-font section docs + + doc/public/tmpl/cairo-user-fonts.sgml | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 5227897b17d04fc6b8604d84847f85a1deb0c1f2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 17:06:21 2008 -0400 + + Add note about zero-glyph clusters + + src/cairo.h | 3 +++ + 1 file changed, 3 insertions(+) + +commit 322c3ef7f94c67d00c6113d0b8ae92a82b67e8a4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 8 10:09:55 2008 +0100 + + [.gitignore] Update list of tests + + test/.gitignore | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 893b50a98068fa3912c90c8b70c423a3da72a91c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 8 10:05:53 2008 +0100 + + [test] Update reference image for leaky-dashed-rectangle. + + Bah, it seems someone fixed the code and the error lay in discrepancies + with the antialiasing in the reference image. + + test/Makefile.am | 3 ++- + test/leaky-dashed-rectangle-ps-ref.png | Bin 0 -> 444 bytes + test/leaky-dashed-rectangle-ref.png | Bin 444 -> 366 bytes + 3 files changed, 2 insertions(+), 1 deletion(-) + +commit 49fb0e834ecf31ac61735e2e35a1b486d5290db6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 8 09:11:10 2008 +0100 + + [matrix] Prefer a return parameter for _compute_determinant(). + + Returning a double tends to be slightly more efficient than passing a + pointer to fill, and is a lot easier to read. + + src/cairo-matrix.c | 13 ++++++------- + src/cairo-path-stroke.c | 7 ++----- + src/cairo-pen.c | 8 +------- + src/cairoint.h | 4 ++-- + 4 files changed, 11 insertions(+), 21 deletions(-) + +commit eabe572981e1e415171dbfde81c3bf94297355b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 00:56:36 2008 -0400 + + Document all new API + + Also validate clusters generated by font backends. + + doc/public/cairo-sections.txt | 5 + + doc/public/tmpl/cairo-scaled-font.sgml | 18 ++++ + doc/public/tmpl/cairo-text.sgml | 34 ++++++ + doc/public/tmpl/cairo-user-fonts.sgml | 5 + + src/cairo-misc.c | 76 +++++++++++++- + src/cairo-scaled-font.c | 182 ++++++++++++++++++++++++++++++++- + src/cairo.c | 135 +++++++++++++++--------- + src/cairo.h | 75 ++++++++++++-- + src/cairoint.h | 17 +++ + 9 files changed, 482 insertions(+), 65 deletions(-) + +commit 08e8a42ea149deea760b94b62d9690393ce7cfcd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 02:22:26 2008 -0400 + + [test/user-font] Fix comments + + test/user-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 38c5f0d49b2ce1a6146cbea5ec3376a52cac8e68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 02:18:25 2008 -0400 + + [scaled-font-subsets] Fix UTF-8 mapping + + Prevously all show_text_glyphs() clusters were using ActualText. This + fixes that. + + I have a feeling that the following scenario is broken still though: + + - show_text_glyphs maps glyph 1 to some utf8 text different from + what index_to_ucs4 will give for glyph 1. This will assign the + utf8 text to glyph 1's ToUnicode. + + - show_glyphs shows glyph 1. Since cluster has no utf8 text, we + won't use ActualText and fall back to ToUnicode. But the ToUnicode + value assigned to glyph 1 is non-standard now. We should use + ActualText. + + I have not verified this hypothesis though. + + src/cairo-scaled-font-subsets.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit bc4d363e9238da0908ce01d0c08c3f344bd9d34f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 01:27:41 2008 -0400 + + [pdf-operators] Add note about clusters with no glyphs + + src/cairo-pdf-operators.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1bc404e3460a32ba94b420725ecff25bda7a0c35 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 01:27:12 2008 -0400 + + Make utf8 handling in font subsets more consistent + + src/cairo-pdf-operators.c | 4 ++-- + src/cairo-scaled-font-subsets.c | 7 +++++-- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 849159ddd15b21b4feee05aebe82b3acfd94ba38 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 00:54:54 2008 -0400 + + [truetype] Fix gcc warning about possibly-infinite-loops + + src/cairo-truetype-subset.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 178789c37a2a6edaba14a453817b3f9338eab1bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Aug 8 00:52:47 2008 -0400 + + [cairo-scaled-font-subsets] Make utf8 handling more robust + + src/cairo-scaled-font-subsets.c | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 597bfa922ae28ae4e7aa0ee72b856b5868799d4e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 22:48:38 2008 -0400 + + [test/user-font] Document glyph-not-found situation + + test/user-font.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit d9408041aa220c8a61e520de25bce9671ba4d0a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 22:06:15 2008 -0400 + + Add cairo_scaled_font_text_to_glyphs() + + And update user-font text_to_glyphs() method to match. + + Currently disable the win32-font text_to_glyphs(), until that one + is updated. Or better yet, remove it and implement ucs4_to_index(). + It's the toy font API afterall. + + src/cairo-gstate.c | 35 +++++---- + src/cairo-scaled-font.c | 183 +++++++++++++++++++++++++++++++++++++----------- + src/cairo-user-font.c | 38 +++++----- + src/cairo-win32-font.c | 2 +- + src/cairo.c | 59 +++++++++------- + src/cairo.h | 23 +++++- + src/cairoint.h | 40 +++++------ + test/user-font-proxy.c | 49 ++++++++++--- + 8 files changed, 301 insertions(+), 128 deletions(-) + +commit b8fc845094e07ad2520a2c10f27c532bd3273720 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 21:46:36 2008 -0400 + + [cairo-scaled-font-subsets] Fix bug with utf8 handling + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6b3f6dc77abbc48d741b92cd62f93da68f00b9a2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 20:45:54 2008 -0400 + + [unicode] Add _cairo_utf8_get_char_validated() + + src/cairo-unicode.c | 42 ++++++++++++++++++++++++++++++++++++++++-- + src/cairoint.h | 4 ++++ + 2 files changed, 44 insertions(+), 2 deletions(-) + +commit 8c514a40b80e11cc904db3ce9ee353839321044e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 20:44:45 2008 -0400 + + Add cairo_glyph/text_cluster_allocate/free + + These are needed by the upcoming cairo_scaled_font_text_to_glyphs() + + src/cairo-misc.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/cairo.h | 12 +++++++ + 2 files changed, 116 insertions(+) + +commit b01ad0835d25fbee91d037e4484ba652075ffb39 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 15:44:11 2008 -0400 + + [user-font] Add a cairo_t argument to cairo_user_scaled_font_init_func_t + + The init func does not actually need to draw anything, but having a cairo_t + similar to that passed to render_glyph is handy for computing font extents. + This is because cairo makes doing some things really hard (if not impossible) + without a cairo_t. + + The user-font-proxy test case is a great example of how the added cairo_t + makes life much easier. + + src/cairo-user-font.c | 44 +++++++++++++++++++++++++++------- + src/cairo.h | 8 +++++++ + test/user-font-proxy.c | 64 +++++++++++++++++++++++--------------------------- + test/user-font.c | 1 + + 4 files changed, 74 insertions(+), 43 deletions(-) + +commit d6ae23478ae6bde0714a50b2ed77e788f17cc03d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 15:43:21 2008 -0400 + + Check for NULL pointer in cairo_set_scaled_font + + src/cairo.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit b67d34e960fa07cfafb13e3a5b5b4a63cfb024d3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 7 15:42:58 2008 -0400 + + [gstate] Check for NULL font_face in _cairo_gstate_set_font_face + + src/cairo-gstate.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 7e57892983bbc639fe4a402a427b255e4d4ab746 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 6 21:37:36 2008 -0400 + + Add toy font constructor and getters + + New public API: + + cairo_toy_font_face_create() + cairo_toy_font_face_get_family() + cairo_toy_font_face_get_slant() + cairo_toy_font_face_get_weight() + + doc/public/cairo-sections.txt | 4 + + doc/public/tmpl/cairo-status.sgml | 2 + + doc/public/tmpl/cairo-text.sgml | 38 ++++++++ + src/cairo-font-face.c | 196 +++++++++++++++++++++++++++++++++++--- + src/cairo-gstate.c | 4 +- + src/cairo-misc.c | 4 + + src/cairo-surface.c | 2 + + src/cairo.c | 6 +- + src/cairo.h | 24 ++++- + src/cairoint.h | 10 +- + test/.gitignore | 1 + + test/Makefile.am | 3 + + test/toy-font-face.c | 129 +++++++++++++++++++++++++ + test/user-font-proxy-pdf-ref.png | Bin 0 -> 10174 bytes + test/user-font-proxy-ps-ref.png | Bin 8452 -> 7227 bytes + test/user-font-proxy.c | 43 +++++---- + 16 files changed, 421 insertions(+), 45 deletions(-) + +commit bca9a21e98c870cdb4695c9155517377757beaea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 6 20:40:23 2008 -0400 + + [docs] Update private header list + + doc/public/Headers.mk | 1 + + doc/public/Makefile.am | 1 + + 2 files changed, 2 insertions(+) + +commit 4bb7388b65ea56287f877f8241caa7a189c0c519 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 6 20:38:29 2008 -0400 + + Remove unnecessary checks for CAIRO_STATUS_INVALID_STRING + + We check that all input text is valid UTF-8. Not sure why the code + was being lenient to invalid strings. + + src/cairo-pdf-surface.c | 2 +- + src/cairo-scaled-font-subsets.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 5bac12252c79ea017457222b3cda2b82c8c33702 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Aug 8 01:47:36 2008 +0100 + + [xlib] Free regions on failure. + + Fix leak of regions along error path. + + src/cairo-xlib-surface.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 16939e1a8623a3671bf5ce848841616a45f79df2 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Thu Aug 7 19:19:39 2008 -0400 + + Center the group pattern transform around the device_transformed origin + + When popping a group, transform it by the ctm centered at the origin + specified by the device_transform so that it ends up in the right place + when we try to paint. This fixes the regressions caused by + 1a9809baab5d8adf6ccf165e8f5d294b498c2fd5 as shown by the pdf backend. + + src/cairo.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit e8ddbd1a1425586eac0d40675127d529b7029ea1 +Author: Jeff Muizelaar <jrmuizel@jrmuizel-desktop.(none)> +Date: Thu Aug 7 19:06:31 2008 -0400 + + Add a test case showing the invariance of push/pop_group + + This shows the regressions caused by + 1a9809baab5d8adf6ccf165e8f5d294b498c2fd5 + + test/Makefile.am | 3 ++ + test/clipped-group-ps-ref.png | Bin 0 -> 343 bytes + test/clipped-group-ref.png | Bin 0 -> 350 bytes + test/clipped-group.c | 96 ++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 99 insertions(+) + +commit f916e2178b6f52e3b3600d100dfe75bfa4bf12cb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 7 23:54:25 2008 +0100 + + [meta] Use the pre-computed device_transform_inverse. + + Avoid repeatedly inverting the same matrix by using the pre-computed + inverse. + + src/cairo-meta-surface.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +commit 523f7258014f9db421297d14804e71e1da9f9761 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 7 22:00:30 2008 +0100 + + [meta] Remove debugging assert. + + Remove an old assertion that no error occurred. + + src/cairo-meta-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 34eb420cc70f1d9df665d35dc9902a4313e7aace +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Thu Aug 7 13:25:02 2008 -0700 + + [misc] Remove trailing comma on enum + + src/cairoint.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit afdf3917ee86a7d8ae17f556db96478682674a76 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 09:19:02 2008 +0100 + + [configure.in] Slight massage for recent Ubuntu autotools. + + Fix up a couple of minor complaints about possibly undefined macros, + cached conditional values and suggested improvements. + + Makefile.am | 2 ++ + configure.in | 16 +++++++--------- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit 7c1078b830ac7b88a56dd2afa5dc48234e3b6e84 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 09:23:18 2008 +0100 + + Check return from pixman_image_set_filter(). + + Adding warn_unused_result to pixman detected a couple of instances where + we abused the knowledge that the code currently can not fail, but in + deference to its independent existence we should be more cautious. + + src/cairo-image-surface.c | 18 ++++++++++++++---- + src/cairo-pattern.c | 9 +++++++-- + 2 files changed, 21 insertions(+), 6 deletions(-) + +commit 56619a16ddc6add30b4a5c51ce02d7030752429f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Aug 7 08:25:37 2008 +0100 + + [cairo-surface] Use the pre-computed device_transform_inverse. + + Avoid inverting the device_transform when copying the pattern for the + destination surface by using the pre-computed inverse. + + src/cairo-surface.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +commit 6a4ddb6f47c552f416e6dec069eb57ebe16005fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 13:45:08 2008 +0100 + + [pattern] Set the reference count for stack allocations to 0. + + Keep the reference count as zero for temporary, on-stack patterns in + order to detect attempts to keep references beyond their scope. (And + mismatched _init()/_destroy()). + + src/cairo-pattern.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit ae7bdd7ee0642c5b0f2e1ea3dabf38e79cf18c0b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 13:00:21 2008 +0100 + + [valgrind] More suppressions for XrmGetStringDatabase(). + + Another variation in the callstack needs suppressing. + + test/.valgrind-suppressions | 32 ++++++++++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +commit 64ba6c74dbc5464da3093867b4f26166da7fbaff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 6 18:37:03 2008 -0400 + + Fix Ubuntu-specific issue with FC_LCD_NONE et al + + No idea if Ubuntu will ever learn not to modify public API of + common libraries without any clue of what kind of problems they + create by doing that. They could very well define + FC_UBUNTU_LCD_FILTER if they wanted to, but no, they defined + FC_LCD_FILTER as if it's an upstream thing. It wasn't. + + src/cairo-ft-font.c | 3 +++ + src/cairo-xlib-screen.c | 3 +++ + 2 files changed, 6 insertions(+) + +commit 1dc0f3a1ad2cfa7f910e4a729943fbddbb90637d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Aug 6 02:14:59 2008 -0400 + + [test/user-font] Document that Poppler is buggy with glyph 0 + + test/user-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0ec6c9ca6210649006e40d031a118c4c7ef437ea +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 11:11:24 2008 +0100 + + [pdf] Propagate status from emit_glyph() + + Propagate the error status from _cairo_pdf_operators_emit_glyph(). + + src/cairo-pdf-operators.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 2dfee9986c739b2fdadf551dd71e104df332b2b8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 10:51:34 2008 +0100 + + [pdf] Fixup a couple of inverted tests. + + Check for NULL returns from malloc, instead of reporting errors and + leaking on success. + + src/cairo-pdf-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7ffd8bbcb0078fe305a6bc7a37f809c0c6e1011a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Aug 6 00:36:47 2008 +0100 + + [cairo-font-options] Add private alias for set_lcd_filter() + + check-plt was rightfully claiming about an internal use of a public + symbol, so add the missing private alias. + + src/cairo-font-options.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit 221599ab0fc1a2fa878659fe5bef88104e56a07c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 5 16:30:02 2008 -0400 + + Finish off lcd-filter merge + + configure.in | 2 +- + doc/public/tmpl/cairo-font-options.sgml | 29 ++++++++++++++++++++ + doc/public/tmpl/cairo-text.sgml | 2 ++ + src/cairo-font-options.c | 4 +++ + src/cairo-ft-font.c | 48 ++++++++++++++++++++++----------- + src/cairo.h | 2 ++ + 6 files changed, 70 insertions(+), 17 deletions(-) + +commit 19b36fb88757e34e8340de175f3723e882b92de7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Aug 5 14:54:55 2008 -0400 + + [win32] Fix build + + src/Makefile.win32 | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit 65d017a4063242d221365371301e1aab5b3c6299 +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Tue Aug 5 13:52:13 2008 +0200 + + Add tests for the new LCD filter API + + test/Makefile.am | 4 ++ + test/font-options.c | 6 ++- + test/text-antialias-subpixel-ref.png | Bin 1121 -> 974 bytes + test/text-antialias-subpixel.c | 1 + + test/text-lcd-filter-fir3-ref.png | Bin 0 -> 974 bytes + test/text-lcd-filter-fir3.c | 85 +++++++++++++++++++++++++++++++ + test/text-lcd-filter-fir5-ref.png | Bin 0 -> 974 bytes + test/text-lcd-filter-fir5.c | 85 +++++++++++++++++++++++++++++++ + test/text-lcd-filter-intra-pixel-ref.png | Bin 0 -> 974 bytes + test/text-lcd-filter-intra-pixel.c | 85 +++++++++++++++++++++++++++++++ + test/text-lcd-filter-none-ref.png | Bin 0 -> 974 bytes + test/text-lcd-filter-none.c | 85 +++++++++++++++++++++++++++++++ + 12 files changed, 350 insertions(+), 1 deletion(-) + +commit 45ec5e77bb26b0f93b0b1e11bd3055e8c9611111 +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Wed Jan 23 00:05:00 2008 +0100 + + Add symbols for setting the LCD filter type on font options + + doc/public/cairo-sections.txt | 3 +++ + 1 file changed, 3 insertions(+) + +commit a0cad6c398f5e30e3d10fb19fe51d4266b1c0b4c +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Wed Jan 23 00:03:01 2008 +0100 + + [cairo-ft] Interaction with Fontconfig to deal with the LCD filter type + + src/cairo-ft-font.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 71 insertions(+), 1 deletion(-) + +commit f64cf7fb098e8c9be8a454d4675e6a8b7fd22589 +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Wed Jan 23 00:00:53 2008 +0100 + + [cairo-xlib] Support to retrieve the LCD filter type from the Xrm database + + src/cairo-xlib-screen.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit 28d18f3f936988483a47dd30f55ee2403bc006c3 +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Tue Jan 22 23:59:36 2008 +0100 + + [cairo-ft] Fontconfig defines for LCD constants when using Fontconfig < 2.6 + + This adds define for compatibility when without the new lcd filtering + constants (Fontconfig patch not yet applied, see bug 13566). + + src/cairo-ft-font.c | 9 +++++++++ + src/cairo-xlib-screen.c | 9 +++++++++ + 2 files changed, 18 insertions(+) + +commit 0013f2c2696146e71f043437a4727a1b18706b09 +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Tue Jan 22 23:57:32 2008 +0100 + + Add lcd filter type to the public API and font options + + New struct cairo_lcd_filter_t and new functions + cairo_font_options_set_lcd_filter + cairo_font_options_get_lcd_filter + + src/cairo-font-options.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- + src/cairo-types-private.h | 1 + + src/cairo.h | 26 ++++++++++++++++++++++++++ + 3 files changed, 73 insertions(+), 1 deletion(-) + +commit 4b5e0ba7200159f732c815bea616367fc851f245 +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Tue Jan 22 23:53:17 2008 +0100 + + [cairo-ft] LCD filtering patch coding style corrections + + src/cairo-ft-font.c | 493 +++++++++++++++++++++++++--------------------------- + 1 file changed, 237 insertions(+), 256 deletions(-) + +commit 7f870035177da7aa63fa33dce837528f442d9ffe +Author: Sylvain Pasche <sylvain.pasche@gmail.com> +Date: Tue Jan 22 23:51:32 2008 +0100 + + [cairo-ft] LCD filtering patch from David Turner + + This is the patch David Turner wrote some times ago and can be found on + http://david.freetype.org/lcd/cairo-1.2.4-lcd-filter-1.patch. It was + somewhat modified for compatibility with cairo 1.5 + + src/cairo-ft-font.c | 592 +++++++++++++++++++++++++++++++++++----------------- + 1 file changed, 404 insertions(+), 188 deletions(-) + +commit acdc306905b4a39911fd58e9d72aa3db5e1b8760 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Aug 5 13:16:17 2008 -0700 + + [win32] Adding cairo-features-win32.h to EXTRA_DIST + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 924a242f89ab1d86750512c8e4ee367c270ee07a +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Tue Aug 5 12:57:51 2008 -0700 + + [win32] Update win32 build, remove gcc dependency + + Makefile.win32 | 13 ++++++++++--- + src/Makefile.win32 | 20 ++++---------------- + src/cairo-features-win32.h | 40 ++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 54 insertions(+), 19 deletions(-) + +commit e1132d434e329c625667f6aff30634522108241e +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Wed Jul 30 13:05:01 2008 -0700 + + Make cairo_scaled_font_glyph_extents() unconditionally zero the extents + + This makes cairo_scaled_font_glyph_extents() match a similar pattern of + initialization in cairo_glyph_extents(). It also fixes the 'text-zero-len' test + that was broken by 676b221326cacdd205c225bba8ac43378b4abb81. + + src/cairo-scaled-font.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit d560a3d96563d681f5c0d8ebea0d255ac35bbc99 +Author: Peter Weilbacher <mozilla@Weilbacher.org> +Date: Fri Jul 25 11:19:11 2008 -0400 + + [OS/2] Fix build + + src/cairo-os2-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ba95b9dee8e6daddbeb0660d920c7b46801edc80 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 21 16:34:10 2008 -0400 + + [cairo-ft] Use FcFreeTypeCharIndex instead of FT_Get_Char_Index + + src/cairo-ft-font.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit bc42989501e8e604cbf8eb5348d4eb86d5a7cc4b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jul 21 16:29:57 2008 -0400 + + [configure.in] Cosmetic + + configure.in | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1a9809baab5d8adf6ccf165e8f5d294b498c2fd5 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Jul 21 22:24:42 2008 -0400 + + Fix scaling with a device offset + + Apply the device offset transformation to the pattern before the ctm one. + Fixes bug #16469. + + src/cairo-gstate.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 3074ba02a1c7ebdef45f7514f2e9505fc664ae6e +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> +Date: Mon Jul 21 22:08:46 2008 -0400 + + Add a test for scaling a surface with device offset. + + test/Makefile.am | 2 + + test/device-offset-scale-ref.png | Bin 0 -> 145 bytes + test/device-offset-scale.c | 81 +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 83 insertions(+) + +commit 96c9e2a1a8c96b22fe1ae1fb76e5885003148b68 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Fri Jul 18 15:55:11 2008 -0700 + + Fix cairo-quartz-image-surface compilation error + + src/cairo-quartz-image-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit ec9337697ea8d9fb10576c42ef2c29ff27636f86 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Jul 17 19:31:11 2008 -0700 + + cairo.h: Remove trailing comma in enumeration + + src/cairo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5284f8cab488c12db0ff0b12a4485072138b8008 +Author: Frederic Plourde <frederic.plourde@polymtl.ca> +Date: Thu Jul 17 13:56:22 2008 -0700 + + [win32] Make cairo-perf-diff run on win32 + + perf/Makefile.win32 | 4 ++++ + perf/README | 21 +++++++++++++++++ + perf/cairo-perf-diff | 6 ++++- + perf/cairo-perf-diff-files.c | 56 ++++++++++++++++++++++++++++++++++++++++++-- + 4 files changed, 84 insertions(+), 3 deletions(-) + +commit d61c7df1c0f9c69b0022c58efd001855551af7dd +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jul 9 13:20:53 2008 -0700 + + [quartz] Take snapshot instead of using CGImageCreateCopy + + CGImageCreateCopy doesn't copy the data provider, so it's possible to + free the data underneath an image without snapshotting it first. + + src/cairo-quartz-surface.c | 30 +++++++++++++++++++++--------- + 1 file changed, 21 insertions(+), 9 deletions(-) + +commit e534b0bed1bcf19017f76ee3a15bb26f42717b50 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Wed Jul 9 13:06:23 2008 -0700 + + [quartz] Protect against NULL from CGFontGetHMetricsPtr + + Seems to happen on 10.4 only for unknown reasons. Protect against a crash at least. + + src/cairo-quartz-font.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 7127089fe67690db997f86fd89b71820aa4fcdf0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 22:46:04 2008 +0930 + + PDF/PS: Remember the current line style + + So we don't need to emit line style parameters that are already set. + + src/cairo-pdf-operators-private.h | 13 +++++++++++ + src/cairo-pdf-operators.c | 48 +++++++++++++++++++++++++++------------ + 2 files changed, 47 insertions(+), 14 deletions(-) + +commit 837bf73f082f3bb0158b57cf7c456380531853b3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 22:00:15 2008 +0930 + + Add PDF operators function to reset any remembered state + + src/cairo-pdf-operators-private.h | 3 +++ + src/cairo-pdf-operators.c | 15 +++++++++++++++ + src/cairo-pdf-surface.c | 4 ++++ + src/cairo-ps-surface.c | 5 +++++ + 4 files changed, 27 insertions(+) + +commit 9b302fac63e461d2239435d058c5a114b8aa21a7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 21:51:41 2008 +0930 + + PDF: Oops - turn compression back on + + src/cairo-pdf-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 50eb1e71f3199922f50992e53f045614177365f8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 21:36:19 2008 +0930 + + PS: Ensure the color is re-emitted after resetting the clip path + + because the graphics state has been restored. + + src/cairo-ps-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit b082c15df649467e2bd51535802f27c762eee257 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 21:18:45 2008 +0930 + + PDF: Don't use a Form dictionary for the content stream + + because pdfTeX (and maybe other PDF consumers) can not handle it. + + Previously the content stream was an Form dictionary because at the + time the content is written it is not known whether the content stream + will be belong to the page or be an XObject in a knockout group. With + the additional of the paginated surface function + set_fallback_images_required() this information is now known at the + time the content is emitted. + + src/cairo-pdf-surface.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit 4fcdc364cd3f9d7d5cd8026adac23a651b608781 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 21:12:54 2008 +0930 + + Add paginated surface backend function _set_fallback_images_required + + src/cairo-paginated-private.h | 8 ++++++++ + src/cairo-paginated-surface.c | 9 +++++++++ + 2 files changed, 17 insertions(+) + +commit 0c05aa60f5bfa4b6f280aedec684c20aed793a90 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 21:12:28 2008 +0930 + + PDF: Limit precision of Td operands + + As the translation is in text space, the full precision of a double + for numbers close to zero is not required. Limit the precision to the + same as for numbers > 1. + + src/cairo-pdf-operators.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit d5c7b87ca989d3b4b5faeafc6e579b6c63d1e8dc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 20:57:57 2008 +0930 + + PDF: Ensure clip is not emitted outside of stream + + Sylvain Munaut discovered a bug in + _cairo_pdf_surface_emit_meta_surface() where the clip may be emitted + after the stream is closed. Fix this by moving the call to + _cairo_surface_set_clip() to before the stream is closed. + + src/cairo-pdf-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 130cd29a700c858ef3c8a839479bd02b70403569 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jul 8 20:55:38 2008 +0930 + + PDF: remove meta surface group clean + + The group that was being cleaned up was removed in + 099810b6c39cc6b5529f740282b64185cf56c8d7 + + src/cairo-pdf-surface.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit fe7973d60a53b5c7465fd616c515f8fc1ac6cb12 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 6 15:15:15 2008 +0100 + + [cairo-scaled-font-subsets] Fix memleak. + + Valgrind reported that sub_font_glyph->utf8 was not being freed along + with the cairo_sub_font_glyph_t. + + src/cairo-scaled-font-subsets.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 07b39ee3c0f053598fdebdd160dc881566ad7fcd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jul 6 15:14:22 2008 +0100 + + [cairo-scaled-font-subsets] Fix use of unitialised variable. + + Valgrind reported that pdf-operators tried to use an uninitialised + subset_glyph->utf8_is_mapped. + + src/cairo-scaled-font-subsets.c | 1 + + 1 file changed, 1 insertion(+) + +commit f92131c38a21a15a5adfbc831cf6eea7a749714d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jul 5 16:23:43 2008 +0930 + + PS: Remember current color + + This allows PDF operators to merge text strings together when they are + all the same color. + + src/cairo-ps-surface-private.h | 6 ++++++ + src/cairo-ps-surface.c | 34 +++++++++++++++++++++++++++++++--- + 2 files changed, 37 insertions(+), 3 deletions(-) + +commit dac22cf2b9541c1da72e12a1fb66c5a58775f3b3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jul 5 16:22:35 2008 +0930 + + PDF: Fix glyph positioning bug in Tj operator + + Previously this was not correctly checking the position of the first + glyph and falling back to using TJ if the glyph was not at the the + standard glyph advance. + + src/cairo-pdf-operators.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c9c4b0eded58e44e527806f24aa76e7874fb2111 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jul 5 16:19:30 2008 +0930 + + PDF: Fix glyph positioning bug in TJ operator + + Previously this was not correctly positioning the first glyph in a TJ + string if the glyph was not at the the standard glyph advance. + + src/cairo-pdf-operators.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 0f748df6705731b94204d6dd0c903e18f1d4a8a5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jul 5 16:14:31 2008 +0930 + + PS: Remember position when changing font + + Previously the PS emulation of the PDF operators would change the + current position to the text line matrix instead of the the text + matrix when changing the font. + + src/cairo-ps-surface.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit 1c729f85edf967d086eeb85b9222466087e70da4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 3 19:15:53 2008 -0400 + + [cairo-pattern] Fix crash in solid-pattern-surface cache + + Ickle knew something when he only extended cache size when we are + committed to inserting something into the cache. I broke that while + fixing other issues a while ago. This cache just doesn't want to + give us any rest... + + src/cairo-pattern.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 7c9536b653c062884e2a389d6d3428c42b86aae2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jul 3 18:05:27 2008 -0400 + + [analysis-surface] Fix crashers introduced in my previous commit + + Oops! + + src/cairo-analysis-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 37ed55acef5ff9d6d053cfb76af8bdcd1f91edd5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jul 3 20:27:50 2008 +0930 + + Add missing status checks + + src/cairo-pdf-operators.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 85de817e097c83136fdf827c9202416c02d72bbb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jul 2 19:21:50 2008 -0400 + + [analysis-surface] Fallback between show_glyphs and show_text_glyphs + + This is needed because analysis-surface takes any UNSUPPORTED returns + as a signal for using image fallbacks. So the fallback mechanism in + _cairo_surface_show_text_glyphs() is not enough. Reported by Adrian + Johnson. + + src/cairo-analysis-surface.c | 47 ++++++++++++++++++++++++++++++++------------ + src/cairo-surface.c | 8 +++++--- + 2 files changed, 39 insertions(+), 16 deletions(-) + +commit d19d9b414946f668f0c073f39bc5e413cabdb069 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 30 22:13:44 2008 -0400 + + [cairo-pdf-operators] Fix backward cluster iteration + + It's trickier than it appears... + + There still remains the question of whether the loop should iterate + utf8 forward and glyphs backward (as it does now), or iterate glyphs + forward and utf8 backward. + + Doing utf8 forward has the benefit that glyphs appear in the PDF stream + in the logical order of text. That may be a good thing. + + Doing glyphs forward has the benefit of most glyphs taking their natural + width, providing for a more compact PDF output. + + Firefox 3 currently calls cairo_show_glyphs() with glyphs going + right-to-left for RTL runs. That's like going utf8 forward. + + On the other hand, if we are fine doing glyphs backward, then we may as + well remove the "backward" flag and ask callers of show_text_glyphs to + produce glyph array going right to left for RTL runs. The idea behind + having a backward flag in the first place was to allow keeping utf8 in + logical order and glyphs in visual left-to-right order. If we don't + do that in practice, there's no point in having the flag. Another design + idea of the flag was to mark right-to-left runs explicitly so the backend + can use this information. In that case we probably better rename it to + "rtl" as the current semantics make it perfectly fine to set a LTR segment + with backward flag on: just revers the glyph array... + + Anyway, the way to determine the right thing to do is to see how Acrobat + extracts text for RTL text in logical vs visual order. Then we can decide + what to do in the PDF backend and whether the flag is worth keeping. + Going to experiment with that. + + src/cairo-pdf-operators.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit c29029ce436709fc3f3ce651a92eebcee11f3203 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 30 22:11:48 2008 -0400 + + Remove _cairo_surface_show_glyphs() in favor of _cairo_surface_show_text_glyphs() + + src/cairo-paginated-surface.c | 43 +++--------------------------------- + src/cairo-surface.c | 22 ++----------------- + src/cairoint.h | 8 ------- + src/test-meta-surface.c | 50 ++++++++++++++++++++++++++++++------------ + src/test-paginated-surface.c | 51 ++++++++++++++++++++++++++++++++----------- + 5 files changed, 79 insertions(+), 95 deletions(-) + +commit 17a5f10f5342ae6b946ad7491f6656a43df66aa3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 29 15:00:10 2008 -0400 + + [show_text_glyphs] Allow clusters with zero text + + As Adrian points out, PDF can handle it, and it doesn't harm allowing. + + src/cairo.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 686fa2600d25a2f69762b85435ce7f3a9907533b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 29 13:56:14 2008 -0400 + + [PDF] Remove show_glyphs that was a wrapper to show_text_glyphs + + The cairo-surface layer already does that itself. Just set show_glyphs + to NULL. + + src/cairo-pdf-surface.c | 21 +-------------------- + 1 file changed, 1 insertion(+), 20 deletions(-) + +commit 6227d808446a0212d3872be9d09d67e3ce644cd3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 29 14:32:17 2008 +0100 + + [cairo-scaled-font-subsets] And free the allocated memory on failure. + + Why, oh why, did I only spot this when reading cairo-commit? + + src/cairo-scaled-font-subsets.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit c394b72ee99882882897776115b007f40a96fe95 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 29 13:16:10 2008 +0100 + + [cairo-scaled-font] Suppress compiler warning about unused variables. + + Use _cairo_error_throw() for the cases where we cannot propagate the + status return. + + src/cairo-scaled-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5b7903d5a75b10c924c91654e22a78650796ae63 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sun Jun 29 13:09:17 2008 +0100 + + [cairo-scaled-font-subsets] Add missing malloc check. + + A minor oversight in d77b04fd0635c1648bb024b5308b715c220e1e74. + + src/cairo-scaled-font-subsets.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 22facbe66e5fd72c6c5ce780d3699fe7a63dc7fb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:55:41 2008 +0930 + + Add show_text_glyphs to PDF surface + + src/cairo-pdf-surface-private.h | 5 +++ + src/cairo-pdf-surface.c | 97 +++++++++++++++++++++++++++++++++-------- + 2 files changed, 84 insertions(+), 18 deletions(-) + +commit 770b7c9a74e3497692020255686c5c5b4e38001e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:38:13 2008 +0930 + + Add show_text_glyphs to PDF operators + + src/cairo-pdf-operators-private.h | 16 ++- + src/cairo-pdf-operators.c | 293 +++++++++++++++++++++++++++++--------- + src/cairo-pdf-surface.c | 20 +-- + src/cairo-ps-surface.c | 15 +- + 4 files changed, 264 insertions(+), 80 deletions(-) + +commit 55dda8c64fc38cda75878f1a34eb1f86b1a445cb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:36:29 2008 +0930 + + Remove unused map_glyphs_to_unicode functions + + src/cairo-ft-font.c | 35 ------------------ + src/cairo-win32-font.c | 96 -------------------------------------------------- + src/cairoint.h | 4 --- + 3 files changed, 135 deletions(-) + +commit 2012d4f7364f9efa0789996e7906f269d5d59d41 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:36:10 2008 +0930 + + Removed unused cairo_truetype_create_glyph_to_unicode_map() + + src/cairo-truetype-subset.c | 147 -------------------------------------------- + 1 file changed, 147 deletions(-) + +commit 154324f121e7aad8af474ac26e0e320cddd37579 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:35:43 2008 +0930 + + Use subset utf8 mapping to create the glyph names for PS fonts + + src/cairo-scaled-font-subsets.c | 36 ++++++++++++++++-------------------- + 1 file changed, 16 insertions(+), 20 deletions(-) + +commit 2a21fafa078a2519dea7881b4553d74667c928f2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:35:12 2008 +0930 + + Use subset utf8 mapping in PDF ToUnicode stream + + src/cairo-pdf-surface.c | 69 +++++++++++++++++++++++++++++++++---------------- + src/cairoint.h | 2 +- + 2 files changed, 48 insertions(+), 23 deletions(-) + +commit d77b04fd0635c1648bb024b5308b715c220e1e74 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:33:58 2008 +0930 + + Allow _cairo_scaled_font_subsets_map_glyph() to specify utf8 mapping + + src/cairo-pdf-operators.c | 1 + + src/cairo-scaled-font-subsets-private.h | 14 +++- + src/cairo-scaled-font-subsets.c | 112 +++++++++++++++++++++++++++++++- + src/cairo-svg-surface.c | 1 + + src/cairoint.h | 1 + + 5 files changed, 124 insertions(+), 5 deletions(-) + +commit f4d6e714a63ab44e388a06fba8d849f2ad7f0000 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:32:19 2008 +0930 + + Add _cairo_ucs4_to_utf8 + + src/cairo-unicode.c | 39 +++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 4 ++++ + 2 files changed, 43 insertions(+) + +commit 2f99a294cd2367c4649428534b3429522448260c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:31:47 2008 +0930 + + Add _cairo_truetype_index_to_ucs4() + + for doing reverse cmap lookups on truetype/opentype fonts one glyph at + a time. + + src/cairo-scaled-font-subsets-private.h | 22 +++++ + src/cairo-truetype-subset.c | 151 ++++++++++++++++++++++++++++++++ + 2 files changed, 173 insertions(+) + +commit 95771d62c57c081fe350e0d33326aaa6a27139da +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:31:23 2008 +0930 + + Implement win32 index_to_ucs4 font backend function + + src/cairo-win32-font.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 93 insertions(+) + +commit 4619b0b309861daa64b9c3ced9fdea20c461edf2 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:30:14 2008 +0930 + + Add index_to_ucs4 font backend function and FT implementation + + src/cairo-ft-font.c | 31 +++++++++++++++++++++++++++++++ + src/cairoint.h | 7 ++++++- + 2 files changed, 37 insertions(+), 1 deletion(-) + +commit 54f63e7859baeff18f7345cf22630d6a9b709e1c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 29 19:28:39 2008 +0930 + + PDF: Ensure text object is closed before emitting fill or stroke + + src/cairo-pdf-operators.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 4ffea75d908ef041fbc5aa1da9a5b725d3c24263 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 27 11:18:22 2008 -0400 + + Change cairo_text_cluster_t members signed + + Also reject clusters with no text. + + src/cairo.c | 19 ++++++++++--------- + src/cairo.h | 4 ++-- + 2 files changed, 12 insertions(+), 11 deletions(-) + +commit 4530c0b0ecdd19cfcbcb6d21b1db426ab42793d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 17:15:42 2008 -0400 + + [meta-surface] Implement show_text_glyphs; Remove show_glyphs + + One is enough. The only downside is that meta-surface will consume + 32 more bytes per show_glyphs() call now. If that's a concern, + the show_glyphs implementation can be added back. + + src/cairo-meta-surface-private.h | 13 ++-- + src/cairo-meta-surface.c | 131 +++++++++++++++++++++++++++------------ + 2 files changed, 101 insertions(+), 43 deletions(-) + +commit 93c3eebc6ec740317650e8ec166ae5311c12f0d7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 16:45:09 2008 -0400 + + [paginated-surface] Implement show_text_glyphs + + src/cairo-paginated-surface.c | 60 ++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 59 insertions(+), 1 deletion(-) + +commit 8f02cadf3dc0ed4aedfafad4644a5fdc9d3e8168 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 16:44:59 2008 -0400 + + [analysis-surface] Implement show_text_glyphs + + src/cairo-analysis-surface.c | 82 +++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 81 insertions(+), 1 deletion(-) + +commit 047566fd526f7936a49b630ed47c570dd70e837f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 16:15:12 2008 -0400 + + Add cairo_show_text_glyphs API + + New public API: + + cairo_text_cluster_t + cairo_has_show_text_glyphs() + cairo_show_text_glyphs() + + Add accompanying gstate and surface functions, and surface backend methods. + No backends implement them just yet. + + doc/public/cairo-sections.txt | 3 ++ + doc/public/tmpl/cairo-status.sgml | 1 + + doc/public/tmpl/cairo-text.sgml | 31 +++++++++++ + src/cairo-gstate.c | 38 +++++++++---- + src/cairo-misc.c | 2 + + src/cairo-scaled-font.c | 14 +++-- + src/cairo-surface.c | 110 +++++++++++++++++++++++++++++++------- + src/cairo.c | 109 +++++++++++++++++++++++++++++++++++-- + src/cairo.h | 22 +++++++- + src/cairoint.h | 48 +++++++++++++++-- + 10 files changed, 336 insertions(+), 42 deletions(-) + +commit dff0dd0c63e530e21471531299a8f260cf88f001 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 15:58:06 2008 -0400 + + Allow NULL output in _cairo_utf8_to_ucs4() + + The function can be used to validate UTF-8 text now. + + src/cairo-unicode.c | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +commit 883c972a9bc0aafb817a02c7b4a8c6f250796405 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 16:08:39 2008 -0400 + + [cairo-types] fix doc syntax + + src/cairo-types-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 787fb135663ebd9ab4a8d38da8fafc5e82d47ec5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 16:08:21 2008 -0400 + + [xlib] Use _cairo_xlib_surface_create_internal() directly + + src/cairo-xlib-surface.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit ba62d2d30a960d921f6efe84e2d6dc93d0de6e39 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 26 16:20:47 2008 -0400 + + Update .gitignore files + + boilerplate/.gitignore | 1 + + doc/public/.gitignore | 1 + + test/.gitignore | 2 ++ + 3 files changed, 4 insertions(+) + +commit 425846dedbca749a4a19e8a8827887bb70201c8d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 24 15:09:33 2008 -0400 + + Oops. Fix thinko in previous commit. + + src/cairo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 74789a702bf5c62bc0d0361f139b2c94f67d5c6e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 24 15:07:07 2008 -0400 + + Cleanup _set_error functions a bit + + src/cairo-font-face.c | 2 ++ + src/cairo-pattern.c | 7 +++++-- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-surface.c | 5 +++-- + src/cairo.c | 7 +++++-- + 5 files changed, 17 insertions(+), 8 deletions(-) + +commit ace3a98a53ab596c83df5a163e580770b9771bf2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 24 15:02:14 2008 -0400 + + Make sure cairo_int_status_t values fit in int8_t + + It was reported by Liu Yubao that cairo_status_t may be chosen to be + an int8_t by the compiler, in that case cairo_int_status_t values + assigned to cairo_status_t would overflow. Fix this by allocating + the values in int8_t range, and add compile-time sanity checks. + + src/cairo-misc.c | 2 ++ + src/cairo-types-private.h | 13 ++++++++----- + 2 files changed, 10 insertions(+), 5 deletions(-) + +commit f32090fb34f93d42bd134ee7c007f60dd1cd1c13 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 23 17:56:28 2008 -0400 + + Return CAIRO_STATUS_NEGATIVE_COUNT if num_glyphs is negative + + src/cairo-scaled-font.c | 6 ++++++ + src/cairo.c | 15 +++++++++++++++ + 2 files changed, 21 insertions(+) + +commit 498f3ddf2e8f6b7c381c7153cbd39fa22c32ceea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 23 17:53:25 2008 -0400 + + Add status CAIRO_STATUS_NEGATIVE_COUNT + + To be used for things like passing a negative number of glyphs + to cairo_show_glyphs(). + + doc/public/tmpl/cairo-status.sgml | 1 + + doc/public/tmpl/cairo-user-fonts.sgml | 2 -- + src/cairo-misc.c | 2 ++ + src/cairo-surface.c | 1 + + src/cairo.h | 4 +++- + src/cairoint.h | 2 +- + 6 files changed, 8 insertions(+), 4 deletions(-) + +commit ce24588d1c5e82e598cdad68c910a64f64864c7b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 23 17:51:32 2008 -0400 + + [doc] Update doc/public/Headers.mk + + doc/public/Headers.mk | 2 ++ + 1 file changed, 2 insertions(+) + +commit 676b221326cacdd205c225bba8ac43378b4abb81 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 23 17:39:16 2008 -0400 + + Protect against NULL glyphs array in text API + + We still don't do anything if num_glyphs is negative. Why isn't + that argument unsigned int... + + src/cairo-scaled-font.c | 9 +++++++++ + src/cairo.c | 24 +++++++++++++++++++++--- + 2 files changed, 30 insertions(+), 3 deletions(-) + +commit 233b387c29f2108a41fca14cc275337903117169 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 23 00:30:04 2008 -0400 + + Use #include "cairo-*." instead of #include <cairo-*.h> + + The rule is simple: <x.h> for system / other project includes, + "x.h" for local includes. + + src/cairo-beos.h | 2 +- + src/cairo-directfb.h | 2 +- + src/cairo-ft-private.h | 4 ++-- + src/cairo-ft.h | 2 +- + src/cairo-glitz.h | 2 +- + src/cairo-mutex-impl-private.h | 2 +- + src/cairo-mutex-type-private.h | 2 +- + src/cairo-os2-private.h | 2 +- + src/cairo-os2.h | 2 +- + src/cairo-pdf.h | 2 +- + src/cairo-ps.h | 2 +- + src/cairo-quartz-image.h | 2 +- + src/cairo-quartz-private.h | 2 +- + src/cairo-quartz.h | 2 +- + src/cairo-svg.h | 2 +- + src/cairo-win32-private.h | 4 ++-- + src/cairo-win32.h | 2 +- + src/cairo-xcb-xrender.h | 2 +- + src/cairo-xcb.h | 2 +- + src/cairo-xlib-xrender.h | 2 +- + src/cairo-xlib.h | 2 +- + src/cairo.h | 4 ++-- + 22 files changed, 25 insertions(+), 25 deletions(-) + +commit 9fea50a1e6c15ad6a80c941f6ddaba768e84e951 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 22 15:15:44 2008 -0400 + + Rename _cairo_font_reset_static_data to _cairo_font_face_reset_static_data + + src/cairo-debug.c | 6 +++--- + src/cairo-font-face.c | 2 +- + src/cairoint.h | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 7407362d705516262fed9f5bccfb8d3d5a26632f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 22 15:13:42 2008 -0400 + + Rename cairo_quartz_scaled_font_backend to _cairo_quartz_scaled_font_backend + + src/cairo-quartz-font.c | 4 ++-- + src/cairoint.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 4240794ea4d25bfa9c0edd10243a94ab00275387 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 22 15:13:15 2008 -0400 + + Rename cairo_win32_scaled_font_backend to _cairo_win32_scaled_font_backend + + src/cairo-win32-font.c | 8 ++++---- + src/cairoint.h | 4 ++-- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit e09f20fe01f17f093acefd341a517fcb83b6ea1e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 22 14:50:08 2008 -0400 + + [gstate] Fix huge-font path;fill fallback options + + src/cairo-gstate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d9784c8c37a2c6dbcccd3e96e746f32b12a2b468 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 22:24:13 2008 -0400 + + [cairo-xlib] Don't undither pseudocolor, doesn't look good + + src/cairo-xlib-surface.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +commit fe41d100aa5cddb56b8a5f043c01fdf1f1a1e4c5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 21:39:19 2008 -0400 + + [cairo-xlib-surface] Fix core solid_fill_rectangles to do dithering + + Do this by tiling the surface form the solid pattern. The pattern in + turn calls into xlib's create_solid_surface which returns a dithered + pattern. + + This can get into infinite loop right now, because of the way solid + surface cache tries to repaint cached surfaces. + + src/cairo-xlib-surface.c | 70 +++++++++++++++++++++++------------------------- + 1 file changed, 34 insertions(+), 36 deletions(-) + +commit abac0f96cb39b60a88433918d193f6d5091ea8d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 21:37:45 2008 -0400 + + [cairo-xlib-surface] Implement create_solid_pattern_surface + + If render is disabled, this will create a surface the size of the + dither pattern and paint it with dithering. + + src/cairo-xlib-surface.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 73 insertions(+), 3 deletions(-) + +commit fb8f2b3854114a653d11263e8868eae042ee4b94 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 02:35:30 2008 -0400 + + [cairo-xlib-surface] Make _draw_image_surface handle arbitrary image formats + + This is not a useful change. Just committing because I already did it. + + src/cairo-xlib-surface.c | 42 +++++++++++++++++++++++++++--------------- + 1 file changed, 27 insertions(+), 15 deletions(-) + +commit bc4b788ec187c84c2f8a6c0f68c1892ecaab3bcc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 02:44:37 2008 -0400 + + [cairo-xlib-surface] In _get_image_surface only use pixman formats >= 24bpp + + Otherwise we can't do dithering. This drastically improves gradient rendering + on 16bit displays, essentially making them indistinguishable from 32bit ones + with a naked eye. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5faf8663b228eafa60fee1f0a1ac9e9f9406134d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 00:46:01 2008 -0400 + + [cairo-xlib-surface] Force buggy_repeat to TRUE if Render is not available + + So we use more core protocol paths. + + src/cairo-xlib-surface.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit e7c1fc5bf53b4adf16f2d0c7e613c848bede6824 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 25 17:50:37 2008 +0430 + + [xlib] Implement dithering + + Remove the intermediate rgb333 for PseudoColor and work on the + cube directly. Also upgrade to a 6x6x6 cube instead of 5x5x5. + Do dithering on both PseudoColor and TrueColor, using a 4x4 pattern. + + This only affects X servers with no XRender. + + src/cairo-xlib-private.h | 12 ++- + src/cairo-xlib-surface.c | 189 +++++++++++++++++++++++++++++++++-------------- + src/cairo-xlib-visual.c | 103 ++++++++++++++++++-------- + 3 files changed, 215 insertions(+), 89 deletions(-) + +commit c0176dc54cf16a3a9504977d80184e4608783052 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 00:43:31 2008 -0400 + + [cairo-xlib-surface] Remove unused macro + + src/cairo-xlib-surface.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 93efdce43a05299abef4f2b8220d3b7d9869597b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jun 13 21:36:14 2008 -0400 + + Add a create_solid_pattern_surface surface backend method + + This can be used by _cairo_pattern_acquire_surface_for_solid() to let + the backend create custom surfaces for solid fill instead of a 1x1 + similar surface. + + src/cairo-pattern.c | 10 ++-------- + src/cairo-surface.c | 37 +++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 20 ++++++++++++++++++-- + 3 files changed, 57 insertions(+), 10 deletions(-) + +commit ff1371a0a7494f986385730a82823cbf56790d5b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 21:06:07 2008 -0400 + + [cairo-surface] Remove optional pattern argument from create_similar_solid() + + This was added in 41c6eebcd1fab94fd3a91d09f1ef6ee0d8c7a044, to avoid + allocating short-lived patterns. However, this was error prune as the + color information was duplicated in the pattern and could get out of + sync. Indeed, it was out of sync before this commit in the call from + cairo-clip.c. + + By allocating the solid pattern on the stack we fix the original problem + without creating new ones. + + src/cairo-clip.c | 3 +-- + src/cairo-glitz-surface.c | 3 +-- + src/cairo-pattern.c | 3 +-- + src/cairo-surface.c | 24 +++++++----------------- + src/cairoint.h | 6 +----- + 5 files changed, 11 insertions(+), 28 deletions(-) + +commit 240cb59fe8706b1b0d3aae4a4ed3d13472033d1d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 19:49:23 2008 -0400 + + [cairo-pattern] Clean up _cairo_pattern_acquire_surface_for_solid() + + src/cairo-pattern.c | 54 +++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 34 insertions(+), 20 deletions(-) + +commit 2a592877110f34753da0b9e61d5c5f8c83f4ddd9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 19:28:49 2008 -0400 + + Fix comment + + src/cairo-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b0d112756f1f8af7cf38d1e7542cb2e4453e7b07 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 19:25:33 2008 -0400 + + Remove opaque solid pattern COLOR_ALPHA optimization from call sites + + As we do this in _cairo_pattern_init_solid() now. + + src/cairo-glitz-surface.c | 5 +---- + src/cairo-pattern.c | 10 ++-------- + 2 files changed, 3 insertions(+), 12 deletions(-) + +commit e93e9903241bc0996bfce7c43d030f33cd33730b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 19:22:02 2008 -0400 + + [cairo-pattern] In init_solid() convert COLOR_ALPHA to COLOR if color is opaque + + Moving this further than, so it benefits all callers. + + src/cairo-pattern.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 333a49d01d431a808c754cfa900e83a733010083 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 19:18:57 2008 -0400 + + [cairo-pattern] Don't call _cairo_stock_color() directly + + src/cairo-pattern.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 4eae72317f117941617b426daa682fa4f1bf3d25 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 19:08:50 2008 -0400 + + [cairo-pattern] Remove stale comment + + src/cairo-pattern.c | 1 - + 1 file changed, 1 deletion(-) + +commit 52cf67a8f2c2ca2c5c233756cfa7f56855e67f27 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 17:44:43 2008 -0400 + + Rename cairo_* global vars to _cairo_* + + src/cairo-ft-font.c | 8 ++++---- + src/cairo-pattern.c | 2 +- + src/cairo.c | 6 +++--- + src/cairoint.h | 6 +++--- + 4 files changed, 11 insertions(+), 11 deletions(-) + +commit 9388cc71db8d6e019061f289c0a72ebaa3432c8c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 17:43:52 2008 -0400 + + [src/check-def.sh] Make sure no global variables are named cairo_* + + Even if they are marked cairo_private. + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aef25b83450e3e17bedce2ffbae58f7b326e0f61 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 19 17:31:10 2008 -0400 + + [cairo-pattern] Fix solid surface cache to check for content match too + + The code in that cache is becoming uglier and uglier. But at least it + works correctly again. Time for a rewrite. + + (Also move the destroy after unlocking) + + src/cairo-pattern.c | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +commit 565644e616ea64f97769d8939beb155f4031da2f +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 19 11:42:43 2008 +0100 + + [cairo-pattern] Band-aid for the solid surface cache. + + Behdad noticed that the mixing of dissimilar surfaces within the cache + was fubar + (http://lists.cairographics.org/archives/cairo/2008-June/014348.html). + + This corrects the dereferencing of the evicted surface, but leaves open + the question of the future of the cache. + + src/cairo-pattern.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 47d8739ea198510919b2611c34a44aa3c63f3f59 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 19 11:38:38 2008 +0100 + + [test/xlib-surface-source] Build under --disable-xlib-xrender. + + Add an ifdef to support compiling without XRender. + + test/xlib-surface-source.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 38c4bcc2da225b36455ee3da396305a7d93d4c1d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Jun 19 09:44:58 2008 +0100 + + [test/solid-pattern-cache-stress] Do what it says on the tin. + + Actually draw to the surface after setting the source in order to + trigger use of the solid surface cache. + + test/Makefile.am | 1 + + test/solid-pattern-cache-stress-ref.png | Bin 0 -> 107 bytes + test/solid-pattern-cache-stress.c | 148 +++++++++++++++++++++++++------- + 3 files changed, 118 insertions(+), 31 deletions(-) + +commit 233ba271d626832c2a6332515e2301d68e6051e5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jun 18 20:14:42 2008 -0400 + + [cairo-xlib-xrender] Simplify dummy XRender function stubs + + for the case of missing Xrender that is. This compiles + warning-clean now. + + src/cairo-xlib-xrender-private.h | 119 ++++++++++++++++++--------------------- + 1 file changed, 54 insertions(+), 65 deletions(-) + +commit d36347e0e2079840ebde0e83791fdce4844e2994 +Author: M Joonas Pihlaja <jpihlaja@cc.helsinki.fi> +Date: Wed Jun 18 18:35:42 2008 +0300 + + Bug: tessellator sometimes ends rightmost trapezoids too late + + Reported on the cairo mailing list: + + http://lists.cairographics.org/archives/cairo/2008-May/014233.html + + The tessellator would sometimes produce self-intersecting trapezoids + because it would skip the last edge in the active list when deciding + whether we can continue the current trapezoid or not. + + The bug never caused a problem with pixman based rasterisation + because pixman stops filling in a trapezoid once it detects a self + intersection. + + src/cairo-bentley-ottmann.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f2ea46edf4cec3d59f56d90c6f12b0896715022d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Oct 11 22:51:09 2007 +0100 + + [cairo-xlib-surface] Optimize away clip that covers the entire surface. + + Replace a clip rectangle that covers the entire surface with no + clipping as this is quite a common operation when toolkits (i.e. GTK+) + clear surfaces before drawing and avoids a redundant + XRenderSetClipRectangles. + + src/cairo-xlib-surface.c | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +commit b06bd9379a9841da1d1448534c320fb45e6d6d83 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 28 20:32:40 2008 +0100 + + [cairo-xlib-surface] Handle a NULL visual along core FillRectangles path. + + It is possible for an XRender capable surface to use + _cairo_xlib_surface_solid_fill_rectangle() if the surface + HAS_CREATE_PICTURE() && ! HAS_FILL_RECTANGLES(), in which case we need to + handle the surface having no associated visual. + + Fixes test/xlib-expose-event. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit db32e5ffcc9b06aab623987ecb3b64b9aaf8eca2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 28 17:44:35 2008 +0100 + + [check-def.sh] Ignore magic PPC symbols + + It appears that the PowerPC Linux ABI specifies a number of magic + functions for register saves and restores which currently appear as + exported symbols in the shared object. Ignore them. + + src/check-def.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad9a334e2c86ec3745d45f4d1f113999a731ed70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 28 15:42:09 2008 +0100 + + Allocate the correct pattern type on the stack. + + Instead of allocating the union of all possible pattern types, just + allocate the specific pattern as used by the function in order to trim + the stack space consumption and flag potential misuse. + + src/cairo-clip.c | 4 ++-- + src/cairo-glitz-surface.c | 4 ++-- + src/cairo-ps-surface.c | 4 ++-- + src/cairo-quartz-surface.c | 6 +++--- + src/cairo-surface-fallback.c | 24 ++++++++++++------------ + src/cairo-win32-printing-surface.c | 5 +++-- + src/cairo-win32-surface.c | 4 ++-- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo.c | 4 ++-- + 10 files changed, 32 insertions(+), 31 deletions(-) + +commit 74c1e9b5455cd14bfc077a5be2d45a47df666cd4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat May 10 08:11:54 2008 +0100 + + Trivial warning fixes to silence the compiler. + + src/cairo-analysis-surface.c | 56 +++++++++++++++++++++++++++++++++++++++----- + src/cairo-xlib-surface.c | 25 ++++++++++---------- + 2 files changed, 63 insertions(+), 18 deletions(-) + +commit b235050316256b15f9547f2f587847c6a561c76c +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri May 9 11:26:39 2008 +0100 + + [cairo-pattern] Generate an opaque solid colour if alpha >= 1. + + If the user supplies an alpha value of >= 1 to + cairo_pattern_create_rgba(), substitute a call to + cairo_pattern_create_rgb() instead. + + src/cairo-pattern.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 40e1aa60f2c0cd8c4b897c8e9806d1750632b43d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 8 20:48:19 2008 +0100 + + [cairo-pattern] Try to repaint the evicted surface from the solid surface cache. + + Behdad Esfahbod complained that commit + 8457374c9cf350841a7c16f1ef1657aeb354e5c9 overwhelmed the function with + added complexity and arbitrary limited a backend to one-quarter of the + cache. The elegant solution, he outlined, was to look at the surface that + would be evicted and if possible repaint it, instead of creating a + replacement. This not only simplifies the code, reduces the number of + checks performed to find a match (or victim) and allows the cache to be + naturally shared between the various backends. + + src/cairo-pattern.c | 111 +++++++++++++++++++++++----------------------------- + 1 file changed, 50 insertions(+), 61 deletions(-) + +commit ea79af728c2ac9c8ca8536010bb2b92cf366ab70 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 8 17:23:44 2008 +0100 + + [cairo-xlib] Scan for a glyphset to match a pending free glyph. + + In order to avoid re-rasterising a glyph that is pending an + XRenderFreeGlyph, we first scan all glyphsets and their arrays of + pending_free_glyphs for a matching glyph. The additional cost of + scanning the extra arrays should be negligble as most fonts will only + have the single array (which we would scan anyway) but we potentially + save an expensive rasterisation and short-lived image surface. + + (As suggested by Behdad Esfahbod.) + + src/cairo-xlib-surface.c | 90 ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 72 insertions(+), 18 deletions(-) + +commit c2963fa6c1f6da2117663d69505efb3bf2cc4145 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 8 09:02:12 2008 +0100 + + [cairo-boilerplate] Silence compiler warning. + + Mark the optstr argument as const to silence a compiler warning in + cairo-perf. + + boilerplate/cairo-boilerplate-getopt.c | 2 +- + boilerplate/cairo-boilerplate-getopt.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit ac44817c4a8464ed5c665cc8b20d1463cf8a5de3 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 8 09:00:56 2008 +0100 + + [cairo-perf] Only allocate arrays once. + + Store the array of times on the cairo_perf_t context to avoid + reallocating it for every perf-case. + + perf/cairo-perf.c | 30 ++++++++++++++---------------- + perf/cairo-perf.h | 3 +++ + 2 files changed, 17 insertions(+), 16 deletions(-) + +commit 335ed745898a3e110a4ffd1abd8f55edfb407639 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 7 09:34:49 2008 +0100 + + Enlarge the embedded arrays to eliminate frequent allocations. + + Enlarge the embedded arrays of edges and points for cairo_polygon_t and + cairo_spline_t respectively, such that the frequent allocations are + eliminated whilst running a firefox3 benchmark. + + src/cairo-polygon.c | 19 +++++-------------- + src/cairo-types-private.h | 4 ++-- + 2 files changed, 7 insertions(+), 16 deletions(-) + +commit 963ff0b9485dbd4b3d5d1a65f6cdd73b170a6a79 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 7 09:32:29 2008 +0100 + + [cairo-pen] Embed a small array of vertices into cairo_pen_t. + + Eliminate allocation of the vertex array for the common cases. + + src/cairo-pen.c | 71 +++++++++++++++++++++++++++++------------------ + src/cairo-types-private.h | 3 +- + 2 files changed, 46 insertions(+), 28 deletions(-) + +commit d9b2e8f0045dcde8beafed7fe08728ae15194ffa +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 7 09:20:17 2008 +0100 + + [cairo-path-stroke] Avoid allocation for single rectangle. + + The most common case for path stroking is a single rectangle, so embed + sufficient segments into the stroker to avoid an extra allocation. + + src/cairo-path-stroke.c | 41 ++++++++++++++++++++++++----------------- + 1 file changed, 24 insertions(+), 17 deletions(-) + +commit ba6b2d092ab45e9d28ab5c016315458d1ad670ff +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed May 7 09:18:30 2008 +0100 + + [cairo-hull] Attempt to allocate vertices on stack. + + First try to allocate the vertices using an on-stack array, otherwise, if + we need more vertices than can be accomodated, fallback to using a heap + array. + + src/cairo-hull.c | 40 +++++++++++++++++++--------------------- + 1 file changed, 19 insertions(+), 21 deletions(-) + +commit b2eadb94f8e34d7c997b5ccfbca4d21e173fdd56 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 11:56:21 2008 +0100 + + [cairo] Cache freed gstates. + + Reduce the malloc pressure from frequent cairo_save()/cairo_restore() by + caching the freed gstates in a list on the context. + + src/cairo-gstate.c | 66 +++++++++++++++-------------------------------------- + src/cairo-private.h | 1 + + src/cairo.c | 21 ++++++++++------- + src/cairoint.h | 4 ++-- + 4 files changed, 35 insertions(+), 57 deletions(-) + +commit c57b1eca18db12b8d56d73093d5cae28ed388298 +Merge: b9acf62 cba1543 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Fri Jun 13 16:18:13 2008 -0400 + + Merge branch 'region32' + +commit b9acf625d64f11253b5c8d32e890bb94e78809b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 12 21:03:19 2008 -0400 + + Make check-*.sh scripts more portable (#16299) + + doc/public/check-doc-coverage.sh | 20 +++++++++++--------- + doc/public/check-doc-syntax.sh | 2 +- + src/check-cairoint.sh | 6 +++--- + src/check-def.sh | 10 ++++++---- + src/check-doc-syntax.sh | 24 +++++++++++++----------- + src/check-headers.sh | 6 +++--- + src/check-plt.sh | 10 ++++++---- + 7 files changed, 43 insertions(+), 35 deletions(-) + +commit d47142907f01ae610fa06987c20741ae1382a4b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 25 17:33:47 2008 +0430 + + [xlib-visual] Make the 5x5x5 color cube better approximate the rgb333 space + + That is, instead of uniformly spreading the colors at 0/4, 1/4, 2/4, 3/4, 4/4 + intensities, we do 0/7, 1.5/7, 3.5/7, 5.5/7, 7/7 now. Those better + approximate the 0/7..7/7 of the rgb333 space that we first convert to. + + src/cairo-xlib-visual.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4fcef1a490508f0b489a4035dd7951f3ae2e6649 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Mar 25 17:26:51 2008 +0430 + + [xlib-visual] Allocate 8-entry gray ramp instead of 16-entry + + We convert to rgb333 before doing pseudo-color lookup, so we cannot + get more than 8 gray levels anyway. + + src/cairo-xlib-visual.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit cba1543c9274db5a84aab26a4d6642a1151106c1 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Mon Jun 9 03:30:26 2008 -0400 + + Remove large-clip from xfail list + + test/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit a95e81261f246874bab157dd83131a4f0baebe06 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Mon Jun 9 03:04:06 2008 -0400 + + Require pixman 0.11.2 for 32 bit regions + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c3121543f87e372d18aaa5b8a132d28bcc4bf450 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Mon Jun 9 01:11:38 2008 -0400 + + Fix xlib incarnation of the large-clip bug. + + Intersect the clip region with the bounds of the surface to prevent + overflows when converting from 32 to 16 bits. + + src/cairo-xlib-surface.c | 29 ++++++++++++++++++++++++++--- + 1 file changed, 26 insertions(+), 3 deletions(-) + +commit 75fdccc1db2d78a546528164054a54509dac1490 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Mon Jun 9 00:43:47 2008 -0400 + + Use 32 bit pixman regions for cairo_region_t + + src/cairo-image-surface.c | 2 +- + src/cairo-region-private.h | 2 +- + src/cairo-region.c | 38 +++++++++++++++++++------------------- + 3 files changed, 21 insertions(+), 21 deletions(-) + +commit bd0cf0562349e88857943a521bf37fca5709f47e +Author: Søren Sandmann <sandmann@redhat.com> +Date: Mon Jun 9 00:09:25 2008 -0400 + + Add the correct reference image for the large-clip test + + test/large-clip-ref.png | Bin 362 -> 350 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 60971fb5142dedc6d5248133bacf6e08b585abc4 +Author: Søren Sandmann <sandmann@redhat.com> +Date: Sun Jun 8 17:48:19 2008 -0400 + + New large-clip test + + This tests clipping to a rectangle that doesn't fit in 16 bits. + + test/Makefile.am | 3 +++ + test/large-clip-ref.png | Bin 0 -> 362 bytes + test/large-clip.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 61 insertions(+) + +commit 4210bab61a1f680b0ca393e1f5fec0549ddcfcec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 10 02:17:21 2008 -0400 + + [cairo-ft-font] Make font face caching work again + + Recent change to the cache key had broken all caching as we were always + comparing unscaled->face. + + src/cairo-ft-font.c | 30 ++++++++++++++++++------------ + 1 file changed, 18 insertions(+), 12 deletions(-) + +commit c5b1674349154049646b491cac571d93328b5e0c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jun 10 01:05:09 2008 -0400 + + [cairo-ft-font] Fix thinko in _cairo_ft_unscaled_font_keys_equal() + + src/cairo-ft-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9e1b4704ce420cd5fd9377e3cb0f522297e00a1a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 9 15:21:18 2008 -0400 + + [cairo-xlib-screen] Protect fontconfig call with CAIRO_HAS_FT_FONT + + src/cairo-xlib-screen.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit c8fc587edea8619ecd30a170063e79f9d4183011 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Jun 9 23:14:47 2008 +0930 + + Update user-font test PS/PDF ref images + + The PDF output no longer requires a PDF specific reference image. The + lastest poppler from git is required to get the fix for a bug in Type + 3 font rendering. + + test/user-font-pdf-ref.png | Bin 6388 -> 0 bytes + test/user-font-ps-ref.png | Bin 0 -> 5043 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 42c212135d22654f9220a06779c7611fe6f0a714 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 8 17:03:05 2008 +0930 + + Implement PS Type 3 font image support + + There does not appear to be any way of emulating PDF inline images in + PostScript so we call back to the PS or PDF surface to emit the image. + + src/cairo-pdf-surface.c | 44 ++++++++++++++++++++++++++++- + src/cairo-ps-surface.c | 49 ++++++++++++++++++++++++++++++++- + src/cairo-type3-glyph-surface-private.h | 9 ++++-- + src/cairo-type3-glyph-surface.c | 32 ++++----------------- + 4 files changed, 104 insertions(+), 30 deletions(-) + +commit 5b05034cc9d943a5acb052763c1a595ac0e347fb +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 8 16:57:58 2008 +0930 + + Implement PS Type 3 font subsetting of user fonts + + src/cairo-ps-surface.c | 150 +++++++++---------------------------------------- + 1 file changed, 28 insertions(+), 122 deletions(-) + +commit 100a34bea66545c4d962604ed9beefd3180e53fc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 8 17:11:39 2008 +0930 + + Implement PDF Type 3 font subsetting of user fonts + + show_glyphs inside a Type 3 font currently results in a fallback + image. Some refactoring is required before font subsets can be created + while emitting all the font subsets. + + src/Makefile.am | 2 + + src/cairo-pdf-surface.c | 133 ++------- + src/cairo-scaled-font-subsets.c | 4 +- + src/cairo-type3-glyph-surface-private.h | 69 +++++ + src/cairo-type3-glyph-surface.c | 465 ++++++++++++++++++++++++++++++++ + src/cairo-types-private.h | 3 +- + 6 files changed, 568 insertions(+), 108 deletions(-) + +commit 1e1c05e58f808c07ac0e7c0a4ba2c6f8ccb18792 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jun 8 16:50:34 2008 +0930 + + Change _cairo_font_face_is_user() from static to cairo_private + + src/cairo-user-font-private.h | 45 +++++++++++++++++++++++++++++++++++++++++++ + src/cairo-user-font.c | 3 ++- + 2 files changed, 47 insertions(+), 1 deletion(-) + +commit d157e4861aabe9e154eb3f98106f1d86df36b396 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jun 7 08:58:39 2008 +0930 + + Fix win32-printing show_glyphs analysis + + src/cairo-win32-printing-surface.c | 32 +++++++++++++++++++------------- + 1 file changed, 19 insertions(+), 13 deletions(-) + +commit 06b15d2f2da2ffd841a6a88c9713424d416d7388 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 22:58:57 2008 -0400 + + [doc] Document user-font callback types + + src/cairo.h | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 133 insertions(+) + +commit 4c17a5ee1155cf2f1465d9b14b625a309bd108a2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 22:58:33 2008 -0400 + + [configure.in] Change version to 1.7.1 + + We branched weeks ago. + + configure.in | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit a87c94d24774b79e4bc51fc6814558ed4aa1ab77 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 19:29:47 2008 -0400 + + [user-font] Add XXX mark for text_to_glyphs memory allocation issue + + src/cairo-user-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit adcfe8335629e76f2ad12432d90d94fec12871c0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 19:19:27 2008 -0400 + + [user-font] Reorder methods to the order they should appear in docs + + src/cairo-user-font.c | 52 +++++++++++++++++++++++++-------------------------- + src/cairo.h | 22 +++++++++++----------- + 2 files changed, 37 insertions(+), 37 deletions(-) + +commit 6702c7edc4a6e3e1129d8c6e6b4989ba2410add4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 18:42:50 2008 -0400 + + [user-font] Let user decide to fall back to unicode_to_glyph in text_to_glyphs + + User does this by not setting *num_glyphs. + + src/cairo-user-font.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 3b1b0746959956155dd33cf71989e7bcb63886f5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 18:32:54 2008 -0400 + + [user-font] Add XXX mark about metrics-hinting the font extents + + src/cairo-user-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 60cf2ef8449e1fd09fe0f2d8c8dc5fa2bb855e5a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jun 5 15:44:37 2008 -0400 + + [cairo-ft] Respect FC_FT_FACE element of pattern + + Based on patch from Stuart Parmenter. Now one can use + cairo_ft_font_face_create_for_pattern() to create cairo-ft font + faces using provided FT_Face but also requesting advanced + options like emboldening and hinting. + + src/cairo-ft-font.c | 117 ++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 72 insertions(+), 45 deletions(-) + +commit 4c5370dad87cb822a17905dd8dbb058fce11d132 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 4 23:27:05 2008 +0930 + + Update PDF/PS ref images of text-rotate and ft-show-glyphs-positioning + + test/ft-show-glyphs-positioning-pdf-ref.png | Bin 3114 -> 3133 bytes + test/text-rotate-pdf-ref.png | Bin 0 -> 16639 bytes + test/text-rotate-ps-ref.png | Bin 6796 -> 6851 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit a922a0c5cf2c7862eba4db0b71bda75136a9012a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 4 22:59:53 2008 +0930 + + Bit swap when writing FORMAT_A1 to PNG on little endian + + src/cairo-png.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 1d8596d5b068c383c236f312f7dc753911a5f9b7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 4 22:59:33 2008 +0930 + + Optimize PDF operators show_glyphs() to use Tj operator + + The Tj operator displays a string of glyphs positioned at their glyph + advances. + + src/cairo-pdf-operators.c | 39 +++++++++++++++++++++++++++++++++++++-- + 1 file changed, 37 insertions(+), 2 deletions(-) + +commit 71fe8c8881d495e8c1bd2ebbb8748761adc6bcd9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 4 22:57:43 2008 +0930 + + PS: Make PDF emulation work with the new show_glyphs optimizations + + The implementation of the Tf, Td, and Tm operators has been extended + to allow calling these operators in any order. + + src/cairo-ps-surface.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 83e4825fae85acb49ec032c0ddf51a615ee76a9e +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 4 22:47:50 2008 +0930 + + Rewrite _cairo_pdf_operators_show_glyphs() + + Rewrite the PDF operators show_glyphs() function to make it more + maintainable and better optimized. + + The changes include: + + - Use a separate function to output each text operator and update the + internal state. + + - Store glyphs in a buffer until they can be written out as one + string. This reduces the complexity of the code for emitting glyph + strings and significantly optimizes the output size as glyphs from + multiple calls to show_glyphs() can be accumulated and written in one + string. + + - The code now better handles rotated text. Previously, using rotated + text resulted in the text matrix emitted for every glyph. Now rotated + text can be emitted as strings in the some way as non rotated + text. This is particulary useful for printing in landscape mode where + all text on the page is rotated. + + src/cairo-pdf-operators-private.h | 28 +- + src/cairo-pdf-operators.c | 527 ++++++++++++++++++++++++-------------- + 2 files changed, 361 insertions(+), 194 deletions(-) + +commit f3d457db0c5cf79264bf48f0bef9209d68bd259f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Jun 4 22:36:10 2008 +0930 + + Store y_advance in cairo_scaled_font_subsets_glyph_t + + src/cairo-scaled-font-subsets-private.h | 1 + + src/cairo-scaled-font-subsets.c | 10 ++++++++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit 6139fdc1073c0fe1bc5a3809f15c2ee8b5028469 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jun 3 20:56:11 2008 +0930 + + PDF: Don't emit a new text object for every call to show_glyphs + + A text object is a series of text operations enclosed in a 'BT'/'ET' + pair. + + After a call to _cairo_pdf_operators_show_glyphs() the closing 'ET' + will not be emitted. This allows subsequent calls to show_glyphs() to + emit text into the same text object. A call to any other operator or + _cairo_pdf_operators_flush() will close the text object. + + src/cairo-pdf-operators-private.h | 1 + + src/cairo-pdf-operators.c | 27 +++++++++++++++++++++++---- + src/cairo-pdf-surface.c | 10 ++++++++++ + 3 files changed, 34 insertions(+), 4 deletions(-) + +commit 6258f1a4e29e0457465e83bd5be1900a10c75473 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jun 3 20:55:30 2008 +0930 + + PDF: Remember the current color + + Don't emit the set fill or stroke color operator if the required fill + or stroke color is already selected. + + src/cairo-pdf-surface-private.h | 7 ++++ + src/cairo-pdf-surface.c | 71 ++++++++++++++++++++++++++++++----------- + 2 files changed, 59 insertions(+), 19 deletions(-) + +commit fd42b74a4f35154d7c9a03b4f248801cd0b7c339 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jun 3 20:55:03 2008 +0930 + + Add _cairo_pdf_operators_flush() + + The optimizations planned for pdf-operators will mean that it will no + longer emit complete operations on each call to + fill/stroke/show_glyphs. For example a call to _show_glyphs() may not + finish the text operation to allow a subsequent call to _show_glyphs() + to be merged into the same text object. + + A flush function is required to force pdf_operators to complete the + current operation before the pdf surface can emit any pdf operators. + + src/cairo-pdf-operators-private.h | 5 ++- + src/cairo-pdf-operators.c | 24 +++++++++- + src/cairo-pdf-surface.c | 92 ++++++++++++++++++++++++++++++++++----- + src/cairo-ps-surface.c | 36 ++++++++++++++- + 4 files changed, 142 insertions(+), 15 deletions(-) + +commit e1bc97a7e506c16467d97a525b35722ea30027c3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu May 1 23:29:20 2008 +0930 + + Disable UniqueID font check in Type 1 subset font + + Some Type 1 fonts have some PostScript code at the start of the font + that checks if the font is already cached in the printer (based on the + font UniqueID key). This breaks our subsetted font as it is not the + same as the original font. + + Checking for and removing a random blob of PostScript is difficult so + this patch takes the simpler approach of searching for the PS code + that checks if the UniqueID dictionary entry exists + + ie + + /UniqueID known + + this code leaves the value "true" or "false" on the PS interpreter + stack depending on whether the "UniqueID" key exists. + + Then the patch inserts the PS code " pop false " after the above code + to remove the old result and place "false" on the stack to make it + appear that UniqueID does not exist. + + This approach should be able to handle any type of PostScript code + that attempts to do something with the UniqueID value in the font + dictionary. + + src/cairo-type1-subset.c | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +commit 34c42202f0575be10a2e409fe66f1da95886353f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu May 1 22:55:07 2008 +0930 + + Remove XUID key from subsetted Type 1 fonts + + Subsetted fonts must not share the same XUID as the original font. + + src/cairo-type1-subset.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 6ae1061508d6b14b128a8fbf7558d3a64f9551fa +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu May 1 23:24:57 2008 +0930 + + Remove UniqueID key from subsetted Type 1 fonts + + Subsetted fonts must not share the same UniqueID as the original + font. + + src/cairo-type1-subset.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + +commit e30cd617c89fa7511d2002a155d4ccdfa2ec9aa9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue May 13 21:41:56 2008 +0930 + + Make font subsetting output fonts in order of the font subset id + + This ensures that PS/PDF output is always the same for the same cairo + input. Previously the order of the embedded fonts depended on the hash + key of the fonts which depended on the memory location of fonts. + + src/cairo-scaled-font-subsets.c | 58 ++++++++++++++++++++++++++++------------- + 1 file changed, 40 insertions(+), 18 deletions(-) + +commit 0dbb5c9f6222660b1083420419d0eaa71c809ac5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat May 31 20:15:04 2008 +0930 + + Ensure eexec encryption in subsetted Type 1 font is compliant (#13679) + + In the eexec encryption used in Type 1 fonts, the first four bytes of + ciphertext must not start with a white space character or contain an + ASCII Hex character. Some fonts do not comply with this + restriction. This may cause problems for some PDF consumers. + + Fix this by overwriting the four random bytes at the start of the + decrypted cleartext with spaces. When re-encrypted the first four + bytes of ciphertext will always be 0xf0, 0x83, 0xef, 0x00 which + complies with the restrictions. + + src/cairo-type1-subset.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 2f4d8fd0717fc7158d49f7a14335bc13dd09d55a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jun 2 22:46:21 2008 -0400 + + [cairo-gstate] Return immediately if clip bounds is empty + + src/cairo-gstate.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 3f5051fab161da167fdedcdad0280da1f57a1828 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 1 19:14:13 2008 -0400 + + Fix now-detected doc formatting issues + + src/cairo-base85-stream.c | 3 ++- + src/cairo-beos-surface.cpp | 2 +- + src/cairo-deflate-stream.c | 3 ++- + src/cairo-ft-font.c | 1 + + src/cairo-meta-surface.c | 2 +- + src/cairo-os2-surface.c | 4 ++-- + src/cairo-output-stream-private.h | 4 ++-- + src/cairo-paginated-private.h | 4 ++-- + src/cairo-path-fixed.c | 2 ++ + src/cairo-surface.c | 2 +- + src/cairo-unicode.c | 3 ++- + src/cairo-xcb-surface.c | 4 ++-- + src/cairo-xlib-surface.c | 4 ++-- + src/cairo.c | 27 +++++++++++++-------------- + src/cairo.h | 8 ++++---- + src/cairoint.h | 24 ++++++++++++------------ + 16 files changed, 51 insertions(+), 46 deletions(-) + +commit 0c208f28268028fbb4fe2cc175131b279626975c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 1 19:13:49 2008 -0400 + + [src/check-doc-syntax.sh] Detect malformatted functions at line start + + src/check-doc-syntax.sh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 3f02e0d74b9b04f6e8ad32d12768aafa0076bd97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 1 18:46:45 2008 -0400 + + Fix newly detected doc syntax issues + + src/cairo-array.c | 6 +++--- + src/cairo-bentley-ottmann.c | 2 +- + src/cairo-cache.c | 2 +- + src/cairo-hash.c | 8 ++++---- + src/cairo-meta-surface.c | 2 +- + src/cairo-pattern.c | 2 +- + src/cairo-png.c | 10 +++++----- + src/cairo-scaled-font-subsets-private.h | 26 +++++++++++++------------- + src/cairo-scaled-font.c | 8 ++++---- + src/cairo-surface.c | 4 ++-- + src/cairo.c | 14 +++++++------- + src/cairo.h | 8 ++++---- + 12 files changed, 46 insertions(+), 46 deletions(-) + +commit b37c7557303e750c672648fe00922262d2a56a5a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 1 18:46:23 2008 -0400 + + [src/check-doc-syntax.sh] Detect malformatted enums starting the line + + src/check-doc-syntax.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0ea7d5d6dbd7d48f7d88280dedeba2c1bc36d1ea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jun 1 15:32:42 2008 -0400 + + [cairo-mutex] Remove debugging stuff that I accidentally committed + + We should add read mutex debugging facilities when the debugging + infrastructure is in place. + + src/cairo-mutex-type-private.h | 21 +-------------------- + 1 file changed, 1 insertion(+), 20 deletions(-) + +commit 54f1a426f75ed44ea2d67b605c78951798f4c1d1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 30 15:23:32 2008 -0400 + + [cairo-xcb] Oops. Fix build. + + src/cairo-xcb-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fbe7044f10c2d36f1ee4e1edd3d3289e0cad8779 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 30 15:18:22 2008 -0400 + + [user-font] Improve docs. + + src/cairo-user-font.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 45be1459b2b8f7fab124fe6c773944618bd5e046 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 29 02:35:09 2008 -0400 + + [user-font] Document all public functions + + Remains to do: callback types. + + src/cairo-user-font.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 118 insertions(+), 7 deletions(-) + +commit 9a05c0e7f46f5c6bd29354f53adf2fd340543414 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 29 02:34:07 2008 -0400 + + Fix doc syntax. + + src/cairo-types-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d0bc3ca1a224bf6ff6578ea4bf3a5ebe9e4f52a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 20:58:35 2008 -0400 + + [doc] Add Index of 1.8 symbols + + doc/public/cairo-docs.xml | 3 +++ + 1 file changed, 3 insertions(+) + +commit 4e68140aca75536127a7efc983d9123fd7af4109 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 20:57:36 2008 -0400 + + [doc] Document remaining CAIRO_HAS_* macros + + I'm sure I had done them all before. No idea what happened. + Perhaps gtk-doc was not seeing them as missing. + + doc/public/tmpl/cairo-ft.sgml | 3 ++- + doc/public/tmpl/cairo-quartz-fonts.sgml | 3 ++- + doc/public/tmpl/cairo-quartz.sgml | 3 ++- + doc/public/tmpl/cairo-xlib.sgml | 3 ++- + 4 files changed, 8 insertions(+), 4 deletions(-) + +commit 65cc905c2f7707723858917d9d1e93566214b640 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 20:54:38 2008 -0400 + + [doc] Add stub for user-fonts + + doc/public/Headers.mk | 1 + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 18 +++++ + doc/public/tmpl/cairo-user-fonts.sgml | 146 ++++++++++++++++++++++++++++++++++ + 4 files changed, 166 insertions(+) + +commit a9b2461c41dba6bb097ee316f093d5b9d3fb6d56 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 20:29:11 2008 -0400 + + [user-font] Handle metrics-hinting font option + + src/cairo-user-font.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit b0796bf200de86cb37e84c8241f8f72d8d5657d2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 20:20:46 2008 -0400 + + [user-font] Cache extent-space scale in the scaled font + + src/cairo-user-font.c | 70 +++++++++++++++++++++++++++++++++------------------ + 1 file changed, 46 insertions(+), 24 deletions(-) + +commit abdf04c671235a120f23a1444a53893afdd949b0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 19:52:56 2008 -0400 + + [user-font] Handle the case of a null render_glyph callback + + src/cairo-user-font.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 50e6957e8089f9f0db36b1e44249f41041cf405d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 19:31:51 2008 -0400 + + [user-font] Remove completed TODO item + + The user-font-proxy test case already does this. + + src/cairo-user-font.c | 2 -- + 1 file changed, 2 deletions(-) + +commit f2b385558b185a723ae0043ad1381621c17318d8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 19:30:39 2008 -0400 + + [cairo-user-font] Add comment about possibly doing metrics-hinting + + src/cairo-user-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 9b1cbcde3272dac176bd9184ceb21c953c30517d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 19:27:58 2008 -0400 + + [user-font] Handle antialiasing font option + + src/cairo-user-font.c | 23 ++++++++++++++++++----- + 1 file changed, 18 insertions(+), 5 deletions(-) + +commit e8e23862333f4be69e2afd9ee41c9a27817f9659 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 19:10:09 2008 -0400 + + Remove some bogus XXX marks + + These are all perfectly correct code. Most are simply there because when + we support vertical text writing mode we need to update there, but that's + pretty trivial. No special markers needed. + + /me is trying to make user-font clean of XXX and TODO marks + + src/cairo-arc.c | 1 - + src/cairo-ft-font.c | 2 +- + src/cairo-scaled-font.c | 4 ++-- + src/cairo-user-font.c | 4 ++-- + 4 files changed, 5 insertions(+), 6 deletions(-) + +commit 4e1024114872a01fef01ec0b9136e09f4613e5d2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 17:12:51 2008 -0400 + + Fix whitespace + + src/cairo-mutex-type-private.h | 8 ++++---- + src/cairo-svg-surface.c | 2 +- + src/cairo-types-private.h | 4 ++-- + src/cairo-xlib-surface.c | 24 ++++++++++++------------ + src/cairo.h | 16 ++++++++-------- + 5 files changed, 27 insertions(+), 27 deletions(-) + +commit 78b9e2917857714bc1a712ea9d1a18af77000f78 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 17:04:09 2008 -0400 + + [cairo-xlib] Rewrite cairo_xlib_glyph_t as a union of cairo_glyph_t + + Someone reported on cairo list that on some system with gcc, he had the + compile-time assertion failing, meaning that the following struct: + + typedef struct { + unsigned long index; + union { + struct { + double x; + double y; + } d; + struct { + int x; + int y; + } i; + } p; + } cairo_xlib_glyph_t; + + had a different size from: + + typedef struct { + unsigned long index; + double x; + double y; + } cairo_glyph_t; + + That looks quite a weird thing for a compiler to do. Anyway, rewriting + our struct like this may help in those weird situations: + + typedef union { + cairo_glyph_t d; + unsigned long index; + struct { + unsigned long index; + int x; + int y; + } i; + } cairo_xlib_glyph_t; + + That's what we do now. + + src/cairo-xlib-surface.c | 34 +++++++++++++++------------------- + 1 file changed, 15 insertions(+), 19 deletions(-) + +commit 51885e9a1e6dcebe0ae72834770e9000063187bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:52:19 2008 -0400 + + [test/user-font.c] Fix compiler warnings + + test/user-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9b16b528dcfffc896cecbda87249ff09a7987eb7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:48:13 2008 -0400 + + [cairo-unicode] Make unicode conversion funcs take const char *utf8 + + Instead of the previous const unsigned char *utf8. This is in line + with our public API now. + + src/cairo-scaled-font.c | 2 +- + src/cairo-unicode.c | 34 ++++++++++++++++++---------------- + src/cairoint.h | 16 ++++++++-------- + 3 files changed, 27 insertions(+), 25 deletions(-) + +commit df5ad168aa40ae0dfff8bf1b0830c9f4931d3b97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:47:55 2008 -0400 + + [cairo-path-fixed] Fixe compiler warning + + src/cairo-path-fixed.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6938f158983a62cd8041e19fa544f997cf49eecf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:47:37 2008 -0400 + + [cairo-win32-surface] Remove unused variable + + src/cairo-win32-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 12646f81cafa01c04e864a98c4344e16d958e980 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:46:55 2008 -0400 + + [cairo-compiler-private] Make it build with wine + + One can build cairo with wine easily now: + + ./configure CC=winegcc LD=winegcc + + src/cairo-compiler-private.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b70e6e1d98021879edfed2cf8e29d18cdf37b71b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:09:56 2008 -0400 + + One more remaining_glyphs compile fix + + src/cairo-win32-printing-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 907620608099f6840b64a17b75a1d7938e76d953 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 16:08:37 2008 -0400 + + Fix two more compile errors + + When adding remaining_glyphs argument to show_glyphs(), I missed + a few places. + + src/cairo-win32-private.h | 3 ++- + src/cairo-xcb-surface.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 295dee36e3043fd63a2a93715f144aad92d16917 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 13:10:07 2008 -0400 + + [cairo-xlib] Use newly-added COMPILE_TIME_ASSERT + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2e4d6acd09f0af5d51c4da5707b3430cdd54f0a5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 13:09:52 2008 -0400 + + [cairoint.h] Add COMPILE_TIME_ASSERT() + + src/cairoint.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 043ed895adb4f17912ae5c44d4c63ca6350d5b75 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 13:09:43 2008 -0400 + + [cairo-xlib] Fix compiler warning + + src/cairo-xlib-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 26aec31f244bbb4243dda629683bed045ec42734 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 12:07:13 2008 -0400 + + [src/check-def.sh] Don't report anything if skipping test + + src/check-def.sh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit f07407335503e5612dcf07cc8f44e1781367d263 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 12:01:38 2008 -0400 + + [configure.in] Dont let a missing FcFini disable the freetype font backend! + + configure.in | 7 ++++--- + src/cairo-os2-surface.c | 2 ++ + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit d7ddde8a324c5bfd9ca00d1fbb47cd3f1730bbfb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 11:00:01 2008 -0400 + + [cairo-user-font] Make backend struct static + + src/cairo-user-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3306aa5e8d162f90c2ae957a9d72c42ac1ce62d9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 10:59:35 2008 -0400 + + [src/check-def.sh] Also check for public variables (#16129) + + src/check-def.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f3a3a0594d457dcc7d11b794afe8408aee07a1ee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 10:43:47 2008 -0400 + + [cairo-xlib] Add recently-added byteswap macros (#16128) + + src/cairo-xlib-surface.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 0bf941c9b25503047be6d01b134f9fe2597423fd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 10:43:22 2008 -0400 + + Add support for byteswap macros bswap_16 and bswap_32 + + configure.in | 2 +- + src/cairo-wideint-type-private.h | 16 ++++++++++++++++ + 2 files changed, 17 insertions(+), 1 deletion(-) + +commit 5c732badbc6148087cf99c906eb5f99c92ea0b92 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 28 09:00:13 2008 -0400 + + [src/check-def.sh] Improve test comment + + src/check-def.sh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e8dd97fde81a31c8875f03edbbcdb83da3830283 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 27 23:07:04 2008 -0400 + + [cairo-scaled-font] Fix assertion failure + + Revert 127c4b8e643560c029818509e20fc5ca87408611 + We assume that all scaled fonts with ref count 0 are in holdover cache. + That commit was breaking this assumption. + + src/cairo-scaled-font.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +commit 8c4f4a758bf4c1138f313d9cafa5564ac827b61d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 27 20:27:18 2008 -0400 + + [cairo-gstate] Use clip, not surface, extents to drop invisible glyphs + + src/cairo-gstate.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c752bd665ae707edf207653f183b6d132dd0384e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 27 20:27:07 2008 -0400 + + [cairo-gstate] Add _cairo_gstate_int_clip_extents() + + src/cairo-gstate.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit 0f07c45fa30279cb1aba6092bc84a859dd479054 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 27 17:53:35 2008 -0400 + + [test/user-font] Use user_data to access glyphs array + + This way the same callback code can be used to render multiple different + glyph arrays. Change done for education purposes, otherwise doesn't + make any difference in the test. + + test/user-font.c | 67 ++++++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 43 insertions(+), 24 deletions(-) + +commit 626edfc333b77604b6955c12ae111d14c174034c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 26 20:28:23 2008 -0400 + + [cairo-mutex] Prepare mutex infrastructure for adding mutex debugging facilities + + Essentially renaming cairo-mutex-type-private.h to cairo-mutex-impl-private.h + and changing all its namespace from cairo_mutex to cairo_mutex_impl. + cairo-mutex-type-private.h then does all the sanity checks on the + implementation that used to be in cairo-mutex-private.h. Plus, defines macros + for the cairo-mutex namespace to map to the cairo-mutex-impl namespace. This + extra mapping layer allows for add debugging facilities. + + src/Makefile.am | 1 + + src/cairo-mutex-impl-private.h | 226 ++++++++++++++++++++++++++++++++++ + src/cairo-mutex-private.h | 129 ++------------------ + src/cairo-mutex-type-private.h | 269 +++++++++++++++++++---------------------- + src/cairo-mutex.c | 18 +-- + 5 files changed, 374 insertions(+), 269 deletions(-) + +commit 07fef4f4802639a2cb16284841635d1bcc9b8e8f +Author: Ginn Chen <ginn.chen@sun.com> +Date: Tue May 27 04:44:08 2008 -0400 + + [cairo-xlib] Implement _cairo_xlib_surface_solid_fill_rectangles() (#11529) + + src/cairo-xlib-surface.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 64 insertions(+), 2 deletions(-) + +commit f90b155b5a59211bed7502b537dbf207b3d4bf5e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 27 04:41:03 2008 -0400 + + [cairo-xlib] Delay using fallback if xrender is not available + + So we can use XCopyArea when Render is not available. Based on patch by + Ginn Chen. + + src/cairo-xlib-surface.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 30a16df29ba434d298d0c8d9dbb70c1b0a398f35 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 26 19:56:09 2008 -0400 + + [util/backtrace-symbols] Implement backtrace_symbols_fd() + + util/backtrace-symbols.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit ce56e0cd0c0afc887bc0c4d46d51b934923f2d2c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue May 27 12:44:50 2008 +0930 + + Add missing argument to _cairo_pdf_surface_show_glyphs() + + cf473f4a75ca0d3c815222287d7c144e72de5add missed the PDF surface when + it added an argument to the show_glyphs() surface backend function. + + src/cairo-pdf-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 8d86e725ceb58fd93a9e9638f86636f5a4d88833 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 25 02:30:14 2008 -0400 + + [cairo-gstate] Add code for switching to path;fill for huge show_glyph()s + + For really huge font sizes, we can just do path;fill instead of + show_glyphs, as show_glyphs would put excess pressure on the cache, + and moreover, not all components below us correctly handle huge font + sizes. I wanted to set the limit at 256. But alas, seems like cairo's + rasterizer is something like ten times slower than freetype's for huge + sizes. So, no win just yet. For now, do it for insanely-huge sizes, + just to make sure we don't make anyone unhappy. When we get a really + fast rasterizer in cairo, we may want to readjust this. + + src/cairo-gstate.c | 43 +++++++++++++++++++++++++++++++++++++------ + 1 file changed, 37 insertions(+), 6 deletions(-) + +commit f5fbb8b24e381f3438e24340965ce2aeea56ac33 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 25 01:53:44 2008 -0400 + + Fix typo. + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 238a3117f191c927abcce6b0f5c555d8f34af59c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 25 01:51:05 2008 -0400 + + [cairo-scaled-font] Clean up recent locking changes + + Based on feedback from Keith. + + src/cairo-scaled-font-private.h | 2 +- + src/cairo-scaled-font.c | 141 ++++++++++++++++++++++------------------ + src/cairo-user-font.c | 4 +- + src/cairoint.h | 4 +- + 4 files changed, 81 insertions(+), 70 deletions(-) + +commit 0621f412ff7986bc883a613d332f121da62e38fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 25 00:55:36 2008 -0400 + + [cairo-matrix] Move IS_FINITE(det) checks before det==0 checks + + I'm still getting floating point exceptions in test suite in a + made-to-overflow test though. Not sure why isfinite() doesn't work. + + src/cairo-matrix.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9827dae57085f9452889499ff799c378abd5c60e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 25 00:17:43 2008 -0400 + + [user-font] Fix fontmap locking + + After consulting with Keith Packard we came up with a farily simple + solution. Documented in the code. + + src/cairo-scaled-font-private.h | 2 + + src/cairo-scaled-font.c | 117 ++++++++++++++++++++++++++++++++++++++-- + src/cairo-user-font.c | 20 ++++--- + src/cairoint.h | 5 ++ + 4 files changed, 129 insertions(+), 15 deletions(-) + +commit 96f7178226640226625c0e4db57257035e0b48c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 23:28:15 2008 -0400 + + [user-font] Lock the font mutex such that user doesn't accidentally use it yet + + src/cairo-user-font.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 8dc1e6d945ca86b4af33ad9a5f627688fa15a5cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 22:13:01 2008 -0400 + + One more typo fix + + src/cairo-scaled-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8ff0fa112da0d13da2596c4ca6815f5b441c9c7d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 22:11:41 2008 -0400 + + Fix typos + + src/cairo-scaled-font.c | 2 +- + src/cairo-user-font.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit a3d9918428daf96811b050c1e27b6330bbccd35e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 20:51:43 2008 -0400 + + [user-font] Note possible locking issue + + src/cairo-user-font.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 4c1c9d33b1b89d8098c06bbb4d430811947ed86c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 20:48:38 2008 -0400 + + [user-font] Release fontmap lock around user callback + + This makes the user-font-proxy to work now. + + src/cairo-user-font.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 127c4b8e643560c029818509e20fc5ca87408611 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 20:48:07 2008 -0400 + + [src/cairo-scaled-font] Only take fontmap mutex if touching it + + src/cairo-scaled-font.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit a715671c6f3bd2f6f692b79cba7d7f7bc49f06f9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 20:34:41 2008 -0400 + + [test/user-font-proxy] New test using fonts inside a user-font + + PDF fails and needs some fixes in the PDF surface instead of a new + ref image IMO. + + test/Makefile.am | 4 + + test/user-font-proxy-ps-ref.png | Bin 0 -> 8452 bytes + test/user-font-proxy-ref.png | Bin 0 -> 18121 bytes + test/user-font-proxy-svg-ref.png | Bin 0 -> 17902 bytes + test/user-font-proxy.c | 190 +++++++++++++++++++++++++++++++++++++++ + 5 files changed, 194 insertions(+) + +commit c914377f35e1e3396571fc027b7f53854db7d896 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 20:33:15 2008 -0400 + + Add public API cairo_scaled_font_get_scale_matrix() + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-scaled-font.sgml | 9 +++++++++ + src/cairo-scaled-font.c | 24 ++++++++++++++++++++++++ + src/cairo.h | 4 ++++ + 4 files changed, 38 insertions(+) + +commit 90d62a0d33cd9e0736bb747d7f025a0fb1025732 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 20:31:24 2008 -0400 + + [src] Make make check pass + + src/cairo-surface.c | 1 + + src/cairoint.h | 1 + + 2 files changed, 2 insertions(+) + +commit 9cc147a142e98b49b7f8289a340f2e498970ef99 +Author: Jeff Muizelaar <jeff@infidigm.net> +Date: Sat May 24 20:17:38 2008 -0400 + + Avoid deadlock when clearing caches + + cairo_surface_destroy and _cairo_scaled_font_fini will call destroy closures + which may call functions that attempt to acquire the mutex resulting in a + deadlock. We fix this by releasing the lock for the call to + cairo_surface_destroy or _cairo_scaled_font_fini. + + src/cairo-pattern.c | 17 ++++++++++++----- + src/cairo-scaled-font.c | 19 +++++++++++++------ + 2 files changed, 25 insertions(+), 11 deletions(-) + +commit 4957a7894741f5a1941dcc06cc5a3a0551afcdad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 15:16:44 2008 -0400 + + [test/surface-finish-twice.c] Adapt to recent change that multiple finish is ok + + test/surface-finish-twice.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit a30209402c7160af257e1ea027e9e2cdab5b5aec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 14:57:56 2008 -0400 + + [cairo-gstate] Drop glyphs out of surface boundaries in show_glyphs() + + src/cairo-gstate.c | 93 ++++++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 76 insertions(+), 17 deletions(-) + +commit 1b5e2144fb77ffeb0626dff558d9d82351279e0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 14:57:31 2008 -0400 + + [cairo-scaled-font] Implement _cairo_scaled_font_get_max_scale() + + src/cairo-scaled-font-private.h | 1 + + src/cairo-scaled-font.c | 10 ++++++++++ + src/cairoint.h | 3 +++ + 3 files changed, 14 insertions(+) + +commit 479936ecea5d0e7cf3eee1aad6b016067f63e20b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 14:57:06 2008 -0400 + + [cairoint] Sort prototypes + + src/cairoint.h | 39 ++++++++++++++++++++------------------- + 1 file changed, 20 insertions(+), 19 deletions(-) + +commit e638e7652f8be552b50927bd332e9f46dcd92ab7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 14:25:13 2008 -0400 + + [cairo-xlib] Fix bug introduced in yesterday's code shuffling. Oops. + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 31c68e708f18c1f81efc3590346eeb684ef3702d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 24 13:17:31 2008 -0400 + + [cairo-surface] Minor code reshuffling + + src/cairo-surface.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit c20072c88174a99bf4deb562f5b3bc07cc9e133d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 20:57:21 2008 -0400 + + [cairo-xlib] Upon seeing glyphs with large position, just let fallback handle + + This now fixes the large-font test for xlib again. + + src/cairo-xlib-surface.c | 33 ++++++++++++--------------------- + 1 file changed, 12 insertions(+), 21 deletions(-) + +commit e55252bd3b3ee8ad07aeda558dd469e98fedd620 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 20:46:36 2008 -0400 + + [cairo-xlib] Shift range of allowed glyph positions + + From -1024..15359, to -4096..122887. This still does not fix the + large-font test as that uses a 10000 font. Working on a proper fix + for glyph dropping now. + + src/cairo-xlib-surface.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 74818d2b0002d2133a95019265a23a8fd8ba0217 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 20:43:08 2008 -0400 + + [cairo-xlib] Some code reshuffling, in preparation for a fix + + src/cairo-xlib-surface.c | 32 +++++++++++++++----------------- + 1 file changed, 15 insertions(+), 17 deletions(-) + +commit d947ee0ef68cbc371d058b13b98c013b82f794ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 20:41:26 2008 -0400 + + [test/large-font] Make the font REALLY LARGE + + 10000 that is. xlib fails now again. Not because of glyph size issues. + Because we skip rendering any glyphs with positions not in range -1024..15359. + Working on a fix. + + test/Makefile.am | 1 - + test/large-font-ps-ref.png | Bin 5630 -> 0 bytes + test/large-font-ref.png | Bin 9819 -> 6936 bytes + test/large-font.c | 20 +++++--------------- + 4 files changed, 5 insertions(+), 16 deletions(-) + +commit db1b18232b6854d14a1ee45a31bc2508ef36bc1a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 19:04:13 2008 -0400 + + [cairo-xlib] Fix max-request size calculations + + First, XMaxRequestSize returns number of 4-byte words. So multiply by 4 is + needed in all uses. Next, XRenderAddGlyphs uses BIG-REQUEST extension if + available, so when checking for glyph size overflow, we should use + XExtendedMaxRequestSize() first. + + Also use the right format when calculating glyph size. + + These changes combined, push the biggest font size that can be uploaded to the + server from under 200 to about 5000. + + See bug #4339 for history. + + src/cairo-xlib-surface.c | 27 ++++++++++++--------------- + 1 file changed, 12 insertions(+), 15 deletions(-) + +commit cf473f4a75ca0d3c815222287d7c144e72de5add +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 19:57:48 2008 -0400 + + [cairo-xlib] Fix show_glyphs when failing to upload a glyph + + Originally reported here: + http://lists.cairographics.org/archives/cairo/2008-May/014032.html + and analyized later in the thread. + + Change (font and surface) backend show_glyphs() API to take a + int *remaining_glyphs argument. It's used to communicate to the caller, + by way of setting remaining_glyphs and returning INT_STATUS_UNSUPPORTED, + that some of the glyphs were shown but not the others. The xlib backend + now correctly uses this to handle failure to upload a glyph to the server. + So the large-font test passes now. + + An alternative approach could be to add some public value for glyphs + indices that are not shown. -1 perhaps (the xlib backend already uses + that value internally). Then instead of remaining_glyphs, a backend + could simply set glyph indices of glyphs shown to that -1 value. + + src/cairo-analysis-surface.c | 10 ++++++---- + src/cairo-directfb-surface.c | 3 ++- + src/cairo-meta-surface.c | 3 ++- + src/cairo-paginated-surface.c | 3 ++- + src/cairo-ps-surface.c | 3 ++- + src/cairo-quartz-surface.c | 3 ++- + src/cairo-scaled-font.c | 7 ++++++- + src/cairo-surface.c | 17 +++++++++++++++-- + src/cairo-svg-surface.c | 3 ++- + src/cairo-win32-font.c | 3 ++- + src/cairo-win32-printing-surface.c | 3 ++- + src/cairo-win32-surface.c | 3 ++- + src/cairo-xcb-surface.c | 3 ++- + src/cairo-xlib-surface.c | 28 +++++++++++++++++++++++----- + src/cairoint.h | 6 ++++-- + src/test-meta-surface.c | 3 ++- + src/test-paginated-surface.c | 3 ++- + 17 files changed, 78 insertions(+), 26 deletions(-) + +commit e66e198ab04f2e19093aad4ed9f9c24e2756b8a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 23 17:11:43 2008 -0400 + + [cairo-xlib] Remove unused variable + + src/cairo-xlib-surface.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 1ccfc4afd573e1003319a06624aadff90d351e83 +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 23 08:14:00 2008 -0700 + + Revert "BUGGY: Add surface_backend->acquire_source_image_transformed" + + This reverts commit ddcd6781a24463df5a1f25cd5ffdbce47f35cf2f. + + This was an experimental commit that was intended to be on a side + branch but accidentally got committed and pushed to master. Sorry + for the noise. + + src/cairo-meta-surface.c | 40 ++++++---------------------------------- + src/cairo-pattern.c | 9 +++------ + src/cairo-surface.c | 20 -------------------- + src/cairoint.h | 12 ------------ + 4 files changed, 9 insertions(+), 72 deletions(-) + +commit b957beb0df53a513b60cbcfc4e5e847980789b1f +Author: Carl Worth <cworth@cworth.org> +Date: Fri May 23 08:05:18 2008 -0700 + + Add large-font test to exercise a cairo-xlib bug. + + The original bug report is here: + + corrupt glyph positions with large font + https://bugzilla.redhat.com/show_bug.cgi?id=448104 + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/large-font-ps-ref.png | Bin 0 -> 5630 bytes + test/large-font-ref.png | Bin 0 -> 9819 bytes + test/large-font.c | 93 +++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 97 insertions(+) + +commit ddcd6781a24463df5a1f25cd5ffdbce47f35cf2f +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 21 12:06:37 2008 -0700 + + BUGGY: Add surface_backend->acquire_source_image_transformed + + This is an initial attempt at addressing the recently noticed + fallback-resolution bug. It isn't working correctly yet. + + I'm just committing so that behdad can see what I'm up to. + + src/cairo-meta-surface.c | 40 ++++++++++++++++++++++++++++++++++------ + src/cairo-pattern.c | 9 ++++++--- + src/cairo-surface.c | 20 ++++++++++++++++++++ + src/cairoint.h | 12 ++++++++++++ + 4 files changed, 72 insertions(+), 9 deletions(-) + +commit 8efb103600e9c034f8652f495d390d6a4178061e +Author: Carl Worth <cworth@cworth.org> +Date: Wed May 21 10:23:37 2008 -0700 + + Extend fallback-resolution test to expose bug with groups + + Groups appear to always be rendered with a fallback resolution of + 72.0 ppi rather than the desired fallback resolution. + + test/fallback-resolution.c | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit 26eeb1c7ee2416e4029e1ceee7afe779cca6dfc5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 16 21:59:45 2008 -0400 + + [cairo-surface] Allow flush and finish calls after surface is finished + + Flushing and finishing a surface after it has already been finished is a + very well-defined operation: no-op. Allow and document that. + + src/cairo-surface.c | 33 +++++++++++---------------------- + 1 file changed, 11 insertions(+), 22 deletions(-) + +commit 168447cc2b53e446bf8e67e2f457c54256bcbada +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 20:09:17 2008 -0400 + + [user-font] Use opaque colors such that PS backend gets tested + + Also update ref images. All backends pass now. + + test/user-font-pdf-ref.png | Bin 6085 -> 6388 bytes + test/user-font-ref.png | Bin 6165 -> 6183 bytes + test/user-font-svg-ref.png | Bin 6085 -> 6134 bytes + test/user-font.c | 8 ++++---- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 556b16d6a20f11627c75c1365dea5a6332091779 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 20:03:05 2008 -0400 + + [cairo-traps] Fix overflow in traps_path code + + This was causing the user-font test failure in type1 subsetting + code as the type1 code creates a font at size 1000. + + src/cairo-traps.c | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +commit b355ac7a9fe8ecf550ec5f615969b82f0e45a6d6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 20:02:33 2008 -0400 + + [cairo-fixed] Implement _cairo_fixed_mul_div() + + Computes a*b/c where a,b,c are cairo_fixed_t. + + src/cairo-fixed-private.h | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 84606a900f0664a0010034f5eb4bdaf159e77bfe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 19:41:49 2008 -0400 + + [cairo-surface] Fix compiler warnings + by adding new status value to switch. + + src/cairo-surface.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 142ba306047363af8343f29b2cf97c25919042e9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 18:50:55 2008 -0400 + + [test/Makefile.am] Add 'make run' target + + It runs tests under a tool specified tool. For example: + + make run TOOL=gdb TESTS=user-font TARGETS=pdf + + test/Makefile.am | 20 ++++++++++++++------ + test/README | 19 +++++++++++++++++++ + 2 files changed, 33 insertions(+), 6 deletions(-) + +commit 537ffa762833c990e4e4237f2dbae64c7e311662 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 18:47:24 2008 -0400 + + [cairo-xlib-surface.c] Fix memmove bug + + This was introduced in b7272e9e8e716b04752058855aeb74c42af0b395 + + src/cairo-xlib-surface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4dd4d96fb11354e37f662eaabb1d874dbf47e368 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 17:19:53 2008 -0400 + + [cairo-surface] Add cairo_surface_get_fallback_resolution() + + doc/public/cairo-sections.txt | 1 + + doc/public/tmpl/cairo-surface.sgml | 10 ++++++++++ + src/cairo-surface.c | 23 +++++++++++++++++++++++ + src/cairo.c | 3 +++ + src/cairo.h | 5 +++++ + src/cairoint.h | 4 ++++ + 6 files changed, 46 insertions(+) + +commit 2321b91cbad7f9531ab99a7b1875eba0dcc167db +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 16:38:56 2008 -0400 + + [cairo-pattern] Make a free() call conditional + to emphasize that the pointer may be NULL + + src/cairo-pattern.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 62652ecab7c3163d6b0cf9af3312806ae6bda21a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 13:28:03 2008 -0400 + + [test/user-font] Another minor tweak to the font + + test/user-font-pdf-ref.png | Bin 6130 -> 6085 bytes + test/user-font-ref.png | Bin 6202 -> 6165 bytes + test/user-font-svg-ref.png | Bin 6130 -> 6085 bytes + test/user-font.c | 2 +- + 4 files changed, 1 insertion(+), 1 deletion(-) + +commit df9deb1853ab199b576cd4313b80cb3dd536f74f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 15 13:13:30 2008 -0400 + + [user-font] Set correct device-offset for rotated text + + Part of patch from Peter Clifton + + src/cairo-user-font.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 16fe67ea19bca66ed68c263bb48a5fbd19993e3f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 13 16:10:28 2008 -0400 + + [cairo-path-fixed] Implement full-matrix _cairo_path_fixed_transform() + + Based on patch from Peter Clifton. + + src/cairo-clip.c | 2 +- + src/cairo-meta-surface.c | 2 +- + src/cairo-path-fixed.c | 54 ++++++++++++++++++++++++++++++++---------------- + src/cairoint.h | 4 ++-- + 4 files changed, 40 insertions(+), 22 deletions(-) + +commit f68fb2c747afd45252a333260cdb3bf9986d4a94 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 13 11:42:23 2008 -0400 + + [test/user-font] Add some more glyphs + + The glyph for 'z' now reveals a bug in PDF type1 code. + + test/user-font-pdf-ref.png | Bin 4549 -> 6130 bytes + test/user-font-ref.png | Bin 4681 -> 6202 bytes + test/user-font-svg-ref.png | Bin 4642 -> 6130 bytes + test/user-font.c | 39 +++++++++++++++++++++------------------ + 4 files changed, 21 insertions(+), 18 deletions(-) + +commit 569cc3041195db9408c9c6531dc35b6f77434a25 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 10 14:58:11 2008 +0200 + + [user-font] Normalize the space we compute extents in + + This way we wouldn't suffer from the limited precision of cairo_fixed_t. + Bug reported by Peter Clifton on mailing list. + + src/cairo-user-font.c | 32 +++++++++++++++++++++++++++----- + 1 file changed, 27 insertions(+), 5 deletions(-) + +commit f1a0e9df0e390759afb7951afacb6d353ac812cf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 10 13:49:23 2008 +0200 + + [user-font] Round glyph origin position + + src/cairo-user-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 17f21ea3071ef5d7833c615271b18ae35673c349 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 16:01:37 2008 +0200 + + [cairo-user-font] Implement user fonts + + doc/public/tmpl/cairo-font-face.sgml | 1 + + doc/public/tmpl/cairo-status.sgml | 3 + + src/Makefile.am | 1 + + src/cairo-misc.c | 4 + + src/cairo-user-font.c | 486 +++++++++++++++++++++++++++++++++++ + src/cairo.h | 68 ++++- + src/cairoint.h | 2 +- + test/.gitignore | 1 + + test/Makefile.am | 4 + + test/user-font-pdf-ref.png | Bin 0 -> 4549 bytes + test/user-font-ref.png | Bin 0 -> 4681 bytes + test/user-font-svg-ref.png | Bin 0 -> 4642 bytes + test/user-font.c | 236 +++++++++++++++++ + 13 files changed, 803 insertions(+), 3 deletions(-) + +commit 9f2971440b59c311d88beeeb31e1d456489b107d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 10 01:19:41 2008 +0200 + + [doc] Remove cairo-quartz-image-surface from docs + + Docs only include stable API. + + doc/public/cairo-docs.xml | 1 + + doc/public/cairo-sections.txt | 9 +++------ + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit 74eea0f297a62be5aba84b7482832485d11995e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 10 00:58:07 2008 +0200 + + [cairo-quartz-image-surface] Remove one abuse of out-of-memory status + + Vlad, you need to stop throwing random OOM errors... + + src/cairo-quartz-image-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit dca892c83ea7d115fba0ce66a69464c36cadf74c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 10 00:57:44 2008 +0200 + + Fix gtk-doc warnings + + src/cairo-path-fixed.c | 2 +- + src/cairo-quartz-font.c | 12 ++++++------ + src/cairo-quartz-image-surface.c | 12 ++++++------ + 3 files changed, 13 insertions(+), 13 deletions(-) + +commit 1246ff8aec9054d1d550dd1401b67fac4035cce0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 17:14:02 2008 +0200 + + [cairo-test] Implement cairo_test_log_path() to dump a cairo_path_t to logs + + Dumping paths is so hard in C. Shouldn't be. At least not when debugging... + + test/cairo-test.c | 31 +++++++++++++++++++++++++++++++ + test/cairo-test.h | 3 +++ + 2 files changed, 34 insertions(+) + +commit dc33760fcb67c41358bb073d63810b5a86099f43 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:59:00 2008 +0200 + + [cairo-scaled-font] In _cairo_scaled_glyph_lookup, better handle UNSUPPORTED + + If we ask for a glyph info piece and the backend doesn't provide it, + we should return UNSUPPORTED, even if the backend returned SUCCESS + (perhaps because the backend doesn't know about that particular piece + of glyph info). + + src/cairo-scaled-font.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit a63dc133779de9c623a85c5aefb5e3da01a8b7d6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:56:35 2008 +0200 + + [cairo-scaled-font] Add a meta-surface member to scaled glyphs + + No one currently uses it. + + src/cairo-scaled-font.c | 17 +++++++++++++++++ + src/cairoint.h | 13 ++++++++++--- + 2 files changed, 27 insertions(+), 3 deletions(-) + +commit 11a0884168afe341d53e5c86a49aa48a0142e6ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:29:10 2008 +0200 + + Add CAIRO_INTERNAL_SURFACE_TYPE_NULL and cairo_nul_surface_create() + + It creates a surface that does nothing. This can be used with + cairo-analysis-surface, to compute bounds of cairo drawings without doing any + actual drawings. + + src/cairo-analysis-surface-private.h | 4 +++ + src/cairo-analysis-surface.c | 55 ++++++++++++++++++++++++++++++++++++ + src/cairo-types-private.h | 3 +- + 3 files changed, 61 insertions(+), 1 deletion(-) + +commit 08334be905edf5f557250e5946bd61391823da27 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:32:57 2008 +0200 + + [cairo-meta-surface] Add _cairo_meta_surface_get_path() + + Which generates the path for each cairo operation. If there's any paint, + mask, or intersect-clip-path operations in the meta-surface, UNSUPPORTED + is returned. + + Strokes are currently tesselated to traps, then traps converted to path. + Should be made to use stroke_to_path() when we implement that. + + src/cairo-meta-surface-private.h | 4 +++ + src/cairo-meta-surface.c | 71 ++++++++++++++++++++++++++++++++++++++++ + src/cairo.c | 7 ++-- + 3 files changed, 80 insertions(+), 2 deletions(-) + +commit 674cba89fe6165d3dc9986c3d5f083867498e6c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:31:45 2008 +0200 + + [cairo-traps] Add _cairo_traps_path() + + It appends path for each trap to the path. + + src/cairo-traps.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 4 ++++ + 2 files changed, 50 insertions(+) + +commit af1e168bbbbaddbf564c661111a74064fbbb5334 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:25:40 2008 +0200 + + [cairo-meta/analysis-surface] Make width/height of -1,-1 mean unbounded surface + + src/cairo-analysis-surface.c | 15 +++++++++++---- + src/cairo-meta-surface.c | 3 +++ + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit a6eb9be1066559233d51dbd17bcef18dd61e29fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 14:46:22 2008 +0200 + + [_cairo_surface_get_extents()] return UNSUPPORTED if surface has no bounds + and set the extents to the infinite bounds. + + A surface has no bounds if it does not provide get_extents(), or if its + get_extents() returns UNSUPPORTED. + + src/cairo-analysis-surface.c | 12 ++++++------ + src/cairo-surface.c | 21 +++++++++++++++++---- + src/cairoint.h | 10 +++++++--- + 3 files changed, 30 insertions(+), 13 deletions(-) + +commit d37788f9953b296675860cd48a0b3c14be49c1da +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 14:34:22 2008 +0200 + + [cairo-analysis-surface] Initialize page bounding box + + If there was no operations played to the analysis surface, page_bbox + was being left uninitialized. + + src/cairo-analysis-surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit ee3672efdbb4d3ebd3e0bd9e2d63273ad1273e64 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 14:05:04 2008 +0200 + + [cairo-pattern] Extend infinite pattern extents to negative coordinates too + + With things like meta-surface, the assumption that coordinates are always + non-negative make no sense. Extend the "infinite" extents accordingly. + + Also remove stale comment. extents->width/height are unsigned these days and + cover the full range. + + src/cairo-pattern.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +commit f81b857e1ffa48559c794e2fb427413e3a88a271 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:25:16 2008 +0200 + + [cairo-paginated-surface] Clean up reference counting mess + + Previously the paginated constructor didn't reference the target surface, but + simply assume ownership of the reference, and then unref it when shutting + down. The callers to paginated constructor then, where just give away their + reference to paginated and not unref the reference they were holding. While + this works correctly, it's against the usual idioms that everyone is + responsible for the reference they are holding, and should get their own + reference if they need to keep an object alive. Fix it all. + + src/cairo-paginated-surface.c | 2 +- + src/cairo-pdf-surface.c | 6 +++++- + src/cairo-ps-surface.c | 5 ++++- + src/cairo-svg-surface.c | 5 ++++- + src/cairo-win32-printing-surface.c | 16 +++++++++++----- + src/test-paginated-surface.c | 5 ++++- + 6 files changed, 29 insertions(+), 10 deletions(-) + +commit 440b339da793ba2f71f504328417aefc7d44ee7f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:23:02 2008 +0200 + + [cairo-analysis-surface] Hold reference to target surface + + src/cairo-analysis-surface.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 25700f5cd052e5353c868ba0311ff53850e3f549 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:32:35 2008 +0200 + + [cairo-ft-font.c] Throw error on font type mismatch and remove unused function + + src/cairo-ft-font.c | 16 ++++++++++------ + src/cairo-ft-private.h | 3 --- + 2 files changed, 10 insertions(+), 9 deletions(-) + +commit 2a1661fba9db1e263079e0ff101c628a443702e8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:31:54 2008 +0200 + + [cairo-win32-font.c] Return error on font type mismatch + + src/cairo-win32-font.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit 2a9bb6f78c8a0fa47908da7863979560230a62a2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:07:45 2008 +0200 + + Add CAIRO_STATUS_FONT_TYPE_MISMATCH + + src/cairo-misc.c | 2 ++ + src/cairo.h | 4 +++- + src/cairoint.h | 2 +- + 3 files changed, 6 insertions(+), 2 deletions(-) + +commit 4d77dfc78d2ea1925d0035080f57b68b0269a5f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:27:55 2008 +0200 + + [cairo-analysis-surface] Add _cairo_analysis_surface_[gs]et_ctm() + + The functionality was there. Just add getter/setter for the ctm. + + src/cairo-analysis-surface-private.h | 8 ++++++++ + src/cairo-analysis-surface.c | 20 ++++++++++++++++++++ + 2 files changed, 28 insertions(+) + +commit ad7cfb4af98e8bf7792dad0ef4fd772cd6f1d270 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:20:02 2008 +0200 + + [cairo-analysis-surface] Use _cairo_matrix_transform_bounding_box_fixed() + and other conversion functions. + + src/cairo-analysis-surface.c | 29 +++++++---------------------- + 1 file changed, 7 insertions(+), 22 deletions(-) + +commit bdfda97f191fa6ffa64abad5b6f035244d91f44c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:17:30 2008 +0200 + + [cairo-matrix] Add _cairo_matrix_transform_bounding_box_fixed() + + src/cairo-matrix.c | 12 ++++++++++++ + src/cairoint.h | 5 +++++ + 2 files changed, 17 insertions(+) + +commit 6c9902fd746d70d9cc22c938f4ca68640e48bb73 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:16:13 2008 +0200 + + Add more consts to function signatures and remove stale prototype + + src/cairo-bentley-ottmann.c | 6 +++--- + src/cairo-traps.c | 10 ++++++---- + src/cairoint.h | 21 +++++++++------------ + 3 files changed, 18 insertions(+), 19 deletions(-) + +commit 0e965c970bd310bd8f06cd59ed0cf631ae88659a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:13:52 2008 +0200 + + [cairo-path-fixed] Add _cairo_path_fixed_append() + + src/cairo-path-fixed.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + src/cairoint.h | 5 +++++ + 2 files changed, 51 insertions(+) + +commit e9b6bb06d60584a867256e52732aad25c9e137c5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:13:15 2008 +0200 + + [cairo-path-fixed] Add a couple consts to function signatures + + src/cairo-path-fixed.c | 4 ++-- + src/cairoint.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2a3eec1731d0cfdbc1abc204c08ff14296f297ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:10:44 2008 +0200 + + [cairo-rectangle] Add new convenience functions for working with cairo_box_t + + _cairo_box_from_doubles, _cairo_box_to_doubles, _cairo_box_from_rectangle. + + src/cairo-rectangle.c | 35 ++++++++++++++++++++++++++++++++++- + src/cairoint.h | 17 ++++++++++++++++- + 2 files changed, 50 insertions(+), 2 deletions(-) + +commit 6836b2b8bac0a0f5594e0c56629b075387fe1d22 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:14:23 2008 +0200 + + [cairoint.h] Fix file name in comments + + src/cairoint.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ca8b917102ddfad67300f907732dbd69a2c86957 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:28:31 2008 +0200 + + [cairo-surface] Call backend->flush even if backend->finish is null + + Trivial bug. + + src/cairo-surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 07cd614039cf7d3c776413ff26e94aa7dc27ea23 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:27:40 2008 +0200 + + [cairo-scaled-font] Tolerate null scaled_font->backend->fini + + src/cairo-scaled-font.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1f05cae0a9aaff23a4d80b309d30ed5047198113 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:03:51 2008 +0200 + + [cairo-font-face] Tolerate null font_face->backend->destroy() + + src/cairo-font-face.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 96599225e2fd1f7d11071a19f1ceb2c33f2a453b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:36:33 2008 +0200 + + Define CAIRO_RECT_INT_MIN/MAX such that ints do not overflow when converted to fixed + + There's not much point in having integers that will overflow. + + src/cairo-types-private.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit eb63e5609ebb2b666f0cce552dec4c335f210baf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 13:00:28 2008 +0200 + + [_cairo_surface_set_device_scale] zero xy and yx matrix entries + + Just in case... + + src/cairo-surface.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 80c59062675ad86d7201352140043f9e27d4b7d4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 12:59:07 2008 +0200 + + [cairo-surface] Tone down a Caution comment + + We have tested the case of device transforms that have both translate and + scale. So it basically works. We just are not sure that we handle it in + all places (In fact we know we don't.) + + src/cairo-surface.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 901c56cba28f9eef3a7a27a25dfbb993b492518b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:35:08 2008 +0200 + + [image surface] Rename cairo_image_surface_backend to _cairo_image_surface_backend + + src/cairo-image-surface.c | 6 +++--- + src/cairo-surface.c | 2 +- + src/cairoint.h | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 5744b0b9a563e5cf329cc0ba31f96ff238d86210 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:41:05 2008 +0200 + + [cairo-deprecated.h] Remove mention of cairoint.h from public header + + src/cairo-deprecated.h | 4 ---- + 1 file changed, 4 deletions(-) + +commit 5f633580189fa48f5b650d3c63c585521bb833a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 09:53:40 2008 -0400 + + [src/check-doc-syntax.sh] Fix some bugs in the check and fix errors found + + src/cairo-lzw.c | 2 +- + src/cairo-mutex-type-private.h | 32 ++++++++++++++++++++++---------- + src/cairo-output-stream.c | 6 ++++-- + src/cairo-paginated-private.h | 12 ++++++------ + src/cairo-surface.c | 4 ++-- + src/cairo.h | 12 ++++++------ + src/check-doc-syntax.sh | 40 ++++++++++++++-------------------------- + 7 files changed, 55 insertions(+), 53 deletions(-) + +commit 7dce5360424a98e4100bd78e768c220959633145 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 15:28:02 2008 +0200 + + Add XXX marker + + src/cairo-scaled-font.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a3c091e29264eec2d3f881dd7c66796d1779d845 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 8 18:18:17 2008 -0400 + + [src/check-doc-syntax.sh] Use cairo_all_source_files if available + + src/check-doc-syntax.sh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e39127627a71fc6655854804de36a802f73c0d42 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 8 18:13:32 2008 -0400 + + [Makefile.am] Rename cairo_all_source_file to cairo_all_source_files + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d6654ce2a69c3ad30e437d50825166214a5411c2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 9 11:23:42 2008 +0200 + + [Makefile.am] Sort source files + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b7272e9e8e716b04752058855aeb74c42af0b395 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 1 19:46:58 2008 +0100 + + [cairo-xlib] Batch XRenderFreeGlyphs + + For every glyph evicted from the cache we would allocate a very small + structure to push onto the xlib work queue. This quickly becomes + noticably for an app that consumes a lot of scaled fonts and glyphs, + e.g. trying to draw text at various angles. So we maintain a small array + of glyphs pending finalisation and issue the XRenderFreeGlyphs() once the + array is full. + + src/cairo-xlib-surface.c | 95 ++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 68 insertions(+), 27 deletions(-) + +commit 3428acf25db6c67ca48d619e98406a6bd4868880 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 6 14:52:02 2008 +0100 + + [cairo-scaled-font] Mark the scaled font as finished during destruction. + + During the destruction of every font used with an xlib surface, we send + an XRenderFreeGlyphs() for every single glyph in the cache. These + requests are redundant as the server-side glyphs will be released along + with the XRenderFreeGlyphSet(), so we skip the individual glyph + destruction if the font is marked as finished. + + src/cairo-scaled-font-private.h | 2 ++ + src/cairo-scaled-font.c | 5 +++++ + src/cairo-xlib-surface.c | 4 ++++ + 3 files changed, 11 insertions(+) + +commit 24284c5101363f8d418083e821c1bad88830dbcb +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 1 18:05:08 2008 +0100 + + [cairo-xlib] Enlarge the on-stack arrays. + + Grow the on-stack arrays for the XRectangles and XTrapezoids to the + standard size in order to reduce the frequency of allocations. + + src/cairo-xlib-surface.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit fda95868020effcbc56ff687a763af650a758ba2 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu May 1 15:44:22 2008 +0100 + + [cairo-xlib] Cache standard xrender formats. + + XRender performs a round-trip in order to query the available formats on + the xserver, before searching for a matching format. In order to save + that round-trip and to avoid the short-lived allocation of the array of + available formats, we cache the result on the display. + + src/cairo-xlib-display.c | 35 +++++++++++ + src/cairo-xlib-private.h | 7 +++ + src/cairo-xlib-surface.c | 159 ++++++++++++++++++++++++----------------------- + 3 files changed, 122 insertions(+), 79 deletions(-) + +commit 8457374c9cf350841a7c16f1ef1657aeb354e5c9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 30 22:03:21 2008 +0100 + + [cairo-pattern] Repaint existing cached similar solid surfaces. + + The current solid surface cache returns an existing similar surface only + if it is an exact match for the desired colour. This gives a high hit + rate for the original goal of drawing text, but fails when using a lot + of colours - for example drawing a pie-chart, the mosaic perf case, or + browsing the web. So instead of creating a new surface from scratch we + can repaint an existing one, providing that we have sufficient surfaces + already cached, i.e. if we are going to evict a surface, we may as well + just repaint it. + + src/cairo-pattern.c | 62 ++++++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 50 insertions(+), 12 deletions(-) + +commit 4b3f9c7c7d6ba01cf02815994af7da663e85bb9b +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 6 14:18:18 2008 +0100 + + [cairo-arc] Protect against division-by-zero. + + Avoid a division-by-zero which can only happen if the start angle is + exactly equal to the end angle. + + Fixes test/degenerate-arc. + + src/cairo-arc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ff596c64fb08b9845e2176146ee129b60fe5775a +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 6 10:58:57 2008 +0100 + + [test] Add degenerate-arc + + This test case is to exercise the divide-by-zero error reported by + Luiz Americo Pereira Camara <luizmed@oi.com.br>, + http://lists.cairographics.org/archives/cairo/2008-May/014054.html. + + test/.gitignore | 1 + + test/Makefile.am | 3 ++ + test/degenerate-arc-ps-ref.png | Bin 0 -> 585 bytes + test/degenerate-arc-ref.png | Bin 0 -> 616 bytes + test/degenerate-arc.c | 82 +++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 86 insertions(+) + +commit fed9d9060eb950a6692334a7ba3879009b597532 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 6 11:31:14 2008 +0100 + + [test/invalid-matrix] Disable floating point exception. + + test/invalid-matrix purposely feeds invalid numbers into cairo, in + order to check its detection of garbage values. In doing so, cairo + raises an Invalid exception, but as this is a direct result of an abuse + of the API we can treat it as expected behaviour and ignore the + exception. + + configure.in | 2 +- + test/invalid-matrix.c | 9 +++++++++ + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 1755a2d27def853163f9c496c07ae79070c5002e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 6 10:29:20 2008 +0100 + + [test] Enable floating point exceptions. + + Some platforms and applications enable floating point exceptions, so it + seems sensible to run the test-suite with the most serious exceptions + enabled - divide by zero, invalid result and overflow. + + configure.in | 9 ++++++--- + test/cairo-test.c | 7 +++++++ + 2 files changed, 13 insertions(+), 3 deletions(-) + +commit bf49015202523c6e9f4130c3160e8b5c50f16db8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue May 6 10:19:59 2008 +0100 + + [configure.in] Add lcov-1.6 to list of valid versions. + + Accept version 1.6 of lcov. + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 504132db6d9f08c36c9ae82f472caf422a032dfd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 23:05:01 2008 +0930 + + win32-font: Check status in load_truetype_table + + src/cairo-win32-font.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 2a7c5cd1ee3d3b75e4a65362d33d89c95f8eb03b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 23:01:48 2008 +0930 + + Eliminate warning in win32 load_truetype_table with bitmap fonts + + Use cairo_win32_scaled_font_select_font() instead of + _cairo_win32_scaled_font_select_unscaled_font() to select the font. + Because _cairo_win32_scaled_font_select_unscaled_font() displays a + warning when used with a bitmap font. + + src/cairo-win32-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7063e7b0bf1d33c4166dc3b73ec33f6d9a708ce3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 22:56:50 2008 +0930 + + Fix bug in win32 font metrics with bitmap fonts + + The glyph width caculation was not compensating for the + WIN32_FONT_LOGICAL_SCALE resulting in a glyph width and glyph advance + 32 times larger than it should be. + + src/cairo-win32-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d35d6eec24c1b7ab0a49149a51bf65ea8e223203 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 22:54:02 2008 +0930 + + Fix win32 bitmap font metrics when device scale != 1 + + 158d24412bba9 fixed win32 printing of bitmap fonts by forcing the use + of fallback images. This exposed a bug in the win32 bitmap font + metrics when a device scale is used that resulted in clipped glyphs. + + src/cairo-win32-font.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 158d24412bba99a4f57907d7fd22a86aae6e87af +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 22:46:41 2008 +0930 + + Make win32-printing surface work with bitmap fonts + + The win32 printing surface has the same problem with bitmap fonts as + it does with Type 1 fonts. ie ExtTextOutW() with glyph indices works + for a display DC but not a printer DC. + + Fix this by forcing fallback for bitmap fonts. + + src/cairo-win32-font.c | 10 ++++++++++ + src/cairo-win32-printing-surface.c | 14 ++++++++++++++ + src/cairo-win32-private.h | 3 +++ + 3 files changed, 27 insertions(+) + +commit 547e2f552cff264b943803d3a1ff03d05bde35c0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 22:43:08 2008 +0930 + + Fix win32-printing show_glyphs analysis for Type 1 fonts + + The analysis code needs to include the Type 1 font check that was + previously adding the the rendering code. + + src/cairo-win32-printing-surface.c | 1 + + 1 file changed, 1 insertion(+) + +commit 141bca74ba154d79fab49db74a51cd41f04e3a34 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun May 4 22:40:49 2008 +0930 + + Make cairo_win32_surface_get_dc work with win32 printing surface + + The win32 printing surface is a paginated surface so we need to get + the paginated surface target to get to the win32_printing surface. + + src/cairo-win32-surface.c | 23 ++++++++++++++++++----- + 1 file changed, 18 insertions(+), 5 deletions(-) + +commit 8742429c7958bb7f87595b1c018b4da7856b2f92 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 15:19:40 2008 +0100 + + [test] Add test case for a leaky dashed rectangle. + + Franz Schmid reported on the mailing list, + http://lists.cairographics.org/archives/cairo/2008-April/013912.html, + an issue with drawing a dashed rubber band in Scribus. The problem + appears when segments of the dashed rectangle are outside the image, + with the errant dash connecting the ends of the visible segments. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/leaky-dashed-rectangle-ref.png | Bin 0 -> 444 bytes + test/leaky-dashed-rectangle.c | 92 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 95 insertions(+) + +commit afa4ff8df598b60ab75a95ceac9bc0dafedd3b22 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 10:02:51 2008 +0100 + + [check] Filter programlistings for check-doc-syntax.sh + + We do not want to enforce the gtk-doc markup in the preformated + examples, so run the files through sed to filter out <programlisting> + before checking with the error detecting regexp. + + src/check-doc-syntax.sh | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit e94126fb678cecfc61e1b1afb62b8e75e2aec286 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 09:20:30 2008 +0100 + + [cairo-ft] Add a demonstration of how to handle the lifetime of the FT_Face. + + Extend the documentation for cairo_ft_font_face_create_for_ft_face() to + demonstrate using cairo_font_face_set_user_data() to destroy the FT_Face + after the final reference to the cairo_font_face_t has been dropped. + + src/cairo-ft-font.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 78cb05a1b7b4160b8914c75479bd60d0b34b0663 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 09:10:50 2008 +0100 + + [cairo-ft-font] Fixup doc reference to cairo_ft_font_face_create_for_ft_face() + + The documentation referred to cairo_ft_font_face_create_for_face(). + + src/cairo-ft-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f43e5e9ed975f40e4fab06cef89e40a18a5e170e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 09:09:22 2008 +0100 + + [cairo-ft] Correct the function references in the docs. + + The docs reference cairo_ft_font_lock_face() instead of the correct + cairo_ft_scaled_font_lock_face() (and friends). + + src/cairo-ft-font.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 5d20479b99c187ee90ebce36b97a9064acff8f0d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 09:03:00 2008 +0100 + + [test/ft-font-create-for-ft-face] Fix the lifetime issues of FT_Face. + + The font_face created from cairo_ft_font_face_create_for_ft_face() + was being kept alive by a reference from the context beyond the + lifetime of the parent cairo_scaled_font_t (which owned the FT_Face). + Correct the example in the test code to remove this errant reference + before cleaning up the fonts. (To be fair, to actually trigger a bug + one has to evict the FT_Face from the cache before using the font_face + - merely creating a cairo_scaled_font_t for every font on the system is + enough.) + + test/ft-font-create-for-ft-face.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 00965edf49a989c56d1236807f5b2901bb157005 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 29 08:59:37 2008 +0100 + + [cairo-ft] Remove unused private aliases. + + cairo_ft_scaled_font_lock_face() and friends are unused internally + (instead _cairo_ft_unscaled_font_lock_face() is used directly), so + remove the unnecessary aliases. + + src/cairo-ft-font.c | 4 ++-- + src/cairo-ft-private.h | 3 --- + 2 files changed, 2 insertions(+), 5 deletions(-) + +commit 122a31a0757d0483f72af0cf3816a52bded5afb6 +Author: Vladimir Vukicevic <vladimir@pobox.com> +Date: Sun Apr 27 15:20:43 2008 -0700 + + [quartz] Fix CGFont leaks when creating quartz fonts + + The toy font constructor and the _with_atsu_font_id constructor were + not properly managing the refcount of the CGFontRef. + + src/cairo-quartz-font.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 76e655e5084270b7e5a9ed153e50e2f544c9b46f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 27 22:59:22 2008 +0930 + + Fix group-paint PDF test failure + + src/cairo-pdf-surface.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit 5e102b06d1a3c62a1dd0f381fbd1123961bebdf8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 27 21:51:05 2008 +0930 + + PDF: Fix unbalanced save/restore + + src/cairo-pdf-surface.c | 1 - + 1 file changed, 1 deletion(-) + +commit 3a2a86721096a5efdec25a3ec041d9fc7eec6cf8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 27 17:49:04 2008 +0930 + + PS: Fix gradients with one stop + + src/cairo-ps-surface.c | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +commit f99d86e7082a59f2c6e53f021f8fd62973a0d1ef +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 27 17:32:41 2008 +0930 + + PDF: Fix gradients with one stop + + src/cairo-pdf-surface.c | 38 ++++++++++++++++++++++++++++++++------ + 1 file changed, 32 insertions(+), 6 deletions(-) + +commit 6135ee716b4f2567f578fd023ba2d85c86cb7fda +Author: Sebastien Pouliot <sebastien@ximian.com> +Date: Fri Apr 25 18:43:01 2008 +0100 + + [configure.in] Build fails on Solaris due to non-POSIX ctime_r() + + Check for a Solaris build host and adjust the CFLAGS to force POSIX + semantics. + + (Fixes https://bugs.freedesktop.org/show_bug.cgi?id=15463.) + + configure.in | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit b4b77cedc9db73f1ba8af16704302a4b2cc3f184 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 21 22:50:59 2008 +0100 + + [test/Makefile.am] EXTRA_DIST += create-from-png*-ref.png + + Add the new reference images for create-from-png to the distributable. + + test/Makefile.am | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 63bba7e60c0c83f5456aa52611212264478148b4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 21 20:15:28 2008 +0100 + + [cairo-png] Call png_set_filler() before png_read_update_info(). + + Otherwise libpng gets very confused and we start scribbling over invalid + memory whilst reading in the PNG. + + src/cairo-png.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 20b1b33c0fc76d2ec2b4f83d9ce058429c4f49db +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 21 19:54:48 2008 +0100 + + [cairo-png] Recheck png_info after setting transformation options. + + After specifying how to transform the various colour modes into ones we + can handle, re-read the image header to confirm that the output on + reading the PNG will be RGB24 or ARGB32. This simplifies our logic + considerably as we no longer have to second guess the colour space + transformation that will be performed by libpng. (And allows for some + paranoid checks.) + + src/cairo-png.c | 38 ++++++++++++++++++++------------------ + 1 file changed, 20 insertions(+), 18 deletions(-) + +commit a313547f6d0ed060de7fc27dc2886ef09b8598d4 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 21 19:44:11 2008 +0100 + + [test/create-from-png] Check loading of various colour types. + + Check that when loading from index/gray/rgb PNGs, with and without + alpha/transparency, that the correct surface is generated by read_png(), + i.e. if the PNG contains an alpha channel then the image must be an + ARGB32 surface. + + test/create-from-png-alpha-ref.png | Bin 0 -> 150 bytes + test/create-from-png-gray-alpha-ref.png | Bin 0 -> 142 bytes + test/create-from-png-gray-ref.png | Bin 0 -> 124 bytes + test/create-from-png-indexed-alpha-ref.png | Bin 0 -> 172 bytes + test/create-from-png-indexed-ref.png | Bin 0 -> 159 bytes + test/create-from-png-ref.png | Bin 100 -> 131 bytes + test/create-from-png.c | 121 +++++++++++++++++++++++++++++ + 7 files changed, 121 insertions(+) + +commit f2f91db131e7c7df1e87bcd41ae17c07429bbcb8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 21 18:20:16 2008 +0100 + + [cairo-png] Create an ARGB32 surface for paletted PNGs. + + jeremie54 reported a regression in the handling of transparent paletted + PNGs beween 1.4.14 and 1.6.4. This was caused by the change to load + opaque PNGs into a RGB24 image surface, which made the assumption that + indexed PNGs were opaque. However, alpha/transparency in PNG is more + complicated, as PNG uses a tRNS chunk to supply transparency data for + paletted images and other image types that don't need a full alpha + channel. Therefore if the PNG contains a tRNS chunk always generate an + ARGB32 surface. + + src/cairo-png.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +commit ea6dbfd36f2182fda16cb82bca92007e0f7b8d77 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 16 17:24:43 2008 +0100 + + [cairo-meta-surface] Save and restore the original clip. + + When replaying the meta-surface to the target, we apply a stack-based + clip to the surface. However, we did not remove this clip from the + surface and so a pointer into our stack existed beyond the scope of + function. + + Saving the original clip pointer and restoring it before leaving the + function resolves the issue and appears to fix + https://bugzilla.mozilla.org/show_bug.cgi?id=429071. + + src/cairo-meta-surface.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit a2c4fd057217b70c74a66076acc4f42f676192ae +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 18 18:18:30 2008 +0930 + + Add "Since: 1.6" to win32 printing surface + + src/cairo-win32-printing-surface.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 212357cb4c859bb29649f86e808f498efb6d7315 +Author: Robert O'Callahan <roc@ocallahan.org> +Date: Fri Apr 18 06:15:26 2008 +0200 + + Clone surface correctly when doing a deep clip copy + + The rect specifies the clip surface location within the owning surface; + when cloned, the x/y should be 0 to get the entire surface. + + Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=409227 + + src/cairo-clip.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a0d71e5a38a5b6a9621da1ce773d591b6e500b1e +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 16 14:31:25 2008 +0100 + + [Makefile.am] Fix breakage in previous commit. + + I checked with --disable-pdf and with --disable-ps, but forgot to + check with them both enabled. D'oh. + + src/Makefile.am | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 472637da054ec90d8dc4b0095be6e9a134f507e0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Wed Apr 16 14:18:32 2008 +0100 + + [Makefile.am] Add cairo-pdf-operators*.[ch] to ps_sources + + The postscript backends depends upon cairo-pdf-operators.c, so list it + as a requirement in ps_sources. This enables the postscript backend to + build even if the pdf backend is disable by the user during configure. + + (Fixes http://bugs.freedesktop.org/show_bug.cgi?id=15532.) + + src/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 12831201d2461ae4452d91ad42bf74881da12e04 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 15 15:57:41 2008 -0400 + + [doc/tutorial/src/singular.c] Fix a bug in delta computation + + doc/tutorial/src/singular.c | 38 +++++++++++++++++++++----------------- + 1 file changed, 21 insertions(+), 17 deletions(-) + +commit cafdd0161941413547d253c743c743323e790400 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 15 13:33:50 2008 -0400 + + [Makefile.am] Document why beos was removed from build, and remove some cruft + + src/Makefile.am | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 0e315b1e6092d7ba44a89076567257d68ab3e1f9 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 14 20:32:29 2008 +0100 + + [test/a8-mask] Perform the stride API checking once. + + The stride API is independent of the surface and does not need to be + repeated for every surface. + + test/a8-mask.c | 97 ++++++++++++++++++++++++++++++---------------------------- + 1 file changed, 50 insertions(+), 47 deletions(-) + +commit 8b36ca085844ada8f13d0164719772b6bb78dff6 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 14 20:32:29 2008 +0100 + + [test/a1-mask] Perform the stride API checking once. + + The stride API is independent of the surface and does not need to be + repeated for every surface. + + test/a1-mask.c | 99 +++++++++++++++++++++++++++++----------------------------- + 1 file changed, 50 insertions(+), 49 deletions(-) + +commit fa5e87ad230db18be26b971dc0351abd342c7894 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Apr 14 20:11:44 2008 +0100 + + [cairo-test] Spelling fixes in comments. + + Skim through the comments fixing trivial smelling pistakes. + + test/cairo-test.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 8514d334442312774c8646dc46a630351cff83f5 +Author: Richard Hult <richard@imendio.com> +Date: Mon Apr 14 16:55:23 2008 -0700 + + Fix to install cairo-quartz-font.pc + + src/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 4ff59960f343f072efd10bfbfd78b8b2fbe1d4be +Author: Kouhei Sutou <kou@cozmixng.org> +Date: Mon Apr 14 16:53:37 2008 -0700 + + Fix typo in documentation (missing stride argument) + + src/cairo-image-surface.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e01072d4eae5a40f09a46373680d4ba6afa5c4e4 +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 14 16:52:40 2008 -0700 + + RELEASING: Send announcement of major releases to pr@lwn.net as well + + RELEASING | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 9db764c732ef6e3405866a60762592625aa94ca4 +Merge: d96fdd5 44e6cdd +Author: Carl Worth <cworth@cworth.org> +Date: Mon Apr 14 16:39:27 2008 -0700 + + Merge in '1.6' + + This gets us a fix for not linking with g++ from 1.6.4 + + We don't take from 1.6.4 the revert of the addition of + missing locking from the GC cache, (meanwhile, we've + already got a corrected fix for this). + + Conflicts: + + src/cairo-xlib-screen.c + +commit d96fdd58abf8d6c8692dbb08ec54cdd80accba79 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Apr 13 22:16:52 2008 +0930 + + win32: Fix broken printing of type1 fonts + + ExtTextOut() does not work with Type 1 font glyph indices when + printing. The same code works fine when dst->dc is a display. It + appears that ExtTextOut expects unicode character values when using + Type 1 fonts and a printer DC. + + Fix this by making Type 1 fonts in the win32-printing surface use the + fallback path for non Windows fonts. ie the glyphs will be emitted as + filled paths. + + src/cairo-win32-font.c | 10 ++++++++++ + src/cairo-win32-printing-surface.c | 1 + + src/cairo-win32-private.h | 3 +++ + 3 files changed, 14 insertions(+) + +commit af94b8d2a312500d0f81697021ba2c653accfeee +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 16:13:18 2008 -0700 + + README: Note that quartz is no longer experimental + + README | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ff5376563b1042ebea8a438acb309bcd8678cdc5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 11 23:47:07 2008 +0100 + + [xlib] Clear the gc_needs_clip_reset after use. + + If you think this commit is reminiscent of + 40558cb15e5f7276a29847b00c9dae08b9d9380e, you would be right as it fixes + exactly the same bug I made then and reintroduced in dc714106e156cb7901. + + So quoting 40558cb: + After consuming the GC we need to unset the clip reset flag, so that + if we try and get a new GC without first putting a fresh one we do not + try to call XSetClipMask on a NULL GC. + + src/cairo-xlib-screen.c | 1 + + 1 file changed, 1 insertion(+) + +commit 28a1dabed8cf50d9bec552bd9d3a18580c1c6711 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 11 23:40:36 2008 +0100 + + [test] Add a regression test for bug 10921 + + This bug first was fixed in 40558cb15e5f7276a29847b00c9dae08b9d9380e, + but then reintroduced in 9cfd82e87b60c0d65e9cafda026cb9a498874575, which + became part of the 1.6.2 quick release. + + As penance to make sure I never repeat this same bug again, I offer this + test case which exercises the XSetClipMask(NULL) path and hopefully + simulates some 'typical' usage of cairo by GUI toolkits. + + test/.gitignore | 1 + + test/Makefile.am | 2 + + test/xlib-expose-event-ref.png | Bin 0 -> 40736 bytes + test/xlib-expose-event.c | 275 +++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 278 insertions(+) + +commit 44e6cdd9b1eb3330d3f4ef4929d0af50cd0010e5 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 14:48:18 2008 -0700 + + Increment version to 1.6.5 after the 1.6.4 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 08a804806355d99d7968976d6afb98bbc0f2613d +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 14:33:12 2008 -0700 + + Increment version to 1.6.4 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a96176e12fa99b293453fa0321b1dfa4fd242917 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 14:32:37 2008 -0700 + + NEWS: Add notes for cairo 1.6.4 + + NEWS | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit 32e576382bc08ffaf98ebfc11c96e1453c437bbe +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 14:13:03 2008 -0700 + + Prevent cairo from being linked unnecessarilly with g++ + + The beos backend involves a source file written in C++. + Apparently, automake sees the conditional inclusion of + that source file and insists on doing the final link of + cairo with g++ even though that file isn't being compiled + at all. + + We definitely don't want that as it makes libcairo link + and depend on libstdc++ unnecessarily, (which can break + distribution packaging when not expecting it, etc.). + + src/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 8f1c8d4b26d6da11101c51ef388d1dcc7177cfb4 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 13:48:38 2008 -0700 + + Revert "[xlib] Add locking around GC cache." + + This reverts commit 9cfd82e87b60c0d65e9cafda026cb9a498874575. + + The fix was broken as it introduced crashes by calling + XSetClipMask with a NULL GC, (basically a reintroduction + of the bug originally fixed here: + + 7802de6d5edaf998c98b141870dc2c6b4c0f3e91 + + Let's revert for sake of the release, and fix this correctly + on master. + + src/cairo-xlib-private.h | 1 - + src/cairo-xlib-screen.c | 31 ++++++++++--------------------- + 2 files changed, 10 insertions(+), 22 deletions(-) + +commit 75001079c1c6361f116409dc13263e87081637d1 +Merge: a5770c3 f57100a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 10:08:14 2008 -0700 + + Merge in origin/master, (a few changes in parallel to 1.6.2 release) + +commit a5770c3335fccd1591f2cd58ab950a6eba77f271 +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 10:05:18 2008 -0700 + + Increment version to 1.6.3 after the 1.6.2 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5bc6fd71398f8aa902fcffe2da5d1e70fb94aa8a +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 09:52:28 2008 -0700 + + Increment version to 1.6.2 + + configure.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0c32497c3447d6d02d45a14ff4c400b6d1ea37da +Author: Carl Worth <cworth@cworth.org> +Date: Fri Apr 11 09:50:53 2008 -0700 + + NEWS: Add notes for 1.6.2 release + + NEWS | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit 9cfd82e87b60c0d65e9cafda026cb9a498874575 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 10 14:49:47 2008 +0100 + + [xlib] Add locking around GC cache. + + The per-screen cached of most-recently freed GCs lacks suitable locking + for it to be threadsafe. + (cherry picked from commit dc714106e156cb7901e376c0935922446ae9bcdf) + + src/cairo-xlib-private.h | 1 + + src/cairo-xlib-screen.c | 31 +++++++++++++++++++++---------- + 2 files changed, 22 insertions(+), 10 deletions(-) + +commit cf057c1e8603014033c079189369e91aecac2adf +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 11 21:42:19 2008 +0930 + + PS: Fix inefficient implementation of Tm/Td operators that was crashing printers + + The Td and Tm operator emulation were setting the font matrix like this: + + /some_font [xx yx xy yy x0 y0] selectfont + + where [xx yx xy yy] is the font matrix and [x0 y0] is the position of + the first glyph to be drawn. This seemed to be the easiest way to + emulate the Tm operator since the six arguments to Tm required by PDF + are xx,yx,xy,yy,x0,y0. + + Before the switch to pdf-operators the font matrix was set like this: + + /somefont [xx yx xy yy 0 0] selectfont x0 y0 moveto + + The selectfont operator is equivalent to calling findfont, makefont, + and setfont. The makefont operator creates a new font dictionary for + specified font that contains the specified font matrix. The + description of the makefont operator in the PostScript Language + Reference Manual states: + + "The interpreter keeps track of font dictionaries recently created + by makefont. Calling makefont multiple times with the same font and + matrix will usually return the same font rather than create a new + one." + + So the emulation of Tm and Td was creating a new font dictionary every + time a text string was displayed due to the change in the translation + components of the font matrix. Previously the font dictionary was + re-used as with the translation components of the matrix set to zero, + the font matrix did not change frequently. + + Some printers did not handle well the frequent creation a font + dictionary every time a few glyphs were displayed. + + Fix this by ensuring the translation components of the font matrix + used in the emulation of Tm and Td operators is always set to + zero. Use moveto instead for the translation components. + (cherry picked from commit c5814d2aa3cb68a13bc9cc8b6a47f660febcad71) + + src/cairo-ps-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit f57100acd4937486bfb69d38dfc72d42427e2851 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Fri Apr 11 11:36:24 2008 +0100 + + [test] Handle TEST_CONTENT_COLOR_ALPHA_FLATTENED similar surfaces. + + Convert the boilerplate specific flattened content value to the ordinary + CAIRO_CONTENT_COLOR_ALPHA for use with cairo_push_group_with_content() - + otherwise cairo rightfully flags an error and the test harness decides + that the similar surface is not available. + + boilerplate/cairo-boilerplate.c | 14 ++++++++++---- + boilerplate/cairo-boilerplate.h | 3 +++ + perf/cairo-perf.c | 6 ++++-- + test/cairo-test.c | 8 +++----- + 4 files changed, 20 insertions(+), 11 deletions(-) + +commit e4fc5279cc490b8d7c1f611d73601e6782c944a5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Mon Mar 31 15:48:51 2008 +0100 + + [cairo-font-options] Eliminate internal use of cairo_font_options_create() + + Within the library, we know the precise size of the struct and so can + allocate temporary font options on the stack - eliminating the need + to export an internal alias of cairo_font_options_(create|destory). + + src/cairo-font-options.c | 2 -- + src/cairo-surface.c | 9 +++------ + src/cairoint.h | 2 -- + 3 files changed, 3 insertions(+), 10 deletions(-) + +commit b72fe9bb5ff20bfc3d30a8a4bb353e52818b5fb7 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 10 16:48:42 2008 +0100 + + [cairo-arc] Check that the context is not error before proceeding. + + We depend on values stored on the context that become invalid upon an + error, so stop processing as soon as an error occurs. Prior to + adjusting, the values returned from the error context, this would cause + an infinite loop whilst calculating the number of segments required for + a tolerance of 0. + + src/cairo-arc.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit f6834dacef3e6f798c54829b9a309c8f96ed39f5 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 10 16:43:10 2008 +0100 + + [cairo] Return defaults when the context is in error. + + Return the default values instead of zero for an error context. This + helps to prevent application logic faults when using the values from + the error context (for an example, see _cairo_arc_in_direction()). + + src/cairo.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 68f53282b9a7ebf1bb2117b5a630237f458b99b0 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 10 14:58:30 2008 +0100 + + [xlib] Clear the Visual cache upon display closure. + + Clear the Visual cache, similarly to flushing the GC cache, upon + XCloseDisplay. + + src/cairo-xlib-screen.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit a2608cdde54dd677290da83cc9f8b98b139ff774 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 10 14:56:12 2008 +0100 + + [xlib] Convert the Visual cache to use the screen mutex. + + Use the per-screen mutex, introduced for the GC cache, to lock access to + the Visual cache (instead of the per-display mutex). + + src/cairo-xlib-screen.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +commit dc714106e156cb7901e376c0935922446ae9bcdf +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Apr 10 14:49:47 2008 +0100 + + [xlib] Add locking around GC cache. + + The per-screen cached of most-recently freed GCs lacks suitable locking + for it to be threadsafe. + + src/cairo-xlib-private.h | 1 + + src/cairo-xlib-screen.c | 31 +++++++++++++++++++++---------- + 2 files changed, 22 insertions(+), 10 deletions(-) + +commit 9166686abd92f8b2c7067002b051220e2f8fe780 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 11 22:50:52 2008 +0930 + + Refresh text-rotate PS reference image + + test/text-rotate-ps-ref.png | Bin 6878 -> 6796 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit c5814d2aa3cb68a13bc9cc8b6a47f660febcad71 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Apr 11 21:42:19 2008 +0930 + + PS: Fix inefficient implementation of Tm/Td operators that was crashing printers + + The Td and Tm operator emulation were setting the font matrix like this: + + /some_font [xx yx xy yy x0 y0] selectfont + + where [xx yx xy yy] is the font matrix and [x0 y0] is the position of + the first glyph to be drawn. This seemed to be the easiest way to + emulate the Tm operator since the six arguments to Tm required by PDF + are xx,yx,xy,yy,x0,y0. + + Before the switch to pdf-operators the font matrix was set like this: + + /somefont [xx yx xy yy 0 0] selectfont x0 y0 moveto + + The selectfont operator is equivalent to calling findfont, makefont, + and setfont. The makefont operator creates a new font dictionary for + specified font that contains the specified font matrix. The + description of the makefont operator in the PostScript Language + Reference Manual states: + + "The interpreter keeps track of font dictionaries recently created + by makefont. Calling makefont multiple times with the same font and + matrix will usually return the same font rather than create a new + one." + + So the emulation of Tm and Td was creating a new font dictionary every + time a text string was displayed due to the change in the translation + components of the font matrix. Previously the font dictionary was + re-used as with the translation components of the matrix set to zero, + the font matrix did not change frequently. + + Some printers did not handle well the frequent creation a font + dictionary every time a few glyphs were displayed. + + Fix this by ensuring the translation components of the font matrix + used in the emulation of Tm and Td operators is always set to + zero. Use moveto instead for the translation components. + + src/cairo-ps-surface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 0ac8130ae3d74a09343f4b9a2d69f938910b4ab9 +Merge: eac9251 11299ae +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 10 18:07:12 2008 -0700 + + Merge in origin/master, (just a few 1.5.21 changes alongside 1.6.0 release) + +commit eac9251d9a78e8d7bf00098b367a5176ed7dbce6 +Author: Carl Worth <cworth@cworth.org> +Date: Thu Apr 10 18:02:59 2008 -0700 + + Increment version to 1.6.1 after 1.6.0 release + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 11299ae5c5374f0b754636635c0df82fd30e3ffc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 9 11:17:14 2008 -0500 + + Add doc/tutorial/src/singular.c + + doc/tutorial/src/singular.c | 158 ++++++++++++++++++++++++++++++++++++++++++++ + src/cairo-matrix.c | 4 ++ + 2 files changed, 162 insertions(+) + +commit 089bf98df1708b77e0a66f52abb83856a93eff9d +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 8 15:33:47 2008 +0100 + + [test] Add group-paint + + The experience of running the entire test suite under cairo_push_group() + did at least reveal that there was a potential bug in the pdf backend. + This test is just the simplest of drawing operations - simply filling + the similar surface with solid blue, and then blitting that surface to + the destination. + + test/.gitignore | 1 + + test/Makefile.am | 2 ++ + test/group-paint-ref.png | Bin 0 -> 118 bytes + test/group-paint.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 60 insertions(+) + +commit 39100439cad575b3c542bbe31eaea699ff76b3c8 +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 8 11:32:51 2008 +0100 + + Check surface->status and finished in cairo_surface_write_to_png_stream + + Cut'n'paste from commit c1f765: + Without these checks, a user could hit an assertion failure by passing + a finished surface to cairo_surface_write_to_png_stream. Now we return + a nice CAIRO_STATUS_SURFACE_FINISHED error in that case instead. + + src/cairo-png.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 935b0bbf6e260180298dcd5643b5db3fde7af1fd +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Tue Apr 8 10:57:51 2008 +0100 + + [test/filter-bilinear-extents] Memleak. + + Destroy the temporary image surface. + + test/filter-bilinear-extents.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit c7cd5b30c4ef3ecf5c1f21257fcfac51308b701d +Author: Carl Worth <cworth@cworth.org> +Date: Tue Apr 8 03:11:50 2008 -0700 + + Increment cairo version to 1.5.21 after the 1.5.20 snapshot + + configure.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HACKING b/HACKING new file mode 100644 index 000000000..aba2c545b --- /dev/null +++ b/HACKING @@ -0,0 +1,185 @@ +Hacking Cairo +============= + +This is a high-level guide to how the cairo distribution is organized +and how to get started hacking on it. Make sure you read through the +file README before continuing. + + +Coding Style +------------ + +The easiest way to write code in the cairo style is to follow code close +to the place you are hacking, but if you want a written down set of +rules, see file CODING_STYLE. + +Files for backends that depend on languages other than C (C++ or +Objective C for example) may use features specific to those languages. +For example, "//" comments are allowed, though discouraged, in those files. + + +Contact +------- + +Various ways to get in touch with other cairo developers and maintainers +have been enumerated at: + + http://cairographics.org/contact/ + +Most of that information is also reflected in the following sections. + + +Mailing Lists +------------- + +There are various mailing lists that are useful when developing cairo +code. A complete list is always available at: + + http://cairographics.org/lists/ + +It is recommended that cairo developers subscribe to all those lists. +The cairo list by itself generates much more traffic than the others +combined, so developers and contributors should not be intimidated by +the -commit and -bugs lists. + + +Bug Tracking System +------------------- + +We use a standard bugzilla bug tracking system available at: + + http://bugs.freedesktop.org/ + +See file named BUGS for detailed information on reporting bugs. In short, +for straight bug reports, it's best to report them there such that they +are not lost or forgotten. For discussion of new features or +complicated issues, use the mailing list. + + +IRC +--- + +It's a great idea to hang around the cairo IRC channel if you have any +interest in cairo. We use the #cairo channel on irc.freenode.net. + +Make sure you introduce yourself if your nick is not easy to match to +the name you use on the mailing list. + + +Version Control System +---------------------- + +We use /git/ for version control. See: + + http://cairographics.org/download/ + +For more information on using git, see: + + http://freedesktop.org/wiki/Infrastructure/git/ + + +Build System +------------ + +We use the autotools build system with cairo, but with various +customizations and advanced features. Reading configure.in is your +best bet to understanding it, or just ask on IRC. + +To bootstrap the build system run ./autogen.sh. After that the +regular "./configure; make; make install" sequence can be used. +See file named INSTALL for more details. + +There is limited support for a win32 build system. +See README.win32 and Makefile.win32 files in various directories. + + +ChangeLog +--------- + +We generate ChangeLog files automatically from the git commit log. +No manual ChangeLog writing is necessary. + + +Copyrights and Licensing +------------------------ + +The cairo library is dual-licensed under LGPL and MPL. See the file +named COPYING for details. The test suites are more liberal, and are +allowed to include GPL code. + +When writing new code, update the file headers to add your (or your +employers) copyright line and contributor line. If adding new files +or splitting a file, copy the file header from other files. + + +Source Code +----------- + +The library source code and headers live in the src/ directory. +See src/README for more information. + + +Regression Test Suite +--------------------- + +Cairo has a fairly extensive regression-testing suite. Indeed, without +these tests it would be impossible to make a cairo release without +introducing tens of regressions. We still manage to introduce +regressions with each release even with the hundreds of tests we already +have. + +The regression test suite is located under the test/ directory. +See test/README for more information. + + +Performance Test Suite +---------------------- + +There is a performance test suite located under the perf/ directory. +A collection of traces of real-world behavior are also available in the +cairo-traces repository, which can be used in isolation or hooked in +with the main performance test suite. See perf/README for more +information. + + +Boilerplate +----------- + +The cairo-boilerplate is a small private library used by the regression +and performance test suites. It includes the boilerplace code needed +to initialize various backends for the test suites, as well as allow +tweaking some of the internal workings of the backends for more testing. + +The boilerplate code is localted under the boilerplate/ directory. +See boilerplate/README for more information. + + +Documentation +------------- + +Cairo uses the gtk-doc system for reference API documentation. + +The reference documentation is located under doc/public. +See doc/public/README for more information. + +For more documentation including frequently asked questions, tutorials, +samples, roadmap, todo list, etc visit: + + http://cairographics.org/documentation/ + +Some of those should gradually be moved to doc/. + + +Utilities +--------- + +We have developed several utilities useful for writing cairo or code +that uses cairo. These tools can be found under the util/ directory. +See util/README for more information. + + +Releasing +--------- + +Now you are a cairo maintainer, so what? See file named RELEASING. + diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..9db68dee2 --- /dev/null +++ b/INSTALL @@ -0,0 +1,184 @@ +Quick-start build instructions +------------------------------ +1) Configure the package: + + ./configure + +2) Compile it: + + make + +3) Install it: + + make install + +This final step may require temporary root access (eg. with sudo) if +you don't have write permission to the directory in which cairo will +be installed. + +NOTE: If you are working with source from git/cvs rather than from a tar +file, then you should use ./autogen.sh in place of ./configure +anywhere it is mentioned in these instructions. + +More detailed build instructions +-------------------------------- +1) Configure the package + + The first step in building cairo is to configure the package by + running the configure script. [Note: if you don't have a configure + script, skip down below to the Extremely detailed build + instructions.] + + The configure script attempts to automatically detect as much as + possible about your system. So, you should primarily just accept + its defaults by running: + + ./configure + + The configure script does accept a large number of options for + fine-tuning its behavior. See "./configure --help" for a complete + list. The most commonly used options are discussed here. + + --prefix=PREFIX + + This option specifies the directory under which the software + should be installed. By default configure will choose a + directory such as /usr/local. If you would like to install + cairo to some other location, pass the director to configure + with the --prefix option. For example: + + ./configure --prefix=/opt/cairo + + would install cairo into the /opt/cairo directory. You could + also choose a prefix directory within your home directory if + you don't have write access to any system-wide directory. + + After installing into a custom prefix, you will need to set + some environment variables to allow the software to be + found. Assuming the /opt/cairo prefix and assuming you are + using the bash shell, the following environment variables + should be set: + + PKG_CONFIG_PATH=/opt/cairo/lib/pkgconfig + LD_LIBRARY_PATH=/opt/cairo/lib + export PKG_CONFIG_PATH LD_LIBRARY_PATH + + (NOTE: On Mac OS X, at least, use DYLD_LIBRARY_PATH in place + of LD_LIBRARY_PATH above.) + + --enable-XYZ + --enable-XYZ=yes + --enable-XYZ=auto + --enable-XYZ=no + --disable-XYZ + + Cairo's various font and surface backends and other features can be + enabled or disabled at configure time. Features can be divided into + three categories based on their default state: + + * default=yes: These are the recommended features like PNG functions + and PS/PDF/SVG backends. It is highly recommended to not disable + these features but if that's really what one wants, they can be + disabled using --disable-XYZ. + + * default=auto: These are the "native" features, that is, they are + platform specific, like the Xlib surface backend. You probably + want one or two of these. They will be automatically enabled if + all their required facilities are available. Or you can use + --enable-XYZ or --disable-XYZ to make your desire clear, and then + cairo errs during configure if your intention cannot be followed. + + * default=no: These are the "experimental" features, and hence by + default off. Use --enabled-XYZ to enable them. + + The list of all features and their default state can be seen in the + output of ./configure --help. + +2) Compile the package: + + This step is very simple. Just: + + make + + The Makefiles included with cairo are designed to work on as many + different systems as possible. + + When cairo is compiled, you can also run some automated tests of + cairo with: + + make check + + NOTE: Some versions of X servers will cause the -xlib tests to + report failures in make check even when cairo is working just + fine. If you see failures in nothing but -xlib tests, please + examine the corresponding -xlib-out.png images and compare them to + the -ref.png reference images (the -xlib-diff.png images might also + be useful). If the results seem "close enough" please do not report + a bug against cairo as the "failures" you are seeing are just due + to subtle variations in X server implementations. + +3) Install the package: + + The final step is to install the package with: + + make install + + If you are installing to a system-wide location you may need to + temporarily acquire root access in order to perform this + operation. A good way to do this is to use the sudo program: + + sudo make install + +Extremely detailed build instructions +------------------------------------- +So you want to build cairo but it didn't come with a configure +script. This is probably because you have checked out the latest +in-development code via git. If you need to be on the bleeding edge, +(for example, because you're wanting to develop some aspect of cairo +itself), then you're in the right place and should read on. + +However, if you don't need such a bleeding-edge version of cairo, then +you might prefer to start by building the latest stable cairo release: + + http://cairographics.org/releases + +or perhaps the latest (unstable) development snapshot: + + http://cairographics.org/snapshots + +There you'll find nicely packaged tar files that include a configure +script so you can go back the the simpler instructions above. + +But you're still reading, so you're someone that loves to +learn. Excellent! We hope you'll learn enough to make some excellent +contributions to cairo. Since you're not using a packaged tar file, +you're going to need some additional tools beyond just a C compiler in +order to compile cairo. Specifically, you need the following utilities: + + automake + autoconf + autoheader + aclocal + libtoolize + pkg-config [at least version 0.16] + gtk-doc (recommended) + +Hopefully your platform of choice has packages readily available so +that you can easily install things with your system's package +management tool, (such as "apt-get install automake" on Debian or "yum +install automake" on Fedora, etc.). Note that Mac OS X ships with +glibtoolize instead of libtoolize. + +Once you have all of those packages installed, the next step is to run +the autogen.sh script. That can be as simple as: + + ./autogen.sh + +But before you run that command, note that the autogen.sh script +accepts all the same arguments as the configure script, (and in fact, +will generate the configure script and run it with the arguments you +provide). So go back up to step (1) above and see what additional +arguments you might want to pass, (such as prefix). Then continue with +the instructions, simply using ./autogen.sh in place of ./configure. + +Happy hacking! diff --git a/KNOWN_ISSUES b/KNOWN_ISSUES new file mode 100644 index 000000000..c367f918e --- /dev/null +++ b/KNOWN_ISSUES @@ -0,0 +1,3 @@ +Known Issues +------------ +None diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 000000000..03fa35236 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,83 @@ +include $(top_srcdir)/build/Makefile.am.common + +EXTRA_DIST += \ + KNOWN_ISSUES \ + README.win32 \ + Makefile.win32 \ + build/Makefile.win32.common \ + build/Makefile.win32.inform \ + build/Makefile.win32.features \ + build/Makefile.win32.features-h \ + $(NULL) +#MAINTAINERCLEANFILES += \ +# $(srcdir)/build/Makefile.win32.features \ +# $(srcdir)/build/Makefile.win32.features-h \ +# $(NULL) + +ACLOCAL_AMFLAGS = -I build ${ACLOCAL_FLAGS} + +DIST_SUBDIRS = src doc util boilerplate test perf +SUBDIRS = src doc util +# libpng is required for our test programs +if CAIRO_HAS_PNG_FUNCTIONS +SUBDIRS += boilerplate test perf +endif + +configure: cairo-version.h + +doc: + cd doc && $(MAKE) $(AM_MAKEFLAGS) $@ +test retest recheck: all + cd test && $(MAKE) $(AM_MAKEFLAGS) $@ +perf: all + cd perf && $(MAKE) $(AM_MAKEFLAGS) $@ +check-valgrind: all + cd test && $(MAKE) $(AM_MAKEFLAGS) check-valgrind + cd perf && $(MAKE) $(AM_MAKEFLAGS) check-valgrind +.PHONY: doc test retest recheck perf check-valgrind + + +EXTRA_DIST += \ + AUTHORS \ + BIBLIOGRAPHY \ + BUGS \ + CODING_STYLE \ + COPYING \ + COPYING-LGPL-2.1 \ + COPYING-MPL-1.1 \ + HACKING \ + INSTALL \ + NEWS \ + PORTING_GUIDE \ + README \ + RELEASING \ + autogen.sh \ + cairo-version.h \ + $(NULL) + +DISTCLEANFILES += config.cache + +MAINTAINERCLEANFILES += \ + $(srcdir)/aclocal.m4 \ + $(srcdir)/autoscan.log \ + $(srcdir)/build/compile \ + $(srcdir)/build/config.guess \ + $(srcdir)/build/config.sub \ + $(srcdir)/build/depcomp \ + $(srcdir)/build/install-sh \ + $(srcdir)/build/ltmain.sh \ + $(srcdir)/build/missing \ + $(srcdir)/build/mkinstalldirs \ + $(srcdir)/config.h.in \ + $(srcdir)/configure.scan \ + $(NULL) + +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-gtk-doc \ + --enable-test-surfaces \ + --enable-full-testing \ + $(NULL) + +include $(srcdir)/build/Makefile.am.changelog +include $(srcdir)/build/Makefile.am.releasing +include $(srcdir)/build/Makefile.am.analysis diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 000000000..5ceb0f886 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1742 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Creating ChangeLog files from git log: + +# We always create a ChangeLog that contains the most recent changes, and +# multiple others for changes between major releases (other than the last such +# segment that we put in 'ChangeLog'. The old ones are named +# ChangeLog.pre-X.Y where X.Y is the version number of the major release. + +# Some custom targets to make it easier to release things. +# +# To make real stable releases or devel snapshots, use either: +# make release-check +# or make release-publish +# +# To make a quick properly named (date and git hash stamped) tarball: +# make snapshot +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(srcdir)/build/Makefile.am.changelog \ + $(srcdir)/build/Makefile.am.releasing \ + $(srcdir)/build/Makefile.am.analysis $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(srcdir)/config.h.in \ + $(top_srcdir)/src/cairo-uninstalled.pc.in \ + $(top_srcdir)/src/cairo-features-uninstalled.pc.in \ + $(top_srcdir)/build/test-driver AUTHORS COPYING ChangeLog \ + INSTALL NEWS README build/ar-lib build/compile \ + build/config.guess build/config.sub build/depcomp \ + build/install-sh build/missing build/ltmain.sh \ + $(top_srcdir)/build/ar-lib $(top_srcdir)/build/compile \ + $(top_srcdir)/build/config.guess \ + $(top_srcdir)/build/config.sub $(top_srcdir)/build/install-sh \ + $(top_srcdir)/build/ltmain.sh $(top_srcdir)/build/missing +EXTRA_PROGRAMS = +TESTS = +check_PROGRAMS = +# libpng is required for our test programs +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_1 = boilerplate test perf +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = cairo-uninstalled.pc cairo-xlib-uninstalled.pc \ + cairo-xlib-xrender-uninstalled.pc cairo-xcb-uninstalled.pc \ + cairo-xlib-xcb-uninstalled.pc cairo-xcb-shm-uninstalled.pc \ + cairo-qt-uninstalled.pc cairo-quartz-uninstalled.pc \ + cairo-quartz-font-uninstalled.pc \ + cairo-quartz-image-uninstalled.pc cairo-win32-uninstalled.pc \ + cairo-win32-font-uninstalled.pc cairo-skia-uninstalled.pc \ + cairo-os2-uninstalled.pc cairo-beos-uninstalled.pc \ + cairo-drm-uninstalled.pc cairo-gallium-uninstalled.pc \ + cairo-png-uninstalled.pc cairo-gl-uninstalled.pc \ + cairo-glesv2-uninstalled.pc cairo-cogl-uninstalled.pc \ + cairo-directfb-uninstalled.pc cairo-vg-uninstalled.pc \ + cairo-egl-uninstalled.pc cairo-glx-uninstalled.pc \ + cairo-wgl-uninstalled.pc cairo-script-uninstalled.pc \ + cairo-ft-uninstalled.pc cairo-fc-uninstalled.pc \ + cairo-ps-uninstalled.pc cairo-pdf-uninstalled.pc \ + cairo-svg-uninstalled.pc cairo-tee-uninstalled.pc \ + cairo-xml-uninstalled.pc cairo-gobject-uninstalled.pc +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope check recheck distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +GZIP_ENV = --best +DIST_ARCHIVES = $(distdir).tar.xz +DIST_TARGETS = dist-xz +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) +DISTCLEANFILES = $(BUILT_SOURCES) config.cache \ + $(srcdir)/ChangeLog.cache-* ChangeLog.cache-* +EXTRA_DIST = KNOWN_ISSUES README.win32 Makefile.win32 \ + build/Makefile.win32.common build/Makefile.win32.inform \ + build/Makefile.win32.features build/Makefile.win32.features-h \ + $(NULL) AUTHORS BIBLIOGRAPHY BUGS CODING_STYLE COPYING \ + COPYING-LGPL-2.1 COPYING-MPL-1.1 HACKING INSTALL NEWS \ + PORTING_GUIDE README RELEASING autogen.sh cairo-version.h \ + $(NULL) +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in $(srcdir)/aclocal.m4 \ + $(srcdir)/autoscan.log $(srcdir)/build/compile \ + $(srcdir)/build/config.guess $(srcdir)/build/config.sub \ + $(srcdir)/build/depcomp $(srcdir)/build/install-sh \ + $(srcdir)/build/ltmain.sh $(srcdir)/build/missing \ + $(srcdir)/build/mkinstalldirs $(srcdir)/config.h.in \ + $(srcdir)/configure.scan $(NULL) $(srcdir)/ChangeLog \ + $(srcdir)/ChangeLog.pre-* +#MAINTAINERCLEANFILES += \ +# $(srcdir)/build/Makefile.win32.features \ +# $(srcdir)/build/Makefile.win32.features-h \ +# $(NULL) +ACLOCAL_AMFLAGS = -I build ${ACLOCAL_FLAGS} +DIST_SUBDIRS = src doc util boilerplate test perf +SUBDIRS = src doc util $(am__append_1) +DISTCHECK_CONFIGURE_FLAGS = \ + --enable-gtk-doc \ + --enable-test-surfaces \ + --enable-full-testing \ + $(NULL) + +CURR_CHANGELOG_VERSION = $(CAIRO_VERSION_MAJOR).$$(echo "($(CAIRO_VERSION_MINOR)+1)/2*2" | bc) +# examines $version +PREV_CHANGELOG_VERSION = $$(if test "x$$(echo "($$version-0.1)*2/2"|bc)" = "x$$(echo "$$version*2/2"|bc)"; \ + then echo "$$version-$$(echo "$$version" | sed 's/[0-9]/0/g;s/[0-9]$$/2/')"; \ + else echo "$$version-1.0"; \ + fi | bc | sed 's/[.]0*/./;s/^0[.]\?$$/initial/;s/[.]$$/.0/') + +CHANGELOGS = ChangeLog \ + `version=$(CURR_CHANGELOG_VERSION); \ + version=$(PREV_CHANGELOG_VERSION); \ + while test "x$$version" != xinitial; do \ + echo ChangeLog.pre-$$version; \ + version=$(PREV_CHANGELOG_VERSION); \ + done` + +TAR_OPTIONS = --owner=0 --group=0 +RELEASE_OR_SNAPSHOT = $$(if test "x$(CAIRO_VERSION_MINOR)" = "x$$(echo "$(CAIRO_VERSION_MINOR)/2*2" | bc)" ; then echo release; else echo snapshot; fi) +RELEASE_UPLOAD_HOST = cairographics.org +RELEASE_UPLOAD_BASE = /srv/cairo.freedesktop.org/www +RELEASE_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE)/$(RELEASE_OR_SNAPSHOT)s +RELEASE_URL_BASE = http://cairographics.org/$(RELEASE_OR_SNAPSHOT)s +RELEASE_ANNOUNCE_LIST = cairo-announce@cairographics.org (and CC gnome-announce-list@gnome.org) +MANUAL_VERSIONED = manual-$(VERSION) +MANUAL_TAR_FILE = $(MANUAL_VERSIONED).tar.gz +MANUAL_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE) +tar_file = $(PACKAGE)-$(VERSION).tar.xz +sha1_file = $(tar_file).sha1 +gpg_file = $(sha1_file).asc + +# Win32 package zipfiles +@OS_WIN32_TRUE@runtime_zip_file = $(PACKAGE)-$(VERSION).zip +@OS_WIN32_TRUE@developer_zip_file = $(PACKAGE)-dev-$(VERSION).zip +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .log .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(srcdir)/build/Makefile.am.changelog $(srcdir)/build/Makefile.am.releasing $(srcdir)/build/Makefile.am.analysis $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(srcdir)/build/Makefile.am.changelog $(srcdir)/build/Makefile.am.releasing $(srcdir)/build/Makefile.am.analysis: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +cairo-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-xlib-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-xlib-xrender-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-xcb-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-xlib-xcb-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-xcb-shm-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-qt-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-quartz-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-quartz-font-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-quartz-image-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-win32-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-win32-font-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-skia-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-os2-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-beos-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-drm-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-gallium-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-png-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-gl-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-glesv2-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-cogl-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-directfb-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-vg-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-egl-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-glx-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-wgl-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-script-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-ft-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-fc-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-ps-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-pdf-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-svg-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-tee-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-xml-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cairo-gobject-uninstalled.pc: $(top_builddir)/config.status $(top_srcdir)/src/cairo-features-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile config.h +installdirs: installdirs-recursive +installdirs-am: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +@CAIRO_HAS_LCOV_FALSE@html-local: +clean: clean-recursive + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: html-local + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-cscope clean-generic clean-libtool \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-local distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am html-local info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + + +configure: cairo-version.h + +doc: + cd doc && $(MAKE) $(AM_MAKEFLAGS) $@ +test retest recheck: all + cd test && $(MAKE) $(AM_MAKEFLAGS) $@ +perf: all + cd perf && $(MAKE) $(AM_MAKEFLAGS) $@ +check-valgrind: all + cd test && $(MAKE) $(AM_MAKEFLAGS) check-valgrind + cd perf && $(MAKE) $(AM_MAKEFLAGS) check-valgrind +.PHONY: doc test retest recheck perf check-valgrind + +changelogs: + @$(MAKE) $(AM_MAKEFLAGS) $(CHANGELOGS) + +dist-hook: changelogs + changelogs="$(CHANGELOGS)"; \ + for changelog in $$changelogs; do \ + cp $(srcdir)/$$changelog $(distdir)/ 2>/dev/null || \ + cp $$changelog $(distdir)/; \ + done + +$(srcdir)/ChangeLog: + @if test -d "$(srcdir)/.git"; then \ + version=$(CURR_CHANGELOG_VERSION); \ + prev=$(PREV_CHANGELOG_VERSION).0; \ + nearest_tag=`git describe | sed 's/-.*//'`; \ + before=$(srcdir)/ChangeLog.cache-$$prev..$$nearest_tag; \ + after=$(srcdir)/ChangeLog.cache-$$nearest_tag..; \ + $(MAKE) $(AM_MAKEFLAGS) $$before $$after && \ + echo Creating $@ && \ + { echo '# Generated by configure. Do not edit.'; echo; \ + cat $$after; echo; cat $$before; } > $@; \ + else \ + test -f $@ || \ + (echo A git checkout is required to generate $@ >&2 && \ + echo A git checkout is required to generate this file >> $@); \ + fi + +ChangeLog.cache-*..: .git + +ChangeLog%: $(srcdir)/ChangeLog% + +$(srcdir)/ChangeLog.cache-% $(srcdir)/ChangeLog.pre-%: + @echo Creating $@ + @if test -d "$(srcdir)/.git"; then \ + (cd "$(srcdir)" && \ + version=$$(echo "$@" | sed 's/.*ChangeLog\([.].*-\)\?//'); \ + if echo "$@" | grep -q '^ChangeLog[.]cache'; then \ + spec=$$version; \ + else \ + to=$$version; \ + test "x$$version" = x && version=$(CURR_CHANGELOG_VERSION); \ + from=$(PREV_CHANGELOG_VERSION); \ + test "x$$to" = x || to=$$to.0; \ + test "x$$from" = xinitial || from=$$from.0; \ + spec=$$from..$$to; \ + fi; \ + $(top_srcdir)/build/missing --run git log --stat "$$spec") > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate $@, your $@ may be outdated >&2); \ + else \ + echo A git checkout is required to generate $@ >&2; \ + fi + +.PHONY: changelogs ChangeLog $(srcdir)/ChangeLog + +dist-hook: dist-clear-sticky-bits + +# Clean up any sticky bits we may inherit from parent dir +dist-clear-sticky-bits: + chmod -R a-s $(distdir) + +snapshot: + distdir="$(distdir)-`date '+%Y%m%d'`"; \ + test -d "$(srcdir)/.git" && distdir=$$distdir-`cd "$(srcdir)" && git rev-parse HEAD | cut -c 1-6`; \ + TAR_OPTIONS="$(TAR_OPTIONS)" $(MAKE) $(AM_MAKEFLAGS) distdir="$$distdir" snapshot-dist + +snapshot-dist: dist + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' + +$(sha1_file): $(tar_file) + sha1sum $^ > $@ + +$(gpg_file): $(sha1_file) + @echo "Please enter your GPG password to sign the checksum." + gpg --armor --sign $^ + +release-verify-sane-changelogs: changelogs + @echo -n "Checking that the ChangeLog files are sane..." + @if grep -q "is required to generate" $(CHANGELOGS); then \ + (echo "Ouch." && echo "Some of the ChangeLogs are not generated correctly." \ + && echo "Remove ChangeLog* and make changelogs" \ + && false); else :; fi + @echo "Good." + +release-verify-sane-tests: + @echo "Checking that the test suite is sane..." + @cd test && $(MAKE) $(AM_MAKEFLAGS) release-verify-sane-tests + +release-verify-even-micro: + @echo -n "Checking that $(VERSION) has an even micro component..." + @test "$(CAIRO_VERSION_MICRO)" = "`echo $(CAIRO_VERSION_MICRO)/2*2 | bc`" \ + || (echo "Ouch." && echo "The version micro component '$(CAIRO_VERSION_MICRO)' is not an even number." \ + && echo "The version in configure.in must be incremented before a new release." \ + && false) + @echo "Good." + +release-verify-newer: + @echo -n "Checking that no $(VERSION) release already exists..." + @ssh $(RELEASE_UPLOAD_HOST) test ! -e $(RELEASE_UPLOAD_DIR)/$(tar_file) \ + || (echo "Ouch." && echo "Found: $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR)/$(tar_file)" \ + && echo "Are you sure you have an updated checkout?" \ + && echo "This should never happen." \ + && false) + @echo "Good." + +release-remove-old: + $(RM) $(tar_file) $(sha1_file) $(gpg_file) + +# Strict ordering enforced for parallel make to work +release-check: \ + release-verify-even-micro \ + release-verify-sane-changelogs \ + release-verify-sane-tests \ + release-verify-newer \ + $(NULL) + $(MAKE) $(AM_MAKEFLAGS) release-remove-old + TAR_OPTIONS="$(TAR_OPTIONS)" $(MAKE) $(AM_MAKEFLAGS) distcheck + +release-upload: $(tar_file) $(sha1_file) $(gpg_file) + mkdir -p releases + scp $(tar_file) $(sha1_file) $(gpg_file) $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR) + mv $(tar_file) $(sha1_file) $(gpg_file) releases + ssh $(RELEASE_UPLOAD_HOST) "rm -f $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(tar_file) $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-$(VERSION)" + git tag -s -m "cairo $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) release" $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) + +release-publish-message: releases/$(sha1_file) + @echo "Please follow the instructions in RELEASING to push stuff out and" + @echo "send out the announcement mails. Here is the excerpt you need:" + @echo "" + @echo "Subject: $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) now available" + @echo "" + @echo "============================== CUT HERE ==============================" + @echo "A new $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) is now available from:" + @echo "" + @echo " $(RELEASE_URL_BASE)/$(tar_file)" + @echo "" + @echo " which can be verified with:" + @echo "" + @echo " $(RELEASE_URL_BASE)/$(sha1_file)" + @echo -n " " + @cat releases/$(sha1_file) + @echo "" + @echo " $(RELEASE_URL_BASE)/$(gpg_file)" + @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" + @echo "" + @echo " Additionally, a git clone of the source tree:" + @echo "" + @echo " git clone git://git.cairographics.org/git/cairo" + @echo "" + @echo " will include a signed $(VERSION) tag which points to a commit named:" + @echo " `git cat-file tag $(VERSION) | grep ^object | sed -e 's,object ,,'`" + @echo "" + @echo " which can be verified with:" + @echo " git verify-tag $(VERSION)" + @echo "" + @echo " and can be checked out with a command such as:" + @echo " git checkout -b build $(VERSION)" + @echo "" + @echo "============================== CUT HERE ==============================" + +doc-publish-versioned: doc + rm -rf ./$(MANUAL_VERSIONED) + cp -a doc/public/html $(MANUAL_VERSIONED) + tar czf $(MANUAL_TAR_FILE) $(MANUAL_VERSIONED) + scp $(MANUAL_TAR_FILE) $(RELEASE_UPLOAD_HOST):$(MANUAL_UPLOAD_DIR) + ssh $(RELEASE_UPLOAD_HOST) "cd $(MANUAL_UPLOAD_DIR) && tar xzf $(MANUAL_TAR_FILE) && ln -sf $(MANUAL_TAR_FILE) cairo-$(MANUAL_TAR_FILE)" + +doc-publish-symlinks: + ssh $(RELEASE_UPLOAD_HOST) "cd $(MANUAL_UPLOAD_DIR) && rm -f manual && ln -s $(MANUAL_VERSIONED) manual && ln -sf $(MANUAL_TAR_FILE) cairo-manual.tar.gz" + +doc-publish: + $(MAKE) $(AM_MAKEFLAGS) doc-publish-versioned + @if test "$(RELEASE_OR_SNAPSHOT)" = release; then $(MAKE) $(AM_MAKEFLAGS) doc-publish-symlinks; fi + +# Strict ordering enforced for parallel make to work +release-publish: release-check + $(MAKE) $(AM_MAKEFLAGS) release-upload + $(MAKE) $(AM_MAKEFLAGS) doc-publish + $(MAKE) $(AM_MAKEFLAGS) release-publish-message + +@OS_WIN32_TRUE@$(runtime_zip_file): install +@OS_WIN32_TRUE@ -$(RM) $@ +@OS_WIN32_TRUE@ pwd=`pwd`; cd $(prefix); \ +@OS_WIN32_TRUE@ zip "$$pwd"/$@ bin/libcairo-$(CAIRO_VERSION_SONUM).dll + +@OS_WIN32_TRUE@$(developer_zip_file): install +@OS_WIN32_TRUE@ -$(RM) $@ +@OS_WIN32_TRUE@ pwd=`pwd`; cd $(prefix); \ +@OS_WIN32_TRUE@ zip -r "$$pwd"/$@ include/cairo lib/libcairo.dll.a lib/cairo.lib lib/pkgconfig/cairo.pc lib/pkgconfig/cairo-*.pc share/gtk-doc/html/cairo + +@OS_WIN32_TRUE@zips: $(runtime_zip_file) $(developer_zip_file) + +.PHONY: \ + dist-clear-sticky-bits \ + doc-publish \ + doc-publish-symlinks \ + doc-publish-versioned \ + release-check \ + release-publish \ + release-publish-message \ + release-remove-old \ + release-upload \ + release-verify-even-micro \ + release-verify-newer \ + release-verify-sane-changelogs \ + release-verify-sane-tests \ + snapshot \ + snapshot-dist \ + $(NULL) +# use recursive makes in order to ignore errors during check/perf +@CAIRO_HAS_LCOV_TRUE@lcov: +@CAIRO_HAS_LCOV_TRUE@ -$(MAKE) $(AM_MAKEFLAGS) check +@CAIRO_HAS_LCOV_TRUE@ $(MAKE) $(AM_MAKEFLAGS) genlcov +@CAIRO_HAS_LCOV_TRUE@lcov-perf: +@CAIRO_HAS_LCOV_TRUE@ -$(MAKE) $(AM_MAKEFLAGS) perf +@CAIRO_HAS_LCOV_TRUE@ $(MAKE) $(AM_MAKEFLAGS) genlcov + +# we have to massage the lcov.info file slightly to hide the effect of libtool +# placing the objects files in the .libs/ directory separate from the *.c +@CAIRO_HAS_LCOV_TRUE@genlcov: +@CAIRO_HAS_LCOV_TRUE@ $(LTP) --directory $(top_builddir) --path $(top_builddir) --capture --output-file cairo-lcov.info --test-name CAIRO_TEST --no-checksum +@CAIRO_HAS_LCOV_TRUE@ $(SED) -e 's#.libs/##' \ +@CAIRO_HAS_LCOV_TRUE@ -e 's#boilerplate/src#src#' \ +@CAIRO_HAS_LCOV_TRUE@ -e 's#$(shell pwd)#$(shell cd $(top_srcdir) && pwd)#' \ +@CAIRO_HAS_LCOV_TRUE@ < cairo-lcov.info > cairo-lcov.info.tmp +@CAIRO_HAS_LCOV_TRUE@ LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory cairo-lcov --title "Cairo Code Coverage" --show-details cairo-lcov.info.tmp +@CAIRO_HAS_LCOV_TRUE@ $(RM) cairo-lcov.info.tmp + +@CAIRO_HAS_LCOV_TRUE@html-local: lcov +@CAIRO_HAS_LCOV_FALSE@lcov lcov-perf genlcov: +@CAIRO_HAS_LCOV_FALSE@ @echo You need to configure Cairo with support for gcov enabled. +@CAIRO_HAS_LCOV_FALSE@ @echo e.g, ./configure --enable-gcov + +lcov-clean: +@CAIRO_HAS_LCOV_TRUE@ -$(LTP) --directory $(top_builddir) -z + -$(RM) -r cairo-lcov.info cairo-lcov + -$(FIND) -name '*.gcda' -print | $(XARGS) $(RM) + +distclean-local: lcov-clean + +.PHONY: lcov lcov-perf genlcov lcov-clean + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Makefile.win32 b/Makefile.win32 new file mode 100644 index 000000000..fbad7f3e4 --- /dev/null +++ b/Makefile.win32 @@ -0,0 +1,24 @@ +default: all + +# Do not edit this file. +# Edit build/Makefile.win32.common for customization + +top_srcdir = . +include $(top_srcdir)/build/Makefile.win32.inform + +all: cairo + +cairo: inform + @$(MAKE) -C src -f Makefile.win32 + +perf: inform + @$(MAKE) -C perf -f Makefile.win32 perf + +test: inform + @$(MAKE) -C test -f Makefile.win32 test + +clean: + @$(MAKE) -C boilerplate -f Makefile.win32 clean + @$(MAKE) -C perf -f Makefile.win32 clean + @$(MAKE) -C src -f Makefile.win32 clean + @$(MAKE) -C test -f Makefile.win32 clean diff --git a/NEWS b/NEWS new file mode 100644 index 000000000..93b650ef5 --- /dev/null +++ b/NEWS @@ -0,0 +1,7366 @@ +Release 1.14.2 (2014-03-09 Bryce Harrington <bryce@osg.samsung.com>) +==================================================================== +This release provides collected bug fixes, along with one feature +enhancement for the xcb backend, and a small performance improvement for +fonts. + +The running theme of the bug fixes is platform-specific issues, both +build and run-time. Platforms with fixes include Sparc, AIX, Windows +(mingw), and Windows (MSVC8). Memory leaks, valgrind issues, and PDF +issues round out our list. + +It's come to light that changes in cairo 1.14 resulted in breakage on +MacOS X 10.4. We've not yet determined whether to fix up the support, +or excise the 10.4-specific code and support only OS X 10.5 or newer. +Meantime, we'll only advertise cairo as working on OS X 10.5. + +Features +-------- + * Improve xcb's handling of per-screen subpixel ordering. If no + Xft.rgba property is specified, default to the screen's subpixel + order. + +API Changes +----------- +None + +Dependency Changes +------------------ +None + +Performance Optimizations +------------------------- + * Improve performance of cpu_to_be32 and be32_to_cpu, making truetype + subsetting of large fonts run about 15% faster. + +Bug Fixes +--------- + * Fix unaligned access on sparc with the compact font format (CFF). + Unlike truetype, all data in CFF is not aligned. + (Debian bug #712836) + * Fix unaligned access on sparc with tor-scan-converter's memory pool. + * Fix crash when loading a PDF with a transformed image. + (fdo bug #85151) + * Fix regression on mingw for bigendian test due to removal of file + extension for executables. + (fdo bug #85120) + * Fix handling of backslash in PDF interpreter + (fdo bug #85662) + * Fix crash in xlib and xcb renderers when swapping a 0-sized glyph + * Fix bug with RTL text in PDF operators + (fdo bug #86461) + * Fix compilation 'cairo-path-stroke-traps.c' with MSVC8 + (fdo bug #84908) + * Fix crash in _fill_xrgb32_lerp_opaque_spans when a span length is + negative. + * Fix valgrind error by releasing pattern created by + cairo_pattern_create_rgb(). + * Fix valgrind errors when running cairo-test-suite. + * Fix memory leak in recording surface replays + (fdo bug #87898) + * Fix destruction of fonts in api-special-cases test. + (fdo bug #87567) + * Fix duplicated surface push on similar-image, preventing trivial GTK3 + program traces from being replayable, with an error message about + invalid values for the size of the input. + (fdo bug #73580) + * Fix crash when win32 surface's image size does not cover the entire + surface. + (fdo bug #53121) + * Fix crash due to obsolete CGFontGetGlyphPath call + (fdo bug #84324) + * Fix several build issues on AIX + (fdo bugs #89338, #89340, #89356, #89354) + * Fix various documentation warnings and errors + +Release 1.14.0 (2014-10-13 Bryce Harrington <bryce@osg.samsung.com>) +==================================================================== +Hard to believe it's been over a year since our last release, but it's +not for lack of activity. This release includes contributions of a wide +assortment of bug fixes, build system improvements, warnings cleanups, +codebase refactoring, test suite repairs, and static analysis work. + +This release is lighter on features (compared with 1.12.10) but includes +a highly demanded rehaul of our image downscaling functionality, which +solves a serious problem experienced by Inkscape users when shrinking +embedded bitmaps in SVG files. The new scaling algorithms are used by +the image backend and by other backends as needed for fallbacks. + + +Features +-------- + + Filtering improvements for the image backend, in particular + down-scaling of images produces filtered images that depend on all the + pixels of the source. When using the image backend you get the + following settings: + + CAIRO_FILTER_GOOD: uses a box filter for scales less than .75 in + either direction. For scales larger than this, the same filter as + CAIRO_FILTER_BILINEAR is used. + + CAIRO_FILTER_BEST: uses a Catmull-Rom filter always. When upscaling + more than 2x this will produce anti-aliased square pixels, similar + to OS/X. + + CAIRO_FILTER_GAUSSIAN: uses PIXMAN_FILTER_BEST, which in current + pixman is the same as BILINEAR. (This is subject to change in the + future). + + xlib and xcb also use the image fallback for GOOD/BEST filters, but + note that other backends do not implement these filtering fixes yet, + however other actions may cause them to use an image fallback which + will cause these filters to be used. + + Improve handling of device transformation and scaling, allowing Cairo + to now support scaling at a device level, permitting easier, more + transparent HiDPI support. + + Support JBIG2 mime data in PDF. This allows embedding of more + compressed JPEG formats within PDF, rather than including the full + uncompressed image. Also, reduce the number of transparency groups + used by PDF to keep the file size small and viewing/printing of the + PDF fast. + + Expand the embedding section to include stencil mask support. + + Reorder font declarations to be in natural order. + + Update the Skia backend to build against current Skia (as of June + 2014). + + Drop Link-Time Optimization (LTO) support from build system. This + seems to have caused much trouble for unclear benefit, and most + distros are reverting or disabling it anyway. + + Optimize VBO size on GL to 1M and to 16k for EGL. This improves + (theoretical) performance for desktop GLX use cases while avoiding + hitting VBO memory size limitations on embedded devices. + +API Changes +----------- + + cairo_surface_set_device_scale, cairo_surface_get_device_scale: + + Sets a scale that is multiplied to the device coordinates + determined by the CTM when drawing to @surface. One common use for + this is to render to very high resolution display devices at a scale + factor, so that code that assumes 1 pixel will be a certain size + will still work. + + cairo_egl_device_get_display, cairo_egl_device_get_context: + + Support get/set of EGLContext and EGLDisplay for egl-based cairo + devices, similar to GLX. + +Dependency Changes +------------------ + + Cairo now requires glib 2.14 for its gobject helper functions, + and pixman 0.30 for downscaling. + + +Bug fixes +--------- + + Don't embed CMYK Jpeg images in svg. + + Fix tests to place output in proper location. + + Fix determination of alpha for all surfaces when recording. + + Extend oversize check to cairo_gl_surface_create_for_texture, so an + error surface is returned if the texture is too large to render to. + + Fix embedding of mime data in PDF and PS files. + + Remove useless error handling in *_reply() functions in XCB. + + Fix a double-free exposed by multithreaded apps creating and + destroying the same font concurrently. + https://bugs.freedesktop.org/show_bug.cgi?id=69470 + + Fix corrupt stacks produced by bugs in operand emission for trace. + + Fix out of bounds array access in format cache for xlib + + Don't rename glyphs used by seac operator. This can cause certain + combined characters to use their decorations (e.g. umlauts on ö) to be + lost during printing of PDFs using evince. + https://bugs.freedesktop.org/show_bug.cgi?id=70364 + + Fix crash on calling cairo_create with a finished surface + + Fix SSIZE_T definition problem when making with MSYS on Windows7 + + Fix one off issue in gl context cleanup + + Fix usage of CAIRO_STACK_ARRAY_LENGTH + + Fix rectangle stroke with non rectilinear pen + + Fix imagemask with pattern source failure on some printers. This bug + could cause files converted using pdftops to fail for example on Ricoh + printers, or opening in Adobe Distiller on Windows. + https://bugs.freedesktop.org/show_bug.cgi?id=69485 + + Fix whitespace in font names + + Fix page size in generated PDFs. When printing using pdftocairo on + larger page sizes, such as 11x17, the image would be cropped to letter + size. + https://bugs.freedesktop.org/show_bug.cgi?id=73452 + + Fix path-currentpoint test by preserving current-point in + copy_path()/append_path() sequence + + Fix generation of HTML in code docs for + cairo-format-stride-for-width. Raw HTML code was being passed + to the browser, instead of displaying normally. + https://bugs.freedesktop.org/show_bug.cgi?id=63257 + + Fix spelling of "tessellator" throughout code. We're using the + American rather than British spelling of this word. + https://bugs.freedesktop.org/show_bug.cgi?id=50411 + + Fix crash in pixman_image_composite32 + + Fix crash when trying to modify a (const) all-clipped cairo_clip_t + https://bugs.freedesktop.org/show_bug.cgi?id=75819 + + Add check_composite method to all compositors, to fix crashes in the + test suite. + + Fix crash in Firefox when scrolling on certain pages. + + Fix memory leaks found by static analysis. + + Fix build of any2ppm if fork is not available. + + Fix broken build for Qt backend, due to missing libstdc++. + + Fix typo in two cairo_uint128 functions. Fixes potential build issues + on systems without a uint128 type. + + Fix build when --enable-pdf=no + + Fix cache_frozen assertions for Win32 print. + + Correctly check for xcb image surface for inplace upload + + Fix webkit-based web browser crashes due to empty boxes by skipping + over them when tesselating. + + Make pixman, libpng, and zlib paths commandline configurable for win32 + builds. + + Fix image scale on Win32 when GDI scale is not identity. + + Fix float endian configure test when using clang -O4 + + Fix compilation with Android bionic libc + + Don't try to build util/sphinx on Windows + + Fix loss of precision when emitting joins. This was caused by + discrepancies in line gradients when passing trapezoids around. + + Fix loss of precision and associated rendering issues in + cairo-tor-scan-converter from projection onto sample grid. + + Fix pixman oversampling of neighbouring edges within a cell by + eliminating self-intersections for the pixman traps compositor. + + Fix multi-line string splitting in PDFs + + Various cleanups and fixes to warnings, documentation, tests, and + build system. Improve error handling and return value checks. + Cleanup XFAIL tests and reference images. Cover recently added + functionality. + + +Release 1.12.16 (2013-08-21 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +Thanks to everybody who reported a bug and helped us develop a fix, +we have amassed quite a few bug fixes. There are still more outstanding +bugs that seek attention and a little bit of TLC, but this release has +been delayed long enough... + +Bug fixes +--------- + + Set the correct orientation for simple boxes with a negative scale + factor. + + Fix the creation of the shading dictionary in PDF. + + Fix a crash in PDF when incorporating an image with CAIRO_EXTEND_PAD. + https://bugs.freedesktop.org/show_bug.cgi?id=61451 + + Avoid upscaling bitmap fonts if possible. + + Fix an assertion failure within the mempool allocator for shared memory. + + Fix allocation size for CFF subsets. + + Export cairo_matrix_t for GObject bindings. + + Fix a double free in the Quartz backend. + https://bugs.freedesktop.org/show_bug.cgi?id=62885 + + Fix origin of GDI StretchBlits for the Windows backend + https://bugs.freedesktop.org/show_bug.cgi?id=61876 + + Fix error propagation for requests to create a similar surface with + negative size. + https://bugs.freedesktop.org/show_bug.cgi?id=63196 + + Fix complex clipping of trapezoids with regions + https://bugzilla.gnome.org/show_bug.cgi?id=697357 + + Stop leaking the image data when loading PNGs + + Fix unbounded operations with a clip mask through the span compositor + https://bugs.freedesktop.org/show_bug.cgi?id=61592 + + Add missing checks before rendering to a finished surface - so we return + an error rather than hit an assert. + https://bugs.freedesktop.org/show_bug.cgi?id=68014 + + Prevent an assertion failure when creating similar GL surfaces larger + than supported by hardware. + + Prevent a double free of a similar image under Windows. + https://bugs.freedesktop.org/show_bug.cgi?id=63787 + + +Release 1.12.14 (2013-02-10 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +In the last week we had a few more bugs reported and promptly resolved. +As these are a combination of regressions and stability issues, it is +time for a prompt update and release. Many thanks to everyone for +testing and reporting issues, and helping to make Cairo better. + +Bug fixes +--------- + + Prevent user callbacks accessing user-data during destroy to prevent + use-after-free bugs. + https://bugzilla.mozilla.org/show_bug.cgi?id=722975 + + Use standard names for glyphs in subset fonts (PDF). + https://bugs.freedesktop.org/show_bug.cgi?id=60248 + + Fix detection of Win98. The logic for detecting Win98 (and its broken + AlphaBlend()) was inverted, disabling AlphaBlend() for everyone. + + Prevent numeric overflow from extrapolating polygon edges to the clip + boundary and causing severe render artifacts. + https://bugs.freedesktop.org/show_bug.cgi?id=60489 + + Fix computation of glyph string coordinates when breaking up runs + for xlib. + + Fix an assertion in the win32 backend for failing to clear its + similar-images. + https://bugs.freedesktop.org/show_bug.cgi?id=60519 + + +Release 1.12.12 (2013-01-31 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +The goal of this release is to fix the synchronisation problems that +were exhibited in the SHM transport for cairo-xlib. This cropped up +any place that tried to rapidly push fresh pixel data to the X server +through an ordinary image surface, such as gimp-2.9 and evince. + +Bug fixes +--------- + + Avoid replacing the entire image when uploading subimages + https://bugs.freedesktop.org/show_bug.cgi?id=59635 + + Force synchronisation for scratch SHM image buffers, so that we do + not overwrite data as it is being read by X. + https://bugs.freedesktop.org/show_bug.cgi?id=59635 (also) + + Fix typos in detecting multisampling for the GL (MSAA) backend. + + Fix a memory leak in the GL (MSAA) backend. + + Fix a reference counting bug when mapping a GL surface to an image. + + +Release 1.12.10 (2013-01-16 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +A heap of bug fixes everywhere, and the gradual completion of the MSAA +backend for cairo-gl. Perhaps the most noteworthy set of the bugfixes +was the crusage lead by Behdad Eshfabod to make font handling by +pango/cairo/fontconfig fully threadsafe. This testing revealed a couple +of races that needed fixing in Cairo's scaled-font and glyph cache. + +Bug fixes +--------- + + Append coincident elements to the recording's surface bbtree so that + the list is not corrupted and the overlapping elements lost. + + Fix cairo-trace to correctly record map-to-image/unmap-image and then + replay them. + + Ignore MappingNotifies when running the XCB testsuite as they are sent + to all clients when the keyboard changes. The testsuite would detect + the unexpected event and complain. + + Handle very large images in the XCB backend. + + Fix a memory leak in the xlib/shm layer, and prevent use of the SHM + surfaces after the display is closed. + https://bugs.freedesktop.org/show_bug.cgi?id=58253 + + Handle resizing of bitmap fonts, in preparation for a fix to + fontconfig to correctly pass on the user request for scaling. + + Always include subroutine 4 (hint replacement idion) when subsetting + type 1 fonts in order to prevent a crash in cgpdftops on Mac OS/X + + Fix a couple of typos in the cairo-gobject.h header files for + introspection. + + Prevent a mutex deadlock when freeing a scaled-glyph containing a + recording-surface that itself references another scaled-glyph. + https://bugs.freedesktop.org/show_bug.cgi?id=54950 + + Make scaled-font cache actually thread-safe and prevent + use-after-frees. + + Restore support for older versions of XRender. A couple of typos and a + few forgotten chunks prevented the xlib compositor from running + correctly with XRender < 0.10. Note that there are still a few + regressions remaining. + + +Release 1.12.8 (2012-11-24 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +Another couple of weeks and a few more bugs have been found and fixed, +it is time to push the next point release. Many thanks to everyone who +reported their issues and helped us track down the bugs and helped +testing the fixes. + +Bug fixes +--------- + + Expand the sanity checking for broken combinations of XSendEvent and + ShmCompletionEvent. + + Notice that "The X.Org Foundation" sometimes also identifies itself + as "The Xorg Foundation". + + Handle various ages of libXext and its Shm headers. + + Fix the invalid clipping of the source drawable when using SHM + transport to upload images. + https://bugs.freedesktop.org/show_bug.cgi?id=56547 + + Handle all Type1 postscript operators for better font compatibility. + https://bugs.freedesktop.org/show_bug.cgi?id=56265 + + Fix a couple of memory leaks in Type1 font subsetting + https://bugs.freedesktop.org/show_bug.cgi?id=56566 + + Tighten the evaluation of the start/stop pen vertices, and catch a few + instances where we would use a fan instead of a bevel. + https://bugs.freedesktop.org/show_bug.cgi?id=56432 + + Fix assumption that geometric clipping always succeeds with the + span-compositor. + https://bugs.freedesktop.org/show_bug.cgi?id=56574 + + Fix call to spline intersection when evaluating whether a stoke is + visible. + + Remember to copy inferior sources when using SHM to readback the + surface for use as a source. + +Release 1.12.6 (2012-10-22 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +Thanks to everyone who download cairo-1.12.4 and gave us their feedback. +It truly was invaluable and has helped us to fix many portability issues +that crept in with some of the new features. This release aims to fix +those stability issues and run on a wider range of systems. + +Bug fixes +--------- + + Fix the recording surface to actually snapshot the source and so fix + PDF drawing. + + Calling XSendEvent with an XShmCompletionEvent is incompatabile with + older Xorg servers. + + Reorder CloseDisplay chain so that XShm is not reinstantiated after + shutdown, causing a potential crash if the Display was immediately + recreated using the same memory address. + + Make sure that the Xserver has attached to the SHM segment before + deleting it from the global namespace on systems that do not support + deferred deletion. + + Type1 subsetting support for PDF (and PS) was once again improved to + work with a larger number of PDF readers. + + GLESv2 build fixes and improved support for embedded GPUs. + + Tweak the invisible pen detection for applications that are currently + using too large values for geometric tolerance. + + A build fix for older freetype libraries. + + +Release 1.12.4 (2012-10-05 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +More bugs, and more importantly, more fixes. On the cairo-gl side, we +have refinements to the MSAA compositor which enables hardware +acceleration of comparitively low-quality antialiasing - which is useful +in animations and on very high density screens. For cairo-xlib, we have +finally enabled SHM transport for image transfers to and from the X +server. A long standing required feature, SHM transport offers a notable +reduction in rendering latency by reducing the number of copies +required to upload image data - given hardware and driver support, +cairo-xlib can now perform zero copy uploads onto the GPU. And as usual +Adrian Johnson has been very busy fixing many different corner cases in +cairo-pdf, impoving opacity groups and font subsetting. Last, but not +least, for cairo-image Søren Sandmann Pedersen added support for +rendering glyphs to pixman and using that from within cairo. The new +glyph rendering facility reduces the overhead for setting up the +compositing operation, improving glyph thoughput for the image backend +by a factor of about 4. And before he did so, he also fixed up a few +bugs in the existing glyph rendering code. So many thanks to Andrea +Canciani, Adrian Johnson, Chuanbo Weng, Dongyeon Kim, Henry Song, Martin +Robinson, Søren Sandmann Pedersen and Uli Schlachter for their +contributions, finding and fixing bugs. + +Bug fixes +--------- + + Interior boxes were being dropped when amalgamating regions during + tesselation. + https://bugs.freedesktop.org/show_bug.cgi?id=49446 + + Allow building without gtk-doc installed + + Invalid edge generation whilst reducing complex polygons. + https://bugs.freedesktop.org/show_bug.cgi?id=50852 + + Stroking around tight cusps + + Use locale correct formats for reading font subsetting and valid + buffers. + https://bugs.freedesktop.org/show_bug.cgi?id=51443 + + Ensure that the type1 subset includes all the glyph encodings + https://bugs.freedesktop.org/show_bug.cgi?id=53040 + + Upload the whole source for a repeating pattern. + https://bugs.freedesktop.org/show_bug.cgi?id=51910 + + Fix damage tracking to handle continuation chunks corectly and so + prevent crashes on win32. + https://bugs.freedesktop.org/show_bug.cgi?id=53384 + + Avoid emitting miter joins for degenerate line segments + https://bugzilla.mozilla.org/show_bug.cgi?id=407107 + + Convert the relative path semgents into the backend coordinates + and then back again to user coordinates (cairo_copy_path, + cairo_append_path) + https://bugs.freedesktop.org/show_bug.cgi?id=54732 + + Fix extents computations for a degenerate path consisting only of a + move-to + https://bugs.freedesktop.org/show_bug.cgi?id=54549 + + Prevent crashing on a degenerate project edge after polygon + intersection + https://bugs.freedesktop.org/show_bug.cgi?id=54822 + + + +Release 1.12.2 (2012-04-29 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +After such a long gestation period for the release of Cairo 1.12, we +inevitably accumulated a few bugs that were flushed out by broadening the +test base. Thanks to everybody who tried the release, apologies to any one +unfortunate enough to encounter a bug and many thanks for reporting it. As +a result Adrian Johnson, Alexandros Frantzis, Andrea Canciani, Kalev +Lember, Maarten Bosman, Marcus Meissner, Nis Martensen and Uli Schlachter +have squashed many more bugs and improved the documentation. I would +strongly recommend everyone to upgrade to cairo-1.12.2. +-Chris + +Bug fixes +--------- + + Allow applications to create 0x0 xlib surfaces, such as used by LibreOffice. + https://bugs.freedesktop.org/show_bug.cgi?id=49118 + + Trim composite extents for SOURCE/CLEAR operators to the mask. + + Use fallback fonts in PDF for unhandled computed glyph widths + https://bugs.freedesktop.org/show_bug.cgi?id=48349 + + Handle snapshots of recording surfaces for analysing pattern extents. + Fixes a regression of reporting the PDF bounding box as being the page size. + + Fix allocation size for PDF pattern ids. + Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49089 + + Fix emission of rectilinear dashed segments, with and without scaling, and + application of degenerate line joins. + + Clamp unbounded fixup polygons to the clip extents. + + Prevent infinite loop due to rounding errors whilst incrementing along dashes. + + Prevent overflow for inline a8 span filling. + + Miscellaneous build fixes for Cygwin on Windows and Solaris. + +Release 1.12.0 (2012-03-23 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +It's taken over 18 months, but the wait is finally over. A new cairo release! +We are pleased to annouce a new stable release of Cairo that brings many +new features and performance improvements, all whilst maintaining +compatibility with cairo-1.0 and all releases since. We recommend anyone +using a previous release of Cairo to upgrade to 1.12.0. + +The major feature of this release is the introduction of a new procedural +pattern; the mesh gradient. This, albeit complex, gradient is constructed +from a set of cubic Bezier patches and is a superset of all other gradient +surfaces which allows for the construction of incredibily detailed patterns. +In PDF parlance, the mesh gradient corresponds with type 7 patterns. Many +thanks to Andrea Canciani for bringing this to Cairo, and for his work on +making gradient handling robust. + +Not content with just adding another procedural pattern, Cairo 1.12 also +adds new API to create a callback pattern, +cairo_pattern_create_raster_source, that allows the application to +provide the pixel data for the region of interest at the time of +rendering. This can be used for instance, by an application to decode +compressed images on demand and to keep a cache of those decompressed +images, independently of Cairo. When combined with the recording +surface, it should form a useful basis for a deferred renderer. + +With the release of cairo-1.12, we also introduce a new supported +backend for interoperating with X using XCB. Uli Schlachter, also +maintainer of awesome and contributor to libxcb, has volunteered to +maintain cairo-xcb for us. Thanks Uli! + +For cairo-1.12, we have also added some common API to address any +surface as an image and so allow direct modification of the raster data. +Previously, only the Quartz and Win32 backends supported a very narrow +interface to allow for efficient pixel upload. Now with +cairo_surface_create_similar_image, cairo_surface_map_to_image, and +cairo_surface_unmap_image, Cairo exports a consistent method for +treating those surfaces as an image and so allow modification inplace. +These are the same routines used internally, and should support +efficient transfer or direct mapping of the target surfaces as +applicable. + +Another focus over the past year has been to address many performance +issues, without sacrificing the composition model. To accomplish the +goal, once again the rasterisation pipeline was overhauled and made +explicit, giving the backends the freedom to implement their own +specific pipeline whilst also providing a library of common routines +from which to build the pipeline. For instance, this allows the image +backend and the gl backend to composite scan line primitives inplace, +and to then implement custom fallbacks to catch the corner cases that do +not map onto their fastest paths. Similarly, this allows for the Xlib +backend to implement trapezoidation without compromising the other +backends, yet still allow for the pipeline to be used elsewhere for +testing and fallbacks. Clipping was once again overhauled, so that the +common cases for the raster pipelines could be captured and processed +with fast paths with the emphasis on performing geometric clipping to +reduce the frequency of using multi-pass clipmasks. Stroking was made +faster, both by providing specialised fast-paths for simple, yet frequent, +cases (such as stroking around a rectangle) and by reducing the number +of edges generated by the general stroker. + +As part of the focus on performance, Cairo 1.12 introduces some +antialias hints (NONE, FAST, GOOD, BEST) that are interpolated by the +rasterisers to fine tune their performance versus quality. Cairo 1.12 +also introduces a new observation architecture, +cairo_surface_observer_t, which can be used to analyse the amount of +time consumed by drawing commands and help identify inefficiencies in +both Cairo and the application. + +Last, but by no means least, the OpenGL backend has seen significant +work including the port to GLESv2 and the exploitation of advanced +hardware features. Interesting times. + +As always, I would like to thank everyone who contributed to Cairo, +not only through writing code, but also submitting documentation, bug +reports, suggestions and generally having fun with Cairo! In particular +though this release could not have happened without the efforts of +Adrian Johnson, Alexandros Frantiz, Andrea Canicani, Martin Robinson, +Nis Martensen, and Uli Schlachter. Thanks. +-Chris + +Snapshot 1.11.4 (2012-13-12) +============================ +The cairo community is pleased to finally announce the long aniticpated +release candidate for 1.12, 1.11.4, of the cairo graphics library. This +is the first major update to cairo in over a year and brings a large +number of new features; undoubtably a few bugs as well. + +While many people have contributed and have helped to test the release, +providing feedback on 1.10 and suggesting improvements, this release +is the result of a few persevering souls who deserve recognition for their +outstanding contributions: Andrea Canciani (all round bug fixing, +performance tuning and master of the gradients), Adrian Johnson (PDF +supremo) and Uli Schlachter (who stepped forward as maintainer for the +XCB backend). + +Major additions since 1.11.2: + + * cairo_surface_map_to_image API for pixel level access to any surface + + * New antialias hints to control the trade-off between speed and quality + + * A callback pattern, cairo_pattern_create_raster_source, for lazy + decoding of image data. + + * cairo_surface_observer_t, a new type of surface to gather performance + statistics + + * XCB as a supported backend + + * A rewritten compositor pipeline for performance improvements for, but not + limited to, the xlib and image backends. + From ION and PineView through to SandyBridge, every machine I have shows + across the board performance improvement on the cairo-traces: + + i5-2520m gnome-system-monitor: 5.97x speedup + pnv gnome-system-monitor: 4.86x speedup + i5-2520m firefox-asteroids: 4.66x speedup + pnv firefox-asteroids: 4.43x speedup + image firefox-canvas: 3.82x speedup + i5-2520m firefox-canvas-alpha: 3.49x speedup + image firefox-asteroids: 2.87x speedup + pnv firefox-talos-svg: 2.83x speedup + ion grads-heat-map: 2.75x speedup + pnv firefox-canvas-alpha: 2.66x speedup + image gnome-system-monitor: 2.66x speedup + image swfdec-giant-steps: 2.46x speedup + image firefox-canvas-alpha: 2.14x speedup + i5-2520m firefox-talos-svg: 2.03x speedup + image grads-heat-map: 2.02x speedup + ion gnome-system-monitor: 2.00x speedup + pnv firefox-particles: 1.99x speedup + i5-2520m grads-heat-map: 1.96x speedup + pnv firefox-canvas: 1.92x speedup + ion firefox-particles: 1.80x speedup + image poppler-reseau: 1.77x speedup + pnv xfce4-terminal-a1: 1.72x speedup + image firefox-talos-svg: 1.65x speedup + pnv grads-heat-map: 1.63x speedup + i5-2520m firefox-canvas: 1.63x speedup + pnv swfdec-youtube: 1.62x speedup + image ocitysmap: 1.59x speedup + i5-2520m firefox-fishbowl: 1.56x speedup + i5-2520m poppler-reseau: 1.50x speedup + i5-2520m evolution: 1.50x speedup + i5-2520m midori-zoomed: 1.43x speedup + pnv firefox-planet-gnome: 1.42x speedup + i5-2520m firefox-talos-gfx: 1.41x speedup + i5-2520m gvim: 1.41x speedup + pnv ocitysmap: 1.37x speedup + image poppler: 1.31x speedup + ion firefox-canvas-alpha: 1.35x speedup + ion firefox-talos-svg: 1.34x speedup + i5-2520m ocitysmap: 1.32x speedup + pnv poppler-reseau: 1.31x speedup + i5-2520m firefox-planet-gnome: 1.31x speedup + pnv firefox-fishbowl: 1.30x speedup + pnv evolution: 1.28x speedup + image gvim: 1.27x speedup + i5-2520m swfdec-youtube: 1.25x speedup + pnv gnome-terminal-vim: 1.27x speedup + pnv gvim: 1.25x speedup + image firefox-planet-gnome: 1.25x speedup + image swfdec-youtube: 1.25x speedup + ... + +And a plethora of minor improvements everywhere! +-Chris + +Snapshot 1.11.2 (2011-01-23) +=========================== + +In this first snapshot along the way to cairo-1.12.0, we are very excited +to announce the introduction of Bezier surface gradients, known as type +6/7 gradients in PS/PDF parlance. This is the culmination of much work by +the dynamic duo: Adrian Johnson and Andrea Canciani. Thanks guys! + +Also, I want to warmly welcome Uli Schlachter who recently joined the +Cairo community on a mission. That mission is to make cairo-xcb a +supported backend for 1.12. And for this snapshot he has made great +strides in fixing all the bugs I had left behind. Thanks Uli! + +And we have also seen a new contributor, Alexandros Frantzis, who has +begun bringing up cairo-gl for GLESv2 devices. Thanks Alex! + +And lastly, I must also thank Adrian and Andrea for the vast numbers of +bugs that they have tackled between them, fixing all those little corner +cases that lie hidden until too late. + +API additions: + +The ability to construct piece-wise Bezier surface gradients: + + cairo_pattern_create_mesh + + constructs a pattern of type CAIRO_PATTERN_TYPE_MESH using + + cairo_pattern_mesh_begin_patch + cairo_pattern_mesh_end_patch + cairo_pattern_mesh_curve_to + cairo_pattern_mesh_line_to + cairo_pattern_mesh_move_to + cairo_pattern_mesh_set_control_point + cairo_pattern_mesh_set_corner_color_rgb + cairo_pattern_mesh_set_corner_color_rgba + cairo_pattern_mesh_get_patch_count + cairo_pattern_mesh_get_path + cairo_pattern_mesh_get_corner_color_rgba + cairo_pattern_mesh_get_control_point + +The introduction of a unique ID accessible via the mime data type: + CAIRO_MIME_TYPE_UNIQUE_ID + + + + + +Release 1.10.2 (2010-12-25 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +The cairo community is pleased to announce the 1.10.2 release of the +cairo graphics library. This is the first update to cairo's stable 1.10 +series and contains a large number of bug fixes. + +While many people have contributed and have help to test the release, +2 people deserve special recognition for their efforts in tracking down +and fixing bugs, Andrea Canciani and Adrian Johnson. Thanks to their +tremendous efforts, and of all cairo contributors, it is much +appreciated. + +We recommend everyone upgrade to cairo 1.10.2 and hope that everyone +will continue to have lots of fun with cairo! + +-Chris + +Bug fixes +--------- + + Fix embedding of grayscale jpegs in PS. + https://bugs.freedesktop.org/show_bug.cgi?id=31632 + + Fix the reported path of extents containing a curve. + + Fix the compositing of unaligned boxes. + + Reset the clipper in PDF upon finish. + + Fix degenerates arcs to become a degenerate line. + + Build support for autoconf 2.67 + + Fix painting of transformed patterns in PS + + Fix the EPS bounding box for PS + https://bugs.freedesktop.org/show_bug.cgi?id=24688 + + Fix the missing content for EPS + https://bugs.freedesktop.org/show_bug.cgi?id=24688 + + Fix regression upon changing page size in PS/PDF + https://bugs.freedesktop.org/show_bug.cgi?id=24691 + + Only use ActualText with PDF-1.5 documents + + Fix the bbox for type1 fallbacks. + + Reset the color after ending the context in PDF + https://bugs.freedesktop.org/show_bug.cgi?id=31140 + + Fix the advance of subsetted type1 fonts + https://bugs.freedesktop.org/show_bug.cgi?id=31062 + + Fix handling of EXTEND_NONE gradients for PDF + + Restrict in-place optimisation for a8 image masks with SOURCE + + +Release 1.10.0 (2010-09-06 Chris Wilson <chris@chris-wilson.co.uk>) +=================================================================== +The cairo community is astounded (and flabbergast) to finally announce +the 1.10.0 release of the cairo graphics library. This is a major update +to cairo, with new features and enhanced functionality which maintains +compatibility for applications written using any previous major cairo +release, (1.8, 1.6, 1.4, 1.2, or 1.0). We recommend that anybody using +a previous version of cairo upgrade to cairo 1.10.0. + +One of the more interesting departures for cairo for this release is the +inclusion of a tracing utility, cairo-trace. cairo-trace generates a +human-readable, replayable, compact representation of the sequences of +drawing commands made by an application. This can be used to inspecting +applications to understand issues and as a means for profiling +real-world usage of cairo. + +The traces generated by cairo-trace have been collected in + + git://git.cairographics.org/git/cairo-traces + +and have driven the performance tuning of cairo over the last couple of +years. In particular, the image backend is much faster with a new +polygon rasterisation and a complete overhaul of the tessellator. Not +only is this faster, but also eliminates visual artifacts from +self-intersecting strokes. Not only has cairo-trace been driving +performance improvements within cairo, but as a repeatable means of +driving complex graphics it has been used to tune OpenGL, DDX, and +pixman. + +Cairo's API has been extended to better support printing, notably +through the ability to include a single compressed representation of an +image for patterns used throughout a document, leading to dramatic file +size reductions. Also the meta-surface used to record the vector +commands compromising a drawing sequence is now exposed as a +CAIRO_SURFACE_TYPE_RECORDING, along with a new surface that is a child of a +larger surface, CAIRO_SURFACE_TYPE_SUBSURFACE. One typical usage of a +subsurface would be as a source glyph in a texture atlas, or as a +restricted subwindow within a canvas. + +Cairo's API has also resurrected the RGB16 format from the past as +the prevalence of 16-bit framebuffers has not diminished and is a +fore-taste of the extended format support we anticipate in the future. +Increasing cairo's utility, we introduce the cairo_region_t for handling +sets of pixel aligned rectangles commonly used in graphics applications. +This is a merger of the GdkRegion and the pixman_region_t, hopefully +providing the utility of the former with the speed of the latter. + +Furthermore cairo has been reworked to interoperate more closely with +various acceleration architectures, gaining the ability to share +those hardware resources through the new cairo_device_t. For instance, +with the new OpenGL backend that supersedes the Glitz backend, hardware +and rendering operations can be shared between a classic OpenGL +application mixing libVA for the hardware assisted video decode with +cairo for high quality overlays all within the same OpenGL canvas. + +Many thanks for the hard work of Adrian Johnson, Andrea Canciani, Behdad +Esfahbod, Benjamin Otte, Carl Worth, Carlos Garcia Campos, Chris Wilson, +Eric Anholt, Jeff Muizelaar, Karl Tomlinson, M Joonas Pihlaja, Søren +Sandmann Pedersen and many others that have contributed over the last +couple of years to cairo. Thank you all! + +Snapshot 1.9.14 (2010-07-26) +============================ + + A quiet couple of weeks, hopefully Cairo is seeing widescale deployment and + we are being to see the results of the stabilisation effort. Clipping bugs + seems to have been the order of the last couple of weeks, with a couple + reported and duly fixed. Thank you Igor Nikitin and Karl Tomlinsion for + finding those regressions. At this point all that seems to remain to do is + to fix the outstanding regressions in the PDF backend... + +Bugs fixes +---------- + + Clip doesn't work for text on the image backend + https://bugs.freedesktop.org/show_bug.cgi?id=29008 + + Add explicit dependency for cxx + https://bugs.freedesktop.org/show_bug.cgi?id=29114 + + Fix regressions in reporting clip extents + https://bugs.freedesktop.org/show_bug.cgi?id=29120 + https://bugs.freedesktop.org/show_bug.cgi?id=29121 + https://bugs.freedesktop.org/show_bug.cgi?id=29122 + https://bugs.freedesktop.org/show_bug.cgi?id=29124 + https://bugs.freedesktop.org/show_bug.cgi?id=29125 + + +Snapshot 1.9.12 (2010-07-12) +============================ + + A couple of weeks spent fixing those annoying bugs and cleaning up the build + system; the list of outstanding tasks to complete for the stable release is + finally shrinking. The chief bug fixer has been Benjamin Otte who not only + made sure that the public API is consistent and being tested for its + consistency, but also ensured that the documentation was up-to-date and + spent time clarifying cases where even the Cairo developers have come + unstuck in the past. Many thanks, Benjamin. However, he was not alone, + as Andrea Canciani continued his fine work in isolating broken corner cases + and proceeding to fix them, and tidying up the quartz backend. And last, but + definitely not least, M Joonas Pihlaja tried building Cairo across a + perverse range of systems and fixed up all the loose bits of code that came + unravelled. Thanks everybody! + +API Changes +----------- + + cairo_surface_set_mime_data, cairo_surface_get_mime_data: + + The length parameter is now an unsigned long (as opposed to an unsigned + int). The parameter is intended to be an equivalent to a size_t without + requiring POSIX types and be large enough to store the size of the + largest possible allocation. + + cairo_gl_surface_create_for_texture: + + This a new surface constructor for cairo-gl that explicitly enables + render-to-texture for foreign, i.e. application, textures. + + cairo_region_xor, cairo_region_xor_rectangle + + A couple of utility routines add to the region handling interface for + the purpose of replacing existing GdkRegion functionality. + +Bugs fixes +---------- + + https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/600622 + + Inkscape was caught in the act of attempting to modify a finished surface. + Unfortunately, we had the ordering of our guards and assertions wrong and + so an ordinary application error was triggering an assert in Cairo. This + lead Benjamin to add a test case to ensure that the entire public API + could handle erroneous input and then proceeded to fix a whole slew of + uncovered bugs. + + + https://bugs.freedesktop.org/show_bug.cgi?id=28888 + + A regression introduced by the special casing of uploading images to an + xlib surface in-place which was ignoring the translation applied to the + image. + + +Snapshot 1.9.10 (2010-06-26) +============================ + + The first "quick" snapshot in the run up to the stable release. The + last snapshot was picked up by the bleeding edge distributions and so the + bug reports have to started to roll in. The most frequent of these are the + introduction of rendering errors by applications that modify a surface + without subsequently calling cairo_surface_mark_dirty(). Make sure the + application developers are aware of increased reliance on strict use of the + Cairo API before 1.10 is released! + + The usual slew of bugs reported and we would like to thank Zoxc for + contributing the WGL interface for cairo-gl, and finding more build + failures on win32. And it just wouldn't be a 1.9 snapshot unless + Benjamin Otte improved the error handling within cairo-gl, as well as + isolating and fixing some more errors in the test suite. The biggest bug of + the snapshot turned out to be a major sign extension issue that had lain + hidden for many years and was suddenly exposed by incorrectly rounding + rectangles when performing non-antialiased rendering. Also to the relief + of many we have included the downstream patch to honour the user's LCD + filtering preferences for subpixel rendering of fonts. The interface + remains private for the time being, whilst the proposed public API is + finalized. + +API changes +----------- + None. + +Snapshot 1.9.8 (2010-06-12) +=========================== + + One major API changes since the last snapshot, and a whole slew of bugs + fixed and inconsistencies eliminated. Far too many bugs fixed to + individually identify. We need to thank Benjamin Otte for his fantastic + work on the cairo-gl backend making it faster and more robust, Andrea + Canciani for finding so many bugs and developing test cases for them, as + well fixing them. And last but not least we must all thank Adrian Johnson for + continuing to eliminate bugs and improving the PostScript and PDF backends. + + This snapshot represents almost 4 months of bug fixing, bringing Cairo to + a point where we consider it almost ready to be a candidate for release. + There are a few known bugs left to be fixed, being tracked in + https://bugs.freedesktop.org/show_bug.cgi?id=24384, so please give Cairo a + whirl and report any regressions. The plan is to release a new snapshot + every other week leading to a 1.10 release with a target date of + 2010-08-16. + +API additions +------------- + CAIRO_FORMAT_RGB16_565 + + 16 bit devices still remain popular, and so with great demand, + CAIRO_FORMAT_RGB16_565 has been restored enabling applications to create + and use 16 bit images as sources and render targets. + + cairo_surface_create_for_rectangle() + + It is common practice to cut an image up into many smaller pieces and use + each of those as a source - a technique called texture atlasing. + cairo_surface_create_for_rectangle() extends Cairo to directly support use + of these subregions of another cairo_surface_t both as a source and as a + render target. + + cairo_region_create() + cairo_region_create_rectangle() + cairo_region_create_rectangles() + cairo_region_copy() + cairo_region_reference() + cairo_region_destroy() + cairo_region_equal() + cairo_region_status() + cairo_region_get_extents() + cairo_region_num_rectangles() + cairo_region_get_rectangle() + cairo_region_is_empty() + cairo_region_contains_rectangle() + cairo_region_contains_point() + cairo_region_translate() + cairo_region_subtract() + cairo_region_subtract_rectangle() + cairo_region_intersect() + cairo_region_intersect_rectangle() + cairo_region_union() + cairo_region_union_rectangle() + + The Cairo region API was actually added a couple of snapshots ago, but we + forgot to mention it at the time. A simple API for the handling of + rectangular pixel-aligned regions by Soeren Sandmann. + + +Backend-specific improvements +----------------------------- +cairo-gl + + Benjamin Otte made more than 200 commits in which he refactored the cairo-gl + backend, reducing a lot of code duplication and enabled him to begin working + on improving performance by reducing state changes and associated overhead. + +cairo-xlib + + Access to the underlying connection to the Display is now thread-safe + enabling cairo-xlib to be used in a multi-threaded application without fear + of random corruption. Thanks Benjamin Otte! + + cairo-xlib will now attempt to use PolyModeImprecise when compositing + trapezoids (i.e. a fill or a stroke operation with a non-trivial path) which + should allow hardware drivers more scope for accelerating the operation at + the cost of potentially incurring minute rendering errors. The mode can be + forced back to PolyModePrecise by setting the antialias parameter to + CAIRO_ANTIALIAS_SUBPIXEL. + +cairo-svg + + A notable improvement was contributed by Alexander Shulgin to enable SVG to + reference external image through the use an extended MIME data type. + +Snapshot 1.9.6 (2010-02-19) +=========================== +API additions +------------- + Add cairo_device_t + + The device is a generic method for accessing the underlying interface + with the native graphics subsystem, typically the X connection or + perhaps the GL context. By exposing a cairo_device_t on a surface and + its various methods we enable finer control over interoperability with + external interactions of the device by applications. The use case in + mind is, for example, a multi-threaded gstreamer which needs to serialise + its own direct access to the device along with Cairo's across many + threads. + + Secondly, the cairo_device_t is a unifying API for the mismash of + backend specific methods for controlling creation of surfaces with + explicit devices and a convenient hook for debugging and introspection. + + The principal components of the API are the memory management of: + + cairo_device_reference(), + cairo_device_finish() and + cairo_device_destroy(); + + along with a pair of routines for serialising interaction: + + cairo_device_acquire() and + cairo_device_release() + + and a method to flush any outstanding accesses: + + cairo_device_flush(). + + The device for a particular surface may be retrieved using: + + cairo_surface_get_device(). + + The device returned is owned by the surface. + +API changes (to API new in the cairo 1.9.x series) +-------------------------------------------------- + cairo_recording_surface_create() + cairo_recording_surface_ink_extents() + + These are the replacement names for the functions previously named + cairo_meta_surface_create and cairo_meta_surface_ink_extents. + + cairo_surface_set_mime_data + + This interface is now changed such that the MIME data will be + detached if the surface is modified at all. This guarantees that + the MIME data will not become out of synch due to surface + modifications, and also means that for the MIME data to be useful, + it must be set after all modifications to the surface are + complete. + +API removal (of experiment API) +------------------------------- + The cairo-glitz backend is removed entirely, (in favor of the new + cairo-gl backend). See below for more on cairo-gl. + +Generic fixes +------------- + + Many improvements for drawing of dashed strokes + + Fix incorrect handling of negative offset + Faster computation of first dash (avoids near-infinite looping) + Approximate extremely fine dash patterns with appropriate alpha value + + Optimize spans-based renderers for repeated rows, (such as in a rounded rectangle) + +Backend-specific improvements +----------------------------- +cairo-drm + + This is a new, direct-rendering backend that supports Intel graphics + chipsets in the i915 and i965 families. It's still experimental and + will likely remain that way for a while. It's already got extremely + good performance on the hardware it supports, so if nothing else + provides a working proof and performance target for the cairo-gl + work for Intel graphics. + +cairo-gl + + Start using GLSL to accelerate many operations. Many thanks to Eric + Anholt and T. Zachary Laine for this work. For the first time, we + have what looks like what will be a very compelling OpenGL-based + backend for cairo (in terms of both quality and performance). + + See this writeup from Eric for more details on recent progress of + cairo-gl (which he presented at FOSDEM 2010): + + http://anholt.livejournal.com/42146.html + +cairo-image + + The image backend is made dramatically faster (3-5 times faster for + benchmarks consisting primarily of glyph rendering). + +cairo-quartz fixes: + + Many fixes from Robert O'Callahan and Andrea Canciani including: + + Fixed gradient pattern painting + Improved A8 image handling + Fixes for "unbounded" and other compositing operators + +cairo-pdf fixes: + + Improvements to embedding of JPEG and JPEG2000 data. + +cairo-ps fixes: + + Fix printing of rotated user fonts. + +Snapshot 1.9.4 (2009-10-15) +=========================== +API additions: + + cairo_meta_surface_create() + cairo_meta_surface_ink_extents() + + Finally exporting the internal meta-surface so that applications + have a method to record and replay a sequence of drawing commands. + + cairo_in_clip() + + Determines whether a given point is inside the current clip. + ??? Should this be called cairo_in_paint() instead? in-clip is the test + that is performed, but in-paint would be similar to in-fill and in-stroke. + +New utilities: + + cairo-test-trace + + A companion to cairo-perf-trace, this utility replays a trace against + multiple targets in parallel and looks for differences in the output, + and then records any drawing commands that cause a failure. + Future plans: + Further minimisation of the fail trace using "delta debugging". + More control over test/reference targets. + +Backend improvements: + + xlib + + Server-side gradients. The theory is that we can offload computation + of gradients to the GPU and avoid pushing large images over the + connection. Even if the driver has to fallback and use pixman to render + a temporary source, it should be able to do so in a more efficient manner + than Cairo itself. However, cairo-perf suggests otherwise: + + On tiny, Celeron/i915: + + before: firefox-20090601 211.585 + after: firefox-20090601 270.939 + + and on tiger, CoreDuo/nvidia: + + before: firefox-20090601 70.143 + after: firefox-20090601 87.326 + + In particular, looking at tiny: + + xlib-rgba paint-with-alpha_linear-rgba_over-512 47.11 (47.16 0.05%) -> 123.42 (123.72 0.13%): 2.62x slowdown + █▋ + xlib-rgba paint-with-alpha_linear3-rgba_over-512 47.27 (47.32 0.04%) -> 123.78 (124.04 0.13%): 2.62x slowdown + █▋ + + +New experimental backends: + + QT + + OpenVG - The initial work was done by Øyvind Kolås, and made ready for + inclusion by Pierre Tardy. + + OpenGL - An advanced OpenGL compositor. The aim is to write a integrate + directed rendering using OpenGL at a high-level into Cairo. In + contrast to the previous attempt using Glitz which tried to + implement the RENDER protocol on top of OpenGL, using the + high-level interface should permit greater flexibility and + more offloading onto the GPU. + The initial work on the backend was performed by Eric Anholt. + +Long standing bugs fixed: + + Self-intersecting strokes. + + A long standing bug where the coverage from overlapping semi-opaque + strokes (including neighbouring edges) was simply summed in lieu of + a costly global calculation has been fixed (by performing the costly + global calculation!) In order to mitigate the extra cost, the + tessellator has been overhauled and tune, which handles the fallback + for when we are unable to use the new span rasteriser on the stroke + (e.g. when using the current RENDER protocol). The large number of + pixel artefacts that implementing self-intersection elimination + removes is ample justification for the potential performance + regression. If you unfortunately do suffer a substantial performance + regression in your application, please consider obtaining a + cairo-trace and submitting it to us for analysis and inclusion into + our performance suite. + +Special thanks: + + To the AuroraUX team for providing access to one of their OpenSolaris + machines for cairo and pixman development. http://www.auroraux.org/ + +Snapshot 1.9.2 (2009-06-12) +=========================== +API additions: + + cairo_surface_set_mime_data() + cairo_surface_get_mime_data() + + Should this take unsigned int, unsigned long or size_t for the length + parameter? (Some datasets may be >4GiB in size.) + + Associate an alternate, compressed, representation for a surface. + Currently: + "image/jp2" (JPEG2000) is understood by PDF >= 1.5 + "image/jpeg" is understood by PDF,PS,SVG,win32-printing. + "image/png" is understood by SVG. + + cairo_pdf_version_t + cairo_pdf_surface_restrict_to_version() + cairo_pdf_get_versions() + cairo_pdf_version_to_string() + + Similar to restrict to version and level found in SVG and PS, + these limit the features used in the output to comply with the PDF + specification for that version. + + CAIRO_STATUS_INVALID_SIZE + Indicates that the request surface size is not supported by the + backend. This generally indicates that the request is too large. + + CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED + Indicates that a required callback for a user-font was not implemented. + + CAIRO_STATUS_LAST_STATUS + This is a special value to indicate the number of status values enumerated + at compile time. (This may differ to the number known at run-time.) + + The built-in twin font is now called "@cairo:" and supports a limited set + of options like "@cairo:mono". Where are these specified? + + cairo_in_fill() now uses HTML Canvas semantics, all edges are inside. + +New experimental backends: + + CairoScript + +New utility: + + cairo-trace and cairo-perf-trace + + cairo-trace generates a human-readable, replayable, compact(-ish!) + representation of the sequences of drawing commands made by an + application. + + Under the util/cairo-script directory is a library to replay traces. + + perf/cairo-perf-trace replays traces against multiple backends + and makes useful benchmark reports. This is integrated with + 'make perf'. You may collect your own traces or take advantage + of traces collected by the community: + + git://git.cairographics.org/git/cairo-traces + + (Put this into perf/cairo-traces to run these as part of "make perf".) + + There is additional WIP in building a debugging tool for cairo applications + based on CairoScript (currently very preliminary, mostly serves to show + that GtkSourceView is too slow) : + + people.freedesktop.org:~ickle/sphinx + +Test suite overhaul: + + The test suite is undergoing an overhaul, primarily to improve its speed + and utility. (Expect more changes in the near future to improve XFAIL + handling.) + +Optimisations: + polygon rasterisation! Joonas implemented the Tor polygon scan converter, + on typical geometry is about 30% faster for the image backend. + + Bovine Polaroids! For those not in on the joke, this is the long + awaited "copy-on-write snapshot" or "COW snapshot" support. The + user-visible feature is that including the same image multiple times + into a PDF file should result in only a single instance of that + image in the final output. This is unlike previous versions of cairo + which would generate very large PDF files with multiple copies of + the same image. Adrian says that the PDF is not quite working as + well as it should yet, so we hope for futher improvements before + cairo 1.10. + +Bug fixes: + + EXTEND_PAD. + + Better handling of large scale-factors on image patterns. + + Emit /Interpolate for PS,PDF images. + + Global glyph cache - cap on the total number of inactive glyphs, + should prove fairer for fonts with larger glyph sets. + + Compilation without fontconfig + + Improved handling of low-bitdepth sources (e.g. copying the contents + of 16-bit xserver windows) + +Regressions: + + cairo_traps_extract_region >10x slower. Fix pending. + +Still to come: + + Region tracking API (ssp) for damage tracking, hit testing etc + mime-surface + + An expiremental OpenGL backend? + + Tweaks to tessellator, allocations of patterns, delayed + initialisation of the xlib backend (reduce the cairo overhead of + render_bench by ~80%). + + +Release 1.8.8 (2009-06-16 Chris Wilson <chris@chris-wilson.co.uk>) +================================================================== +The cairo community is pleased to announce the 1.8.8 release of the +cairo graphics library. This is the fourth update to cairo's stable +1.8 series and contains a small number of bug fixes (in particular a +few corrections to the documentation and a few fixes in the FreeType font +backend). This is being released just over six months after cairo 1.8.6. + +We recommend that everyone using cairo upgrade to 1.8.8. + +-Chris + +Build fixes +----------- +There were reports of incompatibilities with the autotools bundled in with +the 1.8.6 tarball. This release has been built with automake-1.10.2 and +autoconf-2.63. + +The configure check for FreeType has been improved: + + typo in check for version of freetype in configure script + https://bugs.freedesktop.org/show_bug.cgi?id=19283 + +Compilation on 64-bit MacOS/X fixes: + + Cannot build cairo_quartz_font_face_create_for_atsu_font_id on 64-bit Mac OS X + https://bugs.freedesktop.org/show_bug.cgi?id=15702 + +Bug fixes +--------- +Uninitialised status return within _cairo_clip_intersect_mask(). This caused +random crashes and general mayhem as an error could be generated causing all +rendering to the context to stop. + +Avoid transforming nearly-degenerate matrices into degenerate matrices: + + Painting stops in this case, using -moz-transform: scale, rotate and video + https://bugzilla.mozilla.org/show_bug.cgi?id=467423 + +A few FreeType font handling bugs were fixed: + + Rendering with PANGO_GRAVITY_EAST leads to different results with image and pdf + https://bugs.freedesktop.org/show_bug.cgi?id=21985 + + Don't call FT_Done_Face() on faces we did not create + + zombie ft_font_face / ft_unscaled_font mutual referencing problems + http://bugs.freedesktop.org/show_bug.cgi?id=21706 + +Ensure win32 font backend sets the return value to -1 (indicating the absent +glyph) if the font index lookup for the unicode character fails. And +similarly fix a bug where a fatal error was raised for an invalid glyph. + + cairo_scaled_font_glyph_extents breaks with invalid glyph id + http://bugs.freedesktop.org/show_bug.cgi?id=20255 + +Various improvements to the documentation, reported by Truc Troung: + + https://bugs.freedesktop.org/show_bug.cgi?id=20095 + https://bugs.freedesktop.org/show_bug.cgi?id=20154 + https://bugs.freedesktop.org/show_bug.cgi?id=20180 + https://bugs.freedesktop.org/show_bug.cgi?id=20183 + https://bugs.freedesktop.org/show_bug.cgi?id=20182 + https://bugs.freedesktop.org/show_bug.cgi?id=20441 + + +Release 1.8.6 (2008-12-13 Chris Wilson <chris@chris-wilson.co.uk>) +================================================================== +The cairo community is pleased to announce the 1.8.6 release of the +cairo graphics library. This is the third update to cairo's stable +1.8 series and contains a small number of bug fixes (in particular a +few fixes for failures of cairo 1.8.4 on Quartz and PDF, and build fixes for +a couple of backends). This is being released just under a month after +cairo 1.8.4. + +We recommend that everyone using cairo upgrade to 1.8.6. + +-Chris + +Build fixes +----------- +Fix build of DirectFB backend with debugging enabled: + + Bug in _cairo_directfb_surface_release_source_image function + http://bugs.freedesktop.org/show_bug.cgi?id=18322 + +Fix build on OS/2. + +Bug fixes +--------- +Workaround a mis-compilation of cairo_matrix_invert() that generated invalid +matrices and triggered assertion failures later. The issue was reported by +Peter Hercek. + +Invalid computation of the modulus: + + https://bugzilla.mozilla.org/show_bug.cgi?id=466258 + +Invalid referencing of patterns in the Quartz backend: + + Failed assertion `CAIRO_REFERENCE_COUNT_HAS_REFERENCE + (&pattern->ref_count)' when using cairo quartz backend + http://bugs.freedesktop.org/show_bug.cgi?id=18632 + +Invalid references to glyphs after early culling, causing segmentation faults +in the PDF backend: + + http://lists.cairographics.org/archives/cairo/2008-December/015976.html + +Check for XRender in the XCB backend, or else we may attempt an invalid memory +access: + + XCB backend fails with missing render. + https://bugs.freedesktop.org/show_bug.cgi?id=18588 + +Release 1.8.4 (2008-11-14 Carl Worth <cworth@cworth.org>) +========================================================= +The cairo community is pleased to announce the 1.8.4 release of the +cairo graphics library. This is the second update to cairo's stable +1.8 series and contains a small number of bug fixes, (in particular a +few fixes for build failures of cairo 1.8.2 on various systems). This +is being released just over two weeks after cairo 1.8.2. + +We recommend that everyone using cairo upgrade to 1.8.4. + +-Carl + +Build fixes +----------- +Fix build with older XRender that doesn't define RepeatNone: + + Build of xlib backend fails against old XRender (RepeatNone undeclared) + https://bugs.freedesktop.org/show_bug.cgi?id=18385 + +Fix build with bash version <= 3.0: + + doltlibtool broken on linux with bash 3.00.0 + https://bugs.freedesktop.org/show_bug.cgi?id=18363 + +Bug fixes +--------- +Avoid triggering a bug in X.org server 6.9 resulting in a hung machine +requiring a reboot: + + https://bugs.freedesktop.org/show_bug.cgi?id=15628#c2 + +Fix display of user fonts as exercised by proposed support for type3 +fonts in poppler (unsigned promotion fixes): + + Use cairo user-font for Type 3 fonts + http://lists.freedesktop.org/archives/poppler/2008-October/004181.html + +Avoid miscomputing size of fallback images required when rendering +with CLEAR, IN, or SOURCE operator to vector surfaces, (PS, PDF, SVG, +etc.). + +Be more tolerant of broken fonts when subsetting type1 fonts: + + Error handling in cairo_type1_font_subset_get_glyph_names_and_widths + http://lists.cairographics.org/archives/cairo/2008-October/015569.html + +Fix cairo_fill_extents, cairo_stroke_extents, cairo_path_extents, to +correctly allow NULL parameters as documented. + +Fix potential crash on emitting a type3 glyph after having drawn text +paths from the same font, (for example with cairo_text_path). + +Release 1.8.2 (2008-10-29 Carl Worth <cworth@cworth.org>) +========================================================= +The cairo community is pleased to announce the 1.8.2 release of the +cairo graphics library. This is the first update to cairo's stable 1.8 +series and contains a large number of bug fixes. It is being released +just over one month since cairo 1.8.0. + +This release consists primarily of bug fixes, but there is one notable +new feature, (the ability to build cairo without an external font +backend), and there are a few optimizations as well. See below for +details on these changes and the most important bug fixes. + +While many people have contributed to this release, Chris Wilson +deserves particular mention. He has contributed well over twice as +many changes to cairo since 1.8.0 than everyone else combined. We +greatly appreciate the tremendous efforts of Chris and all cairo +contributors. + +We recommend everyone upgrade to cairo 1.8.2 and hope that everyone +will have lots of fun with cairo! + +-Carl + +New feature +----------- +It is now possible to build cairo without any font backend, (such as +freetype, win32 or quartz). This is most useful when the application +provides custom font rendering through the user-font API. But in the +case where no external font backend is available, and no user-font is +provided, cairo will render with a failsafe font, (a stroked font +covering visible ASCII character). (Behdad Esfahbod) + +Optimizations +------------- +Dramatically speed up compilation with dolt (removes much of the +libtool overhead) (Behdad Esfahbod with thanks to Josh Triplett). + +Several minor optimizations to tessellator (special-cased comparisons, +faster insert for skiplist, etc.) (Chris Wilson). + +Optimize away fractional translation component when doing +EXTEND_NEAREST filtering, (for better performance). + +General bug fixes +----------------- +Allow cloning sub-regions of similar surfaces to fix this bug +(Chris Wilson): + + Crafted gif file will crash firefox + [XError: 'BadAlloc (insufficient resources for operation)'] + https://bugzilla.mozilla.org/show_bug.cgi?id=424333 + +Fix some matrix confusion to fix this regression (Chris Wilson): + + Translucent star exports in a wrong way to PDF + https://bugs.launchpad.net/inkscape/+bug/234546 + +Fix some long-standing bugs with respect to properly computing the +extents of transformed, filtered surfaces (Owen Taylor, Carl Worth, +and Chris Wilson): + + Bad clipping with EXTEND_NONE + http://bugs.freedesktop.org/show_bug.cgi?id=15349 + + Improve filtering handling in cairo-pattern.c + http://bugs.freedesktop.org/show_bug.cgi?id=15367 + + Many thanks to Chris Wilson for digging out and cleaning up + these fixes. + +Fix compilation on Solaris 10 (Chris Wilson): + + Cairo requires -DREENTRANT (along with -D_POSIX_THREAD_SEMANTICS) + to compile on Solaris 10 with pthreads + https://bugs.freedesktop.org/show_bug.cgi?id=18010 + +Fix very old bug causing dashes to be rendered at the wrong length in +fallback images (Adrian Johnson) + + Dashed strokes too long in fallback images + https://bugs.freedesktop.org/show_bug.cgi?id=9189 + +Fix broken dashing when a dashed path starts outside the clip region +(Chris Wilson). + +Avoid range overflow when computing large patterns (Benjamin Otte and +Chris Wilson). + +Avoid crashing due to an invalid font with an incorrect entry in its +CMAP table (Adrian Johnson). + +Fix bugs in computing maximum size of text requests that can be sent +with the Render extension, (avoiding potential crashes when rendering +large amounts of text) (Behdad Esfahbod and Chris Wilson). + +Fix rendering of operators unbounded by the mask (Chris Wilson). + +Fix compilation on systems without compiler support for a native +64-bit type (Chris Wilson). + +Fix several cases of missing error-status propagation. (Chris Wilson, +doing the work he seems to never tire of). + +Fix several locking issues found with the lockdep valgrind skin (Chris +Wilson). + +Backend-specific bug fixes +-------------------------- +xlib: Avoid crash due to attempting XRender calls on pixmaps with +formats not supported by the Render extension (Chris Wilson): + + XRender crashes due to NULL pointer from Cairo on SGI O2 + https://bugs.freedesktop.org/show_bug.cgi?id=11734 + +xlib: Add support for XImages with depth of 4, 20, 24, or 28 bits +(Chris Wilson): + + cairo doesn't support 24 bits per pixel mode on X11 + https://bugs.freedesktop.org/show_bug.cgi?id=9102 + +xlib: Avoid mistakenly considering two surfaces as similar just +because their depths match (while their Render formats do not) (Karl +Tomlinson). + +ps: Fix slight mis-scaling of bitmapped fonts (Adrian Johnson) + +svg: Correctly emit comp-op for paint, mask, and show_glyphs +operations (Emmanuel Pacaud). + +svg: Use finer-grained fallbacks for SVG 1.2 (as PS and PDF backends +have been doing since 1.6.0) (Chris Wilson). + +win32: Fallback to DIB if DDB create fails for +cairo_surface_create_similar (Vladimir Vukicevic). + +win32: Fix compatibility with Windows Mobile (Vladimir Vukicevic). + +win32: Fix static builds to not do __declspec(dllimport) on public +functions. This requires the user to set a CAIRO_WIN32_STATIC_BUILD +environment variable when compiling (Behdad Esfahbod). + +Release 1.8.0 (2008-09-25 Carl Worth <cworth@cworth.org>) +========================================================= +The cairo community is happy (and relieved) to announce the 1.8.0 +release of the cairo graphics library. This is a major update to +cairo, with new features and enhanced functionality which maintains +compatibility for applications written using any previous major cairo +release, (1.6, 1.4, 1.2, or 1.0). We recommend that anybody using a +previous version of cairo upgrade to cairo 1.8.0. + +The dominant theme of this release is improvements to cairo's ability +to handle text. The highlights include a new "user fonts" feature as +well as a new cairo_show_text_glyphs API which allows glyphs to be +embedded in PDF output along with their original text, (for searching, +selection, and copy-and-paste). Another major feature is a revamp of +cairo's build system making it much easier to build cairo on various +platforms. + +See below for more details. + +User fonts +---------- +This new API allows the user of cairo API to provide drawings for +glyphs in a font. A common use for this is implementing fonts in +non-standard formats, like SVG fonts and Flash fonts. This API can +also be used by applications to provide custom glyph shapes for fonts +while still getting access to cairo's glyph caches. See +test/user-font.c and test/user-font-proxy.c for usage examples. This +is based on early work by Kristian Høgsberg. Thanks Kristian! + +This new API consists of the following functions (and corresponding +_get functions): + + cairo_user_font_face_create + + cairo_user_font_face_set_init_func + cairo_user_font_face_set_render_glyph_func + cairo_user_font_face_set_text_to_glyphs_func + cairo_user_font_face_set_unicode_to_glyph_func + +An additional, new API is + + cairo_scaled_font_text_to_glyphs + +We were previously reluctant to provide this function as +text-to-glyphs support in cairo was limited to "toy" font +functionality, not really interesting for real-world text +processing. However, with user fonts landing, this API is needed to +expose full access to how user fonts convert text to glyphs. This is +expected to be used by text toolkits like Pango, as well as "proxy" +user-font implementations. + +cairo_show_text_glyphs +---------------------- +This new API allows the caller of cairo to provide text data +corresponding to glyphs being drawn. The PDF backend implements this +new API so that complex text can be copied out of cairo's PDF output +correctly and reliably, (assuming the user of cairo calls +cairo_show_text_glyphs). The cairo_show_text_glyphs API is definitely +the most daunting API to debut in cairo. It is anticipated that pango +(and similar high-level text libraries) will be the primary users of +this API. In fact, pango 1.22 already uses cairo_show_text_glyphs. +Behdad was the architect and implementor of this effort. Thanks, +Behdad! + +The cairo_show_text_glyphs API includes the following new functions: + + cairo_show_text_glyphs + + cairo_glyph_allocate + cairo_glyph_free + + cairo_text_cluster_allocate + cairo_text_cluster_free + + cairo_surface_has_show_text_glyphs + +Build system revamp +------------------- +The primary goal of the revamp is to make the build system less +fragile, (particularly for non-Linux platforms). For example, now +people building on win32 will no longer need to maintain a +platform-specific list of files to be built. See the new README.win32 +for details. Also, the .so file will now be installed with a different +naming scheme, (for example, 1.7.6 will install with a .10800 +suffix). Many thanks to Behdad and his small army of helpers! + +Assorted API additions +---------------------- +For API completeness, several missing "getter" functions were added: + + cairo_scaled_font_get_scale_matrix + + cairo_surface_get_fallback_resolution + + cairo_toy_font_face_create + cairo_toy_font_face_get_family + cairo_toy_font_face_get_slant + cairo_toy_font_face_get_weight + +The new cairo_toy_font_face functions provide access to functionality +and settings provided by cairo_select_font_face(). Thanks Behdad! + +cairo-ps/cairo-pdf: More efficient output +----------------------------------------- +Adrian Johnson has been busy fixing all kinds of bugs in PS and PDF +backends, as well making them generate much more compact output by +avoiding things like re-emitting the color or linestyle on every +drawing operation. Thanks Adrian! + +cairo-xlib: dithering +--------------------- +Dithering: Cairo now does simple dithering when rendering to legacy X +servers. This is most visible with 8-bit visuals. Thanks Behdad! + +cairo-xlib: Avoid rendering glyphs out of surface bounds +-------------------------------------------------------- +This seemingly harmless optimization exposed a bug in OpenOffice.org 3 +versions where OO.o was passing bogus surface extents to cairo, +resulting in no text rendered in OO.o. Please contact your +distribution's OO.o maintainers if you see this bug and point them to +the following URL: + + https://bugs.freedesktop.org/show_bug.cgi?id=16209 + +cairo-xlib: Improved performance with X server without Render +------------------------------------------------------------- +Cairo now performs better on remote X servers that lack the Render +extension by being smarter about using X core protocol facilities +instead of falling back to doing all rendering on the client side. + +cairo-ft: respecting FC_FT_FACE +------------------------------- +Previously it was impossible to instruct cairo to do emboldening on a +font face object created from an FT_Face. Cairo now respects and uses +the FC_FT_FACE fontconfig pattern element, so emboldening can be +achieved by using cairo_ft_font_face_create_for_pattern() and a +carefully crafted pattern using FC_FT_FACE and FC_EMBOLDEN. Thanks +Behdad! + +cairo-directfb: backend improvements +------------------------------------ +The directfb backend, though still unsupported, has seen a good deal +of improvements. Thanks Vlad! + +Bug fixing and optimizations +---------------------------- +xlib: Faster bookkeeping (Karl Tomlinson) + https://bugzilla.mozilla.org/show_bug.cgi?id=453199#c5 + +PS: Fix gradients with non-constant alpha (Chris Wilson) + +Fix deadlock in user-font code (Richard Hughes and Behdad Esfahbod) + http://bugs.freedesktop.org/show_bug.cgi?id=16819 + +Countless other bugs have been fixed and optimizations made, many of +them thanks to Chris Wilson. Thanks Chris and others! + +Note also that the code that had been in cairo 1.7.x calling into +freetype's optional lcd_filter function was removed from cairo before +the 1.8.0 release. We do expect this code to come back in some form in +the future. + +Snapshot 1.7.6 (2008-09-17 Carl Worth <cworth@cworth.org>) +========================================================== +The cairo community is happy to announce the 1.7.6 snapshot of the +cairo graphics library. This is a "release candidate" for the upcoming +1.8.0 release, so we will greatly appreciate any reports of problems +in this release, and no major changes are currently planned before +1.8. + +Notable changes in 1.7.6 +------------------------ +The largest number of changes since 1.7.4 did not change the +implementation of cairo itself, but instead revamped cairo's build +system. The primary goal of the revamp is to make the build system +less fragile, (particularly for non-Linux platforms). For example, now +people building on win32 will no longer need to maintain a +platform-specific list of files to be built. Also, the .so file will +now be installed with a different naming scheme, (for example, 1.7.6 +will install with a .10706 suffix). Much thanks, Behdad! + +And, as usual, Chris Wilson has made another large round of robustness +improvements, (eliminating dead code, fixing propagation of error +status values, test suite improvements, etc. etc.). Thanks as always, +Chris! + +API changes since 1.7.4 +----------------------- +There have been a few changes of API that was new during the 1.7 +series: + +* Remove cairo_font_options_set_lcd_filter + and cairo_font_options_get_lcd_filter + + Motivation: At the Cairo Summit, this API was determined to be too + specific to the freetype font backend to be in the general + API. A similar API with a cairo_ft prefix might be introduced + in the future. Note that cairo will still respect the + corresponding fontconfig settings for these options. + +* Replace cairo_has_show_glyphs + with cairo_surface_has_show_glyphs + + Motivation: This really is a surface-specific interface, and the + convenience function on the cairo_t is not obviously + necessary. An application can easily call: + + cairo_surface_has_show_glyphs (cairo_get_target (cr)); + + as needed. + +* Add cairo_text_cluster_flags_t + to cairo_show_text_glyphs + cairo_scaled_font_text_to_glyphs + cairo_user_scaled_font_text_to_glyphs_func_t + + Motivation: This flag, (and specifically the + CAIRO_TEXT_CLUSTER_FLAG_BACKWARD value), replaces the + cairo_bool_t backward argument in each of the above + interfaces. This leads to more readable user code, and also + allows future extensibility. + +As always, there are no changes to any API from any major cairo +release, (1.0.x, 1.2.x, 1.4.x, 1.6.x). Cairo maintains the same +compatibility promise it always has. + +Bug fixes since 1.7.4 +--------------------- +xlib: Faster bookkeeping (Karl Tomlinson) + https://bugzilla.mozilla.org/show_bug.cgi?id=453199#c5 + +PS: Fix gradients with non-constant alpha (Chris Wilson) + +Fix deadlock in user-font code (Richard Hughes and Behdad Esfahbod) + http://bugs.freedesktop.org/show_bug.cgi?id=16819 + +Several other minor fixes. + +Snapshot 1.7.4 (2008-08-11 Behdad Esfahbod <behdad@behdad.org>) +=============================================================== +The cairo community is embarrassed to announce availability of the 1.7.4 +snapshot of the cairo graphics library. This is a followup release to the +1.7.2 snapshot to ship a tarball that can actually be built. The only +change since 1.7.4 is including the missing header file +cairo-user-font-private.h in the distribution. + +Snapshot 1.7.2 (2008-08-11 Behdad Esfahbod <behdad@behdad.org>) +=============================================================== +The cairo community is finally ready to announce availability of the 1.7.2 +snapshot of the cairo graphics library. This is embarrassingly the first +snapshot in the 1.7 unstable series of cairo, leading to the eventual release +of cairo 1.8, currently planned for late September. + +This snapshot comes four months after the 1.6.4 release. We have done a +really bad job on getting development snapshots out this cycle, but +hopefully all the API changes for 1.8 are now finished and the remaining +weeks will be spent on bug-fixing. There is more than 400 commits worth +of changes in this snapshot, and those can use some testing. Read on! + +Text, text, and more text! +-------------------------- +The dominant theme of this release, and 1.8 in general, is improvements +around cairo text API. Here is a high-level list of changes with text +handling: + +User fonts +---------- +This is new API allowing the user of cairo API to provide drawings for glyphs +in a font. This is most useful in implementing fonts in non-standard formats, +like SVG fonts and Flash fonts, but can also be used by games and other +applications to draw "funky" fonts. See test/user-font.c and +test/user-font-proxy.c for usage examples. This is based on early work by +Kristian Høgsberg. Thanks Kristian! + +show_text_glyphs +---------------- +This new API allows the caller of cairo to mark text glyphs with their +original text. The PDF backend implements this new API and latest Pango +master uses it. The result is (when bugs are fixed) that complex text can be +copied out of pangocairo's PDF output correctly and reliably. There are bugs +to fix though. A few poppler bugs, and some more in cairo and pango. + +To test show_text_glyph, just grab pango master and this cairo snapshot and +print text in gedit. Open in acroread or evince, select all, copy, paste +in gedit and compare. The Arabic text with diacritic marks is particularly +showing bad. Try with pango/pango-view/HELLO.txt if you are brave +enough. The Indic text is showing improvements, but is still coming out +buggy. + +LCD subpixel filtering using FreeType +------------------------------------- +FreeType 2.3.5 added support for various LCD subpixel filtering, and +fontconfig 2.6.0 added support for configuring LCD filter on a font by font +basis. Cairo now relies on FreeType and fontconfig for subpixel filtering. +This work is based on David Turner's original patch to cairo, maintained +and tested by Sylvain Pasche and others. Thanks all! + +Toy font face constructor and getter +------------------------------------ +Mostly for API completion, but also useful for higher level (like Pango) to +hook into what the user has set using cairo_select_font_face(), making that +toy API a bit more useful. + +FreeType: respecting FC_FT_FACE +------------------------------- +Previously it was impossible to instruct cairo to do emboldening on a font +face object created from an FT_Face. Cairo now respects and uses the +FC_FT_FACE fontconfig pattern element, so emboldening can be achieved by +using cairo_ft_font_face_create_for_pattern() and a carefully crafted pattern +using FC_FT_FACE and FC_EMBOLDEN. + + +PS/PDF: More efficient output +----------------------------- +Adrian Johnson has been busy fixing all kinds of bugs in PS and PDF +backends, as well making them generate much more compact output by avoiding +things like re-emitting the color or linestyle on every drawing operation. +Thanks Adrian! + + +Xlib: Dithering +--------------- +Cairo now does simple dithering when rendering to legacy X servers. This is +mostly visible with 8-bit visuals. + +Xlib: Avoid rendering glyphs out of surface bounds +-------------------------------------------------- +This seemingly harmless change manifested a bug with OpenOffice.org 3 versions +where OO.o was passing bogus surface extents to cairo, resulting in no text +rendered in OO.o. Please contact your distro's OO.o maintainers if you see +this bug and point them to the following URL: + + https://bugs.freedesktop.org/show_bug.cgi?id=16209 + +Xlib: Improved performance with Xrender-less X servers +------------------------------------------------------ +Cairo now performs better on remote, Xrender-less X servers by being smarter +about using X core protocol facilities instead of falling back to doing all +rendering on the client side. + + +Directfb: backend improvements +------------------------------ +The directfb backend, though still unsupported, has seen a good deal of +improvements. Thanks Vlad! + + +Bug fixing and optimizations +---------------------------- +Countless bugs have been fixed and optimizations made, many of them thanks to +Chris Wilson. Thanks Chris! + + +API additions +------------- + +cairo_show_text_glyphs + + This is a new text rendering API. Being a more advanced version of + cairo_show_glyphs(), it is aimed for use by higher-level text toolkits like + Pango, and enables better text extraction from output generated by backends + like PDF and SVG. The PDF backend already implements it, and the upcoming + Pango release will use it. + + To make that API work, a bunch of other additions were made: + +cairo_glyph_allocate +cairo_glyph_free +cairo_text_cluster_t +cairo_text_cluster_allocate +cairo_text_cluster_free +cairo_surface_has_show_text_glyphs + + +cairo_user_font_face_create + + This is the "user" font face constructor, accompanied by a variety of method + signatures, getters, and setters for a callback-based font backend: + +CAIRO_FONT_TYPE_USER +cairo_user_scaled_font_init_func_t +cairo_user_scaled_font_render_glyph_func_t +cairo_user_scaled_font_text_to_glyphs_func_t +cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_user_font_face_set_init_func +cairo_user_font_face_set_render_glyph_func +cairo_user_font_face_set_text_to_glyphs_func +cairo_user_font_face_set_unicode_to_glyph_func +cairo_user_font_face_get_init_func +cairo_user_font_face_get_render_glyph_func +cairo_user_font_face_get_text_to_glyphs_func +cairo_user_font_face_get_unicode_to_glyph_func + + +cairo_scaled_font_text_to_glyphs + + We were previously reluctant to provide this function as text-to-glyphs + support in cairo was limited to "toy" font functionality, not really + interesting for real-world text processing. However, with user-fonts + landing, this API is needed to expose full access to how user-fonts + convert text to glyphs. This is expected to be used by text toolkits like + Pango, as well as "proxy" user-font implementations. + + +cairo_lcd_filter_t +cairo_font_options_set_lcd_filter +cairo_font_options_get_lcd_filter + + These add the possibility to choose between various available LCD subpixel + filters. The available filter values are modeled after what FreeType + provides. + + +cairo_toy_font_face_create +cairo_toy_font_face_get_family +cairo_toy_font_face_get_slant +cairo_toy_font_face_get_weight + + These provide access to functionality and settings provided by + cairo_select_font_face(). + + +cairo_scaled_font_get_scale_matrix +cairo_surface_get_fallback_resolution + + For API completeness. + + +Various new values for cairo_status_t enum + + +Known issues: + +- Type3 fonts generated by cairo's PDF backend may show up in poppler/Evince + in a different color than expected. This is fixed in poppler master branch. + This mostly affects cairo user fonts. The test case test/user-font.c + demonstrates this. + +- User fonts using other fonts in their rendering are currently embedded in + PDF as fallback bitmap glyphs. This will be (hopefully) fixed before 1.8. + The test case test/user-font-proxy.c demonstrates this. + + +Release 1.6.4 (2008-04-11 Carl Worth <cworth@cworth.org>) +========================================================= +The cairo community is wildly embarrassed to announce the 1.6.4 +release of the cairo graphics library. This release reverts the xlib +locking change introduced in 1.6.4, (and the application crashes that +it caused). The community would be glad to sack its current release +manager and is accepting applications for someone who could do the job +with more discipline. + +Revert 'add missing locking in cairo-xlib' +------------------------------------------ +This change was introduced in cairo 1.6.2, but also introduced a bug +which causes many cairo-xlib applications to crash, (with a +segmentation fault inside of XSetClipMask). Instead of attempting +another fix for the broken fix, the change in 1.6.2 has been +reverted. The original bug which the change was addressing has been +present since at least cairo 1.4, so it is not expected that leaving +this bug unfixed will cause any new problems for applications moving +from cairo 1.4 to cairo 1.6. + +At this point, the code of cairo 1.6.4 differs from cairo 1.6.0 only +in the fix for the PostScript-printer crashes. + +Tweak build to avoid linking with g++ +------------------------------------- +Cairo 1.6.4 avoids a quirk in automake that was causing the cairo +library to be linked with g++ and linked against libstdc++ even when +only C source files were compiled for the library. + +Release 1.6.2 (2008-04-11 Carl Worth <cworth@cworth.org>) +========================================================= +The cairo community is pleased (but somewhat sheepish) to announce the +1.6.2 release of the cairo graphics library. This is an update to +yesterday's 1.6.0 release with an important fix to prevent cairo's +PostScript output from crashing some printers. This release also +includes a locking fix for cairo's xlib backend to improve thread +safety. There are no changes beyond these two fixes. + +Fix for PostScript printer crash +-------------------------------- +Adrian Johnson discovered that cairo 1.6.0 was being a bit hard on +PostScript printers, by changing the font matrix very frequently. This +causes some PostScript interpreters to allocate new font objects every +few glyphs, eventually exhausting available resources. The fix +involves leaving translational components of the font matrix as zero, +so that the PostScript interpreter sees an identical font matrix +repeatedly, and can more easily share internal font object resources. + +This fix has been tested to resolve the bugs posted here, (for both +Xerox and Dell printers): + + Printing some PDFs from evince is crashing our Xerox printer + http://bugs.freedesktop.org/show_bug.cgi?id=15348 + + Cairo-generated postscript blocks Dell 5100cn + http://bugs.freedesktop.org/show_bug.cgi?id=15445 + +Add missing locking in cairo-xlib +--------------------------------- +Chris Wilson noticed that cairo 1.6.0 was manipulating an internal +cache of GC object within cairo's Xlib backend without proper +locking. The missing locking could cause failures for multi-threaded +applications. He fixed this in 1.6.2 by adding the missing locks. + +Release 1.6.0 (2008-04-10 Carl Worth <cworth@cworth.org>) +========================================================= +The cairo community is quite pleased to announce the 1.6.0 release of +the cairo graphics library. This is a major update to cairo, with new +features and enhanced functionality which maintains compatibility for +applications written using cairo 1.4, 1.2, or 1.0. We recommend that +anybody using a previous version of cairo upgrade to cairo 1.6.0. + +The most significant new features in this release are dramatically +improved PDF and PostScript[*] output, support for arbitrary X server +visuals (including PseudoColor), a new Quartz backend, and and a new +"win32 printing" backend. See below for more details on these and +other new features. + +New dependency on external pixman library (Thanks, Søren!) +---------------------------------------------------------- +As of cairo 1.6, cairo now depends on the pixman library, for which +the latest release can be obtained alongside cairo: + + http://cairographics.org/releases/pixman-0.10.0.tar.gz + +This library provides all software rendering for cairo, (the +implementation of the image backend as well as any image fallbacks +required for other backends). This is the same code that was +previously included as part of cairo itself, but is now an external +library so that it can be shared by both cairo and by the X server, +(which is where the code originated). + +Improved PDF, PostScript, and SVG output (Thanks, Adrian!) +---------------------------------------------------------- +Users of the cairo-pdf, cairo-ps, and cairo-svg should see a dramatic +improvement from cairo 1.2/1.4 to 1.6. With this release there are now +almost no operations that will result in unnecessary rasterization in +the PDF and PostScript. Rasterized "image fallbacks" are restricted +only to minimal portions of the document where something is being +drawn with cairo that is beyond the native capabilities of the +document, (this is rare for PDF or SVG, but occurs when blending +translucent objects for PostScript). + +This means that the final output will be of higher quality, and will +also be much smaller, and therefore will print more quickly. The +machinery for doing analysis and minimal fallbacks also benefits the +win32-printing surface described below. + +In addition to doing less rasterization, the PostScript and PDF output +also has several other improvements to make the output more efficient +and more compatible with specifications. + +[*] Note: Just before this release, a bug has been reported that the +PostScript output from cairo can crash some printers, (so far the +following models have been reported as problematic Xerox Workcentre +7228 or 7328 and Dell 5100cn). We will implement a workaround as soon +as we can learn exactly what in cairo's output these printers object +to, (and we could use help from users that have access to misbehaving +printers). This bug is being tracked here: + + Printing some PDFs from evince is crashing our Xerox printer + http://bugs.freedesktop.org/show_bug.cgi?id=15348 + +New support for arbitrary X server visuals (Thanks, Keith and Behdad!) +---------------------------------------------------------------------- +As of cairo 1.6, cairo should now work with an arbitrary TrueColor or +8-bit PseudoColor X server visual. Previous versions of cairo did not +support these X servers and refused to draw anything. We're pleased to +announce that this limitation has been lifted and people stuck with +ancient display systems need no longer be stuck with ancient software +just because of cairo. + +New, supported Quartz backend for Mac OS X (Thanks, Brian and Vladimir!) +------------------------------------------------------------------------ +As of cairo 1.6, the cairo-quartz backend is now marked as "supported" +rather than "experimental" as in previous cairo releases. Its API now +has guarantees of API stability into future cairo releases, and its +output quality is comparable to other backends. There have been +significant improvements to cairo-quartz since 1.4. It now uses many +fewer image fallbacks, (meaning better performance), and has greatly +improved text rendering. + +New, "win32 printing" backend (Thanks, Adrian and Vladimir!) +------------------------------------------------------------ +A new win32-printing surface has been added with an interface very +similar to the original win32 surface, (both accept an HDC +parameter). But this new surface should only be called with a printing +DC, and will result in all drawing commands being stored into a +meta-surface and emitted after each page is complete. This allows +cairo to analyze the contents, (as it does with PDF, PostScript, and +SVG backends), and to do minimal image-based fallbacks as +necessary. The analysis keeps things as efficient as possible, while +the presence of fallbacks, (when necessary), ensure the consistent, +high-quality output expected from cairo. + +Robustness fixes (Thanks, Chris!) +--------------------------------- +There has been a tremendous number of improvements to cairo's +robustness. Areas that have been improved include: + + * Proper reporting of errors + + * Responding correctly to invalid input + + * Avoiding integer overflows + + * Avoiding memory leaks on error-recovery paths + + * Making reference counting thread safe + + * Exhaustive testing of memory allocation points + +Other fixes (Thanks, everybody!) +-------------------------------- +Cairo's internal fixed-point representation has been changed from +16.16 to 24.8. This has a direct impact on applications as it allows +much larger objects to be drawn before internal limits in cairo make +the drawing not work. + +The CAIRO_EXTEND_PAD mode is now fully supported by surface +patterns. This mode allows applications to use cairo_rectangle and +cairo_fill to draw scaled images with high-quality bilinear filtering +for the internal of the image, but without any objectionably blurry +edges, (as would happen with the default EXTEND_NONE and cairo_paint). + +Rendering with CAIRO_ANTIALIAS_NONE has been fixed to be more +predictable, (previously image rendering and geometry rendering would +be slightly misaligned with respect to each other). + +The reference manual at http://cairographics.org/manual now documents +100% of the functions and types in cairo's public API. + +API additions +------------- +Several small features have been added to cairo with new API functions: + +cairo_format_stride_for_width + + Must be called to compute a properly aligned stride value before + calling cairo_image_surface_create_for_data. + +cairo_has_current_point + + Allows querying if there is a current point defined for the + current path. + +cairo_path_extents + + Allows querying for path extents, (independent of any fill or + stroke parameters). + +cairo_surface_copy_page +cairo_surface_show_page + + Allow beginning a new document page without requiring a cairo_t + object. + +cairo_ps_surface_restrict_to_level +cairo_ps_get_levels +cairo_ps_level_to_string +cairo_ps_surface_set_eps + + Allow controlling the Post PostScript level, (2 or 3), to + target, as well as to generate Encapsulated PostScript (EPS). + +cairo_quartz_font_face_create_for_cgfont + + Create a quartz-specific cairo_font_face_t from a CGFontRef. + +cairo_win32_font_face_create_for_logfontw_hfont + + Create a win32-specific cairo_font_face from a LOGFONTW and an + HFONT together. + +Thanks, Everyone! +----------------- +I've accounted for 32 distinct people with attributed code added to +cairo between 1.4.14 and 1.6.0, (their names are below). That's an +impressive number, but there are certainly dozens more that +contributed with testing, suggestions, clarifying questions, and +encouragement. I'm grateful for the friendships that have developed as +we have worked on cairo together. Thanks to everyone for making this +all so much fun! + +Adrian Johnson, Alp Toker, Antoine Azar, Behdad Esfahbod, +Benjamin Otte, Bernardo Innocenti, Bertram Felgenhauer, +Boying Lu, Brian Ewins, Carl Worth, Chris Heath, Chris Wilson, +Claudio Ciccani, Emmanuel Pacaud, Jeff Muizelaar, Jeremy Huddleston, +Jim Meyering, Jinghua Luo, Jody Goldberg, Jonathan Gramain, +Keith Packard, Ken Herron, Kouhei Sutou, Kristian Høgsberg, +Larry Ewing, Martin Ejdestig, Nis Martensen, Peter Weilbacher, +Richard Hult, Shailendra Jain, Søren Sandmann Pedersen, +Vladimir Vukicevic + +Snapshot 1.5.20 (2008-04-04 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the tenth snapshot in cairo's unstable 1.5 series. It comes +just two days (and only one working day) after the 1.5.18 +snapshot. The quick snapshot is due to two embarrassing bugs (both +affecting cairo-xlib) that had been introduced in the 1.5.18 +snapshot. The fixes for these are described below along with a few +other fixes, (which hopefully aren't introducing new bugs this time). + +cairo-xlib +---------- +Revert fix from 1.5.18 to allow pattern expansion based on the filter +mode. This fix seemed so boring, (the use case it addresses is almost +never used in practice), that it didn't even get mentioned in the +1.5.18 release notes. However, the "fix" happened to break rendering +that is always used resulting in corrupt image rendering in mozilla, +evolution, and probably everything else that uses cairo. + +Fix to avoid BadMatch errors in cairo_surface_create_similar. These +were introduced, (inadvertently, of course), as part of the fix in +1.5.18 for creating similar surfaces without the Render +extension. Again, thanks to mozilla, (and Vladimir Vukicevic in +particular), for noticing our mistake. + +general +------- +Correctly handle an in-error surface in +cairo_surface_write_to_png. Previously this function would cause an +assertion failure if you gave it a finished surface. Now it cleanly +returns a CAIRO_STATUS_SURFACE_FINISHED result instead. + +Avoid potentially infinite wandering through memory inside +_cairo_hull_prev_valid. Thanks to Jonathan Watt for noticing this +problem: + + https://bugzilla.mozilla.org/show_bug.cgi?id=306649#c21 + +cairo-pdf +--------- +Fix generation of "soft" masks made by drawing to a similar surface +and then calling cairo_mask_surface() with it. + +cairo-svg +--------- +Fix for code that uses cairo_mask() on an intermediate surface which +is later passed to cairo_mask_surface(). + +Snapshot 1.5.18 (2008-04-05 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the ninth snapshot in cairo's unstable 1.5 series. It comes +just 4 days after the 1.5.16 snapshot. We had hoped to not need +another snapshot before the final 1.6.0 release, but several critical +bugs were found and fixed in the last few days, so we thought it +important to let people test the fixes with this snapshot. See below +for details. + +documentation +------------- +The README now lists necessary dependencies. + +Various graphics state defaults are now documented, (source pattern is +opaque black, line width is 2.0, line join is miter, line cap is butt, +miter limit is 10.0, etc.). + +general +------- +Several cleanups have been made along many error-path returns, +(carefully propagating up the original error status values, cleaning +up memory leaks during error recovery, etc.). This is yet another in +Chris "ickle" Wilson's long series of error-handling cleanups during +the 1.5 series. + +Avoid undesired clipping when drawing scaled surface patterns with +bilinear filtering. + +cairo-pdf +--------- +Fix emission of 1-bit alpha masks in PDF output. + +Fix a bug that would cause glyphs to be misplaced along the Y axis: + + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%23474136 + + Originally, an issue about a crash, but later leading to the + misplaced glyphs issue being discovered. + +cairo-ps +-------- +Fix misplaced glyphs in cairo's PostScript output. + + This issue occurs when consecutive glyphs are placed far + apart. This case is exercised by the new ft-show-glyphs-table test + case, which was originally inspired by the Debian bug #23474136 + mentioned above. + +Fix more misplaced glyphs in cairo's PostScript output: + + The issue here showed up under very particular circumstance, (when + converting a PDF file with a CFF font with CID Identity-H encoding + and using glyph 0, (defined by the CFF specification as .notdef) + as a space instead). More concretely, this problem appeared when + converting the UbuntuDesktop.pdf file mentioned in this bug + report: + + https://bugs.freedesktop.org/show_bug.cgi?id=15348#c3 + + As usual with arcane font-encoding-specific bugs like this, many + thanks to Adrian Johnson for his magical ability to dive into + specifications and emerge almost instantaneously with fixes. And + thanks to Sebastien Bacher for bringing the bug to our attention. + +cairo-xlib +---------- +Fix serious failure on X servers without the Render extension. + + Since the 1.5.14 snapshot (with support for PseudoColor visuals), + any application attempting to create a "similar" xlib surface would + fail on an X server without the Render extension. Thanks to + Frederic Crozat for pointing out that cairo's test suite was + entirely failing when run against Xvfb. + +Avoid crashing cairo-xlib applications for too-large glyphs + + Naively sending glyphs of any size to the X server will eventually + violate the X limit on maximum request sizes. We now properly + detect when a glyph would be too large and use existing fallbacks + to render the glyph rather than trying to send it to the X server. + +Enable the buggy_repeat workaround for Xorg servers < 1.4 + + We have determined that Xorg 1.3.0 (as packaged in Fedora 8 at + least) has a bug that can result in an X server crash when cairo + uses certain X Render repeat operations, (as exercised by cairo's + extend-reflect test). We avoid this crash by using fallbacks + whenever a repeating surface is needed for any Xorg server with a + version less than 1.4. This is slower, but should prevent the + crash. + + (Meanwhile, there appears to be a separate bug where some X + servers or specific X-server drivers will use random pixmap data + when asked to draw a repeating surface. The buggy_repeat + workaround would also avoid those problems, but we have not yet + characterized whether the new "version < 1.4" is a good + characterization of those problems or not.) + +cairo-quartz-font +----------------- +Implement cairo_font_extents for this backend. + +The cairo-quartz-font implementation added in the 1.5.14 snapshot was +entirely missing support for the cairo_font_extents function. Thanks to +Richard Hult for pointing out this obvious shortcoming, (and obvious +lack of coverage in our test suite): + + CGFont backend returns 0 font extents + https://bugs.freedesktop.org/show_bug.cgi?id=15319 + +Snapshot 1.5.16 (2008-04-01 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the eighth snapshot in cairo's unstable 1.5 series. It comes +less than two weeks after the 1.5.14 snapshot and it really is a +legitimate snapshot, (in spite of sharing this date with that of many +bogus announcements). The major change in this snapshot is that the +cairo-quartz backend is now officially "supported", including new API +to construct a font face from a CGFontRef . Also several bug fixes +have been fixed in many backends. See below for details. + +general +------- +Cairo now depends on pixman 0.10.0 which was recently released. The +latest pixman release can always be found alongside cairo releases at: + + http://cairographics.org/releases + +Increase the precision of color stops for gradients. This fixes a +regression in gradient rendering that had been present since the +1.5.12 snapshot. + +paginated (all of ps, pdf, svg, and win32-printing) +--------------------------------------------------- +Fix assertion failure when some drawing elements are outside the page +boundaries, (this bug was noticed when using Inkscape to print a +drawing with landscape orientation to a portrait-oriented piece of +paper). + +cairo-ps +-------- +Fix of bug causing incorrect glyph positioning. + +Fix handling of CAIRO_OPERATOR_SOURCE. + +cairo-pdf +--------- +More reduction of unnecessary digits of precision in PDF output. + +Fix handling of CAIRO_OPERATOR_SOURCE. + +cairo-svg +--------- +Fix bug in usage of libpng that was preventing cairo_mask from working +with the svg backend. + +Fix transformation of source pattern for cairo_stroke(). + +cairo-win32-printing +-------------------- +Fix fallback resolution, (thanks again to inkscape users/developers +for helping us find this one). + +cairo-quartz +------------ +Mark the cairo-quartz backend as "supported" rather than +"experimental". This means the following: + + * The backend will now be built by default (if possible). + + * We are committing that the backend-specific API (as published in + cairo-quartz.h) are stable and will be supported in all future + cairo 1.x releases. + + * We are committing that the output quality of this backend + compares favorably with other cairo backends, (and that quality + is ensured by good results from the cairo test suite). + + * We recommend that distributions build and distribute this + backend when possible. + +Note that the cairo_quartz_image API (in cairo-quartz-image.h) is +still experimental, will not build by default, (pass +--enable-quartz-image to configure to build it), and may see API +changes before it is marked as "supported" in a future release. + +Put the CAIRO_FONT_TYPE_ATSUI name back into +cairo-deprecated.h. Without this, the cairo 1.5.14 snapshot broke all +builds for applications using the C++ cairomm bindings (and perhaps +others) which have the CAIRO_FONT_TYPE_ATSUI name in their header +files. This breakage happened even for applications not using +cairo-quartz at all. + + Note: Even though the CAIRO_FONT_TYPE_ATSUI name is provided to + avoid this build breakage, we still recommend that bindings and + applications move to the new, and more accurate, + CAIRO_FONT_TYPE_QUARTZ name. + +Replace the implementation of cairo-quartz-font to use CFFont instead +of ATSUI. The CGFont API is a better fit than ATSUI, and this new +implementation is also more correct than the old one as well. + +This also adds the following new API call: + + cairo_public cairo_font_face_t * + cairo_quartz_font_face_create_for_cgfont (CGFontRef font); + +The previous cairo_quartz_font_face_create_for_atsu_font_id function +continues to exist and is part of the supported API going +forward. (However, the old name of that same function, which was +cairo_atsui_font_face_create_for_atsu_font_id is officially +deprecated. Any source code using the old name should be updated to +use the new name.) + +Fix transformation of source pattern for cairo_stroke(). + +cairo-win32 +----------- +Avoid crash in create_similar is cairo_win32_surface_create fails. + +Snapshot 1.5.14 (2008-03-20 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the seventh snapshot in cairo's unstable 1.5 series. It comes +3 weeks after the 1.5.12 snapshot. This snapshot includes support for +arbitrary X server visuals, (including PseudoColor), which was the +final remaining cairo-specific item on the cairo 1.6 roadmap. It also +includes a huge number of improvements to the cairo-quartz backend. So +this is effectively a cairo 1.6 release candidate. We expect very few +changes from now until 1.6 and only for specific bug fixes. + +API Change +---------- +Rename ATSUI font backend to Quartz font backend. This affects the +following usage: + + --enable-atsui -> --enable-quartz-font + CAIRO_HAS_ATSUI_FONT -> CAIRO_HAS_QUARTZ_FONT + CAIRO_FONT_TYPE_ATSUI -> CAIRO_FONT_TYPE_QUARTZ + + cairo_atsui_font_face_create_for_atsu_font_id -> + cairo_quartz_font_font_create_for_atsu_font_id + +This API change is justified by the cairo-quartz backend still be +marked as "experimental" rather than "supported", (though this is one +step toward making the change to "supported" before 1.6). Cairo will +still provide ABI compatibility with the old symbol name, however. + +paginated (all of ps, pdf, svg, and win32-printing) +--------------------------------------------------- +Optimize by not analyzing an image surface for transparency more than +once, (previously all images were analyzed twice). + +cairo-ps and cairo-pdf +---------------------- +Avoiding emitting a matrix into the stroke output when unnecessary, +(making output size more efficient). + +Reduce rounding error of path shapes by factoring large scale factors +out of the path matrix, (ensuring that a fixed-number of printed +digits for path coordinates contains as much information as possible). + +Reduce excess digits for text position coordinates. This makes the +output file size much smaller without making the result any less +correct. + +cairo-ps +-------- +Eliminate bug causing extraneous text repetition on Linux PostScript +output in some cases. + + See: Mozilla Bug 419917 – Printed page contents are reflected + inside bordered tables (Linux-only) + + https://bugzilla.mozilla.org/show_bug.cgi?id=419917 + +Optimize output when EXTEND_PAD is used. + +cairo-pdf +--------- +Fix to not use fill-stroke operator with transparent fill, (else PDF +output doesn't match the cairo-defined correct result). See: + + https://bugs.launchpad.net/inkscape/+bug/202096 + +cairo-svg +--------- +Fix stroke of path with a non-solid-color source pattern: + + http://bugs.freedesktop.org/show_bug.cgi?id=14556 + +cairo-quartz +------------ +Fix text rendering with gradient or image source pattern. + +Handling antialiasing correctly for cairo_stroke(), cairo_clip(), and +cairo_show_text()/cairo_show_glyphs(). + +Correctly handle gradients with non-identity transformations: + + Fixes http://bugs.freedesktop.org/show_bug.cgi?id=14248 + +Add native implementation of REPEAT and REFLECT extend modes for +gradients. + +Fix implementation for the "unbounded" operators, (CAIRO_OPERATOR_OUT, +_IN, _DEST_IN, and _DEST_ATOP). + +Correctly handle endiannees in multi-architecture compiles on Mac OS +X. + +Avoid behavior which would cause Core Graphics to print warnings to +the console in some cases. + +cairo-win32 +----------- +Fix handling of miter limit. + +cairo-win32-printing +-------------------- +Fix to not use a 1bpp temporary surface in some cases while printing, +(so grayscale data is preserved rather than just becoming black and +white). + +cairo-xlib +---------- +Add support for rendering to arbitrary TrueColor X server +visuals. This fixes at least the following bugs: + + cairo doesn't support 8-bit truecolor visuals + https://bugs.freedesktop.org/show_bug.cgi?id=7735 + + cairo doesn't support 655 xlib format + https://bugs.freedesktop.org/show_bug.cgi?id=9719 + +Add support for rendering to 8-bit PseudoColor X server visuals. This +fixes the following bug: + + Cairo doesn't support 8-bit pseudocolor visuals + https://bugs.freedesktop.org/show_bug.cgi?id=4945 + +Snapshot 1.5.12 (2008-02-28 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the sixth snapshot in cairo's unstable 1.5 series. It comes 1 +week after the 1.5.10 snapshot. This snapshot includes the +long-awaited change from 16.16 to 24.8 fixed-point values, (see below +for why you should care). It also includes several backend-specific +bug fixes. + +24.8 fixed-point format +----------------------- +Cairo has always converted path coordinates to a fixed-point +representation very early in its processing. Historically, this has +been a 32-bit representation with 16 bits of integer for the +device-pixel grid and 16 bits of sub-pixel positioning. The choice of +16 bits for the integer coordinate space was based on the 16-bit limit +for X Window drawables. + +This 16-bit limit has proven problematic for many applications. It's +an especially vexing problem when targeting non-X backends that don't +have any 16-bit restriction. But even when targeting cairo-xlib, it's +often desirable to draw a large shape, (say a background rectangle), +that extends beyond the surface bounds and expect it to fill the +surface completely, (rather than overflowing and triggering random +behavior). + +Meanwhile, nobody has ever really needed 16 bits of sub-pixel +precision. + +With this snapshot, the fixed-point system is still in place and is +still using a 32-bit representation, (future versions of cairo might +move entirely to floating-point when targeting PDF output for +example). But the representation now provides 24 bits of pixel +addressing and only 8 bits of sub-pixel positioning. This should give +a much less stifling space to many applications. + +However, the underlying pixman library still has 16-bit limitations in +many places, (it has its roots in the X server as well). Until those +are also fixed, applications targeting cairo image surfaces, or +hitting software fallbacks when targeting other surfaces will still +encounter problems with device-space values needing more than 16 +integer bits. + +generic fixes +------------- +Add a few tests to the test suite to increase coverage. + +Cleanup a few error-handling paths, (propagate error correctly). + +cairo-ft +-------- +Fix handling of font sizes smaller than 1 device pixel. + +cairo-pdf +--------- +Fix to properly save/restore clip when analyzing meta-surface +patterns, (fixing a couple of test-suite failures). + +Implement native support for CAIRO_OPERATOR_SOURCE when the source +pattern is opaque. + +Emit rectangles as PDF rectangles ("re" operator) rather than as +general paths. + +cairo-ps +-------- +Fix to work properly with the 16.16->24.8 change. + +cairo-svg +--------- +Fix CAIRO_EXTEND_REFLECT by using an image fallback, (there's no +direct SVG support for reflected patterns). + +Fix the use of alpha-only masks, (such as CAIRO_FORMAT_A8). + +cairo-quartz +------------ +Add new API for efficiently using image data as a source: + + cairo_surface_t * + cairo_quartz_image_surface_create (cairo_surface_t *image_surface); + + cairo_surface_t * + cairo_quartz_image_surface_get_image (cairo_surface_t *surface); + +For full documentation, see: + + http://cairographics.org/manual/cairo-Quartz-Surfaces.html#cairo-quartz-image-surface-create + +Several fixes for cairo_mask(). + +cairo-atsui +----------- +Change default from from Monaco to Helvetica to be more consistent +with other font backends. + +Snapshot 1.5.10 (2008-02-20 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the fifth snapshot in cairo's unstable 1.5 series. It comes 3 +weeks after the 1.5.8 snapshot. This snapshot adds one new API +function, (cairo_has_current_point), and the usual mix of +improvements, (more efficient PostScript/PDF output, optimized +stroking), and fixes (more robust error-handling, etc.). See below for +details. + +New API +------- +Add a new function to query if there is a current point: + + cairo_bool_t + cairo_has_current_point (cairo_t *cr); + +There is no current point immediately after cairo_create(), nor after +cairo_new_path() or cairo_new_sub_path(). There is a current point +after any of the path-creation functions, (cairo_move_to, +cairo_line_to, cairo_curve_to, etc.). + +With this new function, we also revert the change of the return type +of cairo_get_current_point from cairo 1.5.8, (it's now a void function +again). + +Optimizations +------------- +Optimize stroking code to avoid repeated calculation of redundant +values, (particularly significant for very large, offscreen paths). + +General fixes +------------- +Patch a few more potential buffer overruns, (due to integer +overflow). + +Many fixes and improvements to cairo's error-handling, (ensure that +correct error values are returned, clean up memory leaks on +error-handling paths, etc.). + +Fix a potential infinite loop when stroking a spline with a pen that +has been transformed to a line segment. + +Remove treating NULL as a synonym for a valid cairo_font_options_t* +with default values, (a change that had been introduced as of cairo +1.5.8). + +Remove the altered handling of tolerance and fallback-resolution that +had been introduced as of cairo 1.5.4. + +cairo-xlib +---------- +Pass the original Drawable, (as opposed to the root window), to +XCreatePixmap when creating a similar surface. This gives the X server +more information so that it can be clever and efficient. + +cairo-pdf +--------- +Fix the rendering of repeating and reflecting patterns. + +Ensure miter limit is always >= 1, (smaller limits are not meaningful, +but they can cause some PDF viewers to fail to display pages). + +Generate more efficient output when the same path is used for both +fill and stroke. + +cairo-ps +-------- +Start sharing much of the cairo-pdf code rather than implementing very +similar code in cairo-ps. + +Implement native support for repeating and reflecting linear +gradients. + +Implement reflected surface patterns. + +Ensure miter limit is always >= 1, (smaller limits are not meaningful, +but they can cause some PostScript viewers to crash). + +Generate PostScript that will perform more efficiently and use less +memory on printers, (use currentfile instead of a giant string array +for image data, and avoid using PostScript patterns for paint() and +fill() when possible). + +cairo-svg +--------- +Avoid unnecessary rasterization when copying a "similar" surface to +another svg surface, (allow the SOURCE operator to be implemented with +all-vector operations if there are no underlying objects). + +cairo-atsui +----------- +Eliminate infinite loop when attempting to render an empty string. + +Snapshot 1.5.8 (2008-01-30 Carl Worth <cworth@cworth.org>) +========================================================== +This is the fourth snapshot in cairo's unstable 1.5 series. It comes 2 +weeks after the 1.5.6 snapshot. It adds a few new API functions. Most +notably all callers of cairo_image_surface_create_for_data should now +be calling cairo_format_stride_for_width to compute a legal stride +value. See below for more details. + +New API in cairo 1.5.8 +---------------------- +We've added a new function that should be called to compute a legal +stride value before allocating data to be used with +cairo_image_surface_create_for_data: + + int + cairo_format_stride_for_width (cairo_format_t format, + int width); + +We've also added a new cairo_path_extents function that can be used to +compute a bounding box for geometry such as a single line segment, +(contrast with cairo_path_extents and cairo_stroke_extents): + + void + cairo_path_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +And finally, we've added a function to allow for querying the +XRenderPictFormat of a cairo-xlib surface: + + XRenderPictFormat * + cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface); + +API changes +----------- +Fix return types of cairo_surface_show_page and +cairo_surface_copy_page. This is an API change to functions that are +new in the 1.5 series, so not an API break compared to any stable +cairo release, (1.0.x, 1.2.x, 1.4.x). + +Change the return type of cairo_get_current_point() from void to +cairo_status_t. This allows the caller to receive a +CAIRO_STATUS_NO_CURRENT_POINT value to distinguish the a current point +at the origin from no current point existing. + +Performance improvement +----------------------- +Improve performance of clipping by using an optimized code path +internally, (with the ADD operator instead of IN). + +General bug fixes +----------------- +Fix various cairo_*_extents functions to initialize the return-value +variables even in the case of a cairo_t in error. + +Treat NULL as a legitimate value for cairo_font_options_t*. [NOTE: +On discussion afterwards, we decided against this change so it has +been removed as of cairo 1.5.10.] + +Fix rendering with CAIRO_ANTIALIAS_NONE to be more predictable, (that +is, to avoid seams appearing when geometry and imagery share an +identical edge). Portions of this fix are in the pixman library and +will appear in a future release of that library. + +Avoid triggering an error for a font size of 0. + +Miscellaneous changes +--------------------- +Require pixman >= 0.9.6. + +There has been a tremendous amount improvement to cairo's +documentation. We're delighted that 100% of the public API has at +least some documentation in the API reference manual. Many thanks to +Behdad Esfahbod and Nis Martensen for leading this effort. + +cairo-pdf and cairo-ps +---------------------- +Eliminate failure when a Type 1 font is embedded with an explicit +glyph 0. + +cairo-pdf +--------- +Implement a more correct and more efficient approach for patterns with +an extend mode of CAIRO_EXTEND_REFLECT. + +cairo-ps +-------- +Fix image masks to properly pack and pad mask bits. + +cairo-quartz +------------ +Take care to only use DrawTiledImage for integer-aligned images, (and +use slower paths to get the correct result in other cases). + +cairo-win32 +----------- +Fix for older versions of mingw. + +Improve the handling of the clipping with the win32 and win32-printing +surfaces. + +Fix rendering of non black/white text. + +Snapshot 1.5.6 (2008-01-15 Carl Worth <cworth@cworth.org>) +========================================================== +This is the third snapshot in cairo's unstable 1.5 series. It comes +about 6 weeks after the 1.5.4 snapshot. The only API addition compared +to 1.5.4 is very minor, (a new value CAIRO_STATUS_TEMP_FILE_ERROR). +The remainder of the changes are the usual accumulation of bug fixes +and improvements. See below for details. + +General bug fixes +----------------- +Fix handling of fonts that contain a mixture of outline and bitmapped +glyphs. There was a change in this handling in 1.5.4 that improved +some cases and also regressed other cases. Now, all cases should be +handled quite well. + +Fix alignment issues that were causing SIGBUS failures on SPARC. + +Fix a regression (which first appeared in 1.5.2) where stroking under +a large scale would sometimes incorrectly replace a miter join with a +bevel join. (Thanks to Keith Packard.) + +Fix reporting of zero-sized extents to be {0,0} rather than +{INT_MAX,INT_MIN}. This avoids several integer overflow and +allocations of massive regions in some cases. + +Fix failures of gradients with no stops, (quartz, ps, and pdf). + +Fix handling of Type 1 fonts on Windows platforms. + +Fix handling of Type 1 fonts with no specific family name in the font +itself, (generate a CairoFont-x-y name). + +Handle NULL string values in cairo_show_text, cairo_show_glyphs, and +friends. + +Many robustness improvements along error-handling paths, (thanks as +always, to Chris "ickle" Wilson). + +Various other minor fixes. + +Paginated backends (PDF/PostScript/win32-printing) +-------------------------------------------------- +Avoid unnecessary rasterization when using a paginated surface as a +source, (such as drawing from one pdf surface to another). + +Fix replaying of paginated surface with more than one level of push/pop +group. + +cairo-xlib +---------- +Fix xlib backend to not consider recent X server release as having a +buggy repeat implementation in the Render extension. + +cairo-pdf +--------- +Fix PDF output to avoid triggering very slow rendering in PDF viewers, +(avoid starting and stopping the content stream for each pattern +emission). + +Support CAIRO_OPERATOR_SOURCE in cases where there is nothing below +the object being drawn. + +Fix to avoid seams appearing between multiple fallback regions. + +cairo-ps (PostScript) +--------------------- +Use correct bounding box in Type 3 fonts. + +Fix several bugs in cairo's PostScript output. These include making +the PostScript output more compatible with recent versions of +ghostscript that are more strict about Type 3 fonts, for +example. + +Fix for win32 to not attempt to create temporary files in the root +directory, (where the user may not have write permission). + +Avoid generating Level 3 PostScript if Level 2 is sufficient. Also, +add code in output documents to alert the user if Level 3 PostScript +is handed to a device that cannot handle PostScript beyond Level +2. + +cairo-directfb +-------------- +Various performance optimizations. + +Fixed support for small surfaces (less than 8x8). + +Provide support for environment variables CAIRO_DIRECTFB_NO_ACCEL to +disable acceleration and CAIRO_DIRECTFB_ARGB_FONT to enable ARGB fonts +instead of A8. + +cairo-os2 +--------- +Allow OS/2 APIs instead of C library allocation functions. + +Snapshot 1.5.4 (2007-12-05 Carl Worth <cworth@cworth.org>) +========================================================== +This is the second snapshot in cairo's unstable 1.5 series. It comes +just over 1 month after the 1.5.2 snapshot. There are no API changes +or additions in 1.5.4 compared to 1.5.2, but there are several bug +fixes, and some optimizations. Most of these apply to particular +backends. See below for details. + +General improvements +-------------------- +Use less memory for spline approximation calculations. + +Change how the tolerance value is interpreted with regard to +fallback-resolution. [Note: On further discussion, we decided against +this change for now. It is removed as of cairo 1.5.10.] + +Fix precision of floating-point values in vector-output backends to +avoid rounding errors with very small numbers. + +Xlib improvements +----------------- +Fix bug in glyph rendering with xlib, (due to everything being clipped +out). This was a regression in the 1.5.2 snapshot that was visible in +the GIMP, for example. See: + + cairo 1.5.2 causes font problems in GIMP 2.4 status bar and evolution 2.12.1 + https://bugs.freedesktop.org/show_bug.cgi?id=13084 + +PostScript improvements +----------------------- +Fix bug leading to invalid PostScript files when rendering +text, (need "0 0 xyshow" instead of "0 xyshow"). + +Fix many issues with Type 3 fonts, including making the resulting text +extractable. + +Quartz improvements +------------------- +Fix font metrics height value for ATSUI, (helps webkit on GTK+ OS X +layout nicely). + +Fix gradients. + +Fix EXTEND_NONE mode for patterns. + +Fix cairo_quartz_surface_create to properly clear the new surface +in cairo_quartz_surface_create. + +Fix to correctly handle 0x0 sized surfaces. + +Optimize drawing of EXTEND_REPEAT patterns for OS X 10.5. + +Snapshot 1.5.2 (2007-10-30 Carl Worth <cworth@cworth.org>) +========================================================== +This is the first snapshot in cairo's unstable 1.5 series. It comes 4 +months after the 1.4.10 release. This snapshot includes significant +improvements to PDF and PostScript output, which is one of the things +in which we're most interested in getting feedback. There are a couple +of minor API additions, and several optimizations, (primarily in the +"print/vector" backends). And there are dozens of bug fixes and +robustness improvements. + +New dependency on external pixman library +----------------------------------------- +A significant change in this snapshot compared to all previous cairo +releases is that cairo now depends on an external "pixman" library for +its software rendering. Previously this same code was compiled +internally as part of cairo, but now the code is separate so that both +cairo and the X server can now share common code, (thanks very much to +Søren Sandmann for his work on separating pixman and maintaining it). + +So users will need to acquire and build pixman before being able to +build cairo. The current release is 0.9.6 and can be obtained from +here: + + http://cairographics.org/releases/pixman-0.9.6.tar.gz + + which can be verified with: + + http://cairographics.org/releases/pixman-0.9.6.tar.gz.sha1 + 66f01a682c64403a3d7a855ba5aa609ed93bcb9e pixman-0.9.6.tar.gz + + http://cairographics.org/releases/pixman-0.9.6.tar.gz.sha1.asc + (signed by Carl Worth) + +Major PDF/PostScript improvements +--------------------------------- +Adrian Johnson has done some long-awaited work to make cairo's PDF and +PostScript output more interesting than ever before. First, many +operations that previously triggered image fallbacks will now be +rendered as native vectors. These operations include: + + PDF: cairo_push_group, cairo_surface_create_similar, + cairo_mask, A8/A1 surface sources, repeating/reflecting linear + gradients. + + PostScript: cairo_push_group, cairo_surface_create_similar, + gradients, bilevel alpha masks, (for example, all values either 0 or + 255 for an A8 mask). + +Not only that, but when an image fallback is required, it will now be +limited to only the necessary region. For example, a tiny translucent +image overlaying a small portion of text would previously caused an +entire PostScript page to be rendered as a giant image. Now, the +majority of that page will be nice text, and there will only be a tiny +image in the output. + +Additionally, the PostScript output now carefully encodes text so that +if it is subsequently converted to PDF, the text will be +selectable. + +This is very exciting progress, and we're hoping to hear from users +during the 1.5 series about how things have improved, (for example, +inkscape users doing cairo-based PDF export: please let us know how +things look). And feel free to pass your thanks along to Adrian for his excellent work. + +NOTE: This much improved PDF output makes more sophisticated use of +functionality in the PDF specification. This means that cairo's output +will sometimes expose bugs in some free software PDF viewers, (evince, +poppler, and xpdf, for example), that are not yet ready for such PDF +files. We're working with the poppler maintainers to get these bugs +fixed as quickly as possible. In the meantime, please double-check +with other PDF viewers if cairo-generated PDF files are not being +rendered correctly. It may be due to a bug in the viewer rather than +in the PDF file that cairo has created. + +Robustness improvements +----------------------- +Chris Wilson has made the largest contribution by far to cairo 1.5.2, +(in number of commits). His more than 150 commits include a huge +number of fixes to increase cairo's robustness. These fixes make cairo +more robust against invalid and degenerate input, (NaN, empty path, +etc.), against size-0 malloc calls, against memory leaks on +error-recovery paths, and against other failures during error +handling. He also implemented atomic operations to cairo, and used +them to fix cairo's previously non-thread-safe reference counting, +again improving robustness. + +Chris has put a tremendous amount of time and effort into writing +analysis tools for this work, and in running those tools and fixing +the problems they report. We're very grateful for this work, and hope +that all cairo users appreciate the more robust implementation that +results from it. + +This work is largely thankless, so it might make sense to notice +sometime that cairo has been running quite smoothly for you, and when +you do, send a quick "thank you" off to Chris Wilson, since it +is all definitely running smoother thanks to his work. + +New API +------- +There are no major additions to cairo's core API. The only new, +generic functions are: + + void + cairo_surface_copy_page (cairo_surface_t *surface); + + void + cairo_surface_show_page (cairo_surface_t *surface); + +which can now be used much more conveniently than the existing +cairo_copy_page and cairo_show_page functions in some +situations. These functions act identically, but require only a +cairo_surface_t* and not a cairo_t*. + +All other API additions are specific to particular backends. + +New cairo-win32 API (new font face function and "win32 printing" surface) +------------------------------------------------------------------------- +There is a new function for creating a win32 font face for both a +logfontw and an hfont together. This complements the existing +functions for creating a font face from one or the other: + + cairo_font_face_t * + cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, + HFONT font); + +There is also a new "win32 printing" surface: + + cairo_surface_t * + cairo_win32_printing_surface_create (HDC hdc); + +This interface looks identical to the original +cairo_win32_surface_create, (both accept and HDC), but the behavior of +this new surface is very different. It should only be called with a +printing DC, and will result in all drawing commands being stored into +a meta-surface and emitted after each page is complete, with analysis +to do as minimal image-based fallbacks as necessary. The behavior and +implementation shares much with the PDF and PostScript backends. + +New cairo-ps API (EPS and PostScript level control) +--------------------------------------------------- +An often requested feature has been the ability to generate +Encapsulated PostScript (EPS) with cairo. We have that now with the +following very simple API. Just do cairo_ps_surface_create as usual +then call this function with a true value: + + void + cairo_ps_surface_set_eps (cairo_surface_t *surface, + cairo_bool_t eps); + +[NOTE: As always with snapshots, it's possible---though not very +likely---that the API could still be modified before a final +release. For example, this is the first public cairo function that +accepts a Boolean parameter. I'm generally opposed to Boolean +parameters, but this is probably the one case where I'm willing to +accept one, (namely a "set" function that accepts a single Boolean).] + +Also, it is now possible to control what PostScript level to target, +(either level 2 or level 3), with the following new API: + + typedef enum _cairo_ps_level { + CAIRO_PS_LEVEL_2, + CAIRO_PS_LEVEL_3 + } cairo_ps_level_t; + + void + cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, + cairo_ps_level_t level); + + void + cairo_ps_get_levels (cairo_ps_level_t const **levels, + int *num_levels); + + const char * + cairo_ps_level_to_string (cairo_ps_level_t level); + +Improvement for cairo-quartz +---------------------------- +Brian Ewins had contributed several improvements to cairo-quartz. These +include an implementation of EXTEND_NONE for linear and radial +gradients, (so this extend mode will no longer trigger image fallbacks +for these gradients), as well as native surface-mask clipping, (only +on OS X 10.4+ where the CGContextClipToMask function is available). + +He also fixed a semantic mismatch between cairo and quartz for dashing +with an odd number of entries in the dash array. + +We're grateful for Brian since not many quartz-specific improvements +to cairo would be happening without him. + +Optimizations +------------- +Optimize SVG output for when the same path is both filled and stroked, +and avoid unnecessary identity matrix in SVG output. (Emmanuel Pacaud). + +Optimize PS output to take less space (Ken Herron). + +Make PS output more compliant with DSC recommendations (avoid initclip +and copy_page) (Adrian Johnson). + +Make PDF output more compact (Adrian Johnson). + +Release glyph surfaces after uploading them to the X server, (should +save some memory for many xlib-using cairo application). (Behdad +Esfahbod). + +Optimize cairo-win32 to use fewer GDI objects (Vladimir Vukicevic). + +win32-printing: Avoid falling back to images when alpha == 255 +everywhere. (Adrian Johnson). + +win32-printing: Avoid falling back for cairo_push_group and +cairo_surface_create_similar. (Adrian Johnson) + +Bug fixes +--------- +Avoid potential integer overflows when allocating large buffers +(Vladimir Vukicevic). + +Preparations to allow the 16.16 fixed-point format to change to +24.8 (Vladimir Vukicevic). + +Fix bugs for unsupported X server visuals (rgb565, rgb555, bgr888, and +abgr8888). (Carl Worth and Vladimir Vukicevic) + +Fix bugs in PDF gradients (Adrian Johnson). + +Fix cairo-xlib to build without requiring Xrender header +files (Behdad Esfahbod). + +Make cairo more resilient in the case of glyphs not being available in +the current font. (Behdad Esfahbod) + +Prevent crashes when both atsui and ft font backends are compiled in +(Brian Ewins). + +Make font subsetting code more robust against fonts that don't include +optional tables (Adrian Johnson). + +Fix CFF subsetting bug, (which manifested by generating PDF files that +Apple's Preview viewer could not read) (Adrian Johnson). + +Fixed error handling for quartz and ATSUI backends (Brian Ewins). + +Avoid rounding problems by pre-transforming to avoid integer-only +restrictions on transformation in GDI (Adrian Johnson). + +Fixed an obscure bug (#7245) computing extents for some stroked +paths (Carl Worth). + +Fix crashes due to extreme transformation of the pen, (seems to show +up in many .swf files for some reason) (Carl Worth). + +Release 1.4.10 (2007-06-27 Carl Worth <cworth@cworth.org>) +========================================================== +This is the fifth update in cairo's stable 1.4 series. It comes +roughly three weeks after the 1.4.8 release. The most significant +change in this release is a fix to avoid an X error in certain cases, +(that were causing OpenOffice.org to crash in Fedora). There is also a +semantic change to include child window contents when using an xlib +surface as a source, an optimization when drawing many rectangles, and +several minor fixes. + +Eliminate X errors that were killing OO.o (Chris Wilson) +-------------------------------------------------------- +Cairo is fixed to avoid the X errors propagated when cleaning up +Render Pictures after the application had already destroyed the +Drawable they reference. (It would be nice if the X server wouldn't +complain that some cleanup work is already done, but there you have +it.) This fixes the bug causing OpenOffice.org to crash as described +here: + + XError on right click menus in OOo. + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 + +Use IncludeInferiors when using xlib surface as a source (Ryan Lortie) +---------------------------------------------------------------------- +When an xlib surface is used as the source of a draw operation the +contents of child windows are now included in the source data. The +semantics of drawing to xlib surfaces are unchanged (ie: draws are +still clipped by child windows overlapping the destination window). + +Optimize drawing of many rectangles (Vladimir Vukicevic) +-------------------------------------------------------- +Avoid O(N*N) loop when filling many axis-aligned rectangles, (either +many rectangles as separate sub-paths or due to dashing). + +Miscellaneous fixes +------------------- +Fix cairo-perf on Solaris by linking to librt. (Behdad Esfahbod) + +Fix make check for systems that require executable files to have a +particular extension. (Behdad Esfahbod) + +Eliminate some warnings in cairo-quartz. (Brian Ewins) + +Fix build-breaking typo for cairo-directfb. (Chris Wilson) + +Release 1.4.8 (2007-06-07 Carl Worth <cworth@cworth.org>) +========================================================= +This is the fourth update in cairo's stable 1.4 series. It comes just +over five weeks after the 1.4.6 release. This release includes a +thread-safe surface-cache for solid patterns which significantly +improves text rendering with the xlib backend. Also, dozens of error +paths in cairo have been fixed thanks to extensive fault-injection +testing by Chris Wilson. + +Surface cache for solid patterns +-------------------------------- +Originally written by Jorn Baayen, the introduction of a small cache +for surfaces created for solid patterns improves performance +dramatically. For example, this reduces the volume of X requests +during text rendering to the same level as Xft. + +This cache first made its appearance in a 1.3.x snapshot, but was +removed before appearing in any previous major release due to +complications with multi-threaded programs. For example, programs like +evince that would carefully restrict usage of cairo-xlib to a single +thread were unpleasantly surprised to find that using cairo-image in a +separate thread could trigger X requests. + +Behdad Esfahbod designed a fix which was implemented by Chris +Wilson. Now, the necessary X requests are queued up until the next +time the application directly operates on an xlib surface. + +Improved error handling paths +------------------------------ +Chris Wilson continued the excellent work he started in cairo 1.4.4 to +make cairo much more robust against out-of-memory and other errors. He +applied his memory allocation fault injection cairo's main test suite, +(previously he had applied it to cairo's performance suite). + +Chris's testing found dozens of bugs which he fixed. Many of these +bugs had perhaps never been hit by any users. But at least one was +hit by the gnome-about program which resulted in dozens of duplicated +bug reports against that program: + + http://bugzilla.gnome.org/show_bug.cgi?id=431990 + +We were very pleasantly surprised to see this bug get fixed as a +side-effect of Chris's work. Well done, Chris! + +Other fixes +----------- +Cleanup of mutex declarations (Behdad Esfahbod) + +Remove unnecessary clip region from SVG output (Emmanuel Pacaud) + +Remove Xsun from the buggy_repeat blacklist (Elaine Xiong) + +ATSUI: Fix glyph measurement: faster and more correct (Brian Ewins) + +Quartz: fixed 'extend' behaviour for patterns, improved pattern performance, +and a few smaller correctness fixes. (Brian Ewins, Vladimir Vukicevic) + +Release 1.4.6 (2007-05-01 Carl Worth <cworth@cworth.org>) +========================================================= +This is the third update in cairo's stable 1.4 series. It comes a +little less than three weeks since the 1.4.4 release. This release +fixes the broken mutex initialization that made cairo 1.4.4 unusable +on win32, OS/2, and BeOS systems. This release also adds significant +improvements to cairo's PDF backend, (native gradients!), and a couple +of performance optimizations, (one of which is very significant for +users of the xlib backend). See below for more details. + +Repaired mutex initialization +----------------------------- +We apologize that cairo 1.4.4 did little more than crash on many +platforms which are less-frequently used by the most regular cairo +maintainers, (win32, OS/2, and BeOS). The mutex initialization +problems that caused those crashes should be fixed now. And to avoid +similar problems in the future, we've now started posting pre-release +snapshots to get better testing, (subscribe to cairo@cairographics.org +if you're interested in getting notified of those and testing them). + +PDF Improvements +---------------- +Thanks to Adrian Johnson, (cairo PDF hacker extraordinaire), we have +several improvements to cairo's PDF backend to announce: + +Native gradients: + + As of cairo 1.4.6, cairo will now generate native PDF gradients in + many cases, (previously, the presence of a gradient on any page + would force rasterized output for that page). Currently, only + gradients with extend types of PAD (the default) or NONE will + generate native PDF gradients---others will still trigger + rasterization, (but look for support for other extend modes in a + future release). Many thanks to Miklós Erdélyi as well, who did the + initial work for this support. + +Better compatibility with PDF viewers: + + The PDF output from cairo should now be displayed correctly by a + wider range of PDF viewers. Adrian tested cairo's PDF output against + many PDF viewers, identified a common bug in many of those viewers + (ignoring the CTM matrix in some cases), and modified cairo's output + to avoid triggering that bugs (pre-transforming coordinates and + using an identity matrix). + +Better OpenType/CFF subsetting: + + Cairo will now embed CFF and TrueType fonts as CID fonts. + +Performance optimizations +------------------------- +Faster cairo_paint_with_alpha: + + The cairo_paint_with_alpha call is used to apply a uniform alpha + mask to a pattern. For example, it can be used to gradually fade an + image out or in. Jeff Muizelaar fixed some missing/broken + optimizations within the implementation of this function resulting + in cairo_paint_with_alpha being up to 4 times faster when using + cairo's image backend. + +Optimize rendering of "off-screen" geometry: + + Something that applications often do is to ask cairo to render + things that are either partially or wholly outside the current clip + region. Since 1.4.0 the image backend has been fixed to not waste + too much time in this case. But other backends have still been + suffering. + + In particular, the xlib backend has often performed quite badly in + this situation. This is due to a bug in the implementation of + trapezoid rasterization in many X servers. + + Now, in cairo 1.4.6 there is a higher-level fix for this + situation. Cairo now eliminates or clips trapezoids that are wholly + or partially outside the clip region before handing the trapezoids + to the backend. This means that the X server's performance bug is + avoided in almost all cases. + + The net result is that doing an extreme zoom-in of vector-based + objects drawn with cairo might have previously brought the X server + to its knees as it allocated buffers large enough to fit all of the + geometry, (whether visible or not). But now the memory usage should + be bounded and performance should be dramatically better. + +Miscellaneous +------------- +Behdad contributed an impressively long series of changes that +organizes cairo's internals in several ways that will be very +beneficial to cairo developers. Thanks, Behdad! + +Behdad has also provided a utility for generating malloc statistics, +(which was used during the great malloc purges of 1.4.2 and +1.4.4). This utility isn't specific to cairo so may be of benefit to +others. It is found in cairo/util/malloc-stats.c and here are Behdad's +notes on using it: + + To build, do: + + make malloc-stats.so + + inside util/, and to use, run: + + LD_PRELOAD=malloc-stats.so some-program + + For binaries managed by libtool, eg, cairo-perf, do: + + ../libtool --mode=execute /bin/true ./cairo-perf + LD_PRELOAD="../util/malloc-stats.so" .libs/lt-cairo-perf + +Finally, the cairo-perf-diff-files utility was enhanced to allow for +generating performance reports from several runs of the same backend +while some system variables were changed. For example, this is now +being used to allow cairo-perf to measure the performance of various +different acceleration architectures and configuration options of the +X.org X server. + +Release 1.4.4 (2007-04-13 Carl Worth <cworth@cworth.org>) +========================================================= +This is the second update release in cairo's stable 1.4 series. It +comes just less than a month after 1.4.2. The changes since 1.4.2 +consist primarily of bug fixes, but also include at least one +optimization. See below for details. + +Of all the work that went into the 1.4.4 release + +There have been lots of individuals doing lots of great work on cairo, +but two efforts during the 1.4.4 series deserve particular mention: + +Internal cleanup of error handling, (Chris Wilson) +-------------------------------------------------- +Chris contributed a tremendous series of patches (74 patches!) to +improve cairo's handling of out-of-memory and other errors. He began +by adding gcc's warn_unused_attribute to as many functions as +possible, and then launched into the ambitious efforts of adding +correct code to quiet the dozens of resulting warnings. + +Chris also wrote a custom valgrind skin to systematically inject +malloc failures into cairo, and did all the work necessary to verify +that cairo's performance test suite runs to completion without +crashing. + +The end result is a much more robust implementation. Previously, many +error conditions would have gone unnoticed and would have led to +assertion failures, segmentation faults, or other harder-to-diagnose +problems. Now, more than ever, cairo should cleanly let the user know +of problems through cairo_status and other similar status +functions. Well done, Chris! + +More malloc reduction, (Mathias Hasselmann) +------------------------------------------- +After 1.4.0, Behdad launched an effort to chase down excessive calls +to malloc within the implementation of cairo. He fixed a lot of +malloc-happy objects for 1.4.2, but one of the worst offenders, +(pixman regions), was left around. Mathias contributed an excellent +series of 15 patches to finish off this effort. + +The end result is a cairo that calls malloc much less often than it +did before. Compared to 1.4.2, 55% of the calls to malloc have been +eliminate, (and 60% have been eliminated compared to 1.4.0). Well +done, Mathias! + +Other improvements since 1.4.2 +------------------------------ +• Centralize mutex declarations (will reduce future build breaks), + (Mathias Hasselmann) + +• Reduce malloc by caching recently freed pattern objects (Chris + Wilson) + +• Fix some broken composite operations (David Reveman) + https://bugs.freedesktop.org/show_bug.cgi?id=5777 + +Backend-specific fixes +---------------------- +PDF: + • Use TJ operator for more compact representation of glyphs (Adrian + Johnson) + + • Fix glyph positioning bug when glyphs are not horizontal + http://lists.freedesktop.org/archives/cairo/2007-April/010337.html + +win32: + • Fix crash when rendering with bitmap fonts (Carl Worth) + https://bugzilla.mozilla.org/show_bug.cgi?id=376498 + +xlib: + • Turn metrics-hinting on by default (Behdad Esfahbod) + + • Fix edge-effect problem with transformed images drawn to xlib + (Behdad Esfahbod) + https://bugs.freedesktop.org/show_bug.cgi?id=10508 + + • Avoid dereferencing a NULL screen. (Chris Wilson) + https://bugs.freedesktop.org/show_bug.cgi?id=10517 + +Quartz/ATSUI: + • Fix scaling of glyph surfaces + (Brian Ewins) + https://bugs.freedesktop.org/show_bug.cgi?id=9568 + + • Fix compilation failure when both xlib and quartz enabled + (Brian Ewins) + + • Fix rounding bug leading to incorrectly positioned glyphs + (Robert O'Callahan) + https://bugs.freedesktop.org/show_bug.cgi?id=10531 + +Release 1.4.2 (2007-03-19 Carl Worth <cworth@cworth.org>) +========================================================= +This is the first update release in cairo's stable 1.4 series. It +comes just less than 2 weeks after 1.4.0. We hadn't anticipated an +update this early, but we've managed to collect some important fixes +that we wanted to get out to cairo users as soon as possible, (6 fixes +for crashes, 1 case where graphical elements would not be drawn at +all, a handful of backend-specific bugs, and several important build +fixes). + +There's almost nothing but bug fixes in this release, (see below one +optimization that Behdad did sneak in), so we recommend that everyone +upgrade to this release when possible. + +Thanks to the many people that worked to fix these bugs, and those +that did the work to report them and to test the fixes, (wherever +possible both names are credited below). + +Critical fixes +-------------- +• Fix a crash due to a LOCK vs. UNLOCK typo (M. Drochner fixing Carl + Worth's embarrassing typo). + + http://bugs.freedesktop.org/show_bug.cgi?id=10235 + +• Fix potential buffer overflow, which on some systems with a checking + variant of snprintf would lead to a crash (Adrian Johnson, Stanislav + Brabec, and sangu). + + https://bugs.freedesktop.org/show_bug.cgi?id=10267 + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=232576 + +• Fix a crash in cairo_stroke_extents or cairo_in_stroke when line + width is 0.0. (Carl Worth and Sebastien Bacher) + + https://bugs.freedesktop.org/show_bug.cgi?id=10231 + +• Fix a crash on certain combinations of X server/video drivers (Carl + Worth and Tomas Carnecky). + + https://bugs.freedesktop.org/show_bug.cgi?id=10250 + +• Fix a crash due to mishandling of invalid user input (Carl Worth and + Alexander Darovsky). + + https://bugs.freedesktop.org/show_bug.cgi?id=9844 + +• xlib: Cleanup server-side glyph caches on XCloseDisplay. This + eliminated a crash detected by the perf suite, (and that + applications could have run into as well). (Chris Wilson) + +Other bug fixes +--------------- +• Fix for some geometry which simply disappeared under some + transformations---a stroked line with an extreme skew in X, for + example (Carl Worth and Jonathan Watt). + + https://bugzilla.mozilla.org/show_bug.cgi?id=373632 + +• SVG: Fix radial gradients for CAIRO_EXTEND_REFLECT and when r0 > r1 + (Emmanuel Pacaud). + +• PDF: Set page group color space to DeviceRGB. + + This fixes incorrect (muddy) transparent colors when rendering cairo + PDF output in some viewers. (Adrian Johnson, Adam Goode, and + MenTaLguY). + + http://lists.freedesktop.org/archives/cairo/2006-November/008551.html + +• win32: Return correct metrics when hinting is off, and fix font + descent computation (Behdad Esfahbod). + +• quartz: Fix glyph interfaces to correctly return user-space rather + than device-space coordinates (Brian Ewins). + + https://bugs.freedesktop.org/show_bug.cgi?id=9568 + +• xcb: Fix parameter-order confusion with xcb_create_pixmap, which now + makes all tests that pass with xlib now pass with xcb (Carl Worth, + Jamey Sharp). + +• Fix some memory leaks in the perf suite (Chris Wilson). + +• Fix perf suite to consider changes in pixman/src (Mathias + Hasselmann). + +Build fixes +----------- +• Don't include pre-generated cairo-features.h file. This was causing + build failures when building with the directfb backend enabled + (Behdad Esfahbod). + + https://bugs.freedesktop.org/show_bug.cgi?id=10189 + +• Eliminate use of maintainer mode from cairo's automake/configure + script. This means that updates to files such as Makefile.am will + take effect, (by rerunning automake and friends as necessary) when + invoking make rather than being silently ignored. (Behdad Esfahbod) + +• Don't compile cairo-deflate-stream.c, which depends on zlib, unless + building the pdf backend which requires it. (Carl Worth, Tor + Lillqvist) + + https://bugs.freedesktop.org/show_bug.cgi?id=10202 + +• Don't make the ps backend link against zlib anymore, since it + doesn't require it (Carl Worth). + +• Use "find !" rather than "find -not" for better portability (Thomas + Klausner). + + https://bugs.freedesktop.org/show_bug.cgi?id=10226 + +• Don't use unsupported visibility attribute "hidden" on Solaris + (Gilles Dauphin, Thomas Klausner). + + https://bugs.freedesktop.org/show_bug.cgi?id=10227 + +Optimization +------------ +• It was Behdad that suggested we focus strictly on bug fixes now that + we shipped so many performance improvements in 1.4.0, but it was + also Behdad that got distracted by the chance to remove a lot of + mallocs from cairo. Paths, gstates, trapezoids, splines, polygons, + and gradient color stops will now use small, stack-allocated buffers + in the most common cases rather than calling malloc as + often. (Behdad Esfahbod). And look for more from Mathias Hasselmann + soon. + +Release 1.4.0 (2007-03-06 Carl Worth <cworth@cworth.org>) +========================================================= +The many people[*] who have been working hard on cairo are very +pleased to announce the long-awaited release of cairo 1.4. This +release comes 4 months after the last stable update release (1.2.6) +and 9 months since the initial release of 1.2.0. + +The release notes below are intended to capture the highlights of the +changes that have occurred from the 1.2 series to the new 1.4.0 +release. + +Performance improvements +------------------------ +Within the cairo project, the last 6 months or so has seen an intense +effort focusing on the performance of cairo itself. That effort has +paid off considerably, as can be seen in the following highlights of +some of the performance differences from cairo 1.2.6 to cairo 1.4.0. + +(Note: The performance results reported here were measured on an x86 +laptop. Many of the improvements in 1.4---particular those involving +text rendering---are even more dramatic on embedded platforms without +hardware floating-point units. Such devices played an important part +of many of the optimizations that found their way into cairo over the +last few months.) + +• Dramatic improvement when drawing objects that are mostly off-screen + with the image backend (with the xlib backend this case is still + slow due to an X server bug): + + image-rgba long-lines-uncropped-100 479.64 -> 4.98: 96.24x speedup + ███████████████████████████████████████████████▋ + +• Dramatic improvement when copying a small fraction of an image + surface to an xlib surface: + + xlib-rgba subimage_copy-512 3.93 -> 0.07: 54.52x speedup + ██████████████████████████▊ + +• Dramatic improvement to tessellation speed for complex objects: + + image-rgb tessellate-256-100 874.16 -> 34.79: 25.13x speedup + ████████████■+ xlib-rgba zrusin_another_fill-415 148.40 -> 13.85: 10.72x speedup + ████▉ + xlib-rgb world_map-800 680.20 -> 345.54: 1.97x speedup + ▌ + +• Dramatic improvement to the speed of stroking rectilinear shapes, + (such as the outline of a rectangle or "box"): + + image-rgb box-outline-stroke-100 0.18 -> 0.01: 24.22x speedup + ███████████▋ + xlib-rgb box-outline-stroke-100 0.46 -> 0.06: 8.05x speedup + ███▌ + + +• Dramatic improvements to text rendering speeds: + + xlib-rgba text_image_rgba_over-256 63.12 -> 9.61: 6.57x speedup + ██▊ + +• 3x improvements to floating-point to fixed-point conversion speeds: + + image-rgba pattern_create_radial-16 9.29 -> 3.44: 2.70x speedup + ▉ + +• 2x improvements to linear gradient computation: + + image-rgb paint_linear_rgb_source-512 26.22 -> 11.61: 2.26x speedup + ▋ + +• 2x improvement to a case common in PDF rendering: + + image-rgb unaligned_clip-100 0.10 -> 0.06: 1.81x speedup + ■+ +• 1.3x improvement to rectangle filling speed (note: this improvement + is new since 1.3.16---previously this test case was a 1.3x slowdown + compared to 1.2.6): + + image-rgba rectangles-512 6.19 -> 4.37: 1.42x speedup + ▎ + xlib-rgba rectangles-512 7.48 -> 5.58: 1.34x speedup + ■+ +NOTE: In spite of our best efforts, there are some measurable +performance regressions in 1.4 compared to 1.2. It appears that the +primary problem is the increased overhead of the new tessellator when +drawing many, very simple shapes. The following test cases capture +some of that slowdown: + + image-rgba mosaic_tessellate_lines-800 11.03 -> 14.29: 1.30x slowdown + ■+ image-rgba box-outline-fill-100 0.01 -> 0.01: 1.26x slowdown + ■+ image-rgba fill_solid_rgb_over-64 0.20 -> 0.22: 1.12x slowdown + + image-rgba fill_image_rgba_over-64 0.23 -> 0.25: 1.10x slowdown + + xlib-rgb paint_image_rgba_source-256 3.24 -> 3.47: 1.07x slowdown + +We did put some special effort into eliminating this slowdown for the +very common case of drawing axis-aligned rectangles with an identity +matrix (see the box-outline-stroke and rectangles speedup numbers +above). Eliminating the rest of this slowdown will be a worthwhile +project going forward. + +Also note that the "box-outline-fill" case is a slowdown while +"box-outline-stroke" is a (huge) speedup. These two test cases +resulted from the fact that some GTK+ theme authors were filling +between two rectangles to avoid slow performance from the more natural +means of achieving the same shape by stroking a single rectangle. With +1.4 that workaround should definitely be eliminated as it will now +cause things to perform more slowly. + +Greatly improved PDF output +--------------------------- +We are very happy to be able to announce that cairo-generated PDF +output will now have text that can be selected, cut-and-pasted, and +searched with most capable PDF viewer applications. This is something +that was not ever possible with cairo 1.2. + +Also, the PDF output now has much more compact encoding of text than +before. Cairo is now much more careful to not embed multiple copies of +the same font at different sizes. It also compresses text and font +streams within the PDF output. + +API additions +------------- +There are several new functions available in 1.4 that were not +available in 1.2. Curiously, almost all of the new functions simply +allow the user to query state that has been set in cairo (many new +"get" functions) rather than providing any fundamentally new +operations. The new functionality is: + +• Getting information about the current clip region + + cairo_clip_extents + cairo_copy_clip_rectangle_list + cairo_rectangle_list_destroy + +• Getting information about the current dash setting + + cairo_get_dash_count + cairo_get_dash + +• Getting information from a pattern + + cairo_pattern_get_rgba + cairo_pattern_get_surface + cairo_pattern_get_color_stop_rgba + cairo_pattern_get_color_stop_count + cairo_pattern_get_linear_points + cairo_pattern_get_radial_circles + +• Getting the current scaled font + + cairo_get_scaled_font + +• Getting reference counts + + cairo_get_reference_count + cairo_surface_get_reference_count + cairo_pattern_get_reference_count + cairo_font_face_get_reference_count + cairo_scaled_font_get_reference_count + +• Setting/getting user data on objects + + cairo_set_user_data + cairo_get_user_data + cairo_pattern_set_user_data + cairo_pattern_get_user_data + cairo_scaled_font_set_user_data + cairo_scaled_font_get_user_data + +• New cairo-win32 functions: + + cairo_win32_surface_create_with_ddb + cairo_win32_surface_get_image + cairo_win32_scaled_font_get_logical_to_device + cairo_win32_scaled_font_get_device_to_logical + +API deprecation +--------------- +The CAIRO_FORMAT_RGB16_565 enum value has been deprecated. It never +worked as a format value for cairo_image_surface_create, and it wasn't +necessary for supporting 16-bit 565 X server visuals. + +A sampling of bug fixes in cairo 1.4 +------------------------------------ + • Fixed radial gradients + • Fixed dashing (degenerate and "leaky" cases) + • Fixed transformed images in PDF/PS output (eliminate bogus repeating) + • Eliminate errors from CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD + • cairo_show_page no longer needed for single-page output + • SVG: Fix bug preventing text from appearing in many viewers + • cairo-ft: Return correct metrics when hinting is off + • Eliminate crash in cairo_create_similar if nil surface is returned + • Eliminate crash after INVALID_RESTORE error + • Fix many bugs related to multi-threaded use and locking + • Fix for glyph spacing 32 times larger than desired (cairo-win32) + • Fixed several problems in cairo-atsui (assertion failures) + • Fix PDF output to avoid problems when printing from Acrobat Reader + • Fix segfault on Mac OS X (measuring a zero-length string) + • Fix text extents to not include the size of non-inked characters + • Fix for glyph cache race condition in glitz backend (Jinghua Luo) + • Fix make check to work on OPD platforms (IA64 or PPC64) + • Fix compilation problems of cairo "wideint" code on some platforms + • Many, many others... + +Experimental backends (quartz, XCB, OS/2, BeOS, directfb) +--------------------------------------------------------- +None of cairo's experimental backends are graduating to "supported" +status with 1.4.0, but two of them in particular (quartz and xcb), are +very close. + +The quartz baceknd has been entirely rewritten and is now much more +efficient. The XCB backend has been updated to track the latest XCB +API (which recently had a 1.0 release). + +We hope to see these backends become supported in a future release, +(once they are passing all the tests in cairo's test suite). + +The experimental OS/2 backend is new in cairo 1.4 compared to cairo +1.2. + +Documentation improvements +-------------------------- +We have added documentation for several functions and types that +were previously undocumented, and improved documentation on other +ones. As of this release, there remain only two undocumented +symbols: cairo_filter_t and cairo_operator_t. + +[*]Thanks to everyone +--------------------- +I've accounted for 41 distinct people with attributed code added to +cairo between 1.2.6 and 1.4.0, (their names are below). That's an +impressive number, but there are certainly dozens more that +contributed with testing, suggestions, clarifying questions, and +encouragement. I'm grateful for the friendships that have developed as +we have worked on cairo together. Thanks to everyone for making this +all so much fun! + +Adrian Johnson, Alfred Peng, Alp Toker, Behdad Esfahbod, +Benjamin Otte, Brian Ewins, Carl Worth, Christian Biesinger, +Christopher (Monty) Montgomery, Daniel Amelang, Dan Williams, +Dave Yeo, David Turner, Emmanuel Pacaud, Eugeniy Meshcheryakov, +Frederic Crozat, Hans Breuer, Ian Osgood, Jamey Sharp, Jeff Muizelaar, +Jeff Smith, Jinghua Luo, Jonathan Watt, Joonas Pihlaja, Jorn Baayen, +Kalle Vahlman, Kjartan Maraas, Kristian Høgsberg, M Joonas Pihlaja, +Mathias Hasselmann, Mathieu Lacage, Michael Emmel, Nicholas Miell, +Pavel Roskin, Peter Weilbacher, Robert O'Callahan, +Soren Sandmann Pedersen, Stuart Parmenter, T Rowley, +Vladimir Vukicevic + +Snapshot 1.3.16 (2007-03-02 Carl Worth <cworth@cworth.org>) +=========================================================== +New API functions +----------------- +A few new public functions have been added to the cairo API since the +1.3.14 snapshot. These include a function to query the current scaled +font: + + cairo_get_scaled_font + +New functions to query the reference count of all cairo objects: + + cairo_get_reference_count + + cairo_surface_get_reference_count + cairo_pattern_get_reference_count + + cairo_font_face_get_reference_count + cairo_scaled_font_get_reference_count + +And new functions to allow the use of user_data with any cairo object, +(previously these were only available on cairo_surface_t and +cairo_font_face_t objects): + + cairo_set_user_data + cairo_get_user_data + + cairo_pattern_set_user_data + cairo_pattern_get_user_data + + cairo_scaled_font_set_user_data + cairo_scaled_font_get_user_data + +Usability improvement for PDF/PS/SVG generation +----------------------------------------------- +In previous versions of cairo, generating single-page output with the +cairo-pdf, cairo-ps, or cairo-svg backends required a final call to +cairo_show_page. This was often quite confusing as people would port +functional code from a non-paginated backend and be totally mystified +as to why the output was blank until they learned to add this call. + +Now that call to cairo_show_page is optional, (it will be generated +implicitly if the user does not call it). So cairo_show_page is only +needed to explicitly separate multiple pages. + +Greatly improved PDF output +--------------------------- +We are very happy to be able to announce that cairo-generated PDF +output will now have text that can be selected, cut-and-paste, and +searched with most capable PDF viewer applications. This is something +that was not ever possible with cairo 1.2. + +Also, the PDF output now has much more compact encoding of text than +before. Cairo is now much more careful to not embed multiple copies of +the same font at different sizes. It also compresses text and font +streams within the PDF output. + +Major bug fixes +--------------- + • Fixed radial gradients + + The rendering of radial gradients has been greatly improved. In + the cairo 1.2 series, there was a serious regression affecting + radial gradients---results would be very incorrect unless one of + the gradient circles had a radius of 0.0 and a center point within + the other circle. These bugs have now been fixed. + + • Fixed dashing + + Several fixes have been made to the implementation of dashed + stroking. Previously, some dashed, stroked rectangles would + mis-render and fill half of the rectangle with a large triangular + shape. This bug has now been fixed. + + • Fixed transformed images in PDF/PS output + + In previous versions of cairo, painting with an image-based source + surface pattern to the PDF or PS backends would cause many kinds + of incorrect results. One of the most common problems was that an + image would be repeated many times even when the user had + explicitly requested no repetition with CAIRO_EXTEND_NONE. These + bugs have now been fixed. + + • Eliminate errors from CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD + + In the 1.2 version of cairo any use of CAIRO_EXTEND_REFLECT or + CAIRO_EXTEND_PAD with a surface-based pattern resulted in an + error, (cairo would stop rendering). This bug has now been + fixed. + + Now, CAIRO_EXTEND_REFLECT should work properly with surface + patterns. + + CAIRO_EXTEND_PAD is still not working correctly, but it will now + simply behave as CAIRO_EXTEND_NONE rather than triggering the + error. + +New rewrite of quartz backend (still experimental) +-------------------------------------------------- +Cairo's quartz backend has been entirely rewritten and is now much +more efficient. This backend is still marked as experimental, not +supported, but it is now much closer to becoming an officially +supported backend. (For people that used the experimental nquartz +backend in previous snapshots, that implementation has now been +renamed from "nquartz" to "quartz" and has replaced the old quartz +backend.) + +Documentation improvements +-------------------------- +We have added documentation for several functions and types that +were previously undocumented, and improved documentation on other +ones. As of this release, there remain only two undocumented +symbols: cairo_filter_t and cairo_operator_t. + +Other bug fixes +--------------- + • cairo-svg: Fix bug that was preventing text from appearing in many + viewers + + • cairo-ft: Return correct metrics when hinting is off + + • Cairo 1.3.14 deadlocks in cairo_scaled_font_glyph_extents or + _cairo_ft_unscaled_font_lock_face + + https://bugs.freedesktop.org/show_bug.cgi?id=10035 + + • cairo crashes in cairo_create_similar if nil surface returned by + other->backend->create_similar + + https://bugs.freedesktop.org/show_bug.cgi?id=9844 + + • evolution crash in _cairo_gstate_backend_to_user() + https://bugs.freedesktop.org/show_bug.cgi?id=9906 + + • Fix memory leak in rectilinear stroking code + +Things not in this release +-------------------------- + • Solid-surface-pattern cache: This patch had been applied during + the 1.3.x series, but it was reverted due to some inter-thread + problems it caused. The patch is interesting since it made a big + benefit for text rendering performance---so we'll work to bring a + corrected version of this patch back as soon as possible. + +Snapshot 1.3.14 (2006-02-13 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the seventh development snapshot in the 1.3 series, (and there +likely won't be many more before the 1.4.0 release). It comes just +over 3 weeks after the 1.3.12 snapshot. + +Since we're so close to the 1.4.0 release, there are not a lot of new +features nor even a lot of new performance improvements in this +snapshot. Instead, there are a great number of bug fixes. Some are +long-standing bugs that we're glad to say goodbye to, and several are +fixes for regressions that were introduced as part of the optimization +efforts during the 1.3.x series. + +PDF text selection fixed +------------------------ +The inability to correctly select text in cairo-generated PDF has been +a defect ever since the initial support for the PDF backend in the +cairo 1.2.0 release. With the 1.3.14 snapshot, in most situations, and +with most PDF viewer applications, the PDF generated by cairo will +allow text to be correctly selected for copy-and-paste, (as well as +searching). + +We're very excited about this new functionality, (and very grateful to +Adrian Johnson, Behdad Esfahbod, and others that have put a lot of +work into this lately). Please test this new ability and give feedback +on the cairo@cairographics.org list. + +Many thread-safety issues fixed +------------------------------- +We've discovered that no release of cairo has ever provided safe text +rendering from a multi-threaded application. With the 1.3.14 snapshot +a huge number of the bugs in this area have been fixed, and multiple +application dvelopers have now reported success at writing +multi-threaded applications with cairo. + +Other fixes +----------- +Fixed a bug that was causing glyph spacing to be 32 times larger than +desired when using cairo-win32. + +Fixed a regression in the rendering of linear gradients that had been +present since the 1.3.8 snapshot. + +Fixed several problems in cairo-atsui that were leading to assertion +failures when rendering text. + +Fix corrupted results when rendering a transformed source image +surface to an xlib surface. This was a regression that had been +present since the 1.3.2 snapshot. + +Fixed PDF output to prevent problems printing from some versions of +Acrobat Reader, (a single glyph was being substituted for every +glyph). + +And many other fixes as well, (see the logs for details). + +Snapshot 1.3.12 (2007-01-20 Carl Worth <cworth@cworth.org>) +=========================================================== +The relentless march toward the cairo 1.4 release continues, (even if +slightly late out of the starting blocks in 2007). This is the sixth +development snapshot in the 1.3 series. It comes 4 weeks after the +1.3.10 snapshot. + +Performance +----------- +As usual, this snapshot has some fun performance improvements to show +off: + +image-rgba long-lines-uncropped-100 470.08 -> 4.95: 94.91x speedup +███████████████████████████████████████████████ +image-rgb long-lines-uncropped-100 461.60 -> 4.96: 93.02x speedup +██████████████████████████████████████████████ + +This 100x improvement, (and yes, that's 100x, not 100%), in the image +backend occurs when drawing large shapes where only a fraction of the +shape actually appears in the final result, (the rest being outside +the bounds of the destination surface). Many applications should see +speedups here, and the actual amount of speedup depends on the ratio +of non-visible to visible portions of geometry. + +[Note: There remains a similar performance bug when drawing mostly +non-visible objects with the xlib backend. This is due to a similar +bug in the X server itself, but we hope a future cairo snapshot will +workaround that bug to get a similar speedup with the xlib backend.] + +image-rgba unaligned_clip-100 0.09 -> 0.06: 1.67x speedup +■+image-rgb unaligned_clip-100 0.09 -> 0.06: 1.66x speedup +■+ +This speedup is due to further MMX optimization by Soeren Sandmann for +a case commonly hit when rendering PDF files, (and thanks to Jeff +Muizelaar for writing code to extract the test case for us). + +There's another MMX optimization in this snapshot (without a fancy +speedup chart) by Dan Williams which improves compositing performance +specifically for the OLPC machine. + +Thanks to Adrian Johnson, cairo's PDF output is now much more +efficient in the way it encodes text output. By reducing redundant +information and adding compression to text output streams, Adrian +achieved a ~25x improvement in the efficiency of encoding text in PDF +files, (was ~45 bytes per glyph and is now ~1.6 bytes per glyph). + +Bug fixes +--------- +In addition to those performance improvements, this snapshot includes +several bug fixes: + + * A huge number of bug fixes for cairo-atsui text rendering, (for mac + OS X). These bugs affect font selection, glyph positioning, glyph + rendering, etc. One noteworthy bug fixes is that + cairo_select_font_face will no longer arbitrarily select bold nor + italic when not requested, (at least not when using a standard CSS2 + font family name such as "serif", "sans-serif", "monospace", etc.). + All these fixes are thanks to Brian Ewins who continues to do a + great job as the new cairo-atsui maintainer. + + * Fix PDF output so that images that are scaled down no longer + mysteriously repeat (Carl Worth). + + * Fix segfault on Mac OS X dues to attempt to measure extents of a + zero-length string (Behdad Esfahbod). + + * Fix text extents to not include the size of initial/trailing + non-inked characters (Behdad Esfahbod). + +API tweaks +---------- +Three functions have had API changes to improve consistency. Note that +the API functions being changed here are all functions that were +introduced as new functions during these 1.3.x snapshots. As always, +there will not be any API changes to functions included in a major +release (1.2.x, 1.4.x, etc.) of cairo. + +The changes are as follows: + + * Rename of cairo_copy_clip_rectangles to cairo_copy_clip_rectangle_list. + + * Change cairo_get_dash_count to return an int rather than accepting a + pointer to an int for the return value. + + * Change cairo_get_dash to have a void return type rather than + returning cairo_status_t. + +It's possible there will be one more round of changes to these +functions, (and perhaps cairo_get_color_stop as well), as we seek to +establish a unifying convention for returning lists of values. + +Snapshot 1.3.10 (2006-12-23 Carl Worth <cworth@cworth.org>) +=========================================================== +Santa Claus is coming just a little bit early this year, and he's +bringing a shiny new cairo snapshot for all the good little boys and +girls to play with. + +This is the fifth development snapshot in the 1.3 series. It comes 9 +days after the 1.3.8 snapshot, and still well within our goal of +having a new snapshot every week, (though don't expect one next +week---we'll all be too stuffed with sugar plums). + +Speaking of sugar plums, there's a sweet treat waiting in this cairo +snapshot---greatly improved performance for stroking rectilinear +shapes, like the ever common rectangle: + +image-rgb box-outline-stroke-100 0.18 -> 0.01: 25.58x speedup +████████████████████████▋ +image-rgba box-outline-stroke-100 0.18 -> 0.01: 25.57x speedup +████████████████████████▋ +xlib-rgb box-outline-stroke-100 0.49 -> 0.06: 8.67x speedup +███████▋ +xlib-rgba box-outline-stroke-100 0.22 -> 0.04: 5.39x speedup +████■+ +In past releases of cairo, some people had noticed that using +cairo_stroke to draw rectilinear shapes could be awfully slow. Many +people had worked around this by using cairo_fill with a more complex +path and gotten a 5-15x performance benefit from that. + +If you're one of those people, please rip that workaround out, as now +the more natural use of cairo_stroke should be 1.2-2x faster than the +unnatural use of cairo_fill. + +And if you hadn't ever implemented that workaround, then you just +might get to see your stroked rectangles now get drawn 5-25x faster. + +Beyond that performance fix, there are a handful of bug fixes in this +snapshot: + + * Fix for glyph cache race condition in glitz backend (Jinghua Luo) + + * Many fixes for ATSUI text rendering (Brian Ewins) + + * Un-break recent optimization-triggered regression in rendering text + with a translation in the font matrix (Behdad Esfahbod) + + * Fix make check to work on OPD platforms (IA64 or PPC64) + (Frederic Crozat) + + * Fix a couple of character spacing issues on Windows + (Jonathan Watt) + +Have fun with that, everybody, and we'll be back for more in the new +year, (with a plan to add the last of our performance improvements in +this round, fix a few bad, lingering bugs, and then finish off a nice, +stable 1.4 release before the end of January). + +-Carl + +Snapshot 1.3.8 (2006-12-14 Carl Worth <cworth@cworth.org>) +========================================================== +This is the fourth development snapshot in the 1.3 series. It comes +just slightly more than one week after the 1.3.6 snapshot. + +After the bug fixes in 1.3.6, we're back to our original program of +weekly snapshots, each one faster than the one from the week +before. Cairo 1.3.8 brings a 2x improvement in the speed of rendering +linear gradients (thanks to David Turner), and a significant reduction +in X traffic when rendering text (thanks to Xan Lopez and Behdad +Esfahbod), making cairo behave very much like Xft does. + +A few other things in the 1.3.8 snapshot worth noting include a more +forgiving image comparator in the test suite, (using the "perceptual +diff" metric and GPL implementation by Hector Yee[*]), a bug fix for +broken linking on x86_64 (thanks to M Joonas Pihlaja) and an even +better implementation of _cairo_lround, (not faster, but supporting a +more complete input range), from Daniel Amelang. + +[*] http://pdiff.sourceforge.net/ + +Snapshot 1.3.6 (2006-12-06 Carl Worth <cworth@cworth.org>) +========================================================== +This is the third development snapshot in the 1.3 series. It comes two +weeks after the 1.3.4 snapshot. + +We don't have fancy performance charts this week as the primary +changes in this snapshot are bug fixes. The performance work continues +and the next snapshot (planned for one week from today) should include +several improvements. The bug fixes in this snapshot include: + + * Fix undesirable rounding in glyph positioning (Dan Amelang) + + This bug was noticed by several users, most commonly by seeing + improper text spacing or scrambled glyphs as drawn by nautilus. For + example: + + Update to cairo-1.3.4 worsen font rendering + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=217819 + + * Fix reduced range of valid input coordinates to tessellator + (M Joonas Pihlaja) + + This bug was causing lots of assertion failures in mozilla as + mentioned here: + + CAIRO_BO_GUARD_BITS and coordinate space? + http://lists.freedesktop.org/archives/cairo/2006-December/008743.html + + * Fix several regressions in new tessellator (M Joonas Pihlaja) + + Joonas just had a good eye for detail here. I don't think any + external cairo users had noticed any of these bugs yet. + + * Fix compilation problems of cairo "wideint" code on some platforms + (Mathieu Lacage) + + * Fix failed configure due to broken grep (Dan Amelang) + + This bug was reported here: + + AX_C_FLOAT_WORDS_BIGENDIAN doesn't work because grep doesn't + work with binary file + https://bugs.freedesktop.org/show_bug.cgi?id=9124 + + * Remove the pkg-config minimum version requirement (Behdad Esfahbod) + + Some systems ship with pkg-config 0.15 and there was really no good + reason for cairo to insist on having version 0.19 before it would + build. + +There is also one new (but inert) feature in this snapshot. There's a +new option that can be passed to cairo's configure script: + + --disable-some-floating-point + + Disable certain code paths that rely heavily on double precision + floating-point calculation. This option can improve + performance on systems without a double precision floating-point + unit, but might degrade performance on those that do. + +As of this snapshot, this option does not make any change to cairo, +but it is possible that future versions of cairo will respect this +option and change the implementation of various functions as +appropriate. + +Snapshot 1.3.4 (2006-11-22 Carl Worth <cworth@cworth.org>) +========================================================== +This is the second development snapshot in the 1.3 series. It comes +one week after the 1.3.2 snapshot. + +This snapshot has a couple of significant performance improvements, +and also adds new support for producing multi-page SVG output, (when +targeting SVG 1.2)---thanks to Emmanuel Pacaud. The details of the +performance improvements are as follows: + +1. The long-awaited "new tessellator". + + The credit for this being an improvement goes to Joonas Pihlaja. He + took my really slow code and really put it through its paces to get + the dramatic performance improvement seen below (up to 38x faster + on realistic cases, and more than 10x faster for the zrusin_another + test). + + His own writeup of the work he did is quite thorough, but more than + can be quoted here. Please see his post for the interesting details: + + http://lists.freedesktop.org/archives/cairo/2006-November/008483.html + + (Though note that this snapshot also includes some additional, + significant improvements that were only sketched out in that + email---see "Generating fewer trapezoids"). + +2. More floating-point improvements + + Daniel Amelang continues to work the magic he began in the 1.3.2 + snapshot. This time he short-circuits floating-point + transformations by identity matrices and applies the earlier + floating-to-fixed-point technique to the problem of rounding. + + The improvements here will primarily benefit text performance, and + will benefit platforms without hardware floating-point more than + those that have it, (some text tests show 20% improvement on an x86 + machine and closer to 80% improvement on arm). + +The performance chart comparing 1.3.2 to 1.3.4 really speaks for +itself, (this is on an x86 laptop). This is quite a lot of progress +for one week: + + xlib-rgb stroke_similar_rgba_over-256 74.99 1.45% -> 2.03 68.38%: 36.86x speedup +███████████████████████████████████▉ + xlib-rgb stroke_similar_rgba_source-256 78.23 1.43% -> 3.30 67.05%: 23.71x speedup +██████████████████████▊ + xlib-rgba tessellate-256-100 820.42 0.15% -> 35.06 2.84%: 23.40x speedup +██████████████████████■+image-rgba tessellate-256-100 819.55 0.32% -> 35.04 3.56%: 23.39x speedup +██████████████████████■+ xlib-rgb stroke_image_rgba_over-256 78.10 1.43% -> 4.33 65.56%: 18.04x speedup +█████████████████ + xlib-rgb stroke_image_rgba_source-256 80.11 1.63% -> 5.75 63.99%: 13.94x speedup +█████████████ + xlib-rgba zrusin_another_tessellate-415 89.22 0.35% -> 8.38 5.23%: 10.65x speedup +█████████▋ +image-rgba zrusin_another_tessellate-415 87.38 0.89% -> 8.37 5.22%: 10.44x speedup +█████████■+image-rgba zrusin_another_fill-415 117.67 1.34% -> 12.88 2.77%: 9.14x speedup +████████■+ xlib-rgba zrusin_another_fill-415 140.52 1.57% -> 15.79 2.88%: 8.90x speedup +███████▉ +image-rgba tessellate-64-100 9.68 3.42% -> 1.42 0.60%: 6.82x speedup +█████▉ + xlib-rgba tessellate-64-100 9.78 4.35% -> 1.45 0.83%: 6.72x speedup +█████▊ + xlib-rgb stroke_linear_rgba_over-256 46.01 2.44% -> 7.74 54.51%: 5.94x speedup +█████ + xlib-rgb stroke_linear_rgba_source-256 48.09 2.15% -> 9.14 53.00%: 5.26x speedup +████▎ + xlib-rgb stroke_radial_rgba_over-256 50.96 2.34% -> 12.46 47.99%: 4.09x speedup +███■+ xlib-rgb stroke_radial_rgba_source-256 53.06 1.57% -> 13.96 46.57%: 3.80x speedup +██▊ +image-rgba paint_similar_rgba_source-256 0.12 1.57% -> 0.08 9.92%: 1.42x speedup +■+image-rgba paint_image_rgba_source-256 0.12 2.49% -> 0.08 10.70%: 1.41x speedup +■+image-rgba world_map-800 356.28 0.46% -> 275.72 1.15%: 1.29x speedup +▎ + xlib-rgba world_map-800 456.81 0.39% -> 357.95 1.39%: 1.28x speedup +▎ +image-rgb tessellate-16-100 0.09 0.57% -> 0.07 3.43%: 1.23x speedup +▎ +image-rgba tessellate-16-100 0.09 0.06% -> 0.07 2.46%: 1.23x speedup +▎ +image-rgba text_solid_rgb_over-256 5.39 4.01% -> 4.47 0.70%: 1.21x speedup +▎ +image-rgba text_solid_rgba_over-256 5.37 0.82% -> 4.45 0.75%: 1.21x speedup +▎ +image-rgba text_image_rgb_over-64 0.78 0.10% -> 0.65 0.74%: 1.20x speedup +▎ +image-rgba text_image_rgba_over-64 0.78 0.29% -> 0.65 0.68%: 1.19x speedup +▎ +image-rgb text_solid_rgb_over-64 0.76 2.45% -> 0.63 0.81%: 1.19x speedup +▎ +image-rgba text_solid_rgba_over-64 0.76 0.33% -> 0.64 0.66%: 1.19x speedup +▎ +image-rgba text_similar_rgba_over-256 5.99 4.72% -> 5.04 1.09%: 1.19x speedup +▎ + +We should point out that there is some potential for slowdown in this +snapshot. The following are the worst slowdowns reported by the cairo +performance suite when comparing 1.3.2 to 1.3.4: + +image-rgba subimage_copy-256 0.01 0.87% -> 0.01 3.61%: 1.45x slowdown +▌ + xlib-rgb paint_solid_rgb_over-256 0.31 10.23% -> 0.38 0.33%: 1.26x slowdown +▎ +image-rgba box-outline-fill-100 0.01 0.30% -> 0.01 2.52%: 1.21x slowdown +▎ +image-rgba fill_solid_rgb_over-64 0.20 1.22% -> 0.22 1.59%: 1.12x slowdown +■+image-rgb fill_similar_rgb_over-64 0.21 1.04% -> 0.24 1.06%: 1.11x slowdown +■+image-rgba fill_image_rgb_over-64 0.21 1.19% -> 0.24 0.72%: 1.11x slowdown +■+image-rgba fill_similar_rgb_over-64 0.21 0.18% -> 0.24 0.30%: 1.11x slowdown +■+image-rgb fill_solid_rgba_over-64 0.22 1.66% -> 0.24 1.15%: 1.11x slowdown +■+image-rgb fill_image_rgb_over-64 0.21 0.14% -> 0.24 0.80%: 1.11x slowdown +■+image-rgba fill_image_rgba_over-64 0.22 1.34% -> 0.25 0.20%: 1.11x slowdown +■+image-rgba fill_solid_rgba_over-64 0.22 1.48% -> 0.24 0.95%: 1.11x slowdown +■+image-rgb fill_similar_rgba_over-64 0.22 1.13% -> 0.25 1.25%: 1.10x slowdown +■+ +The 45% slowdown for subimage_copy is an extreme case. It's unlikely +to hit many applications unless they often use cairo_rectangle; +cairo_fill to copy a single pixel at a time. In any case, it shows a +worst-case impact of the overhead of the new tessellator. The other +slowdowns (~ 10%) are probably more realistic, and still very +concerning. + +We will work to ensure that performance regressions like these are not +present from one major release of cairo to the next, (for example, +from 1.2 to 1.4). + +But we're putting this 1.3.4 snapshot out there now, even with this +potential slowdown so that people can experiment with it. If you've +got complex geometry, we hope you will see some benefit from the new +tessellator. If you've got primarily simple geometry, we hope things +won't slowdown too much, but please let us know what slowdown you see, +if any, so we can calibrate our performance suite against real-world +impacts. + +Thanks, and have fun with cairo! + +Snapshot 1.3.2 (2006-11-14 Carl Worth <cworth@cworth.org>) +========================================================== +This is the first development snapshot since the 1.2 stable series +branched off shortly after the 1.2.4 release in August 2006. + +This snapshot includes all the bug fixes from the 1.2.6 release, +(since they originated here on the 1.3 branch first and were +cherry-picked over to 1.2). But more importantly, it contains some new +API in preparation for a future 1.4 release, and most importantly, it +contains several performance improvements. + +The bug fixes will not be reviewed here, as most of them are already +described in the 1.2.6 release notes. But details for the new API and +some performance improvements are included here. + +As with all snapshots, this is experimental code, and the new API +added here is still experimental and is not guaranteed to appear +unchanged in any future release of cairo. + +API additions +------------- +Several new API additions are available in this release. There is a +common theme among all the additions in that they allow cairo to +advertise information about its state that it was refusing to +volunteer earlier. So this isn't groundbreaking new functionality, but +it is essential for easily achieving several tasks. + +The new functions can be divided into three categories: + + Getting information about the current clip region + ------------------------------------------------- + cairo_clip_extents + cairo_copy_clip_rectangles + cairo_rectangle_list_destroy + + Getting information about the current dash setting + -------------------------------------------------- + cairo_get_dash_count + cairo_get_dash + + Getting information from a pattern + ---------------------------------- + cairo_pattern_get_rgba + cairo_pattern_get_surface + cairo_pattern_get_color_stop_rgba + cairo_pattern_get_color_stop_count + cairo_pattern_get_linear_points + cairo_pattern_get_radial_circles + +In each of these areas, we have new API for providing a list of +uniform values from cairo. The closest thing we had to this before was +cairo_copy_path, (which is rather unique in providing a list of +non-uniform data). + +The copy_clip_rectangles/rectangle_list_destroy functions follow a +style similar to that of cairo_copy_path. Meanwhile, the dash and +pattern color stop functions introduce a new style in which there is a +single call to return the number of elements available (get_dash_count +and get_color_stop_count) and then a function to be called once to get +each element (get_dash and get_color_stop_rgba). + +I'm interested in hearing feedback from users of these new API +functions, particularly from people writing language bindings. One +open question is whether the clip "getter" functionality should adopt +a style similar to that of the new dash and color_stop interfaces. + +API deprecation +--------------- +The CAIRO_FORMAT_RGB16_565 enum value has been deprecated. It never +worked as a format value for cairo_image_surface_create, and it wasn't +necessary for supporting 16-bit 565 X server visuals. + +XCB backend changes +------------------- +The XCB backend has been updated to track the latest XCB API (which +recently had a 1.0 release). + +New quartz backend +------------------ +Vladimir Vukicevic has written a new "native quartz" backend which +will eventually replace the current "image-surface wrapping" quartz +backend. For now, both backends are available, (the old one is +"quartz" and the new one is "nquartz"). But it is anticipated that the +new backend will replace the old one and take on the "quartz" name +before this backend is marked as supported in a release of cairo. + +New OS/2 backend +---------------- +Doodle and Peter Weilbacher have contributed a new, experimental +backend for using cairo on OS/2 systems. + +Performance improvements +------------------------ +Here are some highlights from cairo's performance suite showing +improvements from cairo 1.2.6 to cairo 1.3.2. The command used to +generate this data is: + + ./cairo-perf-diff 1.2.6 HEAD + +available in the perf/ directory of a recent checkout of cairo's +source, (the cairo-perf-diff script does require a git checkout and +will not work from a tar file---though ./cairo-perf can still be used +to generate a single report there and ./cairo-perf-diff-files can be +used to compare two reports). + +Results are described below both for an x86 laptop (with an old Radeon +video card, recent X.org build, XAA, free software drivers), as well +as for a Nokia 770. First the x86 results with comments on each, (all +times are reported in milliseconds). + +Copying subsets of an image surface to an xlib surface (much faster) +-------------------------------------------------------------------- + xlib-rgba subimage_copy-512 10.50 -> : 53.97x speedup +█████████████████████████████████████████████████████ + +Thanks to Christopher (Monty) Montgomery for this big performance +improvement. Any application which has a large image surface and is +copying small pieces of it at a time to an xlib surface, (imagine an +application that loads a single image containing all the "sprites" for +that application), will benefit from this fix. The larger the ratio of +the image surface to the portion being copied, the larger the benefit. + +Floating-point conversion (3x faster) +------------------------------------- + xlib-rgba pattern_create_radial-16 27.75 -> 3.93 : 2.94x speedup +██ +image-rgb pattern_create_radial-16 26.06 -> 3.74 : 2.90x speedup +█▉ + +Thanks to Daniel Amelang, (and others who had contributed the idea +earlier), for this nice improvement in the speed of converting +floating-point values to fixed-point. + +Text rendering (1.3 - 2x faster) +------------------------------ + xlib-rgba text_image_rgba_source-256 319.73 -> 62.40 : 2.13x speedup +█■+image-rgb text_solid_rgba_over-64 2.85 -> 0.88 : 1.35x speedup +■+ +I don't think we've ever set out to improve text performance +specifically, but we did it a bit anyway. I believe the extra +improvement in the xlib backend is due to Monty's image copying fix +above, and the rest is due to the floating-point conversion speedup. + +Thin stroke improvements (1.5x faster) +--------------------------------------------- +image-rgb world_map-800 1641.09 -> 414.77 : 1.65x speedup +▋ + xlib-rgba world_map-800 1939.66 -> 529.94 : 1.52x speedup +▌ + +The most modest stuff to announce in this release is the 50% +improvement I made in the world_map case. This is in improvement that +should help basically anything that is doing strokes with many +straight line segments, (and the thinner the better, since that makes +tessellation dominate rasterization). The fixes here are to use a +custom quadrilateral tessellator rather than the generic tessellator +for straight line segments and the miter joins. + +Performance results from the Nokia 770 +-------------------------------------- + xlib-rgba subimage_copy-512 55.88 -> 2.04 : 27.34x speedup +██████████████████████████■+ xlib-rgb text_image_rgb_over-256 1487.58 -> 294.43 : 5.05x speedup +████ +image-rgb pattern_create_radial-16 187.13 -> 91.86 : 2.04x speedup +█ + xlib-rgba world_map-800 21261.41 -> 15628.02 : 1.36x speedup +■+ +Here we see that the subimage_copy improvement was only about half as +large as the corresponding improvement on my laptop, (27x faster +compared to 54x) and the floating-point conversion fix also was quite +as significant, (2x compared to 3x). Oddly the improvement to text +rendering performance was more than twice as good (5x compared to +2x). I don't know what the reason for that is, but I don't think it's +anything anybody should complain about. + +Release 1.2.6 (2006-11-02 Behdad Esfahbod <behdad@behdad.org>) +============================================================== +This is the third bug fix release in the 1.2 series, coming less than +two months after the 1.2.4 release made on August 18. + +The 1.2.4 release turned out to be a pretty solid one, except for a crasher +bug when forwarding an X connection where the client and the server have +varying byte orders, eg. from a PPC to an i686. Other than that, various +other small bugs have been fixed. + +Various improvements have been made in the testing infrastructure to prevent +false positives, and to make sure the generated cairo shared object behaves as +expected in terms of exported symbols and relocations. + +There were a total of 89 changes since 1.2.4. The following list the most +important ones: + +Common fixes +------------ +- Avoid unsigned loop control variable to eliminate infinite, + memory-scribbling loop. (#7593) +- Fix cairo_image_surface_create to report INVALID_FORMAT errors. + Previously the detected error was being lost and a nil surface was + returned that erroneously reported CAIRO_STATUS_NO_MEMORY. +- Change _cairo_color_compute_shorts to not rely on any particular + floating-point epsilon value. (#7497) +- Fix infinite-join test case (bug #8379) +- Pass correct surface to create_similar in _cairo_clip_init_deep_copy(). + +PS/PDF fixes +------------ +- Fix Type 1 embedding in PDF. +- Correct the value of /LastChar in the PDF Type 1 font dictionary. +- Improve error checking in TrueType subsetting. +- Compute right index when looking up left side bearing. (bug #8180) +- Correct an unsigned to signed conversion problem in truetype subsetting + bbox. +- Type1 subsetting: Don't put .notdef in Encoding when there are 256 glyphs. +- Add cairo version to PS header / PDF document info dictionary. +- Set CTM before path construction. + +Win32 fixes +----------- +- Get correct unhinted outlines on win32. (bug 7603) +- Make cairo as a win32 static library possible. +- Use CAIRO_FORMAT_RGB24 for BITSPIXEL==32 surfaces too. + +Build system fixes +------------------ +- Define WINVER if it's not defined. (bug 6456) +- Fix the AMD64 final link by removing SLIM from pixman. +- Misc win32 compilation fixes. +- Add Sun Pro C definition of pixman_private. +- Use pixman_private consistently as prefix not suffix. +- Added three tests check-plt.sh, check-def.sh, and check-header.sh that check + that the shared object, the .def file, and the public headers agree about + the exported symbols. +- Require pkg-config 0.19. (#8686) + + +Release 1.2.4 (2006-08-18 Carl Worth <cworth@cworth.org>) +========================================================= +This is the second bug fix release in the 1.2 series, coming less than +two weeks after the 1.2.2 release made on August 8. + +The big motivation for a quick release was that there were a log of +build system snags that people ran into with the 1.2.2 release. But, +by the time we got those all done, we found that we had a bunch of +fixes for cairo's rendering as well. So there's a lot of goodness in +here for such a short time period. + +Rendering fixes +--------------- +Fix image surfaces to not be clipped when used as a source (Vladimir Vukicevic) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=72e25648c4c4bc82ddd938aa4e05887a293f0d8b + +Fix a couple of corner cases in dashing degenerate paths (Jeff Muizelaar) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=fbb1758ba8384650157b2bbbc93d161b0c2a05f0 + +Fix support for type1 fonts on win32 (Adrian Johnson) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=da1019c9138695cb838a54f8b871bbfd0e8996d7 + +Fix assertion failure when rotating bitmap fonts (Carl Worth) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=0bfa6d4f33b8ddb5dc55bbe419c15df4af856ff9 + +Fix assertion failure when calling cairo_text_path with bitmap fonts (Carl Worth) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9878a033531e6b96b5f27e69e10e90dee7440cd9 + +Fix mis-handling of cairo_close_path in some situations (Tim Rowley, Carl Worth) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=53f74e59faf1af78f2f0741ccf1f23aa5dad4efc + +Respect font_matrix translation in _cairo_gstate_glyph_path (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=f183b835b111d23e838889178aa8106ec84663b3 + +Fix vertical metrics adjustment to work with non-identity shapes (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=b7bc263842a798d657a95e539e1693372448837f + +[PS] Set correct ImageMatrix in _cairo_ps_surface_emit_bitmap_glyph_data (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=d47388ad759b0a1a0869655a87d9b5eb6ae2445d + +Build system fixes +------------------ +Fix xlib detection to prefer pkg-config to avoid false libXt dependency (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=0e78e7144353703cbd28aae6a67cd9ca261f1d68 + +Fix typos causing win32 build problem with PS,PDF, and SVG backends (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=aea83b908d020e26732753830bb3056e6702a774 + +Fix configure cache to not use stale results (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6d0e3260444a2d5b6fb0cb223ac79f1c0e7b3a6e + +Fix to not pass unsupported warning options to the compiler (Jens Granseuer) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=97524a8fdb899de1ae4a3e920fb7bda6d76c5571 + +Fix to allow env. variables such as png_REQUIRES to override configure detection (Jens Granseuer) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=abd16e47d6331bd3811c908e524b4dcb6bd23bf0 + +Fix test suite to not use an old system cairo when converting svg2png (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6122cc85c8f71b1ba2df3ab86907768edebe1781 + +Fix test suite to not require signal.h to be present (Behdad Esfahbod) +http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6f8cf53b1e1ccdbe1ab6a275656b19c6e5120e40 + +Code cleanups +------------- +Many useful warnings cleanups from sparse, valgrind, and careful eyes +(Kjartan Maraas, Pavel Roskin) + +Release 1.2.2 (2006-08-08 Carl Worth <cworth@cworth.org>) +========================================================= +This is the first bug fix release in the 1.2 series since the original +1.2.0 release made six weeks ago. + +There were some very serious bugs in the 1.2.0 release, (see below), +so everybody is encouraged to upgrade from 1.2.0 to 1.2.2. The 1.2.2 +release maintains source and binary compatibility with 1.2.0 and does +not make any API additions. + +Fix crashes with BGR X servers +------------------------------ +With cairo 1.2.0 many people reported problems with all cairo-using +programs, (including all GTK+ programs with GTK+ >= 2.8) immediately +crashing with a complaint about an unsupported image format. This bug +affected X servers that do not provide the Render extension and that +provide a visual with BGR rather than RGB channel order. + +report: https://bugs.freedesktop.org/show_bug.cgi?id=7294 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9ae66174e774b57f16ad791452ed44efc2770a59 + +Fix the "disappearing text" bug +------------------------------- +With cairo 1.2.0 many people reported that text would disappear from +applications, sometimes reappearing with mouse motion or +selection. The text would disappear after the first space in a string +of text. This bug was caused by an underlying bug in (very common) X +servers, and only affected text rendered without antialiasing, (either +a bitmap font or a vector font with antialiasing disabled). The bug +was also exacerbated by a KDE migration bug that caused antialiasing +to be disabled more than desired. + +report: https://bugs.freedesktop.org/show_bug.cgi?id=7494 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=456cdb3058f3b416109a9600167cd8842300ae14 +see also: +Xorg: https://bugs.freedesktop.org/show_bug.cgi?id=7681 +KDE: http://qa.mandriva.com/show_bug.cgi?id=23990 + +Fix broken image fallback scaling (aka. "broken printing") +---------------------------------------------------------- +The various "print" backends, (pdf, ps, and svg), sometimes fallback +to using image-based rendering for some operations. In cairo 1.2.0 +these image fallbacks were scaled improperly. Applications using cairo +can influence the resolution of the image fallbacks with +cairo_surface_set_fallback_resolution. With the bug, any value other +than 72.0 would lead to incorrect results, (larger values would lead +to increasingly shrunken output). + +report: https://bugs.freedesktop.org/show_bug.cgi?id=7533 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=1feb4291cf7813494355459bb547eec604c54ffb + +Fix inadvertent semantic change of font matrix translation (Behdad Esfahbod) +---------------------------------------------------------------------------- +The 1.2.0 release introduced an inadvertent change to how the +translation components of a font matrix are interpreted. In the 1.0 +series, font matrix translation could be used to offset the glyph +origin, (though glyph metrics were reported incorrectly in +1.0). However in 1.2.0, the translation was applied to the advance +values between each glyph. The 1.2.0 behavior is fairly useless in +practice, and it was not intentional to introduce a semantic +change. With 1.2.2 we return to the 1.0 semantics, with a much better +implementation that provides correct glyph metrics. + +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=84840e6bba6e72aa88fad7a0ee929e8955ba9051 + +Fix create_similar to preserve fallback resolution and font options (Behdad Esfahbod) +------------------------------------------------------------------------------------- +There has been a long-standing issue with cairo_surface_create_similar +such that font options and other settings from the original +destination surface would not be preserved to the intermediate +"similar" surface. This could result in incorrect rendering +(particularly with respect to text hinting/antialiasing) with +fallbacks, for example. + +report: https://bugs.freedesktop.org/show_bug.cgi?id=4106 +fixes: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9fcb3c32c1f16fe6ab913e27eb54d18b7d9a06b0 + http://gitweb.freedesktop.org/?p=cairo;a=commit;h=bdb4e1edadb78a2118ff70b28163f8bd4317f1ec + +xlib: Fix text performance regression from 1.0 to 1.2.0 (Vladimir Vukicevic) +---------------------------------------------------------------------------- +Several people noticed that upgrading from cairo 1.0 to cairo 1.2.0 +caused a significant performance regression when using the xlib +backend. This performance regression was particularly noticeable when +doing lots of text rendering and when using a high-latency connection +to the X server, (such as a remote X server over an ssh +connection). The slowdown was identified and fixed in 1.2.2. + +report: https://bugs.freedesktop.org/show_bug.cgi?id=7514 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=b7191885c88068dad57d68ced69a752d1162b12c + +PDF: Eliminate dependency on FreeType library dependency (Adrian Johnson) +------------------------------------------------------------------------- +The cairo 1.2 series adds a supported pdf backend to cairo. In cairo +1.2.0 this backend required the freetype library, which was an +undesirable dependency on systems such as win32, (cairo is designed to +always prefer the "native" font system). As of cairo 1.2.2 the +freetype library is not required to use the pdf backend on the win32 +platform. + +report: https://bugs.freedesktop.org/show_bug.cgi?id=7538 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=a0989f427be87c60415963dd6822b3c5c3781691 + +PDF: Fix broken output on amd64 (Adrian Johnson) +------------------------------------------------ +report: http://bugzilla.gnome.org/show_bug.cgi?id=349826 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=f4b12e497b7ac282b2f6831b8fb68deebc412e60 + +PS: Fix broken output for truetype fonts > 64k (Adrian Johnson) +--------------------------------------------------------------- +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=067d97eb1793a6b0d0dddfbd0b54117844511a94 + +PDF: Fix so that dashing doesn't get stuck on (Kent Worsnop) +------------------------------------------------------------ +Kent notices that with the PDF backend in cairo 1.2.0 as soon as a +stroke was performed with dashing, all subsequent strokes would also +be dashed. There was no way to turn dashing off again. + +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=778c4730a86296bf0a71080cf7008d7291792256 + +Fix memory leaks in failure paths in gradient creation (Alfred Peng) +-------------------------------------------------------------------- +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=db06681b487873788b51a6766894fc619eb8d8f2 + +Fix memory leak in _cairo_surface_show_glyphs (Chris Wilson) +------------------------------------------------------------ +report: https://bugs.freedesktop.org/show_bug.cgi?id=7766 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=e2fddcccb43d06486d3680a19cfdd5a54963fcbd + +Solaris: Add definition of cairo_private for some Sun compilers (Alfred Peng) +----------------------------------------------------------------------------- +report: https://bugzilla.mozilla.org/show_bug.cgi?id=341874 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=04757a3aa8deeff3265719ebe01b021638990ec6 + +Solaris: Change version number of Sun's Xorg server with buggy repeat (Brian Cameron) +------------------------------------------------------------------------------------- +report: https://bugs.freedesktop.org/show_bug.cgi?id=7483 +fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=e0ad1aa995bcec4246c0b8ab0d5a5a79871ce235 + +Various memory leak fixes +------------------------- +Fix memory leak in _cairo_surface_show_glyphs (bug 7766) +Fix file handle leak in failure path (bug 7616) +Fix some memory leaks in the test cases. +Fix some memory leaks in font subsetting code used in print backends. + +Documentation improvements (Behdad Esfahbod) +-------------------------------------------- +Added new documentation for several functions (cairo_show_page, +cairo_copy_page, cairo_in_stroke, cairo_in_fill). + +Fixed some syntax errors that were preventing some existing +documentation from being published. + +Fixed several minor typographical errors. + +Added an index for new symbols in 1.2. + +Release 1.2.0 (2006-06-27 Carl Worth <cworth@cworth.org>) +========================================================= +This is the culmination of the work that has gone on within the 1.1 +branch of cairo. + +There has been one API addition since the cairo 1.1.10 snapshot: + + cairo_xlib_surface_get_width + cairo_xlib_surface_get_height + +There's also a new feature without any API change: + + Dots can now be drawn by using CAIRO_LINE_CAP_ROUND with + degenerate sub-paths, (cairo_move_to() followed by either + cairo_close_path() or a cairo_line_to() to the same location). + +And at least the following bugs have been fixed: + + 6759 fontconfig option AntiAlias doesn't work in cairo 1.1.2 + 6955 Some characters aren't displayed when using xlib (cache u... + 7268 positive device_offset values don't work as source + * PDF emit_glyph function needs to support bitmapped glyphs + * PS emit_glyph function needs to support bitmapped glyphs + * SVG emit_glyph function needs to support bitmapped glyphs + * PDF: minefield page one is falling back unnecessarily + * PS/PDF: Fix broken placement for vertical glyphs + * PS: Fix to not draw BUTT-capped zero-length dash segments + * Do device offset before float->fixed conversion + http://bugzilla.gnome.org/show_bug.cgi?id=332266 + * PS: Fix source surfaces with transformations + * PS: Fix to not draw BUTT-capped degnerate sub-paths + * PS: Don't walk off end of array when printing "~>" + * Fix some memory leaks in the test suite rig + * SVG: Fix memory leak when using cairo_mask + * Fix EXTEND_REFLECT and EXTEND_PAD to not crash (though these are + still not yet fully implemented for surface patterns). + +This has been a tremendous effort by everyone, and I'm proud to have +been a part of it. Congratulations to all contributors to cairo! + +Snapshot 1.1.10 (2006-06-16 Carl Worth <cworth@cworth.org>) +=========================================================== +This is the fifth in a series of snapshots working toward the 1.2 +release of cairo. + +The primary motivation for this snapshot is to fix a long-standing bug +that had long been silent, but as of the 1.1.8 snapshot started +causing crashes when run against 16-bit depth X servers, (often Xvnc +or Xnest). The fix for this adds a new CAIRO_FORMAT_RGB16_565 to the +API. + +This snapshot also includes a rewrite of cairo's SVG backend to +eliminate the dependency on libxml2. With this in place, cairo 1.2 +will not depend on any libraries that cairo 1.0 did not. + +As usual, there are also a few fixes for minor bugs. + +Snapshot 1.1.8 (2006-06-14 Carl Worth <cworth@cworth.org>) +========================================================== +This is the fourth in a series of snapshots working toward the 1.2 +release of cairo. At this point, all major features of the 1.2 release +are in place, leaving just a few bug fixes left. + +In particular, there well be no additional API changes between this +1.1.8 snapshot and the 1.2 release. + +The announcement for 1.1.6 mentioned several API changes being +considered. Only one of these changes was actually implemented +(set_dpi -> fallback_resolution). This change does introduce one +source-level incompatibility with respect to previous 1.1.x snapshots, +so see below for details. + +Here is an abbreviated summary of changes since the 1.1.6 snapshot: + +** API Change ** +---------------- +According to the plan mentioned in the 1.1.6 notes, one source-level +incompatible change has been implemented. The following three +functions have been removed from cairo's API: + + cairo_pdf_surface_set_dpi + cairo_ps_surface_set_dpi + cairo_svg_surface_set_dpi + +and in their place the following function has been added: + + cairo_surface_set_fallback_resolution + +The signature and semantics of the function remains the same, so it is +a simple matter of changing the name of the function when calling +it. As a transition mechanism, this snapshot will (on many systems) +build to include the old symbols so that code previously compiled will +still run. However, all source code using the old names must be +updated before it will compile. And the upcoming 1.2 release is not +anticipated to include the old symbols. + +Finally, it should be pointed out that the old symbols never existed +in the supported API of any stable release of cairo. (In the stable +1.0 releases the PDF, PS, and SVG backends were advertised as +experimental and unstable.) + +And, as always, cairo continues to maintain source and binary +compatibility between major releases. So applications compiled against +supported backends in a stable release of cairo (1.0.4 say) will +continue to compile and run without modification against new major +releases (1.2.0 say) without modification. + +API additions +------------- +The following new functions have been added to cairo's API: + + cairo_surface_get_content + cairo_debug_reset_static_data + cairo_image_surface_get_data + cairo_image_surface_get_format + cairo_image_surface_get_stride + cairo_win32_font_face_create_for_hfont + +New, backend-specific pkg-config files +-------------------------------------- +In addition to the original cairo.pc file, cairo will also now install +a pkg-config files for each configured backend, (for example +cairo-pdf.pc, cairo-svg.pc, cairo-xlib.pc, cairo-win32.pc, etc.) this +also includes optional font backends (such as cairo-ft.pc) and the +optional png functionality (cairo-png.pc). + +These new pkg-config files should be very convenient for allowing +cairo-using code to easily check for the existing of optional +functionality in cairo without having to write complex rules to grub +through cairo header files or the compiled library looking for +symbols. + +Printing backend (PS, PDF, and SVG) +----------------------------------- +Improving the quality of the "printing" backends has been a priority +of the development between cairo 1.1.6 and cairo 1.1.8. + +The big improvement here is in the area of text output. Previously, at +best, text was output as paths without taking advantage of any font +support available in the output file format. + +Now, at the minimum text paths will be shared by using type3 fonts +(for PS and PDF---and similarly, defs for SVG). Also, if possible, +type3 and truetype fonts will be embedded in PostScript and PDF +output. There are still some known bugs with this, (for example, +selecting text in a cairo-generated PDF file with an embedded truetype +font does not work). So there will be some more changes in this area +before cairo 1.2, but do try test this feature out as it exists so +far. + +Many thanks to Kristian Høgsberg for the truetype and type1 font +embedding. + +win32 backend +------------- +Performance improvements by preferring GDI over pixman rendering when possible. +Fixes for text rendering. + +xlib backend +------------ +Fix potentially big performance bug by making xlib's create_similar +try harder to create a pixmap of a depth matching that of the screen. + +Bug fixes +--------- +Among various other fixes, the following bugs listed in bugzilla have +been fixed: + + Bug 2488: Patch to fix pixman samping location bug (#2488). + https://bugs.freedesktop.org/show_bug.cgi?id=2488 + + Bug 4196: undef MIN an MAX before defining to avoid duplicate definition + https://bugs.freedesktop.org/show_bug.cgi?id=4196 + + Bug 4723: configure.in: Fix m4 quoting when examining pkg-config version + https://bugs.freedesktop.org/show_bug.cgi?id=4723 + + Bug 4882: Flag Sun's X server has having buggy_repeat. + https://bugs.freedesktop.org/show_bug.cgi?id=4882 + + Bug 5306: test/pdf2png: Add missing include of stdio.h + https://bugs.freedesktop.org/show_bug.cgi?id=5306 + + Bug 7075: Fix make clean to remove cairo.def + https://bugs.freedesktop.org/show_bug.cgi?id=7075 + +(Many thanks to Behdad Esfahbod for helping us track down and fix many +of these.) + +Snapshot 1.1.6 (2006-05-04 Carl Worth <cworth@cworth.org>) +========================================================== +This is the third in a series of snapshots working toward the imminent +1.2 release of cairo. For a list of items still needing work on the +cairo 1.2 roadmap, please see: + + http://cairographics.org/ROADMAP + +As can be seen in that list, there are no longer any API additions +left on the roadmap. Instead, there is a feature (PDF type 3 fonts) a +performance optimization (X server gradients) and a list of bug +fixes. This gives us a fair amount of freedom to cut the 1.2 release +at almost any point by deciding to defer remaining bug fixes to +subsequent maintenance releases such as 1.2.2 and 1.2.4. + +Before we will do that, we must first be wiling to commit to all the +new API additions. As a heads-up, there are a couple of potential API +changes being considered. (Note that these are changes to new API +introduced during 1.1 so these will not introduce API +incompatibilities compared to the stable 1.0 series). The changes +being considered are: + + cairo_get_group_target: may acquire x and y offset return + parameters. May also be eliminated in favor of + cairo_get_target assuming its role + + cairo_pdf_surface_set_dpi: + cairo_ps_surface_set_dpi: + cairo_svg_surface_set_dpi: These functions may be removed in favor + of a new cairo_surface_set_fallback_resolution + +Additionally there is the possibility of a slight change in the +semantics of cairo_set_line_width. We believe the current behavior of the sequence: + + cairo_set_line_width; ... change CTM ...; cairo_stroke; + +is buggy. It is currently behaving the same as: + + ... change CTM ...; cairo_set_line_width; cairo_stroke; + +We are considering fixing this bug before 1.2 with the hope that +nobody is already relying on the buggy behavior described here. Do +shout if you suspect you might be in that position. + +The items included in this snapshot (since the 1.1.4 snapshot) are +described below. + +API additions +------------- +The long-awaited group-rendering support is now available with the +following function calls: + + cairo_push_group + cairo_push_group_with_content + cairo_pop_group + cairo_pop_group_to_source + cairo_get_group_target + +This API provides a much more convenient mechanism for doing rendering +to an intermediate surface without the need to manually create a +temporary cairo_surface_t and a temporary cairo_t and clean them up +afterwards. + +Add the following missing get function to complement +cairo_surface_set_device_offset: + + cairo_surface_get_device_offset + +PDF backend (API addition) +-------------------------- +The PDF backend now provides for per-page size changes, (similar to +what the PostScript backend got in the 1.1.4 snapshot). The new API +is: + + cairo_pdf_surface_set_size + +Xlib backend (API additions) +---------------------------- +The following functions have been added to allow the extraction of +Xlib surface: + + cairo_xlib_surface_get_display + cairo_xlib_surface_get_drawable + cairo_xlib_surface_get_screen + cairo_xlib_surface_get_visual + cairo_xlib_surface_get_depth + +XCB backend (experimental) +-------------------------- +Update backend so that it now compiles with the recent XCB 0.9 release. + +Bug fixes and memory leak cleanup +--------------------------------- +Various little things, nothing too significant though. + +Snapshot 1.1.4 (2006-05-03 Carl Worth <cworth@cworth.org>) +========================================================== +This is the second in a series of snapshots working toward the +upcoming 1.2 release of cairo. For a list of items still needing work +on the cairo 1.2 roadmap, please see: + + http://cairographics.org/ROADMAP + +The items included in this snapshot (since the 1.1.2 snapshot) are +described below. + +PostScript backend: new printing-oriented API +--------------------------------------------- +We anticipate that with cairo 1.2, toolkits will begin to use cairo +for printing on systems that use PostScript as the spool format. To +support this use case, we have added 4 new function calls that are +specific to the PostScript backend: + + cairo_ps_surface_set_size + cairo_ps_surface_dsc_comment + cairo_ps_surface_dsc_begin_setup + cairo_ps_surface_dsc_begin_page_setup + +These functions allow variation of the page size/orientation from one +page to the next in the PostScript output. They also allow the toolkit +to provide per-document and per-page printer control options in a +device-independent way, (for example, by using PPD options and +emitting them as DSC comments into the PostScript output). This should +allow toolkits to provide very fine-grained control of many options +available in printers, (media size, media type, tray selection, etc.). + +SVG backend: builds by default, version control +----------------------------------------------- +The SVG backend continues to see major improvements. It is expected +that the SVG backend will be a supported backend in the 1.2 +release. This backend will now be built by default if its dependencies +(freetype and libxml2) are met. + +Additionally, the SVG backend now has flexibility with regard to what +version of SVG it targets. It will target SVG 1.1 by default, which +will require image fallbacks for some of the "fancier" cairo +compositing operators. Or with the following new function calls: + + cairo_svg_surface_restrict_to_version + cairo_svg_get_versions + cairo_svg_version_to_string + +it can be made to target SVG 1.2 in which there is native support for +these compositing operators. + +Bug fixes +--------- +At least the following bugs have been fixed since the 1.1.2 snapshot: + +crash at XRenderAddGlyphs +https://bugs.freedesktop.org/show_bug.cgi?id=4705 + +Can't build cairo-1.1.2 on opensolaris due to " void function cannot return value" +https://bugs.freedesktop.org/show_bug.cgi?id=6792 + +Missing out-of-memory check at gfx/cairo/cairo/src/cairo-atsui-font.c:185 +https://bugzilla.mozilla.org/show_bug.cgi?id=336129 + +A couple of memory leaks. + +Snapshot 1.1.2 (2006-04-25 Carl Worth <cworth@cworth.org>) +========================================================== +This is the first in a series of snapshots working toward the upcoming +1.2 release of cairo. (Subsequent snapshot will use successive even +numbers for the third digit, 1.1.4, 1.1.6, etc.) This snapshot is +backwards-compatible with the 1.0 series---it makes a few API +additions but does not remove any API. + +PostScript and PDF backends are no longer "experimental" +-------------------------------------------------------- +The major theme of the 1.2 release is improved PostScript and PDF +backends for cairo. Unlike the 1.0 series, in the 1.2 series these +backends will not be marked as experimental and will be enabled by +default. We encourage people to test this snapshot and the PS/PDF +backends in particular as much as possible. + +The PostScript and PDF output is not yet ideal. + + * One major problem with the PostScript output is that image + fallbacks are used more often than strictly necessary, and the + image fallbacks are at a lower resolution than desired, (the + cairo_ps_surface_set_dpi call is ignored). + + * The major drawback of the current PDF backend implementation is + its text support. Every glyph is represented by a filled path in + the PDF file. The causes file sizes to be much larger and + rendering to be much slower than desired. + +It is anticipated that both of these shortcomings will see some +improvements before the final 1.2 release. + +In spite of those shortcomings, we hope that the PS and PDF backends +will yield faithful results for pretty much any cairo operations you +can throw at them. Please let us know if you are getting obviously +"different" results from the PS/PDF backends than from the image or +xlib backends. + +Other new experimental backends +------------------------------- +This snapshot includes three new backends that did not exist in the +1.0 series: + + * beos backend + + * directfb backend + + * svg backend + +These are all currently marked "experimental" and are disabled by +default. But the SVG backend in particular has seen a lot of recent +development and is very close to passing the entire cairo test +suite. It is possible that this backend will become a fully supported +backend by the time of the cairo 1.2 release. + +Public API additions +-------------------- +There have been a few new API functions added to cairo, including: + +New get_type functions for querying sub-types of object: + + cairo_surface_get_type + cairo_pattern_get_type + cairo_font_face_get_type + cairo_scaled_font_get_type + +More convenience in working with cairo_scaled_font_t with new getter +functions: + + cairo_scaled_font_get_font_face + cairo_scaled_font_get_font_matrix + cairo_scaled_font_get_ctm + cairo_scaled_font_get_font_options + +As well as a convenience function for setting a scaled font into a +cairo context: + + cairo_set_scaled_font + +and a function to allow text extents to be queried directly from a +scaled font, (without requiring a cairo_surface_t or a cairo_t): + + cairo_scaled_font_text_extents + +These new scaled font functions were motivated by the needs of the +pango library. + +Finally, a new path-construction function was added which clears the +current point in preparation for a new sub path. This makes cairo_arc +easier to use in some situations: + + cairo_new_sub_path + +Before the 1.2 release is final we do still plan a few more API +additions specifically motivated by the needs of Mozilla/Firefox. + +Optimizations and bug fixes +--------------------------- +Shortly after the 1.0 maintenance series branched off the mainline +there was a major rework of the cairo font internals. This should +provide some good performance benefits, but it's also another area +people should look at closely for potential regressions. + +There has not yet been any widespread, systematic optimization of +cairo, but various performance improvements have been made, (and some +of them are fairly significant). So if some things seem faster than +1.0 then things are good. If there are any performance regressions +compared to 1.0 then there is a real problem and we would like to hear +about that. + +There has been a huge number of bug fixes---too many to mention in +detail. Again, things should be better, and never worse compared to +1.0. Please let us know if your testing shows otherwise. + +Release 1.0.2 (2005-10-03 Carl Worth <cworth@cworth.org>) +========================================================= +For each bug number XXXX below, see: + + https://bugs.freedesktop.org/show_bug.cgi?id=XXXX + +for more details. + +General bug fixes +----------------- + * 4408 - Add support for dashing of stroked curves + (Carl Worth) + + * 4409 - Fix dashing so that each dash is capped on both ends + (Carl Worth) + + * 4414 - Prevent SIGILL failures (proper use of -mmmx and -msse flags) + (Sebastien Bacher, Billy Biggs) + + * 4299 - Fix crashes with text display in multi-threaded program + (Alexey Shabalin, Carl Worth) + + * 4401 - Do not use sincos function since it is buggy on some platforms) + (Tim Mooney, Carl Worth) + + * 4245 - Fix several bugs in the test suite exposed by amd64 systems + (Seemant Kulleen, Carl Worth) + + * 4321 - Add missing byteswapping on GetImage/PutImage + (Sjoerd Simons, Owen Taylor) + + * 4220 - Make the check for rectangular trapezoids simpler and more accurate + (Richard Stellingwerff, Owen Taylor) + + * 4260 - Add missing channel-order swapping for antialised fonts + (Barbie LeVile, Owen Taylor) + + * 4283 - Fix compilation failure with aggressive inlining (gcc -O3) + (Marco Manfredini, Owen Taylor) + + * 4208 - Fix some warnings from sparse + (Kjartan Maraas, Billy Biggs) + + * 4269 - Fix to not crash when compiled with -fomit-frame-pointer + (Ronald Wahl, Owen Taylor) + + * 4263 - Improve performance for vertical gradients + (Richard Stellingwerff, Owen Taylor) + + * 4231 + * 4298 - Accomodate gentoo and Mandriva versions in X server vendor string check + (Billy Biggs, Frederic Crozat, Owen Taylor) + +win32-specific fixes +-------------------- + * 4599 - Fix "missing wedges" on some stroked paths (win32) + (Tim Rowley, Jonathan Watt, Bertram Felgenhauer, Carl Worth, Keith Packard) + + * 4612 - Fix disappearing text if first character out of surface (win32) + (Tim Rowley) + + * 4602 - Fix shutdown of cairo from failing intermediate, size-0 bitmaps (win32) + Aka. the "white rectangles" bug from mozilla-svg testing + (Tim Rowley) + + * Various portability improvements for win32 + (Hans Breuer, Owen Taylor, Carl Worth) + + * 4593 - Fix font sizes to match user expectations (win32) + (Tor Lillqvist, Owen Taylor) + + * 3927 - Fix to report metrics of size 0 for glyph-not-available (win32) + (Hans Breuer, Owen Taylor, Tor Lillqvist) + + * Add locking primitives for win32 + (Hans Breuer) + +xlib-specific fixes +------------------- + * Fix crash from size-0 pixmap due to empty clip region (xlib) + (Radek Doulík, Carl Worth) + +Release 1.0.0 (2005-08-24 Carl Worth <cworth@cworth.org>) +========================================================= +Experimental backends +--------------------- + * The Glitz, PS, PDF, Quartz, and XCB backends have been declared + experimental, and are not part of the API guarantees that accompany + this release. They are not built by default, even when the required + libraries are available, and must be enabled explicitly with + --enable-ps, --enable-pdf, --enable-quartz or --enable-xcb. + + It is very painful for us to be pushing out a major release without + these backends enabled. There has been a tremendous amount of work + put into each one and all are quite functional to some + extent. However, each also has some limitations. And none of these + backends have been tested to the level of completeness and + correctness that we expect from cairo backends. + + We do encourage people to experiment with these backends and report + success, failure, or means of improving them. + +Operator behavior +----------------- + * Prior to 0.9.0 the SOURCE, CLEAR and a number of other operators + behaved in an inconsistent and buggy fashion and could affect areas + outside the clip mask. In 0.9.0, these six "unbounded" operators + were fixed to consistently clear areas outside the shape but within + the clip mask. This is useful behavior for an operator such as IN, + but not what was expected for SOURCE and CLEAR. So, in this release + the behavior of SOURCE and CLEAR has been changed again. They now + affect areas only within both the source and shape. We can write + the new operators as: + + SOURCE: dest' = (mask IN clip) ? source : dest + CLEAR: dest' = (mask IN clip) ? 0 : dest + +Behavior and API changes +------------------------ + * Setting the filter on a gradient pattern would change the + interpolation between color stops away from the normal linear + interpolation. This dubious behavior has been removed. + + * The CAIRO_CONTENT_VALID() and CAIRO_FORMAT_VALID() macros -- + implementation details that leaked into cairo.h -- have been moved + into an internal header. + + * The cairo_show_text function now advances the current point + according to the total advance values of the string. + +API additions +------------- + * cairo_set_dash can now detect error and can set + CAIRO_STATUS_INVALID_DASH. + +Features +-------- + * When compiled against recent versions of fontconfig and FreeType, + artificial bold fonts can now be turned on from fonts.conf using + the FC_EMBOLDEN fontconfig key. + +Optimization +------------ + * The compositing code from the 'xserver' code tree has now been + completely merged into libpixman. This includes MMX optimization of + common operations. + + * The image transformation code in libpixman has been improved and + now performs significantly faster. + +Bug fixes +--------- + * Several crashes related to corruption in the font caches have been + fixed. + + * All test cases now match pixel-for-pixel on x86 and PPC; this + required fixing bugs in the compositing, stroking, and pattern + rendering code. + + * Negative dash offsets have been fixed to work correctly. + + * The stroking of paths with mutiple subpaths has now been fixed to + apply caps to all subpaths rather than just the last one. + + * Many build fixes for better portability on various systems. + + * Lots of other bug fixes, but we're too tired to describe them in + more detail here. + +Release 0.9.2 (2005-08-13 Carl Worth <cworth@cworth.org>) +========================================================= +Release numbering +----------------- + * You will notice that this release jumped from 0.9.0 to 0.9.2. We've + decided to use an odd micro version number (eg. 0.9.1) to indicate + in-progress development between releases. As soon as 0.9.2 is + tagged, the version will be incremented in CVS to 0.9.3 where it + will stay until just before 0.9.4 is built, uploaded, and tagged. + + So, even-micro == a released version, odd-micro == something in-between. + +Libpixman dependency dropped +---------------------------- + * As of this release, the dependency on an external libpixman has + been dropped. Instead, the code from libpixman needed for cairo has + been incorporated into the cairo source tree. The motivation for + this change is that while cairo's API is stable and ready to be + maintained after the 1.0 release, libpixman's API is not, so we do + not want to expose it at this time. + + Also, the incorporation of libpixman into cairo also renames all + previously-public libpixman symbols in order to avoid any conflict + with a future release of libpixman + +API additions +------------- + * Macros and functions have been added so that the version of cairo + can be queried at either compile-time or at run-time. The version + is made available as both a human-readable string and as a single + integer: + + CAIRO_VERSION_STRING eg. "0.9.2" + CAIRO_VERSION eg. 000902 + + const char* + cairo_version_string (void); /* eg. "0.9.2" */ + + int + cairo_version (void); /* eg. 000902 */ + + A macro is provided to convert a three-part component version into + the encoded single-integer form: + + CAIRO_VERSION_ENCODE(X,Y,Z) + + For example, the CAIRO_VERSION value of 000902 is obtained as + CAIRO_VERSION_ENCODE(0,9,2). The intent is to make version + comparisons easy, either at compile-time: + + #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(0,9,2) + ... + #endif + + Or at run-time: + + if (cairo_version() >= CAIRO_VERSION_ENCODE(0,9,2)) { /* ... */ } + +Thread safety +------------- + * This release adds pthread-based locking (when available) to make + the caches used by cairo safe for threaded programs. Some may + remember a failed experiment with this locking between the 0.5.1 + and 0.5.2 snapshots, (where even single-threaded programs that + linked with -lpthread would deadlock). We believe that that problem + has been fixed, so we are looking forward to testing and reports + from users with threaded applications. + +Bug fixes +--------- + * The XCB and Quartz backends failed to compiled in the 0.9.0 release + due to minor syntax errors. These have now been fixed. + + * Various crashes in glitz and pixman due to size 0 glyphs have been + fixed. + +Release 0.9.0 (2005-08-08 Carl Worth <cworth@cworth.org>) +========================================================= +Soname change +------------- + * In all prior snapshots, the libtool library versioning was set to + 1:0:0. As this release is intended to mark the beginning of + backwards-compatible releases, the versioning has been incremented + to 2:0:0. You will notice that the numeric extension on the + installed library filename will change similarly. + + This change will also require all cairo-using applications to be + recompiled. We recognize that this may cause some frustration since + this release is backwards-compatible with 0.6.0 and in that sense + "shouldn't" require re-compilation. However, since all historical + snapshots have used the same 1:0:0 version in spite of incompatible + API changes between them, it was essential that the upcoming 1.0 + release series have distinct library versioning. + + All future releases will use the library versioning to properly + indicate compatibility between releases. So, any application + re-compiled now to work with the 0.9.0 will not need to be + recompiled when a compatible 1.0 release of cairo is made in the + future. + +API additions +------------- + * Add new function calls to set/get the current antialiasing mode in + the graphics state: + + cairo_set_antialias + cairo_get_antialias + + This call accepts the same modes recently added for font options + (NONE or GRAY) but affects the rendering of geometry other than + text. The intent of this call is to enable more precise control of + which pixels are affected by each operation, for example to allow + for full-scene antialiasing for seam-free rendering. It is not + expected that non-antialiased rendering will perform better than + anti-aliased rendering. + + * Three new functions were added to provide support for mixed cairo- + and non-cairo drawing to the same surface: + + cairo_surface_mark_dirty + cairo_surface_mark_dirty_rectangle + cairo_surface_flush + + * The return type of the several "reference" functions was change, + (API compatibly), from void to the same type as the argument. The + affected functions are: + + cairo_font_face_reference + cairo_scaled_font_reference + cairo_pattern_reference + cairo_surface_reference + cairo_reference + + This allows a convenient way to assign and reference in a single + statement. + +Semantic changes +---------------- + * The behavior of cairo_set_source with a pattern with a non-identity + matrix was previously not well-defined. The new behavior is as + follows: + + The pattern's transformation matrix will be locked to the + user space in effect at the time of cairo_set_source(). This means + that further modifications of the CTM will not affect the source + pattern. + +cairo-win32 +----------- + * Some portability improvements, (eg. workaround for missing stdint.h). + +cairo-ft +-------- + * Updated to allow compilation with older versions of freetype. + +Bug fixes +--------- + * Fix the unbounded operators to actually produce a correct result, + (previously the results were artificially restricted to the + bounding box of whatever shape was being drawn rather than + extending out infinitely). The fixed operators are: + + CAIRO_OPERATOR_CLEAR + CAIRO_OPERATOR_SOURCE + CAIRO_OPERATOR_OUT + CAIRO_OPERATOR_IN + CAIRO_OPERATOR_DEST_IN + CAIRO_OPERATOR_DEST_ATOP + + * Fix cairo_mask and cairo_mask_surface to transform the mask by the + current transformation matrix (CTM). + + * Fix cairo_set_source to lock the CTM used to transform the pattern. + + * Workaround for X server Render bug involving repeating patterns + with a general transformation matrix. + + * cairo_get_font_face fixed to return a "nil" font face object rather + than NULL on error. + + * cairo_set_font_face fixed to not crash if given a NULL font face, + (which is the documented interface for restoring the default font + face). + + * Fix xlib glyphset caching to not try to free a NULL glyph. + +Snapshot 0.6.0 (2005-07-28 Carl Worth <cworth@cworth.org>) +========================================================== +API changes +----------- +* The prototypes of the following functions have changed: + + cairo_xlib_surface_create_with_xrender_format + cairo_xlib_surface_create_for_bitmap + + A Screen* parameter has been added to each. This allows the cairo + xlib backend to work correctly with multi-head X servers. + +* The following function has been modified: + + cairo_scaled_font_create + + to accept a cairo_font_options_t*. See below fore more details. + +* All opaque, reference-counted cairo objects have now been moved to a + standard error-handling scheme. The new objects to receive this + treatment are cairo_font_face_t, cairo_scaled_font_t, and + cairo_surface_t. (Previous snapshots already provided this scheme + for cairo_t, cairo_path_t, and cairo_pattern_t.) + + This changes two functions to have a return type of void rather than + cairo_status_t: + + cairo_scaled_font_extent + cairo_surface_finish + + And significantly, none of the create functions for any of the + objects listed above will return NULL. The pointer returned from any + function will now always be a valid pointer and should always be + passed to the corresponding destroy function when finished + + The simplest strategy for porting code is to switch from: + + object = cairo_<object>_create (); + if (object == NULL) + goto BAILOUT; + + /* act on object */ + + cairo_<object>_destroy (object); + + to: + + object = cairo_<object>_create (); + if (cairo_<object>_status (object)) + goto BAILOUT; + + /* act on object */ + + cairo_<object>_destroy (object); + + But significantly, it is not required to check for an error status + before the "act on object" portions of the code above. All + operations on an object with an error status are, by definition, + no-ops without side effect. So new code might be written in an + easier-to-read style of: + + object = cairo_<object>_create (); + + /* act on object */ + + cairo_<object>_destroy (object); + + with cairo_<object>_status checks placed only at strategic + locations. For example, passing an error object to another object, + (eg. cairo_set_source with an in-error pattern), will propagate the + error to the subsequent object (eg. the cairo_t). This means that + error checking can often be deferred even beyond the destruction of + a temporary object. + +API additions +------------- +* New functions for checking the status of objects that have been + switched to the common error-handling scheme: + + cairo_font_face_status + cairo_scaled_font_status + cairo_surface_status + +* The _cairo_error function which was added in 0.5.1 has now been made + much more useful. In 0.5.1 only errors on cairo_t objects passed + through _cairo_error. Now, an error on any object should pass + through _cairo_error making it much more reliable as a debugging + mechanism for finding when an error first occurs. + +* Added new font options support with a myriad of functions: + + cairo_font_options_create + cairo_font_options_copy + cairo_font_options_destroy + + cairo_font_options_status + + cairo_font_options_merge + cairo_font_options_equal + cairo_font_options_hash + + cairo_font_options_set_antialias + cairo_font_options_get_antialias + cairo_font_options_set_subpixel_order + cairo_font_options_get_subpixel_order + cairo_font_options_set_hint_style + cairo_font_options_get_hint_style + cairo_font_options_set_hint_metrics + cairo_font_options_get_hint_metrics + + cairo_surface_get_font_options + + cairo_ft_font_options_substitute + + cairo_set_font_options + cairo_get_font_options + + This new font options support allows the application to have much + more fine-grained control over how fonts are rendered. + Significantly, it also allows surface backends to have some + influence over the process. For example, the xlib backend now + queries existing Xft properties to set font option defaults. + +* New function: + + cairo_xlib_surface_set_drawable + + which allows the target drawable for an xlib cairo_surface_t to be + changed to another with the same format, screen, and display. This + is necessary in certain double-buffering techniques. + +New features +------------ +* Sub-pixel text antialiasing is now supported. + +Bug fixes +--------- +* Fixed assertion failure in cairo_surface_create_similar when + application commits an error by passing a cairo_format_t rather than + a cairo_content_t. + +* Avoid division by zero in various places (cairo-ft). + +* Fix infinite loop when using non-default visuals (cairo-xlib). + +* Eliminate segfault in cairo_image_surface_create_from_png_stream. + +* Prevent errant sign-extension of masks on 64-bit architectures + (cairo-xlib and cairo-xcb). + +* Other miscellaneous fixes. + +Snapshot 0.5.2 (2005-07-18 Carl Worth <cworth@cworth.org>) +========================================================== +API changes +----------- +* New functions for creating patterns of a single color: + + cairo_pattern_create_rgb + cairo_pattern_create_rgba + +* Change cairo_surface_create_similar to accept a new type of + cairo_content_t rather than cairo_format_t: + + typedef enum _cairo_content { + CAIRO_CONTENT_COLOR = 0x1000, + CAIRO_CONTENT_ALPHA = 0x2000, + CAIRO_CONTENT_COLOR_ALPHA = 0x3000 + } cairo_content_t; + +* Add new CAIRO_FORMAT_VALID and CAIRO_CONTENT_VALID macros. + +* Remove unused status value: + + CAIRO_STATUS_NO_TARGET_SURFACE + +* Add new status values: + + CAIRO_STATUS_INVALID_STATUS + +* Require libpixman >= 0.1.5 (for necessary bug fixes) + +Bug fixes +--------- +* Fix cairo_surface_write_to_png for RGB24 images. + +* Fix broken metrics and rendering for bitmap fonts. Add mostly + useless bitmap glyph transformation. + +* Fix glyph caches to not eject entries that might be immediately + needed, (fixing intermittent crashes when rendering text). + +* Fix all memory leaks found by running "make check-valgrind". + +ATSUI backend changes +--------------------- +* Allow building against < 10.3 SDK. + +* Prevent crash on empty strings. + +Glitz backend changes +--------------------- +* Require glitz >= 0.4.4. + +* Use frame buffer objects instead of pbuffers for accelerated + offscreen drawing. + +* Minor improvement to gradient pattern creation. + +PostScript backend fixes +------------------------ +* Rewrite of the PS backend to generate more interesting output that + the old big-image implementation. + +Win32 backend fixes +------------------- +* Implement glyph path support. + +* Fix swap of blue and green values in the fill_rectangles path. + +Xlib backend fixes +------------------ +* Add optimization to use XCopyArea rather than XRenderComposite when + transforming only with an integer translation, and using SOURCE + operator or OVER with a source pattern without alpha. + +Snapshot 0.5.1 (2005-06-20 Carl Worth <cworth@cworth.org>) +========================================================== +API changes +----------- +* Removed cairo_status_string(cairo_t*) and add + cairo_status_to_string(cairo_status_t) in its place. Code using + cairo_status_string can be ported forward as follows: + + cairo_status (cr); + -> + cairo_status_to_string (cairo_status (cr)); + +* Removed the BAD_NESTING restriction which means that two different + cairo_t objects can now interleave drawing to the same + cairo_surface_t without causing an error. + +* The following functions which previously had a return type of + cairo_status_t now have a return type of void: + + cairo_pattern_add_color_stop_rgba + cairo_pattern_set_matrix + cairo_pattern_get_matrix + cairo_pattern_set_extend + cairo_pattern_set_filter + + See discussion of cairo_pattern_status below for more details. + +API additions +------------- +* Improved error handling: + + cairo_status_t + cairo_pattern_status (cairo_pattern_t *pattern); + + This snapshot expands the status-based error handling scheme from + cairo_t to cairo_path_t and cairo_pattern_t. It also expands the + scheme so that object-creating functions, (cairo_create, + cairo_pattern_create_*, cairo_copy_path_*), are now guaranteed to + not return NULL. Instead, in the case of out-of-memory these + functions will return a static object with + status==CAIRO_STATUS_NO_MEMORY. The status can be checked with the + functions cairo_status and cairo_pattern_status, or by direct + inspection of the new status field in cairo_path_t. + + Please note that some objects, including cairo_surface_t and all of + the font-related objects have not been converted to this + error-handling scheme. + +* In addition to the above changes, a new private function has been added: + + _cairo_error + + This function can be used to set a breakpoint in a debugger to make + it easier to find programming error in cairo-using code. (Currently, + _cairo_error is called when any error is detected within a cairo_t + context, but is not called for non-cairo_t errors such as for + cairo_path_t and cairo_pattern_t). + +* Fixed cairo_path_data_t so that its enum is visible to C++ code, (as + cairo_path_data_type_t). + +Performance improvements +------------------------ +* Made a minor performance improvement for clipping, (restrict clip + surface to the new intersected bounds). + +* Optimize rendering of a solid source pattern with a pixel-aligned + rectangular path to use backend clipping rather than rasterization + and backend compositing. + +* Optimize cairo_paint_with_alpha to defer to cairo_paint when alpha + is 1.0. + +Bug fixes +--------- +* Fixed memory leak in cairo_copy_path. + +* A build fix for non-srcdir builds. + +PDF backend fixes +----------------- +* New support for path-based clipping. + +* Fix for text rotated to angles other than multiples of π/2. + +Win32 backend fixes +------------------- +* Fix for text extents. + +Xlib backend +------------ +* Implemented a complex workaround for X server bug[*] related to + Render-based compositing with untransformed, repeating source + pictures. The workaround uses core Xlib when possible for + performance, (ie. with CAIRO_OPERATOR_SOURCE or CAIRO_OPERATOR_OVER + with an opaque source surface), and falls back to the pixman + image-based compositing otherwise. + + [*] https://bugs.freedesktop.org/show_bug.cgi?id=3566 + +* Various bug fixes, particularly in the fallback paths. + +Snapshot 0.5.0 (2005-05-17 Carl Worth <cworth@cworth.org>) +========================================================== +This is a pretty big, and fairly significant snapshot. It represents +between 2 and 3 months of solid work from a lot of people on improving +the API as much as possible. I'd like to express my appreciation and +congratulations to everyone who has worked on the big API Shakeup, +(whether in email battles over names, or fixing my silly bugs). + +This snapshot will require some effort on the part of users, since +there are a _lot_ of API changes (ie. no cairo program ever written is +safe --- they're all broken now in at least one way). But, in spite of +that, we do encourage everyone to move their code to this snapshot as +soon as possible. And we're doing everything we can think of to make +the transition as smooth as possible. + +The idea behind 0.5 is that we've tried to make every good API change +we could want now, and get them all done with. That is, between now +and the 1.0 release of cairo, we expect very few new API changes, +(though some will certainly sneak in). We will have some significant +additions, but the pain of moving code from cairo 0.4 to cairo 0.5 +should be a one time experience, and things should be much smoother as +we continue to move toward cairo 1.0. + +And with so many changes coming out for the first time in this 0.5 +release, we really do need a lot of people trying this out to make +sure the ideas are solid before we freeze the API in preparation for +the 1.0 release. + +OK, enough introduction. Here is a (not-quite-complete) description of +the API removals, changes and additions in this snapshot, (compared to +0.4.0) + +API removals +============ +The following public functions have been removed: + +- cairo_set_target_* + + This is a big change. See the description of cairo_create in + the API changes section for how to deal with this. + +- cairo_set_alpha + + Alpha blending hasn't gone away; there's just a much more + unified rendering model now. Almost all uses of + cairo_set_alpha will be trivially replaced with + cairo_set_source_rgba and a few others will be replaced just + as easily with cairo_paint_with_alpha. + +- cairo_show_surface + + Another useful function that we realized was muddling up the + rendering model. The replacement is quite easy: + cairo_set_source_surface and cairo_paint. + +- cairo_matrix_create +- cairo_matrix_destroy +- cairo_matrix_copy +- cairo_matrix_get_affine + + These functions supported an opaque cairo_matrix_t. We now + have an exposed cairo_matrix_t structure, so these can be + dropped. + +- cairo_surface_set_repeat +- cairo_surface_set_matrix +- cairo_surface_set_filter + + These properties don't belong on surfaces. If you were using + them, you'll just want to instead use + cairo_pattern_create_for_surface and then set these properties + on the pattern. + +- cairo_copy + + This was a confusing function and hopefully nobody will miss + it. But if you really don't find cairo_save/restore adequate, + let us know and we have another idea for a potential + replacement. + +And while we're on the subject of removals, we carefully tightened up +the cairo header files so they no longer gratuitously include header +files that are not strictly necessary, (stdio.h, stdint.h, pixman.h, +Xrender.h, etc. and their dependencies). This may lead to some +surprising errors, so keep your eyes open for that. + +API changes +=========== +Here are some of the API changes that have occurred: + +~ cairo_create(void) -> cairo_create(cairo_surface_t *) + + This is the big change that breaks every program. The ability + to re-target a cairo_t was not particularly useful, but it did + introduce a lot of muddy semantic questions. To eliminate + that, cairo_create now requires its target surface to be + passed in at creation time. This isn't too hard to cope with + as the typical first operation after cairo_create was often + cairo_set_target_foo. So the order of those two swap and the + application instead has cairo_foo_surface_create, then + cairo_create. + +~ cairo_current_* -> cairo_get_* + + We had a strange mixture of cairo_get and cairo_current + functions. They've all been standardized on cairo_get, (though + note one is cairo_get_current_point). + +~ CAIRO_OPERATOR_SRC -> CAIRO_OPERATOR_SOURCE +~ CAIRO_OPERATOR_OVER_REVERSE -> CAIRO_OPERATOR_DEST_OVER + + Many of the cairo_operator_t symbolic values were renamed to + reduce the amount of abbreviation. The confusing "OP_REVERSE" + naming was also changed to use "DEST_OP" instead which is + easier to read and has wider acceptance in other + libraries/languages. + +~ cairo_set_pattern -> cairo_set_source +~ cairo_set_rgb_color -> cairo_set_source_rgb + + All of the various functions that changed the source + color/pattern were unified to use cairo_set_source names to + make the relation more clear. + +~ cairo_transform_point -> cairo_user_to_device +~ cairo_transform_distance -> cairo_user_to_device_distance +~ cairo_inverse_transform_point -> cairo_device_to_user +~ cairo_inverse_transform_distance -> cairo_device_to_user_distance + + These names just seemed a lot more clear. + +~ cairo_init_clip -> cairo_reset_clip +~ cairo_concat_matrix -> cairo_transform + + More abbreviation elimination + +~ cairo_current_path -> cairo_copy_path +~ cairo_current_path_flat -> cairo_copy_path_flat + + The former mechanism for examining the current path was a + function that required 3 or 4 callbacks. This was more + complexity than warranted in most situations. The new + cairo_copy_path function copies the current path into an + exposed data structure, and the documentation provides a + convenient idiom for navigating the path data. + +API additions +------------- ++ cairo_paint + + A generalized version of the painting operators cairo_stroke + and cairo_fill. The cairo_paint call applies the source paint + everywhere within the current clip region. Very useful for + clearing a surface to a solid color, or painting an image, + (see cairo_set_source_surface). + ++ cairo_paint_with_alpha + + Like cairo_paint but applying some alpha to the source, + (making the source paint translucent, eg. to blend an image on + top of another). + ++ cairo_mask + + A more generalized version of cairo_paint_with_alpha which + allows a pattern to specify the amount of translucence at each + point rather than using a constant value everywhere. + ++ cairo_mask_surface + + A convenience function on cairo_mask for when the mask pattern + is already contained within a surface. + ++ cairo_surface_set_user_data ++ cairo_surface_get_user_data ++ cairo_font_face_set_user_data ++ cairo_font_face_get_user_data + + Associate arbitrary data with a surface or font face for later + retrieval. Get notified when a surface or font face object is + destroyed. + ++ cairo_surface_finish + + Allows the user to instruct cairo to finish all of its + operations for a given surface. This provides a safe point for + doing things such as flushing and closing files that the + surface may have had open for writing. + ++ cairo_fill_preserve ++ cairo_stroke_preserve ++ cairo_clip_preserve + + One interesting change in cairo is that the path is no longer + part of the graphics state managed by + cairo_save/restore. This allows functions to construct paths + without interfering with the graphics state. But it prevents + the traditional idiom for fill-and-stroke: + + cairo_save; cairo_fill; cairo_restore; cairo_stroke + + Instead we know have alternate versions cairo cairo_fill, + cairo_stroke, and cairo_clip that preserve the current path + rather than consuming it. So the idiom now becomes simply: + + cairo_fill_preserve; cairo_stroke + ++ cairo_surface_write_to_png ++ cairo_surface_write_to_png_stream + + In place of a single PNG backend, now a surface created + through any backend (except PDF currently) can be written out + to a PNG image. + ++ cairo_image_surface_create_from_png ++ cairo_image_surface_create_from_png_stream + + And its just as easy to load a PNG image into a surface as well. + ++ cairo_append_path + + With the new, exposed path data structure, it's now possible + to append bulk path data to the current path, (rather than + issuing a long sequence of cairo_move_to/line_to/curve_to + function calls). + +Xlib and XCB backends +--------------------- + +Any cairo_format_t and Colormap arguments have been dropped from +cairo_xlib_surface_create. There are also two new +cairo_xlib|xcb_surface_create functions: + + cairo_xlib|xcb_surface_create_for_bitmap + (Particular for creating A1 surfaces) + cairo_xlib|xcb_surface_create_with_xrender_format + (For any other surface types, not described by a Visual*) + +All of these surface create functions now accept width and height. In +addition, there are new cairo_xlib|xcb_surface_set_size functions +which must be called each time a window that is underlying a surface +changes size. + +Print backends (PS and PDF) +--------------------------- +The old FILE* based interfaces have been eliminated. In their place we +have two different functions. One accepts a simple const char +*filename. The other is a more general function which accepts a +callback write function and a void* closure. This should allow the +flexibility needed to hook up with various stream object in many +languages. + +In addition, when specifying the surface size during construction, the +units are now device-space units (ie. points) rather than inches. This +provides consistency with all the other surface types and also makes +it much easier to reason about the size of the surface when drawing to +it with the default identity matrix. + +Finally, the DPI parameters, which are only needed to control the +quality of fallbacks, have been made optional. Nothing is required +during surface_create (300 DPI is assumed) and +cairo_ps|pdf_surface_set_dpi can be used to set alternate values if +needed. + +Font system +----------- +Owen very graciously listened to feedback after the big font rework he +had done for 0.4, and came up with way to improve it even more. In 0.4 +there was a cairo_font_t that was always pre-scaled. Now, there is an +unscaled cairo_font_face_t which is easier to construct, (eg. no +scaling matrix required) and work with, (it can be scaled and +transformed after being set on the graphics state). And the font size +manipulation functions are much easier. You can set an explicit size +and read/modify/write the font matrix with: + + cairo_set_font_size + cairo_get_font_matrix + cairo_set_font_matrix + +(Previously you could only multiply in a scale factor or a matrix.) A +pleasant side effect is that we can (and do) now have a default font +size that is reasonable, as opposed to the old default height of one +device-space unit which was useless until scaled. + +Of course, the old pre-scaled font had allowed some performance +benefits when getting many metrics for a font. Those benefits are +still made available through the new cairo_scaled_font_t. And a +cairo_font_face_t can be "promoted" to a cairo_scaled_font_t by +suppling a font_matrix and the desired CTM. + +Quartz backend +-------------- +Tim Rowley put in the work to bring the Quartz backend back after it +had been disabled in the 0.4.0 snapshot. He was not able to bring back +the function that allows one to create a cairo_font_t from an ATSUI +style: + + cairo_font_t * + cairo_atsui_font_create (ATSUStyle style); + +because he didn't have a test case for it. If you care about this +function, please provide a fairly minimal test and we'll try to bring +it back in an upcoming snapshot. + +Snapshot 0.4.0 (2005-03-08 Carl Worth <cworth@cworth.org>) +========================================================== +New documentation +----------------- +Owen Taylor has converted cairo's documentation system to gtk-doc and +has begun some long-needed work on the documentation, which can now be +viewed online here: + + http://cairographics.org/manual/ + +New backend: win32 +------------------ +This is the first snapshot to include a functional win32 backend, +(thanks to Owen Taylor). The interface is as follows: + + #include <cairo-win32.h> + + void + cairo_set_target_win32 (cairo_t *cr, + HDC hdc); + + cairo_surface_t * + cairo_win32_surface_create (HDC hdc); + + cairo_font_t * + cairo_win32_font_create_for_logfontw (LOGFONTW *logfont, + cairo_matrix_t *scale); + + cairo_status_t + cairo_win32_font_select_font (cairo_font_t *font, + HDC hdc); + + void + cairo_win32_font_done_font (cairo_font_t *font); + + double + cairo_win32_font_get_scale_factor (cairo_font_t *font); + +And see also the documentation at: + +http://cairographics.org/manual/cairo-Microsoft-Windows-Backend.html + +Disabled backend: quartz +------------------------ +Unfortunately, the quartz backend code is currently out of date with +respect to some recent backend interface changes. So, the quartz +backend is disabled in this snapshot. + +If the quartz backend is brought up-to-date before the next snapshot, +we would be glad to make a 0.4.1 snapshot that re-enables it, (we do +not expect many more big backend interface changes). + +API Changes +----------- +The font system has been revamped, (as Owen Taylor's work with +integrating pango and cairo gave us the first serious usage of the +non-toy font API). + +One fundamental, user-visible change is that the cairo_font_t object +now represents a font that is scaled to a particular device +resolution. Further changes are described below. + + cairo.h + ------- + Removed cairo_font_set_transform and cairo_font_current_transform. + + Added cairo_font_extents and cairo_font_glyph_extents. See + documentation for details: + + http://cairographics.org/manual/cairo-cairo-t.html#cairo-font-extents + + cairo-ft.h + ---------- + The cairo_ft_font API changed considerably. Please see the + documentation for details: + + http://cairographics.org/manual/cairo-FreeType-Fonts.html + +Performance +----------- +Make the fast-path clipping (pixel-aligned rectangles) faster. + +Add optimization for applying a constant alpha to a pattern. + +Optimize gradients that are horizontal or vertical in device space. + +Xlib: When RENDER is not available, use image surfaces for +intermediate surfaces rather than xlib surfaces. + +Backend-specific changes +------------------------ + Glitz + ----- + Major update to glitz backend. The output quality should now be just + as good as the image and xlib backends. + + Track changes to glitz 0.4.0. + + PDF + --- + Various improvements to produce more conformant output. + +Internals +--------- +David Reveman contributed a large re-work of the cairo_pattern_t +implementation, providing cleaner code and more optimization +opportunities. + + Backend interface changes + ------------------------- + Rework backend interface to accept patterns, not surfaces for source + and mask. + + Remove set_matrix, set_filter, and set_repeat functions. + + More sophisticated backend interface for image fallbacks, + ({acquire,release}_{source,dest}_image() and clone_similar). + +Bug fixes +--------- +Only install header files for backends that have been compiled. + +Fixed some rounding errors leading to incorrectly placed glyphs. + +Many other minor fixes. + +Snapshot 0.3.0 (2005-01-21 Carl Worth <cworth@cworth.org>) +========================================================== +Major API changes +----------------- +1) The public header files will no longer be directly installed into + the system include directory. They will now be installed in a + subdirectory named "cairo", (eg. in /usr/include/cairo rather than + in /usr/include). + + As always, the easiest way for applications to discover the + location of the header file is to let pkg-config generate the + necessary -I CFLAGS and -L/-l LDFLAGS. For example: + + cc `pkg-config --cflags --libs cairo` -o foo foo.c + + IMPORTANT: Users with old versions of cairo installed will need to + manually remove cairo.h and cairo-features.h from the + system include directories in order to prevent the old + headers from being used in preference to the new ones. + +2) The backend-specific portions of the old monolithic cairo.h have + been split out into individual public header files. The new files + are: + + cairo-atsui.h + cairo-ft.h + cairo-glitz.h + cairo-pdf.h + cairo-png.h + cairo-ps.h + cairo-quartz.h + cairo-xcb.h + cairo-xlib.h + + Applications will need to be modified to explicitly include the new + header files where appropriate. + +3) There are two new graphics backends in this snapshot, a PDF + backend, and a Quartz backend. There is also one new font backend, + ATSUI. + +PDF backend +----------- +Kristian Høgsberg has contributed a new backend to allow cairo-based +applications to generate PDF output. The interface for creating a PDF +surface is similar to that of the PS backend, as can be seen in +cairo-pdf.h: + + void + cairo_set_target_pdf (cairo_t *cr, + FILE *file, + double width_inches, + double height_inches, + double x_pixels_per_inch, + double y_pixels_per_inch); + + cairo_surface_t * + cairo_pdf_surface_create (FILE *file, + double width_inches, + double height_inches, + double x_pixels_per_inch, + double y_pixels_per_inch); + +Once a PDF surface has been created, applications can draw to it as +any other cairo surface. + +This code is still a bit rough around the edges, and does not yet +support clipping, surface patterns, or transparent gradients. Text +only works with TrueType fonts at this point and only black text is +supported. Also, the size of the generated PDF files is currently +quite big. + +Kristian is still actively developing this backend, so watch this +space for future progress. + +Quartz backend +-------------- +Calum Robinson has contributed a new backend to allow cairo +applications to target native Mac OS X windows through the Quartz +API. Geoff Norton integrated this backend into the current +configure-based build system, while Calum also provided Xcode build +support in the separate "macosx" module available in CVS. + +The new interface, available in cairo-quartz.h, is as follows: + + void + cairo_set_target_quartz_context (cairo_t *cr, + CGContextRef context, + int width, + int height); + + cairo_surface_t * + cairo_quartz_surface_create (CGContextRef context, + int width, + int height); + +There is an example program available in CVS in cairo-demo/quartz. It +is a port of Keith Packard's fdclock program originally written for +the xlib backend. A screenshot of this program running on Mac OS X is +available here: + + http://cairographics.org/~cworth/images/fdclock-quartz.png + +ATSUI font backend +------------------ +This new font backend complements the Quartz backend by allowing +applications to use native font selection on Mac OS X. The interface +is a single new function: + + cairo_font_t * + cairo_atsui_font_create (ATSUStyle style); + +Minor API changes +----------------- +Prototype for non-existent function "cairo_ft_font_destroy" removed. + +Now depends on libpixman 0.1.2 or newer, (0.1.3 is being released +concurrently and has some useful performance improvements). + +Default paint color is now opaque black, (was opaque white). Default +background color is transparent (as before). + +Renamed "struct cairo" to "struct _cairo" to free up the word "cairo" +from the C++ identifier name space. + +Functions returning multiple return values through provided pointers, +(cairo_matrix_get_affine, cairo_current_point, and +cairo_current_color_rgb), will now accept NULL for values the user +wants to ignore. + +CAIRO_HAS_FREETYPE_FONT has now been renamed to CAIRO_HAS_FT_FONT. + +Performance improvements +------------------------ +Alexander Larsson provided some fantastic performance improvements +yielding a 10000% performance improvement in his application, (when +also including his performance work in libpixman-0.1.3). These include + + * Fixed handling of cache misses. + + * Creating intermediate clip surfaces at the minimal size required. + + * Eliminating roundtrips when creating intermediate Xlib surfaces. + +Implementation +-------------- +Major re-work of font metrics system by Keith Packard. Font metrics +should now be much more reliable. + +Glitz backend +------------- +Updated for glitz-0.3.0. +Bug fixes in reference counting. + +Test suite +---------- +New tests for cache crashing, rotating text, improper filling of +complex polygons, and leaky rasterization. + +Bug fixes +--------- +Fixed assertion failure when selecting the same font multiple times in +sequence. + +Fixed reference counting so cache_destroy functions work. + +Remove unintended copyright statement from files generated with +PostScript backend. + +Fixed to eliminate new warnings from gcc 3.4 and gcc 4. + +Snapshot 0.2.0 (2004-10-27 Carl Worth <cworth@cworth.org>) +=========================================================== +New license: LGPL/MPL +--------------------- +The most significant news with this release is that the license of +cairo has changed. It is now dual-licensed under the LGPL and the +MPL. For details see the COPYING file as well as COPYING-LGPL-2.1 and +COPYING-MPL-1.1. + +I express my thanks to everyone involved in the license change process +for their patience and support! + +New font and glyph internals +---------------------------- +Graydon Hoare has put a tremendous amount of work into new internals +for handling fonts and glyphs, including caches where appropriate. +This work has no impact on the user-level API, but should result in +great performance improvements for applications using text. + +New test suite +-------------- +This snapshot of cairo includes a (small) test suite in +cairo/test. The tests can be run with "make check". The test suite was +designed to make it very easy to add new tests, and we hope to see +many contributions here. As you find bugs, please try adding a minimal +test case to the suite, and submit it with the bug report to the +cairo@cairographics.org mailing list. This will make it much easier +for us to track progress in fixing bugs. + +New name for glitz backend +-------------------------- +The gl backend has now been renamed to the glitz backend. This means +that the following names have changed: + + CAIRO_HAS_GL_SURFACE -> CAIRO_HAS_GLITZ_SURFACE + cairo_set_target_gl -> cairo_set_target_glitz + cairo_gl_surface_create -> cairo_glitz_surface_create + +This change obviously breaks backwards compatibility for applications +using the old gl backend. + +Up-to-date with latest glitz snapshots +-------------------------------------- +This snapshot of cairo is now up to date with the latest glitz +snapshot, (currently 0.2.3). We know that the latest cairo and glitz +snapshots have been incompatible for a very long time. We've finally +fixed that now and we're determined to not let that happen again. + +Revert some tessellation regression bugs +---------------------------------------- +People that have been seeing some tessellation bugs, (eg. leaked +fills), in the CVS version of cairo may have better luck with this +release. A change since the last snapshot was identified to trigger +some of these bugs and was reverted before making the snapshot. The +behavior should be the same as the previous (0.1.23) snapshot. + +Miscellaneous changes +--------------------- +Changed CAIRO_FILTER_DEFAULT to CAIRO_FILTER_BEST to make gradients +easier. + +Track XCB API change regarding iterators. + +Various bug fixes +----------------- +Fix calculation of required number of vertices for pen. + +Fix to avoid zero-dimensioned pixmaps. + +Fix broken sort of pen vertices. + +Fix bug when cairo_show_text called with a NULL string. + +Fix clipping bugs. + +Fix bug in computing image length with XCB. + +Fix infinite loop bug in cairo_arc. + +Fix memory management interactions with libpixman. + +Snapshot 0.1.23 (2004-05-11 Carl Worth <cworth@isi.edu>) +======================================================== +Fixes for gcc 3.4 +----------------- +Fix prototype mismatches so that cairo can be built by gcc 3.4. + +Updates to track glitz +---------------------- +Various fixes to support the latest glitz snapshot (0.1.2). + +Gradient updates +---------------- +Radial gradients now support both inner and outer circles. +Transformed linear gradients are now properly handled. +Fixes for extend type reflect. + +Glitz updates +------------- +Converted shading routines to use fixed point values and introduced a +shading operator structure for more efficient shading calculations. +Support compositing with mask surface when mask is solid or +multi-texturing is available. + +PNG backend cleanups +-------------------- +Fix output to properly compensate for pre-multiplied alpha format in cairo. +Add support for A8 and A1 image formats. + +Bug fixes +--------- +Avoid crash or infinite loop on null strings and degeneratively short +splines. + +New? bugs in cairo_clip +----------------------- +There are some fairly serious bugs in cairo_clip. It is sometimes +causing an incorrect result. And even when it does work, it is +sometimes so slow as to be unusable. Some of these bugs may not be +new, (indeed cairo_clip has only ever had a braindead-slow +implementation), but I think they're worth mentioning here. + +Snapshot 0.1.22 (2004-04-16 Carl Worth <cworth@isi.edu>) +======================================================== +Cairo was updated to track the changes in libpixman, and now depends +on libpixman version 0.1.1. + +Snapshot 0.1.21 (2004-04-09 David Reveman <c99drn@cs.umu.se>) +============================================================= +New OpenGL backend +------------------ +The OpenGL backend provides hardware accelerated output for +X11 and OS X. The significant new functions are: + + cairo_set_target_gl + cairo_gl_surface_create + +Automatic detection of available backends +----------------------------------------- +The configure script now automatically detect what backends are +available, (use ./configure --disable-`backend' to prevent +compilation of specific backends). + +Snapshot 0.1.20 (2004-04-06 Carl Worth <cworth@isi.edu>) +======================================================== +New pattern API +--------------- +David Reveman has contributed a new pattern API which enable linear +and radial gradient patterns in addition to the original surface-based +patterns. The significant new top-level functions are: + + cairo_pattern_create_linear + cairo_pattern_create_radial + cairo_pattern_create_for_surface + cairo_pattern_add_color_stop + cairo_set_pattern + +Any code using the old cairo_set_pattern, (which accepted a +cairo_surface_t rather than a cairo_pattern_t), will need to be +updated. + +Update to XCB backend +--------------------- +The XCB backend is now enabled by default, (use ./configure +--disable-xcb to turn it off). + +Faster clipping +--------------- +Graydon Hoare has added optimizations that make cairo_clip much faster +when the path is a pixel-aligned, rectangular region. + +Bug fixes. + +Snapshot 0.1.19 (2004-02-24 Carl Worth <cworth@isi.edu>) +======================================================== +New PNG backend +--------------- +Olivier Andrieu contributed a new PNG backend. It builds on the +existing image backend to make it easy to render "directly" to a +.png file. The user never needs to deal with the actual image +buffer. The significant new functions are: + + cairo_set_target_png + cairo_png_surface_create + +The PNG backend is not enabled by default so that by default there is +not a new dependency on libpng. Use ./configure --enable-png to enable +this backend. + +Snapshot 0.1.18 (2004-02-17 Carl Worth <cworth@isi.edu>) +======================================================== +Path query functionality +------------------------ +It's now possible to query the current path. The two new functions +are: + + cairo_current_path + cairo_current_path_flat + +Each function accepts a number of callback functions that will be +called for each element in the path (move_to, line_to, curve_to, +close_path). The cairo_current_path_flat function does not accept a +curve_to callback. Instead, all curved portions of the path will be +converted to line segments, (within the current tolerance value). This +can be handy for doing things like text-on-path without having to +manually interpolate Bézier splines. + +New XCB backend +--------------- +Jamey Sharp has contributed a second X backend that uses the new, lean +XCB library rather than Xlib. It cannot currently be compiled at the +same time as the Xlib backend. See ./configure --enable-xcb. + +Build fixes for cygwin. + +Bug fixes. + +Snapshot 0.1.17 (2003-12-16 Carl Worth <cworth@isi.edu>) +======================================================== + +Better text support +------------------- +This snapshot provides much better text support by implementing the +following four functions: + + cairo_text_extents + cairo_glyph_extents + cairo_text_path + cairo_glyph_path + +The text/glyph_extents functions can be used to determine the bounding +box (and advance) for text as if drawn by show_text/glyphs. + +The text/glyph_path objects functions place text shapes on the current +path, where they can be subsequently manipulated. For example, +following these functions with cairo_stroke allows outline text to be +drawn. Calling cairo_clip allows clipping to a text-shaped region. + +Combined dependencies +--------------------- +The cairo core now depends only on the libpixman library. This single +library replaces the three previous libraries libic, libpixregion, and +slim. Thanks to Dave Beckett <dave.beckett@bristol.ac.uk> for all of +the heavy lifting with this renaming effort. + +Conditional compilation of backends +----------------------------------- +Cairo now allows optional backends to be disabled at compile time. The +following options may now be passed to the configure script: + + --disable-xlib + --disable-ps + +Note that the first option is a change from the old --without-x option +which will no longer have any effect. + +OS X supported - several byte-order issues resolved +--------------------------------------------------- +Cairo has now been successfully compiled under OS X. Testing revealed +that there were some byte-order problems in the PostScript backend and +the PNG generation in the demos. These have now been resolved. + +2003-10 +======= +Graydon Hoare <graydon@redhat.com> implemented the first real text +support using Freetype/fontconfig, (previous versions of cairo used +Xft and could only draw text when using an X backend). + +2003-09 +======= +Graydon Hoare <graydon@redhat.com> added the first real support for +running cairo with a non-render-aware X server. + +Jamey Sharp <jamey@minilop.net> virtualized the backend font and +surface interfaces in September, 2003. + +2003-06 +======= +Xr is renamed cairo to avoid confusion since it no longer had a strict +dependence on X. + +2003-05 +======= +A new image surface backend is added to Xr. Keith Packard +<keithp@keithp.com> wrote the image compositing code in libic that is +used for the image_surface backend. This code was originally written +as the software fallback for the render extension within the X +server. + +2002-06 +======= +Carl Worth <cworth@isi.edu> wrote the first lines of Xr, after Keith +Packard <keithp@keithp.com> proposed the plan for a stateful drawing +library in C providing a PostScript-like rendering model. + + LocalWords: mutex BeOS extraordinaire distro's URL lcd bool tarball diff --git a/PORTING_GUIDE b/PORTING_GUIDE new file mode 100644 index 000000000..7488173c4 --- /dev/null +++ b/PORTING_GUIDE @@ -0,0 +1,265 @@ + ...-----=======-----... + Cairo 1.0 Porting Guide + ...-----=======-----... + +Here are some notes on more easily porting cairo_code from cairo 0.4 +to cairo 1.0. It is sorted roughly in order of importance, (the items +near the top are expected to affect the most people). + +Automated API renamings +======================= +There have been a lot of simple renamings where the functionality is +the same but the name of the symbol is different. We have provided a +script to automate the conversion of these symbols. It can be found +within the cairo distribution in: + + util/cairo-api-update + +This script is used by installing it somewhere on your PATH, and the +running it and providing the names of your source files on the command +line. For example: + + cairo-api-update *.[ch] + +The script will first save backup copies of each file (renamed with a +.bak extension) and then will perform all of the simple renamings. + +For your benefit, the script also produces messages giving filenames +and line numbers for several of the manual API updates that you will +need to perform as described below. + + +Manual API changes +================== +This section of the porting guide describes changes you will have to +manually make to your source code. In addition to the information in +this guide, the cairo-api-update script will notify you of some of +these issues as described above. + +Cairo's deprecation warnings +---------------------------- +Also, if your compiler provides warnings for implicit declarations of +functions, (eg. "gcc -Wall"), then simply attempting to compile your +program will cause cairo to generate messages intended to guide you +through the porting process. + +For example, if you neglect to update an old call to +cairo_set_target_drawable, you might see an error message as follows: + + foo.c:10: warning: implicit declaration of function + ‘cairo_set_target_drawable_DEPRECATED_BY_cairo_xlib_surface_create’ + +This message is indicating to you that the deprecatd function +cairo_set_target_drawable appears in your program foo.c on line 10, +and you should rewrite your program to call cairo_xlib_surface_create +instead. + +The remainder of this porting guide is arranged as a set of common +code patterns that appear in old (cairo-0.4) code and how it should be +transformed to new (cairo-0.5) code. + +cairo_create +------------ +Was: cr = cairo_create (); + cairo_set_target_foo (cr, args); + /* draw */ + cairo_destroy (cr); + +Now: cairo_surface_t *surface; + + surface = cairo_foo_surface_create (args); + cr = cairo_create (surface); + /* draw */ + cairo_destroy (cr); + cairo_surface_destroy (surface); + +Or: cairo_surface_t *surface; + + surface = cairo_foo_surface_create (args); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + /* draw */ + cairo_destroy (cr); + +NOTE: Many of the cairo_foo_surface_create functions accept the + identical arguments as the the old cairo_set_target_foo + functions, (minus the cairo_t*), making this transformation + quite easy. One notable exception is cairo_set_target_drawable + which, when it becomes cairo_xlib_surface_create must pickup new + arguments for the Visual*, the width, and the height. + +cairo_set_alpha (1) +------------------- +Was: cairo_set_rgb_color (cr, red, green, blue); + cairo_set_alpha (cr, alpha); + +Now: cairo_set_source_rgba (cr, red, green, blue, alpha); + +cairo_show_surface +------------------ +Was: cairo_show_surface (cr, surface, width, height); + +Now: cairo_set_source_surface (cr, surface, x, y); + cairo_paint (cr); + +NOTE: The type signatures of cairo_show_surface and cairo_set_source + are the same, but pay attention that cairo_show_surface required + the width and height, while cairo_set_source_surface requires + the X,Y location to where the surface will be placed. + +cairo_set_alpha (2) +------------------- +Was: cairo_set_alpha (cr, alpha); + cairo_show_surface (cr, surface, width, height); + +Now: cairo_set_source_surface (cr, surface, x, y); + cairo_paint_with_alpha (cr, alpha); + +filling and stroking +-------------------- +Was: cairo_save (cr); + /* set fill color */ + cairo_fiill (cr); + cairo_restore (cr); + /* set stroke color */ + cairo_stroke (cr); + +Now: /* set fill color */ + cairo_fill_preserve (cr); + /* set stroke color */ + cairo_stroke (cr); + +NOTE: The current path is no longer saved/restored by + cairo_save/cairo_restore. This can lead to some subtle + surprises, so look out. + +cairo_matrix_t +-------------- +Was: cairo_matrix_t *matrix; + + matrix = cairo_matrix_create (); + /* Do stuff with matrix */ + cairo_matrix_destroy (matrix); + +Now: cairo_matrix_t matrix; + cairo_matrix_init_identity (&matrix); + /* Do stuff with &matrix */ + +NOTE: If you are really lazy, you can still use a cairo_matrix_t* and + avoid putting the &matrix all over by just replacing + cairo_matrix_create() with malloc() and cairo_matrix_destroy() + with free(). That's not as nice, and you still need to be + careful to see if you need to initialize it to an identity + matrix as cairo_matrix_create() did for you. + +Rendering to a temporary surface +-------------------------------- +Was: cairo_save (cr); + { + cairo_set_target_surface (cr, temporary); + /* draw through cr onto temporary */ + } + cairo_restore (cr); + /* use temporary as source on cr */ + +Now: { + cr2 = cairo_create (temporary); + /* draw through cr2 onto temporary */ + cairo_destory (cr2); + } + /* use temporary as source on cr */ + +NOTE: Having to create another cairo_t is a bit annoying, but having + to invent a new name for it is just awful, (imagine a deeply + nested version of this code). Fortunately, the style above is + just a stop-gap measure until the new group API comes along. + +Iterating over a path +--------------------- +Was: cairo_current_path (cr, + my_move_to, + my_line_to, + my_curve_to, + my_close_path, + closure); + +Now: int i; + cairo_path_t *path; + cairo_path_data_t *data; + + path = cairo_copy_path (cr); + + for (i=0; i < path->num_data; i += path->data[i].header.length) { + data = &path->data[i]; + switch (data->header.type) { + case CAIRO_PATH_MOVE_TO: + my_move_to (closure, data[1].point.x, data[1].point.y); + break; + case CAIRO_PATH_LINE_TO: + my_line_to (closure, data[1].point.x, data[1].point.y); + break; + case CAIRO_PATH_CURVE_TO: + my_curve_to (closure, data[1].point.x, data[1].point.y, + data[2].point.x, data[2].point.y, + data[3].point.x, data[3].point.y); + break; + case CAIRO_PATH_CLOSE_PATH: + my_close_path (closure); + break; + } + } + cairo_path_destroy (path); + +NOTE: This version makes it looks like the new form is a _lot_ more + verbose than the old version. But realize that the old version + required the support of 4 additional functions. The new approach + allows great flexibility including the ability to inline the + entire operation within the switch statement when appropriate. + +Erasing a surface to transparent +-------------------------------- +Was: cairo_set_rgb_color (cr, 0., 0., 0.); + cairo_set_alpha (cr, 0.) + cairo_set_operator (cr, CAIRO_OPERATOR_SRC); + cairo_rectangle (cr, 0., 0., surface_width, surface_height); + cairo_fill (cr); + + or: cairo_set_rgb_color (cr, 0., 0., 0.); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_rectangle (cr, 0., 0., surface_width, surface_height); + cairo_fill (cr); + +Now: cairo_set_source_rgba (cr, 0., 0., 0., 0.); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + or: cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr); + +NOTE: Using cairo_rectangle and fill would still work just fine. It's + just a lot more convenient to use cairo_paint now, (particularly + as it doesn't require you to even know what the bounds of the + target surface are). + +Drawing to a PNG file +--------------------- +Was: file = fopen (filename, "w"); + cr = cairo_create (); + cairo_set_target_png (cr, file, format, width, height); + /* draw image */ + cairo_destroy (cr); + fclose (file); + +Now: surface = cairo_image_surface_create (format, width, height); + cr = cairo_create (surface); + /* draw image */ + cairo_surface_write_to_png (surface, filename); + cairo_destroy (cr); + cairo_surface_destroy (surface); + +NOTE: The png backend is gone. So there is no cairo_png_surface_create + to take the place of cairo_set_target_png. And notice that we + used an image surface here, but it is just as easy to use + cairo_surface_write_to_png with an xlib or other surface, (but + not PDF at the moment). This is one of the big advantages of + this approach as opposed to a PNG surface. diff --git a/README b/README new file mode 100644 index 000000000..0be9947d5 --- /dev/null +++ b/README @@ -0,0 +1,204 @@ +Cairo - Multi-platform 2D graphics library +http://cairographics.org + +What is cairo +============= +Cairo is a 2D graphics library with support for multiple output +devices. Currently supported output targets include the X Window +System (via both Xlib and XCB), quartz, win32, and image buffers, +as well as PDF, PostScript, and SVG file output. Experimental backends +include OpenGL, BeOS, OS/2, and DirectFB. + +Cairo is designed to produce consistent output on all output media +while taking advantage of display hardware acceleration when available +(for example, through the X Render Extension). + +The cairo API provides operations similar to the drawing operators of +PostScript and PDF. Operations in cairo include stroking and filling +cubic Bézier splines, transforming and compositing translucent images, +and antialiased text rendering. All drawing operations can be +transformed by any affine transformation (scale, rotation, shear, +etc.). + +Cairo has been designed to let you draw anything you want in a modern +2D graphical user interface. At the same time, the cairo API has been +designed to be as fun and easy to learn as possible. If you're not +having fun while programming with cairo, then we have failed +somewhere---let us know and we'll try to fix it next time around. + +Cairo is free software and is available to be redistributed and/or +modified under the terms of either the GNU Lesser General Public +License (LGPL) version 2.1 or the Mozilla Public License (MPL) version +1.1. + +Where to get more information about cairo +========================================= +The primary source of information about cairo is: + + http://cairographics.org/ + +The latest versions of cairo can always be found at: + + http://cairographics.org/download + +Documentation on using cairo and frequently-asked questions: + + http://cairographics.org/documentation + http://cairographics.org/FAQ + +Mailing lists for contacting cairo users and developers: + + http://cairographics.org/lists + +Roadmap and unscheduled things to do, (please feel free to help out): + + http://cairographics.org/roadmap + http://cairographics.org/todo + +Dependencies +============ +The set of libraries needed to compile cairo depends on which backends +are enabled when cairo is configured. So look at the list below to +determine which dependencies are needed for the backends of interest. + +For the surface backends, we have both "supported" and "experimental" +backends. Further, the supported backends can be divided into the +"standard" backends which can be easily built on any platform, and the +"platform" backends which depend on some underlying platform-specific +system, (such as the X Window System or some other window system). + +As an example, for a standard Linux build similar to what's shipped by +your distro, (with image, png, pdf, PostScript, svg, and xlib surface +backends, and the freetype font backend), the following sample commands +will install necessary dependencies: + + Debian (and similar): + + apt-get build-dep cairo + + Fedora (and similar): + + yum install libpng-devel zlib-devel libXrender-devel fontconfig-devel + +Technically you probably don't need pixman from the distribution since +if you're manually compiling Cairo you probably want an updated pixman +as well. However, if you follow the default settings and install pixman +to /usr/local, your Cairo build should properly use it in preference to +the system pixman. + + +Supported, "standard" surface backends +------------------------------------ + image backend (required) + ------------------------ + pixman >= 0.30.0 http://cairographics.org/releases + + png support (can be left out if desired, but many + ----------- applications expect it to be present) + libpng http://www.libpng.org/pub/png/libpng.html + + pdf backend + ----------- + zlib http://www.gzip.org/zlib + + postscript backend + ------------------ + zlib http://www.gzip.org/zlib + + svg backend + ----------- + [none] + +Supported, "platform" surface backends +----------------------------------- + xlib backend + ------------ + X11 http://freedesktop.org/Software/xlibs + + xlib-xrender backend + -------------------- + Xrender >= 0.6 http://freedesktop.org/Software/xlibs + + quartz backend + -------------- + MacOS X >= 10.5 with Xcode >= 3.0 + + win32 backend + ------------- + Microsoft Windows 2000 or newer[*]. + + xcb backend + ----------- + XCB http://xcb.freedesktop.org + +Font backends (required to have at least one) +--------------------------------------------- + freetype font backend + --------------------- + freetype >= 2.1.9 http://freetype.org + fontconfig http://fontconfig.org + + quartz-font backend + ------------------- + MacOS X >= 10.4 with Xcode >= 2.4 + + win32 font backend + ------------------ + Microsoft Windows 2000 or newer[*]. + + [*] The Win32 backend should work on Windows 2000 and newer + (excluding Windows Me.) Most testing has been done on + Windows XP. While some portions of the code have been + adapted to work on older versions of Windows, considerable + work still needs to be done to get cairo running in those + environments. + + Cairo can be compiled on Windows with either the gcc + toolchain (see http://www.mingw.org) or with Microsoft + Visual C++. If the gcc toolchain is used, the standard + build instructions using configure apply, (see INSTALL). + If Visual C++ is desired, GNU make is required and + Makefile.win32 can be used via 'make -f Makefile.win32'. + The compiler, include paths, and library paths must be set + up correctly in the environment. + + MSVC versions earlier than 7.1 are known to miscompile + parts of cairo and pixman, and so should be avoided. MSVC + 7.1 or later, including the free Microsoft Visual Studio + Express editions, produce correct code. + +Experimental surface backends +----------------------------- + beos backend + ------------ + No dependencies in itself other than an installed BeOS system, but cairo + requires a font backend. See the freetype dependency list. + + os2 backend + ----------- + Cairo should run on any recent version of OS/2 or eComStation, but it + requires a font backend. See the freetype dependency list. Ready to use + packages and developer dependencies are available at Netlabs: + ftp://ftp.netlabs.org/pub/cairo + + skia backend + ------------ + Requires the skia library as of June 2014. Since skia is not + API stable, building against newer (or older) versions of skia + will probably fail. + + +Compiling +========= +See the INSTALL document for build instructions. + + +History +======= +Cairo was originally developed by Carl Worth <cworth@cworth.org> and +Keith Packard <keithp@keithp.com>. Many thanks are due to Lyle Ramshaw +without whose patient help our ignorance would be much more apparent. + +Since the original development, many more people have contributed to +cairo. See the AUTHORS files for as complete a list as we've been able +to compile so far. diff --git a/README.win32 b/README.win32 new file mode 100644 index 000000000..ff962b72a --- /dev/null +++ b/README.win32 @@ -0,0 +1,66 @@ +Building Cairo on Windows +========================= +There are two primary ways to build Cairo on Windows. You can use a +UNIX emulation based setup, such as Cygwin or MSYS, with the +conventional configure script shipped with Cairo releases. In this +configuration, you will build with GCC and (implicitly) libtool. In +the Cygwin case you end up with a DLL that depends on Cygwin and +should be used only from Cygwin applications. In the MSYS case you end +up with a "normal" Win32 DLL that can be used either from GCC- or +Microsoft Visual C++-compiled code. In theory, this technique is no +different than the ordinary build process for the Cairo library. In +practise there are lots of small details that can go wrong. + +The second way is to use a GNU-compatible make, but build using +Microsoft's Visual C++ compiler to produce native libraries. This is +the setup this README.win32 is written for. Also the DLL produced this +way is usable either from GCC- or MSVC-compiled code. + +Tools required +============== +You will need GNU make, version 3.80 or later. Earlier versions or +other modern make implementations may work, but are not guaranteed to. + +You will also need Microsoft Visual C++. Version 7 has been most +heavily tested, but other versions are likely to work fine. + +Libraries required +================== +Cairo requires a compatible version of the pixman library. Full build +instructions are beyond the scope of this document; however, using the +same tools, it should be possible to build pixman simply by entering +the pixman/src directory and typing: + + make -f Makefile.win32 CFG=release + +Depending on your feature set, you may also need zlib and libpng. + +Building +======== +There are a few files that you will need to edit. First, you must +determine which features will be built. Edit +build/Makefile.win32.features and set the features as desired. Note +that most features have external dependencies; specifically, +CAIRO_HAS_PNG_FUNCTIONS requires libpng to be present, and +CAIRO_HAS_PS_SURFACE and CAIRO_HAS_PDF_SURFACE both require zlib. + +To ensure that the compiler can find all dependencies, you may need to +edit build/Makefile.win32.common. In particular, ensure that +PIXMAN_CFLAGS contains a -I parameter pointing to the location of +your pixman header files and that PIXMAN_LIBS points to the actual +location of your pixman-1.lib file. You may also need to edit the +various occurrences of CAIRO_LIBS to point to other libraries +correctly. Note also that if you wish to link statically with zlib, +you should replace zdll.lib with zlib.lib. + +Finally, from the top Cairo directory, type: + + make -f Makefile.win32 CFG=release + +If this command succeeds, you will end up with src/release/cairo.dll. +To successfully use Cairo from your own programs, you will probably +want to move this file to some central location. You will also +probably want to copy the Cairo header files. These should be placed +in a cairo subdirectory (for instance, c:/code/common/include/cairo). +The exact set to copy depends on your features and is reported to you +at the end of the build. diff --git a/RELEASING b/RELEASING new file mode 100644 index 000000000..f6f5eeb51 --- /dev/null +++ b/RELEASING @@ -0,0 +1,142 @@ +Here are the steps to follow to create a new cairo release: + +1) Ensure that there are no local, uncommitted/unpushed + modifications. You're probably in a good state if both "git diff + HEAD" and "git log master..origin/master" give no output. Also make + sure you have libglib2.0-doc installed (else you'll get excessive + gtk-doc cross reference warnings in the next step). + +2) Verify that the code passes "make distcheck" + + First, make sure you have 'nm' and 'readelf' commands in PATH. + this should be OK with any Linux distro. + + Running "make distcheck" should result in no warnings or + errors and end with a message of the form: + + ============================================= + cairo-X.Y.Z archives ready for distribution: + cairo-X.Y.Z.tar.gz + ============================================= + + (But the tar file isn't actually ready yet, as we still have + some more steps to follow). + + Note that it's allowed (and perhaps recommended) to run the + "make distcheck" step against an all-software X server such as + Xvfb to avoid getting tripped up by any X-server-driver-specific + bugs. See test/README for details + + If you get errors about local PLT entries, you get the list of + cairo entries with the error. For each of these, a call to + slim_hidden_def and slim_hidden_proto is needed in the cairo + implementation in the style of other similar calls. + + In the unfortunate case that you have to push a snapshot out + (note, I said snapshot, not release) without the entire test + suite passing, here's the magic env vars to set when doing + 'make distcheck' and 'make release-publish' that will let you + get away with it. At any cost, never ever release without + (implied) distchecking. Every time we got around it, it turned + out to be a disaster. Anyway, here's the pass code: + + DISPLAY= CAIRO_TEST_TARGET=" " + +3) Fill out an entry in the NEWS file + + Sift through the logs since the last release. This is most + easily done with a command such as: + + git log --stat X.Y.Z.. + + where X.Y.Z is the previous release version. + + Summarize major changes briefly in a style similar to other + entries in NEWS. Take special care to note any additions in + the API. These should be easy to find by noting modifications + to .h files in the log command above. And more specifically, + the following command will show each patch that has changed a + public header file since the given version: + + find src/ -name '*.h' ! -name '*-private.h' ! -name 'cairoint.h' ! -name 'cairo-*features*.h' | \ + xargs git diff X.Y.Z.. -- + +4) Increment cairo_version_{minor|micro} in cairo-version.h: + + If there are backward-incompatible changes in the API, stop + now and don't release. Go back and fix the API instead. Cairo + is intended to remain backwards-compatible as far as API. + + So cairo_version_major will not be incremented unless we come + up with a new versioning scheme to take advantage of it. + + If there are API additions, then increment cairo_version_minor + and reset cairo_version_micro to 0. NOTE: The minor version is + only incremented for releases, not for snapshots. + + Otherwise, (i.e. there are only bug fixes), increment + cairo_version_micro to the next larger (even) number. + +5) Commit the changes to NEWS and cairo-version.h + + It's especially important to mention the new version number in your + commit log. + +6) Run "make release-publish" which will perform the following steps + for you: + + * Generate ChangeLog files out of git repository + * Check that ChangeLog files were generated properly + * Check that the version number ends with an even micro component + * Check that no release exists with the current version + * Verify that make distcheck completes successfully + * Generate the final tar file + * Generate an sha1sum file + * Sign the sha1sum using your GPG setup (asks for your GPG password) + * scp the three files to appear on http://cairographics.org/releases + * Generate a versioned manual and upload it to appear as both: + http://cairographics.org/manual-X.Y.Z + http://cairographics.org/manual + * Place local copies of the three files in the releases directory + * Create a LATEST-package-version file (after deleting any old one) + * Tag the entire source tree with a tag of the form X.Y.Z, and sign + the tag with your GPG key (asks for your GPG password, and you + may need to set GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL to match + your public-key's setting or this fails.) + * Provide some text for the release announcement (see below). + If for some reason you lost this message, "make release-publish-message" + prints it for you. + +7) Increment cairo_version_micro to the next larger (odd) number in + cairo-version.h, commit, and push. + +8) Push the newly created tag out to the central tree with a command + something like: + + git push upstream master X.Y.Z + +9) Edit the cairo bugzilla product and add the new version numbers. Note + that you need to add two versions. One for the release/snapshot (with + an even micro version), another with the post-release version (with an + odd micro version). + +10) Send a message to cairo-announce@cairographics.org and CC + gnome-announce-list@gnome.org and ftp-release@lists.freedesktop.org + (pr@lwn.net as well for major releases) to announce the new release + using the text provided from "make release-publish", adding the excerpt + from NEWS, your signature, followed by the standard "What is cairo" and + "Where to get more information about cairo" blurbs from README, and + finally the shortlog of all changes since last release, generated by: + + git shortlog X.Y.Z... + + where X.Y.Z is the last released version. + +11) Edit the cairo wiki to add the announcement to the NEWS page and + the front page. (just the parts before your signature). + +12) For minor releases (no X.Y change), notify desktop-devel-list@gnome.org + or update the ExternalDependencies page for the current cycle if you + know where it is. Currently it's: + + http://live.gnome.org/TwoPointNineteen/ExternalDependencies diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 000000000..dcf54f935 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,55 @@ +dnl -*- mode: autoconf -*- + +dnl [m4_newline] didn't appear until autoconf 2.62 +m4_ifdef([m4_newline],,[m4_define([m4_newline],[ +])]) + +dnl These are not available in autoconf 2.59 + +m4_ifdef([m4_foreach_w],,[m4_define([m4_foreach_w], +[m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) + +m4_ifdef([AS_CASE],,[ +m4_define([_AS_CASE], +[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], + [$#], 1, [ *) $1 ;;], + [$#], 2, [ $1) m4_default([$2], [:]) ;;], + [ $1) m4_default([$2], [:]) ;; +$0(m4_shift2($@))])dnl +]) +m4_defun([AS_CASE], +[m4_ifval([$2$3], +[case $1 in +_AS_CASE(m4_shift($@)) +esac +])dnl +])# AS_CASE +]) + +m4_ifdef([m4_shift2],, [m4_define([m4_shift2], [m4_shift(m4_shift($@))])]) + + +dnl ========================================================================== + +dnl This has to be in acinclude.m4 as it includes other files + +dnl Parse Version.mk and declare m4 variables out of it +m4_define([CAIRO_PARSE_VERSION],dnl + m4_translit(dnl + m4_bpatsubst(m4_include(cairo-version.h), + [^.define \([a-zA-Z0-9_]*\) *\([0-9][0-9]*\)], + [[m4_define(\1, \2)]]), + [A-Z], [a-z])dnl +)dnl + +dnl ========================================================================== + +m4_pattern_forbid([^cr_]) + +dnl AC_AUTOCONF_VERSION was introduced in 2.62, so its definition works as +dnl a conditional on version >= 2.62. Older versions did not call +dnl m4_pattern_allow from AC_DEFINE and friends. To avoid lots of warnings we +dnl only forbid CAIRO_ if autoconf is recent enough. +m4_ifdef([AC_AUTOCONF_VERSION], +[m4_pattern_forbid([CAIRO])], +[m4_pattern_forbid([_CAIRO])]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 000000000..71bf34075 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1222 @@ +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.14' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.14.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.14.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <http://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar <conftest.tar]) + AM_RUN_LOG([cat conftest.dir/file]) + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([build/aclocal.cairo.m4]) +m4_include([build/aclocal.compare.m4]) +m4_include([build/aclocal.enable.m4]) +m4_include([build/aclocal.float.m4]) +m4_include([build/aclocal.makefile.m4]) +m4_include([build/aclocal.pkg.m4]) +m4_include([build/gtk-doc.m4]) +m4_include([build/libtool.m4]) +m4_include([build/ltoptions.m4]) +m4_include([build/ltsugar.m4]) +m4_include([build/ltversion.m4]) +m4_include([build/lt~obsolete.m4]) +m4_include([acinclude.m4]) diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 000000000..4d113f8be --- /dev/null +++ b/autogen.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +test -n "$srcdir" || srcdir=`dirname "$0"` +test -n "$srcdir" || srcdir=. + +ORIGDIR=`pwd` +cd $srcdir + +AUTORECONF=`which autoreconf` +if test -z $AUTORECONF; then + echo "*** No autoreconf found, please intall it ***" + exit 1 +fi + +GTKDOCIZE=`which gtkdocize` +if test -z $GTKDOCIZE; then + echo "*** No GTK-Doc found, documentation won't be generated ***" +else + gtkdocize || exit $? +fi + +# create dummy */Makefile.am.features and ChangeLog to make automake happy +> boilerplate/Makefile.am.features +> src/Makefile.am.features +touch ChangeLog + +autoreconf --install --verbose || exit $? + +cd $ORIGDIR +test -n "$NOCONFIGURE" || "$srcdir/configure" "$@" diff --git a/boilerplate/Makefile.am b/boilerplate/Makefile.am new file mode 100644 index 000000000..29ad015ac --- /dev/null +++ b/boilerplate/Makefile.am @@ -0,0 +1,76 @@ +# Note: All source files are listed in Makefile.sources. + +include $(top_srcdir)/build/Makefile.am.common +include $(srcdir)/Makefile.am.features + +EXTRA_DIST += Makefile.win32 Makefile.win32.features +#MAINTAINERCLEANFILES += $(srcdir)/Makefile.win32.features + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/src \ + $(CAIRO_CFLAGS) \ + $(NULL) +AM_LDFLAGS = $(CAIRO_LDFLAGS) + +if BUILD_CXX +cxx_boilerplate_lib = libcairoboilerplate_cxx.la +else +cxx_boilerplate_lib = +endif + +EXTRA_LTLIBRARIES += libcairoboilerplate.la $(cxx_boilerplate_lib) + + +libcairoboilerplate_la_SOURCES = \ + $(enabled_cairo_boilerplate_headers) \ + $(enabled_cairo_boilerplate_private) \ + $(enabled_cairo_boilerplate_sources) \ + cairo-boilerplate-constructors.c \ + $(NULL) +libcairoboilerplate_cxx_la_SOURCES = \ + $(enabled_cairo_boilerplate_cxx_sources) \ + $(NULL) +libcairoboilerplate_la_LIBADD = $(top_builddir)/src/libcairo.la \ + $(cxx_boilerplate_lib) \ + $(CAIRO_LIBS) \ + $(CAIROBOILERPLATE_LIBS) \ + $(NULL) +libcairoboilerplate_cxx_la_LIBADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LIBS) \ + $(CAIROBOILERPLATE_LIBS) \ + $(NULL) +libcairoboilerplate_la_DEPENDENCIES = \ + $(cxx_boilerplate_lib) \ + $(NULL) + +if CAIRO_HAS_DL +libcairoboilerplate_la_LIBADD += -ldl +endif + +if CAIRO_HAS_BEOS_SURFACE +# BeOS system headers trigger this warning +libcairoboilerplate_cxx_la_CXXFLAGS = -Wno-multichar +endif + +if CAIRO_HAS_WIN32_SURFACE +libcairoboilerplate_la_LIBADD += -lwinspool +endif + +cairo-boilerplate-constructors.c: Makefile $(enabled_cairo_boilerplate_sources) $(enabled_cairo_boilerplate_cxx_sources) make-cairo-boilerplate-constructors.sh + (cd $(srcdir) && sh ./make-cairo-boilerplate-constructors.sh $(enabled_cairo_boilerplate_sources) $(enabled_cairo_boilerplate_cxx_sources)) > $@ + +BUILT_SOURCES += cairo-boilerplate-constructors.c +EXTRA_DIST += $(BUILT_SOURCES) make-cairo-boilerplate-constructors.sh +CLEANFILES += $(BUILT_SOURCES) + +test: check + +if CROSS_COMPILING +else +TESTS += check-link$(EXEEXT) +endif + +check_PROGRAMS += check-link +check_link_LDADD = libcairoboilerplate.la diff --git a/boilerplate/Makefile.am.features b/boilerplate/Makefile.am.features new file mode 100644 index 000000000..528a8325f --- /dev/null +++ b/boilerplate/Makefile.am.features @@ -0,0 +1,519 @@ +# Generated by configure. Do not edit. + +include $(top_srcdir)/boilerplate/Makefile.sources + +supported_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +unsupported_cairo_boilerplate_headers = +all_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +all_cairo_boilerplate_private = $(cairo_boilerplate_private) +all_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) +all_cairo_boilerplate_sources = $(cairo_boilerplate_sources) + +enabled_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +enabled_cairo_boilerplate_private = $(cairo_boilerplate_private) +enabled_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) +enabled_cairo_boilerplate_sources = $(cairo_boilerplate_sources) + + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_sources) +if CAIRO_HAS_XLIB_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xrender_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xrender_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xrender_sources) +if CAIRO_HAS_XLIB_XRENDER_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xrender_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xrender_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xrender_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_sources) +if CAIRO_HAS_XCB_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xcb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources) +if CAIRO_HAS_XLIB_XCB_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xcb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_shm_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources) +if CAIRO_HAS_XCB_SHM_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_shm_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_qt_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_qt_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_qt_sources) +if CAIRO_HAS_QT_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_qt_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_qt_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_qt_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_sources) +if CAIRO_HAS_QUARTZ_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_font_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_font_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_font_sources) +if CAIRO_HAS_QUARTZ_FONT +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_font_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_font_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_font_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_image_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_image_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_image_sources) +if CAIRO_HAS_QUARTZ_IMAGE_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_image_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_image_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_image_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_win32_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_win32_sources) +if CAIRO_HAS_WIN32_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_win32_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_win32_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_win32_font_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_font_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_win32_font_sources) +if CAIRO_HAS_WIN32_FONT +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_win32_font_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_font_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_win32_font_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_skia_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_skia_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_skia_sources) +if CAIRO_HAS_SKIA_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_skia_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_skia_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_skia_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_os2_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_os2_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_os2_sources) +if CAIRO_HAS_OS2_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_os2_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_os2_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_os2_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_beos_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_beos_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_beos_sources) +if CAIRO_HAS_BEOS_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_beos_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_beos_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_beos_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_drm_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources) +if CAIRO_HAS_DRM_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_drm_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gallium_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gallium_sources) +if CAIRO_HAS_GALLIUM_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gallium_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gallium_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_png_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_png_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources) +if CAIRO_HAS_PNG_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_png_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_png_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources) +if CAIRO_HAS_GL_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_glesv2_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glesv2_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_glesv2_sources) +if CAIRO_HAS_GLESV2_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_glesv2_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glesv2_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_glesv2_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_cogl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_cogl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_cogl_sources) +if CAIRO_HAS_COGL_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_cogl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_cogl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_cogl_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_directfb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_directfb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_directfb_sources) +if CAIRO_HAS_DIRECTFB_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_directfb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_directfb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_directfb_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_vg_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources) +if CAIRO_HAS_VG_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_vg_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_egl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_egl_sources) +if CAIRO_HAS_EGL_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_egl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_egl_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_glx_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glx_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_glx_sources) +if CAIRO_HAS_GLX_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_glx_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glx_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_glx_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_wgl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_wgl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_wgl_sources) +if CAIRO_HAS_WGL_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_wgl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_wgl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_wgl_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_script_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_script_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_script_sources) +if CAIRO_HAS_SCRIPT_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_script_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_script_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_script_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_ft_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ft_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_ft_sources) +if CAIRO_HAS_FT_FONT +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_ft_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ft_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_ft_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_fc_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_fc_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_fc_sources) +if CAIRO_HAS_FC_FONT +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_fc_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_fc_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_fc_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_ps_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ps_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_ps_sources) +if CAIRO_HAS_PS_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_ps_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ps_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_ps_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_pdf_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pdf_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_pdf_sources) +if CAIRO_HAS_PDF_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_pdf_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pdf_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_pdf_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_svg_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_svg_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_svg_sources) +if CAIRO_HAS_SVG_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_svg_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_svg_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_svg_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_test_surfaces_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_test_surfaces_sources) +if CAIRO_HAS_TEST_SURFACES +enabled_cairo_boilerplate_private += $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_test_surfaces_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_test_surfaces_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_image_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_image_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_image_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_image_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_image_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_image_sources) + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_mime_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_mime_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_mime_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_mime_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_mime_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_mime_sources) + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_recording_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_recording_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_recording_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_recording_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_recording_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_recording_sources) + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_observer_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_observer_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_observer_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_observer_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_observer_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_observer_sources) + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_tee_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_tee_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_tee_sources) +if CAIRO_HAS_TEE_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_tee_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_tee_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_tee_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xml_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xml_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xml_sources) +if CAIRO_HAS_XML_SURFACE +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xml_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xml_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xml_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_user_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_user_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_user_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_user_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_user_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_user_sources) + +all_cairo_boilerplate_private += $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pthread_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_pthread_sources) +if CAIRO_HAS_PTHREAD +enabled_cairo_boilerplate_private += $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pthread_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_pthread_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gobject_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gobject_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gobject_sources) +if CAIRO_HAS_GOBJECT_FUNCTIONS +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gobject_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gobject_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gobject_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_trace_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_trace_sources) +if CAIRO_HAS_TRACE +enabled_cairo_boilerplate_private += $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_trace_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_trace_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_interpreter_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_interpreter_sources) +if CAIRO_HAS_INTERPRETER +enabled_cairo_boilerplate_private += $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_interpreter_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_interpreter_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_symbol_lookup_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_symbol_lookup_sources) +if CAIRO_HAS_SYMBOL_LOOKUP +enabled_cairo_boilerplate_private += $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_symbol_lookup_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_symbol_lookup_sources) +endif diff --git a/boilerplate/Makefile.in b/boilerplate/Makefile.in new file mode 100644 index 000000000..ec45790a7 --- /dev/null +++ b/boilerplate/Makefile.in @@ -0,0 +1,1832 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Note: All source files are listed in Makefile.sources. + +# Generated by configure. Do not edit. + +# Makefile.sources +# +# This file is pretty similar to $(top_srcdir)/src/Makefile.sources, +# but for boilerplate. Unlike that file, there are no special headers. +# +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(srcdir)/Makefile.am.features \ + $(top_srcdir)/boilerplate/Makefile.sources \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp $(top_srcdir)/build/test-driver \ + README +EXTRA_PROGRAMS = +check_PROGRAMS = check-link$(EXEEXT) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_1 = $(cairo_boilerplate_xlib_headers) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_2 = $(cairo_boilerplate_xlib_private) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_3 = $(cairo_boilerplate_xlib_cxx_sources) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_4 = $(cairo_boilerplate_xlib_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_5 = $(cairo_boilerplate_xlib_xrender_headers) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_6 = $(cairo_boilerplate_xlib_xrender_private) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_7 = $(cairo_boilerplate_xlib_xrender_cxx_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_8 = $(cairo_boilerplate_xlib_xrender_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_9 = $(cairo_boilerplate_xcb_headers) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_10 = $(cairo_boilerplate_xcb_private) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_11 = $(cairo_boilerplate_xcb_cxx_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_12 = $(cairo_boilerplate_xcb_sources) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_13 = $(cairo_boilerplate_xlib_xcb_headers) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_14 = $(cairo_boilerplate_xlib_xcb_private) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_15 = $(cairo_boilerplate_xlib_xcb_cxx_sources) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_16 = $(cairo_boilerplate_xlib_xcb_sources) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_17 = $(cairo_boilerplate_xcb_shm_headers) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_18 = $(cairo_boilerplate_xcb_shm_private) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_19 = $(cairo_boilerplate_xcb_shm_cxx_sources) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_20 = $(cairo_boilerplate_xcb_shm_sources) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_21 = $(cairo_boilerplate_qt_headers) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_22 = $(cairo_boilerplate_qt_private) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_23 = $(cairo_boilerplate_qt_cxx_sources) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_24 = $(cairo_boilerplate_qt_sources) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_25 = $(cairo_boilerplate_quartz_headers) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_26 = $(cairo_boilerplate_quartz_private) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_27 = $(cairo_boilerplate_quartz_cxx_sources) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_28 = $(cairo_boilerplate_quartz_sources) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_29 = $(cairo_boilerplate_quartz_font_headers) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_30 = $(cairo_boilerplate_quartz_font_private) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_31 = $(cairo_boilerplate_quartz_font_cxx_sources) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_32 = $(cairo_boilerplate_quartz_font_sources) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_33 = $(cairo_boilerplate_quartz_image_headers) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_34 = $(cairo_boilerplate_quartz_image_private) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_35 = $(cairo_boilerplate_quartz_image_cxx_sources) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_36 = $(cairo_boilerplate_quartz_image_sources) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_37 = $(cairo_boilerplate_win32_headers) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_38 = $(cairo_boilerplate_win32_private) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_39 = $(cairo_boilerplate_win32_cxx_sources) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_40 = $(cairo_boilerplate_win32_sources) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_41 = $(cairo_boilerplate_win32_font_headers) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_42 = $(cairo_boilerplate_win32_font_private) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_43 = $(cairo_boilerplate_win32_font_cxx_sources) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_44 = $(cairo_boilerplate_win32_font_sources) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_45 = $(cairo_boilerplate_skia_headers) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_46 = $(cairo_boilerplate_skia_private) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_47 = $(cairo_boilerplate_skia_cxx_sources) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_48 = $(cairo_boilerplate_skia_sources) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_49 = $(cairo_boilerplate_os2_headers) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_50 = $(cairo_boilerplate_os2_private) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_51 = $(cairo_boilerplate_os2_cxx_sources) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_52 = $(cairo_boilerplate_os2_sources) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_53 = $(cairo_boilerplate_beos_headers) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_54 = $(cairo_boilerplate_beos_private) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_55 = $(cairo_boilerplate_beos_cxx_sources) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_56 = $(cairo_boilerplate_beos_sources) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_57 = $(cairo_boilerplate_drm_headers) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_58 = $(cairo_boilerplate_drm_private) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_59 = $(cairo_boilerplate_drm_cxx_sources) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_60 = $(cairo_boilerplate_drm_sources) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_61 = $(cairo_boilerplate_gallium_headers) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_62 = $(cairo_boilerplate_gallium_private) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_63 = $(cairo_boilerplate_gallium_cxx_sources) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_64 = $(cairo_boilerplate_gallium_sources) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_65 = $(cairo_boilerplate_png_headers) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_66 = $(cairo_boilerplate_png_private) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_67 = $(cairo_boilerplate_png_cxx_sources) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_68 = $(cairo_boilerplate_png_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_69 = $(cairo_boilerplate_gl_headers) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_70 = $(cairo_boilerplate_gl_private) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_71 = $(cairo_boilerplate_gl_cxx_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_72 = $(cairo_boilerplate_gl_sources) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_73 = $(cairo_boilerplate_glesv2_headers) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_74 = $(cairo_boilerplate_glesv2_private) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_75 = $(cairo_boilerplate_glesv2_cxx_sources) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_76 = $(cairo_boilerplate_glesv2_sources) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_77 = $(cairo_boilerplate_cogl_headers) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_78 = $(cairo_boilerplate_cogl_private) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_79 = $(cairo_boilerplate_cogl_cxx_sources) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_80 = $(cairo_boilerplate_cogl_sources) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_81 = $(cairo_boilerplate_directfb_headers) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_82 = $(cairo_boilerplate_directfb_private) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_83 = $(cairo_boilerplate_directfb_cxx_sources) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_84 = $(cairo_boilerplate_directfb_sources) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_85 = $(cairo_boilerplate_vg_headers) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_86 = $(cairo_boilerplate_vg_private) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_87 = $(cairo_boilerplate_vg_cxx_sources) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_88 = $(cairo_boilerplate_vg_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_89 = $(cairo_boilerplate_egl_headers) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_90 = $(cairo_boilerplate_egl_private) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_91 = $(cairo_boilerplate_egl_cxx_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_92 = $(cairo_boilerplate_egl_sources) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_93 = $(cairo_boilerplate_glx_headers) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_94 = $(cairo_boilerplate_glx_private) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_95 = $(cairo_boilerplate_glx_cxx_sources) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_96 = $(cairo_boilerplate_glx_sources) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_97 = $(cairo_boilerplate_wgl_headers) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_98 = $(cairo_boilerplate_wgl_private) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_99 = $(cairo_boilerplate_wgl_cxx_sources) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_100 = $(cairo_boilerplate_wgl_sources) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_101 = $(cairo_boilerplate_script_headers) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_102 = $(cairo_boilerplate_script_private) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_103 = $(cairo_boilerplate_script_cxx_sources) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_104 = $(cairo_boilerplate_script_sources) +@CAIRO_HAS_FT_FONT_TRUE@am__append_105 = $(cairo_boilerplate_ft_headers) +@CAIRO_HAS_FT_FONT_TRUE@am__append_106 = $(cairo_boilerplate_ft_private) +@CAIRO_HAS_FT_FONT_TRUE@am__append_107 = $(cairo_boilerplate_ft_cxx_sources) +@CAIRO_HAS_FT_FONT_TRUE@am__append_108 = $(cairo_boilerplate_ft_sources) +@CAIRO_HAS_FC_FONT_TRUE@am__append_109 = $(cairo_boilerplate_fc_headers) +@CAIRO_HAS_FC_FONT_TRUE@am__append_110 = $(cairo_boilerplate_fc_private) +@CAIRO_HAS_FC_FONT_TRUE@am__append_111 = $(cairo_boilerplate_fc_cxx_sources) +@CAIRO_HAS_FC_FONT_TRUE@am__append_112 = $(cairo_boilerplate_fc_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_113 = $(cairo_boilerplate_ps_headers) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_114 = $(cairo_boilerplate_ps_private) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_115 = $(cairo_boilerplate_ps_cxx_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_116 = $(cairo_boilerplate_ps_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_117 = $(cairo_boilerplate_pdf_headers) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_118 = $(cairo_boilerplate_pdf_private) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_119 = $(cairo_boilerplate_pdf_cxx_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_120 = $(cairo_boilerplate_pdf_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_121 = $(cairo_boilerplate_svg_headers) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_122 = $(cairo_boilerplate_svg_private) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_123 = $(cairo_boilerplate_svg_cxx_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_124 = $(cairo_boilerplate_svg_sources) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_125 = $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_126 = $(cairo_boilerplate_test_surfaces_cxx_sources) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_127 = $(cairo_boilerplate_test_surfaces_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_128 = $(cairo_boilerplate_tee_headers) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_129 = $(cairo_boilerplate_tee_private) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_130 = $(cairo_boilerplate_tee_cxx_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_131 = $(cairo_boilerplate_tee_sources) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_132 = $(cairo_boilerplate_xml_headers) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_133 = $(cairo_boilerplate_xml_private) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_134 = $(cairo_boilerplate_xml_cxx_sources) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_135 = $(cairo_boilerplate_xml_sources) +@CAIRO_HAS_PTHREAD_TRUE@am__append_136 = $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +@CAIRO_HAS_PTHREAD_TRUE@am__append_137 = $(cairo_boilerplate_pthread_cxx_sources) +@CAIRO_HAS_PTHREAD_TRUE@am__append_138 = $(cairo_boilerplate_pthread_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_139 = $(cairo_boilerplate_gobject_headers) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_140 = $(cairo_boilerplate_gobject_private) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_141 = $(cairo_boilerplate_gobject_cxx_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_142 = $(cairo_boilerplate_gobject_sources) +@CAIRO_HAS_TRACE_TRUE@am__append_143 = $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +@CAIRO_HAS_TRACE_TRUE@am__append_144 = $(cairo_boilerplate_trace_cxx_sources) +@CAIRO_HAS_TRACE_TRUE@am__append_145 = $(cairo_boilerplate_trace_sources) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_146 = $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_147 = $(cairo_boilerplate_interpreter_cxx_sources) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_148 = $(cairo_boilerplate_interpreter_sources) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_149 = $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_150 = $(cairo_boilerplate_symbol_lookup_cxx_sources) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_151 = $(cairo_boilerplate_symbol_lookup_sources) +@CAIRO_HAS_DL_TRUE@am__append_152 = -ldl +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_153 = -lwinspool +@CROSS_COMPILING_FALSE@am__append_154 = check-link$(EXEEXT) +subdir = boilerplate +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@BUILD_CXX_TRUE@am__DEPENDENCIES_1 = libcairoboilerplate_cxx.la +am__DEPENDENCIES_2 = +am__libcairoboilerplate_la_SOURCES_DIST = cairo-boilerplate-getopt.h \ + cairo-boilerplate-scaled-font.h cairo-boilerplate-system.h \ + cairo-boilerplate.h cairo-boilerplate-xlib.h \ + cairo-boilerplate-private.h cairo-boilerplate-getopt.c \ + cairo-boilerplate-system.c cairo-boilerplate.c \ + cairo-boilerplate-xlib.c cairo-boilerplate-xcb.c \ + cairo-boilerplate-quartz.c cairo-boilerplate-win32.c \ + cairo-boilerplate-win32-printing.c cairo-boilerplate-skia.c \ + cairo-boilerplate-drm.c cairo-boilerplate-cogl.c \ + cairo-boilerplate-directfb.c cairo-boilerplate-vg.c \ + cairo-boilerplate-egl.c cairo-boilerplate-glx.c \ + cairo-boilerplate-wgl.c cairo-boilerplate-script.c \ + cairo-boilerplate-ps.c cairo-boilerplate-pdf.c \ + cairo-boilerplate-svg.c cairo-boilerplate-test-surfaces.c \ + cairo-boilerplate-constructors.c +am__objects_1 = +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__objects_2 = $(am__objects_1) +am__objects_3 = $(am__objects_1) $(am__objects_2) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) +am__objects_4 = $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) +am__objects_5 = cairo-boilerplate-getopt.lo \ + cairo-boilerplate-system.lo cairo-boilerplate.lo +am__objects_6 = cairo-boilerplate-xlib.lo +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__objects_7 = $(am__objects_6) +am__objects_8 = cairo-boilerplate-xcb.lo +@CAIRO_HAS_XCB_SURFACE_TRUE@am__objects_9 = $(am__objects_8) +am__objects_10 = cairo-boilerplate-quartz.lo +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__objects_11 = $(am__objects_10) +am__objects_12 = cairo-boilerplate-win32.lo \ + cairo-boilerplate-win32-printing.lo +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__objects_13 = $(am__objects_12) +am__objects_14 = cairo-boilerplate-skia.lo +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__objects_15 = $(am__objects_14) +am__objects_16 = cairo-boilerplate-drm.lo +@CAIRO_HAS_DRM_SURFACE_TRUE@am__objects_17 = $(am__objects_16) +am__objects_18 = cairo-boilerplate-cogl.lo +@CAIRO_HAS_COGL_SURFACE_TRUE@am__objects_19 = $(am__objects_18) +am__objects_20 = cairo-boilerplate-directfb.lo +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__objects_21 = $(am__objects_20) +am__objects_22 = cairo-boilerplate-vg.lo +@CAIRO_HAS_VG_SURFACE_TRUE@am__objects_23 = $(am__objects_22) +am__objects_24 = cairo-boilerplate-egl.lo +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__objects_25 = $(am__objects_24) +am__objects_26 = cairo-boilerplate-glx.lo +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__objects_27 = $(am__objects_26) +am__objects_28 = cairo-boilerplate-wgl.lo +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__objects_29 = $(am__objects_28) +am__objects_30 = cairo-boilerplate-script.lo +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__objects_31 = $(am__objects_30) +am__objects_32 = cairo-boilerplate-ps.lo +@CAIRO_HAS_PS_SURFACE_TRUE@am__objects_33 = $(am__objects_32) +am__objects_34 = cairo-boilerplate-pdf.lo +@CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_35 = $(am__objects_34) +am__objects_36 = cairo-boilerplate-svg.lo +@CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_37 = $(am__objects_36) +am__objects_38 = cairo-boilerplate-test-surfaces.lo +@CAIRO_HAS_TEST_SURFACES_TRUE@am__objects_39 = $(am__objects_38) +am__objects_40 = $(am__objects_5) $(am__objects_7) $(am__objects_1) \ + $(am__objects_9) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_11) $(am__objects_1) \ + $(am__objects_1) $(am__objects_13) $(am__objects_1) \ + $(am__objects_15) $(am__objects_1) $(am__objects_1) \ + $(am__objects_17) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_19) \ + $(am__objects_21) $(am__objects_23) $(am__objects_25) \ + $(am__objects_27) $(am__objects_29) $(am__objects_31) \ + $(am__objects_1) $(am__objects_1) $(am__objects_33) \ + $(am__objects_35) $(am__objects_37) $(am__objects_39) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) +am_libcairoboilerplate_la_OBJECTS = $(am__objects_3) $(am__objects_4) \ + $(am__objects_40) cairo-boilerplate-constructors.lo +libcairoboilerplate_la_OBJECTS = $(am_libcairoboilerplate_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcairoboilerplate_cxx_la_DEPENDENCIES = \ + $(top_builddir)/src/libcairo.la $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_2) +am__libcairoboilerplate_cxx_la_SOURCES_DIST = \ + cairo-boilerplate-qt.cpp cairo-boilerplate-beos.cpp +am__objects_41 = libcairoboilerplate_cxx_la-cairo-boilerplate-qt.lo +@CAIRO_HAS_QT_SURFACE_TRUE@am__objects_42 = $(am__objects_41) +am__objects_43 = libcairoboilerplate_cxx_la-cairo-boilerplate-beos.lo +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__objects_44 = $(am__objects_43) +am__objects_45 = $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_42) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_44) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) +am_libcairoboilerplate_cxx_la_OBJECTS = $(am__objects_45) +libcairoboilerplate_cxx_la_OBJECTS = \ + $(am_libcairoboilerplate_cxx_la_OBJECTS) +libcairoboilerplate_cxx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(libcairoboilerplate_cxx_la_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +@BUILD_CXX_TRUE@am_libcairoboilerplate_cxx_la_rpath = +check_link_SOURCES = check-link.c +check_link_OBJECTS = check-link.$(OBJEXT) +check_link_DEPENDENCIES = libcairoboilerplate.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libcairoboilerplate_la_SOURCES) \ + $(libcairoboilerplate_cxx_la_SOURCES) check-link.c +DIST_SOURCES = $(am__libcairoboilerplate_la_SOURCES_DIST) \ + $(am__libcairoboilerplate_cxx_la_SOURCES_DIST) check-link.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = cairo-boilerplate-constructors.c +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) $(BUILT_SOURCES) +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = Makefile.win32 Makefile.win32.features $(BUILT_SOURCES) \ + make-cairo-boilerplate-constructors.sh +EXTRA_LTLIBRARIES = libcairoboilerplate.la $(cxx_boilerplate_lib) +MAINTAINERCLEANFILES = Makefile.in +TESTS = $(am__append_154) +cairo_boilerplate_headers = \ + cairo-boilerplate-getopt.h \ + cairo-boilerplate-scaled-font.h \ + cairo-boilerplate-system.h \ + cairo-boilerplate.h \ + $(NULL) + +cairo_boilerplate_sources = \ + cairo-boilerplate-getopt.c \ + cairo-boilerplate-system.c \ + cairo-boilerplate.c \ + $(NULL) + +cairo_boilerplate_private = \ + cairo-boilerplate-private.h \ + $(NULL) + +cairo_boilerplate_beos_cxx_sources = cairo-boilerplate-beos.cpp +cairo_boilerplate_directfb_sources = cairo-boilerplate-directfb.c +cairo_boilerplate_drm_sources = cairo-boilerplate-drm.c +cairo_boilerplate_glx_sources = cairo-boilerplate-glx.c +cairo_boilerplate_wgl_sources = cairo-boilerplate-wgl.c +cairo_boilerplate_egl_sources = cairo-boilerplate-egl.c +cairo_boilerplate_pdf_sources = cairo-boilerplate-pdf.c +cairo_boilerplate_ps_sources = cairo-boilerplate-ps.c +cairo_boilerplate_qt_cxx_sources = cairo-boilerplate-qt.cpp +cairo_boilerplate_quartz_sources = cairo-boilerplate-quartz.c +cairo_boilerplate_script_sources = cairo-boilerplate-script.c +cairo_boilerplate_skia_sources = cairo-boilerplate-skia.c +cairo_boilerplate_svg_sources = cairo-boilerplate-svg.c +cairo_boilerplate_test_surfaces_sources = cairo-boilerplate-test-surfaces.c +cairo_boilerplate_win32_sources = cairo-boilerplate-win32.c cairo-boilerplate-win32-printing.c +cairo_boilerplate_xcb_sources = cairo-boilerplate-xcb.c +cairo_boilerplate_xlib_headers = cairo-boilerplate-xlib.h +cairo_boilerplate_xlib_sources = cairo-boilerplate-xlib.c +cairo_boilerplate_vg_sources = cairo-boilerplate-vg.c +cairo_boilerplate_cogl_sources = cairo-boilerplate-cogl.c +supported_cairo_boilerplate_headers = $(cairo_boilerplate_headers) \ + $(cairo_boilerplate_xlib_headers) \ + $(cairo_boilerplate_xlib_xrender_headers) \ + $(cairo_boilerplate_xcb_headers) \ + $(cairo_boilerplate_xcb_shm_headers) \ + $(cairo_boilerplate_quartz_headers) \ + $(cairo_boilerplate_quartz_font_headers) \ + $(cairo_boilerplate_win32_headers) \ + $(cairo_boilerplate_win32_font_headers) \ + $(cairo_boilerplate_png_headers) \ + $(cairo_boilerplate_egl_headers) \ + $(cairo_boilerplate_glx_headers) \ + $(cairo_boilerplate_wgl_headers) \ + $(cairo_boilerplate_script_headers) \ + $(cairo_boilerplate_ft_headers) \ + $(cairo_boilerplate_fc_headers) \ + $(cairo_boilerplate_ps_headers) \ + $(cairo_boilerplate_pdf_headers) \ + $(cairo_boilerplate_svg_headers) \ + $(cairo_boilerplate_image_headers) \ + $(cairo_boilerplate_mime_headers) \ + $(cairo_boilerplate_recording_headers) \ + $(cairo_boilerplate_observer_headers) \ + $(cairo_boilerplate_user_headers) \ + $(cairo_boilerplate_gobject_headers) +unsupported_cairo_boilerplate_headers = \ + $(cairo_boilerplate_xlib_xcb_headers) \ + $(cairo_boilerplate_qt_headers) \ + $(cairo_boilerplate_quartz_image_headers) \ + $(cairo_boilerplate_skia_headers) \ + $(cairo_boilerplate_os2_headers) \ + $(cairo_boilerplate_beos_headers) \ + $(cairo_boilerplate_drm_headers) \ + $(cairo_boilerplate_gallium_headers) \ + $(cairo_boilerplate_gl_headers) \ + $(cairo_boilerplate_glesv2_headers) \ + $(cairo_boilerplate_cogl_headers) \ + $(cairo_boilerplate_directfb_headers) \ + $(cairo_boilerplate_vg_headers) \ + $(cairo_boilerplate_tee_headers) \ + $(cairo_boilerplate_xml_headers) +all_cairo_boilerplate_headers = $(cairo_boilerplate_headers) \ + $(cairo_boilerplate_xlib_headers) \ + $(cairo_boilerplate_xlib_xrender_headers) \ + $(cairo_boilerplate_xcb_headers) \ + $(cairo_boilerplate_xlib_xcb_headers) \ + $(cairo_boilerplate_xcb_shm_headers) \ + $(cairo_boilerplate_qt_headers) \ + $(cairo_boilerplate_quartz_headers) \ + $(cairo_boilerplate_quartz_font_headers) \ + $(cairo_boilerplate_quartz_image_headers) \ + $(cairo_boilerplate_win32_headers) \ + $(cairo_boilerplate_win32_font_headers) \ + $(cairo_boilerplate_skia_headers) \ + $(cairo_boilerplate_os2_headers) \ + $(cairo_boilerplate_beos_headers) \ + $(cairo_boilerplate_drm_headers) \ + $(cairo_boilerplate_gallium_headers) \ + $(cairo_boilerplate_png_headers) \ + $(cairo_boilerplate_gl_headers) \ + $(cairo_boilerplate_glesv2_headers) \ + $(cairo_boilerplate_cogl_headers) \ + $(cairo_boilerplate_directfb_headers) \ + $(cairo_boilerplate_vg_headers) \ + $(cairo_boilerplate_egl_headers) \ + $(cairo_boilerplate_glx_headers) \ + $(cairo_boilerplate_wgl_headers) \ + $(cairo_boilerplate_script_headers) \ + $(cairo_boilerplate_ft_headers) \ + $(cairo_boilerplate_fc_headers) \ + $(cairo_boilerplate_ps_headers) \ + $(cairo_boilerplate_pdf_headers) \ + $(cairo_boilerplate_svg_headers) \ + $(cairo_boilerplate_image_headers) \ + $(cairo_boilerplate_mime_headers) \ + $(cairo_boilerplate_recording_headers) \ + $(cairo_boilerplate_observer_headers) \ + $(cairo_boilerplate_tee_headers) \ + $(cairo_boilerplate_xml_headers) \ + $(cairo_boilerplate_user_headers) \ + $(cairo_boilerplate_gobject_headers) +all_cairo_boilerplate_private = $(cairo_boilerplate_private) \ + $(cairo_boilerplate_xlib_private) \ + $(cairo_boilerplate_xlib_xrender_private) \ + $(cairo_boilerplate_xcb_private) \ + $(cairo_boilerplate_xlib_xcb_private) \ + $(cairo_boilerplate_xcb_shm_private) \ + $(cairo_boilerplate_qt_private) \ + $(cairo_boilerplate_quartz_private) \ + $(cairo_boilerplate_quartz_font_private) \ + $(cairo_boilerplate_quartz_image_private) \ + $(cairo_boilerplate_win32_private) \ + $(cairo_boilerplate_win32_font_private) \ + $(cairo_boilerplate_skia_private) \ + $(cairo_boilerplate_os2_private) \ + $(cairo_boilerplate_beos_private) \ + $(cairo_boilerplate_drm_private) \ + $(cairo_boilerplate_gallium_private) \ + $(cairo_boilerplate_png_private) \ + $(cairo_boilerplate_gl_private) \ + $(cairo_boilerplate_glesv2_private) \ + $(cairo_boilerplate_cogl_private) \ + $(cairo_boilerplate_directfb_private) \ + $(cairo_boilerplate_vg_private) \ + $(cairo_boilerplate_egl_private) \ + $(cairo_boilerplate_glx_private) \ + $(cairo_boilerplate_wgl_private) \ + $(cairo_boilerplate_script_private) \ + $(cairo_boilerplate_ft_private) \ + $(cairo_boilerplate_fc_private) \ + $(cairo_boilerplate_ps_private) \ + $(cairo_boilerplate_pdf_private) \ + $(cairo_boilerplate_svg_private) \ + $(cairo_boilerplate_test_surfaces_private) \ + $(cairo_boilerplate_test_surfaces_headers) \ + $(cairo_boilerplate_image_private) \ + $(cairo_boilerplate_mime_private) \ + $(cairo_boilerplate_recording_private) \ + $(cairo_boilerplate_observer_private) \ + $(cairo_boilerplate_tee_private) \ + $(cairo_boilerplate_xml_private) \ + $(cairo_boilerplate_user_private) \ + $(cairo_boilerplate_pthread_private) \ + $(cairo_boilerplate_pthread_headers) \ + $(cairo_boilerplate_gobject_private) \ + $(cairo_boilerplate_trace_private) \ + $(cairo_boilerplate_trace_headers) \ + $(cairo_boilerplate_interpreter_private) \ + $(cairo_boilerplate_interpreter_headers) \ + $(cairo_boilerplate_symbol_lookup_private) \ + $(cairo_boilerplate_symbol_lookup_headers) +all_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) \ + $(cairo_boilerplate_xlib_cxx_sources) \ + $(cairo_boilerplate_xlib_xrender_cxx_sources) \ + $(cairo_boilerplate_xcb_cxx_sources) \ + $(cairo_boilerplate_xlib_xcb_cxx_sources) \ + $(cairo_boilerplate_xcb_shm_cxx_sources) \ + $(cairo_boilerplate_qt_cxx_sources) \ + $(cairo_boilerplate_quartz_cxx_sources) \ + $(cairo_boilerplate_quartz_font_cxx_sources) \ + $(cairo_boilerplate_quartz_image_cxx_sources) \ + $(cairo_boilerplate_win32_cxx_sources) \ + $(cairo_boilerplate_win32_font_cxx_sources) \ + $(cairo_boilerplate_skia_cxx_sources) \ + $(cairo_boilerplate_os2_cxx_sources) \ + $(cairo_boilerplate_beos_cxx_sources) \ + $(cairo_boilerplate_drm_cxx_sources) \ + $(cairo_boilerplate_gallium_cxx_sources) \ + $(cairo_boilerplate_png_cxx_sources) \ + $(cairo_boilerplate_gl_cxx_sources) \ + $(cairo_boilerplate_glesv2_cxx_sources) \ + $(cairo_boilerplate_cogl_cxx_sources) \ + $(cairo_boilerplate_directfb_cxx_sources) \ + $(cairo_boilerplate_vg_cxx_sources) \ + $(cairo_boilerplate_egl_cxx_sources) \ + $(cairo_boilerplate_glx_cxx_sources) \ + $(cairo_boilerplate_wgl_cxx_sources) \ + $(cairo_boilerplate_script_cxx_sources) \ + $(cairo_boilerplate_ft_cxx_sources) \ + $(cairo_boilerplate_fc_cxx_sources) \ + $(cairo_boilerplate_ps_cxx_sources) \ + $(cairo_boilerplate_pdf_cxx_sources) \ + $(cairo_boilerplate_svg_cxx_sources) \ + $(cairo_boilerplate_test_surfaces_cxx_sources) \ + $(cairo_boilerplate_image_cxx_sources) \ + $(cairo_boilerplate_mime_cxx_sources) \ + $(cairo_boilerplate_recording_cxx_sources) \ + $(cairo_boilerplate_observer_cxx_sources) \ + $(cairo_boilerplate_tee_cxx_sources) \ + $(cairo_boilerplate_xml_cxx_sources) \ + $(cairo_boilerplate_user_cxx_sources) \ + $(cairo_boilerplate_pthread_cxx_sources) \ + $(cairo_boilerplate_gobject_cxx_sources) \ + $(cairo_boilerplate_trace_cxx_sources) \ + $(cairo_boilerplate_interpreter_cxx_sources) \ + $(cairo_boilerplate_symbol_lookup_cxx_sources) +all_cairo_boilerplate_sources = $(cairo_boilerplate_sources) \ + $(cairo_boilerplate_xlib_sources) \ + $(cairo_boilerplate_xlib_xrender_sources) \ + $(cairo_boilerplate_xcb_sources) \ + $(cairo_boilerplate_xlib_xcb_sources) \ + $(cairo_boilerplate_xcb_shm_sources) \ + $(cairo_boilerplate_qt_sources) \ + $(cairo_boilerplate_quartz_sources) \ + $(cairo_boilerplate_quartz_font_sources) \ + $(cairo_boilerplate_quartz_image_sources) \ + $(cairo_boilerplate_win32_sources) \ + $(cairo_boilerplate_win32_font_sources) \ + $(cairo_boilerplate_skia_sources) \ + $(cairo_boilerplate_os2_sources) \ + $(cairo_boilerplate_beos_sources) \ + $(cairo_boilerplate_drm_sources) \ + $(cairo_boilerplate_gallium_sources) \ + $(cairo_boilerplate_png_sources) \ + $(cairo_boilerplate_gl_sources) \ + $(cairo_boilerplate_glesv2_sources) \ + $(cairo_boilerplate_cogl_sources) \ + $(cairo_boilerplate_directfb_sources) \ + $(cairo_boilerplate_vg_sources) \ + $(cairo_boilerplate_egl_sources) \ + $(cairo_boilerplate_glx_sources) \ + $(cairo_boilerplate_wgl_sources) \ + $(cairo_boilerplate_script_sources) \ + $(cairo_boilerplate_ft_sources) \ + $(cairo_boilerplate_fc_sources) \ + $(cairo_boilerplate_ps_sources) \ + $(cairo_boilerplate_pdf_sources) \ + $(cairo_boilerplate_svg_sources) \ + $(cairo_boilerplate_test_surfaces_sources) \ + $(cairo_boilerplate_image_sources) \ + $(cairo_boilerplate_mime_sources) \ + $(cairo_boilerplate_recording_sources) \ + $(cairo_boilerplate_observer_sources) \ + $(cairo_boilerplate_tee_sources) \ + $(cairo_boilerplate_xml_sources) \ + $(cairo_boilerplate_user_sources) \ + $(cairo_boilerplate_pthread_sources) \ + $(cairo_boilerplate_gobject_sources) \ + $(cairo_boilerplate_trace_sources) \ + $(cairo_boilerplate_interpreter_sources) \ + $(cairo_boilerplate_symbol_lookup_sources) +enabled_cairo_boilerplate_headers = $(cairo_boilerplate_headers) \ + $(am__append_1) $(am__append_5) $(am__append_9) \ + $(am__append_13) $(am__append_17) $(am__append_21) \ + $(am__append_25) $(am__append_29) $(am__append_33) \ + $(am__append_37) $(am__append_41) $(am__append_45) \ + $(am__append_49) $(am__append_53) $(am__append_57) \ + $(am__append_61) $(am__append_65) $(am__append_69) \ + $(am__append_73) $(am__append_77) $(am__append_81) \ + $(am__append_85) $(am__append_89) $(am__append_93) \ + $(am__append_97) $(am__append_101) $(am__append_105) \ + $(am__append_109) $(am__append_113) $(am__append_117) \ + $(am__append_121) $(cairo_boilerplate_image_headers) \ + $(cairo_boilerplate_mime_headers) \ + $(cairo_boilerplate_recording_headers) \ + $(cairo_boilerplate_observer_headers) $(am__append_128) \ + $(am__append_132) $(cairo_boilerplate_user_headers) \ + $(am__append_139) +enabled_cairo_boilerplate_private = $(cairo_boilerplate_private) \ + $(am__append_2) $(am__append_6) $(am__append_10) \ + $(am__append_14) $(am__append_18) $(am__append_22) \ + $(am__append_26) $(am__append_30) $(am__append_34) \ + $(am__append_38) $(am__append_42) $(am__append_46) \ + $(am__append_50) $(am__append_54) $(am__append_58) \ + $(am__append_62) $(am__append_66) $(am__append_70) \ + $(am__append_74) $(am__append_78) $(am__append_82) \ + $(am__append_86) $(am__append_90) $(am__append_94) \ + $(am__append_98) $(am__append_102) $(am__append_106) \ + $(am__append_110) $(am__append_114) $(am__append_118) \ + $(am__append_122) $(am__append_125) \ + $(cairo_boilerplate_image_private) \ + $(cairo_boilerplate_mime_private) \ + $(cairo_boilerplate_recording_private) \ + $(cairo_boilerplate_observer_private) $(am__append_129) \ + $(am__append_133) $(cairo_boilerplate_user_private) \ + $(am__append_136) $(am__append_140) $(am__append_143) \ + $(am__append_146) $(am__append_149) +enabled_cairo_boilerplate_cxx_sources = \ + $(cairo_boilerplate_cxx_sources) $(am__append_3) \ + $(am__append_7) $(am__append_11) $(am__append_15) \ + $(am__append_19) $(am__append_23) $(am__append_27) \ + $(am__append_31) $(am__append_35) $(am__append_39) \ + $(am__append_43) $(am__append_47) $(am__append_51) \ + $(am__append_55) $(am__append_59) $(am__append_63) \ + $(am__append_67) $(am__append_71) $(am__append_75) \ + $(am__append_79) $(am__append_83) $(am__append_87) \ + $(am__append_91) $(am__append_95) $(am__append_99) \ + $(am__append_103) $(am__append_107) $(am__append_111) \ + $(am__append_115) $(am__append_119) $(am__append_123) \ + $(am__append_126) $(cairo_boilerplate_image_cxx_sources) \ + $(cairo_boilerplate_mime_cxx_sources) \ + $(cairo_boilerplate_recording_cxx_sources) \ + $(cairo_boilerplate_observer_cxx_sources) $(am__append_130) \ + $(am__append_134) $(cairo_boilerplate_user_cxx_sources) \ + $(am__append_137) $(am__append_141) $(am__append_144) \ + $(am__append_147) $(am__append_150) +enabled_cairo_boilerplate_sources = $(cairo_boilerplate_sources) \ + $(am__append_4) $(am__append_8) $(am__append_12) \ + $(am__append_16) $(am__append_20) $(am__append_24) \ + $(am__append_28) $(am__append_32) $(am__append_36) \ + $(am__append_40) $(am__append_44) $(am__append_48) \ + $(am__append_52) $(am__append_56) $(am__append_60) \ + $(am__append_64) $(am__append_68) $(am__append_72) \ + $(am__append_76) $(am__append_80) $(am__append_84) \ + $(am__append_88) $(am__append_92) $(am__append_96) \ + $(am__append_100) $(am__append_104) $(am__append_108) \ + $(am__append_112) $(am__append_116) $(am__append_120) \ + $(am__append_124) $(am__append_127) \ + $(cairo_boilerplate_image_sources) \ + $(cairo_boilerplate_mime_sources) \ + $(cairo_boilerplate_recording_sources) \ + $(cairo_boilerplate_observer_sources) $(am__append_131) \ + $(am__append_135) $(cairo_boilerplate_user_sources) \ + $(am__append_138) $(am__append_142) $(am__append_145) \ + $(am__append_148) $(am__append_151) +#MAINTAINERCLEANFILES += $(srcdir)/Makefile.win32.features +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/src \ + $(CAIRO_CFLAGS) \ + $(NULL) + +AM_LDFLAGS = $(CAIRO_LDFLAGS) +@BUILD_CXX_FALSE@cxx_boilerplate_lib = +@BUILD_CXX_TRUE@cxx_boilerplate_lib = libcairoboilerplate_cxx.la +libcairoboilerplate_la_SOURCES = \ + $(enabled_cairo_boilerplate_headers) \ + $(enabled_cairo_boilerplate_private) \ + $(enabled_cairo_boilerplate_sources) \ + cairo-boilerplate-constructors.c \ + $(NULL) + +libcairoboilerplate_cxx_la_SOURCES = \ + $(enabled_cairo_boilerplate_cxx_sources) \ + $(NULL) + +libcairoboilerplate_la_LIBADD = $(top_builddir)/src/libcairo.la \ + $(cxx_boilerplate_lib) $(CAIRO_LIBS) $(CAIROBOILERPLATE_LIBS) \ + $(NULL) $(am__append_152) $(am__append_153) +libcairoboilerplate_cxx_la_LIBADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LIBS) \ + $(CAIROBOILERPLATE_LIBS) \ + $(NULL) + +libcairoboilerplate_la_DEPENDENCIES = \ + $(cxx_boilerplate_lib) \ + $(NULL) + + +# BeOS system headers trigger this warning +@CAIRO_HAS_BEOS_SURFACE_TRUE@libcairoboilerplate_cxx_la_CXXFLAGS = -Wno-multichar +check_link_LDADD = libcairoboilerplate.la +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(srcdir)/Makefile.am.features $(top_srcdir)/boilerplate/Makefile.sources $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign boilerplate/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign boilerplate/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(srcdir)/Makefile.am.features $(top_srcdir)/boilerplate/Makefile.sources: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +libcairoboilerplate.la: $(libcairoboilerplate_la_OBJECTS) $(libcairoboilerplate_la_DEPENDENCIES) $(EXTRA_libcairoboilerplate_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libcairoboilerplate_la_OBJECTS) $(libcairoboilerplate_la_LIBADD) $(LIBS) + +libcairoboilerplate_cxx.la: $(libcairoboilerplate_cxx_la_OBJECTS) $(libcairoboilerplate_cxx_la_DEPENDENCIES) $(EXTRA_libcairoboilerplate_cxx_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libcairoboilerplate_cxx_la_LINK) $(am_libcairoboilerplate_cxx_la_rpath) $(libcairoboilerplate_cxx_la_OBJECTS) $(libcairoboilerplate_cxx_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +check-link$(EXEEXT): $(check_link_OBJECTS) $(check_link_DEPENDENCIES) $(EXTRA_check_link_DEPENDENCIES) + @rm -f check-link$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(check_link_OBJECTS) $(check_link_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-cogl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-constructors.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-directfb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-drm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-egl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-getopt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-glx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-pdf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-ps.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-quartz.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-script.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-skia.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-svg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-system.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-test-surfaces.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-vg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-wgl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-win32-printing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-win32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-xcb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate-xlib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boilerplate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-link.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-beos.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-qt.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libcairoboilerplate_cxx_la-cairo-boilerplate-qt.lo: cairo-boilerplate-qt.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairoboilerplate_cxx_la_CXXFLAGS) $(CXXFLAGS) -MT libcairoboilerplate_cxx_la-cairo-boilerplate-qt.lo -MD -MP -MF $(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-qt.Tpo -c -o libcairoboilerplate_cxx_la-cairo-boilerplate-qt.lo `test -f 'cairo-boilerplate-qt.cpp' || echo '$(srcdir)/'`cairo-boilerplate-qt.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-qt.Tpo $(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-qt.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cairo-boilerplate-qt.cpp' object='libcairoboilerplate_cxx_la-cairo-boilerplate-qt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairoboilerplate_cxx_la_CXXFLAGS) $(CXXFLAGS) -c -o libcairoboilerplate_cxx_la-cairo-boilerplate-qt.lo `test -f 'cairo-boilerplate-qt.cpp' || echo '$(srcdir)/'`cairo-boilerplate-qt.cpp + +libcairoboilerplate_cxx_la-cairo-boilerplate-beos.lo: cairo-boilerplate-beos.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairoboilerplate_cxx_la_CXXFLAGS) $(CXXFLAGS) -MT libcairoboilerplate_cxx_la-cairo-boilerplate-beos.lo -MD -MP -MF $(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-beos.Tpo -c -o libcairoboilerplate_cxx_la-cairo-boilerplate-beos.lo `test -f 'cairo-boilerplate-beos.cpp' || echo '$(srcdir)/'`cairo-boilerplate-beos.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-beos.Tpo $(DEPDIR)/libcairoboilerplate_cxx_la-cairo-boilerplate-beos.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cairo-boilerplate-beos.cpp' object='libcairoboilerplate_cxx_la-cairo-boilerplate-beos.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairoboilerplate_cxx_la_CXXFLAGS) $(CXXFLAGS) -c -o libcairoboilerplate_cxx_la-cairo-boilerplate-beos.lo `test -f 'cairo-boilerplate-beos.cpp' || echo '$(srcdir)/'`cairo-boilerplate-beos.cpp + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-link.log: check-link$(EXEEXT) + @p='check-link$(EXEEXT)'; \ + b='check-link'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + + +cairo-boilerplate-constructors.c: Makefile $(enabled_cairo_boilerplate_sources) $(enabled_cairo_boilerplate_cxx_sources) make-cairo-boilerplate-constructors.sh + (cd $(srcdir) && sh ./make-cairo-boilerplate-constructors.sh $(enabled_cairo_boilerplate_sources) $(enabled_cairo_boilerplate_cxx_sources)) > $@ + +test: check + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/boilerplate/Makefile.sources b/boilerplate/Makefile.sources new file mode 100644 index 000000000..101e99711 --- /dev/null +++ b/boilerplate/Makefile.sources @@ -0,0 +1,41 @@ +# Makefile.sources +# +# This file is pretty similar to $(top_srcdir)/src/Makefile.sources, +# but for boilerplate. Unlike that file, there are no special headers. +# + +cairo_boilerplate_headers = \ + cairo-boilerplate-getopt.h \ + cairo-boilerplate-scaled-font.h \ + cairo-boilerplate-system.h \ + cairo-boilerplate.h \ + $(NULL) +cairo_boilerplate_sources = \ + cairo-boilerplate-getopt.c \ + cairo-boilerplate-system.c \ + cairo-boilerplate.c \ + $(NULL) +cairo_boilerplate_private = \ + cairo-boilerplate-private.h \ + $(NULL) + +cairo_boilerplate_beos_cxx_sources = cairo-boilerplate-beos.cpp +cairo_boilerplate_directfb_sources = cairo-boilerplate-directfb.c +cairo_boilerplate_drm_sources = cairo-boilerplate-drm.c +cairo_boilerplate_glx_sources = cairo-boilerplate-glx.c +cairo_boilerplate_wgl_sources = cairo-boilerplate-wgl.c +cairo_boilerplate_egl_sources = cairo-boilerplate-egl.c +cairo_boilerplate_pdf_sources = cairo-boilerplate-pdf.c +cairo_boilerplate_ps_sources = cairo-boilerplate-ps.c +cairo_boilerplate_qt_cxx_sources = cairo-boilerplate-qt.cpp +cairo_boilerplate_quartz_sources = cairo-boilerplate-quartz.c +cairo_boilerplate_script_sources = cairo-boilerplate-script.c +cairo_boilerplate_skia_sources = cairo-boilerplate-skia.c +cairo_boilerplate_svg_sources = cairo-boilerplate-svg.c +cairo_boilerplate_test_surfaces_sources = cairo-boilerplate-test-surfaces.c +cairo_boilerplate_win32_sources = cairo-boilerplate-win32.c cairo-boilerplate-win32-printing.c +cairo_boilerplate_xcb_sources = cairo-boilerplate-xcb.c +cairo_boilerplate_xlib_headers = cairo-boilerplate-xlib.h +cairo_boilerplate_xlib_sources = cairo-boilerplate-xlib.c +cairo_boilerplate_vg_sources = cairo-boilerplate-vg.c +cairo_boilerplate_cogl_sources = cairo-boilerplate-cogl.c diff --git a/boilerplate/Makefile.win32 b/boilerplate/Makefile.win32 new file mode 100644 index 000000000..29df5cf79 --- /dev/null +++ b/boilerplate/Makefile.win32 @@ -0,0 +1,24 @@ +top_srcdir = .. +include $(top_srcdir)/build/Makefile.win32.common +include Makefile.win32.features + +HEADERS = \ + $(enabled_cairo_boilerplate_headers) \ + $(enabled_cairo_boilerplate_private) \ + $(NULL) + +SOURCES = \ + $(enabled_cairo_boilerplate_sources) \ + cairo-boilerplate-constructors.c \ + $(NULL) + +OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(SOURCES)) + +cairo-boilerplate-constructors.c: Makefile.sources Makefile.win32 $(enabled_cairo_boilerplate_sources) make-cairo-boilerplate-constructors.sh + sh ./make-cairo-boilerplate-constructors.sh $(enabled_cairo_boilerplate_sources) > $@ + +all: $(CFG)/boiler.lib + + +$(CFG)/boiler.lib: $(OBJECTS) + @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(OBJECTS) diff --git a/boilerplate/Makefile.win32.features b/boilerplate/Makefile.win32.features new file mode 100644 index 000000000..e60a95ba6 --- /dev/null +++ b/boilerplate/Makefile.win32.features @@ -0,0 +1,523 @@ +# Generated by configure. Do not edit. + +ifeq ($(top_srcdir),) +include Makefile.sources +else +include $(top_srcdir)/boilerplate/Makefile.sources +endif + +supported_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +unsupported_cairo_boilerplate_headers = +all_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +all_cairo_boilerplate_private = $(cairo_boilerplate_private) +all_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) +all_cairo_boilerplate_sources = $(cairo_boilerplate_sources) + +enabled_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +enabled_cairo_boilerplate_private = $(cairo_boilerplate_private) +enabled_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) +enabled_cairo_boilerplate_sources = $(cairo_boilerplate_sources) + + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_sources) +ifeq ($(CAIRO_HAS_XLIB_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xrender_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xrender_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xrender_sources) +ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xrender_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xrender_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xrender_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_sources) +ifeq ($(CAIRO_HAS_XCB_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xcb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources) +ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xcb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_shm_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources) +ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_shm_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_qt_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_qt_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_qt_sources) +ifeq ($(CAIRO_HAS_QT_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_qt_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_qt_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_qt_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_sources) +ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_font_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_font_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_font_sources) +ifeq ($(CAIRO_HAS_QUARTZ_FONT),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_font_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_font_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_font_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_image_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_image_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_image_sources) +ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_image_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_image_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_image_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_win32_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_win32_sources) +ifeq ($(CAIRO_HAS_WIN32_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_win32_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_win32_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_win32_font_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_font_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_win32_font_sources) +ifeq ($(CAIRO_HAS_WIN32_FONT),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_win32_font_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_font_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_win32_font_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_skia_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_skia_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_skia_sources) +ifeq ($(CAIRO_HAS_SKIA_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_skia_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_skia_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_skia_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_os2_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_os2_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_os2_sources) +ifeq ($(CAIRO_HAS_OS2_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_os2_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_os2_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_os2_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_beos_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_beos_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_beos_sources) +ifeq ($(CAIRO_HAS_BEOS_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_beos_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_beos_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_beos_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_drm_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources) +ifeq ($(CAIRO_HAS_DRM_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_drm_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gallium_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gallium_sources) +ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gallium_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gallium_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_png_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_png_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources) +ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_png_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_png_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources) +ifeq ($(CAIRO_HAS_GL_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_glesv2_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glesv2_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_glesv2_sources) +ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_glesv2_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glesv2_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_glesv2_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_cogl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_cogl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_cogl_sources) +ifeq ($(CAIRO_HAS_COGL_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_cogl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_cogl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_cogl_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_directfb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_directfb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_directfb_sources) +ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_directfb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_directfb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_directfb_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_vg_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources) +ifeq ($(CAIRO_HAS_VG_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_vg_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_egl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_egl_sources) +ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_egl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_egl_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_glx_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glx_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_glx_sources) +ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_glx_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glx_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_glx_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_wgl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_wgl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_wgl_sources) +ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_wgl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_wgl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_wgl_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_script_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_script_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_script_sources) +ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_script_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_script_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_script_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_ft_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ft_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_ft_sources) +ifeq ($(CAIRO_HAS_FT_FONT),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_ft_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ft_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_ft_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_fc_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_fc_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_fc_sources) +ifeq ($(CAIRO_HAS_FC_FONT),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_fc_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_fc_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_fc_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_ps_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ps_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_ps_sources) +ifeq ($(CAIRO_HAS_PS_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_ps_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ps_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_ps_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_pdf_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pdf_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_pdf_sources) +ifeq ($(CAIRO_HAS_PDF_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_pdf_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pdf_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_pdf_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_svg_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_svg_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_svg_sources) +ifeq ($(CAIRO_HAS_SVG_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_svg_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_svg_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_svg_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_test_surfaces_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_test_surfaces_sources) +ifeq ($(CAIRO_HAS_TEST_SURFACES),1) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_test_surfaces_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_test_surfaces_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_image_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_image_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_image_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_image_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_image_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_image_sources) + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_mime_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_mime_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_mime_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_mime_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_mime_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_mime_sources) + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_recording_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_recording_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_recording_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_recording_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_recording_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_recording_sources) + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_observer_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_observer_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_observer_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_observer_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_observer_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_observer_sources) + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_tee_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_tee_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_tee_sources) +ifeq ($(CAIRO_HAS_TEE_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_tee_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_tee_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_tee_sources) +endif + +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xml_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xml_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xml_sources) +ifeq ($(CAIRO_HAS_XML_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xml_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xml_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xml_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_user_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_user_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_user_sources) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_user_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_user_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_user_sources) + +all_cairo_boilerplate_private += $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pthread_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_pthread_sources) +ifeq ($(CAIRO_HAS_PTHREAD),1) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pthread_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_pthread_sources) +endif + +supported_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gobject_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gobject_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gobject_sources) +ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gobject_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gobject_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gobject_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_trace_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_trace_sources) +ifeq ($(CAIRO_HAS_TRACE),1) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_trace_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_trace_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_interpreter_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_interpreter_sources) +ifeq ($(CAIRO_HAS_INTERPRETER),1) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_interpreter_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_interpreter_sources) +endif + +all_cairo_boilerplate_private += $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_symbol_lookup_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_symbol_lookup_sources) +ifeq ($(CAIRO_HAS_SYMBOL_LOOKUP),1) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_symbol_lookup_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_symbol_lookup_sources) +endif diff --git a/boilerplate/README b/boilerplate/README new file mode 100644 index 000000000..2a27c415c --- /dev/null +++ b/boilerplate/README @@ -0,0 +1,14 @@ +This directory provides code that is common to both of cairo's tests +suites: + + * The test suite for correctness in test/ + * The test suite for performance in perf/ + +We call it boilerplate as it consists primarily of the boilerplate +code necessary for initializing a backend in order to create a surface +for that backend. + +The code here just might be useful for someone looking to get started +writing cairo code to use a particular backend, (but there are no +promises that the boilerplate code found here for any particular +backend is exemplary). diff --git a/boilerplate/cairo-boilerplate-beos.cpp b/boilerplate/cairo-boilerplate-beos.cpp new file mode 100644 index 000000000..8a1b1afb5 --- /dev/null +++ b/boilerplate/cairo-boilerplate-beos.cpp @@ -0,0 +1,273 @@ +/* vim:set ts=8 sw=4 noet cin: */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Takashi Toyoshima <toyoshim@be-in.org> + * Fredrik Holmqvist <thesuckiestemail@yahoo.se> + * Christian Biesinger <cbiesinger@web.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "cairo-boilerplate.h" +#include <cairo-beos.h> + +// Part of this code was originally part of +// xpfe/bootstrap/nsNativeAppSupportBeOS.cpp in the Mozilla source code. + +#include <Application.h> +#include <Window.h> +#include <View.h> +#include <Bitmap.h> + +class CairoTestWindow : public BWindow +{ +public: + CairoTestWindow(BRect frame, const char* title); + virtual ~CairoTestWindow(); + BView* View() const { return mView; } +private: + BView* mView; +}; + +CairoTestWindow::CairoTestWindow(BRect frame, const char* title) + : BWindow(frame, title, B_TITLED_WINDOW, + B_NOT_RESIZABLE|B_NOT_ZOOMABLE) +{ + mView = new BView(frame, "CairoWindowTestView", B_FOLLOW_ALL_SIDES, 0); + AddChild(mView); + Show(); + + // Make sure the window is actually on screen + Lock(); + Sync(); + mView->SetViewColor(B_TRANSPARENT_COLOR); + mView->Sync(); + Unlock(); +} + +CairoTestWindow::~CairoTestWindow() +{ + RemoveChild(mView); + delete mView; +} + + +class nsBeOSApp : public BApplication +{ +public: + nsBeOSApp(sem_id sem) : BApplication(GetAppSig()), init(sem) + {} + + void ReadyToRun() + { + release_sem(init); + } + + static int32 Main(void *args) + { + nsBeOSApp *app = new nsBeOSApp( (sem_id)args ); + if(app == NULL) + return B_ERROR; + return app->Run(); + } + +private: + + const char *GetAppSig() + { + return "application/x-vnd.cairo-test-app"; + } + + sem_id init; +}; //class nsBeOSApp + +class AppRunner +{ + public: + AppRunner(); + ~AppRunner(); +}; + +AppRunner::AppRunner() +{ + if (be_app) + return; + + sem_id initsem = create_sem(0, "Cairo BApplication init"); + if (initsem < B_OK) { + fprintf (stderr, "Error creating BeOS initialization semaphore\n"); + return; + } + + thread_id tid = spawn_thread(nsBeOSApp::Main, "Cairo/BeOS test", B_NORMAL_PRIORITY, (void *)initsem); + if (tid < B_OK || B_OK != resume_thread(tid)) { + fprintf (stderr, "Error spawning thread\n"); + return; + } + + if (B_OK != acquire_sem(initsem)) { + fprintf (stderr, "Error acquiring semaphore\n"); + return; + } + + delete_sem(initsem); + return; +} + +AppRunner::~AppRunner() +{ + if (be_app) { + if (be_app->Lock()) + be_app->Quit(); + delete be_app; + be_app = NULL; + } +} + +// Make sure that the BApplication is initialized +static AppRunner sAppRunner; + +struct beos_boilerplate_closure { + BView* view; + BBitmap* bitmap; + BWindow* window; +}; + +// Test a real window +static cairo_surface_t * +_cairo_boilerplate_beos_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + float right = width ? width - 1 : 0; + float bottom = height ? height - 1 : 0; + BRect rect(0.0, 0.0, right, bottom); + CairoTestWindow* wnd = new CairoTestWindow(rect, name); + + beos_boilerplate_closure* bclosure = new beos_boilerplate_closure; + bclosure->view = wnd->View(); + bclosure->bitmap = NULL; + bclosure->window = wnd; + + *closure = bclosure; + + return cairo_beos_surface_create(wnd->View()); +} + +static void +_cairo_boilerplate_beos_cleanup (void *closure) +{ + beos_boilerplate_closure* bclosure = reinterpret_cast<beos_boilerplate_closure*>(closure); + + bclosure->window->Lock(); + bclosure->window->Quit(); + + delete bclosure; +} + +// Test a bitmap +static cairo_surface_t * +_cairo_boilerplate_beos_create_surface_for_bitmap (const char *name, + cairo_content_t content, + double width, + double height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + BRect rect(0.0, 0.0, width - 1, height - 1); + color_space beosformat = (content == CAIRO_CONTENT_COLOR_ALPHA) ? B_RGBA32 + : B_RGB32; + BBitmap* bmp = new BBitmap(rect, beosformat, true); + BView* view = new BView(rect, "Cairo test view", B_FOLLOW_ALL_SIDES, 0); + bmp->AddChild(view); + + beos_boilerplate_closure* bclosure = new beos_boilerplate_closure; + bclosure->view = view; + bclosure->bitmap = bmp; + bclosure->window = NULL; + *closure = bclosure; + + return cairo_beos_surface_create_for_bitmap(view, bmp); +} + +static void +_cairo_boilerplate_beos_cleanup_bitmap (void *closure) +{ + beos_boilerplate_closure* bclosure = reinterpret_cast<beos_boilerplate_closure*>(closure); + + bclosure->bitmap->RemoveChild(bclosure->view); + + + delete bclosure->view; + delete bclosure->bitmap; + + delete bclosure; +} + +static const cairo_boilerplate_target_t targets[] = { + /* BeOS sometimes produces a slightly different image. Perhaps this + * is related to the fact that it doesn't use premultiplied alpha... + * Just ignore the small difference. */ + { + "beos", "beos", NULL, NULL, + CAIRO_SURFACE_TYPE_BEOS, CAIRO_CONTENT_COLOR, 1, + _cairo_boilerplate_beos_create_surface, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_beos_cleanup + }, + { + "beos-bitmap", "beos", NULL, NULL, + CAIRO_SURFACE_TYPE_BEOS, CAIRO_CONTENT_COLOR, 1, + _cairo_boilerplate_beos_create_surface_for_bitmap, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_beos_cleanup_bitmap + }, + { + "beos-bitmap", "beos", NULL, NULL, + CAIRO_SURFACE_TYPE_BEOS, CAIRO_CONTENT_COLOR_ALPHA, 1, + _cairo_boilerplate_beos_create_surface_for_bitmap, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_beos_cleanup_bitmap + }, +}; +CAIRO_BOILERPLATE (beos, targets) + diff --git a/boilerplate/cairo-boilerplate-cogl.c b/boilerplate/cairo-boilerplate-cogl.c new file mode 100644 index 000000000..e39ad333d --- /dev/null +++ b/boilerplate/cairo-boilerplate-cogl.c @@ -0,0 +1,206 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-cogl.h> +#include <cogl/cogl2-experimental.h> + +typedef struct _cogl_closure { + cairo_device_t *device; + CoglFramebuffer *fb; + cairo_surface_t *surface; +} cogl_closure_t; + +static const cairo_user_data_key_t cogl_closure_key; + +static CoglContext *context = NULL; + +static void +_cairo_boilerplate_cogl_cleanup (void *abstract_closure) +{ + cogl_closure_t *closure = abstract_closure; + + cogl_object_unref (closure->fb); + + cairo_device_finish (closure->device); + cairo_device_destroy (closure->device); + + free (closure); +} + +static cairo_surface_t * +_cairo_boilerplate_cogl_create_offscreen_color_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **abstract_closure) +{ + cairo_device_t *device; + CoglTexture *tex; + CoglHandle offscreen; + CoglFramebuffer *fb; + cogl_closure_t *closure; + cairo_status_t status; + + if (!context) + context = cogl_context_new (NULL, NULL); + + device = cairo_cogl_device_create (context); + tex = cogl_texture_new_with_size (width, height, + COGL_TEXTURE_NO_SLICING, + COGL_PIXEL_FORMAT_BGRA_8888_PRE); + offscreen = cogl_offscreen_new_to_texture (tex); + fb = COGL_FRAMEBUFFER (offscreen); + + cogl_framebuffer_allocate (fb, NULL); + cogl_push_framebuffer (fb); + cogl_ortho (0, cogl_framebuffer_get_width (fb), + cogl_framebuffer_get_height (fb), 0, + -1, 100); + cogl_pop_framebuffer (); + + closure = malloc (sizeof (cogl_closure_t)); + *abstract_closure = closure; + closure->device = device; + closure->fb = fb; + closure->surface = cairo_cogl_surface_create (device, fb); + + status = cairo_surface_set_user_data (closure->surface, + &cogl_closure_key, closure, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return closure->surface; + + _cairo_boilerplate_cogl_cleanup (closure); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_boilerplate_cogl_create_onscreen_color_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **abstract_closure) +{ + cairo_device_t *device; + CoglOnscreen *onscreen; + CoglFramebuffer *fb; + cogl_closure_t *closure; + cairo_status_t status; + + if (!context) + context = cogl_context_new (NULL, NULL); + + device = cairo_cogl_device_create (context); + onscreen = cogl_onscreen_new (context, width, height); + fb = COGL_FRAMEBUFFER (onscreen); + + cogl_onscreen_show (onscreen); + + cogl_push_framebuffer (fb); + cogl_ortho (0, cogl_framebuffer_get_width (fb), + cogl_framebuffer_get_height (fb), 0, + -1, 100); + cogl_pop_framebuffer (); + + closure = malloc (sizeof (cogl_closure_t)); + *abstract_closure = closure; + closure->device = device; + closure->fb = fb; + closure->surface = cairo_cogl_surface_create (device, fb); + + status = cairo_surface_set_user_data (closure->surface, + &cogl_closure_key, closure, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return closure->surface; + + _cairo_boilerplate_cogl_cleanup (closure); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_status_t +_cairo_boilerplate_cogl_finish_onscreen (cairo_surface_t *surface) +{ + cogl_closure_t *closure = cairo_surface_get_user_data (surface, &cogl_closure_key); + + cairo_cogl_surface_end_frame (surface); + + cogl_framebuffer_swap_buffers (closure->fb); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_boilerplate_cogl_synchronize (void *abstract_closure) +{ + cogl_closure_t *closure = abstract_closure; + cogl_framebuffer_finish (closure->fb); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "cogl-offscreen-color", "cogl", NULL, NULL, + CAIRO_SURFACE_TYPE_COGL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_cogl_device_create", + _cairo_boilerplate_cogl_create_offscreen_color_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_cogl_cleanup, + _cairo_boilerplate_cogl_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "cogl-onscreen-color", "cogl", NULL, NULL, + CAIRO_SURFACE_TYPE_COGL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_cogl_device_create", + _cairo_boilerplate_cogl_create_onscreen_color_surface, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_cogl_finish_onscreen, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_cogl_cleanup, + _cairo_boilerplate_cogl_synchronize, + NULL, + TRUE, FALSE, FALSE + } +}; +CAIRO_BOILERPLATE (cogl, targets) diff --git a/boilerplate/cairo-boilerplate-constructors.c b/boilerplate/cairo-boilerplate-constructors.c new file mode 100644 index 000000000..7b698699b --- /dev/null +++ b/boilerplate/cairo-boilerplate-constructors.c @@ -0,0 +1,27 @@ +/* WARNING: Autogenerated file - see ./make-cairo-boilerplate-constructors.sh! */ + +#include "cairo-boilerplate-private.h" + +void _cairo_boilerplate_register_all (void); + +extern void _register_builtin (void); +extern void _register_xlib (void); +extern void _register_xcb (void); +extern void _register_script (void); +extern void _register_ps (void); +extern void _register_pdf (void); +extern void _register_svg (void); +extern void _register_test (void); + +void +_cairo_boilerplate_register_all (void) +{ + _register_builtin (); + _register_xlib (); + _register_xcb (); + _register_script (); + _register_ps (); + _register_pdf (); + _register_svg (); + _register_test (); +} diff --git a/boilerplate/cairo-boilerplate-directfb.c b/boilerplate/cairo-boilerplate-directfb.c new file mode 100644 index 000000000..a479011d9 --- /dev/null +++ b/boilerplate/cairo-boilerplate-directfb.c @@ -0,0 +1,235 @@ +/* +Test were run with the following script +target can be directfb_bitmap or directfb + +export CAIRO_TEST_TARGET=directfb_bitmap +export DFBARGS=quiet,no-banner,no-debug,log-file=dfblog,system=x11 +cd cairo/test +make check + +*/ + +#include "cairo-boilerplate-private.h" + +#include <cairo-directfb.h> + +#include <stdio.h> +#include <stdlib.h> + +#include <direct/debug.h> + +D_DEBUG_DOMAIN (CairoDFB_Boiler, "CairoDFB/Boiler", "Cairo DirectFB Boilerplate"); + +/* macro for a safe call to DirectFB functions */ +#define DFBCHECK(x...) do{ \ + err = x; \ + if (err != DFB_OK) { \ + fprintf (stderr, "%s <%d>:\n\t", __FILE__, __LINE__); \ + goto ERROR; \ + } \ +} while (0) + +typedef struct _DFBInfo { + IDirectFB *dfb; + IDirectFBDisplayLayer *layer; + IDirectFBWindow *window; + IDirectFBSurface *surface; +} DFBInfo; + +static void +_cairo_boilerplate_directfb_cleanup (void *closure) +{ + DFBInfo *info = (DFBInfo *) closure; + + if (info->surface) + info->surface->Release (info->surface); + + if (info->window) + info->window->Release (info->window); + + if (info->layer) + info->layer->Release (info->layer); + + if (info->dfb) + info->dfb->Release (info->dfb); + + free (info); +} + +static DFBInfo * +init (void) +{ + DFBDisplayLayerConfig layer_config; + DFBGraphicsDeviceDescription desc; + int err; + DFBInfo *info; + + info = xcalloc (1, sizeof (DFBInfo)); + if (info == NULL) + return NULL; + + DFBCHECK (DirectFBInit (NULL, NULL)); + DFBCHECK (DirectFBCreate (&info->dfb)); + info->dfb->GetDeviceDescription (info->dfb, &desc); + + DFBCHECK (info->dfb->GetDisplayLayer (info->dfb, + DLID_PRIMARY, &info->layer)); + info->layer->SetCooperativeLevel (info->layer, DLSCL_ADMINISTRATIVE); + + if ((desc.blitting_flags & (DSBLIT_BLEND_ALPHACHANNEL | + DSBLIT_BLEND_COLORALPHA)) != + (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA)) + { + layer_config.flags = DLCONF_BUFFERMODE; + layer_config.buffermode = DLBM_BACKSYSTEM; + info->layer->SetConfiguration (info->layer, &layer_config); + } + + return info; + +ERROR: + if (info != NULL) + _cairo_boilerplate_directfb_cleanup (info); + return NULL; +} + +static cairo_surface_t * +_cairo_boilerplate_directfb_window_create_surface (DFBInfo *info, + cairo_content_t content, + int width, + int height) +{ + DFBWindowDescription desc; + int err; + + D_DEBUG_AT (CairoDFB_Boiler, "%s (%p, %s, %dx%d)\n", __FUNCTION__, info, + content == CAIRO_CONTENT_ALPHA ? "ALPHA" : + content == CAIRO_CONTENT_COLOR ? "RGB" : + content == CAIRO_CONTENT_COLOR_ALPHA ? "ARGB" : "unknown content!", + width, height); + + desc.flags = DWDESC_POSX | DWDESC_POSY | + DWDESC_WIDTH | DWDESC_HEIGHT; + desc.caps = DSCAPS_NONE; + desc.posx = 0; + desc.posy = 0; + desc.width = width; + desc.height = height; + if (content == CAIRO_CONTENT_COLOR_ALPHA) { + desc.flags |= DWDESC_CAPS | DWDESC_PIXELFORMAT; + desc.caps |= DWCAPS_DOUBLEBUFFER | DWCAPS_ALPHACHANNEL; + desc.pixelformat = DSPF_ARGB; + } + + DFBCHECK (info->layer->CreateWindow (info->layer, &desc, &info->window)); + info->window->SetOpacity (info->window, 0xFF); + info->window->GetSurface (info->window, &info->surface); + info->surface->SetColor (info->surface, 0xFF, 0xFF, 0xFF, 0xFF); + info->surface->FillRectangle (info->surface,0, 0, desc.width, desc.height); + info->surface->Flip (info->surface, NULL, 0); + + return cairo_directfb_surface_create (info->dfb, info->surface); + +ERROR: + _cairo_boilerplate_directfb_cleanup (info); + return NULL; +} + +static cairo_surface_t * +_cairo_boilerplate_directfb_bitmap_create_surface (DFBInfo *info, + cairo_content_t content, + int width, + int height) +{ + int err; + DFBSurfaceDescription desc; + + D_DEBUG_AT (CairoDFB_Boiler, "%s (%p, %s, %dx%d)\n", __FUNCTION__, info, + content == CAIRO_CONTENT_ALPHA ? "ALPHA" : + content == CAIRO_CONTENT_COLOR ? "RGB" : + content == CAIRO_CONTENT_COLOR_ALPHA ? "ARGB" : "unknown content!", + width, height); + + desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT; + desc.caps = DSCAPS_NONE; + desc.width = width; + desc.height = height; + if (content == CAIRO_CONTENT_COLOR_ALPHA) { + desc.flags |= DSDESC_PIXELFORMAT; + desc.pixelformat = DSPF_ARGB; + } + DFBCHECK (info->dfb->CreateSurface (info->dfb, &desc, &info->surface)); + + return cairo_directfb_surface_create (info->dfb, info->surface); + +ERROR: + _cairo_boilerplate_directfb_cleanup (info); + return NULL; +} + +static cairo_surface_t * +_cairo_boilerplate_directfb_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + + DFBInfo *info; + + info = init (); + if (info == NULL) + return NULL; + + *closure = info; + + D_DEBUG_AT (CairoDFB_Boiler, "%s ('%s', %s, %dx%d, %s)\n", + __FUNCTION__, name, + content == CAIRO_CONTENT_ALPHA ? "ALPHA" : + content == CAIRO_CONTENT_COLOR ? "RGB" : + content == CAIRO_CONTENT_COLOR_ALPHA ? "ARGB" : "unknown content!", + width, height, + mode == CAIRO_BOILERPLATE_MODE_TEST ? "TEST" : + mode == CAIRO_BOILERPLATE_MODE_PERF ? "PERF" : "unknown mode!"); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + return _cairo_boilerplate_directfb_bitmap_create_surface (info, content, width, height); + else /* mode == CAIRO_BOILERPLATE_MODE_PERF */ + return _cairo_boilerplate_directfb_window_create_surface (info, content, width, height); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "directfb", "directfb", NULL, NULL, + CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_CONTENT_COLOR, 0, + "cairo_directfb_surface_create", + _cairo_boilerplate_directfb_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_directfb_cleanup, + NULL, NULL, TRUE, FALSE, FALSE + }, + { + "directfb-bitmap", "directfb", NULL, NULL, + CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_directfb_surface_create", + _cairo_boilerplate_directfb_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_directfb_cleanup, + NULL, NULL, FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (directfb, targets); diff --git a/boilerplate/cairo-boilerplate-drm.c b/boilerplate/cairo-boilerplate-drm.c new file mode 100644 index 000000000..79d9229f6 --- /dev/null +++ b/boilerplate/cairo-boilerplate-drm.c @@ -0,0 +1,112 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-drm.h> + +static cairo_surface_t * +_cairo_boilerplate_drm_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_device_t *device; + cairo_format_t format; + + device = cairo_drm_device_default (); + if (device == NULL) + return NULL; /* skip tests if no supported h/w found */ + + switch (content) { + case CAIRO_CONTENT_ALPHA: + format = CAIRO_FORMAT_A8; + break; + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB24; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + default: + format = CAIRO_FORMAT_ARGB32; + break; + } + + return *closure = cairo_drm_surface_create (device, format, width, height); +} + +static void +_cairo_boilerplate_drm_synchronize (void *closure) +{ + cairo_surface_t *image; + + image = cairo_drm_surface_map_to_image (closure); + if (cairo_surface_status (image) == CAIRO_STATUS_SUCCESS) + cairo_drm_surface_unmap (closure, image); +} + +static const cairo_boilerplate_target_t targets[] = { + /* Acceleration architectures may make the results differ by a + * bit, so we set the error tolerance to 1. */ + { + "drm", "drm", NULL, NULL, + CAIRO_SURFACE_TYPE_DRM, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_drm_surface_create", + _cairo_boilerplate_drm_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, + _cairo_boilerplate_drm_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "drm", "drm", NULL, NULL, + CAIRO_SURFACE_TYPE_DRM, CAIRO_CONTENT_COLOR, 1, + "cairo_drm_surface_create", + _cairo_boilerplate_drm_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, + _cairo_boilerplate_drm_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (drm, targets) diff --git a/boilerplate/cairo-boilerplate-egl.c b/boilerplate/cairo-boilerplate-egl.c new file mode 100644 index 000000000..99bee64cf --- /dev/null +++ b/boilerplate/cairo-boilerplate-egl.c @@ -0,0 +1,180 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-gl.h> +#if CAIRO_HAS_GL_SURFACE +#include <GL/gl.h> +#elif CAIRO_HAS_GLESV2_SURFACE +#include <GLES2/gl2.h> +#endif + +static const cairo_user_data_key_t gl_closure_key; + +typedef struct _egl_target_closure { + EGLDisplay dpy; + EGLContext ctx; + + cairo_device_t *device; + cairo_surface_t *surface; +} egl_target_closure_t; + +static void +_cairo_boilerplate_egl_cleanup (void *closure) +{ + egl_target_closure_t *gltc = closure; + + cairo_device_finish (gltc->device); + cairo_device_destroy (gltc->device); + + eglDestroyContext (gltc->dpy, gltc->ctx); + eglMakeCurrent (gltc->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglTerminate (gltc->dpy); + + free (gltc); +} + +static cairo_surface_t * +_cairo_boilerplate_egl_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + egl_target_closure_t *gltc; + cairo_surface_t *surface; + int major, minor; + EGLConfig config; + EGLint numConfigs; + EGLint config_attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, +#if CAIRO_HAS_GL_SURFACE + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, +#elif CAIRO_HAS_GLESV2_SURFACE + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, +#endif + EGL_NONE + }; + const EGLint ctx_attribs[] = { +#if CAIRO_HAS_GLESV2_SURFACE + EGL_CONTEXT_CLIENT_VERSION, 2, +#endif + EGL_NONE + }; + + gltc = xcalloc (1, sizeof (egl_target_closure_t)); + *closure = gltc; + + gltc->dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); + + if (! eglInitialize (gltc->dpy, &major, &minor)) { + free (gltc); + return NULL; + } + + eglChooseConfig (gltc->dpy, config_attribs, &config, 1, &numConfigs); + if (numConfigs == 0) { + free (gltc); + return NULL; + } + +#if CAIRO_HAS_GL_SURFACE + eglBindAPI (EGL_OPENGL_API); +#elif CAIRO_HAS_GLESV2_SURFACE + eglBindAPI (EGL_OPENGL_ES_API); +#endif + + gltc->ctx = eglCreateContext (gltc->dpy, config, EGL_NO_CONTEXT, + ctx_attribs); + if (gltc->ctx == EGL_NO_CONTEXT) { + eglTerminate (gltc->dpy); + free (gltc); + return NULL; + } + + gltc->device = cairo_egl_device_create (gltc->dpy, gltc->ctx); + if (mode == CAIRO_BOILERPLATE_MODE_PERF) + cairo_gl_device_set_thread_aware(gltc->device, FALSE); + + if (width < 1) + width = 1; + if (height < 1) + height = 1; + + gltc->surface = surface = cairo_gl_surface_create (gltc->device, + content, + ceil (width), + ceil (height)); + if (cairo_surface_status (surface)) + _cairo_boilerplate_egl_cleanup (gltc); + + return surface; +} + +static void +_cairo_boilerplate_egl_synchronize (void *closure) +{ + egl_target_closure_t *gltc = closure; + + if (cairo_device_acquire (gltc->device)) + return; + + glFinish (); + + cairo_device_release (gltc->device); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "egl", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_egl_device_create", + _cairo_boilerplate_egl_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_egl_cleanup, + _cairo_boilerplate_egl_synchronize, + NULL, + TRUE, FALSE, FALSE + } +}; +CAIRO_BOILERPLATE (egl, targets) diff --git a/boilerplate/cairo-boilerplate-getopt.c b/boilerplate/cairo-boilerplate-getopt.c new file mode 100644 index 000000000..53b150c29 --- /dev/null +++ b/boilerplate/cairo-boilerplate-getopt.c @@ -0,0 +1,247 @@ +/***************************************************************************** +* getopt.c - competent and free getopt library. +* $Header: /cvsroot/freegetopt/freegetopt/getopt.c,v 1.2 2003/10/26 03:10:20 vindaci Exp $ +* +* Copyright (c)2002-2003 Mark K. Kim +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* +* * Neither the original author of this software nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +*/ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "cairo-boilerplate-getopt.h" + + +char* optarg = NULL; +int optind = 0; +int opterr = 1; +int optopt = '?'; + + +static char** prev_argv = NULL; /* Keep a copy of argv and argc to */ +static int prev_argc = 0; /* tell if getopt params change */ +static int argv_index = 0; /* Option we're checking */ +static int argv_index2 = 0; /* Option argument we're checking */ +static int opt_offset = 0; /* Index into compounded "-option" */ +static int dashdash = 0; /* True if "--" option reached */ +static int nonopt = 0; /* How many nonopts we've found */ + +static void increment_index(void) +{ + /* Move onto the next option */ + if(argv_index < argv_index2) + { + while(prev_argv[++argv_index] && prev_argv[argv_index][0] != '-' + && argv_index < argv_index2+1); + } + else argv_index++; + opt_offset = 1; +} + + +/* +* Permutes argv[] so that the argument currently being processed is moved +* to the end. +*/ +static int permute_argv_once(void) +{ + /* Movability check */ + if(argv_index + nonopt >= prev_argc) return 1; + /* Move the current option to the end, bring the others to front */ + else + { + char* tmp = prev_argv[argv_index]; + + /* Move the data */ + memmove(&prev_argv[argv_index], &prev_argv[argv_index+1], + sizeof(char**) * (prev_argc - argv_index - 1)); + prev_argv[prev_argc - 1] = tmp; + + nonopt++; + return 0; + } +} + + +int _cairo_getopt(int argc, char** argv, const char* optstr) +{ + int c = 0; + + /* If we have new argv, reinitialize */ + if(prev_argv != argv || prev_argc != argc) + { + /* Initialize variables */ + prev_argv = argv; + prev_argc = argc; + argv_index = 1; + argv_index2 = 1; + opt_offset = 1; + dashdash = 0; + nonopt = 0; + } + + /* Jump point in case we want to ignore the current argv_index */ + getopt_top: + + /* Misc. initializations */ + optarg = NULL; + + /* Dash-dash check */ + if(argv[argv_index] && !strcmp(argv[argv_index], "--")) + { + dashdash = 1; + increment_index(); + } + + /* If we're at the end of argv, that's it. */ + if(argv[argv_index] == NULL) + { + c = -1; + } + /* Are we looking at a string? Single dash is also a string */ + else if(dashdash || argv[argv_index][0] != '-' || !strcmp(argv[argv_index], "-")) + { + /* If we want a string... */ + if(optstr[0] == '-') + { + c = 1; + optarg = argv[argv_index]; + increment_index(); + } + /* If we really don't want it (we're in POSIX mode), we're done */ + else if(optstr[0] == '+' || getenv("POSIXLY_CORRECT")) + { + c = -1; + + /* Everything else is a non-opt argument */ + nonopt = argc - argv_index; + } + /* If we mildly don't want it, then move it back */ + else + { + if(!permute_argv_once()) goto getopt_top; + else c = -1; + } + } + /* Otherwise we're looking at an option */ + else + { + char* opt_ptr = NULL; + + /* Grab the option */ + c = argv[argv_index][opt_offset++]; + + /* Is the option in the optstr? */ + if(optstr[0] == '-') opt_ptr = strchr(optstr+1, c); + else opt_ptr = strchr(optstr, c); + /* Invalid argument */ + if(!opt_ptr) + { + if(opterr) + { + fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); + } + + optopt = c; + c = '?'; + + /* Move onto the next option */ + increment_index(); + } + /* Option takes argument */ + else if(opt_ptr[1] == ':') + { + /* ie, -oARGUMENT, -xxxoARGUMENT, etc. */ + if(argv[argv_index][opt_offset] != '\0') + { + optarg = &argv[argv_index][opt_offset]; + increment_index(); + } + /* ie, -o ARGUMENT (only if it's a required argument) */ + else if(opt_ptr[2] != ':') + { + /* One of those "you're not expected to understand this" moment */ + if(argv_index2 < argv_index) argv_index2 = argv_index; + while(argv[++argv_index2] && argv[argv_index2][0] == '-'); + optarg = argv[argv_index2]; + + /* Don't cross into the non-option argument list */ + if(argv_index2 + nonopt >= prev_argc) optarg = NULL; + + /* Move onto the next option */ + increment_index(); + } + else + { + /* Move onto the next option */ + increment_index(); + } + + /* In case we got no argument for an option with required argument */ + if(optarg == NULL && opt_ptr[2] != ':') + { + optopt = c; + c = '?'; + + if(opterr) + { + fprintf(stderr,"%s: option requires an argument -- %c\n", + argv[0], optopt); + } + } + } + /* Option does not take argument */ + else + { + /* Next argv_index */ + if(argv[argv_index][opt_offset] == '\0') + { + increment_index(); + } + } + } + + /* Calculate optind */ + if(c == -1) + { + optind = argc - nonopt; + } + else + { + optind = argv_index; + } + + return c; +} + + +/* vim:ts=3 +*/ diff --git a/boilerplate/cairo-boilerplate-getopt.h b/boilerplate/cairo-boilerplate-getopt.h new file mode 100644 index 000000000..74bce14c7 --- /dev/null +++ b/boilerplate/cairo-boilerplate-getopt.h @@ -0,0 +1,63 @@ +/***************************************************************************** +* getopt.h - competent and free getopt library. +* $Header: /cvsroot/freegetopt/freegetopt/getopt.h,v 1.2 2003/10/26 03:10:20 vindaci Exp $ +* +* Copyright (c)2002-2003 Mark K. Kim +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* +* * Neither the original author of this software nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGE. +*/ +#ifndef GETOPT_H_ +#define GETOPT_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +extern char* optarg; +extern int optind; +extern int opterr; +extern int optopt; + +int _cairo_getopt(int argc, char** argv, const char* optstr); + + +#ifdef __cplusplus +} +#endif + + +#endif /* GETOPT_H_ */ + + +/* vim:ts=3 +*/ diff --git a/boilerplate/cairo-boilerplate-glx.c b/boilerplate/cairo-boilerplate-glx.c new file mode 100644 index 000000000..3d582151e --- /dev/null +++ b/boilerplate/cairo-boilerplate-glx.c @@ -0,0 +1,457 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-gl.h> + +#include <X11/X.h> +#include <X11/Xutil.h> /* for XDestroyImage */ + +static const cairo_user_data_key_t gl_closure_key; + +typedef struct _gl_target_closure { + Display *dpy; + int screen; + Window drawable; + + GLXContext ctx; + cairo_device_t *device; + cairo_surface_t *surface; +} gl_target_closure_t; + +static void +_cairo_boilerplate_gl_cleanup (void *closure) +{ + gl_target_closure_t *gltc = closure; + + cairo_device_finish (gltc->device); + cairo_device_destroy (gltc->device); + + glXDestroyContext (gltc->dpy, gltc->ctx); + + if (gltc->drawable) + XDestroyWindow (gltc->dpy, gltc->drawable); + XCloseDisplay (gltc->dpy); + + free (gltc); +} + +static cairo_surface_t * +_cairo_boilerplate_gl_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + int rgba_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_NONE }; + int rgb_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_NONE }; + XVisualInfo *visinfo; + GLXContext ctx; + gl_target_closure_t *gltc; + cairo_surface_t *surface; + Display *dpy; + + gltc = calloc (1, sizeof (gl_target_closure_t)); + *closure = gltc; + + width = ceil (width); + height = ceil (height); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + dpy = XOpenDisplay (NULL); + gltc->dpy = dpy; + if (!gltc->dpy) { + fprintf (stderr, "Failed to open display: %s\n", XDisplayName(0)); + free (gltc); + return NULL; + } + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + XSynchronize (gltc->dpy, 1); + + if (content == CAIRO_CONTENT_COLOR) + visinfo = glXChooseVisual (dpy, DefaultScreen (dpy), rgb_attribs); + else + visinfo = glXChooseVisual (dpy, DefaultScreen (dpy), rgba_attribs); + + if (visinfo == NULL) { + fprintf (stderr, "Failed to create RGB, double-buffered visual\n"); + XCloseDisplay (dpy); + free (gltc); + return NULL; + } + + ctx = glXCreateContext (dpy, visinfo, NULL, True); + XFree (visinfo); + + gltc->ctx = ctx; + gltc->device = cairo_glx_device_create (dpy, ctx); + + if (mode == CAIRO_BOILERPLATE_MODE_PERF) + cairo_gl_device_set_thread_aware(gltc->device, FALSE); + + gltc->surface = surface = cairo_gl_surface_create (gltc->device, + content, width, height); + if (cairo_surface_status (surface)) + _cairo_boilerplate_gl_cleanup (gltc); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_gl_create_window_common (int rgba_attribs[], + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + gl_target_closure_t *gltc) +{ + XVisualInfo *vi; + GLXContext ctx; + cairo_surface_t *surface; + Display *dpy; + XSetWindowAttributes attr; + + width = ceil (width); + height = ceil (height); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + dpy = XOpenDisplay (NULL); + gltc->dpy = dpy; + if (!gltc->dpy) { + fprintf (stderr, "Failed to open display: %s\n", XDisplayName(0)); + free (gltc); + return NULL; + } + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + XSynchronize (gltc->dpy, 1); + + vi = glXChooseVisual (dpy, DefaultScreen (dpy), rgba_attribs); + if (vi == NULL) { + fprintf (stderr, "Failed to create RGBA, double-buffered visual\n"); + XCloseDisplay (dpy); + free (gltc); + return NULL; + } + + attr.colormap = XCreateColormap (dpy, + RootWindow (dpy, vi->screen), + vi->visual, + AllocNone); + attr.border_pixel = 0; + attr.override_redirect = True; + gltc->drawable = XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, + width, height, 0, vi->depth, + InputOutput, vi->visual, + CWOverrideRedirect | CWBorderPixel | CWColormap, + &attr); + XMapWindow (dpy, gltc->drawable); + + ctx = glXCreateContext (dpy, vi, NULL, True); + XFree (vi); + + gltc->ctx = ctx; + gltc->device = cairo_glx_device_create (dpy, ctx); + + gltc->surface = surface = cairo_gl_surface_create_for_window (gltc->device, + gltc->drawable, + width, height); + if (cairo_surface_status (surface)) { + _cairo_boilerplate_gl_cleanup (gltc); + return NULL; + } + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_gl_create_window (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + gl_target_closure_t *gltc; + + int rgba_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_NONE }; + + gltc = calloc (1, sizeof (gl_target_closure_t)); + *closure = gltc; + + return _cairo_boilerplate_gl_create_window_common (rgba_attribs, content, + width, height, + max_width, max_height, + mode, gltc); +} + +static cairo_surface_t * +_cairo_boilerplate_gl_create_window_msaa (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + gl_target_closure_t *gltc; + + int rgba_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_STENCIL_SIZE, 1, + GLX_SAMPLES, 4, + GLX_SAMPLE_BUFFERS, 1, + GLX_DOUBLEBUFFER, + GLX_NONE }; + + gltc = calloc (1, sizeof (gl_target_closure_t)); + *closure = gltc; + return _cairo_boilerplate_gl_create_window_common (rgba_attribs, content, + width, height, + max_width, max_height, + mode, gltc); + +} + +static cairo_surface_t * +_cairo_boilerplate_gl_create_window_db (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_status_t status; + cairo_surface_t *surface; + gl_target_closure_t *gltc; + + int rgba_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_NONE }; + + gltc = calloc (1, sizeof (gl_target_closure_t)); + *closure = gltc; + + surface = _cairo_boilerplate_gl_create_window_common (rgba_attribs, content, + width, height, + max_width, max_height, + mode, gltc); + + if (! surface) + return NULL; + + surface = cairo_surface_create_similar (gltc->surface, content, width, height); + status = cairo_surface_set_user_data (surface, &gl_closure_key, gltc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + _cairo_boilerplate_gl_cleanup (gltc); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_status_t +_cairo_boilerplate_gl_finish_window (cairo_surface_t *surface) +{ + gl_target_closure_t *gltc = cairo_surface_get_user_data (surface, + &gl_closure_key); + + if (gltc != NULL && gltc->surface != NULL) { + cairo_t *cr; + + cr = cairo_create (gltc->surface); + cairo_surface_set_device_offset (surface, 0, 0); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_destroy (cr); + + surface = gltc->surface; + } + + cairo_gl_surface_swapbuffers (surface); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_boilerplate_gl_synchronize (void *closure) +{ + gl_target_closure_t *gltc = closure; + + if (cairo_device_acquire (gltc->device)) + return; + + glFinish (); + + cairo_device_release (gltc->device); +} + +static char * +_cairo_boilerplate_gl_describe (void *closure) +{ + gl_target_closure_t *gltc = closure; + char *s; + const GLubyte *vendor, *renderer, *version; + + if (cairo_device_acquire (gltc->device)) + return NULL; + + vendor = glGetString (GL_VENDOR); + renderer = glGetString (GL_RENDERER); + version = glGetString (GL_VERSION); + + xasprintf (&s, "%s %s %s", vendor, renderer, version); + + cairo_device_release (gltc->device); + + return s; +} + +static const cairo_boilerplate_target_t targets[] = { + { + "gl", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_gl_surface_create", + _cairo_boilerplate_gl_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize, + _cairo_boilerplate_gl_describe, + TRUE, FALSE, FALSE + }, + { + "gl", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR, 1, + "cairo_gl_surface_create", + _cairo_boilerplate_gl_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize, + _cairo_boilerplate_gl_describe, + FALSE, FALSE, FALSE + }, + { + "gl-window", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_gl_surface_create_for_window", + _cairo_boilerplate_gl_create_window, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_gl_finish_window, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize, + _cairo_boilerplate_gl_describe, + FALSE, FALSE, FALSE + }, + { + "gl-window-msaa", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_gl_surface_create_for_window", + _cairo_boilerplate_gl_create_window_msaa, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_gl_finish_window, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize, + _cairo_boilerplate_gl_describe, + FALSE, FALSE, FALSE + }, + { + "gl-window&", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_gl_surface_create_for_window", + _cairo_boilerplate_gl_create_window_db, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_gl_finish_window, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize, + _cairo_boilerplate_gl_describe, + FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (gl, targets) diff --git a/boilerplate/cairo-boilerplate-pdf.c b/boilerplate/cairo-boilerplate-pdf.c new file mode 100644 index 000000000..177cdf174 --- /dev/null +++ b/boilerplate/cairo-boilerplate-pdf.c @@ -0,0 +1,278 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" + +#if CAIRO_CAN_TEST_PDF_SURFACE + +#include <cairo-pdf.h> +#include <cairo-pdf-surface-private.h> +#include <cairo-paginated-surface-private.h> + +#if HAVE_SIGNAL_H +#include <signal.h> +#endif + +#if HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif + +#if ! CAIRO_HAS_RECORDING_SURFACE +#define CAIRO_SURFACE_TYPE_RECORDING CAIRO_INTERNAL_SURFACE_TYPE_RECORDING +#endif + +static const cairo_user_data_key_t pdf_closure_key; + +typedef struct _pdf_target_closure +{ + char *filename; + int width; + int height; + cairo_surface_t *target; +} pdf_target_closure_t; + +static cairo_surface_t * +_cairo_boilerplate_pdf_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + pdf_target_closure_t *ptc; + cairo_surface_t *surface; + cairo_status_t status; + + /* Sanitize back to a real cairo_content_t value. */ + if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED) + content = CAIRO_CONTENT_COLOR_ALPHA; + + *closure = ptc = xmalloc (sizeof (pdf_target_closure_t)); + + ptc->width = ceil (width); + ptc->height = ceil (height); + + xasprintf (&ptc->filename, "%s.out.pdf", name); + xunlink (ptc->filename); + + surface = cairo_pdf_surface_create (ptc->filename, width, height); + if (cairo_surface_status (surface)) + goto CLEANUP_FILENAME; + + cairo_surface_set_fallback_resolution (surface, 72., 72.); + + if (content == CAIRO_CONTENT_COLOR) { + ptc->target = surface; + surface = cairo_surface_create_similar (ptc->target, + CAIRO_CONTENT_COLOR, + ptc->width, ptc->height); + if (cairo_surface_status (surface)) + goto CLEANUP_TARGET; + } else { + ptc->target = NULL; + } + + status = cairo_surface_set_user_data (surface, &pdf_closure_key, ptc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + surface = cairo_boilerplate_surface_create_in_error (status); + + CLEANUP_TARGET: + cairo_surface_destroy (ptc->target); + CLEANUP_FILENAME: + free (ptc->filename); + free (ptc); + return surface; +} + +static cairo_status_t +_cairo_boilerplate_pdf_finish_surface (cairo_surface_t *surface) +{ + pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &pdf_closure_key); + cairo_status_t status; + + /* Both surface and ptc->target were originally created at the + * same dimensions. We want a 1:1 copy here, so we first clear any + * device offset on surface. + * + * In a more realistic use case of device offsets, the target of + * this copying would be of a different size than the source, and + * the offset would be desirable during the copy operation. */ + cairo_surface_set_device_offset (surface, 0, 0); + + if (ptc->target) { + cairo_t *cr; + cr = cairo_create (ptc->target); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_show_page (cr); + status = cairo_status (cr); + cairo_destroy (cr); + + if (status) + return status; + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status) + return status; + + surface = ptc->target; + } + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_boilerplate_pdf_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key); + char command[4096]; + int exitstatus; + + sprintf (command, "./pdf2png %s %s 1", + ptc->filename, filename); + + exitstatus = system (command); +#if _XOPEN_SOURCE && HAVE_SIGNAL_H + if (WIFSIGNALED (exitstatus)) + raise (WTERMSIG (exitstatus)); +#endif + if (exitstatus) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_boilerplate_pdf_convert_to_image (cairo_surface_t *surface, + int page) +{ + pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &pdf_closure_key); + + return cairo_boilerplate_convert_to_image (ptc->filename, page+1); +} + +static cairo_surface_t * +_cairo_boilerplate_pdf_get_image_surface (cairo_surface_t *surface, + int page, + int width, + int height) +{ + cairo_surface_t *image; + + image = _cairo_boilerplate_pdf_convert_to_image (surface, page); + cairo_surface_set_device_offset (image, + cairo_image_surface_get_width (image) - width, + cairo_image_surface_get_height (image) - height); + surface = _cairo_boilerplate_get_image_surface (image, 0, width, height); + cairo_surface_destroy (image); + + return surface; +} + +static void +_cairo_boilerplate_pdf_cleanup (void *closure) +{ + pdf_target_closure_t *ptc = closure; + if (ptc->target) { + cairo_surface_finish (ptc->target); + cairo_surface_destroy (ptc->target); + } + free (ptc->filename); + free (ptc); +} + +static void +_cairo_boilerplate_pdf_force_fallbacks (cairo_surface_t *abstract_surface, + double x_pixels_per_inch, + double y_pixels_per_inch) +{ + pdf_target_closure_t *ptc = cairo_surface_get_user_data (abstract_surface, + &pdf_closure_key); + + cairo_paginated_surface_t *paginated; + cairo_pdf_surface_t *surface; + + if (ptc->target) + abstract_surface = ptc->target; + + paginated = (cairo_paginated_surface_t*) abstract_surface; + surface = (cairo_pdf_surface_t*) paginated->target; + surface->force_fallbacks = TRUE; + cairo_surface_set_fallback_resolution (&paginated->base, + x_pixels_per_inch, + y_pixels_per_inch); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "pdf", "pdf", ".pdf", NULL, + CAIRO_SURFACE_TYPE_PDF, + CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED, 0, + "cairo_pdf_surface_create", + _cairo_boilerplate_pdf_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_pdf_force_fallbacks, + _cairo_boilerplate_pdf_finish_surface, + _cairo_boilerplate_pdf_get_image_surface, + _cairo_boilerplate_pdf_surface_write_to_png, + _cairo_boilerplate_pdf_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "pdf", "pdf", ".pdf", NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 0, + "cairo_pdf_surface_create", + _cairo_boilerplate_pdf_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_pdf_force_fallbacks, + _cairo_boilerplate_pdf_finish_surface, + _cairo_boilerplate_pdf_get_image_surface, + _cairo_boilerplate_pdf_surface_write_to_png, + _cairo_boilerplate_pdf_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, +}; +CAIRO_BOILERPLATE (pdf, targets) + +#else + +CAIRO_NO_BOILERPLATE (pdf) + +#endif diff --git a/boilerplate/cairo-boilerplate-private.h b/boilerplate/cairo-boilerplate-private.h new file mode 100644 index 000000000..d16a645b2 --- /dev/null +++ b/boilerplate/cairo-boilerplate-private.h @@ -0,0 +1,53 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson <chris@chris-wilson.co.uk> + */ + +#ifndef _CAIRO_BOILERPLATE_PRIVATE_H_ +#define _CAIRO_BOILERPLATE_PRIVATE_H_ + +#include "cairo-boilerplate.h" + +CAIRO_BEGIN_DECLS + +void +_cairo_boilerplate_register_all (void); + +void +_cairo_boilerplate_register_backend (const cairo_boilerplate_target_t *targets, + unsigned int count); + +#define CAIRO_BOILERPLATE(name__, targets__) \ +void _register_##name__ (void); \ +void _register_##name__ (void) { \ + _cairo_boilerplate_register_backend (targets__, \ + ARRAY_LENGTH(targets__)); \ +} + +#define CAIRO_NO_BOILERPLATE(name__) \ +void _register_##name__ (void); \ +void _register_##name__ (void) { } + +CAIRO_END_DECLS + +#endif /* _CAIRO_BOILERPLATE_PRIVATE_H_ */ diff --git a/boilerplate/cairo-boilerplate-ps.c b/boilerplate/cairo-boilerplate-ps.c new file mode 100644 index 000000000..ae61239f3 --- /dev/null +++ b/boilerplate/cairo-boilerplate-ps.c @@ -0,0 +1,369 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" + +#if CAIRO_CAN_TEST_PS_SURFACE + +#include <cairo-ps.h> + +#include <cairo-ps-surface-private.h> +#include <cairo-paginated-surface-private.h> + +#if HAVE_SIGNAL_H +#include <signal.h> +#endif + +#if HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif + +#if ! CAIRO_HAS_RECORDING_SURFACE +#define CAIRO_SURFACE_TYPE_RECORDING CAIRO_INTERNAL_SURFACE_TYPE_RECORDING +#endif + +static const cairo_user_data_key_t ps_closure_key; + +typedef struct _ps_target_closure { + char *filename; + int width; + int height; + cairo_surface_t *target; + cairo_ps_level_t level; +} ps_target_closure_t; + +static cairo_status_t +_cairo_boilerplate_ps_surface_set_creation_date (cairo_surface_t *abstract_surface, + time_t date) +{ + cairo_paginated_surface_t *paginated = (cairo_paginated_surface_t*) abstract_surface; + cairo_ps_surface_t *surface; + + if (cairo_surface_get_type (abstract_surface) != CAIRO_SURFACE_TYPE_PS) + return CAIRO_STATUS_SURFACE_TYPE_MISMATCH; + + surface = (cairo_ps_surface_t*) paginated->target; + + surface->has_creation_date = TRUE; + surface->creation_date = date; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_boilerplate_ps_create_surface (const char *name, + cairo_content_t content, + cairo_ps_level_t level, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + ps_target_closure_t *ptc; + cairo_surface_t *surface; + cairo_status_t status; + + /* Sanitize back to a real cairo_content_t value. */ + if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED) + content = CAIRO_CONTENT_COLOR_ALPHA; + + *closure = ptc = xmalloc (sizeof (ps_target_closure_t)); + + xasprintf (&ptc->filename, "%s.out.ps", name); + xunlink (ptc->filename); + + ptc->level = level; + ptc->width = ceil (width); + ptc->height = ceil (height); + + surface = cairo_ps_surface_create (ptc->filename, width, height); + if (cairo_surface_status (surface)) + goto CLEANUP_FILENAME; + + cairo_ps_surface_restrict_to_level (surface, level); + _cairo_boilerplate_ps_surface_set_creation_date (surface, 0); + cairo_surface_set_fallback_resolution (surface, 72., 72.); + + if (content == CAIRO_CONTENT_COLOR) { + ptc->target = surface; + surface = cairo_surface_create_similar (ptc->target, + CAIRO_CONTENT_COLOR, + ptc->width, ptc->height); + if (cairo_surface_status (surface)) + goto CLEANUP_TARGET; + } else { + ptc->target = NULL; + } + + status = cairo_surface_set_user_data (surface, &ps_closure_key, ptc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + surface = cairo_boilerplate_surface_create_in_error (status); + + CLEANUP_TARGET: + cairo_surface_destroy (ptc->target); + CLEANUP_FILENAME: + free (ptc->filename); + free (ptc); + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_ps2_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + return _cairo_boilerplate_ps_create_surface (name, content, + CAIRO_PS_LEVEL_2, + width, height, + max_width, max_height, + mode, + closure); +} + +static cairo_surface_t * +_cairo_boilerplate_ps3_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + return _cairo_boilerplate_ps_create_surface (name, content, + CAIRO_PS_LEVEL_3, + width, height, + max_width, max_height, + mode, + closure); +} + +static cairo_status_t +_cairo_boilerplate_ps_finish_surface (cairo_surface_t *surface) +{ + ps_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &ps_closure_key); + cairo_status_t status; + + /* Both surface and ptc->target were originally created at the + * same dimensions. We want a 1:1 copy here, so we first clear any + * device offset on surface. + * + * In a more realistic use case of device offsets, the target of + * this copying would be of a different size than the source, and + * the offset would be desirable during the copy operation. */ + cairo_surface_set_device_offset (surface, 0, 0); + + if (ptc->target) { + cairo_t *cr; + + cr = cairo_create (ptc->target); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_show_page (cr); + status = cairo_status (cr); + cairo_destroy (cr); + + if (status) + return status; + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status) + return status; + + surface = ptc->target; + } + + cairo_surface_finish (surface); + return cairo_surface_status (surface); +} + +static cairo_status_t +_cairo_boilerplate_ps_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + ps_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &ps_closure_key); + char command[4096]; + int exitstatus; + + sprintf (command, "gs -q -r72 -g%dx%d -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=%s %s %s", + ptc->width, ptc->height, filename, + ptc->level == CAIRO_PS_LEVEL_2 ? "-c 2 .setlanguagelevel -f" : "", + ptc->filename); + exitstatus = system (command); +#if _XOPEN_SOURCE && HAVE_SIGNAL_H + if (WIFSIGNALED (exitstatus)) + raise (WTERMSIG (exitstatus)); +#endif + if (exitstatus) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_boilerplate_ps_get_image_surface (cairo_surface_t *surface, + int page, + int width, + int height) +{ + ps_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &ps_closure_key); + char *filename; + cairo_status_t status; + + if (page == 0) + xasprintf (&filename, "%s.png", ptc->filename); + else + xasprintf (&filename, "%s-%%05d.png", ptc->filename); + status = _cairo_boilerplate_ps_surface_write_to_png (surface, filename); + if (status) + return cairo_boilerplate_surface_create_in_error (status); + + if (page != 0) { + free (filename); + xasprintf (&filename, "%s-%05d.png", ptc->filename, page); + } + surface = cairo_boilerplate_get_image_surface_from_png (filename, + width, + height, + ptc->target == NULL); + + remove (filename); + free (filename); + + return surface; +} + +static void +_cairo_boilerplate_ps_cleanup (void *closure) +{ + ps_target_closure_t *ptc = closure; + if (ptc->target) { + cairo_surface_finish (ptc->target); + cairo_surface_destroy (ptc->target); + } + free (ptc->filename); + free (ptc); +} + +static void +_cairo_boilerplate_ps_force_fallbacks (cairo_surface_t *abstract_surface, + double x_pixels_per_inch, + double y_pixels_per_inch) +{ + ps_target_closure_t *ptc = cairo_surface_get_user_data (abstract_surface, + &ps_closure_key); + + cairo_paginated_surface_t *paginated; + cairo_ps_surface_t *surface; + + if (ptc->target) + abstract_surface = ptc->target; + + paginated = (cairo_paginated_surface_t*) abstract_surface; + surface = (cairo_ps_surface_t*) paginated->target; + surface->force_fallbacks = TRUE; + cairo_surface_set_fallback_resolution (&paginated->base, + x_pixels_per_inch, + y_pixels_per_inch); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "ps2", "ps", ".ps", NULL, + CAIRO_SURFACE_TYPE_PS, + CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED, 0, + "cairo_ps_surface_create", + _cairo_boilerplate_ps2_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_ps_force_fallbacks, + _cairo_boilerplate_ps_finish_surface, + _cairo_boilerplate_ps_get_image_surface, + _cairo_boilerplate_ps_surface_write_to_png, + _cairo_boilerplate_ps_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "ps2", "ps", ".ps", NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 0, + "cairo_ps_surface_create", + _cairo_boilerplate_ps2_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_ps_force_fallbacks, + _cairo_boilerplate_ps_finish_surface, + _cairo_boilerplate_ps_get_image_surface, + _cairo_boilerplate_ps_surface_write_to_png, + _cairo_boilerplate_ps_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "ps3", "ps", ".ps", NULL, + CAIRO_SURFACE_TYPE_PS, + CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED, 0, + "cairo_ps_surface_create", + _cairo_boilerplate_ps3_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_ps_force_fallbacks, + _cairo_boilerplate_ps_finish_surface, + _cairo_boilerplate_ps_get_image_surface, + _cairo_boilerplate_ps_surface_write_to_png, + _cairo_boilerplate_ps_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "ps3", "ps", ".ps", NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 0, + "cairo_ps_surface_create", + _cairo_boilerplate_ps3_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_ps_force_fallbacks, + _cairo_boilerplate_ps_finish_surface, + _cairo_boilerplate_ps_get_image_surface, + _cairo_boilerplate_ps_surface_write_to_png, + _cairo_boilerplate_ps_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, +}; +CAIRO_BOILERPLATE (ps, targets) + +#else + +CAIRO_NO_BOILERPLATE (ps) + +#endif diff --git a/boilerplate/cairo-boilerplate-qt.cpp b/boilerplate/cairo-boilerplate-qt.cpp new file mode 100644 index 000000000..31c081483 --- /dev/null +++ b/boilerplate/cairo-boilerplate-qt.cpp @@ -0,0 +1,114 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-qt.h> + +#include <qapplication.h> +#include <X11/Xlib.h> + +typedef struct _qt_closure { + Display *dpy; + QApplication *app; +} qt_closure_t; + +static void +_cairo_boilerplate_qt_cleanup (void *closure) +{ + qt_closure_t *qtc = (qt_closure_t *) closure; + + delete qtc->app; + XCloseDisplay (qtc->dpy); + free (qtc); +} + +static cairo_surface_t * +_cairo_boilerplate_qt_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + qt_closure_t *qtc; + + qtc = (qt_closure_t *) xcalloc (1, sizeof (qt_closure_t)); + qtc->dpy = XOpenDisplay (NULL); + if (qtc->dpy == NULL) { + free (qtc); + return NULL; + } + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + XSynchronize (qtc->dpy, True); + + qtc->app = new QApplication (qtc->dpy); + *closure = qtc; + return cairo_qt_surface_create_with_qpixmap (content, width, height); +} + +static void +_cairo_boilerplate_qt_synchronize (void *closure) +{ + qt_closure_t *qtc = (qt_closure_t *) closure; + + qtc->app->flush (); /* not sure if this is sufficient */ +} + +static const cairo_boilerplate_target_t targets[] = { + { + "qt", "qt", NULL, NULL, + CAIRO_SURFACE_TYPE_QT, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_qt_surface_create", + _cairo_boilerplate_qt_create_surface, + NULL, NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_qt_cleanup + }, + { + "qt", "qt", NULL, NULL, + CAIRO_SURFACE_TYPE_QT, CAIRO_CONTENT_COLOR, 0, + "cairo_qt_surface_create", + _cairo_boilerplate_qt_create_surface, + NULL, NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_qt_cleanup + }, +}; +extern "C" { +CAIRO_BOILERPLATE (qt, targets) +} diff --git a/boilerplate/cairo-boilerplate-quartz.c b/boilerplate/cairo-boilerplate-quartz.c new file mode 100644 index 000000000..d4ca35383 --- /dev/null +++ b/boilerplate/cairo-boilerplate-quartz.c @@ -0,0 +1,76 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2007 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-quartz.h> + +static cairo_surface_t * +_cairo_boilerplate_quartz_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_format_t format; + + format = cairo_boilerplate_format_from_content (content); + + *closure = NULL; + + return cairo_quartz_surface_create (format, width, height); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "quartz", "quartz", NULL, NULL, + CAIRO_SURFACE_TYPE_QUARTZ, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_quartz_surface_create", + _cairo_boilerplate_quartz_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, + TRUE, FALSE, FALSE + }, + { + "quartz", "quartz", NULL, NULL, + CAIRO_SURFACE_TYPE_QUARTZ, CAIRO_CONTENT_COLOR, 0, + "cairo_quartz_surface_create", + _cairo_boilerplate_quartz_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, + FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (quartz, targets) diff --git a/boilerplate/cairo-boilerplate-scaled-font.h b/boilerplate/cairo-boilerplate-scaled-font.h new file mode 100644 index 000000000..a7ba2fede --- /dev/null +++ b/boilerplate/cairo-boilerplate-scaled-font.h @@ -0,0 +1,34 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Behdad Esfahbod <behdad@behdad.org> + */ + +#ifndef _CAIRO_BOILERPLATE_SCALED_FONT_H_ +#define _CAIRO_BOILERPLATE_SCALED_FONT_H_ + +void +cairo_boilerplate_scaled_font_set_max_glyphs_cached (cairo_scaled_font_t *scaled_font, + int max_glyphs); + +#endif diff --git a/boilerplate/cairo-boilerplate-script.c b/boilerplate/cairo-boilerplate-script.c new file mode 100644 index 000000000..da8ae3bbd --- /dev/null +++ b/boilerplate/cairo-boilerplate-script.c @@ -0,0 +1,141 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson <chris@chris-wilson.co.uk> + */ + +#include "cairo-boilerplate-private.h" + +#include "cairo-script.h" + +static cairo_user_data_key_t script_closure_key; + +typedef struct _script_target_closure { + char *filename; + double width; + double height; +} script_target_closure_t; + +static cairo_surface_t * +_cairo_boilerplate_script_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + script_target_closure_t *ptc; + cairo_device_t *ctx; + cairo_surface_t *surface; + cairo_status_t status; + + *closure = ptc = xmalloc (sizeof (script_target_closure_t)); + + ptc->width = width; + ptc->height = height; + + xasprintf (&ptc->filename, "%s.out.cs", name); + xunlink (ptc->filename); + + ctx = cairo_script_create (ptc->filename); + surface = cairo_script_surface_create (ctx, content, width, height); + cairo_device_destroy (ctx); + + status = cairo_surface_set_user_data (surface, + &script_closure_key, ptc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + surface = cairo_boilerplate_surface_create_in_error (status); + + free (ptc->filename); + free (ptc); + return surface; +} + +static cairo_status_t +_cairo_boilerplate_script_finish_surface (cairo_surface_t *surface) +{ + cairo_surface_finish (surface); + return cairo_surface_status (surface); +} + +static cairo_status_t +_cairo_boilerplate_script_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + return CAIRO_STATUS_WRITE_ERROR; +} + +static cairo_surface_t * +_cairo_boilerplate_script_convert_to_image (cairo_surface_t *surface, + int page) +{ + script_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &script_closure_key); + return cairo_boilerplate_convert_to_image (ptc->filename, page); +} + +static cairo_surface_t * +_cairo_boilerplate_script_get_image_surface (cairo_surface_t *surface, + int page, + int width, + int height) +{ + cairo_surface_t *image; + + image = _cairo_boilerplate_script_convert_to_image (surface, page); + cairo_surface_set_device_offset (image, + cairo_image_surface_get_width (image) - width, + cairo_image_surface_get_height (image) - height); + surface = _cairo_boilerplate_get_image_surface (image, 0, width, height); + cairo_surface_destroy (image); + + return surface; +} + +static void +_cairo_boilerplate_script_cleanup (void *closure) +{ + script_target_closure_t *ptc = closure; + free (ptc->filename); + free (ptc); +} + +static const cairo_boilerplate_target_t target[] = {{ + "script", "script", ".cs", NULL, + CAIRO_SURFACE_TYPE_SCRIPT, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_script_surface_create", + _cairo_boilerplate_script_create_surface, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_script_finish_surface, + _cairo_boilerplate_script_get_image_surface, + _cairo_boilerplate_script_surface_write_to_png, + _cairo_boilerplate_script_cleanup, + NULL, NULL, FALSE, FALSE, FALSE +}}; +CAIRO_BOILERPLATE (script, target) diff --git a/boilerplate/cairo-boilerplate-skia.c b/boilerplate/cairo-boilerplate-skia.c new file mode 100644 index 000000000..c06e7f054 --- /dev/null +++ b/boilerplate/cairo-boilerplate-skia.c @@ -0,0 +1,55 @@ + +#include "cairo-boilerplate-private.h" + +#include <cairo-skia.h> + +static cairo_surface_t * +_cairo_boilerplate_skia_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_format_t format; + + *closure = NULL; + + if (content == CAIRO_CONTENT_COLOR_ALPHA) { + format = CAIRO_FORMAT_ARGB32; + } else if (content == CAIRO_CONTENT_COLOR) { + format = CAIRO_FORMAT_RGB24; + } else { + return NULL; + } + + return cairo_skia_surface_create (format, width, height); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "skia", "skia", NULL, NULL, + CAIRO_SURFACE_TYPE_SKIA, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_skia_surface_create", + _cairo_boilerplate_skia_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + { + "skia", "skia", NULL, NULL, + CAIRO_SURFACE_TYPE_SKIA, CAIRO_CONTENT_COLOR, 0, + "cairo_skia_surface_create", + _cairo_boilerplate_skia_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (skia, targets) diff --git a/boilerplate/cairo-boilerplate-svg.c b/boilerplate/cairo-boilerplate-svg.c new file mode 100644 index 000000000..797106ea6 --- /dev/null +++ b/boilerplate/cairo-boilerplate-svg.c @@ -0,0 +1,344 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" + +#if CAIRO_CAN_TEST_SVG_SURFACE + +#include <cairo-svg.h> +#include <cairo-svg-surface-private.h> +#include <cairo-paginated-surface-private.h> + +#if HAVE_SIGNAL_H +#include <stdlib.h> +#include <signal.h> +#endif + +#if HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif + +#if ! CAIRO_HAS_RECORDING_SURFACE +#define CAIRO_SURFACE_TYPE_RECORDING CAIRO_INTERNAL_SURFACE_TYPE_RECORDING +#endif + +static const cairo_user_data_key_t svg_closure_key; + +typedef struct _svg_target_closure { + char *filename; + int width, height; + cairo_surface_t *target; +} svg_target_closure_t; + +static cairo_surface_t * +_cairo_boilerplate_svg_create_surface (const char *name, + cairo_content_t content, + cairo_svg_version_t version, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + svg_target_closure_t *ptc; + cairo_surface_t *surface; + cairo_status_t status; + + *closure = ptc = xmalloc (sizeof (svg_target_closure_t)); + + ptc->width = ceil (width); + ptc->height = ceil (height); + + xasprintf (&ptc->filename, "%s.out.svg", name); + xunlink (ptc->filename); + + surface = cairo_svg_surface_create (ptc->filename, width, height); + if (cairo_surface_status (surface)) + goto CLEANUP_FILENAME; + + cairo_svg_surface_restrict_to_version (surface, version); + cairo_surface_set_fallback_resolution (surface, 72., 72.); + + if (content == CAIRO_CONTENT_COLOR) { + ptc->target = surface; + surface = cairo_surface_create_similar (ptc->target, + CAIRO_CONTENT_COLOR, + ptc->width, ptc->height); + if (cairo_surface_status (surface)) + goto CLEANUP_TARGET; + } else + ptc->target = NULL; + + status = cairo_surface_set_user_data (surface, &svg_closure_key, ptc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + surface = cairo_boilerplate_surface_create_in_error (status); + + CLEANUP_TARGET: + cairo_surface_destroy (ptc->target); + CLEANUP_FILENAME: + free (ptc->filename); + free (ptc); + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_svg11_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + /* current default, but be explicit in case the default changes */ + return _cairo_boilerplate_svg_create_surface (name, content, + CAIRO_SVG_VERSION_1_1, + width, height, + max_width, max_height, + mode, + closure); +} + +static cairo_surface_t * +_cairo_boilerplate_svg12_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + return _cairo_boilerplate_svg_create_surface (name, content, + CAIRO_SVG_VERSION_1_2, + width, height, + max_width, max_height, + mode, + closure); +} + +static cairo_status_t +_cairo_boilerplate_svg_finish_surface (cairo_surface_t *surface) +{ + svg_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &svg_closure_key); + cairo_status_t status; + + /* Both surface and ptc->target were originally created at the + * same dimensions. We want a 1:1 copy here, so we first clear any + * device offset on surface. + * + * In a more realistic use case of device offsets, the target of + * this copying would be of a different size than the source, and + * the offset would be desirable during the copy operation. */ + cairo_surface_set_device_offset (surface, 0, 0); + + if (ptc->target) { + cairo_t *cr; + cr = cairo_create (ptc->target); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_show_page (cr); + status = cairo_status (cr); + cairo_destroy (cr); + + if (status) + return status; + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status) + return status; + + surface = ptc->target; + } + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_boilerplate_svg_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + svg_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &svg_closure_key); + char command[4096]; + int exitstatus; + + sprintf (command, "./svg2png %s %s", + ptc->filename, filename); + + exitstatus = system (command); +#if _XOPEN_SOURCE && HAVE_SIGNAL_H + if (WIFSIGNALED (exitstatus)) + raise (WTERMSIG (exitstatus)); +#endif + if (exitstatus) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_boilerplate_svg_convert_to_image (cairo_surface_t *surface) +{ + svg_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &svg_closure_key); + + return cairo_boilerplate_convert_to_image (ptc->filename, 0); +} + +static cairo_surface_t * +_cairo_boilerplate_svg_get_image_surface (cairo_surface_t *surface, + int page, + int width, + int height) +{ + cairo_surface_t *image; + + if (page != 0) + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + image = _cairo_boilerplate_svg_convert_to_image (surface); + cairo_surface_set_device_offset (image, + cairo_image_surface_get_width (image) - width, + cairo_image_surface_get_height (image) - height); + surface = _cairo_boilerplate_get_image_surface (image, 0, width, height); + cairo_surface_destroy (image); + + return surface; +} + +static void +_cairo_boilerplate_svg_cleanup (void *closure) +{ + svg_target_closure_t *ptc = closure; + if (ptc->target != NULL) { + cairo_surface_finish (ptc->target); + cairo_surface_destroy (ptc->target); + } + free (ptc->filename); + free (ptc); +} + +static void +_cairo_boilerplate_svg_force_fallbacks (cairo_surface_t *abstract_surface, + double x_pixels_per_inch, + double y_pixels_per_inch) +{ + svg_target_closure_t *ptc = cairo_surface_get_user_data (abstract_surface, + &svg_closure_key); + + cairo_paginated_surface_t *paginated; + cairo_svg_surface_t *surface; + + if (ptc->target) + abstract_surface = ptc->target; + + paginated = (cairo_paginated_surface_t*) abstract_surface; + surface = (cairo_svg_surface_t*) paginated->target; + surface->force_fallbacks = TRUE; + cairo_surface_set_fallback_resolution (&paginated->base, + x_pixels_per_inch, + y_pixels_per_inch); +} + +static const cairo_boilerplate_target_t targets[] = { + /* It seems we should be able to round-trip SVG content perfectly + * through librsvg and cairo, but for some mysterious reason, some + * systems get an error of 1 for some pixels on some of the text + * tests. XXX: I'd still like to chase these down at some point. + * For now just set the svg error tolerance to 1. */ + { + "svg11", "svg", ".svg", NULL, + CAIRO_SURFACE_TYPE_SVG, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_svg_surface_create", + _cairo_boilerplate_svg11_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_svg_force_fallbacks, + _cairo_boilerplate_svg_finish_surface, + _cairo_boilerplate_svg_get_image_surface, + _cairo_boilerplate_svg_surface_write_to_png, + _cairo_boilerplate_svg_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "svg11", "svg", ".svg", NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 1, + "cairo_svg_surface_create", + _cairo_boilerplate_svg11_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_svg_force_fallbacks, + _cairo_boilerplate_svg_finish_surface, + _cairo_boilerplate_svg_get_image_surface, + _cairo_boilerplate_svg_surface_write_to_png, + _cairo_boilerplate_svg_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "svg12", "svg", ".svg", NULL, + CAIRO_SURFACE_TYPE_SVG, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_svg_surface_create", + _cairo_boilerplate_svg12_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_svg_force_fallbacks, + _cairo_boilerplate_svg_finish_surface, + _cairo_boilerplate_svg_get_image_surface, + _cairo_boilerplate_svg_surface_write_to_png, + _cairo_boilerplate_svg_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "svg12", "svg", ".svg", NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 1, + "cairo_svg_surface_create", + _cairo_boilerplate_svg12_create_surface, + cairo_surface_create_similar, + _cairo_boilerplate_svg_force_fallbacks, + _cairo_boilerplate_svg_finish_surface, + _cairo_boilerplate_svg_get_image_surface, + _cairo_boilerplate_svg_surface_write_to_png, + _cairo_boilerplate_svg_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, +}; +CAIRO_BOILERPLATE (svg, targets) + +#else + +CAIRO_NO_BOILERPLATE (svg) + +#endif diff --git a/boilerplate/cairo-boilerplate-system.c b/boilerplate/cairo-boilerplate-system.c new file mode 100644 index 000000000..ec23341a4 --- /dev/null +++ b/boilerplate/cairo-boilerplate-system.c @@ -0,0 +1,166 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#define _GNU_SOURCE 1 /* for vasprintf */ + +#include "cairo-boilerplate.h" +#include "cairo-boilerplate-system.h" + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <errno.h> + +void * +xmalloc (size_t size) +{ + void *buf; + + if (size == 0) + return NULL; + + buf = malloc (size); + if (buf == NULL) { + fprintf (stderr, "Error: Out of memory. Exiting.\n"); + exit (1); + } + + return buf; +} + +void * +xcalloc (size_t nmemb, + size_t size) +{ + void *buf; + + if (nmemb == 0 || size == 0) + return NULL; + + buf = calloc (nmemb, size); + if (buf == NULL) { + fprintf (stderr, "Error: Out of memory. Exiting\n"); + exit (1); + } + + return buf; +} + +void * +xrealloc (void *buf, + size_t size) +{ + buf = realloc (buf, size); + if (buf == NULL && size != 0) { + fprintf (stderr, "Error: Out of memory. Exiting\n"); + exit (1); + } + + return buf; +} + +void +xasprintf (char **strp, + const char *fmt, + ...) +{ +#ifdef HAVE_VASPRINTF + va_list va; + int ret; + + va_start (va, fmt); + ret = vasprintf (strp, fmt, va); + va_end (va); + + if (ret < 0) { + fprintf (stderr, "Error: Out of memory. Exiting.\n"); + exit (1); + } +#else /* !HAVE_VASNPRINTF */ +#define BUF_SIZE 1024 + va_list va; + char buffer[BUF_SIZE]; + int ret, len; + + va_start (va, fmt); + ret = vsnprintf (buffer, sizeof (buffer), fmt, va); + va_end (va); + + if (ret < 0) { + fprintf (stderr, "Failure in vsnprintf\n"); + exit (1); + } + + len = (ret + sizeof (int)) & -sizeof (int); + *strp = malloc (len); + if (*strp == NULL) { + fprintf (stderr, "Out of memory\n"); + exit (1); + } + + if ((unsigned) ret < sizeof (buffer)) { + memcpy (*strp, buffer, ret); + } else { + va_start (va, fmt); + ret = vsnprintf (*strp, len, fmt, va); + va_end (va); + + if (ret >= len) { + free (*strp); + fprintf (stderr, "Overflowed dynamic buffer\n"); + exit (1); + } + } + memset (*strp + ret, 0, len-ret); +#endif /* !HAVE_VASNPRINTF */ +} + +void +xunlink (const char *pathname) +{ + if (unlink (pathname) < 0 && errno != ENOENT) { + fprintf (stderr, "Error: Cannot remove %s: %s\n", + pathname, strerror (errno)); + exit (1); + } +} + +char * +xstrdup (const char *str) +{ + if (str == NULL) + return NULL; + + str = strdup (str); + if (str == NULL) { + fprintf (stderr, "Error: Out of memory. Exiting.\n"); + exit (1); + } + + return (char *) str; +} diff --git a/boilerplate/cairo-boilerplate-system.h b/boilerplate/cairo-boilerplate-system.h new file mode 100644 index 000000000..28165671b --- /dev/null +++ b/boilerplate/cairo-boilerplate-system.h @@ -0,0 +1,59 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#ifndef _XMALLOC_H_ +#define _XMALLOC_H_ + +#include "cairo-boilerplate.h" + +#define xmalloc cairo_boilerplate_xmalloc +void * +xmalloc (size_t size); + +#define xcalloc cairo_boilerplate_xcalloc +void * +xcalloc (size_t nmemb, + size_t size); + +#define xrealloc cairo_boilerplate_xrealloc +void * +xrealloc (void *buf, + size_t size); + +#define xasprintf cairo_boilerplate_xasprintf +void +xasprintf (char **strp, + const char *fmt, + ...) CAIRO_BOILERPLATE_PRINTF_FORMAT(2, 3); + +#define xunlink cairo_boilerplate_xunlink +void +xunlink (const char *path); + +#define xstrdup cairo_boilerplate_xstrdup +char * +xstrdup (const char *str); + +#endif diff --git a/boilerplate/cairo-boilerplate-test-surfaces.c b/boilerplate/cairo-boilerplate-test-surfaces.c new file mode 100644 index 000000000..293b77fff --- /dev/null +++ b/boilerplate/cairo-boilerplate-test-surfaces.c @@ -0,0 +1,462 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "../cairo-version.h" + +#include "cairo-boilerplate-private.h" + +#include <cairo-types-private.h> + +#include <test-compositor-surface.h> +#include <test-null-compositor-surface.h> +#if CAIRO_HAS_TEST_PAGINATED_SURFACE +#include <test-paginated-surface.h> +#endif + +static cairo_surface_t * +_cairo_boilerplate_test_base_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_base_compositor_surface_create (content, ceil (width), ceil (height)); +} + + +static cairo_surface_t * +_cairo_boilerplate_test_fallback_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_fallback_compositor_surface_create (content, ceil (width), ceil (height)); +} + +static cairo_surface_t * +_cairo_boilerplate_test_mask_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_mask_compositor_surface_create (content, ceil (width), ceil (height)); +} + + +static cairo_surface_t * +_cairo_boilerplate_test_traps_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_traps_compositor_surface_create (content, ceil (width), ceil (height)); +} + +static cairo_surface_t * +_cairo_boilerplate_test_spans_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + return _cairo_test_spans_compositor_surface_create (content, ceil (width), ceil (height)); +} + +static cairo_surface_t * +_cairo_boilerplate_test_no_fallback_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + return NULL; + + *closure = NULL; + return _cairo_test_no_fallback_compositor_surface_create (content, ceil (width), ceil (height)); +} + +static cairo_surface_t * +_cairo_boilerplate_test_no_traps_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + return NULL; + + *closure = NULL; + return _cairo_test_no_traps_compositor_surface_create (content, ceil (width), ceil (height)); +} + +static cairo_surface_t * +_cairo_boilerplate_test_no_spans_compositor_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + return NULL; + + *closure = NULL; + return _cairo_test_no_spans_compositor_surface_create (content, ceil (width), ceil (height)); +} + +#if CAIRO_HAS_TEST_PAGINATED_SURFACE +static const cairo_user_data_key_t test_paginated_closure_key; + +typedef struct { + cairo_surface_t *target; +} test_paginated_closure_t; + +static cairo_surface_t * +_cairo_boilerplate_test_paginated_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + test_paginated_closure_t *tpc; + cairo_format_t format; + cairo_surface_t *surface; + cairo_status_t status; + + *closure = tpc = xmalloc (sizeof (test_paginated_closure_t)); + + format = cairo_boilerplate_format_from_content (content); + tpc->target = cairo_image_surface_create (format, + ceil (width), ceil (height)); + + surface = _cairo_test_paginated_surface_create (tpc->target); + if (cairo_surface_status (surface)) + goto CLEANUP; + + status = cairo_surface_set_user_data (surface, + &test_paginated_closure_key, + tpc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + surface = cairo_boilerplate_surface_create_in_error (status); + + cairo_surface_destroy (tpc->target); + + CLEANUP: + free (tpc); + return surface; +} + +/* The only reason we go through all these machinations to write a PNG + * image is to _really ensure_ that the data actually landed in our + * buffer through the paginated surface to the test_paginated_surface. + * + * If we didn't implement this function then the default + * cairo_surface_write_to_png would result in the paginated_surface's + * acquire_source_image function replaying the recording-surface to an + * intermediate image surface. And in that case the + * test_paginated_surface would not be involved and wouldn't be + * tested. + */ +static cairo_status_t +_cairo_boilerplate_test_paginated_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + test_paginated_closure_t *tpc; + cairo_status_t status; + + /* show page first. the automatic show_page is too late for us */ + cairo_surface_show_page (surface); + status = cairo_surface_status (surface); + if (status) + return status; + + tpc = cairo_surface_get_user_data (surface, &test_paginated_closure_key); + return cairo_surface_write_to_png (tpc->target, filename); +} + +static cairo_surface_t * +_cairo_boilerplate_test_paginated_get_image_surface (cairo_surface_t *surface, + int page, + int width, + int height) +{ + test_paginated_closure_t *tpc; + cairo_status_t status; + + /* XXX separate finish as per PDF */ + if (page != 0) + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + /* show page first. the automatic show_page is too late for us */ + cairo_surface_show_page (surface); + status = cairo_surface_status (surface); + if (status) + return cairo_boilerplate_surface_create_in_error (status); + + tpc = cairo_surface_get_user_data (surface, &test_paginated_closure_key); + return _cairo_boilerplate_get_image_surface (tpc->target, 0, width, height); +} + +static void +_cairo_boilerplate_test_paginated_cleanup (void *closure) +{ + test_paginated_closure_t *tpc = closure; + + cairo_surface_destroy (tpc->target); + free (tpc); +} +#endif + +static const cairo_boilerplate_target_t targets[] = { + { + "test-base", "base", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_base_compositor_surface_create", + _cairo_boilerplate_test_base_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + { + "test-base", "base", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR, 0, + "_cairo_test_base_compositor_surface_create", + _cairo_boilerplate_test_base_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + + { + "test-fallback", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_fallback_compositor_surface_create", + _cairo_boilerplate_test_fallback_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + { + "test-fallback", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR, 0, + "_cairo_test_fallback_compositor_surface_create", + _cairo_boilerplate_test_fallback_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + + { + "test-mask", "mask", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_mask_compositor_surface_create", + _cairo_boilerplate_test_mask_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + { + "test-mask", "mask", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR, 0, + "_cairo_test_mask_compositor_surface_create", + _cairo_boilerplate_test_mask_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + + { + "test-traps", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_traps_compositor_surface_create", + _cairo_boilerplate_test_traps_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + { + "test-traps", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR, 0, + "_cairo_test_traps_compositor_surface_create", + _cairo_boilerplate_test_traps_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + + { + "test-spans", "spans", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_spans_compositor_surface_create", + _cairo_boilerplate_test_spans_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + { + "test-spans", "spans", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR, 0, + "_cairo_test_spans_compositor_surface_create", + _cairo_boilerplate_test_spans_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + + { + "no-fallback", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_no_fallback_compositor_surface_create", + _cairo_boilerplate_test_no_fallback_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, + { + "no-traps", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_no_traps_compositor_surface_create", + _cairo_boilerplate_test_no_traps_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + { + "no-spans", "spans", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_no_spans_compositor_surface_create", + _cairo_boilerplate_test_no_spans_compositor_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, +#if CAIRO_HAS_TEST_PAGINATED_SURFACE + { + "test-paginated", "image", NULL, NULL, + CAIRO_INTERNAL_SURFACE_TYPE_TEST_PAGINATED, + CAIRO_CONTENT_COLOR_ALPHA, 0, + "_cairo_test_paginated_surface_create", + _cairo_boilerplate_test_paginated_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_test_paginated_get_image_surface, + _cairo_boilerplate_test_paginated_surface_write_to_png, + _cairo_boilerplate_test_paginated_cleanup, + NULL, NULL, FALSE, TRUE, FALSE + }, + { + "test-paginated", "image", NULL, NULL, + CAIRO_INTERNAL_SURFACE_TYPE_TEST_PAGINATED, + CAIRO_CONTENT_COLOR, 0, + "_cairo_test_paginated_surface_create", + _cairo_boilerplate_test_paginated_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_test_paginated_get_image_surface, + _cairo_boilerplate_test_paginated_surface_write_to_png, + _cairo_boilerplate_test_paginated_cleanup, + NULL, NULL, FALSE, TRUE, FALSE + }, +#endif +}; +CAIRO_BOILERPLATE (test, targets) diff --git a/boilerplate/cairo-boilerplate-vg.c b/boilerplate/cairo-boilerplate-vg.c new file mode 100644 index 000000000..692765745 --- /dev/null +++ b/boilerplate/cairo-boilerplate-vg.c @@ -0,0 +1,363 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-vg.h> + + /* XXX Not sure how to handle library specific context initialization */ +//#define USE_SHIVA +//#define USE_AMANITH + +#if CAIRO_HAS_GLX_FUNCTIONS + +#include <X11/Xlib.h> +#include <GL/glx.h> + +typedef struct _vg_closure { + Display *dpy; + int screen; + Window win; + + GLXContext ctx; + cairo_surface_t *surface; +} vg_closure_glx_t; + +static void +_cairo_boilerplate_vg_cleanup_glx (void *closure) +{ + vg_closure_glx_t *vgc = closure; + +#ifdef USE_AMANITH + vgDestroyContextAM (); +#endif +#ifdef USE_SHIVA + vgDestroyContextSH (); +#endif + + glXDestroyContext (vgc->dpy, vgc->ctx); + XDestroyWindow (vgc->dpy, vgc->win); + XCloseDisplay (vgc->dpy); + free (vgc); +} + +static cairo_surface_t * +_cairo_boilerplate_vg_create_surface_glx (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + int rgba_attribs[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_NONE + }; + int rgb_attribs[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_NONE + }; + XVisualInfo *vi; + Display *dpy; + Colormap cmap; + XSetWindowAttributes swa; + cairo_surface_t *surface; + cairo_vg_context_t *context; + vg_closure_glx_t *vgc; + + vgc = malloc (sizeof (vg_closure_glx_t)); + *closure = vgc; + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + dpy = XOpenDisplay (NULL); + vgc->dpy = dpy; + if (vgc->dpy == NULL) { + fprintf (stderr, "Failed to open display: %s\n", XDisplayName(0)); + free (vgc); + return NULL; + } + + if (content == CAIRO_CONTENT_COLOR) + vi = glXChooseVisual (dpy, DefaultScreen (dpy), rgb_attribs); + else + vi = glXChooseVisual (dpy, DefaultScreen (dpy), rgba_attribs); + + if (vi == NULL) { + fprintf (stderr, "Failed to create RGB, double-buffered visual\n"); + XCloseDisplay (dpy); + free (vgc); + return NULL; + } + + vgc->ctx = glXCreateContext (dpy, vi, NULL, True); + cmap = XCreateColormap (dpy, + RootWindow (dpy, vi->screen), + vi->visual, + AllocNone); + swa.colormap = cmap; + swa.border_pixel = 0; + vgc->win = XCreateWindow (dpy, RootWindow (dpy, vi->screen), + -1, -1, 1, 1, 0, + vi->depth, + InputOutput, + vi->visual, + CWBorderPixel | CWColormap, &swa); + XFreeColormap (dpy, cmap); + XFree (vi); + + XMapWindow (dpy, vgc->win); + + /* we need an active context to initialise VG */ + glXMakeContextCurrent (dpy, vgc->win, vgc->win, vgc->ctx); + +#ifdef USE_AMANITH + vgInitContextAM (width, height, VG_FALSE, VG_TRUE); +#endif +#ifdef USE_SHIVA + vgCreateContextSH (width, height); +#endif + + context = cairo_vg_context_create_for_glx (dpy, vgc->ctx); + vgc->surface = cairo_vg_surface_create (context, content, width, height); + cairo_vg_context_destroy (context); + + surface = vgc->surface; + if (cairo_surface_status (surface)) + _cairo_boilerplate_vg_cleanup_glx (vgc); + + return surface; +} +#endif + +#if CAIRO_HAS_EGL_FUNCTIONS +typedef struct _vg_closure_egl { + EGLDisplay *dpy; + EGLContext *ctx; + EGLSurface *dummy; +} vg_closure_egl_t; + +static void +_cairo_boilerplate_vg_cleanup_egl (void *closure) +{ + vg_closure_egl_t *vgc = closure; + +#ifdef USE_AMANITH + vgDestroyContextAM (); +#endif +#ifdef USE_SHIVA + vgDestroyContextSH (); +#endif + + eglDestroyContext (vgc->dpy, vgc->ctx); + eglDestroySurface (vgc->dpy, vgc->dummy); + eglTerminate (vgc->dpy); + free (vgc); +} + +static cairo_surface_t * +_cairo_boilerplate_vg_create_surface_egl (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + int rgba_attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT, + EGL_NONE + }; + int rgb_attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE_BIT, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT, + EGL_NONE + }; + int dummy_attribs[] = { + EGL_WIDTH, 8, EGL_HEIGHT, 8, + EGL_NONE + }; + EGLDisplay *dpy; + int major, minor; + EGLConfig config; + int num_configs; + EGLContext *egl_context; + EGLSurface *dummy; + cairo_vg_context_t *context; + cairo_surface_t *surface; + vg_closure_egl_t *vgc; + + dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); + + if (! eglInitialize (dpy, &major, &minor)) + return NULL; + + eglBindAPI (EGL_OPENVG_API); + + if (! eglChooseConfig (dpy, + content == CAIRO_CONTENT_COLOR_ALPHA ? + rgba_attribs : rgb_attribs, + &config, 1, &num_configs) || + num_configs != 1) + { + return NULL; + } + + egl_context = eglCreateContext (dpy, config, NULL, NULL); + if (egl_context == NULL) + return NULL; + + /* Create a dummy surface in order to enable a context to initialise VG */ + dummy = eglCreatePbufferSurface (dpy, config, dummy_attribs); + if (dummy == NULL) + return NULL; + if (! eglMakeCurrent (dpy, dummy, dummy, egl_context)) + return NULL; + +#ifdef USE_AMANITH + vgInitContextAM (width, height, VG_FALSE, VG_TRUE); +#endif +#ifdef USE_SHIVA + vgCreateContextSH (width, height); +#endif + + vgc = xmalloc (sizeof (vg_closure_egl_t)); + vgc->dpy = dpy; + vgc->ctx = egl_context; + vgc->dummy = dummy; + *closure = vgc; + + context = cairo_vg_context_create_for_egl (vgc->dpy, vgc->ctx); + surface = cairo_vg_surface_create (context, content, width, height); + cairo_vg_context_destroy (context); + + if (cairo_surface_status (surface)) + _cairo_boilerplate_vg_cleanup_egl (vgc); + + return surface; +} +#endif + +static void +_cairo_boilerplate_vg_synchronize (void *closure) +{ + vgFinish (); +} + +static const cairo_boilerplate_target_t targets[] = { +#if CAIRO_HAS_GLX_FUNCTIONS + { + "vg-glx", "vg", NULL, NULL, + CAIRO_SURFACE_TYPE_VG, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_vg_context_create_for_glx", + _cairo_boilerplate_vg_create_surface_glx, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_vg_cleanup_glx, + _cairo_boilerplate_vg_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "vg-glx", "vg", NULL, NULL, + CAIRO_SURFACE_TYPE_VG, CAIRO_CONTENT_COLOR, 1, + "cairo_vg_context_create_for_glx", + _cairo_boilerplate_vg_create_surface_glx, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_vg_cleanup_glx, + _cairo_boilerplate_vg_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +#endif +#if CAIRO_HAS_EGL_FUNCTIONS + { + "vg-egl", "vg", NULL, NULL, + CAIRO_SURFACE_TYPE_VG, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_vg_context_create_for_egl", + _cairo_boilerplate_vg_create_surface_egl, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_vg_cleanup_egl, + _cairo_boilerplate_vg_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "vg-egl", "vg", NULL, NULL, + CAIRO_SURFACE_TYPE_VG, CAIRO_CONTENT_COLOR, 1, + "cairo_vg_context_create_for_egl", + _cairo_boilerplate_vg_create_surface_egl, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_vg_cleanup_egl, + _cairo_boilerplate_vg_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +#endif +}; +CAIRO_BOILERPLATE (vg, targets) diff --git a/boilerplate/cairo-boilerplate-wgl.c b/boilerplate/cairo-boilerplate-wgl.c new file mode 100644 index 000000000..908817788 --- /dev/null +++ b/boilerplate/cairo-boilerplate-wgl.c @@ -0,0 +1,239 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Zoxc <zoxc32@gmail.com> + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-gl.h> + +static const cairo_user_data_key_t gl_closure_key; + +typedef struct _wgl_target_closure { + HWND wnd; + HDC dc; + HGLRC rc; + cairo_device_t *device; + cairo_surface_t *surface; +} wgl_target_closure_t; + +static void +_cairo_boilerplate_wgl_cleanup (void *closure) +{ + wgl_target_closure_t *wgltc = closure; + + cairo_device_finish (wgltc->device); + cairo_device_destroy (wgltc->device); + + wglDeleteContext(wgltc->rc); + + ReleaseDC(wgltc->wnd, wgltc->dc); + DestroyWindow (wgltc->wnd); + + free (wgltc); +} + +static void +_cairo_boilerplate_wgl_create_window (int width, + int height, + wgl_target_closure_t *wgltc) +{ + WNDCLASSEXA wincl; + PIXELFORMATDESCRIPTOR pfd; + int format; + cairo_surface_t *surface; + + ZeroMemory (&wincl, sizeof (WNDCLASSEXA)); + wincl.cbSize = sizeof (WNDCLASSEXA); + wincl.hInstance = GetModuleHandle (0); + wincl.lpszClassName = "cairo_boilerplate_wgl_dummy"; + wincl.lpfnWndProc = DefWindowProcA; + wincl.style = CS_OWNDC; + + RegisterClassExA (&wincl); + + wgltc->wnd = CreateWindow ("cairo_boilerplate_wgl_dummy", 0, WS_POPUP, 0, 0, width, height, 0, 0, 0, 0); + wgltc->dc = GetDC (wgltc->wnd); + + ZeroMemory (&pfd, sizeof (PIXELFORMATDESCRIPTOR)); + pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 16; + pfd.iLayerType = PFD_MAIN_PLANE; + + format = ChoosePixelFormat (wgltc->dc, &pfd); + SetPixelFormat (wgltc->dc, format, &pfd); + + wgltc->rc = wglCreateContext (wgltc->dc); + wgltc->device = cairo_wgl_device_create (wgltc->rc); +} + +static cairo_surface_t * +_cairo_boilerplate_wgl_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + wgl_target_closure_t *wgltc; + cairo_surface_t *surface; + + wgltc = calloc (1, sizeof (wgl_target_closure_t)); + + *closure = wgltc; + + _cairo_boilerplate_wgl_create_window(0, 0, wgltc); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + wgltc->surface = surface = cairo_gl_surface_create (wgltc->device, + content, + ceil (width), + ceil (height)); + if (cairo_surface_status (surface)) { + _cairo_boilerplate_wgl_cleanup (wgltc); + return NULL; + } + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_wgl_for_create_window (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + wgl_target_closure_t *wgltc; + cairo_surface_t *surface; + + wgltc = calloc (1, sizeof (wgl_target_closure_t)); + + *closure = wgltc; + + _cairo_boilerplate_wgl_create_window(width, height, wgltc); + + wgltc->surface = surface = cairo_gl_surface_create_for_dc (wgltc->device, + wgltc->dc, + ceil (width), + ceil (height)); + + if (cairo_surface_status (surface)) { + _cairo_boilerplate_wgl_cleanup (wgltc); + return NULL; + } + + return surface; +} + +static cairo_status_t +_cairo_boilerplate_wgl_finish_window (cairo_surface_t *surface) +{ + wgl_target_closure_t *wgltc = cairo_surface_get_user_data (surface, + &gl_closure_key); + + if (wgltc != NULL && wgltc->surface != NULL) { + cairo_t *cr; + + cr = cairo_create (wgltc->surface); + cairo_surface_set_device_offset (surface, 0, 0); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_destroy (cr); + + surface = wgltc->surface; + } + + cairo_gl_surface_swapbuffers (surface); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_boilerplate_wgl_synchronize (void *closure) +{ + wgl_target_closure_t *wgltc = closure; + + if (cairo_device_acquire (wgltc->device)) + return; + + glFinish (); + + cairo_device_release (wgltc->device); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "gl", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_gl_surface_create", + _cairo_boilerplate_wgl_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_wgl_cleanup, + _cairo_boilerplate_wgl_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "gl-dc", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_gl_surface_create_for_dc", + _cairo_boilerplate_wgl_for_create_window, + NULL, + _cairo_boilerplate_wgl_finish_window, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_wgl_cleanup, + _cairo_boilerplate_wgl_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +}; + +CAIRO_BOILERPLATE (wgl, targets) diff --git a/boilerplate/cairo-boilerplate-win32-printing.c b/boilerplate/cairo-boilerplate-win32-printing.c new file mode 100644 index 000000000..625d52c53 --- /dev/null +++ b/boilerplate/cairo-boilerplate-win32-printing.c @@ -0,0 +1,407 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * Copyright © 2007, Adrian Johnson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Carl D. Worth <cworth@cworth.org> + * Adrian Johnson <ajohnson@redneon.com> + */ + +/* We require Windows 2000 features such as GetDefaultPrinter() */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairo-boilerplate-private.h" + +#if CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE + +#include <cairo-win32.h> +#include <cairo-paginated-surface-private.h> + +#include <windows.h> + +#if !defined(POSTSCRIPT_IDENTIFY) +# define POSTSCRIPT_IDENTIFY 0x1015 +#endif + +#if !defined(PSIDENT_GDICENTRIC) +# define PSIDENT_GDICENTRIC 0x0000 +#endif + +#if !defined(GET_PS_FEATURESETTING) +# define GET_PS_FEATURESETTING 0x1019 +#endif + +#if !defined(FEATURESETTING_PSLEVEL) +# define FEATURESETTING_PSLEVEL 0x0002 +#endif + +static cairo_status_t +_cairo_win32_print_gdi_error (const char *context) +{ + void *lpMsgBuf; + DWORD last_error = GetLastError (); + + if (!FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + last_error, + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR) &lpMsgBuf, + 0, NULL)) { + fprintf (stderr, "%s: Unknown GDI error", context); + } else { + fprintf (stderr, "%s: %S", context, (wchar_t *)lpMsgBuf); + + LocalFree (lpMsgBuf); + } + + fflush (stderr); + + /* We should switch off of last_status, but we'd either return + * CAIRO_STATUS_NO_MEMORY or CAIRO_STATUS_UNKNOWN_ERROR and there + * is no CAIRO_STATUS_UNKNOWN_ERROR. + */ + return CAIRO_STATUS_NO_MEMORY; +} + +static cairo_user_data_key_t win32_closure_key; + +typedef struct _win32_target_closure { + char *filename; + int width; + int height; + cairo_surface_t *target; + HDC dc; + int left_margin; + int bottom_margin; +} win32_target_closure_t; + +static cairo_bool_t +printer_is_postscript_level_3 (HDC dc) +{ + DWORD word; + INT ps_feature, ps_level; + + word = PSIDENT_GDICENTRIC; + if (ExtEscape (dc, POSTSCRIPT_IDENTIFY, sizeof(DWORD), (char *)&word, 0, (char *)NULL) <= 0) + return FALSE; + + ps_feature = FEATURESETTING_PSLEVEL; + if (ExtEscape (dc, GET_PS_FEATURESETTING, sizeof(INT), + (char *)&ps_feature, sizeof(INT), (char *)&ps_level) <= 0) + return FALSE; + + if (ps_level >= 3) + return TRUE; + + return FALSE; +} + +static void +create_printer_dc (win32_target_closure_t *ptc) +{ + char *printer_name; + DWORD size; + int x_dpi, y_dpi, left_margin, top_margin, page_height, printable_height; + XFORM xform; + + ptc->dc = NULL; + GetDefaultPrinter (NULL, &size); + printer_name = malloc (size); + + if (printer_name == NULL) + return; + + if (GetDefaultPrinter (printer_name, &size) == 0) { + free (printer_name); + return; + } + + /* printf("\nPrinting to : %s\n", printer_name); */ + ptc->dc = CreateDC (NULL, printer_name, NULL, NULL); + free (printer_name); + + if (!printer_is_postscript_level_3 (ptc->dc)) { + printf("The default printer driver must be a color PostScript level 3 printer\n"); + ptc->dc = NULL; + return; + } + + /* The printer device units on win32 are 1 unit == 1 dot and the + * origin is the start of the printable area. We transform the + * cordinate space to 1 unit is 1 point as expected by the + * tests. As the page size is larger than the test surface, the + * origin is translated down so that the each test is drawn at the + * bottom left corner of the page. This is because the bottom left + * corner of the PNG image that ghostscript creates is positioned + * at origin of the PS coordinates (ie the bottom left of the + * page). The left and bottom margins are stored in + * win32_target_closure as size of the PNG image needs to be + * increased because the test output is offset from the bottom + * left by the non printable margins. After the PNG is created the + * margins will be chopped off so the image matches the reference + * image. + */ + printable_height = GetDeviceCaps (ptc->dc, VERTRES); + x_dpi = GetDeviceCaps (ptc->dc, LOGPIXELSX); + y_dpi = GetDeviceCaps (ptc->dc, LOGPIXELSY); + left_margin = GetDeviceCaps (ptc->dc, PHYSICALOFFSETX); + top_margin = GetDeviceCaps (ptc->dc, PHYSICALOFFSETY); + page_height = GetDeviceCaps (ptc->dc, PHYSICALHEIGHT); + + SetGraphicsMode (ptc->dc, GM_ADVANCED); + xform.eM11 = x_dpi/72.0; + xform.eM12 = 0; + xform.eM21 = 0; + xform.eM22 = y_dpi/72.0; + xform.eDx = 0; + xform.eDy = printable_height - ptc->height*y_dpi/72.0; + if (!SetWorldTransform (ptc->dc, &xform)) { + _cairo_win32_print_gdi_error ("cairo-boilerplate-win32-printing:SetWorldTransform"); + return; + } + + ptc->left_margin = 72.0*left_margin/x_dpi; + ptc->bottom_margin = 72.0*(page_height - printable_height - top_margin)/y_dpi; +} + +static cairo_surface_t * +_cairo_boilerplate_win32_printing_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + win32_target_closure_t *ptc; + cairo_surface_t *surface; + DOCINFO di; + + if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED) + content = CAIRO_CONTENT_COLOR_ALPHA; + + *closure = ptc = xmalloc (sizeof (win32_target_closure_t)); + + xasprintf (&ptc->filename, "%s.out.ps", name); + xunlink (ptc->filename); + + memset (&di, 0, sizeof (DOCINFO)); + di.cbSize = sizeof (DOCINFO); + di.lpszDocName = ptc->filename; + di.lpszOutput = ptc->filename; + + ptc->width = width; + ptc->height = height; + + create_printer_dc (ptc); + if (ptc->dc == NULL) { + printf("\nFailed to create printer\n"); + free (ptc->filename); + free (ptc); + return NULL; + } + StartDoc (ptc->dc, &di); + StartPage (ptc->dc); + surface = cairo_win32_printing_surface_create (ptc->dc); + if (cairo_surface_status (surface)) { + free (ptc->filename); + free (ptc); + return NULL; + } + cairo_surface_set_fallback_resolution (surface, 72., 72.); + + if (content == CAIRO_CONTENT_COLOR) { + ptc->target = surface; + surface = cairo_surface_create_similar (ptc->target, + CAIRO_CONTENT_COLOR, + width, height); + } else { + ptc->target = NULL; + } + + if (cairo_surface_set_user_data (surface, + &win32_closure_key, + ptc, + NULL) != CAIRO_STATUS_SUCCESS) { + cairo_surface_destroy (surface); + if (ptc->target != NULL) + cairo_surface_destroy (ptc->target); + free (ptc->filename); + free (ptc); + return NULL; + } + + return surface; +} + +static cairo_status_t +_cairo_boilerplate_win32_printing_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + win32_target_closure_t *ptc = cairo_surface_get_user_data (surface, &win32_closure_key); + char command[4096]; + cairo_surface_t *src_image, *dst_image; + cairo_t *cr; + cairo_status_t status; + + /* Both surface and ptc->target were originally created at the + * same dimensions. We want a 1:1 copy here, so we first clear any + * device offset on surface. + * + * In a more realistic use case of device offsets, the target of + * this copying would be of a different size than the source, and + * the offset would be desirable during the copy operation. */ + cairo_surface_set_device_offset (surface, 0, 0); + + if (ptc->target) { + cairo_t *cr; + cr = cairo_create (ptc->target); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_show_page (cr); + cairo_destroy (cr); + + cairo_surface_finish (surface); + surface = ptc->target; + } + + cairo_surface_finish (surface); + EndPage (ptc->dc); + EndDoc (ptc->dc); + sprintf (command, "gs -q -r72 -g%dx%d -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=%s %s", + ptc->width + ptc->left_margin, ptc->height + ptc->bottom_margin, filename, ptc->filename); + + if (system (command) != 0) + return CAIRO_STATUS_WRITE_ERROR; + + /* Create a new image from the ghostscript image that has the + * left and bottom margins removed */ + + src_image = cairo_image_surface_create_from_png (filename); + status = cairo_surface_status (src_image); + if (status) + return status; + + dst_image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + ptc->width, + ptc->height); + cr = cairo_create (dst_image); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, src_image, -ptc->left_margin, 0); + cairo_paint (cr); + cairo_destroy (cr); + + cairo_surface_write_to_png (dst_image, filename); + status = cairo_surface_status (dst_image); + if (status) + return status; + + cairo_surface_destroy (src_image); + cairo_surface_destroy (dst_image); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_boilerplate_win32_printing_get_image_surface (cairo_surface_t *surface, + int page, + int width, + int height) +{ + win32_target_closure_t *ptc = cairo_surface_get_user_data (surface, + &win32_closure_key); + char *filename; + cairo_status_t status; + + /* XXX test paginated interface */ + if (page != 0) + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + xasprintf (&filename, "%s.png", ptc->filename); + status = _cairo_boilerplate_win32_printing_surface_write_to_png (surface, filename); + if (status) + return cairo_boilerplate_surface_create_in_error (status); + + surface = cairo_boilerplate_get_image_surface_from_png (filename, + width, + height, + ptc->target == NULL); + + remove (filename); + free (filename); + + return surface; +} + +static void +_cairo_boilerplate_win32_printing_cleanup (void *closure) +{ + win32_target_closure_t *ptc = closure; + + if (ptc->target) + cairo_surface_destroy (ptc->target); + free (ptc->filename); + free (ptc); + DeleteDC (ptc->dc); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "win32-printing", "win32", ".ps", NULL, + CAIRO_SURFACE_TYPE_WIN32_PRINTING, + CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED, 0, + "cairo_win32_printing_surface_create", + _cairo_boilerplate_win32_printing_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_win32_printing_get_image_surface, + _cairo_boilerplate_win32_printing_surface_write_to_png, + _cairo_boilerplate_win32_printing_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, + { + "win32-printing", "win32", ".ps", NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 0, + "cairo_win32_printing_surface_create", + _cairo_boilerplate_win32_printing_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_win32_printing_get_image_surface, + _cairo_boilerplate_win32_printing_surface_write_to_png, + _cairo_boilerplate_win32_printing_cleanup, + NULL, NULL, FALSE, TRUE, TRUE + }, +}; +CAIRO_BOILERPLATE (win32_printing, targets) + +#else + +CAIRO_NO_BOILERPLATE (win32_printing) + +#endif diff --git a/boilerplate/cairo-boilerplate-win32.c b/boilerplate/cairo-boilerplate-win32.c new file mode 100644 index 000000000..7469cc749 --- /dev/null +++ b/boilerplate/cairo-boilerplate-win32.c @@ -0,0 +1,77 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-win32.h> + +static cairo_surface_t * +_cairo_boilerplate_win32_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_format_t format; + + format = cairo_boilerplate_format_from_content (content); + + *closure = NULL; + + return cairo_win32_surface_create_with_dib (format, width, height); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "win32", "win32", NULL, NULL, + CAIRO_SURFACE_TYPE_WIN32, CAIRO_CONTENT_COLOR, 0, + "cairo_win32_surface_create_with_dib", + _cairo_boilerplate_win32_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, TRUE, FALSE, FALSE + }, + /* Testing the win32 surface isn't interesting, since for + * ARGB images it just chains to the image backend + */ + { + "win32", "win32", NULL, NULL, + CAIRO_SURFACE_TYPE_WIN32, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_win32_surface_create_with_dib", + _cairo_boilerplate_win32_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, NULL, FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (win32, targets) diff --git a/boilerplate/cairo-boilerplate-xcb.c b/boilerplate/cairo-boilerplate-xcb.c new file mode 100644 index 000000000..cc9b422e9 --- /dev/null +++ b/boilerplate/cairo-boilerplate-xcb.c @@ -0,0 +1,876 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-xcb.h> + +#include <assert.h> + +/* Errors have response_type == 0 */ +#define CAIRO_XCB_ERROR 0 + +static const cairo_user_data_key_t xcb_closure_key; + +typedef struct _xcb_target_closure { + xcb_connection_t *c; + cairo_device_t *device; + uint32_t drawable; + cairo_bool_t is_pixmap; + cairo_surface_t *surface; +} xcb_target_closure_t; + +static cairo_status_t +_cairo_boilerplate_xcb_handle_errors (xcb_target_closure_t *xtc) +{ + xcb_generic_event_t *ev = NULL; + + /* Ignore all MappingNotify events; those might happen without us causing them */ + do { + free(ev); + ev = xcb_poll_for_event(xtc->c); + } while (ev != NULL && ev->response_type == XCB_MAPPING_NOTIFY); + + if (ev != NULL) { + if (ev->response_type == CAIRO_XCB_ERROR) { + xcb_generic_error_t *error = (xcb_generic_error_t *) ev; + + fprintf (stderr, + "Detected error during xcb run: error=%d, " + "seqno=0x%02x, major=%d, minor=%d\n", + error->error_code, error->sequence, + error->major_code, error->minor_code); + } else { + fprintf (stderr, + "Detected unexpected event during xcb run: type=%d, seqno=0x%02x\n", + ev->response_type, ev->sequence); + } + free (ev); + + /* Silently discard all following errors */ + while ((ev = xcb_poll_for_event (xtc->c)) != NULL) + free (ev); + + return CAIRO_STATUS_WRITE_ERROR; + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_boilerplate_xcb_sync_server (xcb_target_closure_t *xtc) +{ + free (xcb_get_input_focus_reply (xtc->c, + xcb_get_input_focus (xtc->c), NULL)); +} + +static void +_cairo_boilerplate_xcb_setup_test_surface (cairo_surface_t *surface) +{ + + /* For testing purposes, tell the X server to strictly adhere to the + * Render specification. + */ + cairo_xcb_device_debug_set_precision(cairo_surface_get_device(surface), + XCB_RENDER_POLY_MODE_PRECISE); +} + +static void +_cairo_boilerplate_xcb_cleanup (void *closure) +{ + xcb_target_closure_t *xtc = closure; + cairo_status_t status; + + cairo_surface_finish (xtc->surface); + if (xtc->is_pixmap) + xcb_free_pixmap (xtc->c, xtc->drawable); + else + xcb_destroy_window (xtc->c, xtc->drawable); + cairo_surface_destroy (xtc->surface); + + cairo_device_finish (xtc->device); + cairo_device_destroy (xtc->device); + + /* First synchronize with the X server to make sure there are no more errors + * in-flight which we would miss otherwise */ + _cairo_boilerplate_xcb_sync_server (xtc); + status = _cairo_boilerplate_xcb_handle_errors (xtc); + assert (status == CAIRO_STATUS_SUCCESS); + + xcb_disconnect (xtc->c); + + free (xtc); +} + +static void +_cairo_boilerplate_xcb_synchronize (void *closure) +{ + xcb_target_closure_t *xtc = closure; + cairo_status_t status; + free (xcb_get_image_reply (xtc->c, + xcb_get_image (xtc->c, XCB_IMAGE_FORMAT_Z_PIXMAP, + xtc->drawable, 0, 0, 1, 1, /* AllPlanes */ -1), + 0)); + + status = _cairo_boilerplate_xcb_handle_errors (xtc); + assert (status == CAIRO_STATUS_SUCCESS); +} + +static xcb_render_pictforminfo_t * +find_depth (xcb_connection_t *connection, + int depth, + void **formats_out) +{ + xcb_render_query_pict_formats_reply_t *formats; + xcb_render_query_pict_formats_cookie_t cookie; + xcb_render_pictforminfo_iterator_t i; + + cookie = xcb_render_query_pict_formats (connection); + xcb_flush (connection); + + formats = xcb_render_query_pict_formats_reply (connection, cookie, 0); + if (formats == NULL) + return NULL; + + for (i = xcb_render_query_pict_formats_formats_iterator (formats); + i.rem; + xcb_render_pictforminfo_next (&i)) + { + if (XCB_RENDER_PICT_TYPE_DIRECT != i.data->type) + continue; + + if (depth != i.data->depth) + continue; + + *formats_out = formats; + return i.data; + } + + free (formats); + return NULL; +} + +static const cairo_user_data_key_t key; + +struct similar { + xcb_connection_t *connection; + xcb_drawable_t pixmap; +}; + +static void _destroy_similar (void *closure) +{ + struct similar *similar = closure; + + xcb_free_pixmap (similar->connection, similar->pixmap); + free (similar); +} + +struct xcb_info { + xcb_render_query_pict_formats_reply_t *formats; + xcb_render_pictforminfo_t *render_format[3]; +}; + +static cairo_surface_t * +_cairo_boilerplate_xcb_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, int height) +{ + cairo_device_t *device = cairo_surface_get_device (other); + struct xcb_info *info = cairo_device_get_user_data (device, &key); + xcb_screen_t *root; + cairo_surface_t *surface; + struct similar *similar; + xcb_render_pictforminfo_t *render_format; + int depth; + + similar = malloc (sizeof (*similar)); + + switch (content) { + default: + case CAIRO_CONTENT_COLOR_ALPHA: + depth = 32; + render_format = info->render_format[0]; + break; + case CAIRO_CONTENT_COLOR: + depth = 24; + render_format = info->render_format[1]; + break; + case CAIRO_CONTENT_ALPHA: + depth = 8; + render_format = info->render_format[2]; + break; + } + + similar->connection = + cairo_xcb_device_get_connection (cairo_surface_get_device(other)); + similar->pixmap = xcb_generate_id (similar->connection); + + root = xcb_setup_roots_iterator(xcb_get_setup(similar->connection)).data; + xcb_create_pixmap (similar->connection, depth, + similar->pixmap, root->root, + width, height); + + surface = cairo_xcb_surface_create_with_xrender_format (similar->connection, + root, + similar->pixmap, + render_format, + width, height); + cairo_surface_set_user_data (surface, &key, similar, _destroy_similar); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_xcb_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xcb_screen_t *root; + xcb_target_closure_t *xtc; + xcb_connection_t *c; + xcb_render_query_pict_formats_cookie_t formats_cookie; + xcb_render_pictforminfo_t *render_format; + xcb_render_pictforminfo_iterator_t i; + struct xcb_info *info; + int depth; + xcb_void_cookie_t cookie; + cairo_surface_t *surface; + cairo_status_t status; + + *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); + info = xcalloc (1, sizeof (struct xcb_info)); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + xtc->c = c = xcb_connect(NULL,NULL); + if (c == NULL || xcb_connection_has_error(c)) { + free (xtc); + return NULL; + } + + root = xcb_setup_roots_iterator(xcb_get_setup(c)).data; + formats_cookie = xcb_render_query_pict_formats (c); + + xtc->surface = NULL; + xtc->is_pixmap = TRUE; + xtc->drawable = xcb_generate_id (c); + switch (content) { + case CAIRO_CONTENT_COLOR: + depth = 24; + break; + + case CAIRO_CONTENT_COLOR_ALPHA: + depth = 32; + break; + + case CAIRO_CONTENT_ALPHA: /* would be XCB_PICT_STANDARD_A_8 */ + default: + xcb_disconnect (c); + free (xtc); + return NULL; + } + + cookie = xcb_create_pixmap_checked (c, depth, + xtc->drawable, root->root, + width, height); + + /* slow, but sure */ + if (xcb_request_check (c, cookie) != NULL) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + info->formats = xcb_render_query_pict_formats_reply (c, formats_cookie, 0); + if (info->formats == NULL) + return NULL; + + for (i = xcb_render_query_pict_formats_formats_iterator (info->formats); + i.rem; + xcb_render_pictforminfo_next (&i)) + { + if (XCB_RENDER_PICT_TYPE_DIRECT != i.data->type) + continue; + + if (i.data->depth == 32) { + if (info->render_format[0] == 0) + info->render_format[0] = i.data; + } else if (i.data->depth == 24) { + if (info->render_format[1] == 0) + info->render_format[1] = i.data; + } else if (i.data->depth == 8) { + if (info->render_format[2] == 0) + info->render_format[2] = i.data; + } + } + + assert (info->render_format[0]); + assert (info->render_format[1]); + assert (info->render_format[2]); + + switch (content) { + default: + case CAIRO_CONTENT_COLOR_ALPHA: + render_format = info->render_format[0]; + break; + + case CAIRO_CONTENT_COLOR: + render_format = info->render_format[1]; + break; + + case CAIRO_CONTENT_ALPHA: /* would be XCB_PICT_STANDARD_A_8 */ + render_format = info->render_format[2]; + break; + } + + surface = cairo_xcb_surface_create_with_xrender_format (c, root, + xtc->drawable, + render_format, + width, height); + cairo_device_set_user_data (cairo_surface_get_device (surface), &key, info, free); + if (mode != CAIRO_BOILERPLATE_MODE_PERF) + _cairo_boilerplate_xcb_setup_test_surface(surface); + + xtc->device = cairo_device_reference (cairo_surface_get_device (surface)); + status = cairo_surface_set_user_data (surface, &xcb_closure_key, xtc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + + _cairo_boilerplate_xcb_cleanup (xtc); + return cairo_boilerplate_surface_create_in_error (status); +} + +static xcb_visualtype_t * +lookup_visual (xcb_screen_t *s, + xcb_visualid_t visual) +{ + xcb_depth_iterator_t d; + + d = xcb_screen_allowed_depths_iterator (s); + for (; d.rem; xcb_depth_next (&d)) { + xcb_visualtype_iterator_t v = xcb_depth_visuals_iterator (d.data); + for (; v.rem; xcb_visualtype_next (&v)) { + if (v.data->visual_id == visual) + return v.data; + } + } + + return 0; +} + +static cairo_surface_t * +_cairo_boilerplate_xcb_create_window (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xcb_target_closure_t *xtc; + xcb_connection_t *c; + xcb_screen_t *s; + xcb_void_cookie_t cookie; + cairo_surface_t *surface; + cairo_status_t status; + uint32_t values[] = { 1 }; + + *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + xtc->c = c = xcb_connect(NULL,NULL); + if (xcb_connection_has_error(c)) { + free (xtc); + return NULL; + } + + xtc->surface = NULL; + + s = xcb_setup_roots_iterator (xcb_get_setup (c)).data; + if (width > s->width_in_pixels || height > s->height_in_pixels) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + xtc->is_pixmap = FALSE; + xtc->drawable = xcb_generate_id (c); + cookie = xcb_create_window_checked (c, + s->root_depth, + xtc->drawable, + s->root, + 0, 0, width, height, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + s->root_visual, + XCB_CW_OVERRIDE_REDIRECT, + values); + xcb_map_window (c, xtc->drawable); + + /* slow, but sure */ + if (xcb_request_check (c, cookie) != NULL) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + surface = cairo_xcb_surface_create (c, + xtc->drawable, + lookup_visual (s, s->root_visual), + width, height); + + xtc->device = cairo_device_reference (cairo_surface_get_device (surface)); + status = cairo_surface_set_user_data (surface, &xcb_closure_key, xtc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + + _cairo_boilerplate_xcb_cleanup (xtc); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_boilerplate_xcb_create_window_db (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xcb_target_closure_t *xtc; + xcb_connection_t *c; + xcb_screen_t *s; + xcb_void_cookie_t cookie; + cairo_surface_t *surface; + cairo_status_t status; + uint32_t values[] = { 1 }; + + *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + xtc->c = c = xcb_connect(NULL,NULL); + if (xcb_connection_has_error(c)) { + free (xtc); + return NULL; + } + + xtc->surface = NULL; + + s = xcb_setup_roots_iterator (xcb_get_setup (c)).data; + if (width > s->width_in_pixels || height > s->height_in_pixels) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + xtc->is_pixmap = FALSE; + xtc->drawable = xcb_generate_id (c); + cookie = xcb_create_window_checked (c, + s->root_depth, + xtc->drawable, + s->root, + 0, 0, width, height, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + s->root_visual, + XCB_CW_OVERRIDE_REDIRECT, + values); + xcb_map_window (c, xtc->drawable); + + /* slow, but sure */ + if (xcb_request_check (c, cookie) != NULL) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + xtc->surface = cairo_xcb_surface_create (c, + xtc->drawable, + lookup_visual (s, s->root_visual), + width, height); + surface = cairo_surface_create_similar (xtc->surface, content, width, height); + + xtc->device = cairo_device_reference (cairo_surface_get_device (surface)); + status = cairo_surface_set_user_data (surface, &xcb_closure_key, xtc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + + _cairo_boilerplate_xcb_cleanup (xtc); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_boilerplate_xcb_create_render_0_0 (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xcb_screen_t *root; + xcb_target_closure_t *xtc; + xcb_connection_t *c; + xcb_render_pictforminfo_t *render_format; + int depth; + xcb_void_cookie_t cookie; + cairo_surface_t *surface; + cairo_status_t status; + void *formats; + + *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + xtc->c = c = xcb_connect(NULL,NULL); + if (xcb_connection_has_error(c)) { + free (xtc); + return NULL; + } + + root = xcb_setup_roots_iterator(xcb_get_setup(c)).data; + + xtc->surface = NULL; + xtc->is_pixmap = TRUE; + xtc->drawable = xcb_generate_id (c); + switch (content) { + case CAIRO_CONTENT_COLOR: + depth = 24; + cookie = xcb_create_pixmap_checked (c, depth, + xtc->drawable, root->root, + width, height); + break; + + case CAIRO_CONTENT_COLOR_ALPHA: + depth = 32; + cookie = xcb_create_pixmap_checked (c, depth, + xtc->drawable, root->root, + width, height); + break; + + case CAIRO_CONTENT_ALPHA: /* would be XCB_PICT_STANDARD_A_8 */ + default: + xcb_disconnect (c); + free (xtc); + return NULL; + } + + /* slow, but sure */ + if (xcb_request_check (c, cookie) != NULL) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + xcb_flush (c); + + render_format = find_depth (c, depth, &formats); + if (render_format == NULL) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + surface = cairo_xcb_surface_create_with_xrender_format (c, root, + xtc->drawable, + render_format, + width, height); + if (cairo_surface_status (surface)) { + free (formats); + xcb_disconnect (c); + free (xtc); + return surface; + } + + xtc->device = cairo_device_reference (cairo_surface_get_device (surface)); + cairo_xcb_device_debug_cap_xrender_version (xtc->device, 0, 0); + + assert (cairo_surface_get_device (surface) == xtc->device); + + status = cairo_surface_set_user_data (surface, &xcb_closure_key, xtc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + + _cairo_boilerplate_xcb_cleanup (xtc); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_boilerplate_xcb_create_fallback (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xcb_target_closure_t *xtc; + xcb_connection_t *c; + xcb_screen_t *s; + xcb_void_cookie_t cookie; + cairo_surface_t *surface; + cairo_status_t status; + uint32_t values[] = { 1 }; + + *closure = xtc = xmalloc (sizeof (xcb_target_closure_t)); + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + xtc->c = c = xcb_connect (NULL,NULL); + if (xcb_connection_has_error(c)) { + free (xtc); + return NULL; + } + + s = xcb_setup_roots_iterator (xcb_get_setup (c)).data; + if (width > s->width_in_pixels || height > s->height_in_pixels) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + xtc->surface = NULL; + xtc->is_pixmap = FALSE; + xtc->drawable = xcb_generate_id (c); + cookie = xcb_create_window_checked (c, + s->root_depth, + xtc->drawable, + s->root, + 0, 0, width, height, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + s->root_visual, + XCB_CW_OVERRIDE_REDIRECT, + values); + xcb_map_window (c, xtc->drawable); + + /* slow, but sure */ + if (xcb_request_check (c, cookie) != NULL) { + xcb_disconnect (c); + free (xtc); + return NULL; + } + + surface = cairo_xcb_surface_create (c, + xtc->drawable, + lookup_visual (s, s->root_visual), + width, height); + if (cairo_surface_status (surface)) { + xcb_disconnect (c); + free (xtc); + return surface; + } + + cairo_xcb_device_debug_cap_xrender_version (cairo_surface_get_device (surface), + -1, -1); + + xtc->device = cairo_device_reference (cairo_surface_get_device (surface)); + status = cairo_surface_set_user_data (surface, &xcb_closure_key, xtc, NULL); + if (status == CAIRO_STATUS_SUCCESS) + return surface; + + cairo_surface_destroy (surface); + + _cairo_boilerplate_xcb_cleanup (xtc); + return cairo_boilerplate_surface_create_in_error (status); +} + +static cairo_status_t +_cairo_boilerplate_xcb_finish_surface (cairo_surface_t *surface) +{ + xcb_target_closure_t *xtc = cairo_surface_get_user_data (surface, + &xcb_closure_key); + cairo_status_t status; + + if (xtc->surface != NULL) { + cairo_t *cr; + + cr = cairo_create (xtc->surface); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_destroy (cr); + + surface = xtc->surface; + } + + cairo_surface_flush (surface); + if (cairo_surface_status (surface)) + return cairo_surface_status (surface); + + /* First synchronize with the X server to make sure there are no more errors + * in-flight which we would miss otherwise */ + _cairo_boilerplate_xcb_sync_server (xtc); + status = _cairo_boilerplate_xcb_handle_errors (xtc); + if (status) + return status; + + if (xcb_connection_has_error (xtc->c)) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_boilerplate_target_t targets[] = { + /* Acceleration architectures may make the results differ by a + * bit, so we set the error tolerance to 1. */ + { + "xcb", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_surface, + _cairo_boilerplate_xcb_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "xcb", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_surface, + _cairo_boilerplate_xcb_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xcb-window", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_window, + _cairo_boilerplate_xcb_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xcb-window&", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_window_db, + _cairo_boilerplate_xcb_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xcb-render-0_0", "xlib-fallback", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_render_0_0, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xcb-render-0_0", "xlib-fallback", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_render_0_0, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xcb-fallback", "xlib-fallback", NULL, NULL, + CAIRO_SURFACE_TYPE_XCB, CAIRO_CONTENT_COLOR, 1, + "cairo_xcb_surface_create_with_xrender_format", + _cairo_boilerplate_xcb_create_fallback, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_xcb_finish_surface, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xcb_cleanup, + _cairo_boilerplate_xcb_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +}; +CAIRO_BOILERPLATE (xcb, targets) diff --git a/boilerplate/cairo-boilerplate-xlib.c b/boilerplate/cairo-boilerplate-xlib.c new file mode 100644 index 000000000..f3d559806 --- /dev/null +++ b/boilerplate/cairo-boilerplate-xlib.c @@ -0,0 +1,638 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#include "cairo-boilerplate-private.h" +#include "cairo-boilerplate-xlib.h" + +#include <cairo-xlib.h> +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +#include <cairo-xlib-xrender.h> +#endif + +#include <X11/Xutil.h> /* for XDestroyImage */ + +#if !CAIRO_HAS_XLIB_XRENDER_SURFACE +#define PolyModePrecise 0 +#endif + +static const cairo_user_data_key_t key; + +typedef struct _xlib_target_closure { + Display *dpy; + Drawable drawable; + cairo_bool_t drawable_is_pixmap; +} xlib_target_closure_t; + +static void +_cairo_boilerplate_xlib_cleanup (void *closure) +{ + xlib_target_closure_t *xtc = closure; + + if (xtc->drawable) { + if (xtc->drawable_is_pixmap) + XFreePixmap (xtc->dpy, xtc->drawable); + else + XDestroyWindow (xtc->dpy, xtc->drawable); + } + XCloseDisplay (xtc->dpy); + free (xtc); +} + +static void +_cairo_boilerplate_xlib_synchronize (void *closure) +{ + xlib_target_closure_t *xtc = closure; + XImage *ximage; + + ximage = XGetImage (xtc->dpy, xtc->drawable, + 0, 0, 1, 1, AllPlanes, ZPixmap); + if (ximage != NULL) + XDestroyImage (ximage); +} + +static cairo_bool_t +_cairo_boilerplate_xlib_check_screen_size (Display *dpy, + int screen, + int width, + int height) +{ + Screen *scr = XScreenOfDisplay (dpy, screen); + return width <= WidthOfScreen (scr) && height <= HeightOfScreen (scr); +} + +static void +_cairo_boilerplate_xlib_setup_test_surface (cairo_surface_t *surface) +{ + + /* For testing purposes, tell the X server to strictly adhere to the + * Render specification. + */ + cairo_xlib_device_debug_set_precision(cairo_surface_get_device(surface), + PolyModePrecise); +} + + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +/* For the xlib backend we distinguish between TEST and PERF mode in a + * couple of ways. + * + * For TEST, we always test against pixmaps of depth 32 (for + * COLOR_ALPHA) or 24 (for COLOR) and we use XSynchronize to make it + * easier to debug problems. + * + * For PERF, we test against 32-bit pixmaps for COLOR_ALPHA, but for + * COLOR we test against _windows_ at the depth of the default visual. + * For obvious reasons, we don't use XSynchronize. + */ +static cairo_surface_t * +_cairo_boilerplate_xlib_test_create_surface (Display *dpy, + cairo_content_t content, + int width, + int height, + xlib_target_closure_t *xtc) +{ + XRenderPictFormat *xrender_format; + cairo_surface_t *surface; + + /* This kills performance, but it makes debugging much + * easier. That's why we have it here when in TEST mode, but not + * over in PERF mode. */ + XSynchronize (xtc->dpy, 1); + + /* XXX: Currently we don't do any xlib testing when the X server + * doesn't have the Render extension. We could do better here, + * (perhaps by converting the tests from ARGB32 to RGB24). One + * step better would be to always test the non-Render fallbacks + * for each test even if the server does have the Render + * extension. That would probably be through another + * cairo_boilerplate_target which would use an extended version of + * cairo_test_xlib_disable_render. */ + switch (content) { + case CAIRO_CONTENT_COLOR_ALPHA: + xrender_format = XRenderFindStandardFormat (dpy, PictStandardARGB32); + break; + case CAIRO_CONTENT_COLOR: + xrender_format = XRenderFindStandardFormat (dpy, PictStandardRGB24); + break; + case CAIRO_CONTENT_ALPHA: + default: + CAIRO_BOILERPLATE_DEBUG (("Invalid content for xlib test: %d\n", content)); + return NULL; + } + if (xrender_format == NULL) { + CAIRO_BOILERPLATE_DEBUG (("X server does not have the Render extension.\n")); + return NULL; + } + + xtc->drawable = XCreatePixmap (dpy, DefaultRootWindow (dpy), + width, height, xrender_format->depth); + xtc->drawable_is_pixmap = TRUE; + + surface = cairo_xlib_surface_create_with_xrender_format (dpy, xtc->drawable, + DefaultScreenOfDisplay (dpy), + xrender_format, + width, height); + + _cairo_boilerplate_xlib_setup_test_surface(surface); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_xlib_perf_create_surface (Display *dpy, + cairo_content_t content, + int width, + int height, + xlib_target_closure_t *xtc) +{ + XSetWindowAttributes attr; + XRenderPictFormat *xrender_format; + Visual *visual; + + switch (content) { + case CAIRO_CONTENT_COLOR_ALPHA: + xrender_format = XRenderFindStandardFormat (dpy, PictStandardARGB32); + if (xrender_format == NULL) { + CAIRO_BOILERPLATE_DEBUG (("X server does not have the Render extension.\n")); + return NULL; + } + + xtc->drawable = XCreatePixmap (dpy, DefaultRootWindow (dpy), + width, height, xrender_format->depth); + xtc->drawable_is_pixmap = TRUE; + break; + + case CAIRO_CONTENT_COLOR: + if (! _cairo_boilerplate_xlib_check_screen_size (dpy, + DefaultScreen (dpy), + width, height)) { + CAIRO_BOILERPLATE_DEBUG (("Surface is larger than the Screen.\n")); + return NULL; + } + + visual = DefaultVisual (dpy, DefaultScreen (dpy)); + xrender_format = XRenderFindVisualFormat (dpy, visual); + if (xrender_format == NULL) { + CAIRO_BOILERPLATE_DEBUG (("X server does not have the Render extension.\n")); + return NULL; + } + + attr.override_redirect = True; + xtc->drawable = XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, + width, height, 0, xrender_format->depth, + InputOutput, visual, CWOverrideRedirect, &attr); + XMapWindow (dpy, xtc->drawable); + xtc->drawable_is_pixmap = FALSE; + break; + + case CAIRO_CONTENT_ALPHA: + default: + CAIRO_BOILERPLATE_DEBUG (("Invalid content for xlib test: %d\n", content)); + return NULL; + } + + return cairo_xlib_surface_create_with_xrender_format (dpy, xtc->drawable, + DefaultScreenOfDisplay (dpy), + xrender_format, + width, height); +} + +struct similar { + Display *dpy; + Pixmap pixmap; +}; + +static void _destroy_similar (void *closure) +{ + struct similar *similar = closure; + + XFreePixmap (similar->dpy, similar->pixmap); + free (similar); +} + +static cairo_surface_t * +_cairo_boilerplate_xlib_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, + int height) +{ + XRenderPictFormat *xrender_format; + uint32_t format; + struct similar *similar; + cairo_surface_t *surface; + + similar = malloc (sizeof (*similar)); + similar->dpy = cairo_xlib_surface_get_display (other); + + switch (content) { + case CAIRO_CONTENT_COLOR: + format = PictStandardRGB24; + break; + case CAIRO_CONTENT_ALPHA: + format = PictStandardA8; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + default: + format = PictStandardARGB32; + break; + } + + xrender_format = XRenderFindStandardFormat (similar->dpy, format); + similar->pixmap = XCreatePixmap (similar->dpy, + DefaultRootWindow (similar->dpy), + width, height, + xrender_format->depth); + + surface = + cairo_xlib_surface_create_with_xrender_format (similar->dpy, + similar->pixmap, + DefaultScreenOfDisplay (similar->dpy), + xrender_format, + width, height); + + cairo_surface_set_user_data (surface, &key, similar, _destroy_similar); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_xlib_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xlib_target_closure_t *xtc; + Display *dpy; + cairo_surface_t *surface; + + *closure = xtc = xcalloc (1, sizeof (xlib_target_closure_t)); + + width = ceil (width); + if (width < 1) + width = 1; + + height = ceil (height); + if (height < 1) + height = 1; + + xtc->dpy = dpy = XOpenDisplay (NULL); + if (xtc->dpy == NULL) { + free (xtc); + CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); + return NULL; + } + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + surface = _cairo_boilerplate_xlib_test_create_surface (dpy, content, width, height, xtc); + else /* mode == CAIRO_BOILERPLATE_MODE_PERF */ + surface = _cairo_boilerplate_xlib_perf_create_surface (dpy, content, width, height, xtc); + + if (surface == NULL || cairo_surface_status (surface)) + _cairo_boilerplate_xlib_cleanup (xtc); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_xlib_render_0_0_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xlib_target_closure_t *xtc; + Display *dpy; + int screen; + Pixmap pixmap; + cairo_surface_t *surface, *dummy; + + *closure = xtc = xcalloc (1, sizeof (xlib_target_closure_t)); + + width = ceil (width); + if (width < 1) + width = 1; + + height = ceil (height); + if (height < 1) + height = 1; + + xtc->dpy = dpy = XOpenDisplay (NULL); + if (xtc->dpy == NULL) { + free (xtc); + CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); + return NULL; + } + + + screen = DefaultScreen (dpy); + pixmap = XCreatePixmap (dpy, DefaultRootWindow (dpy), 1, 1, + DefaultDepth (dpy, screen)); + dummy = cairo_xlib_surface_create (dpy, pixmap, + DefaultVisual (dpy, screen), + 1, 1); + cairo_xlib_device_debug_cap_xrender_version (cairo_surface_get_device (dummy), + 0, 0); + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + surface = _cairo_boilerplate_xlib_test_create_surface (dpy, content, width, height, xtc); + else /* mode == CAIRO_BOILERPLATE_MODE_PERF */ + surface = _cairo_boilerplate_xlib_perf_create_surface (dpy, content, width, height, xtc); + + cairo_surface_destroy (dummy); + XFreePixmap (dpy, pixmap); + + if (surface == NULL || cairo_surface_status (surface)) + _cairo_boilerplate_xlib_cleanup (xtc); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_xlib_window_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xlib_target_closure_t *xtc; + Display *dpy; + int screen; + XSetWindowAttributes attr; + cairo_surface_t *surface; + + /* We're not yet bothering to support perf mode for the + * xlib-fallback surface. */ + if (mode == CAIRO_BOILERPLATE_MODE_PERF) + return NULL; + + /* We also don't support drawing with destination-alpha in the + * xlib-fallback surface. */ + if (content == CAIRO_CONTENT_COLOR_ALPHA) + return NULL; + + *closure = xtc = xmalloc (sizeof (xlib_target_closure_t)); + + width = ceil (width); + if (width < 1) + width = 1; + + height = ceil (height); + if (height < 1) + height = 1; + + xtc->dpy = dpy = XOpenDisplay (NULL); + if (xtc->dpy == NULL) { + CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); + free (xtc); + return NULL; + } + + /* This kills performance, but it makes debugging much + * easier. That's why we have it here only after explicitly not + * supporting PERF mode.*/ + XSynchronize (dpy, 1); + + screen = DefaultScreen (dpy); + if (! _cairo_boilerplate_xlib_check_screen_size (dpy, screen, + width, height)) { + CAIRO_BOILERPLATE_DEBUG (("Surface is larger than the Screen.\n")); + XCloseDisplay (dpy); + free (xtc); + return NULL; + } + + attr.override_redirect = True; + xtc->drawable = XCreateWindow (dpy, DefaultRootWindow (dpy), + 0, 0, + width, height, 0, + DefaultDepth (dpy, screen), + InputOutput, + DefaultVisual (dpy, screen), + CWOverrideRedirect, &attr); + XMapWindow (dpy, xtc->drawable); + xtc->drawable_is_pixmap = FALSE; + + surface = cairo_xlib_surface_create (dpy, xtc->drawable, + DefaultVisual (dpy, screen), + width, height); + if (cairo_surface_status (surface)) + _cairo_boilerplate_xlib_cleanup (xtc); + + _cairo_boilerplate_xlib_setup_test_surface(surface); + + return surface; +} +#endif + + +#if CAIRO_HAS_XLIB_SURFACE +/* The xlib-fallback target differs from the xlib target in two ways: + * + * 1. It creates its surfaces without relying on the Render extension + * + * 2. It disables use of the Render extension for its surfaces + * + * This provides testing of the non-Render fallback paths we have in + * cairo-xlib-surface.c + */ +static cairo_surface_t * +_cairo_boilerplate_xlib_fallback_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + xlib_target_closure_t *xtc; + Display *dpy; + int screen; + XSetWindowAttributes attr; + cairo_surface_t *surface, *dummy; + + /* We're not yet bothering to support perf mode for the + * xlib-fallback surface. */ + if (mode == CAIRO_BOILERPLATE_MODE_PERF) + return NULL; + + /* We also don't support drawing with destination-alpha in the + * xlib-fallback surface. */ + if (content == CAIRO_CONTENT_COLOR_ALPHA) + return NULL; + + *closure = xtc = xmalloc (sizeof (xlib_target_closure_t)); + + width = ceil (width); + if (width < 1) + width = 1; + + height = ceil (height); + if (height < 1) + height = 1; + + xtc->dpy = dpy = XOpenDisplay (NULL); + if (xtc->dpy == NULL) { + CAIRO_BOILERPLATE_DEBUG (("Failed to open display: %s\n", XDisplayName(0))); + free (xtc); + return NULL; + } + + /* This kills performance, but it makes debugging much + * easier. That's why we have it here only after explicitly not + * supporting PERF mode.*/ + XSynchronize (dpy, 1); + + screen = DefaultScreen (dpy); + if (! _cairo_boilerplate_xlib_check_screen_size (dpy, screen, + width, height)) { + CAIRO_BOILERPLATE_DEBUG (("Surface is larger than the Screen.\n")); + XCloseDisplay (dpy); + free (xtc); + return NULL; + } + + attr.override_redirect = True; + xtc->drawable = XCreateWindow (dpy, DefaultRootWindow (dpy), + 0, 0, + width, height, 0, + DefaultDepth (dpy, screen), + InputOutput, + DefaultVisual (dpy, screen), + CWOverrideRedirect, &attr); + XMapWindow (dpy, xtc->drawable); + xtc->drawable_is_pixmap = FALSE; + + dummy = cairo_xlib_surface_create (dpy, xtc->drawable, + DefaultVisual (dpy, screen), + width, height); + cairo_xlib_device_debug_cap_xrender_version (cairo_surface_get_device (dummy), + -1, -1); + + surface = cairo_xlib_surface_create (dpy, xtc->drawable, + DefaultVisual (dpy, screen), + width, height); + cairo_surface_destroy (dummy); + if (cairo_surface_status (surface)) + _cairo_boilerplate_xlib_cleanup (xtc); + + _cairo_boilerplate_xlib_setup_test_surface(surface); + + return surface; +} +#endif + +static const cairo_boilerplate_target_t targets[] = { +#if CAIRO_HAS_XLIB_XRENDER_SURFACE + /* Acceleration architectures may make the results differ by a + * bit, so we set the error tolerance to 1. */ + { + "xlib", "traps", NULL, "xlib-fallback", + CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_xlib_surface_create_with_xrender_format", + _cairo_boilerplate_xlib_create_surface, + _cairo_boilerplate_xlib_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xlib_cleanup, + _cairo_boilerplate_xlib_synchronize, + NULL, + TRUE, FALSE, FALSE + }, + { + "xlib", "traps", NULL, "xlib-fallback", + CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR, 1, + "cairo_xlib_surface_create_with_xrender_format", + _cairo_boilerplate_xlib_create_surface, + _cairo_boilerplate_xlib_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xlib_cleanup, + _cairo_boilerplate_xlib_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xlib-window", "traps", NULL, NULL, + CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR, 1, + "cairo_xlib_surface_create", + _cairo_boilerplate_xlib_window_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xlib_cleanup, + _cairo_boilerplate_xlib_synchronize, + NULL, + FALSE, FALSE, FALSE + }, + { + "xlib-render-0_0", "mask", NULL, NULL, + CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR, 1, + "cairo_xlib_surface_create", + _cairo_boilerplate_xlib_render_0_0_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xlib_cleanup, + _cairo_boilerplate_xlib_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +#endif +#if CAIRO_HAS_XLIB_SURFACE + /* This is a fallback surface which uses xlib fallbacks instead of + * the Render extension. */ + { + "xlib-fallback", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_XLIB, CAIRO_CONTENT_COLOR, 1, + "cairo_xlib_surface_create", + _cairo_boilerplate_xlib_fallback_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_xlib_cleanup, + _cairo_boilerplate_xlib_synchronize, + NULL, + FALSE, FALSE, FALSE + }, +#endif +}; +CAIRO_BOILERPLATE (xlib, targets) diff --git a/boilerplate/cairo-boilerplate-xlib.h b/boilerplate/cairo-boilerplate-xlib.h new file mode 100644 index 000000000..9a6391812 --- /dev/null +++ b/boilerplate/cairo-boilerplate-xlib.h @@ -0,0 +1,33 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Behdad Esfahbod <behdad@behdad.org> + */ + +#ifndef _CAIRO_BOILERPLATE_XLIB_H_ +#define _CAIRO_BOILERPLATE_XLIB_H_ + +cairo_status_t +cairo_boilerplate_xlib_surface_disable_render (cairo_surface_t *surface); + +#endif diff --git a/boilerplate/cairo-boilerplate.c b/boilerplate/cairo-boilerplate.c new file mode 100644 index 000000000..7fdbf798b --- /dev/null +++ b/boilerplate/cairo-boilerplate.c @@ -0,0 +1,1101 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#define CAIRO_VERSION_H 1 + +#include "cairo-boilerplate-private.h" +#include "cairo-boilerplate-scaled-font.h" + +#include <pixman.h> + +#include <cairo-types-private.h> +#include <cairo-scaled-font-private.h> + +#if CAIRO_HAS_SCRIPT_SURFACE +#include <cairo-script.h> +#endif + +/* get the "real" version info instead of dummy cairo-version.h */ +#undef CAIRO_VERSION_H +#include "../cairo-version.h" + +#include <stdlib.h> +#include <ctype.h> +#include <assert.h> +#include <errno.h> + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#if HAVE_UNISTD_H && HAVE_FCNTL_H && HAVE_SIGNAL_H && HAVE_SYS_STAT_H && HAVE_SYS_SOCKET_H && HAVE_SYS_UN_H +#include <unistd.h> +#include <fcntl.h> +#include <signal.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/un.h> + +#define HAS_DAEMON 1 +#define SOCKET_PATH "./.any2ppm" +#endif + +cairo_content_t +cairo_boilerplate_content (cairo_content_t content) +{ + if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED) + content = CAIRO_CONTENT_COLOR_ALPHA; + + return content; +} + +const char * +cairo_boilerplate_content_name (cairo_content_t content) +{ + /* For the purpose of the content name, we don't distinguish the + * flattened content value. + */ + switch (cairo_boilerplate_content (content)) { + case CAIRO_CONTENT_COLOR: + return "rgb24"; + case CAIRO_CONTENT_COLOR_ALPHA: + return "argb32"; + case CAIRO_CONTENT_ALPHA: + default: + assert (0); /* not reached */ + return "---"; + } +} + +static const char * +_cairo_boilerplate_content_visible_name (cairo_content_t content) +{ + switch (cairo_boilerplate_content (content)) { + case CAIRO_CONTENT_COLOR: + return "rgb"; + case CAIRO_CONTENT_COLOR_ALPHA: + return "rgba"; + case CAIRO_CONTENT_ALPHA: + return "a"; + default: + assert (0); /* not reached */ + return "---"; + } +} + +cairo_format_t +cairo_boilerplate_format_from_content (cairo_content_t content) +{ + cairo_format_t format; + + switch (content) { + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB24; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + format = CAIRO_FORMAT_ARGB32; + break; + case CAIRO_CONTENT_ALPHA: + format = CAIRO_FORMAT_A8; + break; + default: + assert (0); /* not reached */ + format = CAIRO_FORMAT_INVALID; + break; + } + + return format; +} + +static cairo_surface_t * +_cairo_boilerplate_image_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_format_t format; + + *closure = NULL; + + if (content == CAIRO_CONTENT_COLOR_ALPHA) { + format = CAIRO_FORMAT_ARGB32; + } else if (content == CAIRO_CONTENT_COLOR) { + format = CAIRO_FORMAT_RGB24; + } else { + assert (0); /* not reached */ + return NULL; + } + + return cairo_image_surface_create (format, ceil (width), ceil (height)); +} + +static const cairo_user_data_key_t key; + +static cairo_surface_t * +_cairo_boilerplate_image_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, int height) +{ + cairo_format_t format; + cairo_surface_t *surface; + int stride; + void *ptr; + + switch (content) { + case CAIRO_CONTENT_ALPHA: + format = CAIRO_FORMAT_A8; + break; + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB24; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + default: + format = CAIRO_FORMAT_ARGB32; + break; + } + + stride = cairo_format_stride_for_width(format, width); + ptr = malloc (stride* height); + + surface = cairo_image_surface_create_for_data (ptr, format, + width, height, stride); + cairo_surface_set_user_data (surface, &key, ptr, free); + + return surface; +} + +static cairo_surface_t * +_cairo_boilerplate_image16_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + *closure = NULL; + + /* XXX force CAIRO_CONTENT_COLOR */ + return cairo_image_surface_create (CAIRO_FORMAT_RGB16_565, ceil (width), ceil (height)); +} + +static cairo_surface_t * +_cairo_boilerplate_image16_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, int height) +{ + cairo_format_t format; + cairo_surface_t *surface; + int stride; + void *ptr; + + switch (content) { + case CAIRO_CONTENT_ALPHA: + format = CAIRO_FORMAT_A8; + break; + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB16_565; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + default: + format = CAIRO_FORMAT_ARGB32; + break; + } + + stride = cairo_format_stride_for_width(format, width); + ptr = malloc (stride* height); + + surface = cairo_image_surface_create_for_data (ptr, format, + width, height, stride); + cairo_surface_set_user_data (surface, &key, ptr, free); + + return surface; +} + +static char * +_cairo_boilerplate_image_describe (void *closure) +{ + char *s; + + xasprintf (&s, "pixman %s", pixman_version_string ()); + + return s; +} + +#if CAIRO_HAS_RECORDING_SURFACE +static cairo_surface_t * +_cairo_boilerplate_recording_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_rectangle_t extents; + + extents.x = 0; + extents.y = 0; + extents.width = width; + extents.height = height; + return *closure = cairo_surface_reference (cairo_recording_surface_create (content, &extents)); +} + +static void +_cairo_boilerplate_recording_surface_cleanup (void *closure) +{ + cairo_surface_finish (closure); + cairo_surface_destroy (closure); +} +#endif + +const cairo_user_data_key_t cairo_boilerplate_output_basename_key; + +cairo_surface_t * +_cairo_boilerplate_get_image_surface (cairo_surface_t *src, + int page, + int width, + int height) +{ + cairo_surface_t *surface, *image; + cairo_t *cr; + cairo_status_t status; + cairo_format_t format; + + if (cairo_surface_status (src)) + return cairo_surface_reference (src); + + if (page != 0) + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + /* extract sub-surface */ + switch (cairo_surface_get_content (src)) { + case CAIRO_CONTENT_ALPHA: + format = CAIRO_FORMAT_A8; + break; + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB24; + break; + default: + case CAIRO_CONTENT_COLOR_ALPHA: + format = CAIRO_FORMAT_ARGB32; + break; + } + surface = cairo_image_surface_create (format, width, height); + assert (cairo_surface_get_content (surface) == cairo_surface_get_content (src)); + image = cairo_surface_reference (surface); + + /* open a logging channel (only interesting for recording surfaces) */ +#if CAIRO_HAS_SCRIPT_SURFACE && CAIRO_HAS_RECORDING_SURFACE + if (cairo_surface_get_type (src) == CAIRO_SURFACE_TYPE_RECORDING) { + const char *test_name; + + test_name = cairo_surface_get_user_data (src, + &cairo_boilerplate_output_basename_key); + if (test_name != NULL) { + cairo_device_t *ctx; + char *filename; + + cairo_surface_destroy (surface); + + xasprintf (&filename, "%s.out.trace", test_name); + ctx = cairo_script_create (filename); + surface = cairo_script_surface_create_for_target (ctx, image); + cairo_device_destroy (ctx); + free (filename); + } + } +#endif + + cr = cairo_create (surface); + cairo_surface_destroy (surface); + cairo_set_source_surface (cr, src, 0, 0); + cairo_paint (cr); + + status = cairo_status (cr); + if (status) { + cairo_surface_destroy (image); + image = cairo_surface_reference (cairo_get_target (cr)); + } + cairo_destroy (cr); + + return image; +} + +cairo_surface_t * +cairo_boilerplate_get_image_surface_from_png (const char *filename, + int width, + int height, + cairo_bool_t flatten) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) + return surface; + + if (flatten) { + cairo_t *cr; + cairo_surface_t *flattened; + + flattened = cairo_image_surface_create (cairo_image_surface_get_format (surface), + width, + height); + cr = cairo_create (flattened); + cairo_surface_destroy (flattened); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_surface (cr, surface, + width - cairo_image_surface_get_width (surface), + height - cairo_image_surface_get_height (surface)); + cairo_paint (cr); + + cairo_surface_destroy (surface); + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + } else if (cairo_image_surface_get_width (surface) != width || + cairo_image_surface_get_height (surface) != height) + { + cairo_t *cr; + cairo_surface_t *sub; + + sub = cairo_image_surface_create (cairo_image_surface_get_format (surface), + width, + height); + cr = cairo_create (sub); + cairo_surface_destroy (sub); + + cairo_set_source_surface (cr, surface, + width - cairo_image_surface_get_width (surface), + height - cairo_image_surface_get_height (surface)); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + cairo_surface_destroy (surface); + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + } + + return surface; +} + +static const cairo_boilerplate_target_t builtin_targets[] = { + /* I'm uncompromising about leaving the image backend as 0 + * for tolerance. There shouldn't ever be anything that is out of + * our control here. */ + { + "image", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, CAIRO_CONTENT_COLOR_ALPHA, 0, + NULL, + _cairo_boilerplate_image_create_surface, + _cairo_boilerplate_image_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, + _cairo_boilerplate_image_describe, + TRUE, FALSE, FALSE + }, + { + "image", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, CAIRO_CONTENT_COLOR, 0, + NULL, + _cairo_boilerplate_image_create_surface, + _cairo_boilerplate_image_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, + _cairo_boilerplate_image_describe, + FALSE, FALSE, FALSE + }, + { + "image16", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_IMAGE, CAIRO_CONTENT_COLOR, 0, + NULL, + _cairo_boilerplate_image16_create_surface, + _cairo_boilerplate_image16_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + NULL, NULL, + _cairo_boilerplate_image_describe, + TRUE, FALSE, FALSE + }, +#if CAIRO_HAS_RECORDING_SURFACE + { + "recording", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR_ALPHA, 0, + "cairo_recording_surface_create", + _cairo_boilerplate_recording_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_recording_surface_cleanup, + NULL, NULL, + FALSE, FALSE, TRUE + }, + { + "recording", "image", NULL, NULL, + CAIRO_SURFACE_TYPE_RECORDING, CAIRO_CONTENT_COLOR, 0, + "cairo_recording_surface_create", + _cairo_boilerplate_recording_create_surface, + cairo_surface_create_similar, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_recording_surface_cleanup, + NULL, NULL, + FALSE, FALSE, TRUE + }, +#endif +}; +CAIRO_BOILERPLATE (builtin, builtin_targets) + +static struct cairo_boilerplate_target_list { + struct cairo_boilerplate_target_list *next; + const cairo_boilerplate_target_t *target; +} *cairo_boilerplate_targets; + +static cairo_bool_t +probe_target (const cairo_boilerplate_target_t *target) +{ + if (target->probe == NULL) + return TRUE; + +#if HAVE_DLSYM + return dlsym (NULL, target->probe) != NULL; +#else + return TRUE; +#endif +} + +void +_cairo_boilerplate_register_backend (const cairo_boilerplate_target_t *targets, + unsigned int count) +{ + targets += count; + while (count--) { + struct cairo_boilerplate_target_list *list; + + --targets; + if (! probe_target (targets)) + continue; + + list = xmalloc (sizeof (*list)); + list->next = cairo_boilerplate_targets; + list->target = targets; + cairo_boilerplate_targets = list; + } +} + +static cairo_bool_t +_cairo_boilerplate_target_format_matches_name (const cairo_boilerplate_target_t *target, + const char *tcontent_name, + const char *tcontent_end) +{ + char const *content_name; + const char *content_end = tcontent_end; + size_t content_len; + + content_name = _cairo_boilerplate_content_visible_name (target->content); + if (tcontent_end) + content_len = content_end - tcontent_name; + else + content_len = strlen(tcontent_name); + if (strlen(content_name) != content_len) + return FALSE; + if (0 == strncmp (content_name, tcontent_name, content_len)) + return TRUE; + + return FALSE; +} + +static cairo_bool_t +_cairo_boilerplate_target_matches_name (const cairo_boilerplate_target_t *target, + const char *tname, + const char *end) +{ + char const *content_name; + const char *content_start = strpbrk (tname, "."); + const char *content_end = end; + size_t name_len; + size_t content_len; + + if (content_start >= end) + content_start = NULL; + if (content_start != NULL) + end = content_start++; + + name_len = end - tname; + + /* Check name. */ + if (! (name_len == 1 && 0 == strncmp (tname, "?", 1))) { /* wildcard? */ + if (0 != strncmp (target->name, tname, name_len)) /* exact match? */ + return FALSE; + if (isalnum (target->name[name_len])) + return FALSE; + } + + /* Check optional content. */ + if (content_start == NULL) /* none given? */ + return TRUE; + + /* Exact content match? */ + content_name = _cairo_boilerplate_content_visible_name (target->content); + content_len = content_end - content_start; + if (strlen(content_name) != content_len) + return FALSE; + if (0 == strncmp (content_name, content_start, content_len)) + return TRUE; + + return FALSE; +} + +const cairo_boilerplate_target_t ** +cairo_boilerplate_get_targets (int *pnum_targets, + cairo_bool_t *plimited_targets) +{ + size_t i, num_targets; + cairo_bool_t limited_targets = FALSE; + const char *tname; + const cairo_boilerplate_target_t **targets_to_test; + struct cairo_boilerplate_target_list *list; + + if (cairo_boilerplate_targets == NULL) + _cairo_boilerplate_register_all (); + + if ((tname = getenv ("CAIRO_TEST_TARGET")) != NULL && *tname) { + /* check the list of targets specified by the user */ + limited_targets = TRUE; + + num_targets = 0; + targets_to_test = NULL; + + while (*tname) { + int found = 0; + const char *end = strpbrk (tname, " \t\r\n;:,"); + if (!end) + end = tname + strlen (tname); + + if (end == tname) { + tname = end + 1; + continue; + } + + for (list = cairo_boilerplate_targets; + list != NULL; + list = list->next) + { + const cairo_boilerplate_target_t *target = list->target; + const char *tcontent_name; + const char *tcontent_end; + if (_cairo_boilerplate_target_matches_name (target, tname, end)) { + if ((tcontent_name = getenv ("CAIRO_TEST_TARGET_FORMAT")) != NULL && *tcontent_name) { + while(tcontent_name) { + tcontent_end = strpbrk (tcontent_name, " \t\r\n;:,"); + if (tcontent_end == tcontent_name) { + tcontent_name = tcontent_end + 1; + continue; + } + if(_cairo_boilerplate_target_format_matches_name (target, + tcontent_name, tcontent_end)) { + /* realloc isn't exactly the best thing here, but meh. */ + targets_to_test = xrealloc (targets_to_test, + sizeof(cairo_boilerplate_target_t *) * (num_targets+1)); + targets_to_test[num_targets++] = target; + found = 1; + } + + if (tcontent_end) + tcontent_end++; + tcontent_name = tcontent_end; + } + } else { + /* realloc isn't exactly the best thing here, but meh. */ + targets_to_test = xrealloc (targets_to_test, + sizeof(cairo_boilerplate_target_t *) * (num_targets+1)); + targets_to_test[num_targets++] = target; + found = 1; + } + } + } + + if (!found) { + const char *last_name = NULL; + + fprintf (stderr, "Cannot find target '%.*s'.\n", + (int)(end - tname), tname); + fprintf (stderr, "Known targets:"); + for (list = cairo_boilerplate_targets; + list != NULL; + list = list->next) + { + const cairo_boilerplate_target_t *target = list->target; + if (last_name != NULL) { + if (strcmp (target->name, last_name) == 0) { + /* filter out repeats that differ in content */ + continue; + } + fprintf (stderr, ","); + } + fprintf (stderr, " %s", target->name); + last_name = target->name; + } + fprintf (stderr, "\n"); + exit(-1); + } + + if (*end) + end++; + tname = end; + } + } else { + int found = 0; + int not_found_targets = 0; + num_targets = 0; + targets_to_test = xmalloc (sizeof(cairo_boilerplate_target_t*) * num_targets); + for (list = cairo_boilerplate_targets; list != NULL; list = list->next) + { + const cairo_boilerplate_target_t *target = list->target; + const char *tcontent_name; + const char *tcontent_end; + if ((tcontent_name = getenv ("CAIRO_TEST_TARGET_FORMAT")) != NULL && *tcontent_name) { + while(tcontent_name) { + tcontent_end = strpbrk (tcontent_name, " \t\r\n;:,"); + if (tcontent_end == tcontent_name) { + tcontent_name = tcontent_end + 1; + continue; + } + if (_cairo_boilerplate_target_format_matches_name (target, + tcontent_name, tcontent_end)) { + /* realloc isn't exactly the best thing here, but meh. */ + targets_to_test = xrealloc (targets_to_test, + sizeof(cairo_boilerplate_target_t *) * (num_targets+1)); + targets_to_test[num_targets++] = target; + found =1; + } + else + { + not_found_targets++; + } + + if (tcontent_end) + tcontent_end++; + + tcontent_name = tcontent_end; + } + } + else + { + num_targets++; + } + } + if (!found) + { + /* check all compiled in targets */ + num_targets = num_targets + not_found_targets; + targets_to_test = xrealloc (targets_to_test, + sizeof(cairo_boilerplate_target_t*) * num_targets); + num_targets = 0; + for (list = cairo_boilerplate_targets; + list != NULL; + list = list->next) + { + const cairo_boilerplate_target_t *target = list->target; + targets_to_test[num_targets++] = target; + } + } + + } + + /* exclude targets as specified by the user */ + if ((tname = getenv ("CAIRO_TEST_TARGET_EXCLUDE")) != NULL && *tname) { + limited_targets = TRUE; + + while (*tname) { + int j; + const char *end = strpbrk (tname, " \t\r\n;:,"); + if (!end) + end = tname + strlen (tname); + + if (end == tname) { + tname = end + 1; + continue; + } + + for (i = j = 0; i < num_targets; i++) { + const cairo_boilerplate_target_t *target = targets_to_test[i]; + if (! _cairo_boilerplate_target_matches_name (target, + tname, end)) + { + targets_to_test[j++] = targets_to_test[i]; + } + } + num_targets = j; + + if (*end) + end++; + tname = end; + } + } + + if (pnum_targets) + *pnum_targets = num_targets; + + if (plimited_targets) + *plimited_targets = limited_targets; + + return targets_to_test; +} + +const cairo_boilerplate_target_t * +cairo_boilerplate_get_image_target (cairo_content_t content) +{ + if (cairo_boilerplate_targets == NULL) + _cairo_boilerplate_register_all (); + + switch (content) { + case CAIRO_CONTENT_COLOR: + return &builtin_targets[1]; + case CAIRO_CONTENT_COLOR_ALPHA: + return &builtin_targets[0]; + case CAIRO_CONTENT_ALPHA: + default: + return NULL; + } +} + +const cairo_boilerplate_target_t * +cairo_boilerplate_get_target_by_name (const char *name, + cairo_content_t content) +{ + struct cairo_boilerplate_target_list *list; + + if (cairo_boilerplate_targets == NULL) + _cairo_boilerplate_register_all (); + + /* first return an exact match */ + for (list = cairo_boilerplate_targets; list != NULL; list = list->next) { + const cairo_boilerplate_target_t *target = list->target; + if (strcmp (target->name, name) == 0 && + target->content == content) + { + return target; + } + } + + /* otherwise just return a match that may differ in content */ + for (list = cairo_boilerplate_targets; list != NULL; list = list->next) { + const cairo_boilerplate_target_t *target = list->target; + if (strcmp (target->name, name) == 0) + return target; + } + + return NULL; +} + +void +cairo_boilerplate_free_targets (const cairo_boilerplate_target_t **targets) +{ + free (targets); +} + +cairo_surface_t * +cairo_boilerplate_surface_create_in_error (cairo_status_t status) +{ + cairo_surface_t *surface = NULL; + int loop = 5; + + do { + cairo_surface_t *intermediate; + cairo_t *cr; + cairo_path_t path; + + intermediate = cairo_image_surface_create (CAIRO_FORMAT_A8, 0, 0); + cr = cairo_create (intermediate); + cairo_surface_destroy (intermediate); + + path.status = status; + cairo_append_path (cr, &path); + + cairo_surface_destroy (surface); + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + } while (cairo_surface_status (surface) != status && --loop); + + return surface; +} + +void +cairo_boilerplate_scaled_font_set_max_glyphs_cached (cairo_scaled_font_t *scaled_font, + int max_glyphs) +{ + /* XXX CAIRO_DEBUG */ +} + +#if HAS_DAEMON +static int +any2ppm_daemon_exists (void) +{ + struct stat st; + int fd; + char buf[80]; + int pid; + int ret; + + if (stat (SOCKET_PATH, &st) < 0) + return 0; + + fd = open (SOCKET_PATH ".pid", O_RDONLY); + if (fd < 0) + return 0; + + pid = 0; + ret = read (fd, buf, sizeof (buf) - 1); + if (ret > 0) { + buf[ret] = '\0'; + pid = atoi (buf); + } + close (fd); + + return pid > 0 && kill (pid, 0) != -1; +} +#endif + +FILE * +cairo_boilerplate_open_any2ppm (const char *filename, + int page, + unsigned int flags, + int (**close_cb) (FILE *)) +{ + char command[4096]; + const char *any2ppm; +#if HAS_DAEMON + int sk; + struct sockaddr_un addr; + int len; +#endif + + any2ppm = getenv ("ANY2PPM"); + if (any2ppm == NULL) + any2ppm = "./any2ppm"; + +#if HAS_DAEMON + if (flags & CAIRO_BOILERPLATE_OPEN_NO_DAEMON) + goto POPEN; + + if (! any2ppm_daemon_exists ()) { + if (system (any2ppm) != 0) + goto POPEN; + } + + sk = socket (PF_UNIX, SOCK_STREAM, 0); + if (sk == -1) + goto POPEN; + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, SOCKET_PATH); + + if (connect (sk, (struct sockaddr *) &addr, sizeof (addr)) == -1) { + close (sk); + goto POPEN; + } + + len = sprintf (command, "%s %d\n", filename, page); + if (write (sk, command, len) != len) { + close (sk); + goto POPEN; + } + + *close_cb = fclose; + return fdopen (sk, "rb"); + +POPEN: +#endif + + *close_cb = pclose; + sprintf (command, "%s %s %d", any2ppm, filename, page); + return popen (command, "rb"); +} + +static cairo_bool_t +freadn (unsigned char *buf, + int len, + FILE *file) +{ + int ret; + + while (len) { + ret = fread (buf, 1, len, file); + if (ret != len) { + if (ferror (file) || feof (file)) + return FALSE; + } + len -= ret; + buf += len; + } + + return TRUE; +} + +cairo_surface_t * +cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file) +{ + char format; + int width, height, stride; + int x, y; + unsigned char *data; + cairo_surface_t *image = NULL; + + if (fscanf (file, "P%c %d %d 255\n", &format, &width, &height) != 3) + goto FAIL; + + switch (format) { + case '7': /* XXX */ + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + break; + case '6': + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + break; + case '5': + image = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + break; + default: + goto FAIL; + } + if (cairo_surface_status (image)) + return image; + + data = cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image); + for (y = 0; y < height; y++) { + unsigned char *buf = data + y*stride; + switch (format) { + case '7': + if (! freadn (buf, 4 * width, file)) + goto FAIL; + break; + case '6': + if (! freadn (buf, 3*width, file)) + goto FAIL; + buf += 3*width; + for (x = width; x--; ) { + buf -= 3; + ((uint32_t *) (data + y*stride))[x] = + (buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0); + } + break; + case '5': + if (! freadn (buf, width, file)) + goto FAIL; + break; + } + } + cairo_surface_mark_dirty (image); + + return image; + +FAIL: + cairo_surface_destroy (image); + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); +} + +cairo_surface_t * +cairo_boilerplate_convert_to_image (const char *filename, + int page) +{ + FILE *file; + unsigned int flags = 0; + cairo_surface_t *image; + int (*close_cb) (FILE *); + int ret; + + RETRY: + file = cairo_boilerplate_open_any2ppm (filename, page, flags, &close_cb); + if (file == NULL) { + switch (errno) { + case ENOMEM: + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + default: + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_READ_ERROR); + } + } + + image = cairo_boilerplate_image_surface_create_from_ppm_stream (file); + ret = close_cb (file); + /* check for fatal errors from the interpreter */ + if (ret) { /* any2pmm should never die... */ + cairo_surface_destroy (image); + return cairo_boilerplate_surface_create_in_error (CAIRO_STATUS_INVALID_STATUS); + } + + if (ret == 0 && cairo_surface_status (image) == CAIRO_STATUS_READ_ERROR) { + if (flags == 0) { + /* Try again in a standalone process. */ + cairo_surface_destroy (image); + flags = CAIRO_BOILERPLATE_OPEN_NO_DAEMON; + goto RETRY; + } + } + + return image; +} + +int +cairo_boilerplate_version (void) +{ + return CAIRO_VERSION; +} + +const char* +cairo_boilerplate_version_string (void) +{ + return CAIRO_VERSION_STRING; +} + +void +cairo_boilerplate_fini (void) +{ + while (cairo_boilerplate_targets != NULL) { + struct cairo_boilerplate_target_list *next; + + next = cairo_boilerplate_targets->next; + + free (cairo_boilerplate_targets); + cairo_boilerplate_targets = next; + } +} diff --git a/boilerplate/cairo-boilerplate.h b/boilerplate/cairo-boilerplate.h new file mode 100644 index 000000000..515bb03bc --- /dev/null +++ b/boilerplate/cairo-boilerplate.h @@ -0,0 +1,252 @@ +/* + * Copyright © 2004,2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth <cworth@cworth.org> + */ + +#ifndef _CAIRO_BOILERPLATE_H_ +#define _CAIRO_BOILERPLATE_H_ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <cairo.h> +#include <string.h> + +#include "cairo-compiler-private.h" + +#if HAVE_STDINT_H +# include <stdint.h> +#elif HAVE_INTTYPES_H +# include <inttypes.h> +#elif HAVE_SYS_INT_TYPES_H +# include <sys/int_types.h> +#elif defined(_MSC_VER) +# include <stdint.h> + typedef __int8 int8_t; + typedef unsigned __int8 uint8_t; + typedef __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef __int32 int32_t; + typedef unsigned __int32 uint32_t; + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +#else +#error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.) +#endif + +#ifndef HAVE_UINT64_T +# define HAVE_UINT64_T 1 +#endif +#ifndef INT16_MIN +# define INT16_MIN (-32767-1) +#endif +#ifndef INT16_MAX +# define INT16_MAX (32767) +#endif +#ifndef UINT16_MAX +# define UINT16_MAX (65535) +#endif + +#ifndef CAIRO_BOILERPLATE_DEBUG +#define CAIRO_BOILERPLATE_DEBUG(x) +#endif + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#else +#define CAIRO_BOILERPLATE_PRINTF_FORMAT(fmt_index, va_index) +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef ARRAY_LENGTH +#define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) +#endif + +CAIRO_BEGIN_DECLS + +/* A fake format we use for the flattened ARGB output of the PS and + * PDF surfaces. */ +#define CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED ((unsigned int) -1) + +extern const cairo_user_data_key_t cairo_boilerplate_output_basename_key; + +cairo_content_t +cairo_boilerplate_content (cairo_content_t content); + +const char * +cairo_boilerplate_content_name (cairo_content_t content); + +cairo_format_t +cairo_boilerplate_format_from_content (cairo_content_t content); + +typedef enum { + CAIRO_BOILERPLATE_MODE_TEST, + CAIRO_BOILERPLATE_MODE_PERF, + + /* This will allow running performance test with threads. The + * GL backend is very slow on some drivers when run with thread + * awareness turned on. */ + CAIRO_BOILERPLATE_MODE_PERF_THREADS, +} cairo_boilerplate_mode_t; + +typedef cairo_surface_t * +(*cairo_boilerplate_create_surface_t) (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure); + +typedef cairo_surface_t * +(*cairo_boilerplate_create_similar_t) (cairo_surface_t *other, + cairo_content_t content, + int width, + int height); + +typedef void +(*cairo_boilerplate_force_fallbacks_t) (cairo_surface_t *surface, + double x_pixels_per_inch, + double y_pixels_per_inch); + +typedef cairo_status_t +(*cairo_boilerplate_finish_surface_t) (cairo_surface_t *surface); + +typedef cairo_surface_t * +(*cairo_boilerplate_get_image_surface_t) (cairo_surface_t *surface, + int page, + int width, + int height); + +typedef cairo_status_t +(*cairo_boilerplate_write_to_png_t) (cairo_surface_t *surface, + const char *filename); + +typedef void +(*cairo_boilerplate_cleanup_t) (void *closure); + +typedef void +(*cairo_boilerplate_wait_t) (void *closure); + +typedef char * +(*cairo_boilerplate_describe_t) (void *closure); + +typedef struct _cairo_boilerplate_target { + const char *name; + const char *basename; + const char *file_extension; + const char *reference_target; + cairo_surface_type_t expected_type; + cairo_content_t content; + unsigned int error_tolerance; + const char *probe; /* runtime dl check */ + cairo_boilerplate_create_surface_t create_surface; + cairo_boilerplate_create_similar_t create_similar; + cairo_boilerplate_force_fallbacks_t force_fallbacks; + cairo_boilerplate_finish_surface_t finish_surface; + cairo_boilerplate_get_image_surface_t get_image_surface; + cairo_boilerplate_write_to_png_t write_to_png; + cairo_boilerplate_cleanup_t cleanup; + cairo_boilerplate_wait_t synchronize; + cairo_boilerplate_describe_t describe; + cairo_bool_t is_measurable; + cairo_bool_t is_vector; + cairo_bool_t is_recording; +} cairo_boilerplate_target_t; + +const cairo_boilerplate_target_t * +cairo_boilerplate_get_image_target (cairo_content_t content); + +const cairo_boilerplate_target_t * +cairo_boilerplate_get_target_by_name (const char *name, + cairo_content_t content); + +const cairo_boilerplate_target_t ** +cairo_boilerplate_get_targets (int *num_targets, + cairo_bool_t *limited_targets); + +void +cairo_boilerplate_free_targets (const cairo_boilerplate_target_t **targets); + +cairo_surface_t * +_cairo_boilerplate_get_image_surface (cairo_surface_t *src, + int page, + int width, + int height); +cairo_surface_t * +cairo_boilerplate_get_image_surface_from_png (const char *filename, + int width, + int height, + cairo_bool_t flatten); + +cairo_surface_t * +cairo_boilerplate_surface_create_in_error (cairo_status_t status); + +enum { + CAIRO_BOILERPLATE_OPEN_NO_DAEMON = 0x1, +}; + +FILE * +cairo_boilerplate_open_any2ppm (const char *filename, + int page, + unsigned int flags, + int (**close_cb) (FILE *)); + +cairo_surface_t * +cairo_boilerplate_image_surface_create_from_ppm_stream (FILE *file); + +cairo_surface_t * +cairo_boilerplate_convert_to_image (const char *filename, + int page); + +int +cairo_boilerplate_version (void); + +const char* +cairo_boilerplate_version_string (void); + +void +cairo_boilerplate_fini (void); + +#include "cairo-boilerplate-system.h" + +CAIRO_END_DECLS + +#endif diff --git a/boilerplate/check-link.c b/boilerplate/check-link.c new file mode 100644 index 000000000..f16444878 --- /dev/null +++ b/boilerplate/check-link.c @@ -0,0 +1,24 @@ +#define CAIRO_VERSION_H 1 + +#include <cairo-boilerplate.h> + +/* get the "real" version info instead of dummy cairo-version.h */ +#undef CAIRO_VERSION_H +#include "../cairo-version.h" + +#include <stdio.h> + +int +main (void) +{ + printf ("Check linking to the just built cairo boilerplate library\n"); + if (cairo_boilerplate_version () == CAIRO_VERSION) { + return 0; + } else { + fprintf (stderr, + "Error: linked to cairo boilerplate version %s instead of %s\n", + cairo_boilerplate_version_string (), + CAIRO_VERSION_STRING); + return 1; + } +} diff --git a/boilerplate/make-cairo-boilerplate-constructors.sh b/boilerplate/make-cairo-boilerplate-constructors.sh new file mode 100644 index 000000000..09716ca9e --- /dev/null +++ b/boilerplate/make-cairo-boilerplate-constructors.sh @@ -0,0 +1,29 @@ +#! /bin/sh + +if test $# -eq 0; then + echo "$0: no input files." >&2 + exit 0 +fi + +cat <<HERE +/* WARNING: Autogenerated file - see $0! */ + +#include "cairo-boilerplate-private.h" + +void _cairo_boilerplate_register_all (void); + +HERE + +cat "$@" | sed '/^CAIRO_BOILERPLATE/!d; s/CAIRO_BOILERPLATE.*(\(.*\),.*/extern void _register_\1 (void);/' + +cat <<HERE + +void +_cairo_boilerplate_register_all (void) +{ +HERE + +cat "$@" | sed '/^CAIRO_BOILERPLATE/!d; s/CAIRO_BOILERPLATE.*(\(.*\),.*/ _register_\1 ();/' + +echo "}" + diff --git a/build/Makefile.am.analysis b/build/Makefile.am.analysis new file mode 100644 index 000000000..a44077ab4 --- /dev/null +++ b/build/Makefile.am.analysis @@ -0,0 +1,37 @@ +if CAIRO_HAS_LCOV +# use recursive makes in order to ignore errors during check/perf +lcov: + -$(MAKE) $(AM_MAKEFLAGS) check + $(MAKE) $(AM_MAKEFLAGS) genlcov +lcov-perf: + -$(MAKE) $(AM_MAKEFLAGS) perf + $(MAKE) $(AM_MAKEFLAGS) genlcov + +# we have to massage the lcov.info file slightly to hide the effect of libtool +# placing the objects files in the .libs/ directory separate from the *.c +genlcov: + $(LTP) --directory $(top_builddir) --path $(top_builddir) --capture --output-file cairo-lcov.info --test-name CAIRO_TEST --no-checksum + $(SED) -e 's#.libs/##' \ + -e 's#boilerplate/src#src#' \ + -e 's#$(shell pwd)#$(shell cd $(top_srcdir) && pwd)#' \ + < cairo-lcov.info > cairo-lcov.info.tmp + LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory cairo-lcov --title "Cairo Code Coverage" --show-details cairo-lcov.info.tmp + $(RM) cairo-lcov.info.tmp + +html-local: lcov +else +lcov lcov-perf genlcov: + @echo You need to configure Cairo with support for gcov enabled. + @echo e.g, ./configure --enable-gcov +endif + +lcov-clean: +if CAIRO_HAS_LCOV + -$(LTP) --directory $(top_builddir) -z +endif + -$(RM) -r cairo-lcov.info cairo-lcov + -$(FIND) -name '*.gcda' -print | $(XARGS) $(RM) + +distclean-local: lcov-clean + +.PHONY: lcov lcov-perf genlcov lcov-clean diff --git a/build/Makefile.am.changelog b/build/Makefile.am.changelog new file mode 100644 index 000000000..07e603695 --- /dev/null +++ b/build/Makefile.am.changelog @@ -0,0 +1,82 @@ +# Creating ChangeLog files from git log: + +# We always create a ChangeLog that contains the most recent changes, and +# multiple others for changes between major releases (other than the last such +# segment that we put in 'ChangeLog'. The old ones are named +# ChangeLog.pre-X.Y where X.Y is the version number of the major release. + +CURR_CHANGELOG_VERSION=$(CAIRO_VERSION_MAJOR).$$(echo "($(CAIRO_VERSION_MINOR)+1)/2*2" | bc) +# examines $version +PREV_CHANGELOG_VERSION=$$(if test "x$$(echo "($$version-0.1)*2/2"|bc)" = "x$$(echo "$$version*2/2"|bc)"; \ + then echo "$$version-$$(echo "$$version" | sed 's/[0-9]/0/g;s/[0-9]$$/2/')"; \ + else echo "$$version-1.0"; \ + fi | bc | sed 's/[.]0*/./;s/^0[.]\?$$/initial/;s/[.]$$/.0/') + +CHANGELOGS = ChangeLog \ + `version=$(CURR_CHANGELOG_VERSION); \ + version=$(PREV_CHANGELOG_VERSION); \ + while test "x$$version" != xinitial; do \ + echo ChangeLog.pre-$$version; \ + version=$(PREV_CHANGELOG_VERSION); \ + done` + +MAINTAINERCLEANFILES += $(srcdir)/ChangeLog $(srcdir)/ChangeLog.pre-* +DISTCLEANFILES += $(srcdir)/ChangeLog.cache-* + +changelogs: + @$(MAKE) $(AM_MAKEFLAGS) $(CHANGELOGS) + +dist-hook: changelogs + changelogs="$(CHANGELOGS)"; \ + for changelog in $$changelogs; do \ + cp $(srcdir)/$$changelog $(distdir)/ 2>/dev/null || \ + cp $$changelog $(distdir)/; \ + done + +$(srcdir)/ChangeLog: + @if test -d "$(srcdir)/.git"; then \ + version=$(CURR_CHANGELOG_VERSION); \ + prev=$(PREV_CHANGELOG_VERSION).0; \ + nearest_tag=`git describe | sed 's/-.*//'`; \ + before=$(srcdir)/ChangeLog.cache-$$prev..$$nearest_tag; \ + after=$(srcdir)/ChangeLog.cache-$$nearest_tag..; \ + $(MAKE) $(AM_MAKEFLAGS) $$before $$after && \ + echo Creating $@ && \ + { echo '# Generated by configure. Do not edit.'; echo; \ + cat $$after; echo; cat $$before; } > $@; \ + else \ + test -f $@ || \ + (echo A git checkout is required to generate $@ >&2 && \ + echo A git checkout is required to generate this file >> $@); \ + fi + +DISTCLEANFILES += ChangeLog.cache-* + +ChangeLog.cache-*..: .git + +ChangeLog%: $(srcdir)/ChangeLog% + +$(srcdir)/ChangeLog.cache-% $(srcdir)/ChangeLog.pre-%: + @echo Creating $@ + @if test -d "$(srcdir)/.git"; then \ + (cd "$(srcdir)" && \ + version=$$(echo "$@" | sed 's/.*ChangeLog\([.].*-\)\?//'); \ + if echo "$@" | grep -q '^ChangeLog[.]cache'; then \ + spec=$$version; \ + else \ + to=$$version; \ + test "x$$version" = x && version=$(CURR_CHANGELOG_VERSION); \ + from=$(PREV_CHANGELOG_VERSION); \ + test "x$$to" = x || to=$$to.0; \ + test "x$$from" = xinitial || from=$$from.0; \ + spec=$$from..$$to; \ + fi; \ + $(top_srcdir)/build/missing --run git log --stat "$$spec") > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate $@, your $@ may be outdated >&2); \ + else \ + echo A git checkout is required to generate $@ >&2; \ + fi + +.PHONY: changelogs ChangeLog $(srcdir)/ChangeLog diff --git a/build/Makefile.am.common b/build/Makefile.am.common new file mode 100644 index 000000000..b955af58f --- /dev/null +++ b/build/Makefile.am.common @@ -0,0 +1,14 @@ +BUILT_SOURCES = +CLEANFILES = +DISTCLEANFILES = +EXTRA_DIST = +EXTRA_LTLIBRARIES = +EXTRA_PROGRAMS = +MAINTAINERCLEANFILES = +TESTS = +check_PROGRAMS = + +CLEANFILES += *.i *.s *.gch +CLEANFILES += $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) $(check_PROGRAMS) +DISTCLEANFILES += $(BUILT_SOURCES) +MAINTAINERCLEANFILES += Makefile.in diff --git a/build/Makefile.am.gtk-doc b/build/Makefile.am.gtk-doc new file mode 100644 index 000000000..c3d642b09 --- /dev/null +++ b/build/Makefile.am.gtk-doc @@ -0,0 +1,190 @@ +# BEFORE MODIFYING THIS FILE: +# +# This file is a descendant of an old copy of gtk-doc.make, modified for cairo minimally: +# +# - Moved to build/ +# - Made it append to EXTRA_DIST and CLEANFILES +# - Instead of all-local, make "doc" build docs, and err if gtk-doc not enabled +# - Some other changed introduced in 7f114b781f5c530d57530e5f76402e41cdabac6b +# +# Before changing it, check to see if a newer gtk-doc.make has fixed the issue you are facing. +# From time to time, it would be nice to udpate this to the latest copy of gtk-doc.make, but +# please do review all the differences and port our modifications forward. +# + +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +else +GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +EXTRA_DIST += \ + $(content_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES += $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) + +if ENABLE_GTK_DOC +doc: html-build.stamp +else +doc: + @echo "*** gtk-doc must be installed (and --enable-gtk-doc) in order to make doc" + @false +endif + +docs: html-build.stamp + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) $(EXTRA_HFILES) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) --output-dir=$(srcdir) + if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### templates #### + +tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +tmpl/*.sgml: + @true + + +#### xml #### + +# gtkdoc-mkdb is broken and requires a --root-dir=$(srcdir) option +# The _srcdir diversion is fragile but works for make check; make distcheck +sgml-build.stamp: tmpl.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + @echo 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + _srcdir="`pwd`/$(DOC_SOURCE_DIR)"; \ + cd $(srcdir) && gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$$_srcdir --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS) + touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + rm -rf $(srcdir)/html + mkdir $(srcdir)/html + cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + touch html-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +distclean-local: + cd $(srcdir) && \ + rm -rf xml $(REPORT_FILES) \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html + +install-data-local: + -installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- Nothing to install' ; \ + else \ + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + echo '-- Installing $(srcdir)/html/index.sgml' ; \ + $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR) || :; \ + which gtkdoc-rebase >/dev/null && \ + gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR) ; \ + fi + + +uninstall-local: + rm -f $(DESTDIR)$(TARGET_DIR)/* + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed (and --enable-gtk-doc) in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/tmpl + mkdir $(distdir)/xml + mkdir $(distdir)/html + -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + -cp $(srcdir)/xml/*.xml $(distdir)/xml + cp $(srcdir)/html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs diff --git a/build/Makefile.am.releasing b/build/Makefile.am.releasing new file mode 100644 index 000000000..b17faabce --- /dev/null +++ b/build/Makefile.am.releasing @@ -0,0 +1,194 @@ +# Some custom targets to make it easier to release things. +# +# To make real stable releases or devel snapshots, use either: +# make release-check +# or make release-publish +# +# To make a quick properly named (date and git hash stamped) tarball: +# make snapshot + + +TAR_OPTIONS = --owner=0 --group=0 + +dist-hook: dist-clear-sticky-bits + +# Clean up any sticky bits we may inherit from parent dir +dist-clear-sticky-bits: + chmod -R a-s $(distdir) + + +snapshot: + distdir="$(distdir)-`date '+%Y%m%d'`"; \ + test -d "$(srcdir)/.git" && distdir=$$distdir-`cd "$(srcdir)" && git rev-parse HEAD | cut -c 1-6`; \ + TAR_OPTIONS="$(TAR_OPTIONS)" $(MAKE) $(AM_MAKEFLAGS) distdir="$$distdir" snapshot-dist + +snapshot-dist: dist + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' + +RELEASE_OR_SNAPSHOT = $$(if test "x$(CAIRO_VERSION_MINOR)" = "x$$(echo "$(CAIRO_VERSION_MINOR)/2*2" | bc)" ; then echo release; else echo snapshot; fi) +RELEASE_UPLOAD_HOST = cairographics.org +RELEASE_UPLOAD_BASE = /srv/cairo.freedesktop.org/www +RELEASE_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE)/$(RELEASE_OR_SNAPSHOT)s +RELEASE_URL_BASE = http://cairographics.org/$(RELEASE_OR_SNAPSHOT)s +RELEASE_ANNOUNCE_LIST = cairo-announce@cairographics.org (and CC gnome-announce-list@gnome.org) + +MANUAL_VERSIONED = manual-$(VERSION) +MANUAL_TAR_FILE = $(MANUAL_VERSIONED).tar.gz +MANUAL_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE) + +tar_file = $(PACKAGE)-$(VERSION).tar.xz +sha1_file = $(tar_file).sha1 +gpg_file = $(sha1_file).asc + +$(sha1_file): $(tar_file) + sha1sum $^ > $@ + +$(gpg_file): $(sha1_file) + @echo "Please enter your GPG password to sign the checksum." + gpg --armor --sign $^ + +release-verify-sane-changelogs: changelogs + @echo -n "Checking that the ChangeLog files are sane..." + @if grep -q "is required to generate" $(CHANGELOGS); then \ + (echo "Ouch." && echo "Some of the ChangeLogs are not generated correctly." \ + && echo "Remove ChangeLog* and make changelogs" \ + && false); else :; fi + @echo "Good." + +release-verify-sane-tests: + @echo "Checking that the test suite is sane..." + @cd test && $(MAKE) $(AM_MAKEFLAGS) release-verify-sane-tests + +release-verify-even-micro: + @echo -n "Checking that $(VERSION) has an even micro component..." + @test "$(CAIRO_VERSION_MICRO)" = "`echo $(CAIRO_VERSION_MICRO)/2*2 | bc`" \ + || (echo "Ouch." && echo "The version micro component '$(CAIRO_VERSION_MICRO)' is not an even number." \ + && echo "The version in configure.in must be incremented before a new release." \ + && false) + @echo "Good." + +release-verify-newer: + @echo -n "Checking that no $(VERSION) release already exists..." + @ssh $(RELEASE_UPLOAD_HOST) test ! -e $(RELEASE_UPLOAD_DIR)/$(tar_file) \ + || (echo "Ouch." && echo "Found: $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR)/$(tar_file)" \ + && echo "Are you sure you have an updated checkout?" \ + && echo "This should never happen." \ + && false) + @echo "Good." + +release-remove-old: + $(RM) $(tar_file) $(sha1_file) $(gpg_file) + + +# Strict ordering enforced for parallel make to work +release-check: \ + release-verify-even-micro \ + release-verify-sane-changelogs \ + release-verify-sane-tests \ + release-verify-newer \ + $(NULL) + $(MAKE) $(AM_MAKEFLAGS) release-remove-old + TAR_OPTIONS="$(TAR_OPTIONS)" $(MAKE) $(AM_MAKEFLAGS) distcheck + +release-upload: $(tar_file) $(sha1_file) $(gpg_file) + mkdir -p releases + scp $(tar_file) $(sha1_file) $(gpg_file) $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR) + mv $(tar_file) $(sha1_file) $(gpg_file) releases + ssh $(RELEASE_UPLOAD_HOST) "rm -f $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(tar_file) $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-$(VERSION)" + git tag -s -m "cairo $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) release" $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) + +release-publish-message: releases/$(sha1_file) + @echo "Please follow the instructions in RELEASING to push stuff out and" + @echo "send out the announcement mails. Here is the excerpt you need:" + @echo "" + @echo "Subject: $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) now available" + @echo "" + @echo "============================== CUT HERE ==============================" + @echo "A new $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) is now available from:" + @echo "" + @echo " $(RELEASE_URL_BASE)/$(tar_file)" + @echo "" + @echo " which can be verified with:" + @echo "" + @echo " $(RELEASE_URL_BASE)/$(sha1_file)" + @echo -n " " + @cat releases/$(sha1_file) + @echo "" + @echo " $(RELEASE_URL_BASE)/$(gpg_file)" + @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" + @echo "" + @echo " Additionally, a git clone of the source tree:" + @echo "" + @echo " git clone git://git.cairographics.org/git/cairo" + @echo "" + @echo " will include a signed $(VERSION) tag which points to a commit named:" + @echo " `git cat-file tag $(VERSION) | grep ^object | sed -e 's,object ,,'`" + @echo "" + @echo " which can be verified with:" + @echo " git verify-tag $(VERSION)" + @echo "" + @echo " and can be checked out with a command such as:" + @echo " git checkout -b build $(VERSION)" + @echo "" + @echo "============================== CUT HERE ==============================" + +doc-publish-versioned: doc + rm -rf ./$(MANUAL_VERSIONED) + cp -a doc/public/html $(MANUAL_VERSIONED) + tar czf $(MANUAL_TAR_FILE) $(MANUAL_VERSIONED) + scp $(MANUAL_TAR_FILE) $(RELEASE_UPLOAD_HOST):$(MANUAL_UPLOAD_DIR) + ssh $(RELEASE_UPLOAD_HOST) "cd $(MANUAL_UPLOAD_DIR) && tar xzf $(MANUAL_TAR_FILE) && ln -sf $(MANUAL_TAR_FILE) cairo-$(MANUAL_TAR_FILE)" + +doc-publish-symlinks: + ssh $(RELEASE_UPLOAD_HOST) "cd $(MANUAL_UPLOAD_DIR) && rm -f manual && ln -s $(MANUAL_VERSIONED) manual && ln -sf $(MANUAL_TAR_FILE) cairo-manual.tar.gz" + +doc-publish: + $(MAKE) $(AM_MAKEFLAGS) doc-publish-versioned + @if test "$(RELEASE_OR_SNAPSHOT)" = release; then $(MAKE) $(AM_MAKEFLAGS) doc-publish-symlinks; fi + +# Strict ordering enforced for parallel make to work +release-publish: release-check + $(MAKE) $(AM_MAKEFLAGS) release-upload + $(MAKE) $(AM_MAKEFLAGS) doc-publish + $(MAKE) $(AM_MAKEFLAGS) release-publish-message + +if OS_WIN32 + +# Win32 package zipfiles +runtime_zip_file = $(PACKAGE)-$(VERSION).zip +developer_zip_file = $(PACKAGE)-dev-$(VERSION).zip + +$(runtime_zip_file): install + -$(RM) $@ + pwd=`pwd`; cd $(prefix); \ + zip "$$pwd"/$@ bin/libcairo-$(CAIRO_VERSION_SONUM).dll + +$(developer_zip_file): install + -$(RM) $@ + pwd=`pwd`; cd $(prefix); \ + zip -r "$$pwd"/$@ include/cairo lib/libcairo.dll.a lib/cairo.lib lib/pkgconfig/cairo.pc lib/pkgconfig/cairo-*.pc share/gtk-doc/html/cairo + +zips: $(runtime_zip_file) $(developer_zip_file) + +endif + + +.PHONY: \ + dist-clear-sticky-bits \ + doc-publish \ + doc-publish-symlinks \ + doc-publish-versioned \ + release-check \ + release-publish \ + release-publish-message \ + release-remove-old \ + release-upload \ + release-verify-even-micro \ + release-verify-newer \ + release-verify-sane-changelogs \ + release-verify-sane-tests \ + snapshot \ + snapshot-dist \ + $(NULL) diff --git a/build/Makefile.win32.common b/build/Makefile.win32.common new file mode 100644 index 000000000..7d7e9735f --- /dev/null +++ b/build/Makefile.win32.common @@ -0,0 +1,74 @@ +default: all + +# +# Edit build/Makefile.win32.features to enable features to build +# +include $(top_srcdir)/build/Makefile.win32.inform +include $(top_srcdir)/build/Makefile.win32.features +include $(top_srcdir)/build/Makefile.win32.features-h + +ifeq ($(top_builddir),) +top_builddir = $(top_srcdir) +endif + +CC := cl +LD := link +AR := lib + +ifeq ($(CFG),debug) +CFG_CFLAGS := -MDd -Od -Zi +CFG_LDFLAGS := -DEBUG +else +CFG_CFLAGS := -MD -O2 +CFG_LDFLAGS := +endif + +ifeq ($(PIXMAN_PATH),) +PIXMAN_PATH := $(top_builddir)/../pixman +endif +PIXMAN_CFLAGS := -I$(PIXMAN_PATH)/pixman/ +PIXMAN_LIBS := $(PIXMAN_PATH)/pixman/$(CFG)/pixman-1.lib + +CAIRO_LIBS = gdi32.lib msimg32.lib user32.lib + +ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1) +ifeq ($(LIBPNG_PATH),) +LIBPNG_PATH := $(top_builddir)/../libpng +endif +LIBPNG_CFLAGS += -I$(LIBPNG_PATH)/ +CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib +endif + +ifeq ($(CAIRO_HAS_PS_SURFACE)$(CAIRO_HAS_PDF_SURFACE),00) +else +ifeq ($(ZLIB_PATH),) +ZLIB_PATH := $(top_builddir)/../zlib +endif +ZLIB_CFLAGS += -I$(ZLIB_PATH)/ +CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib +endif + +DEFAULT_CFLAGS = -nologo $(CFG_CFLAGS) +DEFAULT_CFLAGS += -I. -I$(top_srcdir) -I$(top_srcdir)/src +DEFAULT_CFLAGS += $(PIXMAN_CFLAGS) $(LIBPNG_CFLAGS) $(ZLIB_CFLAGS) + +CAIRO_CFLAGS = $(DEFAULT_CFLAGS) $(CFLAGS) + +DEFAULT_LDFLAGS = -nologo $(CFG_LDFLAGS) +DEFAULT_ARFLAGS = -nologo + +CAIRO_LDFLAGS = $(DEFAULT_LDFLAGS) $(LDFLAGS) +CAIRO_ARFLAGS = $(DEFAULT_ARFLAGS) $(LDFLAGS) + +# Some generic rules + +$(CFG)/%.obj: %.c $(top_srcdir)/src/cairo-features.h + @mkdir -p $(CFG)/`dirname $<` + @$(CC) $(CAIRO_CFLAGS) -c -Fo"$@" $< + +$(CFG)/%-static.obj: %.c $(top_srcdir)/src/cairo-features.h + @mkdir -p $(CFG)/`dirname $<` + @$(CC) $(CAIRO_CFLAGS) -c -DCAIRO_WIN32_STATIC_BUILD=1 -Fo"$@" $< + +clean: + @rm -f $(CFG)/*.obj $(CFG)/*.dll $(CFG)/*.lib $(CFG)/*.pdb $(CFG)/*.ilk || exit 0 diff --git a/build/Makefile.win32.features b/build/Makefile.win32.features new file mode 100644 index 000000000..8cb155dc0 --- /dev/null +++ b/build/Makefile.win32.features @@ -0,0 +1,41 @@ +# Generated by configure. Modify to customize. + +CAIRO_HAS_XLIB_SURFACE=0 +CAIRO_HAS_XLIB_XRENDER_SURFACE=0 +CAIRO_HAS_XCB_SURFACE=0 +CAIRO_HAS_XLIB_XCB_FUNCTIONS=0 +CAIRO_HAS_XCB_SHM_FUNCTIONS=0 +CAIRO_HAS_QT_SURFACE=0 +CAIRO_HAS_QUARTZ_SURFACE=0 +CAIRO_HAS_QUARTZ_FONT=0 +CAIRO_HAS_QUARTZ_IMAGE_SURFACE=0 +CAIRO_HAS_WIN32_SURFACE=1 +CAIRO_HAS_WIN32_FONT=1 +CAIRO_HAS_SKIA_SURFACE=0 +CAIRO_HAS_OS2_SURFACE=0 +CAIRO_HAS_BEOS_SURFACE=0 +CAIRO_HAS_DRM_SURFACE=0 +CAIRO_HAS_GALLIUM_SURFACE=0 +CAIRO_HAS_PNG_FUNCTIONS=1 +CAIRO_HAS_GL_SURFACE=0 +CAIRO_HAS_GLESV2_SURFACE=0 +CAIRO_HAS_COGL_SURFACE=0 +CAIRO_HAS_DIRECTFB_SURFACE=0 +CAIRO_HAS_VG_SURFACE=0 +CAIRO_HAS_EGL_FUNCTIONS=0 +CAIRO_HAS_GLX_FUNCTIONS=0 +CAIRO_HAS_WGL_FUNCTIONS=0 +CAIRO_HAS_SCRIPT_SURFACE=1 +CAIRO_HAS_FT_FONT=0 +CAIRO_HAS_FC_FONT=0 +CAIRO_HAS_PS_SURFACE=1 +CAIRO_HAS_PDF_SURFACE=1 +CAIRO_HAS_SVG_SURFACE=1 +CAIRO_HAS_TEST_SURFACES=0 +CAIRO_HAS_TEE_SURFACE=0 +CAIRO_HAS_XML_SURFACE=0 +CAIRO_HAS_PTHREAD=0 +CAIRO_HAS_GOBJECT_FUNCTIONS=0 +CAIRO_HAS_TRACE=0 +CAIRO_HAS_INTERPRETER=1 +CAIRO_HAS_SYMBOL_LOOKUP=0 diff --git a/build/Makefile.win32.features-h b/build/Makefile.win32.features-h new file mode 100644 index 000000000..13904cfa9 --- /dev/null +++ b/build/Makefile.win32.features-h @@ -0,0 +1,130 @@ +# Generated by configure. Do not edit. + +$(top_srcdir)/src/cairo-features.h: $(top_srcdir)/build/Makefile.win32.features + @echo "Generating src/cairo-features.h" + @echo "/* Generated by Makefile.win32.features-h. Do not edit. */" > $(top_srcdir)/src/cairo-features.h + @echo "#ifndef CAIRO_FEATURES_H" >> $(top_srcdir)/src/cairo-features.h + @echo "#define CAIRO_FEATURES_H 1" >> $(top_srcdir)/src/cairo-features.h +ifeq ($(CAIRO_HAS_XLIB_SURFACE),1) + @echo "#define CAIRO_HAS_XLIB_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1) + @echo "#define CAIRO_HAS_XLIB_XRENDER_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_XCB_SURFACE),1) + @echo "#define CAIRO_HAS_XCB_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1) + @echo "#define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1) + @echo "#define CAIRO_HAS_XCB_SHM_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_QT_SURFACE),1) + @echo "#define CAIRO_HAS_QT_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1) + @echo "#define CAIRO_HAS_QUARTZ_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_QUARTZ_FONT),1) + @echo "#define CAIRO_HAS_QUARTZ_FONT 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1) + @echo "#define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_WIN32_SURFACE),1) + @echo "#define CAIRO_HAS_WIN32_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_WIN32_FONT),1) + @echo "#define CAIRO_HAS_WIN32_FONT 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_SKIA_SURFACE),1) + @echo "#define CAIRO_HAS_SKIA_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_OS2_SURFACE),1) + @echo "#define CAIRO_HAS_OS2_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_BEOS_SURFACE),1) + @echo "#define CAIRO_HAS_BEOS_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_DRM_SURFACE),1) + @echo "#define CAIRO_HAS_DRM_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1) + @echo "#define CAIRO_HAS_GALLIUM_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1) + @echo "#define CAIRO_HAS_PNG_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_GL_SURFACE),1) + @echo "#define CAIRO_HAS_GL_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1) + @echo "#define CAIRO_HAS_GLESV2_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_COGL_SURFACE),1) + @echo "#define CAIRO_HAS_COGL_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1) + @echo "#define CAIRO_HAS_DIRECTFB_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_VG_SURFACE),1) + @echo "#define CAIRO_HAS_VG_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1) + @echo "#define CAIRO_HAS_EGL_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1) + @echo "#define CAIRO_HAS_GLX_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1) + @echo "#define CAIRO_HAS_WGL_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1) + @echo "#define CAIRO_HAS_SCRIPT_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_FT_FONT),1) + @echo "#define CAIRO_HAS_FT_FONT 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_FC_FONT),1) + @echo "#define CAIRO_HAS_FC_FONT 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_PS_SURFACE),1) + @echo "#define CAIRO_HAS_PS_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_PDF_SURFACE),1) + @echo "#define CAIRO_HAS_PDF_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_SVG_SURFACE),1) + @echo "#define CAIRO_HAS_SVG_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_TEST_SURFACES),1) + @echo "#define CAIRO_HAS_TEST_SURFACES 1" >> $(top_srcdir)/src/cairo-features.h +endif + @echo "#define CAIRO_HAS_IMAGE_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h + @echo "#define CAIRO_HAS_MIME_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h + @echo "#define CAIRO_HAS_RECORDING_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h + @echo "#define CAIRO_HAS_OBSERVER_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +ifeq ($(CAIRO_HAS_TEE_SURFACE),1) + @echo "#define CAIRO_HAS_TEE_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_XML_SURFACE),1) + @echo "#define CAIRO_HAS_XML_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h +endif + @echo "#define CAIRO_HAS_USER_FONT 1" >> $(top_srcdir)/src/cairo-features.h +ifeq ($(CAIRO_HAS_PTHREAD),1) + @echo "#define CAIRO_HAS_PTHREAD 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1) + @echo "#define CAIRO_HAS_GOBJECT_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_TRACE),1) + @echo "#define CAIRO_HAS_TRACE 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_INTERPRETER),1) + @echo "#define CAIRO_HAS_INTERPRETER 1" >> $(top_srcdir)/src/cairo-features.h +endif +ifeq ($(CAIRO_HAS_SYMBOL_LOOKUP),1) + @echo "#define CAIRO_HAS_SYMBOL_LOOKUP 1" >> $(top_srcdir)/src/cairo-features.h +endif + @echo "#endif" >> $(top_srcdir)/src/cairo-features.h diff --git a/build/Makefile.win32.inform b/build/Makefile.win32.inform new file mode 100644 index 000000000..ba1116505 --- /dev/null +++ b/build/Makefile.win32.inform @@ -0,0 +1,13 @@ +inform: + @echo +ifneq ($(CFG),release) +ifneq ($(CFG),debug) + @echo "Invalid configuration "$(CFG)" specified." + @echo -n "You must specify a configuration when " + @echo "running make, e.g. make CFG=debug" + @echo + @echo -n "Possible choices for configuration are " + @echo "'release' and 'debug'" + @exit 1 +endif +endif diff --git a/build/aclocal.cairo.m4 b/build/aclocal.cairo.m4 new file mode 100644 index 000000000..2f4873b04 --- /dev/null +++ b/build/aclocal.cairo.m4 @@ -0,0 +1,216 @@ +dnl ========================================================================== +dnl +dnl Cairo-specific macros +dnl + +dnl ========================================================================== + +dnl Usage: +dnl CAIRO_BIGENDIAN +dnl +AC_DEFUN([CAIRO_BIGENDIAN], +[dnl + case $host_os in + darwin*) + AH_VERBATIM([X_BYTE_ORDER], +[ +/* Deal with multiple architecture compiles on Mac OS X */ +#ifdef __APPLE_CC__ +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define FLOAT_WORDS_BIGENDIAN 1 +#else +#undef WORDS_BIGENDIAN +#undef FLOAT_WORDS_BIGENDIAN +#endif +#endif +]) + ;; + *) + AC_C_BIGENDIAN + AX_C_FLOAT_WORDS_BIGENDIAN + ;; + esac +]) + +dnl CAIRO_CHECK_FUNCS_WITH_FLAGS(FUNCTION..., CFLAGS, LIBS +dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Like AC_CHECK_FUNCS but with additional CFLAGS and LIBS +dnl -------------------------------------------------------------------- +AC_DEFUN([CAIRO_CHECK_FUNCS_WITH_FLAGS], +[dnl + _save_cflags="$CFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $2" + LIBS="$LIBS $3" + AC_CHECK_FUNCS($1, $4, $5) + CFLAGS="$_save_cflags" + LIBS="$_save_libs" +]) + +dnl CAIRO_CONFIG_COMMANDS is like AC_CONFIG_COMMANDS, except that: +dnl +dnl 1) It redirects the stdout of the command to the file. +dnl 2) It does not recreate the file if contents didn't change. +dnl +AC_DEFUN([CAIRO_CONFIG_COMMANDS], +[dnl + AC_CONFIG_COMMANDS($1, + [ + _config_file=$1 + _tmp_file=cairoconf.tmp + AC_MSG_NOTICE([creating $_config_file]) + { + $2 + } >> "$_tmp_file" || + AC_MSG_ERROR([failed to write to $_tmp_file]) + + if cmp -s "$_tmp_file" "$_config_file"; then + AC_MSG_NOTICE([$_config_file is unchanged]) + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + AC_MSG_ERROR([failed to update $_config_file]) + fi + ], $3) +]) + +dnl CAIRO_CC_TRY_LINK_WITH_ENV_SILENT(env-setup, program, +dnl true-action, false-action) +dnl +dnl Compile and link the program with the given environment setup. +dnl The global cairo_cc_flag is set to "yes" or "no" according as +dnl the link succeeded or not. The link step must complete without +dnl warnings or errors to stderr. +dnl +dnl Perform true-action on success and false-action on failure. +dnl The values of CFLAGS, LIBS, LDFLAGS are saved before env-setup +dnl is executed and restored right before the end of the macro. +AC_DEFUN([CAIRO_CC_TRY_LINK_WITH_ENV_SILENT],[dnl + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program="$2"' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + $1 + AC_LINK_IFELSE( + [AC_LANG_SOURCE([$_compile_program])], + [cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes], + [cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no]) + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + ifelse([$3], , :, [$3]) + else + ifelse([$4], , :, [$4]) + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" +]) + +dnl check compiler flags with a program and no muttering. +AC_DEFUN([CAIRO_CC_TRY_FLAG_SILENT], +[dnl (flags..., optional program, true-action, false-action) + CAIRO_CC_TRY_LINK_WITH_ENV_SILENT([CFLAGS="$CFLAGS $1"], + [$2], [$3], [$4]) +]) + +dnl find a -Werror equivalent +AC_DEFUN([CAIRO_CC_CHECK_WERROR], +[dnl + _test_WERROR=${WERROR+set} + if test "z$_test_WERROR" != zset; then + WERROR="" + for _werror in -Werror -errwarn; do + AC_MSG_CHECKING([whether $CC supports $_werror]) + CAIRO_CC_TRY_FLAG_SILENT( + [$_werror],, + [WERROR="$WERROR $_werror"], + [:]) + AC_MSG_RESULT($cairo_cc_flag) + done + fi +]) + +dnl check compiler flags possibly using -Werror if available. +AC_DEFUN([CAIRO_CC_TRY_FLAG], +[dnl (flags..., optional program, true-action, false-action) + CAIRO_CC_CHECK_WERROR + AC_MSG_CHECKING([whether $CC supports $1]) + CAIRO_CC_TRY_FLAG_SILENT([$WERROR $1], [$2], [$3], [$4]) + AC_MSG_RESULT([$cairo_cc_flag]) +]) + +dnl Usage: +dnl CAIRO_CHECK_NATIVE_ATOMIC_PRIMITIVES +AC_DEFUN([CAIRO_CHECK_NATIVE_ATOMIC_PRIMITIVES], +[dnl + AC_CACHE_CHECK([for native atomic primitives], cairo_cv_atomic_primitives, + [ + cairo_cv_atomic_primitives="none" + + AC_TRY_LINK([ +int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); } +int atomic_cmpxchg(int i, int j, int k) { return __sync_val_compare_and_swap (&i, j, k); } +], [], + cairo_cv_atomic_primitives="Intel" + ) + + if test "x$cairo_cv_atomic_primitives" = "xnone"; then + AC_CHECK_HEADER([atomic_ops.h], + cairo_cv_atomic_primitives="libatomic-ops") + fi + + if test "x$cairo_cv_atomic_primitives" = "xnone"; then + AC_CHECK_HEADER([libkern/OSAtomic.h], + cairo_cv_atomic_primitives="OSAtomic") + fi + ]) + if test "x$cairo_cv_atomic_primitives" = xIntel; then + AC_DEFINE(HAVE_INTEL_ATOMIC_PRIMITIVES, 1, + [Enable if your compiler supports the Intel __sync_* atomic primitives]) + fi + + if test "x$cairo_cv_atomic_primitives" = "xlibatomic-ops"; then + AC_DEFINE(HAVE_LIB_ATOMIC_OPS, 1, + [Enable if you have libatomic-ops-dev installed]) + fi + + if test "x$cairo_cv_atomic_primitives" = xOSAtomic; then + AC_DEFINE(HAVE_OS_ATOMIC_OPS, 1, + [Enable if you have MacOS X atomic operations]) + fi +]) + +dnl Usage: +dnl CAIRO_CHECK_ATOMIC_OP_NEEDS_MEMORY_BARRIER +AC_DEFUN([CAIRO_CHECK_ATOMIC_OP_NEEDS_MEMORY_BARRIER], +[dnl + AC_CACHE_CHECK([whether atomic ops require a memory barrier], cairo_cv_atomic_op_needs_memory_barrier, + [ + case $host_cpu in + i?86) cairo_cv_atomic_op_needs_memory_barrier="no" ;; + x86_64) cairo_cv_atomic_op_needs_memory_barrier="no" ;; + arm*) cairo_cv_atomic_op_needs_memory_barrier="no" ;; + *) cairo_cv_atomic_op_needs_memory_barrier="yes" ;; + esac + ]) + if test "x$cairo_cv_atomic_op_needs_memory_barrier" = "xyes"; then + AC_DEFINE_UNQUOTED(ATOMIC_OP_NEEDS_MEMORY_BARRIER, 1, + [whether memory barriers are needed around atomic operations]) + fi +]) + +AC_DEFUN([CAIRO_TEXT_WRAP], [m4_text_wrap([$1], [$2],, 78)]) diff --git a/build/aclocal.compare.m4 b/build/aclocal.compare.m4 new file mode 100644 index 000000000..bd6c51b28 --- /dev/null +++ b/build/aclocal.compare.m4 @@ -0,0 +1,162 @@ +dnl @synopsis AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +dnl +dnl This macro compares two version strings. It is used heavily in the +dnl macro _AX_PATH_BDB for library checking. Due to the various number +dnl of minor-version numbers that can exist, and the fact that string +dnl comparisons are not compatible with numeric comparisons, this is +dnl not necessarily trivial to do in a autoconf script. This macro +dnl makes doing these comparisons easy. +dnl +dnl The six basic comparisons are available, as well as checking +dnl equality limited to a certain number of minor-version levels. +dnl +dnl The operator OP determines what type of comparison to do, and can +dnl be one of: +dnl +dnl eq - equal (test A == B) +dnl ne - not equal (test A != B) +dnl le - less than or equal (test A <= B) +dnl ge - greater than or equal (test A >= B) +dnl lt - less than (test A < B) +dnl gt - greater than (test A > B) +dnl +dnl Additionally, the eq and ne operator can have a number after it to +dnl limit the test to that number of minor versions. +dnl +dnl eq0 - equal up to the length of the shorter version +dnl ne0 - not equal up to the length of the shorter version +dnl eqN - equal up to N sub-version levels +dnl neN - not equal up to N sub-version levels +dnl +dnl When the condition is true, shell commands ACTION-IF-TRUE are run, +dnl otherwise shell commands ACTION-IF-FALSE are run. The environment +dnl variable 'ax_compare_version' is always set to either 'true' or +dnl 'false' as well. +dnl +dnl Examples: +dnl +dnl AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) +dnl AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) +dnl +dnl would both be true. +dnl +dnl AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) +dnl AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) +dnl +dnl would both be false. +dnl +dnl AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) +dnl +dnl would be true because it is only comparing two minor versions. +dnl +dnl AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) +dnl +dnl would be true because it is only comparing the lesser number of +dnl minor versions of the two values. +dnl +dnl Note: The characters that separate the version numbers do not +dnl matter. An empty string is the same as version 0. OP is evaluated +dnl by autoconf, not configure, so must be a string, not a variable. +dnl +dnl The author would like to acknowledge Guido Draheim whose advice +dnl about the m4_case and m4_ifvaln functions make this macro only +dnl include the portions necessary to perform the specific comparison +dnl specified by the OP argument in the final configure script. +dnl +dnl @category Misc +dnl @author Tim Toolan <toolan@ele.uri.edu> +dnl @version 2004-03-01 +dnl @license GPLWithACException + +dnl ######################################################################### +AC_DEFUN([AX_COMPARE_VERSION], [ + # Used to indicate true or false condition + ax_compare_version=false + + # Convert the two version strings to be compared into a format that + # allows a simple string comparison. The end result is that a version + # string of the form 1.12.5-r617 will be converted to the form + # 0001001200050617. In other words, each number is zero padded to four + # digits, and non digits are removed. + AS_VAR_PUSHDEF([A],[ax_compare_version_A]) + A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ + -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/[[^0-9]]//g'` + + AS_VAR_PUSHDEF([B],[ax_compare_version_B]) + B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ + -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ + -e 's/[[^0-9]]//g'` + + dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary + dnl # then the first line is used to determine if the condition is true. + dnl # The sed right after the echo is to remove any indented white space. + m4_case(m4_tolower($2), + [lt],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` + ], + [gt],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` + ], + [le],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` + ], + [ge],[ + ax_compare_version=`echo "x$A +x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` + ],[ + dnl Split the operator from the subversion count if present. + m4_bmatch(m4_substr($2,2), + [0],[ + # A count of zero means use the length of the shorter version. + # Determine the number of characters in A and B. + ax_compare_version_len_A=`echo "$A" | awk '{print(length)}'` + ax_compare_version_len_B=`echo "$B" | awk '{print(length)}'` + + # Set A to no more than B's length and B to no more than A's length. + A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` + B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` + ], + [[0-9]+],[ + # A count greater than zero means use only that many subversions + A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` + B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` + ], + [.+],[ + AC_WARNING( + [illegal OP numeric parameter: $2]) + ],[]) + + # Pad zeros at end of numbers to make same length. + ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" + B="$B`echo $A | sed 's/./0/g'`" + A="$ax_compare_version_tmp_A" + + # Check for equality or inequality as necessary. + m4_case(m4_tolower(m4_substr($2,0,2)), + [eq],[ + test "x$A" = "x$B" && ax_compare_version=true + ], + [ne],[ + test "x$A" != "x$B" && ax_compare_version=true + ],[ + AC_WARNING([illegal OP parameter: $2]) + ]) + ]) + + AS_VAR_POPDEF([A])dnl + AS_VAR_POPDEF([B])dnl + + dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. + if test "$ax_compare_version" = "true" ; then + m4_ifvaln([$4],[$4],[:])dnl + m4_ifvaln([$5],[else $5])dnl + fi +]) dnl AX_COMPARE_VERSION diff --git a/build/aclocal.enable.m4 b/build/aclocal.enable.m4 new file mode 100644 index 000000000..f3522b983 --- /dev/null +++ b/build/aclocal.enable.m4 @@ -0,0 +1,409 @@ +dnl +dnl These are the facilities for enable/disabling various features, +dnl and for collecting CFLAGS/LIBS and generating per feature .pc +dnl files, assembling list of source files to compile, creating +dnl cairo-features.h and other generated files, etc... +dnl + +dnl =========================================================================== + +dnl +dnl Define a macro to enable features +dnl - Macro: _CAIRO_ENABLE (ID, NAME, WHAT, DEFAULT, COMMANDS) +dnl +dnl where: +dnl +dnl ID is the sub-namespace in function names, eg. "ft" for cairo_ft_... +dnl NAME is the human-readable name of the feature, eg. "FreeType font" +dnl WHAT is the type of feature: +dnl "surface" for surface backends +dnl "font" for font backends +dnl "functions" for set of functions +dnl "" for private configurations +dnl DEFAULT is the default state of the feature: +dnl "no" for experimental features, eg. your favorite new backend +dnl "yes" for recommended features, eg. png functions +dnl "auto" for other supported features, eg. xlib surface backend +dnl "always" for mandatory features (can't be disabled), eg. image surface backend +dnl COMMANDS are run to check whether the feature can be enabled. +dnl They should set use_$(ID) to something other than yes if the +dnl feature cannot be built, eg. "no (requires SomeThing)". It then +dnl should also set $(ID)_REQUIRES/CFLAGS/LIBS/... +dnl appropriately. Look at the macro definition for more details, +dnl or ask if in doubt. +dnl +AC_DEFUN([_CAIRO_ENABLE], +[dnl + dnl Sanity check ID + m4_if( + [$1], + m4_tolower(AS_TR_SH([$1])), + , + [m4_fatal([invalid feature name `$1'])] + )dnl + m4_pushdef([cr_feature], [$1])dnl + m4_pushdef([cr_feature_name], m4_normalize([$2]))dnl + m4_pushdef([cr_feature_what], m4_normalize([$3]))dnl + m4_pushdef([cr_feature_default], m4_normalize([$4]))dnl + m4_pushdef([cr_feature_commands], [$5])dnl + dnl + m4_pushdef([cr_feature_arg], m4_translit([$1],_,-))dnl + dnl + dnl Sanity check default + m4_case( + cr_feature_default, + [no],, + [yes],, + [auto],, + [always],, + [m4_fatal([Invalid default value `]cr_feature_default[' for feature `]cr_feature['])] + )dnl + dnl + m4_if(cr_feature_default, [always], + [dnl + enable_$1=yes + ],[dnl + AC_ARG_ENABLE(cr_feature_arg, + AS_HELP_STRING([--enable-]cr_feature_arg[=@<:@no/auto/yes@:>@], + [Enable cairo's ]cr_feature_name[ feature @<:@default=]cr_feature_default[@:>@]), + enable_$1=$enableval, enable_$1=cr_feature_default) + ])dnl + dnl + AS_CASE([$enable_$1], + [no],[dnl + use_$1="no (disabled, use --enable-cr_feature_arg to enable)" + ],dnl + [yes|auto],[dnl + AC_MSG_CHECKING([for cairo's ]cr_feature_name[ feature]) + echo + + use_[]$1=yes + CAIRO_FEATURE_VARS_FOREACH(cr_var, [cr_feature[_]cr_var[=]_CAIRO_SH_ESCAPE_UNQUOTED(m4_do([cr_var_default_]cr_var[_value]))]m4_newline) + + cr_feature_commands + + AC_MSG_CHECKING([whether cairo's ]cr_feature_name[ feature could be enabled]) + AC_MSG_RESULT([$use_$1]) + + AS_IF([test "x$enable_$1" = "xyes" -a "x$use_$1" != xyes], + [dnl + AC_MSG_ERROR( + m4_case(cr_feature_default, + [always], [mandatory], + [yes], [recommended], + , [requested] + ) cr_feature_name[ feature could not be enabled]) + ])dnl + ],dnl + [dnl + AC_MSG_ERROR([invalid argument passed to --enable-]cr_feature_arg[: `$use_$1', should be one of @<:@no/auto/yes@:>@]) + ])dnl + + AS_IF([test "x$use_$1" = "xyes"], + [dnl + CAIRO_ACCUMULATED_FEATURE_VARS_FOREACH([cr_var], + [dnl + CAIRO_ACCUMULATE_UNQUOTED_BEFORE(cr_var, [$]cr_feature[_]cr_var) + ])dnl + ],[dnl + dnl If not enabled, empty the vars so no one accidentally uses them. + CAIRO_FEATURE_VARS_FOREACH([cr_var], [unset cr_feature[_]cr_var]m4_newline) + ])dnl + + _CAIRO_FEATURE_HOOKS(cr_feature, cr_feature_name, cr_feature_default, cr_feature_what)dnl + + m4_popdef([cr_feature])dnl + m4_popdef([cr_feature_name])dnl + m4_popdef([cr_feature_what])dnl + m4_popdef([cr_feature_default])dnl + m4_popdef([cr_feature_commands])dnl + m4_popdef([cr_feature_arg])dnl +]) + + +dnl =========================================================================== + +m4_define([_CAIRO_FEATURE_VARS]) + +dnl +dnl CAIRO_FEATURE_VARS_REGISTER(VARS, DEFAULT-VALUE=[]) +dnl +dnl Registers variables to be collected from feature-enabling code segments. +dnl VARS should be a whitespace-separate list of variable names. +dnl +dnl DEFAULT-VALUE is m4 macros to set default value of VARS +dnl +AC_DEFUN([CAIRO_FEATURE_VARS_REGISTER], +[dnl + m4_foreach_w([cr_var], [$1], + [m4_append_uniq([_CAIRO_FEATURE_VARS], cr_var, [ ],, + [m4_fatal([Feature variable `]cr_var[' already registered])])])dnl + m4_foreach_w([cr_var], [$1], + [dnl + m4_define([cr_var_default_]cr_var[_value], m4_default([$2],[[$ac_env_[]]cr_feature[[]_]]cr_var[[_value]]))dnl + ])dnl +]) + +dnl +dnl CAIRO_FEATURE_VARS_FOREACH(VAR, COMMANDS) +dnl +dnl Run COMMANDS for each registered feature variable. +dnl Defines VAR to the variable being processed. +dnl +AC_DEFUN([CAIRO_FEATURE_VARS_FOREACH], +[dnl + m4_foreach_w([$1], _CAIRO_FEATURE_VARS, [$2])dnl +]) + + +dnl =========================================================================== + +m4_define([_CAIRO_ACCUMULATORS])dnl + +m4_define([_CAIRO_ACCUMULATORS_REGISTER], +[dnl + m4_foreach_w([cr_var], [$1], + [m4_append_uniq([_CAIRO_ACCUMULATORS], cr_var, [ ],, + [m4_fatal([Accumulator `]cr_var[' already registered])])])dnl + m4_foreach_w([cr_var], [$1], [m4_define([cr_acc_]cr_var[_sep], [$2])])dnl + m4_foreach_w([cr_var], [$1], [[CAIRO_]cr_var[=$3]]m4_newline)dnl + m4_foreach_w([cr_var], [$1], [m4_pattern_allow([CAIRO_]cr_var)])dnl +])dnl + +m4_define([_CAIRO_SH_ESCAPE],['m4_bpatsubst([$1],['],[\\'])'])dnl +m4_define([_CAIRO_SH_ESCAPE_UNQUOTED],["m4_bpatsubst([$1],["],[\\"])"])dnl + +dnl +dnl CAIRO_ACCUMULATORS_REGISTER(VARS, SEPARATOR=[], INITIAL-VALUE=[]) +dnl +dnl Registers accumulators. An accumulator is a shell variable that can +dnl be accumulated to. The macros take care of adding a SEPARATOR between +dnl accumulated values. +dnl +dnl VARS should be a whitespace-separate list of variable names. The actual +dnl shell variable resulting for each variable is prefixed with CAIRO_. +dnl +AC_DEFUN([CAIRO_ACCUMULATORS_REGISTER], +[dnl + _CAIRO_ACCUMULATORS_REGISTER([$1],[$2],_CAIRO_SH_ESCAPE([$3]))dnl +])dnl + +dnl +dnl Like CAIRO_ACCUMULATORS_REGISTER but INITIAL-VALUE is left unquoted, +dnl so it can reference other shell variables for example. +dnl +AC_DEFUN([CAIRO_ACCUMULATORS_REGISTER_UNQUOTED], +[dnl + _CAIRO_ACCUMULATORS_REGISTER([$1],[$2],_CAIRO_SH_ESCAPE_UNQUOTED([$3]))dnl +])dnl + +m4_define([_CAIRO_ACCUMULATOR_CHECK], +[dnl + m4_ifdef([cr_acc_$1_sep],,[m4_fatal([Accumulator `]$1[' not defined.])])dnl +])dnl + +m4_define([_CAIRO_ACCUMULATE], +[dnl + _CAIRO_ACCUMULATOR_CHECK([$1])dnl + m4_ifval([$2], [$3]m4_newline)dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATE(VAR, VALUE) +dnl +dnl Appends VALUE to accumulator VAR +dnl +AC_DEFUN([CAIRO_ACCUMULATE], +[dnl + _CAIRO_ACCUMULATE([$1], [$2], [CAIRO_$1="${CAIRO_$1}]m4_do([cr_acc_$1_sep])["_CAIRO_SH_ESCAPE([$2])])dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATE_BEFORE(VAR, VALUE) +dnl +dnl Prepends VALUE to accumulator VAR +dnl +AC_DEFUN([CAIRO_ACCUMULATE_BEFORE], +[dnl + _CAIRO_ACCUMULATE([$1], [$2], [CAIRO_$1=_CAIRO_SH_ESCAPE([$2])"]m4_do([cr_acc_$1_sep])[${CAIRO_$1}"])dnl +])dnl + +m4_define([_CAIRO_ACCUMULATE_UNQUOTED], +[dnl + _CAIRO_ACCUMULATOR_CHECK([$1])dnl + m4_ifval([$2], [m4_bmatch([$2],[[$]],[test -n "$2" &&]) $3]m4_newline)dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATE_UNQUOTED(VAR, VALUE) +dnl +dnl Like CAIRO_ACCUMULATE but VALUE is left unquoted, +dnl so it can reference other shell variables for example. +dnl +AC_DEFUN([CAIRO_ACCUMULATE_UNQUOTED], +[dnl + _CAIRO_ACCUMULATE_UNQUOTED([$1], [$2], [CAIRO_$1="${CAIRO_$1}]m4_do([cr_acc_$1_sep])["]_CAIRO_SH_ESCAPE_UNQUOTED([$2]))dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATE_UNQUOTED_BEFORE(VAR, VALUE) +dnl +dnl Like CAIRO_ACCUMULATE_BEFORE but VALUE is left unquoted, +dnl so it can reference other shell variables for example. +dnl +AC_DEFUN([CAIRO_ACCUMULATE_UNQUOTED_BEFORE], +[dnl + _CAIRO_ACCUMULATE_UNQUOTED([$1], [$2], [CAIRO_$1=]_CAIRO_SH_ESCAPE_UNQUOTED([$2])["]m4_do([cr_acc_$1_sep])[${CAIRO_$1}"])dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATE_UNQUOTED_UNCHECKED(VAR, VALUE) +dnl +dnl Like CAIRO_ACCUMULATE_UNQUOTED but VALUE is not tested for emptiness. +dnl +AC_DEFUN([CAIRO_ACCUMULATE_UNQUOTED_UNCHECKED], +[dnl + _CAIRO_ACCUMULATE([$1], [$2], [CAIRO_$1="${CAIRO_$1}]m4_do([cr_acc_$1_sep])["]_CAIRO_SH_ESCAPE_UNQUOTED([$2]))dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATE_UNQUOTED_UNCHECKED_BEFORE(VAR, VALUE) +dnl +dnl Like CAIRO_ACCUMULATE_UNQUOTED_BEFORE but VALUE is not tested for emptiness. +dnl +AC_DEFUN([CAIRO_ACCUMULATE_UNQUOTED_BEFORE], +[dnl + _CAIRO_ACCUMULATE([$1], [$2], [CAIRO_$1=]_CAIRO_SH_ESCAPE_UNQUOTED([$2])["]m4_do([cr_acc_$1_sep])[${CAIRO_$1}"])dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATORS_FOREACH(VAR, COMMANDS) +dnl +dnl Run COMMANDS for each registered accumulator. +dnl Defines VAR to the accumulator being processed. +dnl +AC_DEFUN([CAIRO_ACCUMULATORS_FOREACH], +[dnl + m4_foreach_w([$1], _CAIRO_ACCUMULATORS, [$2])dnl +])dnl + + +dnl =========================================================================== + +m4_define([_CAIRO_ACCUMULATED_FEATURE_VARS])dnl + +dnl +dnl CAIRO_ACCUMULATED_FEATURE_VARS_REGISTER(VARS, DEFAULT-VALUE=[], SEPARATOR=[], INITIAL-VALUE=[]) +dnl +dnl Defines VARS as feature variables and accumulators. Also accumulates +dnl (prepending, not appending) feature values for VARS. +dnl +AC_DEFUN([CAIRO_ACCUMULATED_FEATURE_VARS_REGISTER], +[dnl + m4_foreach_w([cr_var], [$1], + [m4_append_uniq([_CAIRO_ACCUMULATED_FEATURE_VARS], cr_var, [ ],, + [m4_fatal([Accumulated feature variable `]cr_var[' already registered])])])dnl + CAIRO_FEATURE_VARS_REGISTER([$1],[$2])dnl + CAIRO_ACCUMULATORS_REGISTER_UNQUOTED([$1],[$3],[$4])dnl +])dnl + +dnl +dnl CAIRO_ACCUMULATED_FEATURE_VARS_FOREACH(VAR, COMMANDS) +dnl +dnl Run COMMANDS for each registered accumulated feature variable. +dnl Defines VAR to the variable being processed. +dnl +AC_DEFUN([CAIRO_ACCUMULATED_FEATURE_VARS_FOREACH], +[dnl + m4_foreach_w([$1], _CAIRO_ACCUMULATED_FEATURE_VARS, [$2])dnl +])dnl + +dnl =========================================================================== + +dnl +dnl CAIRO_FEATURE_IF_ENABLED(FEATURE=cr_feature, COMMANDS) +dnl +dnl Run COMMANDS if FEATURE is enabled. +dnl +AC_DEFUN([CAIRO_FEATURE_IF_ENABLED], +[dnl + AS_IF([test "x$use_]m4_default([$1], cr_feature)[" = xyes], [$2], [$3])dnl +])dnl + +m4_define([_CAIRO_FEATURE_HOOK_MATCH_SH_BOOL], +[dnl + m4_case([$1], + [*], [$3], + [no], [AS_IF([test "x$2" != xyes], [:m4_newline()$3])], + [yes], [AS_IF([test "x$2" = xyes], [:m4_newline()$3])], + [m4_fatal([Invalid ENABLED value `]$1['])])dnl +])dnl + +m4_define([_CAIRO_FEATURE_HOOK_MATCH_M4], +[dnl + m4_case([$1], + [*], [$3], + [$2], [$3], + [!$2], , + [m4_bmatch([$1], [^!], [$3])])dnl +])dnl + +m4_define([_CAIRO_FEATURE_HOOKS])dnl + +dnl +dnl CAIRO_FEATURE_HOOK_REGISTER(ENABLED, DEFAULT, WHAT, COMMANDS) +dnl +dnl ENABLED is the feature enabledness to match +dnl DEFAULT is the default value of features to match +dnl WHAT is the type of features to match +dnl COMMANDS is commands to run for matched features. +dnl +dnl Runs COMMANDS for features matching ENABLED, DEFAULT, and WHAT. +dnl Hooks are run for each feature in the order they are added. +dnl +dnl DEFAULT and WHAT are matched like this: +dnl [*] matches all values +dnl [val] matches [val] +dnl [!val] matches anything other than [val] +dnl +dnl ENABLED is matched like this: +dnl [yes] matches enabled features +dnl [no] matches disabled features +dnl [*] matches all features +dnl +dnl The following macros can be used in COMMANDS: +dnl +dnl cr_feature expands to the feature id, eg "ft" +dnl cr_feature_name expands to the human-readable name of the feature, eg. "FreeType font" +dnl cr_feature_default expands to the default state of the feature: +dnl "no" for experimental features, eg. your favorite new backend +dnl "yes" for recommended features, eg. png functions +dnl "auto" for other supported features, eg. xlib surface backend +dnl "always" for mandatory features (can't be disabled), eg. image surface backend +dnl cr_what expands to the type of feature: +dnl "surface" for surface backends +dnl "font" for font backends +dnl "functions" for set of functions +dnl "" for private configurations +dnl +dnl These four values are also set as $1 to $4. To know if feature was +dnl enabled from within COMMANDS, use CAIRO_FEATURE_IF_ENABLED: +dnl +dnl CAIRO_FEATURE_IF_ENABLED($1, [IF-ENABLED], [IF-DISABLED]) +dnl +dnl or compare $use_$1 to string "yes". As in: +dnl +dnl AS_IF([test "x$use_$1" = "xyes"], [IF-ENABLED], [IF-DISABLED]) +dnl +AC_DEFUN([CAIRO_FEATURE_HOOK_REGISTER], +[dnl + m4_append([_CAIRO_FEATURE_HOOKS], + [dnl + _CAIRO_FEATURE_HOOK_MATCH_M4([$2], cr_feature_default, + [_CAIRO_FEATURE_HOOK_MATCH_M4([$3], cr_feature_what, + [_CAIRO_FEATURE_HOOK_MATCH_SH_BOOL([$1], [$use_]cr_feature, + [$4] + )])])dnl + ], m4_newline)dnl +])dnl + diff --git a/build/aclocal.float.m4 b/build/aclocal.float.m4 new file mode 100644 index 000000000..8f85f0862 --- /dev/null +++ b/build/aclocal.float.m4 @@ -0,0 +1,65 @@ +# AX_C_FLOAT_WORDS_BIGENDIAN ([ACTION-IF-TRUE], [ACTION-IF-FALSE], +# [ACTION-IF-UNKNOWN]) +# +# Checks the ordering of words within a multi-word float. This check +# is necessary because on some systems (e.g. certain ARM systems), the +# float word ordering can be different from the byte ordering. In a +# multi-word float context, "big-endian" implies that the word containing +# the sign bit is found in the memory location with the lowest address. +# This implemenation was inspired by the AC_C_BIGENDIAN macro in autoconf. +# ------------------------------------------------------------------------- +AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN], + [AC_CACHE_CHECK(whether float word ordering is bigendian, + ax_cv_c_float_words_bigendian, [ + +# The endianess is detected by first compiling C code that contains a special +# double float value, then grepping the resulting object file for certain +# strings of ascii values. The double is specially crafted to have a +# binary representation that corresponds with a simple string. In this +# implementation, the string "noonsees" was selected because the individual +# word values ("noon" and "sees") are palindromes, thus making this test +# byte-order agnostic. If grep finds the string "noonsees" in the object +# file, the target platform stores float words in big-endian order. If grep +# finds "seesnoon", float words are in little-endian order. If neither value +# is found, the user is instructed to specify the ordering. + +ax_cv_c_float_words_bigendian=unknown +AC_LINK_IFELSE([AC_LANG_SOURCE([[ + +double d __attribute__((used)) = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; +int main() { return 0; } + +]])], [ + +if strings - conftest$ac_exeext | grep noonsees >/dev/null ; then + ax_cv_c_float_words_bigendian=yes +fi +if strings - conftest$ac_exeext | grep seesnoon >/dev/null ; then + if test "$ax_cv_c_float_words_bigendian" = unknown; then + ax_cv_c_float_words_bigendian=no + else + ax_cv_c_float_words_bigendian=unknown + fi +fi + +])]) + +case $ax_cv_c_float_words_bigendian in + yes) + m4_default([$1], + [AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1, + [Define to 1 if your system stores words within floats + with the most significant word first])]) ;; + no) + $2 ;; + *) + m4_default([$3], + [AC_MSG_ERROR([ + +Unknown float word ordering. You need to manually preset +ax_cv_c_float_words_bigendian=no (or yes) according to your system. + + ])]) ;; +esac + +])# AX_C_FLOAT_WORDS_BIGENDIAN diff --git a/build/aclocal.makefile.m4 b/build/aclocal.makefile.m4 new file mode 100644 index 000000000..70777810d --- /dev/null +++ b/build/aclocal.makefile.m4 @@ -0,0 +1,234 @@ +dnl +dnl These are the facilities for generating Makefile.am.features and +dnl Makefile.win32.features files. +dnl + +dnl =========================================================================== + +dnl +dnl Define cr_feature_tag ala other cr_feature_* macros +dnl Expands to CAIRO_HAS_FEATURE_ID +dnl +m4_define([_CAIRO_BUILD_FEATURE_TAG_NORMALIZED], + [CAIRO_HAS_[$1]m4_bmatch([$1],[$2$],,[$2])])dnl +m4_define([_CAIRO_BUILD_FEATURE_TAG], + [_CAIRO_BUILD_FEATURE_TAG_NORMALIZED(AS_TR_CPP([$1]),AS_TR_CPP(m4_ifval([$2],[ $2])))])dnl +m4_define([cr_feature_tag], + [_CAIRO_BUILD_FEATURE_TAG(cr_feature,cr_feature_what)])dnl + + +dnl =========================================================================== +dnl +dnl CAIRO_INIT_MAKEFILES([AUX-DIR]) +dnl +dnl Sets up automake and win32 conditionals for all features +dnl +AC_DEFUN([CAIRO_INIT_MAKEFILES], +[dnl + dnl Allow feature tags in the output + m4_pattern_allow(^CAIRO_HAS_)dnl + + dnl Automake conditionals for non-builtin features + CAIRO_FEATURE_HOOK_REGISTER(*,!always,*, + [dnl + AM_CONDITIONAL(cr_feature_tag, [test "x$use_]cr_feature[" = xyes])dnl + ])dnl + + CAIRO_CONFIG_MAKEFILE_PRIVATE_WIN32([_],[$1],[],[[# Generated by configure. Modify to customize.]])dnl + CAIRO_MAKEFILE_ACCUMULATE_FEATURE([_],*,!always,*,[cr_feature_tag=m4_if(cr_feature_default,[yes],1,[m4_bmatch(cr_feature,[win32],1,0)])])dnl +])dnl + +dnl =========================================================================== + +m4_define([_CAIRO_MAKEFILES])dnl + +dnl +dnl CAIRO_CONFIG_MAKEFILE(TAG, DIR, [SUFFIX], [HEADER]) +dnl +dnl Create DIR/Makefile.{am,win32}.SUFFIX files +dnl TAG is a TAG used by other CAIRO_MAKEFILE_* macros to append to these +dnl Makefile's. +dnl +dnl HEADER is appended at the top of the Makefile's. If HEADER is not +dnl set, the generic "Generated by configure. Do not edit." comment +dnl is added. +dnl +AC_DEFUN([CAIRO_CONFIG_MAKEFILE], +[dnl + m4_append_uniq([_CAIRO_MAKEFILES], [$1], [ ])dnl + CAIRO_CONFIG_MAKEFILE_PRIVATE([$1], [$2], [$3], [$4])dnl +])dnl + +dnl Like CAIRO_CONFIG_MAKEFILE but only generate win32 makefile +AC_DEFUN([CAIRO_CONFIG_MAKEFILE_WIN32], +[dnl + m4_append_uniq([_CAIRO_MAKEFILES], [$1], [ ])dnl + CAIRO_CONFIG_MAKEFILE_PRIVATE_WIN32([$1], [$2], [$3], [$4])dnl +])dnl + +dnl Like CAIRO_CONFIG_MAKEFILE but only generate automake makefile +AC_DEFUN([CAIRO_CONFIG_MAKEFILE_AMAKE], +[dnl + m4_append_uniq([_CAIRO_MAKEFILES], [$1], [ ])dnl + CAIRO_CONFIG_MAKEFILE_PRIVATE_AMAKE([$1], [$2], [$3], [$4])dnl +])dnl + +dnl +dnl CAIRO_CONFIG_MAKEFILE_PRIVATE(TAG, DIR, [SUFFIX], [HEADER]) +dnl +dnl Like CAIRO_CONFIG_MAKEFILE but this makefile tag won't match +dnl against '*' in makefile accumulators. +dnl +AC_DEFUN([CAIRO_CONFIG_MAKEFILE_PRIVATE], +[dnl + m4_ifdef([cr_make_$1_dir], + [m4_fatal([Makefile `$1' already registered])])dnl + m4_define([cr_make_$1_dir],[$2])dnl + + CAIRO_CONFIG_MAKEFILE_PRIVATE_AMAKE([$1], [$2], [$3], [$4])dnl + CAIRO_CONFIG_MAKEFILE_PRIVATE_WIN32([$1], [$2], [$3], [$4])dnl +])dnl + +dnl Like CAIRO_CONFIG_MAKEFILE_PRIVATE but only generate automake makefile +AC_DEFUN([CAIRO_CONFIG_MAKEFILE_PRIVATE_AMAKE], +[dnl + m4_ifdef([cr_make_$1_dir_amake], + [m4_fatal([Automake makefile `$1' already registered])])dnl + m4_define([cr_make_$1_dir_amake],[$2])dnl + m4_define([cr_make_$1_dir_any],[$2])dnl + + dnl Accumulators + CAIRO_ACCUMULATORS_REGISTER(MAKEFILE_$1_AMAKE, m4_newline, m4_default([$4],[[# Generated by configure. Do not edit.]])m4_newline)dnl + + dnl Generate + CAIRO_CONFIG_COMMANDS([$srcdir/]m4_if([$2],[.],,[$2/])[Makefile.am.]m4_default([$3],[features]), + [echo "$CAIRO_MAKEFILE_$1_AMAKE"], + [CAIRO_MAKEFILE_$1_AMAKE='$CAIRO_MAKEFILE_$1_AMAKE'])dnl +])dnl + +dnl Like CAIRO_CONFIG_MAKEFILE_PRIVATE but only generate win32 makefile +AC_DEFUN([CAIRO_CONFIG_MAKEFILE_PRIVATE_WIN32], +[dnl + m4_ifdef([cr_make_$1_dir_win32], + [m4_fatal([Win32 makefile `$1' already registered])])dnl + m4_define([cr_make_$1_dir_win32],[$2])dnl + m4_define([cr_make_$1_dir_any],[$2])dnl + + dnl Accumulators + CAIRO_ACCUMULATORS_REGISTER(MAKEFILE_$1_WIN32, m4_newline, m4_default([$4],[[# Generated by configure. Do not edit.]])m4_newline)dnl + + dnl Generate + CAIRO_CONFIG_COMMANDS([$srcdir/]m4_if([$2],[.],,[$2/])[Makefile.win32.]m4_default([$3],[features]), + [echo "$CAIRO_MAKEFILE_$1_WIN32"], + [CAIRO_MAKEFILE_$1_WIN32='$CAIRO_MAKEFILE_$1_WIN32'])dnl +])dnl + + +m4_define([_CAIRO_MAKEFILE_CHECK], +[dnl + m4_ifdef([cr_make_$1_dir_any],,[m4_fatal([Makefile `]$1[' not defined.])])dnl +])dnl + + +dnl +dnl CAIRO_MAKEFILE_INCLUDE(TAG, FILE) +dnl +dnl Include FILE from Makefile's for TAG. FILE should be placed +dnl relative to directory for TAG. If TAG is *, FILE is included from +dnl all Makefile's. +dnl +AC_DEFUN([CAIRO_MAKEFILE_INCLUDE], +[dnl + m4_if([$1],[*],,[_CAIRO_MAKEFILE_CHECK([$1])])dnl + m4_foreach_w([cr_makefile], m4_if([$1],[*],_CAIRO_MAKEFILES,[$1]), + [dnl + m4_ifdef([cr_make_]cr_makefile[_dir_amake],dnl + [CAIRO_ACCUMULATE([MAKEFILE_]cr_makefile[_AMAKE],[include $(top_srcdir)/cr_make_]cr_makefile[_dir_amake/$2]m4_newline)] + )dnl + m4_ifdef([cr_make_]cr_makefile[_dir_win32],dnl + [CAIRO_ACCUMULATE([MAKEFILE_]cr_makefile[_WIN32],[ifeq ($(top_srcdir),)]m4_newline[include $2]m4_newline[else]m4_newline[include $(top_srcdir)/cr_make_]cr_makefile[_dir_win32/$2]m4_newline[endif]m4_newline)] + )dnl + ])dnl +])dnl + + +m4_pattern_allow([cr_make_tmp]) + +dnl +dnl CAIRO_MAKEFILE_ACCUMULATE(TAG, CONTENT) +dnl +dnl Accumulates CONTENT to Makefile's for TAG. If TAG is *, +dnl CONTENT is added to all Makefile's. +dnl +AC_DEFUN([CAIRO_MAKEFILE_ACCUMULATE], +[dnl + m4_if([$1],[*],,[_CAIRO_MAKEFILE_CHECK([$1])])dnl + m4_foreach_w([cr_makefile], m4_if([$1],[*],_CAIRO_MAKEFILES,[$1]), + [dnl + m4_pushdef([cr_make_acc_contents],[$2])dnl + cr_make_tmp=_CAIRO_SH_ESCAPE(cr_make_acc_contents(cr_makefile)) + m4_popdef([cr_make_acc_contents])dnl + m4_ifdef([cr_make_]cr_makefile[_dir_amake],dnl + [CAIRO_ACCUMULATE_UNQUOTED_UNCHECKED([MAKEFILE_]cr_makefile[_AMAKE], [$cr_make_tmp])] + )dnl + m4_ifdef([cr_make_]cr_makefile[_dir_win32],dnl + [CAIRO_ACCUMULATE_UNQUOTED_UNCHECKED([MAKEFILE_]cr_makefile[_WIN32], [$cr_make_tmp])] + )dnl + ])dnl +])dnl + +m4_define([_CAIRO_MAKEFILE_ACCUMULATE_FEATURE], +[dnl + dnl Don't do a conditional for default=always features + m4_pushdef([cr_mk_acc_feat_enabled],m4_if([$2],[yes],[m4_if(cr_feature_default,[always],[*],[$2])],[$2]))dnl + m4_case(cr_mk_acc_feat_enabled, + [*],, + [yes], [CAIRO_ACCUMULATE([$1], [$3])], + [no], [CAIRO_ACCUMULATE([$1], [$3]m4_newline[$4])], + [m4_fatal([Invalid ENABLED value `]$2['])])dnl + CAIRO_ACCUMULATE_UNQUOTED_UNCHECKED([$1], [$6])dnl + m4_case(cr_mk_acc_feat_enabled, + [*],, + [yes], [CAIRO_ACCUMULATE([$1], [$5])], + [no], [CAIRO_ACCUMULATE([$1], [$5])], + [m4_fatal([Invalid ENABLED value `]$2['])])dnl + m4_popdef([cr_mk_acc_feat_enabled])dnl +])dnl + +dnl +dnl CAIRO_MAKEFILE_ACCUMULATE_FEATURE(TAG, ENABLED, DEFAULT, WHAT, CONTENT) +dnl +dnl Accumulates CONTENT to Makefile's for TAG for each feature matching +dnl ENABLED, DEFAULT, and WHAT. Those parameters are similar to those +dnl passed to CAIRO_FEATURE_HOOK_REGISTER. +dnl If TAG is *, CONTENT is added to all Makefile's. +dnl +AC_DEFUN([CAIRO_MAKEFILE_ACCUMULATE_FEATURE], +[dnl + m4_if([$1],[*],,[_CAIRO_MAKEFILE_CHECK([$1])])dnl + m4_append([cr_make_acc_counter],[1],[])dnl + m4_define([cr_make_acc_contents]m4_len(cr_make_acc_counter), [$5])dnl + CAIRO_FEATURE_HOOK_REGISTER(*,[$3],[$4], + [dnl + m4_foreach_w([cr_makefile], m4_if([$1],[*],_CAIRO_MAKEFILES,[$1]), + [dnl + cr_make_tmp=_CAIRO_SH_ESCAPE(cr_make_acc_contents]]m4_len(cr_make_acc_counter)([[cr_makefile,]][$][1],[$][2],[$][3],[$][4])[[) + m4_ifdef([cr_make_]cr_makefile[_dir_amake], + [_CAIRO_MAKEFILE_ACCUMULATE_FEATURE( + [MAKEFILE_]cr_makefile[_AMAKE], + [$2], + [if ]cr_feature_tag, [else], [endif], + [$cr_make_tmp]) + ])dnl + m4_ifdef([cr_make_]cr_makefile[_dir_win32], + [_CAIRO_MAKEFILE_ACCUMULATE_FEATURE( + [MAKEFILE_]cr_makefile[_WIN32], + [$2], + [ifeq ($(]cr_feature_tag[),1)], [else], [endif], + [$cr_make_tmp])dnl + ])dnl + ])dnl + ])dnl +])dnl + +m4_define([cr_make_acc_counter])dnl diff --git a/build/aclocal.pkg.m4 b/build/aclocal.pkg.m4 new file mode 100644 index 000000000..cf90a9678 --- /dev/null +++ b/build/aclocal.pkg.m4 @@ -0,0 +1,157 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi + +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# +# Similar to PKG_CHECK_MODULES, make sure that the first instance of +# this or PKG_CHECK_MODULES is called, or make sure to call +# PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_ifval([$2], [$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# ACTION-IF-NOT-FOUND is not allowed to be empty, that trigger PKG_CONFIG_PATH error message. +# Use : or set a dummy variable to avoid that behavior. +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT +])], + [AC_MSG_RESULT([no]) + $4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MODULES diff --git a/build/ar-lib b/build/ar-lib new file mode 100755 index 000000000..fe2301e71 --- /dev/null +++ b/build/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2013 Free Software Foundation, Inc. +# Written by Peter Rosin <peda@lysator.liu.se>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <<EOF +Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...] + +Members may be specified in a file named with @FILE. +EOF + exit $? + ;; + -v | --v*) + echo "$me, version $scriptversion" + exit $? + ;; +esac + +if test $# -lt 3; then + func_error "you must specify a program, an action and an archive" +fi + +AR=$1 +shift +while : +do + if test $# -lt 2; then + func_error "you must specify a program, an action and an archive" + fi + case $1 in + -lib | -LIB \ + | -ltcg | -LTCG \ + | -machine* | -MACHINE* \ + | -subsystem* | -SUBSYSTEM* \ + | -verbose | -VERBOSE \ + | -wx* | -WX* ) + AR="$AR $1" + shift + ;; + *) + action=$1 + shift + break + ;; + esac +done +orig_archive=$1 +shift +func_file_conv "$orig_archive" +archive=$file + +# strip leading dash in $action +action=${action#-} + +delete= +extract= +list= +quick= +replace= +index= +create= + +while test -n "$action" +do + case $action in + d*) delete=yes ;; + x*) extract=yes ;; + t*) list=yes ;; + q*) quick=yes ;; + r*) replace=yes ;; + s*) index=yes ;; + S*) ;; # the index is always updated implicitly + c*) create=yes ;; + u*) ;; # TODO: don't ignore the update modifier + v*) ;; # TODO: don't ignore the verbose modifier + *) + func_error "unknown action specified" + ;; + esac + action=${action#?} +done + +case $delete$extract$list$quick$replace,$index in + yes,* | ,yes) + ;; + yesyes*) + func_error "more than one action specified" + ;; + *) + func_error "no action specified" + ;; +esac + +if test -n "$delete"; then + if test ! -f "$orig_archive"; then + func_error "archive not found" + fi + for member + do + case $1 in + @*) + func_at_file "${1#@}" -REMOVE "$archive" + ;; + *) + func_file_conv "$1" + $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $? + ;; + esac + done + +elif test -n "$extract"; then + if test ! -f "$orig_archive"; then + func_error "archive not found" + fi + if test $# -gt 0; then + for member + do + case $1 in + @*) + func_at_file "${1#@}" -EXTRACT "$archive" + ;; + *) + func_file_conv "$1" + $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $? + ;; + esac + done + else + $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member + do + $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? + done + fi + +elif test -n "$quick$replace"; then + if test ! -f "$orig_archive"; then + if test -z "$create"; then + echo "$me: creating $orig_archive" + fi + orig_archive= + else + orig_archive=$archive + fi + + for member + do + case $1 in + @*) + func_file_conv "${1#@}" + set x "$@" "@$file" + ;; + *) + func_file_conv "$1" + set x "$@" "$file" + ;; + esac + shift + shift + done + + if test -n "$orig_archive"; then + $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? + else + $AR -NOLOGO -OUT:"$archive" "$@" || exit $? + fi + +elif test -n "$list"; then + if test ! -f "$orig_archive"; then + func_error "archive not found" + fi + $AR -NOLOGO -LIST "$archive" || exit $? +fi diff --git a/build/compile b/build/compile new file mode 100755 index 000000000..531136b06 --- /dev/null +++ b/build/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Written by Tom Tromey <tromey@cygnus.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/config.guess b/build/config.guess new file mode 100755 index 000000000..b79252d6b --- /dev/null +++ b/build/config.guess @@ -0,0 +1,1558 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-06-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include <features.h> + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +and + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build/config.sub b/build/config.sub new file mode 100755 index 000000000..9633db704 --- /dev/null +++ b/build/config.sub @@ -0,0 +1,1791 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2013 Free Software Foundation, Inc. + +timestamp='2013-08-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches with a ChangeLog entry to config-patches@gnu.org. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2013 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 \ + | or1k | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or1k-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build/configure.ac.analysis b/build/configure.ac.analysis new file mode 100644 index 000000000..11c52e70d --- /dev/null +++ b/build/configure.ac.analysis @@ -0,0 +1,106 @@ +dnl =========================================================================== +dnl +dnl LCOV +dnl +cairo_has_lcov=no +AC_ARG_ENABLE(gcov, + AS_HELP_STRING([--enable-gcov], + [Enable gcov]), + [use_gcov=$enableval], [use_gcov=no]) + +if test "x$use_gcov" = "xyes"; then + dnl we need gcc: + if test "$GCC" != "yes"; then + AC_MSG_ERROR([GCC is required for --enable-gcov]) + fi + + dnl Check if ccache is being used + AC_CHECK_PROG(SHTOOL, shtool, shtool) + case `$SHTOOL path $CC` in + *ccache*[)] gcc_ccache=yes;; + *[)] gcc_ccache=no;; + esac + + if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then + AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.]) + fi + + ltp_version_list="1.7 1.6 1.5 1.4" + AC_CHECK_PROG(LTP, lcov, lcov) + AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml) + + if test "$LTP"; then + AC_CACHE_CHECK([for ltp version], cairo_cv_ltp_version, [ + cairo_cv_ltp_version=invalid + ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` + for ltp_check_version in $ltp_version_list; do + if test "$ltp_version" = "$ltp_check_version"; then + cairo_cv_ltp_version="$ltp_check_version (ok)" + fi + done + ]) + fi + + case $cairo_cv_ltp_version in + ""|invalid[)] + ;; + *) + cairo_has_lcov=yes + ;; + esac + + if test "x$cairo_has_lcov" != "xyes"; then + AC_MSG_ERROR([[To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list. +Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again.]]) + fi + + if test -z "$LTP_GENHTML"; then + AC_MSG_ERROR([[Could not find genhtml from the LTP package. +Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again.]]) + fi + + AC_DEFINE(HAVE_GCOV, 1, [Whether you have gcov]) +dnl PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Makefile.gcov, $abs_srcdir) + + dnl Remove all optimization flags from CFLAGS + changequote({,}) + CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` + CAIRO_CFLAGS=`echo "$CAIRO_CFLAGS" | $SED -e 's/-O[0-9]*//g'` + changequote([,]) + + dnl Add the special gcc flags + dnl In order to workaround a debian bug in libtool where they strip + dnl $dependency_libs from the link line and CFLAGS, we need to pass + dnl --coverage via LDFLAGS. + CAIRO_CC_TRY_FLAG([--coverage],, + [ + CAIRO_CFLAGS="$CAIRO_CFLAGS -O0 --coverage" + CAIRO_LDFLAGS="$CAIRO_LDFLAGS -O0 --coverage" + ]) +fi +AM_CONDITIONAL(CAIRO_HAS_LCOV, test "x$cairo_has_lcov" = "xyes") + +dnl =========================================================================== +dnl Check for some custom valgrind modules +AC_ARG_ENABLE(valgrind, + AS_HELP_STRING([--disable-valgrind], + [Disable valgrind support]), + [use_valgrind=$enableval], [use_valgrind=yes]) + +if test "x$use_valgrind" = "xyes"; then + PKG_CHECK_MODULES(VALGRIND, valgrind, [ + _save_CFLAGS="$CFLAGS" + _save_CPPFLAGS="$CPPFLAGS" + CFLAGS="$CFLAGS $VALGRIND_CFLAGS" + CPPFLAGS="$CPPFLAGS $VALGRIND_CFLAGS" + AC_CHECK_HEADER([valgrind.h], [AC_DEFINE([HAVE_VALGRIND], [1], + [Define to 1 if you have Valgrind])]) + AC_CHECK_HEADER([lockdep.h], [AC_DEFINE([HAVE_LOCKDEP], [1], + [Define to 1 if you have the Valgrind lockdep tool])]) + AC_CHECK_HEADER([memfault.h], [AC_DEFINE([HAVE_MEMFAULT], [1], + [Define to 1 if you have the Valgrind memfault tool])]) + CAIRO_CFLAGS="$VALGRIND_CFLAGS $CAIRO_CFLAGS" + CFLAGS="$_save_CFLAGS" + CPPFLAGS="$_save_CPPFLAGS" + ], AC_MSG_RESULT(no)) +fi diff --git a/build/configure.ac.features b/build/configure.ac.features new file mode 100644 index 000000000..e4a2aafcc --- /dev/null +++ b/build/configure.ac.features @@ -0,0 +1,427 @@ + +dnl +dnl Define macros to enable various features. +dnl - Macro: CAIRO_ENABLE_* (ID, NAME, DEFAULT, COMMANDS) +dnl +dnl where: +dnl +dnl ID is the feature id, eg. "ft" for cairo_ft_... +dnl NAME is the human-readable name of the feature, eg. "FreeType" +dnl DEFAULT is the default state of the feature: +dnl "no" for experimental backends, eg. your favorite new backend +dnl "yes" for mandatory backends, eg. png +dnl "auto" for other supported backends, eg. xlib +dnl COMMANDS are run to check whether the feature can be enabled. Their +dnl result may be cached, so user should not count on them being run. +dnl They should set use_$(ID) to something other than yes if the +dnl feature cannot be built, eg. "no (requires SomeThing)". It then +dnl should also set $(ID)_REQUIRES/CFLAGS/LIBS/... +dnl appropriately. Look at the macro definition for more details, +dnl or ask if in doubt. +dnl + +AC_DEFUN([CAIRO_ENABLE], + [_CAIRO_ENABLE([$1], [$2], , [$3],[$4])])dnl + +AC_DEFUN([CAIRO_ENABLE_SURFACE_BACKEND], + [_CAIRO_ENABLE([$1], [$2 surface backend], surface, [$3],[$4])])dnl + +AC_DEFUN([CAIRO_ENABLE_FONT_BACKEND], + [_CAIRO_ENABLE([$1], [$2 font backend], font, [$3],[$4])])dnl + +AC_DEFUN([CAIRO_ENABLE_FUNCTIONS], + [_CAIRO_ENABLE([$1], [$2 functions], functions, [$3],[$4])])dnl + + +dnl +dnl Define cr_feature_pc and friends ala other cr_feature_* macros +dnl +m4_define([cr_pc_modname], + [[cairo-]m4_translit([$1],_,-)])dnl +m4_define([cr_feature_pc], + [cr_pc_modname(cr_feature)[.pc]])dnl +m4_define([cr_feature_uninstalled_pc], + [cr_pc_modname(cr_feature)[-uninstalled.pc]])dnl + + +dnl =========================================================================== +dnl +dnl Hooks +dnl +dnl =========================================================================== + + +dnl =========================================================================== +dnl +dnl Generate {src,boilerplate}/Makefile.{am,win32}.config +dnl + +CAIRO_INIT_MAKEFILES([build]) +CAIRO_CONFIG_MAKEFILE([cairo], [src])dnl +CAIRO_CONFIG_MAKEFILE([cairo_boilerplate], [boilerplate])dnl +CAIRO_MAKEFILE_INCLUDE(*,[Makefile.sources])dnl +dnl An empty line per feature for readability +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,*,*,*,[])dnl + + +dnl Collect list of all supported public headers +CAIRO_MAKEFILE_ACCUMULATE(*, +[supported_$1_headers = $($1_headers)]dnl +)dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,*,!no,!, +[supported_$1_headers += $($1_$2_headers)]dnl +)dnl + +dnl Collect list of all unsupported public headers +CAIRO_MAKEFILE_ACCUMULATE(*, +[unsupported_$1_headers =]dnl +)dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,*,no,!, +[unsupported_$1_headers += $($1_$2_headers)]dnl +)dnl + +dnl Collect list of source files for all public features +CAIRO_MAKEFILE_ACCUMULATE(*, +[dnl +all_$1_headers = $($1_headers) +all_$1_private = $($1_private) +all_$1_cxx_sources = $($1_cxx_sources) +all_$1_sources = $($1_sources) +])dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,*,*,!, +[dnl +all_$1_headers += $($1_$2_headers) +all_$1_private += $($1_$2_private) +all_$1_cxx_sources += $($1_$2_cxx_sources) +all_$1_sources += $($1_$2_sources)]dnl +)dnl + +dnl Collect list of source files for enabled public features +CAIRO_MAKEFILE_ACCUMULATE(*, +[dnl +enabled_$1_headers = $($1_headers) +enabled_$1_private = $($1_private) +enabled_$1_cxx_sources = $($1_cxx_sources) +enabled_$1_sources = $($1_sources) +])dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,yes,*,!, +[dnl +enabled_$1_headers += $($1_$2_headers) +enabled_$1_private += $($1_$2_private) +enabled_$1_cxx_sources += $($1_$2_cxx_sources) +enabled_$1_sources += $($1_$2_sources)]dnl +)dnl + +dnl No public headers for private features + +dnl Collect list of source files for all private features +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,*,*,, +[dnl +all_$1_private += $($1_$2_private) $($1_$2_headers) +all_$1_cxx_sources += $($1_$2_cxx_sources) +all_$1_sources += $($1_$2_sources)]dnl +)dnl + +dnl Collect list of source files for enabled private features +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(*,yes,*,, +[dnl +enabled_$1_private += $($1_$2_private) $($1_$2_headers) +enabled_$1_cxx_sources += $($1_$2_cxx_sources) +enabled_$1_sources += $($1_$2_sources)]dnl +)dnl + + +dnl =========================================================================== +dnl +dnl Generate .pc files +dnl + +dnl All .pc files are generated automatically except for this one +AC_CONFIG_FILES([src/cairo.pc])dnl +AC_CONFIG_FILES([cairo-uninstalled.pc:src/cairo-uninstalled.pc.in])dnl + +dnl pkg-config requires, non-pkgconfig cflags and libs, and total cflags and libs +CAIRO_FEATURE_VARS_REGISTER([BASE],[cairo])dnl +CAIRO_ACCUMULATED_FEATURE_VARS_REGISTER([REQUIRES],,[ ])dnl +CAIRO_ACCUMULATED_FEATURE_VARS_REGISTER([CFLAGS NONPKGCONFIG_CFLAGS],,[ ])dnl +CAIRO_ACCUMULATED_FEATURE_VARS_REGISTER([LIBS NONPKGCONFIG_LIBS],,[ ],[$LIBS])dnl +CAIRO_FEATURE_VARS_REGISTER([NONPKGCONFIG_EXTRA_LIBS])dnl +AC_SUBST(CAIRO_REQUIRES)dnl +AC_SUBST(CAIRO_CFLAGS)dnl +AC_SUBST(CAIRO_LDFLAGS)dnl +AC_SUBST(CAIRO_NONPKGCONFIG_CFLAGS)dnl +AC_SUBST(CAIRO_LIBS)dnl +AC_SUBST(CAIRO_NONPKGCONFIG_LIBS)dnl + +dnl add non-pkgconfig values +AC_CONFIG_COMMANDS_PRE( +[dnl +CAIRO_CFLAGS="$CAIRO_CFLAGS $CAIRO_NONPKGCONFIG_CFLAGS" +CAIRO_LIBS="$CAIRO_LIBS $CAIRO_NONPKGCONFIG_LIBS" +])dnl + +m4_define([_CAIRO_FEATURE_CONFIG_PKGCONFIG_FILE], +[dnl + AC_CONFIG_FILES([$3:$4], + [dnl + mv "$3" "$3.tmp" && + $SED "dnl + s%@FEATURE_PC@%]cr_pc_modname([$1])[%g;dnl + s%@FEATURE_NAME@%$2%g;dnl + s%@FEATURE_BASE@%$$1_BASE%g;dnl + s%@FEATURE_REQUIRES@%$$1_REQUIRES%g;dnl + s%@FEATURE_NONPKGCONFIG_LIBS@%$$1_NONPKGCONFIG_LIBS%g;dnl + s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$$1_NONPKGCONFIG_EXTRA_LIBS%g;dnl + s%@FEATURE_NONPKGCONFIG_CFLAGS@%$$1_NONPKGCONFIG_CFLAGS%g;dnl + " < "$3.tmp" > "$3" && rm -f "$3.tmp" || + AC_MSG_ERROR(failed to update $3) + ],[dnl + SED='$SED' + $1_BASE='$$1_BASE' + $1_REQUIRES='$$1_REQUIRES' + $1_NONPKGCONFIG_LIBS='$$1_NONPKGCONFIG_LIBS' + $1_NONPKGCONFIG_EXTRA_LIBS='$$1_NONPKGCONFIG_EXTRA_LIBS' + $1_NONPKGCONFIG_CFLAGS='$$1_NONPKGCONFIG_CFLAGS' + ])dnl +])dnl + +dnl Generate .pc files for enabled non-builtin public features +CAIRO_FEATURE_HOOK_REGISTER(yes,!always,!, +[dnl + _CAIRO_FEATURE_CONFIG_PKGCONFIG_FILE( + [$1], + cr_feature_name, + [src/]cr_feature_pc, + [src/cairo-features.pc.in] + )dnl +])dnl + +dnl Generate -uninstalled.pc files for enabled non-builtin public features +CAIRO_FEATURE_HOOK_REGISTER(yes,!always,!, +[dnl + _CAIRO_FEATURE_CONFIG_PKGCONFIG_FILE( + [$1], + cr_feature_name, + cr_feature_uninstalled_pc, + [src/cairo-features-uninstalled.pc.in] + )dnl +])dnl + + +dnl Collect list of .pc files for all non-builtin public features +CAIRO_MAKEFILE_ACCUMULATE(cairo, +[all_$1_pkgconf = cairo.pc])dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(cairo,*,!always,!, +[all_$1_pkgconf += cr_feature_pc])dnl + +dnl Collect list of .pc files for enabled non-builtin public features +CAIRO_MAKEFILE_ACCUMULATE(cairo, +[enabled_$1_pkgconf = cairo.pc])dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE(cairo,yes,!always,!, +[enabled_$1_pkgconf += cr_feature_pc])dnl + + +dnl =========================================================================== +dnl +dnl Generate src/cairo-features.h, src/cairo-supported-features.h, and +dnl src/cairo-features-win32.h +dnl + +dnl Collect list of enabled public features +CAIRO_ACCUMULATORS_REGISTER(FEATURES,[ ])dnl +CAIRO_FEATURE_HOOK_REGISTER(yes,*,!,dnl +[dnl + CAIRO_ACCUMULATE(FEATURES, cr_feature_tag)dnl +])dnl +dnl Collect list of all supported public features +CAIRO_ACCUMULATORS_REGISTER(SUPPORTED_FEATURES,[ ])dnl +CAIRO_FEATURE_HOOK_REGISTER(*,!no,!,dnl +[dnl + CAIRO_ACCUMULATE(SUPPORTED_FEATURES, cr_feature_tag) +])dnl +dnl Collect list of all supported disabled public features +CAIRO_ACCUMULATORS_REGISTER(NO_FEATURES,[ ])dnl +CAIRO_FEATURE_HOOK_REGISTER(no,!no,!, +[dnl + CAIRO_ACCUMULATE(NO_FEATURES, cr_feature_tag) +])dnl + +dnl Generate src/cairo-features.h +CAIRO_CONFIG_COMMANDS([src/cairo-features.h], +[dnl + echo '/* Generated by configure. Do not edit. */' + echo '#ifndef CAIRO_FEATURES_H' + echo '#define CAIRO_FEATURES_H' + echo '' + for FEATURE in $CAIRO_FEATURES; do + echo "#define $FEATURE 1" + done | LANG=C sort + echo '' + for FEATURE in $CAIRO_NO_FEATURES; do + echo "/*#undef $FEATURE */" + done | LANG=C sort + echo '' + echo '#endif' +],[dnl + CAIRO_FEATURES='$CAIRO_FEATURES' + CAIRO_NO_FEATURES='$CAIRO_NO_FEATURES' +])dnl +dnl Generate src/cairo-supported-features.h +CAIRO_CONFIG_COMMANDS([src/cairo-supported-features.h], +[dnl + echo '/* Generated by configure. Do not edit. */' + echo '#ifndef CAIRO_SUPPORTED_FEATURES_H' + echo '#define CAIRO_SUPPORTED_FEATURES_H' + echo '' + echo '/* This is a dummy header, to trick gtk-doc only */' + echo '' + for FEATURE in $CAIRO_SUPPORTED_FEATURES; do + echo "#define $FEATURE 1" + done + echo '' + echo '#endif' +],[dnl + CAIRO_SUPPORTED_FEATURES='$CAIRO_SUPPORTED_FEATURES' +])dnl + +dnl For enabled private features just define them in config.h. No fanfare! +CAIRO_FEATURE_HOOK_REGISTER(yes,*,, +[dnl + AC_DEFINE(cr_feature_tag, 1, [Define to 1 to enable cairo's ]cr_feature_name[ feature]) +])dnl + + +dnl Generate build/Makefile.win32.features-h that generates src/cairo-features.h +CAIRO_CONFIG_MAKEFILE_PRIVATE_WIN32([win32_features_h],[build],[features-h]) +dnl +CAIRO_MAKEFILE_ACCUMULATE([win32_features_h], +[$(top_srcdir)/src/cairo-features.h: $(top_srcdir)/build/Makefile.win32.features + @echo "Generating src/cairo-features.h" + @echo "/* Generated by Makefile.win32.features-h. Do not edit. */" > $(top_srcdir)/src/cairo-features.h + @echo "[#]ifndef CAIRO_FEATURES_H" >> $(top_srcdir)/src/cairo-features.h + @echo "[#]define CAIRO_FEATURES_H 1" >> $(top_srcdir)/src/cairo-features.h]dnl +) +AC_CONFIG_COMMANDS_PRE( +[dnl + CAIRO_MAKEFILE_ACCUMULATE([win32_features_h], [ @echo "[#]endif" >> $(top_srcdir)/src/cairo-features.h]) +])dnl +CAIRO_MAKEFILE_ACCUMULATE_FEATURE([win32_features_h],yes,*,*,dnl +[ @echo "[#]define cr_feature_tag 1" >> $(top_srcdir)/src/cairo-features.h]dnl +)dnl + + +dnl =========================================================================== +dnl +dnl Report +dnl + +CAIRO_ACCUMULATORS_REGISTER([WARNING_MESSAGE],m4_newline()m4_newline)dnl + +dnl Collect warning message for enabled unsupported public features +CAIRO_FEATURE_HOOK_REGISTER(yes,no,!, +[dnl + CAIRO_ACCUMULATE([WARNING_MESSAGE], CAIRO_TEXT_WRAP([The ]cr_feature_name[ feature is still under active development and is included in this release only as a preview. It does NOT fully work yet and incompatible changes may yet be made to ]cr_feature_name[ specific API.], [--- ])) +])dnl + +dnl Collect warning message for disabled recommended features +CAIRO_FEATURE_HOOK_REGISTER(no,yes,*, +[dnl + CAIRO_ACCUMULATE([WARNING_MESSAGE], CAIRO_TEXT_WRAP([It is strongly recommended that you do NOT disable the ]cr_feature_name[ feature.], [+++ ])) +])dnl + + +dnl Collect enabled native surface/font backend features +CAIRO_ACCUMULATORS_REGISTER([NATIVE_SURFACE_BACKENDS])dnl +CAIRO_ACCUMULATORS_REGISTER([NATIVE_FONT_BACKENDS])dnl +CAIRO_FEATURE_HOOK_REGISTER(yes,auto,surface, +[dnl + CAIRO_ACCUMULATE([NATIVE_SURFACE_BACKENDS], [$1]) +])dnl +CAIRO_FEATURE_HOOK_REGISTER(yes,auto,font, +[dnl + CAIRO_ACCUMULATE([NATIVE_FONT_BACKENDS], [$1]) +])dnl + +dnl Collect warning message if no native surface/font backend feature enabled +AC_CONFIG_COMMANDS_PRE(dnl +[dnl + AS_IF([test -z "$CAIRO_NATIVE_SURFACE_BACKENDS"],dnl + [dnl + CAIRO_ACCUMULATE([WARNING_MESSAGE], CAIRO_TEXT_WRAP([No native surface backends enabled for your platform. It is strongly recommended that you enable the native surface backend feature for your platform.], [*** ])) + ]) + AS_IF([test -z "$CAIRO_NATIVE_FONT_BACKENDS"],dnl + [dnl + CAIRO_ACCUMULATE([WARNING_MESSAGE], CAIRO_TEXT_WRAP([No native font backends enabled for your platform. It is strongly recommended that you enable the native font backend feature for your platform.], [*** ])) + ]) +])dnl + + +AC_DEFUN([CAIRO_REPORT], +[dnl + V="$CAIRO_VERSION_MAJOR.$CAIRO_VERSION_MINOR.$CAIRO_VERSION_MICRO" + echo "" + echo "cairo (version $V [[$CAIRO_RELEASE_STATUS]]) will be compiled with:" + echo "" + echo "The following surface backends:" + echo " Image: yes (always builtin)" + echo " Recording: yes (always builtin)" + echo " Observer: yes (always builtin)" + echo " Mime: yes (always builtin)" + echo " Tee: $use_tee" + echo " XML: $use_xml" + echo " Skia: $use_skia" + echo " Xlib: $use_xlib" + echo " Xlib Xrender: $use_xlib_xrender" + echo " Qt: $use_qt" + echo " Quartz: $use_quartz" + echo " Quartz-image: $use_quartz_image" + echo " XCB: $use_xcb" + echo " Win32: $use_win32" + echo " OS2: $use_os2" + echo " CairoScript: $use_script" + echo " PostScript: $use_ps" + echo " PDF: $use_pdf" + echo " SVG: $use_svg" + echo " OpenGL: $use_gl" + echo " OpenGL ES 2.0: $use_glesv2" + echo " BeOS: $use_beos" + echo " DirectFB: $use_directfb" + echo " OpenVG: $use_vg" + echo " DRM: $use_drm" + echo " Cogl: $use_cogl" + echo "" + echo "The following font backends:" + echo " User: yes (always builtin)" + echo " FreeType: $use_ft" + echo " Fontconfig: $use_fc" + echo " Win32: $use_win32_font" + echo " Quartz: $use_quartz_font" + echo "" + echo "The following functions:" + echo " PNG functions: $use_png" + echo " GLX functions: $use_glx" + echo " WGL functions: $use_wgl" + echo " EGL functions: $use_egl" + echo " X11-xcb functions: $use_xlib_xcb" + echo " XCB-shm functions: $use_xcb_shm" + echo "" + echo "The following features and utilities:" + echo " cairo-trace: $use_trace" + echo " cairo-script-interpreter: $use_interpreter" + echo "" + echo "And the following internal features:" + echo " pthread: $use_pthread" + echo " gtk-doc: $enable_gtk_doc" + echo " gcov support: $use_gcov" + echo " symbol-lookup: $use_symbol_lookup" + echo " test surfaces: $use_test_surfaces" + echo " ps testing: $test_ps" + echo " pdf testing: $test_pdf" + echo " svg testing: $test_svg" + if test x"$use_win32" = "xyes"; then + echo " win32 printing testing: $test_win32_printing" + fi + echo "$CAIRO_WARNING_MESSAGE" + echo "" +])dnl + diff --git a/build/configure.ac.noversion b/build/configure.ac.noversion new file mode 100644 index 000000000..18c4bd5f7 --- /dev/null +++ b/build/configure.ac.noversion @@ -0,0 +1,23 @@ +dnl +dnl Version stuff +dnl + +dnl Disable autoconf's version macros. We try hard to not rebuild the entire +dnl library just because version changed. The PACKAGE_VERSION* stuff in +dnl config.h is negating all the effort. +dnl +dnl We're not actually supposed to be doing this, and indeed adding the +dnl AC_DEFINEs below causes confdefs.h to contain duplicate incompatible +dnl #defines for the same PACKAGE_* symbols. Those are provoking warnings +dnl from the compiler, and that throws our CAIRO_TRY_LINK_*_ checks off, +dnl because they think that there's something wrong with some flag they're +dnl testing rather than confdefs.h! So let's do the gross thing and puke +dnl into confdefs.h some #undefs. +echo '#undef PACKAGE_VERSION' >>confdefs.h +echo '#undef PACKAGE_STRING' >>confdefs.h +echo '#undef PACKAGE_NAME' >>confdefs.h +echo '#undef PACKAGE_TARNAME' >>confdefs.h +AC_DEFINE(PACKAGE_VERSION, [USE_cairo_version_OR_cairo_version_string_INSTEAD]) +AC_DEFINE(PACKAGE_STRING, [USE_cairo_version_OR_cairo_version_string_INSTEAD]) +AC_DEFINE(PACKAGE_NAME, [USE_cairo_INSTEAD]) +AC_DEFINE(PACKAGE_TARNAME, [USE_cairo_INSTEAD]) diff --git a/build/configure.ac.pthread b/build/configure.ac.pthread new file mode 100644 index 000000000..29c930da9 --- /dev/null +++ b/build/configure.ac.pthread @@ -0,0 +1,253 @@ +dnl Defines the macro CAIRO_CONFIGURE_PTHREAD to find a suitable +dnl pthread implementation. There are two levels of pthread conformance +dnl we are looking for: +dnl +dnl a) A minimal level denoted by -DCAIRO_HAS_PTHREAD=1: This level +dnl requires mutex and recursive mutexattr support. If possible we try +dnl to use weakly linked stubs from libc over the real pthread library. +dnl This level is required by the cairo library proper. If the user +dnl invokes configure with --enable-pthread=yes or +dnl --enable-pthread=always then we avoid trying to use weak stubs. +dnl +dnl b) A full level denoted by -DCAIRO_HAS_REAL_PTHREAD=1: This level +dnl requires full support from a real pthread library, including thread +dnl creation, joins, thread attribtues, etc. This level is required by +dnl multithreaded applications using cairo, such as the test suite +dnl binaries and cairo utilities. +dnl +dnl Usage: +dnl CAIRO_ENABLE(pthread, pthread, <default yes|no|auto|always>, +dnl [CAIRO_CONFIGURE_PTHREAD]) +dnl +dnl This should be invoked near the end of configure.ac so that +dnl the pthread specific CFLAGS and LIBS end up at the front +dnl of CAIRO_CFLAGS and CAIRO_LIBS -- this helps ensure that we +dnl really do get non-weak symbols from the actual pthread library +dnl rather than possible stubs in other libraries. +dnl +dnl The user can override the choices made by +dnl CAIRO_CONFIGURE_PTHREAD by using --enable-pthread=yes and +dnl giving PTHREAD_CFLAGS and PTHREAD_LIBS to configure. +dnl +dnl Sets environment variables: +dnl use_pthread="yes" | "no (<errmsg>)" +dnl have_pthread="yes" | "no (<errmsg)" +dnl have_real_pthread="yes" | "no (<errmsg)" +dnl pthread_{CFLAGS,LIBS,REQUIRES} +dnl real_pthread_{CFLAGS,LIBS} +dnl +dnl Autoconfigured defines in config.h (conditional): +dnl CAIRO_HAS_PTHREAD +dnl CAIRO_HAS_REAL_PTHREAD +dnl + +dnl ----------------------------------------------------------------------- +dnl A program to test all the pthread features we need to be able to +dnl compile libcairo itself. We could test the features independently, +dnl but we need all of them anyway. +m4_define([libcairo_pthread_program],[dnl +#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* for PTHREAD_MUTEX_INITIALIZER under linux */ +#endif +#include <pthread.h> + +pthread_mutex_t test_mutex_initializer = PTHREAD_MUTEX_INITIALIZER; +int test_mutex (void) +{ + int x = 0; + pthread_mutex_t mutex; + x |= pthread_mutex_init (&mutex, NULL); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + return 0; +} + +int test_mutex_attr (void) +{ + int x = 0; + pthread_mutexattr_t attr; + pthread_mutex_t mutex; + x |= pthread_mutexattr_init (&attr); + x |= pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + x |= pthread_mutex_init (&mutex, &attr); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + x |= pthread_mutexattr_destroy (&attr); + return x; +}]) + +dnl ----------------------------------------------------------------------- +dnl A program to test all the features we want to be able to run the test +dnl suite or other thready cairo applications that want real threads. +m4_define([testsuite_pthread_program],[dnl +libcairo_pthread_program + +pthread_once_t once_control = PTHREAD_ONCE_INIT; +void test_once_init (void) {} +int test_once (void) +{ + return pthread_once (&once_control, test_once_init); +} + +pthread_key_t test_specific_key; +int test_specific (void) +{ + int x = 0; + x |= pthread_key_create (&test_specific_key, NULL); + x |= pthread_setspecific (test_specific_key, NULL); + x |= pthread_getspecific (test_specific_key) != NULL; + return x; +} + +void cleaner (void *arg) { (void)arg; } + +void * +test_thread_main (void *arg) +{ + pthread_cleanup_push (cleaner, arg); + pthread_exit (arg); + pthread_cleanup_pop (1); + return arg; +} + +int +test_threads (void) +{ + int x = 0; + pthread_t thread; + pthread_attr_t attr; + void *arg = NULL; + x |= pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + x |= pthread_create (&thread, &attr, test_thread_main, arg); + x |= pthread_equal (pthread_self(), thread); + x |= pthread_join (thread, &arg); + x |= pthread_attr_destroy (&attr); + return x; +}]) + +dnl ----------------------------------------------------------------------- + +dnl CAIRO_CHECK_PTHREAD(tag, cflags, libs, program, true-action, false-action) +dnl Set <tag>_{CFLAGS,LIBS} to {<cflags>,<libs>} if we can compile and link +dnl <program> with the given flags and libs. Execute <true-action> on +dnl success and <false-action> on failure. +AC_DEFUN([CAIRO_CHECK_PTHREAD],[dnl + CAIRO_CC_TRY_LINK_WITH_ENV_SILENT( + [CFLAGS="$CFLAGS $2"; + LIBS="$LIBS $3"], + [$4], + [$1_CFLAGS="$2"; + $1_LIBS="$3"; + $5], + [$1_CFLAGS=""; + $1_LIBS=""; + $6]) +]) + +dnl CAIRO_CONFIGURE_PTHREADS(): Look for pthreads. +dnl +dnl If the user specifies PTHREAD_CFLAGS and PTHREAD_LIBS then we use +dnl those. Otherwise we try CFLAGS=-D_REENTRANT and LIBS=-lpthread for +dnl full pthread support, and look for stubs in libc for the minimal +dnl pthread support. +dnl +dnl CFLAGS=-D_REENTRANT LIBS=-lpthread has been tested to work on: +dnl +dnl Solaris 9 (5.9) Sun C 5.8 Patch 121015-04 2007/01/10 +dnl OpenSolaris (5.11) Sun C 5.9 Patch 124868-08 2008/11/25 +dnl OpenSolaris (5.11) clang version 1.1 (trunk 90017) +dnl Tru64/OSF1 V5.1 Compaq C V6.5-003 +dnl Mac OS X 10.5.5 gcc 4.0.1 (Apple Inc. build 5465) +dnl Mac OS X 10.6 gcc 4.2.1 (Apple Inc. build 5659) +dnl FreeBSD 7.2 gcc 4.2 +dnl OpenBSD 4.5 gcc 3.3.5 (propolice) +dnl Debian Linux (Etch) gcc 4.3 +dnl +dnl Thread support is also in various libcs directly, so often using no +dnl flags at all works as well, but unfortunately Solaris 9 has +dnl practically _all_ of libpthread stubbed out in libc, so we cannot +dnl distinguish between a working libpthread and a stubbed out one by a +dnl link-only test. +dnl +dnl We also explicitly do not link to pthread-stubs or whatever other +dnl third-party stubs library, since that forces cairo clients to be +dnl extra careful when giving both libcairo and libpthread on the +dnl command line: the user would have to use "-lpthread -lcairo" rather +dnl than the more common "-lcairo -lpthread" to not accidentally use +dnl stubs pulled in by libcairo everywhere in the application. We +dnl might also need to have a way to teach pkg-config about library +dnl ordering constraints which aren't actual dependencies, and at this +dnl point it just starts doing my head in. +dnl +dnl If your unix-like doesn't work with the secret handshake +dnl -D_REENTRANT -lpthread and you can actually compile the rest of +dnl cairo just fine otherwise, please take a moment complain loudly +dnl to the cairo mailing list! +dnl +AC_DEFUN([CAIRO_CONFIGURE_PTHREAD],[dnl + dnl Try to use the user's PTHREAD_LIBS/CFLAGS + dnl if they're available. + if test "x$PTHREAD_CFLAGS" = "x"; then + PTHREAD_CFLAGS="-D_REENTRANT" + fi + if test "x$PTHREAD_LIBS" = "x"; then + PTHREAD_LIBS="-lpthread" + fi + + dnl First try to find the real pthreads. + CAIRO_CHECK_PTHREAD( + [real_pthread], [$PTHREAD_CFLAGS], [$PTHREAD_LIBS], + [testsuite_pthread_program], + [have_real_pthread=yes], + [have_real_pthread=no]) + if test "x$have_real_pthread" != "xyes"; then + dnl Give -pthread a go. + CAIRO_CHECK_PTHREAD( + [real_pthread], [-pthread], [], + [testsuite_pthread_program], + [have_real_pthread=yes], + [have_real_pthread="no (can't link with -lpthread or -pthread)"]) + fi + PTHREAD_CFLAGS= + PTHREAD_LIBS= + + dnl Check if we can use libc's stubs in libcairo. + dnl Only do this if the user hasn't explicitly enabled + dnl pthreads, but is relying on automatic configuration. + have_pthread="no" + if test "x$enable_pthread" != "xyes"; then + CAIRO_CHECK_PTHREAD( + [pthread], [-D_REENTRANT], [], + [libcairo_pthread_program], + [have_pthread=yes], + []) + fi + + dnl Default to using the real pthreads for libcairo. + if test "x$have_pthread" != "xyes"; then + have_pthread="$have_real_pthread"; + pthread_CFLAGS="$real_pthread_CFLAGS"; + pthread_LIBS="$real_pthread_LIBS"; + fi + + dnl Tell autoconf about the results. + if test "x$have_real_pthread" = "xyes"; then + AC_DEFINE([CAIRO_HAS_REAL_PTHREAD], 1, + [Define to 1 if we have full pthread support]) + fi + if test "x$have_pthread" = "xyes"; then + AC_DEFINE([CAIRO_HAS_PTHREAD], 1, + [Define to 1 f we have minimal pthread support]) + fi + + dnl Make sure we scored some pthreads. + if test "x$enable_pthread" = "xyes" -a "x$have_pthread" != "xyes"; then + AC_MSG_ERROR([pthread requested but not found]) + fi + + dnl Set the output variables for CAIRO_ENABLE. + use_pthread="$have_pthread" + pthread_REQUIRES="" +]) diff --git a/build/configure.ac.system b/build/configure.ac.system new file mode 100644 index 000000000..b9d71c8d7 --- /dev/null +++ b/build/configure.ac.system @@ -0,0 +1,160 @@ +dnl +dnl Non-failing checks for functions, headers, libraries, etc go here +dnl + +dnl ==================================================================== +dnl Feature checks +dnl ==================================================================== + +AM_CONDITIONAL(CROSS_COMPILING, test "x$cross_compiling" = "xyes") +CAIRO_BIGENDIAN +AC_ARG_ENABLE(atomic, + [AS_HELP_STRING([--disable-atomic], + [disable use of native atomic operations])], + [use_atomic=$enableval], [use_atomic=yes]) +AS_IF([test "x$use_atomic" = "xyes"], [ + CAIRO_CHECK_NATIVE_ATOMIC_PRIMITIVES + CAIRO_CHECK_ATOMIC_OP_NEEDS_MEMORY_BARRIER +]) +AC_CHECK_SIZEOF(void *) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(size_t) + +AC_MSG_CHECKING([for native Win32]) +case "$host" in + *-*-mingw*) + cairo_os_win32=yes + ;; + *) + cairo_os_win32=no + ;; +esac +AC_MSG_RESULT([$cairo_os_win32]) +AM_CONDITIONAL(OS_WIN32, test "$cairo_os_win32" = "yes") + +AC_MSG_CHECKING([for Sun Solaris (non-POSIX ctime_r)]) +case "$host" in + *-*-solaris*) + CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS" + solaris_posix_pthread=yes + ;; + *) + solaris_posix_pthread=no + ;; +esac +AC_MSG_RESULT([$solaris_posix_pthread]) + +dnl ==================================================================== +dnl Library checks +dnl ==================================================================== + +AC_CHECK_LIBM +LIBS="$LIBS $LIBM" + +AC_CHECK_LIB(rt, sched_yield) + +has_shm_open= +AC_CHECK_LIB(rt, shm_open, [ + SHM_LIBS=-lrt + has_shm_open=yes + ], [SHM_LIBS=]) +AM_CONDITIONAL(HAVE_SHM, test "x$has_shm_open" = "xyes") +AC_SUBST(SHM_LIBS) + +AC_CHECK_LIB(socket, connect, [SOCKET_LIBS=-lsocket], [SOCKET_LIBS=]) +CAIROBOILERPLATE_LIBS=$SOCKET_LIBS +AC_SUBST(CAIROBOILERPLATE_LIBS) + +dnl ==================================================================== +dnl Header/function checks +dnl ==================================================================== + +dnl check if we have a __builtin_return_address for the cairo-trace +dnl utility. +AC_MSG_CHECKING([for __builtin_return_address(0)]) +AC_TRY_COMPILE([],[__builtin_return_address(0);], + [have_builtin_return_address=yes], + [have_builtin_return_address=no]) +AC_MSG_RESULT($have_builtin_return_address) +if test "x$have_builtin_return_address" = "xyes"; then + AC_DEFINE(HAVE_BUILTIN_RETURN_ADDRESS, 1, + [Define to 1 if your compiler supports the __builtin_return_address() intrinsic.]) +fi + +dnl Checks for precise integer types +AC_CHECK_HEADERS([stdint.h inttypes.h sys/int_types.h]) +AC_CHECK_TYPES([uint64_t, uint128_t, __uint128_t]) + +dnl Check for socket support for any2ppm daemon +AC_CHECK_HEADERS([fcntl.h unistd.h signal.h sys/stat.h sys/socket.h sys/poll.h sys/un.h]) + +dnl Check for infinite loops +AC_CHECK_FUNCS([alarm]) + +dnl check for CPU affinity support +AC_CHECK_HEADERS([sched.h], [AC_CHECK_FUNCS([sched_getaffinity])]) + +dnl check for mmap support +AC_CHECK_HEADERS([sys/mman.h], [AC_CHECK_FUNCS([mmap])]) + +dnl check for clock_gettime() support +AC_CHECK_HEADERS([time.h], [AC_CHECK_FUNCS([clock_gettime])]) + +dnl check for GNU-extensions to fenv +AC_CHECK_HEADER(fenv.h, + [AC_CHECK_FUNCS(feenableexcept fedisableexcept feclearexcept)]) + +dnl check for misc headers and functions +AC_CHECK_HEADERS([libgen.h byteswap.h signal.h setjmp.h fenv.h sys/wait.h]) +AC_CHECK_FUNCS([ctime_r drand48 flockfile funlockfile getline link strndup]) + +dnl check for win32 headers (this detects mingw as well) +AC_CHECK_HEADERS([windows.h], have_windows=yes, have_windows=no) + + +dnl Possible headers for mkdir +AC_CHECK_HEADERS([sys/stat.h io.h]) +AC_CHECK_FUNC(mkdir, + [AC_MSG_CHECKING([mkdir variant]) + mkdir_variant="unknown" + save_CFLAGS="$CFLAGS" + CFLAGS=$WARN_CFLAGS + AC_TRY_COMPILE([ +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + ], + [mkdir ("hello.world", 0777)], + mkdir_variant="mkdir(path, mode)", + [AC_TRY_COMPILE([ +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + ], + [mkdir ("hello.world")], + mkdir_variant="mkdir(path)")]) + AC_MSG_RESULT([$mkdir_variant]) + CFLAGS="$save_CFLAGS" + if test "x$mkdir_variant" = "xmkdir(path, mode)"; then + AC_DEFINE(HAVE_MKDIR, 2, + [Define to non-zero if your system has mkdir, and to 2 if your version of mkdir requires a mode parameter]) + else + AC_DEFINE(HAVE_MKDIR, 1, + [Define to non-zero if your system has mkdir, and to 2 if your version of mkdir requires a mode parameter]) + fi]) + +dnl =========================================================================== +dnl +dnl Test for the tools required for building one big test binary +dnl + +AC_CHECK_FUNCS(fork waitpid raise) + diff --git a/build/configure.ac.tools b/build/configure.ac.tools new file mode 100644 index 000000000..a24dbcecb --- /dev/null +++ b/build/configure.ac.tools @@ -0,0 +1,25 @@ + +AC_PATH_PROG(FIND, find) +AC_PATH_PROG(XARGS, xargs) + +AC_PROG_CC +AC_PROG_CPP +AC_PROG_CXX dnl required for BeOS (and cannot be a conditional dependency) +AM_PROG_CC_C_O +AC_C_INLINE + +dnl =========================================================================== + +PKG_PROG_PKG_CONFIG() +if test "x$PKG_CONFIG" = x; then + AC_MSG_ERROR([pkg-config >= $PKGCONFIG_REQUIRED required but not found (http://pkgconfig.freedesktop.org/)]) +fi + +dnl Check for recent pkg-config which supports Requires.private +case `$PKG_CONFIG --version` in +[0.?|0.?.?|0.1[0-7]|0.1[0-7].?]) PKGCONFIG_REQUIRES="Requires"; ;; +*) PKGCONFIG_REQUIRES="Requires.private"; ;; +esac + +AC_SUBST(PKGCONFIG_REQUIRES) + diff --git a/build/configure.ac.version b/build/configure.ac.version new file mode 100644 index 000000000..a91cee39e --- /dev/null +++ b/build/configure.ac.version @@ -0,0 +1,42 @@ +dnl +dnl Version stuff +dnl + +dnl This macro expands to one of 'git', 'snapshot', or 'release' +m4_define([cairo_release_status], + [m4_if(m4_eval(cairo_version_micro % 2), [1], [git], + [m4_if(m4_eval(cairo_version_minor % 2), [1], [snapshot], + [release])])]) + +dnl This is the .so/dll number. 2 for cairo-1.x.x +m4_define([cairo_version_sonum], m4_eval(cairo_version_major + 1)) + +dnl The libtool shared library version stuff +m4_define([cairo_version], + m4_eval(cairo_version_major*10000 + cairo_version_minor*100 + cairo_version_micro)) +m4_if(m4_eval(cairo_version_minor % 2), [1], + [ + dnl for unstable releases + m4_define([cairo_libtool_revision], 0) + ], + [ + dnl for stable releases + m4_define([cairo_libtool_revision], cairo_version_micro) + ]) +m4_define([cairo_libtool_current], + m4_eval(cairo_version_sonum + cairo_version - cairo_libtool_revision)) +m4_define([cairo_libtool_age], + m4_eval(cairo_libtool_current - cairo_version_sonum)) + +CAIRO_VERSION_MAJOR=cairo_version_major +CAIRO_VERSION_MINOR=cairo_version_minor +CAIRO_VERSION_MICRO=cairo_version_micro +CAIRO_VERSION_SONUM=cairo_version_sonum +CAIRO_RELEASE_STATUS=cairo_release_status +CAIRO_LIBTOOL_VERSION_INFO=cairo_libtool_current:cairo_libtool_revision:cairo_libtool_age +AC_SUBST(CAIRO_VERSION_MAJOR) +AC_SUBST(CAIRO_VERSION_MINOR) +AC_SUBST(CAIRO_VERSION_MICRO) +AC_SUBST(CAIRO_VERSION_SONUM) +AC_SUBST(CAIRO_RELEASE_STATUS) +AC_SUBST(CAIRO_LIBTOOL_VERSION_INFO) diff --git a/build/configure.ac.warnings b/build/configure.ac.warnings new file mode 100644 index 000000000..74e6634b2 --- /dev/null +++ b/build/configure.ac.warnings @@ -0,0 +1,99 @@ +dnl Use lots of warning flags with with gcc and compatible compilers + +dnl Note: if you change the following variable, the cache is automatically +dnl skipped and all flags rechecked. So there's no need to do anything +dnl else. If for any reason you need to force a recheck, just change +dnl MAYBE_WARN in an ignorable way (like adding whitespace) + +# -Wcast-align generates lots of false positive reports we need to +# cast image data from uint8_t to uin32_t. + +# -Wlogical-op causes too much noise from strcmp("literal", str) + +MAYBE_WARN="-Wall -Wextra \ +-Wmissing-declarations -Werror-implicit-function-declaration \ +-Wpointer-arith -Wwrite-strings -Wsign-compare -Wpacked +-Wswitch-enum -Wmissing-format-attribute -Wvolatile-register-var \ +-Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ +-Wno-missing-field-initializers -Wno-unused-parameter \ +-Wno-attributes -Wno-long-long -Winline" + +MAYBE_C_SPECIFIC_WARN="-Wold-style-definition \ +-Wdeclaration-after-statement -Wstrict-prototypes \ +-Wmissing-prototypes -Wbad-function-cast -Wnested-externs" + +# New -Wno options should be added here +# gcc-4.4 and later accept every -Wno- option but may complain later that this +# option is unknow each time another warning happen. +# -Wunused-but-set-variable is too noisy at present +NO_WARN="unused-but-set-variable" + +dnl Sun Studio 12 likes to rag at us for abusing enums like +dnl having cairo_status_t variables hold cairo_int_status_t +dnl values. It's bad, we know. Now please be quiet. +MAYBE_WARN="$MAYBE_WARN -erroff=E_ENUM_TYPE_MISMATCH_ARG \ + -erroff=E_ENUM_TYPE_MISMATCH_OP" + +dnl We also abuse the warning-flag facility to enable other compiler +dnl options. Namely, the following: +MAYBE_WARN="$MAYBE_WARN -fno-strict-aliasing -fno-common" + +dnl Also to turn various gcc/glibc-specific preprocessor checks +MAYBE_WARN="$MAYBE_WARN -Wp,-D_FORTIFY_SOURCE=2" + +# invalidate cached value if MAYBE_WARN has changed +if test "x$cairo_cv_warn_maybe" != "x$MAYBE_WARN"; then + unset cairo_cv_warn_cflags +fi +AC_CACHE_CHECK([for supported warning flags], cairo_cv_warn_cflags, [ + echo + WARN_CFLAGS="" + + # Some warning options are not supported by all versions of + # gcc, so test all desired options against the current + # compiler. + # + # Note that there are some order dependencies + # here. Specifically, an option that disables a warning will + # have no net effect if a later option then enables that + # warnings, (perhaps implicitly). So we put some grouped + # options (-Wall and -Wextra) up front and the -Wno options + # last. + + for W in $MAYBE_WARN; do + CAIRO_CC_TRY_FLAG([$W],, [WARN_CFLAGS="$WARN_CFLAGS $W"]) + done + for W in $NO_WARN; do + CAIRO_CC_TRY_FLAG([-W$W -Wno-$W],, [WARN_CFLAGS="$WARN_CFLAGS -Wno-$W"]) + done + cairo_cv_warn_cflags=$WARN_CFLAGS + cairo_cv_warn_maybe="$MAYBE_WARN $MAYBE_C_SPECIFIC_WARN" + + AC_MSG_CHECKING([which warning flags were supported]) +]) +WARN_CFLAGS="$cairo_cv_warn_cflags" +CAIRO_CFLAGS="$CAIRO_CFLAGS $WARN_CFLAGS" + +# We only wish to enable attribute(warn_unused_result) if we can prevent +# gcc from generating thousands of warnings about the misapplication of the +# attribute to void functions and variables. +AC_CACHE_CHECK([how to enable unused result warnings], cairo_cv_warn_unused_result, [ + AC_REQUIRE([AC_PROG_GREP]) + cairo_cv_warn_unused_result="" + if echo $WARN_CFLAGS | $GREP -e '-Wno-attributes' >/dev/null; then + CAIRO_CC_TRY_FLAG_SILENT( + [-Wno-attributes], + [__attribute__((__warn_unused_result__)) void f (void) {} + __attribute__((__warn_unused_result__)) int g;], + [cairo_cv_warn_unused_result="__attribute__((__warn_unused_result__))"]) + fi +]) +AC_DEFINE_UNQUOTED([WARN_UNUSED_RESULT], [$cairo_cv_warn_unused_result], + [Define to the value your compiler uses to support the warn-unused-result attribute]) + +dnl check linker flags +AC_CACHE_CHECK([how to allow undefined symbols in shared libraries used by test suite], cairo_cv_test_undefined_ldflags, + [CAIRO_CC_TRY_FLAG_SILENT([-Wl,--allow-shlib-undefined], [], + [cairo_cv_test_undefined_ldflags="-Wl,--allow-shlib-undefined]")]) +CAIRO_TEST_UNDEFINED_LDFLAGS="$cairo_cv_test_undefined_ldflags" +AC_SUBST(CAIRO_TEST_UNDEFINED_LDFLAGS) diff --git a/build/depcomp b/build/depcomp new file mode 100755 index 000000000..4ebd5b3a2 --- /dev/null +++ b/build/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2013 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/gtk-doc.m4 b/build/gtk-doc.m4 new file mode 100644 index 000000000..36755432b --- /dev/null +++ b/build/gtk-doc.m4 @@ -0,0 +1,88 @@ +dnl -*- mode: autoconf -*- + +# serial 2 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + + ifelse([$1],[],[gtk_doc_requires="gtk-doc"],[gtk_doc_requires="gtk-doc >= $1"]) + AC_MSG_CHECKING([for gtk-doc]) + PKG_CHECK_EXISTS([$gtk_doc_requires],[have_gtk_doc=yes],[have_gtk_doc=no]) + AC_MSG_RESULT($have_gtk_doc) + + if test "$have_gtk_doc" = "no"; then + AC_MSG_WARN([ + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found.]) + fi + + dnl check for tools we added during development + dnl Use AC_CHECK_PROG to avoid the check target using an absolute path that + dnl may not be writable by the user. Currently, automake requires that the + dnl test name must end in '.test'. + dnl https://bugzilla.gnome.org/show_bug.cgi?id=701638 + AC_CHECK_PROG([GTKDOC_CHECK],[gtkdoc-check],[gtkdoc-check.test]) + AC_PATH_PROG([GTKDOC_CHECK_PATH],[gtkdoc-check]) + AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) + AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) + + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + AC_MSG_ERROR([ + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '[$]0'.]) + fi + + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,[:]) + fi + + dnl enable/disable output formats + AC_ARG_ENABLE([gtk-doc-html], + AS_HELP_STRING([--enable-gtk-doc-html], + [build documentation in html format [[default=yes]]]),, + [enable_gtk_doc_html=yes]) + AC_ARG_ENABLE([gtk-doc-pdf], + AS_HELP_STRING([--enable-gtk-doc-pdf], + [build documentation in pdf format [[default=no]]]),, + [enable_gtk_doc_pdf=no]) + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + AC_SUBST([AM_DEFAULT_VERBOSITY]) + + AM_CONDITIONAL([HAVE_GTK_DOC], [test x$have_gtk_doc = xyes]) + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) + AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) +]) diff --git a/build/install-sh b/build/install-sh new file mode 100755 index 000000000..377bb8687 --- /dev/null +++ b/build/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-11-20.07; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/libtool.m4 b/build/libtool.m4 new file mode 100644 index 000000000..d7c043f4f --- /dev/null +++ b/build/libtool.m4 @@ -0,0 +1,7997 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to <bug-libtool@gnu.org>." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +_LT_PATH_LD_GNU +AC_SUBST([LD]) + +_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) +])# LT_PATH_LD + +# Old names: +AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) +AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_LD], []) +dnl AC_DEFUN([AC_PROG_LD], []) + + +# _LT_PATH_LD_GNU +#- -------------- +m4_defun([_LT_PATH_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac]) +with_gnu_ld=$lt_cv_prog_gnu_ld +])# _LT_PATH_LD_GNU + + +# _LT_CMD_RELOAD +# -------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +m4_defun([_LT_CMD_RELOAD], +[AC_CACHE_CHECK([for $LD option to reload object files], + lt_cv_ld_reload_flag, + [lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac +_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl +_LT_TAGDECL([], [reload_cmds], [2])dnl +])# _LT_CMD_RELOAD + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/build/ltmain.sh b/build/ltmain.sh new file mode 100644 index 000000000..a356acafa --- /dev/null +++ b/build/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to <bug-libtool@gnu.org>. +# GNU libtool home page: <http://www.gnu.org/software/libtool/>. +# General help using GNU software: <http://www.gnu.org/gethelp/>. + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1" +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <<EOF +# $write_libobj - a libtool object file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object=$write_lobj + +# Name of the non-PIC object +non_pic_object=$write_oldobj + +EOF + $MV "${write_libobj}T" "${write_libobj}" + } +} + + +################################################## +# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # +################################################## + +# func_convert_core_file_wine_to_w32 ARG +# Helper function used by file name conversion functions when $build is *nix, +# and $host is mingw, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. +# +# ARG is the $build file name to be converted to w32 format. +# Result is available in $func_convert_core_file_wine_to_w32_result, and will +# be empty on error (or when ARG is empty) +func_convert_core_file_wine_to_w32 () +{ + $opt_debug + func_convert_core_file_wine_to_w32_result="$1" + if test -n "$1"; then + # Unfortunately, winepath does not exit with a non-zero error code, so we + # are forced to check the contents of stdout. On the other hand, if the + # command is not found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both error code of + # zero AND non-empty stdout, which explains the odd construction: + func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen <import library>. + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 </dev/null >/dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat <<EOF + +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname + Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION + + The $output program cannot be directly executed until all the libtool + libraries that it depends on are installed. + + This wrapper executable should never be moved out of the build directory. + If it is, it will not operate correctly. +*/ +EOF + cat <<"EOF" +#ifdef _MSC_VER +# define _CRT_SECURE_NO_DEPRECATE 1 +#endif +#include <stdio.h> +#include <stdlib.h> +#ifdef _MSC_VER +# include <direct.h> +# include <process.h> +# include <io.h> +#else +# include <unistd.h> +# include <stdint.h> +# ifdef __CYGWIN__ +# include <io.h> +# endif +#endif +#include <malloc.h> +#include <stdarg.h> +#include <assert.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <<EOF +volatile const char * MAGIC_EXE = "$magic_exe"; +const char * LIB_PATH_VARNAME = "$shlibpath_var"; +EOF + + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + func_to_host_path "$temp_rpath" + cat <<EOF +const char * LIB_PATH_VALUE = "$func_to_host_path_result"; +EOF + else + cat <<"EOF" +const char * LIB_PATH_VALUE = ""; +EOF + fi + + if test -n "$dllsearchpath"; then + func_to_host_path "$dllsearchpath:" + cat <<EOF +const char * EXE_PATH_VARNAME = "PATH"; +const char * EXE_PATH_VALUE = "$func_to_host_path_result"; +EOF + else + cat <<"EOF" +const char * EXE_PATH_VARNAME = ""; +const char * EXE_PATH_VALUE = ""; +EOF + fi + + if test "$fast_install" = yes; then + cat <<EOF +const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ +EOF + else + cat <<EOF +const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ +EOF + fi + + + cat <<"EOF" + +#define LTWRAPPER_OPTION_PREFIX "--lt-" + +static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; +static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; +static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; + +int +main (int argc, char *argv[]) +{ + char **newargz; + int newargc; + char *tmp_pathspec; + char *actual_cwrapper_path; + char *actual_cwrapper_name; + char *target_name; + char *lt_argv_zero; + intptr_t rval = 127; + + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + newargz = XMALLOC (char *, argc + 1); + + /* very simple arg parsing; don't want to rely on getopt + * also, copy all non cwrapper options to newargz, except + * argz[0], which is handled differently + */ + newargc=0; + for (i = 1; i < argc; i++) + { + if (strcmp (argv[i], dumpscript_opt) == 0) + { +EOF + case "$host" in + *mingw* | *cygwin* ) + # make stdout use "unix" line endings + echo " setmode(1,_O_BINARY);" + ;; + esac + + cat <<"EOF" + lt_dump_script (stdout); + return 0; + } + if (strcmp (argv[i], debug_opt) == 0) + { + lt_debug = 1; + continue; + } + if (strcmp (argv[i], ltwrapper_option_prefix) == 0) + { + /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX + namespace, but it is not one of the ones we know about and + have already dealt with, above (inluding dump-script), then + report an error. Otherwise, targets might begin to believe + they are allowed to use options in the LTWRAPPER_OPTION_PREFIX + namespace. The first time any user complains about this, we'll + need to make LTWRAPPER_OPTION_PREFIX a configure-time option + or a configure.ac-settable value. + */ + lt_fatal (__FILE__, __LINE__, + "unrecognized %s option: '%s'", + ltwrapper_option_prefix, argv[i]); + } + /* otherwise ... */ + newargz[++newargc] = xstrdup (argv[i]); + } + newargz[++newargc] = NULL; + +EOF + cat <<EOF + /* The GNU banner must be the first non-error debug message */ + lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n"); +EOF + cat <<"EOF" + lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); + lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); + + tmp_pathspec = find_executable (argv[0]); + if (tmp_pathspec == NULL) + lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (before symlink chase) at: %s\n", + tmp_pathspec); + + actual_cwrapper_path = chase_symlinks (tmp_pathspec); + lt_debugprintf (__FILE__, __LINE__, + "(main) found exe (after symlink chase) at: %s\n", + actual_cwrapper_path); + XFREE (tmp_pathspec); + + actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); + strendzap (actual_cwrapper_path, actual_cwrapper_name); + + /* wrapper name transforms */ + strendzap (actual_cwrapper_name, ".exe"); + tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); + XFREE (actual_cwrapper_name); + actual_cwrapper_name = tmp_pathspec; + tmp_pathspec = 0; + + /* target_name transforms -- use actual target program name; might have lt- prefix */ + target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); + strendzap (target_name, ".exe"); + tmp_pathspec = lt_extend_str (target_name, ".exe", 1); + XFREE (target_name); + target_name = tmp_pathspec; + tmp_pathspec = 0; + + lt_debugprintf (__FILE__, __LINE__, + "(main) libtool target name: %s\n", + target_name); +EOF + + cat <<EOF + newargz[0] = + XMALLOC (char, (strlen (actual_cwrapper_path) + + strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); + strcpy (newargz[0], actual_cwrapper_path); + strcat (newargz[0], "$objdir"); + strcat (newargz[0], "/"); +EOF + + cat <<"EOF" + /* stop here, and copy so we don't have to do this twice */ + tmp_pathspec = xstrdup (newargz[0]); + + /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ + strcat (newargz[0], actual_cwrapper_name); + + /* DO want the lt- prefix here if it exists, so use target_name */ + lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); + XFREE (tmp_pathspec); + tmp_pathspec = NULL; +EOF + + case $host_os in + mingw*) + cat <<"EOF" + { + char* p; + while ((p = strchr (newargz[0], '\\')) != NULL) + { + *p = '/'; + } + while ((p = strchr (lt_argv_zero, '\\')) != NULL) + { + *p = '/'; + } + } +EOF + ;; + esac + + cat <<"EOF" + XFREE (target_name); + XFREE (actual_cwrapper_path); + XFREE (actual_cwrapper_name); + + lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ + lt_setenv ("DUALCASE", "1"); /* for MSK sh */ + /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must + be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) + because on Windows, both *_VARNAMEs are PATH but uninstalled + libraries must come first. */ + lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); + lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); + + lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", + nonnull (lt_argv_zero)); + for (i = 0; i < newargc; i++) + { + lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", + i, nonnull (newargz[i])); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + newargz = prepare_spawn (newargz); + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + lt_debugprintf (__FILE__, __LINE__, + "(main) failed to launch target \"%s\": %s\n", + lt_argv_zero, nonnull (strerror (errno))); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal (__FILE__, __LINE__, "memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c <<EOF + int main() { return 0; } +EOF + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then + ldd_output=`ldd conftest` + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + func_append newdeplibs " $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + func_append newdeplibs " $i" + else + droppeddeps=yes + echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which I believe you do not have" + echo "*** because a test_compile did reveal that the linker did not use it for" + echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + ;; + *) + func_append newdeplibs " $i" + ;; + esac + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then + ldd_output=`ldd conftest` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + func_append newdeplibs " $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + func_append newdeplibs " $i" + else + droppeddeps=yes + echo + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because a test_compile did reveal that the linker did not use this one" + echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi + fi + else + droppeddeps=yes + echo + $ECHO "*** Warning! Library $i is needed by this library but I was not able to" + echo "*** make it link in! You will probably need to install it or some" + echo "*** library that it depends on before this library will be fully" + echo "*** functional. Installing it before continuing would be even better." + fi + ;; + *) + func_append newdeplibs " $i" + ;; + esac + done + fi + ;; + file_magic*) + set dummy $deplibs_check_method; shift + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + if test -n "$file_magic_glob"; then + libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` + else + libnameglob=$libname + fi + test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + if test "$want_nocaseglob" = yes; then + shopt -s nocaseglob + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/build/ltoptions.m4 b/build/ltoptions.m4 new file mode 100644 index 000000000..5d9acd8e2 --- /dev/null +++ b/build/ltoptions.m4 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/build/ltsugar.m4 b/build/ltsugar.m4 new file mode 100644 index 000000000..9000a057d --- /dev/null +++ b/build/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/build/ltversion.m4 b/build/ltversion.m4 new file mode 100644 index 000000000..07a8602d4 --- /dev/null +++ b/build/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/build/lt~obsolete.m4 b/build/lt~obsolete.m4 new file mode 100644 index 000000000..c573da90c --- /dev/null +++ b/build/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/build/missing b/build/missing new file mode 100755 index 000000000..db98974ff --- /dev/null +++ b/build/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to <bug-automake@gnu.org>." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build/test-driver b/build/test-driver new file mode 100755 index 000000000..d30605660 --- /dev/null +++ b/build/test-driver @@ -0,0 +1,139 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2013-07-13.22; # UTC + +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <bug-automake@gnu.org> or send patches to +# <automake-patches@gnu.org>. + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <<END +Usage: + test-driver --test-name=NAME --log-file=PATH --trs-file=PATH + [--expect-failure={yes|no}] [--color-tests={yes|no}] + [--enable-hard-errors={yes|no}] [--] + TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] +The '--test-name', '--log-file' and '--trs-file' options are mandatory. +END +} + +test_name= # Used for reporting. +log_file= # Where to save the output of the test script. +trs_file= # Where to save the metadata of the test run. +expect_failure=no +color_tests=no +enable_hard_errors=yes +while test $# -gt 0; do + case $1 in + --help) print_usage; exit $?;; + --version) echo "test-driver $scriptversion"; exit $?;; + --test-name) test_name=$2; shift;; + --log-file) log_file=$2; shift;; + --trs-file) trs_file=$2; shift;; + --color-tests) color_tests=$2; shift;; + --expect-failure) expect_failure=$2; shift;; + --enable-hard-errors) enable_hard_errors=$2; shift;; + --) shift; break;; + -*) usage_error "invalid option: '$1'";; + *) break;; + esac + shift +done + +missing_opts= +test x"$test_name" = x && missing_opts="$missing_opts --test-name" +test x"$log_file" = x && missing_opts="$missing_opts --log-file" +test x"$trs_file" = x && missing_opts="$missing_opts --trs-file" +if test x"$missing_opts" != x; then + usage_error "the following mandatory options are missing:$missing_opts" +fi + +if test $# -eq 0; then + usage_error "missing argument" +fi + +if test $color_tests = yes; then + # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. + red='' # Red. + grn='' # Green. + lgn='' # Light green. + blu='' # Blue. + mgn='' # Magenta. + std='' # No color. +else + red= grn= lgn= blu= mgn= std= +fi + +do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' +trap "st=129; $do_exit" 1 +trap "st=130; $do_exit" 2 +trap "st=141; $do_exit" 13 +trap "st=143; $do_exit" 15 + +# Test script is run here. +"$@" >$log_file 2>&1 +estatus=$? +if test $enable_hard_errors = no && test $estatus -eq 99; then + estatus=1 +fi + +case $estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/cairo-version.h b/cairo-version.h new file mode 100644 index 000000000..516999ee6 --- /dev/null +++ b/cairo-version.h @@ -0,0 +1,8 @@ +#ifndef CAIRO_VERSION_H +#define CAIRO_VERSION_H + +#define CAIRO_VERSION_MAJOR 1 +#define CAIRO_VERSION_MINOR 14 +#define CAIRO_VERSION_MICRO 2 + +#endif diff --git a/config.h.in b/config.h.in new file mode 100644 index 000000000..14e3f4440 --- /dev/null +++ b/config.h.in @@ -0,0 +1,413 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* whether memory barriers are needed around atomic operations */ +#undef ATOMIC_OP_NEEDS_MEMORY_BARRIER + +/* Define to 1 if the PDF backend can be tested (need poppler and other + dependencies for pdf2png) */ +#undef CAIRO_CAN_TEST_PDF_SURFACE + +/* Define to 1 if the PS backend can be tested (needs ghostscript) */ +#undef CAIRO_CAN_TEST_PS_SURFACE + +/* Define to 1 if the SVG backend can be tested */ +#undef CAIRO_CAN_TEST_SVG_SURFACE + +/* Define to 1 if the Win32 Printing backend can be tested (needs ghostscript) + */ +#undef CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE + +/* Define to 1 if dlsym is available */ +#undef CAIRO_HAS_DLSYM + +/* Define to 1 to enable cairo's cairo-script-interpreter feature */ +#undef CAIRO_HAS_INTERPRETER + +/* Define to 1 to enable cairo's pthread feature */ +#undef CAIRO_HAS_PTHREAD + +/* Define to 1 if we have full pthread support */ +#undef CAIRO_HAS_REAL_PTHREAD + +/* Define to 1 if libspectre is available */ +#undef CAIRO_HAS_SPECTRE + +/* Define to 1 to enable cairo's symbol-lookup feature */ +#undef CAIRO_HAS_SYMBOL_LOOKUP + +/* Define to 1 to enable cairo's test surfaces feature */ +#undef CAIRO_HAS_TEST_SURFACES + +/* Define to 1 to enable cairo's cairo-trace feature */ +#undef CAIRO_HAS_TRACE + +/* Define to 1 to disable certain code paths that rely heavily on double + precision floating-point calculation */ +#undef DISABLE_SOME_FLOATING_POINT + +/* Define to 1 if your system stores words within floats with the most + significant word first */ +#undef FLOAT_WORDS_BIGENDIAN + +/* Enable pixman glyph cache */ +#undef HAS_PIXMAN_GLYPHS + +/* Define to 1 if you have the `alarm' function. */ +#undef HAVE_ALARM + +/* Define to 1 if you have the binutils development files installed */ +#undef HAVE_BFD + +/* Define to 1 if your compiler supports the __builtin_return_address() + intrinsic. */ +#undef HAVE_BUILTIN_RETURN_ADDRESS + +/* Define to 1 if you have the <byteswap.h> header file. */ +#undef HAVE_BYTESWAP_H + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define to 1 if you have the `ctime_r' function. */ +#undef HAVE_CTIME_R + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `drand48' function. */ +#undef HAVE_DRAND48 + +/* Define to 1 if you have the `FcFini' function. */ +#undef HAVE_FCFINI + +/* Define to 1 if you have the `FcInit' function. */ +#undef HAVE_FCINIT + +/* Define to 1 if you have the <fcntl.h> header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `feclearexcept' function. */ +#undef HAVE_FECLEAREXCEPT + +/* Define to 1 if you have the `fedisableexcept' function. */ +#undef HAVE_FEDISABLEEXCEPT + +/* Define to 1 if you have the `feenableexcept' function. */ +#undef HAVE_FEENABLEEXCEPT + +/* Define to 1 if you have the <fenv.h> header file. */ +#undef HAVE_FENV_H + +/* Define to 1 if you have the `flockfile' function. */ +#undef HAVE_FLOCKFILE + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `FT_Get_X11_Font_Format' function. */ +#undef HAVE_FT_GET_X11_FONT_FORMAT + +/* Define to 1 if you have the `FT_GlyphSlot_Embolden' function. */ +#undef HAVE_FT_GLYPHSLOT_EMBOLDEN + +/* Define to 1 if you have the `FT_GlyphSlot_Oblique' function. */ +#undef HAVE_FT_GLYPHSLOT_OBLIQUE + +/* Define to 1 if you have the `FT_Library_SetLcdFilter' function. */ +#undef HAVE_FT_LIBRARY_SETLCDFILTER + +/* Define to 1 if you have the `FT_Load_Sfnt_Table' function. */ +#undef HAVE_FT_LOAD_SFNT_TABLE + +/* Define to 1 if you have the `funlockfile' function. */ +#undef HAVE_FUNLOCKFILE + +/* Whether you have gcov */ +#undef HAVE_GCOV + +/* Define to 1 if you have the `getline' function. */ +#undef HAVE_GETLINE + +/* Enable if your compiler supports the Intel __sync_* atomic primitives */ +#undef HAVE_INTEL_ATOMIC_PRIMITIVES + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the <io.h> header file. */ +#undef HAVE_IO_H + +/* Define to 1 if you have the <libgen.h> header file. */ +#undef HAVE_LIBGEN_H + +/* Define to 1 if you have the `rt' library (-lrt). */ +#undef HAVE_LIBRT + +/* Enable if you have libatomic-ops-dev installed */ +#undef HAVE_LIB_ATOMIC_OPS + +/* Define to 1 if you have the `link' function. */ +#undef HAVE_LINK + +/* Define to 1 if you have the Valgrind lockdep tool */ +#undef HAVE_LOCKDEP + +/* Define to 1 if you have lzo available */ +#undef HAVE_LZO + +/* Define to 1 if you have the Valgrind memfault tool */ +#undef HAVE_MEMFAULT + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to non-zero if your system has mkdir, and to 2 if your version of + mkdir requires a mode parameter */ +#undef HAVE_MKDIR + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Enable if you have MacOS X atomic operations */ +#undef HAVE_OS_ATOMIC_OPS + +/* Define to 1 if you have the `poppler_page_render' function. */ +#undef HAVE_POPPLER_PAGE_RENDER + +/* Define to 1 if you have the `raise' function. */ +#undef HAVE_RAISE + +/* Define to 1 if you have the `rsvg_pixbuf_from_file' function. */ +#undef HAVE_RSVG_PIXBUF_FROM_FILE + +/* Define to 1 if you have the `sched_getaffinity' function. */ +#undef HAVE_SCHED_GETAFFINITY + +/* Define to 1 if you have the <sched.h> header file. */ +#undef HAVE_SCHED_H + +/* Define to 1 if you have the <setjmp.h> header file. */ +#undef HAVE_SETJMP_H + +/* Define to 1 if you have the <signal.h> header file. */ +#undef HAVE_SIGNAL_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the <sys/int_types.h> header file. */ +#undef HAVE_SYS_INT_TYPES_H + +/* Define to 1 if you have the <sys/ioctl.h> header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the <sys/poll.h> header file. */ +#undef HAVE_SYS_POLL_H + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <sys/un.h> header file. */ +#undef HAVE_SYS_UN_H + +/* Define to 1 if you have the <sys/wait.h> header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the <time.h> header file. */ +#undef HAVE_TIME_H + +/* Define to 1 if the system has the type `uint128_t'. */ +#undef HAVE_UINT128_T + +/* Define to 1 if the system has the type `uint64_t'. */ +#undef HAVE_UINT64_T + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have Valgrind */ +#undef HAVE_VALGRIND + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if you have the <windows.h> header file. */ +#undef HAVE_WINDOWS_H + +/* Define to 1 if you have the <X11/extensions/shmproto.h> header file. */ +#undef HAVE_X11_EXTENSIONS_SHMPROTO_H + +/* Define to 1 if you have the <X11/extensions/shmstr.h> header file. */ +#undef HAVE_X11_EXTENSIONS_SHMSTR_H + +/* Define to 1 if you have the <X11/extensions/XShm.h> header file. */ +#undef HAVE_X11_EXTENSIONS_XSHM_H + +/* Define to 1 if you have the `XRenderCreateConicalGradient' function. */ +#undef HAVE_XRENDERCREATECONICALGRADIENT + +/* Define to 1 if you have the `XRenderCreateLinearGradient' function. */ +#undef HAVE_XRENDERCREATELINEARGRADIENT + +/* Define to 1 if you have the `XRenderCreateRadialGradient' function. */ +#undef HAVE_XRENDERCREATERADIALGRADIENT + +/* Define to 1 if you have the `XRenderCreateSolidFill' function. */ +#undef HAVE_XRENDERCREATESOLIDFILL + +/* Define to 1 if you have zlib available */ +#undef HAVE_ZLIB + +/* Define to 1 if the system has the type `__uint128_t'. */ +#undef HAVE___UINT128_T + +/* Define to 1 if shared memory segments are released deferred. */ +#undef IPC_RMID_DEFERRED_RELEASE + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Shared library file extension */ +#undef SHARED_LIB_EXT + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define to the value your compiler uses to support the warn-unused-result + attribute */ +#undef WARN_UNUSED_RESULT + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + + +/* Deal with multiple architecture compiles on Mac OS X */ +#ifdef __APPLE_CC__ +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN 1 +#define FLOAT_WORDS_BIGENDIAN 1 +#else +#undef WORDS_BIGENDIAN +#undef FLOAT_WORDS_BIGENDIAN +#endif +#endif + + +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/configure b/configure new file mode 100755 index 000000000..bb5b8b774 --- /dev/null +++ b/configure @@ -0,0 +1,39139 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for cairo 1.14.2. +# +# Report bugs to <http://bugs.freedesktop.org/enter_bug.cgi?product=cairo>. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: http://bugs.freedesktop.org/enter_bug.cgi?product=cairo +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='cairo' +PACKAGE_TARNAME='cairo' +PACKAGE_VERSION='1.14.2' +PACKAGE_STRING='cairo 1.14.2' +PACKAGE_BUGREPORT='http://bugs.freedesktop.org/enter_bug.cgi?product=cairo' +PACKAGE_URL='http://cairographics.org/' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_unique_file="src/cairo.h" +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +HAVE_GTK_FALSE +HAVE_GTK_TRUE +gtk_LIBS +gtk_CFLAGS +BUILD_CXX_FALSE +BUILD_CXX_TRUE +DISABLE_SOME_FLOATING_POINT_FALSE +DISABLE_SOME_FLOATING_POINT_TRUE +shm_LIBS +BUILD_SPHINX_FALSE +BUILD_SPHINX_TRUE +glib_LIBS +glib_CFLAGS +CAIRO_HAS_SYMBOL_LOOKUP_FALSE +CAIRO_HAS_SYMBOL_LOOKUP_TRUE +BFD_LIBS +CAIRO_HAS_INTERPRETER_FALSE +CAIRO_HAS_INTERPRETER_TRUE +CAIRO_HAS_TRACE_FALSE +CAIRO_HAS_TRACE_TRUE +SHLIB_EXT +BUILD_ANY2PPM_FALSE +BUILD_ANY2PPM_TRUE +CAIRO_TEST_MODE +CAIRO_HAS_GOBJECT_FUNCTIONS_FALSE +CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE +GOBJECT_LIBS +GOBJECT_CFLAGS +real_pthread_LIBS +real_pthread_CFLAGS +pthread_LIBS +pthread_CFLAGS +HAVE_PTHREAD_FALSE +HAVE_PTHREAD_TRUE +HAVE_REAL_PTHREAD_FALSE +HAVE_REAL_PTHREAD_TRUE +CAIRO_HAS_PTHREAD_FALSE +CAIRO_HAS_PTHREAD_TRUE +CAIRO_HAS_XML_SURFACE_FALSE +CAIRO_HAS_XML_SURFACE_TRUE +CAIRO_HAS_TEE_SURFACE_FALSE +CAIRO_HAS_TEE_SURFACE_TRUE +pixman_LIBS +pixman_CFLAGS +CAIRO_HAS_TEST_SURFACES_FALSE +CAIRO_HAS_TEST_SURFACES_TRUE +CAIRO_CAN_TEST_SVG_SURFACE_FALSE +CAIRO_CAN_TEST_SVG_SURFACE_TRUE +LIBRSVG_LIBS +LIBRSVG_CFLAGS +CAIRO_HAS_SVG_SURFACE_FALSE +CAIRO_HAS_SVG_SURFACE_TRUE +CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE +CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE +CAIRO_CAN_TEST_PDF_SURFACE_FALSE +CAIRO_CAN_TEST_PDF_SURFACE_TRUE +POPPLER_LIBS +POPPLER_CFLAGS +CAIRO_HAS_PDF_SURFACE_FALSE +CAIRO_HAS_PDF_SURFACE_TRUE +CAIRO_HAS_SPECTRE_FALSE +CAIRO_HAS_SPECTRE_TRUE +CAIRO_CAN_TEST_PS_SURFACE_FALSE +CAIRO_CAN_TEST_PS_SURFACE_TRUE +LIBSPECTRE_LIBS +LIBSPECTRE_CFLAGS +CAIRO_HAS_PS_SURFACE_FALSE +CAIRO_HAS_PS_SURFACE_TRUE +CAIRO_HAS_FC_FONT_FALSE +CAIRO_HAS_FC_FONT_TRUE +FONTCONFIG_LIBS +FONTCONFIG_CFLAGS +CAIRO_HAS_FT_FONT_FALSE +CAIRO_HAS_FT_FONT_TRUE +FREETYPE_CONFIG +FREETYPE_LIBS +FREETYPE_CFLAGS +CAIRO_HAS_SCRIPT_SURFACE_FALSE +CAIRO_HAS_SCRIPT_SURFACE_TRUE +CAIRO_HAS_WGL_FUNCTIONS_FALSE +CAIRO_HAS_WGL_FUNCTIONS_TRUE +CAIRO_HAS_GLX_FUNCTIONS_FALSE +CAIRO_HAS_GLX_FUNCTIONS_TRUE +CAIRO_HAS_EGL_FUNCTIONS_FALSE +CAIRO_HAS_EGL_FUNCTIONS_TRUE +egl_LIBS +egl_CFLAGS +CAIRO_HAS_VG_SURFACE_FALSE +CAIRO_HAS_VG_SURFACE_TRUE +CAIRO_HAS_DIRECTFB_SURFACE_FALSE +CAIRO_HAS_DIRECTFB_SURFACE_TRUE +directfb_LIBS +directfb_CFLAGS +CAIRO_HAS_COGL_SURFACE_FALSE +CAIRO_HAS_COGL_SURFACE_TRUE +cogl_LIBS +cogl_CFLAGS +CAIRO_HAS_GLESV2_SURFACE_FALSE +CAIRO_HAS_GLESV2_SURFACE_TRUE +glesv2_LIBS +glesv2_CFLAGS +CAIRO_HAS_GL_SURFACE_FALSE +CAIRO_HAS_GL_SURFACE_TRUE +gl_LIBS +gl_CFLAGS +CAIRO_HAS_PNG_FUNCTIONS_FALSE +CAIRO_HAS_PNG_FUNCTIONS_TRUE +png_LIBS +png_CFLAGS +png_REQUIRES +CAIRO_HAS_GALLIUM_SURFACE_FALSE +CAIRO_HAS_GALLIUM_SURFACE_TRUE +gallium_DIR +mesa_DIR +CAIRO_HAS_DRM_SURFACE_FALSE +CAIRO_HAS_DRM_SURFACE_TRUE +drm_LIBS +drm_CFLAGS +CAIRO_HAS_BEOS_SURFACE_FALSE +CAIRO_HAS_BEOS_SURFACE_TRUE +CAIRO_HAS_OS2_SURFACE_FALSE +CAIRO_HAS_OS2_SURFACE_TRUE +CAIRO_HAS_SKIA_SURFACE_FALSE +CAIRO_HAS_SKIA_SURFACE_TRUE +skia_DIR +CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE +CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE +GS +CAIRO_HAS_WIN32_FONT_FALSE +CAIRO_HAS_WIN32_FONT_TRUE +CAIRO_HAS_WIN32_SURFACE_FALSE +CAIRO_HAS_WIN32_SURFACE_TRUE +CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE +CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE +CAIRO_HAS_QUARTZ_FONT_FALSE +CAIRO_HAS_QUARTZ_FONT_TRUE +CAIRO_HAS_QUARTZ_SURFACE_FALSE +CAIRO_HAS_QUARTZ_SURFACE_TRUE +CAIRO_HAS_QT_SURFACE_FALSE +CAIRO_HAS_QT_SURFACE_TRUE +qt_LIBS +qt_CFLAGS +CAIRO_HAS_XCB_SHM_FUNCTIONS_FALSE +CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE +xcb_shm_LIBS +xcb_shm_CFLAGS +CAIRO_HAS_XLIB_XCB_FUNCTIONS_FALSE +CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE +xlib_xcb_LIBS +xlib_xcb_CFLAGS +CAIRO_HAS_XCB_SURFACE_FALSE +CAIRO_HAS_XCB_SURFACE_TRUE +xcb_LIBS +xcb_CFLAGS +CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE +CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE +xlib_xrender_LIBS +xlib_xrender_CFLAGS +CAIRO_HAS_XLIB_SURFACE_FALSE +CAIRO_HAS_XLIB_SURFACE_TRUE +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS +XMKMF +xlib_LIBS +xlib_CFLAGS +CAIRO_HAS_DLSYM_FALSE +CAIRO_HAS_DLSYM_TRUE +CAIRO_HAS_DL_FALSE +CAIRO_HAS_DL_TRUE +lzo_LIBS +VALGRIND_LIBS +VALGRIND_CFLAGS +CAIRO_HAS_LCOV_FALSE +CAIRO_HAS_LCOV_TRUE +LTP_GENHTML +LTP +SHTOOL +CAIROBOILERPLATE_LIBS +SHM_LIBS +HAVE_SHM_FALSE +HAVE_SHM_TRUE +LIBM +OS_WIN32_FALSE +OS_WIN32_TRUE +CROSS_COMPILING_FALSE +CROSS_COMPILING_TRUE +CAIRO_TEST_UNDEFINED_LDFLAGS +CAIRO_NONPKGCONFIG_LIBS +CAIRO_LIBS +CAIRO_NONPKGCONFIG_CFLAGS +CAIRO_LDFLAGS +CAIRO_CFLAGS +CAIRO_REQUIRES +PKGCONFIG_REQUIRES +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +XARGS +FIND +CAIRO_LIBTOOL_VERSION_INFO +CAIRO_RELEASE_STATUS +CAIRO_VERSION_SONUM +CAIRO_VERSION_MICRO +CAIRO_VERSION_MINOR +CAIRO_VERSION_MAJOR +GTK_DOC_USE_REBASE_FALSE +GTK_DOC_USE_REBASE_TRUE +GTK_DOC_USE_LIBTOOL_FALSE +GTK_DOC_USE_LIBTOOL_TRUE +GTK_DOC_BUILD_PDF_FALSE +GTK_DOC_BUILD_PDF_TRUE +GTK_DOC_BUILD_HTML_FALSE +GTK_DOC_BUILD_HTML_TRUE +ENABLE_GTK_DOC_FALSE +ENABLE_GTK_DOC_TRUE +HAVE_GTK_DOC_FALSE +HAVE_GTK_DOC_TRUE +GTKDOC_DEPS_LIBS +GTKDOC_DEPS_CFLAGS +HTML_DIR +GTKDOC_MKPDF +GTKDOC_REBASE +GTKDOC_CHECK_PATH +GTKDOC_CHECK +PKG_CONFIG +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +OBJDUMP +DLLTOOL +AS +ac_ct_AR +AR +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +EGREP +GREP +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_silent_rules +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +with_html_dir +enable_gtk_doc +enable_gtk_doc_html +enable_gtk_doc_pdf +enable_largefile +enable_atomic +enable_gcov +enable_valgrind +enable_xlib +with_x +enable_xlib_xrender +enable_xcb +enable_xlib_xcb +enable_xcb_shm +enable_qt +enable_quartz +enable_quartz_font +enable_quartz_image +enable_win32 +enable_win32_font +enable_skia +with_skia +with_skia_build_type +enable_os2 +enable_beos +enable_drm +enable_gallium +with_gallium +enable_png +enable_gl +enable_glesv2 +enable_cogl +enable_directfb +enable_vg +enable_egl +enable_glx +enable_wgl +enable_script +enable_ft +enable_fc +enable_ps +enable_pdf +enable_svg +enable_test_surfaces +enable_tee +enable_xml +enable_pthread +enable_gobject +enable_full_testing +enable_trace +enable_interpreter +enable_symbol_lookup +enable_some_floating_point +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +PKG_CONFIG +GTKDOC_DEPS_CFLAGS +GTKDOC_DEPS_LIBS +CXX +CXXFLAGS +CCC +CXXCPP +VALGRIND_CFLAGS +VALGRIND_LIBS +xlib_CFLAGS +xlib_LIBS +XMKMF +xlib_xrender_CFLAGS +xlib_xrender_LIBS +xcb_CFLAGS +xcb_LIBS +xlib_xcb_CFLAGS +xlib_xcb_LIBS +xcb_shm_CFLAGS +xcb_shm_LIBS +qt_CFLAGS +qt_LIBS +drm_CFLAGS +drm_LIBS +png_REQUIRES +png_CFLAGS +png_LIBS +gl_CFLAGS +gl_LIBS +glesv2_CFLAGS +glesv2_LIBS +cogl_CFLAGS +cogl_LIBS +directfb_CFLAGS +directfb_LIBS +egl_CFLAGS +egl_LIBS +FREETYPE_CFLAGS +FREETYPE_LIBS +FONTCONFIG_CFLAGS +FONTCONFIG_LIBS +LIBSPECTRE_CFLAGS +LIBSPECTRE_LIBS +POPPLER_CFLAGS +POPPLER_LIBS +LIBRSVG_CFLAGS +LIBRSVG_LIBS +pixman_CFLAGS +pixman_LIBS +GOBJECT_CFLAGS +GOBJECT_LIBS +glib_CFLAGS +glib_LIBS +gtk_CFLAGS +gtk_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures cairo 1.14.2 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/cairo] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of cairo 1.14.2:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-gtk-doc use gtk-doc to build documentation [[default=no]] + --enable-gtk-doc-html build documentation in html format [[default=yes]] + --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] + --disable-largefile omit support for large files + --disable-atomic disable use of native atomic operations + --enable-gcov Enable gcov + --disable-valgrind Disable valgrind support + --enable-xlib=[no/auto/yes] + Enable cairo's Xlib surface backend feature + [default=auto] + --enable-xlib-xrender=[no/auto/yes] + Enable cairo's Xlib Xrender surface backend feature + [default=auto] + --enable-xcb=[no/auto/yes] + Enable cairo's XCB surface backend feature + [default=auto] + --enable-xlib-xcb=[no/auto/yes] + Enable cairo's Xlib/XCB functions feature + [default=no] + --enable-xcb-shm=[no/auto/yes] + Enable cairo's XCB/SHM functions feature + [default=auto] + --enable-qt=[no/auto/yes] + Enable cairo's Qt surface backend feature + [default=no] + --enable-quartz=[no/auto/yes] + Enable cairo's Quartz surface backend feature + [default=auto] + --enable-quartz-font=[no/auto/yes] + Enable cairo's Quartz font backend feature + [default=auto] + --enable-quartz-image=[no/auto/yes] + Enable cairo's Quartz Image surface backend feature + [default=no] + --enable-win32=[no/auto/yes] + Enable cairo's Microsoft Windows surface backend + feature [default=auto] + --enable-win32-font=[no/auto/yes] + Enable cairo's Microsoft Windows font backend + feature [default=auto] + --enable-skia=[no/auto/yes] + Enable cairo's Skia surface backend feature + [default=no] + --enable-os2=[no/auto/yes] + Enable cairo's OS/2 surface backend feature + [default=no] + --enable-beos=[no/auto/yes] + Enable cairo's BeOS/Zeta surface backend feature + [default=no] + --enable-drm=[no/auto/yes] + Enable cairo's DRM surface backend feature + [default=no] + --enable-gallium=[no/auto/yes] + Enable cairo's Gallium3D surface backend feature + [default=no] + --enable-png=[no/auto/yes] + Enable cairo's PNG functions feature [default=yes] + --enable-gl=[no/auto/yes] + Enable cairo's OpenGL surface backend feature + [default=no] + --enable-glesv2=[no/auto/yes] + Enable cairo's OpenGLESv2 surface backend feature + [default=no] + --enable-cogl=[no/auto/yes] + Enable cairo's Cogl surface backend feature + [default=no] + --enable-directfb=[no/auto/yes] + Enable cairo's directfb surface backend feature + [default=no] + --enable-vg=[no/auto/yes] + Enable cairo's OpenVG surface backend feature + [default=no] + --enable-egl=[no/auto/yes] + Enable cairo's EGL functions feature [default=auto] + --enable-glx=[no/auto/yes] + Enable cairo's GLX functions feature [default=auto] + --enable-wgl=[no/auto/yes] + Enable cairo's WGL functions feature [default=auto] + --enable-script=[no/auto/yes] + Enable cairo's script surface backend feature + [default=yes] + --enable-ft=[no/auto/yes] + Enable cairo's FreeType font backend feature + [default=auto] + --enable-fc=[no/auto/yes] + Enable cairo's Fontconfig font backend feature + [default=auto] + --enable-ps=[no/auto/yes] + Enable cairo's PostScript surface backend feature + [default=yes] + --enable-pdf=[no/auto/yes] + Enable cairo's PDF surface backend feature + [default=yes] + --enable-svg=[no/auto/yes] + Enable cairo's SVG surface backend feature + [default=yes] + --enable-test-surfaces=[no/auto/yes] + Enable cairo's test surfaces feature [default=no] + --enable-tee=[no/auto/yes] + Enable cairo's tee surface backend feature + [default=no] + --enable-xml=[no/auto/yes] + Enable cairo's xml surface backend feature + [default=no] + --enable-pthread=[no/auto/yes] + Enable cairo's pthread feature [default=auto] + --enable-gobject=[no/auto/yes] + Enable cairo's gobject functions feature + [default=auto] + --enable-full-testing Sets the test suite to perform full testing by + default, which will dramatically slow down make + check, but is a *requirement* before release. + --enable-trace=[no/auto/yes] + Enable cairo's cairo-trace feature [default=auto] + --enable-interpreter=[no/auto/yes] + Enable cairo's cairo-script-interpreter feature + [default=yes] + --enable-symbol-lookup=[no/auto/yes] + Enable cairo's symbol-lookup feature [default=auto] + --disable-some-floating-point + Disable certain code paths that rely heavily on + double precision floating-point calculation. This + option can improve performance on systems without a + double precision floating-point unit, but might + degrade performance on those that do. + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-html-dir=PATH path to installed docs + --with-x use the X Window System + --with-skia=/path/to/skia + directory to find compiled skia sources + --with-skia-build-type=(Release|Debug) + build of skia to link with, default is Release + + --with-gallium=/path/to/mesa + directory to find gallium enabled mesa + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + PKG_CONFIG path to pkg-config utility + GTKDOC_DEPS_CFLAGS + C compiler flags for GTKDOC_DEPS, overriding pkg-config + GTKDOC_DEPS_LIBS + linker flags for GTKDOC_DEPS, overriding pkg-config + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + VALGRIND_CFLAGS + C compiler flags for VALGRIND, overriding pkg-config + VALGRIND_LIBS + linker flags for VALGRIND, overriding pkg-config + xlib_CFLAGS C compiler flags for xlib, overriding pkg-config + xlib_LIBS linker flags for xlib, overriding pkg-config + XMKMF Path to xmkmf, Makefile generator for X Window System + xlib_xrender_CFLAGS + C compiler flags for xlib_xrender, overriding pkg-config + xlib_xrender_LIBS + linker flags for xlib_xrender, overriding pkg-config + xcb_CFLAGS C compiler flags for xcb, overriding pkg-config + xcb_LIBS linker flags for xcb, overriding pkg-config + xlib_xcb_CFLAGS + C compiler flags for xlib_xcb, overriding pkg-config + xlib_xcb_LIBS + linker flags for xlib_xcb, overriding pkg-config + xcb_shm_CFLAGS + C compiler flags for xcb_shm, overriding pkg-config + xcb_shm_LIBS + linker flags for xcb_shm, overriding pkg-config + qt_CFLAGS C compiler flags for qt, overriding pkg-config + qt_LIBS linker flags for qt, overriding pkg-config + drm_CFLAGS C compiler flags for drm, overriding pkg-config + drm_LIBS linker flags for drm, overriding pkg-config + png_REQUIRES + module name for libpng to search for using pkg-config + png_CFLAGS C compiler flags for png, overriding pkg-config + png_LIBS linker flags for png, overriding pkg-config + gl_CFLAGS C compiler flags for gl, overriding pkg-config + gl_LIBS linker flags for gl, overriding pkg-config + glesv2_CFLAGS + C compiler flags for glesv2, overriding pkg-config + glesv2_LIBS linker flags for glesv2, overriding pkg-config + cogl_CFLAGS C compiler flags for cogl, overriding pkg-config + cogl_LIBS linker flags for cogl, overriding pkg-config + directfb_CFLAGS + C compiler flags for directfb, overriding pkg-config + directfb_LIBS + linker flags for directfb, overriding pkg-config + egl_CFLAGS C compiler flags for egl, overriding pkg-config + egl_LIBS linker flags for egl, overriding pkg-config + FREETYPE_CFLAGS + C compiler flags for FREETYPE, overriding pkg-config + FREETYPE_LIBS + linker flags for FREETYPE, overriding pkg-config + FONTCONFIG_CFLAGS + C compiler flags for FONTCONFIG, overriding pkg-config + FONTCONFIG_LIBS + linker flags for FONTCONFIG, overriding pkg-config + LIBSPECTRE_CFLAGS + C compiler flags for LIBSPECTRE, overriding pkg-config + LIBSPECTRE_LIBS + linker flags for LIBSPECTRE, overriding pkg-config + POPPLER_CFLAGS + C compiler flags for POPPLER, overriding pkg-config + POPPLER_LIBS + linker flags for POPPLER, overriding pkg-config + LIBRSVG_CFLAGS + C compiler flags for LIBRSVG, overriding pkg-config + LIBRSVG_LIBS + linker flags for LIBRSVG, overriding pkg-config + pixman_CFLAGS + C compiler flags for pixman, overriding pkg-config + pixman_LIBS linker flags for pixman, overriding pkg-config + GOBJECT_CFLAGS + C compiler flags for GOBJECT, overriding pkg-config + GOBJECT_LIBS + linker flags for GOBJECT, overriding pkg-config + glib_CFLAGS C compiler flags for glib, overriding pkg-config + glib_LIBS linker flags for glib, overriding pkg-config + gtk_CFLAGS C compiler flags for gtk, overriding pkg-config + gtk_LIBS linker flags for gtk, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <http://bugs.freedesktop.org/enter_bug.cgi?product=cairo>. +cairo home page: <http://cairographics.org/>. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +cairo configure 1.14.2 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------------------------------------------------- ## +## Report this to http://bugs.freedesktop.org/enter_bug.cgi?product=cairo ## +## ---------------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case <limits.h> declares $2. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include <stdio.h> +#include <stdlib.h> +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 <conftest.val; ac_retval=0 +else + ac_retval=1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f conftest.val + + fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_compute_int + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by cairo $as_me 1.14.2, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in build "$srcdir"/build; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build \"$srcdir\"/build" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + +ac_config_headers="$ac_config_headers config.h" + + +for ac_header in unistd.h sys/ioctl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +am__api_version='1.14' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='cairo' + VERSION='1.14.2' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html> +# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html> +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: <http://www.gnu.org/software/coreutils/>. + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + +# Initialize libtool + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Api documentation + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi + + + + gtk_doc_requires="gtk-doc >= 1.15" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-doc" >&5 +$as_echo_n "checking for gtk-doc... " >&6; } + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gtk_doc_requires\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gtk_doc_requires") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + have_gtk_doc=yes +else + have_gtk_doc=no +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gtk_doc" >&5 +$as_echo "$have_gtk_doc" >&6; } + + if test "$have_gtk_doc" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found." >&5 +$as_echo "$as_me: WARNING: + You will not be able to create source packages with 'make dist' + because $gtk_doc_requires is not found." >&2;} + fi + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_GTKDOC_CHECK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$GTKDOC_CHECK"; then + ac_cv_prog_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GTKDOC_CHECK="gtkdoc-check.test" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +GTKDOC_CHECK=$ac_cv_prog_GTKDOC_CHECK +if test -n "$GTKDOC_CHECK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 +$as_echo "$GTKDOC_CHECK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "gtkdoc-check", so it can be a program name with args. +set dummy gtkdoc-check; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_CHECK_PATH+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_CHECK_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_CHECK_PATH="$GTKDOC_CHECK_PATH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_CHECK_PATH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_CHECK_PATH=$ac_cv_path_GTKDOC_CHECK_PATH +if test -n "$GTKDOC_CHECK_PATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK_PATH" >&5 +$as_echo "$GTKDOC_CHECK_PATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + for ac_prog in gtkdoc-rebase +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_REBASE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_REBASE in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE +if test -n "$GTKDOC_REBASE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 +$as_echo "$GTKDOC_REBASE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$GTKDOC_REBASE" && break +done +test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" + + # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. +set dummy gtkdoc-mkpdf; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GTKDOC_MKPDF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF +if test -n "$GTKDOC_MKPDF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 +$as_echo "$GTKDOC_MKPDF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Check whether --with-html-dir was given. +if test "${with_html_dir+set}" = set; then : + withval=$with_html_dir; +else + with_html_dir='${datadir}/gtk-doc/html' +fi + + HTML_DIR="$with_html_dir" + + + # Check whether --enable-gtk-doc was given. +if test "${enable_gtk_doc+set}" = set; then : + enableval=$enable_gtk_doc; +else + enable_gtk_doc=no +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 +$as_echo_n "checking whether to build gtk-doc documentation... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 +$as_echo "$enable_gtk_doc" >&6; } + + if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then + as_fn_error $? " + You must have $gtk_doc_requires installed to build documentation for + $PACKAGE_NAME. Please install gtk-doc or disable building the + documentation by adding '--disable-gtk-doc' to '$0'." "$LINENO" 5 + fi + + if test "x$PACKAGE_NAME" != "xglib"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 +$as_echo_n "checking for GTKDOC_DEPS... " >&6; } + +if test -n "$GTKDOC_DEPS_CFLAGS"; then + pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTKDOC_DEPS_LIBS"; then + pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + else + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + : +elif test $pkg_failed = untried; then + : +else + GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS + GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + fi + + # Check whether --enable-gtk-doc-html was given. +if test "${enable_gtk_doc_html+set}" = set; then : + enableval=$enable_gtk_doc_html; +else + enable_gtk_doc_html=yes +fi + + # Check whether --enable-gtk-doc-pdf was given. +if test "${enable_gtk_doc_pdf+set}" = set; then : + enableval=$enable_gtk_doc_pdf; +else + enable_gtk_doc_pdf=no +fi + + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + if test -z "$AM_DEFAULT_VERBOSITY"; then + AM_DEFAULT_VERBOSITY=1 + fi + + + if test x$have_gtk_doc = xyes; then + HAVE_GTK_DOC_TRUE= + HAVE_GTK_DOC_FALSE='#' +else + HAVE_GTK_DOC_TRUE='#' + HAVE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc = xyes; then + ENABLE_GTK_DOC_TRUE= + ENABLE_GTK_DOC_FALSE='#' +else + ENABLE_GTK_DOC_TRUE='#' + ENABLE_GTK_DOC_FALSE= +fi + + if test x$enable_gtk_doc_html = xyes; then + GTK_DOC_BUILD_HTML_TRUE= + GTK_DOC_BUILD_HTML_FALSE='#' +else + GTK_DOC_BUILD_HTML_TRUE='#' + GTK_DOC_BUILD_HTML_FALSE= +fi + + if test x$enable_gtk_doc_pdf = xyes; then + GTK_DOC_BUILD_PDF_TRUE= + GTK_DOC_BUILD_PDF_FALSE='#' +else + GTK_DOC_BUILD_PDF_TRUE='#' + GTK_DOC_BUILD_PDF_FALSE= +fi + + if test -n "$LIBTOOL"; then + GTK_DOC_USE_LIBTOOL_TRUE= + GTK_DOC_USE_LIBTOOL_FALSE='#' +else + GTK_DOC_USE_LIBTOOL_TRUE='#' + GTK_DOC_USE_LIBTOOL_FALSE= +fi + + if test -n "$GTKDOC_REBASE"; then + GTK_DOC_USE_REBASE_TRUE= + GTK_DOC_USE_REBASE_FALSE='#' +else + GTK_DOC_USE_REBASE_TRUE='#' + GTK_DOC_USE_REBASE_FALSE= +fi + + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if ${ac_cv_sys_largefile_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if ${ac_cv_sys_file_offset_bits+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if ${ac_cv_sys_large_files+:} false; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include <sys/types.h> + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi + + +fi + + + + + + + + + + + + + + +CAIRO_VERSION_MAJOR=1 +CAIRO_VERSION_MINOR=14 +CAIRO_VERSION_MICRO=2 +CAIRO_VERSION_SONUM=2 +CAIRO_RELEASE_STATUS=release +CAIRO_LIBTOOL_VERSION_INFO=11402:2:11400 + + + + + + + +# Extract the first word of "find", so it can be a program name with args. +set dummy find; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_FIND+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FIND in + [\\/]* | ?:[\\/]*) + ac_cv_path_FIND="$FIND" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +FIND=$ac_cv_path_FIND +if test -n "$FIND"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND" >&5 +$as_echo "$FIND" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "xargs", so it can be a program name with args. +set dummy xargs; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XARGS+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $XARGS in + [\\/]* | ?:[\\/]*) + ac_cv_path_XARGS="$XARGS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_XARGS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XARGS=$ac_cv_path_XARGS +if test -n "$XARGS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XARGS" >&5 +$as_echo "$XARGS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi +if test "x$PKG_CONFIG" = x; then + as_fn_error $? "pkg-config >= $PKGCONFIG_REQUIRED required but not found (http://pkgconfig.freedesktop.org/)" "$LINENO" 5 +fi + +case `$PKG_CONFIG --version` in +0.?|0.?.?|0.1[0-7]|0.1[0-7].?) PKGCONFIG_REQUIRES="Requires"; ;; +*) PKGCONFIG_REQUIRES="Requires.private"; ;; +esac + + + + + + + + + + + + + + + + + + + CAIRO_MAKEFILE___WIN32='# Generated by configure. Modify to customize. +' + + ac_config_commands="$ac_config_commands $srcdir/build/Makefile.win32.features" + + + + + CAIRO_MAKEFILE_cairo_AMAKE='# Generated by configure. Do not edit. +' + + ac_config_commands="$ac_config_commands $srcdir/src/Makefile.am.features" + + + CAIRO_MAKEFILE_cairo_WIN32='# Generated by configure. Do not edit. +' + + ac_config_commands="$ac_config_commands $srcdir/src/Makefile.win32.features" + + + + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE='# Generated by configure. Do not edit. +' + + ac_config_commands="$ac_config_commands $srcdir/boilerplate/Makefile.am.features" + + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32='# Generated by configure. Do not edit. +' + + ac_config_commands="$ac_config_commands $srcdir/boilerplate/Makefile.win32.features" + + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'include $(top_srcdir)/src/Makefile.sources +' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(top_srcdir),) +include Makefile.sources +else +include $(top_srcdir)/src/Makefile.sources +endif +' + + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'include $(top_srcdir)/boilerplate/Makefile.sources +' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(top_srcdir),) +include Makefile.sources +else +include $(top_srcdir)/boilerplate/Makefile.sources +endif +' + + + + cr_make_tmp='supported_cairo_headers = $(cairo_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + cr_make_tmp='supported_cairo_boilerplate_headers = $(cairo_boilerplate_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='unsupported_cairo_headers =' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + cr_make_tmp='unsupported_cairo_boilerplate_headers =' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers = $(cairo_headers) +all_cairo_private = $(cairo_private) +all_cairo_cxx_sources = $(cairo_cxx_sources) +all_cairo_sources = $(cairo_sources) +' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + cr_make_tmp='all_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +all_cairo_boilerplate_private = $(cairo_boilerplate_private) +all_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) +all_cairo_boilerplate_sources = $(cairo_boilerplate_sources) +' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers = $(cairo_headers) +enabled_cairo_private = $(cairo_private) +enabled_cairo_cxx_sources = $(cairo_cxx_sources) +enabled_cairo_sources = $(cairo_sources) +' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + cr_make_tmp='enabled_cairo_boilerplate_headers = $(cairo_boilerplate_headers) +enabled_cairo_boilerplate_private = $(cairo_boilerplate_private) +enabled_cairo_boilerplate_cxx_sources = $(cairo_boilerplate_cxx_sources) +enabled_cairo_boilerplate_sources = $(cairo_boilerplate_sources) +' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + +ac_config_files="$ac_config_files src/cairo.pc" +ac_config_files="$ac_config_files cairo-uninstalled.pc:src/cairo-uninstalled.pc.in" + + CAIRO_REQUIRES="" + CAIRO_CFLAGS="" +CAIRO_NONPKGCONFIG_CFLAGS="" + CAIRO_LIBS="$LIBS" +CAIRO_NONPKGCONFIG_LIBS="$LIBS" + + + + + + + cr_make_tmp='all_cairo_pkgconf = cairo.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf = cairo.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + + + CAIRO_FEATURES='' + CAIRO_SUPPORTED_FEATURES='' + CAIRO_NO_FEATURES='' + + ac_config_commands="$ac_config_commands src/cairo-features.h" + + ac_config_commands="$ac_config_commands src/cairo-supported-features.h" + + + + + + CAIRO_MAKEFILE_win32_features_h_WIN32='# Generated by configure. Do not edit. +' + + ac_config_commands="$ac_config_commands $srcdir/build/Makefile.win32.features-h" + + + cr_make_tmp='$(top_srcdir)/src/cairo-features.h: $(top_srcdir)/build/Makefile.win32.features + @echo "Generating src/cairo-features.h" + @echo "/* Generated by Makefile.win32.features-h. Do not edit. */" > $(top_srcdir)/src/cairo-features.h + @echo "#ifndef CAIRO_FEATURES_H" >> $(top_srcdir)/src/cairo-features.h + @echo "#define CAIRO_FEATURES_H 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + + + CAIRO_WARNING_MESSAGE='' + + + + + CAIRO_NATIVE_SURFACE_BACKENDS='' + CAIRO_NATIVE_FONT_BACKENDS='' + + + + + + +# -Wcast-align generates lots of false positive reports we need to +# cast image data from uint8_t to uin32_t. + +# -Wlogical-op causes too much noise from strcmp("literal", str) + +MAYBE_WARN="-Wall -Wextra \ +-Wmissing-declarations -Werror-implicit-function-declaration \ +-Wpointer-arith -Wwrite-strings -Wsign-compare -Wpacked +-Wswitch-enum -Wmissing-format-attribute -Wvolatile-register-var \ +-Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ +-Wno-missing-field-initializers -Wno-unused-parameter \ +-Wno-attributes -Wno-long-long -Winline" + +MAYBE_C_SPECIFIC_WARN="-Wold-style-definition \ +-Wdeclaration-after-statement -Wstrict-prototypes \ +-Wmissing-prototypes -Wbad-function-cast -Wnested-externs" + +# New -Wno options should be added here +# gcc-4.4 and later accept every -Wno- option but may complain later that this +# option is unknow each time another warning happen. +# -Wunused-but-set-variable is too noisy at present +NO_WARN="unused-but-set-variable" + +MAYBE_WARN="$MAYBE_WARN -erroff=E_ENUM_TYPE_MISMATCH_ARG \ + -erroff=E_ENUM_TYPE_MISMATCH_OP" + +MAYBE_WARN="$MAYBE_WARN -fno-strict-aliasing -fno-common" + +MAYBE_WARN="$MAYBE_WARN -Wp,-D_FORTIFY_SOURCE=2" + +# invalidate cached value if MAYBE_WARN has changed +if test "x$cairo_cv_warn_maybe" != "x$MAYBE_WARN"; then + unset cairo_cv_warn_cflags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for supported warning flags" >&5 +$as_echo_n "checking for supported warning flags... " >&6; } +if ${cairo_cv_warn_cflags+:} false; then : + $as_echo_n "(cached) " >&6 +else + + echo + WARN_CFLAGS="" + + # Some warning options are not supported by all versions of + # gcc, so test all desired options against the current + # compiler. + # + # Note that there are some order dependencies + # here. Specifically, an option that disables a warning will + # have no net effect if a later option then enables that + # warnings, (perhaps implicitly). So we put some grouped + # options (-Wall and -Wextra) up front and the -Wno options + # last. + + for W in $MAYBE_WARN; do + _test_WERROR=${WERROR+set} + if test "z$_test_WERROR" != zset; then + WERROR="" + for _werror in -Werror -errwarn; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $_werror" >&5 +$as_echo_n "checking whether $CC supports $_werror... " >&6; } + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + WERROR="$WERROR $_werror" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 +$as_echo "$cairo_cc_flag" >&6; } + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $W" >&5 +$as_echo_n "checking whether $CC supports $W... " >&6; } + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $WERROR $W" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + WARN_CFLAGS="$WARN_CFLAGS $W" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 +$as_echo "$cairo_cc_flag" >&6; } + + done + for W in $NO_WARN; do + _test_WERROR=${WERROR+set} + if test "z$_test_WERROR" != zset; then + WERROR="" + for _werror in -Werror -errwarn; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $_werror" >&5 +$as_echo_n "checking whether $CC supports $_werror... " >&6; } + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + WERROR="$WERROR $_werror" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 +$as_echo "$cairo_cc_flag" >&6; } + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -W$W -Wno-$W" >&5 +$as_echo_n "checking whether $CC supports -W$W -Wno-$W... " >&6; } + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $WERROR -W$W -Wno-$W" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + WARN_CFLAGS="$WARN_CFLAGS -Wno-$W" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 +$as_echo "$cairo_cc_flag" >&6; } + + done + cairo_cv_warn_cflags=$WARN_CFLAGS + cairo_cv_warn_maybe="$MAYBE_WARN $MAYBE_C_SPECIFIC_WARN" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which warning flags were supported" >&5 +$as_echo_n "checking which warning flags were supported... " >&6; } + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_warn_cflags" >&5 +$as_echo "$cairo_cv_warn_cflags" >&6; } +WARN_CFLAGS="$cairo_cv_warn_cflags" +CAIRO_CFLAGS="$CAIRO_CFLAGS $WARN_CFLAGS" + +# We only wish to enable attribute(warn_unused_result) if we can prevent +# gcc from generating thousands of warnings about the misapplication of the +# attribute to void functions and variables. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to enable unused result warnings" >&5 +$as_echo_n "checking how to enable unused result warnings... " >&6; } +if ${cairo_cv_warn_unused_result+:} false; then : + $as_echo_n "(cached) " >&6 +else + + + cairo_cv_warn_unused_result="" + if echo $WARN_CFLAGS | $GREP -e '-Wno-attributes' >/dev/null; then + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program="__attribute__((__warn_unused_result__)) void f (void) {} + __attribute__((__warn_unused_result__)) int g;"' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS -Wno-attributes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + cairo_cv_warn_unused_result="__attribute__((__warn_unused_result__))" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_warn_unused_result" >&5 +$as_echo "$cairo_cv_warn_unused_result" >&6; } + +cat >>confdefs.h <<_ACEOF +#define WARN_UNUSED_RESULT $cairo_cv_warn_unused_result +_ACEOF + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to allow undefined symbols in shared libraries used by test suite" >&5 +$as_echo_n "checking how to allow undefined symbols in shared libraries used by test suite... " >&6; } +if ${cairo_cv_test_undefined_ldflags+:} false; then : + $as_echo_n "(cached) " >&6 +else + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS -Wl,--allow-shlib-undefined" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + cairo_cv_test_undefined_ldflags="-Wl,--allow-shlib-undefined" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_test_undefined_ldflags" >&5 +$as_echo "$cairo_cv_test_undefined_ldflags" >&6; } +CAIRO_TEST_UNDEFINED_LDFLAGS="$cairo_cv_test_undefined_ldflags" + + + + if test "x$cross_compiling" = "xyes"; then + CROSS_COMPILING_TRUE= + CROSS_COMPILING_FALSE='#' +else + CROSS_COMPILING_TRUE='#' + CROSS_COMPILING_FALSE= +fi + + case $host_os in + darwin*) + + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether float word ordering is bigendian" >&5 +$as_echo_n "checking whether float word ordering is bigendian... " >&6; } +if ${ax_cv_c_float_words_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + + +# The endianess is detected by first compiling C code that contains a special +# double float value, then grepping the resulting object file for certain +# strings of ascii values. The double is specially crafted to have a +# binary representation that corresponds with a simple string. In this +# implementation, the string "noonsees" was selected because the individual +# word values ("noon" and "sees") are palindromes, thus making this test +# byte-order agnostic. If grep finds the string "noonsees" in the object +# file, the target platform stores float words in big-endian order. If grep +# finds "seesnoon", float words are in little-endian order. If neither value +# is found, the user is instructed to specify the ordering. + +ax_cv_c_float_words_bigendian=unknown +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +double d __attribute__((used)) = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; +int main() { return 0; } + + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + +if strings - conftest$ac_exeext | grep noonsees >/dev/null ; then + ax_cv_c_float_words_bigendian=yes +fi +if strings - conftest$ac_exeext | grep seesnoon >/dev/null ; then + if test "$ax_cv_c_float_words_bigendian" = unknown; then + ax_cv_c_float_words_bigendian=no + else + ax_cv_c_float_words_bigendian=unknown + fi +fi + + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_float_words_bigendian" >&5 +$as_echo "$ax_cv_c_float_words_bigendian" >&6; } + +case $ax_cv_c_float_words_bigendian in + yes) + +$as_echo "#define FLOAT_WORDS_BIGENDIAN 1" >>confdefs.h + ;; + no) + ;; + *) + as_fn_error $? " + +Unknown float word ordering. You need to manually preset +ax_cv_c_float_words_bigendian=no (or yes) according to your system. + + " "$LINENO" 5 ;; +esac + + + ;; + esac + +# Check whether --enable-atomic was given. +if test "${enable_atomic+set}" = set; then : + enableval=$enable_atomic; use_atomic=$enableval +else + use_atomic=yes +fi + +if test "x$use_atomic" = "xyes"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for native atomic primitives" >&5 +$as_echo_n "checking for native atomic primitives... " >&6; } +if ${cairo_cv_atomic_primitives+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cairo_cv_atomic_primitives="none" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); } +int atomic_cmpxchg(int i, int j, int k) { return __sync_val_compare_and_swap (&i, j, k); } + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cv_atomic_primitives="Intel" + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cv_atomic_primitives" = "xnone"; then + ac_fn_c_check_header_mongrel "$LINENO" "atomic_ops.h" "ac_cv_header_atomic_ops_h" "$ac_includes_default" +if test "x$ac_cv_header_atomic_ops_h" = xyes; then : + cairo_cv_atomic_primitives="libatomic-ops" +fi + + + fi + + if test "x$cairo_cv_atomic_primitives" = "xnone"; then + ac_fn_c_check_header_mongrel "$LINENO" "libkern/OSAtomic.h" "ac_cv_header_libkern_OSAtomic_h" "$ac_includes_default" +if test "x$ac_cv_header_libkern_OSAtomic_h" = xyes; then : + cairo_cv_atomic_primitives="OSAtomic" +fi + + + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_atomic_primitives" >&5 +$as_echo "$cairo_cv_atomic_primitives" >&6; } + if test "x$cairo_cv_atomic_primitives" = xIntel; then + +$as_echo "#define HAVE_INTEL_ATOMIC_PRIMITIVES 1" >>confdefs.h + + fi + + if test "x$cairo_cv_atomic_primitives" = "xlibatomic-ops"; then + +$as_echo "#define HAVE_LIB_ATOMIC_OPS 1" >>confdefs.h + + fi + + if test "x$cairo_cv_atomic_primitives" = xOSAtomic; then + +$as_echo "#define HAVE_OS_ATOMIC_OPS 1" >>confdefs.h + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether atomic ops require a memory barrier" >&5 +$as_echo_n "checking whether atomic ops require a memory barrier... " >&6; } +if ${cairo_cv_atomic_op_needs_memory_barrier+:} false; then : + $as_echo_n "(cached) " >&6 +else + + case $host_cpu in + i?86) cairo_cv_atomic_op_needs_memory_barrier="no" ;; + x86_64) cairo_cv_atomic_op_needs_memory_barrier="no" ;; + arm*) cairo_cv_atomic_op_needs_memory_barrier="no" ;; + *) cairo_cv_atomic_op_needs_memory_barrier="yes" ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_atomic_op_needs_memory_barrier" >&5 +$as_echo "$cairo_cv_atomic_op_needs_memory_barrier" >&6; } + if test "x$cairo_cv_atomic_op_needs_memory_barrier" = "xyes"; then + +cat >>confdefs.h <<_ACEOF +#define ATOMIC_OP_NEEDS_MEMORY_BARRIER 1 +_ACEOF + + fi + + +fi +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if ${ac_cv_sizeof_void_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_void_p" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void *) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_void_p=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +$as_echo "$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 +$as_echo_n "checking size of size_t... " >&6; } +if ${ac_cv_sizeof_size_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_size_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (size_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_size_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 +$as_echo "$ac_cv_sizeof_size_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t +_ACEOF + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native Win32" >&5 +$as_echo_n "checking for native Win32... " >&6; } +case "$host" in + *-*-mingw*) + cairo_os_win32=yes + ;; + *) + cairo_os_win32=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_os_win32" >&5 +$as_echo "$cairo_os_win32" >&6; } + if test "$cairo_os_win32" = "yes"; then + OS_WIN32_TRUE= + OS_WIN32_FALSE='#' +else + OS_WIN32_TRUE='#' + OS_WIN32_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sun Solaris (non-POSIX ctime_r)" >&5 +$as_echo_n "checking for Sun Solaris (non-POSIX ctime_r)... " >&6; } +case "$host" in + *-*-solaris*) + CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS" + solaris_posix_pthread=yes + ;; + *) + solaris_posix_pthread=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $solaris_posix_pthread" >&5 +$as_echo "$solaris_posix_pthread" >&6; } + + +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 +$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } +if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmw $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char _mwvalidcheckl (); +int +main () +{ +return _mwvalidcheckl (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mw__mwvalidcheckl=yes +else + ac_cv_lib_mw__mwvalidcheckl=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 +$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } +if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : + LIBM="-lmw" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + LIBM="$LIBM -lm" +fi + + ;; +*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + LIBM="-lm" +fi + + ;; +esac + + +LIBS="$LIBS $LIBM" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 +$as_echo_n "checking for sched_yield in -lrt... " >&6; } +if ${ac_cv_lib_rt_sched_yield+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sched_yield (); +int +main () +{ +return sched_yield (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_sched_yield=yes +else + ac_cv_lib_rt_sched_yield=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 +$as_echo "$ac_cv_lib_rt_sched_yield" >&6; } +if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRT 1 +_ACEOF + + LIBS="-lrt $LIBS" + +fi + + +has_shm_open= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shm_open in -lrt" >&5 +$as_echo_n "checking for shm_open in -lrt... " >&6; } +if ${ac_cv_lib_rt_shm_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shm_open (); +int +main () +{ +return shm_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_shm_open=yes +else + ac_cv_lib_rt_shm_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_shm_open" >&5 +$as_echo "$ac_cv_lib_rt_shm_open" >&6; } +if test "x$ac_cv_lib_rt_shm_open" = xyes; then : + + SHM_LIBS=-lrt + has_shm_open=yes + +else + SHM_LIBS= +fi + + if test "x$has_shm_open" = "xyes"; then + HAVE_SHM_TRUE= + HAVE_SHM_FALSE='#' +else + HAVE_SHM_TRUE='#' + HAVE_SHM_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + SOCKET_LIBS=-lsocket +else + SOCKET_LIBS= +fi + +CAIROBOILERPLATE_LIBS=$SOCKET_LIBS + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_return_address(0)" >&5 +$as_echo_n "checking for __builtin_return_address(0)... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +__builtin_return_address(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + have_builtin_return_address=yes +else + have_builtin_return_address=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_builtin_return_address" >&5 +$as_echo "$have_builtin_return_address" >&6; } +if test "x$have_builtin_return_address" = "xyes"; then + +$as_echo "#define HAVE_BUILTIN_RETURN_ADDRESS 1" >>confdefs.h + +fi + +for ac_header in stdint.h inttypes.h sys/int_types.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default" +if test "x$ac_cv_type_uint64_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT64_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "uint128_t" "ac_cv_type_uint128_t" "$ac_includes_default" +if test "x$ac_cv_type_uint128_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINT128_T 1 +_ACEOF + + +fi +ac_fn_c_check_type "$LINENO" "__uint128_t" "ac_cv_type___uint128_t" "$ac_includes_default" +if test "x$ac_cv_type___uint128_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE___UINT128_T 1 +_ACEOF + + +fi + + +for ac_header in fcntl.h unistd.h signal.h sys/stat.h sys/socket.h sys/poll.h sys/un.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in alarm +do : + ac_fn_c_check_func "$LINENO" "alarm" "ac_cv_func_alarm" +if test "x$ac_cv_func_alarm" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALARM 1 +_ACEOF + +fi +done + + +for ac_header in sched.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default" +if test "x$ac_cv_header_sched_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SCHED_H 1 +_ACEOF + for ac_func in sched_getaffinity +do : + ac_fn_c_check_func "$LINENO" "sched_getaffinity" "ac_cv_func_sched_getaffinity" +if test "x$ac_cv_func_sched_getaffinity" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SCHED_GETAFFINITY 1 +_ACEOF + +fi +done + +fi + +done + + +for ac_header in sys/mman.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_MMAN_H 1 +_ACEOF + for ac_func in mmap +do : + ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +if test "x$ac_cv_func_mmap" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MMAP 1 +_ACEOF + +fi +done + +fi + +done + + +for ac_header in time.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default" +if test "x$ac_cv_header_time_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TIME_H 1 +_ACEOF + for ac_func in clock_gettime +do : + ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" +if test "x$ac_cv_func_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETTIME 1 +_ACEOF + +fi +done + +fi + +done + + +ac_fn_c_check_header_mongrel "$LINENO" "fenv.h" "ac_cv_header_fenv_h" "$ac_includes_default" +if test "x$ac_cv_header_fenv_h" = xyes; then : + for ac_func in feenableexcept fedisableexcept feclearexcept +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +fi + + + +for ac_header in libgen.h byteswap.h signal.h setjmp.h fenv.h sys/wait.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_func in ctime_r drand48 flockfile funlockfile getline link strndup +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_header in windows.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_WINDOWS_H 1 +_ACEOF + have_windows=yes +else + have_windows=no +fi + +done + + + +for ac_header in sys/stat.h io.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_fn_c_check_func "$LINENO" "mkdir" "ac_cv_func_mkdir" +if test "x$ac_cv_func_mkdir" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking mkdir variant" >&5 +$as_echo_n "checking mkdir variant... " >&6; } + mkdir_variant="unknown" + save_CFLAGS="$CFLAGS" + CFLAGS=$WARN_CFLAGS + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + +int +main () +{ +mkdir ("hello.world", 0777) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + mkdir_variant="mkdir(path, mode)" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_IO_H +#include <io.h> +#endif + +int +main () +{ +mkdir ("hello.world") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + mkdir_variant="mkdir(path)" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mkdir_variant" >&5 +$as_echo "$mkdir_variant" >&6; } + CFLAGS="$save_CFLAGS" + if test "x$mkdir_variant" = "xmkdir(path, mode)"; then + +$as_echo "#define HAVE_MKDIR 2" >>confdefs.h + + else + +$as_echo "#define HAVE_MKDIR 1" >>confdefs.h + + fi +fi + + + +for ac_func in fork waitpid raise +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + cairo_has_lcov=no +# Check whether --enable-gcov was given. +if test "${enable_gcov+set}" = set; then : + enableval=$enable_gcov; use_gcov=$enableval +else + use_gcov=no +fi + + +if test "x$use_gcov" = "xyes"; then + if test "$GCC" != "yes"; then + as_fn_error $? "GCC is required for --enable-gcov" "$LINENO" 5 + fi + + # Extract the first word of "shtool", so it can be a program name with args. +set dummy shtool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_SHTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$SHTOOL"; then + ac_cv_prog_SHTOOL="$SHTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_SHTOOL="shtool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +SHTOOL=$ac_cv_prog_SHTOOL +if test -n "$SHTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5 +$as_echo "$SHTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + case `$SHTOOL path $CC` in + *ccache*) gcc_ccache=yes;; + *) gcc_ccache=no;; + esac + + if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then + as_fn_error $? "ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1." "$LINENO" 5 + fi + + ltp_version_list="1.7 1.6 1.5 1.4" + # Extract the first word of "lcov", so it can be a program name with args. +set dummy lcov; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LTP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LTP"; then + ac_cv_prog_LTP="$LTP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LTP="lcov" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LTP=$ac_cv_prog_LTP +if test -n "$LTP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP" >&5 +$as_echo "$LTP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "genhtml", so it can be a program name with args. +set dummy genhtml; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LTP_GENHTML+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LTP_GENHTML"; then + ac_cv_prog_LTP_GENHTML="$LTP_GENHTML" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LTP_GENHTML="genhtml" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LTP_GENHTML=$ac_cv_prog_LTP_GENHTML +if test -n "$LTP_GENHTML"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP_GENHTML" >&5 +$as_echo "$LTP_GENHTML" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test "$LTP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ltp version" >&5 +$as_echo_n "checking for ltp version... " >&6; } +if ${cairo_cv_ltp_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cairo_cv_ltp_version=invalid + ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` + for ltp_check_version in $ltp_version_list; do + if test "$ltp_version" = "$ltp_check_version"; then + cairo_cv_ltp_version="$ltp_check_version (ok)" + fi + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_ltp_version" >&5 +$as_echo "$cairo_cv_ltp_version" >&6; } + fi + + case $cairo_cv_ltp_version in + ""|invalid) + ;; + *) + cairo_has_lcov=yes + ;; + esac + + if test "x$cairo_has_lcov" != "xyes"; then + as_fn_error $? "To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list. +Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again." "$LINENO" 5 + fi + + if test -z "$LTP_GENHTML"; then + as_fn_error $? "Could not find genhtml from the LTP package. +Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again." "$LINENO" 5 + fi + + +$as_echo "#define HAVE_GCOV 1" >>confdefs.h + + + + CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` + CAIRO_CFLAGS=`echo "$CAIRO_CFLAGS" | $SED -e 's/-O[0-9]*//g'` + + + _test_WERROR=${WERROR+set} + if test "z$_test_WERROR" != zset; then + WERROR="" + for _werror in -Werror -errwarn; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $_werror" >&5 +$as_echo_n "checking whether $CC supports $_werror... " >&6; } + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + WERROR="$WERROR $_werror" + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 +$as_echo "$cairo_cc_flag" >&6; } + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports --coverage" >&5 +$as_echo_n "checking whether $CC supports --coverage... " >&6; } + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program=""' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $WERROR --coverage" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + + CAIRO_CFLAGS="$CAIRO_CFLAGS -O0 --coverage" + CAIRO_LDFLAGS="$CAIRO_LDFLAGS -O0 --coverage" + + else + : + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 +$as_echo "$cairo_cc_flag" >&6; } + +fi + if test "x$cairo_has_lcov" = "xyes"; then + CAIRO_HAS_LCOV_TRUE= + CAIRO_HAS_LCOV_FALSE='#' +else + CAIRO_HAS_LCOV_TRUE='#' + CAIRO_HAS_LCOV_FALSE= +fi + + +# Check whether --enable-valgrind was given. +if test "${enable_valgrind+set}" = set; then : + enableval=$enable_valgrind; use_valgrind=$enableval +else + use_valgrind=yes +fi + + +if test "x$use_valgrind" = "xyes"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5 +$as_echo_n "checking for VALGRIND... " >&6; } + +if test -n "$VALGRIND_CFLAGS"; then + pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 + ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$VALGRIND_LIBS"; then + pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 + ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "valgrind" 2>&1` + else + VALGRIND_PKG_ERRORS=`$PKG_CONFIG --print-errors "valgrind" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$VALGRIND_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS + VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + _save_CFLAGS="$CFLAGS" + _save_CPPFLAGS="$CPPFLAGS" + CFLAGS="$CFLAGS $VALGRIND_CFLAGS" + CPPFLAGS="$CPPFLAGS $VALGRIND_CFLAGS" + ac_fn_c_check_header_mongrel "$LINENO" "valgrind.h" "ac_cv_header_valgrind_h" "$ac_includes_default" +if test "x$ac_cv_header_valgrind_h" = xyes; then : + +$as_echo "#define HAVE_VALGRIND 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "lockdep.h" "ac_cv_header_lockdep_h" "$ac_includes_default" +if test "x$ac_cv_header_lockdep_h" = xyes; then : + +$as_echo "#define HAVE_LOCKDEP 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "memfault.h" "ac_cv_header_memfault_h" "$ac_includes_default" +if test "x$ac_cv_header_memfault_h" = xyes; then : + +$as_echo "#define HAVE_MEMFAULT 1" >>confdefs.h + +fi + + + CAIRO_CFLAGS="$VALGRIND_CFLAGS $CAIRO_CFLAGS" + CFLAGS="$_save_CFLAGS" + CPPFLAGS="$_save_CPPFLAGS" + +fi +fi + +echo '#undef PACKAGE_VERSION' >>confdefs.h +echo '#undef PACKAGE_STRING' >>confdefs.h +echo '#undef PACKAGE_NAME' >>confdefs.h +echo '#undef PACKAGE_TARNAME' >>confdefs.h +$as_echo "#define PACKAGE_VERSION USE_cairo_version_OR_cairo_version_string_INSTEAD" >>confdefs.h + +$as_echo "#define PACKAGE_STRING USE_cairo_version_OR_cairo_version_string_INSTEAD" >>confdefs.h + +$as_echo "#define PACKAGE_NAME USE_cairo_INSTEAD" >>confdefs.h + +$as_echo "#define PACKAGE_TARNAME USE_cairo_INSTEAD" >>confdefs.h + + + + + + + + + + + cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5 +$as_echo_n "checking for compress in -lz... " >&6; } +if ${ac_cv_lib_z_compress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char compress (); +int +main () +{ +return compress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_compress=yes +else + ac_cv_lib_z_compress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5 +$as_echo "$ac_cv_lib_z_compress" >&6; } +if test "x$ac_cv_lib_z_compress" = xyes; then : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + + have_libz=yes + +$as_echo "#define HAVE_ZLIB 1" >>confdefs.h + + +else + have_libz="no (requires zlib http://www.gzip.org/zlib/)" +fi + + +else + have_libz="no (requires zlib http://www.gzip.org/zlib/)" +fi + + +save_LIBS="$LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzo2a_decompress in -llzo2" >&5 +$as_echo_n "checking for lzo2a_decompress in -llzo2... " >&6; } +if ${ac_cv_lib_lzo2_lzo2a_decompress+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-llzo2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char lzo2a_decompress (); +int +main () +{ +return lzo2a_decompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_lzo2_lzo2a_decompress=yes +else + ac_cv_lib_lzo2_lzo2a_decompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzo2_lzo2a_decompress" >&5 +$as_echo "$ac_cv_lib_lzo2_lzo2a_decompress" >&6; } +if test "x$ac_cv_lib_lzo2_lzo2a_decompress" = xyes; then : + ac_fn_c_check_header_mongrel "$LINENO" "lzo/lzo2a.h" "ac_cv_header_lzo_lzo2a_h" "$ac_includes_default" +if test "x$ac_cv_header_lzo_lzo2a_h" = xyes; then : + + have_lzo=yes + +$as_echo "#define HAVE_LZO 1" >>confdefs.h + + lzo_LIBS="-llzo2" + +else + have_lzo="no (requires lzpo http://www.oberhumer.com/opensource/lzo/)" +fi + + +else + have_lzo="no (requires lzpo http://www.oberhumer.com/opensource/lzo/)" +fi + + +LIBS="$save_LIBS" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 +$as_echo_n "checking for dlsym in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlsym+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlsym (); +int +main () +{ +return dlsym (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlsym=yes +else + ac_cv_lib_dl_dlsym=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlsym" >&5 +$as_echo "$ac_cv_lib_dl_dlsym" >&6; } +if test "x$ac_cv_lib_dl_dlsym" = xyes; then : + have_dlsym=yes; have_dl=yes +else + have_dlsym=no; have_dl=no +fi + +if test "x$have_dlsym" = "xno"; then + ac_fn_c_check_func "$LINENO" "dlsym" "ac_cv_func_dlsym" +if test "x$ac_cv_func_dlsym" = xyes; then : + have_dlsym=yes +else + have_dlsym=no +fi + +fi +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + have_dlsym=yes +else + have_dlsym=no +fi + +done + + if test "x$have_dl" = "xyes"; then + CAIRO_HAS_DL_TRUE= + CAIRO_HAS_DL_FALSE='#' +else + CAIRO_HAS_DL_TRUE='#' + CAIRO_HAS_DL_FALSE= +fi + +if test "x$have_dlsym" = "xyes"; then + +$as_echo "#define CAIRO_HAS_DLSYM 1" >>confdefs.h + +fi + if test "x$have_dlsym" = "xyes"; then + CAIRO_HAS_DLSYM_TRUE= + CAIRO_HAS_DLSYM_FALSE='#' +else + CAIRO_HAS_DLSYM_TRUE='#' + CAIRO_HAS_DLSYM_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +# Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <X11/Xlib.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <X11/Xlib.h> +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + + # Check whether --enable-xlib was given. +if test "${enable_xlib+set}" = set; then : + enableval=$enable_xlib; enable_xlib=$enableval +else + enable_xlib=auto +fi + + case $enable_xlib in #( + no) : + use_xlib="no (disabled, use --enable-xlib to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Xlib surface backend feature" >&5 +$as_echo_n "checking for cairo's Xlib surface backend feature... " >&6; } + echo + + use_xlib=yes + xlib_BASE="cairo" +xlib_REQUIRES="$ac_env_xlib_REQUIRES_value" +xlib_CFLAGS="$ac_env_xlib_CFLAGS_value" +xlib_NONPKGCONFIG_CFLAGS="$ac_env_xlib_NONPKGCONFIG_CFLAGS_value" +xlib_LIBS="$ac_env_xlib_LIBS_value" +xlib_NONPKGCONFIG_LIBS="$ac_env_xlib_NONPKGCONFIG_LIBS_value" +xlib_NONPKGCONFIG_EXTRA_LIBS="$ac_env_xlib_NONPKGCONFIG_EXTRA_LIBS_value" + + + + xlib_REQUIRES="x11 xext" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xlib" >&5 +$as_echo_n "checking for xlib... " >&6; } + +if test -n "$xlib_CFLAGS"; then + pkg_cv_xlib_CFLAGS="$xlib_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xlib_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xlib_CFLAGS=`$PKG_CONFIG --cflags "$xlib_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$xlib_LIBS"; then + pkg_cv_xlib_LIBS="$xlib_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xlib_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xlib_LIBS=`$PKG_CONFIG --libs "$xlib_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + xlib_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$xlib_REQUIRES" 2>&1` + else + xlib_PKG_ERRORS=`$PKG_CONFIG --print-errors "$xlib_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$xlib_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + xlib_REQUIRES="" + if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = xyes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = xyes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if ${ac_cv_lib_posix_remove+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = xyes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if ${ac_cv_lib_ipc_shmat+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + if test "x$no_x" = xyes; then + use_xlib="no (requires X development libraries)" + else + xlib_NONPKGCONFIG_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS" + xlib_NONPKGCONFIG_CFLAGS=$X_CFLAGS + fi +elif test $pkg_failed = untried; then + xlib_REQUIRES="" + if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if ${ac_cv_lib_bsd_gethostbyname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = xyes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if ${ac_cv_lib_socket_connect+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = xyes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = xyes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if ${ac_cv_lib_posix_remove+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = xyes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if ${ac_cv_lib_ipc_shmat+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = xyes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + if test "x$no_x" = xyes; then + use_xlib="no (requires X development libraries)" + else + xlib_NONPKGCONFIG_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS" + xlib_NONPKGCONFIG_CFLAGS=$X_CFLAGS + fi +else + xlib_CFLAGS=$pkg_cv_xlib_CFLAGS + xlib_LIBS=$pkg_cv_xlib_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + ac_fn_c_check_header_mongrel "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ipc_h" = xyes; then : + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_shm_h" = xyes; then : + +fi + + + + if test "$ac_cv_header_sys_ipc_h" = "yes" -a "$ac_cv_header_sys_shm_h" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether shmctl IPC_RMID allowes subsequent attaches" >&5 +$as_echo_n "checking whether shmctl IPC_RMID allowes subsequent attaches... " >&6; } + if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming no" >&5 +$as_echo "assuming no" >&6; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include <sys/types.h> + #include <sys/ipc.h> + #include <sys/shm.h> + int main() + { + char *shmaddr; + int id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0600); + if (id == -1) return 2; + shmaddr = shmat (id, 0, 0); + shmctl (id, IPC_RMID, 0); + if ((char*) shmat (id, 0, 0) == (char*) -1) { + shmdt (shmaddr); + return 1; + } + shmdt (shmaddr); + shmdt (shmaddr); + return 0; + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +$as_echo "#define IPC_RMID_DEFERRED_RELEASE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + + for ac_header in X11/extensions/XShm.h X11/extensions/shmproto.h X11/extensions/shmstr.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include <X11/Xlibint.h> + #include <X11/Xproto.h> +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Xlib surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Xlib surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_xlib" >&5 +$as_echo "$use_xlib" >&6; } + + if test "x$enable_xlib" = "xyes" -a "x$use_xlib" != xyes; then : + as_fn_error $? " Xlib surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-xlib: \`$use_xlib', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_xlib" = "xyes"; then : + CAIRO_REQUIRES="$xlib_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$xlib_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$xlib_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$xlib_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$xlib_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset xlib_BASE +unset xlib_REQUIRES +unset xlib_CFLAGS +unset xlib_NONPKGCONFIG_CFLAGS +unset xlib_LIBS +unset xlib_NONPKGCONFIG_LIBS +unset xlib_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_xlib" = xyes; then + CAIRO_HAS_XLIB_SURFACE_TRUE= + CAIRO_HAS_XLIB_SURFACE_FALSE='#' +else + CAIRO_HAS_XLIB_SURFACE_TRUE='#' + CAIRO_HAS_XLIB_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_XLIB_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_xlib_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_xlib_headers) +all_cairo_private += $(cairo_xlib_private) +all_cairo_cxx_sources += $(cairo_xlib_cxx_sources) +all_cairo_sources += $(cairo_xlib_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_xlib_headers) +enabled_cairo_private += $(cairo_xlib_private) +enabled_cairo_cxx_sources += $(cairo_xlib_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XLIB_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_XLIB_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_xlib" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-xlib.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_xlib" = xyes; then : + : + ac_config_files="$ac_config_files cairo-xlib-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-xlib.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-xlib.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XLIB_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_xlib" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_XLIB_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_XLIB_SURFACE' + + + + if test "x$use_xlib" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_XLIB_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_XLIB_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + if test "x$use_xlib" = xyes; then : + : + CAIRO_NATIVE_SURFACE_BACKENDS="${CAIRO_NATIVE_SURFACE_BACKENDS}"'xlib' + + + +fi + + + + # Check whether --enable-xlib-xrender was given. +if test "${enable_xlib_xrender+set}" = set; then : + enableval=$enable_xlib_xrender; enable_xlib_xrender=$enableval +else + enable_xlib_xrender=auto +fi + + case $enable_xlib_xrender in #( + no) : + use_xlib_xrender="no (disabled, use --enable-xlib-xrender to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Xlib Xrender surface backend feature" >&5 +$as_echo_n "checking for cairo's Xlib Xrender surface backend feature... " >&6; } + echo + + use_xlib_xrender=yes + xlib_xrender_BASE="cairo" +xlib_xrender_REQUIRES="$ac_env_xlib_xrender_REQUIRES_value" +xlib_xrender_CFLAGS="$ac_env_xlib_xrender_CFLAGS_value" +xlib_xrender_NONPKGCONFIG_CFLAGS="$ac_env_xlib_xrender_NONPKGCONFIG_CFLAGS_value" +xlib_xrender_LIBS="$ac_env_xlib_xrender_LIBS_value" +xlib_xrender_NONPKGCONFIG_LIBS="$ac_env_xlib_xrender_NONPKGCONFIG_LIBS_value" +xlib_xrender_NONPKGCONFIG_EXTRA_LIBS="$ac_env_xlib_xrender_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$use_xlib" != "xyes"; then + use_xlib_xrender="no (requires --enable-xlib)" + else + xlib_xrender_BASE=cairo-xlib + xlib_xrender_REQUIRES="xrender >= 0.6" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xlib_xrender" >&5 +$as_echo_n "checking for xlib_xrender... " >&6; } + +if test -n "$xlib_xrender_CFLAGS"; then + pkg_cv_xlib_xrender_CFLAGS="$xlib_xrender_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_xrender_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xlib_xrender_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xlib_xrender_CFLAGS=`$PKG_CONFIG --cflags "$xlib_xrender_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$xlib_xrender_LIBS"; then + pkg_cv_xlib_xrender_LIBS="$xlib_xrender_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_xrender_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xlib_xrender_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xlib_xrender_LIBS=`$PKG_CONFIG --libs "$xlib_xrender_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + xlib_xrender_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$xlib_xrender_REQUIRES" 2>&1` + else + xlib_xrender_PKG_ERRORS=`$PKG_CONFIG --print-errors "$xlib_xrender_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$xlib_xrender_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + xlib_xrender_REQUIRES="" + old_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS" + ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrender.h" "ac_cv_header_X11_extensions_Xrender_h" "#include <X11/X.h> +" +if test "x$ac_cv_header_X11_extensions_Xrender_h" = xyes; then : + xlib_xrender_NONPKGCONFIG_LIBS="-lXrender" +else + use_xlib_xrender="no (requires $xlib_xrender_REQUIRES http://freedesktop.org/Software/xlibs)" +fi + + + CPPFLAGS=$old_CPPFLAGS + +elif test $pkg_failed = untried; then + xlib_xrender_REQUIRES="" + old_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS" + ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrender.h" "ac_cv_header_X11_extensions_Xrender_h" "#include <X11/X.h> +" +if test "x$ac_cv_header_X11_extensions_Xrender_h" = xyes; then : + xlib_xrender_NONPKGCONFIG_LIBS="-lXrender" +else + use_xlib_xrender="no (requires $xlib_xrender_REQUIRES http://freedesktop.org/Software/xlibs)" +fi + + + CPPFLAGS=$old_CPPFLAGS + +else + xlib_xrender_CFLAGS=$pkg_cv_xlib_xrender_CFLAGS + xlib_xrender_LIBS=$pkg_cv_xlib_xrender_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + old_CFLAGS=$CFLAGS + old_LIBS=$LIBS + CFLAGS="$CFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS $xlib_xrender_CFLAGS $xlib_xrender_NONPKGCONFIG_CFLAGS" + LIBS="$LIBS $xlib_LIBS $xlib_NONPKGCONFIG_LIBS $xlib_xrender_LIBS $xlib_xrender_NONPKGCONFIG_LIBS" + for ac_func in XRenderCreateSolidFill XRenderCreateLinearGradient XRenderCreateRadialGradient XRenderCreateConicalGradient +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + CFLAGS=$old_CFLAGS + LIBS=$old_LIBS + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Xlib Xrender surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Xlib Xrender surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_xlib_xrender" >&5 +$as_echo "$use_xlib_xrender" >&6; } + + if test "x$enable_xlib_xrender" = "xyes" -a "x$use_xlib_xrender" != xyes; then : + as_fn_error $? " Xlib Xrender surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-xlib-xrender: \`$use_xlib_xrender', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_xlib_xrender" = "xyes"; then : + CAIRO_REQUIRES="$xlib_xrender_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$xlib_xrender_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$xlib_xrender_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$xlib_xrender_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$xlib_xrender_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset xlib_xrender_BASE +unset xlib_xrender_REQUIRES +unset xlib_xrender_CFLAGS +unset xlib_xrender_NONPKGCONFIG_CFLAGS +unset xlib_xrender_LIBS +unset xlib_xrender_NONPKGCONFIG_LIBS +unset xlib_xrender_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_xlib_xrender" = xyes; then + CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE= + CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE='#' +else + CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE='#' + CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_XLIB_XRENDER_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_xlib_xrender_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_xlib_xrender_headers) +all_cairo_private += $(cairo_xlib_xrender_private) +all_cairo_cxx_sources += $(cairo_xlib_xrender_cxx_sources) +all_cairo_sources += $(cairo_xlib_xrender_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xrender_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xrender_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xrender_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_xlib_xrender_headers) +enabled_cairo_private += $(cairo_xlib_xrender_private) +enabled_cairo_cxx_sources += $(cairo_xlib_xrender_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_xrender_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XLIB_XRENDER_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xrender_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xrender_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xrender_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xrender_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_XLIB_XRENDER_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_xlib_xrender" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-xlib-xrender.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_xlib_xrender" = xyes; then : + : + ac_config_files="$ac_config_files cairo-xlib-xrender-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-xlib-xrender.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-xlib-xrender.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XLIB_XRENDER_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_xlib_xrender" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_XLIB_XRENDER_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_XLIB_XRENDER_SURFACE' + + + + if test "x$use_xlib_xrender" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_XLIB_XRENDER_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_XLIB_XRENDER_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + if test "x$use_xlib_xrender" = xyes; then : + : + CAIRO_NATIVE_SURFACE_BACKENDS="${CAIRO_NATIVE_SURFACE_BACKENDS}"'xlib_xrender' + + + +fi + + + + + # Check whether --enable-xcb was given. +if test "${enable_xcb+set}" = set; then : + enableval=$enable_xcb; enable_xcb=$enableval +else + enable_xcb=auto +fi + + case $enable_xcb in #( + no) : + use_xcb="no (disabled, use --enable-xcb to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's XCB surface backend feature" >&5 +$as_echo_n "checking for cairo's XCB surface backend feature... " >&6; } + echo + + use_xcb=yes + xcb_BASE="cairo" +xcb_REQUIRES="$ac_env_xcb_REQUIRES_value" +xcb_CFLAGS="$ac_env_xcb_CFLAGS_value" +xcb_NONPKGCONFIG_CFLAGS="$ac_env_xcb_NONPKGCONFIG_CFLAGS_value" +xcb_LIBS="$ac_env_xcb_LIBS_value" +xcb_NONPKGCONFIG_LIBS="$ac_env_xcb_NONPKGCONFIG_LIBS_value" +xcb_NONPKGCONFIG_EXTRA_LIBS="$ac_env_xcb_NONPKGCONFIG_EXTRA_LIBS_value" + + + + xcb_REQUIRES="xcb >= 1.6 xcb-render >= 1.6" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xcb" >&5 +$as_echo_n "checking for xcb... " >&6; } + +if test -n "$xcb_CFLAGS"; then + pkg_cv_xcb_CFLAGS="$xcb_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xcb_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xcb_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xcb_CFLAGS=`$PKG_CONFIG --cflags "$xcb_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$xcb_LIBS"; then + pkg_cv_xcb_LIBS="$xcb_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xcb_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xcb_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xcb_LIBS=`$PKG_CONFIG --libs "$xcb_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + xcb_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$xcb_REQUIRES" 2>&1` + else + xcb_PKG_ERRORS=`$PKG_CONFIG --print-errors "$xcb_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$xcb_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_xcb="no (requires $xcb_REQUIRES http://xcb.freedesktop.org)" +elif test $pkg_failed = untried; then + use_xcb="no (requires $xcb_REQUIRES http://xcb.freedesktop.org)" +else + xcb_CFLAGS=$pkg_cv_xcb_CFLAGS + xcb_LIBS=$pkg_cv_xcb_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's XCB surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's XCB surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_xcb" >&5 +$as_echo "$use_xcb" >&6; } + + if test "x$enable_xcb" = "xyes" -a "x$use_xcb" != xyes; then : + as_fn_error $? " XCB surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-xcb: \`$use_xcb', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_xcb" = "xyes"; then : + CAIRO_REQUIRES="$xcb_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$xcb_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$xcb_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$xcb_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$xcb_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset xcb_BASE +unset xcb_REQUIRES +unset xcb_CFLAGS +unset xcb_NONPKGCONFIG_CFLAGS +unset xcb_LIBS +unset xcb_NONPKGCONFIG_LIBS +unset xcb_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_xcb" = xyes; then + CAIRO_HAS_XCB_SURFACE_TRUE= + CAIRO_HAS_XCB_SURFACE_FALSE='#' +else + CAIRO_HAS_XCB_SURFACE_TRUE='#' + CAIRO_HAS_XCB_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_XCB_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_xcb_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_xcb_headers) +all_cairo_private += $(cairo_xcb_private) +all_cairo_cxx_sources += $(cairo_xcb_cxx_sources) +all_cairo_sources += $(cairo_xcb_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_xcb_headers) +enabled_cairo_private += $(cairo_xcb_private) +enabled_cairo_cxx_sources += $(cairo_xcb_cxx_sources) +enabled_cairo_sources += $(cairo_xcb_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XCB_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_XCB_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_xcb" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-xcb.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_xcb" = xyes; then : + : + ac_config_files="$ac_config_files cairo-xcb-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-xcb.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-xcb.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XCB_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_xcb" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_XCB_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_XCB_SURFACE' + + + + if test "x$use_xcb" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_XCB_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_XCB_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + if test "x$use_xcb" = xyes; then : + : + CAIRO_NATIVE_SURFACE_BACKENDS="${CAIRO_NATIVE_SURFACE_BACKENDS}"'xcb' + + + +fi + + + + # Check whether --enable-xlib-xcb was given. +if test "${enable_xlib_xcb+set}" = set; then : + enableval=$enable_xlib_xcb; enable_xlib_xcb=$enableval +else + enable_xlib_xcb=no +fi + + case $enable_xlib_xcb in #( + no) : + use_xlib_xcb="no (disabled, use --enable-xlib-xcb to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Xlib/XCB functions feature" >&5 +$as_echo_n "checking for cairo's Xlib/XCB functions feature... " >&6; } + echo + + use_xlib_xcb=yes + xlib_xcb_BASE="cairo" +xlib_xcb_REQUIRES="$ac_env_xlib_xcb_REQUIRES_value" +xlib_xcb_CFLAGS="$ac_env_xlib_xcb_CFLAGS_value" +xlib_xcb_NONPKGCONFIG_CFLAGS="$ac_env_xlib_xcb_NONPKGCONFIG_CFLAGS_value" +xlib_xcb_LIBS="$ac_env_xlib_xcb_LIBS_value" +xlib_xcb_NONPKGCONFIG_LIBS="$ac_env_xlib_xcb_NONPKGCONFIG_LIBS_value" +xlib_xcb_NONPKGCONFIG_EXTRA_LIBS="$ac_env_xlib_xcb_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$use_xcb" = "xyes" -a "x$use_xlib" = "xyes"; then + xlib_xcb_REQUIRES="x11-xcb" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xlib_xcb" >&5 +$as_echo_n "checking for xlib_xcb... " >&6; } + +if test -n "$xlib_xcb_CFLAGS"; then + pkg_cv_xlib_xcb_CFLAGS="$xlib_xcb_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_xcb_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xlib_xcb_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xlib_xcb_CFLAGS=`$PKG_CONFIG --cflags "$xlib_xcb_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$xlib_xcb_LIBS"; then + pkg_cv_xlib_xcb_LIBS="$xlib_xcb_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_xcb_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xlib_xcb_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xlib_xcb_LIBS=`$PKG_CONFIG --libs "$xlib_xcb_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + xlib_xcb_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$xlib_xcb_REQUIRES" 2>&1` + else + xlib_xcb_PKG_ERRORS=`$PKG_CONFIG --print-errors "$xlib_xcb_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$xlib_xcb_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_xlib_xcb="no (requires $xlib_xcb_REQUIRES http://xcb.freedesktop.org)" +elif test $pkg_failed = untried; then + use_xlib_xcb="no (requires $xlib_xcb_REQUIRES http://xcb.freedesktop.org)" +else + xlib_xcb_CFLAGS=$pkg_cv_xlib_xcb_CFLAGS + xlib_xcb_LIBS=$pkg_cv_xlib_xcb_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + else + use_xlib_xcb="no (requires both --enable-xlib and --enable-xcb)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Xlib/XCB functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Xlib/XCB functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_xlib_xcb" >&5 +$as_echo "$use_xlib_xcb" >&6; } + + if test "x$enable_xlib_xcb" = "xyes" -a "x$use_xlib_xcb" != xyes; then : + as_fn_error $? " Xlib/XCB functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-xlib-xcb: \`$use_xlib_xcb', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_xlib_xcb" = "xyes"; then : + CAIRO_REQUIRES="$xlib_xcb_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$xlib_xcb_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$xlib_xcb_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$xlib_xcb_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$xlib_xcb_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset xlib_xcb_BASE +unset xlib_xcb_REQUIRES +unset xlib_xcb_CFLAGS +unset xlib_xcb_NONPKGCONFIG_CFLAGS +unset xlib_xcb_LIBS +unset xlib_xcb_NONPKGCONFIG_LIBS +unset xlib_xcb_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_xlib_xcb" = xyes; then + CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE= + CAIRO_HAS_XLIB_XCB_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE='#' + CAIRO_HAS_XLIB_XCB_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_XLIB_XCB_FUNCTIONS=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_xlib_xcb_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_xlib_xcb_headers) +all_cairo_private += $(cairo_xlib_xcb_private) +all_cairo_cxx_sources += $(cairo_xlib_xcb_cxx_sources) +all_cairo_sources += $(cairo_xlib_xcb_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xcb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_xlib_xcb_headers) +enabled_cairo_private += $(cairo_xlib_xcb_private) +enabled_cairo_cxx_sources += $(cairo_xlib_xcb_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_xcb_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XLIB_XCB_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xlib_xcb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xlib_xcb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_XLIB_XCB_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_xlib_xcb" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-xlib-xcb.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_xlib_xcb" = xyes; then : + : + ac_config_files="$ac_config_files cairo-xlib-xcb-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-xlib-xcb.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-xlib-xcb.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XLIB_XCB_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_xlib_xcb" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_XLIB_XCB_FUNCTIONS' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_xlib_xcb" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The Xlib/XCB functions feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to Xlib/XCB functions specific +--- API.' + + + +fi + + + + + + # Check whether --enable-xcb-shm was given. +if test "${enable_xcb_shm+set}" = set; then : + enableval=$enable_xcb_shm; enable_xcb_shm=$enableval +else + enable_xcb_shm=auto +fi + + case $enable_xcb_shm in #( + no) : + use_xcb_shm="no (disabled, use --enable-xcb-shm to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's XCB/SHM functions feature" >&5 +$as_echo_n "checking for cairo's XCB/SHM functions feature... " >&6; } + echo + + use_xcb_shm=yes + xcb_shm_BASE="cairo" +xcb_shm_REQUIRES="$ac_env_xcb_shm_REQUIRES_value" +xcb_shm_CFLAGS="$ac_env_xcb_shm_CFLAGS_value" +xcb_shm_NONPKGCONFIG_CFLAGS="$ac_env_xcb_shm_NONPKGCONFIG_CFLAGS_value" +xcb_shm_LIBS="$ac_env_xcb_shm_LIBS_value" +xcb_shm_NONPKGCONFIG_LIBS="$ac_env_xcb_shm_NONPKGCONFIG_LIBS_value" +xcb_shm_NONPKGCONFIG_EXTRA_LIBS="$ac_env_xcb_shm_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$use_xcb" = "xyes"; then + xcb_shm_REQUIRES="xcb-shm" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for xcb_shm" >&5 +$as_echo_n "checking for xcb_shm... " >&6; } + +if test -n "$xcb_shm_CFLAGS"; then + pkg_cv_xcb_shm_CFLAGS="$xcb_shm_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xcb_shm_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xcb_shm_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xcb_shm_CFLAGS=`$PKG_CONFIG --cflags "$xcb_shm_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$xcb_shm_LIBS"; then + pkg_cv_xcb_shm_LIBS="$xcb_shm_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xcb_shm_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$xcb_shm_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_xcb_shm_LIBS=`$PKG_CONFIG --libs "$xcb_shm_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + xcb_shm_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$xcb_shm_REQUIRES" 2>&1` + else + xcb_shm_PKG_ERRORS=`$PKG_CONFIG --print-errors "$xcb_shm_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$xcb_shm_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_xcb_shm="no (requires $xcb_shm http://xcb.freedesktop.org)" +elif test $pkg_failed = untried; then + use_xcb_shm="no (requires $xcb_shm http://xcb.freedesktop.org)" +else + xcb_shm_CFLAGS=$pkg_cv_xcb_shm_CFLAGS + xcb_shm_LIBS=$pkg_cv_xcb_shm_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + else + use_xcb_shm="no (requires --enable-xcb)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's XCB/SHM functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's XCB/SHM functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_xcb_shm" >&5 +$as_echo "$use_xcb_shm" >&6; } + + if test "x$enable_xcb_shm" = "xyes" -a "x$use_xcb_shm" != xyes; then : + as_fn_error $? " XCB/SHM functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-xcb-shm: \`$use_xcb_shm', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_xcb_shm" = "xyes"; then : + CAIRO_REQUIRES="$xcb_shm_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$xcb_shm_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$xcb_shm_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$xcb_shm_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$xcb_shm_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset xcb_shm_BASE +unset xcb_shm_REQUIRES +unset xcb_shm_CFLAGS +unset xcb_shm_NONPKGCONFIG_CFLAGS +unset xcb_shm_LIBS +unset xcb_shm_NONPKGCONFIG_LIBS +unset xcb_shm_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_xcb_shm" = xyes; then + CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE= + CAIRO_HAS_XCB_SHM_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE='#' + CAIRO_HAS_XCB_SHM_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_XCB_SHM_FUNCTIONS=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_xcb_shm_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_xcb_shm_headers) +all_cairo_private += $(cairo_xcb_shm_private) +all_cairo_cxx_sources += $(cairo_xcb_shm_cxx_sources) +all_cairo_sources += $(cairo_xcb_shm_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_shm_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_xcb_shm_headers) +enabled_cairo_private += $(cairo_xcb_shm_private) +enabled_cairo_cxx_sources += $(cairo_xcb_shm_cxx_sources) +enabled_cairo_sources += $(cairo_xcb_shm_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XCB_SHM_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xcb_shm_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_XCB_SHM_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_xcb_shm" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-xcb-shm.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_xcb_shm" = xyes; then : + : + ac_config_files="$ac_config_files cairo-xcb-shm-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-xcb-shm.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-xcb-shm.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XCB_SHM_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_xcb_shm" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_XCB_SHM_FUNCTIONS' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_XCB_SHM_FUNCTIONS' + + + + if test "x$use_xcb_shm" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_XCB_SHM_FUNCTIONS' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_XCB_SHM_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + + # Check whether --enable-qt was given. +if test "${enable_qt+set}" = set; then : + enableval=$enable_qt; enable_qt=$enableval +else + enable_qt=no +fi + + case $enable_qt in #( + no) : + use_qt="no (disabled, use --enable-qt to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Qt surface backend feature" >&5 +$as_echo_n "checking for cairo's Qt surface backend feature... " >&6; } + echo + + use_qt=yes + qt_BASE="cairo" +qt_REQUIRES="$ac_env_qt_REQUIRES_value" +qt_CFLAGS="$ac_env_qt_CFLAGS_value" +qt_NONPKGCONFIG_CFLAGS="$ac_env_qt_NONPKGCONFIG_CFLAGS_value" +qt_LIBS="$ac_env_qt_LIBS_value" +qt_NONPKGCONFIG_LIBS="$ac_env_qt_NONPKGCONFIG_LIBS_value" +qt_NONPKGCONFIG_EXTRA_LIBS="$ac_env_qt_NONPKGCONFIG_EXTRA_LIBS_value" + + + + qt_REQUIRES="QtGui >= 4.4.0" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for qt" >&5 +$as_echo_n "checking for qt... " >&6; } + +if test -n "$qt_CFLAGS"; then + pkg_cv_qt_CFLAGS="$qt_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$qt_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$qt_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_qt_CFLAGS=`$PKG_CONFIG --cflags "$qt_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$qt_LIBS"; then + pkg_cv_qt_LIBS="$qt_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$qt_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$qt_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_qt_LIBS=`$PKG_CONFIG --libs "$qt_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + qt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$qt_REQUIRES" 2>&1` + else + qt_PKG_ERRORS=`$PKG_CONFIG --print-errors "$qt_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$qt_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + qt_REQUIRES="" + use_qt="no (requires Qt4 development libraries)" + +elif test $pkg_failed = untried; then + qt_REQUIRES="" + use_qt="no (requires Qt4 development libraries)" + +else + qt_CFLAGS=$pkg_cv_qt_CFLAGS + qt_LIBS=$pkg_cv_qt_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + qt_NONPKGCONFIG_LIBS="-lstdc++" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Qt surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Qt surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_qt" >&5 +$as_echo "$use_qt" >&6; } + + if test "x$enable_qt" = "xyes" -a "x$use_qt" != xyes; then : + as_fn_error $? " Qt surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-qt: \`$use_qt', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_qt" = "xyes"; then : + CAIRO_REQUIRES="$qt_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$qt_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$qt_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$qt_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$qt_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset qt_BASE +unset qt_REQUIRES +unset qt_CFLAGS +unset qt_NONPKGCONFIG_CFLAGS +unset qt_LIBS +unset qt_NONPKGCONFIG_LIBS +unset qt_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_qt" = xyes; then + CAIRO_HAS_QT_SURFACE_TRUE= + CAIRO_HAS_QT_SURFACE_FALSE='#' +else + CAIRO_HAS_QT_SURFACE_TRUE='#' + CAIRO_HAS_QT_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_QT_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_qt_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_qt_headers) +all_cairo_private += $(cairo_qt_private) +all_cairo_cxx_sources += $(cairo_qt_cxx_sources) +all_cairo_sources += $(cairo_qt_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_qt_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_qt_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_qt_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_qt_headers) +enabled_cairo_private += $(cairo_qt_private) +enabled_cairo_cxx_sources += $(cairo_qt_cxx_sources) +enabled_cairo_sources += $(cairo_qt_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QT_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QT_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_qt_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_qt_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_qt_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_QT_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_QT_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_qt" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-qt.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_qt" = xyes; then : + : + ac_config_files="$ac_config_files cairo-qt-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-qt.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-qt.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QT_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QT_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_qt" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_QT_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_QT_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_QT_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_qt" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The Qt surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to Qt surface backend specific +--- API.' + + + +fi + + + + + + + # Check whether --enable-quartz was given. +if test "${enable_quartz+set}" = set; then : + enableval=$enable_quartz; enable_quartz=$enableval +else + enable_quartz=auto +fi + + case $enable_quartz in #( + no) : + use_quartz="no (disabled, use --enable-quartz to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Quartz surface backend feature" >&5 +$as_echo_n "checking for cairo's Quartz surface backend feature... " >&6; } + echo + + use_quartz=yes + quartz_BASE="cairo" +quartz_REQUIRES="$ac_env_quartz_REQUIRES_value" +quartz_CFLAGS="$ac_env_quartz_CFLAGS_value" +quartz_NONPKGCONFIG_CFLAGS="$ac_env_quartz_NONPKGCONFIG_CFLAGS_value" +quartz_LIBS="$ac_env_quartz_LIBS_value" +quartz_NONPKGCONFIG_LIBS="$ac_env_quartz_NONPKGCONFIG_LIBS_value" +quartz_NONPKGCONFIG_EXTRA_LIBS="$ac_env_quartz_NONPKGCONFIG_EXTRA_LIBS_value" + + + + ac_fn_c_check_header_mongrel "$LINENO" "ApplicationServices/ApplicationServices.h" "ac_cv_header_ApplicationServices_ApplicationServices_h" "$ac_includes_default" +if test "x$ac_cv_header_ApplicationServices_ApplicationServices_h" = xyes; then : + +else + use_quartz="no (requires ApplicationServices framework)" +fi + + + if test "x$use_quartz" != "xyes" ; then + ac_fn_c_check_header_mongrel "$LINENO" "CoreGraphics/CoreGraphics.h" "ac_cv_header_CoreGraphics_CoreGraphics_h" "$ac_includes_default" +if test "x$ac_cv_header_CoreGraphics_CoreGraphics_h" = xyes; then : + +else + use_quartz="no (requires CoreGraphics framework)" +fi + + + quartz_LIBS="-Xlinker -framework -Xlinker CoreGraphics" + else + quartz_LIBS="-Xlinker -framework -Xlinker ApplicationServices" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Quartz surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Quartz surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_quartz" >&5 +$as_echo "$use_quartz" >&6; } + + if test "x$enable_quartz" = "xyes" -a "x$use_quartz" != xyes; then : + as_fn_error $? " Quartz surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-quartz: \`$use_quartz', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_quartz" = "xyes"; then : + CAIRO_REQUIRES="$quartz_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$quartz_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$quartz_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$quartz_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$quartz_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset quartz_BASE +unset quartz_REQUIRES +unset quartz_CFLAGS +unset quartz_NONPKGCONFIG_CFLAGS +unset quartz_LIBS +unset quartz_NONPKGCONFIG_LIBS +unset quartz_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_quartz" = xyes; then + CAIRO_HAS_QUARTZ_SURFACE_TRUE= + CAIRO_HAS_QUARTZ_SURFACE_FALSE='#' +else + CAIRO_HAS_QUARTZ_SURFACE_TRUE='#' + CAIRO_HAS_QUARTZ_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_QUARTZ_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_quartz_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_quartz_headers) +all_cairo_private += $(cairo_quartz_private) +all_cairo_cxx_sources += $(cairo_quartz_cxx_sources) +all_cairo_sources += $(cairo_quartz_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_quartz_headers) +enabled_cairo_private += $(cairo_quartz_private) +enabled_cairo_cxx_sources += $(cairo_quartz_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QUARTZ_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_QUARTZ_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_quartz" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-quartz.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_quartz" = xyes; then : + : + ac_config_files="$ac_config_files cairo-quartz-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-quartz.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-quartz.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QUARTZ_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_quartz" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_QUARTZ_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_QUARTZ_SURFACE' + + + + if test "x$use_quartz" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_QUARTZ_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_QUARTZ_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + if test "x$use_quartz" = xyes; then : + : + CAIRO_NATIVE_SURFACE_BACKENDS="${CAIRO_NATIVE_SURFACE_BACKENDS}"'quartz' + + + +fi + + + + # Check whether --enable-quartz-font was given. +if test "${enable_quartz_font+set}" = set; then : + enableval=$enable_quartz_font; enable_quartz_font=$enableval +else + enable_quartz_font=auto +fi + + case $enable_quartz_font in #( + no) : + use_quartz_font="no (disabled, use --enable-quartz-font to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Quartz font backend feature" >&5 +$as_echo_n "checking for cairo's Quartz font backend feature... " >&6; } + echo + + use_quartz_font=yes + quartz_font_BASE="cairo" +quartz_font_REQUIRES="$ac_env_quartz_font_REQUIRES_value" +quartz_font_CFLAGS="$ac_env_quartz_font_CFLAGS_value" +quartz_font_NONPKGCONFIG_CFLAGS="$ac_env_quartz_font_NONPKGCONFIG_CFLAGS_value" +quartz_font_LIBS="$ac_env_quartz_font_LIBS_value" +quartz_font_NONPKGCONFIG_LIBS="$ac_env_quartz_font_NONPKGCONFIG_LIBS_value" +quartz_font_NONPKGCONFIG_EXTRA_LIBS="$ac_env_quartz_font_NONPKGCONFIG_EXTRA_LIBS_value" + + + + use_quartz_font=$use_quartz + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Quartz font backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Quartz font backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_quartz_font" >&5 +$as_echo "$use_quartz_font" >&6; } + + if test "x$enable_quartz_font" = "xyes" -a "x$use_quartz_font" != xyes; then : + as_fn_error $? " Quartz font backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-quartz-font: \`$use_quartz_font', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_quartz_font" = "xyes"; then : + CAIRO_REQUIRES="$quartz_font_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$quartz_font_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$quartz_font_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$quartz_font_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$quartz_font_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset quartz_font_BASE +unset quartz_font_REQUIRES +unset quartz_font_CFLAGS +unset quartz_font_NONPKGCONFIG_CFLAGS +unset quartz_font_LIBS +unset quartz_font_NONPKGCONFIG_LIBS +unset quartz_font_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_quartz_font" = xyes; then + CAIRO_HAS_QUARTZ_FONT_TRUE= + CAIRO_HAS_QUARTZ_FONT_FALSE='#' +else + CAIRO_HAS_QUARTZ_FONT_TRUE='#' + CAIRO_HAS_QUARTZ_FONT_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_QUARTZ_FONT=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_quartz_font_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_quartz_font_headers) +all_cairo_private += $(cairo_quartz_font_private) +all_cairo_cxx_sources += $(cairo_quartz_font_cxx_sources) +all_cairo_sources += $(cairo_quartz_font_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_font_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_font_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_font_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_quartz_font_headers) +enabled_cairo_private += $(cairo_quartz_font_private) +enabled_cairo_cxx_sources += $(cairo_quartz_font_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_font_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QUARTZ_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_font_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_font_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_font_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_font_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_QUARTZ_FONT' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_FONT),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_quartz_font" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-quartz-font.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_quartz_font" = xyes; then : + : + ac_config_files="$ac_config_files cairo-quartz-font-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-quartz-font.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-quartz-font.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QUARTZ_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_quartz_font" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_QUARTZ_FONT' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_QUARTZ_FONT' + + + + if test "x$use_quartz_font" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_QUARTZ_FONT' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_QUARTZ_FONT 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_FONT),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + if test "x$use_quartz_font" = xyes; then : + : + CAIRO_NATIVE_FONT_BACKENDS="${CAIRO_NATIVE_FONT_BACKENDS}"'quartz_font' + + + +fi + + + # Check whether --enable-quartz-image was given. +if test "${enable_quartz_image+set}" = set; then : + enableval=$enable_quartz_image; enable_quartz_image=$enableval +else + enable_quartz_image=no +fi + + case $enable_quartz_image in #( + no) : + use_quartz_image="no (disabled, use --enable-quartz-image to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Quartz Image surface backend feature" >&5 +$as_echo_n "checking for cairo's Quartz Image surface backend feature... " >&6; } + echo + + use_quartz_image=yes + quartz_image_BASE="cairo" +quartz_image_REQUIRES="$ac_env_quartz_image_REQUIRES_value" +quartz_image_CFLAGS="$ac_env_quartz_image_CFLAGS_value" +quartz_image_NONPKGCONFIG_CFLAGS="$ac_env_quartz_image_NONPKGCONFIG_CFLAGS_value" +quartz_image_LIBS="$ac_env_quartz_image_LIBS_value" +quartz_image_NONPKGCONFIG_LIBS="$ac_env_quartz_image_NONPKGCONFIG_LIBS_value" +quartz_image_NONPKGCONFIG_EXTRA_LIBS="$ac_env_quartz_image_NONPKGCONFIG_EXTRA_LIBS_value" + + + + use_quartz_image=$use_quartz + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Quartz Image surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Quartz Image surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_quartz_image" >&5 +$as_echo "$use_quartz_image" >&6; } + + if test "x$enable_quartz_image" = "xyes" -a "x$use_quartz_image" != xyes; then : + as_fn_error $? " Quartz Image surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-quartz-image: \`$use_quartz_image', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_quartz_image" = "xyes"; then : + CAIRO_REQUIRES="$quartz_image_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$quartz_image_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$quartz_image_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$quartz_image_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$quartz_image_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset quartz_image_BASE +unset quartz_image_REQUIRES +unset quartz_image_CFLAGS +unset quartz_image_NONPKGCONFIG_CFLAGS +unset quartz_image_LIBS +unset quartz_image_NONPKGCONFIG_LIBS +unset quartz_image_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_quartz_image" = xyes; then + CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE= + CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE='#' +else + CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE='#' + CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_QUARTZ_IMAGE_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_quartz_image_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_quartz_image_headers) +all_cairo_private += $(cairo_quartz_image_private) +all_cairo_cxx_sources += $(cairo_quartz_image_cxx_sources) +all_cairo_sources += $(cairo_quartz_image_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_quartz_image_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_image_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_image_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_quartz_image_headers) +enabled_cairo_private += $(cairo_quartz_image_private) +enabled_cairo_cxx_sources += $(cairo_quartz_image_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_image_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QUARTZ_IMAGE_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_quartz_image_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_quartz_image_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_quartz_image_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_quartz_image_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_QUARTZ_IMAGE_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_quartz_image" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-quartz-image.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_quartz_image" = xyes; then : + : + ac_config_files="$ac_config_files cairo-quartz-image-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-quartz-image.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-quartz-image.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_QUARTZ_IMAGE_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_quartz_image" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_QUARTZ_IMAGE_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_quartz_image" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The Quartz Image surface backend feature is still under active +--- development and is included in this release only as a preview. It does +--- NOT fully work yet and incompatible changes may yet be made to Quartz +--- Image surface backend specific API.' + + + +fi + + + + + + + # Check whether --enable-win32 was given. +if test "${enable_win32+set}" = set; then : + enableval=$enable_win32; enable_win32=$enableval +else + enable_win32=auto +fi + + case $enable_win32 in #( + no) : + use_win32="no (disabled, use --enable-win32 to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Microsoft Windows surface backend feature" >&5 +$as_echo_n "checking for cairo's Microsoft Windows surface backend feature... " >&6; } + echo + + use_win32=yes + win32_BASE="cairo" +win32_REQUIRES="$ac_env_win32_REQUIRES_value" +win32_CFLAGS="$ac_env_win32_CFLAGS_value" +win32_NONPKGCONFIG_CFLAGS="$ac_env_win32_NONPKGCONFIG_CFLAGS_value" +win32_LIBS="$ac_env_win32_LIBS_value" +win32_NONPKGCONFIG_LIBS="$ac_env_win32_NONPKGCONFIG_LIBS_value" +win32_NONPKGCONFIG_EXTRA_LIBS="$ac_env_win32_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$have_windows" != xyes; then + use_win32="no (requires a Win32 platform)" + fi + win32_LIBS="-lgdi32 -lmsimg32" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Microsoft Windows surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Microsoft Windows surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_win32" >&5 +$as_echo "$use_win32" >&6; } + + if test "x$enable_win32" = "xyes" -a "x$use_win32" != xyes; then : + as_fn_error $? " Microsoft Windows surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-win32: \`$use_win32', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_win32" = "xyes"; then : + CAIRO_REQUIRES="$win32_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$win32_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$win32_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$win32_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$win32_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset win32_BASE +unset win32_REQUIRES +unset win32_CFLAGS +unset win32_NONPKGCONFIG_CFLAGS +unset win32_LIBS +unset win32_NONPKGCONFIG_LIBS +unset win32_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_win32" = xyes; then + CAIRO_HAS_WIN32_SURFACE_TRUE= + CAIRO_HAS_WIN32_SURFACE_FALSE='#' +else + CAIRO_HAS_WIN32_SURFACE_TRUE='#' + CAIRO_HAS_WIN32_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_WIN32_SURFACE=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_win32_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_win32_headers) +all_cairo_private += $(cairo_win32_private) +all_cairo_cxx_sources += $(cairo_win32_cxx_sources) +all_cairo_sources += $(cairo_win32_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_win32_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_win32_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_win32_headers) +enabled_cairo_private += $(cairo_win32_private) +enabled_cairo_cxx_sources += $(cairo_win32_cxx_sources) +enabled_cairo_sources += $(cairo_win32_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_WIN32_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_win32_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_win32_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_win32_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_WIN32_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_win32" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-win32.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_win32" = xyes; then : + : + ac_config_files="$ac_config_files cairo-win32-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-win32.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-win32.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_WIN32_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_win32" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_WIN32_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_WIN32_SURFACE' + + + + if test "x$use_win32" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_WIN32_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_WIN32_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + if test "x$use_win32" = xyes; then : + : + CAIRO_NATIVE_SURFACE_BACKENDS="${CAIRO_NATIVE_SURFACE_BACKENDS}"'win32' + + + +fi + + + + # Check whether --enable-win32-font was given. +if test "${enable_win32_font+set}" = set; then : + enableval=$enable_win32_font; enable_win32_font=$enableval +else + enable_win32_font=auto +fi + + case $enable_win32_font in #( + no) : + use_win32_font="no (disabled, use --enable-win32-font to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Microsoft Windows font backend feature" >&5 +$as_echo_n "checking for cairo's Microsoft Windows font backend feature... " >&6; } + echo + + use_win32_font=yes + win32_font_BASE="cairo" +win32_font_REQUIRES="$ac_env_win32_font_REQUIRES_value" +win32_font_CFLAGS="$ac_env_win32_font_CFLAGS_value" +win32_font_NONPKGCONFIG_CFLAGS="$ac_env_win32_font_NONPKGCONFIG_CFLAGS_value" +win32_font_LIBS="$ac_env_win32_font_LIBS_value" +win32_font_NONPKGCONFIG_LIBS="$ac_env_win32_font_NONPKGCONFIG_LIBS_value" +win32_font_NONPKGCONFIG_EXTRA_LIBS="$ac_env_win32_font_NONPKGCONFIG_EXTRA_LIBS_value" + + + + use_win32_font=$use_win32 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Microsoft Windows font backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Microsoft Windows font backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_win32_font" >&5 +$as_echo "$use_win32_font" >&6; } + + if test "x$enable_win32_font" = "xyes" -a "x$use_win32_font" != xyes; then : + as_fn_error $? " Microsoft Windows font backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-win32-font: \`$use_win32_font', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_win32_font" = "xyes"; then : + CAIRO_REQUIRES="$win32_font_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$win32_font_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$win32_font_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$win32_font_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$win32_font_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset win32_font_BASE +unset win32_font_REQUIRES +unset win32_font_CFLAGS +unset win32_font_NONPKGCONFIG_CFLAGS +unset win32_font_LIBS +unset win32_font_NONPKGCONFIG_LIBS +unset win32_font_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_win32_font" = xyes; then + CAIRO_HAS_WIN32_FONT_TRUE= + CAIRO_HAS_WIN32_FONT_FALSE='#' +else + CAIRO_HAS_WIN32_FONT_TRUE='#' + CAIRO_HAS_WIN32_FONT_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_WIN32_FONT=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_win32_font_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_win32_font_headers) +all_cairo_private += $(cairo_win32_font_private) +all_cairo_cxx_sources += $(cairo_win32_font_cxx_sources) +all_cairo_sources += $(cairo_win32_font_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_win32_font_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_font_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_win32_font_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_win32_font_headers) +enabled_cairo_private += $(cairo_win32_font_private) +enabled_cairo_cxx_sources += $(cairo_win32_font_cxx_sources) +enabled_cairo_sources += $(cairo_win32_font_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_WIN32_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_win32_font_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_win32_font_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_win32_font_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_win32_font_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_WIN32_FONT' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_FONT),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_win32_font" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-win32-font.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_win32_font" = xyes; then : + : + ac_config_files="$ac_config_files cairo-win32-font-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-win32-font.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-win32-font.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_WIN32_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_win32_font" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_WIN32_FONT' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_WIN32_FONT' + + + + if test "x$use_win32_font" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_WIN32_FONT' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_WIN32_FONT 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_WIN32_FONT),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + if test "x$use_win32_font" = xyes; then : + : + CAIRO_NATIVE_FONT_BACKENDS="${CAIRO_NATIVE_FONT_BACKENDS}"'win32_font' + + + +fi + + +test_win32_printing=no +if test "x$use_win32" = "xyes"; then + # Extract the first word of "gs", so it can be a program name with args. +set dummy gs; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_GS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$GS"; then + ac_cv_prog_GS="$GS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GS="gs" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +GS=$ac_cv_prog_GS +if test -n "$GS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GS" >&5 +$as_echo "$GS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$GS"; then + +$as_echo "#define CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE 1" >>confdefs.h + + test_win32_printing="yes" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Win32 Printing backend will not be tested since ghostscript is not available" >&5 +$as_echo "$as_me: WARNING: Win32 Printing backend will not be tested since ghostscript is not available" >&2;} + test_win32_printing="no (requires ghostscript)" + fi +fi + + if test "x$test_win32_printing" = "xyes"; then + CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE= + CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE='#' +else + CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE='#' + CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE= +fi + + + + # Check whether --enable-skia was given. +if test "${enable_skia+set}" = set; then : + enableval=$enable_skia; enable_skia=$enableval +else + enable_skia=no +fi + + case $enable_skia in #( + no) : + use_skia="no (disabled, use --enable-skia to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Skia surface backend feature" >&5 +$as_echo_n "checking for cairo's Skia surface backend feature... " >&6; } + echo + + use_skia=yes + skia_BASE="cairo" +skia_REQUIRES="$ac_env_skia_REQUIRES_value" +skia_CFLAGS="$ac_env_skia_CFLAGS_value" +skia_NONPKGCONFIG_CFLAGS="$ac_env_skia_NONPKGCONFIG_CFLAGS_value" +skia_LIBS="$ac_env_skia_LIBS_value" +skia_NONPKGCONFIG_LIBS="$ac_env_skia_NONPKGCONFIG_LIBS_value" +skia_NONPKGCONFIG_EXTRA_LIBS="$ac_env_skia_NONPKGCONFIG_EXTRA_LIBS_value" + + + + +# Check whether --with-skia was given. +if test "${with_skia+set}" = set; then : + withval=$with_skia; skia_DIR="$withval" +else + skia_DIR="`pwd`/../skia" +fi + + +# Check whether --with-skia-build-type was given. +if test "${with_skia_build_type+set}" = set; then : + withval=$with_skia_build_type; skia_BUILD_TYPE="$withval" +else + skia_BUILD_TYPE="Release" +fi + + skia_NONPKGCONFIG_CFLAGS="-I$skia_DIR/include/config -I$skia_DIR/include/core -I$skia_DIR/include/effects" + if test "x$skia_BUILD_TYPE" = "xRelease"; then + skia_NONPKGCONFIG_CFLAGS="-DSK_RELEASE -DSK_CAN_USE_FLOAT $skia_NONPKGCONFIG_CFLAGS" + fi + skia_NONPKGCONFIG_LIBS="-L$skia_DIR/out/$skia_BUILD_TYPE/lib.target/ -lskia -lstdc++" + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Skia surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Skia surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_skia" >&5 +$as_echo "$use_skia" >&6; } + + if test "x$enable_skia" = "xyes" -a "x$use_skia" != xyes; then : + as_fn_error $? " Skia surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-skia: \`$use_skia', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_skia" = "xyes"; then : + CAIRO_REQUIRES="$skia_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$skia_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$skia_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$skia_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$skia_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset skia_BASE +unset skia_REQUIRES +unset skia_CFLAGS +unset skia_NONPKGCONFIG_CFLAGS +unset skia_LIBS +unset skia_NONPKGCONFIG_LIBS +unset skia_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_skia" = xyes; then + CAIRO_HAS_SKIA_SURFACE_TRUE= + CAIRO_HAS_SKIA_SURFACE_FALSE='#' +else + CAIRO_HAS_SKIA_SURFACE_TRUE='#' + CAIRO_HAS_SKIA_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_SKIA_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_skia_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_skia_headers) +all_cairo_private += $(cairo_skia_private) +all_cairo_cxx_sources += $(cairo_skia_cxx_sources) +all_cairo_sources += $(cairo_skia_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_skia_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_skia_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_skia_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_skia_headers) +enabled_cairo_private += $(cairo_skia_private) +enabled_cairo_cxx_sources += $(cairo_skia_cxx_sources) +enabled_cairo_sources += $(cairo_skia_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SKIA_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SKIA_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_skia_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_skia_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_skia_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_skia_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_SKIA_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_SKIA_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_skia" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-skia.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_skia" = xyes; then : + : + ac_config_files="$ac_config_files cairo-skia-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-skia.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-skia.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SKIA_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SKIA_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_skia" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_SKIA_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_SKIA_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_SKIA_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_skia" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The Skia surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to Skia surface backend specific +--- API.' + + + +fi + + + + + + + # Check whether --enable-os2 was given. +if test "${enable_os2+set}" = set; then : + enableval=$enable_os2; enable_os2=$enableval +else + enable_os2=no +fi + + case $enable_os2 in #( + no) : + use_os2="no (disabled, use --enable-os2 to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's OS/2 surface backend feature" >&5 +$as_echo_n "checking for cairo's OS/2 surface backend feature... " >&6; } + echo + + use_os2=yes + os2_BASE="cairo" +os2_REQUIRES="$ac_env_os2_REQUIRES_value" +os2_CFLAGS="$ac_env_os2_CFLAGS_value" +os2_NONPKGCONFIG_CFLAGS="$ac_env_os2_NONPKGCONFIG_CFLAGS_value" +os2_LIBS="$ac_env_os2_LIBS_value" +os2_NONPKGCONFIG_LIBS="$ac_env_os2_NONPKGCONFIG_LIBS_value" +os2_NONPKGCONFIG_EXTRA_LIBS="$ac_env_os2_NONPKGCONFIG_EXTRA_LIBS_value" + + + + case "$host" in + *-*-os2*) + : + ;; + *) + use_os2="no (requires an OS/2 platform)" + ;; + esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's OS/2 surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's OS/2 surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_os2" >&5 +$as_echo "$use_os2" >&6; } + + if test "x$enable_os2" = "xyes" -a "x$use_os2" != xyes; then : + as_fn_error $? " OS/2 surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-os2: \`$use_os2', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_os2" = "xyes"; then : + CAIRO_REQUIRES="$os2_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$os2_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$os2_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$os2_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$os2_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset os2_BASE +unset os2_REQUIRES +unset os2_CFLAGS +unset os2_NONPKGCONFIG_CFLAGS +unset os2_LIBS +unset os2_NONPKGCONFIG_LIBS +unset os2_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_os2" = xyes; then + CAIRO_HAS_OS2_SURFACE_TRUE= + CAIRO_HAS_OS2_SURFACE_FALSE='#' +else + CAIRO_HAS_OS2_SURFACE_TRUE='#' + CAIRO_HAS_OS2_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_OS2_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_os2_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_os2_headers) +all_cairo_private += $(cairo_os2_private) +all_cairo_cxx_sources += $(cairo_os2_cxx_sources) +all_cairo_sources += $(cairo_os2_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_os2_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_os2_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_os2_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_os2_headers) +enabled_cairo_private += $(cairo_os2_private) +enabled_cairo_cxx_sources += $(cairo_os2_cxx_sources) +enabled_cairo_sources += $(cairo_os2_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_OS2_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_OS2_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_os2_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_os2_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_os2_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_os2_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_OS2_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_OS2_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_os2" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-os2.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_os2" = xyes; then : + : + ac_config_files="$ac_config_files cairo-os2-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-os2.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-os2.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_OS2_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_OS2_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_os2" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_OS2_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_OS2_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_OS2_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_os2" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The OS/2 surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to OS/2 surface backend specific +--- API.' + + + +fi + + + + + + + # Check whether --enable-beos was given. +if test "${enable_beos+set}" = set; then : + enableval=$enable_beos; enable_beos=$enableval +else + enable_beos=no +fi + + case $enable_beos in #( + no) : + use_beos="no (disabled, use --enable-beos to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's BeOS/Zeta surface backend feature" >&5 +$as_echo_n "checking for cairo's BeOS/Zeta surface backend feature... " >&6; } + echo + + use_beos=yes + beos_BASE="cairo" +beos_REQUIRES="$ac_env_beos_REQUIRES_value" +beos_CFLAGS="$ac_env_beos_CFLAGS_value" +beos_NONPKGCONFIG_CFLAGS="$ac_env_beos_NONPKGCONFIG_CFLAGS_value" +beos_LIBS="$ac_env_beos_LIBS_value" +beos_NONPKGCONFIG_LIBS="$ac_env_beos_NONPKGCONFIG_LIBS_value" +beos_NONPKGCONFIG_EXTRA_LIBS="$ac_env_beos_NONPKGCONFIG_EXTRA_LIBS_value" + + + + case "$host" in + *-*-beos) + beos_LIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lbe" >&5 +$as_echo_n "checking for main in -lbe... " >&6; } +if ${ac_cv_lib_be_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbe $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_be_main=yes +else + ac_cv_lib_be_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_be_main" >&5 +$as_echo "$ac_cv_lib_be_main" >&6; } +if test "x$ac_cv_lib_be_main" = xyes; then : + beos_LIBS="$beos_LIBS -lbe" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lzeta" >&5 +$as_echo_n "checking for main in -lzeta... " >&6; } +if ${ac_cv_lib_zeta_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzeta $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_zeta_main=yes +else + ac_cv_lib_zeta_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zeta_main" >&5 +$as_echo "$ac_cv_lib_zeta_main" >&6; } +if test "x$ac_cv_lib_zeta_main" = xyes; then : + beos_LIBS="$beos_LIBS -lzeta" +fi + + ;; + *) + use_beos="no (requires a BeOS platform)" + ;; + esac + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's BeOS/Zeta surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's BeOS/Zeta surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_beos" >&5 +$as_echo "$use_beos" >&6; } + + if test "x$enable_beos" = "xyes" -a "x$use_beos" != xyes; then : + as_fn_error $? " BeOS/Zeta surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-beos: \`$use_beos', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_beos" = "xyes"; then : + CAIRO_REQUIRES="$beos_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$beos_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$beos_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$beos_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$beos_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset beos_BASE +unset beos_REQUIRES +unset beos_CFLAGS +unset beos_NONPKGCONFIG_CFLAGS +unset beos_LIBS +unset beos_NONPKGCONFIG_LIBS +unset beos_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_beos" = xyes; then + CAIRO_HAS_BEOS_SURFACE_TRUE= + CAIRO_HAS_BEOS_SURFACE_FALSE='#' +else + CAIRO_HAS_BEOS_SURFACE_TRUE='#' + CAIRO_HAS_BEOS_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_BEOS_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_beos_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_beos_headers) +all_cairo_private += $(cairo_beos_private) +all_cairo_cxx_sources += $(cairo_beos_cxx_sources) +all_cairo_sources += $(cairo_beos_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_beos_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_beos_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_beos_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_beos_headers) +enabled_cairo_private += $(cairo_beos_private) +enabled_cairo_cxx_sources += $(cairo_beos_cxx_sources) +enabled_cairo_sources += $(cairo_beos_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_BEOS_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_BEOS_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_beos_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_beos_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_beos_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_beos_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_BEOS_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_BEOS_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_beos" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-beos.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_beos" = xyes; then : + : + ac_config_files="$ac_config_files cairo-beos-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-beos.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-beos.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_BEOS_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_BEOS_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_beos" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_BEOS_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_BEOS_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_BEOS_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_beos" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The BeOS/Zeta surface backend feature is still under active development +--- and is included in this release only as a preview. It does NOT fully work +--- yet and incompatible changes may yet be made to BeOS/Zeta surface backend +--- specific API.' + + + +fi + + + + + + + # Check whether --enable-drm was given. +if test "${enable_drm+set}" = set; then : + enableval=$enable_drm; enable_drm=$enableval +else + enable_drm=no +fi + + case $enable_drm in #( + no) : + use_drm="no (disabled, use --enable-drm to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's DRM surface backend feature" >&5 +$as_echo_n "checking for cairo's DRM surface backend feature... " >&6; } + echo + + use_drm=yes + drm_BASE="cairo" +drm_REQUIRES="$ac_env_drm_REQUIRES_value" +drm_CFLAGS="$ac_env_drm_CFLAGS_value" +drm_NONPKGCONFIG_CFLAGS="$ac_env_drm_NONPKGCONFIG_CFLAGS_value" +drm_LIBS="$ac_env_drm_LIBS_value" +drm_NONPKGCONFIG_LIBS="$ac_env_drm_NONPKGCONFIG_LIBS_value" +drm_NONPKGCONFIG_EXTRA_LIBS="$ac_env_drm_NONPKGCONFIG_EXTRA_LIBS_value" + + + + drm_REQUIRES="libudev >= 136" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for drm" >&5 +$as_echo_n "checking for drm... " >&6; } + +if test -n "$drm_CFLAGS"; then + pkg_cv_drm_CFLAGS="$drm_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$drm_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$drm_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_drm_CFLAGS=`$PKG_CONFIG --cflags "$drm_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$drm_LIBS"; then + pkg_cv_drm_LIBS="$drm_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$drm_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$drm_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_drm_LIBS=`$PKG_CONFIG --libs "$drm_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + drm_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$drm_REQUIRES" 2>&1` + else + drm_PKG_ERRORS=`$PKG_CONFIG --print-errors "$drm_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$drm_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_drm="no (requires $drm_REQUIRES, udev is available from git://git.kernel.org/pub/scm/linux/hotplug/udev.git)" +elif test $pkg_failed = untried; then + use_drm="no (requires $drm_REQUIRES, udev is available from git://git.kernel.org/pub/scm/linux/hotplug/udev.git)" +else + drm_CFLAGS=$pkg_cv_drm_CFLAGS + drm_LIBS=$pkg_cv_drm_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's DRM surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's DRM surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_drm" >&5 +$as_echo "$use_drm" >&6; } + + if test "x$enable_drm" = "xyes" -a "x$use_drm" != xyes; then : + as_fn_error $? " DRM surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-drm: \`$use_drm', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_drm" = "xyes"; then : + CAIRO_REQUIRES="$drm_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$drm_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$drm_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$drm_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$drm_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset drm_BASE +unset drm_REQUIRES +unset drm_CFLAGS +unset drm_NONPKGCONFIG_CFLAGS +unset drm_LIBS +unset drm_NONPKGCONFIG_LIBS +unset drm_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_drm" = xyes; then + CAIRO_HAS_DRM_SURFACE_TRUE= + CAIRO_HAS_DRM_SURFACE_FALSE='#' +else + CAIRO_HAS_DRM_SURFACE_TRUE='#' + CAIRO_HAS_DRM_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_DRM_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_drm_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_drm_headers) +all_cairo_private += $(cairo_drm_private) +all_cairo_cxx_sources += $(cairo_drm_cxx_sources) +all_cairo_sources += $(cairo_drm_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_drm_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_drm_headers) +enabled_cairo_private += $(cairo_drm_private) +enabled_cairo_cxx_sources += $(cairo_drm_cxx_sources) +enabled_cairo_sources += $(cairo_drm_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_DRM_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_DRM_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_drm_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_drm_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_drm_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_drm_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_DRM_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_DRM_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_drm" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-drm.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_drm" = xyes; then : + : + ac_config_files="$ac_config_files cairo-drm-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-drm.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-drm.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_DRM_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_DRM_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_drm" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_DRM_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_DRM_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_DRM_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_drm" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The DRM surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to DRM surface backend specific +--- API.' + + + +fi + + + + + + # Check whether --enable-gallium was given. +if test "${enable_gallium+set}" = set; then : + enableval=$enable_gallium; enable_gallium=$enableval +else + enable_gallium=no +fi + + case $enable_gallium in #( + no) : + use_gallium="no (disabled, use --enable-gallium to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Gallium3D surface backend feature" >&5 +$as_echo_n "checking for cairo's Gallium3D surface backend feature... " >&6; } + echo + + use_gallium=yes + gallium_BASE="cairo" +gallium_REQUIRES="$ac_env_gallium_REQUIRES_value" +gallium_CFLAGS="$ac_env_gallium_CFLAGS_value" +gallium_NONPKGCONFIG_CFLAGS="$ac_env_gallium_NONPKGCONFIG_CFLAGS_value" +gallium_LIBS="$ac_env_gallium_LIBS_value" +gallium_NONPKGCONFIG_LIBS="$ac_env_gallium_NONPKGCONFIG_LIBS_value" +gallium_NONPKGCONFIG_EXTRA_LIBS="$ac_env_gallium_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$use_drm" = "xyes"; then + +# Check whether --with-gallium was given. +if test "${with_gallium+set}" = set; then : + withval=$with_gallium; mesa_DIR="$withval" +else + mesa_DIR="`pwd`/../mesa" +fi + + gallium_DIR="$mesa_DIR/src/gallium" + gallium_NONPKGCONFIG_CFLAGS="-I$mesa_DIR/include -I$mesa_DIR/src/mesa -I$gallium_DIR/include -I$gallium_DIR/auxiliary" + gallium_NONPKGCONFIG_LIBS="-lGL" + + + else + use_gallium="no (requires --enable-drm)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Gallium3D surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Gallium3D surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_gallium" >&5 +$as_echo "$use_gallium" >&6; } + + if test "x$enable_gallium" = "xyes" -a "x$use_gallium" != xyes; then : + as_fn_error $? " Gallium3D surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-gallium: \`$use_gallium', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_gallium" = "xyes"; then : + CAIRO_REQUIRES="$gallium_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$gallium_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$gallium_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$gallium_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$gallium_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset gallium_BASE +unset gallium_REQUIRES +unset gallium_CFLAGS +unset gallium_NONPKGCONFIG_CFLAGS +unset gallium_LIBS +unset gallium_NONPKGCONFIG_LIBS +unset gallium_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_gallium" = xyes; then + CAIRO_HAS_GALLIUM_SURFACE_TRUE= + CAIRO_HAS_GALLIUM_SURFACE_FALSE='#' +else + CAIRO_HAS_GALLIUM_SURFACE_TRUE='#' + CAIRO_HAS_GALLIUM_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_GALLIUM_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_gallium_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_gallium_headers) +all_cairo_private += $(cairo_gallium_private) +all_cairo_cxx_sources += $(cairo_gallium_cxx_sources) +all_cairo_sources += $(cairo_gallium_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gallium_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gallium_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_gallium_headers) +enabled_cairo_private += $(cairo_gallium_private) +enabled_cairo_cxx_sources += $(cairo_gallium_cxx_sources) +enabled_cairo_sources += $(cairo_gallium_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GALLIUM_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gallium_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gallium_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gallium_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gallium_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_GALLIUM_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_gallium" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-gallium.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_gallium" = xyes; then : + : + ac_config_files="$ac_config_files cairo-gallium-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-gallium.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-gallium.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GALLIUM_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_gallium" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_GALLIUM_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_GALLIUM_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_gallium" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The Gallium3D surface backend feature is still under active development +--- and is included in this release only as a preview. It does NOT fully work +--- yet and incompatible changes may yet be made to Gallium3D surface backend +--- specific API.' + + + +fi + + + + + + + # Check whether --enable-png was given. +if test "${enable_png+set}" = set; then : + enableval=$enable_png; enable_png=$enableval +else + enable_png=yes +fi + + case $enable_png in #( + no) : + use_png="no (disabled, use --enable-png to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's PNG functions feature" >&5 +$as_echo_n "checking for cairo's PNG functions feature... " >&6; } + echo + + use_png=yes + png_BASE="cairo" +png_REQUIRES="$ac_env_png_REQUIRES_value" +png_CFLAGS="$ac_env_png_CFLAGS_value" +png_NONPKGCONFIG_CFLAGS="$ac_env_png_NONPKGCONFIG_CFLAGS_value" +png_LIBS="$ac_env_png_LIBS_value" +png_NONPKGCONFIG_LIBS="$ac_env_png_NONPKGCONFIG_LIBS_value" +png_NONPKGCONFIG_EXTRA_LIBS="$ac_env_png_NONPKGCONFIG_EXTRA_LIBS_value" + + + + use_png=no + + if test "x$png_REQUIRES" = x; then + # libpng13 is GnuWin32's libpng-1.2.8 :-( + for l in libpng libpng14 libpng12 libpng13 libpng10; do + if $PKG_CONFIG --exists $l ; then + png_REQUIRES=$l + use_png=yes + break + fi + done + else + use_png=yes + fi + + if test "x$use_png" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for png" >&5 +$as_echo_n "checking for png... " >&6; } + +if test -n "$png_CFLAGS"; then + pkg_cv_png_CFLAGS="$png_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$png_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$png_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_png_CFLAGS=`$PKG_CONFIG --cflags "$png_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$png_LIBS"; then + pkg_cv_png_LIBS="$png_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$png_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$png_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_png_LIBS=`$PKG_CONFIG --libs "$png_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + png_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$png_REQUIRES" 2>&1` + else + png_PKG_ERRORS=`$PKG_CONFIG --print-errors "$png_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$png_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + : +elif test $pkg_failed = untried; then + : +else + png_CFLAGS=$pkg_cv_png_CFLAGS + png_LIBS=$pkg_cv_png_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find libpng in the pkg-config search path" >&5 +$as_echo "$as_me: WARNING: Could not find libpng in the pkg-config search path" >&2;} + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's PNG functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's PNG functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_png" >&5 +$as_echo "$use_png" >&6; } + + if test "x$enable_png" = "xyes" -a "x$use_png" != xyes; then : + as_fn_error $? "recommended PNG functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-png: \`$use_png', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_png" = "xyes"; then : + CAIRO_REQUIRES="$png_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$png_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$png_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$png_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$png_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset png_BASE +unset png_REQUIRES +unset png_CFLAGS +unset png_NONPKGCONFIG_CFLAGS +unset png_LIBS +unset png_NONPKGCONFIG_LIBS +unset png_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_png" = xyes; then + CAIRO_HAS_PNG_FUNCTIONS_TRUE= + CAIRO_HAS_PNG_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_PNG_FUNCTIONS_TRUE='#' + CAIRO_HAS_PNG_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_PNG_FUNCTIONS=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_png_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_png_headers) +all_cairo_private += $(cairo_png_private) +all_cairo_cxx_sources += $(cairo_png_cxx_sources) +all_cairo_sources += $(cairo_png_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_png_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_png_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_png_headers) +enabled_cairo_private += $(cairo_png_private) +enabled_cairo_cxx_sources += $(cairo_png_cxx_sources) +enabled_cairo_sources += $(cairo_png_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PNG_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_png_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_png_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_png_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_PNG_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_png" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-png.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_png" = xyes; then : + : + ac_config_files="$ac_config_files cairo-png-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-png.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-png.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PNG_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_png" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_PNG_FUNCTIONS' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_PNG_FUNCTIONS' + + + + if test "x$use_png" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_PNG_FUNCTIONS' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_PNG_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + if test "x$use_png" != xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'+++ It is strongly recommended that you do NOT disable the PNG functions ++++ feature.' + + + +fi + + + + + # Check whether --enable-gl was given. +if test "${enable_gl+set}" = set; then : + enableval=$enable_gl; enable_gl=$enableval +else + enable_gl=no +fi + + case $enable_gl in #( + no) : + use_gl="no (disabled, use --enable-gl to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's OpenGL surface backend feature" >&5 +$as_echo_n "checking for cairo's OpenGL surface backend feature... " >&6; } + echo + + use_gl=yes + gl_BASE="cairo" +gl_REQUIRES="$ac_env_gl_REQUIRES_value" +gl_CFLAGS="$ac_env_gl_CFLAGS_value" +gl_NONPKGCONFIG_CFLAGS="$ac_env_gl_NONPKGCONFIG_CFLAGS_value" +gl_LIBS="$ac_env_gl_LIBS_value" +gl_NONPKGCONFIG_LIBS="$ac_env_gl_NONPKGCONFIG_LIBS_value" +gl_NONPKGCONFIG_EXTRA_LIBS="$ac_env_gl_NONPKGCONFIG_EXTRA_LIBS_value" + + + + gl_REQUIRES="gl" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gl" >&5 +$as_echo_n "checking for gl... " >&6; } + +if test -n "$gl_CFLAGS"; then + pkg_cv_gl_CFLAGS="$gl_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gl_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gl_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_gl_CFLAGS=`$PKG_CONFIG --cflags "$gl_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$gl_LIBS"; then + pkg_cv_gl_LIBS="$gl_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gl_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gl_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_gl_LIBS=`$PKG_CONFIG --libs "$gl_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + gl_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$gl_REQUIRES" 2>&1` + else + gl_PKG_ERRORS=`$PKG_CONFIG --print-errors "$gl_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$gl_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = xyes; then : + +else + use_gl="no (gl.pc nor OpenGL headers not found)" +fi + + + if test "x$use_gl" = "xyes"; then + gl_NONPKGCONFIG_CFLAGS= + gl_NONPKGCONFIG_LIBS="-lGL" + fi +elif test $pkg_failed = untried; then + + ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = xyes; then : + +else + use_gl="no (gl.pc nor OpenGL headers not found)" +fi + + + if test "x$use_gl" = "xyes"; then + gl_NONPKGCONFIG_CFLAGS= + gl_NONPKGCONFIG_LIBS="-lGL" + fi +else + gl_CFLAGS=$pkg_cv_gl_CFLAGS + gl_LIBS=$pkg_cv_gl_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + if test "x$have_dl" = "xyes" -a "x$have_dlsym" = "xyes"; then + gl_LIBS="$gl_LIBS -ldl" + fi + + need_glx_functions=yes + need_wgl_functions=yes + need_egl_functions=yes + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's OpenGL surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's OpenGL surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_gl" >&5 +$as_echo "$use_gl" >&6; } + + if test "x$enable_gl" = "xyes" -a "x$use_gl" != xyes; then : + as_fn_error $? " OpenGL surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-gl: \`$use_gl', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_gl" = "xyes"; then : + CAIRO_REQUIRES="$gl_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$gl_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$gl_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$gl_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$gl_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset gl_BASE +unset gl_REQUIRES +unset gl_CFLAGS +unset gl_NONPKGCONFIG_CFLAGS +unset gl_LIBS +unset gl_NONPKGCONFIG_LIBS +unset gl_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_gl" = xyes; then + CAIRO_HAS_GL_SURFACE_TRUE= + CAIRO_HAS_GL_SURFACE_FALSE='#' +else + CAIRO_HAS_GL_SURFACE_TRUE='#' + CAIRO_HAS_GL_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_GL_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_gl_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_gl_headers) +all_cairo_private += $(cairo_gl_private) +all_cairo_cxx_sources += $(cairo_gl_cxx_sources) +all_cairo_sources += $(cairo_gl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_gl_headers) +enabled_cairo_private += $(cairo_gl_private) +enabled_cairo_cxx_sources += $(cairo_gl_cxx_sources) +enabled_cairo_sources += $(cairo_gl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GL_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GL_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_GL_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_GL_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_gl" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-gl.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_gl" = xyes; then : + : + ac_config_files="$ac_config_files cairo-gl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-gl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-gl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GL_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GL_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_gl" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_GL_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_GL_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_GL_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_gl" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The OpenGL surface backend feature is still under active development and +--- is included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to OpenGL surface backend +--- specific API.' + + + +fi + + + + + + # Check whether --enable-glesv2 was given. +if test "${enable_glesv2+set}" = set; then : + enableval=$enable_glesv2; enable_glesv2=$enableval +else + enable_glesv2=no +fi + + case $enable_glesv2 in #( + no) : + use_glesv2="no (disabled, use --enable-glesv2 to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's OpenGLESv2 surface backend feature" >&5 +$as_echo_n "checking for cairo's OpenGLESv2 surface backend feature... " >&6; } + echo + + use_glesv2=yes + glesv2_BASE="cairo" +glesv2_REQUIRES="$ac_env_glesv2_REQUIRES_value" +glesv2_CFLAGS="$ac_env_glesv2_CFLAGS_value" +glesv2_NONPKGCONFIG_CFLAGS="$ac_env_glesv2_NONPKGCONFIG_CFLAGS_value" +glesv2_LIBS="$ac_env_glesv2_LIBS_value" +glesv2_NONPKGCONFIG_LIBS="$ac_env_glesv2_NONPKGCONFIG_LIBS_value" +glesv2_NONPKGCONFIG_EXTRA_LIBS="$ac_env_glesv2_NONPKGCONFIG_EXTRA_LIBS_value" + + + + glesv2_REQUIRES="glesv2" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glesv2" >&5 +$as_echo_n "checking for glesv2... " >&6; } + +if test -n "$glesv2_CFLAGS"; then + pkg_cv_glesv2_CFLAGS="$glesv2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$glesv2_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$glesv2_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_glesv2_CFLAGS=`$PKG_CONFIG --cflags "$glesv2_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$glesv2_LIBS"; then + pkg_cv_glesv2_LIBS="$glesv2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$glesv2_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$glesv2_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_glesv2_LIBS=`$PKG_CONFIG --libs "$glesv2_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + glesv2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$glesv2_REQUIRES" 2>&1` + else + glesv2_PKG_ERRORS=`$PKG_CONFIG --print-errors "$glesv2_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$glesv2_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + ac_fn_c_check_header_mongrel "$LINENO" "GLES2/gl2.h" "ac_cv_header_GLES2_gl2_h" "$ac_includes_default" +if test "x$ac_cv_header_GLES2_gl2_h" = xyes; then : + +else + use_glesv2="no (glesv2.pc nor OpenGL ES 2.0 headers not found)" +fi + + + if test "x$use_glesv2" = "xyes"; then + glesv2_NONPKGCONFIG_CFLAGS= + glesv2_NONPKGCONFIG_LIBS="-lGLESv2" + fi +elif test $pkg_failed = untried; then + + ac_fn_c_check_header_mongrel "$LINENO" "GLES2/gl2.h" "ac_cv_header_GLES2_gl2_h" "$ac_includes_default" +if test "x$ac_cv_header_GLES2_gl2_h" = xyes; then : + +else + use_glesv2="no (glesv2.pc nor OpenGL ES 2.0 headers not found)" +fi + + + if test "x$use_glesv2" = "xyes"; then + glesv2_NONPKGCONFIG_CFLAGS= + glesv2_NONPKGCONFIG_LIBS="-lGLESv2" + fi +else + glesv2_CFLAGS=$pkg_cv_glesv2_CFLAGS + glesv2_LIBS=$pkg_cv_glesv2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + if test "x$have_dl" = "xyes" -a "x$have_dlsym" = "xyes"; then + glesv2_LIBS="$glesv2_LIBS -ldl" + fi + + if test "x$use_glesv2" = "xyes" -a "x$use_gl" = "xyes"; then + as_fn_error $? "use either --enable-gl=yes or --enable-glesv2=yes. Not both at the same time." "$LINENO" 5 + fi + + need_egl_functions=yes + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's OpenGLESv2 surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's OpenGLESv2 surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_glesv2" >&5 +$as_echo "$use_glesv2" >&6; } + + if test "x$enable_glesv2" = "xyes" -a "x$use_glesv2" != xyes; then : + as_fn_error $? " OpenGLESv2 surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-glesv2: \`$use_glesv2', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_glesv2" = "xyes"; then : + CAIRO_REQUIRES="$glesv2_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$glesv2_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$glesv2_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$glesv2_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$glesv2_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset glesv2_BASE +unset glesv2_REQUIRES +unset glesv2_CFLAGS +unset glesv2_NONPKGCONFIG_CFLAGS +unset glesv2_LIBS +unset glesv2_NONPKGCONFIG_LIBS +unset glesv2_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_glesv2" = xyes; then + CAIRO_HAS_GLESV2_SURFACE_TRUE= + CAIRO_HAS_GLESV2_SURFACE_FALSE='#' +else + CAIRO_HAS_GLESV2_SURFACE_TRUE='#' + CAIRO_HAS_GLESV2_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_GLESV2_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_glesv2_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_glesv2_headers) +all_cairo_private += $(cairo_glesv2_private) +all_cairo_cxx_sources += $(cairo_glesv2_cxx_sources) +all_cairo_sources += $(cairo_glesv2_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_glesv2_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glesv2_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_glesv2_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_glesv2_headers) +enabled_cairo_private += $(cairo_glesv2_private) +enabled_cairo_cxx_sources += $(cairo_glesv2_cxx_sources) +enabled_cairo_sources += $(cairo_glesv2_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GLESV2_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_glesv2_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_glesv2_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glesv2_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_glesv2_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_GLESV2_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_glesv2" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-glesv2.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_glesv2" = xyes; then : + : + ac_config_files="$ac_config_files cairo-glesv2-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-glesv2.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-glesv2.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GLESV2_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_glesv2" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_GLESV2_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_GLESV2_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_glesv2" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The OpenGLESv2 surface backend feature is still under active development +--- and is included in this release only as a preview. It does NOT fully work +--- yet and incompatible changes may yet be made to OpenGLESv2 surface +--- backend specific API.' + + + +fi + + + + + + # Check whether --enable-cogl was given. +if test "${enable_cogl+set}" = set; then : + enableval=$enable_cogl; enable_cogl=$enableval +else + enable_cogl=no +fi + + case $enable_cogl in #( + no) : + use_cogl="no (disabled, use --enable-cogl to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Cogl surface backend feature" >&5 +$as_echo_n "checking for cairo's Cogl surface backend feature... " >&6; } + echo + + use_cogl=yes + cogl_BASE="cairo" +cogl_REQUIRES="$ac_env_cogl_REQUIRES_value" +cogl_CFLAGS="$ac_env_cogl_CFLAGS_value" +cogl_NONPKGCONFIG_CFLAGS="$ac_env_cogl_NONPKGCONFIG_CFLAGS_value" +cogl_LIBS="$ac_env_cogl_LIBS_value" +cogl_NONPKGCONFIG_LIBS="$ac_env_cogl_NONPKGCONFIG_LIBS_value" +cogl_NONPKGCONFIG_EXTRA_LIBS="$ac_env_cogl_NONPKGCONFIG_EXTRA_LIBS_value" + + + + cogl_REQUIRES="cogl-2.0-experimental" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cogl" >&5 +$as_echo_n "checking for cogl... " >&6; } + +if test -n "$cogl_CFLAGS"; then + pkg_cv_cogl_CFLAGS="$cogl_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$cogl_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$cogl_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_cogl_CFLAGS=`$PKG_CONFIG --cflags "$cogl_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$cogl_LIBS"; then + pkg_cv_cogl_LIBS="$cogl_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$cogl_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$cogl_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_cogl_LIBS=`$PKG_CONFIG --libs "$cogl_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + cogl_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$cogl_REQUIRES" 2>&1` + else + cogl_PKG_ERRORS=`$PKG_CONFIG --print-errors "$cogl_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$cogl_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_cogl="no" +elif test $pkg_failed = untried; then + use_cogl="no" +else + cogl_CFLAGS=$pkg_cv_cogl_CFLAGS + cogl_LIBS=$pkg_cv_cogl_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Cogl surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Cogl surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_cogl" >&5 +$as_echo "$use_cogl" >&6; } + + if test "x$enable_cogl" = "xyes" -a "x$use_cogl" != xyes; then : + as_fn_error $? " Cogl surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-cogl: \`$use_cogl', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_cogl" = "xyes"; then : + CAIRO_REQUIRES="$cogl_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$cogl_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$cogl_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$cogl_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$cogl_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset cogl_BASE +unset cogl_REQUIRES +unset cogl_CFLAGS +unset cogl_NONPKGCONFIG_CFLAGS +unset cogl_LIBS +unset cogl_NONPKGCONFIG_LIBS +unset cogl_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_cogl" = xyes; then + CAIRO_HAS_COGL_SURFACE_TRUE= + CAIRO_HAS_COGL_SURFACE_FALSE='#' +else + CAIRO_HAS_COGL_SURFACE_TRUE='#' + CAIRO_HAS_COGL_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_COGL_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_cogl_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_cogl_headers) +all_cairo_private += $(cairo_cogl_private) +all_cairo_cxx_sources += $(cairo_cogl_cxx_sources) +all_cairo_sources += $(cairo_cogl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_cogl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_cogl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_cogl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_cogl_headers) +enabled_cairo_private += $(cairo_cogl_private) +enabled_cairo_cxx_sources += $(cairo_cogl_cxx_sources) +enabled_cairo_sources += $(cairo_cogl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_COGL_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_COGL_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_cogl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_cogl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_cogl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_cogl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_COGL_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_COGL_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_cogl" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-cogl.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_cogl" = xyes; then : + : + ac_config_files="$ac_config_files cairo-cogl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-cogl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-cogl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_COGL_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_COGL_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_cogl" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_COGL_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_COGL_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_COGL_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_cogl" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The Cogl surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to Cogl surface backend specific +--- API.' + + + +fi + + + + + + + # Check whether --enable-directfb was given. +if test "${enable_directfb+set}" = set; then : + enableval=$enable_directfb; enable_directfb=$enableval +else + enable_directfb=no +fi + + case $enable_directfb in #( + no) : + use_directfb="no (disabled, use --enable-directfb to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's directfb surface backend feature" >&5 +$as_echo_n "checking for cairo's directfb surface backend feature... " >&6; } + echo + + use_directfb=yes + directfb_BASE="cairo" +directfb_REQUIRES="$ac_env_directfb_REQUIRES_value" +directfb_CFLAGS="$ac_env_directfb_CFLAGS_value" +directfb_NONPKGCONFIG_CFLAGS="$ac_env_directfb_NONPKGCONFIG_CFLAGS_value" +directfb_LIBS="$ac_env_directfb_LIBS_value" +directfb_NONPKGCONFIG_LIBS="$ac_env_directfb_NONPKGCONFIG_LIBS_value" +directfb_NONPKGCONFIG_EXTRA_LIBS="$ac_env_directfb_NONPKGCONFIG_EXTRA_LIBS_value" + + + + directfb_REQUIRES=directfb + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for directfb" >&5 +$as_echo_n "checking for directfb... " >&6; } + +if test -n "$directfb_CFLAGS"; then + pkg_cv_directfb_CFLAGS="$directfb_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$directfb_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$directfb_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_directfb_CFLAGS=`$PKG_CONFIG --cflags "$directfb_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$directfb_LIBS"; then + pkg_cv_directfb_LIBS="$directfb_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$directfb_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$directfb_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_directfb_LIBS=`$PKG_CONFIG --libs "$directfb_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + directfb_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$directfb_REQUIRES" 2>&1` + else + directfb_PKG_ERRORS=`$PKG_CONFIG --print-errors "$directfb_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$directfb_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_directfb="no (requires $directfb_REQUIRES http://www.directfb.org)" +elif test $pkg_failed = untried; then + use_directfb="no (requires $directfb_REQUIRES http://www.directfb.org)" +else + directfb_CFLAGS=$pkg_cv_directfb_CFLAGS + directfb_LIBS=$pkg_cv_directfb_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's directfb surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's directfb surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_directfb" >&5 +$as_echo "$use_directfb" >&6; } + + if test "x$enable_directfb" = "xyes" -a "x$use_directfb" != xyes; then : + as_fn_error $? " directfb surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-directfb: \`$use_directfb', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_directfb" = "xyes"; then : + CAIRO_REQUIRES="$directfb_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$directfb_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$directfb_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$directfb_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$directfb_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset directfb_BASE +unset directfb_REQUIRES +unset directfb_CFLAGS +unset directfb_NONPKGCONFIG_CFLAGS +unset directfb_LIBS +unset directfb_NONPKGCONFIG_LIBS +unset directfb_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_directfb" = xyes; then + CAIRO_HAS_DIRECTFB_SURFACE_TRUE= + CAIRO_HAS_DIRECTFB_SURFACE_FALSE='#' +else + CAIRO_HAS_DIRECTFB_SURFACE_TRUE='#' + CAIRO_HAS_DIRECTFB_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_DIRECTFB_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_directfb_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_directfb_headers) +all_cairo_private += $(cairo_directfb_private) +all_cairo_cxx_sources += $(cairo_directfb_cxx_sources) +all_cairo_sources += $(cairo_directfb_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_directfb_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_directfb_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_directfb_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_directfb_headers) +enabled_cairo_private += $(cairo_directfb_private) +enabled_cairo_cxx_sources += $(cairo_directfb_cxx_sources) +enabled_cairo_sources += $(cairo_directfb_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_DIRECTFB_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_directfb_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_directfb_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_directfb_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_directfb_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_DIRECTFB_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_directfb" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-directfb.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_directfb" = xyes; then : + : + ac_config_files="$ac_config_files cairo-directfb-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-directfb.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-directfb.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_DIRECTFB_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_directfb" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_DIRECTFB_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_DIRECTFB_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_directfb" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The directfb surface backend feature is still under active development +--- and is included in this release only as a preview. It does NOT fully work +--- yet and incompatible changes may yet be made to directfb surface backend +--- specific API.' + + + +fi + + + + + + + # Check whether --enable-vg was given. +if test "${enable_vg+set}" = set; then : + enableval=$enable_vg; enable_vg=$enableval +else + enable_vg=no +fi + + case $enable_vg in #( + no) : + use_vg="no (disabled, use --enable-vg to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's OpenVG surface backend feature" >&5 +$as_echo_n "checking for cairo's OpenVG surface backend feature... " >&6; } + echo + + use_vg=yes + vg_BASE="cairo" +vg_REQUIRES="$ac_env_vg_REQUIRES_value" +vg_CFLAGS="$ac_env_vg_CFLAGS_value" +vg_NONPKGCONFIG_CFLAGS="$ac_env_vg_NONPKGCONFIG_CFLAGS_value" +vg_LIBS="$ac_env_vg_LIBS_value" +vg_NONPKGCONFIG_LIBS="$ac_env_vg_NONPKGCONFIG_LIBS_value" +vg_NONPKGCONFIG_EXTRA_LIBS="$ac_env_vg_NONPKGCONFIG_EXTRA_LIBS_value" + + + + ac_fn_c_check_header_mongrel "$LINENO" "VG/openvg.h" "ac_cv_header_VG_openvg_h" "$ac_includes_default" +if test "x$ac_cv_header_VG_openvg_h" = xyes; then : + +else + use_vg="no (OpenVG headers not found)" +fi + + + if test "x$use_vg" = "xyes"; then + vg_NONPKGCONFIG_CFLAGS= + vg_NONPKGCONFIG_LIBS="-lOpenVG" + need_egl_functions=yes + need_glx_functions=yes + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's OpenVG surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's OpenVG surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_vg" >&5 +$as_echo "$use_vg" >&6; } + + if test "x$enable_vg" = "xyes" -a "x$use_vg" != xyes; then : + as_fn_error $? " OpenVG surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-vg: \`$use_vg', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_vg" = "xyes"; then : + CAIRO_REQUIRES="$vg_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$vg_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$vg_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$vg_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$vg_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset vg_BASE +unset vg_REQUIRES +unset vg_CFLAGS +unset vg_NONPKGCONFIG_CFLAGS +unset vg_LIBS +unset vg_NONPKGCONFIG_LIBS +unset vg_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_vg" = xyes; then + CAIRO_HAS_VG_SURFACE_TRUE= + CAIRO_HAS_VG_SURFACE_FALSE='#' +else + CAIRO_HAS_VG_SURFACE_TRUE='#' + CAIRO_HAS_VG_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_VG_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_vg_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_vg_headers) +all_cairo_private += $(cairo_vg_private) +all_cairo_cxx_sources += $(cairo_vg_cxx_sources) +all_cairo_sources += $(cairo_vg_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_vg_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_vg_headers) +enabled_cairo_private += $(cairo_vg_private) +enabled_cairo_cxx_sources += $(cairo_vg_cxx_sources) +enabled_cairo_sources += $(cairo_vg_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_VG_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_VG_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_vg_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_vg_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_VG_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_VG_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_vg" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-vg.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_vg" = xyes; then : + : + ac_config_files="$ac_config_files cairo-vg-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-vg.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-vg.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_VG_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_VG_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_vg" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_VG_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_VG_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_VG_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_vg" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The OpenVG surface backend feature is still under active development and +--- is included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to OpenVG surface backend +--- specific API.' + + + +fi + + + + + + # Check whether --enable-egl was given. +if test "${enable_egl+set}" = set; then : + enableval=$enable_egl; enable_egl=$enableval +else + enable_egl=auto +fi + + case $enable_egl in #( + no) : + use_egl="no (disabled, use --enable-egl to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's EGL functions feature" >&5 +$as_echo_n "checking for cairo's EGL functions feature... " >&6; } + echo + + use_egl=yes + egl_BASE="cairo" +egl_REQUIRES="$ac_env_egl_REQUIRES_value" +egl_CFLAGS="$ac_env_egl_CFLAGS_value" +egl_NONPKGCONFIG_CFLAGS="$ac_env_egl_NONPKGCONFIG_CFLAGS_value" +egl_LIBS="$ac_env_egl_LIBS_value" +egl_NONPKGCONFIG_LIBS="$ac_env_egl_NONPKGCONFIG_LIBS_value" +egl_NONPKGCONFIG_EXTRA_LIBS="$ac_env_egl_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$need_egl_functions" = "xyes"; then + egl_REQUIRES="egl" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egl" >&5 +$as_echo_n "checking for egl... " >&6; } + +if test -n "$egl_CFLAGS"; then + pkg_cv_egl_CFLAGS="$egl_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$egl_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$egl_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_egl_CFLAGS=`$PKG_CONFIG --cflags "$egl_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$egl_LIBS"; then + pkg_cv_egl_LIBS="$egl_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$egl_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$egl_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_egl_LIBS=`$PKG_CONFIG --libs "$egl_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + egl_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$egl_REQUIRES" 2>&1` + else + egl_PKG_ERRORS=`$PKG_CONFIG --print-errors "$egl_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$egl_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + egl_REQUIRES="" + ac_fn_c_check_header_mongrel "$LINENO" "EGL/egl.h" "ac_cv_header_EGL_egl_h" "$ac_includes_default" +if test "x$ac_cv_header_EGL_egl_h" = xyes; then : + +else + use_egl="no (EGL headers not found)" +fi + + + if test "x$use_egl" = "xyes"; then + egl_NONPKGCONFIG_CFLAGS= + egl_NONPKGCONFIG_LIBS= + save_LIBS="$LIBS" + other_egl_LIBS="" + # Temporary workaround for missing link from egl13 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for csi_stream_attachresource in -lcsi" >&5 +$as_echo_n "checking for csi_stream_attachresource in -lcsi... " >&6; } +if ${ac_cv_lib_csi_csi_stream_attachresource+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcsi $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char csi_stream_attachresource (); +int +main () +{ +return csi_stream_attachresource (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_csi_csi_stream_attachresource=yes +else + ac_cv_lib_csi_csi_stream_attachresource=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_csi_csi_stream_attachresource" >&5 +$as_echo "$ac_cv_lib_csi_csi_stream_attachresource" >&6; } +if test "x$ac_cv_lib_csi_csi_stream_attachresource" = xyes; then : + other_egl_LIBS="-lcsi" +fi + + LIBS="$other_egl_LIBS $LIBS" + for egl_lib in EGL egl13 egl12 egl11; do + if test -z "$egl_NONPKGCONFIG_LIBS"; then + as_ac_Lib=`$as_echo "ac_cv_lib_$egl_lib''_eglGetError" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglGetError in -l$egl_lib" >&5 +$as_echo_n "checking for eglGetError in -l$egl_lib... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$egl_lib $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char eglGetError (); +int +main () +{ +return eglGetError (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + egl_NONPKGCONFIG_LIBS="-l$egl_lib" +fi + + fi + done + if test -z "$egl_NONPKGCONFIG_LIBS"; then + use_egl="no (EGL library not found)" + else + egl_NONPKGCONFIG_LIBS="$egl_NONPKGCONFIG_LIBS $other_egl_LIBS" + fi + LIBS="$save_LIBS" + fi + +elif test $pkg_failed = untried; then + egl_REQUIRES="" + ac_fn_c_check_header_mongrel "$LINENO" "EGL/egl.h" "ac_cv_header_EGL_egl_h" "$ac_includes_default" +if test "x$ac_cv_header_EGL_egl_h" = xyes; then : + +else + use_egl="no (EGL headers not found)" +fi + + + if test "x$use_egl" = "xyes"; then + egl_NONPKGCONFIG_CFLAGS= + egl_NONPKGCONFIG_LIBS= + save_LIBS="$LIBS" + other_egl_LIBS="" + # Temporary workaround for missing link from egl13 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for csi_stream_attachresource in -lcsi" >&5 +$as_echo_n "checking for csi_stream_attachresource in -lcsi... " >&6; } +if ${ac_cv_lib_csi_csi_stream_attachresource+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcsi $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char csi_stream_attachresource (); +int +main () +{ +return csi_stream_attachresource (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_csi_csi_stream_attachresource=yes +else + ac_cv_lib_csi_csi_stream_attachresource=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_csi_csi_stream_attachresource" >&5 +$as_echo "$ac_cv_lib_csi_csi_stream_attachresource" >&6; } +if test "x$ac_cv_lib_csi_csi_stream_attachresource" = xyes; then : + other_egl_LIBS="-lcsi" +fi + + LIBS="$other_egl_LIBS $LIBS" + for egl_lib in EGL egl13 egl12 egl11; do + if test -z "$egl_NONPKGCONFIG_LIBS"; then + as_ac_Lib=`$as_echo "ac_cv_lib_$egl_lib''_eglGetError" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglGetError in -l$egl_lib" >&5 +$as_echo_n "checking for eglGetError in -l$egl_lib... " >&6; } +if eval \${$as_ac_Lib+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$egl_lib $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char eglGetError (); +int +main () +{ +return eglGetError (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_ac_Lib=yes" +else + eval "$as_ac_Lib=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +eval ac_res=\$$as_ac_Lib + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : + egl_NONPKGCONFIG_LIBS="-l$egl_lib" +fi + + fi + done + if test -z "$egl_NONPKGCONFIG_LIBS"; then + use_egl="no (EGL library not found)" + else + egl_NONPKGCONFIG_LIBS="$egl_NONPKGCONFIG_LIBS $other_egl_LIBS" + fi + LIBS="$save_LIBS" + fi + +else + egl_CFLAGS=$pkg_cv_egl_CFLAGS + egl_LIBS=$pkg_cv_egl_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + else + use_egl="no (not required by any backend)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's EGL functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's EGL functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_egl" >&5 +$as_echo "$use_egl" >&6; } + + if test "x$enable_egl" = "xyes" -a "x$use_egl" != xyes; then : + as_fn_error $? " EGL functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-egl: \`$use_egl', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_egl" = "xyes"; then : + CAIRO_REQUIRES="$egl_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$egl_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$egl_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$egl_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$egl_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset egl_BASE +unset egl_REQUIRES +unset egl_CFLAGS +unset egl_NONPKGCONFIG_CFLAGS +unset egl_LIBS +unset egl_NONPKGCONFIG_LIBS +unset egl_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_egl" = xyes; then + CAIRO_HAS_EGL_FUNCTIONS_TRUE= + CAIRO_HAS_EGL_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_EGL_FUNCTIONS_TRUE='#' + CAIRO_HAS_EGL_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_EGL_FUNCTIONS=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_egl_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_egl_headers) +all_cairo_private += $(cairo_egl_private) +all_cairo_cxx_sources += $(cairo_egl_cxx_sources) +all_cairo_sources += $(cairo_egl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_egl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_egl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_egl_headers) +enabled_cairo_private += $(cairo_egl_private) +enabled_cairo_cxx_sources += $(cairo_egl_cxx_sources) +enabled_cairo_sources += $(cairo_egl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_EGL_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_egl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_egl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_EGL_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_egl" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-egl.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_egl" = xyes; then : + : + ac_config_files="$ac_config_files cairo-egl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-egl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-egl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_EGL_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_egl" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_EGL_FUNCTIONS' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_EGL_FUNCTIONS' + + + + if test "x$use_egl" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_EGL_FUNCTIONS' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_EGL_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + # Check whether --enable-glx was given. +if test "${enable_glx+set}" = set; then : + enableval=$enable_glx; enable_glx=$enableval +else + enable_glx=auto +fi + + case $enable_glx in #( + no) : + use_glx="no (disabled, use --enable-glx to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's GLX functions feature" >&5 +$as_echo_n "checking for cairo's GLX functions feature... " >&6; } + echo + + use_glx=yes + glx_BASE="cairo" +glx_REQUIRES="$ac_env_glx_REQUIRES_value" +glx_CFLAGS="$ac_env_glx_CFLAGS_value" +glx_NONPKGCONFIG_CFLAGS="$ac_env_glx_NONPKGCONFIG_CFLAGS_value" +glx_LIBS="$ac_env_glx_LIBS_value" +glx_NONPKGCONFIG_LIBS="$ac_env_glx_NONPKGCONFIG_LIBS_value" +glx_NONPKGCONFIG_EXTRA_LIBS="$ac_env_glx_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$need_glx_functions" = "xyes"; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $gl_CFLAGS $gl_NONPKGCONFIG_CFLAGS" + ac_fn_c_check_header_mongrel "$LINENO" "GL/glx.h" "ac_cv_header_GL_glx_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glx_h" = xyes; then : + +else + use_glx="no (GLX headers not found)" +fi + + + glx_NONPKGCONFIG_CFLAGS= + glx_NONPKGCONFIG_LIBS="-lGL" + CFLAGS="$save_CFLAGS" + else + use_glx="no (not required by any backend)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's GLX functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's GLX functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_glx" >&5 +$as_echo "$use_glx" >&6; } + + if test "x$enable_glx" = "xyes" -a "x$use_glx" != xyes; then : + as_fn_error $? " GLX functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-glx: \`$use_glx', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_glx" = "xyes"; then : + CAIRO_REQUIRES="$glx_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$glx_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$glx_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$glx_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$glx_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset glx_BASE +unset glx_REQUIRES +unset glx_CFLAGS +unset glx_NONPKGCONFIG_CFLAGS +unset glx_LIBS +unset glx_NONPKGCONFIG_LIBS +unset glx_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_glx" = xyes; then + CAIRO_HAS_GLX_FUNCTIONS_TRUE= + CAIRO_HAS_GLX_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_GLX_FUNCTIONS_TRUE='#' + CAIRO_HAS_GLX_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_GLX_FUNCTIONS=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_glx_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_glx_headers) +all_cairo_private += $(cairo_glx_private) +all_cairo_cxx_sources += $(cairo_glx_cxx_sources) +all_cairo_sources += $(cairo_glx_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_glx_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glx_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_glx_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_glx_headers) +enabled_cairo_private += $(cairo_glx_private) +enabled_cairo_cxx_sources += $(cairo_glx_cxx_sources) +enabled_cairo_sources += $(cairo_glx_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GLX_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_glx_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_glx_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_glx_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_glx_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_GLX_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_glx" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-glx.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_glx" = xyes; then : + : + ac_config_files="$ac_config_files cairo-glx-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-glx.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-glx.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GLX_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_glx" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_GLX_FUNCTIONS' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_GLX_FUNCTIONS' + + + + if test "x$use_glx" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_GLX_FUNCTIONS' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_GLX_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + # Check whether --enable-wgl was given. +if test "${enable_wgl+set}" = set; then : + enableval=$enable_wgl; enable_wgl=$enableval +else + enable_wgl=auto +fi + + case $enable_wgl in #( + no) : + use_wgl="no (disabled, use --enable-wgl to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's WGL functions feature" >&5 +$as_echo_n "checking for cairo's WGL functions feature... " >&6; } + echo + + use_wgl=yes + wgl_BASE="cairo" +wgl_REQUIRES="$ac_env_wgl_REQUIRES_value" +wgl_CFLAGS="$ac_env_wgl_CFLAGS_value" +wgl_NONPKGCONFIG_CFLAGS="$ac_env_wgl_NONPKGCONFIG_CFLAGS_value" +wgl_LIBS="$ac_env_wgl_LIBS_value" +wgl_NONPKGCONFIG_LIBS="$ac_env_wgl_NONPKGCONFIG_LIBS_value" +wgl_NONPKGCONFIG_EXTRA_LIBS="$ac_env_wgl_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$need_wgl_functions" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes; then : + +else + use_wgl="no (WGL headers not found)" +fi + + + else + use_wgl="no (not required by any backend)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's WGL functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's WGL functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_wgl" >&5 +$as_echo "$use_wgl" >&6; } + + if test "x$enable_wgl" = "xyes" -a "x$use_wgl" != xyes; then : + as_fn_error $? " WGL functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-wgl: \`$use_wgl', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_wgl" = "xyes"; then : + CAIRO_REQUIRES="$wgl_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$wgl_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$wgl_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$wgl_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$wgl_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset wgl_BASE +unset wgl_REQUIRES +unset wgl_CFLAGS +unset wgl_NONPKGCONFIG_CFLAGS +unset wgl_LIBS +unset wgl_NONPKGCONFIG_LIBS +unset wgl_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_wgl" = xyes; then + CAIRO_HAS_WGL_FUNCTIONS_TRUE= + CAIRO_HAS_WGL_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_WGL_FUNCTIONS_TRUE='#' + CAIRO_HAS_WGL_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_WGL_FUNCTIONS=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_wgl_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_wgl_headers) +all_cairo_private += $(cairo_wgl_private) +all_cairo_cxx_sources += $(cairo_wgl_cxx_sources) +all_cairo_sources += $(cairo_wgl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_wgl_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_wgl_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_wgl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_wgl_headers) +enabled_cairo_private += $(cairo_wgl_private) +enabled_cairo_cxx_sources += $(cairo_wgl_cxx_sources) +enabled_cairo_sources += $(cairo_wgl_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_WGL_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_wgl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_wgl_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_wgl_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_wgl_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_WGL_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_wgl" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-wgl.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_wgl" = xyes; then : + : + ac_config_files="$ac_config_files cairo-wgl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-wgl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-wgl.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_WGL_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_wgl" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_WGL_FUNCTIONS' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_WGL_FUNCTIONS' + + + + if test "x$use_wgl" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_WGL_FUNCTIONS' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_WGL_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + +any2ppm_cs=no + # Check whether --enable-script was given. +if test "${enable_script+set}" = set; then : + enableval=$enable_script; enable_script=$enableval +else + enable_script=yes +fi + + case $enable_script in #( + no) : + use_script="no (disabled, use --enable-script to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's script surface backend feature" >&5 +$as_echo_n "checking for cairo's script surface backend feature... " >&6; } + echo + + use_script=yes + script_BASE="cairo" +script_REQUIRES="$ac_env_script_REQUIRES_value" +script_CFLAGS="$ac_env_script_CFLAGS_value" +script_NONPKGCONFIG_CFLAGS="$ac_env_script_NONPKGCONFIG_CFLAGS_value" +script_LIBS="$ac_env_script_LIBS_value" +script_NONPKGCONFIG_LIBS="$ac_env_script_NONPKGCONFIG_LIBS_value" +script_NONPKGCONFIG_EXTRA_LIBS="$ac_env_script_NONPKGCONFIG_EXTRA_LIBS_value" + + + + any2ppm_cs=yes + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's script surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's script surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_script" >&5 +$as_echo "$use_script" >&6; } + + if test "x$enable_script" = "xyes" -a "x$use_script" != xyes; then : + as_fn_error $? "recommended script surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-script: \`$use_script', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_script" = "xyes"; then : + CAIRO_REQUIRES="$script_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$script_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$script_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$script_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$script_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset script_BASE +unset script_REQUIRES +unset script_CFLAGS +unset script_NONPKGCONFIG_CFLAGS +unset script_LIBS +unset script_NONPKGCONFIG_LIBS +unset script_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_script" = xyes; then + CAIRO_HAS_SCRIPT_SURFACE_TRUE= + CAIRO_HAS_SCRIPT_SURFACE_FALSE='#' +else + CAIRO_HAS_SCRIPT_SURFACE_TRUE='#' + CAIRO_HAS_SCRIPT_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_SCRIPT_SURFACE=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_script_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_script_headers) +all_cairo_private += $(cairo_script_private) +all_cairo_cxx_sources += $(cairo_script_cxx_sources) +all_cairo_sources += $(cairo_script_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_script_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_script_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_script_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_script_headers) +enabled_cairo_private += $(cairo_script_private) +enabled_cairo_cxx_sources += $(cairo_script_cxx_sources) +enabled_cairo_sources += $(cairo_script_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SCRIPT_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_script_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_script_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_script_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_script_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_SCRIPT_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_script" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-script.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_script" = xyes; then : + : + ac_config_files="$ac_config_files cairo-script-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-script.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-script.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SCRIPT_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_script" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_SCRIPT_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_SCRIPT_SURFACE' + + + + if test "x$use_script" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_SCRIPT_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_SCRIPT_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + if test "x$use_script" != xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'+++ It is strongly recommended that you do NOT disable the script surface ++++ backend feature.' + + + +fi + + + + + +# We use pkg-config to look for freetype2, but fall back to +# freetype-config if it fails. We prefer pkg-config, since we can +# then just put freetype2 >= $FREETYPE_MIN_VERSION in +# Requires.private, but at least up to 2003-06-07, there was no +# freetype2.pc in the release. +# +# FreeType versions come in three forms: +# release (such as 2.1.9) +# libtool (such as 9.7.3) (returned by freetype-config and pkg-config) +# platform-specific/soname (such as 6.3.4) +# and they recommend you never use the platform-specific version +# (see docs/VERSION.DLL in freetype2 sources) +# +# Set these as appropriate: + +# release number - for information only +FREETYPE_MIN_RELEASE=2.1.9 +# libtool-specific version - this is what is checked +FREETYPE_MIN_VERSION=9.7.3 + + # Check whether --enable-ft was given. +if test "${enable_ft+set}" = set; then : + enableval=$enable_ft; enable_ft=$enableval +else + enable_ft=auto +fi + + case $enable_ft in #( + no) : + use_ft="no (disabled, use --enable-ft to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's FreeType font backend feature" >&5 +$as_echo_n "checking for cairo's FreeType font backend feature... " >&6; } + echo + + use_ft=yes + ft_BASE="cairo" +ft_REQUIRES="$ac_env_ft_REQUIRES_value" +ft_CFLAGS="$ac_env_ft_CFLAGS_value" +ft_NONPKGCONFIG_CFLAGS="$ac_env_ft_NONPKGCONFIG_CFLAGS_value" +ft_LIBS="$ac_env_ft_LIBS_value" +ft_NONPKGCONFIG_LIBS="$ac_env_ft_NONPKGCONFIG_LIBS_value" +ft_NONPKGCONFIG_EXTRA_LIBS="$ac_env_ft_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5 +$as_echo_n "checking for FREETYPE... " >&6; } + +if test -n "$FREETYPE_CFLAGS"; then + pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= \$FREETYPE_MIN_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2 >= $FREETYPE_MIN_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2 >= $FREETYPE_MIN_VERSION" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FREETYPE_LIBS"; then + pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= \$FREETYPE_MIN_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2 >= $FREETYPE_MIN_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2 >= $FREETYPE_MIN_VERSION" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "freetype2 >= $FREETYPE_MIN_VERSION" 2>&1` + else + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors "freetype2 >= $FREETYPE_MIN_VERSION" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FREETYPE_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + freetype_pkgconfig=no +elif test $pkg_failed = untried; then + freetype_pkgconfig=no +else + FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS + FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + freetype_pkgconfig=yes +fi + + if test "x$freetype_pkgconfig" = "xyes"; then + ft_REQUIRES="freetype2 >= $FREETYPE_MIN_VERSION $ft_REQUIRES" + else + + if test -z "$FREETYPE_CONFIG"; then + # Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FREETYPE_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no" + ;; +esac +fi +FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG +if test -n "$FREETYPE_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 +$as_echo "$FREETYPE_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + if test "x$FREETYPE_CONFIG" = "xno" ; then + use_ft='no (freetype-config not found in path or $FREETYPE_CONFIG)' + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking freetype2 libtool version" >&5 +$as_echo_n "checking freetype2 libtool version... " >&6; } + + FREETYPE_VERSION=`$FREETYPE_CONFIG --version` + + # Used to indicate true or false condition + ax_compare_version=false + + # Convert the two version strings to be compared into a format that + # allows a simple string comparison. The end result is that a version + # string of the form 1.12.5-r617 will be converted to the form + # 0001001200050617. In other words, each number is zero padded to four + # digits, and non digits are removed. + + ax_compare_version_A=`echo "$FREETYPE_VERSION" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ + -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/[^0-9]//g'` + + + ax_compare_version_B=`echo "$FREETYPE_MIN_VERSION" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ + -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ + -e 's/[^0-9]//g'` + + + ax_compare_version=`echo "x$ax_compare_version_A +x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A}/false/;s/x${ax_compare_version_B}/true/;1q"` + + + + if test "$ax_compare_version" = "true" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_VERSION - OK" >&5 +$as_echo "$FREETYPE_VERSION - OK" >&6; } + ft_NONPKGCONFIG_CFLAGS=`$FREETYPE_CONFIG --cflags` + ft_NONPKGCONFIG_LIBS=`$FREETYPE_CONFIG --libs` + else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_VERSION - Too old" >&5 +$as_echo "$FREETYPE_VERSION - Too old" >&6; } + use_ft="no ($FREETYPE_VERSION found; version $FREETYPE_MIN_VERSION from release $FREETYPE_MIN_RELEASE required)" + fi + + fi + fi + + ft_CFLAGS="$FREETYPE_CFLAGS" + ft_LIBS="$FREETYPE_LIBS" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's FreeType font backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's FreeType font backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_ft" >&5 +$as_echo "$use_ft" >&6; } + + if test "x$enable_ft" = "xyes" -a "x$use_ft" != xyes; then : + as_fn_error $? " FreeType font backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-ft: \`$use_ft', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_ft" = "xyes"; then : + CAIRO_REQUIRES="$ft_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$ft_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$ft_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$ft_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$ft_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset ft_BASE +unset ft_REQUIRES +unset ft_CFLAGS +unset ft_NONPKGCONFIG_CFLAGS +unset ft_LIBS +unset ft_NONPKGCONFIG_LIBS +unset ft_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_ft" = xyes; then + CAIRO_HAS_FT_FONT_TRUE= + CAIRO_HAS_FT_FONT_FALSE='#' +else + CAIRO_HAS_FT_FONT_TRUE='#' + CAIRO_HAS_FT_FONT_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_FT_FONT=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_ft_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_ft_headers) +all_cairo_private += $(cairo_ft_private) +all_cairo_cxx_sources += $(cairo_ft_cxx_sources) +all_cairo_sources += $(cairo_ft_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_ft_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ft_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_ft_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_ft_headers) +enabled_cairo_private += $(cairo_ft_private) +enabled_cairo_cxx_sources += $(cairo_ft_cxx_sources) +enabled_cairo_sources += $(cairo_ft_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_FT_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_FT_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_ft_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_ft_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ft_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_ft_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_FT_FONT' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_FT_FONT),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_ft" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-ft.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_ft" = xyes; then : + : + ac_config_files="$ac_config_files cairo-ft-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-ft.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-ft.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_FT_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_FT_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_ft" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_FT_FONT' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_FT_FONT' + + + + if test "x$use_ft" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_FT_FONT' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_FT_FONT 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_FT_FONT),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + if test "x$use_ft" = xyes; then : + : + CAIRO_NATIVE_FONT_BACKENDS="${CAIRO_NATIVE_FONT_BACKENDS}"'ft' + + + +fi + + +FONTCONFIG_MIN_VERSION=2.2.95 + # Check whether --enable-fc was given. +if test "${enable_fc+set}" = set; then : + enableval=$enable_fc; enable_fc=$enableval +else + enable_fc=auto +fi + + case $enable_fc in #( + no) : + use_fc="no (disabled, use --enable-fc to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Fontconfig font backend feature" >&5 +$as_echo_n "checking for cairo's Fontconfig font backend feature... " >&6; } + echo + + use_fc=yes + fc_BASE="cairo" +fc_REQUIRES="$ac_env_fc_REQUIRES_value" +fc_CFLAGS="$ac_env_fc_CFLAGS_value" +fc_NONPKGCONFIG_CFLAGS="$ac_env_fc_NONPKGCONFIG_CFLAGS_value" +fc_LIBS="$ac_env_fc_LIBS_value" +fc_NONPKGCONFIG_LIBS="$ac_env_fc_NONPKGCONFIG_LIBS_value" +fc_NONPKGCONFIG_EXTRA_LIBS="$ac_env_fc_NONPKGCONFIG_EXTRA_LIBS_value" + + + + use_fc=$use_ft + if test "x$use_fc" = "xyes"; then + fc_REQUIRES="fontconfig >= $FONTCONFIG_MIN_VERSION" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5 +$as_echo_n "checking for FONTCONFIG... " >&6; } + +if test -n "$FONTCONFIG_CFLAGS"; then + pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$fc_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$fc_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "$fc_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FONTCONFIG_LIBS"; then + pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$fc_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$fc_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "$fc_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$fc_REQUIRES" 2>&1` + else + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors "$fc_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FONTCONFIG_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_fc="no (requires $fc_REQUIRES)" +elif test $pkg_failed = untried; then + use_fc="no (requires $fc_REQUIRES)" +else + FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS + FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + fi + fc_CFLAGS="$FONTCONFIG_CFLAGS" + fc_LIBS="$FONTCONFIG_LIBS" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Fontconfig font backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's Fontconfig font backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_fc" >&5 +$as_echo "$use_fc" >&6; } + + if test "x$enable_fc" = "xyes" -a "x$use_fc" != xyes; then : + as_fn_error $? " Fontconfig font backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-fc: \`$use_fc', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_fc" = "xyes"; then : + CAIRO_REQUIRES="$fc_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$fc_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$fc_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$fc_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$fc_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset fc_BASE +unset fc_REQUIRES +unset fc_CFLAGS +unset fc_NONPKGCONFIG_CFLAGS +unset fc_LIBS +unset fc_NONPKGCONFIG_LIBS +unset fc_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_fc" = xyes; then + CAIRO_HAS_FC_FONT_TRUE= + CAIRO_HAS_FC_FONT_FALSE='#' +else + CAIRO_HAS_FC_FONT_TRUE='#' + CAIRO_HAS_FC_FONT_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_FC_FONT=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_fc_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_fc_headers) +all_cairo_private += $(cairo_fc_private) +all_cairo_cxx_sources += $(cairo_fc_cxx_sources) +all_cairo_sources += $(cairo_fc_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_fc_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_fc_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_fc_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_fc_headers) +enabled_cairo_private += $(cairo_fc_private) +enabled_cairo_cxx_sources += $(cairo_fc_cxx_sources) +enabled_cairo_sources += $(cairo_fc_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_FC_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_FC_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_fc_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_fc_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_fc_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_fc_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_FC_FONT' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_FC_FONT),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_fc" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-fc.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_fc" = xyes; then : + : + ac_config_files="$ac_config_files cairo-fc-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-fc.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-fc.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_FC_FONT' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_FC_FONT),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_fc" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_FC_FONT' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_FC_FONT' + + + + if test "x$use_fc" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_FC_FONT' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_FC_FONT 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_FC_FONT),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + if test "x$use_fc" = xyes; then : + : + CAIRO_NATIVE_FONT_BACKENDS="${CAIRO_NATIVE_FONT_BACKENDS}"'fc' + + + +fi + + +if test "x$use_ft" = "xyes"; then + _save_libs="$LIBS" + _save_cflags="$CFLAGS" + LIBS="$LIBS $ft_LIBS" + CFLAGS="$CFLAGS $ft_CFLAGS" + + for ac_func in FT_Get_X11_Font_Format FT_GlyphSlot_Embolden FT_GlyphSlot_Oblique FT_Load_Sfnt_Table FT_Library_SetLcdFilter +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + LIBS="$_save_libs" + CFLAGS="$_save_cflags" +fi + +if test "x$use_fc" = "xyes"; then + _save_cflags="$CFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $FONTCONFIG_CFLAGS" + LIBS="$LIBS $FONTCONFIG_LIBS" + for ac_func in FcInit FcFini +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + CFLAGS="$_save_cflags" + LIBS="$_save_libs" + +fi + + + # Check whether --enable-ps was given. +if test "${enable_ps+set}" = set; then : + enableval=$enable_ps; enable_ps=$enableval +else + enable_ps=yes +fi + + case $enable_ps in #( + no) : + use_ps="no (disabled, use --enable-ps to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's PostScript surface backend feature" >&5 +$as_echo_n "checking for cairo's PostScript surface backend feature... " >&6; } + echo + + use_ps=yes + ps_BASE="cairo" +ps_REQUIRES="$ac_env_ps_REQUIRES_value" +ps_CFLAGS="$ac_env_ps_CFLAGS_value" +ps_NONPKGCONFIG_CFLAGS="$ac_env_ps_NONPKGCONFIG_CFLAGS_value" +ps_LIBS="$ac_env_ps_LIBS_value" +ps_NONPKGCONFIG_LIBS="$ac_env_ps_NONPKGCONFIG_LIBS_value" +ps_NONPKGCONFIG_EXTRA_LIBS="$ac_env_ps_NONPKGCONFIG_EXTRA_LIBS_value" + + + + # The ps backend requires zlib. + use_ps=$have_libz + ps_NONPKGCONFIG_LIBS=-lz + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's PostScript surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's PostScript surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_ps" >&5 +$as_echo "$use_ps" >&6; } + + if test "x$enable_ps" = "xyes" -a "x$use_ps" != xyes; then : + as_fn_error $? "recommended PostScript surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-ps: \`$use_ps', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_ps" = "xyes"; then : + CAIRO_REQUIRES="$ps_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$ps_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$ps_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$ps_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$ps_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset ps_BASE +unset ps_REQUIRES +unset ps_CFLAGS +unset ps_NONPKGCONFIG_CFLAGS +unset ps_LIBS +unset ps_NONPKGCONFIG_LIBS +unset ps_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_ps" = xyes; then + CAIRO_HAS_PS_SURFACE_TRUE= + CAIRO_HAS_PS_SURFACE_FALSE='#' +else + CAIRO_HAS_PS_SURFACE_TRUE='#' + CAIRO_HAS_PS_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_PS_SURFACE=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_ps_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_ps_headers) +all_cairo_private += $(cairo_ps_private) +all_cairo_cxx_sources += $(cairo_ps_cxx_sources) +all_cairo_sources += $(cairo_ps_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_ps_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ps_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_ps_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_ps_headers) +enabled_cairo_private += $(cairo_ps_private) +enabled_cairo_cxx_sources += $(cairo_ps_cxx_sources) +enabled_cairo_sources += $(cairo_ps_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PS_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PS_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_ps_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_ps_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_ps_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_ps_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_PS_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_PS_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_ps" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-ps.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_ps" = xyes; then : + : + ac_config_files="$ac_config_files cairo-ps-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-ps.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-ps.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PS_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PS_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_ps" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_PS_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_PS_SURFACE' + + + + if test "x$use_ps" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_PS_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_PS_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_PS_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + if test "x$use_ps" != xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'+++ It is strongly recommended that you do NOT disable the PostScript surface ++++ backend feature.' + + + +fi + + + + + +SPECTRE_VERSION_REQUIRED=0.2.0 +test_ps=no +any2ppm_ps=no +if test "x$use_ps" = "xyes"; then + # Extract the first word of "gs", so it can be a program name with args. +set dummy gs; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_GS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$GS"; then + ac_cv_prog_GS="$GS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GS="gs" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +GS=$ac_cv_prog_GS +if test -n "$GS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GS" >&5 +$as_echo "$GS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$GS"; then + +$as_echo "#define CAIRO_CAN_TEST_PS_SURFACE 1" >>confdefs.h + + test_ps="yes" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PS backend will not be tested since ghostscript is not available" >&5 +$as_echo "$as_me: WARNING: PS backend will not be tested since ghostscript is not available" >&2;} + test_ps="no (requires ghostscript)" + fi + + libspectre_DEPENDENCY="libspectre >= $SPECTRE_VERSION_REQUIRED" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSPECTRE" >&5 +$as_echo_n "checking for LIBSPECTRE... " >&6; } + +if test -n "$LIBSPECTRE_CFLAGS"; then + pkg_cv_LIBSPECTRE_CFLAGS="$LIBSPECTRE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$libspectre_DEPENDENCY\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$libspectre_DEPENDENCY") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBSPECTRE_CFLAGS=`$PKG_CONFIG --cflags "$libspectre_DEPENDENCY" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBSPECTRE_LIBS"; then + pkg_cv_LIBSPECTRE_LIBS="$LIBSPECTRE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$libspectre_DEPENDENCY\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$libspectre_DEPENDENCY") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBSPECTRE_LIBS=`$PKG_CONFIG --libs "$libspectre_DEPENDENCY" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBSPECTRE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$libspectre_DEPENDENCY" 2>&1` + else + LIBSPECTRE_PKG_ERRORS=`$PKG_CONFIG --print-errors "$libspectre_DEPENDENCY" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBSPECTRE_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + test_ps="no (requires libspectre)" +elif test $pkg_failed = untried; then + test_ps="no (requires libspectre)" +else + LIBSPECTRE_CFLAGS=$pkg_cv_LIBSPECTRE_CFLAGS + LIBSPECTRE_LIBS=$pkg_cv_LIBSPECTRE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + any2ppm_ps=yes +fi +fi + + if test "x$test_ps" = "xyes"; then + CAIRO_CAN_TEST_PS_SURFACE_TRUE= + CAIRO_CAN_TEST_PS_SURFACE_FALSE='#' +else + CAIRO_CAN_TEST_PS_SURFACE_TRUE='#' + CAIRO_CAN_TEST_PS_SURFACE_FALSE= +fi + + if test "x$any2ppm_ps" = "xyes"; then + CAIRO_HAS_SPECTRE_TRUE= + CAIRO_HAS_SPECTRE_FALSE='#' +else + CAIRO_HAS_SPECTRE_TRUE='#' + CAIRO_HAS_SPECTRE_FALSE= +fi + +if test "x$any2ppm_ps" = "xyes"; then + +$as_echo "#define CAIRO_HAS_SPECTRE 1" >>confdefs.h + +fi + + + + + # Check whether --enable-pdf was given. +if test "${enable_pdf+set}" = set; then : + enableval=$enable_pdf; enable_pdf=$enableval +else + enable_pdf=yes +fi + + case $enable_pdf in #( + no) : + use_pdf="no (disabled, use --enable-pdf to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's PDF surface backend feature" >&5 +$as_echo_n "checking for cairo's PDF surface backend feature... " >&6; } + echo + + use_pdf=yes + pdf_BASE="cairo" +pdf_REQUIRES="$ac_env_pdf_REQUIRES_value" +pdf_CFLAGS="$ac_env_pdf_CFLAGS_value" +pdf_NONPKGCONFIG_CFLAGS="$ac_env_pdf_NONPKGCONFIG_CFLAGS_value" +pdf_LIBS="$ac_env_pdf_LIBS_value" +pdf_NONPKGCONFIG_LIBS="$ac_env_pdf_NONPKGCONFIG_LIBS_value" +pdf_NONPKGCONFIG_EXTRA_LIBS="$ac_env_pdf_NONPKGCONFIG_EXTRA_LIBS_value" + + + + # The pdf backend requires zlib. + use_pdf=$have_libz + pdf_NONPKGCONFIG_LIBS=-lz + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's PDF surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's PDF surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_pdf" >&5 +$as_echo "$use_pdf" >&6; } + + if test "x$enable_pdf" = "xyes" -a "x$use_pdf" != xyes; then : + as_fn_error $? "recommended PDF surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-pdf: \`$use_pdf', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_pdf" = "xyes"; then : + CAIRO_REQUIRES="$pdf_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$pdf_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$pdf_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$pdf_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$pdf_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset pdf_BASE +unset pdf_REQUIRES +unset pdf_CFLAGS +unset pdf_NONPKGCONFIG_CFLAGS +unset pdf_LIBS +unset pdf_NONPKGCONFIG_LIBS +unset pdf_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_pdf" = xyes; then + CAIRO_HAS_PDF_SURFACE_TRUE= + CAIRO_HAS_PDF_SURFACE_FALSE='#' +else + CAIRO_HAS_PDF_SURFACE_TRUE='#' + CAIRO_HAS_PDF_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_PDF_SURFACE=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_pdf_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_pdf_headers) +all_cairo_private += $(cairo_pdf_private) +all_cairo_cxx_sources += $(cairo_pdf_cxx_sources) +all_cairo_sources += $(cairo_pdf_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_pdf_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pdf_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_pdf_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_pdf_headers) +enabled_cairo_private += $(cairo_pdf_private) +enabled_cairo_cxx_sources += $(cairo_pdf_cxx_sources) +enabled_cairo_sources += $(cairo_pdf_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PDF_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PDF_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_pdf_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_pdf_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pdf_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_pdf_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_PDF_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_PDF_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_pdf" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-pdf.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_pdf" = xyes; then : + : + ac_config_files="$ac_config_files cairo-pdf-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-pdf.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-pdf.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PDF_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PDF_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_pdf" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_PDF_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_PDF_SURFACE' + + + + if test "x$use_pdf" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_PDF_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_PDF_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_PDF_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + if test "x$use_pdf" != xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'+++ It is strongly recommended that you do NOT disable the PDF surface ++++ backend feature.' + + + +fi + + + + + +# poppler-0.17.4 fixes text-pattern and text-transform +POPPLER_VERSION_REQUIRED=0.17.4 +test_pdf=no +any2ppm_pdf=no +if test "x$use_pdf" = "xyes"; then + poppler_DEPENDENCY="poppler-glib >= $POPPLER_VERSION_REQUIRED" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER" >&5 +$as_echo_n "checking for POPPLER... " >&6; } + +if test -n "$POPPLER_CFLAGS"; then + pkg_cv_POPPLER_CFLAGS="$POPPLER_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$poppler_DEPENDENCY\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$poppler_DEPENDENCY") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_CFLAGS=`$PKG_CONFIG --cflags "$poppler_DEPENDENCY" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$POPPLER_LIBS"; then + pkg_cv_POPPLER_LIBS="$POPPLER_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$poppler_DEPENDENCY\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$poppler_DEPENDENCY") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_POPPLER_LIBS=`$PKG_CONFIG --libs "$poppler_DEPENDENCY" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + POPPLER_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$poppler_DEPENDENCY" 2>&1` + else + POPPLER_PKG_ERRORS=`$PKG_CONFIG --print-errors "$poppler_DEPENDENCY" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$POPPLER_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + test_pdf="no (requires $poppler_DEPENDENCY)" +elif test $pkg_failed = untried; then + test_pdf="no (requires $poppler_DEPENDENCY)" +else + POPPLER_CFLAGS=$pkg_cv_POPPLER_CFLAGS + POPPLER_LIBS=$pkg_cv_POPPLER_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + _save_cflags="$CFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $POPPLER_CFLAGS" + LIBS="$LIBS $POPPLER_LIBS" + for ac_func in poppler_page_render +do : + ac_fn_c_check_func "$LINENO" "poppler_page_render" "ac_cv_func_poppler_page_render" +if test "x$ac_cv_func_poppler_page_render" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_POPPLER_PAGE_RENDER 1 +_ACEOF + test_pdf=yes; any2ppm_pdf=yes +else + test_pdf="no (requires $poppler_DEPENDENCY)" +fi +done + + CFLAGS="$_save_cflags" + LIBS="$_save_libs" + +fi + if test "x$test_pdf" = "xyes"; then + +$as_echo "#define CAIRO_CAN_TEST_PDF_SURFACE 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PDF backend will not be tested since poppler >= $POPPLER_VERSION_REQUIRED is not available" >&5 +$as_echo "$as_me: WARNING: PDF backend will not be tested since poppler >= $POPPLER_VERSION_REQUIRED is not available" >&2;} + fi +fi + + if test "x$test_pdf" = "xyes"; then + CAIRO_CAN_TEST_PDF_SURFACE_TRUE= + CAIRO_CAN_TEST_PDF_SURFACE_FALSE='#' +else + CAIRO_CAN_TEST_PDF_SURFACE_TRUE='#' + CAIRO_CAN_TEST_PDF_SURFACE_FALSE= +fi + + + + + if test "x$use_ps" = "xyes" -o "x$use_pdf" = "xyes"; then + CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE= + CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE='#' +else + CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE='#' + CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE= +fi + + + + # Check whether --enable-svg was given. +if test "${enable_svg+set}" = set; then : + enableval=$enable_svg; enable_svg=$enableval +else + enable_svg=yes +fi + + case $enable_svg in #( + no) : + use_svg="no (disabled, use --enable-svg to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's SVG surface backend feature" >&5 +$as_echo_n "checking for cairo's SVG surface backend feature... " >&6; } + echo + + use_svg=yes + svg_BASE="cairo" +svg_REQUIRES="$ac_env_svg_REQUIRES_value" +svg_CFLAGS="$ac_env_svg_CFLAGS_value" +svg_NONPKGCONFIG_CFLAGS="$ac_env_svg_NONPKGCONFIG_CFLAGS_value" +svg_LIBS="$ac_env_svg_LIBS_value" +svg_NONPKGCONFIG_LIBS="$ac_env_svg_NONPKGCONFIG_LIBS_value" +svg_NONPKGCONFIG_EXTRA_LIBS="$ac_env_svg_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$use_png" != "xyes"; then + use_svg="no (requires --enable-png)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's SVG surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's SVG surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_svg" >&5 +$as_echo "$use_svg" >&6; } + + if test "x$enable_svg" = "xyes" -a "x$use_svg" != xyes; then : + as_fn_error $? "recommended SVG surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-svg: \`$use_svg', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_svg" = "xyes"; then : + CAIRO_REQUIRES="$svg_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$svg_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$svg_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$svg_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$svg_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset svg_BASE +unset svg_REQUIRES +unset svg_CFLAGS +unset svg_NONPKGCONFIG_CFLAGS +unset svg_LIBS +unset svg_NONPKGCONFIG_LIBS +unset svg_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_svg" = xyes; then + CAIRO_HAS_SVG_SURFACE_TRUE= + CAIRO_HAS_SVG_SURFACE_FALSE='#' +else + CAIRO_HAS_SVG_SURFACE_TRUE='#' + CAIRO_HAS_SVG_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_SVG_SURFACE=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_svg_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_svg_headers) +all_cairo_private += $(cairo_svg_private) +all_cairo_cxx_sources += $(cairo_svg_cxx_sources) +all_cairo_sources += $(cairo_svg_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_svg_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_svg_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_svg_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_svg_headers) +enabled_cairo_private += $(cairo_svg_private) +enabled_cairo_cxx_sources += $(cairo_svg_cxx_sources) +enabled_cairo_sources += $(cairo_svg_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SVG_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SVG_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_svg_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_svg_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_svg_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_svg_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_SVG_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_SVG_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_svg" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-svg.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_svg" = xyes; then : + : + ac_config_files="$ac_config_files cairo-svg-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-svg.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-svg.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SVG_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SVG_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_svg" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_SVG_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_SVG_SURFACE' + + + + if test "x$use_svg" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_SVG_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_SVG_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_SVG_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + if test "x$use_svg" != xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'+++ It is strongly recommended that you do NOT disable the SVG surface ++++ backend feature.' + + + +fi + + + + +LIBRSVG_VERSION_REQUIRED=2.35.0 +test_svg=no +any2ppm_svg=no +if test "x$use_svg" = "xyes"; then + librsvg_DEPENDENCY="librsvg-2.0 >= $LIBRSVG_VERSION_REQUIRED" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBRSVG" >&5 +$as_echo_n "checking for LIBRSVG... " >&6; } + +if test -n "$LIBRSVG_CFLAGS"; then + pkg_cv_LIBRSVG_CFLAGS="$LIBRSVG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$librsvg_DEPENDENCY gdk-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$librsvg_DEPENDENCY gdk-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBRSVG_CFLAGS=`$PKG_CONFIG --cflags "$librsvg_DEPENDENCY gdk-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBRSVG_LIBS"; then + pkg_cv_LIBRSVG_LIBS="$LIBRSVG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$librsvg_DEPENDENCY gdk-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$librsvg_DEPENDENCY gdk-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBRSVG_LIBS=`$PKG_CONFIG --libs "$librsvg_DEPENDENCY gdk-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBRSVG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$librsvg_DEPENDENCY gdk-2.0" 2>&1` + else + LIBRSVG_PKG_ERRORS=`$PKG_CONFIG --print-errors "$librsvg_DEPENDENCY gdk-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBRSVG_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + test_svg="no (requires $librsvg_DEPENDENCY)" +elif test $pkg_failed = untried; then + test_svg="no (requires $librsvg_DEPENDENCY)" +else + LIBRSVG_CFLAGS=$pkg_cv_LIBRSVG_CFLAGS + LIBRSVG_LIBS=$pkg_cv_LIBRSVG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + _save_cflags="$CFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $LIBRSVG_CFLAGS" + LIBS="$LIBS $LIBRSVG_LIBS" + for ac_func in rsvg_pixbuf_from_file +do : + ac_fn_c_check_func "$LINENO" "rsvg_pixbuf_from_file" "ac_cv_func_rsvg_pixbuf_from_file" +if test "x$ac_cv_func_rsvg_pixbuf_from_file" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_RSVG_PIXBUF_FROM_FILE 1 +_ACEOF + test_svg=yes; any2ppm_svg=yes +else + test_svg="no (requires $librsvg_DEPENDENCY)" +fi +done + + CFLAGS="$_save_cflags" + LIBS="$_save_libs" + +fi + if test "x$test_svg" = "xyes"; then + +$as_echo "#define CAIRO_CAN_TEST_SVG_SURFACE 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SVG backend will not be tested since librsvg >= $LIBRSVG_VERSION_REQUIRED is not available" >&5 +$as_echo "$as_me: WARNING: SVG backend will not be tested since librsvg >= $LIBRSVG_VERSION_REQUIRED is not available" >&2;} + fi +fi + + if test "x$test_svg" = "xyes"; then + CAIRO_CAN_TEST_SVG_SURFACE_TRUE= + CAIRO_CAN_TEST_SVG_SURFACE_FALSE='#' +else + CAIRO_CAN_TEST_SVG_SURFACE_TRUE='#' + CAIRO_CAN_TEST_SVG_SURFACE_FALSE= +fi + + + + + + # Check whether --enable-test-surfaces was given. +if test "${enable_test_surfaces+set}" = set; then : + enableval=$enable_test_surfaces; enable_test_surfaces=$enableval +else + enable_test_surfaces=no +fi + + case $enable_test_surfaces in #( + no) : + use_test_surfaces="no (disabled, use --enable-test-surfaces to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's test surfaces feature" >&5 +$as_echo_n "checking for cairo's test surfaces feature... " >&6; } + echo + + use_test_surfaces=yes + test_surfaces_BASE="cairo" +test_surfaces_REQUIRES="$ac_env_test_surfaces_REQUIRES_value" +test_surfaces_CFLAGS="$ac_env_test_surfaces_CFLAGS_value" +test_surfaces_NONPKGCONFIG_CFLAGS="$ac_env_test_surfaces_NONPKGCONFIG_CFLAGS_value" +test_surfaces_LIBS="$ac_env_test_surfaces_LIBS_value" +test_surfaces_NONPKGCONFIG_LIBS="$ac_env_test_surfaces_NONPKGCONFIG_LIBS_value" +test_surfaces_NONPKGCONFIG_EXTRA_LIBS="$ac_env_test_surfaces_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's test surfaces feature could be enabled" >&5 +$as_echo_n "checking whether cairo's test surfaces feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_test_surfaces" >&5 +$as_echo "$use_test_surfaces" >&6; } + + if test "x$enable_test_surfaces" = "xyes" -a "x$use_test_surfaces" != xyes; then : + as_fn_error $? " test surfaces feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-test-surfaces: \`$use_test_surfaces', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_test_surfaces" = "xyes"; then : + CAIRO_REQUIRES="$test_surfaces_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$test_surfaces_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$test_surfaces_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$test_surfaces_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$test_surfaces_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset test_surfaces_BASE +unset test_surfaces_REQUIRES +unset test_surfaces_CFLAGS +unset test_surfaces_NONPKGCONFIG_CFLAGS +unset test_surfaces_LIBS +unset test_surfaces_NONPKGCONFIG_LIBS +unset test_surfaces_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_test_surfaces" = xyes; then + CAIRO_HAS_TEST_SURFACES_TRUE= + CAIRO_HAS_TEST_SURFACES_FALSE='#' +else + CAIRO_HAS_TEST_SURFACES_TRUE='#' + CAIRO_HAS_TEST_SURFACES_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_TEST_SURFACES=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + cr_make_tmp='all_cairo_private += $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +all_cairo_cxx_sources += $(cairo_test_surfaces_cxx_sources) +all_cairo_sources += $(cairo_test_surfaces_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_private += $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_test_surfaces_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_test_surfaces_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_private += $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +enabled_cairo_cxx_sources += $(cairo_test_surfaces_cxx_sources) +enabled_cairo_sources += $(cairo_test_surfaces_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_TEST_SURFACES' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_TEST_SURFACES),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_private += $(cairo_boilerplate_test_surfaces_private) $(cairo_boilerplate_test_surfaces_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_test_surfaces_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_test_surfaces_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_TEST_SURFACES' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_TEST_SURFACES),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + + + + + + if test "x$use_test_surfaces" = xyes; then : + : + +$as_echo "#define CAIRO_HAS_TEST_SURFACES 1" >>confdefs.h + + + +fi + cr_make_tmp=' @echo "#define CAIRO_HAS_TEST_SURFACES 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_TEST_SURFACES),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + + enable_image=yes + case $enable_image in #( + no) : + use_image="no (disabled, use --enable-image to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's image surface backend feature" >&5 +$as_echo_n "checking for cairo's image surface backend feature... " >&6; } + echo + + use_image=yes + image_BASE="cairo" +image_REQUIRES="$ac_env_image_REQUIRES_value" +image_CFLAGS="$ac_env_image_CFLAGS_value" +image_NONPKGCONFIG_CFLAGS="$ac_env_image_NONPKGCONFIG_CFLAGS_value" +image_LIBS="$ac_env_image_LIBS_value" +image_NONPKGCONFIG_LIBS="$ac_env_image_NONPKGCONFIG_LIBS_value" +image_NONPKGCONFIG_EXTRA_LIBS="$ac_env_image_NONPKGCONFIG_EXTRA_LIBS_value" + + + + pixman_REQUIRES="pixman-1 >= 0.30.0" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pixman" >&5 +$as_echo_n "checking for pixman... " >&6; } + +if test -n "$pixman_CFLAGS"; then + pkg_cv_pixman_CFLAGS="$pixman_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$pixman_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$pixman_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_pixman_CFLAGS=`$PKG_CONFIG --cflags "$pixman_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$pixman_LIBS"; then + pkg_cv_pixman_LIBS="$pixman_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$pixman_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$pixman_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_pixman_LIBS=`$PKG_CONFIG --libs "$pixman_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + pixman_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$pixman_REQUIRES" 2>&1` + else + pixman_PKG_ERRORS=`$PKG_CONFIG --print-errors "$pixman_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$pixman_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_image="no (requires $pixman_REQUIRES http://cairographics.org/releases/)" +elif test $pkg_failed = untried; then + use_image="no (requires $pixman_REQUIRES http://cairographics.org/releases/)" +else + pixman_CFLAGS=$pkg_cv_pixman_CFLAGS + pixman_LIBS=$pkg_cv_pixman_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + image_REQUIRES=$pixman_REQUIRES + image_CFLAGS=$pixman_CFLAGS + image_LIBS=$pixman_LIBS + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's image surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's image surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_image" >&5 +$as_echo "$use_image" >&6; } + + if test "x$enable_image" = "xyes" -a "x$use_image" != xyes; then : + as_fn_error $? "mandatory image surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-image: \`$use_image', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_image" = "xyes"; then : + CAIRO_REQUIRES="$image_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$image_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$image_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$image_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$image_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset image_BASE +unset image_REQUIRES +unset image_CFLAGS +unset image_NONPKGCONFIG_CFLAGS +unset image_LIBS +unset image_NONPKGCONFIG_LIBS +unset image_NONPKGCONFIG_EXTRA_LIBS + + +fi + + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_image_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_image_headers) +all_cairo_private += $(cairo_image_private) +all_cairo_cxx_sources += $(cairo_image_cxx_sources) +all_cairo_sources += $(cairo_image_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_image_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_image_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_image_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_image_headers) +enabled_cairo_private += $(cairo_image_private) +enabled_cairo_cxx_sources += $(cairo_image_cxx_sources) +enabled_cairo_sources += $(cairo_image_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_image_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_image_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_image_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_image_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + + + if test "x$use_image" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_IMAGE_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_IMAGE_SURFACE' + + + + if test "x$use_image" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_IMAGE_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_IMAGE_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + + + + + +if pkg-config --exists 'pixman-1 >= 0.27.1'; then + +$as_echo "#define HAS_PIXMAN_GLYPHS 1" >>confdefs.h + +fi + + + + enable_mime=yes + case $enable_mime in #( + no) : + use_mime="no (disabled, use --enable-mime to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's mime surface backend feature" >&5 +$as_echo_n "checking for cairo's mime surface backend feature... " >&6; } + echo + + use_mime=yes + mime_BASE="cairo" +mime_REQUIRES="$ac_env_mime_REQUIRES_value" +mime_CFLAGS="$ac_env_mime_CFLAGS_value" +mime_NONPKGCONFIG_CFLAGS="$ac_env_mime_NONPKGCONFIG_CFLAGS_value" +mime_LIBS="$ac_env_mime_LIBS_value" +mime_NONPKGCONFIG_LIBS="$ac_env_mime_NONPKGCONFIG_LIBS_value" +mime_NONPKGCONFIG_EXTRA_LIBS="$ac_env_mime_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's mime surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's mime surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_mime" >&5 +$as_echo "$use_mime" >&6; } + + if test "x$enable_mime" = "xyes" -a "x$use_mime" != xyes; then : + as_fn_error $? "mandatory mime surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-mime: \`$use_mime', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_mime" = "xyes"; then : + CAIRO_REQUIRES="$mime_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$mime_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$mime_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$mime_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$mime_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset mime_BASE +unset mime_REQUIRES +unset mime_CFLAGS +unset mime_NONPKGCONFIG_CFLAGS +unset mime_LIBS +unset mime_NONPKGCONFIG_LIBS +unset mime_NONPKGCONFIG_EXTRA_LIBS + + +fi + + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_mime_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_mime_headers) +all_cairo_private += $(cairo_mime_private) +all_cairo_cxx_sources += $(cairo_mime_cxx_sources) +all_cairo_sources += $(cairo_mime_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_mime_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_mime_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_mime_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_mime_headers) +enabled_cairo_private += $(cairo_mime_private) +enabled_cairo_cxx_sources += $(cairo_mime_cxx_sources) +enabled_cairo_sources += $(cairo_mime_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_mime_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_mime_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_mime_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_mime_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + + + if test "x$use_mime" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_MIME_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_MIME_SURFACE' + + + + if test "x$use_mime" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_MIME_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_MIME_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + + + + + enable_recording=yes + case $enable_recording in #( + no) : + use_recording="no (disabled, use --enable-recording to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's recording surface backend feature" >&5 +$as_echo_n "checking for cairo's recording surface backend feature... " >&6; } + echo + + use_recording=yes + recording_BASE="cairo" +recording_REQUIRES="$ac_env_recording_REQUIRES_value" +recording_CFLAGS="$ac_env_recording_CFLAGS_value" +recording_NONPKGCONFIG_CFLAGS="$ac_env_recording_NONPKGCONFIG_CFLAGS_value" +recording_LIBS="$ac_env_recording_LIBS_value" +recording_NONPKGCONFIG_LIBS="$ac_env_recording_NONPKGCONFIG_LIBS_value" +recording_NONPKGCONFIG_EXTRA_LIBS="$ac_env_recording_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's recording surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's recording surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_recording" >&5 +$as_echo "$use_recording" >&6; } + + if test "x$enable_recording" = "xyes" -a "x$use_recording" != xyes; then : + as_fn_error $? "mandatory recording surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-recording: \`$use_recording', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_recording" = "xyes"; then : + CAIRO_REQUIRES="$recording_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$recording_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$recording_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$recording_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$recording_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset recording_BASE +unset recording_REQUIRES +unset recording_CFLAGS +unset recording_NONPKGCONFIG_CFLAGS +unset recording_LIBS +unset recording_NONPKGCONFIG_LIBS +unset recording_NONPKGCONFIG_EXTRA_LIBS + + +fi + + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_recording_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_recording_headers) +all_cairo_private += $(cairo_recording_private) +all_cairo_cxx_sources += $(cairo_recording_cxx_sources) +all_cairo_sources += $(cairo_recording_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_recording_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_recording_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_recording_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_recording_headers) +enabled_cairo_private += $(cairo_recording_private) +enabled_cairo_cxx_sources += $(cairo_recording_cxx_sources) +enabled_cairo_sources += $(cairo_recording_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_recording_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_recording_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_recording_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_recording_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + + + if test "x$use_recording" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_RECORDING_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_RECORDING_SURFACE' + + + + if test "x$use_recording" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_RECORDING_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_RECORDING_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + + + + + enable_observer=yes + case $enable_observer in #( + no) : + use_observer="no (disabled, use --enable-observer to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's observer surface backend feature" >&5 +$as_echo_n "checking for cairo's observer surface backend feature... " >&6; } + echo + + use_observer=yes + observer_BASE="cairo" +observer_REQUIRES="$ac_env_observer_REQUIRES_value" +observer_CFLAGS="$ac_env_observer_CFLAGS_value" +observer_NONPKGCONFIG_CFLAGS="$ac_env_observer_NONPKGCONFIG_CFLAGS_value" +observer_LIBS="$ac_env_observer_LIBS_value" +observer_NONPKGCONFIG_LIBS="$ac_env_observer_NONPKGCONFIG_LIBS_value" +observer_NONPKGCONFIG_EXTRA_LIBS="$ac_env_observer_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's observer surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's observer surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_observer" >&5 +$as_echo "$use_observer" >&6; } + + if test "x$enable_observer" = "xyes" -a "x$use_observer" != xyes; then : + as_fn_error $? "mandatory observer surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-observer: \`$use_observer', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_observer" = "xyes"; then : + CAIRO_REQUIRES="$observer_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$observer_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$observer_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$observer_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$observer_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset observer_BASE +unset observer_REQUIRES +unset observer_CFLAGS +unset observer_NONPKGCONFIG_CFLAGS +unset observer_LIBS +unset observer_NONPKGCONFIG_LIBS +unset observer_NONPKGCONFIG_EXTRA_LIBS + + +fi + + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_observer_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_observer_headers) +all_cairo_private += $(cairo_observer_private) +all_cairo_cxx_sources += $(cairo_observer_cxx_sources) +all_cairo_sources += $(cairo_observer_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_observer_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_observer_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_observer_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_observer_headers) +enabled_cairo_private += $(cairo_observer_private) +enabled_cairo_cxx_sources += $(cairo_observer_cxx_sources) +enabled_cairo_sources += $(cairo_observer_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_observer_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_observer_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_observer_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_observer_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + + + if test "x$use_observer" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_OBSERVER_SURFACE' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_OBSERVER_SURFACE' + + + + if test "x$use_observer" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_OBSERVER_SURFACE' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_OBSERVER_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + + + + + # Check whether --enable-tee was given. +if test "${enable_tee+set}" = set; then : + enableval=$enable_tee; enable_tee=$enableval +else + enable_tee=no +fi + + case $enable_tee in #( + no) : + use_tee="no (disabled, use --enable-tee to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's tee surface backend feature" >&5 +$as_echo_n "checking for cairo's tee surface backend feature... " >&6; } + echo + + use_tee=yes + tee_BASE="cairo" +tee_REQUIRES="$ac_env_tee_REQUIRES_value" +tee_CFLAGS="$ac_env_tee_CFLAGS_value" +tee_NONPKGCONFIG_CFLAGS="$ac_env_tee_NONPKGCONFIG_CFLAGS_value" +tee_LIBS="$ac_env_tee_LIBS_value" +tee_NONPKGCONFIG_LIBS="$ac_env_tee_NONPKGCONFIG_LIBS_value" +tee_NONPKGCONFIG_EXTRA_LIBS="$ac_env_tee_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's tee surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's tee surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_tee" >&5 +$as_echo "$use_tee" >&6; } + + if test "x$enable_tee" = "xyes" -a "x$use_tee" != xyes; then : + as_fn_error $? " tee surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-tee: \`$use_tee', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_tee" = "xyes"; then : + CAIRO_REQUIRES="$tee_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$tee_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$tee_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$tee_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$tee_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset tee_BASE +unset tee_REQUIRES +unset tee_CFLAGS +unset tee_NONPKGCONFIG_CFLAGS +unset tee_LIBS +unset tee_NONPKGCONFIG_LIBS +unset tee_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_tee" = xyes; then + CAIRO_HAS_TEE_SURFACE_TRUE= + CAIRO_HAS_TEE_SURFACE_FALSE='#' +else + CAIRO_HAS_TEE_SURFACE_TRUE='#' + CAIRO_HAS_TEE_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_TEE_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_tee_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_tee_headers) +all_cairo_private += $(cairo_tee_private) +all_cairo_cxx_sources += $(cairo_tee_cxx_sources) +all_cairo_sources += $(cairo_tee_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_tee_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_tee_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_tee_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_tee_headers) +enabled_cairo_private += $(cairo_tee_private) +enabled_cairo_cxx_sources += $(cairo_tee_cxx_sources) +enabled_cairo_sources += $(cairo_tee_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_TEE_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_TEE_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_tee_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_tee_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_tee_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_tee_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_TEE_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_TEE_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_tee" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-tee.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_tee" = xyes; then : + : + ac_config_files="$ac_config_files cairo-tee-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-tee.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-tee.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_TEE_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_TEE_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_tee" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_TEE_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_TEE_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_TEE_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_tee" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The tee surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to tee surface backend specific +--- API.' + + + +fi + + + + + # Check whether --enable-xml was given. +if test "${enable_xml+set}" = set; then : + enableval=$enable_xml; enable_xml=$enableval +else + enable_xml=no +fi + + case $enable_xml in #( + no) : + use_xml="no (disabled, use --enable-xml to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's xml surface backend feature" >&5 +$as_echo_n "checking for cairo's xml surface backend feature... " >&6; } + echo + + use_xml=yes + xml_BASE="cairo" +xml_REQUIRES="$ac_env_xml_REQUIRES_value" +xml_CFLAGS="$ac_env_xml_CFLAGS_value" +xml_NONPKGCONFIG_CFLAGS="$ac_env_xml_NONPKGCONFIG_CFLAGS_value" +xml_LIBS="$ac_env_xml_LIBS_value" +xml_NONPKGCONFIG_LIBS="$ac_env_xml_NONPKGCONFIG_LIBS_value" +xml_NONPKGCONFIG_EXTRA_LIBS="$ac_env_xml_NONPKGCONFIG_EXTRA_LIBS_value" + + + + use_xml=$have_libz + xml_NONPKGCONFIG_LIBS=-lz + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's xml surface backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's xml surface backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_xml" >&5 +$as_echo "$use_xml" >&6; } + + if test "x$enable_xml" = "xyes" -a "x$use_xml" != xyes; then : + as_fn_error $? " xml surface backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-xml: \`$use_xml', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_xml" = "xyes"; then : + CAIRO_REQUIRES="$xml_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$xml_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$xml_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$xml_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$xml_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset xml_BASE +unset xml_REQUIRES +unset xml_CFLAGS +unset xml_NONPKGCONFIG_CFLAGS +unset xml_LIBS +unset xml_NONPKGCONFIG_LIBS +unset xml_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_xml" = xyes; then + CAIRO_HAS_XML_SURFACE_TRUE= + CAIRO_HAS_XML_SURFACE_FALSE='#' +else + CAIRO_HAS_XML_SURFACE_TRUE='#' + CAIRO_HAS_XML_SURFACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_XML_SURFACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='unsupported_cairo_headers += $(cairo_xml_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='all_cairo_headers += $(cairo_xml_headers) +all_cairo_private += $(cairo_xml_private) +all_cairo_cxx_sources += $(cairo_xml_cxx_sources) +all_cairo_sources += $(cairo_xml_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_xml_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xml_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_xml_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_xml_headers) +enabled_cairo_private += $(cairo_xml_private) +enabled_cairo_cxx_sources += $(cairo_xml_cxx_sources) +enabled_cairo_sources += $(cairo_xml_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XML_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XML_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xml_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_xml_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_xml_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xml_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_XML_SURFACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_XML_SURFACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_xml" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-xml.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_xml" = xyes; then : + : + ac_config_files="$ac_config_files cairo-xml-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-xml.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-xml.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_XML_SURFACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_XML_SURFACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_xml" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_XML_SURFACE' + + +fi + + + + cr_make_tmp=' @echo "#define CAIRO_HAS_XML_SURFACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_XML_SURFACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + if test "x$use_xml" = xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'--- The xml surface backend feature is still under active development and is +--- included in this release only as a preview. It does NOT fully work yet +--- and incompatible changes may yet be made to xml surface backend specific +--- API.' + + + +fi + + + + + + + enable_user=yes + case $enable_user in #( + no) : + use_user="no (disabled, use --enable-user to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's user font backend feature" >&5 +$as_echo_n "checking for cairo's user font backend feature... " >&6; } + echo + + use_user=yes + user_BASE="cairo" +user_REQUIRES="$ac_env_user_REQUIRES_value" +user_CFLAGS="$ac_env_user_CFLAGS_value" +user_NONPKGCONFIG_CFLAGS="$ac_env_user_NONPKGCONFIG_CFLAGS_value" +user_LIBS="$ac_env_user_LIBS_value" +user_NONPKGCONFIG_LIBS="$ac_env_user_NONPKGCONFIG_LIBS_value" +user_NONPKGCONFIG_EXTRA_LIBS="$ac_env_user_NONPKGCONFIG_EXTRA_LIBS_value" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's user font backend feature could be enabled" >&5 +$as_echo_n "checking whether cairo's user font backend feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_user" >&5 +$as_echo "$use_user" >&6; } + + if test "x$enable_user" = "xyes" -a "x$use_user" != xyes; then : + as_fn_error $? "mandatory user font backend feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-user: \`$use_user', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_user" = "xyes"; then : + CAIRO_REQUIRES="$user_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$user_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$user_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$user_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$user_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset user_BASE +unset user_REQUIRES +unset user_CFLAGS +unset user_NONPKGCONFIG_CFLAGS +unset user_LIBS +unset user_NONPKGCONFIG_LIBS +unset user_NONPKGCONFIG_EXTRA_LIBS + + +fi + + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_user_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_user_headers) +all_cairo_private += $(cairo_user_private) +all_cairo_cxx_sources += $(cairo_user_cxx_sources) +all_cairo_sources += $(cairo_user_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_user_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_user_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_user_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_user_headers) +enabled_cairo_private += $(cairo_user_private) +enabled_cairo_cxx_sources += $(cairo_user_cxx_sources) +enabled_cairo_sources += $(cairo_user_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_user_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_user_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_user_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_user_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + + + if test "x$use_user" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_USER_FONT' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_USER_FONT' + + + + if test "x$use_user" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_USER_FONT' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_USER_FONT 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + + + + + +have_real_pthread=no +have_pthread=no + # Check whether --enable-pthread was given. +if test "${enable_pthread+set}" = set; then : + enableval=$enable_pthread; enable_pthread=$enableval +else + enable_pthread=auto +fi + + case $enable_pthread in #( + no) : + use_pthread="no (disabled, use --enable-pthread to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's pthread feature" >&5 +$as_echo_n "checking for cairo's pthread feature... " >&6; } + echo + + use_pthread=yes + pthread_BASE="cairo" +pthread_REQUIRES="$ac_env_pthread_REQUIRES_value" +pthread_CFLAGS="$ac_env_pthread_CFLAGS_value" +pthread_NONPKGCONFIG_CFLAGS="$ac_env_pthread_NONPKGCONFIG_CFLAGS_value" +pthread_LIBS="$ac_env_pthread_LIBS_value" +pthread_NONPKGCONFIG_LIBS="$ac_env_pthread_NONPKGCONFIG_LIBS_value" +pthread_NONPKGCONFIG_EXTRA_LIBS="$ac_env_pthread_NONPKGCONFIG_EXTRA_LIBS_value" + + + if test "x$PTHREAD_CFLAGS" = "x"; then + PTHREAD_CFLAGS="-D_REENTRANT" + fi + if test "x$PTHREAD_LIBS" = "x"; then + PTHREAD_LIBS="-lpthread" + fi + + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program="#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* for PTHREAD_MUTEX_INITIALIZER under linux */ +#endif +#include <pthread.h> + +pthread_mutex_t test_mutex_initializer = PTHREAD_MUTEX_INITIALIZER; +int test_mutex (void) +{ + int x = 0; + pthread_mutex_t mutex; + x |= pthread_mutex_init (&mutex, NULL); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + return 0; +} + +int test_mutex_attr (void) +{ + int x = 0; + pthread_mutexattr_t attr; + pthread_mutex_t mutex; + x |= pthread_mutexattr_init (&attr); + x |= pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + x |= pthread_mutex_init (&mutex, &attr); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + x |= pthread_mutexattr_destroy (&attr); + return x; +} + +pthread_once_t once_control = PTHREAD_ONCE_INIT; +void test_once_init (void) {} +int test_once (void) +{ + return pthread_once (&once_control, test_once_init); +} + +pthread_key_t test_specific_key; +int test_specific (void) +{ + int x = 0; + x |= pthread_key_create (&test_specific_key, NULL); + x |= pthread_setspecific (test_specific_key, NULL); + x |= pthread_getspecific (test_specific_key) != NULL; + return x; +} + +void cleaner (void *arg) { (void)arg; } + +void * +test_thread_main (void *arg) +{ + pthread_cleanup_push (cleaner, arg); + pthread_exit (arg); + pthread_cleanup_pop (1); + return arg; +} + +int +test_threads (void) +{ + int x = 0; + pthread_t thread; + pthread_attr_t attr; + void *arg = NULL; + x |= pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + x |= pthread_create (&thread, &attr, test_thread_main, arg); + x |= pthread_equal (pthread_self(), thread); + x |= pthread_join (thread, &arg); + x |= pthread_attr_destroy (&attr); + return x; +}"' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS"; + LIBS="$LIBS $PTHREAD_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + real_pthread_CFLAGS="$PTHREAD_CFLAGS"; + real_pthread_LIBS="$PTHREAD_LIBS"; + have_real_pthread=yes + else + real_pthread_CFLAGS=""; + real_pthread_LIBS=""; + have_real_pthread=no + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + if test "x$have_real_pthread" != "xyes"; then + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program="#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* for PTHREAD_MUTEX_INITIALIZER under linux */ +#endif +#include <pthread.h> + +pthread_mutex_t test_mutex_initializer = PTHREAD_MUTEX_INITIALIZER; +int test_mutex (void) +{ + int x = 0; + pthread_mutex_t mutex; + x |= pthread_mutex_init (&mutex, NULL); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + return 0; +} + +int test_mutex_attr (void) +{ + int x = 0; + pthread_mutexattr_t attr; + pthread_mutex_t mutex; + x |= pthread_mutexattr_init (&attr); + x |= pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + x |= pthread_mutex_init (&mutex, &attr); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + x |= pthread_mutexattr_destroy (&attr); + return x; +} + +pthread_once_t once_control = PTHREAD_ONCE_INIT; +void test_once_init (void) {} +int test_once (void) +{ + return pthread_once (&once_control, test_once_init); +} + +pthread_key_t test_specific_key; +int test_specific (void) +{ + int x = 0; + x |= pthread_key_create (&test_specific_key, NULL); + x |= pthread_setspecific (test_specific_key, NULL); + x |= pthread_getspecific (test_specific_key) != NULL; + return x; +} + +void cleaner (void *arg) { (void)arg; } + +void * +test_thread_main (void *arg) +{ + pthread_cleanup_push (cleaner, arg); + pthread_exit (arg); + pthread_cleanup_pop (1); + return arg; +} + +int +test_threads (void) +{ + int x = 0; + pthread_t thread; + pthread_attr_t attr; + void *arg = NULL; + x |= pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + x |= pthread_create (&thread, &attr, test_thread_main, arg); + x |= pthread_equal (pthread_self(), thread); + x |= pthread_join (thread, &arg); + x |= pthread_attr_destroy (&attr); + return x; +}"' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS -pthread"; + LIBS="$LIBS " + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + real_pthread_CFLAGS="-pthread"; + real_pthread_LIBS=""; + have_real_pthread=yes + else + real_pthread_CFLAGS=""; + real_pthread_LIBS=""; + have_real_pthread="no (can't link with -lpthread or -pthread)" + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + fi + PTHREAD_CFLAGS= + PTHREAD_LIBS= + + have_pthread="no" + if test "x$enable_pthread" != "xyes"; then + # AC_LANG_PROGRAM() produces a main() w/o args, + # but -Wold-style-definition doesn't like that. + # We need _some_ program so that we don't get + # warnings about empty compilation units, so always + # append a reasonable main(). + _compile_program="#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* for PTHREAD_MUTEX_INITIALIZER under linux */ +#endif +#include <pthread.h> + +pthread_mutex_t test_mutex_initializer = PTHREAD_MUTEX_INITIALIZER; +int test_mutex (void) +{ + int x = 0; + pthread_mutex_t mutex; + x |= pthread_mutex_init (&mutex, NULL); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + return 0; +} + +int test_mutex_attr (void) +{ + int x = 0; + pthread_mutexattr_t attr; + pthread_mutex_t mutex; + x |= pthread_mutexattr_init (&attr); + x |= pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + x |= pthread_mutex_init (&mutex, &attr); + x |= pthread_mutex_lock (&mutex); + x |= pthread_mutex_unlock (&mutex); + x |= pthread_mutex_destroy (&mutex); + x |= pthread_mutexattr_destroy (&attr); + return x; +}"' + int main(int c, char **v) { (void)c; (void)v; return 0; }' + + _save_cflags="$CFLAGS" + _save_ldflags="$LDFLAGS" + _save_libs="$LIBS" + CFLAGS="$CFLAGS -D_REENTRANT"; + LIBS="$LIBS " + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$_compile_program +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=yes +else + cairo_cc_stderr=`test -f conftest.err && cat conftest.err` + cairo_cc_flag=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test "x$cairo_cc_stderr" != "x"; then + cairo_cc_flag=no + fi + + if test "x$cairo_cc_flag" = "xyes"; then + pthread_CFLAGS="-D_REENTRANT"; + pthread_LIBS=""; + have_pthread=yes + else + pthread_CFLAGS=""; + pthread_LIBS=""; + + fi + CFLAGS="$_save_cflags" + LDFLAGS="$_save_ldflags" + LIBS="$_save_libs" + + + fi + + if test "x$have_pthread" != "xyes"; then + have_pthread="$have_real_pthread"; + pthread_CFLAGS="$real_pthread_CFLAGS"; + pthread_LIBS="$real_pthread_LIBS"; + fi + + if test "x$have_real_pthread" = "xyes"; then + +$as_echo "#define CAIRO_HAS_REAL_PTHREAD 1" >>confdefs.h + + fi + if test "x$have_pthread" = "xyes"; then + +$as_echo "#define CAIRO_HAS_PTHREAD 1" >>confdefs.h + + fi + + if test "x$enable_pthread" = "xyes" -a "x$have_pthread" != "xyes"; then + as_fn_error $? "pthread requested but not found" "$LINENO" 5 + fi + + use_pthread="$have_pthread" + pthread_REQUIRES="" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's pthread feature could be enabled" >&5 +$as_echo_n "checking whether cairo's pthread feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_pthread" >&5 +$as_echo "$use_pthread" >&6; } + + if test "x$enable_pthread" = "xyes" -a "x$use_pthread" != xyes; then : + as_fn_error $? " pthread feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-pthread: \`$use_pthread', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_pthread" = "xyes"; then : + CAIRO_REQUIRES="$pthread_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$pthread_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$pthread_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$pthread_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$pthread_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset pthread_BASE +unset pthread_REQUIRES +unset pthread_CFLAGS +unset pthread_NONPKGCONFIG_CFLAGS +unset pthread_LIBS +unset pthread_NONPKGCONFIG_LIBS +unset pthread_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_pthread" = xyes; then + CAIRO_HAS_PTHREAD_TRUE= + CAIRO_HAS_PTHREAD_FALSE='#' +else + CAIRO_HAS_PTHREAD_TRUE='#' + CAIRO_HAS_PTHREAD_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_PTHREAD=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + cr_make_tmp='all_cairo_private += $(cairo_pthread_private) $(cairo_pthread_headers) +all_cairo_cxx_sources += $(cairo_pthread_cxx_sources) +all_cairo_sources += $(cairo_pthread_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_private += $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pthread_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_pthread_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_private += $(cairo_pthread_private) $(cairo_pthread_headers) +enabled_cairo_cxx_sources += $(cairo_pthread_cxx_sources) +enabled_cairo_sources += $(cairo_pthread_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_PTHREAD' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_PTHREAD),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_private += $(cairo_boilerplate_pthread_private) $(cairo_boilerplate_pthread_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_pthread_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_pthread_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_PTHREAD' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_PTHREAD),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + + + + + + if test "x$use_pthread" = xyes; then : + : + +$as_echo "#define CAIRO_HAS_PTHREAD 1" >>confdefs.h + + + +fi + cr_make_tmp=' @echo "#define CAIRO_HAS_PTHREAD 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_PTHREAD),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + if test "x$use_pthread" = "xyes" -a "x$have_real_pthread" = "xyes"; then + HAVE_REAL_PTHREAD_TRUE= + HAVE_REAL_PTHREAD_FALSE='#' +else + HAVE_REAL_PTHREAD_TRUE='#' + HAVE_REAL_PTHREAD_FALSE= +fi + + if test "x$use_pthread" = "xyes"; then + HAVE_PTHREAD_TRUE= + HAVE_PTHREAD_FALSE='#' +else + HAVE_PTHREAD_TRUE='#' + HAVE_PTHREAD_FALSE= +fi + + + + + + + + + # Check whether --enable-gobject was given. +if test "${enable_gobject+set}" = set; then : + enableval=$enable_gobject; enable_gobject=$enableval +else + enable_gobject=auto +fi + + case $enable_gobject in #( + no) : + use_gobject="no (disabled, use --enable-gobject to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's gobject functions feature" >&5 +$as_echo_n "checking for cairo's gobject functions feature... " >&6; } + echo + + use_gobject=yes + gobject_BASE="cairo" +gobject_REQUIRES="$ac_env_gobject_REQUIRES_value" +gobject_CFLAGS="$ac_env_gobject_CFLAGS_value" +gobject_NONPKGCONFIG_CFLAGS="$ac_env_gobject_NONPKGCONFIG_CFLAGS_value" +gobject_LIBS="$ac_env_gobject_LIBS_value" +gobject_NONPKGCONFIG_LIBS="$ac_env_gobject_NONPKGCONFIG_LIBS_value" +gobject_NONPKGCONFIG_EXTRA_LIBS="$ac_env_gobject_NONPKGCONFIG_EXTRA_LIBS_value" + + + + gobject_REQUIRES="gobject-2.0 glib-2.0 >= 2.14" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT" >&5 +$as_echo_n "checking for GOBJECT... " >&6; } + +if test -n "$GOBJECT_CFLAGS"; then + pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gobject_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gobject_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "$gobject_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GOBJECT_LIBS"; then + pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gobject_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gobject_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GOBJECT_LIBS=`$PKG_CONFIG --libs "$gobject_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$gobject_REQUIRES" 2>&1` + else + GOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors "$gobject_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GOBJECT_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_gobject="no (requires $gobject_REQUIRES http://download.gnome.org/pub/GNOME/sources/glib/)" +elif test $pkg_failed = untried; then + use_gobject="no (requires $gobject_REQUIRES http://download.gnome.org/pub/GNOME/sources/glib/)" +else + GOBJECT_CFLAGS=$pkg_cv_GOBJECT_CFLAGS + GOBJECT_LIBS=$pkg_cv_GOBJECT_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + gobject_NONPKGCONFIG_EXTRA_LIBS="-L\${libdir} -lcairo-gobject" + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's gobject functions feature could be enabled" >&5 +$as_echo_n "checking whether cairo's gobject functions feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_gobject" >&5 +$as_echo "$use_gobject" >&6; } + + if test "x$enable_gobject" = "xyes" -a "x$use_gobject" != xyes; then : + as_fn_error $? " gobject functions feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-gobject: \`$use_gobject', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_gobject" = "xyes"; then : + CAIRO_REQUIRES="$gobject_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$gobject_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$gobject_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$gobject_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$gobject_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset gobject_BASE +unset gobject_REQUIRES +unset gobject_CFLAGS +unset gobject_NONPKGCONFIG_CFLAGS +unset gobject_LIBS +unset gobject_NONPKGCONFIG_LIBS +unset gobject_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_gobject" = xyes; then + CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE= + CAIRO_HAS_GOBJECT_FUNCTIONS_FALSE='#' +else + CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE='#' + CAIRO_HAS_GOBJECT_FUNCTIONS_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_GOBJECT_FUNCTIONS=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='supported_cairo_headers += $(cairo_gobject_headers)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='supported_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + cr_make_tmp='all_cairo_headers += $(cairo_gobject_headers) +all_cairo_private += $(cairo_gobject_private) +all_cairo_cxx_sources += $(cairo_gobject_cxx_sources) +all_cairo_sources += $(cairo_gobject_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gobject_private) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gobject_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gobject_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_headers += $(cairo_gobject_headers) +enabled_cairo_private += $(cairo_gobject_private) +enabled_cairo_cxx_sources += $(cairo_gobject_cxx_sources) +enabled_cairo_sources += $(cairo_gobject_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GOBJECT_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gobject_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gobject_private) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_gobject_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gobject_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_GOBJECT_FUNCTIONS' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + if test "x$use_gobject" = xyes; then : + : + ac_config_files="$ac_config_files src/cairo-gobject.pc:src/cairo-features.pc.in" + + +fi + if test "x$use_gobject" = xyes; then : + : + ac_config_files="$ac_config_files cairo-gobject-uninstalled.pc:src/cairo-features-uninstalled.pc.in" + + +fi + cr_make_tmp='all_cairo_pkgconf += cairo-gobject.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_pkgconf += cairo-gobject.pc' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_GOBJECT_FUNCTIONS' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + + + if test "x$use_gobject" = xyes; then : + : + CAIRO_FEATURES="${CAIRO_FEATURES} "'CAIRO_HAS_GOBJECT_FUNCTIONS' + + +fi + CAIRO_SUPPORTED_FEATURES="${CAIRO_SUPPORTED_FEATURES} "'CAIRO_HAS_GOBJECT_FUNCTIONS' + + + + if test "x$use_gobject" != xyes; then : + : + CAIRO_NO_FEATURES="${CAIRO_NO_FEATURES} "'CAIRO_HAS_GOBJECT_FUNCTIONS' + + + +fi + + cr_make_tmp=' @echo "#define CAIRO_HAS_GOBJECT_FUNCTIONS 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + +if test "x$use_gobject" = "xyes"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT" >&5 +$as_echo_n "checking for GOBJECT... " >&6; } + +if test -n "$GOBJECT_CFLAGS"; then + pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gobject_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gobject_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "$gobject_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GOBJECT_LIBS"; then + pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gobject_REQUIRES\""; } >&5 + ($PKG_CONFIG --exists --print-errors "$gobject_REQUIRES") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GOBJECT_LIBS=`$PKG_CONFIG --libs "$gobject_REQUIRES" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$gobject_REQUIRES" 2>&1` + else + GOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors "$gobject_REQUIRES" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GOBJECT_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements ($gobject_REQUIRES) were not met: + +$GOBJECT_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables GOBJECT_CFLAGS +and GOBJECT_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. +" "$LINENO" 5 +elif test $pkg_failed = untried; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables GOBJECT_CFLAGS +and GOBJECT_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5; } +else + GOBJECT_CFLAGS=$pkg_cv_GOBJECT_CFLAGS + GOBJECT_LIBS=$pkg_cv_GOBJECT_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi +fi + + +# Check whether --enable-full-testing was given. +if test "${enable_full_testing+set}" = set; then : + enableval=$enable_full_testing; +if test "x$enableval" = "xyes"; then + CAIRO_TEST_MODE=full + +fi + +fi + + + if test "x$any2ppm_svg" = "xyes" \ + -o "x$any2ppm_pdf" = "xyes" \ + -o "x$any2ppm_ps" = "xyes" \ + -o "x$any2ppm_cs" = "xyes"; then + BUILD_ANY2PPM_TRUE= + BUILD_ANY2PPM_FALSE='#' +else + BUILD_ANY2PPM_TRUE='#' + BUILD_ANY2PPM_FALSE= +fi + + + +case $host in +*-*-darwin*) + SHLIB_EXT="dylib" + ;; +*) + SHLIB_EXT="so" + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define SHARED_LIB_EXT "${SHLIB_EXT}" +_ACEOF + + + + +case $host in +*-linux*|*-*bsd*|*-solaris*|*-*-darwin*|*-dragonfly*|*-*-gnu*) + have_ld_preload="yes" + ;; +*) + have_ld_preload="no" + ;; +esac + + # Check whether --enable-trace was given. +if test "${enable_trace+set}" = set; then : + enableval=$enable_trace; enable_trace=$enableval +else + enable_trace=auto +fi + + case $enable_trace in #( + no) : + use_trace="no (disabled, use --enable-trace to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's cairo-trace feature" >&5 +$as_echo_n "checking for cairo's cairo-trace feature... " >&6; } + echo + + use_trace=yes + trace_BASE="cairo" +trace_REQUIRES="$ac_env_trace_REQUIRES_value" +trace_CFLAGS="$ac_env_trace_CFLAGS_value" +trace_NONPKGCONFIG_CFLAGS="$ac_env_trace_NONPKGCONFIG_CFLAGS_value" +trace_LIBS="$ac_env_trace_LIBS_value" +trace_NONPKGCONFIG_LIBS="$ac_env_trace_NONPKGCONFIG_LIBS_value" +trace_NONPKGCONFIG_EXTRA_LIBS="$ac_env_trace_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$have_ld_preload" != "xyes" -o \ + "x$have_libz" != "xyes" -o \ + "x$have_real_pthread" != "xyes" -o \ + "x$have_dlsym" != "xyes"; then + use_trace="no (requires dynamic linker and zlib and real pthreads)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's cairo-trace feature could be enabled" >&5 +$as_echo_n "checking whether cairo's cairo-trace feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_trace" >&5 +$as_echo "$use_trace" >&6; } + + if test "x$enable_trace" = "xyes" -a "x$use_trace" != xyes; then : + as_fn_error $? " cairo-trace feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-trace: \`$use_trace', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_trace" = "xyes"; then : + CAIRO_REQUIRES="$trace_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$trace_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$trace_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$trace_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$trace_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset trace_BASE +unset trace_REQUIRES +unset trace_CFLAGS +unset trace_NONPKGCONFIG_CFLAGS +unset trace_LIBS +unset trace_NONPKGCONFIG_LIBS +unset trace_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_trace" = xyes; then + CAIRO_HAS_TRACE_TRUE= + CAIRO_HAS_TRACE_FALSE='#' +else + CAIRO_HAS_TRACE_TRUE='#' + CAIRO_HAS_TRACE_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_TRACE=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + cr_make_tmp='all_cairo_private += $(cairo_trace_private) $(cairo_trace_headers) +all_cairo_cxx_sources += $(cairo_trace_cxx_sources) +all_cairo_sources += $(cairo_trace_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_private += $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_trace_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_trace_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_private += $(cairo_trace_private) $(cairo_trace_headers) +enabled_cairo_cxx_sources += $(cairo_trace_cxx_sources) +enabled_cairo_sources += $(cairo_trace_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_TRACE' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_TRACE),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_private += $(cairo_boilerplate_trace_private) $(cairo_boilerplate_trace_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_trace_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_trace_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_TRACE' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_TRACE),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + + + + + + if test "x$use_trace" = xyes; then : + : + +$as_echo "#define CAIRO_HAS_TRACE 1" >>confdefs.h + + + +fi + cr_make_tmp=' @echo "#define CAIRO_HAS_TRACE 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_TRACE),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + # Check whether --enable-interpreter was given. +if test "${enable_interpreter+set}" = set; then : + enableval=$enable_interpreter; enable_interpreter=$enableval +else + enable_interpreter=yes +fi + + case $enable_interpreter in #( + no) : + use_interpreter="no (disabled, use --enable-interpreter to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's cairo-script-interpreter feature" >&5 +$as_echo_n "checking for cairo's cairo-script-interpreter feature... " >&6; } + echo + + use_interpreter=yes + interpreter_BASE="cairo" +interpreter_REQUIRES="$ac_env_interpreter_REQUIRES_value" +interpreter_CFLAGS="$ac_env_interpreter_CFLAGS_value" +interpreter_NONPKGCONFIG_CFLAGS="$ac_env_interpreter_NONPKGCONFIG_CFLAGS_value" +interpreter_LIBS="$ac_env_interpreter_LIBS_value" +interpreter_NONPKGCONFIG_LIBS="$ac_env_interpreter_NONPKGCONFIG_LIBS_value" +interpreter_NONPKGCONFIG_EXTRA_LIBS="$ac_env_interpreter_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$have_libz" != "xyes"; then + use_interpreter="no (requires zlib)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's cairo-script-interpreter feature could be enabled" >&5 +$as_echo_n "checking whether cairo's cairo-script-interpreter feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_interpreter" >&5 +$as_echo "$use_interpreter" >&6; } + + if test "x$enable_interpreter" = "xyes" -a "x$use_interpreter" != xyes; then : + as_fn_error $? "recommended cairo-script-interpreter feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-interpreter: \`$use_interpreter', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_interpreter" = "xyes"; then : + CAIRO_REQUIRES="$interpreter_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$interpreter_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$interpreter_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$interpreter_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$interpreter_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset interpreter_BASE +unset interpreter_REQUIRES +unset interpreter_CFLAGS +unset interpreter_NONPKGCONFIG_CFLAGS +unset interpreter_LIBS +unset interpreter_NONPKGCONFIG_LIBS +unset interpreter_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_interpreter" = xyes; then + CAIRO_HAS_INTERPRETER_TRUE= + CAIRO_HAS_INTERPRETER_FALSE='#' +else + CAIRO_HAS_INTERPRETER_TRUE='#' + CAIRO_HAS_INTERPRETER_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_INTERPRETER=1' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + cr_make_tmp='all_cairo_private += $(cairo_interpreter_private) $(cairo_interpreter_headers) +all_cairo_cxx_sources += $(cairo_interpreter_cxx_sources) +all_cairo_sources += $(cairo_interpreter_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_private += $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_interpreter_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_interpreter_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_private += $(cairo_interpreter_private) $(cairo_interpreter_headers) +enabled_cairo_cxx_sources += $(cairo_interpreter_cxx_sources) +enabled_cairo_sources += $(cairo_interpreter_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_INTERPRETER' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_INTERPRETER),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_private += $(cairo_boilerplate_interpreter_private) $(cairo_boilerplate_interpreter_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_interpreter_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_interpreter_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_INTERPRETER' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_INTERPRETER),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + + + + + + if test "x$use_interpreter" = xyes; then : + : + +$as_echo "#define CAIRO_HAS_INTERPRETER 1" >>confdefs.h + + + +fi + cr_make_tmp=' @echo "#define CAIRO_HAS_INTERPRETER 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_INTERPRETER),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + if test "x$use_interpreter" != xyes; then : + : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'+++ It is strongly recommended that you do NOT disable the ++++ cairo-script-interpreter feature.' + + + +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bfd_openr in -lbfd" >&5 +$as_echo_n "checking for bfd_openr in -lbfd... " >&6; } +if ${ac_cv_lib_bfd_bfd_openr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbfd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char bfd_openr (); +int +main () +{ +return bfd_openr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bfd_bfd_openr=yes +else + ac_cv_lib_bfd_bfd_openr=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bfd_bfd_openr" >&5 +$as_echo "$ac_cv_lib_bfd_bfd_openr" >&6; } +if test "x$ac_cv_lib_bfd_bfd_openr" = xyes; then : + ac_fn_c_check_header_mongrel "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" +if test "x$ac_cv_header_bfd_h" = xyes; then : + have_bfd=yes +else + have_bfd=no +fi + + +else + have_bfd=no +fi + +ac_fn_c_check_header_mongrel "$LINENO" "libiberty.h" "ac_cv_header_libiberty_h" "$ac_includes_default" +if test "x$ac_cv_header_libiberty_h" = xyes; then : + +else + have_bfd=no +fi + + +if test "x$have_bfd" = "xyes"; then + +$as_echo "#define HAVE_BFD 1" >>confdefs.h + + BFD_LIBS=-lbfd + +fi + + # Check whether --enable-symbol-lookup was given. +if test "${enable_symbol_lookup+set}" = set; then : + enableval=$enable_symbol_lookup; enable_symbol_lookup=$enableval +else + enable_symbol_lookup=auto +fi + + case $enable_symbol_lookup in #( + no) : + use_symbol_lookup="no (disabled, use --enable-symbol-lookup to enable)" + ;; #( + yes|auto) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's symbol-lookup feature" >&5 +$as_echo_n "checking for cairo's symbol-lookup feature... " >&6; } + echo + + use_symbol_lookup=yes + symbol_lookup_BASE="cairo" +symbol_lookup_REQUIRES="$ac_env_symbol_lookup_REQUIRES_value" +symbol_lookup_CFLAGS="$ac_env_symbol_lookup_CFLAGS_value" +symbol_lookup_NONPKGCONFIG_CFLAGS="$ac_env_symbol_lookup_NONPKGCONFIG_CFLAGS_value" +symbol_lookup_LIBS="$ac_env_symbol_lookup_LIBS_value" +symbol_lookup_NONPKGCONFIG_LIBS="$ac_env_symbol_lookup_NONPKGCONFIG_LIBS_value" +symbol_lookup_NONPKGCONFIG_EXTRA_LIBS="$ac_env_symbol_lookup_NONPKGCONFIG_EXTRA_LIBS_value" + + + + if test "x$have_bfd" != "xyes"; then + use_symbol_lookup="no (requires bfd)" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's symbol-lookup feature could be enabled" >&5 +$as_echo_n "checking whether cairo's symbol-lookup feature could be enabled... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_symbol_lookup" >&5 +$as_echo "$use_symbol_lookup" >&6; } + + if test "x$enable_symbol_lookup" = "xyes" -a "x$use_symbol_lookup" != xyes; then : + as_fn_error $? " symbol-lookup feature could not be enabled" "$LINENO" 5 + +fi ;; #( + *) : + as_fn_error $? "invalid argument passed to --enable-symbol-lookup: \`$use_symbol_lookup', should be one of [no/auto/yes]" "$LINENO" 5 + ;; +esac + if test "x$use_symbol_lookup" = "xyes"; then : + CAIRO_REQUIRES="$symbol_lookup_REQUIRES"" ${CAIRO_REQUIRES}" + + CAIRO_CFLAGS="$symbol_lookup_CFLAGS"" ${CAIRO_CFLAGS}" + + CAIRO_NONPKGCONFIG_CFLAGS="$symbol_lookup_NONPKGCONFIG_CFLAGS"" ${CAIRO_NONPKGCONFIG_CFLAGS}" + + CAIRO_LIBS="$symbol_lookup_LIBS"" ${CAIRO_LIBS}" + + CAIRO_NONPKGCONFIG_LIBS="$symbol_lookup_NONPKGCONFIG_LIBS"" ${CAIRO_NONPKGCONFIG_LIBS}" + + +else + unset symbol_lookup_BASE +unset symbol_lookup_REQUIRES +unset symbol_lookup_CFLAGS +unset symbol_lookup_NONPKGCONFIG_CFLAGS +unset symbol_lookup_LIBS +unset symbol_lookup_NONPKGCONFIG_LIBS +unset symbol_lookup_NONPKGCONFIG_EXTRA_LIBS + + +fi + + if test "x$use_symbol_lookup" = xyes; then + CAIRO_HAS_SYMBOL_LOOKUP_TRUE= + CAIRO_HAS_SYMBOL_LOOKUP_FALSE='#' +else + CAIRO_HAS_SYMBOL_LOOKUP_TRUE='#' + CAIRO_HAS_SYMBOL_LOOKUP_FALSE= +fi + + + cr_make_tmp='CAIRO_HAS_SYMBOL_LOOKUP=0' + CAIRO_MAKEFILE___WIN32="${CAIRO_MAKEFILE___WIN32} +""$cr_make_tmp" + + + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + + + + + cr_make_tmp='all_cairo_private += $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +all_cairo_cxx_sources += $(cairo_symbol_lookup_cxx_sources) +all_cairo_sources += $(cairo_symbol_lookup_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + cr_make_tmp='all_cairo_boilerplate_private += $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +all_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_symbol_lookup_cxx_sources) +all_cairo_boilerplate_sources += $(cairo_boilerplate_symbol_lookup_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + + + cr_make_tmp='enabled_cairo_private += $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +enabled_cairo_cxx_sources += $(cairo_symbol_lookup_cxx_sources) +enabled_cairo_sources += $(cairo_symbol_lookup_sources)' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'if CAIRO_HAS_SYMBOL_LOOKUP' + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_AMAKE="${CAIRO_MAKEFILE_cairo_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'ifeq ($(CAIRO_HAS_SYMBOL_LOOKUP),1)' + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_WIN32="${CAIRO_MAKEFILE_cairo_WIN32} +"'endif' + cr_make_tmp='enabled_cairo_boilerplate_private += $(cairo_boilerplate_symbol_lookup_private) $(cairo_boilerplate_symbol_lookup_headers) +enabled_cairo_boilerplate_cxx_sources += $(cairo_boilerplate_symbol_lookup_cxx_sources) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_symbol_lookup_sources)' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'if CAIRO_HAS_SYMBOL_LOOKUP' + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_AMAKE="${CAIRO_MAKEFILE_cairo_boilerplate_AMAKE} +"'endif' + + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'ifeq ($(CAIRO_HAS_SYMBOL_LOOKUP),1)' + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_cairo_boilerplate_WIN32="${CAIRO_MAKEFILE_cairo_boilerplate_WIN32} +"'endif' + + + + + + + + + + if test "x$use_symbol_lookup" = xyes; then : + : + +$as_echo "#define CAIRO_HAS_SYMBOL_LOOKUP 1" >>confdefs.h + + + +fi + cr_make_tmp=' @echo "#define CAIRO_HAS_SYMBOL_LOOKUP 1" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'ifeq ($(CAIRO_HAS_SYMBOL_LOOKUP),1)' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +"'endif' + + + + + + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glib" >&5 +$as_echo_n "checking for glib... " >&6; } + +if test -n "$glib_CFLAGS"; then + pkg_cv_glib_CFLAGS="$glib_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_glib_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$glib_LIBS"; then + pkg_cv_glib_LIBS="$glib_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_glib_LIBS=`$PKG_CONFIG --libs "glib-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + glib_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "glib-2.0" 2>&1` + else + glib_PKG_ERRORS=`$PKG_CONFIG --print-errors "glib-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$glib_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_glib=no +elif test $pkg_failed = untried; then + have_glib=no +else + glib_CFLAGS=$pkg_cv_glib_CFLAGS + glib_LIBS=$pkg_cv_glib_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_glib=yes +fi + + + if test "x$have_glib" = "xyes" -a "x$have_windows" = "xno"; then + BUILD_SPHINX_TRUE= + BUILD_SPHINX_FALSE='#' +else + BUILD_SPHINX_TRUE='#' + BUILD_SPHINX_FALSE= +fi + + +save_LIBS="$LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shm_open in -lrt" >&5 +$as_echo_n "checking for shm_open in -lrt... " >&6; } +if ${ac_cv_lib_rt_shm_open+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shm_open (); +int +main () +{ +return shm_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_shm_open=yes +else + ac_cv_lib_rt_shm_open=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_shm_open" >&5 +$as_echo "$ac_cv_lib_rt_shm_open" >&6; } +if test "x$ac_cv_lib_rt_shm_open" = xyes; then : + shm_LIBS="-lrt" +fi + + +LIBS="$save_LIBS" + + +# Check whether --enable-some-floating-point was given. +if test "${enable_some_floating_point+set}" = set; then : + enableval=$enable_some_floating_point; +if test "x$enableval" = "xno"; then + # A value of 'no' for $enableval means that they want to disable, which + # means 'yes' for $disable_some_floating_point. + disable_some_floating_point=yes +fi + +else + disable_some_floating_point=no +fi + + + if test "x$disable_some_floating_point" = "xyes"; then + DISABLE_SOME_FLOATING_POINT_TRUE= + DISABLE_SOME_FLOATING_POINT_FALSE='#' +else + DISABLE_SOME_FLOATING_POINT_TRUE='#' + DISABLE_SOME_FLOATING_POINT_FALSE= +fi + +if test "x$disable_some_floating_point" = "xyes"; then + +$as_echo "#define DISABLE_SOME_FLOATING_POINT 1" >>confdefs.h + +fi + + +need_cxx="no" +if test "x$use_skia" = "xyes"; then : + need_cxx="yes" +fi +if test "x$use_qt" = "xyes"; then : + need_cxx="yes" +fi +if test "x$use_beos" = "xyes"; then : + need_cxx="yes" +fi + + if test "x$need_cxx" = "xyes"; then + BUILD_CXX_TRUE= + BUILD_CXX_FALSE='#' +else + BUILD_CXX_TRUE='#' + BUILD_CXX_FALSE= +fi + + + +# We use GTK+ for some utility/debugging tools + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk" >&5 +$as_echo_n "checking for gtk... " >&6; } + +if test -n "$gtk_CFLAGS"; then + pkg_cv_gtk_CFLAGS="$gtk_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gtk+-2.0\"\""; } >&5 + ($PKG_CONFIG --exists --print-errors ""gtk+-2.0"") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_gtk_CFLAGS=`$PKG_CONFIG --cflags ""gtk+-2.0"" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$gtk_LIBS"; then + pkg_cv_gtk_LIBS="$gtk_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"gtk+-2.0\"\""; } >&5 + ($PKG_CONFIG --exists --print-errors ""gtk+-2.0"") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_gtk_LIBS=`$PKG_CONFIG --libs ""gtk+-2.0"" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + gtk_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors ""gtk+-2.0"" 2>&1` + else + gtk_PKG_ERRORS=`$PKG_CONFIG --print-errors ""gtk+-2.0"" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$gtk_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_gtk=no +elif test $pkg_failed = untried; then + have_gtk=no +else + gtk_CFLAGS=$pkg_cv_gtk_CFLAGS + gtk_LIBS=$pkg_cv_gtk_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_gtk=yes +fi + if test "x$have_gtk" = "xyes"; then + HAVE_GTK_TRUE= + HAVE_GTK_FALSE='#' +else + HAVE_GTK_TRUE='#' + HAVE_GTK_FALSE= +fi + + +ac_config_files="$ac_config_files Makefile boilerplate/Makefile src/Makefile test/Makefile test/pdiff/Makefile perf/Makefile perf/micro/Makefile util/Makefile util/cairo-fdr/Makefile util/cairo-gobject/Makefile util/cairo-missing/Makefile util/cairo-script/Makefile util/cairo-script/examples/Makefile util/cairo-sphinx/Makefile util/cairo-trace/Makefile util/cairo-trace/cairo-trace doc/Makefile doc/public/Makefile" + +ac_config_commands="$ac_config_commands cairo-trace" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then + as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +CAIRO_CFLAGS="$CAIRO_CFLAGS $CAIRO_NONPKGCONFIG_CFLAGS" +CAIRO_LIBS="$CAIRO_LIBS $CAIRO_NONPKGCONFIG_LIBS" + + cr_make_tmp=' @echo "#endif" >> $(top_srcdir)/src/cairo-features.h' + CAIRO_MAKEFILE_win32_features_h_WIN32="${CAIRO_MAKEFILE_win32_features_h_WIN32} +""$cr_make_tmp" + + + + if test -z "$CAIRO_NATIVE_SURFACE_BACKENDS"; then : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'*** No native surface backends enabled for your platform. It is strongly +*** recommended that you enable the native surface backend feature for your +*** platform.' + + +fi + if test -z "$CAIRO_NATIVE_FONT_BACKENDS"; then : + CAIRO_WARNING_MESSAGE="${CAIRO_WARNING_MESSAGE} + +"'*** No native font backends enabled for your platform. It is strongly +*** recommended that you enable the native font backend feature for your +*** platform.' + + +fi + +if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then + as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then + as_fn_error $? "conditional \"OS_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SHM_TRUE}" && test -z "${HAVE_SHM_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SHM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_LCOV_TRUE}" && test -z "${CAIRO_HAS_LCOV_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_LCOV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_DL_TRUE}" && test -z "${CAIRO_HAS_DL_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_DL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_DLSYM_TRUE}" && test -z "${CAIRO_HAS_DLSYM_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_DLSYM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_XLIB_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XLIB_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_XLIB_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_XLIB_XRENDER_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_XCB_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XCB_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_XCB_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_XLIB_XCB_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_XLIB_XCB_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_XCB_SHM_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_XCB_SHM_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_QT_SURFACE_TRUE}" && test -z "${CAIRO_HAS_QT_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_QT_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_QUARTZ_SURFACE_TRUE}" && test -z "${CAIRO_HAS_QUARTZ_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_QUARTZ_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_QUARTZ_FONT_TRUE}" && test -z "${CAIRO_HAS_QUARTZ_FONT_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_QUARTZ_FONT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE}" && test -z "${CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_QUARTZ_IMAGE_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_WIN32_SURFACE_TRUE}" && test -z "${CAIRO_HAS_WIN32_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_WIN32_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_WIN32_FONT_TRUE}" && test -z "${CAIRO_HAS_WIN32_FONT_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_WIN32_FONT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_SKIA_SURFACE_TRUE}" && test -z "${CAIRO_HAS_SKIA_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_SKIA_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_OS2_SURFACE_TRUE}" && test -z "${CAIRO_HAS_OS2_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_OS2_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_BEOS_SURFACE_TRUE}" && test -z "${CAIRO_HAS_BEOS_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_BEOS_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_DRM_SURFACE_TRUE}" && test -z "${CAIRO_HAS_DRM_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_DRM_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_GALLIUM_SURFACE_TRUE}" && test -z "${CAIRO_HAS_GALLIUM_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_GALLIUM_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_PNG_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_PNG_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_PNG_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_GL_SURFACE_TRUE}" && test -z "${CAIRO_HAS_GL_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_GL_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_GLESV2_SURFACE_TRUE}" && test -z "${CAIRO_HAS_GLESV2_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_GLESV2_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_COGL_SURFACE_TRUE}" && test -z "${CAIRO_HAS_COGL_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_COGL_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_DIRECTFB_SURFACE_TRUE}" && test -z "${CAIRO_HAS_DIRECTFB_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_DIRECTFB_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_VG_SURFACE_TRUE}" && test -z "${CAIRO_HAS_VG_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_VG_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_EGL_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_EGL_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_EGL_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_GLX_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_GLX_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_GLX_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_WGL_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_WGL_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_WGL_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_SCRIPT_SURFACE_TRUE}" && test -z "${CAIRO_HAS_SCRIPT_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_SCRIPT_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_FT_FONT_TRUE}" && test -z "${CAIRO_HAS_FT_FONT_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_FT_FONT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_FC_FONT_TRUE}" && test -z "${CAIRO_HAS_FC_FONT_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_FC_FONT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_PS_SURFACE_TRUE}" && test -z "${CAIRO_HAS_PS_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_PS_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_CAN_TEST_PS_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_PS_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_CAN_TEST_PS_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_SPECTRE_TRUE}" && test -z "${CAIRO_HAS_SPECTRE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_SPECTRE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_PDF_SURFACE_TRUE}" && test -z "${CAIRO_HAS_PDF_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_PDF_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_CAN_TEST_PDF_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_PDF_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_CAN_TEST_PDF_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE}" && test -z "${CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_MULTI_PAGE_SURFACES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_SVG_SURFACE_TRUE}" && test -z "${CAIRO_HAS_SVG_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_SVG_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_CAN_TEST_SVG_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_SVG_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_CAN_TEST_SVG_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_TEST_SURFACES_TRUE}" && test -z "${CAIRO_HAS_TEST_SURFACES_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_TEST_SURFACES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_TEE_SURFACE_TRUE}" && test -z "${CAIRO_HAS_TEE_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_TEE_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_XML_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XML_SURFACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_XML_SURFACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_PTHREAD_TRUE}" && test -z "${CAIRO_HAS_PTHREAD_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_PTHREAD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_REAL_PTHREAD_TRUE}" && test -z "${HAVE_REAL_PTHREAD_FALSE}"; then + as_fn_error $? "conditional \"HAVE_REAL_PTHREAD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_PTHREAD_TRUE}" && test -z "${HAVE_PTHREAD_FALSE}"; then + as_fn_error $? "conditional \"HAVE_PTHREAD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_GOBJECT_FUNCTIONS_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_GOBJECT_FUNCTIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_ANY2PPM_TRUE}" && test -z "${BUILD_ANY2PPM_FALSE}"; then + as_fn_error $? "conditional \"BUILD_ANY2PPM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_TRACE_TRUE}" && test -z "${CAIRO_HAS_TRACE_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_TRACE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_INTERPRETER_TRUE}" && test -z "${CAIRO_HAS_INTERPRETER_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_INTERPRETER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CAIRO_HAS_SYMBOL_LOOKUP_TRUE}" && test -z "${CAIRO_HAS_SYMBOL_LOOKUP_FALSE}"; then + as_fn_error $? "conditional \"CAIRO_HAS_SYMBOL_LOOKUP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_SPHINX_TRUE}" && test -z "${BUILD_SPHINX_FALSE}"; then + as_fn_error $? "conditional \"BUILD_SPHINX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DISABLE_SOME_FLOATING_POINT_TRUE}" && test -z "${DISABLE_SOME_FLOATING_POINT_FALSE}"; then + as_fn_error $? "conditional \"DISABLE_SOME_FLOATING_POINT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_CXX_TRUE}" && test -z "${BUILD_CXX_FALSE}"; then + as_fn_error $? "conditional \"BUILD_CXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GTK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by cairo $as_me 1.14.2, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <http://bugs.freedesktop.org/enter_bug.cgi?product=cairo>. +cairo home page: <http://cairographics.org/>." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +cairo config.status 1.14.2 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + +CAIRO_MAKEFILE___WIN32='$CAIRO_MAKEFILE___WIN32' +CAIRO_MAKEFILE_cairo_AMAKE='$CAIRO_MAKEFILE_cairo_AMAKE' +CAIRO_MAKEFILE_cairo_WIN32='$CAIRO_MAKEFILE_cairo_WIN32' +CAIRO_MAKEFILE_cairo_boilerplate_AMAKE='$CAIRO_MAKEFILE_cairo_boilerplate_AMAKE' +CAIRO_MAKEFILE_cairo_boilerplate_WIN32='$CAIRO_MAKEFILE_cairo_boilerplate_WIN32' + CAIRO_FEATURES='$CAIRO_FEATURES' + CAIRO_NO_FEATURES='$CAIRO_NO_FEATURES' + + CAIRO_SUPPORTED_FEATURES='$CAIRO_SUPPORTED_FEATURES' + +CAIRO_MAKEFILE_win32_features_h_WIN32='$CAIRO_MAKEFILE_win32_features_h_WIN32' + SED='$SED' + xlib_BASE='$xlib_BASE' + xlib_REQUIRES='$xlib_REQUIRES' + xlib_NONPKGCONFIG_LIBS='$xlib_NONPKGCONFIG_LIBS' + xlib_NONPKGCONFIG_EXTRA_LIBS='$xlib_NONPKGCONFIG_EXTRA_LIBS' + xlib_NONPKGCONFIG_CFLAGS='$xlib_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xlib_BASE='$xlib_BASE' + xlib_REQUIRES='$xlib_REQUIRES' + xlib_NONPKGCONFIG_LIBS='$xlib_NONPKGCONFIG_LIBS' + xlib_NONPKGCONFIG_EXTRA_LIBS='$xlib_NONPKGCONFIG_EXTRA_LIBS' + xlib_NONPKGCONFIG_CFLAGS='$xlib_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xlib_xrender_BASE='$xlib_xrender_BASE' + xlib_xrender_REQUIRES='$xlib_xrender_REQUIRES' + xlib_xrender_NONPKGCONFIG_LIBS='$xlib_xrender_NONPKGCONFIG_LIBS' + xlib_xrender_NONPKGCONFIG_EXTRA_LIBS='$xlib_xrender_NONPKGCONFIG_EXTRA_LIBS' + xlib_xrender_NONPKGCONFIG_CFLAGS='$xlib_xrender_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xlib_xrender_BASE='$xlib_xrender_BASE' + xlib_xrender_REQUIRES='$xlib_xrender_REQUIRES' + xlib_xrender_NONPKGCONFIG_LIBS='$xlib_xrender_NONPKGCONFIG_LIBS' + xlib_xrender_NONPKGCONFIG_EXTRA_LIBS='$xlib_xrender_NONPKGCONFIG_EXTRA_LIBS' + xlib_xrender_NONPKGCONFIG_CFLAGS='$xlib_xrender_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xcb_BASE='$xcb_BASE' + xcb_REQUIRES='$xcb_REQUIRES' + xcb_NONPKGCONFIG_LIBS='$xcb_NONPKGCONFIG_LIBS' + xcb_NONPKGCONFIG_EXTRA_LIBS='$xcb_NONPKGCONFIG_EXTRA_LIBS' + xcb_NONPKGCONFIG_CFLAGS='$xcb_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xcb_BASE='$xcb_BASE' + xcb_REQUIRES='$xcb_REQUIRES' + xcb_NONPKGCONFIG_LIBS='$xcb_NONPKGCONFIG_LIBS' + xcb_NONPKGCONFIG_EXTRA_LIBS='$xcb_NONPKGCONFIG_EXTRA_LIBS' + xcb_NONPKGCONFIG_CFLAGS='$xcb_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xlib_xcb_BASE='$xlib_xcb_BASE' + xlib_xcb_REQUIRES='$xlib_xcb_REQUIRES' + xlib_xcb_NONPKGCONFIG_LIBS='$xlib_xcb_NONPKGCONFIG_LIBS' + xlib_xcb_NONPKGCONFIG_EXTRA_LIBS='$xlib_xcb_NONPKGCONFIG_EXTRA_LIBS' + xlib_xcb_NONPKGCONFIG_CFLAGS='$xlib_xcb_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xlib_xcb_BASE='$xlib_xcb_BASE' + xlib_xcb_REQUIRES='$xlib_xcb_REQUIRES' + xlib_xcb_NONPKGCONFIG_LIBS='$xlib_xcb_NONPKGCONFIG_LIBS' + xlib_xcb_NONPKGCONFIG_EXTRA_LIBS='$xlib_xcb_NONPKGCONFIG_EXTRA_LIBS' + xlib_xcb_NONPKGCONFIG_CFLAGS='$xlib_xcb_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xcb_shm_BASE='$xcb_shm_BASE' + xcb_shm_REQUIRES='$xcb_shm_REQUIRES' + xcb_shm_NONPKGCONFIG_LIBS='$xcb_shm_NONPKGCONFIG_LIBS' + xcb_shm_NONPKGCONFIG_EXTRA_LIBS='$xcb_shm_NONPKGCONFIG_EXTRA_LIBS' + xcb_shm_NONPKGCONFIG_CFLAGS='$xcb_shm_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xcb_shm_BASE='$xcb_shm_BASE' + xcb_shm_REQUIRES='$xcb_shm_REQUIRES' + xcb_shm_NONPKGCONFIG_LIBS='$xcb_shm_NONPKGCONFIG_LIBS' + xcb_shm_NONPKGCONFIG_EXTRA_LIBS='$xcb_shm_NONPKGCONFIG_EXTRA_LIBS' + xcb_shm_NONPKGCONFIG_CFLAGS='$xcb_shm_NONPKGCONFIG_CFLAGS' + + SED='$SED' + qt_BASE='$qt_BASE' + qt_REQUIRES='$qt_REQUIRES' + qt_NONPKGCONFIG_LIBS='$qt_NONPKGCONFIG_LIBS' + qt_NONPKGCONFIG_EXTRA_LIBS='$qt_NONPKGCONFIG_EXTRA_LIBS' + qt_NONPKGCONFIG_CFLAGS='$qt_NONPKGCONFIG_CFLAGS' + + SED='$SED' + qt_BASE='$qt_BASE' + qt_REQUIRES='$qt_REQUIRES' + qt_NONPKGCONFIG_LIBS='$qt_NONPKGCONFIG_LIBS' + qt_NONPKGCONFIG_EXTRA_LIBS='$qt_NONPKGCONFIG_EXTRA_LIBS' + qt_NONPKGCONFIG_CFLAGS='$qt_NONPKGCONFIG_CFLAGS' + + SED='$SED' + quartz_BASE='$quartz_BASE' + quartz_REQUIRES='$quartz_REQUIRES' + quartz_NONPKGCONFIG_LIBS='$quartz_NONPKGCONFIG_LIBS' + quartz_NONPKGCONFIG_EXTRA_LIBS='$quartz_NONPKGCONFIG_EXTRA_LIBS' + quartz_NONPKGCONFIG_CFLAGS='$quartz_NONPKGCONFIG_CFLAGS' + + SED='$SED' + quartz_BASE='$quartz_BASE' + quartz_REQUIRES='$quartz_REQUIRES' + quartz_NONPKGCONFIG_LIBS='$quartz_NONPKGCONFIG_LIBS' + quartz_NONPKGCONFIG_EXTRA_LIBS='$quartz_NONPKGCONFIG_EXTRA_LIBS' + quartz_NONPKGCONFIG_CFLAGS='$quartz_NONPKGCONFIG_CFLAGS' + + SED='$SED' + quartz_font_BASE='$quartz_font_BASE' + quartz_font_REQUIRES='$quartz_font_REQUIRES' + quartz_font_NONPKGCONFIG_LIBS='$quartz_font_NONPKGCONFIG_LIBS' + quartz_font_NONPKGCONFIG_EXTRA_LIBS='$quartz_font_NONPKGCONFIG_EXTRA_LIBS' + quartz_font_NONPKGCONFIG_CFLAGS='$quartz_font_NONPKGCONFIG_CFLAGS' + + SED='$SED' + quartz_font_BASE='$quartz_font_BASE' + quartz_font_REQUIRES='$quartz_font_REQUIRES' + quartz_font_NONPKGCONFIG_LIBS='$quartz_font_NONPKGCONFIG_LIBS' + quartz_font_NONPKGCONFIG_EXTRA_LIBS='$quartz_font_NONPKGCONFIG_EXTRA_LIBS' + quartz_font_NONPKGCONFIG_CFLAGS='$quartz_font_NONPKGCONFIG_CFLAGS' + + SED='$SED' + quartz_image_BASE='$quartz_image_BASE' + quartz_image_REQUIRES='$quartz_image_REQUIRES' + quartz_image_NONPKGCONFIG_LIBS='$quartz_image_NONPKGCONFIG_LIBS' + quartz_image_NONPKGCONFIG_EXTRA_LIBS='$quartz_image_NONPKGCONFIG_EXTRA_LIBS' + quartz_image_NONPKGCONFIG_CFLAGS='$quartz_image_NONPKGCONFIG_CFLAGS' + + SED='$SED' + quartz_image_BASE='$quartz_image_BASE' + quartz_image_REQUIRES='$quartz_image_REQUIRES' + quartz_image_NONPKGCONFIG_LIBS='$quartz_image_NONPKGCONFIG_LIBS' + quartz_image_NONPKGCONFIG_EXTRA_LIBS='$quartz_image_NONPKGCONFIG_EXTRA_LIBS' + quartz_image_NONPKGCONFIG_CFLAGS='$quartz_image_NONPKGCONFIG_CFLAGS' + + SED='$SED' + win32_BASE='$win32_BASE' + win32_REQUIRES='$win32_REQUIRES' + win32_NONPKGCONFIG_LIBS='$win32_NONPKGCONFIG_LIBS' + win32_NONPKGCONFIG_EXTRA_LIBS='$win32_NONPKGCONFIG_EXTRA_LIBS' + win32_NONPKGCONFIG_CFLAGS='$win32_NONPKGCONFIG_CFLAGS' + + SED='$SED' + win32_BASE='$win32_BASE' + win32_REQUIRES='$win32_REQUIRES' + win32_NONPKGCONFIG_LIBS='$win32_NONPKGCONFIG_LIBS' + win32_NONPKGCONFIG_EXTRA_LIBS='$win32_NONPKGCONFIG_EXTRA_LIBS' + win32_NONPKGCONFIG_CFLAGS='$win32_NONPKGCONFIG_CFLAGS' + + SED='$SED' + win32_font_BASE='$win32_font_BASE' + win32_font_REQUIRES='$win32_font_REQUIRES' + win32_font_NONPKGCONFIG_LIBS='$win32_font_NONPKGCONFIG_LIBS' + win32_font_NONPKGCONFIG_EXTRA_LIBS='$win32_font_NONPKGCONFIG_EXTRA_LIBS' + win32_font_NONPKGCONFIG_CFLAGS='$win32_font_NONPKGCONFIG_CFLAGS' + + SED='$SED' + win32_font_BASE='$win32_font_BASE' + win32_font_REQUIRES='$win32_font_REQUIRES' + win32_font_NONPKGCONFIG_LIBS='$win32_font_NONPKGCONFIG_LIBS' + win32_font_NONPKGCONFIG_EXTRA_LIBS='$win32_font_NONPKGCONFIG_EXTRA_LIBS' + win32_font_NONPKGCONFIG_CFLAGS='$win32_font_NONPKGCONFIG_CFLAGS' + + SED='$SED' + skia_BASE='$skia_BASE' + skia_REQUIRES='$skia_REQUIRES' + skia_NONPKGCONFIG_LIBS='$skia_NONPKGCONFIG_LIBS' + skia_NONPKGCONFIG_EXTRA_LIBS='$skia_NONPKGCONFIG_EXTRA_LIBS' + skia_NONPKGCONFIG_CFLAGS='$skia_NONPKGCONFIG_CFLAGS' + + SED='$SED' + skia_BASE='$skia_BASE' + skia_REQUIRES='$skia_REQUIRES' + skia_NONPKGCONFIG_LIBS='$skia_NONPKGCONFIG_LIBS' + skia_NONPKGCONFIG_EXTRA_LIBS='$skia_NONPKGCONFIG_EXTRA_LIBS' + skia_NONPKGCONFIG_CFLAGS='$skia_NONPKGCONFIG_CFLAGS' + + SED='$SED' + os2_BASE='$os2_BASE' + os2_REQUIRES='$os2_REQUIRES' + os2_NONPKGCONFIG_LIBS='$os2_NONPKGCONFIG_LIBS' + os2_NONPKGCONFIG_EXTRA_LIBS='$os2_NONPKGCONFIG_EXTRA_LIBS' + os2_NONPKGCONFIG_CFLAGS='$os2_NONPKGCONFIG_CFLAGS' + + SED='$SED' + os2_BASE='$os2_BASE' + os2_REQUIRES='$os2_REQUIRES' + os2_NONPKGCONFIG_LIBS='$os2_NONPKGCONFIG_LIBS' + os2_NONPKGCONFIG_EXTRA_LIBS='$os2_NONPKGCONFIG_EXTRA_LIBS' + os2_NONPKGCONFIG_CFLAGS='$os2_NONPKGCONFIG_CFLAGS' + + SED='$SED' + beos_BASE='$beos_BASE' + beos_REQUIRES='$beos_REQUIRES' + beos_NONPKGCONFIG_LIBS='$beos_NONPKGCONFIG_LIBS' + beos_NONPKGCONFIG_EXTRA_LIBS='$beos_NONPKGCONFIG_EXTRA_LIBS' + beos_NONPKGCONFIG_CFLAGS='$beos_NONPKGCONFIG_CFLAGS' + + SED='$SED' + beos_BASE='$beos_BASE' + beos_REQUIRES='$beos_REQUIRES' + beos_NONPKGCONFIG_LIBS='$beos_NONPKGCONFIG_LIBS' + beos_NONPKGCONFIG_EXTRA_LIBS='$beos_NONPKGCONFIG_EXTRA_LIBS' + beos_NONPKGCONFIG_CFLAGS='$beos_NONPKGCONFIG_CFLAGS' + + SED='$SED' + drm_BASE='$drm_BASE' + drm_REQUIRES='$drm_REQUIRES' + drm_NONPKGCONFIG_LIBS='$drm_NONPKGCONFIG_LIBS' + drm_NONPKGCONFIG_EXTRA_LIBS='$drm_NONPKGCONFIG_EXTRA_LIBS' + drm_NONPKGCONFIG_CFLAGS='$drm_NONPKGCONFIG_CFLAGS' + + SED='$SED' + drm_BASE='$drm_BASE' + drm_REQUIRES='$drm_REQUIRES' + drm_NONPKGCONFIG_LIBS='$drm_NONPKGCONFIG_LIBS' + drm_NONPKGCONFIG_EXTRA_LIBS='$drm_NONPKGCONFIG_EXTRA_LIBS' + drm_NONPKGCONFIG_CFLAGS='$drm_NONPKGCONFIG_CFLAGS' + + SED='$SED' + gallium_BASE='$gallium_BASE' + gallium_REQUIRES='$gallium_REQUIRES' + gallium_NONPKGCONFIG_LIBS='$gallium_NONPKGCONFIG_LIBS' + gallium_NONPKGCONFIG_EXTRA_LIBS='$gallium_NONPKGCONFIG_EXTRA_LIBS' + gallium_NONPKGCONFIG_CFLAGS='$gallium_NONPKGCONFIG_CFLAGS' + + SED='$SED' + gallium_BASE='$gallium_BASE' + gallium_REQUIRES='$gallium_REQUIRES' + gallium_NONPKGCONFIG_LIBS='$gallium_NONPKGCONFIG_LIBS' + gallium_NONPKGCONFIG_EXTRA_LIBS='$gallium_NONPKGCONFIG_EXTRA_LIBS' + gallium_NONPKGCONFIG_CFLAGS='$gallium_NONPKGCONFIG_CFLAGS' + + SED='$SED' + png_BASE='$png_BASE' + png_REQUIRES='$png_REQUIRES' + png_NONPKGCONFIG_LIBS='$png_NONPKGCONFIG_LIBS' + png_NONPKGCONFIG_EXTRA_LIBS='$png_NONPKGCONFIG_EXTRA_LIBS' + png_NONPKGCONFIG_CFLAGS='$png_NONPKGCONFIG_CFLAGS' + + SED='$SED' + png_BASE='$png_BASE' + png_REQUIRES='$png_REQUIRES' + png_NONPKGCONFIG_LIBS='$png_NONPKGCONFIG_LIBS' + png_NONPKGCONFIG_EXTRA_LIBS='$png_NONPKGCONFIG_EXTRA_LIBS' + png_NONPKGCONFIG_CFLAGS='$png_NONPKGCONFIG_CFLAGS' + + SED='$SED' + gl_BASE='$gl_BASE' + gl_REQUIRES='$gl_REQUIRES' + gl_NONPKGCONFIG_LIBS='$gl_NONPKGCONFIG_LIBS' + gl_NONPKGCONFIG_EXTRA_LIBS='$gl_NONPKGCONFIG_EXTRA_LIBS' + gl_NONPKGCONFIG_CFLAGS='$gl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + gl_BASE='$gl_BASE' + gl_REQUIRES='$gl_REQUIRES' + gl_NONPKGCONFIG_LIBS='$gl_NONPKGCONFIG_LIBS' + gl_NONPKGCONFIG_EXTRA_LIBS='$gl_NONPKGCONFIG_EXTRA_LIBS' + gl_NONPKGCONFIG_CFLAGS='$gl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + glesv2_BASE='$glesv2_BASE' + glesv2_REQUIRES='$glesv2_REQUIRES' + glesv2_NONPKGCONFIG_LIBS='$glesv2_NONPKGCONFIG_LIBS' + glesv2_NONPKGCONFIG_EXTRA_LIBS='$glesv2_NONPKGCONFIG_EXTRA_LIBS' + glesv2_NONPKGCONFIG_CFLAGS='$glesv2_NONPKGCONFIG_CFLAGS' + + SED='$SED' + glesv2_BASE='$glesv2_BASE' + glesv2_REQUIRES='$glesv2_REQUIRES' + glesv2_NONPKGCONFIG_LIBS='$glesv2_NONPKGCONFIG_LIBS' + glesv2_NONPKGCONFIG_EXTRA_LIBS='$glesv2_NONPKGCONFIG_EXTRA_LIBS' + glesv2_NONPKGCONFIG_CFLAGS='$glesv2_NONPKGCONFIG_CFLAGS' + + SED='$SED' + cogl_BASE='$cogl_BASE' + cogl_REQUIRES='$cogl_REQUIRES' + cogl_NONPKGCONFIG_LIBS='$cogl_NONPKGCONFIG_LIBS' + cogl_NONPKGCONFIG_EXTRA_LIBS='$cogl_NONPKGCONFIG_EXTRA_LIBS' + cogl_NONPKGCONFIG_CFLAGS='$cogl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + cogl_BASE='$cogl_BASE' + cogl_REQUIRES='$cogl_REQUIRES' + cogl_NONPKGCONFIG_LIBS='$cogl_NONPKGCONFIG_LIBS' + cogl_NONPKGCONFIG_EXTRA_LIBS='$cogl_NONPKGCONFIG_EXTRA_LIBS' + cogl_NONPKGCONFIG_CFLAGS='$cogl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + directfb_BASE='$directfb_BASE' + directfb_REQUIRES='$directfb_REQUIRES' + directfb_NONPKGCONFIG_LIBS='$directfb_NONPKGCONFIG_LIBS' + directfb_NONPKGCONFIG_EXTRA_LIBS='$directfb_NONPKGCONFIG_EXTRA_LIBS' + directfb_NONPKGCONFIG_CFLAGS='$directfb_NONPKGCONFIG_CFLAGS' + + SED='$SED' + directfb_BASE='$directfb_BASE' + directfb_REQUIRES='$directfb_REQUIRES' + directfb_NONPKGCONFIG_LIBS='$directfb_NONPKGCONFIG_LIBS' + directfb_NONPKGCONFIG_EXTRA_LIBS='$directfb_NONPKGCONFIG_EXTRA_LIBS' + directfb_NONPKGCONFIG_CFLAGS='$directfb_NONPKGCONFIG_CFLAGS' + + SED='$SED' + vg_BASE='$vg_BASE' + vg_REQUIRES='$vg_REQUIRES' + vg_NONPKGCONFIG_LIBS='$vg_NONPKGCONFIG_LIBS' + vg_NONPKGCONFIG_EXTRA_LIBS='$vg_NONPKGCONFIG_EXTRA_LIBS' + vg_NONPKGCONFIG_CFLAGS='$vg_NONPKGCONFIG_CFLAGS' + + SED='$SED' + vg_BASE='$vg_BASE' + vg_REQUIRES='$vg_REQUIRES' + vg_NONPKGCONFIG_LIBS='$vg_NONPKGCONFIG_LIBS' + vg_NONPKGCONFIG_EXTRA_LIBS='$vg_NONPKGCONFIG_EXTRA_LIBS' + vg_NONPKGCONFIG_CFLAGS='$vg_NONPKGCONFIG_CFLAGS' + + SED='$SED' + egl_BASE='$egl_BASE' + egl_REQUIRES='$egl_REQUIRES' + egl_NONPKGCONFIG_LIBS='$egl_NONPKGCONFIG_LIBS' + egl_NONPKGCONFIG_EXTRA_LIBS='$egl_NONPKGCONFIG_EXTRA_LIBS' + egl_NONPKGCONFIG_CFLAGS='$egl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + egl_BASE='$egl_BASE' + egl_REQUIRES='$egl_REQUIRES' + egl_NONPKGCONFIG_LIBS='$egl_NONPKGCONFIG_LIBS' + egl_NONPKGCONFIG_EXTRA_LIBS='$egl_NONPKGCONFIG_EXTRA_LIBS' + egl_NONPKGCONFIG_CFLAGS='$egl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + glx_BASE='$glx_BASE' + glx_REQUIRES='$glx_REQUIRES' + glx_NONPKGCONFIG_LIBS='$glx_NONPKGCONFIG_LIBS' + glx_NONPKGCONFIG_EXTRA_LIBS='$glx_NONPKGCONFIG_EXTRA_LIBS' + glx_NONPKGCONFIG_CFLAGS='$glx_NONPKGCONFIG_CFLAGS' + + SED='$SED' + glx_BASE='$glx_BASE' + glx_REQUIRES='$glx_REQUIRES' + glx_NONPKGCONFIG_LIBS='$glx_NONPKGCONFIG_LIBS' + glx_NONPKGCONFIG_EXTRA_LIBS='$glx_NONPKGCONFIG_EXTRA_LIBS' + glx_NONPKGCONFIG_CFLAGS='$glx_NONPKGCONFIG_CFLAGS' + + SED='$SED' + wgl_BASE='$wgl_BASE' + wgl_REQUIRES='$wgl_REQUIRES' + wgl_NONPKGCONFIG_LIBS='$wgl_NONPKGCONFIG_LIBS' + wgl_NONPKGCONFIG_EXTRA_LIBS='$wgl_NONPKGCONFIG_EXTRA_LIBS' + wgl_NONPKGCONFIG_CFLAGS='$wgl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + wgl_BASE='$wgl_BASE' + wgl_REQUIRES='$wgl_REQUIRES' + wgl_NONPKGCONFIG_LIBS='$wgl_NONPKGCONFIG_LIBS' + wgl_NONPKGCONFIG_EXTRA_LIBS='$wgl_NONPKGCONFIG_EXTRA_LIBS' + wgl_NONPKGCONFIG_CFLAGS='$wgl_NONPKGCONFIG_CFLAGS' + + SED='$SED' + script_BASE='$script_BASE' + script_REQUIRES='$script_REQUIRES' + script_NONPKGCONFIG_LIBS='$script_NONPKGCONFIG_LIBS' + script_NONPKGCONFIG_EXTRA_LIBS='$script_NONPKGCONFIG_EXTRA_LIBS' + script_NONPKGCONFIG_CFLAGS='$script_NONPKGCONFIG_CFLAGS' + + SED='$SED' + script_BASE='$script_BASE' + script_REQUIRES='$script_REQUIRES' + script_NONPKGCONFIG_LIBS='$script_NONPKGCONFIG_LIBS' + script_NONPKGCONFIG_EXTRA_LIBS='$script_NONPKGCONFIG_EXTRA_LIBS' + script_NONPKGCONFIG_CFLAGS='$script_NONPKGCONFIG_CFLAGS' + + SED='$SED' + ft_BASE='$ft_BASE' + ft_REQUIRES='$ft_REQUIRES' + ft_NONPKGCONFIG_LIBS='$ft_NONPKGCONFIG_LIBS' + ft_NONPKGCONFIG_EXTRA_LIBS='$ft_NONPKGCONFIG_EXTRA_LIBS' + ft_NONPKGCONFIG_CFLAGS='$ft_NONPKGCONFIG_CFLAGS' + + SED='$SED' + ft_BASE='$ft_BASE' + ft_REQUIRES='$ft_REQUIRES' + ft_NONPKGCONFIG_LIBS='$ft_NONPKGCONFIG_LIBS' + ft_NONPKGCONFIG_EXTRA_LIBS='$ft_NONPKGCONFIG_EXTRA_LIBS' + ft_NONPKGCONFIG_CFLAGS='$ft_NONPKGCONFIG_CFLAGS' + + SED='$SED' + fc_BASE='$fc_BASE' + fc_REQUIRES='$fc_REQUIRES' + fc_NONPKGCONFIG_LIBS='$fc_NONPKGCONFIG_LIBS' + fc_NONPKGCONFIG_EXTRA_LIBS='$fc_NONPKGCONFIG_EXTRA_LIBS' + fc_NONPKGCONFIG_CFLAGS='$fc_NONPKGCONFIG_CFLAGS' + + SED='$SED' + fc_BASE='$fc_BASE' + fc_REQUIRES='$fc_REQUIRES' + fc_NONPKGCONFIG_LIBS='$fc_NONPKGCONFIG_LIBS' + fc_NONPKGCONFIG_EXTRA_LIBS='$fc_NONPKGCONFIG_EXTRA_LIBS' + fc_NONPKGCONFIG_CFLAGS='$fc_NONPKGCONFIG_CFLAGS' + + SED='$SED' + ps_BASE='$ps_BASE' + ps_REQUIRES='$ps_REQUIRES' + ps_NONPKGCONFIG_LIBS='$ps_NONPKGCONFIG_LIBS' + ps_NONPKGCONFIG_EXTRA_LIBS='$ps_NONPKGCONFIG_EXTRA_LIBS' + ps_NONPKGCONFIG_CFLAGS='$ps_NONPKGCONFIG_CFLAGS' + + SED='$SED' + ps_BASE='$ps_BASE' + ps_REQUIRES='$ps_REQUIRES' + ps_NONPKGCONFIG_LIBS='$ps_NONPKGCONFIG_LIBS' + ps_NONPKGCONFIG_EXTRA_LIBS='$ps_NONPKGCONFIG_EXTRA_LIBS' + ps_NONPKGCONFIG_CFLAGS='$ps_NONPKGCONFIG_CFLAGS' + + SED='$SED' + pdf_BASE='$pdf_BASE' + pdf_REQUIRES='$pdf_REQUIRES' + pdf_NONPKGCONFIG_LIBS='$pdf_NONPKGCONFIG_LIBS' + pdf_NONPKGCONFIG_EXTRA_LIBS='$pdf_NONPKGCONFIG_EXTRA_LIBS' + pdf_NONPKGCONFIG_CFLAGS='$pdf_NONPKGCONFIG_CFLAGS' + + SED='$SED' + pdf_BASE='$pdf_BASE' + pdf_REQUIRES='$pdf_REQUIRES' + pdf_NONPKGCONFIG_LIBS='$pdf_NONPKGCONFIG_LIBS' + pdf_NONPKGCONFIG_EXTRA_LIBS='$pdf_NONPKGCONFIG_EXTRA_LIBS' + pdf_NONPKGCONFIG_CFLAGS='$pdf_NONPKGCONFIG_CFLAGS' + + SED='$SED' + svg_BASE='$svg_BASE' + svg_REQUIRES='$svg_REQUIRES' + svg_NONPKGCONFIG_LIBS='$svg_NONPKGCONFIG_LIBS' + svg_NONPKGCONFIG_EXTRA_LIBS='$svg_NONPKGCONFIG_EXTRA_LIBS' + svg_NONPKGCONFIG_CFLAGS='$svg_NONPKGCONFIG_CFLAGS' + + SED='$SED' + svg_BASE='$svg_BASE' + svg_REQUIRES='$svg_REQUIRES' + svg_NONPKGCONFIG_LIBS='$svg_NONPKGCONFIG_LIBS' + svg_NONPKGCONFIG_EXTRA_LIBS='$svg_NONPKGCONFIG_EXTRA_LIBS' + svg_NONPKGCONFIG_CFLAGS='$svg_NONPKGCONFIG_CFLAGS' + + SED='$SED' + tee_BASE='$tee_BASE' + tee_REQUIRES='$tee_REQUIRES' + tee_NONPKGCONFIG_LIBS='$tee_NONPKGCONFIG_LIBS' + tee_NONPKGCONFIG_EXTRA_LIBS='$tee_NONPKGCONFIG_EXTRA_LIBS' + tee_NONPKGCONFIG_CFLAGS='$tee_NONPKGCONFIG_CFLAGS' + + SED='$SED' + tee_BASE='$tee_BASE' + tee_REQUIRES='$tee_REQUIRES' + tee_NONPKGCONFIG_LIBS='$tee_NONPKGCONFIG_LIBS' + tee_NONPKGCONFIG_EXTRA_LIBS='$tee_NONPKGCONFIG_EXTRA_LIBS' + tee_NONPKGCONFIG_CFLAGS='$tee_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xml_BASE='$xml_BASE' + xml_REQUIRES='$xml_REQUIRES' + xml_NONPKGCONFIG_LIBS='$xml_NONPKGCONFIG_LIBS' + xml_NONPKGCONFIG_EXTRA_LIBS='$xml_NONPKGCONFIG_EXTRA_LIBS' + xml_NONPKGCONFIG_CFLAGS='$xml_NONPKGCONFIG_CFLAGS' + + SED='$SED' + xml_BASE='$xml_BASE' + xml_REQUIRES='$xml_REQUIRES' + xml_NONPKGCONFIG_LIBS='$xml_NONPKGCONFIG_LIBS' + xml_NONPKGCONFIG_EXTRA_LIBS='$xml_NONPKGCONFIG_EXTRA_LIBS' + xml_NONPKGCONFIG_CFLAGS='$xml_NONPKGCONFIG_CFLAGS' + + SED='$SED' + gobject_BASE='$gobject_BASE' + gobject_REQUIRES='$gobject_REQUIRES' + gobject_NONPKGCONFIG_LIBS='$gobject_NONPKGCONFIG_LIBS' + gobject_NONPKGCONFIG_EXTRA_LIBS='$gobject_NONPKGCONFIG_EXTRA_LIBS' + gobject_NONPKGCONFIG_CFLAGS='$gobject_NONPKGCONFIG_CFLAGS' + + SED='$SED' + gobject_BASE='$gobject_BASE' + gobject_REQUIRES='$gobject_REQUIRES' + gobject_NONPKGCONFIG_LIBS='$gobject_NONPKGCONFIG_LIBS' + gobject_NONPKGCONFIG_EXTRA_LIBS='$gobject_NONPKGCONFIG_EXTRA_LIBS' + gobject_NONPKGCONFIG_CFLAGS='$gobject_NONPKGCONFIG_CFLAGS' + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "$srcdir/build/Makefile.win32.features") CONFIG_COMMANDS="$CONFIG_COMMANDS $srcdir/build/Makefile.win32.features" ;; + "$srcdir/src/Makefile.am.features") CONFIG_COMMANDS="$CONFIG_COMMANDS $srcdir/src/Makefile.am.features" ;; + "$srcdir/src/Makefile.win32.features") CONFIG_COMMANDS="$CONFIG_COMMANDS $srcdir/src/Makefile.win32.features" ;; + "$srcdir/boilerplate/Makefile.am.features") CONFIG_COMMANDS="$CONFIG_COMMANDS $srcdir/boilerplate/Makefile.am.features" ;; + "$srcdir/boilerplate/Makefile.win32.features") CONFIG_COMMANDS="$CONFIG_COMMANDS $srcdir/boilerplate/Makefile.win32.features" ;; + "src/cairo.pc") CONFIG_FILES="$CONFIG_FILES src/cairo.pc" ;; + "cairo-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-uninstalled.pc:src/cairo-uninstalled.pc.in" ;; + "src/cairo-features.h") CONFIG_COMMANDS="$CONFIG_COMMANDS src/cairo-features.h" ;; + "src/cairo-supported-features.h") CONFIG_COMMANDS="$CONFIG_COMMANDS src/cairo-supported-features.h" ;; + "$srcdir/build/Makefile.win32.features-h") CONFIG_COMMANDS="$CONFIG_COMMANDS $srcdir/build/Makefile.win32.features-h" ;; + "src/cairo-xlib.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-xlib.pc:src/cairo-features.pc.in" ;; + "cairo-xlib-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-xlib-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-xlib-xrender.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-xlib-xrender.pc:src/cairo-features.pc.in" ;; + "cairo-xlib-xrender-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-xlib-xrender-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-xcb.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-xcb.pc:src/cairo-features.pc.in" ;; + "cairo-xcb-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-xcb-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-xlib-xcb.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-xlib-xcb.pc:src/cairo-features.pc.in" ;; + "cairo-xlib-xcb-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-xlib-xcb-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-xcb-shm.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-xcb-shm.pc:src/cairo-features.pc.in" ;; + "cairo-xcb-shm-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-xcb-shm-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-qt.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-qt.pc:src/cairo-features.pc.in" ;; + "cairo-qt-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-qt-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-quartz.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-quartz.pc:src/cairo-features.pc.in" ;; + "cairo-quartz-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-quartz-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-quartz-font.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-quartz-font.pc:src/cairo-features.pc.in" ;; + "cairo-quartz-font-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-quartz-font-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-quartz-image.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-quartz-image.pc:src/cairo-features.pc.in" ;; + "cairo-quartz-image-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-quartz-image-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-win32.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-win32.pc:src/cairo-features.pc.in" ;; + "cairo-win32-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-win32-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-win32-font.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-win32-font.pc:src/cairo-features.pc.in" ;; + "cairo-win32-font-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-win32-font-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-skia.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-skia.pc:src/cairo-features.pc.in" ;; + "cairo-skia-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-skia-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-os2.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-os2.pc:src/cairo-features.pc.in" ;; + "cairo-os2-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-os2-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-beos.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-beos.pc:src/cairo-features.pc.in" ;; + "cairo-beos-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-beos-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-drm.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-drm.pc:src/cairo-features.pc.in" ;; + "cairo-drm-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-drm-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-gallium.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-gallium.pc:src/cairo-features.pc.in" ;; + "cairo-gallium-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-gallium-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-png.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-png.pc:src/cairo-features.pc.in" ;; + "cairo-png-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-png-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-gl.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-gl.pc:src/cairo-features.pc.in" ;; + "cairo-gl-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-gl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-glesv2.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-glesv2.pc:src/cairo-features.pc.in" ;; + "cairo-glesv2-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-glesv2-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-cogl.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-cogl.pc:src/cairo-features.pc.in" ;; + "cairo-cogl-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-cogl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-directfb.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-directfb.pc:src/cairo-features.pc.in" ;; + "cairo-directfb-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-directfb-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-vg.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-vg.pc:src/cairo-features.pc.in" ;; + "cairo-vg-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-vg-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-egl.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-egl.pc:src/cairo-features.pc.in" ;; + "cairo-egl-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-egl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-glx.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-glx.pc:src/cairo-features.pc.in" ;; + "cairo-glx-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-glx-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-wgl.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-wgl.pc:src/cairo-features.pc.in" ;; + "cairo-wgl-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-wgl-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-script.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-script.pc:src/cairo-features.pc.in" ;; + "cairo-script-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-script-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-ft.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-ft.pc:src/cairo-features.pc.in" ;; + "cairo-ft-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-ft-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-fc.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-fc.pc:src/cairo-features.pc.in" ;; + "cairo-fc-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-fc-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-ps.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-ps.pc:src/cairo-features.pc.in" ;; + "cairo-ps-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-ps-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-pdf.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-pdf.pc:src/cairo-features.pc.in" ;; + "cairo-pdf-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-pdf-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-svg.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-svg.pc:src/cairo-features.pc.in" ;; + "cairo-svg-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-svg-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-tee.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-tee.pc:src/cairo-features.pc.in" ;; + "cairo-tee-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-tee-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-xml.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-xml.pc:src/cairo-features.pc.in" ;; + "cairo-xml-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-xml-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "src/cairo-gobject.pc") CONFIG_FILES="$CONFIG_FILES src/cairo-gobject.pc:src/cairo-features.pc.in" ;; + "cairo-gobject-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES cairo-gobject-uninstalled.pc:src/cairo-features-uninstalled.pc.in" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "boilerplate/Makefile") CONFIG_FILES="$CONFIG_FILES boilerplate/Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; + "test/pdiff/Makefile") CONFIG_FILES="$CONFIG_FILES test/pdiff/Makefile" ;; + "perf/Makefile") CONFIG_FILES="$CONFIG_FILES perf/Makefile" ;; + "perf/micro/Makefile") CONFIG_FILES="$CONFIG_FILES perf/micro/Makefile" ;; + "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;; + "util/cairo-fdr/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-fdr/Makefile" ;; + "util/cairo-gobject/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-gobject/Makefile" ;; + "util/cairo-missing/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-missing/Makefile" ;; + "util/cairo-script/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-script/Makefile" ;; + "util/cairo-script/examples/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-script/examples/Makefile" ;; + "util/cairo-sphinx/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-sphinx/Makefile" ;; + "util/cairo-trace/Makefile") CONFIG_FILES="$CONFIG_FILES util/cairo-trace/Makefile" ;; + "util/cairo-trace/cairo-trace") CONFIG_FILES="$CONFIG_FILES util/cairo-trace/cairo-trace" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/public/Makefile") CONFIG_FILES="$CONFIG_FILES doc/public/Makefile" ;; + "cairo-trace") CONFIG_COMMANDS="$CONFIG_COMMANDS cairo-trace" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "$srcdir/build/Makefile.win32.features":C) + _config_file=$srcdir/build/Makefile.win32.features + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo "$CAIRO_MAKEFILE___WIN32" + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "$srcdir/src/Makefile.am.features":C) + _config_file=$srcdir/src/Makefile.am.features + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo "$CAIRO_MAKEFILE_cairo_AMAKE" + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "$srcdir/src/Makefile.win32.features":C) + _config_file=$srcdir/src/Makefile.win32.features + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo "$CAIRO_MAKEFILE_cairo_WIN32" + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "$srcdir/boilerplate/Makefile.am.features":C) + _config_file=$srcdir/boilerplate/Makefile.am.features + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo "$CAIRO_MAKEFILE_cairo_boilerplate_AMAKE" + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "$srcdir/boilerplate/Makefile.win32.features":C) + _config_file=$srcdir/boilerplate/Makefile.win32.features + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo "$CAIRO_MAKEFILE_cairo_boilerplate_WIN32" + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "src/cairo-features.h":C) + _config_file=src/cairo-features.h + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo '/* Generated by configure. Do not edit. */' + echo '#ifndef CAIRO_FEATURES_H' + echo '#define CAIRO_FEATURES_H' + echo '' + for FEATURE in $CAIRO_FEATURES; do + echo "#define $FEATURE 1" + done | LANG=C sort + echo '' + for FEATURE in $CAIRO_NO_FEATURES; do + echo "/*#undef $FEATURE */" + done | LANG=C sort + echo '' + echo '#endif' + + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "src/cairo-supported-features.h":C) + _config_file=src/cairo-supported-features.h + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo '/* Generated by configure. Do not edit. */' + echo '#ifndef CAIRO_SUPPORTED_FEATURES_H' + echo '#define CAIRO_SUPPORTED_FEATURES_H' + echo '' + echo '/* This is a dummy header, to trick gtk-doc only */' + echo '' + for FEATURE in $CAIRO_SUPPORTED_FEATURES; do + echo "#define $FEATURE 1" + done + echo '' + echo '#endif' + + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "$srcdir/build/Makefile.win32.features-h":C) + _config_file=$srcdir/build/Makefile.win32.features-h + _tmp_file=cairoconf.tmp + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $_config_file" >&5 +$as_echo "$as_me: creating $_config_file" >&6;} + { + echo "$CAIRO_MAKEFILE_win32_features_h_WIN32" + } >> "$_tmp_file" || + as_fn_error $? "failed to write to $_tmp_file" "$LINENO" 5 + + if cmp -s "$_tmp_file" "$_config_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $_config_file is unchanged" >&5 +$as_echo "$as_me: $_config_file is unchanged" >&6;} + rm -f "$_tmp_file" + else + mv "$_tmp_file" "$_config_file" || + as_fn_error $? "failed to update $_config_file" "$LINENO" 5 + fi + ;; + "src/cairo-xlib.pc":F) mv "src/cairo-xlib.pc" "src/cairo-xlib.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xlib%g; s%@FEATURE_NAME@%Xlib surface backend%g; s%@FEATURE_BASE@%$xlib_BASE%g; s%@FEATURE_REQUIRES@%$xlib_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xlib_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xlib_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xlib_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-xlib.pc.tmp" > "src/cairo-xlib.pc" && rm -f "src/cairo-xlib.pc.tmp" || + as_fn_error $? "failed to update src/cairo-xlib.pc" "$LINENO" 5 + ;; + "cairo-xlib-uninstalled.pc":F) mv "cairo-xlib-uninstalled.pc" "cairo-xlib-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xlib%g; s%@FEATURE_NAME@%Xlib surface backend%g; s%@FEATURE_BASE@%$xlib_BASE%g; s%@FEATURE_REQUIRES@%$xlib_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xlib_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xlib_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xlib_NONPKGCONFIG_CFLAGS%g; " < "cairo-xlib-uninstalled.pc.tmp" > "cairo-xlib-uninstalled.pc" && rm -f "cairo-xlib-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-xlib-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-xlib-xrender.pc":F) mv "src/cairo-xlib-xrender.pc" "src/cairo-xlib-xrender.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xlib-xrender%g; s%@FEATURE_NAME@%Xlib Xrender surface backend%g; s%@FEATURE_BASE@%$xlib_xrender_BASE%g; s%@FEATURE_REQUIRES@%$xlib_xrender_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xlib_xrender_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xlib_xrender_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xlib_xrender_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-xlib-xrender.pc.tmp" > "src/cairo-xlib-xrender.pc" && rm -f "src/cairo-xlib-xrender.pc.tmp" || + as_fn_error $? "failed to update src/cairo-xlib-xrender.pc" "$LINENO" 5 + ;; + "cairo-xlib-xrender-uninstalled.pc":F) mv "cairo-xlib-xrender-uninstalled.pc" "cairo-xlib-xrender-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xlib-xrender%g; s%@FEATURE_NAME@%Xlib Xrender surface backend%g; s%@FEATURE_BASE@%$xlib_xrender_BASE%g; s%@FEATURE_REQUIRES@%$xlib_xrender_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xlib_xrender_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xlib_xrender_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xlib_xrender_NONPKGCONFIG_CFLAGS%g; " < "cairo-xlib-xrender-uninstalled.pc.tmp" > "cairo-xlib-xrender-uninstalled.pc" && rm -f "cairo-xlib-xrender-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-xlib-xrender-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-xcb.pc":F) mv "src/cairo-xcb.pc" "src/cairo-xcb.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xcb%g; s%@FEATURE_NAME@%XCB surface backend%g; s%@FEATURE_BASE@%$xcb_BASE%g; s%@FEATURE_REQUIRES@%$xcb_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xcb_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xcb_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xcb_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-xcb.pc.tmp" > "src/cairo-xcb.pc" && rm -f "src/cairo-xcb.pc.tmp" || + as_fn_error $? "failed to update src/cairo-xcb.pc" "$LINENO" 5 + ;; + "cairo-xcb-uninstalled.pc":F) mv "cairo-xcb-uninstalled.pc" "cairo-xcb-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xcb%g; s%@FEATURE_NAME@%XCB surface backend%g; s%@FEATURE_BASE@%$xcb_BASE%g; s%@FEATURE_REQUIRES@%$xcb_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xcb_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xcb_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xcb_NONPKGCONFIG_CFLAGS%g; " < "cairo-xcb-uninstalled.pc.tmp" > "cairo-xcb-uninstalled.pc" && rm -f "cairo-xcb-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-xcb-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-xlib-xcb.pc":F) mv "src/cairo-xlib-xcb.pc" "src/cairo-xlib-xcb.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xlib-xcb%g; s%@FEATURE_NAME@%Xlib/XCB functions%g; s%@FEATURE_BASE@%$xlib_xcb_BASE%g; s%@FEATURE_REQUIRES@%$xlib_xcb_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xlib_xcb_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xlib_xcb_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xlib_xcb_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-xlib-xcb.pc.tmp" > "src/cairo-xlib-xcb.pc" && rm -f "src/cairo-xlib-xcb.pc.tmp" || + as_fn_error $? "failed to update src/cairo-xlib-xcb.pc" "$LINENO" 5 + ;; + "cairo-xlib-xcb-uninstalled.pc":F) mv "cairo-xlib-xcb-uninstalled.pc" "cairo-xlib-xcb-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xlib-xcb%g; s%@FEATURE_NAME@%Xlib/XCB functions%g; s%@FEATURE_BASE@%$xlib_xcb_BASE%g; s%@FEATURE_REQUIRES@%$xlib_xcb_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xlib_xcb_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xlib_xcb_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xlib_xcb_NONPKGCONFIG_CFLAGS%g; " < "cairo-xlib-xcb-uninstalled.pc.tmp" > "cairo-xlib-xcb-uninstalled.pc" && rm -f "cairo-xlib-xcb-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-xlib-xcb-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-xcb-shm.pc":F) mv "src/cairo-xcb-shm.pc" "src/cairo-xcb-shm.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xcb-shm%g; s%@FEATURE_NAME@%XCB/SHM functions%g; s%@FEATURE_BASE@%$xcb_shm_BASE%g; s%@FEATURE_REQUIRES@%$xcb_shm_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xcb_shm_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xcb_shm_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xcb_shm_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-xcb-shm.pc.tmp" > "src/cairo-xcb-shm.pc" && rm -f "src/cairo-xcb-shm.pc.tmp" || + as_fn_error $? "failed to update src/cairo-xcb-shm.pc" "$LINENO" 5 + ;; + "cairo-xcb-shm-uninstalled.pc":F) mv "cairo-xcb-shm-uninstalled.pc" "cairo-xcb-shm-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xcb-shm%g; s%@FEATURE_NAME@%XCB/SHM functions%g; s%@FEATURE_BASE@%$xcb_shm_BASE%g; s%@FEATURE_REQUIRES@%$xcb_shm_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xcb_shm_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xcb_shm_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xcb_shm_NONPKGCONFIG_CFLAGS%g; " < "cairo-xcb-shm-uninstalled.pc.tmp" > "cairo-xcb-shm-uninstalled.pc" && rm -f "cairo-xcb-shm-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-xcb-shm-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-qt.pc":F) mv "src/cairo-qt.pc" "src/cairo-qt.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-qt%g; s%@FEATURE_NAME@%Qt surface backend%g; s%@FEATURE_BASE@%$qt_BASE%g; s%@FEATURE_REQUIRES@%$qt_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$qt_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$qt_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$qt_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-qt.pc.tmp" > "src/cairo-qt.pc" && rm -f "src/cairo-qt.pc.tmp" || + as_fn_error $? "failed to update src/cairo-qt.pc" "$LINENO" 5 + ;; + "cairo-qt-uninstalled.pc":F) mv "cairo-qt-uninstalled.pc" "cairo-qt-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-qt%g; s%@FEATURE_NAME@%Qt surface backend%g; s%@FEATURE_BASE@%$qt_BASE%g; s%@FEATURE_REQUIRES@%$qt_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$qt_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$qt_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$qt_NONPKGCONFIG_CFLAGS%g; " < "cairo-qt-uninstalled.pc.tmp" > "cairo-qt-uninstalled.pc" && rm -f "cairo-qt-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-qt-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-quartz.pc":F) mv "src/cairo-quartz.pc" "src/cairo-quartz.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-quartz%g; s%@FEATURE_NAME@%Quartz surface backend%g; s%@FEATURE_BASE@%$quartz_BASE%g; s%@FEATURE_REQUIRES@%$quartz_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$quartz_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$quartz_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$quartz_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-quartz.pc.tmp" > "src/cairo-quartz.pc" && rm -f "src/cairo-quartz.pc.tmp" || + as_fn_error $? "failed to update src/cairo-quartz.pc" "$LINENO" 5 + ;; + "cairo-quartz-uninstalled.pc":F) mv "cairo-quartz-uninstalled.pc" "cairo-quartz-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-quartz%g; s%@FEATURE_NAME@%Quartz surface backend%g; s%@FEATURE_BASE@%$quartz_BASE%g; s%@FEATURE_REQUIRES@%$quartz_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$quartz_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$quartz_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$quartz_NONPKGCONFIG_CFLAGS%g; " < "cairo-quartz-uninstalled.pc.tmp" > "cairo-quartz-uninstalled.pc" && rm -f "cairo-quartz-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-quartz-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-quartz-font.pc":F) mv "src/cairo-quartz-font.pc" "src/cairo-quartz-font.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-quartz-font%g; s%@FEATURE_NAME@%Quartz font backend%g; s%@FEATURE_BASE@%$quartz_font_BASE%g; s%@FEATURE_REQUIRES@%$quartz_font_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$quartz_font_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$quartz_font_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$quartz_font_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-quartz-font.pc.tmp" > "src/cairo-quartz-font.pc" && rm -f "src/cairo-quartz-font.pc.tmp" || + as_fn_error $? "failed to update src/cairo-quartz-font.pc" "$LINENO" 5 + ;; + "cairo-quartz-font-uninstalled.pc":F) mv "cairo-quartz-font-uninstalled.pc" "cairo-quartz-font-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-quartz-font%g; s%@FEATURE_NAME@%Quartz font backend%g; s%@FEATURE_BASE@%$quartz_font_BASE%g; s%@FEATURE_REQUIRES@%$quartz_font_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$quartz_font_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$quartz_font_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$quartz_font_NONPKGCONFIG_CFLAGS%g; " < "cairo-quartz-font-uninstalled.pc.tmp" > "cairo-quartz-font-uninstalled.pc" && rm -f "cairo-quartz-font-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-quartz-font-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-quartz-image.pc":F) mv "src/cairo-quartz-image.pc" "src/cairo-quartz-image.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-quartz-image%g; s%@FEATURE_NAME@%Quartz Image surface backend%g; s%@FEATURE_BASE@%$quartz_image_BASE%g; s%@FEATURE_REQUIRES@%$quartz_image_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$quartz_image_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$quartz_image_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$quartz_image_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-quartz-image.pc.tmp" > "src/cairo-quartz-image.pc" && rm -f "src/cairo-quartz-image.pc.tmp" || + as_fn_error $? "failed to update src/cairo-quartz-image.pc" "$LINENO" 5 + ;; + "cairo-quartz-image-uninstalled.pc":F) mv "cairo-quartz-image-uninstalled.pc" "cairo-quartz-image-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-quartz-image%g; s%@FEATURE_NAME@%Quartz Image surface backend%g; s%@FEATURE_BASE@%$quartz_image_BASE%g; s%@FEATURE_REQUIRES@%$quartz_image_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$quartz_image_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$quartz_image_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$quartz_image_NONPKGCONFIG_CFLAGS%g; " < "cairo-quartz-image-uninstalled.pc.tmp" > "cairo-quartz-image-uninstalled.pc" && rm -f "cairo-quartz-image-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-quartz-image-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-win32.pc":F) mv "src/cairo-win32.pc" "src/cairo-win32.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-win32%g; s%@FEATURE_NAME@%Microsoft Windows surface backend%g; s%@FEATURE_BASE@%$win32_BASE%g; s%@FEATURE_REQUIRES@%$win32_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$win32_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$win32_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$win32_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-win32.pc.tmp" > "src/cairo-win32.pc" && rm -f "src/cairo-win32.pc.tmp" || + as_fn_error $? "failed to update src/cairo-win32.pc" "$LINENO" 5 + ;; + "cairo-win32-uninstalled.pc":F) mv "cairo-win32-uninstalled.pc" "cairo-win32-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-win32%g; s%@FEATURE_NAME@%Microsoft Windows surface backend%g; s%@FEATURE_BASE@%$win32_BASE%g; s%@FEATURE_REQUIRES@%$win32_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$win32_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$win32_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$win32_NONPKGCONFIG_CFLAGS%g; " < "cairo-win32-uninstalled.pc.tmp" > "cairo-win32-uninstalled.pc" && rm -f "cairo-win32-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-win32-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-win32-font.pc":F) mv "src/cairo-win32-font.pc" "src/cairo-win32-font.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-win32-font%g; s%@FEATURE_NAME@%Microsoft Windows font backend%g; s%@FEATURE_BASE@%$win32_font_BASE%g; s%@FEATURE_REQUIRES@%$win32_font_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$win32_font_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$win32_font_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$win32_font_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-win32-font.pc.tmp" > "src/cairo-win32-font.pc" && rm -f "src/cairo-win32-font.pc.tmp" || + as_fn_error $? "failed to update src/cairo-win32-font.pc" "$LINENO" 5 + ;; + "cairo-win32-font-uninstalled.pc":F) mv "cairo-win32-font-uninstalled.pc" "cairo-win32-font-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-win32-font%g; s%@FEATURE_NAME@%Microsoft Windows font backend%g; s%@FEATURE_BASE@%$win32_font_BASE%g; s%@FEATURE_REQUIRES@%$win32_font_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$win32_font_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$win32_font_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$win32_font_NONPKGCONFIG_CFLAGS%g; " < "cairo-win32-font-uninstalled.pc.tmp" > "cairo-win32-font-uninstalled.pc" && rm -f "cairo-win32-font-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-win32-font-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-skia.pc":F) mv "src/cairo-skia.pc" "src/cairo-skia.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-skia%g; s%@FEATURE_NAME@%Skia surface backend%g; s%@FEATURE_BASE@%$skia_BASE%g; s%@FEATURE_REQUIRES@%$skia_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$skia_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$skia_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$skia_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-skia.pc.tmp" > "src/cairo-skia.pc" && rm -f "src/cairo-skia.pc.tmp" || + as_fn_error $? "failed to update src/cairo-skia.pc" "$LINENO" 5 + ;; + "cairo-skia-uninstalled.pc":F) mv "cairo-skia-uninstalled.pc" "cairo-skia-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-skia%g; s%@FEATURE_NAME@%Skia surface backend%g; s%@FEATURE_BASE@%$skia_BASE%g; s%@FEATURE_REQUIRES@%$skia_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$skia_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$skia_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$skia_NONPKGCONFIG_CFLAGS%g; " < "cairo-skia-uninstalled.pc.tmp" > "cairo-skia-uninstalled.pc" && rm -f "cairo-skia-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-skia-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-os2.pc":F) mv "src/cairo-os2.pc" "src/cairo-os2.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-os2%g; s%@FEATURE_NAME@%OS/2 surface backend%g; s%@FEATURE_BASE@%$os2_BASE%g; s%@FEATURE_REQUIRES@%$os2_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$os2_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$os2_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$os2_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-os2.pc.tmp" > "src/cairo-os2.pc" && rm -f "src/cairo-os2.pc.tmp" || + as_fn_error $? "failed to update src/cairo-os2.pc" "$LINENO" 5 + ;; + "cairo-os2-uninstalled.pc":F) mv "cairo-os2-uninstalled.pc" "cairo-os2-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-os2%g; s%@FEATURE_NAME@%OS/2 surface backend%g; s%@FEATURE_BASE@%$os2_BASE%g; s%@FEATURE_REQUIRES@%$os2_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$os2_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$os2_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$os2_NONPKGCONFIG_CFLAGS%g; " < "cairo-os2-uninstalled.pc.tmp" > "cairo-os2-uninstalled.pc" && rm -f "cairo-os2-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-os2-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-beos.pc":F) mv "src/cairo-beos.pc" "src/cairo-beos.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-beos%g; s%@FEATURE_NAME@%BeOS/Zeta surface backend%g; s%@FEATURE_BASE@%$beos_BASE%g; s%@FEATURE_REQUIRES@%$beos_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$beos_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$beos_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$beos_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-beos.pc.tmp" > "src/cairo-beos.pc" && rm -f "src/cairo-beos.pc.tmp" || + as_fn_error $? "failed to update src/cairo-beos.pc" "$LINENO" 5 + ;; + "cairo-beos-uninstalled.pc":F) mv "cairo-beos-uninstalled.pc" "cairo-beos-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-beos%g; s%@FEATURE_NAME@%BeOS/Zeta surface backend%g; s%@FEATURE_BASE@%$beos_BASE%g; s%@FEATURE_REQUIRES@%$beos_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$beos_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$beos_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$beos_NONPKGCONFIG_CFLAGS%g; " < "cairo-beos-uninstalled.pc.tmp" > "cairo-beos-uninstalled.pc" && rm -f "cairo-beos-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-beos-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-drm.pc":F) mv "src/cairo-drm.pc" "src/cairo-drm.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-drm%g; s%@FEATURE_NAME@%DRM surface backend%g; s%@FEATURE_BASE@%$drm_BASE%g; s%@FEATURE_REQUIRES@%$drm_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$drm_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$drm_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$drm_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-drm.pc.tmp" > "src/cairo-drm.pc" && rm -f "src/cairo-drm.pc.tmp" || + as_fn_error $? "failed to update src/cairo-drm.pc" "$LINENO" 5 + ;; + "cairo-drm-uninstalled.pc":F) mv "cairo-drm-uninstalled.pc" "cairo-drm-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-drm%g; s%@FEATURE_NAME@%DRM surface backend%g; s%@FEATURE_BASE@%$drm_BASE%g; s%@FEATURE_REQUIRES@%$drm_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$drm_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$drm_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$drm_NONPKGCONFIG_CFLAGS%g; " < "cairo-drm-uninstalled.pc.tmp" > "cairo-drm-uninstalled.pc" && rm -f "cairo-drm-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-drm-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-gallium.pc":F) mv "src/cairo-gallium.pc" "src/cairo-gallium.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-gallium%g; s%@FEATURE_NAME@%Gallium3D surface backend%g; s%@FEATURE_BASE@%$gallium_BASE%g; s%@FEATURE_REQUIRES@%$gallium_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$gallium_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$gallium_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$gallium_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-gallium.pc.tmp" > "src/cairo-gallium.pc" && rm -f "src/cairo-gallium.pc.tmp" || + as_fn_error $? "failed to update src/cairo-gallium.pc" "$LINENO" 5 + ;; + "cairo-gallium-uninstalled.pc":F) mv "cairo-gallium-uninstalled.pc" "cairo-gallium-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-gallium%g; s%@FEATURE_NAME@%Gallium3D surface backend%g; s%@FEATURE_BASE@%$gallium_BASE%g; s%@FEATURE_REQUIRES@%$gallium_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$gallium_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$gallium_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$gallium_NONPKGCONFIG_CFLAGS%g; " < "cairo-gallium-uninstalled.pc.tmp" > "cairo-gallium-uninstalled.pc" && rm -f "cairo-gallium-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-gallium-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-png.pc":F) mv "src/cairo-png.pc" "src/cairo-png.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-png%g; s%@FEATURE_NAME@%PNG functions%g; s%@FEATURE_BASE@%$png_BASE%g; s%@FEATURE_REQUIRES@%$png_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$png_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$png_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$png_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-png.pc.tmp" > "src/cairo-png.pc" && rm -f "src/cairo-png.pc.tmp" || + as_fn_error $? "failed to update src/cairo-png.pc" "$LINENO" 5 + ;; + "cairo-png-uninstalled.pc":F) mv "cairo-png-uninstalled.pc" "cairo-png-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-png%g; s%@FEATURE_NAME@%PNG functions%g; s%@FEATURE_BASE@%$png_BASE%g; s%@FEATURE_REQUIRES@%$png_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$png_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$png_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$png_NONPKGCONFIG_CFLAGS%g; " < "cairo-png-uninstalled.pc.tmp" > "cairo-png-uninstalled.pc" && rm -f "cairo-png-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-png-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-gl.pc":F) mv "src/cairo-gl.pc" "src/cairo-gl.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-gl%g; s%@FEATURE_NAME@%OpenGL surface backend%g; s%@FEATURE_BASE@%$gl_BASE%g; s%@FEATURE_REQUIRES@%$gl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$gl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$gl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$gl_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-gl.pc.tmp" > "src/cairo-gl.pc" && rm -f "src/cairo-gl.pc.tmp" || + as_fn_error $? "failed to update src/cairo-gl.pc" "$LINENO" 5 + ;; + "cairo-gl-uninstalled.pc":F) mv "cairo-gl-uninstalled.pc" "cairo-gl-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-gl%g; s%@FEATURE_NAME@%OpenGL surface backend%g; s%@FEATURE_BASE@%$gl_BASE%g; s%@FEATURE_REQUIRES@%$gl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$gl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$gl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$gl_NONPKGCONFIG_CFLAGS%g; " < "cairo-gl-uninstalled.pc.tmp" > "cairo-gl-uninstalled.pc" && rm -f "cairo-gl-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-gl-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-glesv2.pc":F) mv "src/cairo-glesv2.pc" "src/cairo-glesv2.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-glesv2%g; s%@FEATURE_NAME@%OpenGLESv2 surface backend%g; s%@FEATURE_BASE@%$glesv2_BASE%g; s%@FEATURE_REQUIRES@%$glesv2_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$glesv2_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$glesv2_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$glesv2_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-glesv2.pc.tmp" > "src/cairo-glesv2.pc" && rm -f "src/cairo-glesv2.pc.tmp" || + as_fn_error $? "failed to update src/cairo-glesv2.pc" "$LINENO" 5 + ;; + "cairo-glesv2-uninstalled.pc":F) mv "cairo-glesv2-uninstalled.pc" "cairo-glesv2-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-glesv2%g; s%@FEATURE_NAME@%OpenGLESv2 surface backend%g; s%@FEATURE_BASE@%$glesv2_BASE%g; s%@FEATURE_REQUIRES@%$glesv2_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$glesv2_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$glesv2_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$glesv2_NONPKGCONFIG_CFLAGS%g; " < "cairo-glesv2-uninstalled.pc.tmp" > "cairo-glesv2-uninstalled.pc" && rm -f "cairo-glesv2-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-glesv2-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-cogl.pc":F) mv "src/cairo-cogl.pc" "src/cairo-cogl.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-cogl%g; s%@FEATURE_NAME@%Cogl surface backend%g; s%@FEATURE_BASE@%$cogl_BASE%g; s%@FEATURE_REQUIRES@%$cogl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$cogl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$cogl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$cogl_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-cogl.pc.tmp" > "src/cairo-cogl.pc" && rm -f "src/cairo-cogl.pc.tmp" || + as_fn_error $? "failed to update src/cairo-cogl.pc" "$LINENO" 5 + ;; + "cairo-cogl-uninstalled.pc":F) mv "cairo-cogl-uninstalled.pc" "cairo-cogl-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-cogl%g; s%@FEATURE_NAME@%Cogl surface backend%g; s%@FEATURE_BASE@%$cogl_BASE%g; s%@FEATURE_REQUIRES@%$cogl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$cogl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$cogl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$cogl_NONPKGCONFIG_CFLAGS%g; " < "cairo-cogl-uninstalled.pc.tmp" > "cairo-cogl-uninstalled.pc" && rm -f "cairo-cogl-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-cogl-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-directfb.pc":F) mv "src/cairo-directfb.pc" "src/cairo-directfb.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-directfb%g; s%@FEATURE_NAME@%directfb surface backend%g; s%@FEATURE_BASE@%$directfb_BASE%g; s%@FEATURE_REQUIRES@%$directfb_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$directfb_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$directfb_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$directfb_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-directfb.pc.tmp" > "src/cairo-directfb.pc" && rm -f "src/cairo-directfb.pc.tmp" || + as_fn_error $? "failed to update src/cairo-directfb.pc" "$LINENO" 5 + ;; + "cairo-directfb-uninstalled.pc":F) mv "cairo-directfb-uninstalled.pc" "cairo-directfb-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-directfb%g; s%@FEATURE_NAME@%directfb surface backend%g; s%@FEATURE_BASE@%$directfb_BASE%g; s%@FEATURE_REQUIRES@%$directfb_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$directfb_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$directfb_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$directfb_NONPKGCONFIG_CFLAGS%g; " < "cairo-directfb-uninstalled.pc.tmp" > "cairo-directfb-uninstalled.pc" && rm -f "cairo-directfb-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-directfb-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-vg.pc":F) mv "src/cairo-vg.pc" "src/cairo-vg.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-vg%g; s%@FEATURE_NAME@%OpenVG surface backend%g; s%@FEATURE_BASE@%$vg_BASE%g; s%@FEATURE_REQUIRES@%$vg_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$vg_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$vg_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$vg_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-vg.pc.tmp" > "src/cairo-vg.pc" && rm -f "src/cairo-vg.pc.tmp" || + as_fn_error $? "failed to update src/cairo-vg.pc" "$LINENO" 5 + ;; + "cairo-vg-uninstalled.pc":F) mv "cairo-vg-uninstalled.pc" "cairo-vg-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-vg%g; s%@FEATURE_NAME@%OpenVG surface backend%g; s%@FEATURE_BASE@%$vg_BASE%g; s%@FEATURE_REQUIRES@%$vg_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$vg_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$vg_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$vg_NONPKGCONFIG_CFLAGS%g; " < "cairo-vg-uninstalled.pc.tmp" > "cairo-vg-uninstalled.pc" && rm -f "cairo-vg-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-vg-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-egl.pc":F) mv "src/cairo-egl.pc" "src/cairo-egl.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-egl%g; s%@FEATURE_NAME@%EGL functions%g; s%@FEATURE_BASE@%$egl_BASE%g; s%@FEATURE_REQUIRES@%$egl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$egl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$egl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$egl_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-egl.pc.tmp" > "src/cairo-egl.pc" && rm -f "src/cairo-egl.pc.tmp" || + as_fn_error $? "failed to update src/cairo-egl.pc" "$LINENO" 5 + ;; + "cairo-egl-uninstalled.pc":F) mv "cairo-egl-uninstalled.pc" "cairo-egl-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-egl%g; s%@FEATURE_NAME@%EGL functions%g; s%@FEATURE_BASE@%$egl_BASE%g; s%@FEATURE_REQUIRES@%$egl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$egl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$egl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$egl_NONPKGCONFIG_CFLAGS%g; " < "cairo-egl-uninstalled.pc.tmp" > "cairo-egl-uninstalled.pc" && rm -f "cairo-egl-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-egl-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-glx.pc":F) mv "src/cairo-glx.pc" "src/cairo-glx.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-glx%g; s%@FEATURE_NAME@%GLX functions%g; s%@FEATURE_BASE@%$glx_BASE%g; s%@FEATURE_REQUIRES@%$glx_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$glx_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$glx_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$glx_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-glx.pc.tmp" > "src/cairo-glx.pc" && rm -f "src/cairo-glx.pc.tmp" || + as_fn_error $? "failed to update src/cairo-glx.pc" "$LINENO" 5 + ;; + "cairo-glx-uninstalled.pc":F) mv "cairo-glx-uninstalled.pc" "cairo-glx-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-glx%g; s%@FEATURE_NAME@%GLX functions%g; s%@FEATURE_BASE@%$glx_BASE%g; s%@FEATURE_REQUIRES@%$glx_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$glx_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$glx_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$glx_NONPKGCONFIG_CFLAGS%g; " < "cairo-glx-uninstalled.pc.tmp" > "cairo-glx-uninstalled.pc" && rm -f "cairo-glx-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-glx-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-wgl.pc":F) mv "src/cairo-wgl.pc" "src/cairo-wgl.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-wgl%g; s%@FEATURE_NAME@%WGL functions%g; s%@FEATURE_BASE@%$wgl_BASE%g; s%@FEATURE_REQUIRES@%$wgl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$wgl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$wgl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$wgl_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-wgl.pc.tmp" > "src/cairo-wgl.pc" && rm -f "src/cairo-wgl.pc.tmp" || + as_fn_error $? "failed to update src/cairo-wgl.pc" "$LINENO" 5 + ;; + "cairo-wgl-uninstalled.pc":F) mv "cairo-wgl-uninstalled.pc" "cairo-wgl-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-wgl%g; s%@FEATURE_NAME@%WGL functions%g; s%@FEATURE_BASE@%$wgl_BASE%g; s%@FEATURE_REQUIRES@%$wgl_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$wgl_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$wgl_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$wgl_NONPKGCONFIG_CFLAGS%g; " < "cairo-wgl-uninstalled.pc.tmp" > "cairo-wgl-uninstalled.pc" && rm -f "cairo-wgl-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-wgl-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-script.pc":F) mv "src/cairo-script.pc" "src/cairo-script.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-script%g; s%@FEATURE_NAME@%script surface backend%g; s%@FEATURE_BASE@%$script_BASE%g; s%@FEATURE_REQUIRES@%$script_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$script_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$script_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$script_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-script.pc.tmp" > "src/cairo-script.pc" && rm -f "src/cairo-script.pc.tmp" || + as_fn_error $? "failed to update src/cairo-script.pc" "$LINENO" 5 + ;; + "cairo-script-uninstalled.pc":F) mv "cairo-script-uninstalled.pc" "cairo-script-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-script%g; s%@FEATURE_NAME@%script surface backend%g; s%@FEATURE_BASE@%$script_BASE%g; s%@FEATURE_REQUIRES@%$script_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$script_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$script_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$script_NONPKGCONFIG_CFLAGS%g; " < "cairo-script-uninstalled.pc.tmp" > "cairo-script-uninstalled.pc" && rm -f "cairo-script-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-script-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-ft.pc":F) mv "src/cairo-ft.pc" "src/cairo-ft.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-ft%g; s%@FEATURE_NAME@%FreeType font backend%g; s%@FEATURE_BASE@%$ft_BASE%g; s%@FEATURE_REQUIRES@%$ft_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$ft_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$ft_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$ft_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-ft.pc.tmp" > "src/cairo-ft.pc" && rm -f "src/cairo-ft.pc.tmp" || + as_fn_error $? "failed to update src/cairo-ft.pc" "$LINENO" 5 + ;; + "cairo-ft-uninstalled.pc":F) mv "cairo-ft-uninstalled.pc" "cairo-ft-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-ft%g; s%@FEATURE_NAME@%FreeType font backend%g; s%@FEATURE_BASE@%$ft_BASE%g; s%@FEATURE_REQUIRES@%$ft_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$ft_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$ft_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$ft_NONPKGCONFIG_CFLAGS%g; " < "cairo-ft-uninstalled.pc.tmp" > "cairo-ft-uninstalled.pc" && rm -f "cairo-ft-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-ft-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-fc.pc":F) mv "src/cairo-fc.pc" "src/cairo-fc.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-fc%g; s%@FEATURE_NAME@%Fontconfig font backend%g; s%@FEATURE_BASE@%$fc_BASE%g; s%@FEATURE_REQUIRES@%$fc_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$fc_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$fc_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$fc_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-fc.pc.tmp" > "src/cairo-fc.pc" && rm -f "src/cairo-fc.pc.tmp" || + as_fn_error $? "failed to update src/cairo-fc.pc" "$LINENO" 5 + ;; + "cairo-fc-uninstalled.pc":F) mv "cairo-fc-uninstalled.pc" "cairo-fc-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-fc%g; s%@FEATURE_NAME@%Fontconfig font backend%g; s%@FEATURE_BASE@%$fc_BASE%g; s%@FEATURE_REQUIRES@%$fc_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$fc_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$fc_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$fc_NONPKGCONFIG_CFLAGS%g; " < "cairo-fc-uninstalled.pc.tmp" > "cairo-fc-uninstalled.pc" && rm -f "cairo-fc-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-fc-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-ps.pc":F) mv "src/cairo-ps.pc" "src/cairo-ps.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-ps%g; s%@FEATURE_NAME@%PostScript surface backend%g; s%@FEATURE_BASE@%$ps_BASE%g; s%@FEATURE_REQUIRES@%$ps_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$ps_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$ps_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$ps_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-ps.pc.tmp" > "src/cairo-ps.pc" && rm -f "src/cairo-ps.pc.tmp" || + as_fn_error $? "failed to update src/cairo-ps.pc" "$LINENO" 5 + ;; + "cairo-ps-uninstalled.pc":F) mv "cairo-ps-uninstalled.pc" "cairo-ps-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-ps%g; s%@FEATURE_NAME@%PostScript surface backend%g; s%@FEATURE_BASE@%$ps_BASE%g; s%@FEATURE_REQUIRES@%$ps_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$ps_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$ps_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$ps_NONPKGCONFIG_CFLAGS%g; " < "cairo-ps-uninstalled.pc.tmp" > "cairo-ps-uninstalled.pc" && rm -f "cairo-ps-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-ps-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-pdf.pc":F) mv "src/cairo-pdf.pc" "src/cairo-pdf.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-pdf%g; s%@FEATURE_NAME@%PDF surface backend%g; s%@FEATURE_BASE@%$pdf_BASE%g; s%@FEATURE_REQUIRES@%$pdf_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$pdf_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$pdf_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$pdf_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-pdf.pc.tmp" > "src/cairo-pdf.pc" && rm -f "src/cairo-pdf.pc.tmp" || + as_fn_error $? "failed to update src/cairo-pdf.pc" "$LINENO" 5 + ;; + "cairo-pdf-uninstalled.pc":F) mv "cairo-pdf-uninstalled.pc" "cairo-pdf-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-pdf%g; s%@FEATURE_NAME@%PDF surface backend%g; s%@FEATURE_BASE@%$pdf_BASE%g; s%@FEATURE_REQUIRES@%$pdf_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$pdf_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$pdf_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$pdf_NONPKGCONFIG_CFLAGS%g; " < "cairo-pdf-uninstalled.pc.tmp" > "cairo-pdf-uninstalled.pc" && rm -f "cairo-pdf-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-pdf-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-svg.pc":F) mv "src/cairo-svg.pc" "src/cairo-svg.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-svg%g; s%@FEATURE_NAME@%SVG surface backend%g; s%@FEATURE_BASE@%$svg_BASE%g; s%@FEATURE_REQUIRES@%$svg_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$svg_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$svg_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$svg_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-svg.pc.tmp" > "src/cairo-svg.pc" && rm -f "src/cairo-svg.pc.tmp" || + as_fn_error $? "failed to update src/cairo-svg.pc" "$LINENO" 5 + ;; + "cairo-svg-uninstalled.pc":F) mv "cairo-svg-uninstalled.pc" "cairo-svg-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-svg%g; s%@FEATURE_NAME@%SVG surface backend%g; s%@FEATURE_BASE@%$svg_BASE%g; s%@FEATURE_REQUIRES@%$svg_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$svg_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$svg_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$svg_NONPKGCONFIG_CFLAGS%g; " < "cairo-svg-uninstalled.pc.tmp" > "cairo-svg-uninstalled.pc" && rm -f "cairo-svg-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-svg-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-tee.pc":F) mv "src/cairo-tee.pc" "src/cairo-tee.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-tee%g; s%@FEATURE_NAME@%tee surface backend%g; s%@FEATURE_BASE@%$tee_BASE%g; s%@FEATURE_REQUIRES@%$tee_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$tee_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$tee_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$tee_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-tee.pc.tmp" > "src/cairo-tee.pc" && rm -f "src/cairo-tee.pc.tmp" || + as_fn_error $? "failed to update src/cairo-tee.pc" "$LINENO" 5 + ;; + "cairo-tee-uninstalled.pc":F) mv "cairo-tee-uninstalled.pc" "cairo-tee-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-tee%g; s%@FEATURE_NAME@%tee surface backend%g; s%@FEATURE_BASE@%$tee_BASE%g; s%@FEATURE_REQUIRES@%$tee_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$tee_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$tee_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$tee_NONPKGCONFIG_CFLAGS%g; " < "cairo-tee-uninstalled.pc.tmp" > "cairo-tee-uninstalled.pc" && rm -f "cairo-tee-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-tee-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-xml.pc":F) mv "src/cairo-xml.pc" "src/cairo-xml.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xml%g; s%@FEATURE_NAME@%xml surface backend%g; s%@FEATURE_BASE@%$xml_BASE%g; s%@FEATURE_REQUIRES@%$xml_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xml_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xml_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xml_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-xml.pc.tmp" > "src/cairo-xml.pc" && rm -f "src/cairo-xml.pc.tmp" || + as_fn_error $? "failed to update src/cairo-xml.pc" "$LINENO" 5 + ;; + "cairo-xml-uninstalled.pc":F) mv "cairo-xml-uninstalled.pc" "cairo-xml-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-xml%g; s%@FEATURE_NAME@%xml surface backend%g; s%@FEATURE_BASE@%$xml_BASE%g; s%@FEATURE_REQUIRES@%$xml_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$xml_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$xml_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$xml_NONPKGCONFIG_CFLAGS%g; " < "cairo-xml-uninstalled.pc.tmp" > "cairo-xml-uninstalled.pc" && rm -f "cairo-xml-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-xml-uninstalled.pc" "$LINENO" 5 + ;; + "src/cairo-gobject.pc":F) mv "src/cairo-gobject.pc" "src/cairo-gobject.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-gobject%g; s%@FEATURE_NAME@%gobject functions%g; s%@FEATURE_BASE@%$gobject_BASE%g; s%@FEATURE_REQUIRES@%$gobject_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$gobject_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$gobject_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$gobject_NONPKGCONFIG_CFLAGS%g; " < "src/cairo-gobject.pc.tmp" > "src/cairo-gobject.pc" && rm -f "src/cairo-gobject.pc.tmp" || + as_fn_error $? "failed to update src/cairo-gobject.pc" "$LINENO" 5 + ;; + "cairo-gobject-uninstalled.pc":F) mv "cairo-gobject-uninstalled.pc" "cairo-gobject-uninstalled.pc.tmp" && + $SED " s%@FEATURE_PC@%cairo-gobject%g; s%@FEATURE_NAME@%gobject functions%g; s%@FEATURE_BASE@%$gobject_BASE%g; s%@FEATURE_REQUIRES@%$gobject_REQUIRES%g; s%@FEATURE_NONPKGCONFIG_LIBS@%$gobject_NONPKGCONFIG_LIBS%g; s%@FEATURE_NONPKGCONFIG_EXTRA_LIBS@%$gobject_NONPKGCONFIG_EXTRA_LIBS%g; s%@FEATURE_NONPKGCONFIG_CFLAGS@%$gobject_NONPKGCONFIG_CFLAGS%g; " < "cairo-gobject-uninstalled.pc.tmp" > "cairo-gobject-uninstalled.pc" && rm -f "cairo-gobject-uninstalled.pc.tmp" || + as_fn_error $? "failed to update cairo-gobject-uninstalled.pc" "$LINENO" 5 + ;; + "cairo-trace":C) chmod a+x util/cairo-trace/cairo-trace ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + V="$CAIRO_VERSION_MAJOR.$CAIRO_VERSION_MINOR.$CAIRO_VERSION_MICRO" + echo "" + echo "cairo (version $V [$CAIRO_RELEASE_STATUS]) will be compiled with:" + echo "" + echo "The following surface backends:" + echo " Image: yes (always builtin)" + echo " Recording: yes (always builtin)" + echo " Observer: yes (always builtin)" + echo " Mime: yes (always builtin)" + echo " Tee: $use_tee" + echo " XML: $use_xml" + echo " Skia: $use_skia" + echo " Xlib: $use_xlib" + echo " Xlib Xrender: $use_xlib_xrender" + echo " Qt: $use_qt" + echo " Quartz: $use_quartz" + echo " Quartz-image: $use_quartz_image" + echo " XCB: $use_xcb" + echo " Win32: $use_win32" + echo " OS2: $use_os2" + echo " CairoScript: $use_script" + echo " PostScript: $use_ps" + echo " PDF: $use_pdf" + echo " SVG: $use_svg" + echo " OpenGL: $use_gl" + echo " OpenGL ES 2.0: $use_glesv2" + echo " BeOS: $use_beos" + echo " DirectFB: $use_directfb" + echo " OpenVG: $use_vg" + echo " DRM: $use_drm" + echo " Cogl: $use_cogl" + echo "" + echo "The following font backends:" + echo " User: yes (always builtin)" + echo " FreeType: $use_ft" + echo " Fontconfig: $use_fc" + echo " Win32: $use_win32_font" + echo " Quartz: $use_quartz_font" + echo "" + echo "The following functions:" + echo " PNG functions: $use_png" + echo " GLX functions: $use_glx" + echo " WGL functions: $use_wgl" + echo " EGL functions: $use_egl" + echo " X11-xcb functions: $use_xlib_xcb" + echo " XCB-shm functions: $use_xcb_shm" + echo "" + echo "The following features and utilities:" + echo " cairo-trace: $use_trace" + echo " cairo-script-interpreter: $use_interpreter" + echo "" + echo "And the following internal features:" + echo " pthread: $use_pthread" + echo " gtk-doc: $enable_gtk_doc" + echo " gcov support: $use_gcov" + echo " symbol-lookup: $use_symbol_lookup" + echo " test surfaces: $use_test_surfaces" + echo " ps testing: $test_ps" + echo " pdf testing: $test_pdf" + echo " svg testing: $test_svg" + if test x"$use_win32" = "xyes"; then + echo " win32 printing testing: $test_win32_printing" + fi + echo "$CAIRO_WARNING_MESSAGE" + echo "" + diff --git a/configure.ac b/configure.ac new file mode 100644 index 000000000..2ce19599e --- /dev/null +++ b/configure.ac @@ -0,0 +1,878 @@ +AC_PREREQ([2.63]) +CAIRO_PARSE_VERSION +AC_INIT([cairo], + [cairo_version_major.cairo_version_minor.cairo_version_micro], + [http://bugs.freedesktop.org/enter_bug.cgi?product=cairo], + [cairo], + [http://cairographics.org/]) +AC_CONFIG_AUX_DIR(build) +AC_CONFIG_MACRO_DIR(build) +AC_USE_SYSTEM_EXTENSIONS +AC_CONFIG_SRCDIR(src/cairo.h) +AC_CONFIG_HEADERS(config.h) + +AC_CHECK_HEADERS([unistd.h sys/ioctl.h]) + +AM_INIT_AUTOMAKE([1.11 foreign -Wall no-define no-dist-gzip dist-xz]) +AM_SILENT_RULES([yes]) +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) dnl Workaround for Automake 1.12 + +# Initialize libtool +LT_PREREQ([2.2]) +LT_INIT([win32-dll]) + +# Api documentation +GTK_DOC_CHECK([1.15],[--flavour no-tmpl]) + +AC_SYS_LARGEFILE + +dnl =========================================================================== +dnl +dnl The order of the includes here is rather important +dnl +m4_include(build/configure.ac.version) dnl macros setting up various version declares +m4_include(build/configure.ac.tools) dnl checks for tools we use +m4_include(build/configure.ac.features) dnl macros for backend/feature handling +m4_include(build/configure.ac.warnings) dnl checks for compiler warning +m4_include(build/configure.ac.system) dnl checks for system functions, headers, libs +m4_include(build/configure.ac.analysis) dnl checks for analysis tools (lcov, etc) +m4_include(build/configure.ac.noversion) dnl disable builtin libtool versioning +m4_include(build/configure.ac.pthread) dnl checks for pthreads +AC_CACHE_SAVE + +dnl =========================================================================== + +AC_CHECK_LIB(z, compress, + [AC_CHECK_HEADER(zlib.h, [ + have_libz=yes + AC_DEFINE(HAVE_ZLIB, 1, [Define to 1 if you have zlib available]) + ], + [have_libz="no (requires zlib http://www.gzip.org/zlib/)"])], + [have_libz="no (requires zlib http://www.gzip.org/zlib/)"]) + +save_LIBS="$LIBS" +AC_CHECK_LIB(lzo2, lzo2a_decompress, + [AC_CHECK_HEADER(lzo/lzo2a.h, [ + have_lzo=yes + AC_DEFINE(HAVE_LZO, 1, [Define to 1 if you have lzo available]) + lzo_LIBS="-llzo2" + ], + [have_lzo="no (requires lzpo http://www.oberhumer.com/opensource/lzo/)"])], + [have_lzo="no (requires lzpo http://www.oberhumer.com/opensource/lzo/)"]) +AC_SUBST(lzo_LIBS) +LIBS="$save_LIBS" + +AC_CHECK_LIB(dl, dlsym, + [have_dlsym=yes; have_dl=yes], + [have_dlsym=no; have_dl=no]) +if test "x$have_dlsym" = "xno"; then + AC_CHECK_FUNC(dlsym, [have_dlsym=yes], [have_dlsym=no]) +fi +AC_CHECK_HEADERS(dlfcn.h, [have_dlsym=yes], [have_dlsym=no]) +AM_CONDITIONAL(CAIRO_HAS_DL, test "x$have_dl" = "xyes") +if test "x$have_dlsym" = "xyes"; then + AC_DEFINE([CAIRO_HAS_DLSYM], 1, [Define to 1 if dlsym is available]) +fi +AM_CONDITIONAL(CAIRO_HAS_DLSYM, test "x$have_dlsym" = "xyes") + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(xlib, Xlib, auto, [ + xlib_REQUIRES="x11 xext" + PKG_CHECK_MODULES(xlib, $xlib_REQUIRES, , + [xlib_REQUIRES="" + AC_PATH_XTRA + if test "x$no_x" = xyes; then + use_xlib="no (requires X development libraries)" + else + xlib_NONPKGCONFIG_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext $X_EXTRA_LIBS" + xlib_NONPKGCONFIG_CFLAGS=$X_CFLAGS + fi]) + + AC_CHECK_HEADER(sys/ipc.h) + AC_CHECK_HEADER(sys/shm.h) + + if test "$ac_cv_header_sys_ipc_h" = "yes" -a "$ac_cv_header_sys_shm_h" = "yes"; then + AC_MSG_CHECKING(whether shmctl IPC_RMID allowes subsequent attaches) + AC_TRY_RUN([ + #include <sys/types.h> + #include <sys/ipc.h> + #include <sys/shm.h> + int main() + { + char *shmaddr; + int id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0600); + if (id == -1) return 2; + shmaddr = shmat (id, 0, 0); + shmctl (id, IPC_RMID, 0); + if ((char*) shmat (id, 0, 0) == (char*) -1) { + shmdt (shmaddr); + return 1; + } + shmdt (shmaddr); + shmdt (shmaddr); + return 0; + } + ], + AC_DEFINE(IPC_RMID_DEFERRED_RELEASE, 1, + [Define to 1 if shared memory segments are released deferred.]) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no), + AC_MSG_RESULT(assuming no)) + fi + + AC_CHECK_HEADERS([X11/extensions/XShm.h X11/extensions/shmproto.h X11/extensions/shmstr.h], [], [], + [#include <X11/Xlibint.h> + #include <X11/Xproto.h>]) +]) + +CAIRO_ENABLE_SURFACE_BACKEND(xlib_xrender, Xlib Xrender, auto, [ + if test "x$use_xlib" != "xyes"; then + use_xlib_xrender="no (requires --enable-xlib)" + else + dnl Check for Xrender header files if the Xrender package is not installed: + xlib_xrender_BASE=cairo-xlib + xlib_xrender_REQUIRES="xrender >= 0.6" + PKG_CHECK_MODULES(xlib_xrender, $xlib_xrender_REQUIRES, , + [xlib_xrender_REQUIRES="" + old_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS" + AC_CHECK_HEADER(X11/extensions/Xrender.h, + [xlib_xrender_NONPKGCONFIG_LIBS="-lXrender"], + [use_xlib_xrender="no (requires $xlib_xrender_REQUIRES http://freedesktop.org/Software/xlibs)"], + [#include <X11/X.h>]) + CPPFLAGS=$old_CPPFLAGS + ]) + + old_CFLAGS=$CFLAGS + old_LIBS=$LIBS + CFLAGS="$CFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS $xlib_xrender_CFLAGS $xlib_xrender_NONPKGCONFIG_CFLAGS" + LIBS="$LIBS $xlib_LIBS $xlib_NONPKGCONFIG_LIBS $xlib_xrender_LIBS $xlib_xrender_NONPKGCONFIG_LIBS" + AC_CHECK_FUNCS([XRenderCreateSolidFill XRenderCreateLinearGradient XRenderCreateRadialGradient XRenderCreateConicalGradient]) + CFLAGS=$old_CFLAGS + LIBS=$old_LIBS + + fi +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(xcb, XCB, auto, [ + xcb_REQUIRES="xcb >= 1.6 xcb-render >= 1.6" + PKG_CHECK_MODULES(xcb, $xcb_REQUIRES, , + [use_xcb="no (requires $xcb_REQUIRES http://xcb.freedesktop.org)"]) +]) + +CAIRO_ENABLE_FUNCTIONS(xlib_xcb, Xlib/XCB, no, [ + if test "x$use_xcb" = "xyes" -a "x$use_xlib" = "xyes"; then + xlib_xcb_REQUIRES="x11-xcb" + PKG_CHECK_MODULES(xlib_xcb, $xlib_xcb_REQUIRES, , + [use_xlib_xcb="no (requires $xlib_xcb_REQUIRES http://xcb.freedesktop.org)"]) + else + use_xlib_xcb="no (requires both --enable-xlib and --enable-xcb)" + fi +]) + +CAIRO_ENABLE_FUNCTIONS(xcb_shm, XCB/SHM, auto, [ + if test "x$use_xcb" = "xyes"; then + xcb_shm_REQUIRES="xcb-shm" + PKG_CHECK_MODULES(xcb_shm, $xcb_shm_REQUIRES, , + [use_xcb_shm="no (requires $xcb_shm http://xcb.freedesktop.org)"]) + else + use_xcb_shm="no (requires --enable-xcb)" + fi +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(qt, Qt, no, [ + qt_REQUIRES="QtGui >= 4.4.0" + PKG_CHECK_MODULES(qt, $qt_REQUIRES, , + [qt_REQUIRES="" + use_qt="no (requires Qt4 development libraries)" + ]) + qt_NONPKGCONFIG_LIBS="-lstdc++" +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(quartz, Quartz, auto, [ + dnl There is no pkgconfig for quartz; lets do a header check + AC_CHECK_HEADER(ApplicationServices/ApplicationServices.h, , [use_quartz="no (requires ApplicationServices framework)"]) + if test "x$use_quartz" != "xyes" ; then + dnl check for CoreGraphics as a separate framework + AC_CHECK_HEADER(CoreGraphics/CoreGraphics.h, , [use_quartz="no (requires CoreGraphics framework)"]) + quartz_LIBS="-Xlinker -framework -Xlinker CoreGraphics" + else + quartz_LIBS="-Xlinker -framework -Xlinker ApplicationServices" + fi +]) + +CAIRO_ENABLE_FONT_BACKEND(quartz_font, Quartz, auto, [ + use_quartz_font=$use_quartz +]) + +CAIRO_ENABLE_SURFACE_BACKEND(quartz_image, Quartz Image, no, [ + use_quartz_image=$use_quartz +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(win32, Microsoft Windows, auto, [ + if test "x$have_windows" != xyes; then + use_win32="no (requires a Win32 platform)" + fi + win32_LIBS="-lgdi32 -lmsimg32" +]) + +CAIRO_ENABLE_FONT_BACKEND(win32_font, Microsoft Windows, auto, [ + use_win32_font=$use_win32 +]) + +test_win32_printing=no +if test "x$use_win32" = "xyes"; then + AC_CHECK_PROG(GS, gs, gs) + if test "$GS"; then + AC_DEFINE([CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE], 1, [Define to 1 if the Win32 Printing backend can be tested (needs ghostscript)]) + test_win32_printing="yes" + else + AC_MSG_WARN([Win32 Printing backend will not be tested since ghostscript is not available]) + test_win32_printing="no (requires ghostscript)" + fi +fi + +AM_CONDITIONAL(CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE, test "x$test_win32_printing" = "xyes") + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(skia, Skia, no, [ + AC_ARG_WITH([skia], + [AS_HELP_STRING([--with-skia=/path/to/skia], + [directory to find compiled skia sources])], + [skia_DIR="$withval"], + [skia_DIR="`pwd`/../skia"]) + AC_ARG_WITH([skia-build-type], + [AS_HELP_STRING([--with-skia-build-type=(Release|Debug)] + [build of skia to link with, default is Release])], + [skia_BUILD_TYPE="$withval"], + [skia_BUILD_TYPE="Release"]) + skia_NONPKGCONFIG_CFLAGS="-I$skia_DIR/include/config -I$skia_DIR/include/core -I$skia_DIR/include/effects" + if test "x$skia_BUILD_TYPE" = "xRelease"; then + skia_NONPKGCONFIG_CFLAGS="-DSK_RELEASE -DSK_CAN_USE_FLOAT $skia_NONPKGCONFIG_CFLAGS" + fi + skia_NONPKGCONFIG_LIBS="-L$skia_DIR/out/$skia_BUILD_TYPE/lib.target/ -lskia -lstdc++" + AC_SUBST(skia_DIR) +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(os2, OS/2, no, [ + case "$host" in + *-*-os2*) + : + ;; + *) + use_os2="no (requires an OS/2 platform)" + ;; + esac +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(beos, BeOS/Zeta, no, [ + case "$host" in + *-*-beos) + beos_LIBS="" + dnl Add libbe and libzeta if available + AC_CHECK_LIB(be,main,beos_LIBS="$beos_LIBS -lbe") + AC_CHECK_LIB(zeta,main,beos_LIBS="$beos_LIBS -lzeta") + ;; + *) + use_beos="no (requires a BeOS platform)" + ;; + esac +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(drm, DRM, no, [ + drm_REQUIRES="libudev >= 136" + PKG_CHECK_MODULES(drm, $drm_REQUIRES, , + [use_drm="no (requires $drm_REQUIRES, udev is available from git://git.kernel.org/pub/scm/linux/hotplug/udev.git)"]) +]) + +CAIRO_ENABLE_SURFACE_BACKEND(gallium, Gallium3D, no, [ + if test "x$use_drm" = "xyes"; then + AC_ARG_WITH([gallium], + [AS_HELP_STRING([--with-gallium=/path/to/mesa], + [directory to find gallium enabled mesa])], + [mesa_DIR="$withval"], + [mesa_DIR="`pwd`/../mesa"]) + gallium_DIR="$mesa_DIR/src/gallium" + gallium_NONPKGCONFIG_CFLAGS="-I$mesa_DIR/include -I$mesa_DIR/src/mesa -I$gallium_DIR/include -I$gallium_DIR/auxiliary" + gallium_NONPKGCONFIG_LIBS="-lGL" + AC_SUBST(mesa_DIR) + AC_SUBST(gallium_DIR) + else + use_gallium="no (requires --enable-drm)" + fi +]) + +dnl =========================================================================== + +CAIRO_ENABLE_FUNCTIONS(png, PNG, yes, [ + use_png=no + AC_ARG_VAR([png_REQUIRES], [module name for libpng to search for using pkg-config]) + if test "x$png_REQUIRES" = x; then + # libpng13 is GnuWin32's libpng-1.2.8 :-( + for l in libpng libpng14 libpng12 libpng13 libpng10; do + if $PKG_CONFIG --exists $l ; then + png_REQUIRES=$l + use_png=yes + break + fi + done + else + use_png=yes + fi + + if test "x$use_png" = "xyes" ; then + PKG_CHECK_MODULES(png, $png_REQUIRES, , : ) + else + AC_MSG_WARN([Could not find libpng in the pkg-config search path]) + fi +]) + +dnl =========================================================================== +CAIRO_ENABLE_SURFACE_BACKEND(gl, OpenGL, no, [ + gl_REQUIRES="gl" + PKG_CHECK_MODULES(gl, $gl_REQUIRES,, [ + dnl Fallback to searching for headers + AC_CHECK_HEADER(GL/gl.h,, [use_gl="no (gl.pc nor OpenGL headers not found)"]) + if test "x$use_gl" = "xyes"; then + gl_NONPKGCONFIG_CFLAGS= + gl_NONPKGCONFIG_LIBS="-lGL" + fi]) + + if test "x$have_dl" = "xyes" -a "x$have_dlsym" = "xyes"; then + gl_LIBS="$gl_LIBS -ldl" + fi + + need_glx_functions=yes + need_wgl_functions=yes + need_egl_functions=yes +]) + +dnl =========================================================================== +CAIRO_ENABLE_SURFACE_BACKEND(glesv2, OpenGLESv2, no, [ + glesv2_REQUIRES="glesv2" + PKG_CHECK_MODULES(glesv2, $glesv2_REQUIRES,, [ + dnl Fallback to searching for headers + AC_CHECK_HEADER(GLES2/gl2.h,, [use_glesv2="no (glesv2.pc nor OpenGL ES 2.0 headers not found)"]) + if test "x$use_glesv2" = "xyes"; then + glesv2_NONPKGCONFIG_CFLAGS= + glesv2_NONPKGCONFIG_LIBS="-lGLESv2" + fi]) + + if test "x$have_dl" = "xyes" -a "x$have_dlsym" = "xyes"; then + glesv2_LIBS="$glesv2_LIBS -ldl" + fi + + if test "x$use_glesv2" = "xyes" -a "x$use_gl" = "xyes"; then + AC_MSG_ERROR([use either --enable-gl=yes or --enable-glesv2=yes. Not both at the same time.]) + fi + + need_egl_functions=yes +]) + +dnl =========================================================================== +CAIRO_ENABLE_SURFACE_BACKEND(cogl, Cogl, no, [ + cogl_REQUIRES="cogl-2.0-experimental" + PKG_CHECK_MODULES(cogl, $cogl_REQUIRES,, [use_cogl="no"]) +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(directfb, directfb, no, [ + directfb_REQUIRES=directfb + PKG_CHECK_MODULES(directfb, $directfb_REQUIRES, , + [use_directfb="no (requires $directfb_REQUIRES http://www.directfb.org)"]) +]) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(vg, OpenVG, no, [ + dnl There is no pkgconfig for OpenVG; lets do a header check + AC_CHECK_HEADER(VG/openvg.h,, [use_vg="no (OpenVG headers not found)"]) + if test "x$use_vg" = "xyes"; then + vg_NONPKGCONFIG_CFLAGS= + vg_NONPKGCONFIG_LIBS="-lOpenVG" + need_egl_functions=yes + need_glx_functions=yes + fi +]) + +CAIRO_ENABLE_FUNCTIONS(egl, EGL, auto, [ + if test "x$need_egl_functions" = "xyes"; then + egl_REQUIRES="egl" + PKG_CHECK_MODULES(egl, $egl_REQUIRES, , + [egl_REQUIRES="" + AC_CHECK_HEADER(EGL/egl.h,, [use_egl="no (EGL headers not found)"]) + if test "x$use_egl" = "xyes"; then + egl_NONPKGCONFIG_CFLAGS= + egl_NONPKGCONFIG_LIBS= + save_LIBS="$LIBS" + other_egl_LIBS="" + # Temporary workaround for missing link from egl13 + AC_CHECK_LIB(csi, csi_stream_attachresource, other_egl_LIBS="-lcsi") + LIBS="$other_egl_LIBS $LIBS" + for egl_lib in EGL egl13 egl12 egl11; do + if test -z "$egl_NONPKGCONFIG_LIBS"; then + AC_CHECK_LIB($egl_lib, eglGetError, egl_NONPKGCONFIG_LIBS="-l$egl_lib") + fi + done + if test -z "$egl_NONPKGCONFIG_LIBS"; then + use_egl="no (EGL library not found)" + else + egl_NONPKGCONFIG_LIBS="$egl_NONPKGCONFIG_LIBS $other_egl_LIBS" + fi + LIBS="$save_LIBS" + fi + ]) + else + use_egl="no (not required by any backend)" + fi +]) + +CAIRO_ENABLE_FUNCTIONS(glx, GLX, auto, [ + if test "x$need_glx_functions" = "xyes"; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $gl_CFLAGS $gl_NONPKGCONFIG_CFLAGS" + AC_CHECK_HEADER(GL/glx.h,, [use_glx="no (GLX headers not found)"]) + glx_NONPKGCONFIG_CFLAGS= + glx_NONPKGCONFIG_LIBS="-lGL" + CFLAGS="$save_CFLAGS" + else + use_glx="no (not required by any backend)" + fi +]) + +CAIRO_ENABLE_FUNCTIONS(wgl, WGL, auto, [ + if test "x$need_wgl_functions" = "xyes"; then + AC_CHECK_HEADER(windows.h,, [use_wgl="no (WGL headers not found)"]) + else + use_wgl="no (not required by any backend)" + fi +]) + +dnl =========================================================================== + +any2ppm_cs=no +CAIRO_ENABLE_SURFACE_BACKEND(script, script, yes, [ + any2ppm_cs=yes +]) + +dnl =========================================================================== + +# We use pkg-config to look for freetype2, but fall back to +# freetype-config if it fails. We prefer pkg-config, since we can +# then just put freetype2 >= $FREETYPE_MIN_VERSION in +# Requires.private, but at least up to 2003-06-07, there was no +# freetype2.pc in the release. +# +# FreeType versions come in three forms: +# release (such as 2.1.9) +# libtool (such as 9.7.3) (returned by freetype-config and pkg-config) +# platform-specific/soname (such as 6.3.4) +# and they recommend you never use the platform-specific version +# (see docs/VERSION.DLL in freetype2 sources) +# +# Set these as appropriate: + +# release number - for information only +FREETYPE_MIN_RELEASE=2.1.9 +# libtool-specific version - this is what is checked +FREETYPE_MIN_VERSION=9.7.3 + +CAIRO_ENABLE_FONT_BACKEND(ft, FreeType, auto, [ + + PKG_CHECK_MODULES(FREETYPE, freetype2 >= $FREETYPE_MIN_VERSION, + [freetype_pkgconfig=yes], + [freetype_pkgconfig=no]) + + if test "x$freetype_pkgconfig" = "xyes"; then + ft_REQUIRES="freetype2 >= $FREETYPE_MIN_VERSION $ft_REQUIRES" + else + + if test -z "$FREETYPE_CONFIG"; then + AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) + fi + if test "x$FREETYPE_CONFIG" = "xno" ; then + use_ft='no (freetype-config not found in path or $FREETYPE_CONFIG)' + else + AC_MSG_CHECKING(freetype2 libtool version) + + FREETYPE_VERSION=`$FREETYPE_CONFIG --version` + AX_COMPARE_VERSION([$FREETYPE_VERSION], [gt], [$FREETYPE_MIN_VERSION], + [AC_MSG_RESULT($FREETYPE_VERSION - OK) + ft_NONPKGCONFIG_CFLAGS=`$FREETYPE_CONFIG --cflags` + ft_NONPKGCONFIG_LIBS=`$FREETYPE_CONFIG --libs`], + [AC_MSG_RESULT($FREETYPE_VERSION - Too old) + use_ft="no ($FREETYPE_VERSION found; version $FREETYPE_MIN_VERSION from release $FREETYPE_MIN_RELEASE required)"]) + fi + fi + + ft_CFLAGS="$FREETYPE_CFLAGS" + ft_LIBS="$FREETYPE_LIBS" +]) + +FONTCONFIG_MIN_VERSION=2.2.95 +CAIRO_ENABLE_FONT_BACKEND(fc, Fontconfig, auto, [ + use_fc=$use_ft + if test "x$use_fc" = "xyes"; then + fc_REQUIRES="fontconfig >= $FONTCONFIG_MIN_VERSION" + PKG_CHECK_MODULES(FONTCONFIG, $fc_REQUIRES,, + [use_fc="no (requires $fc_REQUIRES)"]) + fi + fc_CFLAGS="$FONTCONFIG_CFLAGS" + fc_LIBS="$FONTCONFIG_LIBS" +]) + +if test "x$use_ft" = "xyes"; then + _save_libs="$LIBS" + _save_cflags="$CFLAGS" + LIBS="$LIBS $ft_LIBS" + CFLAGS="$CFLAGS $ft_CFLAGS" + + AC_CHECK_FUNCS(FT_Get_X11_Font_Format FT_GlyphSlot_Embolden FT_GlyphSlot_Oblique FT_Load_Sfnt_Table FT_Library_SetLcdFilter) + + LIBS="$_save_libs" + CFLAGS="$_save_cflags" +fi + +if test "x$use_fc" = "xyes"; then + CAIRO_CHECK_FUNCS_WITH_FLAGS(FcInit FcFini, [$FONTCONFIG_CFLAGS], [$FONTCONFIG_LIBS]) +fi + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(ps, PostScript, yes, [ + # The ps backend requires zlib. + use_ps=$have_libz + ps_NONPKGCONFIG_LIBS=-lz +]) + +dnl =========================================================================== + +SPECTRE_VERSION_REQUIRED=0.2.0 +test_ps=no +any2ppm_ps=no +if test "x$use_ps" = "xyes"; then + AC_CHECK_PROG(GS, gs, gs) + if test "$GS"; then + AC_DEFINE([CAIRO_CAN_TEST_PS_SURFACE], 1, [Define to 1 if the PS backend can be tested (needs ghostscript)]) + test_ps="yes" + else + AC_MSG_WARN([PS backend will not be tested since ghostscript is not available]) + test_ps="no (requires ghostscript)" + fi + + libspectre_DEPENDENCY="libspectre >= $SPECTRE_VERSION_REQUIRED" + PKG_CHECK_MODULES(LIBSPECTRE, $libspectre_DEPENDENCY, + [any2ppm_ps=yes], + [test_ps="no (requires libspectre)"]) +fi + +AM_CONDITIONAL(CAIRO_CAN_TEST_PS_SURFACE, test "x$test_ps" = "xyes") +AM_CONDITIONAL(CAIRO_HAS_SPECTRE, test "x$any2ppm_ps" = "xyes") +if test "x$any2ppm_ps" = "xyes"; then + AC_DEFINE([CAIRO_HAS_SPECTRE], 1, [Define to 1 if libspectre is available]) +fi +AC_SUBST(LIBSPECTRE_CFLAGS) +AC_SUBST(LIBSPECTRE_LIBS) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(pdf, PDF, yes, [ + # The pdf backend requires zlib. + use_pdf=$have_libz + pdf_NONPKGCONFIG_LIBS=-lz +]) + +dnl =========================================================================== + +# poppler-0.17.4 fixes text-pattern and text-transform +POPPLER_VERSION_REQUIRED=0.17.4 +test_pdf=no +any2ppm_pdf=no +if test "x$use_pdf" = "xyes"; then + poppler_DEPENDENCY="poppler-glib >= $POPPLER_VERSION_REQUIRED" + PKG_CHECK_MODULES(POPPLER, $poppler_DEPENDENCY, + [CAIRO_CHECK_FUNCS_WITH_FLAGS(poppler_page_render, [$POPPLER_CFLAGS], [$POPPLER_LIBS], + [test_pdf=yes; any2ppm_pdf=yes], + [test_pdf="no (requires $poppler_DEPENDENCY)"])], + [test_pdf="no (requires $poppler_DEPENDENCY)"]) + if test "x$test_pdf" = "xyes"; then + AC_DEFINE([CAIRO_CAN_TEST_PDF_SURFACE], 1, [Define to 1 if the PDF backend can be tested (need poppler and other dependencies for pdf2png)]) + else + AC_MSG_WARN([PDF backend will not be tested since poppler >= $POPPLER_VERSION_REQUIRED is not available]) + fi +fi + +AM_CONDITIONAL(CAIRO_CAN_TEST_PDF_SURFACE, test "x$test_pdf" = "xyes") +AC_SUBST(POPPLER_CFLAGS) +AC_SUBST(POPPLER_LIBS) + +AM_CONDITIONAL(CAIRO_HAS_MULTI_PAGE_SURFACES, test "x$use_ps" = "xyes" -o "x$use_pdf" = "xyes") + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(svg, SVG, yes, [ + if test "x$use_png" != "xyes"; then + use_svg="no (requires --enable-png)" + fi +]) + +LIBRSVG_VERSION_REQUIRED=2.35.0 +test_svg=no +any2ppm_svg=no +if test "x$use_svg" = "xyes"; then + librsvg_DEPENDENCY="librsvg-2.0 >= $LIBRSVG_VERSION_REQUIRED" + PKG_CHECK_MODULES(LIBRSVG, $librsvg_DEPENDENCY gdk-2.0, + [CAIRO_CHECK_FUNCS_WITH_FLAGS(rsvg_pixbuf_from_file, [$LIBRSVG_CFLAGS], [$LIBRSVG_LIBS], + [test_svg=yes; any2ppm_svg=yes], + [test_svg="no (requires $librsvg_DEPENDENCY)"])], + [test_svg="no (requires $librsvg_DEPENDENCY)"]) + if test "x$test_svg" = "xyes"; then + AC_DEFINE([CAIRO_CAN_TEST_SVG_SURFACE], 1, [Define to 1 if the SVG backend can be tested]) + else + AC_MSG_WARN([SVG backend will not be tested since librsvg >= $LIBRSVG_VERSION_REQUIRED is not available]) + fi +fi + +AM_CONDITIONAL(CAIRO_CAN_TEST_SVG_SURFACE, test "x$test_svg" = "xyes") +AC_SUBST(LIBRSVG_CFLAGS) +AC_SUBST(LIBRSVG_LIBS) + +dnl =========================================================================== + +dnl XXX make this a private feature? +CAIRO_ENABLE(test_surfaces, test surfaces, no) + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(image, image, always, [ + pixman_REQUIRES="pixman-1 >= 0.30.0" + PKG_CHECK_MODULES(pixman, $pixman_REQUIRES, , + [use_image="no (requires $pixman_REQUIRES http://cairographics.org/releases/)"]) + image_REQUIRES=$pixman_REQUIRES + image_CFLAGS=$pixman_CFLAGS + image_LIBS=$pixman_LIBS +]) + +if pkg-config --exists 'pixman-1 >= 0.27.1'; then + AC_DEFINE([HAS_PIXMAN_GLYPHS], 1, [Enable pixman glyph cache]) +fi + + +dnl =========================================================================== + +CAIRO_ENABLE_SURFACE_BACKEND(mime, mime, always) +CAIRO_ENABLE_SURFACE_BACKEND(recording, recording, always) +CAIRO_ENABLE_SURFACE_BACKEND(observer, observer, always) +CAIRO_ENABLE_SURFACE_BACKEND(tee, tee, no) +CAIRO_ENABLE_SURFACE_BACKEND(xml, xml, no, [ + use_xml=$have_libz + xml_NONPKGCONFIG_LIBS=-lz +]) + +dnl =========================================================================== + +CAIRO_ENABLE_FONT_BACKEND(user, user, always) + +dnl =========================================================================== +dnl +dnl This needs to be last on our list of features so that the pthread libs and flags +dnl gets prefixed in front of everything else in CAIRO_{CFLAGS,LIBS}. +dnl +have_real_pthread=no +have_pthread=no +CAIRO_ENABLE(pthread, pthread, auto, [CAIRO_CONFIGURE_PTHREAD]) +AM_CONDITIONAL(HAVE_REAL_PTHREAD, test "x$use_pthread" = "xyes" -a "x$have_real_pthread" = "xyes") +AM_CONDITIONAL(HAVE_PTHREAD, test "x$use_pthread" = "xyes") +AC_SUBST(pthread_CFLAGS) +AC_SUBST(pthread_LIBS) +AC_SUBST(real_pthread_CFLAGS) +AC_SUBST(real_pthread_LIBS) + + +dnl =========================================================================== +dnl Build gobject integration library + +CAIRO_ENABLE_FUNCTIONS(gobject, gobject, auto, [ + gobject_REQUIRES="gobject-2.0 glib-2.0 >= 2.14" + PKG_CHECK_MODULES(GOBJECT, $gobject_REQUIRES, , + [use_gobject="no (requires $gobject_REQUIRES http://download.gnome.org/pub/GNOME/sources/glib/)"]) + gobject_NONPKGCONFIG_EXTRA_LIBS="-L\${libdir} -lcairo-gobject" +]) +dnl I'm too lazy to fix the caching properly +if test "x$use_gobject" = "xyes"; then + PKG_CHECK_MODULES(GOBJECT, $gobject_REQUIRES, : ) +fi + +dnl =========================================================================== +dnl Default to quick testing during development, but force a full test before +dnl release + +AC_ARG_ENABLE(full-testing, + AS_HELP_STRING([--enable-full-testing], + [Sets the test suite to perform full testing by default, which + will dramatically slow down make check, but is a + *requirement* before release.]), [ +if test "x$enableval" = "xyes"; then + CAIRO_TEST_MODE=full + AC_SUBST(CAIRO_TEST_MODE) +fi +]) + +dnl =========================================================================== +dnl Build the external converter if we have any of the test backends +AM_CONDITIONAL(BUILD_ANY2PPM, + test "x$any2ppm_svg" = "xyes" \ + -o "x$any2ppm_pdf" = "xyes" \ + -o "x$any2ppm_ps" = "xyes" \ + -o "x$any2ppm_cs" = "xyes") + +dnl =========================================================================== +dnl Some utilities need to dlopen the shared libraries, so they need to +dnl know how libtools will name them + +case $host in +*-*-darwin*) + SHLIB_EXT="dylib" + ;; +*) + SHLIB_EXT="so" + ;; +esac +AC_DEFINE_UNQUOTED(SHARED_LIB_EXT, "${SHLIB_EXT}", [Shared library file extension]) +AC_SUBST(SHLIB_EXT) + +dnl =========================================================================== +dnl The tracing utility requires LD_PRELOAD, so only build it for systems +dnl that are known to work. + +case $host in +*-linux*|*-*bsd*|*-solaris*|*-*-darwin*|*-dragonfly*|*-*-gnu*) + have_ld_preload="yes" + ;; +*) + have_ld_preload="no" + ;; +esac + +CAIRO_ENABLE(trace, cairo-trace, auto, [ + if test "x$have_ld_preload" != "xyes" -o \ + "x$have_libz" != "xyes" -o \ + "x$have_real_pthread" != "xyes" -o \ + "x$have_dlsym" != "xyes"; then + use_trace="no (requires dynamic linker and zlib and real pthreads)" + fi +]) + +CAIRO_ENABLE(interpreter, cairo-script-interpreter, yes, [ + if test "x$have_libz" != "xyes"; then + use_interpreter="no (requires zlib)" + fi +]) + +AC_CHECK_LIB(bfd, bfd_openr, + [AC_CHECK_HEADER(bfd.h, [have_bfd=yes], + [have_bfd=no])], [have_bfd=no]) +AC_CHECK_HEADER(libiberty.h,, [have_bfd=no]) +if test "x$have_bfd" = "xyes"; then + AC_DEFINE([HAVE_BFD], [1], [Define to 1 if you have the binutils development files installed]) + BFD_LIBS=-lbfd + AC_SUBST(BFD_LIBS) +fi + +CAIRO_ENABLE(symbol_lookup, symbol-lookup, auto, [ + if test "x$have_bfd" != "xyes"; then + use_symbol_lookup="no (requires bfd)" + fi +]) + +PKG_CHECK_MODULES(glib, glib-2.0, have_glib=yes, have_glib=no) +AC_SUBST(glib_CFLAGS) +AC_SUBST(glib_LIBS) +AM_CONDITIONAL(BUILD_SPHINX, test "x$have_glib" = "xyes" -a "x$have_windows" = "xno") + +save_LIBS="$LIBS" +AC_CHECK_LIB(rt, shm_open, shm_LIBS="-lrt") +AC_SUBST(shm_LIBS) +LIBS="$save_LIBS" + +dnl =========================================================================== + +AC_ARG_ENABLE(some-floating-point, + AS_HELP_STRING([--disable-some-floating-point], + [Disable certain code paths that rely heavily on double precision + floating-point calculation. This option can improve + performance on systems without a double precision floating-point + unit, but might degrade performance on those that do.]), [ +if test "x$enableval" = "xno"; then + # A value of 'no' for $enableval means that they want to disable, which + # means 'yes' for $disable_some_floating_point. + disable_some_floating_point=yes +fi +], [disable_some_floating_point=no]) + +AM_CONDITIONAL(DISABLE_SOME_FLOATING_POINT, + test "x$disable_some_floating_point" = "xyes") +if test "x$disable_some_floating_point" = "xyes"; then + AC_DEFINE(DISABLE_SOME_FLOATING_POINT, 1, + [Define to 1 to disable certain code paths that rely heavily on + double precision floating-point calculation]) +fi + +dnl =========================================================================== + +dnl Extra stuff we need to do when building C++ code +need_cxx="no" +AS_IF([test "x$use_skia" = "xyes"], [need_cxx="yes"]) +AS_IF([test "x$use_qt" = "xyes"], [need_cxx="yes"]) +AS_IF([test "x$use_beos" = "xyes"], [need_cxx="yes"]) + +AM_CONDITIONAL(BUILD_CXX, test "x$need_cxx" = "xyes") + +dnl =========================================================================== + +# We use GTK+ for some utility/debugging tools +PKG_CHECK_MODULES(gtk, "gtk+-2.0",have_gtk=yes, have_gtk=no) +AM_CONDITIONAL(HAVE_GTK, test "x$have_gtk" = "xyes") + +AC_CONFIG_FILES([ +Makefile +boilerplate/Makefile +src/Makefile +test/Makefile +test/pdiff/Makefile +perf/Makefile +perf/micro/Makefile +util/Makefile +util/cairo-fdr/Makefile +util/cairo-gobject/Makefile +util/cairo-missing/Makefile +util/cairo-script/Makefile +util/cairo-script/examples/Makefile +util/cairo-sphinx/Makefile +util/cairo-trace/Makefile +util/cairo-trace/cairo-trace +doc/Makefile +doc/public/Makefile +]) +AC_CONFIG_COMMANDS([cairo-trace], + [chmod a+x util/cairo-trace/cairo-trace]) + +AC_OUTPUT +CAIRO_REPORT diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 000000000..864a9f1df --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,7 @@ +include $(top_srcdir)/build/Makefile.am.common + +SUBDIRS=public + +doc: + cd public && $(MAKE) $(AM_MAKEFLAGS) doc +.PHONY: doc diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 000000000..d47604771 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,1120 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/test-driver +EXTRA_PROGRAMS = +TESTS = +check_PROGRAMS = +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + check recheck distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in +SUBDIRS = public +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-TESTS check-am clean clean-checkPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + + +doc: + cd public && $(MAKE) $(AM_MAKEFLAGS) doc +.PHONY: doc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/public/Makefile.am b/doc/public/Makefile.am new file mode 100644 index 000000000..11f9e7b72 --- /dev/null +++ b/doc/public/Makefile.am @@ -0,0 +1,64 @@ +include $(top_srcdir)/build/Makefile.am.common +include $(top_srcdir)/src/Makefile.am.features + +# The name of the module. +DOC_MODULE=cairo + +# The top-level SGML file. +DOC_MAIN_SGML_FILE=cairo-docs.xml + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS=--deprecated-guards="CAIRO_DISABLE_DEPRECATED" --ignore-decorators="cairo_public|cairo_private" + +# The directory containing the source code. +DOC_SOURCE_DIR=$(top_srcdir)/src + +# Used for dependencies +HFILE_GLOB=$(top_srcdir)/src/cairo*.h +CFILE_GLOB=$(top_srcdir)/src/cairo*.c +EXTRA_HFILES=$(top_builddir)/src/cairo-supported-features.h + +# Headers to ignore +IGNORE_HFILES= \ + drm \ + cairo-features.h \ + cairo-features-win32.h \ + $(all_cairo_private) \ + $(unsupported_cairo_headers) \ + $(NULL) + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS=--sgml-mode --output-format=xml --name-space=cairo + +# Extra options to supply to gtkdoc-mktmpl +MKTMPL_OPTIONS= + +# Non-autogenerated SGML files to be included in $(DOC_MAIN_SGML_FILE) +content_files = \ + language-bindings.xml \ + version.xml \ + $(NULL) + +version.xml: $(top_srcdir)/cairo-version.h + echo $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) > $@ + +# Images to copy into HTML directory +HTML_IMAGES = + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS= + +include $(top_srcdir)/build/Makefile.am.gtk-doc + +dist-hook: doc + +# This line really belongs in gtk-doc.mk +$(REPORT_FILES): sgml-build.stamp + +if ENABLE_GTK_DOC +TESTS += check-doc-coverage.sh +endif + +TESTS += check-doc-syntax.sh +EXTRA_DIST += check-doc-coverage.sh check-doc-syntax.sh +TESTS_ENVIRONMENT = srcdir="$(srcdir)" top_srcdir="$(top_srcdir)" MAKE="$(MAKE) $(AM_MAKEFLAGS)" DOC_MODULE="$(DOC_MODULE)" REPORT_FILES="$(REPORT_FILES)" diff --git a/doc/public/Makefile.in b/doc/public/Makefile.in new file mode 100644 index 000000000..49afcfbc1 --- /dev/null +++ b/doc/public/Makefile.in @@ -0,0 +1,1918 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Generated by configure. Do not edit. + +# Makefile.sources +# +# This file is the canonical location listing all the source files used +# to build the cairo library. Every source file is categorized as one of: +# +# * public header file +# * private header file (must end in -private.h except for cairoint.h) +# * source code file +# +# Every source file should be specified exactly once, grouped with the +# feature that uses the source file. If more than one feature use the +# file (like pdf_operators or font_subset files), the files should be +# appended to to the base cairo files, and the code inside them +# enabled/disabled using C preprocessor macros defined in cairoint.h. +# See how pdf_operators or font_subset are handled. +# +# The sources are picked up according to the configured features +# by the generated file Makefile.am.features or Makefile.win32.features. +# +# These are a few special source files. Those are not included in this +# file to not confuse build systems. Each build system must handle them +# separately. These files include: +# +# * cairo-features.h: +# This file is generated by configure and includes macros signifying +# which features are enabled. This file should be installed like +# other public headers, but should NOT be distributed in the cairo +# distribution. +# +# * cairo-version.h: +# This is a dummy header file used during the build, but it should +# NOT be installed. Its sole purpose is to make sure changes in the +# cairo version do not trigger a full rebuild of the library, but +# just the functions actually using the version information. +# +# * $(top_srcdir)/cairo-version.h: +# This is the real file holding the cairo version number. This file +# should be installed like other public headers. This is used during +# the build by cairo-version.c only. +# +# * cairo-supported-features.h: +# This file is generated by configure and includes macros signifying +# all supported features. This is used by gtk-doc to generate +# documentation for all those macros, enabled or not. +# This file is NOT used during the build of the library and should +# NOT be installed or distributed. +# +# Please follow the strict syntax of this file, including keeping file +# lists sorted. +# + +# BEFORE MODIFYING THIS FILE: +# +# This file is a descendant of an old copy of gtk-doc.make, modified for cairo minimally: +# +# - Moved to build/ +# - Made it append to EXTRA_DIST and CLEANFILES +# - Instead of all-local, make "doc" build docs, and err if gtk-doc not enabled +# - Some other changed introduced in 7f114b781f5c530d57530e5f76402e41cdabac6b +# +# Before changing it, check to see if a newer gtk-doc.make has fixed the issue you are facing. +# From time to time, it would be nice to udpate this to the latest copy of gtk-doc.make, but +# please do review all the differences and port our modifications forward. +# + +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(top_srcdir)/src/Makefile.am.features \ + $(top_srcdir)/src/Makefile.sources \ + $(top_srcdir)/build/Makefile.am.gtk-doc $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/build/test-driver README +EXTRA_PROGRAMS = +check_PROGRAMS = +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_1 = $(cairo_xlib_headers) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_2 = $(cairo_xlib_private) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_3 = $(cairo_xlib_cxx_sources) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_4 = $(cairo_xlib_sources) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_5 = cairo-xlib.pc +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_6 = $(cairo_xlib_xrender_headers) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_7 = $(cairo_xlib_xrender_private) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_8 = $(cairo_xlib_xrender_cxx_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_9 = $(cairo_xlib_xrender_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_10 = cairo-xlib-xrender.pc +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_11 = $(cairo_xcb_headers) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_12 = $(cairo_xcb_private) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_13 = $(cairo_xcb_cxx_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_14 = $(cairo_xcb_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_15 = cairo-xcb.pc +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_16 = $(cairo_xlib_xcb_headers) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_17 = $(cairo_xlib_xcb_private) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_18 = $(cairo_xlib_xcb_cxx_sources) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_19 = $(cairo_xlib_xcb_sources) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_20 = cairo-xlib-xcb.pc +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_21 = $(cairo_xcb_shm_headers) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_22 = $(cairo_xcb_shm_private) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_23 = $(cairo_xcb_shm_cxx_sources) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_24 = $(cairo_xcb_shm_sources) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_25 = cairo-xcb-shm.pc +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_26 = $(cairo_qt_headers) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_27 = $(cairo_qt_private) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_28 = $(cairo_qt_cxx_sources) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_29 = $(cairo_qt_sources) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_30 = cairo-qt.pc +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_31 = $(cairo_quartz_headers) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_32 = $(cairo_quartz_private) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_33 = $(cairo_quartz_cxx_sources) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_34 = $(cairo_quartz_sources) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_35 = cairo-quartz.pc +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_36 = $(cairo_quartz_font_headers) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_37 = $(cairo_quartz_font_private) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_38 = $(cairo_quartz_font_cxx_sources) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_39 = $(cairo_quartz_font_sources) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_40 = cairo-quartz-font.pc +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_41 = $(cairo_quartz_image_headers) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_42 = $(cairo_quartz_image_private) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_43 = $(cairo_quartz_image_cxx_sources) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_44 = $(cairo_quartz_image_sources) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_45 = cairo-quartz-image.pc +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_46 = $(cairo_win32_headers) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_47 = $(cairo_win32_private) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_48 = $(cairo_win32_cxx_sources) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_49 = $(cairo_win32_sources) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_50 = cairo-win32.pc +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_51 = $(cairo_win32_font_headers) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_52 = $(cairo_win32_font_private) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_53 = $(cairo_win32_font_cxx_sources) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_54 = $(cairo_win32_font_sources) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_55 = cairo-win32-font.pc +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_56 = $(cairo_skia_headers) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_57 = $(cairo_skia_private) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_58 = $(cairo_skia_cxx_sources) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_59 = $(cairo_skia_sources) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_60 = cairo-skia.pc +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_61 = $(cairo_os2_headers) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_62 = $(cairo_os2_private) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_63 = $(cairo_os2_cxx_sources) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_64 = $(cairo_os2_sources) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_65 = cairo-os2.pc +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_66 = $(cairo_beos_headers) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_67 = $(cairo_beos_private) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_68 = $(cairo_beos_cxx_sources) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_69 = $(cairo_beos_sources) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_70 = cairo-beos.pc +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_71 = $(cairo_drm_headers) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_72 = $(cairo_drm_private) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_73 = $(cairo_drm_cxx_sources) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_74 = $(cairo_drm_sources) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_75 = cairo-drm.pc +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_76 = $(cairo_gallium_headers) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_77 = $(cairo_gallium_private) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_78 = $(cairo_gallium_cxx_sources) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_79 = $(cairo_gallium_sources) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_80 = cairo-gallium.pc +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_81 = $(cairo_png_headers) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_82 = $(cairo_png_private) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_83 = $(cairo_png_cxx_sources) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_84 = $(cairo_png_sources) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_85 = cairo-png.pc +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_86 = $(cairo_gl_headers) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_87 = $(cairo_gl_private) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_88 = $(cairo_gl_cxx_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_89 = $(cairo_gl_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_90 = cairo-gl.pc +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_91 = $(cairo_glesv2_headers) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_92 = $(cairo_glesv2_private) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_93 = $(cairo_glesv2_cxx_sources) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_94 = $(cairo_glesv2_sources) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_95 = cairo-glesv2.pc +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_96 = $(cairo_cogl_headers) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_97 = $(cairo_cogl_private) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_98 = $(cairo_cogl_cxx_sources) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_99 = $(cairo_cogl_sources) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_100 = cairo-cogl.pc +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_101 = $(cairo_directfb_headers) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_102 = $(cairo_directfb_private) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_103 = $(cairo_directfb_cxx_sources) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_104 = $(cairo_directfb_sources) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_105 = cairo-directfb.pc +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_106 = $(cairo_vg_headers) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_107 = $(cairo_vg_private) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_108 = $(cairo_vg_cxx_sources) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_109 = $(cairo_vg_sources) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_110 = cairo-vg.pc +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_111 = $(cairo_egl_headers) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_112 = $(cairo_egl_private) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_113 = $(cairo_egl_cxx_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_114 = $(cairo_egl_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_115 = cairo-egl.pc +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_116 = $(cairo_glx_headers) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_117 = $(cairo_glx_private) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_118 = $(cairo_glx_cxx_sources) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_119 = $(cairo_glx_sources) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_120 = cairo-glx.pc +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_121 = $(cairo_wgl_headers) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_122 = $(cairo_wgl_private) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_123 = $(cairo_wgl_cxx_sources) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_124 = $(cairo_wgl_sources) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_125 = cairo-wgl.pc +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_126 = $(cairo_script_headers) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_127 = $(cairo_script_private) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_128 = $(cairo_script_cxx_sources) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_129 = $(cairo_script_sources) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_130 = cairo-script.pc +@CAIRO_HAS_FT_FONT_TRUE@am__append_131 = $(cairo_ft_headers) +@CAIRO_HAS_FT_FONT_TRUE@am__append_132 = $(cairo_ft_private) +@CAIRO_HAS_FT_FONT_TRUE@am__append_133 = $(cairo_ft_cxx_sources) +@CAIRO_HAS_FT_FONT_TRUE@am__append_134 = $(cairo_ft_sources) +@CAIRO_HAS_FT_FONT_TRUE@am__append_135 = cairo-ft.pc +@CAIRO_HAS_FC_FONT_TRUE@am__append_136 = $(cairo_fc_headers) +@CAIRO_HAS_FC_FONT_TRUE@am__append_137 = $(cairo_fc_private) +@CAIRO_HAS_FC_FONT_TRUE@am__append_138 = $(cairo_fc_cxx_sources) +@CAIRO_HAS_FC_FONT_TRUE@am__append_139 = $(cairo_fc_sources) +@CAIRO_HAS_FC_FONT_TRUE@am__append_140 = cairo-fc.pc +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_141 = $(cairo_ps_headers) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_142 = $(cairo_ps_private) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_143 = $(cairo_ps_cxx_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_144 = $(cairo_ps_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_145 = cairo-ps.pc +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_146 = $(cairo_pdf_headers) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_147 = $(cairo_pdf_private) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_148 = $(cairo_pdf_cxx_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_149 = $(cairo_pdf_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_150 = cairo-pdf.pc +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_151 = $(cairo_svg_headers) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_152 = $(cairo_svg_private) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_153 = $(cairo_svg_cxx_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_154 = $(cairo_svg_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_155 = cairo-svg.pc +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_156 = $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_157 = $(cairo_test_surfaces_cxx_sources) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_158 = $(cairo_test_surfaces_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_159 = $(cairo_tee_headers) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_160 = $(cairo_tee_private) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_161 = $(cairo_tee_cxx_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_162 = $(cairo_tee_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_163 = cairo-tee.pc +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_164 = $(cairo_xml_headers) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_165 = $(cairo_xml_private) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_166 = $(cairo_xml_cxx_sources) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_167 = $(cairo_xml_sources) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_168 = cairo-xml.pc +@CAIRO_HAS_PTHREAD_TRUE@am__append_169 = $(cairo_pthread_private) $(cairo_pthread_headers) +@CAIRO_HAS_PTHREAD_TRUE@am__append_170 = $(cairo_pthread_cxx_sources) +@CAIRO_HAS_PTHREAD_TRUE@am__append_171 = $(cairo_pthread_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_172 = $(cairo_gobject_headers) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_173 = $(cairo_gobject_private) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_174 = $(cairo_gobject_cxx_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_175 = $(cairo_gobject_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_176 = cairo-gobject.pc +@CAIRO_HAS_TRACE_TRUE@am__append_177 = $(cairo_trace_private) $(cairo_trace_headers) +@CAIRO_HAS_TRACE_TRUE@am__append_178 = $(cairo_trace_cxx_sources) +@CAIRO_HAS_TRACE_TRUE@am__append_179 = $(cairo_trace_sources) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_180 = $(cairo_interpreter_private) $(cairo_interpreter_headers) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_181 = $(cairo_interpreter_cxx_sources) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_182 = $(cairo_interpreter_sources) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_183 = $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_184 = $(cairo_symbol_lookup_cxx_sources) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_185 = $(cairo_symbol_lookup_sources) +@ENABLE_GTK_DOC_TRUE@am__append_186 = check-doc-coverage.sh +subdir = doc/public +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) $(SCANOBJ_FILES) $(REPORT_FILES) \ + $(DOC_STAMPS) +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = $(content_files) $(HTML_IMAGES) $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt \ + check-doc-coverage.sh check-doc-syntax.sh +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in +TESTS = $(am__append_186) check-doc-syntax.sh +cairo_headers = cairo.h cairo-deprecated.h +cairo_private = cairoint.h cairo-analysis-surface-private.h \ + cairo-arc-private.h cairo-array-private.h \ + cairo-atomic-private.h cairo-backend-private.h \ + cairo-box-inline.h cairo-boxes-private.h cairo-cache-private.h \ + cairo-clip-inline.h cairo-clip-private.h \ + cairo-combsort-inline.h cairo-compiler-private.h \ + cairo-compositor-private.h cairo-contour-inline.h \ + cairo-contour-private.h cairo-composite-rectangles-private.h \ + cairo-damage-private.h cairo-default-context-private.h \ + cairo-device-private.h cairo-error-inline.h \ + cairo-error-private.h cairo-fixed-private.h \ + cairo-fixed-type-private.h cairo-freelist-private.h \ + cairo-freelist-type-private.h cairo-freed-pool-private.h \ + cairo-fontconfig-private.h cairo-gstate-private.h \ + cairo-hash-private.h cairo-image-info-private.h \ + cairo-image-surface-inline.h cairo-image-surface-private.h \ + cairo-line-inline.h cairo-line-private.h cairo-list-inline.h \ + cairo-list-private.h cairo-malloc-private.h \ + cairo-mempool-private.h cairo-mutex-impl-private.h \ + cairo-mutex-list-private.h cairo-mutex-private.h \ + cairo-mutex-type-private.h cairo-output-stream-private.h \ + cairo-paginated-private.h cairo-paginated-surface-private.h \ + cairo-path-fixed-private.h cairo-path-private.h \ + cairo-pattern-inline.h cairo-pattern-private.h \ + cairo-pixman-private.h cairo-private.h \ + cairo-recording-surface-inline.h \ + cairo-recording-surface-private.h \ + cairo-reference-count-private.h cairo-region-private.h \ + cairo-rtree-private.h cairo-scaled-font-private.h \ + cairo-slope-private.h cairo-spans-private.h \ + cairo-spans-compositor-private.h cairo-stroke-dash-private.h \ + cairo-surface-inline.h cairo-surface-private.h \ + cairo-surface-backend-private.h \ + cairo-surface-clipper-private.h \ + cairo-surface-fallback-private.h \ + cairo-surface-observer-inline.h \ + cairo-surface-observer-private.h \ + cairo-surface-offset-private.h \ + cairo-surface-subsurface-inline.h \ + cairo-surface-subsurface-private.h \ + cairo-surface-snapshot-inline.h \ + cairo-surface-snapshot-private.h \ + cairo-surface-wrapper-private.h cairo-time-private.h \ + cairo-types-private.h cairo-traps-private.h \ + cairo-tristrip-private.h cairo-user-font-private.h \ + cairo-wideint-private.h cairo-wideint-type-private.h $(NULL) \ + $(_cairo_font_subset_private) $(_cairo_pdf_operators_private) +cairo_sources = cairo-analysis-surface.c cairo-arc.c cairo-array.c \ + cairo-atomic.c cairo-base64-stream.c cairo-base85-stream.c \ + cairo-bentley-ottmann.c cairo-bentley-ottmann-rectangular.c \ + cairo-bentley-ottmann-rectilinear.c \ + cairo-botor-scan-converter.c cairo-boxes.c \ + cairo-boxes-intersect.c cairo.c cairo-cache.c cairo-clip.c \ + cairo-clip-boxes.c cairo-clip-polygon.c cairo-clip-region.c \ + cairo-clip-surface.c cairo-color.c \ + cairo-composite-rectangles.c cairo-compositor.c \ + cairo-contour.c cairo-damage.c cairo-debug.c \ + cairo-default-context.c cairo-device.c cairo-error.c \ + cairo-fallback-compositor.c cairo-fixed.c cairo-font-face.c \ + cairo-font-face-twin.c cairo-font-face-twin-data.c \ + cairo-font-options.c cairo-freelist.c cairo-freed-pool.c \ + cairo-gstate.c cairo-hash.c cairo-hull.c \ + cairo-image-compositor.c cairo-image-info.c \ + cairo-image-source.c cairo-image-surface.c cairo-line.c \ + cairo-lzw.c cairo-matrix.c cairo-mask-compositor.c \ + cairo-mesh-pattern-rasterizer.c cairo-mempool.c cairo-misc.c \ + cairo-mono-scan-converter.c cairo-mutex.c \ + cairo-no-compositor.c cairo-observer.c cairo-output-stream.c \ + cairo-paginated-surface.c cairo-path-bounds.c cairo-path.c \ + cairo-path-fill.c cairo-path-fixed.c cairo-path-in-fill.c \ + cairo-path-stroke.c cairo-path-stroke-boxes.c \ + cairo-path-stroke-polygon.c cairo-path-stroke-traps.c \ + cairo-path-stroke-tristrip.c cairo-pattern.c cairo-pen.c \ + cairo-polygon.c cairo-polygon-intersect.c \ + cairo-polygon-reduce.c cairo-raster-source-pattern.c \ + cairo-recording-surface.c cairo-rectangle.c \ + cairo-rectangular-scan-converter.c cairo-region.c \ + cairo-rtree.c cairo-scaled-font.c \ + cairo-shape-mask-compositor.c cairo-slope.c cairo-spans.c \ + cairo-spans-compositor.c cairo-spline.c cairo-stroke-dash.c \ + cairo-stroke-style.c cairo-surface.c cairo-surface-clipper.c \ + cairo-surface-fallback.c cairo-surface-observer.c \ + cairo-surface-offset.c cairo-surface-snapshot.c \ + cairo-surface-subsurface.c cairo-surface-wrapper.c \ + cairo-time.c cairo-tor-scan-converter.c \ + cairo-tor22-scan-converter.c cairo-clip-tor-scan-converter.c \ + cairo-toy-font-face.c cairo-traps.c cairo-tristrip.c \ + cairo-traps-compositor.c cairo-unicode.c cairo-user-font.c \ + cairo-version.c cairo-wideint.c $(NULL) \ + $(_cairo_font_subset_sources) $(_cairo_pdf_operators_sources) \ + $(_cairo_deflate_stream_sources) +_cairo_font_subset_private = \ + cairo-scaled-font-subsets-private.h \ + cairo-truetype-subset-private.h \ + cairo-type1-private.h \ + cairo-type3-glyph-surface-private.h \ + $(NULL) + +_cairo_font_subset_sources = \ + cairo-cff-subset.c \ + cairo-scaled-font-subsets.c \ + cairo-truetype-subset.c \ + cairo-type1-fallback.c \ + cairo-type1-glyph-names.c \ + cairo-type1-subset.c \ + cairo-type3-glyph-surface.c \ + $(NULL) + +cairo_egl_sources = cairo-egl-context.c +cairo_glx_sources = cairo-glx-context.c +cairo_wgl_sources = cairo-wgl-context.c +_cairo_pdf_operators_private = cairo-pdf-operators-private.h cairo-pdf-shading-private.h +_cairo_pdf_operators_sources = cairo-pdf-operators.c cairo-pdf-shading.c +cairo_png_sources = cairo-png.c +cairo_ps_headers = cairo-ps.h +cairo_ps_private = cairo-ps-surface-private.h +cairo_ps_sources = cairo-ps-surface.c +_cairo_deflate_stream_sources = cairo-deflate-stream.c +cairo_pdf_headers = cairo-pdf.h +cairo_pdf_private = cairo-pdf-surface-private.h +cairo_pdf_sources = cairo-pdf-surface.c +cairo_svg_headers = cairo-svg.h +cairo_svg_private = cairo-svg-surface-private.h +cairo_svg_sources = cairo-svg-surface.c +cairo_ft_headers = cairo-ft.h +cairo_ft_private = cairo-ft-private.h +cairo_ft_sources = cairo-ft-font.c + +# These are private, even though they look like public headers +cairo_test_surfaces_private = \ + test-compositor-surface.h \ + test-compositor-surface-private.h \ + test-null-compositor-surface.h \ + test-paginated-surface.h \ + $(NULL) + +cairo_test_surfaces_sources = \ + test-compositor-surface.c \ + test-null-compositor-surface.c \ + test-base-compositor-surface.c \ + test-paginated-surface.c \ + $(NULL) + +cairo_xlib_headers = cairo-xlib.h +cairo_xlib_private = \ + cairo-xlib-private.h \ + cairo-xlib-surface-private.h \ + cairo-xlib-xrender-private.h \ + $(NULL) + +cairo_xlib_sources = \ + cairo-xlib-display.c \ + cairo-xlib-core-compositor.c \ + cairo-xlib-fallback-compositor.c \ + cairo-xlib-render-compositor.c \ + cairo-xlib-screen.c \ + cairo-xlib-source.c \ + cairo-xlib-surface.c \ + cairo-xlib-surface-shm.c \ + cairo-xlib-visual.c \ + cairo-xlib-xcb-surface.c \ + $(NULL) + +cairo_xlib_xrender_headers = cairo-xlib-xrender.h +cairo_xcb_headers = cairo-xcb.h +cairo_xcb_private = cairo-xcb-private.h +cairo_xcb_sources = \ + cairo-xcb-connection.c \ + cairo-xcb-connection-core.c \ + cairo-xcb-connection-render.c \ + cairo-xcb-connection-shm.c \ + cairo-xcb-screen.c \ + cairo-xcb-shm.c \ + cairo-xcb-surface.c \ + cairo-xcb-surface-core.c \ + cairo-xcb-surface-render.c \ + cairo-xcb-resources.c \ + $(NULL) + +cairo_qt_headers = cairo-qt.h +cairo_qt_cxx_sources = cairo-qt-surface.cpp +cairo_quartz_headers = cairo-quartz.h +cairo_quartz_private = cairo-quartz-private.h +cairo_quartz_sources = cairo-quartz-surface.c +cairo_quartz_image_headers = cairo-quartz-image.h +cairo_quartz_image_sources = cairo-quartz-image-surface.c +cairo_quartz_font_sources = cairo-quartz-font.c +cairo_win32_headers = cairo-win32.h +cairo_win32_private = win32/cairo-win32-private.h +cairo_win32_sources = \ + win32/cairo-win32-debug.c \ + win32/cairo-win32-device.c \ + win32/cairo-win32-gdi-compositor.c \ + win32/cairo-win32-system.c \ + win32/cairo-win32-surface.c \ + win32/cairo-win32-display-surface.c \ + win32/cairo-win32-printing-surface.c \ + $(NULL) + +cairo_win32_font_sources = \ + win32/cairo-win32-font.c \ + $(NULL) + +cairo_skia_headers = cairo-skia.h +cairo_skia_private = skia/cairo-skia-private.h +cairo_skia_cxx_sources = \ + skia/cairo-skia-context.cpp \ + skia/cairo-skia-surface.cpp \ + $(NULL) + +cairo_os2_headers = cairo-os2.h +cairo_os2_private = cairo-os2-private.h +cairo_os2_sources = cairo-os2-surface.c + +# automake is stupid enough to always use c++ linker if we enable the +# following lines, even if beos surface is not enabled. Disable it for now. +cairo_beos_headers = cairo-beos.h +cairo_beos_cxx_sources = cairo-beos-surface.cpp +cairo_gl_headers = cairo-gl.h +cairo_gl_private = cairo-gl-private.h \ + cairo-gl-dispatch-private.h \ + cairo-gl-ext-def-private.h \ + cairo-gl-gradient-private.h + +cairo_gl_sources = cairo-gl-composite.c \ + cairo-gl-device.c \ + cairo-gl-dispatch.c \ + cairo-gl-glyphs.c \ + cairo-gl-gradient.c \ + cairo-gl-info.c \ + cairo-gl-operand.c \ + cairo-gl-shaders.c \ + cairo-gl-msaa-compositor.c \ + cairo-gl-spans-compositor.c \ + cairo-gl-traps-compositor.c \ + cairo-gl-source.c \ + cairo-gl-surface.c + +cairo_glesv2_headers = $(cairo_gl_headers) +cairo_glesv2_private = $(cairo_gl_private) +cairo_glesv2_sources = $(cairo_gl_sources) +cairo_directfb_headers = cairo-directfb.h +cairo_directfb_sources = cairo-directfb-surface.c +cairo_drm_headers = cairo-drm.h +cairo_drm_private = drm/cairo-drm-private.h \ + drm/cairo-drm-ioctl-private.h \ + drm/cairo-drm-intel-private.h \ + drm/cairo-drm-intel-brw-defines.h \ + drm/cairo-drm-intel-brw-structs.h \ + drm/cairo-drm-intel-brw-eu.h \ + drm/cairo-drm-intel-command-private.h \ + drm/cairo-drm-intel-ioctl-private.h \ + drm/cairo-drm-i915-private.h \ + drm/cairo-drm-i965-private.h \ + drm/cairo-drm-radeon-private.h + +cairo_drm_sources = drm/cairo-drm.c \ + drm/cairo-drm-bo.c \ + drm/cairo-drm-surface.c \ + drm/cairo-drm-intel.c \ + drm/cairo-drm-intel-debug.c \ + drm/cairo-drm-intel-surface.c \ + drm/cairo-drm-i915-surface.c \ + drm/cairo-drm-i915-glyphs.c \ + drm/cairo-drm-i915-shader.c \ + drm/cairo-drm-i915-spans.c \ + drm/cairo-drm-i965-surface.c \ + drm/cairo-drm-i965-glyphs.c \ + drm/cairo-drm-i965-shader.c \ + drm/cairo-drm-i965-spans.c \ + drm/cairo-drm-intel-brw-eu.c \ + drm/cairo-drm-intel-brw-eu-emit.c \ + drm/cairo-drm-intel-brw-eu-util.c \ + drm/cairo-drm-radeon.c \ + drm/cairo-drm-radeon-surface.c + +cairo_gallium_sources = drm/cairo-drm-gallium-surface.c +cairo_script_headers = cairo-script.h +cairo_script_private = cairo-script-private.h +cairo_script_sources = cairo-script-surface.c +cairo_tee_headers = cairo-tee.h +cairo_tee_private = cairo-tee-surface-private.h +cairo_tee_sources = cairo-tee-surface.c +cairo_xml_headers = cairo-xml.h +cairo_xml_sources = cairo-xml-surface.c +cairo_vg_headers = cairo-vg.h +cairo_vg_sources = cairo-vg-surface.c +cairo_cogl_headers = cairo-cogl.h +cairo_cogl_private = cairo-cogl-private.h \ + cairo-cogl-gradient-private.h \ + cairo-cogl-context-private.h \ + cairo-cogl-utils-private.h + +cairo_cogl_sources = cairo-cogl-surface.c \ + cairo-cogl-gradient.c \ + cairo-cogl-context.c \ + cairo-cogl-utils.c + +supported_cairo_headers = $(cairo_headers) $(cairo_xlib_headers) \ + $(cairo_xlib_xrender_headers) $(cairo_xcb_headers) \ + $(cairo_xcb_shm_headers) $(cairo_quartz_headers) \ + $(cairo_quartz_font_headers) $(cairo_win32_headers) \ + $(cairo_win32_font_headers) $(cairo_png_headers) \ + $(cairo_egl_headers) $(cairo_glx_headers) $(cairo_wgl_headers) \ + $(cairo_script_headers) $(cairo_ft_headers) \ + $(cairo_fc_headers) $(cairo_ps_headers) $(cairo_pdf_headers) \ + $(cairo_svg_headers) $(cairo_image_headers) \ + $(cairo_mime_headers) $(cairo_recording_headers) \ + $(cairo_observer_headers) $(cairo_user_headers) \ + $(cairo_gobject_headers) +unsupported_cairo_headers = $(cairo_xlib_xcb_headers) \ + $(cairo_qt_headers) $(cairo_quartz_image_headers) \ + $(cairo_skia_headers) $(cairo_os2_headers) \ + $(cairo_beos_headers) $(cairo_drm_headers) \ + $(cairo_gallium_headers) $(cairo_gl_headers) \ + $(cairo_glesv2_headers) $(cairo_cogl_headers) \ + $(cairo_directfb_headers) $(cairo_vg_headers) \ + $(cairo_tee_headers) $(cairo_xml_headers) +all_cairo_headers = $(cairo_headers) $(cairo_xlib_headers) \ + $(cairo_xlib_xrender_headers) $(cairo_xcb_headers) \ + $(cairo_xlib_xcb_headers) $(cairo_xcb_shm_headers) \ + $(cairo_qt_headers) $(cairo_quartz_headers) \ + $(cairo_quartz_font_headers) $(cairo_quartz_image_headers) \ + $(cairo_win32_headers) $(cairo_win32_font_headers) \ + $(cairo_skia_headers) $(cairo_os2_headers) \ + $(cairo_beos_headers) $(cairo_drm_headers) \ + $(cairo_gallium_headers) $(cairo_png_headers) \ + $(cairo_gl_headers) $(cairo_glesv2_headers) \ + $(cairo_cogl_headers) $(cairo_directfb_headers) \ + $(cairo_vg_headers) $(cairo_egl_headers) $(cairo_glx_headers) \ + $(cairo_wgl_headers) $(cairo_script_headers) \ + $(cairo_ft_headers) $(cairo_fc_headers) $(cairo_ps_headers) \ + $(cairo_pdf_headers) $(cairo_svg_headers) \ + $(cairo_image_headers) $(cairo_mime_headers) \ + $(cairo_recording_headers) $(cairo_observer_headers) \ + $(cairo_tee_headers) $(cairo_xml_headers) \ + $(cairo_user_headers) $(cairo_gobject_headers) +all_cairo_private = $(cairo_private) $(cairo_xlib_private) \ + $(cairo_xlib_xrender_private) $(cairo_xcb_private) \ + $(cairo_xlib_xcb_private) $(cairo_xcb_shm_private) \ + $(cairo_qt_private) $(cairo_quartz_private) \ + $(cairo_quartz_font_private) $(cairo_quartz_image_private) \ + $(cairo_win32_private) $(cairo_win32_font_private) \ + $(cairo_skia_private) $(cairo_os2_private) \ + $(cairo_beos_private) $(cairo_drm_private) \ + $(cairo_gallium_private) $(cairo_png_private) \ + $(cairo_gl_private) $(cairo_glesv2_private) \ + $(cairo_cogl_private) $(cairo_directfb_private) \ + $(cairo_vg_private) $(cairo_egl_private) $(cairo_glx_private) \ + $(cairo_wgl_private) $(cairo_script_private) \ + $(cairo_ft_private) $(cairo_fc_private) $(cairo_ps_private) \ + $(cairo_pdf_private) $(cairo_svg_private) \ + $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) \ + $(cairo_image_private) $(cairo_mime_private) \ + $(cairo_recording_private) $(cairo_observer_private) \ + $(cairo_tee_private) $(cairo_xml_private) \ + $(cairo_user_private) $(cairo_pthread_private) \ + $(cairo_pthread_headers) $(cairo_gobject_private) \ + $(cairo_trace_private) $(cairo_trace_headers) \ + $(cairo_interpreter_private) $(cairo_interpreter_headers) \ + $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +all_cairo_cxx_sources = $(cairo_cxx_sources) $(cairo_xlib_cxx_sources) \ + $(cairo_xlib_xrender_cxx_sources) $(cairo_xcb_cxx_sources) \ + $(cairo_xlib_xcb_cxx_sources) $(cairo_xcb_shm_cxx_sources) \ + $(cairo_qt_cxx_sources) $(cairo_quartz_cxx_sources) \ + $(cairo_quartz_font_cxx_sources) \ + $(cairo_quartz_image_cxx_sources) $(cairo_win32_cxx_sources) \ + $(cairo_win32_font_cxx_sources) $(cairo_skia_cxx_sources) \ + $(cairo_os2_cxx_sources) $(cairo_beos_cxx_sources) \ + $(cairo_drm_cxx_sources) $(cairo_gallium_cxx_sources) \ + $(cairo_png_cxx_sources) $(cairo_gl_cxx_sources) \ + $(cairo_glesv2_cxx_sources) $(cairo_cogl_cxx_sources) \ + $(cairo_directfb_cxx_sources) $(cairo_vg_cxx_sources) \ + $(cairo_egl_cxx_sources) $(cairo_glx_cxx_sources) \ + $(cairo_wgl_cxx_sources) $(cairo_script_cxx_sources) \ + $(cairo_ft_cxx_sources) $(cairo_fc_cxx_sources) \ + $(cairo_ps_cxx_sources) $(cairo_pdf_cxx_sources) \ + $(cairo_svg_cxx_sources) $(cairo_test_surfaces_cxx_sources) \ + $(cairo_image_cxx_sources) $(cairo_mime_cxx_sources) \ + $(cairo_recording_cxx_sources) $(cairo_observer_cxx_sources) \ + $(cairo_tee_cxx_sources) $(cairo_xml_cxx_sources) \ + $(cairo_user_cxx_sources) $(cairo_pthread_cxx_sources) \ + $(cairo_gobject_cxx_sources) $(cairo_trace_cxx_sources) \ + $(cairo_interpreter_cxx_sources) \ + $(cairo_symbol_lookup_cxx_sources) +all_cairo_sources = $(cairo_sources) $(cairo_xlib_sources) \ + $(cairo_xlib_xrender_sources) $(cairo_xcb_sources) \ + $(cairo_xlib_xcb_sources) $(cairo_xcb_shm_sources) \ + $(cairo_qt_sources) $(cairo_quartz_sources) \ + $(cairo_quartz_font_sources) $(cairo_quartz_image_sources) \ + $(cairo_win32_sources) $(cairo_win32_font_sources) \ + $(cairo_skia_sources) $(cairo_os2_sources) \ + $(cairo_beos_sources) $(cairo_drm_sources) \ + $(cairo_gallium_sources) $(cairo_png_sources) \ + $(cairo_gl_sources) $(cairo_glesv2_sources) \ + $(cairo_cogl_sources) $(cairo_directfb_sources) \ + $(cairo_vg_sources) $(cairo_egl_sources) $(cairo_glx_sources) \ + $(cairo_wgl_sources) $(cairo_script_sources) \ + $(cairo_ft_sources) $(cairo_fc_sources) $(cairo_ps_sources) \ + $(cairo_pdf_sources) $(cairo_svg_sources) \ + $(cairo_test_surfaces_sources) $(cairo_image_sources) \ + $(cairo_mime_sources) $(cairo_recording_sources) \ + $(cairo_observer_sources) $(cairo_tee_sources) \ + $(cairo_xml_sources) $(cairo_user_sources) \ + $(cairo_pthread_sources) $(cairo_gobject_sources) \ + $(cairo_trace_sources) $(cairo_interpreter_sources) \ + $(cairo_symbol_lookup_sources) +enabled_cairo_headers = $(cairo_headers) $(am__append_1) \ + $(am__append_6) $(am__append_11) $(am__append_16) \ + $(am__append_21) $(am__append_26) $(am__append_31) \ + $(am__append_36) $(am__append_41) $(am__append_46) \ + $(am__append_51) $(am__append_56) $(am__append_61) \ + $(am__append_66) $(am__append_71) $(am__append_76) \ + $(am__append_81) $(am__append_86) $(am__append_91) \ + $(am__append_96) $(am__append_101) $(am__append_106) \ + $(am__append_111) $(am__append_116) $(am__append_121) \ + $(am__append_126) $(am__append_131) $(am__append_136) \ + $(am__append_141) $(am__append_146) $(am__append_151) \ + $(cairo_image_headers) $(cairo_mime_headers) \ + $(cairo_recording_headers) $(cairo_observer_headers) \ + $(am__append_159) $(am__append_164) $(cairo_user_headers) \ + $(am__append_172) +enabled_cairo_private = $(cairo_private) $(am__append_2) \ + $(am__append_7) $(am__append_12) $(am__append_17) \ + $(am__append_22) $(am__append_27) $(am__append_32) \ + $(am__append_37) $(am__append_42) $(am__append_47) \ + $(am__append_52) $(am__append_57) $(am__append_62) \ + $(am__append_67) $(am__append_72) $(am__append_77) \ + $(am__append_82) $(am__append_87) $(am__append_92) \ + $(am__append_97) $(am__append_102) $(am__append_107) \ + $(am__append_112) $(am__append_117) $(am__append_122) \ + $(am__append_127) $(am__append_132) $(am__append_137) \ + $(am__append_142) $(am__append_147) $(am__append_152) \ + $(am__append_156) $(cairo_image_private) $(cairo_mime_private) \ + $(cairo_recording_private) $(cairo_observer_private) \ + $(am__append_160) $(am__append_165) $(cairo_user_private) \ + $(am__append_169) $(am__append_173) $(am__append_177) \ + $(am__append_180) $(am__append_183) +enabled_cairo_cxx_sources = $(cairo_cxx_sources) $(am__append_3) \ + $(am__append_8) $(am__append_13) $(am__append_18) \ + $(am__append_23) $(am__append_28) $(am__append_33) \ + $(am__append_38) $(am__append_43) $(am__append_48) \ + $(am__append_53) $(am__append_58) $(am__append_63) \ + $(am__append_68) $(am__append_73) $(am__append_78) \ + $(am__append_83) $(am__append_88) $(am__append_93) \ + $(am__append_98) $(am__append_103) $(am__append_108) \ + $(am__append_113) $(am__append_118) $(am__append_123) \ + $(am__append_128) $(am__append_133) $(am__append_138) \ + $(am__append_143) $(am__append_148) $(am__append_153) \ + $(am__append_157) $(cairo_image_cxx_sources) \ + $(cairo_mime_cxx_sources) $(cairo_recording_cxx_sources) \ + $(cairo_observer_cxx_sources) $(am__append_161) \ + $(am__append_166) $(cairo_user_cxx_sources) $(am__append_170) \ + $(am__append_174) $(am__append_178) $(am__append_181) \ + $(am__append_184) +enabled_cairo_sources = $(cairo_sources) $(am__append_4) \ + $(am__append_9) $(am__append_14) $(am__append_19) \ + $(am__append_24) $(am__append_29) $(am__append_34) \ + $(am__append_39) $(am__append_44) $(am__append_49) \ + $(am__append_54) $(am__append_59) $(am__append_64) \ + $(am__append_69) $(am__append_74) $(am__append_79) \ + $(am__append_84) $(am__append_89) $(am__append_94) \ + $(am__append_99) $(am__append_104) $(am__append_109) \ + $(am__append_114) $(am__append_119) $(am__append_124) \ + $(am__append_129) $(am__append_134) $(am__append_139) \ + $(am__append_144) $(am__append_149) $(am__append_154) \ + $(am__append_158) $(cairo_image_sources) $(cairo_mime_sources) \ + $(cairo_recording_sources) $(cairo_observer_sources) \ + $(am__append_162) $(am__append_167) $(cairo_user_sources) \ + $(am__append_171) $(am__append_175) $(am__append_179) \ + $(am__append_182) $(am__append_185) +all_cairo_pkgconf = cairo.pc cairo-xlib.pc cairo-xlib-xrender.pc \ + cairo-xcb.pc cairo-xlib-xcb.pc cairo-xcb-shm.pc cairo-qt.pc \ + cairo-quartz.pc cairo-quartz-font.pc cairo-quartz-image.pc \ + cairo-win32.pc cairo-win32-font.pc cairo-skia.pc cairo-os2.pc \ + cairo-beos.pc cairo-drm.pc cairo-gallium.pc cairo-png.pc \ + cairo-gl.pc cairo-glesv2.pc cairo-cogl.pc cairo-directfb.pc \ + cairo-vg.pc cairo-egl.pc cairo-glx.pc cairo-wgl.pc \ + cairo-script.pc cairo-ft.pc cairo-fc.pc cairo-ps.pc \ + cairo-pdf.pc cairo-svg.pc cairo-tee.pc cairo-xml.pc \ + cairo-gobject.pc +enabled_cairo_pkgconf = cairo.pc $(am__append_5) $(am__append_10) \ + $(am__append_15) $(am__append_20) $(am__append_25) \ + $(am__append_30) $(am__append_35) $(am__append_40) \ + $(am__append_45) $(am__append_50) $(am__append_55) \ + $(am__append_60) $(am__append_65) $(am__append_70) \ + $(am__append_75) $(am__append_80) $(am__append_85) \ + $(am__append_90) $(am__append_95) $(am__append_100) \ + $(am__append_105) $(am__append_110) $(am__append_115) \ + $(am__append_120) $(am__append_125) $(am__append_130) \ + $(am__append_135) $(am__append_140) $(am__append_145) \ + $(am__append_150) $(am__append_155) $(am__append_163) \ + $(am__append_168) $(am__append_176) + +# The name of the module. +DOC_MODULE = cairo + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = cairo-docs.xml + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="CAIRO_DISABLE_DEPRECATED" --ignore-decorators="cairo_public|cairo_private" + +# The directory containing the source code. +DOC_SOURCE_DIR = $(top_srcdir)/src + +# Used for dependencies +HFILE_GLOB = $(top_srcdir)/src/cairo*.h +CFILE_GLOB = $(top_srcdir)/src/cairo*.c +EXTRA_HFILES = $(top_builddir)/src/cairo-supported-features.h + +# Headers to ignore +IGNORE_HFILES = \ + drm \ + cairo-features.h \ + cairo-features-win32.h \ + $(all_cairo_private) \ + $(unsupported_cairo_headers) \ + $(NULL) + + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --sgml-mode --output-format=xml --name-space=cairo + +# Extra options to supply to gtkdoc-mktmpl +MKTMPL_OPTIONS = + +# Non-autogenerated SGML files to be included in $(DOC_MAIN_SGML_FILE) +content_files = \ + language-bindings.xml \ + version.xml \ + $(NULL) + + +# Images to copy into HTML directory +HTML_IMAGES = + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS = +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +DOC_STAMPS = scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +TESTS_ENVIRONMENT = srcdir="$(srcdir)" top_srcdir="$(top_srcdir)" MAKE="$(MAKE) $(AM_MAKEFLAGS)" DOC_MODULE="$(DOC_MODULE)" REPORT_FILES="$(REPORT_FILES)" +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(top_srcdir)/src/Makefile.am.features $(top_srcdir)/src/Makefile.sources $(top_srcdir)/build/Makefile.am.gtk-doc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/public/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/public/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(top_srcdir)/src/Makefile.am.features $(top_srcdir)/src/Makefile.sources $(top_srcdir)/build/Makefile.am.gtk-doc: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-doc-coverage.sh.log: check-doc-coverage.sh + @p='check-doc-coverage.sh'; \ + b='check-doc-coverage.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-doc-syntax.sh.log: check-doc-syntax.sh + @p='check-doc-syntax.sh'; \ + b='check-doc-syntax.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: all check check-am install install-am install-strip + +.PHONY: all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + cscopelist-am ctags-am dist-hook distclean distclean-generic \ + distclean-libtool distclean-local distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags-am uninstall uninstall-am uninstall-local + + +version.xml: $(top_srcdir)/cairo-version.h + echo $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) > $@ + +@ENABLE_GTK_DOC_TRUE@doc: html-build.stamp +@ENABLE_GTK_DOC_FALSE@doc: +@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed (and --enable-gtk-doc) in order to make doc" +@ENABLE_GTK_DOC_FALSE@ @false + +docs: html-build.stamp + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) $(EXTRA_HFILES) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) --output-dir=$(srcdir) + if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### templates #### + +tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +tmpl/*.sgml: + @true + +#### xml #### + +# gtkdoc-mkdb is broken and requires a --root-dir=$(srcdir) option +# The _srcdir diversion is fragile but works for make check; make distcheck +sgml-build.stamp: tmpl.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + @echo 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + _srcdir="`pwd`/$(DOC_SOURCE_DIR)"; \ + cd $(srcdir) && gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$$_srcdir --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS) + touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + rm -rf $(srcdir)/html + mkdir $(srcdir)/html + cd $(srcdir)/html && gtkdoc-mkhtml $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + touch html-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +distclean-local: + cd $(srcdir) && \ + rm -rf xml $(REPORT_FILES) \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html + +install-data-local: + -installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- Nothing to install' ; \ + else \ + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR); \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + echo '-- Installing $(srcdir)/html/index.sgml' ; \ + $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR) || :; \ + which gtkdoc-rebase >/dev/null && \ + gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR) ; \ + fi + +uninstall-local: + rm -f $(DESTDIR)$(TARGET_DIR)/* + +# +# Require gtk-doc when making dist +# +@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed (and --enable-gtk-doc) in order to make dist" +@ENABLE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/tmpl + mkdir $(distdir)/xml + mkdir $(distdir)/html + -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + -cp $(srcdir)/xml/*.xml $(distdir)/xml + cp $(srcdir)/html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + -gtkdoc-rebase --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +dist-hook: doc + +# This line really belongs in gtk-doc.mk +$(REPORT_FILES): sgml-build.stamp + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/doc/public/README b/doc/public/README new file mode 100644 index 000000000..f3d157b1a --- /dev/null +++ b/doc/public/README @@ -0,0 +1,37 @@ +Cairo Reference Documentation +============================= + +The API documentation is generated using gtk-doc. + + +Building +-------- + +The documentation is not built by default. To build it you need to +configure with gtk-doc enabled (--enable-gtk-doc), and run: + + make doc + + +Adding New API +-------------- + +When adding new symbols and macros to the public API, modify +cairo-section.txt and add new symbols to the right place. + +When adding whole new features, you also need to modify cairo-docs.xml +and add a new file under tmpl/. Beware that the files are tmpl/ are +both manually edited AND modified by gtk-doc, gathering documentation +stub from source files. + + +Tests +----- + +There are some tests in this directory, ensuring proper documentation +syntax as well as checking that all public symbols are fully documented. + +After adding any new API, just run: + + make check + diff --git a/doc/public/cairo-docs.xml b/doc/public/cairo-docs.xml new file mode 100644 index 000000000..baf844c18 --- /dev/null +++ b/doc/public/cairo-docs.xml @@ -0,0 +1,80 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" + "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [ +<!ENTITY version SYSTEM "version.xml"> +]> +<book lang="en" id="cairo" xmlns:xi="http://www.w3.org/2003/XInclude"> +<title>Cairo: A Vector Graphics Library + + Cairo: A Vector Graphics Library + for Cairo &version; + + + Drawing + + + + + + + + + + Fonts + + + + + + + + + + Surfaces + + + + + + + + + + + + + + + + + + + Utilities + + + + + + + Index + + + Index of new symbols in 1.2 + + + Index of new symbols in 1.4 + + + Index of new symbols in 1.6 + + + Index of new symbols in 1.8 + + + Index of new symbols in 1.10 + + + Index of new symbols in 1.12 + + + diff --git a/doc/public/cairo-overrides.txt b/doc/public/cairo-overrides.txt new file mode 100644 index 000000000..e69de29bb diff --git a/doc/public/cairo-sections.txt b/doc/public/cairo-sections.txt new file mode 100644 index 000000000..4beaa0ae2 --- /dev/null +++ b/doc/public/cairo-sections.txt @@ -0,0 +1,732 @@ +
+cairo-ft +CAIRO_HAS_FT_FONT +CAIRO_HAS_FC_FONT +cairo_ft_font_face_create_for_ft_face +cairo_ft_font_face_create_for_pattern +cairo_ft_font_options_substitute +cairo_ft_scaled_font_lock_face +cairo_ft_scaled_font_unlock_face +cairo_ft_synthesize_t +cairo_ft_font_face_get_synthesize +cairo_ft_font_face_set_synthesize +cairo_ft_font_face_unset_synthesize +
+ +
+cairo-win32-fonts +CAIRO_HAS_WIN32_FONT +cairo_win32_font_face_create_for_logfontw +cairo_win32_font_face_create_for_hfont +cairo_win32_font_face_create_for_logfontw_hfont +cairo_win32_scaled_font_select_font +cairo_win32_scaled_font_done_font +cairo_win32_scaled_font_get_metrics_factor +cairo_win32_scaled_font_get_logical_to_device +cairo_win32_scaled_font_get_device_to_logical +
+ +
+cairo-quartz-fonts +CAIRO_HAS_QUARTZ_FONT +cairo_quartz_font_face_create_for_cgfont +cairo_quartz_font_face_create_for_atsu_font_id +
+ +
+cairo-user-fonts +CAIRO_HAS_USER_FONT +cairo_user_scaled_font_init_func_t +cairo_user_scaled_font_render_glyph_func_t +cairo_user_scaled_font_text_to_glyphs_func_t +cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_user_font_face_create +cairo_user_font_face_set_init_func +cairo_user_font_face_get_init_func +cairo_user_font_face_set_render_glyph_func +cairo_user_font_face_get_render_glyph_func +cairo_user_font_face_set_unicode_to_glyph_func +cairo_user_font_face_get_unicode_to_glyph_func +cairo_user_font_face_set_text_to_glyphs_func +cairo_user_font_face_get_text_to_glyphs_func +
+ +
+cairo-image +CAIRO_HAS_IMAGE_SURFACE +cairo_format_t +cairo_format_stride_for_width +cairo_image_surface_create +cairo_image_surface_create_for_data +cairo_image_surface_get_data +cairo_image_surface_get_format +cairo_image_surface_get_width +cairo_image_surface_get_height +cairo_image_surface_get_stride +
+ +
+cairo-pdf +CAIRO_HAS_PDF_SURFACE +cairo_pdf_surface_create +cairo_pdf_surface_create_for_stream +cairo_pdf_surface_restrict_to_version +cairo_pdf_version_t +cairo_pdf_get_versions +cairo_pdf_version_to_string +cairo_pdf_surface_set_size +
+ +
+cairo-png +CAIRO_HAS_PNG_FUNCTIONS +cairo_image_surface_create_from_png +cairo_read_func_t +cairo_image_surface_create_from_png_stream +cairo_surface_write_to_png +cairo_write_func_t +cairo_surface_write_to_png_stream +
+ +
+cairo-ps +CAIRO_HAS_PS_SURFACE +cairo_ps_surface_create +cairo_ps_surface_create_for_stream +cairo_ps_surface_restrict_to_level +cairo_ps_level_t +cairo_ps_get_levels +cairo_ps_level_to_string +cairo_ps_surface_set_eps +cairo_ps_surface_get_eps +cairo_ps_surface_set_size +cairo_ps_surface_dsc_begin_setup +cairo_ps_surface_dsc_begin_page_setup +cairo_ps_surface_dsc_comment +
+ +
+cairo-recording +CAIRO_HAS_RECORDING_SURFACE +cairo_recording_surface_create +cairo_recording_surface_ink_extents +cairo_recording_surface_get_extents +
+ +
+cairo-skia +cairo_skia_context_t +cairo_skia_surface_t +format_to_sk_config + +cairo_skia_context +cairo_skia_surface +
+ +
+cairo-win32 +CAIRO_HAS_WIN32_SURFACE +cairo_win32_surface_create +cairo_win32_surface_create_with_dib +cairo_win32_surface_create_with_ddb +cairo_win32_printing_surface_create +cairo_win32_surface_get_dc +cairo_win32_surface_get_image + +SB_NONE +SHADEBLENDCAPS +WIN32_FONT_LOGICAL_SCALE +cairo_win32_device_t +cairo_win32_display_surface_t +cairo_win32_printing_surface_t +cairo_win32_surface_t +to_win32_device +to_win32_device_from_surface +to_win32_display_surface +to_win32_printing_surface +to_win32_surface +
+ +
+cairo-quartz +CAIRO_HAS_QUARTZ_SURFACE +cairo_quartz_surface_create +cairo_quartz_surface_create_for_cg_context +cairo_quartz_surface_get_cg_context +
+ +
+cairo-xlib +CAIRO_HAS_XLIB_SURFACE +cairo_xlib_surface_create +cairo_xlib_surface_create_for_bitmap +cairo_xlib_surface_set_size +cairo_xlib_surface_get_display +cairo_xlib_surface_get_screen +cairo_xlib_surface_set_drawable +cairo_xlib_surface_get_drawable +cairo_xlib_surface_get_visual +cairo_xlib_surface_get_width +cairo_xlib_surface_get_height +cairo_xlib_surface_get_depth +cairo_xlib_device_debug_cap_xrender_version +cairo_xlib_device_debug_get_precision +cairo_xlib_device_debug_set_precision +
+ +
+cairo-xlib-xrender +CAIRO_HAS_XLIB_XRENDER_SURFACE +cairo_xlib_surface_create_with_xrender_format +cairo_xlib_surface_get_xrender_format +
+ +
+cairo-xcb +CAIRO_HAS_XCB_SURFACE +CAIRO_HAS_XCB_SHM_FUNCTIONS +cairo_xcb_surface_create +cairo_xcb_surface_create_for_bitmap +cairo_xcb_surface_create_with_xrender_format +cairo_xcb_surface_set_size +cairo_xcb_surface_set_drawable +cairo_xcb_device_get_connection +cairo_xcb_device_debug_cap_xrender_version +cairo_xcb_device_debug_cap_xshm_version +cairo_xcb_device_debug_get_precision +cairo_xcb_device_debug_set_precision +
+ +
+cairo-svg +CAIRO_HAS_SVG_SURFACE +cairo_svg_surface_create +cairo_svg_surface_create_for_stream +cairo_svg_surface_restrict_to_version +cairo_svg_version_t +cairo_svg_get_versions +cairo_svg_version_to_string +
+ +
+cairo-device +cairo_device_t +cairo_device_reference +cairo_device_destroy +cairo_device_status +cairo_device_finish +cairo_device_flush +cairo_device_type_t +cairo_device_get_type +cairo_device_get_reference_count +cairo_device_set_user_data +cairo_device_get_user_data +cairo_device_acquire +cairo_device_release +cairo_device_observer_elapsed +cairo_device_observer_fill_elapsed +cairo_device_observer_glyphs_elapsed +cairo_device_observer_mask_elapsed +cairo_device_observer_paint_elapsed +cairo_device_observer_print +cairo_device_observer_stroke_elapsed +
+ +
+cairo-surface +CAIRO_HAS_MIME_SURFACE +CAIRO_MIME_TYPE_JBIG2 +CAIRO_MIME_TYPE_JBIG2_GLOBAL +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID +CAIRO_MIME_TYPE_JP2 +CAIRO_MIME_TYPE_JPEG +CAIRO_MIME_TYPE_PNG +CAIRO_MIME_TYPE_URI +CAIRO_MIME_TYPE_UNIQUE_ID +cairo_surface_t +cairo_content_t +cairo_surface_create_similar +cairo_surface_create_similar_image +cairo_surface_create_for_rectangle +cairo_surface_reference +cairo_surface_destroy +cairo_surface_status +cairo_surface_finish +cairo_surface_flush +cairo_surface_get_device +cairo_surface_get_font_options +cairo_surface_get_content +cairo_surface_mark_dirty +cairo_surface_mark_dirty_rectangle +cairo_surface_set_device_offset +cairo_surface_get_device_offset +cairo_surface_get_device_scale +cairo_surface_set_device_scale +cairo_surface_set_fallback_resolution +cairo_surface_get_fallback_resolution +cairo_surface_type_t +cairo_surface_get_type +cairo_surface_get_reference_count +cairo_surface_set_user_data +cairo_surface_get_user_data +cairo_surface_copy_page +cairo_surface_show_page +cairo_surface_has_show_text_glyphs +cairo_surface_set_mime_data +cairo_surface_get_mime_data +cairo_surface_supports_mime_type +cairo_surface_map_to_image +cairo_surface_unmap_image +
+ +
+cairo-surface-observer +CAIRO_HAS_OBSERVER_SURFACE +cairo_surface_create_observer +cairo_surface_observer_add_fill_callback +cairo_surface_observer_add_finish_callback +cairo_surface_observer_add_flush_callback +cairo_surface_observer_add_glyphs_callback +cairo_surface_observer_add_mask_callback +cairo_surface_observer_add_paint_callback +cairo_surface_observer_add_stroke_callback +cairo_surface_observer_callback_t +cairo_surface_observer_elapsed +cairo_surface_observer_mode_t +cairo_surface_observer_print +
+ +
+cairo-version +CAIRO_VERSION +CAIRO_VERSION_MAJOR +CAIRO_VERSION_MINOR +CAIRO_VERSION_MICRO +CAIRO_VERSION_STRING +CAIRO_VERSION_ENCODE +CAIRO_VERSION_STRINGIZE +cairo_version +cairo_version_string + +CAIRO_VERSION_STRINGIZE_ +
+ +
+cairo-region +cairo_region_t +cairo_region_create +cairo_region_create_rectangle +cairo_region_create_rectangles +cairo_region_copy +cairo_region_reference +cairo_region_destroy +cairo_region_status +cairo_region_get_extents +cairo_region_num_rectangles +cairo_region_get_rectangle +cairo_region_is_empty +cairo_region_contains_point +cairo_region_overlap_t +cairo_region_contains_rectangle +cairo_region_equal +cairo_region_translate +cairo_region_intersect +cairo_region_intersect_rectangle +cairo_region_subtract +cairo_region_subtract_rectangle +cairo_region_union +cairo_region_union_rectangle +cairo_region_xor +cairo_region_xor_rectangle +
+ +
+cairo-pattern +cairo_pattern_t +cairo_pattern_add_color_stop_rgb +cairo_pattern_add_color_stop_rgba +cairo_pattern_get_color_stop_count +cairo_pattern_get_color_stop_rgba +cairo_pattern_create_rgb +cairo_pattern_create_rgba +cairo_pattern_get_rgba +cairo_pattern_create_for_surface +cairo_pattern_get_surface +cairo_pattern_create_linear +cairo_pattern_get_linear_points +cairo_pattern_create_radial +cairo_pattern_get_radial_circles +cairo_pattern_create_mesh +cairo_mesh_pattern_begin_patch +cairo_mesh_pattern_end_patch +cairo_mesh_pattern_move_to +cairo_mesh_pattern_line_to +cairo_mesh_pattern_curve_to +cairo_mesh_pattern_set_control_point +cairo_mesh_pattern_set_corner_color_rgb +cairo_mesh_pattern_set_corner_color_rgba +cairo_mesh_pattern_get_patch_count +cairo_mesh_pattern_get_path +cairo_mesh_pattern_get_control_point +cairo_mesh_pattern_get_corner_color_rgba +cairo_pattern_reference +cairo_pattern_destroy +cairo_pattern_status +cairo_extend_t +cairo_pattern_set_extend +cairo_pattern_get_extend +cairo_filter_t +cairo_pattern_set_filter +cairo_pattern_get_filter +cairo_pattern_set_matrix +cairo_pattern_get_matrix +cairo_pattern_type_t +cairo_pattern_get_type +cairo_pattern_get_reference_count +cairo_pattern_set_user_data +cairo_pattern_get_user_data +
+ +
+cairo-raster-source +cairo_pattern_create_raster_source +cairo_raster_source_pattern_set_callback_data +cairo_raster_source_pattern_get_callback_data +cairo_raster_source_pattern_set_acquire +cairo_raster_source_pattern_get_acquire +cairo_raster_source_pattern_set_snapshot +cairo_raster_source_pattern_get_snapshot +cairo_raster_source_pattern_set_copy +cairo_raster_source_pattern_get_copy +cairo_raster_source_pattern_set_finish +cairo_raster_source_pattern_get_finish +cairo_raster_source_acquire_func_t +cairo_raster_source_release_func_t +cairo_raster_source_snapshot_func_t +cairo_raster_source_copy_func_t +cairo_raster_source_finish_func_t +
+ +
+cairo-matrix +cairo_matrix_t +cairo_matrix_init +cairo_matrix_init_identity +cairo_matrix_init_translate +cairo_matrix_init_scale +cairo_matrix_init_rotate +cairo_matrix_translate +cairo_matrix_scale +cairo_matrix_rotate +cairo_matrix_invert +cairo_matrix_multiply +cairo_matrix_transform_distance +cairo_matrix_transform_point +
+ +
+cairo-status +cairo_status_t +cairo_status_to_string +cairo_debug_reset_static_data +
+ +
+cairo-font-face +cairo_font_face_t +cairo_font_face_reference +cairo_font_face_destroy +cairo_font_face_status +cairo_font_type_t +cairo_font_face_get_type +cairo_font_face_get_reference_count +cairo_font_face_set_user_data +cairo_font_face_get_user_data +
+ +
+cairo-scaled-font +cairo_scaled_font_t +cairo_scaled_font_create +cairo_scaled_font_reference +cairo_scaled_font_destroy +cairo_scaled_font_status +cairo_font_extents_t +cairo_scaled_font_extents +cairo_text_extents_t +cairo_scaled_font_text_extents +cairo_scaled_font_glyph_extents +cairo_scaled_font_text_to_glyphs +cairo_scaled_font_get_font_face +cairo_scaled_font_get_font_options +cairo_scaled_font_get_font_matrix +cairo_scaled_font_get_ctm +cairo_scaled_font_get_scale_matrix +cairo_scaled_font_get_type +cairo_scaled_font_get_reference_count +cairo_scaled_font_set_user_data +cairo_scaled_font_get_user_data +
+ +
+cairo-font-options +cairo_font_options_t +cairo_font_options_create +cairo_font_options_copy +cairo_font_options_destroy +cairo_font_options_status +cairo_font_options_merge +cairo_font_options_hash +cairo_font_options_equal +cairo_font_options_set_antialias +cairo_font_options_get_antialias +cairo_subpixel_order_t +cairo_font_options_set_subpixel_order +cairo_font_options_get_subpixel_order +cairo_hint_style_t +cairo_font_options_set_hint_style +cairo_font_options_get_hint_style +cairo_hint_metrics_t +cairo_font_options_set_hint_metrics +cairo_font_options_get_hint_metrics +
+ +
+cairo-types +cairo_bool_t +cairo_user_data_key_t +cairo_destroy_func_t +cairo_rectangle_int_t +
+ +
+cairo-transforms +cairo_translate +cairo_scale +cairo_rotate +cairo_transform +cairo_set_matrix +cairo_get_matrix +cairo_identity_matrix +cairo_user_to_device +cairo_user_to_device_distance +cairo_device_to_user +cairo_device_to_user_distance +
+ + +
+cairo-paths +cairo_path_t +cairo_path_data_t +cairo_path_data_type_t +cairo_copy_path +cairo_copy_path_flat +cairo_path_destroy +cairo_append_path +cairo_has_current_point +cairo_get_current_point +cairo_new_path +cairo_new_sub_path +cairo_close_path +cairo_arc +cairo_arc_negative +cairo_curve_to +cairo_line_to +cairo_move_to +cairo_rectangle +cairo_glyph_path +cairo_text_path +cairo_rel_curve_to +cairo_rel_line_to +cairo_rel_move_to +cairo_path_extents +
+ +
+cairo-text +cairo_glyph_t +cairo_font_slant_t +cairo_font_weight_t +cairo_text_cluster_t +cairo_text_cluster_flags_t +cairo_select_font_face +cairo_set_font_size +cairo_set_font_matrix +cairo_get_font_matrix +cairo_set_font_options +cairo_get_font_options +cairo_set_font_face +cairo_get_font_face +cairo_set_scaled_font +cairo_get_scaled_font +cairo_show_text +cairo_show_glyphs +cairo_show_text_glyphs +cairo_font_extents +cairo_text_extents +cairo_glyph_extents +cairo_toy_font_face_create +cairo_toy_font_face_get_family +cairo_toy_font_face_get_slant +cairo_toy_font_face_get_weight +cairo_glyph_allocate +cairo_glyph_free +cairo_text_cluster_allocate +cairo_text_cluster_free +
+ +
+cairo +cairo_t +cairo_create +cairo_reference +cairo_destroy +cairo_status +cairo_save +cairo_restore +cairo_get_target +cairo_push_group +cairo_push_group_with_content +cairo_pop_group +cairo_pop_group_to_source +cairo_get_group_target +cairo_set_source_rgb +cairo_set_source_rgba +cairo_set_source +cairo_set_source_surface +cairo_get_source +cairo_antialias_t +cairo_set_antialias +cairo_get_antialias +cairo_set_dash +cairo_get_dash_count +cairo_get_dash +cairo_fill_rule_t +cairo_set_fill_rule +cairo_get_fill_rule +cairo_line_cap_t +cairo_set_line_cap +cairo_get_line_cap +cairo_line_join_t +cairo_set_line_join +cairo_get_line_join +cairo_set_line_width +cairo_get_line_width +cairo_set_miter_limit +cairo_get_miter_limit +cairo_operator_t +cairo_set_operator +cairo_get_operator +cairo_set_tolerance +cairo_get_tolerance +cairo_clip +cairo_clip_preserve +cairo_clip_extents +cairo_in_clip +cairo_reset_clip +cairo_rectangle_t +cairo_rectangle_list_t +cairo_rectangle_list_destroy +cairo_copy_clip_rectangle_list +cairo_fill +cairo_fill_preserve +cairo_fill_extents +cairo_in_fill +cairo_mask +cairo_mask_surface +cairo_paint +cairo_paint_with_alpha +cairo_stroke +cairo_stroke_preserve +cairo_stroke_extents +cairo_in_stroke +cairo_copy_page +cairo_show_page +cairo_get_reference_count +cairo_set_user_data +cairo_get_user_data + +cairo_public +CAIRO_BEGIN_DECLS +CAIRO_END_DECLS +cairo_current_font_extents +cairo_get_font_extents +cairo_current_operator +cairo_current_tolerance +cairo_current_point +cairo_current_fill_rule +cairo_current_line_width +cairo_current_line_cap +cairo_current_line_join +cairo_current_miter_limit +cairo_current_matrix +cairo_current_target_surface +cairo_get_status +cairo_concat_matrix +cairo_scale_font +cairo_select_font +cairo_transform_font +cairo_transform_point +cairo_transform_distance +cairo_inverse_transform_point +cairo_inverse_transform_distance +cairo_init_clip +cairo_surface_create_for_image +cairo_default_matrix +cairo_matrix_set_affine +cairo_matrix_set_identity +cairo_pattern_add_color_stop +cairo_set_rgb_color +cairo_set_pattern +cairo_xlib_surface_create_for_pixmap_with_visual +cairo_xlib_surface_create_for_window_with_visual +cairo_xcb_surface_create_for_pixmap_with_visual +cairo_xcb_surface_create_for_window_with_visual +cairo_ps_surface_set_dpi +cairo_pdf_surface_set_dpi +cairo_svg_surface_set_dpi +cairo_current_path +cairo_current_path_flat +cairo_get_path +cairo_get_path_flat +cairo_set_alpha +cairo_show_surface +cairo_copy +cairo_surface_set_repeat +cairo_surface_set_matrix +cairo_surface_get_matrix +cairo_surface_set_filter +cairo_surface_get_filter +cairo_matrix_create +cairo_matrix_destroy +cairo_matrix_copy +cairo_matrix_get_affine +cairo_set_target_surface +cairo_set_target_image +cairo_set_target_pdf +cairo_set_target_png +cairo_set_target_ps +cairo_set_target_quartz +cairo_set_target_win32 +cairo_set_target_xcb +cairo_set_target_drawable +cairo_get_status_string +cairo_status_string +CAIRO_FONT_TYPE_ATSUI +cairo_atsui_font_face_create_for_atsu_font_id +
+ +
+cairo-script +CAIRO_HAS_SCRIPT_SURFACE +cairo_script_create +cairo_script_create_for_stream +cairo_script_from_recording_surface +cairo_script_get_mode +cairo_script_mode_t +cairo_script_set_mode +cairo_script_surface_create +cairo_script_surface_create_for_target +cairo_script_write_comment +
diff --git a/doc/public/cairo.types b/doc/public/cairo.types new file mode 100644 index 000000000..e69de29bb diff --git a/doc/public/check-doc-coverage.sh b/doc/public/check-doc-coverage.sh new file mode 100755 index 000000000..648ca1212 --- /dev/null +++ b/doc/public/check-doc-coverage.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +if test -z "$DOC_MODULE"; then + # extract from Makefile + eval `grep '^DOC_MODULE' Makefile | sed 's/ //g'` + if test -z "$DOC_MODULE"; then + echo Failed extracting DOC_MODULE from Makefile 1>&2 + echo Try setting DOC_MODULE env var manually 1>&2 + exit 1 + fi +fi + +if test -n "$REPORT_FILES"; then + $MAKE $REPORT_FILES || exit 1 +fi + +test -z "$srcdir" && srcdir=. +stat=0 + +if test -f "$DOC_MODULE-undeclared.txt"; then + undeclared=`cat "$DOC_MODULE-undeclared.txt"` + if test -n "$undeclared"; then + echo "*** ERROR: Undeclared documentation symbols:" 1>&2 + cat "$DOC_MODULE-undeclared.txt" 1>&2 + stat=1 + fi +fi >&2 +if test -f "$DOC_MODULE-unused.txt"; then + unused=`cat "$DOC_MODULE-unused.txt"` + if test -n "$unused"; then + echo "*** ERROR: Unused documented symbols:" 1>&2 + cat "$DOC_MODULE-unused.txt" 1>&2 + stat=1 + fi +fi >&2 +if test -f "$DOC_MODULE-undocumented.txt"; then + if grep '^0 symbols incomplete' "$DOC_MODULE-undocumented.txt" >/dev/null && + grep '^0 not documented' "$DOC_MODULE-undocumented.txt" >/dev/null; then + : + else + echo "*** ERROR: Incomplete or undocumented symbols:" 1>&2 + cat "$DOC_MODULE-undocumented.txt" 1>&2 + stat=1 + fi +fi >&2 + +if test $stat != 0; then + echo "*** IGNORING ERROR ***" +fi +#exit $stat +exit 0 diff --git a/doc/public/check-doc-syntax.sh b/doc/public/check-doc-syntax.sh new file mode 100755 index 000000000..129065d2a --- /dev/null +++ b/doc/public/check-doc-syntax.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +test -z "$srcdir" && srcdir=. +test -z "$top_srcdir" && top_srcdir=$srcdir/../.. + +SGML_DOCS=true +FILES=`echo $srcdir/tmpl/*.sgml` + +. "$top_srcdir/src/check-doc-syntax.sh" diff --git a/doc/public/html/bindings-errors.html b/doc/public/html/bindings-errors.html new file mode 100644 index 000000000..af85a3f0c --- /dev/null +++ b/doc/public/html/bindings-errors.html @@ -0,0 +1,122 @@ + + + + +Cairo: A Vector Graphics Library: Error handling + + + + + + + + + + + + + + + + +
+

+Error handling

+

+ The error handling approach in C for Cairo has multiple + elements: +

+
    +
  • + When a method on an object fails, the object is put into + an error state. Subsequent operations on the object do + nothing. The status of the object can be queried with + a function like status(). +

  • +
  • +

    + Constructors, rather than + returning NULL on out-of-memory failure, + return a special singleton object on which all + operations do nothing. Retrieving the status of the + singleton object returns CAIRO_STATUS_NO_MEMORY +

    +

    + Is this going to apply to + cairo_surface_t as well? +

    +

    + What about cairo_copy_path_data()? It's probably going to + have to return NULL. +

    +
  • +
  • + Errors propagate from object to object. Setting a pattern + in an out-of-memory state as the source of a + cairo_t puts the type into an error state. +

  • +
+

Much of the above is not yet implemented at the time of + this writing

+

+ A language binding could copy the C approach, and for a + language without exceptions, this is likely the right thing + to do. However, for a language with exceptions, exposing + a completely different style of error handling for cairo + would be strange. So, instead, status should be checked + after every call to cairo, and exceptions thrown as necessary. +

+

+ One problem that can arise with this, in languages + where handling exceptions is mandatory (like Java), is that almost + every cairo function can result in a status being set, + usually because of an out-of-memory condition. This could make + cairo hard to use. To resolve this problem, let's classify then + cairo status codes: +

+
+/* Memory */      
+CAIRO_STATUS_NO_MEMORY,
+
+/* Programmer error */      
+CAIRO_STATUS_INVALID_RESTORE
+CAIRO_STATUS_INVALID_POP_GROUP
+CAIRO_STATUS_NO_CURRENT_POINT
+CAIRO_STATUS_INVALID_MATRIX
+CAIRO_STATUS_NO_TARGET_SURFACE
+CAIRO_STATUS_INVALID_STRING
+CAIRO_STATUS_SURFACE_FINISHED
+CAIRO_STATUS_BAD_NESTING
+
+/* Language binding implementation */
+CAIRO_STATUS_NULL_POINTER
+CAIRO_STATUS_INVALID_PATH_DATA
+CAIRO_STATUS_SURFACE_TYPE_MISMATCH
+
+/* Other */      
+CAIRO_STATUS_READ_ERROR
+CAIRO_STATUS_WRITE_ERROR
+
+

+ If we look at these, the + CAIRO_STATUS_NO_MEMORY + should map to the native out-of-memory exception, which could + happen at any point in any case. Most of the others indicate + programmer error, and handling them in user code would be + silly. These should be mapped into whatever the language uses + for assertion failures, rather than errors that are normally + handled. (In Java, a subclass of Error rather than Exception, + perhaps.) And CAIRO_STATUS_READ_ERROR, + and CAIRO_STATUS_WRITE_ERROR can occur + only in very specific places. (In fact, as described + in the section called “Streams and File I/Oâ€, these errors may be + mapped into the language's native I/O error types.) + So, there really aren't exceptions that the programmer must + handle at most points in the Cairo API. +

+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-fonts.html b/doc/public/html/bindings-fonts.html new file mode 100644 index 000000000..2e7a8ba0c --- /dev/null +++ b/doc/public/html/bindings-fonts.html @@ -0,0 +1,53 @@ + + + + +Cairo: A Vector Graphics Library: Fonts + + + + + + + + + + + + + + + + +
+

+Fonts

+

+ Fonts are once more an area where there is a hierarchy of types: +

+
+cairo_font_face_t
+   cairo_ft_font_face_t
+   cairo_win32_font_face_t
+cairo_scaled_font_t
+   cairo_ft_scaled_font_t	
+   cairo_win32_scaled_font_t	
+
+

+ The methods on the subtypes are, however, not useful without + bindings for fontconfig and FreeType or for the Win32 GDI, + so most language bindings will choose not to bind these + types. +

+

+ The cairo_font_face_set_user_data(), + and cairo_font_face_get_user_data() + methods are provided for use in language bindings, and should + not be directly exposed to applications. +

+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-memory.html b/doc/public/html/bindings-memory.html new file mode 100644 index 000000000..179232961 --- /dev/null +++ b/doc/public/html/bindings-memory.html @@ -0,0 +1,123 @@ + + + + +Cairo: A Vector Graphics Library: Memory management + + + + + + + + + + + + + + + + +
+

+Memory management

+

+ The objects in cairo can roughly be divided into two types: + reference-counted, opaque types like + cairo_surface_t + and plain structures like + cairo_glyph_t. + cairo_path_t + and + cairo_path_data_t + are special cases and are treated separately in this appendix. +

+

+ Refcounted opaque types all have a + ..._reference() + function to increase the refcount by one and a + ..._destroy() to decrease the refcount + by one. These should not be exposed to the user of the language + binding, but rather used to implement memory management within + the language binding. The simplest way to do memory management + for a language binding is to treat the language binding object + as a simple handle to the cairo object. The language binding + object references the cairo object, and unreferences it when + finalized. This is the recommended method, though there are + a couple of caveats to be noted: +

+
    +
  • + Equality won't work as expected. You can have two language + objects for the same cairo and they won't necessarily + compare equal. If the language allows customizing the + equality operation, then this is fixable by comparing + the underlying pointers. It also can be fixed by creating + at most one language object per cairo object, and + uniquifying via a pin table (a hash + table that goes from cairo object to language object). + For cairo_surface_t you can use also + cairo_surface_set_user_data() + instead of a separate pin table. +

  • +
  • +

    + Derivation from the language object doesn't work because + you can lose the language object while keeping the Cairo + object. Code like: +

    +
    +public class MySurface (ImageSurface) {
    +   public MySurface (width, height) {
    +      super (Format.ARGB32, width, height);
    +   }
    +   public int get42 () {
    +      return 42;	  
    +   }
    +}
    +
    +   cr = Cairo(MySurface(width, height));
    +   surface = cr.getTarget();
    +
    +

    + Can result in surface containing an + ImageSurface not a MySurface. + This is not easily fixable without creating memory leaks, + and it's probably best to simply forbid deriving from the + language objects. +

    +
  • +
+

+ When a plain structure is used as a return value from cairo, + this is done by passing it as a “out parameterâ€. +

+
+cairo_font_extents_t extents;      
+
+cairo_font_extents (cr, &extents);
+

+ In a language binding, this should typically be treated + as a return value: +

+
+FontExtents extents = cr.fontExtents ();
+

+ A language binding has a choice in how it implements the + language objects for plain structures. It can use a pure + language object with fields corresponding to those of the C + structure, and convert from and to the C structure when calling + cairo functions or converting cairo return values. Or it + can keep a pointer to the C structure internally and wrap + it inside a language object much like occurs for refcounted + objects. The choice should be invisible to the user: they should + be able to imagine that it is implemented as a pure language + object. +

+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-overloading.html b/doc/public/html/bindings-overloading.html new file mode 100644 index 000000000..efdd01b4d --- /dev/null +++ b/doc/public/html/bindings-overloading.html @@ -0,0 +1,121 @@ + + + + +Cairo: A Vector Graphics Library: Overloading and optional arguments + + + + + + + + + + + + + + + + +
+

+Overloading and optional arguments

+

+ Function overloading (having a several variants of a function + with the same name and different arguments) is a language + feature available in many languages but not in C. +

+

+ In general, language binding authors should use restraint in + combining functions in the cairo API via function + overloading. What may seem like an obvious overload now may + turn out to be strange with future additions to cairo. + It might seem logical to make + cairo_set_source_rgb() + an overload of cairo_set_source(), but future plans to add + cairo_set_source_rgb_premultiplied(), + which will also take three doubles make this a bad idea. For + this reason, only the following pairs of functions should + be combined via overloading +

+
+void
+cairo_set_source (cairo_t *cr, cairo_pattern_t *source);
+
+void
+cairo_set_source_surface (cairo_t          *cr,
+                          cairo_surface_t  *source,
+                          double            surface_x,
+                          double            surface_y);
+      
+void
+cairo_mask (cairo_t         *cr,
+	    cairo_pattern_t *pattern);
+
+void
+cairo_mask_surface (cairo_t         *cr,
+		    cairo_surface_t *surface,
+		    double           surface_x,
+		    double           surface_y);
+      
+cairo_surface_t *
+cairo_image_surface_create (cairo_format_t	format,
+			    int			width,
+			    int			height);
+cairo_surface_t *
+cairo_image_surface_create_for_data (unsigned char	       *data,
+				     cairo_format_t		format,
+				     int			width,
+				     int			height,
+				     int			stride);
+
+cairo_status_t
+cairo_surface_write_to_png (cairo_surface_t	*surface,
+			    const char		*filename);
+
+cairo_status_t
+cairo_surface_write_to_png_stream (cairo_surface_t	*surface,
+				   cairo_write_func_t	write_func,
+				   void			*closure);
+
+cairo_surface_t *
+cairo_image_surface_create_from_png (const char	*filename);
+
+cairo_surface_t *
+cairo_image_surface_create_from_png_stream (cairo_read_func_t	read_func,
+					    void		*closure);
+    
+

+ Note that there are cases where all constructors for a type + aren't overloaded together. For example + cairo_image_surface_create_from_png() + should not be overloaded together with + cairo_image_surface_create(). + In such cases, the remaining constructors will typically need to + be bound as static methods. In Java, for example, we might have: +

+
+Surface surface1 = ImageSurface(Format.RGB24, 100, 100);
+Surface surface2 = ImageSurface.createFromPNG("camera.png");
+

+ Some other overloads that add combinations not found in C may be + convenient for users for language bindings that provide + cairo_point_t and cairo_rectangle_t + types, for example: +

+
+void
+cairo_move_to (cairo_t       *cr,
+               cairo_point_t *point);
+void
+cairo_rectangle (cairo_t           *cr,
+                 cairo_rectangle_t *rectangle);
+    
+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-path.html b/doc/public/html/bindings-path.html new file mode 100644 index 000000000..5810b39bb --- /dev/null +++ b/doc/public/html/bindings-path.html @@ -0,0 +1,117 @@ + + + + +Cairo: A Vector Graphics Library: cairo_path_t + + + + + + + + + + + + + + + +
+

+cairo_path_t

+

+ The cairo_path_t type is one + area in which most language bindings will differ significantly + from the C API. The C API for cairo_path_t is + designed for efficiency and to avoid auxiliary objects that + would be have to be manually memory managed by the + application. However, + a language binding should not present cairo_path_t as an + array, but rather as an opaque that can be iterated + over. Different languages have quite different conventions for + how iterators work, so it is impossible to give an exact + specification for how this API should work, but the type names + and methods should be similar to the language's mapping of the following: +

+
+typedef struct cairo_path_iterator cairo_path_iterator_t;
+typedef struct cairo_path_element cairo_path_element_t;
+
+cairo_path_iterator_t *
+cairo_path_get_iterator (cairo_path_t *path);
+
+cairo_bool_t
+cairo_path_iterator_has_next (cairo_path_iterator_t *iterator);
+      
+cairo_path_element_t *
+cairo_path_iterator_next (cairo_path_iterator_t *iterator);
+
+cairo_path_element_type_t
+cairo_path_element_get_type (cairo_path_element_t *element);
+      
+void
+cairo_path_element_get_point (cairo_path_element_t *element,
+                              int                   index,
+                              double                *x,
+                              double                *y);
+    
+

+ The above is written using the Java conventions for + iterators. To illustrate how the API for PathIterator might + depend on the native iteration conventions of the API, examine + three versions of the loop, first written in a hypothetical Java + binding: +

+
+PathIterator iter = cr.copyPath().iterator();
+while (cr.hasNext()) {
+    PathElement element = iter.next();
+    if (element.getType() == PathElementType.MOVE_TO) {
+        Point p = element.getPoint(0);
+        doMoveTo (p.x, p.y);
+    }
+}
+

+ And then in a hypothetical C++ binding: +

+
+Path path = cr.copyPath();
+for (PathIterator iter = path.begin(); iter != path.end(); iter++) {
+    PathElement element = *iter;
+    if (element.getType() == PathElementType.MOVE_TO) {
+        Point p = element.getPoint(0);
+        doMoveTo (p.x, p.y);
+    }
+}
+

+ And then finally in a Python binding: +

+
+for element in cr.copy_path():
+    if element.getType == cairo.PATH_ELEMENT_MOVE_TO:
+        (x, y) = element.getPoint(0)
+        doMoveTo (x, y);
+

+ While many of the API elements stay the same in the three + examples, the exact iteration mechanism is quite different, to + match how users of the language would expect to iterate over + a container. +

+

+ You should not present an API for mutating or for creating new + cairo_path_t objects. In the future, these + guidelines may be extended to present an API for creating a + cairo_path_t from scratch for use with + cairo_append_path() + but the current expectation is that cairo_append_path() will + mostly be used with paths from + cairo_copy_path(). +

+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-patterns.html b/doc/public/html/bindings-patterns.html new file mode 100644 index 000000000..1055f427b --- /dev/null +++ b/doc/public/html/bindings-patterns.html @@ -0,0 +1,75 @@ + + + + +Cairo: A Vector Graphics Library: Patterns + + + + + + + + + + + + + + + + +
+

+Patterns

+

+ The cairo C API allows for creating a number of different types + of patterns. All of these different types of patterns map to + cairo_pattern_t + in C, but in an object oriented language, there should instead + be a hierarchy of types. (The functions that should map to + constructors or static methods for the various types are listed + after the type, methods on that type are listed below. Note that + cairo_pattern_create_rgb() and cairo_pattern_create_rgba() + should not be overloaded with each other as a SolidPattern() + constructor, but should appear as static methods instead. This + is to maintain code clarity by making it clear how the arguments + relate to color components.) +

+
+cairo_pattern_t
+      cairo_pattern_set_matrix()
+      cairo_pattern_get_matrix()
+   cairo_solid_pattern_t (cairo_pattern_create_rgb() and cairo_pattern_create_rgba())
+   cairo_surface_pattern_t (cairo_pattern_create_for_surface())
+         cairo_pattern_set_extend()
+         cairo_pattern_get_extend()
+         cairo_pattern_set_filter()
+         cairo_pattern_get_filter()
+   cairo_gradient_t
+         cairo_pattern_add_color_stop_rgb()
+         cairo_pattern_add_color_stop_rgba()
+      cairo_linear_gradient_t (cairo_pattern_create_linear())
+      cairo_radial_gradient_t (cairo_pattern_create_radial())
+   cairo_mesh_t (cairo_pattern_create_mesh())
+         cairo_mesh_pattern_begin_patch()
+         cairo_mesh_pattern_end_patch()
+         cairo_mesh_pattern_move_to()
+         cairo_mesh_pattern_line_to()
+         cairo_mesh_pattern_curve_to()
+         cairo_mesh_pattern_set_control_point()
+         cairo_mesh_pattern_set_corner_color_rgb()
+         cairo_mesh_pattern_set_corner_color_rgba()
+         cairo_mesh_pattern_get_patch_count()
+         cairo_mesh_pattern_get_path()
+         cairo_mesh_pattern_get_control_point()
+         cairo_mesh_pattern_get_corner_color_rgba()
+    
+

+

+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-return-values.html b/doc/public/html/bindings-return-values.html new file mode 100644 index 000000000..1b48308dc --- /dev/null +++ b/doc/public/html/bindings-return-values.html @@ -0,0 +1,120 @@ + + + + +Cairo: A Vector Graphics Library: Multiple return values + + + + + + + + + + + + + + + + +
+

+Multiple return values

+

+ There are a number of functions in the cairo API that have + multiple out parameters or + in-out parameters. In some languages + these can be translated into multiple return values. In Python, + what is: +

+
+cairo_user_to_device (cr, &x, &y);
+

+ can by mapped to: +

+
+(x, y) = cr.user_to_device (cr, x, y);
+

+ but many languages don't have provisions for multiple return + values, so it is necessary to introduce auxiliary types. + Most of the functions that require the auxiliary types + require a type that would, in C, look like +

+
+typedef struct _cairo_point cairo_point_t;
+struct _cairo_point {
+    double x;
+    double y;
+}
+

+ The same type should be used both for functions that use a pair + of coordinates as an absolute position, and functions that use + a pair of coordinates as a displacement. While an argument could + be made that having a separate “distance†type is more correct, + it is more likely just to confuse users. +

+
+void
+cairo_user_to_device (cairo_t *cr, double *x, double *y);
+
+void
+cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy);
+
+void
+cairo_device_to_user (cairo_t *cr, double *x, double *y);
+
+void
+cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy);
+
+void
+cairo_matrix_transform_distance (cairo_matrix_t *matrix, double *dx, double *dy);
+
+void
+cairo_matrix_transform_point (cairo_matrix_t *matrix, double *x, double *y);
+
+void
+cairo_get_current_point (cairo_t *cr, double *x, double *y);
+    
+

+ There are also a couple of functions that return four values + representing a rectangle. These should be mapped to a + “rectangle†type that looks like: +

+
+typedef struct _cairo_rectangle cairo_rectangle_t;
+struct _cairo_rectangle {
+    double x;
+    double y;
+    double width;
+    double height;
+}
+

+ The C function returns the rectangle as a set of two points to + facilitate rounding to integral extents, but this isn't worth + adding a “box†type to go along with the more obvious + “rectangle†representation. +

+

+ Q: Would it make sense here to define a standard + cairo_rectangle_round() method + that language bindings should map? +

+
+void
+cairo_stroke_extents (cairo_t *cr,
+		      double *x1, double *y1,
+		      double *x2, double *y2);
+
+void
+cairo_fill_extents (cairo_t *cr,
+		    double *x1, double *y1,
+		    double *x2, double *y2);
+    
+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-streams.html b/doc/public/html/bindings-streams.html new file mode 100644 index 000000000..5f7ffd624 --- /dev/null +++ b/doc/public/html/bindings-streams.html @@ -0,0 +1,92 @@ + + + + +Cairo: A Vector Graphics Library: Streams and File I/O + + + + + + + + + + + + + + + + +
+

+Streams and File I/O

+

+ Various places in the cairo API deal with reading and writing + data, whether from and to files, or to other sources and + destinations. In these cases, what is typically provided in the + C API is a simple version that just takes a filename, and a + complex version that takes a callback function. + An example is the PNG handling functions: +

+
+cairo_surface_t *
+cairo_image_surface_create_from_png (const char	*filename);
+
+cairo_surface_t *
+cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func,
+					    void             *closure);
+
+cairo_status_t
+cairo_surface_write_to_png (cairo_surface_t	*surface,
+			    const char		*filename);
+
+cairo_status_t
+cairo_surface_write_to_png_stream (cairo_surface_t	*surface,
+				   cairo_write_func_t	write_func,
+				   void			*closure);
+

+ The expectation is that the filename version will be mapped + literally in the language binding, but the callback version + will be mapped to a version that takes a language stream + object. For example, in Java, the four functions above + might be mapped to: +

+
+static public ImageSurface createFromPNG (String filename) throws IOException;
+static public ImageSurface createFromPNG (InputStream stream) throws IOException;
+public void writeToPNG (String filename) throws IOException;
+public void writeToPNG (OutputStream stream) throws IOException;
+
+

+ In many cases, it will be better to + implement the filename version internally + using the stream version, rather than building it on top of the + filename version in C. The reason for this is that will + naturally give a more standard handling of file errors for + the language, as seen in the above Java example, where + createFromPNG() is marked as raising + an exception. Propagating exceptions from inside the callback + function to the caller will pose a challenge to the language + binding implementor, since an exception must not propagate + through the Cairo code. A technique that will be useful in + some cases is to catch the exception in the callback, + store the exception object inside a structure pointed to by + closure, and then rethrow it once + the function returns. +

+

+ I'm not sure how to handle this for + cairo_pdf_surface_create_for_stream(). + Other than keep a “exception to rethrow†thread-specific + variable + that is checked after every call to a Cairo + function. +

+
+ + + \ No newline at end of file diff --git a/doc/public/html/bindings-surfaces.html b/doc/public/html/bindings-surfaces.html new file mode 100644 index 000000000..92d24c31f --- /dev/null +++ b/doc/public/html/bindings-surfaces.html @@ -0,0 +1,93 @@ + + + + +Cairo: A Vector Graphics Library: Surfaces + + + + + + + + + + + + + + + + +
+

+Surfaces

+

+ Like patterns, surfaces, which use only the + cairo_surface_t + type in the C API should be broken up into a hierarchy of types + in a language binding. +

+
+cairo_surface_t
+    cairo_image_surface_t
+    cairo_atsui_surface_t
+    cairo_win32_surface_t
+    cairo_xlib_surface_t
+    cairo_beos_surface_t
+    
+

+ Unlike patterns, the constructors and methods on these types are + clearly named, and can be trivially associated with the + appropriate subtype. Many language bindings will want to avoid + binding the platform-specific subtypes at all, since the + methods on these types are not useful without passing in native + C types. Unless there is a language binding for Xlib available, + there is no way to represent a XLib Display * in + that language. +

+

+ This doesn't mean that platform-specific surface types can't + be used in a language binding that doesn't bind the constructor. + A very common situation is to use a cairo language binding in + combination with a binding for a higher level system like + the GTK+ widget + toolkit. In such a situation, the higher level toolkit provides + ways to get references to platform specific surfaces. +

+

+ The cairo_surface_set_user_data(), + and cairo_surface_get_user_data() + methods are provided for use in language bindings, and should + not be directly exposed to applications. One example of the use + of these functions in a language binding is creating a binding for: +

+
+cairo_surface_t *
+cairo_image_surface_create_for_data (unsigned char	       *data,
+				     cairo_format_t		format,
+				     int			width,
+				     int			height,
+				     int			stride);
+
+

+ The memory block passed in for data must be + kept around until the surface is destroyed, so the language + binding must have some way of determining when that happens. The + way to do this is to use the destroy + argument to cairo_surface_set_user_data(). +

+

+ Some languages may not have a suitable “pointer to a block of + data†type to pass in for data. And even + where a language does have such a type, the user will be + frequently able to cause the backing store to be reallocated + to a different location or truncated. Should we recommend a + standard type name and binding for a buffer object here? +

+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Error-handling.html b/doc/public/html/cairo-Error-handling.html new file mode 100644 index 000000000..78012f3c8 --- /dev/null +++ b/doc/public/html/cairo-Error-handling.html @@ -0,0 +1,466 @@ + + + + +Cairo: A Vector Graphics Library: Error handling + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Error handling

+

Error handling — Decoding cairo's status

+
+
+

Functions

+
++++ + + + + + + + + + + +
const char * + +cairo_status_to_string () +
+void + +cairo_debug_reset_static_data () +
+
+
+

Types and Values

+
++++ + + + + +
enumcairo_status_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

Cairo uses a single status type to represent all kinds of errors. A status +value of CAIRO_STATUS_SUCCESS represents no error and has an integer value +of zero. All other status values represent an error.

+

Cairo's error handling is designed to be easy to use and safe. All major +cairo objects retain an error status internally which +can be queried anytime by the users using cairo*_status() calls. In +the mean time, it is safe to call all cairo functions normally even if the +underlying object is in an error status. This means that no error handling +code is required before or after each individual cairo function call.

+
+
+

Functions

+
+

cairo_status_to_string ()

+
const char *
+cairo_status_to_string (cairo_status_t status);
+

Provides a human-readable description of a cairo_status_t.

+
+

Parameters

+
+++++ + + + + + +

status

a cairo status

 
+
+
+

Returns

+

a string representation of the status

+

+
+

Since 1.0

+
+
+
+

cairo_debug_reset_static_data ()

+
void
+cairo_debug_reset_static_data (void);
+

Resets all static data within cairo to its original state, +(ie. identical to the state at the time of program invocation). For +example, all caches within cairo will be flushed empty.

+

This function is intended to be useful when using memory-checking +tools such as valgrind. When valgrind's memcheck analyzes a +cairo-using program without a call to cairo_debug_reset_static_data(), +it will report all data reachable via cairo's static objects as +"still reachable". Calling cairo_debug_reset_static_data() just prior +to program termination will make it easier to get squeaky clean +reports from valgrind.

+

WARNING: It is only safe to call this function when there are no +active cairo objects remaining, (ie. the appropriate destroy +functions have been called as necessary). If there are active cairo +objects, this call is likely to cause a crash, (eg. an assertion +failure due to a hash table being destroyed when non-empty).

+

Since 1.0

+
+
+
+

Types and Values

+
+

enum cairo_status_t

+

cairo_status_t is used to indicate errors that can occur when +using Cairo. In some cases it is returned directly by functions. +but when using cairo_t, the last error, if any, is stored in +the context and can be retrieved with cairo_status().

+

New entries may be added in future versions. Use cairo_status_to_string() +to get a human-readable representation of an error message.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_STATUS_SUCCESS

+

no error has occurred (Since 1.0)

+
 

CAIRO_STATUS_NO_MEMORY

+

out of memory (Since 1.0)

+
 

CAIRO_STATUS_INVALID_RESTORE

+

cairo_restore() called without matching cairo_save() (Since 1.0)

+
 

CAIRO_STATUS_INVALID_POP_GROUP

+

no saved group to pop, i.e. cairo_pop_group() without matching cairo_push_group() (Since 1.0)

+
 

CAIRO_STATUS_NO_CURRENT_POINT

+

no current point defined (Since 1.0)

+
 

CAIRO_STATUS_INVALID_MATRIX

+

invalid matrix (not invertible) (Since 1.0)

+
 

CAIRO_STATUS_INVALID_STATUS

+

invalid value for an input cairo_status_t (Since 1.0)

+
 

CAIRO_STATUS_NULL_POINTER

+

NULL pointer (Since 1.0)

+
 

CAIRO_STATUS_INVALID_STRING

+

input string not valid UTF-8 (Since 1.0)

+
 

CAIRO_STATUS_INVALID_PATH_DATA

+

input path data not valid (Since 1.0)

+
 

CAIRO_STATUS_READ_ERROR

+

error while reading from input stream (Since 1.0)

+
 

CAIRO_STATUS_WRITE_ERROR

+

error while writing to output stream (Since 1.0)

+
 

CAIRO_STATUS_SURFACE_FINISHED

+

target surface has been finished (Since 1.0)

+
 

CAIRO_STATUS_SURFACE_TYPE_MISMATCH

+

the surface type is not appropriate for the operation (Since 1.0)

+
 

CAIRO_STATUS_PATTERN_TYPE_MISMATCH

+

the pattern type is not appropriate for the operation (Since 1.0)

+
 

CAIRO_STATUS_INVALID_CONTENT

+

invalid value for an input cairo_content_t (Since 1.0)

+
 

CAIRO_STATUS_INVALID_FORMAT

+

invalid value for an input cairo_format_t (Since 1.0)

+
 

CAIRO_STATUS_INVALID_VISUAL

+

invalid value for an input Visual* (Since 1.0)

+
 

CAIRO_STATUS_FILE_NOT_FOUND

+

file not found (Since 1.0)

+
 

CAIRO_STATUS_INVALID_DASH

+

invalid value for a dash setting (Since 1.0)

+
 

CAIRO_STATUS_INVALID_DSC_COMMENT

+

invalid value for a DSC comment (Since 1.2)

+
 

CAIRO_STATUS_INVALID_INDEX

+

invalid index passed to getter (Since 1.4)

+
 

CAIRO_STATUS_CLIP_NOT_REPRESENTABLE

+

clip region not representable in desired format (Since 1.4)

+
 

CAIRO_STATUS_TEMP_FILE_ERROR

+

error creating or writing to a temporary file (Since 1.6)

+
 

CAIRO_STATUS_INVALID_STRIDE

+

invalid value for stride (Since 1.6)

+
 

CAIRO_STATUS_FONT_TYPE_MISMATCH

+

the font type is not appropriate for the operation (Since 1.8)

+
 

CAIRO_STATUS_USER_FONT_IMMUTABLE

+

the user-font is immutable (Since 1.8)

+
 

CAIRO_STATUS_USER_FONT_ERROR

+

error occurred in a user-font callback function (Since 1.8)

+
 

CAIRO_STATUS_NEGATIVE_COUNT

+

negative number used where it is not allowed (Since 1.8)

+
 

CAIRO_STATUS_INVALID_CLUSTERS

+

input clusters do not represent the accompanying text and glyph array (Since 1.8)

+
 

CAIRO_STATUS_INVALID_SLANT

+

invalid value for an input cairo_font_slant_t (Since 1.8)

+
 

CAIRO_STATUS_INVALID_WEIGHT

+

invalid value for an input cairo_font_weight_t (Since 1.8)

+
 

CAIRO_STATUS_INVALID_SIZE

+

invalid value (typically too big) for the size of the input (surface, pattern, etc.) (Since 1.10)

+
 

CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED

+

user-font method not implemented (Since 1.10)

+
 

CAIRO_STATUS_DEVICE_TYPE_MISMATCH

+

the device type is not appropriate for the operation (Since 1.10)

+
 

CAIRO_STATUS_DEVICE_ERROR

+

an operation to the device caused an unspecified error (Since 1.10)

+
 

CAIRO_STATUS_INVALID_MESH_CONSTRUCTION

+

a mesh pattern + construction operation was used outside of a + cairo_mesh_pattern_begin_patch()/cairo_mesh_pattern_end_patch() + pair (Since 1.12)

+
 

CAIRO_STATUS_DEVICE_FINISHED

+

target device has been finished (Since 1.12)

+
 

CAIRO_STATUS_JBIG2_GLOBAL_MISSING

+

CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID has been used on at least one image + but no image provided CAIRO_MIME_TYPE_JBIG2_GLOBAL (Since 1.14)

+
 

CAIRO_STATUS_LAST_STATUS

+

this is a special value indicating the number of + status values defined in this enumeration. When using this value, note + that the version of cairo at run-time may have additional status values + defined than the value of this symbol at compile-time. (Since 1.10)

+
 
+
+

Since 1.0

+
+
+ +
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-FreeType-Fonts.html b/doc/public/html/cairo-FreeType-Fonts.html new file mode 100644 index 000000000..8dd53916c --- /dev/null +++ b/doc/public/html/cairo-FreeType-Fonts.html @@ -0,0 +1,546 @@ + + + + +Cairo: A Vector Graphics Library: FreeType Fonts + + + + + + + + + + + + + + + + +
+
+
+ + +
+

FreeType Fonts

+

FreeType Fonts — Font support for FreeType

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_font_face_t * + +cairo_ft_font_face_create_for_ft_face () +
+cairo_font_face_t * + +cairo_ft_font_face_create_for_pattern () +
+void + +cairo_ft_font_options_substitute () +
+FT_Face + +cairo_ft_scaled_font_lock_face () +
+void + +cairo_ft_scaled_font_unlock_face () +
unsigned int + +cairo_ft_font_face_get_synthesize () +
+void + +cairo_ft_font_face_set_synthesize () +
+void + +cairo_ft_font_face_unset_synthesize () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
#defineCAIRO_HAS_FT_FONT
#defineCAIRO_HAS_FC_FONT
enumcairo_ft_synthesize_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The FreeType font backend is primarily used to render text on GNU/Linux +systems, but can be used on other platforms too.

+
+
+

Functions

+
+

cairo_ft_font_face_create_for_ft_face ()

+
cairo_font_face_t *
+cairo_ft_font_face_create_for_ft_face (FT_Face face,
+                                       int load_flags);
+

Creates a new font face for the FreeType font backend from a +pre-opened FreeType face. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). The +cairo_scaled_font_t returned from cairo_scaled_font_create() is +also for the FreeType backend and can be used with functions such +as cairo_ft_scaled_font_lock_face(). Note that Cairo may keep a reference +to the FT_Face alive in a font-cache and the exact lifetime of the reference +depends highly upon the exact usage pattern and is subject to external +factors. You must not call FT_Done_Face() before the last reference to the +cairo_font_face_t has been dropped.

+

As an example, below is how one might correctly couple the lifetime of +the FreeType face object to the cairo_font_face_t.

+
+static const cairo_user_data_key_t key;
+
+font_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
+status = cairo_font_face_set_user_data (font_face, &key,
+                               ft_face, (cairo_destroy_func_t) FT_Done_Face);
+if (status) {
+   cairo_font_face_destroy (font_face);
+   FT_Done_Face (ft_face);
+   return ERROR;
+}
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

A FreeType face object, already opened. This must +be kept around until the face's ref_count drops to +zero and it is freed. Since the face may be referenced +internally to Cairo, the best way to determine when it +is safe to free the face is to pass a +cairo_destroy_func_t to cairo_font_face_set_user_data()

 

load_flags

flags to pass to FT_Load_Glyph when loading +glyphs from the font. These flags are OR'ed together with +the flags derived from the cairo_font_options_t passed +to cairo_scaled_font_create(), so only a few values such +as FT_LOAD_VERTICAL_LAYOUT, and FT_LOAD_FORCE_AUTOHINT +are useful. You should not pass any of the flags affecting +the load target, such as FT_LOAD_TARGET_LIGHT.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.0

+
+
+
+

cairo_ft_font_face_create_for_pattern ()

+
cairo_font_face_t *
+cairo_ft_font_face_create_for_pattern (FcPattern *pattern);
+

Creates a new font face for the FreeType font backend based on a +fontconfig pattern. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). The +cairo_scaled_font_t returned from cairo_scaled_font_create() is +also for the FreeType backend and can be used with functions such +as cairo_ft_scaled_font_lock_face().

+

Font rendering options are represented both here and when you +call cairo_scaled_font_create(). Font options that have a representation +in a FcPattern must be passed in here; to modify FcPattern +appropriately to reflect the options in a cairo_font_options_t, call +cairo_ft_font_options_substitute().

+

The pattern's FC_FT_FACE element is inspected first and if that is set, +that will be the FreeType font face associated with the returned cairo +font face. Otherwise the FC_FILE element is checked. If it's set, +that and the value of the FC_INDEX element (defaults to zero) of pattern + +are used to load a font face from file.

+

If both steps from the previous paragraph fails, pattern + will be passed +to FcConfigSubstitute, FcDefaultSubstitute, and finally FcFontMatch, +and the resulting font pattern is used.

+

If the FC_FT_FACE element of pattern + is set, the user is responsible +for making sure that the referenced FT_Face remains valid for the life +time of the returned cairo_font_face_t. See +cairo_ft_font_face_create_for_ft_face() for an example of how to couple +the life time of the FT_Face to that of the cairo font-face.

+
+

Parameters

+
+++++ + + + + + +

pattern

A fontconfig pattern. Cairo makes a copy of the pattern +if it needs to. You are free to modify or free pattern +after this call.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.0

+
+
+
+

cairo_ft_font_options_substitute ()

+
void
+cairo_ft_font_options_substitute (const cairo_font_options_t *options,
+                                  FcPattern *pattern);
+

Add options to a FcPattern based on a cairo_font_options_t font +options object. Options that are already in the pattern, are not overridden, +so you should call this function after calling FcConfigSubstitute() (the +user's settings should override options based on the surface type), but +before calling FcDefaultSubstitute().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t object

 

pattern

an existing FcPattern

 
+
+

Since 1.0

+
+
+
+

cairo_ft_scaled_font_lock_face ()

+
FT_Face
+cairo_ft_scaled_font_lock_face (cairo_scaled_font_t *scaled_font);
+

cairo_ft_scaled_font_lock_face() gets the FT_Face object from a FreeType +backend font and scales it appropriately for the font. You must +release the face with cairo_ft_scaled_font_unlock_face() +when you are done using it. Since the FT_Face object can be +shared between multiple cairo_scaled_font_t objects, you must not +lock any other font objects until you unlock this one. A count is +kept of the number of times cairo_ft_scaled_font_lock_face() is +called. cairo_ft_scaled_font_unlock_face() must be called the same number +of times.

+

You must be careful when using this function in a library or in a +threaded application, because freetype's design makes it unsafe to +call freetype functions simultaneously from multiple threads, (even +if using distinct FT_Face objects). Because of this, application +code that acquires an FT_Face object with this call must add its +own locking to protect any use of that object, (and which also must +protect any other calls into cairo as almost any cairo function +might result in a call into the freetype library).

+
+

Parameters

+
+++++ + + + + + +

scaled_font

A cairo_scaled_font_t from the FreeType font backend. Such an +object can be created by calling cairo_scaled_font_create() on a +FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), +cairo_ft_font_face_create_for_ft_face()).

 
+
+
+

Returns

+

The FT_Face object for font +, scaled appropriately, +or NULL if scaled_font +is in an error state (see +cairo_scaled_font_status()) or there is insufficient memory.

+

+
+

Since 1.0

+
+
+
+

cairo_ft_scaled_font_unlock_face ()

+
void
+cairo_ft_scaled_font_unlock_face (cairo_scaled_font_t *scaled_font);
+

Releases a face obtained with cairo_ft_scaled_font_lock_face().

+
+

Parameters

+
+++++ + + + + + +

scaled_font

A cairo_scaled_font_t from the FreeType font backend. Such an +object can be created by calling cairo_scaled_font_create() on a +FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), +cairo_ft_font_face_create_for_ft_face()).

 
+
+

Since 1.0

+
+
+
+

cairo_ft_font_face_get_synthesize ()

+
unsigned int
+cairo_ft_font_face_get_synthesize (cairo_font_face_t *font_face);
+

See cairo_ft_synthesize_t.

+
+

Parameters

+
+++++ + + + + + +

font_face

The cairo_ft_font_face_t object to query

 
+
+
+

Returns

+

the current set of synthesis options.

+

+
+

Since 1.12

+
+
+
+

cairo_ft_font_face_set_synthesize ()

+
void
+cairo_ft_font_face_set_synthesize (cairo_font_face_t *font_face,
+                                   unsigned int synth_flags);
+

FreeType provides the ability to synthesize different glyphs from a base +font, which is useful if you lack those glyphs from a true bold or oblique +font. See also cairo_ft_synthesize_t.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

The cairo_ft_font_face_t object to modify

 

synth_flags

the set of synthesis options to enable

 
+
+

Since 1.12

+
+
+
+

cairo_ft_font_face_unset_synthesize ()

+
void
+cairo_ft_font_face_unset_synthesize (cairo_font_face_t *font_face,
+                                     unsigned int synth_flags);
+

See cairo_ft_font_face_set_synthesize().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

The cairo_ft_font_face_t object to modify

 

synth_flags

the set of synthesis options to disable

 
+
+

Since 1.12

+
+
+
+

Types and Values

+
+

CAIRO_HAS_FT_FONT

+
#define CAIRO_HAS_FT_FONT 1
+
+

Defined if the FreeType font backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.0

+
+
+
+

CAIRO_HAS_FC_FONT

+
#define CAIRO_HAS_FC_FONT 1
+
+

Defined if the Fontconfig-specific functions of the FreeType font backend +are available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.10

+
+
+
+

enum cairo_ft_synthesize_t

+

A set of synthesis options to control how FreeType renders the glyphs +for a particular font face.

+

Individual synthesis features of a cairo_ft_font_face_t can be set +using cairo_ft_font_face_set_synthesize(), or disabled using +cairo_ft_font_face_unset_synthesize(). The currently enabled set of +synthesis options can be queried with cairo_ft_font_face_get_synthesize().

+

Note: that when synthesizing glyphs, the font metrics returned will only +be estimates.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_FT_SYNTHESIZE_BOLD

+

Embolden the glyphs (redraw with a pixel offset)

+
 

CAIRO_FT_SYNTHESIZE_OBLIQUE

+

Slant the glyph outline by 12 degrees to the +right.

+
 
+
+

Since 1.12

+
+
+
+

See Also

+

cairo_font_face_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Image-Surfaces.html b/doc/public/html/cairo-Image-Surfaces.html new file mode 100644 index 000000000..e5d4bb413 --- /dev/null +++ b/doc/public/html/cairo-Image-Surfaces.html @@ -0,0 +1,582 @@ + + + + +Cairo: A Vector Graphics Library: Image Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Image Surfaces

+

Image Surfaces — Rendering to memory buffers

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+int + +cairo_format_stride_for_width () +
+cairo_surface_t * + +cairo_image_surface_create () +
+cairo_surface_t * + +cairo_image_surface_create_for_data () +
unsigned char * + +cairo_image_surface_get_data () +
+cairo_format_t + +cairo_image_surface_get_format () +
+int + +cairo_image_surface_get_width () +
+int + +cairo_image_surface_get_height () +
+int + +cairo_image_surface_get_stride () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineCAIRO_HAS_IMAGE_SURFACE
enumcairo_format_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

Image surfaces provide the ability to render to memory buffers +either allocated by cairo or by the calling code. The supported +image formats are those defined in cairo_format_t.

+
+
+

Functions

+
+

cairo_format_stride_for_width ()

+
int
+cairo_format_stride_for_width (cairo_format_t format,
+                               int width);
+

This function provides a stride value that will respect all +alignment requirements of the accelerated image-rendering code +within cairo. Typical usage will be of the form:

+
+int stride;
+unsigned char *data;
+cairo_surface_t *surface;
+
+stride = cairo_format_stride_for_width (format, width);
+data = malloc (stride * height);
+surface = cairo_image_surface_create_for_data (data, format,
+					  width, height,
+					  stride);
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

format

A cairo_format_t value

 

width

The desired width of an image surface to be created.

 
+
+
+

Returns

+

the appropriate stride to use given the desired +format and width, or -1 if either the format is invalid or the width +too large.

+

+
+

Since 1.6

+
+
+
+

cairo_image_surface_create ()

+
cairo_surface_t *
+cairo_image_surface_create (cairo_format_t format,
+                            int width,
+                            int height);
+

Creates an image surface of the specified format and +dimensions. Initially the surface contents are all

+
  1. (Specifically, within each pixel, each color or alpha channel +belonging to format will be 0. The contents of bits within a pixel, +but not belonging to the given format are undefined).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

format

format of pixels in the surface to create

 

width

width of the surface, in pixels

 

height

height of the surface, in pixels

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.0

+
+
+
+

cairo_image_surface_create_for_data ()

+
cairo_surface_t *
+cairo_image_surface_create_for_data (unsigned char *data,
+                                     cairo_format_t format,
+                                     int width,
+                                     int height,
+                                     int stride);
+

Creates an image surface for the provided pixel data. The output +buffer must be kept around until the cairo_surface_t is destroyed +or cairo_surface_finish() is called on the surface. The initial +contents of data + will be used as the initial image contents; you +must explicitly clear the buffer, using, for example, +cairo_rectangle() and cairo_fill() if you want it cleared.

+

Note that the stride may be larger than +width*bytes_per_pixel to provide proper alignment for each pixel +and row. This alignment is required to allow high-performance rendering +within cairo. The correct way to obtain a legal stride value is to +call cairo_format_stride_for_width() with the desired format and +maximum image width value, and then use the resulting stride value +to allocate the data and to create the image surface. See +cairo_format_stride_for_width() for example code.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

data

a pointer to a buffer supplied by the application in which +to write contents. This pointer must be suitably aligned for any +kind of variable, (for example, a pointer returned by malloc).

 

format

the format of pixels in the buffer

 

width

the width of the image to be stored in the buffer

 

height

the height of the image to be stored in the buffer

 

stride

the number of bytes between the start of rows in the +buffer as allocated. This value should always be computed by +cairo_format_stride_for_width() before allocating the data +buffer.

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface in the case of an error such as out of +memory or an invalid stride value. In case of invalid stride value +the error status of the returned surface will be +CAIRO_STATUS_INVALID_STRIDE. You can use +cairo_surface_status() to check for this.

+

See cairo_surface_set_user_data() for a means of attaching a +destroy-notification fallback to the surface if necessary.

+

+
+

Since 1.0

+
+
+
+

cairo_image_surface_get_data ()

+
unsigned char *
+cairo_image_surface_get_data (cairo_surface_t *surface);
+

Get a pointer to the data of the image surface, for direct +inspection or modification.

+

A call to cairo_surface_flush() is required before accessing the +pixel data to ensure that all pending drawing operations are +finished. A call to cairo_surface_mark_dirty() is required after +the data is modified.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_image_surface_t

 
+
+
+

Returns

+

a pointer to the image data of this surface or NULL +if surface +is not an image surface, or if cairo_surface_finish() +has been called.

+

+
+

Since 1.2

+
+
+
+

cairo_image_surface_get_format ()

+
cairo_format_t
+cairo_image_surface_get_format (cairo_surface_t *surface);
+

Get the format of the surface.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_image_surface_t

 
+
+
+

Returns

+

the format of the surface

+

+
+

Since 1.2

+
+
+
+

cairo_image_surface_get_width ()

+
int
+cairo_image_surface_get_width (cairo_surface_t *surface);
+

Get the width of the image surface in pixels.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_image_surface_t

 
+
+
+

Returns

+

the width of the surface in pixels.

+

+
+

Since 1.0

+
+
+
+

cairo_image_surface_get_height ()

+
int
+cairo_image_surface_get_height (cairo_surface_t *surface);
+

Get the height of the image surface in pixels.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_image_surface_t

 
+
+
+

Returns

+

the height of the surface in pixels.

+

+
+

Since 1.0

+
+
+
+

cairo_image_surface_get_stride ()

+
int
+cairo_image_surface_get_stride (cairo_surface_t *surface);
+

Get the stride of the image surface in bytes

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_image_surface_t

 
+
+
+

Returns

+

the stride of the image surface in bytes (or 0 if +surface +is not an image surface). The stride is the distance in +bytes from the beginning of one row of the image data to the +beginning of the next row.

+

+
+

Since 1.2

+
+
+
+

Types and Values

+
+

CAIRO_HAS_IMAGE_SURFACE

+
#define CAIRO_HAS_IMAGE_SURFACE 1
+
+

Defined if the image surface backend is available. +The image surface backend is always built in. +This macro was added for completeness in cairo 1.8.

+

Since 1.8

+
+
+
+

enum cairo_format_t

+

cairo_format_t is used to identify the memory format of +image data.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_FORMAT_INVALID

+

no such format exists or is supported.

+
 

CAIRO_FORMAT_ARGB32

+

each pixel is a 32-bit quantity, with + alpha in the upper 8 bits, then red, then green, then blue. + The 32-bit quantities are stored native-endian. Pre-multiplied + alpha is used. (That is, 50% transparent red is 0x80800000, + not 0x80ff0000.) (Since 1.0)

+
 

CAIRO_FORMAT_RGB24

+

each pixel is a 32-bit quantity, with + the upper 8 bits unused. Red, Green, and Blue are stored + in the remaining 24 bits in that order. (Since 1.0)

+
 

CAIRO_FORMAT_A8

+

each pixel is a 8-bit quantity holding + an alpha value. (Since 1.0)

+
 

CAIRO_FORMAT_A1

+

each pixel is a 1-bit quantity holding + an alpha value. Pixels are packed together into 32-bit + quantities. The ordering of the bits matches the + endianess of the platform. On a big-endian machine, the + first pixel is in the uppermost bit, on a little-endian + machine the first pixel is in the least-significant bit. (Since 1.0)

+
 

CAIRO_FORMAT_RGB16_565

+

each pixel is a 16-bit quantity + with red in the upper 5 bits, then green in the middle + 6 bits, and blue in the lower 5 bits. (Since 1.2)

+
 

CAIRO_FORMAT_RGB30

+

like RGB24 but with 10bpc. (Since 1.12)

+
 
+
+

Since 1.0

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-PDF-Surfaces.html b/doc/public/html/cairo-PDF-Surfaces.html new file mode 100644 index 000000000..33c46798b --- /dev/null +++ b/doc/public/html/cairo-PDF-Surfaces.html @@ -0,0 +1,450 @@ + + + + +Cairo: A Vector Graphics Library: PDF Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PDF Surfaces

+

PDF Surfaces — Rendering PDF documents

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_pdf_surface_create () +
+cairo_surface_t * + +cairo_pdf_surface_create_for_stream () +
+void + +cairo_pdf_surface_restrict_to_version () +
+void + +cairo_pdf_get_versions () +
const char * + +cairo_pdf_version_to_string () +
+void + +cairo_pdf_surface_set_size () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineCAIRO_HAS_PDF_SURFACE
enumcairo_pdf_version_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The PDF surface is used to render cairo graphics to Adobe +PDF files and is a multi-page vector surface backend.

+

The following mime types are supported: CAIRO_MIME_TYPE_JPEG, +CAIRO_MIME_TYPE_JP2, CAIRO_MIME_TYPE_UNIQUE_ID, +CAIRO_MIME_TYPE_JBIG2, CAIRO_MIME_TYPE_JBIG2_GLOBAL, +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID.

+

JBIG2 data in PDF must be in the embedded format as descibed in +ISO/IEC 11544. Image specific JBIG2 data must be in +CAIRO_MIME_TYPE_JBIG2. Any global segments in the JBIG2 data +(segments with page association field set to 0) must be in +CAIRO_MIME_TYPE_JBIG2_GLOBAL. The global data may be shared by +multiple images. All images sharing the same global data must set +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID to a unique identifer. At least +one of the images must provide the global data using +CAIRO_MIME_TYPE_JBIG2_GLOBAL. The global data will only be +embedded once but shared by all JBIG2 images with the same +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID.

+
+
+

Functions

+
+

cairo_pdf_surface_create ()

+
cairo_surface_t *
+cairo_pdf_surface_create (const char *filename,
+                          double width_in_points,
+                          double height_in_points);
+

Creates a PDF surface of the specified size in points to be written +to filename +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

filename

a filename for the PDF output (must be writable), NULL may be +used to specify no output. This will generate a PDF surface that +may be queried and used as a source, without generating a +temporary file.

 

width_in_points

width of the surface, in points (1 point == 1/72.0 inch)

 

height_in_points

height of the surface, in points (1 point == 1/72.0 inch)

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.2

+
+
+
+

cairo_pdf_surface_create_for_stream ()

+
cairo_surface_t *
+cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func,
+                                     void *closure,
+                                     double width_in_points,
+                                     double height_in_points);
+

Creates a PDF surface of the specified size in points to be written +incrementally to the stream represented by write_func + and closure +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

write_func

a cairo_write_func_t to accept the output data, may be NULL +to indicate a no-op write_func +. With a no-op write_func +, +the surface may be queried or used as a source without +generating any temporary files.

 

closure

the closure argument for write_func +

 

width_in_points

width of the surface, in points (1 point == 1/72.0 inch)

 

height_in_points

height of the surface, in points (1 point == 1/72.0 inch)

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.2

+
+
+
+

cairo_pdf_surface_restrict_to_version ()

+
void
+cairo_pdf_surface_restrict_to_version (cairo_surface_t *surface,
+                                       cairo_pdf_version_t version);
+

Restricts the generated PDF file to version +. See cairo_pdf_get_versions() +for a list of available version values that can be used here.

+

This function should only be called before any drawing operations +have been performed on the given surface. The simplest way to do +this is to call this function immediately after creating the +surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a PDF cairo_surface_t

 

version

PDF version

 
+
+

Since 1.10

+
+
+
+

cairo_pdf_get_versions ()

+
void
+cairo_pdf_get_versions (cairo_pdf_version_t const **versions,
+                        int *num_versions);
+

Used to retrieve the list of supported versions. See +cairo_pdf_surface_restrict_to_version().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

versions

supported version list

 

num_versions

list length

 
+
+

Since 1.10

+
+
+
+

cairo_pdf_version_to_string ()

+
const char *
+cairo_pdf_version_to_string (cairo_pdf_version_t version);
+

Get the string representation of the given version + id. This function +will return NULL if version + isn't valid. See cairo_pdf_get_versions() +for a way to get the list of valid version ids.

+
+

Parameters

+
+++++ + + + + + +

version

a version id

 
+
+
+

Returns

+

the string associated to given version.

+

+
+

Since 1.10

+
+
+
+

cairo_pdf_surface_set_size ()

+
void
+cairo_pdf_surface_set_size (cairo_surface_t *surface,
+                            double width_in_points,
+                            double height_in_points);
+

Changes the size of a PDF surface for the current (and +subsequent) pages.

+

This function should only be called before any drawing operations +have been performed on the current page. The simplest way to do +this is to call this function immediately after creating the +surface or immediately after completing a page with either +cairo_show_page() or cairo_copy_page().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a PDF cairo_surface_t

 

width_in_points

new surface width, in points (1 point == 1/72.0 inch)

 

height_in_points

new surface height, in points (1 point == 1/72.0 inch)

 
+
+

Since 1.2

+
+
+
+

Types and Values

+
+

CAIRO_HAS_PDF_SURFACE

+
#define CAIRO_HAS_PDF_SURFACE 1
+
+

Defined if the PDF surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.2

+
+
+
+

enum cairo_pdf_version_t

+

cairo_pdf_version_t is used to describe the version number of the PDF +specification that a generated PDF file will conform to.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_PDF_VERSION_1_4

+

The version 1.4 of the PDF specification. (Since 1.10)

+
 

CAIRO_PDF_VERSION_1_5

+

The version 1.5 of the PDF specification. (Since 1.10)

+
 
+
+

Since 1.10

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-PNG-Support.html b/doc/public/html/cairo-PNG-Support.html new file mode 100644 index 000000000..24cddbc16 --- /dev/null +++ b/doc/public/html/cairo-PNG-Support.html @@ -0,0 +1,420 @@ + + + + +Cairo: A Vector Graphics Library: PNG Support + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PNG Support

+

PNG Support — Reading and writing PNG images

+
+ +
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_PNG_FUNCTIONS
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The PNG functions allow reading PNG images into image surfaces, and writing +any surface to a PNG file.

+

It is a toy API. It only offers very simple support for reading and +writing PNG files, which is sufficient for testing and +demonstration purposes. Applications which need more control over +the generated PNG file should access the pixel data directly, using +cairo_image_surface_get_data() or a backend-specific access +function, and process it with another library, e.g. gdk-pixbuf or +libpng.

+
+
+

Functions

+
+

cairo_image_surface_create_from_png ()

+
cairo_surface_t *
+cairo_image_surface_create_from_png (const char *filename);
+

Creates a new image surface and initializes the contents to the +given PNG file.

+
+

Parameters

+
+++++ + + + + + +

filename

name of PNG file to load

 
+
+
+

Returns

+

a new cairo_surface_t initialized with the contents +of the PNG file, or a "nil" surface if any error occurred. A nil +surface can be checked for with cairo_surface_status(surface) which +may return one of the following values:

+

CAIRO_STATUS_NO_MEMORY +CAIRO_STATUS_FILE_NOT_FOUND +CAIRO_STATUS_READ_ERROR

+

Alternatively, you can allow errors to propagate through the drawing +operations and check the status on the context upon completion +using cairo_status().

+

+
+

Since 1.0

+
+
+
+

cairo_read_func_t ()

+
cairo_status_t
+(*cairo_read_func_t) (void *closure,
+                      unsigned char *data,
+                      unsigned int length);
+

cairo_read_func_t is the type of function which is called when a +backend needs to read data from an input stream. It is passed the +closure which was specified by the user at the time the read +function was registered, the buffer to read the data into and the +length of the data in bytes. The read function should return +CAIRO_STATUS_SUCCESS if all the data was successfully read, +CAIRO_STATUS_READ_ERROR otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

closure

the input closure

 

data

the buffer into which to read the data

 

length

the amount of data to read

 
+
+
+

Returns

+

the status code of the read operation

+

+
+

Since 1.0

+
+
+
+

cairo_image_surface_create_from_png_stream ()

+
cairo_surface_t *
+cairo_image_surface_create_from_png_stream
+                               (cairo_read_func_t read_func,
+                                void *closure);
+

Creates a new image surface from PNG data read incrementally +via the read_func + function.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

read_func

function called to read the data of the file

 

closure

data to pass to read_func +.

 
+
+
+

Returns

+

a new cairo_surface_t initialized with the contents +of the PNG file or a "nil" surface if the data read is not a valid PNG image +or memory could not be allocated for the operation. A nil +surface can be checked for with cairo_surface_status(surface) which +may return one of the following values:

+

CAIRO_STATUS_NO_MEMORY +CAIRO_STATUS_READ_ERROR

+

Alternatively, you can allow errors to propagate through the drawing +operations and check the status on the context upon completion +using cairo_status().

+

+
+

Since 1.0

+
+
+
+

cairo_surface_write_to_png ()

+
cairo_status_t
+cairo_surface_write_to_png (cairo_surface_t *surface,
+                            const char *filename);
+

Writes the contents of surface + to a new file filename + as a PNG +image.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a cairo_surface_t with pixel contents

 

filename

the name of a file to write to

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS if the PNG file was written +successfully. Otherwise, CAIRO_STATUS_NO_MEMORY if memory could not +be allocated for the operation or +CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have +pixel contents, or CAIRO_STATUS_WRITE_ERROR if an I/O error occurs +while attempting to write the file.

+

+
+

Since 1.0

+
+
+
+

cairo_write_func_t ()

+
cairo_status_t
+(*cairo_write_func_t) (void *closure,
+                       const unsigned char *data,
+                       unsigned int length);
+

cairo_write_func_t is the type of function which is called when a +backend needs to write data to an output stream. It is passed the +closure which was specified by the user at the time the write +function was registered, the data to write and the length of the +data in bytes. The write function should return +CAIRO_STATUS_SUCCESS if all the data was successfully written, +CAIRO_STATUS_WRITE_ERROR otherwise.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

closure

the output closure

 

data

the buffer containing the data to write

 

length

the amount of data to write

 
+
+
+

Returns

+

the status code of the write operation

+

+
+

Since 1.0

+
+
+
+

cairo_surface_write_to_png_stream ()

+
cairo_status_t
+cairo_surface_write_to_png_stream (cairo_surface_t *surface,
+                                   cairo_write_func_t write_func,
+                                   void *closure);
+

Writes the image surface to the write function.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t with pixel contents

 

write_func

a cairo_write_func_t

 

closure

closure data for the write function

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS if the PNG file was written +successfully. Otherwise, CAIRO_STATUS_NO_MEMORY is returned if +memory could not be allocated for the operation, +CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have +pixel contents.

+

+
+

Since 1.0

+
+
+
+

Types and Values

+
+

CAIRO_HAS_PNG_FUNCTIONS

+
#define CAIRO_HAS_PNG_FUNCTIONS 1
+
+

Defined if the PNG functions are available. +This macro can be used to conditionally compile code using the cairo +PNG functions.

+

Since 1.0

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Paths.html b/doc/public/html/cairo-Paths.html new file mode 100644 index 000000000..32cab4c61 --- /dev/null +++ b/doc/public/html/cairo-Paths.html @@ -0,0 +1,1503 @@ + + + + +Cairo: A Vector Graphics Library: Paths + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Paths

+

Paths — Creating paths and manipulating path data

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_path_t * + +cairo_copy_path () +
+cairo_path_t * + +cairo_copy_path_flat () +
+void + +cairo_path_destroy () +
+void + +cairo_append_path () +
+cairo_bool_t + +cairo_has_current_point () +
+void + +cairo_get_current_point () +
+void + +cairo_new_path () +
+void + +cairo_new_sub_path () +
+void + +cairo_close_path () +
+void + +cairo_arc () +
+void + +cairo_arc_negative () +
+void + +cairo_curve_to () +
+void + +cairo_line_to () +
+void + +cairo_move_to () +
+void + +cairo_rectangle () +
+void + +cairo_glyph_path () +
+void + +cairo_text_path () +
+void + +cairo_rel_curve_to () +
+void + +cairo_rel_line_to () +
+void + +cairo_rel_move_to () +
+void + +cairo_path_extents () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
 cairo_path_t
unioncairo_path_data_t
enumcairo_path_data_type_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

Paths are the most basic drawing tools and are primarily used to implicitly +generate simple masks.

+
+
+

Functions

+
+

cairo_copy_path ()

+
cairo_path_t *
+cairo_copy_path (cairo_t *cr);
+

Creates a copy of the current path and returns it to the user as a +cairo_path_t. See cairo_path_data_t for hints on how to iterate +over the returned data structure.

+

This function will always return a valid pointer, but the result +will have no data (data==NULL and +num_data==0), if either of the following +conditions hold:

+
    +
  1. If there is insufficient memory to copy the path. In this + case path->status will be set to + CAIRO_STATUS_NO_MEMORY.
  2. +
  3. If cr is already in an error state. In this case + path->status will contain the same status that + would be returned by cairo_status().
  4. +
+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the copy of the current path. The caller owns the +returned object and should call cairo_path_destroy() when finished +with it.

+

+
+

Since 1.0

+
+
+
+

cairo_copy_path_flat ()

+
cairo_path_t *
+cairo_copy_path_flat (cairo_t *cr);
+

Gets a flattened copy of the current path and returns it to the +user as a cairo_path_t. See cairo_path_data_t for hints on +how to iterate over the returned data structure.

+

This function is like cairo_copy_path() except that any curves +in the path will be approximated with piecewise-linear +approximations, (accurate to within the current tolerance +value). That is, the result is guaranteed to not have any elements +of type CAIRO_PATH_CURVE_TO which will instead be replaced by a +series of CAIRO_PATH_LINE_TO elements.

+

This function will always return a valid pointer, but the result +will have no data (data==NULL and +num_data==0), if either of the following +conditions hold:

+
    +
  1. If there is insufficient memory to copy the path. In this + case path->status will be set to + CAIRO_STATUS_NO_MEMORY.
  2. +
  3. If cr is already in an error state. In this case + path->status will contain the same status that + would be returned by cairo_status().
  4. +
+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the copy of the current path. The caller owns the +returned object and should call cairo_path_destroy() when finished +with it.

+

+
+

Since 1.0

+
+
+
+

cairo_path_destroy ()

+
void
+cairo_path_destroy (cairo_path_t *path);
+

Immediately releases all memory associated with path +. After a call +to cairo_path_destroy() the path + pointer is no longer valid and +should not be used further.

+

Note: cairo_path_destroy() should only be called with a +pointer to a cairo_path_t returned by a cairo function. Any path +that is created manually (ie. outside of cairo) should be destroyed +manually as well.

+
+

Parameters

+
+++++ + + + + + +

path

a path previously returned by either cairo_copy_path() or +cairo_copy_path_flat().

 
+
+

Since 1.0

+
+
+
+

cairo_append_path ()

+
void
+cairo_append_path (cairo_t *cr,
+                   const cairo_path_t *path);
+

Append the path + onto the current path. The path + may be either the +return value from one of cairo_copy_path() or +cairo_copy_path_flat() or it may be constructed manually. See +cairo_path_t for details on how the path data structure should be +initialized, and note that path->status must be +initialized to CAIRO_STATUS_SUCCESS.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

path

path to be appended

 
+
+

Since 1.0

+
+
+
+

cairo_has_current_point ()

+
cairo_bool_t
+cairo_has_current_point (cairo_t *cr);
+

Returns whether a current point is defined on the current path. +See cairo_get_current_point() for details on the current point.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

whether a current point is defined.

+

+
+

Since 1.6

+
+
+
+

cairo_get_current_point ()

+
void
+cairo_get_current_point (cairo_t *cr,
+                         double *x,
+                         double *y);
+

Gets the current point of the current path, which is +conceptually the final point reached by the path so far.

+

The current point is returned in the user-space coordinate +system. If there is no defined current point or if cr + is in an +error status, x + and y + will both be set to 0.0. It is possible to +check this in advance with cairo_has_current_point().

+

Most path construction functions alter the current point. See the +following for details on how they affect the current point: +cairo_new_path(), cairo_new_sub_path(), +cairo_append_path(), cairo_close_path(), +cairo_move_to(), cairo_line_to(), cairo_curve_to(), +cairo_rel_move_to(), cairo_rel_line_to(), cairo_rel_curve_to(), +cairo_arc(), cairo_arc_negative(), cairo_rectangle(), +cairo_text_path(), cairo_glyph_path(), cairo_stroke_to_path().

+

Some functions use and alter the current point but do not +otherwise change current path: +cairo_show_text().

+

Some functions unset the current path and as a result, current point: +cairo_fill(), cairo_stroke().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

return value for X coordinate of the current point

 

y

return value for Y coordinate of the current point

 
+
+

Since 1.0

+
+
+
+

cairo_new_path ()

+
void
+cairo_new_path (cairo_t *cr);
+

Clears the current path. After this call there will be no path and +no current point.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_new_sub_path ()

+
void
+cairo_new_sub_path (cairo_t *cr);
+

Begin a new sub-path. Note that the existing path is not +affected. After this call there will be no current point.

+

In many cases, this call is not needed since new sub-paths are +frequently started with cairo_move_to().

+

A call to cairo_new_sub_path() is particularly useful when +beginning a new sub-path with one of the cairo_arc() calls. This +makes things easier as it is no longer necessary to manually +compute the arc's initial coordinates for a call to +cairo_move_to().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.2

+
+
+
+

cairo_close_path ()

+
void
+cairo_close_path (cairo_t *cr);
+

Adds a line segment to the path from the current point to the +beginning of the current sub-path, (the most recent point passed to +cairo_move_to()), and closes this sub-path. After this call the +current point will be at the joined endpoint of the sub-path.

+

The behavior of cairo_close_path() is distinct from simply calling +cairo_line_to() with the equivalent coordinate in the case of +stroking. When a closed sub-path is stroked, there are no caps on +the ends of the sub-path. Instead, there is a line join connecting +the final and initial segments of the sub-path.

+

If there is no current point before the call to cairo_close_path(), +this function will have no effect.

+

Note: As of cairo version 1.2.4 any call to cairo_close_path() will +place an explicit MOVE_TO element into the path immediately after +the CLOSE_PATH element, (which can be seen in cairo_copy_path() for +example). This can simplify path processing in some cases as it may +not be necessary to save the "last move_to point" during processing +as the MOVE_TO immediately after the CLOSE_PATH will provide that +point.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_arc ()

+
void
+cairo_arc (cairo_t *cr,
+           double xc,
+           double yc,
+           double radius,
+           double angle1,
+           double angle2);
+

Adds a circular arc of the given radius + to the current path. The +arc is centered at (xc +, yc +), begins at angle1 + and proceeds in +the direction of increasing angles to end at angle2 +. If angle2 + is +less than angle1 + it will be progressively increased by +2*M_PI until it is greater than angle1 +.

+

If there is a current point, an initial line segment will be added +to the path to connect the current point to the beginning of the +arc. If this initial line is undesired, it can be avoided by +calling cairo_new_sub_path() before calling cairo_arc().

+

Angles are measured in radians. An angle of 0.0 is in the direction +of the positive X axis (in user space). An angle of +M_PI/2.0 radians (90 degrees) is in the +direction of the positive Y axis (in user space). Angles increase +in the direction from the positive X axis toward the positive Y +axis. So with the default transformation matrix, angles increase in +a clockwise direction.

+

(To convert from degrees to radians, use degrees * (M_PI / +180.).)

+

This function gives the arc in the direction of increasing angles; +see cairo_arc_negative() to get the arc in the direction of +decreasing angles.

+

The arc is circular in user space. To achieve an elliptical arc, +you can scale the current transformation matrix by different +amounts in the X and Y directions. For example, to draw an ellipse +in the box given by x +, y +, width +, height +:

+
+cairo_save (cr);
+cairo_translate (cr, x + width / 2., y + height / 2.);
+cairo_scale (cr, width / 2., height / 2.);
+cairo_arc (cr, 0., 0., 1., 0., 2 * M_PI);
+cairo_restore (cr);
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

xc

X position of the center of the arc

 

yc

Y position of the center of the arc

 

radius

the radius of the arc

 

angle1

the start angle, in radians

 

angle2

the end angle, in radians

 
+
+

Since 1.0

+
+
+
+

cairo_arc_negative ()

+
void
+cairo_arc_negative (cairo_t *cr,
+                    double xc,
+                    double yc,
+                    double radius,
+                    double angle1,
+                    double angle2);
+

Adds a circular arc of the given radius + to the current path. The +arc is centered at (xc +, yc +), begins at angle1 + and proceeds in +the direction of decreasing angles to end at angle2 +. If angle2 + is +greater than angle1 + it will be progressively decreased by +2*M_PI until it is less than angle1 +.

+

See cairo_arc() for more details. This function differs only in the +direction of the arc between the two angles.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

xc

X position of the center of the arc

 

yc

Y position of the center of the arc

 

radius

the radius of the arc

 

angle1

the start angle, in radians

 

angle2

the end angle, in radians

 
+
+

Since 1.0

+
+
+
+

cairo_curve_to ()

+
void
+cairo_curve_to (cairo_t *cr,
+                double x1,
+                double y1,
+                double x2,
+                double y2,
+                double x3,
+                double y3);
+

Adds a cubic Bézier spline to the path from the current point to +position (x3 +, y3 +) in user-space coordinates, using (x1 +, y1 +) and +(x2 +, y2 +) as the control points. After this call the current point +will be (x3 +, y3 +).

+

If there is no current point before the call to cairo_curve_to() +this function will behave as if preceded by a call to +cairo_move_to(cr +, x1 +, y1 +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x1

the X coordinate of the first control point

 

y1

the Y coordinate of the first control point

 

x2

the X coordinate of the second control point

 

y2

the Y coordinate of the second control point

 

x3

the X coordinate of the end of the curve

 

y3

the Y coordinate of the end of the curve

 
+
+

Since 1.0

+
+
+
+

cairo_line_to ()

+
void
+cairo_line_to (cairo_t *cr,
+               double x,
+               double y);
+

Adds a line to the path from the current point to position (x +, y +) +in user-space coordinates. After this call the current point +will be (x +, y +).

+

If there is no current point before the call to cairo_line_to() +this function will behave as cairo_move_to(cr +, x +, y +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

the X coordinate of the end of the new line

 

y

the Y coordinate of the end of the new line

 
+
+

Since 1.0

+
+
+
+

cairo_move_to ()

+
void
+cairo_move_to (cairo_t *cr,
+               double x,
+               double y);
+

Begin a new sub-path. After this call the current point will be (x +, +y +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

the X coordinate of the new position

 

y

the Y coordinate of the new position

 
+
+

Since 1.0

+
+
+
+

cairo_rectangle ()

+
void
+cairo_rectangle (cairo_t *cr,
+                 double x,
+                 double y,
+                 double width,
+                 double height);
+

Adds a closed sub-path rectangle of the given size to the current +path at position (x +, y +) in user-space coordinates.

+

This function is logically equivalent to:

+
+cairo_move_to (cr, x, y);
+cairo_rel_line_to (cr, width, 0);
+cairo_rel_line_to (cr, 0, height);
+cairo_rel_line_to (cr, -width, 0);
+cairo_close_path (cr);
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

the X coordinate of the top left corner of the rectangle

 

y

the Y coordinate to the top left corner of the rectangle

 

width

the width of the rectangle

 

height

the height of the rectangle

 
+
+

Since 1.0

+
+
+
+

cairo_glyph_path ()

+
void
+cairo_glyph_path (cairo_t *cr,
+                  const cairo_glyph_t *glyphs,
+                  int num_glyphs);
+

Adds closed paths for the glyphs to the current path. The generated +path if filled, achieves an effect similar to that of +cairo_show_glyphs().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

glyphs

array of glyphs to show

 

num_glyphs

number of glyphs to show

 
+
+

Since 1.0

+
+
+
+

cairo_text_path ()

+
void
+cairo_text_path (cairo_t *cr,
+                 const char *utf8);
+

Adds closed paths for text to the current path. The generated +path if filled, achieves an effect similar to that of +cairo_show_text().

+

Text conversion and positioning is done similar to cairo_show_text().

+

Like cairo_show_text(), After this call the current point is +moved to the origin of where the next glyph would be placed in +this same progression. That is, the current point will be at +the origin of the final glyph offset by its advance values. +This allows for chaining multiple calls to to cairo_text_path() +without having to set current point in between.

+

Note: The cairo_text_path() function call is part of what the cairo +designers call the "toy" text API. It is convenient for short demos +and simple programs, but it is not expected to be adequate for +serious text-using applications. See cairo_glyph_path() for the +"real" text path API in cairo.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

utf8

a NUL-terminated string of text encoded in UTF-8, or NULL

 
+
+

Since 1.0

+
+
+
+

cairo_rel_curve_to ()

+
void
+cairo_rel_curve_to (cairo_t *cr,
+                    double dx1,
+                    double dy1,
+                    double dx2,
+                    double dy2,
+                    double dx3,
+                    double dy3);
+

Relative-coordinate version of cairo_curve_to(). All offsets are +relative to the current point. Adds a cubic Bézier spline to the +path from the current point to a point offset from the current +point by (dx3 +, dy3 +), using points offset by (dx1 +, dy1 +) and +(dx2 +, dy2 +) as the control points. After this call the current +point will be offset by (dx3 +, dy3 +).

+

Given a current point of (x, y), cairo_rel_curve_to(cr +, dx1 +, +dy1 +, dx2 +, dy2 +, dx3 +, dy3 +) is logically equivalent to +cairo_curve_to(cr +, x+dx1 +, y+dy1 +, x+dx2 +, y+dy2 +, x+dx3 +, y+dy3 +).

+

It is an error to call this function with no current point. Doing +so will cause cr + to shutdown with a status of +CAIRO_STATUS_NO_CURRENT_POINT.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

dx1

the X offset to the first control point

 

dy1

the Y offset to the first control point

 

dx2

the X offset to the second control point

 

dy2

the Y offset to the second control point

 

dx3

the X offset to the end of the curve

 

dy3

the Y offset to the end of the curve

 
+
+

Since 1.0

+
+
+
+

cairo_rel_line_to ()

+
void
+cairo_rel_line_to (cairo_t *cr,
+                   double dx,
+                   double dy);
+

Relative-coordinate version of cairo_line_to(). Adds a line to the +path from the current point to a point that is offset from the +current point by (dx +, dy +) in user space. After this call the +current point will be offset by (dx +, dy +).

+

Given a current point of (x, y), cairo_rel_line_to(cr +, dx +, dy +) +is logically equivalent to cairo_line_to(cr +, x + dx +, y + dy +).

+

It is an error to call this function with no current point. Doing +so will cause cr + to shutdown with a status of +CAIRO_STATUS_NO_CURRENT_POINT.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

dx

the X offset to the end of the new line

 

dy

the Y offset to the end of the new line

 
+
+

Since 1.0

+
+
+
+

cairo_rel_move_to ()

+
void
+cairo_rel_move_to (cairo_t *cr,
+                   double dx,
+                   double dy);
+

Begin a new sub-path. After this call the current point will offset +by (x +, y +).

+

Given a current point of (x, y), cairo_rel_move_to(cr +, dx +, dy +) +is logically equivalent to cairo_move_to(cr +, x + dx +, y + dy +).

+

It is an error to call this function with no current point. Doing +so will cause cr + to shutdown with a status of +CAIRO_STATUS_NO_CURRENT_POINT.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

dx

the X offset

 

dy

the Y offset

 
+
+

Since 1.0

+
+
+
+

cairo_path_extents ()

+
void
+cairo_path_extents (cairo_t *cr,
+                    double *x1,
+                    double *y1,
+                    double *x2,
+                    double *y2);
+

Computes a bounding box in user-space coordinates covering the +points on the current path. If the current path is empty, returns +an empty rectangle ((0,0), (0,0)). Stroke parameters, fill rule, +surface dimensions and clipping are not taken into account.

+

Contrast with cairo_fill_extents() and cairo_stroke_extents() which +return the extents of only the area that would be "inked" by +the corresponding drawing operations.

+

The result of cairo_path_extents() is defined as equivalent to the +limit of cairo_stroke_extents() with CAIRO_LINE_CAP_ROUND as the +line width approaches 0.0, (but never reaching the empty-rectangle +returned by cairo_stroke_extents() for a line width of 0.0).

+

Specifically, this means that zero-area sub-paths such as +cairo_move_to();cairo_line_to() segments, (even degenerate cases +where the coordinates to both calls are identical), will be +considered as contributing to the extents. However, a lone +cairo_move_to() will not contribute to the results of +cairo_path_extents().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x1

left of the resulting extents

 

y1

top of the resulting extents

 

x2

right of the resulting extents

 

y2

bottom of the resulting extents

 
+
+

Since 1.6

+
+
+
+

Types and Values

+
+

cairo_path_t

+
typedef struct {
+    cairo_status_t status;
+    cairo_path_data_t *data;
+    int num_data;
+} cairo_path_t;
+
+

A data structure for holding a path. This data structure serves as +the return value for cairo_copy_path() and +cairo_copy_path_flat() as well the input value for +cairo_append_path().

+

See cairo_path_data_t for hints on how to iterate over the +actual data within the path.

+

The num_data member gives the number of elements in the data +array. This number is larger than the number of independent path +portions (defined in cairo_path_data_type_t), since the data +includes both headers and coordinates for each portion.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

cairo_status_t status;

the current error status

 

cairo_path_data_t *data;

the elements in the path

 

int num_data;

the number of elements in the data array

 
+
+

Since 1.0

+
+
+
+

union cairo_path_data_t

+

cairo_path_data_t is used to represent the path data inside a +cairo_path_t.

+

The data structure is designed to try to balance the demands of +efficiency and ease-of-use. A path is represented as an array of +cairo_path_data_t, which is a union of headers and points.

+

Each portion of the path is represented by one or more elements in +the array, (one header followed by 0 or more points). The length +value of the header is the number of array elements for the current +portion including the header, (ie. length == 1 + # of points), and +where the number of points for each element type is as follows:

+
+    %CAIRO_PATH_MOVE_TO:     1 point
+    %CAIRO_PATH_LINE_TO:     1 point
+    %CAIRO_PATH_CURVE_TO:    3 points
+    %CAIRO_PATH_CLOSE_PATH:  0 points
+
+

The semantics and ordering of the coordinate values are consistent +with cairo_move_to(), cairo_line_to(), cairo_curve_to(), and +cairo_close_path().

+

Here is sample code for iterating through a cairo_path_t:

+
+     int i;
+     cairo_path_t *path;
+     cairo_path_data_t *data;
+ 
+     path = cairo_copy_path (cr);
+ 
+     for (i=0; i < path->num_data; i += path->data[i].header.length) {
+         data = &path->data[i];
+         switch (data->header.type) {
+         case CAIRO_PATH_MOVE_TO:
+             do_move_to_things (data[1].point.x, data[1].point.y);
+             break;
+         case CAIRO_PATH_LINE_TO:
+             do_line_to_things (data[1].point.x, data[1].point.y);
+             break;
+         case CAIRO_PATH_CURVE_TO:
+             do_curve_to_things (data[1].point.x, data[1].point.y,
+                                 data[2].point.x, data[2].point.y,
+                                 data[3].point.x, data[3].point.y);
+             break;
+         case CAIRO_PATH_CLOSE_PATH:
+             do_close_path_things ();
+             break;
+         }
+     }
+     cairo_path_destroy (path);
+
+

As of cairo 1.4, cairo does not mind if there are more elements in +a portion of the path than needed. Such elements can be used by +users of the cairo API to hold extra values in the path data +structure. For this reason, it is recommended that applications +always use data->header.length to +iterate over the path data, instead of hardcoding the number of +elements for each element type.

+

Since 1.0

+
+
+
+

enum cairo_path_data_type_t

+

cairo_path_data_t is used to describe the type of one portion +of a path when represented as a cairo_path_t. +See cairo_path_data_t for details.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_PATH_MOVE_TO

+

A move-to operation, since 1.0

+
 

CAIRO_PATH_LINE_TO

+

A line-to operation, since 1.0

+
 

CAIRO_PATH_CURVE_TO

+

A curve-to operation, since 1.0

+
 

CAIRO_PATH_CLOSE_PATH

+

A close-path operation, since 1.0

+
 
+
+

Since 1.0

+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-PostScript-Surfaces.html b/doc/public/html/cairo-PostScript-Surfaces.html new file mode 100644 index 000000000..56fa361df --- /dev/null +++ b/doc/public/html/cairo-PostScript-Surfaces.html @@ -0,0 +1,707 @@ + + + + +Cairo: A Vector Graphics Library: PostScript Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

PostScript Surfaces

+

PostScript Surfaces — Rendering PostScript documents

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_ps_surface_create () +
+cairo_surface_t * + +cairo_ps_surface_create_for_stream () +
+void + +cairo_ps_surface_restrict_to_level () +
+void + +cairo_ps_get_levels () +
const char * + +cairo_ps_level_to_string () +
+void + +cairo_ps_surface_set_eps () +
+cairo_bool_t + +cairo_ps_surface_get_eps () +
+void + +cairo_ps_surface_set_size () +
+void + +cairo_ps_surface_dsc_begin_setup () +
+void + +cairo_ps_surface_dsc_begin_page_setup () +
+void + +cairo_ps_surface_dsc_comment () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineCAIRO_HAS_PS_SURFACE
enumcairo_ps_level_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The PostScript surface is used to render cairo graphics to Adobe +PostScript files and is a multi-page vector surface backend.

+
+
+

Functions

+
+

cairo_ps_surface_create ()

+
cairo_surface_t *
+cairo_ps_surface_create (const char *filename,
+                         double width_in_points,
+                         double height_in_points);
+

Creates a PostScript surface of the specified size in points to be +written to filename +. See cairo_ps_surface_create_for_stream() for +a more flexible mechanism for handling the PostScript output than +simply writing it to a named file.

+

Note that the size of individual pages of the PostScript output can +vary. See cairo_ps_surface_set_size().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

filename

a filename for the PS output (must be writable), NULL may be +used to specify no output. This will generate a PS surface that +may be queried and used as a source, without generating a +temporary file.

 

width_in_points

width of the surface, in points (1 point == 1/72.0 inch)

 

height_in_points

height of the surface, in points (1 point == 1/72.0 inch)

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.2

+
+
+
+

cairo_ps_surface_create_for_stream ()

+
cairo_surface_t *
+cairo_ps_surface_create_for_stream (cairo_write_func_t write_func,
+                                    void *closure,
+                                    double width_in_points,
+                                    double height_in_points);
+

Creates a PostScript surface of the specified size in points to be +written incrementally to the stream represented by write_func + and +closure +. See cairo_ps_surface_create() for a more convenient way +to simply direct the PostScript output to a named file.

+

Note that the size of individual pages of the PostScript +output can vary. See cairo_ps_surface_set_size().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

write_func

a cairo_write_func_t to accept the output data, may be NULL +to indicate a no-op write_func +. With a no-op write_func +, +the surface may be queried or used as a source without +generating any temporary files.

 

closure

the closure argument for write_func +

 

width_in_points

width of the surface, in points (1 point == 1/72.0 inch)

 

height_in_points

height of the surface, in points (1 point == 1/72.0 inch)

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.2

+
+
+
+

cairo_ps_surface_restrict_to_level ()

+
void
+cairo_ps_surface_restrict_to_level (cairo_surface_t *surface,
+                                    cairo_ps_level_t level);
+

Restricts the generated PostSript file to level +. See +cairo_ps_get_levels() for a list of available level values that +can be used here.

+

This function should only be called before any drawing operations +have been performed on the given surface. The simplest way to do +this is to call this function immediately after creating the +surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a PostScript cairo_surface_t

 

level

PostScript level

 
+
+

Since 1.6

+
+
+
+

cairo_ps_get_levels ()

+
void
+cairo_ps_get_levels (cairo_ps_level_t const **levels,
+                     int *num_levels);
+

Used to retrieve the list of supported levels. See +cairo_ps_surface_restrict_to_level().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

levels

supported level list

 

num_levels

list length

 
+
+

Since 1.6

+
+
+
+

cairo_ps_level_to_string ()

+
const char *
+cairo_ps_level_to_string (cairo_ps_level_t level);
+

Get the string representation of the given level + id. This function +will return NULL if level + id isn't valid. See cairo_ps_get_levels() +for a way to get the list of valid level ids.

+
+

Parameters

+
+++++ + + + + + +

level

a level id

 
+
+
+

Returns

+

the string associated to given level.

+

+
+

Since 1.6

+
+
+
+

cairo_ps_surface_set_eps ()

+
void
+cairo_ps_surface_set_eps (cairo_surface_t *surface,
+                          cairo_bool_t eps);
+

If eps + is TRUE, the PostScript surface will output Encapsulated +PostScript.

+

This function should only be called before any drawing operations +have been performed on the current page. The simplest way to do +this is to call this function immediately after creating the +surface. An Encapsulated PostScript file should never contain more +than one page.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a PostScript cairo_surface_t

 

eps

TRUE to output EPS format PostScript

 
+
+

Since 1.6

+
+
+
+

cairo_ps_surface_get_eps ()

+
cairo_bool_t
+cairo_ps_surface_get_eps (cairo_surface_t *surface);
+

Check whether the PostScript surface will output Encapsulated PostScript.

+
+

Parameters

+
+++++ + + + + + +

surface

a PostScript cairo_surface_t

 
+
+
+

Returns

+

TRUE if the surface will output Encapsulated PostScript.

+

+
+

Since 1.6

+
+
+
+

cairo_ps_surface_set_size ()

+
void
+cairo_ps_surface_set_size (cairo_surface_t *surface,
+                           double width_in_points,
+                           double height_in_points);
+

Changes the size of a PostScript surface for the current (and +subsequent) pages.

+

This function should only be called before any drawing operations +have been performed on the current page. The simplest way to do +this is to call this function immediately after creating the +surface or immediately after completing a page with either +cairo_show_page() or cairo_copy_page().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a PostScript cairo_surface_t

 

width_in_points

new surface width, in points (1 point == 1/72.0 inch)

 

height_in_points

new surface height, in points (1 point == 1/72.0 inch)

 
+
+

Since 1.2

+
+
+
+

cairo_ps_surface_dsc_begin_setup ()

+
void
+cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface);
+

This function indicates that subsequent calls to +cairo_ps_surface_dsc_comment() should direct comments to the Setup +section of the PostScript output.

+

This function should be called at most once per surface, and must +be called before any call to cairo_ps_surface_dsc_begin_page_setup() +and before any drawing is performed to the surface.

+

See cairo_ps_surface_dsc_comment() for more details.

+
+

Parameters

+
+++++ + + + + + +

surface

a PostScript cairo_surface_t

 
+
+

Since 1.2

+
+
+
+

cairo_ps_surface_dsc_begin_page_setup ()

+
void
+cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface);
+

This function indicates that subsequent calls to +cairo_ps_surface_dsc_comment() should direct comments to the +PageSetup section of the PostScript output.

+

This function call is only needed for the first page of a +surface. It should be called after any call to +cairo_ps_surface_dsc_begin_setup() and before any drawing is +performed to the surface.

+

See cairo_ps_surface_dsc_comment() for more details.

+
+

Parameters

+
+++++ + + + + + +

surface

a PostScript cairo_surface_t

 
+
+

Since 1.2

+
+
+
+

cairo_ps_surface_dsc_comment ()

+
void
+cairo_ps_surface_dsc_comment (cairo_surface_t *surface,
+                              const char *comment);
+

Emit a comment into the PostScript output for the given surface.

+

The comment is expected to conform to the PostScript Language +Document Structuring Conventions (DSC). Please see that manual for +details on the available comments and their meanings. In +particular, the %%IncludeFeature comment allows a +device-independent means of controlling printer device features. So +the PostScript Printer Description Files Specification will also be +a useful reference.

+

The comment string must begin with a percent character (%) and the +total length of the string (including any initial percent +characters) must not exceed 255 characters. Violating either of +these conditions will place surface + into an error state. But +beyond these two conditions, this function will not enforce +conformance of the comment with any particular specification.

+

The comment string should not have a trailing newline.

+

The DSC specifies different sections in which particular comments +can appear. This function provides for comments to be emitted +within three sections: the header, the Setup section, and the +PageSetup section. Comments appearing in the first two sections +apply to the entire document while comments in the BeginPageSetup +section apply only to a single page.

+

For comments to appear in the header section, this function should +be called after the surface is created, but before a call to +cairo_ps_surface_dsc_begin_setup().

+

For comments to appear in the Setup section, this function should +be called after a call to cairo_ps_surface_dsc_begin_setup() but +before a call to cairo_ps_surface_dsc_begin_page_setup().

+

For comments to appear in the PageSetup section, this function +should be called after a call to +cairo_ps_surface_dsc_begin_page_setup().

+

Note that it is only necessary to call +cairo_ps_surface_dsc_begin_page_setup() for the first page of any +surface. After a call to cairo_show_page() or cairo_copy_page() +comments are unambiguously directed to the PageSetup section of the +current page. But it doesn't hurt to call this function at the +beginning of every page as that consistency may make the calling +code simpler.

+

As a final note, cairo automatically generates several comments on +its own. As such, applications must not manually generate any of +the following comments:

+

Header section: %!PS-Adobe-3.0, %%Creator, %%CreationDate, %%Pages, +%%BoundingBox, %%DocumentData, %%LanguageLevel, %%EndComments.

+

Setup section: %%BeginSetup, %%EndSetup

+

PageSetup section: %%BeginPageSetup, %%PageBoundingBox, %%EndPageSetup.

+

Other sections: %%BeginProlog, %%EndProlog, %%Page, %%Trailer, %%EOF

+

Here is an example sequence showing how this function might be used:

+
+cairo_surface_t *surface = cairo_ps_surface_create (filename, width, height);
+...
+cairo_ps_surface_dsc_comment (surface, "%%Title: My excellent document");
+cairo_ps_surface_dsc_comment (surface, "%%Copyright: Copyright (C) 2006 Cairo Lover")
+...
+cairo_ps_surface_dsc_begin_setup (surface);
+cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor White");
+...
+cairo_ps_surface_dsc_begin_page_setup (surface);
+cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A3");
+cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *InputSlot LargeCapacity");
+cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaType Glossy");
+cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor Blue");
+... draw to first page here ..
+cairo_show_page (cr);
+...
+cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A5");
+...
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a PostScript cairo_surface_t

 

comment

a comment string to be emitted into the PostScript output

 
+
+

Since 1.2

+
+
+
+

Types and Values

+
+

CAIRO_HAS_PS_SURFACE

+
#define CAIRO_HAS_PS_SURFACE 1
+
+

Defined if the PostScript surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.2

+
+
+
+

enum cairo_ps_level_t

+

cairo_ps_level_t is used to describe the language level of the +PostScript Language Reference that a generated PostScript file will +conform to.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_PS_LEVEL_2

+

The language level 2 of the PostScript specification. (Since 1.6)

+
 

CAIRO_PS_LEVEL_3

+

The language level 3 of the PostScript specification. (Since 1.6)

+
 
+
+

Since 1.6

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Quartz-(CGFont)-Fonts.html b/doc/public/html/cairo-Quartz-(CGFont)-Fonts.html new file mode 100644 index 000000000..36e48d751 --- /dev/null +++ b/doc/public/html/cairo-Quartz-(CGFont)-Fonts.html @@ -0,0 +1,172 @@ + + + + +Cairo: A Vector Graphics Library: Quartz (CGFont) Fonts + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Quartz (CGFont) Fonts

+

Quartz (CGFont) Fonts — Font support via CGFont on OS X

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_QUARTZ_FONT
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The Quartz font backend is primarily used to render text on Apple +MacOS X systems. The CGFont API is used for the internal +implementation of the font backend methods.

+
+
+

Functions

+
+

cairo_quartz_font_face_create_for_cgfont ()

+
cairo_font_face_t *
+cairo_quartz_font_face_create_for_cgfont
+                               (CGFontRef font);
+

Creates a new font for the Quartz font backend based on a +CGFontRef. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create().

+
+

Parameters

+
+++++ + + + + + +

font

a CGFontRef obtained through a method external to cairo.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.6

+
+
+
+

cairo_quartz_font_face_create_for_atsu_font_id ()

+
cairo_font_face_t *
+cairo_quartz_font_face_create_for_atsu_font_id
+                               (ATSUFontID font_id);
+

Creates a new font for the Quartz font backend based on an +ATSUFontID. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create().

+
+

Parameters

+
+++++ + + + + + +

font_id

an ATSUFontID for the font.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.6

+
+
+
+

Types and Values

+
+

CAIRO_HAS_QUARTZ_FONT

+
#define CAIRO_HAS_QUARTZ_FONT 1
+
+

Defined if the Quartz font backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.6

+
+
+
+

See Also

+

cairo_font_face_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Quartz-Surfaces.html b/doc/public/html/cairo-Quartz-Surfaces.html new file mode 100644 index 000000000..a60f2555b --- /dev/null +++ b/doc/public/html/cairo-Quartz-Surfaces.html @@ -0,0 +1,250 @@ + + + + +Cairo: A Vector Graphics Library: Quartz Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Quartz Surfaces

+

Quartz Surfaces — Rendering to Quartz surfaces

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_quartz_surface_create () +
+cairo_surface_t * + +cairo_quartz_surface_create_for_cg_context () +
+CGContextRef + +cairo_quartz_surface_get_cg_context () +
+
+
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_QUARTZ_SURFACE
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The Quartz surface is used to render cairo graphics targeting the +Apple OS X Quartz rendering system.

+
+
+

Functions

+
+

cairo_quartz_surface_create ()

+
cairo_surface_t *
+cairo_quartz_surface_create (cairo_format_t format,
+                             unsigned int width,
+                             unsigned int height);
+

Creates a Quartz surface backed by a CGBitmap. The surface is +created using the Device RGB (or Device Gray, for A8) color space. +All Cairo operations, including those that require software +rendering, will succeed on this surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

format

format of pixels in the surface to create

 

width

width of the surface, in pixels

 

height

height of the surface, in pixels

 
+
+
+

Returns

+

the newly created surface.

+

+
+

Since 1.6

+
+
+
+

cairo_quartz_surface_create_for_cg_context ()

+
cairo_surface_t *
+cairo_quartz_surface_create_for_cg_context
+                               (CGContextRef cgContext,
+                                unsigned int width,
+                                unsigned int height);
+

Creates a Quartz surface that wraps the given CGContext. The +CGContext is assumed to be in the standard Cairo coordinate space +(that is, with the origin at the upper left and the Y axis +increasing downward). If the CGContext is in the Quartz coordinate +space (with the origin at the bottom left), then it should be +flipped before this function is called. The flip can be accomplished +using a translate and a scale; for example:

+
+CGContextTranslateCTM (cgContext, 0.0, height);
+CGContextScaleCTM (cgContext, 1.0, -1.0);
+
+

All Cairo operations are implemented in terms of Quartz operations, +as long as Quartz-compatible elements are used (such as Quartz fonts).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cgContext

the existing CGContext for which to create the surface

 

width

width of the surface, in pixels

 

height

height of the surface, in pixels

 
+
+
+

Returns

+

the newly created Cairo surface.

+

+
+

Since 1.6

+
+
+
+

cairo_quartz_surface_get_cg_context ()

+
CGContextRef
+cairo_quartz_surface_get_cg_context (cairo_surface_t *surface);
+

Returns the CGContextRef that the given Quartz surface is backed +by.

+

A call to cairo_surface_flush() is required before using the +CGContextRef to ensure that all pending drawing operations are +finished and to restore any temporary modification cairo has made +to its state. A call to cairo_surface_mark_dirty() is required +after the state or the content of the CGContextRef has been +modified.

+
+

Parameters

+
+++++ + + + + + +

surface

the Cairo Quartz surface

 
+
+
+

Returns

+

the CGContextRef for the given surface.

+

+
+

Since 1.6

+
+
+
+

Types and Values

+
+

CAIRO_HAS_QUARTZ_SURFACE

+
#define CAIRO_HAS_QUARTZ_SURFACE 1
+
+

Defined if the Quartz surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.6

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Raster-Sources.html b/doc/public/html/cairo-Raster-Sources.html new file mode 100644 index 000000000..a754813ef --- /dev/null +++ b/doc/public/html/cairo-Raster-Sources.html @@ -0,0 +1,809 @@ + + + + +Cairo: A Vector Graphics Library: Raster Sources + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Raster Sources

+

Raster Sources — Supplying arbitrary image data

+
+ +
+

Object Hierarchy

+
+
+
+
+

Description

+

The raster source provides the ability to supply arbitrary pixel data +whilst rendering. The pixels are queried at the time of rasterisation +by means of user callback functions, allowing for the ultimate +flexibility. For example, in handling compressed image sources, you +may keep a MRU cache of decompressed images and decompress sources on the +fly and discard old ones to conserve memory.

+

For the raster source to be effective, you must at least specify +the acquire and release callbacks which are used to retrieve the pixel +data for the region of interest and demark when it can be freed afterwards. +Other callbacks are provided for when the pattern is copied temporarily +during rasterisation, or more permanently as a snapshot in order to keep +the pixel data available for printing.

+
+
+

Functions

+
+

cairo_pattern_create_raster_source ()

+
cairo_pattern_t *
+cairo_pattern_create_raster_source (void *user_data,
+                                    cairo_content_t content,
+                                    int width,
+                                    int height);
+

Creates a new user pattern for providing pixel data.

+

Use the setter functions to associate callbacks with the returned +pattern. The only mandatory callback is acquire.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

user_data

the user data to be passed to all callbacks

 

content

content type for the pixel data that will be returned. Knowing +the content type ahead of time is used for analysing the operation and +picking the appropriate rendering path.

 

width

maximum size of the sample area

 

height

maximum size of the sample area

 
+
+
+

Returns

+

a newly created cairo_pattern_t. Free with +cairo_pattern_destroy() when you are done using it.

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_set_callback_data ()

+
void
+cairo_raster_source_pattern_set_callback_data
+                               (cairo_pattern_t *pattern,
+                                void *data);
+

Updates the user data that is provided to all callbacks.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

the pattern to update

 

data

the user data to be passed to all callbacks

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_get_callback_data ()

+
void *
+cairo_raster_source_pattern_get_callback_data
+                               (cairo_pattern_t *pattern);
+

Queries the current user data.

+
+

Parameters

+
+++++ + + + + + +

pattern

the pattern to update

 
+
+
+

Returns

+

the current user-data passed to each callback

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_set_acquire ()

+
void
+cairo_raster_source_pattern_set_acquire
+                               (cairo_pattern_t *pattern,
+                                cairo_raster_source_acquire_func_t acquire,
+                                cairo_raster_source_release_func_t release);
+

Specifies the callbacks used to generate the image surface for a rendering +operation (acquire) and the function used to cleanup that surface afterwards.

+

The acquire + callback should create a surface (preferably an image +surface created to match the target using +cairo_surface_create_similar_image()) that defines at least the region +of interest specified by extents. The surface is allowed to be the entire +sample area, but if it does contain a subsection of the sample area, +the surface extents should be provided by setting the device offset (along +with its width and height) using cairo_surface_set_device_offset().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

pattern

the pattern to update

 

acquire

acquire callback

 

release

release callback

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_get_acquire ()

+
void
+cairo_raster_source_pattern_get_acquire
+                               (cairo_pattern_t *pattern,
+                                cairo_raster_source_acquire_func_t *acquire,
+                                cairo_raster_source_release_func_t *release);
+

Queries the current acquire and release callbacks.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

pattern

the pattern to query

 

acquire

return value for the current acquire callback

 

release

return value for the current release callback

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_set_snapshot ()

+
void
+cairo_raster_source_pattern_set_snapshot
+                               (cairo_pattern_t *pattern,
+                                cairo_raster_source_snapshot_func_t snapshot);
+

Sets the callback that will be used whenever a snapshot is taken of the +pattern, that is whenever the current contents of the pattern should be +preserved for later use. This is typically invoked whilst printing.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

the pattern to update

 

snapshot

snapshot callback

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_get_snapshot ()

+
cairo_raster_source_snapshot_func_t
+cairo_raster_source_pattern_get_snapshot
+                               (cairo_pattern_t *pattern);
+

Queries the current snapshot callback.

+
+

Parameters

+
+++++ + + + + + +

pattern

the pattern to query

 
+
+
+

Returns

+

the current snapshot callback

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_set_copy ()

+
void
+cairo_raster_source_pattern_set_copy (cairo_pattern_t *pattern,
+                                      cairo_raster_source_copy_func_t copy);
+

Updates the copy callback which is used whenever a temporary copy of the +pattern is taken.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

the pattern to update

 

copy

the copy callback

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_get_copy ()

+
cairo_raster_source_copy_func_t
+cairo_raster_source_pattern_get_copy (cairo_pattern_t *pattern);
+

Queries the current copy callback.

+
+

Parameters

+
+++++ + + + + + +

pattern

the pattern to query

 
+
+
+

Returns

+

the current copy callback

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_set_finish ()

+
void
+cairo_raster_source_pattern_set_finish
+                               (cairo_pattern_t *pattern,
+                                cairo_raster_source_finish_func_t finish);
+

Updates the finish callback which is used whenever a pattern (or a copy +thereof) will no longer be used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

the pattern to update

 

finish

the finish callback

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_pattern_get_finish ()

+
cairo_raster_source_finish_func_t
+cairo_raster_source_pattern_get_finish
+                               (cairo_pattern_t *pattern);
+

Queries the current finish callback.

+
+

Parameters

+
+++++ + + + + + +

pattern

the pattern to query

 
+
+
+

Returns

+

the current finish callback

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_acquire_func_t ()

+
cairo_surface_t
+(*cairo_raster_source_acquire_func_t) (cairo_pattern_t *pattern,
+                                       void *callback_data,
+                                       cairo_surface_t *target,
+                                       const cairo_rectangle_int_t *extents);
+

cairo_raster_source_acquire_func_t is the type of function which is +called when a pattern is being rendered from. It should create a surface +that provides the pixel data for the region of interest as defined by +extents, though the surface itself does not have to be limited to that +area. For convenience the surface should probably be of image type, +created with cairo_surface_create_similar_image() for the target (which +enables the number of copies to be reduced during transfer to the +device). Another option, might be to return a similar surface to the +target for explicit handling by the application of a set of cached sources +on the device. The region of sample data provided should be defined using +cairo_surface_set_device_offset() to specify the top-left corner of the +sample data (along with width and height of the surface).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

pattern

the pattern being rendered from

 

callback_data

the user data supplied during creation

 

target

the rendering target surface

 

extents

rectangular region of interest in pixels in sample space

 
+
+
+

Returns

+

a cairo_surface_t

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_release_func_t ()

+
void
+(*cairo_raster_source_release_func_t) (cairo_pattern_t *pattern,
+                                       void *callback_data,
+                                       cairo_surface_t *surface);
+

cairo_raster_source_release_func_t is the type of function which is +called when the pixel data is no longer being access by the pattern +for the rendering operation. Typically this function will simply +destroy the surface created during acquire.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

pattern

the pattern being rendered from

 

callback_data

the user data supplied during creation

 

surface

the surface created during acquire

 
+
+

Since 1.12

+
+
+
+

cairo_raster_source_snapshot_func_t ()

+
cairo_status_t
+(*cairo_raster_source_snapshot_func_t)
+                               (cairo_pattern_t *pattern,
+                                void *callback_data);
+

cairo_raster_source_snapshot_func_t is the type of function which is +called when the pixel data needs to be preserved for later use +during printing. This pattern will be accessed again later, and it +is expected to provide the pixel data that was current at the time +of snapshotting.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

the pattern being rendered from

 

callback_data

the user data supplied during creation

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS on success, or one of the +cairo_status_t error codes for failure.

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_copy_func_t ()

+
cairo_status_t
+(*cairo_raster_source_copy_func_t) (cairo_pattern_t *pattern,
+                                    void *callback_data,
+                                    const cairo_pattern_t *other);
+

cairo_raster_source_copy_func_t is the type of function which is +called when the pattern gets copied as a normal part of rendering.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

pattern

the cairo_pattern_t that was copied to

 

callback_data

the user data supplied during creation

 

other

the cairo_pattern_t being used as the source for the copy

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS on success, or one of the +cairo_status_t error codes for failure.

+

+
+

Since 1.12

+
+
+
+

cairo_raster_source_finish_func_t ()

+
void
+(*cairo_raster_source_finish_func_t) (cairo_pattern_t *pattern,
+                                      void *callback_data);
+

cairo_raster_source_finish_func_t is the type of function which is +called when the pattern (or a copy thereof) is no longer required.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

the pattern being rendered from

 

callback_data

the user data supplied during creation

 
+
+

Since 1.12

+
+
+
+

Types and Values

+
+
+

See Also

+

cairo_pattern_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Recording-Surfaces.html b/doc/public/html/cairo-Recording-Surfaces.html new file mode 100644 index 000000000..6a29afb23 --- /dev/null +++ b/doc/public/html/cairo-Recording-Surfaces.html @@ -0,0 +1,275 @@ + + + + +Cairo: A Vector Graphics Library: Recording Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Recording Surfaces

+

Recording Surfaces — Records all drawing operations

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_recording_surface_create () +
+void + +cairo_recording_surface_ink_extents () +
+cairo_bool_t + +cairo_recording_surface_get_extents () +
+
+
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_RECORDING_SURFACE
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

A recording surface is a surface that records all drawing operations at +the highest level of the surface backend interface, (that is, the +level of paint, mask, stroke, fill, and show_text_glyphs). The recording +surface can then be "replayed" against any target surface by using it +as a source surface.

+

If you want to replay a surface so that the results in target will be +identical to the results that would have been obtained if the original +operations applied to the recording surface had instead been applied to the +target surface, you can use code like this:

+
+cairo_t *cr;
+
+cr = cairo_create (target);
+cairo_set_source_surface (cr, recording_surface, 0.0, 0.0);
+cairo_paint (cr);
+cairo_destroy (cr);
+
+

A recording surface is logically unbounded, i.e. it has no implicit constraint +on the size of the drawing surface. However, in practice this is rarely +useful as you wish to replay against a particular target surface with +known bounds. For this case, it is more efficient to specify the target +extents to the recording surface upon creation.

+

The recording phase of the recording surface is careful to snapshot all +necessary objects (paths, patterns, etc.), in order to achieve +accurate replay. The efficiency of the recording surface could be +improved by improving the implementation of snapshot for the +various objects. For example, it would be nice to have a +copy-on-write implementation for _cairo_surface_snapshot.

+
+
+

Functions

+
+

cairo_recording_surface_create ()

+
cairo_surface_t *
+cairo_recording_surface_create (cairo_content_t content,
+                                const cairo_rectangle_t *extents);
+

Creates a recording-surface which can be used to record all drawing operations +at the highest level (that is, the level of paint, mask, stroke, fill +and show_text_glyphs). The recording surface can then be "replayed" against +any target surface by using it as a source to drawing operations.

+

The recording phase of the recording surface is careful to snapshot all +necessary objects (paths, patterns, etc.), in order to achieve +accurate replay.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

content

the content of the recording surface

 

extents

the extents to record in pixels, can be NULL to record +unbounded operations.

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

+
+

Since 1.10

+
+
+
+

cairo_recording_surface_ink_extents ()

+
void
+cairo_recording_surface_ink_extents (cairo_surface_t *surface,
+                                     double *x0,
+                                     double *y0,
+                                     double *width,
+                                     double *height);
+

Measures the extents of the operations stored within the recording-surface. +This is useful to compute the required size of an image surface (or +equivalent) into which to replay the full sequence of drawing operations.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_recording_surface_t

 

x0

the x-coordinate of the top-left of the ink bounding box

 

y0

the y-coordinate of the top-left of the ink bounding box

 

width

the width of the ink bounding box

 

height

the height of the ink bounding box

 
+
+

Since 1.10

+
+
+
+

cairo_recording_surface_get_extents ()

+
cairo_bool_t
+cairo_recording_surface_get_extents (cairo_surface_t *surface,
+                                     cairo_rectangle_t *extents);
+

Get the extents of the recording-surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a cairo_recording_surface_t

 

extents

the cairo_rectangle_t to be assigned the extents

 
+
+
+

Returns

+

TRUE if the surface is bounded, of recording type, and +not in an error state, otherwise FALSE

+

+
+

Since 1.12

+
+
+
+

Types and Values

+
+

CAIRO_HAS_RECORDING_SURFACE

+
#define CAIRO_HAS_RECORDING_SURFACE 1
+
+

Defined if the recording surface backend is available. +The recording surface backend is always built in. +This macro was added for completeness in cairo 1.10.

+

Since 1.10

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Regions.html b/doc/public/html/cairo-Regions.html new file mode 100644 index 000000000..48b305702 --- /dev/null +++ b/doc/public/html/cairo-Regions.html @@ -0,0 +1,1159 @@ + + + + +Cairo: A Vector Graphics Library: Regions + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Regions

+

Regions — Representing a pixel-aligned area

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_region_t * + +cairo_region_create () +
+cairo_region_t * + +cairo_region_create_rectangle () +
+cairo_region_t * + +cairo_region_create_rectangles () +
+cairo_region_t * + +cairo_region_copy () +
+cairo_region_t * + +cairo_region_reference () +
+void + +cairo_region_destroy () +
+cairo_status_t + +cairo_region_status () +
+void + +cairo_region_get_extents () +
+int + +cairo_region_num_rectangles () +
+void + +cairo_region_get_rectangle () +
+cairo_bool_t + +cairo_region_is_empty () +
+cairo_bool_t + +cairo_region_contains_point () +
+cairo_region_overlap_t + +cairo_region_contains_rectangle () +
+cairo_bool_t + +cairo_region_equal () +
+void + +cairo_region_translate () +
+cairo_status_t + +cairo_region_intersect () +
+cairo_status_t + +cairo_region_intersect_rectangle () +
+cairo_status_t + +cairo_region_subtract () +
+cairo_status_t + +cairo_region_subtract_rectangle () +
+cairo_status_t + +cairo_region_union () +
+cairo_status_t + +cairo_region_union_rectangle () +
+cairo_status_t + +cairo_region_xor () +
+cairo_status_t + +cairo_region_xor_rectangle () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
typedefcairo_region_t
enumcairo_region_overlap_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

Regions are a simple graphical data type representing an area of +integer-aligned rectangles. They are often used on raster surfaces +to track areas of interest, such as change or clip areas.

+
+
+

Functions

+
+

cairo_region_create ()

+
cairo_region_t *
+cairo_region_create (void);
+

Allocates a new empty region object.

+
+

Returns

+

A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status().

+

+
+

Since 1.10

+
+
+
+

cairo_region_create_rectangle ()

+
cairo_region_t *
+cairo_region_create_rectangle (const cairo_rectangle_int_t *rectangle);
+

Allocates a new region object containing rectangle +.

+
+

Parameters

+
+++++ + + + + + +

rectangle

a cairo_rectangle_int_t

 
+
+
+

Returns

+

A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status().

+

+
+

Since 1.10

+
+
+
+

cairo_region_create_rectangles ()

+
cairo_region_t *
+cairo_region_create_rectangles (const cairo_rectangle_int_t *rects,
+                                int count);
+

Allocates a new region object containing the union of all given rects +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

rects

an array of count +rectangles

 

count

number of rectangles

 
+
+
+

Returns

+

A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status().

+

+
+

Since 1.10

+
+
+
+

cairo_region_copy ()

+
cairo_region_t *
+cairo_region_copy (const cairo_region_t *original);
+

Allocates a new region object copying the area from original +.

+
+

Parameters

+
+++++ + + + + + +

original

a cairo_region_t

 
+
+
+

Returns

+

A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status().

+

+
+

Since 1.10

+
+
+
+

cairo_region_reference ()

+
cairo_region_t *
+cairo_region_reference (cairo_region_t *region);
+

Increases the reference count on region + by one. This prevents +region + from being destroyed until a matching call to +cairo_region_destroy() is made.

+
+

Parameters

+
+++++ + + + + + +

region

a cairo_region_t

 
+
+
+

Returns

+

the referenced cairo_region_t.

+

+
+

Since 1.10

+
+
+
+

cairo_region_destroy ()

+
void
+cairo_region_destroy (cairo_region_t *region);
+

Destroys a cairo_region_t object created with +cairo_region_create(), cairo_region_copy(), or +or cairo_region_create_rectangle().

+
+

Parameters

+
+++++ + + + + + +

region

a cairo_region_t

 
+
+

Since 1.10

+
+
+
+

cairo_region_status ()

+
cairo_status_t
+cairo_region_status (const cairo_region_t *region);
+

Checks whether an error has previous occurred for this +region object.

+
+

Parameters

+
+++++ + + + + + +

region

a cairo_region_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_get_extents ()

+
void
+cairo_region_get_extents (const cairo_region_t *region,
+                          cairo_rectangle_int_t *extents);
+

Gets the bounding rectangle of region + as a cairo_rectangle_int_t

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

region

a cairo_region_t

 

extents

rectangle into which to store the extents

 
+
+

Since 1.10

+
+
+
+

cairo_region_num_rectangles ()

+
int
+cairo_region_num_rectangles (const cairo_region_t *region);
+

Returns the number of rectangles contained in region +.

+
+

Parameters

+
+++++ + + + + + +

region

a cairo_region_t

 
+
+
+

Returns

+

The number of rectangles contained in region +.

+

+
+

Since 1.10

+
+
+
+

cairo_region_get_rectangle ()

+
void
+cairo_region_get_rectangle (const cairo_region_t *region,
+                            int nth,
+                            cairo_rectangle_int_t *rectangle);
+

Stores the nth + rectangle from the region in rectangle +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

region

a cairo_region_t

 

nth

a number indicating which rectangle should be returned

 

rectangle

return location for a cairo_rectangle_int_t

 
+
+

Since 1.10

+
+
+
+

cairo_region_is_empty ()

+
cairo_bool_t
+cairo_region_is_empty (const cairo_region_t *region);
+

Checks whether region + is empty.

+
+

Parameters

+
+++++ + + + + + +

region

a cairo_region_t

 
+
+
+

Returns

+

TRUE if region +is empty, FALSE if it isn't.

+

+
+

Since 1.10

+
+
+
+

cairo_region_contains_point ()

+
cairo_bool_t
+cairo_region_contains_point (const cairo_region_t *region,
+                             int x,
+                             int y);
+

Checks whether (x +, y +) is contained in region +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

region

a cairo_region_t

 

x

the x coordinate of a point

 

y

the y coordinate of a point

 
+
+
+

Returns

+

TRUE if (x +, y +) is contained in region +, FALSE if it is not.

+

+
+

Since 1.10

+
+
+
+

cairo_region_contains_rectangle ()

+
cairo_region_overlap_t
+cairo_region_contains_rectangle (const cairo_region_t *region,
+                                 const cairo_rectangle_int_t *rectangle);
+

Checks whether rectangle + is inside, outside or partially contained +in region +

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

region

a cairo_region_t

 

rectangle

a cairo_rectangle_int_t

 
+
+
+

Returns

+

CAIRO_REGION_OVERLAP_IN if rectangle +is entirely inside region +, +CAIRO_REGION_OVERLAP_OUT if rectangle +is entirely outside region +, or +CAIRO_REGION_OVERLAP_PART if rectangle +is partially inside and partially outside region +.

+

+
+

Since 1.10

+
+
+
+

cairo_region_equal ()

+
cairo_bool_t
+cairo_region_equal (const cairo_region_t *a,
+                    const cairo_region_t *b);
+

Compares whether region_a is equivalent to region_b. NULL as an argument +is equal to itself, but not to any non-NULL region.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

a

a cairo_region_t or NULL

 

b

a cairo_region_t or NULL

 
+
+
+

Returns

+

TRUE if both regions contained the same coverage, +FALSE if it is not or any region is in an error status.

+

+
+

Since 1.10

+
+
+
+

cairo_region_translate ()

+
void
+cairo_region_translate (cairo_region_t *region,
+                        int dx,
+                        int dy);
+

Translates region + by (dx +, dy +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

region

a cairo_region_t

 

dx

Amount to translate in the x direction

 

dy

Amount to translate in the y direction

 
+
+

Since 1.10

+
+
+
+

cairo_region_intersect ()

+
cairo_status_t
+cairo_region_intersect (cairo_region_t *dst,
+                        const cairo_region_t *other);
+

Computes the intersection of dst + with other + and places the result in dst +

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

other

another cairo_region_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_intersect_rectangle ()

+
cairo_status_t
+cairo_region_intersect_rectangle (cairo_region_t *dst,
+                                  const cairo_rectangle_int_t *rectangle);
+

Computes the intersection of dst + with rectangle + and places the +result in dst +

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

rectangle

a cairo_rectangle_int_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_subtract ()

+
cairo_status_t
+cairo_region_subtract (cairo_region_t *dst,
+                       const cairo_region_t *other);
+

Subtracts other + from dst + and places the result in dst +

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

other

another cairo_region_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_subtract_rectangle ()

+
cairo_status_t
+cairo_region_subtract_rectangle (cairo_region_t *dst,
+                                 const cairo_rectangle_int_t *rectangle);
+

Subtracts rectangle + from dst + and places the result in dst +

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

rectangle

a cairo_rectangle_int_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_union ()

+
cairo_status_t
+cairo_region_union (cairo_region_t *dst,
+                    const cairo_region_t *other);
+

Computes the union of dst + with other + and places the result in dst +

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

other

another cairo_region_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_union_rectangle ()

+
cairo_status_t
+cairo_region_union_rectangle (cairo_region_t *dst,
+                              const cairo_rectangle_int_t *rectangle);
+

Computes the union of dst + with rectangle + and places the result in dst +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

rectangle

a cairo_rectangle_int_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_xor ()

+
cairo_status_t
+cairo_region_xor (cairo_region_t *dst,
+                  const cairo_region_t *other);
+

Computes the exclusive difference of dst + with other + and places the +result in dst +. That is, dst + will be set to contain all areas that +are either in dst + or in other +, but not in both.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

other

another cairo_region_t

 
+
+ +

Since 1.10

+
+
+
+

cairo_region_xor_rectangle ()

+
cairo_status_t
+cairo_region_xor_rectangle (cairo_region_t *dst,
+                            const cairo_rectangle_int_t *rectangle);
+

Computes the exclusive difference of dst + with rectangle + and places the +result in dst +. That is, dst + will be set to contain all areas that are +either in dst + or in rectangle +, but not in both.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

dst

a cairo_region_t

 

rectangle

a cairo_rectangle_int_t

 
+
+ +

Since 1.10

+
+
+
+

Types and Values

+
+

cairo_region_t

+
typedef struct _cairo_region cairo_region_t;
+
+

A cairo_region_t represents a set of integer-aligned rectangles.

+

It allows set-theoretical operations like cairo_region_union() and +cairo_region_intersect() to be performed on them.

+

Memory management of cairo_region_t is done with +cairo_region_reference() and cairo_region_destroy().

+

Since 1.10

+
+
+
+

enum cairo_region_overlap_t

+

Used as the return value for cairo_region_contains_rectangle().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

CAIRO_REGION_OVERLAP_IN

+

The contents are entirely inside the region. (Since 1.10)

+
 

CAIRO_REGION_OVERLAP_OUT

+

The contents are entirely outside the region. (Since 1.10)

+
 

CAIRO_REGION_OVERLAP_PART

+

The contents are partially inside and + partially outside the region. (Since 1.10)

+
 
+
+

Since 1.10

+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-SVG-Surfaces.html b/doc/public/html/cairo-SVG-Surfaces.html new file mode 100644 index 000000000..b730dfc3e --- /dev/null +++ b/doc/public/html/cairo-SVG-Surfaces.html @@ -0,0 +1,397 @@ + + + + +Cairo: A Vector Graphics Library: SVG Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

SVG Surfaces

+

SVG Surfaces — Rendering SVG documents

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_svg_surface_create () +
+cairo_surface_t * + +cairo_svg_surface_create_for_stream () +
+void + +cairo_svg_surface_restrict_to_version () +
+void + +cairo_svg_get_versions () +
const char * + +cairo_svg_version_to_string () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineCAIRO_HAS_SVG_SURFACE
enumcairo_svg_version_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The SVG surface is used to render cairo graphics to +SVG files and is a multi-page vector surface backend.

+
+
+

Functions

+
+

cairo_svg_surface_create ()

+
cairo_surface_t *
+cairo_svg_surface_create (const char *filename,
+                          double width_in_points,
+                          double height_in_points);
+

Creates a SVG surface of the specified size in points to be written +to filename +.

+

The SVG surface backend recognizes the following MIME types for the +data attached to a surface (see cairo_surface_set_mime_data()) when +it is used as a source pattern for drawing on this surface: +CAIRO_MIME_TYPE_JPEG, CAIRO_MIME_TYPE_PNG, +CAIRO_MIME_TYPE_URI. If any of them is specified, the SVG backend +emits a href with the content of MIME data instead of a surface +snapshot (PNG, Base64-encoded) in the corresponding image tag.

+

The unofficial MIME type CAIRO_MIME_TYPE_URI is examined +first. If present, the URI is emitted as is: assuring the +correctness of URI is left to the client code.

+

If CAIRO_MIME_TYPE_URI is not present, but CAIRO_MIME_TYPE_JPEG +or CAIRO_MIME_TYPE_PNG is specified, the corresponding data is +Base64-encoded and emitted.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

filename

a filename for the SVG output (must be writable), NULL may be +used to specify no output. This will generate a SVG surface that +may be queried and used as a source, without generating a +temporary file.

 

width_in_points

width of the surface, in points (1 point == 1/72.0 inch)

 

height_in_points

height of the surface, in points (1 point == 1/72.0 inch)

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.2

+
+
+
+

cairo_svg_surface_create_for_stream ()

+
cairo_surface_t *
+cairo_svg_surface_create_for_stream (cairo_write_func_t write_func,
+                                     void *closure,
+                                     double width_in_points,
+                                     double height_in_points);
+

Creates a SVG surface of the specified size in points to be written +incrementally to the stream represented by write_func + and closure +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

write_func

a cairo_write_func_t to accept the output data, may be NULL +to indicate a no-op write_func +. With a no-op write_func +, +the surface may be queried or used as a source without +generating any temporary files.

 

closure

the closure argument for write_func +

 

width_in_points

width of the surface, in points (1 point == 1/72.0 inch)

 

height_in_points

height of the surface, in points (1 point == 1/72.0 inch)

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.2

+
+
+
+

cairo_svg_surface_restrict_to_version ()

+
void
+cairo_svg_surface_restrict_to_version (cairo_surface_t *surface,
+                                       cairo_svg_version_t version);
+

Restricts the generated SVG file to version +. See cairo_svg_get_versions() +for a list of available version values that can be used here.

+

This function should only be called before any drawing operations +have been performed on the given surface. The simplest way to do +this is to call this function immediately after creating the +surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a SVG cairo_surface_t

 

version

SVG version

 
+
+

Since 1.2

+
+
+
+

cairo_svg_get_versions ()

+
void
+cairo_svg_get_versions (cairo_svg_version_t const **versions,
+                        int *num_versions);
+

Used to retrieve the list of supported versions. See +cairo_svg_surface_restrict_to_version().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

versions

supported version list

 

num_versions

list length

 
+
+

Since 1.2

+
+
+
+

cairo_svg_version_to_string ()

+
const char *
+cairo_svg_version_to_string (cairo_svg_version_t version);
+

Get the string representation of the given version + id. This function +will return NULL if version + isn't valid. See cairo_svg_get_versions() +for a way to get the list of valid version ids.

+
+

Parameters

+
+++++ + + + + + +

version

a version id

 
+
+
+

Returns

+

the string associated to given version.

+

+
+

Since 1.2

+
+
+
+

Types and Values

+
+

CAIRO_HAS_SVG_SURFACE

+
#define CAIRO_HAS_SVG_SURFACE 1
+
+

Defined if the SVG surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.2

+
+
+
+

enum cairo_svg_version_t

+

cairo_svg_version_t is used to describe the version number of the SVG +specification that a generated SVG file will conform to.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_SVG_VERSION_1_1

+

The version 1.1 of the SVG specification. (Since 1.2)

+
 

CAIRO_SVG_VERSION_1_2

+

The version 1.2 of the SVG specification. (Since 1.2)

+
 
+
+

Since 1.2

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Script-Surfaces.html b/doc/public/html/cairo-Script-Surfaces.html new file mode 100644 index 000000000..33c330cf6 --- /dev/null +++ b/doc/public/html/cairo-Script-Surfaces.html @@ -0,0 +1,503 @@ + + + + +Cairo: A Vector Graphics Library: Script Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Script Surfaces

+

Script Surfaces — Rendering to replayable scripts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_device_t * + +cairo_script_create () +
+cairo_device_t * + +cairo_script_create_for_stream () +
+cairo_status_t + +cairo_script_from_recording_surface () +
+cairo_script_mode_t + +cairo_script_get_mode () +
+void + +cairo_script_set_mode () +
+cairo_surface_t * + +cairo_script_surface_create () +
+cairo_surface_t * + +cairo_script_surface_create_for_target () +
+void + +cairo_script_write_comment () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineCAIRO_HAS_SCRIPT_SURFACE
enumcairo_script_mode_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The script surface provides the ability to render to a native +script that matches the cairo drawing model. The scripts can +be replayed using tools under the util/cairo-script directoriy, +or with cairo-perf-trace.

+
+
+

Functions

+
+

cairo_script_create ()

+
cairo_device_t *
+cairo_script_create (const char *filename);
+

Creates a output device for emitting the script, used when +creating the individual surfaces.

+
+

Parameters

+
+++++ + + + + + +

filename

the name (path) of the file to write the script to

 
+
+
+

Returns

+

a pointer to the newly created device. The caller +owns the surface and should call cairo_device_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" device if an error such as out of memory +occurs. You can use cairo_device_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_script_create_for_stream ()

+
cairo_device_t *
+cairo_script_create_for_stream (cairo_write_func_t write_func,
+                                void *closure);
+

Creates a output device for emitting the script, used when +creating the individual surfaces.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

write_func

callback function passed the bytes written to the script

 

closure

user data to be passed to the callback

 
+
+
+

Returns

+

a pointer to the newly created device. The caller +owns the surface and should call cairo_device_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" device if an error such as out of memory +occurs. You can use cairo_device_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_script_from_recording_surface ()

+
cairo_status_t
+cairo_script_from_recording_surface (cairo_device_t *script,
+                                     cairo_surface_t *recording_surface);
+

Converts the record operations in recording_surface + into a script.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

script

the script (output device)

 

recording_surface

the recording surface to replay

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS on successful completion or an error code.

+

+
+

Since 1.12

+
+
+
+

cairo_script_get_mode ()

+
cairo_script_mode_t
+cairo_script_get_mode (cairo_device_t *script);
+

Queries the script for its current output mode.

+
+

Parameters

+
+++++ + + + + + +

script

The script (output device) to query

 
+
+
+

Returns

+

the current output mode of the script

+

+
+

Since 1.12

+
+
+
+

cairo_script_set_mode ()

+
void
+cairo_script_set_mode (cairo_device_t *script,
+                       cairo_script_mode_t mode);
+

Change the output mode of the script

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

script

The script (output device)

 

mode

the new mode

 
+
+

Since 1.12

+
+
+
+

cairo_script_surface_create ()

+
cairo_surface_t *
+cairo_script_surface_create (cairo_device_t *script,
+                             cairo_content_t content,
+                             double width,
+                             double height);
+

Create a new surface that will emit its rendering through script +

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

script

the script (output device)

 

content

the content of the surface

 

width

width in pixels

 

height

height in pixels

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_script_surface_create_for_target ()

+
cairo_surface_t *
+cairo_script_surface_create_for_target
+                               (cairo_device_t *script,
+                                cairo_surface_t *target);
+

Create a pxoy surface that will render to target + and record +the operations to device +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

script

the script (output device)

 

target

a target surface to wrap

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_script_write_comment ()

+
void
+cairo_script_write_comment (cairo_device_t *script,
+                            const char *comment,
+                            int len);
+

Emit a string verbatim into the script.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

script

the script (output device)

 

comment

the string to emit

 

len

the length of the sting to write, or -1 to use strlen()

 
+
+

Since 1.12

+
+
+
+

Types and Values

+
+

CAIRO_HAS_SCRIPT_SURFACE

+
#define CAIRO_HAS_SCRIPT_SURFACE 1
+
+

Defined if the script surface backend is available. +The script surface backend is always built in since 1.12.

+

Since 1.12

+
+
+
+

enum cairo_script_mode_t

+

A set of script output variants.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_SCRIPT_MODE_ASCII

+

the output will be in readable text (default). (Since 1.12)

+
 

CAIRO_SCRIPT_MODE_BINARY

+

the output will use byte codes. (Since 1.12)

+
 
+
+

Since 1.12

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Transformations.html b/doc/public/html/cairo-Transformations.html new file mode 100644 index 000000000..6034736a1 --- /dev/null +++ b/doc/public/html/cairo-Transformations.html @@ -0,0 +1,570 @@ + + + + +Cairo: A Vector Graphics Library: Transformations + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Transformations

+

Transformations — Manipulating the current transformation matrix

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +cairo_translate () +
+void + +cairo_scale () +
+void + +cairo_rotate () +
+void + +cairo_transform () +
+void + +cairo_set_matrix () +
+void + +cairo_get_matrix () +
+void + +cairo_identity_matrix () +
+void + +cairo_user_to_device () +
+void + +cairo_user_to_device_distance () +
+void + +cairo_device_to_user () +
+void + +cairo_device_to_user_distance () +
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The current transformation matrix, ctm, is a +two-dimensional affine transformation that maps all coordinates and other +drawing instruments from the user space into the +surface's canonical coordinate system, also known as the device +space.

+
+
+

Functions

+
+

cairo_translate ()

+
void
+cairo_translate (cairo_t *cr,
+                 double tx,
+                 double ty);
+

Modifies the current transformation matrix (CTM) by translating the +user-space origin by (tx +, ty +). This offset is interpreted as a +user-space coordinate according to the CTM in place before the new +call to cairo_translate(). In other words, the translation of the +user-space origin takes place after any existing transformation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

tx

amount to translate in the X direction

 

ty

amount to translate in the Y direction

 
+
+

Since 1.0

+
+
+
+

cairo_scale ()

+
void
+cairo_scale (cairo_t *cr,
+             double sx,
+             double sy);
+

Modifies the current transformation matrix (CTM) by scaling the X +and Y user-space axes by sx + and sy + respectively. The scaling of +the axes takes place after any existing transformation of user +space.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

sx

scale factor for the X dimension

 

sy

scale factor for the Y dimension

 
+
+

Since 1.0

+
+
+
+

cairo_rotate ()

+
void
+cairo_rotate (cairo_t *cr,
+              double angle);
+

Modifies the current transformation matrix (CTM) by rotating the +user-space axes by angle + radians. The rotation of the axes takes +places after any existing transformation of user space. The +rotation direction for positive angles is from the positive X axis +toward the positive Y axis.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

angle

angle (in radians) by which the user-space axes will be +rotated

 
+
+

Since 1.0

+
+
+
+

cairo_transform ()

+
void
+cairo_transform (cairo_t *cr,
+                 const cairo_matrix_t *matrix);
+

Modifies the current transformation matrix (CTM) by applying +matrix + as an additional transformation. The new transformation of +user space takes place after any existing transformation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

matrix

a transformation to be applied to the user-space axes

 
+
+

Since 1.0

+
+
+
+

cairo_set_matrix ()

+
void
+cairo_set_matrix (cairo_t *cr,
+                  const cairo_matrix_t *matrix);
+

Modifies the current transformation matrix (CTM) by setting it +equal to matrix +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

matrix

a transformation matrix from user space to device space

 
+
+

Since 1.0

+
+
+
+

cairo_get_matrix ()

+
void
+cairo_get_matrix (cairo_t *cr,
+                  cairo_matrix_t *matrix);
+

Stores the current transformation matrix (CTM) into matrix +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

matrix

return value for the matrix

 
+
+

Since 1.0

+
+
+
+

cairo_identity_matrix ()

+
void
+cairo_identity_matrix (cairo_t *cr);
+

Resets the current transformation matrix (CTM) by setting it equal +to the identity matrix. That is, the user-space and device-space +axes will be aligned and one user-space unit will transform to one +device-space unit.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_user_to_device ()

+
void
+cairo_user_to_device (cairo_t *cr,
+                      double *x,
+                      double *y);
+

Transform a coordinate from user space to device space by +multiplying the given point by the current transformation matrix +(CTM).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

X value of coordinate (in/out parameter)

 

y

Y value of coordinate (in/out parameter)

 
+
+

Since 1.0

+
+
+
+

cairo_user_to_device_distance ()

+
void
+cairo_user_to_device_distance (cairo_t *cr,
+                               double *dx,
+                               double *dy);
+

Transform a distance vector from user space to device space. This +function is similar to cairo_user_to_device() except that the +translation components of the CTM will be ignored when transforming +(dx +,dy +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

dx

X component of a distance vector (in/out parameter)

 

dy

Y component of a distance vector (in/out parameter)

 
+
+

Since 1.0

+
+
+
+

cairo_device_to_user ()

+
void
+cairo_device_to_user (cairo_t *cr,
+                      double *x,
+                      double *y);
+

Transform a coordinate from device space to user space by +multiplying the given point by the inverse of the current +transformation matrix (CTM).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo

 

x

X value of coordinate (in/out parameter)

 

y

Y value of coordinate (in/out parameter)

 
+
+

Since 1.0

+
+
+
+

cairo_device_to_user_distance ()

+
void
+cairo_device_to_user_distance (cairo_t *cr,
+                               double *dx,
+                               double *dy);
+

Transform a distance vector from device space to user space. This +function is similar to cairo_device_to_user() except that the +translation components of the inverse CTM will be ignored when +transforming (dx +,dy +).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

dx

X component of a distance vector (in/out parameter)

 

dy

Y component of a distance vector (in/out parameter)

 
+
+

Since 1.0

+
+
+
+

Types and Values

+
+
+

See Also

+

cairo_matrix_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Types.html b/doc/public/html/cairo-Types.html new file mode 100644 index 000000000..9ab8167a6 --- /dev/null +++ b/doc/public/html/cairo-Types.html @@ -0,0 +1,206 @@ + + + + +Cairo: A Vector Graphics Library: Types + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Types

+

Types — Generic data types

+
+
+

Functions

+
++++ + + + + +
+void + +(*cairo_destroy_func_t) () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
typedefcairo_bool_t
 cairo_user_data_key_t
 cairo_rectangle_int_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

This section lists generic data types used in the cairo API.

+
+
+

Functions

+
+

cairo_destroy_func_t ()

+
void
+(*cairo_destroy_func_t) (void *data);
+

cairo_destroy_func_t the type of function which is called when a +data element is destroyed. It is passed the pointer to the data +element and should free any memory and resources allocated for it.

+
+

Parameters

+
+++++ + + + + + +

data

The data element being destroyed.

 
+
+

Since 1.0

+
+
+
+

Types and Values

+
+

cairo_bool_t

+
typedef int cairo_bool_t;
+
+

cairo_bool_t is used for boolean values. Returns of type +cairo_bool_t will always be either 0 or 1, but testing against +these values explicitly is not encouraged; just use the +value as a boolean condition.

+
+ if (cairo_in_stroke (cr, x, y)) {
+     /* do something */
+ }
+
+

Since 1.0

+
+
+
+

cairo_user_data_key_t

+
typedef struct {
+    int unused;
+} cairo_user_data_key_t;
+
+

cairo_user_data_key_t is used for attaching user data to cairo +data structures. The actual contents of the struct is never used, +and there is no need to initialize the object; only the unique +address of a cairo_data_key_t object is used. Typically, you +would just use the address of a static cairo_data_key_t object.

+
+

Members

+
+++++ + + + + + +

int unused;

not used; ignore.

 
+
+

Since 1.0

+
+
+
+

cairo_rectangle_int_t

+
typedef struct {
+    int x, y;
+    int width, height;
+} cairo_rectangle_int_t;
+
+

A data structure for holding a rectangle with integer coordinates.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

int x;

X coordinate of the left side of the rectangle

 

int y;

Y coordinate of the the top side of the rectangle

 

int width;

width of the rectangle

 

int height;

height of the rectangle

 
+
+

Since 1.10

+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-User-Fonts.html b/doc/public/html/cairo-User-Fonts.html new file mode 100644 index 000000000..82f45b7d5 --- /dev/null +++ b/doc/public/html/cairo-User-Fonts.html @@ -0,0 +1,843 @@ + + + + +Cairo: A Vector Graphics Library: User Fonts + + + + + + + + + + + + + + + + +
+
+
+ + +
+

User Fonts

+

User Fonts — Font support with font data provided by the user

+
+ +
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_USER_FONT
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The user-font feature allows the cairo user to provide drawings for glyphs +in a font. This is most useful in implementing fonts in non-standard +formats, like SVG fonts and Flash fonts, but can also be used by games and +other application to draw "funky" fonts.

+
+
+

Functions

+
+

cairo_user_scaled_font_init_func_t ()

+
cairo_status_t
+(*cairo_user_scaled_font_init_func_t) (cairo_scaled_font_t *scaled_font,
+                                       cairo_t *cr,
+                                       cairo_font_extents_t *extents);
+

cairo_user_scaled_font_init_func_t is the type of function which is +called when a scaled-font needs to be created for a user font-face.

+

The cairo context cr + is not used by the caller, but is prepared in font +space, similar to what the cairo contexts passed to the render_glyph +method will look like. The callback can use this context for extents +computation for example. After the callback is called, cr + is checked +for any error status.

+

The extents + argument is where the user font sets the font extents for +scaled_font +. It is in font space, which means that for most cases its +ascent and descent members should add to 1.0. extents + is preset to +hold a value of 1.0 for ascent, height, and max_x_advance, and 0.0 for +descent and max_y_advance members.

+

The callback is optional. If not set, default font extents as described +in the previous paragraph will be used.

+

Note that scaled_font + is not fully initialized at this +point and trying to use it for text operations in the callback will result +in deadlock.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

scaled_font

the scaled-font being created

 

cr

a cairo context, in font space

 

extents

font extents to fill in, in font space

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS upon success, or an error status on error.

+

+
+

Since 1.8

+
+
+
+

cairo_user_scaled_font_render_glyph_func_t ()

+
cairo_status_t
+(*cairo_user_scaled_font_render_glyph_func_t)
+                               (cairo_scaled_font_t *scaled_font,
+                                unsigned long  glyph,
+                                cairo_t *cr,
+                                cairo_text_extents_t *extents);
+

cairo_user_scaled_font_render_glyph_func_t is the type of function which +is called when a user scaled-font needs to render a glyph.

+

The callback is mandatory, and expected to draw the glyph with code glyph + to +the cairo context cr +. cr + is prepared such that the glyph drawing is done in +font space. That is, the matrix set on cr + is the scale matrix of scaled_font +, +The extents + argument is where the user font sets the font extents for +scaled_font +. However, if user prefers to draw in user space, they can +achieve that by changing the matrix on cr +. All cairo rendering operations +to cr + are permitted, however, the result is undefined if any source other +than the default source on cr + is used. That means, glyph bitmaps should +be rendered using cairo_mask() instead of cairo_paint().

+

Other non-default settings on cr + include a font size of 1.0 (given that +it is set up to be in font space), and font options corresponding to +scaled_font +.

+

The extents + argument is preset to have x_bearing, +width, and y_advance of zero, +y_bearing set to -font_extents.ascent, +height to font_extents.ascent+font_extents.descent, +and x_advance to font_extents.max_x_advance. +The only field user needs to set in majority of cases is +x_advance. +If the width field is zero upon the callback returning +(which is its preset value), the glyph extents are automatically computed +based on the drawings done to cr +. This is in most cases exactly what the +desired behavior is. However, if for any reason the callback sets the +extents, it must be ink extents, and include the extents of all drawing +done to cr + in the callback.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

scaled_font

user scaled-font

 

glyph

glyph code to render

 

cr

cairo context to draw to, in font space

 

extents

glyph extents to fill in, in font space

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS upon success, or +CAIRO_STATUS_USER_FONT_ERROR or any other error status on error.

+

+
+

Since 1.8

+
+
+
+

cairo_user_scaled_font_text_to_glyphs_func_t ()

+
cairo_status_t
+(*cairo_user_scaled_font_text_to_glyphs_func_t)
+                               (cairo_scaled_font_t *scaled_font,
+                                const char *utf8,
+                                int utf8_len,
+                                cairo_glyph_t **glyphs,
+                                int *num_glyphs,
+                                cairo_text_cluster_t **clusters,
+                                int *num_clusters,
+                                cairo_text_cluster_flags_t *cluster_flags);
+

cairo_user_scaled_font_text_to_glyphs_func_t is the type of function which +is called to convert input text to an array of glyphs. This is used by the +cairo_show_text() operation.

+

Using this callback the user-font has full control on glyphs and their +positions. That means, it allows for features like ligatures and kerning, +as well as complex shaping required for scripts like +Arabic and Indic.

+

The num_glyphs + argument is preset to the number of glyph entries available +in the glyphs + buffer. If the glyphs + buffer is NULL, the value of +num_glyphs + will be zero. If the provided glyph array is too short for +the conversion (or for convenience), a new glyph array may be allocated +using cairo_glyph_allocate() and placed in glyphs +. Upon return, +num_glyphs + should contain the number of generated glyphs. If the value +glyphs + points at has changed after the call, the caller will free the +allocated glyph array using cairo_glyph_free(). The caller will also free +the original value of glyphs +, so the callback shouldn't do so. +The callback should populate the glyph indices and positions (in font space) +assuming that the text is to be shown at the origin.

+

If clusters + is not NULL, num_clusters + and cluster_flags + are also +non-NULL, and cluster mapping should be computed. The semantics of how +cluster array allocation works is similar to the glyph array. That is, +if clusters + initially points to a non-NULL value, that array may be used +as a cluster buffer, and num_clusters + points to the number of cluster +entries available there. If the provided cluster array is too short for +the conversion (or for convenience), a new cluster array may be allocated +using cairo_text_cluster_allocate() and placed in clusters +. In this case, +the original value of clusters + will still be freed by the caller. Upon +return, num_clusters + should contain the number of generated clusters. +If the value clusters + points at has changed after the call, the caller +will free the allocated cluster array using cairo_text_cluster_free().

+

The callback is optional. If num_glyphs + is negative upon +the callback returning or if the return value +is CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, the unicode_to_glyph callback +is tried. See cairo_user_scaled_font_unicode_to_glyph_func_t.

+

Note: While cairo does not impose any limitation on glyph indices, +some applications may assume that a glyph index fits in a 16-bit +unsigned integer. As such, it is advised that user-fonts keep their +glyphs in the 0 to 65535 range. Furthermore, some applications may +assume that glyph 0 is a special glyph-not-found glyph. User-fonts +are advised to use glyph 0 for such purposes and do not use that +glyph value for other purposes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

scaled_font

the scaled-font being created

 

utf8

a string of text encoded in UTF-8

 

utf8_len

length of utf8 +in bytes

 

glyphs

pointer to array of glyphs to fill, in font space

 

num_glyphs

pointer to number of glyphs

 

clusters

pointer to array of cluster mapping information to fill, or NULL

 

num_clusters

pointer to number of clusters

 

cluster_flags

pointer to location to store cluster flags corresponding to the +output clusters +

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS upon success, +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED if fallback options should be tried, +or CAIRO_STATUS_USER_FONT_ERROR or any other error status on error.

+

+
+

Since 1.8

+
+
+
+

cairo_user_scaled_font_unicode_to_glyph_func_t ()

+
cairo_status_t
+(*cairo_user_scaled_font_unicode_to_glyph_func_t)
+                               (cairo_scaled_font_t *scaled_font,
+                                unsigned long  unicode,
+                                unsigned long *glyph_index);
+

cairo_user_scaled_font_unicode_to_glyph_func_t is the type of function which +is called to convert an input Unicode character to a single glyph. +This is used by the cairo_show_text() operation.

+

This callback is used to provide the same functionality as the +text_to_glyphs callback does (see cairo_user_scaled_font_text_to_glyphs_func_t) +but has much less control on the output, +in exchange for increased ease of use. The inherent assumption to using +this callback is that each character maps to one glyph, and that the +mapping is context independent. It also assumes that glyphs are positioned +according to their advance width. These mean no ligatures, kerning, or +complex scripts can be implemented using this callback.

+

The callback is optional, and only used if text_to_glyphs callback is not +set or fails to return glyphs. If this callback is not set or if it returns +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, an identity mapping from Unicode +code-points to glyph indices is assumed.

+

Note: While cairo does not impose any limitation on glyph indices, +some applications may assume that a glyph index fits in a 16-bit +unsigned integer. As such, it is advised that user-fonts keep their +glyphs in the 0 to 65535 range. Furthermore, some applications may +assume that glyph 0 is a special glyph-not-found glyph. User-fonts +are advised to use glyph 0 for such purposes and do not use that +glyph value for other purposes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

scaled_font

the scaled-font being created

 

unicode

input unicode character code-point

 

glyph_index

output glyph index

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS upon success, +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED if fallback options should be tried, +or CAIRO_STATUS_USER_FONT_ERROR or any other error status on error.

+

+
+

Since 1.8

+
+
+
+

cairo_user_font_face_create ()

+
cairo_font_face_t *
+cairo_user_font_face_create (void);
+

Creates a new user font-face.

+

Use the setter functions to associate callbacks with the returned +user font. The only mandatory callback is render_glyph.

+

After the font-face is created, the user can attach arbitrary data +(the actual font data) to it using cairo_font_face_set_user_data() +and access it from the user-font callbacks by using +cairo_scaled_font_get_font_face() followed by +cairo_font_face_get_user_data().

+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.8

+
+
+
+

cairo_user_font_face_set_init_func ()

+
void
+cairo_user_font_face_set_init_func (cairo_font_face_t *font_face,
+                                    cairo_user_scaled_font_init_func_t init_func);
+

Sets the scaled-font initialization function of a user-font. +See cairo_user_scaled_font_init_func_t for details of how the callback +works.

+

The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

A user font face

 

init_func

The init callback, or NULL

 
+
+

Since 1.8

+
+
+
+

cairo_user_font_face_get_init_func ()

+
cairo_user_scaled_font_init_func_t
+cairo_user_font_face_get_init_func (cairo_font_face_t *font_face);
+

Gets the scaled-font initialization function of a user-font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A user font face

 
+
+
+

Returns

+

The init callback of font_face +or NULL if none set or an error has occurred.

+

+
+

Since 1.8

+
+
+
+

cairo_user_font_face_set_render_glyph_func ()

+
void
+cairo_user_font_face_set_render_glyph_func
+                               (cairo_font_face_t *font_face,
+                                cairo_user_scaled_font_render_glyph_func_t render_glyph_func);
+

Sets the glyph rendering function of a user-font. +See cairo_user_scaled_font_render_glyph_func_t for details of how the callback +works.

+

The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it.

+

The render_glyph callback is the only mandatory callback of a user-font. +If the callback is NULL and a glyph is tried to be rendered using +font_face +, a CAIRO_STATUS_USER_FONT_ERROR will occur.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

A user font face

 

render_glyph_func

The render_glyph callback, or NULL

 
+
+

Since 1.8

+
+
+
+

cairo_user_font_face_get_render_glyph_func ()

+
cairo_user_scaled_font_render_glyph_func_t
+cairo_user_font_face_get_render_glyph_func
+                               (cairo_font_face_t *font_face);
+

Gets the glyph rendering function of a user-font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A user font face

 
+
+
+

Returns

+

The render_glyph callback of font_face +or NULL if none set or an error has occurred.

+

+
+

Since 1.8

+
+
+
+

cairo_user_font_face_set_unicode_to_glyph_func ()

+
void
+cairo_user_font_face_set_unicode_to_glyph_func
+                               (cairo_font_face_t *font_face,
+                                cairo_user_scaled_font_unicode_to_glyph_func_t unicode_to_glyph_func);
+

Sets the unicode-to-glyph conversion function of a user-font. +See cairo_user_scaled_font_unicode_to_glyph_func_t for details of how the callback +works.

+

The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

A user font face

 

unicode_to_glyph_func

The unicode_to_glyph callback, or NULL

 
+
+

Since 1.8

+
+
+
+

cairo_user_font_face_get_unicode_to_glyph_func ()

+
cairo_user_scaled_font_unicode_to_glyph_func_t
+cairo_user_font_face_get_unicode_to_glyph_func
+                               (cairo_font_face_t *font_face);
+

Gets the unicode-to-glyph conversion function of a user-font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A user font face

 
+
+
+

Returns

+

The unicode_to_glyph callback of font_face +or NULL if none set or an error occurred.

+

+
+

Since 1.8

+
+
+
+

cairo_user_font_face_set_text_to_glyphs_func ()

+
void
+cairo_user_font_face_set_text_to_glyphs_func
+                               (cairo_font_face_t *font_face,
+                                cairo_user_scaled_font_text_to_glyphs_func_t text_to_glyphs_func);
+

Sets th text-to-glyphs conversion function of a user-font. +See cairo_user_scaled_font_text_to_glyphs_func_t for details of how the callback +works.

+

The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

A user font face

 

text_to_glyphs_func

The text_to_glyphs callback, or NULL

 
+
+

Since 1.8

+
+
+
+

cairo_user_font_face_get_text_to_glyphs_func ()

+
cairo_user_scaled_font_text_to_glyphs_func_t
+cairo_user_font_face_get_text_to_glyphs_func
+                               (cairo_font_face_t *font_face);
+

Gets the text-to-glyphs conversion function of a user-font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A user font face

 
+
+
+

Returns

+

The text_to_glyphs callback of font_face +or NULL if none set or an error occurred.

+

+
+

Since 1.8

+
+
+
+

Types and Values

+
+

CAIRO_HAS_USER_FONT

+
#define CAIRO_HAS_USER_FONT 1
+
+

Defined if the user font backend is available. +This macro can be used to conditionally compile backend-specific code. +The user font backend is always built in versions of cairo that support +this feature (1.8 and later).

+

Since 1.8

+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Version-Information.html b/doc/public/html/cairo-Version-Information.html new file mode 100644 index 000000000..7a52b4735 --- /dev/null +++ b/doc/public/html/cairo-Version-Information.html @@ -0,0 +1,367 @@ + + + + +Cairo: A Vector Graphics Library: Version Information + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Version Information

+

Version Information — Compile-time and run-time version checks.

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
#define +CAIRO_VERSION_ENCODE() +
#define +CAIRO_VERSION_STRINGIZE() +
+int + +cairo_version () +
const char * + +cairo_version_string () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
#defineCAIRO_VERSION
#defineCAIRO_VERSION_MAJOR
#defineCAIRO_VERSION_MINOR
#defineCAIRO_VERSION_MICRO
#defineCAIRO_VERSION_STRING
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

Cairo has a three-part version number scheme. In this scheme, we use +even vs. odd numbers to distinguish fixed points in the software +vs. in-progress development, (such as from git instead of a tar file, +or as a "snapshot" tar file as opposed to a "release" tar file).

+
+ _____ Major. Always 1, until we invent a new scheme.
+/  ___ Minor. Even/Odd = Release/Snapshot (tar files) or Branch/Head (git)
+| /  _ Micro. Even/Odd = Tar-file/git
+| | /
+1.0.0
+
+

Here are a few examples of versions that one might see.

+
+Releases
+--------
+1.0.0 - A major release
+1.0.2 - A subsequent maintenance release
+1.2.0 - Another major release
+ 
+Snapshots
+---------
+1.1.2 - A snapshot (working toward the 1.2.0 release)
+ 
+In-progress development (eg. from git)
+--------------------------------------
+1.0.1 - Development on a maintenance branch (toward 1.0.2 release)
+1.1.1 - Development on head (toward 1.1.2 snapshot and 1.2.0 release)
+
+
+

Compatibility

+ +The API/ABI compatibility guarantees for various versions are as +follows. First, let's assume some cairo-using application code that is +successfully using the API/ABI "from" one version of cairo. Then let's +ask the question whether this same code can be moved "to" the API/ABI +of another version of cairo. + +Moving from a release to any later version (release, snapshot, +development) is always guaranteed to provide compatibility. + +Moving from a snapshot to any later version is not guaranteed to +provide compatibility, since snapshots may introduce new API that ends +up being removed before the next release. + +Moving from an in-development version (odd micro component) to any +later version is not guaranteed to provide compatibility. In fact, +there's not even a guarantee that the code will even continue to work +with the same in-development version number. This is because these +numbers don't correspond to any fixed state of the software, but +rather the many states between snapshots and releases. + +
+
+
+

Examining the version

+ +Cairo provides the ability to examine the version at either +compile-time or run-time and in both a human-readable form as well as +an encoded form suitable for direct comparison. Cairo also provides the +macro CAIRO_VERSION_ENCODE() to perform the encoding. + +
+Compile-time
+------------
+CAIRO_VERSION_STRING    Human-readable
+CAIRO_VERSION           Encoded, suitable for comparison
+ 
+Run-time
+--------
+cairo_version_string()  Human-readable
+cairo_version()         Encoded, suitable for comparison
+
+ +For example, checking that the cairo version is greater than or equal +to 1.0.0 could be achieved at compile-time or run-time as follows: + +
+##if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 0, 0)
+printf ("Compiling with suitable cairo version: %s\n", %CAIRO_VERSION_STRING);
+##endif
+
+if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 0, 0))
+    printf ("Running with suitable cairo version: %s\n", cairo_version_string ());
+
+
+
+
+

Functions

+
+

CAIRO_VERSION_ENCODE()

+
#define             CAIRO_VERSION_ENCODE(major, minor, micro)
+

This macro encodes the given cairo version into an integer. The numbers +returned by CAIRO_VERSION and cairo_version() are encoded using this macro. +Two encoded version numbers can be compared as integers. The encoding ensures +that later versions compare greater than earlier versions.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

major

the major component of the version number

 

minor

the minor component of the version number

 

micro

the micro component of the version number

 
+
+
+

Returns

+

the encoded version.

+

+
+

Since 1.0

+
+
+
+

CAIRO_VERSION_STRINGIZE()

+
#define             CAIRO_VERSION_STRINGIZE(major, minor, micro)
+

This macro encodes the given cairo version into an string. The numbers +returned by CAIRO_VERSION_STRING and cairo_version_string() are encoded using this macro. +The parameters to this macro must expand to numerical literals.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

major

the major component of the version number

 

minor

the minor component of the version number

 

micro

the micro component of the version number

 
+
+
+

Returns

+

a string literal containing the version.

+

+
+

Since 1.8

+
+
+
+

cairo_version ()

+
int
+cairo_version (void);
+

Returns the version of the cairo library encoded in a single +integer as per CAIRO_VERSION_ENCODE. The encoding ensures that +later versions compare greater than earlier versions.

+

A run-time comparison to check that cairo's version is greater than +or equal to version X.Y.Z could be performed as follows:

+
+if (cairo_version() >= CAIRO_VERSION_ENCODE(X,Y,Z)) {...}
+
+

See also cairo_version_string() as well as the compile-time +equivalents CAIRO_VERSION and CAIRO_VERSION_STRING.

+
+

Returns

+

the encoded version.

+

+
+

Since 1.0

+
+
+
+

cairo_version_string ()

+
const char *
+cairo_version_string (void);
+

Returns the version of the cairo library as a human-readable string +of the form "X.Y.Z".

+

See also cairo_version() as well as the compile-time equivalents +CAIRO_VERSION_STRING and CAIRO_VERSION.

+
+

Returns

+

a string containing the version.

+

+
+

Since 1.0

+
+
+
+

Types and Values

+
+

CAIRO_VERSION

+
#define             CAIRO_VERSION
+

The version of cairo available at compile-time, encoded using +CAIRO_VERSION_ENCODE().

+

Since 1.0

+
+
+
+

CAIRO_VERSION_MAJOR

+
#define CAIRO_VERSION_MAJOR USE_cairo_version_OR_cairo_version_string_INSTEAD
+
+

The major component of the version of cairo available at compile-time.

+

Since 1.0

+
+
+
+

CAIRO_VERSION_MINOR

+
#define CAIRO_VERSION_MINOR USE_cairo_version_OR_cairo_version_string_INSTEAD
+
+

The minor component of the version of cairo available at compile-time.

+

Since 1.0

+
+
+
+

CAIRO_VERSION_MICRO

+
#define CAIRO_VERSION_MICRO USE_cairo_version_OR_cairo_version_string_INSTEAD
+
+

The micro component of the version of cairo available at compile-time.

+

Since 1.0

+
+
+
+

CAIRO_VERSION_STRING

+
#define             CAIRO_VERSION_STRING
+

A human-readable string literal containing the version of cairo available +at compile-time, in the form of "X.Y.Z".

+

Since 1.8

+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Win32-Fonts.html b/doc/public/html/cairo-Win32-Fonts.html new file mode 100644 index 000000000..2eb14012b --- /dev/null +++ b/doc/public/html/cairo-Win32-Fonts.html @@ -0,0 +1,448 @@ + + + + +Cairo: A Vector Graphics Library: Win32 Fonts + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Win32 Fonts

+

Win32 Fonts — Font support for Microsoft Windows

+
+ +
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_WIN32_FONT
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The Microsoft Windows font backend is primarily used to render text on +Microsoft Windows systems.

+
+
+

Functions

+
+

cairo_win32_font_face_create_for_logfontw ()

+
cairo_font_face_t *
+cairo_win32_font_face_create_for_logfontw
+                               (LOGFONTW *logfont);
+

Creates a new font for the Win32 font backend based on a +LOGFONT. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). +The cairo_scaled_font_t +returned from cairo_scaled_font_create() is also for the Win32 backend +and can be used with functions such as cairo_win32_scaled_font_select_font().

+
+

Parameters

+
+++++ + + + + + +

logfont

A LOGFONTW structure specifying the font to use. +The lfHeight, lfWidth, lfOrientation and lfEscapement +fields of this structure are ignored.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.0

+
+
+
+

cairo_win32_font_face_create_for_hfont ()

+
cairo_font_face_t *
+cairo_win32_font_face_create_for_hfont
+                               (HFONT font);
+

Creates a new font for the Win32 font backend based on a +HFONT. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). +The cairo_scaled_font_t +returned from cairo_scaled_font_create() is also for the Win32 backend +and can be used with functions such as cairo_win32_scaled_font_select_font().

+
+

Parameters

+
+++++ + + + + + +

font

An HFONT structure specifying the font to use.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.2

+
+
+
+

cairo_win32_font_face_create_for_logfontw_hfont ()

+
cairo_font_face_t *
+cairo_win32_font_face_create_for_logfontw_hfont
+                               (LOGFONTW *logfont,
+                                HFONT font);
+

Creates a new font for the Win32 font backend based on a +LOGFONT. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). +The cairo_scaled_font_t +returned from cairo_scaled_font_create() is also for the Win32 backend +and can be used with functions such as cairo_win32_scaled_font_select_font().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

logfont

A LOGFONTW structure specifying the font to use. +If font +is NULL then the lfHeight, lfWidth, lfOrientation and lfEscapement +fields of this structure are ignored. Otherwise lfWidth, lfOrientation and +lfEscapement must be zero.

 

font

An HFONT that can be used when the font matrix is a scale by +-lfHeight and the CTM is identity.

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.6

+
+
+
+

cairo_win32_scaled_font_select_font ()

+
cairo_status_t
+cairo_win32_scaled_font_select_font (cairo_scaled_font_t *scaled_font,
+                                     HDC hdc);
+

Selects the font into the given device context and changes the +map mode and world transformation of the device context to match +that of the font. This function is intended for use when using +layout APIs such as Uniscribe to do text layout with the +cairo font. After finishing using the device context, you must call +cairo_win32_scaled_font_done_font() to release any resources allocated +by this function.

+

See cairo_win32_scaled_font_get_metrics_factor() for converting logical +coordinates from the device context to font space.

+

Normally, calls to SaveDC() and RestoreDC() would be made around +the use of this function to preserve the original graphics state.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

A cairo_scaled_font_t from the Win32 font backend. Such an +object can be created with cairo_win32_font_face_create_for_logfontw().

 

hdc

a device context

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS if the operation succeeded. +otherwise an error such as CAIRO_STATUS_NO_MEMORY and +the device context is unchanged.

+

+
+

Since 1.0

+
+
+
+

cairo_win32_scaled_font_done_font ()

+
void
+cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font);
+

Releases any resources allocated by cairo_win32_scaled_font_select_font()

+
+

Parameters

+
+++++ + + + + + +

scaled_font

A scaled font from the Win32 font backend.

 
+
+

Since 1.0

+
+
+
+

cairo_win32_scaled_font_get_metrics_factor ()

+
double
+cairo_win32_scaled_font_get_metrics_factor
+                               (cairo_scaled_font_t *scaled_font);
+

Gets a scale factor between logical coordinates in the coordinate +space used by cairo_win32_scaled_font_select_font() (that is, the +coordinate system used by the Windows functions to return metrics) and +font space coordinates.

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a scaled font from the Win32 font backend

 
+
+
+

Returns

+

factor to multiply logical units by to get font space +coordinates.

+

+
+

Since 1.0

+
+
+
+

cairo_win32_scaled_font_get_logical_to_device ()

+
void
+cairo_win32_scaled_font_get_logical_to_device
+                               (cairo_scaled_font_t *scaled_font,
+                                cairo_matrix_t *logical_to_device);
+

Gets the transformation mapping the logical space used by scaled_font + +to device space.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a scaled font from the Win32 font backend

 

logical_to_device

matrix to return

 
+
+

Since 1.4

+
+
+
+

cairo_win32_scaled_font_get_device_to_logical ()

+
void
+cairo_win32_scaled_font_get_device_to_logical
+                               (cairo_scaled_font_t *scaled_font,
+                                cairo_matrix_t *device_to_logical);
+

Gets the transformation mapping device space to the logical space +used by scaled_font +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a scaled font from the Win32 font backend

 

device_to_logical

matrix to return

 
+
+

Since 1.4

+
+
+
+

Types and Values

+
+

CAIRO_HAS_WIN32_FONT

+
#define CAIRO_HAS_WIN32_FONT 1
+
+

Defined if the Microsoft Windows font backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.8

+
+
+
+

See Also

+

cairo_font_face_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-Win32-Surfaces.html b/doc/public/html/cairo-Win32-Surfaces.html new file mode 100644 index 000000000..ee1fc9203 --- /dev/null +++ b/doc/public/html/cairo-Win32-Surfaces.html @@ -0,0 +1,371 @@ + + + + +Cairo: A Vector Graphics Library: Win32 Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Win32 Surfaces

+

Win32 Surfaces — Microsoft Windows surface support

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_WIN32_SURFACE
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The Microsoft Windows surface is used to render cairo graphics to +Microsoft Windows windows, bitmaps, and printing device contexts.

+

The surface returned by cairo_win32_printing_surface_create() is of surface +type CAIRO_SURFACE_TYPE_WIN32_PRINTING and is a multi-page vector surface +type.

+

The surface returned by the other win32 constructors is of surface type +CAIRO_SURFACE_TYPE_WIN32 and is a raster surface type.

+
+
+

Functions

+
+

cairo_win32_surface_create ()

+
cairo_surface_t *
+cairo_win32_surface_create (HDC hdc);
+

Creates a cairo surface that targets the given DC. The DC will be +queried for its initial clip extents, and this will be used as the +size of the cairo surface. The resulting surface will always be of +format CAIRO_FORMAT_RGB24; should you need another surface format, +you will need to create one through +cairo_win32_surface_create_with_dib().

+
+

Parameters

+
+++++ + + + + + +

hdc

the DC to create a surface for

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.0

+
+
+
+

cairo_win32_surface_create_with_dib ()

+
cairo_surface_t *
+cairo_win32_surface_create_with_dib (cairo_format_t format,
+                                     int width,
+                                     int height);
+

Creates a device-independent-bitmap surface not associated with +any particular existing surface or device context. The created +bitmap will be uninitialized.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

format

format of pixels in the surface to create

 

width

width of the surface, in pixels

 

height

height of the surface, in pixels

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.2

+
+
+
+

cairo_win32_surface_create_with_ddb ()

+
cairo_surface_t *
+cairo_win32_surface_create_with_ddb (HDC hdc,
+                                     cairo_format_t format,
+                                     int width,
+                                     int height);
+

Creates a device-dependent-bitmap surface not associated with +any particular existing surface or device context. The created +bitmap will be uninitialized.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

hdc

a DC compatible with the surface to create

 

format

format of pixels in the surface to create

 

width

width of the surface, in pixels

 

height

height of the surface, in pixels

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.4

+
+
+
+

cairo_win32_printing_surface_create ()

+
cairo_surface_t *
+cairo_win32_printing_surface_create (HDC hdc);
+

Creates a cairo surface that targets the given DC. The DC will be +queried for its initial clip extents, and this will be used as the +size of the cairo surface. The DC should be a printing DC; +antialiasing will be ignored, and GDI will be used as much as +possible to draw to the surface.

+

The returned surface will be wrapped using the paginated surface to +provide correct complex rendering behaviour; cairo_surface_show_page() and +associated methods must be used for correct output.

+
+

Parameters

+
+++++ + + + + + +

hdc

the DC to create a surface for

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.6

+
+
+
+

cairo_win32_surface_get_dc ()

+
HDC
+cairo_win32_surface_get_dc (cairo_surface_t *surface);
+

Returns the HDC associated with this surface, or NULL if none. +Also returns NULL if the surface is not a win32 surface.

+

A call to cairo_surface_flush() is required before using the HDC to +ensure that all pending drawing operations are finished and to +restore any temporary modification cairo has made to its state. A +call to cairo_surface_mark_dirty() is required after the state or +the content of the HDC has been modified.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

HDC or NULL if no HDC available.

+

+
+

Since 1.2

+
+
+
+

cairo_win32_surface_get_image ()

+
cairo_surface_t *
+cairo_win32_surface_get_image (cairo_surface_t *surface);
+

Returns a cairo_surface_t image surface that refers to the same bits +as the DIB of the Win32 surface. If the passed-in win32 surface +is not a DIB surface, NULL is returned.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

a cairo_surface_t (owned by the win32 cairo_surface_t), +or NULL if the win32 surface is not a DIB.

+

+
+

Since 1.4

+
+
+
+

Types and Values

+
+

CAIRO_HAS_WIN32_SURFACE

+
#define CAIRO_HAS_WIN32_SURFACE 1
+
+

Defined if the Microsoft Windows surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.0

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-XCB-Surfaces.html b/doc/public/html/cairo-XCB-Surfaces.html new file mode 100644 index 000000000..66e668f29 --- /dev/null +++ b/doc/public/html/cairo-XCB-Surfaces.html @@ -0,0 +1,672 @@ + + + + +Cairo: A Vector Graphics Library: XCB Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

XCB Surfaces

+

XCB Surfaces — X Window System rendering using the XCB library

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_xcb_surface_create () +
+cairo_surface_t * + +cairo_xcb_surface_create_for_bitmap () +
+cairo_surface_t * + +cairo_xcb_surface_create_with_xrender_format () +
+void + +cairo_xcb_surface_set_size () +
+void + +cairo_xcb_surface_set_drawable () +
+xcb_connection_t * + +cairo_xcb_device_get_connection () +
+void + +cairo_xcb_device_debug_cap_xrender_version () +
+void + +cairo_xcb_device_debug_cap_xshm_version () +
+int + +cairo_xcb_device_debug_get_precision () +
+void + +cairo_xcb_device_debug_set_precision () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineCAIRO_HAS_XCB_SURFACE
#defineCAIRO_HAS_XCB_SHM_FUNCTIONS
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The XCB surface is used to render cairo graphics to X Window System +windows and pixmaps using the XCB library.

+

Note that the XCB surface automatically takes advantage of the X render +extension if it is available.

+
+
+

Functions

+
+

cairo_xcb_surface_create ()

+
cairo_surface_t *
+cairo_xcb_surface_create (xcb_connection_t *connection,
+                          xcb_drawable_t drawable,
+                          xcb_visualtype_t *visual,
+                          int width,
+                          int height);
+

Creates an XCB surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided visual.

+

Note: If drawable + is a Window, then the function +cairo_xcb_surface_set_size() must be called whenever the size of the +window changes.

+

When drawable + is a Window containing child windows then drawing to +the created surface will be clipped by those child windows. When +the created surface is used as a source, the contents of the +children will be included.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

connection

an XCB connection

 

drawable

an XCB drawable

 

visual

the visual to use for drawing to drawable +. The depth +of the visual must match the depth of the drawable. +Currently, only TrueColor visuals are fully supported.

 

width

the current width of drawable +

 

height

the current height of drawable +

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_xcb_surface_create_for_bitmap ()

+
cairo_surface_t *
+cairo_xcb_surface_create_for_bitmap (xcb_connection_t *connection,
+                                     xcb_screen_t *screen,
+                                     xcb_pixmap_t bitmap,
+                                     int width,
+                                     int height);
+

Creates an XCB surface that draws to the given bitmap. +This will be drawn to as a CAIRO_FORMAT_A1 object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

connection

an XCB connection

 

screen

the XCB screen associated with bitmap +

 

bitmap

an XCB drawable (a Pixmap with depth 1)

 

width

the current width of bitmap +

 

height

the current height of bitmap +

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_xcb_surface_create_with_xrender_format ()

+
cairo_surface_t *
+cairo_xcb_surface_create_with_xrender_format
+                               (xcb_connection_t *connection,
+                                xcb_screen_t *screen,
+                                xcb_drawable_t drawable,
+                                xcb_render_pictforminfo_t *format,
+                                int width,
+                                int height);
+

Creates an XCB surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided picture format.

+

Note: If drawable + is a Window, then the function +cairo_xcb_surface_set_size() must be called whenever the size of the +window changes.

+

When drawable + is a Window containing child windows then drawing to +the created surface will be clipped by those child windows. When +the created surface is used as a source, the contents of the +children will be included.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

connection

an XCB connection

 

screen

the XCB screen associated with drawable +

 

drawable

an XCB drawable

 

format

the picture format to use for drawing to drawable +. The +depth of format +mush match the depth of the drawable.

 

width

the current width of drawable +

 

height

the current height of drawable +

 
+
+
+

Returns

+

a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this.

+

+
+

Since 1.12

+
+
+
+

cairo_xcb_surface_set_size ()

+
void
+cairo_xcb_surface_set_size (cairo_surface_t *surface,
+                            int width,
+                            int height);
+

Informs cairo of the new size of the XCB drawable underlying the +surface. For a surface created for a window (rather than a pixmap), +this function must be called each time the size of the window +changes. (For a subwindow, you are normally resizing the window +yourself, but for a toplevel window, it is necessary to listen for +ConfigureNotify events.)

+

A pixmap can never change size, so it is never necessary to call +this function on a surface created for a pixmap.

+

If cairo_surface_flush() wasn't called, some pending operations +might be discarded.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t for the XCB backend

 

width

the new width of the surface

 

height

the new height of the surface

 
+
+

Since 1.12

+
+
+
+

cairo_xcb_surface_set_drawable ()

+
void
+cairo_xcb_surface_set_drawable (cairo_surface_t *surface,
+                                xcb_drawable_t drawable,
+                                int width,
+                                int height);
+

Informs cairo of the new drawable and size of the XCB drawable underlying the +surface.

+

If cairo_surface_flush() wasn't called, some pending operations +might be discarded.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t for the XCB backend

 

drawable

the new drawable of the surface

 

width

the new width of the surface

 

height

the new height of the surface

 
+
+

Since 1.12

+
+
+
+

cairo_xcb_device_get_connection ()

+
xcb_connection_t *
+cairo_xcb_device_get_connection (cairo_device_t *device);
+

Get the connection for the XCB device.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t for the XCB backend

 
+
+
+

Returns

+

the xcb_connection_t for the connection

+

+
+

Since 1.12

+
+
+
+

cairo_xcb_device_debug_cap_xrender_version ()

+
void
+cairo_xcb_device_debug_cap_xrender_version
+                               (cairo_device_t *device,
+                                int major_version,
+                                int minor_version);
+

Restricts all future XCB surfaces for this devices to the specified version +of the RENDER extension. This function exists solely for debugging purpose. +It let's you find out how cairo would behave with an older version of +the RENDER extension.

+

Use the special values -1 and -1 for disabling the RENDER extension.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

device

a cairo_device_t for the XCB backend

 

major_version

major version to restrict to

 

minor_version

minor version to restrict to

 
+
+

Since 1.12

+
+
+
+

cairo_xcb_device_debug_cap_xshm_version ()

+
void
+cairo_xcb_device_debug_cap_xshm_version
+                               (cairo_device_t *device,
+                                int major_version,
+                                int minor_version);
+

Restricts all future XCB surfaces for this devices to the specified version +of the SHM extension. This function exists solely for debugging purpose. +It let's you find out how cairo would behave with an older version of +the SHM extension.

+

Use the special values -1 and -1 for disabling the SHM extension.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

device

a cairo_device_t for the XCB backend

 

major_version

major version to restrict to

 

minor_version

minor version to restrict to

 
+
+

Since 1.12

+
+
+
+

cairo_xcb_device_debug_get_precision ()

+
int
+cairo_xcb_device_debug_get_precision (cairo_device_t *device);
+

Get the Xrender precision mode.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t for the XCB backend

 
+
+
+

Returns

+

the render precision mode

+

+
+

Since 1.12

+
+
+
+

cairo_xcb_device_debug_set_precision ()

+
void
+cairo_xcb_device_debug_set_precision (cairo_device_t *device,
+                                      int precision);
+

Render supports two modes of precision when rendering trapezoids. Set +the precision to the desired mode.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

device

a cairo_device_t for the XCB backend

 

precision

the precision to use

 
+
+

Since 1.12

+
+
+
+

Types and Values

+
+

CAIRO_HAS_XCB_SURFACE

+
#define CAIRO_HAS_XCB_SURFACE 1
+
+

Defined if the xcb surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.12

+
+
+
+

CAIRO_HAS_XCB_SHM_FUNCTIONS

+
#define CAIRO_HAS_XCB_SHM_FUNCTIONS 1
+
+

+

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-XLib-Surfaces.html b/doc/public/html/cairo-XLib-Surfaces.html new file mode 100644 index 000000000..b393e8c27 --- /dev/null +++ b/doc/public/html/cairo-XLib-Surfaces.html @@ -0,0 +1,730 @@ + + + + +Cairo: A Vector Graphics Library: XLib Surfaces + + + + + + + + + + + + + + + + +
+
+
+ + +
+

XLib Surfaces

+

XLib Surfaces — X Window System rendering using XLib

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_xlib_surface_create () +
+cairo_surface_t * + +cairo_xlib_surface_create_for_bitmap () +
+void + +cairo_xlib_surface_set_size () +
+Display * + +cairo_xlib_surface_get_display () +
+Screen * + +cairo_xlib_surface_get_screen () +
+void + +cairo_xlib_surface_set_drawable () +
+Drawable + +cairo_xlib_surface_get_drawable () +
+Visual * + +cairo_xlib_surface_get_visual () +
+int + +cairo_xlib_surface_get_width () +
+int + +cairo_xlib_surface_get_height () +
+int + +cairo_xlib_surface_get_depth () +
+void + +cairo_xlib_device_debug_cap_xrender_version () +
+int + +cairo_xlib_device_debug_get_precision () +
+void + +cairo_xlib_device_debug_set_precision () +
+
+
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_XLIB_SURFACE
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The XLib surface is used to render cairo graphics to X Window System +windows and pixmaps using the XLib library.

+

Note that the XLib surface automatically takes advantage of X render extension +if it is available.

+
+
+

Functions

+
+

cairo_xlib_surface_create ()

+
cairo_surface_t *
+cairo_xlib_surface_create (Display *dpy,
+                           Drawable drawable,
+                           Visual *visual,
+                           int width,
+                           int height);
+

Creates an Xlib surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided visual.

+

Note: If drawable + is a Window, then the function +cairo_xlib_surface_set_size() must be called whenever the size of the +window changes.

+

When drawable + is a Window containing child windows then drawing to +the created surface will be clipped by those child windows. When +the created surface is used as a source, the contents of the +children will be included.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

dpy

an X Display

 

drawable

an X Drawable, (a Pixmap or a Window)

 

visual

the visual to use for drawing to drawable +. The depth +of the visual must match the depth of the drawable. +Currently, only TrueColor visuals are fully supported.

 

width

the current width of drawable +.

 

height

the current height of drawable +.

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.0

+
+
+
+

cairo_xlib_surface_create_for_bitmap ()

+
cairo_surface_t *
+cairo_xlib_surface_create_for_bitmap (Display *dpy,
+                                      Pixmap bitmap,
+                                      Screen *screen,
+                                      int width,
+                                      int height);
+

Creates an Xlib surface that draws to the given bitmap. +This will be drawn to as a CAIRO_FORMAT_A1 object.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

dpy

an X Display

 

bitmap

an X Drawable, (a depth-1 Pixmap)

 

screen

the X Screen associated with bitmap +

 

width

the current width of bitmap +.

 

height

the current height of bitmap +.

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.0

+
+
+
+

cairo_xlib_surface_set_size ()

+
void
+cairo_xlib_surface_set_size (cairo_surface_t *surface,
+                             int width,
+                             int height);
+

Informs cairo of the new size of the X Drawable underlying the +surface. For a surface created for a Window (rather than a Pixmap), +this function must be called each time the size of the window +changes. (For a subwindow, you are normally resizing the window +yourself, but for a toplevel window, it is necessary to listen for +ConfigureNotify events.)

+

A Pixmap can never change size, so it is never necessary to call +this function on a surface created for a Pixmap.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t for the XLib backend

 

width

the new width of the surface

 

height

the new height of the surface

 
+
+

Since 1.0

+
+
+
+

cairo_xlib_surface_get_display ()

+
Display *
+cairo_xlib_surface_get_display (cairo_surface_t *surface);
+

Get the X Display for the underlying X Drawable.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the display.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_surface_get_screen ()

+
Screen *
+cairo_xlib_surface_get_screen (cairo_surface_t *surface);
+

Get the X Screen for the underlying X Drawable.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the screen.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_surface_set_drawable ()

+
void
+cairo_xlib_surface_set_drawable (cairo_surface_t *surface,
+                                 Drawable drawable,
+                                 int width,
+                                 int height);
+

Informs cairo of a new X Drawable underlying the +surface. The drawable must match the display, screen +and format of the existing drawable or the application +will get X protocol errors and will probably terminate. +No checks are done by this function to ensure this +compatibility.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t for the XLib backend

 

drawable

the new drawable for the surface

 

width

the width of the new drawable

 

height

the height of the new drawable

 
+
+

Since 1.0

+
+
+
+

cairo_xlib_surface_get_drawable ()

+
Drawable
+cairo_xlib_surface_get_drawable (cairo_surface_t *surface);
+

Get the underlying X Drawable used for the surface.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the drawable.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_surface_get_visual ()

+
Visual *
+cairo_xlib_surface_get_visual (cairo_surface_t *surface);
+

Gets the X Visual associated with surface +, suitable for use with the +underlying X Drawable. If surface + was created by +cairo_xlib_surface_create(), the return value is the Visual passed to that +constructor.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the Visual or NULL if there is no appropriate Visual for +surface +.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_surface_get_width ()

+
int
+cairo_xlib_surface_get_width (cairo_surface_t *surface);
+

Get the width of the X Drawable underlying the surface in pixels.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the width of the surface in pixels.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_surface_get_height ()

+
int
+cairo_xlib_surface_get_height (cairo_surface_t *surface);
+

Get the height of the X Drawable underlying the surface in pixels.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the height of the surface in pixels.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_surface_get_depth ()

+
int
+cairo_xlib_surface_get_depth (cairo_surface_t *surface);
+

Get the number of bits used to represent each pixel value.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_xlib_surface_t

 
+
+
+

Returns

+

the depth of the surface in bits.

+

+
+

Since 1.2

+
+
+
+

cairo_xlib_device_debug_cap_xrender_version ()

+
void
+cairo_xlib_device_debug_cap_xrender_version
+                               (cairo_device_t *device,
+                                int major_version,
+                                int minor_version);
+

Restricts all future Xlib surfaces for this devices to the specified version +of the RENDER extension. This function exists solely for debugging purpose. +It lets you find out how cairo would behave with an older version of +the RENDER extension.

+

Use the special values -1 and -1 for disabling the RENDER extension.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

device

a cairo_device_t for the Xlib backend

 

major_version

major version to restrict to

 

minor_version

minor version to restrict to

 
+
+

Since 1.12

+
+
+
+

cairo_xlib_device_debug_get_precision ()

+
int
+cairo_xlib_device_debug_get_precision (cairo_device_t *device);
+

Get the Xrender precision mode.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t for the Xlib backend

 
+
+
+

Returns

+

the render precision mode

+

+
+

Since 1.12

+
+
+
+

cairo_xlib_device_debug_set_precision ()

+
void
+cairo_xlib_device_debug_set_precision (cairo_device_t *device,
+                                       int precision);
+

Render supports two modes of precision when rendering trapezoids. Set +the precision to the desired mode.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

device

a cairo_device_t for the Xlib backend

 

precision

the precision to use

 
+
+

Since 1.12

+
+
+
+

Types and Values

+
+

CAIRO_HAS_XLIB_SURFACE

+
#define CAIRO_HAS_XLIB_SURFACE 1
+
+

Defined if the Xlib surface backend is available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.0

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-XLib-XRender-Backend.html b/doc/public/html/cairo-XLib-XRender-Backend.html new file mode 100644 index 000000000..17d4f4d09 --- /dev/null +++ b/doc/public/html/cairo-XLib-XRender-Backend.html @@ -0,0 +1,217 @@ + + + + +Cairo: A Vector Graphics Library: XLib-XRender Backend + + + + + + + + + + + + + + + + +
+
+
+ + +
+

XLib-XRender Backend

+

XLib-XRender Backend — X Window System rendering using XLib and the X Render extension

+
+
+

Functions

+
++++ + + + + + + + + + + +
+cairo_surface_t * + +cairo_xlib_surface_create_with_xrender_format () +
+XRenderPictFormat * + +cairo_xlib_surface_get_xrender_format () +
+
+
+

Types and Values

+
++++ + + + + +
#defineCAIRO_HAS_XLIB_XRENDER_SURFACE
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The XLib surface is used to render cairo graphics to X Window System +windows and pixmaps using the XLib and Xrender libraries.

+

Note that the XLib surface automatically takes advantage of X Render extension +if it is available.

+
+
+

Functions

+
+

cairo_xlib_surface_create_with_xrender_format ()

+
cairo_surface_t *
+cairo_xlib_surface_create_with_xrender_format
+                               (Display *dpy,
+                                Drawable drawable,
+                                Screen *screen,
+                                XRenderPictFormat *format,
+                                int width,
+                                int height);
+

Creates an Xlib surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided picture format.

+

Note: If drawable + is a Window, then the function +cairo_xlib_surface_set_size() must be called whenever the size of the +window changes.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

dpy

an X Display

 

drawable

an X Drawable, (a Pixmap or a Window)

 

screen

the X Screen associated with drawable +

 

format

the picture format to use for drawing to drawable +. The depth +of format +must match the depth of the drawable.

 

width

the current width of drawable +.

 

height

the current height of drawable +.

 
+
+
+

Returns

+

the newly created surface

+

+
+

Since 1.0

+
+
+
+

cairo_xlib_surface_get_xrender_format ()

+
XRenderPictFormat *
+cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface);
+

Gets the X Render picture format that surface + uses for rendering with the +X Render extension. If the surface was created by +cairo_xlib_surface_create_with_xrender_format() originally, the return +value is the format passed to that constructor.

+
+

Parameters

+
+++++ + + + + + +

surface

an xlib surface

 
+
+
+

Returns

+

the XRenderPictFormat* associated with surface +, +or NULL if the surface is not an xlib surface +or if the X Render extension is not available.

+

+
+

Since 1.6

+
+
+
+

Types and Values

+
+

CAIRO_HAS_XLIB_XRENDER_SURFACE

+
#define CAIRO_HAS_XLIB_XRENDER_SURFACE 1
+
+

Defined if the XLib/XRender surface functions are available. +This macro can be used to conditionally compile backend-specific code.

+

Since 1.6

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-device-t.html b/doc/public/html/cairo-cairo-device-t.html new file mode 100644 index 000000000..36dc5e068 --- /dev/null +++ b/doc/public/html/cairo-cairo-device-t.html @@ -0,0 +1,850 @@ + + + + +Cairo: A Vector Graphics Library: cairo_device_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_device_t

+

cairo_device_t — interface to underlying rendering system

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_device_t * + +cairo_device_reference () +
+void + +cairo_device_destroy () +
+cairo_status_t + +cairo_device_status () +
+void + +cairo_device_finish () +
+void + +cairo_device_flush () +
+cairo_device_type_t + +cairo_device_get_type () +
unsigned int + +cairo_device_get_reference_count () +
+cairo_status_t + +cairo_device_set_user_data () +
+void * + +cairo_device_get_user_data () +
+cairo_status_t + +cairo_device_acquire () +
+void + +cairo_device_release () +
+double + +cairo_device_observer_elapsed () +
+double + +cairo_device_observer_fill_elapsed () +
+double + +cairo_device_observer_glyphs_elapsed () +
+double + +cairo_device_observer_mask_elapsed () +
+double + +cairo_device_observer_paint_elapsed () +
+cairo_status_t + +cairo_device_observer_print () +
+double + +cairo_device_observer_stroke_elapsed () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
typedefcairo_device_t
enumcairo_device_type_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

Devices are the abstraction Cairo employs for the rendering system +used by a cairo_surface_t. You can get the device of a surface using +cairo_surface_get_device().

+

Devices are created using custom functions specific to the rendering +system you want to use. See the documentation for the surface types +for those functions.

+

An important function that devices fulfill is sharing access to the +rendering system between Cairo and your application. If you want to +access a device directly that you used to draw to with Cairo, you must +first call cairo_device_flush() to ensure that Cairo finishes all +operations on the device and resets it to a clean state.

+

Cairo also provides the functions cairo_device_acquire() and +cairo_device_release() to synchronize access to the rendering system +in a multithreaded environment. This is done internally, but can also +be used by applications.

+

Putting this all together, a function that works with devices should +look something like this:

+
+void
+my_device_modifying_function (cairo_device_t *device)
+{
+  cairo_status_t status;
+
+  // Ensure the device is properly reset
+  cairo_device_flush (device);
+  // Try to acquire the device
+  status = cairo_device_acquire (device);
+  if (status != CAIRO_STATUS_SUCCESS) {
+    printf ("Failed to acquire the device: %s\n", cairo_status_to_string (status));
+    return;
+  }
+
+  // Do the custom operations on the device here.
+  // But do not call any Cairo functions that might acquire devices.
+  
+  // Release the device when done.
+  cairo_device_release (device);
+}
+
+

Please refer to the documentation of each backend for +additional usage requirements, guarantees provided, and +interactions with existing surface API of the device functions for +surfaces of that type. +

+
+
+

Functions

+
+

cairo_device_reference ()

+
cairo_device_t *
+cairo_device_reference (cairo_device_t *device);
+

Increases the reference count on device + by one. This prevents +device + from being destroyed until a matching call to +cairo_device_destroy() is made.

+

The number of references to a cairo_device_t can be get using +cairo_device_get_reference_count().

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+
+

Returns

+

the referenced cairo_device_t.

+

+
+

Since 1.10

+
+
+
+

cairo_device_destroy ()

+
void
+cairo_device_destroy (cairo_device_t *device);
+

Decreases the reference count on device + by one. If the result is +zero, then device + and all associated resources are freed. See +cairo_device_reference().

+

This function may acquire devices if the last reference was dropped.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+

Since 1.10

+
+
+
+

cairo_device_status ()

+
cairo_status_t
+cairo_device_status (cairo_device_t *device);
+

Checks whether an error has previously occurred for this +device.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS on success or an error code if +the device is in an error state.

+

+
+

Since 1.10

+
+
+
+

cairo_device_finish ()

+
void
+cairo_device_finish (cairo_device_t *device);
+

This function finishes the device and drops all references to +external resources. All surfaces, fonts and other objects created +for this device + will be finished, too. +Further operations on the device + will not affect the device + but +will instead trigger a CAIRO_STATUS_DEVICE_FINISHED error.

+

When the last call to cairo_device_destroy() decreases the +reference count to zero, cairo will call cairo_device_finish() if +it hasn't been called already, before freeing the resources +associated with the device.

+

This function may acquire devices.

+
+

Parameters

+
+++++ + + + + + +

device

the cairo_device_t to finish

 
+
+

Since 1.10

+
+
+
+

cairo_device_flush ()

+
void
+cairo_device_flush (cairo_device_t *device);
+

Finish any pending operations for the device and also restore any +temporary modifications cairo has made to the device's state. +This function must be called before switching from using the +device with Cairo to operating on it directly with native APIs. +If the device doesn't support direct access, then this function +does nothing.

+

This function may acquire devices.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+

Since 1.10

+
+
+
+

cairo_device_get_type ()

+
cairo_device_type_t
+cairo_device_get_type (cairo_device_t *device);
+

This function returns the type of the device. See cairo_device_type_t +for available types.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+
+

Returns

+

The type of device +.

+

+
+

Since 1.10

+
+
+
+

cairo_device_get_reference_count ()

+
unsigned int
+cairo_device_get_reference_count (cairo_device_t *device);
+

Returns the current reference count of device +.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+
+

Returns

+

the current reference count of device +. If the +object is a nil object, 0 will be returned.

+

+
+

Since 1.10

+
+
+
+

cairo_device_set_user_data ()

+
cairo_status_t
+cairo_device_set_user_data (cairo_device_t *device,
+                            const cairo_user_data_key_t *key,
+                            void *user_data,
+                            cairo_destroy_func_t destroy);
+

Attach user data to device +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

device

a cairo_device_t

 

key

the address of a cairo_user_data_key_t to attach the user data to

 

user_data

the user data to attach to the cairo_device_t

 

destroy

a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key.

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.10

+
+
+
+

cairo_device_get_user_data ()

+
void *
+cairo_device_get_user_data (cairo_device_t *device,
+                            const cairo_user_data_key_t *key);
+

Return user data previously attached to device + using the +specified key. If no user data has been attached with the given +key this function returns NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

device

a cairo_device_t

 

key

the address of the cairo_user_data_key_t the user data was +attached to

 
+
+
+

Returns

+

the user data previously attached or NULL.

+

+
+

Since 1.10

+
+
+
+

cairo_device_acquire ()

+
cairo_status_t
+cairo_device_acquire (cairo_device_t *device);
+

Acquires the device + for the current thread. This function will block +until no other thread has acquired the device.

+

If the return value is CAIRO_STATUS_SUCCESS, you successfully acquired the +device. From now on your thread owns the device and no other thread will be +able to acquire it until a matching call to cairo_device_release(). It is +allowed to recursively acquire the device multiple times from the same +thread.

+

You must never acquire two different devices at the same time +unless this is explicitly allowed. Otherwise the possibility of deadlocks +exist. + +As various Cairo functions can acquire devices when called, these functions +may also cause deadlocks when you call them with an acquired device. So you +must not have a device acquired when calling them. These functions are +marked in the documentation. +

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS on success or an error code if +the device is in an error state and could not be +acquired. After a successful call to cairo_device_acquire(), +a matching call to cairo_device_release() is required.

+

+
+

Since 1.10

+
+
+
+

cairo_device_release ()

+
void
+cairo_device_release (cairo_device_t *device);
+

Releases a device + previously acquired using cairo_device_acquire(). See +that function for details.

+
+

Parameters

+
+++++ + + + + + +

device

a cairo_device_t

 
+
+

Since 1.10

+
+
+
+

cairo_device_observer_elapsed ()

+
double
+cairo_device_observer_elapsed (cairo_device_t *device);
+

+

+
+

Returns

+

+
+
+
+
+

cairo_device_observer_fill_elapsed ()

+
double
+cairo_device_observer_fill_elapsed (cairo_device_t *device);
+

+

+
+

Returns

+

+
+
+
+
+

cairo_device_observer_glyphs_elapsed ()

+
double
+cairo_device_observer_glyphs_elapsed (cairo_device_t *device);
+

+

+
+

Returns

+

+
+
+
+
+

cairo_device_observer_mask_elapsed ()

+
double
+cairo_device_observer_mask_elapsed (cairo_device_t *device);
+

+

+
+

Returns

+

+
+
+
+
+

cairo_device_observer_paint_elapsed ()

+
double
+cairo_device_observer_paint_elapsed (cairo_device_t *device);
+

+

+
+

Returns

+

+
+
+
+
+

cairo_device_observer_print ()

+
cairo_status_t
+cairo_device_observer_print (cairo_device_t *device,
+                             cairo_write_func_t write_func,
+                             void *closure);
+

+

+
+

Returns

+

+
+
+
+
+

cairo_device_observer_stroke_elapsed ()

+
double
+cairo_device_observer_stroke_elapsed (cairo_device_t *device);
+

+

+
+

Returns

+

+
+
+
+
+

Types and Values

+
+

cairo_device_t

+
typedef struct _cairo_device cairo_device_t;
+
+

A cairo_device_t represents the driver interface for drawing +operations to a cairo_surface_t. There are different subtypes of +cairo_device_t for different drawing backends; for example, +cairo_egl_device_create() creates a device that wraps an EGL display and +context.

+

The type of a device can be queried with cairo_device_get_type().

+

Memory management of cairo_device_t is done with +cairo_device_reference() and cairo_device_destroy().

+

Since 1.10

+
+
+
+

enum cairo_device_type_t

+

cairo_device_type_t is used to describe the type of a given +device. The devices types are also known as "backends" within cairo.

+

The device type can be queried with cairo_device_get_type()

+

The various cairo_device_t functions can be used with devices of +any type, but some backends also provide type-specific functions +that must only be called with a device of the appropriate +type. These functions have names that begin with +cairo_type_device such as +cairo_xcb_device_debug_cap_xrender_version().

+

The behavior of calling a type-specific function with a device of +the wrong type is undefined.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_DEVICE_TYPE_DRM

+

The device is of type Direct Render Manager, since 1.10

+
 

CAIRO_DEVICE_TYPE_GL

+

The device is of type OpenGL, since 1.10

+
 

CAIRO_DEVICE_TYPE_SCRIPT

+

The device is of type script, since 1.10

+
 

CAIRO_DEVICE_TYPE_XCB

+

The device is of type xcb, since 1.10

+
 

CAIRO_DEVICE_TYPE_XLIB

+

The device is of type xlib, since 1.10

+
 

CAIRO_DEVICE_TYPE_XML

+

The device is of type XML, since 1.10

+
 

CAIRO_DEVICE_TYPE_COGL

+

The device is of type cogl, since 1.12

+
 

CAIRO_DEVICE_TYPE_WIN32

+

The device is of type win32, since 1.12

+
 

CAIRO_DEVICE_TYPE_INVALID

+

The device is invalid, since 1.10

+
 
+
+

Since 1.10

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-font-face-t.html b/doc/public/html/cairo-cairo-font-face-t.html new file mode 100644 index 000000000..005e82e1f --- /dev/null +++ b/doc/public/html/cairo-cairo-font-face-t.html @@ -0,0 +1,489 @@ + + + + +Cairo: A Vector Graphics Library: cairo_font_face_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_font_face_t

+

cairo_font_face_t — Base class for font faces

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_font_face_t * + +cairo_font_face_reference () +
+void + +cairo_font_face_destroy () +
+cairo_status_t + +cairo_font_face_status () +
+cairo_font_type_t + +cairo_font_face_get_type () +
unsigned int + +cairo_font_face_get_reference_count () +
+cairo_status_t + +cairo_font_face_set_user_data () +
+void * + +cairo_font_face_get_user_data () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
typedefcairo_font_face_t
enumcairo_font_type_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

cairo_font_face_t represents a particular font at a particular weight, +slant, and other characteristic but no size, transformation, or size.

+

Font faces are created using font-backend-specific +constructors, typically of the form +cairo_backend_font_face_create(), +or implicitly using the toy text API by way of +cairo_select_font_face(). The resulting face can be accessed using +cairo_get_font_face().

+
+
+

Functions

+
+

cairo_font_face_reference ()

+
cairo_font_face_t *
+cairo_font_face_reference (cairo_font_face_t *font_face);
+

Increases the reference count on font_face + by one. This prevents +font_face + from being destroyed until a matching call to +cairo_font_face_destroy() is made.

+

The number of references to a cairo_font_face_t can be get using +cairo_font_face_get_reference_count().

+
+

Parameters

+
+++++ + + + + + +

font_face

a cairo_font_face_t, (may be NULL in which case this +function does nothing).

 
+
+
+

Returns

+

the referenced cairo_font_face_t.

+

+
+

Since 1.0

+
+
+
+

cairo_font_face_destroy ()

+
void
+cairo_font_face_destroy (cairo_font_face_t *font_face);
+

Decreases the reference count on font_face + by one. If the result +is zero, then font_face + and all associated resources are freed. +See cairo_font_face_reference().

+
+

Parameters

+
+++++ + + + + + +

font_face

a cairo_font_face_t

 
+
+

Since 1.0

+
+
+
+

cairo_font_face_status ()

+
cairo_status_t
+cairo_font_face_status (cairo_font_face_t *font_face);
+

Checks whether an error has previously occurred for this +font face

+
+

Parameters

+
+++++ + + + + + +

font_face

a cairo_font_face_t

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or another error such as +CAIRO_STATUS_NO_MEMORY.

+

+
+

Since 1.0

+
+
+
+

cairo_font_face_get_type ()

+
cairo_font_type_t
+cairo_font_face_get_type (cairo_font_face_t *font_face);
+

This function returns the type of the backend used to create +a font face. See cairo_font_type_t for available types.

+
+

Parameters

+
+++++ + + + + + +

font_face

a font face

 
+
+
+

Returns

+

The type of font_face +.

+

+
+

Since 1.2

+
+
+
+

cairo_font_face_get_reference_count ()

+
unsigned int
+cairo_font_face_get_reference_count (cairo_font_face_t *font_face);
+

Returns the current reference count of font_face +.

+
+

Parameters

+
+++++ + + + + + +

font_face

a cairo_font_face_t

 
+
+
+

Returns

+

the current reference count of font_face +. If the +object is a nil object, 0 will be returned.

+

+
+

Since 1.4

+
+
+
+

cairo_font_face_set_user_data ()

+
cairo_status_t
+cairo_font_face_set_user_data (cairo_font_face_t *font_face,
+                               const cairo_user_data_key_t *key,
+                               void *user_data,
+                               cairo_destroy_func_t destroy);
+

Attach user data to font_face +. To remove user data from a font face, +call this function with the key that was used to set it and NULL +for data +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

font_face

a cairo_font_face_t

 

key

the address of a cairo_user_data_key_t to attach the user data to

 

user_data

the user data to attach to the font face

 

destroy

a cairo_destroy_func_t which will be called when the +font face is destroyed or when new user data is attached using the +same key.

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.0

+
+
+
+

cairo_font_face_get_user_data ()

+
void *
+cairo_font_face_get_user_data (cairo_font_face_t *font_face,
+                               const cairo_user_data_key_t *key);
+

Return user data previously attached to font_face + using the specified +key. If no user data has been attached with the given key this +function returns NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font_face

a cairo_font_face_t

 

key

the address of the cairo_user_data_key_t the user data was +attached to

 
+
+
+

Returns

+

the user data previously attached or NULL.

+

+
+

Since 1.0

+
+
+
+

Types and Values

+
+

cairo_font_face_t

+
typedef struct _cairo_font_face cairo_font_face_t;
+
+

A cairo_font_face_t specifies all aspects of a font other +than the size or font matrix (a font matrix is used to distort +a font by sheering it or scaling it unequally in the two +directions) . A font face can be set on a cairo_t by using +cairo_set_font_face(); the size and font matrix are set with +cairo_set_font_size() and cairo_set_font_matrix().

+

There are various types of font faces, depending on the +font backend they use. The type of a +font face can be queried using cairo_font_face_get_type().

+

Memory management of cairo_font_face_t is done with +cairo_font_face_reference() and cairo_font_face_destroy().

+

Since 1.0

+
+
+
+

enum cairo_font_type_t

+

cairo_font_type_t is used to describe the type of a given font +face or scaled font. The font types are also known as "font +backends" within cairo.

+

The type of a font face is determined by the function used to +create it, which will generally be of the form +cairo_type_font_face_create(). +The font face type can be queried with cairo_font_face_get_type()

+

The various cairo_font_face_t functions can be used with a font face +of any type.

+

The type of a scaled font is determined by the type of the font +face passed to cairo_scaled_font_create(). The scaled font type can +be queried with cairo_scaled_font_get_type()

+

The various cairo_scaled_font_t functions can be used with scaled +fonts of any type, but some font backends also provide +type-specific functions that must only be called with a scaled font +of the appropriate type. These functions have names that begin with +cairo_type_scaled_font() +such as cairo_ft_scaled_font_lock_face().

+

The behavior of calling a type-specific function with a scaled font +of the wrong type is undefined.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_FONT_TYPE_TOY

+

The font was created using cairo's toy font api (Since: 1.2)

+
 

CAIRO_FONT_TYPE_FT

+

The font is of type FreeType (Since: 1.2)

+
 

CAIRO_FONT_TYPE_WIN32

+

The font is of type Win32 (Since: 1.2)

+
 

CAIRO_FONT_TYPE_QUARTZ

+

The font is of type Quartz (Since: 1.6, in 1.2 and +1.4 it was named CAIRO_FONT_TYPE_ATSUI)

+
 

CAIRO_FONT_TYPE_USER

+

The font was create using cairo's user font api (Since: 1.8)

+
 
+
+

Since 1.2

+
+
+
+

See Also

+

cairo_scaled_font_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-font-options-t.html b/doc/public/html/cairo-cairo-font-options-t.html new file mode 100644 index 000000000..a4235d42a --- /dev/null +++ b/doc/public/html/cairo-cairo-font-options-t.html @@ -0,0 +1,869 @@ + + + + +Cairo: A Vector Graphics Library: cairo_font_options_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_font_options_t

+

cairo_font_options_t — How a font should be rendered

+
+
+

Functions

+ +
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + +
typedefcairo_font_options_t
enumcairo_subpixel_order_t
enumcairo_hint_style_t
enumcairo_hint_metrics_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The font options specify how fonts should be rendered. Most of the +time the font options implied by a surface are just right and do not +need any changes, but for pixel-based targets tweaking font options +may result in superior output on a particular display.

+
+
+

Functions

+
+

cairo_font_options_create ()

+
cairo_font_options_t *
+cairo_font_options_create (void);
+

Allocates a new font options object with all options initialized + to default values.

+
+

Returns

+

a newly allocated cairo_font_options_t. Free with +cairo_font_options_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_font_options_status().

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_copy ()

+
cairo_font_options_t *
+cairo_font_options_copy (const cairo_font_options_t *original);
+

Allocates a new font options object copying the option values from + original +.

+
+

Parameters

+
+++++ + + + + + +

original

a cairo_font_options_t

 
+
+
+

Returns

+

a newly allocated cairo_font_options_t. Free with +cairo_font_options_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_font_options_status().

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_destroy ()

+
void
+cairo_font_options_destroy (cairo_font_options_t *options);
+

Destroys a cairo_font_options_t object created with +cairo_font_options_create() or cairo_font_options_copy().

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+

Since 1.0

+
+
+
+

cairo_font_options_status ()

+
cairo_status_t
+cairo_font_options_status (cairo_font_options_t *options);
+

Checks whether an error has previously occurred for this +font options object

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+ +

Since 1.0

+
+
+
+

cairo_font_options_merge ()

+
void
+cairo_font_options_merge (cairo_font_options_t *options,
+                          const cairo_font_options_t *other);
+

Merges non-default options from other + into options +, replacing +existing values. This operation can be thought of as somewhat +similar to compositing other + onto options + with the operation +of CAIRO_OPERATOR_OVER.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t

 

other

another cairo_font_options_t

 
+
+

Since 1.0

+
+
+
+

cairo_font_options_hash ()

+
unsigned long
+cairo_font_options_hash (const cairo_font_options_t *options);
+

Compute a hash for the font options object; this value will +be useful when storing an object containing a cairo_font_options_t +in a hash table.

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+
+

Returns

+

the hash value for the font options object. +The return value can be cast to a 32-bit type if a +32-bit hash value is needed.

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_equal ()

+
cairo_bool_t
+cairo_font_options_equal (const cairo_font_options_t *options,
+                          const cairo_font_options_t *other);
+

Compares two font options objects for equality.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t

 

other

another cairo_font_options_t

 
+
+
+

Returns

+

TRUE if all fields of the two font options objects match. +Note that this function will return FALSE if either object is in +error.

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_set_antialias ()

+
void
+cairo_font_options_set_antialias (cairo_font_options_t *options,
+                                  cairo_antialias_t antialias);
+

Sets the antialiasing mode for the font options object. This +specifies the type of antialiasing to do when rendering text.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t

 

antialias

the new antialiasing mode

 
+
+

Since 1.0

+
+
+
+

cairo_font_options_get_antialias ()

+
cairo_antialias_t
+cairo_font_options_get_antialias (const cairo_font_options_t *options);
+

Gets the antialiasing mode for the font options object.

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+
+

Returns

+

the antialiasing mode

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_set_subpixel_order ()

+
void
+cairo_font_options_set_subpixel_order (cairo_font_options_t *options,
+                                       cairo_subpixel_order_t subpixel_order);
+

Sets the subpixel order for the font options object. The subpixel +order specifies the order of color elements within each pixel on +the display device when rendering with an antialiasing mode of +CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for +cairo_subpixel_order_t for full details.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t

 

subpixel_order

the new subpixel order

 
+
+

Since 1.0

+
+
+
+

cairo_font_options_get_subpixel_order ()

+
cairo_subpixel_order_t
+cairo_font_options_get_subpixel_order (const cairo_font_options_t *options);
+

Gets the subpixel order for the font options object. +See the documentation for cairo_subpixel_order_t for full details.

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+
+

Returns

+

the subpixel order for the font options object

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_set_hint_style ()

+
void
+cairo_font_options_set_hint_style (cairo_font_options_t *options,
+                                   cairo_hint_style_t hint_style);
+

Sets the hint style for font outlines for the font options object. +This controls whether to fit font outlines to the pixel grid, +and if so, whether to optimize for fidelity or contrast. +See the documentation for cairo_hint_style_t for full details.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t

 

hint_style

the new hint style

 
+
+

Since 1.0

+
+
+
+

cairo_font_options_get_hint_style ()

+
cairo_hint_style_t
+cairo_font_options_get_hint_style (const cairo_font_options_t *options);
+

Gets the hint style for font outlines for the font options object. +See the documentation for cairo_hint_style_t for full details.

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+
+

Returns

+

the hint style for the font options object

+

+
+

Since 1.0

+
+
+
+

cairo_font_options_set_hint_metrics ()

+
void
+cairo_font_options_set_hint_metrics (cairo_font_options_t *options,
+                                     cairo_hint_metrics_t hint_metrics);
+

Sets the metrics hinting mode for the font options object. This +controls whether metrics are quantized to integer values in +device units. +See the documentation for cairo_hint_metrics_t for full details.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

options

a cairo_font_options_t

 

hint_metrics

the new metrics hinting mode

 
+
+

Since 1.0

+
+
+
+

cairo_font_options_get_hint_metrics ()

+
cairo_hint_metrics_t
+cairo_font_options_get_hint_metrics (const cairo_font_options_t *options);
+

Gets the metrics hinting mode for the font options object. +See the documentation for cairo_hint_metrics_t for full details.

+
+

Parameters

+
+++++ + + + + + +

options

a cairo_font_options_t

 
+
+
+

Returns

+

the metrics hinting mode for the font options object

+

+
+

Since 1.0

+
+
+
+

Types and Values

+
+

cairo_font_options_t

+
typedef struct _cairo_font_options cairo_font_options_t;
+
+

An opaque structure holding all options that are used when +rendering fonts.

+

Individual features of a cairo_font_options_t can be set or +accessed using functions named +cairo_font_options_set_feature_name() and +cairo_font_options_get_feature_name(), like +cairo_font_options_set_antialias() and +cairo_font_options_get_antialias().

+

New features may be added to a cairo_font_options_t in the +future. For this reason, cairo_font_options_copy(), +cairo_font_options_equal(), cairo_font_options_merge(), and +cairo_font_options_hash() should be used to copy, check +for equality, merge, or compute a hash value of +cairo_font_options_t objects.

+

Since 1.0

+
+
+
+

enum cairo_subpixel_order_t

+

The subpixel order specifies the order of color elements within +each pixel on the display device when rendering with an +antialiasing mode of CAIRO_ANTIALIAS_SUBPIXEL.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_SUBPIXEL_ORDER_DEFAULT

+

Use the default subpixel order for + for the target device, since 1.0

+
 

CAIRO_SUBPIXEL_ORDER_RGB

+

Subpixel elements are arranged horizontally + with red at the left, since 1.0

+
 

CAIRO_SUBPIXEL_ORDER_BGR

+

Subpixel elements are arranged horizontally + with blue at the left, since 1.0

+
 

CAIRO_SUBPIXEL_ORDER_VRGB

+

Subpixel elements are arranged vertically + with red at the top, since 1.0

+
 

CAIRO_SUBPIXEL_ORDER_VBGR

+

Subpixel elements are arranged vertically + with blue at the top, since 1.0

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_hint_style_t

+

Specifies the type of hinting to do on font outlines. Hinting +is the process of fitting outlines to the pixel grid in order +to improve the appearance of the result. Since hinting outlines +involves distorting them, it also reduces the faithfulness +to the original outline shapes. Not all of the outline hinting +styles are supported by all font backends.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_HINT_STYLE_DEFAULT

+

Use the default hint style for + font backend and target device, since 1.0

+
 

CAIRO_HINT_STYLE_NONE

+

Do not hint outlines, since 1.0

+
 

CAIRO_HINT_STYLE_SLIGHT

+

Hint outlines slightly to improve + contrast while retaining good fidelity to the original + shapes, since 1.0

+
 

CAIRO_HINT_STYLE_MEDIUM

+

Hint outlines with medium strength + giving a compromise between fidelity to the original shapes + and contrast, since 1.0

+
 

CAIRO_HINT_STYLE_FULL

+

Hint outlines to maximize contrast, since 1.0

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_hint_metrics_t

+

Specifies whether to hint font metrics; hinting font metrics +means quantizing them so that they are integer values in +device space. Doing this improves the consistency of +letter and line spacing, however it also means that text +will be laid out differently at different zoom factors.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

CAIRO_HINT_METRICS_DEFAULT

+

Hint metrics in the default + manner for the font backend and target device, since 1.0

+
 

CAIRO_HINT_METRICS_OFF

+

Do not hint font metrics, since 1.0

+
 

CAIRO_HINT_METRICS_ON

+

Hint font metrics, since 1.0

+
 
+
+

Since 1.0

+
+
+
+

See Also

+

cairo_scaled_font_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-matrix-t.html b/doc/public/html/cairo-cairo-matrix-t.html new file mode 100644 index 000000000..0f3106885 --- /dev/null +++ b/doc/public/html/cairo-cairo-matrix-t.html @@ -0,0 +1,787 @@ + + + + +Cairo: A Vector Graphics Library: cairo_matrix_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_matrix_t

+

cairo_matrix_t — Generic matrix operations

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +cairo_matrix_init () +
+void + +cairo_matrix_init_identity () +
+void + +cairo_matrix_init_translate () +
+void + +cairo_matrix_init_scale () +
+void + +cairo_matrix_init_rotate () +
+void + +cairo_matrix_translate () +
+void + +cairo_matrix_scale () +
+void + +cairo_matrix_rotate () +
+cairo_status_t + +cairo_matrix_invert () +
+void + +cairo_matrix_multiply () +
+void + +cairo_matrix_transform_distance () +
+void + +cairo_matrix_transform_point () +
+
+
+

Types and Values

+
++++ + + + + +
 cairo_matrix_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

cairo_matrix_t is used throughout cairo to convert between different +coordinate spaces. A cairo_matrix_t holds an affine transformation, +such as a scale, rotation, shear, or a combination of these. +The transformation of a point (x,y) +is given by:

+
+x_new = xx * x + xy * y + x0;
+y_new = yx * x + yy * y + y0;
+
+

The current transformation matrix of a cairo_t, represented as a +cairo_matrix_t, defines the transformation from user-space +coordinates to device-space coordinates. See cairo_get_matrix() and +cairo_set_matrix().

+
+
+

Functions

+
+

cairo_matrix_init ()

+
void
+cairo_matrix_init (cairo_matrix_t *matrix,
+                   double xx,
+                   double yx,
+                   double xy,
+                   double yy,
+                   double x0,
+                   double y0);
+

Sets matrix + to be the affine transformation given by +xx +, yx +, xy +, yy +, x0 +, y0 +. The transformation is given +by:

+
+ x_new = xx * x + xy * y + x0;
+ y_new = yx * x + yy * y + y0;
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

xx

xx component of the affine transformation

 

yx

yx component of the affine transformation

 

xy

xy component of the affine transformation

 

yy

yy component of the affine transformation

 

x0

X translation component of the affine transformation

 

y0

Y translation component of the affine transformation

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_init_identity ()

+
void
+cairo_matrix_init_identity (cairo_matrix_t *matrix);
+

Modifies matrix + to be an identity transformation.

+
+

Parameters

+
+++++ + + + + + +

matrix

a cairo_matrix_t

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_init_translate ()

+
void
+cairo_matrix_init_translate (cairo_matrix_t *matrix,
+                             double tx,
+                             double ty);
+

Initializes matrix + to a transformation that translates by tx + and +ty + in the X and Y dimensions, respectively.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

tx

amount to translate in the X direction

 

ty

amount to translate in the Y direction

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_init_scale ()

+
void
+cairo_matrix_init_scale (cairo_matrix_t *matrix,
+                         double sx,
+                         double sy);
+

Initializes matrix + to a transformation that scales by sx + and sy + +in the X and Y dimensions, respectively.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

sx

scale factor in the X direction

 

sy

scale factor in the Y direction

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_init_rotate ()

+
void
+cairo_matrix_init_rotate (cairo_matrix_t *matrix,
+                          double radians);
+

Initialized matrix + to a transformation that rotates by radians +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

radians

angle of rotation, in radians. The direction of rotation +is defined such that positive angles rotate in the direction from +the positive X axis toward the positive Y axis. With the default +axis orientation of cairo, positive angles rotate in a clockwise +direction.

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_translate ()

+
void
+cairo_matrix_translate (cairo_matrix_t *matrix,
+                        double tx,
+                        double ty);
+

Applies a translation by tx +, ty + to the transformation in +matrix +. The effect of the new transformation is to first translate +the coordinates by tx + and ty +, then apply the original transformation +to the coordinates.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

tx

amount to translate in the X direction

 

ty

amount to translate in the Y direction

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_scale ()

+
void
+cairo_matrix_scale (cairo_matrix_t *matrix,
+                    double sx,
+                    double sy);
+

Applies scaling by sx +, sy + to the transformation in matrix +. The +effect of the new transformation is to first scale the coordinates +by sx + and sy +, then apply the original transformation to the coordinates.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

sx

scale factor in the X direction

 

sy

scale factor in the Y direction

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_rotate ()

+
void
+cairo_matrix_rotate (cairo_matrix_t *matrix,
+                     double radians);
+

Applies rotation by radians + to the transformation in +matrix +. The effect of the new transformation is to first rotate the +coordinates by radians +, then apply the original transformation +to the coordinates.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

radians

angle of rotation, in radians. The direction of rotation +is defined such that positive angles rotate in the direction from +the positive X axis toward the positive Y axis. With the default +axis orientation of cairo, positive angles rotate in a clockwise +direction.

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_invert ()

+
cairo_status_t
+cairo_matrix_invert (cairo_matrix_t *matrix);
+

Changes matrix + to be the inverse of its original value. Not +all transformation matrices have inverses; if the matrix +collapses points together (it is degenerate), +then it has no inverse and this function will fail.

+
+

Parameters

+
+++++ + + + + + +

matrix

a cairo_matrix_t

 
+
+
+

Returns

+

If matrix +has an inverse, modifies matrix +to +be the inverse matrix and returns CAIRO_STATUS_SUCCESS. Otherwise, +returns CAIRO_STATUS_INVALID_MATRIX.

+

+
+

Since 1.0

+
+
+
+

cairo_matrix_multiply ()

+
void
+cairo_matrix_multiply (cairo_matrix_t *result,
+                       const cairo_matrix_t *a,
+                       const cairo_matrix_t *b);
+

Multiplies the affine transformations in a + and b + together +and stores the result in result +. The effect of the resulting +transformation is to first apply the transformation in a + to the +coordinates and then apply the transformation in b + to the +coordinates.

+

It is allowable for result + to be identical to either a + or b +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

result

a cairo_matrix_t in which to store the result

 

a

a cairo_matrix_t

 

b

a cairo_matrix_t

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_transform_distance ()

+
void
+cairo_matrix_transform_distance (const cairo_matrix_t *matrix,
+                                 double *dx,
+                                 double *dy);
+

Transforms the distance vector (dx +,dy +) by matrix +. This is +similar to cairo_matrix_transform_point() except that the translation +components of the transformation are ignored. The calculation of +the returned vector is as follows:

+
+dx2 = dx1 * a + dy1 * c;
+dy2 = dx1 * b + dy1 * d;
+
+

Affine transformations are position invariant, so the same vector +always transforms to the same vector. If (x1 +,y1 +) transforms +to (x2 +,y2 +) then (x1 ++dx1 +,y1 ++dy1 +) will transform to +(x1 ++dx2 +,y1 ++dy2 +) for all values of x1 + and x2 +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

dx

X component of a distance vector. An in/out parameter

 

dy

Y component of a distance vector. An in/out parameter

 
+
+

Since 1.0

+
+
+
+

cairo_matrix_transform_point ()

+
void
+cairo_matrix_transform_point (const cairo_matrix_t *matrix,
+                              double *x,
+                              double *y);
+

Transforms the point (x +, y +) by matrix +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

matrix

a cairo_matrix_t

 

x

X position. An in/out parameter

 

y

Y position. An in/out parameter

 
+
+

Since 1.0

+
+
+
+

Types and Values

+
+

cairo_matrix_t

+
typedef struct {
+    double xx; double yx;
+    double xy; double yy;
+    double x0; double y0;
+} cairo_matrix_t;
+
+

A cairo_matrix_t holds an affine transformation, such as a scale, +rotation, shear, or a combination of those. The transformation of +a point (x, y) is given by:

+
+    x_new = xx * x + xy * y + x0;
+    y_new = yx * x + yy * y + y0;
+
+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

double xx;

xx component of the affine transformation

 

double yx;

yx component of the affine transformation

 

double xy;

xy component of the affine transformation

 

double yy;

yy component of the affine transformation

 

double x0;

X translation component of the affine transformation

 

double y0;

Y translation component of the affine transformation

 
+
+

Since 1.0

+
+
+
+

See Also

+

cairo_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-pattern-t.html b/doc/public/html/cairo-cairo-pattern-t.html new file mode 100644 index 000000000..70e54ffe3 --- /dev/null +++ b/doc/public/html/cairo-cairo-pattern-t.html @@ -0,0 +1,2692 @@ + + + + +Cairo: A Vector Graphics Library: cairo_pattern_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_pattern_t

+

cairo_pattern_t — Sources for drawing

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +cairo_pattern_add_color_stop_rgb () +
+void + +cairo_pattern_add_color_stop_rgba () +
+cairo_status_t + +cairo_pattern_get_color_stop_count () +
+cairo_status_t + +cairo_pattern_get_color_stop_rgba () +
+cairo_pattern_t * + +cairo_pattern_create_rgb () +
+cairo_pattern_t * + +cairo_pattern_create_rgba () +
+cairo_status_t + +cairo_pattern_get_rgba () +
+cairo_pattern_t * + +cairo_pattern_create_for_surface () +
+cairo_status_t + +cairo_pattern_get_surface () +
+cairo_pattern_t * + +cairo_pattern_create_linear () +
+cairo_status_t + +cairo_pattern_get_linear_points () +
+cairo_pattern_t * + +cairo_pattern_create_radial () +
+cairo_status_t + +cairo_pattern_get_radial_circles () +
+cairo_pattern_t * + +cairo_pattern_create_mesh () +
+void + +cairo_mesh_pattern_begin_patch () +
+void + +cairo_mesh_pattern_end_patch () +
+void + +cairo_mesh_pattern_move_to () +
+void + +cairo_mesh_pattern_line_to () +
+void + +cairo_mesh_pattern_curve_to () +
+void + +cairo_mesh_pattern_set_control_point () +
+void + +cairo_mesh_pattern_set_corner_color_rgb () +
+void + +cairo_mesh_pattern_set_corner_color_rgba () +
+cairo_status_t + +cairo_mesh_pattern_get_patch_count () +
+cairo_path_t * + +cairo_mesh_pattern_get_path () +
+cairo_status_t + +cairo_mesh_pattern_get_control_point () +
+cairo_status_t + +cairo_mesh_pattern_get_corner_color_rgba () +
+cairo_pattern_t * + +cairo_pattern_reference () +
+void + +cairo_pattern_destroy () +
+cairo_status_t + +cairo_pattern_status () +
+void + +cairo_pattern_set_extend () +
+cairo_extend_t + +cairo_pattern_get_extend () +
+void + +cairo_pattern_set_filter () +
+cairo_filter_t + +cairo_pattern_get_filter () +
+void + +cairo_pattern_set_matrix () +
+void + +cairo_pattern_get_matrix () +
+cairo_pattern_type_t + +cairo_pattern_get_type () +
unsigned int + +cairo_pattern_get_reference_count () +
+cairo_status_t + +cairo_pattern_set_user_data () +
+void * + +cairo_pattern_get_user_data () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + +
typedefcairo_pattern_t
enumcairo_extend_t
enumcairo_filter_t
enumcairo_pattern_type_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

cairo_pattern_t is the paint with which cairo draws. +The primary use of patterns is as the source for all cairo drawing +operations, although they can also be used as masks, that is, as the +brush too.

+

A cairo pattern is created by using one of the many constructors, +of the form +cairo_pattern_create_type() +or implicitly through +cairo_set_source_type() +functions.

+
+
+

Functions

+
+

cairo_pattern_add_color_stop_rgb ()

+
void
+cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern,
+                                  double offset,
+                                  double red,
+                                  double green,
+                                  double blue);
+

Adds an opaque color stop to a gradient pattern. The offset +specifies the location along the gradient's control vector. For +example, a linear gradient's control vector is from (x0,y0) to +(x1,y1) while a radial gradient's control vector is from any point +on the start circle to the corresponding point on the end circle.

+

The color is specified in the same way as in cairo_set_source_rgb().

+

If two (or more) stops are specified with identical offset values, +they will be sorted according to the order in which the stops are +added, (stops added earlier will compare less than stops added +later). This can be useful for reliably making sharp color +transitions instead of the typical blend.

+

Note: If the pattern is not a gradient pattern, (eg. a linear or +radial pattern), then the pattern will be put into an error status +with a status of CAIRO_STATUS_PATTERN_TYPE_MISMATCH.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

offset

an offset in the range [0.0 .. 1.0]

 

red

red component of color

 

green

green component of color

 

blue

blue component of color

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_add_color_stop_rgba ()

+
void
+cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern,
+                                   double offset,
+                                   double red,
+                                   double green,
+                                   double blue,
+                                   double alpha);
+

Adds a translucent color stop to a gradient pattern. The offset +specifies the location along the gradient's control vector. For +example, a linear gradient's control vector is from (x0,y0) to +(x1,y1) while a radial gradient's control vector is from any point +on the start circle to the corresponding point on the end circle.

+

The color is specified in the same way as in cairo_set_source_rgba().

+

If two (or more) stops are specified with identical offset values, +they will be sorted according to the order in which the stops are +added, (stops added earlier will compare less than stops added +later). This can be useful for reliably making sharp color +transitions instead of the typical blend.

+

Note: If the pattern is not a gradient pattern, (eg. a linear or +radial pattern), then the pattern will be put into an error status +with a status of CAIRO_STATUS_PATTERN_TYPE_MISMATCH.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

offset

an offset in the range [0.0 .. 1.0]

 

red

red component of color

 

green

green component of color

 

blue

blue component of color

 

alpha

alpha component of color

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_get_color_stop_count ()

+
cairo_status_t
+cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern,
+                                    int *count);
+

Gets the number of color stops specified in the given gradient +pattern.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

count

return value for the number of color stops, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a gradient +pattern.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_get_color_stop_rgba ()

+
cairo_status_t
+cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern,
+                                   int index,
+                                   double *offset,
+                                   double *red,
+                                   double *green,
+                                   double *blue,
+                                   double *alpha);
+

Gets the color and offset information at the given index + for a +gradient pattern. Values of index + range from 0 to n-1 +where n is the number returned +by cairo_pattern_get_color_stop_count().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

index

index of the stop to return data for

 

offset

return value for the offset of the stop, or NULL

 

red

return value for red component of color, or NULL

 

green

return value for green component of color, or NULL

 

blue

return value for blue component of color, or NULL

 

alpha

return value for alpha component of color, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or CAIRO_STATUS_INVALID_INDEX +if index +is not valid for the given pattern. If the pattern is +not a gradient pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH is +returned.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_create_rgb ()

+
cairo_pattern_t *
+cairo_pattern_create_rgb (double red,
+                          double green,
+                          double blue);
+

Creates a new cairo_pattern_t corresponding to an opaque color. The +color components are floating point numbers in the range 0 to 1. +If the values passed in are outside that range, they will be +clamped.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

red

red component of the color

 

green

green component of the color

 

blue

blue component of the color

 
+
+
+

Returns

+

the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it.

+

This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status().

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_create_rgba ()

+
cairo_pattern_t *
+cairo_pattern_create_rgba (double red,
+                           double green,
+                           double blue,
+                           double alpha);
+

Creates a new cairo_pattern_t corresponding to a translucent color. +The color components are floating point numbers in the range 0 to

+
  1. If the values passed in are outside that range, they will be +clamped.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

red

red component of the color

 

green

green component of the color

 

blue

blue component of the color

 

alpha

alpha component of the color

 
+
+
+

Returns

+

the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it.

+

This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status().

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_get_rgba ()

+
cairo_status_t
+cairo_pattern_get_rgba (cairo_pattern_t *pattern,
+                        double *red,
+                        double *green,
+                        double *blue,
+                        double *alpha);
+

Gets the solid color for a solid color pattern.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

red

return value for red component of color, or NULL

 

green

return value for green component of color, or NULL

 

blue

return value for blue component of color, or NULL

 

alpha

return value for alpha component of color, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a solid +color pattern.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_create_for_surface ()

+
cairo_pattern_t *
+cairo_pattern_create_for_surface (cairo_surface_t *surface);
+

Create a new cairo_pattern_t for the given surface.

+
+

Parameters

+
+++++ + + + + + +

surface

the surface

 
+
+
+

Returns

+

the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it.

+

This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status().

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_get_surface ()

+
cairo_status_t
+cairo_pattern_get_surface (cairo_pattern_t *pattern,
+                           cairo_surface_t **surface);
+

Gets the surface of a surface pattern. The reference returned in +surface + is owned by the pattern; the caller should call +cairo_surface_reference() if the surface is to be retained.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

surface

return value for surface of pattern, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a surface +pattern.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_create_linear ()

+
cairo_pattern_t *
+cairo_pattern_create_linear (double x0,
+                             double y0,
+                             double x1,
+                             double y1);
+

Create a new linear gradient cairo_pattern_t along the line defined +by (x0, y0) and (x1, y1). Before using the gradient pattern, a +number of color stops should be defined using +cairo_pattern_add_color_stop_rgb() or +cairo_pattern_add_color_stop_rgba().

+

Note: The coordinates here are in pattern space. For a new pattern, +pattern space is identical to user space, but the relationship +between the spaces can be changed with cairo_pattern_set_matrix().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

x0

x coordinate of the start point

 

y0

y coordinate of the start point

 

x1

x coordinate of the end point

 

y1

y coordinate of the end point

 
+
+
+

Returns

+

the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it.

+

This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status().

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_get_linear_points ()

+
cairo_status_t
+cairo_pattern_get_linear_points (cairo_pattern_t *pattern,
+                                 double *x0,
+                                 double *y0,
+                                 double *x1,
+                                 double *y1);
+

Gets the gradient endpoints for a linear gradient.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

x0

return value for the x coordinate of the first point, or NULL

 

y0

return value for the y coordinate of the first point, or NULL

 

x1

return value for the x coordinate of the second point, or NULL

 

y1

return value for the y coordinate of the second point, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a linear +gradient pattern.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_create_radial ()

+
cairo_pattern_t *
+cairo_pattern_create_radial (double cx0,
+                             double cy0,
+                             double radius0,
+                             double cx1,
+                             double cy1,
+                             double radius1);
+

Creates a new radial gradient cairo_pattern_t between the two +circles defined by (cx0, cy0, radius0) and (cx1, cy1, radius1). Before using the +gradient pattern, a number of color stops should be defined using +cairo_pattern_add_color_stop_rgb() or +cairo_pattern_add_color_stop_rgba().

+

Note: The coordinates here are in pattern space. For a new pattern, +pattern space is identical to user space, but the relationship +between the spaces can be changed with cairo_pattern_set_matrix().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cx0

x coordinate for the center of the start circle

 

cy0

y coordinate for the center of the start circle

 

radius0

radius of the start circle

 

cx1

x coordinate for the center of the end circle

 

cy1

y coordinate for the center of the end circle

 

radius1

radius of the end circle

 
+
+
+

Returns

+

the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it.

+

This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status().

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_get_radial_circles ()

+
cairo_status_t
+cairo_pattern_get_radial_circles (cairo_pattern_t *pattern,
+                                  double *x0,
+                                  double *y0,
+                                  double *r0,
+                                  double *x1,
+                                  double *y1,
+                                  double *r1);
+

Gets the gradient endpoint circles for a radial gradient, each +specified as a center coordinate and a radius.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

x0

return value for the x coordinate of the center of the first circle, or NULL

 

y0

return value for the y coordinate of the center of the first circle, or NULL

 

r0

return value for the radius of the first circle, or NULL

 

x1

return value for the x coordinate of the center of the second circle, or NULL

 

y1

return value for the y coordinate of the center of the second circle, or NULL

 

r1

return value for the radius of the second circle, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a radial +gradient pattern.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_create_mesh ()

+
cairo_pattern_t *
+cairo_pattern_create_mesh (void);
+

Create a new mesh pattern.

+

Mesh patterns are tensor-product patch meshes (type 7 shadings in +PDF). Mesh patterns may also be used to create other types of +shadings that are special cases of tensor-product patch meshes such +as Coons patch meshes (type 6 shading in PDF) and Gouraud-shaded +triangle meshes (type 4 and 5 shadings in PDF).

+

Mesh patterns consist of one or more tensor-product patches, which +should be defined before using the mesh pattern. Using a mesh +pattern with a partially defined patch as source or mask will put +the context in an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+

A tensor-product patch is defined by 4 Bézier curves (side 0, 1, 2, +3) and by 4 additional control points (P0, P1, P2, P3) that provide +further control over the patch and complete the definition of the +tensor-product patch. The corner C0 is the first point of the +patch.

+

Degenerate sides are permitted so straight lines may be used. A +zero length line on one side may be used to create 3 sided patches.

+
+      C1     Side 1       C2
+       +---------------+
+       |               |
+       |  P1       P2  |
+       |               |
+Side 0 |               | Side 2
+       |               |
+       |               |
+       |  P0       P3  |
+       |               |
+       +---------------+
+     C0     Side 3        C3
+
+

Each patch is constructed by first calling +cairo_mesh_pattern_begin_patch(), then cairo_mesh_pattern_move_to() +to specify the first point in the patch (C0). Then the sides are +specified with calls to cairo_mesh_pattern_curve_to() and +cairo_mesh_pattern_line_to().

+

The four additional control points (P0, P1, P2, P3) in a patch can +be specified with cairo_mesh_pattern_set_control_point().

+

At each corner of the patch (C0, C1, C2, C3) a color may be +specified with cairo_mesh_pattern_set_corner_color_rgb() or +cairo_mesh_pattern_set_corner_color_rgba(). Any corner whose color +is not explicitly specified defaults to transparent black.

+

A Coons patch is a special case of the tensor-product patch where +the control points are implicitly defined by the sides of the +patch. The default value for any control point not specified is the +implicit value for a Coons patch, i.e. if no control points are +specified the patch is a Coons patch.

+

A triangle is a special case of the tensor-product patch where the +control points are implicitly defined by the sides of the patch, +all the sides are lines and one of them has length 0, i.e. if the +patch is specified using just 3 lines, it is a triangle. If the +corners connected by the 0-length side have the same color, the +patch is a Gouraud-shaded triangle.

+

Patches may be oriented differently to the above diagram. For +example the first point could be at the top left. The diagram only +shows the relationship between the sides, corners and control +points. Regardless of where the first point is located, when +specifying colors, corner 0 will always be the first point, corner +1 the point between side 0 and side 1 etc.

+

Calling cairo_mesh_pattern_end_patch() completes the current +patch. If less than 4 sides have been defined, the first missing +side is defined as a line from the current point to the first point +of the patch (C0) and the other sides are degenerate lines from C0 +to C0. The corners between the added sides will all be coincident +with C0 of the patch and their color will be set to be the same as +the color of C0.

+

Additional patches may be added with additional calls to +cairo_mesh_pattern_begin_patch()/cairo_mesh_pattern_end_patch().

+
+cairo_pattern_t *pattern = cairo_pattern_create_mesh ();
+
+/* Add a Coons patch */
+cairo_mesh_pattern_begin_patch (pattern);
+cairo_mesh_pattern_move_to (pattern, 0, 0);
+cairo_mesh_pattern_curve_to (pattern, 30, -30,  60,  30, 100, 0);
+cairo_mesh_pattern_curve_to (pattern, 60,  30, 130,  60, 100, 100);
+cairo_mesh_pattern_curve_to (pattern, 60,  70,  30, 130,   0, 100);
+cairo_mesh_pattern_curve_to (pattern, 30,  70, -30,  30,   0, 0);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0);
+cairo_mesh_pattern_end_patch (pattern);
+
+/* Add a Gouraud-shaded triangle */
+cairo_mesh_pattern_begin_patch (pattern)
+cairo_mesh_pattern_move_to (pattern, 100, 100);
+cairo_mesh_pattern_line_to (pattern, 130, 130);
+cairo_mesh_pattern_line_to (pattern, 130,  70);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0);
+cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1);
+cairo_mesh_pattern_end_patch (pattern)
+
+

When two patches overlap, the last one that has been added is drawn +over the first one.

+

When a patch folds over itself, points are sorted depending on +their parameter coordinates inside the patch. The v coordinate +ranges from 0 to 1 when moving from side 3 to side 1; the u +coordinate ranges from 0 to 1 when going from side 0 to side

+
  1. Points with higher v coordinate hide points with lower v +coordinate. When two points have the same v coordinate, the one +with higher u coordinate is above. This means that points nearer to +side 1 are above points nearer to side 3; when this is not +sufficient to decide which point is above (for example when both +points belong to side 1 or side 3) points nearer to side 2 are +above points nearer to side 0.

+

For a complete definition of tensor-product patches, see the PDF +specification (ISO32000), which describes the parametrization in +detail.

+

Note: The coordinates are always in pattern space. For a new +pattern, pattern space is identical to user space, but the +relationship between the spaces can be changed with +cairo_pattern_set_matrix().

+
+

Returns

+

the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the returned +object and should call cairo_pattern_destroy() when finished with +it.

+

This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect the +status of a pattern use cairo_pattern_status().

+

+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_begin_patch ()

+
void
+cairo_mesh_pattern_begin_patch (cairo_pattern_t *pattern);
+

Begin a patch in a mesh pattern.

+

After calling this function, the patch shape should be defined with +cairo_mesh_pattern_move_to(), cairo_mesh_pattern_line_to() and +cairo_mesh_pattern_curve_to().

+

After defining the patch, cairo_mesh_pattern_end_patch() must be +called before using pattern + as a source or mask.

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + already has a +current patch, it will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_end_patch ()

+
void
+cairo_mesh_pattern_end_patch (cairo_pattern_t *pattern);
+

Indicates the end of the current patch in a mesh pattern.

+

If the current patch has less than 4 sides, it is closed with a +straight line from the current point to the first point of the +patch as if cairo_mesh_pattern_line_to() was used.

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch has no current point, pattern + will be +put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_move_to ()

+
void
+cairo_mesh_pattern_move_to (cairo_pattern_t *pattern,
+                            double x,
+                            double y);
+

Define the first point of the current patch in a mesh pattern.

+

After this call the current point will be (x +, y +).

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch already has at least one side, pattern + +will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

x

the X coordinate of the new position

 

y

the Y coordinate of the new position

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_line_to ()

+
void
+cairo_mesh_pattern_line_to (cairo_pattern_t *pattern,
+                            double x,
+                            double y);
+

Adds a line to the current patch from the current point to position +(x +, y +) in pattern-space coordinates.

+

If there is no current point before the call to +cairo_mesh_pattern_line_to() this function will behave as +cairo_mesh_pattern_move_to(pattern +, x +, y +).

+

After this call the current point will be (x +, y +).

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch already has 4 sides, pattern + will be +put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

x

the X coordinate of the end of the new line

 

y

the Y coordinate of the end of the new line

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_curve_to ()

+
void
+cairo_mesh_pattern_curve_to (cairo_pattern_t *pattern,
+                             double x1,
+                             double y1,
+                             double x2,
+                             double y2,
+                             double x3,
+                             double y3);
+

Adds a cubic Bézier spline to the current patch from the current +point to position (x3 +, y3 +) in pattern-space coordinates, using +(x1 +, y1 +) and (x2 +, y2 +) as the control points.

+

If the current patch has no current point before the call to +cairo_mesh_pattern_curve_to(), this function will behave as if +preceded by a call to cairo_mesh_pattern_move_to(pattern +, x1 +, +y1 +).

+

After this call the current point will be (x3 +, y3 +).

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch already has 4 sides, pattern + will be +put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

x1

the X coordinate of the first control point

 

y1

the Y coordinate of the first control point

 

x2

the X coordinate of the second control point

 

y2

the Y coordinate of the second control point

 

x3

the X coordinate of the end of the curve

 

y3

the Y coordinate of the end of the curve

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_set_control_point ()

+
void
+cairo_mesh_pattern_set_control_point (cairo_pattern_t *pattern,
+                                      unsigned int point_num,
+                                      double x,
+                                      double y);
+

Set an internal control point of the current patch.

+

Valid values for point_num + are from 0 to 3 and identify the +control points as explained in cairo_pattern_create_mesh().

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If point_num + is not valid, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_INDEX. If pattern + has no current patch, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

point_num

the control point to set the position for

 

x

the X coordinate of the control point

 

y

the Y coordinate of the control point

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_set_corner_color_rgb ()

+
void
+cairo_mesh_pattern_set_corner_color_rgb
+                               (cairo_pattern_t *pattern,
+                                unsigned int corner_num,
+                                double red,
+                                double green,
+                                double blue);
+

Sets the color of a corner of the current patch in a mesh pattern.

+

The color is specified in the same way as in cairo_set_source_rgb().

+

Valid values for corner_num + are from 0 to 3 and identify the +corners as explained in cairo_pattern_create_mesh().

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If corner_num + is not valid, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_INDEX. If pattern + has no current patch, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

corner_num

the corner to set the color for

 

red

red component of color

 

green

green component of color

 

blue

blue component of color

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_set_corner_color_rgba ()

+
void
+cairo_mesh_pattern_set_corner_color_rgba
+                               (cairo_pattern_t *pattern,
+                                unsigned int corner_num,
+                                double red,
+                                double green,
+                                double blue,
+                                double alpha);
+

Sets the color of a corner of the current patch in a mesh pattern.

+

The color is specified in the same way as in cairo_set_source_rgba().

+

Valid values for corner_num + are from 0 to 3 and identify the +corners as explained in cairo_pattern_create_mesh().

+

Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If corner_num + is not valid, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_INDEX. If pattern + has no current patch, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

corner_num

the corner to set the color for

 

red

red component of color

 

green

green component of color

 

blue

blue component of color

 

alpha

alpha component of color

 
+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_get_patch_count ()

+
cairo_status_t
+cairo_mesh_pattern_get_patch_count (cairo_pattern_t *pattern,
+                                    unsigned int *count);
+

Gets the number of patches specified in the given mesh pattern.

+

The number only includes patches which have been finished by +calling cairo_mesh_pattern_end_patch(). For example it will be 0 +during the definition of the first patch.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

count

return value for the number patches, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a mesh +pattern.

+

+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_get_path ()

+
cairo_path_t *
+cairo_mesh_pattern_get_path (cairo_pattern_t *pattern,
+                             unsigned int patch_num);
+

Gets path defining the patch patch_num + for a mesh +pattern.

+

patch_num + can range from 0 to n-1 where n is the number returned by +cairo_mesh_pattern_get_patch_count().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

patch_num

the patch number to return data for

 
+
+
+

Returns

+

the path defining the patch, or a path with status +CAIRO_STATUS_INVALID_INDEX if patch_num +or point_num +is not +valid for pattern +. If pattern +is not a mesh pattern, a path with +status CAIRO_STATUS_PATTERN_TYPE_MISMATCH is returned.

+

+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_get_control_point ()

+
cairo_status_t
+cairo_mesh_pattern_get_control_point (cairo_pattern_t *pattern,
+                                      unsigned int patch_num,
+                                      unsigned int point_num,
+                                      double *x,
+                                      double *y);
+

Gets the control point point_num + of patch patch_num + for a mesh +pattern.

+

patch_num + can range from 0 to n-1 where n is the number returned by +cairo_mesh_pattern_get_patch_count().

+

Valid values for point_num + are from 0 to 3 and identify the +control points as explained in cairo_pattern_create_mesh().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

patch_num

the patch number to return data for

 

point_num

the control point number to return data for

 

x

return value for the x coordinate of the control point, or NULL

 

y

return value for the y coordinate of the control point, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or CAIRO_STATUS_INVALID_INDEX +if patch_num +or point_num +is not valid for pattern +. If pattern +is not a mesh pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH is +returned.

+

+
+

Since 1.12

+
+
+
+

cairo_mesh_pattern_get_corner_color_rgba ()

+
cairo_status_t
+cairo_mesh_pattern_get_corner_color_rgba
+                               (cairo_pattern_t *pattern,
+                                unsigned int patch_num,
+                                unsigned int corner_num,
+                                double *red,
+                                double *green,
+                                double *blue,
+                                double *alpha);
+

Gets the color information in corner corner_num + of patch +patch_num + for a mesh pattern.

+

patch_num + can range from 0 to n-1 where n is the number returned by +cairo_mesh_pattern_get_patch_count().

+

Valid values for corner_num + are from 0 to 3 and identify the +corners as explained in cairo_pattern_create_mesh().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

patch_num

the patch number to return data for

 

corner_num

the corner number to return data for

 

red

return value for red component of color, or NULL

 

green

return value for green component of color, or NULL

 

blue

return value for blue component of color, or NULL

 

alpha

return value for alpha component of color, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS, or CAIRO_STATUS_INVALID_INDEX +if patch_num +or corner_num +is not valid for pattern +. If +pattern +is not a mesh pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH +is returned.

+

+
+

Since 1.12

+
+
+
+

cairo_pattern_reference ()

+
cairo_pattern_t *
+cairo_pattern_reference (cairo_pattern_t *pattern);
+

Increases the reference count on pattern + by one. This prevents +pattern + from being destroyed until a matching call to +cairo_pattern_destroy() is made.

+

The number of references to a cairo_pattern_t can be get using +cairo_pattern_get_reference_count().

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+
+

Returns

+

the referenced cairo_pattern_t.

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_destroy ()

+
void
+cairo_pattern_destroy (cairo_pattern_t *pattern);
+

Decreases the reference count on pattern + by one. If the result is +zero, then pattern + and all associated resources are freed. See +cairo_pattern_reference().

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_status ()

+
cairo_status_t
+cairo_pattern_status (cairo_pattern_t *pattern);
+

Checks whether an error has previously occurred for this +pattern.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+ +

Since 1.0

+
+
+
+

cairo_pattern_set_extend ()

+
void
+cairo_pattern_set_extend (cairo_pattern_t *pattern,
+                          cairo_extend_t extend);
+

Sets the mode to be used for drawing outside the area of a pattern. +See cairo_extend_t for details on the semantics of each extend +strategy.

+

The default extend mode is CAIRO_EXTEND_NONE for surface patterns +and CAIRO_EXTEND_PAD for gradient patterns.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

extend

a cairo_extend_t describing how the area outside of the +pattern will be drawn

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_get_extend ()

+
cairo_extend_t
+cairo_pattern_get_extend (cairo_pattern_t *pattern);
+

Gets the current extend mode for a pattern. See cairo_extend_t +for details on the semantics of each extend strategy.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+
+

Returns

+

the current extend strategy used for drawing the +pattern.

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_set_filter ()

+
void
+cairo_pattern_set_filter (cairo_pattern_t *pattern,
+                          cairo_filter_t filter);
+

Sets the filter to be used for resizing when using this pattern. +See cairo_filter_t for details on each filter.

+
  • Note that you might want to control filtering even when you do not +have an explicit cairo_pattern_t object, (for example when using +cairo_set_source_surface()). In these cases, it is convenient to +use cairo_get_source() to get access to the pattern that cairo +creates implicitly. For example:

+
+cairo_set_source_surface (cr, image, x, y);
+cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST);
+
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

filter

a cairo_filter_t describing the filter to use for resizing +the pattern

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_get_filter ()

+
cairo_filter_t
+cairo_pattern_get_filter (cairo_pattern_t *pattern);
+

Gets the current filter for a pattern. See cairo_filter_t +for details on each filter.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+
+

Returns

+

the current filter used for resizing the pattern.

+

+
+

Since 1.0

+
+
+
+

cairo_pattern_set_matrix ()

+
void
+cairo_pattern_set_matrix (cairo_pattern_t *pattern,
+                          const cairo_matrix_t *matrix);
+

Sets the pattern's transformation matrix to matrix +. This matrix is +a transformation from user space to pattern space.

+

When a pattern is first created it always has the identity matrix +for its transformation matrix, which means that pattern space is +initially identical to user space.

+

Important: Please note that the direction of this transformation +matrix is from user space to pattern space. This means that if you +imagine the flow from a pattern to user space (and on to device +space), then coordinates in that flow will be transformed by the +inverse of the pattern matrix.

+

For example, if you want to make a pattern appear twice as large as +it does by default the correct code to use is:

+
+cairo_matrix_init_scale (&matrix, 0.5, 0.5);
+cairo_pattern_set_matrix (pattern, &matrix);
+
+

Meanwhile, using values of 2.0 rather than 0.5 in the code above +would cause the pattern to appear at half of its default size.

+

Also, please note the discussion of the user-space locking +semantics of cairo_set_source().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

matrix

a cairo_matrix_t

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_get_matrix ()

+
void
+cairo_pattern_get_matrix (cairo_pattern_t *pattern,
+                          cairo_matrix_t *matrix);
+

Stores the pattern's transformation matrix into matrix +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

matrix

return value for the matrix

 
+
+

Since 1.0

+
+
+
+

cairo_pattern_get_type ()

+
cairo_pattern_type_t
+cairo_pattern_get_type (cairo_pattern_t *pattern);
+

This function returns the type a pattern. +See cairo_pattern_type_t for available types.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+
+

Returns

+

The type of pattern +.

+

+
+

Since 1.2

+
+
+
+

cairo_pattern_get_reference_count ()

+
unsigned int
+cairo_pattern_get_reference_count (cairo_pattern_t *pattern);
+

Returns the current reference count of pattern +.

+
+

Parameters

+
+++++ + + + + + +

pattern

a cairo_pattern_t

 
+
+
+

Returns

+

the current reference count of pattern +. If the +object is a nil object, 0 will be returned.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_set_user_data ()

+
cairo_status_t
+cairo_pattern_set_user_data (cairo_pattern_t *pattern,
+                             const cairo_user_data_key_t *key,
+                             void *user_data,
+                             cairo_destroy_func_t destroy);
+

Attach user data to pattern +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

key

the address of a cairo_user_data_key_t to attach the user data to

 

user_data

the user data to attach to the cairo_pattern_t

 

destroy

a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key.

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.4

+
+
+
+

cairo_pattern_get_user_data ()

+
void *
+cairo_pattern_get_user_data (cairo_pattern_t *pattern,
+                             const cairo_user_data_key_t *key);
+

Return user data previously attached to pattern + using the +specified key. If no user data has been attached with the given +key this function returns NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

pattern

a cairo_pattern_t

 

key

the address of the cairo_user_data_key_t the user data was +attached to

 
+
+
+

Returns

+

the user data previously attached or NULL.

+

+
+

Since 1.4

+
+
+
+

Types and Values

+
+

cairo_pattern_t

+
typedef struct _cairo_pattern cairo_pattern_t;
+
+

A cairo_pattern_t represents a source when drawing onto a +surface. There are different subtypes of cairo_pattern_t, +for different types of sources; for example, +cairo_pattern_create_rgb() creates a pattern for a solid +opaque color.

+

Other than various +cairo_pattern_create_type() +functions, some of the pattern types can be implicitly created using various +cairo_set_source_type() functions; +for example cairo_set_source_rgb().

+

The type of a pattern can be queried with cairo_pattern_get_type().

+

Memory management of cairo_pattern_t is done with +cairo_pattern_reference() and cairo_pattern_destroy().

+

Since 1.0

+
+
+
+

enum cairo_extend_t

+

cairo_extend_t is used to describe how pattern color/alpha will be +determined for areas "outside" the pattern's natural area, (for +example, outside the surface bounds or outside the gradient +geometry).

+

Mesh patterns are not affected by the extend mode.

+

The default extend mode is CAIRO_EXTEND_NONE for surface patterns +and CAIRO_EXTEND_PAD for gradient patterns.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_EXTEND_NONE

+

pixels outside of the source pattern + are fully transparent (Since 1.0)

+
 

CAIRO_EXTEND_REPEAT

+

the pattern is tiled by repeating (Since 1.0)

+
 

CAIRO_EXTEND_REFLECT

+

the pattern is tiled by reflecting + at the edges (Since 1.0; but only implemented for surface patterns since 1.6)

+
 

CAIRO_EXTEND_PAD

+

pixels outside of the pattern copy + the closest pixel from the source (Since 1.2; but only + implemented for surface patterns since 1.6)

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_filter_t

+

cairo_filter_t is used to indicate what filtering should be +applied when reading pixel values from patterns. See +cairo_pattern_set_filter() for indicating the desired filter to be +used with a particular pattern.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_FILTER_FAST

+

A high-performance filter, with quality similar + to CAIRO_FILTER_NEAREST (Since 1.0)

+
 

CAIRO_FILTER_GOOD

+

A reasonable-performance filter, with quality + similar to CAIRO_FILTER_BILINEAR (Since 1.0)

+
 

CAIRO_FILTER_BEST

+

The highest-quality available, performance may + not be suitable for interactive use. (Since 1.0)

+
 

CAIRO_FILTER_NEAREST

+

Nearest-neighbor filtering (Since 1.0)

+
 

CAIRO_FILTER_BILINEAR

+

Linear interpolation in two dimensions (Since 1.0)

+
 

CAIRO_FILTER_GAUSSIAN

+

This filter value is currently + unimplemented, and should not be used in current code. (Since 1.0)

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_pattern_type_t

+

cairo_pattern_type_t is used to describe the type of a given pattern.

+

The type of a pattern is determined by the function used to create +it. The cairo_pattern_create_rgb() and cairo_pattern_create_rgba() +functions create SOLID patterns. The remaining +cairo_pattern_create functions map to pattern types in obvious +ways.

+

The pattern type can be queried with cairo_pattern_get_type()

+

Most cairo_pattern_t functions can be called with a pattern of any +type, (though trying to change the extend or filter for a solid +pattern will have no effect). A notable exception is +cairo_pattern_add_color_stop_rgb() and +cairo_pattern_add_color_stop_rgba() which must only be called with +gradient patterns (either LINEAR or RADIAL). Otherwise the pattern +will be shutdown and put into an error state.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_PATTERN_TYPE_SOLID

+

The pattern is a solid (uniform) +color. It may be opaque or translucent, since 1.2.

+
 

CAIRO_PATTERN_TYPE_SURFACE

+

The pattern is a based on a surface (an image), since 1.2.

+
 

CAIRO_PATTERN_TYPE_LINEAR

+

The pattern is a linear gradient, since 1.2.

+
 

CAIRO_PATTERN_TYPE_RADIAL

+

The pattern is a radial gradient, since 1.2.

+
 

CAIRO_PATTERN_TYPE_MESH

+

The pattern is a mesh, since 1.12.

+
 

CAIRO_PATTERN_TYPE_RASTER_SOURCE

+

The pattern is a user pattern providing raster data, since 1.12.

+
 
+
+

Since 1.2

+
+
+
+

See Also

+

cairo_t, cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-scaled-font-t.html b/doc/public/html/cairo-cairo-scaled-font-t.html new file mode 100644 index 000000000..05504455d --- /dev/null +++ b/doc/public/html/cairo-cairo-scaled-font-t.html @@ -0,0 +1,1230 @@ + + + + +Cairo: A Vector Graphics Library: cairo_scaled_font_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_scaled_font_t

+

cairo_scaled_font_t — Font face at particular size and options

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_scaled_font_t * + +cairo_scaled_font_create () +
+cairo_scaled_font_t * + +cairo_scaled_font_reference () +
+void + +cairo_scaled_font_destroy () +
+cairo_status_t + +cairo_scaled_font_status () +
+void + +cairo_scaled_font_extents () +
+void + +cairo_scaled_font_text_extents () +
+void + +cairo_scaled_font_glyph_extents () +
+cairo_status_t + +cairo_scaled_font_text_to_glyphs () +
+cairo_font_face_t * + +cairo_scaled_font_get_font_face () +
+void + +cairo_scaled_font_get_font_options () +
+void + +cairo_scaled_font_get_font_matrix () +
+void + +cairo_scaled_font_get_ctm () +
+void + +cairo_scaled_font_get_scale_matrix () +
+cairo_font_type_t + +cairo_scaled_font_get_type () +
unsigned int + +cairo_scaled_font_get_reference_count () +
+cairo_status_t + +cairo_scaled_font_set_user_data () +
+void * + +cairo_scaled_font_get_user_data () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
typedefcairo_scaled_font_t
 cairo_font_extents_t
 cairo_text_extents_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

cairo_scaled_font_t represents a realization of a font face at a particular +size and transformation and a certain set of font options.

+
+
+

Functions

+
+

cairo_scaled_font_create ()

+
cairo_scaled_font_t *
+cairo_scaled_font_create (cairo_font_face_t *font_face,
+                          const cairo_matrix_t *font_matrix,
+                          const cairo_matrix_t *ctm,
+                          const cairo_font_options_t *options);
+

Creates a cairo_scaled_font_t object from a font face and matrices that +describe the size of the font and the environment in which it will +be used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

font_face

a cairo_font_face_t

 

font_matrix

font space to user space transformation matrix for the +font. In the simplest case of a N point font, this matrix is +just a scale by N, but it can also be used to shear the font +or stretch it unequally along the two axes. See +cairo_set_font_matrix().

 

ctm

user to device transformation matrix with which the font will +be used.

 

options

options to use when getting metrics for the font and +rendering with it.

 
+
+
+

Returns

+

a newly created cairo_scaled_font_t. Destroy with +cairo_scaled_font_destroy()

+

+
+

Since 1.0

+
+
+
+

cairo_scaled_font_reference ()

+
cairo_scaled_font_t *
+cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font);
+

Increases the reference count on scaled_font + by one. This prevents +scaled_font + from being destroyed until a matching call to +cairo_scaled_font_destroy() is made.

+

The number of references to a cairo_scaled_font_t can be get using +cairo_scaled_font_get_reference_count().

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a cairo_scaled_font_t, (may be NULL in which case +this function does nothing)

 
+
+
+

Returns

+

the referenced cairo_scaled_font_t

+

+
+

Since 1.0

+
+
+
+

cairo_scaled_font_destroy ()

+
void
+cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font);
+

Decreases the reference count on font + by one. If the result +is zero, then font + and all associated resources are freed. +See cairo_scaled_font_reference().

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a cairo_scaled_font_t

 
+
+

Since 1.0

+
+
+
+

cairo_scaled_font_status ()

+
cairo_status_t
+cairo_scaled_font_status (cairo_scaled_font_t *scaled_font);
+

Checks whether an error has previously occurred for this +scaled_font.

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a cairo_scaled_font_t

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or another error such as +CAIRO_STATUS_NO_MEMORY.

+

+
+

Since 1.0

+
+
+
+

cairo_scaled_font_extents ()

+
void
+cairo_scaled_font_extents (cairo_scaled_font_t *scaled_font,
+                           cairo_font_extents_t *extents);
+

Gets the metrics for a cairo_scaled_font_t.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

extents

a cairo_font_extents_t which to store the retrieved extents.

 
+
+

Since 1.0

+
+
+
+

cairo_scaled_font_text_extents ()

+
void
+cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font,
+                                const char *utf8,
+                                cairo_text_extents_t *extents);
+

Gets the extents for a string of text. The extents describe a +user-space rectangle that encloses the "inked" portion of the text +drawn at the origin (0,0) (as it would be drawn by cairo_show_text() +if the cairo graphics state were set to the same font_face, +font_matrix, ctm, and font_options as scaled_font +). Additionally, +the x_advance and y_advance values indicate the amount by which the +current point would be advanced by cairo_show_text().

+

Note that whitespace characters do not directly contribute to the +size of the rectangle (extents.width and extents.height). They do +contribute indirectly by changing the position of non-whitespace +characters. In particular, trailing whitespace characters are +likely to not affect the size of the rectangle, though they will +affect the x_advance and y_advance values.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

utf8

a NUL-terminated string of text, encoded in UTF-8

 

extents

a cairo_text_extents_t which to store the retrieved extents.

 
+
+

Since 1.2

+
+
+
+

cairo_scaled_font_glyph_extents ()

+
void
+cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font,
+                                 const cairo_glyph_t *glyphs,
+                                 int num_glyphs,
+                                 cairo_text_extents_t *extents);
+

Gets the extents for an array of glyphs. The extents describe a +user-space rectangle that encloses the "inked" portion of the +glyphs, (as they would be drawn by cairo_show_glyphs() if the cairo +graphics state were set to the same font_face, font_matrix, ctm, +and font_options as scaled_font +). Additionally, the x_advance and +y_advance values indicate the amount by which the current point +would be advanced by cairo_show_glyphs().

+

Note that whitespace glyphs do not contribute to the size of the +rectangle (extents.width and extents.height).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

glyphs

an array of glyph IDs with X and Y offsets.

 

num_glyphs

the number of glyphs in the glyphs +array

 

extents

a cairo_text_extents_t which to store the retrieved extents.

 
+
+

Since 1.0

+
+
+
+

cairo_scaled_font_text_to_glyphs ()

+
cairo_status_t
+cairo_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font,
+                                  double x,
+                                  double y,
+                                  const char *utf8,
+                                  int utf8_len,
+                                  cairo_glyph_t **glyphs,
+                                  int *num_glyphs,
+                                  cairo_text_cluster_t **clusters,
+                                  int *num_clusters,
+                                  cairo_text_cluster_flags_t *cluster_flags);
+

Converts UTF-8 text to an array of glyphs, optionally with cluster +mapping, that can be used to render later using scaled_font +.

+

If glyphs + initially points to a non-NULL value, that array is used +as a glyph buffer, and num_glyphs + should point to the number of glyph +entries available there. If the provided glyph array is too short for +the conversion, a new glyph array is allocated using cairo_glyph_allocate() +and placed in glyphs +. Upon return, num_glyphs + always contains the +number of generated glyphs. If the value glyphs + points to has changed +after the call, the user is responsible for freeing the allocated glyph +array using cairo_glyph_free(). This may happen even if the provided +array was large enough.

+

If clusters + is not NULL, num_clusters + and cluster_flags + should not be NULL, +and cluster mapping will be computed. +The semantics of how cluster array allocation works is similar to the glyph +array. That is, +if clusters + initially points to a non-NULL value, that array is used +as a cluster buffer, and num_clusters + should point to the number of cluster +entries available there. If the provided cluster array is too short for +the conversion, a new cluster array is allocated using cairo_text_cluster_allocate() +and placed in clusters +. Upon return, num_clusters + always contains the +number of generated clusters. If the value clusters + points at has changed +after the call, the user is responsible for freeing the allocated cluster +array using cairo_text_cluster_free(). This may happen even if the provided +array was large enough.

+

In the simplest case, glyphs + and clusters + can point to NULL initially +and a suitable array will be allocated. In code:

+
+cairo_status_t status;
+
+cairo_glyph_t *glyphs = NULL;
+int num_glyphs;
+cairo_text_cluster_t *clusters = NULL;
+int num_clusters;
+cairo_text_cluster_flags_t cluster_flags;
+
+status = cairo_scaled_font_text_to_glyphs (scaled_font,
+                                           x, y,
+                                           utf8, utf8_len,
+                                           &glyphs, &num_glyphs,
+                                           &clusters, &num_clusters, &cluster_flags);
+
+if (status == CAIRO_STATUS_SUCCESS) {
+    cairo_show_text_glyphs (cr,
+                            utf8, utf8_len,
+                            glyphs, num_glyphs,
+                            clusters, num_clusters, cluster_flags);
+
+    cairo_glyph_free (glyphs);
+    cairo_text_cluster_free (clusters);
+}
+
+

If no cluster mapping is needed:

+
+cairo_status_t status;
+
+cairo_glyph_t *glyphs = NULL;
+int num_glyphs;
+
+status = cairo_scaled_font_text_to_glyphs (scaled_font,
+                                           x, y,
+                                           utf8, utf8_len,
+                                           &glyphs, &num_glyphs,
+                                           NULL, NULL,
+                                           NULL);
+
+if (status == CAIRO_STATUS_SUCCESS) {
+    cairo_show_glyphs (cr, glyphs, num_glyphs);
+    cairo_glyph_free (glyphs);
+}
+
+

If stack-based glyph and cluster arrays are to be used for small +arrays:

+
+cairo_status_t status;
+
+cairo_glyph_t stack_glyphs[40];
+cairo_glyph_t *glyphs = stack_glyphs;
+int num_glyphs = sizeof (stack_glyphs) / sizeof (stack_glyphs[0]);
+cairo_text_cluster_t stack_clusters[40];
+cairo_text_cluster_t *clusters = stack_clusters;
+int num_clusters = sizeof (stack_clusters) / sizeof (stack_clusters[0]);
+cairo_text_cluster_flags_t cluster_flags;
+
+status = cairo_scaled_font_text_to_glyphs (scaled_font,
+                                           x, y,
+                                           utf8, utf8_len,
+                                           &glyphs, &num_glyphs,
+                                           &clusters, &num_clusters, &cluster_flags);
+
+if (status == CAIRO_STATUS_SUCCESS) {
+    cairo_show_text_glyphs (cr,
+                            utf8, utf8_len,
+                            glyphs, num_glyphs,
+                            clusters, num_clusters, cluster_flags);
+
+    if (glyphs != stack_glyphs)
+        cairo_glyph_free (glyphs);
+    if (clusters != stack_clusters)
+        cairo_text_cluster_free (clusters);
+}
+
+

For details of how clusters +, num_clusters +, and cluster_flags + map input +UTF-8 text to the output glyphs see cairo_show_text_glyphs().

+

The output values can be readily passed to cairo_show_text_glyphs() +cairo_show_glyphs(), or related functions, assuming that the exact +same scaled_font + is used for the operation.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

x

X position to place first glyph

 

y

Y position to place first glyph

 

utf8

a string of text encoded in UTF-8

 

utf8_len

length of utf8 +in bytes, or -1 if it is NUL-terminated

 

glyphs

pointer to array of glyphs to fill

 

num_glyphs

pointer to number of glyphs

 

clusters

pointer to array of cluster mapping information to fill, or NULL

 

num_clusters

pointer to number of clusters, or NULL

 

cluster_flags

pointer to location to store cluster flags corresponding to the +output clusters +, or NULL

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS upon success, or an error status +if the input values are wrong or if conversion failed. If the input +values are correct but the conversion failed, the error status is also +set on scaled_font +.

+

+
+

Since 1.8

+
+
+
+

cairo_scaled_font_get_font_face ()

+
cairo_font_face_t *
+cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font);
+

Gets the font face that this scaled font uses. This might be the +font face passed to cairo_scaled_font_create(), but this does not +hold true for all possible cases.

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a cairo_scaled_font_t

 
+
+
+

Returns

+

The cairo_font_face_t with which scaled_font +was +created. This object is owned by cairo. To keep a reference to it, +you must call cairo_scaled_font_reference().

+

+
+

Since 1.2

+
+
+
+

cairo_scaled_font_get_font_options ()

+
void
+cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font,
+                                    cairo_font_options_t *options);
+

Stores the font options with which scaled_font + was created into +options +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

options

return value for the font options

 
+
+

Since 1.2

+
+
+
+

cairo_scaled_font_get_font_matrix ()

+
void
+cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font,
+                                   cairo_matrix_t *font_matrix);
+

Stores the font matrix with which scaled_font + was created into +matrix +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

font_matrix

return value for the matrix

 
+
+

Since 1.2

+
+
+
+

cairo_scaled_font_get_ctm ()

+
void
+cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font,
+                           cairo_matrix_t *ctm);
+

Stores the CTM with which scaled_font + was created into ctm +. +Note that the translation offsets (x0, y0) of the CTM are ignored +by cairo_scaled_font_create(). So, the matrix this +function returns always has 0,0 as x0,y0.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

ctm

return value for the CTM

 
+
+

Since 1.2

+
+
+
+

cairo_scaled_font_get_scale_matrix ()

+
void
+cairo_scaled_font_get_scale_matrix (cairo_scaled_font_t *scaled_font,
+                                    cairo_matrix_t *scale_matrix);
+

Stores the scale matrix of scaled_font + into matrix +. +The scale matrix is product of the font matrix and the ctm +associated with the scaled font, and hence is the matrix mapping from +font space to device space.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

scale_matrix

return value for the matrix

 
+
+

Since 1.8

+
+
+
+

cairo_scaled_font_get_type ()

+
cairo_font_type_t
+cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font);
+

This function returns the type of the backend used to create +a scaled font. See cairo_font_type_t for available types. +However, this function never returns CAIRO_FONT_TYPE_TOY.

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a cairo_scaled_font_t

 
+
+
+

Returns

+

The type of scaled_font +.

+

+
+

Since 1.2

+
+
+
+

cairo_scaled_font_get_reference_count ()

+
unsigned int
+cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font);
+

Returns the current reference count of scaled_font +.

+
+

Parameters

+
+++++ + + + + + +

scaled_font

a cairo_scaled_font_t

 
+
+
+

Returns

+

the current reference count of scaled_font +. If the +object is a nil object, 0 will be returned.

+

+
+

Since 1.4

+
+
+
+

cairo_scaled_font_set_user_data ()

+
cairo_status_t
+cairo_scaled_font_set_user_data (cairo_scaled_font_t *scaled_font,
+                                 const cairo_user_data_key_t *key,
+                                 void *user_data,
+                                 cairo_destroy_func_t destroy);
+

Attach user data to scaled_font +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

key

the address of a cairo_user_data_key_t to attach the user data to

 

user_data

the user data to attach to the cairo_scaled_font_t

 

destroy

a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key.

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.4

+
+
+
+

cairo_scaled_font_get_user_data ()

+
void *
+cairo_scaled_font_get_user_data (cairo_scaled_font_t *scaled_font,
+                                 const cairo_user_data_key_t *key);
+

Return user data previously attached to scaled_font + using the +specified key. If no user data has been attached with the given +key this function returns NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

scaled_font

a cairo_scaled_font_t

 

key

the address of the cairo_user_data_key_t the user data was +attached to

 
+
+
+

Returns

+

the user data previously attached or NULL.

+

+
+

Since 1.4

+
+
+
+

Types and Values

+
+

cairo_scaled_font_t

+
typedef struct _cairo_scaled_font cairo_scaled_font_t;
+
+

A cairo_scaled_font_t is a font scaled to a particular size and device +resolution. A cairo_scaled_font_t is most useful for low-level font +usage where a library or application wants to cache a reference +to a scaled font to speed up the computation of metrics.

+

There are various types of scaled fonts, depending on the +font backend they use. The type of a +scaled font can be queried using cairo_scaled_font_get_type().

+

Memory management of cairo_scaled_font_t is done with +cairo_scaled_font_reference() and cairo_scaled_font_destroy().

+

Since 1.0

+
+
+
+

cairo_font_extents_t

+
typedef struct {
+    double ascent;
+    double descent;
+    double height;
+    double max_x_advance;
+    double max_y_advance;
+} cairo_font_extents_t;
+
+

The cairo_font_extents_t structure stores metric information for +a font. Values are given in the current user-space coordinate +system.

+

Because font metrics are in user-space coordinates, they are +mostly, but not entirely, independent of the current transformation +matrix. If you call cairo_scale(cr, 2.0, 2.0), +text will be drawn twice as big, but the reported text extents will +not be doubled. They will change slightly due to hinting (so you +can't assume that metrics are independent of the transformation +matrix), but otherwise will remain unchanged.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

double ascent;

the distance that the font extends above the baseline. +Note that this is not always exactly equal to the maximum +of the extents of all the glyphs in the font, but rather +is picked to express the font designer's intent as to +how the font should align with elements above it.

 

double descent;

the distance that the font extends below the baseline. +This value is positive for typical fonts that include +portions below the baseline. Note that this is not always +exactly equal to the maximum of the extents of all the +glyphs in the font, but rather is picked to express the +font designer's intent as to how the font should +align with elements below it.

 

double height;

the recommended vertical distance between baselines when +setting consecutive lines of text with the font. This +is greater than ascent ++descent +by a +quantity known as the line spacing +or external leading. When space +is at a premium, most fonts can be set with only +a distance of ascent ++descent +between lines.

 

double max_x_advance;

the maximum distance in the X direction that +the origin is advanced for any glyph in the font.

 

double max_y_advance;

the maximum distance in the Y direction that +the origin is advanced for any glyph in the font. +This will be zero for normal fonts used for horizontal +writing. (The scripts of East Asia are sometimes written +vertically.)

 
+
+

Since 1.0

+
+
+
+

cairo_text_extents_t

+
typedef struct {
+    double x_bearing;
+    double y_bearing;
+    double width;
+    double height;
+    double x_advance;
+    double y_advance;
+} cairo_text_extents_t;
+
+

The cairo_text_extents_t structure stores the extents of a single +glyph or a string of glyphs in user-space coordinates. Because text +extents are in user-space coordinates, they are mostly, but not +entirely, independent of the current transformation matrix. If you call +cairo_scale(cr, 2.0, 2.0), text will +be drawn twice as big, but the reported text extents will not be +doubled. They will change slightly due to hinting (so you can't +assume that metrics are independent of the transformation matrix), +but otherwise will remain unchanged.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

double x_bearing;

the horizontal distance from the origin to the +leftmost part of the glyphs as drawn. Positive if the +glyphs lie entirely to the right of the origin.

 

double y_bearing;

the vertical distance from the origin to the +topmost part of the glyphs as drawn. Positive only if the +glyphs lie completely below the origin; will usually be +negative.

 

double width;

width of the glyphs as drawn

 

double height;

height of the glyphs as drawn

 

double x_advance;

distance to advance in the X direction +after drawing these glyphs

 

double y_advance;

distance to advance in the Y direction +after drawing these glyphs. Will typically be zero except +for vertical text layout as found in East-Asian languages.

 
+
+

Since 1.0

+
+
+ +
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-surface-t.html b/doc/public/html/cairo-cairo-surface-t.html new file mode 100644 index 000000000..b8049bf0c --- /dev/null +++ b/doc/public/html/cairo-cairo-surface-t.html @@ -0,0 +1,2073 @@ + + + + +Cairo: A Vector Graphics Library: cairo_surface_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_surface_t

+

cairo_surface_t — Base class for surfaces

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_surface_t * + +cairo_surface_create_similar () +
+cairo_surface_t * + +cairo_surface_create_similar_image () +
+cairo_surface_t * + +cairo_surface_create_for_rectangle () +
+cairo_surface_t * + +cairo_surface_reference () +
+void + +cairo_surface_destroy () +
+cairo_status_t + +cairo_surface_status () +
+void + +cairo_surface_finish () +
+void + +cairo_surface_flush () +
+cairo_device_t * + +cairo_surface_get_device () +
+void + +cairo_surface_get_font_options () +
+cairo_content_t + +cairo_surface_get_content () +
+void + +cairo_surface_mark_dirty () +
+void + +cairo_surface_mark_dirty_rectangle () +
+void + +cairo_surface_set_device_offset () +
+void + +cairo_surface_get_device_offset () +
+void + +cairo_surface_get_device_scale () +
+void + +cairo_surface_set_device_scale () +
+void + +cairo_surface_set_fallback_resolution () +
+void + +cairo_surface_get_fallback_resolution () +
+cairo_surface_type_t + +cairo_surface_get_type () +
unsigned int + +cairo_surface_get_reference_count () +
+cairo_status_t + +cairo_surface_set_user_data () +
+void * + +cairo_surface_get_user_data () +
+void + +cairo_surface_copy_page () +
+void + +cairo_surface_show_page () +
+cairo_bool_t + +cairo_surface_has_show_text_glyphs () +
+cairo_status_t + +cairo_surface_set_mime_data () +
+void + +cairo_surface_get_mime_data () +
+cairo_bool_t + +cairo_surface_supports_mime_type () +
+cairo_surface_t * + +cairo_surface_map_to_image () +
+void + +cairo_surface_unmap_image () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#defineCAIRO_HAS_MIME_SURFACE
#defineCAIRO_MIME_TYPE_JBIG2
#defineCAIRO_MIME_TYPE_JBIG2_GLOBAL
#defineCAIRO_MIME_TYPE_JBIG2_GLOBAL_ID
#defineCAIRO_MIME_TYPE_JP2
#defineCAIRO_MIME_TYPE_JPEG
#defineCAIRO_MIME_TYPE_PNG
#defineCAIRO_MIME_TYPE_URI
#defineCAIRO_MIME_TYPE_UNIQUE_ID
typedefcairo_surface_t
enumcairo_content_t
enumcairo_surface_type_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

cairo_surface_t is the abstract type representing all different drawing +targets that cairo can render to. The actual drawings are +performed using a cairo context.

+

A cairo surface is created by using backend-specific +constructors, typically of the form +cairo_backend_surface_create().

+

Most surface types allow accessing the surface without using Cairo +functions. If you do this, keep in mind that it is mandatory that you call +cairo_surface_flush() before reading from or writing to the surface and that +you must use cairo_surface_mark_dirty() after modifying it.

+
+

Example 1. Directly modifying an image surface

+
+void
+modify_image_surface (cairo_surface_t *surface)
+{
+  unsigned char *data;
+  int width, height, stride;
+
+  // flush to ensure all writing to the image was done
+  cairo_surface_flush (surface);
+
+  // modify the image
+  data = cairo_image_surface_get_data (surface);
+  width = cairo_image_surface_get_width (surface);
+  height = cairo_image_surface_get_height (surface);
+  stride = cairo_image_surface_get_stride (surface);
+  modify_image_data (data, width, height, stride);
+
+  // mark the image dirty so Cairo clears its caches.
+  cairo_surface_mark_dirty (surface);
+}
+
+
+

Note that for other surface types it might be necessary to acquire the +surface's device first. See cairo_device_acquire() for a discussion of +devices.

+
+
+

Functions

+
+

cairo_surface_create_similar ()

+
cairo_surface_t *
+cairo_surface_create_similar (cairo_surface_t *other,
+                              cairo_content_t content,
+                              int width,
+                              int height);
+

Create a new surface that is as compatible as possible with an +existing surface. For example the new surface will have the same +fallback resolution and font options as other +. Generally, the new +surface will also use the same backend as other +, unless that is +not possible for some reason. The type of the returned surface may +be examined with cairo_surface_get_type().

+

Initially the surface contents are all 0 (transparent if contents +have transparency, black otherwise.)

+

Use cairo_surface_create_similar_image() if you need an image surface +which can be painted quickly to the target surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

other

an existing surface used to select the backend of the new surface

 

content

the content for the new surface

 

width

width of the new surface, (in device-space units)

 

height

height of the new surface (in device-space units)

 
+
+
+

Returns

+

a pointer to the newly allocated surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs.

+

+
+

Since 1.0

+
+
+
+

cairo_surface_create_similar_image ()

+
cairo_surface_t *
+cairo_surface_create_similar_image (cairo_surface_t *other,
+                                    cairo_format_t format,
+                                    int width,
+                                    int height);
+

Create a new image surface that is as compatible as possible for uploading +to and the use in conjunction with an existing surface. However, this surface +can still be used like any normal image surface.

+

Initially the surface contents are all 0 (transparent if contents +have transparency, black otherwise.)

+

Use cairo_surface_create_similar() if you don't need an image surface.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

other

an existing surface used to select the preference of the new surface

 

format

the format for the new surface

 

width

width of the new surface, (in device-space units)

 

height

height of the new surface (in device-space units)

 
+
+
+

Returns

+

a pointer to the newly allocated image surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs.

+

+
+

Since 1.12

+
+
+
+

cairo_surface_create_for_rectangle ()

+
cairo_surface_t *
+cairo_surface_create_for_rectangle (cairo_surface_t *target,
+                                    double x,
+                                    double y,
+                                    double width,
+                                    double height);
+

Create a new surface that is a rectangle within the target surface. +All operations drawn to this surface are then clipped and translated +onto the target surface. Nothing drawn via this sub-surface outside of +its bounds is drawn onto the target surface, making this a useful method +for passing constrained child surfaces to library routines that draw +directly onto the parent surface, i.e. with no further backend allocations, +double buffering or copies.

+

The semantics of subsurfaces have not been finalized yet +unless the rectangle is in full device units, is contained within +the extents of the target surface, and the target or subsurface's +device transforms are not changed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

target

an existing surface for which the sub-surface will point to

 

x

the x-origin of the sub-surface from the top-left of the target surface (in device-space units)

 

y

the y-origin of the sub-surface from the top-left of the target surface (in device-space units)

 

width

width of the sub-surface (in device-space units)

 

height

height of the sub-surface (in device-space units)

 
+
+
+

Returns

+

a pointer to the newly allocated surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs.

+

+
+

Since 1.10

+
+
+
+

cairo_surface_reference ()

+
cairo_surface_t *
+cairo_surface_reference (cairo_surface_t *surface);
+

Increases the reference count on surface + by one. This prevents +surface + from being destroyed until a matching call to +cairo_surface_destroy() is made.

+

The number of references to a cairo_surface_t can be get using +cairo_surface_get_reference_count().

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

the referenced cairo_surface_t.

+

+
+

Since 1.0

+
+
+
+

cairo_surface_destroy ()

+
void
+cairo_surface_destroy (cairo_surface_t *surface);
+

Decreases the reference count on surface + by one. If the result is +zero, then surface + and all associated resources are freed. See +cairo_surface_reference().

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+

Since 1.0

+
+
+
+

cairo_surface_status ()

+
cairo_status_t
+cairo_surface_status (cairo_surface_t *surface);
+

Checks whether an error has previously occurred for this +surface.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+ +

Since 1.0

+
+
+
+

cairo_surface_finish ()

+
void
+cairo_surface_finish (cairo_surface_t *surface);
+

This function finishes the surface and drops all references to +external resources. For example, for the Xlib backend it means +that cairo will no longer access the drawable, which can be freed. +After calling cairo_surface_finish() the only valid operations on a +surface are getting and setting user, referencing and +destroying, and flushing and finishing it. +Further drawing to the surface will not affect the +surface but will instead trigger a CAIRO_STATUS_SURFACE_FINISHED +error.

+

When the last call to cairo_surface_destroy() decreases the +reference count to zero, cairo will call cairo_surface_finish() if +it hasn't been called already, before freeing the resources +associated with the surface.

+
+

Parameters

+
+++++ + + + + + +

surface

the cairo_surface_t to finish

 
+
+

Since 1.0

+
+
+
+

cairo_surface_flush ()

+
void
+cairo_surface_flush (cairo_surface_t *surface);
+

Do any pending drawing for the surface and also restore any +temporary modifications cairo has made to the surface's +state. This function must be called before switching from +drawing on the surface with cairo to drawing on it directly +with native APIs. If the surface doesn't support direct access, +then this function does nothing.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+

Since 1.0

+
+
+
+

cairo_surface_get_device ()

+
cairo_device_t *
+cairo_surface_get_device (cairo_surface_t *surface);
+

This function returns the device for a surface +. +See cairo_device_t.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

The device for surface +or NULL if the surface does +not have an associated device.

+

+
+

Since 1.10

+
+
+
+

cairo_surface_get_font_options ()

+
void
+cairo_surface_get_font_options (cairo_surface_t *surface,
+                                cairo_font_options_t *options);
+

Retrieves the default font rendering options for the surface. +This allows display surfaces to report the correct subpixel order +for rendering on them, print surfaces to disable hinting of +metrics and so forth. The result can then be used with +cairo_scaled_font_create().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a cairo_surface_t

 

options

a cairo_font_options_t object into which to store +the retrieved options. All existing values are overwritten

 
+
+

Since 1.0

+
+
+
+

cairo_surface_get_content ()

+
cairo_content_t
+cairo_surface_get_content (cairo_surface_t *surface);
+

This function returns the content type of surface + which indicates +whether the surface contains color and/or alpha information. See +cairo_content_t.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

The content type of surface +.

+

+
+

Since 1.2

+
+
+
+

cairo_surface_mark_dirty ()

+
void
+cairo_surface_mark_dirty (cairo_surface_t *surface);
+

Tells cairo that drawing has been done to surface using means other +than cairo, and that cairo should reread any cached areas. Note +that you must call cairo_surface_flush() before doing such drawing.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+

Since 1.0

+
+
+
+

cairo_surface_mark_dirty_rectangle ()

+
void
+cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface,
+                                    int x,
+                                    int y,
+                                    int width,
+                                    int height);
+

Like cairo_surface_mark_dirty(), but drawing has been done only to +the specified rectangle, so that cairo can retain cached contents +for other parts of the surface.

+

Any cached clip set on the surface will be reset by this function, +to make sure that future cairo calls have the clip set that they +expect.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x

X coordinate of dirty rectangle

 

y

Y coordinate of dirty rectangle

 

width

width of dirty rectangle

 

height

height of dirty rectangle

 
+
+

Since 1.0

+
+
+
+

cairo_surface_set_device_offset ()

+
void
+cairo_surface_set_device_offset (cairo_surface_t *surface,
+                                 double x_offset,
+                                 double y_offset);
+

Sets an offset that is added to the device coordinates determined +by the CTM when drawing to surface +. One use case for this function +is when we want to create a cairo_surface_t that redirects drawing +for a portion of an onscreen surface to an offscreen surface in a +way that is completely invisible to the user of the cairo +API. Setting a transformation via cairo_translate() isn't +sufficient to do this, since functions like +cairo_device_to_user() will expose the hidden offset.

+

Note that the offset affects drawing to the surface as well as +using the surface in a source pattern.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x_offset

the offset in the X direction, in device units

 

y_offset

the offset in the Y direction, in device units

 
+
+

Since 1.0

+
+
+
+

cairo_surface_get_device_offset ()

+
void
+cairo_surface_get_device_offset (cairo_surface_t *surface,
+                                 double *x_offset,
+                                 double *y_offset);
+

This function returns the previous device offset set by +cairo_surface_set_device_offset().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x_offset

the offset in the X direction, in device units

 

y_offset

the offset in the Y direction, in device units

 
+
+

Since 1.2

+
+
+
+

cairo_surface_get_device_scale ()

+
void
+cairo_surface_get_device_scale (cairo_surface_t *surface,
+                                double *x_scale,
+                                double *y_scale);
+

This function returns the previous device offset set by +cairo_surface_set_device_scale().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x_scale

the scale in the X direction, in device units

 

y_scale

the scale in the Y direction, in device units

 
+
+

Since 1.14

+
+
+
+

cairo_surface_set_device_scale ()

+
void
+cairo_surface_set_device_scale (cairo_surface_t *surface,
+                                double x_scale,
+                                double y_scale);
+

Sets a scale that is multiplied to the device coordinates determined +by the CTM when drawing to surface +. One common use for this is to +render to very high resolution display devices at a scale factor, so +that code that assumes 1 pixel will be a certain size will still work. +Setting a transformation via cairo_translate() isn't +sufficient to do this, since functions like +cairo_device_to_user() will expose the hidden scale.

+

Note that the scale affects drawing to the surface as well as +using the surface in a source pattern.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x_scale

a scale factor in the X direction

 

y_scale

a scale factor in the Y direction

 
+
+

Since 1.14

+
+
+
+

cairo_surface_set_fallback_resolution ()

+
void
+cairo_surface_set_fallback_resolution (cairo_surface_t *surface,
+                                       double x_pixels_per_inch,
+                                       double y_pixels_per_inch);
+

Set the horizontal and vertical resolution for image fallbacks.

+

When certain operations aren't supported natively by a backend, +cairo will fallback by rendering operations to an image and then +overlaying that image onto the output. For backends that are +natively vector-oriented, this function can be used to set the +resolution used for these image fallbacks, (larger values will +result in more detailed images, but also larger file sizes).

+

Some examples of natively vector-oriented backends are the ps, pdf, +and svg backends.

+

For backends that are natively raster-oriented, image fallbacks are +still possible, but they are always performed at the native +device resolution. So this function has no effect on those +backends.

+

Note: The fallback resolution only takes effect at the time of +completing a page (with cairo_show_page() or cairo_copy_page()) so +there is currently no way to have more than one fallback resolution +in effect on a single page.

+

The default fallback resoultion is 300 pixels per inch in both +dimensions.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x_pixels_per_inch

horizontal setting for pixels per inch

 

y_pixels_per_inch

vertical setting for pixels per inch

 
+
+

Since 1.2

+
+
+
+

cairo_surface_get_fallback_resolution ()

+
void
+cairo_surface_get_fallback_resolution (cairo_surface_t *surface,
+                                       double *x_pixels_per_inch,
+                                       double *y_pixels_per_inch);
+

This function returns the previous fallback resolution set by +cairo_surface_set_fallback_resolution(), or default fallback +resolution if never set.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

x_pixels_per_inch

horizontal pixels per inch

 

y_pixels_per_inch

vertical pixels per inch

 
+
+

Since 1.8

+
+
+
+

cairo_surface_get_type ()

+
cairo_surface_type_t
+cairo_surface_get_type (cairo_surface_t *surface);
+

This function returns the type of the backend used to create +a surface. See cairo_surface_type_t for available types.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

The type of surface +.

+

+
+

Since 1.2

+
+
+
+

cairo_surface_get_reference_count ()

+
unsigned int
+cairo_surface_get_reference_count (cairo_surface_t *surface);
+

Returns the current reference count of surface +.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

the current reference count of surface +. If the +object is a nil object, 0 will be returned.

+

+
+

Since 1.4

+
+
+
+

cairo_surface_set_user_data ()

+
cairo_status_t
+cairo_surface_set_user_data (cairo_surface_t *surface,
+                             const cairo_user_data_key_t *key,
+                             void *user_data,
+                             cairo_destroy_func_t destroy);
+

Attach user data to surface +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

key

the address of a cairo_user_data_key_t to attach the user data to

 

user_data

the user data to attach to the surface

 

destroy

a cairo_destroy_func_t which will be called when the +surface is destroyed or when new user data is attached using the +same key.

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.0

+
+
+
+

cairo_surface_get_user_data ()

+
void *
+cairo_surface_get_user_data (cairo_surface_t *surface,
+                             const cairo_user_data_key_t *key);
+

Return user data previously attached to surface + using the specified +key. If no user data has been attached with the given key this +function returns NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a cairo_surface_t

 

key

the address of the cairo_user_data_key_t the user data was +attached to

 
+
+
+

Returns

+

the user data previously attached or NULL.

+

+
+

Since 1.0

+
+
+
+

cairo_surface_copy_page ()

+
void
+cairo_surface_copy_page (cairo_surface_t *surface);
+

Emits the current page for backends that support multiple pages, +but doesn't clear it, so that the contents of the current page will +be retained for the next page. Use cairo_surface_show_page() if you +want to get an empty page after the emission.

+

There is a convenience function for this that takes a cairo_t, +namely cairo_copy_page().

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+

Since 1.6

+
+
+
+

cairo_surface_show_page ()

+
void
+cairo_surface_show_page (cairo_surface_t *surface);
+

Emits and clears the current page for backends that support multiple +pages. Use cairo_surface_copy_page() if you don't want to clear the page.

+

There is a convenience function for this that takes a cairo_t, +namely cairo_show_page().

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_Surface_t

 
+
+

Since 1.6

+
+
+
+

cairo_surface_has_show_text_glyphs ()

+
cairo_bool_t
+cairo_surface_has_show_text_glyphs (cairo_surface_t *surface);
+

Returns whether the surface supports +sophisticated cairo_show_text_glyphs() operations. That is, +whether it actually uses the provided text and cluster data +to a cairo_show_text_glyphs() call.

+

Note: Even if this function returns FALSE, a +cairo_show_text_glyphs() operation targeted at surface + will +still succeed. It just will +act like a cairo_show_glyphs() operation. Users can use this +function to avoid computing UTF-8 text and cluster mapping if the +target surface does not use it.

+
+

Parameters

+
+++++ + + + + + +

surface

a cairo_surface_t

 
+
+
+

Returns

+

TRUE if surface +supports +cairo_show_text_glyphs(), FALSE otherwise

+

+
+

Since 1.8

+
+
+
+

cairo_surface_set_mime_data ()

+
cairo_status_t
+cairo_surface_set_mime_data (cairo_surface_t *surface,
+                             const char *mime_type,
+                             const unsigned char *data,
+                             unsigned long  length,
+                             cairo_destroy_func_t destroy,
+                             void *closure);
+

Attach an image in the format mime_type + to surface +. To remove +the data from a surface, call this function with same mime type +and NULL for data +.

+

The attached image (or filename) data can later be used by backends +which support it (currently: PDF, PS, SVG and Win32 Printing +surfaces) to emit this data instead of making a snapshot of the +surface +. This approach tends to be faster and requires less +memory and disk space.

+

The recognized MIME types are the following: CAIRO_MIME_TYPE_JPEG, +CAIRO_MIME_TYPE_PNG, CAIRO_MIME_TYPE_JP2, CAIRO_MIME_TYPE_URI, +CAIRO_MIME_TYPE_UNIQUE_ID, CAIRO_MIME_TYPE_JBIG2, +CAIRO_MIME_TYPE_JBIG2_GLOBAL, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID.

+

See corresponding backend surface docs for details about which MIME +types it can handle. Caution: the associated MIME data will be +discarded if you draw on the surface afterwards. Use this function +with care.

+

Even if a backend supports a MIME type, that does not mean cairo +will always be able to use the attached MIME data. For example, if +the backend does not natively support the compositing operation used +to apply the MIME data to the backend. In that case, the MIME data +will be ignored. Therefore, to apply an image in all cases, it is best +to create an image surface which contains the decoded image data and +then attach the MIME data to that. This ensures the image will always +be used while still allowing the MIME data to be used whenever +possible.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

mime_type

the MIME type of the image data

 

data

the image data to attach to the surface

 

length

the length of the image data

 

destroy

a cairo_destroy_func_t which will be called when the +surface is destroyed or when new image data is attached using the +same mime type.

 

closure

the data to be passed to the destroy +notifier

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.10

+
+
+
+

cairo_surface_get_mime_data ()

+
void
+cairo_surface_get_mime_data (cairo_surface_t *surface,
+                             const char *mime_type,
+                             const unsigned char **data,
+                             unsigned long *length);
+

Return mime data previously attached to surface + using the +specified mime type. If no data has been attached with the given +mime type, data + is set NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

surface

a cairo_surface_t

 

mime_type

the mime type of the image data

 

data

the image data to attached to the surface

 

length

the length of the image data

 
+
+

Since 1.10

+
+
+
+

cairo_surface_supports_mime_type ()

+
cairo_bool_t
+cairo_surface_supports_mime_type (cairo_surface_t *surface,
+                                  const char *mime_type);
+

Return whether surface + supports mime_type +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

a cairo_surface_t

 

mime_type

the mime type

 
+
+
+

Returns

+

TRUE if surface +supports +mime_type +, FALSE otherwise

+

+
+

Since 1.12

+
+
+
+

cairo_surface_map_to_image ()

+
cairo_surface_t *
+cairo_surface_map_to_image (cairo_surface_t *surface,
+                            const cairo_rectangle_int_t *extents);
+

Returns an image surface that is the most efficient mechanism for +modifying the backing store of the target surface. The region retrieved +may be limited to the extents + or NULL for the whole surface

+

Note, the use of the original surface as a target or source whilst +it is mapped is undefined. The result of mapping the surface +multiple times is undefined. Calling cairo_surface_destroy() or +cairo_surface_finish() on the resulting image surface results in +undefined behavior. Changing the device transform of the image +surface or of surface + before the image surface is unmapped results +in undefined behavior.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

an existing surface used to extract the image from

 

extents

limit the extraction to an rectangular region

 
+
+
+

Returns

+

a pointer to the newly allocated image surface. The caller +must use cairo_surface_unmap_image() to destroy this image surface.

+

This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs. If the returned pointer does not have an +error status, it is guaranteed to be an image surface whose format +is not CAIRO_FORMAT_INVALID.

+

+
+

Since 1.12

+
+
+
+

cairo_surface_unmap_image ()

+
void
+cairo_surface_unmap_image (cairo_surface_t *surface,
+                           cairo_surface_t *image);
+

Unmaps the image surface as returned from cairo_surface_map_to_image().

+

The content of the image will be uploaded to the target surface. +Afterwards, the image is destroyed.

+

Using an image surface which wasn't returned by cairo_surface_map_to_image() +results in undefined behavior.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

surface

the surface passed to cairo_surface_map_to_image().

 

image

the currently mapped image

 
+
+

Since 1.12

+
+
+
+

Types and Values

+
+

CAIRO_HAS_MIME_SURFACE

+
#define CAIRO_HAS_MIME_SURFACE 1
+
+

+

+
+
+
+

CAIRO_MIME_TYPE_JBIG2

+
#define CAIRO_MIME_TYPE_JBIG2 "application/x-cairo.jbig2"
+
+

Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544).

+

Since 1.14

+
+
+
+

CAIRO_MIME_TYPE_JBIG2_GLOBAL

+
#define CAIRO_MIME_TYPE_JBIG2_GLOBAL "application/x-cairo.jbig2-global"
+
+

Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544) global segment.

+

Since 1.14

+
+
+
+

CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID

+
#define CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID "application/x-cairo.jbig2-global-id"
+
+

An unique identifier shared by a JBIG2 global segment and all JBIG2 images +that depend on the global segment.

+

Since 1.14

+
+
+
+

CAIRO_MIME_TYPE_JP2

+
#define CAIRO_MIME_TYPE_JP2 "image/jp2"
+
+

The Joint Photographic Experts Group (JPEG) 2000 image coding standard (ISO/IEC 15444-1).

+

Since 1.10

+
+
+
+

CAIRO_MIME_TYPE_JPEG

+
#define CAIRO_MIME_TYPE_JPEG "image/jpeg"
+
+

The Joint Photographic Experts Group (JPEG) image coding standard (ISO/IEC 10918-1).

+

Since 1.10

+
+
+
+

CAIRO_MIME_TYPE_PNG

+
#define CAIRO_MIME_TYPE_PNG "image/png"
+
+

The Portable Network Graphics image file format (ISO/IEC 15948).

+

Since 1.10

+
+
+
+

CAIRO_MIME_TYPE_URI

+
#define CAIRO_MIME_TYPE_URI "text/x-uri"
+
+

URI for an image file (unofficial MIME type).

+

Since 1.10

+
+
+
+

CAIRO_MIME_TYPE_UNIQUE_ID

+
#define CAIRO_MIME_TYPE_UNIQUE_ID "application/x-cairo.uuid"
+
+

Unique identifier for a surface (cairo specific MIME type). All surfaces with +the same unique identifier will only be embedded once.

+

Since 1.12

+
+
+
+

cairo_surface_t

+
typedef struct _cairo_surface cairo_surface_t;
+
+

A cairo_surface_t represents an image, either as the destination +of a drawing operation or as source when drawing onto another +surface. To draw to a cairo_surface_t, create a cairo context +with the surface as the target, using cairo_create().

+

There are different subtypes of cairo_surface_t for +different drawing backends; for example, cairo_image_surface_create() +creates a bitmap image in memory. +The type of a surface can be queried with cairo_surface_get_type().

+

The initial contents of a surface after creation depend upon the manner +of its creation. If cairo creates the surface and backing storage for +the user, it will be initially cleared; for example, +cairo_image_surface_create() and cairo_surface_create_similar(). +Alternatively, if the user passes in a reference to some backing storage +and asks cairo to wrap that in a cairo_surface_t, then the contents are +not modified; for example, cairo_image_surface_create_for_data() and +cairo_xlib_surface_create().

+

Memory management of cairo_surface_t is done with +cairo_surface_reference() and cairo_surface_destroy().

+

Since 1.0

+
+
+
+

enum cairo_content_t

+

cairo_content_t is used to describe the content that a surface will +contain, whether color information, alpha information (translucence +vs. opacity), or both.

+

Note: The large values here are designed to keep cairo_content_t +values distinct from cairo_format_t values so that the +implementation can detect the error if users confuse the two types.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

CAIRO_CONTENT_COLOR

+

The surface will hold color content only. (Since 1.0)

+
 

CAIRO_CONTENT_ALPHA

+

The surface will hold alpha content only. (Since 1.0)

+
 

CAIRO_CONTENT_COLOR_ALPHA

+

The surface will hold color and alpha content. (Since 1.0)

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_surface_type_t

+

cairo_surface_type_t is used to describe the type of a given +surface. The surface types are also known as "backends" or "surface +backends" within cairo.

+

The type of a surface is determined by the function used to create +it, which will generally be of the form +cairo_type_surface_create(), +(though see cairo_surface_create_similar() as well).

+

The surface type can be queried with cairo_surface_get_type()

+

The various cairo_surface_t functions can be used with surfaces of +any type, but some backends also provide type-specific functions +that must only be called with a surface of the appropriate +type. These functions have names that begin with +cairo_type_surface such as cairo_image_surface_get_width().

+

The behavior of calling a type-specific function with a surface of +the wrong type is undefined.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_SURFACE_TYPE_IMAGE

+

The surface is of type image, since 1.2

+
 

CAIRO_SURFACE_TYPE_PDF

+

The surface is of type pdf, since 1.2

+
 

CAIRO_SURFACE_TYPE_PS

+

The surface is of type ps, since 1.2

+
 

CAIRO_SURFACE_TYPE_XLIB

+

The surface is of type xlib, since 1.2

+
 

CAIRO_SURFACE_TYPE_XCB

+

The surface is of type xcb, since 1.2

+
 

CAIRO_SURFACE_TYPE_GLITZ

+

The surface is of type glitz, since 1.2

+
 

CAIRO_SURFACE_TYPE_QUARTZ

+

The surface is of type quartz, since 1.2

+
 

CAIRO_SURFACE_TYPE_WIN32

+

The surface is of type win32, since 1.2

+
 

CAIRO_SURFACE_TYPE_BEOS

+

The surface is of type beos, since 1.2

+
 

CAIRO_SURFACE_TYPE_DIRECTFB

+

The surface is of type directfb, since 1.2

+
 

CAIRO_SURFACE_TYPE_SVG

+

The surface is of type svg, since 1.2

+
 

CAIRO_SURFACE_TYPE_OS2

+

The surface is of type os2, since 1.4

+
 

CAIRO_SURFACE_TYPE_WIN32_PRINTING

+

The surface is a win32 printing surface, since 1.6

+
 

CAIRO_SURFACE_TYPE_QUARTZ_IMAGE

+

The surface is of type quartz_image, since 1.6

+
 

CAIRO_SURFACE_TYPE_SCRIPT

+

The surface is of type script, since 1.10

+
 

CAIRO_SURFACE_TYPE_QT

+

The surface is of type Qt, since 1.10

+
 

CAIRO_SURFACE_TYPE_RECORDING

+

The surface is of type recording, since 1.10

+
 

CAIRO_SURFACE_TYPE_VG

+

The surface is a OpenVG surface, since 1.10

+
 

CAIRO_SURFACE_TYPE_GL

+

The surface is of type OpenGL, since 1.10

+
 

CAIRO_SURFACE_TYPE_DRM

+

The surface is of type Direct Render Manager, since 1.10

+
 

CAIRO_SURFACE_TYPE_TEE

+

The surface is of type 'tee' (a multiplexing surface), since 1.10

+
 

CAIRO_SURFACE_TYPE_XML

+

The surface is of type XML (for debugging), since 1.10

+
 

CAIRO_SURFACE_TYPE_SKIA

+

The surface is of type Skia, since 1.10

+
 

CAIRO_SURFACE_TYPE_SUBSURFACE

+

The surface is a subsurface created with + cairo_surface_create_for_rectangle(), since 1.10

+
 

CAIRO_SURFACE_TYPE_COGL

+

This surface is of type Cogl, since 1.12

+
 
+
+

Since 1.2

+
+
+
+

See Also

+

cairo_t, cairo_pattern_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-cairo-t.html b/doc/public/html/cairo-cairo-t.html new file mode 100644 index 000000000..5541679bc --- /dev/null +++ b/doc/public/html/cairo-cairo-t.html @@ -0,0 +1,3494 @@ + + + + +Cairo: A Vector Graphics Library: cairo_t + + + + + + + + + + + + + + + + +
+
+
+ + +
+

cairo_t

+

cairo_t — The cairo drawing context

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+cairo_t * + +cairo_create () +
+cairo_t * + +cairo_reference () +
+void + +cairo_destroy () +
+cairo_status_t + +cairo_status () +
+void + +cairo_save () +
+void + +cairo_restore () +
+cairo_surface_t * + +cairo_get_target () +
+void + +cairo_push_group () +
+void + +cairo_push_group_with_content () +
+cairo_pattern_t * + +cairo_pop_group () +
+void + +cairo_pop_group_to_source () +
+cairo_surface_t * + +cairo_get_group_target () +
+void + +cairo_set_source_rgb () +
+void + +cairo_set_source_rgba () +
+void + +cairo_set_source () +
+void + +cairo_set_source_surface () +
+cairo_pattern_t * + +cairo_get_source () +
+void + +cairo_set_antialias () +
+cairo_antialias_t + +cairo_get_antialias () +
+void + +cairo_set_dash () +
+int + +cairo_get_dash_count () +
+void + +cairo_get_dash () +
+void + +cairo_set_fill_rule () +
+cairo_fill_rule_t + +cairo_get_fill_rule () +
+void + +cairo_set_line_cap () +
+cairo_line_cap_t + +cairo_get_line_cap () +
+void + +cairo_set_line_join () +
+cairo_line_join_t + +cairo_get_line_join () +
+void + +cairo_set_line_width () +
+double + +cairo_get_line_width () +
+void + +cairo_set_miter_limit () +
+double + +cairo_get_miter_limit () +
+void + +cairo_set_operator () +
+cairo_operator_t + +cairo_get_operator () +
+void + +cairo_set_tolerance () +
+double + +cairo_get_tolerance () +
+void + +cairo_clip () +
+void + +cairo_clip_preserve () +
+void + +cairo_clip_extents () +
+cairo_bool_t + +cairo_in_clip () +
+void + +cairo_reset_clip () +
+void + +cairo_rectangle_list_destroy () +
+cairo_rectangle_list_t * + +cairo_copy_clip_rectangle_list () +
+void + +cairo_fill () +
+void + +cairo_fill_preserve () +
+void + +cairo_fill_extents () +
+cairo_bool_t + +cairo_in_fill () +
+void + +cairo_mask () +
+void + +cairo_mask_surface () +
+void + +cairo_paint () +
+void + +cairo_paint_with_alpha () +
+void + +cairo_stroke () +
+void + +cairo_stroke_preserve () +
+void + +cairo_stroke_extents () +
+cairo_bool_t + +cairo_in_stroke () +
+void + +cairo_copy_page () +
+void + +cairo_show_page () +
unsigned int + +cairo_get_reference_count () +
+cairo_status_t + +cairo_set_user_data () +
+void * + +cairo_get_user_data () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
typedefcairo_t
enumcairo_antialias_t
enumcairo_fill_rule_t
enumcairo_line_cap_t
enumcairo_line_join_t
enumcairo_operator_t
 cairo_rectangle_t
 cairo_rectangle_list_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

cairo_t is the main object used when drawing with cairo. To +draw with cairo, you create a cairo_t, set the target surface, +and drawing options for the cairo_t, create shapes with +functions like cairo_move_to() and cairo_line_to(), and then +draw shapes with cairo_stroke() or cairo_fill().

+

cairo_t's can be pushed to a stack via cairo_save(). +They may then safely be changed, without losing the current state. +Use cairo_restore() to restore to the saved state.

+
+
+

Functions

+
+

cairo_create ()

+
cairo_t *
+cairo_create (cairo_surface_t *target);
+

Creates a new cairo_t with all graphics state parameters set to +default values and with target + as a target surface. The target +surface should be constructed with a backend-specific function such +as cairo_image_surface_create() (or any other +cairo_backend_surface_create() +variant).

+

This function references target +, so you can immediately +call cairo_surface_destroy() on it if you don't need to +maintain a separate reference to it.

+
+

Parameters

+
+++++ + + + + + +

target

target surface for the context

 
+
+
+

Returns

+

a newly allocated cairo_t with a reference +count of 1. The initial reference count should be released +with cairo_destroy() when you are done using the cairo_t. +This function never returns NULL. If memory cannot be +allocated, a special cairo_t object will be returned on +which cairo_status() returns CAIRO_STATUS_NO_MEMORY. If +you attempt to target a surface which does not support +writing (such as cairo_mime_surface_t) then a +CAIRO_STATUS_WRITE_ERROR will be raised. You can use this +object normally, but no drawing will be done.

+

+
+

Since 1.0

+
+
+
+

cairo_reference ()

+
cairo_t *
+cairo_reference (cairo_t *cr);
+

Increases the reference count on cr + by one. This prevents +cr + from being destroyed until a matching call to cairo_destroy() +is made.

+

The number of references to a cairo_t can be get using +cairo_get_reference_count().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+
+

Returns

+

the referenced cairo_t.

+

+
+

Since 1.0

+
+
+
+

cairo_destroy ()

+
void
+cairo_destroy (cairo_t *cr);
+

Decreases the reference count on cr + by one. If the result +is zero, then cr + and all associated resources are freed. +See cairo_reference().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+

Since 1.0

+
+
+
+

cairo_status ()

+
cairo_status_t
+cairo_status (cairo_t *cr);
+

Checks whether an error has previously occurred for this context.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current status of this context, see cairo_status_t

+

+
+

Since 1.0

+
+
+
+

cairo_save ()

+
void
+cairo_save (cairo_t *cr);
+

Makes a copy of the current state of cr + and saves it +on an internal stack of saved states for cr +. When +cairo_restore() is called, cr + will be restored to +the saved state. Multiple calls to cairo_save() and +cairo_restore() can be nested; each call to cairo_restore() +restores the state from the matching paired cairo_save().

+

It isn't necessary to clear all saved states before +a cairo_t is freed. If the reference count of a cairo_t +drops to zero in response to a call to cairo_destroy(), +any saved states will be freed along with the cairo_t.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+

Since 1.0

+
+
+
+

cairo_restore ()

+
void
+cairo_restore (cairo_t *cr);
+

Restores cr + to the state saved by a preceding call to +cairo_save() and removes that state from the stack of +saved states.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+

Since 1.0

+
+
+
+

cairo_get_target ()

+
cairo_surface_t *
+cairo_get_target (cairo_t *cr);
+

Gets the target surface for the cairo context as passed to +cairo_create().

+

This function will always return a valid pointer, but the result +can be a "nil" surface if cr + is already in an error state, +(ie. cairo_status() != CAIRO_STATUS_SUCCESS). +A nil surface is indicated by cairo_surface_status() +!= CAIRO_STATUS_SUCCESS.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the target surface. This object is owned by cairo. To +keep a reference to it, you must call cairo_surface_reference().

+

+
+

Since 1.0

+
+
+
+

cairo_push_group ()

+
void
+cairo_push_group (cairo_t *cr);
+

Temporarily redirects drawing to an intermediate surface known as a +group. The redirection lasts until the group is completed by a call +to cairo_pop_group() or cairo_pop_group_to_source(). These calls +provide the result of any drawing to the group as a pattern, +(either as an explicit object, or set as the source pattern).

+

This group functionality can be convenient for performing +intermediate compositing. One common use of a group is to render +objects as opaque within the group, (so that they occlude each +other), and then blend the result with translucence onto the +destination.

+

Groups can be nested arbitrarily deep by making balanced calls to +cairo_push_group()/cairo_pop_group(). Each call pushes/pops the new +target group onto/from a stack.

+

The cairo_push_group() function calls cairo_save() so that any +changes to the graphics state will not be visible outside the +group, (the pop_group functions call cairo_restore()).

+

By default the intermediate group will have a content type of +CAIRO_CONTENT_COLOR_ALPHA. Other content types can be chosen for +the group by using cairo_push_group_with_content() instead.

+

As an example, here is how one might fill and stroke a path with +translucence, but without any portion of the fill being visible +under the stroke:

+
+cairo_push_group (cr);
+cairo_set_source (cr, fill_pattern);
+cairo_fill_preserve (cr);
+cairo_set_source (cr, stroke_pattern);
+cairo_stroke (cr);
+cairo_pop_group_to_source (cr);
+cairo_paint_with_alpha (cr, alpha);
+
+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.2

+
+
+
+

cairo_push_group_with_content ()

+
void
+cairo_push_group_with_content (cairo_t *cr,
+                               cairo_content_t content);
+

Temporarily redirects drawing to an intermediate surface known as a +group. The redirection lasts until the group is completed by a call +to cairo_pop_group() or cairo_pop_group_to_source(). These calls +provide the result of any drawing to the group as a pattern, +(either as an explicit object, or set as the source pattern).

+

The group will have a content type of content +. The ability to +control this content type is the only distinction between this +function and cairo_push_group() which you should see for a more +detailed description of group rendering.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

content

a cairo_content_t indicating the type of group that +will be created

 
+
+

Since 1.2

+
+
+
+

cairo_pop_group ()

+
cairo_pattern_t *
+cairo_pop_group (cairo_t *cr);
+

Terminates the redirection begun by a call to cairo_push_group() or +cairo_push_group_with_content() and returns a new pattern +containing the results of all drawing operations performed to the +group.

+

The cairo_pop_group() function calls cairo_restore(), (balancing a +call to cairo_save() by the push_group function), so that any +changes to the graphics state will not be visible outside the +group.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

a newly created (surface) pattern containing the +results of all drawing operations performed to the group. The +caller owns the returned object and should call +cairo_pattern_destroy() when finished with it.

+

+
+

Since 1.2

+
+
+
+

cairo_pop_group_to_source ()

+
void
+cairo_pop_group_to_source (cairo_t *cr);
+

Terminates the redirection begun by a call to cairo_push_group() or +cairo_push_group_with_content() and installs the resulting pattern +as the source pattern in the given cairo context.

+

The behavior of this function is equivalent to the sequence of +operations:

+
+cairo_pattern_t *group = cairo_pop_group (cr);
+cairo_set_source (cr, group);
+cairo_pattern_destroy (group);
+
+

but is more convenient as their is no need for a variable to store +the short-lived pointer to the pattern.

+

The cairo_pop_group() function calls cairo_restore(), (balancing a +call to cairo_save() by the push_group function), so that any +changes to the graphics state will not be visible outside the +group.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.2

+
+
+
+

cairo_get_group_target ()

+
cairo_surface_t *
+cairo_get_group_target (cairo_t *cr);
+

Gets the current destination surface for the context. This is either +the original target surface as passed to cairo_create() or the target +surface for the current group as started by the most recent call to +cairo_push_group() or cairo_push_group_with_content().

+

This function will always return a valid pointer, but the result +can be a "nil" surface if cr + is already in an error state, +(ie. cairo_status() != CAIRO_STATUS_SUCCESS). +A nil surface is indicated by cairo_surface_status() +!= CAIRO_STATUS_SUCCESS.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the target surface. This object is owned by cairo. To +keep a reference to it, you must call cairo_surface_reference().

+

+
+

Since 1.2

+
+
+
+

cairo_set_source_rgb ()

+
void
+cairo_set_source_rgb (cairo_t *cr,
+                      double red,
+                      double green,
+                      double blue);
+

Sets the source pattern within cr + to an opaque color. This opaque +color will then be used for any subsequent drawing operation until +a new source pattern is set.

+

The color components are floating point numbers in the range 0 to

+
  1. If the values passed in are outside that range, they will be +clamped.

+

The default source pattern is opaque black, (that is, it is +equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, 0.0)).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

red

red component of color

 

green

green component of color

 

blue

blue component of color

 
+
+

Since 1.0

+
+
+
+

cairo_set_source_rgba ()

+
void
+cairo_set_source_rgba (cairo_t *cr,
+                       double red,
+                       double green,
+                       double blue,
+                       double alpha);
+

Sets the source pattern within cr + to a translucent color. This +color will then be used for any subsequent drawing operation until +a new source pattern is set.

+

The color and alpha components are floating point numbers in the +range 0 to 1. If the values passed in are outside that range, they +will be clamped.

+

The default source pattern is opaque black, (that is, it is +equivalent to cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0)).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

red

red component of color

 

green

green component of color

 

blue

blue component of color

 

alpha

alpha component of color

 
+
+

Since 1.0

+
+
+
+

cairo_set_source ()

+
void
+cairo_set_source (cairo_t *cr,
+                  cairo_pattern_t *source);
+

Sets the source pattern within cr + to source +. This pattern +will then be used for any subsequent drawing operation until a new +source pattern is set.

+

Note: The pattern's transformation matrix will be locked to the +user space in effect at the time of cairo_set_source(). This means +that further modifications of the current transformation matrix +will not affect the source pattern. See cairo_pattern_set_matrix().

+

The default source pattern is a solid pattern that is opaque black, +(that is, it is equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, +0.0)).

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

source

a cairo_pattern_t to be used as the source for +subsequent drawing operations.

 
+
+

Since 1.0

+
+
+
+

cairo_set_source_surface ()

+
void
+cairo_set_source_surface (cairo_t *cr,
+                          cairo_surface_t *surface,
+                          double x,
+                          double y);
+

This is a convenience function for creating a pattern from surface + +and setting it as the source in cr + with cairo_set_source().

+

The x + and y + parameters give the user-space coordinate at which +the surface origin should appear. (The surface origin is its +upper-left corner before any transformation has been applied.) The +x + and y + parameters are negated and then set as translation values +in the pattern matrix.

+

Other than the initial translation pattern matrix, as described +above, all other pattern attributes, (such as its extend mode), are +set to the default values as in cairo_pattern_create_for_surface(). +The resulting pattern can be queried with cairo_get_source() so +that these attributes can be modified if desired, (eg. to create a +repeating pattern with cairo_pattern_set_extend()).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

surface

a surface to be used to set the source pattern

 

x

User-space X coordinate for surface origin

 

y

User-space Y coordinate for surface origin

 
+
+

Since 1.0

+
+
+
+

cairo_get_source ()

+
cairo_pattern_t *
+cairo_get_source (cairo_t *cr);
+

Gets the current source pattern for cr +.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current source pattern. This object is owned by +cairo. To keep a reference to it, you must call +cairo_pattern_reference().

+

+
+

Since 1.0

+
+
+
+

cairo_set_antialias ()

+
void
+cairo_set_antialias (cairo_t *cr,
+                     cairo_antialias_t antialias);
+

Set the antialiasing mode of the rasterizer used for drawing shapes. +This value is a hint, and a particular backend may or may not support +a particular value. At the current time, no backend supports +CAIRO_ANTIALIAS_SUBPIXEL when drawing shapes.

+

Note that this option does not affect text rendering, instead see +cairo_font_options_set_antialias().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

antialias

the new antialiasing mode

 
+
+

Since 1.0

+
+
+
+

cairo_get_antialias ()

+
cairo_antialias_t
+cairo_get_antialias (cairo_t *cr);
+

Gets the current shape antialiasing mode, as set by +cairo_set_antialias().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current shape antialiasing mode.

+

+
+

Since 1.0

+
+
+
+

cairo_set_dash ()

+
void
+cairo_set_dash (cairo_t *cr,
+                const double *dashes,
+                int num_dashes,
+                double offset);
+

Sets the dash pattern to be used by cairo_stroke(). A dash pattern +is specified by dashes +, an array of positive values. Each value +provides the length of alternate "on" and "off" portions of the +stroke. The offset + specifies an offset into the pattern at which +the stroke begins.

+

Each "on" segment will have caps applied as if the segment were a +separate sub-path. In particular, it is valid to use an "on" length +of 0.0 with CAIRO_LINE_CAP_ROUND or CAIRO_LINE_CAP_SQUARE in order +to distributed dots or squares along a path.

+

Note: The length values are in user-space units as evaluated at the +time of stroking. This is not necessarily the same as the user +space at the time of cairo_set_dash().

+

If num_dashes + is 0 dashing is disabled.

+

If num_dashes + is 1 a symmetric pattern is assumed with alternating +on and off portions of the size specified by the single value in +dashes +.

+

If any value in dashes + is negative, or if all values are 0, then +cr + will be put into an error state with a status of +CAIRO_STATUS_INVALID_DASH.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

dashes

an array specifying alternate lengths of on and off stroke portions

 

num_dashes

the length of the dashes array

 

offset

an offset into the dash pattern at which the stroke should start

 
+
+

Since 1.0

+
+
+
+

cairo_get_dash_count ()

+
int
+cairo_get_dash_count (cairo_t *cr);
+

This function returns the length of the dash array in cr + (0 if dashing +is not currently in effect).

+

See also cairo_set_dash() and cairo_get_dash().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+
+

Returns

+

the length of the dash array, or 0 if no dash array set.

+

+
+

Since 1.4

+
+
+
+

cairo_get_dash ()

+
void
+cairo_get_dash (cairo_t *cr,
+                double *dashes,
+                double *offset);
+

Gets the current dash array. If not NULL, dashes + should be big +enough to hold at least the number of values returned by +cairo_get_dash_count().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo_t

 

dashes

return value for the dash array, or NULL

 

offset

return value for the current dash offset, or NULL

 
+
+

Since 1.4

+
+
+
+

cairo_set_fill_rule ()

+
void
+cairo_set_fill_rule (cairo_t *cr,
+                     cairo_fill_rule_t fill_rule);
+

Set the current fill rule within the cairo context. The fill rule +is used to determine which regions are inside or outside a complex +(potentially self-intersecting) path. The current fill rule affects +both cairo_fill() and cairo_clip(). See cairo_fill_rule_t for details +on the semantics of each available fill rule.

+

The default fill rule is CAIRO_FILL_RULE_WINDING.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

fill_rule

a fill rule, specified as a cairo_fill_rule_t

 
+
+

Since 1.0

+
+
+
+

cairo_get_fill_rule ()

+
cairo_fill_rule_t
+cairo_get_fill_rule (cairo_t *cr);
+

Gets the current fill rule, as set by cairo_set_fill_rule().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current fill rule.

+

+
+

Since 1.0

+
+
+
+

cairo_set_line_cap ()

+
void
+cairo_set_line_cap (cairo_t *cr,
+                    cairo_line_cap_t line_cap);
+

Sets the current line cap style within the cairo context. See +cairo_line_cap_t for details about how the available line cap +styles are drawn.

+

As with the other stroke parameters, the current line cap style is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction.

+

The default line cap style is CAIRO_LINE_CAP_BUTT.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

line_cap

a line cap style

 
+
+

Since 1.0

+
+
+
+

cairo_get_line_cap ()

+
cairo_line_cap_t
+cairo_get_line_cap (cairo_t *cr);
+

Gets the current line cap style, as set by cairo_set_line_cap().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current line cap style.

+

+
+

Since 1.0

+
+
+
+

cairo_set_line_join ()

+
void
+cairo_set_line_join (cairo_t *cr,
+                     cairo_line_join_t line_join);
+

Sets the current line join style within the cairo context. See +cairo_line_join_t for details about how the available line join +styles are drawn.

+

As with the other stroke parameters, the current line join style is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction.

+

The default line join style is CAIRO_LINE_JOIN_MITER.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

line_join

a line join style

 
+
+

Since 1.0

+
+
+
+

cairo_get_line_join ()

+
cairo_line_join_t
+cairo_get_line_join (cairo_t *cr);
+

Gets the current line join style, as set by cairo_set_line_join().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current line join style.

+

+
+

Since 1.0

+
+
+
+

cairo_set_line_width ()

+
void
+cairo_set_line_width (cairo_t *cr,
+                      double width);
+

Sets the current line width within the cairo context. The line +width value specifies the diameter of a pen that is circular in +user space, (though device-space pen may be an ellipse in general +due to scaling/shear/rotation of the CTM).

+

Note: When the description above refers to user space and CTM it +refers to the user space and CTM in effect at the time of the +stroking operation, not the user space and CTM in effect at the +time of the call to cairo_set_line_width(). The simplest usage +makes both of these spaces identical. That is, if there is no +change to the CTM between a call to cairo_set_line_width() and the +stroking operation, then one can just pass user-space values to +cairo_set_line_width() and ignore this note.

+

As with the other stroke parameters, the current line width is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction.

+

The default line width value is 2.0.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

width

a line width

 
+
+

Since 1.0

+
+
+
+

cairo_get_line_width ()

+
double
+cairo_get_line_width (cairo_t *cr);
+

This function returns the current line width value exactly as set by +cairo_set_line_width(). Note that the value is unchanged even if +the CTM has changed between the calls to cairo_set_line_width() and +cairo_get_line_width().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current line width.

+

+
+

Since 1.0

+
+
+
+

cairo_set_miter_limit ()

+
void
+cairo_set_miter_limit (cairo_t *cr,
+                       double limit);
+

Sets the current miter limit within the cairo context.

+

If the current line join style is set to CAIRO_LINE_JOIN_MITER +(see cairo_set_line_join()), the miter limit is used to determine +whether the lines should be joined with a bevel instead of a miter. +Cairo divides the length of the miter by the line width. +If the result is greater than the miter limit, the style is +converted to a bevel.

+

As with the other stroke parameters, the current line miter limit is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction.

+

The default miter limit value is 10.0, which will convert joins +with interior angles less than 11 degrees to bevels instead of +miters. For reference, a miter limit of 2.0 makes the miter cutoff +at 60 degrees, and a miter limit of 1.414 makes the cutoff at 90 +degrees.

+

A miter limit for a desired angle can be computed as: miter limit = +1/sin(angle/2)

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

limit

miter limit to set

 
+
+

Since 1.0

+
+
+
+

cairo_get_miter_limit ()

+
double
+cairo_get_miter_limit (cairo_t *cr);
+

Gets the current miter limit, as set by cairo_set_miter_limit().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current miter limit.

+

+
+

Since 1.0

+
+
+
+

cairo_set_operator ()

+
void
+cairo_set_operator (cairo_t *cr,
+                    cairo_operator_t op);
+

Sets the compositing operator to be used for all drawing +operations. See cairo_operator_t for details on the semantics of +each available compositing operator.

+

The default operator is CAIRO_OPERATOR_OVER.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

op

a compositing operator, specified as a cairo_operator_t

 
+
+

Since 1.0

+
+
+
+

cairo_get_operator ()

+
cairo_operator_t
+cairo_get_operator (cairo_t *cr);
+

Gets the current compositing operator for a cairo context.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current compositing operator.

+

+
+

Since 1.0

+
+
+
+

cairo_set_tolerance ()

+
void
+cairo_set_tolerance (cairo_t *cr,
+                     double tolerance);
+

Sets the tolerance used when converting paths into trapezoids. +Curved segments of the path will be subdivided until the maximum +deviation between the original path and the polygonal approximation +is less than tolerance +. The default value is 0.1. A larger +value will give better performance, a smaller value, better +appearance. (Reducing the value from the default value of 0.1 +is unlikely to improve appearance significantly.) The accuracy of paths +within Cairo is limited by the precision of its internal arithmetic, and +the prescribed tolerance + is restricted to the smallest +representable internal value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

tolerance

the tolerance, in device units (typically pixels)

 
+
+

Since 1.0

+
+
+
+

cairo_get_tolerance ()

+
double
+cairo_get_tolerance (cairo_t *cr);
+

Gets the current tolerance value, as set by cairo_set_tolerance().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current tolerance value.

+

+
+

Since 1.0

+
+
+
+

cairo_clip ()

+
void
+cairo_clip (cairo_t *cr);
+

Establishes a new clip region by intersecting the current clip +region with the current path as it would be filled by cairo_fill() +and according to the current fill rule (see cairo_set_fill_rule()).

+

After cairo_clip(), the current path will be cleared from the cairo +context.

+

The current clip region affects all drawing operations by +effectively masking out any changes to the surface that are outside +the current clip region.

+

Calling cairo_clip() can only make the clip region smaller, never +larger. But the current clip is part of the graphics state, so a +temporary restriction of the clip region can be achieved by +calling cairo_clip() within a cairo_save()/cairo_restore() +pair. The only other means of increasing the size of the clip +region is cairo_reset_clip().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_clip_preserve ()

+
void
+cairo_clip_preserve (cairo_t *cr);
+

Establishes a new clip region by intersecting the current clip +region with the current path as it would be filled by cairo_fill() +and according to the current fill rule (see cairo_set_fill_rule()).

+

Unlike cairo_clip(), cairo_clip_preserve() preserves the path within +the cairo context.

+

The current clip region affects all drawing operations by +effectively masking out any changes to the surface that are outside +the current clip region.

+

Calling cairo_clip_preserve() can only make the clip region smaller, never +larger. But the current clip is part of the graphics state, so a +temporary restriction of the clip region can be achieved by +calling cairo_clip_preserve() within a cairo_save()/cairo_restore() +pair. The only other means of increasing the size of the clip +region is cairo_reset_clip().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_clip_extents ()

+
void
+cairo_clip_extents (cairo_t *cr,
+                    double *x1,
+                    double *y1,
+                    double *x2,
+                    double *y2);
+

Computes a bounding box in user coordinates covering the area inside the +current clip.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x1

left of the resulting extents

 

y1

top of the resulting extents

 

x2

right of the resulting extents

 

y2

bottom of the resulting extents

 
+
+

Since 1.4

+
+
+
+

cairo_in_clip ()

+
cairo_bool_t
+cairo_in_clip (cairo_t *cr,
+               double x,
+               double y);
+

Tests whether the given point is inside the area that would be +visible through the current clip, i.e. the area that would be filled by +a cairo_paint() operation.

+

See cairo_clip(), and cairo_clip_preserve().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

X coordinate of the point to test

 

y

Y coordinate of the point to test

 
+
+
+

Returns

+

A non-zero value if the point is inside, or zero if +outside.

+

+
+

Since 1.10

+
+
+
+

cairo_reset_clip ()

+
void
+cairo_reset_clip (cairo_t *cr);
+

Reset the current clip region to its original, unrestricted +state. That is, set the clip region to an infinitely large shape +containing the target surface. Equivalently, if infinity is too +hard to grasp, one can imagine the clip region being reset to the +exact bounds of the target surface.

+

Note that code meant to be reusable should not call +cairo_reset_clip() as it will cause results unexpected by +higher-level code which calls cairo_clip(). Consider using +cairo_save() and cairo_restore() around cairo_clip() as a more +robust means of temporarily restricting the clip region.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_rectangle_list_destroy ()

+
void
+cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list);
+

Unconditionally frees rectangle_list + and all associated +references. After this call, the rectangle_list + pointer must not +be dereferenced.

+
+

Parameters

+
+++++ + + + + + +

rectangle_list

a rectangle list, as obtained from cairo_copy_clip_rectangle_list()

 
+
+

Since 1.4

+
+
+
+

cairo_copy_clip_rectangle_list ()

+
cairo_rectangle_list_t *
+cairo_copy_clip_rectangle_list (cairo_t *cr);
+

Gets the current clip region as a list of rectangles in user coordinates. +Never returns NULL.

+

The status in the list may be CAIRO_STATUS_CLIP_NOT_REPRESENTABLE to +indicate that the clip region cannot be represented as a list of +user-space rectangles. The status may have other values to indicate +other errors.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+
+

Returns

+

the current clip region as a list of rectangles in user coordinates, +which should be destroyed using cairo_rectangle_list_destroy().

+

+
+

Since 1.4

+
+
+
+

cairo_fill ()

+
void
+cairo_fill (cairo_t *cr);
+

A drawing operator that fills the current path according to the +current fill rule, (each sub-path is implicitly closed before being +filled). After cairo_fill(), the current path will be cleared from +the cairo context. See cairo_set_fill_rule() and +cairo_fill_preserve().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_fill_preserve ()

+
void
+cairo_fill_preserve (cairo_t *cr);
+

A drawing operator that fills the current path according to the +current fill rule, (each sub-path is implicitly closed before being +filled). Unlike cairo_fill(), cairo_fill_preserve() preserves the +path within the cairo context.

+

See cairo_set_fill_rule() and cairo_fill().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_fill_extents ()

+
void
+cairo_fill_extents (cairo_t *cr,
+                    double *x1,
+                    double *y1,
+                    double *x2,
+                    double *y2);
+

Computes a bounding box in user coordinates covering the area that +would be affected, (the "inked" area), by a cairo_fill() operation +given the current path and fill parameters. If the current path is +empty, returns an empty rectangle ((0,0), (0,0)). Surface +dimensions and clipping are not taken into account.

+

Contrast with cairo_path_extents(), which is similar, but returns +non-zero extents for some paths with no inked area, (such as a +simple line segment).

+

Note that cairo_fill_extents() must necessarily do more work to +compute the precise inked areas in light of the fill rule, so +cairo_path_extents() may be more desirable for sake of performance +if the non-inked path extents are desired.

+

See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x1

left of the resulting extents

 

y1

top of the resulting extents

 

x2

right of the resulting extents

 

y2

bottom of the resulting extents

 
+
+

Since 1.0

+
+
+
+

cairo_in_fill ()

+
cairo_bool_t
+cairo_in_fill (cairo_t *cr,
+               double x,
+               double y);
+

Tests whether the given point is inside the area that would be +affected by a cairo_fill() operation given the current path and +filling parameters. Surface dimensions and clipping are not taken +into account.

+

See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

X coordinate of the point to test

 

y

Y coordinate of the point to test

 
+
+
+

Returns

+

A non-zero value if the point is inside, or zero if +outside.

+

+
+

Since 1.0

+
+
+
+

cairo_mask ()

+
void
+cairo_mask (cairo_t *cr,
+            cairo_pattern_t *pattern);
+

A drawing operator that paints the current source +using the alpha channel of pattern + as a mask. (Opaque +areas of pattern + are painted with the source, transparent +areas are not painted.)

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

pattern

a cairo_pattern_t

 
+
+

Since 1.0

+
+
+
+

cairo_mask_surface ()

+
void
+cairo_mask_surface (cairo_t *cr,
+                    cairo_surface_t *surface,
+                    double surface_x,
+                    double surface_y);
+

A drawing operator that paints the current source +using the alpha channel of surface + as a mask. (Opaque +areas of surface + are painted with the source, transparent +areas are not painted.)

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

surface

a cairo_surface_t

 

surface_x

X coordinate at which to place the origin of surface +

 

surface_y

Y coordinate at which to place the origin of surface +

 
+
+

Since 1.0

+
+
+
+

cairo_paint ()

+
void
+cairo_paint (cairo_t *cr);
+

A drawing operator that paints the current source everywhere within +the current clip region.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_paint_with_alpha ()

+
void
+cairo_paint_with_alpha (cairo_t *cr,
+                        double alpha);
+

A drawing operator that paints the current source everywhere within +the current clip region using a mask of constant alpha value +alpha +. The effect is similar to cairo_paint(), but the drawing +is faded out using the alpha value.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

alpha

alpha value, between 0 (transparent) and 1 (opaque)

 
+
+

Since 1.0

+
+
+
+

cairo_stroke ()

+
void
+cairo_stroke (cairo_t *cr);
+

A drawing operator that strokes the current path according to the +current line width, line join, line cap, and dash settings. After +cairo_stroke(), the current path will be cleared from the cairo +context. See cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve().

+

Note: Degenerate segments and sub-paths are treated specially and +provide a useful result. These can result in two different +situations:

+
    +
  1. Zero-length "on" segments set in cairo_set_dash(). If the cap +style is CAIRO_LINE_CAP_ROUND or CAIRO_LINE_CAP_SQUARE then these +segments will be drawn as circular dots or squares respectively. In +the case of CAIRO_LINE_CAP_SQUARE, the orientation of the squares +is determined by the direction of the underlying path.

  2. +
  3. A sub-path created by cairo_move_to() followed by either a +cairo_close_path() or one or more calls to cairo_line_to() to the +same coordinate as the cairo_move_to(). If the cap style is +CAIRO_LINE_CAP_ROUND then these sub-paths will be drawn as circular +dots. Note that in the case of CAIRO_LINE_CAP_SQUARE a degenerate +sub-path will not be drawn at all, (since the correct orientation +is indeterminate).

  4. +
+

In no case will a cap style of CAIRO_LINE_CAP_BUTT cause anything +to be drawn in the case of either degenerate segments or sub-paths.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_stroke_preserve ()

+
void
+cairo_stroke_preserve (cairo_t *cr);
+

A drawing operator that strokes the current path according to the +current line width, line join, line cap, and dash settings. Unlike +cairo_stroke(), cairo_stroke_preserve() preserves the path within the +cairo context.

+

See cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve().

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_stroke_extents ()

+
void
+cairo_stroke_extents (cairo_t *cr,
+                      double *x1,
+                      double *y1,
+                      double *x2,
+                      double *y2);
+

Computes a bounding box in user coordinates covering the area that +would be affected, (the "inked" area), by a cairo_stroke() +operation given the current path and stroke parameters. +If the current path is empty, returns an empty rectangle ((0,0), (0,0)). +Surface dimensions and clipping are not taken into account.

+

Note that if the line width is set to exactly zero, then +cairo_stroke_extents() will return an empty rectangle. Contrast with +cairo_path_extents() which can be used to compute the non-empty +bounds as the line width approaches zero.

+

Note that cairo_stroke_extents() must necessarily do more work to +compute the precise inked areas in light of the stroke parameters, +so cairo_path_extents() may be more desirable for sake of +performance if non-inked path extents are desired.

+

See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x1

left of the resulting extents

 

y1

top of the resulting extents

 

x2

right of the resulting extents

 

y2

bottom of the resulting extents

 
+
+

Since 1.0

+
+
+
+

cairo_in_stroke ()

+
cairo_bool_t
+cairo_in_stroke (cairo_t *cr,
+                 double x,
+                 double y);
+

Tests whether the given point is inside the area that would be +affected by a cairo_stroke() operation given the current path and +stroking parameters. Surface dimensions and clipping are not taken +into account.

+

See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

x

X coordinate of the point to test

 

y

Y coordinate of the point to test

 
+
+
+

Returns

+

A non-zero value if the point is inside, or zero if +outside.

+

+
+

Since 1.0

+
+
+
+

cairo_copy_page ()

+
void
+cairo_copy_page (cairo_t *cr);
+

Emits the current page for backends that support multiple pages, but +doesn't clear it, so, the contents of the current page will be retained +for the next page too. Use cairo_show_page() if you want to get an +empty page after the emission.

+

This is a convenience function that simply calls +cairo_surface_copy_page() on cr +'s target.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_show_page ()

+
void
+cairo_show_page (cairo_t *cr);
+

Emits and clears the current page for backends that support multiple +pages. Use cairo_copy_page() if you don't want to clear the page.

+

This is a convenience function that simply calls +cairo_surface_show_page() on cr +'s target.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo context

 
+
+

Since 1.0

+
+
+
+

cairo_get_reference_count ()

+
unsigned int
+cairo_get_reference_count (cairo_t *cr);
+

Returns the current reference count of cr +.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+
+

Returns

+

the current reference count of cr +. If the +object is a nil object, 0 will be returned.

+

+
+

Since 1.4

+
+
+
+

cairo_set_user_data ()

+
cairo_status_t
+cairo_set_user_data (cairo_t *cr,
+                     const cairo_user_data_key_t *key,
+                     void *user_data,
+                     cairo_destroy_func_t destroy);
+

Attach user data to cr +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo_t

 

key

the address of a cairo_user_data_key_t to attach the user data to

 

user_data

the user data to attach to the cairo_t

 

destroy

a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key.

 
+
+
+

Returns

+

CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data.

+

+
+

Since 1.4

+
+
+
+

cairo_get_user_data ()

+
void *
+cairo_get_user_data (cairo_t *cr,
+                     const cairo_user_data_key_t *key);
+

Return user data previously attached to cr + using the specified +key. If no user data has been attached with the given key this +function returns NULL.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

key

the address of the cairo_user_data_key_t the user data was +attached to

 
+
+
+

Returns

+

the user data previously attached or NULL.

+

+
+

Since 1.4

+
+
+
+

Types and Values

+
+

cairo_t

+
typedef struct _cairo cairo_t;
+
+

A cairo_t contains the current state of the rendering device, +including coordinates of yet to be drawn shapes.

+

Cairo contexts, as cairo_t objects are named, are central to +cairo and all drawing with cairo is always done to a cairo_t +object.

+

Memory management of cairo_t is done with +cairo_reference() and cairo_destroy().

+

Since 1.0

+
+
+
+

enum cairo_antialias_t

+

Specifies the type of antialiasing to do when rendering text or shapes.

+

As it is not necessarily clear from the above what advantages a particular +antialias method provides, since 1.12, there is also a set of hints: +CAIRO_ANTIALIAS_FAST +: Allow the backend to degrade raster quality for speed +CAIRO_ANTIALIAS_GOOD +: A balance between speed and quality +CAIRO_ANTIALIAS_BEST +: A high-fidelity, but potentially slow, raster mode

+

These make no guarantee on how the backend will perform its rasterisation +(if it even rasterises!), nor that they have any differing effect other +than to enable some form of antialiasing. In the case of glyph rendering, +CAIRO_ANTIALIAS_FAST + and CAIRO_ANTIALIAS_GOOD + will be mapped to +CAIRO_ANTIALIAS_GRAY +, with CAIRO_ANTALIAS_BEST + being equivalent to +CAIRO_ANTIALIAS_SUBPIXEL +.

+

The interpretation of CAIRO_ANTIALIAS_DEFAULT + is left entirely up to +the backend, typically this will be similar to CAIRO_ANTIALIAS_GOOD +.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_ANTIALIAS_DEFAULT

+

Use the default antialiasing for + the subsystem and target device, since 1.0

+
 

CAIRO_ANTIALIAS_NONE

+

Use a bilevel alpha mask, since 1.0

+
 

CAIRO_ANTIALIAS_GRAY

+

Perform single-color antialiasing (using + shades of gray for black text on a white background, for example), since 1.0

+
 

CAIRO_ANTIALIAS_SUBPIXEL

+

Perform antialiasing by taking + advantage of the order of subpixel elements on devices + such as LCD panels, since 1.0

+
 

CAIRO_ANTIALIAS_FAST

+

Hint that the backend should perform some +antialiasing but prefer speed over quality, since 1.12

+
 

CAIRO_ANTIALIAS_GOOD

+

The backend should balance quality against +performance, since 1.12

+
 

CAIRO_ANTIALIAS_BEST

+

Hint that the backend should render at the highest +quality, sacrificing speed if necessary, since 1.12

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_fill_rule_t

+

cairo_fill_rule_t is used to select how paths are filled. For both +fill rules, whether or not a point is included in the fill is +determined by taking a ray from that point to infinity and looking +at intersections with the path. The ray can be in any direction, +as long as it doesn't pass through the end point of a segment +or have a tricky intersection such as intersecting tangent to the path. +(Note that filling is not actually implemented in this way. This +is just a description of the rule that is applied.)

+

The default fill rule is CAIRO_FILL_RULE_WINDING.

+

New entries may be added in future versions.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_FILL_RULE_WINDING

+

If the path crosses the ray from +left-to-right, counts +1. If the path crosses the ray +from right to left, counts -1. (Left and right are determined +from the perspective of looking along the ray from the starting +point.) If the total count is non-zero, the point will be filled. (Since 1.0)

+
 

CAIRO_FILL_RULE_EVEN_ODD

+

Counts the total number of +intersections, without regard to the orientation of the contour. If +the total number of intersections is odd, the point will be +filled. (Since 1.0)

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_line_cap_t

+

Specifies how to render the endpoints of the path when stroking.

+

The default line cap style is CAIRO_LINE_CAP_BUTT.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

CAIRO_LINE_CAP_BUTT

+

start(stop) the line exactly at the start(end) point (Since 1.0)

+
 

CAIRO_LINE_CAP_ROUND

+

use a round ending, the center of the circle is the end point (Since 1.0)

+
 

CAIRO_LINE_CAP_SQUARE

+

use squared ending, the center of the square is the end point (Since 1.0)

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_line_join_t

+

Specifies how to render the junction of two lines when stroking.

+

The default line join style is CAIRO_LINE_JOIN_MITER.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

CAIRO_LINE_JOIN_MITER

+

use a sharp (angled) corner, see +cairo_set_miter_limit() (Since 1.0)

+
 

CAIRO_LINE_JOIN_ROUND

+

use a rounded join, the center of the circle is the +joint point (Since 1.0)

+
 

CAIRO_LINE_JOIN_BEVEL

+

use a cut-off join, the join is cut off at half +the line width from the joint point (Since 1.0)

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_operator_t

+

cairo_operator_t is used to set the compositing operator for all cairo +drawing operations.

+

The default operator is CAIRO_OPERATOR_OVER.

+

The operators marked as unbounded modify their +destination even outside of the mask layer (that is, their effect is not +bound by the mask layer). However, their effect can still be limited by +way of clipping.

+

To keep things simple, the operator descriptions here +document the behavior for when both source and destination are either fully +transparent or fully opaque. The actual implementation works for +translucent layers too. +For a more detailed explanation of the effects of each operator, including +the mathematical definitions, see

+http://cairographics.org/operators/. +
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CAIRO_OPERATOR_CLEAR

+

clear destination layer (bounded) (Since 1.0)

+
 

CAIRO_OPERATOR_SOURCE

+

replace destination layer (bounded) (Since 1.0)

+
 

CAIRO_OPERATOR_OVER

+

draw source layer on top of destination layer +(bounded) (Since 1.0)

+
 

CAIRO_OPERATOR_IN

+

draw source where there was destination content +(unbounded) (Since 1.0)

+
 

CAIRO_OPERATOR_OUT

+

draw source where there was no destination +content (unbounded) (Since 1.0)

+
 

CAIRO_OPERATOR_ATOP

+

draw source on top of destination content and +only there (Since 1.0)

+
 

CAIRO_OPERATOR_DEST

+

ignore the source (Since 1.0)

+
 

CAIRO_OPERATOR_DEST_OVER

+

draw destination on top of source (Since 1.0)

+
 

CAIRO_OPERATOR_DEST_IN

+

leave destination only where there was +source content (unbounded) (Since 1.0)

+
 

CAIRO_OPERATOR_DEST_OUT

+

leave destination only where there was no +source content (Since 1.0)

+
 

CAIRO_OPERATOR_DEST_ATOP

+

leave destination on top of source content +and only there (unbounded) (Since 1.0)

+
 

CAIRO_OPERATOR_XOR

+

source and destination are shown where there is only +one of them (Since 1.0)

+
 

CAIRO_OPERATOR_ADD

+

source and destination layers are accumulated (Since 1.0)

+
 

CAIRO_OPERATOR_SATURATE

+

like over, but assuming source and dest are +disjoint geometries (Since 1.0)

+
 

CAIRO_OPERATOR_MULTIPLY

+

source and destination layers are multiplied. +This causes the result to be at least as dark as the darker inputs. (Since 1.10)

+
 

CAIRO_OPERATOR_SCREEN

+

source and destination are complemented and +multiplied. This causes the result to be at least as light as the lighter +inputs. (Since 1.10)

+
 

CAIRO_OPERATOR_OVERLAY

+

multiplies or screens, depending on the +lightness of the destination color. (Since 1.10)

+
 

CAIRO_OPERATOR_DARKEN

+

replaces the destination with the source if it +is darker, otherwise keeps the source. (Since 1.10)

+
 

CAIRO_OPERATOR_LIGHTEN

+

replaces the destination with the source if it +is lighter, otherwise keeps the source. (Since 1.10)

+
 

CAIRO_OPERATOR_COLOR_DODGE

+

brightens the destination color to reflect +the source color. (Since 1.10)

+
 

CAIRO_OPERATOR_COLOR_BURN

+

darkens the destination color to reflect +the source color. (Since 1.10)

+
 

CAIRO_OPERATOR_HARD_LIGHT

+

Multiplies or screens, dependent on source +color. (Since 1.10)

+
 

CAIRO_OPERATOR_SOFT_LIGHT

+

Darkens or lightens, dependent on source +color. (Since 1.10)

+
 

CAIRO_OPERATOR_DIFFERENCE

+

Takes the difference of the source and +destination color. (Since 1.10)

+
 

CAIRO_OPERATOR_EXCLUSION

+

Produces an effect similar to difference, but +with lower contrast. (Since 1.10)

+
 

CAIRO_OPERATOR_HSL_HUE

+

Creates a color with the hue of the source +and the saturation and luminosity of the target. (Since 1.10)

+
 

CAIRO_OPERATOR_HSL_SATURATION

+

Creates a color with the saturation +of the source and the hue and luminosity of the target. Painting with +this mode onto a gray area produces no change. (Since 1.10)

+
 

CAIRO_OPERATOR_HSL_COLOR

+

Creates a color with the hue and saturation +of the source and the luminosity of the target. This preserves the gray +levels of the target and is useful for coloring monochrome images or +tinting color images. (Since 1.10)

+
 

CAIRO_OPERATOR_HSL_LUMINOSITY

+

Creates a color with the luminosity of +the source and the hue and saturation of the target. This produces an +inverse effect to CAIRO_OPERATOR_HSL_COLOR +. (Since 1.10)

+
 
+
+

Since 1.0

+
+
+
+

cairo_rectangle_t

+
typedef struct {
+    double x, y, width, height;
+} cairo_rectangle_t;
+
+

A data structure for holding a rectangle.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

double x;

X coordinate of the left side of the rectangle

 

double y;

Y coordinate of the the top side of the rectangle

 

double width;

width of the rectangle

 

double height;

height of the rectangle

 
+
+

Since 1.4

+
+
+
+

cairo_rectangle_list_t

+
typedef struct {
+    cairo_status_t     status;
+    cairo_rectangle_t *rectangles;
+    int                num_rectangles;
+} cairo_rectangle_list_t;
+
+

A data structure for holding a dynamically allocated +array of rectangles.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

cairo_status_t status;

Error status of the rectangle list

 

cairo_rectangle_t *rectangles;

Array containing the rectangles

 

int num_rectangles;

Number of rectangles in this list

 
+
+

Since 1.4

+
+
+
+

See Also

+

cairo_surface_t

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-drawing.html b/doc/public/html/cairo-drawing.html new file mode 100644 index 000000000..f18f8e668 --- /dev/null +++ b/doc/public/html/cairo-drawing.html @@ -0,0 +1,53 @@ + + + + +Cairo: A Vector Graphics Library: Drawing + + + + + + + + + + + + + + + + +
+

+Drawing

+
+
+cairo_t — The cairo drawing context +
+
+Paths — Creating paths and manipulating path data +
+
+cairo_pattern_t — Sources for drawing +
+
+Regions — Representing a pixel-aligned area +
+
+Transformations — Manipulating the current transformation matrix +
+
+text — Rendering text and glyphs +
+
+Raster Sources — Supplying arbitrary image data +
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-fonts.html b/doc/public/html/cairo-fonts.html new file mode 100644 index 000000000..073f5494b --- /dev/null +++ b/doc/public/html/cairo-fonts.html @@ -0,0 +1,53 @@ + + + + +Cairo: A Vector Graphics Library: Fonts + + + + + + + + + + + + + + + + +
+

+Fonts

+
+
+cairo_font_face_t — Base class for font faces +
+
+cairo_scaled_font_t — Font face at particular size and options +
+
+cairo_font_options_t — How a font should be rendered +
+
+FreeType Fonts — Font support for FreeType +
+
+Win32 Fonts — Font support for Microsoft Windows +
+
+Quartz (CGFont) Fonts — Font support via CGFont on OS X +
+
+User Fonts — Font support with font data provided by the user +
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-support.html b/doc/public/html/cairo-support.html new file mode 100644 index 000000000..cf1ed41d6 --- /dev/null +++ b/doc/public/html/cairo-support.html @@ -0,0 +1,44 @@ + + + + +Cairo: A Vector Graphics Library: Utilities + + + + + + + + + + + + + + + + +
+

+Utilities

+
+
+cairo_matrix_t — Generic matrix operations +
+
+Error handling — Decoding cairo's status +
+
+Version Information — Compile-time and run-time version checks. +
+
+Types — Generic data types +
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-surfaces.html b/doc/public/html/cairo-surfaces.html new file mode 100644 index 000000000..79a0fff58 --- /dev/null +++ b/doc/public/html/cairo-surfaces.html @@ -0,0 +1,74 @@ + + + + +Cairo: A Vector Graphics Library: Surfaces + + + + + + + + + + + + + + + + +
+

+Surfaces

+
+
+cairo_device_t — interface to underlying rendering system +
+
+cairo_surface_t — Base class for surfaces +
+
+Image Surfaces — Rendering to memory buffers +
+
+PDF Surfaces — Rendering PDF documents +
+
+PNG Support — Reading and writing PNG images +
+
+PostScript Surfaces — Rendering PostScript documents +
+
+Recording Surfaces — Records all drawing operations +
+
+Win32 Surfaces — Microsoft Windows surface support +
+
+SVG Surfaces — Rendering SVG documents +
+
+Quartz Surfaces — Rendering to Quartz surfaces +
+
+XCB Surfaces — X Window System rendering using the XCB library +
+
+XLib Surfaces — X Window System rendering using XLib +
+
+XLib-XRender Backend — X Window System rendering using XLib and the X Render extension +
+
+Script Surfaces — Rendering to replayable scripts +
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo-text.html b/doc/public/html/cairo-text.html new file mode 100644 index 000000000..b8409e9cd --- /dev/null +++ b/doc/public/html/cairo-text.html @@ -0,0 +1,1495 @@ + + + + +Cairo: A Vector Graphics Library: text + + + + + + + + + + + + + + + + +
+
+
+ + +
+

text

+

text — Rendering text and glyphs

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+void + +cairo_select_font_face () +
+void + +cairo_set_font_size () +
+void + +cairo_set_font_matrix () +
+void + +cairo_get_font_matrix () +
+void + +cairo_set_font_options () +
+void + +cairo_get_font_options () +
+void + +cairo_set_font_face () +
+cairo_font_face_t * + +cairo_get_font_face () +
+void + +cairo_set_scaled_font () +
+cairo_scaled_font_t * + +cairo_get_scaled_font () +
+void + +cairo_show_text () +
+void + +cairo_show_glyphs () +
+void + +cairo_show_text_glyphs () +
+void + +cairo_font_extents () +
+void + +cairo_text_extents () +
+void + +cairo_glyph_extents () +
+cairo_font_face_t * + +cairo_toy_font_face_create () +
const char * + +cairo_toy_font_face_get_family () +
+cairo_font_slant_t + +cairo_toy_font_face_get_slant () +
+cairo_font_weight_t + +cairo_toy_font_face_get_weight () +
+cairo_glyph_t * + +cairo_glyph_allocate () +
+void + +cairo_glyph_free () +
+cairo_text_cluster_t * + +cairo_text_cluster_allocate () +
+void + +cairo_text_cluster_free () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
 cairo_glyph_t
enumcairo_font_slant_t
enumcairo_font_weight_t
 cairo_text_cluster_t
enumcairo_text_cluster_flags_t
+
+
+

Object Hierarchy

+
+
+
+
+

Description

+

The functions with text in their name form cairo's +toy text API. The toy API takes UTF-8 encoded +text and is limited in its functionality to rendering simple +left-to-right text with no advanced features. That means for example +that most complex scripts like Hebrew, Arabic, and Indic scripts are +out of question. No kerning or correct positioning of diacritical marks +either. The font selection is pretty limited too and doesn't handle the +case that the selected font does not cover the characters in the text. +This set of functions are really that, a toy text API, for testing and +demonstration purposes. Any serious application should avoid them.

+

The functions with glyphs in their name form cairo's +low-level text API. The low-level API relies on +the user to convert text to a set of glyph indexes and positions. This +is a very hard problem and is best handled by external libraries, like +the pangocairo that is part of the Pango text layout and rendering library. +Pango is available from http://www.pango.org/.

+
+
+

Functions

+
+

cairo_select_font_face ()

+
void
+cairo_select_font_face (cairo_t *cr,
+                        const char *family,
+                        cairo_font_slant_t slant,
+                        cairo_font_weight_t weight);
+

Note: The cairo_select_font_face() function call is part of what +the cairo designers call the "toy" text API. It is convenient for +short demos and simple programs, but it is not expected to be +adequate for serious text-using applications.

+

Selects a family and style of font from a simplified description as +a family name, slant and weight. Cairo provides no operation to +list available family names on the system (this is a "toy", +remember), but the standard CSS2 generic family names, ("serif", +"sans-serif", "cursive", "fantasy", "monospace"), are likely to +work as expected.

+

If family + starts with the string "cairo +:", or if no native font +backends are compiled in, cairo will use an internal font family. +The internal font family recognizes many modifiers in the family + +string, most notably, it recognizes the string "monospace". That is, +the family name "cairo +:monospace" will use the monospace version of +the internal font family.

+

For "real" font selection, see the font-backend-specific +font_face_create functions for the font backend you are using. (For +example, if you are using the freetype-based cairo-ft font backend, +see cairo_ft_font_face_create_for_ft_face() or +cairo_ft_font_face_create_for_pattern().) The resulting font face +could then be used with cairo_scaled_font_create() and +cairo_set_scaled_font().

+

Similarly, when using the "real" font support, you can call +directly into the underlying font system, (such as fontconfig or +freetype), for operations such as listing available fonts, etc.

+

It is expected that most applications will need to use a more +comprehensive font handling and text layout library, (for example, +pango), in conjunction with cairo.

+

If text is drawn without a call to cairo_select_font_face(), (nor +cairo_set_font_face() nor cairo_set_scaled_font()), the default +family is platform-specific, but is essentially "sans-serif". +Default slant is CAIRO_FONT_SLANT_NORMAL, and default weight is +CAIRO_FONT_WEIGHT_NORMAL.

+

This function is equivalent to a call to cairo_toy_font_face_create() +followed by cairo_set_font_face().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo_t

 

family

a font family name, encoded in UTF-8

 

slant

the slant for the font

 

weight

the weight for the font

 
+
+

Since 1.0

+
+
+
+

cairo_set_font_size ()

+
void
+cairo_set_font_size (cairo_t *cr,
+                     double size);
+

Sets the current font matrix to a scale by a factor of size +, replacing +any font matrix previously set with cairo_set_font_size() or +cairo_set_font_matrix(). This results in a font size of size + user space +units. (More precisely, this matrix will result in the font's +em-square being a size + by size + square in user space.)

+

If text is drawn without a call to cairo_set_font_size(), (nor +cairo_set_font_matrix() nor cairo_set_scaled_font()), the default +font size is 10.0.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

size

the new font size, in user space units

 
+
+

Since 1.0

+
+
+
+

cairo_set_font_matrix ()

+
void
+cairo_set_font_matrix (cairo_t *cr,
+                       const cairo_matrix_t *matrix);
+

Sets the current font matrix to matrix +. The font matrix gives a +transformation from the design space of the font (in this space, +the em-square is 1 unit by 1 unit) to user space. Normally, a +simple scale is used (see cairo_set_font_size()), but a more +complex font matrix can be used to shear the font +or stretch it unequally along the two axes

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

matrix

a cairo_matrix_t describing a transform to be applied to +the current font.

 
+
+

Since 1.0

+
+
+
+

cairo_get_font_matrix ()

+
void
+cairo_get_font_matrix (cairo_t *cr,
+                       cairo_matrix_t *matrix);
+

Stores the current font matrix into matrix +. See +cairo_set_font_matrix().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

matrix

return value for the matrix

 
+
+

Since 1.0

+
+
+
+

cairo_set_font_options ()

+
void
+cairo_set_font_options (cairo_t *cr,
+                        const cairo_font_options_t *options);
+

Sets a set of custom font rendering options for the cairo_t. +Rendering options are derived by merging these options with the +options derived from underlying surface; if the value in options + +has a default value (like CAIRO_ANTIALIAS_DEFAULT), then the value +from the surface is used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

options

font options to use

 
+
+

Since 1.0

+
+
+
+

cairo_get_font_options ()

+
void
+cairo_get_font_options (cairo_t *cr,
+                        cairo_font_options_t *options);
+

Retrieves font rendering options set via cairo_set_font_options. +Note that the returned options do not include any options derived +from the underlying surface; they are literally the options +passed to cairo_set_font_options().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

options

a cairo_font_options_t object into which to store +the retrieved options. All existing values are overwritten

 
+
+

Since 1.0

+
+
+
+

cairo_set_font_face ()

+
void
+cairo_set_font_face (cairo_t *cr,
+                     cairo_font_face_t *font_face);
+

Replaces the current cairo_font_face_t object in the cairo_t with +font_face +. The replaced font face in the cairo_t will be +destroyed if there are no other references to it.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

font_face

a cairo_font_face_t, or NULL to restore to the default font

 
+
+

Since 1.0

+
+
+
+

cairo_get_font_face ()

+
cairo_font_face_t *
+cairo_get_font_face (cairo_t *cr);
+

Gets the current font face for a cairo_t.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+
+

Returns

+

the current font face. This object is owned by +cairo. To keep a reference to it, you must call +cairo_font_face_reference().

+

This function never returns NULL. If memory cannot be allocated, a +special "nil" cairo_font_face_t object will be returned on which +cairo_font_face_status() returns CAIRO_STATUS_NO_MEMORY. Using +this nil object will cause its error state to propagate to other +objects it is passed to, (for example, calling +cairo_set_font_face() with a nil font will trigger an error that +will shutdown the cairo_t object).

+

+
+

Since 1.0

+
+
+
+

cairo_set_scaled_font ()

+
void
+cairo_set_scaled_font (cairo_t *cr,
+                       const cairo_scaled_font_t *scaled_font);
+

Replaces the current font face, font matrix, and font options in +the cairo_t with those of the cairo_scaled_font_t. Except for +some translation, the current CTM of the cairo_t should be the +same as that of the cairo_scaled_font_t, which can be accessed +using cairo_scaled_font_get_ctm().

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

scaled_font

a cairo_scaled_font_t

 
+
+

Since 1.2

+
+
+
+

cairo_get_scaled_font ()

+
cairo_scaled_font_t *
+cairo_get_scaled_font (cairo_t *cr);
+

Gets the current scaled font for a cairo_t.

+
+

Parameters

+
+++++ + + + + + +

cr

a cairo_t

 
+
+
+

Returns

+

the current scaled font. This object is owned by +cairo. To keep a reference to it, you must call +cairo_scaled_font_reference().

+

This function never returns NULL. If memory cannot be allocated, a +special "nil" cairo_scaled_font_t object will be returned on which +cairo_scaled_font_status() returns CAIRO_STATUS_NO_MEMORY. Using +this nil object will cause its error state to propagate to other +objects it is passed to, (for example, calling +cairo_set_scaled_font() with a nil font will trigger an error that +will shutdown the cairo_t object).

+

+
+

Since 1.4

+
+
+
+

cairo_show_text ()

+
void
+cairo_show_text (cairo_t *cr,
+                 const char *utf8);
+

A drawing operator that generates the shape from a string of UTF-8 +characters, rendered according to the current font_face, font_size +(font_matrix), and font_options.

+

This function first computes a set of glyphs for the string of +text. The first glyph is placed so that its origin is at the +current point. The origin of each subsequent glyph is offset from +that of the previous glyph by the advance values of the previous +glyph.

+

After this call the current point is moved to the origin of where +the next glyph would be placed in this same progression. That is, +the current point will be at the origin of the final glyph offset +by its advance values. This allows for easy display of a single +logical string with multiple calls to cairo_show_text().

+

Note: The cairo_show_text() function call is part of what the cairo +designers call the "toy" text API. It is convenient for short demos +and simple programs, but it is not expected to be adequate for +serious text-using applications. See cairo_show_glyphs() for the +"real" text display API in cairo.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo context

 

utf8

a NUL-terminated string of text encoded in UTF-8, or NULL

 
+
+

Since 1.0

+
+
+
+

cairo_show_glyphs ()

+
void
+cairo_show_glyphs (cairo_t *cr,
+                   const cairo_glyph_t *glyphs,
+                   int num_glyphs);
+

A drawing operator that generates the shape from an array of glyphs, +rendered according to the current font face, font size +(font matrix), and font options.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

glyphs

array of glyphs to show

 

num_glyphs

number of glyphs to show

 
+
+

Since 1.0

+
+
+
+

cairo_show_text_glyphs ()

+
void
+cairo_show_text_glyphs (cairo_t *cr,
+                        const char *utf8,
+                        int utf8_len,
+                        const cairo_glyph_t *glyphs,
+                        int num_glyphs,
+                        const cairo_text_cluster_t *clusters,
+                        int num_clusters,
+                        cairo_text_cluster_flags_t cluster_flags);
+

This operation has rendering effects similar to cairo_show_glyphs() +but, if the target surface supports it, uses the provided text and +cluster mapping to embed the text for the glyphs shown in the output. +If the target does not support the extended attributes, this function +acts like the basic cairo_show_glyphs() as if it had been passed +glyphs + and num_glyphs +.

+

The mapping between utf8 + and glyphs + is provided by an array of +clusters. Each cluster covers a number of +text bytes and glyphs, and neighboring clusters cover neighboring +areas of utf8 + and glyphs +. The clusters should collectively cover utf8 + +and glyphs + in entirety.

+

The first cluster always covers bytes from the beginning of utf8 +. +If cluster_flags + do not have the CAIRO_TEXT_CLUSTER_FLAG_BACKWARD +set, the first cluster also covers the beginning +of glyphs +, otherwise it covers the end of the glyphs + array and +following clusters move backward.

+

See cairo_text_cluster_t for constraints on valid clusters.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo context

 

utf8

a string of text encoded in UTF-8

 

utf8_len

length of utf8 +in bytes, or -1 if it is NUL-terminated

 

glyphs

array of glyphs to show

 

num_glyphs

number of glyphs to show

 

clusters

array of cluster mapping information

 

num_clusters

number of clusters in the mapping

 

cluster_flags

cluster mapping flags

 
+
+

Since 1.8

+
+
+
+

cairo_font_extents ()

+
void
+cairo_font_extents (cairo_t *cr,
+                    cairo_font_extents_t *extents);
+

Gets the font extents for the currently selected font.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

cr

a cairo_t

 

extents

a cairo_font_extents_t object into which the results +will be stored.

 
+
+

Since 1.0

+
+
+
+

cairo_text_extents ()

+
void
+cairo_text_extents (cairo_t *cr,
+                    const char *utf8,
+                    cairo_text_extents_t *extents);
+

Gets the extents for a string of text. The extents describe a +user-space rectangle that encloses the "inked" portion of the text, +(as it would be drawn by cairo_show_text()). Additionally, the +x_advance and y_advance values indicate the amount by which the +current point would be advanced by cairo_show_text().

+

Note that whitespace characters do not directly contribute to the +size of the rectangle (extents.width and extents.height). They do +contribute indirectly by changing the position of non-whitespace +characters. In particular, trailing whitespace characters are +likely to not affect the size of the rectangle, though they will +affect the x_advance and y_advance values.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

cr

a cairo_t

 

utf8

a NUL-terminated string of text encoded in UTF-8, or NULL

 

extents

a cairo_text_extents_t object into which the results +will be stored

 
+
+

Since 1.0

+
+
+
+

cairo_glyph_extents ()

+
void
+cairo_glyph_extents (cairo_t *cr,
+                     const cairo_glyph_t *glyphs,
+                     int num_glyphs,
+                     cairo_text_extents_t *extents);
+

Gets the extents for an array of glyphs. The extents describe a +user-space rectangle that encloses the "inked" portion of the +glyphs, (as they would be drawn by cairo_show_glyphs()). +Additionally, the x_advance and y_advance values indicate the +amount by which the current point would be advanced by +cairo_show_glyphs().

+

Note that whitespace glyphs do not contribute to the size of the +rectangle (extents.width and extents.height).

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

cr

a cairo_t

 

glyphs

an array of cairo_glyph_t objects

 

num_glyphs

the number of elements in glyphs +

 

extents

a cairo_text_extents_t object into which the results +will be stored

 
+
+

Since 1.0

+
+
+
+

cairo_toy_font_face_create ()

+
cairo_font_face_t *
+cairo_toy_font_face_create (const char *family,
+                            cairo_font_slant_t slant,
+                            cairo_font_weight_t weight);
+

Creates a font face from a triplet of family, slant, and weight. +These font faces are used in implementation of the the cairo_t "toy" +font API.

+

If family + is the zero-length string "", the platform-specific default +family is assumed. The default family then can be queried using +cairo_toy_font_face_get_family().

+

The cairo_select_font_face() function uses this to create font faces. +See that function for limitations and other details of toy font faces.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

family

a font family name, encoded in UTF-8

 

slant

the slant for the font

 

weight

the weight for the font

 
+
+
+

Returns

+

a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it.

+

+
+

Since 1.8

+
+
+
+

cairo_toy_font_face_get_family ()

+
const char *
+cairo_toy_font_face_get_family (cairo_font_face_t *font_face);
+

Gets the familly name of a toy font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A toy font face

 
+
+
+

Returns

+

The family name. This string is owned by the font face +and remains valid as long as the font face is alive (referenced).

+

+
+

Since 1.8

+
+
+
+

cairo_toy_font_face_get_slant ()

+
cairo_font_slant_t
+cairo_toy_font_face_get_slant (cairo_font_face_t *font_face);
+

Gets the slant a toy font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A toy font face

 
+
+
+

Returns

+

The slant value

+

+
+

Since 1.8

+
+
+
+

cairo_toy_font_face_get_weight ()

+
cairo_font_weight_t
+cairo_toy_font_face_get_weight (cairo_font_face_t *font_face);
+

Gets the weight a toy font.

+
+

Parameters

+
+++++ + + + + + +

font_face

A toy font face

 
+
+
+

Returns

+

The weight value

+

+
+

Since 1.8

+
+
+
+

cairo_glyph_allocate ()

+
cairo_glyph_t *
+cairo_glyph_allocate (int num_glyphs);
+

Allocates an array of cairo_glyph_t's. +This function is only useful in implementations of +cairo_user_scaled_font_text_to_glyphs_func_t where the user +needs to allocate an array of glyphs that cairo will free. +For all other uses, user can use their own allocation method +for glyphs.

+

This function returns NULL if num_glyphs + is not positive, +or if out of memory. That means, the NULL return value +signals out-of-memory only if num_glyphs + was positive.

+
+

Parameters

+
+++++ + + + + + +

num_glyphs

number of glyphs to allocate

 
+
+
+

Returns

+

the newly allocated array of glyphs that should be +freed using cairo_glyph_free()

+

+
+

Since 1.8

+
+
+
+

cairo_glyph_free ()

+
void
+cairo_glyph_free (cairo_glyph_t *glyphs);
+

Frees an array of cairo_glyph_t's allocated using cairo_glyph_allocate(). +This function is only useful to free glyph array returned +by cairo_scaled_font_text_to_glyphs() where cairo returns +an array of glyphs that the user will free. +For all other uses, user can use their own allocation method +for glyphs.

+
+

Parameters

+
+++++ + + + + + +

glyphs

array of glyphs to free, or NULL

 
+
+

Since 1.8

+
+
+
+

cairo_text_cluster_allocate ()

+
cairo_text_cluster_t *
+cairo_text_cluster_allocate (int num_clusters);
+

Allocates an array of cairo_text_cluster_t's. +This function is only useful in implementations of +cairo_user_scaled_font_text_to_glyphs_func_t where the user +needs to allocate an array of text clusters that cairo will free. +For all other uses, user can use their own allocation method +for text clusters.

+

This function returns NULL if num_clusters + is not positive, +or if out of memory. That means, the NULL return value +signals out-of-memory only if num_clusters + was positive.

+
+

Parameters

+
+++++ + + + + + +

num_clusters

number of text_clusters to allocate

 
+
+
+

Returns

+

the newly allocated array of text clusters that should be +freed using cairo_text_cluster_free()

+

+
+

Since 1.8

+
+
+
+

cairo_text_cluster_free ()

+
void
+cairo_text_cluster_free (cairo_text_cluster_t *clusters);
+

Frees an array of cairo_text_cluster's allocated using cairo_text_cluster_allocate(). +This function is only useful to free text cluster array returned +by cairo_scaled_font_text_to_glyphs() where cairo returns +an array of text clusters that the user will free. +For all other uses, user can use their own allocation method +for text clusters.

+
+

Parameters

+
+++++ + + + + + +

clusters

array of text clusters to free, or NULL

 
+
+

Since 1.8

+
+
+
+

Types and Values

+
+

cairo_glyph_t

+
typedef struct {
+    unsigned long        index;
+    double               x;
+    double               y;
+} cairo_glyph_t;
+
+

The cairo_glyph_t structure holds information about a single glyph +when drawing or measuring text. A font is (in simple terms) a +collection of shapes used to draw text. A glyph is one of these +shapes. There can be multiple glyphs for a single character +(alternates to be used in different contexts, for example), or a +glyph can be a ligature of multiple +characters. Cairo doesn't expose any way of converting input text +into glyphs, so in order to use the Cairo interfaces that take +arrays of glyphs, you must directly access the appropriate +underlying font system.

+

Note that the offsets given by x + and y + are not cumulative. When +drawing or measuring text, each glyph is individually positioned +with respect to the overall origin

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

unsigned long index;

glyph index in the font. The exact interpretation of the +glyph index depends on the font technology being used.

 

double x;

the offset in the X direction between the origin used for +drawing or measuring the string and the origin of this glyph.

 

double y;

the offset in the Y direction between the origin used for +drawing or measuring the string and the origin of this glyph.

 
+
+

Since 1.0

+
+
+
+

enum cairo_font_slant_t

+

Specifies variants of a font face based on their slant.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

CAIRO_FONT_SLANT_NORMAL

+

Upright font style, since 1.0

+
 

CAIRO_FONT_SLANT_ITALIC

+

Italic font style, since 1.0

+
 

CAIRO_FONT_SLANT_OBLIQUE

+

Oblique font style, since 1.0

+
 
+
+

Since 1.0

+
+
+
+

enum cairo_font_weight_t

+

Specifies variants of a font face based on their weight.

+
+

Members

+
+++++ + + + + + + + + + + + + +

CAIRO_FONT_WEIGHT_NORMAL

+

Normal font weight, since 1.0

+
 

CAIRO_FONT_WEIGHT_BOLD

+

Bold font weight, since 1.0

+
 
+
+

Since 1.0

+
+
+
+

cairo_text_cluster_t

+
typedef struct {
+    int        num_bytes;
+    int        num_glyphs;
+} cairo_text_cluster_t;
+
+

The cairo_text_cluster_t structure holds information about a single +text cluster. A text cluster is a minimal +mapping of some glyphs corresponding to some UTF-8 text.

+

For a cluster to be valid, both num_bytes + and num_glyphs + should +be non-negative, and at least one should be non-zero. +Note that clusters with zero glyphs are not as well supported as +normal clusters. For example, PDF rendering applications typically +ignore those clusters when PDF text is being selected.

+

See cairo_show_text_glyphs() for how clusters are used in advanced +text operations.

+
+

Members

+
+++++ + + + + + + + + + + + + +

int num_bytes;

the number of bytes of UTF-8 text covered by cluster

 

int num_glyphs;

the number of glyphs covered by cluster

 
+
+

Since 1.8

+
+
+
+

enum cairo_text_cluster_flags_t

+

Specifies properties of a text cluster mapping.

+
+

Members

+
+++++ + + + + + +

CAIRO_TEXT_CLUSTER_FLAG_BACKWARD

+

The clusters in the cluster array +map to glyphs in the glyph array from end to start. (Since 1.8)

+
 
+
+

Since 1.8

+
+
+ +
+ + + \ No newline at end of file diff --git a/doc/public/html/cairo.devhelp2 b/doc/public/html/cairo.devhelp2 new file mode 100644 index 000000000..9f73a1918 --- /dev/null +++ b/doc/public/html/cairo.devhelp2 @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/html/home.png b/doc/public/html/home.png new file mode 100644 index 000000000..28c2e27c6 Binary files /dev/null and b/doc/public/html/home.png differ diff --git a/doc/public/html/index-1.10.html b/doc/public/html/index-1.10.html new file mode 100644 index 000000000..49d31cd06 --- /dev/null +++ b/doc/public/html/index-1.10.html @@ -0,0 +1,177 @@ + + + + +Cairo: A Vector Graphics Library: Index of new symbols in 1.10 + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.10

+
+
+

D

+
+
cairo_device_acquire, cairo_device_acquire () +
+
cairo_device_destroy, cairo_device_destroy () +
+
cairo_device_finish, cairo_device_finish () +
+
cairo_device_flush, cairo_device_flush () +
+
cairo_device_get_reference_count, cairo_device_get_reference_count () +
+
cairo_device_get_type, cairo_device_get_type () +
+
cairo_device_get_user_data, cairo_device_get_user_data () +
+
cairo_device_reference, cairo_device_reference () +
+
cairo_device_release, cairo_device_release () +
+
cairo_device_set_user_data, cairo_device_set_user_data () +
+
cairo_device_status, cairo_device_status () +
+
cairo_device_t, cairo_device_t +
+
cairo_device_type_t, enum cairo_device_type_t +
+
+
+
+

H

+
+
CAIRO_HAS_FC_FONT, CAIRO_HAS_FC_FONT +
+
CAIRO_HAS_RECORDING_SURFACE, CAIRO_HAS_RECORDING_SURFACE +
+
+
+
+

I

+
cairo_in_clip, cairo_in_clip () +
+
+
+

M

+
+
CAIRO_MIME_TYPE_JP2, CAIRO_MIME_TYPE_JP2 +
+
CAIRO_MIME_TYPE_JPEG, CAIRO_MIME_TYPE_JPEG +
+
CAIRO_MIME_TYPE_PNG, CAIRO_MIME_TYPE_PNG +
+
CAIRO_MIME_TYPE_URI, CAIRO_MIME_TYPE_URI +
+
+
+
+

P

+
+
cairo_pdf_get_versions, cairo_pdf_get_versions () +
+
cairo_pdf_surface_restrict_to_version, cairo_pdf_surface_restrict_to_version () +
+
cairo_pdf_version_t, enum cairo_pdf_version_t +
+
cairo_pdf_version_to_string, cairo_pdf_version_to_string () +
+
+
+
+

R

+
+
cairo_recording_surface_create, cairo_recording_surface_create () +
+
cairo_recording_surface_ink_extents, cairo_recording_surface_ink_extents () +
+
cairo_rectangle_int_t, cairo_rectangle_int_t +
+
cairo_region_contains_point, cairo_region_contains_point () +
+
cairo_region_contains_rectangle, cairo_region_contains_rectangle () +
+
cairo_region_copy, cairo_region_copy () +
+
cairo_region_create, cairo_region_create () +
+
cairo_region_create_rectangle, cairo_region_create_rectangle () +
+
cairo_region_create_rectangles, cairo_region_create_rectangles () +
+
cairo_region_destroy, cairo_region_destroy () +
+
cairo_region_equal, cairo_region_equal () +
+
cairo_region_get_extents, cairo_region_get_extents () +
+
cairo_region_get_rectangle, cairo_region_get_rectangle () +
+
cairo_region_intersect, cairo_region_intersect () +
+
cairo_region_intersect_rectangle, cairo_region_intersect_rectangle () +
+
cairo_region_is_empty, cairo_region_is_empty () +
+
cairo_region_num_rectangles, cairo_region_num_rectangles () +
+
cairo_region_overlap_t, enum cairo_region_overlap_t +
+
cairo_region_reference, cairo_region_reference () +
+
cairo_region_status, cairo_region_status () +
+
cairo_region_subtract, cairo_region_subtract () +
+
cairo_region_subtract_rectangle, cairo_region_subtract_rectangle () +
+
cairo_region_t, cairo_region_t +
+
cairo_region_translate, cairo_region_translate () +
+
cairo_region_union, cairo_region_union () +
+
cairo_region_union_rectangle, cairo_region_union_rectangle () +
+
cairo_region_xor, cairo_region_xor () +
+
cairo_region_xor_rectangle, cairo_region_xor_rectangle () +
+
+
+
+

S

+
+
cairo_surface_create_for_rectangle, cairo_surface_create_for_rectangle () +
+
cairo_surface_get_device, cairo_surface_get_device () +
+
cairo_surface_get_mime_data, cairo_surface_get_mime_data () +
+
cairo_surface_set_mime_data, cairo_surface_set_mime_data () +
+
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index-1.12.html b/doc/public/html/index-1.12.html new file mode 100644 index 000000000..fc10426e5 --- /dev/null +++ b/doc/public/html/index-1.12.html @@ -0,0 +1,193 @@ + + + + +Cairo: A Vector Graphics Library: Index of new symbols in 1.12 + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.12

+
+
+

F

+
+
cairo_ft_font_face_get_synthesize, cairo_ft_font_face_get_synthesize () +
+
cairo_ft_font_face_set_synthesize, cairo_ft_font_face_set_synthesize () +
+
cairo_ft_font_face_unset_synthesize, cairo_ft_font_face_unset_synthesize () +
+
cairo_ft_synthesize_t, enum cairo_ft_synthesize_t +
+
+
+
+

H

+
+
CAIRO_HAS_SCRIPT_SURFACE, CAIRO_HAS_SCRIPT_SURFACE +
+
CAIRO_HAS_XCB_SURFACE, CAIRO_HAS_XCB_SURFACE +
+
+
+
+

M

+
+
cairo_mesh_pattern_begin_patch, cairo_mesh_pattern_begin_patch () +
+
cairo_mesh_pattern_curve_to, cairo_mesh_pattern_curve_to () +
+
cairo_mesh_pattern_end_patch, cairo_mesh_pattern_end_patch () +
+
cairo_mesh_pattern_get_control_point, cairo_mesh_pattern_get_control_point () +
+
cairo_mesh_pattern_get_corner_color_rgba, cairo_mesh_pattern_get_corner_color_rgba () +
+
cairo_mesh_pattern_get_patch_count, cairo_mesh_pattern_get_patch_count () +
+
cairo_mesh_pattern_get_path, cairo_mesh_pattern_get_path () +
+
cairo_mesh_pattern_line_to, cairo_mesh_pattern_line_to () +
+
cairo_mesh_pattern_move_to, cairo_mesh_pattern_move_to () +
+
cairo_mesh_pattern_set_control_point, cairo_mesh_pattern_set_control_point () +
+
cairo_mesh_pattern_set_corner_color_rgb, cairo_mesh_pattern_set_corner_color_rgb () +
+
cairo_mesh_pattern_set_corner_color_rgba, cairo_mesh_pattern_set_corner_color_rgba () +
+
CAIRO_MIME_TYPE_UNIQUE_ID, CAIRO_MIME_TYPE_UNIQUE_ID +
+
+
+
+

P

+
+
cairo_pattern_create_mesh, cairo_pattern_create_mesh () +
+
cairo_pattern_create_raster_source, cairo_pattern_create_raster_source () +
+
+
+
+

R

+
+
cairo_raster_source_acquire_func_t, cairo_raster_source_acquire_func_t () +
+
cairo_raster_source_copy_func_t, cairo_raster_source_copy_func_t () +
+
cairo_raster_source_finish_func_t, cairo_raster_source_finish_func_t () +
+
cairo_raster_source_pattern_get_acquire, cairo_raster_source_pattern_get_acquire () +
+
cairo_raster_source_pattern_get_callback_data, cairo_raster_source_pattern_get_callback_data () +
+
cairo_raster_source_pattern_get_copy, cairo_raster_source_pattern_get_copy () +
+
cairo_raster_source_pattern_get_finish, cairo_raster_source_pattern_get_finish () +
+
cairo_raster_source_pattern_get_snapshot, cairo_raster_source_pattern_get_snapshot () +
+
cairo_raster_source_pattern_set_acquire, cairo_raster_source_pattern_set_acquire () +
+
cairo_raster_source_pattern_set_callback_data, cairo_raster_source_pattern_set_callback_data () +
+
cairo_raster_source_pattern_set_copy, cairo_raster_source_pattern_set_copy () +
+
cairo_raster_source_pattern_set_finish, cairo_raster_source_pattern_set_finish () +
+
cairo_raster_source_pattern_set_snapshot, cairo_raster_source_pattern_set_snapshot () +
+
cairo_raster_source_release_func_t, cairo_raster_source_release_func_t () +
+
cairo_raster_source_snapshot_func_t, cairo_raster_source_snapshot_func_t () +
+
cairo_recording_surface_get_extents, cairo_recording_surface_get_extents () +
+
+
+
+

S

+
+
cairo_script_create, cairo_script_create () +
+
cairo_script_create_for_stream, cairo_script_create_for_stream () +
+
cairo_script_from_recording_surface, cairo_script_from_recording_surface () +
+
cairo_script_get_mode, cairo_script_get_mode () +
+
cairo_script_mode_t, enum cairo_script_mode_t +
+
cairo_script_set_mode, cairo_script_set_mode () +
+
cairo_script_surface_create, cairo_script_surface_create () +
+
cairo_script_surface_create_for_target, cairo_script_surface_create_for_target () +
+
cairo_script_write_comment, cairo_script_write_comment () +
+
cairo_surface_create_similar_image, cairo_surface_create_similar_image () +
+
cairo_surface_map_to_image, cairo_surface_map_to_image () +
+
cairo_surface_supports_mime_type, cairo_surface_supports_mime_type () +
+
cairo_surface_unmap_image, cairo_surface_unmap_image () +
+
+
+
+

X

+
+
cairo_xcb_device_debug_cap_xrender_version, cairo_xcb_device_debug_cap_xrender_version () +
+
cairo_xcb_device_debug_cap_xshm_version, cairo_xcb_device_debug_cap_xshm_version () +
+
cairo_xcb_device_debug_get_precision, cairo_xcb_device_debug_get_precision () +
+
cairo_xcb_device_debug_set_precision, cairo_xcb_device_debug_set_precision () +
+
cairo_xcb_device_get_connection, cairo_xcb_device_get_connection () +
+
cairo_xcb_surface_create, cairo_xcb_surface_create () +
+
cairo_xcb_surface_create_for_bitmap, cairo_xcb_surface_create_for_bitmap () +
+
cairo_xcb_surface_create_with_xrender_format, cairo_xcb_surface_create_with_xrender_format () +
+
cairo_xcb_surface_set_drawable, cairo_xcb_surface_set_drawable () +
+
cairo_xcb_surface_set_size, cairo_xcb_surface_set_size () +
+
cairo_xlib_device_debug_cap_xrender_version, cairo_xlib_device_debug_cap_xrender_version () +
+
cairo_xlib_device_debug_get_precision, cairo_xlib_device_debug_get_precision () +
+
cairo_xlib_device_debug_set_precision, cairo_xlib_device_debug_set_precision () +
+
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index-1.2.html b/doc/public/html/index-1.2.html new file mode 100644 index 000000000..119f67383 --- /dev/null +++ b/doc/public/html/index-1.2.html @@ -0,0 +1,179 @@ + + + + +Cairo: A Vector Graphics Library: Index of new symbols in 1.2 + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.2

+
+
+

F

+
+
cairo_font_face_get_type, cairo_font_face_get_type () +
+
cairo_font_type_t, enum cairo_font_type_t +
+
+
+
+

G

+
cairo_get_group_target, cairo_get_group_target () +
+
+
+

H

+
+
CAIRO_HAS_PDF_SURFACE, CAIRO_HAS_PDF_SURFACE +
+
CAIRO_HAS_PS_SURFACE, CAIRO_HAS_PS_SURFACE +
+
CAIRO_HAS_SVG_SURFACE, CAIRO_HAS_SVG_SURFACE +
+
+
+
+

I

+
+
cairo_image_surface_get_data, cairo_image_surface_get_data () +
+
cairo_image_surface_get_format, cairo_image_surface_get_format () +
+
cairo_image_surface_get_stride, cairo_image_surface_get_stride () +
+
+
+
+

N

+
cairo_new_sub_path, cairo_new_sub_path () +
+
+
+

P

+
+
cairo_pattern_get_type, cairo_pattern_get_type () +
+
cairo_pattern_type_t, enum cairo_pattern_type_t +
+
cairo_pdf_surface_create, cairo_pdf_surface_create () +
+
cairo_pdf_surface_create_for_stream, cairo_pdf_surface_create_for_stream () +
+
cairo_pdf_surface_set_size, cairo_pdf_surface_set_size () +
+
cairo_pop_group, cairo_pop_group () +
+
cairo_pop_group_to_source, cairo_pop_group_to_source () +
+
cairo_ps_surface_create, cairo_ps_surface_create () +
+
cairo_ps_surface_create_for_stream, cairo_ps_surface_create_for_stream () +
+
cairo_ps_surface_dsc_begin_page_setup, cairo_ps_surface_dsc_begin_page_setup () +
+
cairo_ps_surface_dsc_begin_setup, cairo_ps_surface_dsc_begin_setup () +
+
cairo_ps_surface_dsc_comment, cairo_ps_surface_dsc_comment () +
+
cairo_ps_surface_set_size, cairo_ps_surface_set_size () +
+
cairo_push_group, cairo_push_group () +
+
cairo_push_group_with_content, cairo_push_group_with_content () +
+
+
+
+

S

+
+
cairo_scaled_font_get_ctm, cairo_scaled_font_get_ctm () +
+
cairo_scaled_font_get_font_face, cairo_scaled_font_get_font_face () +
+
cairo_scaled_font_get_font_matrix, cairo_scaled_font_get_font_matrix () +
+
cairo_scaled_font_get_font_options, cairo_scaled_font_get_font_options () +
+
cairo_scaled_font_get_type, cairo_scaled_font_get_type () +
+
cairo_scaled_font_text_extents, cairo_scaled_font_text_extents () +
+
cairo_set_scaled_font, cairo_set_scaled_font () +
+
cairo_surface_get_content, cairo_surface_get_content () +
+
cairo_surface_get_device_offset, cairo_surface_get_device_offset () +
+
cairo_surface_get_type, cairo_surface_get_type () +
+
cairo_surface_set_fallback_resolution, cairo_surface_set_fallback_resolution () +
+
cairo_surface_type_t, enum cairo_surface_type_t +
+
cairo_svg_get_versions, cairo_svg_get_versions () +
+
cairo_svg_surface_create, cairo_svg_surface_create () +
+
cairo_svg_surface_create_for_stream, cairo_svg_surface_create_for_stream () +
+
cairo_svg_surface_restrict_to_version, cairo_svg_surface_restrict_to_version () +
+
cairo_svg_version_t, enum cairo_svg_version_t +
+
cairo_svg_version_to_string, cairo_svg_version_to_string () +
+
+
+
+

W

+
+
cairo_win32_font_face_create_for_hfont, cairo_win32_font_face_create_for_hfont () +
+
cairo_win32_surface_create_with_dib, cairo_win32_surface_create_with_dib () +
+
cairo_win32_surface_get_dc, cairo_win32_surface_get_dc () +
+
+
+
+

X

+
+
cairo_xlib_surface_get_depth, cairo_xlib_surface_get_depth () +
+
cairo_xlib_surface_get_display, cairo_xlib_surface_get_display () +
+
cairo_xlib_surface_get_drawable, cairo_xlib_surface_get_drawable () +
+
cairo_xlib_surface_get_height, cairo_xlib_surface_get_height () +
+
cairo_xlib_surface_get_screen, cairo_xlib_surface_get_screen () +
+
cairo_xlib_surface_get_visual, cairo_xlib_surface_get_visual () +
+
cairo_xlib_surface_get_width, cairo_xlib_surface_get_width () +
+
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index-1.4.html b/doc/public/html/index-1.4.html new file mode 100644 index 000000000..57a2ccbf2 --- /dev/null +++ b/doc/public/html/index-1.4.html @@ -0,0 +1,123 @@ + + + + +Cairo: A Vector Graphics Library: Index of new symbols in 1.4 + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.4

+
+
+

C

+
+
cairo_clip_extents, cairo_clip_extents () +
+
cairo_copy_clip_rectangle_list, cairo_copy_clip_rectangle_list () +
+
+
+
+

F

+
cairo_font_face_get_reference_count, cairo_font_face_get_reference_count () +
+
+
+

G

+
+
cairo_get_dash, cairo_get_dash () +
+
cairo_get_dash_count, cairo_get_dash_count () +
+
cairo_get_reference_count, cairo_get_reference_count () +
+
cairo_get_scaled_font, cairo_get_scaled_font () +
+
cairo_get_user_data, cairo_get_user_data () +
+
+
+
+

P

+
+
cairo_pattern_get_color_stop_count, cairo_pattern_get_color_stop_count () +
+
cairo_pattern_get_color_stop_rgba, cairo_pattern_get_color_stop_rgba () +
+
cairo_pattern_get_linear_points, cairo_pattern_get_linear_points () +
+
cairo_pattern_get_radial_circles, cairo_pattern_get_radial_circles () +
+
cairo_pattern_get_reference_count, cairo_pattern_get_reference_count () +
+
cairo_pattern_get_rgba, cairo_pattern_get_rgba () +
+
cairo_pattern_get_surface, cairo_pattern_get_surface () +
+
cairo_pattern_get_user_data, cairo_pattern_get_user_data () +
+
cairo_pattern_set_user_data, cairo_pattern_set_user_data () +
+
+
+
+

R

+
+
cairo_rectangle_list_destroy, cairo_rectangle_list_destroy () +
+
cairo_rectangle_list_t, cairo_rectangle_list_t +
+
cairo_rectangle_t, cairo_rectangle_t +
+
+
+
+

S

+
+
cairo_scaled_font_get_reference_count, cairo_scaled_font_get_reference_count () +
+
cairo_scaled_font_get_user_data, cairo_scaled_font_get_user_data () +
+
cairo_scaled_font_set_user_data, cairo_scaled_font_set_user_data () +
+
cairo_set_user_data, cairo_set_user_data () +
+
cairo_surface_get_reference_count, cairo_surface_get_reference_count () +
+
+
+
+

W

+
+
cairo_win32_scaled_font_get_device_to_logical, cairo_win32_scaled_font_get_device_to_logical () +
+
cairo_win32_scaled_font_get_logical_to_device, cairo_win32_scaled_font_get_logical_to_device () +
+
cairo_win32_surface_create_with_ddb, cairo_win32_surface_create_with_ddb () +
+
cairo_win32_surface_get_image, cairo_win32_surface_get_image () +
+
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index-1.6.html b/doc/public/html/index-1.6.html new file mode 100644 index 000000000..eef34e370 --- /dev/null +++ b/doc/public/html/index-1.6.html @@ -0,0 +1,107 @@ + + + + +Cairo: A Vector Graphics Library: Index of new symbols in 1.6 + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.6

+
+
+

F

+
cairo_format_stride_for_width, cairo_format_stride_for_width () +
+
+
+

H

+
+
cairo_has_current_point, cairo_has_current_point () +
+
CAIRO_HAS_QUARTZ_FONT, CAIRO_HAS_QUARTZ_FONT +
+
CAIRO_HAS_QUARTZ_SURFACE, CAIRO_HAS_QUARTZ_SURFACE +
+
CAIRO_HAS_XLIB_XRENDER_SURFACE, CAIRO_HAS_XLIB_XRENDER_SURFACE +
+
+
+
+

P

+
+
cairo_path_extents, cairo_path_extents () +
+
cairo_ps_get_levels, cairo_ps_get_levels () +
+
cairo_ps_level_t, enum cairo_ps_level_t +
+
cairo_ps_level_to_string, cairo_ps_level_to_string () +
+
cairo_ps_surface_get_eps, cairo_ps_surface_get_eps () +
+
cairo_ps_surface_restrict_to_level, cairo_ps_surface_restrict_to_level () +
+
cairo_ps_surface_set_eps, cairo_ps_surface_set_eps () +
+
+
+
+

Q

+
+
cairo_quartz_font_face_create_for_atsu_font_id, cairo_quartz_font_face_create_for_atsu_font_id () +
+
cairo_quartz_font_face_create_for_cgfont, cairo_quartz_font_face_create_for_cgfont () +
+
cairo_quartz_surface_create, cairo_quartz_surface_create () +
+
cairo_quartz_surface_create_for_cg_context, cairo_quartz_surface_create_for_cg_context () +
+
cairo_quartz_surface_get_cg_context, cairo_quartz_surface_get_cg_context () +
+
+
+
+

S

+
+
cairo_surface_copy_page, cairo_surface_copy_page () +
+
cairo_surface_show_page, cairo_surface_show_page () +
+
+
+
+

W

+
+
cairo_win32_font_face_create_for_logfontw_hfont, cairo_win32_font_face_create_for_logfontw_hfont () +
+
cairo_win32_printing_surface_create, cairo_win32_printing_surface_create () +
+
+
+
+

X

+
cairo_xlib_surface_get_xrender_format, cairo_xlib_surface_get_xrender_format () +
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index-1.8.html b/doc/public/html/index-1.8.html new file mode 100644 index 000000000..60b735dc3 --- /dev/null +++ b/doc/public/html/index-1.8.html @@ -0,0 +1,128 @@ + + + + +Cairo: A Vector Graphics Library: Index of new symbols in 1.8 + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.8

+
+
+

G

+
+
cairo_glyph_allocate, cairo_glyph_allocate () +
+
cairo_glyph_free, cairo_glyph_free () +
+
+
+
+

H

+
+
CAIRO_HAS_IMAGE_SURFACE, CAIRO_HAS_IMAGE_SURFACE +
+
CAIRO_HAS_USER_FONT, CAIRO_HAS_USER_FONT +
+
CAIRO_HAS_WIN32_FONT, CAIRO_HAS_WIN32_FONT +
+
+
+
+

S

+
+
cairo_scaled_font_get_scale_matrix, cairo_scaled_font_get_scale_matrix () +
+
cairo_scaled_font_text_to_glyphs, cairo_scaled_font_text_to_glyphs () +
+
cairo_show_text_glyphs, cairo_show_text_glyphs () +
+
cairo_surface_get_fallback_resolution, cairo_surface_get_fallback_resolution () +
+
cairo_surface_has_show_text_glyphs, cairo_surface_has_show_text_glyphs () +
+
+
+
+

T

+
+
cairo_text_cluster_allocate, cairo_text_cluster_allocate () +
+
cairo_text_cluster_flags_t, enum cairo_text_cluster_flags_t +
+
cairo_text_cluster_free, cairo_text_cluster_free () +
+
cairo_text_cluster_t, cairo_text_cluster_t +
+
cairo_toy_font_face_create, cairo_toy_font_face_create () +
+
cairo_toy_font_face_get_family, cairo_toy_font_face_get_family () +
+
cairo_toy_font_face_get_slant, cairo_toy_font_face_get_slant () +
+
cairo_toy_font_face_get_weight, cairo_toy_font_face_get_weight () +
+
+
+
+

U

+
+
cairo_user_font_face_create, cairo_user_font_face_create () +
+
cairo_user_font_face_get_init_func, cairo_user_font_face_get_init_func () +
+
cairo_user_font_face_get_render_glyph_func, cairo_user_font_face_get_render_glyph_func () +
+
cairo_user_font_face_get_text_to_glyphs_func, cairo_user_font_face_get_text_to_glyphs_func () +
+
cairo_user_font_face_get_unicode_to_glyph_func, cairo_user_font_face_get_unicode_to_glyph_func () +
+
cairo_user_font_face_set_init_func, cairo_user_font_face_set_init_func () +
+
cairo_user_font_face_set_render_glyph_func, cairo_user_font_face_set_render_glyph_func () +
+
cairo_user_font_face_set_text_to_glyphs_func, cairo_user_font_face_set_text_to_glyphs_func () +
+
cairo_user_font_face_set_unicode_to_glyph_func, cairo_user_font_face_set_unicode_to_glyph_func () +
+
cairo_user_scaled_font_init_func_t, cairo_user_scaled_font_init_func_t () +
+
cairo_user_scaled_font_render_glyph_func_t, cairo_user_scaled_font_render_glyph_func_t () +
+
cairo_user_scaled_font_text_to_glyphs_func_t, cairo_user_scaled_font_text_to_glyphs_func_t () +
+
cairo_user_scaled_font_unicode_to_glyph_func_t, cairo_user_scaled_font_unicode_to_glyph_func_t () +
+
+
+
+

V

+
+
CAIRO_VERSION_STRING, CAIRO_VERSION_STRING +
+
CAIRO_VERSION_STRINGIZE, CAIRO_VERSION_STRINGIZE() +
+
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index-all.html b/doc/public/html/index-all.html new file mode 100644 index 000000000..12f08fe4a --- /dev/null +++ b/doc/public/html/index-all.html @@ -0,0 +1,1122 @@ + + + + +Cairo: A Vector Graphics Library: Index + + + + + + + + + + + + + + + + +
+

+Index

+
+
+

A

+
+
cairo_antialias_t, enum cairo_antialias_t +
+
cairo_append_path, cairo_append_path () +
+
cairo_arc, cairo_arc () +
+
cairo_arc_negative, cairo_arc_negative () +
+
+
+
+

B

+
cairo_bool_t, cairo_bool_t +
+
+
+

C

+
+
cairo_clip, cairo_clip () +
+
cairo_clip_extents, cairo_clip_extents () +
+
cairo_clip_preserve, cairo_clip_preserve () +
+
cairo_close_path, cairo_close_path () +
+
cairo_content_t, enum cairo_content_t +
+
cairo_copy_clip_rectangle_list, cairo_copy_clip_rectangle_list () +
+
cairo_copy_page, cairo_copy_page () +
+
cairo_copy_path, cairo_copy_path () +
+
cairo_copy_path_flat, cairo_copy_path_flat () +
+
cairo_create, cairo_create () +
+
cairo_curve_to, cairo_curve_to () +
+
+
+
+

D

+
+
cairo_debug_reset_static_data, cairo_debug_reset_static_data () +
+
cairo_destroy, cairo_destroy () +
+
cairo_destroy_func_t, cairo_destroy_func_t () +
+
cairo_device_acquire, cairo_device_acquire () +
+
cairo_device_destroy, cairo_device_destroy () +
+
cairo_device_finish, cairo_device_finish () +
+
cairo_device_flush, cairo_device_flush () +
+
cairo_device_get_reference_count, cairo_device_get_reference_count () +
+
cairo_device_get_type, cairo_device_get_type () +
+
cairo_device_get_user_data, cairo_device_get_user_data () +
+
cairo_device_observer_elapsed, cairo_device_observer_elapsed () +
+
cairo_device_observer_fill_elapsed, cairo_device_observer_fill_elapsed () +
+
cairo_device_observer_glyphs_elapsed, cairo_device_observer_glyphs_elapsed () +
+
cairo_device_observer_mask_elapsed, cairo_device_observer_mask_elapsed () +
+
cairo_device_observer_paint_elapsed, cairo_device_observer_paint_elapsed () +
+
cairo_device_observer_print, cairo_device_observer_print () +
+
cairo_device_observer_stroke_elapsed, cairo_device_observer_stroke_elapsed () +
+
cairo_device_reference, cairo_device_reference () +
+
cairo_device_release, cairo_device_release () +
+
cairo_device_set_user_data, cairo_device_set_user_data () +
+
cairo_device_status, cairo_device_status () +
+
cairo_device_t, cairo_device_t +
+
cairo_device_to_user, cairo_device_to_user () +
+
cairo_device_to_user_distance, cairo_device_to_user_distance () +
+
cairo_device_type_t, enum cairo_device_type_t +
+
+
+
+

E

+
cairo_extend_t, enum cairo_extend_t +
+
+
+

F

+
+
cairo_fill, cairo_fill () +
+
cairo_fill_extents, cairo_fill_extents () +
+
cairo_fill_preserve, cairo_fill_preserve () +
+
cairo_fill_rule_t, enum cairo_fill_rule_t +
+
cairo_filter_t, enum cairo_filter_t +
+
cairo_font_extents, cairo_font_extents () +
+
cairo_font_extents_t, cairo_font_extents_t +
+
cairo_font_face_destroy, cairo_font_face_destroy () +
+
cairo_font_face_get_reference_count, cairo_font_face_get_reference_count () +
+
cairo_font_face_get_type, cairo_font_face_get_type () +
+
cairo_font_face_get_user_data, cairo_font_face_get_user_data () +
+
cairo_font_face_reference, cairo_font_face_reference () +
+
cairo_font_face_set_user_data, cairo_font_face_set_user_data () +
+
cairo_font_face_status, cairo_font_face_status () +
+
cairo_font_face_t, cairo_font_face_t +
+
cairo_font_options_copy, cairo_font_options_copy () +
+
cairo_font_options_create, cairo_font_options_create () +
+
cairo_font_options_destroy, cairo_font_options_destroy () +
+
cairo_font_options_equal, cairo_font_options_equal () +
+
cairo_font_options_get_antialias, cairo_font_options_get_antialias () +
+
cairo_font_options_get_hint_metrics, cairo_font_options_get_hint_metrics () +
+
cairo_font_options_get_hint_style, cairo_font_options_get_hint_style () +
+
cairo_font_options_get_subpixel_order, cairo_font_options_get_subpixel_order () +
+
cairo_font_options_hash, cairo_font_options_hash () +
+
cairo_font_options_merge, cairo_font_options_merge () +
+
cairo_font_options_set_antialias, cairo_font_options_set_antialias () +
+
cairo_font_options_set_hint_metrics, cairo_font_options_set_hint_metrics () +
+
cairo_font_options_set_hint_style, cairo_font_options_set_hint_style () +
+
cairo_font_options_set_subpixel_order, cairo_font_options_set_subpixel_order () +
+
cairo_font_options_status, cairo_font_options_status () +
+
cairo_font_options_t, cairo_font_options_t +
+
cairo_font_slant_t, enum cairo_font_slant_t +
+
cairo_font_type_t, enum cairo_font_type_t +
+
cairo_font_weight_t, enum cairo_font_weight_t +
+
cairo_format_stride_for_width, cairo_format_stride_for_width () +
+
cairo_format_t, enum cairo_format_t +
+
cairo_ft_font_face_create_for_ft_face, cairo_ft_font_face_create_for_ft_face () +
+
cairo_ft_font_face_create_for_pattern, cairo_ft_font_face_create_for_pattern () +
+
cairo_ft_font_face_get_synthesize, cairo_ft_font_face_get_synthesize () +
+
cairo_ft_font_face_set_synthesize, cairo_ft_font_face_set_synthesize () +
+
cairo_ft_font_face_unset_synthesize, cairo_ft_font_face_unset_synthesize () +
+
cairo_ft_font_options_substitute, cairo_ft_font_options_substitute () +
+
cairo_ft_scaled_font_lock_face, cairo_ft_scaled_font_lock_face () +
+
cairo_ft_scaled_font_unlock_face, cairo_ft_scaled_font_unlock_face () +
+
cairo_ft_synthesize_t, enum cairo_ft_synthesize_t +
+
+
+
+

G

+
+
cairo_get_antialias, cairo_get_antialias () +
+
cairo_get_current_point, cairo_get_current_point () +
+
cairo_get_dash, cairo_get_dash () +
+
cairo_get_dash_count, cairo_get_dash_count () +
+
cairo_get_fill_rule, cairo_get_fill_rule () +
+
cairo_get_font_face, cairo_get_font_face () +
+
cairo_get_font_matrix, cairo_get_font_matrix () +
+
cairo_get_font_options, cairo_get_font_options () +
+
cairo_get_group_target, cairo_get_group_target () +
+
cairo_get_line_cap, cairo_get_line_cap () +
+
cairo_get_line_join, cairo_get_line_join () +
+
cairo_get_line_width, cairo_get_line_width () +
+
cairo_get_matrix, cairo_get_matrix () +
+
cairo_get_miter_limit, cairo_get_miter_limit () +
+
cairo_get_operator, cairo_get_operator () +
+
cairo_get_reference_count, cairo_get_reference_count () +
+
cairo_get_scaled_font, cairo_get_scaled_font () +
+
cairo_get_source, cairo_get_source () +
+
cairo_get_target, cairo_get_target () +
+
cairo_get_tolerance, cairo_get_tolerance () +
+
cairo_get_user_data, cairo_get_user_data () +
+
cairo_glyph_allocate, cairo_glyph_allocate () +
+
cairo_glyph_extents, cairo_glyph_extents () +
+
cairo_glyph_free, cairo_glyph_free () +
+
cairo_glyph_path, cairo_glyph_path () +
+
cairo_glyph_t, cairo_glyph_t +
+
+
+
+

H

+
+
cairo_has_current_point, cairo_has_current_point () +
+
CAIRO_HAS_FC_FONT, CAIRO_HAS_FC_FONT +
+
CAIRO_HAS_FT_FONT, CAIRO_HAS_FT_FONT +
+
CAIRO_HAS_IMAGE_SURFACE, CAIRO_HAS_IMAGE_SURFACE +
+
CAIRO_HAS_MIME_SURFACE, CAIRO_HAS_MIME_SURFACE +
+
CAIRO_HAS_PDF_SURFACE, CAIRO_HAS_PDF_SURFACE +
+
CAIRO_HAS_PNG_FUNCTIONS, CAIRO_HAS_PNG_FUNCTIONS +
+
CAIRO_HAS_PS_SURFACE, CAIRO_HAS_PS_SURFACE +
+
CAIRO_HAS_QUARTZ_FONT, CAIRO_HAS_QUARTZ_FONT +
+
CAIRO_HAS_QUARTZ_SURFACE, CAIRO_HAS_QUARTZ_SURFACE +
+
CAIRO_HAS_RECORDING_SURFACE, CAIRO_HAS_RECORDING_SURFACE +
+
CAIRO_HAS_SCRIPT_SURFACE, CAIRO_HAS_SCRIPT_SURFACE +
+
CAIRO_HAS_SVG_SURFACE, CAIRO_HAS_SVG_SURFACE +
+
CAIRO_HAS_USER_FONT, CAIRO_HAS_USER_FONT +
+
CAIRO_HAS_WIN32_FONT, CAIRO_HAS_WIN32_FONT +
+
CAIRO_HAS_WIN32_SURFACE, CAIRO_HAS_WIN32_SURFACE +
+
CAIRO_HAS_XCB_SHM_FUNCTIONS, CAIRO_HAS_XCB_SHM_FUNCTIONS +
+
CAIRO_HAS_XCB_SURFACE, CAIRO_HAS_XCB_SURFACE +
+
CAIRO_HAS_XLIB_SURFACE, CAIRO_HAS_XLIB_SURFACE +
+
CAIRO_HAS_XLIB_XRENDER_SURFACE, CAIRO_HAS_XLIB_XRENDER_SURFACE +
+
cairo_hint_metrics_t, enum cairo_hint_metrics_t +
+
cairo_hint_style_t, enum cairo_hint_style_t +
+
+
+
+

I

+
+
cairo_identity_matrix, cairo_identity_matrix () +
+
cairo_image_surface_create, cairo_image_surface_create () +
+
cairo_image_surface_create_for_data, cairo_image_surface_create_for_data () +
+
cairo_image_surface_create_from_png, cairo_image_surface_create_from_png () +
+
cairo_image_surface_create_from_png_stream, cairo_image_surface_create_from_png_stream () +
+
cairo_image_surface_get_data, cairo_image_surface_get_data () +
+
cairo_image_surface_get_format, cairo_image_surface_get_format () +
+
cairo_image_surface_get_height, cairo_image_surface_get_height () +
+
cairo_image_surface_get_stride, cairo_image_surface_get_stride () +
+
cairo_image_surface_get_width, cairo_image_surface_get_width () +
+
cairo_in_clip, cairo_in_clip () +
+
cairo_in_fill, cairo_in_fill () +
+
cairo_in_stroke, cairo_in_stroke () +
+
+
+
+

L

+
+
cairo_line_cap_t, enum cairo_line_cap_t +
+
cairo_line_join_t, enum cairo_line_join_t +
+
cairo_line_to, cairo_line_to () +
+
+
+
+

M

+
+
cairo_mask, cairo_mask () +
+
cairo_mask_surface, cairo_mask_surface () +
+
cairo_matrix_init, cairo_matrix_init () +
+
cairo_matrix_init_identity, cairo_matrix_init_identity () +
+
cairo_matrix_init_rotate, cairo_matrix_init_rotate () +
+
cairo_matrix_init_scale, cairo_matrix_init_scale () +
+
cairo_matrix_init_translate, cairo_matrix_init_translate () +
+
cairo_matrix_invert, cairo_matrix_invert () +
+
cairo_matrix_multiply, cairo_matrix_multiply () +
+
cairo_matrix_rotate, cairo_matrix_rotate () +
+
cairo_matrix_scale, cairo_matrix_scale () +
+
cairo_matrix_t, cairo_matrix_t +
+
cairo_matrix_transform_distance, cairo_matrix_transform_distance () +
+
cairo_matrix_transform_point, cairo_matrix_transform_point () +
+
cairo_matrix_translate, cairo_matrix_translate () +
+
cairo_mesh_pattern_begin_patch, cairo_mesh_pattern_begin_patch () +
+
cairo_mesh_pattern_curve_to, cairo_mesh_pattern_curve_to () +
+
cairo_mesh_pattern_end_patch, cairo_mesh_pattern_end_patch () +
+
cairo_mesh_pattern_get_control_point, cairo_mesh_pattern_get_control_point () +
+
cairo_mesh_pattern_get_corner_color_rgba, cairo_mesh_pattern_get_corner_color_rgba () +
+
cairo_mesh_pattern_get_patch_count, cairo_mesh_pattern_get_patch_count () +
+
cairo_mesh_pattern_get_path, cairo_mesh_pattern_get_path () +
+
cairo_mesh_pattern_line_to, cairo_mesh_pattern_line_to () +
+
cairo_mesh_pattern_move_to, cairo_mesh_pattern_move_to () +
+
cairo_mesh_pattern_set_control_point, cairo_mesh_pattern_set_control_point () +
+
cairo_mesh_pattern_set_corner_color_rgb, cairo_mesh_pattern_set_corner_color_rgb () +
+
cairo_mesh_pattern_set_corner_color_rgba, cairo_mesh_pattern_set_corner_color_rgba () +
+
CAIRO_MIME_TYPE_JBIG2, CAIRO_MIME_TYPE_JBIG2 +
+
CAIRO_MIME_TYPE_JBIG2_GLOBAL, CAIRO_MIME_TYPE_JBIG2_GLOBAL +
+
CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID +
+
CAIRO_MIME_TYPE_JP2, CAIRO_MIME_TYPE_JP2 +
+
CAIRO_MIME_TYPE_JPEG, CAIRO_MIME_TYPE_JPEG +
+
CAIRO_MIME_TYPE_PNG, CAIRO_MIME_TYPE_PNG +
+
CAIRO_MIME_TYPE_UNIQUE_ID, CAIRO_MIME_TYPE_UNIQUE_ID +
+
CAIRO_MIME_TYPE_URI, CAIRO_MIME_TYPE_URI +
+
cairo_move_to, cairo_move_to () +
+
+
+
+

N

+
+
cairo_new_path, cairo_new_path () +
+
cairo_new_sub_path, cairo_new_sub_path () +
+
+
+
+

O

+
cairo_operator_t, enum cairo_operator_t +
+
+
+

P

+
+
cairo_paint, cairo_paint () +
+
cairo_paint_with_alpha, cairo_paint_with_alpha () +
+
cairo_path_data_t, union cairo_path_data_t +
+
cairo_path_data_type_t, enum cairo_path_data_type_t +
+
cairo_path_destroy, cairo_path_destroy () +
+
cairo_path_extents, cairo_path_extents () +
+
cairo_path_t, cairo_path_t +
+
cairo_pattern_add_color_stop_rgb, cairo_pattern_add_color_stop_rgb () +
+
cairo_pattern_add_color_stop_rgba, cairo_pattern_add_color_stop_rgba () +
+
cairo_pattern_create_for_surface, cairo_pattern_create_for_surface () +
+
cairo_pattern_create_linear, cairo_pattern_create_linear () +
+
cairo_pattern_create_mesh, cairo_pattern_create_mesh () +
+
cairo_pattern_create_radial, cairo_pattern_create_radial () +
+
cairo_pattern_create_raster_source, cairo_pattern_create_raster_source () +
+
cairo_pattern_create_rgb, cairo_pattern_create_rgb () +
+
cairo_pattern_create_rgba, cairo_pattern_create_rgba () +
+
cairo_pattern_destroy, cairo_pattern_destroy () +
+
cairo_pattern_get_color_stop_count, cairo_pattern_get_color_stop_count () +
+
cairo_pattern_get_color_stop_rgba, cairo_pattern_get_color_stop_rgba () +
+
cairo_pattern_get_extend, cairo_pattern_get_extend () +
+
cairo_pattern_get_filter, cairo_pattern_get_filter () +
+
cairo_pattern_get_linear_points, cairo_pattern_get_linear_points () +
+
cairo_pattern_get_matrix, cairo_pattern_get_matrix () +
+
cairo_pattern_get_radial_circles, cairo_pattern_get_radial_circles () +
+
cairo_pattern_get_reference_count, cairo_pattern_get_reference_count () +
+
cairo_pattern_get_rgba, cairo_pattern_get_rgba () +
+
cairo_pattern_get_surface, cairo_pattern_get_surface () +
+
cairo_pattern_get_type, cairo_pattern_get_type () +
+
cairo_pattern_get_user_data, cairo_pattern_get_user_data () +
+
cairo_pattern_reference, cairo_pattern_reference () +
+
cairo_pattern_set_extend, cairo_pattern_set_extend () +
+
cairo_pattern_set_filter, cairo_pattern_set_filter () +
+
cairo_pattern_set_matrix, cairo_pattern_set_matrix () +
+
cairo_pattern_set_user_data, cairo_pattern_set_user_data () +
+
cairo_pattern_status, cairo_pattern_status () +
+
cairo_pattern_t, cairo_pattern_t +
+
cairo_pattern_type_t, enum cairo_pattern_type_t +
+
cairo_pdf_get_versions, cairo_pdf_get_versions () +
+
cairo_pdf_surface_create, cairo_pdf_surface_create () +
+
cairo_pdf_surface_create_for_stream, cairo_pdf_surface_create_for_stream () +
+
cairo_pdf_surface_restrict_to_version, cairo_pdf_surface_restrict_to_version () +
+
cairo_pdf_surface_set_size, cairo_pdf_surface_set_size () +
+
cairo_pdf_version_t, enum cairo_pdf_version_t +
+
cairo_pdf_version_to_string, cairo_pdf_version_to_string () +
+
cairo_pop_group, cairo_pop_group () +
+
cairo_pop_group_to_source, cairo_pop_group_to_source () +
+
cairo_ps_get_levels, cairo_ps_get_levels () +
+
cairo_ps_level_t, enum cairo_ps_level_t +
+
cairo_ps_level_to_string, cairo_ps_level_to_string () +
+
cairo_ps_surface_create, cairo_ps_surface_create () +
+
cairo_ps_surface_create_for_stream, cairo_ps_surface_create_for_stream () +
+
cairo_ps_surface_dsc_begin_page_setup, cairo_ps_surface_dsc_begin_page_setup () +
+
cairo_ps_surface_dsc_begin_setup, cairo_ps_surface_dsc_begin_setup () +
+
cairo_ps_surface_dsc_comment, cairo_ps_surface_dsc_comment () +
+
cairo_ps_surface_get_eps, cairo_ps_surface_get_eps () +
+
cairo_ps_surface_restrict_to_level, cairo_ps_surface_restrict_to_level () +
+
cairo_ps_surface_set_eps, cairo_ps_surface_set_eps () +
+
cairo_ps_surface_set_size, cairo_ps_surface_set_size () +
+
cairo_push_group, cairo_push_group () +
+
cairo_push_group_with_content, cairo_push_group_with_content () +
+
+
+
+

Q

+
+
cairo_quartz_font_face_create_for_atsu_font_id, cairo_quartz_font_face_create_for_atsu_font_id () +
+
cairo_quartz_font_face_create_for_cgfont, cairo_quartz_font_face_create_for_cgfont () +
+
cairo_quartz_surface_create, cairo_quartz_surface_create () +
+
cairo_quartz_surface_create_for_cg_context, cairo_quartz_surface_create_for_cg_context () +
+
cairo_quartz_surface_get_cg_context, cairo_quartz_surface_get_cg_context () +
+
+
+
+

R

+
+
cairo_raster_source_acquire_func_t, cairo_raster_source_acquire_func_t () +
+
cairo_raster_source_copy_func_t, cairo_raster_source_copy_func_t () +
+
cairo_raster_source_finish_func_t, cairo_raster_source_finish_func_t () +
+
cairo_raster_source_pattern_get_acquire, cairo_raster_source_pattern_get_acquire () +
+
cairo_raster_source_pattern_get_callback_data, cairo_raster_source_pattern_get_callback_data () +
+
cairo_raster_source_pattern_get_copy, cairo_raster_source_pattern_get_copy () +
+
cairo_raster_source_pattern_get_finish, cairo_raster_source_pattern_get_finish () +
+
cairo_raster_source_pattern_get_snapshot, cairo_raster_source_pattern_get_snapshot () +
+
cairo_raster_source_pattern_set_acquire, cairo_raster_source_pattern_set_acquire () +
+
cairo_raster_source_pattern_set_callback_data, cairo_raster_source_pattern_set_callback_data () +
+
cairo_raster_source_pattern_set_copy, cairo_raster_source_pattern_set_copy () +
+
cairo_raster_source_pattern_set_finish, cairo_raster_source_pattern_set_finish () +
+
cairo_raster_source_pattern_set_snapshot, cairo_raster_source_pattern_set_snapshot () +
+
cairo_raster_source_release_func_t, cairo_raster_source_release_func_t () +
+
cairo_raster_source_snapshot_func_t, cairo_raster_source_snapshot_func_t () +
+
cairo_read_func_t, cairo_read_func_t () +
+
cairo_recording_surface_create, cairo_recording_surface_create () +
+
cairo_recording_surface_get_extents, cairo_recording_surface_get_extents () +
+
cairo_recording_surface_ink_extents, cairo_recording_surface_ink_extents () +
+
cairo_rectangle, cairo_rectangle () +
+
cairo_rectangle_int_t, cairo_rectangle_int_t +
+
cairo_rectangle_list_destroy, cairo_rectangle_list_destroy () +
+
cairo_rectangle_list_t, cairo_rectangle_list_t +
+
cairo_rectangle_t, cairo_rectangle_t +
+
cairo_reference, cairo_reference () +
+
cairo_region_contains_point, cairo_region_contains_point () +
+
cairo_region_contains_rectangle, cairo_region_contains_rectangle () +
+
cairo_region_copy, cairo_region_copy () +
+
cairo_region_create, cairo_region_create () +
+
cairo_region_create_rectangle, cairo_region_create_rectangle () +
+
cairo_region_create_rectangles, cairo_region_create_rectangles () +
+
cairo_region_destroy, cairo_region_destroy () +
+
cairo_region_equal, cairo_region_equal () +
+
cairo_region_get_extents, cairo_region_get_extents () +
+
cairo_region_get_rectangle, cairo_region_get_rectangle () +
+
cairo_region_intersect, cairo_region_intersect () +
+
cairo_region_intersect_rectangle, cairo_region_intersect_rectangle () +
+
cairo_region_is_empty, cairo_region_is_empty () +
+
cairo_region_num_rectangles, cairo_region_num_rectangles () +
+
cairo_region_overlap_t, enum cairo_region_overlap_t +
+
cairo_region_reference, cairo_region_reference () +
+
cairo_region_status, cairo_region_status () +
+
cairo_region_subtract, cairo_region_subtract () +
+
cairo_region_subtract_rectangle, cairo_region_subtract_rectangle () +
+
cairo_region_t, cairo_region_t +
+
cairo_region_translate, cairo_region_translate () +
+
cairo_region_union, cairo_region_union () +
+
cairo_region_union_rectangle, cairo_region_union_rectangle () +
+
cairo_region_xor, cairo_region_xor () +
+
cairo_region_xor_rectangle, cairo_region_xor_rectangle () +
+
cairo_rel_curve_to, cairo_rel_curve_to () +
+
cairo_rel_line_to, cairo_rel_line_to () +
+
cairo_rel_move_to, cairo_rel_move_to () +
+
cairo_reset_clip, cairo_reset_clip () +
+
cairo_restore, cairo_restore () +
+
cairo_rotate, cairo_rotate () +
+
+
+
+

S

+
+
cairo_save, cairo_save () +
+
cairo_scale, cairo_scale () +
+
cairo_scaled_font_create, cairo_scaled_font_create () +
+
cairo_scaled_font_destroy, cairo_scaled_font_destroy () +
+
cairo_scaled_font_extents, cairo_scaled_font_extents () +
+
cairo_scaled_font_get_ctm, cairo_scaled_font_get_ctm () +
+
cairo_scaled_font_get_font_face, cairo_scaled_font_get_font_face () +
+
cairo_scaled_font_get_font_matrix, cairo_scaled_font_get_font_matrix () +
+
cairo_scaled_font_get_font_options, cairo_scaled_font_get_font_options () +
+
cairo_scaled_font_get_reference_count, cairo_scaled_font_get_reference_count () +
+
cairo_scaled_font_get_scale_matrix, cairo_scaled_font_get_scale_matrix () +
+
cairo_scaled_font_get_type, cairo_scaled_font_get_type () +
+
cairo_scaled_font_get_user_data, cairo_scaled_font_get_user_data () +
+
cairo_scaled_font_glyph_extents, cairo_scaled_font_glyph_extents () +
+
cairo_scaled_font_reference, cairo_scaled_font_reference () +
+
cairo_scaled_font_set_user_data, cairo_scaled_font_set_user_data () +
+
cairo_scaled_font_status, cairo_scaled_font_status () +
+
cairo_scaled_font_t, cairo_scaled_font_t +
+
cairo_scaled_font_text_extents, cairo_scaled_font_text_extents () +
+
cairo_scaled_font_text_to_glyphs, cairo_scaled_font_text_to_glyphs () +
+
cairo_script_create, cairo_script_create () +
+
cairo_script_create_for_stream, cairo_script_create_for_stream () +
+
cairo_script_from_recording_surface, cairo_script_from_recording_surface () +
+
cairo_script_get_mode, cairo_script_get_mode () +
+
cairo_script_mode_t, enum cairo_script_mode_t +
+
cairo_script_set_mode, cairo_script_set_mode () +
+
cairo_script_surface_create, cairo_script_surface_create () +
+
cairo_script_surface_create_for_target, cairo_script_surface_create_for_target () +
+
cairo_script_write_comment, cairo_script_write_comment () +
+
cairo_select_font_face, cairo_select_font_face () +
+
cairo_set_antialias, cairo_set_antialias () +
+
cairo_set_dash, cairo_set_dash () +
+
cairo_set_fill_rule, cairo_set_fill_rule () +
+
cairo_set_font_face, cairo_set_font_face () +
+
cairo_set_font_matrix, cairo_set_font_matrix () +
+
cairo_set_font_options, cairo_set_font_options () +
+
cairo_set_font_size, cairo_set_font_size () +
+
cairo_set_line_cap, cairo_set_line_cap () +
+
cairo_set_line_join, cairo_set_line_join () +
+
cairo_set_line_width, cairo_set_line_width () +
+
cairo_set_matrix, cairo_set_matrix () +
+
cairo_set_miter_limit, cairo_set_miter_limit () +
+
cairo_set_operator, cairo_set_operator () +
+
cairo_set_scaled_font, cairo_set_scaled_font () +
+
cairo_set_source, cairo_set_source () +
+
cairo_set_source_rgb, cairo_set_source_rgb () +
+
cairo_set_source_rgba, cairo_set_source_rgba () +
+
cairo_set_source_surface, cairo_set_source_surface () +
+
cairo_set_tolerance, cairo_set_tolerance () +
+
cairo_set_user_data, cairo_set_user_data () +
+
cairo_show_glyphs, cairo_show_glyphs () +
+
cairo_show_page, cairo_show_page () +
+
cairo_show_text, cairo_show_text () +
+
cairo_show_text_glyphs, cairo_show_text_glyphs () +
+
cairo_status, cairo_status () +
+
cairo_status_t, enum cairo_status_t +
+
cairo_status_to_string, cairo_status_to_string () +
+
cairo_stroke, cairo_stroke () +
+
cairo_stroke_extents, cairo_stroke_extents () +
+
cairo_stroke_preserve, cairo_stroke_preserve () +
+
cairo_subpixel_order_t, enum cairo_subpixel_order_t +
+
cairo_surface_copy_page, cairo_surface_copy_page () +
+
cairo_surface_create_for_rectangle, cairo_surface_create_for_rectangle () +
+
cairo_surface_create_similar, cairo_surface_create_similar () +
+
cairo_surface_create_similar_image, cairo_surface_create_similar_image () +
+
cairo_surface_destroy, cairo_surface_destroy () +
+
cairo_surface_finish, cairo_surface_finish () +
+
cairo_surface_flush, cairo_surface_flush () +
+
cairo_surface_get_content, cairo_surface_get_content () +
+
cairo_surface_get_device, cairo_surface_get_device () +
+
cairo_surface_get_device_offset, cairo_surface_get_device_offset () +
+
cairo_surface_get_device_scale, cairo_surface_get_device_scale () +
+
cairo_surface_get_fallback_resolution, cairo_surface_get_fallback_resolution () +
+
cairo_surface_get_font_options, cairo_surface_get_font_options () +
+
cairo_surface_get_mime_data, cairo_surface_get_mime_data () +
+
cairo_surface_get_reference_count, cairo_surface_get_reference_count () +
+
cairo_surface_get_type, cairo_surface_get_type () +
+
cairo_surface_get_user_data, cairo_surface_get_user_data () +
+
cairo_surface_has_show_text_glyphs, cairo_surface_has_show_text_glyphs () +
+
cairo_surface_map_to_image, cairo_surface_map_to_image () +
+
cairo_surface_mark_dirty, cairo_surface_mark_dirty () +
+
cairo_surface_mark_dirty_rectangle, cairo_surface_mark_dirty_rectangle () +
+
cairo_surface_reference, cairo_surface_reference () +
+
cairo_surface_set_device_offset, cairo_surface_set_device_offset () +
+
cairo_surface_set_device_scale, cairo_surface_set_device_scale () +
+
cairo_surface_set_fallback_resolution, cairo_surface_set_fallback_resolution () +
+
cairo_surface_set_mime_data, cairo_surface_set_mime_data () +
+
cairo_surface_set_user_data, cairo_surface_set_user_data () +
+
cairo_surface_show_page, cairo_surface_show_page () +
+
cairo_surface_status, cairo_surface_status () +
+
cairo_surface_supports_mime_type, cairo_surface_supports_mime_type () +
+
cairo_surface_t, cairo_surface_t +
+
cairo_surface_type_t, enum cairo_surface_type_t +
+
cairo_surface_unmap_image, cairo_surface_unmap_image () +
+
cairo_surface_write_to_png, cairo_surface_write_to_png () +
+
cairo_surface_write_to_png_stream, cairo_surface_write_to_png_stream () +
+
cairo_svg_get_versions, cairo_svg_get_versions () +
+
cairo_svg_surface_create, cairo_svg_surface_create () +
+
cairo_svg_surface_create_for_stream, cairo_svg_surface_create_for_stream () +
+
cairo_svg_surface_restrict_to_version, cairo_svg_surface_restrict_to_version () +
+
cairo_svg_version_t, enum cairo_svg_version_t +
+
cairo_svg_version_to_string, cairo_svg_version_to_string () +
+
+
+
+

T

+
+
cairo_t, cairo_t +
+
cairo_text_cluster_allocate, cairo_text_cluster_allocate () +
+
cairo_text_cluster_flags_t, enum cairo_text_cluster_flags_t +
+
cairo_text_cluster_free, cairo_text_cluster_free () +
+
cairo_text_cluster_t, cairo_text_cluster_t +
+
cairo_text_extents, cairo_text_extents () +
+
cairo_text_extents_t, cairo_text_extents_t +
+
cairo_text_path, cairo_text_path () +
+
cairo_toy_font_face_create, cairo_toy_font_face_create () +
+
cairo_toy_font_face_get_family, cairo_toy_font_face_get_family () +
+
cairo_toy_font_face_get_slant, cairo_toy_font_face_get_slant () +
+
cairo_toy_font_face_get_weight, cairo_toy_font_face_get_weight () +
+
cairo_transform, cairo_transform () +
+
cairo_translate, cairo_translate () +
+
+
+
+

U

+
+
cairo_user_data_key_t, cairo_user_data_key_t +
+
cairo_user_font_face_create, cairo_user_font_face_create () +
+
cairo_user_font_face_get_init_func, cairo_user_font_face_get_init_func () +
+
cairo_user_font_face_get_render_glyph_func, cairo_user_font_face_get_render_glyph_func () +
+
cairo_user_font_face_get_text_to_glyphs_func, cairo_user_font_face_get_text_to_glyphs_func () +
+
cairo_user_font_face_get_unicode_to_glyph_func, cairo_user_font_face_get_unicode_to_glyph_func () +
+
cairo_user_font_face_set_init_func, cairo_user_font_face_set_init_func () +
+
cairo_user_font_face_set_render_glyph_func, cairo_user_font_face_set_render_glyph_func () +
+
cairo_user_font_face_set_text_to_glyphs_func, cairo_user_font_face_set_text_to_glyphs_func () +
+
cairo_user_font_face_set_unicode_to_glyph_func, cairo_user_font_face_set_unicode_to_glyph_func () +
+
cairo_user_scaled_font_init_func_t, cairo_user_scaled_font_init_func_t () +
+
cairo_user_scaled_font_render_glyph_func_t, cairo_user_scaled_font_render_glyph_func_t () +
+
cairo_user_scaled_font_text_to_glyphs_func_t, cairo_user_scaled_font_text_to_glyphs_func_t () +
+
cairo_user_scaled_font_unicode_to_glyph_func_t, cairo_user_scaled_font_unicode_to_glyph_func_t () +
+
cairo_user_to_device, cairo_user_to_device () +
+
cairo_user_to_device_distance, cairo_user_to_device_distance () +
+
+
+
+

V

+
+
cairo_version, cairo_version () +
+
CAIRO_VERSION, CAIRO_VERSION +
+
CAIRO_VERSION_ENCODE, CAIRO_VERSION_ENCODE() +
+
CAIRO_VERSION_MAJOR, CAIRO_VERSION_MAJOR +
+
CAIRO_VERSION_MICRO, CAIRO_VERSION_MICRO +
+
CAIRO_VERSION_MINOR, CAIRO_VERSION_MINOR +
+
cairo_version_string, cairo_version_string () +
+
CAIRO_VERSION_STRING, CAIRO_VERSION_STRING +
+
CAIRO_VERSION_STRINGIZE, CAIRO_VERSION_STRINGIZE() +
+
+
+
+

W

+
+
cairo_win32_font_face_create_for_hfont, cairo_win32_font_face_create_for_hfont () +
+
cairo_win32_font_face_create_for_logfontw, cairo_win32_font_face_create_for_logfontw () +
+
cairo_win32_font_face_create_for_logfontw_hfont, cairo_win32_font_face_create_for_logfontw_hfont () +
+
cairo_win32_printing_surface_create, cairo_win32_printing_surface_create () +
+
cairo_win32_scaled_font_done_font, cairo_win32_scaled_font_done_font () +
+
cairo_win32_scaled_font_get_device_to_logical, cairo_win32_scaled_font_get_device_to_logical () +
+
cairo_win32_scaled_font_get_logical_to_device, cairo_win32_scaled_font_get_logical_to_device () +
+
cairo_win32_scaled_font_get_metrics_factor, cairo_win32_scaled_font_get_metrics_factor () +
+
cairo_win32_scaled_font_select_font, cairo_win32_scaled_font_select_font () +
+
cairo_win32_surface_create, cairo_win32_surface_create () +
+
cairo_win32_surface_create_with_ddb, cairo_win32_surface_create_with_ddb () +
+
cairo_win32_surface_create_with_dib, cairo_win32_surface_create_with_dib () +
+
cairo_win32_surface_get_dc, cairo_win32_surface_get_dc () +
+
cairo_win32_surface_get_image, cairo_win32_surface_get_image () +
+
cairo_write_func_t, cairo_write_func_t () +
+
+
+
+

X

+
+
cairo_xcb_device_debug_cap_xrender_version, cairo_xcb_device_debug_cap_xrender_version () +
+
cairo_xcb_device_debug_cap_xshm_version, cairo_xcb_device_debug_cap_xshm_version () +
+
cairo_xcb_device_debug_get_precision, cairo_xcb_device_debug_get_precision () +
+
cairo_xcb_device_debug_set_precision, cairo_xcb_device_debug_set_precision () +
+
cairo_xcb_device_get_connection, cairo_xcb_device_get_connection () +
+
cairo_xcb_surface_create, cairo_xcb_surface_create () +
+
cairo_xcb_surface_create_for_bitmap, cairo_xcb_surface_create_for_bitmap () +
+
cairo_xcb_surface_create_with_xrender_format, cairo_xcb_surface_create_with_xrender_format () +
+
cairo_xcb_surface_set_drawable, cairo_xcb_surface_set_drawable () +
+
cairo_xcb_surface_set_size, cairo_xcb_surface_set_size () +
+
cairo_xlib_device_debug_cap_xrender_version, cairo_xlib_device_debug_cap_xrender_version () +
+
cairo_xlib_device_debug_get_precision, cairo_xlib_device_debug_get_precision () +
+
cairo_xlib_device_debug_set_precision, cairo_xlib_device_debug_set_precision () +
+
cairo_xlib_surface_create, cairo_xlib_surface_create () +
+
cairo_xlib_surface_create_for_bitmap, cairo_xlib_surface_create_for_bitmap () +
+
cairo_xlib_surface_create_with_xrender_format, cairo_xlib_surface_create_with_xrender_format () +
+
cairo_xlib_surface_get_depth, cairo_xlib_surface_get_depth () +
+
cairo_xlib_surface_get_display, cairo_xlib_surface_get_display () +
+
cairo_xlib_surface_get_drawable, cairo_xlib_surface_get_drawable () +
+
cairo_xlib_surface_get_height, cairo_xlib_surface_get_height () +
+
cairo_xlib_surface_get_screen, cairo_xlib_surface_get_screen () +
+
cairo_xlib_surface_get_visual, cairo_xlib_surface_get_visual () +
+
cairo_xlib_surface_get_width, cairo_xlib_surface_get_width () +
+
cairo_xlib_surface_get_xrender_format, cairo_xlib_surface_get_xrender_format () +
+
cairo_xlib_surface_set_drawable, cairo_xlib_surface_set_drawable () +
+
cairo_xlib_surface_set_size, cairo_xlib_surface_set_size () +
+
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index.html b/doc/public/html/index.html new file mode 100644 index 000000000..01d438c00 --- /dev/null +++ b/doc/public/html/index.html @@ -0,0 +1,157 @@ + + + + +Cairo: A Vector Graphics Library: Cairo: A Vector Graphics Library + + + + + + + +
+
+
+
+

for Cairo 1.14.2 +

+
+
+
+
+
Drawing
+
+
+cairo_t — The cairo drawing context +
+
+Paths — Creating paths and manipulating path data +
+
+cairo_pattern_t — Sources for drawing +
+
+Regions — Representing a pixel-aligned area +
+
+Transformations — Manipulating the current transformation matrix +
+
+text — Rendering text and glyphs +
+
+Raster Sources — Supplying arbitrary image data +
+
+
Fonts
+
+
+cairo_font_face_t — Base class for font faces +
+
+cairo_scaled_font_t — Font face at particular size and options +
+
+cairo_font_options_t — How a font should be rendered +
+
+FreeType Fonts — Font support for FreeType +
+
+Win32 Fonts — Font support for Microsoft Windows +
+
+Quartz (CGFont) Fonts — Font support via CGFont on OS X +
+
+User Fonts — Font support with font data provided by the user +
+
+
Surfaces
+
+
+cairo_device_t — interface to underlying rendering system +
+
+cairo_surface_t — Base class for surfaces +
+
+Image Surfaces — Rendering to memory buffers +
+
+PDF Surfaces — Rendering PDF documents +
+
+PNG Support — Reading and writing PNG images +
+
+PostScript Surfaces — Rendering PostScript documents +
+
+Recording Surfaces — Records all drawing operations +
+
+Win32 Surfaces — Microsoft Windows surface support +
+
+SVG Surfaces — Rendering SVG documents +
+
+Quartz Surfaces — Rendering to Quartz surfaces +
+
+XCB Surfaces — X Window System rendering using the XCB library +
+
+XLib Surfaces — X Window System rendering using XLib +
+
+XLib-XRender Backend — X Window System rendering using XLib and the X Render extension +
+
+Script Surfaces — Rendering to replayable scripts +
+
+
Utilities
+
+
+cairo_matrix_t — Generic matrix operations +
+
+Error handling — Decoding cairo's status +
+
+Version Information — Compile-time and run-time version checks. +
+
+Types — Generic data types +
+
+
Index
+
Index of new symbols in 1.2
+
Index of new symbols in 1.4
+
Index of new symbols in 1.6
+
Index of new symbols in 1.8
+
Index of new symbols in 1.10
+
Index of new symbols in 1.12
+
A. Creating a language binding for cairo
+
+
General considerations
+
Memory management
+
Multiple return values
+
Overloading and optional arguments
+
Streams and File I/O
+
Error handling
+
Patterns
+
Surfaces
+
Fonts
+
cairo_path_t
+
+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/index.sgml b/doc/public/html/index.sgml new file mode 100644 index 000000000..d117fc1ba --- /dev/null +++ b/doc/public/html/index.sgml @@ -0,0 +1,742 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/html/language-bindings.html b/doc/public/html/language-bindings.html new file mode 100644 index 000000000..f3623e822 --- /dev/null +++ b/doc/public/html/language-bindings.html @@ -0,0 +1,73 @@ + + + + +Cairo: A Vector Graphics Library: Appendix A. Creating a language binding for cairo + + + + + + + + + + + + + + + + +
+

+Appendix A. Creating a language binding for cairo

+

+ While cairo is implemented and C, and has a C API, it is expected + that many users of cairo will be using it from languages other + than C. The glue that connects the core cairo library to another + language is known as a language + binding. This appendix attempts to collect together + issues that come up when creating a language bindings for cairo + and present standardized solutions to promote consistency among + the different language bindings. +

+
+

+General considerations

+

+ The naming of the central cairo_t type is a + special exception. The object is “a cairo context†not “a + cairoâ€, and names such as cairo_t rather than + cairo_context_t and + cairo_set_source() rather than + cairo_context_set_source() are simply + abbreviations to make the C API more palatable. In languages + which have object-oriented syntax, this abbreviation is much + less useful. In fact, if ‘Cairo’ is used as a namespace, then + in many languages, you'd end up with a ridiculous type name + like ‘Cairo.Cairo’. For this reason, and for inter-language + consistency all object-oriented languages should name this + type as if it were cairo_context_t. +

+

+ The punctuation and casing of the type names and + method names of cairo should be changed to match the general + convention of the language. In Java, where type names are written + in StudlyCaps and method names in javaCaps, cairo_font_extents_t + will become FontExtents and + cairo_set_source(cr,source), + cr.setSource(source). + As compared to changing the punctuation, and casing, much + more reluctance should be used in changing the method names + themselves. Even if get is usually omitted from getters in + your language, you shouldn't bind cairo_get_source() as + cr.source(). +

+
+
+ + + \ No newline at end of file diff --git a/doc/public/html/left-insensitive.png b/doc/public/html/left-insensitive.png new file mode 100644 index 000000000..9b8005bf0 Binary files /dev/null and b/doc/public/html/left-insensitive.png differ diff --git a/doc/public/html/left.png b/doc/public/html/left.png new file mode 100644 index 000000000..c518641ea Binary files /dev/null and b/doc/public/html/left.png differ diff --git a/doc/public/html/right-insensitive.png b/doc/public/html/right-insensitive.png new file mode 100644 index 000000000..f999f0018 Binary files /dev/null and b/doc/public/html/right-insensitive.png differ diff --git a/doc/public/html/right.png b/doc/public/html/right.png new file mode 100644 index 000000000..78f5875ae Binary files /dev/null and b/doc/public/html/right.png differ diff --git a/doc/public/html/style.css b/doc/public/html/style.css new file mode 100644 index 000000000..705a5c9ad --- /dev/null +++ b/doc/public/html/style.css @@ -0,0 +1,461 @@ +body +{ + font-family: cantarell, sans-serif; +} +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + background: rgba(238, 238, 236, 0.5); + border: solid 1px rgb(238, 238, 236); + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + /* fallback for no rgba support */ + background: #e6f3ff; + border: solid 1px #729fcf; + background: rgba(114, 159, 207, 0.1); + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +@media screen { + sup a.footnote + { + position: relative; + top: 0em ! important; + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 5em; + padding-bottom: 500px; + max-width: 60em; + } + p + { + max-width: 60em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + background: #e2e2e2; + border-bottom: solid 1px #babdb6; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + z-index: 10; + } + .navigation a, .navigation a:visited + { + /* tango:sky blue 3 */ + color: #204a87; + } + .navigation a:hover + { + /* tango:sky blue 2 */ + color: #3465a4; + } + td.shortcuts + { + /* tango:sky blue 2 */ + color: #3465a4; + font-size: 80%; + white-space: nowrap; + } + td.shortcuts .dim + { + color: #babdb6; + } +} +@media screen and (min-width: 60em) { + /* screen larger than 60em */ + body { margin: auto; } +} +@media screen and (max-width: 60em) { + /* screen less than 60em */ + #nav_hierarchy { display: none; } + #nav_interfaces { display: none; } + #nav_prerequisites { display: none; } + #nav_derived_interfaces { display: none; } + #nav_implementations { display: none; } + #nav_child_properties { display: none; } + #nav_style_properties { display: none; } + #nav_index { display: none; } + #nav_glossary { display: none; } + .gallery_image { display: none; } + .property_flags { display: none; } + .signal_flags { display: none; } + .parameter_annotations { display: none; } + .enum_member_annotations { display: none; } + .struct_member_annotations { display: none; } + .union_member_annotations { display: none; } + /* now that a column is hidden, optimize space */ + col.parameters_name { width: auto; } + col.parameters_description { width: auto; } + col.struct_members_name { width: auto; } + col.struct_members_description { width: auto; } + col.enum_members_name { width: auto; } + col.enum_members_description { width: auto; } + col.union_members_name { width: auto; } + col.union_members_description { width: auto; } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + background: #e2e2e2; + border: solid 1px #babdb6; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + +.navigation .title +{ + font-size: 120%; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.informaltable table +{ + border-collapse: separate; + border-spacing: 20px 3px; + border: none; +} + +div.informaltable table td, div.informaltable table th +{ + vertical-align: top; +} + +.function_type, +.variable_type, +.property_type, +.signal_type, +.parameter_name, +.struct_member_name, +.union_member_name, +.define_keyword, +.datatype_keyword, +.typedef_keyword +{ + text-align: right; +} + +/* dim non-primary columns */ +.c_punctuation, +.function_type, +.variable_type, +.property_type, +.signal_type, +.define_keyword, +.datatype_keyword, +.typedef_keyword, +.property_flags, +.signal_flags, +.parameter_annotations, +.enum_member_annotations, +.struct_member_annotations, +.union_member_annotations +{ + color: #888a85; +} + +.function_type a, +.function_type a:visited, +.function_type a:hover, +.property_type a, +.property_type a:visited, +.property_type a:hover, +.signal_type a, +.signal_type a:visited, +.signal_type a:hover, +.signal_flags a, +.signal_flags a:visited, +.signal_flags a:hover +{ + color: #729fcf; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +h4 +{ + color: #555753; +} + +hr +{ + /* tango:aluminium 1 */ + color: #d3d7cf; + background: #d3d7cf; + border: none 0px; + height: 1px; + clear: both; + margin: 2.0em 0em 2.0em 0em; +} + +dl.toc dt +{ + padding-bottom: 0.25em; +} + +dl.toc > dd > dl > dt +{ + padding-top: 0.25em; + padding-bottom: 0.25em; +} + +dl.toc > dt +{ + padding-top: 1em; + padding-bottom: 0.5em; + font-weight: bold; +} + +.parameter +{ + font-style: normal; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.informalfigure, +.figure +{ + margin: 1em; +} + +.informalexample, +.example +{ + margin-top: 1em; + margin-bottom: 1em; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + background: rgba(252, 175, 62, 0.1); + border-color: #ffb04f; + border-color: rgba(252, 175, 62, 0.2); +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + background: rgba(138, 226, 52, 0.1); + border-color: #abf562; + border-color: rgba(138, 226, 52, 0.2); +} +div.blockquote +{ + border-color: #eeeeec; +} +.note, .warning, div.blockquote +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; + margin: 2em; +} +.note p, .warning p +{ + margin: 0; +} + +div.warning h3.title, +div.note h3.title +{ + display: none; +} + +p + div.section +{ + margin-top: 1em; +} + +div.refnamediv, +div.refsynopsisdiv, +div.refsect1, +div.refsect2, +div.toc, +div.section +{ + margin-bottom: 1em; +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.lineart +{ + color: #d3d7cf; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-weight: normal; +} + +.structfield +{ + font-style: normal; + font-weight: normal; +} + +/* code listings */ + +.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.listing_code .programlisting .function { color: #000000; font-weight: bold; } +.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .normal { color: #000000; } +.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.listing_code .programlisting .type { color: #000000; } +.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + border: solid 1px rgba(114, 159, 207, 0.2); + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* this just adds visual clutter and + takes precious room from small screens */ + display: none; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + background: rgba(114, 159, 207, 0.2); + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; + background: rgba(114, 159, 207, 0.1); +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; + background: none; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + diff --git a/doc/public/html/up-insensitive.png b/doc/public/html/up-insensitive.png new file mode 100644 index 000000000..bda3ce2d9 Binary files /dev/null and b/doc/public/html/up-insensitive.png differ diff --git a/doc/public/html/up.png b/doc/public/html/up.png new file mode 100644 index 000000000..af46b2ada Binary files /dev/null and b/doc/public/html/up.png differ diff --git a/doc/public/language-bindings.xml b/doc/public/language-bindings.xml new file mode 100644 index 000000000..ce437ef53 --- /dev/null +++ b/doc/public/language-bindings.xml @@ -0,0 +1,745 @@ + + Creating a language binding for cairo + + While cairo is implemented and C, and has a C API, it is expected + that many users of cairo will be using it from languages other + than C. The glue that connects the core cairo library to another + language is known as a language + binding. This appendix attempts to collect together + issues that come up when creating a language bindings for cairo + and present standardized solutions to promote consistency among + the different language bindings. + + + General considerations + + The naming of the central cairo_t type is a + special exception. The object is “a cairo context†not “a + cairoâ€, and names such as cairo_t rather than + cairo_context_t and + cairo_set_source() rather than + cairo_context_set_source() are simply + abbreviations to make the C API more palatable. In languages + which have object-oriented syntax, this abbreviation is much + less useful. In fact, if ‘Cairo’ is used as a namespace, then + in many languages, you'd end up with a ridiculous type name + like ‘Cairo.Cairo’. For this reason, and for inter-language + consistency all object-oriented languages should name this + type as if it were cairo_context_t. + + + The punctuation and casing of the type names and + method names of cairo should be changed to match the general + convention of the language. In Java, where type names are written + in StudlyCaps and method names in javaCaps, cairo_font_extents_t + will become FontExtents and + cairo_set_source(cr,source), + cr.setSource(source). + As compared to changing the punctuation, and casing, much + more reluctance should be used in changing the method names + themselves. Even if get is usually omitted from getters in + your language, you shouldn't bind cairo_get_source() as + cr.source(). + + + + Memory management + + The objects in cairo can roughly be divided into two types: + reference-counted, opaque types like + cairo_surface_t + and plain structures like + cairo_glyph_t. + cairo_path_t + and + cairo_path_data_t + are special cases and are treated separately in this appendix. + + + Refcounted opaque types all have a + ..._reference() + function to increase the refcount by one and a + ..._destroy() to decrease the refcount + by one. These should not be exposed to the user of the language + binding, but rather used to implement memory management within + the language binding. The simplest way to do memory management + for a language binding is to treat the language binding object + as a simple handle to the cairo object. The language binding + object references the cairo object, and unreferences it when + finalized. This is the recommended method, though there are + a couple of caveats to be noted: + + + + + Equality won't work as expected. You can have two language + objects for the same cairo and they won't necessarily + compare equal. If the language allows customizing the + equality operation, then this is fixable by comparing + the underlying pointers. It also can be fixed by creating + at most one language object per cairo object, and + uniquifying via a pin table (a hash + table that goes from cairo object to language object). + For cairo_surface_t you can use also + cairo_surface_set_user_data() + instead of a separate pin table. + + + + + Derivation from the language object doesn't work because + you can lose the language object while keeping the Cairo + object. Code like: + + +public class MySurface (ImageSurface) { + public MySurface (width, height) { + super (Format.ARGB32, width, height); + } + public int get42 () { + return 42; + } +} + + cr = Cairo(MySurface(width, height)); + surface = cr.getTarget(); + + + Can result in surface containing an + ImageSurface not a MySurface. + This is not easily fixable without creating memory leaks, + and it's probably best to simply forbid deriving from the + language objects. + + + + + When a plain structure is used as a return value from cairo, + this is done by passing it as a “out parameterâ€. + + +cairo_font_extents_t extents; + +cairo_font_extents (cr, &extents); + + In a language binding, this should typically be treated + as a return value: + + +FontExtents extents = cr.fontExtents (); + + A language binding has a choice in how it implements the + language objects for plain structures. It can use a pure + language object with fields corresponding to those of the C + structure, and convert from and to the C structure when calling + cairo functions or converting cairo return values. Or it + can keep a pointer to the C structure internally and wrap + it inside a language object much like occurs for refcounted + objects. The choice should be invisible to the user: they should + be able to imagine that it is implemented as a pure language + object. + + + + Multiple return values + + There are a number of functions in the cairo API that have + multiple out parameters or + in-out parameters. In some languages + these can be translated into multiple return values. In Python, + what is: + + +cairo_user_to_device (cr, &x, &y); + + can by mapped to: + + +(x, y) = cr.user_to_device (cr, x, y); + + but many languages don't have provisions for multiple return + values, so it is necessary to introduce auxiliary types. + Most of the functions that require the auxiliary types + require a type that would, in C, look like + + +typedef struct _cairo_point cairo_point_t; +struct _cairo_point { + double x; + double y; +} + + The same type should be used both for functions that use a pair + of coordinates as an absolute position, and functions that use + a pair of coordinates as a displacement. While an argument could + be made that having a separate “distance†type is more correct, + it is more likely just to confuse users. + + +void +cairo_user_to_device (cairo_t *cr, double *x, double *y); + +void +cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy); + +void +cairo_device_to_user (cairo_t *cr, double *x, double *y); + +void +cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy); + +void +cairo_matrix_transform_distance (cairo_matrix_t *matrix, double *dx, double *dy); + +void +cairo_matrix_transform_point (cairo_matrix_t *matrix, double *x, double *y); + +void +cairo_get_current_point (cairo_t *cr, double *x, double *y); + + + There are also a couple of functions that return four values + representing a rectangle. These should be mapped to a + “rectangle†type that looks like: + + +typedef struct _cairo_rectangle cairo_rectangle_t; +struct _cairo_rectangle { + double x; + double y; + double width; + double height; +} + + The C function returns the rectangle as a set of two points to + facilitate rounding to integral extents, but this isn't worth + adding a “box†type to go along with the more obvious + “rectangle†representation. + + + Q: Would it make sense here to define a standard + cairo_rectangle_round() method + that language bindings should map? + + +void +cairo_stroke_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +void +cairo_fill_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + + + + Overloading and optional arguments + + Function overloading (having a several variants of a function + with the same name and different arguments) is a language + feature available in many languages but not in C. + + + In general, language binding authors should use restraint in + combining functions in the cairo API via function + overloading. What may seem like an obvious overload now may + turn out to be strange with future additions to cairo. + It might seem logical to make + cairo_set_source_rgb() + an overload of cairo_set_source(), but future plans to add + cairo_set_source_rgb_premultiplied(), + which will also take three doubles make this a bad idea. For + this reason, only the following pairs of functions should + be combined via overloading + + +void +cairo_set_source (cairo_t *cr, cairo_pattern_t *source); + +void +cairo_set_source_surface (cairo_t *cr, + cairo_surface_t *source, + double surface_x, + double surface_y); + +void +cairo_mask (cairo_t *cr, + cairo_pattern_t *pattern); + +void +cairo_mask_surface (cairo_t *cr, + cairo_surface_t *surface, + double surface_x, + double surface_y); + +cairo_surface_t * +cairo_image_surface_create (cairo_format_t format, + int width, + int height); +cairo_surface_t * +cairo_image_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride); + +cairo_status_t +cairo_surface_write_to_png (cairo_surface_t *surface, + const char *filename); + +cairo_status_t +cairo_surface_write_to_png_stream (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure); + +cairo_surface_t * +cairo_image_surface_create_from_png (const char *filename); + +cairo_surface_t * +cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, + void *closure); + + + Note that there are cases where all constructors for a type + aren't overloaded together. For example + cairo_image_surface_create_from_png() + should not be overloaded together with + cairo_image_surface_create(). + In such cases, the remaining constructors will typically need to + be bound as static methods. In Java, for example, we might have: + + +Surface surface1 = ImageSurface(Format.RGB24, 100, 100); +Surface surface2 = ImageSurface.createFromPNG("camera.png"); + + Some other overloads that add combinations not found in C may be + convenient for users for language bindings that provide + cairo_point_t and cairo_rectangle_t + types, for example: + + +void +cairo_move_to (cairo_t *cr, + cairo_point_t *point); +void +cairo_rectangle (cairo_t *cr, + cairo_rectangle_t *rectangle); + + + + Streams and File I/O + + Various places in the cairo API deal with reading and writing + data, whether from and to files, or to other sources and + destinations. In these cases, what is typically provided in the + C API is a simple version that just takes a filename, and a + complex version that takes a callback function. + An example is the PNG handling functions: + + +cairo_surface_t * +cairo_image_surface_create_from_png (const char *filename); + +cairo_surface_t * +cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, + void *closure); + +cairo_status_t +cairo_surface_write_to_png (cairo_surface_t *surface, + const char *filename); + +cairo_status_t +cairo_surface_write_to_png_stream (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure); + + The expectation is that the filename version will be mapped + literally in the language binding, but the callback version + will be mapped to a version that takes a language stream + object. For example, in Java, the four functions above + might be mapped to: + + +static public ImageSurface createFromPNG (String filename) throws IOException; +static public ImageSurface createFromPNG (InputStream stream) throws IOException; +public void writeToPNG (String filename) throws IOException; +public void writeToPNG (OutputStream stream) throws IOException; + + + In many cases, it will be better to + implement the filename version internally + using the stream version, rather than building it on top of the + filename version in C. The reason for this is that will + naturally give a more standard handling of file errors for + the language, as seen in the above Java example, where + createFromPNG() is marked as raising + an exception. Propagating exceptions from inside the callback + function to the caller will pose a challenge to the language + binding implementor, since an exception must not propagate + through the Cairo code. A technique that will be useful in + some cases is to catch the exception in the callback, + store the exception object inside a structure pointed to by + closure, and then rethrow it once + the function returns. + + + I'm not sure how to handle this for + cairo_pdf_surface_create_for_stream(). + Other than keep a “exception to rethrow†thread-specific + variable + that is checked after every call to a Cairo + function. + + + + Error handling + + The error handling approach in C for Cairo has multiple + elements: + + + + When a method on an object fails, the object is put into + an error state. Subsequent operations on the object do + nothing. The status of the object can be queried with + a function like status(). + + + Constructors, rather than + returning NULL on out-of-memory failure, + return a special singleton object on which all + operations do nothing. Retrieving the status of the + singleton object returns CAIRO_STATUS_NO_MEMORY + + + Is this going to apply to + cairo_surface_t as well? + + + What about cairo_copy_path_data()? It's probably going to + have to return NULL. + + + + Errors propagate from object to object. Setting a pattern + in an out-of-memory state as the source of a + cairo_t puts the type into an error state. + + + Much of the above is not yet implemented at the time of + this writing + + A language binding could copy the C approach, and for a + language without exceptions, this is likely the right thing + to do. However, for a language with exceptions, exposing + a completely different style of error handling for cairo + would be strange. So, instead, status should be checked + after every call to cairo, and exceptions thrown as necessary. + + + One problem that can arise with this, in languages + where handling exceptions is mandatory (like Java), is that almost + every cairo function can result in a status being set, + usually because of an out-of-memory condition. This could make + cairo hard to use. To resolve this problem, let's classify then + cairo status codes: + + +/* Memory */ +CAIRO_STATUS_NO_MEMORY, + +/* Programmer error */ +CAIRO_STATUS_INVALID_RESTORE +CAIRO_STATUS_INVALID_POP_GROUP +CAIRO_STATUS_NO_CURRENT_POINT +CAIRO_STATUS_INVALID_MATRIX +CAIRO_STATUS_NO_TARGET_SURFACE +CAIRO_STATUS_INVALID_STRING +CAIRO_STATUS_SURFACE_FINISHED +CAIRO_STATUS_BAD_NESTING + +/* Language binding implementation */ +CAIRO_STATUS_NULL_POINTER +CAIRO_STATUS_INVALID_PATH_DATA +CAIRO_STATUS_SURFACE_TYPE_MISMATCH + +/* Other */ +CAIRO_STATUS_READ_ERROR +CAIRO_STATUS_WRITE_ERROR + + + If we look at these, the + CAIRO_STATUS_NO_MEMORY + should map to the native out-of-memory exception, which could + happen at any point in any case. Most of the others indicate + programmer error, and handling them in user code would be + silly. These should be mapped into whatever the language uses + for assertion failures, rather than errors that are normally + handled. (In Java, a subclass of Error rather than Exception, + perhaps.) And CAIRO_STATUS_READ_ERROR, + and CAIRO_STATUS_WRITE_ERROR can occur + only in very specific places. (In fact, as described + in , these errors may be + mapped into the language's native I/O error types.) + So, there really aren't exceptions that the programmer must + handle at most points in the Cairo API. + + + + Patterns + + The cairo C API allows for creating a number of different types + of patterns. All of these different types of patterns map to + cairo_pattern_t + in C, but in an object oriented language, there should instead + be a hierarchy of types. (The functions that should map to + constructors or static methods for the various types are listed + after the type, methods on that type are listed below. Note that + cairo_pattern_create_rgb() and cairo_pattern_create_rgba() + should not be overloaded with each other as a SolidPattern() + constructor, but should appear as static methods instead. This + is to maintain code clarity by making it clear how the arguments + relate to color components.) + + +cairo_pattern_t + cairo_pattern_set_matrix() + cairo_pattern_get_matrix() + cairo_solid_pattern_t (cairo_pattern_create_rgb() and cairo_pattern_create_rgba()) + cairo_surface_pattern_t (cairo_pattern_create_for_surface()) + cairo_pattern_set_extend() + cairo_pattern_get_extend() + cairo_pattern_set_filter() + cairo_pattern_get_filter() + cairo_gradient_t + cairo_pattern_add_color_stop_rgb() + cairo_pattern_add_color_stop_rgba() + cairo_linear_gradient_t (cairo_pattern_create_linear()) + cairo_radial_gradient_t (cairo_pattern_create_radial()) + cairo_mesh_t (cairo_pattern_create_mesh()) + cairo_mesh_pattern_begin_patch() + cairo_mesh_pattern_end_patch() + cairo_mesh_pattern_move_to() + cairo_mesh_pattern_line_to() + cairo_mesh_pattern_curve_to() + cairo_mesh_pattern_set_control_point() + cairo_mesh_pattern_set_corner_color_rgb() + cairo_mesh_pattern_set_corner_color_rgba() + cairo_mesh_pattern_get_patch_count() + cairo_mesh_pattern_get_path() + cairo_mesh_pattern_get_control_point() + cairo_mesh_pattern_get_corner_color_rgba() + + + + + + Surfaces + + Like patterns, surfaces, which use only the + cairo_surface_t + type in the C API should be broken up into a hierarchy of types + in a language binding. + + +cairo_surface_t + cairo_image_surface_t + cairo_atsui_surface_t + cairo_win32_surface_t + cairo_xlib_surface_t + cairo_beos_surface_t + + + Unlike patterns, the constructors and methods on these types are + clearly named, and can be trivially associated with the + appropriate subtype. Many language bindings will want to avoid + binding the platform-specific subtypes at all, since the + methods on these types are not useful without passing in native + C types. Unless there is a language binding for Xlib available, + there is no way to represent a XLib Display * in + that language. + + + This doesn't mean that platform-specific surface types can't + be used in a language binding that doesn't bind the constructor. + A very common situation is to use a cairo language binding in + combination with a binding for a higher level system like + the GTK+ widget + toolkit. In such a situation, the higher level toolkit provides + ways to get references to platform specific surfaces. + + + The cairo_surface_set_user_data(), + and cairo_surface_get_user_data() + methods are provided for use in language bindings, and should + not be directly exposed to applications. One example of the use + of these functions in a language binding is creating a binding for: + + +cairo_surface_t * +cairo_image_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride); + + + The memory block passed in for data must be + kept around until the surface is destroyed, so the language + binding must have some way of determining when that happens. The + way to do this is to use the destroy + argument to cairo_surface_set_user_data(). + + + Some languages may not have a suitable “pointer to a block of + data†type to pass in for data. And even + where a language does have such a type, the user will be + frequently able to cause the backing store to be reallocated + to a different location or truncated. Should we recommend a + standard type name and binding for a buffer object here? + + + + Fonts + + Fonts are once more an area where there is a hierarchy of types: + + +cairo_font_face_t + cairo_ft_font_face_t + cairo_win32_font_face_t +cairo_scaled_font_t + cairo_ft_scaled_font_t + cairo_win32_scaled_font_t + + + The methods on the subtypes are, however, not useful without + bindings for fontconfig and FreeType or for the Win32 GDI, + so most language bindings will choose not to bind these + types. + + + The cairo_font_face_set_user_data(), + and cairo_font_face_get_user_data() + methods are provided for use in language bindings, and should + not be directly exposed to applications. + + + + cairo_path_t + + The cairo_path_t type is one + area in which most language bindings will differ significantly + from the C API. The C API for cairo_path_t is + designed for efficiency and to avoid auxiliary objects that + would be have to be manually memory managed by the + application. However, + a language binding should not present cairo_path_t as an + array, but rather as an opaque that can be iterated + over. Different languages have quite different conventions for + how iterators work, so it is impossible to give an exact + specification for how this API should work, but the type names + and methods should be similar to the language's mapping of the following: + + +typedef struct cairo_path_iterator cairo_path_iterator_t; +typedef struct cairo_path_element cairo_path_element_t; + +cairo_path_iterator_t * +cairo_path_get_iterator (cairo_path_t *path); + +cairo_bool_t +cairo_path_iterator_has_next (cairo_path_iterator_t *iterator); + +cairo_path_element_t * +cairo_path_iterator_next (cairo_path_iterator_t *iterator); + +cairo_path_element_type_t +cairo_path_element_get_type (cairo_path_element_t *element); + +void +cairo_path_element_get_point (cairo_path_element_t *element, + int index, + double *x, + double *y); + + + The above is written using the Java conventions for + iterators. To illustrate how the API for PathIterator might + depend on the native iteration conventions of the API, examine + three versions of the loop, first written in a hypothetical Java + binding: + + +PathIterator iter = cr.copyPath().iterator(); +while (cr.hasNext()) { + PathElement element = iter.next(); + if (element.getType() == PathElementType.MOVE_TO) { + Point p = element.getPoint(0); + doMoveTo (p.x, p.y); + } +} + + And then in a hypothetical C++ binding: + + +Path path = cr.copyPath(); +for (PathIterator iter = path.begin(); iter != path.end(); iter++) { + PathElement element = *iter; + if (element.getType() == PathElementType.MOVE_TO) { + Point p = element.getPoint(0); + doMoveTo (p.x, p.y); + } +} + + And then finally in a Python binding: + + +for element in cr.copy_path(): + if element.getType == cairo.PATH_ELEMENT_MOVE_TO: + (x, y) = element.getPoint(0) + doMoveTo (x, y); + + While many of the API elements stay the same in the three + examples, the exact iteration mechanism is quite different, to + match how users of the language would expect to iterate over + a container. + + + You should not present an API for mutating or for creating new + cairo_path_t objects. In the future, these + guidelines may be extended to present an API for creating a + cairo_path_t from scratch for use with + cairo_append_path() + but the current expectation is that cairo_append_path() will + mostly be used with paths from + cairo_copy_path(). + + + + diff --git a/doc/public/tmpl/cairo-device.sgml b/doc/public/tmpl/cairo-device.sgml new file mode 100644 index 000000000..e008a56c0 --- /dev/null +++ b/doc/public/tmpl/cairo-device.sgml @@ -0,0 +1,209 @@ + +cairo-device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@device: +@Returns: + + + + + + + +@device: + + + + + + + +@device: +@Returns: + + + + + + + +@device: + + + + + + + +@device: + + + + + + + +@CAIRO_DEVICE_TYPE_DRM: +@CAIRO_DEVICE_TYPE_GL: +@CAIRO_DEVICE_TYPE_SCRIPT: +@CAIRO_DEVICE_TYPE_XCB: +@CAIRO_DEVICE_TYPE_XLIB: +@CAIRO_DEVICE_TYPE_XML: +@CAIRO_DEVICE_TYPE_COGL: +@CAIRO_DEVICE_TYPE_WIN32: +@CAIRO_DEVICE_TYPE_INVALID: + + + + + + +@device: +@Returns: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@key: +@user_data: +@destroy: +@Returns: + + + + + + + +@device: +@key: +@Returns: + + + + + + + +@device: +@Returns: + + + + + + + +@device: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@write_func: +@closure: +@Returns: + + + + + + + +@device: +@Returns: + + diff --git a/doc/public/tmpl/cairo-font-face.sgml b/doc/public/tmpl/cairo-font-face.sgml new file mode 100644 index 000000000..f7fba4d23 --- /dev/null +++ b/doc/public/tmpl/cairo-font-face.sgml @@ -0,0 +1,107 @@ + +cairo-font-face + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: + + + + + + + +@font_face: +@Returns: + + + + + + + +@CAIRO_FONT_TYPE_TOY: +@CAIRO_FONT_TYPE_FT: +@CAIRO_FONT_TYPE_WIN32: +@CAIRO_FONT_TYPE_QUARTZ: +@CAIRO_FONT_TYPE_USER: + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@key: +@user_data: +@destroy: +@Returns: + + + + + + + +@font_face: +@key: +@Returns: + + diff --git a/doc/public/tmpl/cairo-font-options.sgml b/doc/public/tmpl/cairo-font-options.sgml new file mode 100644 index 000000000..fa9165fee --- /dev/null +++ b/doc/public/tmpl/cairo-font-options.sgml @@ -0,0 +1,196 @@ + +cairo-font-options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@original: +@Returns: + + + + + + + +@options: + + + + + + + +@options: +@Returns: + + + + + + + +@options: +@other: + + + + + + + +@options: +@Returns: + + + + + + + +@options: +@other: +@Returns: + + + + + + + +@options: +@antialias: + + + + + + + +@options: +@Returns: + + + + + + + +@CAIRO_SUBPIXEL_ORDER_DEFAULT: +@CAIRO_SUBPIXEL_ORDER_RGB: +@CAIRO_SUBPIXEL_ORDER_BGR: +@CAIRO_SUBPIXEL_ORDER_VRGB: +@CAIRO_SUBPIXEL_ORDER_VBGR: + + + + + + +@options: +@subpixel_order: + + + + + + + +@options: +@Returns: + + + + + + + +@CAIRO_HINT_STYLE_DEFAULT: +@CAIRO_HINT_STYLE_NONE: +@CAIRO_HINT_STYLE_SLIGHT: +@CAIRO_HINT_STYLE_MEDIUM: +@CAIRO_HINT_STYLE_FULL: + + + + + + +@options: +@hint_style: + + + + + + + +@options: +@Returns: + + + + + + + +@CAIRO_HINT_METRICS_DEFAULT: +@CAIRO_HINT_METRICS_OFF: +@CAIRO_HINT_METRICS_ON: + + + + + + +@options: +@hint_metrics: + + + + + + + +@options: +@Returns: + + diff --git a/doc/public/tmpl/cairo-ft.sgml b/doc/public/tmpl/cairo-ft.sgml new file mode 100644 index 000000000..d2b51c84d --- /dev/null +++ b/doc/public/tmpl/cairo-ft.sgml @@ -0,0 +1,118 @@ + +cairo-ft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@face: +@load_flags: +@Returns: + + + + + + + +@pattern: +@Returns: + + + + + + + +@options: +@pattern: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@scaled_font: + + + + + + + +@CAIRO_FT_SYNTHESIZE_BOLD: +@CAIRO_FT_SYNTHESIZE_OBLIQUE: + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@synth_flags: + + + + + + + +@font_face: +@synth_flags: + + diff --git a/doc/public/tmpl/cairo-image.sgml b/doc/public/tmpl/cairo-image.sgml new file mode 100644 index 000000000..23d8c55e1 --- /dev/null +++ b/doc/public/tmpl/cairo-image.sgml @@ -0,0 +1,123 @@ + +cairo-image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@CAIRO_FORMAT_INVALID: +@CAIRO_FORMAT_ARGB32: +@CAIRO_FORMAT_RGB24: +@CAIRO_FORMAT_A8: +@CAIRO_FORMAT_A1: +@CAIRO_FORMAT_RGB16_565: +@CAIRO_FORMAT_RGB30: + + + + + + +@format: +@width: +@Returns: + + + + + + + +@format: +@width: +@height: +@Returns: + + + + + + + +@data: +@format: +@width: +@height: +@stride: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + diff --git a/doc/public/tmpl/cairo-matrix.sgml b/doc/public/tmpl/cairo-matrix.sgml new file mode 100644 index 000000000..292501e1c --- /dev/null +++ b/doc/public/tmpl/cairo-matrix.sgml @@ -0,0 +1,155 @@ + +cairo-matrix + + + + + + + + + + + + + + + + + + + + + + + + + + + +@xx: +@yx: +@xy: +@yy: +@x0: +@y0: + + + + + + +@matrix: +@xx: +@yx: +@xy: +@yy: +@x0: +@y0: + + + + + + + +@matrix: + + + + + + + +@matrix: +@tx: +@ty: + + + + + + + +@matrix: +@sx: +@sy: + + + + + + + +@matrix: +@radians: + + + + + + + +@matrix: +@tx: +@ty: + + + + + + + +@matrix: +@sx: +@sy: + + + + + + + +@matrix: +@radians: + + + + + + + +@matrix: +@Returns: + + + + + + + +@result: +@a: +@b: + + + + + + + +@matrix: +@dx: +@dy: + + + + + + + +@matrix: +@x: +@y: + + diff --git a/doc/public/tmpl/cairo-paths.sgml b/doc/public/tmpl/cairo-paths.sgml new file mode 100644 index 000000000..9342041a7 --- /dev/null +++ b/doc/public/tmpl/cairo-paths.sgml @@ -0,0 +1,264 @@ + +cairo-paths + + + + + + + + + + + + + + + + + + + + + + + + + + + +@status: +@data: +@num_data: + + + + + + + + + + + + +@CAIRO_PATH_MOVE_TO: +@CAIRO_PATH_LINE_TO: +@CAIRO_PATH_CURVE_TO: +@CAIRO_PATH_CLOSE_PATH: + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@Returns: + + + + + + + +@path: + + + + + + + +@cr: +@path: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@x: +@y: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: +@xc: +@yc: +@radius: +@angle1: +@angle2: + + + + + + + +@cr: +@xc: +@yc: +@radius: +@angle1: +@angle2: + + + + + + + +@cr: +@x1: +@y1: +@x2: +@y2: +@x3: +@y3: + + + + + + + +@cr: +@x: +@y: + + + + + + + +@cr: +@x: +@y: + + + + + + + +@cr: +@x: +@y: +@width: +@height: + + + + + + + +@cr: +@glyphs: +@num_glyphs: + + + + + + + +@cr: +@utf8: + + + + + + + +@cr: +@dx1: +@dy1: +@dx2: +@dy2: +@dx3: +@dy3: + + + + + + + +@cr: +@dx: +@dy: + + + + + + + +@cr: +@dx: +@dy: + + + + + + + +@cr: +@x1: +@y1: +@x2: +@y2: + + diff --git a/doc/public/tmpl/cairo-pattern.sgml b/doc/public/tmpl/cairo-pattern.sgml new file mode 100644 index 000000000..e0c2f3d31 --- /dev/null +++ b/doc/public/tmpl/cairo-pattern.sgml @@ -0,0 +1,486 @@ + +cairo-pattern + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@pattern: +@offset: +@red: +@green: +@blue: + + + + + + + +@pattern: +@offset: +@red: +@green: +@blue: +@alpha: + + + + + + + +@pattern: +@count: +@Returns: + + + + + + + +@pattern: +@index: +@offset: +@red: +@green: +@blue: +@alpha: +@Returns: + + + + + + + +@red: +@green: +@blue: +@Returns: + + + + + + + +@red: +@green: +@blue: +@alpha: +@Returns: + + + + + + + +@pattern: +@red: +@green: +@blue: +@alpha: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@pattern: +@surface: +@Returns: + + + + + + + +@x0: +@y0: +@x1: +@y1: +@Returns: + + + + + + + +@pattern: +@x0: +@y0: +@x1: +@y1: +@Returns: + + + + + + + +@cx0: +@cy0: +@radius0: +@cx1: +@cy1: +@radius1: +@Returns: + + + + + + + +@pattern: +@x0: +@y0: +@r0: +@x1: +@y1: +@r1: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@pattern: + + + + + + + +@pattern: + + + + + + + +@pattern: +@x: +@y: + + + + + + + +@pattern: +@x: +@y: + + + + + + + +@pattern: +@x1: +@y1: +@x2: +@y2: +@x3: +@y3: + + + + + + + +@pattern: +@point_num: +@x: +@y: + + + + + + + +@pattern: +@corner_num: +@red: +@green: +@blue: + + + + + + + +@pattern: +@corner_num: +@red: +@green: +@blue: +@alpha: + + + + + + + +@pattern: +@count: +@Returns: + + + + + + + +@pattern: +@patch_num: +@Returns: + + + + + + + +@pattern: +@patch_num: +@point_num: +@x: +@y: +@Returns: + + + + + + + +@pattern: +@patch_num: +@corner_num: +@red: +@green: +@blue: +@alpha: +@Returns: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: + + + + + + + +@pattern: +@Returns: + + + + + + + +@CAIRO_EXTEND_NONE: +@CAIRO_EXTEND_REPEAT: +@CAIRO_EXTEND_REFLECT: +@CAIRO_EXTEND_PAD: + + + + + + +@pattern: +@extend: + + + + + + + +@pattern: +@Returns: + + + + + + + +@CAIRO_FILTER_FAST: +@CAIRO_FILTER_GOOD: +@CAIRO_FILTER_BEST: +@CAIRO_FILTER_NEAREST: +@CAIRO_FILTER_BILINEAR: +@CAIRO_FILTER_GAUSSIAN: + + + + + + +@pattern: +@filter: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@matrix: + + + + + + + +@pattern: +@matrix: + + + + + + + +@CAIRO_PATTERN_TYPE_SOLID: +@CAIRO_PATTERN_TYPE_SURFACE: +@CAIRO_PATTERN_TYPE_LINEAR: +@CAIRO_PATTERN_TYPE_RADIAL: +@CAIRO_PATTERN_TYPE_MESH: +@CAIRO_PATTERN_TYPE_RASTER_SOURCE: + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@key: +@user_data: +@destroy: +@Returns: + + + + + + + +@pattern: +@key: +@Returns: + + diff --git a/doc/public/tmpl/cairo-pdf.sgml b/doc/public/tmpl/cairo-pdf.sgml new file mode 100644 index 000000000..f665728a9 --- /dev/null +++ b/doc/public/tmpl/cairo-pdf.sgml @@ -0,0 +1,99 @@ + +cairo-pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@width_in_points: +@height_in_points: +@Returns: + + + + + + + +@write_func: +@closure: +@width_in_points: +@height_in_points: +@Returns: + + + + + + + +@surface: +@version: + + + + + + + +@CAIRO_PDF_VERSION_1_4: +@CAIRO_PDF_VERSION_1_5: + + + + + + +@versions: +@num_versions: + + + + + + + +@version: +@Returns: + + + + + + + +@surface: +@width_in_points: +@height_in_points: + + diff --git a/doc/public/tmpl/cairo-png.sgml b/doc/public/tmpl/cairo-png.sgml new file mode 100644 index 000000000..56abbbb32 --- /dev/null +++ b/doc/public/tmpl/cairo-png.sgml @@ -0,0 +1,93 @@ + +cairo-png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@Returns: + + + + + + + +@closure: +@data: +@length: +@Returns: + + + + + + + +@read_func: +@closure: +@Returns: + + + + + + + +@surface: +@filename: +@Returns: + + + + + + + +@closure: +@data: +@length: +@Returns: + + + + + + + +@surface: +@write_func: +@closure: +@Returns: + + diff --git a/doc/public/tmpl/cairo-ps.sgml b/doc/public/tmpl/cairo-ps.sgml new file mode 100644 index 000000000..7f9170d0e --- /dev/null +++ b/doc/public/tmpl/cairo-ps.sgml @@ -0,0 +1,142 @@ + +cairo-ps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@width_in_points: +@height_in_points: +@Returns: + + + + + + + +@write_func: +@closure: +@width_in_points: +@height_in_points: +@Returns: + + + + + + + +@surface: +@level: + + + + + + + +@CAIRO_PS_LEVEL_2: +@CAIRO_PS_LEVEL_3: + + + + + + +@levels: +@num_levels: + + + + + + + +@level: +@Returns: + + + + + + + +@surface: +@eps: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@width_in_points: +@height_in_points: + + + + + + + +@surface: + + + + + + + +@surface: + + + + + + + +@surface: +@comment: + + diff --git a/doc/public/tmpl/cairo-quartz-fonts.sgml b/doc/public/tmpl/cairo-quartz-fonts.sgml new file mode 100644 index 000000000..09f4117a3 --- /dev/null +++ b/doc/public/tmpl/cairo-quartz-fonts.sgml @@ -0,0 +1,49 @@ + +cairo-quartz-fonts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@font: +@Returns: + + + + + + + +@font_id: +@Returns: + + diff --git a/doc/public/tmpl/cairo-quartz.sgml b/doc/public/tmpl/cairo-quartz.sgml new file mode 100644 index 000000000..41b334a7c --- /dev/null +++ b/doc/public/tmpl/cairo-quartz.sgml @@ -0,0 +1,62 @@ + +cairo-quartz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@format: +@width: +@height: +@Returns: + + + + + + + +@cgContext: +@width: +@height: +@Returns: + + + + + + + +@surface: +@Returns: + + diff --git a/doc/public/tmpl/cairo-raster-source.sgml b/doc/public/tmpl/cairo-raster-source.sgml new file mode 100644 index 000000000..1d221efa4 --- /dev/null +++ b/doc/public/tmpl/cairo-raster-source.sgml @@ -0,0 +1,180 @@ + +cairo-raster-source + + + + + + + + + + + + + + + + + + + + + + + + + + + +@user_data: +@content: +@width: +@height: +@Returns: + + + + + + + +@pattern: +@data: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@acquire: +@release: + + + + + + + +@pattern: +@acquire: +@release: + + + + + + + +@pattern: +@snapshot: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@copy: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@finish: + + + + + + + +@pattern: +@Returns: + + + + + + + +@pattern: +@callback_data: +@target: +@extents: +@Returns: + + + + + + + +@pattern: +@callback_data: +@surface: + + + + + + + +@pattern: +@callback_data: +@Returns: + + + + + + + +@pattern: +@callback_data: +@other: +@Returns: + + + + + + + +@pattern: +@callback_data: + + diff --git a/doc/public/tmpl/cairo-recording.sgml b/doc/public/tmpl/cairo-recording.sgml new file mode 100644 index 000000000..4a53ff26f --- /dev/null +++ b/doc/public/tmpl/cairo-recording.sgml @@ -0,0 +1,63 @@ + +cairo-recording + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@content: +@extents: +@Returns: + + + + + + + +@surface: +@x0: +@y0: +@width: +@height: + + + + + + + +@surface: +@extents: +@Returns: + + diff --git a/doc/public/tmpl/cairo-region.sgml b/doc/public/tmpl/cairo-region.sgml new file mode 100644 index 000000000..f8c4d8b96 --- /dev/null +++ b/doc/public/tmpl/cairo-region.sgml @@ -0,0 +1,260 @@ + +cairo-region + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@rectangle: +@Returns: + + + + + + + +@rects: +@count: +@Returns: + + + + + + + +@original: +@Returns: + + + + + + + +@region: +@Returns: + + + + + + + +@region: + + + + + + + +@region: +@Returns: + + + + + + + +@region: +@extents: + + + + + + + +@region: +@Returns: + + + + + + + +@region: +@nth: +@rectangle: + + + + + + + +@region: +@Returns: + + + + + + + +@region: +@x: +@y: +@Returns: + + + + + + + +@CAIRO_REGION_OVERLAP_IN: +@CAIRO_REGION_OVERLAP_OUT: +@CAIRO_REGION_OVERLAP_PART: + + + + + + +@region: +@rectangle: +@Returns: + + + + + + + +@a: +@b: +@Returns: + + + + + + + +@region: +@dx: +@dy: + + + + + + + +@dst: +@other: +@Returns: + + + + + + + +@dst: +@rectangle: +@Returns: + + + + + + + +@dst: +@other: +@Returns: + + + + + + + +@dst: +@rectangle: +@Returns: + + + + + + + +@dst: +@other: +@Returns: + + + + + + + +@dst: +@rectangle: +@Returns: + + + + + + + +@dst: +@other: +@Returns: + + + + + + + +@dst: +@rectangle: +@Returns: + + diff --git a/doc/public/tmpl/cairo-scaled-font.sgml b/doc/public/tmpl/cairo-scaled-font.sgml new file mode 100644 index 000000000..308e3c44a --- /dev/null +++ b/doc/public/tmpl/cairo-scaled-font.sgml @@ -0,0 +1,224 @@ + +cairo-scaled-font + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@font_face: +@font_matrix: +@ctm: +@options: +@Returns: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@scaled_font: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@ascent: +@descent: +@height: +@max_x_advance: +@max_y_advance: + + + + + + +@scaled_font: +@extents: + + + + + + + +@x_bearing: +@y_bearing: +@width: +@height: +@x_advance: +@y_advance: + + + + + + +@scaled_font: +@utf8: +@extents: + + + + + + + +@scaled_font: +@glyphs: +@num_glyphs: +@extents: + + + + + + + +@scaled_font: +@x: +@y: +@utf8: +@utf8_len: +@glyphs: +@num_glyphs: +@clusters: +@num_clusters: +@cluster_flags: +@Returns: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@scaled_font: +@options: + + + + + + + +@scaled_font: +@font_matrix: + + + + + + + +@scaled_font: +@ctm: + + + + + + + +@scaled_font: +@scale_matrix: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@scaled_font: +@key: +@user_data: +@destroy: +@Returns: + + + + + + + +@scaled_font: +@key: +@Returns: + + diff --git a/doc/public/tmpl/cairo-script.sgml b/doc/public/tmpl/cairo-script.sgml new file mode 100644 index 000000000..a16addc00 --- /dev/null +++ b/doc/public/tmpl/cairo-script.sgml @@ -0,0 +1,118 @@ + +cairo-script + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@Returns: + + + + + + + +@write_func: +@closure: +@Returns: + + + + + + + +@script: +@recording_surface: +@Returns: + + + + + + + +@script: +@Returns: + + + + + + + +@CAIRO_SCRIPT_MODE_ASCII: +@CAIRO_SCRIPT_MODE_BINARY: + + + + + + +@script: +@mode: + + + + + + + +@script: +@content: +@width: +@height: +@Returns: + + + + + + + +@script: +@target: +@Returns: + + + + + + + +@script: +@comment: +@len: + + diff --git a/doc/public/tmpl/cairo-skia.sgml b/doc/public/tmpl/cairo-skia.sgml new file mode 100644 index 000000000..c5972dbbe --- /dev/null +++ b/doc/public/tmpl/cairo-skia.sgml @@ -0,0 +1,45 @@ + +cairo-skia + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@format: +@Returns: + + diff --git a/doc/public/tmpl/cairo-status.sgml b/doc/public/tmpl/cairo-status.sgml new file mode 100644 index 000000000..525455e9f --- /dev/null +++ b/doc/public/tmpl/cairo-status.sgml @@ -0,0 +1,87 @@ + +cairo-status + + + + + + + + + + + + + + + + + + + + + + + + + + + +@CAIRO_STATUS_SUCCESS: +@CAIRO_STATUS_NO_MEMORY: +@CAIRO_STATUS_INVALID_RESTORE: +@CAIRO_STATUS_INVALID_POP_GROUP: +@CAIRO_STATUS_NO_CURRENT_POINT: +@CAIRO_STATUS_INVALID_MATRIX: +@CAIRO_STATUS_INVALID_STATUS: +@CAIRO_STATUS_NULL_POINTER: +@CAIRO_STATUS_INVALID_STRING: +@CAIRO_STATUS_INVALID_PATH_DATA: +@CAIRO_STATUS_READ_ERROR: +@CAIRO_STATUS_WRITE_ERROR: +@CAIRO_STATUS_SURFACE_FINISHED: +@CAIRO_STATUS_SURFACE_TYPE_MISMATCH: +@CAIRO_STATUS_PATTERN_TYPE_MISMATCH: +@CAIRO_STATUS_INVALID_CONTENT: +@CAIRO_STATUS_INVALID_FORMAT: +@CAIRO_STATUS_INVALID_VISUAL: +@CAIRO_STATUS_FILE_NOT_FOUND: +@CAIRO_STATUS_INVALID_DASH: +@CAIRO_STATUS_INVALID_DSC_COMMENT: +@CAIRO_STATUS_INVALID_INDEX: +@CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: +@CAIRO_STATUS_TEMP_FILE_ERROR: +@CAIRO_STATUS_INVALID_STRIDE: +@CAIRO_STATUS_FONT_TYPE_MISMATCH: +@CAIRO_STATUS_USER_FONT_IMMUTABLE: +@CAIRO_STATUS_USER_FONT_ERROR: +@CAIRO_STATUS_NEGATIVE_COUNT: +@CAIRO_STATUS_INVALID_CLUSTERS: +@CAIRO_STATUS_INVALID_SLANT: +@CAIRO_STATUS_INVALID_WEIGHT: +@CAIRO_STATUS_INVALID_SIZE: +@CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: +@CAIRO_STATUS_DEVICE_TYPE_MISMATCH: +@CAIRO_STATUS_DEVICE_ERROR: +@CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: +@CAIRO_STATUS_DEVICE_FINISHED: +@CAIRO_STATUS_JBIG2_GLOBAL_MISSING: +@CAIRO_STATUS_LAST_STATUS: + + + + + + +@status: +@Returns: + + + + + + + +@void: + + diff --git a/doc/public/tmpl/cairo-surface-observer.sgml b/doc/public/tmpl/cairo-surface-observer.sgml new file mode 100644 index 000000000..b6a16879a --- /dev/null +++ b/doc/public/tmpl/cairo-surface-observer.sgml @@ -0,0 +1,156 @@ + +cairo-surface-observer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@target: +@mode: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@abstract_surface: +@func: +@data: +@Returns: + + + + + + + +@observer: +@target: +@data: + + + + + + + +@surface: +@Returns: + + + + + + + +@CAIRO_SURFACE_OBSERVER_NORMAL: +@CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS: + + + + + + +@surface: +@write_func: +@closure: +@Returns: + + diff --git a/doc/public/tmpl/cairo-surface.sgml b/doc/public/tmpl/cairo-surface.sgml new file mode 100644 index 000000000..09e3730e9 --- /dev/null +++ b/doc/public/tmpl/cairo-surface.sgml @@ -0,0 +1,438 @@ + +cairo-surface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@CAIRO_CONTENT_COLOR: +@CAIRO_CONTENT_ALPHA: +@CAIRO_CONTENT_COLOR_ALPHA: + + + + + + +@other: +@content: +@width: +@height: +@Returns: + + + + + + + +@other: +@format: +@width: +@height: +@Returns: + + + + + + + +@target: +@x: +@y: +@width: +@height: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: + + + + + + + +@surface: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@options: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: + + + + + + + +@surface: +@x: +@y: +@width: +@height: + + + + + + + +@surface: +@x_offset: +@y_offset: + + + + + + + +@surface: +@x_offset: +@y_offset: + + + + + + + +@surface: +@x_scale: +@y_scale: + + + + + + + +@surface: +@x_scale: +@y_scale: + + + + + + + +@surface: +@x_pixels_per_inch: +@y_pixels_per_inch: + + + + + + + +@surface: +@x_pixels_per_inch: +@y_pixels_per_inch: + + + + + + + +@CAIRO_SURFACE_TYPE_IMAGE: +@CAIRO_SURFACE_TYPE_PDF: +@CAIRO_SURFACE_TYPE_PS: +@CAIRO_SURFACE_TYPE_XLIB: +@CAIRO_SURFACE_TYPE_XCB: +@CAIRO_SURFACE_TYPE_GLITZ: +@CAIRO_SURFACE_TYPE_QUARTZ: +@CAIRO_SURFACE_TYPE_WIN32: +@CAIRO_SURFACE_TYPE_BEOS: +@CAIRO_SURFACE_TYPE_DIRECTFB: +@CAIRO_SURFACE_TYPE_SVG: +@CAIRO_SURFACE_TYPE_OS2: +@CAIRO_SURFACE_TYPE_WIN32_PRINTING: +@CAIRO_SURFACE_TYPE_QUARTZ_IMAGE: +@CAIRO_SURFACE_TYPE_SCRIPT: +@CAIRO_SURFACE_TYPE_QT: +@CAIRO_SURFACE_TYPE_RECORDING: +@CAIRO_SURFACE_TYPE_VG: +@CAIRO_SURFACE_TYPE_GL: +@CAIRO_SURFACE_TYPE_DRM: +@CAIRO_SURFACE_TYPE_TEE: +@CAIRO_SURFACE_TYPE_XML: +@CAIRO_SURFACE_TYPE_SKIA: +@CAIRO_SURFACE_TYPE_SUBSURFACE: +@CAIRO_SURFACE_TYPE_COGL: + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@key: +@user_data: +@destroy: +@Returns: + + + + + + + +@surface: +@key: +@Returns: + + + + + + + +@surface: + + + + + + + +@surface: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@mime_type: +@data: +@length: +@destroy: +@closure: +@Returns: + + + + + + + +@surface: +@mime_type: +@data: +@length: + + + + + + + +@surface: +@mime_type: +@Returns: + + + + + + + +@surface: +@extents: +@Returns: + + + + + + + +@surface: +@image: + + diff --git a/doc/public/tmpl/cairo-svg.sgml b/doc/public/tmpl/cairo-svg.sgml new file mode 100644 index 000000000..4da487f7e --- /dev/null +++ b/doc/public/tmpl/cairo-svg.sgml @@ -0,0 +1,89 @@ + +cairo-svg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@width_in_points: +@height_in_points: +@Returns: + + + + + + + +@write_func: +@closure: +@width_in_points: +@height_in_points: +@Returns: + + + + + + + +@surface: +@version: + + + + + + + +@CAIRO_SVG_VERSION_1_1: +@CAIRO_SVG_VERSION_1_2: + + + + + + +@versions: +@num_versions: + + + + + + + +@version: +@Returns: + + diff --git a/doc/public/tmpl/cairo-text.sgml b/doc/public/tmpl/cairo-text.sgml new file mode 100644 index 000000000..25e9d8bd5 --- /dev/null +++ b/doc/public/tmpl/cairo-text.sgml @@ -0,0 +1,293 @@ + +cairo-text + + + + + + + + + + + + + + + + + + + + + + + + + + + +@index: +@x: +@y: + + + + + + +@CAIRO_FONT_SLANT_NORMAL: +@CAIRO_FONT_SLANT_ITALIC: +@CAIRO_FONT_SLANT_OBLIQUE: + + + + + + +@CAIRO_FONT_WEIGHT_NORMAL: +@CAIRO_FONT_WEIGHT_BOLD: + + + + + + +@num_bytes: +@num_glyphs: + + + + + + +@CAIRO_TEXT_CLUSTER_FLAG_BACKWARD: + + + + + + +@cr: +@family: +@slant: +@weight: + + + + + + + +@cr: +@size: + + + + + + + +@cr: +@matrix: + + + + + + + +@cr: +@matrix: + + + + + + + +@cr: +@options: + + + + + + + +@cr: +@options: + + + + + + + +@cr: +@font_face: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@scaled_font: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@utf8: + + + + + + + +@cr: +@glyphs: +@num_glyphs: + + + + + + + +@cr: +@utf8: +@utf8_len: +@glyphs: +@num_glyphs: +@clusters: +@num_clusters: +@cluster_flags: + + + + + + + +@cr: +@extents: + + + + + + + +@cr: +@utf8: +@extents: + + + + + + + +@cr: +@glyphs: +@num_glyphs: +@extents: + + + + + + + +@family: +@slant: +@weight: +@Returns: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@Returns: + + + + + + + +@num_glyphs: +@Returns: + + + + + + + +@glyphs: + + + + + + + +@num_clusters: +@Returns: + + + + + + + +@clusters: + + diff --git a/doc/public/tmpl/cairo-transforms.sgml b/doc/public/tmpl/cairo-transforms.sgml new file mode 100644 index 000000000..8a0298860 --- /dev/null +++ b/doc/public/tmpl/cairo-transforms.sgml @@ -0,0 +1,128 @@ + +cairo-transforms + + + + + + + + + + + + + + + + + + + + + + + + + + + +@cr: +@tx: +@ty: + + + + + + + +@cr: +@sx: +@sy: + + + + + + + +@cr: +@angle: + + + + + + + +@cr: +@matrix: + + + + + + + +@cr: +@matrix: + + + + + + + +@cr: +@matrix: + + + + + + + +@cr: + + + + + + + +@cr: +@x: +@y: + + + + + + + +@cr: +@dx: +@dy: + + + + + + + +@cr: +@x: +@y: + + + + + + + +@cr: +@dx: +@dy: + + diff --git a/doc/public/tmpl/cairo-types.sgml b/doc/public/tmpl/cairo-types.sgml new file mode 100644 index 000000000..c852ce7ae --- /dev/null +++ b/doc/public/tmpl/cairo-types.sgml @@ -0,0 +1,55 @@ + +cairo-types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@unused: + + + + + + +@data: + + + + + + + +@x: +@y: +@width: +@height: + diff --git a/doc/public/tmpl/cairo-unused.sgml b/doc/public/tmpl/cairo-unused.sgml new file mode 100644 index 000000000..e69de29bb diff --git a/doc/public/tmpl/cairo-user-fonts.sgml b/doc/public/tmpl/cairo-user-fonts.sgml new file mode 100644 index 000000000..142a181bb --- /dev/null +++ b/doc/public/tmpl/cairo-user-fonts.sgml @@ -0,0 +1,162 @@ + +cairo-user-fonts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@scaled_font: +@cr: +@extents: +@Returns: + + + + + + + +@scaled_font: +@glyph: +@cr: +@extents: +@Returns: + + + + + + + +@scaled_font: +@utf8: +@utf8_len: +@glyphs: +@num_glyphs: +@clusters: +@num_clusters: +@cluster_flags: +@Returns: + + + + + + + +@scaled_font: +@unicode: +@glyph_index: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@font_face: +@init_func: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@render_glyph_func: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@unicode_to_glyph_func: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@text_to_glyphs_func: + + + + + + + +@font_face: +@Returns: + + diff --git a/doc/public/tmpl/cairo-version.sgml b/doc/public/tmpl/cairo-version.sgml new file mode 100644 index 000000000..c88c64924 --- /dev/null +++ b/doc/public/tmpl/cairo-version.sgml @@ -0,0 +1,97 @@ + +cairo-version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@major: +@minor: +@micro: + + + + + + + +@major: +@minor: +@micro: + + + + + + + +@void: +@Returns: + + + + + + + +@void: +@Returns: + + diff --git a/doc/public/tmpl/cairo-win32-fonts.sgml b/doc/public/tmpl/cairo-win32-fonts.sgml new file mode 100644 index 000000000..819d07748 --- /dev/null +++ b/doc/public/tmpl/cairo-win32-fonts.sgml @@ -0,0 +1,104 @@ + +cairo-win32-fonts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@logfont: +@Returns: + + + + + + + +@font: +@Returns: + + + + + + + +@logfont: +@font: +@Returns: + + + + + + + +@scaled_font: +@hdc: +@Returns: + + + + + + + +@scaled_font: + + + + + + + +@scaled_font: +@Returns: + + + + + + + +@scaled_font: +@logical_to_device: + + + + + + + +@scaled_font: +@device_to_logical: + + diff --git a/doc/public/tmpl/cairo-win32.sgml b/doc/public/tmpl/cairo-win32.sgml new file mode 100644 index 000000000..c18848402 --- /dev/null +++ b/doc/public/tmpl/cairo-win32.sgml @@ -0,0 +1,90 @@ + +cairo-win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@hdc: +@Returns: + + + + + + + +@format: +@width: +@height: +@Returns: + + + + + + + +@hdc: +@format: +@width: +@height: +@Returns: + + + + + + + +@hdc: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + diff --git a/doc/public/tmpl/cairo-xcb.sgml b/doc/public/tmpl/cairo-xcb.sgml new file mode 100644 index 000000000..a48c0bdba --- /dev/null +++ b/doc/public/tmpl/cairo-xcb.sgml @@ -0,0 +1,146 @@ + +cairo-xcb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@connection: +@drawable: +@visual: +@width: +@height: +@Returns: + + + + + + + +@connection: +@screen: +@bitmap: +@width: +@height: +@Returns: + + + + + + + +@connection: +@screen: +@drawable: +@format: +@width: +@height: +@Returns: + + + + + + + +@surface: +@width: +@height: + + + + + + + +@surface: +@drawable: +@width: +@height: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@major_version: +@minor_version: + + + + + + + +@device: +@major_version: +@minor_version: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@precision: + + diff --git a/doc/public/tmpl/cairo-xlib-xrender.sgml b/doc/public/tmpl/cairo-xlib-xrender.sgml new file mode 100644 index 000000000..f1a5a65f7 --- /dev/null +++ b/doc/public/tmpl/cairo-xlib-xrender.sgml @@ -0,0 +1,54 @@ + +cairo-xlib-xrender + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@dpy: +@drawable: +@screen: +@format: +@width: +@height: +@Returns: + + + + + + + +@surface: +@Returns: + + diff --git a/doc/public/tmpl/cairo-xlib.sgml b/doc/public/tmpl/cairo-xlib.sgml new file mode 100644 index 000000000..49edfb8e4 --- /dev/null +++ b/doc/public/tmpl/cairo-xlib.sgml @@ -0,0 +1,169 @@ + +cairo-xlib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@dpy: +@drawable: +@visual: +@width: +@height: +@Returns: + + + + + + + +@dpy: +@bitmap: +@screen: +@width: +@height: +@Returns: + + + + + + + +@surface: +@width: +@height: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@drawable: +@width: +@height: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@surface: +@Returns: + + + + + + + +@device: +@major_version: +@minor_version: + + + + + + + +@device: +@Returns: + + + + + + + +@device: +@precision: + + diff --git a/doc/public/tmpl/cairo.sgml b/doc/public/tmpl/cairo.sgml new file mode 100644 index 000000000..fe4549513 --- /dev/null +++ b/doc/public/tmpl/cairo.sgml @@ -0,0 +1,678 @@ + +cairo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@target: +@Returns: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: +@content: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@red: +@green: +@blue: + + + + + + + +@cr: +@red: +@green: +@blue: +@alpha: + + + + + + + +@cr: +@source: + + + + + + + +@cr: +@surface: +@x: +@y: + + + + + + + +@cr: +@Returns: + + + + + + + +@CAIRO_ANTIALIAS_DEFAULT: +@CAIRO_ANTIALIAS_NONE: +@CAIRO_ANTIALIAS_GRAY: +@CAIRO_ANTIALIAS_SUBPIXEL: +@CAIRO_ANTIALIAS_FAST: +@CAIRO_ANTIALIAS_GOOD: +@CAIRO_ANTIALIAS_BEST: + + + + + + +@cr: +@antialias: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@dashes: +@num_dashes: +@offset: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@dashes: +@offset: + + + + + + + +@CAIRO_FILL_RULE_WINDING: +@CAIRO_FILL_RULE_EVEN_ODD: + + + + + + +@cr: +@fill_rule: + + + + + + + +@cr: +@Returns: + + + + + + + +@CAIRO_LINE_CAP_BUTT: +@CAIRO_LINE_CAP_ROUND: +@CAIRO_LINE_CAP_SQUARE: + + + + + + +@cr: +@line_cap: + + + + + + + +@cr: +@Returns: + + + + + + + +@CAIRO_LINE_JOIN_MITER: +@CAIRO_LINE_JOIN_ROUND: +@CAIRO_LINE_JOIN_BEVEL: + + + + + + +@cr: +@line_join: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@width: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@limit: + + + + + + + +@cr: +@Returns: + + + + + + + +@CAIRO_OPERATOR_CLEAR: +@CAIRO_OPERATOR_SOURCE: +@CAIRO_OPERATOR_OVER: +@CAIRO_OPERATOR_IN: +@CAIRO_OPERATOR_OUT: +@CAIRO_OPERATOR_ATOP: +@CAIRO_OPERATOR_DEST: +@CAIRO_OPERATOR_DEST_OVER: +@CAIRO_OPERATOR_DEST_IN: +@CAIRO_OPERATOR_DEST_OUT: +@CAIRO_OPERATOR_DEST_ATOP: +@CAIRO_OPERATOR_XOR: +@CAIRO_OPERATOR_ADD: +@CAIRO_OPERATOR_SATURATE: +@CAIRO_OPERATOR_MULTIPLY: +@CAIRO_OPERATOR_SCREEN: +@CAIRO_OPERATOR_OVERLAY: +@CAIRO_OPERATOR_DARKEN: +@CAIRO_OPERATOR_LIGHTEN: +@CAIRO_OPERATOR_COLOR_DODGE: +@CAIRO_OPERATOR_COLOR_BURN: +@CAIRO_OPERATOR_HARD_LIGHT: +@CAIRO_OPERATOR_SOFT_LIGHT: +@CAIRO_OPERATOR_DIFFERENCE: +@CAIRO_OPERATOR_EXCLUSION: +@CAIRO_OPERATOR_HSL_HUE: +@CAIRO_OPERATOR_HSL_SATURATION: +@CAIRO_OPERATOR_HSL_COLOR: +@CAIRO_OPERATOR_HSL_LUMINOSITY: + + + + + + +@cr: +@op: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@tolerance: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: +@x1: +@y1: +@x2: +@y2: + + + + + + + +@cr: +@x: +@y: +@Returns: + + + + + + + +@cr: + + + + + + + +@x: +@y: +@width: +@height: + + + + + + +@status: +@rectangles: +@num_rectangles: + + + + + + +@rectangle_list: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: +@x1: +@y1: +@x2: +@y2: + + + + + + + +@cr: +@x: +@y: +@Returns: + + + + + + + +@cr: +@pattern: + + + + + + + +@cr: +@surface: +@surface_x: +@surface_y: + + + + + + + +@cr: + + + + + + + +@cr: +@alpha: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: +@x1: +@y1: +@x2: +@y2: + + + + + + + +@cr: +@x: +@y: +@Returns: + + + + + + + +@cr: + + + + + + + +@cr: + + + + + + + +@cr: +@Returns: + + + + + + + +@cr: +@key: +@user_data: +@destroy: +@Returns: + + + + + + + +@cr: +@key: +@Returns: + + diff --git a/doc/public/version.xml b/doc/public/version.xml new file mode 100644 index 000000000..a4cc55716 --- /dev/null +++ b/doc/public/version.xml @@ -0,0 +1 @@ +1.14.2 diff --git a/doc/public/xml/api-index-1.0.xml b/doc/public/xml/api-index-1.0.xml new file mode 100644 index 000000000..fb0bf4141 --- /dev/null +++ b/doc/public/xml/api-index-1.0.xml @@ -0,0 +1,272 @@ + + +]> + +A +cairo_antialias_t, enum in cairo_t +cairo_append_path, function in Paths +cairo_arc, function in Paths +cairo_arc_negative, function in Paths + +B +cairo_bool_t, typedef in Types + +C +cairo_clip, function in cairo_t +cairo_clip_preserve, function in cairo_t +cairo_close_path, function in Paths +cairo_content_t, enum in cairo_surface_t +cairo_copy_page, function in cairo_t +cairo_copy_path, function in Paths +cairo_copy_path_flat, function in Paths +cairo_create, function in cairo_t +cairo_curve_to, function in Paths + +D +cairo_debug_reset_static_data, function in Error handling +cairo_destroy, function in cairo_t +cairo_destroy_func_t, user_function in Types +cairo_device_to_user, function in Transformations +cairo_device_to_user_distance, function in Transformations + +E +cairo_extend_t, enum in cairo_pattern_t + +F +cairo_fill, function in cairo_t +cairo_fill_extents, function in cairo_t +cairo_fill_preserve, function in cairo_t +cairo_fill_rule_t, enum in cairo_t +cairo_filter_t, enum in cairo_pattern_t +cairo_font_extents, function in text +cairo_font_extents_t, struct in cairo_scaled_font_t +cairo_font_face_destroy, function in cairo_font_face_t +cairo_font_face_get_user_data, function in cairo_font_face_t +cairo_font_face_reference, function in cairo_font_face_t +cairo_font_face_set_user_data, function in cairo_font_face_t +cairo_font_face_status, function in cairo_font_face_t +cairo_font_face_t, typedef in cairo_font_face_t +cairo_font_options_copy, function in cairo_font_options_t +cairo_font_options_create, function in cairo_font_options_t +cairo_font_options_destroy, function in cairo_font_options_t +cairo_font_options_equal, function in cairo_font_options_t +cairo_font_options_get_antialias, function in cairo_font_options_t +cairo_font_options_get_hint_metrics, function in cairo_font_options_t +cairo_font_options_get_hint_style, function in cairo_font_options_t +cairo_font_options_get_subpixel_order, function in cairo_font_options_t +cairo_font_options_hash, function in cairo_font_options_t +cairo_font_options_merge, function in cairo_font_options_t +cairo_font_options_set_antialias, function in cairo_font_options_t +cairo_font_options_set_hint_metrics, function in cairo_font_options_t +cairo_font_options_set_hint_style, function in cairo_font_options_t +cairo_font_options_set_subpixel_order, function in cairo_font_options_t +cairo_font_options_status, function in cairo_font_options_t +cairo_font_options_t, typedef in cairo_font_options_t +cairo_font_slant_t, enum in text +cairo_font_weight_t, enum in text +cairo_format_t, enum in Image Surfaces +cairo_ft_font_face_create_for_ft_face, function in FreeType Fonts +cairo_ft_font_face_create_for_pattern, function in FreeType Fonts +cairo_ft_font_options_substitute, function in FreeType Fonts +cairo_ft_scaled_font_lock_face, function in FreeType Fonts +cairo_ft_scaled_font_unlock_face, function in FreeType Fonts + +G +cairo_get_antialias, function in cairo_t +cairo_get_current_point, function in Paths +cairo_get_fill_rule, function in cairo_t +cairo_get_font_face, function in text +cairo_get_font_matrix, function in text +cairo_get_font_options, function in text +cairo_get_line_cap, function in cairo_t +cairo_get_line_join, function in cairo_t +cairo_get_line_width, function in cairo_t +cairo_get_matrix, function in Transformations +cairo_get_miter_limit, function in cairo_t +cairo_get_operator, function in cairo_t +cairo_get_source, function in cairo_t +cairo_get_target, function in cairo_t +cairo_get_tolerance, function in cairo_t +cairo_glyph_extents, function in text +cairo_glyph_path, function in Paths +cairo_glyph_t, struct in text + +H +CAIRO_HAS_FT_FONT, macro in FreeType Fonts +CAIRO_HAS_PNG_FUNCTIONS, macro in PNG Support +CAIRO_HAS_WIN32_SURFACE, macro in Win32 Surfaces +CAIRO_HAS_XLIB_SURFACE, macro in XLib Surfaces +cairo_hint_metrics_t, enum in cairo_font_options_t +cairo_hint_style_t, enum in cairo_font_options_t + +I +cairo_identity_matrix, function in Transformations +cairo_image_surface_create, function in Image Surfaces +cairo_image_surface_create_for_data, function in Image Surfaces +cairo_image_surface_create_from_png, function in PNG Support +cairo_image_surface_create_from_png_stream, function in PNG Support +cairo_image_surface_get_height, function in Image Surfaces +cairo_image_surface_get_width, function in Image Surfaces +cairo_in_fill, function in cairo_t +cairo_in_stroke, function in cairo_t + +L +cairo_line_cap_t, enum in cairo_t +cairo_line_join_t, enum in cairo_t +cairo_line_to, function in Paths + +M +cairo_mask, function in cairo_t +cairo_mask_surface, function in cairo_t +cairo_matrix_init, function in cairo_matrix_t +cairo_matrix_init_identity, function in cairo_matrix_t +cairo_matrix_init_rotate, function in cairo_matrix_t +cairo_matrix_init_scale, function in cairo_matrix_t +cairo_matrix_init_translate, function in cairo_matrix_t +cairo_matrix_invert, function in cairo_matrix_t +cairo_matrix_multiply, function in cairo_matrix_t +cairo_matrix_rotate, function in cairo_matrix_t +cairo_matrix_scale, function in cairo_matrix_t +cairo_matrix_t, struct in cairo_matrix_t +cairo_matrix_transform_distance, function in cairo_matrix_t +cairo_matrix_transform_point, function in cairo_matrix_t +cairo_matrix_translate, function in cairo_matrix_t +cairo_move_to, function in Paths + +N +cairo_new_path, function in Paths + +O +cairo_operator_t, enum in cairo_t + +P +cairo_paint, function in cairo_t +cairo_paint_with_alpha, function in cairo_t +cairo_path_data_t, union in Paths +cairo_path_data_type_t, enum in Paths +cairo_path_destroy, function in Paths +cairo_path_t, struct in Paths +cairo_pattern_add_color_stop_rgb, function in cairo_pattern_t +cairo_pattern_add_color_stop_rgba, function in cairo_pattern_t +cairo_pattern_create_for_surface, function in cairo_pattern_t +cairo_pattern_create_linear, function in cairo_pattern_t +cairo_pattern_create_radial, function in cairo_pattern_t +cairo_pattern_create_rgb, function in cairo_pattern_t +cairo_pattern_create_rgba, function in cairo_pattern_t +cairo_pattern_destroy, function in cairo_pattern_t +cairo_pattern_get_extend, function in cairo_pattern_t +cairo_pattern_get_filter, function in cairo_pattern_t +cairo_pattern_get_matrix, function in cairo_pattern_t +cairo_pattern_reference, function in cairo_pattern_t +cairo_pattern_set_extend, function in cairo_pattern_t +cairo_pattern_set_filter, function in cairo_pattern_t +cairo_pattern_set_matrix, function in cairo_pattern_t +cairo_pattern_status, function in cairo_pattern_t +cairo_pattern_t, typedef in cairo_pattern_t + +R +cairo_read_func_t, user_function in PNG Support +cairo_rectangle, function in Paths +cairo_reference, function in cairo_t +cairo_rel_curve_to, function in Paths +cairo_rel_line_to, function in Paths +cairo_rel_move_to, function in Paths +cairo_reset_clip, function in cairo_t +cairo_restore, function in cairo_t +cairo_rotate, function in Transformations + +S +cairo_save, function in cairo_t +cairo_scale, function in Transformations +cairo_scaled_font_create, function in cairo_scaled_font_t +cairo_scaled_font_destroy, function in cairo_scaled_font_t +cairo_scaled_font_extents, function in cairo_scaled_font_t +cairo_scaled_font_glyph_extents, function in cairo_scaled_font_t +cairo_scaled_font_reference, function in cairo_scaled_font_t +cairo_scaled_font_status, function in cairo_scaled_font_t +cairo_scaled_font_t, typedef in cairo_scaled_font_t +cairo_select_font_face, function in text +cairo_set_antialias, function in cairo_t +cairo_set_dash, function in cairo_t +cairo_set_fill_rule, function in cairo_t +cairo_set_font_face, function in text +cairo_set_font_matrix, function in text +cairo_set_font_options, function in text +cairo_set_font_size, function in text +cairo_set_line_cap, function in cairo_t +cairo_set_line_join, function in cairo_t +cairo_set_line_width, function in cairo_t +cairo_set_matrix, function in Transformations +cairo_set_miter_limit, function in cairo_t +cairo_set_operator, function in cairo_t +cairo_set_source, function in cairo_t +cairo_set_source_rgb, function in cairo_t +cairo_set_source_rgba, function in cairo_t +cairo_set_source_surface, function in cairo_t +cairo_set_tolerance, function in cairo_t +cairo_show_glyphs, function in text +cairo_show_page, function in cairo_t +cairo_show_text, function in text +cairo_status, function in cairo_t +cairo_status_t, enum in Error handling +cairo_status_to_string, function in Error handling +cairo_stroke, function in cairo_t +cairo_stroke_extents, function in cairo_t +cairo_stroke_preserve, function in cairo_t +cairo_subpixel_order_t, enum in cairo_font_options_t +cairo_surface_create_similar, function in cairo_surface_t +cairo_surface_destroy, function in cairo_surface_t +cairo_surface_finish, function in cairo_surface_t +cairo_surface_flush, function in cairo_surface_t +cairo_surface_get_font_options, function in cairo_surface_t +cairo_surface_get_user_data, function in cairo_surface_t +cairo_surface_mark_dirty, function in cairo_surface_t +cairo_surface_mark_dirty_rectangle, function in cairo_surface_t +cairo_surface_reference, function in cairo_surface_t +cairo_surface_set_device_offset, function in cairo_surface_t +cairo_surface_set_user_data, function in cairo_surface_t +cairo_surface_status, function in cairo_surface_t +cairo_surface_t, typedef in cairo_surface_t +cairo_surface_write_to_png, function in PNG Support +cairo_surface_write_to_png_stream, function in PNG Support + +T +cairo_t, typedef in cairo_t +cairo_text_extents, function in text +cairo_text_extents_t, struct in cairo_scaled_font_t +cairo_text_path, function in Paths +cairo_transform, function in Transformations +cairo_translate, function in Transformations + +U +cairo_user_data_key_t, struct in Types +cairo_user_to_device, function in Transformations +cairo_user_to_device_distance, function in Transformations + +V +cairo_version, function in Version Information +CAIRO_VERSION, macro in Version Information +CAIRO_VERSION_ENCODE, macro in Version Information +CAIRO_VERSION_MAJOR, macro in Version Information +CAIRO_VERSION_MICRO, macro in Version Information +CAIRO_VERSION_MINOR, macro in Version Information +cairo_version_string, function in Version Information + +W +cairo_win32_font_face_create_for_logfontw, function in Win32 Fonts +cairo_win32_scaled_font_done_font, function in Win32 Fonts +cairo_win32_scaled_font_get_metrics_factor, function in Win32 Fonts +cairo_win32_scaled_font_select_font, function in Win32 Fonts +cairo_win32_surface_create, function in Win32 Surfaces +cairo_write_func_t, user_function in PNG Support + +X +cairo_xlib_surface_create, function in XLib Surfaces +cairo_xlib_surface_create_for_bitmap, function in XLib Surfaces +cairo_xlib_surface_create_with_xrender_format, function in XLib-XRender Backend +cairo_xlib_surface_set_drawable, function in XLib Surfaces +cairo_xlib_surface_set_size, function in XLib Surfaces + + diff --git a/doc/public/xml/api-index-1.10.xml b/doc/public/xml/api-index-1.10.xml new file mode 100644 index 000000000..8fe2bdf1c --- /dev/null +++ b/doc/public/xml/api-index-1.10.xml @@ -0,0 +1,79 @@ + + +]> + +D +cairo_device_acquire, function in cairo_device_t +cairo_device_destroy, function in cairo_device_t +cairo_device_finish, function in cairo_device_t +cairo_device_flush, function in cairo_device_t +cairo_device_get_reference_count, function in cairo_device_t +cairo_device_get_type, function in cairo_device_t +cairo_device_get_user_data, function in cairo_device_t +cairo_device_reference, function in cairo_device_t +cairo_device_release, function in cairo_device_t +cairo_device_set_user_data, function in cairo_device_t +cairo_device_status, function in cairo_device_t +cairo_device_t, typedef in cairo_device_t +cairo_device_type_t, enum in cairo_device_t + +H +CAIRO_HAS_FC_FONT, macro in FreeType Fonts +CAIRO_HAS_RECORDING_SURFACE, macro in Recording Surfaces + +I +cairo_in_clip, function in cairo_t + +M +CAIRO_MIME_TYPE_JP2, macro in cairo_surface_t +CAIRO_MIME_TYPE_JPEG, macro in cairo_surface_t +CAIRO_MIME_TYPE_PNG, macro in cairo_surface_t +CAIRO_MIME_TYPE_URI, macro in cairo_surface_t + +P +cairo_pdf_get_versions, function in PDF Surfaces +cairo_pdf_surface_restrict_to_version, function in PDF Surfaces +cairo_pdf_version_t, enum in PDF Surfaces +cairo_pdf_version_to_string, function in PDF Surfaces + +R +cairo_recording_surface_create, function in Recording Surfaces +cairo_recording_surface_ink_extents, function in Recording Surfaces +cairo_rectangle_int_t, struct in Types +cairo_region_contains_point, function in Regions +cairo_region_contains_rectangle, function in Regions +cairo_region_copy, function in Regions +cairo_region_create, function in Regions +cairo_region_create_rectangle, function in Regions +cairo_region_create_rectangles, function in Regions +cairo_region_destroy, function in Regions +cairo_region_equal, function in Regions +cairo_region_get_extents, function in Regions +cairo_region_get_rectangle, function in Regions +cairo_region_intersect, function in Regions +cairo_region_intersect_rectangle, function in Regions +cairo_region_is_empty, function in Regions +cairo_region_num_rectangles, function in Regions +cairo_region_overlap_t, enum in Regions +cairo_region_reference, function in Regions +cairo_region_status, function in Regions +cairo_region_subtract, function in Regions +cairo_region_subtract_rectangle, function in Regions +cairo_region_t, typedef in Regions +cairo_region_translate, function in Regions +cairo_region_union, function in Regions +cairo_region_union_rectangle, function in Regions +cairo_region_xor, function in Regions +cairo_region_xor_rectangle, function in Regions + +S +cairo_skia_context_t, typedef in cairo-skia +cairo_skia_surface_t, typedef in cairo-skia +cairo_surface_create_for_rectangle, function in cairo_surface_t +cairo_surface_get_device, function in cairo_surface_t +cairo_surface_get_mime_data, function in cairo_surface_t +cairo_surface_set_mime_data, function in cairo_surface_t + + diff --git a/doc/public/xml/api-index-1.12.xml b/doc/public/xml/api-index-1.12.xml new file mode 100644 index 000000000..c5c6a35d4 --- /dev/null +++ b/doc/public/xml/api-index-1.12.xml @@ -0,0 +1,86 @@ + + +]> + +F +cairo_ft_font_face_get_synthesize, function in FreeType Fonts +cairo_ft_font_face_set_synthesize, function in FreeType Fonts +cairo_ft_font_face_unset_synthesize, function in FreeType Fonts +cairo_ft_synthesize_t, enum in FreeType Fonts + +H +CAIRO_HAS_SCRIPT_SURFACE, macro in Script Surfaces +CAIRO_HAS_XCB_SURFACE, macro in XCB Surfaces + +M +cairo_mesh_pattern_begin_patch, function in cairo_pattern_t +cairo_mesh_pattern_curve_to, function in cairo_pattern_t +cairo_mesh_pattern_end_patch, function in cairo_pattern_t +cairo_mesh_pattern_get_control_point, function in cairo_pattern_t +cairo_mesh_pattern_get_corner_color_rgba, function in cairo_pattern_t +cairo_mesh_pattern_get_patch_count, function in cairo_pattern_t +cairo_mesh_pattern_get_path, function in cairo_pattern_t +cairo_mesh_pattern_line_to, function in cairo_pattern_t +cairo_mesh_pattern_move_to, function in cairo_pattern_t +cairo_mesh_pattern_set_control_point, function in cairo_pattern_t +cairo_mesh_pattern_set_corner_color_rgb, function in cairo_pattern_t +cairo_mesh_pattern_set_corner_color_rgba, function in cairo_pattern_t +CAIRO_MIME_TYPE_UNIQUE_ID, macro in cairo_surface_t + +P +cairo_pattern_create_mesh, function in cairo_pattern_t +cairo_pattern_create_raster_source, function in Raster Sources + +R +cairo_raster_source_acquire_func_t, user_function in Raster Sources +cairo_raster_source_copy_func_t, user_function in Raster Sources +cairo_raster_source_finish_func_t, user_function in Raster Sources +cairo_raster_source_pattern_get_acquire, function in Raster Sources +cairo_raster_source_pattern_get_callback_data, function in Raster Sources +cairo_raster_source_pattern_get_copy, function in Raster Sources +cairo_raster_source_pattern_get_finish, function in Raster Sources +cairo_raster_source_pattern_get_snapshot, function in Raster Sources +cairo_raster_source_pattern_set_acquire, function in Raster Sources +cairo_raster_source_pattern_set_callback_data, function in Raster Sources +cairo_raster_source_pattern_set_copy, function in Raster Sources +cairo_raster_source_pattern_set_finish, function in Raster Sources +cairo_raster_source_pattern_set_snapshot, function in Raster Sources +cairo_raster_source_release_func_t, user_function in Raster Sources +cairo_raster_source_snapshot_func_t, user_function in Raster Sources +cairo_recording_surface_get_extents, function in Recording Surfaces + +S +cairo_script_create, function in Script Surfaces +cairo_script_create_for_stream, function in Script Surfaces +cairo_script_from_recording_surface, function in Script Surfaces +cairo_script_get_mode, function in Script Surfaces +cairo_script_mode_t, enum in Script Surfaces +cairo_script_set_mode, function in Script Surfaces +cairo_script_surface_create, function in Script Surfaces +cairo_script_surface_create_for_target, function in Script Surfaces +cairo_script_write_comment, function in Script Surfaces +cairo_surface_create_observer, function in cairo-surface-observer +cairo_surface_create_similar_image, function in cairo_surface_t +cairo_surface_map_to_image, function in cairo_surface_t +cairo_surface_observer_mode_t, enum in cairo-surface-observer +cairo_surface_supports_mime_type, function in cairo_surface_t +cairo_surface_unmap_image, function in cairo_surface_t + +X +cairo_xcb_device_debug_cap_xrender_version, function in XCB Surfaces +cairo_xcb_device_debug_cap_xshm_version, function in XCB Surfaces +cairo_xcb_device_debug_get_precision, function in XCB Surfaces +cairo_xcb_device_debug_set_precision, function in XCB Surfaces +cairo_xcb_device_get_connection, function in XCB Surfaces +cairo_xcb_surface_create, function in XCB Surfaces +cairo_xcb_surface_create_for_bitmap, function in XCB Surfaces +cairo_xcb_surface_create_with_xrender_format, function in XCB Surfaces +cairo_xcb_surface_set_drawable, function in XCB Surfaces +cairo_xcb_surface_set_size, function in XCB Surfaces +cairo_xlib_device_debug_cap_xrender_version, function in XLib Surfaces +cairo_xlib_device_debug_get_precision, function in XLib Surfaces +cairo_xlib_device_debug_set_precision, function in XLib Surfaces + + diff --git a/doc/public/xml/api-index-1.14.xml b/doc/public/xml/api-index-1.14.xml new file mode 100644 index 000000000..bea452ef8 --- /dev/null +++ b/doc/public/xml/api-index-1.14.xml @@ -0,0 +1,16 @@ + + +]> + +M +CAIRO_MIME_TYPE_JBIG2, macro in cairo_surface_t +CAIRO_MIME_TYPE_JBIG2_GLOBAL, macro in cairo_surface_t +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, macro in cairo_surface_t + +S +cairo_surface_get_device_scale, function in cairo_surface_t +cairo_surface_set_device_scale, function in cairo_surface_t + + diff --git a/doc/public/xml/api-index-1.2.xml b/doc/public/xml/api-index-1.2.xml new file mode 100644 index 000000000..22fbb98b2 --- /dev/null +++ b/doc/public/xml/api-index-1.2.xml @@ -0,0 +1,78 @@ + + +]> + +F +cairo_font_face_get_type, function in cairo_font_face_t +cairo_font_type_t, enum in cairo_font_face_t + +G +cairo_get_group_target, function in cairo_t + +H +CAIRO_HAS_PDF_SURFACE, macro in PDF Surfaces +CAIRO_HAS_PS_SURFACE, macro in PostScript Surfaces +CAIRO_HAS_SVG_SURFACE, macro in SVG Surfaces + +I +cairo_image_surface_get_data, function in Image Surfaces +cairo_image_surface_get_format, function in Image Surfaces +cairo_image_surface_get_stride, function in Image Surfaces + +N +cairo_new_sub_path, function in Paths + +P +cairo_pattern_get_type, function in cairo_pattern_t +cairo_pattern_type_t, enum in cairo_pattern_t +cairo_pdf_surface_create, function in PDF Surfaces +cairo_pdf_surface_create_for_stream, function in PDF Surfaces +cairo_pdf_surface_set_size, function in PDF Surfaces +cairo_pop_group, function in cairo_t +cairo_pop_group_to_source, function in cairo_t +cairo_ps_surface_create, function in PostScript Surfaces +cairo_ps_surface_create_for_stream, function in PostScript Surfaces +cairo_ps_surface_dsc_begin_page_setup, function in PostScript Surfaces +cairo_ps_surface_dsc_begin_setup, function in PostScript Surfaces +cairo_ps_surface_dsc_comment, function in PostScript Surfaces +cairo_ps_surface_set_size, function in PostScript Surfaces +cairo_push_group, function in cairo_t +cairo_push_group_with_content, function in cairo_t + +S +cairo_scaled_font_get_ctm, function in cairo_scaled_font_t +cairo_scaled_font_get_font_face, function in cairo_scaled_font_t +cairo_scaled_font_get_font_matrix, function in cairo_scaled_font_t +cairo_scaled_font_get_font_options, function in cairo_scaled_font_t +cairo_scaled_font_get_type, function in cairo_scaled_font_t +cairo_scaled_font_text_extents, function in cairo_scaled_font_t +cairo_set_scaled_font, function in text +cairo_surface_get_content, function in cairo_surface_t +cairo_surface_get_device_offset, function in cairo_surface_t +cairo_surface_get_type, function in cairo_surface_t +cairo_surface_set_fallback_resolution, function in cairo_surface_t +cairo_surface_type_t, enum in cairo_surface_t +cairo_svg_get_versions, function in SVG Surfaces +cairo_svg_surface_create, function in SVG Surfaces +cairo_svg_surface_create_for_stream, function in SVG Surfaces +cairo_svg_surface_restrict_to_version, function in SVG Surfaces +cairo_svg_version_t, enum in SVG Surfaces +cairo_svg_version_to_string, function in SVG Surfaces + +W +cairo_win32_font_face_create_for_hfont, function in Win32 Fonts +cairo_win32_surface_create_with_dib, function in Win32 Surfaces +cairo_win32_surface_get_dc, function in Win32 Surfaces + +X +cairo_xlib_surface_get_depth, function in XLib Surfaces +cairo_xlib_surface_get_display, function in XLib Surfaces +cairo_xlib_surface_get_drawable, function in XLib Surfaces +cairo_xlib_surface_get_height, function in XLib Surfaces +cairo_xlib_surface_get_screen, function in XLib Surfaces +cairo_xlib_surface_get_visual, function in XLib Surfaces +cairo_xlib_surface_get_width, function in XLib Surfaces + + diff --git a/doc/public/xml/api-index-1.4.xml b/doc/public/xml/api-index-1.4.xml new file mode 100644 index 000000000..dfcf562ef --- /dev/null +++ b/doc/public/xml/api-index-1.4.xml @@ -0,0 +1,50 @@ + + +]> + +C +cairo_clip_extents, function in cairo_t +cairo_copy_clip_rectangle_list, function in cairo_t + +F +cairo_font_face_get_reference_count, function in cairo_font_face_t + +G +cairo_get_dash, function in cairo_t +cairo_get_dash_count, function in cairo_t +cairo_get_reference_count, function in cairo_t +cairo_get_scaled_font, function in text +cairo_get_user_data, function in cairo_t + +P +cairo_pattern_get_color_stop_count, function in cairo_pattern_t +cairo_pattern_get_color_stop_rgba, function in cairo_pattern_t +cairo_pattern_get_linear_points, function in cairo_pattern_t +cairo_pattern_get_radial_circles, function in cairo_pattern_t +cairo_pattern_get_reference_count, function in cairo_pattern_t +cairo_pattern_get_rgba, function in cairo_pattern_t +cairo_pattern_get_surface, function in cairo_pattern_t +cairo_pattern_get_user_data, function in cairo_pattern_t +cairo_pattern_set_user_data, function in cairo_pattern_t + +R +cairo_rectangle_list_destroy, function in cairo_t +cairo_rectangle_list_t, struct in cairo_t +cairo_rectangle_t, struct in cairo_t + +S +cairo_scaled_font_get_reference_count, function in cairo_scaled_font_t +cairo_scaled_font_get_user_data, function in cairo_scaled_font_t +cairo_scaled_font_set_user_data, function in cairo_scaled_font_t +cairo_set_user_data, function in cairo_t +cairo_surface_get_reference_count, function in cairo_surface_t + +W +cairo_win32_scaled_font_get_device_to_logical, function in Win32 Fonts +cairo_win32_scaled_font_get_logical_to_device, function in Win32 Fonts +cairo_win32_surface_create_with_ddb, function in Win32 Surfaces +cairo_win32_surface_get_image, function in Win32 Surfaces + + diff --git a/doc/public/xml/api-index-1.6.xml b/doc/public/xml/api-index-1.6.xml new file mode 100644 index 000000000..c977e0f02 --- /dev/null +++ b/doc/public/xml/api-index-1.6.xml @@ -0,0 +1,43 @@ + + +]> + +F +cairo_format_stride_for_width, function in Image Surfaces + +H +cairo_has_current_point, function in Paths +CAIRO_HAS_QUARTZ_FONT, macro in Quartz (CGFont) Fonts +CAIRO_HAS_QUARTZ_SURFACE, macro in Quartz Surfaces +CAIRO_HAS_XLIB_XRENDER_SURFACE, macro in XLib-XRender Backend + +P +cairo_path_extents, function in Paths +cairo_ps_get_levels, function in PostScript Surfaces +cairo_ps_level_t, enum in PostScript Surfaces +cairo_ps_level_to_string, function in PostScript Surfaces +cairo_ps_surface_get_eps, function in PostScript Surfaces +cairo_ps_surface_restrict_to_level, function in PostScript Surfaces +cairo_ps_surface_set_eps, function in PostScript Surfaces + +Q +cairo_quartz_font_face_create_for_atsu_font_id, function in Quartz (CGFont) Fonts +cairo_quartz_font_face_create_for_cgfont, function in Quartz (CGFont) Fonts +cairo_quartz_surface_create, function in Quartz Surfaces +cairo_quartz_surface_create_for_cg_context, function in Quartz Surfaces +cairo_quartz_surface_get_cg_context, function in Quartz Surfaces + +S +cairo_surface_copy_page, function in cairo_surface_t +cairo_surface_show_page, function in cairo_surface_t + +W +cairo_win32_font_face_create_for_logfontw_hfont, function in Win32 Fonts +cairo_win32_printing_surface_create, function in Win32 Surfaces + +X +cairo_xlib_surface_get_xrender_format, function in XLib-XRender Backend + + diff --git a/doc/public/xml/api-index-1.8.xml b/doc/public/xml/api-index-1.8.xml new file mode 100644 index 000000000..d062dcaba --- /dev/null +++ b/doc/public/xml/api-index-1.8.xml @@ -0,0 +1,52 @@ + + +]> + +G +cairo_glyph_allocate, function in text +cairo_glyph_free, function in text + +H +CAIRO_HAS_IMAGE_SURFACE, macro in Image Surfaces +CAIRO_HAS_USER_FONT, macro in User Fonts +CAIRO_HAS_WIN32_FONT, macro in Win32 Fonts + +S +cairo_scaled_font_get_scale_matrix, function in cairo_scaled_font_t +cairo_scaled_font_text_to_glyphs, function in cairo_scaled_font_t +cairo_show_text_glyphs, function in text +cairo_surface_get_fallback_resolution, function in cairo_surface_t +cairo_surface_has_show_text_glyphs, function in cairo_surface_t + +T +cairo_text_cluster_allocate, function in text +cairo_text_cluster_flags_t, enum in text +cairo_text_cluster_free, function in text +cairo_text_cluster_t, struct in text +cairo_toy_font_face_create, function in text +cairo_toy_font_face_get_family, function in text +cairo_toy_font_face_get_slant, function in text +cairo_toy_font_face_get_weight, function in text + +U +cairo_user_font_face_create, function in User Fonts +cairo_user_font_face_get_init_func, function in User Fonts +cairo_user_font_face_get_render_glyph_func, function in User Fonts +cairo_user_font_face_get_text_to_glyphs_func, function in User Fonts +cairo_user_font_face_get_unicode_to_glyph_func, function in User Fonts +cairo_user_font_face_set_init_func, function in User Fonts +cairo_user_font_face_set_render_glyph_func, function in User Fonts +cairo_user_font_face_set_text_to_glyphs_func, function in User Fonts +cairo_user_font_face_set_unicode_to_glyph_func, function in User Fonts +cairo_user_scaled_font_init_func_t, user_function in User Fonts +cairo_user_scaled_font_render_glyph_func_t, user_function in User Fonts +cairo_user_scaled_font_text_to_glyphs_func_t, user_function in User Fonts +cairo_user_scaled_font_unicode_to_glyph_func_t, user_function in User Fonts + +V +CAIRO_VERSION_STRING, macro in Version Information +CAIRO_VERSION_STRINGIZE, macro in Version Information + + diff --git a/doc/public/xml/api-index-TBD.xml b/doc/public/xml/api-index-TBD.xml new file mode 100644 index 000000000..c4d30d01e --- /dev/null +++ b/doc/public/xml/api-index-TBD.xml @@ -0,0 +1,7 @@ + + +]> + + diff --git a/doc/public/xml/api-index-deprecated.xml b/doc/public/xml/api-index-deprecated.xml new file mode 100644 index 000000000..c4d30d01e --- /dev/null +++ b/doc/public/xml/api-index-deprecated.xml @@ -0,0 +1,7 @@ + + +]> + + diff --git a/doc/public/xml/api-index-full.xml b/doc/public/xml/api-index-full.xml new file mode 100644 index 000000000..41caed7f9 --- /dev/null +++ b/doc/public/xml/api-index-full.xml @@ -0,0 +1,560 @@ + + +]> + +A +cairo_antialias_t, enum in cairo_t +cairo_append_path, function in Paths +cairo_arc, function in Paths +cairo_arc_negative, function in Paths + +B +cairo_bool_t, typedef in Types + +C +cairo_clip, function in cairo_t +cairo_clip_extents, function in cairo_t +cairo_clip_preserve, function in cairo_t +cairo_close_path, function in Paths +cairo_content_t, enum in cairo_surface_t +cairo_copy_clip_rectangle_list, function in cairo_t +cairo_copy_page, function in cairo_t +cairo_copy_path, function in Paths +cairo_copy_path_flat, function in Paths +cairo_create, function in cairo_t +cairo_curve_to, function in Paths + +D +cairo_debug_reset_static_data, function in Error handling +cairo_destroy, function in cairo_t +cairo_destroy_func_t, user_function in Types +cairo_device_acquire, function in cairo_device_t +cairo_device_destroy, function in cairo_device_t +cairo_device_finish, function in cairo_device_t +cairo_device_flush, function in cairo_device_t +cairo_device_get_reference_count, function in cairo_device_t +cairo_device_get_type, function in cairo_device_t +cairo_device_get_user_data, function in cairo_device_t +cairo_device_observer_elapsed, function in cairo_device_t +cairo_device_observer_fill_elapsed, function in cairo_device_t +cairo_device_observer_glyphs_elapsed, function in cairo_device_t +cairo_device_observer_mask_elapsed, function in cairo_device_t +cairo_device_observer_paint_elapsed, function in cairo_device_t +cairo_device_observer_print, function in cairo_device_t +cairo_device_observer_stroke_elapsed, function in cairo_device_t +cairo_device_reference, function in cairo_device_t +cairo_device_release, function in cairo_device_t +cairo_device_set_user_data, function in cairo_device_t +cairo_device_status, function in cairo_device_t +cairo_device_t, typedef in cairo_device_t +cairo_device_to_user, function in Transformations +cairo_device_to_user_distance, function in Transformations +cairo_device_type_t, enum in cairo_device_t + +E +cairo_extend_t, enum in cairo_pattern_t + +F +cairo_fill, function in cairo_t +cairo_fill_extents, function in cairo_t +cairo_fill_preserve, function in cairo_t +cairo_fill_rule_t, enum in cairo_t +cairo_filter_t, enum in cairo_pattern_t +cairo_font_extents, function in text +cairo_font_extents_t, struct in cairo_scaled_font_t +cairo_font_face_destroy, function in cairo_font_face_t +cairo_font_face_get_reference_count, function in cairo_font_face_t +cairo_font_face_get_type, function in cairo_font_face_t +cairo_font_face_get_user_data, function in cairo_font_face_t +cairo_font_face_reference, function in cairo_font_face_t +cairo_font_face_set_user_data, function in cairo_font_face_t +cairo_font_face_status, function in cairo_font_face_t +cairo_font_face_t, typedef in cairo_font_face_t +cairo_font_options_copy, function in cairo_font_options_t +cairo_font_options_create, function in cairo_font_options_t +cairo_font_options_destroy, function in cairo_font_options_t +cairo_font_options_equal, function in cairo_font_options_t +cairo_font_options_get_antialias, function in cairo_font_options_t +cairo_font_options_get_hint_metrics, function in cairo_font_options_t +cairo_font_options_get_hint_style, function in cairo_font_options_t +cairo_font_options_get_subpixel_order, function in cairo_font_options_t +cairo_font_options_hash, function in cairo_font_options_t +cairo_font_options_merge, function in cairo_font_options_t +cairo_font_options_set_antialias, function in cairo_font_options_t +cairo_font_options_set_hint_metrics, function in cairo_font_options_t +cairo_font_options_set_hint_style, function in cairo_font_options_t +cairo_font_options_set_subpixel_order, function in cairo_font_options_t +cairo_font_options_status, function in cairo_font_options_t +cairo_font_options_t, typedef in cairo_font_options_t +cairo_font_slant_t, enum in text +cairo_font_type_t, enum in cairo_font_face_t +cairo_font_weight_t, enum in text +cairo_format_stride_for_width, function in Image Surfaces +cairo_format_t, enum in Image Surfaces +format_to_sk_config, function in cairo-skia +cairo_ft_font_face_create_for_ft_face, function in FreeType Fonts +cairo_ft_font_face_create_for_pattern, function in FreeType Fonts +cairo_ft_font_face_get_synthesize, function in FreeType Fonts +cairo_ft_font_face_set_synthesize, function in FreeType Fonts +cairo_ft_font_face_unset_synthesize, function in FreeType Fonts +cairo_ft_font_options_substitute, function in FreeType Fonts +cairo_ft_scaled_font_lock_face, function in FreeType Fonts +cairo_ft_scaled_font_unlock_face, function in FreeType Fonts +cairo_ft_synthesize_t, enum in FreeType Fonts + +G +cairo_get_antialias, function in cairo_t +cairo_get_current_point, function in Paths +cairo_get_dash, function in cairo_t +cairo_get_dash_count, function in cairo_t +cairo_get_fill_rule, function in cairo_t +cairo_get_font_face, function in text +cairo_get_font_matrix, function in text +cairo_get_font_options, function in text +cairo_get_group_target, function in cairo_t +cairo_get_line_cap, function in cairo_t +cairo_get_line_join, function in cairo_t +cairo_get_line_width, function in cairo_t +cairo_get_matrix, function in Transformations +cairo_get_miter_limit, function in cairo_t +cairo_get_operator, function in cairo_t +cairo_get_reference_count, function in cairo_t +cairo_get_scaled_font, function in text +cairo_get_source, function in cairo_t +cairo_get_target, function in cairo_t +cairo_get_tolerance, function in cairo_t +cairo_get_user_data, function in cairo_t +cairo_glyph_allocate, function in text +cairo_glyph_extents, function in text +cairo_glyph_free, function in text +cairo_glyph_path, function in Paths +cairo_glyph_t, struct in text + +H +cairo_has_current_point, function in Paths +CAIRO_HAS_FC_FONT, macro in FreeType Fonts +CAIRO_HAS_FT_FONT, macro in FreeType Fonts +CAIRO_HAS_IMAGE_SURFACE, macro in Image Surfaces +CAIRO_HAS_MIME_SURFACE, macro in cairo_surface_t +CAIRO_HAS_OBSERVER_SURFACE, macro in cairo-surface-observer +CAIRO_HAS_PDF_SURFACE, macro in PDF Surfaces +CAIRO_HAS_PNG_FUNCTIONS, macro in PNG Support +CAIRO_HAS_PS_SURFACE, macro in PostScript Surfaces +CAIRO_HAS_QUARTZ_FONT, macro in Quartz (CGFont) Fonts +CAIRO_HAS_QUARTZ_SURFACE, macro in Quartz Surfaces +CAIRO_HAS_RECORDING_SURFACE, macro in Recording Surfaces +CAIRO_HAS_SCRIPT_SURFACE, macro in Script Surfaces +CAIRO_HAS_SVG_SURFACE, macro in SVG Surfaces +CAIRO_HAS_USER_FONT, macro in User Fonts +CAIRO_HAS_WIN32_FONT, macro in Win32 Fonts +CAIRO_HAS_WIN32_SURFACE, macro in Win32 Surfaces +CAIRO_HAS_XCB_SHM_FUNCTIONS, macro in XCB Surfaces +CAIRO_HAS_XCB_SURFACE, macro in XCB Surfaces +CAIRO_HAS_XLIB_SURFACE, macro in XLib Surfaces +CAIRO_HAS_XLIB_XRENDER_SURFACE, macro in XLib-XRender Backend +cairo_hint_metrics_t, enum in cairo_font_options_t +cairo_hint_style_t, enum in cairo_font_options_t + +I +cairo_identity_matrix, function in Transformations +cairo_image_surface_create, function in Image Surfaces +cairo_image_surface_create_for_data, function in Image Surfaces +cairo_image_surface_create_from_png, function in PNG Support +cairo_image_surface_create_from_png_stream, function in PNG Support +cairo_image_surface_get_data, function in Image Surfaces +cairo_image_surface_get_format, function in Image Surfaces +cairo_image_surface_get_height, function in Image Surfaces +cairo_image_surface_get_stride, function in Image Surfaces +cairo_image_surface_get_width, function in Image Surfaces +cairo_in_clip, function in cairo_t +cairo_in_fill, function in cairo_t +cairo_in_stroke, function in cairo_t + +L +cairo_line_cap_t, enum in cairo_t +cairo_line_join_t, enum in cairo_t +cairo_line_to, function in Paths + +M +cairo_mask, function in cairo_t +cairo_mask_surface, function in cairo_t +cairo_matrix_init, function in cairo_matrix_t +cairo_matrix_init_identity, function in cairo_matrix_t +cairo_matrix_init_rotate, function in cairo_matrix_t +cairo_matrix_init_scale, function in cairo_matrix_t +cairo_matrix_init_translate, function in cairo_matrix_t +cairo_matrix_invert, function in cairo_matrix_t +cairo_matrix_multiply, function in cairo_matrix_t +cairo_matrix_rotate, function in cairo_matrix_t +cairo_matrix_scale, function in cairo_matrix_t +cairo_matrix_t, struct in cairo_matrix_t +cairo_matrix_transform_distance, function in cairo_matrix_t +cairo_matrix_transform_point, function in cairo_matrix_t +cairo_matrix_translate, function in cairo_matrix_t +cairo_mesh_pattern_begin_patch, function in cairo_pattern_t +cairo_mesh_pattern_curve_to, function in cairo_pattern_t +cairo_mesh_pattern_end_patch, function in cairo_pattern_t +cairo_mesh_pattern_get_control_point, function in cairo_pattern_t +cairo_mesh_pattern_get_corner_color_rgba, function in cairo_pattern_t +cairo_mesh_pattern_get_patch_count, function in cairo_pattern_t +cairo_mesh_pattern_get_path, function in cairo_pattern_t +cairo_mesh_pattern_line_to, function in cairo_pattern_t +cairo_mesh_pattern_move_to, function in cairo_pattern_t +cairo_mesh_pattern_set_control_point, function in cairo_pattern_t +cairo_mesh_pattern_set_corner_color_rgb, function in cairo_pattern_t +cairo_mesh_pattern_set_corner_color_rgba, function in cairo_pattern_t +CAIRO_MIME_TYPE_JBIG2, macro in cairo_surface_t +CAIRO_MIME_TYPE_JBIG2_GLOBAL, macro in cairo_surface_t +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, macro in cairo_surface_t +CAIRO_MIME_TYPE_JP2, macro in cairo_surface_t +CAIRO_MIME_TYPE_JPEG, macro in cairo_surface_t +CAIRO_MIME_TYPE_PNG, macro in cairo_surface_t +CAIRO_MIME_TYPE_UNIQUE_ID, macro in cairo_surface_t +CAIRO_MIME_TYPE_URI, macro in cairo_surface_t +cairo_move_to, function in Paths + +N +cairo_new_path, function in Paths +cairo_new_sub_path, function in Paths + +O +cairo_operator_t, enum in cairo_t + +P +cairo_paint, function in cairo_t +cairo_paint_with_alpha, function in cairo_t +cairo_path_data_t, union in Paths +cairo_path_data_type_t, enum in Paths +cairo_path_destroy, function in Paths +cairo_path_extents, function in Paths +cairo_path_t, struct in Paths +cairo_pattern_add_color_stop_rgb, function in cairo_pattern_t +cairo_pattern_add_color_stop_rgba, function in cairo_pattern_t +cairo_pattern_create_for_surface, function in cairo_pattern_t +cairo_pattern_create_linear, function in cairo_pattern_t +cairo_pattern_create_mesh, function in cairo_pattern_t +cairo_pattern_create_radial, function in cairo_pattern_t +cairo_pattern_create_raster_source, function in Raster Sources +cairo_pattern_create_rgb, function in cairo_pattern_t +cairo_pattern_create_rgba, function in cairo_pattern_t +cairo_pattern_destroy, function in cairo_pattern_t +cairo_pattern_get_color_stop_count, function in cairo_pattern_t +cairo_pattern_get_color_stop_rgba, function in cairo_pattern_t +cairo_pattern_get_extend, function in cairo_pattern_t +cairo_pattern_get_filter, function in cairo_pattern_t +cairo_pattern_get_linear_points, function in cairo_pattern_t +cairo_pattern_get_matrix, function in cairo_pattern_t +cairo_pattern_get_radial_circles, function in cairo_pattern_t +cairo_pattern_get_reference_count, function in cairo_pattern_t +cairo_pattern_get_rgba, function in cairo_pattern_t +cairo_pattern_get_surface, function in cairo_pattern_t +cairo_pattern_get_type, function in cairo_pattern_t +cairo_pattern_get_user_data, function in cairo_pattern_t +cairo_pattern_reference, function in cairo_pattern_t +cairo_pattern_set_extend, function in cairo_pattern_t +cairo_pattern_set_filter, function in cairo_pattern_t +cairo_pattern_set_matrix, function in cairo_pattern_t +cairo_pattern_set_user_data, function in cairo_pattern_t +cairo_pattern_status, function in cairo_pattern_t +cairo_pattern_t, typedef in cairo_pattern_t +cairo_pattern_type_t, enum in cairo_pattern_t +cairo_pdf_get_versions, function in PDF Surfaces +cairo_pdf_surface_create, function in PDF Surfaces +cairo_pdf_surface_create_for_stream, function in PDF Surfaces +cairo_pdf_surface_restrict_to_version, function in PDF Surfaces +cairo_pdf_surface_set_size, function in PDF Surfaces +cairo_pdf_version_t, enum in PDF Surfaces +cairo_pdf_version_to_string, function in PDF Surfaces +cairo_pop_group, function in cairo_t +cairo_pop_group_to_source, function in cairo_t +cairo_ps_get_levels, function in PostScript Surfaces +cairo_ps_level_t, enum in PostScript Surfaces +cairo_ps_level_to_string, function in PostScript Surfaces +cairo_ps_surface_create, function in PostScript Surfaces +cairo_ps_surface_create_for_stream, function in PostScript Surfaces +cairo_ps_surface_dsc_begin_page_setup, function in PostScript Surfaces +cairo_ps_surface_dsc_begin_setup, function in PostScript Surfaces +cairo_ps_surface_dsc_comment, function in PostScript Surfaces +cairo_ps_surface_get_eps, function in PostScript Surfaces +cairo_ps_surface_restrict_to_level, function in PostScript Surfaces +cairo_ps_surface_set_eps, function in PostScript Surfaces +cairo_ps_surface_set_size, function in PostScript Surfaces +cairo_push_group, function in cairo_t +cairo_push_group_with_content, function in cairo_t + +Q +cairo_quartz_font_face_create_for_atsu_font_id, function in Quartz (CGFont) Fonts +cairo_quartz_font_face_create_for_cgfont, function in Quartz (CGFont) Fonts +cairo_quartz_surface_create, function in Quartz Surfaces +cairo_quartz_surface_create_for_cg_context, function in Quartz Surfaces +cairo_quartz_surface_get_cg_context, function in Quartz Surfaces + +R +cairo_raster_source_acquire_func_t, user_function in Raster Sources +cairo_raster_source_copy_func_t, user_function in Raster Sources +cairo_raster_source_finish_func_t, user_function in Raster Sources +cairo_raster_source_pattern_get_acquire, function in Raster Sources +cairo_raster_source_pattern_get_callback_data, function in Raster Sources +cairo_raster_source_pattern_get_copy, function in Raster Sources +cairo_raster_source_pattern_get_finish, function in Raster Sources +cairo_raster_source_pattern_get_snapshot, function in Raster Sources +cairo_raster_source_pattern_set_acquire, function in Raster Sources +cairo_raster_source_pattern_set_callback_data, function in Raster Sources +cairo_raster_source_pattern_set_copy, function in Raster Sources +cairo_raster_source_pattern_set_finish, function in Raster Sources +cairo_raster_source_pattern_set_snapshot, function in Raster Sources +cairo_raster_source_release_func_t, user_function in Raster Sources +cairo_raster_source_snapshot_func_t, user_function in Raster Sources +cairo_read_func_t, user_function in PNG Support +cairo_recording_surface_create, function in Recording Surfaces +cairo_recording_surface_get_extents, function in Recording Surfaces +cairo_recording_surface_ink_extents, function in Recording Surfaces +cairo_rectangle, function in Paths +cairo_rectangle_int_t, struct in Types +cairo_rectangle_list_destroy, function in cairo_t +cairo_rectangle_list_t, struct in cairo_t +cairo_rectangle_t, struct in cairo_t +cairo_reference, function in cairo_t +cairo_region_contains_point, function in Regions +cairo_region_contains_rectangle, function in Regions +cairo_region_copy, function in Regions +cairo_region_create, function in Regions +cairo_region_create_rectangle, function in Regions +cairo_region_create_rectangles, function in Regions +cairo_region_destroy, function in Regions +cairo_region_equal, function in Regions +cairo_region_get_extents, function in Regions +cairo_region_get_rectangle, function in Regions +cairo_region_intersect, function in Regions +cairo_region_intersect_rectangle, function in Regions +cairo_region_is_empty, function in Regions +cairo_region_num_rectangles, function in Regions +cairo_region_overlap_t, enum in Regions +cairo_region_reference, function in Regions +cairo_region_status, function in Regions +cairo_region_subtract, function in Regions +cairo_region_subtract_rectangle, function in Regions +cairo_region_t, typedef in Regions +cairo_region_translate, function in Regions +cairo_region_union, function in Regions +cairo_region_union_rectangle, function in Regions +cairo_region_xor, function in Regions +cairo_region_xor_rectangle, function in Regions +cairo_rel_curve_to, function in Paths +cairo_rel_line_to, function in Paths +cairo_rel_move_to, function in Paths +cairo_reset_clip, function in cairo_t +cairo_restore, function in cairo_t +cairo_rotate, function in Transformations + +S +cairo_save, function in cairo_t +cairo_scale, function in Transformations +cairo_scaled_font_create, function in cairo_scaled_font_t +cairo_scaled_font_destroy, function in cairo_scaled_font_t +cairo_scaled_font_extents, function in cairo_scaled_font_t +cairo_scaled_font_get_ctm, function in cairo_scaled_font_t +cairo_scaled_font_get_font_face, function in cairo_scaled_font_t +cairo_scaled_font_get_font_matrix, function in cairo_scaled_font_t +cairo_scaled_font_get_font_options, function in cairo_scaled_font_t +cairo_scaled_font_get_reference_count, function in cairo_scaled_font_t +cairo_scaled_font_get_scale_matrix, function in cairo_scaled_font_t +cairo_scaled_font_get_type, function in cairo_scaled_font_t +cairo_scaled_font_get_user_data, function in cairo_scaled_font_t +cairo_scaled_font_glyph_extents, function in cairo_scaled_font_t +cairo_scaled_font_reference, function in cairo_scaled_font_t +cairo_scaled_font_set_user_data, function in cairo_scaled_font_t +cairo_scaled_font_status, function in cairo_scaled_font_t +cairo_scaled_font_t, typedef in cairo_scaled_font_t +cairo_scaled_font_text_extents, function in cairo_scaled_font_t +cairo_scaled_font_text_to_glyphs, function in cairo_scaled_font_t +cairo_script_create, function in Script Surfaces +cairo_script_create_for_stream, function in Script Surfaces +cairo_script_from_recording_surface, function in Script Surfaces +cairo_script_get_mode, function in Script Surfaces +cairo_script_mode_t, enum in Script Surfaces +cairo_script_set_mode, function in Script Surfaces +cairo_script_surface_create, function in Script Surfaces +cairo_script_surface_create_for_target, function in Script Surfaces +cairo_script_write_comment, function in Script Surfaces +cairo_select_font_face, function in text +cairo_set_antialias, function in cairo_t +cairo_set_dash, function in cairo_t +cairo_set_fill_rule, function in cairo_t +cairo_set_font_face, function in text +cairo_set_font_matrix, function in text +cairo_set_font_options, function in text +cairo_set_font_size, function in text +cairo_set_line_cap, function in cairo_t +cairo_set_line_join, function in cairo_t +cairo_set_line_width, function in cairo_t +cairo_set_matrix, function in Transformations +cairo_set_miter_limit, function in cairo_t +cairo_set_operator, function in cairo_t +cairo_set_scaled_font, function in text +cairo_set_source, function in cairo_t +cairo_set_source_rgb, function in cairo_t +cairo_set_source_rgba, function in cairo_t +cairo_set_source_surface, function in cairo_t +cairo_set_tolerance, function in cairo_t +cairo_set_user_data, function in cairo_t +cairo_show_glyphs, function in text +cairo_show_page, function in cairo_t +cairo_show_text, function in text +cairo_show_text_glyphs, function in text +cairo_skia_context_t, typedef in cairo-skia +cairo_skia_surface_t, typedef in cairo-skia +cairo_status, function in cairo_t +cairo_status_t, enum in Error handling +cairo_status_to_string, function in Error handling +cairo_stroke, function in cairo_t +cairo_stroke_extents, function in cairo_t +cairo_stroke_preserve, function in cairo_t +cairo_subpixel_order_t, enum in cairo_font_options_t +cairo_surface_copy_page, function in cairo_surface_t +cairo_surface_create_for_rectangle, function in cairo_surface_t +cairo_surface_create_observer, function in cairo-surface-observer +cairo_surface_create_similar, function in cairo_surface_t +cairo_surface_create_similar_image, function in cairo_surface_t +cairo_surface_destroy, function in cairo_surface_t +cairo_surface_finish, function in cairo_surface_t +cairo_surface_flush, function in cairo_surface_t +cairo_surface_get_content, function in cairo_surface_t +cairo_surface_get_device, function in cairo_surface_t +cairo_surface_get_device_offset, function in cairo_surface_t +cairo_surface_get_device_scale, function in cairo_surface_t +cairo_surface_get_fallback_resolution, function in cairo_surface_t +cairo_surface_get_font_options, function in cairo_surface_t +cairo_surface_get_mime_data, function in cairo_surface_t +cairo_surface_get_reference_count, function in cairo_surface_t +cairo_surface_get_type, function in cairo_surface_t +cairo_surface_get_user_data, function in cairo_surface_t +cairo_surface_has_show_text_glyphs, function in cairo_surface_t +cairo_surface_map_to_image, function in cairo_surface_t +cairo_surface_mark_dirty, function in cairo_surface_t +cairo_surface_mark_dirty_rectangle, function in cairo_surface_t +cairo_surface_observer_add_fill_callback, function in cairo-surface-observer +cairo_surface_observer_add_finish_callback, function in cairo-surface-observer +cairo_surface_observer_add_flush_callback, function in cairo-surface-observer +cairo_surface_observer_add_glyphs_callback, function in cairo-surface-observer +cairo_surface_observer_add_mask_callback, function in cairo-surface-observer +cairo_surface_observer_add_paint_callback, function in cairo-surface-observer +cairo_surface_observer_add_stroke_callback, function in cairo-surface-observer +cairo_surface_observer_callback_t, user_function in cairo-surface-observer +cairo_surface_observer_elapsed, function in cairo-surface-observer +cairo_surface_observer_mode_t, enum in cairo-surface-observer +cairo_surface_observer_print, function in cairo-surface-observer +cairo_surface_reference, function in cairo_surface_t +cairo_surface_set_device_offset, function in cairo_surface_t +cairo_surface_set_device_scale, function in cairo_surface_t +cairo_surface_set_fallback_resolution, function in cairo_surface_t +cairo_surface_set_mime_data, function in cairo_surface_t +cairo_surface_set_user_data, function in cairo_surface_t +cairo_surface_show_page, function in cairo_surface_t +cairo_surface_status, function in cairo_surface_t +cairo_surface_supports_mime_type, function in cairo_surface_t +cairo_surface_t, typedef in cairo_surface_t +cairo_surface_type_t, enum in cairo_surface_t +cairo_surface_unmap_image, function in cairo_surface_t +cairo_surface_write_to_png, function in PNG Support +cairo_surface_write_to_png_stream, function in PNG Support +cairo_svg_get_versions, function in SVG Surfaces +cairo_svg_surface_create, function in SVG Surfaces +cairo_svg_surface_create_for_stream, function in SVG Surfaces +cairo_svg_surface_restrict_to_version, function in SVG Surfaces +cairo_svg_version_t, enum in SVG Surfaces +cairo_svg_version_to_string, function in SVG Surfaces + +T +cairo_t, typedef in cairo_t +cairo_text_cluster_allocate, function in text +cairo_text_cluster_flags_t, enum in text +cairo_text_cluster_free, function in text +cairo_text_cluster_t, struct in text +cairo_text_extents, function in text +cairo_text_extents_t, struct in cairo_scaled_font_t +cairo_text_path, function in Paths +cairo_toy_font_face_create, function in text +cairo_toy_font_face_get_family, function in text +cairo_toy_font_face_get_slant, function in text +cairo_toy_font_face_get_weight, function in text +cairo_transform, function in Transformations +cairo_translate, function in Transformations + +U +cairo_user_data_key_t, struct in Types +cairo_user_font_face_create, function in User Fonts +cairo_user_font_face_get_init_func, function in User Fonts +cairo_user_font_face_get_render_glyph_func, function in User Fonts +cairo_user_font_face_get_text_to_glyphs_func, function in User Fonts +cairo_user_font_face_get_unicode_to_glyph_func, function in User Fonts +cairo_user_font_face_set_init_func, function in User Fonts +cairo_user_font_face_set_render_glyph_func, function in User Fonts +cairo_user_font_face_set_text_to_glyphs_func, function in User Fonts +cairo_user_font_face_set_unicode_to_glyph_func, function in User Fonts +cairo_user_scaled_font_init_func_t, user_function in User Fonts +cairo_user_scaled_font_render_glyph_func_t, user_function in User Fonts +cairo_user_scaled_font_text_to_glyphs_func_t, user_function in User Fonts +cairo_user_scaled_font_unicode_to_glyph_func_t, user_function in User Fonts +cairo_user_to_device, function in Transformations +cairo_user_to_device_distance, function in Transformations + +V +cairo_version, function in Version Information +CAIRO_VERSION, macro in Version Information +CAIRO_VERSION_ENCODE, macro in Version Information +CAIRO_VERSION_MAJOR, macro in Version Information +CAIRO_VERSION_MICRO, macro in Version Information +CAIRO_VERSION_MINOR, macro in Version Information +CAIRO_VERSION_STRING, macro in Version Information +cairo_version_string, function in Version Information +CAIRO_VERSION_STRINGIZE, macro in Version Information + +W +cairo_win32_font_face_create_for_hfont, function in Win32 Fonts +cairo_win32_font_face_create_for_logfontw, function in Win32 Fonts +cairo_win32_font_face_create_for_logfontw_hfont, function in Win32 Fonts +cairo_win32_printing_surface_create, function in Win32 Surfaces +cairo_win32_scaled_font_done_font, function in Win32 Fonts +cairo_win32_scaled_font_get_device_to_logical, function in Win32 Fonts +cairo_win32_scaled_font_get_logical_to_device, function in Win32 Fonts +cairo_win32_scaled_font_get_metrics_factor, function in Win32 Fonts +cairo_win32_scaled_font_select_font, function in Win32 Fonts +cairo_win32_surface_create, function in Win32 Surfaces +cairo_win32_surface_create_with_ddb, function in Win32 Surfaces +cairo_win32_surface_create_with_dib, function in Win32 Surfaces +cairo_win32_surface_get_dc, function in Win32 Surfaces +cairo_win32_surface_get_image, function in Win32 Surfaces +cairo_write_func_t, user_function in PNG Support + +X +cairo_xcb_device_debug_cap_xrender_version, function in XCB Surfaces +cairo_xcb_device_debug_cap_xshm_version, function in XCB Surfaces +cairo_xcb_device_debug_get_precision, function in XCB Surfaces +cairo_xcb_device_debug_set_precision, function in XCB Surfaces +cairo_xcb_device_get_connection, function in XCB Surfaces +cairo_xcb_surface_create, function in XCB Surfaces +cairo_xcb_surface_create_for_bitmap, function in XCB Surfaces +cairo_xcb_surface_create_with_xrender_format, function in XCB Surfaces +cairo_xcb_surface_set_drawable, function in XCB Surfaces +cairo_xcb_surface_set_size, function in XCB Surfaces +cairo_xlib_device_debug_cap_xrender_version, function in XLib Surfaces +cairo_xlib_device_debug_get_precision, function in XLib Surfaces +cairo_xlib_device_debug_set_precision, function in XLib Surfaces +cairo_xlib_surface_create, function in XLib Surfaces +cairo_xlib_surface_create_for_bitmap, function in XLib Surfaces +cairo_xlib_surface_create_with_xrender_format, function in XLib-XRender Backend +cairo_xlib_surface_get_depth, function in XLib Surfaces +cairo_xlib_surface_get_display, function in XLib Surfaces +cairo_xlib_surface_get_drawable, function in XLib Surfaces +cairo_xlib_surface_get_height, function in XLib Surfaces +cairo_xlib_surface_get_screen, function in XLib Surfaces +cairo_xlib_surface_get_visual, function in XLib Surfaces +cairo_xlib_surface_get_width, function in XLib Surfaces +cairo_xlib_surface_get_xrender_format, function in XLib-XRender Backend +cairo_xlib_surface_set_drawable, function in XLib Surfaces +cairo_xlib_surface_set_size, function in XLib Surfaces + + diff --git a/doc/public/xml/cairo-device.xml b/doc/public/xml/cairo-device.xml new file mode 100644 index 000000000..4762bdd45 --- /dev/null +++ b/doc/public/xml/cairo-device.xml @@ -0,0 +1,641 @@ + + +]> + + +cairo_device_t +3 + + CAIRO Library + + + +cairo_device_t +interface to underlying rendering system + + + +Functions + + + + + +cairo_device_t * +cairo_device_reference () +void +cairo_device_destroy () +cairo_status_t +cairo_device_status () +void +cairo_device_finish () +void +cairo_device_flush () +cairo_device_type_t +cairo_device_get_type () +unsigned int +cairo_device_get_reference_count () +cairo_status_t +cairo_device_set_user_data () +void * +cairo_device_get_user_data () +cairo_status_t +cairo_device_acquire () +void +cairo_device_release () +double +cairo_device_observer_elapsed () +double +cairo_device_observer_fill_elapsed () +double +cairo_device_observer_glyphs_elapsed () +double +cairo_device_observer_mask_elapsed () +double +cairo_device_observer_paint_elapsed () +cairo_status_t +cairo_device_observer_print () +double +cairo_device_observer_stroke_elapsed () + + + + + + +Types and Values + + + + + +typedefcairo_device_t +enumcairo_device_type_t + + + + + + +Object Hierarchy + + + + + + +Description +Devices are the abstraction Cairo employs for the rendering system +used by a cairo_surface_t. You can get the device of a surface using +cairo_surface_get_device(). +Devices are created using custom functions specific to the rendering +system you want to use. See the documentation for the surface types +for those functions. +An important function that devices fulfill is sharing access to the +rendering system between Cairo and your application. If you want to +access a device directly that you used to draw to with Cairo, you must +first call cairo_device_flush() to ensure that Cairo finishes all +operations on the device and resets it to a clean state. +Cairo also provides the functions cairo_device_acquire() and +cairo_device_release() to synchronize access to the rendering system +in a multithreaded environment. This is done internally, but can also +be used by applications. +Putting this all together, a function that works with devices should +look something like this: + +void +my_device_modifying_function (cairo_device_t *device) +{ + cairo_status_t status; + + // Ensure the device is properly reset + cairo_device_flush (device); + // Try to acquire the device + status = cairo_device_acquire (device); + if (status != CAIRO_STATUS_SUCCESS) { + printf ("Failed to acquire the device: %s\n", cairo_status_to_string (status)); + return; + } + + // Do the custom operations on the device here. + // But do not call any Cairo functions that might acquire devices. + + // Release the device when done. + cairo_device_release (device); +} + +Please refer to the documentation of each backend for +additional usage requirements, guarantees provided, and +interactions with existing surface API of the device functions for +surfaces of that type. + + + + +Functions + +cairo_device_reference () +cairo_device_reference +cairo_device_t * +cairo_device_reference (cairo_device_t *device); +Increases the reference count on device + by one. This prevents +device + from being destroyed until a matching call to +cairo_device_destroy() is made. +The number of references to a cairo_device_t can be get using +cairo_device_get_reference_count(). + +Parameters + + + + + + +device +a cairo_device_t + + + +Returns + the referenced cairo_device_t. + +Since 1.10 + +cairo_device_destroy () +cairo_device_destroy +void +cairo_device_destroy (cairo_device_t *device); +Decreases the reference count on device + by one. If the result is +zero, then device + and all associated resources are freed. See +cairo_device_reference(). +This function may acquire devices if the last reference was dropped. + +Parameters + + + + + + +device +a cairo_device_t + + +Since 1.10 + +cairo_device_status () +cairo_device_status +cairo_status_t +cairo_device_status (cairo_device_t *device); +Checks whether an error has previously occurred for this +device. + +Parameters + + + + + + +device +a cairo_device_t + + + +Returns + CAIRO_STATUS_SUCCESS on success or an error code if +the device is in an error state. + +Since 1.10 + +cairo_device_finish () +cairo_device_finish +void +cairo_device_finish (cairo_device_t *device); +This function finishes the device and drops all references to +external resources. All surfaces, fonts and other objects created +for this device + will be finished, too. +Further operations on the device + will not affect the device + but +will instead trigger a CAIRO_STATUS_DEVICE_FINISHED error. +When the last call to cairo_device_destroy() decreases the +reference count to zero, cairo will call cairo_device_finish() if +it hasn't been called already, before freeing the resources +associated with the device. +This function may acquire devices. + +Parameters + + + + + + +device +the cairo_device_t to finish + + +Since 1.10 + +cairo_device_flush () +cairo_device_flush +void +cairo_device_flush (cairo_device_t *device); +Finish any pending operations for the device and also restore any +temporary modifications cairo has made to the device's state. +This function must be called before switching from using the +device with Cairo to operating on it directly with native APIs. +If the device doesn't support direct access, then this function +does nothing. +This function may acquire devices. + +Parameters + + + + + + +device +a cairo_device_t + + +Since 1.10 + +cairo_device_get_type () +cairo_device_get_type +cairo_device_type_t +cairo_device_get_type (cairo_device_t *device); +This function returns the type of the device. See cairo_device_type_t +for available types. + +Parameters + + + + + + +device +a cairo_device_t + + + +Returns + The type of device +. + +Since 1.10 + +cairo_device_get_reference_count () +cairo_device_get_reference_count +unsigned int +cairo_device_get_reference_count (cairo_device_t *device); +Returns the current reference count of device +. + +Parameters + + + + + + +device +a cairo_device_t + + + +Returns + the current reference count of device +. If the +object is a nil object, 0 will be returned. + +Since 1.10 + +cairo_device_set_user_data () +cairo_device_set_user_data +cairo_status_t +cairo_device_set_user_data (cairo_device_t *device, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); +Attach user data to device +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +. + +Parameters + + + + + + +device +a cairo_device_t + +key +the address of a cairo_user_data_key_t to attach the user data to + +user_data +the user data to attach to the cairo_device_t + +destroy +a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key. + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.10 + +cairo_device_get_user_data () +cairo_device_get_user_data +void * +cairo_device_get_user_data (cairo_device_t *device, + const cairo_user_data_key_t *key); +Return user data previously attached to device + using the +specified key. If no user data has been attached with the given +key this function returns NULL. + +Parameters + + + + + + +device +a cairo_device_t + +key +the address of the cairo_user_data_key_t the user data was +attached to + + + +Returns + the user data previously attached or NULL. + +Since 1.10 + +cairo_device_acquire () +cairo_device_acquire +cairo_status_t +cairo_device_acquire (cairo_device_t *device); +Acquires the device + for the current thread. This function will block +until no other thread has acquired the device. +If the return value is CAIRO_STATUS_SUCCESS, you successfully acquired the +device. From now on your thread owns the device and no other thread will be +able to acquire it until a matching call to cairo_device_release(). It is +allowed to recursively acquire the device multiple times from the same +thread. +You must never acquire two different devices at the same time +unless this is explicitly allowed. Otherwise the possibility of deadlocks +exist. + +As various Cairo functions can acquire devices when called, these functions +may also cause deadlocks when you call them with an acquired device. So you +must not have a device acquired when calling them. These functions are +marked in the documentation. + + +Parameters + + + + + + +device +a cairo_device_t + + + +Returns + CAIRO_STATUS_SUCCESS on success or an error code if +the device is in an error state and could not be +acquired. After a successful call to cairo_device_acquire(), +a matching call to cairo_device_release() is required. + +Since 1.10 + +cairo_device_release () +cairo_device_release +void +cairo_device_release (cairo_device_t *device); +Releases a device + previously acquired using cairo_device_acquire(). See +that function for details. + +Parameters + + + + + + +device +a cairo_device_t + + +Since 1.10 + +cairo_device_observer_elapsed () +cairo_device_observer_elapsed +double +cairo_device_observer_elapsed (cairo_device_t *device); + + + +Returns + + + + +cairo_device_observer_fill_elapsed () +cairo_device_observer_fill_elapsed +double +cairo_device_observer_fill_elapsed (cairo_device_t *device); + + + +Returns + + + + +cairo_device_observer_glyphs_elapsed () +cairo_device_observer_glyphs_elapsed +double +cairo_device_observer_glyphs_elapsed (cairo_device_t *device); + + + +Returns + + + + +cairo_device_observer_mask_elapsed () +cairo_device_observer_mask_elapsed +double +cairo_device_observer_mask_elapsed (cairo_device_t *device); + + + +Returns + + + + +cairo_device_observer_paint_elapsed () +cairo_device_observer_paint_elapsed +double +cairo_device_observer_paint_elapsed (cairo_device_t *device); + + + +Returns + + + + +cairo_device_observer_print () +cairo_device_observer_print +cairo_status_t +cairo_device_observer_print (cairo_device_t *device, + cairo_write_func_t write_func, + void *closure); + + + +Returns + + + + +cairo_device_observer_stroke_elapsed () +cairo_device_observer_stroke_elapsed +double +cairo_device_observer_stroke_elapsed (cairo_device_t *device); + + + +Returns + + + + + + +Types and Values + +cairo_device_t +cairo_device_t +typedef struct _cairo_device cairo_device_t; + +A cairo_device_t represents the driver interface for drawing +operations to a cairo_surface_t. There are different subtypes of +cairo_device_t for different drawing backends; for example, +cairo_egl_device_create() creates a device that wraps an EGL display and +context. +The type of a device can be queried with cairo_device_get_type(). +Memory management of cairo_device_t is done with +cairo_device_reference() and cairo_device_destroy(). +Since 1.10 + +enum cairo_device_type_t +cairo_device_type_t +cairo_device_type_t is used to describe the type of a given +device. The devices types are also known as "backends" within cairo. +The device type can be queried with cairo_device_get_type() +The various cairo_device_t functions can be used with devices of +any type, but some backends also provide type-specific functions +that must only be called with a device of the appropriate +type. These functions have names that begin with +cairo_type_device such as +cairo_xcb_device_debug_cap_xrender_version(). +The behavior of calling a type-specific function with a device of +the wrong type is undefined. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_DEVICE_TYPE_DRM +The device is of type Direct Render Manager, since 1.10 + + + +CAIRO_DEVICE_TYPE_GL +The device is of type OpenGL, since 1.10 + + + +CAIRO_DEVICE_TYPE_SCRIPT +The device is of type script, since 1.10 + + + +CAIRO_DEVICE_TYPE_XCB +The device is of type xcb, since 1.10 + + + +CAIRO_DEVICE_TYPE_XLIB +The device is of type xlib, since 1.10 + + + +CAIRO_DEVICE_TYPE_XML +The device is of type XML, since 1.10 + + + +CAIRO_DEVICE_TYPE_COGL +The device is of type cogl, since 1.12 + + + +CAIRO_DEVICE_TYPE_WIN32 +The device is of type win32, since 1.12 + + + +CAIRO_DEVICE_TYPE_INVALID +The device is invalid, since 1.10 + + + + +Since 1.10 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-font-face.xml b/doc/public/xml/cairo-font-face.xml new file mode 100644 index 000000000..bf5d4f65f --- /dev/null +++ b/doc/public/xml/cairo-font-face.xml @@ -0,0 +1,371 @@ + + +]> + + +cairo_font_face_t +3 + + CAIRO Library + + + +cairo_font_face_t +Base class for font faces + + + +Functions + + + + + +cairo_font_face_t * +cairo_font_face_reference () +void +cairo_font_face_destroy () +cairo_status_t +cairo_font_face_status () +cairo_font_type_t +cairo_font_face_get_type () +unsigned int +cairo_font_face_get_reference_count () +cairo_status_t +cairo_font_face_set_user_data () +void * +cairo_font_face_get_user_data () + + + + + + +Types and Values + + + + + +typedefcairo_font_face_t +enumcairo_font_type_t + + + + + + +Object Hierarchy + + + + + + +Description +cairo_font_face_t represents a particular font at a particular weight, +slant, and other characteristic but no size, transformation, or size. +Font faces are created using font-backend-specific +constructors, typically of the form +cairo_backend_font_face_create(), +or implicitly using the toy text API by way of +cairo_select_font_face(). The resulting face can be accessed using +cairo_get_font_face(). + + + +Functions + +cairo_font_face_reference () +cairo_font_face_reference +cairo_font_face_t * +cairo_font_face_reference (cairo_font_face_t *font_face); +Increases the reference count on font_face + by one. This prevents +font_face + from being destroyed until a matching call to +cairo_font_face_destroy() is made. +The number of references to a cairo_font_face_t can be get using +cairo_font_face_get_reference_count(). + +Parameters + + + + + + +font_face +a cairo_font_face_t, (may be NULL in which case this +function does nothing). + + + +Returns + the referenced cairo_font_face_t. + +Since 1.0 + +cairo_font_face_destroy () +cairo_font_face_destroy +void +cairo_font_face_destroy (cairo_font_face_t *font_face); +Decreases the reference count on font_face + by one. If the result +is zero, then font_face + and all associated resources are freed. +See cairo_font_face_reference(). + +Parameters + + + + + + +font_face +a cairo_font_face_t + + +Since 1.0 + +cairo_font_face_status () +cairo_font_face_status +cairo_status_t +cairo_font_face_status (cairo_font_face_t *font_face); +Checks whether an error has previously occurred for this +font face + +Parameters + + + + + + +font_face +a cairo_font_face_t + + + +Returns + CAIRO_STATUS_SUCCESS or another error such as +CAIRO_STATUS_NO_MEMORY. + +Since 1.0 + +cairo_font_face_get_type () +cairo_font_face_get_type +cairo_font_type_t +cairo_font_face_get_type (cairo_font_face_t *font_face); +This function returns the type of the backend used to create +a font face. See cairo_font_type_t for available types. + +Parameters + + + + + + +font_face +a font face + + + +Returns + The type of font_face +. + +Since 1.2 + +cairo_font_face_get_reference_count () +cairo_font_face_get_reference_count +unsigned int +cairo_font_face_get_reference_count (cairo_font_face_t *font_face); +Returns the current reference count of font_face +. + +Parameters + + + + + + +font_face +a cairo_font_face_t + + + +Returns + the current reference count of font_face +. If the +object is a nil object, 0 will be returned. + +Since 1.4 + +cairo_font_face_set_user_data () +cairo_font_face_set_user_data +cairo_status_t +cairo_font_face_set_user_data (cairo_font_face_t *font_face, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); +Attach user data to font_face +. To remove user data from a font face, +call this function with the key that was used to set it and NULL +for data +. + +Parameters + + + + + + +font_face +a cairo_font_face_t + +key +the address of a cairo_user_data_key_t to attach the user data to + +user_data +the user data to attach to the font face + +destroy +a cairo_destroy_func_t which will be called when the +font face is destroyed or when new user data is attached using the +same key. + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.0 + +cairo_font_face_get_user_data () +cairo_font_face_get_user_data +void * +cairo_font_face_get_user_data (cairo_font_face_t *font_face, + const cairo_user_data_key_t *key); +Return user data previously attached to font_face + using the specified +key. If no user data has been attached with the given key this +function returns NULL. + +Parameters + + + + + + +font_face +a cairo_font_face_t + +key +the address of the cairo_user_data_key_t the user data was +attached to + + + +Returns + the user data previously attached or NULL. + +Since 1.0 + + + +Types and Values + +cairo_font_face_t +cairo_font_face_t +typedef struct _cairo_font_face cairo_font_face_t; + +A cairo_font_face_t specifies all aspects of a font other +than the size or font matrix (a font matrix is used to distort +a font by sheering it or scaling it unequally in the two +directions) . A font face can be set on a cairo_t by using +cairo_set_font_face(); the size and font matrix are set with +cairo_set_font_size() and cairo_set_font_matrix(). +There are various types of font faces, depending on the +font backend they use. The type of a +font face can be queried using cairo_font_face_get_type(). +Memory management of cairo_font_face_t is done with +cairo_font_face_reference() and cairo_font_face_destroy(). +Since 1.0 + +enum cairo_font_type_t +cairo_font_type_t +cairo_font_type_t is used to describe the type of a given font +face or scaled font. The font types are also known as "font +backends" within cairo. +The type of a font face is determined by the function used to +create it, which will generally be of the form +cairo_type_font_face_create(). +The font face type can be queried with cairo_font_face_get_type() +The various cairo_font_face_t functions can be used with a font face +of any type. +The type of a scaled font is determined by the type of the font +face passed to cairo_scaled_font_create(). The scaled font type can +be queried with cairo_scaled_font_get_type() +The various cairo_scaled_font_t functions can be used with scaled +fonts of any type, but some font backends also provide +type-specific functions that must only be called with a scaled font +of the appropriate type. These functions have names that begin with +cairo_type_scaled_font() +such as cairo_ft_scaled_font_lock_face(). +The behavior of calling a type-specific function with a scaled font +of the wrong type is undefined. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_FONT_TYPE_TOY +The font was created using cairo's toy font api (Since: 1.2) + + + +CAIRO_FONT_TYPE_FT +The font is of type FreeType (Since: 1.2) + + + +CAIRO_FONT_TYPE_WIN32 +The font is of type Win32 (Since: 1.2) + + + +CAIRO_FONT_TYPE_QUARTZ +The font is of type Quartz (Since: 1.6, in 1.2 and +1.4 it was named CAIRO_FONT_TYPE_ATSUI) + + + +CAIRO_FONT_TYPE_USER +The font was create using cairo's user font api (Since: 1.8) + + + + +Since 1.2 + + + +See Also +cairo_scaled_font_t + + + + diff --git a/doc/public/xml/cairo-font-options.xml b/doc/public/xml/cairo-font-options.xml new file mode 100644 index 000000000..5bbe46b0f --- /dev/null +++ b/doc/public/xml/cairo-font-options.xml @@ -0,0 +1,629 @@ + + +]> + + +cairo_font_options_t +3 + + CAIRO Library + + + +cairo_font_options_t +How a font should be rendered + + + +Functions + + + + + +cairo_font_options_t * +cairo_font_options_create () +cairo_font_options_t * +cairo_font_options_copy () +void +cairo_font_options_destroy () +cairo_status_t +cairo_font_options_status () +void +cairo_font_options_merge () +unsigned long +cairo_font_options_hash () +cairo_bool_t +cairo_font_options_equal () +void +cairo_font_options_set_antialias () +cairo_antialias_t +cairo_font_options_get_antialias () +void +cairo_font_options_set_subpixel_order () +cairo_subpixel_order_t +cairo_font_options_get_subpixel_order () +void +cairo_font_options_set_hint_style () +cairo_hint_style_t +cairo_font_options_get_hint_style () +void +cairo_font_options_set_hint_metrics () +cairo_hint_metrics_t +cairo_font_options_get_hint_metrics () + + + + + + +Types and Values + + + + + +typedefcairo_font_options_t +enumcairo_subpixel_order_t +enumcairo_hint_style_t +enumcairo_hint_metrics_t + + + + + + +Object Hierarchy + + + + + + +Description +The font options specify how fonts should be rendered. Most of the +time the font options implied by a surface are just right and do not +need any changes, but for pixel-based targets tweaking font options +may result in superior output on a particular display. + + + +Functions + +cairo_font_options_create () +cairo_font_options_create +cairo_font_options_t * +cairo_font_options_create (void); +Allocates a new font options object with all options initialized + to default values. + +Returns + a newly allocated cairo_font_options_t. Free with +cairo_font_options_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_font_options_status(). + +Since 1.0 + +cairo_font_options_copy () +cairo_font_options_copy +cairo_font_options_t * +cairo_font_options_copy (const cairo_font_options_t *original); +Allocates a new font options object copying the option values from + original +. + +Parameters + + + + + + +original +a cairo_font_options_t + + + +Returns + a newly allocated cairo_font_options_t. Free with +cairo_font_options_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_font_options_status(). + +Since 1.0 + +cairo_font_options_destroy () +cairo_font_options_destroy +void +cairo_font_options_destroy (cairo_font_options_t *options); +Destroys a cairo_font_options_t object created with +cairo_font_options_create() or cairo_font_options_copy(). + +Parameters + + + + + + +options +a cairo_font_options_t + + +Since 1.0 + +cairo_font_options_status () +cairo_font_options_status +cairo_status_t +cairo_font_options_status (cairo_font_options_t *options); +Checks whether an error has previously occurred for this +font options object + +Parameters + + + + + + +options +a cairo_font_options_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.0 + +cairo_font_options_merge () +cairo_font_options_merge +void +cairo_font_options_merge (cairo_font_options_t *options, + const cairo_font_options_t *other); +Merges non-default options from other + into options +, replacing +existing values. This operation can be thought of as somewhat +similar to compositing other + onto options + with the operation +of CAIRO_OPERATOR_OVER. + +Parameters + + + + + + +options +a cairo_font_options_t + +other +another cairo_font_options_t + + +Since 1.0 + +cairo_font_options_hash () +cairo_font_options_hash +unsigned long +cairo_font_options_hash (const cairo_font_options_t *options); +Compute a hash for the font options object; this value will +be useful when storing an object containing a cairo_font_options_t +in a hash table. + +Parameters + + + + + + +options +a cairo_font_options_t + + + +Returns + the hash value for the font options object. +The return value can be cast to a 32-bit type if a +32-bit hash value is needed. + +Since 1.0 + +cairo_font_options_equal () +cairo_font_options_equal +cairo_bool_t +cairo_font_options_equal (const cairo_font_options_t *options, + const cairo_font_options_t *other); +Compares two font options objects for equality. + +Parameters + + + + + + +options +a cairo_font_options_t + +other +another cairo_font_options_t + + + +Returns + TRUE if all fields of the two font options objects match. +Note that this function will return FALSE if either object is in +error. + +Since 1.0 + +cairo_font_options_set_antialias () +cairo_font_options_set_antialias +void +cairo_font_options_set_antialias (cairo_font_options_t *options, + cairo_antialias_t antialias); +Sets the antialiasing mode for the font options object. This +specifies the type of antialiasing to do when rendering text. + +Parameters + + + + + + +options +a cairo_font_options_t + +antialias +the new antialiasing mode + + +Since 1.0 + +cairo_font_options_get_antialias () +cairo_font_options_get_antialias +cairo_antialias_t +cairo_font_options_get_antialias (const cairo_font_options_t *options); +Gets the antialiasing mode for the font options object. + +Parameters + + + + + + +options +a cairo_font_options_t + + + +Returns + the antialiasing mode + +Since 1.0 + +cairo_font_options_set_subpixel_order () +cairo_font_options_set_subpixel_order +void +cairo_font_options_set_subpixel_order (cairo_font_options_t *options, + cairo_subpixel_order_t subpixel_order); +Sets the subpixel order for the font options object. The subpixel +order specifies the order of color elements within each pixel on +the display device when rendering with an antialiasing mode of +CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for +cairo_subpixel_order_t for full details. + +Parameters + + + + + + +options +a cairo_font_options_t + +subpixel_order +the new subpixel order + + +Since 1.0 + +cairo_font_options_get_subpixel_order () +cairo_font_options_get_subpixel_order +cairo_subpixel_order_t +cairo_font_options_get_subpixel_order (const cairo_font_options_t *options); +Gets the subpixel order for the font options object. +See the documentation for cairo_subpixel_order_t for full details. + +Parameters + + + + + + +options +a cairo_font_options_t + + + +Returns + the subpixel order for the font options object + +Since 1.0 + +cairo_font_options_set_hint_style () +cairo_font_options_set_hint_style +void +cairo_font_options_set_hint_style (cairo_font_options_t *options, + cairo_hint_style_t hint_style); +Sets the hint style for font outlines for the font options object. +This controls whether to fit font outlines to the pixel grid, +and if so, whether to optimize for fidelity or contrast. +See the documentation for cairo_hint_style_t for full details. + +Parameters + + + + + + +options +a cairo_font_options_t + +hint_style +the new hint style + + +Since 1.0 + +cairo_font_options_get_hint_style () +cairo_font_options_get_hint_style +cairo_hint_style_t +cairo_font_options_get_hint_style (const cairo_font_options_t *options); +Gets the hint style for font outlines for the font options object. +See the documentation for cairo_hint_style_t for full details. + +Parameters + + + + + + +options +a cairo_font_options_t + + + +Returns + the hint style for the font options object + +Since 1.0 + +cairo_font_options_set_hint_metrics () +cairo_font_options_set_hint_metrics +void +cairo_font_options_set_hint_metrics (cairo_font_options_t *options, + cairo_hint_metrics_t hint_metrics); +Sets the metrics hinting mode for the font options object. This +controls whether metrics are quantized to integer values in +device units. +See the documentation for cairo_hint_metrics_t for full details. + +Parameters + + + + + + +options +a cairo_font_options_t + +hint_metrics +the new metrics hinting mode + + +Since 1.0 + +cairo_font_options_get_hint_metrics () +cairo_font_options_get_hint_metrics +cairo_hint_metrics_t +cairo_font_options_get_hint_metrics (const cairo_font_options_t *options); +Gets the metrics hinting mode for the font options object. +See the documentation for cairo_hint_metrics_t for full details. + +Parameters + + + + + + +options +a cairo_font_options_t + + + +Returns + the metrics hinting mode for the font options object + +Since 1.0 + + + +Types and Values + +cairo_font_options_t +cairo_font_options_t +typedef struct _cairo_font_options cairo_font_options_t; + +An opaque structure holding all options that are used when +rendering fonts. +Individual features of a cairo_font_options_t can be set or +accessed using functions named +cairo_font_options_set_feature_name() and +cairo_font_options_get_feature_name(), like +cairo_font_options_set_antialias() and +cairo_font_options_get_antialias(). +New features may be added to a cairo_font_options_t in the +future. For this reason, cairo_font_options_copy(), +cairo_font_options_equal(), cairo_font_options_merge(), and +cairo_font_options_hash() should be used to copy, check +for equality, merge, or compute a hash value of +cairo_font_options_t objects. +Since 1.0 + +enum cairo_subpixel_order_t +cairo_subpixel_order_t +The subpixel order specifies the order of color elements within +each pixel on the display device when rendering with an +antialiasing mode of CAIRO_ANTIALIAS_SUBPIXEL. + +Members + + + + + + +CAIRO_SUBPIXEL_ORDER_DEFAULT +Use the default subpixel order for + for the target device, since 1.0 + + + +CAIRO_SUBPIXEL_ORDER_RGB +Subpixel elements are arranged horizontally + with red at the left, since 1.0 + + + +CAIRO_SUBPIXEL_ORDER_BGR +Subpixel elements are arranged horizontally + with blue at the left, since 1.0 + + + +CAIRO_SUBPIXEL_ORDER_VRGB +Subpixel elements are arranged vertically + with red at the top, since 1.0 + + + +CAIRO_SUBPIXEL_ORDER_VBGR +Subpixel elements are arranged vertically + with blue at the top, since 1.0 + + + + +Since 1.0 + +enum cairo_hint_style_t +cairo_hint_style_t +Specifies the type of hinting to do on font outlines. Hinting +is the process of fitting outlines to the pixel grid in order +to improve the appearance of the result. Since hinting outlines +involves distorting them, it also reduces the faithfulness +to the original outline shapes. Not all of the outline hinting +styles are supported by all font backends. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_HINT_STYLE_DEFAULT +Use the default hint style for + font backend and target device, since 1.0 + + + +CAIRO_HINT_STYLE_NONE +Do not hint outlines, since 1.0 + + + +CAIRO_HINT_STYLE_SLIGHT +Hint outlines slightly to improve + contrast while retaining good fidelity to the original + shapes, since 1.0 + + + +CAIRO_HINT_STYLE_MEDIUM +Hint outlines with medium strength + giving a compromise between fidelity to the original shapes + and contrast, since 1.0 + + + +CAIRO_HINT_STYLE_FULL +Hint outlines to maximize contrast, since 1.0 + + + + +Since 1.0 + +enum cairo_hint_metrics_t +cairo_hint_metrics_t +Specifies whether to hint font metrics; hinting font metrics +means quantizing them so that they are integer values in +device space. Doing this improves the consistency of +letter and line spacing, however it also means that text +will be laid out differently at different zoom factors. + +Members + + + + + + +CAIRO_HINT_METRICS_DEFAULT +Hint metrics in the default + manner for the font backend and target device, since 1.0 + + + +CAIRO_HINT_METRICS_OFF +Do not hint font metrics, since 1.0 + + + +CAIRO_HINT_METRICS_ON +Hint font metrics, since 1.0 + + + + +Since 1.0 + + + +See Also +cairo_scaled_font_t + + + + diff --git a/doc/public/xml/cairo-ft.xml b/doc/public/xml/cairo-ft.xml new file mode 100644 index 000000000..bb8d12a0f --- /dev/null +++ b/doc/public/xml/cairo-ft.xml @@ -0,0 +1,418 @@ + + +]> + + +FreeType Fonts +3 + + CAIRO Library + + + +FreeType Fonts +Font support for FreeType + + + +Functions + + + + + +cairo_font_face_t * +cairo_ft_font_face_create_for_ft_face () +cairo_font_face_t * +cairo_ft_font_face_create_for_pattern () +void +cairo_ft_font_options_substitute () +FT_Face +cairo_ft_scaled_font_lock_face () +void +cairo_ft_scaled_font_unlock_face () +unsigned int +cairo_ft_font_face_get_synthesize () +void +cairo_ft_font_face_set_synthesize () +void +cairo_ft_font_face_unset_synthesize () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_FT_FONT +#defineCAIRO_HAS_FC_FONT +enumcairo_ft_synthesize_t + + + + + + +Object Hierarchy + + + + + + +Description +The FreeType font backend is primarily used to render text on GNU/Linux +systems, but can be used on other platforms too. + + + +Functions + +cairo_ft_font_face_create_for_ft_face () +cairo_ft_font_face_create_for_ft_face +cairo_font_face_t * +cairo_ft_font_face_create_for_ft_face (FT_Face face, + int load_flags); +Creates a new font face for the FreeType font backend from a +pre-opened FreeType face. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). The +cairo_scaled_font_t returned from cairo_scaled_font_create() is +also for the FreeType backend and can be used with functions such +as cairo_ft_scaled_font_lock_face(). Note that Cairo may keep a reference +to the FT_Face alive in a font-cache and the exact lifetime of the reference +depends highly upon the exact usage pattern and is subject to external +factors. You must not call FT_Done_Face() before the last reference to the +cairo_font_face_t has been dropped. +As an example, below is how one might correctly couple the lifetime of +the FreeType face object to the cairo_font_face_t. + +static const cairo_user_data_key_t key; + +font_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0); +status = cairo_font_face_set_user_data (font_face, &key, + ft_face, (cairo_destroy_func_t) FT_Done_Face); +if (status) { + cairo_font_face_destroy (font_face); + FT_Done_Face (ft_face); + return ERROR; +} + + +Parameters + + + + + + +face +A FreeType face object, already opened. This must +be kept around until the face's ref_count drops to +zero and it is freed. Since the face may be referenced +internally to Cairo, the best way to determine when it +is safe to free the face is to pass a +cairo_destroy_func_t to cairo_font_face_set_user_data() + +load_flags +flags to pass to FT_Load_Glyph when loading +glyphs from the font. These flags are OR'ed together with +the flags derived from the cairo_font_options_t passed +to cairo_scaled_font_create(), so only a few values such +as FT_LOAD_VERTICAL_LAYOUT, and FT_LOAD_FORCE_AUTOHINT +are useful. You should not pass any of the flags affecting +the load target, such as FT_LOAD_TARGET_LIGHT. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.0 + +cairo_ft_font_face_create_for_pattern () +cairo_ft_font_face_create_for_pattern +cairo_font_face_t * +cairo_ft_font_face_create_for_pattern (FcPattern *pattern); +Creates a new font face for the FreeType font backend based on a +fontconfig pattern. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). The +cairo_scaled_font_t returned from cairo_scaled_font_create() is +also for the FreeType backend and can be used with functions such +as cairo_ft_scaled_font_lock_face(). +Font rendering options are represented both here and when you +call cairo_scaled_font_create(). Font options that have a representation +in a FcPattern must be passed in here; to modify FcPattern +appropriately to reflect the options in a cairo_font_options_t, call +cairo_ft_font_options_substitute(). +The pattern's FC_FT_FACE element is inspected first and if that is set, +that will be the FreeType font face associated with the returned cairo +font face. Otherwise the FC_FILE element is checked. If it's set, +that and the value of the FC_INDEX element (defaults to zero) of pattern + +are used to load a font face from file. +If both steps from the previous paragraph fails, pattern + will be passed +to FcConfigSubstitute, FcDefaultSubstitute, and finally FcFontMatch, +and the resulting font pattern is used. +If the FC_FT_FACE element of pattern + is set, the user is responsible +for making sure that the referenced FT_Face remains valid for the life +time of the returned cairo_font_face_t. See +cairo_ft_font_face_create_for_ft_face() for an example of how to couple +the life time of the FT_Face to that of the cairo font-face. + +Parameters + + + + + + +pattern +A fontconfig pattern. Cairo makes a copy of the pattern +if it needs to. You are free to modify or free pattern +after this call. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.0 + +cairo_ft_font_options_substitute () +cairo_ft_font_options_substitute +void +cairo_ft_font_options_substitute (const cairo_font_options_t *options, + FcPattern *pattern); +Add options to a FcPattern based on a cairo_font_options_t font +options object. Options that are already in the pattern, are not overridden, +so you should call this function after calling FcConfigSubstitute() (the +user's settings should override options based on the surface type), but +before calling FcDefaultSubstitute(). + +Parameters + + + + + + +options +a cairo_font_options_t object + +pattern +an existing FcPattern + + +Since 1.0 + +cairo_ft_scaled_font_lock_face () +cairo_ft_scaled_font_lock_face +FT_Face +cairo_ft_scaled_font_lock_face (cairo_scaled_font_t *scaled_font); +cairo_ft_scaled_font_lock_face() gets the FT_Face object from a FreeType +backend font and scales it appropriately for the font. You must +release the face with cairo_ft_scaled_font_unlock_face() +when you are done using it. Since the FT_Face object can be +shared between multiple cairo_scaled_font_t objects, you must not +lock any other font objects until you unlock this one. A count is +kept of the number of times cairo_ft_scaled_font_lock_face() is +called. cairo_ft_scaled_font_unlock_face() must be called the same number +of times. +You must be careful when using this function in a library or in a +threaded application, because freetype's design makes it unsafe to +call freetype functions simultaneously from multiple threads, (even +if using distinct FT_Face objects). Because of this, application +code that acquires an FT_Face object with this call must add its +own locking to protect any use of that object, (and which also must +protect any other calls into cairo as almost any cairo function +might result in a call into the freetype library). + +Parameters + + + + + + +scaled_font +A cairo_scaled_font_t from the FreeType font backend. Such an +object can be created by calling cairo_scaled_font_create() on a +FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), +cairo_ft_font_face_create_for_ft_face()). + + + +Returns + The FT_Face object for font +, scaled appropriately, +or NULL if scaled_font +is in an error state (see +cairo_scaled_font_status()) or there is insufficient memory. + +Since 1.0 + +cairo_ft_scaled_font_unlock_face () +cairo_ft_scaled_font_unlock_face +void +cairo_ft_scaled_font_unlock_face (cairo_scaled_font_t *scaled_font); +Releases a face obtained with cairo_ft_scaled_font_lock_face(). + +Parameters + + + + + + +scaled_font +A cairo_scaled_font_t from the FreeType font backend. Such an +object can be created by calling cairo_scaled_font_create() on a +FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), +cairo_ft_font_face_create_for_ft_face()). + + +Since 1.0 + +cairo_ft_font_face_get_synthesize () +cairo_ft_font_face_get_synthesize +unsigned int +cairo_ft_font_face_get_synthesize (cairo_font_face_t *font_face); +See cairo_ft_synthesize_t. + +Parameters + + + + + + +font_face +The cairo_ft_font_face_t object to query + + + +Returns + the current set of synthesis options. + +Since 1.12 + +cairo_ft_font_face_set_synthesize () +cairo_ft_font_face_set_synthesize +void +cairo_ft_font_face_set_synthesize (cairo_font_face_t *font_face, + unsigned int synth_flags); +FreeType provides the ability to synthesize different glyphs from a base +font, which is useful if you lack those glyphs from a true bold or oblique +font. See also cairo_ft_synthesize_t. + +Parameters + + + + + + +font_face +The cairo_ft_font_face_t object to modify + +synth_flags +the set of synthesis options to enable + + +Since 1.12 + +cairo_ft_font_face_unset_synthesize () +cairo_ft_font_face_unset_synthesize +void +cairo_ft_font_face_unset_synthesize (cairo_font_face_t *font_face, + unsigned int synth_flags); +See cairo_ft_font_face_set_synthesize(). + +Parameters + + + + + + +font_face +The cairo_ft_font_face_t object to modify + +synth_flags +the set of synthesis options to disable + + +Since 1.12 + + + +Types and Values + +CAIRO_HAS_FT_FONT +CAIRO_HAS_FT_FONT +#define CAIRO_HAS_FT_FONT 1 + +Defined if the FreeType font backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.0 + +CAIRO_HAS_FC_FONT +CAIRO_HAS_FC_FONT +#define CAIRO_HAS_FC_FONT 1 + +Defined if the Fontconfig-specific functions of the FreeType font backend +are available. +This macro can be used to conditionally compile backend-specific code. +Since 1.10 + +enum cairo_ft_synthesize_t +cairo_ft_synthesize_t +A set of synthesis options to control how FreeType renders the glyphs +for a particular font face. +Individual synthesis features of a cairo_ft_font_face_t can be set +using cairo_ft_font_face_set_synthesize(), or disabled using +cairo_ft_font_face_unset_synthesize(). The currently enabled set of +synthesis options can be queried with cairo_ft_font_face_get_synthesize(). +Note: that when synthesizing glyphs, the font metrics returned will only +be estimates. + +Members + + + + + + +CAIRO_FT_SYNTHESIZE_BOLD +Embolden the glyphs (redraw with a pixel offset) + + + +CAIRO_FT_SYNTHESIZE_OBLIQUE +Slant the glyph outline by 12 degrees to the +right. + + + + +Since 1.12 + + + +See Also +cairo_font_face_t + + + + diff --git a/doc/public/xml/cairo-image.xml b/doc/public/xml/cairo-image.xml new file mode 100644 index 000000000..d23785e7e --- /dev/null +++ b/doc/public/xml/cairo-image.xml @@ -0,0 +1,442 @@ + + +]> + + +Image Surfaces +3 + + CAIRO Library + + + +Image Surfaces +Rendering to memory buffers + + + +Functions + + + + + +int +cairo_format_stride_for_width () +cairo_surface_t * +cairo_image_surface_create () +cairo_surface_t * +cairo_image_surface_create_for_data () +unsigned char * +cairo_image_surface_get_data () +cairo_format_t +cairo_image_surface_get_format () +int +cairo_image_surface_get_width () +int +cairo_image_surface_get_height () +int +cairo_image_surface_get_stride () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_IMAGE_SURFACE +enumcairo_format_t + + + + + + +Object Hierarchy + + + + + + +Description +Image surfaces provide the ability to render to memory buffers +either allocated by cairo or by the calling code. The supported +image formats are those defined in cairo_format_t. + + + +Functions + +cairo_format_stride_for_width () +cairo_format_stride_for_width +int +cairo_format_stride_for_width (cairo_format_t format, + int width); +This function provides a stride value that will respect all +alignment requirements of the accelerated image-rendering code +within cairo. Typical usage will be of the form: + +int stride; +unsigned char *data; +cairo_surface_t *surface; + +stride = cairo_format_stride_for_width (format, width); +data = malloc (stride * height); +surface = cairo_image_surface_create_for_data (data, format, + width, height, + stride); + + +Parameters + + + + + + +format +A cairo_format_t value + +width +The desired width of an image surface to be created. + + + +Returns + the appropriate stride to use given the desired +format and width, or -1 if either the format is invalid or the width +too large. + +Since 1.6 + +cairo_image_surface_create () +cairo_image_surface_create +cairo_surface_t * +cairo_image_surface_create (cairo_format_t format, + int width, + int height); +Creates an image surface of the specified format and +dimensions. Initially the surface contents are all + +(Specifically, within each pixel, each color or alpha channel +belonging to format will be 0. The contents of bits within a pixel, +but not belonging to the given format are undefined). + + +Parameters + + + + + + +format +format of pixels in the surface to create + +width +width of the surface, in pixels + +height +height of the surface, in pixels + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.0 + +cairo_image_surface_create_for_data () +cairo_image_surface_create_for_data +cairo_surface_t * +cairo_image_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride); +Creates an image surface for the provided pixel data. The output +buffer must be kept around until the cairo_surface_t is destroyed +or cairo_surface_finish() is called on the surface. The initial +contents of data + will be used as the initial image contents; you +must explicitly clear the buffer, using, for example, +cairo_rectangle() and cairo_fill() if you want it cleared. +Note that the stride may be larger than +width*bytes_per_pixel to provide proper alignment for each pixel +and row. This alignment is required to allow high-performance rendering +within cairo. The correct way to obtain a legal stride value is to +call cairo_format_stride_for_width() with the desired format and +maximum image width value, and then use the resulting stride value +to allocate the data and to create the image surface. See +cairo_format_stride_for_width() for example code. + +Parameters + + + + + + +data +a pointer to a buffer supplied by the application in which +to write contents. This pointer must be suitably aligned for any +kind of variable, (for example, a pointer returned by malloc). + +format +the format of pixels in the buffer + +width +the width of the image to be stored in the buffer + +height +the height of the image to be stored in the buffer + +stride +the number of bytes between the start of rows in the +buffer as allocated. This value should always be computed by +cairo_format_stride_for_width() before allocating the data +buffer. + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface in the case of an error such as out of +memory or an invalid stride value. In case of invalid stride value +the error status of the returned surface will be +CAIRO_STATUS_INVALID_STRIDE. You can use +cairo_surface_status() to check for this. +See cairo_surface_set_user_data() for a means of attaching a +destroy-notification fallback to the surface if necessary. + +Since 1.0 + +cairo_image_surface_get_data () +cairo_image_surface_get_data +unsigned char * +cairo_image_surface_get_data (cairo_surface_t *surface); +Get a pointer to the data of the image surface, for direct +inspection or modification. +A call to cairo_surface_flush() is required before accessing the +pixel data to ensure that all pending drawing operations are +finished. A call to cairo_surface_mark_dirty() is required after +the data is modified. + +Parameters + + + + + + +surface +a cairo_image_surface_t + + + +Returns + a pointer to the image data of this surface or NULL +if surface +is not an image surface, or if cairo_surface_finish() +has been called. + +Since 1.2 + +cairo_image_surface_get_format () +cairo_image_surface_get_format +cairo_format_t +cairo_image_surface_get_format (cairo_surface_t *surface); +Get the format of the surface. + +Parameters + + + + + + +surface +a cairo_image_surface_t + + + +Returns + the format of the surface + +Since 1.2 + +cairo_image_surface_get_width () +cairo_image_surface_get_width +int +cairo_image_surface_get_width (cairo_surface_t *surface); +Get the width of the image surface in pixels. + +Parameters + + + + + + +surface +a cairo_image_surface_t + + + +Returns + the width of the surface in pixels. + +Since 1.0 + +cairo_image_surface_get_height () +cairo_image_surface_get_height +int +cairo_image_surface_get_height (cairo_surface_t *surface); +Get the height of the image surface in pixels. + +Parameters + + + + + + +surface +a cairo_image_surface_t + + + +Returns + the height of the surface in pixels. + +Since 1.0 + +cairo_image_surface_get_stride () +cairo_image_surface_get_stride +int +cairo_image_surface_get_stride (cairo_surface_t *surface); +Get the stride of the image surface in bytes + +Parameters + + + + + + +surface +a cairo_image_surface_t + + + +Returns + the stride of the image surface in bytes (or 0 if +surface +is not an image surface). The stride is the distance in +bytes from the beginning of one row of the image data to the +beginning of the next row. + +Since 1.2 + + + +Types and Values + +CAIRO_HAS_IMAGE_SURFACE +CAIRO_HAS_IMAGE_SURFACE +#define CAIRO_HAS_IMAGE_SURFACE 1 + +Defined if the image surface backend is available. +The image surface backend is always built in. +This macro was added for completeness in cairo 1.8. +Since 1.8 + +enum cairo_format_t +cairo_format_t +cairo_format_t is used to identify the memory format of +image data. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_FORMAT_INVALID +no such format exists or is supported. + + + +CAIRO_FORMAT_ARGB32 +each pixel is a 32-bit quantity, with + alpha in the upper 8 bits, then red, then green, then blue. + The 32-bit quantities are stored native-endian. Pre-multiplied + alpha is used. (That is, 50% transparent red is 0x80800000, + not 0x80ff0000.) (Since 1.0) + + + +CAIRO_FORMAT_RGB24 +each pixel is a 32-bit quantity, with + the upper 8 bits unused. Red, Green, and Blue are stored + in the remaining 24 bits in that order. (Since 1.0) + + + +CAIRO_FORMAT_A8 +each pixel is a 8-bit quantity holding + an alpha value. (Since 1.0) + + + +CAIRO_FORMAT_A1 +each pixel is a 1-bit quantity holding + an alpha value. Pixels are packed together into 32-bit + quantities. The ordering of the bits matches the + endianess of the platform. On a big-endian machine, the + first pixel is in the uppermost bit, on a little-endian + machine the first pixel is in the least-significant bit. (Since 1.0) + + + +CAIRO_FORMAT_RGB16_565 +each pixel is a 16-bit quantity + with red in the upper 5 bits, then green in the middle + 6 bits, and blue in the lower 5 bits. (Since 1.2) + + + +CAIRO_FORMAT_RGB30 +like RGB24 but with 10bpc. (Since 1.12) + + + + +Since 1.0 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-matrix.xml b/doc/public/xml/cairo-matrix.xml new file mode 100644 index 000000000..75aeb5a5a --- /dev/null +++ b/doc/public/xml/cairo-matrix.xml @@ -0,0 +1,588 @@ + + +]> + + +cairo_matrix_t +3 + + CAIRO Library + + + +cairo_matrix_t +Generic matrix operations + + + +Functions + + + + + +void +cairo_matrix_init () +void +cairo_matrix_init_identity () +void +cairo_matrix_init_translate () +void +cairo_matrix_init_scale () +void +cairo_matrix_init_rotate () +void +cairo_matrix_translate () +void +cairo_matrix_scale () +void +cairo_matrix_rotate () +cairo_status_t +cairo_matrix_invert () +void +cairo_matrix_multiply () +void +cairo_matrix_transform_distance () +void +cairo_matrix_transform_point () + + + + + + +Types and Values + + + + + +cairo_matrix_t + + + + + + +Object Hierarchy + + + + + + +Description +cairo_matrix_t is used throughout cairo to convert between different +coordinate spaces. A cairo_matrix_t holds an affine transformation, +such as a scale, rotation, shear, or a combination of these. +The transformation of a point (x,y) +is given by: + +x_new = xx * x + xy * y + x0; +y_new = yx * x + yy * y + y0; + +The current transformation matrix of a cairo_t, represented as a +cairo_matrix_t, defines the transformation from user-space +coordinates to device-space coordinates. See cairo_get_matrix() and +cairo_set_matrix(). + + + +Functions + +cairo_matrix_init () +cairo_matrix_init +void +cairo_matrix_init (cairo_matrix_t *matrix, + double xx, + double yx, + double xy, + double yy, + double x0, + double y0); +Sets matrix + to be the affine transformation given by +xx +, yx +, xy +, yy +, x0 +, y0 +. The transformation is given +by: + + x_new = xx * x + xy * y + x0; + y_new = yx * x + yy * y + y0; + + +Parameters + + + + + + +matrix +a cairo_matrix_t + +xx +xx component of the affine transformation + +yx +yx component of the affine transformation + +xy +xy component of the affine transformation + +yy +yy component of the affine transformation + +x0 +X translation component of the affine transformation + +y0 +Y translation component of the affine transformation + + +Since 1.0 + +cairo_matrix_init_identity () +cairo_matrix_init_identity +void +cairo_matrix_init_identity (cairo_matrix_t *matrix); +Modifies matrix + to be an identity transformation. + +Parameters + + + + + + +matrix +a cairo_matrix_t + + +Since 1.0 + +cairo_matrix_init_translate () +cairo_matrix_init_translate +void +cairo_matrix_init_translate (cairo_matrix_t *matrix, + double tx, + double ty); +Initializes matrix + to a transformation that translates by tx + and +ty + in the X and Y dimensions, respectively. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +tx +amount to translate in the X direction + +ty +amount to translate in the Y direction + + +Since 1.0 + +cairo_matrix_init_scale () +cairo_matrix_init_scale +void +cairo_matrix_init_scale (cairo_matrix_t *matrix, + double sx, + double sy); +Initializes matrix + to a transformation that scales by sx + and sy + +in the X and Y dimensions, respectively. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +sx +scale factor in the X direction + +sy +scale factor in the Y direction + + +Since 1.0 + +cairo_matrix_init_rotate () +cairo_matrix_init_rotate +void +cairo_matrix_init_rotate (cairo_matrix_t *matrix, + double radians); +Initialized matrix + to a transformation that rotates by radians +. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +radians +angle of rotation, in radians. The direction of rotation +is defined such that positive angles rotate in the direction from +the positive X axis toward the positive Y axis. With the default +axis orientation of cairo, positive angles rotate in a clockwise +direction. + + +Since 1.0 + +cairo_matrix_translate () +cairo_matrix_translate +void +cairo_matrix_translate (cairo_matrix_t *matrix, + double tx, + double ty); +Applies a translation by tx +, ty + to the transformation in +matrix +. The effect of the new transformation is to first translate +the coordinates by tx + and ty +, then apply the original transformation +to the coordinates. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +tx +amount to translate in the X direction + +ty +amount to translate in the Y direction + + +Since 1.0 + +cairo_matrix_scale () +cairo_matrix_scale +void +cairo_matrix_scale (cairo_matrix_t *matrix, + double sx, + double sy); +Applies scaling by sx +, sy + to the transformation in matrix +. The +effect of the new transformation is to first scale the coordinates +by sx + and sy +, then apply the original transformation to the coordinates. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +sx +scale factor in the X direction + +sy +scale factor in the Y direction + + +Since 1.0 + +cairo_matrix_rotate () +cairo_matrix_rotate +void +cairo_matrix_rotate (cairo_matrix_t *matrix, + double radians); +Applies rotation by radians + to the transformation in +matrix +. The effect of the new transformation is to first rotate the +coordinates by radians +, then apply the original transformation +to the coordinates. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +radians +angle of rotation, in radians. The direction of rotation +is defined such that positive angles rotate in the direction from +the positive X axis toward the positive Y axis. With the default +axis orientation of cairo, positive angles rotate in a clockwise +direction. + + +Since 1.0 + +cairo_matrix_invert () +cairo_matrix_invert +cairo_status_t +cairo_matrix_invert (cairo_matrix_t *matrix); +Changes matrix + to be the inverse of its original value. Not +all transformation matrices have inverses; if the matrix +collapses points together (it is degenerate), +then it has no inverse and this function will fail. + +Parameters + + + + + + +matrix +a cairo_matrix_t + + + +Returns + If matrix +has an inverse, modifies matrix +to +be the inverse matrix and returns CAIRO_STATUS_SUCCESS. Otherwise, +returns CAIRO_STATUS_INVALID_MATRIX. + +Since 1.0 + +cairo_matrix_multiply () +cairo_matrix_multiply +void +cairo_matrix_multiply (cairo_matrix_t *result, + const cairo_matrix_t *a, + const cairo_matrix_t *b); +Multiplies the affine transformations in a + and b + together +and stores the result in result +. The effect of the resulting +transformation is to first apply the transformation in a + to the +coordinates and then apply the transformation in b + to the +coordinates. +It is allowable for result + to be identical to either a + or b +. + +Parameters + + + + + + +result +a cairo_matrix_t in which to store the result + +a +a cairo_matrix_t + +b +a cairo_matrix_t + + +Since 1.0 + +cairo_matrix_transform_distance () +cairo_matrix_transform_distance +void +cairo_matrix_transform_distance (const cairo_matrix_t *matrix, + double *dx, + double *dy); +Transforms the distance vector (dx +,dy +) by matrix +. This is +similar to cairo_matrix_transform_point() except that the translation +components of the transformation are ignored. The calculation of +the returned vector is as follows: + +dx2 = dx1 * a + dy1 * c; +dy2 = dx1 * b + dy1 * d; + +Affine transformations are position invariant, so the same vector +always transforms to the same vector. If (x1 +,y1 +) transforms +to (x2 +,y2 +) then (x1 ++dx1 +,y1 ++dy1 +) will transform to +(x1 ++dx2 +,y1 ++dy2 +) for all values of x1 + and x2 +. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +dx +X component of a distance vector. An in/out parameter + +dy +Y component of a distance vector. An in/out parameter + + +Since 1.0 + +cairo_matrix_transform_point () +cairo_matrix_transform_point +void +cairo_matrix_transform_point (const cairo_matrix_t *matrix, + double *x, + double *y); +Transforms the point (x +, y +) by matrix +. + +Parameters + + + + + + +matrix +a cairo_matrix_t + +x +X position. An in/out parameter + +y +Y position. An in/out parameter + + +Since 1.0 + + + +Types and Values + +cairo_matrix_t +cairo_matrix_t +typedef struct { + double xx; double yx; + double xy; double yy; + double x0; double y0; +} cairo_matrix_t; + +A cairo_matrix_t holds an affine transformation, such as a scale, +rotation, shear, or a combination of those. The transformation of +a point (x, y) is given by: + + x_new = xx * x + xy * y + x0; + y_new = yx * x + yy * y + y0; + + +Members + + + + + + +double xx; +xx component of the affine transformation +xx component of the affine transformation + + +double yx; +yx component of the affine transformation +yx component of the affine transformation + + +double xy; +xy component of the affine transformation +xy component of the affine transformation + + +double yy; +yy component of the affine transformation +yy component of the affine transformation + + +double x0; +X translation component of the affine transformation +X translation component of the affine transformation + + +double y0; +Y translation component of the affine transformation +Y translation component of the affine transformation + + + + +Since 1.0 + + + +See Also +cairo_t + + + + diff --git a/doc/public/xml/cairo-paths.xml b/doc/public/xml/cairo-paths.xml new file mode 100644 index 000000000..5d4275660 --- /dev/null +++ b/doc/public/xml/cairo-paths.xml @@ -0,0 +1,1138 @@ + + +]> + + +Paths +3 + + CAIRO Library + + + +Paths +Creating paths and manipulating path data + + + +Functions + + + + + +cairo_path_t * +cairo_copy_path () +cairo_path_t * +cairo_copy_path_flat () +void +cairo_path_destroy () +void +cairo_append_path () +cairo_bool_t +cairo_has_current_point () +void +cairo_get_current_point () +void +cairo_new_path () +void +cairo_new_sub_path () +void +cairo_close_path () +void +cairo_arc () +void +cairo_arc_negative () +void +cairo_curve_to () +void +cairo_line_to () +void +cairo_move_to () +void +cairo_rectangle () +void +cairo_glyph_path () +void +cairo_text_path () +void +cairo_rel_curve_to () +void +cairo_rel_line_to () +void +cairo_rel_move_to () +void +cairo_path_extents () + + + + + + +Types and Values + + + + + +cairo_path_t +unioncairo_path_data_t +enumcairo_path_data_type_t + + + + + + +Object Hierarchy + + + + + + +Description +Paths are the most basic drawing tools and are primarily used to implicitly +generate simple masks. + + + +Functions + +cairo_copy_path () +cairo_copy_path +cairo_path_t * +cairo_copy_path (cairo_t *cr); +Creates a copy of the current path and returns it to the user as a +cairo_path_t. See cairo_path_data_t for hints on how to iterate +over the returned data structure. +This function will always return a valid pointer, but the result +will have no data (data==NULL and +num_data==0), if either of the following +conditions hold: + +If there is insufficient memory to copy the path. In this + case path->status will be set to + CAIRO_STATUS_NO_MEMORY. +If cr is already in an error state. In this case + path->status will contain the same status that + would be returned by cairo_status(). + + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the copy of the current path. The caller owns the +returned object and should call cairo_path_destroy() when finished +with it. + +Since 1.0 + +cairo_copy_path_flat () +cairo_copy_path_flat +cairo_path_t * +cairo_copy_path_flat (cairo_t *cr); +Gets a flattened copy of the current path and returns it to the +user as a cairo_path_t. See cairo_path_data_t for hints on +how to iterate over the returned data structure. +This function is like cairo_copy_path() except that any curves +in the path will be approximated with piecewise-linear +approximations, (accurate to within the current tolerance +value). That is, the result is guaranteed to not have any elements +of type CAIRO_PATH_CURVE_TO which will instead be replaced by a +series of CAIRO_PATH_LINE_TO elements. +This function will always return a valid pointer, but the result +will have no data (data==NULL and +num_data==0), if either of the following +conditions hold: + +If there is insufficient memory to copy the path. In this + case path->status will be set to + CAIRO_STATUS_NO_MEMORY. +If cr is already in an error state. In this case + path->status will contain the same status that + would be returned by cairo_status(). + + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the copy of the current path. The caller owns the +returned object and should call cairo_path_destroy() when finished +with it. + +Since 1.0 + +cairo_path_destroy () +cairo_path_destroy +void +cairo_path_destroy (cairo_path_t *path); +Immediately releases all memory associated with path +. After a call +to cairo_path_destroy() the path + pointer is no longer valid and +should not be used further. +Note: cairo_path_destroy() should only be called with a +pointer to a cairo_path_t returned by a cairo function. Any path +that is created manually (ie. outside of cairo) should be destroyed +manually as well. + +Parameters + + + + + + +path +a path previously returned by either cairo_copy_path() or +cairo_copy_path_flat(). + + +Since 1.0 + +cairo_append_path () +cairo_append_path +void +cairo_append_path (cairo_t *cr, + const cairo_path_t *path); +Append the path + onto the current path. The path + may be either the +return value from one of cairo_copy_path() or +cairo_copy_path_flat() or it may be constructed manually. See +cairo_path_t for details on how the path data structure should be +initialized, and note that path->status must be +initialized to CAIRO_STATUS_SUCCESS. + +Parameters + + + + + + +cr +a cairo context + +path +path to be appended + + +Since 1.0 + +cairo_has_current_point () +cairo_has_current_point +cairo_bool_t +cairo_has_current_point (cairo_t *cr); +Returns whether a current point is defined on the current path. +See cairo_get_current_point() for details on the current point. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + whether a current point is defined. + +Since 1.6 + +cairo_get_current_point () +cairo_get_current_point +void +cairo_get_current_point (cairo_t *cr, + double *x, + double *y); +Gets the current point of the current path, which is +conceptually the final point reached by the path so far. +The current point is returned in the user-space coordinate +system. If there is no defined current point or if cr + is in an +error status, x + and y + will both be set to 0.0. It is possible to +check this in advance with cairo_has_current_point(). +Most path construction functions alter the current point. See the +following for details on how they affect the current point: +cairo_new_path(), cairo_new_sub_path(), +cairo_append_path(), cairo_close_path(), +cairo_move_to(), cairo_line_to(), cairo_curve_to(), +cairo_rel_move_to(), cairo_rel_line_to(), cairo_rel_curve_to(), +cairo_arc(), cairo_arc_negative(), cairo_rectangle(), +cairo_text_path(), cairo_glyph_path(), cairo_stroke_to_path(). +Some functions use and alter the current point but do not +otherwise change current path: +cairo_show_text(). +Some functions unset the current path and as a result, current point: +cairo_fill(), cairo_stroke(). + +Parameters + + + + + + +cr +a cairo context + +x +return value for X coordinate of the current point + +y +return value for Y coordinate of the current point + + +Since 1.0 + +cairo_new_path () +cairo_new_path +void +cairo_new_path (cairo_t *cr); +Clears the current path. After this call there will be no path and +no current point. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_new_sub_path () +cairo_new_sub_path +void +cairo_new_sub_path (cairo_t *cr); +Begin a new sub-path. Note that the existing path is not +affected. After this call there will be no current point. +In many cases, this call is not needed since new sub-paths are +frequently started with cairo_move_to(). +A call to cairo_new_sub_path() is particularly useful when +beginning a new sub-path with one of the cairo_arc() calls. This +makes things easier as it is no longer necessary to manually +compute the arc's initial coordinates for a call to +cairo_move_to(). + +Parameters + + + + + + +cr +a cairo context + + +Since 1.2 + +cairo_close_path () +cairo_close_path +void +cairo_close_path (cairo_t *cr); +Adds a line segment to the path from the current point to the +beginning of the current sub-path, (the most recent point passed to +cairo_move_to()), and closes this sub-path. After this call the +current point will be at the joined endpoint of the sub-path. +The behavior of cairo_close_path() is distinct from simply calling +cairo_line_to() with the equivalent coordinate in the case of +stroking. When a closed sub-path is stroked, there are no caps on +the ends of the sub-path. Instead, there is a line join connecting +the final and initial segments of the sub-path. +If there is no current point before the call to cairo_close_path(), +this function will have no effect. +Note: As of cairo version 1.2.4 any call to cairo_close_path() will +place an explicit MOVE_TO element into the path immediately after +the CLOSE_PATH element, (which can be seen in cairo_copy_path() for +example). This can simplify path processing in some cases as it may +not be necessary to save the "last move_to point" during processing +as the MOVE_TO immediately after the CLOSE_PATH will provide that +point. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_arc () +cairo_arc +void +cairo_arc (cairo_t *cr, + double xc, + double yc, + double radius, + double angle1, + double angle2); +Adds a circular arc of the given radius + to the current path. The +arc is centered at (xc +, yc +), begins at angle1 + and proceeds in +the direction of increasing angles to end at angle2 +. If angle2 + is +less than angle1 + it will be progressively increased by +2*M_PI until it is greater than angle1 +. +If there is a current point, an initial line segment will be added +to the path to connect the current point to the beginning of the +arc. If this initial line is undesired, it can be avoided by +calling cairo_new_sub_path() before calling cairo_arc(). +Angles are measured in radians. An angle of 0.0 is in the direction +of the positive X axis (in user space). An angle of +M_PI/2.0 radians (90 degrees) is in the +direction of the positive Y axis (in user space). Angles increase +in the direction from the positive X axis toward the positive Y +axis. So with the default transformation matrix, angles increase in +a clockwise direction. +(To convert from degrees to radians, use degrees * (M_PI / +180.).) +This function gives the arc in the direction of increasing angles; +see cairo_arc_negative() to get the arc in the direction of +decreasing angles. +The arc is circular in user space. To achieve an elliptical arc, +you can scale the current transformation matrix by different +amounts in the X and Y directions. For example, to draw an ellipse +in the box given by x +, y +, width +, height +: + +cairo_save (cr); +cairo_translate (cr, x + width / 2., y + height / 2.); +cairo_scale (cr, width / 2., height / 2.); +cairo_arc (cr, 0., 0., 1., 0., 2 * M_PI); +cairo_restore (cr); + + +Parameters + + + + + + +cr +a cairo context + +xc +X position of the center of the arc + +yc +Y position of the center of the arc + +radius +the radius of the arc + +angle1 +the start angle, in radians + +angle2 +the end angle, in radians + + +Since 1.0 + +cairo_arc_negative () +cairo_arc_negative +void +cairo_arc_negative (cairo_t *cr, + double xc, + double yc, + double radius, + double angle1, + double angle2); +Adds a circular arc of the given radius + to the current path. The +arc is centered at (xc +, yc +), begins at angle1 + and proceeds in +the direction of decreasing angles to end at angle2 +. If angle2 + is +greater than angle1 + it will be progressively decreased by +2*M_PI until it is less than angle1 +. +See cairo_arc() for more details. This function differs only in the +direction of the arc between the two angles. + +Parameters + + + + + + +cr +a cairo context + +xc +X position of the center of the arc + +yc +Y position of the center of the arc + +radius +the radius of the arc + +angle1 +the start angle, in radians + +angle2 +the end angle, in radians + + +Since 1.0 + +cairo_curve_to () +cairo_curve_to +void +cairo_curve_to (cairo_t *cr, + double x1, + double y1, + double x2, + double y2, + double x3, + double y3); +Adds a cubic Bézier spline to the path from the current point to +position (x3 +, y3 +) in user-space coordinates, using (x1 +, y1 +) and +(x2 +, y2 +) as the control points. After this call the current point +will be (x3 +, y3 +). +If there is no current point before the call to cairo_curve_to() +this function will behave as if preceded by a call to +cairo_move_to(cr +, x1 +, y1 +). + +Parameters + + + + + + +cr +a cairo context + +x1 +the X coordinate of the first control point + +y1 +the Y coordinate of the first control point + +x2 +the X coordinate of the second control point + +y2 +the Y coordinate of the second control point + +x3 +the X coordinate of the end of the curve + +y3 +the Y coordinate of the end of the curve + + +Since 1.0 + +cairo_line_to () +cairo_line_to +void +cairo_line_to (cairo_t *cr, + double x, + double y); +Adds a line to the path from the current point to position (x +, y +) +in user-space coordinates. After this call the current point +will be (x +, y +). +If there is no current point before the call to cairo_line_to() +this function will behave as cairo_move_to(cr +, x +, y +). + +Parameters + + + + + + +cr +a cairo context + +x +the X coordinate of the end of the new line + +y +the Y coordinate of the end of the new line + + +Since 1.0 + +cairo_move_to () +cairo_move_to +void +cairo_move_to (cairo_t *cr, + double x, + double y); +Begin a new sub-path. After this call the current point will be (x +, +y +). + +Parameters + + + + + + +cr +a cairo context + +x +the X coordinate of the new position + +y +the Y coordinate of the new position + + +Since 1.0 + +cairo_rectangle () +cairo_rectangle +void +cairo_rectangle (cairo_t *cr, + double x, + double y, + double width, + double height); +Adds a closed sub-path rectangle of the given size to the current +path at position (x +, y +) in user-space coordinates. +This function is logically equivalent to: + +cairo_move_to (cr, x, y); +cairo_rel_line_to (cr, width, 0); +cairo_rel_line_to (cr, 0, height); +cairo_rel_line_to (cr, -width, 0); +cairo_close_path (cr); + + +Parameters + + + + + + +cr +a cairo context + +x +the X coordinate of the top left corner of the rectangle + +y +the Y coordinate to the top left corner of the rectangle + +width +the width of the rectangle + +height +the height of the rectangle + + +Since 1.0 + +cairo_glyph_path () +cairo_glyph_path +void +cairo_glyph_path (cairo_t *cr, + const cairo_glyph_t *glyphs, + int num_glyphs); +Adds closed paths for the glyphs to the current path. The generated +path if filled, achieves an effect similar to that of +cairo_show_glyphs(). + +Parameters + + + + + + +cr +a cairo context + +glyphs +array of glyphs to show + +num_glyphs +number of glyphs to show + + +Since 1.0 + +cairo_text_path () +cairo_text_path +void +cairo_text_path (cairo_t *cr, + const char *utf8); +Adds closed paths for text to the current path. The generated +path if filled, achieves an effect similar to that of +cairo_show_text(). +Text conversion and positioning is done similar to cairo_show_text(). +Like cairo_show_text(), After this call the current point is +moved to the origin of where the next glyph would be placed in +this same progression. That is, the current point will be at +the origin of the final glyph offset by its advance values. +This allows for chaining multiple calls to to cairo_text_path() +without having to set current point in between. +Note: The cairo_text_path() function call is part of what the cairo +designers call the "toy" text API. It is convenient for short demos +and simple programs, but it is not expected to be adequate for +serious text-using applications. See cairo_glyph_path() for the +"real" text path API in cairo. + +Parameters + + + + + + +cr +a cairo context + +utf8 +a NUL-terminated string of text encoded in UTF-8, or NULL + + +Since 1.0 + +cairo_rel_curve_to () +cairo_rel_curve_to +void +cairo_rel_curve_to (cairo_t *cr, + double dx1, + double dy1, + double dx2, + double dy2, + double dx3, + double dy3); +Relative-coordinate version of cairo_curve_to(). All offsets are +relative to the current point. Adds a cubic Bézier spline to the +path from the current point to a point offset from the current +point by (dx3 +, dy3 +), using points offset by (dx1 +, dy1 +) and +(dx2 +, dy2 +) as the control points. After this call the current +point will be offset by (dx3 +, dy3 +). +Given a current point of (x, y), cairo_rel_curve_to(cr +, dx1 +, +dy1 +, dx2 +, dy2 +, dx3 +, dy3 +) is logically equivalent to +cairo_curve_to(cr +, x+dx1 +, y+dy1 +, x+dx2 +, y+dy2 +, x+dx3 +, y+dy3 +). +It is an error to call this function with no current point. Doing +so will cause cr + to shutdown with a status of +CAIRO_STATUS_NO_CURRENT_POINT. + +Parameters + + + + + + +cr +a cairo context + +dx1 +the X offset to the first control point + +dy1 +the Y offset to the first control point + +dx2 +the X offset to the second control point + +dy2 +the Y offset to the second control point + +dx3 +the X offset to the end of the curve + +dy3 +the Y offset to the end of the curve + + +Since 1.0 + +cairo_rel_line_to () +cairo_rel_line_to +void +cairo_rel_line_to (cairo_t *cr, + double dx, + double dy); +Relative-coordinate version of cairo_line_to(). Adds a line to the +path from the current point to a point that is offset from the +current point by (dx +, dy +) in user space. After this call the +current point will be offset by (dx +, dy +). +Given a current point of (x, y), cairo_rel_line_to(cr +, dx +, dy +) +is logically equivalent to cairo_line_to(cr +, x + dx +, y + dy +). +It is an error to call this function with no current point. Doing +so will cause cr + to shutdown with a status of +CAIRO_STATUS_NO_CURRENT_POINT. + +Parameters + + + + + + +cr +a cairo context + +dx +the X offset to the end of the new line + +dy +the Y offset to the end of the new line + + +Since 1.0 + +cairo_rel_move_to () +cairo_rel_move_to +void +cairo_rel_move_to (cairo_t *cr, + double dx, + double dy); +Begin a new sub-path. After this call the current point will offset +by (x +, y +). +Given a current point of (x, y), cairo_rel_move_to(cr +, dx +, dy +) +is logically equivalent to cairo_move_to(cr +, x + dx +, y + dy +). +It is an error to call this function with no current point. Doing +so will cause cr + to shutdown with a status of +CAIRO_STATUS_NO_CURRENT_POINT. + +Parameters + + + + + + +cr +a cairo context + +dx +the X offset + +dy +the Y offset + + +Since 1.0 + +cairo_path_extents () +cairo_path_extents +void +cairo_path_extents (cairo_t *cr, + double *x1, + double *y1, + double *x2, + double *y2); +Computes a bounding box in user-space coordinates covering the +points on the current path. If the current path is empty, returns +an empty rectangle ((0,0), (0,0)). Stroke parameters, fill rule, +surface dimensions and clipping are not taken into account. +Contrast with cairo_fill_extents() and cairo_stroke_extents() which +return the extents of only the area that would be "inked" by +the corresponding drawing operations. +The result of cairo_path_extents() is defined as equivalent to the +limit of cairo_stroke_extents() with CAIRO_LINE_CAP_ROUND as the +line width approaches 0.0, (but never reaching the empty-rectangle +returned by cairo_stroke_extents() for a line width of 0.0). +Specifically, this means that zero-area sub-paths such as +cairo_move_to();cairo_line_to() segments, (even degenerate cases +where the coordinates to both calls are identical), will be +considered as contributing to the extents. However, a lone +cairo_move_to() will not contribute to the results of +cairo_path_extents(). + +Parameters + + + + + + +cr +a cairo context + +x1 +left of the resulting extents + +y1 +top of the resulting extents + +x2 +right of the resulting extents + +y2 +bottom of the resulting extents + + +Since 1.6 + + + +Types and Values + +cairo_path_t +cairo_path_t +typedef struct { + cairo_status_t status; + cairo_path_data_t *data; + int num_data; +} cairo_path_t; + +A data structure for holding a path. This data structure serves as +the return value for cairo_copy_path() and +cairo_copy_path_flat() as well the input value for +cairo_append_path(). +See cairo_path_data_t for hints on how to iterate over the +actual data within the path. +The num_data member gives the number of elements in the data +array. This number is larger than the number of independent path +portions (defined in cairo_path_data_type_t), since the data +includes both headers and coordinates for each portion. + +Members + + + + + + +cairo_status_t status; +the current error status +the current error status + + +cairo_path_data_t *data; +the elements in the path +the elements in the path + + +int num_data; +the number of elements in the data array +the number of elements in the data array + + + + +Since 1.0 + +union cairo_path_data_t +cairo_path_data_t +cairo_path_data_t is used to represent the path data inside a +cairo_path_t. +The data structure is designed to try to balance the demands of +efficiency and ease-of-use. A path is represented as an array of +cairo_path_data_t, which is a union of headers and points. +Each portion of the path is represented by one or more elements in +the array, (one header followed by 0 or more points). The length +value of the header is the number of array elements for the current +portion including the header, (ie. length == 1 + # of points), and +where the number of points for each element type is as follows: + + %CAIRO_PATH_MOVE_TO: 1 point + %CAIRO_PATH_LINE_TO: 1 point + %CAIRO_PATH_CURVE_TO: 3 points + %CAIRO_PATH_CLOSE_PATH: 0 points + +The semantics and ordering of the coordinate values are consistent +with cairo_move_to(), cairo_line_to(), cairo_curve_to(), and +cairo_close_path(). +Here is sample code for iterating through a cairo_path_t: + + int i; + cairo_path_t *path; + cairo_path_data_t *data; +  + path = cairo_copy_path (cr); +  + for (i=0; i < path->num_data; i += path->data[i].header.length) { + data = &path->data[i]; + switch (data->header.type) { + case CAIRO_PATH_MOVE_TO: + do_move_to_things (data[1].point.x, data[1].point.y); + break; + case CAIRO_PATH_LINE_TO: + do_line_to_things (data[1].point.x, data[1].point.y); + break; + case CAIRO_PATH_CURVE_TO: + do_curve_to_things (data[1].point.x, data[1].point.y, + data[2].point.x, data[2].point.y, + data[3].point.x, data[3].point.y); + break; + case CAIRO_PATH_CLOSE_PATH: + do_close_path_things (); + break; + } + } + cairo_path_destroy (path); + +As of cairo 1.4, cairo does not mind if there are more elements in +a portion of the path than needed. Such elements can be used by +users of the cairo API to hold extra values in the path data +structure. For this reason, it is recommended that applications +always use data->header.length to +iterate over the path data, instead of hardcoding the number of +elements for each element type. +Since 1.0 + +enum cairo_path_data_type_t +cairo_path_data_type_t +cairo_path_data_t is used to describe the type of one portion +of a path when represented as a cairo_path_t. +See cairo_path_data_t for details. + +Members + + + + + + +CAIRO_PATH_MOVE_TO +A move-to operation, since 1.0 + + + +CAIRO_PATH_LINE_TO +A line-to operation, since 1.0 + + + +CAIRO_PATH_CURVE_TO +A curve-to operation, since 1.0 + + + +CAIRO_PATH_CLOSE_PATH +A close-path operation, since 1.0 + + + + +Since 1.0 + + + + diff --git a/doc/public/xml/cairo-pattern.xml b/doc/public/xml/cairo-pattern.xml new file mode 100644 index 000000000..90074102a --- /dev/null +++ b/doc/public/xml/cairo-pattern.xml @@ -0,0 +1,1997 @@ + + +]> + + +cairo_pattern_t +3 + + CAIRO Library + + + +cairo_pattern_t +Sources for drawing + + + +Functions + + + + + +void +cairo_pattern_add_color_stop_rgb () +void +cairo_pattern_add_color_stop_rgba () +cairo_status_t +cairo_pattern_get_color_stop_count () +cairo_status_t +cairo_pattern_get_color_stop_rgba () +cairo_pattern_t * +cairo_pattern_create_rgb () +cairo_pattern_t * +cairo_pattern_create_rgba () +cairo_status_t +cairo_pattern_get_rgba () +cairo_pattern_t * +cairo_pattern_create_for_surface () +cairo_status_t +cairo_pattern_get_surface () +cairo_pattern_t * +cairo_pattern_create_linear () +cairo_status_t +cairo_pattern_get_linear_points () +cairo_pattern_t * +cairo_pattern_create_radial () +cairo_status_t +cairo_pattern_get_radial_circles () +cairo_pattern_t * +cairo_pattern_create_mesh () +void +cairo_mesh_pattern_begin_patch () +void +cairo_mesh_pattern_end_patch () +void +cairo_mesh_pattern_move_to () +void +cairo_mesh_pattern_line_to () +void +cairo_mesh_pattern_curve_to () +void +cairo_mesh_pattern_set_control_point () +void +cairo_mesh_pattern_set_corner_color_rgb () +void +cairo_mesh_pattern_set_corner_color_rgba () +cairo_status_t +cairo_mesh_pattern_get_patch_count () +cairo_path_t * +cairo_mesh_pattern_get_path () +cairo_status_t +cairo_mesh_pattern_get_control_point () +cairo_status_t +cairo_mesh_pattern_get_corner_color_rgba () +cairo_pattern_t * +cairo_pattern_reference () +void +cairo_pattern_destroy () +cairo_status_t +cairo_pattern_status () +void +cairo_pattern_set_extend () +cairo_extend_t +cairo_pattern_get_extend () +void +cairo_pattern_set_filter () +cairo_filter_t +cairo_pattern_get_filter () +void +cairo_pattern_set_matrix () +void +cairo_pattern_get_matrix () +cairo_pattern_type_t +cairo_pattern_get_type () +unsigned int +cairo_pattern_get_reference_count () +cairo_status_t +cairo_pattern_set_user_data () +void * +cairo_pattern_get_user_data () + + + + + + +Types and Values + + + + + +typedefcairo_pattern_t +enumcairo_extend_t +enumcairo_filter_t +enumcairo_pattern_type_t + + + + + + +Object Hierarchy + + + + + + +Description +cairo_pattern_t is the paint with which cairo draws. +The primary use of patterns is as the source for all cairo drawing +operations, although they can also be used as masks, that is, as the +brush too. +A cairo pattern is created by using one of the many constructors, +of the form +cairo_pattern_create_type() +or implicitly through +cairo_set_source_type() +functions. + + + +Functions + +cairo_pattern_add_color_stop_rgb () +cairo_pattern_add_color_stop_rgb +void +cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern, + double offset, + double red, + double green, + double blue); +Adds an opaque color stop to a gradient pattern. The offset +specifies the location along the gradient's control vector. For +example, a linear gradient's control vector is from (x0,y0) to +(x1,y1) while a radial gradient's control vector is from any point +on the start circle to the corresponding point on the end circle. +The color is specified in the same way as in cairo_set_source_rgb(). +If two (or more) stops are specified with identical offset values, +they will be sorted according to the order in which the stops are +added, (stops added earlier will compare less than stops added +later). This can be useful for reliably making sharp color +transitions instead of the typical blend. +Note: If the pattern is not a gradient pattern, (eg. a linear or +radial pattern), then the pattern will be put into an error status +with a status of CAIRO_STATUS_PATTERN_TYPE_MISMATCH. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +offset +an offset in the range [0.0 .. 1.0] + +red +red component of color + +green +green component of color + +blue +blue component of color + + +Since 1.0 + +cairo_pattern_add_color_stop_rgba () +cairo_pattern_add_color_stop_rgba +void +cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern, + double offset, + double red, + double green, + double blue, + double alpha); +Adds a translucent color stop to a gradient pattern. The offset +specifies the location along the gradient's control vector. For +example, a linear gradient's control vector is from (x0,y0) to +(x1,y1) while a radial gradient's control vector is from any point +on the start circle to the corresponding point on the end circle. +The color is specified in the same way as in cairo_set_source_rgba(). +If two (or more) stops are specified with identical offset values, +they will be sorted according to the order in which the stops are +added, (stops added earlier will compare less than stops added +later). This can be useful for reliably making sharp color +transitions instead of the typical blend. +Note: If the pattern is not a gradient pattern, (eg. a linear or +radial pattern), then the pattern will be put into an error status +with a status of CAIRO_STATUS_PATTERN_TYPE_MISMATCH. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +offset +an offset in the range [0.0 .. 1.0] + +red +red component of color + +green +green component of color + +blue +blue component of color + +alpha +alpha component of color + + +Since 1.0 + +cairo_pattern_get_color_stop_count () +cairo_pattern_get_color_stop_count +cairo_status_t +cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern, + int *count); +Gets the number of color stops specified in the given gradient +pattern. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +count +return value for the number of color stops, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a gradient +pattern. + +Since 1.4 + +cairo_pattern_get_color_stop_rgba () +cairo_pattern_get_color_stop_rgba +cairo_status_t +cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern, + int index, + double *offset, + double *red, + double *green, + double *blue, + double *alpha); +Gets the color and offset information at the given index + for a +gradient pattern. Values of index + range from 0 to n-1 +where n is the number returned +by cairo_pattern_get_color_stop_count(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + +index +index of the stop to return data for + +offset +return value for the offset of the stop, or NULL + +red +return value for red component of color, or NULL + +green +return value for green component of color, or NULL + +blue +return value for blue component of color, or NULL + +alpha +return value for alpha component of color, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or CAIRO_STATUS_INVALID_INDEX +if index +is not valid for the given pattern. If the pattern is +not a gradient pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH is +returned. + +Since 1.4 + +cairo_pattern_create_rgb () +cairo_pattern_create_rgb +cairo_pattern_t * +cairo_pattern_create_rgb (double red, + double green, + double blue); +Creates a new cairo_pattern_t corresponding to an opaque color. The +color components are floating point numbers in the range 0 to 1. +If the values passed in are outside that range, they will be +clamped. + +Parameters + + + + + + +red +red component of the color + +green +green component of the color + +blue +blue component of the color + + + +Returns + the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it. +This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status(). + +Since 1.0 + +cairo_pattern_create_rgba () +cairo_pattern_create_rgba +cairo_pattern_t * +cairo_pattern_create_rgba (double red, + double green, + double blue, + double alpha); +Creates a new cairo_pattern_t corresponding to a translucent color. +The color components are floating point numbers in the range 0 to + +If the values passed in are outside that range, they will be +clamped. + + +Parameters + + + + + + +red +red component of the color + +green +green component of the color + +blue +blue component of the color + +alpha +alpha component of the color + + + +Returns + the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it. +This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status(). + +Since 1.0 + +cairo_pattern_get_rgba () +cairo_pattern_get_rgba +cairo_status_t +cairo_pattern_get_rgba (cairo_pattern_t *pattern, + double *red, + double *green, + double *blue, + double *alpha); +Gets the solid color for a solid color pattern. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +red +return value for red component of color, or NULL + +green +return value for green component of color, or NULL + +blue +return value for blue component of color, or NULL + +alpha +return value for alpha component of color, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a solid +color pattern. + +Since 1.4 + +cairo_pattern_create_for_surface () +cairo_pattern_create_for_surface +cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface); +Create a new cairo_pattern_t for the given surface. + +Parameters + + + + + + +surface +the surface + + + +Returns + the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it. +This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status(). + +Since 1.0 + +cairo_pattern_get_surface () +cairo_pattern_get_surface +cairo_status_t +cairo_pattern_get_surface (cairo_pattern_t *pattern, + cairo_surface_t **surface); +Gets the surface of a surface pattern. The reference returned in +surface + is owned by the pattern; the caller should call +cairo_surface_reference() if the surface is to be retained. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +surface +return value for surface of pattern, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a surface +pattern. + +Since 1.4 + +cairo_pattern_create_linear () +cairo_pattern_create_linear +cairo_pattern_t * +cairo_pattern_create_linear (double x0, + double y0, + double x1, + double y1); +Create a new linear gradient cairo_pattern_t along the line defined +by (x0, y0) and (x1, y1). Before using the gradient pattern, a +number of color stops should be defined using +cairo_pattern_add_color_stop_rgb() or +cairo_pattern_add_color_stop_rgba(). +Note: The coordinates here are in pattern space. For a new pattern, +pattern space is identical to user space, but the relationship +between the spaces can be changed with cairo_pattern_set_matrix(). + +Parameters + + + + + + +x0 +x coordinate of the start point + +y0 +y coordinate of the start point + +x1 +x coordinate of the end point + +y1 +y coordinate of the end point + + + +Returns + the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it. +This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status(). + +Since 1.0 + +cairo_pattern_get_linear_points () +cairo_pattern_get_linear_points +cairo_status_t +cairo_pattern_get_linear_points (cairo_pattern_t *pattern, + double *x0, + double *y0, + double *x1, + double *y1); +Gets the gradient endpoints for a linear gradient. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +x0 +return value for the x coordinate of the first point, or NULL + +y0 +return value for the y coordinate of the first point, or NULL + +x1 +return value for the x coordinate of the second point, or NULL + +y1 +return value for the y coordinate of the second point, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a linear +gradient pattern. + +Since 1.4 + +cairo_pattern_create_radial () +cairo_pattern_create_radial +cairo_pattern_t * +cairo_pattern_create_radial (double cx0, + double cy0, + double radius0, + double cx1, + double cy1, + double radius1); +Creates a new radial gradient cairo_pattern_t between the two +circles defined by (cx0, cy0, radius0) and (cx1, cy1, radius1). Before using the +gradient pattern, a number of color stops should be defined using +cairo_pattern_add_color_stop_rgb() or +cairo_pattern_add_color_stop_rgba(). +Note: The coordinates here are in pattern space. For a new pattern, +pattern space is identical to user space, but the relationship +between the spaces can be changed with cairo_pattern_set_matrix(). + +Parameters + + + + + + +cx0 +x coordinate for the center of the start circle + +cy0 +y coordinate for the center of the start circle + +radius0 +radius of the start circle + +cx1 +x coordinate for the center of the end circle + +cy1 +y coordinate for the center of the end circle + +radius1 +radius of the end circle + + + +Returns + the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the +returned object and should call cairo_pattern_destroy() when +finished with it. +This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect +the status of a pattern use cairo_pattern_status(). + +Since 1.0 + +cairo_pattern_get_radial_circles () +cairo_pattern_get_radial_circles +cairo_status_t +cairo_pattern_get_radial_circles (cairo_pattern_t *pattern, + double *x0, + double *y0, + double *r0, + double *x1, + double *y1, + double *r1); +Gets the gradient endpoint circles for a radial gradient, each +specified as a center coordinate and a radius. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +x0 +return value for the x coordinate of the center of the first circle, or NULL + +y0 +return value for the y coordinate of the center of the first circle, or NULL + +r0 +return value for the radius of the first circle, or NULL + +x1 +return value for the x coordinate of the center of the second circle, or NULL + +y1 +return value for the y coordinate of the center of the second circle, or NULL + +r1 +return value for the radius of the second circle, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a radial +gradient pattern. + +Since 1.4 + +cairo_pattern_create_mesh () +cairo_pattern_create_mesh +cairo_pattern_t * +cairo_pattern_create_mesh (void); +Create a new mesh pattern. +Mesh patterns are tensor-product patch meshes (type 7 shadings in +PDF). Mesh patterns may also be used to create other types of +shadings that are special cases of tensor-product patch meshes such +as Coons patch meshes (type 6 shading in PDF) and Gouraud-shaded +triangle meshes (type 4 and 5 shadings in PDF). +Mesh patterns consist of one or more tensor-product patches, which +should be defined before using the mesh pattern. Using a mesh +pattern with a partially defined patch as source or mask will put +the context in an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. +A tensor-product patch is defined by 4 Bézier curves (side 0, 1, 2, +3) and by 4 additional control points (P0, P1, P2, P3) that provide +further control over the patch and complete the definition of the +tensor-product patch. The corner C0 is the first point of the +patch. +Degenerate sides are permitted so straight lines may be used. A +zero length line on one side may be used to create 3 sided patches. + + C1 Side 1 C2 + +---------------+ + | | + | P1 P2 | + | | +Side 0 | | Side 2 + | | + | | + | P0 P3 | + | | + +---------------+ + C0 Side 3 C3 + +Each patch is constructed by first calling +cairo_mesh_pattern_begin_patch(), then cairo_mesh_pattern_move_to() +to specify the first point in the patch (C0). Then the sides are +specified with calls to cairo_mesh_pattern_curve_to() and +cairo_mesh_pattern_line_to(). +The four additional control points (P0, P1, P2, P3) in a patch can +be specified with cairo_mesh_pattern_set_control_point(). +At each corner of the patch (C0, C1, C2, C3) a color may be +specified with cairo_mesh_pattern_set_corner_color_rgb() or +cairo_mesh_pattern_set_corner_color_rgba(). Any corner whose color +is not explicitly specified defaults to transparent black. +A Coons patch is a special case of the tensor-product patch where +the control points are implicitly defined by the sides of the +patch. The default value for any control point not specified is the +implicit value for a Coons patch, i.e. if no control points are +specified the patch is a Coons patch. +A triangle is a special case of the tensor-product patch where the +control points are implicitly defined by the sides of the patch, +all the sides are lines and one of them has length 0, i.e. if the +patch is specified using just 3 lines, it is a triangle. If the +corners connected by the 0-length side have the same color, the +patch is a Gouraud-shaded triangle. +Patches may be oriented differently to the above diagram. For +example the first point could be at the top left. The diagram only +shows the relationship between the sides, corners and control +points. Regardless of where the first point is located, when +specifying colors, corner 0 will always be the first point, corner +1 the point between side 0 and side 1 etc. +Calling cairo_mesh_pattern_end_patch() completes the current +patch. If less than 4 sides have been defined, the first missing +side is defined as a line from the current point to the first point +of the patch (C0) and the other sides are degenerate lines from C0 +to C0. The corners between the added sides will all be coincident +with C0 of the patch and their color will be set to be the same as +the color of C0. +Additional patches may be added with additional calls to +cairo_mesh_pattern_begin_patch()/cairo_mesh_pattern_end_patch(). + +cairo_pattern_t *pattern = cairo_pattern_create_mesh (); + +/* Add a Coons patch */ +cairo_mesh_pattern_begin_patch (pattern); +cairo_mesh_pattern_move_to (pattern, 0, 0); +cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); +cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); +cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); +cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); +cairo_mesh_pattern_end_patch (pattern); + +/* Add a Gouraud-shaded triangle */ +cairo_mesh_pattern_begin_patch (pattern) +cairo_mesh_pattern_move_to (pattern, 100, 100); +cairo_mesh_pattern_line_to (pattern, 130, 130); +cairo_mesh_pattern_line_to (pattern, 130, 70); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); +cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); +cairo_mesh_pattern_end_patch (pattern) + +When two patches overlap, the last one that has been added is drawn +over the first one. +When a patch folds over itself, points are sorted depending on +their parameter coordinates inside the patch. The v coordinate +ranges from 0 to 1 when moving from side 3 to side 1; the u +coordinate ranges from 0 to 1 when going from side 0 to side + + +Points with higher v coordinate hide points with lower v +coordinate. When two points have the same v coordinate, the one +with higher u coordinate is above. This means that points nearer to +side 1 are above points nearer to side 3; when this is not +sufficient to decide which point is above (for example when both +points belong to side 1 or side 3) points nearer to side 2 are +above points nearer to side 0. + + +For a complete definition of tensor-product patches, see the PDF +specification (ISO32000), which describes the parametrization in +detail. +Note: The coordinates are always in pattern space. For a new +pattern, pattern space is identical to user space, but the +relationship between the spaces can be changed with +cairo_pattern_set_matrix(). + +Returns + the newly created cairo_pattern_t if successful, or +an error pattern in case of no memory. The caller owns the returned +object and should call cairo_pattern_destroy() when finished with +it. +This function will always return a valid pointer, but if an error +occurred the pattern status will be set to an error. To inspect the +status of a pattern use cairo_pattern_status(). + +Since 1.12 + +cairo_mesh_pattern_begin_patch () +cairo_mesh_pattern_begin_patch +void +cairo_mesh_pattern_begin_patch (cairo_pattern_t *pattern); +Begin a patch in a mesh pattern. +After calling this function, the patch shape should be defined with +cairo_mesh_pattern_move_to(), cairo_mesh_pattern_line_to() and +cairo_mesh_pattern_curve_to(). +After defining the patch, cairo_mesh_pattern_end_patch() must be +called before using pattern + as a source or mask. +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + already has a +current patch, it will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + +Since 1.12 + +cairo_mesh_pattern_end_patch () +cairo_mesh_pattern_end_patch +void +cairo_mesh_pattern_end_patch (cairo_pattern_t *pattern); +Indicates the end of the current patch in a mesh pattern. +If the current patch has less than 4 sides, it is closed with a +straight line from the current point to the first point of the +patch as if cairo_mesh_pattern_line_to() was used. +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch has no current point, pattern + will be +put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + +Since 1.12 + +cairo_mesh_pattern_move_to () +cairo_mesh_pattern_move_to +void +cairo_mesh_pattern_move_to (cairo_pattern_t *pattern, + double x, + double y); +Define the first point of the current patch in a mesh pattern. +After this call the current point will be (x +, y +). +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch already has at least one side, pattern + +will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +x +the X coordinate of the new position + +y +the Y coordinate of the new position + + +Since 1.12 + +cairo_mesh_pattern_line_to () +cairo_mesh_pattern_line_to +void +cairo_mesh_pattern_line_to (cairo_pattern_t *pattern, + double x, + double y); +Adds a line to the current patch from the current point to position +(x +, y +) in pattern-space coordinates. +If there is no current point before the call to +cairo_mesh_pattern_line_to() this function will behave as +cairo_mesh_pattern_move_to(pattern +, x +, y +). +After this call the current point will be (x +, y +). +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch already has 4 sides, pattern + will be +put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +x +the X coordinate of the end of the new line + +y +the Y coordinate of the end of the new line + + +Since 1.12 + +cairo_mesh_pattern_curve_to () +cairo_mesh_pattern_curve_to +void +cairo_mesh_pattern_curve_to (cairo_pattern_t *pattern, + double x1, + double y1, + double x2, + double y2, + double x3, + double y3); +Adds a cubic Bézier spline to the current patch from the current +point to position (x3 +, y3 +) in pattern-space coordinates, using +(x1 +, y1 +) and (x2 +, y2 +) as the control points. +If the current patch has no current point before the call to +cairo_mesh_pattern_curve_to(), this function will behave as if +preceded by a call to cairo_mesh_pattern_move_to(pattern +, x1 +, +y1 +). +After this call the current point will be (x3 +, y3 +). +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If pattern + has no current +patch or the current patch already has 4 sides, pattern + will be +put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +x1 +the X coordinate of the first control point + +y1 +the Y coordinate of the first control point + +x2 +the X coordinate of the second control point + +y2 +the Y coordinate of the second control point + +x3 +the X coordinate of the end of the curve + +y3 +the Y coordinate of the end of the curve + + +Since 1.12 + +cairo_mesh_pattern_set_control_point () +cairo_mesh_pattern_set_control_point +void +cairo_mesh_pattern_set_control_point (cairo_pattern_t *pattern, + unsigned int point_num, + double x, + double y); +Set an internal control point of the current patch. +Valid values for point_num + are from 0 to 3 and identify the +control points as explained in cairo_pattern_create_mesh(). +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If point_num + is not valid, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_INDEX. If pattern + has no current patch, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +point_num +the control point to set the position for + +x +the X coordinate of the control point + +y +the Y coordinate of the control point + + +Since 1.12 + +cairo_mesh_pattern_set_corner_color_rgb () +cairo_mesh_pattern_set_corner_color_rgb +void +cairo_mesh_pattern_set_corner_color_rgb + (cairo_pattern_t *pattern, + unsigned int corner_num, + double red, + double green, + double blue); +Sets the color of a corner of the current patch in a mesh pattern. +The color is specified in the same way as in cairo_set_source_rgb(). +Valid values for corner_num + are from 0 to 3 and identify the +corners as explained in cairo_pattern_create_mesh(). +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If corner_num + is not valid, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_INDEX. If pattern + has no current patch, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +corner_num +the corner to set the color for + +red +red component of color + +green +green component of color + +blue +blue component of color + + +Since 1.12 + +cairo_mesh_pattern_set_corner_color_rgba () +cairo_mesh_pattern_set_corner_color_rgba +void +cairo_mesh_pattern_set_corner_color_rgba + (cairo_pattern_t *pattern, + unsigned int corner_num, + double red, + double green, + double blue, + double alpha); +Sets the color of a corner of the current patch in a mesh pattern. +The color is specified in the same way as in cairo_set_source_rgba(). +Valid values for corner_num + are from 0 to 3 and identify the +corners as explained in cairo_pattern_create_mesh(). +Note: If pattern + is not a mesh pattern then pattern + will be put +into an error status with a status of +CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If corner_num + is not valid, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_INDEX. If pattern + has no current patch, +pattern + will be put into an error status with a status of +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +corner_num +the corner to set the color for + +red +red component of color + +green +green component of color + +blue +blue component of color + +alpha +alpha component of color + + +Since 1.12 + +cairo_mesh_pattern_get_patch_count () +cairo_mesh_pattern_get_patch_count +cairo_status_t +cairo_mesh_pattern_get_patch_count (cairo_pattern_t *pattern, + unsigned int *count); +Gets the number of patches specified in the given mesh pattern. +The number only includes patches which have been finished by +calling cairo_mesh_pattern_end_patch(). For example it will be 0 +during the definition of the first patch. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +count +return value for the number patches, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or +CAIRO_STATUS_PATTERN_TYPE_MISMATCH if pattern +is not a mesh +pattern. + +Since 1.12 + +cairo_mesh_pattern_get_path () +cairo_mesh_pattern_get_path +cairo_path_t * +cairo_mesh_pattern_get_path (cairo_pattern_t *pattern, + unsigned int patch_num); +Gets path defining the patch patch_num + for a mesh +pattern. +patch_num + can range from 0 to n-1 where n is the number returned by +cairo_mesh_pattern_get_patch_count(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + +patch_num +the patch number to return data for + + + +Returns + the path defining the patch, or a path with status +CAIRO_STATUS_INVALID_INDEX if patch_num +or point_num +is not +valid for pattern +. If pattern +is not a mesh pattern, a path with +status CAIRO_STATUS_PATTERN_TYPE_MISMATCH is returned. + +Since 1.12 + +cairo_mesh_pattern_get_control_point () +cairo_mesh_pattern_get_control_point +cairo_status_t +cairo_mesh_pattern_get_control_point (cairo_pattern_t *pattern, + unsigned int patch_num, + unsigned int point_num, + double *x, + double *y); +Gets the control point point_num + of patch patch_num + for a mesh +pattern. +patch_num + can range from 0 to n-1 where n is the number returned by +cairo_mesh_pattern_get_patch_count(). +Valid values for point_num + are from 0 to 3 and identify the +control points as explained in cairo_pattern_create_mesh(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + +patch_num +the patch number to return data for + +point_num +the control point number to return data for + +x +return value for the x coordinate of the control point, or NULL + +y +return value for the y coordinate of the control point, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or CAIRO_STATUS_INVALID_INDEX +if patch_num +or point_num +is not valid for pattern +. If pattern +is not a mesh pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH is +returned. + +Since 1.12 + +cairo_mesh_pattern_get_corner_color_rgba () +cairo_mesh_pattern_get_corner_color_rgba +cairo_status_t +cairo_mesh_pattern_get_corner_color_rgba + (cairo_pattern_t *pattern, + unsigned int patch_num, + unsigned int corner_num, + double *red, + double *green, + double *blue, + double *alpha); +Gets the color information in corner corner_num + of patch +patch_num + for a mesh pattern. +patch_num + can range from 0 to n-1 where n is the number returned by +cairo_mesh_pattern_get_patch_count(). +Valid values for corner_num + are from 0 to 3 and identify the +corners as explained in cairo_pattern_create_mesh(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + +patch_num +the patch number to return data for + +corner_num +the corner number to return data for + +red +return value for red component of color, or NULL + +green +return value for green component of color, or NULL + +blue +return value for blue component of color, or NULL + +alpha +return value for alpha component of color, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS, or CAIRO_STATUS_INVALID_INDEX +if patch_num +or corner_num +is not valid for pattern +. If +pattern +is not a mesh pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH +is returned. + +Since 1.12 + +cairo_pattern_reference () +cairo_pattern_reference +cairo_pattern_t * +cairo_pattern_reference (cairo_pattern_t *pattern); +Increases the reference count on pattern + by one. This prevents +pattern + from being destroyed until a matching call to +cairo_pattern_destroy() is made. +The number of references to a cairo_pattern_t can be get using +cairo_pattern_get_reference_count(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + + + +Returns + the referenced cairo_pattern_t. + +Since 1.0 + +cairo_pattern_destroy () +cairo_pattern_destroy +void +cairo_pattern_destroy (cairo_pattern_t *pattern); +Decreases the reference count on pattern + by one. If the result is +zero, then pattern + and all associated resources are freed. See +cairo_pattern_reference(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + + +Since 1.0 + +cairo_pattern_status () +cairo_pattern_status +cairo_status_t +cairo_pattern_status (cairo_pattern_t *pattern); +Checks whether an error has previously occurred for this +pattern. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + + +Returns + CAIRO_STATUS_SUCCESS, CAIRO_STATUS_NO_MEMORY, +CAIRO_STATUS_INVALID_MATRIX, CAIRO_STATUS_PATTERN_TYPE_MISMATCH, +or CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + +Since 1.0 + +cairo_pattern_set_extend () +cairo_pattern_set_extend +void +cairo_pattern_set_extend (cairo_pattern_t *pattern, + cairo_extend_t extend); +Sets the mode to be used for drawing outside the area of a pattern. +See cairo_extend_t for details on the semantics of each extend +strategy. +The default extend mode is CAIRO_EXTEND_NONE for surface patterns +and CAIRO_EXTEND_PAD for gradient patterns. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +extend +a cairo_extend_t describing how the area outside of the +pattern will be drawn + + +Since 1.0 + +cairo_pattern_get_extend () +cairo_pattern_get_extend +cairo_extend_t +cairo_pattern_get_extend (cairo_pattern_t *pattern); +Gets the current extend mode for a pattern. See cairo_extend_t +for details on the semantics of each extend strategy. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + + +Returns + the current extend strategy used for drawing the +pattern. + +Since 1.0 + +cairo_pattern_set_filter () +cairo_pattern_set_filter +void +cairo_pattern_set_filter (cairo_pattern_t *pattern, + cairo_filter_t filter); +Sets the filter to be used for resizing when using this pattern. +See cairo_filter_t for details on each filter. + + +Note that you might want to control filtering even when you do not +have an explicit cairo_pattern_t object, (for example when using +cairo_set_source_surface()). In these cases, it is convenient to +use cairo_get_source() to get access to the pattern that cairo +creates implicitly. For example: + + + +cairo_set_source_surface (cr, image, x, y); +cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + + +Parameters + + + + + + +pattern +a cairo_pattern_t + +filter +a cairo_filter_t describing the filter to use for resizing +the pattern + + +Since 1.0 + +cairo_pattern_get_filter () +cairo_pattern_get_filter +cairo_filter_t +cairo_pattern_get_filter (cairo_pattern_t *pattern); +Gets the current filter for a pattern. See cairo_filter_t +for details on each filter. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + + +Returns + the current filter used for resizing the pattern. + +Since 1.0 + +cairo_pattern_set_matrix () +cairo_pattern_set_matrix +void +cairo_pattern_set_matrix (cairo_pattern_t *pattern, + const cairo_matrix_t *matrix); +Sets the pattern's transformation matrix to matrix +. This matrix is +a transformation from user space to pattern space. +When a pattern is first created it always has the identity matrix +for its transformation matrix, which means that pattern space is +initially identical to user space. +Important: Please note that the direction of this transformation +matrix is from user space to pattern space. This means that if you +imagine the flow from a pattern to user space (and on to device +space), then coordinates in that flow will be transformed by the +inverse of the pattern matrix. +For example, if you want to make a pattern appear twice as large as +it does by default the correct code to use is: + +cairo_matrix_init_scale (&matrix, 0.5, 0.5); +cairo_pattern_set_matrix (pattern, &matrix); + +Meanwhile, using values of 2.0 rather than 0.5 in the code above +would cause the pattern to appear at half of its default size. +Also, please note the discussion of the user-space locking +semantics of cairo_set_source(). + +Parameters + + + + + + +pattern +a cairo_pattern_t + +matrix +a cairo_matrix_t + + +Since 1.0 + +cairo_pattern_get_matrix () +cairo_pattern_get_matrix +void +cairo_pattern_get_matrix (cairo_pattern_t *pattern, + cairo_matrix_t *matrix); +Stores the pattern's transformation matrix into matrix +. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +matrix +return value for the matrix + + +Since 1.0 + +cairo_pattern_get_type () +cairo_pattern_get_type +cairo_pattern_type_t +cairo_pattern_get_type (cairo_pattern_t *pattern); +This function returns the type a pattern. +See cairo_pattern_type_t for available types. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + + +Returns + The type of pattern +. + +Since 1.2 + +cairo_pattern_get_reference_count () +cairo_pattern_get_reference_count +unsigned int +cairo_pattern_get_reference_count (cairo_pattern_t *pattern); +Returns the current reference count of pattern +. + +Parameters + + + + + + +pattern +a cairo_pattern_t + + + +Returns + the current reference count of pattern +. If the +object is a nil object, 0 will be returned. + +Since 1.4 + +cairo_pattern_set_user_data () +cairo_pattern_set_user_data +cairo_status_t +cairo_pattern_set_user_data (cairo_pattern_t *pattern, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); +Attach user data to pattern +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +key +the address of a cairo_user_data_key_t to attach the user data to + +user_data +the user data to attach to the cairo_pattern_t + +destroy +a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key. + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.4 + +cairo_pattern_get_user_data () +cairo_pattern_get_user_data +void * +cairo_pattern_get_user_data (cairo_pattern_t *pattern, + const cairo_user_data_key_t *key); +Return user data previously attached to pattern + using the +specified key. If no user data has been attached with the given +key this function returns NULL. + +Parameters + + + + + + +pattern +a cairo_pattern_t + +key +the address of the cairo_user_data_key_t the user data was +attached to + + + +Returns + the user data previously attached or NULL. + +Since 1.4 + + + +Types and Values + +cairo_pattern_t +cairo_pattern_t +typedef struct _cairo_pattern cairo_pattern_t; + +A cairo_pattern_t represents a source when drawing onto a +surface. There are different subtypes of cairo_pattern_t, +for different types of sources; for example, +cairo_pattern_create_rgb() creates a pattern for a solid +opaque color. +Other than various +cairo_pattern_create_type() +functions, some of the pattern types can be implicitly created using various +cairo_set_source_type() functions; +for example cairo_set_source_rgb(). +The type of a pattern can be queried with cairo_pattern_get_type(). +Memory management of cairo_pattern_t is done with +cairo_pattern_reference() and cairo_pattern_destroy(). +Since 1.0 + +enum cairo_extend_t +cairo_extend_t +cairo_extend_t is used to describe how pattern color/alpha will be +determined for areas "outside" the pattern's natural area, (for +example, outside the surface bounds or outside the gradient +geometry). +Mesh patterns are not affected by the extend mode. +The default extend mode is CAIRO_EXTEND_NONE for surface patterns +and CAIRO_EXTEND_PAD for gradient patterns. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_EXTEND_NONE +pixels outside of the source pattern + are fully transparent (Since 1.0) + + + +CAIRO_EXTEND_REPEAT +the pattern is tiled by repeating (Since 1.0) + + + +CAIRO_EXTEND_REFLECT +the pattern is tiled by reflecting + at the edges (Since 1.0; but only implemented for surface patterns since 1.6) + + + +CAIRO_EXTEND_PAD +pixels outside of the pattern copy + the closest pixel from the source (Since 1.2; but only + implemented for surface patterns since 1.6) + + + + +Since 1.0 + +enum cairo_filter_t +cairo_filter_t +cairo_filter_t is used to indicate what filtering should be +applied when reading pixel values from patterns. See +cairo_pattern_set_filter() for indicating the desired filter to be +used with a particular pattern. + +Members + + + + + + +CAIRO_FILTER_FAST +A high-performance filter, with quality similar + to CAIRO_FILTER_NEAREST (Since 1.0) + + + +CAIRO_FILTER_GOOD +A reasonable-performance filter, with quality + similar to CAIRO_FILTER_BILINEAR (Since 1.0) + + + +CAIRO_FILTER_BEST +The highest-quality available, performance may + not be suitable for interactive use. (Since 1.0) + + + +CAIRO_FILTER_NEAREST +Nearest-neighbor filtering (Since 1.0) + + + +CAIRO_FILTER_BILINEAR +Linear interpolation in two dimensions (Since 1.0) + + + +CAIRO_FILTER_GAUSSIAN +This filter value is currently + unimplemented, and should not be used in current code. (Since 1.0) + + + + +Since 1.0 + +enum cairo_pattern_type_t +cairo_pattern_type_t +cairo_pattern_type_t is used to describe the type of a given pattern. +The type of a pattern is determined by the function used to create +it. The cairo_pattern_create_rgb() and cairo_pattern_create_rgba() +functions create SOLID patterns. The remaining +cairo_pattern_create functions map to pattern types in obvious +ways. +The pattern type can be queried with cairo_pattern_get_type() +Most cairo_pattern_t functions can be called with a pattern of any +type, (though trying to change the extend or filter for a solid +pattern will have no effect). A notable exception is +cairo_pattern_add_color_stop_rgb() and +cairo_pattern_add_color_stop_rgba() which must only be called with +gradient patterns (either LINEAR or RADIAL). Otherwise the pattern +will be shutdown and put into an error state. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_PATTERN_TYPE_SOLID +The pattern is a solid (uniform) +color. It may be opaque or translucent, since 1.2. + + + +CAIRO_PATTERN_TYPE_SURFACE +The pattern is a based on a surface (an image), since 1.2. + + + +CAIRO_PATTERN_TYPE_LINEAR +The pattern is a linear gradient, since 1.2. + + + +CAIRO_PATTERN_TYPE_RADIAL +The pattern is a radial gradient, since 1.2. + + + +CAIRO_PATTERN_TYPE_MESH +The pattern is a mesh, since 1.12. + + + +CAIRO_PATTERN_TYPE_RASTER_SOURCE +The pattern is a user pattern providing raster data, since 1.12. + + + + +Since 1.2 + + + +See Also +cairo_t, cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-pdf.xml b/doc/public/xml/cairo-pdf.xml new file mode 100644 index 000000000..e309af1ae --- /dev/null +++ b/doc/public/xml/cairo-pdf.xml @@ -0,0 +1,335 @@ + + +]> + + +PDF Surfaces +3 + + CAIRO Library + + + +PDF Surfaces +Rendering PDF documents + + + +Functions + + + + + +cairo_surface_t * +cairo_pdf_surface_create () +cairo_surface_t * +cairo_pdf_surface_create_for_stream () +void +cairo_pdf_surface_restrict_to_version () +void +cairo_pdf_get_versions () +const char * +cairo_pdf_version_to_string () +void +cairo_pdf_surface_set_size () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_PDF_SURFACE +enumcairo_pdf_version_t + + + + + + +Object Hierarchy + + + + + + +Description +The PDF surface is used to render cairo graphics to Adobe +PDF files and is a multi-page vector surface backend. +The following mime types are supported: CAIRO_MIME_TYPE_JPEG, +CAIRO_MIME_TYPE_JP2, CAIRO_MIME_TYPE_UNIQUE_ID, +CAIRO_MIME_TYPE_JBIG2, CAIRO_MIME_TYPE_JBIG2_GLOBAL, +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. +JBIG2 data in PDF must be in the embedded format as descibed in +ISO/IEC 11544. Image specific JBIG2 data must be in +CAIRO_MIME_TYPE_JBIG2. Any global segments in the JBIG2 data +(segments with page association field set to 0) must be in +CAIRO_MIME_TYPE_JBIG2_GLOBAL. The global data may be shared by +multiple images. All images sharing the same global data must set +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID to a unique identifer. At least +one of the images must provide the global data using +CAIRO_MIME_TYPE_JBIG2_GLOBAL. The global data will only be +embedded once but shared by all JBIG2 images with the same +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. + + + +Functions + +cairo_pdf_surface_create () +cairo_pdf_surface_create +cairo_surface_t * +cairo_pdf_surface_create (const char *filename, + double width_in_points, + double height_in_points); +Creates a PDF surface of the specified size in points to be written +to filename +. + +Parameters + + + + + + +filename +a filename for the PDF output (must be writable), NULL may be +used to specify no output. This will generate a PDF surface that +may be queried and used as a source, without generating a +temporary file. + +width_in_points +width of the surface, in points (1 point == 1/72.0 inch) + +height_in_points +height of the surface, in points (1 point == 1/72.0 inch) + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.2 + +cairo_pdf_surface_create_for_stream () +cairo_pdf_surface_create_for_stream +cairo_surface_t * +cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); +Creates a PDF surface of the specified size in points to be written +incrementally to the stream represented by write_func + and closure +. + +Parameters + + + + + + +write_func +a cairo_write_func_t to accept the output data, may be NULL +to indicate a no-op write_func +. With a no-op write_func +, +the surface may be queried or used as a source without +generating any temporary files. + +closure +the closure argument for write_func + + +width_in_points +width of the surface, in points (1 point == 1/72.0 inch) + +height_in_points +height of the surface, in points (1 point == 1/72.0 inch) + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.2 + +cairo_pdf_surface_restrict_to_version () +cairo_pdf_surface_restrict_to_version +void +cairo_pdf_surface_restrict_to_version (cairo_surface_t *surface, + cairo_pdf_version_t version); +Restricts the generated PDF file to version +. See cairo_pdf_get_versions() +for a list of available version values that can be used here. +This function should only be called before any drawing operations +have been performed on the given surface. The simplest way to do +this is to call this function immediately after creating the +surface. + +Parameters + + + + + + +surface +a PDF cairo_surface_t + +version +PDF version + + +Since 1.10 + +cairo_pdf_get_versions () +cairo_pdf_get_versions +void +cairo_pdf_get_versions (cairo_pdf_version_t const **versions, + int *num_versions); +Used to retrieve the list of supported versions. See +cairo_pdf_surface_restrict_to_version(). + +Parameters + + + + + + +versions +supported version list + +num_versions +list length + + +Since 1.10 + +cairo_pdf_version_to_string () +cairo_pdf_version_to_string +const char * +cairo_pdf_version_to_string (cairo_pdf_version_t version); +Get the string representation of the given version + id. This function +will return NULL if version + isn't valid. See cairo_pdf_get_versions() +for a way to get the list of valid version ids. + +Parameters + + + + + + +version +a version id + + + +Returns + the string associated to given version. + +Since 1.10 + +cairo_pdf_surface_set_size () +cairo_pdf_surface_set_size +void +cairo_pdf_surface_set_size (cairo_surface_t *surface, + double width_in_points, + double height_in_points); +Changes the size of a PDF surface for the current (and +subsequent) pages. +This function should only be called before any drawing operations +have been performed on the current page. The simplest way to do +this is to call this function immediately after creating the +surface or immediately after completing a page with either +cairo_show_page() or cairo_copy_page(). + +Parameters + + + + + + +surface +a PDF cairo_surface_t + +width_in_points +new surface width, in points (1 point == 1/72.0 inch) + +height_in_points +new surface height, in points (1 point == 1/72.0 inch) + + +Since 1.2 + + + +Types and Values + +CAIRO_HAS_PDF_SURFACE +CAIRO_HAS_PDF_SURFACE +#define CAIRO_HAS_PDF_SURFACE 1 + +Defined if the PDF surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.2 + +enum cairo_pdf_version_t +cairo_pdf_version_t +cairo_pdf_version_t is used to describe the version number of the PDF +specification that a generated PDF file will conform to. + +Members + + + + + + +CAIRO_PDF_VERSION_1_4 +The version 1.4 of the PDF specification. (Since 1.10) + + + +CAIRO_PDF_VERSION_1_5 +The version 1.5 of the PDF specification. (Since 1.10) + + + + +Since 1.10 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-png.xml b/doc/public/xml/cairo-png.xml new file mode 100644 index 000000000..0ccace961 --- /dev/null +++ b/doc/public/xml/cairo-png.xml @@ -0,0 +1,316 @@ + + +]> + + +PNG Support +3 + + CAIRO Library + + + +PNG Support +Reading and writing PNG images + + + +Functions + + + + + +cairo_surface_t * +cairo_image_surface_create_from_png () +cairo_status_t +(*cairo_read_func_t) () +cairo_surface_t * +cairo_image_surface_create_from_png_stream () +cairo_status_t +cairo_surface_write_to_png () +cairo_status_t +(*cairo_write_func_t) () +cairo_status_t +cairo_surface_write_to_png_stream () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_PNG_FUNCTIONS + + + + + + +Object Hierarchy + + + + + + +Description +The PNG functions allow reading PNG images into image surfaces, and writing +any surface to a PNG file. +It is a toy API. It only offers very simple support for reading and +writing PNG files, which is sufficient for testing and +demonstration purposes. Applications which need more control over +the generated PNG file should access the pixel data directly, using +cairo_image_surface_get_data() or a backend-specific access +function, and process it with another library, e.g. gdk-pixbuf or +libpng. + + + +Functions + +cairo_image_surface_create_from_png () +cairo_image_surface_create_from_png +cairo_surface_t * +cairo_image_surface_create_from_png (const char *filename); +Creates a new image surface and initializes the contents to the +given PNG file. + +Parameters + + + + + + +filename +name of PNG file to load + + + +Returns + a new cairo_surface_t initialized with the contents +of the PNG file, or a "nil" surface if any error occurred. A nil +surface can be checked for with cairo_surface_status(surface) which +may return one of the following values: +CAIRO_STATUS_NO_MEMORY +CAIRO_STATUS_FILE_NOT_FOUND +CAIRO_STATUS_READ_ERROR +Alternatively, you can allow errors to propagate through the drawing +operations and check the status on the context upon completion +using cairo_status(). + +Since 1.0 + +cairo_read_func_t () +cairo_read_func_t +cairo_status_t +(*cairo_read_func_t) (void *closure, + unsigned char *data, + unsigned int length); +cairo_read_func_t is the type of function which is called when a +backend needs to read data from an input stream. It is passed the +closure which was specified by the user at the time the read +function was registered, the buffer to read the data into and the +length of the data in bytes. The read function should return +CAIRO_STATUS_SUCCESS if all the data was successfully read, +CAIRO_STATUS_READ_ERROR otherwise. + +Parameters + + + + + + +closure +the input closure + +data +the buffer into which to read the data + +length +the amount of data to read + + + +Returns + the status code of the read operation + +Since 1.0 + +cairo_image_surface_create_from_png_stream () +cairo_image_surface_create_from_png_stream +cairo_surface_t * +cairo_image_surface_create_from_png_stream + (cairo_read_func_t read_func, + void *closure); +Creates a new image surface from PNG data read incrementally +via the read_func + function. + +Parameters + + + + + + +read_func +function called to read the data of the file + +closure +data to pass to read_func +. + + + +Returns + a new cairo_surface_t initialized with the contents +of the PNG file or a "nil" surface if the data read is not a valid PNG image +or memory could not be allocated for the operation. A nil +surface can be checked for with cairo_surface_status(surface) which +may return one of the following values: +CAIRO_STATUS_NO_MEMORY +CAIRO_STATUS_READ_ERROR +Alternatively, you can allow errors to propagate through the drawing +operations and check the status on the context upon completion +using cairo_status(). + +Since 1.0 + +cairo_surface_write_to_png () +cairo_surface_write_to_png +cairo_status_t +cairo_surface_write_to_png (cairo_surface_t *surface, + const char *filename); +Writes the contents of surface + to a new file filename + as a PNG +image. + +Parameters + + + + + + +surface +a cairo_surface_t with pixel contents + +filename +the name of a file to write to + + + +Returns + CAIRO_STATUS_SUCCESS if the PNG file was written +successfully. Otherwise, CAIRO_STATUS_NO_MEMORY if memory could not +be allocated for the operation or +CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have +pixel contents, or CAIRO_STATUS_WRITE_ERROR if an I/O error occurs +while attempting to write the file. + +Since 1.0 + +cairo_write_func_t () +cairo_write_func_t +cairo_status_t +(*cairo_write_func_t) (void *closure, + const unsigned char *data, + unsigned int length); +cairo_write_func_t is the type of function which is called when a +backend needs to write data to an output stream. It is passed the +closure which was specified by the user at the time the write +function was registered, the data to write and the length of the +data in bytes. The write function should return +CAIRO_STATUS_SUCCESS if all the data was successfully written, +CAIRO_STATUS_WRITE_ERROR otherwise. + +Parameters + + + + + + +closure +the output closure + +data +the buffer containing the data to write + +length +the amount of data to write + + + +Returns + the status code of the write operation + +Since 1.0 + +cairo_surface_write_to_png_stream () +cairo_surface_write_to_png_stream +cairo_status_t +cairo_surface_write_to_png_stream (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure); +Writes the image surface to the write function. + +Parameters + + + + + + +surface +a cairo_surface_t with pixel contents + +write_func +a cairo_write_func_t + +closure +closure data for the write function + + + +Returns + CAIRO_STATUS_SUCCESS if the PNG file was written +successfully. Otherwise, CAIRO_STATUS_NO_MEMORY is returned if +memory could not be allocated for the operation, +CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have +pixel contents. + +Since 1.0 + + + +Types and Values + +CAIRO_HAS_PNG_FUNCTIONS +CAIRO_HAS_PNG_FUNCTIONS +#define CAIRO_HAS_PNG_FUNCTIONS 1 + +Defined if the PNG functions are available. +This macro can be used to conditionally compile code using the cairo +PNG functions. +Since 1.0 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-ps.xml b/doc/public/xml/cairo-ps.xml new file mode 100644 index 000000000..11565810f --- /dev/null +++ b/doc/public/xml/cairo-ps.xml @@ -0,0 +1,533 @@ + + +]> + + +PostScript Surfaces +3 + + CAIRO Library + + + +PostScript Surfaces +Rendering PostScript documents + + + +Functions + + + + + +cairo_surface_t * +cairo_ps_surface_create () +cairo_surface_t * +cairo_ps_surface_create_for_stream () +void +cairo_ps_surface_restrict_to_level () +void +cairo_ps_get_levels () +const char * +cairo_ps_level_to_string () +void +cairo_ps_surface_set_eps () +cairo_bool_t +cairo_ps_surface_get_eps () +void +cairo_ps_surface_set_size () +void +cairo_ps_surface_dsc_begin_setup () +void +cairo_ps_surface_dsc_begin_page_setup () +void +cairo_ps_surface_dsc_comment () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_PS_SURFACE +enumcairo_ps_level_t + + + + + + +Object Hierarchy + + + + + + +Description +The PostScript surface is used to render cairo graphics to Adobe +PostScript files and is a multi-page vector surface backend. + + + +Functions + +cairo_ps_surface_create () +cairo_ps_surface_create +cairo_surface_t * +cairo_ps_surface_create (const char *filename, + double width_in_points, + double height_in_points); +Creates a PostScript surface of the specified size in points to be +written to filename +. See cairo_ps_surface_create_for_stream() for +a more flexible mechanism for handling the PostScript output than +simply writing it to a named file. +Note that the size of individual pages of the PostScript output can +vary. See cairo_ps_surface_set_size(). + +Parameters + + + + + + +filename +a filename for the PS output (must be writable), NULL may be +used to specify no output. This will generate a PS surface that +may be queried and used as a source, without generating a +temporary file. + +width_in_points +width of the surface, in points (1 point == 1/72.0 inch) + +height_in_points +height of the surface, in points (1 point == 1/72.0 inch) + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.2 + +cairo_ps_surface_create_for_stream () +cairo_ps_surface_create_for_stream +cairo_surface_t * +cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); +Creates a PostScript surface of the specified size in points to be +written incrementally to the stream represented by write_func + and +closure +. See cairo_ps_surface_create() for a more convenient way +to simply direct the PostScript output to a named file. +Note that the size of individual pages of the PostScript +output can vary. See cairo_ps_surface_set_size(). + +Parameters + + + + + + +write_func +a cairo_write_func_t to accept the output data, may be NULL +to indicate a no-op write_func +. With a no-op write_func +, +the surface may be queried or used as a source without +generating any temporary files. + +closure +the closure argument for write_func + + +width_in_points +width of the surface, in points (1 point == 1/72.0 inch) + +height_in_points +height of the surface, in points (1 point == 1/72.0 inch) + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.2 + +cairo_ps_surface_restrict_to_level () +cairo_ps_surface_restrict_to_level +void +cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, + cairo_ps_level_t level); +Restricts the generated PostSript file to level +. See +cairo_ps_get_levels() for a list of available level values that +can be used here. +This function should only be called before any drawing operations +have been performed on the given surface. The simplest way to do +this is to call this function immediately after creating the +surface. + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + +level +PostScript level + + +Since 1.6 + +cairo_ps_get_levels () +cairo_ps_get_levels +void +cairo_ps_get_levels (cairo_ps_level_t const **levels, + int *num_levels); +Used to retrieve the list of supported levels. See +cairo_ps_surface_restrict_to_level(). + +Parameters + + + + + + +levels +supported level list + +num_levels +list length + + +Since 1.6 + +cairo_ps_level_to_string () +cairo_ps_level_to_string +const char * +cairo_ps_level_to_string (cairo_ps_level_t level); +Get the string representation of the given level + id. This function +will return NULL if level + id isn't valid. See cairo_ps_get_levels() +for a way to get the list of valid level ids. + +Parameters + + + + + + +level +a level id + + + +Returns + the string associated to given level. + +Since 1.6 + +cairo_ps_surface_set_eps () +cairo_ps_surface_set_eps +void +cairo_ps_surface_set_eps (cairo_surface_t *surface, + cairo_bool_t eps); +If eps + is TRUE, the PostScript surface will output Encapsulated +PostScript. +This function should only be called before any drawing operations +have been performed on the current page. The simplest way to do +this is to call this function immediately after creating the +surface. An Encapsulated PostScript file should never contain more +than one page. + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + +eps +TRUE to output EPS format PostScript + + +Since 1.6 + +cairo_ps_surface_get_eps () +cairo_ps_surface_get_eps +cairo_bool_t +cairo_ps_surface_get_eps (cairo_surface_t *surface); +Check whether the PostScript surface will output Encapsulated PostScript. + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + + + +Returns + TRUE if the surface will output Encapsulated PostScript. + +Since 1.6 + +cairo_ps_surface_set_size () +cairo_ps_surface_set_size +void +cairo_ps_surface_set_size (cairo_surface_t *surface, + double width_in_points, + double height_in_points); +Changes the size of a PostScript surface for the current (and +subsequent) pages. +This function should only be called before any drawing operations +have been performed on the current page. The simplest way to do +this is to call this function immediately after creating the +surface or immediately after completing a page with either +cairo_show_page() or cairo_copy_page(). + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + +width_in_points +new surface width, in points (1 point == 1/72.0 inch) + +height_in_points +new surface height, in points (1 point == 1/72.0 inch) + + +Since 1.2 + +cairo_ps_surface_dsc_begin_setup () +cairo_ps_surface_dsc_begin_setup +void +cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface); +This function indicates that subsequent calls to +cairo_ps_surface_dsc_comment() should direct comments to the Setup +section of the PostScript output. +This function should be called at most once per surface, and must +be called before any call to cairo_ps_surface_dsc_begin_page_setup() +and before any drawing is performed to the surface. +See cairo_ps_surface_dsc_comment() for more details. + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + + +Since 1.2 + +cairo_ps_surface_dsc_begin_page_setup () +cairo_ps_surface_dsc_begin_page_setup +void +cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface); +This function indicates that subsequent calls to +cairo_ps_surface_dsc_comment() should direct comments to the +PageSetup section of the PostScript output. +This function call is only needed for the first page of a +surface. It should be called after any call to +cairo_ps_surface_dsc_begin_setup() and before any drawing is +performed to the surface. +See cairo_ps_surface_dsc_comment() for more details. + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + + +Since 1.2 + +cairo_ps_surface_dsc_comment () +cairo_ps_surface_dsc_comment +void +cairo_ps_surface_dsc_comment (cairo_surface_t *surface, + const char *comment); +Emit a comment into the PostScript output for the given surface. +The comment is expected to conform to the PostScript Language +Document Structuring Conventions (DSC). Please see that manual for +details on the available comments and their meanings. In +particular, the %%IncludeFeature comment allows a +device-independent means of controlling printer device features. So +the PostScript Printer Description Files Specification will also be +a useful reference. +The comment string must begin with a percent character (%) and the +total length of the string (including any initial percent +characters) must not exceed 255 characters. Violating either of +these conditions will place surface + into an error state. But +beyond these two conditions, this function will not enforce +conformance of the comment with any particular specification. +The comment string should not have a trailing newline. +The DSC specifies different sections in which particular comments +can appear. This function provides for comments to be emitted +within three sections: the header, the Setup section, and the +PageSetup section. Comments appearing in the first two sections +apply to the entire document while comments in the BeginPageSetup +section apply only to a single page. +For comments to appear in the header section, this function should +be called after the surface is created, but before a call to +cairo_ps_surface_dsc_begin_setup(). +For comments to appear in the Setup section, this function should +be called after a call to cairo_ps_surface_dsc_begin_setup() but +before a call to cairo_ps_surface_dsc_begin_page_setup(). +For comments to appear in the PageSetup section, this function +should be called after a call to +cairo_ps_surface_dsc_begin_page_setup(). +Note that it is only necessary to call +cairo_ps_surface_dsc_begin_page_setup() for the first page of any +surface. After a call to cairo_show_page() or cairo_copy_page() +comments are unambiguously directed to the PageSetup section of the +current page. But it doesn't hurt to call this function at the +beginning of every page as that consistency may make the calling +code simpler. +As a final note, cairo automatically generates several comments on +its own. As such, applications must not manually generate any of +the following comments: +Header section: %!PS-Adobe-3.0, %%Creator, %%CreationDate, %%Pages, +%%BoundingBox, %%DocumentData, %%LanguageLevel, %%EndComments. +Setup section: %%BeginSetup, %%EndSetup +PageSetup section: %%BeginPageSetup, %%PageBoundingBox, %%EndPageSetup. +Other sections: %%BeginProlog, %%EndProlog, %%Page, %%Trailer, %%EOF +Here is an example sequence showing how this function might be used: + +cairo_surface_t *surface = cairo_ps_surface_create (filename, width, height); +... +cairo_ps_surface_dsc_comment (surface, "%%Title: My excellent document"); +cairo_ps_surface_dsc_comment (surface, "%%Copyright: Copyright (C) 2006 Cairo Lover") +... +cairo_ps_surface_dsc_begin_setup (surface); +cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor White"); +... +cairo_ps_surface_dsc_begin_page_setup (surface); +cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A3"); +cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *InputSlot LargeCapacity"); +cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaType Glossy"); +cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor Blue"); +... draw to first page here .. +cairo_show_page (cr); +... +cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A5"); +... + + +Parameters + + + + + + +surface +a PostScript cairo_surface_t + +comment +a comment string to be emitted into the PostScript output + + +Since 1.2 + + + +Types and Values + +CAIRO_HAS_PS_SURFACE +CAIRO_HAS_PS_SURFACE +#define CAIRO_HAS_PS_SURFACE 1 + +Defined if the PostScript surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.2 + +enum cairo_ps_level_t +cairo_ps_level_t +cairo_ps_level_t is used to describe the language level of the +PostScript Language Reference that a generated PostScript file will +conform to. + +Members + + + + + + +CAIRO_PS_LEVEL_2 +The language level 2 of the PostScript specification. (Since 1.6) + + + +CAIRO_PS_LEVEL_3 +The language level 3 of the PostScript specification. (Since 1.6) + + + + +Since 1.6 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-quartz-fonts.xml b/doc/public/xml/cairo-quartz-fonts.xml new file mode 100644 index 000000000..e3e6ad6a1 --- /dev/null +++ b/doc/public/xml/cairo-quartz-fonts.xml @@ -0,0 +1,138 @@ + + +]> + + +Quartz (CGFont) Fonts +3 + + CAIRO Library + + + +Quartz (CGFont) Fonts +Font support via CGFont on OS X + + + +Functions + + + + + +cairo_font_face_t * +cairo_quartz_font_face_create_for_cgfont () +cairo_font_face_t * +cairo_quartz_font_face_create_for_atsu_font_id () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_QUARTZ_FONT + + + + + + +Object Hierarchy + + + + + + +Description +The Quartz font backend is primarily used to render text on Apple +MacOS X systems. The CGFont API is used for the internal +implementation of the font backend methods. + + + +Functions + +cairo_quartz_font_face_create_for_cgfont () +cairo_quartz_font_face_create_for_cgfont +cairo_font_face_t * +cairo_quartz_font_face_create_for_cgfont + (CGFontRef font); +Creates a new font for the Quartz font backend based on a +CGFontRef. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). + +Parameters + + + + + + +font +a CGFontRef obtained through a method external to cairo. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.6 + +cairo_quartz_font_face_create_for_atsu_font_id () +cairo_quartz_font_face_create_for_atsu_font_id +cairo_font_face_t * +cairo_quartz_font_face_create_for_atsu_font_id + (ATSUFontID font_id); +Creates a new font for the Quartz font backend based on an +ATSUFontID. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). + +Parameters + + + + + + +font_id +an ATSUFontID for the font. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.6 + + + +Types and Values + +CAIRO_HAS_QUARTZ_FONT +CAIRO_HAS_QUARTZ_FONT +#define CAIRO_HAS_QUARTZ_FONT 1 + +Defined if the Quartz font backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.6 + + + +See Also +cairo_font_face_t + + + + diff --git a/doc/public/xml/cairo-quartz.xml b/doc/public/xml/cairo-quartz.xml new file mode 100644 index 000000000..292c7140b --- /dev/null +++ b/doc/public/xml/cairo-quartz.xml @@ -0,0 +1,193 @@ + + +]> + + +Quartz Surfaces +3 + + CAIRO Library + + + +Quartz Surfaces +Rendering to Quartz surfaces + + + +Functions + + + + + +cairo_surface_t * +cairo_quartz_surface_create () +cairo_surface_t * +cairo_quartz_surface_create_for_cg_context () +CGContextRef +cairo_quartz_surface_get_cg_context () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_QUARTZ_SURFACE + + + + + + +Object Hierarchy + + + + + + +Description +The Quartz surface is used to render cairo graphics targeting the +Apple OS X Quartz rendering system. + + + +Functions + +cairo_quartz_surface_create () +cairo_quartz_surface_create +cairo_surface_t * +cairo_quartz_surface_create (cairo_format_t format, + unsigned int width, + unsigned int height); +Creates a Quartz surface backed by a CGBitmap. The surface is +created using the Device RGB (or Device Gray, for A8) color space. +All Cairo operations, including those that require software +rendering, will succeed on this surface. + +Parameters + + + + + + +format +format of pixels in the surface to create + +width +width of the surface, in pixels + +height +height of the surface, in pixels + + + +Returns + the newly created surface. + +Since 1.6 + +cairo_quartz_surface_create_for_cg_context () +cairo_quartz_surface_create_for_cg_context +cairo_surface_t * +cairo_quartz_surface_create_for_cg_context + (CGContextRef cgContext, + unsigned int width, + unsigned int height); +Creates a Quartz surface that wraps the given CGContext. The +CGContext is assumed to be in the standard Cairo coordinate space +(that is, with the origin at the upper left and the Y axis +increasing downward). If the CGContext is in the Quartz coordinate +space (with the origin at the bottom left), then it should be +flipped before this function is called. The flip can be accomplished +using a translate and a scale; for example: + +CGContextTranslateCTM (cgContext, 0.0, height); +CGContextScaleCTM (cgContext, 1.0, -1.0); + +All Cairo operations are implemented in terms of Quartz operations, +as long as Quartz-compatible elements are used (such as Quartz fonts). + +Parameters + + + + + + +cgContext +the existing CGContext for which to create the surface + +width +width of the surface, in pixels + +height +height of the surface, in pixels + + + +Returns + the newly created Cairo surface. + +Since 1.6 + +cairo_quartz_surface_get_cg_context () +cairo_quartz_surface_get_cg_context +CGContextRef +cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); +Returns the CGContextRef that the given Quartz surface is backed +by. +A call to cairo_surface_flush() is required before using the +CGContextRef to ensure that all pending drawing operations are +finished and to restore any temporary modification cairo has made +to its state. A call to cairo_surface_mark_dirty() is required +after the state or the content of the CGContextRef has been +modified. + +Parameters + + + + + + +surface +the Cairo Quartz surface + + + +Returns + the CGContextRef for the given surface. + +Since 1.6 + + + +Types and Values + +CAIRO_HAS_QUARTZ_SURFACE +CAIRO_HAS_QUARTZ_SURFACE +#define CAIRO_HAS_QUARTZ_SURFACE 1 + +Defined if the Quartz surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.6 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-raster-source.xml b/doc/public/xml/cairo-raster-source.xml new file mode 100644 index 000000000..f0697fb75 --- /dev/null +++ b/doc/public/xml/cairo-raster-source.xml @@ -0,0 +1,565 @@ + + +]> + + +Raster Sources +3 + + CAIRO Library + + + +Raster Sources +Supplying arbitrary image data + + + +Functions + + + + + +cairo_pattern_t * +cairo_pattern_create_raster_source () +void +cairo_raster_source_pattern_set_callback_data () +void * +cairo_raster_source_pattern_get_callback_data () +void +cairo_raster_source_pattern_set_acquire () +void +cairo_raster_source_pattern_get_acquire () +void +cairo_raster_source_pattern_set_snapshot () +cairo_raster_source_snapshot_func_t +cairo_raster_source_pattern_get_snapshot () +void +cairo_raster_source_pattern_set_copy () +cairo_raster_source_copy_func_t +cairo_raster_source_pattern_get_copy () +void +cairo_raster_source_pattern_set_finish () +cairo_raster_source_finish_func_t +cairo_raster_source_pattern_get_finish () +cairo_surface_t +(*cairo_raster_source_acquire_func_t) () +void +(*cairo_raster_source_release_func_t) () +cairo_status_t +(*cairo_raster_source_snapshot_func_t) () +cairo_status_t +(*cairo_raster_source_copy_func_t) () +void +(*cairo_raster_source_finish_func_t) () + + + + + + +Object Hierarchy + + + + + + +Description +The raster source provides the ability to supply arbitrary pixel data +whilst rendering. The pixels are queried at the time of rasterisation +by means of user callback functions, allowing for the ultimate +flexibility. For example, in handling compressed image sources, you +may keep a MRU cache of decompressed images and decompress sources on the +fly and discard old ones to conserve memory. +For the raster source to be effective, you must at least specify +the acquire and release callbacks which are used to retrieve the pixel +data for the region of interest and demark when it can be freed afterwards. +Other callbacks are provided for when the pattern is copied temporarily +during rasterisation, or more permanently as a snapshot in order to keep +the pixel data available for printing. + + + +Functions + +cairo_pattern_create_raster_source () +cairo_pattern_create_raster_source +cairo_pattern_t * +cairo_pattern_create_raster_source (void *user_data, + cairo_content_t content, + int width, + int height); +Creates a new user pattern for providing pixel data. +Use the setter functions to associate callbacks with the returned +pattern. The only mandatory callback is acquire. + +Parameters + + + + + + +user_data +the user data to be passed to all callbacks + +content +content type for the pixel data that will be returned. Knowing +the content type ahead of time is used for analysing the operation and +picking the appropriate rendering path. + +width +maximum size of the sample area + +height +maximum size of the sample area + + + +Returns + a newly created cairo_pattern_t. Free with +cairo_pattern_destroy() when you are done using it. + +Since 1.12 + +cairo_raster_source_pattern_set_callback_data () +cairo_raster_source_pattern_set_callback_data +void +cairo_raster_source_pattern_set_callback_data + (cairo_pattern_t *pattern, + void *data); +Updates the user data that is provided to all callbacks. + +Parameters + + + + + + +pattern +the pattern to update + +data +the user data to be passed to all callbacks + + +Since 1.12 + +cairo_raster_source_pattern_get_callback_data () +cairo_raster_source_pattern_get_callback_data +void * +cairo_raster_source_pattern_get_callback_data + (cairo_pattern_t *pattern); +Queries the current user data. + +Parameters + + + + + + +pattern +the pattern to update + + + +Returns + the current user-data passed to each callback + +Since 1.12 + +cairo_raster_source_pattern_set_acquire () +cairo_raster_source_pattern_set_acquire +void +cairo_raster_source_pattern_set_acquire + (cairo_pattern_t *pattern, + cairo_raster_source_acquire_func_t acquire, + cairo_raster_source_release_func_t release); +Specifies the callbacks used to generate the image surface for a rendering +operation (acquire) and the function used to cleanup that surface afterwards. +The acquire + callback should create a surface (preferably an image +surface created to match the target using +cairo_surface_create_similar_image()) that defines at least the region +of interest specified by extents. The surface is allowed to be the entire +sample area, but if it does contain a subsection of the sample area, +the surface extents should be provided by setting the device offset (along +with its width and height) using cairo_surface_set_device_offset(). + +Parameters + + + + + + +pattern +the pattern to update + +acquire +acquire callback + +release +release callback + + +Since 1.12 + +cairo_raster_source_pattern_get_acquire () +cairo_raster_source_pattern_get_acquire +void +cairo_raster_source_pattern_get_acquire + (cairo_pattern_t *pattern, + cairo_raster_source_acquire_func_t *acquire, + cairo_raster_source_release_func_t *release); +Queries the current acquire and release callbacks. + +Parameters + + + + + + +pattern +the pattern to query + +acquire +return value for the current acquire callback + +release +return value for the current release callback + + +Since 1.12 + +cairo_raster_source_pattern_set_snapshot () +cairo_raster_source_pattern_set_snapshot +void +cairo_raster_source_pattern_set_snapshot + (cairo_pattern_t *pattern, + cairo_raster_source_snapshot_func_t snapshot); +Sets the callback that will be used whenever a snapshot is taken of the +pattern, that is whenever the current contents of the pattern should be +preserved for later use. This is typically invoked whilst printing. + +Parameters + + + + + + +pattern +the pattern to update + +snapshot +snapshot callback + + +Since 1.12 + +cairo_raster_source_pattern_get_snapshot () +cairo_raster_source_pattern_get_snapshot +cairo_raster_source_snapshot_func_t +cairo_raster_source_pattern_get_snapshot + (cairo_pattern_t *pattern); +Queries the current snapshot callback. + +Parameters + + + + + + +pattern +the pattern to query + + + +Returns + the current snapshot callback + +Since 1.12 + +cairo_raster_source_pattern_set_copy () +cairo_raster_source_pattern_set_copy +void +cairo_raster_source_pattern_set_copy (cairo_pattern_t *pattern, + cairo_raster_source_copy_func_t copy); +Updates the copy callback which is used whenever a temporary copy of the +pattern is taken. + +Parameters + + + + + + +pattern +the pattern to update + +copy +the copy callback + + +Since 1.12 + +cairo_raster_source_pattern_get_copy () +cairo_raster_source_pattern_get_copy +cairo_raster_source_copy_func_t +cairo_raster_source_pattern_get_copy (cairo_pattern_t *pattern); +Queries the current copy callback. + +Parameters + + + + + + +pattern +the pattern to query + + + +Returns + the current copy callback + +Since 1.12 + +cairo_raster_source_pattern_set_finish () +cairo_raster_source_pattern_set_finish +void +cairo_raster_source_pattern_set_finish + (cairo_pattern_t *pattern, + cairo_raster_source_finish_func_t finish); +Updates the finish callback which is used whenever a pattern (or a copy +thereof) will no longer be used. + +Parameters + + + + + + +pattern +the pattern to update + +finish +the finish callback + + +Since 1.12 + +cairo_raster_source_pattern_get_finish () +cairo_raster_source_pattern_get_finish +cairo_raster_source_finish_func_t +cairo_raster_source_pattern_get_finish + (cairo_pattern_t *pattern); +Queries the current finish callback. + +Parameters + + + + + + +pattern +the pattern to query + + + +Returns + the current finish callback + +Since 1.12 + +cairo_raster_source_acquire_func_t () +cairo_raster_source_acquire_func_t +cairo_surface_t +(*cairo_raster_source_acquire_func_t) (cairo_pattern_t *pattern, + void *callback_data, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents); +cairo_raster_source_acquire_func_t is the type of function which is +called when a pattern is being rendered from. It should create a surface +that provides the pixel data for the region of interest as defined by +extents, though the surface itself does not have to be limited to that +area. For convenience the surface should probably be of image type, +created with cairo_surface_create_similar_image() for the target (which +enables the number of copies to be reduced during transfer to the +device). Another option, might be to return a similar surface to the +target for explicit handling by the application of a set of cached sources +on the device. The region of sample data provided should be defined using +cairo_surface_set_device_offset() to specify the top-left corner of the +sample data (along with width and height of the surface). + +Parameters + + + + + + +pattern +the pattern being rendered from + +callback_data +the user data supplied during creation + +target +the rendering target surface + +extents +rectangular region of interest in pixels in sample space + + + +Returns + a cairo_surface_t + +Since 1.12 + +cairo_raster_source_release_func_t () +cairo_raster_source_release_func_t +void +(*cairo_raster_source_release_func_t) (cairo_pattern_t *pattern, + void *callback_data, + cairo_surface_t *surface); +cairo_raster_source_release_func_t is the type of function which is +called when the pixel data is no longer being access by the pattern +for the rendering operation. Typically this function will simply +destroy the surface created during acquire. + +Parameters + + + + + + +pattern +the pattern being rendered from + +callback_data +the user data supplied during creation + +surface +the surface created during acquire + + +Since 1.12 + +cairo_raster_source_snapshot_func_t () +cairo_raster_source_snapshot_func_t +cairo_status_t +(*cairo_raster_source_snapshot_func_t) + (cairo_pattern_t *pattern, + void *callback_data); +cairo_raster_source_snapshot_func_t is the type of function which is +called when the pixel data needs to be preserved for later use +during printing. This pattern will be accessed again later, and it +is expected to provide the pixel data that was current at the time +of snapshotting. + +Parameters + + + + + + +pattern +the pattern being rendered from + +callback_data +the user data supplied during creation + + + +Returns + CAIRO_STATUS_SUCCESS on success, or one of the +cairo_status_t error codes for failure. + +Since 1.12 + +cairo_raster_source_copy_func_t () +cairo_raster_source_copy_func_t +cairo_status_t +(*cairo_raster_source_copy_func_t) (cairo_pattern_t *pattern, + void *callback_data, + const cairo_pattern_t *other); +cairo_raster_source_copy_func_t is the type of function which is +called when the pattern gets copied as a normal part of rendering. + +Parameters + + + + + + +pattern +the cairo_pattern_t that was copied to + +callback_data +the user data supplied during creation + +other +the cairo_pattern_t being used as the source for the copy + + + +Returns + CAIRO_STATUS_SUCCESS on success, or one of the +cairo_status_t error codes for failure. + +Since 1.12 + +cairo_raster_source_finish_func_t () +cairo_raster_source_finish_func_t +void +(*cairo_raster_source_finish_func_t) (cairo_pattern_t *pattern, + void *callback_data); +cairo_raster_source_finish_func_t is the type of function which is +called when the pattern (or a copy thereof) is no longer required. + +Parameters + + + + + + +pattern +the pattern being rendered from + +callback_data +the user data supplied during creation + + +Since 1.12 + + + +Types and Values + + + +See Also +cairo_pattern_t + + + + diff --git a/doc/public/xml/cairo-recording.xml b/doc/public/xml/cairo-recording.xml new file mode 100644 index 000000000..196cbd1b1 --- /dev/null +++ b/doc/public/xml/cairo-recording.xml @@ -0,0 +1,213 @@ + + +]> + + +Recording Surfaces +3 + + CAIRO Library + + + +Recording Surfaces +Records all drawing operations + + + +Functions + + + + + +cairo_surface_t * +cairo_recording_surface_create () +void +cairo_recording_surface_ink_extents () +cairo_bool_t +cairo_recording_surface_get_extents () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_RECORDING_SURFACE + + + + + + +Object Hierarchy + + + + + + +Description +A recording surface is a surface that records all drawing operations at +the highest level of the surface backend interface, (that is, the +level of paint, mask, stroke, fill, and show_text_glyphs). The recording +surface can then be "replayed" against any target surface by using it +as a source surface. +If you want to replay a surface so that the results in target will be +identical to the results that would have been obtained if the original +operations applied to the recording surface had instead been applied to the +target surface, you can use code like this: + +cairo_t *cr; + +cr = cairo_create (target); +cairo_set_source_surface (cr, recording_surface, 0.0, 0.0); +cairo_paint (cr); +cairo_destroy (cr); + +A recording surface is logically unbounded, i.e. it has no implicit constraint +on the size of the drawing surface. However, in practice this is rarely +useful as you wish to replay against a particular target surface with +known bounds. For this case, it is more efficient to specify the target +extents to the recording surface upon creation. +The recording phase of the recording surface is careful to snapshot all +necessary objects (paths, patterns, etc.), in order to achieve +accurate replay. The efficiency of the recording surface could be +improved by improving the implementation of snapshot for the +various objects. For example, it would be nice to have a +copy-on-write implementation for _cairo_surface_snapshot. + + + +Functions + +cairo_recording_surface_create () +cairo_recording_surface_create +cairo_surface_t * +cairo_recording_surface_create (cairo_content_t content, + const cairo_rectangle_t *extents); +Creates a recording-surface which can be used to record all drawing operations +at the highest level (that is, the level of paint, mask, stroke, fill +and show_text_glyphs). The recording surface can then be "replayed" against +any target surface by using it as a source to drawing operations. +The recording phase of the recording surface is careful to snapshot all +necessary objects (paths, patterns, etc.), in order to achieve +accurate replay. + +Parameters + + + + + + +content +the content of the recording surface + +extents +the extents to record in pixels, can be NULL to record +unbounded operations. + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. + +Since 1.10 + +cairo_recording_surface_ink_extents () +cairo_recording_surface_ink_extents +void +cairo_recording_surface_ink_extents (cairo_surface_t *surface, + double *x0, + double *y0, + double *width, + double *height); +Measures the extents of the operations stored within the recording-surface. +This is useful to compute the required size of an image surface (or +equivalent) into which to replay the full sequence of drawing operations. + +Parameters + + + + + + +surface +a cairo_recording_surface_t + +x0 +the x-coordinate of the top-left of the ink bounding box + +y0 +the y-coordinate of the top-left of the ink bounding box + +width +the width of the ink bounding box + +height +the height of the ink bounding box + + +Since 1.10 + +cairo_recording_surface_get_extents () +cairo_recording_surface_get_extents +cairo_bool_t +cairo_recording_surface_get_extents (cairo_surface_t *surface, + cairo_rectangle_t *extents); +Get the extents of the recording-surface. + +Parameters + + + + + + +surface +a cairo_recording_surface_t + +extents +the cairo_rectangle_t to be assigned the extents + + + +Returns + TRUE if the surface is bounded, of recording type, and +not in an error state, otherwise FALSE + +Since 1.12 + + + +Types and Values + +CAIRO_HAS_RECORDING_SURFACE +CAIRO_HAS_RECORDING_SURFACE +#define CAIRO_HAS_RECORDING_SURFACE 1 + +Defined if the recording surface backend is available. +The recording surface backend is always built in. +This macro was added for completeness in cairo 1.10. +Since 1.10 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-region.xml b/doc/public/xml/cairo-region.xml new file mode 100644 index 000000000..02a8de0a9 --- /dev/null +++ b/doc/public/xml/cairo-region.xml @@ -0,0 +1,819 @@ + + +]> + + +Regions +3 + + CAIRO Library + + + +Regions +Representing a pixel-aligned area + + + +Functions + + + + + +cairo_region_t * +cairo_region_create () +cairo_region_t * +cairo_region_create_rectangle () +cairo_region_t * +cairo_region_create_rectangles () +cairo_region_t * +cairo_region_copy () +cairo_region_t * +cairo_region_reference () +void +cairo_region_destroy () +cairo_status_t +cairo_region_status () +void +cairo_region_get_extents () +int +cairo_region_num_rectangles () +void +cairo_region_get_rectangle () +cairo_bool_t +cairo_region_is_empty () +cairo_bool_t +cairo_region_contains_point () +cairo_region_overlap_t +cairo_region_contains_rectangle () +cairo_bool_t +cairo_region_equal () +void +cairo_region_translate () +cairo_status_t +cairo_region_intersect () +cairo_status_t +cairo_region_intersect_rectangle () +cairo_status_t +cairo_region_subtract () +cairo_status_t +cairo_region_subtract_rectangle () +cairo_status_t +cairo_region_union () +cairo_status_t +cairo_region_union_rectangle () +cairo_status_t +cairo_region_xor () +cairo_status_t +cairo_region_xor_rectangle () + + + + + + +Types and Values + + + + + +typedefcairo_region_t +enumcairo_region_overlap_t + + + + + + +Object Hierarchy + + + + + + +Description +Regions are a simple graphical data type representing an area of +integer-aligned rectangles. They are often used on raster surfaces +to track areas of interest, such as change or clip areas. + + + +Functions + +cairo_region_create () +cairo_region_create +cairo_region_t * +cairo_region_create (void); +Allocates a new empty region object. + +Returns + A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status(). + +Since 1.10 + +cairo_region_create_rectangle () +cairo_region_create_rectangle +cairo_region_t * +cairo_region_create_rectangle (const cairo_rectangle_int_t *rectangle); +Allocates a new region object containing rectangle +. + +Parameters + + + + + + +rectangle +a cairo_rectangle_int_t + + + +Returns + A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status(). + +Since 1.10 + +cairo_region_create_rectangles () +cairo_region_create_rectangles +cairo_region_t * +cairo_region_create_rectangles (const cairo_rectangle_int_t *rects, + int count); +Allocates a new region object containing the union of all given rects +. + +Parameters + + + + + + +rects +an array of count +rectangles + +count +number of rectangles + + + +Returns + A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status(). + +Since 1.10 + +cairo_region_copy () +cairo_region_copy +cairo_region_t * +cairo_region_copy (const cairo_region_t *original); +Allocates a new region object copying the area from original +. + +Parameters + + + + + + +original +a cairo_region_t + + + +Returns + A newly allocated cairo_region_t. Free with +cairo_region_destroy(). This function always returns a +valid pointer; if memory cannot be allocated, then a special +error object is returned where all operations on the object do nothing. +You can check for this with cairo_region_status(). + +Since 1.10 + +cairo_region_reference () +cairo_region_reference +cairo_region_t * +cairo_region_reference (cairo_region_t *region); +Increases the reference count on region + by one. This prevents +region + from being destroyed until a matching call to +cairo_region_destroy() is made. + +Parameters + + + + + + +region +a cairo_region_t + + + +Returns + the referenced cairo_region_t. + +Since 1.10 + +cairo_region_destroy () +cairo_region_destroy +void +cairo_region_destroy (cairo_region_t *region); +Destroys a cairo_region_t object created with +cairo_region_create(), cairo_region_copy(), or +or cairo_region_create_rectangle(). + +Parameters + + + + + + +region +a cairo_region_t + + +Since 1.10 + +cairo_region_status () +cairo_region_status +cairo_status_t +cairo_region_status (const cairo_region_t *region); +Checks whether an error has previous occurred for this +region object. + +Parameters + + + + + + +region +a cairo_region_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_get_extents () +cairo_region_get_extents +void +cairo_region_get_extents (const cairo_region_t *region, + cairo_rectangle_int_t *extents); +Gets the bounding rectangle of region + as a cairo_rectangle_int_t + +Parameters + + + + + + +region +a cairo_region_t + +extents +rectangle into which to store the extents + + +Since 1.10 + +cairo_region_num_rectangles () +cairo_region_num_rectangles +int +cairo_region_num_rectangles (const cairo_region_t *region); +Returns the number of rectangles contained in region +. + +Parameters + + + + + + +region +a cairo_region_t + + + +Returns + The number of rectangles contained in region +. + +Since 1.10 + +cairo_region_get_rectangle () +cairo_region_get_rectangle +void +cairo_region_get_rectangle (const cairo_region_t *region, + int nth, + cairo_rectangle_int_t *rectangle); +Stores the nth + rectangle from the region in rectangle +. + +Parameters + + + + + + +region +a cairo_region_t + +nth +a number indicating which rectangle should be returned + +rectangle +return location for a cairo_rectangle_int_t + + +Since 1.10 + +cairo_region_is_empty () +cairo_region_is_empty +cairo_bool_t +cairo_region_is_empty (const cairo_region_t *region); +Checks whether region + is empty. + +Parameters + + + + + + +region +a cairo_region_t + + + +Returns + TRUE if region +is empty, FALSE if it isn't. + +Since 1.10 + +cairo_region_contains_point () +cairo_region_contains_point +cairo_bool_t +cairo_region_contains_point (const cairo_region_t *region, + int x, + int y); +Checks whether (x +, y +) is contained in region +. + +Parameters + + + + + + +region +a cairo_region_t + +x +the x coordinate of a point + +y +the y coordinate of a point + + + +Returns + TRUE if (x +, y +) is contained in region +, FALSE if it is not. + +Since 1.10 + +cairo_region_contains_rectangle () +cairo_region_contains_rectangle +cairo_region_overlap_t +cairo_region_contains_rectangle (const cairo_region_t *region, + const cairo_rectangle_int_t *rectangle); +Checks whether rectangle + is inside, outside or partially contained +in region + + +Parameters + + + + + + +region +a cairo_region_t + +rectangle +a cairo_rectangle_int_t + + + +Returns + CAIRO_REGION_OVERLAP_IN if rectangle +is entirely inside region +, +CAIRO_REGION_OVERLAP_OUT if rectangle +is entirely outside region +, or +CAIRO_REGION_OVERLAP_PART if rectangle +is partially inside and partially outside region +. + +Since 1.10 + +cairo_region_equal () +cairo_region_equal +cairo_bool_t +cairo_region_equal (const cairo_region_t *a, + const cairo_region_t *b); +Compares whether region_a is equivalent to region_b. NULL as an argument +is equal to itself, but not to any non-NULL region. + +Parameters + + + + + + +a +a cairo_region_t or NULL + +b +a cairo_region_t or NULL + + + +Returns + TRUE if both regions contained the same coverage, +FALSE if it is not or any region is in an error status. + +Since 1.10 + +cairo_region_translate () +cairo_region_translate +void +cairo_region_translate (cairo_region_t *region, + int dx, + int dy); +Translates region + by (dx +, dy +). + +Parameters + + + + + + +region +a cairo_region_t + +dx +Amount to translate in the x direction + +dy +Amount to translate in the y direction + + +Since 1.10 + +cairo_region_intersect () +cairo_region_intersect +cairo_status_t +cairo_region_intersect (cairo_region_t *dst, + const cairo_region_t *other); +Computes the intersection of dst + with other + and places the result in dst + + +Parameters + + + + + + +dst +a cairo_region_t + +other +another cairo_region_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_intersect_rectangle () +cairo_region_intersect_rectangle +cairo_status_t +cairo_region_intersect_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); +Computes the intersection of dst + with rectangle + and places the +result in dst + + +Parameters + + + + + + +dst +a cairo_region_t + +rectangle +a cairo_rectangle_int_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_subtract () +cairo_region_subtract +cairo_status_t +cairo_region_subtract (cairo_region_t *dst, + const cairo_region_t *other); +Subtracts other + from dst + and places the result in dst + + +Parameters + + + + + + +dst +a cairo_region_t + +other +another cairo_region_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_subtract_rectangle () +cairo_region_subtract_rectangle +cairo_status_t +cairo_region_subtract_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); +Subtracts rectangle + from dst + and places the result in dst + + +Parameters + + + + + + +dst +a cairo_region_t + +rectangle +a cairo_rectangle_int_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_union () +cairo_region_union +cairo_status_t +cairo_region_union (cairo_region_t *dst, + const cairo_region_t *other); +Computes the union of dst + with other + and places the result in dst + + +Parameters + + + + + + +dst +a cairo_region_t + +other +another cairo_region_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_union_rectangle () +cairo_region_union_rectangle +cairo_status_t +cairo_region_union_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); +Computes the union of dst + with rectangle + and places the result in dst +. + +Parameters + + + + + + +dst +a cairo_region_t + +rectangle +a cairo_rectangle_int_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_xor () +cairo_region_xor +cairo_status_t +cairo_region_xor (cairo_region_t *dst, + const cairo_region_t *other); +Computes the exclusive difference of dst + with other + and places the +result in dst +. That is, dst + will be set to contain all areas that +are either in dst + or in other +, but not in both. + +Parameters + + + + + + +dst +a cairo_region_t + +other +another cairo_region_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + +cairo_region_xor_rectangle () +cairo_region_xor_rectangle +cairo_status_t +cairo_region_xor_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); +Computes the exclusive difference of dst + with rectangle + and places the +result in dst +. That is, dst + will be set to contain all areas that are +either in dst + or in rectangle +, but not in both. + +Parameters + + + + + + +dst +a cairo_region_t + +rectangle +a cairo_rectangle_int_t + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY + +Since 1.10 + + + +Types and Values + +cairo_region_t +cairo_region_t +typedef struct _cairo_region cairo_region_t; + +A cairo_region_t represents a set of integer-aligned rectangles. +It allows set-theoretical operations like cairo_region_union() and +cairo_region_intersect() to be performed on them. +Memory management of cairo_region_t is done with +cairo_region_reference() and cairo_region_destroy(). +Since 1.10 + +enum cairo_region_overlap_t +cairo_region_overlap_t +Used as the return value for cairo_region_contains_rectangle(). + +Members + + + + + + +CAIRO_REGION_OVERLAP_IN +The contents are entirely inside the region. (Since 1.10) + + + +CAIRO_REGION_OVERLAP_OUT +The contents are entirely outside the region. (Since 1.10) + + + +CAIRO_REGION_OVERLAP_PART +The contents are partially inside and + partially outside the region. (Since 1.10) + + + + +Since 1.10 + + + + diff --git a/doc/public/xml/cairo-scaled-font.xml b/doc/public/xml/cairo-scaled-font.xml new file mode 100644 index 000000000..1a4f7fd87 --- /dev/null +++ b/doc/public/xml/cairo-scaled-font.xml @@ -0,0 +1,985 @@ + + +]> + + +cairo_scaled_font_t +3 + + CAIRO Library + + + +cairo_scaled_font_t +Font face at particular size and options + + + +Functions + + + + + +cairo_scaled_font_t * +cairo_scaled_font_create () +cairo_scaled_font_t * +cairo_scaled_font_reference () +void +cairo_scaled_font_destroy () +cairo_status_t +cairo_scaled_font_status () +void +cairo_scaled_font_extents () +void +cairo_scaled_font_text_extents () +void +cairo_scaled_font_glyph_extents () +cairo_status_t +cairo_scaled_font_text_to_glyphs () +cairo_font_face_t * +cairo_scaled_font_get_font_face () +void +cairo_scaled_font_get_font_options () +void +cairo_scaled_font_get_font_matrix () +void +cairo_scaled_font_get_ctm () +void +cairo_scaled_font_get_scale_matrix () +cairo_font_type_t +cairo_scaled_font_get_type () +unsigned int +cairo_scaled_font_get_reference_count () +cairo_status_t +cairo_scaled_font_set_user_data () +void * +cairo_scaled_font_get_user_data () + + + + + + +Types and Values + + + + + +typedefcairo_scaled_font_t +cairo_font_extents_t +cairo_text_extents_t + + + + + + +Object Hierarchy + + + + + + +Description +cairo_scaled_font_t represents a realization of a font face at a particular +size and transformation and a certain set of font options. + + + +Functions + +cairo_scaled_font_create () +cairo_scaled_font_create +cairo_scaled_font_t * +cairo_scaled_font_create (cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options); +Creates a cairo_scaled_font_t object from a font face and matrices that +describe the size of the font and the environment in which it will +be used. + +Parameters + + + + + + +font_face +a cairo_font_face_t + +font_matrix +font space to user space transformation matrix for the +font. In the simplest case of a N point font, this matrix is +just a scale by N, but it can also be used to shear the font +or stretch it unequally along the two axes. See +cairo_set_font_matrix(). + +ctm +user to device transformation matrix with which the font will +be used. + +options +options to use when getting metrics for the font and +rendering with it. + + + +Returns + a newly created cairo_scaled_font_t. Destroy with +cairo_scaled_font_destroy() + +Since 1.0 + +cairo_scaled_font_reference () +cairo_scaled_font_reference +cairo_scaled_font_t * +cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font); +Increases the reference count on scaled_font + by one. This prevents +scaled_font + from being destroyed until a matching call to +cairo_scaled_font_destroy() is made. +The number of references to a cairo_scaled_font_t can be get using +cairo_scaled_font_get_reference_count(). + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t, (may be NULL in which case +this function does nothing) + + + +Returns + the referenced cairo_scaled_font_t + +Since 1.0 + +cairo_scaled_font_destroy () +cairo_scaled_font_destroy +void +cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font); +Decreases the reference count on font + by one. If the result +is zero, then font + and all associated resources are freed. +See cairo_scaled_font_reference(). + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + + +Since 1.0 + +cairo_scaled_font_status () +cairo_scaled_font_status +cairo_status_t +cairo_scaled_font_status (cairo_scaled_font_t *scaled_font); +Checks whether an error has previously occurred for this +scaled_font. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + + + +Returns + CAIRO_STATUS_SUCCESS or another error such as +CAIRO_STATUS_NO_MEMORY. + +Since 1.0 + +cairo_scaled_font_extents () +cairo_scaled_font_extents +void +cairo_scaled_font_extents (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *extents); +Gets the metrics for a cairo_scaled_font_t. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +extents +a cairo_font_extents_t which to store the retrieved extents. + + +Since 1.0 + +cairo_scaled_font_text_extents () +cairo_scaled_font_text_extents +void +cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_text_extents_t *extents); +Gets the extents for a string of text. The extents describe a +user-space rectangle that encloses the "inked" portion of the text +drawn at the origin (0,0) (as it would be drawn by cairo_show_text() +if the cairo graphics state were set to the same font_face, +font_matrix, ctm, and font_options as scaled_font +). Additionally, +the x_advance and y_advance values indicate the amount by which the +current point would be advanced by cairo_show_text(). +Note that whitespace characters do not directly contribute to the +size of the rectangle (extents.width and extents.height). They do +contribute indirectly by changing the position of non-whitespace +characters. In particular, trailing whitespace characters are +likely to not affect the size of the rectangle, though they will +affect the x_advance and y_advance values. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +utf8 +a NUL-terminated string of text, encoded in UTF-8 + +extents +a cairo_text_extents_t which to store the retrieved extents. + + +Since 1.2 + +cairo_scaled_font_glyph_extents () +cairo_scaled_font_glyph_extents +void +cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents); +Gets the extents for an array of glyphs. The extents describe a +user-space rectangle that encloses the "inked" portion of the +glyphs, (as they would be drawn by cairo_show_glyphs() if the cairo +graphics state were set to the same font_face, font_matrix, ctm, +and font_options as scaled_font +). Additionally, the x_advance and +y_advance values indicate the amount by which the current point +would be advanced by cairo_show_glyphs(). +Note that whitespace glyphs do not contribute to the size of the +rectangle (extents.width and extents.height). + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +glyphs +an array of glyph IDs with X and Y offsets. + +num_glyphs +the number of glyphs in the glyphs +array + +extents +a cairo_text_extents_t which to store the retrieved extents. + + +Since 1.0 + +cairo_scaled_font_text_to_glyphs () +cairo_scaled_font_text_to_glyphs +cairo_status_t +cairo_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, + double x, + double y, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags); +Converts UTF-8 text to an array of glyphs, optionally with cluster +mapping, that can be used to render later using scaled_font +. +If glyphs + initially points to a non-NULL value, that array is used +as a glyph buffer, and num_glyphs + should point to the number of glyph +entries available there. If the provided glyph array is too short for +the conversion, a new glyph array is allocated using cairo_glyph_allocate() +and placed in glyphs +. Upon return, num_glyphs + always contains the +number of generated glyphs. If the value glyphs + points to has changed +after the call, the user is responsible for freeing the allocated glyph +array using cairo_glyph_free(). This may happen even if the provided +array was large enough. +If clusters + is not NULL, num_clusters + and cluster_flags + should not be NULL, +and cluster mapping will be computed. +The semantics of how cluster array allocation works is similar to the glyph +array. That is, +if clusters + initially points to a non-NULL value, that array is used +as a cluster buffer, and num_clusters + should point to the number of cluster +entries available there. If the provided cluster array is too short for +the conversion, a new cluster array is allocated using cairo_text_cluster_allocate() +and placed in clusters +. Upon return, num_clusters + always contains the +number of generated clusters. If the value clusters + points at has changed +after the call, the user is responsible for freeing the allocated cluster +array using cairo_text_cluster_free(). This may happen even if the provided +array was large enough. +In the simplest case, glyphs + and clusters + can point to NULL initially +and a suitable array will be allocated. In code: + +cairo_status_t status; + +cairo_glyph_t *glyphs = NULL; +int num_glyphs; +cairo_text_cluster_t *clusters = NULL; +int num_clusters; +cairo_text_cluster_flags_t cluster_flags; + +status = cairo_scaled_font_text_to_glyphs (scaled_font, + x, y, + utf8, utf8_len, + &glyphs, &num_glyphs, + &clusters, &num_clusters, &cluster_flags); + +if (status == CAIRO_STATUS_SUCCESS) { + cairo_show_text_glyphs (cr, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags); + + cairo_glyph_free (glyphs); + cairo_text_cluster_free (clusters); +} + +If no cluster mapping is needed: + +cairo_status_t status; + +cairo_glyph_t *glyphs = NULL; +int num_glyphs; + +status = cairo_scaled_font_text_to_glyphs (scaled_font, + x, y, + utf8, utf8_len, + &glyphs, &num_glyphs, + NULL, NULL, + NULL); + +if (status == CAIRO_STATUS_SUCCESS) { + cairo_show_glyphs (cr, glyphs, num_glyphs); + cairo_glyph_free (glyphs); +} + +If stack-based glyph and cluster arrays are to be used for small +arrays: + +cairo_status_t status; + +cairo_glyph_t stack_glyphs[40]; +cairo_glyph_t *glyphs = stack_glyphs; +int num_glyphs = sizeof (stack_glyphs) / sizeof (stack_glyphs[0]); +cairo_text_cluster_t stack_clusters[40]; +cairo_text_cluster_t *clusters = stack_clusters; +int num_clusters = sizeof (stack_clusters) / sizeof (stack_clusters[0]); +cairo_text_cluster_flags_t cluster_flags; + +status = cairo_scaled_font_text_to_glyphs (scaled_font, + x, y, + utf8, utf8_len, + &glyphs, &num_glyphs, + &clusters, &num_clusters, &cluster_flags); + +if (status == CAIRO_STATUS_SUCCESS) { + cairo_show_text_glyphs (cr, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags); + + if (glyphs != stack_glyphs) + cairo_glyph_free (glyphs); + if (clusters != stack_clusters) + cairo_text_cluster_free (clusters); +} + +For details of how clusters +, num_clusters +, and cluster_flags + map input +UTF-8 text to the output glyphs see cairo_show_text_glyphs(). +The output values can be readily passed to cairo_show_text_glyphs() +cairo_show_glyphs(), or related functions, assuming that the exact +same scaled_font + is used for the operation. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +x +X position to place first glyph + +y +Y position to place first glyph + +utf8 +a string of text encoded in UTF-8 + +utf8_len +length of utf8 +in bytes, or -1 if it is NUL-terminated + +glyphs +pointer to array of glyphs to fill + +num_glyphs +pointer to number of glyphs + +clusters +pointer to array of cluster mapping information to fill, or NULL + +num_clusters +pointer to number of clusters, or NULL + +cluster_flags +pointer to location to store cluster flags corresponding to the +output clusters +, or NULL + + + +Returns + CAIRO_STATUS_SUCCESS upon success, or an error status +if the input values are wrong or if conversion failed. If the input +values are correct but the conversion failed, the error status is also +set on scaled_font +. + +Since 1.8 + +cairo_scaled_font_get_font_face () +cairo_scaled_font_get_font_face +cairo_font_face_t * +cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font); +Gets the font face that this scaled font uses. This might be the +font face passed to cairo_scaled_font_create(), but this does not +hold true for all possible cases. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + + + +Returns + The cairo_font_face_t with which scaled_font +was +created. This object is owned by cairo. To keep a reference to it, +you must call cairo_scaled_font_reference(). + +Since 1.2 + +cairo_scaled_font_get_font_options () +cairo_scaled_font_get_font_options +void +cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font, + cairo_font_options_t *options); +Stores the font options with which scaled_font + was created into +options +. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +options +return value for the font options + + +Since 1.2 + +cairo_scaled_font_get_font_matrix () +cairo_scaled_font_get_font_matrix +void +cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *font_matrix); +Stores the font matrix with which scaled_font + was created into +matrix +. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +font_matrix +return value for the matrix + + +Since 1.2 + +cairo_scaled_font_get_ctm () +cairo_scaled_font_get_ctm +void +cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *ctm); +Stores the CTM with which scaled_font + was created into ctm +. +Note that the translation offsets (x0, y0) of the CTM are ignored +by cairo_scaled_font_create(). So, the matrix this +function returns always has 0,0 as x0,y0. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +ctm +return value for the CTM + + +Since 1.2 + +cairo_scaled_font_get_scale_matrix () +cairo_scaled_font_get_scale_matrix +void +cairo_scaled_font_get_scale_matrix (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *scale_matrix); +Stores the scale matrix of scaled_font + into matrix +. +The scale matrix is product of the font matrix and the ctm +associated with the scaled font, and hence is the matrix mapping from +font space to device space. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +scale_matrix +return value for the matrix + + +Since 1.8 + +cairo_scaled_font_get_type () +cairo_scaled_font_get_type +cairo_font_type_t +cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font); +This function returns the type of the backend used to create +a scaled font. See cairo_font_type_t for available types. +However, this function never returns CAIRO_FONT_TYPE_TOY. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + + + +Returns + The type of scaled_font +. + +Since 1.2 + +cairo_scaled_font_get_reference_count () +cairo_scaled_font_get_reference_count +unsigned int +cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font); +Returns the current reference count of scaled_font +. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + + + +Returns + the current reference count of scaled_font +. If the +object is a nil object, 0 will be returned. + +Since 1.4 + +cairo_scaled_font_set_user_data () +cairo_scaled_font_set_user_data +cairo_status_t +cairo_scaled_font_set_user_data (cairo_scaled_font_t *scaled_font, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); +Attach user data to scaled_font +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +key +the address of a cairo_user_data_key_t to attach the user data to + +user_data +the user data to attach to the cairo_scaled_font_t + +destroy +a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key. + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.4 + +cairo_scaled_font_get_user_data () +cairo_scaled_font_get_user_data +void * +cairo_scaled_font_get_user_data (cairo_scaled_font_t *scaled_font, + const cairo_user_data_key_t *key); +Return user data previously attached to scaled_font + using the +specified key. If no user data has been attached with the given +key this function returns NULL. + +Parameters + + + + + + +scaled_font +a cairo_scaled_font_t + +key +the address of the cairo_user_data_key_t the user data was +attached to + + + +Returns + the user data previously attached or NULL. + +Since 1.4 + + + +Types and Values + +cairo_scaled_font_t +cairo_scaled_font_t +typedef struct _cairo_scaled_font cairo_scaled_font_t; + +A cairo_scaled_font_t is a font scaled to a particular size and device +resolution. A cairo_scaled_font_t is most useful for low-level font +usage where a library or application wants to cache a reference +to a scaled font to speed up the computation of metrics. +There are various types of scaled fonts, depending on the +font backend they use. The type of a +scaled font can be queried using cairo_scaled_font_get_type(). +Memory management of cairo_scaled_font_t is done with +cairo_scaled_font_reference() and cairo_scaled_font_destroy(). +Since 1.0 + +cairo_font_extents_t +cairo_font_extents_t +typedef struct { + double ascent; + double descent; + double height; + double max_x_advance; + double max_y_advance; +} cairo_font_extents_t; + +The cairo_font_extents_t structure stores metric information for +a font. Values are given in the current user-space coordinate +system. +Because font metrics are in user-space coordinates, they are +mostly, but not entirely, independent of the current transformation +matrix. If you call cairo_scale(cr, 2.0, 2.0), +text will be drawn twice as big, but the reported text extents will +not be doubled. They will change slightly due to hinting (so you +can't assume that metrics are independent of the transformation +matrix), but otherwise will remain unchanged. + +Members + + + + + + +double ascent; +the distance that the font extends above the baseline. +Note that this is not always exactly equal to the maximum +of the extents of all the glyphs in the font, but rather +is picked to express the font designer's intent as to +how the font should align with elements above it. +the distance that the font extends above the baseline. +Note that this is not always exactly equal to the maximum +of the extents of all the glyphs in the font, but rather +is picked to express the font designer's intent as to +how the font should align with elements above it. + + +double descent; +the distance that the font extends below the baseline. +This value is positive for typical fonts that include +portions below the baseline. Note that this is not always +exactly equal to the maximum of the extents of all the +glyphs in the font, but rather is picked to express the +font designer's intent as to how the font should +align with elements below it. +the distance that the font extends below the baseline. +This value is positive for typical fonts that include +portions below the baseline. Note that this is not always +exactly equal to the maximum of the extents of all the +glyphs in the font, but rather is picked to express the +font designer's intent as to how the font should +align with elements below it. + + +double height; +the recommended vertical distance between baselines when +setting consecutive lines of text with the font. This +is greater than ascent ++descent +by a +quantity known as the line spacing +or external leading. When space +is at a premium, most fonts can be set with only +a distance of ascent ++descent +between lines. +the recommended vertical distance between baselines when +setting consecutive lines of text with the font. This +is greater than ascent ++descent +by a +quantity known as the line spacing +or external leading. When space +is at a premium, most fonts can be set with only +a distance of ascent ++descent +between lines. + + +double max_x_advance; +the maximum distance in the X direction that +the origin is advanced for any glyph in the font. +the maximum distance in the X direction that +the origin is advanced for any glyph in the font. + + +double max_y_advance; +the maximum distance in the Y direction that +the origin is advanced for any glyph in the font. +This will be zero for normal fonts used for horizontal +writing. (The scripts of East Asia are sometimes written +vertically.) +the maximum distance in the Y direction that +the origin is advanced for any glyph in the font. +This will be zero for normal fonts used for horizontal +writing. (The scripts of East Asia are sometimes written +vertically.) + + + + +Since 1.0 + +cairo_text_extents_t +cairo_text_extents_t +typedef struct { + double x_bearing; + double y_bearing; + double width; + double height; + double x_advance; + double y_advance; +} cairo_text_extents_t; + +The cairo_text_extents_t structure stores the extents of a single +glyph or a string of glyphs in user-space coordinates. Because text +extents are in user-space coordinates, they are mostly, but not +entirely, independent of the current transformation matrix. If you call +cairo_scale(cr, 2.0, 2.0), text will +be drawn twice as big, but the reported text extents will not be +doubled. They will change slightly due to hinting (so you can't +assume that metrics are independent of the transformation matrix), +but otherwise will remain unchanged. + +Members + + + + + + +double x_bearing; +the horizontal distance from the origin to the +leftmost part of the glyphs as drawn. Positive if the +glyphs lie entirely to the right of the origin. +the horizontal distance from the origin to the +leftmost part of the glyphs as drawn. Positive if the +glyphs lie entirely to the right of the origin. + + +double y_bearing; +the vertical distance from the origin to the +topmost part of the glyphs as drawn. Positive only if the +glyphs lie completely below the origin; will usually be +negative. +the vertical distance from the origin to the +topmost part of the glyphs as drawn. Positive only if the +glyphs lie completely below the origin; will usually be +negative. + + +double width; +width of the glyphs as drawn +width of the glyphs as drawn + + +double height; +height of the glyphs as drawn +height of the glyphs as drawn + + +double x_advance; +distance to advance in the X direction +after drawing these glyphs +distance to advance in the X direction +after drawing these glyphs + + +double y_advance; +distance to advance in the Y direction +after drawing these glyphs. Will typically be zero except +for vertical text layout as found in East-Asian languages. +distance to advance in the Y direction +after drawing these glyphs. Will typically be zero except +for vertical text layout as found in East-Asian languages. + + + + +Since 1.0 + + + +See Also +cairo_font_face_t, cairo_matrix_t, cairo_font_options_t + + + + diff --git a/doc/public/xml/cairo-script.xml b/doc/public/xml/cairo-script.xml new file mode 100644 index 000000000..2f0d9ffe9 --- /dev/null +++ b/doc/public/xml/cairo-script.xml @@ -0,0 +1,362 @@ + + +]> + + +Script Surfaces +3 + + CAIRO Library + + + +Script Surfaces +Rendering to replayable scripts + + + +Functions + + + + + +cairo_device_t * +cairo_script_create () +cairo_device_t * +cairo_script_create_for_stream () +cairo_status_t +cairo_script_from_recording_surface () +cairo_script_mode_t +cairo_script_get_mode () +void +cairo_script_set_mode () +cairo_surface_t * +cairo_script_surface_create () +cairo_surface_t * +cairo_script_surface_create_for_target () +void +cairo_script_write_comment () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_SCRIPT_SURFACE +enumcairo_script_mode_t + + + + + + +Object Hierarchy + + + + + + +Description +The script surface provides the ability to render to a native +script that matches the cairo drawing model. The scripts can +be replayed using tools under the util/cairo-script directoriy, +or with cairo-perf-trace. + + + +Functions + +cairo_script_create () +cairo_script_create +cairo_device_t * +cairo_script_create (const char *filename); +Creates a output device for emitting the script, used when +creating the individual surfaces. + +Parameters + + + + + + +filename +the name (path) of the file to write the script to + + + +Returns + a pointer to the newly created device. The caller +owns the surface and should call cairo_device_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" device if an error such as out of memory +occurs. You can use cairo_device_status() to check for this. + +Since 1.12 + +cairo_script_create_for_stream () +cairo_script_create_for_stream +cairo_device_t * +cairo_script_create_for_stream (cairo_write_func_t write_func, + void *closure); +Creates a output device for emitting the script, used when +creating the individual surfaces. + +Parameters + + + + + + +write_func +callback function passed the bytes written to the script + +closure +user data to be passed to the callback + + + +Returns + a pointer to the newly created device. The caller +owns the surface and should call cairo_device_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" device if an error such as out of memory +occurs. You can use cairo_device_status() to check for this. + +Since 1.12 + +cairo_script_from_recording_surface () +cairo_script_from_recording_surface +cairo_status_t +cairo_script_from_recording_surface (cairo_device_t *script, + cairo_surface_t *recording_surface); +Converts the record operations in recording_surface + into a script. + +Parameters + + + + + + +script +the script (output device) + +recording_surface +the recording surface to replay + + + +Returns + CAIRO_STATUS_SUCCESS on successful completion or an error code. + +Since 1.12 + +cairo_script_get_mode () +cairo_script_get_mode +cairo_script_mode_t +cairo_script_get_mode (cairo_device_t *script); +Queries the script for its current output mode. + +Parameters + + + + + + +script +The script (output device) to query + + + +Returns + the current output mode of the script + +Since 1.12 + +cairo_script_set_mode () +cairo_script_set_mode +void +cairo_script_set_mode (cairo_device_t *script, + cairo_script_mode_t mode); +Change the output mode of the script + +Parameters + + + + + + +script +The script (output device) + +mode +the new mode + + +Since 1.12 + +cairo_script_surface_create () +cairo_script_surface_create +cairo_surface_t * +cairo_script_surface_create (cairo_device_t *script, + cairo_content_t content, + double width, + double height); +Create a new surface that will emit its rendering through script + + +Parameters + + + + + + +script +the script (output device) + +content +the content of the surface + +width +width in pixels + +height +height in pixels + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.12 + +cairo_script_surface_create_for_target () +cairo_script_surface_create_for_target +cairo_surface_t * +cairo_script_surface_create_for_target + (cairo_device_t *script, + cairo_surface_t *target); +Create a pxoy surface that will render to target + and record +the operations to device +. + +Parameters + + + + + + +script +the script (output device) + +target +a target surface to wrap + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.12 + +cairo_script_write_comment () +cairo_script_write_comment +void +cairo_script_write_comment (cairo_device_t *script, + const char *comment, + int len); +Emit a string verbatim into the script. + +Parameters + + + + + + +script +the script (output device) + +comment +the string to emit + +len +the length of the sting to write, or -1 to use strlen() + + +Since 1.12 + + + +Types and Values + +CAIRO_HAS_SCRIPT_SURFACE +CAIRO_HAS_SCRIPT_SURFACE +#define CAIRO_HAS_SCRIPT_SURFACE 1 + +Defined if the script surface backend is available. +The script surface backend is always built in since 1.12. +Since 1.12 + +enum cairo_script_mode_t +cairo_script_mode_t +A set of script output variants. + +Members + + + + + + +CAIRO_SCRIPT_MODE_ASCII +the output will be in readable text (default). (Since 1.12) + + + +CAIRO_SCRIPT_MODE_BINARY +the output will use byte codes. (Since 1.12) + + + + +Since 1.12 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-skia.xml b/doc/public/xml/cairo-skia.xml new file mode 100644 index 000000000..7f088731f --- /dev/null +++ b/doc/public/xml/cairo-skia.xml @@ -0,0 +1,99 @@ + + +]> + + +cairo-skia +3 + + CAIRO Library + + + +cairo-skia + + + + +Functions + + + + + +bool +format_to_sk_config () + + + + + + +Types and Values + + + + + +typedefcairo_skia_context_t +typedefcairo_skia_surface_t + + + + + + +Object Hierarchy + + + + + + +Description + + + + + +Functions + +format_to_sk_config () +format_to_sk_config +bool +format_to_sk_config (cairo_format_t format); + + + +Returns + + + + + + +Types and Values + +cairo_skia_context_t +cairo_skia_context_t +typedef struct _cairo_skia_context cairo_skia_context_t; + +A cairo_skia_context_t includes handles to Skia's canvas, +paint, and path objects along with the Cairo source surfaces +and matrix, and the original and target cairo_skia_surface_t +objects. +Since 1.10 + +cairo_skia_surface_t +cairo_skia_surface_t +typedef struct _cairo_skia_surface cairo_skia_surface_t; + +A cairo_skia_surface_t is a container for the underlying +SkBitmap and the corresponding Cairo image surface. +Since 1.10 + + + + diff --git a/doc/public/xml/cairo-status.xml b/doc/public/xml/cairo-status.xml new file mode 100644 index 000000000..bd2fc5014 --- /dev/null +++ b/doc/public/xml/cairo-status.xml @@ -0,0 +1,354 @@ + + +]> + + +Error handling +3 + + CAIRO Library + + + +Error handling +Decoding cairo's status + + + +Functions + + + + + +const char * +cairo_status_to_string () +void +cairo_debug_reset_static_data () + + + + + + +Types and Values + + + + + +enumcairo_status_t + + + + + + +Object Hierarchy + + + + + + +Description +Cairo uses a single status type to represent all kinds of errors. A status +value of CAIRO_STATUS_SUCCESS represents no error and has an integer value +of zero. All other status values represent an error. +Cairo's error handling is designed to be easy to use and safe. All major +cairo objects retain an error status internally which +can be queried anytime by the users using cairo*_status() calls. In +the mean time, it is safe to call all cairo functions normally even if the +underlying object is in an error status. This means that no error handling +code is required before or after each individual cairo function call. + + + +Functions + +cairo_status_to_string () +cairo_status_to_string +const char * +cairo_status_to_string (cairo_status_t status); +Provides a human-readable description of a cairo_status_t. + +Parameters + + + + + + +status +a cairo status + + + +Returns + a string representation of the status + +Since 1.0 + +cairo_debug_reset_static_data () +cairo_debug_reset_static_data +void +cairo_debug_reset_static_data (void); +Resets all static data within cairo to its original state, +(ie. identical to the state at the time of program invocation). For +example, all caches within cairo will be flushed empty. +This function is intended to be useful when using memory-checking +tools such as valgrind. When valgrind's memcheck analyzes a +cairo-using program without a call to cairo_debug_reset_static_data(), +it will report all data reachable via cairo's static objects as +"still reachable". Calling cairo_debug_reset_static_data() just prior +to program termination will make it easier to get squeaky clean +reports from valgrind. +WARNING: It is only safe to call this function when there are no +active cairo objects remaining, (ie. the appropriate destroy +functions have been called as necessary). If there are active cairo +objects, this call is likely to cause a crash, (eg. an assertion +failure due to a hash table being destroyed when non-empty). +Since 1.0 + + + +Types and Values + +enum cairo_status_t +cairo_status_t +cairo_status_t is used to indicate errors that can occur when +using Cairo. In some cases it is returned directly by functions. +but when using cairo_t, the last error, if any, is stored in +the context and can be retrieved with cairo_status(). +New entries may be added in future versions. Use cairo_status_to_string() +to get a human-readable representation of an error message. + +Members + + + + + + +CAIRO_STATUS_SUCCESS +no error has occurred (Since 1.0) + + + +CAIRO_STATUS_NO_MEMORY +out of memory (Since 1.0) + + + +CAIRO_STATUS_INVALID_RESTORE +cairo_restore() called without matching cairo_save() (Since 1.0) + + + +CAIRO_STATUS_INVALID_POP_GROUP +no saved group to pop, i.e. cairo_pop_group() without matching cairo_push_group() (Since 1.0) + + + +CAIRO_STATUS_NO_CURRENT_POINT +no current point defined (Since 1.0) + + + +CAIRO_STATUS_INVALID_MATRIX +invalid matrix (not invertible) (Since 1.0) + + + +CAIRO_STATUS_INVALID_STATUS +invalid value for an input cairo_status_t (Since 1.0) + + + +CAIRO_STATUS_NULL_POINTER +NULL pointer (Since 1.0) + + + +CAIRO_STATUS_INVALID_STRING +input string not valid UTF-8 (Since 1.0) + + + +CAIRO_STATUS_INVALID_PATH_DATA +input path data not valid (Since 1.0) + + + +CAIRO_STATUS_READ_ERROR +error while reading from input stream (Since 1.0) + + + +CAIRO_STATUS_WRITE_ERROR +error while writing to output stream (Since 1.0) + + + +CAIRO_STATUS_SURFACE_FINISHED +target surface has been finished (Since 1.0) + + + +CAIRO_STATUS_SURFACE_TYPE_MISMATCH +the surface type is not appropriate for the operation (Since 1.0) + + + +CAIRO_STATUS_PATTERN_TYPE_MISMATCH +the pattern type is not appropriate for the operation (Since 1.0) + + + +CAIRO_STATUS_INVALID_CONTENT +invalid value for an input cairo_content_t (Since 1.0) + + + +CAIRO_STATUS_INVALID_FORMAT +invalid value for an input cairo_format_t (Since 1.0) + + + +CAIRO_STATUS_INVALID_VISUAL +invalid value for an input Visual* (Since 1.0) + + + +CAIRO_STATUS_FILE_NOT_FOUND +file not found (Since 1.0) + + + +CAIRO_STATUS_INVALID_DASH +invalid value for a dash setting (Since 1.0) + + + +CAIRO_STATUS_INVALID_DSC_COMMENT +invalid value for a DSC comment (Since 1.2) + + + +CAIRO_STATUS_INVALID_INDEX +invalid index passed to getter (Since 1.4) + + + +CAIRO_STATUS_CLIP_NOT_REPRESENTABLE +clip region not representable in desired format (Since 1.4) + + + +CAIRO_STATUS_TEMP_FILE_ERROR +error creating or writing to a temporary file (Since 1.6) + + + +CAIRO_STATUS_INVALID_STRIDE +invalid value for stride (Since 1.6) + + + +CAIRO_STATUS_FONT_TYPE_MISMATCH +the font type is not appropriate for the operation (Since 1.8) + + + +CAIRO_STATUS_USER_FONT_IMMUTABLE +the user-font is immutable (Since 1.8) + + + +CAIRO_STATUS_USER_FONT_ERROR +error occurred in a user-font callback function (Since 1.8) + + + +CAIRO_STATUS_NEGATIVE_COUNT +negative number used where it is not allowed (Since 1.8) + + + +CAIRO_STATUS_INVALID_CLUSTERS +input clusters do not represent the accompanying text and glyph array (Since 1.8) + + + +CAIRO_STATUS_INVALID_SLANT +invalid value for an input cairo_font_slant_t (Since 1.8) + + + +CAIRO_STATUS_INVALID_WEIGHT +invalid value for an input cairo_font_weight_t (Since 1.8) + + + +CAIRO_STATUS_INVALID_SIZE +invalid value (typically too big) for the size of the input (surface, pattern, etc.) (Since 1.10) + + + +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED +user-font method not implemented (Since 1.10) + + + +CAIRO_STATUS_DEVICE_TYPE_MISMATCH +the device type is not appropriate for the operation (Since 1.10) + + + +CAIRO_STATUS_DEVICE_ERROR +an operation to the device caused an unspecified error (Since 1.10) + + + +CAIRO_STATUS_INVALID_MESH_CONSTRUCTION +a mesh pattern + construction operation was used outside of a + cairo_mesh_pattern_begin_patch()/cairo_mesh_pattern_end_patch() + pair (Since 1.12) + + + +CAIRO_STATUS_DEVICE_FINISHED +target device has been finished (Since 1.12) + + + +CAIRO_STATUS_JBIG2_GLOBAL_MISSING +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID has been used on at least one image + but no image provided CAIRO_MIME_TYPE_JBIG2_GLOBAL (Since 1.14) + + + +CAIRO_STATUS_LAST_STATUS +this is a special value indicating the number of + status values defined in this enumeration. When using this value, note + that the version of cairo at run-time may have additional status values + defined than the value of this symbol at compile-time. (Since 1.10) + + + + +Since 1.0 + + + +See Also +cairo_status(), cairo_surface_status(), cairo_pattern_status(), + cairo_font_face_status(), cairo_scaled_font_status(), + cairo_region_status() + + + + diff --git a/doc/public/xml/cairo-surface-observer.xml b/doc/public/xml/cairo-surface-observer.xml new file mode 100644 index 000000000..cfa56fe73 --- /dev/null +++ b/doc/public/xml/cairo-surface-observer.xml @@ -0,0 +1,301 @@ + + +]> + + +cairo-surface-observer +3 + + CAIRO Library + + + +cairo-surface-observer + + + + +Functions + + + + + +cairo_surface_t * +cairo_surface_create_observer () +cairo_status_t +cairo_surface_observer_add_fill_callback () +cairo_status_t +cairo_surface_observer_add_finish_callback () +cairo_status_t +cairo_surface_observer_add_flush_callback () +cairo_status_t +cairo_surface_observer_add_glyphs_callback () +cairo_status_t +cairo_surface_observer_add_mask_callback () +cairo_status_t +cairo_surface_observer_add_paint_callback () +cairo_status_t +cairo_surface_observer_add_stroke_callback () +void +(*cairo_surface_observer_callback_t) () +double +cairo_surface_observer_elapsed () +cairo_status_t +cairo_surface_observer_print () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_OBSERVER_SURFACE +enumcairo_surface_observer_mode_t + + + + + + +Object Hierarchy + + + + + + +Description + + + + + +Functions + +cairo_surface_create_observer () +cairo_surface_create_observer +cairo_surface_t * +cairo_surface_create_observer (cairo_surface_t *target, + cairo_surface_observer_mode_t mode); +Create a new surface that exists solely to watch another is doing. In +the process it will log operations and times, which are fast, which are +slow, which are frequent, etc. +The mode + parameter can be set to either CAIRO_SURFACE_OBSERVER_NORMAL +or CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS, to control whether or not +the internal observer should record operations. + +Parameters + + + + + + +target +an existing surface for which the observer will watch + +mode +sets the mode of operation (normal vs. record) + + + +Returns + a pointer to the newly allocated surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs. + +Since 1.12 + +cairo_surface_observer_add_fill_callback () +cairo_surface_observer_add_fill_callback +cairo_status_t +cairo_surface_observer_add_fill_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_add_finish_callback () +cairo_surface_observer_add_finish_callback +cairo_status_t +cairo_surface_observer_add_finish_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_add_flush_callback () +cairo_surface_observer_add_flush_callback +cairo_status_t +cairo_surface_observer_add_flush_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_add_glyphs_callback () +cairo_surface_observer_add_glyphs_callback +cairo_status_t +cairo_surface_observer_add_glyphs_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_add_mask_callback () +cairo_surface_observer_add_mask_callback +cairo_status_t +cairo_surface_observer_add_mask_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_add_paint_callback () +cairo_surface_observer_add_paint_callback +cairo_status_t +cairo_surface_observer_add_paint_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_add_stroke_callback () +cairo_surface_observer_add_stroke_callback +cairo_status_t +cairo_surface_observer_add_stroke_callback + (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + + + +Returns + + + + +cairo_surface_observer_callback_t () +cairo_surface_observer_callback_t +void +(*cairo_surface_observer_callback_t) (cairo_surface_t *observer, + cairo_surface_t *target, + void *data); + + + + +cairo_surface_observer_elapsed () +cairo_surface_observer_elapsed +double +cairo_surface_observer_elapsed (cairo_surface_t *surface); + + + +Returns + + + + +cairo_surface_observer_print () +cairo_surface_observer_print +cairo_status_t +cairo_surface_observer_print (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure); + + + +Returns + + + + + + +Types and Values + +CAIRO_HAS_OBSERVER_SURFACE +CAIRO_HAS_OBSERVER_SURFACE +#define CAIRO_HAS_OBSERVER_SURFACE 1 + + + + + +enum cairo_surface_observer_mode_t +cairo_surface_observer_mode_t +Whether operations should be recorded. + +Members + + + + + + +CAIRO_SURFACE_OBSERVER_NORMAL +no recording is done + + + +CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS +operations are recorded + + + + +Since 1.12 + + + + diff --git a/doc/public/xml/cairo-surface.xml b/doc/public/xml/cairo-surface.xml new file mode 100644 index 000000000..65eb65005 --- /dev/null +++ b/doc/public/xml/cairo-surface.xml @@ -0,0 +1,1510 @@ + + +]> + + +cairo_surface_t +3 + + CAIRO Library + + + +cairo_surface_t +Base class for surfaces + + + +Functions + + + + + +cairo_surface_t * +cairo_surface_create_similar () +cairo_surface_t * +cairo_surface_create_similar_image () +cairo_surface_t * +cairo_surface_create_for_rectangle () +cairo_surface_t * +cairo_surface_reference () +void +cairo_surface_destroy () +cairo_status_t +cairo_surface_status () +void +cairo_surface_finish () +void +cairo_surface_flush () +cairo_device_t * +cairo_surface_get_device () +void +cairo_surface_get_font_options () +cairo_content_t +cairo_surface_get_content () +void +cairo_surface_mark_dirty () +void +cairo_surface_mark_dirty_rectangle () +void +cairo_surface_set_device_offset () +void +cairo_surface_get_device_offset () +void +cairo_surface_get_device_scale () +void +cairo_surface_set_device_scale () +void +cairo_surface_set_fallback_resolution () +void +cairo_surface_get_fallback_resolution () +cairo_surface_type_t +cairo_surface_get_type () +unsigned int +cairo_surface_get_reference_count () +cairo_status_t +cairo_surface_set_user_data () +void * +cairo_surface_get_user_data () +void +cairo_surface_copy_page () +void +cairo_surface_show_page () +cairo_bool_t +cairo_surface_has_show_text_glyphs () +cairo_status_t +cairo_surface_set_mime_data () +void +cairo_surface_get_mime_data () +cairo_bool_t +cairo_surface_supports_mime_type () +cairo_surface_t * +cairo_surface_map_to_image () +void +cairo_surface_unmap_image () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_MIME_SURFACE +#defineCAIRO_MIME_TYPE_JBIG2 +#defineCAIRO_MIME_TYPE_JBIG2_GLOBAL +#defineCAIRO_MIME_TYPE_JBIG2_GLOBAL_ID +#defineCAIRO_MIME_TYPE_JP2 +#defineCAIRO_MIME_TYPE_JPEG +#defineCAIRO_MIME_TYPE_PNG +#defineCAIRO_MIME_TYPE_URI +#defineCAIRO_MIME_TYPE_UNIQUE_ID +typedefcairo_surface_t +enumcairo_content_t +enumcairo_surface_type_t + + + + + + +Object Hierarchy + + + + + + +Description +cairo_surface_t is the abstract type representing all different drawing +targets that cairo can render to. The actual drawings are +performed using a cairo context. +A cairo surface is created by using backend-specific +constructors, typically of the form +cairo_backend_surface_create(). +Most surface types allow accessing the surface without using Cairo +functions. If you do this, keep in mind that it is mandatory that you call +cairo_surface_flush() before reading from or writing to the surface and that +you must use cairo_surface_mark_dirty() after modifying it. + +Directly modifying an image surface + +void +modify_image_surface (cairo_surface_t *surface) +{ + unsigned char *data; + int width, height, stride; + + // flush to ensure all writing to the image was done + cairo_surface_flush (surface); + + // modify the image + data = cairo_image_surface_get_data (surface); + width = cairo_image_surface_get_width (surface); + height = cairo_image_surface_get_height (surface); + stride = cairo_image_surface_get_stride (surface); + modify_image_data (data, width, height, stride); + + // mark the image dirty so Cairo clears its caches. + cairo_surface_mark_dirty (surface); +} + + +Note that for other surface types it might be necessary to acquire the +surface's device first. See cairo_device_acquire() for a discussion of +devices. + + + +Functions + +cairo_surface_create_similar () +cairo_surface_create_similar +cairo_surface_t * +cairo_surface_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, + int height); +Create a new surface that is as compatible as possible with an +existing surface. For example the new surface will have the same +fallback resolution and font options as other +. Generally, the new +surface will also use the same backend as other +, unless that is +not possible for some reason. The type of the returned surface may +be examined with cairo_surface_get_type(). +Initially the surface contents are all 0 (transparent if contents +have transparency, black otherwise.) +Use cairo_surface_create_similar_image() if you need an image surface +which can be painted quickly to the target surface. + +Parameters + + + + + + +other +an existing surface used to select the backend of the new surface + +content +the content for the new surface + +width +width of the new surface, (in device-space units) + +height +height of the new surface (in device-space units) + + + +Returns + a pointer to the newly allocated surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs. + +Since 1.0 + +cairo_surface_create_similar_image () +cairo_surface_create_similar_image +cairo_surface_t * +cairo_surface_create_similar_image (cairo_surface_t *other, + cairo_format_t format, + int width, + int height); +Create a new image surface that is as compatible as possible for uploading +to and the use in conjunction with an existing surface. However, this surface +can still be used like any normal image surface. +Initially the surface contents are all 0 (transparent if contents +have transparency, black otherwise.) +Use cairo_surface_create_similar() if you don't need an image surface. + +Parameters + + + + + + +other +an existing surface used to select the preference of the new surface + +format +the format for the new surface + +width +width of the new surface, (in device-space units) + +height +height of the new surface (in device-space units) + + + +Returns + a pointer to the newly allocated image surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs. + +Since 1.12 + +cairo_surface_create_for_rectangle () +cairo_surface_create_for_rectangle +cairo_surface_t * +cairo_surface_create_for_rectangle (cairo_surface_t *target, + double x, + double y, + double width, + double height); +Create a new surface that is a rectangle within the target surface. +All operations drawn to this surface are then clipped and translated +onto the target surface. Nothing drawn via this sub-surface outside of +its bounds is drawn onto the target surface, making this a useful method +for passing constrained child surfaces to library routines that draw +directly onto the parent surface, i.e. with no further backend allocations, +double buffering or copies. +The semantics of subsurfaces have not been finalized yet +unless the rectangle is in full device units, is contained within +the extents of the target surface, and the target or subsurface's +device transforms are not changed. + +Parameters + + + + + + +target +an existing surface for which the sub-surface will point to + +x +the x-origin of the sub-surface from the top-left of the target surface (in device-space units) + +y +the y-origin of the sub-surface from the top-left of the target surface (in device-space units) + +width +width of the sub-surface (in device-space units) + +height +height of the sub-surface (in device-space units) + + + +Returns + a pointer to the newly allocated surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs. + +Since 1.10 + +cairo_surface_reference () +cairo_surface_reference +cairo_surface_t * +cairo_surface_reference (cairo_surface_t *surface); +Increases the reference count on surface + by one. This prevents +surface + from being destroyed until a matching call to +cairo_surface_destroy() is made. +The number of references to a cairo_surface_t can be get using +cairo_surface_get_reference_count(). + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + the referenced cairo_surface_t. + +Since 1.0 + +cairo_surface_destroy () +cairo_surface_destroy +void +cairo_surface_destroy (cairo_surface_t *surface); +Decreases the reference count on surface + by one. If the result is +zero, then surface + and all associated resources are freed. See +cairo_surface_reference(). + +Parameters + + + + + + +surface +a cairo_surface_t + + +Since 1.0 + +cairo_surface_status () +cairo_surface_status +cairo_status_t +cairo_surface_status (cairo_surface_t *surface); +Checks whether an error has previously occurred for this +surface. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + CAIRO_STATUS_SUCCESS, CAIRO_STATUS_NULL_POINTER, +CAIRO_STATUS_NO_MEMORY, CAIRO_STATUS_READ_ERROR, +CAIRO_STATUS_INVALID_CONTENT, CAIRO_STATUS_INVALID_FORMAT, or +CAIRO_STATUS_INVALID_VISUAL. + +Since 1.0 + +cairo_surface_finish () +cairo_surface_finish +void +cairo_surface_finish (cairo_surface_t *surface); +This function finishes the surface and drops all references to +external resources. For example, for the Xlib backend it means +that cairo will no longer access the drawable, which can be freed. +After calling cairo_surface_finish() the only valid operations on a +surface are getting and setting user, referencing and +destroying, and flushing and finishing it. +Further drawing to the surface will not affect the +surface but will instead trigger a CAIRO_STATUS_SURFACE_FINISHED +error. +When the last call to cairo_surface_destroy() decreases the +reference count to zero, cairo will call cairo_surface_finish() if +it hasn't been called already, before freeing the resources +associated with the surface. + +Parameters + + + + + + +surface +the cairo_surface_t to finish + + +Since 1.0 + +cairo_surface_flush () +cairo_surface_flush +void +cairo_surface_flush (cairo_surface_t *surface); +Do any pending drawing for the surface and also restore any +temporary modifications cairo has made to the surface's +state. This function must be called before switching from +drawing on the surface with cairo to drawing on it directly +with native APIs. If the surface doesn't support direct access, +then this function does nothing. + +Parameters + + + + + + +surface +a cairo_surface_t + + +Since 1.0 + +cairo_surface_get_device () +cairo_surface_get_device +cairo_device_t * +cairo_surface_get_device (cairo_surface_t *surface); +This function returns the device for a surface +. +See cairo_device_t. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + The device for surface +or NULL if the surface does +not have an associated device. + +Since 1.10 + +cairo_surface_get_font_options () +cairo_surface_get_font_options +void +cairo_surface_get_font_options (cairo_surface_t *surface, + cairo_font_options_t *options); +Retrieves the default font rendering options for the surface. +This allows display surfaces to report the correct subpixel order +for rendering on them, print surfaces to disable hinting of +metrics and so forth. The result can then be used with +cairo_scaled_font_create(). + +Parameters + + + + + + +surface +a cairo_surface_t + +options +a cairo_font_options_t object into which to store +the retrieved options. All existing values are overwritten + + +Since 1.0 + +cairo_surface_get_content () +cairo_surface_get_content +cairo_content_t +cairo_surface_get_content (cairo_surface_t *surface); +This function returns the content type of surface + which indicates +whether the surface contains color and/or alpha information. See +cairo_content_t. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + The content type of surface +. + +Since 1.2 + +cairo_surface_mark_dirty () +cairo_surface_mark_dirty +void +cairo_surface_mark_dirty (cairo_surface_t *surface); +Tells cairo that drawing has been done to surface using means other +than cairo, and that cairo should reread any cached areas. Note +that you must call cairo_surface_flush() before doing such drawing. + +Parameters + + + + + + +surface +a cairo_surface_t + + +Since 1.0 + +cairo_surface_mark_dirty_rectangle () +cairo_surface_mark_dirty_rectangle +void +cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface, + int x, + int y, + int width, + int height); +Like cairo_surface_mark_dirty(), but drawing has been done only to +the specified rectangle, so that cairo can retain cached contents +for other parts of the surface. +Any cached clip set on the surface will be reset by this function, +to make sure that future cairo calls have the clip set that they +expect. + +Parameters + + + + + + +surface +a cairo_surface_t + +x +X coordinate of dirty rectangle + +y +Y coordinate of dirty rectangle + +width +width of dirty rectangle + +height +height of dirty rectangle + + +Since 1.0 + +cairo_surface_set_device_offset () +cairo_surface_set_device_offset +void +cairo_surface_set_device_offset (cairo_surface_t *surface, + double x_offset, + double y_offset); +Sets an offset that is added to the device coordinates determined +by the CTM when drawing to surface +. One use case for this function +is when we want to create a cairo_surface_t that redirects drawing +for a portion of an onscreen surface to an offscreen surface in a +way that is completely invisible to the user of the cairo +API. Setting a transformation via cairo_translate() isn't +sufficient to do this, since functions like +cairo_device_to_user() will expose the hidden offset. +Note that the offset affects drawing to the surface as well as +using the surface in a source pattern. + +Parameters + + + + + + +surface +a cairo_surface_t + +x_offset +the offset in the X direction, in device units + +y_offset +the offset in the Y direction, in device units + + +Since 1.0 + +cairo_surface_get_device_offset () +cairo_surface_get_device_offset +void +cairo_surface_get_device_offset (cairo_surface_t *surface, + double *x_offset, + double *y_offset); +This function returns the previous device offset set by +cairo_surface_set_device_offset(). + +Parameters + + + + + + +surface +a cairo_surface_t + +x_offset +the offset in the X direction, in device units + +y_offset +the offset in the Y direction, in device units + + +Since 1.2 + +cairo_surface_get_device_scale () +cairo_surface_get_device_scale +void +cairo_surface_get_device_scale (cairo_surface_t *surface, + double *x_scale, + double *y_scale); +This function returns the previous device offset set by +cairo_surface_set_device_scale(). + +Parameters + + + + + + +surface +a cairo_surface_t + +x_scale +the scale in the X direction, in device units + +y_scale +the scale in the Y direction, in device units + + +Since 1.14 + +cairo_surface_set_device_scale () +cairo_surface_set_device_scale +void +cairo_surface_set_device_scale (cairo_surface_t *surface, + double x_scale, + double y_scale); +Sets a scale that is multiplied to the device coordinates determined +by the CTM when drawing to surface +. One common use for this is to +render to very high resolution display devices at a scale factor, so +that code that assumes 1 pixel will be a certain size will still work. +Setting a transformation via cairo_translate() isn't +sufficient to do this, since functions like +cairo_device_to_user() will expose the hidden scale. +Note that the scale affects drawing to the surface as well as +using the surface in a source pattern. + +Parameters + + + + + + +surface +a cairo_surface_t + +x_scale +a scale factor in the X direction + +y_scale +a scale factor in the Y direction + + +Since 1.14 + +cairo_surface_set_fallback_resolution () +cairo_surface_set_fallback_resolution +void +cairo_surface_set_fallback_resolution (cairo_surface_t *surface, + double x_pixels_per_inch, + double y_pixels_per_inch); +Set the horizontal and vertical resolution for image fallbacks. +When certain operations aren't supported natively by a backend, +cairo will fallback by rendering operations to an image and then +overlaying that image onto the output. For backends that are +natively vector-oriented, this function can be used to set the +resolution used for these image fallbacks, (larger values will +result in more detailed images, but also larger file sizes). +Some examples of natively vector-oriented backends are the ps, pdf, +and svg backends. +For backends that are natively raster-oriented, image fallbacks are +still possible, but they are always performed at the native +device resolution. So this function has no effect on those +backends. +Note: The fallback resolution only takes effect at the time of +completing a page (with cairo_show_page() or cairo_copy_page()) so +there is currently no way to have more than one fallback resolution +in effect on a single page. +The default fallback resoultion is 300 pixels per inch in both +dimensions. + +Parameters + + + + + + +surface +a cairo_surface_t + +x_pixels_per_inch +horizontal setting for pixels per inch + +y_pixels_per_inch +vertical setting for pixels per inch + + +Since 1.2 + +cairo_surface_get_fallback_resolution () +cairo_surface_get_fallback_resolution +void +cairo_surface_get_fallback_resolution (cairo_surface_t *surface, + double *x_pixels_per_inch, + double *y_pixels_per_inch); +This function returns the previous fallback resolution set by +cairo_surface_set_fallback_resolution(), or default fallback +resolution if never set. + +Parameters + + + + + + +surface +a cairo_surface_t + +x_pixels_per_inch +horizontal pixels per inch + +y_pixels_per_inch +vertical pixels per inch + + +Since 1.8 + +cairo_surface_get_type () +cairo_surface_get_type +cairo_surface_type_t +cairo_surface_get_type (cairo_surface_t *surface); +This function returns the type of the backend used to create +a surface. See cairo_surface_type_t for available types. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + The type of surface +. + +Since 1.2 + +cairo_surface_get_reference_count () +cairo_surface_get_reference_count +unsigned int +cairo_surface_get_reference_count (cairo_surface_t *surface); +Returns the current reference count of surface +. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + the current reference count of surface +. If the +object is a nil object, 0 will be returned. + +Since 1.4 + +cairo_surface_set_user_data () +cairo_surface_set_user_data +cairo_status_t +cairo_surface_set_user_data (cairo_surface_t *surface, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); +Attach user data to surface +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +. + +Parameters + + + + + + +surface +a cairo_surface_t + +key +the address of a cairo_user_data_key_t to attach the user data to + +user_data +the user data to attach to the surface + +destroy +a cairo_destroy_func_t which will be called when the +surface is destroyed or when new user data is attached using the +same key. + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.0 + +cairo_surface_get_user_data () +cairo_surface_get_user_data +void * +cairo_surface_get_user_data (cairo_surface_t *surface, + const cairo_user_data_key_t *key); +Return user data previously attached to surface + using the specified +key. If no user data has been attached with the given key this +function returns NULL. + +Parameters + + + + + + +surface +a cairo_surface_t + +key +the address of the cairo_user_data_key_t the user data was +attached to + + + +Returns + the user data previously attached or NULL. + +Since 1.0 + +cairo_surface_copy_page () +cairo_surface_copy_page +void +cairo_surface_copy_page (cairo_surface_t *surface); +Emits the current page for backends that support multiple pages, +but doesn't clear it, so that the contents of the current page will +be retained for the next page. Use cairo_surface_show_page() if you +want to get an empty page after the emission. +There is a convenience function for this that takes a cairo_t, +namely cairo_copy_page(). + +Parameters + + + + + + +surface +a cairo_surface_t + + +Since 1.6 + +cairo_surface_show_page () +cairo_surface_show_page +void +cairo_surface_show_page (cairo_surface_t *surface); +Emits and clears the current page for backends that support multiple +pages. Use cairo_surface_copy_page() if you don't want to clear the page. +There is a convenience function for this that takes a cairo_t, +namely cairo_show_page(). + +Parameters + + + + + + +surface +a cairo_Surface_t + + +Since 1.6 + +cairo_surface_has_show_text_glyphs () +cairo_surface_has_show_text_glyphs +cairo_bool_t +cairo_surface_has_show_text_glyphs (cairo_surface_t *surface); +Returns whether the surface supports +sophisticated cairo_show_text_glyphs() operations. That is, +whether it actually uses the provided text and cluster data +to a cairo_show_text_glyphs() call. +Note: Even if this function returns FALSE, a +cairo_show_text_glyphs() operation targeted at surface + will +still succeed. It just will +act like a cairo_show_glyphs() operation. Users can use this +function to avoid computing UTF-8 text and cluster mapping if the +target surface does not use it. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + TRUE if surface +supports +cairo_show_text_glyphs(), FALSE otherwise + +Since 1.8 + +cairo_surface_set_mime_data () +cairo_surface_set_mime_data +cairo_status_t +cairo_surface_set_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char *data, + unsigned long length, + cairo_destroy_func_t destroy, + void *closure); +Attach an image in the format mime_type + to surface +. To remove +the data from a surface, call this function with same mime type +and NULL for data +. +The attached image (or filename) data can later be used by backends +which support it (currently: PDF, PS, SVG and Win32 Printing +surfaces) to emit this data instead of making a snapshot of the +surface +. This approach tends to be faster and requires less +memory and disk space. +The recognized MIME types are the following: CAIRO_MIME_TYPE_JPEG, +CAIRO_MIME_TYPE_PNG, CAIRO_MIME_TYPE_JP2, CAIRO_MIME_TYPE_URI, +CAIRO_MIME_TYPE_UNIQUE_ID, CAIRO_MIME_TYPE_JBIG2, +CAIRO_MIME_TYPE_JBIG2_GLOBAL, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. +See corresponding backend surface docs for details about which MIME +types it can handle. Caution: the associated MIME data will be +discarded if you draw on the surface afterwards. Use this function +with care. +Even if a backend supports a MIME type, that does not mean cairo +will always be able to use the attached MIME data. For example, if +the backend does not natively support the compositing operation used +to apply the MIME data to the backend. In that case, the MIME data +will be ignored. Therefore, to apply an image in all cases, it is best +to create an image surface which contains the decoded image data and +then attach the MIME data to that. This ensures the image will always +be used while still allowing the MIME data to be used whenever +possible. + +Parameters + + + + + + +surface +a cairo_surface_t + +mime_type +the MIME type of the image data + +data +the image data to attach to the surface + +length +the length of the image data + +destroy +a cairo_destroy_func_t which will be called when the +surface is destroyed or when new image data is attached using the +same mime type. + +closure +the data to be passed to the destroy +notifier + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.10 + +cairo_surface_get_mime_data () +cairo_surface_get_mime_data +void +cairo_surface_get_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char **data, + unsigned long *length); +Return mime data previously attached to surface + using the +specified mime type. If no data has been attached with the given +mime type, data + is set NULL. + +Parameters + + + + + + +surface +a cairo_surface_t + +mime_type +the mime type of the image data + +data +the image data to attached to the surface + +length +the length of the image data + + +Since 1.10 + +cairo_surface_supports_mime_type () +cairo_surface_supports_mime_type +cairo_bool_t +cairo_surface_supports_mime_type (cairo_surface_t *surface, + const char *mime_type); +Return whether surface + supports mime_type +. + +Parameters + + + + + + +surface +a cairo_surface_t + +mime_type +the mime type + + + +Returns + TRUE if surface +supports +mime_type +, FALSE otherwise + +Since 1.12 + +cairo_surface_map_to_image () +cairo_surface_map_to_image +cairo_surface_t * +cairo_surface_map_to_image (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents); +Returns an image surface that is the most efficient mechanism for +modifying the backing store of the target surface. The region retrieved +may be limited to the extents + or NULL for the whole surface +Note, the use of the original surface as a target or source whilst +it is mapped is undefined. The result of mapping the surface +multiple times is undefined. Calling cairo_surface_destroy() or +cairo_surface_finish() on the resulting image surface results in +undefined behavior. Changing the device transform of the image +surface or of surface + before the image surface is unmapped results +in undefined behavior. + +Parameters + + + + + + +surface +an existing surface used to extract the image from + +extents +limit the extraction to an rectangular region + + + +Returns + a pointer to the newly allocated image surface. The caller +must use cairo_surface_unmap_image() to destroy this image surface. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if other +is already in an error state +or any other error occurs. If the returned pointer does not have an +error status, it is guaranteed to be an image surface whose format +is not CAIRO_FORMAT_INVALID. + +Since 1.12 + +cairo_surface_unmap_image () +cairo_surface_unmap_image +void +cairo_surface_unmap_image (cairo_surface_t *surface, + cairo_surface_t *image); +Unmaps the image surface as returned from cairo_surface_map_to_image(). +The content of the image will be uploaded to the target surface. +Afterwards, the image is destroyed. +Using an image surface which wasn't returned by cairo_surface_map_to_image() +results in undefined behavior. + +Parameters + + + + + + +surface +the surface passed to cairo_surface_map_to_image(). + +image +the currently mapped image + + +Since 1.12 + + + +Types and Values + +CAIRO_HAS_MIME_SURFACE +CAIRO_HAS_MIME_SURFACE +#define CAIRO_HAS_MIME_SURFACE 1 + + + + + +CAIRO_MIME_TYPE_JBIG2 +CAIRO_MIME_TYPE_JBIG2 +#define CAIRO_MIME_TYPE_JBIG2 "application/x-cairo.jbig2" + +Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544). +Since 1.14 + +CAIRO_MIME_TYPE_JBIG2_GLOBAL +CAIRO_MIME_TYPE_JBIG2_GLOBAL +#define CAIRO_MIME_TYPE_JBIG2_GLOBAL "application/x-cairo.jbig2-global" + +Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544) global segment. +Since 1.14 + +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID +CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID +#define CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID "application/x-cairo.jbig2-global-id" + +An unique identifier shared by a JBIG2 global segment and all JBIG2 images +that depend on the global segment. +Since 1.14 + +CAIRO_MIME_TYPE_JP2 +CAIRO_MIME_TYPE_JP2 +#define CAIRO_MIME_TYPE_JP2 "image/jp2" + +The Joint Photographic Experts Group (JPEG) 2000 image coding standard (ISO/IEC 15444-1). +Since 1.10 + +CAIRO_MIME_TYPE_JPEG +CAIRO_MIME_TYPE_JPEG +#define CAIRO_MIME_TYPE_JPEG "image/jpeg" + +The Joint Photographic Experts Group (JPEG) image coding standard (ISO/IEC 10918-1). +Since 1.10 + +CAIRO_MIME_TYPE_PNG +CAIRO_MIME_TYPE_PNG +#define CAIRO_MIME_TYPE_PNG "image/png" + +The Portable Network Graphics image file format (ISO/IEC 15948). +Since 1.10 + +CAIRO_MIME_TYPE_URI +CAIRO_MIME_TYPE_URI +#define CAIRO_MIME_TYPE_URI "text/x-uri" + +URI for an image file (unofficial MIME type). +Since 1.10 + +CAIRO_MIME_TYPE_UNIQUE_ID +CAIRO_MIME_TYPE_UNIQUE_ID +#define CAIRO_MIME_TYPE_UNIQUE_ID "application/x-cairo.uuid" + +Unique identifier for a surface (cairo specific MIME type). All surfaces with +the same unique identifier will only be embedded once. +Since 1.12 + +cairo_surface_t +cairo_surface_t +typedef struct _cairo_surface cairo_surface_t; + +A cairo_surface_t represents an image, either as the destination +of a drawing operation or as source when drawing onto another +surface. To draw to a cairo_surface_t, create a cairo context +with the surface as the target, using cairo_create(). +There are different subtypes of cairo_surface_t for +different drawing backends; for example, cairo_image_surface_create() +creates a bitmap image in memory. +The type of a surface can be queried with cairo_surface_get_type(). +The initial contents of a surface after creation depend upon the manner +of its creation. If cairo creates the surface and backing storage for +the user, it will be initially cleared; for example, +cairo_image_surface_create() and cairo_surface_create_similar(). +Alternatively, if the user passes in a reference to some backing storage +and asks cairo to wrap that in a cairo_surface_t, then the contents are +not modified; for example, cairo_image_surface_create_for_data() and +cairo_xlib_surface_create(). +Memory management of cairo_surface_t is done with +cairo_surface_reference() and cairo_surface_destroy(). +Since 1.0 + +enum cairo_content_t +cairo_content_t +cairo_content_t is used to describe the content that a surface will +contain, whether color information, alpha information (translucence +vs. opacity), or both. +Note: The large values here are designed to keep cairo_content_t +values distinct from cairo_format_t values so that the +implementation can detect the error if users confuse the two types. + +Members + + + + + + +CAIRO_CONTENT_COLOR +The surface will hold color content only. (Since 1.0) + + + +CAIRO_CONTENT_ALPHA +The surface will hold alpha content only. (Since 1.0) + + + +CAIRO_CONTENT_COLOR_ALPHA +The surface will hold color and alpha content. (Since 1.0) + + + + +Since 1.0 + +enum cairo_surface_type_t +cairo_surface_type_t +cairo_surface_type_t is used to describe the type of a given +surface. The surface types are also known as "backends" or "surface +backends" within cairo. +The type of a surface is determined by the function used to create +it, which will generally be of the form +cairo_type_surface_create(), +(though see cairo_surface_create_similar() as well). +The surface type can be queried with cairo_surface_get_type() +The various cairo_surface_t functions can be used with surfaces of +any type, but some backends also provide type-specific functions +that must only be called with a surface of the appropriate +type. These functions have names that begin with +cairo_type_surface such as cairo_image_surface_get_width(). +The behavior of calling a type-specific function with a surface of +the wrong type is undefined. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_SURFACE_TYPE_IMAGE +The surface is of type image, since 1.2 + + + +CAIRO_SURFACE_TYPE_PDF +The surface is of type pdf, since 1.2 + + + +CAIRO_SURFACE_TYPE_PS +The surface is of type ps, since 1.2 + + + +CAIRO_SURFACE_TYPE_XLIB +The surface is of type xlib, since 1.2 + + + +CAIRO_SURFACE_TYPE_XCB +The surface is of type xcb, since 1.2 + + + +CAIRO_SURFACE_TYPE_GLITZ +The surface is of type glitz, since 1.2 + + + +CAIRO_SURFACE_TYPE_QUARTZ +The surface is of type quartz, since 1.2 + + + +CAIRO_SURFACE_TYPE_WIN32 +The surface is of type win32, since 1.2 + + + +CAIRO_SURFACE_TYPE_BEOS +The surface is of type beos, since 1.2 + + + +CAIRO_SURFACE_TYPE_DIRECTFB +The surface is of type directfb, since 1.2 + + + +CAIRO_SURFACE_TYPE_SVG +The surface is of type svg, since 1.2 + + + +CAIRO_SURFACE_TYPE_OS2 +The surface is of type os2, since 1.4 + + + +CAIRO_SURFACE_TYPE_WIN32_PRINTING +The surface is a win32 printing surface, since 1.6 + + + +CAIRO_SURFACE_TYPE_QUARTZ_IMAGE +The surface is of type quartz_image, since 1.6 + + + +CAIRO_SURFACE_TYPE_SCRIPT +The surface is of type script, since 1.10 + + + +CAIRO_SURFACE_TYPE_QT +The surface is of type Qt, since 1.10 + + + +CAIRO_SURFACE_TYPE_RECORDING +The surface is of type recording, since 1.10 + + + +CAIRO_SURFACE_TYPE_VG +The surface is a OpenVG surface, since 1.10 + + + +CAIRO_SURFACE_TYPE_GL +The surface is of type OpenGL, since 1.10 + + + +CAIRO_SURFACE_TYPE_DRM +The surface is of type Direct Render Manager, since 1.10 + + + +CAIRO_SURFACE_TYPE_TEE +The surface is of type 'tee' (a multiplexing surface), since 1.10 + + + +CAIRO_SURFACE_TYPE_XML +The surface is of type XML (for debugging), since 1.10 + + + +CAIRO_SURFACE_TYPE_SKIA +The surface is of type Skia, since 1.10 + + + +CAIRO_SURFACE_TYPE_SUBSURFACE +The surface is a subsurface created with + cairo_surface_create_for_rectangle(), since 1.10 + + + +CAIRO_SURFACE_TYPE_COGL +This surface is of type Cogl, since 1.12 + + + + +Since 1.2 + + + +See Also +cairo_t, cairo_pattern_t + + + + diff --git a/doc/public/xml/cairo-svg.xml b/doc/public/xml/cairo-svg.xml new file mode 100644 index 000000000..34c3926b1 --- /dev/null +++ b/doc/public/xml/cairo-svg.xml @@ -0,0 +1,298 @@ + + +]> + + +SVG Surfaces +3 + + CAIRO Library + + + +SVG Surfaces +Rendering SVG documents + + + +Functions + + + + + +cairo_surface_t * +cairo_svg_surface_create () +cairo_surface_t * +cairo_svg_surface_create_for_stream () +void +cairo_svg_surface_restrict_to_version () +void +cairo_svg_get_versions () +const char * +cairo_svg_version_to_string () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_SVG_SURFACE +enumcairo_svg_version_t + + + + + + +Object Hierarchy + + + + + + +Description +The SVG surface is used to render cairo graphics to +SVG files and is a multi-page vector surface backend. + + + +Functions + +cairo_svg_surface_create () +cairo_svg_surface_create +cairo_surface_t * +cairo_svg_surface_create (const char *filename, + double width_in_points, + double height_in_points); +Creates a SVG surface of the specified size in points to be written +to filename +. +The SVG surface backend recognizes the following MIME types for the +data attached to a surface (see cairo_surface_set_mime_data()) when +it is used as a source pattern for drawing on this surface: +CAIRO_MIME_TYPE_JPEG, CAIRO_MIME_TYPE_PNG, +CAIRO_MIME_TYPE_URI. If any of them is specified, the SVG backend +emits a href with the content of MIME data instead of a surface +snapshot (PNG, Base64-encoded) in the corresponding image tag. +The unofficial MIME type CAIRO_MIME_TYPE_URI is examined +first. If present, the URI is emitted as is: assuring the +correctness of URI is left to the client code. +If CAIRO_MIME_TYPE_URI is not present, but CAIRO_MIME_TYPE_JPEG +or CAIRO_MIME_TYPE_PNG is specified, the corresponding data is +Base64-encoded and emitted. + +Parameters + + + + + + +filename +a filename for the SVG output (must be writable), NULL may be +used to specify no output. This will generate a SVG surface that +may be queried and used as a source, without generating a +temporary file. + +width_in_points +width of the surface, in points (1 point == 1/72.0 inch) + +height_in_points +height of the surface, in points (1 point == 1/72.0 inch) + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.2 + +cairo_svg_surface_create_for_stream () +cairo_svg_surface_create_for_stream +cairo_surface_t * +cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); +Creates a SVG surface of the specified size in points to be written +incrementally to the stream represented by write_func + and closure +. + +Parameters + + + + + + +write_func +a cairo_write_func_t to accept the output data, may be NULL +to indicate a no-op write_func +. With a no-op write_func +, +the surface may be queried or used as a source without +generating any temporary files. + +closure +the closure argument for write_func + + +width_in_points +width of the surface, in points (1 point == 1/72.0 inch) + +height_in_points +height of the surface, in points (1 point == 1/72.0 inch) + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.2 + +cairo_svg_surface_restrict_to_version () +cairo_svg_surface_restrict_to_version +void +cairo_svg_surface_restrict_to_version (cairo_surface_t *surface, + cairo_svg_version_t version); +Restricts the generated SVG file to version +. See cairo_svg_get_versions() +for a list of available version values that can be used here. +This function should only be called before any drawing operations +have been performed on the given surface. The simplest way to do +this is to call this function immediately after creating the +surface. + +Parameters + + + + + + +surface +a SVG cairo_surface_t + +version +SVG version + + +Since 1.2 + +cairo_svg_get_versions () +cairo_svg_get_versions +void +cairo_svg_get_versions (cairo_svg_version_t const **versions, + int *num_versions); +Used to retrieve the list of supported versions. See +cairo_svg_surface_restrict_to_version(). + +Parameters + + + + + + +versions +supported version list + +num_versions +list length + + +Since 1.2 + +cairo_svg_version_to_string () +cairo_svg_version_to_string +const char * +cairo_svg_version_to_string (cairo_svg_version_t version); +Get the string representation of the given version + id. This function +will return NULL if version + isn't valid. See cairo_svg_get_versions() +for a way to get the list of valid version ids. + +Parameters + + + + + + +version +a version id + + + +Returns + the string associated to given version. + +Since 1.2 + + + +Types and Values + +CAIRO_HAS_SVG_SURFACE +CAIRO_HAS_SVG_SURFACE +#define CAIRO_HAS_SVG_SURFACE 1 + +Defined if the SVG surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.2 + +enum cairo_svg_version_t +cairo_svg_version_t +cairo_svg_version_t is used to describe the version number of the SVG +specification that a generated SVG file will conform to. + +Members + + + + + + +CAIRO_SVG_VERSION_1_1 +The version 1.1 of the SVG specification. (Since 1.2) + + + +CAIRO_SVG_VERSION_1_2 +The version 1.2 of the SVG specification. (Since 1.2) + + + + +Since 1.2 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-text.xml b/doc/public/xml/cairo-text.xml new file mode 100644 index 000000000..ef2b7b0b1 --- /dev/null +++ b/doc/public/xml/cairo-text.xml @@ -0,0 +1,1113 @@ + + +]> + + +text +3 + + CAIRO Library + + + +text +Rendering text and glyphs + + + +Functions + + + + + +void +cairo_select_font_face () +void +cairo_set_font_size () +void +cairo_set_font_matrix () +void +cairo_get_font_matrix () +void +cairo_set_font_options () +void +cairo_get_font_options () +void +cairo_set_font_face () +cairo_font_face_t * +cairo_get_font_face () +void +cairo_set_scaled_font () +cairo_scaled_font_t * +cairo_get_scaled_font () +void +cairo_show_text () +void +cairo_show_glyphs () +void +cairo_show_text_glyphs () +void +cairo_font_extents () +void +cairo_text_extents () +void +cairo_glyph_extents () +cairo_font_face_t * +cairo_toy_font_face_create () +const char * +cairo_toy_font_face_get_family () +cairo_font_slant_t +cairo_toy_font_face_get_slant () +cairo_font_weight_t +cairo_toy_font_face_get_weight () +cairo_glyph_t * +cairo_glyph_allocate () +void +cairo_glyph_free () +cairo_text_cluster_t * +cairo_text_cluster_allocate () +void +cairo_text_cluster_free () + + + + + + +Types and Values + + + + + +cairo_glyph_t +enumcairo_font_slant_t +enumcairo_font_weight_t +cairo_text_cluster_t +enumcairo_text_cluster_flags_t + + + + + + +Object Hierarchy + + + + + + +Description +The functions with text in their name form cairo's +toy text API. The toy API takes UTF-8 encoded +text and is limited in its functionality to rendering simple +left-to-right text with no advanced features. That means for example +that most complex scripts like Hebrew, Arabic, and Indic scripts are +out of question. No kerning or correct positioning of diacritical marks +either. The font selection is pretty limited too and doesn't handle the +case that the selected font does not cover the characters in the text. +This set of functions are really that, a toy text API, for testing and +demonstration purposes. Any serious application should avoid them. +The functions with glyphs in their name form cairo's +low-level text API. The low-level API relies on +the user to convert text to a set of glyph indexes and positions. This +is a very hard problem and is best handled by external libraries, like +the pangocairo that is part of the Pango text layout and rendering library. +Pango is available from http://www.pango.org/. + + + +Functions + +cairo_select_font_face () +cairo_select_font_face +void +cairo_select_font_face (cairo_t *cr, + const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight); +Note: The cairo_select_font_face() function call is part of what +the cairo designers call the "toy" text API. It is convenient for +short demos and simple programs, but it is not expected to be +adequate for serious text-using applications. +Selects a family and style of font from a simplified description as +a family name, slant and weight. Cairo provides no operation to +list available family names on the system (this is a "toy", +remember), but the standard CSS2 generic family names, ("serif", +"sans-serif", "cursive", "fantasy", "monospace"), are likely to +work as expected. +If family + starts with the string "cairo +:", or if no native font +backends are compiled in, cairo will use an internal font family. +The internal font family recognizes many modifiers in the family + +string, most notably, it recognizes the string "monospace". That is, +the family name "cairo +:monospace" will use the monospace version of +the internal font family. +For "real" font selection, see the font-backend-specific +font_face_create functions for the font backend you are using. (For +example, if you are using the freetype-based cairo-ft font backend, +see cairo_ft_font_face_create_for_ft_face() or +cairo_ft_font_face_create_for_pattern().) The resulting font face +could then be used with cairo_scaled_font_create() and +cairo_set_scaled_font(). +Similarly, when using the "real" font support, you can call +directly into the underlying font system, (such as fontconfig or +freetype), for operations such as listing available fonts, etc. +It is expected that most applications will need to use a more +comprehensive font handling and text layout library, (for example, +pango), in conjunction with cairo. +If text is drawn without a call to cairo_select_font_face(), (nor +cairo_set_font_face() nor cairo_set_scaled_font()), the default +family is platform-specific, but is essentially "sans-serif". +Default slant is CAIRO_FONT_SLANT_NORMAL, and default weight is +CAIRO_FONT_WEIGHT_NORMAL. +This function is equivalent to a call to cairo_toy_font_face_create() +followed by cairo_set_font_face(). + +Parameters + + + + + + +cr +a cairo_t + +family +a font family name, encoded in UTF-8 + +slant +the slant for the font + +weight +the weight for the font + + +Since 1.0 + +cairo_set_font_size () +cairo_set_font_size +void +cairo_set_font_size (cairo_t *cr, + double size); +Sets the current font matrix to a scale by a factor of size +, replacing +any font matrix previously set with cairo_set_font_size() or +cairo_set_font_matrix(). This results in a font size of size + user space +units. (More precisely, this matrix will result in the font's +em-square being a size + by size + square in user space.) +If text is drawn without a call to cairo_set_font_size(), (nor +cairo_set_font_matrix() nor cairo_set_scaled_font()), the default +font size is 10.0. + +Parameters + + + + + + +cr +a cairo_t + +size +the new font size, in user space units + + +Since 1.0 + +cairo_set_font_matrix () +cairo_set_font_matrix +void +cairo_set_font_matrix (cairo_t *cr, + const cairo_matrix_t *matrix); +Sets the current font matrix to matrix +. The font matrix gives a +transformation from the design space of the font (in this space, +the em-square is 1 unit by 1 unit) to user space. Normally, a +simple scale is used (see cairo_set_font_size()), but a more +complex font matrix can be used to shear the font +or stretch it unequally along the two axes + +Parameters + + + + + + +cr +a cairo_t + +matrix +a cairo_matrix_t describing a transform to be applied to +the current font. + + +Since 1.0 + +cairo_get_font_matrix () +cairo_get_font_matrix +void +cairo_get_font_matrix (cairo_t *cr, + cairo_matrix_t *matrix); +Stores the current font matrix into matrix +. See +cairo_set_font_matrix(). + +Parameters + + + + + + +cr +a cairo_t + +matrix +return value for the matrix + + +Since 1.0 + +cairo_set_font_options () +cairo_set_font_options +void +cairo_set_font_options (cairo_t *cr, + const cairo_font_options_t *options); +Sets a set of custom font rendering options for the cairo_t. +Rendering options are derived by merging these options with the +options derived from underlying surface; if the value in options + +has a default value (like CAIRO_ANTIALIAS_DEFAULT), then the value +from the surface is used. + +Parameters + + + + + + +cr +a cairo_t + +options +font options to use + + +Since 1.0 + +cairo_get_font_options () +cairo_get_font_options +void +cairo_get_font_options (cairo_t *cr, + cairo_font_options_t *options); +Retrieves font rendering options set via cairo_set_font_options. +Note that the returned options do not include any options derived +from the underlying surface; they are literally the options +passed to cairo_set_font_options(). + +Parameters + + + + + + +cr +a cairo_t + +options +a cairo_font_options_t object into which to store +the retrieved options. All existing values are overwritten + + +Since 1.0 + +cairo_set_font_face () +cairo_set_font_face +void +cairo_set_font_face (cairo_t *cr, + cairo_font_face_t *font_face); +Replaces the current cairo_font_face_t object in the cairo_t with +font_face +. The replaced font face in the cairo_t will be +destroyed if there are no other references to it. + +Parameters + + + + + + +cr +a cairo_t + +font_face +a cairo_font_face_t, or NULL to restore to the default font + + +Since 1.0 + +cairo_get_font_face () +cairo_get_font_face +cairo_font_face_t * +cairo_get_font_face (cairo_t *cr); +Gets the current font face for a cairo_t. + +Parameters + + + + + + +cr +a cairo_t + + + +Returns + the current font face. This object is owned by +cairo. To keep a reference to it, you must call +cairo_font_face_reference(). +This function never returns NULL. If memory cannot be allocated, a +special "nil" cairo_font_face_t object will be returned on which +cairo_font_face_status() returns CAIRO_STATUS_NO_MEMORY. Using +this nil object will cause its error state to propagate to other +objects it is passed to, (for example, calling +cairo_set_font_face() with a nil font will trigger an error that +will shutdown the cairo_t object). + +Since 1.0 + +cairo_set_scaled_font () +cairo_set_scaled_font +void +cairo_set_scaled_font (cairo_t *cr, + const cairo_scaled_font_t *scaled_font); +Replaces the current font face, font matrix, and font options in +the cairo_t with those of the cairo_scaled_font_t. Except for +some translation, the current CTM of the cairo_t should be the +same as that of the cairo_scaled_font_t, which can be accessed +using cairo_scaled_font_get_ctm(). + +Parameters + + + + + + +cr +a cairo_t + +scaled_font +a cairo_scaled_font_t + + +Since 1.2 + +cairo_get_scaled_font () +cairo_get_scaled_font +cairo_scaled_font_t * +cairo_get_scaled_font (cairo_t *cr); +Gets the current scaled font for a cairo_t. + +Parameters + + + + + + +cr +a cairo_t + + + +Returns + the current scaled font. This object is owned by +cairo. To keep a reference to it, you must call +cairo_scaled_font_reference(). +This function never returns NULL. If memory cannot be allocated, a +special "nil" cairo_scaled_font_t object will be returned on which +cairo_scaled_font_status() returns CAIRO_STATUS_NO_MEMORY. Using +this nil object will cause its error state to propagate to other +objects it is passed to, (for example, calling +cairo_set_scaled_font() with a nil font will trigger an error that +will shutdown the cairo_t object). + +Since 1.4 + +cairo_show_text () +cairo_show_text +void +cairo_show_text (cairo_t *cr, + const char *utf8); +A drawing operator that generates the shape from a string of UTF-8 +characters, rendered according to the current font_face, font_size +(font_matrix), and font_options. +This function first computes a set of glyphs for the string of +text. The first glyph is placed so that its origin is at the +current point. The origin of each subsequent glyph is offset from +that of the previous glyph by the advance values of the previous +glyph. +After this call the current point is moved to the origin of where +the next glyph would be placed in this same progression. That is, +the current point will be at the origin of the final glyph offset +by its advance values. This allows for easy display of a single +logical string with multiple calls to cairo_show_text(). +Note: The cairo_show_text() function call is part of what the cairo +designers call the "toy" text API. It is convenient for short demos +and simple programs, but it is not expected to be adequate for +serious text-using applications. See cairo_show_glyphs() for the +"real" text display API in cairo. + +Parameters + + + + + + +cr +a cairo context + +utf8 +a NUL-terminated string of text encoded in UTF-8, or NULL + + +Since 1.0 + +cairo_show_glyphs () +cairo_show_glyphs +void +cairo_show_glyphs (cairo_t *cr, + const cairo_glyph_t *glyphs, + int num_glyphs); +A drawing operator that generates the shape from an array of glyphs, +rendered according to the current font face, font size +(font matrix), and font options. + +Parameters + + + + + + +cr +a cairo context + +glyphs +array of glyphs to show + +num_glyphs +number of glyphs to show + + +Since 1.0 + +cairo_show_text_glyphs () +cairo_show_text_glyphs +void +cairo_show_text_glyphs (cairo_t *cr, + const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags); +This operation has rendering effects similar to cairo_show_glyphs() +but, if the target surface supports it, uses the provided text and +cluster mapping to embed the text for the glyphs shown in the output. +If the target does not support the extended attributes, this function +acts like the basic cairo_show_glyphs() as if it had been passed +glyphs + and num_glyphs +. +The mapping between utf8 + and glyphs + is provided by an array of +clusters. Each cluster covers a number of +text bytes and glyphs, and neighboring clusters cover neighboring +areas of utf8 + and glyphs +. The clusters should collectively cover utf8 + +and glyphs + in entirety. +The first cluster always covers bytes from the beginning of utf8 +. +If cluster_flags + do not have the CAIRO_TEXT_CLUSTER_FLAG_BACKWARD +set, the first cluster also covers the beginning +of glyphs +, otherwise it covers the end of the glyphs + array and +following clusters move backward. +See cairo_text_cluster_t for constraints on valid clusters. + +Parameters + + + + + + +cr +a cairo context + +utf8 +a string of text encoded in UTF-8 + +utf8_len +length of utf8 +in bytes, or -1 if it is NUL-terminated + +glyphs +array of glyphs to show + +num_glyphs +number of glyphs to show + +clusters +array of cluster mapping information + +num_clusters +number of clusters in the mapping + +cluster_flags +cluster mapping flags + + +Since 1.8 + +cairo_font_extents () +cairo_font_extents +void +cairo_font_extents (cairo_t *cr, + cairo_font_extents_t *extents); +Gets the font extents for the currently selected font. + +Parameters + + + + + + +cr +a cairo_t + +extents +a cairo_font_extents_t object into which the results +will be stored. + + +Since 1.0 + +cairo_text_extents () +cairo_text_extents +void +cairo_text_extents (cairo_t *cr, + const char *utf8, + cairo_text_extents_t *extents); +Gets the extents for a string of text. The extents describe a +user-space rectangle that encloses the "inked" portion of the text, +(as it would be drawn by cairo_show_text()). Additionally, the +x_advance and y_advance values indicate the amount by which the +current point would be advanced by cairo_show_text(). +Note that whitespace characters do not directly contribute to the +size of the rectangle (extents.width and extents.height). They do +contribute indirectly by changing the position of non-whitespace +characters. In particular, trailing whitespace characters are +likely to not affect the size of the rectangle, though they will +affect the x_advance and y_advance values. + +Parameters + + + + + + +cr +a cairo_t + +utf8 +a NUL-terminated string of text encoded in UTF-8, or NULL + +extents +a cairo_text_extents_t object into which the results +will be stored + + +Since 1.0 + +cairo_glyph_extents () +cairo_glyph_extents +void +cairo_glyph_extents (cairo_t *cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents); +Gets the extents for an array of glyphs. The extents describe a +user-space rectangle that encloses the "inked" portion of the +glyphs, (as they would be drawn by cairo_show_glyphs()). +Additionally, the x_advance and y_advance values indicate the +amount by which the current point would be advanced by +cairo_show_glyphs(). +Note that whitespace glyphs do not contribute to the size of the +rectangle (extents.width and extents.height). + +Parameters + + + + + + +cr +a cairo_t + +glyphs +an array of cairo_glyph_t objects + +num_glyphs +the number of elements in glyphs + + +extents +a cairo_text_extents_t object into which the results +will be stored + + +Since 1.0 + +cairo_toy_font_face_create () +cairo_toy_font_face_create +cairo_font_face_t * +cairo_toy_font_face_create (const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight); +Creates a font face from a triplet of family, slant, and weight. +These font faces are used in implementation of the the cairo_t "toy" +font API. +If family + is the zero-length string "", the platform-specific default +family is assumed. The default family then can be queried using +cairo_toy_font_face_get_family(). +The cairo_select_font_face() function uses this to create font faces. +See that function for limitations and other details of toy font faces. + +Parameters + + + + + + +family +a font family name, encoded in UTF-8 + +slant +the slant for the font + +weight +the weight for the font + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.8 + +cairo_toy_font_face_get_family () +cairo_toy_font_face_get_family +const char * +cairo_toy_font_face_get_family (cairo_font_face_t *font_face); +Gets the familly name of a toy font. + +Parameters + + + + + + +font_face +A toy font face + + + +Returns + The family name. This string is owned by the font face +and remains valid as long as the font face is alive (referenced). + +Since 1.8 + +cairo_toy_font_face_get_slant () +cairo_toy_font_face_get_slant +cairo_font_slant_t +cairo_toy_font_face_get_slant (cairo_font_face_t *font_face); +Gets the slant a toy font. + +Parameters + + + + + + +font_face +A toy font face + + + +Returns + The slant value + +Since 1.8 + +cairo_toy_font_face_get_weight () +cairo_toy_font_face_get_weight +cairo_font_weight_t +cairo_toy_font_face_get_weight (cairo_font_face_t *font_face); +Gets the weight a toy font. + +Parameters + + + + + + +font_face +A toy font face + + + +Returns + The weight value + +Since 1.8 + +cairo_glyph_allocate () +cairo_glyph_allocate +cairo_glyph_t * +cairo_glyph_allocate (int num_glyphs); +Allocates an array of cairo_glyph_t's. +This function is only useful in implementations of +cairo_user_scaled_font_text_to_glyphs_func_t where the user +needs to allocate an array of glyphs that cairo will free. +For all other uses, user can use their own allocation method +for glyphs. +This function returns NULL if num_glyphs + is not positive, +or if out of memory. That means, the NULL return value +signals out-of-memory only if num_glyphs + was positive. + +Parameters + + + + + + +num_glyphs +number of glyphs to allocate + + + +Returns + the newly allocated array of glyphs that should be +freed using cairo_glyph_free() + +Since 1.8 + +cairo_glyph_free () +cairo_glyph_free +void +cairo_glyph_free (cairo_glyph_t *glyphs); +Frees an array of cairo_glyph_t's allocated using cairo_glyph_allocate(). +This function is only useful to free glyph array returned +by cairo_scaled_font_text_to_glyphs() where cairo returns +an array of glyphs that the user will free. +For all other uses, user can use their own allocation method +for glyphs. + +Parameters + + + + + + +glyphs +array of glyphs to free, or NULL + + +Since 1.8 + +cairo_text_cluster_allocate () +cairo_text_cluster_allocate +cairo_text_cluster_t * +cairo_text_cluster_allocate (int num_clusters); +Allocates an array of cairo_text_cluster_t's. +This function is only useful in implementations of +cairo_user_scaled_font_text_to_glyphs_func_t where the user +needs to allocate an array of text clusters that cairo will free. +For all other uses, user can use their own allocation method +for text clusters. +This function returns NULL if num_clusters + is not positive, +or if out of memory. That means, the NULL return value +signals out-of-memory only if num_clusters + was positive. + +Parameters + + + + + + +num_clusters +number of text_clusters to allocate + + + +Returns + the newly allocated array of text clusters that should be +freed using cairo_text_cluster_free() + +Since 1.8 + +cairo_text_cluster_free () +cairo_text_cluster_free +void +cairo_text_cluster_free (cairo_text_cluster_t *clusters); +Frees an array of cairo_text_cluster's allocated using cairo_text_cluster_allocate(). +This function is only useful to free text cluster array returned +by cairo_scaled_font_text_to_glyphs() where cairo returns +an array of text clusters that the user will free. +For all other uses, user can use their own allocation method +for text clusters. + +Parameters + + + + + + +clusters +array of text clusters to free, or NULL + + +Since 1.8 + + + +Types and Values + +cairo_glyph_t +cairo_glyph_t +typedef struct { + unsigned long index; + double x; + double y; +} cairo_glyph_t; + +The cairo_glyph_t structure holds information about a single glyph +when drawing or measuring text. A font is (in simple terms) a +collection of shapes used to draw text. A glyph is one of these +shapes. There can be multiple glyphs for a single character +(alternates to be used in different contexts, for example), or a +glyph can be a ligature of multiple +characters. Cairo doesn't expose any way of converting input text +into glyphs, so in order to use the Cairo interfaces that take +arrays of glyphs, you must directly access the appropriate +underlying font system. +Note that the offsets given by x + and y + are not cumulative. When +drawing or measuring text, each glyph is individually positioned +with respect to the overall origin + +Members + + + + + + +unsigned long index; +glyph index in the font. The exact interpretation of the +glyph index depends on the font technology being used. +glyph index in the font. The exact interpretation of the +glyph index depends on the font technology being used. + + +double x; +the offset in the X direction between the origin used for +drawing or measuring the string and the origin of this glyph. +the offset in the X direction between the origin used for +drawing or measuring the string and the origin of this glyph. + + +double y; +the offset in the Y direction between the origin used for +drawing or measuring the string and the origin of this glyph. +the offset in the Y direction between the origin used for +drawing or measuring the string and the origin of this glyph. + + + + +Since 1.0 + +enum cairo_font_slant_t +cairo_font_slant_t +Specifies variants of a font face based on their slant. + +Members + + + + + + +CAIRO_FONT_SLANT_NORMAL +Upright font style, since 1.0 + + + +CAIRO_FONT_SLANT_ITALIC +Italic font style, since 1.0 + + + +CAIRO_FONT_SLANT_OBLIQUE +Oblique font style, since 1.0 + + + + +Since 1.0 + +enum cairo_font_weight_t +cairo_font_weight_t +Specifies variants of a font face based on their weight. + +Members + + + + + + +CAIRO_FONT_WEIGHT_NORMAL +Normal font weight, since 1.0 + + + +CAIRO_FONT_WEIGHT_BOLD +Bold font weight, since 1.0 + + + + +Since 1.0 + +cairo_text_cluster_t +cairo_text_cluster_t +typedef struct { + int num_bytes; + int num_glyphs; +} cairo_text_cluster_t; + +The cairo_text_cluster_t structure holds information about a single +text cluster. A text cluster is a minimal +mapping of some glyphs corresponding to some UTF-8 text. +For a cluster to be valid, both num_bytes + and num_glyphs + should +be non-negative, and at least one should be non-zero. +Note that clusters with zero glyphs are not as well supported as +normal clusters. For example, PDF rendering applications typically +ignore those clusters when PDF text is being selected. +See cairo_show_text_glyphs() for how clusters are used in advanced +text operations. + +Members + + + + + + +int num_bytes; +the number of bytes of UTF-8 text covered by cluster +the number of bytes of UTF-8 text covered by cluster + + +int num_glyphs; +the number of glyphs covered by cluster +the number of glyphs covered by cluster + + + + +Since 1.8 + +enum cairo_text_cluster_flags_t +cairo_text_cluster_flags_t +Specifies properties of a text cluster mapping. + +Members + + + + + + +CAIRO_TEXT_CLUSTER_FLAG_BACKWARD +The clusters in the cluster array +map to glyphs in the glyph array from end to start. (Since 1.8) + + + + +Since 1.8 + + + +See Also +cairo_font_face_t, cairo_scaled_font_t, cairo_text_path(), + cairo_glyph_path() + + + + diff --git a/doc/public/xml/cairo-transforms.xml b/doc/public/xml/cairo-transforms.xml new file mode 100644 index 000000000..f07d96d9e --- /dev/null +++ b/doc/public/xml/cairo-transforms.xml @@ -0,0 +1,396 @@ + + +]> + + +Transformations +3 + + CAIRO Library + + + +Transformations +Manipulating the current transformation matrix + + + +Functions + + + + + +void +cairo_translate () +void +cairo_scale () +void +cairo_rotate () +void +cairo_transform () +void +cairo_set_matrix () +void +cairo_get_matrix () +void +cairo_identity_matrix () +void +cairo_user_to_device () +void +cairo_user_to_device_distance () +void +cairo_device_to_user () +void +cairo_device_to_user_distance () + + + + + + +Object Hierarchy + + + + + + +Description +The current transformation matrix, ctm, is a +two-dimensional affine transformation that maps all coordinates and other +drawing instruments from the user space into the +surface's canonical coordinate system, also known as the device +space. + + + +Functions + +cairo_translate () +cairo_translate +void +cairo_translate (cairo_t *cr, + double tx, + double ty); +Modifies the current transformation matrix (CTM) by translating the +user-space origin by (tx +, ty +). This offset is interpreted as a +user-space coordinate according to the CTM in place before the new +call to cairo_translate(). In other words, the translation of the +user-space origin takes place after any existing transformation. + +Parameters + + + + + + +cr +a cairo context + +tx +amount to translate in the X direction + +ty +amount to translate in the Y direction + + +Since 1.0 + +cairo_scale () +cairo_scale +void +cairo_scale (cairo_t *cr, + double sx, + double sy); +Modifies the current transformation matrix (CTM) by scaling the X +and Y user-space axes by sx + and sy + respectively. The scaling of +the axes takes place after any existing transformation of user +space. + +Parameters + + + + + + +cr +a cairo context + +sx +scale factor for the X dimension + +sy +scale factor for the Y dimension + + +Since 1.0 + +cairo_rotate () +cairo_rotate +void +cairo_rotate (cairo_t *cr, + double angle); +Modifies the current transformation matrix (CTM) by rotating the +user-space axes by angle + radians. The rotation of the axes takes +places after any existing transformation of user space. The +rotation direction for positive angles is from the positive X axis +toward the positive Y axis. + +Parameters + + + + + + +cr +a cairo context + +angle +angle (in radians) by which the user-space axes will be +rotated + + +Since 1.0 + +cairo_transform () +cairo_transform +void +cairo_transform (cairo_t *cr, + const cairo_matrix_t *matrix); +Modifies the current transformation matrix (CTM) by applying +matrix + as an additional transformation. The new transformation of +user space takes place after any existing transformation. + +Parameters + + + + + + +cr +a cairo context + +matrix +a transformation to be applied to the user-space axes + + +Since 1.0 + +cairo_set_matrix () +cairo_set_matrix +void +cairo_set_matrix (cairo_t *cr, + const cairo_matrix_t *matrix); +Modifies the current transformation matrix (CTM) by setting it +equal to matrix +. + +Parameters + + + + + + +cr +a cairo context + +matrix +a transformation matrix from user space to device space + + +Since 1.0 + +cairo_get_matrix () +cairo_get_matrix +void +cairo_get_matrix (cairo_t *cr, + cairo_matrix_t *matrix); +Stores the current transformation matrix (CTM) into matrix +. + +Parameters + + + + + + +cr +a cairo context + +matrix +return value for the matrix + + +Since 1.0 + +cairo_identity_matrix () +cairo_identity_matrix +void +cairo_identity_matrix (cairo_t *cr); +Resets the current transformation matrix (CTM) by setting it equal +to the identity matrix. That is, the user-space and device-space +axes will be aligned and one user-space unit will transform to one +device-space unit. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_user_to_device () +cairo_user_to_device +void +cairo_user_to_device (cairo_t *cr, + double *x, + double *y); +Transform a coordinate from user space to device space by +multiplying the given point by the current transformation matrix +(CTM). + +Parameters + + + + + + +cr +a cairo context + +x +X value of coordinate (in/out parameter) + +y +Y value of coordinate (in/out parameter) + + +Since 1.0 + +cairo_user_to_device_distance () +cairo_user_to_device_distance +void +cairo_user_to_device_distance (cairo_t *cr, + double *dx, + double *dy); +Transform a distance vector from user space to device space. This +function is similar to cairo_user_to_device() except that the +translation components of the CTM will be ignored when transforming +(dx +,dy +). + +Parameters + + + + + + +cr +a cairo context + +dx +X component of a distance vector (in/out parameter) + +dy +Y component of a distance vector (in/out parameter) + + +Since 1.0 + +cairo_device_to_user () +cairo_device_to_user +void +cairo_device_to_user (cairo_t *cr, + double *x, + double *y); +Transform a coordinate from device space to user space by +multiplying the given point by the inverse of the current +transformation matrix (CTM). + +Parameters + + + + + + +cr +a cairo + +x +X value of coordinate (in/out parameter) + +y +Y value of coordinate (in/out parameter) + + +Since 1.0 + +cairo_device_to_user_distance () +cairo_device_to_user_distance +void +cairo_device_to_user_distance (cairo_t *cr, + double *dx, + double *dy); +Transform a distance vector from device space to user space. This +function is similar to cairo_device_to_user() except that the +translation components of the inverse CTM will be ignored when +transforming (dx +,dy +). + +Parameters + + + + + + +cr +a cairo context + +dx +X component of a distance vector (in/out parameter) + +dy +Y component of a distance vector (in/out parameter) + + +Since 1.0 + + + +Types and Values + + + +See Also +cairo_matrix_t + + + + diff --git a/doc/public/xml/cairo-types.xml b/doc/public/xml/cairo-types.xml new file mode 100644 index 000000000..1f2180be3 --- /dev/null +++ b/doc/public/xml/cairo-types.xml @@ -0,0 +1,173 @@ + + +]> + + +Types +3 + + CAIRO Library + + + +Types +Generic data types + + + +Functions + + + + + +void +(*cairo_destroy_func_t) () + + + + + + +Types and Values + + + + + +typedefcairo_bool_t +cairo_user_data_key_t +cairo_rectangle_int_t + + + + + + +Object Hierarchy + + + + + + +Description +This section lists generic data types used in the cairo API. + + + +Functions + +cairo_destroy_func_t () +cairo_destroy_func_t +void +(*cairo_destroy_func_t) (void *data); +cairo_destroy_func_t the type of function which is called when a +data element is destroyed. It is passed the pointer to the data +element and should free any memory and resources allocated for it. + +Parameters + + + + + + +data +The data element being destroyed. + + +Since 1.0 + + + +Types and Values + +cairo_bool_t +cairo_bool_t +typedef int cairo_bool_t; + +cairo_bool_t is used for boolean values. Returns of type +cairo_bool_t will always be either 0 or 1, but testing against +these values explicitly is not encouraged; just use the +value as a boolean condition. + + if (cairo_in_stroke (cr, x, y)) { + /* do something */ + } + +Since 1.0 + +cairo_user_data_key_t +cairo_user_data_key_t +typedef struct { + int unused; +} cairo_user_data_key_t; + +cairo_user_data_key_t is used for attaching user data to cairo +data structures. The actual contents of the struct is never used, +and there is no need to initialize the object; only the unique +address of a cairo_data_key_t object is used. Typically, you +would just use the address of a static cairo_data_key_t object. + +Members + + + + + + +int unused; +not used; ignore. +not used; ignore. + + + + +Since 1.0 + +cairo_rectangle_int_t +cairo_rectangle_int_t +typedef struct { + int x, y; + int width, height; +} cairo_rectangle_int_t; + +A data structure for holding a rectangle with integer coordinates. + +Members + + + + + + +int x; +X coordinate of the left side of the rectangle +X coordinate of the left side of the rectangle + + +int y; +Y coordinate of the the top side of the rectangle +Y coordinate of the the top side of the rectangle + + +int width; +width of the rectangle +width of the rectangle + + +int height; +height of the rectangle +height of the rectangle + + + + +Since 1.10 + + + + diff --git a/doc/public/xml/cairo-user-fonts.xml b/doc/public/xml/cairo-user-fonts.xml new file mode 100644 index 000000000..bb8e3fffc --- /dev/null +++ b/doc/public/xml/cairo-user-fonts.xml @@ -0,0 +1,642 @@ + + +]> + + +User Fonts +3 + + CAIRO Library + + + +User Fonts +Font support with font data provided by the user + + + +Functions + + + + + +cairo_status_t +(*cairo_user_scaled_font_init_func_t) () +cairo_status_t +(*cairo_user_scaled_font_render_glyph_func_t) () +cairo_status_t +(*cairo_user_scaled_font_text_to_glyphs_func_t) () +cairo_status_t +(*cairo_user_scaled_font_unicode_to_glyph_func_t) () +cairo_font_face_t * +cairo_user_font_face_create () +void +cairo_user_font_face_set_init_func () +cairo_user_scaled_font_init_func_t +cairo_user_font_face_get_init_func () +void +cairo_user_font_face_set_render_glyph_func () +cairo_user_scaled_font_render_glyph_func_t +cairo_user_font_face_get_render_glyph_func () +void +cairo_user_font_face_set_unicode_to_glyph_func () +cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_user_font_face_get_unicode_to_glyph_func () +void +cairo_user_font_face_set_text_to_glyphs_func () +cairo_user_scaled_font_text_to_glyphs_func_t +cairo_user_font_face_get_text_to_glyphs_func () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_USER_FONT + + + + + + +Object Hierarchy + + + + + + +Description +The user-font feature allows the cairo user to provide drawings for glyphs +in a font. This is most useful in implementing fonts in non-standard +formats, like SVG fonts and Flash fonts, but can also be used by games and +other application to draw "funky" fonts. + + + +Functions + +cairo_user_scaled_font_init_func_t () +cairo_user_scaled_font_init_func_t +cairo_status_t +(*cairo_user_scaled_font_init_func_t) (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *extents); +cairo_user_scaled_font_init_func_t is the type of function which is +called when a scaled-font needs to be created for a user font-face. +The cairo context cr + is not used by the caller, but is prepared in font +space, similar to what the cairo contexts passed to the render_glyph +method will look like. The callback can use this context for extents +computation for example. After the callback is called, cr + is checked +for any error status. +The extents + argument is where the user font sets the font extents for +scaled_font +. It is in font space, which means that for most cases its +ascent and descent members should add to 1.0. extents + is preset to +hold a value of 1.0 for ascent, height, and max_x_advance, and 0.0 for +descent and max_y_advance members. +The callback is optional. If not set, default font extents as described +in the previous paragraph will be used. +Note that scaled_font + is not fully initialized at this +point and trying to use it for text operations in the callback will result +in deadlock. + +Parameters + + + + + + +scaled_font +the scaled-font being created + +cr +a cairo context, in font space + +extents +font extents to fill in, in font space + + + +Returns + CAIRO_STATUS_SUCCESS upon success, or an error status on error. + +Since 1.8 + +cairo_user_scaled_font_render_glyph_func_t () +cairo_user_scaled_font_render_glyph_func_t +cairo_status_t +(*cairo_user_scaled_font_render_glyph_func_t) + (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *extents); +cairo_user_scaled_font_render_glyph_func_t is the type of function which +is called when a user scaled-font needs to render a glyph. +The callback is mandatory, and expected to draw the glyph with code glyph + to +the cairo context cr +. cr + is prepared such that the glyph drawing is done in +font space. That is, the matrix set on cr + is the scale matrix of scaled_font +, +The extents + argument is where the user font sets the font extents for +scaled_font +. However, if user prefers to draw in user space, they can +achieve that by changing the matrix on cr +. All cairo rendering operations +to cr + are permitted, however, the result is undefined if any source other +than the default source on cr + is used. That means, glyph bitmaps should +be rendered using cairo_mask() instead of cairo_paint(). +Other non-default settings on cr + include a font size of 1.0 (given that +it is set up to be in font space), and font options corresponding to +scaled_font +. +The extents + argument is preset to have x_bearing, +width, and y_advance of zero, +y_bearing set to -font_extents.ascent, +height to font_extents.ascent+font_extents.descent, +and x_advance to font_extents.max_x_advance. +The only field user needs to set in majority of cases is +x_advance. +If the width field is zero upon the callback returning +(which is its preset value), the glyph extents are automatically computed +based on the drawings done to cr +. This is in most cases exactly what the +desired behavior is. However, if for any reason the callback sets the +extents, it must be ink extents, and include the extents of all drawing +done to cr + in the callback. + +Parameters + + + + + + +scaled_font +user scaled-font + +glyph +glyph code to render + +cr +cairo context to draw to, in font space + +extents +glyph extents to fill in, in font space + + + +Returns + CAIRO_STATUS_SUCCESS upon success, or +CAIRO_STATUS_USER_FONT_ERROR or any other error status on error. + +Since 1.8 + +cairo_user_scaled_font_text_to_glyphs_func_t () +cairo_user_scaled_font_text_to_glyphs_func_t +cairo_status_t +(*cairo_user_scaled_font_text_to_glyphs_func_t) + (cairo_scaled_font_t *scaled_font, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags); +cairo_user_scaled_font_text_to_glyphs_func_t is the type of function which +is called to convert input text to an array of glyphs. This is used by the +cairo_show_text() operation. +Using this callback the user-font has full control on glyphs and their +positions. That means, it allows for features like ligatures and kerning, +as well as complex shaping required for scripts like +Arabic and Indic. +The num_glyphs + argument is preset to the number of glyph entries available +in the glyphs + buffer. If the glyphs + buffer is NULL, the value of +num_glyphs + will be zero. If the provided glyph array is too short for +the conversion (or for convenience), a new glyph array may be allocated +using cairo_glyph_allocate() and placed in glyphs +. Upon return, +num_glyphs + should contain the number of generated glyphs. If the value +glyphs + points at has changed after the call, the caller will free the +allocated glyph array using cairo_glyph_free(). The caller will also free +the original value of glyphs +, so the callback shouldn't do so. +The callback should populate the glyph indices and positions (in font space) +assuming that the text is to be shown at the origin. +If clusters + is not NULL, num_clusters + and cluster_flags + are also +non-NULL, and cluster mapping should be computed. The semantics of how +cluster array allocation works is similar to the glyph array. That is, +if clusters + initially points to a non-NULL value, that array may be used +as a cluster buffer, and num_clusters + points to the number of cluster +entries available there. If the provided cluster array is too short for +the conversion (or for convenience), a new cluster array may be allocated +using cairo_text_cluster_allocate() and placed in clusters +. In this case, +the original value of clusters + will still be freed by the caller. Upon +return, num_clusters + should contain the number of generated clusters. +If the value clusters + points at has changed after the call, the caller +will free the allocated cluster array using cairo_text_cluster_free(). +The callback is optional. If num_glyphs + is negative upon +the callback returning or if the return value +is CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, the unicode_to_glyph callback +is tried. See cairo_user_scaled_font_unicode_to_glyph_func_t. +Note: While cairo does not impose any limitation on glyph indices, +some applications may assume that a glyph index fits in a 16-bit +unsigned integer. As such, it is advised that user-fonts keep their +glyphs in the 0 to 65535 range. Furthermore, some applications may +assume that glyph 0 is a special glyph-not-found glyph. User-fonts +are advised to use glyph 0 for such purposes and do not use that +glyph value for other purposes. + +Parameters + + + + + + +scaled_font +the scaled-font being created + +utf8 +a string of text encoded in UTF-8 + +utf8_len +length of utf8 +in bytes + +glyphs +pointer to array of glyphs to fill, in font space + +num_glyphs +pointer to number of glyphs + +clusters +pointer to array of cluster mapping information to fill, or NULL + +num_clusters +pointer to number of clusters + +cluster_flags +pointer to location to store cluster flags corresponding to the +output clusters + + + + +Returns + CAIRO_STATUS_SUCCESS upon success, +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED if fallback options should be tried, +or CAIRO_STATUS_USER_FONT_ERROR or any other error status on error. + +Since 1.8 + +cairo_user_scaled_font_unicode_to_glyph_func_t () +cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_status_t +(*cairo_user_scaled_font_unicode_to_glyph_func_t) + (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph_index); +cairo_user_scaled_font_unicode_to_glyph_func_t is the type of function which +is called to convert an input Unicode character to a single glyph. +This is used by the cairo_show_text() operation. +This callback is used to provide the same functionality as the +text_to_glyphs callback does (see cairo_user_scaled_font_text_to_glyphs_func_t) +but has much less control on the output, +in exchange for increased ease of use. The inherent assumption to using +this callback is that each character maps to one glyph, and that the +mapping is context independent. It also assumes that glyphs are positioned +according to their advance width. These mean no ligatures, kerning, or +complex scripts can be implemented using this callback. +The callback is optional, and only used if text_to_glyphs callback is not +set or fails to return glyphs. If this callback is not set or if it returns +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, an identity mapping from Unicode +code-points to glyph indices is assumed. +Note: While cairo does not impose any limitation on glyph indices, +some applications may assume that a glyph index fits in a 16-bit +unsigned integer. As such, it is advised that user-fonts keep their +glyphs in the 0 to 65535 range. Furthermore, some applications may +assume that glyph 0 is a special glyph-not-found glyph. User-fonts +are advised to use glyph 0 for such purposes and do not use that +glyph value for other purposes. + +Parameters + + + + + + +scaled_font +the scaled-font being created + +unicode +input unicode character code-point + +glyph_index +output glyph index + + + +Returns + CAIRO_STATUS_SUCCESS upon success, +CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED if fallback options should be tried, +or CAIRO_STATUS_USER_FONT_ERROR or any other error status on error. + +Since 1.8 + +cairo_user_font_face_create () +cairo_user_font_face_create +cairo_font_face_t * +cairo_user_font_face_create (void); +Creates a new user font-face. +Use the setter functions to associate callbacks with the returned +user font. The only mandatory callback is render_glyph. +After the font-face is created, the user can attach arbitrary data +(the actual font data) to it using cairo_font_face_set_user_data() +and access it from the user-font callbacks by using +cairo_scaled_font_get_font_face() followed by +cairo_font_face_get_user_data(). + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.8 + +cairo_user_font_face_set_init_func () +cairo_user_font_face_set_init_func +void +cairo_user_font_face_set_init_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_init_func_t init_func); +Sets the scaled-font initialization function of a user-font. +See cairo_user_scaled_font_init_func_t for details of how the callback +works. +The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it. + +Parameters + + + + + + +font_face +A user font face + +init_func +The init callback, or NULL + + +Since 1.8 + +cairo_user_font_face_get_init_func () +cairo_user_font_face_get_init_func +cairo_user_scaled_font_init_func_t +cairo_user_font_face_get_init_func (cairo_font_face_t *font_face); +Gets the scaled-font initialization function of a user-font. + +Parameters + + + + + + +font_face +A user font face + + + +Returns + The init callback of font_face +or NULL if none set or an error has occurred. + +Since 1.8 + +cairo_user_font_face_set_render_glyph_func () +cairo_user_font_face_set_render_glyph_func +void +cairo_user_font_face_set_render_glyph_func + (cairo_font_face_t *font_face, + cairo_user_scaled_font_render_glyph_func_t render_glyph_func); +Sets the glyph rendering function of a user-font. +See cairo_user_scaled_font_render_glyph_func_t for details of how the callback +works. +The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it. +The render_glyph callback is the only mandatory callback of a user-font. +If the callback is NULL and a glyph is tried to be rendered using +font_face +, a CAIRO_STATUS_USER_FONT_ERROR will occur. + +Parameters + + + + + + +font_face +A user font face + +render_glyph_func +The render_glyph callback, or NULL + + +Since 1.8 + +cairo_user_font_face_get_render_glyph_func () +cairo_user_font_face_get_render_glyph_func +cairo_user_scaled_font_render_glyph_func_t +cairo_user_font_face_get_render_glyph_func + (cairo_font_face_t *font_face); +Gets the glyph rendering function of a user-font. + +Parameters + + + + + + +font_face +A user font face + + + +Returns + The render_glyph callback of font_face +or NULL if none set or an error has occurred. + +Since 1.8 + +cairo_user_font_face_set_unicode_to_glyph_func () +cairo_user_font_face_set_unicode_to_glyph_func +void +cairo_user_font_face_set_unicode_to_glyph_func + (cairo_font_face_t *font_face, + cairo_user_scaled_font_unicode_to_glyph_func_t unicode_to_glyph_func); +Sets the unicode-to-glyph conversion function of a user-font. +See cairo_user_scaled_font_unicode_to_glyph_func_t for details of how the callback +works. +The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it. + +Parameters + + + + + + +font_face +A user font face + +unicode_to_glyph_func +The unicode_to_glyph callback, or NULL + + +Since 1.8 + +cairo_user_font_face_get_unicode_to_glyph_func () +cairo_user_font_face_get_unicode_to_glyph_func +cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_user_font_face_get_unicode_to_glyph_func + (cairo_font_face_t *font_face); +Gets the unicode-to-glyph conversion function of a user-font. + +Parameters + + + + + + +font_face +A user font face + + + +Returns + The unicode_to_glyph callback of font_face +or NULL if none set or an error occurred. + +Since 1.8 + +cairo_user_font_face_set_text_to_glyphs_func () +cairo_user_font_face_set_text_to_glyphs_func +void +cairo_user_font_face_set_text_to_glyphs_func + (cairo_font_face_t *font_face, + cairo_user_scaled_font_text_to_glyphs_func_t text_to_glyphs_func); +Sets th text-to-glyphs conversion function of a user-font. +See cairo_user_scaled_font_text_to_glyphs_func_t for details of how the callback +works. +The font-face should not be immutable or a CAIRO_STATUS_USER_FONT_IMMUTABLE +error will occur. A user font-face is immutable as soon as a scaled-font +is created from it. + +Parameters + + + + + + +font_face +A user font face + +text_to_glyphs_func +The text_to_glyphs callback, or NULL + + +Since 1.8 + +cairo_user_font_face_get_text_to_glyphs_func () +cairo_user_font_face_get_text_to_glyphs_func +cairo_user_scaled_font_text_to_glyphs_func_t +cairo_user_font_face_get_text_to_glyphs_func + (cairo_font_face_t *font_face); +Gets the text-to-glyphs conversion function of a user-font. + +Parameters + + + + + + +font_face +A user font face + + + +Returns + The text_to_glyphs callback of font_face +or NULL if none set or an error occurred. + +Since 1.8 + + + +Types and Values + +CAIRO_HAS_USER_FONT +CAIRO_HAS_USER_FONT +#define CAIRO_HAS_USER_FONT 1 + +Defined if the user font backend is available. +This macro can be used to conditionally compile backend-specific code. +The user font backend is always built in versions of cairo that support +this feature (1.8 and later). +Since 1.8 + + + + diff --git a/doc/public/xml/cairo-version.xml b/doc/public/xml/cairo-version.xml new file mode 100644 index 000000000..1c6c60e46 --- /dev/null +++ b/doc/public/xml/cairo-version.xml @@ -0,0 +1,289 @@ + + +]> + + +Version Information +3 + + CAIRO Library + + + +Version Information +Compile-time and run-time version checks. + + + +Functions + + + + + +#defineCAIRO_VERSION_ENCODE() +#defineCAIRO_VERSION_STRINGIZE() +int +cairo_version () +const char * +cairo_version_string () + + + + + + +Types and Values + + + + + +#defineCAIRO_VERSION +#defineCAIRO_VERSION_MAJOR +#defineCAIRO_VERSION_MINOR +#defineCAIRO_VERSION_MICRO +#defineCAIRO_VERSION_STRING + + + + + + +Object Hierarchy + + + + + + +Description +Cairo has a three-part version number scheme. In this scheme, we use +even vs. odd numbers to distinguish fixed points in the software +vs. in-progress development, (such as from git instead of a tar file, +or as a "snapshot" tar file as opposed to a "release" tar file). + + _____ Major. Always 1, until we invent a new scheme. +/ ___ Minor. Even/Odd = Release/Snapshot (tar files) or Branch/Head (git) +| / _ Micro. Even/Odd = Tar-file/git +| | / +1.0.0 + +Here are a few examples of versions that one might see. + +Releases +-------- +1.0.0 - A major release +1.0.2 - A subsequent maintenance release +1.2.0 - Another major release +  +Snapshots +--------- +1.1.2 - A snapshot (working toward the 1.2.0 release) +  +In-progress development (eg. from git) +-------------------------------------- +1.0.1 - Development on a maintenance branch (toward 1.0.2 release) +1.1.1 - Development on head (toward 1.1.2 snapshot and 1.2.0 release) + + +Compatibility + +The API/ABI compatibility guarantees for various versions are as +follows. First, let's assume some cairo-using application code that is +successfully using the API/ABI "from" one version of cairo. Then let's +ask the question whether this same code can be moved "to" the API/ABI +of another version of cairo. + +Moving from a release to any later version (release, snapshot, +development) is always guaranteed to provide compatibility. + +Moving from a snapshot to any later version is not guaranteed to +provide compatibility, since snapshots may introduce new API that ends +up being removed before the next release. + +Moving from an in-development version (odd micro component) to any +later version is not guaranteed to provide compatibility. In fact, +there's not even a guarantee that the code will even continue to work +with the same in-development version number. This is because these +numbers don't correspond to any fixed state of the software, but +rather the many states between snapshots and releases. + + + +Examining the version + +Cairo provides the ability to examine the version at either +compile-time or run-time and in both a human-readable form as well as +an encoded form suitable for direct comparison. Cairo also provides the +macro CAIRO_VERSION_ENCODE() to perform the encoding. + + +Compile-time +------------ +CAIRO_VERSION_STRING Human-readable +CAIRO_VERSION Encoded, suitable for comparison +  +Run-time +-------- +cairo_version_string() Human-readable +cairo_version() Encoded, suitable for comparison + + +For example, checking that the cairo version is greater than or equal +to 1.0.0 could be achieved at compile-time or run-time as follows: + + +##if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 0, 0) +printf ("Compiling with suitable cairo version: %s\n", %CAIRO_VERSION_STRING); +##endif + +if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 0, 0)) + printf ("Running with suitable cairo version: %s\n", cairo_version_string ()); + + + + + + +Functions + +CAIRO_VERSION_ENCODE() +CAIRO_VERSION_ENCODE +#define CAIRO_VERSION_ENCODE(major, minor, micro) +This macro encodes the given cairo version into an integer. The numbers +returned by CAIRO_VERSION and cairo_version() are encoded using this macro. +Two encoded version numbers can be compared as integers. The encoding ensures +that later versions compare greater than earlier versions. + +Parameters + + + + + + +major +the major component of the version number + +minor +the minor component of the version number + +micro +the micro component of the version number + + + +Returns + the encoded version. + +Since 1.0 + +CAIRO_VERSION_STRINGIZE() +CAIRO_VERSION_STRINGIZE +#define CAIRO_VERSION_STRINGIZE(major, minor, micro) +This macro encodes the given cairo version into an string. The numbers +returned by CAIRO_VERSION_STRING and cairo_version_string() are encoded using this macro. +The parameters to this macro must expand to numerical literals. + +Parameters + + + + + + +major +the major component of the version number + +minor +the minor component of the version number + +micro +the micro component of the version number + + + +Returns + a string literal containing the version. + +Since 1.8 + +cairo_version () +cairo_version +int +cairo_version (void); +Returns the version of the cairo library encoded in a single +integer as per CAIRO_VERSION_ENCODE. The encoding ensures that +later versions compare greater than earlier versions. +A run-time comparison to check that cairo's version is greater than +or equal to version X.Y.Z could be performed as follows: + +if (cairo_version() >= CAIRO_VERSION_ENCODE(X,Y,Z)) {...} + +See also cairo_version_string() as well as the compile-time +equivalents CAIRO_VERSION and CAIRO_VERSION_STRING. + +Returns + the encoded version. + +Since 1.0 + +cairo_version_string () +cairo_version_string +const char * +cairo_version_string (void); +Returns the version of the cairo library as a human-readable string +of the form "X.Y.Z". +See also cairo_version() as well as the compile-time equivalents +CAIRO_VERSION_STRING and CAIRO_VERSION. + +Returns + a string containing the version. + +Since 1.0 + + + +Types and Values + +CAIRO_VERSION +CAIRO_VERSION +#define CAIRO_VERSION +The version of cairo available at compile-time, encoded using +CAIRO_VERSION_ENCODE(). +Since 1.0 + +CAIRO_VERSION_MAJOR +CAIRO_VERSION_MAJOR +#define CAIRO_VERSION_MAJOR USE_cairo_version_OR_cairo_version_string_INSTEAD + +The major component of the version of cairo available at compile-time. +Since 1.0 + +CAIRO_VERSION_MINOR +CAIRO_VERSION_MINOR +#define CAIRO_VERSION_MINOR USE_cairo_version_OR_cairo_version_string_INSTEAD + +The minor component of the version of cairo available at compile-time. +Since 1.0 + +CAIRO_VERSION_MICRO +CAIRO_VERSION_MICRO +#define CAIRO_VERSION_MICRO USE_cairo_version_OR_cairo_version_string_INSTEAD + +The micro component of the version of cairo available at compile-time. +Since 1.0 + +CAIRO_VERSION_STRING +CAIRO_VERSION_STRING +#define CAIRO_VERSION_STRING +A human-readable string literal containing the version of cairo available +at compile-time, in the form of "X.Y.Z". +Since 1.8 + + + + diff --git a/doc/public/xml/cairo-win32-fonts.xml b/doc/public/xml/cairo-win32-fonts.xml new file mode 100644 index 000000000..0e044717d --- /dev/null +++ b/doc/public/xml/cairo-win32-fonts.xml @@ -0,0 +1,335 @@ + + +]> + + +Win32 Fonts +3 + + CAIRO Library + + + +Win32 Fonts +Font support for Microsoft Windows + + + +Functions + + + + + +cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw () +cairo_font_face_t * +cairo_win32_font_face_create_for_hfont () +cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw_hfont () +cairo_status_t +cairo_win32_scaled_font_select_font () +void +cairo_win32_scaled_font_done_font () +double +cairo_win32_scaled_font_get_metrics_factor () +void +cairo_win32_scaled_font_get_logical_to_device () +void +cairo_win32_scaled_font_get_device_to_logical () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_WIN32_FONT + + + + + + +Object Hierarchy + + + + + + +Description +The Microsoft Windows font backend is primarily used to render text on +Microsoft Windows systems. + + + +Functions + +cairo_win32_font_face_create_for_logfontw () +cairo_win32_font_face_create_for_logfontw +cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw + (LOGFONTW *logfont); +Creates a new font for the Win32 font backend based on a +LOGFONT. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). +The cairo_scaled_font_t +returned from cairo_scaled_font_create() is also for the Win32 backend +and can be used with functions such as cairo_win32_scaled_font_select_font(). + +Parameters + + + + + + +logfont +A LOGFONTW structure specifying the font to use. +The lfHeight, lfWidth, lfOrientation and lfEscapement +fields of this structure are ignored. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.0 + +cairo_win32_font_face_create_for_hfont () +cairo_win32_font_face_create_for_hfont +cairo_font_face_t * +cairo_win32_font_face_create_for_hfont + (HFONT font); +Creates a new font for the Win32 font backend based on a +HFONT. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). +The cairo_scaled_font_t +returned from cairo_scaled_font_create() is also for the Win32 backend +and can be used with functions such as cairo_win32_scaled_font_select_font(). + +Parameters + + + + + + +font +An HFONT structure specifying the font to use. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.2 + +cairo_win32_font_face_create_for_logfontw_hfont () +cairo_win32_font_face_create_for_logfontw_hfont +cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw_hfont + (LOGFONTW *logfont, + HFONT font); +Creates a new font for the Win32 font backend based on a +LOGFONT. This font can then be used with +cairo_set_font_face() or cairo_scaled_font_create(). +The cairo_scaled_font_t +returned from cairo_scaled_font_create() is also for the Win32 backend +and can be used with functions such as cairo_win32_scaled_font_select_font(). + +Parameters + + + + + + +logfont +A LOGFONTW structure specifying the font to use. +If font +is NULL then the lfHeight, lfWidth, lfOrientation and lfEscapement +fields of this structure are ignored. Otherwise lfWidth, lfOrientation and +lfEscapement must be zero. + +font +An HFONT that can be used when the font matrix is a scale by +-lfHeight and the CTM is identity. + + + +Returns + a newly created cairo_font_face_t. Free with +cairo_font_face_destroy() when you are done using it. + +Since 1.6 + +cairo_win32_scaled_font_select_font () +cairo_win32_scaled_font_select_font +cairo_status_t +cairo_win32_scaled_font_select_font (cairo_scaled_font_t *scaled_font, + HDC hdc); +Selects the font into the given device context and changes the +map mode and world transformation of the device context to match +that of the font. This function is intended for use when using +layout APIs such as Uniscribe to do text layout with the +cairo font. After finishing using the device context, you must call +cairo_win32_scaled_font_done_font() to release any resources allocated +by this function. +See cairo_win32_scaled_font_get_metrics_factor() for converting logical +coordinates from the device context to font space. +Normally, calls to SaveDC() and RestoreDC() would be made around +the use of this function to preserve the original graphics state. + +Parameters + + + + + + +scaled_font +A cairo_scaled_font_t from the Win32 font backend. Such an +object can be created with cairo_win32_font_face_create_for_logfontw(). + +hdc +a device context + + + +Returns + CAIRO_STATUS_SUCCESS if the operation succeeded. +otherwise an error such as CAIRO_STATUS_NO_MEMORY and +the device context is unchanged. + +Since 1.0 + +cairo_win32_scaled_font_done_font () +cairo_win32_scaled_font_done_font +void +cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font); +Releases any resources allocated by cairo_win32_scaled_font_select_font() + +Parameters + + + + + + +scaled_font +A scaled font from the Win32 font backend. + + +Since 1.0 + +cairo_win32_scaled_font_get_metrics_factor () +cairo_win32_scaled_font_get_metrics_factor +double +cairo_win32_scaled_font_get_metrics_factor + (cairo_scaled_font_t *scaled_font); +Gets a scale factor between logical coordinates in the coordinate +space used by cairo_win32_scaled_font_select_font() (that is, the +coordinate system used by the Windows functions to return metrics) and +font space coordinates. + +Parameters + + + + + + +scaled_font +a scaled font from the Win32 font backend + + + +Returns + factor to multiply logical units by to get font space +coordinates. + +Since 1.0 + +cairo_win32_scaled_font_get_logical_to_device () +cairo_win32_scaled_font_get_logical_to_device +void +cairo_win32_scaled_font_get_logical_to_device + (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *logical_to_device); +Gets the transformation mapping the logical space used by scaled_font + +to device space. + +Parameters + + + + + + +scaled_font +a scaled font from the Win32 font backend + +logical_to_device +matrix to return + + +Since 1.4 + +cairo_win32_scaled_font_get_device_to_logical () +cairo_win32_scaled_font_get_device_to_logical +void +cairo_win32_scaled_font_get_device_to_logical + (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *device_to_logical); +Gets the transformation mapping device space to the logical space +used by scaled_font +. + +Parameters + + + + + + +scaled_font +a scaled font from the Win32 font backend + +device_to_logical +matrix to return + + +Since 1.4 + + + +Types and Values + +CAIRO_HAS_WIN32_FONT +CAIRO_HAS_WIN32_FONT +#define CAIRO_HAS_WIN32_FONT 1 + +Defined if the Microsoft Windows font backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.8 + + + +See Also +cairo_font_face_t + + + + diff --git a/doc/public/xml/cairo-win32.xml b/doc/public/xml/cairo-win32.xml new file mode 100644 index 000000000..6998f1fe5 --- /dev/null +++ b/doc/public/xml/cairo-win32.xml @@ -0,0 +1,279 @@ + + +]> + + +Win32 Surfaces +3 + + CAIRO Library + + + +Win32 Surfaces +Microsoft Windows surface support + + + +Functions + + + + + +cairo_surface_t * +cairo_win32_surface_create () +cairo_surface_t * +cairo_win32_surface_create_with_dib () +cairo_surface_t * +cairo_win32_surface_create_with_ddb () +cairo_surface_t * +cairo_win32_printing_surface_create () +HDC +cairo_win32_surface_get_dc () +cairo_surface_t * +cairo_win32_surface_get_image () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_WIN32_SURFACE + + + + + + +Object Hierarchy + + + + + + +Description +The Microsoft Windows surface is used to render cairo graphics to +Microsoft Windows windows, bitmaps, and printing device contexts. +The surface returned by cairo_win32_printing_surface_create() is of surface +type CAIRO_SURFACE_TYPE_WIN32_PRINTING and is a multi-page vector surface +type. +The surface returned by the other win32 constructors is of surface type +CAIRO_SURFACE_TYPE_WIN32 and is a raster surface type. + + + +Functions + +cairo_win32_surface_create () +cairo_win32_surface_create +cairo_surface_t * +cairo_win32_surface_create (HDC hdc); +Creates a cairo surface that targets the given DC. The DC will be +queried for its initial clip extents, and this will be used as the +size of the cairo surface. The resulting surface will always be of +format CAIRO_FORMAT_RGB24; should you need another surface format, +you will need to create one through +cairo_win32_surface_create_with_dib(). + +Parameters + + + + + + +hdc +the DC to create a surface for + + + +Returns + the newly created surface + +Since 1.0 + +cairo_win32_surface_create_with_dib () +cairo_win32_surface_create_with_dib +cairo_surface_t * +cairo_win32_surface_create_with_dib (cairo_format_t format, + int width, + int height); +Creates a device-independent-bitmap surface not associated with +any particular existing surface or device context. The created +bitmap will be uninitialized. + +Parameters + + + + + + +format +format of pixels in the surface to create + +width +width of the surface, in pixels + +height +height of the surface, in pixels + + + +Returns + the newly created surface + +Since 1.2 + +cairo_win32_surface_create_with_ddb () +cairo_win32_surface_create_with_ddb +cairo_surface_t * +cairo_win32_surface_create_with_ddb (HDC hdc, + cairo_format_t format, + int width, + int height); +Creates a device-dependent-bitmap surface not associated with +any particular existing surface or device context. The created +bitmap will be uninitialized. + +Parameters + + + + + + +hdc +a DC compatible with the surface to create + +format +format of pixels in the surface to create + +width +width of the surface, in pixels + +height +height of the surface, in pixels + + + +Returns + the newly created surface + +Since 1.4 + +cairo_win32_printing_surface_create () +cairo_win32_printing_surface_create +cairo_surface_t * +cairo_win32_printing_surface_create (HDC hdc); +Creates a cairo surface that targets the given DC. The DC will be +queried for its initial clip extents, and this will be used as the +size of the cairo surface. The DC should be a printing DC; +antialiasing will be ignored, and GDI will be used as much as +possible to draw to the surface. +The returned surface will be wrapped using the paginated surface to +provide correct complex rendering behaviour; cairo_surface_show_page() and +associated methods must be used for correct output. + +Parameters + + + + + + +hdc +the DC to create a surface for + + + +Returns + the newly created surface + +Since 1.6 + +cairo_win32_surface_get_dc () +cairo_win32_surface_get_dc +HDC +cairo_win32_surface_get_dc (cairo_surface_t *surface); +Returns the HDC associated with this surface, or NULL if none. +Also returns NULL if the surface is not a win32 surface. +A call to cairo_surface_flush() is required before using the HDC to +ensure that all pending drawing operations are finished and to +restore any temporary modification cairo has made to its state. A +call to cairo_surface_mark_dirty() is required after the state or +the content of the HDC has been modified. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + HDC or NULL if no HDC available. + +Since 1.2 + +cairo_win32_surface_get_image () +cairo_win32_surface_get_image +cairo_surface_t * +cairo_win32_surface_get_image (cairo_surface_t *surface); +Returns a cairo_surface_t image surface that refers to the same bits +as the DIB of the Win32 surface. If the passed-in win32 surface +is not a DIB surface, NULL is returned. + +Parameters + + + + + + +surface +a cairo_surface_t + + + +Returns + a cairo_surface_t (owned by the win32 cairo_surface_t), +or NULL if the win32 surface is not a DIB. + +Since 1.4 + + + +Types and Values + +CAIRO_HAS_WIN32_SURFACE +CAIRO_HAS_WIN32_SURFACE +#define CAIRO_HAS_WIN32_SURFACE 1 + +Defined if the Microsoft Windows surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.0 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-xcb.xml b/doc/public/xml/cairo-xcb.xml new file mode 100644 index 000000000..173ce0238 --- /dev/null +++ b/doc/public/xml/cairo-xcb.xml @@ -0,0 +1,488 @@ + + +]> + + +XCB Surfaces +3 + + CAIRO Library + + + +XCB Surfaces +X Window System rendering using the XCB library + + + +Functions + + + + + +cairo_surface_t * +cairo_xcb_surface_create () +cairo_surface_t * +cairo_xcb_surface_create_for_bitmap () +cairo_surface_t * +cairo_xcb_surface_create_with_xrender_format () +void +cairo_xcb_surface_set_size () +void +cairo_xcb_surface_set_drawable () +xcb_connection_t * +cairo_xcb_device_get_connection () +void +cairo_xcb_device_debug_cap_xrender_version () +void +cairo_xcb_device_debug_cap_xshm_version () +int +cairo_xcb_device_debug_get_precision () +void +cairo_xcb_device_debug_set_precision () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_XCB_SURFACE +#defineCAIRO_HAS_XCB_SHM_FUNCTIONS + + + + + + +Object Hierarchy + + + + + + +Description +The XCB surface is used to render cairo graphics to X Window System +windows and pixmaps using the XCB library. +Note that the XCB surface automatically takes advantage of the X render +extension if it is available. + + + +Functions + +cairo_xcb_surface_create () +cairo_xcb_surface_create +cairo_surface_t * +cairo_xcb_surface_create (xcb_connection_t *connection, + xcb_drawable_t drawable, + xcb_visualtype_t *visual, + int width, + int height); +Creates an XCB surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided visual. +Note: If drawable + is a Window, then the function +cairo_xcb_surface_set_size() must be called whenever the size of the +window changes. +When drawable + is a Window containing child windows then drawing to +the created surface will be clipped by those child windows. When +the created surface is used as a source, the contents of the +children will be included. + +Parameters + + + + + + +connection +an XCB connection + +drawable +an XCB drawable + +visual +the visual to use for drawing to drawable +. The depth +of the visual must match the depth of the drawable. +Currently, only TrueColor visuals are fully supported. + +width +the current width of drawable + + +height +the current height of drawable + + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.12 + +cairo_xcb_surface_create_for_bitmap () +cairo_xcb_surface_create_for_bitmap +cairo_surface_t * +cairo_xcb_surface_create_for_bitmap (xcb_connection_t *connection, + xcb_screen_t *screen, + xcb_pixmap_t bitmap, + int width, + int height); +Creates an XCB surface that draws to the given bitmap. +This will be drawn to as a CAIRO_FORMAT_A1 object. + +Parameters + + + + + + +connection +an XCB connection + +screen +the XCB screen associated with bitmap + + +bitmap +an XCB drawable (a Pixmap with depth 1) + +width +the current width of bitmap + + +height +the current height of bitmap + + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.12 + +cairo_xcb_surface_create_with_xrender_format () +cairo_xcb_surface_create_with_xrender_format +cairo_surface_t * +cairo_xcb_surface_create_with_xrender_format + (xcb_connection_t *connection, + xcb_screen_t *screen, + xcb_drawable_t drawable, + xcb_render_pictforminfo_t *format, + int width, + int height); +Creates an XCB surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided picture format. +Note: If drawable + is a Window, then the function +cairo_xcb_surface_set_size() must be called whenever the size of the +window changes. +When drawable + is a Window containing child windows then drawing to +the created surface will be clipped by those child windows. When +the created surface is used as a source, the contents of the +children will be included. + +Parameters + + + + + + +connection +an XCB connection + +screen +the XCB screen associated with drawable + + +drawable +an XCB drawable + +format +the picture format to use for drawing to drawable +. The +depth of format +mush match the depth of the drawable. + +width +the current width of drawable + + +height +the current height of drawable + + + + +Returns + a pointer to the newly created surface. The caller +owns the surface and should call cairo_surface_destroy() when done +with it. +This function always returns a valid pointer, but it will return a +pointer to a "nil" surface if an error such as out of memory +occurs. You can use cairo_surface_status() to check for this. + +Since 1.12 + +cairo_xcb_surface_set_size () +cairo_xcb_surface_set_size +void +cairo_xcb_surface_set_size (cairo_surface_t *surface, + int width, + int height); +Informs cairo of the new size of the XCB drawable underlying the +surface. For a surface created for a window (rather than a pixmap), +this function must be called each time the size of the window +changes. (For a subwindow, you are normally resizing the window +yourself, but for a toplevel window, it is necessary to listen for +ConfigureNotify events.) +A pixmap can never change size, so it is never necessary to call +this function on a surface created for a pixmap. +If cairo_surface_flush() wasn't called, some pending operations +might be discarded. + +Parameters + + + + + + +surface +a cairo_surface_t for the XCB backend + +width +the new width of the surface + +height +the new height of the surface + + +Since 1.12 + +cairo_xcb_surface_set_drawable () +cairo_xcb_surface_set_drawable +void +cairo_xcb_surface_set_drawable (cairo_surface_t *surface, + xcb_drawable_t drawable, + int width, + int height); +Informs cairo of the new drawable and size of the XCB drawable underlying the +surface. +If cairo_surface_flush() wasn't called, some pending operations +might be discarded. + +Parameters + + + + + + +surface +a cairo_surface_t for the XCB backend + +drawable +the new drawable of the surface + +width +the new width of the surface + +height +the new height of the surface + + +Since 1.12 + +cairo_xcb_device_get_connection () +cairo_xcb_device_get_connection +xcb_connection_t * +cairo_xcb_device_get_connection (cairo_device_t *device); +Get the connection for the XCB device. + +Parameters + + + + + + +device +a cairo_device_t for the XCB backend + + + +Returns + the xcb_connection_t for the connection + +Since 1.12 + +cairo_xcb_device_debug_cap_xrender_version () +cairo_xcb_device_debug_cap_xrender_version +void +cairo_xcb_device_debug_cap_xrender_version + (cairo_device_t *device, + int major_version, + int minor_version); +Restricts all future XCB surfaces for this devices to the specified version +of the RENDER extension. This function exists solely for debugging purpose. +It let's you find out how cairo would behave with an older version of +the RENDER extension. +Use the special values -1 and -1 for disabling the RENDER extension. + +Parameters + + + + + + +device +a cairo_device_t for the XCB backend + +major_version +major version to restrict to + +minor_version +minor version to restrict to + + +Since 1.12 + +cairo_xcb_device_debug_cap_xshm_version () +cairo_xcb_device_debug_cap_xshm_version +void +cairo_xcb_device_debug_cap_xshm_version + (cairo_device_t *device, + int major_version, + int minor_version); +Restricts all future XCB surfaces for this devices to the specified version +of the SHM extension. This function exists solely for debugging purpose. +It let's you find out how cairo would behave with an older version of +the SHM extension. +Use the special values -1 and -1 for disabling the SHM extension. + +Parameters + + + + + + +device +a cairo_device_t for the XCB backend + +major_version +major version to restrict to + +minor_version +minor version to restrict to + + +Since 1.12 + +cairo_xcb_device_debug_get_precision () +cairo_xcb_device_debug_get_precision +int +cairo_xcb_device_debug_get_precision (cairo_device_t *device); +Get the Xrender precision mode. + +Parameters + + + + + + +device +a cairo_device_t for the XCB backend + + + +Returns + the render precision mode + +Since 1.12 + +cairo_xcb_device_debug_set_precision () +cairo_xcb_device_debug_set_precision +void +cairo_xcb_device_debug_set_precision (cairo_device_t *device, + int precision); +Render supports two modes of precision when rendering trapezoids. Set +the precision to the desired mode. + +Parameters + + + + + + +device +a cairo_device_t for the XCB backend + +precision +the precision to use + + +Since 1.12 + + + +Types and Values + +CAIRO_HAS_XCB_SURFACE +CAIRO_HAS_XCB_SURFACE +#define CAIRO_HAS_XCB_SURFACE 1 + +Defined if the xcb surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.12 + +CAIRO_HAS_XCB_SHM_FUNCTIONS +CAIRO_HAS_XCB_SHM_FUNCTIONS +#define CAIRO_HAS_XCB_SHM_FUNCTIONS 1 + + + + + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-xlib-xrender.xml b/doc/public/xml/cairo-xlib-xrender.xml new file mode 100644 index 000000000..8c252ae71 --- /dev/null +++ b/doc/public/xml/cairo-xlib-xrender.xml @@ -0,0 +1,171 @@ + + +]> + + +XLib-XRender Backend +3 + + CAIRO Library + + + +XLib-XRender Backend +X Window System rendering using XLib and the X Render extension + + + +Functions + + + + + +cairo_surface_t * +cairo_xlib_surface_create_with_xrender_format () +XRenderPictFormat * +cairo_xlib_surface_get_xrender_format () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_XLIB_XRENDER_SURFACE + + + + + + +Object Hierarchy + + + + + + +Description +The XLib surface is used to render cairo graphics to X Window System +windows and pixmaps using the XLib and Xrender libraries. +Note that the XLib surface automatically takes advantage of X Render extension +if it is available. + + + +Functions + +cairo_xlib_surface_create_with_xrender_format () +cairo_xlib_surface_create_with_xrender_format +cairo_surface_t * +cairo_xlib_surface_create_with_xrender_format + (Display *dpy, + Drawable drawable, + Screen *screen, + XRenderPictFormat *format, + int width, + int height); +Creates an Xlib surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided picture format. +Note: If drawable + is a Window, then the function +cairo_xlib_surface_set_size() must be called whenever the size of the +window changes. + +Parameters + + + + + + +dpy +an X Display + +drawable +an X Drawable, (a Pixmap or a Window) + +screen +the X Screen associated with drawable + + +format +the picture format to use for drawing to drawable +. The depth +of format +must match the depth of the drawable. + +width +the current width of drawable +. + +height +the current height of drawable +. + + + +Returns + the newly created surface + +Since 1.0 + +cairo_xlib_surface_get_xrender_format () +cairo_xlib_surface_get_xrender_format +XRenderPictFormat * +cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface); +Gets the X Render picture format that surface + uses for rendering with the +X Render extension. If the surface was created by +cairo_xlib_surface_create_with_xrender_format() originally, the return +value is the format passed to that constructor. + +Parameters + + + + + + +surface +an xlib surface + + + +Returns + the XRenderPictFormat* associated with surface +, +or NULL if the surface is not an xlib surface +or if the X Render extension is not available. + +Since 1.6 + + + +Types and Values + +CAIRO_HAS_XLIB_XRENDER_SURFACE +CAIRO_HAS_XLIB_XRENDER_SURFACE +#define CAIRO_HAS_XLIB_XRENDER_SURFACE 1 + +Defined if the XLib/XRender surface functions are available. +This macro can be used to conditionally compile backend-specific code. +Since 1.6 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo-xlib.xml b/doc/public/xml/cairo-xlib.xml new file mode 100644 index 000000000..b280b4916 --- /dev/null +++ b/doc/public/xml/cairo-xlib.xml @@ -0,0 +1,524 @@ + + +]> + + +XLib Surfaces +3 + + CAIRO Library + + + +XLib Surfaces +X Window System rendering using XLib + + + +Functions + + + + + +cairo_surface_t * +cairo_xlib_surface_create () +cairo_surface_t * +cairo_xlib_surface_create_for_bitmap () +void +cairo_xlib_surface_set_size () +Display * +cairo_xlib_surface_get_display () +Screen * +cairo_xlib_surface_get_screen () +void +cairo_xlib_surface_set_drawable () +Drawable +cairo_xlib_surface_get_drawable () +Visual * +cairo_xlib_surface_get_visual () +int +cairo_xlib_surface_get_width () +int +cairo_xlib_surface_get_height () +int +cairo_xlib_surface_get_depth () +void +cairo_xlib_device_debug_cap_xrender_version () +int +cairo_xlib_device_debug_get_precision () +void +cairo_xlib_device_debug_set_precision () + + + + + + +Types and Values + + + + + +#defineCAIRO_HAS_XLIB_SURFACE + + + + + + +Object Hierarchy + + + + + + +Description +The XLib surface is used to render cairo graphics to X Window System +windows and pixmaps using the XLib library. +Note that the XLib surface automatically takes advantage of X render extension +if it is available. + + + +Functions + +cairo_xlib_surface_create () +cairo_xlib_surface_create +cairo_surface_t * +cairo_xlib_surface_create (Display *dpy, + Drawable drawable, + Visual *visual, + int width, + int height); +Creates an Xlib surface that draws to the given drawable. +The way that colors are represented in the drawable is specified +by the provided visual. +Note: If drawable + is a Window, then the function +cairo_xlib_surface_set_size() must be called whenever the size of the +window changes. +When drawable + is a Window containing child windows then drawing to +the created surface will be clipped by those child windows. When +the created surface is used as a source, the contents of the +children will be included. + +Parameters + + + + + + +dpy +an X Display + +drawable +an X Drawable, (a Pixmap or a Window) + +visual +the visual to use for drawing to drawable +. The depth +of the visual must match the depth of the drawable. +Currently, only TrueColor visuals are fully supported. + +width +the current width of drawable +. + +height +the current height of drawable +. + + + +Returns + the newly created surface + +Since 1.0 + +cairo_xlib_surface_create_for_bitmap () +cairo_xlib_surface_create_for_bitmap +cairo_surface_t * +cairo_xlib_surface_create_for_bitmap (Display *dpy, + Pixmap bitmap, + Screen *screen, + int width, + int height); +Creates an Xlib surface that draws to the given bitmap. +This will be drawn to as a CAIRO_FORMAT_A1 object. + +Parameters + + + + + + +dpy +an X Display + +bitmap +an X Drawable, (a depth-1 Pixmap) + +screen +the X Screen associated with bitmap + + +width +the current width of bitmap +. + +height +the current height of bitmap +. + + + +Returns + the newly created surface + +Since 1.0 + +cairo_xlib_surface_set_size () +cairo_xlib_surface_set_size +void +cairo_xlib_surface_set_size (cairo_surface_t *surface, + int width, + int height); +Informs cairo of the new size of the X Drawable underlying the +surface. For a surface created for a Window (rather than a Pixmap), +this function must be called each time the size of the window +changes. (For a subwindow, you are normally resizing the window +yourself, but for a toplevel window, it is necessary to listen for +ConfigureNotify events.) +A Pixmap can never change size, so it is never necessary to call +this function on a surface created for a Pixmap. + +Parameters + + + + + + +surface +a cairo_surface_t for the XLib backend + +width +the new width of the surface + +height +the new height of the surface + + +Since 1.0 + +cairo_xlib_surface_get_display () +cairo_xlib_surface_get_display +Display * +cairo_xlib_surface_get_display (cairo_surface_t *surface); +Get the X Display for the underlying X Drawable. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the display. + +Since 1.2 + +cairo_xlib_surface_get_screen () +cairo_xlib_surface_get_screen +Screen * +cairo_xlib_surface_get_screen (cairo_surface_t *surface); +Get the X Screen for the underlying X Drawable. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the screen. + +Since 1.2 + +cairo_xlib_surface_set_drawable () +cairo_xlib_surface_set_drawable +void +cairo_xlib_surface_set_drawable (cairo_surface_t *surface, + Drawable drawable, + int width, + int height); +Informs cairo of a new X Drawable underlying the +surface. The drawable must match the display, screen +and format of the existing drawable or the application +will get X protocol errors and will probably terminate. +No checks are done by this function to ensure this +compatibility. + +Parameters + + + + + + +surface +a cairo_surface_t for the XLib backend + +drawable +the new drawable for the surface + +width +the width of the new drawable + +height +the height of the new drawable + + +Since 1.0 + +cairo_xlib_surface_get_drawable () +cairo_xlib_surface_get_drawable +Drawable +cairo_xlib_surface_get_drawable (cairo_surface_t *surface); +Get the underlying X Drawable used for the surface. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the drawable. + +Since 1.2 + +cairo_xlib_surface_get_visual () +cairo_xlib_surface_get_visual +Visual * +cairo_xlib_surface_get_visual (cairo_surface_t *surface); +Gets the X Visual associated with surface +, suitable for use with the +underlying X Drawable. If surface + was created by +cairo_xlib_surface_create(), the return value is the Visual passed to that +constructor. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the Visual or NULL if there is no appropriate Visual for +surface +. + +Since 1.2 + +cairo_xlib_surface_get_width () +cairo_xlib_surface_get_width +int +cairo_xlib_surface_get_width (cairo_surface_t *surface); +Get the width of the X Drawable underlying the surface in pixels. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the width of the surface in pixels. + +Since 1.2 + +cairo_xlib_surface_get_height () +cairo_xlib_surface_get_height +int +cairo_xlib_surface_get_height (cairo_surface_t *surface); +Get the height of the X Drawable underlying the surface in pixels. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the height of the surface in pixels. + +Since 1.2 + +cairo_xlib_surface_get_depth () +cairo_xlib_surface_get_depth +int +cairo_xlib_surface_get_depth (cairo_surface_t *surface); +Get the number of bits used to represent each pixel value. + +Parameters + + + + + + +surface +a cairo_xlib_surface_t + + + +Returns + the depth of the surface in bits. + +Since 1.2 + +cairo_xlib_device_debug_cap_xrender_version () +cairo_xlib_device_debug_cap_xrender_version +void +cairo_xlib_device_debug_cap_xrender_version + (cairo_device_t *device, + int major_version, + int minor_version); +Restricts all future Xlib surfaces for this devices to the specified version +of the RENDER extension. This function exists solely for debugging purpose. +It lets you find out how cairo would behave with an older version of +the RENDER extension. +Use the special values -1 and -1 for disabling the RENDER extension. + +Parameters + + + + + + +device +a cairo_device_t for the Xlib backend + +major_version +major version to restrict to + +minor_version +minor version to restrict to + + +Since 1.12 + +cairo_xlib_device_debug_get_precision () +cairo_xlib_device_debug_get_precision +int +cairo_xlib_device_debug_get_precision (cairo_device_t *device); +Get the Xrender precision mode. + +Parameters + + + + + + +device +a cairo_device_t for the Xlib backend + + + +Returns + the render precision mode + +Since 1.12 + +cairo_xlib_device_debug_set_precision () +cairo_xlib_device_debug_set_precision +void +cairo_xlib_device_debug_set_precision (cairo_device_t *device, + int precision); +Render supports two modes of precision when rendering trapezoids. Set +the precision to the desired mode. + +Parameters + + + + + + +device +a cairo_device_t for the Xlib backend + +precision +the precision to use + + +Since 1.12 + + + +Types and Values + +CAIRO_HAS_XLIB_SURFACE +CAIRO_HAS_XLIB_SURFACE +#define CAIRO_HAS_XLIB_SURFACE 1 + +Defined if the Xlib surface backend is available. +This macro can be used to conditionally compile backend-specific code. +Since 1.0 + + + +See Also +cairo_surface_t + + + + diff --git a/doc/public/xml/cairo.xml b/doc/public/xml/cairo.xml new file mode 100644 index 000000000..4b490f0bf --- /dev/null +++ b/doc/public/xml/cairo.xml @@ -0,0 +1,2575 @@ + + +]> + + +cairo_t +3 + + CAIRO Library + + + +cairo_t +The cairo drawing context + + + +Functions + + + + + +cairo_t * +cairo_create () +cairo_t * +cairo_reference () +void +cairo_destroy () +cairo_status_t +cairo_status () +void +cairo_save () +void +cairo_restore () +cairo_surface_t * +cairo_get_target () +void +cairo_push_group () +void +cairo_push_group_with_content () +cairo_pattern_t * +cairo_pop_group () +void +cairo_pop_group_to_source () +cairo_surface_t * +cairo_get_group_target () +void +cairo_set_source_rgb () +void +cairo_set_source_rgba () +void +cairo_set_source () +void +cairo_set_source_surface () +cairo_pattern_t * +cairo_get_source () +void +cairo_set_antialias () +cairo_antialias_t +cairo_get_antialias () +void +cairo_set_dash () +int +cairo_get_dash_count () +void +cairo_get_dash () +void +cairo_set_fill_rule () +cairo_fill_rule_t +cairo_get_fill_rule () +void +cairo_set_line_cap () +cairo_line_cap_t +cairo_get_line_cap () +void +cairo_set_line_join () +cairo_line_join_t +cairo_get_line_join () +void +cairo_set_line_width () +double +cairo_get_line_width () +void +cairo_set_miter_limit () +double +cairo_get_miter_limit () +void +cairo_set_operator () +cairo_operator_t +cairo_get_operator () +void +cairo_set_tolerance () +double +cairo_get_tolerance () +void +cairo_clip () +void +cairo_clip_preserve () +void +cairo_clip_extents () +cairo_bool_t +cairo_in_clip () +void +cairo_reset_clip () +void +cairo_rectangle_list_destroy () +cairo_rectangle_list_t * +cairo_copy_clip_rectangle_list () +void +cairo_fill () +void +cairo_fill_preserve () +void +cairo_fill_extents () +cairo_bool_t +cairo_in_fill () +void +cairo_mask () +void +cairo_mask_surface () +void +cairo_paint () +void +cairo_paint_with_alpha () +void +cairo_stroke () +void +cairo_stroke_preserve () +void +cairo_stroke_extents () +cairo_bool_t +cairo_in_stroke () +void +cairo_copy_page () +void +cairo_show_page () +unsigned int +cairo_get_reference_count () +cairo_status_t +cairo_set_user_data () +void * +cairo_get_user_data () + + + + + + +Types and Values + + + + + +typedefcairo_t +enumcairo_antialias_t +enumcairo_fill_rule_t +enumcairo_line_cap_t +enumcairo_line_join_t +enumcairo_operator_t +cairo_rectangle_t +cairo_rectangle_list_t + + + + + + +Object Hierarchy + + + + + + +Description +cairo_t is the main object used when drawing with cairo. To +draw with cairo, you create a cairo_t, set the target surface, +and drawing options for the cairo_t, create shapes with +functions like cairo_move_to() and cairo_line_to(), and then +draw shapes with cairo_stroke() or cairo_fill(). +cairo_t's can be pushed to a stack via cairo_save(). +They may then safely be changed, without losing the current state. +Use cairo_restore() to restore to the saved state. + + + +Functions + +cairo_create () +cairo_create +cairo_t * +cairo_create (cairo_surface_t *target); +Creates a new cairo_t with all graphics state parameters set to +default values and with target + as a target surface. The target +surface should be constructed with a backend-specific function such +as cairo_image_surface_create() (or any other +cairo_backend_surface_create() +variant). +This function references target +, so you can immediately +call cairo_surface_destroy() on it if you don't need to +maintain a separate reference to it. + +Parameters + + + + + + +target +target surface for the context + + + +Returns + a newly allocated cairo_t with a reference +count of 1. The initial reference count should be released +with cairo_destroy() when you are done using the cairo_t. +This function never returns NULL. If memory cannot be +allocated, a special cairo_t object will be returned on +which cairo_status() returns CAIRO_STATUS_NO_MEMORY. If +you attempt to target a surface which does not support +writing (such as cairo_mime_surface_t) then a +CAIRO_STATUS_WRITE_ERROR will be raised. You can use this +object normally, but no drawing will be done. + +Since 1.0 + +cairo_reference () +cairo_reference +cairo_t * +cairo_reference (cairo_t *cr); +Increases the reference count on cr + by one. This prevents +cr + from being destroyed until a matching call to cairo_destroy() +is made. +The number of references to a cairo_t can be get using +cairo_get_reference_count(). + +Parameters + + + + + + +cr +a cairo_t + + + +Returns + the referenced cairo_t. + +Since 1.0 + +cairo_destroy () +cairo_destroy +void +cairo_destroy (cairo_t *cr); +Decreases the reference count on cr + by one. If the result +is zero, then cr + and all associated resources are freed. +See cairo_reference(). + +Parameters + + + + + + +cr +a cairo_t + + +Since 1.0 + +cairo_status () +cairo_status +cairo_status_t +cairo_status (cairo_t *cr); +Checks whether an error has previously occurred for this context. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current status of this context, see cairo_status_t + +Since 1.0 + +cairo_save () +cairo_save +void +cairo_save (cairo_t *cr); +Makes a copy of the current state of cr + and saves it +on an internal stack of saved states for cr +. When +cairo_restore() is called, cr + will be restored to +the saved state. Multiple calls to cairo_save() and +cairo_restore() can be nested; each call to cairo_restore() +restores the state from the matching paired cairo_save(). +It isn't necessary to clear all saved states before +a cairo_t is freed. If the reference count of a cairo_t +drops to zero in response to a call to cairo_destroy(), +any saved states will be freed along with the cairo_t. + +Parameters + + + + + + +cr +a cairo_t + + +Since 1.0 + +cairo_restore () +cairo_restore +void +cairo_restore (cairo_t *cr); +Restores cr + to the state saved by a preceding call to +cairo_save() and removes that state from the stack of +saved states. + +Parameters + + + + + + +cr +a cairo_t + + +Since 1.0 + +cairo_get_target () +cairo_get_target +cairo_surface_t * +cairo_get_target (cairo_t *cr); +Gets the target surface for the cairo context as passed to +cairo_create(). +This function will always return a valid pointer, but the result +can be a "nil" surface if cr + is already in an error state, +(ie. cairo_status() != CAIRO_STATUS_SUCCESS). +A nil surface is indicated by cairo_surface_status() +!= CAIRO_STATUS_SUCCESS. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the target surface. This object is owned by cairo. To +keep a reference to it, you must call cairo_surface_reference(). + +Since 1.0 + +cairo_push_group () +cairo_push_group +void +cairo_push_group (cairo_t *cr); +Temporarily redirects drawing to an intermediate surface known as a +group. The redirection lasts until the group is completed by a call +to cairo_pop_group() or cairo_pop_group_to_source(). These calls +provide the result of any drawing to the group as a pattern, +(either as an explicit object, or set as the source pattern). +This group functionality can be convenient for performing +intermediate compositing. One common use of a group is to render +objects as opaque within the group, (so that they occlude each +other), and then blend the result with translucence onto the +destination. +Groups can be nested arbitrarily deep by making balanced calls to +cairo_push_group()/cairo_pop_group(). Each call pushes/pops the new +target group onto/from a stack. +The cairo_push_group() function calls cairo_save() so that any +changes to the graphics state will not be visible outside the +group, (the pop_group functions call cairo_restore()). +By default the intermediate group will have a content type of +CAIRO_CONTENT_COLOR_ALPHA. Other content types can be chosen for +the group by using cairo_push_group_with_content() instead. +As an example, here is how one might fill and stroke a path with +translucence, but without any portion of the fill being visible +under the stroke: + +cairo_push_group (cr); +cairo_set_source (cr, fill_pattern); +cairo_fill_preserve (cr); +cairo_set_source (cr, stroke_pattern); +cairo_stroke (cr); +cairo_pop_group_to_source (cr); +cairo_paint_with_alpha (cr, alpha); + + +Parameters + + + + + + +cr +a cairo context + + +Since 1.2 + +cairo_push_group_with_content () +cairo_push_group_with_content +void +cairo_push_group_with_content (cairo_t *cr, + cairo_content_t content); +Temporarily redirects drawing to an intermediate surface known as a +group. The redirection lasts until the group is completed by a call +to cairo_pop_group() or cairo_pop_group_to_source(). These calls +provide the result of any drawing to the group as a pattern, +(either as an explicit object, or set as the source pattern). +The group will have a content type of content +. The ability to +control this content type is the only distinction between this +function and cairo_push_group() which you should see for a more +detailed description of group rendering. + +Parameters + + + + + + +cr +a cairo context + +content +a cairo_content_t indicating the type of group that +will be created + + +Since 1.2 + +cairo_pop_group () +cairo_pop_group +cairo_pattern_t * +cairo_pop_group (cairo_t *cr); +Terminates the redirection begun by a call to cairo_push_group() or +cairo_push_group_with_content() and returns a new pattern +containing the results of all drawing operations performed to the +group. +The cairo_pop_group() function calls cairo_restore(), (balancing a +call to cairo_save() by the push_group function), so that any +changes to the graphics state will not be visible outside the +group. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + a newly created (surface) pattern containing the +results of all drawing operations performed to the group. The +caller owns the returned object and should call +cairo_pattern_destroy() when finished with it. + +Since 1.2 + +cairo_pop_group_to_source () +cairo_pop_group_to_source +void +cairo_pop_group_to_source (cairo_t *cr); +Terminates the redirection begun by a call to cairo_push_group() or +cairo_push_group_with_content() and installs the resulting pattern +as the source pattern in the given cairo context. +The behavior of this function is equivalent to the sequence of +operations: + +cairo_pattern_t *group = cairo_pop_group (cr); +cairo_set_source (cr, group); +cairo_pattern_destroy (group); + +but is more convenient as their is no need for a variable to store +the short-lived pointer to the pattern. +The cairo_pop_group() function calls cairo_restore(), (balancing a +call to cairo_save() by the push_group function), so that any +changes to the graphics state will not be visible outside the +group. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.2 + +cairo_get_group_target () +cairo_get_group_target +cairo_surface_t * +cairo_get_group_target (cairo_t *cr); +Gets the current destination surface for the context. This is either +the original target surface as passed to cairo_create() or the target +surface for the current group as started by the most recent call to +cairo_push_group() or cairo_push_group_with_content(). +This function will always return a valid pointer, but the result +can be a "nil" surface if cr + is already in an error state, +(ie. cairo_status() != CAIRO_STATUS_SUCCESS). +A nil surface is indicated by cairo_surface_status() +!= CAIRO_STATUS_SUCCESS. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the target surface. This object is owned by cairo. To +keep a reference to it, you must call cairo_surface_reference(). + +Since 1.2 + +cairo_set_source_rgb () +cairo_set_source_rgb +void +cairo_set_source_rgb (cairo_t *cr, + double red, + double green, + double blue); +Sets the source pattern within cr + to an opaque color. This opaque +color will then be used for any subsequent drawing operation until +a new source pattern is set. +The color components are floating point numbers in the range 0 to + + +If the values passed in are outside that range, they will be +clamped. + + +The default source pattern is opaque black, (that is, it is +equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, 0.0)). + +Parameters + + + + + + +cr +a cairo context + +red +red component of color + +green +green component of color + +blue +blue component of color + + +Since 1.0 + +cairo_set_source_rgba () +cairo_set_source_rgba +void +cairo_set_source_rgba (cairo_t *cr, + double red, + double green, + double blue, + double alpha); +Sets the source pattern within cr + to a translucent color. This +color will then be used for any subsequent drawing operation until +a new source pattern is set. +The color and alpha components are floating point numbers in the +range 0 to 1. If the values passed in are outside that range, they +will be clamped. +The default source pattern is opaque black, (that is, it is +equivalent to cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0)). + +Parameters + + + + + + +cr +a cairo context + +red +red component of color + +green +green component of color + +blue +blue component of color + +alpha +alpha component of color + + +Since 1.0 + +cairo_set_source () +cairo_set_source +void +cairo_set_source (cairo_t *cr, + cairo_pattern_t *source); +Sets the source pattern within cr + to source +. This pattern +will then be used for any subsequent drawing operation until a new +source pattern is set. +Note: The pattern's transformation matrix will be locked to the +user space in effect at the time of cairo_set_source(). This means +that further modifications of the current transformation matrix +will not affect the source pattern. See cairo_pattern_set_matrix(). +The default source pattern is a solid pattern that is opaque black, +(that is, it is equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, +0.0)). + +Parameters + + + + + + +cr +a cairo context + +source +a cairo_pattern_t to be used as the source for +subsequent drawing operations. + + +Since 1.0 + +cairo_set_source_surface () +cairo_set_source_surface +void +cairo_set_source_surface (cairo_t *cr, + cairo_surface_t *surface, + double x, + double y); +This is a convenience function for creating a pattern from surface + +and setting it as the source in cr + with cairo_set_source(). +The x + and y + parameters give the user-space coordinate at which +the surface origin should appear. (The surface origin is its +upper-left corner before any transformation has been applied.) The +x + and y + parameters are negated and then set as translation values +in the pattern matrix. +Other than the initial translation pattern matrix, as described +above, all other pattern attributes, (such as its extend mode), are +set to the default values as in cairo_pattern_create_for_surface(). +The resulting pattern can be queried with cairo_get_source() so +that these attributes can be modified if desired, (eg. to create a +repeating pattern with cairo_pattern_set_extend()). + +Parameters + + + + + + +cr +a cairo context + +surface +a surface to be used to set the source pattern + +x +User-space X coordinate for surface origin + +y +User-space Y coordinate for surface origin + + +Since 1.0 + +cairo_get_source () +cairo_get_source +cairo_pattern_t * +cairo_get_source (cairo_t *cr); +Gets the current source pattern for cr +. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current source pattern. This object is owned by +cairo. To keep a reference to it, you must call +cairo_pattern_reference(). + +Since 1.0 + +cairo_set_antialias () +cairo_set_antialias +void +cairo_set_antialias (cairo_t *cr, + cairo_antialias_t antialias); +Set the antialiasing mode of the rasterizer used for drawing shapes. +This value is a hint, and a particular backend may or may not support +a particular value. At the current time, no backend supports +CAIRO_ANTIALIAS_SUBPIXEL when drawing shapes. +Note that this option does not affect text rendering, instead see +cairo_font_options_set_antialias(). + +Parameters + + + + + + +cr +a cairo_t + +antialias +the new antialiasing mode + + +Since 1.0 + +cairo_get_antialias () +cairo_get_antialias +cairo_antialias_t +cairo_get_antialias (cairo_t *cr); +Gets the current shape antialiasing mode, as set by +cairo_set_antialias(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current shape antialiasing mode. + +Since 1.0 + +cairo_set_dash () +cairo_set_dash +void +cairo_set_dash (cairo_t *cr, + const double *dashes, + int num_dashes, + double offset); +Sets the dash pattern to be used by cairo_stroke(). A dash pattern +is specified by dashes +, an array of positive values. Each value +provides the length of alternate "on" and "off" portions of the +stroke. The offset + specifies an offset into the pattern at which +the stroke begins. +Each "on" segment will have caps applied as if the segment were a +separate sub-path. In particular, it is valid to use an "on" length +of 0.0 with CAIRO_LINE_CAP_ROUND or CAIRO_LINE_CAP_SQUARE in order +to distributed dots or squares along a path. +Note: The length values are in user-space units as evaluated at the +time of stroking. This is not necessarily the same as the user +space at the time of cairo_set_dash(). +If num_dashes + is 0 dashing is disabled. +If num_dashes + is 1 a symmetric pattern is assumed with alternating +on and off portions of the size specified by the single value in +dashes +. +If any value in dashes + is negative, or if all values are 0, then +cr + will be put into an error state with a status of +CAIRO_STATUS_INVALID_DASH. + +Parameters + + + + + + +cr +a cairo context + +dashes +an array specifying alternate lengths of on and off stroke portions + +num_dashes +the length of the dashes array + +offset +an offset into the dash pattern at which the stroke should start + + +Since 1.0 + +cairo_get_dash_count () +cairo_get_dash_count +int +cairo_get_dash_count (cairo_t *cr); +This function returns the length of the dash array in cr + (0 if dashing +is not currently in effect). +See also cairo_set_dash() and cairo_get_dash(). + +Parameters + + + + + + +cr +a cairo_t + + + +Returns + the length of the dash array, or 0 if no dash array set. + +Since 1.4 + +cairo_get_dash () +cairo_get_dash +void +cairo_get_dash (cairo_t *cr, + double *dashes, + double *offset); +Gets the current dash array. If not NULL, dashes + should be big +enough to hold at least the number of values returned by +cairo_get_dash_count(). + +Parameters + + + + + + +cr +a cairo_t + +dashes +return value for the dash array, or NULL + +offset +return value for the current dash offset, or NULL + + +Since 1.4 + +cairo_set_fill_rule () +cairo_set_fill_rule +void +cairo_set_fill_rule (cairo_t *cr, + cairo_fill_rule_t fill_rule); +Set the current fill rule within the cairo context. The fill rule +is used to determine which regions are inside or outside a complex +(potentially self-intersecting) path. The current fill rule affects +both cairo_fill() and cairo_clip(). See cairo_fill_rule_t for details +on the semantics of each available fill rule. +The default fill rule is CAIRO_FILL_RULE_WINDING. + +Parameters + + + + + + +cr +a cairo_t + +fill_rule +a fill rule, specified as a cairo_fill_rule_t + + +Since 1.0 + +cairo_get_fill_rule () +cairo_get_fill_rule +cairo_fill_rule_t +cairo_get_fill_rule (cairo_t *cr); +Gets the current fill rule, as set by cairo_set_fill_rule(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current fill rule. + +Since 1.0 + +cairo_set_line_cap () +cairo_set_line_cap +void +cairo_set_line_cap (cairo_t *cr, + cairo_line_cap_t line_cap); +Sets the current line cap style within the cairo context. See +cairo_line_cap_t for details about how the available line cap +styles are drawn. +As with the other stroke parameters, the current line cap style is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction. +The default line cap style is CAIRO_LINE_CAP_BUTT. + +Parameters + + + + + + +cr +a cairo context + +line_cap +a line cap style + + +Since 1.0 + +cairo_get_line_cap () +cairo_get_line_cap +cairo_line_cap_t +cairo_get_line_cap (cairo_t *cr); +Gets the current line cap style, as set by cairo_set_line_cap(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current line cap style. + +Since 1.0 + +cairo_set_line_join () +cairo_set_line_join +void +cairo_set_line_join (cairo_t *cr, + cairo_line_join_t line_join); +Sets the current line join style within the cairo context. See +cairo_line_join_t for details about how the available line join +styles are drawn. +As with the other stroke parameters, the current line join style is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction. +The default line join style is CAIRO_LINE_JOIN_MITER. + +Parameters + + + + + + +cr +a cairo context + +line_join +a line join style + + +Since 1.0 + +cairo_get_line_join () +cairo_get_line_join +cairo_line_join_t +cairo_get_line_join (cairo_t *cr); +Gets the current line join style, as set by cairo_set_line_join(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current line join style. + +Since 1.0 + +cairo_set_line_width () +cairo_set_line_width +void +cairo_set_line_width (cairo_t *cr, + double width); +Sets the current line width within the cairo context. The line +width value specifies the diameter of a pen that is circular in +user space, (though device-space pen may be an ellipse in general +due to scaling/shear/rotation of the CTM). +Note: When the description above refers to user space and CTM it +refers to the user space and CTM in effect at the time of the +stroking operation, not the user space and CTM in effect at the +time of the call to cairo_set_line_width(). The simplest usage +makes both of these spaces identical. That is, if there is no +change to the CTM between a call to cairo_set_line_width() and the +stroking operation, then one can just pass user-space values to +cairo_set_line_width() and ignore this note. +As with the other stroke parameters, the current line width is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction. +The default line width value is 2.0. + +Parameters + + + + + + +cr +a cairo_t + +width +a line width + + +Since 1.0 + +cairo_get_line_width () +cairo_get_line_width +double +cairo_get_line_width (cairo_t *cr); +This function returns the current line width value exactly as set by +cairo_set_line_width(). Note that the value is unchanged even if +the CTM has changed between the calls to cairo_set_line_width() and +cairo_get_line_width(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current line width. + +Since 1.0 + +cairo_set_miter_limit () +cairo_set_miter_limit +void +cairo_set_miter_limit (cairo_t *cr, + double limit); +Sets the current miter limit within the cairo context. +If the current line join style is set to CAIRO_LINE_JOIN_MITER +(see cairo_set_line_join()), the miter limit is used to determine +whether the lines should be joined with a bevel instead of a miter. +Cairo divides the length of the miter by the line width. +If the result is greater than the miter limit, the style is +converted to a bevel. +As with the other stroke parameters, the current line miter limit is +examined by cairo_stroke(), cairo_stroke_extents(), and +cairo_stroke_to_path(), but does not have any effect during path +construction. +The default miter limit value is 10.0, which will convert joins +with interior angles less than 11 degrees to bevels instead of +miters. For reference, a miter limit of 2.0 makes the miter cutoff +at 60 degrees, and a miter limit of 1.414 makes the cutoff at 90 +degrees. +A miter limit for a desired angle can be computed as: miter limit = +1/sin(angle/2) + +Parameters + + + + + + +cr +a cairo context + +limit +miter limit to set + + +Since 1.0 + +cairo_get_miter_limit () +cairo_get_miter_limit +double +cairo_get_miter_limit (cairo_t *cr); +Gets the current miter limit, as set by cairo_set_miter_limit(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current miter limit. + +Since 1.0 + +cairo_set_operator () +cairo_set_operator +void +cairo_set_operator (cairo_t *cr, + cairo_operator_t op); +Sets the compositing operator to be used for all drawing +operations. See cairo_operator_t for details on the semantics of +each available compositing operator. +The default operator is CAIRO_OPERATOR_OVER. + +Parameters + + + + + + +cr +a cairo_t + +op +a compositing operator, specified as a cairo_operator_t + + +Since 1.0 + +cairo_get_operator () +cairo_get_operator +cairo_operator_t +cairo_get_operator (cairo_t *cr); +Gets the current compositing operator for a cairo context. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current compositing operator. + +Since 1.0 + +cairo_set_tolerance () +cairo_set_tolerance +void +cairo_set_tolerance (cairo_t *cr, + double tolerance); +Sets the tolerance used when converting paths into trapezoids. +Curved segments of the path will be subdivided until the maximum +deviation between the original path and the polygonal approximation +is less than tolerance +. The default value is 0.1. A larger +value will give better performance, a smaller value, better +appearance. (Reducing the value from the default value of 0.1 +is unlikely to improve appearance significantly.) The accuracy of paths +within Cairo is limited by the precision of its internal arithmetic, and +the prescribed tolerance + is restricted to the smallest +representable internal value. + +Parameters + + + + + + +cr +a cairo_t + +tolerance +the tolerance, in device units (typically pixels) + + +Since 1.0 + +cairo_get_tolerance () +cairo_get_tolerance +double +cairo_get_tolerance (cairo_t *cr); +Gets the current tolerance value, as set by cairo_set_tolerance(). + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current tolerance value. + +Since 1.0 + +cairo_clip () +cairo_clip +void +cairo_clip (cairo_t *cr); +Establishes a new clip region by intersecting the current clip +region with the current path as it would be filled by cairo_fill() +and according to the current fill rule (see cairo_set_fill_rule()). +After cairo_clip(), the current path will be cleared from the cairo +context. +The current clip region affects all drawing operations by +effectively masking out any changes to the surface that are outside +the current clip region. +Calling cairo_clip() can only make the clip region smaller, never +larger. But the current clip is part of the graphics state, so a +temporary restriction of the clip region can be achieved by +calling cairo_clip() within a cairo_save()/cairo_restore() +pair. The only other means of increasing the size of the clip +region is cairo_reset_clip(). + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_clip_preserve () +cairo_clip_preserve +void +cairo_clip_preserve (cairo_t *cr); +Establishes a new clip region by intersecting the current clip +region with the current path as it would be filled by cairo_fill() +and according to the current fill rule (see cairo_set_fill_rule()). +Unlike cairo_clip(), cairo_clip_preserve() preserves the path within +the cairo context. +The current clip region affects all drawing operations by +effectively masking out any changes to the surface that are outside +the current clip region. +Calling cairo_clip_preserve() can only make the clip region smaller, never +larger. But the current clip is part of the graphics state, so a +temporary restriction of the clip region can be achieved by +calling cairo_clip_preserve() within a cairo_save()/cairo_restore() +pair. The only other means of increasing the size of the clip +region is cairo_reset_clip(). + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_clip_extents () +cairo_clip_extents +void +cairo_clip_extents (cairo_t *cr, + double *x1, + double *y1, + double *x2, + double *y2); +Computes a bounding box in user coordinates covering the area inside the +current clip. + +Parameters + + + + + + +cr +a cairo context + +x1 +left of the resulting extents + +y1 +top of the resulting extents + +x2 +right of the resulting extents + +y2 +bottom of the resulting extents + + +Since 1.4 + +cairo_in_clip () +cairo_in_clip +cairo_bool_t +cairo_in_clip (cairo_t *cr, + double x, + double y); +Tests whether the given point is inside the area that would be +visible through the current clip, i.e. the area that would be filled by +a cairo_paint() operation. +See cairo_clip(), and cairo_clip_preserve(). + +Parameters + + + + + + +cr +a cairo context + +x +X coordinate of the point to test + +y +Y coordinate of the point to test + + + +Returns + A non-zero value if the point is inside, or zero if +outside. + +Since 1.10 + +cairo_reset_clip () +cairo_reset_clip +void +cairo_reset_clip (cairo_t *cr); +Reset the current clip region to its original, unrestricted +state. That is, set the clip region to an infinitely large shape +containing the target surface. Equivalently, if infinity is too +hard to grasp, one can imagine the clip region being reset to the +exact bounds of the target surface. +Note that code meant to be reusable should not call +cairo_reset_clip() as it will cause results unexpected by +higher-level code which calls cairo_clip(). Consider using +cairo_save() and cairo_restore() around cairo_clip() as a more +robust means of temporarily restricting the clip region. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_rectangle_list_destroy () +cairo_rectangle_list_destroy +void +cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list); +Unconditionally frees rectangle_list + and all associated +references. After this call, the rectangle_list + pointer must not +be dereferenced. + +Parameters + + + + + + +rectangle_list +a rectangle list, as obtained from cairo_copy_clip_rectangle_list() + + +Since 1.4 + +cairo_copy_clip_rectangle_list () +cairo_copy_clip_rectangle_list +cairo_rectangle_list_t * +cairo_copy_clip_rectangle_list (cairo_t *cr); +Gets the current clip region as a list of rectangles in user coordinates. +Never returns NULL. +The status in the list may be CAIRO_STATUS_CLIP_NOT_REPRESENTABLE to +indicate that the clip region cannot be represented as a list of +user-space rectangles. The status may have other values to indicate +other errors. + +Parameters + + + + + + +cr +a cairo context + + + +Returns + the current clip region as a list of rectangles in user coordinates, +which should be destroyed using cairo_rectangle_list_destroy(). + +Since 1.4 + +cairo_fill () +cairo_fill +void +cairo_fill (cairo_t *cr); +A drawing operator that fills the current path according to the +current fill rule, (each sub-path is implicitly closed before being +filled). After cairo_fill(), the current path will be cleared from +the cairo context. See cairo_set_fill_rule() and +cairo_fill_preserve(). + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_fill_preserve () +cairo_fill_preserve +void +cairo_fill_preserve (cairo_t *cr); +A drawing operator that fills the current path according to the +current fill rule, (each sub-path is implicitly closed before being +filled). Unlike cairo_fill(), cairo_fill_preserve() preserves the +path within the cairo context. +See cairo_set_fill_rule() and cairo_fill(). + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_fill_extents () +cairo_fill_extents +void +cairo_fill_extents (cairo_t *cr, + double *x1, + double *y1, + double *x2, + double *y2); +Computes a bounding box in user coordinates covering the area that +would be affected, (the "inked" area), by a cairo_fill() operation +given the current path and fill parameters. If the current path is +empty, returns an empty rectangle ((0,0), (0,0)). Surface +dimensions and clipping are not taken into account. +Contrast with cairo_path_extents(), which is similar, but returns +non-zero extents for some paths with no inked area, (such as a +simple line segment). +Note that cairo_fill_extents() must necessarily do more work to +compute the precise inked areas in light of the fill rule, so +cairo_path_extents() may be more desirable for sake of performance +if the non-inked path extents are desired. +See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve(). + +Parameters + + + + + + +cr +a cairo context + +x1 +left of the resulting extents + +y1 +top of the resulting extents + +x2 +right of the resulting extents + +y2 +bottom of the resulting extents + + +Since 1.0 + +cairo_in_fill () +cairo_in_fill +cairo_bool_t +cairo_in_fill (cairo_t *cr, + double x, + double y); +Tests whether the given point is inside the area that would be +affected by a cairo_fill() operation given the current path and +filling parameters. Surface dimensions and clipping are not taken +into account. +See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve(). + +Parameters + + + + + + +cr +a cairo context + +x +X coordinate of the point to test + +y +Y coordinate of the point to test + + + +Returns + A non-zero value if the point is inside, or zero if +outside. + +Since 1.0 + +cairo_mask () +cairo_mask +void +cairo_mask (cairo_t *cr, + cairo_pattern_t *pattern); +A drawing operator that paints the current source +using the alpha channel of pattern + as a mask. (Opaque +areas of pattern + are painted with the source, transparent +areas are not painted.) + +Parameters + + + + + + +cr +a cairo context + +pattern +a cairo_pattern_t + + +Since 1.0 + +cairo_mask_surface () +cairo_mask_surface +void +cairo_mask_surface (cairo_t *cr, + cairo_surface_t *surface, + double surface_x, + double surface_y); +A drawing operator that paints the current source +using the alpha channel of surface + as a mask. (Opaque +areas of surface + are painted with the source, transparent +areas are not painted.) + +Parameters + + + + + + +cr +a cairo context + +surface +a cairo_surface_t + +surface_x +X coordinate at which to place the origin of surface + + +surface_y +Y coordinate at which to place the origin of surface + + + +Since 1.0 + +cairo_paint () +cairo_paint +void +cairo_paint (cairo_t *cr); +A drawing operator that paints the current source everywhere within +the current clip region. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_paint_with_alpha () +cairo_paint_with_alpha +void +cairo_paint_with_alpha (cairo_t *cr, + double alpha); +A drawing operator that paints the current source everywhere within +the current clip region using a mask of constant alpha value +alpha +. The effect is similar to cairo_paint(), but the drawing +is faded out using the alpha value. + +Parameters + + + + + + +cr +a cairo context + +alpha +alpha value, between 0 (transparent) and 1 (opaque) + + +Since 1.0 + +cairo_stroke () +cairo_stroke +void +cairo_stroke (cairo_t *cr); +A drawing operator that strokes the current path according to the +current line width, line join, line cap, and dash settings. After +cairo_stroke(), the current path will be cleared from the cairo +context. See cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve(). +Note: Degenerate segments and sub-paths are treated specially and +provide a useful result. These can result in two different +situations: + + +Zero-length "on" segments set in cairo_set_dash(). If the cap +style is CAIRO_LINE_CAP_ROUND or CAIRO_LINE_CAP_SQUARE then these +segments will be drawn as circular dots or squares respectively. In +the case of CAIRO_LINE_CAP_SQUARE, the orientation of the squares +is determined by the direction of the underlying path. + + +A sub-path created by cairo_move_to() followed by either a +cairo_close_path() or one or more calls to cairo_line_to() to the +same coordinate as the cairo_move_to(). If the cap style is +CAIRO_LINE_CAP_ROUND then these sub-paths will be drawn as circular +dots. Note that in the case of CAIRO_LINE_CAP_SQUARE a degenerate +sub-path will not be drawn at all, (since the correct orientation +is indeterminate). + + +In no case will a cap style of CAIRO_LINE_CAP_BUTT cause anything +to be drawn in the case of either degenerate segments or sub-paths. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_stroke_preserve () +cairo_stroke_preserve +void +cairo_stroke_preserve (cairo_t *cr); +A drawing operator that strokes the current path according to the +current line width, line join, line cap, and dash settings. Unlike +cairo_stroke(), cairo_stroke_preserve() preserves the path within the +cairo context. +See cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve(). + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_stroke_extents () +cairo_stroke_extents +void +cairo_stroke_extents (cairo_t *cr, + double *x1, + double *y1, + double *x2, + double *y2); +Computes a bounding box in user coordinates covering the area that +would be affected, (the "inked" area), by a cairo_stroke() +operation given the current path and stroke parameters. +If the current path is empty, returns an empty rectangle ((0,0), (0,0)). +Surface dimensions and clipping are not taken into account. +Note that if the line width is set to exactly zero, then +cairo_stroke_extents() will return an empty rectangle. Contrast with +cairo_path_extents() which can be used to compute the non-empty +bounds as the line width approaches zero. +Note that cairo_stroke_extents() must necessarily do more work to +compute the precise inked areas in light of the stroke parameters, +so cairo_path_extents() may be more desirable for sake of +performance if non-inked path extents are desired. +See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve(). + +Parameters + + + + + + +cr +a cairo context + +x1 +left of the resulting extents + +y1 +top of the resulting extents + +x2 +right of the resulting extents + +y2 +bottom of the resulting extents + + +Since 1.0 + +cairo_in_stroke () +cairo_in_stroke +cairo_bool_t +cairo_in_stroke (cairo_t *cr, + double x, + double y); +Tests whether the given point is inside the area that would be +affected by a cairo_stroke() operation given the current path and +stroking parameters. Surface dimensions and clipping are not taken +into account. +See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), +cairo_set_line_cap(), cairo_set_dash(), and +cairo_stroke_preserve(). + +Parameters + + + + + + +cr +a cairo context + +x +X coordinate of the point to test + +y +Y coordinate of the point to test + + + +Returns + A non-zero value if the point is inside, or zero if +outside. + +Since 1.0 + +cairo_copy_page () +cairo_copy_page +void +cairo_copy_page (cairo_t *cr); +Emits the current page for backends that support multiple pages, but +doesn't clear it, so, the contents of the current page will be retained +for the next page too. Use cairo_show_page() if you want to get an +empty page after the emission. +This is a convenience function that simply calls +cairo_surface_copy_page() on cr +'s target. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_show_page () +cairo_show_page +void +cairo_show_page (cairo_t *cr); +Emits and clears the current page for backends that support multiple +pages. Use cairo_copy_page() if you don't want to clear the page. +This is a convenience function that simply calls +cairo_surface_show_page() on cr +'s target. + +Parameters + + + + + + +cr +a cairo context + + +Since 1.0 + +cairo_get_reference_count () +cairo_get_reference_count +unsigned int +cairo_get_reference_count (cairo_t *cr); +Returns the current reference count of cr +. + +Parameters + + + + + + +cr +a cairo_t + + + +Returns + the current reference count of cr +. If the +object is a nil object, 0 will be returned. + +Since 1.4 + +cairo_set_user_data () +cairo_set_user_data +cairo_status_t +cairo_set_user_data (cairo_t *cr, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); +Attach user data to cr +. To remove user data from a surface, +call this function with the key that was used to set it and NULL +for data +. + +Parameters + + + + + + +cr +a cairo_t + +key +the address of a cairo_user_data_key_t to attach the user data to + +user_data +the user data to attach to the cairo_t + +destroy +a cairo_destroy_func_t which will be called when the +cairo_t is destroyed or when new user data is attached using the +same key. + + + +Returns + CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY if a +slot could not be allocated for the user data. + +Since 1.4 + +cairo_get_user_data () +cairo_get_user_data +void * +cairo_get_user_data (cairo_t *cr, + const cairo_user_data_key_t *key); +Return user data previously attached to cr + using the specified +key. If no user data has been attached with the given key this +function returns NULL. + +Parameters + + + + + + +cr +a cairo_t + +key +the address of the cairo_user_data_key_t the user data was +attached to + + + +Returns + the user data previously attached or NULL. + +Since 1.4 + + + +Types and Values + +cairo_t +cairo_t +typedef struct _cairo cairo_t; + +A cairo_t contains the current state of the rendering device, +including coordinates of yet to be drawn shapes. +Cairo contexts, as cairo_t objects are named, are central to +cairo and all drawing with cairo is always done to a cairo_t +object. +Memory management of cairo_t is done with +cairo_reference() and cairo_destroy(). +Since 1.0 + +enum cairo_antialias_t +cairo_antialias_t +Specifies the type of antialiasing to do when rendering text or shapes. +As it is not necessarily clear from the above what advantages a particular +antialias method provides, since 1.12, there is also a set of hints: +CAIRO_ANTIALIAS_FAST +: Allow the backend to degrade raster quality for speed +CAIRO_ANTIALIAS_GOOD +: A balance between speed and quality +CAIRO_ANTIALIAS_BEST +: A high-fidelity, but potentially slow, raster mode +These make no guarantee on how the backend will perform its rasterisation +(if it even rasterises!), nor that they have any differing effect other +than to enable some form of antialiasing. In the case of glyph rendering, +CAIRO_ANTIALIAS_FAST + and CAIRO_ANTIALIAS_GOOD + will be mapped to +CAIRO_ANTIALIAS_GRAY +, with CAIRO_ANTALIAS_BEST + being equivalent to +CAIRO_ANTIALIAS_SUBPIXEL +. +The interpretation of CAIRO_ANTIALIAS_DEFAULT + is left entirely up to +the backend, typically this will be similar to CAIRO_ANTIALIAS_GOOD +. + +Members + + + + + + +CAIRO_ANTIALIAS_DEFAULT +Use the default antialiasing for + the subsystem and target device, since 1.0 + + + +CAIRO_ANTIALIAS_NONE +Use a bilevel alpha mask, since 1.0 + + + +CAIRO_ANTIALIAS_GRAY +Perform single-color antialiasing (using + shades of gray for black text on a white background, for example), since 1.0 + + + +CAIRO_ANTIALIAS_SUBPIXEL +Perform antialiasing by taking + advantage of the order of subpixel elements on devices + such as LCD panels, since 1.0 + + + +CAIRO_ANTIALIAS_FAST +Hint that the backend should perform some +antialiasing but prefer speed over quality, since 1.12 + + + +CAIRO_ANTIALIAS_GOOD +The backend should balance quality against +performance, since 1.12 + + + +CAIRO_ANTIALIAS_BEST +Hint that the backend should render at the highest +quality, sacrificing speed if necessary, since 1.12 + + + + +Since 1.0 + +enum cairo_fill_rule_t +cairo_fill_rule_t +cairo_fill_rule_t is used to select how paths are filled. For both +fill rules, whether or not a point is included in the fill is +determined by taking a ray from that point to infinity and looking +at intersections with the path. The ray can be in any direction, +as long as it doesn't pass through the end point of a segment +or have a tricky intersection such as intersecting tangent to the path. +(Note that filling is not actually implemented in this way. This +is just a description of the rule that is applied.) +The default fill rule is CAIRO_FILL_RULE_WINDING. +New entries may be added in future versions. + +Members + + + + + + +CAIRO_FILL_RULE_WINDING +If the path crosses the ray from +left-to-right, counts +1. If the path crosses the ray +from right to left, counts -1. (Left and right are determined +from the perspective of looking along the ray from the starting +point.) If the total count is non-zero, the point will be filled. (Since 1.0) + + + +CAIRO_FILL_RULE_EVEN_ODD +Counts the total number of +intersections, without regard to the orientation of the contour. If +the total number of intersections is odd, the point will be +filled. (Since 1.0) + + + + +Since 1.0 + +enum cairo_line_cap_t +cairo_line_cap_t +Specifies how to render the endpoints of the path when stroking. +The default line cap style is CAIRO_LINE_CAP_BUTT. + +Members + + + + + + +CAIRO_LINE_CAP_BUTT +start(stop) the line exactly at the start(end) point (Since 1.0) + + + +CAIRO_LINE_CAP_ROUND +use a round ending, the center of the circle is the end point (Since 1.0) + + + +CAIRO_LINE_CAP_SQUARE +use squared ending, the center of the square is the end point (Since 1.0) + + + + +Since 1.0 + +enum cairo_line_join_t +cairo_line_join_t +Specifies how to render the junction of two lines when stroking. +The default line join style is CAIRO_LINE_JOIN_MITER. + +Members + + + + + + +CAIRO_LINE_JOIN_MITER +use a sharp (angled) corner, see +cairo_set_miter_limit() (Since 1.0) + + + +CAIRO_LINE_JOIN_ROUND +use a rounded join, the center of the circle is the +joint point (Since 1.0) + + + +CAIRO_LINE_JOIN_BEVEL +use a cut-off join, the join is cut off at half +the line width from the joint point (Since 1.0) + + + + +Since 1.0 + +enum cairo_operator_t +cairo_operator_t +cairo_operator_t is used to set the compositing operator for all cairo +drawing operations. +The default operator is CAIRO_OPERATOR_OVER. +The operators marked as unbounded modify their +destination even outside of the mask layer (that is, their effect is not +bound by the mask layer). However, their effect can still be limited by +way of clipping. +To keep things simple, the operator descriptions here +document the behavior for when both source and destination are either fully +transparent or fully opaque. The actual implementation works for +translucent layers too. +For a more detailed explanation of the effects of each operator, including +the mathematical definitions, see +http://cairographics.org/operators/. + +Members + + + + + + +CAIRO_OPERATOR_CLEAR +clear destination layer (bounded) (Since 1.0) + + + +CAIRO_OPERATOR_SOURCE +replace destination layer (bounded) (Since 1.0) + + + +CAIRO_OPERATOR_OVER +draw source layer on top of destination layer +(bounded) (Since 1.0) + + + +CAIRO_OPERATOR_IN +draw source where there was destination content +(unbounded) (Since 1.0) + + + +CAIRO_OPERATOR_OUT +draw source where there was no destination +content (unbounded) (Since 1.0) + + + +CAIRO_OPERATOR_ATOP +draw source on top of destination content and +only there (Since 1.0) + + + +CAIRO_OPERATOR_DEST +ignore the source (Since 1.0) + + + +CAIRO_OPERATOR_DEST_OVER +draw destination on top of source (Since 1.0) + + + +CAIRO_OPERATOR_DEST_IN +leave destination only where there was +source content (unbounded) (Since 1.0) + + + +CAIRO_OPERATOR_DEST_OUT +leave destination only where there was no +source content (Since 1.0) + + + +CAIRO_OPERATOR_DEST_ATOP +leave destination on top of source content +and only there (unbounded) (Since 1.0) + + + +CAIRO_OPERATOR_XOR +source and destination are shown where there is only +one of them (Since 1.0) + + + +CAIRO_OPERATOR_ADD +source and destination layers are accumulated (Since 1.0) + + + +CAIRO_OPERATOR_SATURATE +like over, but assuming source and dest are +disjoint geometries (Since 1.0) + + + +CAIRO_OPERATOR_MULTIPLY +source and destination layers are multiplied. +This causes the result to be at least as dark as the darker inputs. (Since 1.10) + + + +CAIRO_OPERATOR_SCREEN +source and destination are complemented and +multiplied. This causes the result to be at least as light as the lighter +inputs. (Since 1.10) + + + +CAIRO_OPERATOR_OVERLAY +multiplies or screens, depending on the +lightness of the destination color. (Since 1.10) + + + +CAIRO_OPERATOR_DARKEN +replaces the destination with the source if it +is darker, otherwise keeps the source. (Since 1.10) + + + +CAIRO_OPERATOR_LIGHTEN +replaces the destination with the source if it +is lighter, otherwise keeps the source. (Since 1.10) + + + +CAIRO_OPERATOR_COLOR_DODGE +brightens the destination color to reflect +the source color. (Since 1.10) + + + +CAIRO_OPERATOR_COLOR_BURN +darkens the destination color to reflect +the source color. (Since 1.10) + + + +CAIRO_OPERATOR_HARD_LIGHT +Multiplies or screens, dependent on source +color. (Since 1.10) + + + +CAIRO_OPERATOR_SOFT_LIGHT +Darkens or lightens, dependent on source +color. (Since 1.10) + + + +CAIRO_OPERATOR_DIFFERENCE +Takes the difference of the source and +destination color. (Since 1.10) + + + +CAIRO_OPERATOR_EXCLUSION +Produces an effect similar to difference, but +with lower contrast. (Since 1.10) + + + +CAIRO_OPERATOR_HSL_HUE +Creates a color with the hue of the source +and the saturation and luminosity of the target. (Since 1.10) + + + +CAIRO_OPERATOR_HSL_SATURATION +Creates a color with the saturation +of the source and the hue and luminosity of the target. Painting with +this mode onto a gray area produces no change. (Since 1.10) + + + +CAIRO_OPERATOR_HSL_COLOR +Creates a color with the hue and saturation +of the source and the luminosity of the target. This preserves the gray +levels of the target and is useful for coloring monochrome images or +tinting color images. (Since 1.10) + + + +CAIRO_OPERATOR_HSL_LUMINOSITY +Creates a color with the luminosity of +the source and the hue and saturation of the target. This produces an +inverse effect to CAIRO_OPERATOR_HSL_COLOR +. (Since 1.10) + + + + +Since 1.0 + +cairo_rectangle_t +cairo_rectangle_t +typedef struct { + double x, y, width, height; +} cairo_rectangle_t; + +A data structure for holding a rectangle. + +Members + + + + + + +double x; +X coordinate of the left side of the rectangle +X coordinate of the left side of the rectangle + + +double y; +Y coordinate of the the top side of the rectangle +Y coordinate of the the top side of the rectangle + + +double width; +width of the rectangle +width of the rectangle + + +double height; +height of the rectangle +height of the rectangle + + + + +Since 1.4 + +cairo_rectangle_list_t +cairo_rectangle_list_t +typedef struct { + cairo_status_t status; + cairo_rectangle_t *rectangles; + int num_rectangles; +} cairo_rectangle_list_t; + +A data structure for holding a dynamically allocated +array of rectangles. + +Members + + + + + + +cairo_status_t status; +Error status of the rectangle list +Error status of the rectangle list + + +cairo_rectangle_t *rectangles; +Array containing the rectangles +Array containing the rectangles + + +int num_rectangles; +Number of rectangles in this list +Number of rectangles in this list + + + + +Since 1.4 + + + +See Also +cairo_surface_t + + + + diff --git a/perf/COPYING b/perf/COPYING new file mode 100644 index 000000000..17754cf7b --- /dev/null +++ b/perf/COPYING @@ -0,0 +1,5 @@ +Cairo is free software. + +These tests are mainly available under a liberal MIT license to simplify +any use of the code for reference purposes. Please check the opening comment +of each file for copyright and licensing information. diff --git a/perf/Makefile.am b/perf/Makefile.am new file mode 100644 index 000000000..40b35bc38 --- /dev/null +++ b/perf/Makefile.am @@ -0,0 +1,154 @@ +include $(top_srcdir)/build/Makefile.am.common + +include $(top_srcdir)/perf/Makefile.sources + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/util/cairo-missing \ + -I$(top_srcdir)/util/cairo-script \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) + +AM_LDFLAGS = $(CAIRO_LDFLAGS) + +SUBDIRS = micro + +noinst_PROGRAMS = \ + cairo-analyse-trace \ + cairo-perf-trace \ + cairo-perf-micro \ + $(NULL) + +EXTRA_PROGRAMS += \ + cairo-analyse-trace \ + cairo-perf-micro \ + cairo-perf-trace \ + cairo-perf-diff-files \ + cairo-perf-print \ + cairo-perf-chart \ + cairo-perf-compare-backends \ + cairo-perf-graph-files \ + $(NULL) +EXTRA_DIST += cairo-perf-diff COPYING +EXTRA_LTLIBRARIES += libcairoperf.la + +LDADD = libcairoperf.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la + +cairo_perf_micro_SOURCES = $(cairo_perf_micro_sources) +cairo_perf_micro_LDADD = \ + $(top_builddir)/perf/micro/libcairo-perf-micro.la \ + $(LDADD) +cairo_perf_micro_DEPENDENCIES = \ + $(top_builddir)/perf/micro/libcairo-perf-micro.la \ + $(LDADD) + +libcairoperf_la_SOURCES = \ + $(libcairoperf_sources) \ + $(libcairoperf_external_sources) \ + $(libcairoperf_headers) \ + $(NULL) + +cairo_analyse_trace_SOURCES = \ + $(cairo_analyse_trace_sources) \ + $(cairo_analyse_trace_external_sources) +cairo_analyse_trace_LDADD = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) +cairo_analyse_trace_DEPENDENCIES = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) + +cairo_perf_trace_SOURCES = \ + $(cairo_perf_trace_sources) \ + $(cairo_perf_trace_external_sources) +cairo_perf_trace_LDADD = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) +cairo_perf_trace_DEPENDENCIES = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) + +cairo_perf_diff_files_SOURCES = $(cairo_perf_diff_files_sources) +cairo_perf_print_SOURCES = $(cairo_perf_print_sources) +cairo_perf_chart_SOURCES = $(cairo_perf_chart_sources) +cairo_perf_compare_backends_SOURCES = $(cairo_perf_compare_backends_sources) + +cairo_perf_graph_files_SOURCES = \ + $(cairo_perf_graph_files_sources) \ + $(cairo_perf_graph_files_headers) +cairo_perf_graph_files_CFLAGS = @gtk_CFLAGS@ +cairo_perf_graph_files_LDADD = @gtk_LIBS@ $(LDADD) + +# Install rules to rebuild the libraries and add explicit dependencies +$(top_builddir)/perf/micro/libcairo-perf-micro.la: + cd $(top_builddir)/perf/micro && $(MAKE) $(AM_MAKEFLAGS) libcairo-perf-micro.la + +$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la + +$(top_builddir)/src/libcairo.la: + cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la + +$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la + + +# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that +# one can limit tested targets both through CAIRO_TEST_TARGET env var +# and TARGETS make var on the command line. Same for the rest. +TARGETS = $(CAIRO_TEST_TARGET) +TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE) +FORMAT = $(CAIRO_TEST_TARGET_FORMAT) +ITERS = $(CAIRO_PERF_ITERATIONS) + +CAIRO_PERF_ENVIRONMENT = CAIRO_PERF_ITERATIONS="$(ITERS)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_FORMAT="$(FORMAT)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)" + +perf: cairo-perf-micro$(EXEEXT) cairo-perf-trace$(EXEEXT) + -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-micro$(EXEEXT) + -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-trace$(EXEEXT) + +html-local: index.html + +perf-tag.html : cairo-perf-micro${EXEEXT} + $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ `git describe --abbrev=0` HEAD +perf-commit.html : cairo-perf-micro${EXEEXT} + $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ HEAD + +# Summarise changes in index.html, with details in links +index.html: perf-tag.html perf-commit.html + echo "Performance ChangesAgainst "`git describe --abbrev=0`"
Latest commit" > $@ + +EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS) +VALGRIND_MEMCHECK_FLAGS = \ + --tool=memcheck \ + --suppressions=$(top_srcdir)/test/.valgrind-suppressions \ + --leak-check=yes --show-reachable=yes +VALGRIND_CALLGRIND_FLAGS = \ + --tool=callgrind +CLEANFILES += \ + valgrind-log \ + callgrind.out.* \ + index.html + +perf-valgrind: + $(MAKE) $(AM_MAKEFLAGS) perf \ + $(top_builddir)/libtool --mode=execute \ + valgrind $(VALGRIND_MEMCHECK_FLAGS) $(EXTRA_VALGRIND_FLAGS)' \ + | tee valgrind-log + +perf-callgrind: + $(MAKE) $(AM_MAKEFLAGS) perf \ + $(top_builddir)/libtool --mode=execute \ + valgrind $(VALGRIND_CALLGRIND_FLAGS) $(EXTRA_VALGRIND_FLAGS)' + +.PHONY: perf perf-valgrind perf-callgrind + +EXTRA_DIST += Makefile.win32 diff --git a/perf/Makefile.in b/perf/Makefile.in new file mode 100644 index 000000000..6ce44cc0f --- /dev/null +++ b/perf/Makefile.in @@ -0,0 +1,1531 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(top_srcdir)/perf/Makefile.sources $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/build/depcomp \ + $(top_srcdir)/build/test-driver COPYING README +EXTRA_PROGRAMS = cairo-analyse-trace$(EXEEXT) \ + cairo-perf-micro$(EXEEXT) cairo-perf-trace$(EXEEXT) \ + cairo-perf-diff-files$(EXEEXT) cairo-perf-print$(EXEEXT) \ + cairo-perf-chart$(EXEEXT) cairo-perf-compare-backends$(EXEEXT) \ + cairo-perf-graph-files$(EXEEXT) +TESTS = +check_PROGRAMS = +noinst_PROGRAMS = cairo-analyse-trace$(EXEEXT) \ + cairo-perf-trace$(EXEEXT) cairo-perf-micro$(EXEEXT) +subdir = perf +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +libcairoperf_la_LIBADD = +am__objects_1 = cairo-perf.lo cairo-perf-report.lo cairo-stats.lo +am__objects_2 = cairo-time.lo +am__objects_3 = +am_libcairoperf_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) +libcairoperf_la_OBJECTS = $(am_libcairoperf_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +PROGRAMS = $(noinst_PROGRAMS) +am__objects_4 = cairo-analyse-trace.$(OBJEXT) +am__objects_5 = cairo-error.$(OBJEXT) +am_cairo_analyse_trace_OBJECTS = $(am__objects_4) $(am__objects_5) +cairo_analyse_trace_OBJECTS = $(am_cairo_analyse_trace_OBJECTS) +am__objects_6 = cairo-perf-chart.$(OBJEXT) +am_cairo_perf_chart_OBJECTS = $(am__objects_6) +cairo_perf_chart_OBJECTS = $(am_cairo_perf_chart_OBJECTS) +cairo_perf_chart_LDADD = $(LDADD) +cairo_perf_chart_DEPENDENCIES = libcairoperf.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la +am__objects_7 = cairo-perf-compare-backends.$(OBJEXT) +am_cairo_perf_compare_backends_OBJECTS = $(am__objects_7) +cairo_perf_compare_backends_OBJECTS = \ + $(am_cairo_perf_compare_backends_OBJECTS) +cairo_perf_compare_backends_LDADD = $(LDADD) +cairo_perf_compare_backends_DEPENDENCIES = libcairoperf.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la +am__objects_8 = cairo-perf-diff-files.$(OBJEXT) +am_cairo_perf_diff_files_OBJECTS = $(am__objects_8) +cairo_perf_diff_files_OBJECTS = $(am_cairo_perf_diff_files_OBJECTS) +cairo_perf_diff_files_LDADD = $(LDADD) +cairo_perf_diff_files_DEPENDENCIES = libcairoperf.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la +am__objects_9 = \ + cairo_perf_graph_files-cairo-perf-graph-files.$(OBJEXT) \ + cairo_perf_graph_files-cairo-perf-graph-widget.$(OBJEXT) +am_cairo_perf_graph_files_OBJECTS = $(am__objects_9) $(am__objects_3) +cairo_perf_graph_files_OBJECTS = $(am_cairo_perf_graph_files_OBJECTS) +cairo_perf_graph_files_DEPENDENCIES = $(LDADD) +cairo_perf_graph_files_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__objects_10 = cairo-perf-micro.$(OBJEXT) +am_cairo_perf_micro_OBJECTS = $(am__objects_10) +cairo_perf_micro_OBJECTS = $(am_cairo_perf_micro_OBJECTS) +am__objects_11 = cairo-perf-print.$(OBJEXT) +am_cairo_perf_print_OBJECTS = $(am__objects_11) +cairo_perf_print_OBJECTS = $(am_cairo_perf_print_OBJECTS) +cairo_perf_print_LDADD = $(LDADD) +cairo_perf_print_DEPENDENCIES = libcairoperf.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la +am__objects_12 = cairo-perf-trace.$(OBJEXT) +am__objects_13 = cairo-error.$(OBJEXT) cairo-hash.$(OBJEXT) +am_cairo_perf_trace_OBJECTS = $(am__objects_12) $(am__objects_13) +cairo_perf_trace_OBJECTS = $(am_cairo_perf_trace_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libcairoperf_la_SOURCES) $(cairo_analyse_trace_SOURCES) \ + $(cairo_perf_chart_SOURCES) \ + $(cairo_perf_compare_backends_SOURCES) \ + $(cairo_perf_diff_files_SOURCES) \ + $(cairo_perf_graph_files_SOURCES) $(cairo_perf_micro_SOURCES) \ + $(cairo_perf_print_SOURCES) $(cairo_perf_trace_SOURCES) +DIST_SOURCES = $(libcairoperf_la_SOURCES) \ + $(cairo_analyse_trace_SOURCES) $(cairo_perf_chart_SOURCES) \ + $(cairo_perf_compare_backends_SOURCES) \ + $(cairo_perf_diff_files_SOURCES) \ + $(cairo_perf_graph_files_SOURCES) $(cairo_perf_micro_SOURCES) \ + $(cairo_perf_print_SOURCES) $(cairo_perf_trace_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + check recheck distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) valgrind-log callgrind.out.* index.html +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = cairo-perf-diff COPYING Makefile.win32 +EXTRA_LTLIBRARIES = libcairoperf.la +MAINTAINERCLEANFILES = Makefile.in +libcairoperf_sources = \ + cairo-perf.c \ + cairo-perf-report.c \ + cairo-stats.c \ + $(NULL) + +libcairoperf_external_sources = ../src/cairo-time.c +libcairoperf_headers = \ + cairo-perf.h \ + cairo-stats.h \ + $(NULL) + +cairo_analyse_trace_sources = cairo-analyse-trace.c +cairo_analyse_trace_external_sources = ../src/cairo-error.c +cairo_perf_trace_sources = cairo-perf-trace.c +cairo_perf_trace_external_sources = \ + ../src/cairo-error.c \ + ../src/cairo-hash.c \ + $(NULL) + +cairo_perf_micro_sources = cairo-perf-micro.c +cairo_perf_diff_files_sources = cairo-perf-diff-files.c +cairo_perf_print_sources = cairo-perf-print.c +cairo_perf_chart_sources = cairo-perf-chart.c +cairo_perf_compare_backends_sources = cairo-perf-compare-backends.c +cairo_perf_graph_files_sources = \ + cairo-perf-graph-files.c \ + cairo-perf-graph-widget.c \ + $(NULL) + +cairo_perf_graph_files_headers = cairo-perf-graph.h +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/util/cairo-missing \ + -I$(top_srcdir)/util/cairo-script \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) + +AM_LDFLAGS = $(CAIRO_LDFLAGS) +SUBDIRS = micro +LDADD = libcairoperf.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la + +cairo_perf_micro_SOURCES = $(cairo_perf_micro_sources) +cairo_perf_micro_LDADD = \ + $(top_builddir)/perf/micro/libcairo-perf-micro.la \ + $(LDADD) + +cairo_perf_micro_DEPENDENCIES = \ + $(top_builddir)/perf/micro/libcairo-perf-micro.la \ + $(LDADD) + +libcairoperf_la_SOURCES = \ + $(libcairoperf_sources) \ + $(libcairoperf_external_sources) \ + $(libcairoperf_headers) \ + $(NULL) + +cairo_analyse_trace_SOURCES = \ + $(cairo_analyse_trace_sources) \ + $(cairo_analyse_trace_external_sources) + +cairo_analyse_trace_LDADD = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) + +cairo_analyse_trace_DEPENDENCIES = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) + +cairo_perf_trace_SOURCES = \ + $(cairo_perf_trace_sources) \ + $(cairo_perf_trace_external_sources) + +cairo_perf_trace_LDADD = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) + +cairo_perf_trace_DEPENDENCIES = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(LDADD) + +cairo_perf_diff_files_SOURCES = $(cairo_perf_diff_files_sources) +cairo_perf_print_SOURCES = $(cairo_perf_print_sources) +cairo_perf_chart_SOURCES = $(cairo_perf_chart_sources) +cairo_perf_compare_backends_SOURCES = $(cairo_perf_compare_backends_sources) +cairo_perf_graph_files_SOURCES = \ + $(cairo_perf_graph_files_sources) \ + $(cairo_perf_graph_files_headers) + +cairo_perf_graph_files_CFLAGS = @gtk_CFLAGS@ +cairo_perf_graph_files_LDADD = @gtk_LIBS@ $(LDADD) + +# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that +# one can limit tested targets both through CAIRO_TEST_TARGET env var +# and TARGETS make var on the command line. Same for the rest. +TARGETS = $(CAIRO_TEST_TARGET) +TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE) +FORMAT = $(CAIRO_TEST_TARGET_FORMAT) +ITERS = $(CAIRO_PERF_ITERATIONS) +CAIRO_PERF_ENVIRONMENT = CAIRO_PERF_ITERATIONS="$(ITERS)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_FORMAT="$(FORMAT)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)" +EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS) +VALGRIND_MEMCHECK_FLAGS = \ + --tool=memcheck \ + --suppressions=$(top_srcdir)/test/.valgrind-suppressions \ + --leak-check=yes --show-reachable=yes + +VALGRIND_CALLGRIND_FLAGS = \ + --tool=callgrind + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(top_srcdir)/perf/Makefile.sources $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign perf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign perf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(top_srcdir)/perf/Makefile.sources: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +libcairoperf.la: $(libcairoperf_la_OBJECTS) $(libcairoperf_la_DEPENDENCIES) $(EXTRA_libcairoperf_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libcairoperf_la_OBJECTS) $(libcairoperf_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +cairo-analyse-trace$(EXEEXT): $(cairo_analyse_trace_OBJECTS) $(cairo_analyse_trace_DEPENDENCIES) $(EXTRA_cairo_analyse_trace_DEPENDENCIES) + @rm -f cairo-analyse-trace$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_analyse_trace_OBJECTS) $(cairo_analyse_trace_LDADD) $(LIBS) + +cairo-perf-chart$(EXEEXT): $(cairo_perf_chart_OBJECTS) $(cairo_perf_chart_DEPENDENCIES) $(EXTRA_cairo_perf_chart_DEPENDENCIES) + @rm -f cairo-perf-chart$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_perf_chart_OBJECTS) $(cairo_perf_chart_LDADD) $(LIBS) + +cairo-perf-compare-backends$(EXEEXT): $(cairo_perf_compare_backends_OBJECTS) $(cairo_perf_compare_backends_DEPENDENCIES) $(EXTRA_cairo_perf_compare_backends_DEPENDENCIES) + @rm -f cairo-perf-compare-backends$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_perf_compare_backends_OBJECTS) $(cairo_perf_compare_backends_LDADD) $(LIBS) + +cairo-perf-diff-files$(EXEEXT): $(cairo_perf_diff_files_OBJECTS) $(cairo_perf_diff_files_DEPENDENCIES) $(EXTRA_cairo_perf_diff_files_DEPENDENCIES) + @rm -f cairo-perf-diff-files$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_perf_diff_files_OBJECTS) $(cairo_perf_diff_files_LDADD) $(LIBS) + +cairo-perf-graph-files$(EXEEXT): $(cairo_perf_graph_files_OBJECTS) $(cairo_perf_graph_files_DEPENDENCIES) $(EXTRA_cairo_perf_graph_files_DEPENDENCIES) + @rm -f cairo-perf-graph-files$(EXEEXT) + $(AM_V_CCLD)$(cairo_perf_graph_files_LINK) $(cairo_perf_graph_files_OBJECTS) $(cairo_perf_graph_files_LDADD) $(LIBS) + +cairo-perf-micro$(EXEEXT): $(cairo_perf_micro_OBJECTS) $(cairo_perf_micro_DEPENDENCIES) $(EXTRA_cairo_perf_micro_DEPENDENCIES) + @rm -f cairo-perf-micro$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_perf_micro_OBJECTS) $(cairo_perf_micro_LDADD) $(LIBS) + +cairo-perf-print$(EXEEXT): $(cairo_perf_print_OBJECTS) $(cairo_perf_print_DEPENDENCIES) $(EXTRA_cairo_perf_print_DEPENDENCIES) + @rm -f cairo-perf-print$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_perf_print_OBJECTS) $(cairo_perf_print_LDADD) $(LIBS) + +cairo-perf-trace$(EXEEXT): $(cairo_perf_trace_OBJECTS) $(cairo_perf_trace_DEPENDENCIES) $(EXTRA_cairo_perf_trace_DEPENDENCIES) + @rm -f cairo-perf-trace$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(cairo_perf_trace_OBJECTS) $(cairo_perf_trace_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-analyse-trace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-error.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-hash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-chart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-compare-backends.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-diff-files.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-micro.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-print.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-report.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-trace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-stats.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-time.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +cairo-time.lo: ../src/cairo-time.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-time.lo -MD -MP -MF $(DEPDIR)/cairo-time.Tpo -c -o cairo-time.lo `test -f '../src/cairo-time.c' || echo '$(srcdir)/'`../src/cairo-time.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-time.Tpo $(DEPDIR)/cairo-time.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../src/cairo-time.c' object='cairo-time.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-time.lo `test -f '../src/cairo-time.c' || echo '$(srcdir)/'`../src/cairo-time.c + +cairo-error.o: ../src/cairo-error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-error.o -MD -MP -MF $(DEPDIR)/cairo-error.Tpo -c -o cairo-error.o `test -f '../src/cairo-error.c' || echo '$(srcdir)/'`../src/cairo-error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-error.Tpo $(DEPDIR)/cairo-error.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../src/cairo-error.c' object='cairo-error.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-error.o `test -f '../src/cairo-error.c' || echo '$(srcdir)/'`../src/cairo-error.c + +cairo-error.obj: ../src/cairo-error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-error.obj -MD -MP -MF $(DEPDIR)/cairo-error.Tpo -c -o cairo-error.obj `if test -f '../src/cairo-error.c'; then $(CYGPATH_W) '../src/cairo-error.c'; else $(CYGPATH_W) '$(srcdir)/../src/cairo-error.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-error.Tpo $(DEPDIR)/cairo-error.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../src/cairo-error.c' object='cairo-error.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-error.obj `if test -f '../src/cairo-error.c'; then $(CYGPATH_W) '../src/cairo-error.c'; else $(CYGPATH_W) '$(srcdir)/../src/cairo-error.c'; fi` + +cairo_perf_graph_files-cairo-perf-graph-files.o: cairo-perf-graph-files.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -MT cairo_perf_graph_files-cairo-perf-graph-files.o -MD -MP -MF $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Tpo -c -o cairo_perf_graph_files-cairo-perf-graph-files.o `test -f 'cairo-perf-graph-files.c' || echo '$(srcdir)/'`cairo-perf-graph-files.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Tpo $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-perf-graph-files.c' object='cairo_perf_graph_files-cairo-perf-graph-files.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -c -o cairo_perf_graph_files-cairo-perf-graph-files.o `test -f 'cairo-perf-graph-files.c' || echo '$(srcdir)/'`cairo-perf-graph-files.c + +cairo_perf_graph_files-cairo-perf-graph-files.obj: cairo-perf-graph-files.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -MT cairo_perf_graph_files-cairo-perf-graph-files.obj -MD -MP -MF $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Tpo -c -o cairo_perf_graph_files-cairo-perf-graph-files.obj `if test -f 'cairo-perf-graph-files.c'; then $(CYGPATH_W) 'cairo-perf-graph-files.c'; else $(CYGPATH_W) '$(srcdir)/cairo-perf-graph-files.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Tpo $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-files.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-perf-graph-files.c' object='cairo_perf_graph_files-cairo-perf-graph-files.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -c -o cairo_perf_graph_files-cairo-perf-graph-files.obj `if test -f 'cairo-perf-graph-files.c'; then $(CYGPATH_W) 'cairo-perf-graph-files.c'; else $(CYGPATH_W) '$(srcdir)/cairo-perf-graph-files.c'; fi` + +cairo_perf_graph_files-cairo-perf-graph-widget.o: cairo-perf-graph-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -MT cairo_perf_graph_files-cairo-perf-graph-widget.o -MD -MP -MF $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Tpo -c -o cairo_perf_graph_files-cairo-perf-graph-widget.o `test -f 'cairo-perf-graph-widget.c' || echo '$(srcdir)/'`cairo-perf-graph-widget.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Tpo $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-perf-graph-widget.c' object='cairo_perf_graph_files-cairo-perf-graph-widget.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -c -o cairo_perf_graph_files-cairo-perf-graph-widget.o `test -f 'cairo-perf-graph-widget.c' || echo '$(srcdir)/'`cairo-perf-graph-widget.c + +cairo_perf_graph_files-cairo-perf-graph-widget.obj: cairo-perf-graph-widget.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -MT cairo_perf_graph_files-cairo-perf-graph-widget.obj -MD -MP -MF $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Tpo -c -o cairo_perf_graph_files-cairo-perf-graph-widget.obj `if test -f 'cairo-perf-graph-widget.c'; then $(CYGPATH_W) 'cairo-perf-graph-widget.c'; else $(CYGPATH_W) '$(srcdir)/cairo-perf-graph-widget.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Tpo $(DEPDIR)/cairo_perf_graph_files-cairo-perf-graph-widget.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-perf-graph-widget.c' object='cairo_perf_graph_files-cairo-perf-graph-widget.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_perf_graph_files_CFLAGS) $(CFLAGS) -c -o cairo_perf_graph_files-cairo-perf-graph-widget.obj `if test -f 'cairo-perf-graph-widget.c'; then $(CYGPATH_W) 'cairo-perf-graph-widget.c'; else $(CYGPATH_W) '$(srcdir)/cairo-perf-graph-widget.c'; fi` + +cairo-hash.o: ../src/cairo-hash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-hash.o -MD -MP -MF $(DEPDIR)/cairo-hash.Tpo -c -o cairo-hash.o `test -f '../src/cairo-hash.c' || echo '$(srcdir)/'`../src/cairo-hash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-hash.Tpo $(DEPDIR)/cairo-hash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../src/cairo-hash.c' object='cairo-hash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-hash.o `test -f '../src/cairo-hash.c' || echo '$(srcdir)/'`../src/cairo-hash.c + +cairo-hash.obj: ../src/cairo-hash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-hash.obj -MD -MP -MF $(DEPDIR)/cairo-hash.Tpo -c -o cairo-hash.obj `if test -f '../src/cairo-hash.c'; then $(CYGPATH_W) '../src/cairo-hash.c'; else $(CYGPATH_W) '$(srcdir)/../src/cairo-hash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-hash.Tpo $(DEPDIR)/cairo-hash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../src/cairo-hash.c' object='cairo-hash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-hash.obj `if test -f '../src/cairo-hash.c'; then $(CYGPATH_W) '../src/cairo-hash.c'; else $(CYGPATH_W) '$(srcdir)/../src/cairo-hash.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(PROGRAMS) +installdirs: installdirs-recursive +installdirs-am: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: html-local + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-TESTS check-am clean clean-checkPROGRAMS clean-generic \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am html-local info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am recheck tags tags-am uninstall \ + uninstall-am + + +# Install rules to rebuild the libraries and add explicit dependencies +$(top_builddir)/perf/micro/libcairo-perf-micro.la: + cd $(top_builddir)/perf/micro && $(MAKE) $(AM_MAKEFLAGS) libcairo-perf-micro.la + +$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la + +$(top_builddir)/src/libcairo.la: + cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la + +$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la + +perf: cairo-perf-micro$(EXEEXT) cairo-perf-trace$(EXEEXT) + -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-micro$(EXEEXT) + -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-trace$(EXEEXT) + +html-local: index.html + +perf-tag.html : cairo-perf-micro${EXEEXT} + $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ `git describe --abbrev=0` HEAD +perf-commit.html : cairo-perf-micro${EXEEXT} + $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ HEAD + +# Summarise changes in index.html, with details in links +index.html: perf-tag.html perf-commit.html + echo "Performance ChangesAgainst "`git describe --abbrev=0`"
Latest commit" > $@ + +perf-valgrind: + $(MAKE) $(AM_MAKEFLAGS) perf \ + $(top_builddir)/libtool --mode=execute \ + valgrind $(VALGRIND_MEMCHECK_FLAGS) $(EXTRA_VALGRIND_FLAGS)' \ + | tee valgrind-log + +perf-callgrind: + $(MAKE) $(AM_MAKEFLAGS) perf \ + $(top_builddir)/libtool --mode=execute \ + valgrind $(VALGRIND_CALLGRIND_FLAGS) $(EXTRA_VALGRIND_FLAGS)' + +.PHONY: perf perf-valgrind perf-callgrind + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/perf/Makefile.sources b/perf/Makefile.sources new file mode 100644 index 000000000..1fcf14809 --- /dev/null +++ b/perf/Makefile.sources @@ -0,0 +1,38 @@ +libcairoperf_sources = \ + cairo-perf.c \ + cairo-perf-report.c \ + cairo-stats.c \ + $(NULL) + +libcairoperf_external_sources = ../src/cairo-time.c + +libcairoperf_headers = \ + cairo-perf.h \ + cairo-stats.h \ + $(NULL) + +cairo_analyse_trace_sources = cairo-analyse-trace.c +cairo_analyse_trace_external_sources = ../src/cairo-error.c + +cairo_perf_trace_sources = cairo-perf-trace.c +cairo_perf_trace_external_sources = \ + ../src/cairo-error.c \ + ../src/cairo-hash.c \ + $(NULL) + +cairo_perf_micro_sources = cairo-perf-micro.c + +cairo_perf_diff_files_sources = cairo-perf-diff-files.c + +cairo_perf_print_sources = cairo-perf-print.c + +cairo_perf_chart_sources = cairo-perf-chart.c + +cairo_perf_compare_backends_sources = cairo-perf-compare-backends.c + +cairo_perf_graph_files_sources = \ + cairo-perf-graph-files.c \ + cairo-perf-graph-widget.c \ + $(NULL) + +cairo_perf_graph_files_headers = cairo-perf-graph.h diff --git a/perf/Makefile.win32 b/perf/Makefile.win32 new file mode 100644 index 000000000..084abf00e --- /dev/null +++ b/perf/Makefile.win32 @@ -0,0 +1,78 @@ +top_srcdir = .. +include $(top_srcdir)/build/Makefile.win32.common +include $(top_srcdir)/perf/Makefile.sources + +CFLAGS += -I$(top_srcdir)/boilerplate -I$(top_srcdir)/util/cairo-script/ + +PERF_LIBS = \ + $(CFG)/libcairoperf.lib \ + $(top_builddir)/boilerplate/$(CFG)/boiler.lib \ + $(top_builddir)/src/$(CFG)/cairo-static.lib \ + $(NULL) + +PERF_EXES = \ + $(CFG)/cairo-perf-trace.exe \ + $(CFG)/cairo-perf-micro.exe \ + $(CFG)/cairo-perf-diff-files.exe \ + $(CFG)/cairo-perf-print.exe \ + $(CFG)/cairo-perf-chart.exe \ + $(CFG)/cairo-perf-compare-backends.exe \ + $(NULL) + +all: inform $(PERF_EXES) + +perf: inform $(CFG)/cairo-perf-micro.exe + ./$(CFG)/cairo-perf-micro.exe + + +libcairoperf_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairoperf_sources)) + +$(CFG)/libcairoperf.lib: $(libcairoperf_OBJECTS) + @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(libcairoperf_OBJECTS) + +cairo_perf_trace_OBJECTS = \ + $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_trace_sources)) \ + $(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib \ + $(NULL) + +cairo_perf_micro_OBJECTS = \ + $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_micro_sources)) \ + ./micro/$(CFG)/libcairo-perf-micro.lib \ + $(NULL) + +cairo_perf_diff_files_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_diff_files_sources)) +cairo_perf_print_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_print_sources)) +cairo_perf_chart_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_chart_sources)) +cairo_perf_compare_backends_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_compare_backends_sources)) + + +$(CFG)/cairo-perf-trace.exe: $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-micro.exe: $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-diff-files.exe: $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-print.exe: $(cairo_perf_print_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_print_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-chart.exe: $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-compare-backends.exe: $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + + +./micro/$(CFG)/libcairo-perf-micro.lib: + $(MAKE) -C micro -f Makefile.win32 + +$(top_builddir)/src/$(CFG)/cairo-static.lib: + $(MAKE) -C $(top_srcdir)/src -f Makefile.win32 + +$(top_builddir)/boilerplate/$(CFG)/boiler.lib: + $(MAKE) -C $(top_srcdir)/boilerplate -f Makefile.win32 + +$(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib: + $(MAKE) -C $(top_srcdir)/util/cairo-script -f Makefile.win32 diff --git a/perf/README b/perf/README new file mode 100644 index 000000000..9e402098a --- /dev/null +++ b/perf/README @@ -0,0 +1,239 @@ +This is cairo's micro-benchmark performance test suite. + +One of the simplest ways to run this performance suite is: + + make perf + +which will give a report of the speed of each individual test. See +more details on other options for running the suite below. + +A macro test suite (with full traces and more intensive benchmarks) is +also available; for this, see http://cgit.freedesktop.org/cairo-traces. +The macro-benchmarks are better measures of actual real-world +performance, and should be preferred over the micro-benchmarks (and over +make perf) for identifying performance regressions or improvements. If +you copy or symlink this repository at cairo/perf/cairo-traces, then +make perf will run those tests as well. + +Running the micro-benchmarks +---------------------------- +The micro-benchmark performance suite is composed of a series of +hand-written, short, synthetic tests that measure the speed of doing a +simple operation such as painting a surface or showing glyphs. These aim +to give very good feedback on whether a performance related patch is +successful without causing any performance degradations elsewhere. + +The micro-benchmarks are compiled into a single executable called +cairo-perf-micro, which is what "make perf" executes. Some +examples of running it: + + # Report on all tests with default number of iterations: + ./cairo-perf-micro + + # Report on 100 iterations of all gradient tests: + ./cairo-perf-micro -i 100 gradient + + # Generate raw results for 10 iterations into cairo.perf + ./cairo-perf-micro -r -i 10 > cairo.perf + # Append 10 more iterations of the paint test + ./cairo-perf-micro -r -i 10 paint >> cairo.perf + +Raw results aren't useful for reading directly, but are quite useful +when using cairo-perf-diff to compare separate runs (see more +below). The advantage of using the raw mode is that test runs can be +generated incrementally and appended to existing reports. + +Generating comparisons of separate runs +--------------------------------------- +It's often useful to generate a chart showing the comparison of two +separate runs of the cairo performance suite, (for example, after +applying a patch intended to improve cairo's performance). The +cairo-perf-diff script can be used to compare two report files +generated by cairo-perf. + +Again, by way of example: + + # Show performance changes from cairo-orig.perf to cairo-patched.perf + ./cairo-perf-diff cairo-orig.perf cairo-patched.perf + +This will work whether the data files were generate in raw mode (with +cairo-perf -r) or cooked, (cairo-perf without -r). + +Finally, in its most powerful mode, cairo-perf-diff accepts two git +revisions and will do all the work of checking each revision out, +building it, running cairo-perf for each revision, and finally +generating the report. Obviously, this mode only works if you are +using cairo within a git repository, (and not from a tar file). Using +this mode is as simple as passing the git revisions to be compared to +cairo-perf-diff: + + # Compare cairo 1.2.6 to cairo 1.4.0 + ./cairo-perf-diff 1.2.6 1.4.0 + + # Measure the impact of the latest commit + ./cairo-perf-diff HEAD~1 HEAD + +As a convenience, this common desire to measure a single commit is +supported by passing a single revision to cairo-perf-diff, in which +case it will compare it to the immediately preceding commit. So for +example: + + # Measure the impact of the latest commit + ./cairo-perf-diff HEAD + + # Measure the impact of an arbitrary commit by SHA-1 + ./cairo-perf-diff aa883123d2af90 + +Also, when passing git revisions to cairo-perf-diff like this, it will +automatically cache results and re-use them rather than re-running +cairo-perf over and over on the same versions. This means that if you +ask for a report that you've generated in the past, cairo-perf-diff +should return it immediately. + +Now, sometimes it is desirable to generate more iterations rather than +re-using cached results. In this case, the -f flag can be used to +force cairo-perf-diff to generate additional results in addition to +what has been cached: + + # Measure the impact of latest commit (force more measurement) + ./cairo-perf-diff -f + +And finally, the -f mode is most useful in conjunction with the -- +option to cairo-perf-diff which allows you to pass options to the +underlying cairo-perf runs. This allows you to restrict the additional +test runs to a limited subset of the tests. + +For example, a frequently used trick is to first generate a chart with +a very small number of iterations for all tests: + + ./cairo-perf-diff HEAD + +Then, if any of the results look suspicious, (say there's a slowdown +reported in the text tests, but you think the text test shouldn't be +affected), then you can force more iterations to be tested for only +those tests: + + ./cairo-perf-diff -f HEAD -- text + +Generating comparisons of different backends +-------------------------------------------- +An alternate question that is often asked is, "how does the speed of one +backend compare to another?". cairo-perf-compare-backends can read files +generated by cairo-perf and produces a comparison of the backends for every +test. + +Again, by way of example: + + # Show relative performance of the backends + ./cairo-perf-compare-backends cairo.perf + +This will work whether the data files were generate in raw mode (with +cairo-perf -r) or cooked, (cairo-perf without -r). + + +Creating a new performance test +------------------------------- +This is where we could use everybody's help. If you have encountered a +sequence of cairo operations that are slower than you would like, then +please provide a performance test. Writing a test is very simple, it +requires you to write only a small C file with a couple of functions, +one of which exercises the cairo calls of interest. + +Here is the basic structure of a performance test file: + + /* Copyright © 2006 Kind Cairo User + * + * ... Licensing information here ... + * Please copy the MIT blurb as in other tests + */ + + #include "cairo-perf.h" + + static cairo_time_t + do_my_new_test (cairo_t *cr, int width, int height) + { + cairo_perf_timer_start (); + + /* Make the cairo calls to be measured */ + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); + } + + void + my_new_test (cairo_perf_t *perf, cairo_t *cr, int width, int height) + { + /* First do any setup for which the execution time should not + * be measured. For example, this might include loading + * images from disk, creating patterns, etc. */ + + /* Then launch the actual performance testing. */ + cairo_perf_run (perf, "my_new_test", do_my_new_test); + + /* Finally, perform any cleanup from the setup above. */ + } + +That's really all there is to writing a new test. The first function +above is the one that does the real work and returns a timing +number. The second function is the one that will be called by the +performance test rig (see below for how to accomplish that), and +allows for multiple performance cases to be written in one file, +(simply call cairo_perf_run once for each case, passing the +appropriate callback function to each). + +We go through this dance of indirectly calling your own function +through cairo_perf_run so that cairo_perf_run can call your function +many times and measure statistical properties over the many runs. + +Finally, to fully integrate your new test case you just need to add +your new test to three different lists. (TODO: We should set this up +better so that the lists are maintained automatically---computed from +the list of files in cairo/perf, for example). Here's what needs to be +added: + + 1. Makefile.am: Add the new file name to the cairo_perf_SOURCES list + + 2. cairo-perf.h: Add a new CAIRO_PERF_DECL line with the name of your + function, (my_new_test in the example above) + + 3. cairo-perf-micro.c: Add a new row to the list at the end of the + file. A typical entry would look like: + + { my_new_test, 16, 64 } + + The last two numbers are a minimum and a maximum image size at + which your test should be exercised. If these values are the same, + then only that size will be used. If they are different, then + intermediate sizes will be used by doubling. So in the example + above, three tests would be performed at sizes of 16x16, 32x32 and + 64x64. + + +How to run cairo-perf-diff on WINDOWS +------------------------------------- +This section explains the specifics of running cairo-perf-diff under +win32 plateforms. It assumes that you have installed a UNIX-like shell +environment such as MSYS (distributed as part of MinGW). + + 1. From your Mingw32 window, be sure to have all of your MSVC environ- + ment variables set up for proper compilation using 'make' + + 2. Add the %GitBaseDir%/Git/bin path to your environment, replacing the + %GitBaseDir% by whatever directory your Git version is installed to. + + 3. Comment out the "UNSET CDPATH" line in the git-sh-setup script + (located inside the ...Git/bin directory) by putting a "#" at the + beginning of the line. + +you should be ready to go ! + +From your mingw32 window, go to your cairo/perf directory and run the +cairo-perf-diff script with the right arguments. + +Thanks for your contributions and have fun with cairo! + +TODO +---- +Add a control language for crafting and running small sets of micro +benchmarks. diff --git a/perf/cairo-analyse-trace.c b/perf/cairo-analyse-trace.c new file mode 100644 index 000000000..994148660 --- /dev/null +++ b/perf/cairo-analyse-trace.c @@ -0,0 +1,592 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2006 Mozilla Corporation + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * Copyright © 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Vladimir Vukicevic + * Carl Worth + * Chris Wilson + */ + +#define _GNU_SOURCE 1 /* for sched_getaffinity() and getline() */ + +#include "../cairo-version.h" /* for the real version */ + +#include "cairo-perf.h" +#include "cairo-stats.h" + +#include "cairo-boilerplate-getopt.h" +#include +#include "cairo-missing.h" + +/* rudely reuse bits of the library... */ +#include "../src/cairo-error-private.h" + +/* For basename */ +#ifdef HAVE_LIBGEN_H +#include +#endif +#include /* isspace() */ + +#include +#include + +#ifdef _MSC_VER +#include "dirent-win32.h" + +static char * +basename_no_ext (char *path) +{ + static char name[_MAX_FNAME + 1]; + + _splitpath (path, NULL, NULL, name, NULL); + + name[_MAX_FNAME] = '\0'; + + return name; +} + + +#else +#include + +static char * +basename_no_ext (char *path) +{ + char *dot, *name; + + name = basename (path); + + dot = strchr (name, '.'); + if (dot) + *dot = '\0'; + + return name; +} + +#endif + +#if HAVE_UNISTD_H +#include +#endif + +#include + +#if HAVE_FCFINI +#include +#endif + +struct trace { + const cairo_boilerplate_target_t *target; + void *closure; + cairo_surface_t *surface; +}; + +cairo_bool_t +cairo_perf_can_run (cairo_perf_t *perf, + const char *name, + cairo_bool_t *is_explicit) +{ + unsigned int i; + char *copy, *dot; + cairo_bool_t ret; + + if (is_explicit) + *is_explicit = FALSE; + + if (perf->exact_names) { + if (is_explicit) + *is_explicit = TRUE; + return TRUE; + } + + if (perf->num_names == 0 && perf->num_exclude_names == 0) + return TRUE; + + copy = xstrdup (name); + dot = strchr (copy, '.'); + if (dot != NULL) + *dot = '\0'; + + if (perf->num_names) { + ret = TRUE; + for (i = 0; i < perf->num_names; i++) + if (strstr (copy, perf->names[i])) { + if (is_explicit) + *is_explicit = strcmp (copy, perf->names[i]) == 0; + goto check_exclude; + } + + ret = FALSE; + goto done; + } + +check_exclude: + if (perf->num_exclude_names) { + ret = FALSE; + for (i = 0; i < perf->num_exclude_names; i++) + if (strstr (copy, perf->exclude_names[i])) { + if (is_explicit) + *is_explicit = strcmp (copy, perf->exclude_names[i]) == 0; + goto done; + } + + ret = TRUE; + goto done; + } + +done: + free (copy); + + return ret; +} + +static cairo_surface_t * +surface_create (void *closure, + cairo_content_t content, + double width, + double height, + long uid) +{ + struct trace *args = closure; + return cairo_surface_create_similar (args->surface, content, width, height); +} + +static int user_interrupt; + +static void +interrupt (int sig) +{ + if (user_interrupt) { + signal (sig, SIG_DFL); + raise (sig); + } + + user_interrupt = 1; +} + +static void +describe (cairo_perf_t *perf, + void *closure) +{ + char *description = NULL; + + if (perf->has_described_backend) + return; + perf->has_described_backend = TRUE; + + if (perf->target->describe) + description = perf->target->describe (closure); + + if (description == NULL) + return; + + free (description); +} + +static void +execute (cairo_perf_t *perf, + struct trace *args, + const char *trace) +{ + char *trace_cpy, *name; + const cairo_script_interpreter_hooks_t hooks = { + .closure = args, + .surface_create = surface_create, + }; + + trace_cpy = xstrdup (trace); + name = basename_no_ext (trace_cpy); + + if (perf->list_only) { + printf ("%s\n", name); + free (trace_cpy); + return; + } + + describe (perf, args->closure); + + { + cairo_script_interpreter_t *csi; + cairo_status_t status; + unsigned int line_no; + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + + cairo_script_interpreter_run (csi, trace); + + cairo_script_interpreter_finish (csi); + + line_no = cairo_script_interpreter_get_line_number (csi); + status = cairo_script_interpreter_destroy (csi); + if (status) { + /* XXXX cairo_status_to_string is just wrong! */ + fprintf (stderr, "Error during replay, line %d: %s\n", + line_no, cairo_status_to_string (status)); + } + } + user_interrupt = 0; + + free (trace_cpy); +} + +static void +usage (const char *argv0) +{ + fprintf (stderr, +"Usage: %s [-l] [-i iterations] [-x exclude-file] [test-names ... | traces ...]\n" +"\n" +"Run the cairo trace analysis suite over the given tests (all by default)\n" +"The command-line arguments are interpreted as follows:\n" +"\n" +" -i iterations; specify the number of iterations per test case\n" +" -l list only; just list selected test case names without executing\n" +" -x exclude; specify a file to read a list of traces to exclude\n" +"\n" +"If test names are given they are used as sub-string matches so a command\n" +"such as \"%s firefox\" can be used to run all firefox traces.\n" +"Alternatively, you can specify a list of filenames to execute.\n", + argv0, argv0); +} + +static cairo_bool_t +read_excludes (cairo_perf_t *perf, + const char *filename) +{ + FILE *file; + char *line = NULL; + size_t line_size = 0; + char *s, *t; + + file = fopen (filename, "r"); + if (file == NULL) + return FALSE; + + while (getline (&line, &line_size, file) != -1) { + /* terminate the line at a comment marker '#' */ + s = strchr (line, '#'); + if (s) + *s = '\0'; + + /* whitespace delimits */ + s = line; + while (*s != '\0' && isspace (*s)) + s++; + + t = s; + while (*t != '\0' && ! isspace (*t)) + t++; + + if (s != t) { + int i = perf->num_exclude_names; + perf->exclude_names = xrealloc (perf->exclude_names, + sizeof (char *) * (i+1)); + perf->exclude_names[i] = strndup (s, t-s); + perf->num_exclude_names++; + } + } + free (line); + + fclose (file); + + return TRUE; +} + +static void +parse_options (cairo_perf_t *perf, + int argc, + char *argv[]) +{ + char *end; + int c; + + perf->list_only = FALSE; + perf->names = NULL; + perf->num_names = 0; + perf->exclude_names = NULL; + perf->num_exclude_names = 0; + + while (1) { + c = _cairo_getopt (argc, argv, "i:lx:"); + if (c == -1) + break; + + switch (c) { + case 'i': + perf->exact_iterations = TRUE; + perf->iterations = strtoul (optarg, &end, 10); + if (*end != '\0') { + fprintf (stderr, "Invalid argument for -i (not an integer): %s\n", + optarg); + exit (1); + } + break; + case 'l': + perf->list_only = TRUE; + break; + case 'x': + if (! read_excludes (perf, optarg)) { + fprintf (stderr, "Invalid argument for -x (not readable file): %s\n", + optarg); + exit (1); + } + break; + default: + fprintf (stderr, "Internal error: unhandled option: %c\n", c); + /* fall-through */ + case '?': + usage (argv[0]); + exit (1); + } + } + + if (optind < argc) { + perf->names = &argv[optind]; + perf->num_names = argc - optind; + } +} + +static void +cairo_perf_fini (cairo_perf_t *perf) +{ + cairo_boilerplate_free_targets (perf->targets); + cairo_boilerplate_fini (); + + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif +} + +static cairo_bool_t +have_trace_filenames (cairo_perf_t *perf) +{ + unsigned int i; + + if (perf->num_names == 0) + return FALSE; + +#if HAVE_UNISTD_H + for (i = 0; i < perf->num_names; i++) + if (access (perf->names[i], R_OK) == 0) + return TRUE; +#endif + + return FALSE; +} + +static cairo_status_t +print (void *closure, const unsigned char *data, unsigned int length) +{ + fwrite (data, length, 1, closure); + return CAIRO_STATUS_SUCCESS; +} + +static void +cairo_perf_trace (cairo_perf_t *perf, + const cairo_boilerplate_target_t *target, + const char *trace) +{ + struct trace args; + cairo_surface_t *real; + + args.target = target; + real = target->create_surface (NULL, + CAIRO_CONTENT_COLOR_ALPHA, + 1, 1, + 1, 1, + CAIRO_BOILERPLATE_MODE_PERF, + &args.closure); + args.surface = + cairo_surface_create_observer (real, + CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS); + cairo_surface_destroy (real); + if (cairo_surface_status (args.surface)) { + fprintf (stderr, + "Error: Failed to create target surface: %s\n", + target->name); + return; + } + + printf ("Observing '%s'...", trace); + fflush (stdout); + + execute (perf, &args, trace); + + printf ("\n"); + cairo_device_observer_print (cairo_surface_get_device (args.surface), + print, stdout); + fflush (stdout); + + cairo_surface_destroy (args.surface); + + if (target->cleanup) + target->cleanup (args.closure); +} + +static void +warn_no_traces (const char *message, + const char *trace_dir) +{ + fprintf (stderr, +"Error: %s '%s'.\n" +"Have you cloned the cairo-traces repository and uncompressed the traces?\n" +" git clone git://anongit.freedesktop.org/cairo-traces\n" +" cd cairo-traces && make\n" +"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n", + message, trace_dir); +} + +static int +cairo_perf_trace_dir (cairo_perf_t *perf, + const cairo_boilerplate_target_t *target, + const char *dirname) +{ + DIR *dir; + struct dirent *de; + int num_traces = 0; + cairo_bool_t force; + cairo_bool_t is_explicit; + + dir = opendir (dirname); + if (dir == NULL) + return 0; + + force = FALSE; + if (cairo_perf_can_run (perf, dirname, &is_explicit)) + force = is_explicit; + + while ((de = readdir (dir)) != NULL) { + char *trace; + struct stat st; + + if (de->d_name[0] == '.') + continue; + + xasprintf (&trace, "%s/%s", dirname, de->d_name); + if (stat (trace, &st) != 0) + goto next; + + if (S_ISDIR(st.st_mode)) { + num_traces += cairo_perf_trace_dir (perf, target, trace); + } else { + const char *dot; + + dot = strrchr (de->d_name, '.'); + if (dot == NULL) + goto next; + if (strcmp (dot, ".trace")) + goto next; + + num_traces++; + if (!force && ! cairo_perf_can_run (perf, de->d_name, NULL)) + goto next; + + cairo_perf_trace (perf, target, trace); + } +next: + free (trace); + + } + closedir (dir); + + return num_traces; +} + +int +main (int argc, + char *argv[]) +{ + cairo_perf_t perf; + const char *trace_dir = "cairo-traces:/usr/src/cairo-traces:/usr/share/cairo-traces"; + unsigned int n; + int i; + + parse_options (&perf, argc, argv); + + signal (SIGINT, interrupt); + + if (getenv ("CAIRO_TRACE_DIR") != NULL) + trace_dir = getenv ("CAIRO_TRACE_DIR"); + + perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL); + + /* do we have a list of filenames? */ + perf.exact_names = have_trace_filenames (&perf); + + for (i = 0; i < perf.num_targets; i++) { + const cairo_boilerplate_target_t *target = perf.targets[i]; + + if (! perf.list_only && ! target->is_measurable) + continue; + + perf.target = target; + perf.has_described_backend = FALSE; + + if (perf.exact_names) { + for (n = 0; n < perf.num_names; n++) { + struct stat st; + + if (stat (perf.names[n], &st) == 0) { + if (S_ISDIR (st.st_mode)) { + cairo_perf_trace_dir (&perf, target, perf.names[n]); + } else + cairo_perf_trace (&perf, target, perf.names[n]); + } + } + } else { + int num_traces = 0; + const char *dir; + + dir = trace_dir; + do { + char buf[1024]; + const char *end = strchr (dir, ':'); + if (end != NULL) { + memcpy (buf, dir, end-dir); + buf[end-dir] = '\0'; + end++; + + dir = buf; + } + + num_traces += cairo_perf_trace_dir (&perf, target, dir); + dir = end; + } while (dir != NULL); + + if (num_traces == 0) { + warn_no_traces ("Found no traces in", trace_dir); + return 1; + } + } + + if (perf.list_only) + break; + } + + cairo_perf_fini (&perf); + + return 0; +} diff --git a/perf/cairo-perf-chart.c b/perf/cairo-perf-chart.c new file mode 100644 index 000000000..738fe5c7b --- /dev/null +++ b/perf/cairo-perf-chart.c @@ -0,0 +1,1113 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + * Chris Wilson + */ + +#include "cairo-perf.h" + +#include +#include +#include +#include +#include +#include +#include + +struct chart { + cairo_perf_report_t *reports; + const char **names; + + cairo_t *cr; + int width, height; + int num_tests, num_reports; + double min_value, max_value; + double *average; + + cairo_bool_t use_html; + cairo_bool_t relative; +}; +struct color { + double red, green, blue; +}; + +#define FONT_SIZE 12 +#define PAD (4) + +static double +to_factor (double x) +{ +#if 1 + if (x > 1.) + return (x-1) * 100.; + else + return (1. - 1./x) * 100.; +#else + return log (x); +#endif +} + +static int +_double_cmp (const void *_a, + const void *_b) +{ + const double *a = _a; + const double *b = _b; + + if (*a > *b) + return 1; + if (*a < *b) + return -1; + return 0; +} + +static void +trim_outliers (double *values, + int num_values, + double *min, + double *max) +{ + double q1, q3, iqr; + double outlier_min, outlier_max; + int i; + + /* First, identify any outliers, using the definition of "mild + * outliers" from: + * + * http://en.wikipedia.org/wiki/Outliers + * + * Which is that outliers are any values less than Q1 - 1.5 * IQR + * or greater than Q3 + 1.5 * IQR where Q1 and Q3 are the first + * and third quartiles and IQR is the inter-quartile range (Q3 - + * Q1). + */ + qsort (values, num_values, + sizeof (double), _double_cmp); + + q1 = values[1*num_values / 6]; + q3 = values[5*num_values / 6]; + + iqr = q3 - q1; + + outlier_min = q1 - 3 * iqr; + outlier_max = q3 + 3 * iqr; + + i = 0; + while (i < num_values && values[i] < outlier_min) + i++; + if (i == num_values) + return; + + *min = values[i]; + + while (i < num_values && values[i] <= outlier_max) + i++; + + *max = values[i-1]; +} + +static void +find_ranges (struct chart *chart) +{ + test_report_t **tests, *min_test; + double *values; + int num_values, size_values; + double min = 0, max = 0; + double test_time; + int seen_non_null; + int num_tests = 0; + double slow_sum = 0, fast_sum = 0, sum; + int slow_count = 0, fast_count = 0; + int *count; + int i; + + num_values = 0; + size_values = 64; + values = xmalloc (size_values * sizeof (double)); + + chart->average = xmalloc(chart->num_reports * sizeof(double)); + count = xmalloc(chart->num_reports * sizeof(int)); + for (i = 0; i < chart->num_reports; i++) { + chart->average[i] = 0; + count[i] = 0; + } + + tests = xmalloc (chart->num_reports * sizeof (test_report_t *)); + for (i = 0; i < chart->num_reports; i++) + tests[i] = chart->reports[i].tests; + + while (1) { + /* We expect iterations values of 0 when multiple raw reports + * for the same test have been condensed into the stats of the + * first. So we just skip these later reports that have no + * stats. */ + seen_non_null = 0; + for (i = 0; i < chart->num_reports; i++) { + while (tests[i]->name && tests[i]->stats.iterations == 0) + tests[i]++; + if (tests[i]->name) + seen_non_null++; + } + if (! seen_non_null) + break; + + num_tests++; + + /* Find the minimum of all current tests, (we have to do this + * in case some reports don't have a particular test). */ + for (i = 0; i < chart->num_reports; i++) { + if (tests[i]->name) { + min_test = tests[i]; + break; + } + } + for (++i; i < chart->num_reports; i++) { + if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0) + min_test = tests[i]; + } + + test_time = 0; + for (i = 0; i < chart->num_reports; i++) { + double report_time = HUGE_VAL; + + while (tests[i]->name && + test_report_cmp_name (tests[i], min_test) == 0) + { + double time = tests[i]->stats.min_ticks; + if (time < report_time) { + time /= tests[i]->stats.ticks_per_ms; + if (time < report_time) + report_time = time; + } + tests[i]++; + } + + if (report_time != HUGE_VAL) { + if (test_time == 0) + test_time = report_time; + + chart->average[i] += report_time / test_time; + count[i]++; + + if (chart->relative) { + if (test_time != report_time) { + double v = to_factor (test_time / report_time); + if (num_values == size_values) { + size_values *= 2; + values = xrealloc (values, + size_values * sizeof (double)); + } + values[num_values++] = v; + if (v < min) + min = v; + if (v > max) + max = v; + if (v > 0) + fast_sum += v/100, fast_count++; + else + slow_sum += v/100, slow_count++; + sum += v/100; + printf ("%s %d: %f\n", min_test->name, num_values, v); + } + } else { + if (report_time < min) + min = report_time; + if (report_time > max) + max = report_time; + } + } + } + } + + for (i = 0; i < chart->num_reports; i++) { + if (count[i]) + chart->average[i] = count[i] / chart->average[i]; + else + chart->average[i] = 1.; + } + + if (chart->relative) + trim_outliers (values, num_values, &min, &max); + chart->min_value = min; + chart->max_value = max; + chart->num_tests = num_tests + !!chart->relative; + + free (values); + free (tests); + free (count); + + printf ("%d: slow[%d] average: %f, fast[%d] average: %f, %f\n", + num_values, slow_count, slow_sum / slow_count, fast_count, fast_sum / fast_count, sum / num_values); +} + +#define SET_COLOR(C, R, G, B) (C)->red = (R), (C)->green = (G), (C)->blue = (B) +static void +hsv_to_rgb (double h, + double s, + double v, + struct color *color) +{ + double m, n, f; + int i; + + while (h < 0) + h += 6.; + while (h > 6.) + h -= 6.; + + if (s < 0.) + s = 0.; + if (s > 1.) + s = 1.; + + if (v < 0.) + v = 0.; + if (v > 1.) + v = 1.; + + i = floor (h); + f = h - i; + if ((i & 1) == 0) + f = 1 - f; + + m = v * (1 - s); + n = v * (1 - s * f); + switch(i){ + default: + case 6: + case 0: SET_COLOR (color, v, n, m); break; + case 1: SET_COLOR (color, n, v, m); break; + case 2: SET_COLOR (color, m, v, n); break; + case 3: SET_COLOR (color, m, n, v); break; + case 4: SET_COLOR (color, n, m, v); break; + case 5: SET_COLOR (color, v, m, n); break; + } +} + +static void set_report_color (struct chart *chart, int report) +{ + struct color color; + + hsv_to_rgb (6. / chart->num_reports * report, .7, .7, &color); + cairo_set_source_rgb (chart->cr, color.red, color.green, color.blue); +} + +static void set_report_gradient (struct chart *chart, int report, + double x, double y, double w, double h) +{ + struct color color; + cairo_pattern_t *p; + + hsv_to_rgb (6. / chart->num_reports * report, .7, .7, &color); + + p = cairo_pattern_create_linear (x, 0, x+w, 0); + cairo_pattern_add_color_stop_rgba (p, 0.0, + color.red, color.green, color.blue, + .50); + cairo_pattern_add_color_stop_rgba (p, 0.5, + color.red, color.green, color.blue, + .50); + cairo_pattern_add_color_stop_rgba (p, 1.0, + color.red, color.green, color.blue, + 1.0); + cairo_set_source (chart->cr, p); + cairo_pattern_destroy (p); +} + +static void +test_background (struct chart *c, + int test) +{ + double dx, x; + + dx = c->width / (double) c->num_tests; + x = dx * test; + + if (test & 1) + cairo_set_source_rgba (c->cr, .2, .2, .2, .2); + else + cairo_set_source_rgba (c->cr, .8, .8, .8, .2); + + cairo_rectangle (c->cr, floor (x), 0, + floor (dx + x) - floor (x), c->height); + cairo_fill (c->cr); +} + +static void +add_chart (struct chart *c, + int test, + int report, + double value) +{ + double dx, dy, x; + + if (fabs (value) < 0.1) + return; + + if (c->relative) { + cairo_text_extents_t extents; + char buf[80]; + double y; + + dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value); + /* the first report is always skipped, as it is used as the baseline */ + dx = c->width / (double) (c->num_tests * c->num_reports); + x = dx * (c->num_reports * test + report - .5); + + cairo_rectangle (c->cr, + floor (x), c->height / 2., + floor (x + dx) - floor (x), + ceil (-dy*value - c->height/2.) + c->height/2.); + if (dx < 5) { + set_report_color (c, report); + cairo_fill (c->cr); + } else { + set_report_gradient (c, report, + floor (x), c->height / 2., + floor (x + dx) - floor (x), + ceil (-dy*value - c->height/2.) + c->height/2.); + + cairo_fill_preserve (c->cr); + cairo_save (c->cr); + cairo_clip_preserve (c->cr); + set_report_color (c, report); + cairo_stroke (c->cr); + cairo_restore (c->cr); + } + + /* Skip the label if the difference between the two is less than 0.1% */ + if (fabs (value) < 0.1) + return; + + cairo_save (c->cr); + cairo_set_font_size (c->cr, dx - 2); + + if (value < 0) { + sprintf (buf, "%.1f", -value/100 + 1); + } else { + sprintf (buf, "%.1f", value/100 + 1); + } + cairo_text_extents (c->cr, buf, &extents); + + /* will it be clipped? */ + y = -dy * value; + if (y < -c->height/2) { + y = -c->height/2; + } else if (y > c->height/2) { + y = c->height/2; + } + + if (y < 0) { + if (y > -extents.width - 6) + y -= extents.width + 6; + } else { + if (y < extents.width + 6) + y += extents.width + 6; + } + + cairo_translate (c->cr, + floor (x) + (floor (x + dx) - floor (x))/2, + floor (y) + c->height/2.); + cairo_rotate (c->cr, -M_PI/2); + if (y < 0) { + cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2); + } else { + cairo_move_to (c->cr, 2, -extents.y_bearing/2); + } + + cairo_set_source_rgb (c->cr, .95, .95, .95); + cairo_show_text (c->cr, buf); + cairo_restore (c->cr); + } else { + dy = (c->height - PAD) / c->max_value; + dx = c->width / (double) (c->num_tests * (c->num_reports+1)); + x = dx * ((c->num_reports+1) * test + report + .5); + + cairo_rectangle (c->cr, + floor (x), c->height, + floor (x + dx) - floor (x), + floor (c->height - dy*value) - c->height); + if (dx < 5) { + set_report_color (c, report); + cairo_fill (c->cr); + } else { + set_report_gradient (c, report, + floor (x), c->height, + floor (x + dx) - floor (x), + floor (c->height - dy*value) - c->height); + cairo_fill_preserve (c->cr); + cairo_save (c->cr); + cairo_clip_preserve (c->cr); + set_report_color (c, report); + cairo_stroke (c->cr); + cairo_restore (c->cr); + } + } +} + +static void +add_average (struct chart *c, + int test, + int report, + double value) +{ + double dx, dy, x; + cairo_text_extents_t extents; + char buf[80]; + double y; + + if (fabs (value) < 0.1) + return; + + dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value); + /* the first report is always skipped, as it is used as the baseline */ + dx = c->width / (double) (c->num_tests * c->num_reports); + x = dx * (c->num_reports * test + report - .5); + + cairo_rectangle (c->cr, + floor (x), c->height / 2., + floor (x + dx) - floor (x), + ceil (-dy*value - c->height/2.) + c->height/2.); + if (dx < 5) { + set_report_color (c, report); + cairo_fill (c->cr); + } else { + set_report_gradient (c, report, + floor (x), c->height / 2., + floor (x + dx) - floor (x), + ceil (-dy*value - c->height/2.) + c->height/2.); + + cairo_fill_preserve (c->cr); + cairo_save (c->cr); + cairo_clip_preserve (c->cr); + set_report_color (c, report); + cairo_stroke (c->cr); + cairo_restore (c->cr); + } + + /* Skip the label if the difference between the two is less than 0.1% */ + if (fabs (value) < 0.1) + return; + + cairo_save (c->cr); + cairo_set_font_size (c->cr, dx - 2); + + if (value < 0) { + sprintf (buf, "%.1f", -value/100 + 1); + } else { + sprintf (buf, "%.1f", value/100 + 1); + } + cairo_text_extents (c->cr, buf, &extents); + + /* will it be clipped? */ + y = -dy * value; + if (y < -c->height/2) { + y = -c->height/2; + } else if (y > c->height/2) { + y = c->height/2; + } + + if (y < 0) { + if (y > -extents.width - 6) + y -= extents.width + 6; + } else { + if (y < extents.width + 6) + y += extents.width + 6; + } + + cairo_translate (c->cr, + floor (x) + (floor (x + dx) - floor (x))/2, + floor (y) + c->height/2.); + cairo_rotate (c->cr, -M_PI/2); + if (y < 0) { + cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2); + } else { + cairo_move_to (c->cr, 2, -extents.y_bearing/2); + } + + cairo_set_source_rgb (c->cr, .95, .95, .95); + cairo_show_text (c->cr, buf); + cairo_restore (c->cr); +} + +static void +add_label (struct chart *c, + int test, + const char *label) +{ + cairo_text_extents_t extents; + double dx, x; + + cairo_save (c->cr); + dx = c->width / (double) c->num_tests; + if (dx / 2 - PAD < 4) + return; + cairo_set_font_size (c->cr, dx / 2 - PAD); + cairo_text_extents (c->cr, label, &extents); + + cairo_set_source_rgb (c->cr, .5, .5, .5); + + x = (test + .5) * dx; + cairo_save (c->cr); + cairo_translate (c->cr, x, c->height - PAD / 2); + cairo_rotate (c->cr, -M_PI/2); + cairo_move_to (c->cr, 0, -extents.y_bearing/2); + cairo_show_text (c->cr, label); + cairo_restore (c->cr); + + cairo_save (c->cr); + cairo_translate (c->cr, x, PAD / 2); + cairo_rotate (c->cr, -M_PI/2); + cairo_move_to (c->cr, -extents.width, -extents.y_bearing/2); + cairo_show_text (c->cr, label); + cairo_restore (c->cr); + + cairo_restore (c->cr); +} + +static void +add_base_line (struct chart *c) +{ + double y; + + cairo_save (c->cr); + cairo_set_line_width (c->cr, 2.); + if (c->relative) { + y = c->height / 2.; + } else { + y = c->height; + } + cairo_move_to (c->cr, 0, y); + cairo_line_to (c->cr, c->width, y); + cairo_set_source_rgb (c->cr, 1, 1, 1); + cairo_stroke (c->cr); + cairo_restore (c->cr); +} + +static void +add_absolute_lines (struct chart *c) +{ + const double dashes[] = { 2, 4 }; + const double vlog_steps[] = { 10, 5, 4, 3, 2, 1, .5, .4, .3, .2, .1}; + double v, y, dy; + unsigned int i; + char buf[80]; + cairo_text_extents_t extents; + + v = c->max_value / 2.; + + for (i = 0; i < sizeof (vlog_steps) / sizeof (vlog_steps[0]); i++) { + double vlog = log (v) / log (vlog_steps[i]); + if (vlog > 1) { + v = pow (vlog_steps[i], floor (vlog)); + goto done; + } + } + return; +done: + + dy = (c->height - PAD) / c->max_value; + + cairo_save (c->cr); + cairo_set_line_width (c->cr, 1.); + cairo_set_dash (c->cr, dashes, sizeof (dashes) / sizeof (dashes[0]), 0); + + i = 0; + do { + y = c->height - ++i * v * dy; + if (y < PAD) + break; + + cairo_set_font_size (c->cr, 8); + + sprintf (buf, "%.0fs", i*v/1000); + cairo_text_extents (c->cr, buf, &extents); + + cairo_set_source_rgba (c->cr, .75, 0, 0, .95); + cairo_move_to (c->cr, 1-extents.x_bearing, floor (y) - (extents.height/2 + extents.y_bearing) + .5); + cairo_show_text (c->cr, buf); + + cairo_move_to (c->cr, c->width-extents.width-1, floor (y) - (extents.height/2 + extents.y_bearing) + .5); + cairo_show_text (c->cr, buf); + + cairo_set_source_rgba (c->cr, .75, 0, 0, .5); + cairo_move_to (c->cr, + ceil (extents.width + extents.x_bearing + 2), + floor (y) + .5); + cairo_line_to (c->cr, + floor (c->width - (extents.width + extents.x_bearing + 2)), + floor (y) + .5); + cairo_stroke (c->cr); + } while (1); + + cairo_restore (c->cr); +} + +static void +add_relative_lines (struct chart *c) +{ + const double dashes[] = { 2, 4 }; + const double v_steps[] = { 10, 5, 1, .5, .1, .05, .01}; + const int precision_steps[] = { 0, 0, 0, 1, 1, 2, 2}; + int precision; + double v, y, dy, mid; + unsigned int i; + char buf[80]; + cairo_text_extents_t extents; + + v = MAX (-c->min_value, c->max_value) / 200; + + for (i = 0; i < sizeof (v_steps) / sizeof (v_steps[0]); i++) { + if (v > v_steps[i]) { + v = v_steps[i]; + precision = precision_steps[i]; + goto done; + } + } + return; +done: + + mid = c->height/2.; + dy = (mid - PAD) / MAX (-c->min_value, c->max_value); + + cairo_save (c->cr); + cairo_set_line_width (c->cr, 1.); + cairo_set_dash (c->cr, dashes, sizeof (dashes) / sizeof (dashes[0]), 0); + cairo_set_font_size (c->cr, 8); + + i = 0; + do { + y = ++i * v * dy * 100; + if (y > mid) + break; + + sprintf (buf, "%.*fx", precision, i*v + 1); + cairo_text_extents (c->cr, buf, &extents); + + cairo_set_source_rgba (c->cr, .75, 0, 0, .95); + cairo_move_to (c->cr, 1-extents.x_bearing, floor (mid + y) - (extents.height/2 + extents.y_bearing) + .5); + cairo_show_text (c->cr, buf); + + cairo_move_to (c->cr, c->width-extents.width-1, floor (mid + y) - (extents.height/2 + extents.y_bearing) + .5); + cairo_show_text (c->cr, buf); + + cairo_set_source_rgba (c->cr, 0, .75, 0, .95); + cairo_move_to (c->cr, 1-extents.x_bearing, ceil (mid - y) - (extents.height/2 + extents.y_bearing) + .5); + cairo_show_text (c->cr, buf); + + cairo_move_to (c->cr, c->width-extents.width-1, ceil (mid - y) - (extents.height/2 + extents.y_bearing) + .5); + cairo_show_text (c->cr, buf); + + /* trim the dashes to no obscure the labels */ + cairo_set_source_rgba (c->cr, .75, 0, 0, .5); + cairo_move_to (c->cr, + ceil (extents.width + extents.x_bearing + 2), + floor (mid + y) + .5); + cairo_line_to (c->cr, + floor (c->width - (extents.width + 2)), + floor (mid + y) + .5); + cairo_stroke (c->cr); + + cairo_set_source_rgba (c->cr, 0, .75, 0, .5); + cairo_move_to (c->cr, + ceil (extents.width + extents.x_bearing + 2), + ceil (mid - y) + .5); + cairo_line_to (c->cr, + floor (c->width - (extents.width + 2)), + ceil (mid - y) + .5); + cairo_stroke (c->cr); + + } while (1); + + cairo_restore (c->cr); +} + +static void +add_slower_faster_guide (struct chart *c) +{ + cairo_text_extents_t extents; + + cairo_save (c->cr); + + cairo_set_font_size (c->cr, FONT_SIZE); + + cairo_text_extents (c->cr, "FASTER", &extents); + cairo_set_source_rgba (c->cr, 0, .75, 0, .5); + cairo_move_to (c->cr, + c->width/4. - extents.width/2. + extents.x_bearing, + 1 - extents.y_bearing); + cairo_show_text (c->cr, "FASTER"); + cairo_move_to (c->cr, + 3*c->width/4. - extents.width/2. + extents.x_bearing, + 1 - extents.y_bearing); + cairo_show_text (c->cr, "FASTER"); + + cairo_text_extents (c->cr, "SLOWER", &extents); + cairo_set_source_rgba (c->cr, .75, 0, 0, .5); + cairo_move_to (c->cr, + c->width/4. - extents.width/2. + extents.x_bearing, + c->height - 1); + cairo_show_text (c->cr, "SLOWER"); + cairo_move_to (c->cr, + 3*c->width/4. - extents.width/2. + extents.x_bearing, + c->height - 1); + cairo_show_text (c->cr, "SLOWER"); + + cairo_restore (c->cr); +} + +static void +cairo_perf_reports_compare (struct chart *chart, + cairo_bool_t print) +{ + test_report_t **tests, *min_test; + double test_time, best_time; + int num_test = 0; + int seen_non_null; + int i; + + tests = xmalloc (chart->num_reports * sizeof (test_report_t *)); + for (i = 0; i < chart->num_reports; i++) + tests[i] = chart->reports[i].tests; + + if (print) { + if (chart->use_html) { + printf ("\n"); + printf (""); + for (i = 0; i < chart->num_reports; i++) { + printf ("", chart->names[i] ? chart->names[i] : ""); + } + printf ("\n"); + } + } + + while (1) { + /* We expect iterations values of 0 when multiple raw reports + * for the same test have been condensed into the stats of the + * first. So we just skip these later reports that have no + * stats. */ + seen_non_null = 0; + for (i = 0; i < chart->num_reports; i++) { + while (tests[i]->name && tests[i]->stats.iterations == 0) + tests[i]++; + if (tests[i]->name) + seen_non_null++; + } + if (! seen_non_null) + break; + + /* Find the minimum of all current tests, (we have to do this + * in case some reports don't have a particular test). */ + for (i = 0; i < chart->num_reports; i++) { + if (tests[i]->name) { + min_test = tests[i]; + break; + } + } + for (++i; i < chart->num_reports; i++) { + if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0) + min_test = tests[i]; + } + + add_label (chart, num_test, min_test->name); + if (print) { + if (chart->use_html) { + printf ("", min_test->name); + } else { + if (min_test->size) { + printf ("%16s, size %4d:\n", + min_test->name, + min_test->size); + } else { + printf ("%26s:", + min_test->name); + } + } + } + + test_time = 0; + best_time = HUGE_VAL; + for (i = 0; i < chart->num_reports; i++) { + test_report_t *initial = tests[i]; + double report_time = HUGE_VAL; + + while (tests[i]->name && + test_report_cmp_name (tests[i], min_test) == 0) + { + double time = tests[i]->stats.min_ticks; + if (time < report_time) { + time /= tests[i]->stats.ticks_per_ms; + if (time < report_time) + report_time = time; + } + tests[i]++; + } + + if (test_time == 0 && report_time != HUGE_VAL) + test_time = report_time; + if (report_time < best_time) + best_time = report_time; + + tests[i] = initial; + } + + for (i = 0; i < chart->num_reports; i++) { + double report_time = HUGE_VAL; + + while (tests[i]->name && + test_report_cmp_name (tests[i], min_test) == 0) + { + double time = tests[i]->stats.min_ticks; + if (time > 0) { + time /= tests[i]->stats.ticks_per_ms; + if (time < report_time) + report_time = time; + } + tests[i]++; + } + + if (print) { + if (chart->use_html) { + if (report_time < HUGE_VAL) { + if (report_time / best_time < 1.01) { + printf ("", report_time/1000); + } else { + printf ("", report_time/1000); + } + } else { + printf (""); + } + } else { + if (report_time < HUGE_VAL) + printf (" %6.1f", report_time/1000); + else + printf (" ---"); + } + } + + if (report_time < HUGE_VAL) { + if (chart->relative) { + add_chart (chart, num_test, i, + to_factor (test_time / report_time)); + } else { + add_chart (chart, num_test, i, report_time); + } + } + } + + if (print) { + if (chart->use_html) { + printf ("\n"); + } else { + printf ("\n"); + } + } + + num_test++; + } + if (chart->relative) { + add_label (chart, num_test, "(geometric mean)"); + for (i = 0; i < chart->num_reports; i++) + add_average (chart, num_test, i, to_factor (chart->average[i])); + } + free (tests); + + if (print) { + if (chart->use_html) + printf ("
%s
%s%.1f%.1f
\n"); + + printf ("\n"); + for (i = 0; i < chart->num_reports; i++) { + if (chart->names[i]) { + printf ("[%s] %s\n", + chart->names[i], chart->reports[i].configuration); + } else { + printf ("[%d] %s\n", + i, chart->reports[i].configuration); + } + } + } +} + +static void +add_legend (struct chart *chart) +{ + cairo_text_extents_t extents; + const char *str; + int i, x, y; + + cairo_set_font_size (chart->cr, FONT_SIZE); + + x = PAD; + y = chart->height + PAD; + for (i = chart->relative; i < chart->num_reports; i++) { + str = chart->names[i] ? + chart->names[i] : chart->reports[i].configuration; + + set_report_color (chart, i); + + cairo_rectangle (chart->cr, x, y + 6, 8, 8); + cairo_fill (chart->cr); + + cairo_set_source_rgb (chart->cr, 1, 1, 1); + cairo_move_to (chart->cr, x + 10, y + FONT_SIZE + PAD / 2.); + cairo_text_extents (chart->cr, str, &extents); + cairo_show_text (chart->cr, str); + + x += 10 + 2 * PAD + ceil (extents.width); + } + + if (chart->relative) { + char buf[80]; + + str = chart->names[0] ? + chart->names[0] : chart->reports[0].configuration; + + sprintf (buf, "(relative to %s)", str); + cairo_text_extents (chart->cr, buf, &extents); + + cairo_set_source_rgb (chart->cr, 1, 1, 1); + cairo_move_to (chart->cr, + chart->width - 1 - extents.width, + y + FONT_SIZE + PAD / 2.); + cairo_show_text (chart->cr, buf); + } +} + +static void +usage (void) +{ + printf("Usage:\n"); + printf(" cairo-perf-chart [OPTION...] ...\n"); + printf("\n"); + printf("Help Options:\n"); + printf(" --help, --?\tShow help options\n"); + printf("\n"); + printf("Application Options:\n"); + printf(" --html\tOutput an HTML table comparing the results\n"); + printf(" --height=\tSet the height of the output graph"\ + " (default 480)\n"); + printf(" --width=\tSet the width of the output graph"\ + " (default 640)\n"); + printf(" --name\tSet the name of graph series."\ + " This only sets the name for the\n\t\tfirst result file."\ + " The graph series is usually set using the\n\t\tfile name for"\ + " the results file.\n"); + printf("\n"); + printf("Example:\n"); + printf(" cairo-perf-chart --width=1024 --height=768 run1 run2 run3\n"); + return; +} + +int +main (int argc, + const char *argv[]) +{ + cairo_surface_t *surface; + struct chart chart; + test_report_t *t; + int i; + + chart.use_html = 0; + chart.width = 640; + chart.height = 480; + + chart.reports = xcalloc (argc-1, sizeof (cairo_perf_report_t)); + chart.names = xcalloc (argc-1, sizeof (cairo_perf_report_t)); + + chart.num_reports = 0; + for (i = 1; i < argc; i++) { + if (strcmp (argv[i], "--html") == 0) { + chart.use_html = 1; + } else if (strncmp (argv[i], "--width=", 8) == 0) { + chart.width = atoi (argv[i] + 8); + } else if (strncmp (argv[i], "--height=", 9) == 0) { + chart.height = atoi (argv[i] + 9); + } else if (strcmp (argv[i], "--name") == 0) { + if (i + 1 < argc) + chart.names[chart.num_reports] = argv[++i]; + } else if (strncmp (argv[i], "--name=", 7) == 0) { + chart.names[chart.num_reports] = argv[i] + 7; + } else if ((strcmp (argv[i], "--help") == 0) || + (strcmp (argv[i], "--?") == 0)) { + usage(); + return 0; + } else { + cairo_perf_report_load (&chart.reports[chart.num_reports++], + argv[i], i, + test_report_cmp_name); + } + } + + for (chart.relative = 0; chart.relative <= 1; chart.relative++) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + chart.width, + chart.height + (FONT_SIZE + PAD) + 2*PAD); + chart.cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (chart.cr, 0, 0, 0); + cairo_paint (chart.cr); + + find_ranges (&chart); + + for (i = 0; i < chart.num_tests; i++) + test_background (&chart, i); + if (chart.relative) { + add_relative_lines (&chart); + add_slower_faster_guide (&chart); + } else + add_absolute_lines (&chart); + + cairo_save (chart.cr); + cairo_rectangle (chart.cr, 0, 0, chart.width, chart.height); + cairo_clip (chart.cr); + cairo_perf_reports_compare (&chart, !chart.relative); + cairo_restore (chart.cr); + + add_base_line (&chart); + add_legend (&chart); + + cairo_surface_write_to_png (cairo_get_target (chart.cr), + chart.relative ? "relative.png" : "absolute.png"); + cairo_destroy (chart.cr); + } + + /* Pointless memory cleanup, (would be a great place for talloc) */ + for (i = 0; i < chart.num_reports; i++) { + for (t = chart.reports[i].tests; t->name; t++) { + free (t->samples); + free (t->backend); + free (t->name); + } + free (chart.reports[i].tests); + free (chart.reports[i].configuration); + } + free (chart.names); + free (chart.reports); + + return 0; +} diff --git a/perf/cairo-perf-compare-backends.c b/perf/cairo-perf-compare-backends.c new file mode 100644 index 000000000..ff7359e1a --- /dev/null +++ b/perf/cairo-perf-compare-backends.c @@ -0,0 +1,398 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + * Chris Wilson + */ + +#include "cairo-perf.h" + +#include +#include +#include +#include +#include +#include +#include + +typedef struct _cairo_perf_report_options { + double min_change; + int use_utf; + int print_change_bars; +} cairo_perf_report_options_t; + +typedef struct _cairo_perf_diff_files_args { + const char **filenames; + int num_filenames; + cairo_perf_report_options_t options; +} cairo_perf_diff_files_args_t; + +static int +test_diff_cmp (const void *a, + const void *b) +{ + const test_diff_t *a_diff = a; + const test_diff_t *b_diff = b; + + /* Reverse sort by magnitude of change so larger changes come + * first */ + if (a_diff->change > b_diff->change) + return -1; + + if (a_diff->change < b_diff->change) + return 1; + + return 0; +} + +#define CHANGE_BAR_WIDTH 70 +static void +print_change_bar (double change, + double max_change, + int use_utf) +{ + int units_per_cell = ceil (max_change / CHANGE_BAR_WIDTH); + static char const *ascii_boxes[8] = { + "****","***" ,"***", "**", + "**", "*", "*", "" + }; + static char const *utf_boxes[8] = { + "â–ˆ", "â–‰", "â–Š", "â–‹", + "â–Œ", "â–", "â–Ž", "â–" + }; + char const **boxes = use_utf ? utf_boxes : ascii_boxes; + + /* For a 1.0x speedup we want a zero-size bar to show "no + * change". */ + change -= 1.0; + + while (change > units_per_cell) { + printf ("%s", boxes[0]); + change -= units_per_cell; + } + + change /= units_per_cell; + + if (change > 7.5/8.0) + printf ("%s", boxes[0]); + else if (change > 6.5/8.0) + printf ("%s", boxes[1]); + else if (change > 5.5/8.0) + printf ("%s", boxes[2]); + else if (change > 4.5/8.0) + printf ("%s", boxes[3]); + else if (change > 3.5/8.0) + printf ("%s", boxes[4]); + else if (change > 2.5/8.0) + printf ("%s", boxes[5]); + else if (change > 1.5/8.0) + printf ("%s", boxes[6]); + else if (change > 0.5/8.0) + printf ("%s", boxes[7]); +} + +static void +test_diff_print (test_diff_t *diff, + double max_change, + cairo_perf_report_options_t *options) +{ + int i; + double test_time; + double change; + + if (diff->tests[0]->size != 0) { + printf ("(%s, size: %d)\n", + diff->tests[0]->name, + diff->tests[0]->size); + } else { + printf ("(%s)\n", diff->tests[0]->name); + } + + for (i = 0; i < diff->num_tests; i++) { + test_time = diff->tests[i]->stats.min_ticks; + test_time /= diff->tests[i]->stats.ticks_per_ms; + change = diff->max / test_time; + printf ("%8s-%s-%s\t%6.2f: %5.2fx ", + diff->tests[i]->backend, + diff->tests[i]->content, + diff->tests[i]->configuration, + diff->tests[i]->stats.min_ticks / diff->tests[i]->stats.ticks_per_ms, + change); + + if (options->print_change_bars) + print_change_bar (change, max_change, options->use_utf); + printf ("\n"); + } + + printf("\n"); +} + +static void +cairo_perf_reports_compare (cairo_perf_report_t *reports, + int num_reports, + cairo_perf_report_options_t *options) +{ + int i; + test_report_t **tests, *min_test; + test_diff_t *diff, *diffs; + int num_diffs, max_diffs; + double max_change; + double test_time; + int seen_non_null; + + tests = xmalloc (num_reports * sizeof (test_report_t *)); + + max_diffs = reports[0].tests_count; + for (i = 0; i < num_reports; i++) { + tests[i] = reports[i].tests; + if (reports[i].tests_count > max_diffs) + max_diffs = reports[i].tests_count; + } + + diff = diffs = xmalloc (max_diffs * sizeof (test_diff_t)); + + num_diffs = 0; + while (1) { + int num_tests; + + /* We expect iterations values of 0 when multiple raw reports + * for the same test have been condensed into the stats of the + * first. So we just skip these later reports that have no + * stats. */ + seen_non_null = 0; + for (i = 0; i < num_reports; i++) { + while (tests[i]->name && tests[i]->stats.iterations == 0) + tests[i]++; + if (tests[i]->name) + seen_non_null++; + } + if (! seen_non_null) + break; + + /* Find the minimum of all current tests, (we have to do this + * in case some reports don't have a particular test). */ + for (i = 0; i < num_reports; i++) { + if (tests[i]->name) { + min_test = tests[i]; + break; + } + } + for (++i; i < num_reports; i++) { + if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0) + min_test = tests[i]; + } + + num_tests = 0; + for (i = 0; i < num_reports; i++) { + test_report_t *test; + int n = 0; + + test = tests[i]; + while (test[n].name && + test_report_cmp_name (&test[n], min_test) == 0) + { + n++; + } + + num_tests += n; + } + + /* For each report that has the current test, record it into + * the diff structure. */ + diff->num_tests = 0; + diff->tests = xmalloc (num_tests * sizeof (test_diff_t)); + for (i = 0; i < num_reports; i++) { + while (tests[i]->name && + test_report_cmp_name (tests[i], min_test) == 0) + { + test_time = tests[i]->stats.min_ticks; + if (test_time > 0) { + test_time /= tests[i]->stats.ticks_per_ms; + if (diff->num_tests == 0) { + diff->min = test_time; + diff->max = test_time; + } else { + if (test_time < diff->min) + diff->min = test_time; + if (test_time > diff->max) + diff->max = test_time; + } + diff->tests[diff->num_tests++] = tests[i]; + } + tests[i]++; + } + } + diff->change = diff->max / diff->min; + + diff++; + num_diffs++; + } + if (num_diffs == 0) + goto DONE; + + qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp); + + max_change = 1.0; + for (i = 0; i < num_diffs; i++) { + if (fabs (diffs[i].change) > max_change) + max_change = fabs (diffs[i].change); + } + + for (i = 0; i < num_diffs; i++) { + diff = &diffs[i]; + + /* Discard as uninteresting a change which is less than the + * minimum change required, (default may be overridden on + * command-line). */ + if (fabs (diff->change) - 1.0 < options->min_change) + continue; + + test_diff_print (diff, max_change, options); + } + + for (i = 0; i < num_diffs; i++) + free (diffs[i].tests); + DONE: + free (diffs); + free (tests); +} + +static void +usage (const char *argv0) +{ + char const *basename = strrchr(argv0, '/'); + basename = basename ? basename+1 : argv0; + fprintf (stderr, + "Usage: %s [options] file [...]\n\n", + basename); + fprintf (stderr, + "Computes significant performance differences for cairo performance reports.\n" + "Each file should be the output of the cairo-perf program (or \"make perf\").\n" + "The following options are available:\n" + "\n" + "--no-utf Use ascii stars instead of utf-8 change bars.\n" + " Four stars are printed per factor of speedup.\n" + "\n" + "--no-bars Don't display change bars at all.\n\n" + "\n" + "--use-ms Use milliseconds to calculate differences.\n" + " (instead of ticks which are hardware dependent)\n" + "\n" + "--min-change threshold[%%]\n" + " Suppress all changes below the given threshold.\n" + " The default threshold of 0.05 or 5%% ignores any\n" + " speedup or slowdown of 1.05 or less. A threshold\n" + " of 0 will cause all output to be reported.\n" + ); + exit(1); +} + +static void +parse_args (int argc, + char const **argv, + cairo_perf_diff_files_args_t *args) +{ + int i; + + for (i = 1; i < argc; i++) { + if (strcmp (argv[i], "--no-utf") == 0) { + args->options.use_utf = 0; + } + else if (strcmp (argv[i], "--no-bars") == 0) { + args->options.print_change_bars = 0; + } + else if (strcmp (argv[i], "--min-change") == 0) { + char *end = NULL; + i++; + if (i >= argc) + usage (argv[0]); + args->options.min_change = strtod (argv[i], &end); + if (*end) { + if (*end == '%') { + args->options.min_change /= 100; + } else { + usage (argv[0]); + } + } + } + else { + args->num_filenames++; + args->filenames = xrealloc (args->filenames, + args->num_filenames * sizeof (char *)); + args->filenames[args->num_filenames - 1] = argv[i]; + } + } +} + +int +main (int argc, + const char *argv[]) +{ + cairo_perf_diff_files_args_t args = { + NULL, /* filenames */ + 0, /* num_filenames */ + { + 0.05, /* min change */ + 1, /* use UTF-8? */ + 1, /* display change bars? */ + } + }; + cairo_perf_report_t *reports; + test_report_t *t; + int i; + + parse_args (argc, argv, &args); + + if (args.num_filenames) { + reports = xcalloc (args.num_filenames, sizeof (cairo_perf_report_t)); + for (i = 0; i < args.num_filenames; i++) { + cairo_perf_report_load (&reports[i], args.filenames[i], i, + test_report_cmp_name); + printf ("loaded: %s, %d tests\n", + args.filenames[i], reports[i].tests_count); + } + } else { + args.num_filenames = 1; + reports = xcalloc (args.num_filenames, sizeof (cairo_perf_report_t)); + cairo_perf_report_load (&reports[0], NULL, 0, test_report_cmp_name); + } + + cairo_perf_reports_compare (reports, args.num_filenames, &args.options); + + /* Pointless memory cleanup, (would be a great place for talloc) */ + free (args.filenames); + for (i = 0; i < args.num_filenames; i++) { + for (t = reports[i].tests; t->name; t++) { + free (t->samples); + free (t->backend); + free (t->name); + } + free (reports[i].tests); + free (reports[i].configuration); + } + free (reports); + + return 0; +} diff --git a/perf/cairo-perf-diff b/perf/cairo-perf-diff new file mode 100755 index 000000000..5a4b7b386 --- /dev/null +++ b/perf/cairo-perf-diff @@ -0,0 +1,255 @@ +#!/bin/sh +set -e + +usage() { + argv0=`basename $0` + + cat >&2 << END +Usage: +For comparing files created my cairo-perf: + + $argv0 old.perf new.perf + +For comparing (cached) performance of revisions: + + $argv0 [OPTIONS] [-- cairo-perf options] + $argv0 [OPTIONS] [-- cairo-perf-options] + +If given a single revision, compares its results to that of its +(first-parent) predecessor. Otherwise compares the two given revisions. +The revisions can be any revision accepted by git. For example: + + $argv0 HEAD # Show impact of latest commit + $argv0 1.2.0 1.2.4 # Compare performance of 1.2.0 to 1.2.4 + +Options: + +-f, --force + Forces cairo-perf-diff to re-run performance tests + even if cached performance data is available. + +-h, --html + With this option performance changes are summarized + as HTML table. + +-t, --trace + Compare performance using trace replays instead of + microbenchmarks. + +Additional options can be passed the child cairo-perf process +by separating them with a double hyphen (--). For example, to +examine what the impact of the latest change is on the stroke +test you might use: + + $argv0 HEAD -- stroke + +The performance results are cached in .perf next to the .git directory. + +Set CAIRO_AUTOGEN_OPTIONS to pass options to autogen for both +builds. +END + + exit 1 +} + +benchmark="cairo-perf-micro" + +# First, pull off any known options +while true; do + case $1 in + -f|--force) force_cairo_perf="true";; + -h|--html) html_output="$2"; shift ;; + -t|--trace) benchmark="cairo-perf-trace";; + *) break;; + esac + + shift +done + +# Then if anything is left that still looks like an option, (begins +# with a dash), give usage to catch --help or any other -garbage +if [ $# -eq 0 ] || [ "`echo "$1" | sed 's/^-//'`" != "$1" ]; then + usage +fi + +# Finally, pick up the actual revision arguments +if [ $# -eq 1 ] || [ "$2" = "--" ]; then + old="$1^" + new="$1" + shift 1 +else + old="$1" + new="$2" + shift 2 +fi + +# And post-finally, pass anything after -- on to cairo-perf +CAIRO_PERF_OPTIONS="-r -i 10" +if [ $# -gt 0 ]; then + if [ "$1" = "--" ]; then + shift 1 + CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@" + else + usage + fi +fi + +git_setup() { + SUBDIRECTORY_OK='Yes' + . "$(git --exec-path)/git-sh-setup" + CAIRO_DIR=`dirname $GIT_DIR` + if [ "$CAIRO_DIR" = "." ]; then + CAIRO_DIR=`pwd` + fi + CAIRO_PERF_DIR=$CAIRO_DIR/.perf +} + +rev2sha() { + rev=$1 + git rev-parse --verify $rev || ( echo "Cannot resolve $rev as a git object" && exit 1 ) +} + +cpu_count() { + test -f /proc/cpuinfo && + grep -c '^processor[[:blank:]]\+:' /proc/cpuinfo || + echo 1 +} + +# We cache performance output based on a two-part name capturing the +# current performance test suite and the library being tested. We +# capture these as the tree object of the perf directory in HEAD and +# the tree object of the src directory of the revision being tested. +# +# This way, whenever the performance suite is updated, cached output +# from old versions of the suite are automatically invalidated. Also, +# if a commit just changes things outside of the src tree, (say it +# changes the "test" test suite, or README or configure.in, or +# whatever), cairo-perf-diff will be smart enough to still use cached +# results from a run with an equivalent src tree. +rev2perf() { + rev=$1 + sha=`rev2sha $rev` + src_tree_sha=`rev2sha $rev:src` + perf_tree_sha=`rev2sha HEAD:perf` + script_tree_sha=`rev2sha HEAD:util/cairo-script` + echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf" +} +rev2perf_glob() { + rev=$1 + src_tree_sha=`rev2sha $rev:src` + perf_tree_sha=`rev2sha HEAD:perf` + script_tree_sha=`rev2sha HEAD:util/cairo-script` + echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf" +} + +build() { + build_dir=$1 + sha=$2 + + if [ ! -d $build_dir ]; then + git clone -s $CAIRO_DIR $build_dir + (cd $build_dir; git checkout -b tmp-cairo-perf-diff $sha) + fi + cd $build_dir + + git checkout tmp-cairo-perf-diff + git reset --hard $sha + + if [ -z "$MAKEFLAGS" ]; then + CPU_COUNT=`cpu_count` + export MAKEFLAGS="-j`expr $CPU_COUNT + 1`" + fi + + if [ ! -e Makefile ]; then + ./autogen.sh $CAIRO_AUTOGEN_OPTIONS + fi + + for file in $boilerplate_files; do + rsync $CAIRO_DIR/$file boilerplate + done + for file in $perf_files; do + rsync $CAIRO_DIR/$file perf + done + for file in $script_files; do + rsync $CAIRO_DIR/$file util/cairo-script + done + + make || (rm config.cache && make) + (cd boilerplate && make libcairoboilerplate.la) + + cd perf + make ${benchmark} +} + +# Usage: run_cairo_perf_if_not_cached +# The argument must be a valid git ref-spec that can +# be resolved to a commit. The suffix is just something +# unique so that build directories can be separated for +# multiple calls to this function. +run_cairo_perf_if_not_cached() { + rev=$1 + build_dir="build-$2" + + owd=`pwd` + sha=`rev2sha $rev` + perf=`rev2perf $rev` + glob=`rev2perf_glob $rev` + if [ -e $glob ] && [ "$force_cairo_perf" != "true" ]; then + return 0 + fi + if [ ! -d $CAIRO_PERF_DIR ]; then + echo "Creating new perf cache in $CAIRO_PERF_DIR" + mkdir $CAIRO_PERF_DIR + fi + + cd $CAIRO_DIR + boilerplate_files=`git ls-tree --name-only HEAD boilerplate/*` + perf_files=`git ls-tree --name-only HEAD perf/*` + script_files=`git ls-tree --name-only HEAD util/cairo-script/*` + cd $CAIRO_PERF_DIR + + build $build_dir $sha || { + rm -rf $build_dir + build $build_dir $sha || exit 1 + } + + echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:" + { ./$benchmark $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed"; } >> $perf + + cd $owd +} + +git_setup + +if [ -e ./cairo-perf-diff-files ]; then + bindir="." +else + bindir=$CAIRO_DIR/perf + + # Build cairo-perf-diff-files if not available + if [ ! -e $bindir/cairo-perf-diff-files ]; then + echo "Building cairo-perf-diff-files" + if [ "x$OS" = "xWindows_NT" ]; then + make -f Makefile.win32 -C $bindir cairo-perf-diff-files CFG=debug + else + make -C $bindir cairo-perf-diff-files + fi + fi +fi + +if [ ! -e $old ]; then + run_cairo_perf_if_not_cached $old old + old=`rev2perf $old` +fi + +if [ ! -e $new ]; then + run_cairo_perf_if_not_cached $new new + new=`rev2perf $new` +fi + +if [ -z "$html_output" ]; then + $bindir/cairo-perf-diff-files $old $new +else + $bindir/cairo-perf-diff-files $old $new | + $CAIRO_DIR/perf/make-html.py > $html_output +fi diff --git a/perf/cairo-perf-diff-files.c b/perf/cairo-perf-diff-files.c new file mode 100644 index 000000000..36b80cda4 --- /dev/null +++ b/perf/cairo-perf-diff-files.c @@ -0,0 +1,506 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + */ + +#include "cairo-perf.h" + +#include +#include +#include +#include +#include +#include +#include + +typedef struct _cairo_perf_report_options { + double min_change; + int use_utf; + int print_change_bars; + int use_ticks; +} cairo_perf_report_options_t; + +typedef struct _cairo_perf_diff_files_args { + const char **filenames; + int num_filenames; + cairo_perf_report_options_t options; +} cairo_perf_diff_files_args_t; + +static int +test_diff_cmp_speedup_before_slowdown (const void *a, + const void *b) +{ + const test_diff_t *a_diff = a; + const test_diff_t *b_diff = b; + + /* First make all speedups come before all slowdowns. */ + if (a_diff->change > 0 && b_diff->change < 0) + return -1; + if (a_diff->change < 0 && b_diff->change > 0) + return 1; + + if (a_diff->change == b_diff->change) + return 0; + + /* Large speedups come first. */ + if (a_diff->change > 0) { + if (a_diff->change > b_diff->change) + return -1; + else + return 1; + } + + /* Large slowdowns come last. */ + if (a_diff->change < 0) { + if (a_diff->change < b_diff->change) + return 1; + else + return -1; + } + + return 0; +} + +static int +test_diff_cmp (const void *a, + const void *b) +{ + const test_diff_t *a_diff = a; + const test_diff_t *b_diff = b; + + /* Reverse sort by magnitude of change so larger changes come + * first */ + if (a_diff->change > b_diff->change) + return -1; + + if (a_diff->change < b_diff->change) + return 1; + + return 0; +} + +#define CHANGE_BAR_WIDTH 70 +static void +print_change_bar (double change, + double max_change, + int use_utf) +{ + int units_per_cell = ceil (max_change / CHANGE_BAR_WIDTH); + static char const *ascii_boxes[8] = { + "****","***" ,"***", "**", + "**", "*", "*", "" + }; + static char const *utf_boxes[8] = { + "â–ˆ", "â–‰", "â–Š", "â–‹", + "â–Œ", "â–", "â–Ž", "â–" + }; + char const **boxes = use_utf ? utf_boxes : ascii_boxes; + + /* For a 1.0x speedup we want a zero-size bar to show "no + * change". */ + change -= 1.0; + + while (change > units_per_cell) { + printf ("%s", boxes[0]); + change -= units_per_cell; + } + + change /= units_per_cell; + + if (change > 7.5/8.0) + printf ("%s", boxes[0]); + else if (change > 6.5/8.0) + printf ("%s", boxes[1]); + else if (change > 5.5/8.0) + printf ("%s", boxes[2]); + else if (change > 4.5/8.0) + printf ("%s", boxes[3]); + else if (change > 3.5/8.0) + printf ("%s", boxes[4]); + else if (change > 2.5/8.0) + printf ("%s", boxes[5]); + else if (change > 1.5/8.0) + printf ("%s", boxes[6]); + else if (change > 0.5/8.0) + printf ("%s", boxes[7]); + + printf ("\n"); +} + +static void +test_diff_print_binary (test_diff_t *diff, + double max_change, + cairo_perf_report_options_t *options) +{ + if (diff->tests[0]->size) + printf ("%5s-%-4s %26s-%-3d", + diff->tests[0]->backend, diff->tests[0]->content, + diff->tests[0]->name, diff->tests[0]->size); + else + printf ("%5s %26s", diff->tests[0]->backend, diff->tests[0]->name); + + printf (" %6.2f (%.2f %4.2f%%) -> %6.2f (%.2f %4.2f%%): %5.2fx ", + diff->tests[0]->stats.min_ticks / diff->tests[0]->stats.ticks_per_ms, + diff->tests[0]->stats.median_ticks / diff->tests[0]->stats.ticks_per_ms, + diff->tests[0]->stats.std_dev * 100, + diff->tests[1]->stats.min_ticks / diff->tests[1]->stats.ticks_per_ms, + diff->tests[1]->stats.median_ticks / diff->tests[1]->stats.ticks_per_ms, + diff->tests[1]->stats.std_dev * 100, + fabs (diff->change)); + + if (diff->change > 1.0) + printf ("speedup\n"); + else + printf ("slowdown\n"); + + if (options->print_change_bars) + print_change_bar (fabs (diff->change), max_change, + options->use_utf); +} + +static void +test_diff_print_multi (test_diff_t *diff, + double max_change, + cairo_perf_report_options_t *options) +{ + int i; + double test_time; + double change; + + if (diff->tests[0]->size) { + printf ("%s (backend: %s-%s, size: %d)\n", + diff->tests[0]->name, + diff->tests[0]->backend, + diff->tests[0]->content, + diff->tests[0]->size); + } else { + printf ("%s (backend: %s)\n", + diff->tests[0]->name, + diff->tests[0]->backend); + } + + for (i = 0; i < diff->num_tests; i++) { + test_time = diff->tests[i]->stats.min_ticks; + if (! options->use_ticks) + test_time /= diff->tests[i]->stats.ticks_per_ms; + change = diff->max / test_time; + printf ("[%d] %6.2f: %5.2fx ", + diff->tests[i]->fileno, + diff->tests[i]->stats.min_ticks / diff->tests[i]->stats.ticks_per_ms, + change); + + if (options->print_change_bars) + print_change_bar (change, max_change, options->use_utf); + else + printf("\n"); + } + + printf("\n"); +} + +static void +cairo_perf_reports_compare (cairo_perf_report_t *reports, + int num_reports, + cairo_perf_report_options_t *options) +{ + int i; + test_report_t **tests, *min_test; + test_diff_t *diff, *diffs; + int num_diffs, max_diffs; + double max_change; + double test_time; + int seen_non_null; + cairo_bool_t printed_speedup = FALSE; + cairo_bool_t printed_slowdown = FALSE; + + assert (num_reports >= 2); + + tests = xmalloc (num_reports * sizeof (test_report_t *)); + + max_diffs = reports[0].tests_count; + for (i = 0; i < num_reports; i++) { + tests[i] = reports[i].tests; + if (reports[i].tests_count > max_diffs) + max_diffs = reports[i].tests_count; + } + + diff = diffs = xmalloc (max_diffs * sizeof (test_diff_t)); + + num_diffs = 0; + while (1) { + /* We expect iterations values of 0 when multiple raw reports + * for the same test have been condensed into the stats of the + * first. So we just skip these later reports that have no + * stats. */ + seen_non_null = 0; + for (i = 0; i < num_reports; i++) { + while (tests[i]->name && tests[i]->stats.iterations == 0) + tests[i]++; + if (tests[i]->name) + seen_non_null++; + } + + if (seen_non_null < 2) + break; + + /* Find the minimum of all current tests, (we have to do this + * in case some reports don't have a particular test). */ + for (i = 0; i < num_reports; i++) { + if (tests[i]->name) { + min_test = tests[i]; + break; + } + } + for (++i; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) < 0) + { + min_test = tests[i]; + } + } + + /* For each report that has the current test, record it into + * the diff structure. */ + diff->num_tests = 0; + diff->tests = xmalloc (num_reports * sizeof (test_diff_t)); + for (i = 0; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + test_time = tests[i]->stats.min_ticks; + if (! options->use_ticks) + test_time /= tests[i]->stats.ticks_per_ms; + if (diff->num_tests == 0) { + diff->min = test_time; + diff->max = test_time; + } else { + if (test_time < diff->min) + diff->min = test_time; + if (test_time > diff->max) + diff->max = test_time; + } + diff->tests[diff->num_tests++] = tests[i]; + tests[i]++; + } + } + diff->change = diff->max / diff->min; + + if (num_reports == 2) { + double old_time, new_time; + if (diff->num_tests == 1) { + printf ("Only in %s: %s %s\n", + diff->tests[0]->configuration, + diff->tests[0]->backend, + diff->tests[0]->name); + continue; + } + old_time = diff->tests[0]->stats.min_ticks; + new_time = diff->tests[1]->stats.min_ticks; + if (! options->use_ticks) { + old_time /= diff->tests[0]->stats.ticks_per_ms; + new_time /= diff->tests[1]->stats.ticks_per_ms; + } + diff->change = old_time / new_time; + if (diff->change < 1.0) + diff->change = - 1.0 / diff->change; + } + + diff++; + num_diffs++; + } + if (num_diffs == 0) + goto DONE; + + if (num_reports == 2) + qsort (diffs, num_diffs, sizeof (test_diff_t), + test_diff_cmp_speedup_before_slowdown); + else + qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp); + + max_change = 1.0; + for (i = 0; i < num_diffs; i++) { + if (fabs (diffs[i].change) > max_change) + max_change = fabs (diffs[i].change); + } + + if (num_reports == 2) + printf ("old: %s\n" + "new: %s\n", + diffs->tests[0]->configuration, + diffs->tests[1]->configuration); + + for (i = 0; i < num_diffs; i++) { + diff = &diffs[i]; + + /* Discard as uninteresting a change which is less than the + * minimum change required, (default may be overriden on + * command-line). */ + if (fabs (diff->change) - 1.0 < options->min_change) + continue; + + if (num_reports == 2) { + if (diff->change > 1.0 && ! printed_speedup) { + printf ("Speedups\n" + "========\n"); + printed_speedup = TRUE; + } + if (diff->change < 1.0 && ! printed_slowdown) { + printf ("Slowdowns\n" + "=========\n"); + printed_slowdown = TRUE; + } + test_diff_print_binary (diff, max_change, options); + } else { + test_diff_print_multi (diff, max_change, options); + } + } + + DONE: + for (i = 0; i < num_diffs; i++) + free (diffs[i].tests); + free (diffs); + free (tests); +} + +static void +usage (const char *argv0) +{ + char const *basename = strrchr(argv0, '/'); + basename = basename ? basename+1 : argv0; + fprintf (stderr, + "Usage: %s [options] file1 file2 [...]\n\n", + basename); + fprintf (stderr, + "Computes significant performance differences for cairo performance reports.\n" + "Each file should be the output of the cairo-perf program (or \"make perf\").\n" + "The following options are available:\n" + "\n" + "--no-utf Use ascii stars instead of utf-8 change bars.\n" + " Four stars are printed per factor of speedup.\n" + "\n" + "--no-bars Don't display change bars at all.\n\n" + "\n" + "--use-ms Use milliseconds to calculate differences.\n" + " (instead of ticks which are hardware dependent)\n" + "\n" + "--min-change threshold[%%]\n" + " Suppress all changes below the given threshold.\n" + " The default threshold of 0.05 or 5%% ignores any\n" + " speedup or slowdown of 1.05 or less. A threshold\n" + " of 0 will cause all output to be reported.\n" + ); + exit(1); +} + +static void +parse_args (int argc, + char const **argv, + cairo_perf_diff_files_args_t *args) +{ + int i; + + for (i = 1; i < argc; i++) { + if (strcmp (argv[i], "--no-utf") == 0) { + args->options.use_utf = 0; + } + else if (strcmp (argv[i], "--no-bars") == 0) { + args->options.print_change_bars = 0; + } + else if (strcmp (argv[i], "--use-ms") == 0) { + /* default */ + } + else if (strcmp (argv[i], "--use-ticks") == 0) { + args->options.use_ticks = 1; + } + else if (strcmp (argv[i], "--min-change") == 0) { + char *end = NULL; + i++; + if (i >= argc) + usage (argv[0]); + args->options.min_change = strtod (argv[i], &end); + if (*end) { + if (*end == '%') { + args->options.min_change /= 100; + } else { + usage (argv[0]); + } + } + } + else { + args->num_filenames++; + args->filenames = xrealloc (args->filenames, + args->num_filenames * sizeof (char *)); + args->filenames[args->num_filenames - 1] = argv[i]; + } + } +} + +int +main (int argc, + const char *argv[]) +{ + cairo_perf_diff_files_args_t args = { + NULL, /* filenames */ + 0, /* num_filenames */ + { + 0.05, /* min change */ + 1, /* use UTF-8? */ + 1, /* display change bars? */ + } + }; + cairo_perf_report_t *reports; + test_report_t *t; + int i; + + parse_args (argc, argv, &args); + + if (args.num_filenames < 2) + usage (argv[0]); + + reports = xmalloc (args.num_filenames * sizeof (cairo_perf_report_t)); + + for (i = 0; i < args.num_filenames; i++ ) { + cairo_perf_report_load (&reports[i], args.filenames[i], i, NULL); + printf ("[%d] %s\n", i, args.filenames[i]); + } + printf ("\n"); + + cairo_perf_reports_compare (reports, args.num_filenames, &args.options); + + /* Pointless memory cleanup, (would be a great place for talloc) */ + free (args.filenames); + for (i = 0; i < args.num_filenames; i++) { + for (t = reports[i].tests; t->name; t++) { + free (t->samples); + free (t->backend); + free (t->name); + } + free (reports[i].tests); + free (reports[i].configuration); + } + free (reports); + + return 0; +} diff --git a/perf/cairo-perf-graph-files.c b/perf/cairo-perf-graph-files.c new file mode 100644 index 000000000..1fd99e4ad --- /dev/null +++ b/perf/cairo-perf-graph-files.c @@ -0,0 +1,604 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Chris Wilson + */ + +#include "cairo-perf.h" +#include "cairo-perf-graph.h" + +#include +#include +#include +#include +#include + +#include + +static void +usage (const char *argv0) +{ + char const *basename = strrchr (argv0, '/'); + basename = basename ? basename+1 : argv0; + g_printerr ("Usage: %s [options] file1 file2 [...]\n\n", basename); + g_printerr ("Draws a graph illustrating the change in performance over a series.\n"); + exit(1); +} + +enum { + CASE_SHOWN, + CASE_INCONSISTENT, + CASE_BACKEND, + CASE_CONTENT, + CASE_NAME, + CASE_SIZE, + CASE_FG_COLOR, + CASE_DATA, + CASE_NCOLS +}; + +static GtkTreeStore * +cases_to_store (test_case_t *cases) +{ + GtkTreeStore *store; + GtkTreeIter backend_iter; + GtkTreeIter content_iter; + const char *backend = NULL; + const char *content = NULL; + + store = gtk_tree_store_new (CASE_NCOLS, + G_TYPE_BOOLEAN, /* shown */ + G_TYPE_BOOLEAN, /* inconsistent */ + G_TYPE_STRING, /* backend */ + G_TYPE_STRING, /* content */ + G_TYPE_STRING, /* name */ + G_TYPE_INT, /* size */ + GDK_TYPE_COLOR, /* fg color */ + G_TYPE_POINTER); /* data */ + while (cases->backend != NULL) { + GtkTreeIter iter; + + if (backend == NULL || strcmp (backend, cases->backend)) { + gtk_tree_store_append (store, &backend_iter, NULL); + gtk_tree_store_set (store, &backend_iter, + CASE_SHOWN, TRUE, + CASE_BACKEND, cases->backend, + -1); + backend = cases->backend; + content = NULL; + } + if (content == NULL || strcmp (content, cases->content)) { + gtk_tree_store_append (store, &content_iter, &backend_iter); + gtk_tree_store_set (store, &content_iter, + CASE_SHOWN, TRUE, + CASE_BACKEND, cases->backend, + CASE_CONTENT, cases->content, + -1); + content = cases->content; + } + + gtk_tree_store_append (store, &iter, &content_iter); + gtk_tree_store_set (store, &iter, + CASE_SHOWN, TRUE, + CASE_BACKEND, cases->backend, + CASE_CONTENT, cases->content, + CASE_NAME, cases->name, + CASE_SIZE, cases->size, + CASE_FG_COLOR, &cases->color, + CASE_DATA, cases, + -1); + cases++; + } + + return store; +} + +struct _app_data { + GtkWidget *window; + + test_case_t *cases; + cairo_perf_report_t *reports; + int num_reports; + + GtkTreeStore *case_store; + + GIOChannel *git_io; + GtkTextBuffer *git_buffer; + + GtkWidget *gv; +}; + +static void +recurse_set_shown (GtkTreeModel *model, + GtkTreeIter *parent, + gboolean shown) +{ + GtkTreeIter iter; + + if (gtk_tree_model_iter_children (model, &iter, parent)) do { + test_case_t *c; + + gtk_tree_model_get (model, &iter, CASE_DATA, &c, -1); + if (c == NULL) { + recurse_set_shown (model, &iter, shown); + } else if (shown != c->shown) { + c->shown = shown; + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, + CASE_SHOWN, shown, + CASE_INCONSISTENT, FALSE, + -1); + } + } while (gtk_tree_model_iter_next (model, &iter)); +} + +static gboolean +children_consistent (GtkTreeModel *model, + GtkTreeIter *parent) +{ + GtkTreeIter iter; + gboolean first = TRUE; + gboolean first_active; + + if (gtk_tree_model_iter_children (model, &iter, parent)) do { + gboolean active, inconsistent; + + gtk_tree_model_get (model, &iter, + CASE_INCONSISTENT, &inconsistent, + CASE_SHOWN, &active, + -1); + if (inconsistent) + return FALSE; + + if (first) { + first_active = active; + first = FALSE; + } else if (active != first_active) + return FALSE; + } while (gtk_tree_model_iter_next (model, &iter)); + + return TRUE; +} + +static void +check_consistent (GtkTreeModel *model, + GtkTreeIter *child) +{ + GtkTreeIter parent; + + if (gtk_tree_model_iter_parent (model, &parent, child)) { + gtk_tree_store_set (GTK_TREE_STORE (model), &parent, + CASE_INCONSISTENT, + ! children_consistent (model, &parent), + -1); + check_consistent (model, &parent); + } +} + +static void +show_case_toggled (GtkCellRendererToggle *cell, + gchar *str, + struct _app_data *app) +{ + GtkTreeModel *model; + GtkTreePath *path; + GtkTreeIter iter; + test_case_t *c; + gboolean active; + + active = ! gtk_cell_renderer_toggle_get_active (cell); + + model = GTK_TREE_MODEL (app->case_store); + + path = gtk_tree_path_new_from_string (str); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_path_free (path); + + gtk_tree_store_set (app->case_store, &iter, + CASE_SHOWN, active, + CASE_INCONSISTENT, FALSE, + -1); + gtk_tree_model_get (model, &iter, CASE_DATA, &c, -1); + if (c != NULL) { + if (active == c->shown) + return; + + c->shown = active; + } else { + recurse_set_shown (model, &iter, active); + } + check_consistent (model, &iter); + + graph_view_update_visible ((GraphView *) app->gv); +} + +static gboolean +git_read (GIOChannel *io, + GIOCondition cond, + struct _app_data *app) +{ + int fd; + + fd = g_io_channel_unix_get_fd (io); + do { + char buf[4096]; + int len; + GtkTextIter end; + + len = read (fd, buf, sizeof (buf)); + if (len <= 0) { + int err = len ? errno : 0; + switch (err) { + case EAGAIN: + case EINTR: + return TRUE; + default: + g_io_channel_unref (app->git_io); + app->git_io = NULL; + return FALSE; + } + } + + gtk_text_buffer_get_end_iter (app->git_buffer, &end); + gtk_text_buffer_insert (app->git_buffer, &end, buf, len); + } while (TRUE); +} + +static void +do_git (struct _app_data *app, + char **argv) +{ + gint output; + GError *error = NULL; + GtkTextIter start, stop; + long flags; + + if (! g_spawn_async_with_pipes (NULL, argv, NULL, + G_SPAWN_SEARCH_PATH | + G_SPAWN_STDERR_TO_DEV_NULL | + G_SPAWN_FILE_AND_ARGV_ZERO, + NULL, NULL, NULL, + NULL, &output, NULL, + &error)) + { + g_error ("spawn failed: %s", error->message); + } + + if (app->git_io) { + g_io_channel_shutdown (app->git_io, FALSE, NULL); + g_io_channel_unref (app->git_io); + } + + gtk_text_buffer_get_bounds (app->git_buffer, &start, &stop); + gtk_text_buffer_delete (app->git_buffer, &start, &stop); + + flags = fcntl (output, F_GETFL); + if ((flags & O_NONBLOCK) == 0) + fcntl (output, F_SETFL, flags | O_NONBLOCK); + + app->git_io = g_io_channel_unix_new (output); + g_io_add_watch (app->git_io, G_IO_IN | G_IO_HUP, (GIOFunc) git_read, app); +} + +static void +gv_report_selected (GraphView *gv, + int i, + struct _app_data *app) +{ + cairo_perf_report_t *report; + char *hyphen; + + if (i == -1) + return; + + report = &app->reports[i]; + hyphen = strchr (report->configuration, '-'); + if (hyphen != NULL) { + int len = hyphen - report->configuration; + char *id = g_malloc (len + 1); + char *argv[5]; + + memcpy (id, report->configuration, len); + id[len] = '\0'; + + argv[0] = (char *) "git"; + argv[1] = (char *) "git"; + argv[2] = (char *) "show"; + argv[3] = id; + argv[4] = NULL; + + do_git (app, argv); + g_free (id); + } +} + +static GtkWidget * +window_create (test_case_t *cases, + cairo_perf_report_t *reports, + int num_reports) +{ + GtkWidget *window, *table, *w; + GtkWidget *tv, *sw; + GtkTreeStore *store; + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + struct _app_data *data; + + + data = g_new0 (struct _app_data, 1); + data->cases = cases; + data->reports = reports; + data->num_reports = num_reports; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Cairo Performance Graph"); + g_object_set_data_full (G_OBJECT (window), + "app-data", data, (GDestroyNotify)g_free); + + data->window = window; + + table = gtk_table_new (2, 2, FALSE); + + /* legend & show/hide lines (categorised) */ + tv = gtk_tree_view_new (); + store = cases_to_store (cases); + data->case_store = store; + gtk_tree_view_set_model (GTK_TREE_VIEW (tv), GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_toggle_new (); + column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "active", CASE_SHOWN, + "inconsistent", CASE_INCONSISTENT, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); + g_signal_connect (renderer, "toggled", + G_CALLBACK (show_case_toggled), data); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Backend", + renderer, + "text", CASE_BACKEND, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Content", + renderer, + "text", CASE_CONTENT, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Test", + renderer, + "text", CASE_NAME, + "foreground-gdk", CASE_FG_COLOR, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("Size", + renderer, + "text", CASE_SIZE, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column); + + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tv), TRUE); + g_object_unref (store); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), tv); + gtk_widget_show (tv); + gtk_table_attach (GTK_TABLE (table), sw, + 0, 1, 0, 2, + GTK_FILL, GTK_FILL, + 4, 4); + gtk_widget_show (sw); + + /* the performance chart */ + w = graph_view_new (); + data->gv = w; + g_signal_connect (w, "report-selected", + G_CALLBACK (gv_report_selected), data); + graph_view_set_reports ((GraphView *)w, cases, reports, num_reports); + gtk_table_attach (GTK_TABLE (table), w, + 1, 2, 0, 1, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + 4, 4); + gtk_widget_show (w); + + /* interesting information - presumably the commit log */ + w = gtk_text_view_new (); + data->git_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w)); + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_NEVER, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), w); + gtk_widget_show (w); + gtk_table_attach (GTK_TABLE (table), sw, + 1, 2, 1, 2, + GTK_FILL, GTK_FILL | GTK_EXPAND, + 4, 4); + gtk_widget_show (sw); + + gtk_container_add (GTK_CONTAINER (window), table); + gtk_widget_show (table); + + return window; +} + +static void +name_to_color (const char *name, + GdkColor *color) +{ + gint v = g_str_hash (name); + + color->red = ((v >> 0) & 0xff) / 384. * 0xffff; + color->green = ((v >> 8) & 0xff) / 384. * 0xffff; + color->blue = ((v >> 16) & 0xff) / 384. * 0xffff; +} + +static test_case_t * +test_cases_from_reports (cairo_perf_report_t *reports, + int num_reports) +{ + test_case_t *cases, *c; + test_report_t **tests; + int i, j; + int num_tests; + + num_tests = 0; + for (i = 0; i < num_reports; i++) { + for (j = 0; reports[i].tests[j].name != NULL; j++) + ; + if (j > num_tests) + num_tests = j; + } + + cases = xcalloc (num_tests+1, sizeof (test_case_t)); + tests = xmalloc (num_reports * sizeof (test_report_t *)); + for (i = 0; i < num_reports; i++) + tests[i] = reports[i].tests; + + c = cases; + while (1) { + int seen_non_null; + test_report_t *min_test; + + /* We expect iterations values of 0 when multiple raw reports + * for the same test have been condensed into the stats of the + * first. So we just skip these later reports that have no + * stats. */ + seen_non_null = 0; + for (i = 0; i < num_reports; i++) { + while (tests[i]->name && tests[i]->stats.iterations == 0) + tests[i]++; + if (tests[i]->name) + seen_non_null++; + } + + if (seen_non_null < 2) + break; + + /* Find the minimum of all current tests, (we have to do this + * in case some reports don't have a particular test). */ + for (i = 0; i < num_reports; i++) { + if (tests[i]->name) { + min_test = tests[i]; + break; + } + } + for (++i; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) < 0) + { + min_test = tests[i]; + } + } + + c->min_test = min_test; + c->backend = min_test->backend; + c->content = min_test->content; + c->name = min_test->name; + c->size = min_test->size; + c->baseline = min_test->stats.min_ticks; + c->min = c->max = 1.; + c->shown = TRUE; + name_to_color (c->name, &c->color); + + for (i = 0; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + tests[i]++; + break; + } + } + + for (++i; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + double v = tests[i]->stats.min_ticks / c->baseline; + if (v < c->min) + c->min = v; + if (v > c->max) + c->max = v; + tests[i]++; + } + } + + c++; + } + free (tests); + + return cases; +} +int +main (int argc, + char *argv[]) +{ + cairo_perf_report_t *reports; + test_case_t *cases; + test_report_t *t; + int i; + GtkWidget *window; + + gtk_init (&argc, &argv); + + if (argc < 3) + usage (argv[0]); + + reports = xmalloc ((argc-1) * sizeof (cairo_perf_report_t)); + for (i = 1; i < argc; i++ ) + cairo_perf_report_load (&reports[i-1], argv[i], i, NULL); + + cases = test_cases_from_reports (reports, argc-1); + + window = window_create (cases, reports, argc-1); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + gtk_widget_show (window); + + gtk_main (); + + /* Pointless memory cleanup, (would be a great place for talloc) */ + free (cases); + for (i = 0; i < argc-1; i++) { + for (t = reports[i].tests; t->name; t++) { + free (t->samples); + free (t->backend); + free (t->name); + } + free (reports[i].tests); + free (reports[i].configuration); + } + free (reports); + + return 0; +} diff --git a/perf/cairo-perf-graph-widget.c b/perf/cairo-perf-graph-widget.c new file mode 100644 index 000000000..41311f7ee --- /dev/null +++ b/perf/cairo-perf-graph-widget.c @@ -0,0 +1,604 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Chris Wilson + */ + +#include "cairo-perf.h" +#include "cairo-perf-graph.h" + +#include + +struct _GraphView { + GtkWidget widget; + + test_case_t *cases; + cairo_perf_report_t *reports; + int num_reports; + double ymin, ymax; + + int selected_report; +}; + +typedef struct _GraphViewClass { + GtkWidgetClass parent_class; +} GraphViewClass; + +static GType graph_view_get_type (void); + +enum { + REPORT_SELECTED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +G_DEFINE_TYPE (GraphView, graph_view, GTK_TYPE_WIDGET) + +static void +draw_baseline_performance (test_case_t *cases, + cairo_perf_report_t *reports, + int num_reports, + cairo_t *cr, + const cairo_matrix_t *m) +{ + test_report_t **tests; + double dots[2] = { 0, 1.}; + int i; + + tests = xmalloc (num_reports * sizeof (test_report_t *)); + for (i = 0; i < num_reports; i++) + tests[i] = reports[i].tests; + + while (cases->backend != NULL) { + test_report_t *min_test; + double baseline, last_y; + double x, y; + + if (! cases->shown) { + cases++; + continue; + } + + min_test = cases->min_test; + + for (i = 0; i < num_reports; i++) { + while (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) < 0) + { + tests[i]++; + } + } + + /* first the stroke */ + cairo_save (cr); + cairo_set_line_width (cr, 2.); + gdk_cairo_set_source_color (cr, &cases->color); + for (i = 0; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + baseline = tests[i]->stats.min_ticks; + + x = i; y = 0; + cairo_matrix_transform_point (m, &x, &y); + x = floor (x); + y = floor (y); + cairo_move_to (cr, x, y); + last_y = y; + break; + } + } + + for (++i; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + x = i, y = tests[i]->stats.min_ticks / baseline; + + if (y < 1.) + y = -1./y + 1; + else + y -= 1; + + cairo_matrix_transform_point (m, &x, &y); + x = floor (x); + y = floor (y); + cairo_line_to (cr, x, last_y); + cairo_line_to (cr, x, y); + last_y = y; + } + } + { + x = num_reports, y = 0; + cairo_matrix_transform_point (m, &x, &y); + x = floor (x); + cairo_line_to (cr, x, last_y); + } + + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + /* then draw the points */ + for (i = 0; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + baseline = tests[i]->stats.min_ticks; + + x = i; y = 0; + cairo_matrix_transform_point (m, &x, &y); + x = floor (x); + y = floor (y); + cairo_move_to (cr, x, y); + cairo_close_path (cr); + last_y = y; + + tests[i]++; + break; + } + } + + for (++i; i < num_reports; i++) { + if (tests[i]->name && + test_report_cmp_backend_then_name (tests[i], min_test) == 0) + { + x = i, y = tests[i]->stats.min_ticks / baseline; + + if (y < 1.) + y = -1./y + 1; + else + y -= 1; + + cairo_matrix_transform_point (m, &x, &y); + x = floor (x); + y = floor (y); + cairo_move_to (cr, x, last_y); + cairo_close_path (cr); + cairo_move_to (cr, x, y); + cairo_close_path (cr); + last_y = y; + + tests[i]++; + } + } + { + x = num_reports, y = 0; + cairo_matrix_transform_point (m, &x, &y); + x = floor (x); + cairo_move_to (cr, x, last_y); + cairo_close_path (cr); + } + cairo_set_source_rgba (cr, 0, 0, 0, .5); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_width (cr, 3.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_stroke (cr); + cairo_restore (cr); + + cases++; + } + free (tests); +} + +static void +draw_hline (cairo_t *cr, + const cairo_matrix_t *m, + double y0, + double xmin, + double xmax) +{ + double x, y; + double py_offset; + + py_offset = fmod (cairo_get_line_width (cr) / 2., 1.); + + x = xmin; y = y0; + cairo_matrix_transform_point (m, &x, &y); + cairo_move_to (cr, floor (x), floor (y) + py_offset); + + x = xmax; y = y0; + cairo_matrix_transform_point (m, &x, &y); + cairo_line_to (cr, ceil (x), floor (y) + py_offset); + + cairo_stroke (cr); +} + +static void +draw_label (cairo_t *cr, + const cairo_matrix_t *m, + double y0, + double xmin, + double xmax) +{ + double x, y; + char buf[80]; + cairo_text_extents_t extents; + + snprintf (buf, sizeof (buf), "%.0fx", fabs (y0)); + cairo_text_extents (cr, buf, &extents); + + x = xmin; y = y0; + cairo_matrix_transform_point (m, &x, &y); + cairo_move_to (cr, + x - extents.width - 4, + y - (extents.height/2. + extents.y_bearing)); + cairo_show_text (cr, buf); + + + snprintf (buf, sizeof (buf), "%.0fx", fabs (y0)); + cairo_text_extents (cr, buf, &extents); + + x = xmax; y = y0; + cairo_matrix_transform_point (m, &x, &y); + cairo_move_to (cr, + x + 4, + y - (extents.height/2. + extents.y_bearing)); + cairo_show_text (cr, buf); +} + +#define ALIGN_X(v) ((v)<<0) +#define ALIGN_Y(v) ((v)<<2) +static void +draw_rotated_label (cairo_t *cr, + const char *text, + double x, + double y, + double angle, + int align) +{ + cairo_text_extents_t extents; + + cairo_text_extents (cr, text, &extents); + + cairo_save (cr); { + cairo_translate (cr, x, y); + cairo_rotate (cr, angle); + switch (align) { + case ALIGN_X(0) | ALIGN_Y(0): + cairo_move_to (cr, + -extents.x_bearing, + -extents.y_bearing); + break; + case ALIGN_X(0) | ALIGN_Y(1): + cairo_move_to (cr, + -extents.x_bearing, + - (extents.height/2. + extents.y_bearing)); + break; + case ALIGN_X(0) | ALIGN_Y(2): + cairo_move_to (cr, + -extents.x_bearing, + - (extents.height + extents.y_bearing)); + break; + + case ALIGN_X(1) | ALIGN_Y(0): + cairo_move_to (cr, + - (extents.width/2. + extents.x_bearing), + -extents.y_bearing); + break; + case ALIGN_X(1) | ALIGN_Y(1): + cairo_move_to (cr, + - (extents.width/2. + extents.x_bearing), + - (extents.height/2. + extents.y_bearing)); + break; + case ALIGN_X(1) | ALIGN_Y(2): + cairo_move_to (cr, + - (extents.width/2. + extents.x_bearing), + - (extents.height + extents.y_bearing)); + break; + + case ALIGN_X(2) | ALIGN_Y(0): + cairo_move_to (cr, + - (extents.width + extents.x_bearing), + -extents.y_bearing); + break; + case ALIGN_X(2) | ALIGN_Y(1): + cairo_move_to (cr, + - (extents.width + extents.x_bearing), + - (extents.height/2. + extents.y_bearing)); + break; + case ALIGN_X(2) | ALIGN_Y(2): + cairo_move_to (cr, + - (extents.width + extents.x_bearing), + - (extents.height + extents.y_bearing)); + break; + } + cairo_show_text (cr, text); + } cairo_restore (cr); +} + +#define PAD 36 +static void +graph_view_draw (GraphView *self, + cairo_t *cr) +{ + cairo_matrix_t m; + const double dash[2] = {4, 4}; + double range; + int i; + + if (self->widget.allocation.width < 4 *PAD) + return; + if (self->widget.allocation.height < 3 *PAD) + return; + + range = floor (self->ymax+1) - ceil (self->ymin-1); + + cairo_matrix_init_translate (&m, PAD, self->widget.allocation.height - PAD); + cairo_matrix_scale (&m, + (self->widget.allocation.width-2*PAD)/(self->num_reports), + -(self->widget.allocation.height-2*PAD)/range); + cairo_matrix_translate (&m, 0, floor (self->ymax+1)); + + if (self->selected_report != -1) { + cairo_save (cr); { + double x0, x1, y; + x0 = self->selected_report; y = 0; + cairo_matrix_transform_point (&m, &x0, &y); + x0 = floor (x0); + x1 = self->selected_report + 1; y = 0; + cairo_matrix_transform_point (&m, &x1, &y); + x1 = ceil (x1); + y = (x1 - x0) / 8; + y = MIN (y, PAD / 2); + x0 -= y; + x1 += y; + cairo_rectangle (cr, x0, PAD/2, x1-x0, self->widget.allocation.height-2*PAD + PAD); + gdk_cairo_set_source_color (cr, &self->widget.style->base[GTK_STATE_SELECTED]); + cairo_fill (cr); + } cairo_restore (cr); + } + + cairo_save (cr); { + cairo_pattern_t *linear; + double x, y; + + gdk_cairo_set_source_color (cr, + &self->widget.style->fg[GTK_WIDGET_STATE (self)]); + cairo_set_line_width (cr, 2.); + draw_hline (cr, &m, 0, 0, self->num_reports); + + cairo_set_line_width (cr, 1.); + cairo_set_dash (cr, NULL, 0, 0); + + for (i = ceil (self->ymin-1); i <= floor (self->ymax+1); i++) { + if (i != 0) + draw_hline (cr, &m, i, 0, self->num_reports); + } + + cairo_set_font_size (cr, 11); + + linear = cairo_pattern_create_linear (0, PAD, 0, self->widget.allocation.height-2*PAD); + cairo_pattern_add_color_stop_rgb (linear, 0, 0, 1, 0); + cairo_pattern_add_color_stop_rgb (linear, 1, 1, 0, 0); + cairo_set_source (cr, linear); + cairo_pattern_destroy (linear); + + for (i = ceil (self->ymin-1); i <= floor (self->ymax+1); i++) { + if (i != 0) + draw_label (cr, &m, i, 0, self->num_reports); + } + + x = 0, y = floor (self->ymax+1); + cairo_matrix_transform_point (&m, &x, &y); + draw_rotated_label (cr, "Faster", x - 7, y + 14, + 270./360 * 2 * G_PI, + ALIGN_X(2) | ALIGN_Y(1)); + x = self->num_reports, y = floor (self->ymax+1); + cairo_matrix_transform_point (&m, &x, &y); + draw_rotated_label (cr, "Faster", x + 11, y + 14, + 270./360 * 2 * G_PI, + ALIGN_X(2) | ALIGN_Y(1)); + + x = 0, y = ceil (self->ymin-1); + cairo_matrix_transform_point (&m, &x, &y); + draw_rotated_label (cr, "Slower", x - 7, y - 14, + 90./360 * 2 * G_PI, + ALIGN_X(2) | ALIGN_Y(1)); + x = self->num_reports, y = ceil (self->ymin-1); + cairo_matrix_transform_point (&m, &x, &y); + draw_rotated_label (cr, "Slower", x + 11, y - 14, + 90./360 * 2 * G_PI, + ALIGN_X(2) | ALIGN_Y(1)); + } cairo_restore (cr); + + draw_baseline_performance (self->cases, + self->reports, self->num_reports, + cr, &m); + + cairo_save (cr); { + cairo_set_source_rgb (cr, 0.7, 0.7, 0.7); + cairo_set_line_width (cr, 1.); + cairo_set_dash (cr, dash, 2, 0); + draw_hline (cr, &m, 0, 0, self->num_reports); + } cairo_restore (cr); +} + +static gboolean +graph_view_expose (GtkWidget *w, + GdkEventExpose *ev) +{ + GraphView *self = (GraphView *) w; + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + gdk_cairo_set_source_color (cr, &w->style->base[GTK_WIDGET_STATE (w)]); + cairo_paint (cr); + + graph_view_draw (self, cr); + + cairo_destroy (cr); + + return FALSE; +} + +static gboolean +graph_view_button_press (GtkWidget *w, + GdkEventButton *ev) +{ + GraphView *self = (GraphView *) w; + cairo_matrix_t m; + double x,y; + int i; + + cairo_matrix_init_translate (&m, PAD, self->widget.allocation.height-PAD); + cairo_matrix_scale (&m, (self->widget.allocation.width-2*PAD)/self->num_reports, -(self->widget.allocation.height-2*PAD)/(self->ymax - self->ymin)); + cairo_matrix_translate (&m, 0, -self->ymin); + cairo_matrix_invert (&m); + + x = ev->x; + y = ev->y; + cairo_matrix_transform_point (&m, &x, &y); + + i = floor (x); + if (i < 0 || i >= self->num_reports) + i = -1; + + if (i != self->selected_report) { + self->selected_report = i; + gtk_widget_queue_draw (w); + + g_signal_emit (w, signals[REPORT_SELECTED], 0, i); + } + + return FALSE; +} + +static gboolean +graph_view_button_release (GtkWidget *w, + GdkEventButton *ev) +{ + GraphView *self = (GraphView *) w; + + return FALSE; +} + +static void +graph_view_realize (GtkWidget *widget) +{ + GdkWindowAttr attributes; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_EXPOSURE_MASK; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_VISUAL | GDK_WA_COLORMAP); + gdk_window_set_user_data (widget->window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); +} + +static void +graph_view_finalize (GObject *obj) +{ + G_OBJECT_CLASS (graph_view_parent_class)->finalize (obj); +} + +static void +graph_view_class_init (GraphViewClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + object_class->finalize = graph_view_finalize; + + widget_class->realize = graph_view_realize; + widget_class->expose_event = graph_view_expose; + widget_class->button_press_event = graph_view_button_press; + widget_class->button_release_event = graph_view_button_release; + + signals[REPORT_SELECTED] = + g_signal_new ("report-selected", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + 0,//G_STRUCT_OFFSET (GraphView, report_selected), + NULL, NULL, + g_cclosure_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); +} + +static void +graph_view_init (GraphView *self) +{ + self->selected_report = -1; +} + +GtkWidget * +graph_view_new (void) +{ + return g_object_new (graph_view_get_type (), NULL); +} + +void +graph_view_update_visible (GraphView *gv) +{ + double min, max; + test_case_t *cases; + + cases = gv->cases; + + min = max = 1.; + while (cases->name != NULL) { + if (cases->shown) { + if (cases->min < min) + min = cases->min; + if (cases->max > max) + max = cases->max; + } + cases++; + } + gv->ymin = -1/min + 1; + gv->ymax = max - 1; + + gtk_widget_queue_draw (&gv->widget); +} + +void +graph_view_set_reports (GraphView *gv, + test_case_t *cases, + cairo_perf_report_t *reports, + int num_reports) +{ + /* XXX ownership? */ + gv->cases = cases; + gv->reports = reports; + gv->num_reports = num_reports; + + graph_view_update_visible (gv); +} diff --git a/perf/cairo-perf-graph.h b/perf/cairo-perf-graph.h new file mode 100644 index 000000000..4cb62165f --- /dev/null +++ b/perf/cairo-perf-graph.h @@ -0,0 +1,63 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Chris Wilson + */ + +#ifndef CAIRO_PERF_GRAPH_H +#define CAIRO_PERF_GRAPH_H + +#include + +#include "cairo-perf.h" + +typedef struct _test_case { + const char *backend; + const char *content; + const char *name; + int size; + + test_report_t *min_test; + + cairo_bool_t shown; + double baseline; + double min, max; + GdkColor color; +} test_case_t; + +typedef struct _GraphView GraphView; + +GtkWidget * +graph_view_new (void); + +void +graph_view_set_reports (GraphView *gv, + test_case_t *tests, + cairo_perf_report_t *reports, + int num_reports); + +void +graph_view_update_visible (GraphView *gv); + +#endif diff --git a/perf/cairo-perf-micro.c b/perf/cairo-perf-micro.c new file mode 100644 index 000000000..d6b52c446 --- /dev/null +++ b/perf/cairo-perf-micro.c @@ -0,0 +1,594 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2006 Mozilla Corporation + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Vladimir Vukicevic + * Carl Worth + */ + +#define _GNU_SOURCE 1 /* for sched_getaffinity() */ + +#include "../cairo-version.h" /* for the real version */ + +#include "cairo-perf.h" +#include "cairo-stats.h" + +#include "cairo-boilerplate-getopt.h" + +/* For basename */ +#ifdef HAVE_LIBGEN_H +#include +#endif + +#if HAVE_FCFINI +#include +#endif + +#ifdef HAVE_SCHED_H +#include +#endif + +#define CAIRO_PERF_ITERATIONS_DEFAULT 100 +#define CAIRO_PERF_LOW_STD_DEV 0.03 +#define CAIRO_PERF_STABLE_STD_DEV_COUNT 5 +#define CAIRO_PERF_ITERATION_MS_DEFAULT 2000 +#define CAIRO_PERF_ITERATION_MS_FAST 5 + +typedef struct _cairo_perf_case { + CAIRO_PERF_RUN_DECL (*run); + cairo_bool_t (*enabled) (cairo_perf_t *perf); + unsigned int min_size; + unsigned int max_size; +} cairo_perf_case_t; + +const cairo_perf_case_t perf_cases[]; + +static const char * +_content_to_string (cairo_content_t content, + cairo_bool_t similar) +{ + switch (content|similar) { + case CAIRO_CONTENT_COLOR: + return "rgb"; + case CAIRO_CONTENT_COLOR|1: + return "rgb&"; + case CAIRO_CONTENT_ALPHA: + return "a"; + case CAIRO_CONTENT_ALPHA|1: + return "a&"; + case CAIRO_CONTENT_COLOR_ALPHA: + return "rgba"; + case CAIRO_CONTENT_COLOR_ALPHA|1: + return "rgba&"; + default: + return ""; + } +} + +static cairo_bool_t +cairo_perf_has_similar (cairo_perf_t *perf) +{ + cairo_surface_t *target; + + if (getenv ("CAIRO_TEST_SIMILAR") == NULL) + return FALSE; + + /* exclude the image backend */ + target = cairo_get_target (perf->cr); + if (cairo_surface_get_type (target) == CAIRO_SURFACE_TYPE_IMAGE) + return FALSE; + + return TRUE; +} + +cairo_bool_t +cairo_perf_can_run (cairo_perf_t *perf, + const char *name, + cairo_bool_t *is_explicit) +{ + unsigned int i; + + if (is_explicit) + *is_explicit = FALSE; + + if (perf->num_names == 0) + return TRUE; + + for (i = 0; i < perf->num_names; i++) { + if (strstr (name, perf->names[i])) { + if (is_explicit) + *is_explicit = FALSE; + return TRUE; + } + } + + return FALSE; +} + +static unsigned +cairo_perf_calibrate (cairo_perf_t *perf, + cairo_perf_func_t perf_func) +{ + cairo_time_t calibration, calibration_max; + unsigned loops, min_loops; + + min_loops = 1; + calibration = perf_func (perf->cr, perf->size, perf->size, min_loops); + + if (!perf->fast_and_sloppy) { + calibration_max = _cairo_time_from_s (perf->ms_per_iteration * 0.0001 / 4); + while (calibration < calibration_max) { + min_loops *= 2; + calibration = perf_func (perf->cr, perf->size, perf->size, min_loops); + } + } + + /* XXX + * Compute the number of loops required for the timing + * interval to be perf->ms_per_iteration milliseconds. This + * helps to eliminate sampling variance due to timing and + * other systematic errors. However, it also hides + * synchronisation overhead as we attempt to process a large + * batch of identical operations in a single shot. This can be + * considered both good and bad... It would be good to perform + * a more rigorous analysis of the synchronisation overhead, + * that is to estimate the time for loop=0. + */ + loops = _cairo_time_from_s (perf->ms_per_iteration * 0.001 * min_loops / calibration); + min_loops = perf->fast_and_sloppy ? 1 : 10; + if (loops < min_loops) + loops = min_loops; + + return loops; +} + +void +cairo_perf_run (cairo_perf_t *perf, + const char *name, + cairo_perf_func_t perf_func, + cairo_count_func_t count_func) +{ + static cairo_bool_t first_run = TRUE; + unsigned int i, similar, similar_iters; + cairo_time_t *times; + cairo_stats_t stats = {0.0, 0.0}; + int low_std_dev_count; + + if (perf->list_only) { + printf ("%s\n", name); + return; + } + + if (first_run) { + if (perf->raw) { + printf ("[ # ] %s.%-s %s %s %s ...\n", + "backend", "content", "test-size", "ticks-per-ms", "time(ticks)"); + } + + if (perf->summary) { + fprintf (perf->summary, + "[ # ] %8s.%-4s %28s %8s %8s %5s %5s %s %s\n", + "backend", "content", "test-size", "min(ticks)", "min(ms)", "median(ms)", + "stddev.", "iterations", "overhead"); + } + first_run = FALSE; + } + + times = perf->times; + + if (getenv ("CAIRO_PERF_OUTPUT") != NULL) { /* check output */ + char *filename; + cairo_status_t status; + + xasprintf (&filename, "%s.%s.%s.%d.out.png", + name, perf->target->name, + _content_to_string (perf->target->content, 0), + perf->size); + cairo_save (perf->cr); + perf_func (perf->cr, perf->size, perf->size, 1); + cairo_restore (perf->cr); + status = cairo_surface_write_to_png (cairo_get_target (perf->cr), filename); + if (status) { + fprintf (stderr, "Failed to generate output check '%s': %s\n", + filename, cairo_status_to_string (status)); + return; + } + + free (filename); + } + + if (cairo_perf_has_similar (perf)) + similar_iters = 2; + else + similar_iters = 1; + + for (similar = 0; similar < similar_iters; similar++) { + unsigned loops; + + if (perf->summary) { + fprintf (perf->summary, + "[%3d] %8s.%-5s %26s.%-3d ", + perf->test_number, perf->target->name, + _content_to_string (perf->target->content, similar), + name, perf->size); + fflush (perf->summary); + } + + /* We run one iteration in advance to warm caches and calibrate. */ + cairo_perf_yield (); + if (similar) + cairo_push_group_with_content (perf->cr, + cairo_boilerplate_content (perf->target->content)); + else + cairo_save (perf->cr); + perf_func (perf->cr, perf->size, perf->size, 1); + loops = cairo_perf_calibrate (perf, perf_func); + if (similar) + cairo_pattern_destroy (cairo_pop_group (perf->cr)); + else + cairo_restore (perf->cr); + + low_std_dev_count = 0; + for (i =0; i < perf->iterations; i++) { + cairo_perf_yield (); + if (similar) + cairo_push_group_with_content (perf->cr, + cairo_boilerplate_content (perf->target->content)); + else + cairo_save (perf->cr); + times[i] = perf_func (perf->cr, perf->size, perf->size, loops) ; + if (similar) + cairo_pattern_destroy (cairo_pop_group (perf->cr)); + else + cairo_restore (perf->cr); + if (perf->raw) { + if (i == 0) + printf ("[*] %s.%s %s.%d %g", + perf->target->name, + _content_to_string (perf->target->content, similar), + name, perf->size, + _cairo_time_to_double (_cairo_time_from_s (1.)) / 1000.); + printf (" %lld", (long long) (times[i] / (double) loops)); + } else if (! perf->exact_iterations) { + if (i > 0) { + _cairo_stats_compute (&stats, times, i+1); + + if (stats.std_dev <= CAIRO_PERF_LOW_STD_DEV) { + low_std_dev_count++; + if (low_std_dev_count >= CAIRO_PERF_STABLE_STD_DEV_COUNT) + break; + } else { + low_std_dev_count = 0; + } + } + } + } + + if (perf->raw) + printf ("\n"); + + if (perf->summary) { + _cairo_stats_compute (&stats, times, i); + if (count_func != NULL) { + double count = count_func (perf->cr, perf->size, perf->size); + fprintf (perf->summary, + "%.3f [%10lld/%d] %#8.3f %#8.3f %#5.2f%% %3d: %.2f\n", + stats.min_ticks /(double) loops, + (long long) stats.min_ticks, loops, + _cairo_time_to_s (stats.min_ticks) * 1000.0 / loops, + _cairo_time_to_s (stats.median_ticks) * 1000.0 / loops, + stats.std_dev * 100.0, stats.iterations, + count / _cairo_time_to_s (stats.min_ticks)); + } else { + fprintf (perf->summary, + "%.3f [%10lld/%d] %#8.3f %#8.3f %#5.2f%% %3d\n", + stats.min_ticks /(double) loops, + (long long) stats.min_ticks, loops, + _cairo_time_to_s (stats.min_ticks) * 1000.0 / loops, + _cairo_time_to_s (stats.median_ticks) * 1000.0 / loops, + stats.std_dev * 100.0, stats.iterations); + } + fflush (perf->summary); + } + + perf->test_number++; + } +} + +static void +usage (const char *argv0) +{ + fprintf (stderr, +"Usage: %s [-flrv] [-i iterations] [test-names ...]\n" +"\n" +"Run the cairo performance test suite over the given tests (all by default)\n" +"The command-line arguments are interpreted as follows:\n" +"\n" +" -f fast; faster, less accurate\n" +" -i iterations; specify the number of iterations per test case\n" +" -l list only; just list selected test case names without executing\n" +" -r raw; display each time measurement instead of summary statistics\n" +" -v verbose; in raw mode also show the summaries\n" +"\n" +"If test names are given they are used as sub-string matches so a command\n" +"such as \"%s text\" can be used to run all text test cases.\n", + argv0, argv0); +} + +static void +parse_options (cairo_perf_t *perf, + int argc, + char *argv[]) +{ + int c; + const char *iters; + const char *ms = NULL; + char *end; + int verbose = 0; + + if ((iters = getenv("CAIRO_PERF_ITERATIONS")) && *iters) + perf->iterations = strtol(iters, NULL, 0); + else + perf->iterations = CAIRO_PERF_ITERATIONS_DEFAULT; + perf->exact_iterations = 0; + + perf->fast_and_sloppy = FALSE; + perf->ms_per_iteration = CAIRO_PERF_ITERATION_MS_DEFAULT; + if ((ms = getenv("CAIRO_PERF_ITERATION_MS")) && *ms) { + perf->ms_per_iteration = atof(ms); + } + + perf->raw = FALSE; + perf->list_only = FALSE; + perf->names = NULL; + perf->num_names = 0; + perf->summary = stdout; + + while (1) { + c = _cairo_getopt (argc, argv, "fi:lrv"); + if (c == -1) + break; + + switch (c) { + case 'f': + perf->fast_and_sloppy = TRUE; + if (ms == NULL) + perf->ms_per_iteration = CAIRO_PERF_ITERATION_MS_FAST; + break; + case 'i': + perf->exact_iterations = TRUE; + perf->iterations = strtoul (optarg, &end, 10); + if (*end != '\0') { + fprintf (stderr, "Invalid argument for -i (not an integer): %s\n", + optarg); + exit (1); + } + break; + case 'l': + perf->list_only = TRUE; + break; + case 'r': + perf->raw = TRUE; + perf->summary = NULL; + break; + case 'v': + verbose = 1; + break; + default: + fprintf (stderr, "Internal error: unhandled option: %c\n", c); + /* fall-through */ + case '?': + usage (argv[0]); + exit (1); + } + } + + if (verbose && perf->summary == NULL) + perf->summary = stderr; + + if (optind < argc) { + perf->names = &argv[optind]; + perf->num_names = argc - optind; + } +} + +static int +check_cpu_affinity (void) +{ +#ifdef HAVE_SCHED_GETAFFINITY + + cpu_set_t affinity; + int i, cpu_count; + + if (sched_getaffinity(0, sizeof(affinity), &affinity)) { + perror("sched_getaffinity"); + return -1; + } + + for(i = 0, cpu_count = 0; i < CPU_SETSIZE; ++i) { + if (CPU_ISSET(i, &affinity)) + ++cpu_count; + } + + if (cpu_count > 1) { + fputs( + "WARNING: cairo-perf has not been bound to a single CPU.\n", + stderr); + return -1; + } + + return 0; +#else + fputs( + "WARNING: Cannot check CPU affinity for this platform.\n", + stderr); + return -1; +#endif +} + +static void +cairo_perf_fini (cairo_perf_t *perf) +{ + cairo_boilerplate_free_targets (perf->targets); + cairo_boilerplate_fini (); + + free (perf->times); + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif +} + + +int +main (int argc, + char *argv[]) +{ + int i, j; + cairo_perf_t perf; + cairo_surface_t *surface; + + parse_options (&perf, argc, argv); + + if (check_cpu_affinity()) { + fputs( + "NOTICE: cairo-perf and the X server should be bound to CPUs (either the same\n" + "or separate) on SMP systems. Not doing so causes random results when the X\n" + "server is moved to or from cairo-perf's CPU during the benchmarks:\n" + "\n" + " $ sudo taskset -cp 0 $(pidof X)\n" + " $ taskset -cp 1 $$\n" + "\n" + "See taskset(1) for information about changing CPU affinity.\n", + stderr); + } + + perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL); + perf.times = xmalloc (perf.iterations * sizeof (cairo_time_t)); + + for (i = 0; i < perf.num_targets; i++) { + const cairo_boilerplate_target_t *target = perf.targets[i]; + + if (! target->is_measurable) + continue; + + perf.target = target; + perf.test_number = 0; + + for (j = 0; perf_cases[j].run; j++) { + const cairo_perf_case_t *perf_case = &perf_cases[j]; + + if (! perf_case->enabled (&perf)) + continue; + + for (perf.size = perf_case->min_size; + perf.size <= perf_case->max_size; + perf.size *= 2) + { + void *closure; + + surface = (target->create_surface) (NULL, + target->content, + perf.size, perf.size, + perf.size, perf.size, + CAIRO_BOILERPLATE_MODE_PERF, + &closure); + if (surface == NULL) { + fprintf (stderr, + "Error: Failed to create target surface: %s\n", + target->name); + continue; + } + + cairo_perf_timer_set_synchronize (target->synchronize, closure); + + perf.cr = cairo_create (surface); + + perf_case->run (&perf, perf.cr, perf.size, perf.size); + + if (cairo_status (perf.cr)) { + fprintf (stderr, "Error: Test left cairo in an error state: %s\n", + cairo_status_to_string (cairo_status (perf.cr))); + } + + cairo_destroy (perf.cr); + cairo_surface_destroy (surface); + + if (target->cleanup) + target->cleanup (closure); + } + } + } + + cairo_perf_fini (&perf); + + return 0; +} + +#define FUNC(f) f, f##_enabled +const cairo_perf_case_t perf_cases[] = { + { FUNC(pixel), 1, 1 }, + { FUNC(a1_pixel), 1, 1 }, + { FUNC(paint), 64, 512}, + { FUNC(paint_with_alpha), 64, 512}, + { FUNC(fill), 64, 512}, + { FUNC(stroke), 64, 512}, + { FUNC(text), 64, 512}, + { FUNC(glyphs), 64, 512}, + { FUNC(mask), 64, 512}, + { FUNC(line), 32, 512}, + { FUNC(a1_line), 32, 512}, + { FUNC(curve), 32, 512}, + { FUNC(a1_curve), 32, 512}, + { FUNC(disjoint), 64, 512}, + { FUNC(hatching), 64, 512}, + { FUNC(tessellate), 100, 100}, + { FUNC(subimage_copy), 16, 512}, + { FUNC(hash_table), 16, 16}, + { FUNC(pattern_create_radial), 16, 16}, + { FUNC(zrusin), 415, 415}, + { FUNC(world_map), 800, 800}, + { FUNC(box_outline), 100, 100}, + { FUNC(mosaic), 800, 800 }, + { FUNC(long_lines), 100, 100}, + { FUNC(unaligned_clip), 100, 100}, + { FUNC(rectangles), 512, 512}, + { FUNC(rounded_rectangles), 512, 512}, + { FUNC(long_dashed_lines), 512, 512}, + { FUNC(composite_checker), 16, 512}, + { FUNC(twin), 800, 800}, + { FUNC(dragon), 1024, 1024 }, + { FUNC(sierpinski), 32, 1024 }, + { FUNC(pythagoras_tree), 768, 768 }, + { FUNC(intersections), 512, 512 }, + { FUNC(many_strokes), 32, 512 }, + { FUNC(wide_strokes), 32, 512 }, + { FUNC(many_fills), 32, 512 }, + { FUNC(wide_fills), 32, 512 }, + { FUNC(many_curves), 32, 512 }, + { FUNC(spiral), 512, 512 }, + { FUNC(wave), 500, 500 }, + { FUNC(fill_clip), 16, 512 }, + { FUNC(tiger), 16, 1024 }, + { NULL } +}; diff --git a/perf/cairo-perf-print.c b/perf/cairo-perf-print.c new file mode 100644 index 000000000..d7ae1311e --- /dev/null +++ b/perf/cairo-perf-print.c @@ -0,0 +1,139 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + * Chris Wilson + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-perf.h" +#include "cairo-stats.h" + +#include + +#if HAVE_UNISTD_H && HAVE_SYS_IOCTL_H +#define USE_TERMINAL_SIZE 1 +#else +#define USE_TERMINAL_SIZE 0 +#endif + +#if USE_TERMINAL_SIZE +#include +#include +#endif + +static void +report_print (const cairo_perf_report_t *report, + int show_histogram) +{ + const test_report_t *test; + cairo_histogram_t h; + + if (show_histogram) { + int num_rows = 23; + int num_cols = 80; + +#if USE_TERMINAL_SIZE + int fd = fileno(stdout); + if (isatty(fd)) { + struct winsize ws; + + if(ioctl(fd, TIOCGWINSZ, &ws) == 0 ) { + num_rows = ws.ws_row - 1; + num_cols = ws.ws_col; + } + } +#endif + + if (!_cairo_histogram_init (&h, num_cols, num_rows)) + show_histogram = 0; + } + + for (test = report->tests; test->name != NULL; test++) { + if (test->stats.iterations == 0) + continue; + + if (show_histogram) { + const cairo_time_t *values; + int num_values; + + if (show_histogram > 1) { + values = test->stats.values; + num_values = test->stats.iterations; + } else { + values = test->samples; + num_values = test->samples_count; + } + + if (_cairo_histogram_compute (&h, values, num_values)) + _cairo_histogram_printf (&h, stdout); + } + + if (test->size) { + printf ("%5s-%-4s %26s-%-3d ", + test->backend, test->content, + test->name, test->size); + } else { + printf ("%5s %26s ", test->backend, test->name); + } + printf("%6.2f %4.2f%% (%d/%d)\n", + test->stats.median_ticks / test->stats.ticks_per_ms, + test->stats.std_dev * 100, + test->stats.iterations, test->samples_count); + } + + if (show_histogram) + _cairo_histogram_fini (&h); +} + +int +main (int argc, + const char *argv[]) +{ + cairo_bool_t show_histogram = 0; + int i; + + for (i = 1; i < argc; i++ ) { + cairo_perf_report_t report; + + if (strcmp(argv[i], "--histogram") == 0) { + show_histogram = 1; + continue; + } + + if (strcmp(argv[i], "--short-histogram") == 0) { + show_histogram = 2; + continue; + } + + cairo_perf_report_load (&report, argv[i], i, NULL); + report_print (&report, show_histogram); + } + + return 0; +} diff --git a/perf/cairo-perf-report.c b/perf/cairo-perf-report.c new file mode 100644 index 000000000..2325f4793 --- /dev/null +++ b/perf/cairo-perf-report.c @@ -0,0 +1,454 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + */ + +#define _GETDELIM 1/* for getline() on AIX */ + +#include "cairo-perf.h" +#include "cairo-missing.h" +#include "cairo-stats.h" + +/* We use _GNU_SOURCE for getline and strndup if available. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LIBGEN_H +#include +#endif + +#ifdef _MSC_VER +static long long +strtoll (const char *nptr, + char **endptr, + int base); + +static char * +basename (char *path); +#endif + +/* Ad-hoc parsing, macros with a strong dependence on the calling + * context, and plenty of other ugliness is here. But at least it's + * not perl... */ +#define parse_error(...) fprintf(stderr, __VA_ARGS__); return TEST_REPORT_STATUS_ERROR; +#define skip_char(c) \ +do { \ + if (*s && *s == (c)) { \ + s++; \ + } else { \ + parse_error ("expected '%c' but found '%c'", c, *s); \ + } \ +} while (0) +#define skip_space() while (*s && (*s == ' ' || *s == '\t')) s++; +#define parse_int(result) \ +do { \ + (result) = strtol (s, &end, 10); \ + if (*s && end != s) { \ + s = end; \ + } else { \ + parse_error("expected integer but found %s", s); \ + } \ +} while (0) +#define parse_long_long(result) \ +do { \ + (result) = strtoll (s, &end, 10); \ + if (*s && end != s) { \ + s = end; \ + } else { \ + parse_error("expected integer but found %s", s); \ + } \ +} while (0) +#define parse_double(result) \ +do { \ + (result) = strtod (s, &end); \ + if (*s && end != s) { \ + s = end; \ + } else { \ + parse_error("expected floating-point value but found %s", s); \ + } \ +} while (0) +/* Here a string is simply a sequence of non-whitespace */ +#define parse_string(result) \ +do { \ + for (end = s; *end; end++) \ + if (isspace (*end)) \ + break; \ + (result) = strndup (s, end - s); \ + if ((result) == NULL) { \ + fprintf (stderr, "Out of memory.\n"); \ + exit (1); \ + } \ + s = end; \ +} while (0) + +static test_report_status_t +test_report_parse (test_report_t *report, + int fileno, + char *line, + char *configuration) +{ + char *end; + char *s = line; + cairo_bool_t is_raw = FALSE; + double min_time, median_time; + + /* The code here looks funny unless you understand that these are + * all macro calls, (and then the code just looks sick). */ + if (*s == '\n') + return TEST_REPORT_STATUS_COMMENT; + + skip_char ('['); + skip_space (); + if (*s == '#') + return TEST_REPORT_STATUS_COMMENT; + if (*s == '*') { + s++; + is_raw = TRUE; + } else { + parse_int (report->id); + } + skip_char (']'); + + skip_space (); + + report->fileno = fileno; + report->configuration = configuration; + parse_string (report->backend); + end = strrchr (report->backend, '.'); + if (end) + *end++ = '\0'; + report->content = end ? end : xstrdup ("???"); + + skip_space (); + + parse_string (report->name); + end = strrchr (report->name, '.'); + if (end) + *end++ = '\0'; + report->size = end ? atoi (end) : 0; + + skip_space (); + + report->samples = NULL; + report->samples_size = 0; + report->samples_count = 0; + + if (is_raw) { + parse_double (report->stats.ticks_per_ms); + skip_space (); + + report->samples_size = 5; + report->samples = xmalloc (report->samples_size * sizeof (cairo_time_t)); + report->stats.min_ticks = 0; + do { + if (report->samples_count == report->samples_size) { + report->samples_size *= 2; + report->samples = xrealloc (report->samples, + report->samples_size * sizeof (cairo_time_t)); + } + parse_long_long (report->samples[report->samples_count]); + if (report->samples_count == 0) { + report->stats.min_ticks = + report->samples[report->samples_count]; + } else if (report->stats.min_ticks > + report->samples[report->samples_count]){ + report->stats.min_ticks = + report->samples[report->samples_count]; + } + report->samples_count++; + skip_space (); + } while (*s && *s != '\n'); + report->stats.iterations = 0; + if (*s) skip_char ('\n'); + } else { + parse_double (report->stats.min_ticks); + skip_space (); + + parse_double (min_time); + report->stats.ticks_per_ms = report->stats.min_ticks / min_time; + + skip_space (); + + parse_double (median_time); + report->stats.median_ticks = median_time * report->stats.ticks_per_ms; + + skip_space (); + + parse_double (report->stats.std_dev); + report->stats.std_dev /= 100.0; + skip_char ('%'); + + skip_space (); + + parse_int (report->stats.iterations); + + skip_space (); + skip_char ('\n'); + } + + return TEST_REPORT_STATUS_SUCCESS; +} + +/* We provide hereafter a win32 implementation of the basename + * and strtoll functions which are not available otherwise. + * The basename function is fully compliant to its GNU specs. + */ +#ifdef _MSC_VER +long long +strtoll (const char *nptr, + char **endptr, + int base) +{ + return _atoi64(nptr); +} + +static char * +basename (char *path) +{ + char *end, *s; + + end = (path + strlen(path) - 1); + while (end && (end >= path + 1) && (*end == '/')) { + *end = '\0'; + end--; + } + + s = strrchr(path, '/'); + if (s) { + if (s == end) { + return s; + } else { + return s+1; + } + } else { + return path; + } +} +#endif /* ifndef _MSC_VER */ + +int +test_report_cmp_backend_then_name (const void *a, + const void *b) +{ + const test_report_t *a_test = a; + const test_report_t *b_test = b; + + int cmp; + + cmp = strcmp (a_test->backend, b_test->backend); + if (cmp) + return cmp; + + cmp = strcmp (a_test->content, b_test->content); + if (cmp) + return cmp; + + /* A NULL name is a list-termination marker, so force it last. */ + if (a_test->name == NULL) + if (b_test->name == NULL) + return 0; + else + return 1; + else if (b_test->name == NULL) + return -1; + + cmp = strcmp (a_test->name, b_test->name); + if (cmp) + return cmp; + + if (a_test->size < b_test->size) + return -1; + if (a_test->size > b_test->size) + return 1; + + return 0; +} + +int +test_report_cmp_name (const void *a, + const void *b) +{ + const test_report_t *a_test = a; + const test_report_t *b_test = b; + + int cmp; + + /* A NULL name is a list-termination marker, so force it last. */ + if (a_test->name == NULL) + if (b_test->name == NULL) + return 0; + else + return 1; + else if (b_test->name == NULL) + return -1; + + cmp = strcmp (a_test->name, b_test->name); + if (cmp) + return cmp; + + if (a_test->size < b_test->size) + return -1; + if (a_test->size > b_test->size) + return 1; + + return 0; +} + +void +cairo_perf_report_sort_and_compute_stats (cairo_perf_report_t *report, + int (*cmp) (const void*, const void*)) +{ + test_report_t *base, *next, *last, *t; + + if (cmp == NULL) + cmp = test_report_cmp_backend_then_name; + + /* First we sort, since the diff needs both lists in the same + * order */ + qsort (report->tests, report->tests_count, sizeof (test_report_t), cmp); + + /* The sorting also brings all related raw reports together so we + * can condense them and compute the stats. + */ + base = &report->tests[0]; + last = &report->tests[report->tests_count - 1]; + while (base <= last) { + next = base+1; + if (next <= last) { + while (next <= last && + test_report_cmp_backend_then_name (base, next) == 0) + { + next++; + } + if (next != base) { + unsigned int new_samples_count = base->samples_count; + for (t = base + 1; t < next; t++) + new_samples_count += t->samples_count; + if (new_samples_count > base->samples_size) { + base->samples_size = new_samples_count; + base->samples = xrealloc (base->samples, + base->samples_size * sizeof (cairo_time_t)); + } + for (t = base + 1; t < next; t++) { + memcpy (&base->samples[base->samples_count], t->samples, + t->samples_count * sizeof (cairo_time_t)); + base->samples_count += t->samples_count; + } + } + } + if (base->samples) + _cairo_stats_compute (&base->stats, base->samples, base->samples_count); + base = next; + } +} + +void +cairo_perf_report_load (cairo_perf_report_t *report, + const char *filename, int id, + int (*cmp) (const void *, const void *)) +{ + FILE *file; + test_report_status_t status; + int line_number = 0; + char *line = NULL; + size_t line_size = 0; + char *configuration; + char *dot; + char *baseName; + const char *name; + + name = filename; + if (name == NULL) + name = "stdin"; + + configuration = xstrdup (name); + baseName = basename (configuration); + report->configuration = xstrdup (baseName); + free (configuration); + + dot = strrchr (report->configuration, '.'); + if (dot) + *dot = '\0'; + + report->name = name; + report->tests_size = 16; + report->tests = xmalloc (report->tests_size * sizeof (test_report_t)); + report->tests_count = 0; + report->fileno = id; + + if (filename == NULL) { + file = stdin; + } else { + file = fopen (filename, "r"); + if (file == NULL) { + fprintf (stderr, "Failed to open %s: %s\n", + filename, strerror (errno)); + exit (1); + } + } + + while (1) { + if (report->tests_count == report->tests_size) { + report->tests_size *= 2; + report->tests = xrealloc (report->tests, + report->tests_size * sizeof (test_report_t)); + } + + line_number++; + if (getline (&line, &line_size, file) == -1) + break; + + status = test_report_parse (&report->tests[report->tests_count], + id, line, report->configuration); + if (status == TEST_REPORT_STATUS_ERROR) + fprintf (stderr, "Ignoring unrecognized line %d of %s:\n%s", + line_number, filename, line); + if (status == TEST_REPORT_STATUS_SUCCESS) + report->tests_count++; + /* Do nothing on TEST_REPORT_STATUS_COMMENT */ + } + + free (line); + + if (filename != NULL) + fclose (file); + + cairo_perf_report_sort_and_compute_stats (report, cmp); + + /* Add one final report with a NULL name to terminate the list. */ + if (report->tests_count == report->tests_size) { + report->tests_size *= 2; + report->tests = xrealloc (report->tests, + report->tests_size * sizeof (test_report_t)); + } + report->tests[report->tests_count].name = NULL; +} diff --git a/perf/cairo-perf-trace.c b/perf/cairo-perf-trace.c new file mode 100644 index 000000000..02e0e29f9 --- /dev/null +++ b/perf/cairo-perf-trace.c @@ -0,0 +1,1067 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2006 Mozilla Corporation + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Vladimir Vukicevic + * Carl Worth + * Chris Wilson + */ + +#define _GNU_SOURCE 1 /* for sched_getaffinity() and getline() */ + +#include "../cairo-version.h" /* for the real version */ + +#include "cairo-missing.h" +#include "cairo-perf.h" +#include "cairo-stats.h" + +#include "cairo-boilerplate-getopt.h" +#include +#include /* for INTERNAL_SURFACE_TYPE */ + +/* rudely reuse bits of the library... */ +#include "../src/cairo-hash-private.h" +#include "../src/cairo-error-private.h" + +/* For basename */ +#ifdef HAVE_LIBGEN_H +#include +#endif +#include /* isspace() */ + +#include +#include + +#ifdef _MSC_VER +#include "dirent-win32.h" + +static char * +basename_no_ext (char *path) +{ + static char name[_MAX_FNAME + 1]; + + _splitpath (path, NULL, NULL, name, NULL); + + name[_MAX_FNAME] = '\0'; + + return name; +} + + +#else +#include + +static char * +basename_no_ext (char *path) +{ + char *dot, *name; + + name = basename (path); + + dot = strrchr (name, '.'); + if (dot) + *dot = '\0'; + + return name; +} + +#endif + +#if HAVE_UNISTD_H +#include +#endif + +#include + +#if HAVE_FCFINI +#include +#endif + +#define CAIRO_PERF_ITERATIONS_DEFAULT 15 +#define CAIRO_PERF_LOW_STD_DEV 0.05 +#define CAIRO_PERF_MIN_STD_DEV_COUNT 3 +#define CAIRO_PERF_STABLE_STD_DEV_COUNT 3 + +struct trace { + const cairo_boilerplate_target_t *target; + void *closure; + cairo_surface_t *surface; + cairo_bool_t observe; + int tile_size; +}; + +cairo_bool_t +cairo_perf_can_run (cairo_perf_t *perf, + const char *name, + cairo_bool_t *is_explicit) +{ + unsigned int i; + char *copy, *dot; + cairo_bool_t ret; + + if (is_explicit) + *is_explicit = FALSE; + + if (perf->exact_names) { + if (is_explicit) + *is_explicit = TRUE; + return TRUE; + } + + if (perf->num_names == 0 && perf->num_exclude_names == 0) + return TRUE; + + copy = xstrdup (name); + dot = strrchr (copy, '.'); + if (dot != NULL) + *dot = '\0'; + + if (perf->num_names) { + ret = TRUE; + for (i = 0; i < perf->num_names; i++) + if (strstr (copy, perf->names[i])) { + if (is_explicit) + *is_explicit = strcmp (copy, perf->names[i]) == 0; + goto check_exclude; + } + + ret = FALSE; + goto done; + } + +check_exclude: + if (perf->num_exclude_names) { + ret = FALSE; + for (i = 0; i < perf->num_exclude_names; i++) + if (strstr (copy, perf->exclude_names[i])) { + if (is_explicit) + *is_explicit = strcmp (copy, perf->exclude_names[i]) == 0; + goto done; + } + + ret = TRUE; + goto done; + } + +done: + free (copy); + + return ret; +} + +static void +fill_surface (cairo_surface_t *surface) +{ + cairo_t *cr = cairo_create (surface); + /* This needs to be an operation that the backends can't optimise away */ + cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint (cr); + cairo_destroy (cr); +} + +struct scache { + cairo_hash_entry_t entry; + cairo_content_t content; + int width, height; + cairo_surface_t *surface; +}; + +static cairo_hash_table_t *surface_cache; +static cairo_surface_t *surface_holdovers[16]; + +static cairo_bool_t +scache_equal (const void *A, + const void *B) +{ + const struct scache *a = A, *b = B; + return a->entry.hash == b->entry.hash; +} + +static void +scache_mark_active (cairo_surface_t *surface) +{ + cairo_surface_t *t0, *t1; + unsigned n; + + if (surface_cache == NULL) + return; + + t0 = cairo_surface_reference (surface); + for (n = 0; n < ARRAY_LENGTH (surface_holdovers); n++) { + if (surface_holdovers[n] == surface) { + surface_holdovers[n] = t0; + t0 = surface; + break; + } + + t1 = surface_holdovers[n]; + surface_holdovers[n] = t0; + t0 = t1; + } + cairo_surface_destroy (t0); +} + +static void +scache_clear (void) +{ + unsigned n; + + if (surface_cache == NULL) + return; + + for (n = 0; n < ARRAY_LENGTH (surface_holdovers); n++) { + cairo_surface_destroy (surface_holdovers[n]); + surface_holdovers[n] = NULL; + } +} + +static void +scache_remove (void *closure) +{ + _cairo_hash_table_remove (surface_cache, closure); + free (closure); +} + +static cairo_surface_t * +_similar_surface_create (void *closure, + cairo_content_t content, + double width, + double height, + long uid) +{ + struct trace *args = closure; + cairo_surface_t *surface; + struct scache skey, *s; + + if (args->observe) + return cairo_surface_create_similar (args->surface, + content, width, height); + + if (uid == 0 || surface_cache == NULL) + return args->target->create_similar (args->surface, content, width, height); + + skey.entry.hash = uid; + s = _cairo_hash_table_lookup (surface_cache, &skey.entry); + if (s != NULL) { + if (s->content == content && + s->width == width && + s->height == height) + { + return cairo_surface_reference (s->surface); + } + + /* The surface has been resized, allow the original entry to expire + * as it becomes inactive. + */ + } + + surface = args->target->create_similar (args->surface, content, width, height); + s = malloc (sizeof (struct scache)); + if (s == NULL) + return surface; + + s->entry.hash = uid; + s->content = content; + s->width = width; + s->height = height; + s->surface = surface; + if (_cairo_hash_table_insert (surface_cache, &s->entry)) { + free (s); + } else if (cairo_surface_set_user_data + (surface, + (const cairo_user_data_key_t *) &surface_cache, + s, scache_remove)) + { + scache_remove (s); + } + + return surface; +} + +static cairo_surface_t * +_source_image_create (void *closure, + cairo_format_t format, + int width, + int height, + long uid) +{ + struct trace *args = closure; + + return cairo_surface_create_similar_image (args->surface, + format, width, height); +} + +static cairo_t * +_context_create (void *closure, + cairo_surface_t *surface) +{ + scache_mark_active (surface); + return cairo_create (surface); +} + +static int user_interrupt; + +static void +interrupt (int sig) +{ + if (user_interrupt) { + signal (sig, SIG_DFL); + raise (sig); + } + + user_interrupt = 1; +} + +static void +describe (cairo_perf_t *perf, + void *closure) +{ + char *description = NULL; + + if (perf->has_described_backend) + return; + perf->has_described_backend = TRUE; + + if (perf->target->describe) + description = perf->target->describe (closure); + + if (description == NULL) + return; + + if (perf->raw) { + printf ("[ # ] %s: %s\n", perf->target->name, description); + } + + if (perf->summary) { + fprintf (perf->summary, + "[ # ] %8s: %s\n", + perf->target->name, + description); + } + + free (description); +} + +static void +usage (const char *argv0) +{ + fprintf (stderr, +"Usage: %s [-clrsv] [-i iterations] [-t tile-size] [-x exclude-file] [test-names ... | traces ...]\n" +"\n" +"Run the cairo performance test suite over the given tests (all by default)\n" +"The command-line arguments are interpreted as follows:\n" +"\n" +" -c use surface cache; keep a cache of surfaces to be reused\n" +" -i iterations; specify the number of iterations per test case\n" +" -l list only; just list selected test case names without executing\n" +" -r raw; display each time measurement instead of summary statistics\n" +" -s sync; only sum the elapsed time of the indiviual operations\n" +" -t tile size; draw to tiled surfaces\n" +" -v verbose; in raw mode also show the summaries\n" +" -x exclude; specify a file to read a list of traces to exclude\n" +"\n" +"If test names are given they are used as sub-string matches so a command\n" +"such as \"%s firefox\" can be used to run all firefox traces.\n" +"Alternatively, you can specify a list of filenames to execute.\n", + argv0, argv0); +} + +static cairo_bool_t +read_excludes (cairo_perf_t *perf, + const char *filename) +{ + FILE *file; + char *line = NULL; + size_t line_size = 0; + char *s, *t; + + file = fopen (filename, "r"); + if (file == NULL) + return FALSE; + + while (getline (&line, &line_size, file) != -1) { + /* terminate the line at a comment marker '#' */ + s = strchr (line, '#'); + if (s) + *s = '\0'; + + /* whitespace delimits */ + s = line; + while (*s != '\0' && isspace (*s)) + s++; + + t = s; + while (*t != '\0' && ! isspace (*t)) + t++; + + if (s != t) { + int i = perf->num_exclude_names; + perf->exclude_names = xrealloc (perf->exclude_names, + sizeof (char *) * (i+1)); + perf->exclude_names[i] = strndup (s, t-s); + perf->num_exclude_names++; + } + } + free (line); + + fclose (file); + + return TRUE; +} + +static void +parse_options (cairo_perf_t *perf, + int argc, + char *argv[]) +{ + int c; + const char *iters; + char *end; + int verbose = 0; + int use_surface_cache = 0; + + if ((iters = getenv ("CAIRO_PERF_ITERATIONS")) && *iters) + perf->iterations = strtol (iters, NULL, 0); + else + perf->iterations = CAIRO_PERF_ITERATIONS_DEFAULT; + perf->exact_iterations = 0; + + perf->raw = FALSE; + perf->observe = FALSE; + perf->list_only = FALSE; + perf->tile_size = 0; + perf->names = NULL; + perf->num_names = 0; + perf->summary = stdout; + perf->summary_continuous = FALSE; + perf->exclude_names = NULL; + perf->num_exclude_names = 0; + + while (1) { + c = _cairo_getopt (argc, argv, "ci:lrst:vx:"); + if (c == -1) + break; + + switch (c) { + case 'c': + use_surface_cache = 1; + break; + case 'i': + perf->exact_iterations = TRUE; + perf->iterations = strtoul (optarg, &end, 10); + if (*end != '\0') { + fprintf (stderr, "Invalid argument for -i (not an integer): %s\n", + optarg); + exit (1); + } + break; + case 'l': + perf->list_only = TRUE; + break; + case 'r': + perf->raw = TRUE; + perf->summary = NULL; + break; + case 's': + perf->observe = TRUE; + break; + case 't': + perf->tile_size = strtoul (optarg, &end, 10); + if (*end != '\0') { + fprintf (stderr, "Invalid argument for -t (not an integer): %s\n", + optarg); + exit (1); + } + break; + case 'v': + verbose = 1; + break; + case 'x': + if (! read_excludes (perf, optarg)) { + fprintf (stderr, "Invalid argument for -x (not readable file): %s\n", + optarg); + exit (1); + } + break; + default: + fprintf (stderr, "Internal error: unhandled option: %c\n", c); + /* fall-through */ + case '?': + usage (argv[0]); + exit (1); + } + } + + if (perf->observe && perf->tile_size) { + fprintf (stderr, "Can't mix observer and tiling. Sorry.\n"); + exit (1); + } + + if (verbose && perf->summary == NULL) + perf->summary = stderr; +#if HAVE_UNISTD_H + if (perf->summary && isatty (fileno (perf->summary))) + perf->summary_continuous = TRUE; +#endif + + if (optind < argc) { + perf->names = &argv[optind]; + perf->num_names = argc - optind; + } + + if (use_surface_cache) + surface_cache = _cairo_hash_table_create (scache_equal); +} + +static void +cairo_perf_fini (cairo_perf_t *perf) +{ + cairo_boilerplate_free_targets (perf->targets); + cairo_boilerplate_fini (); + + free (perf->times); + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif +} + +static cairo_bool_t +have_trace_filenames (cairo_perf_t *perf) +{ + unsigned int i; + + if (perf->num_names == 0) + return FALSE; + +#if HAVE_UNISTD_H + for (i = 0; i < perf->num_names; i++) + if (access (perf->names[i], R_OK) == 0) + return TRUE; +#endif + + return FALSE; +} + +static void +_tiling_surface_finish (cairo_surface_t *observer, + cairo_surface_t *target, + void *closure) +{ + struct trace *args = closure; + cairo_surface_t *surface; + cairo_content_t content; + cairo_rectangle_t r; + int width, height; + int x, y, w, h; + + cairo_recording_surface_get_extents (target, &r); + w = r.width; + h = r.height; + + content = cairo_surface_get_content (target); + + for (y = 0; y < h; y += args->tile_size) { + height = args->tile_size; + if (y + height > h) + height = h - y; + + for (x = 0; x < w; x += args->tile_size) { + cairo_t *cr; + + width = args->tile_size; + if (x + width > w) + width = w - x; + + /* XXX to correctly observe the playback we would need + * to replay the target onto the observer directly. + */ + surface = args->target->create_similar (args->surface, + content, width, height); + + cr = cairo_create (surface); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, target, -x, -y); + cairo_paint (cr); + cairo_destroy (cr); + + cairo_surface_destroy (surface); + } + } +} + +static cairo_surface_t * +_tiling_surface_create (void *closure, + cairo_content_t content, + double width, + double height, + long uid) +{ + cairo_rectangle_t r; + cairo_surface_t *surface, *observer; + + r.x = r.y = 0; + r.width = width; + r.height = height; + + surface = cairo_recording_surface_create (content, &r); + observer = cairo_surface_create_observer (surface, + CAIRO_SURFACE_OBSERVER_NORMAL); + cairo_surface_destroy (surface); + + cairo_surface_observer_add_finish_callback (observer, + _tiling_surface_finish, + closure); + + return observer; +} + +static void +cairo_perf_trace (cairo_perf_t *perf, + const cairo_boilerplate_target_t *target, + const char *trace) +{ + static cairo_bool_t first_run = TRUE; + unsigned int i; + cairo_time_t *times, *paint, *mask, *fill, *stroke, *glyphs; + cairo_stats_t stats = {0.0, 0.0}; + struct trace args = { target }; + int low_std_dev_count; + char *trace_cpy, *name; + const cairo_script_interpreter_hooks_t hooks = { + &args, + perf->tile_size ? _tiling_surface_create : _similar_surface_create, + NULL, /* surface_destroy */ + _context_create, + NULL, /* context_destroy */ + NULL, /* show_page */ + NULL, /* copy_page */ + _source_image_create, + }; + + args.tile_size = perf->tile_size; + args.observe = perf->observe; + + trace_cpy = xstrdup (trace); + name = basename_no_ext (trace_cpy); + + if (perf->list_only) { + printf ("%s\n", name); + free (trace_cpy); + return; + } + + if (first_run) { + if (perf->raw) { + printf ("[ # ] %s.%-s %s %s %s ...\n", + "backend", "content", "test-size", "ticks-per-ms", "time(ticks)"); + } + + if (perf->summary) { + if (perf->observe) { + fprintf (perf->summary, + "[ # ] %8s %28s %9s %9s %9s %9s %9s %9s %5s\n", + "backend", "test", + "total(s)", "paint(s)", "mask(s)", "fill(s)", "stroke(s)", "glyphs(s)", + "count"); + } else { + fprintf (perf->summary, + "[ # ] %8s %28s %8s %5s %5s %s\n", + "backend", "test", "min(s)", "median(s)", + "stddev.", "count"); + } + } + first_run = FALSE; + } + + times = perf->times; + paint = times + perf->iterations; + mask = paint + perf->iterations; + stroke = mask + perf->iterations; + fill = stroke + perf->iterations; + glyphs = fill + perf->iterations; + + low_std_dev_count = 0; + for (i = 0; i < perf->iterations && ! user_interrupt; i++) { + cairo_script_interpreter_t *csi; + cairo_status_t status; + unsigned int line_no; + + args.surface = target->create_surface (NULL, + CAIRO_CONTENT_COLOR_ALPHA, + 1, 1, + 1, 1, + CAIRO_BOILERPLATE_MODE_PERF, + &args.closure); + fill_surface(args.surface); /* remove any clear flags */ + + if (perf->observe) { + cairo_surface_t *obs; + obs = cairo_surface_create_observer (args.surface, + CAIRO_SURFACE_OBSERVER_NORMAL); + cairo_surface_destroy (args.surface); + args.surface = obs; + } + if (cairo_surface_status (args.surface)) { + fprintf (stderr, + "Error: Failed to create target surface: %s\n", + target->name); + return; + } + + cairo_perf_timer_set_synchronize (target->synchronize, args.closure); + + if (i == 0) { + describe (perf, args.closure); + if (perf->summary) { + fprintf (perf->summary, + "[%3d] %8s %28s ", + perf->test_number, + perf->target->name, + name); + fflush (perf->summary); + } + } + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + + if (! perf->observe) { + cairo_perf_yield (); + cairo_perf_timer_start (); + } + + cairo_script_interpreter_run (csi, trace); + line_no = cairo_script_interpreter_get_line_number (csi); + + /* Finish before querying timings in case we are using an intermediate + * target and so need to destroy all surfaces before rendering + * commences. + */ + cairo_script_interpreter_finish (csi); + + if (perf->observe) { + cairo_device_t *observer = cairo_surface_get_device (args.surface); + times[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_elapsed (observer)); + paint[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_paint_elapsed (observer)); + mask[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_mask_elapsed (observer)); + stroke[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_stroke_elapsed (observer)); + fill[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_fill_elapsed (observer)); + glyphs[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_glyphs_elapsed (observer)); + } else { + fill_surface (args.surface); /* queue a write to the sync'ed surface */ + cairo_perf_timer_stop (); + times[i] = cairo_perf_timer_elapsed (); + } + + scache_clear (); + + cairo_surface_destroy (args.surface); + + if (target->cleanup) + target->cleanup (args.closure); + + status = cairo_script_interpreter_destroy (csi); + if (status) { + if (perf->summary) { + fprintf (perf->summary, "Error during replay, line %d: %s\n", + line_no, + cairo_status_to_string (status)); + } + goto out; + } + + if (perf->raw) { + if (i == 0) + printf ("[*] %s.%s %s.%d %g", + perf->target->name, + "rgba", + name, + 0, + _cairo_time_to_double (_cairo_time_from_s (1)) / 1000.); + printf (" %lld", (long long) times[i]); + fflush (stdout); + } else if (! perf->exact_iterations) { + if (i > CAIRO_PERF_MIN_STD_DEV_COUNT) { + _cairo_stats_compute (&stats, times, i+1); + + if (stats.std_dev <= CAIRO_PERF_LOW_STD_DEV) { + if (++low_std_dev_count >= CAIRO_PERF_STABLE_STD_DEV_COUNT) + break; + } else { + low_std_dev_count = 0; + } + } + } + + if (perf->summary && perf->summary_continuous) { + _cairo_stats_compute (&stats, times, i+1); + + fprintf (perf->summary, + "\r[%3d] %8s %28s ", + perf->test_number, + perf->target->name, + name); + if (perf->observe) { + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, paint, i+1); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, mask, i+1); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, fill, i+1); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, stroke, i+1); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, glyphs, i+1); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + fprintf (perf->summary, + " %5d", i+1); + } else { + fprintf (perf->summary, + "%#8.3f %#8.3f %#6.2f%% %4d/%d", + _cairo_time_to_s (stats.min_ticks), + _cairo_time_to_s (stats.median_ticks), + stats.std_dev * 100.0, + stats.iterations, i+1); + } + fflush (perf->summary); + } + } + user_interrupt = 0; + + if (perf->summary) { + _cairo_stats_compute (&stats, times, i); + if (perf->summary_continuous) { + fprintf (perf->summary, + "\r[%3d] %8s %28s ", + perf->test_number, + perf->target->name, + name); + } + if (perf->observe) { + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, paint, i); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, mask, i); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, fill, i); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, stroke, i); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + _cairo_stats_compute (&stats, glyphs, i); + fprintf (perf->summary, + " %#9.3f", _cairo_time_to_s (stats.median_ticks)); + + fprintf (perf->summary, + " %5d\n", i); + } else { + fprintf (perf->summary, + "%#8.3f %#8.3f %#6.2f%% %4d/%d\n", + _cairo_time_to_s (stats.min_ticks), + _cairo_time_to_s (stats.median_ticks), + stats.std_dev * 100.0, + stats.iterations, i); + } + fflush (perf->summary); + } + +out: + if (perf->raw) { + printf ("\n"); + fflush (stdout); + } + + perf->test_number++; + free (trace_cpy); +} + +static void +warn_no_traces (const char *message, + const char *trace_dir) +{ + fprintf (stderr, +"Error: %s '%s'.\n" +"Have you cloned the cairo-traces repository and uncompressed the traces?\n" +" git clone git://anongit.freedesktop.org/cairo-traces\n" +" cd cairo-traces && make\n" +"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n", + message, trace_dir); +} + +static int +cairo_perf_trace_dir (cairo_perf_t *perf, + const cairo_boilerplate_target_t *target, + const char *dirname) +{ + DIR *dir; + struct dirent *de; + int num_traces = 0; + cairo_bool_t force; + cairo_bool_t is_explicit; + + dir = opendir (dirname); + if (dir == NULL) + return 0; + + force = FALSE; + if (cairo_perf_can_run (perf, dirname, &is_explicit)) + force = is_explicit; + + while ((de = readdir (dir)) != NULL) { + char *trace; + struct stat st; + + if (de->d_name[0] == '.') + continue; + + xasprintf (&trace, "%s/%s", dirname, de->d_name); + if (stat (trace, &st) != 0) + goto next; + + if (S_ISDIR(st.st_mode)) { + num_traces += cairo_perf_trace_dir (perf, target, trace); + } else { + const char *dot; + + dot = strrchr (de->d_name, '.'); + if (dot == NULL) + goto next; + if (strcmp (dot, ".trace")) + goto next; + + num_traces++; + if (!force && ! cairo_perf_can_run (perf, de->d_name, NULL)) + goto next; + + cairo_perf_trace (perf, target, trace); + } +next: + free (trace); + + } + closedir (dir); + + return num_traces; +} + +int +main (int argc, + char *argv[]) +{ + cairo_perf_t perf; + const char *trace_dir = "cairo-traces:/usr/src/cairo-traces:/usr/share/cairo-traces"; + unsigned int n; + int i; + + parse_options (&perf, argc, argv); + + signal (SIGINT, interrupt); + + if (getenv ("CAIRO_TRACE_DIR") != NULL) + trace_dir = getenv ("CAIRO_TRACE_DIR"); + + perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL); + perf.times = xmalloc (6 * perf.iterations * sizeof (cairo_time_t)); + + /* do we have a list of filenames? */ + perf.exact_names = have_trace_filenames (&perf); + + for (i = 0; i < perf.num_targets; i++) { + const cairo_boilerplate_target_t *target = perf.targets[i]; + + if (! perf.list_only && ! target->is_measurable) + continue; + + perf.target = target; + perf.test_number = 0; + perf.has_described_backend = FALSE; + + if (perf.exact_names) { + for (n = 0; n < perf.num_names; n++) { + struct stat st; + + if (stat (perf.names[n], &st) == 0) { + if (S_ISDIR (st.st_mode)) { + cairo_perf_trace_dir (&perf, target, perf.names[n]); + } else + cairo_perf_trace (&perf, target, perf.names[n]); + } + } + } else { + int num_traces = 0; + const char *dir; + + dir = trace_dir; + do { + char buf[1024]; + const char *end = strchr (dir, ':'); + if (end != NULL) { + memcpy (buf, dir, end-dir); + buf[end-dir] = '\0'; + end++; + + dir = buf; + } + + num_traces += cairo_perf_trace_dir (&perf, target, dir); + dir = end; + } while (dir != NULL); + + if (num_traces == 0) { + warn_no_traces ("Found no traces in", trace_dir); + return 1; + } + } + + if (perf.list_only) + break; + } + + cairo_perf_fini (&perf); + + return 0; +} diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c new file mode 100644 index 000000000..18db0c544 --- /dev/null +++ b/perf/cairo-perf.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2007 Netlabs + * Copyright (c) 2006 Mozilla Corporation + * Copyright (c) 2006 Red Hat, Inc. + * Copyright (c) 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Peter Weilbacher + * Vladimir Vukicevic (win32/linux code) + * Carl Worth (win32/linux code) + * Andrea Canciani + */ + +#include "cairo-perf.h" +#include "../src/cairo-time-private.h" + +#if HAVE_UNISTD_H +#include +#endif + +#if defined(__OS2__) +#define INCL_BASE +#include +#elif defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#include +#elif defined(_POSIX_PRIORITY_SCHEDULING) +#include +#endif + + +/* timers */ +static cairo_time_t timer; +static cairo_perf_timer_synchronize_t cairo_perf_timer_synchronize = NULL; +static void *cairo_perf_timer_synchronize_closure = NULL; + +void +cairo_perf_timer_set_synchronize (cairo_perf_timer_synchronize_t synchronize, + void *closure) +{ + cairo_perf_timer_synchronize = synchronize; + cairo_perf_timer_synchronize_closure = closure; +} + +void +cairo_perf_timer_start (void) +{ + timer = _cairo_time_get (); +} + +void +cairo_perf_timer_stop (void) +{ + if (cairo_perf_timer_synchronize) + cairo_perf_timer_synchronize (cairo_perf_timer_synchronize_closure); + + timer = _cairo_time_get_delta (timer); +} + +cairo_time_t +cairo_perf_timer_elapsed (void) +{ + return timer; +} + +void +cairo_perf_yield (void) +{ + /* try to deactivate this thread until the scheduler calls it again */ + +#if defined(__OS2__) + DosSleep (0); +#elif defined(_WIN32) + SleepEx(0, TRUE); +#elif defined(_POSIX_PRIORITY_SCHEDULING) + sched_yield (); +#else + sleep (0); +#endif +} diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h new file mode 100644 index 000000000..eb53d13c2 --- /dev/null +++ b/perf/cairo-perf.h @@ -0,0 +1,250 @@ +/* + * Copyright © 2006 Mozilla Corporation + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Vladimir Vukicevic + * Carl Worth + */ + +#ifndef _CAIRO_PERF_H_ +#define _CAIRO_PERF_H_ + +#include "cairo-boilerplate.h" +#include "../src/cairo-time-private.h" +#include + +typedef struct _cairo_stats { + cairo_time_t min_ticks; + cairo_time_t median_ticks; + double ticks_per_ms; + double std_dev; + int iterations; + cairo_time_t *values; +} cairo_stats_t; + +typedef struct _cairo_histogram { + int width, height, max_count; + int num_columns, num_rows; + cairo_time_t min_value, max_value; + int *columns; +} cairo_histogram_t; + + +/* timers */ + +void +cairo_perf_timer_start (void); + +void +cairo_perf_timer_stop (void); + +typedef void +(*cairo_perf_timer_synchronize_t) (void *closure); + +void +cairo_perf_timer_set_synchronize (cairo_perf_timer_synchronize_t synchronize, + void *closure); + +cairo_time_t +cairo_perf_timer_elapsed (void); + +/* yield */ + +void +cairo_perf_yield (void); + +/* running a test case */ +typedef struct _cairo_perf { + FILE *summary; + cairo_bool_t summary_continuous; + + /* Options from command-line */ + unsigned int iterations; + cairo_bool_t exact_iterations; + cairo_bool_t raw; + cairo_bool_t list_only; + cairo_bool_t observe; + char **names; + unsigned int num_names; + char **exclude_names; + unsigned int num_exclude_names; + cairo_bool_t exact_names; + + double ms_per_iteration; + cairo_bool_t fast_and_sloppy; + + unsigned int tile_size; + + /* Stuff used internally */ + cairo_time_t *times; + const cairo_boilerplate_target_t **targets; + int num_targets; + const cairo_boilerplate_target_t *target; + cairo_bool_t has_described_backend; + unsigned int test_number; + unsigned int size; + cairo_t *cr; +} cairo_perf_t; + +typedef cairo_time_t +(*cairo_perf_func_t) (cairo_t *cr, int width, int height, int loops); + +typedef double +(*cairo_count_func_t) (cairo_t *cr, int width, int height); + +cairo_bool_t +cairo_perf_can_run (cairo_perf_t *perf, + const char *name, + cairo_bool_t *is_explicit); + +void +cairo_perf_run (cairo_perf_t *perf, + const char *name, + cairo_perf_func_t perf_func, + cairo_count_func_t count_func); + +void +cairo_perf_cover_sources_and_operators (cairo_perf_t *perf, + const char *name, + cairo_perf_func_t perf_func, + cairo_count_func_t count_func); + +/* reporter convenience routines */ + +typedef struct _test_report { + int id; + int fileno; + const char *configuration; + char *backend; + char *content; + char *name; + int size; + + /* The samples only exists for "raw" reports */ + cairo_time_t *samples; + unsigned int samples_size; + unsigned int samples_count; + + /* The stats are either read directly or computed from samples. + * If the stats have not yet been computed from samples, then + * iterations will be 0. */ + cairo_stats_t stats; +} test_report_t; + +typedef struct _test_diff { + test_report_t **tests; + int num_tests; + double min; + double max; + double change; +} test_diff_t; + +typedef struct _cairo_perf_report { + char *configuration; + const char *name; + int fileno; + test_report_t *tests; + int tests_size; + int tests_count; +} cairo_perf_report_t; + +typedef enum { + TEST_REPORT_STATUS_SUCCESS, + TEST_REPORT_STATUS_COMMENT, + TEST_REPORT_STATUS_ERROR +} test_report_status_t; + +void +cairo_perf_report_load (cairo_perf_report_t *report, + const char *filename, int id, + int (*cmp) (const void *, const void *)); + +void +cairo_perf_report_sort_and_compute_stats (cairo_perf_report_t *report, + int (*cmp) (const void *, const void *)); + +int +test_report_cmp_backend_then_name (const void *a, + const void *b); + +int +test_report_cmp_name (const void *a, + const void *b); + +#define CAIRO_PERF_ENABLED_DECL(func) cairo_bool_t (func ## _enabled) (cairo_perf_t *perf) +#define CAIRO_PERF_RUN_DECL(func) void (func) (cairo_perf_t *perf, cairo_t *cr, int width, int height) + +#define CAIRO_PERF_DECL(func) CAIRO_PERF_RUN_DECL(func); CAIRO_PERF_ENABLED_DECL(func) + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +CAIRO_PERF_DECL (fill); +CAIRO_PERF_DECL (paint); +CAIRO_PERF_DECL (paint_with_alpha); +CAIRO_PERF_DECL (mask); +CAIRO_PERF_DECL (stroke); +CAIRO_PERF_DECL (subimage_copy); +CAIRO_PERF_DECL (disjoint); +CAIRO_PERF_DECL (hatching); +CAIRO_PERF_DECL (tessellate); +CAIRO_PERF_DECL (text); +CAIRO_PERF_DECL (glyphs); +CAIRO_PERF_DECL (hash_table); +CAIRO_PERF_DECL (pattern_create_radial); +CAIRO_PERF_DECL (zrusin); +CAIRO_PERF_DECL (world_map); +CAIRO_PERF_DECL (box_outline); +CAIRO_PERF_DECL (mosaic); +CAIRO_PERF_DECL (long_lines); +CAIRO_PERF_DECL (unaligned_clip); +CAIRO_PERF_DECL (rectangles); +CAIRO_PERF_DECL (rounded_rectangles); +CAIRO_PERF_DECL (long_dashed_lines); +CAIRO_PERF_DECL (composite_checker); +CAIRO_PERF_DECL (twin); +CAIRO_PERF_DECL (dragon); +CAIRO_PERF_DECL (pythagoras_tree); +CAIRO_PERF_DECL (intersections); +CAIRO_PERF_DECL (spiral); +CAIRO_PERF_DECL (wave); +CAIRO_PERF_DECL (many_strokes); +CAIRO_PERF_DECL (wide_strokes); +CAIRO_PERF_DECL (many_fills); +CAIRO_PERF_DECL (wide_fills); +CAIRO_PERF_DECL (many_curves); +CAIRO_PERF_DECL (curve); +CAIRO_PERF_DECL (a1_curve); +CAIRO_PERF_DECL (line); +CAIRO_PERF_DECL (a1_line); +CAIRO_PERF_DECL (pixel); +CAIRO_PERF_DECL (a1_pixel); +CAIRO_PERF_DECL (sierpinski); +CAIRO_PERF_DECL (fill_clip); +CAIRO_PERF_DECL (tiger); + +#endif diff --git a/perf/cairo-stats.c b/perf/cairo-stats.c new file mode 100644 index 000000000..aee9fe8b5 --- /dev/null +++ b/perf/cairo-stats.c @@ -0,0 +1,182 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Carl Worth + */ + +#include "cairo-stats.h" + +#include + +void +_cairo_stats_compute (cairo_stats_t *stats, + cairo_time_t *values, + int num_values) +{ + cairo_time_t sum, mean, q1, q3, iqr; + cairo_time_t outlier_min, outlier_max; + int i, min_valid, num_valid; + double s; + + assert (num_values > 0); + + if (num_values == 1) { + stats->min_ticks = stats->median_ticks = values[0]; + stats->std_dev = 0; + stats->iterations = 1; + stats->values = values; + return; + } + + /* First, identify any outliers, using the definition of "mild + * outliers" from: + * + * http://en.wikipedia.org/wiki/Outliers + * + * Which is that outliers are any values less than Q1 - 1.5 * IQR + * or greater than Q3 + 1.5 * IQR where Q1 and Q3 are the first + * and third quartiles and IQR is the inter-quartile range (Q3 - + * Q1). + */ + num_valid = num_values; + do { + num_values = num_valid; + qsort (values, num_values, sizeof (cairo_time_t), _cairo_time_cmp); + + q1 = values[1*num_values/4]; + q3 = values[3*num_values/4]; + + /* XXX assumes we have native uint64_t */ + iqr = q3 - q1; + outlier_min = q1 - 3 * iqr / 2; + outlier_max = q3 + 3 * iqr / 2; + + for (i = 0; i < num_values && values[i] < outlier_min; i++) + ; + min_valid = i; + + for (i = 0; i < num_values && values[i] <= outlier_max; i++) + ; + num_valid = i - min_valid; + assert(num_valid); + values += min_valid; + } while (num_valid != num_values); + + stats->values = values; + stats->iterations = num_valid; + stats->min_ticks = values[0]; + stats->median_ticks = values[num_valid / 2]; + + sum = 0; + for (i = 0; i < num_valid; i++) + sum = _cairo_time_add (sum, values[i]); + mean = sum / num_valid; + + /* Let's use a normalized std. deviation for easier comparison. */ + s = 0; + for (i = 0; i < num_valid; i++) { + double delta = (values[i] - mean) / (double)mean; + s += delta * delta; + } + stats->std_dev = sqrt(s / num_valid); +} + +cairo_bool_t +_cairo_histogram_init (cairo_histogram_t *h, + int width, int height) +{ + h->width = width; + h->height = height; + if (h->width < 2 || h->height < 1) + return FALSE; + + h->num_columns = width - 2; + h->num_rows = height - 1; + h->columns = malloc (sizeof(int)*h->num_columns); + return h->columns != NULL; +} + +cairo_bool_t +_cairo_histogram_compute (cairo_histogram_t *h, + const cairo_time_t *values, + int num_values) +{ + cairo_time_t delta; + int i; + + if (num_values == 0) + return FALSE; + + h->min_value = values[0]; + h->max_value = values[0]; + + for (i = 1; i < num_values; i++) { + if (values[i] < h->min_value) + h->min_value = values[i]; + if (values[i] > h->max_value) + h->max_value = values[i]; + } + + delta = h->max_value - h->min_value; + if (delta == 0) + return FALSE; + + memset(h->columns, 0, sizeof(int)*h->num_columns); + h->max_count = 0; + + for (i = 0; i < num_values; i++) { + int count = h->columns[(values[i] - h->min_value) * (h->num_columns - 1) / delta]++; + if (count > h->max_count) + h->max_count = count; + } + + return TRUE; +} + +void +_cairo_histogram_printf (cairo_histogram_t *h, + FILE *file) +{ + int x, y, num_rows; + + num_rows = h->num_rows; + if (h->max_count < num_rows) + num_rows = h->max_count; + for (y = 0; y < num_rows; y++) { + int min_count = ((num_rows - y - 1) * h->max_count) / num_rows + h->max_count / (2*num_rows); + fprintf (file, "|"); + for (x = 0; x < h->num_columns; x++) + fprintf (file, "%c", h->columns[x] > min_count ? 'x' : ' '); + fprintf (file, "|\n"); + } + + fprintf(file, "."); + for (x = 0; x < h->num_columns; x++) + fprintf (file, "-"); + fprintf (file, ".\n"); +} + +void +_cairo_histogram_fini (cairo_histogram_t *h) +{ + free(h->columns); +} diff --git a/perf/cairo-stats.h b/perf/cairo-stats.h new file mode 100644 index 000000000..2b32d67ae --- /dev/null +++ b/perf/cairo-stats.h @@ -0,0 +1,52 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Carl Worth + */ + +#ifndef _CAIRO_STATS_H_ +#define _CAIRO_STATS_H_ + +#include "cairo-perf.h" + +void +_cairo_stats_compute (cairo_stats_t *stats, + cairo_time_t *values, + int num_values); + +cairo_bool_t +_cairo_histogram_init (cairo_histogram_t *h, + int width, int height); + +cairo_bool_t +_cairo_histogram_compute (cairo_histogram_t *h, + const cairo_time_t *values, + int num_values); + +void +_cairo_histogram_printf (cairo_histogram_t *h, + FILE *file); + +void +_cairo_histogram_fini (cairo_histogram_t *h); + +#endif /* _CAIRO_STATS_H_ */ diff --git a/perf/micro/Makefile.am b/perf/micro/Makefile.am new file mode 100644 index 000000000..3edbf531c --- /dev/null +++ b/perf/micro/Makefile.am @@ -0,0 +1,16 @@ +include $(top_srcdir)/build/Makefile.am.common + +include $(top_srcdir)/perf/micro/Makefile.sources + +noinst_LTLIBRARIES = libcairo-perf-micro.la +libcairo_perf_micro_la_SOURCES = \ + $(libcairo_perf_micro_sources) \ + $(libcairo_perf_micro_headers) + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/perf \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) diff --git a/perf/micro/Makefile.in b/perf/micro/Makefile.in new file mode 100644 index 000000000..d48b2febd --- /dev/null +++ b/perf/micro/Makefile.in @@ -0,0 +1,1199 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(top_srcdir)/perf/micro/Makefile.sources \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp $(top_srcdir)/build/test-driver +EXTRA_PROGRAMS = +TESTS = +check_PROGRAMS = +subdir = perf/micro +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libcairo_perf_micro_la_LIBADD = +am__objects_1 = cairo-perf-cover.lo box-outline.lo \ + composite-checker.lo disjoint.lo fill.lo hatching.lo \ + hash-table.lo line.lo a1-line.lo long-lines.lo mosaic.lo \ + paint.lo paint-with-alpha.lo mask.lo pattern_create_radial.lo \ + rectangles.lo rounded-rectangles.lo stroke.lo subimage_copy.lo \ + tessellate.lo text.lo tiger.lo glyphs.lo twin.lo \ + unaligned-clip.lo wave.lo world-map.lo zrusin.lo \ + long-dashed-lines.lo dragon.lo pythagoras-tree.lo \ + intersections.lo many-strokes.lo wide-strokes.lo many-fills.lo \ + wide-fills.lo many-curves.lo curve.lo a1-curve.lo spiral.lo \ + pixel.lo sierpinski.lo fill-clip.lo +am__objects_2 = +am_libcairo_perf_micro_la_OBJECTS = $(am__objects_1) $(am__objects_2) +libcairo_perf_micro_la_OBJECTS = $(am_libcairo_perf_micro_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libcairo_perf_micro_la_SOURCES) +DIST_SOURCES = $(libcairo_perf_micro_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in +libcairo_perf_micro_sources = \ + cairo-perf-cover.c \ + box-outline.c \ + composite-checker.c \ + disjoint.c \ + fill.c \ + hatching.c \ + hash-table.c \ + line.c \ + a1-line.c \ + long-lines.c \ + mosaic.c \ + paint.c \ + paint-with-alpha.c \ + mask.c \ + pattern_create_radial.c \ + rectangles.c \ + rounded-rectangles.c \ + stroke.c \ + subimage_copy.c \ + tessellate.c \ + text.c \ + tiger.c \ + glyphs.c \ + twin.c \ + unaligned-clip.c \ + wave.c \ + world-map.c \ + zrusin.c \ + long-dashed-lines.c \ + dragon.c \ + pythagoras-tree.c \ + intersections.c \ + many-strokes.c \ + wide-strokes.c \ + many-fills.c \ + wide-fills.c \ + many-curves.c \ + curve.c \ + a1-curve.c \ + spiral.c \ + pixel.c \ + sierpinski.c \ + fill-clip.c \ + $(NULL) + +libcairo_perf_micro_headers = \ + mosaic.h \ + world-map.h \ + zrusin-another.h \ + $(NULL) + +noinst_LTLIBRARIES = libcairo-perf-micro.la +libcairo_perf_micro_la_SOURCES = \ + $(libcairo_perf_micro_sources) \ + $(libcairo_perf_micro_headers) + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/perf \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(top_srcdir)/perf/micro/Makefile.sources $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign perf/micro/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign perf/micro/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(top_srcdir)/perf/micro/Makefile.sources: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libcairo-perf-micro.la: $(libcairo_perf_micro_la_OBJECTS) $(libcairo_perf_micro_la_DEPENDENCIES) $(EXTRA_libcairo_perf_micro_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libcairo_perf_micro_la_OBJECTS) $(libcairo_perf_micro_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/a1-curve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/a1-line.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/box-outline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-perf-cover.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/composite-checker.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disjoint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dragon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fill-clip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fill.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glyphs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash-table.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hatching.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intersections.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/line.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/long-dashed-lines.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/long-lines.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/many-curves.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/many-fills.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/many-strokes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mask.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mosaic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paint-with-alpha.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pattern_create_radial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pythagoras-tree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rectangles.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rounded-rectangles.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sierpinski.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spiral.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stroke.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subimage_copy.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tessellate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiger.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unaligned-clip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wide-fills.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wide-strokes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/world-map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zrusin.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am recheck tags tags-am uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/perf/micro/Makefile.sources b/perf/micro/Makefile.sources new file mode 100644 index 000000000..19ead179d --- /dev/null +++ b/perf/micro/Makefile.sources @@ -0,0 +1,51 @@ +libcairo_perf_micro_sources = \ + cairo-perf-cover.c \ + box-outline.c \ + composite-checker.c \ + disjoint.c \ + fill.c \ + hatching.c \ + hash-table.c \ + line.c \ + a1-line.c \ + long-lines.c \ + mosaic.c \ + paint.c \ + paint-with-alpha.c \ + mask.c \ + pattern_create_radial.c \ + rectangles.c \ + rounded-rectangles.c \ + stroke.c \ + subimage_copy.c \ + tessellate.c \ + text.c \ + tiger.c \ + glyphs.c \ + twin.c \ + unaligned-clip.c \ + wave.c \ + world-map.c \ + zrusin.c \ + long-dashed-lines.c \ + dragon.c \ + pythagoras-tree.c \ + intersections.c \ + many-strokes.c \ + wide-strokes.c \ + many-fills.c \ + wide-fills.c \ + many-curves.c \ + curve.c \ + a1-curve.c \ + spiral.c \ + pixel.c \ + sierpinski.c \ + fill-clip.c \ + $(NULL) + +libcairo_perf_micro_headers = \ + mosaic.h \ + world-map.h \ + zrusin-another.h \ + $(NULL) diff --git a/perf/micro/a1-curve.c b/perf/micro/a1-curve.c new file mode 100644 index 000000000..594c46d5c --- /dev/null +++ b/perf/micro/a1-curve.c @@ -0,0 +1,112 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_curve_stroke (cairo_t *cr, int width, int height, int loops) +{ + state = 0xc0ffee; + cairo_set_line_width (cr, 2.); + cairo_perf_timer_start (); + + while (loops--) { + double x1 = uniform_random (0, width); + double x2 = uniform_random (0, width); + double x3 = uniform_random (0, width); + double y1 = uniform_random (0, height); + double y2 = uniform_random (0, height); + double y3 = uniform_random (0, height); + cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height)); + cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); + cairo_stroke(cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_curve_fill (cairo_t *cr, int width, int height, int loops) +{ + state = 0xc0ffee; + cairo_perf_timer_start (); + + while (loops--) { + double x0 = uniform_random (0, width); + double x1 = uniform_random (0, width); + double x2 = uniform_random (0, width); + double x3 = uniform_random (0, width); + double xm = uniform_random (0, width); + double xn = uniform_random (0, width); + double y0 = uniform_random (0, height); + double y1 = uniform_random (0, height); + double y2 = uniform_random (0, height); + double y3 = uniform_random (0, height); + double ym = uniform_random (0, height); + double yn = uniform_random (0, height); + + cairo_move_to (cr, xm, ym); + cairo_curve_to (cr, x1, y1, x2, y2, xn, yn); + cairo_curve_to (cr, x3, y3, x0, y0, xm, ym); + cairo_close_path (cr); + + cairo_fill(cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +a1_curve_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "a1-curve", NULL); +} + +void +a1_curve (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_perf_run (perf, "a1-curve-stroked", do_curve_stroke, NULL); + cairo_perf_run (perf, "a1-curve-filled", do_curve_fill, NULL); +} diff --git a/perf/micro/a1-line.c b/perf/micro/a1-line.c new file mode 100644 index 000000000..ae8660212 --- /dev/null +++ b/perf/micro/a1-line.c @@ -0,0 +1,223 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static cairo_time_t +horizontal (cairo_t *cr, int width, int height, int loops) +{ + double h = height/2 + .5; + + cairo_move_to (cr, 0, h); + cairo_line_to (cr, width, h); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +horizontal_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return horizontal (cr, width, height, loops); +} + +static cairo_time_t +horizontal_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return horizontal (cr, width, height, loops); +} + +static cairo_time_t +nearly_horizontal (cairo_t *cr, int width, int height, int loops) +{ + double h = height/2; + + cairo_move_to (cr, 0, h); + cairo_line_to (cr, width, h+1); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +nearly_horizontal_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return nearly_horizontal (cr, width, height, loops); +} + +static cairo_time_t +nearly_horizontal_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return nearly_horizontal (cr, width, height, loops); +} + + +static cairo_time_t +vertical (cairo_t *cr, int width, int height, int loops) +{ + double w = width/2 + .5; + + cairo_move_to (cr, w, 0); + cairo_line_to (cr, w, height); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +vertical_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return vertical (cr, width, height, loops); +} + +static cairo_time_t +vertical_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return vertical (cr, width, height, loops); +} + +static cairo_time_t +nearly_vertical (cairo_t *cr, int width, int height, int loops) +{ + double w = width/2; + + cairo_move_to (cr, w, 0); + cairo_line_to (cr, w+1, height); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +nearly_vertical_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return nearly_vertical (cr, width, height, loops); +} + +static cairo_time_t +nearly_vertical_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return nearly_vertical (cr, width, height, loops); +} + + +static cairo_time_t +diagonal (cairo_t *cr, int width, int height, int loops) +{ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, width, height); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +diagonal_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return diagonal (cr, width, height, loops); +} + +static cairo_time_t +diagonal_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return diagonal (cr, width, height, loops); +} + +cairo_bool_t +a1_line_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "a1-line", NULL); +} + +void +a1_line (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_perf_run (perf, "a1-line-hh", horizontal_hair, NULL); + cairo_perf_run (perf, "a1-line-hw", horizontal_wide, NULL); + cairo_perf_run (perf, "a1-line-nhh", nearly_horizontal_hair, NULL); + cairo_perf_run (perf, "a1-line-nhw", nearly_horizontal_wide, NULL); + + cairo_perf_run (perf, "a1-line-vh", vertical_hair, NULL); + cairo_perf_run (perf, "a1-line-vw", vertical_wide, NULL); + cairo_perf_run (perf, "a1-line-nvh", nearly_vertical_hair, NULL); + cairo_perf_run (perf, "a1-line-nvw", nearly_vertical_wide, NULL); + + cairo_perf_run (perf, "a1-line-dh", diagonal_hair, NULL); + cairo_perf_run (perf, "a1-line-dw", diagonal_wide, NULL); +} diff --git a/perf/micro/box-outline.c b/perf/micro/box-outline.c new file mode 100644 index 000000000..1e654eb95 --- /dev/null +++ b/perf/micro/box-outline.c @@ -0,0 +1,215 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +/* This test case is designed to illustrate a performance bug that + * exists in cairo in which using cairo_stroke is much slower than + * cairo_fill to draw an identical figure, (and in particular a figure + * that is much more natural to draw with cairo_stroke). The figure is + * a 100x100 square outline 1-pixel wide, nicely pixel aligned. + * + * The performance bug should affect any path whose resulting contour + * consists only of pixel-aligned horizontal and vertical elements. + * + * Initial testing on on machine shows stroke as 5x slower than fill + * for the xlib backend and 16x slower for the image backend. + */ + +static cairo_time_t +box_outline_stroke (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + cairo_rectangle (cr, + 1.5, 1.5, + width - 3, height - 3); + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +box_outline_alpha_stroke (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + cairo_rectangle (cr, + 1.5, 1.5, + width - 3, height - 3); + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgba (cr, 1, 0, 0, .5); /* red */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +box_outline_aa_stroke (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + cairo_translate (cr, .5, .5); + cairo_rectangle (cr, + 1.5, 1.5, + width - 3, height - 3); + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +box_outline_fill (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + cairo_rectangle (cr, + 1.0, 1.0, + width - 2, height - 2); + cairo_rectangle (cr, + 2.0, 2.0, + width - 4, height - 4); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_set_source_rgb (cr, 0, 1, 0); /* green */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +box_outline_alpha_fill (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + cairo_rectangle (cr, + 1.0, 1.0, + width - 2, height - 2); + cairo_rectangle (cr, + 2.0, 2.0, + width - 4, height - 4); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_set_source_rgba (cr, 0, 1, 0, .5); /* green */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +box_outline_aa_fill (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + cairo_translate (cr, .5, .5); + cairo_rectangle (cr, + 1.0, 1.0, + width - 2, height - 2); + cairo_rectangle (cr, + 2.0, 2.0, + width - 4, height - 4); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_set_source_rgb (cr, 0, 1, 0); /* green */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +box_outline_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "box-outline", NULL); +} + +void +box_outline (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "box-outline-stroke", box_outline_stroke, NULL); + cairo_perf_run (perf, "box-outline-fill", box_outline_fill, NULL); + + cairo_perf_run (perf, "box-outline-alpha-stroke", box_outline_alpha_stroke, NULL); + cairo_perf_run (perf, "box-outline-alpha-fill", box_outline_alpha_fill, NULL); + + cairo_perf_run (perf, "box-outline-aa-stroke", box_outline_aa_stroke, NULL); + cairo_perf_run (perf, "box-outline-aa-fill", box_outline_aa_fill, NULL); +} diff --git a/perf/micro/cairo-perf-cover.c b/perf/micro/cairo-perf-cover.c new file mode 100644 index 000000000..c2499021f --- /dev/null +++ b/perf/micro/cairo-perf-cover.c @@ -0,0 +1,339 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +static void +init_and_set_source_surface (cairo_t *cr, + cairo_surface_t *source, + int width, + int height) +{ + cairo_t *cr2; + + /* Fill it with something known */ + cr2 = cairo_create (source); + cairo_set_operator (cr2, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr2, 0, 0, 1); /* blue */ + cairo_paint (cr2); + + cairo_set_source_rgba (cr2, 1, 0, 0, 0.5); /* 50% red */ + cairo_new_path (cr2); + cairo_rectangle (cr2, 0, 0, width/2.0, height/2.0); + cairo_rectangle (cr2, width/2.0, height/2.0, width/2.0, height/2.0); + cairo_fill (cr2); + + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); +} + +static void +set_source_solid_rgb (cairo_t *cr, + int width, + int height) +{ + cairo_set_source_rgb (cr, 0.2, 0.6, 0.9); +} + +static void +set_source_solid_rgba (cairo_t *cr, + int width, + int height) +{ + cairo_set_source_rgba (cr, 0.2, 0.6, 0.9, 0.7); +} + +static void +set_source_image_surface_rgb (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + width, height); + init_and_set_source_surface (cr, source, width, height); + + cairo_surface_destroy (source); +} + +static void +set_source_image_surface_rgba (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height); + init_and_set_source_surface (cr, source, width, height); + + cairo_surface_destroy (source); +} + +static void +set_source_image_surface_rgba_mag (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width/2, height/2); + cairo_scale(cr, 2.1, 2.1); + init_and_set_source_surface (cr, source, width/2, height/2); + cairo_scale(cr, 1/2.1, 1/2.1); + + cairo_surface_destroy (source); +} + +static void +set_source_image_surface_rgba_min (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width*2, height*2); + cairo_scale(cr, 1/1.9, 1/1.9); + init_and_set_source_surface (cr, source, width*2, height*2); + cairo_scale(cr, 1.9, 1.9); + + cairo_surface_destroy (source); +} + +static void +set_source_similar_surface_rgb (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR, + width, height); + init_and_set_source_surface (cr, source, width, height); + + cairo_surface_destroy (source); +} + +static void +set_source_similar_surface_rgba (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + width, height); + init_and_set_source_surface (cr, source, width, height); + + cairo_surface_destroy (source); +} + +static void +set_source_similar_surface_rgba_mag (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + width/2, height/2); + cairo_scale(cr, 2.1, 2.1); + init_and_set_source_surface (cr, source, width/2, height/2); + cairo_scale(cr, 1/2.1, 1/2.1); + + cairo_surface_destroy (source); +} + +static void +set_source_similar_surface_rgba_min (cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *source; + + source = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + width*2, height*2); + cairo_scale(cr, 1/1.9, 1/1.9); + init_and_set_source_surface (cr, source, width*2, height*2); + cairo_scale(cr, 1.9, 1.9); + + cairo_surface_destroy (source); +} + +static void +set_source_linear_rgb (cairo_t *cr, + int width, + int height) +{ + cairo_pattern_t *linear; + + linear = cairo_pattern_create_linear (0.0, 0.0, width, height); + cairo_pattern_add_color_stop_rgb (linear, 0.0, 1, 0, 0); /* red */ + cairo_pattern_add_color_stop_rgb (linear, 1.0, 0, 0, 1); /* blue */ + + cairo_set_source (cr, linear); + + cairo_pattern_destroy (linear); +} + +static void +set_source_linear_rgba (cairo_t *cr, + int width, + int height) +{ + cairo_pattern_t *linear; + + linear = cairo_pattern_create_linear (0.0, 0.0, width, height); + cairo_pattern_add_color_stop_rgba (linear, 0.0, 1, 0, 0, 0.5); /* 50% red */ + cairo_pattern_add_color_stop_rgba (linear, 1.0, 0, 0, 1, 0.0); /* 0% blue */ + + cairo_set_source (cr, linear); + + cairo_pattern_destroy (linear); +} + +static void +set_source_linear3_rgb (cairo_t *cr, + int width, + int height) +{ + cairo_pattern_t *linear; + + linear = cairo_pattern_create_linear (0.0, 0.0, width, height); + cairo_pattern_add_color_stop_rgb (linear, 0.0, 1, 0, 0); /* red */ + cairo_pattern_add_color_stop_rgb (linear, 0.5, 0, 1, 0); /* green */ + cairo_pattern_add_color_stop_rgb (linear, 1.0, 0, 0, 1); /* blue */ + + cairo_set_source (cr, linear); + + cairo_pattern_destroy (linear); +} + +static void +set_source_linear3_rgba (cairo_t *cr, + int width, + int height) +{ + cairo_pattern_t *linear; + + linear = cairo_pattern_create_linear (0.0, 0.0, width, height); + cairo_pattern_add_color_stop_rgba (linear, 0.0, 1, 0, 0, 0.5); /* 50% red */ + cairo_pattern_add_color_stop_rgba (linear, 0.5, 0, 1, 0, 0.0); /* 0% green */ + cairo_pattern_add_color_stop_rgba (linear, 1.0, 0, 0, 1, 0.5); /* 50% blue */ + + cairo_set_source (cr, linear); + + cairo_pattern_destroy (linear); +} + +static void +set_source_radial_rgb (cairo_t *cr, + int width, + int height) +{ + cairo_pattern_t *radial; + + radial = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0, + width/2.0, height/2.0, width/2.0); + cairo_pattern_add_color_stop_rgb (radial, 0.0, 1, 0, 0); /* red */ + cairo_pattern_add_color_stop_rgb (radial, 1.0, 0, 0, 1); /* blue */ + + cairo_set_source (cr, radial); + + cairo_pattern_destroy (radial); +} + +static void +set_source_radial_rgba (cairo_t *cr, + int width, + int height) +{ + cairo_pattern_t *radial; + + radial = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0, + width/2.0, height/2.0, width/2.0); + cairo_pattern_add_color_stop_rgba (radial, 0.0, 1, 0, 0, 0.5); /* 50% red */ + cairo_pattern_add_color_stop_rgba (radial, 1.0, 0, 0, 1, 0.0); /* 0% blue */ + + cairo_set_source (cr, radial); + + cairo_pattern_destroy (radial); +} + +typedef void (*set_source_func_t) (cairo_t *cr, int width, int height); + +void +cairo_perf_cover_sources_and_operators (cairo_perf_t *perf, + const char *name, + cairo_perf_func_t perf_func, + cairo_count_func_t count_func) +{ + unsigned int i, j; + char *expanded_name; + + struct { set_source_func_t set_source; const char *name; } sources[] = { + { set_source_solid_rgb, "solid-rgb" }, + { set_source_solid_rgba, "solid-rgba" }, + { set_source_image_surface_rgb, "image-rgb" }, + { set_source_image_surface_rgba, "image-rgba" }, + { set_source_image_surface_rgba_mag, "image-rgba-mag" }, + { set_source_image_surface_rgba_min, "image-rgba-min" }, + { set_source_similar_surface_rgb, "similar-rgb" }, + { set_source_similar_surface_rgba, "similar-rgba" }, + { set_source_similar_surface_rgba_mag, "similar-rgba-mag" }, + { set_source_similar_surface_rgba_min, "similar-rgba-min" }, + { set_source_linear_rgb, "linear-rgb" }, + { set_source_linear_rgba, "linear-rgba" }, + { set_source_linear3_rgb, "linear3-rgb" }, + { set_source_linear3_rgba, "linear3-rgba" }, + { set_source_radial_rgb, "radial-rgb" }, + { set_source_radial_rgba, "radial-rgba" } + }; + + struct { cairo_operator_t op; const char *name; } operators[] = { + { CAIRO_OPERATOR_OVER, "over" }, + { CAIRO_OPERATOR_SOURCE, "source" } + }; + + for (i = 0; i < ARRAY_LENGTH (sources); i++) { + (sources[i].set_source) (perf->cr, perf->size, perf->size); + + for (j = 0; j < ARRAY_LENGTH (operators); j++) { + cairo_set_operator (perf->cr, operators[j].op); + + xasprintf (&expanded_name, "%s_%s_%s", + name, sources[i].name, operators[j].name); + cairo_perf_run (perf, expanded_name, perf_func, count_func); + free (expanded_name); + } + } +} diff --git a/perf/micro/composite-checker.c b/perf/micro/composite-checker.c new file mode 100644 index 000000000..d6d17ab63 --- /dev/null +++ b/perf/micro/composite-checker.c @@ -0,0 +1,117 @@ +/* + * Copyright © 2007 Björn Lindqvist + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Björn Lindqvist + */ + +#include "cairo-perf.h" + +/* This test case measures how much time cairo takes to render the + * equivalent of the following gdk-pixbuf operation: + * + * gdk_pixbuf_composite_color(dest, + * 0, 0, DST_SIZE, DST_SIZE, + * 0, 0, + * SCALE, SCALE, + * gdk.INTERP_NEAREST, + * 255, + * 0, 0, + * 8, 0x33333333, 0x88888888); + * + * Cairo is (at the time of writing) about 2-3 times as slow as + * gdk-pixbuf. + */ +#define PAT_SIZE 16 +#define SRC_SIZE 64 + +static cairo_pattern_t *checkerboard = NULL; +static cairo_pattern_t *src_pattern = NULL; + +static cairo_time_t +do_composite_checker (cairo_t *cr, + int width, + int height, + int loops) +{ + /* Compute zoom so that the src_pattern covers the whole output image. */ + double xscale = width / (double) SRC_SIZE; + double yscale = height / (double) SRC_SIZE; + + cairo_perf_timer_start (); + + while (loops--) { + /* Fill the surface with our background. */ + cairo_identity_matrix (cr); + cairo_set_source (cr, checkerboard); + cairo_paint (cr); + + /* Draw the scaled image on top. */ + cairo_scale (cr, xscale, yscale); + cairo_set_source (cr, src_pattern); + cairo_paint (cr); + } + + cairo_perf_timer_stop (); + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +composite_checker_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "composite-checker", NULL); +} + +void +composite_checker (cairo_perf_t *perf, + cairo_t *cr, + int width, + int height) +{ + cairo_surface_t *image; + + /* Create the checker pattern. We don't actually need to draw + * anything on it since that wouldn't affect performance. + */ + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + PAT_SIZE, + PAT_SIZE); + checkerboard = cairo_pattern_create_for_surface (image); + cairo_pattern_set_filter (checkerboard, CAIRO_FILTER_NEAREST); + cairo_pattern_set_extend (checkerboard, CAIRO_EXTEND_REPEAT); + cairo_surface_destroy (image); + + /* Create the image source pattern. Again we use the NEAREST + * filtering which should be fastest. + */ + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + SRC_SIZE, + SRC_SIZE); + src_pattern = cairo_pattern_create_for_surface (image); + cairo_pattern_set_filter (src_pattern, CAIRO_FILTER_NEAREST); + cairo_surface_destroy (image); + + cairo_perf_run (perf, "composite-checker", do_composite_checker, NULL); + + cairo_pattern_destroy (checkerboard); + cairo_pattern_destroy (src_pattern); +} diff --git a/perf/micro/curve.c b/perf/micro/curve.c new file mode 100644 index 000000000..3b5a16342 --- /dev/null +++ b/perf/micro/curve.c @@ -0,0 +1,111 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_curve_stroke (cairo_t *cr, int width, int height, int loops) +{ + state = 0xc0ffee; + cairo_set_line_width (cr, 2.); + cairo_perf_timer_start (); + + while (loops--) { + double x1 = uniform_random (0, width); + double x2 = uniform_random (0, width); + double x3 = uniform_random (0, width); + double y1 = uniform_random (0, height); + double y2 = uniform_random (0, height); + double y3 = uniform_random (0, height); + cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height)); + cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); + cairo_stroke(cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_curve_fill (cairo_t *cr, int width, int height, int loops) +{ + state = 0xc0ffee; + cairo_perf_timer_start (); + + while (loops--) { + double x0 = uniform_random (0, width); + double x1 = uniform_random (0, width); + double x2 = uniform_random (0, width); + double x3 = uniform_random (0, width); + double xm = uniform_random (0, width); + double xn = uniform_random (0, width); + double y0 = uniform_random (0, height); + double y1 = uniform_random (0, height); + double y2 = uniform_random (0, height); + double y3 = uniform_random (0, height); + double ym = uniform_random (0, height); + double yn = uniform_random (0, height); + + cairo_move_to (cr, xm, ym); + cairo_curve_to (cr, x1, y1, x2, y2, xn, yn); + cairo_curve_to (cr, x3, y3, x0, y0, xm, ym); + cairo_close_path (cr); + + cairo_fill(cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +curve_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "curve", NULL); +} + +void +curve (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + + cairo_perf_run (perf, "curve-stroked", do_curve_stroke, NULL); + cairo_perf_run (perf, "curve-filled", do_curve_fill, NULL); +} diff --git a/perf/micro/disjoint.c b/perf/micro/disjoint.c new file mode 100644 index 000000000..847860c7e --- /dev/null +++ b/perf/micro/disjoint.c @@ -0,0 +1,101 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "cairo-perf.h" +#include + +#define STEP 5 + +static void path (cairo_t *cr, int width, int height) +{ + int i; + + cairo_rectangle (cr, 0, 0, width, height); + cairo_clip (cr); + + cairo_translate (cr, width/2, height/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -width/2, -height/2); + + for (i = 0; i < width; i += STEP) { + cairo_rectangle (cr, i, -2, 1, height+4); + cairo_rectangle (cr, -2, i, width+4, 1); + } +} + +static void clip (cairo_t *cr, int width, int height) +{ + int i, j; + + for (j = 0; j < height; j += 2*STEP) { + for (i = 0; i < width; i += 2*STEP) + cairo_rectangle (cr, i, j, STEP, STEP); + + j += 2*STEP; + for (i = 0; i < width; i += 2*STEP) + cairo_rectangle (cr, i+STEP/2, j, STEP, STEP); + } + + cairo_clip (cr); +} + +static cairo_time_t +draw (cairo_t *cr, int width, int height, int loops) +{ + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_perf_timer_start (); + while (loops--) { + cairo_save (cr); + clip (cr, width, height); + path (cr, width, height); + cairo_fill (cr); + cairo_restore (cr); + } + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +disjoint_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "disjoint", NULL); +} + +void +disjoint (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + if (! cairo_perf_can_run (perf, "disjoint", NULL)) + return; + + cairo_perf_run (perf, "disjoint", draw, NULL); +} diff --git a/perf/micro/dragon.c b/perf/micro/dragon.c new file mode 100644 index 000000000..aa5daf534 --- /dev/null +++ b/perf/micro/dragon.c @@ -0,0 +1,277 @@ +/* + * Copyright © 2007 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + * + * Inspiration (and path!) taken from + * http://labs.trolltech.com/blogs/2007/08/31/rasterizing-dragons/ + */ + +#include "cairo-perf.h" + +static inline int +next_pot (int v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + +static cairo_bool_t +direction (int i) +{ + int pivot, np2; + + if (i < 2) + return TRUE; + + np2 = next_pot (i + 1); + if (np2 == i + 1) + return TRUE; + + pivot = np2 / 2 - 1; + return ! direction (2 * pivot - i); +} + +static void +path (cairo_t *cr, int step, int dir, int iterations) +{ + double dx, dy; + int i; + + switch (dir) { + default: + case 0: dx = step; dy = 0; break; + case 1: dx = -step; dy = 0; break; + case 2: dx = 0; dy = step; break; + case 3: dx = 0; dy = -step; break; + } + + for (i = 0; i < iterations; i++) { + cairo_rel_line_to (cr, dx, dy); + + if (direction (i)) { + double t = dx; + dx = dy; + dy = -t; + } else { + double t = dx; + dx = -dy; + dy = t; + } + } +} + +static cairo_time_t +do_dragon (cairo_t *cr, int width, int height, int loops) +{ + cairo_pattern_t *pattern; + double cx, cy, r; + + cx = cy = .5 * MAX (width, height); + r = .5 * MIN (width, height); + + cairo_perf_timer_start (); + + while (loops--) { + pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); + cairo_pattern_add_color_stop_rgb (pattern, 0., .0, .0, .0); + cairo_pattern_add_color_stop_rgb (pattern, 0.25, .5, .4, .4); + cairo_pattern_add_color_stop_rgb (pattern, .5, .8, .8, .9); + cairo_pattern_add_color_stop_rgb (pattern, 1., .9, .9, 1.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_paint (cr); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_width (cr, 4.); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 0, 2048); + pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); + cairo_pattern_add_color_stop_rgb (pattern, 0., 1., 1., 1.); + cairo_pattern_add_color_stop_rgb (pattern, 1., 0., 0., 0.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_stroke(cr); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 1, 2048); + pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); + cairo_pattern_add_color_stop_rgb (pattern, 1., 1., 1., 0.); + cairo_pattern_add_color_stop_rgb (pattern, 0., 1., 0., 0.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_stroke(cr); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 2, 2048); + pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); + cairo_pattern_add_color_stop_rgb (pattern, 1., 0., 1., 1.); + cairo_pattern_add_color_stop_rgb (pattern, 0., 0., 1., 0.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_stroke(cr); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 3, 2048); + pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r); + cairo_pattern_add_color_stop_rgb (pattern, 1., 1., 0., 1.); + cairo_pattern_add_color_stop_rgb (pattern, 0., 0., 0., 1.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_stroke(cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_dragon_solid (cairo_t *cr, int width, int height, int loops) +{ + double cx, cy; + + cx = cy = .5 * MAX (width, height); + + cairo_perf_timer_start (); + + while (loops--) { + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_line_width (cr, 4.); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 0, 2048); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke(cr); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 1, 2048); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_stroke(cr); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 2, 2048); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke(cr); + + cairo_move_to (cr, cx, cy); + path (cr, 12, 3, 2048); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_stroke(cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_dragon_solid_unaligned (cairo_t *cr, int width, int height, int loops) +{ + cairo_translate (cr, 0.01, 0.01); + return do_dragon_solid (cr, width, height, loops); +} + +static cairo_time_t +do_dragon_solid_aligned_clip (cairo_t *cr, int width, int height, int loops) +{ + cairo_reset_clip (cr); + cairo_rectangle (cr, 10, 10, width/2 + 10, height/2 + 10); + cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 10, height/2 + 10); + cairo_clip (cr); + + return do_dragon_solid (cr, width, height, loops); +} + +static cairo_time_t +do_dragon_unaligned_solid_aligned_clip (cairo_t *cr, int width, int height, int loops) +{ + cairo_translate (cr, 0.01, 0.01); + cairo_reset_clip (cr); + cairo_rectangle (cr, 10, 10, width/2 + 10, height/2 + 10); + cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 10, height/2 + 10); + cairo_clip (cr); + + return do_dragon_solid (cr, width, height, loops); +} + +static cairo_time_t +do_dragon_solid_unaligned_clip (cairo_t *cr, int width, int height, int loops) +{ + cairo_reset_clip (cr); + cairo_rectangle (cr, 10.5, 10.5, width/2 + 10, height/2 + 10); + cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 9.5, height/2 + 9.5); + cairo_clip (cr); + + return do_dragon_solid (cr, width, height, loops); +} + +static cairo_time_t +do_dragon_unaligned_solid_unaligned_clip (cairo_t *cr, int width, int height, int loops) +{ + cairo_translate (cr, 0.01, 0.01); + cairo_reset_clip (cr); + cairo_rectangle (cr, 10.5, 10.5, width/2 + 10, height/2 + 10); + cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 9.5, height/2 + 9.5); + cairo_clip (cr); + + return do_dragon_solid (cr, width, height, loops); +} + +static cairo_time_t +do_dragon_solid_circle_clip (cairo_t *cr, int width, int height, int loops) +{ + cairo_reset_clip (cr); + cairo_arc (cr, width/2., height/2., MIN (width, height)/2. - 10, 0, 2 * M_PI); + cairo_clip (cr); + + return do_dragon_solid (cr, width, height, loops); +} + +cairo_bool_t +dragon_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "dragon", NULL); +} + +void +dragon (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "dragon-solid", do_dragon_solid, NULL); + cairo_perf_run (perf, "dragon-unaligned-solid", do_dragon_solid_unaligned, NULL); + cairo_perf_run (perf, "dragon-solid-aligned-clip", do_dragon_solid_aligned_clip, NULL); + cairo_perf_run (perf, "dragon-unaligned-solid-aligned-clip", do_dragon_unaligned_solid_aligned_clip, NULL); + cairo_perf_run (perf, "dragon-solid-unaligned-clip", do_dragon_solid_unaligned_clip, NULL); + cairo_perf_run (perf, "dragon-unaligned-solid-unaligned-clip", do_dragon_unaligned_solid_unaligned_clip, NULL); + cairo_perf_run (perf, "dragon-solid-circle-clip", do_dragon_solid_circle_clip, NULL); + cairo_perf_run (perf, "dragon", do_dragon, NULL); +} diff --git a/perf/micro/fill-clip.c b/perf/micro/fill-clip.c new file mode 100644 index 000000000..2d014aca8 --- /dev/null +++ b/perf/micro/fill-clip.c @@ -0,0 +1,126 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Compares the overhead for WebKit's drawRect() */ + +#include "cairo-perf.h" + +#include + +static cairo_time_t +clip_paint (cairo_t *cr, int width, int height, int loops) +{ + int x = width/4, w = width/2; + int y = height/4, h = height/2; + + cairo_perf_timer_start (); + + while (loops--) { + cairo_reset_clip (cr); + cairo_rectangle (cr, x, y, w, h); + cairo_clip (cr); + cairo_paint (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +rect_fill (cairo_t *cr, int width, int height, int loops) +{ + int x = width/4, w = width/2; + int y = height/4, h = height/2; + + cairo_perf_timer_start (); + + while (loops--) { + cairo_rectangle (cr, x, y, w, h); + cairo_fill (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +direct (cairo_t *cr, int width, int height, int loops) +{ + int x = width/4, w = width/2; + int y = height/4, h = height/2; + cairo_surface_t *surface, *image; + uint8_t *data; + int stride, bpp; + + + surface = cairo_get_target (cr); + image = cairo_surface_map_to_image (surface, NULL); + data = cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image); + + switch (cairo_image_surface_get_format (image)) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: bpp = 0; break; + case CAIRO_FORMAT_A8: bpp = 8; break; + case CAIRO_FORMAT_RGB16_565: bpp = 16; break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: bpp = 32; break; + } + + cairo_perf_timer_start (); + + while (loops--) { + pixman_fill ((uint32_t *)data, stride / sizeof(uint32_t), bpp, + x, y, w, h, + -1); + } + + cairo_perf_timer_stop (); + + cairo_surface_unmap_image (surface, image); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +fill_clip_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "fillclip", NULL); +} + +void +fill_clip (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + + cairo_perf_run (perf, "fillclip-clip", clip_paint, NULL); + cairo_perf_run (perf, "fillclip-fill", rect_fill, NULL); + cairo_perf_run (perf, "fillclip-direct", direct, NULL); +} diff --git a/perf/micro/fill.c b/perf/micro/fill.c new file mode 100644 index 000000000..d356c26d5 --- /dev/null +++ b/perf/micro/fill.c @@ -0,0 +1,122 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_fill (cairo_t *cr, int width, int height, int loops) +{ + cairo_arc (cr, + width/2.0, height/2.0, + width/3.0, + 0, 2 * M_PI); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_fill_annuli (cairo_t *cr, int width, int height, int loops) +{ + cairo_new_sub_path (cr); + cairo_arc (cr, + width/2.0, height/2.0, + width/3.0, + 0, 2 * M_PI); + + cairo_new_sub_path (cr); + cairo_arc_negative (cr, + width/2.0, height/2.0, + width/4.0, + 2 * M_PI, 0); + + cairo_new_sub_path (cr); + cairo_arc (cr, + width/2.0, height/2.0, + width/6.0, + 0, 2 * M_PI); + + cairo_new_sub_path (cr); + cairo_arc_negative (cr, + width/2.0, height/2.0, + width/8.0, + 2 * M_PI, 0); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_fill_eo_noaa (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_arc (cr, + width/2.0, height/2.0, + width/3.0, + 0, 2 * M_PI); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +fill_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "fill", NULL); +} + +void +fill (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "fill", do_fill, NULL); + cairo_perf_cover_sources_and_operators (perf, "fill-annuli", do_fill_annuli, NULL); + cairo_perf_cover_sources_and_operators (perf, "fill-eo-noaa", do_fill_eo_noaa, NULL); +} diff --git a/perf/micro/glyphs.c b/perf/micro/glyphs.c new file mode 100644 index 000000000..5f088b29e --- /dev/null +++ b/perf/micro/glyphs.c @@ -0,0 +1,202 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_glyphs (double font_size, + cairo_antialias_t antialias, + cairo_t *cr, int width, int height, int loops) +{ + const char text[] = "the jay, pig, fox, zebra and my wolves quack"; + cairo_scaled_font_t *scaled_font; + cairo_glyph_t *glyphs = NULL, *glyphs_copy; + cairo_text_extents_t extents; + cairo_font_options_t *options; + cairo_status_t status; + double x, y; + int num_glyphs, n; + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, antialias); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, font_size); + scaled_font = cairo_get_scaled_font (cr); + status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., + text, -1, + &glyphs, &num_glyphs, + NULL, NULL, + NULL); + if (status) + return 0; + + glyphs_copy = cairo_glyph_allocate (num_glyphs); + if (glyphs_copy == NULL) { + cairo_glyph_free (glyphs); + return 0; + } + + cairo_scaled_font_glyph_extents (scaled_font, + glyphs, num_glyphs, + &extents); + + cairo_perf_timer_start (); + + while (loops--) { + y = 0; + do { + x = 0; + do { + for (n = 0; n < num_glyphs; n++) { + glyphs_copy[n] = glyphs[n]; + glyphs_copy[n].x += x; + glyphs_copy[n].y += y; + } + cairo_show_glyphs (cr, glyphs_copy, num_glyphs); + + x += extents.width; + } while (x < width); + y += extents.height; + } while (y < height); + } + + cairo_perf_timer_stop (); + + cairo_glyph_free (glyphs); + cairo_glyph_free (glyphs_copy); + + return cairo_perf_timer_elapsed (); +} + +static double +count_glyphs (double font_size, + cairo_antialias_t antialias, + cairo_t *cr, int width, int height) +{ + const char text[] = "the jay, pig, fox, zebra and my wolves quack"; + cairo_scaled_font_t *scaled_font; + cairo_glyph_t *glyphs = NULL; + cairo_text_extents_t extents; + cairo_font_options_t *options; + cairo_status_t status; + int num_glyphs; + int glyphs_per_line, lines_per_loop; + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, antialias); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, font_size); + scaled_font = cairo_get_scaled_font (cr); + status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., + text, -1, + &glyphs, &num_glyphs, + NULL, NULL, + NULL); + if (status) + return 0; + + cairo_scaled_font_glyph_extents (scaled_font, + glyphs, num_glyphs, + &extents); + cairo_glyph_free (glyphs); + + glyphs_per_line = num_glyphs * width / extents.width + 1; + lines_per_loop = height / extents.height + 1; + return glyphs_per_line * lines_per_loop / 1000.; /* kiloglyphs */ +} + +#define DECL(name,size, aa) \ +static cairo_time_t \ +do_glyphs##name (cairo_t *cr, int width, int height, int loops) \ +{ \ + return do_glyphs (size, aa, cr, width, height, loops); \ +} \ +\ +static double \ +count_glyphs##name (cairo_t *cr, int width, int height) \ +{ \ + return count_glyphs (size, aa, cr, width, height); \ +} + +DECL(8, 8, CAIRO_ANTIALIAS_GRAY) +DECL(10, 10, CAIRO_ANTIALIAS_GRAY) +DECL(12, 12, CAIRO_ANTIALIAS_GRAY) +DECL(16, 16, CAIRO_ANTIALIAS_GRAY) +DECL(20, 20, CAIRO_ANTIALIAS_GRAY) +DECL(24, 24, CAIRO_ANTIALIAS_GRAY) +DECL(32, 32, CAIRO_ANTIALIAS_GRAY) +DECL(40, 40, CAIRO_ANTIALIAS_GRAY) +DECL(48, 48, CAIRO_ANTIALIAS_GRAY) + +DECL(8ca, 8, CAIRO_ANTIALIAS_SUBPIXEL) +DECL(48ca, 48, CAIRO_ANTIALIAS_SUBPIXEL) + +DECL(8mono, 8, CAIRO_ANTIALIAS_NONE) +DECL(48mono, 48, CAIRO_ANTIALIAS_NONE) + +cairo_bool_t +glyphs_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "glyphs", NULL); +} + +void +glyphs (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "glyphs8mono", do_glyphs8mono, count_glyphs8mono); + cairo_perf_cover_sources_and_operators (perf, "glyphs8", do_glyphs8, count_glyphs8); + cairo_perf_cover_sources_and_operators (perf, "glyphs8ca", do_glyphs8ca, count_glyphs8ca); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_perf_run (perf, "glyphs8", do_glyphs8, count_glyphs8); + cairo_perf_run (perf, "glyphs10", do_glyphs10, count_glyphs10); + cairo_perf_run (perf, "glyphs12", do_glyphs12, count_glyphs12); + cairo_perf_run (perf, "glyphs16", do_glyphs16, count_glyphs16); + cairo_perf_run (perf, "glyphs20", do_glyphs20, count_glyphs20); + cairo_perf_run (perf, "glyphs24", do_glyphs24, count_glyphs24); + cairo_perf_run (perf, "glyphs32", do_glyphs32, count_glyphs32); + cairo_perf_run (perf, "glyphs40", do_glyphs40, count_glyphs40); + cairo_perf_run (perf, "glyphs48", do_glyphs48, count_glyphs48); + + cairo_perf_cover_sources_and_operators (perf, "glyphs48mono", do_glyphs48mono, count_glyphs48mono); + cairo_perf_cover_sources_and_operators (perf, "glyphs48", do_glyphs48, count_glyphs48); + cairo_perf_cover_sources_and_operators (perf, "glyphs48ca", do_glyphs48ca, count_glyphs48ca); +} diff --git a/perf/micro/hash-table.c b/perf/micro/hash-table.c new file mode 100644 index 000000000..d16291770 --- /dev/null +++ b/perf/micro/hash-table.c @@ -0,0 +1,115 @@ +/* + * Copyright © 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-perf.h" + +#define ITER 1000 +#define HOLDOVERS 256 +#define LIVE_ENTRIES 257 +#define ACTIVE_FONTS (LIVE_ENTRIES - HOLDOVERS - 1) + +/* + * The original implementation of hash tables was very inefficient, as + * pointed out in https://bugs.freedesktop.org/show_bug.cgi?id=17399 + * + * This benchmark tries to fill up the scaled_font_map hash table to + * show the O(n) behavior. + */ + +static cairo_time_t +do_hash_table (cairo_t *cr, int width, int height, int loops) +{ + /* + * Microsoft C Compiler complains that: + * error C2466: cannot allocate an array of constant size 0 + * so we add an unused element to make it happy + */ + cairo_scaled_font_t *active_fonts[ACTIVE_FONTS + 1]; + cairo_matrix_t m; + int i; + + cairo_matrix_init_identity (&m); + + /* Touch HOLDOVERS scaled fonts to fill up the holdover list. */ + for (i = 0; i < HOLDOVERS; i++) { + m.yy = m.xx * (i + 1); + cairo_set_font_matrix (cr, &m); + cairo_get_scaled_font (cr); + } + + /* + * Reference some scaled fonts so that they will be kept in the + * scaled fonts map. We want LIVE_ENTRIES elements in the font + * map, but cairo keeps HOLDOVERS recently used fonts in it and we + * will be activating a new font in the cr context, so we just + * keep references to ACTIVE_FONTS fonts. + * + * Note: setting LIVE_ENTRIES == HOLDOVERS+1 means that we keep no + * font in active_fonts and the slowness is caused by the holdover + * fonts only. + */ + for (i = 0; i < ACTIVE_FONTS; i++) { + cairo_scaled_font_t *scaled_font; + + m.yy = m.xx * (i + 1); + cairo_set_font_matrix (cr, &m); + + scaled_font = cairo_get_scaled_font (cr); + active_fonts[i] = cairo_scaled_font_reference (scaled_font); + } + + cairo_perf_timer_start (); + + while (loops--) { + m.xx += 1.0; + + /* Generate ITER new scaled fonts per loop */ + for (i = 0; i < ITER; i++) { + m.yy = m.xx * (i + 1); + cairo_set_font_matrix (cr, &m); + cairo_get_scaled_font (cr); + } + } + + cairo_perf_timer_stop (); + + for (i = 0; i < ACTIVE_FONTS; i++) + cairo_scaled_font_destroy (active_fonts[i]); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +hash_table_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "hash-table", NULL); +} + +void +hash_table (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "hash-table", + do_hash_table, NULL); +} diff --git a/perf/micro/hatching.c b/perf/micro/hatching.c new file mode 100644 index 000000000..d1d9fb8a6 --- /dev/null +++ b/perf/micro/hatching.c @@ -0,0 +1,202 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "cairo-perf.h" +#include + + +#define STEP 5 +#define WIDTH 100 +#define HEIGHT 100 + +static void path (cairo_t *cr, unsigned int width, unsigned int height) +{ + unsigned int i; + + for (i = 0; i < width+1; i += STEP) { + cairo_rectangle (cr, i-1, -1, 2, height+2); + cairo_rectangle (cr, -1, i-1, width+2, 2); + } +} + +static void aa (cairo_t *cr) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); +} + +static void mono (cairo_t *cr) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); +} + +static void aligned (cairo_t *cr, int width, int height) +{ +} + +static void misaligned (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, 0.25, 0.25); +} + +static void rotated (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, width/2, height/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -width/2, -height/2); +} + +static void clip (cairo_t *cr) +{ + cairo_clip (cr); + cairo_paint (cr); +} + +static void clip_alpha (cairo_t *cr) +{ + cairo_clip (cr); + cairo_paint_with_alpha (cr, .5); +} + +static cairo_time_t +draw (cairo_t *cr, + void (*prepare) (cairo_t *cr), + void (*transform) (cairo_t *cr, int width, int height), + void (*op) (cairo_t *cr), + int width, int height, int loops) +{ + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + + prepare (cr); + + cairo_perf_timer_start (); + while (loops--) { + cairo_save (cr); + transform (cr, width, height); + path (cr, width, height); + op (cr); + cairo_restore (cr); + } + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +draw_aligned_aa (cairo_t *cr, int width, int height, int loops) +{ + return draw(cr, aa, aligned, cairo_fill, + width, height, loops); +} + +static cairo_time_t +draw_misaligned_aa (cairo_t *cr, int width, int height, int loops) +{ + return draw(cr, aa, misaligned, cairo_fill, + width, height, loops); +} + +static cairo_time_t +draw_rotated_aa (cairo_t *cr, int width, int height, int loops) +{ + return draw(cr, aa, rotated, cairo_fill, + width, height, loops); +} + +static cairo_time_t +draw_aligned_mono (cairo_t *cr, int width, int height, int loops) +{ + return draw(cr, mono, aligned, cairo_fill, + width, height, loops); +} + +static cairo_time_t +draw_misaligned_mono (cairo_t *cr, int width, int height, int loops) +{ + return draw(cr, mono, misaligned, cairo_fill, + width, height, loops); +} + +static cairo_time_t +draw_rotated_mono (cairo_t *cr, int width, int height, int loops) +{ + return draw(cr, mono, rotated, cairo_fill, + width, height, loops); +} + +#define F(name, op,transform,aa) \ +static cairo_time_t \ +draw_##name (cairo_t *cr, int width, int height, int loops) \ +{ return draw(cr, (aa), (transform), (op), width, height, loops); } + +F(clip_aligned, clip, aligned, aa) +F(clip_misaligned, clip, misaligned, aa) +F(clip_rotated, clip, rotated, aa) +F(clip_aligned_mono, clip, aligned, mono) +F(clip_misaligned_mono, clip, misaligned, mono) +F(clip_rotated_mono, clip, rotated, mono) + +F(clip_alpha_aligned, clip_alpha, aligned, aa) +F(clip_alpha_misaligned, clip_alpha, misaligned, aa) +F(clip_alpha_rotated, clip_alpha, rotated, aa) +F(clip_alpha_aligned_mono, clip_alpha, aligned, mono) +F(clip_alpha_misaligned_mono, clip_alpha, misaligned, mono) +F(clip_alpha_rotated_mono, clip_alpha, rotated, mono) + +cairo_bool_t +hatching_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "hatching", NULL); +} + +void +hatching (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "hatching-aligned-aa", draw_aligned_aa, NULL); + cairo_perf_run (perf, "hatching-misaligned-aa", draw_misaligned_aa, NULL); + cairo_perf_run (perf, "hatching-rotated-aa", draw_rotated_aa, NULL); + cairo_perf_run (perf, "hatching-aligned-mono", draw_aligned_mono, NULL); + cairo_perf_run (perf, "hatching-misaligned-mono", draw_misaligned_mono, NULL); + cairo_perf_run (perf, "hatching-rotated-mono", draw_rotated_mono, NULL); + + cairo_perf_run (perf, "hatching-clip-aligned-aa", draw_clip_aligned, NULL); + cairo_perf_run (perf, "hatching-clip-misaligned-aa", draw_clip_misaligned, NULL); + cairo_perf_run (perf, "hatching-clip-rotated-aa", draw_clip_rotated, NULL); + cairo_perf_run (perf, "hatching-clip-aligned-mono", draw_clip_aligned_mono, NULL); + cairo_perf_run (perf, "hatching-clip-misaligned-mono", draw_clip_misaligned_mono, NULL); + cairo_perf_run (perf, "hatching-clip-rotated-mono", draw_clip_rotated_mono, NULL); + + cairo_perf_run (perf, "hatching-clip-alpha-aligned-aa", draw_clip_alpha_aligned, NULL); + cairo_perf_run (perf, "hatching-clip-alpha-misaligned-aa", draw_clip_alpha_misaligned, NULL); + cairo_perf_run (perf, "hatching-clip-alpha-rotated-aa", draw_clip_alpha_rotated, NULL); + cairo_perf_run (perf, "hatching-clip-alpha-aligned-mono", draw_clip_alpha_aligned_mono, NULL); + cairo_perf_run (perf, "hatching-clip-alpha-misaligned-mono", draw_clip_alpha_misaligned_mono, NULL); + cairo_perf_run (perf, "hatching-clip-alpha-rotated-mono", draw_clip_alpha_rotated_mono, NULL); +} diff --git a/perf/micro/intersections.c b/perf/micro/intersections.c new file mode 100644 index 000000000..57931faf8 --- /dev/null +++ b/perf/micro/intersections.c @@ -0,0 +1,160 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2008 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "cairo-perf.h" + +#define NUM_SEGMENTS 256 + +static unsigned state; +static double +uniform_random (double minval, double maxval) +{ + static unsigned const poly = 0x9a795537U; + unsigned n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +draw_random (cairo_t *cr, cairo_fill_rule_t fill_rule, + int width, int height, int loops) +{ + double x[NUM_SEGMENTS]; + double y[NUM_SEGMENTS]; + int i; + + cairo_save (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + for (i = 0; i < NUM_SEGMENTS; i++) { + x[i] = uniform_random (0, width); + y[i] = uniform_random (0, height); + } + + state = 0x12345678; + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, fill_rule); + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_new_path (cr); + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) + cairo_line_to (cr, x[i], y[i]); + cairo_close_path (cr); + + cairo_perf_timer_start (); + while (loops--) + cairo_fill_preserve (cr); + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +draw_random_curve (cairo_t *cr, cairo_fill_rule_t fill_rule, + int width, int height, int loops) +{ + double x[3*NUM_SEGMENTS]; + double y[3*NUM_SEGMENTS]; + int i; + + cairo_save (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + for (i = 0; i < 3*NUM_SEGMENTS; i++) { + x[i] = uniform_random (0, width); + y[i] = uniform_random (0, height); + } + + state = 0x12345678; + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, fill_rule); + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_new_path (cr); + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) { + cairo_curve_to (cr, + x[3*i+0], y[3*i+0], + x[3*i+1], y[3*i+1], + x[3*i+2], y[3*i+2]); + } + cairo_close_path (cr); + + cairo_perf_timer_start (); + while (loops--) + cairo_fill_preserve (cr); + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +random_eo (cairo_t *cr, int width, int height, int loops) +{ + return draw_random (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops); +} + +static cairo_time_t +random_nz (cairo_t *cr, int width, int height, int loops) +{ + return draw_random (cr, CAIRO_FILL_RULE_WINDING, width, height, loops); +} + +static cairo_time_t +random_curve_eo (cairo_t *cr, int width, int height, int loops) +{ + return draw_random_curve (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops); +} + +static cairo_time_t +random_curve_nz (cairo_t *cr, int width, int height, int loops) +{ + return draw_random_curve (cr, CAIRO_FILL_RULE_WINDING, width, height, loops); +} + +cairo_bool_t +intersections_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "intersections", NULL); +} + +void +intersections (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "intersections-nz-fill", random_nz, NULL); + cairo_perf_run (perf, "intersections-eo-fill", random_eo, NULL); + + cairo_perf_run (perf, "intersections-nz-curve-fill", random_curve_nz, NULL); + cairo_perf_run (perf, "intersections-eo-curve-fill", random_curve_eo, NULL); +} diff --git a/perf/micro/line.c b/perf/micro/line.c new file mode 100644 index 000000000..3ed5f8dac --- /dev/null +++ b/perf/micro/line.c @@ -0,0 +1,222 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static cairo_time_t +horizontal (cairo_t *cr, int width, int height, int loops) +{ + double h = height/2 + .5; + + cairo_move_to (cr, 0, h); + cairo_line_to (cr, width, h); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +horizontal_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return horizontal (cr, width, height, loops); +} + +static cairo_time_t +horizontal_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return horizontal (cr, width, height, loops); +} + +static cairo_time_t +nearly_horizontal (cairo_t *cr, int width, int height, int loops) +{ + double h = height/2; + + cairo_move_to (cr, 0, h); + cairo_line_to (cr, width, h+1); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +nearly_horizontal_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return nearly_horizontal (cr, width, height, loops); +} + +static cairo_time_t +nearly_horizontal_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return nearly_horizontal (cr, width, height, loops); +} + + +static cairo_time_t +vertical (cairo_t *cr, int width, int height, int loops) +{ + double w = width/2 + .5; + + cairo_move_to (cr, w, 0); + cairo_line_to (cr, w, height); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +vertical_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return vertical (cr, width, height, loops); +} + +static cairo_time_t +vertical_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return vertical (cr, width, height, loops); +} + +static cairo_time_t +nearly_vertical (cairo_t *cr, int width, int height, int loops) +{ + double w = width/2; + + cairo_move_to (cr, w, 0); + cairo_line_to (cr, w+1, height); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +nearly_vertical_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return nearly_vertical (cr, width, height, loops); +} + +static cairo_time_t +nearly_vertical_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return nearly_vertical (cr, width, height, loops); +} + + +static cairo_time_t +diagonal (cairo_t *cr, int width, int height, int loops) +{ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, width, height); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +diagonal_hair (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return diagonal (cr, width, height, loops); +} + +static cairo_time_t +diagonal_wide (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return diagonal (cr, width, height, loops); +} + +cairo_bool_t +line_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "line", NULL); +} + +void +line (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + + cairo_perf_run (perf, "line-hh", horizontal_hair, NULL); + cairo_perf_run (perf, "line-hw", horizontal_wide, NULL); + cairo_perf_run (perf, "line-nhh", nearly_horizontal_hair, NULL); + cairo_perf_run (perf, "line-nhw", nearly_horizontal_wide, NULL); + + cairo_perf_run (perf, "line-vh", vertical_hair, NULL); + cairo_perf_run (perf, "line-vw", vertical_wide, NULL); + cairo_perf_run (perf, "line-nvh", nearly_vertical_hair, NULL); + cairo_perf_run (perf, "line-nvw", nearly_vertical_wide, NULL); + + cairo_perf_run (perf, "line-dh", diagonal_hair, NULL); + cairo_perf_run (perf, "line-dw", diagonal_wide, NULL); +} diff --git a/perf/micro/long-dashed-lines.c b/perf/micro/long-dashed-lines.c new file mode 100644 index 000000000..ba66a4af4 --- /dev/null +++ b/perf/micro/long-dashed-lines.c @@ -0,0 +1,74 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* + * Copyright © 2007 Mozilla Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_long_dashed_lines (cairo_t *cr, int width, int height, int loops) +{ + double dash[2] = { 2.0, 2.0 }; + int i; + + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_set_dash (cr, dash, 2, 0.0); + + cairo_new_path (cr); + cairo_set_line_width (cr, 1.0); + + for (i = 0; i < height-1; i++) { + double y0 = (double) i + 0.5; + cairo_move_to (cr, 0.0, y0); + cairo_line_to (cr, width, y0); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +long_dashed_lines_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "long-dashed-lines", NULL); +} + +void +long_dashed_lines (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "long-dashed-lines", do_long_dashed_lines, NULL); +} diff --git a/perf/micro/long-lines.c b/perf/micro/long-lines.c new file mode 100644 index 000000000..a0d134c2d --- /dev/null +++ b/perf/micro/long-lines.c @@ -0,0 +1,148 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +/* This test case is designed to illustrate a performance bug in + * drawing very long lines, where most of the line is out of bounds of + * the destination surface, (but some portion of the line is + * visibile). These results are in the "long-lines-uncropped" report. + * + * For comparison, this test also renders the visible portions of the + * same lines, (this is the "long-lines-cropped" report). + */ + +typedef enum { + LONG_LINES_CROPPED = 0x1, + LONG_LINES_ONCE = 0x2, +} long_lines_crop_t; +#define NUM_LINES 20 +#define LONG_FACTOR 50.0 + +static cairo_time_t +do_long_lines (cairo_t *cr, int width, int height, int loops, long_lines_crop_t crop) +{ + int i; + double x, y, dx, dy, min_x, min_y, max_x, max_y; + double outer_width, outer_height; + + cairo_save (cr); + + cairo_translate (cr, width / 2, height / 2); + + if (crop & LONG_LINES_CROPPED) { + outer_width = width; + outer_height = height; + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); /* green */ + } else { + outer_width = LONG_FACTOR * width; + outer_height = LONG_FACTOR * height; + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); /* red */ + } + + min_x = x = - outer_width / 2.0; + min_y = y = - outer_height / 2.0; + max_x = outer_width / 2.0; + max_y = outer_height / 2.0; + dx = outer_width / NUM_LINES; + dy = outer_height / NUM_LINES; + + cairo_perf_timer_start (); + + while (loops--) { + for (i = 0; i <= NUM_LINES; i++) { + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, x, min_y); + if ((crop & LONG_LINES_ONCE) == 0) + cairo_stroke (cr); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, x, max_y); + if ((crop & LONG_LINES_ONCE) == 0) + cairo_stroke (cr); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, min_x, y); + if ((crop & LONG_LINES_ONCE) == 0) + cairo_stroke (cr); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, max_x, y); + if ((crop & LONG_LINES_ONCE) == 0) + cairo_stroke (cr); + + x += dx; + y += dy; + } + if (crop & LONG_LINES_ONCE) + cairo_stroke (cr); + } + + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +long_lines_uncropped (cairo_t *cr, int width, int height, int loops) +{ + return do_long_lines (cr, width, height, loops, 0); +} + +static cairo_time_t +long_lines_uncropped_once (cairo_t *cr, int width, int height, int loops) +{ + return do_long_lines (cr, width, height, loops, LONG_LINES_ONCE); +} + +static cairo_time_t +long_lines_cropped (cairo_t *cr, int width, int height, int loops) +{ + return do_long_lines (cr, width, height, loops, LONG_LINES_CROPPED); +} + +static cairo_time_t +long_lines_cropped_once (cairo_t *cr, int width, int height, int loops) +{ + return do_long_lines (cr, width, height, loops, LONG_LINES_CROPPED | LONG_LINES_ONCE); +} + +cairo_bool_t +long_lines_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "long-lines", NULL); +} + +void +long_lines (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "long-lines-uncropped", long_lines_uncropped, NULL); + cairo_perf_run (perf, "long-lines-uncropped-once", long_lines_uncropped_once, NULL); + cairo_perf_run (perf, "long-lines-cropped", long_lines_cropped, NULL); + cairo_perf_run (perf, "long-lines-cropped-once", long_lines_cropped_once, NULL); +} diff --git a/perf/micro/many-curves.c b/perf/micro/many-curves.c new file mode 100644 index 000000000..f985d349a --- /dev/null +++ b/perf/micro/many-curves.c @@ -0,0 +1,135 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_many_curves_stroked (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height)); + for (count = 0; count < 1000; count++) { + double x1 = uniform_random (0, width); + double x2 = uniform_random (0, width); + double x3 = uniform_random (0, width); + double y1 = uniform_random (0, height); + double y2 = uniform_random (0, height); + double y3 = uniform_random (0, height); + cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_curves_hair_stroked (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + return do_many_curves_stroked (cr, width, height, loops); +} + +static cairo_time_t +do_many_curves_wide_stroked (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 5.); + return do_many_curves_stroked (cr, width, height, loops); +} + +static cairo_time_t +do_many_curves_filled (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double x0 = uniform_random (0, width); + double x1 = uniform_random (0, width); + double x2 = uniform_random (0, width); + double x3 = uniform_random (0, width); + double xm = uniform_random (0, width); + double xn = uniform_random (0, width); + double y0 = uniform_random (0, height); + double y1 = uniform_random (0, height); + double y2 = uniform_random (0, height); + double y3 = uniform_random (0, height); + double ym = uniform_random (0, height); + double yn = uniform_random (0, height); + cairo_move_to (cr, xm, ym); + cairo_curve_to (cr, x1, y1, x2, y2, xn, yn); + cairo_curve_to (cr, x3, y3, x0, y0, xm, ym); + cairo_close_path (cr); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +many_curves_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "many-curves", NULL); +} + +void +many_curves (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + + cairo_perf_run (perf, "many-curves-hair-stroked", do_many_curves_hair_stroked, NULL); + cairo_perf_run (perf, "many-curves-wide-stroked", do_many_curves_wide_stroked, NULL); + cairo_perf_run (perf, "many-curves-filled", do_many_curves_filled, NULL); +} diff --git a/perf/micro/many-fills.c b/perf/micro/many-fills.c new file mode 100644 index 000000000..9d3fd6435 --- /dev/null +++ b/perf/micro/many-fills.c @@ -0,0 +1,187 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + + +/* This is a variant on many strokes where we precompute + * a simplified stroke-to-path. + * When we have a real stroke-to-path, it would useful to compare the cost + * of stroking vs filling the "identical" paths. + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_many_fills_ha (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double y = floor (uniform_random (0, height)); + double x = floor (uniform_random (0, width)); + cairo_rectangle (cr, x, y, ceil (uniform_random (0, width)) - x, 1); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_fills_h (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double y = uniform_random (0, height); + double x = uniform_random (0, width); + cairo_rectangle (cr, x, y, uniform_random (0, width) - x, 1); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_fills_va (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double x = floor (uniform_random (0, width)); + double y = floor (uniform_random (0, height)); + cairo_rectangle (cr, x, y, 1, ceil (uniform_random (0, height) - y)); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_fills_v (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double x = uniform_random (0, width); + double y = uniform_random (0, height); + cairo_rectangle (cr, x, y, 1, uniform_random (0, height) - y); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_fills (cairo_t *cr, int width, int height, int loops) +{ + int count; + + /* lots and lots of overlapping stroke-like fills */ + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + cairo_save (cr); + cairo_translate (cr, + uniform_random (0, width), + uniform_random (0, height)); + cairo_rotate (cr, uniform_random (-M_PI,M_PI)); + cairo_rectangle (cr, 0, 0, uniform_random (0, width), 1); + cairo_restore (cr); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +many_fills_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "many-fills", NULL); +} + +void +many_fills (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "many-fills-halign", do_many_fills_ha, NULL); + cairo_perf_run (perf, "many-fills-valign", do_many_fills_va, NULL); + cairo_perf_run (perf, "many-fills-horizontal", do_many_fills_h, NULL); + cairo_perf_run (perf, "many-fills-vertical", do_many_fills_v, NULL); + cairo_perf_run (perf, "many-fills-random", do_many_fills, NULL); +} diff --git a/perf/micro/many-strokes.c b/perf/micro/many-strokes.c new file mode 100644 index 000000000..9aeb393de --- /dev/null +++ b/perf/micro/many-strokes.c @@ -0,0 +1,186 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_many_strokes_ha (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double h = floor (uniform_random (0, height)) + .5; + cairo_move_to (cr, floor (uniform_random (0, width)), h); + cairo_line_to (cr, ceil (uniform_random (0, width)), h); + } + + cairo_set_line_width (cr, 1.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_strokes_h (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double h = uniform_random (0, height); + cairo_move_to (cr, uniform_random (0, width), h); + cairo_line_to (cr, uniform_random (0, width), h); + } + + cairo_set_line_width (cr, 1.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_strokes_va (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double v = floor (uniform_random (0, width)) + .5; + cairo_move_to (cr, v, floor (uniform_random (0, height))); + cairo_line_to (cr, v, ceil (uniform_random (0, height))); + } + + cairo_set_line_width (cr, 1.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_strokes_v (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double v = uniform_random (0, width); + cairo_move_to (cr, v, uniform_random (0, height)); + cairo_line_to (cr, v, uniform_random (0, height)); + } + + cairo_set_line_width (cr, 1.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_many_strokes (cairo_t *cr, int width, int height, int loops) +{ + int count; + + /* lots and lots of overlapping strokes */ + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + cairo_line_to (cr, + uniform_random (0, width), + uniform_random (0, height)); + } + + cairo_set_line_width (cr, 1.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +many_strokes_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "many-strokes", NULL); +} + +void +many_strokes (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "many-strokes-halign", do_many_strokes_ha, NULL); + cairo_perf_run (perf, "many-strokes-valign", do_many_strokes_va, NULL); + cairo_perf_run (perf, "many-strokes-horizontal", do_many_strokes_h, NULL); + cairo_perf_run (perf, "many-strokes-vertical", do_many_strokes_v, NULL); + cairo_perf_run (perf, "many-strokes-random", do_many_strokes, NULL); +} diff --git a/perf/micro/mask.c b/perf/micro/mask.c new file mode 100644 index 000000000..11a3ba730 --- /dev/null +++ b/perf/micro/mask.c @@ -0,0 +1,305 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_mask_solid (cairo_t *cr, int width, int height, int loops) +{ + cairo_pattern_t *mask; + + mask = cairo_pattern_create_rgba (0, 0, 0, .5); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_surface_t * +init_surface (cairo_surface_t *surface, int width, int height) +{ + cairo_t *cr; + + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr, 0, 0, 0); /* back */ + cairo_paint (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); /* 50% */ + cairo_new_path (cr); + cairo_rectangle (cr, 0, 0, width/2.0, height/2.0); + cairo_rectangle (cr, width/2.0, height/2.0, width/2.0, height/2.0); + cairo_fill (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_time_t +do_mask_image (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + + surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + mask = cairo_pattern_create_for_surface (init_surface (surface, + width, + height)); + cairo_surface_destroy (surface); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_image_half (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + cairo_matrix_t matrix; + + surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + mask = cairo_pattern_create_for_surface (init_surface (surface, + width, + height)); + cairo_surface_destroy (surface); + cairo_matrix_init_scale (&matrix, .5, .5); + cairo_pattern_set_matrix (mask, &matrix); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_image_double (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + cairo_matrix_t matrix; + + surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + mask = cairo_pattern_create_for_surface (init_surface (surface, + width, + height)); + cairo_surface_destroy (surface); + cairo_matrix_init_scale (&matrix, 2., 2.); + cairo_pattern_set_matrix (mask, &matrix); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_similar (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, width, height); + mask = cairo_pattern_create_for_surface (init_surface (surface, + width, + height)); + cairo_surface_destroy (surface); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_similar_half (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + cairo_matrix_t matrix; + + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, width, height); + mask = cairo_pattern_create_for_surface (init_surface (surface, + width, + height)); + cairo_surface_destroy (surface); + cairo_matrix_init_scale (&matrix, .5, .5); + cairo_pattern_set_matrix (mask, &matrix); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_similar_double (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + cairo_matrix_t matrix; + + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, width, height); + mask = cairo_pattern_create_for_surface (init_surface (surface, + width, + height)); + cairo_surface_destroy (surface); + cairo_matrix_init_scale (&matrix, 2., 2.); + cairo_pattern_set_matrix (mask, &matrix); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_linear (cairo_t *cr, int width, int height, int loops) +{ + cairo_pattern_t *mask; + + mask = cairo_pattern_create_linear (0.0, 0.0, width, height); + cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 0.5); /* 50% */ + cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 1.0); /* 100% */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mask_radial (cairo_t *cr, int width, int height, int loops) +{ + cairo_pattern_t *mask; + + mask = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0, + width/2.0, height/2.0, width/2.0); + cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 0.5); /* 50% */ + cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 1.0); /* 100% */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask (cr, mask); + + cairo_perf_timer_stop (); + + cairo_pattern_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +mask_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "mask", NULL); +} + +void +mask (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + if (! cairo_perf_can_run (perf, "mask", NULL)) + return; + + cairo_perf_cover_sources_and_operators (perf, "mask-solid", + do_mask_solid, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-image", + do_mask_image, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-image-half", + do_mask_image_half, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-image-double", + do_mask_image_double, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-similar", + do_mask_similar, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-similar-half", + do_mask_similar_half, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-similar-double", + do_mask_similar_double, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-linear", + do_mask_linear, NULL); + cairo_perf_cover_sources_and_operators (perf, "mask-radial", + do_mask_radial, NULL); +} diff --git a/perf/micro/mosaic.c b/perf/micro/mosaic.c new file mode 100644 index 000000000..ed30ae555 --- /dev/null +++ b/perf/micro/mosaic.c @@ -0,0 +1,176 @@ +/* + * Copyright © 2006 Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Joonas Pihlaja + */ +#include "cairo-perf.h" + +/* Options passed in flags to mosaic_perform(): */ +#define MOSAIC_FILL 1 /* do rasterise */ +#define MOSAIC_TESSELLATE 0 /* just tessellate */ +#define MOSAIC_CURVE_TO 2 /* use curve bounded regions */ +#define MOSAIC_LINE_TO 0 /* use line bounded regions */ + +struct mosaic_region { + unsigned rgb; /* colour of this region in 0xRRGGBB format */ + unsigned ncurves; /* number of boundary curves. */ +}; + +struct mosaic_region_iter { + int do_curves; + struct mosaic_region const *region; + double const *points; +}; + +#include "mosaic.h" + +static void +mosaic_region_iter_init (struct mosaic_region_iter *iter, int do_curves) +{ + iter->region = mosaic_regions; + iter->points = mosaic_curve_points; + iter->do_curves = do_curves; +} + +/* Create the next closed region as a path. */ +static int +mosaic_next_path (cairo_t *cr, struct mosaic_region_iter *iter) +{ + double const *points = iter->points; + unsigned i; + unsigned ncurves = iter->region->ncurves; + if (0 == ncurves) { + return 0; + } + + cairo_new_path (cr); + cairo_move_to (cr, points[0], points[1]); + points += 2; + for (i=0; i < ncurves; i++, points += 6) { + if (iter->do_curves) { + cairo_curve_to (cr, + points[0], points[1], + points[2], points[3], + points[4], points[5]); + } + else { + cairo_line_to (cr, + points[4], points[5]); + } + } + cairo_close_path (cr); + { + unsigned rgb = iter->region->rgb; + double r = ((rgb >> 16) & 255) / 255.0; + double g = ((rgb >> 8) & 255) / 255.0; + double b = ((rgb >> 0) & 255) / 255.0; + cairo_set_source_rgb (cr, r, g, b); + } + + iter->points = iter->points + 2*(1 + 3*iter->region->ncurves); + iter->region++; + return 1; +} + +static cairo_time_t +mosaic_perform(cairo_t *cr, unsigned flags, int width, int height, int loops) +{ + struct mosaic_region_iter iter; + + /* Scale to fit the window.*/ + double minx = -40.7; + double maxx = 955.1; + double miny = -88.4; + double maxy = 884.5; + + cairo_identity_matrix (cr); + + if (flags & MOSAIC_FILL) { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 0, 0, width, height); + cairo_fill (cr); + } + + cairo_scale (cr, width / (maxx - minx) , height / (maxy - miny)); + cairo_translate (cr, -minx, -miny); + + /* Iterate over all closed regions in the mosaic filling or + * tessellating them as dictated by the flags. */ + + cairo_perf_timer_start (); + while (loops--) { + mosaic_region_iter_init (&iter, flags & MOSAIC_CURVE_TO); + while (mosaic_next_path (cr, &iter)) { + if (flags & MOSAIC_FILL) { + cairo_fill (cr); + } + else { + double x, y; + cairo_get_current_point (cr, &x, &y); + cairo_in_fill (cr, x, y); + } + } + } + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +mosaic_fill_curves (cairo_t *cr, int width, int height, int loops) +{ + return mosaic_perform (cr, MOSAIC_FILL | MOSAIC_CURVE_TO, width, height, loops); +} + +static cairo_time_t +mosaic_fill_lines (cairo_t *cr, int width, int height, int loops) +{ + return mosaic_perform (cr, MOSAIC_FILL | MOSAIC_LINE_TO, width, height, loops); +} + +static cairo_time_t +mosaic_tessellate_lines (cairo_t *cr, int width, int height, int loops) +{ + return mosaic_perform (cr, MOSAIC_TESSELLATE | MOSAIC_LINE_TO, width, height, loops); +} + +static cairo_time_t +mosaic_tessellate_curves (cairo_t *cr, int width, int height, int loops) +{ + return mosaic_perform (cr, MOSAIC_TESSELLATE | MOSAIC_CURVE_TO, width, height, loops); +} + +cairo_bool_t +mosaic_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "mosaic", NULL); +} + +void +mosaic (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "mosaic-fill-curves", mosaic_fill_curves, NULL); + cairo_perf_run (perf, "mosaic-fill-lines", mosaic_fill_lines, NULL); + cairo_perf_run (perf, "mosaic-tessellate-curves", mosaic_tessellate_curves, NULL); + cairo_perf_run (perf, "mosaic-tessellate-lines", mosaic_tessellate_lines, NULL); +} diff --git a/perf/micro/mosaic.h b/perf/micro/mosaic.h new file mode 100644 index 000000000..e106864a3 --- /dev/null +++ b/perf/micro/mosaic.h @@ -0,0 +1,4387 @@ +/* Synthesised data. */ +static struct mosaic_region const mosaic_regions[] = { +{0xef55b4,7},{0xf93bc6,11},{0xf28085,5},{0x92acbc,7}, +{0x85c3b1,7},{0xc3bc79,5},{0xd09d8d,5},{0xa788cb,8}, +{0xeff90f,14},{0x976ef2,4},{0xf230d8,5},{0xe226ef,6}, +{0xf49571,9},{0xcb6cc1,4},{0xc8af80,5},{0xf71ce7,8}, +{0xd38b9a,6},{0xf70ff2,8},{0xec907e,4},{0xf44abc,5}, +{0xf42bd8,7},{0xcbbc71,5},{0xf7a45f,5},{0xb15aec,3}, +{0xfc6995,9},{0x42bef9,7},{0x83afc6,5},{0xbe9f9a,6}, +{0x95ef76,6},{0xfcc33b,20},{0xbc5ae2,5},{0x69f997,7}, +{0x9f69f2,7},{0x79bec3,7},{0xda3de2,6},{0x76dda7,6}, +{0xc888aa,7},{0xd871b1,9},{0xda29f7,14},{0xe03dda,9}, +{0xec29e2,5},{0xd82bf4,6},{0x8b8de2,6},{0xf7af52,3}, +{0x9f69f2,7},{0xf46c9a,9},{0xf74fb1,5},{0x21eaef,9}, +{0xea769a,8},{0x0feffc,5},{0xdada45,8},{0xafce7b,6}, +{0x48bef4,6},{0x9a79e5,3},{0xe2fc1c,7},{0xc3be76,9}, +{0xb9c37e,5},{0xc6b183,10},{0xa2acac,3},{0xc395a2,4}, +{0xbc88b4,7},{0xeaf41c,5},{0xea24ea,4},{0xd038f2,5}, +{0x5ae2bc,9},{0xdac15f,8},{0x5fe5b4,6},{0xce5ad3,15}, +{0xf419ec,4},{0xa7bc97,11},{0xea4ac3,6},{0xd02ef9,5}, +{0xb995aa,5},{0xef808b,6},{0xe22bea,34},{0xe24fc6,4}, +{0xef12f9,7},{0x7b9de0,8},{0x85ec85,4},{0xfc7e80,12}, +{0x9a85d8,5},{0xfc00fc,7},{0x9d90ce,5},{0xf4be45,9}, +{0xe5e52e,3},{0xfc0cef,7},{0xd83be5,8},{0x4dc6e5,5}, +{0xacda73,9},{0x4fc8e0,6},{0xbc88b6,4},{0xb4bc8b,6}, +{0xec45c6,8},{0x71d3b6,4},{0xe73dd5,5},{0x21fcda,4}, +{0xe055c6,9},{0x3becd0,8},{0x57e0c1,5},{0x71bec8,9}, +{0x8be28b,4},{0x4dddd0,9},{0xda9a85,6},{0xaa6ce2,4}, +{0x5ad5cb,9},{0x67f49d,12},{0xfc07f7,9},{0x42c8ec,16}, +{0xefc148,4},{0xda6eb1,7},{0x55bee7,4},{0xd33bea,6}, +{0x809fd8,14},{0xd82ef2,4},{0x21ddfc,5},{0x83e097,7}, +{0x8bcba2,9},{0xd864bc,8},{0xa7d87b,6},{0xc3a78d,6}, +{0xb9a79a,8},{0xd59590,3},{0xfc0af2,6},{0xe52be7,7}, +{0xce52d8,5},{0xe22bea,4},{0xe719f7,5},{0x909fcb,3}, +{0xa7da76,6},{0xdd38e5,4},{0xfc55aa,6},{0x19f2ef,6}, +{0x83da9d,5},{0x9fc892,6},{0xe51ef4,9},{0xce3dec,5}, +{0xea3dd0,7},{0x4ad3dd,6},{0x6ea2e7,5},{0xf92bd3,4}, +{0xc34aea,8},{0x2eddef,4},{0xe7799a,8},{0xe5799a,11}, +{0xe224f2,3},{0xf90af7,6},{0x61a2f4,6},{0xb67ec6,13}, +{0xe75cb4,7},{0xfcb945,16},{0xd3b173,7},{0xfc00fc,6}, +{0xd5ef33,5},{0x699df4,9},{0xf707f9,4},{0xdaea33,6}, +{0xe2dd38,3},{0xf2d036,5},{0xf248c1,6},{0xeaf21c,5}, +{0xec40cb,7},{0xf24abc,5},{0xf42bd8,4},{0xa757f9,5}, +{0xd02ef9,6},{0xfc0cf2,7},{0xb16cda,5},{0xea36d8,8}, +{0xd036f4,7},{0xb648fc,3},{0xea4dc1,4},{0x64c8cb,7}, +{0xfc05f7,3},{0xfc00fc,4},{0xf4a75f,6},{0xc85ad5,5}, +{0xd873ac,5},{0xd5a77b,11},{0xe7c84a,4},{0xec19f4,7}, +{0xc864ce,7},{0xcece5c,5},{0xe08b8d,5},{0xd84dd3,3}, +{0x07f9f7,9},{0x5cefac,3},{0xfc02f9,4},{0xd048e0,8}, +{0xef55b6,4},{0xa269ec,7},{0xec12f9,3},{0xd380a4,11}, +{0x5fcbd0,6},{0x90c1a7,5},{0x95dd85,5},{0xceda4f,9}, +{0x4fb9f2,14},{0xb65aea,7},{0xea838d,5},{0xf917ea,4}, +{0xc833fc,9},{0xe252c3,9},{0xef0ffc,7},{0x1cf2ec,9}, +{0x9f6cef,4},{0xf73dc6,12},{0x90b6b4,5},{0xb44ff7,7}, +{0xea2be2,12},{0xd02efc,17},{0xa276e2,4},{0x79c1c1,3}, +{0xc855dd,9},{0xb1d571,8},{0xb645fc,6},{0xd03bef,6}, +{0x42eccb,9},{0xea67aa,5},{0x9079ef,6},{0x9de773,7}, +{0xe55abc,6},{0xf421e5,3},{0x5cf9a4,6},{0xc373c1,5}, +{0x5fe2b6,4},{0xea24ec,6},{0x9af967,4},{0xf7be45,5}, +{0xd333f4,5},{0xc6d061,8},{0xb96cd3,8},{0xda64b9,6}, +{0xe79779,4},{0xac67e7,6},{0xcb67c8,4},{0xa45cf7,3}, +{0xd3859f,3},{0xd857c8,4},{0x42c1f7,8},{0xaf61e7,6}, +{0xea14fc,6},{0xda33ea,10},{0x5af2af,5},{0xbe40f9,3}, +{0x9de773,3},{0xe72be5,4},{0x4ae7c6,5},{0xaa88c8,8}, +{0x36f9cb,3},{0xc1a790,8},{0xf905fc,5},{0xbcaa95,6}, +{0x839dda,3},{0xfc00fc,6},{0xb6d86c,3},{0xdd40da,6}, +{0xb46cda,7},{0x839fd5,4},{0xc167d3,13},{0xf20ff7,9}, +{0xe024f4,9},{0xf41ee5,4},{0x909ad0,10},{0xb1d376,8}, +{0xce2efc,5},{0x29d5f9,7},{0xd0b96e,6},{0xdd69b4,5}, +{0xfc05f7,5},{0xdd26f7,4},{0xea1eef,6},{0xb64df7,9}, +{0x21e5f2,3},{0x4fd8d0,6},{0xd345e0,7},{0xfc00fc,3}, +{0xe569ac,5},{0xecb655,11},{0xfc5aa2,9},{0xb4d571,7}, +{0xaa57f7,6},{0xfc00fc,7},{0xe729ea,10},{0xea24ea,11}, +{0xb14df9,5},{0xf707fc,7},{0x5cd8c3,5},{0xea17f9,9}, +{0xc3d364,6},{0xa77ed3,4},{0x9569f9,8},{0x0ff4f4,4}, +{0xbc9aa4,7},{0xc140f7,10},{0xf705fc,8},{0xb44df9,4}, +{0xa479dd,5},{0xf705fc,5},{0xce8d9d,5},{0xf905f9,5}, +{0xdd2bef,7},{0xea14f9,5},{0xddbc61,5},{0xc13dfc,8}, +{0x79c8b6,10},{0xf79a67,6},{0xb4a79f,12},{0x97a7bc,7}, +{0xb9c17e,4},{0xf430d5,3},{0x2ee0ea,7},{0xf919e7,4}, +{0xeada33,9},{0xa2da7e,7},{0x8bec80,6},{0xf412f4,5}, +{0xa767ec,3},{0xd824fc,7},{0xe224f2,3},{0xfc07f7,4}, +{0xfc00fc,3},{0xe55cb6,8},{0xf9768b,7},{0xe5b45f,3}, +{0xd5978b,4},{0xf917e7,5},{0xf70ff4,7},{0x95e283,6}, +{0xb4b98d,5},{0xc83bf4,8},{0x9f88d3,7},{0xa473e0,9}, +{0x9569fc,10},{0x926cf9,7},{0xef14f4,7},{0xf7679a,4}, +{0xaa80ce,9},{0x45f9b9,5},{0xb4a2a2,10},{0xac88c6,5}, +{0xe75ab6,6},{0xa2fc5a,3},{0xc65cd8,7},{0x64e0b6,5}, +{0xfc6992,7},{0xf717ec,4},{0xf438ce,10},{0xf755ac,4}, +{0xf7aa57,6},{0xb9b688,3},{0xcb4de2,4},{0xf9f70a,9}, +{0x92d392,8},{0xef2be0,7},{0x92a7be,4},{0xa276e2,4}, +{0xc34fe5,5},{0xd5c164,9},{0xf219ec,4},{0xef5aaf,8}, +{0xa7c68d,6},{0xd369bc,7},{0xf912ef,4},{0xb9b48b,6}, +{0x3bc6f9,6},{0xe54ac8,5},{0xf71ce7,9},{0xbc4def,8}, +{0xe271a7,3},{0xcbc16e,5},{0x3dfcc1,3},{0x97bea2,7}, +{0xaaa4aa,13},{0x73ef95,5},{0xf74fb1,4},{0xc148ef,17}, +{0xfc26d8,4},{0xfc02fc,6},{0xb1da6c,6},{0xd5d84d,7}, +{0xf96c95,5},{0xf90fef,3},{0xea7b92,7},{0xbc4def,4}, +{0xf2a264,8},{0x40dadd,12},{0xf214f4,4},{0x38c3fc,3}, +{0xf705fc,7},{0xa29db9,3},{0xaaf25f,4},{0xdd9a83,12}, +{0xc188b1,6},{0xa27bda,9},{0x36dde5,4},{0x85bcb9,7}, +{0xfc00fc,5},{0xe76ca4,4},{0x95b6ac,6},{0xb6d071,7}, +{0xc857d8,3},{0xfc2bd3,4},{0xfc5aa4,4},{0xf417ec,5}, +{0xb471d3,7},{0x92b1b6,4},{0x6c90fc,7},{0x5abce2,7}, +{0xcb55d8,3},{0xce30f9,5},{0xea7b95,3},{0xec17f7,6}, +{0xf70ff4,3},{0xaa73dd,9},{0x9d69f4,3},{0xb457ef,6}, +{0xf236d0,6},{0x64e0b4,7},{0xddcb52,4},{0xd0d355,7}, +{0x5fd5c3,6},{0xf42bd8,12},{0x55e2c1,4},{0xb1b492,4}, +{0xdd4dd0,4},{0xbc88b6,3},{0xea21ec,4},{0xf7649d,8}, +{0xb16cda,3},{0x9fa4b6,8},{0xea17f9,4},{0x1efce0,3}, +{0xbec179,7},{0xbeb18b,6},{0x9da4b6,6},{0x48b4fc,4}, +{0x7bfc83,14},{0xacf25c,10},{0xe0d842,4},{0xf9768b,5}, +{0xf90ff2,7},{0xfc00fc,8},{0xf20ff7,5},{0xec7e90,7}, +{0xbc42f9,3},{0xf712ef,5},{0xf902fc,6},{0xf77e83,7}, +{0xb1b197,5},{0xda6cb4,7},{0xf4a264,7},{0xa78dc6,6}, +{0xf21cea,4},{0xa48dc8,6},{0x6997f9,5},{0x67d3be,5}, +{0x4ad0e0,6},{0xcbbe6e,6},{0xcb76b6,10},{0xd030f9,6}, +{0xa29fb6,6},{0xda24fc,5},{0xf4bc48,3},{0xd0909a,6}, +{0xf252b6,8},{0x6cb4da,4},{0xdd40dd,11},{0x8b71fc,9}, +{0x80c8af,7},{0xb15fe7,4},{0x79ef90,6},{0x71b1d8,7}, +{0x61a4f2,9},{0x42dadd,6},{0xaf4ffc,3},{0x9a79e7,5}, +{0xea17f7,6},{0xc89f92,4},{0xb6d869,12},{0xda2eef,4}, +{0xf72ed5,6},{0xe057c3,6},{0xb6b190,6},{0xda48d5,5}, +{0xe0a476,3},{0xfce01c,6},{0x9dbe9f,13},{0xafce7e,4}, +{0xf905fc,6},{0xfc0cef,5},{0x9facaf,6},{0xb6af95,6}, +{0x52ced8,6},{0xd373b4,3},{0xce5cd0,8},{0xe752c1,5}, +{0xf7ac55,8},{0x7bbec1,6},{0xb4d571,4},{0xf90af7,5}, +{0xc833fc,7},{0xbe4dec,8},{0x92beaa,8},{0xfcb945,7}, +{0xc1d067,3},{0xdd45d8,7},{0xceb971,3},{0xf44ab9,4}, +{0xbeac8d,4},{0xf2af5a,15},{0xe05ac1,11},{0xd38b9d,4}, +{0xec0ffc,4},{0x80ec8d,7},{0xd0af7b,6},{0xef5cac,5}, +{0xdaa776,4},{0xd052d8,5},{0xb461e5,8},{0xef8388,7}, +{0xbea297,8},{0xce83a7,5},{0xda2ef2,3},{0x73b6ce,5}, +{0x83ec8b,9},{0xc840f2,7},{0xfc4faf,8},{0xfc14e7,4}, +{0xe742d0,9},{0x52aff7,4},{0xf214f4,4},{0x26f7da,5}, +{0xf2b94d,6},{0xe02eea,6},{0x76fc85,3},{0x858de7,4}, +{0xbc97a4,6},{0xd8aa79,4},{0x9d73ea,4},{0xdda279,5}, +{0xafc385,7},{0x33dde7,6},{0x64acea,8},{0xacce80,7}, +{0xef26e2,7},{0xb957e7,4},{0xdad548,4},{0xaf57f4,5}, +{0x9f73e5,3},{0xeae02e,7},{0xf70af7,8},{0xfc00fc,4}, +{0xea6ca4,6},{0x8885ec,3},{0xe23dda,4},{0xb461e5,10}, +{0xdd928b,6},{0x76cbb6,7},{0xfc00fc,5},{0xce8d9d,8}, +{0xafb692,12},{0xe79083,7},{0xfc0af2,3},{0xf926d8,8}, +{0xe219fc,5},{0xe7bc55,5},{0xcebc6e,3},{0xda73aa,4}, +{0xfc00fc,4},{0x52dace,5},{0xbcd864,6},{0x67e7ac,4}, +{0x33f9cb,3},{0x8bafc1,11},{0xd871af,6},{0xe78390,10}, +{0xb688bc,8},{0x5addc1,6},{0xf2d036,4},{0xf70ff2,9}, +{0xf4ea19,9},{0xfc02f9,6},{0x839fd8,3},{0xdd4dce,5}, +{0xec3dce,6},{0xcea783,6},{0xcbe745,5},{0xc1b483,7}, +{0x799fe0,5},{0xd340e7,7},{0x29ddf2,3},{0x73daac,6}, +{0xea33da,5},{0xe224f2,3},{0xd34fd5,5},{0xe245d3,8}, +{0xfc1edd,10},{0x3bf2cb,4},{0xdd9f7e,26},{0xe02eec,5}, +{0xf47195,4},{0xa461f4,5},{0x3ddae0,3},{0xaf5fea,6}, +{0xbccb73,6},{0xea26ea,8},{0xd82bf7,6},{0xac6ce0,7}, +{0xe524ef,4},{0xb6da69,6},{0xf224e2,5},{0xb95ce5,7}, +{0x73a4e0,7},{0xa4e076,7},{0xfc02f9,8},{0xec1eec,4}, +{0xf7da29,6},{0xc369ce,6},{0xd5c65c,9},{0xe51ef4,4}, +{0xf2a264,4},{0x809ddd,5},{0xd045e2,7},{0xaac888,6}, +{0xb44af9,3},{0xd84ad8,7},{0xf4ef14,5},{0x3bf7c8,5}, +{0xe730e0,4},{0x97b6ac,7},{0x8bda95,5},{0x88ec83,8}, +{0xece529,8},{0x9a80dd,10},{0xf412f4,7},{0x36efd5,6}, +{0xf95ca4,9},{0xd838e7,6},{0x9a69f7,7},{0xf730d3,4}, +{0xd526fc,5},{0x9f76e2,6},{0xe28395,8},{0xecaa61,6}, +{0x4ff4b4,7},{0xd079af,7},{0xa469ea,10},{0xfc21da,7}, +{0xb471d5,6},{0x7b88f7,4},{0xfc6797,4},{0x9daab4,5}, +{0x29f2dd,7},{0x8388ec,7},{0x4df9b1,4},{0xeaf21e,5}, +{0xf4c340,10},{0xf212f7,3},{0xf407fc,5},{0x4fb9ef,9}, +{0xd3b471,6},{0xef4dbe,12},{0x4af4bc,7},{0xe224f2,6}, +{0x36d0f2,8},{0xf707fc,4},{0xfc8d71,9},{0x95bea4,6}, +{0x90ef7b,4},{0x5adac6,5},{0x97b9a7,4},{0xc3c671,6}, +{0xfc12ec,5},{0xea1ef2,5},{0x8dd09d,4},{0xd82bf7,7}, +{0xb18dbc,7},{0xbc64da,6},{0xf28d7b,4},{0xef19ef,5}, +{0xc1e555,6},{0xfc3bc3,6},{0x9f88d3,5},{0xc3ec48,9}, +{0xc8979a,5},{0x5cc6d8,4},{0xf78080,6},{0xb17bcb,8}, +{0xea12fc,6},{0xc195a2,7},{0xef33d8,3},{0xa783ce,3}, +{0xf40af9,5},{0xa288d0,6},{0xf248be,4},{0x14e7fc,5}, +{0x83d3a4,8},{0xb4cb79,6},{0xbc7ebe,3},{0xfc8873,6}, +{0xe038e0,6},{0xc3ef48,6},{0xa25afc,10},{0xc1a792,6}, +{0x8d90dd,9},{0xc1be7b,5},{0x8bec80,5},{0xa4ef64,5}, +{0x38f7c8,11},{0xaf6eda,4},{0xd073b4,5},{0x79ceb4,7}, +{0xd5e540,6},{0xfc0fec,5},{0xf917ea,7},{0x64c8cb,4}, +{0x69e7a7,6},{0xa77ed3,5},{0xe52be7,6},{0x5aaaf4,7}, +{0xcb85a7,5},{0x8392e2,4},{0x5cb4ea,6},{0xe729e7,6}, +{0xc873bc,5},{0xeabc52,7},{0xf438ce,7},{0xea48c8,5}, +{0xef17f4,4},{0xfc00fc,6},{0xf97b85,14},{0x67ace7,3}, +{0xf452b1,7},{0xe2e038,4},{0xa4a7af,5},{0xddb469,3}, +{0xf21cec,7},{0x7bbec1,3},{0xda38e5,8},{0xc6a292,9}, +{0x6ecebc,9},{0x8dda90,4},{0xf921e0,8},{0xc88da4,5}, +{0x92aabc,4},{0x9a9dc3,5},{0x8dd895,4},{0x64d3c3,9}, +{0xa2f95f,7},{0xdd36e5,8},{0x83e790,11},{0xef26e2,5}, +{0xef55b4,9},{0x5fc3d8,6},{0xfc57a4,7},{0x9785dd,5}, +{0x809ddd,4},{0xc66cc8,8},{0xf236d3,5},{0xd338ef,6}, +{0xd8839f,4},{0xef30d8,3},{0x9a9ac6,5},{0xfc05f9,11}, +{0x958bda,11},{0xf902fc,8},{0xbe42f9,4},{0xbce557,6}, +{0xef4fb9,6},{0xf9af52,5},{0x97d38d,5},{0xf902fc,7}, +{0xf4a261,4},{0xd88897,7},{0x92e77e,7},{0x6c9df2,6}, +{0xce85a4,4},{0x9ae07e,8},{0xb1f255,8},{0xc6929f,6}, +{0xf2af5a,10},{0xe2977e,5},{0xe5cb4a,5},{0xfc14e7,3}, +{0xc14aef,3},{0xaff257,3},{0xe21cf9,11},{0xd05ccb,5}, +{0xf2ec1c,8},{0xb4b98b,9},{0xc183b6,3},{0xb455f2,7}, +{0x83aace,4},{0xe51cf9,4},{0xdd4fce,4},{0xb47ec8,3}, +{0x92da8b,4},{0xecb952,4},{0xf70af7,6},{0x7bbcc1,6}, +{0xf40cf9,5},{0xe2ce48,5},{0xf7b14f,5},{0xdd40da,4}, +{0x4fb9f2,7},{0x6eb1da,5},{0x9d90ce,6},{0xcb55d8,5}, +{0xd02efc,8},{0xd36eb9,6},{0xfc0cef,5},{0xe071aa,9}, +{0xe7ac67,3},{0xf4f40f,6},{0xe267af,4},{0xc3da5c,5}, +{0xb945fc,4},{0xeada33,6},{0x7197f2,7},{0xfc00fc,8}, +{0xd09d8d,5},{0x6e9fea,8},{0xd3a77e,4},{0xaa5ff2,6}, +{0xe269ac,5},{0xf426e0,6},{0xfc00fc,5},{0xec6ca2,10}, +{0xc638fc,7},{0xe54fc6,5},{0x5ac6da,3},{0xce67c6,6}, +{0xbe42f9,5},{0xce38f2,5},{0xbe5ae2,3},{0xd3ec38,8}, +{0x8b76f7,8},{0xb180c8,4},{0xd538ec,4},{0xddef2b,9}, +{0xf9c838,5},{0xf457ac,4},{0xf95aa7,7},{0xaf69e0,9}, +{0x67efa2,5},{0xa280d8,4},{0xa7d57b,7},{0xcbaf7e,4}, +{0x837bf9,4},{0xddc15c,6},{0xe221f4,3},{0xc6b480,5}, +{0xbc90af,10},{0x4dd3da,4},{0xbcb983,4},{0xe77997,7}, +{0xe05fb9,9},{0xc1b980,8},{0xdd55c6,7},{0xaf97b1,9}, +{0xec838b,4},{0xc39d9a,9},{0x6c97f7,5},{0xf7b44f,3}, +{0xb69fa4,7},{0x90ea7e,7},{0xe067b1,5},{0xd5cb5a,4}, +{0xc19a9f,8},{0xac67e7,8},{0xcee745,4},{0xf436d0,4}, +{0x73b1d5,7},{0xd3d84f,5},{0xdd42d8,5},{0xea907e,6}, +{0xc83bf4,7},{0xd84fd3,6},{0xe28890,3},{0x38e2e0,8}, +{0xec67a7,6},{0xcbc16e,8},{0x4ab1fc,7},{0x92d590,3}, +{0xaad876,4},{0xb683c1,4},{0xaa55f9,5},{0xea24ea,6}, +{0xf90fef,6},{0xf738c8,3},{0xcb5ad5,7},{0xec21ec,5}, +{0xce61c8,3},{0xa76ce7,3},{0xf41ee5,7},{0xcebe6c,3}, +{0x57dac6,9},{0xf46e97,3},{0x8be08d,7},{0xc148ef,9}, +{0xf926da,8},{0xe029ef,6},{0xfc00fc,5},{0x3dcbf2,4}, +{0xef0ffc,5},{0x95b6ac,9},{0x7be59a,5},{0xda2ef2,8}, +{0xda30ef,5},{0xfc24d8,3},{0x73d3b4,3},{0xddf229,4}, +{0x8883ef,5},{0x5aefaf,6},{0x9797cb,6},{0xcbc16c,5}, +{0xef19f2,5},{0xd3bc6c,3},{0xda5cc3,8},{0x52f9ac,7}, +{0xa7c888,4},{0x69d8b6,7},{0xbc45f7,7},{0xfc02fc,4}, +{0xb4b195,6},{0xe58d85,4},{0x9776ea,6},{0xf255b1,6}, +{0x76dda7,3},{0xe55ab9,8},{0xe230e7,5},{0x3bd0ec,5}, +{0xe219fc,6},{0xcbac83,5},{0xe548ce,7},{0xdd5cbe,3}, +{0xf412f4,5},{0xf9738d,9},{0xdd40da,4},{0x90c6a2,10}, +{0xe038e2,4},{0x6eddaf,8},{0xf23dcb,12},{0xec4fbc,6}, +{0xc8d35c,6},{0xf238d0,6},{0x90cb9f,6},{0xa46ee5,5}, +{0xaf8bbe,5},{0xc1a495,5},{0xc679b9,4},{0xec29e2,6}, +{0xf9649d,6},{0xf924da,6},{0xe224f2,5},{0x8d71f9,7}, +{0xf2cb3d,5},{0xb6cb79,4},{0xa4dd76,6},{0xe52ee5,3}, +{0xaa8bc3,3},{0x838dea,7},{0xf9ea17,5},{0x88c8aa,6}, +{0x73e0a7,5},{0xd09595,6},{0xf7d82b,10},{0xec7397,4}, +{0xfc02fc,7},{0xf72ed3,5},{0xd03dec,4},{0x80cbaf,5}, +{0xf921dd,7},{0x9fcb90,8},{0xbe95a7,4},{0x69eaa4,8}, +{0xf20ff7,5},{0x69e7a7,9},{0xf924da,3},{0xecdd30,6}, +{0xc1d861,4},{0xb967d8,5},{0xb157ef,6},{0xb9bc85,5}, +{0xb192b4,8},{0xda38e5,3},{0xea1eef,6},{0x12f7ef,4}, +{0x6e90f9,6},{0xd573b1,6},{0xdd24f7,5},{0xd5d055,7}, +{0xc86ec1,4},{0xf21ee7,7},{0xa261f4,6},{0xe555c1,4}, +{0xf78b79,6},{0xf78080,5},{0x80b4c3,7},{0xf414ef,4}, +{0xf70ff2,6},{0xea52bc,6},{0xd04ddd,7},{0xf90af4,5}, +{0xe78b88,4},{0xf29f67,6},{0x79b6c8,4},{0xa48dc8,5}, +{0x5fa4f4,4},{0xea14fc,3},{0xf23bcb,7},{0xf738cb,5}, +{0x4fb1f9,3},{0x5ae2bc,7},{0xfcac4f,5},{0xa283d3,7}, +{0xef24e7,7},{0xe5e52e,4},{0x929ace,4},{0xcb36f9,8}, +{0xea21ef,5},{0xf2d038,6},{0x48d8d8,4},{0xec40ce,6}, +{0xf90af7,5},{0xf921dd,7},{0xd8e042,5},{0x21ddf9,4}, +{0x5fb9e2,8},{0xf72ed3,4},{0xfc2ed0,5},{0xf712ef,6}, +{0x57d8cb,5},{0x19fce2,9},{0xe7f71c,9},{0x7be59a,4}, +{0x6cfc90,5},{0xec3bd0,5},{0xea26e7,8},{0x36d5ec,5}, +{0xac76d8,3},{0xa4a4b1,3},{0xef12f7,4},{0x6eb9d3,6}, +{0xe714fc,5},{0xe224f2,5},{0x3bead5,4},{0x8de783,9}, +{0x40d5e2,8},{0x9764fc,7},{0xf705fc,3},{0x8d88e2,8}, +{0xe269ac,6},{0xda33ec,7},{0xd03bec,3},{0xbe6cd0,6}, +{0x8bf479,5},{0xf912ec,8},{0xe5b461,7},{0xaf5aef,6}, +{0xc34fe5,7},{0xd038ef,6},{0x38f9c8,7},{0xf43dc6,3}, +{0xceb973,5},{0xe526ec,4},{0xf902fc,7},{0xbc48f7,4}, +{0,0} +}; + +static double const mosaic_curve_points[] = { +20.3, 216.5, 27.0, 209.8, 17.4, 200.0, 14.5, 183.5, 14.2, 181.8, +13.5, 181.6, 13.9, 180.0, 28.3, 126.1, 29.2, 126.3, 44.2, 72.5, +44.4, 71.7, 44.2, 70.8, 44.2, 70.8, 44.2, 70.8, 44.4, 71.7, +44.2, 72.5, 36.1, 121.4, 36.0, 121.3, 27.9, 170.2, 24.1, 193.3, +33.8, 203.1, 20.3, 216.5, 82.6, 583.9, 82.5, 583.6, 84.3, 583.3, +84.2, 583.1, 88.1, 600.0, 87.2, 600.2, 90.2, 617.3, 92.4, 630.1, +92.4, 630.1, 94.7, 642.9, 96.8, 655.3, 96.8, 655.3, 99.0, 667.8, +100.0, 673.7, 100.1, 673.7, 101.1, 679.7, 107.4, 716.3, 107.3, 716.3, +113.7, 752.9, 115.3, 762.1, 117.1, 771.4, 117.1, 771.4, 117.1, 771.4, +115.3, 762.1, 113.7, 752.9, 108.9, 726.8, 108.9, 726.8, 104.1, 700.7, +97.1, 662.7, 97.1, 662.7, 90.1, 624.8, 86.3, 604.3, 85.5, 604.5, +82.6, 583.9, 37.6, 265.6, 38.8, 286.4, 41.0, 287.6, 36.1, 307.5, +38.5, 298.0, 34.3, 297.0, 32.5, 286.5, 26.4, 251.5, 21.6, 251.7, +20.3, 216.5, 33.8, 203.1, 24.1, 193.3, 27.9, 170.2, 43.4, 214.1, +34.7, 217.8, 37.6, 265.6, 27.9, 170.2, 36.0, 121.3, 36.1, 121.4, +44.2, 72.5, 43.5, 76.1, 44.0, 76.2, 43.9, 79.8, 43.7, 85.4, +43.7, 85.4, 43.5, 91.0, 41.9, 137.6, 41.9, 137.6, 40.3, 184.2, +39.2, 217.8, 39.2, 217.8, 38.1, 251.5, 37.8, 258.5, 36.7, 258.7, +37.6, 265.6, 34.7, 217.8, 43.4, 214.1, 27.9, 170.2, -16.2, 299.0, +-16.2, 299.0, -15.8, 297.4, -15.4, 295.8, -10.3, 274.5, -10.2, 274.5, +-5.1, 253.1, -1.7, 238.6, -1.9, 238.6, 1.6, 224.2, 2.5, 220.5, +2.8, 220.6, 3.6, 216.9, -0.6, 235.0, -0.7, 235.0, -5.1, 253.1, +-10.2, 274.5, -10.3, 274.5, -15.4, 295.8, -15.8, 297.4, -16.2, 299.0, +-16.2, 299.0, 242.4, -11.8, 258.9, -17.0, 261.0, -11.0, 277.2, -16.9, +183.6, 17.7, 182.4, 14.3, 87.6, 45.5, 87.3, 45.5, 87.3, 45.5, +87.1, 45.6, 71.7, 49.5, 71.2, 48.0, 56.4, 53.5, 148.8, 19.4, +148.5, 18.2, 242.4, -11.8, 56.4, 53.5, 52.5, 54.8, 51.1, 57.0, +48.5, 55.6, 47.9, 55.2, 48.4, 50.6, 50.0, 50.0, 134.7, 18.5, +135.0, 19.0, 221.1, -8.6, 231.2, -11.9, 232.5, -8.1, 242.4, -11.8, +148.5, 18.2, 148.8, 19.4, 56.4, 53.5, 194.7, 17.8, 158.4, 27.2, +158.4, 27.2, 122.0, 36.6, 117.5, 37.7, 117.5, 37.7, 112.9, 38.9, +100.2, 42.2, 100.2, 42.2, 87.6, 45.5, 87.3, 45.5, 87.3, 45.5, +87.1, 45.6, 182.1, 14.3, 181.1, 10.8, 277.2, -16.9, 303.4, -24.5, +307.1, -14.6, 331.7, -25.0, 266.4, 2.6, 263.7, -3.7, 195.7, 17.5, +195.2, 17.7, 195.2, 17.7, 194.7, 17.8, 331.7, -25.0, 364.2, -33.4, +365.0, -31.6, 398.6, -34.9, 387.8, -33.8, 388.0, -32.1, 377.4, -29.4, +370.0, -27.5, 370.0, -27.5, 362.6, -25.6, 362.3, -25.5, 362.3, -25.5, +362.0, -25.4, 355.9, -23.9, 355.9, -23.9, 349.8, -22.3, 341.8, -20.2, +341.8, -20.2, 333.7, -18.1, 318.3, -14.2, 318.3, -14.2, 303.0, -10.2, +300.6, -9.6, 300.6, -9.6, 298.2, -9.0, 281.5, -4.7, 281.5, -4.7, +264.9, -0.3, 254.1, 2.4, 254.1, 2.4, 243.2, 5.2, 227.9, 9.2, +227.9, 9.2, 212.6, 13.1, 204.2, 15.3, 204.2, 15.3, 195.7, 17.5, +195.2, 17.7, 195.2, 17.7, 194.7, 17.8, 263.2, -3.6, 262.3, -7.1, +331.7, -25.0, -5.1, 253.1, -0.7, 235.0, -0.6, 235.0, 3.6, 216.9, +7.2, 203.0, 5.7, 202.2, 11.4, 189.1, 6.4, 200.6, 8.2, 201.4, +5.0, 213.7, -0.0, 233.4, 2.9, 234.7, -5.1, 253.1, 0.7, 536.2, +13.6, 573.8, 15.5, 574.7, 18.7, 614.1, 18.8, 616.3, 7.9, 620.2, +7.3, 619.4, -4.6, 602.1, -1.2, 599.1, -6.2, 577.9, -16.0, 536.4, +-28.8, 533.6, -22.2, 494.1, -25.4, 512.7, -6.9, 513.8, 0.7, 536.2, +-22.2, 494.1, -26.0, 485.6, -28.6, 477.0, -25.8, 475.4, -22.7, 473.6, +-14.7, 479.5, -10.5, 487.2, -3.6, 500.3, -7.1, 502.1, -3.7, 517.0, +-2.5, 522.1, -2.5, 522.1, -1.4, 527.1, -0.3, 531.7, -1.6, 532.5, +0.7, 536.2, -6.9, 513.8, -25.4, 512.7, -22.2, 494.1, 19.0, 510.1, +21.7, 515.4, 24.2, 514.1, 29.4, 518.2, 30.9, 519.3, 30.9, 519.3, +32.3, 520.4, 56.0, 538.7, 58.2, 536.4, 79.7, 557.1, 82.9, 560.1, +80.6, 562.5, 81.6, 567.8, 82.9, 575.5, 83.7, 575.4, 84.2, 583.1, +84.3, 583.3, 82.5, 583.6, 82.6, 583.9, 75.0, 587.4, 75.2, 587.9, +67.4, 591.0, 67.4, 591.1, 67.2, 590.6, 66.9, 590.2, 42.9, 550.1, +40.5, 551.4, 19.0, 510.1, 121.8, 800.9, 121.7, 801.1, 122.3, 801.2, +122.4, 801.6, 123.7, 808.3, 126.5, 809.3, 124.7, 815.1, 125.1, 813.8, +120.1, 813.3, 119.5, 810.6, 118.6, 806.2, 120.3, 805.6, 121.8, 800.9, +0.7, 495.9, 3.7, 500.5, 5.2, 499.5, 9.8, 503.0, 14.4, 506.5, +15.9, 505.5, 19.0, 510.1, 40.5, 551.4, 42.9, 550.1, 66.9, 590.2, +63.6, 584.5, 63.1, 584.8, 59.4, 579.4, 30.0, 537.7, 28.5, 538.7, +0.7, 495.9, 113.7, 752.9, 115.3, 762.1, 117.1, 771.4, 117.1, 771.4, +117.4, 773.4, 117.4, 773.4, 117.8, 775.3, 120.1, 788.5, 120.3, 788.4, +122.4, 801.6, 122.3, 801.2, 121.7, 801.1, 121.8, 800.9, 121.4, 800.4, +121.4, 800.4, 121.0, 799.9, 120.6, 799.4, 120.6, 799.4, 120.3, 798.9, +95.0, 767.1, 74.8, 770.0, 69.8, 735.3, 71.5, 747.0, 95.6, 739.1, +113.7, 752.9, 69.8, 735.3, 69.0, 734.9, 68.4, 733.7, 68.5, 733.6, +75.3, 725.8, 76.1, 726.5, 83.8, 719.4, 89.1, 714.5, 89.1, 714.5, +94.4, 709.6, 99.2, 705.1, 104.9, 702.6, 104.1, 700.7, 108.9, 726.8, +108.9, 726.8, 113.7, 752.9, 95.6, 739.1, 71.5, 747.0, 69.8, 735.3, +19.0, 613.9, 22.4, 604.2, 32.4, 607.6, 45.7, 601.3, 56.0, 596.4, +56.0, 596.4, 66.3, 591.6, 66.9, 591.3, 66.9, 591.3, 67.4, 591.0, +75.2, 587.9, 75.0, 587.4, 82.6, 583.9, 85.5, 604.5, 86.3, 604.3, +90.1, 624.8, 90.1, 624.5, 88.9, 624.6, 87.8, 624.5, 64.0, 620.8, +64.0, 620.8, 40.2, 617.2, 29.6, 615.5, 19.7, 612.1, 19.0, 613.9, +121.0, 799.9, 121.4, 800.4, 121.4, 800.4, 121.8, 800.9, 120.3, 805.6, +118.6, 806.2, 119.5, 810.6, 108.1, 806.7, 98.9, 800.6, 99.9, 793.4, +99.6, 795.2, 110.5, 796.3, 121.0, 799.9, 191.6, 801.6, 213.6, 817.8, +197.0, 840.4, 202.3, 879.2, 202.4, 880.2, 203.0, 880.7, 202.6, 881.2, +202.1, 881.7, 201.1, 881.7, 200.4, 881.1, 187.5, 870.7, 176.8, 871.5, +175.5, 859.3, 172.4, 831.7, 200.2, 807.9, 191.6, 801.6, 32.3, 520.4, +30.9, 519.3, 30.9, 519.3, 29.4, 518.2, 27.6, 505.3, 28.9, 505.1, +28.3, 492.1, 26.0, 440.3, 25.5, 440.3, 23.7, 388.5, 24.2, 405.2, +24.7, 405.2, 25.8, 421.8, 27.0, 439.3, 27.0, 439.3, 28.1, 456.8, +29.1, 470.9, 29.1, 470.9, 30.0, 485.1, 31.1, 502.7, 32.6, 502.7, +32.3, 520.4, -3.7, 517.0, -7.1, 502.1, -3.6, 500.3, -10.5, 487.2, +-10.8, 490.3, -6.1, 490.7, -1.6, 494.1, -0.5, 495.0, -0.1, 494.8, +0.7, 495.9, 28.5, 538.7, 30.0, 537.7, 59.4, 579.4, 64.3, 555.8, +22.9, 552.0, -3.7, 517.0, 83.8, 719.4, 76.1, 726.5, 75.3, 725.8, +68.5, 733.6, 49.9, 724.3, 45.1, 717.9, 40.0, 697.6, 42.0, 705.5, +51.1, 703.2, 62.2, 708.7, 69.0, 712.1, 69.0, 712.1, 75.8, 715.5, +79.8, 717.4, 83.9, 719.1, 83.8, 719.4, 69.7, 767.2, 66.2, 756.5, +57.4, 760.4, 50.0, 750.0, 44.4, 742.1, 50.3, 736.4, 43.7, 730.7, +60.1, 745.0, 63.1, 746.8, 69.7, 767.2, 943.6, 608.8, 941.3, 609.3, +947.5, 623.9, 942.6, 627.8, 892.0, 668.3, 889.0, 665.2, 832.4, 697.7, +848.6, 688.4, 847.2, 685.9, 861.9, 674.1, 867.3, 669.8, 867.3, 669.8, +872.6, 665.6, 875.3, 663.4, 875.3, 663.4, 878.0, 661.2, 891.5, 650.5, +891.5, 650.5, 904.9, 639.8, 906.2, 638.7, 906.2, 638.7, 907.5, 637.7, +909.8, 635.8, 909.8, 635.8, 912.2, 633.9, 927.9, 621.4, 926.1, 612.3, +943.6, 608.8, 743.8, 661.6, 749.6, 670.9, 741.5, 681.2, 747.9, 684.8, +733.2, 676.6, 737.6, 668.6, 727.2, 652.4, 722.1, 644.3, 722.1, 644.3, +716.9, 636.3, 711.2, 627.4, 711.2, 627.4, 705.5, 618.5, 701.1, 611.6, +695.6, 610.5, 696.7, 604.7, 695.8, 609.3, 701.3, 610.3, 706.0, 615.9, +724.9, 638.7, 728.6, 636.5, 743.8, 661.6, 947.6, 328.1, 940.6, 361.9, +953.7, 364.0, 954.4, 400.0, 955.1, 438.8, 952.6, 438.9, 950.4, 477.7, +950.5, 475.0, 950.3, 475.0, 950.3, 472.2, 949.8, 448.4, 949.8, 448.4, +949.4, 424.6, 948.5, 376.3, 938.1, 374.2, 947.6, 328.1, 846.3, 117.0, +890.0, 147.0, 890.5, 146.4, 933.3, 177.7, 934.1, 178.3, 932.8, 180.3, +933.6, 180.8, 919.3, 171.9, 920.0, 170.9, 906.3, 160.9, 890.8, 149.6, +890.8, 149.6, 875.3, 138.2, 872.0, 135.8, 872.0, 135.8, 868.7, 133.4, +857.5, 125.2, 857.7, 124.9, 846.3, 117.0, 408.1, 154.0, 408.9, 154.9, +409.6, 155.6, 409.4, 156.0, 393.6, 178.5, 392.8, 177.9, 376.1, 199.9, +371.9, 205.6, 372.2, 205.9, 367.6, 211.2, 370.8, 207.5, 370.5, 207.2, +373.3, 203.2, 390.6, 178.7, 390.6, 178.7, 407.9, 154.3, 408.0, 154.2, +408.2, 154.1, 408.1, 154.0, 142.2, 652.8, 141.2, 609.9, 142.1, 609.9, +142.0, 567.0, 142.0, 543.5, 142.0, 543.5, 141.9, 520.0, 141.9, 517.7, +141.9, 517.7, 141.9, 515.4, 141.9, 494.5, 141.9, 494.5, 141.9, 473.6, +141.9, 472.3, 141.9, 472.3, 141.9, 471.0, 141.8, 468.7, 141.8, 468.7, +141.8, 466.3, 141.8, 452.9, 141.5, 452.9, 141.8, 439.5, 141.8, 441.3, +142.0, 441.3, 142.3, 443.2, 144.2, 457.2, 144.2, 457.2, 146.2, 471.3, +146.6, 474.8, 146.6, 474.8, 147.1, 478.3, 147.4, 480.0, 147.4, 480.0, +147.6, 481.7, 148.8, 490.4, 148.8, 490.4, 150.0, 499.1, 150.2, 500.3, +150.2, 500.3, 150.3, 501.5, 153.2, 522.1, 153.2, 522.1, 156.0, 542.8, +156.8, 548.2, 156.8, 548.2, 157.5, 553.7, 157.8, 556.1, 158.5, 556.2, +158.2, 558.4, 155.4, 578.7, 154.7, 578.6, 151.3, 598.8, 147.6, 620.7, +147.6, 620.7, 143.9, 642.6, 143.9, 642.7, 143.9, 642.7, 143.9, 642.7, +143.1, 647.7, 142.1, 647.8, 142.2, 652.8, -1.6, 494.1, -6.1, 490.7, +-10.8, 490.3, -10.5, 487.2, -14.7, 479.5, -22.7, 473.6, -25.8, 475.4, +-37.3, 443.0, -39.2, 441.2, -38.9, 407.2, -39.0, 422.7, -32.2, 422.8, +-25.5, 438.4, -13.6, 466.3, -10.5, 465.3, -1.6, 494.1, 15.1, 196.4, +24.9, 282.2, 18.9, 282.9, 22.8, 369.5, 22.8, 369.5, 22.8, 369.6, +22.8, 369.6, 19.8, 367.5, 17.9, 368.2, 16.8, 365.3, 14.8, 360.0, +16.8, 359.2, 16.7, 353.2, 16.6, 347.1, 16.6, 347.1, 16.6, 341.0, +16.4, 326.7, 16.4, 326.7, 16.3, 312.3, 15.7, 254.3, 21.6, 253.7, +15.1, 196.4, -1.4, 527.1, -2.5, 522.1, -2.5, 522.1, -3.7, 517.0, +22.9, 552.0, 64.3, 555.8, 59.4, 579.4, 63.1, 584.8, 63.6, 584.5, +66.9, 590.2, 67.2, 590.6, 67.4, 591.1, 67.4, 591.0, 66.9, 591.3, +66.9, 591.3, 66.3, 591.6, 44.0, 571.1, 44.3, 570.7, 22.4, 549.7, +10.5, 538.4, 8.8, 539.8, -1.4, 527.1, 87.8, 624.5, 88.9, 624.6, +90.1, 624.5, 90.1, 624.8, 97.1, 662.7, 97.1, 662.7, 104.1, 700.7, +104.9, 702.6, 99.2, 705.1, 94.4, 709.6, 91.2, 708.1, 93.8, 702.6, +93.3, 695.5, 92.9, 690.2, 92.9, 690.2, 92.5, 684.9, 91.2, 668.6, +91.2, 668.6, 89.9, 652.3, 88.9, 638.4, 87.7, 638.4, 87.8, 624.5, +120.3, 798.9, 120.6, 799.4, 120.6, 799.4, 121.0, 799.9, 110.5, 796.3, +99.6, 795.2, 99.9, 793.4, 83.2, 782.8, 82.9, 782.0, 69.7, 767.2, +63.1, 746.8, 60.1, 745.0, 43.7, 730.7, 42.4, 728.8, 43.7, 727.6, +42.2, 726.3, 82.0, 761.7, 81.3, 762.5, 120.3, 798.9, 42.2, 726.3, +28.8, 709.3, 29.6, 704.7, 27.9, 682.3, 28.5, 690.4, 33.9, 690.0, +40.0, 697.6, 45.1, 717.9, 49.9, 724.3, 68.5, 733.6, 68.4, 733.7, +69.0, 734.9, 69.8, 735.3, 74.8, 770.0, 95.0, 767.1, 120.3, 798.9, +81.3, 762.5, 82.0, 761.7, 42.2, 726.3, 703.4, 562.7, 701.7, 552.1, +711.8, 549.5, 722.0, 537.9, 721.3, 538.6, 722.2, 539.4, 722.5, 540.9, +723.8, 548.1, 723.8, 548.1, 725.0, 555.3, 730.5, 586.1, 730.5, 586.1, +735.9, 616.8, 737.4, 625.4, 738.6, 625.3, 739.0, 634.0, 738.8, 631.5, +737.7, 631.5, 736.5, 629.0, 719.9, 595.9, 708.9, 597.6, 703.4, 562.7, +539.8, 359.6, 539.7, 358.7, 539.2, 358.7, 538.6, 357.9, 519.1, 327.4, +519.1, 327.4, 499.6, 296.9, 492.6, 286.0, 492.4, 286.2, 485.7, 275.1, +486.0, 275.6, 486.2, 275.5, 486.8, 275.9, 488.5, 277.1, 488.5, 277.1, +490.3, 278.3, 512.4, 293.3, 515.9, 289.9, 534.6, 308.4, 538.8, 312.6, +535.4, 316.0, 536.1, 323.7, 536.4, 326.7, 536.4, 326.7, 536.7, 329.8, +538.3, 344.7, 538.8, 344.7, 539.8, 359.6, 672.2, 402.1, 674.0, 400.5, +680.5, 407.7, 688.8, 413.4, 692.6, 416.0, 692.6, 416.0, 696.4, 418.5, +698.9, 420.3, 700.7, 419.7, 701.5, 422.0, 705.6, 434.7, 703.8, 435.3, +706.2, 448.6, 706.9, 452.6, 706.9, 452.6, 707.6, 456.6, 710.3, 471.8, +713.6, 472.0, 713.0, 487.0, 713.1, 483.1, 709.8, 483.0, 706.7, 478.9, +704.9, 476.6, 704.9, 476.6, 703.1, 474.3, 701.9, 472.8, 701.9, 472.8, +700.8, 471.3, 696.3, 465.5, 696.3, 465.5, 691.8, 459.8, 689.2, 456.4, +689.2, 456.4, 686.6, 453.1, 678.3, 442.4, 678.3, 442.4, 669.9, 431.6, +669.6, 431.2, 669.3, 431.2, 669.3, 430.8, 670.4, 416.4, 664.2, 409.2, +672.2, 402.1, 669.3, 430.8, 662.6, 432.2, 659.8, 418.7, 650.4, 406.5, +639.5, 392.5, 639.5, 392.5, 628.6, 378.5, 623.6, 372.1, 625.2, 368.3, +618.6, 365.6, 636.3, 372.9, 634.8, 376.6, 650.9, 387.6, 657.0, 391.8, +657.0, 391.8, 663.1, 395.9, 666.5, 398.2, 666.5, 398.2, 669.9, 400.6, +670.3, 400.8, 670.3, 400.8, 670.6, 401.0, 671.4, 401.6, 672.2, 401.6, +672.2, 402.1, 664.2, 409.2, 670.4, 416.4, 669.3, 430.8, 150.3, 501.5, +150.2, 500.3, 150.2, 500.3, 150.0, 499.1, 164.5, 478.5, 165.2, 479.0, +180.4, 458.9, 203.0, 428.9, 200.5, 426.6, 225.7, 398.9, 203.9, 422.9, +206.4, 425.2, 187.1, 451.5, 168.7, 476.5, 169.4, 477.1, 150.3, 501.5, +198.1, 70.3, 213.7, 72.4, 227.1, 73.6, 228.3, 81.5, 229.1, 86.3, +215.3, 88.6, 202.2, 95.7, 194.5, 100.0, 194.5, 100.0, 186.7, 104.2, +177.5, 109.3, 170.2, 107.4, 168.4, 114.3, 173.7, 93.6, 181.1, 95.5, +193.8, 76.7, 195.9, 73.5, 196.4, 70.1, 198.1, 70.3, 140.7, 133.4, +137.8, 135.0, 133.7, 132.2, 133.2, 133.5, 134.7, 129.7, 137.9, 130.9, +142.6, 128.4, 147.4, 125.8, 147.4, 125.8, 152.1, 123.1, 160.3, 118.7, +160.3, 118.7, 168.4, 114.3, 170.2, 107.4, 177.5, 109.3, 186.7, 104.2, +164.3, 119.7, 164.5, 120.3, 140.7, 133.4, 134.9, 228.4, 136.6, 240.3, +129.2, 247.8, 116.4, 255.3, 118.9, 253.8, 111.2, 244.9, 114.4, 240.4, +120.5, 231.5, 135.5, 232.9, 134.9, 228.4, 151.3, 598.8, 154.7, 578.6, +155.4, 578.7, 158.2, 558.4, 157.7, 560.5, 158.5, 560.6, 158.8, 562.8, +161.6, 583.3, 161.6, 583.3, 164.4, 603.8, 165.1, 609.2, 165.1, 609.2, +165.9, 614.5, 169.9, 643.5, 169.9, 643.5, 173.9, 672.6, 174.5, 677.0, +173.8, 677.2, 175.1, 681.5, 162.5, 640.3, 157.1, 641.0, 151.3, 598.8, +141.4, 568.5, 141.4, 567.7, 142.1, 567.7, 142.0, 567.0, 142.1, 609.9, +141.2, 609.9, 142.2, 652.8, 142.4, 726.7, 142.4, 726.7, 142.5, 800.7, +142.5, 811.8, 142.5, 811.8, 142.6, 822.9, 142.6, 826.8, 142.7, 830.7, +142.6, 830.7, 138.4, 830.8, 134.1, 827.1, 133.9, 823.2, 131.5, 765.1, +135.6, 765.0, 137.3, 706.8, 137.6, 699.6, 137.6, 699.6, 137.8, 692.5, +139.6, 630.5, 139.3, 630.5, 141.4, 568.5, 94.7, 642.9, 92.4, 630.1, +92.4, 630.1, 90.2, 617.3, 90.6, 608.0, 93.4, 608.1, 96.7, 598.9, +98.3, 594.2, 99.8, 594.3, 100.0, 589.5, 98.9, 614.8, 97.5, 614.8, +95.0, 640.0, 94.8, 641.5, 94.4, 641.6, 94.7, 642.9, 118.9, 272.9, +120.5, 292.1, 121.5, 292.0, 124.1, 311.0, 126.7, 329.9, 126.7, 329.9, +129.3, 348.8, 135.5, 394.1, 136.9, 394.0, 141.8, 439.5, 141.5, 452.9, +141.8, 452.9, 141.8, 466.3, 142.0, 464.7, 139.8, 464.7, 139.2, 462.7, +138.1, 459.0, 138.8, 458.8, 138.4, 454.9, 135.2, 425.6, 135.2, 425.6, +132.1, 396.2, 130.6, 382.7, 130.6, 382.7, 129.2, 369.3, 124.0, 321.1, +123.1, 321.2, 118.9, 272.9, 44.2, 353.6, 40.0, 349.1, 42.9, 346.4, +41.7, 339.3, 40.6, 332.9, 43.2, 329.6, 39.5, 326.5, 51.9, 336.6, +49.3, 339.9, 59.1, 353.3, 60.0, 354.6, 60.0, 354.6, 60.9, 355.8, +66.5, 363.4, 66.5, 363.4, 72.1, 371.0, 73.1, 372.4, 73.1, 372.4, +74.1, 373.8, 74.2, 373.9, 74.1, 374.0, 74.3, 374.1, 59.2, 363.9, +56.3, 366.5, 44.2, 353.6, -15.4, 295.8, -10.3, 274.5, -10.2, 274.5, +-5.1, 253.1, 2.9, 234.7, -0.0, 233.4, 5.0, 213.7, 2.7, 222.5, +2.8, 222.5, 0.6, 231.3, -3.2, 247.1, -3.2, 247.2, -7.1, 263.0, +-11.2, 279.4, -12.0, 279.2, -15.4, 295.8, 22.8, 369.5, 18.9, 282.9, +24.9, 282.2, 15.1, 196.4, 14.8, 189.9, 16.1, 189.6, 14.5, 183.5, +17.4, 200.0, 27.0, 209.8, 20.3, 216.5, 21.6, 251.7, 26.4, 251.5, +32.5, 286.5, 33.4, 293.8, 31.6, 294.0, 30.7, 301.5, 30.7, 301.8, +30.7, 301.8, 30.7, 302.0, 29.9, 308.7, 29.9, 308.7, 29.1, 315.3, +26.0, 342.4, 19.7, 343.1, 22.8, 369.5, 78.4, 549.9, 78.8, 550.4, +78.6, 550.6, 78.7, 551.4, 79.2, 554.2, 78.0, 556.0, 79.7, 557.1, +58.2, 536.4, 56.0, 538.7, 32.3, 520.4, 32.6, 502.7, 31.1, 502.7, +30.0, 485.1, 30.0, 486.7, 31.2, 486.7, 32.4, 488.3, 55.4, 519.1, +55.7, 518.9, 78.4, 549.9, 45.7, 601.3, 32.4, 607.6, 22.4, 604.2, +19.0, 613.9, 18.8, 614.0, 18.6, 614.0, 18.7, 614.1, 15.5, 574.7, +13.6, 573.8, 0.7, 536.2, -1.6, 532.5, -0.3, 531.7, -1.4, 527.1, +8.8, 539.8, 10.5, 538.4, 22.4, 549.7, 37.4, 573.4, 47.0, 576.2, +45.7, 601.3, 22.4, 549.7, 44.3, 570.7, 44.0, 571.1, 66.3, 591.6, +56.0, 596.4, 56.0, 596.4, 45.7, 601.3, 47.0, 576.2, 37.4, 573.4, +22.4, 549.7, 62.2, 708.7, 51.1, 703.2, 42.0, 705.5, 40.0, 697.6, +33.9, 690.0, 28.5, 690.4, 27.9, 682.3, 21.2, 668.6, 25.2, 654.1, +18.3, 653.0, 32.9, 655.3, 30.8, 668.9, 43.3, 684.7, 49.6, 692.7, +49.6, 692.7, 55.9, 700.7, 56.1, 701.0, 56.1, 701.0, 56.3, 701.2, +59.3, 705.0, 58.6, 707.9, 62.2, 708.7, 773.1, 619.7, 757.0, 625.1, +754.8, 618.3, 736.4, 616.8, 736.2, 616.8, 735.9, 616.9, 735.9, 616.8, +730.5, 586.1, 730.5, 586.1, 725.0, 555.3, 725.3, 557.0, 726.8, 556.9, +728.5, 558.4, 734.7, 564.0, 734.7, 564.0, 741.0, 569.6, 750.7, 578.2, +750.7, 578.2, 760.4, 586.8, 768.9, 594.4, 768.9, 594.4, 777.5, 602.0, +778.0, 602.4, 778.5, 602.6, 778.4, 602.8, 776.3, 611.4, 778.0, 618.1, +773.1, 619.7, 778.4, 602.8, 780.2, 601.8, 783.2, 607.1, 787.9, 611.3, +791.7, 614.6, 792.8, 613.9, 795.5, 618.0, 796.2, 619.0, 795.2, 621.3, +794.7, 621.4, 784.0, 622.2, 778.2, 625.5, 773.1, 619.7, 778.0, 618.1, +776.3, 611.4, 778.4, 602.8, 767.2, 714.9, 766.5, 712.4, 765.7, 712.6, +764.3, 710.3, 759.7, 703.1, 759.7, 703.1, 755.2, 696.0, 751.5, 690.4, +750.0, 690.9, 747.9, 684.8, 741.5, 681.2, 749.6, 670.9, 743.8, 661.6, +741.7, 649.6, 741.7, 649.6, 739.6, 637.7, 739.3, 635.8, 739.3, 635.8, +739.0, 634.0, 738.6, 625.3, 737.4, 625.4, 735.9, 616.8, 735.9, 616.9, +736.2, 616.8, 736.4, 616.8, 741.7, 632.9, 741.5, 633.0, 746.6, 649.2, +756.9, 682.0, 757.7, 681.8, 767.2, 714.9, 787.2, 480.4, 785.4, 487.8, +809.3, 488.9, 823.0, 504.7, 825.6, 507.8, 817.7, 516.8, 819.7, 518.2, +799.8, 504.6, 783.7, 494.5, 787.2, 480.4, 760.1, 584.4, 760.7, 585.0, +759.7, 586.2, 760.4, 586.8, 750.7, 578.2, 750.7, 578.2, 741.0, 569.6, +744.4, 572.8, 744.8, 572.5, 748.5, 575.4, 754.3, 579.9, 754.8, 579.3, +760.1, 584.4, 781.1, 677.4, 781.0, 677.3, 781.2, 676.2, 781.4, 676.2, +796.6, 675.2, 796.6, 675.8, 811.9, 675.4, 814.5, 675.3, 814.5, 675.3, +817.1, 675.3, 839.5, 674.7, 855.1, 664.1, 861.9, 674.1, 847.2, 685.9, +848.6, 688.4, 832.4, 697.7, 829.2, 700.2, 827.7, 703.0, 825.4, 702.1, +802.0, 692.9, 803.0, 690.2, 781.1, 677.4, 825.4, 702.1, 824.6, 718.3, +804.0, 723.6, 778.2, 732.1, 776.6, 732.6, 771.7, 726.6, 770.7, 720.3, +769.6, 713.9, 772.4, 713.4, 774.0, 706.6, 777.6, 692.0, 776.3, 677.8, +781.1, 677.4, 803.0, 690.2, 802.0, 692.9, 825.4, 702.1, 736.5, 629.0, +737.7, 631.5, 738.8, 631.5, 739.0, 634.0, 739.3, 635.8, 739.3, 635.8, +739.6, 637.7, 737.6, 633.7, 738.1, 633.5, 736.6, 629.3, 736.5, 629.2, +736.6, 629.2, 736.5, 629.0, 939.3, 263.2, 939.2, 262.7, 941.3, 262.5, +941.3, 262.2, 945.5, 295.0, 945.9, 295.1, 947.6, 328.1, 938.1, 374.2, +948.5, 376.3, 949.4, 424.6, 949.3, 413.7, 948.7, 413.7, 948.0, 402.8, +943.6, 333.0, 942.6, 333.0, 939.3, 263.2, 933.8, 398.2, 945.1, 423.2, +939.9, 425.5, 945.9, 452.8, 948.1, 462.5, 948.5, 462.5, 950.3, 472.2, +950.3, 475.0, 950.5, 475.0, 950.4, 477.7, 949.9, 489.9, 944.7, 492.2, +949.1, 502.2, 932.5, 464.7, 937.5, 462.4, 926.0, 422.7, 923.8, 415.2, +923.8, 415.2, 921.6, 407.7, 920.4, 403.4, 920.4, 403.4, 919.1, 399.2, +916.7, 390.9, 916.1, 382.5, 914.3, 382.6, 923.5, 382.0, 929.2, 388.1, +933.8, 398.2, 924.1, 500.9, 935.4, 520.1, 931.7, 522.3, 939.4, 543.8, +942.7, 553.0, 944.8, 552.8, 946.0, 562.3, 947.5, 574.7, 945.5, 574.9, +944.7, 587.6, 944.7, 587.5, 944.5, 587.5, 944.3, 587.3, 934.6, 580.7, +934.6, 580.7, 924.9, 574.1, 919.9, 570.7, 915.1, 570.9, 915.0, 567.3, +913.8, 541.2, 918.6, 541.0, 922.2, 514.6, 923.1, 507.7, 926.8, 505.5, +924.1, 500.9, 926.0, 422.7, 937.5, 462.4, 932.5, 464.7, 949.1, 502.2, +953.3, 531.4, 952.7, 533.4, 946.0, 562.3, 944.8, 552.8, 942.7, 553.0, +939.4, 543.8, 934.7, 516.5, 936.3, 516.2, 933.3, 488.7, 932.5, 482.0, +932.5, 482.0, 931.8, 475.4, 928.9, 449.0, 938.8, 442.6, 926.0, 422.7, +669.9, 400.6, 666.5, 398.2, 666.5, 398.2, 663.1, 395.9, 663.0, 395.4, +665.6, 394.7, 668.1, 393.5, 684.8, 385.5, 684.8, 385.5, 701.4, 377.5, +711.7, 372.6, 711.7, 372.6, 722.0, 367.6, 725.4, 366.0, 725.4, 366.0, +728.7, 364.4, 730.3, 363.7, 730.3, 363.7, 731.8, 362.9, 732.7, 362.5, +732.7, 362.5, 733.6, 362.1, 740.2, 358.9, 740.2, 358.9, 746.8, 355.7, +750.9, 353.7, 750.9, 353.7, 755.0, 351.7, 767.9, 345.5, 767.9, 345.5, +780.8, 339.3, 815.8, 322.6, 815.8, 322.7, 850.7, 305.9, 851.2, 305.7, +851.6, 305.3, 851.6, 305.3, 851.6, 305.3, 851.2, 305.7, 850.7, 305.9, +805.7, 329.5, 805.7, 329.5, 760.6, 353.1, 715.3, 376.8, 716.7, 380.0, +669.9, 400.6, 676.7, 19.0, 678.1, 20.5, 689.6, 2.0, 699.1, 3.6, +713.8, 6.3, 713.2, 14.6, 725.3, 27.5, 724.0, 26.2, 723.0, 27.1, +720.8, 26.7, 698.7, 22.8, 689.0, 32.0, 676.7, 19.0, 446.7, 132.3, +433.1, 136.8, 432.6, 135.3, 418.6, 138.4, 413.9, 139.4, 413.9, 139.4, +409.3, 140.3, 408.6, 140.5, 408.6, 140.5, 408.0, 140.6, 404.3, 141.4, +404.3, 142.2, 400.6, 142.2, 400.0, 142.2, 399.3, 141.0, 399.5, 140.5, +401.5, 136.3, 401.3, 134.8, 405.1, 132.7, 408.4, 130.9, 409.4, 132.7, +413.7, 132.6, 414.0, 132.6, 414.0, 132.6, 414.2, 132.6, 424.1, 132.5, +424.1, 132.5, 434.0, 132.5, 435.4, 132.4, 435.4, 132.4, 436.8, 132.4, +441.7, 132.4, 442.2, 133.8, 446.7, 132.3, 359.9, 57.9, 372.4, 77.4, +383.0, 94.8, 375.4, 102.9, 379.1, 99.0, 363.7, 84.6, 352.0, 66.3, +345.7, 56.6, 345.7, 56.6, 339.5, 46.8, 338.4, 45.2, 338.4, 45.2, +337.4, 43.5, 327.7, 28.4, 331.8, 22.0, 318.0, 13.2, 343.0, 29.2, +343.7, 32.5, 359.9, 57.9, 318.0, 13.2, 309.1, 2.6, 299.8, -3.8, +303.0, -10.2, 318.3, -14.2, 318.3, -14.2, 333.7, -18.1, 336.3, -17.9, +335.7, -12.3, 337.7, -6.6, 348.8, 25.7, 370.5, 47.3, 359.9, 57.9, +343.7, 32.5, 343.0, 29.2, 318.0, 13.2, 393.4, 131.0, 382.3, 118.8, +382.3, 117.9, 375.4, 102.9, 383.0, 94.8, 372.4, 77.4, 359.9, 57.9, +370.5, 47.3, 348.8, 25.7, 337.7, -6.6, 365.8, 53.1, 362.5, 54.7, +387.3, 116.0, 390.3, 123.5, 388.3, 125.4, 393.4, 131.0, 290.4, 2.4, +289.0, 0.5, 293.4, -4.2, 298.2, -9.0, 300.6, -9.6, 300.6, -9.6, +303.0, -10.2, 299.8, -3.8, 309.1, 2.6, 318.0, 13.2, 331.8, 22.0, +327.7, 28.4, 337.4, 43.5, 336.2, 41.4, 335.5, 41.8, 333.5, 40.1, +311.9, 21.3, 306.7, 25.1, 290.4, 2.4, 432.1, 236.3, 431.1, 225.7, +431.2, 225.7, 430.8, 215.1, 431.0, 219.5, 431.2, 219.5, 431.6, 223.8, +431.8, 226.0, 431.8, 226.0, 432.0, 228.2, 435.6, 267.5, 435.6, 267.5, +439.3, 306.7, 441.3, 329.1, 441.3, 329.1, 443.4, 351.4, 443.9, 357.8, +443.9, 357.8, 444.5, 364.1, 444.8, 366.7, 444.8, 366.7, 445.0, 369.4, +446.9, 389.4, 446.9, 389.4, 448.7, 409.5, 452.1, 447.0, 452.1, 447.0, +455.6, 484.5, 456.5, 494.1, 456.5, 494.1, 457.3, 503.6, 461.1, 544.5, +461.1, 544.5, 464.8, 585.3, 466.5, 603.5, 466.6, 603.5, 468.2, 621.6, +469.3, 634.5, 469.2, 634.5, 470.3, 647.3, 471.5, 660.3, 471.7, 660.3, +472.9, 673.2, 473.3, 677.4, 473.3, 677.4, 473.7, 681.5, 473.9, 684.3, +474.0, 684.3, 474.2, 687.1, 474.9, 695.0, 474.8, 695.0, 475.5, 702.9, +476.7, 715.9, 476.8, 715.9, 478.0, 728.9, 480.1, 750.5, 480.0, 750.5, +482.0, 772.1, 482.3, 775.1, 482.3, 775.1, 482.5, 778.1, 483.9, 793.3, +485.3, 808.6, 485.3, 808.6, 485.3, 808.6, 483.9, 793.3, 482.5, 778.1, +482.3, 775.1, 482.3, 775.1, 482.0, 772.1, 480.0, 750.5, 480.1, 750.5, +478.0, 728.9, 476.8, 715.9, 476.7, 715.9, 475.5, 702.9, 472.9, 675.1, +472.9, 675.1, 470.3, 647.3, 469.3, 635.9, 469.4, 635.9, 468.4, 624.5, +468.3, 623.1, 468.3, 623.1, 468.2, 621.6, 466.6, 603.5, 466.5, 603.5, +464.8, 585.3, 461.1, 544.5, 461.1, 544.5, 457.3, 503.6, 456.5, 494.1, +456.5, 494.1, 455.6, 484.5, 452.1, 447.0, 452.1, 447.0, 448.7, 409.5, +446.9, 389.4, 446.9, 389.4, 445.0, 369.4, 438.6, 302.8, 438.2, 302.9, +432.1, 236.3, 431.6, 223.8, 431.2, 219.5, 431.0, 219.5, 430.8, 215.1, +429.9, 201.0, 423.5, 197.5, 429.1, 186.9, 427.2, 190.5, 437.8, 193.7, +438.3, 201.1, 439.0, 212.2, 437.1, 213.6, 431.6, 223.8, 94.7, 97.2, +96.3, 96.3, 94.0, 92.2, 93.3, 87.3, 91.4, 73.5, 91.4, 73.5, +89.5, 59.8, 88.5, 52.6, 84.6, 48.1, 87.6, 45.5, 100.2, 42.2, +100.2, 42.2, 112.9, 38.9, 122.8, 39.1, 132.9, 43.7, 132.6, 46.2, +130.6, 63.5, 120.5, 62.4, 108.5, 78.6, 101.6, 87.9, 103.9, 91.9, +94.7, 97.2, 236.1, 70.1, 237.2, 70.5, 237.2, 74.9, 235.3, 77.7, +233.3, 80.6, 231.3, 82.1, 228.3, 81.5, 227.1, 73.6, 213.7, 72.4, +198.1, 70.3, 187.3, 66.3, 178.2, 59.9, 176.5, 62.4, 179.9, 57.6, +189.0, 64.0, 201.4, 65.6, 203.1, 65.8, 203.1, 65.8, 204.7, 66.0, +207.8, 66.4, 207.8, 66.4, 210.8, 66.8, 223.5, 68.4, 225.0, 65.1, +236.1, 70.1, 239.1, 42.7, 241.4, 39.6, 239.6, 38.3, 240.1, 33.8, +241.7, 19.5, 235.9, 15.3, 243.2, 5.2, 254.1, 2.4, 254.1, 2.4, +264.9, -0.3, 262.4, 22.3, 253.8, 22.5, 239.1, 42.7, 264.9, -0.3, +281.5, -4.7, 281.5, -4.7, 298.2, -9.0, 293.4, -4.2, 289.0, 0.5, +290.4, 2.4, 281.5, 15.3, 281.5, 15.3, 272.6, 28.3, 271.6, 29.7, +271.6, 29.7, 270.6, 31.1, 270.6, 31.2, 270.6, 31.2, 270.6, 31.2, +267.6, 35.6, 267.6, 35.6, 264.6, 39.9, 257.8, 49.7, 257.8, 49.7, +251.1, 59.5, 245.9, 67.1, 246.6, 67.8, 240.6, 74.8, 238.8, 76.9, +235.8, 78.2, 235.3, 77.7, 237.2, 74.9, 237.2, 70.5, 236.1, 70.1, +237.6, 56.4, 234.1, 55.0, 239.1, 42.7, 253.8, 22.5, 262.4, 22.3, +264.9, -0.3, 202.2, 95.7, 215.3, 88.6, 229.1, 86.3, 228.3, 81.5, +231.3, 82.1, 233.3, 80.6, 235.3, 77.7, 235.8, 78.2, 238.8, 76.9, +240.6, 74.8, 223.0, 102.9, 229.0, 115.3, 202.9, 129.5, 209.8, 125.8, +195.3, 108.8, 202.2, 95.7, 202.9, 129.5, 202.9, 131.1, 202.0, 132.5, +200.8, 132.6, 185.0, 134.2, 184.8, 132.8, 168.8, 133.0, 156.7, 133.2, +156.7, 133.2, 144.7, 133.3, 142.7, 133.4, 142.0, 132.4, 140.7, 133.4, +164.5, 120.3, 164.3, 119.7, 186.7, 104.2, 194.5, 100.0, 194.5, 100.0, +202.2, 95.7, 195.3, 108.8, 209.8, 125.8, 202.9, 129.5, 167.7, 180.7, +147.7, 192.0, 153.2, 201.8, 138.8, 222.8, 136.8, 225.6, 137.5, 226.5, +134.9, 228.4, 135.5, 232.9, 120.5, 231.5, 114.4, 240.4, 114.8, 240.2, +113.1, 237.7, 113.9, 236.9, 139.8, 207.9, 135.3, 199.1, 167.7, 180.7, +143.9, 642.6, 147.6, 620.7, 147.6, 620.7, 151.3, 598.8, 157.1, 641.0, +162.5, 640.3, 175.1, 681.5, 177.5, 690.6, 176.4, 690.9, 177.7, 700.4, +179.3, 711.9, 179.3, 711.9, 180.9, 723.4, 182.7, 737.0, 182.7, 737.0, +184.6, 750.6, 184.7, 751.0, 184.6, 751.1, 184.7, 751.5, 171.2, 715.6, +171.3, 715.6, 157.8, 679.7, 156.0, 674.9, 156.0, 674.9, 154.3, 670.2, +149.1, 656.4, 144.5, 656.6, 143.9, 642.6, 125.1, 606.5, 125.7, 587.3, +144.0, 585.9, 141.4, 568.5, 139.3, 630.5, 139.6, 630.5, 137.8, 692.5, +152.3, 658.4, 123.9, 649.3, 125.1, 606.5, 95.0, 640.0, 97.5, 614.8, +98.9, 614.8, 100.0, 589.5, 104.7, 567.6, 107.5, 568.2, 115.1, 546.9, +120.5, 531.4, 124.2, 531.8, 126.0, 515.9, 122.8, 543.6, 119.2, 543.2, +112.4, 570.4, 108.5, 585.7, 108.5, 585.7, 104.7, 601.1, 102.4, 610.2, +102.4, 610.2, 100.1, 619.4, 97.5, 629.7, 94.9, 629.7, 95.0, 640.0, +10.6, 447.0, 22.3, 456.0, 16.9, 463.2, 23.2, 479.3, 25.8, 485.7, +27.2, 485.5, 28.3, 492.1, 28.9, 505.1, 27.6, 505.3, 29.4, 518.2, +24.2, 514.1, 21.7, 515.4, 19.0, 510.1, 15.9, 505.5, 14.4, 506.5, +9.8, 503.0, 7.7, 499.0, 9.9, 497.9, 9.9, 492.8, 10.1, 481.1, +10.1, 481.1, 10.2, 469.4, 10.4, 458.2, 15.8, 451.1, 10.6, 447.0, +-22.1, 363.9, -22.7, 362.5, -22.7, 362.5, -23.3, 361.1, -25.7, 355.0, +-26.1, 355.1, -28.1, 348.9, -28.3, 348.1, -27.4, 347.8, -27.6, 347.1, +-24.5, 355.0, -25.0, 355.2, -22.3, 363.3, -22.2, 363.6, -22.2, 363.6, +-22.1, 363.9, -24.7, 334.6, -20.5, 316.8, -20.4, 316.8, -16.2, 299.0, +-16.2, 299.0, -15.8, 297.4, -15.4, 295.8, -12.0, 279.2, -11.2, 279.4, +-7.1, 263.0, -3.2, 247.2, -3.2, 247.1, 0.6, 231.3, -3.2, 247.1, +-3.2, 247.2, -7.1, 263.0, -11.2, 279.4, -12.0, 279.2, -15.4, 295.8, +-15.8, 297.4, -16.2, 299.0, -16.2, 299.0, -19.1, 311.6, -19.1, 311.6, +-22.1, 324.1, -23.3, 329.4, -23.4, 329.3, -24.7, 334.6, 30.7, 301.5, +31.6, 294.0, 33.4, 293.8, 32.5, 286.5, 34.3, 297.0, 38.5, 298.0, +36.1, 307.5, 37.1, 313.2, 37.1, 313.2, 38.1, 318.9, 38.5, 321.0, +38.5, 321.0, 38.9, 323.2, 39.0, 324.0, 38.9, 324.0, 39.1, 324.7, +34.8, 313.2, 32.8, 313.5, 30.7, 301.5, 77.0, 541.9, 79.2, 544.8, +76.2, 547.2, 78.4, 549.9, 55.7, 518.9, 55.4, 519.1, 32.4, 488.3, +38.9, 497.4, 39.6, 496.9, 46.7, 505.5, 61.9, 523.7, 63.3, 522.7, +77.0, 541.9, 774.0, 706.6, 772.4, 713.4, 769.6, 713.9, 770.7, 720.3, +770.8, 720.0, 770.4, 719.9, 770.2, 719.5, 768.7, 717.2, 768.1, 717.4, +767.2, 714.9, 757.7, 681.8, 756.9, 682.0, 746.6, 649.2, 747.7, 652.9, +748.3, 652.7, 750.0, 656.2, 762.0, 681.4, 765.5, 680.3, 774.0, 706.6, +745.8, 465.5, 745.6, 465.3, 745.7, 465.1, 745.7, 464.8, 744.9, 457.9, +747.0, 452.1, 744.0, 451.0, 767.8, 459.9, 767.8, 463.2, 787.2, 480.4, +783.7, 494.5, 799.8, 504.6, 819.7, 518.2, 820.2, 518.7, 819.5, 519.3, +819.2, 520.3, 818.8, 522.1, 819.5, 522.9, 818.4, 523.8, 818.2, 523.9, +817.5, 523.1, 816.7, 522.4, 781.2, 494.0, 781.1, 494.2, 745.8, 465.5, +728.5, 558.4, 726.8, 556.9, 725.3, 557.0, 725.0, 555.3, 723.8, 548.1, +723.8, 548.1, 722.5, 540.9, 722.7, 542.5, 723.0, 542.4, 723.5, 543.9, +726.0, 551.2, 727.5, 551.0, 728.5, 558.4, 811.9, 675.4, 796.6, 675.8, +796.6, 675.2, 781.4, 676.2, 776.8, 671.7, 782.5, 663.2, 787.3, 651.6, +787.0, 652.4, 788.9, 653.1, 790.4, 654.6, 797.3, 661.3, 797.3, 661.3, +804.3, 668.0, 808.1, 671.7, 809.7, 676.2, 811.9, 675.4, 736.6, 629.3, +738.1, 633.5, 737.6, 633.7, 739.6, 637.7, 741.7, 649.6, 741.7, 649.6, +743.8, 661.6, 728.6, 636.5, 724.9, 638.7, 706.0, 615.9, 708.2, 625.6, +722.7, 620.4, 736.6, 629.3, 706.0, 615.9, 701.3, 610.3, 695.8, 609.3, +696.7, 604.7, 696.3, 604.2, 696.3, 604.1, 696.0, 603.6, 690.6, 595.2, +687.4, 596.0, 685.3, 586.9, 684.6, 584.2, 687.8, 583.4, 690.4, 580.0, +694.8, 574.1, 694.8, 574.1, 699.3, 568.1, 701.3, 565.4, 704.0, 563.8, +703.4, 562.7, 708.9, 597.6, 719.9, 595.9, 736.5, 629.0, 736.6, 629.2, +736.5, 629.2, 736.6, 629.3, 722.7, 620.4, 708.2, 625.6, 706.0, 615.9, +628.6, 378.5, 639.5, 392.5, 639.5, 392.5, 650.4, 406.5, 654.9, 441.5, +646.0, 442.7, 641.6, 478.9, 641.5, 479.0, 641.5, 479.0, 641.5, 479.0, +641.1, 482.9, 641.1, 482.9, 640.6, 486.8, 639.5, 496.1, 635.1, 498.0, +638.3, 505.4, 632.9, 492.8, 637.2, 490.9, 636.1, 476.4, 634.1, 450.4, +634.1, 450.4, 632.1, 424.4, 630.4, 401.5, 618.0, 388.9, 628.6, 378.5, +641.6, 478.9, 646.0, 442.7, 654.9, 441.5, 650.4, 406.5, 659.8, 418.7, +662.6, 432.2, 669.3, 430.8, 669.3, 431.2, 669.6, 431.2, 669.9, 431.6, +665.0, 440.8, 664.6, 440.6, 659.2, 449.5, 650.4, 464.2, 639.0, 466.5, +641.6, 478.9, 914.0, 381.7, 920.2, 370.0, 908.9, 364.0, 903.7, 346.4, +903.5, 345.5, 903.5, 345.5, 903.2, 344.7, 896.6, 321.9, 896.6, 321.9, +890.0, 299.2, 888.4, 293.8, 888.2, 293.8, 886.8, 288.4, 886.8, 288.3, +887.1, 288.3, 887.3, 288.2, 895.2, 284.4, 895.2, 284.4, 903.1, 280.6, +905.1, 279.6, 907.3, 278.8, 907.2, 278.6, 914.2, 299.5, 915.4, 300.0, +916.8, 321.8, 918.8, 351.5, 926.7, 357.7, 914.0, 381.7, 916.8, 321.8, +940.6, 341.7, 935.4, 360.4, 933.8, 398.2, 929.2, 388.1, 923.5, 382.0, +914.3, 382.6, 914.0, 382.4, 914.0, 382.1, 914.0, 381.7, 926.7, 357.7, +918.8, 351.5, 916.8, 321.8, 869.9, 395.5, 869.6, 395.5, 869.6, 393.4, +869.3, 391.2, 866.2, 370.9, 866.2, 370.9, 863.2, 350.6, 862.8, 348.1, +862.8, 348.1, 862.4, 345.6, 861.4, 338.7, 861.4, 338.7, 860.4, 331.9, +859.2, 323.7, 857.8, 323.7, 858.0, 315.5, 857.9, 319.1, 859.2, 319.2, +860.5, 322.8, 865.3, 336.2, 868.2, 335.8, 870.1, 349.6, 872.9, 370.0, +870.0, 370.4, 869.9, 391.2, 869.9, 393.4, 869.9, 395.5, 869.9, 395.5, +860.5, 322.8, 859.2, 319.2, 857.9, 319.1, 858.0, 315.5, 856.6, 309.4, +853.5, 305.6, 856.1, 303.1, 867.9, 292.0, 870.8, 290.2, 886.8, 288.4, +888.2, 293.8, 888.4, 293.8, 890.0, 299.2, 887.6, 305.1, 884.3, 303.7, +878.7, 308.3, 869.6, 315.5, 870.9, 319.1, 860.5, 322.8, 694.7, 409.5, +693.6, 408.7, 690.9, 414.1, 688.8, 413.4, 680.5, 407.7, 674.0, 400.5, +672.2, 402.1, 672.2, 401.6, 671.4, 401.6, 670.6, 401.0, 682.8, 405.0, +684.5, 402.5, 694.7, 409.5, 860.4, 331.9, 861.4, 338.7, 861.4, 338.7, +862.4, 345.6, 858.9, 351.0, 855.0, 348.4, 847.6, 351.2, 844.2, 352.5, +844.2, 352.5, 840.8, 353.8, 820.4, 361.5, 820.4, 361.5, 799.9, 369.3, +792.1, 372.2, 792.1, 372.2, 784.2, 375.2, 782.6, 375.8, 782.5, 375.6, +781.0, 376.4, 805.0, 362.6, 805.1, 362.9, 829.3, 349.3, 835.8, 345.6, +835.8, 345.6, 842.4, 342.0, 851.4, 336.9, 852.6, 330.4, 860.4, 331.9, +625.4, 361.6, 634.8, 368.9, 633.8, 370.2, 642.2, 378.7, 646.5, 383.2, +645.7, 384.7, 650.9, 387.6, 634.8, 376.6, 636.3, 372.9, 618.6, 365.6, +607.2, 357.8, 607.2, 357.8, 595.7, 350.0, 591.1, 346.9, 591.1, 346.9, +586.5, 343.8, 560.5, 326.1, 560.5, 326.1, 534.6, 308.4, 515.9, 289.9, +512.4, 293.3, 490.3, 278.3, 494.6, 281.3, 494.8, 281.0, 499.3, 283.8, +500.2, 284.4, 500.2, 284.4, 501.2, 285.0, 543.6, 311.2, 543.6, 311.2, +586.0, 337.3, 592.2, 341.2, 592.2, 341.2, 598.4, 345.0, 611.9, 353.3, +612.9, 352.0, 625.4, 361.6, 251.1, 59.5, 257.8, 49.7, 257.8, 49.7, +264.6, 39.9, 245.2, 81.7, 243.4, 80.9, 222.1, 121.8, 201.5, 161.7, +201.5, 161.7, 180.9, 201.5, 171.0, 220.5, 170.9, 220.4, 161.1, 239.4, +158.7, 243.9, 156.5, 248.6, 156.5, 248.6, 156.5, 248.6, 158.7, 243.9, +161.1, 239.4, 180.0, 201.5, 180.0, 201.5, 199.0, 163.7, 219.1, 123.5, +219.1, 123.5, 239.2, 83.3, 245.2, 71.4, 244.4, 70.9, 251.1, 59.5, +474.9, 881.8, 473.8, 882.9, 470.8, 882.1, 470.7, 882.0, 466.7, 848.4, +468.7, 848.1, 466.7, 814.3, 465.8, 799.3, 465.8, 799.3, 464.9, 784.3, +463.3, 759.1, 463.2, 759.1, 461.7, 734.0, 460.1, 708.3, 460.2, 708.3, +458.7, 682.6, 457.9, 669.3, 457.9, 669.3, 457.1, 655.9, 455.3, 625.3, +455.3, 625.3, 453.5, 594.6, 453.1, 588.3, 453.1, 588.3, 452.8, 581.9, +452.6, 578.7, 452.6, 578.7, 452.4, 575.5, 451.9, 567.7, 451.9, 567.7, +451.5, 559.9, 449.9, 533.5, 450.3, 533.5, 448.3, 507.2, 454.4, 587.2, +454.0, 587.3, 459.7, 667.4, 462.4, 705.5, 462.4, 705.5, 465.1, 743.6, +468.5, 791.8, 468.5, 791.8, 471.9, 840.0, 473.3, 859.1, 473.3, 859.1, +474.7, 878.3, 474.8, 880.1, 475.7, 881.1, 474.9, 881.8, 140.0, 48.9, +137.3, 46.4, 136.3, 47.5, 132.6, 46.2, 132.9, 43.7, 122.8, 39.1, +112.9, 38.9, 117.5, 37.7, 117.5, 37.7, 122.0, 36.6, 132.0, 40.2, +132.1, 41.6, 140.0, 48.9, 168.8, 133.0, 184.8, 132.8, 185.0, 134.2, +200.8, 132.6, 200.1, 132.2, 196.4, 139.0, 192.0, 145.4, 182.2, 159.7, +183.0, 160.3, 172.4, 174.0, 173.0, 173.1, 172.2, 172.5, 172.1, 171.1, +171.0, 158.5, 171.0, 158.5, 169.9, 145.9, 169.7, 143.6, 169.7, 143.6, +169.5, 141.3, 169.2, 137.2, 168.1, 133.2, 168.8, 133.0, 142.5, 800.7, +142.4, 726.7, 142.4, 726.7, 142.2, 652.8, 142.1, 647.8, 143.1, 647.7, +143.9, 642.7, 144.9, 660.2, 143.8, 660.2, 143.6, 677.7, 143.1, 739.2, +139.1, 739.4, 142.5, 800.7, 112.4, 570.4, 119.2, 543.2, 122.8, 543.6, +126.0, 515.9, 127.1, 511.9, 127.4, 512.0, 128.8, 508.0, 135.1, 490.1, +135.1, 490.1, 141.5, 472.1, 141.7, 471.6, 142.0, 471.5, 141.9, 471.0, +141.9, 472.3, 141.9, 472.3, 141.9, 473.6, 127.5, 522.1, 130.1, 523.1, +112.4, 570.4, 132.1, 396.2, 135.2, 425.6, 135.2, 425.6, 138.4, 454.9, +109.9, 423.8, 122.8, 412.0, 107.3, 369.1, 106.3, 366.5, 106.3, 366.5, +105.4, 363.9, 98.1, 343.8, 98.1, 343.8, 90.8, 323.7, 84.3, 305.5, +84.3, 305.5, 77.7, 287.3, 72.4, 272.6, 72.4, 272.6, 67.0, 257.9, +64.0, 249.4, 64.0, 249.4, 60.9, 240.9, 58.1, 233.2, 58.4, 225.5, +55.3, 225.4, 59.1, 225.6, 58.8, 233.2, 62.3, 240.9, 63.3, 243.2, +63.3, 243.2, 64.3, 245.5, 70.8, 259.9, 70.8, 259.9, 77.2, 274.3, +90.8, 304.5, 90.8, 304.5, 104.4, 334.7, 106.6, 339.6, 106.6, 339.6, +108.8, 344.5, 120.5, 370.3, 124.8, 369.2, 132.1, 396.2, 73.9, 510.3, +74.7, 516.4, 72.5, 516.8, 73.7, 522.7, 63.8, 473.9, 62.6, 474.0, +56.6, 424.6, 60.5, 456.8, 63.0, 456.5, 69.5, 488.4, 71.7, 499.4, +72.6, 499.3, 73.9, 510.3, -25.5, 438.4, -32.2, 422.8, -39.0, 422.7, +-38.9, 407.2, -40.1, 403.8, -40.7, 403.4, -40.2, 400.0, -38.5, 387.8, +-34.0, 376.1, -34.5, 375.9, -29.2, 377.4, -32.6, 389.3, -30.6, 402.7, +-28.1, 420.5, -20.0, 435.3, -25.5, 438.4, 22.8, 369.7, 23.3, 379.1, +23.2, 379.1, 23.7, 388.5, 25.5, 440.3, 26.0, 440.3, 28.3, 492.1, +27.2, 485.5, 25.8, 485.7, 23.2, 479.3, 22.2, 474.7, 23.2, 474.4, +23.2, 469.6, 23.1, 435.6, 23.1, 435.6, 22.9, 401.7, 22.9, 387.5, +22.9, 387.5, 22.8, 373.4, 22.8, 371.5, 22.9, 371.5, 22.8, 369.7, +-7.1, 263.0, -3.2, 247.2, -3.2, 247.1, 0.6, 231.3, 2.8, 222.5, +2.7, 222.5, 5.0, 213.7, 8.2, 201.4, 6.4, 200.6, 11.4, 189.1, +12.6, 184.6, 11.6, 184.0, 13.9, 180.0, 13.5, 181.6, 14.2, 181.8, +14.5, 183.5, 16.1, 189.6, 14.8, 189.9, 15.1, 196.4, 21.6, 253.7, +15.7, 254.3, 16.3, 312.3, 18.3, 298.8, 9.2, 297.5, 2.2, 282.6, +-2.5, 272.8, -6.8, 272.9, -7.1, 263.0, 25.8, 421.8, 24.7, 405.2, +24.2, 405.2, 23.7, 388.5, 23.2, 379.1, 23.3, 379.1, 22.8, 369.7, +22.8, 369.7, 22.8, 369.7, 22.8, 369.6, 22.8, 369.6, 22.8, 369.5, +22.8, 369.5, 19.7, 343.1, 26.0, 342.4, 29.1, 315.3, 35.6, 352.4, +27.9, 353.7, 26.8, 392.2, 26.7, 393.2, 26.7, 393.2, 26.7, 394.2, +26.2, 408.0, 20.2, 411.2, 25.8, 421.8, 55.5, 418.2, 55.0, 421.2, +56.0, 421.4, 56.6, 424.6, 62.6, 474.0, 63.8, 473.9, 73.7, 522.7, +75.4, 532.3, 71.5, 538.3, 77.0, 541.9, 63.3, 522.7, 61.9, 523.7, +46.7, 505.5, 40.6, 486.7, 48.9, 484.0, 51.0, 462.5, 53.2, 440.3, +52.2, 440.2, 55.5, 418.2, 40.2, 617.2, 64.0, 620.8, 64.0, 620.8, +87.8, 624.5, 87.7, 638.4, 88.9, 638.4, 89.9, 652.3, 89.9, 652.3, +89.7, 652.3, 89.4, 652.2, 80.8, 650.5, 80.8, 650.5, 72.2, 648.9, +62.8, 647.0, 59.0, 650.8, 53.4, 645.1, 43.1, 634.9, 38.9, 618.0, +40.2, 617.2, 53.4, 645.1, 53.2, 643.6, 47.9, 644.1, 42.5, 643.0, +35.6, 641.6, 35.6, 641.6, 28.8, 640.3, 21.0, 638.8, 17.9, 641.9, +13.1, 637.2, 7.2, 631.4, 5.5, 627.2, 7.3, 619.4, 7.9, 620.2, +18.8, 616.3, 18.7, 614.1, 18.6, 614.0, 18.8, 614.0, 19.0, 613.9, +19.7, 612.1, 29.6, 615.5, 40.2, 617.2, 38.9, 618.0, 43.1, 634.9, +53.4, 645.1, 75.8, 715.5, 69.0, 712.1, 69.0, 712.1, 62.2, 708.7, +58.6, 707.9, 59.3, 705.0, 56.3, 701.2, 67.0, 706.5, 68.6, 706.3, +75.8, 715.5, 789.1, 644.2, 787.8, 644.4, 788.2, 647.9, 787.3, 651.6, +782.5, 663.2, 776.8, 671.7, 781.4, 676.2, 781.2, 676.2, 781.0, 677.3, +781.1, 677.4, 776.3, 677.8, 777.6, 692.0, 774.0, 706.6, 765.5, 680.3, +762.0, 681.4, 750.0, 656.2, 752.4, 646.1, 769.1, 646.7, 789.1, 644.2, +750.0, 656.2, 748.3, 652.7, 747.7, 652.9, 746.6, 649.2, 741.5, 633.0, +741.7, 632.9, 736.4, 616.8, 754.8, 618.3, 757.0, 625.1, 773.1, 619.7, +778.2, 625.5, 784.0, 622.2, 794.7, 621.4, 794.7, 621.4, 794.2, 623.3, +793.8, 625.1, 791.5, 634.7, 795.2, 639.9, 789.1, 644.2, 769.1, 646.7, +752.4, 646.1, 750.0, 656.2, 748.1, 484.6, 742.7, 479.3, 750.7, 468.2, +745.8, 465.5, 781.1, 494.2, 781.2, 494.0, 816.7, 522.4, 809.9, 516.5, +808.6, 518.0, 800.5, 513.5, 793.3, 509.5, 793.3, 509.5, 786.1, 505.6, +767.1, 495.1, 762.9, 499.3, 748.1, 484.6, 907.8, 630.0, 907.7, 629.7, +907.1, 629.8, 907.1, 629.4, 904.8, 615.5, 904.2, 615.5, 903.1, 601.5, +903.9, 612.2, 904.8, 612.1, 906.6, 622.8, 907.2, 626.4, 907.5, 626.4, +907.8, 630.0, 595.7, 350.0, 607.2, 357.8, 607.2, 357.8, 618.6, 365.6, +625.2, 368.3, 623.6, 372.1, 628.6, 378.5, 618.0, 388.9, 630.4, 401.5, +632.1, 424.4, 604.2, 402.0, 614.7, 388.9, 597.3, 353.4, 596.5, 351.7, +597.0, 350.8, 595.7, 350.0, 659.2, 449.5, 664.6, 440.6, 665.0, 440.8, +669.9, 431.6, 678.3, 442.4, 678.3, 442.4, 686.6, 453.1, 683.8, 457.8, +665.3, 457.3, 659.2, 449.5, 948.0, 402.8, 948.7, 413.7, 949.3, 413.7, +949.4, 424.6, 949.8, 448.4, 949.8, 448.4, 950.3, 472.2, 948.5, 462.5, +948.1, 462.5, 945.9, 452.8, 942.7, 430.1, 943.4, 430.0, 940.8, 407.3, +937.7, 379.2, 924.2, 357.6, 934.6, 351.1, 927.8, 355.4, 942.7, 376.7, +948.0, 402.8, 934.6, 351.1, 927.7, 310.9, 923.3, 310.1, 925.5, 269.8, +925.6, 266.1, 939.6, 265.2, 939.3, 263.2, 942.6, 333.0, 943.6, 333.0, +948.0, 402.8, 942.7, 376.7, 927.8, 355.4, 934.6, 351.1, 914.7, 275.0, +914.5, 273.9, 918.0, 273.4, 921.4, 271.7, 923.2, 270.9, 923.2, 270.9, +925.0, 270.0, 925.2, 269.9, 925.5, 269.9, 925.5, 269.8, 923.3, 310.1, +927.7, 310.9, 934.6, 351.1, 924.2, 357.6, 937.7, 379.2, 940.8, 407.3, +923.8, 342.2, 924.2, 341.6, 914.7, 275.0, 940.8, 407.3, 943.4, 430.0, +942.7, 430.1, 945.9, 452.8, 939.9, 425.5, 945.1, 423.2, 933.8, 398.2, +935.4, 360.4, 940.6, 341.7, 916.8, 321.8, 915.4, 300.0, 914.2, 299.5, +907.2, 278.6, 907.1, 277.0, 914.9, 275.8, 914.7, 275.0, 924.2, 341.6, +923.8, 342.2, 940.8, 407.3, 760.6, 353.1, 805.7, 329.5, 805.7, 329.5, +850.7, 305.9, 823.3, 315.5, 825.7, 322.5, 800.7, 339.1, 776.8, 355.0, +776.8, 355.0, 752.8, 370.9, 744.0, 376.7, 738.7, 374.4, 735.2, 382.6, +742.6, 365.5, 745.0, 363.5, 760.6, 353.1, 735.2, 382.6, 717.6, 397.7, +715.7, 395.5, 696.2, 408.5, 695.5, 409.0, 695.3, 409.6, 694.7, 409.5, +684.5, 402.5, 682.8, 405.0, 670.6, 401.0, 670.3, 400.8, 670.3, 400.8, +669.9, 400.6, 716.7, 380.0, 715.3, 376.8, 760.6, 353.1, 745.0, 363.5, +742.6, 365.5, 735.2, 382.6, 829.3, 349.3, 805.1, 362.9, 805.0, 362.6, +781.0, 376.4, 775.0, 379.5, 774.6, 378.8, 768.3, 381.2, 766.2, 382.0, +766.2, 382.0, 764.0, 382.8, 751.7, 387.5, 751.7, 387.5, 739.4, 392.2, +727.0, 396.9, 727.0, 396.9, 714.5, 401.6, 705.4, 405.0, 702.9, 402.3, +696.2, 408.5, 715.7, 395.5, 717.6, 397.7, 735.2, 382.6, 738.7, 374.4, +744.0, 376.7, 752.8, 370.9, 790.2, 357.7, 794.5, 342.5, 829.3, 349.3, +823.9, 404.0, 808.4, 391.3, 812.1, 386.9, 800.2, 369.8, 800.1, 369.5, +800.0, 369.2, 799.9, 369.3, 820.4, 361.5, 820.4, 361.5, 840.8, 353.8, +846.5, 358.5, 834.3, 373.1, 827.8, 392.5, 825.8, 398.3, 822.2, 402.7, +823.9, 404.0, 520.2, 128.3, 522.8, 135.7, 526.6, 134.1, 530.8, 141.2, +541.2, 158.9, 540.1, 159.5, 549.5, 177.8, 563.9, 205.9, 566.4, 204.8, +578.3, 234.0, 576.1, 228.6, 572.1, 230.5, 569.0, 225.3, 554.9, 201.4, +556.5, 200.5, 544.1, 175.8, 542.3, 172.2, 542.3, 172.2, 540.5, 168.7, +530.3, 148.5, 527.6, 149.4, 520.2, 128.3, 649.0, 299.7, 641.0, 276.2, +628.3, 280.5, 607.6, 261.2, 603.6, 257.5, 603.6, 257.5, 599.6, 253.8, +588.9, 243.9, 586.1, 245.8, 578.3, 234.0, 566.4, 204.8, 563.9, 205.9, +549.5, 177.8, 581.3, 186.8, 575.0, 209.0, 600.5, 240.3, 624.8, 270.0, +637.5, 265.7, 649.0, 299.7, 621.3, 242.7, 629.3, 253.2, 624.4, 257.5, +633.4, 266.7, 601.5, 234.1, 604.4, 231.3, 575.4, 195.8, 570.5, 189.8, +571.2, 189.2, 565.6, 183.9, 578.8, 196.4, 578.2, 197.1, 590.7, 210.4, +606.0, 226.5, 607.9, 225.1, 621.3, 242.7, 607.6, 261.2, 628.3, 280.5, +641.0, 276.2, 649.0, 299.7, 666.4, 315.9, 667.6, 314.8, 683.8, 332.1, +680.1, 328.1, 678.1, 330.1, 674.0, 326.3, 640.0, 294.7, 639.4, 295.1, +607.6, 261.2, 538.5, 273.3, 548.2, 283.1, 548.2, 283.1, 557.8, 293.0, +582.8, 318.3, 582.8, 318.3, 607.8, 343.7, 616.6, 352.7, 617.9, 362.6, +625.4, 361.6, 612.9, 352.0, 611.9, 353.3, 598.4, 345.0, 568.0, 314.6, +570.6, 312.1, 542.8, 279.0, 542.2, 278.3, 542.2, 278.2, 541.6, 277.4, +540.5, 275.8, 540.5, 275.8, 539.3, 274.3, 538.9, 273.8, 538.9, 273.7, +538.5, 273.3, 671.6, 22.5, 673.6, 20.2, 674.3, 18.8, 676.7, 19.0, +689.0, 32.0, 698.7, 22.8, 720.8, 26.7, 691.3, 60.0, 674.9, 71.6, +633.3, 68.0, 650.3, 69.5, 651.8, 44.7, 671.6, 22.5, 633.3, 68.0, +619.2, 79.9, 616.0, 76.2, 598.7, 84.3, 570.9, 97.4, 571.6, 99.2, +543.0, 110.6, 550.9, 107.4, 550.2, 105.6, 557.4, 100.7, 560.1, 98.9, +560.1, 98.9, 562.7, 97.1, 566.7, 94.4, 566.7, 94.4, 570.6, 91.6, +605.0, 68.1, 605.0, 68.1, 639.3, 44.6, 655.4, 33.6, 667.9, 36.8, +671.6, 22.5, 651.8, 44.7, 650.3, 69.5, 633.3, 68.0, 623.1, 94.6, +622.0, 94.0, 621.5, 95.0, 619.9, 95.3, 615.1, 96.3, 615.1, 96.3, +610.4, 97.3, 600.3, 99.5, 600.3, 99.5, 590.2, 101.6, 580.0, 103.8, +580.0, 103.8, 569.8, 106.0, 569.2, 106.1, 569.2, 106.1, 568.7, 106.2, +561.4, 107.8, 561.4, 107.8, 554.1, 109.4, 547.3, 110.8, 547.4, 111.5, +540.5, 112.3, 541.8, 112.1, 541.7, 111.2, 543.0, 110.6, 571.6, 99.2, +570.9, 97.4, 598.7, 84.3, 599.2, 84.1, 599.4, 84.6, 600.1, 84.9, +611.6, 89.7, 612.1, 88.8, 623.1, 94.6, 528.8, -39.2, 527.3, -47.3, +543.8, -57.6, 542.7, -58.6, 554.3, -47.9, 557.9, -30.8, 549.9, -19.7, +550.9, -21.1, 530.9, -27.9, 528.8, -39.2, 686.9, -7.4, 688.8, -8.6, +700.2, 0.9, 699.1, 3.6, 689.6, 2.0, 678.1, 20.5, 676.7, 19.0, +674.3, 18.8, 673.6, 20.2, 671.6, 22.5, 667.9, 36.8, 655.4, 33.6, +639.3, 44.6, 643.9, 42.0, 643.1, 40.5, 646.9, 36.3, 666.9, 14.4, +662.7, 7.7, 686.9, -7.4, 432.7, -43.8, 494.1, -60.9, 493.9, -61.6, +555.8, -76.8, 554.4, -76.4, 555.1, -74.3, 553.5, -73.6, 548.9, -71.4, +548.5, -72.3, 543.4, -71.1, 508.4, -62.5, 508.4, -62.5, 473.5, -53.9, +471.6, -53.4, 471.6, -53.4, 469.8, -53.0, 451.2, -48.4, 451.1, -48.9, +432.7, -43.8, 223.1, 199.1, 223.1, 199.1, 232.3, 166.6, 241.5, 134.0, +245.6, 119.3, 245.6, 119.3, 249.8, 104.6, 253.8, 90.4, 253.9, 90.4, +257.9, 76.1, 260.2, 67.8, 260.2, 67.8, 262.6, 59.6, 266.1, 47.2, +266.1, 47.2, 269.6, 34.9, 270.1, 33.1, 270.0, 33.1, 270.6, 31.2, +270.6, 31.2, 270.6, 31.2, 270.6, 31.1, 270.1, 33.0, 270.1, 33.0, +269.6, 34.9, 266.1, 47.2, 266.1, 47.2, 262.6, 59.6, 260.2, 67.8, +260.2, 67.8, 257.9, 76.1, 253.9, 90.4, 253.8, 90.4, 249.8, 104.6, +245.6, 119.3, 245.6, 119.3, 241.5, 134.0, 232.3, 166.6, 223.1, 199.1, +223.1, 199.1, 149.0, 461.3, 149.0, 461.3, 149.7, 458.6, 150.5, 455.9, +178.7, 356.3, 175.0, 355.1, 206.8, 256.7, 206.6, 257.2, 214.0, 259.0, +213.8, 260.1, 210.0, 283.9, 206.3, 283.4, 198.8, 306.6, 194.5, 320.1, +194.5, 320.1, 190.1, 333.6, 170.3, 394.7, 170.2, 394.7, 150.5, 455.9, +149.7, 458.6, 149.0, 461.3, 149.0, 461.3, 238.0, 140.7, 239.4, 137.2, +240.6, 137.6, 241.5, 134.0, 232.3, 166.6, 223.1, 199.1, 223.1, 199.1, +215.0, 227.9, 215.1, 227.9, 206.8, 256.7, 194.4, 299.9, 194.2, 299.8, +181.8, 343.0, 179.0, 352.7, 179.1, 352.8, 176.4, 362.5, 165.4, 402.3, +165.4, 402.3, 154.3, 442.2, 152.4, 449.0, 150.5, 455.9, 150.5, 455.9, +150.5, 455.9, 152.4, 449.0, 154.3, 442.2, 165.4, 402.3, 165.4, 402.3, +176.4, 362.5, 179.1, 352.8, 179.0, 352.7, 181.8, 343.0, 189.6, 315.0, +189.6, 315.0, 197.4, 286.9, 200.1, 277.3, 200.1, 277.3, 202.7, 267.7, +214.8, 224.2, 214.8, 224.2, 226.9, 180.6, 231.1, 165.6, 231.1, 165.6, +235.3, 150.5, 235.5, 149.5, 235.5, 149.5, 235.8, 148.5, 236.9, 144.6, +236.5, 144.5, 238.0, 140.7, 222.1, 121.8, 243.4, 80.9, 245.2, 81.7, +264.6, 39.9, 267.6, 35.6, 267.6, 35.6, 270.6, 31.2, 269.1, 45.7, +266.6, 45.4, 262.6, 59.6, 260.2, 67.8, 260.2, 67.8, 257.9, 76.1, +253.9, 90.4, 253.8, 90.4, 249.8, 104.6, 247.0, 109.7, 244.2, 108.1, +238.5, 111.6, 230.3, 116.7, 224.7, 114.7, 222.1, 121.8, 161.1, 239.4, +158.7, 243.9, 156.5, 248.6, 156.5, 248.6, 156.0, 249.5, 156.0, 249.5, +155.5, 250.4, 147.2, 266.5, 138.9, 282.6, 138.9, 282.6, 138.9, 282.6, +147.2, 266.5, 155.5, 250.4, 156.0, 249.5, 156.0, 249.5, 156.5, 248.6, +156.5, 248.6, 158.7, 243.9, 161.1, 239.4, 464.8, 585.3, 461.1, 544.5, +461.1, 544.5, 457.3, 503.6, 457.3, 502.5, 458.0, 502.4, 458.7, 501.2, +460.2, 498.5, 460.2, 498.5, 461.7, 495.7, 462.7, 493.9, 463.8, 493.9, +463.8, 492.1, 465.4, 538.7, 484.5, 550.0, 464.8, 585.3, 209.1, 647.2, +209.1, 646.8, 209.3, 646.8, 209.5, 646.5, 212.6, 641.2, 212.6, 641.2, +215.7, 636.0, 218.1, 631.9, 217.3, 628.6, 220.5, 627.8, 219.5, 628.1, +220.3, 631.4, 220.0, 634.9, 219.1, 648.1, 219.1, 648.1, 218.1, 661.3, +214.3, 713.1, 225.7, 716.7, 210.6, 764.9, 221.5, 730.2, 210.1, 726.6, +209.6, 688.4, 209.5, 676.0, 209.5, 676.0, 209.3, 663.7, 209.2, 655.4, +209.0, 655.4, 209.1, 647.2, 466.7, 814.3, 468.7, 848.1, 466.7, 848.4, +470.7, 882.0, 470.1, 884.5, 460.2, 884.2, 450.3, 882.5, 450.5, 882.6, +450.8, 880.6, 451.3, 878.7, 459.0, 846.5, 464.5, 813.9, 466.7, 814.3, +131.9, 102.5, 132.2, 103.4, 132.6, 103.2, 133.3, 103.9, 134.2, 104.8, +134.2, 104.8, 135.1, 105.7, 136.0, 106.7, 136.0, 106.7, 136.9, 107.6, +144.5, 115.4, 149.7, 114.0, 152.1, 123.1, 147.4, 125.8, 147.4, 125.8, +142.6, 128.4, 133.5, 119.1, 136.9, 115.6, 131.9, 102.5, 172.1, 171.1, +172.2, 172.5, 173.0, 173.1, 172.4, 174.0, 172.0, 175.3, 170.6, 175.3, +170.7, 176.4, 170.5, 173.8, 170.6, 173.2, 172.1, 171.1, 188.5, 778.9, +183.6, 784.8, 193.4, 790.8, 191.6, 801.6, 200.2, 807.9, 172.4, 831.7, +175.5, 859.3, 176.2, 858.1, 164.7, 854.8, 164.5, 849.8, 163.8, 836.8, +169.0, 836.5, 173.5, 823.2, 181.0, 801.1, 174.5, 795.6, 188.5, 778.9, +124.4, 697.1, 123.6, 699.9, 136.9, 701.5, 137.3, 706.8, 135.6, 765.0, +131.5, 765.1, 133.9, 823.2, 134.3, 819.7, 127.4, 820.2, 124.7, 815.1, +126.5, 809.3, 123.7, 808.3, 122.4, 801.6, 120.3, 788.4, 120.1, 788.5, +117.8, 775.3, 118.5, 736.2, 113.8, 734.1, 124.4, 697.1, 117.8, 775.3, +117.4, 773.4, 117.4, 773.4, 117.1, 771.4, 109.1, 725.5, 98.5, 724.9, +101.1, 679.7, 100.7, 686.7, 111.3, 687.3, 121.5, 694.9, 123.0, 696.0, +124.5, 696.1, 124.4, 697.1, 113.8, 734.1, 118.5, 736.2, 117.8, 775.3, +113.5, 633.8, 113.4, 625.4, 117.1, 625.4, 120.7, 617.0, 122.9, 611.8, +126.2, 611.0, 125.1, 606.5, 123.9, 649.3, 152.3, 658.4, 137.8, 692.5, +137.6, 699.6, 137.6, 699.6, 137.3, 706.8, 136.9, 701.5, 123.6, 699.9, +124.4, 697.1, 124.5, 696.1, 123.0, 696.0, 121.5, 694.9, 116.3, 664.6, +113.8, 664.4, 113.5, 633.8, 121.5, 694.9, 111.3, 687.3, 100.7, 686.7, +101.1, 679.7, 100.1, 673.7, 100.0, 673.7, 99.0, 667.8, 98.9, 666.1, +99.7, 666.1, 100.4, 664.5, 107.0, 649.1, 118.6, 641.1, 113.5, 633.8, +113.8, 664.4, 116.3, 664.6, 121.5, 694.9, 104.7, 601.1, 108.5, 585.7, +108.5, 585.7, 112.4, 570.4, 130.1, 523.1, 127.5, 522.1, 141.9, 473.6, +141.9, 494.5, 141.9, 494.5, 141.9, 515.4, 129.0, 559.9, 126.7, 560.0, +104.7, 601.1, 74.1, 373.8, 73.1, 372.4, 73.1, 372.4, 72.1, 371.0, +72.8, 344.1, 73.9, 344.1, 75.7, 317.2, 75.8, 314.6, 76.0, 314.7, +76.0, 312.1, 75.6, 328.2, 75.5, 328.2, 75.0, 344.2, 74.5, 359.0, +75.7, 359.1, 74.1, 373.8, 38.1, 251.5, 39.2, 217.8, 39.2, 217.8, +40.3, 184.2, 38.1, 193.9, 44.4, 195.3, 48.4, 206.4, 49.9, 210.5, +49.9, 210.5, 51.4, 214.6, 53.3, 220.0, 53.3, 220.0, 55.3, 225.4, +58.4, 225.5, 58.1, 233.2, 60.9, 240.9, 55.0, 249.8, 37.7, 250.5, +38.1, 251.5, 69.5, 488.4, 63.0, 456.5, 60.5, 456.8, 56.6, 424.6, +56.0, 421.4, 55.0, 421.2, 55.5, 418.2, 52.4, 400.5, 52.4, 400.5, +49.3, 382.8, 48.7, 379.6, 48.7, 379.6, 48.2, 376.4, 46.4, 366.3, +46.6, 366.3, 44.6, 356.3, 49.8, 382.7, 49.6, 382.7, 54.6, 409.2, +62.0, 448.8, 64.4, 448.5, 69.5, 488.4, 104.4, 482.2, 105.1, 470.7, +92.8, 469.9, 81.3, 457.6, 78.2, 454.3, 75.5, 454.7, 75.1, 451.0, +72.7, 430.8, 69.3, 428.3, 75.8, 409.9, 73.3, 416.9, 79.5, 419.1, +83.1, 428.3, 93.7, 455.2, 106.0, 456.0, 104.4, 482.2, 9.9, 492.8, +9.9, 497.9, 7.7, 499.0, 9.8, 503.0, 5.2, 499.5, 3.7, 500.5, +0.7, 495.9, -0.1, 494.8, -0.5, 495.0, -1.6, 494.1, -10.5, 465.3, +-13.6, 466.3, -25.5, 438.4, -20.0, 435.3, -28.1, 420.5, -30.6, 402.7, +-30.4, 406.9, -28.8, 406.8, -27.0, 410.9, -26.2, 412.5, -26.2, 412.5, +-25.5, 414.1, -7.8, 453.5, -6.0, 452.8, 9.9, 492.8, 23.2, 469.6, +23.2, 474.4, 22.2, 474.7, 23.2, 479.3, 16.9, 463.2, 22.3, 456.0, +10.6, 447.0, -2.7, 413.2, -2.5, 413.1, -15.8, 379.3, -17.1, 376.1, +-18.6, 372.9, -18.6, 372.9, -18.6, 372.9, -17.1, 376.1, -15.8, 379.3, +-10.6, 391.4, -10.6, 391.4, -5.3, 403.6, 8.9, 436.6, 10.5, 436.0, +23.2, 469.6, 16.7, 353.2, 16.8, 359.2, 14.8, 360.0, 16.8, 365.3, +9.7, 365.8, 1.8, 359.9, 1.7, 354.3, 1.7, 353.8, 12.1, 349.8, +16.7, 353.2, 26.7, 394.2, 27.9, 354.8, 27.4, 354.7, 29.1, 315.3, +29.9, 308.7, 29.9, 308.7, 30.7, 302.0, 29.3, 347.1, 28.7, 347.1, +26.8, 392.2, 26.7, 393.2, 26.7, 393.2, 26.7, 394.2, 51.0, 462.5, +48.9, 484.0, 40.6, 486.7, 46.7, 505.5, 39.6, 496.9, 38.9, 497.4, +32.4, 488.3, 31.2, 486.7, 30.0, 486.7, 30.0, 485.1, 29.1, 470.9, +29.1, 470.9, 28.1, 456.8, 34.9, 416.1, 36.8, 416.2, 48.2, 376.4, +48.7, 379.6, 48.7, 379.6, 49.3, 382.8, 50.6, 422.6, 51.9, 422.7, +51.0, 462.5, 49.3, 382.8, 52.4, 400.5, 52.4, 400.5, 55.5, 418.2, +52.2, 440.2, 53.2, 440.3, 51.0, 462.5, 51.9, 422.7, 50.6, 422.6, +49.3, 382.8, 43.3, 684.7, 30.8, 668.9, 32.9, 655.3, 18.3, 653.0, +14.0, 646.2, 10.3, 640.7, 13.1, 637.2, 17.9, 641.9, 21.0, 638.8, +28.8, 640.3, 40.9, 659.4, 51.2, 675.0, 43.3, 684.7, 713.3, 489.1, +712.7, 488.6, 713.1, 488.1, 713.0, 487.0, 713.6, 472.0, 710.3, 471.8, +707.6, 456.6, 726.2, 469.7, 719.9, 478.6, 732.3, 500.6, 732.8, 501.5, +732.5, 501.9, 733.3, 502.3, 728.0, 499.4, 728.2, 499.0, 723.2, 495.6, +718.2, 492.3, 717.8, 492.9, 713.3, 489.1, 752.2, 518.9, 756.0, 528.8, +751.3, 539.8, 754.8, 540.6, 745.8, 538.6, 748.0, 528.5, 741.2, 516.5, +739.2, 512.8, 736.7, 509.4, 737.1, 509.1, 738.4, 508.1, 740.9, 511.5, +744.7, 514.0, 748.4, 516.4, 750.9, 515.5, 752.2, 518.9, 839.3, 624.0, +867.6, 630.5, 867.6, 630.8, 895.8, 637.6, 900.4, 638.7, 903.8, 641.2, +904.9, 639.8, 891.5, 650.5, 891.5, 650.5, 878.0, 661.2, 856.0, 656.1, +859.1, 643.0, 840.1, 624.8, 839.7, 624.4, 839.8, 624.1, 839.3, 624.0, +835.3, 566.8, 835.3, 566.8, 836.0, 567.4, 836.7, 568.0, 857.1, 585.8, +857.1, 585.8, 877.5, 603.6, 892.3, 616.5, 892.3, 616.5, 907.1, 629.4, +907.1, 629.8, 907.7, 629.7, 907.8, 630.0, 910.0, 632.0, 912.3, 632.1, +912.2, 633.9, 909.8, 635.8, 909.8, 635.8, 907.5, 637.7, 884.6, 619.5, +886.4, 617.2, 865.4, 596.6, 865.0, 596.2, 865.1, 596.1, 864.8, 595.8, +852.2, 583.3, 852.1, 583.4, 839.5, 570.9, 838.1, 569.5, 838.2, 569.5, +836.7, 568.0, 836.0, 567.4, 835.3, 566.8, 835.3, 566.8, 845.9, 561.2, +855.0, 547.1, 858.7, 547.4, 874.5, 539.8, 876.3, 539.0, 881.2, 544.2, +881.1, 544.3, 877.6, 549.8, 874.2, 547.6, 867.3, 550.9, 856.6, 556.1, +851.4, 552.7, 845.9, 561.2, 819.2, 520.3, 819.5, 519.3, 820.2, 518.7, +819.7, 518.2, 817.7, 516.8, 825.6, 507.8, 823.0, 504.7, 839.9, 508.5, +838.4, 515.2, 853.8, 525.7, 864.1, 532.8, 875.5, 535.3, 874.5, 539.8, +858.7, 547.4, 855.0, 547.1, 845.9, 561.2, 842.7, 563.6, 839.5, 565.7, +839.6, 565.9, 826.2, 545.2, 828.8, 543.4, 819.2, 520.3, 839.6, 565.9, +839.8, 566.4, 838.3, 567.7, 836.7, 568.0, 836.0, 567.4, 835.3, 566.8, +835.3, 566.8, 824.6, 557.5, 824.6, 557.5, 813.9, 548.1, 813.3, 547.6, +812.6, 547.5, 812.7, 547.1, 814.9, 535.3, 815.5, 535.4, 818.4, 523.8, +819.5, 522.9, 818.8, 522.1, 819.2, 520.3, 828.8, 543.4, 826.2, 545.2, +839.6, 565.9, 906.6, 622.8, 904.8, 612.1, 903.9, 612.2, 903.1, 601.5, +900.4, 583.4, 900.5, 583.4, 897.9, 565.3, 897.9, 565.1, 897.9, 565.1, +897.9, 564.9, 899.5, 575.6, 899.5, 575.6, 901.1, 586.3, 903.8, 604.5, +904.2, 604.5, 906.6, 622.8, 597.3, 353.4, 614.7, 388.9, 604.2, 402.0, +632.1, 424.4, 634.1, 450.4, 634.1, 450.4, 636.1, 476.4, 636.0, 474.9, +635.6, 474.9, 635.2, 473.4, 630.7, 459.4, 630.7, 459.4, 626.3, 445.3, +611.8, 399.4, 586.5, 392.3, 597.3, 353.4, 690.4, 580.0, 687.8, 583.4, +684.6, 584.2, 685.3, 586.9, 684.2, 587.1, 681.3, 582.6, 682.0, 581.7, +683.9, 579.2, 689.6, 578.7, 690.4, 580.0, 911.3, 564.9, 903.7, 560.0, +903.9, 559.8, 896.4, 554.7, 894.9, 553.7, 894.4, 554.0, 893.3, 552.6, +892.7, 551.8, 893.2, 551.5, 893.0, 550.3, 892.0, 543.8, 892.0, 543.8, +891.0, 537.3, 890.9, 536.6, 891.2, 536.4, 890.9, 536.0, 895.6, 542.1, +895.3, 542.3, 899.8, 548.7, 905.1, 556.1, 905.1, 556.1, 910.3, 563.5, +910.4, 563.6, 910.4, 563.6, 910.5, 563.7, 910.9, 564.3, 910.8, 564.5, +911.3, 564.9, 881.4, 472.9, 881.6, 434.2, 875.4, 434.2, 869.9, 395.5, +869.9, 395.5, 869.9, 393.4, 869.9, 391.2, 876.0, 432.0, 881.6, 432.1, +881.4, 472.9, 921.6, 407.7, 923.8, 415.2, 923.8, 415.2, 926.0, 422.7, +938.8, 442.6, 928.9, 449.0, 931.8, 475.4, 930.9, 463.2, 930.0, 463.3, +928.2, 451.2, 924.9, 429.4, 923.3, 429.6, 921.6, 407.7, 903.7, 346.4, +908.9, 364.0, 920.2, 370.0, 914.0, 381.7, 914.0, 382.1, 914.0, 382.4, +914.3, 382.6, 916.1, 382.5, 916.7, 390.9, 919.1, 399.2, 917.7, 404.6, +913.4, 403.5, 907.7, 407.8, 901.1, 412.8, 896.0, 419.1, 894.4, 417.8, +884.3, 409.7, 889.3, 403.4, 884.2, 389.0, 883.6, 387.4, 882.6, 387.0, +883.1, 385.9, 892.3, 365.7, 890.9, 348.1, 903.7, 346.4, 842.4, 342.0, +835.8, 345.6, 835.8, 345.6, 829.3, 349.3, 794.5, 342.5, 790.2, 357.7, +752.8, 370.9, 776.8, 355.0, 776.8, 355.0, 800.7, 339.1, 819.2, 333.1, +823.5, 335.2, 842.4, 342.0, 800.7, 339.1, 825.7, 322.5, 823.3, 315.5, +850.7, 305.9, 851.2, 305.7, 851.6, 305.3, 851.6, 305.3, 853.8, 304.2, +856.0, 302.9, 856.1, 303.1, 853.5, 305.6, 856.6, 309.4, 858.0, 315.5, +857.8, 323.7, 859.2, 323.7, 860.4, 331.9, 852.6, 330.4, 851.4, 336.9, +842.4, 342.0, 823.5, 335.2, 819.2, 333.1, 800.7, 339.1, 847.6, 351.2, +855.0, 348.4, 858.9, 351.0, 862.4, 345.6, 862.8, 348.1, 862.8, 348.1, +863.2, 350.6, 856.3, 353.2, 847.8, 352.0, 847.6, 351.2, 765.4, 446.9, +783.7, 457.2, 781.5, 461.2, 797.5, 475.5, 815.2, 491.3, 815.2, 491.3, +832.8, 507.0, 837.8, 511.5, 837.8, 511.5, 842.9, 516.0, 848.3, 520.8, +847.5, 522.2, 853.8, 525.7, 838.4, 515.2, 839.9, 508.5, 823.0, 504.7, +809.3, 488.9, 785.4, 487.8, 787.2, 480.4, 767.8, 463.2, 767.8, 459.9, +744.0, 451.0, 728.2, 440.2, 728.2, 440.2, 712.4, 429.4, 706.9, 425.7, +706.9, 425.7, 701.5, 422.0, 700.7, 419.7, 698.9, 420.3, 696.4, 418.5, +731.1, 432.1, 733.1, 428.7, 765.4, 446.9, 696.4, 418.5, 692.6, 416.0, +692.6, 416.0, 688.8, 413.4, 690.9, 414.1, 693.6, 408.7, 694.7, 409.5, +695.3, 409.6, 695.5, 409.0, 696.2, 408.5, 702.9, 402.3, 705.4, 405.0, +714.5, 401.6, 743.6, 417.7, 763.2, 449.1, 765.4, 446.9, 733.1, 428.7, +731.1, 432.1, 696.4, 418.5, 493.2, 122.4, 496.6, 123.8, 497.6, 121.5, +502.0, 120.5, 507.0, 119.4, 507.6, 117.2, 512.1, 118.4, 515.0, 119.1, +517.6, 122.8, 516.9, 124.3, 516.4, 125.4, 513.3, 124.0, 509.6, 123.7, +501.4, 123.1, 500.4, 125.4, 493.2, 122.4, 600.5, 240.3, 575.0, 209.0, +581.3, 186.8, 549.5, 177.8, 540.1, 159.5, 541.2, 158.9, 530.8, 141.2, +553.1, 149.7, 548.2, 162.6, 565.6, 183.9, 571.2, 189.2, 570.5, 189.8, +575.4, 195.8, 588.8, 217.5, 581.6, 227.2, 600.5, 240.3, 575.4, 195.8, +604.4, 231.3, 601.5, 234.1, 633.4, 266.7, 639.4, 274.1, 639.4, 274.1, +645.4, 281.4, 659.5, 298.6, 659.5, 298.6, 673.5, 315.8, 673.6, 315.8, +673.6, 315.8, 673.6, 315.9, 685.1, 330.0, 687.0, 328.8, 696.7, 344.0, +692.1, 336.9, 690.2, 338.1, 683.8, 332.1, 667.6, 314.8, 666.4, 315.9, +649.0, 299.7, 637.5, 265.7, 624.8, 270.0, 600.5, 240.3, 581.6, 227.2, +588.8, 217.5, 575.4, 195.8, 903.1, 280.6, 895.2, 284.4, 895.2, 284.4, +887.3, 288.2, 883.2, 288.4, 883.0, 285.2, 878.8, 282.3, 854.6, 265.6, +854.6, 265.6, 830.4, 249.0, 825.3, 245.5, 825.3, 245.5, 820.2, 241.9, +794.8, 224.5, 794.8, 224.5, 769.5, 207.0, 768.4, 206.2, 768.4, 206.2, +767.2, 205.4, 760.5, 200.8, 761.2, 199.3, 753.8, 196.2, 766.9, 201.7, +766.2, 203.2, 778.7, 210.2, 792.9, 218.3, 792.9, 218.3, 807.2, 226.4, +812.6, 229.4, 812.6, 229.4, 817.9, 232.4, 842.6, 246.4, 842.6, 246.4, +867.2, 260.3, 875.7, 265.1, 875.7, 265.1, 884.2, 269.9, 892.2, 274.4, +892.2, 274.4, 900.1, 278.9, 901.6, 279.7, 902.5, 281.0, 903.1, 280.6, +517.7, 117.1, 520.7, 121.1, 529.1, 114.7, 540.5, 112.3, 547.4, 111.5, +547.3, 110.8, 554.1, 109.4, 555.5, 109.5, 555.2, 111.7, 556.4, 114.1, +567.2, 135.5, 567.2, 135.5, 578.0, 156.8, 579.1, 158.9, 579.1, 158.9, +580.1, 161.0, 582.9, 166.5, 581.2, 168.9, 585.7, 172.0, 550.0, 147.0, +543.3, 151.0, 517.7, 117.1, 599.6, 253.8, 603.6, 257.5, 603.6, 257.5, +607.6, 261.2, 639.4, 295.1, 640.0, 294.7, 674.0, 326.3, 671.5, 323.8, +670.3, 325.0, 667.7, 322.6, 653.1, 308.9, 653.6, 308.4, 639.5, 294.1, +619.6, 274.0, 619.4, 274.2, 599.6, 253.8, 701.4, 377.5, 684.8, 385.5, +684.8, 385.5, 668.1, 393.5, 665.9, 393.6, 665.6, 386.2, 663.1, 378.8, +655.2, 355.4, 654.4, 331.7, 647.2, 331.9, 673.6, 331.1, 691.7, 348.8, +701.4, 377.5, 439.9, 203.6, 440.2, 203.0, 439.1, 202.4, 438.3, 201.1, +437.8, 193.7, 427.2, 190.5, 429.1, 186.9, 422.4, 176.3, 422.4, 176.3, +415.7, 165.8, 412.5, 160.9, 412.5, 160.9, 409.4, 156.0, 409.6, 155.6, +408.9, 154.9, 408.1, 154.0, 404.3, 148.1, 400.6, 148.2, 400.6, 142.2, +404.3, 142.2, 404.3, 141.4, 408.0, 140.6, 430.6, 159.3, 436.6, 157.6, +449.3, 182.6, 452.6, 189.1, 445.7, 193.8, 439.9, 203.6, 600.1, 84.9, +599.4, 84.6, 599.2, 84.1, 598.7, 84.3, 616.0, 76.2, 619.2, 79.9, +633.3, 68.0, 674.9, 71.6, 691.3, 60.0, 720.8, 26.7, 723.0, 27.1, +724.0, 26.2, 725.3, 27.5, 726.3, 27.9, 726.7, 29.3, 727.1, 29.1, +715.7, 35.3, 715.2, 34.3, 703.4, 39.5, 701.1, 40.5, 701.1, 40.5, +698.9, 41.5, 662.7, 57.4, 662.7, 57.4, 626.5, 73.3, 613.3, 79.1, +613.5, 79.6, 600.1, 84.9, 557.4, 100.7, 550.2, 105.6, 550.9, 107.4, +543.0, 110.6, 541.7, 111.2, 541.8, 112.1, 540.5, 112.3, 529.1, 114.7, +520.7, 121.1, 517.7, 117.1, 514.9, 117.8, 514.9, 117.8, 512.1, 118.4, +507.6, 117.2, 507.0, 119.4, 502.0, 120.5, 503.0, 121.8, 506.6, 118.9, +511.2, 117.2, 534.3, 109.0, 533.6, 105.7, 557.4, 100.7, 387.3, 116.0, +362.5, 54.7, 365.8, 53.1, 337.7, -6.6, 335.7, -12.3, 336.3, -17.9, +333.7, -18.1, 341.8, -20.2, 341.8, -20.2, 349.8, -22.3, 351.7, -22.3, +352.8, -20.5, 353.5, -18.0, 364.2, 19.6, 363.0, 19.9, 372.6, 57.9, +374.7, 66.1, 374.7, 66.1, 376.8, 74.3, 379.0, 83.0, 379.0, 83.0, +381.2, 91.7, 383.3, 100.2, 383.3, 100.2, 385.5, 108.7, 386.4, 112.4, +385.9, 112.6, 387.3, 116.0, 428.6, -42.8, 428.6, -42.8, 430.6, -43.3, +432.7, -43.8, 451.1, -48.9, 451.2, -48.4, 469.8, -53.0, 451.2, -48.4, +451.1, -48.9, 432.7, -43.8, 430.6, -43.3, 428.6, -42.8, 428.6, -42.8, +215.0, 260.7, 214.8, 260.9, 214.4, 260.4, 213.8, 260.1, 214.0, 259.0, +206.6, 257.2, 206.8, 256.7, 215.1, 227.9, 215.0, 227.9, 223.1, 199.1, +223.1, 199.1, 232.3, 166.6, 241.5, 134.0, 245.6, 119.3, 245.6, 119.3, +249.8, 104.6, 253.8, 90.4, 253.9, 90.4, 257.9, 76.1, 257.0, 79.3, +257.2, 79.3, 256.4, 82.5, 248.0, 118.7, 248.0, 118.7, 239.6, 154.9, +232.4, 185.6, 232.4, 185.6, 225.3, 216.3, 225.1, 217.0, 225.1, 217.0, +225.0, 217.7, 220.2, 238.1, 220.2, 238.1, 215.5, 258.6, 215.2, 259.7, +215.6, 260.1, 215.0, 260.7, 142.3, 443.2, 142.0, 441.3, 141.8, 441.3, +141.8, 439.5, 136.9, 394.0, 135.5, 394.1, 129.3, 348.8, 129.9, 332.1, +133.8, 320.3, 146.4, 316.0, 141.9, 317.5, 146.0, 329.6, 145.6, 343.2, +143.9, 393.2, 144.3, 393.2, 142.3, 443.2, 192.0, 145.4, 196.4, 139.0, +200.1, 132.2, 200.8, 132.6, 202.0, 132.5, 202.9, 131.1, 202.9, 129.5, +229.0, 115.3, 223.0, 102.9, 240.6, 74.8, 246.6, 67.8, 245.9, 67.1, +251.1, 59.5, 244.4, 70.9, 245.2, 71.4, 239.2, 83.3, 236.4, 88.2, +235.7, 87.8, 232.3, 92.4, 212.1, 118.9, 212.5, 119.2, 192.0, 145.4, +470.3, 647.3, 471.5, 660.3, 471.7, 660.3, 472.9, 673.2, 473.3, 677.4, +473.3, 677.4, 473.7, 681.5, 473.9, 684.3, 474.0, 684.3, 474.2, 687.1, +474.9, 695.0, 474.8, 695.0, 475.5, 702.9, 468.6, 699.9, 471.3, 693.5, +467.1, 684.1, 466.6, 682.9, 466.6, 682.9, 466.1, 681.7, 464.4, 678.0, +464.4, 678.0, 462.8, 674.3, 461.2, 670.9, 460.0, 671.0, 459.7, 667.4, +454.0, 587.3, 454.4, 587.2, 448.3, 507.2, 447.9, 501.2, 448.0, 501.2, +447.6, 495.3, 446.7, 480.6, 448.0, 480.4, 445.8, 465.9, 459.4, 556.4, +458.5, 556.6, 470.3, 647.3, 445.8, 465.9, 444.2, 452.7, 445.1, 452.6, +444.3, 439.3, 443.4, 424.6, 443.4, 424.6, 442.5, 409.9, 442.2, 404.5, +442.2, 404.5, 441.8, 399.1, 440.9, 383.7, 440.9, 383.7, 440.0, 368.4, +440.0, 367.4, 440.0, 367.4, 439.9, 366.4, 436.0, 301.4, 432.8, 301.4, +432.1, 236.3, 432.5, 271.5, 435.8, 271.5, 439.3, 306.7, 441.3, 329.1, +441.3, 329.1, 443.4, 351.4, 443.9, 357.8, 443.9, 357.8, 444.5, 364.1, +444.8, 366.7, 444.8, 366.7, 445.0, 369.4, 446.9, 389.4, 446.9, 389.4, +448.7, 409.5, 452.1, 447.0, 452.1, 447.0, 455.6, 484.5, 456.5, 494.1, +456.5, 494.1, 457.3, 503.6, 461.1, 544.5, 461.1, 544.5, 464.8, 585.3, +466.5, 603.5, 466.6, 603.5, 468.2, 621.6, 469.3, 634.5, 469.2, 634.5, +470.3, 647.3, 458.5, 556.6, 459.4, 556.4, 445.8, 465.9, 465.1, 743.6, +462.4, 705.5, 462.4, 705.5, 459.7, 667.4, 460.0, 671.0, 461.2, 670.9, +462.8, 674.3, 463.8, 680.1, 463.0, 680.2, 463.2, 686.2, 464.1, 714.9, +459.9, 715.7, 465.1, 743.6, 519.2, 392.8, 519.8, 404.6, 512.4, 405.1, +505.5, 417.3, 505.6, 417.1, 505.4, 417.0, 505.5, 416.9, 512.2, 404.8, +519.7, 404.5, 519.2, 392.8, 210.2, 770.6, 213.3, 782.9, 209.2, 783.9, +208.2, 797.2, 205.3, 838.2, 215.2, 875.8, 202.3, 879.2, 197.0, 840.4, +213.6, 817.8, 191.6, 801.6, 193.4, 790.8, 183.6, 784.8, 188.5, 778.9, +187.3, 770.3, 187.3, 770.3, 186.1, 761.7, 185.4, 756.6, 185.4, 756.6, +184.7, 751.5, 184.6, 751.1, 184.7, 751.0, 184.6, 750.6, 192.1, 756.1, +191.9, 756.3, 199.2, 762.1, 204.7, 766.3, 208.8, 765.3, 210.2, 770.6, +156.0, 542.8, 153.2, 522.1, 153.2, 522.1, 150.3, 501.5, 169.4, 477.1, +168.7, 476.5, 187.1, 451.5, 174.1, 457.5, 180.4, 471.0, 173.8, 490.6, +173.3, 491.8, 173.3, 491.8, 172.9, 493.1, 172.9, 493.2, 172.9, 493.2, +172.8, 493.4, 170.6, 500.0, 170.6, 500.0, 168.3, 506.7, 165.8, 514.0, +165.8, 514.0, 163.3, 521.4, 159.6, 532.1, 152.2, 536.9, 156.0, 542.8, +224.3, 529.2, 225.0, 523.0, 227.6, 517.0, 228.5, 517.2, 229.2, 517.3, +228.1, 523.5, 227.6, 529.8, 227.1, 537.3, 227.1, 537.3, 226.5, 544.9, +223.5, 586.4, 225.4, 586.6, 220.5, 627.8, 217.3, 628.6, 218.1, 631.9, +215.7, 636.0, 217.8, 582.5, 218.6, 582.4, 224.3, 529.2, 348.9, 883.3, +337.1, 885.5, 330.9, 889.1, 324.4, 882.9, 320.9, 879.5, 326.7, 873.5, +329.0, 864.1, 329.5, 862.2, 329.5, 862.2, 329.9, 860.4, 336.9, 831.8, +354.5, 813.4, 343.8, 803.1, 363.8, 822.4, 346.2, 840.7, 348.6, 878.3, +348.7, 880.8, 349.2, 883.2, 348.9, 883.3, 415.7, 165.8, 422.4, 176.3, +422.4, 176.3, 429.1, 186.9, 423.5, 197.5, 429.9, 201.0, 430.8, 215.1, +431.2, 225.7, 431.1, 225.7, 432.1, 236.3, 432.8, 301.4, 436.0, 301.4, +439.9, 366.4, 439.3, 344.4, 437.2, 344.4, 434.6, 322.4, 429.7, 281.8, +429.7, 281.8, 424.8, 241.2, 422.1, 218.7, 422.1, 218.7, 419.4, 196.3, +417.8, 183.6, 417.8, 183.6, 416.3, 171.0, 416.0, 168.4, 417.1, 167.5, +415.7, 165.8, 101.2, 144.6, 99.2, 144.7, 92.1, 120.2, 94.7, 97.2, +103.9, 91.9, 101.6, 87.9, 108.5, 78.6, 110.8, 77.7, 113.0, 83.2, +117.6, 87.9, 121.3, 91.7, 125.8, 93.0, 125.1, 95.6, 117.7, 121.4, +114.4, 143.8, 101.2, 144.6, 125.1, 95.6, 124.6, 96.2, 129.7, 98.4, +131.9, 102.5, 136.9, 115.6, 133.5, 119.1, 142.6, 128.4, 137.9, 130.9, +134.7, 129.7, 133.2, 133.5, 117.6, 142.0, 118.6, 144.8, 102.0, 150.6, +102.6, 150.4, 100.2, 147.0, 101.2, 144.6, 114.4, 143.8, 117.7, 121.4, +125.1, 95.6, 117.6, 87.9, 113.0, 83.2, 110.8, 77.7, 108.5, 78.6, +120.5, 62.4, 130.6, 63.5, 132.6, 46.2, 136.3, 47.5, 137.3, 46.4, +140.0, 48.9, 141.8, 49.5, 141.8, 49.5, 143.5, 50.2, 158.4, 55.7, +158.7, 55.1, 173.3, 61.2, 173.1, 61.1, 172.9, 61.9, 172.3, 62.2, +145.1, 75.3, 146.4, 80.5, 117.6, 87.9, 172.3, 62.2, 164.6, 64.4, +165.9, 69.1, 159.4, 76.0, 146.4, 90.0, 147.1, 90.7, 133.3, 103.9, +132.6, 103.2, 132.2, 103.4, 131.9, 102.5, 129.7, 98.4, 124.6, 96.2, +125.1, 95.6, 125.8, 93.0, 121.3, 91.7, 117.6, 87.9, 146.4, 80.5, +145.1, 75.3, 172.3, 62.2, 135.1, 105.7, 134.2, 104.8, 134.2, 104.8, +133.3, 103.9, 147.1, 90.7, 146.4, 90.0, 159.4, 76.0, 160.9, 77.5, +148.2, 91.7, 135.1, 105.7, 143.5, 50.2, 141.8, 49.5, 141.8, 49.5, +140.0, 48.9, 132.1, 41.6, 132.0, 40.2, 122.0, 36.6, 158.4, 27.2, +158.4, 27.2, 194.7, 17.8, 195.2, 17.7, 195.2, 17.7, 195.7, 17.5, +195.6, 18.0, 195.1, 17.9, 194.6, 18.2, 169.0, 34.2, 169.7, 35.4, +143.5, 50.2, 210.8, 66.8, 207.8, 66.4, 207.8, 66.4, 204.7, 66.0, +205.6, 39.5, 199.5, 33.8, 212.6, 13.1, 227.9, 9.2, 227.9, 9.2, +243.2, 5.2, 235.9, 15.3, 241.7, 19.5, 240.1, 33.8, 230.1, 52.8, +227.1, 52.1, 210.8, 66.8, 240.1, 33.8, 239.6, 38.3, 241.4, 39.6, +239.1, 42.7, 234.1, 55.0, 237.6, 56.4, 236.1, 70.1, 225.0, 65.1, +223.5, 68.4, 210.8, 66.8, 227.1, 52.1, 230.1, 52.8, 240.1, 33.8, +169.9, 145.9, 171.0, 158.5, 171.0, 158.5, 172.1, 171.1, 170.6, 173.2, +170.5, 173.8, 170.7, 176.4, 169.6, 178.8, 169.5, 178.8, 167.7, 180.7, +135.3, 199.1, 139.8, 207.9, 113.9, 236.9, 114.0, 236.7, 113.7, 236.5, +113.8, 236.3, 141.7, 191.0, 135.0, 185.0, 169.9, 145.9, 142.6, 822.9, +142.5, 811.8, 142.5, 811.8, 142.5, 800.7, 139.1, 739.4, 143.1, 739.2, +143.6, 677.7, 143.1, 739.2, 139.1, 739.4, 142.5, 800.7, 142.5, 811.8, +142.5, 811.8, 142.6, 822.9, 100.4, 664.5, 99.7, 666.1, 98.9, 666.1, +99.0, 667.8, 96.8, 655.3, 96.8, 655.3, 94.7, 642.9, 94.4, 641.6, +94.8, 641.5, 95.0, 640.0, 94.9, 629.7, 97.5, 629.7, 100.1, 619.4, +104.9, 640.9, 100.9, 641.9, 100.4, 664.5, 107.3, 369.1, 122.8, 412.0, +109.9, 423.8, 138.4, 454.9, 138.8, 458.8, 138.1, 459.0, 139.2, 462.7, +139.3, 461.7, 138.0, 461.7, 137.6, 460.5, 133.2, 448.6, 133.6, 448.4, +129.6, 436.3, 118.4, 402.7, 122.3, 400.9, 107.3, 369.1, 38.1, 318.9, +37.1, 313.2, 37.1, 313.2, 36.1, 307.5, 41.0, 287.6, 38.8, 286.4, +37.6, 265.6, 36.7, 258.7, 37.8, 258.5, 38.1, 251.5, 37.7, 250.5, +55.0, 249.8, 60.9, 240.9, 64.0, 249.4, 64.0, 249.4, 67.0, 257.9, +67.4, 260.4, 65.7, 260.7, 64.4, 263.4, 62.8, 266.8, 62.8, 266.8, +61.2, 270.1, 49.7, 294.5, 53.0, 296.7, 38.1, 318.9, 75.3, 375.5, +75.1, 375.7, 76.4, 376.3, 76.5, 377.0, 76.7, 393.4, 76.1, 393.5, +75.8, 409.9, 69.3, 428.3, 72.7, 430.8, 75.1, 451.0, 74.5, 479.7, +74.5, 479.7, 74.0, 508.4, 74.0, 509.4, 73.7, 509.4, 73.9, 510.3, +72.6, 499.3, 71.7, 499.4, 69.5, 488.4, 64.4, 448.5, 62.0, 448.8, +54.6, 409.2, 55.5, 391.8, 64.2, 391.8, 75.3, 375.5, 54.6, 409.2, +49.6, 382.7, 49.8, 382.7, 44.6, 356.3, 44.4, 354.9, 44.9, 354.0, +44.2, 353.6, 59.7, 362.8, 59.2, 363.6, 74.1, 373.8, 74.2, 373.9, +74.1, 374.0, 74.3, 374.1, 74.8, 374.8, 75.5, 375.2, 75.3, 375.5, +64.2, 391.8, 55.5, 391.8, 54.6, 409.2, 124.4, 503.4, 112.1, 498.8, +111.2, 494.5, 104.4, 482.2, 106.0, 456.0, 93.7, 455.2, 83.1, 428.3, +106.5, 437.0, 99.0, 457.2, 114.9, 486.1, 119.6, 494.7, 117.4, 500.8, +124.4, 503.4, 81.3, 457.6, 92.8, 469.9, 105.1, 470.7, 104.4, 482.2, +111.2, 494.5, 112.1, 498.8, 124.4, 503.4, 124.6, 503.6, 124.8, 503.8, +124.8, 503.8, 118.5, 510.7, 114.8, 518.5, 111.8, 517.1, 102.1, 512.9, +105.6, 505.0, 99.3, 492.8, 90.3, 475.2, 76.1, 468.4, 81.3, 457.6, +96.7, 598.9, 93.4, 608.1, 90.6, 608.0, 90.2, 617.3, 87.2, 600.2, +88.1, 600.0, 84.2, 583.1, 83.7, 575.4, 82.9, 575.5, 81.6, 567.8, +92.0, 581.1, 93.8, 582.6, 96.7, 598.9, 10.2, 469.4, 10.1, 481.1, +10.1, 481.1, 9.9, 492.8, -6.0, 452.8, -7.8, 453.5, -25.5, 414.1, +-25.9, 441.5, -3.1, 439.7, 10.2, 469.4, 22.9, 401.7, 23.1, 435.6, +23.1, 435.6, 23.2, 469.6, 10.5, 436.0, 8.9, 436.6, -5.3, 403.6, +-5.3, 402.7, 21.1, 397.3, 22.9, 401.7, 16.6, 341.0, 16.6, 347.1, +16.6, 347.1, 16.7, 353.2, 12.1, 349.8, 1.7, 353.8, 1.7, 354.3, +-2.9, 353.3, -5.9, 347.4, -6.7, 348.2, 1.5, 340.8, 6.2, 338.8, +16.6, 341.0, 41.7, 339.3, 42.9, 346.4, 40.0, 349.1, 44.2, 353.6, +44.9, 354.0, 44.4, 354.9, 44.6, 356.3, 46.6, 366.3, 46.4, 366.3, +48.2, 376.4, 36.8, 416.2, 34.9, 416.1, 28.1, 456.8, 27.0, 439.3, +27.0, 439.3, 25.8, 421.8, 20.2, 411.2, 26.2, 408.0, 26.7, 394.2, +26.7, 393.2, 26.7, 393.2, 26.8, 392.2, 34.0, 365.7, 30.5, 364.1, +41.7, 339.3, 26.8, 392.2, 28.7, 347.1, 29.3, 347.1, 30.7, 302.0, +30.7, 301.8, 30.7, 301.8, 30.7, 301.5, 32.8, 313.5, 34.8, 313.2, +39.1, 324.7, 39.4, 325.6, 39.3, 325.6, 39.5, 326.5, 43.2, 329.6, +40.6, 332.9, 41.7, 339.3, 30.5, 364.1, 34.0, 365.7, 26.8, 392.2, +55.9, 700.7, 49.6, 692.7, 49.6, 692.7, 43.3, 684.7, 51.2, 675.0, +40.9, 659.4, 28.8, 640.3, 35.6, 641.6, 35.6, 641.6, 42.5, 643.0, +49.8, 654.0, 45.7, 656.7, 48.9, 670.5, 49.3, 672.3, 49.3, 672.3, +49.7, 674.1, 52.8, 687.4, 61.0, 692.4, 55.9, 700.7, 782.5, 583.1, +784.1, 591.8, 781.5, 601.4, 777.5, 602.0, 768.9, 594.4, 768.9, 594.4, +760.4, 586.8, 759.7, 586.2, 760.7, 585.0, 760.1, 584.4, 759.3, 578.0, +759.3, 578.0, 758.5, 571.7, 756.7, 556.1, 756.7, 556.1, 754.8, 540.6, +751.3, 539.8, 756.0, 528.8, 752.2, 518.9, 751.4, 512.5, 751.4, 512.5, +750.7, 506.1, 750.4, 503.8, 751.0, 503.5, 750.1, 501.5, 758.6, 521.0, +758.0, 521.3, 765.8, 541.1, 774.1, 562.1, 778.3, 561.3, 782.5, 583.1, +797.6, 609.5, 797.4, 609.5, 797.2, 611.1, 796.8, 612.7, 796.7, 613.2, +796.7, 613.2, 796.5, 613.7, 796.0, 615.9, 795.4, 618.0, 795.5, 618.0, +792.8, 613.9, 791.7, 614.6, 787.9, 611.3, 788.4, 609.3, 793.0, 608.8, +797.6, 609.5, 741.2, 516.5, 748.0, 528.5, 745.8, 538.6, 754.8, 540.6, +756.7, 556.1, 756.7, 556.1, 758.5, 571.7, 744.7, 547.0, 744.6, 544.7, +741.2, 516.5, 712.4, 429.4, 728.2, 440.2, 728.2, 440.2, 744.0, 451.0, +747.0, 452.1, 744.9, 457.9, 745.7, 464.8, 726.1, 451.4, 714.7, 448.8, +712.4, 429.4, 790.4, 654.6, 788.9, 653.1, 787.0, 652.4, 787.3, 651.6, +788.2, 647.9, 787.8, 644.4, 789.1, 644.2, 795.2, 639.9, 791.5, 634.7, +793.8, 625.1, 795.5, 639.4, 793.9, 640.3, 790.4, 654.6, 864.8, 595.8, +886.2, 616.7, 887.3, 615.6, 907.5, 637.7, 906.2, 638.7, 906.2, 638.7, +904.9, 639.8, 903.8, 641.2, 900.4, 638.7, 895.8, 637.6, 878.7, 618.8, +880.6, 617.1, 865.4, 596.6, 865.0, 596.2, 865.1, 596.1, 864.8, 595.8, +867.3, 550.9, 874.2, 547.6, 877.6, 549.8, 881.1, 544.3, 882.5, 544.0, +882.9, 545.5, 884.7, 546.7, 889.0, 549.7, 889.0, 549.7, 893.3, 552.6, +894.4, 554.0, 894.9, 553.7, 896.4, 554.7, 898.2, 559.5, 897.2, 559.8, +897.9, 564.9, 897.9, 565.1, 897.9, 565.1, 897.9, 565.3, 887.3, 560.5, +887.4, 560.3, 876.8, 555.4, 872.1, 553.1, 867.2, 551.2, 867.3, 550.9, +944.3, 587.3, 944.5, 587.5, 944.7, 587.5, 944.7, 587.6, 944.5, 594.2, +941.1, 599.0, 944.0, 600.9, 941.0, 598.8, 944.0, 594.1, 944.3, 587.3, +699.3, 568.1, 694.8, 574.1, 694.8, 574.1, 690.4, 580.0, 689.6, 578.7, +683.9, 579.2, 682.0, 581.7, 676.7, 578.5, 678.1, 576.1, 674.6, 570.2, +674.6, 570.3, 674.8, 570.2, 675.1, 570.2, 678.1, 569.9, 678.1, 569.9, +681.0, 569.7, 683.3, 569.5, 683.3, 569.5, 685.5, 569.3, 689.4, 569.0, +689.4, 569.0, 693.3, 568.6, 696.3, 568.4, 699.0, 569.1, 699.3, 568.1, +902.2, 454.4, 901.6, 452.4, 906.3, 450.0, 905.6, 449.0, 911.4, 456.8, +909.0, 458.6, 912.4, 468.1, 913.8, 472.2, 916.2, 472.8, 915.3, 476.2, +915.9, 473.9, 913.5, 473.3, 911.8, 470.4, 907.0, 462.4, 904.7, 463.1, +902.2, 454.4, 904.5, 446.0, 904.0, 446.7, 905.9, 447.7, 905.6, 449.0, +906.3, 450.0, 901.6, 452.4, 902.2, 454.4, 895.7, 464.8, 895.7, 464.8, +889.2, 475.3, 886.7, 479.4, 886.2, 479.1, 884.2, 483.4, 888.4, 474.4, +888.9, 474.6, 893.7, 465.8, 899.1, 455.9, 898.0, 455.1, 904.5, 446.0, +928.2, 451.2, 930.0, 463.3, 930.9, 463.2, 931.8, 475.4, 932.5, 482.0, +932.5, 482.0, 933.3, 488.7, 930.5, 470.0, 930.2, 470.0, 928.2, 451.2, +903.2, 344.7, 903.5, 345.5, 903.5, 345.5, 903.7, 346.4, 890.9, 348.1, +892.3, 365.7, 883.1, 385.9, 878.4, 386.3, 876.6, 367.7, 870.1, 349.6, +868.2, 335.8, 865.3, 336.2, 860.5, 322.8, 870.9, 319.1, 869.6, 315.5, +878.7, 308.3, 895.8, 317.0, 891.2, 326.3, 903.2, 344.7, 878.7, 308.3, +884.3, 303.7, 887.6, 305.1, 890.0, 299.2, 896.6, 321.9, 896.6, 321.9, +903.2, 344.7, 891.2, 326.3, 895.8, 317.0, 878.7, 308.3, 881.9, 476.0, +884.0, 479.6, 882.6, 480.5, 883.2, 484.9, 883.7, 488.2, 882.5, 489.1, +884.2, 491.5, 852.8, 448.7, 850.1, 450.0, 823.9, 404.0, 822.2, 402.7, +825.8, 398.3, 827.8, 392.5, 836.4, 396.3, 833.9, 401.9, 840.0, 411.3, +860.9, 443.7, 862.4, 442.8, 881.9, 476.0, 818.3, 452.4, 792.2, 417.7, +787.3, 419.8, 768.3, 381.2, 774.6, 378.8, 775.0, 379.5, 781.0, 376.4, +782.5, 375.6, 782.6, 375.8, 784.2, 375.2, 788.2, 380.2, 786.9, 381.2, +789.5, 387.2, 790.0, 388.3, 790.0, 388.3, 790.5, 389.3, 801.8, 415.0, +801.8, 415.0, 813.2, 440.7, 815.7, 446.5, 814.6, 447.4, 818.3, 452.4, +466.5, 128.1, 478.5, 122.4, 479.7, 123.8, 493.2, 122.4, 500.4, 125.4, +501.4, 123.1, 509.6, 123.7, 499.2, 128.7, 497.4, 124.9, 485.3, 126.2, +475.9, 127.1, 474.5, 124.3, 466.5, 128.1, 585.0, 128.1, 613.5, 142.1, +613.5, 142.1, 641.9, 156.2, 676.6, 173.2, 676.6, 173.2, 711.3, 190.3, +757.7, 213.1, 757.7, 213.1, 804.0, 236.0, 817.2, 242.5, 818.0, 241.3, +830.4, 249.0, 854.6, 265.6, 854.6, 265.6, 878.8, 282.3, 875.3, 279.8, +874.9, 280.3, 871.1, 278.3, 836.2, 260.0, 836.2, 260.0, 801.3, 241.7, +762.4, 221.2, 762.4, 221.2, 723.5, 200.8, 706.2, 191.7, 706.2, 191.7, +689.0, 182.7, 673.1, 174.3, 673.1, 174.3, 657.2, 166.0, 632.0, 152.8, +632.0, 152.8, 606.8, 139.6, 596.9, 134.4, 596.9, 134.4, 587.0, 129.2, +586.0, 128.7, 586.0, 128.6, 585.0, 128.1, 641.9, 156.2, 613.0, 150.9, +614.5, 142.7, 587.0, 129.2, 586.0, 128.7, 586.0, 128.6, 585.0, 128.1, +580.8, 126.0, 580.8, 126.0, 576.5, 124.0, 566.5, 119.0, 565.8, 120.1, +556.4, 114.1, 555.2, 111.7, 555.5, 109.5, 554.1, 109.4, 561.4, 107.8, +561.4, 107.8, 568.7, 106.2, 569.6, 106.1, 569.7, 106.9, 570.7, 107.6, +589.3, 120.3, 589.3, 120.3, 607.9, 133.0, 624.9, 144.6, 623.4, 152.8, +641.9, 156.2, 590.7, 210.4, 578.2, 197.1, 578.8, 196.4, 565.6, 183.9, +548.2, 162.6, 553.1, 149.7, 530.8, 141.2, 526.6, 134.1, 522.8, 135.7, +520.2, 128.3, 518.5, 126.3, 518.5, 126.3, 516.9, 124.3, 517.6, 122.8, +515.0, 119.1, 512.1, 118.4, 514.9, 117.8, 514.9, 117.8, 517.7, 117.1, +543.3, 151.0, 550.0, 147.0, 585.7, 172.0, 592.1, 178.0, 592.9, 180.0, +594.1, 188.7, 595.5, 199.2, 590.6, 210.4, 590.7, 210.4, 594.1, 188.7, +611.0, 203.2, 605.0, 210.3, 615.8, 231.9, 618.6, 237.3, 617.0, 239.1, +621.3, 242.7, 607.9, 225.1, 606.0, 226.5, 590.7, 210.4, 590.6, 210.4, +595.5, 199.2, 594.1, 188.7, 639.5, 294.1, 653.6, 308.4, 653.1, 308.9, +667.7, 322.6, 668.5, 315.8, 652.9, 313.9, 638.2, 305.2, 631.6, 301.3, +631.6, 301.3, 625.1, 297.5, 617.2, 292.8, 617.2, 292.8, 609.4, 288.2, +606.9, 286.8, 606.9, 286.8, 604.4, 285.3, 563.4, 261.1, 563.4, 261.1, +522.4, 236.9, 515.1, 232.6, 515.4, 231.9, 507.7, 228.3, 542.5, 244.8, +542.1, 245.5, 576.5, 262.7, 583.2, 266.0, 583.2, 266.0, 589.9, 269.3, +614.7, 281.7, 616.9, 278.6, 639.5, 294.1, 645.5, 326.8, 643.2, 325.5, +644.4, 323.5, 643.3, 320.2, 640.7, 312.7, 641.4, 305.5, 638.2, 305.2, +652.9, 313.9, 668.5, 315.8, 667.7, 322.6, 670.3, 325.0, 671.5, 323.8, +674.0, 326.3, 678.1, 330.1, 680.1, 328.1, 683.8, 332.1, 690.2, 338.1, +692.1, 336.9, 696.7, 344.0, 707.9, 354.5, 705.9, 360.5, 719.2, 365.0, +680.3, 351.9, 681.2, 347.8, 645.5, 326.8, 719.2, 365.0, 720.8, 365.9, +721.7, 367.9, 722.0, 367.6, 711.7, 372.6, 711.7, 372.6, 701.4, 377.5, +691.7, 348.8, 673.6, 331.1, 647.2, 331.9, 645.5, 330.3, 647.2, 327.6, +645.5, 326.8, 681.2, 347.8, 680.3, 351.9, 719.2, 365.0, 557.8, 293.0, +554.0, 281.8, 548.5, 283.7, 539.3, 274.3, 538.9, 273.8, 538.9, 273.7, +538.5, 273.3, 507.0, 241.3, 500.5, 245.8, 475.5, 209.3, 485.1, 223.3, +491.6, 218.8, 507.7, 228.3, 515.4, 231.9, 515.1, 232.6, 522.4, 236.9, +528.3, 242.6, 526.9, 244.1, 531.4, 251.2, 544.6, 272.1, 550.1, 270.2, +557.8, 293.0, 642.2, 378.7, 633.8, 370.2, 634.8, 368.9, 625.4, 361.6, +617.9, 362.6, 616.6, 352.7, 607.8, 343.7, 603.3, 334.3, 607.1, 332.5, +606.5, 321.3, 605.9, 310.6, 602.1, 301.3, 605.3, 300.0, 605.8, 299.8, +609.5, 309.1, 613.8, 318.3, 628.0, 348.5, 633.7, 347.0, 642.2, 378.7, +539.3, 274.3, 568.9, 309.5, 571.0, 308.0, 598.4, 345.0, 592.2, 341.2, +592.2, 341.2, 586.0, 337.3, 562.7, 309.6, 564.4, 308.2, 542.8, 279.0, +542.2, 278.3, 542.2, 278.2, 541.6, 277.4, 540.5, 275.8, 540.5, 275.8, +539.3, 274.3, 752.7, 51.9, 761.8, 53.9, 768.8, 63.8, 769.2, 63.4, +761.8, 72.8, 753.9, 66.6, 738.7, 69.9, 734.5, 70.8, 731.7, 69.2, +730.2, 71.7, 735.2, 63.3, 738.0, 64.9, 745.7, 58.1, 749.2, 55.0, +750.0, 51.3, 752.7, 51.9, 646.9, 36.3, 643.1, 40.5, 643.9, 42.0, +639.3, 44.6, 605.0, 68.1, 605.0, 68.1, 570.6, 91.6, 571.5, 91.2, +568.6, 86.9, 569.6, 86.2, 606.8, 59.2, 607.4, 59.9, 646.9, 36.3, +570.6, -20.1, 571.5, -18.3, 569.8, -17.4, 568.9, -14.7, 563.3, 3.6, +558.4, 22.2, 557.7, 22.0, 548.9, 19.7, 553.8, 1.1, 549.9, -19.7, +557.9, -30.8, 554.3, -47.9, 542.7, -58.6, 542.5, -60.0, 545.4, -61.3, +545.1, -61.8, 559.4, -42.1, 559.6, -41.9, 570.6, -20.1, 545.1, -61.8, +544.5, -62.9, 546.5, -63.9, 548.0, -65.9, 548.5, -66.6, 548.5, -66.6, +549.1, -67.4, 551.3, -70.5, 551.3, -70.5, 553.5, -73.6, 555.1, -74.3, +554.4, -76.4, 555.8, -76.8, 573.0, -82.6, 573.8, -87.4, 590.9, -86.2, +589.5, -86.3, 589.1, -80.4, 587.3, -74.6, 582.2, -57.8, 582.2, -57.8, +577.0, -41.0, 573.8, -30.5, 568.1, -21.8, 570.6, -20.1, 559.6, -41.9, +559.4, -42.1, 545.1, -61.8, 372.6, 57.9, 363.0, 19.9, 364.2, 19.6, +353.5, -18.0, 364.4, -22.7, 397.1, 8.3, 406.0, 43.4, 406.7, 46.2, +376.1, 61.9, 372.6, 57.9, 413.0, -8.1, 406.0, -8.8, 406.1, -14.5, +400.1, -21.7, 400.6, -21.2, 401.0, -21.6, 402.0, -21.5, 407.8, -20.9, +407.8, -20.9, 413.6, -20.3, 432.0, -18.4, 432.0, -18.4, 450.5, -16.5, +460.8, -15.4, 461.5, -12.2, 471.0, -14.3, 442.7, -8.0, 441.4, -5.2, +413.0, -8.1, 376.9, -24.1, 383.0, -17.7, 390.0, -26.2, 400.1, -21.7, +406.1, -14.5, 406.0, -8.8, 413.0, -8.1, 426.1, 5.7, 426.1, 5.7, +439.2, 19.5, 452.4, 33.4, 452.6, 33.3, 465.6, 47.3, 464.7, 46.3, +464.5, 46.4, 463.4, 45.6, 462.7, 45.0, 462.7, 45.0, 462.0, 44.4, +419.5, 10.2, 413.9, 15.4, 376.9, -24.1, 543.4, -71.1, 548.5, -72.3, +548.9, -71.4, 553.5, -73.6, 551.3, -70.5, 551.3, -70.5, 549.1, -67.4, +546.8, -66.8, 543.5, -71.2, 543.4, -71.1, 198.8, 306.6, 206.3, 283.4, +210.0, 283.9, 213.8, 260.1, 214.4, 260.4, 214.8, 260.9, 215.0, 260.7, +220.4, 263.4, 226.1, 264.6, 225.8, 266.0, 222.7, 280.5, 217.0, 279.3, +208.2, 292.5, 203.5, 299.5, 200.1, 299.0, 198.8, 306.6, 147.1, 478.3, +146.6, 474.8, 146.6, 474.8, 146.2, 471.3, 146.7, 466.2, 147.4, 466.2, +149.0, 461.3, 169.4, 397.4, 166.0, 396.1, 190.1, 333.6, 191.7, 329.4, +197.8, 326.4, 200.5, 328.0, 201.3, 328.4, 198.8, 332.8, 197.1, 337.6, +193.8, 346.9, 193.8, 346.9, 190.4, 356.3, 186.4, 367.7, 186.4, 367.7, +182.4, 379.0, 167.7, 420.4, 167.8, 420.5, 153.1, 461.8, 153.0, 462.3, +152.8, 462.2, 152.7, 462.6, 150.9, 467.6, 150.9, 467.6, 149.2, 472.6, +148.1, 475.5, 146.9, 478.2, 147.1, 478.3, 154.3, 442.2, 152.4, 449.0, +150.5, 455.9, 150.5, 455.9, 149.7, 458.6, 149.0, 461.3, 149.0, 461.3, +147.4, 466.2, 146.7, 466.2, 146.2, 471.3, 144.2, 457.2, 144.2, 457.2, +142.3, 443.2, 144.3, 393.2, 143.9, 393.2, 145.6, 343.2, 145.5, 345.7, +145.8, 345.7, 146.0, 348.1, 147.8, 368.2, 147.8, 368.2, 149.5, 388.3, +149.9, 392.5, 149.9, 392.5, 150.3, 396.7, 152.3, 419.4, 154.2, 419.4, +154.3, 442.2, 179.6, 252.5, 179.3, 254.6, 178.6, 254.5, 177.5, 256.5, +176.7, 258.1, 176.2, 259.8, 175.9, 259.7, 165.2, 256.7, 165.2, 255.9, +155.5, 250.4, 156.0, 249.5, 156.0, 249.5, 156.5, 248.6, 168.7, 225.0, +162.9, 207.3, 180.9, 201.5, 174.6, 203.5, 180.4, 221.2, 179.9, 241.0, +179.8, 246.7, 180.5, 246.8, 179.6, 252.5, 158.1, 293.8, 157.1, 294.1, +157.4, 294.9, 156.8, 296.1, 151.6, 306.0, 151.6, 306.0, 146.4, 316.0, +133.8, 320.3, 129.9, 332.1, 129.3, 348.8, 126.7, 329.9, 126.7, 329.9, +124.1, 311.0, 124.0, 309.1, 124.5, 307.9, 126.2, 307.0, 141.5, 299.2, +141.8, 299.5, 158.1, 293.8, 126.2, 307.0, 128.3, 307.6, 131.2, 297.3, +136.3, 287.5, 137.6, 285.0, 137.6, 285.0, 138.9, 282.6, 138.9, 282.6, +147.2, 266.5, 155.5, 250.4, 165.2, 255.9, 165.2, 256.7, 175.9, 259.7, +178.1, 263.9, 172.0, 267.1, 168.1, 274.5, 163.1, 284.1, 165.8, 287.7, +158.1, 293.8, 141.8, 299.5, 141.5, 299.2, 126.2, 307.0, 136.3, 287.5, +131.2, 297.3, 128.3, 307.6, 126.2, 307.0, 124.5, 307.9, 124.0, 309.1, +124.1, 311.0, 121.5, 292.0, 120.5, 292.1, 118.9, 272.9, 118.7, 271.9, +118.7, 271.9, 118.6, 270.9, 117.5, 263.1, 114.0, 261.7, 116.4, 255.3, +129.2, 247.8, 136.6, 240.3, 134.9, 228.4, 137.5, 226.5, 136.8, 225.6, +138.8, 222.8, 141.1, 225.7, 138.6, 227.7, 138.4, 232.7, 137.5, 255.7, +137.5, 255.7, 136.6, 278.7, 136.5, 283.1, 137.7, 283.6, 136.3, 287.5, +467.1, 684.1, 471.3, 693.5, 468.6, 699.9, 475.5, 702.9, 476.7, 715.9, +476.8, 715.9, 478.0, 728.9, 480.1, 750.5, 480.0, 750.5, 482.0, 772.1, +482.3, 775.1, 482.3, 775.1, 482.5, 778.1, 483.9, 793.3, 485.3, 808.6, +485.3, 808.6, 486.4, 819.9, 486.4, 819.9, 487.4, 831.1, 488.3, 840.2, +487.8, 840.3, 489.1, 849.3, 483.2, 808.5, 483.6, 808.5, 478.2, 767.6, +477.9, 765.3, 477.9, 765.2, 477.6, 762.9, 474.2, 737.2, 474.2, 737.2, +470.8, 711.5, 469.0, 697.8, 461.8, 693.8, 467.1, 684.1, 537.5, 359.8, +537.4, 359.8, 528.4, 376.3, 519.2, 392.8, 519.7, 404.5, 512.2, 404.8, +505.5, 416.9, 507.3, 414.7, 505.3, 413.0, 505.1, 409.1, 504.5, 396.8, +498.4, 392.8, 503.9, 384.4, 514.7, 368.1, 529.8, 355.6, 537.5, 359.8, +503.9, 384.4, 505.6, 383.9, 503.6, 377.8, 503.3, 371.1, 503.1, 368.1, +503.1, 368.1, 503.0, 365.1, 501.6, 337.8, 501.6, 337.8, 500.3, 310.6, +500.0, 303.7, 503.1, 301.2, 499.6, 296.9, 519.1, 327.4, 519.1, 327.4, +538.6, 357.9, 538.9, 358.3, 538.4, 359.2, 537.5, 359.8, 529.8, 355.6, +514.7, 368.1, 503.9, 384.4, 481.0, 448.9, 480.0, 450.8, 484.4, 452.5, +484.1, 455.6, 483.6, 460.0, 481.8, 459.8, 479.4, 464.0, 471.6, 478.1, +471.6, 478.1, 463.8, 492.1, 463.8, 493.9, 462.7, 493.9, 461.7, 495.7, +471.1, 472.2, 468.8, 470.9, 481.0, 448.9, 505.1, 409.1, 505.3, 413.0, +507.3, 414.7, 505.5, 416.9, 505.4, 417.0, 505.6, 417.1, 505.5, 417.3, +495.2, 435.9, 495.2, 435.8, 484.8, 454.4, 484.4, 455.0, 483.9, 455.4, +484.1, 455.6, 484.4, 452.5, 480.0, 450.8, 481.0, 448.9, 480.5, 447.8, +480.5, 447.8, 480.0, 446.7, 467.1, 418.0, 463.1, 419.2, 454.1, 389.4, +455.0, 392.5, 459.0, 391.3, 463.9, 393.2, 484.5, 401.1, 486.1, 398.3, +505.1, 409.1, 180.9, 723.4, 179.3, 711.9, 179.3, 711.9, 177.7, 700.4, +188.2, 671.9, 189.3, 670.2, 209.1, 647.2, 209.0, 655.4, 209.2, 655.4, +209.3, 663.7, 208.7, 667.8, 207.4, 667.6, 205.6, 671.5, 199.2, 685.0, +199.2, 685.0, 192.8, 698.4, 186.8, 710.9, 188.3, 722.5, 180.9, 723.4, +157.5, 553.7, 156.8, 548.2, 156.8, 548.2, 156.0, 542.8, 152.2, 536.9, +159.6, 532.1, 163.3, 521.4, 165.9, 522.6, 161.2, 532.8, 159.2, 544.2, +158.4, 549.0, 156.4, 553.2, 157.5, 553.7, 209.5, 646.5, 209.3, 646.8, +209.1, 646.8, 209.1, 647.2, 189.3, 670.2, 188.2, 671.9, 177.7, 700.4, +176.4, 690.9, 177.5, 690.6, 175.1, 681.5, 173.8, 677.2, 174.5, 677.0, +173.9, 672.6, 177.4, 657.8, 178.9, 658.2, 184.0, 643.8, 187.0, 635.3, +187.0, 635.3, 189.9, 626.9, 194.9, 612.9, 204.3, 603.4, 199.8, 598.9, +214.1, 613.2, 204.9, 622.6, 209.5, 646.5, 199.8, 598.9, 204.3, 563.1, +235.1, 554.2, 224.3, 529.2, 218.6, 582.4, 217.8, 582.5, 215.7, 636.0, +212.6, 641.2, 212.6, 641.2, 209.5, 646.5, 204.9, 622.6, 214.1, 613.2, +199.8, 598.9, 464.9, 784.3, 465.8, 799.3, 465.8, 799.3, 466.7, 814.3, +464.5, 813.9, 459.0, 846.5, 451.3, 878.7, 452.4, 874.2, 451.9, 874.1, +452.6, 869.4, 453.3, 865.0, 453.3, 865.0, 453.9, 860.5, 457.1, 838.5, +457.1, 838.5, 460.2, 816.6, 462.5, 801.0, 462.5, 801.0, 464.7, 785.5, +464.8, 784.9, 464.9, 784.9, 464.9, 784.3, 387.9, 282.3, 363.9, 266.8, +367.7, 256.8, 355.0, 227.9, 354.1, 225.8, 357.9, 224.1, 360.7, 220.3, +361.3, 219.5, 361.3, 219.5, 361.9, 218.8, 364.7, 215.0, 364.7, 215.0, +367.6, 211.2, 372.2, 205.9, 371.9, 205.6, 376.1, 199.9, 376.0, 199.9, +376.8, 204.7, 377.5, 209.4, 377.6, 210.3, 377.6, 210.3, 377.8, 211.3, +380.0, 227.2, 380.0, 227.2, 382.3, 243.1, 382.5, 244.4, 382.5, 244.4, +382.7, 245.8, 385.3, 264.0, 377.8, 275.8, 387.9, 282.3, 136.9, 107.6, +136.0, 106.7, 136.0, 106.7, 135.1, 105.7, 148.2, 91.7, 160.9, 77.5, +159.4, 76.0, 165.9, 69.1, 164.6, 64.4, 172.3, 62.2, 172.9, 61.9, +173.1, 61.1, 173.3, 61.2, 174.9, 61.2, 174.9, 61.8, 176.5, 62.4, +178.2, 59.9, 187.3, 66.3, 198.1, 70.3, 196.4, 70.1, 195.9, 73.5, +193.8, 76.7, 166.2, 93.6, 165.9, 93.3, 136.9, 107.6, 193.8, 76.7, +181.1, 95.5, 173.7, 93.6, 168.4, 114.3, 160.3, 118.7, 160.3, 118.7, +152.1, 123.1, 149.7, 114.0, 144.5, 115.4, 136.9, 107.6, 165.9, 93.3, +166.2, 93.6, 193.8, 76.7, 194.6, 18.2, 195.1, 17.9, 195.6, 18.0, +195.7, 17.5, 204.2, 15.3, 204.2, 15.3, 212.6, 13.1, 199.5, 33.8, +205.6, 39.5, 204.7, 66.0, 203.1, 65.8, 203.1, 65.8, 201.4, 65.6, +196.5, 42.2, 197.4, 42.0, 194.6, 18.2, 201.4, 65.6, 189.0, 64.0, +179.9, 57.6, 176.5, 62.4, 174.9, 61.8, 174.9, 61.2, 173.3, 61.2, +158.7, 55.1, 158.4, 55.7, 143.5, 50.2, 169.7, 35.4, 169.0, 34.2, +194.6, 18.2, 197.4, 42.0, 196.5, 42.2, 201.4, 65.6, 169.5, 141.3, +169.7, 143.6, 169.7, 143.6, 169.9, 145.9, 135.0, 185.0, 141.7, 191.0, +113.8, 236.3, 122.6, 230.0, 103.4, 212.0, 107.5, 190.5, 109.2, 182.0, +116.5, 183.4, 125.4, 176.3, 147.5, 158.8, 146.3, 157.1, 169.5, 141.3, +157.8, 679.7, 171.7, 714.9, 171.3, 715.1, 184.6, 750.6, 184.7, 751.0, +184.6, 751.1, 184.7, 751.5, 185.4, 756.6, 185.4, 756.6, 186.1, 761.7, +175.0, 733.1, 176.1, 732.7, 166.1, 703.6, 162.0, 691.7, 162.5, 691.5, +157.8, 679.7, 120.7, 617.0, 117.1, 625.4, 113.4, 625.4, 113.5, 633.8, +118.6, 641.1, 107.0, 649.1, 100.4, 664.5, 100.9, 641.9, 104.9, 640.9, +100.1, 619.4, 102.4, 610.2, 102.4, 610.2, 104.7, 601.1, 126.7, 560.0, +129.0, 559.9, 141.9, 515.4, 141.9, 517.7, 141.9, 517.7, 141.9, 520.0, +131.8, 568.6, 132.7, 568.8, 120.7, 617.0, 141.9, 520.0, 142.0, 543.5, +142.0, 543.5, 142.0, 567.0, 142.1, 567.7, 141.4, 567.7, 141.4, 568.5, +144.0, 585.9, 125.7, 587.3, 125.1, 606.5, 126.2, 611.0, 122.9, 611.8, +120.7, 617.0, 132.7, 568.8, 131.8, 568.6, 141.9, 520.0, 69.2, 152.0, +67.3, 142.3, 67.1, 140.6, 70.8, 131.7, 69.4, 135.0, 72.3, 136.2, +73.9, 140.7, 79.7, 157.5, 83.2, 157.1, 85.5, 174.4, 84.6, 167.9, +81.1, 168.4, 76.7, 162.3, 73.0, 157.2, 70.3, 157.7, 69.2, 152.0, +67.4, 174.6, 67.4, 174.8, 67.4, 174.8, 67.4, 175.0, 67.2, 178.0, +67.2, 178.0, 66.9, 181.0, 64.6, 210.9, 69.8, 212.3, 62.3, 240.9, +58.8, 233.2, 59.1, 225.6, 55.3, 225.4, 53.3, 220.0, 53.3, 220.0, +51.4, 214.6, 54.3, 199.5, 57.2, 200.1, 63.0, 185.6, 63.0, 185.5, +63.0, 185.5, 63.0, 185.5, 65.2, 180.0, 65.2, 180.0, 67.4, 174.6, +55.5, 87.2, 51.3, 86.0, 53.0, 79.9, 50.5, 72.6, 49.1, 68.4, +49.1, 68.4, 47.6, 64.1, 47.2, 62.9, 46.6, 62.8, 46.8, 61.7, +47.1, 58.6, 46.5, 57.3, 48.5, 55.6, 51.1, 57.0, 52.5, 54.8, +56.4, 53.5, 71.2, 48.0, 71.7, 49.5, 87.1, 45.6, 87.3, 45.5, +87.3, 45.5, 87.6, 45.5, 84.6, 48.1, 88.5, 52.6, 89.5, 59.8, +88.8, 71.2, 92.0, 76.9, 85.1, 82.4, 75.0, 90.6, 68.6, 90.9, +55.5, 87.2, 85.1, 82.4, 93.5, 106.7, 82.1, 112.3, 73.9, 140.7, +72.3, 136.2, 69.4, 135.0, 70.8, 131.7, 65.7, 116.8, 65.7, 116.8, +60.6, 101.9, 58.2, 95.1, 58.2, 95.1, 55.9, 88.2, 55.7, 87.7, +55.6, 87.2, 55.5, 87.2, 68.6, 90.9, 75.0, 90.6, 85.1, 82.4, +93.3, 87.3, 94.0, 92.2, 96.3, 96.3, 94.7, 97.2, 92.1, 120.2, +99.2, 144.7, 101.2, 144.6, 100.2, 147.0, 102.6, 150.4, 102.0, 150.6, +104.8, 170.5, 104.8, 170.5, 107.5, 190.5, 103.4, 212.0, 122.6, 230.0, +113.8, 236.3, 113.7, 236.5, 114.0, 236.7, 113.9, 236.9, 113.1, 237.7, +114.8, 240.2, 114.4, 240.4, 111.2, 244.9, 118.9, 253.8, 116.4, 255.3, +114.0, 261.7, 117.5, 263.1, 118.6, 270.9, 119.2, 266.7, 117.0, 266.4, +115.5, 261.9, 104.1, 228.6, 97.0, 229.5, 92.6, 195.2, 85.9, 142.1, +92.2, 141.2, 93.3, 87.3, 92.6, 195.2, 92.7, 191.9, 91.4, 191.9, +90.3, 188.5, 87.9, 181.5, 87.9, 181.5, 85.5, 174.4, 83.2, 157.1, +79.7, 157.5, 73.9, 140.7, 82.1, 112.3, 93.5, 106.7, 85.1, 82.4, +92.0, 76.9, 88.8, 71.2, 89.5, 59.8, 91.4, 73.5, 91.4, 73.5, +93.3, 87.3, 92.2, 141.2, 85.9, 142.1, 92.6, 195.2, 75.0, 344.2, +75.5, 328.2, 75.6, 328.2, 76.0, 312.1, 76.6, 299.7, 83.2, 291.6, +77.7, 287.3, 84.3, 305.5, 84.3, 305.5, 90.8, 323.7, 90.3, 334.3, +75.0, 344.2, 75.0, 344.2, 75.7, 317.2, 73.9, 344.1, 72.8, 344.1, +72.1, 371.0, 66.5, 363.4, 66.5, 363.4, 60.9, 355.8, 62.3, 336.1, +82.3, 326.3, 75.7, 317.2, 114.9, 486.1, 99.0, 457.2, 106.5, 437.0, +83.1, 428.3, 79.5, 419.1, 73.3, 416.9, 75.8, 409.9, 76.1, 393.5, +76.7, 393.4, 76.5, 377.0, 75.7, 380.0, 79.3, 381.0, 82.2, 384.9, +82.6, 385.4, 82.7, 385.3, 82.9, 385.9, 88.9, 404.1, 88.8, 404.2, +94.6, 422.5, 104.7, 454.3, 119.4, 483.8, 114.9, 486.1, 74.0, 508.4, +74.5, 479.7, 74.5, 479.7, 75.1, 451.0, 75.5, 454.7, 78.2, 454.3, +81.3, 457.6, 76.1, 468.4, 90.3, 475.2, 99.3, 492.8, 97.9, 502.2, +73.8, 508.0, 74.0, 508.4, 99.3, 492.8, 105.6, 505.0, 102.1, 512.9, +111.8, 517.1, 106.8, 534.3, 97.8, 531.6, 83.8, 546.1, 81.2, 548.7, +81.6, 549.3, 78.7, 551.4, 78.6, 550.6, 78.8, 550.4, 78.4, 549.9, +76.2, 547.2, 79.2, 544.8, 77.0, 541.9, 71.5, 538.3, 75.4, 532.3, +73.7, 522.7, 72.5, 516.8, 74.7, 516.4, 73.9, 510.3, 73.7, 509.4, +74.0, 509.4, 74.0, 508.4, 73.8, 508.0, 97.9, 502.2, 99.3, 492.8, +115.1, 546.9, 107.5, 568.2, 104.7, 567.6, 100.0, 589.5, 99.8, 594.3, +98.3, 594.2, 96.7, 598.9, 93.8, 582.6, 92.0, 581.1, 81.6, 567.8, +80.6, 562.5, 82.9, 560.1, 79.7, 557.1, 78.0, 556.0, 79.2, 554.2, +78.7, 551.4, 81.6, 549.3, 81.2, 548.7, 83.8, 546.1, 99.1, 544.2, +113.0, 541.4, 115.1, 546.9, 83.8, 546.1, 97.8, 531.6, 106.8, 534.3, +111.8, 517.1, 114.8, 518.5, 118.5, 510.7, 124.8, 503.8, 125.4, 503.4, +128.5, 505.7, 128.8, 508.0, 127.4, 512.0, 127.1, 511.9, 126.0, 515.9, +124.2, 531.8, 120.5, 531.4, 115.1, 546.9, 113.0, 541.4, 99.1, 544.2, +83.8, 546.1, -27.0, 410.9, -28.8, 406.8, -30.4, 406.9, -30.6, 402.7, +-32.6, 389.3, -29.2, 377.4, -34.5, 375.9, -34.7, 373.3, -32.7, 373.0, +-33.2, 370.6, -29.2, 388.7, -30.4, 389.0, -27.5, 407.4, -27.2, 409.2, +-27.8, 409.6, -27.0, 410.9, -22.3, 363.3, -25.0, 355.2, -24.5, 355.0, +-27.6, 347.1, -27.8, 346.5, -27.1, 346.3, -27.3, 345.7, -24.5, 354.4, +-20.5, 355.6, -22.3, 363.3, 2.2, 282.6, 9.2, 297.5, 18.3, 298.8, +16.3, 312.3, 16.4, 326.7, 16.4, 326.7, 16.6, 341.0, 6.2, 338.8, +1.5, 340.8, -6.7, 348.2, -16.5, 346.7, -15.9, 341.8, -24.8, 335.0, +-24.8, 335.0, -24.7, 334.8, -24.7, 334.6, -23.4, 329.3, -23.3, 329.4, +-22.1, 324.1, -11.1, 302.8, -14.7, 287.8, 2.2, 282.6, -22.1, 324.1, +-32.6, 302.0, -22.3, 289.0, -7.1, 263.0, -6.8, 272.9, -2.5, 272.8, +2.2, 282.6, -14.7, 287.8, -11.1, 302.8, -22.1, 324.1, 48.9, 670.5, +45.7, 656.7, 49.8, 654.0, 42.5, 643.0, 47.9, 644.1, 53.2, 643.6, +53.4, 645.1, 59.0, 650.8, 62.8, 647.0, 72.2, 648.9, 70.0, 661.3, +58.1, 672.3, 48.9, 670.5, 749.0, 492.6, 747.0, 491.5, 749.8, 485.2, +748.1, 484.6, 762.9, 499.3, 767.1, 495.1, 786.1, 505.6, 785.1, 497.0, +766.0, 502.0, 749.0, 492.6, 804.0, 583.1, 804.0, 596.3, 804.0, 598.2, +797.6, 609.5, 793.0, 608.8, 788.4, 609.3, 787.9, 611.3, 783.2, 607.1, +780.2, 601.8, 778.4, 602.8, 778.5, 602.6, 778.0, 602.4, 777.5, 602.0, +781.5, 601.4, 784.1, 591.8, 782.5, 583.1, 787.8, 562.4, 787.8, 562.4, +793.2, 541.7, 795.3, 533.5, 799.3, 532.4, 797.4, 525.2, 804.7, 553.1, +803.9, 554.2, 804.0, 583.1, 797.4, 525.2, 797.1, 519.5, 798.1, 513.8, +800.5, 513.5, 808.6, 518.0, 809.9, 516.5, 816.7, 522.4, 817.5, 523.1, +818.2, 523.9, 818.4, 523.8, 815.5, 535.4, 814.9, 535.3, 812.7, 547.1, +810.7, 555.2, 810.7, 555.2, 808.8, 563.4, 806.4, 573.2, 801.5, 574.7, +804.0, 583.1, 803.9, 554.2, 804.7, 553.1, 797.4, 525.2, 713.5, 490.2, +713.2, 490.0, 713.6, 489.3, 713.3, 489.1, 717.8, 492.9, 718.2, 492.3, +723.2, 495.6, 722.6, 492.1, 718.1, 493.2, 713.5, 490.2, 744.7, 514.0, +740.9, 511.5, 738.4, 508.1, 737.1, 509.1, 734.5, 506.4, 735.2, 505.7, +733.3, 502.3, 732.5, 501.9, 732.8, 501.5, 732.3, 500.6, 738.7, 507.1, +740.3, 506.3, 744.7, 514.0, 840.1, 624.8, 859.1, 643.0, 856.0, 656.1, +878.0, 661.2, 875.3, 663.4, 875.3, 663.4, 872.6, 665.6, 862.1, 657.6, +864.1, 655.0, 855.7, 644.3, 849.0, 635.9, 849.0, 635.9, 842.2, 627.4, +841.2, 626.1, 841.3, 625.9, 840.1, 624.8, 839.5, 570.9, 839.5, 570.9, +847.4, 578.7, 855.2, 586.5, 855.4, 586.6, 855.4, 586.6, 855.5, 586.8, +860.1, 591.3, 860.2, 591.2, 864.8, 595.8, 865.1, 596.1, 865.0, 596.2, +865.4, 596.6, 860.4, 591.7, 860.4, 591.7, 855.5, 586.8, 855.4, 586.6, +855.4, 586.6, 855.2, 586.5, 847.4, 578.7, 839.5, 570.9, 839.5, 570.9, +877.5, 603.6, 857.1, 585.8, 857.1, 585.8, 836.7, 568.0, 838.3, 567.7, +839.8, 566.4, 839.6, 565.9, 839.5, 565.7, 842.7, 563.6, 845.9, 561.2, +851.4, 552.7, 856.6, 556.1, 867.3, 550.9, 867.2, 551.2, 872.1, 553.1, +876.8, 555.4, 881.3, 578.7, 884.1, 601.5, 877.5, 603.6, 876.8, 555.4, +887.4, 560.3, 887.3, 560.5, 897.9, 565.3, 900.5, 583.4, 900.4, 583.4, +903.1, 601.5, 904.2, 615.5, 904.8, 615.5, 907.1, 629.4, 892.3, 616.5, +892.3, 616.5, 877.5, 603.6, 884.1, 601.5, 881.3, 578.7, 876.8, 555.4, +924.9, 574.1, 934.6, 580.7, 934.6, 580.7, 944.3, 587.3, 944.0, 594.1, +941.0, 598.8, 944.0, 600.9, 943.8, 604.9, 945.7, 606.7, 943.6, 608.8, +926.1, 612.3, 927.9, 621.4, 912.2, 633.9, 912.3, 632.1, 910.0, 632.0, +907.8, 630.0, 907.5, 626.4, 907.2, 626.4, 906.6, 622.8, 904.2, 604.5, +903.8, 604.5, 901.1, 586.3, 904.6, 577.0, 913.1, 573.8, 924.9, 574.1, +901.1, 586.3, 896.6, 584.8, 899.5, 575.8, 897.9, 565.3, 897.9, 565.1, +897.9, 565.1, 897.9, 564.9, 897.2, 559.8, 898.2, 559.5, 896.4, 554.7, +903.9, 559.8, 903.7, 560.0, 911.3, 564.9, 913.1, 566.1, 913.1, 566.1, +915.0, 567.3, 915.1, 570.9, 919.9, 570.7, 924.9, 574.1, 913.1, 573.8, +904.6, 577.0, 901.1, 586.3, 556.4, 358.5, 563.7, 373.2, 565.8, 372.2, +575.2, 385.9, 582.9, 397.1, 582.9, 397.1, 590.6, 408.4, 612.9, 440.9, +613.2, 440.7, 635.2, 473.4, 635.6, 474.9, 636.0, 474.9, 636.1, 476.4, +637.2, 490.9, 632.9, 492.8, 638.3, 505.4, 638.4, 507.7, 638.1, 507.7, +637.8, 510.0, 637.6, 511.1, 638.0, 511.3, 637.5, 512.3, 637.6, 512.1, +637.2, 511.8, 636.9, 511.4, 596.6, 435.0, 594.5, 436.0, 556.4, 358.5, +636.9, 511.4, 631.2, 500.0, 630.0, 500.6, 623.1, 489.8, 602.2, 457.1, +602.2, 457.1, 581.3, 424.5, 580.7, 423.6, 580.7, 423.6, 580.1, 422.7, +576.4, 416.8, 576.4, 416.8, 572.6, 410.9, 568.0, 403.6, 568.0, 403.6, +563.3, 396.4, 554.4, 382.5, 554.4, 382.5, 545.5, 368.5, 542.6, 364.1, +540.9, 364.5, 539.8, 359.6, 538.8, 344.7, 538.3, 344.7, 536.7, 329.8, +545.6, 329.2, 548.0, 343.3, 556.4, 358.5, 594.5, 436.0, 596.6, 435.0, +636.9, 511.4, 675.1, 570.2, 674.8, 570.2, 674.6, 570.3, 674.6, 570.2, +665.5, 556.2, 665.7, 556.0, 656.7, 541.9, 653.1, 536.2, 653.0, 536.3, +649.4, 530.7, 645.6, 524.9, 641.9, 519.1, 641.9, 519.1, 641.9, 519.1, +645.6, 524.9, 649.4, 530.7, 653.0, 536.3, 653.1, 536.2, 656.7, 541.9, +665.9, 556.0, 666.1, 555.9, 675.1, 570.2, 899.8, 548.7, 895.3, 542.3, +895.6, 542.1, 890.9, 536.0, 885.0, 514.4, 887.5, 513.7, 884.2, 491.5, +882.5, 489.1, 883.7, 488.2, 883.2, 484.9, 883.2, 484.2, 883.7, 484.2, +884.2, 483.4, 886.2, 479.1, 886.7, 479.4, 889.2, 475.3, 894.8, 486.7, +891.1, 488.4, 893.0, 501.6, 896.4, 525.1, 901.3, 525.5, 899.8, 548.7, +884.2, 389.0, 889.3, 403.4, 884.3, 409.7, 894.4, 417.8, 899.5, 431.9, +904.7, 432.0, 904.5, 446.0, 898.0, 455.1, 899.1, 455.9, 893.7, 465.8, +881.0, 430.2, 883.6, 427.3, 884.2, 389.0, 893.7, 465.8, 888.9, 474.6, +888.4, 474.4, 884.2, 483.4, 883.7, 484.2, 883.2, 484.2, 883.2, 484.9, +882.6, 480.5, 884.0, 479.6, 881.9, 476.0, 881.7, 474.5, 881.7, 474.5, +881.4, 472.9, 881.6, 432.1, 876.0, 432.0, 869.9, 391.2, 870.0, 370.4, +872.9, 370.0, 870.1, 349.6, 876.6, 367.7, 878.4, 386.3, 883.1, 385.9, +882.6, 387.0, 883.6, 387.4, 884.2, 389.0, 883.6, 427.3, 881.0, 430.2, +893.7, 465.8, 912.4, 468.1, 909.0, 458.6, 911.4, 456.8, 905.6, 449.0, +905.9, 447.7, 904.0, 446.7, 904.5, 446.0, 904.7, 432.0, 899.5, 431.9, +894.4, 417.8, 896.0, 419.1, 901.1, 412.8, 907.7, 407.8, 917.5, 435.3, +913.9, 438.2, 912.4, 468.1, 907.7, 407.8, 913.4, 403.5, 917.7, 404.6, +919.1, 399.2, 920.4, 403.4, 920.4, 403.4, 921.6, 407.7, 923.3, 429.6, +924.9, 429.4, 928.2, 451.2, 930.2, 470.0, 930.5, 470.0, 933.3, 488.7, +936.3, 516.2, 934.7, 516.5, 939.4, 543.8, 931.7, 522.3, 935.4, 520.1, +924.1, 500.9, 921.1, 492.4, 921.1, 492.4, 918.1, 484.0, 916.7, 480.1, +916.7, 480.1, 915.3, 476.2, 916.2, 472.8, 913.8, 472.2, 912.4, 468.1, +913.9, 438.2, 917.5, 435.3, 907.7, 407.8, 869.3, 391.2, 869.6, 393.4, +869.6, 395.5, 869.9, 395.5, 875.4, 434.2, 881.6, 434.2, 881.4, 472.9, +881.7, 474.5, 881.7, 474.5, 881.9, 476.0, 862.4, 442.8, 860.9, 443.7, +840.0, 411.3, 838.8, 403.6, 853.7, 399.5, 869.3, 391.2, 840.0, 411.3, +833.9, 401.9, 836.4, 396.3, 827.8, 392.5, 834.3, 373.1, 846.5, 358.5, +840.8, 353.8, 844.2, 352.5, 844.2, 352.5, 847.6, 351.2, 847.8, 352.0, +856.3, 353.2, 863.2, 350.6, 866.2, 370.9, 866.2, 370.9, 869.3, 391.2, +853.7, 399.5, 838.8, 403.6, 840.0, 411.3, 797.4, 463.4, 818.1, 481.9, +832.6, 485.1, 832.8, 507.0, 815.2, 491.3, 815.2, 491.3, 797.5, 475.5, +794.5, 471.9, 800.4, 466.1, 797.4, 463.4, 797.5, 475.5, 781.5, 461.2, +783.7, 457.2, 765.4, 446.9, 763.2, 449.1, 743.6, 417.7, 714.5, 401.6, +727.0, 396.9, 727.0, 396.9, 739.4, 392.2, 746.0, 393.0, 745.1, 399.2, +750.9, 406.3, 764.3, 422.8, 764.3, 422.8, 777.8, 439.4, 787.6, 451.4, +790.1, 450.1, 797.4, 463.4, 800.4, 466.1, 794.5, 471.9, 797.5, 475.5, +764.0, 382.8, 766.2, 382.0, 766.2, 382.0, 768.3, 381.2, 787.3, 419.8, +792.2, 417.7, 818.3, 452.4, 839.0, 481.8, 837.6, 483.0, 859.8, 511.3, +811.2, 449.2, 812.7, 448.1, 765.5, 384.9, 764.8, 383.9, 763.8, 383.1, +764.0, 382.8, 875.4, 533.5, 871.8, 528.1, 871.7, 528.3, 868.0, 523.0, +863.9, 517.2, 863.9, 517.2, 859.8, 511.3, 837.6, 483.0, 839.0, 481.8, +818.3, 452.4, 814.6, 447.4, 815.7, 446.5, 813.2, 440.7, 831.1, 465.0, +830.0, 465.8, 846.8, 490.9, 848.1, 492.9, 848.1, 492.9, 849.5, 494.8, +862.4, 514.2, 862.6, 514.1, 875.4, 533.5, 544.1, 175.8, 556.5, 200.5, +554.9, 201.4, 569.0, 225.3, 561.9, 229.4, 547.8, 205.6, 526.7, 186.0, +525.3, 184.7, 524.4, 183.1, 523.9, 183.4, 533.0, 178.0, 540.5, 172.5, +544.1, 175.8, 526.7, 186.0, 547.8, 205.6, 561.9, 229.4, 569.0, 225.3, +572.1, 230.5, 576.1, 228.6, 578.3, 234.0, 586.1, 245.8, 588.9, 243.9, +599.6, 253.8, 619.4, 274.2, 619.6, 274.0, 639.5, 294.1, 616.9, 278.6, +614.7, 281.7, 589.9, 269.3, 577.6, 260.4, 580.3, 256.7, 570.7, 244.0, +560.1, 230.0, 560.1, 230.0, 549.5, 216.0, 544.8, 209.8, 544.8, 209.8, +540.0, 203.6, 538.5, 201.6, 538.5, 201.6, 537.0, 199.6, 531.9, 192.8, +533.2, 191.2, 526.7, 186.0, 606.5, 321.3, 607.1, 332.5, 603.3, 334.3, +607.8, 343.7, 582.8, 318.3, 582.8, 318.3, 557.8, 293.0, 550.1, 270.2, +544.6, 272.1, 531.4, 251.2, 574.7, 276.3, 574.1, 282.0, 606.5, 321.3, +531.4, 251.2, 526.9, 244.1, 528.3, 242.6, 522.4, 236.9, 563.4, 261.1, +563.4, 261.1, 604.4, 285.3, 606.6, 286.8, 604.7, 289.6, 604.9, 294.0, +605.1, 297.0, 605.1, 297.0, 605.3, 300.0, 602.1, 301.3, 605.9, 310.6, +606.5, 321.3, 574.1, 282.0, 574.7, 276.3, 531.4, 251.2, 604.9, 294.0, +604.7, 289.6, 606.6, 286.8, 604.4, 285.3, 606.9, 286.8, 606.9, 286.8, +609.4, 288.2, 609.6, 291.0, 605.3, 294.2, 604.9, 294.0, 542.8, 279.0, +564.4, 308.2, 562.7, 309.6, 586.0, 337.3, 543.6, 311.2, 543.6, 311.2, +501.2, 285.0, 505.9, 288.8, 510.0, 283.7, 518.8, 282.5, 530.8, 280.7, +536.5, 273.8, 542.8, 279.0, 567.3, 73.7, 569.0, 78.4, 568.2, 78.7, +569.1, 83.6, 569.4, 84.9, 569.4, 84.9, 569.6, 86.2, 568.6, 86.9, +571.5, 91.2, 570.6, 91.6, 566.7, 94.4, 566.7, 94.4, 562.7, 97.1, +561.8, 97.0, 561.9, 94.1, 561.1, 91.2, 553.1, 61.2, 553.1, 61.2, +545.1, 31.1, 543.1, 23.6, 543.1, 23.6, 541.1, 16.0, 535.7, -4.2, +538.8, -5.6, 530.3, -24.4, 551.9, 23.2, 549.6, 24.4, 567.3, 73.7, +530.3, -24.4, 529.7, -26.0, 529.8, -26.1, 529.4, -27.8, 528.2, -32.2, +527.2, -32.2, 527.0, -36.7, 526.9, -37.9, 528.8, -39.2, 528.8, -39.2, +530.9, -27.9, 550.9, -21.1, 549.9, -19.7, 553.8, 1.1, 548.9, 19.7, +557.7, 22.0, 560.4, 36.7, 560.4, 36.7, 563.1, 51.4, 565.2, 62.6, +562.9, 63.6, 567.3, 73.7, 549.6, 24.4, 551.9, 23.2, 530.3, -24.4, +682.2, -11.8, 682.8, -12.2, 687.1, -7.7, 686.9, -7.4, 662.7, 7.7, +666.9, 14.4, 646.9, 36.3, 607.4, 59.9, 606.8, 59.2, 569.6, 86.2, +569.4, 84.9, 569.4, 84.9, 569.1, 83.6, 588.0, 66.3, 588.8, 67.1, +608.4, 50.5, 624.1, 37.2, 624.1, 37.2, 639.9, 23.9, 661.0, 6.1, +659.3, 3.5, 682.2, -11.8, 376.8, 74.3, 374.7, 66.1, 374.7, 66.1, +372.6, 57.9, 376.1, 61.9, 406.7, 46.2, 406.0, 43.4, 413.5, 43.8, +421.0, 59.2, 420.2, 60.1, 406.4, 74.7, 398.1, 75.3, 376.8, 74.3, +439.2, 19.5, 426.1, 5.7, 426.1, 5.7, 413.0, -8.1, 441.4, -5.2, +442.7, -8.0, 471.0, -14.3, 488.5, -14.8, 498.8, -2.9, 506.1, -10.7, +482.9, 14.0, 473.1, 18.6, 439.2, 19.5, 506.1, -10.7, 506.9, -11.0, +507.9, -10.1, 508.1, -10.5, 487.9, 19.2, 487.4, 18.9, 466.1, 47.9, +466.2, 47.8, 465.9, 47.6, 465.6, 47.3, 452.6, 33.3, 452.4, 33.4, +439.2, 19.5, 473.1, 18.6, 482.9, 14.0, 506.1, -10.7, 424.5, 65.0, +422.7, 62.3, 422.4, 62.5, 420.2, 60.1, 421.0, 59.2, 413.5, 43.8, +406.0, 43.4, 397.1, 8.3, 364.4, -22.7, 353.5, -18.0, 352.8, -20.5, +351.7, -22.3, 349.8, -22.3, 355.9, -23.9, 355.9, -23.9, 362.0, -25.4, +371.9, -18.7, 369.3, -14.8, 376.6, -4.2, 383.0, 5.0, 383.0, 5.0, +389.3, 14.2, 396.6, 24.7, 396.6, 24.7, 403.8, 35.1, 414.2, 50.1, +414.5, 49.8, 424.5, 65.0, 414.0, -38.8, 421.4, -40.7, 421.3, -40.9, +428.6, -42.8, 449.2, -48.0, 449.2, -47.9, 469.8, -53.0, 471.6, -53.4, +471.6, -53.4, 473.5, -53.9, 443.7, -46.3, 443.8, -46.2, 414.0, -38.8, +208.2, 292.5, 217.0, 279.3, 222.7, 280.5, 225.8, 266.0, 239.8, 263.1, +242.0, 274.1, 258.3, 282.1, 260.9, 283.4, 260.9, 283.4, 263.4, 284.6, +267.9, 286.8, 272.4, 286.8, 272.4, 289.1, 272.4, 291.5, 267.9, 291.5, +263.4, 293.9, 252.2, 300.0, 252.2, 300.0, 241.0, 306.0, 240.2, 306.5, +239.9, 307.2, 239.3, 307.0, 223.5, 300.4, 211.9, 303.7, 208.2, 292.5, +239.3, 307.0, 240.1, 309.9, 227.5, 313.4, 215.6, 319.8, 208.1, 323.9, +208.1, 323.9, 200.5, 328.0, 197.8, 326.4, 191.7, 329.4, 190.1, 333.6, +194.5, 320.1, 194.5, 320.1, 198.8, 306.6, 200.1, 299.0, 203.5, 299.5, +208.2, 292.5, 211.9, 303.7, 223.5, 300.4, 239.3, 307.0, 238.5, 111.6, +244.2, 108.1, 247.0, 109.7, 249.8, 104.6, 245.6, 119.3, 245.6, 119.3, +241.5, 134.0, 240.6, 137.6, 239.4, 137.2, 238.0, 140.7, 230.1, 155.8, +230.1, 155.8, 222.2, 171.0, 200.9, 211.7, 203.3, 213.2, 179.6, 252.5, +180.5, 246.8, 179.8, 246.7, 179.9, 241.0, 207.3, 175.5, 206.2, 174.7, +238.5, 111.6, 179.9, 241.0, 180.4, 221.2, 174.6, 203.5, 180.9, 201.5, +201.5, 161.7, 201.5, 161.7, 222.1, 121.8, 224.7, 114.7, 230.3, 116.7, +238.5, 111.6, 206.2, 174.7, 207.3, 175.5, 179.9, 241.0, 199.0, 163.7, +180.0, 201.5, 180.0, 201.5, 161.1, 239.4, 150.1, 261.1, 150.0, 261.0, +138.9, 282.6, 137.6, 285.0, 137.6, 285.0, 136.3, 287.5, 137.7, 283.6, +136.5, 283.1, 136.6, 278.7, 146.3, 257.4, 147.8, 258.1, 159.0, 237.4, +179.0, 200.6, 206.9, 171.3, 199.0, 163.7, 477.6, 762.9, 483.4, 806.1, +483.5, 806.0, 489.1, 849.3, 489.8, 854.9, 489.6, 854.9, 490.1, 860.6, +490.8, 868.4, 490.2, 868.5, 491.6, 876.2, 489.4, 864.4, 490.1, 864.3, +488.6, 852.4, 483.4, 810.0, 483.4, 810.0, 478.2, 767.6, 477.9, 765.3, +477.9, 765.2, 477.6, 762.9, 491.9, 847.9, 491.7, 854.3, 493.4, 859.1, +490.1, 860.6, 489.6, 854.9, 489.8, 854.9, 489.1, 849.3, 487.8, 840.3, +488.3, 840.2, 487.4, 831.1, 485.8, 836.4, 489.1, 837.4, 490.8, 843.6, +491.4, 845.8, 492.0, 845.8, 491.9, 847.9, 501.5, 451.5, 496.1, 456.3, +485.1, 452.0, 484.8, 454.4, 495.2, 435.8, 495.2, 435.9, 505.5, 417.3, +512.4, 405.1, 519.8, 404.6, 519.2, 392.8, 528.4, 376.3, 537.4, 359.8, +537.5, 359.8, 538.4, 359.2, 538.9, 358.3, 538.6, 357.9, 539.2, 358.7, +539.7, 358.7, 539.8, 359.6, 540.9, 364.5, 542.6, 364.1, 545.5, 368.5, +533.3, 400.4, 529.4, 398.9, 513.3, 429.3, 507.4, 440.4, 510.3, 443.7, +501.5, 451.5, 468.2, 621.6, 466.6, 603.5, 466.5, 603.5, 464.8, 585.3, +484.5, 550.0, 465.4, 538.7, 463.8, 492.1, 471.6, 478.1, 471.6, 478.1, +479.4, 464.0, 488.2, 493.2, 477.1, 496.5, 474.8, 529.0, 474.7, 530.5, +474.7, 530.5, 474.6, 531.9, 472.3, 563.6, 472.3, 563.6, 470.1, 595.2, +469.2, 607.8, 469.2, 607.8, 468.3, 620.3, 468.2, 621.0, 468.1, 621.0, +468.2, 621.6, 458.7, 501.2, 458.0, 502.4, 457.3, 502.5, 457.3, 503.6, +456.5, 494.1, 456.5, 494.1, 455.6, 484.5, 452.4, 490.2, 457.9, 492.8, +458.7, 501.2, 480.2, 266.5, 481.8, 271.2, 482.9, 270.8, 485.7, 275.1, +492.4, 286.2, 492.6, 286.0, 499.6, 296.9, 503.1, 301.2, 500.0, 303.7, +500.3, 310.6, 492.2, 303.8, 495.4, 300.0, 490.6, 289.4, 485.4, 277.9, +484.3, 278.3, 480.2, 266.5, 205.6, 671.5, 207.4, 667.6, 208.7, 667.8, +209.3, 663.7, 209.5, 676.0, 209.5, 676.0, 209.6, 688.4, 212.5, 682.3, +205.7, 680.0, 205.6, 671.5, 173.8, 490.6, 180.4, 471.0, 174.1, 457.5, +187.1, 451.5, 206.4, 425.2, 203.9, 422.9, 225.7, 398.9, 231.9, 390.5, +230.2, 388.0, 238.3, 382.2, 236.2, 383.7, 239.4, 387.0, 237.7, 390.2, +229.6, 406.0, 228.1, 405.3, 218.5, 420.3, 211.9, 430.8, 211.9, 430.8, +205.2, 441.3, 189.5, 466.0, 196.2, 478.0, 173.8, 490.6, 434.6, 322.4, +437.2, 344.4, 439.3, 344.4, 439.9, 366.4, 440.0, 367.4, 440.0, 367.4, +440.0, 368.4, 432.0, 356.0, 432.4, 355.7, 424.7, 343.1, 424.2, 342.3, +424.2, 342.3, 423.8, 341.6, 419.6, 334.6, 419.6, 334.6, 415.3, 327.6, +405.7, 311.6, 405.7, 311.6, 396.0, 295.6, 392.0, 289.0, 389.9, 289.5, +387.9, 282.3, 377.8, 275.8, 385.3, 264.0, 382.7, 245.8, 379.9, 250.3, +390.0, 256.5, 397.3, 267.3, 407.0, 281.7, 407.0, 281.7, 416.8, 296.1, +417.2, 296.7, 417.2, 296.7, 417.5, 297.2, 420.5, 301.6, 420.5, 301.6, +423.4, 305.9, 429.0, 314.1, 432.1, 313.3, 434.6, 322.4, 209.1, 881.3, +209.0, 881.8, 205.6, 882.1, 202.6, 881.2, 203.0, 880.7, 202.4, 880.2, +202.3, 879.2, 215.2, 875.8, 205.3, 838.2, 208.2, 797.2, 203.1, 821.6, +208.5, 822.8, 208.8, 848.4, 209.0, 864.8, 212.1, 865.4, 209.1, 881.3, +322.4, 303.2, 317.5, 312.0, 320.3, 313.4, 316.6, 322.9, 314.1, 329.5, +313.2, 329.1, 309.8, 335.3, 309.5, 336.0, 309.4, 336.0, 309.1, 336.7, +315.6, 319.9, 313.8, 318.9, 322.4, 303.2, 309.8, 335.3, 313.2, 329.1, +314.1, 329.5, 316.6, 322.9, 311.6, 347.8, 309.5, 347.3, 302.4, 371.7, +301.0, 376.6, 301.0, 376.6, 299.6, 381.6, 296.0, 393.7, 296.0, 393.7, +292.5, 405.8, 292.3, 406.5, 292.3, 406.5, 292.1, 407.2, 291.4, 409.5, +291.4, 409.5, 290.7, 411.9, 283.9, 435.5, 283.9, 435.5, 277.0, 459.0, +274.5, 467.6, 274.5, 467.6, 272.0, 476.1, 270.8, 480.4, 270.8, 480.4, +269.5, 484.6, 256.2, 529.7, 256.2, 529.6, 242.9, 574.7, 241.7, 578.5, +241.8, 578.5, 240.7, 582.4, 236.3, 598.2, 231.9, 614.0, 231.9, 614.0, +231.9, 614.0, 236.3, 598.2, 240.7, 582.4, 241.8, 578.5, 241.7, 578.5, +242.9, 574.7, 267.7, 486.1, 267.8, 486.1, 292.4, 397.5, 300.9, 367.2, +300.6, 367.1, 309.1, 336.7, 309.4, 336.0, 309.5, 336.0, 309.8, 335.3, +144.7, 133.3, 156.7, 133.2, 156.7, 133.2, 168.8, 133.0, 168.1, 133.2, +169.2, 137.2, 169.5, 141.3, 146.3, 157.1, 147.5, 158.8, 125.4, 176.3, +127.9, 177.1, 129.1, 148.9, 144.7, 133.3, 125.4, 176.3, 116.5, 183.4, +109.2, 182.0, 107.5, 190.5, 104.8, 170.5, 104.8, 170.5, 102.0, 150.6, +118.6, 144.8, 117.6, 142.0, 133.2, 133.5, 133.7, 132.2, 137.8, 135.0, +140.7, 133.4, 142.0, 132.4, 142.7, 133.4, 144.7, 133.3, 129.1, 148.9, +127.9, 177.1, 125.4, 176.3, 115.5, 261.9, 117.0, 266.4, 119.2, 266.7, +118.6, 270.9, 118.7, 271.9, 118.7, 271.9, 118.9, 272.9, 123.6, 317.8, +123.5, 317.8, 128.3, 362.6, 128.7, 366.0, 129.2, 369.3, 129.2, 369.3, +129.2, 369.3, 128.7, 366.0, 128.3, 362.6, 121.9, 312.3, 120.9, 312.4, +115.5, 261.9, 60.6, 101.9, 65.7, 116.8, 65.7, 116.8, 70.8, 131.7, +67.1, 140.6, 67.3, 142.3, 69.2, 152.0, 68.3, 163.3, 69.5, 163.5, +67.4, 174.6, 65.2, 180.0, 65.2, 180.0, 63.0, 185.5, 63.2, 185.1, +63.0, 185.0, 63.0, 184.6, 62.5, 168.3, 62.5, 168.3, 62.1, 152.1, +61.3, 127.0, 51.6, 122.9, 60.6, 101.9, 129.6, 436.3, 133.6, 448.4, +133.2, 448.6, 137.6, 460.5, 122.5, 453.7, 126.3, 445.1, 115.1, 429.8, +105.8, 417.1, 108.9, 409.5, 96.5, 404.4, 115.6, 412.2, 112.5, 419.8, +128.4, 435.2, 129.0, 435.8, 129.3, 435.7, 129.6, 436.3, 38.9, 323.2, +38.5, 321.0, 38.5, 321.0, 38.1, 318.9, 53.0, 296.7, 49.7, 294.5, +61.2, 270.1, 65.4, 294.0, 51.2, 297.2, 38.9, 323.2, 115.1, 429.8, +126.3, 445.1, 122.5, 453.7, 137.6, 460.5, 138.0, 461.7, 139.3, 461.7, +139.2, 462.7, 139.8, 464.7, 142.0, 464.7, 141.8, 466.3, 141.8, 468.7, +141.8, 468.7, 141.9, 471.0, 142.0, 471.5, 141.7, 471.6, 141.5, 472.1, +130.0, 454.6, 130.4, 454.3, 119.3, 436.5, 117.2, 433.1, 117.5, 432.9, +115.1, 429.8, -27.5, 407.4, -30.4, 389.0, -29.2, 388.7, -33.2, 370.6, +-33.3, 359.7, -34.8, 355.3, -28.1, 348.9, -26.1, 355.1, -25.7, 355.0, +-23.3, 361.1, -23.0, 384.2, -14.8, 395.3, -27.5, 407.4, -23.3, 361.1, +-22.7, 362.5, -22.7, 362.5, -22.1, 363.9, -20.4, 368.4, -20.4, 368.4, +-18.6, 372.9, -4.0, 410.0, -0.8, 409.0, 10.6, 447.0, 15.8, 451.1, +10.4, 458.2, 10.2, 469.4, -3.1, 439.7, -25.9, 441.5, -25.5, 414.1, +-26.2, 412.5, -26.2, 412.5, -27.0, 410.9, -27.8, 409.6, -27.2, 409.2, +-27.5, 407.4, -14.8, 395.3, -23.0, 384.2, -23.3, 361.1, -15.8, 379.3, +-17.1, 376.1, -18.6, 372.9, -18.6, 372.9, -20.4, 368.4, -20.4, 368.4, +-22.1, 363.9, -22.2, 363.6, -22.2, 363.6, -22.3, 363.3, -20.5, 355.6, +-24.5, 354.4, -27.3, 345.7, -27.8, 340.5, -25.4, 335.0, -24.8, 335.0, +-15.9, 341.8, -16.5, 346.7, -6.7, 348.2, -5.9, 347.4, -2.9, 353.3, +1.7, 354.3, 1.8, 359.9, 9.7, 365.8, 16.8, 365.3, 17.9, 368.2, +19.8, 367.5, 22.8, 369.6, 22.8, 369.7, 22.8, 369.7, 22.8, 369.7, +22.9, 371.5, 22.8, 371.5, 22.8, 373.4, 3.9, 378.1, 3.5, 379.5, +-15.8, 379.3, 22.8, 373.4, 22.9, 387.5, 22.9, 387.5, 22.9, 401.7, +21.1, 397.3, -5.3, 402.7, -5.3, 403.6, -10.6, 391.4, -10.6, 391.4, +-15.8, 379.3, 3.5, 379.5, 3.9, 378.1, 22.8, 373.4, 89.4, 652.2, +89.7, 652.3, 89.9, 652.3, 89.9, 652.3, 91.2, 668.6, 91.2, 668.6, +92.5, 684.9, 87.9, 684.0, 90.7, 668.6, 89.4, 652.2, 765.8, 541.1, +758.0, 521.3, 758.6, 521.0, 750.1, 501.5, 748.7, 497.4, 750.1, 492.7, +749.0, 492.6, 766.0, 502.0, 785.1, 497.0, 786.1, 505.6, 793.3, 509.5, +793.3, 509.5, 800.5, 513.5, 798.1, 513.8, 797.1, 519.5, 797.4, 525.2, +799.3, 532.4, 795.3, 533.5, 793.2, 541.7, 782.4, 547.1, 773.3, 548.1, +765.8, 541.1, 793.2, 541.7, 787.8, 562.4, 787.8, 562.4, 782.5, 583.1, +778.3, 561.3, 774.1, 562.1, 765.8, 541.1, 773.3, 548.1, 782.4, 547.1, +793.2, 541.7, 748.5, 575.4, 744.8, 572.5, 744.4, 572.8, 741.0, 569.6, +734.7, 564.0, 734.7, 564.0, 728.5, 558.4, 727.5, 551.0, 726.0, 551.2, +723.5, 543.9, 738.5, 556.7, 737.2, 558.8, 748.5, 575.4, 723.5, 543.9, +723.0, 542.4, 722.7, 542.5, 722.5, 540.9, 722.2, 539.4, 721.3, 538.6, +722.0, 537.9, 720.3, 528.5, 720.3, 528.5, 718.6, 519.2, 716.1, 504.7, +710.9, 503.7, 713.5, 490.2, 718.1, 493.2, 722.6, 492.1, 723.2, 495.6, +728.2, 499.0, 728.0, 499.4, 733.3, 502.3, 735.2, 505.7, 734.5, 506.4, +737.1, 509.1, 736.7, 509.4, 739.2, 512.8, 741.2, 516.5, 744.6, 544.7, +744.7, 547.0, 758.5, 571.7, 759.3, 578.0, 759.3, 578.0, 760.1, 584.4, +754.8, 579.3, 754.3, 579.9, 748.5, 575.4, 737.2, 558.8, 738.5, 556.7, +723.5, 543.9, 750.7, 506.1, 751.4, 512.5, 751.4, 512.5, 752.2, 518.9, +750.9, 515.5, 748.4, 516.4, 744.7, 514.0, 740.3, 506.3, 738.7, 507.1, +732.3, 500.6, 719.9, 478.6, 726.2, 469.7, 707.6, 456.6, 706.9, 452.6, +706.9, 452.6, 706.2, 448.6, 730.0, 476.0, 730.8, 475.8, 750.7, 506.1, +706.2, 448.6, 703.8, 435.3, 705.6, 434.7, 701.5, 422.0, 706.9, 425.7, +706.9, 425.7, 712.4, 429.4, 714.7, 448.8, 726.1, 451.4, 745.7, 464.8, +745.7, 465.1, 745.6, 465.3, 745.8, 465.5, 750.7, 468.2, 742.7, 479.3, +748.1, 484.6, 749.8, 485.2, 747.0, 491.5, 749.0, 492.6, 750.1, 492.7, +748.7, 497.4, 750.1, 501.5, 751.0, 503.5, 750.4, 503.8, 750.7, 506.1, +730.8, 475.8, 730.0, 476.0, 706.2, 448.6, 835.7, 623.1, 836.7, 624.3, +837.6, 623.4, 839.3, 624.0, 839.8, 624.1, 839.7, 624.4, 840.1, 624.8, +841.3, 625.9, 841.2, 626.1, 842.2, 627.4, 838.6, 626.1, 838.1, 626.0, +835.7, 623.1, 855.5, 586.8, 860.4, 591.7, 860.4, 591.7, 865.4, 596.6, +880.6, 617.1, 878.7, 618.8, 895.8, 637.6, 867.6, 630.8, 867.6, 630.5, +839.3, 624.0, 837.6, 623.4, 836.7, 624.3, 835.7, 623.1, 831.7, 622.2, +828.2, 620.5, 827.8, 621.3, 835.7, 605.4, 839.2, 607.1, 850.6, 593.0, +853.0, 589.9, 853.9, 586.4, 855.5, 586.8, 575.2, 385.9, 565.8, 372.2, +563.7, 373.2, 556.4, 358.5, 548.0, 343.3, 545.6, 329.2, 536.7, 329.8, +536.4, 326.7, 536.4, 326.7, 536.1, 323.7, 544.7, 334.1, 543.4, 335.2, +550.6, 346.8, 562.9, 366.3, 565.0, 365.3, 575.2, 385.9, 626.3, 445.3, +630.7, 459.4, 630.7, 459.4, 635.2, 473.4, 613.2, 440.7, 612.9, 440.9, +590.6, 408.4, 585.9, 399.5, 595.0, 392.5, 589.2, 386.5, 612.9, 411.0, +610.1, 414.7, 626.3, 445.3, 589.2, 386.5, 586.2, 380.6, 588.8, 379.2, +588.3, 372.0, 587.4, 357.9, 582.3, 356.2, 586.5, 343.8, 591.1, 346.9, +591.1, 346.9, 595.7, 350.0, 597.0, 350.8, 596.5, 351.7, 597.3, 353.4, +586.5, 392.3, 611.8, 399.4, 626.3, 445.3, 610.1, 414.7, 612.9, 411.0, +589.2, 386.5, 718.6, 519.2, 720.3, 528.5, 720.3, 528.5, 722.0, 537.9, +711.8, 549.5, 701.7, 552.1, 703.4, 562.7, 704.0, 563.8, 701.3, 565.4, +699.3, 568.1, 699.0, 569.1, 696.3, 568.4, 693.3, 568.6, 692.5, 565.5, +695.3, 564.7, 697.3, 560.8, 700.6, 554.3, 700.6, 554.3, 704.0, 547.8, +711.3, 533.5, 707.0, 525.6, 718.6, 519.2, 910.3, 563.5, 905.1, 556.1, +905.1, 556.1, 899.8, 548.7, 901.3, 525.5, 896.4, 525.1, 893.0, 501.6, +910.5, 526.3, 905.8, 531.9, 910.3, 563.5, 842.9, 516.0, 837.8, 511.5, +837.8, 511.5, 832.8, 507.0, 832.6, 485.1, 818.1, 481.9, 797.4, 463.4, +790.1, 450.1, 787.6, 451.4, 777.8, 439.4, 810.7, 477.4, 811.2, 477.0, +842.9, 516.0, 846.8, 490.9, 830.0, 465.8, 831.1, 465.0, 813.2, 440.7, +801.8, 415.0, 801.8, 415.0, 790.5, 389.3, 819.3, 429.5, 814.6, 432.8, +838.7, 476.3, 842.8, 483.6, 842.0, 484.2, 846.8, 490.9, 485.3, 126.2, +497.4, 124.9, 499.2, 128.7, 509.6, 123.7, 513.3, 124.0, 516.4, 125.4, +516.9, 124.3, 518.5, 126.3, 518.5, 126.3, 520.2, 128.3, 527.6, 149.4, +530.3, 148.5, 540.5, 168.7, 511.7, 166.9, 504.0, 153.5, 485.3, 126.2, +540.5, 168.7, 542.3, 172.2, 542.3, 172.2, 544.1, 175.8, 540.5, 172.5, +533.0, 178.0, 523.9, 183.4, 497.6, 169.5, 501.3, 162.4, 478.7, 141.4, +471.8, 134.9, 471.2, 135.4, 464.8, 128.5, 465.1, 128.8, 465.7, 128.2, +466.5, 128.1, 474.5, 124.3, 475.9, 127.1, 485.3, 126.2, 504.0, 153.5, +511.7, 166.9, 540.5, 168.7, 804.5, 87.9, 824.8, 103.2, 825.5, 102.3, +846.3, 117.0, 857.7, 124.9, 857.5, 125.2, 868.7, 133.4, 863.2, 129.3, +863.1, 129.5, 857.5, 125.5, 831.0, 106.7, 830.4, 107.5, 804.5, 87.9, +936.1, 245.9, 931.1, 239.5, 929.4, 240.9, 922.7, 235.8, 918.0, 232.3, +918.1, 232.3, 913.4, 228.8, 876.6, 201.0, 876.6, 201.0, 839.8, 173.3, +834.8, 169.5, 834.0, 165.0, 829.8, 165.7, 840.9, 163.7, 841.7, 168.3, +853.6, 170.8, 864.6, 173.1, 868.4, 168.9, 875.6, 175.5, 909.7, 206.5, +907.6, 209.3, 936.1, 245.9, 686.0, 149.5, 684.1, 135.7, 669.1, 137.8, +652.1, 126.1, 638.8, 117.0, 638.8, 117.0, 625.6, 107.8, 618.0, 102.6, +613.6, 104.6, 610.4, 97.3, 615.1, 96.3, 615.1, 96.3, 619.9, 95.3, +629.9, 99.9, 628.7, 102.5, 637.5, 109.8, 644.5, 115.4, 644.5, 115.4, +651.4, 121.1, 668.7, 135.3, 683.8, 133.2, 686.0, 149.5, 576.5, 124.0, +580.8, 126.0, 580.8, 126.0, 585.0, 128.1, 586.0, 128.6, 586.0, 128.7, +587.0, 129.2, 581.8, 126.6, 581.7, 126.7, 576.5, 124.0, 795.1, 271.6, +794.1, 271.2, 796.8, 263.4, 798.5, 255.3, 799.9, 248.5, 802.0, 241.9, +801.3, 241.7, 836.2, 260.0, 836.2, 260.0, 871.1, 278.3, 867.9, 276.4, +867.0, 277.9, 862.9, 277.6, 829.0, 274.6, 826.3, 282.4, 795.1, 271.6, +820.2, 241.9, 825.3, 245.5, 825.3, 245.5, 830.4, 249.0, 818.0, 241.3, +817.2, 242.5, 804.0, 236.0, 810.9, 240.7, 812.5, 238.1, 820.2, 241.9, +707.8, 186.5, 709.9, 187.9, 709.2, 189.3, 711.3, 190.3, 676.6, 173.2, +676.6, 173.2, 641.9, 156.2, 623.4, 152.8, 624.9, 144.6, 607.9, 133.0, +634.7, 139.2, 633.0, 146.5, 658.2, 159.9, 674.4, 168.6, 674.4, 168.6, +690.7, 177.3, 699.2, 181.9, 699.6, 181.4, 707.8, 186.5, 625.1, 297.5, +631.6, 301.3, 631.6, 301.3, 638.2, 305.2, 641.4, 305.5, 640.7, 312.7, +643.3, 320.2, 631.5, 313.3, 629.5, 310.4, 625.1, 297.5, 444.3, 210.5, +441.2, 208.2, 439.3, 206.5, 439.9, 203.6, 441.9, 192.6, 444.6, 193.1, +449.3, 182.6, 449.3, 182.6, 449.3, 182.6, 449.3, 182.6, 449.3, 182.6, +449.3, 182.6, 449.3, 182.6, 462.4, 196.0, 462.4, 196.0, 475.5, 209.3, +500.5, 245.8, 507.0, 241.3, 538.5, 273.3, 538.9, 273.7, 538.9, 273.8, +539.3, 274.3, 540.5, 275.8, 540.5, 275.8, 541.6, 277.4, 492.6, 244.5, +492.1, 245.1, 444.3, 210.5, 626.5, 73.3, 662.7, 57.4, 662.7, 57.4, +698.9, 41.5, 692.2, 43.1, 696.0, 54.8, 688.7, 58.0, 659.8, 70.7, +638.4, 53.9, 626.5, 73.3, 688.7, 58.0, 684.0, 56.9, 681.7, 71.7, +672.7, 84.0, 671.9, 85.1, 670.9, 84.4, 669.1, 84.8, 646.1, 89.7, +646.1, 94.6, 623.1, 94.6, 612.1, 88.8, 611.6, 89.7, 600.1, 84.9, +613.5, 79.6, 613.3, 79.1, 626.5, 73.3, 638.4, 53.9, 659.8, 70.7, +688.7, 58.0, 682.9, 81.8, 678.3, 83.9, 673.3, 81.8, 672.7, 84.0, +681.7, 71.7, 684.0, 56.9, 688.7, 58.0, 696.0, 54.8, 692.2, 43.1, +698.9, 41.5, 701.1, 40.5, 701.1, 40.5, 703.4, 39.5, 695.5, 59.7, +693.9, 59.1, 684.5, 78.6, 683.7, 80.2, 684.2, 81.2, 682.9, 81.8, +438.1, 128.0, 441.8, 124.7, 441.4, 124.4, 444.8, 120.8, 470.4, 92.8, +470.4, 92.8, 496.1, 64.9, 506.3, 53.8, 506.3, 53.8, 516.5, 42.7, +528.8, 29.4, 525.8, 22.1, 541.1, 16.0, 543.1, 23.6, 543.1, 23.6, +545.1, 31.1, 545.2, 32.4, 543.6, 32.5, 542.1, 33.9, 490.1, 80.9, +490.4, 81.3, 438.1, 128.0, 444.8, 120.8, 441.4, 124.4, 441.8, 124.7, +438.1, 128.0, 436.1, 130.2, 436.4, 132.0, 434.0, 132.5, 424.1, 132.5, +424.1, 132.5, 414.2, 132.6, 424.2, 121.8, 428.9, 123.9, 444.8, 120.8, +428.3, 100.5, 430.0, 102.1, 417.9, 114.9, 407.5, 129.4, 406.3, 131.1, +406.3, 131.1, 405.1, 132.7, 401.3, 134.8, 401.5, 136.3, 399.5, 140.5, +395.8, 140.0, 395.9, 136.0, 393.4, 131.0, 388.3, 125.4, 390.3, 123.5, +387.3, 116.0, 385.9, 112.6, 386.4, 112.4, 385.5, 108.7, 405.6, 101.1, +419.0, 91.7, 428.3, 100.5, 376.6, -4.2, 369.3, -14.8, 371.9, -18.7, +362.0, -25.4, 362.3, -25.5, 362.3, -25.5, 362.6, -25.6, 369.8, -25.0, +371.8, -27.7, 376.9, -24.1, 413.9, 15.4, 419.5, 10.2, 462.0, 44.4, +443.6, 22.3, 435.3, 29.2, 408.7, 14.0, 392.6, 4.9, 390.5, 7.5, +376.6, -4.2, 354.9, 111.6, 352.6, 104.8, 354.4, 104.1, 353.9, 96.6, +353.5, 89.0, 353.5, 89.0, 353.0, 81.4, 352.5, 73.8, 356.0, 70.2, +352.0, 66.3, 363.7, 84.6, 379.1, 99.0, 375.4, 102.9, 382.3, 117.9, +382.3, 118.8, 393.4, 131.0, 395.9, 136.0, 395.8, 140.0, 399.5, 140.5, +399.3, 141.0, 400.0, 142.2, 400.6, 142.2, 400.6, 148.2, 404.3, 148.1, +408.1, 154.0, 408.2, 154.1, 408.0, 154.2, 407.9, 154.3, 404.6, 151.9, +404.7, 151.7, 401.4, 149.1, 381.1, 132.7, 381.1, 132.7, 360.7, 116.3, +357.8, 114.0, 355.9, 114.6, 354.9, 111.6, 354.1, 229.1, 355.0, 230.2, +349.9, 234.6, 345.7, 240.1, 343.2, 243.5, 340.1, 246.3, 340.6, 246.9, +334.1, 239.5, 330.2, 231.4, 333.8, 226.6, 336.9, 222.5, 349.0, 223.4, +354.1, 229.1, 180.4, 458.9, 165.2, 479.0, 164.5, 478.5, 150.0, 499.1, +148.8, 490.4, 148.8, 490.4, 147.6, 481.7, 151.1, 474.2, 155.4, 476.2, +163.2, 470.8, 171.8, 464.8, 176.5, 467.1, 180.4, 458.9, 215.6, 319.8, +227.5, 313.4, 240.1, 309.9, 239.3, 307.0, 239.9, 307.2, 240.2, 306.5, +241.0, 306.0, 240.7, 308.1, 240.5, 309.0, 238.9, 309.9, 227.8, 315.9, +216.7, 313.2, 215.6, 319.8, 222.2, 171.0, 230.1, 155.8, 230.1, 155.8, +238.0, 140.7, 236.5, 144.5, 236.9, 144.6, 235.8, 148.5, 229.8, 160.1, +225.6, 158.8, 222.2, 171.0, 176.4, 362.5, 165.4, 402.3, 165.4, 402.3, +154.3, 442.2, 154.2, 419.4, 152.3, 419.4, 150.3, 396.7, 150.3, 396.6, +150.3, 396.6, 150.4, 396.6, 163.4, 379.5, 177.8, 378.3, 176.4, 362.5, +138.4, 232.7, 138.6, 227.7, 141.1, 225.7, 138.8, 222.8, 153.2, 201.8, +147.7, 192.0, 167.7, 180.7, 169.5, 178.8, 169.6, 178.8, 170.7, 176.4, +170.6, 175.3, 172.0, 175.3, 172.4, 174.0, 183.0, 160.3, 182.2, 159.7, +192.0, 145.4, 212.5, 119.2, 212.1, 118.9, 232.3, 92.4, 204.5, 142.4, +200.4, 140.1, 168.4, 187.8, 153.4, 210.2, 155.7, 212.2, 138.4, 232.7, +470.8, 711.5, 474.2, 737.2, 474.2, 737.2, 477.6, 762.9, 477.9, 765.2, +477.9, 765.3, 478.2, 767.6, 474.5, 739.6, 474.2, 739.6, 470.8, 711.5, +498.0, 805.1, 500.3, 782.9, 501.2, 783.0, 504.3, 760.8, 504.4, 760.3, +504.4, 760.3, 504.4, 759.9, 513.1, 698.6, 512.1, 698.4, 521.8, 637.3, +523.2, 628.6, 524.2, 628.7, 526.6, 620.2, 535.0, 590.1, 535.0, 590.1, +543.4, 560.1, 544.6, 555.9, 545.0, 555.9, 545.8, 551.6, 524.2, 668.1, +523.8, 668.0, 501.9, 784.4, 500.0, 794.8, 499.1, 794.7, 498.0, 805.1, +504.3, 760.8, 501.2, 783.0, 500.3, 782.9, 498.0, 805.1, 495.0, 826.5, +495.9, 826.7, 491.9, 847.9, 492.0, 845.8, 491.4, 845.8, 490.8, 843.6, +496.7, 802.1, 496.6, 802.0, 504.3, 760.8, 580.1, 422.7, 580.7, 423.6, +580.7, 423.6, 581.3, 424.5, 581.4, 425.1, 580.6, 425.6, 580.8, 426.0, +580.0, 424.7, 579.7, 424.1, 580.1, 422.7, 448.7, 409.5, 446.9, 389.4, +446.9, 389.4, 445.0, 369.4, 445.1, 370.9, 445.7, 370.9, 446.4, 372.4, +447.4, 374.6, 447.4, 374.6, 448.4, 376.8, 449.8, 380.1, 449.8, 380.1, +451.3, 383.3, 452.7, 386.4, 452.7, 386.4, 454.1, 389.4, 463.1, 419.2, +467.1, 418.0, 480.0, 446.7, 483.6, 433.2, 458.4, 430.8, 448.7, 409.5, +480.0, 446.7, 480.5, 447.8, 480.5, 447.8, 481.0, 448.9, 468.8, 470.9, +471.1, 472.2, 461.7, 495.7, 460.2, 498.5, 460.2, 498.5, 458.7, 501.2, +457.9, 492.8, 452.4, 490.2, 455.6, 484.5, 452.1, 447.0, 452.1, 447.0, +448.7, 409.5, 458.4, 430.8, 483.6, 433.2, 480.0, 446.7, 192.8, 698.4, +199.2, 685.0, 199.2, 685.0, 205.6, 671.5, 205.7, 680.0, 212.5, 682.3, +209.6, 688.4, 210.1, 726.6, 221.5, 730.2, 210.6, 764.9, 210.6, 767.8, +209.7, 770.5, 210.2, 770.6, 208.8, 765.3, 204.7, 766.3, 199.2, 762.1, +191.8, 731.2, 190.6, 729.9, 192.8, 698.4, 199.2, 762.1, 191.9, 756.3, +192.1, 756.1, 184.6, 750.6, 182.7, 737.0, 182.7, 737.0, 180.9, 723.4, +188.3, 722.5, 186.8, 710.9, 192.8, 698.4, 190.6, 729.9, 191.8, 731.2, +199.2, 762.1, 236.2, 411.3, 233.8, 419.9, 235.6, 420.4, 234.9, 429.5, +234.5, 434.5, 234.5, 434.5, 234.2, 439.5, 233.2, 453.4, 233.2, 453.4, +232.2, 467.3, 231.7, 473.0, 231.7, 473.0, 231.3, 478.7, 229.9, 497.9, +231.2, 498.1, 228.5, 517.2, 227.6, 517.0, 225.0, 523.0, 224.3, 529.2, +235.1, 554.2, 204.3, 563.1, 199.8, 598.9, 204.3, 603.4, 194.9, 612.9, +189.9, 626.9, 193.1, 620.6, 191.5, 619.8, 193.0, 612.6, 197.7, 591.0, +197.7, 591.0, 202.3, 569.3, 204.0, 561.3, 204.0, 561.3, 205.8, 553.2, +209.1, 537.8, 209.1, 537.8, 212.4, 522.3, 218.1, 495.7, 218.1, 495.7, +223.8, 469.2, 230.0, 440.3, 228.3, 439.8, 236.2, 411.3, 348.6, 878.3, +346.2, 840.7, 363.8, 822.4, 343.8, 803.1, 345.5, 776.0, 350.3, 776.3, +356.8, 749.4, 361.1, 731.7, 358.3, 730.5, 365.4, 714.0, 361.6, 722.8, +364.4, 724.0, 363.4, 734.1, 362.4, 743.8, 362.4, 743.8, 361.4, 753.6, +360.9, 758.8, 360.9, 758.8, 360.3, 764.1, 360.0, 767.1, 360.0, 767.1, +359.7, 770.2, 359.2, 775.3, 359.1, 775.3, 358.6, 780.4, 354.5, 820.5, +354.5, 820.5, 350.4, 860.7, 349.5, 869.5, 347.6, 869.7, 348.6, 878.3, +424.8, 241.2, 429.7, 281.8, 429.7, 281.8, 434.6, 322.4, 432.1, 313.3, +429.0, 314.1, 423.4, 305.9, 419.6, 275.8, 424.1, 275.2, 424.7, 244.6, +424.8, 242.9, 425.0, 242.8, 424.8, 241.2, 278.9, 391.8, 258.1, 432.7, +256.9, 432.0, 234.8, 472.2, 233.1, 475.5, 230.4, 476.9, 231.3, 478.7, +231.7, 473.0, 231.7, 473.0, 232.2, 467.3, 244.9, 442.6, 246.9, 443.6, +261.6, 419.8, 270.2, 405.8, 271.4, 406.4, 278.9, 391.8, 142.6, 812.3, +142.0, 745.0, 143.1, 745.0, 143.6, 677.7, 143.8, 660.2, 144.9, 660.2, +143.9, 642.7, 143.9, 642.7, 143.9, 642.7, 143.9, 642.6, 144.5, 656.6, +149.1, 656.4, 154.3, 670.2, 155.2, 672.8, 155.2, 673.1, 155.0, 675.9, +150.4, 732.9, 149.8, 732.8, 144.7, 789.8, 143.7, 801.1, 142.5, 801.1, +142.6, 812.3, 166.1, 703.6, 176.1, 732.7, 175.0, 733.1, 186.1, 761.7, +187.3, 770.3, 187.3, 770.3, 188.5, 778.9, 183.8, 801.5, 180.9, 800.9, +173.4, 823.0, 173.4, 823.1, 173.5, 823.2, 173.5, 823.2, 173.5, 823.2, +173.4, 823.1, 173.4, 823.0, 171.5, 807.5, 171.5, 807.5, 169.5, 791.9, +165.2, 757.5, 162.3, 757.6, 160.9, 723.1, 160.5, 713.5, 169.8, 709.3, +166.1, 703.6, 160.9, 723.1, 152.3, 701.7, 157.9, 699.5, 155.0, 675.9, +155.2, 673.1, 155.2, 672.8, 154.3, 670.2, 156.0, 674.9, 156.0, 674.9, +157.8, 679.7, 162.5, 691.5, 162.0, 691.7, 166.1, 703.6, 169.8, 709.3, +160.5, 713.5, 160.9, 723.1, 90.3, 188.5, 91.4, 191.9, 92.7, 191.9, +92.6, 195.2, 97.0, 229.5, 104.1, 228.6, 115.5, 261.9, 120.9, 312.4, +121.9, 312.3, 128.3, 362.6, 127.0, 342.9, 124.1, 343.2, 119.8, 323.7, +119.2, 321.0, 119.2, 321.0, 118.7, 318.3, 114.6, 299.8, 114.6, 299.8, +110.6, 281.3, 100.4, 234.9, 100.0, 235.0, 90.3, 188.5, 55.9, 88.2, +58.2, 95.1, 58.2, 95.1, 60.6, 101.9, 51.6, 122.9, 61.3, 127.0, +62.1, 152.1, 51.9, 122.6, 56.8, 120.2, 55.9, 88.2, 128.4, 435.2, +112.5, 419.8, 115.6, 412.2, 96.5, 404.4, 88.8, 396.0, 89.7, 395.1, +82.9, 385.9, 82.7, 385.3, 82.6, 385.4, 82.2, 384.9, 88.2, 391.3, +88.1, 391.4, 94.0, 397.8, 111.2, 416.5, 120.2, 413.2, 128.4, 435.2, +59.1, 353.3, 49.3, 339.9, 51.9, 336.6, 39.5, 326.5, 39.3, 325.6, +39.4, 325.6, 39.1, 324.7, 38.9, 324.0, 39.0, 324.0, 38.9, 323.2, +51.2, 297.2, 65.4, 294.0, 61.2, 270.1, 62.8, 266.8, 62.8, 266.8, +64.4, 263.4, 63.2, 308.4, 74.8, 313.5, 59.1, 353.3, 64.4, 263.4, +65.7, 260.7, 67.4, 260.4, 67.0, 257.9, 72.4, 272.6, 72.4, 272.6, +77.7, 287.3, 83.2, 291.6, 76.6, 299.7, 76.0, 312.1, 76.0, 314.7, +75.8, 314.6, 75.7, 317.2, 82.3, 326.3, 62.3, 336.1, 60.9, 355.8, +60.0, 354.6, 60.0, 354.6, 59.1, 353.3, 74.8, 313.5, 63.2, 308.4, +64.4, 263.4, 94.6, 422.5, 88.8, 404.2, 88.9, 404.1, 82.9, 385.9, +89.7, 395.1, 88.8, 396.0, 96.5, 404.4, 108.9, 409.5, 105.8, 417.1, +115.1, 429.8, 117.5, 432.9, 117.2, 433.1, 119.3, 436.5, 106.1, 431.9, +102.1, 433.0, 94.6, 422.5, 119.3, 436.5, 130.4, 454.3, 130.0, 454.6, +141.5, 472.1, 135.1, 490.1, 135.1, 490.1, 128.8, 508.0, 128.5, 505.7, +125.4, 503.4, 124.8, 503.8, 124.8, 503.8, 124.6, 503.6, 124.4, 503.4, +117.4, 500.8, 119.6, 494.7, 114.9, 486.1, 119.4, 483.8, 104.7, 454.3, +94.6, 422.5, 102.1, 433.0, 106.1, 431.9, 119.3, 436.5, 93.3, 695.5, +93.8, 702.6, 91.2, 708.1, 94.4, 709.6, 89.1, 714.5, 89.1, 714.5, +83.8, 719.4, 83.9, 719.1, 79.8, 717.4, 75.8, 715.5, 68.6, 706.3, +67.0, 706.5, 56.3, 701.2, 56.1, 701.0, 56.1, 701.0, 55.9, 700.7, +61.0, 692.4, 52.8, 687.4, 49.7, 674.1, 69.7, 671.4, 74.7, 680.8, +93.3, 695.5, 49.7, 674.1, 49.3, 672.3, 49.3, 672.3, 48.9, 670.5, +58.1, 672.3, 70.0, 661.3, 72.2, 648.9, 80.8, 650.5, 80.8, 650.5, +89.4, 652.2, 90.7, 668.6, 87.9, 684.0, 92.5, 684.9, 92.9, 690.2, +92.9, 690.2, 93.3, 695.5, 74.7, 680.8, 69.7, 671.4, 49.7, 674.1, +855.7, 644.3, 864.1, 655.0, 862.1, 657.6, 872.6, 665.6, 867.3, 669.8, +867.3, 669.8, 861.9, 674.1, 855.1, 664.1, 839.5, 674.7, 817.1, 675.3, +814.8, 664.3, 834.4, 648.1, 855.7, 644.3, 850.6, 593.0, 839.2, 607.1, +835.7, 605.4, 827.8, 621.3, 824.4, 623.7, 821.5, 619.7, 815.2, 618.2, +805.9, 616.0, 805.7, 616.5, 796.5, 613.7, 796.7, 613.2, 796.7, 613.2, +796.8, 612.7, 806.7, 608.6, 806.9, 609.0, 817.0, 605.3, 833.8, 599.1, +848.1, 589.4, 850.6, 593.0, 550.6, 346.8, 543.4, 335.2, 544.7, 334.1, +536.1, 323.7, 535.4, 316.0, 538.8, 312.6, 534.6, 308.4, 560.5, 326.1, +560.5, 326.1, 586.5, 343.8, 582.3, 356.2, 587.4, 357.9, 588.3, 372.0, +570.6, 373.5, 567.0, 362.0, 550.6, 346.8, 588.3, 372.0, 588.8, 379.2, +586.2, 380.6, 589.2, 386.5, 595.0, 392.5, 585.9, 399.5, 590.6, 408.4, +582.9, 397.1, 582.9, 397.1, 575.2, 385.9, 565.0, 365.3, 562.9, 366.3, +550.6, 346.8, 567.0, 362.0, 570.6, 373.5, 588.3, 372.0, 706.7, 478.9, +709.8, 483.0, 713.1, 483.1, 713.0, 487.0, 713.1, 488.1, 712.7, 488.6, +713.3, 489.1, 713.6, 489.3, 713.2, 490.0, 713.5, 490.2, 710.9, 503.7, +716.1, 504.7, 718.6, 519.2, 707.0, 525.6, 711.3, 533.5, 704.0, 547.8, +694.7, 516.5, 701.7, 512.8, 706.7, 478.9, 922.2, 514.6, 918.6, 541.0, +913.8, 541.2, 915.0, 567.3, 913.1, 566.1, 913.1, 566.1, 911.3, 564.9, +910.8, 564.5, 910.9, 564.3, 910.5, 563.7, 912.9, 551.4, 913.4, 551.5, +916.3, 539.2, 916.9, 536.7, 916.9, 536.7, 917.5, 534.2, 919.9, 524.4, +921.4, 524.5, 922.2, 514.6, 868.0, 523.0, 871.7, 528.3, 871.8, 528.1, +875.4, 533.5, 880.0, 540.1, 880.9, 539.6, 884.7, 546.7, 882.9, 545.5, +882.5, 544.0, 881.1, 544.3, 881.2, 544.2, 876.3, 539.0, 874.5, 539.8, +875.5, 535.3, 864.1, 532.8, 853.8, 525.7, 847.5, 522.2, 848.3, 520.8, +842.9, 516.0, 811.2, 477.0, 810.7, 477.4, 777.8, 439.4, 764.3, 422.8, +764.3, 422.8, 750.9, 406.3, 794.4, 444.7, 792.0, 447.3, 833.2, 488.3, +850.6, 505.7, 851.2, 505.1, 868.0, 523.0, 800.2, 369.8, 812.1, 386.9, +808.4, 391.3, 823.9, 404.0, 850.1, 450.0, 852.8, 448.7, 884.2, 491.5, +887.5, 513.7, 885.0, 514.4, 890.9, 536.0, 891.2, 536.4, 890.9, 536.6, +891.0, 537.3, 856.2, 473.4, 856.3, 473.3, 821.7, 409.3, 810.9, 389.5, +794.8, 382.7, 800.2, 369.8, 906.3, 160.9, 920.0, 170.9, 919.3, 171.9, +933.6, 180.8, 935.5, 182.7, 933.6, 187.9, 934.2, 187.9, 907.8, 185.9, +908.1, 182.4, 882.0, 176.8, 878.8, 176.1, 878.8, 176.1, 875.6, 175.5, +868.4, 168.9, 864.6, 173.1, 853.6, 170.8, 877.1, 159.7, 881.0, 157.7, +906.3, 160.9, 938.0, 227.0, 943.7, 234.1, 941.1, 238.1, 940.0, 248.8, +940.2, 247.6, 937.7, 247.7, 936.1, 245.9, 907.6, 209.3, 909.7, 206.5, +875.6, 175.5, 878.8, 176.1, 878.8, 176.1, 882.0, 176.8, 910.9, 200.7, +914.7, 198.1, 938.0, 227.0, 882.0, 176.8, 908.1, 182.4, 907.8, 185.9, +934.2, 187.9, 945.0, 197.5, 932.2, 225.8, 938.0, 227.0, 914.7, 198.1, +910.9, 200.7, 882.0, 176.8, 913.4, 228.8, 924.8, 237.3, 924.8, 237.3, +936.1, 245.9, 937.7, 247.7, 940.2, 247.6, 940.0, 248.8, 940.1, 248.9, +940.0, 249.0, 940.1, 249.1, 934.5, 244.9, 934.5, 244.9, 929.0, 240.6, +925.8, 238.2, 925.8, 238.2, 922.7, 235.8, 918.0, 232.3, 918.1, 232.3, +913.4, 228.8, 681.9, 99.4, 674.2, 94.0, 674.0, 93.0, 669.1, 84.8, +670.9, 84.4, 671.9, 85.1, 672.7, 84.0, 673.3, 81.8, 678.3, 83.9, +682.9, 81.8, 696.7, 78.9, 697.8, 73.4, 710.6, 75.9, 721.9, 78.2, +720.8, 83.6, 731.1, 91.4, 735.2, 94.5, 735.9, 98.2, 739.3, 97.6, +715.3, 102.1, 714.6, 98.4, 689.9, 99.1, 685.9, 99.3, 684.6, 101.2, +681.9, 99.4, 767.4, 197.3, 774.3, 201.8, 772.5, 209.7, 778.7, 210.2, +766.2, 203.2, 766.9, 201.7, 753.8, 196.2, 720.3, 174.2, 722.5, 153.6, +687.8, 150.7, 729.3, 154.2, 728.8, 172.1, 767.4, 197.3, 862.9, 277.6, +867.0, 277.9, 867.9, 276.4, 871.1, 278.3, 874.9, 280.3, 875.3, 279.8, +878.8, 282.3, 883.0, 285.2, 883.2, 288.4, 887.3, 288.2, 887.1, 288.3, +886.8, 288.3, 886.8, 288.4, 870.8, 290.2, 867.9, 292.0, 856.1, 303.1, +856.0, 302.9, 853.8, 304.2, 851.6, 305.3, 816.2, 322.3, 817.1, 324.5, +780.8, 339.3, 782.3, 338.7, 780.3, 335.4, 782.0, 333.8, 789.5, 326.7, +790.6, 327.8, 799.3, 321.8, 802.4, 319.6, 802.4, 319.6, 805.6, 317.4, +834.2, 297.5, 833.0, 295.4, 862.9, 277.6, 657.9, 132.4, 654.5, 130.0, +655.6, 128.2, 652.1, 126.1, 669.1, 137.8, 684.1, 135.7, 686.0, 149.5, +686.9, 150.1, 686.9, 150.1, 687.8, 150.7, 720.3, 173.2, 720.2, 173.3, +752.8, 195.8, 753.2, 196.1, 753.4, 195.9, 753.8, 196.2, 761.2, 199.3, +760.5, 200.8, 767.2, 205.4, 764.9, 203.8, 764.9, 203.9, 762.5, 202.3, +757.6, 199.0, 757.6, 199.0, 752.8, 195.8, 705.4, 164.1, 704.8, 164.9, +657.9, 132.4, 625.6, 107.8, 638.8, 117.0, 638.8, 117.0, 652.1, 126.1, +655.6, 128.2, 654.5, 130.0, 657.9, 132.4, 661.1, 135.9, 661.1, 135.9, +664.3, 139.4, 666.3, 141.5, 666.0, 142.0, 668.3, 143.7, 662.0, 139.2, +662.4, 138.7, 656.5, 133.7, 646.2, 125.1, 646.2, 125.1, 635.9, 116.5, +630.8, 112.2, 631.3, 111.2, 625.6, 107.8, 529.6, 223.2, 534.4, 238.6, +552.7, 230.3, 570.7, 244.0, 580.3, 256.7, 577.6, 260.4, 589.9, 269.3, +583.2, 266.0, 583.2, 266.0, 576.5, 262.7, 552.2, 244.1, 537.3, 247.9, +529.6, 223.2, 576.5, 262.7, 542.1, 245.5, 542.5, 244.8, 507.7, 228.3, +491.6, 218.8, 485.1, 223.3, 475.5, 209.3, 462.4, 196.0, 462.4, 196.0, +449.3, 182.6, 451.0, 184.5, 451.8, 183.9, 454.2, 185.1, 491.9, 204.2, +494.1, 200.7, 529.6, 223.2, 537.3, 247.9, 552.2, 244.1, 576.5, 262.7, +454.2, 185.1, 451.8, 183.9, 451.0, 184.5, 449.3, 182.6, 449.3, 182.6, +449.3, 182.6, 449.3, 182.6, 436.6, 157.6, 430.6, 159.3, 408.0, 140.6, +408.6, 140.5, 408.6, 140.5, 409.3, 140.3, 415.1, 145.5, 414.8, 145.9, +420.4, 151.4, 434.4, 165.4, 434.4, 165.4, 448.4, 179.4, 451.3, 182.2, +453.2, 181.7, 454.2, 185.1, 613.8, 318.3, 609.5, 309.1, 605.8, 299.8, +605.3, 300.0, 605.1, 297.0, 605.1, 297.0, 604.9, 294.0, 605.3, 294.2, +609.6, 291.0, 609.4, 288.2, 617.2, 292.8, 617.2, 292.8, 625.1, 297.5, +629.5, 310.4, 631.5, 313.3, 643.3, 320.2, 644.4, 323.5, 643.2, 325.5, +645.5, 326.8, 647.2, 327.6, 645.5, 330.3, 647.2, 331.9, 654.4, 331.7, +655.2, 355.4, 663.1, 378.8, 631.4, 365.8, 636.9, 349.7, 613.8, 318.3, +663.1, 378.8, 665.6, 386.2, 665.9, 393.6, 668.1, 393.5, 665.6, 394.7, +663.0, 395.4, 663.1, 395.9, 657.0, 391.8, 657.0, 391.8, 650.9, 387.6, +645.7, 384.7, 646.5, 383.2, 642.2, 378.7, 633.7, 347.0, 628.0, 348.5, +613.8, 318.3, 636.9, 349.7, 631.4, 365.8, 663.1, 378.8, 499.3, 283.8, +494.8, 281.0, 494.6, 281.3, 490.3, 278.3, 488.5, 277.1, 488.5, 277.1, +486.8, 275.9, 493.1, 279.8, 493.2, 279.7, 499.3, 283.8, 745.7, 58.1, +738.0, 64.9, 735.2, 63.3, 730.2, 71.7, 721.6, 76.1, 720.4, 73.8, +710.6, 75.9, 697.8, 73.4, 696.7, 78.9, 682.9, 81.8, 684.2, 81.2, +683.7, 80.2, 684.5, 78.6, 714.6, 67.2, 714.3, 62.8, 745.7, 58.1, +684.5, 78.6, 693.9, 59.1, 695.5, 59.7, 703.4, 39.5, 715.2, 34.3, +715.7, 35.3, 727.1, 29.1, 740.2, 32.1, 738.4, 39.7, 750.0, 50.0, +751.2, 51.1, 752.8, 51.7, 752.7, 51.9, 750.0, 51.3, 749.2, 55.0, +745.7, 58.1, 714.3, 62.8, 714.6, 67.2, 684.5, 78.6, 542.1, 33.9, +543.6, 32.5, 545.2, 32.4, 545.1, 31.1, 553.1, 61.2, 553.1, 61.2, +561.1, 91.2, 561.8, 66.9, 553.0, 66.6, 544.8, 42.1, 543.5, 38.0, +542.0, 37.9, 542.1, 33.9, 407.5, 129.4, 417.9, 114.9, 430.0, 102.1, +428.3, 100.5, 434.4, 92.1, 434.4, 92.1, 440.4, 83.6, 447.0, 74.6, +447.0, 74.6, 453.5, 65.5, 459.8, 56.7, 459.8, 56.7, 466.1, 47.9, +487.4, 18.9, 487.9, 19.2, 508.1, -10.5, 509.0, -11.6, 509.0, -11.6, +509.8, -12.8, 518.4, -24.7, 515.8, -28.1, 527.0, -36.7, 527.2, -32.2, +528.2, -32.2, 529.4, -27.8, 519.7, -10.1, 516.9, -11.6, 504.3, 4.5, +492.4, 20.0, 492.4, 20.0, 480.4, 35.4, 462.3, 58.7, 462.3, 58.7, +444.3, 82.0, 425.9, 105.7, 427.1, 106.7, 407.5, 129.4, 638.1, -51.9, +648.3, -56.7, 681.7, -32.3, 682.2, -11.8, 659.3, 3.5, 661.0, 6.1, +639.9, 23.9, 642.7, 22.6, 639.7, 16.2, 639.5, 8.4, 638.8, -21.7, +627.0, -46.6, 638.1, -51.9, 590.4, 20.7, 590.0, 21.0, 591.9, 23.2, +593.4, 25.8, 600.9, 38.2, 611.7, 42.7, 608.4, 50.5, 588.8, 67.1, +588.0, 66.3, 569.1, 83.6, 568.2, 78.7, 569.0, 78.4, 567.3, 73.7, +562.9, 63.6, 565.2, 62.6, 563.1, 51.4, 570.9, 33.5, 574.9, 33.8, +590.4, 20.7, 563.1, 51.4, 560.4, 36.7, 560.4, 36.7, 557.7, 22.0, +558.4, 22.2, 563.3, 3.6, 568.9, -14.7, 567.4, -13.1, 573.7, -6.8, +578.5, 1.0, 583.6, 9.6, 583.6, 9.6, 588.8, 18.1, 589.6, 19.4, +590.7, 20.3, 590.4, 20.7, 574.9, 33.8, 570.9, 33.5, 563.1, 51.4, +381.2, 91.7, 379.0, 83.0, 379.0, 83.0, 376.8, 74.3, 398.1, 75.3, +406.4, 74.7, 420.2, 60.1, 422.4, 62.5, 422.7, 62.3, 424.5, 65.0, +424.7, 65.3, 424.7, 65.3, 424.9, 65.5, 429.1, 70.4, 432.4, 75.9, +433.3, 75.3, 410.5, 89.0, 407.1, 92.2, 381.2, 91.7, 433.3, 75.3, +436.2, 74.9, 441.1, 80.3, 440.4, 83.6, 434.4, 92.1, 434.4, 92.1, +428.3, 100.5, 419.0, 91.7, 405.6, 101.1, 385.5, 108.7, 383.3, 100.2, +383.3, 100.2, 381.2, 91.7, 407.1, 92.2, 410.5, 89.0, 433.3, 75.3, +389.3, 14.2, 383.0, 5.0, 383.0, 5.0, 376.6, -4.2, 390.5, 7.5, +392.6, 4.9, 408.7, 14.0, 405.6, 9.6, 396.6, 18.3, 389.3, 14.2, +436.9, -32.1, 422.6, -36.7, 419.5, -26.5, 402.0, -21.5, 401.0, -21.6, +400.6, -21.2, 400.1, -21.7, 390.0, -26.2, 383.0, -17.7, 376.9, -24.1, +371.8, -27.7, 369.8, -25.0, 362.6, -25.6, 370.0, -27.5, 370.0, -27.5, +377.4, -29.4, 407.0, -32.0, 410.3, -40.7, 436.9, -32.1, 377.4, -29.4, +388.0, -32.1, 387.8, -33.8, 398.6, -34.9, 399.3, -35.1, 399.3, -34.9, +400.0, -35.1, 407.0, -36.9, 407.0, -37.0, 414.0, -38.8, 441.9, -46.0, +441.9, -45.9, 469.8, -53.0, 471.6, -53.4, 471.6, -53.4, 473.5, -53.9, +508.4, -62.5, 508.4, -62.5, 543.4, -71.1, 543.5, -71.2, 546.8, -66.8, +549.1, -67.4, 548.5, -66.6, 548.5, -66.6, 548.0, -65.9, 523.9, -58.0, +523.8, -58.5, 499.5, -51.2, 493.8, -49.4, 493.8, -49.4, 488.0, -47.7, +474.0, -43.4, 474.0, -43.4, 460.0, -39.1, 448.4, -35.6, 448.7, -33.5, +436.9, -32.1, 410.3, -40.7, 407.0, -32.0, 377.4, -29.4, 413.6, -20.3, +407.8, -20.9, 407.8, -20.9, 402.0, -21.5, 419.5, -26.5, 422.6, -36.7, +436.9, -32.1, 448.7, -33.5, 448.4, -35.6, 460.0, -39.1, 437.7, -27.9, +437.4, -27.6, 413.6, -20.3, 262.6, 59.6, 266.1, 47.2, 266.1, 47.2, +269.6, 34.9, 275.0, 35.4, 273.9, 47.9, 278.3, 61.0, 280.9, 68.7, +282.6, 68.5, 283.5, 76.5, 283.3, 74.8, 281.6, 75.0, 279.7, 73.4, +278.0, 72.0, 278.0, 72.0, 276.3, 70.7, 269.4, 65.1, 263.8, 66.2, +262.6, 59.6, 258.3, 282.1, 242.0, 274.1, 239.8, 263.1, 225.8, 266.0, +226.1, 264.6, 220.4, 263.4, 215.0, 260.7, 215.6, 260.1, 215.2, 259.7, +215.5, 258.6, 231.4, 266.1, 230.9, 267.1, 246.4, 275.6, 252.4, 278.8, +252.2, 279.3, 258.3, 282.1, 328.2, 263.3, 327.4, 271.4, 317.3, 278.9, +316.7, 278.6, 304.2, 270.5, 309.3, 262.4, 302.0, 246.3, 292.6, 225.6, +289.8, 226.5, 283.1, 204.9, 281.7, 200.4, 287.8, 196.8, 285.8, 194.3, +306.2, 219.1, 302.8, 221.9, 319.8, 249.5, 324.0, 256.4, 328.9, 256.9, +328.2, 263.3, 302.0, 246.3, 309.3, 262.4, 304.2, 270.5, 316.7, 278.6, +317.4, 281.6, 313.8, 282.4, 310.9, 286.3, 304.9, 294.2, 305.5, 301.5, +298.9, 302.1, 287.0, 303.2, 286.3, 295.9, 273.8, 289.7, 273.2, 289.5, +272.7, 289.1, 272.7, 289.2, 286.8, 267.4, 283.3, 250.8, 302.0, 246.3, +272.7, 289.2, 272.7, 289.2, 272.6, 289.1, 272.4, 289.1, 272.4, 286.8, +267.9, 286.8, 263.4, 284.6, 262.5, 271.2, 266.8, 270.9, 270.2, 257.1, +276.7, 231.0, 269.4, 209.6, 283.1, 204.9, 289.8, 226.5, 292.6, 225.6, +302.0, 246.3, 283.3, 250.8, 286.8, 267.4, 272.7, 289.2, 355.1, 114.2, +354.4, 113.6, 355.4, 111.8, 354.9, 111.6, 355.9, 114.6, 357.8, 114.0, +360.7, 116.3, 360.6, 115.1, 357.3, 116.0, 355.1, 114.2, 290.3, 313.5, +264.4, 347.9, 264.3, 347.9, 238.3, 382.2, 230.2, 388.0, 231.9, 390.5, +225.7, 398.9, 200.5, 426.6, 203.0, 428.9, 180.4, 458.9, 176.5, 467.1, +171.8, 464.8, 163.2, 470.8, 180.2, 443.2, 183.7, 445.4, 204.3, 420.0, +243.4, 371.5, 243.4, 371.5, 282.5, 323.1, 284.3, 320.9, 284.3, 320.9, +286.0, 318.8, 288.1, 316.1, 288.2, 316.2, 290.3, 313.5, 176.4, 420.6, +168.2, 442.5, 164.8, 441.2, 153.1, 461.8, 153.0, 462.3, 152.8, 462.2, +152.7, 462.6, 167.5, 420.8, 166.8, 420.5, 182.4, 379.0, 181.0, 382.6, +181.8, 382.9, 181.3, 386.7, 178.8, 403.7, 182.3, 404.9, 176.4, 420.6, +177.5, 256.5, 178.6, 254.5, 179.3, 254.6, 179.6, 252.5, 203.3, 213.2, +200.9, 211.7, 222.2, 171.0, 225.6, 158.8, 229.8, 160.1, 235.8, 148.5, +235.5, 149.5, 235.5, 149.5, 235.3, 150.5, 230.0, 160.7, 229.8, 160.6, +224.3, 170.6, 214.9, 187.9, 214.9, 187.9, 205.5, 205.2, 192.6, 228.8, +192.5, 228.8, 179.6, 252.5, 179.3, 254.6, 178.6, 254.5, 177.5, 256.5, +146.0, 348.1, 145.8, 345.7, 145.5, 345.7, 145.6, 343.2, 146.0, 329.6, +141.9, 317.5, 146.4, 316.0, 151.6, 306.0, 151.6, 306.0, 156.8, 296.1, +155.4, 298.3, 156.2, 298.9, 155.7, 301.6, 154.8, 305.8, 154.8, 305.8, +154.0, 309.9, 150.0, 329.0, 150.8, 329.2, 146.0, 348.1, 159.0, 237.4, +147.8, 258.1, 146.3, 257.4, 136.6, 278.7, 137.5, 255.7, 137.5, 255.7, +138.4, 232.7, 155.7, 212.2, 153.4, 210.2, 168.4, 187.8, 169.4, 188.0, +167.3, 213.8, 159.0, 237.4, 168.4, 187.8, 200.4, 140.1, 204.5, 142.4, +232.3, 92.4, 235.7, 87.8, 236.4, 88.2, 239.2, 83.3, 219.1, 123.5, +219.1, 123.5, 199.0, 163.7, 206.9, 171.3, 179.0, 200.6, 159.0, 237.4, +167.3, 213.8, 169.4, 188.0, 168.4, 187.8, 471.9, 840.0, 468.5, 791.8, +468.5, 791.8, 465.1, 743.6, 463.7, 718.3, 464.4, 718.2, 463.6, 692.9, +463.5, 690.2, 463.4, 690.2, 463.3, 687.6, 463.2, 686.9, 463.2, 686.2, +463.2, 686.2, 463.2, 686.2, 463.2, 686.9, 463.3, 687.6, 463.4, 690.2, +463.5, 690.2, 463.6, 692.9, 467.8, 766.4, 469.7, 766.4, 471.9, 840.0, +704.6, 772.1, 709.6, 768.3, 709.0, 767.6, 713.4, 763.0, 716.6, 759.7, +716.6, 759.7, 719.8, 756.4, 725.4, 750.5, 725.4, 750.5, 731.1, 744.7, +735.2, 740.4, 735.2, 740.4, 739.3, 736.1, 751.8, 723.2, 750.1, 721.0, +764.3, 710.3, 765.7, 712.6, 766.5, 712.4, 767.2, 714.9, 768.1, 717.4, +768.7, 717.2, 770.2, 719.5, 739.2, 747.8, 738.0, 746.6, 704.6, 772.1, +530.8, 680.6, 529.6, 688.2, 529.9, 688.2, 529.0, 695.8, 526.4, 716.5, +526.4, 716.5, 523.8, 737.3, 519.5, 772.2, 519.5, 772.2, 515.2, 807.1, +512.6, 828.3, 512.6, 828.3, 510.0, 849.6, 508.0, 865.3, 511.1, 866.3, +506.1, 880.9, 505.7, 882.1, 499.2, 880.7, 499.2, 881.1, 505.3, 820.4, +508.7, 820.8, 518.2, 760.4, 524.5, 720.5, 524.2, 720.5, 530.8, 680.6, +504.4, 759.9, 504.4, 760.3, 504.4, 760.3, 504.3, 760.8, 496.6, 802.0, +496.7, 802.1, 490.8, 843.6, 489.1, 837.4, 485.8, 836.4, 487.4, 831.1, +486.4, 819.9, 486.4, 819.9, 485.3, 808.6, 485.3, 808.6, 483.9, 793.3, +482.5, 778.1, 485.1, 756.8, 480.5, 747.8, 494.2, 736.4, 491.4, 738.7, +499.5, 748.0, 504.4, 759.9, 494.2, 736.4, 501.4, 685.9, 537.8, 673.8, +521.8, 637.3, 512.1, 698.4, 513.1, 698.6, 504.4, 759.9, 499.5, 748.0, +491.4, 738.7, 494.2, 736.4, 572.6, 410.9, 576.4, 416.8, 576.4, 416.8, +580.1, 422.7, 579.7, 424.1, 580.0, 424.7, 580.8, 426.0, 580.2, 430.4, +579.6, 430.3, 578.5, 434.6, 577.9, 436.5, 578.4, 438.1, 577.4, 438.4, +563.8, 442.5, 563.3, 440.9, 549.3, 443.3, 545.6, 443.9, 543.5, 442.4, +541.9, 444.6, 555.1, 426.2, 553.8, 421.7, 572.6, 410.9, 482.0, 772.1, +480.0, 750.5, 480.1, 750.5, 478.0, 728.9, 478.3, 721.1, 484.7, 720.8, +484.0, 713.4, 486.7, 742.4, 492.0, 746.3, 482.0, 772.1, 446.9, 345.2, +448.3, 351.9, 446.0, 352.4, 445.1, 359.6, 444.8, 361.9, 444.1, 362.0, +444.5, 364.1, 443.9, 357.8, 443.9, 357.8, 443.4, 351.4, 443.8, 348.2, +447.5, 347.8, 446.9, 345.2, 406.2, 718.4, 412.9, 726.6, 407.7, 747.1, +403.8, 747.8, 396.2, 749.3, 393.5, 735.4, 383.3, 722.9, 376.1, 714.2, +374.3, 704.6, 369.0, 705.6, 385.7, 702.3, 395.6, 705.4, 406.2, 718.4, +451.5, 559.9, 451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 452.6, 578.7, +452.6, 578.7, 452.8, 581.9, 453.1, 588.3, 453.1, 588.3, 453.5, 594.6, +455.3, 625.3, 455.3, 625.3, 457.1, 655.9, 457.9, 669.3, 457.9, 669.3, +458.7, 682.6, 460.2, 708.3, 460.1, 708.3, 461.7, 734.0, 463.2, 759.1, +463.3, 759.1, 464.9, 784.3, 464.9, 784.9, 464.8, 784.9, 464.7, 785.5, +463.1, 759.8, 463.2, 759.7, 461.7, 734.0, 460.1, 708.3, 460.2, 708.3, +458.7, 682.6, 457.9, 669.3, 457.9, 669.3, 457.1, 655.9, 455.3, 625.3, +455.3, 625.3, 453.5, 594.6, 453.1, 588.3, 453.1, 588.3, 452.8, 581.9, +452.6, 578.7, 452.6, 578.7, 452.4, 575.5, 451.9, 567.7, 451.9, 567.7, +451.5, 559.9, 358.6, 780.4, 359.1, 775.3, 359.2, 775.3, 359.7, 770.2, +360.0, 767.1, 360.0, 767.1, 360.3, 764.1, 360.9, 758.8, 360.9, 758.8, +361.4, 753.6, 362.4, 743.8, 362.4, 743.8, 363.4, 734.1, 364.4, 724.0, +361.6, 722.8, 365.4, 714.0, 365.5, 713.7, 365.5, 713.7, 365.5, 713.5, +364.5, 723.8, 364.5, 723.8, 363.4, 734.1, 362.4, 743.8, 362.4, 743.8, +361.4, 753.6, 360.9, 758.8, 360.9, 758.8, 360.3, 764.1, 360.0, 767.1, +360.0, 767.1, 359.7, 770.2, 359.2, 775.3, 359.1, 775.3, 358.6, 780.4, +419.4, 196.3, 422.1, 218.7, 422.1, 218.7, 424.8, 241.2, 425.0, 242.8, +424.8, 242.9, 424.7, 244.6, 423.4, 234.8, 423.6, 234.8, 422.5, 225.0, +421.0, 210.6, 421.3, 210.6, 419.4, 196.3, 356.8, 749.4, 350.3, 776.3, +345.5, 776.0, 343.8, 803.1, 354.5, 813.4, 336.9, 831.8, 329.9, 860.4, +330.6, 857.7, 330.0, 857.6, 330.6, 854.9, 343.4, 802.1, 343.4, 802.1, +356.8, 749.4, 369.0, 519.0, 376.4, 514.0, 386.1, 528.3, 403.2, 537.7, +403.4, 537.8, 403.4, 537.8, 403.6, 538.0, 405.6, 539.1, 407.7, 539.3, +407.6, 540.2, 405.2, 559.0, 409.8, 571.4, 398.6, 577.3, 394.5, 579.5, +387.8, 566.8, 377.0, 556.3, 376.7, 556.1, 376.5, 556.1, 376.5, 555.8, +372.5, 537.4, 363.0, 523.0, 369.0, 519.0, 376.5, 555.8, 376.3, 552.5, +373.2, 552.6, 370.0, 549.5, 362.3, 542.1, 362.3, 542.1, 354.7, 534.6, +341.8, 522.1, 341.8, 522.1, 329.0, 509.6, 314.1, 495.1, 316.5, 484.7, +299.2, 480.6, 336.5, 489.3, 341.5, 492.2, 369.0, 519.0, 363.0, 523.0, +372.5, 537.4, 376.5, 555.8, 403.2, 537.7, 386.1, 528.3, 376.4, 514.0, +369.0, 519.0, 341.5, 492.2, 336.5, 489.3, 299.2, 480.6, 295.0, 478.2, +296.3, 475.1, 292.1, 473.7, 302.0, 476.9, 301.3, 479.0, 310.5, 484.3, +356.8, 511.0, 357.2, 510.5, 403.2, 537.7, 324.0, 409.5, 317.7, 409.2, +311.5, 396.8, 312.2, 396.0, 316.9, 390.7, 323.6, 396.7, 334.9, 397.3, +338.5, 397.5, 340.5, 399.4, 342.0, 397.7, 335.1, 405.5, 332.6, 410.0, +324.0, 409.5, 278.7, 425.6, 285.6, 411.6, 288.9, 412.4, 292.4, 397.5, +267.8, 486.1, 267.7, 486.1, 242.9, 574.7, 250.8, 548.1, 249.4, 547.7, +255.8, 520.7, 267.2, 473.2, 267.2, 473.2, 278.6, 425.7, 278.7, 425.6, +278.7, 425.6, 278.7, 425.6, 278.6, 425.7, 275.1, 429.0, 276.4, 430.3, +274.1, 435.0, 273.4, 436.3, 273.4, 436.3, 272.8, 437.6, 262.3, 459.0, +262.3, 459.0, 251.8, 480.4, 239.7, 505.1, 242.2, 506.7, 227.6, 529.8, +228.1, 523.5, 229.2, 517.3, 228.5, 517.2, 231.2, 498.1, 229.9, 497.9, +231.3, 478.7, 230.4, 476.9, 233.1, 475.5, 234.8, 472.2, 256.1, 448.4, +255.5, 447.6, 278.6, 425.7, 234.8, 472.2, 256.9, 432.0, 258.1, 432.7, +278.9, 391.8, 294.0, 364.3, 294.0, 364.3, 309.1, 336.7, 309.4, 336.0, +309.5, 336.0, 309.8, 335.3, 301.3, 366.5, 302.9, 367.1, 292.4, 397.5, +288.9, 412.4, 285.6, 411.6, 278.7, 425.6, 278.7, 425.6, 278.7, 425.6, +278.6, 425.7, 255.5, 447.6, 256.1, 448.4, 234.8, 472.2, 173.4, 823.0, +173.4, 823.1, 173.5, 823.2, 173.5, 823.2, 169.0, 836.5, 163.8, 836.8, +164.5, 849.8, 156.3, 851.7, 151.6, 841.8, 142.6, 830.7, 142.7, 830.7, +142.6, 826.8, 142.6, 822.9, 142.6, 817.6, 142.3, 817.6, 142.6, 812.3, +142.5, 801.1, 143.7, 801.1, 144.7, 789.8, 143.9, 791.3, 147.5, 793.0, +150.3, 796.2, 161.8, 809.6, 161.9, 809.6, 173.4, 823.0, 119.8, 323.7, +124.1, 343.2, 127.0, 342.9, 128.3, 362.6, 128.7, 366.0, 129.2, 369.3, +129.2, 369.3, 130.6, 382.7, 130.6, 382.7, 132.1, 396.2, 124.8, 369.2, +120.5, 370.3, 108.8, 344.5, 107.3, 335.3, 122.1, 325.8, 119.8, 323.7, +63.0, 185.6, 57.2, 200.1, 54.3, 199.5, 51.4, 214.6, 49.9, 210.5, +49.9, 210.5, 48.4, 206.4, 53.0, 194.9, 65.5, 192.5, 63.0, 185.6, +105.4, 363.9, 106.3, 366.5, 106.3, 366.5, 107.3, 369.1, 122.3, 400.9, +118.4, 402.7, 129.6, 436.3, 129.3, 435.7, 129.0, 435.8, 128.4, 435.2, +120.2, 413.2, 111.2, 416.5, 94.0, 397.8, 89.6, 384.1, 97.9, 380.0, +105.4, 363.9, 94.0, 397.8, 88.1, 391.4, 88.2, 391.3, 82.2, 384.9, +79.3, 381.0, 75.7, 380.0, 76.5, 377.0, 76.4, 376.3, 75.1, 375.7, +75.3, 375.5, 75.5, 375.2, 74.8, 374.8, 74.3, 374.1, 74.1, 374.0, +74.2, 373.9, 74.1, 373.8, 75.7, 359.1, 74.5, 359.0, 75.0, 344.2, +75.0, 344.2, 90.3, 334.3, 90.8, 323.7, 98.1, 343.8, 98.1, 343.8, +105.4, 363.9, 97.9, 380.0, 89.6, 384.1, 94.0, 397.8, 804.3, 668.0, +797.3, 661.3, 797.3, 661.3, 790.4, 654.6, 793.9, 640.3, 795.5, 639.4, +793.8, 625.1, 794.2, 623.3, 794.7, 621.4, 794.7, 621.4, 795.2, 621.3, +796.2, 619.0, 795.5, 618.0, 795.4, 618.0, 796.0, 615.9, 796.5, 613.7, +805.7, 616.5, 805.9, 616.0, 815.2, 618.2, 818.6, 641.9, 817.6, 648.5, +804.3, 668.0, 815.2, 618.2, 821.5, 619.7, 824.4, 623.7, 827.8, 621.3, +828.2, 620.5, 831.7, 622.2, 835.7, 623.1, 838.1, 626.0, 838.6, 626.1, +842.2, 627.4, 849.0, 635.9, 849.0, 635.9, 855.7, 644.3, 834.4, 648.1, +814.8, 664.3, 817.1, 675.3, 814.5, 675.3, 814.5, 675.3, 811.9, 675.4, +809.7, 676.2, 808.1, 671.7, 804.3, 668.0, 817.6, 648.5, 818.6, 641.9, +815.2, 618.2, 813.9, 548.1, 824.6, 557.5, 824.6, 557.5, 835.3, 566.8, +837.5, 568.8, 837.4, 568.9, 839.5, 570.9, 839.5, 570.9, 847.4, 578.7, +855.2, 586.5, 834.2, 567.7, 833.9, 567.9, 813.9, 548.1, 703.1, 474.3, +704.9, 476.6, 704.9, 476.6, 706.7, 478.9, 701.7, 512.8, 694.7, 516.5, +704.0, 547.8, 700.6, 554.3, 700.6, 554.3, 697.3, 560.8, 694.3, 542.7, +698.6, 542.0, 699.8, 523.1, 700.3, 515.6, 700.3, 515.6, 700.8, 508.2, +701.6, 497.2, 701.6, 497.2, 702.3, 486.2, 702.5, 483.1, 702.5, 483.1, +702.7, 480.0, 702.8, 478.7, 702.8, 478.7, 702.9, 477.3, 703.0, 475.8, +703.5, 474.5, 703.1, 474.3, 918.1, 484.0, 921.1, 492.4, 921.1, 492.4, +924.1, 500.9, 926.8, 505.5, 923.1, 507.7, 922.2, 514.6, 921.4, 524.5, +919.9, 524.4, 917.5, 534.2, 914.2, 509.6, 913.3, 508.2, 918.1, 484.0, +765.5, 384.9, 812.7, 448.1, 811.2, 449.2, 859.8, 511.3, 863.9, 517.2, +863.9, 517.2, 868.0, 523.0, 851.2, 505.1, 850.6, 505.7, 833.2, 488.3, +796.5, 438.8, 810.5, 423.8, 765.5, 384.9, 833.2, 488.3, 792.0, 447.3, +794.4, 444.7, 750.9, 406.3, 745.1, 399.2, 746.0, 393.0, 739.4, 392.2, +751.7, 387.5, 751.7, 387.5, 764.0, 382.8, 763.8, 383.1, 764.8, 383.9, +765.5, 384.9, 810.5, 423.8, 796.5, 438.8, 833.2, 488.3, 789.5, 387.2, +786.9, 381.2, 788.2, 380.2, 784.2, 375.2, 792.1, 372.2, 792.1, 372.2, +799.9, 369.3, 800.0, 369.2, 800.1, 369.5, 800.2, 369.8, 794.8, 382.7, +810.9, 389.5, 821.7, 409.3, 820.1, 403.3, 814.9, 404.7, 808.2, 400.0, +798.9, 393.6, 797.2, 395.2, 789.5, 387.2, 875.3, 138.2, 890.8, 149.6, +890.8, 149.6, 906.3, 160.9, 881.0, 157.7, 877.1, 159.7, 853.6, 170.8, +841.7, 168.3, 840.9, 163.7, 829.8, 165.7, 822.6, 162.9, 818.5, 154.8, +816.9, 156.1, 832.1, 143.9, 836.9, 149.9, 857.0, 143.8, 866.1, 141.0, +868.0, 135.7, 875.3, 138.2, 839.8, 173.3, 876.6, 201.0, 876.6, 201.0, +913.4, 228.8, 918.1, 232.3, 918.0, 232.3, 922.7, 235.8, 881.2, 204.6, +881.1, 204.8, 839.8, 173.3, 774.9, 157.7, 800.5, 192.0, 799.6, 193.6, +817.9, 232.4, 812.6, 229.4, 812.6, 229.4, 807.2, 226.4, 799.9, 216.7, +801.9, 215.2, 796.7, 204.0, 785.8, 180.8, 789.9, 177.8, 774.9, 157.7, +742.1, 168.4, 748.6, 172.2, 747.3, 174.3, 752.5, 180.3, 759.9, 188.8, +758.0, 193.0, 767.4, 197.3, 728.8, 172.1, 729.3, 154.2, 687.8, 150.7, +686.9, 150.1, 686.9, 150.1, 686.0, 149.5, 683.8, 133.2, 668.7, 135.3, +651.4, 121.1, 699.3, 137.2, 698.0, 142.6, 742.1, 168.4, 799.3, 321.8, +790.6, 327.8, 789.5, 326.7, 782.0, 333.8, 782.8, 333.4, 782.3, 332.4, +782.6, 330.9, 783.7, 325.5, 781.7, 321.8, 784.9, 320.1, 790.0, 317.2, +799.1, 322.4, 799.3, 321.8, 664.3, 139.4, 661.1, 135.9, 661.1, 135.9, +657.9, 132.4, 704.8, 164.9, 705.4, 164.1, 752.8, 195.8, 716.3, 163.2, +711.0, 169.1, 669.2, 142.5, 666.8, 140.9, 666.5, 141.3, 664.3, 139.4, +658.2, 159.9, 633.0, 146.5, 634.7, 139.2, 607.9, 133.0, 589.3, 120.3, +589.3, 120.3, 570.7, 107.6, 572.4, 108.8, 572.5, 108.7, 574.2, 109.7, +593.2, 121.1, 593.2, 121.1, 612.2, 132.4, 635.2, 146.2, 637.3, 162.6, +658.2, 159.9, 549.5, 216.0, 560.1, 230.0, 560.1, 230.0, 570.7, 244.0, +552.7, 230.3, 534.4, 238.6, 529.6, 223.2, 494.1, 200.7, 491.9, 204.2, +454.2, 185.1, 453.2, 181.7, 451.3, 182.2, 448.4, 179.4, 466.8, 183.8, +466.3, 185.9, 484.2, 192.4, 511.4, 202.2, 511.4, 202.2, 538.5, 212.0, +544.0, 214.0, 545.7, 212.3, 549.5, 216.0, 468.4, 248.2, 463.1, 244.0, +464.6, 242.2, 460.7, 236.1, 452.5, 223.3, 456.0, 216.4, 444.3, 210.5, +492.1, 245.1, 492.6, 244.5, 541.6, 277.4, 542.2, 278.2, 542.2, 278.3, +542.8, 279.0, 536.5, 273.8, 530.8, 280.7, 518.8, 282.5, 491.3, 271.0, +492.2, 267.1, 468.4, 248.2, 518.8, 282.5, 510.0, 283.7, 505.9, 288.8, +501.2, 285.0, 500.2, 284.4, 500.2, 284.4, 499.3, 283.8, 493.2, 279.7, +493.1, 279.8, 486.8, 275.9, 486.2, 275.5, 486.0, 275.6, 485.7, 275.1, +482.9, 270.8, 481.8, 271.2, 480.2, 266.5, 477.7, 262.6, 477.7, 262.6, +475.1, 258.7, 471.8, 253.4, 473.2, 250.8, 468.4, 248.2, 492.2, 267.1, +491.3, 271.0, 518.8, 282.5, 504.3, 4.5, 516.9, -11.6, 519.7, -10.1, +529.4, -27.8, 529.8, -26.1, 529.7, -26.0, 530.3, -24.4, 538.8, -5.6, +535.7, -4.2, 541.1, 16.0, 525.8, 22.1, 528.8, 29.4, 516.5, 42.7, +516.9, 42.3, 516.0, 41.4, 515.6, 40.0, 510.5, 23.9, 510.5, 23.9, +505.4, 7.7, 504.9, 6.1, 503.8, 5.4, 504.3, 4.5, 639.5, 8.4, +639.7, 16.2, 642.7, 22.6, 639.9, 23.9, 624.1, 37.2, 624.1, 37.2, +608.4, 50.5, 611.7, 42.7, 600.9, 38.2, 593.4, 25.8, 593.3, 25.3, +597.4, 24.3, 601.4, 22.8, 610.8, 19.2, 610.8, 19.2, 620.2, 15.7, +624.8, 14.0, 624.8, 14.0, 629.3, 12.3, 634.4, 10.4, 638.2, 7.0, +639.5, 8.4, 453.5, 65.5, 447.0, 74.6, 447.0, 74.6, 440.4, 83.6, +441.1, 80.3, 436.2, 74.9, 433.3, 75.3, 432.4, 75.9, 429.1, 70.4, +424.9, 65.5, 436.5, 59.9, 447.5, 58.4, 453.5, 65.5, 450.5, -16.5, +432.0, -18.4, 432.0, -18.4, 413.6, -20.3, 437.4, -27.6, 437.7, -27.9, +460.0, -39.1, 474.0, -43.4, 474.0, -43.4, 488.0, -47.7, 479.7, -27.7, +472.1, -24.4, 450.5, -16.5, 265.1, 182.1, 248.9, 202.2, 226.0, 217.1, +225.3, 216.3, 232.4, 185.6, 232.4, 185.6, 239.6, 154.9, 239.5, 155.4, +240.3, 155.6, 240.9, 156.3, 249.7, 165.6, 249.7, 165.6, 258.5, 175.0, +261.8, 178.5, 265.5, 181.5, 265.1, 182.1, 286.3, 163.8, 287.4, 159.2, +290.1, 157.2, 295.2, 156.1, 293.8, 156.4, 295.6, 160.6, 293.7, 162.2, +291.1, 164.4, 286.7, 162.2, 286.3, 163.8, 319.8, 249.5, 302.8, 221.9, +306.2, 219.1, 285.8, 194.3, 281.7, 180.7, 289.7, 178.2, 293.7, 162.2, +295.6, 160.6, 293.8, 156.4, 295.2, 156.1, 298.4, 143.3, 298.4, 143.3, +301.6, 130.4, 301.6, 130.4, 301.5, 130.3, 301.5, 130.3, 301.5, 130.3, +301.6, 130.4, 301.6, 130.4, 310.7, 190.0, 333.2, 195.5, 319.8, 249.5, +301.6, 130.4, 302.9, 144.6, 306.2, 144.2, 310.9, 158.1, 320.4, 186.5, +320.4, 186.5, 329.9, 214.9, 331.8, 220.7, 331.8, 220.7, 333.8, 226.6, +330.2, 231.4, 334.1, 239.5, 340.6, 246.9, 340.9, 248.6, 339.1, 248.9, +337.6, 250.9, 332.9, 257.1, 332.4, 263.6, 328.2, 263.3, 328.9, 256.9, +324.0, 256.4, 319.8, 249.5, 333.2, 195.5, 310.7, 190.0, 301.6, 130.4, +356.7, 139.2, 350.2, 134.3, 353.0, 126.2, 355.1, 114.2, 357.3, 116.0, +360.6, 115.1, 360.7, 116.3, 381.1, 132.7, 381.1, 132.7, 401.4, 149.1, +401.6, 148.1, 373.4, 151.7, 356.7, 139.2, 299.7, 125.0, 289.1, 108.1, +282.8, 103.1, 286.7, 86.0, 287.4, 82.9, 297.8, 85.2, 308.9, 84.4, +315.9, 83.9, 321.9, 81.1, 323.0, 83.4, 325.0, 87.7, 319.0, 90.5, +315.0, 97.6, 310.1, 106.4, 310.1, 106.4, 305.2, 115.3, 302.5, 120.1, +298.3, 122.7, 299.7, 125.0, 181.3, 386.7, 181.8, 382.9, 181.0, 382.6, +182.4, 379.0, 186.4, 367.7, 186.4, 367.7, 190.4, 356.3, 188.2, 371.8, +186.6, 371.8, 181.3, 386.7, 224.3, 170.6, 229.8, 160.6, 230.0, 160.7, +235.3, 150.5, 231.1, 165.6, 231.1, 165.6, 226.9, 180.6, 227.0, 180.2, +226.8, 180.1, 226.7, 179.6, 225.5, 175.1, 223.2, 174.4, 224.3, 170.6, +155.7, 301.6, 156.2, 298.9, 155.4, 298.3, 156.8, 296.1, 157.4, 294.9, +157.1, 294.1, 158.1, 293.8, 165.8, 287.7, 163.1, 284.1, 168.1, 274.5, +182.5, 266.1, 189.3, 262.0, 202.7, 267.7, 200.1, 277.3, 200.1, 277.3, +197.4, 286.9, 194.8, 290.7, 192.0, 288.8, 186.7, 290.7, 179.3, 293.3, +179.3, 293.3, 172.0, 295.9, 171.2, 296.2, 171.2, 296.2, 170.5, 296.4, +164.9, 298.4, 164.9, 298.4, 159.2, 300.4, 157.5, 301.0, 155.8, 301.9, +155.7, 301.6, 474.7, 878.3, 473.3, 859.1, 473.3, 859.1, 471.9, 840.0, +469.7, 766.4, 467.8, 766.4, 463.6, 692.9, 463.5, 690.2, 463.4, 690.2, +463.3, 687.6, 463.4, 690.2, 463.5, 690.2, 463.6, 692.9, 467.8, 766.4, +469.7, 766.4, 471.9, 840.0, 473.3, 859.1, 473.3, 859.1, 474.7, 878.3, +703.6, 773.3, 704.1, 772.7, 704.0, 772.6, 704.6, 772.1, 738.0, 746.6, +739.2, 747.8, 770.2, 719.5, 770.4, 719.9, 770.8, 720.0, 770.7, 720.3, +771.7, 726.6, 776.6, 732.6, 778.2, 732.1, 769.4, 744.7, 763.0, 739.6, +750.0, 750.0, 696.0, 793.3, 704.4, 809.3, 644.3, 839.4, 681.2, 820.9, +673.9, 806.3, 703.6, 773.3, 644.3, 839.4, 633.2, 850.9, 632.6, 850.6, +619.8, 860.2, 624.5, 856.6, 623.9, 855.9, 628.1, 851.5, 661.0, 817.4, +661.0, 817.4, 693.8, 783.4, 698.7, 778.3, 698.9, 778.5, 703.6, 773.3, +673.9, 806.3, 681.2, 820.9, 644.3, 839.4, 518.2, 760.4, 508.7, 820.8, +505.3, 820.4, 499.2, 881.1, 499.0, 882.0, 494.5, 882.9, 492.0, 881.3, +490.7, 880.5, 491.8, 878.8, 491.6, 876.2, 490.2, 868.5, 490.8, 868.4, +490.1, 860.6, 493.4, 859.1, 491.7, 854.3, 491.9, 847.9, 495.9, 826.7, +495.0, 826.5, 498.0, 805.1, 499.1, 794.7, 500.0, 794.8, 501.9, 784.4, +507.8, 771.4, 517.9, 772.6, 518.2, 760.4, 501.9, 784.4, 516.1, 671.5, +522.3, 672.2, 543.4, 560.1, 544.6, 555.9, 545.0, 555.9, 545.8, 551.6, +546.7, 548.5, 546.1, 548.2, 547.5, 545.3, 546.7, 546.9, 547.3, 547.2, +547.1, 549.0, 545.2, 564.5, 545.2, 564.5, 543.2, 580.0, 542.6, 585.6, +542.6, 585.6, 541.9, 591.3, 540.1, 605.1, 540.1, 605.1, 538.4, 619.0, +537.3, 627.8, 537.3, 627.8, 536.3, 636.7, 533.8, 656.3, 533.8, 656.3, +531.4, 675.9, 531.1, 678.3, 531.2, 678.3, 530.8, 680.6, 524.2, 720.5, +524.5, 720.5, 518.2, 760.4, 517.9, 772.6, 507.8, 771.4, 501.9, 784.4, +563.3, 396.4, 568.0, 403.6, 568.0, 403.6, 572.6, 410.9, 553.8, 421.7, +555.1, 426.2, 541.9, 444.6, 541.1, 445.4, 540.4, 444.8, 539.0, 445.1, +528.2, 446.9, 528.2, 446.9, 517.4, 448.8, 509.5, 450.2, 501.5, 451.9, +501.5, 451.5, 510.3, 443.7, 507.4, 440.4, 513.3, 429.3, 535.4, 409.6, +535.8, 404.9, 563.3, 396.4, 513.3, 429.3, 529.4, 398.9, 533.3, 400.4, +545.5, 368.5, 554.4, 382.5, 554.4, 382.5, 563.3, 396.4, 535.8, 404.9, +535.4, 409.6, 513.3, 429.3, 526.6, 620.2, 524.2, 628.7, 523.2, 628.6, +521.8, 637.3, 537.8, 673.8, 501.4, 685.9, 494.2, 736.4, 480.5, 747.8, +485.1, 756.8, 482.5, 778.1, 482.3, 775.1, 482.3, 775.1, 482.0, 772.1, +492.0, 746.3, 486.7, 742.4, 484.0, 713.4, 490.1, 684.0, 495.0, 685.1, +506.0, 656.7, 507.2, 653.4, 506.8, 653.2, 508.5, 650.2, 517.1, 634.9, +514.4, 631.9, 526.6, 620.2, 508.5, 650.2, 506.3, 648.9, 514.9, 633.7, +521.3, 617.1, 524.2, 609.7, 524.2, 609.7, 527.1, 602.3, 535.2, 581.2, +542.9, 581.4, 543.4, 560.1, 535.0, 590.1, 535.0, 590.1, 526.6, 620.2, +514.4, 631.9, 517.1, 634.9, 508.5, 650.2, 451.2, 311.6, 452.2, 312.4, +450.9, 313.9, 450.6, 316.3, 448.7, 330.7, 449.8, 331.0, 446.9, 345.2, +447.5, 347.8, 443.8, 348.2, 443.4, 351.4, 441.3, 329.1, 441.3, 329.1, +439.3, 306.7, 439.0, 307.9, 446.5, 307.6, 451.2, 311.6, 490.6, 289.4, +495.4, 300.0, 492.2, 303.8, 500.3, 310.6, 501.6, 337.8, 501.6, 337.8, +503.0, 365.1, 487.6, 331.4, 492.5, 327.4, 490.6, 289.4, 453.6, 292.6, +451.1, 287.9, 456.2, 280.0, 455.2, 279.7, 461.1, 281.5, 459.3, 287.6, +463.5, 295.5, 465.0, 298.4, 464.4, 300.7, 466.5, 301.3, 459.4, 299.2, +456.8, 298.7, 453.6, 292.6, 184.0, 643.8, 178.9, 658.2, 177.4, 657.8, +173.9, 672.6, 169.9, 643.5, 169.9, 643.5, 165.9, 614.5, 163.2, 624.8, +174.0, 627.6, 182.2, 640.8, 183.1, 642.3, 184.3, 642.6, 184.0, 643.8, +218.5, 420.3, 228.1, 405.3, 229.6, 406.0, 237.7, 390.2, 232.9, 392.7, +238.0, 401.0, 236.2, 411.3, 228.3, 439.8, 230.0, 440.3, 223.8, 469.2, +233.1, 461.9, 221.4, 447.0, 219.0, 424.9, 218.8, 422.6, 217.7, 422.0, +218.5, 420.3, 421.1, 484.6, 422.3, 473.1, 423.9, 473.2, 426.6, 461.9, +427.4, 458.4, 428.0, 458.4, 428.3, 454.9, 425.3, 497.4, 424.7, 497.4, +421.2, 539.9, 420.9, 543.2, 420.6, 543.2, 420.6, 546.5, 420.4, 532.8, +420.7, 532.8, 420.8, 519.2, 421.0, 501.9, 419.4, 501.7, 421.1, 484.6, +422.5, 225.0, 423.6, 234.8, 423.4, 234.8, 424.7, 244.6, 424.1, 275.2, +419.6, 275.8, 423.4, 305.9, 420.5, 301.6, 420.5, 301.6, 417.5, 297.2, +417.2, 261.1, 417.7, 260.8, 422.5, 225.0, 355.0, 647.4, 355.7, 641.6, +358.4, 641.9, 358.8, 636.1, 356.5, 665.5, 360.6, 667.3, 351.3, 694.7, +358.7, 672.9, 352.0, 670.9, 355.0, 647.4, 376.3, 669.4, 377.1, 669.7, +372.0, 686.8, 367.8, 704.1, 366.7, 708.8, 366.7, 708.8, 365.5, 713.5, +365.5, 713.7, 365.5, 713.7, 365.4, 714.0, 358.3, 730.5, 361.1, 731.7, +356.8, 749.4, 343.4, 802.1, 343.4, 802.1, 330.6, 854.9, 337.9, 833.6, +333.6, 832.1, 336.5, 809.4, 337.2, 803.9, 337.2, 803.9, 337.9, 798.5, +338.4, 794.6, 338.4, 794.6, 338.9, 790.7, 339.9, 783.2, 339.9, 783.2, +340.8, 775.8, 345.8, 737.4, 338.7, 735.0, 350.7, 699.0, 356.4, 681.9, +368.6, 667.1, 376.3, 669.4, 292.5, 405.8, 296.0, 393.7, 296.0, 393.7, +299.6, 381.6, 301.7, 380.5, 305.9, 388.8, 312.2, 396.0, 311.5, 396.8, +317.7, 409.2, 324.0, 409.5, 326.5, 412.4, 326.5, 412.4, 329.1, 415.3, +332.3, 419.0, 331.6, 421.7, 335.5, 422.7, 313.3, 417.0, 306.0, 421.3, +292.5, 405.8, 302.4, 371.7, 309.5, 347.3, 311.6, 347.8, 316.6, 322.9, +320.3, 313.4, 317.5, 312.0, 322.4, 303.2, 327.4, 285.8, 327.4, 285.8, +332.5, 268.4, 332.7, 267.9, 333.0, 267.6, 332.8, 267.4, 338.5, 275.2, +344.3, 276.1, 343.5, 283.5, 341.6, 301.3, 335.5, 300.7, 327.5, 317.9, +326.6, 319.9, 326.6, 319.9, 325.6, 322.0, 319.1, 335.8, 319.1, 335.8, +312.7, 349.7, 310.3, 354.7, 310.3, 354.7, 308.0, 359.7, 305.2, 365.7, +303.9, 365.4, 302.4, 371.7, 420.4, 487.6, 421.6, 491.2, 419.3, 491.9, +418.3, 496.3, 418.2, 496.3, 418.2, 496.3, 418.2, 496.4, 416.2, 504.6, +411.6, 510.8, 414.3, 512.8, 385.3, 491.1, 389.9, 484.9, 365.6, 457.1, +362.0, 453.0, 362.0, 453.0, 358.5, 448.9, 350.7, 440.1, 352.6, 437.1, +343.0, 431.2, 380.2, 454.0, 378.3, 457.0, 413.7, 482.7, 417.0, 485.2, +419.3, 484.4, 420.4, 487.6, 303.1, 319.5, 315.6, 292.9, 311.4, 286.3, +332.5, 268.4, 327.4, 285.8, 327.4, 285.8, 322.4, 303.2, 313.8, 318.9, +315.6, 319.9, 309.1, 336.7, 294.0, 364.3, 294.0, 364.3, 278.9, 391.8, +271.4, 406.4, 270.2, 405.8, 261.6, 419.8, 278.8, 368.5, 280.1, 368.6, +303.1, 319.5, 261.6, 419.8, 246.9, 443.6, 244.9, 442.6, 232.2, 467.3, +233.2, 453.4, 233.2, 453.4, 234.2, 439.5, 264.1, 377.3, 252.0, 356.3, +303.1, 319.5, 280.1, 368.6, 278.8, 368.5, 261.6, 419.8, 234.9, 429.5, +235.6, 420.4, 233.8, 419.9, 236.2, 411.3, 238.0, 401.0, 232.9, 392.7, +237.7, 390.2, 239.4, 387.0, 236.2, 383.7, 238.3, 382.2, 258.8, 351.6, +260.3, 352.6, 282.5, 323.1, 284.3, 320.9, 284.3, 320.9, 286.0, 318.8, +288.1, 316.1, 288.2, 316.2, 290.3, 313.5, 294.6, 307.8, 294.6, 307.8, +298.9, 302.1, 305.5, 301.5, 304.9, 294.2, 310.9, 286.3, 274.5, 358.7, +276.4, 360.0, 234.9, 429.5, 310.9, 286.3, 313.8, 282.4, 317.4, 281.6, +316.7, 278.6, 317.3, 278.9, 327.4, 271.4, 328.2, 263.3, 332.4, 263.6, +332.9, 257.1, 337.6, 250.9, 340.4, 253.4, 335.2, 259.1, 332.8, 267.4, +333.0, 267.6, 332.7, 267.9, 332.5, 268.4, 311.4, 286.3, 315.6, 292.9, +303.1, 319.5, 252.0, 356.3, 264.1, 377.3, 234.2, 439.5, 234.5, 434.5, +234.5, 434.5, 234.9, 429.5, 276.4, 360.0, 274.5, 358.7, 310.9, 286.3, +240.7, 582.4, 236.3, 598.2, 231.9, 614.0, 231.9, 614.0, 226.4, 633.0, +226.3, 633.0, 220.8, 652.1, 219.4, 656.7, 217.9, 656.8, 218.1, 661.3, +219.1, 648.1, 219.1, 648.1, 220.0, 634.9, 225.6, 614.0, 228.0, 614.6, +236.0, 594.4, 238.4, 588.4, 239.4, 588.6, 240.7, 582.4, 169.5, 791.9, +171.5, 807.5, 171.5, 807.5, 173.4, 823.0, 161.9, 809.6, 161.8, 809.6, +150.3, 796.2, 150.1, 795.3, 166.5, 788.4, 169.5, 791.9, 150.3, 796.2, +147.5, 793.0, 143.9, 791.3, 144.7, 789.8, 149.8, 732.8, 150.4, 732.9, +155.0, 675.9, 157.9, 699.5, 152.3, 701.7, 160.9, 723.1, 162.3, 757.6, +165.2, 757.5, 169.5, 791.9, 166.5, 788.4, 150.1, 795.3, 150.3, 796.2, +76.7, 162.3, 81.1, 168.4, 84.6, 167.9, 85.5, 174.4, 87.9, 181.5, +87.9, 181.5, 90.3, 188.5, 100.0, 235.0, 100.4, 234.9, 110.6, 281.3, +108.8, 272.7, 108.2, 272.8, 105.7, 264.3, 104.5, 259.8, 104.5, 259.8, +103.2, 255.3, 89.9, 208.8, 87.0, 209.4, 76.7, 162.3, 50.5, 72.6, +53.0, 79.9, 51.3, 86.0, 55.5, 87.2, 55.6, 87.2, 55.7, 87.7, +55.9, 88.2, 56.8, 120.2, 51.9, 122.6, 62.1, 152.1, 62.5, 168.3, +62.5, 168.3, 63.0, 184.6, 66.0, 173.1, 61.6, 171.9, 60.2, 159.3, +55.4, 116.0, 53.3, 116.1, 50.5, 72.6, 817.0, 605.3, 806.9, 609.0, +806.7, 608.6, 796.8, 612.7, 797.2, 611.1, 797.4, 609.5, 797.6, 609.5, +804.0, 598.2, 804.0, 596.3, 804.0, 583.1, 801.5, 574.7, 806.4, 573.2, +808.8, 563.4, 819.0, 580.8, 821.5, 586.4, 817.0, 605.3, 808.8, 563.4, +810.7, 555.2, 810.7, 555.2, 812.7, 547.1, 812.6, 547.5, 813.3, 547.6, +813.9, 548.1, 833.9, 567.9, 834.2, 567.7, 855.2, 586.5, 855.4, 586.6, +855.4, 586.6, 855.5, 586.8, 853.9, 586.4, 853.0, 589.9, 850.6, 593.0, +848.1, 589.4, 833.8, 599.1, 817.0, 605.3, 821.5, 586.4, 819.0, 580.8, +808.8, 563.4, 911.8, 470.4, 913.5, 473.3, 915.9, 473.9, 915.3, 476.2, +916.7, 480.1, 916.7, 480.1, 918.1, 484.0, 913.3, 508.2, 914.2, 509.6, +917.5, 534.2, 916.9, 536.7, 916.9, 536.7, 916.3, 539.2, 913.2, 504.9, +912.4, 504.8, 911.8, 470.4, 916.3, 539.2, 913.4, 551.5, 912.9, 551.4, +910.5, 563.7, 910.4, 563.6, 910.4, 563.6, 910.3, 563.5, 905.8, 531.9, +910.5, 526.3, 893.0, 501.6, 891.1, 488.4, 894.8, 486.7, 889.2, 475.3, +895.7, 464.8, 895.7, 464.8, 902.2, 454.4, 904.7, 463.1, 907.0, 462.4, +911.8, 470.4, 912.4, 504.8, 913.2, 504.9, 916.3, 539.2, 849.5, 494.8, +848.1, 492.9, 848.1, 492.9, 846.8, 490.9, 842.0, 484.2, 842.8, 483.6, +838.7, 476.3, 844.7, 485.2, 844.3, 485.5, 849.5, 494.8, 738.7, 69.9, +753.9, 66.6, 761.8, 72.8, 769.2, 63.4, 788.7, 68.7, 786.9, 75.6, +804.5, 87.9, 830.4, 107.5, 831.0, 106.7, 857.5, 125.5, 854.9, 123.5, +854.5, 124.1, 851.4, 122.6, 813.2, 104.8, 813.2, 104.8, 775.0, 86.9, +756.8, 78.4, 741.7, 82.2, 738.7, 69.9, 760.7, 133.2, 746.8, 120.3, +752.8, 100.3, 740.9, 98.7, 768.4, 102.3, 766.4, 118.0, 791.8, 137.2, +792.9, 137.9, 792.8, 138.7, 793.9, 138.7, 788.0, 138.5, 788.0, 137.7, +782.2, 136.8, 771.4, 135.0, 767.4, 139.3, 760.7, 133.2, 684.7, 102.6, +683.4, 102.7, 682.1, 99.2, 681.9, 99.4, 684.6, 101.2, 685.9, 99.3, +689.9, 99.1, 689.7, 98.8, 687.4, 102.5, 684.7, 102.6, 705.7, 126.7, +727.5, 138.7, 723.1, 146.6, 740.5, 166.5, 741.3, 167.5, 741.1, 167.9, +742.1, 168.4, 698.0, 142.6, 699.3, 137.2, 651.4, 121.1, 644.5, 115.4, +644.5, 115.4, 637.5, 109.8, 672.1, 113.3, 676.0, 110.3, 705.7, 126.7, +637.5, 109.8, 628.7, 102.5, 629.9, 99.9, 619.9, 95.3, 621.5, 95.0, +622.0, 94.0, 623.1, 94.6, 646.1, 94.6, 646.1, 89.7, 669.1, 84.8, +674.0, 93.0, 674.2, 94.0, 681.9, 99.4, 682.1, 99.2, 683.4, 102.7, +684.7, 102.6, 692.8, 111.8, 692.8, 111.8, 700.8, 121.1, 703.3, 123.9, +702.9, 126.2, 705.7, 126.7, 676.0, 110.3, 672.1, 113.3, 637.5, 109.8, +629.3, 214.7, 629.4, 214.6, 627.9, 213.2, 626.6, 211.7, 620.0, 204.5, +620.0, 204.5, 613.4, 197.3, 608.6, 192.1, 608.6, 192.1, 603.8, 186.8, +591.9, 173.9, 591.5, 174.3, 580.1, 161.0, 579.1, 158.9, 579.1, 158.9, +578.0, 156.8, 578.1, 157.0, 578.3, 156.9, 578.7, 157.1, 580.9, 157.7, +580.9, 157.7, 583.1, 158.4, 618.0, 168.9, 623.6, 160.4, 653.0, 179.5, +652.8, 179.4, 647.2, 188.0, 641.5, 196.5, 635.4, 205.6, 636.9, 207.0, +629.3, 214.7, 689.0, 182.7, 706.2, 191.7, 706.2, 191.7, 723.5, 200.8, +715.9, 194.0, 712.7, 197.5, 701.9, 194.3, 698.4, 193.2, 697.4, 194.4, +695.0, 192.2, 691.0, 188.6, 693.0, 183.9, 689.0, 182.7, 626.8, 212.0, +626.7, 211.8, 626.7, 211.8, 626.6, 211.7, 627.9, 213.2, 629.4, 214.6, +629.3, 214.7, 633.7, 219.4, 633.7, 219.4, 638.0, 224.2, 638.4, 224.6, +638.4, 224.6, 638.7, 224.9, 645.6, 232.5, 645.6, 232.5, 652.5, 240.0, +665.2, 253.8, 665.2, 253.8, 677.8, 267.5, 681.5, 271.6, 681.5, 271.6, +685.2, 275.6, 685.8, 276.2, 685.8, 276.2, 686.3, 276.8, 688.5, 279.2, +688.5, 279.2, 690.7, 281.6, 697.1, 288.6, 697.1, 288.6, 703.6, 295.6, +710.4, 303.0, 710.4, 303.0, 717.1, 310.4, 720.6, 314.2, 720.6, 314.2, +724.0, 317.9, 730.1, 324.6, 736.2, 331.2, 736.2, 331.2, 736.2, 331.2, +730.1, 324.6, 724.0, 317.9, 720.6, 314.2, 720.6, 314.2, 717.1, 310.4, +710.4, 303.0, 710.4, 303.0, 703.6, 295.6, 697.1, 288.6, 697.1, 288.6, +690.7, 281.6, 688.5, 279.2, 688.5, 279.2, 686.3, 276.8, 685.8, 276.2, +685.8, 276.2, 685.2, 275.6, 681.5, 271.6, 681.5, 271.6, 677.8, 267.5, +665.2, 253.8, 665.2, 253.8, 652.5, 240.0, 645.6, 232.5, 645.6, 232.5, +638.7, 224.9, 638.4, 224.6, 638.4, 224.6, 638.0, 224.2, 633.7, 219.4, +633.7, 219.4, 629.3, 214.7, 628.1, 213.3, 628.0, 213.3, 626.8, 212.0, +626.8, 212.0, 626.8, 212.0, 626.8, 212.0, 645.8, 239.4, 690.1, 300.2, +690.2, 300.2, 731.8, 362.9, 730.3, 363.7, 730.3, 363.7, 728.7, 364.4, +716.2, 348.6, 717.6, 347.6, 706.4, 330.7, 696.0, 315.0, 696.0, 315.0, +685.6, 299.3, 665.7, 269.4, 667.0, 268.4, 645.8, 239.4, 792.6, 283.1, +791.4, 277.9, 793.4, 271.7, 795.1, 271.6, 826.3, 282.4, 829.0, 274.6, +862.9, 277.6, 833.0, 295.4, 834.2, 297.5, 805.6, 317.4, 800.5, 317.8, +796.7, 300.8, 792.6, 283.1, 805.6, 317.4, 802.4, 319.6, 802.4, 319.6, +799.3, 321.8, 799.1, 322.4, 790.0, 317.2, 784.9, 320.1, 784.8, 320.1, +785.1, 318.9, 785.4, 317.7, 789.0, 300.4, 788.8, 283.1, 792.6, 283.1, +796.7, 300.8, 800.5, 317.8, 805.6, 317.4, 669.2, 142.5, 711.0, 169.1, +716.3, 163.2, 752.8, 195.8, 757.6, 199.0, 757.6, 199.0, 762.5, 202.3, +715.8, 172.5, 715.3, 173.2, 669.2, 142.5, 656.5, 133.7, 662.4, 138.7, +662.0, 139.2, 668.3, 143.7, 682.3, 157.8, 681.8, 158.3, 695.4, 173.0, +701.6, 179.8, 707.8, 186.6, 707.8, 186.5, 699.6, 181.4, 699.2, 181.9, +690.7, 177.3, 677.9, 165.3, 679.7, 163.4, 668.8, 149.5, 662.6, 141.6, +657.2, 142.1, 656.5, 133.7, 484.2, 192.4, 466.3, 185.9, 466.8, 183.8, +448.4, 179.4, 434.4, 165.4, 434.4, 165.4, 420.4, 151.4, 423.0, 154.3, +423.8, 153.6, 427.2, 155.8, 427.8, 156.2, 427.8, 156.2, 428.4, 156.5, +441.0, 164.6, 441.0, 164.6, 453.6, 172.7, 468.9, 182.5, 483.2, 193.7, +484.2, 192.4, 511.2, 117.2, 506.6, 118.9, 503.0, 121.8, 502.0, 120.5, +497.6, 121.5, 496.6, 123.8, 493.2, 122.4, 479.7, 123.8, 478.5, 122.4, +466.5, 128.1, 465.7, 128.2, 465.1, 128.8, 464.8, 128.5, 464.3, 128.6, +464.0, 128.4, 463.7, 128.7, 497.3, 92.4, 497.5, 92.6, 531.3, 56.5, +537.7, 49.7, 541.4, 50.9, 544.1, 42.8, 531.4, 81.3, 530.5, 81.6, +511.2, 117.2, 544.1, 42.8, 544.3, 42.4, 544.9, 42.3, 544.8, 42.1, +553.0, 66.6, 561.8, 66.9, 561.1, 91.2, 561.9, 94.1, 561.8, 97.0, +562.7, 97.1, 560.1, 98.9, 560.1, 98.9, 557.4, 100.7, 533.6, 105.7, +534.3, 109.0, 511.2, 117.2, 530.5, 81.6, 531.4, 81.3, 544.1, 42.8, +436.8, 132.4, 435.4, 132.4, 435.4, 132.4, 434.0, 132.5, 436.4, 132.0, +436.1, 130.2, 438.1, 128.0, 490.4, 81.3, 490.1, 80.9, 542.1, 33.9, +542.0, 37.9, 543.5, 38.0, 544.8, 42.1, 544.9, 42.3, 544.3, 42.4, +544.1, 42.8, 541.4, 50.9, 537.7, 49.7, 531.3, 56.5, 484.8, 95.3, +484.6, 95.1, 436.8, 132.4, 531.3, 56.5, 497.5, 92.6, 497.3, 92.4, +463.7, 128.7, 458.1, 133.7, 455.3, 131.1, 446.7, 132.3, 442.2, 133.8, +441.7, 132.4, 436.8, 132.4, 484.6, 95.1, 484.8, 95.3, 531.3, 56.5, +612.3, -75.3, 626.2, -73.9, 633.4, -66.3, 638.1, -51.9, 627.0, -46.6, +638.8, -21.7, 639.5, 8.4, 638.2, 7.0, 634.4, 10.4, 629.3, 12.3, +619.7, -9.4, 624.7, -11.6, 620.1, -35.4, 618.2, -44.7, 618.2, -44.7, +616.4, -54.1, 614.4, -64.7, 615.4, -75.0, 612.3, -75.3, 403.8, 35.1, +396.6, 24.7, 396.6, 24.7, 389.3, 14.2, 396.6, 18.3, 405.6, 9.6, +408.7, 14.0, 435.3, 29.2, 443.6, 22.3, 462.0, 44.4, 462.7, 45.0, +462.7, 45.0, 463.4, 45.6, 433.6, 40.8, 431.0, 46.6, 403.8, 35.1, +463.4, 45.6, 464.5, 46.4, 464.7, 46.3, 465.6, 47.3, 465.9, 47.6, +466.2, 47.8, 466.1, 47.9, 459.8, 56.7, 459.8, 56.7, 453.5, 65.5, +447.5, 58.4, 436.5, 59.9, 424.9, 65.5, 424.7, 65.3, 424.7, 65.3, +424.5, 65.0, 414.5, 49.8, 414.2, 50.1, 403.8, 35.1, 431.0, 46.6, +433.6, 40.8, 463.4, 45.6, 509.8, -12.8, 509.0, -11.6, 509.0, -11.6, +508.1, -10.5, 507.9, -10.1, 506.9, -11.0, 506.1, -10.7, 498.8, -2.9, +488.5, -14.8, 471.0, -14.3, 461.5, -12.2, 460.8, -15.4, 450.5, -16.5, +472.1, -24.4, 479.7, -27.7, 488.0, -47.7, 493.8, -49.4, 493.8, -49.4, +499.5, -51.2, 509.6, -35.0, 505.7, -32.2, 509.8, -12.8, 499.5, -51.2, +523.8, -58.5, 523.9, -58.0, 548.0, -65.9, 546.5, -63.9, 544.5, -62.9, +545.1, -61.8, 545.4, -61.3, 542.5, -60.0, 542.7, -58.6, 543.8, -57.6, +527.3, -47.3, 528.8, -39.2, 528.8, -39.2, 526.9, -37.9, 527.0, -36.7, +515.8, -28.1, 518.4, -24.7, 509.8, -12.8, 505.7, -32.2, 509.6, -35.0, +499.5, -51.2, 284.2, 78.5, 283.5, 81.8, 285.4, 82.2, 286.7, 86.0, +282.8, 103.1, 289.1, 108.1, 299.7, 125.0, 300.6, 127.6, 301.9, 127.8, +301.5, 130.3, 299.6, 143.4, 300.6, 144.3, 295.2, 156.1, 290.1, 157.2, +287.4, 159.2, 286.3, 163.8, 280.3, 169.0, 280.3, 169.0, 274.3, 174.1, +271.1, 176.8, 268.3, 176.5, 268.0, 179.5, 273.3, 128.7, 274.2, 128.6, +284.2, 78.5, 373.3, 203.2, 370.5, 207.2, 370.8, 207.5, 367.6, 211.2, +364.7, 215.0, 364.7, 215.0, 361.9, 218.8, 356.5, 189.2, 344.2, 177.1, +358.0, 158.3, 349.9, 169.3, 369.1, 180.1, 373.3, 203.2, 358.0, 158.3, +356.2, 151.9, 357.5, 151.5, 357.1, 144.7, 356.9, 141.9, 357.2, 139.2, +356.7, 139.2, 373.4, 151.7, 401.6, 148.1, 401.4, 149.1, 404.7, 151.7, +404.6, 151.9, 407.9, 154.3, 390.6, 178.7, 390.6, 178.7, 373.3, 203.2, +369.1, 180.1, 349.9, 169.3, 358.0, 158.3, 308.9, 84.4, 297.8, 85.2, +287.4, 82.9, 286.7, 86.0, 285.4, 82.2, 283.5, 81.8, 284.2, 78.5, +283.8, 77.5, 283.8, 77.5, 283.5, 76.5, 282.6, 68.5, 280.9, 68.7, +278.3, 61.0, 282.4, 55.0, 292.3, 52.8, 297.3, 56.6, 307.6, 64.5, +312.6, 74.0, 308.9, 84.4, 297.3, 56.6, 297.3, 55.1, 303.3, 55.2, +309.4, 53.8, 320.2, 51.3, 320.2, 51.3, 331.0, 48.8, 335.2, 47.8, +337.5, 45.1, 339.5, 46.8, 345.7, 56.6, 345.7, 56.6, 352.0, 66.3, +356.0, 70.2, 352.5, 73.8, 353.0, 81.4, 343.1, 87.8, 339.5, 82.3, +326.0, 83.2, 324.5, 83.3, 324.5, 83.3, 323.0, 83.4, 321.9, 81.1, +315.9, 83.9, 308.9, 84.4, 312.6, 74.0, 307.6, 64.5, 297.3, 56.6, +333.5, 40.1, 335.5, 41.8, 336.2, 41.4, 337.4, 43.5, 338.4, 45.2, +338.4, 45.2, 339.5, 46.8, 337.5, 45.1, 335.2, 47.8, 331.0, 48.8, +329.4, 47.0, 330.6, 42.5, 333.5, 40.1, 273.8, 289.7, 286.3, 295.9, +287.0, 303.2, 298.9, 302.1, 294.6, 307.8, 294.6, 307.8, 290.3, 313.5, +288.2, 316.2, 288.1, 316.1, 286.0, 318.8, 277.3, 306.1, 269.1, 295.9, +273.8, 289.7, 204.3, 420.0, 183.7, 445.4, 180.2, 443.2, 163.2, 470.8, +155.4, 476.2, 151.1, 474.2, 147.6, 481.7, 147.4, 480.0, 147.4, 480.0, +147.1, 478.3, 146.9, 478.2, 148.1, 475.5, 149.2, 472.6, 175.8, 445.4, +173.8, 423.9, 204.3, 420.0, 213.9, 354.1, 211.2, 376.4, 202.0, 375.3, +190.1, 396.4, 185.5, 404.4, 185.5, 404.4, 181.0, 412.4, 178.7, 416.5, +176.4, 416.5, 176.4, 420.6, 182.3, 404.9, 178.8, 403.7, 181.3, 386.7, +186.6, 371.8, 188.2, 371.8, 190.4, 356.3, 193.8, 346.9, 193.8, 346.9, +197.1, 337.6, 204.7, 336.9, 214.8, 347.0, 213.9, 354.1, 197.1, 337.6, +198.8, 332.8, 201.3, 328.4, 200.5, 328.0, 208.1, 323.9, 208.1, 323.9, +215.6, 319.8, 216.7, 313.2, 227.8, 315.9, 238.9, 309.9, 237.8, 332.4, +226.4, 331.9, 214.0, 353.9, 214.0, 354.0, 213.9, 354.1, 213.9, 354.1, +214.8, 347.0, 204.7, 336.9, 197.1, 337.6, 205.5, 205.2, 214.9, 187.9, +214.9, 187.9, 224.3, 170.6, 223.2, 174.4, 225.5, 175.1, 226.7, 179.6, +218.9, 193.9, 203.1, 195.7, 205.5, 205.2, 226.7, 179.6, 226.8, 180.1, +227.0, 180.2, 226.9, 180.6, 214.8, 224.2, 214.8, 224.2, 202.7, 267.7, +189.3, 262.0, 182.5, 266.1, 168.1, 274.5, 172.0, 267.1, 178.1, 263.9, +175.9, 259.7, 176.2, 259.8, 176.7, 258.1, 177.5, 256.5, 191.5, 230.8, +189.8, 229.7, 205.5, 205.2, 203.1, 195.7, 218.9, 193.9, 226.7, 179.6, +186.7, 290.7, 192.0, 288.8, 194.8, 290.7, 197.4, 286.9, 189.6, 315.0, +189.6, 315.0, 181.8, 343.0, 182.1, 342.0, 181.9, 342.0, 182.0, 340.9, +183.7, 322.7, 183.7, 322.7, 185.4, 304.5, 186.1, 297.6, 183.3, 295.7, +186.7, 290.7, 463.6, 692.9, 463.5, 690.2, 463.4, 690.2, 463.3, 687.6, +463.2, 686.9, 463.2, 686.2, 463.2, 686.2, 463.0, 680.2, 463.8, 680.1, +462.8, 674.3, 464.4, 678.0, 464.4, 678.0, 466.1, 681.7, 466.3, 687.2, +466.0, 687.8, 463.6, 692.9, 578.5, 434.6, 579.6, 430.3, 580.2, 430.4, +580.8, 426.0, 580.6, 425.6, 581.4, 425.1, 581.3, 424.5, 602.2, 457.1, +602.2, 457.1, 623.1, 489.8, 628.7, 470.0, 598.0, 464.0, 578.5, 434.6, +673.6, 757.7, 672.3, 759.2, 679.5, 765.3, 685.5, 772.8, 689.7, 778.1, +694.9, 781.9, 693.8, 783.4, 661.0, 817.4, 661.0, 817.4, 628.1, 851.5, +629.8, 849.8, 629.2, 849.3, 630.3, 847.0, 634.0, 839.4, 634.0, 839.4, +637.6, 831.9, 639.3, 828.4, 639.3, 828.4, 641.0, 824.9, 657.3, 791.3, +650.1, 785.2, 673.6, 757.7, 491.4, 532.6, 491.9, 530.4, 503.1, 533.1, +514.8, 533.6, 520.0, 533.8, 525.1, 533.3, 525.2, 534.0, 525.8, 540.2, +520.7, 540.8, 516.3, 547.5, 512.5, 553.3, 509.0, 559.2, 508.7, 559.0, +496.5, 551.7, 488.9, 543.1, 491.4, 532.6, 474.8, 529.0, 477.1, 496.5, +488.2, 493.2, 479.4, 464.0, 481.8, 459.8, 483.6, 460.0, 484.1, 455.6, +483.9, 455.4, 484.4, 455.0, 484.8, 454.4, 485.1, 452.0, 496.1, 456.3, +501.5, 451.5, 501.5, 451.9, 509.5, 450.2, 517.4, 448.8, 517.2, 464.4, +509.2, 464.3, 501.0, 479.8, 499.7, 482.2, 499.7, 482.2, 498.4, 484.5, +486.6, 506.8, 469.2, 522.9, 474.8, 529.0, 527.1, 602.3, 524.2, 609.7, +524.2, 609.7, 521.3, 617.1, 515.0, 592.1, 519.4, 590.9, 517.5, 564.7, +517.0, 557.6, 517.0, 557.6, 516.5, 550.4, 516.4, 549.0, 515.7, 548.6, +516.3, 547.5, 520.7, 540.8, 525.8, 540.2, 525.2, 534.0, 536.3, 517.1, +536.3, 517.1, 547.5, 500.3, 551.2, 494.6, 553.7, 495.1, 555.0, 488.9, +543.5, 546.1, 541.9, 545.8, 527.1, 602.3, 555.0, 488.9, 555.3, 487.8, +555.7, 487.9, 556.3, 486.9, 562.9, 477.0, 563.1, 466.9, 569.4, 467.1, +566.8, 467.0, 566.6, 477.0, 563.8, 487.0, 562.8, 490.6, 562.8, 490.6, +561.8, 494.2, 556.7, 512.6, 556.7, 512.6, 551.5, 531.1, 549.5, 538.2, +549.5, 538.2, 547.5, 545.3, 546.1, 548.2, 546.7, 548.5, 545.8, 551.6, +545.0, 555.9, 544.6, 555.9, 543.4, 560.1, 542.9, 581.4, 535.2, 581.2, +527.1, 602.3, 541.9, 545.8, 543.5, 546.1, 555.0, 488.9, 432.0, 228.2, +431.8, 226.0, 431.8, 226.0, 431.6, 223.8, 437.1, 213.6, 439.0, 212.2, +438.3, 201.1, 439.1, 202.4, 440.2, 203.0, 439.9, 203.6, 439.3, 206.5, +441.2, 208.2, 444.3, 210.5, 456.0, 216.4, 452.5, 223.3, 460.7, 236.1, +464.0, 254.6, 453.1, 274.4, 455.8, 275.1, 438.7, 270.4, 443.2, 252.0, +432.0, 228.2, 455.8, 275.1, 456.6, 276.9, 455.5, 277.4, 455.2, 279.7, +456.2, 280.0, 451.1, 287.9, 453.6, 292.6, 452.4, 302.1, 456.5, 306.3, +451.2, 311.6, 446.5, 307.6, 439.0, 307.9, 439.3, 306.7, 435.6, 267.5, +435.6, 267.5, 432.0, 228.2, 443.2, 252.0, 438.7, 270.4, 455.8, 275.1, +475.1, 258.7, 477.7, 262.6, 477.7, 262.6, 480.2, 266.5, 484.3, 278.3, +485.4, 277.9, 490.6, 289.4, 492.5, 327.4, 487.6, 331.4, 503.0, 365.1, +503.1, 368.1, 503.1, 368.1, 503.3, 371.1, 497.3, 363.5, 498.7, 362.4, +494.1, 353.7, 486.4, 339.0, 486.4, 339.0, 478.6, 324.2, 472.6, 312.8, +472.6, 312.8, 466.5, 301.3, 464.4, 300.7, 465.0, 298.4, 463.5, 295.5, +467.3, 276.7, 465.7, 275.0, 475.1, 258.7, 463.5, 295.5, 459.3, 287.6, +461.1, 281.5, 455.2, 279.7, 455.5, 277.4, 456.6, 276.9, 455.8, 275.1, +453.1, 274.4, 464.0, 254.6, 460.7, 236.1, 464.6, 242.2, 463.1, 244.0, +468.4, 248.2, 473.2, 250.8, 471.8, 253.4, 475.1, 258.7, 465.7, 275.0, +467.3, 276.7, 463.5, 295.5, 494.1, 353.7, 498.7, 362.4, 497.3, 363.5, +503.3, 371.1, 503.6, 377.8, 505.6, 383.9, 503.9, 384.4, 498.4, 392.8, +504.5, 396.8, 505.1, 409.1, 486.1, 398.3, 484.5, 401.1, 463.9, 393.2, +464.2, 393.4, 466.8, 389.5, 469.6, 385.7, 480.9, 370.9, 480.9, 370.9, +492.2, 356.2, 493.2, 355.0, 494.4, 354.1, 494.1, 353.7, 185.8, 516.6, +187.6, 526.3, 190.7, 525.7, 195.7, 534.8, 200.7, 544.0, 203.9, 543.4, +205.8, 553.2, 204.0, 561.3, 204.0, 561.3, 202.3, 569.3, 189.3, 545.5, +190.9, 543.6, 185.8, 516.6, 195.7, 534.8, 190.7, 525.7, 187.6, 526.3, +185.8, 516.6, 179.3, 504.9, 178.5, 505.2, 172.9, 493.1, 173.3, 491.8, +173.3, 491.8, 173.8, 490.6, 196.2, 478.0, 189.5, 466.0, 205.2, 441.3, +222.8, 476.9, 207.3, 489.8, 195.7, 534.8, 418.3, 496.3, 419.3, 491.9, +421.6, 491.2, 420.4, 487.6, 420.7, 486.1, 421.1, 486.1, 421.1, 484.6, +419.4, 501.7, 421.0, 501.9, 420.8, 519.2, 421.1, 514.2, 420.3, 514.1, +419.7, 509.1, 419.0, 502.7, 419.0, 502.7, 418.3, 496.4, 418.3, 496.3, +418.3, 496.3, 418.3, 496.3, 412.4, 667.3, 410.4, 684.4, 413.1, 685.3, +407.6, 701.4, 411.8, 689.1, 408.8, 688.1, 409.9, 674.8, 410.7, 664.7, +410.7, 664.7, 411.6, 654.6, 415.4, 609.0, 415.4, 609.0, 419.2, 563.4, +419.9, 555.0, 419.9, 555.0, 420.6, 546.5, 420.6, 543.2, 420.9, 543.2, +421.2, 539.9, 417.4, 595.7, 417.3, 595.6, 413.5, 651.4, 413.0, 659.4, +413.3, 659.4, 412.4, 667.3, 427.3, 776.5, 428.0, 780.3, 430.1, 779.9, +433.0, 783.4, 446.6, 800.0, 455.1, 797.7, 460.2, 816.6, 457.1, 838.5, +457.1, 838.5, 453.9, 860.5, 455.4, 855.6, 452.0, 854.6, 450.1, 848.6, +444.2, 830.0, 444.2, 830.0, 438.3, 811.3, 432.8, 793.9, 430.7, 794.3, +427.3, 776.5, 406.6, 883.8, 406.0, 882.6, 403.3, 884.1, 400.0, 884.0, +374.4, 883.8, 374.2, 886.1, 348.9, 883.3, 349.2, 883.2, 348.7, 880.8, +348.6, 878.3, 347.6, 869.7, 349.5, 869.5, 350.4, 860.7, 355.0, 857.9, +358.6, 864.1, 366.8, 867.4, 382.6, 873.9, 382.6, 873.9, 398.3, 880.4, +402.4, 882.1, 405.1, 880.8, 406.6, 883.8, 377.5, 209.4, 376.8, 204.7, +376.0, 199.9, 376.1, 199.9, 392.8, 177.9, 393.6, 178.5, 409.4, 156.0, +412.5, 160.9, 412.5, 160.9, 415.7, 165.8, 417.1, 167.5, 416.0, 168.4, +416.3, 171.0, 416.3, 171.1, 416.1, 171.1, 416.0, 171.3, 413.9, 173.3, +413.9, 173.3, 411.9, 175.4, 394.7, 192.4, 397.1, 195.9, 377.5, 209.4, +225.8, 746.3, 226.0, 752.9, 224.7, 752.9, 223.6, 759.5, 217.9, 793.6, +217.9, 793.6, 212.2, 827.7, 210.5, 838.1, 207.5, 838.4, 208.8, 848.4, +208.5, 822.8, 203.1, 821.6, 208.2, 797.2, 209.2, 783.9, 213.3, 782.9, +210.2, 770.6, 209.7, 770.5, 210.6, 767.8, 210.6, 764.9, 225.7, 716.7, +214.3, 713.1, 218.1, 661.3, 217.9, 656.8, 219.4, 656.7, 220.8, 652.1, +223.9, 661.3, 221.3, 662.2, 221.9, 672.3, 223.8, 709.3, 225.1, 709.3, +225.8, 746.3, 377.7, 663.3, 378.7, 665.6, 378.0, 667.1, 376.3, 669.4, +368.6, 667.1, 356.4, 681.9, 350.7, 699.0, 351.9, 697.8, 351.0, 696.9, +351.3, 694.7, 360.6, 667.3, 356.5, 665.5, 358.8, 636.1, 359.1, 633.6, +359.1, 633.6, 359.5, 631.2, 359.5, 631.2, 359.5, 631.2, 359.5, 631.2, +368.6, 647.3, 370.4, 646.5, 377.7, 663.3, 365.6, 457.1, 389.9, 484.9, +385.3, 491.1, 414.3, 512.8, 419.1, 522.3, 413.0, 527.4, 407.6, 540.2, +407.7, 539.3, 405.6, 539.1, 403.6, 538.0, 401.5, 535.4, 402.1, 534.9, +400.7, 531.7, 387.8, 504.4, 387.8, 504.4, 374.9, 477.0, 370.3, 467.0, +373.1, 463.9, 365.6, 457.1, 396.0, 295.6, 405.7, 311.6, 405.7, 311.6, +415.3, 327.6, 415.1, 326.1, 403.1, 330.3, 400.9, 326.8, 393.5, 314.7, +398.5, 311.6, 396.1, 296.5, 396.1, 296.0, 396.2, 296.0, 396.0, 295.6, +429.5, 402.8, 428.6, 401.2, 424.0, 404.3, 422.4, 402.4, 409.9, 388.2, +410.4, 387.3, 401.3, 370.6, 404.8, 377.1, 406.3, 376.3, 411.3, 382.1, +420.4, 392.5, 423.1, 391.0, 429.5, 402.8, 327.5, 317.9, 335.5, 300.7, +341.6, 301.3, 343.5, 283.5, 344.7, 282.9, 350.0, 293.2, 356.4, 303.0, +363.8, 314.1, 363.8, 314.1, 371.2, 325.2, 376.4, 333.1, 375.3, 339.9, +381.6, 341.0, 353.4, 336.2, 341.1, 338.4, 327.5, 317.9, 413.7, 482.7, +378.3, 457.0, 380.2, 454.0, 343.0, 431.2, 338.6, 427.9, 339.3, 427.0, +335.5, 422.7, 331.6, 421.7, 332.3, 419.0, 329.1, 415.3, 342.3, 424.3, +341.6, 425.3, 354.1, 435.3, 359.8, 439.8, 359.8, 439.8, 365.4, 444.3, +366.7, 445.3, 366.7, 445.3, 367.9, 446.3, 390.8, 464.5, 388.8, 467.8, +413.7, 482.7, 274.1, 435.0, 276.4, 430.3, 275.1, 429.0, 278.6, 425.7, +278.7, 425.6, 278.7, 425.6, 278.7, 425.6, 268.4, 467.8, 268.3, 467.8, +258.1, 510.1, 256.8, 515.4, 255.8, 520.7, 255.8, 520.7, 255.8, 520.7, +256.8, 515.4, 258.1, 510.1, 259.6, 503.2, 259.6, 503.2, 261.0, 496.3, +267.6, 465.7, 266.5, 465.4, 274.1, 435.0, 64.3, 245.5, 63.3, 243.2, +63.3, 243.2, 62.3, 240.9, 69.8, 212.3, 64.6, 210.9, 66.9, 181.0, +65.6, 193.9, 66.4, 193.9, 65.9, 206.9, 65.1, 226.2, 66.4, 226.4, +64.3, 245.5, 43.9, 79.8, 44.0, 76.2, 43.5, 76.1, 44.2, 72.5, +44.4, 71.7, 44.2, 70.8, 44.2, 70.8, 45.3, 66.2, 44.7, 65.8, +46.8, 61.7, 46.6, 62.8, 47.2, 62.9, 47.6, 64.1, 46.3, 72.1, +46.9, 72.5, 43.9, 79.8, 649.4, 530.7, 645.6, 524.9, 641.9, 519.1, +641.9, 519.1, 639.7, 515.7, 639.7, 515.7, 637.5, 512.3, 637.5, 512.3, +637.5, 512.3, 637.5, 512.3, 638.0, 511.3, 637.6, 511.1, 637.8, 510.0, +652.4, 503.5, 652.8, 504.4, 667.8, 498.9, 677.4, 495.4, 677.4, 495.4, +687.0, 491.8, 694.7, 489.0, 700.5, 484.1, 702.3, 486.2, 701.6, 497.2, +701.6, 497.2, 700.8, 508.2, 698.8, 512.4, 695.2, 510.7, 689.5, 513.1, +669.4, 521.9, 670.2, 528.0, 649.4, 530.7, 700.8, 471.3, 701.9, 472.8, +701.9, 472.8, 703.1, 474.3, 703.5, 474.5, 703.0, 475.8, 702.9, 477.3, +701.0, 474.9, 700.6, 474.2, 700.8, 471.3, 808.2, 400.0, 814.9, 404.7, +820.1, 403.3, 821.7, 409.3, 859.1, 470.9, 856.4, 472.5, 890.9, 536.0, +891.2, 536.4, 890.9, 536.6, 891.0, 537.3, 892.0, 543.8, 892.0, 543.8, +893.0, 550.3, 848.4, 476.5, 847.1, 476.9, 808.2, 400.0, 893.0, 550.3, +893.2, 551.5, 892.7, 551.8, 893.3, 552.6, 889.0, 549.7, 889.0, 549.7, +884.7, 546.7, 880.9, 539.6, 880.0, 540.1, 875.4, 533.5, 862.6, 514.1, +862.4, 514.2, 849.5, 494.8, 844.3, 485.5, 844.7, 485.2, 838.7, 476.3, +814.6, 432.8, 819.3, 429.5, 790.5, 389.3, 790.0, 388.3, 790.0, 388.3, +789.5, 387.2, 797.2, 395.2, 798.9, 393.6, 808.2, 400.0, 847.1, 476.9, +848.4, 476.5, 893.0, 550.3, 731.1, 91.4, 720.8, 83.6, 721.9, 78.2, +710.6, 75.9, 720.4, 73.8, 721.6, 76.1, 730.2, 71.7, 731.7, 69.2, +734.5, 70.8, 738.7, 69.9, 741.7, 82.2, 756.8, 78.4, 775.0, 86.9, +771.2, 83.6, 767.7, 87.7, 760.4, 88.4, 745.7, 89.9, 744.5, 94.7, +731.1, 91.4, 782.2, 136.8, 788.0, 137.7, 788.0, 138.5, 793.9, 138.7, +800.7, 141.9, 800.0, 143.3, 806.2, 148.0, 811.6, 152.0, 811.6, 152.0, +816.9, 156.1, 818.5, 154.8, 822.6, 162.9, 829.8, 165.7, 834.0, 165.0, +834.8, 169.5, 839.8, 173.3, 876.6, 201.0, 876.6, 201.0, 913.4, 228.8, +918.1, 232.3, 918.0, 232.3, 922.7, 235.8, 925.8, 238.2, 925.8, 238.2, +929.0, 240.6, 912.7, 229.3, 912.8, 229.1, 896.6, 217.7, 896.5, 217.6, +896.4, 217.7, 896.3, 217.7, 858.2, 190.7, 858.3, 190.6, 820.2, 163.7, +801.2, 150.2, 798.9, 152.6, 782.2, 136.8, 782.6, 330.9, 782.3, 332.4, +782.8, 333.4, 782.0, 333.8, 780.3, 335.4, 782.3, 338.7, 780.8, 339.3, +767.9, 345.5, 767.9, 345.5, 755.0, 351.7, 744.1, 349.8, 745.6, 341.5, +736.2, 331.2, 736.2, 331.2, 730.1, 324.6, 724.0, 317.9, 748.1, 316.3, +748.5, 323.3, 773.0, 328.8, 777.8, 329.9, 778.5, 328.6, 782.6, 330.9, +578.7, 157.1, 578.3, 156.9, 578.1, 157.0, 578.0, 156.8, 567.2, 135.5, +567.2, 135.5, 556.4, 114.1, 565.8, 120.1, 566.5, 119.0, 576.5, 124.0, +581.7, 126.7, 581.8, 126.6, 587.0, 129.2, 596.9, 134.4, 596.9, 134.4, +606.8, 139.6, 603.3, 151.5, 592.9, 148.5, 578.7, 157.1, 690.7, 281.6, +697.1, 288.6, 697.1, 288.6, 703.6, 295.6, 710.4, 303.0, 710.4, 303.0, +717.1, 310.4, 720.6, 314.2, 720.6, 314.2, 724.0, 317.9, 730.1, 324.6, +736.2, 331.2, 736.2, 331.2, 745.6, 341.5, 744.1, 349.8, 755.0, 351.7, +750.9, 353.7, 750.9, 353.7, 746.8, 355.7, 734.4, 346.0, 737.0, 342.8, +727.2, 329.8, 708.9, 305.7, 707.9, 306.5, 690.7, 281.6, 645.4, 281.4, +639.4, 274.1, 639.4, 274.1, 633.4, 266.7, 624.4, 257.5, 629.3, 253.2, +621.3, 242.7, 617.0, 239.1, 618.6, 237.3, 615.8, 231.9, 631.1, 256.4, +632.5, 255.7, 645.4, 281.4, 695.4, 173.0, 681.8, 158.3, 682.3, 157.8, +668.3, 143.7, 666.0, 142.0, 666.3, 141.5, 664.3, 139.4, 666.5, 141.3, +666.8, 140.9, 669.2, 142.5, 711.0, 169.1, 716.3, 163.2, 752.8, 195.8, +753.2, 196.1, 753.4, 195.9, 753.8, 196.2, 758.2, 199.1, 758.1, 199.2, +762.5, 202.3, 764.9, 203.9, 764.9, 203.8, 767.2, 205.4, 768.4, 206.2, +768.4, 206.2, 769.5, 207.0, 732.3, 190.2, 729.6, 194.5, 695.4, 173.0, +769.5, 207.0, 794.8, 224.5, 794.8, 224.5, 820.2, 241.9, 812.5, 238.1, +810.9, 240.7, 804.0, 236.0, 757.7, 213.1, 757.7, 213.1, 711.3, 190.3, +709.2, 189.3, 709.9, 187.9, 707.8, 186.5, 707.8, 186.6, 701.6, 179.8, +695.4, 173.0, 729.6, 194.5, 732.3, 190.2, 769.5, 207.0, 574.2, 109.7, +572.5, 108.7, 572.4, 108.8, 570.7, 107.6, 569.7, 106.9, 569.6, 106.1, +568.7, 106.2, 569.2, 106.1, 569.2, 106.1, 569.8, 106.0, 572.2, 107.5, +572.8, 107.4, 574.2, 109.7, 538.5, 212.0, 511.4, 202.2, 511.4, 202.2, +484.2, 192.4, 483.2, 193.7, 468.9, 182.5, 453.6, 172.7, 477.3, 175.2, +476.5, 183.3, 499.3, 193.9, 505.2, 196.6, 505.2, 196.6, 511.1, 199.4, +524.8, 205.7, 524.1, 208.3, 538.5, 212.0, 480.4, 35.4, 492.4, 20.0, +492.4, 20.0, 504.3, 4.5, 503.8, 5.4, 504.9, 6.1, 505.4, 7.7, +500.4, 15.2, 499.3, 14.5, 493.2, 21.2, 486.8, 28.3, 485.7, 27.5, +480.4, 35.4, 413.7, 132.6, 409.4, 132.7, 408.4, 130.9, 405.1, 132.7, +406.3, 131.1, 406.3, 131.1, 407.5, 129.4, 427.1, 106.7, 425.9, 105.7, +444.3, 82.0, 453.8, 73.5, 465.3, 82.3, 470.6, 73.3, 450.2, 107.6, +442.5, 103.1, 414.2, 132.6, 414.0, 132.6, 414.0, 132.6, 413.7, 132.6, +470.6, 73.3, 480.3, 65.3, 491.4, 73.5, 496.1, 64.9, 470.4, 92.8, +470.4, 92.8, 444.8, 120.8, 428.9, 123.9, 424.2, 121.8, 414.2, 132.6, +414.0, 132.6, 414.0, 132.6, 413.7, 132.6, 442.0, 102.8, 439.1, 99.2, +470.6, 73.3, 578.5, 1.0, 573.7, -6.8, 567.4, -13.1, 568.9, -14.7, +569.8, -17.4, 571.5, -18.3, 570.6, -20.1, 568.1, -21.8, 573.8, -30.5, +577.0, -41.0, 574.6, -40.2, 577.3, -31.7, 577.7, -22.4, 578.1, -10.7, +584.0, -3.9, 578.5, 1.0, 240.9, 156.3, 240.3, 155.6, 239.5, 155.4, +239.6, 154.9, 248.0, 118.7, 248.0, 118.7, 256.4, 82.5, 253.0, 96.4, +253.5, 96.5, 250.6, 110.4, 245.7, 133.4, 246.6, 133.6, 240.9, 156.3, +254.9, 243.8, 255.7, 242.2, 250.0, 239.5, 245.2, 235.3, 235.1, 226.5, +234.7, 226.9, 225.0, 217.7, 225.1, 217.0, 225.1, 217.0, 225.3, 216.3, +226.0, 217.1, 248.9, 202.2, 265.1, 182.1, 266.6, 180.8, 266.6, 180.8, +268.0, 179.5, 268.3, 176.5, 271.1, 176.8, 274.3, 174.1, 267.1, 209.5, +270.2, 211.6, 254.9, 243.8, 274.3, 174.1, 280.3, 169.0, 280.3, 169.0, +286.3, 163.8, 286.7, 162.2, 291.1, 164.4, 293.7, 162.2, 289.7, 178.2, +281.7, 180.7, 285.8, 194.3, 287.8, 196.8, 281.7, 200.4, 283.1, 204.9, +269.4, 209.6, 276.7, 231.0, 270.2, 257.1, 270.8, 256.4, 254.6, 250.1, +254.9, 243.8, 270.2, 211.6, 267.1, 209.5, 274.3, 174.1, 245.2, 235.3, +250.0, 239.5, 255.7, 242.2, 254.9, 243.8, 254.6, 250.1, 270.8, 256.4, +270.2, 257.1, 266.8, 270.9, 262.5, 271.2, 263.4, 284.6, 260.9, 283.4, +260.9, 283.4, 258.3, 282.1, 252.2, 279.3, 252.4, 278.8, 246.4, 275.6, +241.1, 256.7, 240.2, 253.9, 245.2, 235.3, 246.4, 275.6, 230.9, 267.1, +231.4, 266.1, 215.5, 258.6, 220.2, 238.1, 220.2, 238.1, 225.0, 217.7, +234.7, 226.9, 235.1, 226.5, 245.2, 235.3, 240.2, 253.9, 241.1, 256.7, +246.4, 275.6, 357.1, 144.7, 357.5, 151.5, 356.2, 151.9, 358.0, 158.3, +344.2, 177.1, 356.5, 189.2, 361.9, 218.8, 361.3, 219.5, 361.3, 219.5, +360.7, 220.3, 355.7, 209.1, 352.7, 208.9, 352.1, 197.2, 350.9, 171.1, +353.2, 170.7, 357.1, 144.7, 310.9, 158.1, 306.2, 144.2, 302.9, 144.6, +301.6, 130.4, 301.6, 130.4, 301.5, 130.3, 301.5, 130.3, 301.9, 127.8, +300.6, 127.6, 299.7, 125.0, 298.3, 122.7, 302.5, 120.1, 305.2, 115.3, +310.9, 124.6, 306.7, 127.1, 308.3, 138.9, 309.6, 148.5, 305.7, 151.6, +310.9, 158.1, 309.4, 53.8, 303.3, 55.2, 297.3, 55.1, 297.3, 56.6, +292.3, 52.8, 282.4, 55.0, 278.3, 61.0, 273.9, 47.9, 275.0, 35.4, +269.6, 34.9, 270.1, 33.0, 270.1, 33.0, 270.6, 31.1, 271.6, 29.7, +271.6, 29.7, 272.6, 28.3, 291.9, 39.5, 295.2, 37.4, 309.4, 53.8, +272.6, 28.3, 281.5, 15.3, 281.5, 15.3, 290.4, 2.4, 306.7, 25.1, +311.9, 21.3, 333.5, 40.1, 330.6, 42.5, 329.4, 47.0, 331.0, 48.8, +320.2, 51.3, 320.2, 51.3, 309.4, 53.8, 295.2, 37.4, 291.9, 39.5, +272.6, 28.3, 263.4, 293.9, 267.9, 291.5, 272.4, 291.5, 272.4, 289.1, +272.6, 289.1, 272.7, 289.2, 272.7, 289.2, 272.7, 289.1, 273.2, 289.5, +273.8, 289.7, 269.1, 295.9, 277.3, 306.1, 286.0, 318.8, 284.3, 320.9, +284.3, 320.9, 282.5, 323.1, 275.2, 330.1, 274.9, 329.8, 267.3, 336.5, +265.5, 338.1, 265.4, 339.8, 263.7, 339.6, 263.6, 339.6, 263.7, 337.9, +263.7, 336.2, 263.6, 315.1, 259.6, 314.3, 263.4, 293.9, 153.1, 461.8, +164.8, 441.2, 168.2, 442.5, 176.4, 420.6, 176.4, 416.5, 178.7, 416.5, +181.0, 412.4, 186.9, 405.9, 190.4, 408.1, 194.2, 400.8, 180.4, 426.9, +177.6, 425.5, 161.0, 450.1, 157.1, 456.0, 156.4, 455.6, 153.1, 461.8, +149.5, 388.3, 147.8, 368.2, 147.8, 368.2, 146.0, 348.1, 150.8, 329.2, +150.0, 329.0, 154.0, 309.9, 158.2, 344.5, 152.0, 345.3, 150.0, 380.7, +149.8, 384.5, 149.1, 384.6, 149.5, 388.3, 488.6, 852.4, 490.1, 864.3, +489.4, 864.4, 491.6, 876.2, 491.8, 878.8, 490.7, 880.5, 492.0, 881.3, +484.3, 884.0, 483.2, 883.3, 474.9, 881.8, 475.7, 881.1, 474.8, 880.1, +474.7, 878.3, 473.9, 865.1, 467.8, 861.9, 473.1, 852.0, 474.8, 848.9, +485.7, 848.5, 488.6, 852.4, 473.1, 852.0, 460.8, 773.6, 466.9, 772.5, +463.6, 692.9, 466.0, 687.8, 466.3, 687.2, 466.1, 681.7, 466.6, 682.9, +466.6, 682.9, 467.1, 684.1, 461.8, 693.8, 469.0, 697.8, 470.8, 711.5, +474.2, 737.2, 474.2, 737.2, 477.6, 762.9, 477.9, 765.2, 477.9, 765.3, +478.2, 767.6, 483.4, 810.0, 483.4, 810.0, 488.6, 852.4, 485.7, 848.5, +474.8, 848.9, 473.1, 852.0, 580.6, 496.9, 580.8, 495.0, 576.3, 494.4, +572.1, 491.9, 568.0, 489.5, 564.1, 489.9, 563.8, 487.0, 566.6, 477.0, +566.8, 467.0, 569.4, 467.1, 572.1, 457.2, 568.4, 453.0, 574.9, 447.3, +572.0, 449.9, 575.7, 454.1, 576.4, 460.9, 578.5, 478.9, 583.0, 479.5, +580.6, 496.9, 570.5, 776.6, 568.1, 777.6, 568.6, 778.9, 566.7, 781.1, +553.8, 796.7, 553.8, 796.7, 540.9, 812.3, 525.4, 830.9, 521.3, 851.8, +510.0, 849.6, 512.6, 828.3, 512.6, 828.3, 515.2, 807.1, 515.6, 805.4, +517.5, 805.8, 519.9, 804.5, 533.1, 797.2, 533.1, 797.2, 546.4, 789.9, +558.4, 783.3, 557.9, 782.0, 570.5, 776.6, 538.4, 619.0, 540.1, 605.1, +540.1, 605.1, 541.9, 591.3, 541.1, 592.1, 553.2, 598.7, 552.4, 604.6, +551.4, 612.5, 537.6, 618.0, 538.4, 619.0, 476.1, 608.4, 475.7, 614.6, +466.7, 616.9, 468.3, 620.3, 469.2, 607.8, 469.2, 607.8, 470.1, 595.2, +468.0, 598.4, 476.6, 602.1, 476.1, 608.4, 470.1, 595.2, 472.3, 563.6, +472.3, 563.6, 474.6, 531.9, 475.4, 529.7, 486.1, 528.4, 491.4, 532.6, +488.9, 543.1, 496.5, 551.7, 508.7, 559.0, 503.3, 585.9, 497.1, 588.7, +476.1, 608.4, 476.6, 602.1, 468.0, 598.4, 470.1, 595.2, 549.3, 443.3, +563.3, 440.9, 563.8, 442.5, 577.4, 438.4, 576.8, 438.4, 576.1, 442.9, +574.9, 447.3, 568.4, 453.0, 572.1, 457.2, 569.4, 467.1, 563.1, 466.9, +562.9, 477.0, 556.3, 486.9, 544.2, 472.5, 552.8, 465.2, 549.3, 443.5, +549.3, 443.4, 549.3, 443.3, 549.3, 443.3, 516.5, 550.4, 517.0, 557.6, +517.0, 557.6, 517.5, 564.7, 517.6, 565.4, 517.1, 566.1, 517.0, 566.1, +516.8, 566.1, 517.0, 565.3, 517.0, 564.6, 516.7, 557.5, 518.6, 551.0, +516.5, 550.4, 474.2, 687.1, 474.0, 684.3, 473.9, 684.3, 473.7, 681.5, +492.4, 628.3, 493.5, 628.7, 513.3, 575.9, 514.3, 573.4, 514.3, 573.5, +515.2, 571.0, 505.3, 599.1, 505.3, 599.1, 495.3, 627.2, 484.8, 657.2, +485.9, 657.6, 474.2, 687.1, 450.6, 316.3, 450.9, 313.9, 452.2, 312.4, +451.2, 311.6, 456.5, 306.3, 452.4, 302.1, 453.6, 292.6, 456.8, 298.7, +459.4, 299.2, 466.5, 301.3, 472.6, 312.8, 472.6, 312.8, 478.6, 324.2, +478.7, 323.4, 471.0, 322.1, 463.3, 319.9, 461.5, 319.4, 461.5, 319.4, +459.7, 318.9, 458.1, 318.4, 458.1, 318.4, 456.6, 318.0, 453.6, 317.2, +452.2, 318.3, 450.6, 316.3, 193.0, 612.6, 191.5, 619.8, 193.1, 620.6, +189.9, 626.9, 187.0, 635.3, 187.0, 635.3, 184.0, 643.8, 184.3, 642.6, +183.1, 642.3, 182.2, 640.8, 182.7, 636.7, 183.7, 636.8, 185.3, 632.9, +188.4, 624.7, 188.4, 624.7, 191.5, 616.5, 192.3, 614.5, 192.7, 614.6, +193.0, 612.6, 219.0, 424.9, 221.4, 447.0, 233.1, 461.9, 223.8, 469.2, +218.1, 495.7, 218.1, 495.7, 212.4, 522.3, 207.3, 474.5, 208.9, 472.1, +219.0, 424.9, 212.4, 522.3, 209.1, 537.8, 209.1, 537.8, 205.8, 553.2, +203.9, 543.4, 200.7, 544.0, 195.7, 534.8, 207.3, 489.8, 222.8, 476.9, +205.2, 441.3, 211.9, 430.8, 211.9, 430.8, 218.5, 420.3, 217.7, 422.0, +218.8, 422.6, 219.0, 424.9, 208.9, 472.1, 207.3, 474.5, 212.4, 522.3, +461.7, 734.0, 463.2, 759.7, 463.1, 759.8, 464.7, 785.5, 462.5, 801.0, +462.5, 801.0, 460.2, 816.6, 455.1, 797.7, 446.6, 800.0, 433.0, 783.4, +430.7, 774.5, 439.5, 772.2, 446.0, 761.1, 450.1, 753.9, 450.1, 753.9, +454.2, 746.8, 458.0, 740.4, 463.1, 739.0, 461.7, 734.0, 447.6, 495.3, +448.0, 501.2, 447.9, 501.2, 448.3, 507.2, 450.3, 533.5, 449.9, 533.5, +451.5, 559.9, 451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 451.9, 567.7, +451.9, 567.7, 451.5, 559.9, 449.9, 533.5, 450.3, 533.5, 448.3, 507.2, +447.9, 501.2, 448.0, 501.2, 447.6, 495.3, 413.5, 651.4, 420.1, 608.0, +416.2, 607.4, 419.2, 563.4, 419.9, 555.0, 419.9, 555.0, 420.6, 546.5, +420.6, 543.2, 420.9, 543.2, 421.2, 539.9, 424.7, 497.4, 425.3, 497.4, +428.3, 454.9, 429.0, 448.0, 429.9, 448.1, 431.6, 441.3, 431.6, 441.3, +431.6, 441.3, 431.6, 441.3, 436.2, 422.4, 436.2, 422.4, 440.8, 403.5, +441.3, 401.3, 442.4, 401.0, 441.8, 399.1, 442.2, 404.5, 442.2, 404.5, +442.5, 409.9, 428.9, 530.8, 431.7, 531.2, 413.5, 651.4, 442.5, 409.9, +443.4, 424.6, 443.4, 424.6, 444.3, 439.3, 444.3, 445.8, 443.4, 445.8, +442.5, 452.2, 432.1, 526.1, 432.1, 526.1, 421.8, 600.0, 417.1, 633.6, +417.8, 633.8, 412.4, 667.3, 413.3, 659.4, 413.0, 659.4, 413.5, 651.4, +431.7, 531.2, 428.9, 530.8, 442.5, 409.9, 383.3, 722.9, 393.5, 735.4, +396.2, 749.3, 403.8, 747.8, 409.1, 754.3, 409.1, 754.3, 414.4, 760.8, +416.7, 763.5, 416.7, 763.5, 418.9, 766.3, 423.1, 771.4, 424.8, 770.6, +427.3, 776.5, 434.5, 793.1, 432.8, 793.9, 438.3, 811.2, 438.3, 811.3, +438.3, 811.3, 438.3, 811.3, 438.3, 811.3, 438.3, 811.3, 438.3, 811.2, +420.6, 782.9, 420.6, 782.9, 403.0, 754.5, 393.1, 738.7, 381.6, 737.4, +383.3, 722.9, 366.8, 867.4, 358.6, 864.1, 355.0, 857.9, 350.4, 860.7, +354.5, 820.5, 354.5, 820.5, 358.6, 780.4, 359.1, 775.3, 359.2, 775.3, +359.7, 770.2, 363.7, 811.1, 362.7, 811.2, 365.7, 852.2, 366.3, 859.8, +369.6, 865.9, 366.8, 867.4, 377.8, 211.3, 377.6, 210.3, 377.6, 210.3, +377.5, 209.4, 397.1, 195.9, 394.7, 192.4, 411.9, 175.4, 400.3, 185.7, +401.1, 186.7, 390.4, 198.0, 389.4, 199.1, 389.4, 199.1, 388.3, 200.2, +383.0, 205.7, 383.6, 206.3, 377.8, 211.3, 239.8, 662.8, 239.0, 701.7, +233.3, 701.6, 226.8, 740.4, 226.3, 743.4, 225.6, 743.4, 225.8, 746.3, +225.1, 709.3, 223.8, 709.3, 221.9, 672.3, 221.9, 670.5, 225.1, 670.6, +228.3, 668.9, 234.0, 665.8, 239.7, 665.9, 239.8, 662.8, 223.6, 759.5, +224.7, 752.9, 226.0, 752.9, 225.8, 746.3, 225.6, 743.4, 226.3, 743.4, +226.8, 740.4, 243.2, 724.1, 244.4, 725.4, 262.0, 710.4, 263.0, 709.5, +263.0, 709.5, 264.0, 708.7, 312.0, 667.8, 311.7, 667.4, 360.0, 626.8, +359.6, 627.2, 360.2, 627.9, 359.8, 628.3, 353.5, 635.0, 353.1, 634.7, +346.4, 641.2, 315.7, 670.8, 315.7, 670.8, 284.9, 700.5, 262.0, 722.6, +262.0, 722.6, 239.0, 744.7, 237.6, 746.0, 237.6, 746.0, 236.2, 747.4, +229.9, 753.5, 229.3, 760.1, 223.6, 759.5, 285.2, 852.2, 296.7, 804.1, +297.5, 803.6, 317.2, 758.2, 316.2, 760.6, 323.3, 763.1, 322.6, 766.3, +318.0, 785.6, 314.5, 784.8, 306.5, 803.3, 295.8, 827.8, 291.3, 826.7, +285.2, 852.2, 349.9, 662.3, 350.7, 654.7, 355.3, 654.7, 355.0, 647.4, +352.0, 670.9, 358.7, 672.9, 351.3, 694.7, 351.0, 696.9, 351.9, 697.8, +350.7, 699.0, 338.7, 735.0, 345.8, 737.4, 340.8, 775.8, 339.6, 719.2, +343.7, 718.9, 349.9, 662.3, 340.8, 775.8, 339.9, 783.2, 339.9, 783.2, +338.9, 790.7, 327.5, 784.7, 330.7, 778.5, 322.6, 766.3, 323.3, 763.1, +316.2, 760.6, 317.2, 758.2, 319.6, 741.4, 322.8, 741.8, 328.4, 725.4, +338.4, 696.1, 338.4, 696.1, 348.4, 666.8, 349.1, 664.5, 349.7, 664.6, +349.9, 662.3, 343.7, 718.9, 339.6, 719.2, 340.8, 775.8, 385.0, 633.5, +387.8, 636.1, 383.1, 641.1, 381.3, 648.8, 380.1, 653.4, 380.1, 653.4, +379.0, 658.0, 378.4, 660.7, 376.7, 661.9, 377.7, 663.3, 370.4, 646.5, +368.6, 647.3, 359.5, 631.2, 359.8, 632.0, 361.1, 631.4, 362.7, 631.5, +373.8, 632.5, 378.5, 627.5, 385.0, 633.5, 400.7, 531.7, 402.1, 534.9, +401.5, 535.4, 403.6, 538.0, 403.4, 537.8, 403.4, 537.8, 403.2, 537.7, +357.2, 510.5, 356.8, 511.0, 310.5, 484.3, 343.2, 510.4, 348.2, 504.2, +386.0, 524.0, 393.3, 527.9, 394.3, 526.7, 400.7, 531.7, 356.4, 303.0, +350.0, 293.2, 344.7, 282.9, 343.5, 283.5, 344.3, 276.1, 338.5, 275.2, +332.8, 267.4, 335.2, 259.1, 340.4, 253.4, 337.6, 250.9, 339.1, 248.9, +340.9, 248.6, 340.6, 246.9, 340.1, 246.3, 343.2, 243.5, 345.7, 240.1, +353.6, 266.3, 350.3, 267.3, 355.0, 294.4, 355.7, 298.7, 353.9, 300.6, +356.4, 303.0, 384.0, 325.9, 390.1, 329.9, 392.4, 326.4, 400.9, 326.8, +403.1, 330.3, 415.1, 326.1, 415.3, 327.6, 419.6, 334.6, 419.6, 334.6, +423.8, 341.6, 403.5, 340.5, 401.6, 337.3, 384.0, 325.9, 354.1, 435.3, +341.6, 425.3, 342.3, 424.3, 329.1, 415.3, 326.5, 412.4, 326.5, 412.4, +324.0, 409.5, 332.6, 410.0, 335.1, 405.5, 342.0, 397.7, 367.3, 394.6, +370.0, 392.8, 393.7, 400.8, 390.0, 399.5, 387.8, 405.9, 381.9, 411.1, +368.0, 423.2, 368.9, 434.1, 354.1, 435.3, 272.8, 437.6, 273.4, 436.3, +273.4, 436.3, 274.1, 435.0, 268.9, 461.0, 268.4, 460.9, 262.9, 486.8, +261.9, 491.5, 261.0, 496.3, 261.0, 496.3, 261.0, 496.3, 261.9, 491.5, +262.9, 486.8, 267.9, 462.2, 267.5, 462.1, 272.8, 437.6, 67.4, 175.0, +67.4, 174.8, 67.4, 174.8, 67.4, 174.6, 69.5, 163.5, 68.3, 163.3, +69.2, 152.0, 70.3, 157.7, 73.0, 157.2, 76.7, 162.3, 87.0, 209.4, +89.9, 208.8, 103.2, 255.3, 115.4, 232.0, 85.9, 216.5, 68.6, 177.8, +68.0, 176.4, 67.9, 176.4, 67.4, 175.0, 60.2, 159.3, 61.6, 171.9, +66.0, 173.1, 63.0, 184.6, 63.0, 185.0, 63.2, 185.1, 63.0, 185.5, +63.0, 185.5, 63.0, 185.5, 63.0, 185.6, 65.5, 192.5, 53.0, 194.9, +48.4, 206.4, 44.4, 195.3, 38.1, 193.9, 40.3, 184.2, 41.9, 137.6, +41.9, 137.6, 43.5, 91.0, 30.1, 107.8, 53.0, 124.9, 60.2, 159.3, +43.5, 91.0, 43.7, 85.4, 43.7, 85.4, 43.9, 79.8, 46.9, 72.5, +46.3, 72.1, 47.6, 64.1, 49.1, 68.4, 49.1, 68.4, 50.5, 72.6, +53.3, 116.1, 55.4, 116.0, 60.2, 159.3, 53.0, 124.9, 30.1, 107.8, +43.5, 91.0, 681.0, 569.7, 678.1, 569.9, 678.1, 569.9, 675.1, 570.2, +666.1, 555.9, 665.9, 556.0, 656.7, 541.9, 658.6, 545.0, 659.2, 544.7, +661.6, 547.5, 671.3, 558.6, 673.6, 557.2, 681.0, 569.7, 641.5, 479.0, +641.5, 479.0, 641.5, 479.0, 641.6, 478.9, 639.0, 466.5, 650.4, 464.2, +659.2, 449.5, 665.3, 457.3, 683.8, 457.8, 686.6, 453.1, 689.2, 456.4, +689.2, 456.4, 691.8, 459.8, 668.7, 472.9, 666.6, 469.3, 641.6, 478.9, +641.5, 479.0, 641.5, 479.0, 641.5, 479.0, 791.8, 137.2, 766.4, 118.0, +768.4, 102.3, 740.9, 98.7, 740.1, 98.2, 740.1, 98.2, 739.3, 97.6, +735.9, 98.2, 735.2, 94.5, 731.1, 91.4, 744.5, 94.7, 745.7, 89.9, +760.4, 88.4, 777.7, 99.6, 772.6, 107.4, 784.9, 126.3, 788.4, 131.7, +786.9, 134.1, 791.8, 137.2, 796.7, 204.0, 801.9, 215.2, 799.9, 216.7, +807.2, 226.4, 792.9, 218.3, 792.9, 218.3, 778.7, 210.2, 772.5, 209.7, +774.3, 201.8, 767.4, 197.3, 758.0, 193.0, 759.9, 188.8, 752.5, 180.3, +776.1, 185.6, 777.9, 188.2, 796.7, 204.0, 752.5, 180.3, 747.3, 174.3, +748.6, 172.2, 742.1, 168.4, 741.1, 167.9, 741.3, 167.5, 740.5, 166.5, +752.1, 153.2, 750.4, 148.0, 765.4, 141.4, 766.1, 141.1, 768.7, 147.1, +772.0, 152.8, 773.5, 155.3, 773.6, 155.2, 774.9, 157.7, 789.9, 177.8, +785.8, 180.8, 796.7, 204.0, 777.9, 188.2, 776.1, 185.6, 752.5, 180.3, +700.8, 121.1, 692.8, 111.8, 692.8, 111.8, 684.7, 102.6, 687.4, 102.5, +689.7, 98.8, 689.9, 99.1, 714.6, 98.4, 715.3, 102.1, 739.3, 97.6, +740.1, 98.2, 740.1, 98.2, 740.9, 98.7, 752.8, 100.3, 746.8, 120.3, +760.7, 133.2, 761.0, 133.7, 760.9, 134.2, 761.4, 134.3, 731.0, 128.2, +729.0, 132.7, 700.8, 121.1, 761.4, 134.3, 764.2, 135.2, 766.5, 139.8, +765.4, 141.4, 750.4, 148.0, 752.1, 153.2, 740.5, 166.5, 723.1, 146.6, +727.5, 138.7, 705.7, 126.7, 702.9, 126.2, 703.3, 123.9, 700.8, 121.1, +729.0, 132.7, 731.0, 128.2, 761.4, 134.3, 583.1, 158.4, 580.9, 157.7, +580.9, 157.7, 578.7, 157.1, 592.9, 148.5, 603.3, 151.5, 606.8, 139.6, +632.0, 152.8, 632.0, 152.8, 657.2, 166.0, 636.3, 182.6, 620.1, 162.6, +583.1, 158.4, 657.2, 166.0, 673.1, 174.3, 673.1, 174.3, 689.0, 182.7, +693.0, 183.9, 691.0, 188.6, 695.0, 192.2, 690.8, 194.8, 687.8, 190.0, +680.7, 187.9, 666.8, 183.7, 666.8, 183.7, 653.0, 179.5, 623.6, 160.4, +618.0, 168.9, 583.1, 158.4, 620.1, 162.6, 636.3, 182.6, 657.2, 166.0, +733.6, 362.1, 732.7, 362.5, 732.7, 362.5, 731.8, 362.9, 690.2, 300.2, +690.1, 300.2, 645.8, 239.4, 637.4, 227.1, 637.8, 226.9, 629.3, 214.7, +628.1, 213.3, 628.0, 213.3, 626.8, 212.0, 626.8, 212.0, 626.8, 212.0, +626.8, 212.0, 632.4, 218.1, 632.4, 218.1, 638.0, 224.2, 638.4, 224.6, +638.4, 224.6, 638.7, 224.9, 645.6, 232.5, 645.6, 232.5, 652.5, 240.0, +665.2, 253.8, 665.2, 253.8, 677.8, 267.5, 681.5, 271.6, 681.5, 271.6, +685.2, 275.6, 685.8, 276.2, 685.8, 276.2, 686.3, 276.8, 688.5, 279.2, +688.5, 279.2, 690.7, 281.6, 707.9, 306.5, 708.9, 305.7, 727.2, 329.8, +734.6, 343.7, 731.3, 345.8, 733.6, 362.1, 727.2, 329.8, 737.0, 342.8, +734.4, 346.0, 746.8, 355.7, 740.2, 358.9, 740.2, 358.9, 733.6, 362.1, +731.3, 345.8, 734.6, 343.7, 727.2, 329.8, 706.4, 330.7, 717.6, 347.6, +716.2, 348.6, 728.7, 364.4, 725.4, 366.0, 725.4, 366.0, 722.0, 367.6, +721.7, 367.9, 720.8, 365.9, 719.2, 365.0, 705.9, 360.5, 707.9, 354.5, +696.7, 344.0, 687.0, 328.8, 685.1, 330.0, 673.6, 315.9, 675.5, 321.6, +681.7, 319.5, 689.7, 323.2, 698.1, 326.9, 700.6, 324.6, 706.4, 330.7, +668.8, 149.5, 679.7, 163.4, 677.9, 165.3, 690.7, 177.3, 674.4, 168.6, +674.4, 168.6, 658.2, 159.9, 637.3, 162.6, 635.2, 146.2, 612.2, 132.4, +622.3, 122.5, 643.8, 135.2, 668.8, 149.5, 540.0, 203.6, 544.8, 209.8, +544.8, 209.8, 549.5, 216.0, 545.7, 212.3, 544.0, 214.0, 538.5, 212.0, +524.1, 208.3, 524.8, 205.7, 511.1, 199.4, 515.0, 201.9, 516.3, 200.1, +521.4, 200.9, 530.7, 202.2, 532.3, 199.4, 540.0, 203.6, 493.2, 21.2, +499.3, 14.5, 500.4, 15.2, 505.4, 7.7, 510.5, 23.9, 510.5, 23.9, +515.6, 40.0, 515.2, 40.4, 496.9, 33.0, 493.2, 21.2, 515.6, 40.0, +516.0, 41.4, 516.9, 42.3, 516.5, 42.7, 506.3, 53.8, 506.3, 53.8, +496.1, 64.9, 491.4, 73.5, 480.3, 65.3, 470.6, 73.3, 465.3, 82.3, +453.8, 73.5, 444.3, 82.0, 462.3, 58.7, 462.3, 58.7, 480.4, 35.4, +485.7, 27.5, 486.8, 28.3, 493.2, 21.2, 496.9, 33.0, 515.2, 40.4, +515.6, 40.0, 587.3, -74.6, 589.1, -80.4, 589.5, -86.3, 590.9, -86.2, +592.6, -88.4, 597.0, -86.2, 597.6, -88.0, 595.3, -80.4, 593.8, -76.3, +587.3, -74.6, 279.7, 73.4, 281.6, 75.0, 283.3, 74.8, 283.5, 76.5, +283.8, 77.5, 283.8, 77.5, 284.2, 78.5, 274.2, 128.6, 273.3, 128.7, +268.0, 179.5, 266.6, 180.8, 266.6, 180.8, 265.1, 182.1, 265.5, 181.5, +261.8, 178.5, 258.5, 175.0, 257.9, 162.7, 261.1, 162.6, 263.7, 150.1, +265.7, 140.4, 265.7, 140.4, 267.7, 130.7, 273.7, 102.0, 271.5, 101.4, +279.7, 73.4, 353.9, 96.6, 354.4, 104.1, 352.6, 104.8, 354.9, 111.6, +355.4, 111.8, 354.4, 113.6, 355.1, 114.2, 353.0, 126.2, 350.2, 134.3, +356.7, 139.2, 357.2, 139.2, 356.9, 141.9, 357.1, 144.7, 353.2, 170.7, +350.9, 171.1, 352.1, 197.2, 352.7, 194.0, 350.3, 193.8, 349.5, 190.1, +349.1, 188.4, 349.6, 188.2, 349.7, 186.4, 350.0, 180.1, 350.0, 180.1, +350.3, 173.8, 352.1, 135.2, 351.1, 135.1, 353.9, 96.6, 336.8, 156.0, +346.6, 170.8, 343.1, 173.1, 349.5, 190.1, 350.3, 193.8, 352.7, 194.0, +352.1, 197.2, 352.7, 208.9, 355.7, 209.1, 360.7, 220.3, 357.9, 224.1, +354.1, 225.8, 355.0, 227.9, 354.5, 228.5, 354.5, 229.1, 354.1, 229.1, +349.0, 223.4, 336.9, 222.5, 333.8, 226.6, 331.8, 220.7, 331.8, 220.7, +329.9, 214.9, 330.5, 191.8, 332.6, 191.9, 335.3, 168.8, 336.0, 162.4, +339.5, 160.1, 336.8, 156.0, 197.4, 398.0, 197.4, 397.9, 195.8, 399.4, +194.2, 400.8, 190.4, 408.1, 186.9, 405.9, 181.0, 412.4, 185.5, 404.4, +185.5, 404.4, 190.1, 396.4, 191.7, 394.9, 195.3, 395.7, 197.4, 398.0, +267.3, 336.5, 274.9, 329.8, 275.2, 330.1, 282.5, 323.1, 243.4, 371.5, +243.4, 371.5, 204.3, 420.0, 173.8, 423.9, 175.8, 445.4, 149.2, 472.6, +150.9, 467.6, 150.9, 467.6, 152.7, 462.6, 152.8, 462.2, 153.0, 462.3, +153.1, 461.8, 156.4, 455.6, 157.1, 456.0, 161.0, 450.1, 211.6, 394.2, +212.2, 394.7, 263.7, 339.6, 265.4, 339.8, 265.5, 338.1, 267.3, 336.5, +161.0, 450.1, 177.6, 425.5, 180.4, 426.9, 194.2, 400.8, 195.8, 399.4, +197.4, 397.9, 197.4, 398.0, 230.6, 368.8, 230.6, 368.8, 263.7, 339.6, +265.4, 339.8, 265.5, 338.1, 267.3, 336.5, 214.3, 393.5, 219.1, 399.0, +161.0, 450.1, 182.0, 340.9, 181.9, 342.0, 182.1, 342.0, 181.8, 343.0, +179.0, 352.7, 179.1, 352.8, 176.4, 362.5, 177.8, 378.3, 163.4, 379.5, +150.4, 396.6, 158.1, 366.7, 165.8, 368.5, 182.0, 340.9, 606.6, 614.7, +613.0, 605.6, 611.2, 604.3, 615.8, 594.0, 621.3, 581.5, 619.6, 580.4, +626.8, 569.1, 625.3, 571.4, 628.0, 572.7, 627.2, 575.8, 626.3, 579.7, +625.3, 579.5, 623.3, 583.1, 615.0, 598.9, 616.8, 600.2, 606.6, 614.7, +755.2, 696.0, 759.7, 703.1, 759.7, 703.1, 764.3, 710.3, 750.1, 721.0, +751.8, 723.2, 739.3, 736.1, 743.2, 733.3, 741.4, 730.8, 743.5, 725.6, +749.3, 710.8, 744.3, 704.0, 755.2, 696.0, 615.8, 594.0, 611.2, 604.3, +613.0, 605.6, 606.6, 614.7, 598.3, 633.5, 603.5, 638.6, 590.1, 652.2, +590.7, 651.6, 585.5, 646.4, 580.9, 640.6, 579.6, 639.0, 579.6, 639.0, +578.3, 637.3, 577.2, 636.0, 576.0, 635.8, 576.1, 634.6, 576.4, 631.8, +577.6, 632.0, 579.1, 629.3, 579.9, 628.0, 579.9, 628.0, 580.6, 626.7, +586.2, 616.8, 583.9, 614.2, 591.8, 606.9, 601.4, 597.9, 609.1, 590.4, +615.8, 594.0, 591.8, 606.9, 587.9, 600.6, 599.4, 593.4, 607.0, 580.0, +621.3, 554.7, 618.1, 552.2, 635.6, 529.4, 635.9, 529.0, 641.7, 530.6, +642.5, 533.4, 643.4, 536.7, 640.7, 537.4, 639.0, 541.4, 632.9, 555.2, +632.9, 555.2, 626.8, 569.1, 619.6, 580.4, 621.3, 581.5, 615.8, 594.0, +609.1, 590.4, 601.4, 597.9, 591.8, 606.9, 576.4, 460.9, 575.7, 454.1, +572.0, 449.9, 574.9, 447.3, 576.1, 442.9, 576.8, 438.4, 577.4, 438.4, +578.4, 438.1, 577.9, 436.5, 578.5, 434.6, 598.0, 464.0, 628.7, 470.0, +623.1, 489.8, 630.0, 500.6, 631.2, 500.0, 636.9, 511.4, 637.2, 511.8, +637.6, 512.1, 637.5, 512.3, 637.5, 512.3, 637.5, 512.3, 637.5, 512.3, +607.0, 486.6, 604.0, 489.4, 576.4, 460.9, 637.5, 512.3, 639.7, 515.7, +639.7, 515.7, 641.9, 519.1, 649.1, 530.3, 655.8, 530.1, 656.3, 541.6, +656.1, 537.2, 649.4, 537.5, 642.5, 533.4, 641.7, 530.6, 635.9, 529.0, +635.6, 529.4, 620.6, 520.5, 620.6, 520.5, 605.6, 511.6, 602.6, 509.9, +602.6, 509.9, 599.7, 508.2, 590.1, 502.5, 584.7, 505.2, 580.6, 496.9, +583.0, 479.5, 578.5, 478.9, 576.4, 460.9, 610.9, 469.7, 606.8, 486.0, +636.9, 511.4, 637.2, 511.8, 637.6, 512.1, 637.5, 512.3, 637.5, 512.3, +637.5, 512.3, 637.5, 512.3, 573.7, 767.7, 573.8, 767.6, 575.8, 769.6, +575.5, 770.6, 574.2, 774.0, 573.6, 774.5, 570.5, 776.6, 557.9, 782.0, +558.4, 783.3, 546.4, 789.9, 553.7, 788.1, 552.8, 784.7, 559.2, 779.4, +566.5, 773.6, 565.6, 772.1, 573.7, 767.7, 595.9, 745.9, 603.8, 735.1, +604.5, 735.6, 613.0, 725.3, 621.9, 714.5, 620.4, 712.7, 630.9, 703.8, +630.8, 703.8, 632.3, 705.6, 633.8, 707.5, 634.9, 708.8, 636.2, 709.4, +635.9, 710.2, 634.5, 713.3, 633.1, 712.6, 630.4, 715.1, 623.2, 721.6, +623.2, 721.6, 616.0, 728.0, 609.7, 733.6, 609.7, 733.6, 603.4, 739.3, +602.5, 740.0, 602.5, 740.0, 601.6, 740.8, 598.8, 743.4, 598.1, 742.9, +595.9, 745.9, 545.8, 831.4, 545.8, 831.4, 550.9, 851.6, 556.0, 871.7, +556.0, 871.9, 556.0, 871.9, 556.1, 872.2, 556.7, 874.7, 556.7, 874.7, +557.4, 877.2, 557.6, 878.3, 557.7, 879.4, 557.9, 879.4, 539.7, 881.0, +522.2, 884.3, 521.2, 880.5, 516.2, 860.4, 528.4, 835.8, 545.8, 831.4, +521.2, 880.5, 518.2, 884.3, 506.9, 883.2, 506.1, 880.9, 511.1, 866.3, +508.0, 865.3, 510.0, 849.6, 521.3, 851.8, 525.4, 830.9, 540.9, 812.3, +538.9, 813.6, 542.7, 819.2, 544.4, 826.1, 544.5, 826.3, 544.5, 826.3, +544.5, 826.6, 545.2, 829.0, 546.6, 829.6, 545.8, 831.4, 528.4, 835.8, +516.2, 860.4, 521.2, 880.5, 501.0, 479.8, 509.2, 464.3, 517.2, 464.4, +517.4, 448.8, 528.2, 446.9, 528.2, 446.9, 539.0, 445.1, 538.5, 445.1, +538.5, 445.4, 538.1, 445.8, 529.7, 453.6, 529.7, 453.6, 521.2, 461.3, +511.1, 470.5, 499.2, 474.1, 501.0, 479.8, 513.3, 575.9, 493.5, 628.7, +492.4, 628.3, 473.7, 681.5, 473.3, 677.4, 473.3, 677.4, 472.9, 673.2, +478.0, 656.7, 479.6, 657.2, 486.2, 641.2, 499.8, 608.6, 502.9, 609.6, +513.3, 575.9, 495.3, 627.2, 497.7, 601.0, 504.3, 601.6, 513.3, 575.9, +514.3, 573.4, 514.3, 573.5, 515.2, 571.0, 516.1, 568.5, 516.1, 568.5, +517.0, 566.1, 517.1, 566.1, 517.6, 565.4, 517.5, 564.7, 519.4, 590.9, +515.0, 592.1, 521.3, 617.1, 514.9, 633.7, 506.3, 648.9, 508.5, 650.2, +506.8, 653.2, 507.2, 653.4, 506.0, 656.7, 498.3, 643.3, 494.0, 641.4, +495.3, 627.2, 506.0, 656.7, 495.0, 685.1, 490.1, 684.0, 484.0, 713.4, +484.7, 720.8, 478.3, 721.1, 478.0, 728.9, 471.0, 709.9, 470.8, 707.1, +474.2, 687.1, 485.9, 657.6, 484.8, 657.2, 495.3, 627.2, 494.0, 641.4, +498.3, 643.3, 506.0, 656.7, 445.1, 359.6, 446.0, 352.4, 448.3, 351.9, +446.9, 345.2, 449.8, 331.0, 448.7, 330.7, 450.6, 316.3, 452.2, 318.3, +453.6, 317.2, 456.6, 318.0, 457.2, 318.6, 456.1, 319.7, 455.6, 321.4, +451.7, 335.6, 451.7, 335.6, 447.8, 349.9, 446.4, 354.8, 444.3, 355.2, +445.1, 359.6, 158.8, 562.8, 158.5, 560.6, 157.7, 560.5, 158.2, 558.4, +158.5, 556.2, 157.8, 556.1, 157.5, 553.7, 156.4, 553.2, 158.4, 549.0, +159.2, 544.2, 160.5, 553.3, 159.4, 553.5, 158.8, 562.8, 418.2, 496.4, +418.2, 496.3, 418.2, 496.3, 418.3, 496.3, 418.3, 496.3, 418.3, 496.3, +418.3, 496.4, 418.3, 496.4, 418.2, 496.4, 418.2, 496.4, 379.0, 658.0, +380.1, 653.4, 380.1, 653.4, 381.3, 648.8, 391.3, 646.7, 392.2, 650.9, +403.1, 653.0, 407.3, 653.8, 411.0, 652.7, 411.6, 654.6, 410.7, 664.7, +410.7, 664.7, 409.9, 674.8, 395.5, 676.3, 391.6, 669.5, 379.0, 658.0, +409.9, 674.8, 408.8, 688.1, 411.8, 689.1, 407.6, 701.4, 407.5, 703.4, +407.5, 703.4, 407.3, 705.4, 406.9, 710.5, 406.9, 710.5, 406.5, 715.6, +406.4, 715.7, 406.4, 715.7, 406.4, 715.8, 406.3, 717.1, 406.0, 718.3, +406.2, 718.4, 395.6, 705.4, 385.7, 702.3, 369.0, 705.6, 368.3, 705.3, +367.7, 704.7, 367.8, 704.1, 372.0, 686.8, 377.1, 669.7, 376.3, 669.4, +378.0, 667.1, 378.7, 665.6, 377.7, 663.3, 376.7, 661.9, 378.4, 660.7, +379.0, 658.0, 391.6, 669.5, 395.5, 676.3, 409.9, 674.8, 442.5, 452.2, +443.4, 445.8, 444.3, 445.8, 444.3, 439.3, 445.1, 452.6, 444.2, 452.7, +445.8, 465.9, 448.0, 480.4, 446.7, 480.6, 447.6, 495.3, 448.0, 501.2, +447.9, 501.2, 448.3, 507.2, 450.3, 533.5, 449.9, 533.5, 451.5, 559.9, +451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 452.6, 578.7, 452.6, 578.7, +452.8, 581.9, 452.2, 585.4, 451.5, 585.3, 450.2, 588.8, 447.3, 596.8, +443.2, 597.4, 444.3, 604.8, 439.9, 575.1, 444.0, 574.5, 443.6, 544.2, +443.0, 498.2, 442.2, 498.2, 442.5, 452.2, 363.4, 734.1, 364.4, 724.0, +361.6, 722.8, 365.4, 714.0, 365.5, 713.7, 365.5, 713.7, 365.5, 713.5, +366.7, 708.8, 366.7, 708.8, 367.8, 704.1, 367.7, 704.7, 368.3, 705.3, +369.0, 705.6, 374.3, 704.6, 376.1, 714.2, 383.3, 722.9, 381.6, 737.4, +393.1, 738.7, 403.0, 754.5, 402.3, 755.6, 388.1, 746.8, 373.2, 739.2, +368.3, 736.6, 364.5, 737.8, 363.4, 734.1, 382.3, 243.1, 380.0, 227.2, +380.0, 227.2, 377.8, 211.3, 383.6, 206.3, 383.0, 205.7, 388.3, 200.2, +392.4, 214.6, 386.1, 216.4, 383.8, 232.7, 383.0, 237.9, 381.0, 238.5, +382.3, 243.1, 262.2, 528.4, 258.2, 543.6, 259.6, 544.0, 257.0, 559.6, +255.0, 571.8, 255.0, 571.8, 252.9, 584.1, 247.6, 616.0, 247.6, 616.0, +242.3, 647.9, 241.0, 655.3, 243.6, 657.0, 239.8, 662.8, 239.7, 665.9, +234.0, 665.8, 228.3, 668.9, 240.2, 597.8, 243.9, 598.3, 262.2, 528.4, +228.3, 668.9, 225.1, 670.6, 221.9, 670.5, 221.9, 672.3, 221.3, 662.2, +223.9, 661.3, 220.8, 652.1, 226.3, 633.0, 226.4, 633.0, 231.9, 614.0, +250.7, 549.3, 247.1, 548.0, 269.5, 484.6, 262.2, 505.2, 267.1, 506.8, +262.2, 528.4, 243.9, 598.3, 240.2, 597.8, 228.3, 668.9, 212.2, 827.7, +217.9, 793.6, 217.9, 793.6, 223.6, 759.5, 229.3, 760.1, 229.9, 753.5, +236.2, 747.4, 233.8, 748.3, 235.0, 751.5, 233.8, 755.6, 232.7, 759.2, +232.7, 759.2, 231.7, 762.7, 221.9, 795.2, 209.5, 826.6, 212.2, 827.7, +252.9, 584.1, 255.0, 571.8, 255.0, 571.8, 257.0, 559.6, 255.6, 564.2, +257.2, 564.7, 257.4, 569.9, 257.5, 573.8, 257.5, 573.8, 257.6, 577.7, +258.6, 606.4, 272.9, 617.1, 259.5, 635.1, 270.6, 620.2, 253.8, 609.7, +252.9, 584.1, 354.7, 534.6, 362.3, 542.1, 362.3, 542.1, 370.0, 549.5, +371.9, 552.9, 369.4, 554.3, 368.8, 559.1, 364.9, 589.4, 368.6, 590.3, +361.0, 619.6, 363.8, 608.6, 360.1, 607.6, 359.2, 595.6, 358.0, 579.6, +358.0, 579.6, 356.8, 563.5, 356.1, 553.6, 356.1, 553.6, 355.4, 543.6, +355.0, 539.1, 356.5, 535.4, 354.7, 534.6, 368.8, 559.1, 369.4, 554.3, +371.9, 552.9, 370.0, 549.5, 373.2, 552.6, 376.3, 552.5, 376.5, 555.8, +376.5, 556.1, 376.7, 556.1, 377.0, 556.3, 373.0, 558.1, 370.2, 560.5, +368.8, 559.1, 386.0, 524.0, 348.2, 504.2, 343.2, 510.4, 310.5, 484.3, +301.3, 479.0, 302.0, 476.9, 292.1, 473.7, 287.7, 470.6, 288.2, 469.9, +284.3, 466.1, 282.0, 463.9, 282.5, 463.1, 279.8, 461.8, 294.6, 469.4, +294.1, 470.2, 308.5, 478.6, 314.9, 482.3, 314.9, 482.3, 321.3, 486.1, +353.7, 505.1, 351.5, 518.3, 386.0, 524.0, 355.0, 294.4, 350.3, 267.3, +353.6, 266.3, 345.7, 240.1, 349.9, 234.6, 355.0, 230.2, 354.1, 229.1, +354.5, 229.1, 354.5, 228.5, 355.0, 227.9, 367.7, 256.8, 363.9, 266.8, +387.9, 282.3, 389.9, 289.5, 392.0, 289.0, 396.0, 295.6, 396.2, 296.0, +396.1, 296.0, 396.1, 296.5, 375.5, 295.8, 364.6, 305.2, 355.0, 294.4, +396.1, 296.5, 398.5, 311.6, 393.5, 314.7, 400.9, 326.8, 392.4, 326.4, +390.1, 329.9, 384.0, 325.9, 377.6, 325.6, 375.1, 328.5, 371.2, 325.2, +363.8, 314.1, 363.8, 314.1, 356.4, 303.0, 353.9, 300.6, 355.7, 298.7, +355.0, 294.4, 364.6, 305.2, 375.5, 295.8, 396.1, 296.5, 437.6, 403.3, +437.5, 403.4, 432.1, 404.9, 429.5, 402.8, 423.1, 391.0, 420.4, 392.5, +411.3, 382.1, 410.7, 388.7, 420.7, 389.6, 430.0, 397.2, 433.8, 400.3, +437.8, 400.6, 437.6, 403.3, 325.6, 322.0, 326.6, 319.9, 326.6, 319.9, +327.5, 317.9, 341.1, 338.4, 353.4, 336.2, 381.6, 341.0, 386.2, 343.5, +389.5, 348.0, 388.2, 350.8, 383.4, 361.2, 378.8, 359.0, 369.4, 367.2, +365.1, 371.0, 364.9, 374.9, 360.7, 374.8, 357.9, 374.7, 358.1, 370.8, +355.4, 366.8, 346.5, 353.4, 346.5, 353.4, 337.7, 340.1, 331.6, 331.0, +330.1, 331.7, 325.6, 322.0, 420.5, 402.3, 415.5, 395.5, 407.1, 401.5, +393.7, 400.8, 370.0, 392.8, 367.3, 394.6, 342.0, 397.7, 340.5, 399.4, +338.5, 397.5, 334.9, 397.3, 334.6, 396.8, 337.2, 395.3, 339.5, 393.3, +341.5, 391.6, 341.5, 391.6, 343.5, 389.8, 352.1, 382.3, 352.1, 382.3, +360.7, 374.8, 364.9, 374.9, 365.1, 371.0, 369.4, 367.2, 397.1, 380.0, +403.3, 378.7, 420.5, 402.3, 369.4, 367.2, 378.8, 359.0, 383.4, 361.2, +388.2, 350.8, 388.6, 350.6, 390.1, 353.7, 392.0, 356.6, 396.6, 363.6, +396.6, 363.6, 401.3, 370.6, 410.4, 387.3, 409.9, 388.2, 422.4, 402.4, +422.1, 402.0, 421.2, 402.8, 420.5, 402.3, 403.3, 378.7, 397.1, 380.0, +369.4, 367.2, 381.9, 411.1, 387.8, 405.9, 390.0, 399.5, 393.7, 400.8, +407.1, 401.5, 415.5, 395.5, 420.5, 402.3, 421.2, 402.8, 422.1, 402.0, +422.4, 402.4, 424.0, 404.3, 428.6, 401.2, 429.5, 402.8, 432.1, 404.9, +437.5, 403.4, 437.6, 403.3, 439.2, 403.4, 440.7, 403.7, 440.8, 403.5, +436.2, 422.4, 436.2, 422.4, 431.6, 441.3, 431.6, 441.2, 431.5, 441.2, +431.3, 441.1, 421.1, 434.9, 421.1, 434.9, 410.9, 428.7, 396.4, 419.9, +389.8, 423.9, 381.9, 411.1, 226.5, 544.9, 227.1, 537.3, 227.1, 537.3, +227.6, 529.8, 242.2, 506.7, 239.7, 505.1, 251.8, 480.4, 251.0, 482.0, +251.2, 482.0, 250.5, 483.7, 242.6, 503.9, 242.6, 503.9, 234.6, 524.2, +230.6, 534.6, 234.1, 539.0, 226.5, 544.9, 68.6, 177.8, 85.9, 216.5, +115.4, 232.0, 103.2, 255.3, 104.5, 259.8, 104.5, 259.8, 105.7, 264.3, +105.7, 264.1, 105.7, 264.1, 105.6, 264.0, 103.7, 259.7, 103.7, 259.7, +101.9, 255.4, 85.3, 216.6, 82.1, 176.7, 68.6, 177.8, 685.5, 569.3, +683.3, 569.5, 683.3, 569.5, 681.0, 569.7, 673.6, 557.2, 671.3, 558.6, +661.6, 547.5, 672.6, 546.6, 674.9, 557.2, 685.5, 569.3, 702.7, 480.0, +702.5, 483.1, 702.5, 483.1, 702.3, 486.2, 700.5, 484.1, 694.7, 489.0, +687.0, 491.8, 687.5, 485.4, 693.9, 483.3, 702.7, 480.0, 857.0, 143.8, +836.9, 149.9, 832.1, 143.9, 816.9, 156.1, 811.6, 152.0, 811.6, 152.0, +806.2, 148.0, 830.0, 140.7, 841.8, 132.4, 857.0, 143.8, 792.8, 174.5, +792.8, 174.5, 795.0, 176.8, 797.2, 179.1, 799.7, 181.7, 799.7, 181.7, +802.1, 184.2, 802.4, 184.5, 802.4, 184.5, 802.7, 184.8, 809.4, 191.8, +809.4, 191.8, 816.1, 198.8, 816.8, 199.5, 816.8, 199.5, 817.5, 200.3, +850.9, 235.1, 853.6, 232.9, 884.2, 269.9, 875.7, 265.1, 875.7, 265.1, +867.2, 260.3, 832.9, 224.5, 835.0, 222.5, 802.7, 184.8, 802.4, 184.5, +802.4, 184.5, 802.1, 184.2, 799.7, 181.7, 799.7, 181.7, 797.2, 179.1, +795.0, 176.8, 792.8, 174.5, 792.8, 174.5, 867.2, 260.3, 842.6, 246.4, +842.6, 246.4, 817.9, 232.4, 799.6, 193.6, 800.5, 192.0, 774.9, 157.7, +773.6, 155.2, 773.5, 155.3, 772.0, 152.8, 783.0, 163.0, 782.9, 163.3, +792.8, 174.5, 830.4, 217.0, 845.6, 210.6, 867.2, 260.3, 797.2, 179.1, +795.0, 176.8, 792.8, 174.5, 792.8, 174.5, 782.9, 163.3, 783.0, 163.0, +772.0, 152.8, 768.7, 147.1, 766.1, 141.1, 765.4, 141.4, 766.5, 139.8, +764.2, 135.2, 761.4, 134.3, 760.9, 134.2, 761.0, 133.7, 760.7, 133.2, +767.4, 139.3, 771.4, 135.0, 782.2, 136.8, 798.9, 152.6, 801.2, 150.2, +820.2, 163.7, 821.3, 166.9, 809.8, 174.1, 797.2, 179.1, 701.9, 194.3, +712.7, 197.5, 715.9, 194.0, 723.5, 200.8, 762.4, 221.2, 762.4, 221.2, +801.3, 241.7, 802.0, 241.9, 799.9, 248.5, 798.5, 255.3, 795.0, 256.8, +792.7, 251.7, 787.0, 248.0, 786.8, 247.9, 786.8, 247.9, 786.5, 247.7, +784.3, 246.3, 784.3, 246.3, 782.1, 244.9, 769.7, 237.1, 769.7, 237.1, +757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 729.6, 211.8, +726.8, 215.2, 701.9, 194.3, 626.8, 212.0, 636.0, 225.9, 636.5, 225.5, +645.8, 239.4, 667.0, 268.4, 665.7, 269.4, 685.6, 299.3, 655.5, 256.1, +655.9, 255.9, 626.8, 212.0, 635.9, 116.5, 646.2, 125.1, 646.2, 125.1, +656.5, 133.7, 657.2, 142.1, 662.6, 141.6, 668.8, 149.5, 643.8, 135.2, +622.3, 122.5, 612.2, 132.4, 593.2, 121.1, 593.2, 121.1, 574.2, 109.7, +572.8, 107.4, 572.2, 107.5, 569.8, 106.0, 580.0, 103.8, 580.0, 103.8, +590.2, 101.6, 613.7, 105.4, 614.5, 106.1, 635.9, 116.5, 590.2, 101.6, +600.3, 99.5, 600.3, 99.5, 610.4, 97.3, 613.6, 104.6, 618.0, 102.6, +625.6, 107.8, 631.3, 111.2, 630.8, 112.2, 635.9, 116.5, 614.5, 106.1, +613.7, 105.4, 590.2, 101.6, 499.3, 193.9, 476.5, 183.3, 477.3, 175.2, +453.6, 172.7, 441.0, 164.6, 441.0, 164.6, 428.4, 156.5, 457.3, 169.0, +456.3, 171.2, 484.2, 186.0, 491.8, 189.9, 491.5, 190.5, 499.3, 193.9, +601.4, 22.8, 597.4, 24.3, 593.3, 25.3, 593.4, 25.8, 591.9, 23.2, +590.0, 21.0, 590.4, 20.7, 590.7, 20.3, 589.6, 19.4, 588.8, 18.1, +595.3, 19.3, 598.7, 18.3, 601.4, 22.8, 276.3, 70.7, 278.0, 72.0, +278.0, 72.0, 279.7, 73.4, 271.5, 101.4, 273.7, 102.0, 267.7, 130.7, +255.6, 120.9, 270.1, 100.3, 276.3, 70.7, 349.7, 186.4, 349.6, 188.2, +349.1, 188.4, 349.5, 190.1, 343.1, 173.1, 346.6, 170.8, 336.8, 156.0, +330.5, 139.2, 331.3, 138.9, 324.3, 122.5, 337.7, 154.1, 337.7, 154.2, +349.7, 186.4, 335.3, 168.8, 332.6, 191.9, 330.5, 191.8, 329.9, 214.9, +320.4, 186.5, 320.4, 186.5, 310.9, 158.1, 305.7, 151.6, 309.6, 148.5, +308.3, 138.9, 325.1, 146.3, 330.3, 151.4, 335.3, 168.8, 308.3, 138.9, +306.7, 127.1, 310.9, 124.6, 305.2, 115.3, 310.1, 106.4, 310.1, 106.4, +315.0, 97.6, 323.2, 100.7, 319.7, 110.0, 324.3, 122.5, 331.3, 138.9, +330.5, 139.2, 336.8, 156.0, 339.5, 160.1, 336.0, 162.4, 335.3, 168.8, +330.3, 151.4, 325.1, 146.3, 308.3, 138.9, 263.7, 336.2, 263.7, 337.9, +263.6, 339.6, 263.7, 339.6, 230.6, 368.8, 230.6, 368.8, 197.4, 398.0, +195.3, 395.7, 191.7, 394.9, 190.1, 396.4, 202.0, 375.3, 211.2, 376.4, +213.9, 354.1, 213.9, 354.1, 214.0, 354.0, 214.0, 353.9, 238.8, 344.9, +238.4, 343.4, 263.7, 336.2, 214.0, 353.9, 226.4, 331.9, 237.8, 332.4, +238.9, 309.9, 240.5, 309.0, 240.7, 308.1, 241.0, 306.0, 252.2, 300.0, +252.2, 300.0, 263.4, 293.9, 259.6, 314.3, 263.6, 315.1, 263.7, 336.2, +238.4, 343.4, 238.8, 344.9, 214.0, 353.9, 150.0, 380.7, 152.0, 345.3, +158.2, 344.5, 154.0, 309.9, 154.8, 305.8, 154.8, 305.8, 155.7, 301.6, +155.8, 301.9, 157.5, 301.0, 159.2, 300.4, 157.2, 333.4, 155.5, 333.2, +151.7, 366.1, 150.8, 373.4, 150.3, 373.4, 150.0, 380.7, 591.4, 653.9, +591.6, 653.5, 589.9, 652.7, 590.1, 652.2, 603.5, 638.6, 598.3, 633.5, +606.6, 614.7, 616.8, 600.2, 615.0, 598.9, 623.3, 583.1, 612.9, 586.0, +616.4, 598.5, 609.4, 614.0, 600.4, 633.9, 601.3, 634.3, 591.4, 653.9, +607.0, 580.0, 599.4, 593.4, 587.9, 600.6, 591.8, 606.9, 583.9, 614.2, +586.2, 616.8, 580.6, 626.7, 575.6, 621.5, 580.0, 612.0, 586.2, 601.1, +593.2, 588.6, 607.2, 580.2, 607.0, 580.0, 586.2, 601.1, 582.8, 599.4, +589.3, 586.8, 592.4, 572.5, 593.4, 567.5, 593.4, 567.5, 594.5, 562.6, +599.8, 538.4, 599.8, 538.4, 605.0, 514.1, 605.3, 512.9, 605.8, 511.8, +605.6, 511.6, 620.6, 520.5, 620.6, 520.5, 635.6, 529.4, 618.1, 552.2, +621.3, 554.7, 607.0, 580.0, 607.2, 580.2, 593.2, 588.6, 586.2, 601.1, +523.8, 737.3, 526.4, 716.5, 526.4, 716.5, 529.0, 695.8, 528.6, 697.6, +530.3, 697.9, 531.6, 700.1, 538.0, 710.4, 538.1, 710.3, 544.4, 720.7, +544.4, 720.7, 544.4, 720.7, 544.4, 720.7, 534.1, 729.0, 523.0, 735.9, +523.8, 737.3, 573.1, 676.7, 567.3, 670.3, 574.9, 663.4, 576.6, 650.0, +576.6, 649.8, 576.6, 649.8, 576.7, 649.6, 577.5, 643.4, 575.7, 642.6, +578.3, 637.3, 579.6, 639.0, 579.6, 639.0, 580.9, 640.6, 581.0, 646.3, +579.7, 646.3, 578.4, 652.1, 575.8, 664.4, 568.2, 671.3, 573.1, 676.7, +536.3, 636.7, 537.3, 627.8, 537.3, 627.8, 538.4, 619.0, 537.6, 618.0, +551.4, 612.5, 552.4, 604.6, 552.6, 604.5, 553.8, 606.4, 555.2, 608.1, +563.2, 618.2, 573.3, 624.9, 571.1, 628.3, 563.9, 639.2, 551.3, 641.0, +536.3, 636.7, 549.3, 443.5, 552.8, 465.2, 544.2, 472.5, 556.3, 486.9, +555.7, 487.9, 555.3, 487.8, 555.0, 488.9, 553.7, 495.1, 551.2, 494.6, +547.5, 500.3, 547.7, 500.0, 547.5, 499.8, 547.5, 499.4, 547.6, 497.4, +547.6, 497.4, 547.6, 495.4, 547.8, 490.8, 547.8, 490.8, 547.9, 486.2, +548.0, 483.4, 548.0, 483.4, 548.1, 480.6, 548.7, 462.0, 557.9, 450.1, +549.3, 443.5, 517.0, 564.6, 517.0, 565.3, 516.8, 566.1, 517.0, 566.1, +516.1, 568.5, 516.1, 568.5, 515.2, 571.0, 514.3, 573.5, 514.3, 573.4, +513.3, 575.9, 502.9, 609.6, 499.8, 608.6, 486.2, 641.2, 493.4, 624.6, +492.9, 624.4, 499.7, 607.6, 508.3, 586.1, 508.0, 586.0, 517.0, 564.6, +469.6, 385.7, 466.8, 389.5, 464.2, 393.4, 463.9, 393.2, 459.0, 391.3, +455.0, 392.5, 454.1, 389.4, 452.7, 386.4, 452.7, 386.4, 451.3, 383.3, +452.5, 381.9, 454.8, 383.8, 458.3, 384.2, 463.9, 385.0, 467.7, 382.6, +469.6, 385.7, 396.3, 586.8, 397.2, 582.8, 397.3, 582.8, 398.2, 578.9, +398.4, 578.1, 398.4, 578.1, 398.6, 577.3, 409.8, 571.4, 405.2, 559.0, +407.6, 540.2, 413.0, 527.4, 419.1, 522.3, 414.3, 512.8, 411.6, 510.8, +416.2, 504.6, 418.2, 496.4, 418.2, 496.4, 418.3, 496.4, 418.3, 496.4, +419.0, 502.7, 419.0, 502.7, 419.7, 509.1, 410.4, 547.4, 408.3, 546.9, +396.9, 584.7, 396.6, 585.7, 396.5, 585.7, 396.3, 586.8, 406.5, 715.6, +406.9, 710.5, 406.9, 710.5, 407.3, 705.4, 414.6, 682.2, 422.2, 683.1, +424.1, 659.7, 421.7, 688.2, 416.6, 688.1, 406.5, 715.6, 425.5, 707.4, +429.7, 691.9, 428.8, 691.6, 432.1, 675.9, 441.2, 632.3, 440.7, 632.2, +450.2, 588.8, 451.5, 585.3, 452.2, 585.4, 452.8, 581.9, 453.1, 588.3, +453.1, 588.3, 453.5, 594.6, 451.7, 607.4, 450.4, 607.2, 447.3, 619.8, +436.4, 663.6, 437.3, 663.9, 425.5, 707.4, 421.8, 600.0, 432.1, 526.1, +432.1, 526.1, 442.5, 452.2, 442.2, 498.2, 443.0, 498.2, 443.6, 544.2, +443.5, 549.1, 441.7, 549.1, 439.7, 554.0, 430.8, 577.0, 422.4, 576.8, +421.8, 600.0, 450.1, 848.6, 452.0, 854.6, 455.4, 855.6, 453.9, 860.5, +453.3, 865.0, 453.3, 865.0, 452.6, 869.4, 442.1, 862.3, 444.4, 858.9, +436.1, 848.5, 428.4, 838.7, 428.5, 829.0, 420.7, 828.9, 435.5, 829.1, +437.5, 836.6, 450.1, 848.6, 365.7, 852.2, 362.7, 811.2, 363.7, 811.1, +359.7, 770.2, 360.0, 767.1, 360.0, 767.1, 360.3, 764.1, 361.6, 774.6, +361.0, 774.7, 361.6, 785.4, 363.7, 818.8, 361.5, 819.0, 365.7, 852.2, +444.9, 882.7, 427.4, 888.3, 425.7, 884.8, 406.6, 883.8, 405.1, 880.8, +402.4, 882.1, 398.3, 880.4, 394.0, 872.0, 396.6, 870.7, 395.0, 861.0, +392.2, 844.6, 396.7, 830.6, 389.3, 828.2, 417.3, 837.2, 412.8, 851.2, +436.3, 874.3, 440.6, 878.5, 442.2, 883.6, 444.9, 882.7, 416.0, 171.3, +416.1, 171.1, 416.3, 171.1, 416.3, 171.0, 417.8, 183.6, 417.8, 183.6, +419.4, 196.3, 421.3, 210.6, 421.0, 210.6, 422.5, 225.0, 417.7, 260.8, +417.2, 261.1, 417.5, 297.2, 417.2, 296.7, 417.2, 296.7, 416.8, 296.1, +416.0, 242.1, 416.4, 242.1, 416.1, 188.1, 416.0, 179.7, 415.9, 179.7, +416.0, 171.3, 346.4, 641.2, 353.1, 634.7, 353.5, 635.0, 359.8, 628.3, +359.0, 628.9, 359.6, 629.7, 359.5, 631.2, 359.1, 633.6, 359.1, 633.6, +358.8, 636.1, 358.4, 641.9, 355.7, 641.6, 355.0, 647.4, 355.3, 654.7, +350.7, 654.7, 349.9, 662.3, 349.7, 664.6, 349.1, 664.5, 348.4, 666.8, +346.5, 658.6, 347.7, 658.4, 347.1, 650.0, 346.8, 645.6, 344.6, 644.3, +346.4, 641.2, 261.3, 688.3, 264.5, 698.4, 267.0, 702.9, 262.0, 710.4, +244.4, 725.4, 243.2, 724.1, 226.8, 740.4, 233.3, 701.6, 239.0, 701.7, +239.8, 662.8, 243.6, 657.0, 241.0, 655.3, 242.3, 647.9, 256.2, 664.4, +254.6, 667.2, 261.3, 688.3, 242.3, 647.9, 247.6, 616.0, 247.6, 616.0, +252.9, 584.1, 253.8, 609.7, 270.6, 620.2, 259.5, 635.1, 259.7, 636.7, +259.6, 636.7, 259.6, 638.3, 260.0, 649.2, 260.0, 649.2, 260.4, 660.1, +260.4, 662.7, 260.4, 662.7, 260.5, 665.3, 260.8, 672.8, 260.8, 672.8, +261.0, 680.4, 261.2, 684.4, 259.5, 685.3, 261.3, 688.3, 254.6, 667.2, +256.2, 664.4, 242.3, 647.9, 306.5, 803.3, 314.5, 784.8, 318.0, 785.6, +322.6, 766.3, 330.7, 778.5, 327.5, 784.7, 338.9, 790.7, 338.4, 794.6, +338.4, 794.6, 337.9, 798.5, 323.4, 804.1, 308.4, 807.4, 306.5, 803.3, +337.9, 798.5, 337.2, 803.9, 337.2, 803.9, 336.5, 809.4, 321.1, 829.8, +319.0, 828.2, 301.5, 847.1, 290.0, 859.4, 292.5, 867.4, 278.5, 871.8, +284.4, 870.0, 281.3, 861.8, 285.2, 852.2, 291.3, 826.7, 295.8, 827.8, +306.5, 803.3, 308.4, 807.4, 323.4, 804.1, 337.9, 798.5, 301.5, 847.1, +319.0, 828.2, 321.1, 829.8, 336.5, 809.4, 333.6, 832.1, 337.9, 833.6, +330.6, 854.9, 330.0, 857.6, 330.6, 857.7, 329.9, 860.4, 329.5, 862.2, +329.5, 862.2, 329.0, 864.1, 314.4, 857.3, 300.6, 853.6, 301.5, 847.1, +329.0, 864.1, 326.7, 873.5, 320.9, 879.5, 324.4, 882.9, 302.3, 890.3, +299.7, 883.1, 275.0, 882.2, 275.2, 882.2, 275.2, 881.7, 275.3, 881.2, +276.9, 876.5, 275.7, 875.5, 278.5, 871.8, 292.5, 867.4, 290.0, 859.4, +301.5, 847.1, 300.6, 853.6, 314.4, 857.3, 329.0, 864.1, 398.2, 578.9, +397.3, 582.8, 397.2, 582.8, 396.3, 586.8, 394.8, 593.0, 394.8, 593.0, +393.3, 599.3, 389.1, 616.4, 395.5, 622.4, 385.0, 633.5, 378.5, 627.5, +373.8, 632.5, 362.7, 631.5, 369.7, 602.6, 379.2, 604.2, 398.2, 578.9, +362.7, 631.5, 361.1, 631.4, 359.8, 632.0, 359.5, 631.2, 359.5, 631.2, +359.5, 631.2, 359.5, 631.2, 359.6, 629.7, 359.0, 628.9, 359.8, 628.3, +360.2, 627.9, 359.6, 627.2, 360.0, 626.8, 360.5, 623.2, 360.5, 623.2, +361.0, 619.6, 368.6, 590.3, 364.9, 589.4, 368.8, 559.1, 370.2, 560.5, +373.0, 558.1, 377.0, 556.3, 387.8, 566.8, 394.5, 579.5, 398.6, 577.3, +398.4, 578.1, 398.4, 578.1, 398.2, 578.9, 379.2, 604.2, 369.7, 602.6, +362.7, 631.5, 374.9, 477.0, 387.8, 504.4, 387.8, 504.4, 400.7, 531.7, +394.3, 526.7, 393.3, 527.9, 386.0, 524.0, 351.5, 518.3, 353.7, 505.1, +321.3, 486.1, 322.1, 486.6, 322.6, 485.9, 323.8, 485.7, 332.3, 484.2, +332.3, 484.2, 340.7, 482.8, 347.2, 481.7, 347.2, 481.7, 353.6, 480.6, +364.3, 478.8, 371.0, 472.7, 374.9, 477.0, 430.0, 397.2, 420.7, 389.6, +410.7, 388.7, 411.3, 382.1, 406.3, 376.3, 404.8, 377.1, 401.3, 370.6, +396.6, 363.6, 396.6, 363.6, 392.0, 356.6, 406.4, 368.4, 404.9, 370.3, +417.7, 384.1, 423.9, 390.6, 422.5, 394.9, 430.0, 397.2, 312.7, 349.7, +319.1, 335.8, 319.1, 335.8, 325.6, 322.0, 330.1, 331.7, 331.6, 331.0, +337.7, 340.1, 333.6, 348.9, 314.3, 352.2, 312.7, 349.7, 426.6, 461.9, +423.9, 473.2, 422.3, 473.1, 421.1, 484.6, 421.1, 486.1, 420.7, 486.1, +420.4, 487.6, 419.3, 484.4, 417.0, 485.2, 413.7, 482.7, 388.8, 467.8, +390.8, 464.5, 367.9, 446.3, 367.7, 447.2, 393.4, 453.0, 418.9, 459.8, +422.7, 460.9, 426.5, 460.5, 426.6, 461.9, 236.0, 594.4, 228.0, 614.6, +225.6, 614.0, 220.0, 634.9, 220.3, 631.4, 219.5, 628.1, 220.5, 627.8, +225.4, 586.6, 223.5, 586.4, 226.5, 544.9, 234.1, 539.0, 230.6, 534.6, +234.6, 524.2, 241.1, 558.2, 240.5, 560.0, 236.0, 594.4, 77.2, 274.3, +70.8, 259.9, 70.8, 259.9, 64.3, 245.5, 66.4, 226.4, 65.1, 226.2, +65.9, 206.9, 64.9, 213.5, 67.1, 213.8, 68.2, 220.7, 71.9, 242.5, +71.9, 242.5, 75.5, 264.2, 76.4, 269.2, 74.8, 270.2, 77.2, 274.3, +689.5, 513.1, 695.2, 510.7, 698.8, 512.4, 700.8, 508.2, 700.3, 515.6, +700.3, 515.6, 699.8, 523.1, 697.3, 524.2, 689.2, 517.7, 689.5, 513.1, +699.8, 523.1, 698.6, 542.0, 694.3, 542.7, 697.3, 560.8, 695.3, 564.7, +692.5, 565.5, 693.3, 568.6, 689.4, 569.0, 689.4, 569.0, 685.5, 569.3, +674.9, 557.2, 672.6, 546.6, 661.6, 547.5, 659.2, 544.7, 658.6, 545.0, +656.7, 541.9, 653.1, 536.2, 653.0, 536.3, 649.4, 530.7, 670.2, 528.0, +669.4, 521.9, 689.5, 513.1, 689.2, 517.7, 697.3, 524.2, 699.8, 523.1, +640.6, 486.8, 641.1, 482.9, 641.1, 482.9, 641.5, 479.0, 665.1, 466.5, +665.8, 463.1, 691.8, 459.8, 696.3, 465.5, 696.3, 465.5, 700.8, 471.3, +700.6, 474.2, 701.0, 474.9, 702.9, 477.3, 702.8, 478.7, 702.8, 478.7, +702.7, 480.0, 693.9, 483.3, 687.5, 485.4, 687.0, 491.8, 677.4, 495.4, +677.4, 495.4, 667.8, 498.9, 653.7, 497.4, 652.1, 495.6, 640.6, 486.8, +667.8, 498.9, 652.8, 504.4, 652.4, 503.5, 637.8, 510.0, 638.1, 507.7, +638.4, 507.7, 638.3, 505.4, 635.1, 498.0, 639.5, 496.1, 640.6, 486.8, +652.1, 495.6, 653.7, 497.4, 667.8, 498.9, 784.9, 126.3, 772.6, 107.4, +777.7, 99.6, 760.4, 88.4, 767.7, 87.7, 771.2, 83.6, 775.0, 86.9, +813.2, 104.8, 813.2, 104.8, 851.4, 122.6, 849.9, 116.6, 813.4, 137.1, +784.9, 126.3, 851.4, 122.6, 854.5, 124.1, 854.9, 123.5, 857.5, 125.5, +863.1, 129.5, 863.2, 129.3, 868.7, 133.4, 872.0, 135.8, 872.0, 135.8, +875.3, 138.2, 868.0, 135.7, 866.1, 141.0, 857.0, 143.8, 841.8, 132.4, +830.0, 140.7, 806.2, 148.0, 800.0, 143.3, 800.7, 141.9, 793.9, 138.7, +792.8, 138.7, 792.9, 137.9, 791.8, 137.2, 786.9, 134.1, 788.4, 131.7, +784.9, 126.3, 813.4, 137.1, 849.9, 116.6, 851.4, 122.6, 921.4, 271.7, +918.0, 273.4, 914.5, 273.9, 914.7, 275.0, 914.9, 275.8, 907.1, 277.0, +907.2, 278.6, 907.3, 278.8, 905.1, 279.6, 903.1, 280.6, 902.5, 281.0, +901.6, 279.7, 900.1, 278.9, 910.2, 274.1, 910.6, 274.7, 921.4, 271.7, +773.0, 328.8, 748.5, 323.3, 748.1, 316.3, 724.0, 317.9, 720.6, 314.2, +720.6, 314.2, 717.1, 310.4, 741.1, 315.2, 740.5, 318.1, 763.9, 325.8, +768.5, 327.3, 768.4, 327.9, 773.0, 328.8, 787.0, 248.0, 792.7, 251.7, +795.0, 256.8, 798.5, 255.3, 796.8, 263.4, 794.1, 271.2, 795.1, 271.6, +793.4, 271.7, 791.4, 277.9, 792.6, 283.1, 788.8, 283.1, 789.0, 300.4, +785.4, 317.7, 785.5, 317.1, 784.0, 316.8, 784.0, 315.9, 783.8, 302.9, +784.5, 302.9, 785.1, 289.9, 786.1, 269.0, 779.8, 266.6, 787.0, 248.0, +673.5, 315.8, 659.5, 298.6, 659.5, 298.6, 645.4, 281.4, 632.5, 255.7, +631.1, 256.4, 615.8, 231.9, 605.0, 210.3, 611.0, 203.2, 594.1, 188.7, +592.9, 180.0, 592.1, 178.0, 585.7, 172.0, 581.2, 168.9, 582.9, 166.5, +580.1, 161.0, 591.5, 174.3, 591.9, 173.9, 603.8, 186.8, 616.0, 204.4, +614.0, 205.7, 624.2, 224.7, 638.5, 251.0, 638.5, 251.0, 652.8, 277.4, +663.2, 296.6, 673.6, 315.7, 673.5, 315.8, 478.7, 141.4, 501.3, 162.4, +497.6, 169.5, 523.9, 183.4, 524.4, 183.1, 525.3, 184.7, 526.7, 186.0, +533.2, 191.2, 531.9, 192.8, 537.0, 199.6, 526.3, 193.5, 528.0, 190.6, +519.0, 181.6, 498.8, 161.5, 503.0, 150.3, 478.7, 141.4, 620.1, -35.4, +624.7, -11.6, 619.7, -9.4, 629.3, 12.3, 624.8, 14.0, 624.8, 14.0, +620.2, 15.7, 617.8, 13.9, 620.2, 10.6, 620.2, 5.5, 620.1, -14.9, +629.9, -28.1, 620.1, -35.4, 250.6, 110.4, 253.5, 96.5, 253.0, 96.4, +256.4, 82.5, 257.2, 79.3, 257.0, 79.3, 257.9, 76.1, 260.2, 67.8, +260.2, 67.8, 262.6, 59.6, 263.8, 66.2, 269.4, 65.1, 276.3, 70.7, +270.1, 100.3, 255.6, 120.9, 267.7, 130.7, 265.7, 140.4, 265.7, 140.4, +263.7, 150.1, 251.1, 135.4, 252.7, 130.8, 250.6, 110.4, 263.7, 150.1, +261.1, 162.6, 257.9, 162.7, 258.5, 175.0, 249.7, 165.6, 249.7, 165.6, +240.9, 156.3, 246.6, 133.6, 245.7, 133.4, 250.6, 110.4, 252.7, 130.8, +251.1, 135.4, 263.7, 150.1, 326.0, 83.2, 339.5, 82.3, 343.1, 87.8, +353.0, 81.4, 353.5, 89.0, 353.5, 89.0, 353.9, 96.6, 351.1, 135.1, +352.1, 135.2, 350.3, 173.8, 322.8, 160.6, 324.7, 128.1, 326.0, 83.2, +350.3, 173.8, 350.0, 180.1, 350.0, 180.1, 349.7, 186.4, 337.7, 154.2, +337.7, 154.1, 324.3, 122.5, 319.7, 110.0, 323.2, 100.7, 315.0, 97.6, +319.0, 90.5, 325.0, 87.7, 323.0, 83.4, 324.5, 83.3, 324.5, 83.3, +326.0, 83.2, 324.7, 128.1, 322.8, 160.6, 350.3, 173.8, 172.0, 295.9, +179.3, 293.3, 179.3, 293.3, 186.7, 290.7, 183.3, 295.7, 186.1, 297.6, +185.4, 304.5, 180.8, 306.1, 171.6, 299.5, 172.0, 295.9, 602.3, 667.7, +604.0, 664.1, 590.6, 659.9, 591.4, 653.9, 601.3, 634.3, 600.4, 633.9, +609.4, 614.0, 609.2, 614.5, 609.3, 614.5, 609.3, 615.1, 609.3, 615.2, +609.3, 615.2, 609.2, 615.2, 605.8, 641.4, 612.9, 644.7, 602.3, 667.7, +662.7, 698.1, 662.6, 699.1, 661.9, 699.0, 661.0, 700.0, 658.8, 702.5, +658.8, 702.5, 656.6, 705.1, 654.4, 707.5, 654.4, 707.5, 652.3, 710.0, +647.9, 714.9, 648.2, 719.6, 643.6, 719.9, 640.3, 720.1, 637.3, 715.8, +636.4, 710.8, 632.1, 687.1, 631.2, 686.3, 633.1, 662.4, 632.8, 666.0, +636.4, 666.3, 639.6, 670.2, 647.5, 679.7, 647.5, 679.7, 655.4, 689.2, +658.3, 692.8, 658.3, 692.8, 661.2, 696.3, 661.9, 697.2, 662.7, 697.2, +662.7, 698.1, 555.2, 608.1, 553.8, 606.4, 552.6, 604.5, 552.4, 604.6, +553.2, 598.7, 541.1, 592.1, 541.9, 591.3, 542.6, 585.6, 542.6, 585.6, +543.2, 580.0, 552.4, 591.6, 549.9, 593.8, 555.2, 608.1, 561.8, 494.2, +562.8, 490.6, 562.8, 490.6, 563.8, 487.0, 564.1, 489.9, 568.0, 489.5, +572.1, 491.9, 572.1, 492.7, 568.0, 492.8, 564.0, 493.7, 562.9, 493.9, +561.8, 493.9, 561.8, 494.2, 544.4, 720.7, 544.4, 720.7, 544.4, 720.7, +544.4, 720.7, 549.1, 728.1, 549.1, 728.1, 553.7, 735.5, 558.5, 743.3, +558.5, 743.3, 563.4, 751.1, 568.5, 759.4, 574.8, 760.3, 573.7, 767.7, +565.6, 772.1, 566.5, 773.6, 559.2, 779.4, 548.5, 769.2, 554.9, 762.5, +550.7, 745.6, 547.5, 733.2, 547.5, 733.2, 544.4, 720.7, 589.1, 754.2, +588.6, 757.8, 586.3, 757.5, 583.5, 760.9, 579.5, 765.7, 580.5, 767.1, +575.5, 770.6, 575.8, 769.6, 573.8, 767.6, 573.7, 767.7, 574.8, 760.3, +568.5, 759.4, 563.4, 751.1, 563.1, 714.0, 567.5, 713.8, 573.1, 676.7, +568.2, 671.3, 575.8, 664.4, 578.4, 652.1, 575.3, 653.6, 579.5, 662.6, +580.6, 673.2, 583.7, 702.7, 583.7, 702.7, 586.8, 732.3, 587.9, 743.2, +590.3, 743.5, 589.1, 754.2, 531.4, 675.9, 533.8, 656.3, 533.8, 656.3, +536.3, 636.7, 551.3, 641.0, 563.9, 639.2, 571.1, 628.3, 572.8, 628.1, +573.1, 630.7, 575.0, 633.2, 575.6, 633.9, 575.6, 633.9, 576.1, 634.6, +576.0, 635.8, 577.2, 636.0, 578.3, 637.3, 575.7, 642.6, 577.5, 643.4, +576.7, 649.6, 571.0, 656.4, 568.5, 654.3, 560.3, 659.1, 545.9, 667.5, +535.0, 679.2, 531.4, 675.9, 630.3, 847.0, 629.2, 849.3, 629.8, 849.8, +628.1, 851.5, 623.9, 855.9, 624.5, 856.6, 619.8, 860.2, 609.4, 869.5, +610.7, 874.4, 598.4, 878.2, 579.8, 884.0, 578.1, 879.9, 557.9, 879.4, +557.7, 879.4, 557.6, 878.3, 557.4, 877.2, 591.6, 861.8, 592.0, 862.9, +626.7, 848.5, 628.5, 847.7, 630.3, 846.9, 630.3, 847.0, 538.1, 445.8, +538.5, 445.4, 538.5, 445.1, 539.0, 445.1, 540.4, 444.8, 541.1, 445.4, +541.9, 444.6, 543.5, 442.4, 545.6, 443.9, 549.3, 443.3, 549.3, 443.3, +549.3, 443.4, 549.3, 443.5, 557.9, 450.1, 548.7, 462.0, 548.1, 480.6, +548.3, 478.7, 547.6, 478.7, 547.0, 476.8, 544.5, 467.9, 544.5, 467.9, +541.9, 459.0, 540.7, 454.7, 540.7, 454.7, 539.5, 450.4, 538.8, 448.1, +538.4, 448.1, 538.1, 445.8, 499.7, 607.6, 492.9, 624.4, 493.4, 624.6, +486.2, 641.2, 479.6, 657.2, 478.0, 656.7, 472.9, 673.2, 459.6, 660.6, +460.3, 644.6, 468.4, 624.5, 473.6, 611.8, 495.6, 603.8, 499.7, 607.6, +468.4, 624.5, 468.3, 623.1, 468.3, 623.1, 468.2, 621.6, 468.1, 621.0, +468.2, 621.0, 468.3, 620.3, 466.7, 616.9, 475.7, 614.6, 476.1, 608.4, +497.1, 588.7, 503.3, 585.9, 508.7, 559.0, 509.0, 559.2, 512.5, 553.3, +516.3, 547.5, 515.7, 548.6, 516.4, 549.0, 516.5, 550.4, 518.6, 551.0, +516.7, 557.5, 517.0, 564.6, 508.0, 586.0, 508.3, 586.1, 499.7, 607.6, +495.6, 603.8, 473.6, 611.8, 468.4, 624.5, 446.4, 372.4, 445.7, 370.9, +445.1, 370.9, 445.0, 369.4, 444.8, 366.7, 444.8, 366.7, 444.5, 364.1, +444.1, 362.0, 444.8, 361.9, 445.1, 359.6, 444.3, 355.2, 446.4, 354.8, +447.8, 349.9, 448.9, 361.0, 448.0, 361.3, 446.4, 372.4, 191.5, 616.5, +188.4, 624.7, 188.4, 624.7, 185.3, 632.9, 179.2, 628.3, 179.6, 619.8, +183.2, 610.3, 182.7, 611.6, 191.2, 613.0, 191.5, 616.5, 183.2, 610.3, +174.4, 552.3, 178.0, 551.8, 172.8, 493.4, 172.9, 493.2, 172.9, 493.2, +172.9, 493.1, 178.5, 505.2, 179.3, 504.9, 185.8, 516.6, 190.9, 543.6, +189.3, 545.5, 202.3, 569.3, 197.7, 591.0, 197.7, 591.0, 193.0, 612.6, +192.7, 614.6, 192.3, 614.5, 191.5, 616.5, 191.2, 613.0, 182.7, 611.6, +183.2, 610.3, 168.3, 506.7, 170.6, 500.0, 170.6, 500.0, 172.8, 493.4, +178.0, 551.8, 174.4, 552.3, 183.2, 610.3, 179.6, 619.8, 179.2, 628.3, +185.3, 632.9, 183.7, 636.8, 182.7, 636.7, 182.2, 640.8, 174.0, 627.6, +163.2, 624.8, 165.9, 614.5, 165.1, 609.2, 165.1, 609.2, 164.4, 603.8, +165.5, 555.2, 164.6, 555.1, 168.3, 506.7, 164.4, 603.8, 161.6, 583.3, +161.6, 583.3, 158.8, 562.8, 159.4, 553.5, 160.5, 553.3, 159.2, 544.2, +161.2, 532.8, 165.9, 522.6, 163.3, 521.4, 165.8, 514.0, 165.8, 514.0, +168.3, 506.7, 164.6, 555.1, 165.5, 555.2, 164.4, 603.8, 403.1, 653.0, +392.2, 650.9, 391.3, 646.7, 381.3, 648.8, 383.1, 641.1, 387.8, 636.1, +385.0, 633.5, 395.5, 622.4, 389.1, 616.4, 393.3, 599.3, 408.9, 616.2, +408.9, 628.7, 403.1, 653.0, 406.4, 715.8, 406.4, 715.7, 406.4, 715.7, +406.5, 715.6, 416.6, 688.1, 421.7, 688.2, 424.1, 659.7, 430.8, 639.9, +431.3, 640.1, 438.6, 620.5, 441.4, 612.6, 441.4, 612.6, 444.3, 604.8, +443.2, 597.4, 447.3, 596.8, 450.2, 588.8, 440.7, 632.2, 441.2, 632.3, +432.1, 675.9, 424.6, 697.5, 419.2, 695.7, 406.5, 715.6, 406.4, 715.7, +406.4, 715.7, 406.4, 715.8, 432.1, 675.9, 428.8, 691.6, 429.7, 691.9, +425.5, 707.4, 421.8, 725.3, 421.8, 725.3, 418.1, 743.1, 416.7, 749.7, +416.7, 749.7, 415.4, 756.3, 414.9, 758.5, 413.6, 760.2, 414.4, 760.8, +409.1, 754.3, 409.1, 754.3, 403.8, 747.8, 407.7, 747.1, 412.9, 726.6, +406.2, 718.4, 406.0, 718.3, 406.3, 717.1, 406.4, 715.8, 418.8, 695.5, +414.0, 683.8, 432.1, 675.9, 458.7, 682.6, 460.2, 708.3, 460.1, 708.3, +461.7, 734.0, 463.1, 739.0, 458.0, 740.4, 454.2, 746.8, 450.4, 731.2, +455.4, 730.0, 456.6, 713.1, 457.6, 697.9, 462.2, 696.8, 458.7, 682.6, +439.7, 554.0, 441.7, 549.1, 443.5, 549.1, 443.6, 544.2, 444.0, 574.5, +439.9, 575.1, 444.3, 604.8, 441.4, 612.6, 441.4, 612.6, 438.6, 620.5, +435.6, 587.6, 437.6, 587.1, 439.7, 554.0, 438.6, 620.5, 431.3, 640.1, +430.8, 639.9, 424.1, 659.7, 422.2, 683.1, 414.6, 682.2, 407.3, 705.4, +407.5, 703.4, 407.5, 703.4, 407.6, 701.4, 413.1, 685.3, 410.4, 684.4, +412.4, 667.3, 417.8, 633.8, 417.1, 633.6, 421.8, 600.0, 422.4, 576.8, +430.8, 577.0, 439.7, 554.0, 437.6, 587.1, 435.6, 587.6, 438.6, 620.5, +392.3, 792.8, 390.7, 784.7, 386.5, 785.5, 380.8, 778.2, 371.1, 765.9, +366.9, 767.5, 361.4, 753.6, 362.4, 743.8, 362.4, 743.8, 363.4, 734.1, +364.5, 737.8, 368.3, 736.6, 373.2, 739.2, 385.7, 764.5, 386.9, 765.2, +392.3, 792.8, 395.0, 861.0, 396.6, 870.7, 394.0, 872.0, 398.3, 880.4, +382.6, 873.9, 382.6, 873.9, 366.8, 867.4, 369.6, 865.9, 366.3, 859.8, +365.7, 852.2, 361.5, 819.0, 363.7, 818.8, 361.6, 785.4, 387.3, 793.1, +380.1, 822.5, 395.0, 861.0, 361.6, 785.4, 361.0, 774.7, 361.6, 774.6, +360.3, 764.1, 360.9, 758.8, 360.9, 758.8, 361.4, 753.6, 366.9, 767.5, +371.1, 765.9, 380.8, 778.2, 389.5, 801.5, 385.1, 803.2, 389.3, 828.2, +396.7, 830.6, 392.2, 844.6, 395.0, 861.0, 380.1, 822.5, 387.3, 793.1, +361.6, 785.4, 436.3, 874.3, 412.8, 851.2, 417.3, 837.2, 389.3, 828.2, +385.1, 803.2, 389.5, 801.5, 380.8, 778.2, 386.5, 785.5, 390.7, 784.7, +392.3, 792.8, 393.5, 794.3, 393.5, 794.3, 394.7, 795.9, 407.7, 812.4, +407.7, 812.4, 420.7, 828.9, 428.5, 829.0, 428.4, 838.7, 436.1, 848.5, +440.1, 860.0, 431.5, 872.2, 436.3, 874.3, 436.1, 848.5, 444.4, 858.9, +442.1, 862.3, 452.6, 869.4, 451.9, 874.1, 452.4, 874.2, 451.3, 878.7, +450.8, 880.6, 450.5, 882.6, 450.3, 882.5, 448.4, 883.8, 446.9, 883.9, +444.9, 882.7, 442.2, 883.6, 440.6, 878.5, 436.3, 874.3, 431.5, 872.2, +440.1, 860.0, 436.1, 848.5, 383.8, 232.7, 386.1, 216.4, 392.4, 214.6, +388.3, 200.2, 389.4, 199.1, 389.4, 199.1, 390.4, 198.0, 388.0, 215.4, +394.0, 221.9, 383.8, 232.7, 284.3, 466.1, 288.2, 469.9, 287.7, 470.6, +292.1, 473.7, 296.3, 475.1, 295.0, 478.2, 299.2, 480.6, 316.5, 484.7, +314.1, 495.1, 329.0, 509.6, 330.1, 511.2, 327.3, 513.3, 325.6, 516.9, +320.7, 527.7, 323.9, 534.9, 315.8, 538.5, 315.8, 538.5, 312.6, 531.3, +309.5, 524.1, 301.1, 504.9, 301.1, 504.9, 292.8, 485.6, 288.5, 475.9, +284.9, 476.1, 284.3, 466.1, 358.5, 448.9, 362.0, 453.0, 362.0, 453.0, +365.6, 457.1, 373.1, 463.9, 370.3, 467.0, 374.9, 477.0, 371.0, 472.7, +364.3, 478.8, 353.6, 480.6, 349.6, 477.1, 355.1, 470.8, 356.6, 461.0, +357.2, 457.1, 357.2, 457.1, 357.8, 453.2, 358.1, 451.1, 359.1, 449.2, +358.5, 448.9, 417.7, 384.1, 404.9, 370.3, 406.4, 368.4, 392.0, 356.6, +390.1, 353.7, 388.6, 350.6, 388.2, 350.8, 389.5, 348.0, 386.2, 343.5, +381.6, 341.0, 375.3, 339.9, 376.4, 333.1, 371.2, 325.2, 375.1, 328.5, +377.6, 325.6, 384.0, 325.9, 401.6, 337.3, 403.5, 340.5, 423.8, 341.6, +424.2, 342.3, 424.2, 342.3, 424.7, 343.1, 421.8, 363.6, 427.9, 379.8, +417.7, 384.1, 424.7, 343.1, 432.4, 355.7, 432.0, 356.0, 440.0, 368.4, +440.9, 383.7, 440.9, 383.7, 441.8, 399.1, 442.4, 401.0, 441.3, 401.3, +440.8, 403.5, 440.7, 403.7, 439.2, 403.4, 437.6, 403.3, 437.8, 400.6, +433.8, 400.3, 430.0, 397.2, 422.5, 394.9, 423.9, 390.6, 417.7, 384.1, +427.9, 379.8, 421.8, 363.6, 424.7, 343.1, 355.4, 366.8, 358.1, 370.8, +357.9, 374.7, 360.7, 374.8, 352.1, 382.3, 352.1, 382.3, 343.5, 389.8, +340.0, 384.6, 346.3, 374.7, 355.4, 366.8, 418.9, 459.8, 393.4, 453.0, +367.7, 447.2, 367.9, 446.3, 366.7, 445.3, 366.7, 445.3, 365.4, 444.3, +365.4, 444.7, 366.6, 444.6, 367.8, 445.0, 393.3, 452.4, 417.7, 449.6, +418.9, 459.8, 262.9, 486.8, 261.9, 491.5, 261.0, 496.3, 261.0, 496.3, +259.6, 503.2, 259.6, 503.2, 258.1, 510.1, 259.7, 503.9, 259.4, 503.9, +260.7, 497.6, 261.8, 492.2, 261.5, 492.1, 262.9, 486.8, 118.7, 318.3, +119.2, 321.0, 119.2, 321.0, 119.8, 323.7, 122.1, 325.8, 107.3, 335.3, +108.8, 344.5, 106.6, 339.6, 106.6, 339.6, 104.4, 334.7, 106.1, 328.2, +109.4, 329.0, 114.3, 323.3, 116.5, 320.8, 116.7, 318.2, 118.7, 318.3, +925.0, 270.0, 923.2, 270.9, 923.2, 270.9, 921.4, 271.7, 910.6, 274.7, +910.2, 274.1, 900.1, 278.9, 892.2, 274.4, 892.2, 274.4, 884.2, 269.9, +853.6, 232.9, 850.9, 235.1, 817.5, 200.3, 861.1, 193.4, 867.2, 232.5, +916.9, 264.8, 921.0, 267.4, 922.6, 266.3, 925.0, 270.0, 704.8, 239.4, +704.8, 239.2, 714.5, 236.3, 722.0, 239.1, 727.1, 241.1, 726.0, 244.0, +729.9, 248.9, 747.4, 270.5, 766.2, 271.9, 764.8, 292.2, 765.0, 289.6, +744.5, 291.9, 727.4, 284.4, 723.0, 282.4, 724.6, 278.8, 721.8, 273.1, +713.3, 256.2, 704.7, 256.2, 704.8, 239.4, 666.3, 239.8, 663.2, 236.4, +657.8, 242.9, 652.5, 240.0, 645.6, 232.5, 645.6, 232.5, 638.7, 224.9, +652.4, 224.8, 656.3, 228.9, 666.3, 239.8, 773.6, 303.1, 775.2, 302.3, +778.8, 309.5, 784.0, 315.9, 784.0, 316.8, 785.5, 317.1, 785.4, 317.7, +785.1, 318.9, 784.8, 320.1, 784.9, 320.1, 781.7, 321.8, 783.7, 325.5, +782.6, 330.9, 778.5, 328.6, 777.8, 329.9, 773.0, 328.8, 768.4, 327.9, +768.5, 327.3, 763.9, 325.8, 764.2, 314.4, 765.2, 307.2, 773.6, 303.1, +697.2, 208.4, 686.5, 202.6, 682.2, 199.0, 680.7, 187.9, 687.8, 190.0, +690.8, 194.8, 695.0, 192.2, 697.4, 194.4, 698.4, 193.2, 701.9, 194.3, +726.8, 215.2, 729.6, 211.8, 757.4, 229.3, 757.5, 228.9, 724.9, 223.3, +697.2, 208.4, 624.2, 224.7, 614.0, 205.7, 616.0, 204.4, 603.8, 186.8, +608.6, 192.1, 608.6, 192.1, 613.4, 197.3, 620.3, 210.2, 614.9, 214.5, +624.2, 224.7, 484.2, 186.0, 456.3, 171.2, 457.3, 169.0, 428.4, 156.5, +427.8, 156.2, 427.8, 156.2, 427.2, 155.8, 455.7, 170.8, 457.2, 168.6, +484.2, 186.0, 620.2, 5.5, 620.2, 10.6, 617.8, 13.9, 620.2, 15.7, +610.8, 19.2, 610.8, 19.2, 601.4, 22.8, 598.7, 18.3, 595.3, 19.3, +588.8, 18.1, 583.6, 9.6, 583.6, 9.6, 578.5, 1.0, 584.0, -3.9, +578.1, -10.7, 577.7, -22.4, 577.6, -21.7, 578.8, -21.6, 580.0, -20.8, +600.1, -7.7, 602.6, -10.4, 620.2, 5.5, 151.7, 366.1, 155.5, 333.2, +157.2, 333.4, 159.2, 300.4, 164.9, 298.4, 164.9, 298.4, 170.5, 296.4, +166.4, 331.9, 170.9, 359.3, 151.7, 366.1, 170.5, 296.4, 171.2, 296.2, +171.2, 296.2, 172.0, 295.9, 171.6, 299.5, 180.8, 306.1, 185.4, 304.5, +183.7, 322.7, 183.7, 322.7, 182.0, 340.9, 165.8, 368.5, 158.1, 366.7, +150.4, 396.6, 150.3, 396.6, 150.3, 396.6, 150.3, 396.7, 149.9, 392.5, +149.9, 392.5, 149.5, 388.3, 149.1, 384.6, 149.8, 384.5, 150.0, 380.7, +150.3, 373.4, 150.8, 373.4, 151.7, 366.1, 170.9, 359.3, 166.4, 331.9, +170.5, 296.4, 618.3, 687.8, 619.4, 679.0, 603.6, 678.6, 602.3, 667.7, +612.9, 644.7, 605.8, 641.4, 609.2, 615.2, 628.7, 639.7, 622.9, 652.7, +618.3, 687.8, 705.5, 618.5, 711.2, 627.4, 711.2, 627.4, 716.9, 636.3, +710.2, 655.5, 702.4, 652.8, 687.9, 669.3, 675.3, 683.7, 676.1, 684.5, +662.7, 698.1, 662.7, 697.2, 661.9, 697.2, 661.2, 696.3, 664.7, 687.9, +665.7, 688.3, 670.2, 680.4, 674.1, 673.6, 674.1, 673.6, 678.0, 666.8, +691.7, 642.6, 685.3, 634.3, 705.5, 618.5, 743.5, 725.6, 741.4, 730.8, +743.2, 733.3, 739.3, 736.1, 735.2, 740.4, 735.2, 740.4, 731.1, 744.7, +721.4, 738.3, 724.7, 733.4, 718.2, 722.2, 717.3, 720.6, 717.3, 720.6, +716.3, 718.9, 710.1, 708.1, 710.1, 708.1, 703.9, 697.2, 703.3, 696.1, +703.6, 695.6, 702.6, 694.9, 712.2, 701.4, 711.9, 701.9, 721.2, 708.8, +730.6, 715.9, 730.6, 715.9, 739.9, 722.9, 741.7, 724.2, 743.6, 724.3, +743.5, 725.6, 685.5, 772.8, 679.5, 765.3, 672.3, 759.2, 673.6, 757.7, +672.1, 756.0, 672.1, 756.0, 670.7, 754.2, 667.7, 750.4, 667.7, 750.4, +664.7, 746.6, 664.1, 745.8, 664.1, 745.8, 663.5, 745.0, 653.5, 732.4, +648.2, 734.2, 643.6, 719.9, 648.2, 719.6, 647.9, 714.9, 652.3, 710.0, +670.8, 731.5, 665.9, 735.7, 679.5, 761.5, 682.5, 767.1, 680.8, 769.9, +685.5, 772.8, 575.0, 633.2, 573.1, 630.7, 572.8, 628.1, 571.1, 628.3, +573.3, 624.9, 563.2, 618.2, 555.2, 608.1, 549.9, 593.8, 552.4, 591.6, +543.2, 580.0, 545.2, 564.5, 545.2, 564.5, 547.1, 549.0, 544.2, 551.1, +550.9, 560.4, 554.6, 571.8, 564.8, 602.5, 566.0, 602.2, 575.0, 633.2, +552.2, 531.6, 552.3, 531.5, 551.5, 531.2, 551.5, 531.1, 556.7, 512.6, +556.7, 512.6, 561.8, 494.2, 561.8, 493.9, 562.9, 493.9, 564.0, 493.7, +563.0, 500.5, 561.9, 500.3, 559.9, 507.0, 556.0, 519.3, 556.4, 519.4, +552.2, 531.6, 550.7, 745.6, 554.9, 762.5, 548.5, 769.2, 559.2, 779.4, +552.8, 784.7, 553.7, 788.1, 546.4, 789.9, 533.1, 797.2, 533.1, 797.2, +519.9, 804.5, 522.8, 773.9, 526.4, 761.1, 550.7, 745.6, 519.9, 804.5, +517.5, 805.8, 515.6, 805.4, 515.2, 807.1, 519.5, 772.2, 519.5, 772.2, +523.8, 737.3, 523.0, 735.9, 534.1, 729.0, 544.4, 720.7, 547.5, 733.2, +547.5, 733.2, 550.7, 745.6, 526.4, 761.1, 522.8, 773.9, 519.9, 804.5, +580.6, 673.2, 579.5, 662.6, 575.3, 653.6, 578.4, 652.1, 579.7, 646.3, +581.0, 646.3, 580.9, 640.6, 585.5, 646.4, 590.7, 651.6, 590.1, 652.2, +589.9, 652.7, 591.6, 653.5, 591.4, 653.9, 590.6, 659.9, 604.0, 664.1, +602.3, 667.7, 603.6, 678.6, 619.4, 679.0, 618.3, 687.8, 618.4, 688.0, +618.4, 688.2, 618.6, 688.3, 602.2, 681.9, 602.3, 681.8, 586.0, 675.3, +583.3, 674.2, 581.2, 674.9, 580.6, 673.2, 531.6, 700.1, 530.3, 697.9, +528.6, 697.6, 529.0, 695.8, 529.9, 688.2, 529.6, 688.2, 530.8, 680.6, +531.2, 678.3, 531.1, 678.3, 531.4, 675.9, 535.0, 679.2, 545.9, 667.5, +560.3, 659.1, 560.5, 679.5, 547.8, 681.1, 531.6, 700.1, 611.2, 757.1, +629.3, 783.0, 624.2, 786.6, 637.1, 816.1, 639.1, 820.5, 640.9, 820.5, +641.0, 824.9, 639.3, 828.4, 639.3, 828.4, 637.6, 831.9, 624.6, 834.2, +616.6, 837.5, 610.6, 830.4, 603.2, 821.6, 610.7, 815.3, 610.8, 800.2, +610.9, 794.7, 610.9, 794.7, 610.9, 789.2, 611.0, 784.0, 611.0, 784.0, +611.0, 778.7, 611.1, 767.9, 616.2, 764.3, 611.2, 757.1, 670.7, 754.2, +672.1, 756.0, 672.1, 756.0, 673.6, 757.7, 650.1, 785.2, 657.3, 791.3, +641.0, 824.9, 640.9, 820.5, 639.1, 820.5, 637.1, 816.1, 641.6, 801.5, +644.6, 802.4, 652.0, 788.7, 661.4, 771.4, 659.6, 770.2, 670.7, 754.2, +626.7, 848.5, 592.0, 862.9, 591.6, 861.8, 557.4, 877.2, 556.7, 874.7, +556.7, 874.7, 556.1, 872.2, 590.4, 857.9, 627.4, 851.2, 626.7, 848.5, +547.0, 476.8, 547.6, 478.7, 548.3, 478.7, 548.1, 480.6, 548.0, 483.4, +548.0, 483.4, 547.9, 486.2, 546.7, 481.7, 546.9, 481.5, 547.0, 476.8, +492.2, 356.2, 480.9, 370.9, 480.9, 370.9, 469.6, 385.7, 467.7, 382.6, +463.9, 385.0, 458.3, 384.2, 462.7, 374.2, 467.7, 376.4, 477.2, 368.6, +484.7, 362.4, 488.7, 364.1, 492.2, 356.2, 396.9, 584.7, 408.3, 546.9, +410.4, 547.4, 419.7, 509.1, 420.3, 514.1, 421.1, 514.2, 420.8, 519.2, +420.7, 532.8, 420.4, 532.8, 420.6, 546.5, 419.9, 555.0, 419.9, 555.0, +419.2, 563.4, 411.4, 576.1, 397.0, 574.0, 396.9, 584.7, 419.2, 563.4, +415.4, 609.0, 415.4, 609.0, 411.6, 654.6, 411.0, 652.7, 407.3, 653.8, +403.1, 653.0, 408.9, 628.7, 408.9, 616.2, 393.3, 599.3, 394.8, 593.0, +394.8, 593.0, 396.3, 586.8, 396.5, 585.7, 396.6, 585.7, 396.9, 584.7, +397.0, 574.0, 411.4, 576.1, 419.2, 563.4, 418.1, 743.1, 421.8, 725.3, +421.8, 725.3, 425.5, 707.4, 433.4, 674.3, 434.0, 674.4, 442.2, 641.3, +444.8, 630.6, 447.3, 619.8, 447.3, 619.8, 447.3, 619.8, 444.8, 630.6, +442.2, 641.3, 435.7, 668.8, 435.7, 668.8, 429.2, 696.3, 423.6, 719.7, +425.6, 720.3, 418.1, 743.1, 394.7, 795.9, 393.5, 794.3, 393.5, 794.3, +392.3, 792.8, 386.9, 765.2, 385.7, 764.5, 373.2, 739.2, 388.1, 746.8, +402.3, 755.6, 403.0, 754.5, 420.6, 782.9, 420.6, 782.9, 438.3, 811.2, +438.9, 808.0, 416.1, 804.5, 394.7, 795.9, 438.3, 811.2, 438.3, 811.3, +438.3, 811.3, 438.3, 811.3, 444.2, 830.0, 444.2, 830.0, 450.1, 848.6, +437.5, 836.6, 435.5, 829.1, 420.7, 828.9, 407.7, 812.4, 407.7, 812.4, +394.7, 795.9, 416.1, 804.5, 438.9, 808.0, 438.3, 811.2, 416.1, 188.1, +416.4, 242.1, 416.0, 242.1, 416.8, 296.1, 407.0, 281.7, 407.0, 281.7, +397.3, 267.3, 397.0, 227.8, 431.5, 210.9, 416.1, 188.1, 397.3, 267.3, +390.0, 256.5, 379.9, 250.3, 382.7, 245.8, 382.5, 244.4, 382.5, 244.4, +382.3, 243.1, 381.0, 238.5, 383.0, 237.9, 383.8, 232.7, 394.0, 221.9, +388.0, 215.4, 390.4, 198.0, 401.1, 186.7, 400.3, 185.7, 411.9, 175.4, +413.9, 173.3, 413.9, 173.3, 416.0, 171.3, 415.9, 179.7, 416.0, 179.7, +416.1, 188.1, 431.5, 210.9, 397.0, 227.8, 397.3, 267.3, 275.3, 881.2, +275.2, 881.7, 275.2, 882.2, 275.0, 882.2, 263.9, 882.6, 255.8, 887.0, +252.7, 881.9, 240.2, 861.3, 244.8, 856.5, 243.7, 830.9, 244.0, 836.8, +247.3, 836.7, 251.0, 842.4, 255.4, 849.5, 255.4, 849.5, 259.8, 856.5, +264.9, 864.6, 264.9, 864.6, 270.1, 872.8, 272.7, 877.0, 273.1, 876.8, +275.3, 881.2, 239.4, 806.4, 234.4, 814.0, 241.5, 818.6, 243.7, 830.9, +244.8, 856.5, 240.2, 861.3, 252.7, 881.9, 246.6, 891.2, 211.6, 885.1, +210.9, 881.3, 205.0, 847.4, 218.0, 839.2, 239.4, 806.4, 210.9, 881.3, +210.8, 881.6, 209.1, 881.3, 209.1, 881.3, 212.1, 865.4, 209.0, 864.8, +208.8, 848.4, 207.5, 838.4, 210.5, 838.1, 212.2, 827.7, 209.5, 826.6, +221.9, 795.2, 231.7, 762.7, 223.7, 770.7, 235.1, 782.2, 238.5, 801.7, +239.0, 804.0, 240.0, 804.4, 239.4, 806.4, 218.0, 839.2, 205.0, 847.4, +210.9, 881.3, 359.2, 595.6, 360.1, 607.6, 363.8, 608.6, 361.0, 619.6, +360.5, 623.2, 360.5, 623.2, 360.0, 626.8, 311.7, 667.4, 312.0, 667.8, +264.0, 708.7, 275.7, 699.7, 273.7, 697.1, 283.5, 685.5, 292.3, 675.0, +292.3, 675.0, 301.1, 664.5, 313.0, 650.4, 313.0, 650.4, 324.9, 636.3, +342.0, 615.9, 337.3, 605.7, 359.2, 595.6, 355.4, 543.6, 356.1, 553.6, +356.1, 553.6, 356.8, 563.5, 339.0, 591.0, 311.6, 612.4, 311.1, 611.9, +307.1, 608.3, 329.4, 583.6, 347.8, 555.3, 351.6, 549.5, 356.2, 544.4, +355.4, 543.6, 257.4, 569.9, 257.2, 564.7, 255.6, 564.2, 257.0, 559.6, +259.6, 544.0, 258.2, 543.6, 262.2, 528.4, 267.1, 506.8, 262.2, 505.2, +269.5, 484.6, 270.8, 480.4, 270.8, 480.4, 272.0, 476.1, 273.8, 480.1, +271.2, 481.3, 270.4, 486.5, 263.9, 528.2, 265.0, 528.4, 257.4, 569.9, +279.0, 460.9, 279.1, 460.5, 278.2, 460.2, 277.5, 459.5, 277.2, 459.3, +277.0, 459.2, 277.0, 459.0, 283.9, 435.5, 283.9, 435.5, 290.7, 411.9, +300.0, 420.9, 285.7, 436.7, 279.0, 460.9, 308.0, 359.7, 310.3, 354.7, +310.3, 354.7, 312.7, 349.7, 314.3, 352.2, 333.6, 348.9, 337.7, 340.1, +346.5, 353.4, 346.5, 353.4, 355.4, 366.8, 346.3, 374.7, 340.0, 384.6, +343.5, 389.8, 341.5, 391.6, 341.5, 391.6, 339.5, 393.3, 322.1, 378.5, +319.9, 378.9, 308.0, 359.7, 339.5, 393.3, 337.2, 395.3, 334.6, 396.8, +334.9, 397.3, 323.6, 396.7, 316.9, 390.7, 312.2, 396.0, 305.9, 388.8, +301.7, 380.5, 299.6, 381.6, 301.0, 376.6, 301.0, 376.6, 302.4, 371.7, +303.9, 365.4, 305.2, 365.7, 308.0, 359.7, 319.9, 378.9, 322.1, 378.5, +339.5, 393.3, 431.3, 441.1, 431.5, 441.2, 431.6, 441.2, 431.6, 441.3, +431.6, 441.3, 431.6, 441.3, 431.6, 441.3, 431.5, 441.2, 431.3, 441.1, +431.3, 441.1, 260.7, 497.6, 259.4, 503.9, 259.7, 503.9, 258.1, 510.1, +256.8, 515.4, 255.8, 520.7, 255.8, 520.7, 249.4, 547.7, 250.8, 548.1, +242.9, 574.7, 241.7, 578.5, 241.8, 578.5, 240.7, 582.4, 239.4, 588.6, +238.4, 588.4, 236.0, 594.4, 240.5, 560.0, 241.1, 558.2, 234.6, 524.2, +242.6, 503.9, 242.6, 503.9, 250.5, 483.7, 249.5, 484.7, 258.5, 489.8, +260.7, 497.6, 250.5, 483.7, 251.2, 482.0, 251.0, 482.0, 251.8, 480.4, +262.3, 459.0, 262.3, 459.0, 272.8, 437.6, 267.5, 462.1, 267.9, 462.2, +262.9, 486.8, 261.5, 492.1, 261.8, 492.2, 260.7, 497.6, 258.5, 489.8, +249.5, 484.7, 250.5, 483.7, 114.3, 323.3, 109.4, 329.0, 106.1, 328.2, +104.4, 334.7, 90.8, 304.5, 90.8, 304.5, 77.2, 274.3, 74.8, 270.2, +76.4, 269.2, 75.5, 264.2, 92.4, 285.4, 90.4, 286.9, 105.3, 309.6, +109.8, 316.5, 114.5, 316.6, 114.3, 323.3, 721.8, 273.1, 724.6, 278.8, +723.0, 282.4, 727.4, 284.4, 727.4, 284.5, 723.5, 283.6, 719.5, 282.8, +717.0, 282.2, 717.0, 282.2, 714.4, 281.7, 699.8, 278.7, 698.9, 280.9, +685.2, 275.6, 681.5, 271.6, 681.5, 271.6, 677.8, 267.5, 699.5, 266.0, +701.2, 266.2, 721.8, 273.1, 677.8, 267.5, 665.2, 253.8, 665.2, 253.8, +652.5, 240.0, 657.8, 242.9, 663.2, 236.4, 666.3, 239.8, 685.6, 239.6, +690.8, 230.9, 704.8, 239.4, 704.7, 256.2, 713.3, 256.2, 721.8, 273.1, +701.2, 266.2, 699.5, 266.0, 677.8, 267.5, 641.5, 196.5, 647.2, 188.0, +652.8, 179.4, 653.0, 179.5, 666.8, 183.7, 666.8, 183.7, 680.7, 187.9, +682.2, 199.0, 686.5, 202.6, 697.2, 208.4, 705.9, 219.2, 705.9, 219.2, +714.6, 230.0, 715.2, 230.7, 715.9, 231.3, 715.8, 231.4, 715.7, 231.6, +715.0, 231.0, 714.1, 230.6, 677.8, 213.5, 671.3, 221.4, 641.5, 196.5, +686.3, 276.8, 685.8, 276.2, 685.8, 276.2, 685.2, 275.6, 698.9, 280.9, +699.8, 278.7, 714.4, 281.7, 706.7, 273.4, 700.2, 279.7, 686.3, 276.8, +714.6, 230.0, 705.9, 219.2, 705.9, 219.2, 697.2, 208.4, 724.9, 223.3, +757.5, 228.9, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, +741.4, 229.6, 741.4, 229.6, 725.3, 229.8, 720.0, 229.9, 718.0, 232.5, +714.6, 230.0, 652.8, 277.4, 638.5, 251.0, 638.5, 251.0, 624.2, 224.7, +614.9, 214.5, 620.3, 210.2, 613.4, 197.3, 620.0, 204.5, 620.0, 204.5, +626.6, 211.7, 626.7, 211.8, 626.7, 211.8, 626.8, 212.0, 626.8, 212.0, +626.8, 212.0, 626.8, 212.0, 655.9, 255.9, 655.5, 256.1, 685.6, 299.3, +696.0, 315.0, 696.0, 315.0, 706.4, 330.7, 700.6, 324.6, 698.1, 326.9, +689.7, 323.2, 669.0, 302.6, 669.0, 301.8, 652.8, 277.4, 689.7, 323.2, +681.7, 319.5, 675.5, 321.6, 673.6, 315.9, 673.6, 315.8, 673.6, 315.8, +673.5, 315.8, 673.6, 315.7, 663.2, 296.6, 652.8, 277.4, 669.0, 301.8, +669.0, 302.6, 689.7, 323.2, 521.4, 200.9, 516.3, 200.1, 515.0, 201.9, +511.1, 199.4, 505.2, 196.6, 505.2, 196.6, 499.3, 193.9, 491.5, 190.5, +491.8, 189.9, 484.2, 186.0, 456.3, 171.2, 457.3, 169.0, 428.4, 156.5, +427.8, 156.2, 427.8, 156.2, 427.2, 155.8, 423.8, 153.6, 423.0, 154.3, +420.4, 151.4, 414.8, 145.9, 415.1, 145.5, 409.3, 140.3, 413.9, 139.4, +413.9, 139.4, 418.6, 138.4, 425.7, 140.2, 425.1, 142.3, 431.7, 146.3, +476.5, 173.6, 477.8, 171.7, 521.4, 200.9, 616.4, -54.1, 618.2, -44.7, +618.2, -44.7, 620.1, -35.4, 629.9, -28.1, 620.1, -14.9, 620.2, 5.5, +602.6, -10.4, 600.1, -7.7, 580.0, -20.8, 579.0, -36.3, 595.0, -46.3, +616.4, -54.1, 580.0, -20.8, 578.8, -21.6, 577.6, -21.7, 577.7, -22.4, +577.3, -31.7, 574.6, -40.2, 577.0, -41.0, 582.2, -57.8, 582.2, -57.8, +587.3, -74.6, 593.8, -76.3, 595.3, -80.4, 597.6, -88.0, 597.7, -88.2, +598.1, -88.3, 598.2, -88.1, 605.5, -82.0, 608.1, -83.2, 612.3, -75.3, +615.4, -75.0, 614.4, -64.7, 616.4, -54.1, 595.0, -46.3, 579.0, -36.3, +580.0, -20.8, 609.3, 615.1, 609.3, 614.5, 609.2, 614.5, 609.4, 614.0, +616.4, 598.5, 612.9, 586.0, 623.3, 583.1, 625.3, 579.5, 626.3, 579.7, +627.2, 575.8, 627.0, 576.2, 627.3, 576.4, 627.3, 576.9, 628.7, 597.0, +628.7, 597.0, 630.0, 617.0, 631.0, 631.0, 631.0, 631.0, 631.9, 644.9, +632.5, 653.6, 632.6, 653.6, 633.1, 662.4, 634.6, 686.3, 634.3, 686.3, +635.9, 710.2, 635.9, 710.5, 636.4, 710.8, 636.4, 710.8, 636.4, 710.8, +635.9, 710.5, 635.9, 710.2, 636.2, 709.4, 634.9, 708.8, 633.8, 707.5, +620.9, 661.5, 621.3, 661.4, 609.3, 615.1, 633.8, 707.5, 632.3, 705.6, +630.8, 703.8, 630.9, 703.8, 624.7, 696.0, 624.7, 696.0, 618.6, 688.3, +618.4, 688.2, 618.4, 688.0, 618.3, 687.8, 622.9, 652.7, 628.7, 639.7, +609.2, 615.2, 609.3, 615.2, 609.3, 615.2, 609.3, 615.1, 621.3, 661.4, +620.9, 661.5, 633.8, 707.5, 696.0, 603.6, 696.3, 604.1, 696.3, 604.2, +696.7, 604.7, 695.6, 610.5, 701.1, 611.6, 705.5, 618.5, 685.3, 634.3, +691.7, 642.6, 678.0, 666.8, 683.9, 659.1, 680.8, 656.7, 683.7, 646.7, +686.2, 637.8, 686.2, 637.8, 688.7, 629.0, 692.4, 616.3, 691.9, 616.1, +696.0, 603.6, 727.2, 652.4, 737.6, 668.6, 733.2, 676.6, 747.9, 684.8, +750.0, 690.9, 751.5, 690.4, 755.2, 696.0, 744.3, 704.0, 749.3, 710.8, +743.5, 725.6, 743.6, 724.3, 741.7, 724.2, 739.9, 722.9, 734.8, 702.4, +736.2, 702.0, 732.4, 681.1, 729.8, 666.8, 732.9, 653.7, 727.2, 652.4, +679.5, 761.5, 665.9, 735.7, 670.8, 731.5, 652.3, 710.0, 654.4, 707.5, +654.4, 707.5, 656.6, 705.1, 664.6, 716.4, 661.9, 718.3, 667.3, 731.5, +671.8, 742.5, 671.8, 742.5, 676.3, 753.6, 677.2, 755.8, 677.2, 755.8, +678.1, 758.1, 678.8, 759.8, 678.6, 759.8, 679.5, 761.5, 579.1, 629.3, +577.6, 632.0, 576.4, 631.8, 576.1, 634.6, 575.6, 633.9, 575.6, 633.9, +575.0, 633.2, 566.0, 602.2, 564.8, 602.5, 554.6, 571.8, 558.1, 584.8, +560.0, 584.3, 565.3, 596.8, 572.2, 613.1, 574.3, 612.5, 579.1, 629.3, +559.9, 507.0, 561.9, 500.3, 563.0, 500.5, 564.0, 493.7, 568.0, 492.8, +572.1, 492.7, 572.1, 491.9, 576.3, 494.4, 580.8, 495.0, 580.6, 496.9, +584.7, 505.2, 590.1, 502.5, 599.7, 508.2, 583.8, 515.9, 577.2, 514.0, +559.9, 507.0, 613.0, 725.3, 604.5, 735.6, 603.8, 735.1, 595.9, 745.9, +592.5, 750.0, 588.2, 752.9, 589.1, 754.2, 590.3, 743.5, 587.9, 743.2, +586.8, 732.3, 588.7, 728.1, 593.8, 730.4, 600.8, 728.6, 606.9, 726.9, +612.1, 728.4, 613.0, 725.3, 576.6, 650.0, 574.9, 663.4, 567.3, 670.3, +573.1, 676.7, 567.5, 713.8, 563.1, 714.0, 563.4, 751.1, 558.5, 743.3, +558.5, 743.3, 553.7, 735.5, 559.4, 692.0, 562.7, 692.0, 576.6, 650.0, +553.7, 735.5, 549.1, 728.1, 549.1, 728.1, 544.4, 720.7, 538.1, 710.3, +538.0, 710.4, 531.6, 700.1, 547.8, 681.1, 560.5, 679.5, 560.3, 659.1, +568.5, 654.3, 571.0, 656.4, 576.7, 649.6, 576.6, 649.8, 576.6, 649.8, +576.6, 650.0, 562.7, 692.0, 559.4, 692.0, 553.7, 735.5, 601.6, 740.8, +602.5, 740.0, 602.5, 740.0, 603.4, 739.3, 608.2, 747.5, 607.2, 748.1, +611.1, 756.9, 611.2, 757.0, 611.2, 757.0, 611.2, 757.1, 616.2, 764.3, +611.1, 767.9, 611.0, 778.7, 611.9, 774.5, 609.9, 774.1, 608.7, 769.4, +605.2, 755.1, 604.2, 755.3, 601.6, 740.8, 630.4, 715.1, 633.1, 712.6, +634.5, 713.3, 635.9, 710.2, 635.9, 710.5, 636.4, 710.8, 636.4, 710.8, +637.3, 715.8, 640.3, 720.1, 643.6, 719.9, 648.2, 734.2, 653.5, 732.4, +663.5, 745.0, 660.2, 736.0, 655.5, 737.8, 647.5, 730.5, 638.9, 722.8, +635.8, 724.6, 630.4, 715.1, 556.0, 871.7, 550.9, 851.6, 545.8, 831.4, +545.8, 831.4, 546.6, 829.6, 545.2, 829.0, 544.5, 826.6, 554.0, 824.7, +563.2, 824.2, 564.4, 827.7, 569.6, 842.9, 560.9, 845.9, 557.4, 864.1, +556.7, 867.9, 554.8, 868.6, 556.0, 871.7, 514.8, 533.6, 503.1, 533.1, +491.9, 530.4, 491.4, 532.6, 486.1, 528.4, 475.4, 529.7, 474.6, 531.9, +474.7, 530.5, 474.7, 530.5, 474.8, 529.0, 469.2, 522.9, 486.6, 506.8, +498.4, 484.5, 495.6, 487.0, 501.4, 493.6, 504.5, 502.6, 508.3, 514.0, +508.3, 514.0, 512.1, 525.5, 513.5, 529.6, 514.9, 533.6, 514.8, 533.6, +448.4, 376.8, 447.4, 374.6, 447.4, 374.6, 446.4, 372.4, 448.0, 361.3, +448.9, 361.0, 447.8, 349.9, 451.7, 335.6, 451.7, 335.6, 455.6, 321.4, +462.3, 334.2, 453.4, 338.8, 451.1, 356.2, 449.7, 366.5, 451.2, 367.0, +448.4, 376.8, 442.2, 641.3, 444.8, 630.6, 447.3, 619.8, 447.3, 619.8, +450.4, 607.2, 451.7, 607.4, 453.5, 594.6, 455.3, 625.3, 455.3, 625.3, +457.1, 655.9, 458.4, 650.7, 444.6, 650.0, 442.2, 641.3, 305.5, 617.8, +304.9, 615.7, 308.3, 614.8, 311.1, 611.9, 311.6, 612.4, 339.0, 591.0, +356.8, 563.5, 358.0, 579.6, 358.0, 579.6, 359.2, 595.6, 337.3, 605.7, +342.0, 615.9, 324.9, 636.3, 323.8, 637.1, 319.9, 631.5, 314.9, 626.8, +310.2, 622.3, 306.8, 623.1, 305.5, 617.8, 273.1, 632.1, 273.6, 645.9, +270.9, 655.3, 260.4, 660.1, 260.0, 649.2, 260.0, 649.2, 259.6, 638.3, +262.0, 633.2, 273.2, 635.0, 273.1, 632.1, 356.6, 461.0, 355.1, 470.8, +349.6, 477.1, 353.6, 480.6, 347.2, 481.7, 347.2, 481.7, 340.7, 482.8, +342.5, 471.0, 347.1, 462.7, 356.6, 461.0, 410.9, 428.7, 421.1, 434.9, +421.1, 434.9, 431.3, 441.1, 431.3, 441.1, 431.5, 441.2, 431.6, 441.3, +429.9, 448.1, 429.0, 448.0, 428.3, 454.9, 428.0, 458.4, 427.4, 458.4, +426.6, 461.9, 426.5, 460.5, 422.7, 460.9, 418.9, 459.8, 417.7, 449.6, +393.3, 452.4, 367.8, 445.0, 367.1, 442.5, 388.9, 430.0, 410.9, 428.7, +367.8, 445.0, 366.6, 444.6, 365.4, 444.7, 365.4, 444.3, 359.8, 439.8, +359.8, 439.8, 354.1, 435.3, 368.9, 434.1, 368.0, 423.2, 381.9, 411.1, +389.8, 423.9, 396.4, 419.9, 410.9, 428.7, 388.9, 430.0, 367.1, 442.5, +367.8, 445.0, 68.2, 220.7, 67.1, 213.8, 64.9, 213.5, 65.9, 206.9, +66.4, 193.9, 65.6, 193.9, 66.9, 181.0, 67.2, 178.0, 67.2, 178.0, +67.4, 175.0, 67.9, 176.4, 68.0, 176.4, 68.6, 177.8, 82.1, 176.7, +85.3, 216.6, 101.9, 255.4, 102.1, 238.2, 82.5, 239.9, 68.2, 220.7, +819.3, 199.5, 818.6, 198.6, 817.2, 199.7, 816.1, 198.8, 809.4, 191.8, +809.4, 191.8, 802.7, 184.8, 805.2, 187.7, 805.6, 187.3, 808.4, 189.9, +810.7, 191.9, 810.7, 191.9, 813.0, 194.0, 816.1, 196.8, 817.1, 196.1, +819.3, 199.5, 916.9, 264.8, 867.2, 232.5, 861.1, 193.4, 817.5, 200.3, +816.8, 199.5, 816.8, 199.5, 816.1, 198.8, 817.2, 199.7, 818.6, 198.6, +819.3, 199.5, 857.7, 208.5, 857.7, 208.3, 896.1, 217.4, 896.2, 217.4, +896.3, 217.5, 896.3, 217.7, 906.7, 241.2, 902.2, 261.5, 916.9, 264.8, +896.3, 217.7, 896.4, 217.7, 896.5, 217.6, 896.6, 217.7, 912.8, 229.1, +912.7, 229.3, 929.0, 240.6, 934.5, 244.9, 934.5, 244.9, 940.1, 249.1, +943.0, 254.3, 941.7, 255.7, 941.3, 262.2, 941.3, 262.5, 939.2, 262.7, +939.3, 263.2, 939.6, 265.2, 925.6, 266.1, 925.5, 269.8, 925.5, 269.9, +925.2, 269.9, 925.0, 270.0, 922.6, 266.3, 921.0, 267.4, 916.9, 264.8, +904.8, 242.3, 906.9, 241.2, 896.6, 217.7, 896.5, 217.6, 896.4, 217.7, +896.3, 217.7, 638.0, 224.2, 633.7, 219.4, 633.7, 219.4, 629.3, 214.7, +636.9, 207.0, 635.4, 205.6, 641.5, 196.5, 671.3, 221.4, 677.8, 213.5, +714.1, 230.6, 713.9, 232.2, 675.4, 231.2, 638.0, 224.2, 714.1, 230.6, +715.0, 231.0, 715.7, 231.6, 715.8, 231.4, 719.2, 235.0, 721.8, 239.3, +722.0, 239.1, 714.5, 236.3, 704.8, 239.2, 704.8, 239.4, 690.8, 230.9, +685.6, 239.6, 666.3, 239.8, 656.3, 228.9, 652.4, 224.8, 638.7, 224.9, +638.4, 224.6, 638.4, 224.6, 638.0, 224.2, 675.4, 231.2, 713.9, 232.2, +714.1, 230.6, 719.5, 282.8, 723.5, 283.6, 727.4, 284.5, 727.4, 284.4, +744.5, 291.9, 765.0, 289.6, 764.8, 292.2, 770.3, 294.4, 771.1, 303.5, +773.3, 302.8, 766.0, 305.3, 763.9, 299.3, 754.4, 295.7, 737.0, 289.2, +736.7, 290.0, 719.5, 282.8, 725.3, 229.8, 741.4, 229.6, 741.4, 229.6, +757.4, 229.3, 769.7, 237.1, 769.7, 237.1, 782.1, 244.9, 778.4, 241.6, +776.7, 243.5, 771.3, 242.0, 748.3, 235.9, 740.9, 244.0, 725.3, 229.8, +519.0, 181.6, 528.0, 190.6, 526.3, 193.5, 537.0, 199.6, 538.5, 201.6, +538.5, 201.6, 540.0, 203.6, 532.3, 199.4, 530.7, 202.2, 521.4, 200.9, +477.8, 171.7, 476.5, 173.6, 431.7, 146.3, 434.6, 169.1, 477.1, 160.4, +519.0, 181.6, 431.7, 146.3, 425.1, 142.3, 425.7, 140.2, 418.6, 138.4, +432.6, 135.3, 433.1, 136.8, 446.7, 132.3, 455.3, 131.1, 458.1, 133.7, +463.7, 128.7, 464.0, 128.4, 464.3, 128.6, 464.8, 128.5, 471.2, 135.4, +471.8, 134.9, 478.7, 141.4, 503.0, 150.3, 498.8, 161.5, 519.0, 181.6, +477.1, 160.4, 434.6, 169.1, 431.7, 146.3, 662.2, 550.8, 669.9, 559.1, +668.4, 560.5, 674.6, 570.2, 678.1, 576.1, 676.7, 578.5, 682.0, 581.7, +681.3, 582.6, 684.2, 587.1, 685.3, 586.9, 687.4, 596.0, 690.6, 595.2, +696.0, 603.6, 691.9, 616.1, 692.4, 616.3, 688.7, 629.0, 673.2, 615.5, +681.1, 606.5, 673.4, 583.9, 669.5, 572.2, 669.5, 572.2, 665.5, 560.5, +663.8, 555.6, 665.4, 554.2, 662.2, 550.8, 721.2, 708.8, 711.9, 701.9, +712.2, 701.4, 702.6, 694.9, 693.5, 684.1, 688.8, 682.7, 688.3, 669.9, +688.6, 678.5, 695.3, 678.2, 702.3, 686.5, 711.7, 697.7, 720.7, 697.3, +721.2, 708.8, 661.0, 700.0, 661.9, 699.0, 662.6, 699.1, 662.7, 698.1, +676.1, 684.5, 675.3, 683.7, 687.9, 669.3, 687.9, 669.4, 688.1, 669.6, +688.3, 669.9, 688.8, 682.7, 693.5, 684.1, 702.6, 694.9, 703.6, 695.6, +703.3, 696.1, 703.9, 697.2, 692.5, 699.2, 692.3, 698.0, 680.6, 698.7, +675.1, 699.1, 675.1, 699.1, 669.6, 699.4, 665.3, 699.7, 665.1, 700.8, +661.0, 700.0, 592.4, 572.5, 589.3, 586.8, 582.8, 599.4, 586.2, 601.1, +580.0, 612.0, 575.6, 621.5, 580.6, 626.7, 579.9, 628.0, 579.9, 628.0, +579.1, 629.3, 574.3, 612.5, 572.2, 613.1, 565.3, 596.8, 568.7, 582.3, +581.8, 570.3, 592.4, 572.5, 565.3, 596.8, 560.0, 584.3, 558.1, 584.8, +554.6, 571.8, 550.9, 560.4, 544.2, 551.1, 547.1, 549.0, 547.3, 547.2, +546.7, 546.9, 547.5, 545.3, 549.5, 538.2, 549.5, 538.2, 551.5, 531.1, +551.5, 531.2, 552.3, 531.5, 552.2, 531.6, 554.8, 533.5, 554.8, 533.5, +557.4, 535.4, 576.0, 549.0, 579.0, 546.1, 594.5, 562.6, 593.4, 567.5, +593.4, 567.5, 592.4, 572.5, 581.8, 570.3, 568.7, 582.3, 565.3, 596.8, +605.0, 514.1, 599.8, 538.4, 599.8, 538.4, 594.5, 562.6, 579.0, 546.1, +576.0, 549.0, 557.4, 535.4, 560.7, 520.3, 594.6, 506.5, 605.0, 514.1, +557.4, 535.4, 554.8, 533.5, 554.8, 533.5, 552.2, 531.6, 556.4, 519.4, +556.0, 519.3, 559.9, 507.0, 577.2, 514.0, 583.8, 515.9, 599.7, 508.2, +602.6, 509.9, 602.6, 509.9, 605.6, 511.6, 605.8, 511.8, 605.3, 512.9, +605.0, 514.1, 594.6, 506.5, 560.7, 520.3, 557.4, 535.4, 600.8, 728.6, +593.8, 730.4, 588.7, 728.1, 586.8, 732.3, 583.7, 702.7, 583.7, 702.7, +580.6, 673.2, 581.2, 674.9, 583.3, 674.2, 586.0, 675.3, 595.4, 701.2, +600.4, 701.8, 600.8, 728.6, 586.0, 675.3, 602.3, 681.8, 602.2, 681.9, +618.6, 688.3, 624.7, 696.0, 624.7, 696.0, 630.9, 703.8, 620.4, 712.7, +621.9, 714.5, 613.0, 725.3, 612.1, 728.4, 606.9, 726.9, 600.8, 728.6, +600.4, 701.8, 595.4, 701.2, 586.0, 675.3, 610.8, 800.2, 610.7, 815.3, +603.2, 821.6, 610.6, 830.4, 610.6, 830.5, 608.9, 830.3, 607.3, 830.2, +585.8, 828.9, 585.8, 828.9, 564.4, 827.7, 563.2, 824.2, 554.0, 824.7, +544.5, 826.6, 544.5, 826.3, 544.5, 826.3, 544.4, 826.1, 577.5, 812.9, +578.6, 798.2, 610.8, 800.2, 611.1, 756.9, 607.2, 748.1, 608.2, 747.5, +603.4, 739.3, 609.7, 733.6, 609.7, 733.6, 616.0, 728.0, 614.4, 728.3, +615.2, 732.7, 614.4, 737.3, 614.3, 737.8, 614.3, 737.8, 614.2, 738.3, +612.7, 747.6, 613.5, 756.7, 611.1, 756.9, 607.3, 830.2, 608.9, 830.3, +610.6, 830.5, 610.6, 830.4, 616.6, 837.5, 624.6, 834.2, 637.6, 831.9, +634.0, 839.4, 634.0, 839.4, 630.3, 847.0, 630.3, 846.9, 628.5, 847.7, +626.7, 848.5, 627.4, 851.2, 590.4, 857.9, 556.1, 872.2, 556.0, 871.9, +556.0, 871.9, 556.0, 871.7, 554.8, 868.6, 556.7, 867.9, 557.4, 864.1, +580.8, 845.2, 581.8, 846.3, 607.3, 830.2, 557.4, 864.1, 560.9, 845.9, +569.6, 842.9, 564.4, 827.7, 585.8, 828.9, 585.8, 828.9, 607.3, 830.2, +581.8, 846.3, 580.8, 845.2, 557.4, 864.1, 547.5, 499.4, 547.5, 499.8, +547.7, 500.0, 547.5, 500.3, 536.3, 517.1, 536.3, 517.1, 525.2, 534.0, +525.1, 533.3, 520.0, 533.8, 514.8, 533.6, 514.9, 533.6, 513.5, 529.6, +512.1, 525.5, 518.9, 516.3, 521.8, 518.4, 531.4, 511.3, 539.5, 505.4, +539.3, 505.1, 547.5, 499.4, 451.1, 356.2, 453.4, 338.8, 462.3, 334.2, +455.6, 321.4, 456.1, 319.7, 457.2, 318.6, 456.6, 318.0, 458.1, 318.4, +458.1, 318.4, 459.7, 318.9, 457.0, 337.8, 462.6, 349.1, 451.1, 356.2, +429.2, 696.3, 435.7, 668.8, 435.7, 668.8, 442.2, 641.3, 444.6, 650.0, +458.4, 650.7, 457.1, 655.9, 457.9, 669.3, 457.9, 669.3, 458.7, 682.6, +462.2, 696.8, 457.6, 697.9, 456.6, 713.1, 453.4, 715.7, 446.3, 706.8, +436.1, 700.5, 432.6, 698.4, 429.0, 698.0, 429.2, 696.3, 347.1, 650.0, +347.7, 658.4, 346.5, 658.6, 348.4, 666.8, 338.4, 696.1, 338.4, 696.1, +328.4, 725.4, 328.1, 726.3, 328.0, 726.3, 327.5, 727.1, 325.7, 730.5, +324.9, 730.3, 324.0, 733.9, 334.6, 692.0, 335.4, 692.2, 346.9, 650.6, +347.0, 650.3, 347.1, 650.3, 347.1, 650.0, 270.1, 872.8, 264.9, 864.6, +264.9, 864.6, 259.8, 856.5, 259.4, 855.5, 260.7, 854.9, 261.5, 853.3, +292.7, 793.6, 292.7, 793.6, 324.0, 733.9, 324.9, 730.3, 325.7, 730.5, +327.5, 727.1, 299.2, 800.1, 306.2, 803.8, 270.1, 872.8, 327.5, 727.1, +328.0, 726.3, 328.1, 726.3, 328.4, 725.4, 322.8, 741.8, 319.6, 741.4, +317.2, 758.2, 297.5, 803.6, 296.7, 804.1, 285.2, 852.2, 281.3, 861.8, +284.4, 870.0, 278.5, 871.8, 275.7, 875.5, 276.9, 876.5, 275.3, 881.2, +273.1, 876.8, 272.7, 877.0, 270.1, 872.8, 306.2, 803.8, 299.2, 800.1, +327.5, 727.1, 314.9, 626.8, 319.9, 631.5, 323.8, 637.1, 324.9, 636.3, +313.0, 650.4, 313.0, 650.4, 301.1, 664.5, 306.3, 660.7, 303.8, 657.3, +306.4, 650.2, 310.6, 638.5, 306.5, 633.0, 314.9, 626.8, 347.1, 555.7, +347.3, 561.2, 337.1, 561.5, 327.0, 567.2, 310.5, 576.7, 311.8, 580.6, +294.0, 586.2, 297.6, 585.1, 296.3, 581.2, 298.6, 576.2, 300.9, 571.2, +300.9, 571.2, 303.2, 566.1, 309.5, 552.3, 309.5, 552.3, 315.8, 538.5, +323.9, 534.9, 320.7, 527.7, 325.6, 516.9, 342.1, 525.9, 346.6, 536.0, +347.1, 555.7, 325.6, 516.9, 327.3, 513.3, 330.1, 511.2, 329.0, 509.6, +341.8, 522.1, 341.8, 522.1, 354.7, 534.6, 356.5, 535.4, 355.0, 539.1, +355.4, 543.6, 356.2, 544.4, 351.6, 549.5, 347.8, 555.3, 347.6, 555.6, +347.1, 555.7, 347.1, 555.7, 346.6, 536.0, 342.1, 525.9, 325.6, 516.9, +278.9, 619.5, 273.7, 609.2, 282.3, 599.0, 294.0, 586.2, 311.8, 580.6, +310.5, 576.7, 327.0, 567.2, 330.2, 573.7, 313.3, 582.2, 299.5, 597.1, +289.2, 608.3, 276.5, 614.7, 278.9, 619.5, 308.5, 478.6, 294.1, 470.2, +294.6, 469.4, 279.8, 461.8, 279.3, 461.5, 278.9, 461.2, 279.0, 460.9, +285.7, 436.7, 300.0, 420.9, 290.7, 411.9, 291.4, 409.5, 291.4, 409.5, +292.1, 407.2, 292.0, 407.2, 292.6, 409.2, 293.0, 411.3, 300.8, 444.9, +316.2, 449.0, 308.5, 478.6, 105.3, 309.6, 90.4, 286.9, 92.4, 285.4, +75.5, 264.2, 71.9, 242.5, 71.9, 242.5, 68.2, 220.7, 82.5, 239.9, +102.1, 238.2, 101.9, 255.4, 103.7, 259.7, 103.7, 259.7, 105.6, 264.0, +107.0, 286.7, 105.6, 309.6, 105.3, 309.6, 105.6, 264.0, 105.7, 264.1, +105.7, 264.1, 105.7, 264.3, 108.2, 272.8, 108.8, 272.7, 110.6, 281.3, +114.6, 299.8, 114.6, 299.8, 118.7, 318.3, 116.7, 318.2, 116.5, 320.8, +114.3, 323.3, 114.5, 316.6, 109.8, 316.5, 105.3, 309.6, 102.1, 287.5, +105.6, 287.0, 105.7, 264.3, 105.7, 264.1, 105.7, 264.1, 105.6, 264.0, +813.0, 194.0, 807.8, 189.4, 807.8, 189.4, 802.7, 184.8, 802.4, 184.5, +802.4, 184.5, 802.1, 184.2, 805.3, 187.0, 805.3, 187.0, 808.4, 189.9, +810.7, 191.9, 810.7, 191.9, 813.0, 194.0, 703.6, 295.6, 697.1, 288.6, +697.1, 288.6, 690.7, 281.6, 688.5, 279.2, 688.5, 279.2, 686.3, 276.8, +700.2, 279.7, 706.7, 273.4, 714.4, 281.7, 717.0, 282.2, 717.0, 282.2, +719.5, 282.8, 736.7, 290.0, 737.0, 289.2, 754.4, 295.7, 739.0, 308.1, +727.8, 301.0, 703.6, 295.6, 754.4, 295.7, 763.9, 299.3, 766.0, 305.3, +773.3, 302.8, 773.5, 302.8, 773.7, 303.0, 773.6, 303.1, 765.2, 307.2, +764.2, 314.4, 763.9, 325.8, 740.5, 318.1, 741.1, 315.2, 717.1, 310.4, +710.4, 303.0, 710.4, 303.0, 703.6, 295.6, 727.8, 301.0, 739.0, 308.1, +754.4, 295.7, 729.9, 248.9, 726.0, 244.0, 727.1, 241.1, 722.0, 239.1, +721.8, 239.3, 719.2, 235.0, 715.8, 231.4, 715.9, 231.3, 715.2, 230.7, +714.6, 230.0, 718.0, 232.5, 720.0, 229.9, 725.3, 229.8, 740.9, 244.0, +748.3, 235.9, 771.3, 242.0, 765.5, 235.9, 756.5, 244.5, 741.7, 247.0, +735.8, 247.9, 734.7, 250.8, 729.9, 248.9, 627.3, 576.9, 627.3, 576.4, +627.0, 576.2, 627.2, 575.8, 628.0, 572.7, 625.3, 571.4, 626.8, 569.1, +632.9, 555.2, 632.9, 555.2, 639.0, 541.4, 632.2, 549.5, 635.4, 552.2, +631.9, 562.9, 629.6, 569.9, 629.8, 570.0, 627.3, 576.9, 732.4, 681.1, +736.2, 702.0, 734.8, 702.4, 739.9, 722.9, 730.6, 715.9, 730.6, 715.9, +721.2, 708.8, 720.7, 697.3, 711.7, 697.7, 702.3, 686.5, 705.4, 678.9, +726.0, 674.9, 732.4, 681.1, 702.3, 686.5, 695.3, 678.2, 688.6, 678.5, +688.3, 669.9, 688.1, 669.6, 687.9, 669.4, 687.9, 669.3, 702.4, 652.8, +710.2, 655.5, 716.9, 636.3, 722.1, 644.3, 722.1, 644.3, 727.2, 652.4, +732.9, 653.7, 729.8, 666.8, 732.4, 681.1, 726.0, 674.9, 705.4, 678.9, +702.3, 686.5, 667.3, 731.5, 661.9, 718.3, 664.6, 716.4, 656.6, 705.1, +658.8, 702.5, 658.8, 702.5, 661.0, 700.0, 665.1, 700.8, 665.3, 699.7, +669.6, 699.4, 672.6, 714.6, 674.1, 728.5, 667.3, 731.5, 583.5, 760.9, +586.3, 757.5, 588.6, 757.8, 589.1, 754.2, 588.2, 752.9, 592.5, 750.0, +595.9, 745.9, 598.1, 742.9, 598.8, 743.4, 601.6, 740.8, 604.2, 755.3, +605.2, 755.1, 608.7, 769.4, 605.2, 773.4, 593.4, 768.6, 583.5, 760.9, +647.5, 730.5, 655.5, 737.8, 660.2, 736.0, 663.5, 745.0, 664.1, 745.8, +664.1, 745.8, 664.7, 746.6, 662.4, 744.7, 662.5, 744.5, 660.3, 742.5, +653.9, 736.5, 654.3, 736.0, 647.5, 730.5, 521.2, 461.3, 529.7, 453.6, +529.7, 453.6, 538.1, 445.8, 538.4, 448.1, 538.8, 448.1, 539.5, 450.4, +531.8, 457.4, 520.4, 458.7, 521.2, 461.3, 477.2, 368.6, 467.7, 376.4, +462.7, 374.2, 458.3, 384.2, 454.8, 383.8, 452.5, 381.9, 451.3, 383.3, +449.8, 380.1, 449.8, 380.1, 448.4, 376.8, 451.2, 367.0, 449.7, 366.5, +451.1, 356.2, 462.6, 349.1, 457.0, 337.8, 459.7, 318.9, 461.5, 319.4, +461.5, 319.4, 463.3, 319.9, 471.7, 343.7, 479.1, 344.9, 477.2, 368.6, +463.3, 319.9, 471.0, 322.1, 478.7, 323.4, 478.6, 324.2, 486.4, 339.0, +486.4, 339.0, 494.1, 353.7, 494.4, 354.1, 493.2, 355.0, 492.2, 356.2, +488.7, 364.1, 484.7, 362.4, 477.2, 368.6, 479.1, 344.9, 471.7, 343.7, +463.3, 319.9, 418.9, 766.3, 416.7, 763.5, 416.7, 763.5, 414.4, 760.8, +413.6, 760.2, 414.9, 758.5, 415.4, 756.3, 418.5, 760.1, 419.8, 761.8, +418.9, 766.3, 238.5, 801.7, 235.1, 782.2, 223.7, 770.7, 231.7, 762.7, +232.7, 759.2, 232.7, 759.2, 233.8, 755.6, 236.8, 761.2, 234.5, 762.4, +235.2, 769.2, 235.4, 771.3, 235.4, 771.3, 235.6, 773.3, 236.2, 779.1, +236.2, 779.1, 236.8, 784.9, 237.4, 790.6, 237.4, 790.6, 238.0, 796.2, +238.3, 799.0, 238.0, 799.0, 238.5, 801.7, 283.5, 685.5, 273.7, 697.1, +275.7, 699.7, 264.0, 708.7, 263.0, 709.5, 263.0, 709.5, 262.0, 710.4, +267.0, 702.9, 264.5, 698.4, 261.3, 688.3, 259.5, 685.3, 261.2, 684.4, +261.0, 680.4, 271.8, 679.0, 283.1, 681.8, 283.5, 685.5, 297.7, 626.0, +292.4, 638.3, 287.9, 636.3, 278.2, 646.7, 269.3, 656.0, 270.6, 657.7, +260.5, 665.3, 260.4, 662.7, 260.4, 662.7, 260.4, 660.1, 270.9, 655.3, +273.6, 645.9, 273.1, 632.1, 276.0, 625.8, 274.8, 624.9, 278.9, 619.5, +276.5, 614.7, 289.2, 608.3, 299.5, 597.1, 303.2, 598.4, 303.1, 613.5, +297.7, 626.0, 299.5, 597.1, 313.3, 582.2, 330.2, 573.7, 327.0, 567.2, +337.1, 561.5, 347.3, 561.2, 347.1, 555.7, 347.1, 555.7, 347.6, 555.6, +347.8, 555.3, 329.4, 583.6, 307.1, 608.3, 311.1, 611.9, 308.3, 614.8, +304.9, 615.7, 305.5, 617.8, 301.6, 621.9, 296.9, 623.2, 297.7, 626.0, +303.1, 613.5, 303.2, 598.4, 299.5, 597.1, 270.4, 486.5, 271.2, 481.3, +273.8, 480.1, 272.0, 476.1, 274.5, 467.6, 274.5, 467.6, 277.0, 459.0, +277.0, 459.2, 277.2, 459.3, 277.5, 459.5, 274.2, 473.1, 274.7, 473.3, +270.4, 486.5, 273.8, 561.0, 276.9, 540.3, 287.9, 535.6, 309.5, 524.1, +312.6, 531.3, 315.8, 538.5, 315.8, 538.5, 309.5, 552.3, 309.5, 552.3, +303.2, 566.1, 292.8, 571.7, 273.8, 561.4, 273.8, 561.0, 293.0, 411.3, +292.6, 409.2, 292.0, 407.2, 292.1, 407.2, 292.3, 406.5, 292.3, 406.5, +292.5, 405.8, 306.0, 421.3, 313.3, 417.0, 335.5, 422.7, 339.3, 427.0, +338.6, 427.9, 343.0, 431.2, 352.6, 437.1, 350.7, 440.1, 358.5, 448.9, +359.1, 449.2, 358.1, 451.1, 357.8, 453.2, 346.9, 448.6, 347.8, 446.7, +337.7, 440.2, 315.4, 425.7, 314.6, 426.8, 293.0, 411.3, 808.4, 189.9, +805.3, 187.0, 805.3, 187.0, 802.1, 184.2, 799.7, 181.7, 799.7, 181.7, +797.2, 179.1, 809.8, 174.1, 821.3, 166.9, 820.2, 163.7, 862.2, 179.9, +899.8, 209.2, 896.1, 217.4, 893.9, 222.3, 851.7, 205.1, 808.4, 189.9, +896.1, 217.4, 896.4, 217.5, 896.4, 217.5, 896.6, 217.7, 896.5, 217.6, +896.4, 217.7, 896.3, 217.7, 857.8, 208.6, 857.3, 210.4, 819.3, 199.5, +817.1, 196.1, 816.1, 196.8, 813.0, 194.0, 810.7, 191.9, 810.7, 191.9, +808.4, 189.9, 851.7, 205.1, 893.9, 222.3, 896.1, 217.4, 786.5, 247.7, +786.8, 247.9, 786.8, 247.9, 787.0, 248.0, 779.8, 266.6, 786.1, 269.0, +785.1, 289.9, 785.8, 278.9, 785.5, 278.9, 785.9, 267.8, 786.2, 257.8, +786.0, 257.7, 786.5, 247.7, 676.3, 753.6, 671.8, 742.5, 671.8, 742.5, +667.3, 731.5, 674.1, 728.5, 672.6, 714.6, 669.6, 699.4, 675.1, 699.1, +675.1, 699.1, 680.6, 698.7, 684.3, 705.4, 679.9, 707.8, 679.2, 716.9, +679.2, 717.0, 679.2, 717.0, 679.2, 717.0, 677.7, 735.3, 685.8, 742.0, +676.3, 753.6, 610.9, 789.2, 610.9, 794.7, 610.9, 794.7, 610.8, 800.2, +578.6, 798.2, 577.5, 812.9, 544.4, 826.1, 542.7, 819.2, 538.9, 813.6, +540.9, 812.3, 553.8, 796.7, 553.8, 796.7, 566.7, 781.1, 585.5, 775.0, +590.8, 780.5, 610.9, 789.2, 566.7, 781.1, 568.6, 778.9, 568.1, 777.6, +570.5, 776.6, 573.6, 774.5, 574.2, 774.0, 575.5, 770.6, 580.5, 767.1, +579.5, 765.7, 583.5, 760.9, 593.4, 768.6, 605.2, 773.4, 608.7, 769.4, +609.9, 774.1, 611.9, 774.5, 611.0, 778.7, 611.0, 784.0, 611.0, 784.0, +610.9, 789.2, 590.8, 780.5, 585.5, 775.0, 566.7, 781.1, 614.4, 737.3, +615.2, 732.7, 614.4, 728.3, 616.0, 728.0, 623.2, 721.6, 623.2, 721.6, +630.4, 715.1, 635.8, 724.6, 638.9, 722.8, 647.5, 730.5, 654.3, 736.0, +653.9, 736.5, 660.3, 742.5, 638.8, 746.9, 635.9, 744.3, 614.4, 737.3, +547.6, 495.4, 547.6, 497.4, 547.6, 497.4, 547.5, 499.4, 539.3, 505.1, +539.5, 505.4, 531.4, 511.3, 537.2, 509.1, 536.2, 506.6, 541.1, 501.8, +544.4, 498.6, 543.7, 496.9, 547.6, 495.4, 446.0, 761.1, 439.5, 772.2, +430.7, 774.5, 433.0, 783.4, 430.1, 779.9, 428.0, 780.3, 427.3, 776.5, +424.8, 770.6, 423.1, 771.4, 418.9, 766.3, 419.8, 761.8, 418.5, 760.1, +415.4, 756.3, 416.7, 749.7, 416.7, 749.7, 418.1, 743.1, 425.6, 720.3, +423.6, 719.7, 429.2, 696.3, 429.0, 698.0, 432.6, 698.4, 436.1, 700.5, +443.7, 730.1, 447.1, 731.0, 446.0, 761.1, 436.1, 700.5, 446.3, 706.8, +453.4, 715.7, 456.6, 713.1, 455.4, 730.0, 450.4, 731.2, 454.2, 746.8, +450.1, 753.9, 450.1, 753.9, 446.0, 761.1, 447.1, 731.0, 443.7, 730.1, +436.1, 700.5, 278.2, 646.7, 287.9, 636.3, 292.4, 638.3, 297.7, 626.0, +296.9, 623.2, 301.6, 621.9, 305.5, 617.8, 306.8, 623.1, 310.2, 622.3, +314.9, 626.8, 306.5, 633.0, 310.6, 638.5, 306.4, 650.2, 296.2, 655.7, +280.3, 652.7, 278.2, 646.7, 306.4, 650.2, 303.8, 657.3, 306.3, 660.7, +301.1, 664.5, 292.3, 675.0, 292.3, 675.0, 283.5, 685.5, 283.1, 681.8, +271.8, 679.0, 261.0, 680.4, 260.8, 672.8, 260.8, 672.8, 260.5, 665.3, +270.6, 657.7, 269.3, 656.0, 278.2, 646.7, 280.3, 652.7, 296.2, 655.7, +306.4, 650.2, 292.8, 485.6, 301.1, 504.9, 301.1, 504.9, 309.5, 524.1, +287.9, 535.6, 276.9, 540.3, 273.8, 561.0, 268.3, 566.7, 268.3, 566.7, +262.7, 572.5, 261.5, 573.7, 260.9, 573.4, 260.4, 574.9, 275.9, 530.0, +262.6, 516.8, 292.8, 485.6, 260.4, 574.9, 259.7, 576.6, 257.4, 577.3, +257.6, 577.7, 257.5, 573.8, 257.5, 573.8, 257.4, 569.9, 265.0, 528.4, +263.9, 528.2, 270.4, 486.5, 274.7, 473.3, 274.2, 473.1, 277.5, 459.5, +278.2, 460.2, 279.1, 460.5, 279.0, 460.9, 278.9, 461.2, 279.3, 461.5, +279.8, 461.8, 282.5, 463.1, 282.0, 463.9, 284.3, 466.1, 284.9, 476.1, +288.5, 475.9, 292.8, 485.6, 262.6, 516.8, 275.9, 530.0, 260.4, 574.9, +298.6, 576.2, 296.3, 581.2, 297.6, 585.1, 294.0, 586.2, 282.3, 599.0, +273.7, 609.2, 278.9, 619.5, 274.8, 624.9, 276.0, 625.8, 273.1, 632.1, +273.2, 635.0, 262.0, 633.2, 259.6, 638.3, 259.6, 636.7, 259.7, 636.7, +259.5, 635.1, 272.9, 617.1, 258.6, 606.4, 257.6, 577.7, 257.4, 577.3, +259.7, 576.6, 260.4, 574.9, 260.9, 573.4, 261.5, 573.7, 262.7, 572.5, +280.7, 573.1, 282.9, 569.3, 298.6, 576.2, 262.7, 572.5, 268.3, 566.7, +268.3, 566.7, 273.8, 561.0, 273.8, 561.4, 292.8, 571.7, 303.2, 566.1, +300.9, 571.2, 300.9, 571.2, 298.6, 576.2, 282.9, 569.3, 280.7, 573.1, +262.7, 572.5, 337.7, 440.2, 347.8, 446.7, 346.9, 448.6, 357.8, 453.2, +357.2, 457.1, 357.2, 457.1, 356.6, 461.0, 347.1, 462.7, 342.5, 471.0, +340.7, 482.8, 332.3, 484.2, 332.3, 484.2, 323.8, 485.7, 322.2, 463.5, +322.7, 454.5, 337.7, 440.2, 323.8, 485.7, 322.6, 485.9, 322.1, 486.6, +321.3, 486.1, 314.9, 482.3, 314.9, 482.3, 308.5, 478.6, 316.2, 449.0, +300.8, 444.9, 293.0, 411.3, 314.6, 426.8, 315.4, 425.7, 337.7, 440.2, +322.7, 454.5, 322.2, 463.5, 323.8, 485.7, 785.9, 267.8, 785.5, 278.9, +785.8, 278.9, 785.1, 289.9, 784.5, 302.9, 783.8, 302.9, 784.0, 315.9, +778.8, 309.5, 775.2, 302.3, 773.6, 303.1, 773.7, 303.0, 773.5, 302.8, +773.3, 302.8, 771.1, 303.5, 770.3, 294.4, 764.8, 292.2, 766.2, 271.9, +747.4, 270.5, 729.9, 248.9, 734.7, 250.8, 735.8, 247.9, 741.7, 247.0, +764.7, 254.7, 769.5, 251.6, 785.9, 267.8, 741.7, 247.0, 756.5, 244.5, +765.5, 235.9, 771.3, 242.0, 776.7, 243.5, 778.4, 241.6, 782.1, 244.9, +784.3, 246.3, 784.3, 246.3, 786.5, 247.7, 786.0, 257.7, 786.2, 257.8, +785.9, 267.8, 769.5, 251.6, 764.7, 254.7, 741.7, 247.0, 630.0, 617.0, +628.7, 597.0, 628.7, 597.0, 627.3, 576.9, 629.8, 570.0, 629.6, 569.9, +631.9, 562.9, 633.7, 589.8, 638.1, 592.3, 630.0, 617.0, 673.4, 583.9, +681.1, 606.5, 673.2, 615.5, 688.7, 629.0, 686.2, 637.8, 686.2, 637.8, +683.7, 646.7, 673.6, 617.0, 665.6, 611.6, 673.4, 583.9, 678.1, 758.1, +677.2, 755.8, 677.2, 755.8, 676.3, 753.6, 685.8, 742.0, 677.7, 735.3, +679.2, 717.0, 670.4, 723.5, 678.7, 734.6, 678.3, 752.1, 678.2, 755.1, +679.6, 757.0, 678.1, 758.1, 614.2, 738.3, 614.3, 737.8, 614.3, 737.8, +614.4, 737.3, 635.9, 744.3, 638.8, 746.9, 660.3, 742.5, 662.5, 744.5, +662.4, 744.7, 664.7, 746.6, 667.7, 750.4, 667.7, 750.4, 670.7, 754.2, +659.6, 770.2, 661.4, 771.4, 652.0, 788.7, 627.9, 781.9, 632.9, 763.7, +614.2, 738.3, 652.0, 788.7, 644.6, 802.4, 641.6, 801.5, 637.1, 816.1, +624.2, 786.6, 629.3, 783.0, 611.2, 757.1, 611.2, 757.0, 611.2, 757.0, +611.1, 756.9, 613.5, 756.7, 612.7, 747.6, 614.2, 738.3, 632.9, 763.7, +627.9, 781.9, 652.0, 788.7, 541.1, 501.8, 536.2, 506.6, 537.2, 509.1, +531.4, 511.3, 521.8, 518.4, 518.9, 516.3, 512.1, 525.5, 508.3, 514.0, +508.3, 514.0, 504.5, 502.6, 509.2, 496.3, 517.1, 502.3, 529.8, 502.0, +535.4, 501.9, 540.9, 501.0, 541.1, 501.8, 235.2, 769.2, 234.5, 762.4, +236.8, 761.2, 233.8, 755.6, 235.0, 751.5, 233.8, 748.3, 236.2, 747.4, +237.6, 746.0, 237.6, 746.0, 239.0, 744.7, 238.4, 757.0, 240.3, 758.5, +235.2, 769.2, 238.0, 796.2, 237.4, 790.6, 237.4, 790.6, 236.8, 784.9, +241.5, 774.8, 244.1, 776.0, 251.5, 767.1, 255.0, 762.8, 255.0, 762.8, +258.5, 758.5, 296.1, 712.6, 296.1, 712.7, 333.7, 666.8, 334.2, 666.2, +334.6, 665.6, 334.6, 665.6, 334.6, 665.6, 334.2, 666.2, 333.7, 666.8, +306.0, 704.2, 306.0, 704.2, 278.3, 741.7, 270.2, 752.7, 270.2, 752.7, +262.0, 763.8, 250.0, 780.0, 253.0, 783.6, 238.0, 796.2, 660.5, 548.2, +660.2, 549.1, 661.6, 549.4, 662.2, 550.8, 665.4, 554.2, 663.8, 555.6, +665.5, 560.5, 664.0, 575.9, 661.9, 575.7, 658.3, 591.0, 652.1, 617.1, +652.1, 617.1, 646.0, 643.2, 642.8, 656.7, 646.9, 659.5, 639.6, 670.2, +636.4, 666.3, 632.8, 666.0, 633.1, 662.4, 632.6, 653.6, 632.5, 653.6, +631.9, 644.9, 643.7, 595.9, 645.0, 596.2, 660.5, 548.2, 631.9, 644.9, +631.0, 631.0, 631.0, 631.0, 630.0, 617.0, 638.1, 592.3, 633.7, 589.8, +631.9, 562.9, 635.4, 552.2, 632.2, 549.5, 639.0, 541.4, 640.7, 537.4, +643.4, 536.7, 642.5, 533.4, 649.4, 537.5, 656.1, 537.2, 656.3, 541.6, +659.1, 543.9, 661.1, 545.5, 660.5, 548.2, 645.0, 596.2, 643.7, 595.9, +631.9, 644.9, 655.4, 689.2, 647.5, 679.7, 647.5, 679.7, 639.6, 670.2, +646.9, 659.5, 642.8, 656.7, 646.0, 643.2, 659.2, 659.2, 660.3, 668.5, +655.4, 689.2, 679.2, 716.9, 679.9, 707.8, 684.3, 705.4, 680.6, 698.7, +692.3, 698.0, 692.5, 699.2, 703.9, 697.2, 710.1, 708.1, 710.1, 708.1, +716.3, 718.9, 705.5, 727.6, 697.8, 717.9, 679.2, 716.9, 679.2, 717.0, +679.2, 717.0, 679.2, 717.0, 679.2, 717.0, 679.2, 717.0, 679.2, 716.9, +679.2, 717.0, 679.2, 717.0, 679.2, 717.0, 679.2, 717.0, 679.2, 717.0, +679.2, 716.9, 541.9, 459.0, 544.5, 467.9, 544.5, 467.9, 547.0, 476.8, +546.9, 481.5, 546.7, 481.7, 547.9, 486.2, 547.8, 490.8, 547.8, 490.8, +547.6, 495.4, 543.7, 496.9, 544.4, 498.6, 541.1, 501.8, 540.9, 501.0, +535.4, 501.9, 529.8, 502.0, 530.2, 480.4, 530.0, 476.5, 541.9, 459.0, +529.8, 502.0, 517.1, 502.3, 509.2, 496.3, 504.5, 502.6, 501.4, 493.6, +495.6, 487.0, 498.4, 484.5, 499.7, 482.2, 499.7, 482.2, 501.0, 479.8, +499.2, 474.1, 511.1, 470.5, 521.2, 461.3, 520.4, 458.7, 531.8, 457.4, +539.5, 450.4, 540.7, 454.7, 540.7, 454.7, 541.9, 459.0, 530.0, 476.5, +530.2, 480.4, 529.8, 502.0, 251.5, 767.1, 244.1, 776.0, 241.5, 774.8, +236.8, 784.9, 236.2, 779.1, 236.2, 779.1, 235.6, 773.3, 240.3, 767.5, +251.7, 769.3, 251.5, 767.1, 658.3, 591.0, 661.9, 575.7, 664.0, 575.9, +665.5, 560.5, 669.5, 572.2, 669.5, 572.2, 673.4, 583.9, 665.6, 611.6, +673.6, 617.0, 683.7, 646.7, 680.8, 656.7, 683.9, 659.1, 678.0, 666.8, +674.1, 673.6, 674.1, 673.6, 670.2, 680.4, 659.0, 637.1, 660.1, 635.9, +658.3, 591.0, 670.2, 680.4, 665.7, 688.3, 664.7, 687.9, 661.2, 696.3, +658.3, 692.8, 658.3, 692.8, 655.4, 689.2, 660.3, 668.5, 659.2, 659.2, +646.0, 643.2, 652.1, 617.1, 652.1, 617.1, 658.3, 591.0, 660.1, 635.9, +659.0, 637.1, 670.2, 680.4, 713.4, 763.0, 709.0, 767.6, 709.6, 768.3, +704.6, 772.1, 704.0, 772.6, 704.1, 772.7, 703.6, 773.3, 698.9, 778.5, +698.7, 778.3, 693.8, 783.4, 694.9, 781.9, 689.7, 778.1, 685.5, 772.8, +680.8, 769.9, 682.5, 767.1, 679.5, 761.5, 678.6, 759.8, 678.8, 759.8, +678.1, 758.1, 679.6, 757.0, 678.2, 755.1, 678.3, 752.1, 696.3, 754.7, +699.7, 752.5, 713.4, 763.0, 284.9, 700.5, 315.7, 670.8, 315.7, 670.8, +346.4, 641.2, 344.6, 644.3, 346.8, 645.6, 347.1, 650.0, 347.1, 650.3, +347.0, 650.3, 346.9, 650.6, 345.3, 652.8, 345.2, 652.7, 343.5, 654.8, +339.0, 660.2, 339.0, 660.2, 334.6, 665.6, 296.6, 712.0, 305.8, 725.3, +258.5, 758.5, 281.0, 742.7, 266.3, 725.4, 284.9, 700.5, 258.5, 758.5, +255.0, 762.8, 255.0, 762.8, 251.5, 767.1, 251.7, 769.3, 240.3, 767.5, +235.6, 773.3, 235.4, 771.3, 235.4, 771.3, 235.2, 769.2, 240.3, 758.5, +238.4, 757.0, 239.0, 744.7, 262.0, 722.6, 262.0, 722.6, 284.9, 700.5, +266.3, 725.4, 281.0, 742.7, 258.5, 758.5, 262.0, 763.8, 270.2, 752.7, +270.2, 752.7, 278.3, 741.7, 282.8, 773.8, 273.3, 775.1, 268.2, 808.5, +264.9, 830.4, 264.9, 830.4, 261.6, 852.3, 261.6, 852.8, 261.7, 852.9, +261.5, 853.3, 260.7, 854.9, 259.4, 855.5, 259.8, 856.5, 255.4, 849.5, +255.4, 849.5, 251.0, 842.4, 251.9, 803.0, 251.7, 801.8, 262.0, 763.8, +251.0, 842.4, 247.3, 836.7, 244.0, 836.8, 243.7, 830.9, 241.5, 818.6, +234.4, 814.0, 239.4, 806.4, 240.0, 804.4, 239.0, 804.0, 238.5, 801.7, +238.0, 799.0, 238.3, 799.0, 238.0, 796.2, 253.0, 783.6, 250.0, 780.0, +262.0, 763.8, 251.7, 801.8, 251.9, 803.0, 251.0, 842.4, 719.8, 756.4, +716.6, 759.7, 716.6, 759.7, 713.4, 763.0, 699.7, 752.5, 696.3, 754.7, +678.3, 752.1, 678.7, 734.6, 670.4, 723.5, 679.2, 717.0, 679.2, 717.0, +679.2, 717.0, 679.2, 716.9, 697.8, 717.9, 705.5, 727.6, 716.3, 718.9, +717.3, 720.6, 717.3, 720.6, 718.2, 722.2, 719.8, 739.2, 721.7, 739.6, +719.8, 756.4, 718.2, 722.2, 724.7, 733.4, 721.4, 738.3, 731.1, 744.7, +725.4, 750.5, 725.4, 750.5, 719.8, 756.4, 721.7, 739.6, 719.8, 739.2, +718.2, 722.2, 333.7, 666.8, 334.2, 666.2, 334.6, 665.6, 334.6, 665.6, +339.0, 660.2, 339.0, 660.2, 343.5, 654.8, 342.0, 665.7, 338.4, 665.2, +333.3, 675.6, 324.0, 694.6, 315.7, 694.2, 314.7, 713.7, 315.9, 689.8, +324.0, 690.2, 333.7, 666.8, 314.7, 713.7, 292.5, 761.6, 305.7, 779.6, +268.2, 808.5, 273.3, 775.1, 282.8, 773.8, 278.3, 741.7, 306.0, 704.2, +306.0, 704.2, 333.7, 666.8, 324.0, 690.2, 315.9, 689.8, 314.7, 713.7, +333.3, 675.6, 338.4, 665.2, 342.0, 665.7, 343.5, 654.8, 345.2, 652.7, +345.3, 652.8, 346.9, 650.6, 335.4, 692.2, 334.6, 692.0, 324.0, 733.9, +298.0, 795.3, 292.6, 793.0, 261.6, 852.3, 261.6, 852.8, 261.7, 852.9, +261.5, 853.3, 261.7, 852.9, 261.6, 852.8, 261.6, 852.3, 297.4, 763.9, +296.8, 763.7, 333.3, 675.6, 261.6, 852.3, 264.9, 830.4, 264.9, 830.4, +268.2, 808.5, 305.7, 779.6, 292.5, 761.6, 314.7, 713.7, 315.7, 694.2, +324.0, 694.6, 333.3, 675.6, 296.8, 763.7, 297.4, 763.9, 261.6, 852.3 +}; diff --git a/perf/micro/paint-with-alpha.c b/perf/micro/paint-with-alpha.c new file mode 100644 index 000000000..047e35c43 --- /dev/null +++ b/perf/micro/paint-with-alpha.c @@ -0,0 +1,59 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_paint_with_alpha (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) + cairo_paint_with_alpha (cr, 0.5); + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static double +count_paint_with_alpha (cairo_t *cr, int width, int height) +{ + return width * height / 1e6; /* Mpix/s */ +} + +cairo_bool_t +paint_with_alpha_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "paint-with-alpha", NULL); +} + +void +paint_with_alpha (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "paint-with-alpha", + do_paint_with_alpha, + count_paint_with_alpha); +} diff --git a/perf/micro/paint.c b/perf/micro/paint.c new file mode 100644 index 000000000..2a59a45e0 --- /dev/null +++ b/perf/micro/paint.c @@ -0,0 +1,57 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_paint (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) + cairo_paint (cr); + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static double +count_paint (cairo_t *cr, int width, int height) +{ + return width * height / 1e6; /* Mpix/s */ +} + +cairo_bool_t +paint_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "paint", NULL); +} + +void +paint (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "paint", do_paint, count_paint); +} diff --git a/perf/micro/pattern_create_radial.c b/perf/micro/pattern_create_radial.c new file mode 100644 index 000000000..3915efb9a --- /dev/null +++ b/perf/micro/pattern_create_radial.c @@ -0,0 +1,106 @@ +/* + * Copyright © 2006 Dan Amelang + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Dan Amelang + * + * This test was originally created to test _cairo_fixed_from_double. + * cairo_pattern_create_radial was selected as the entry point into + * cairo as it makes several calls to _cairo_fixed_from_double and + * presents a somewhat realistic use-case (although the RADIALS_COUNT + * isn't very realistic). + */ +#include "cairo-perf.h" +#include + +#define RADIALS_COUNT (10000) + +static struct +{ + double cx0; + double cy0; + double radius0; + double cx1; + double cy1; + double radius1; +} radials[RADIALS_COUNT]; + +static double +generate_double_in_range (double min, double max) +{ + double d; + + d = rand () / (double) RAND_MAX; + d *= max - min; + d += min; + + return d; +} + +static cairo_time_t +do_pattern_create_radial (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) { + cairo_pattern_t *pattern; + int i; + + for (i = 0; i < RADIALS_COUNT; i++) { + pattern = + cairo_pattern_create_radial (radials[i].cx0, radials[i].cy0, + radials[i].radius0, + radials[i].cx1, radials[i].cy1, + radials[i].radius1); + cairo_pattern_destroy (pattern); + } + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +pattern_create_radial_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "pattern-create-radial", NULL); +} + +void +pattern_create_radial (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + int i; + + srand (time (0)); + for (i = 0; i < RADIALS_COUNT; i++) + { + radials[i].cx0 = generate_double_in_range (-50000.0, 50000.0); + radials[i].cy0 = generate_double_in_range (-50000.0, 50000.0); + radials[i].radius0 = generate_double_in_range (0.0, 1000.0); + radials[i].cx1 = generate_double_in_range (-50000.0, 50000.0); + radials[i].cy1 = generate_double_in_range (-50000.0, 50000.0); + radials[i].radius1 = generate_double_in_range (0.0, 1000.0); + } + + cairo_perf_run (perf, "pattern-create-radial", + do_pattern_create_radial, NULL); +} diff --git a/perf/micro/pixel.c b/perf/micro/pixel.c new file mode 100644 index 000000000..b600b5170 --- /dev/null +++ b/perf/micro/pixel.c @@ -0,0 +1,237 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Measure the overhead in setting a single pixel */ + +#include "cairo-perf.h" + +#include + +static cairo_time_t +pixel_direct (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *surface, *image; + uint32_t *data; + int stride, bpp; + + surface = cairo_get_target (cr); + image = cairo_surface_map_to_image (surface, NULL); + data = (uint32_t *) cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image) / sizeof (uint32_t); + + switch (cairo_image_surface_get_format (image)) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: bpp = 0; break; + case CAIRO_FORMAT_A8: bpp = 8; break; + case CAIRO_FORMAT_RGB16_565: bpp = 16; break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: bpp = 32; break; + } + + cairo_perf_timer_start (); + + while (loops--) + pixman_fill (data, stride, bpp, 0, 0, 1, 1, -1); + + cairo_perf_timer_stop (); + + cairo_surface_unmap_image (surface, image); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_paint (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) + cairo_paint (cr); + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_mask (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *mask; + cairo_t *cr2; + + mask = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, + 1, 1); + cr2 = cairo_create (mask); + cairo_set_source_rgb (cr2, 1,1,1); + cairo_paint (cr2); + cairo_destroy (cr2); + + cairo_perf_timer_start (); + + while (loops--) + cairo_mask_surface (cr, mask, 0, 0); + + cairo_perf_timer_stop (); + + cairo_surface_destroy (mask); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_rectangle (cairo_t *cr, int width, int height, int loops) +{ + cairo_new_path (cr); + cairo_rectangle (cr, 0, 0, 1, 1); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_subrectangle (cairo_t *cr, int width, int height, int loops) +{ + cairo_new_path (cr); + cairo_rectangle (cr, 0.1, 0.1, .8, .8); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_triangle (cairo_t *cr, int width, int height, int loops) +{ + cairo_new_path (cr); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 1, 1); + cairo_line_to (cr, 0, 1); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_circle (cairo_t *cr, int width, int height, int loops) +{ + cairo_new_path (cr); + cairo_arc (cr, 0.5, 0.5, 0.5, 0, 2 * M_PI); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +pixel_stroke (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_line_width (cr, 1.); + cairo_new_path (cr); + cairo_move_to (cr, 0, 0.5); + cairo_line_to (cr, 1, 0.5); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +pixel_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "pixel", NULL); +} + +void +pixel (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + + cairo_perf_run (perf, "pixel-direct", pixel_direct, NULL); + cairo_perf_run (perf, "pixel-paint", pixel_paint, NULL); + cairo_perf_run (perf, "pixel-mask", pixel_mask, NULL); + cairo_perf_run (perf, "pixel-rectangle", pixel_rectangle, NULL); + cairo_perf_run (perf, "pixel-subrectangle", pixel_subrectangle, NULL); + cairo_perf_run (perf, "pixel-triangle", pixel_triangle, NULL); + cairo_perf_run (perf, "pixel-circle", pixel_circle, NULL); + cairo_perf_run (perf, "pixel-stroke", pixel_stroke, NULL); +} + +cairo_bool_t +a1_pixel_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "a1-pixel", NULL); +} + +void +a1_pixel (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_perf_run (perf, "a1-pixel-direct", pixel_direct, NULL); + cairo_perf_run (perf, "a1-pixel-paint", pixel_paint, NULL); + cairo_perf_run (perf, "a1-pixel-mask", pixel_mask, NULL); + cairo_perf_run (perf, "a1-pixel-rectangle", pixel_rectangle, NULL); + cairo_perf_run (perf, "a1-pixel-subrectangle", pixel_subrectangle, NULL); + cairo_perf_run (perf, "a1-pixel-triangle", pixel_triangle, NULL); + cairo_perf_run (perf, "a1-pixel-circle", pixel_circle, NULL); + cairo_perf_run (perf, "a1-pixel-stroke", pixel_stroke, NULL); +} diff --git a/perf/micro/pythagoras-tree.c b/perf/micro/pythagoras-tree.c new file mode 100644 index 000000000..9d3ca1155 --- /dev/null +++ b/perf/micro/pythagoras-tree.c @@ -0,0 +1,95 @@ +/* + * Copyright © 2007 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" +#define _USE_MATH_DEFINES /* for M_SQRT2 on win32 */ +#include + +static void +add_rectangle (cairo_t *cr, double size) +{ + double x, y; + + if (size < 1) + return; + + cairo_get_current_point (cr, &x, &y); + + cairo_rel_move_to (cr, -size/2., -size/2.); + cairo_rel_line_to (cr, size, 0); + cairo_rel_line_to (cr, 0, size); + cairo_rel_line_to (cr, -size, 0); + cairo_close_path (cr); + + cairo_save (cr); + cairo_translate (cr, -size/2., size); + cairo_move_to (cr, x, y); + cairo_rotate (cr, M_PI/4); + add_rectangle (cr, size / M_SQRT2); + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, size/2., size); + cairo_move_to (cr, x, y); + cairo_rotate (cr, -M_PI/4); + add_rectangle (cr, size / M_SQRT2); + cairo_restore (cr); +} + +static cairo_time_t +do_pythagoras_tree (cairo_t *cr, int width, int height, int loops) +{ + double size = 128; + + cairo_perf_timer_start (); + + while (loops--) { + cairo_save (cr); + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + cairo_move_to (cr, width/2, size/2); + add_rectangle (cr, size); + cairo_set_source_rgb (cr, 0., 0., 0.); + cairo_fill (cr); + cairo_restore (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +pythagoras_tree_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "pythagoras-tree", NULL); +} + +void +pythagoras_tree (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "pythagoras-tree", do_pythagoras_tree, NULL); +} diff --git a/perf/micro/rectangles.c b/perf/micro/rectangles.c new file mode 100644 index 000000000..9228a4efa --- /dev/null +++ b/perf/micro/rectangles.c @@ -0,0 +1,121 @@ +/* + * Copyright © 2006 Dan Amelang + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Dan Amelang + */ +#include "cairo-perf.h" + +#if 0 +#define MODE cairo_perf_run +#else +#define MODE cairo_perf_cover_sources_and_operators +#endif + +#define RECTANGLE_COUNT (1000) + +static struct { + double x; + double y; + double width; + double height; +} rects[RECTANGLE_COUNT]; + +static cairo_time_t +do_rectangles (cairo_t *cr, int width, int height, int loops) +{ + int i; + + cairo_perf_timer_start (); + + while (loops--) { + for (i = 0; i < RECTANGLE_COUNT; i++) { + cairo_rectangle (cr, rects[i].x, rects[i].y, + rects[i].width, rects[i].height); + cairo_fill (cr); + } + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_rectangles_once (cairo_t *cr, int width, int height, int loops) +{ + int i; + + cairo_perf_timer_start (); + + while (loops--) { + for (i = 0; i < RECTANGLE_COUNT; i++) { + cairo_rectangle (cr, rects[i].x, rects[i].y, + rects[i].width, rects[i].height); + } + + cairo_fill (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_rectangle (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) { + cairo_rectangle (cr, 0, 0, width, height); + cairo_fill (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +rectangles_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "rectangles", NULL); +} + +void +rectangles (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + int i; + + srand (8478232); + for (i = 0; i < RECTANGLE_COUNT; i++) + { + rects[i].x = rand () % width; + rects[i].y = rand () % height; + rects[i].width = (rand () % (width / 10)) + 1; + rects[i].height = (rand () % (height / 10)) + 1; + } + + MODE (perf, "one-rectangle", do_rectangle, NULL); + MODE (perf, "rectangles", do_rectangles, NULL); + MODE (perf, "rectangles-once", do_rectangles_once, NULL); +} diff --git a/perf/micro/rounded-rectangles.c b/perf/micro/rounded-rectangles.c new file mode 100644 index 000000000..1e432dd1f --- /dev/null +++ b/perf/micro/rounded-rectangles.c @@ -0,0 +1,144 @@ +/* + * Copyright © 2005 Owen Taylor + * Copyright © 2007 Dan Amelang + * Copyright © 2007 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Chris Wilson + */ + +/* This perf case is derived from the bug report + * Gradient on 'rounded rectangle' MUCH slower than normal rectangle + * https://bugs.freedesktop.org/show_bug.cgi?id=4263. + */ + +#include "cairo-perf.h" + +#define RECTANGLE_COUNT (1000) + +#if 0 +#define MODE cairo_perf_run +#else +#define MODE cairo_perf_cover_sources_and_operators +#endif + +static struct +{ + double x; + double y; + double width; + double height; +} rects[RECTANGLE_COUNT]; + +static void +rounded_rectangle (cairo_t *cr, + double x, double y, double w, double h, + double radius) +{ + cairo_move_to (cr, x+radius, y); + cairo_arc (cr, x+w-radius, y+radius, radius, M_PI + M_PI / 2, M_PI * 2 ); + cairo_arc (cr, x+w-radius, y+h-radius, radius, 0, M_PI / 2 ); + cairo_arc (cr, x+radius, y+h-radius, radius, M_PI/2, M_PI ); + cairo_arc (cr, x+radius, y+radius, radius, M_PI, 270 * M_PI / 180); +} + +static cairo_time_t +do_rectangle (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) { + rounded_rectangle (cr, 0, 0, width, height, 3.0); + cairo_fill (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_rectangles (cairo_t *cr, int width, int height, int loops) +{ + int i; + + cairo_perf_timer_start (); + + while (loops--) { + for (i = 0; i < RECTANGLE_COUNT; i++) { + rounded_rectangle (cr, + rects[i].x, rects[i].y, + rects[i].width, rects[i].height, + 3.0); + cairo_fill (cr); + } + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_rectangles_once (cairo_t *cr, int width, int height, int loops) +{ + int i; + + cairo_perf_timer_start (); + + while (loops--) { + for (i = 0; i < RECTANGLE_COUNT; i++) { + rounded_rectangle (cr, + rects[i].x, rects[i].y, + rects[i].width, rects[i].height, + 3.0); + } + cairo_fill (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +rounded_rectangles_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "rounded-rectangles", NULL); +} + +void +rounded_rectangles (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + int i; + + srand (8478232); + for (i = 0; i < RECTANGLE_COUNT; i++) { + rects[i].x = rand () % width; + rects[i].y = rand () % height; + rects[i].width = (rand () % (width / 10)) + 1; + rects[i].height = (rand () % (height / 10)) + 1; + } + + MODE (perf, "one-rounded-rectangle", do_rectangle, NULL); + MODE (perf, "rounded-rectangles", do_rectangles, NULL); + MODE (perf, "rounded-rectangles-once", do_rectangles_once, NULL); +} diff --git a/perf/micro/sierpinski.c b/perf/micro/sierpinski.c new file mode 100644 index 000000000..c6f5fadc2 --- /dev/null +++ b/perf/micro/sierpinski.c @@ -0,0 +1,94 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static const double m_1_sqrt_3 = 0.577359269; + +static void +T (cairo_t *cr, int size) +{ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, size, 0); + cairo_line_to (cr, size/2, size*m_1_sqrt_3); + + size /= 2; + if (size >= 4) { + T (cr, size); + cairo_save (cr); { + cairo_translate (cr, size, 0); + T (cr, size); + } cairo_restore (cr); + cairo_save (cr); { + cairo_translate (cr, size/2, size*m_1_sqrt_3); + T (cr, size); + } cairo_restore (cr); + } +} + +static cairo_time_t +draw (cairo_t *cr, int width, int height, int loops) +{ + int t_height = height/2; + int t_width = t_height / m_1_sqrt_3; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 1.); + + cairo_perf_timer_start (); + + while (loops--) { + cairo_save (cr); + T (cr, t_width); + + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + T (cr, t_width); + + cairo_stroke (cr); + cairo_restore (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +sierpinski_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "sierpinski", NULL); +} + +void +sierpinski (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "sierpinski", draw, NULL); +} diff --git a/perf/micro/spiral.c b/perf/micro/spiral.c new file mode 100644 index 000000000..5db62b0d7 --- /dev/null +++ b/perf/micro/spiral.c @@ -0,0 +1,352 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2008 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "cairo-perf.h" +#include + +#define MAX_SEGMENTS 2560 + +typedef enum { + PIXALIGN, /* pixel aligned path */ + NONALIGN /* unaligned path. */ +} align_t; + +typedef enum { + RECTCLOSE, /* keeps the path rectilinear */ + DIAGCLOSE /* forces a diagonal */ +} close_t; + +static cairo_time_t +draw_spiral (cairo_t *cr, + cairo_fill_rule_t fill_rule, + align_t align, + close_t close, + int width, int height, int loops) +{ + int i; + int n=0; + double x[MAX_SEGMENTS]; + double y[MAX_SEGMENTS]; + int step = 3; + int side = width < height ? width : height; + + assert(5*(side/step/2+1)+2 < MAX_SEGMENTS); + +#define L(x_,y_) (x[n] = (x_), y[n] = (y_), n++) +#define M(x_,y_) L(x_,y_) +#define v(t) L(x[n-1], y[n-1] + (t)) +#define h(t) L(x[n-1] + (t), y[n-1]) + + switch (align) { + case PIXALIGN: M(0,0); break; + case NONALIGN: M(0.1415926, 0.7182818); break; + } + + while (side >= step && side >= 0) { + v(side); + h(side); + v(-side); + h(-side+step); + v(step); + side -= 2*step; + } + + switch (close) { + case RECTCLOSE: L(x[n-1],y[0]); break; + case DIAGCLOSE: L(x[0],y[0]); break; + } + + assert(n < MAX_SEGMENTS); + + cairo_save (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, fill_rule); + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_new_path (cr); + cairo_move_to (cr, x[0], y[0]); + for (i = 1; i < n; i++) { + cairo_line_to (cr, x[i], y[i]); + } + cairo_close_path (cr); + + cairo_perf_timer_start (); + while (loops--) + cairo_fill_preserve (cr); + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +draw_spiral_box (cairo_t *cr, + cairo_fill_rule_t fill_rule, + align_t align, + int width, int height, int loops) +{ + const int step = 3; + int side = (width < height ? width : height) - 2; + + cairo_save (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_fill_rule (cr, fill_rule); + cairo_translate (cr, 1, 1); + if (align == NONALIGN) + cairo_translate (cr, 0.1415926, 0.7182818); + + cairo_new_path (cr); + while (side >= step) { + cairo_rectangle (cr, 0, 0, side, side); + cairo_translate (cr, step, step); + side -= 2*step; + } + + cairo_perf_timer_start (); + while (loops--) + cairo_fill_preserve (cr); + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +draw_spiral_stroke (cairo_t *cr, + align_t align, + int width, int height, int loops) +{ + const int step = 3; + int side = width < height ? width : height; + + cairo_save (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_translate (cr, 1, 1); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 4.); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + + cairo_new_path (cr); + switch (align) { + case PIXALIGN: cairo_move_to (cr, 0,0); break; + case NONALIGN: cairo_move_to (cr, 0.1415926, 0.7182818); break; + } + while (side >= step) { + cairo_rel_line_to (cr, 0, side); + side -= step; + if (side <= 0) + break; + + cairo_rel_line_to (cr, side, 0); + side -= step; + if (side <= 0) + break; + + cairo_rel_line_to (cr, 0, -side); + side -= step; + if (side <= 0) + break; + + cairo_rel_line_to (cr, -side, 0); + side -= step; + if (side <= 0) + break; + } + + cairo_perf_timer_start (); + while (loops--) + cairo_stroke_preserve (cr); + cairo_perf_timer_stop (); + + cairo_restore (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +draw_spiral_eo_pa_re (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_EVEN_ODD, + PIXALIGN, + RECTCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_nz_pa_re (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_WINDING, + PIXALIGN, + RECTCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_eo_na_re (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_EVEN_ODD, + NONALIGN, + RECTCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_nz_na_re (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_WINDING, + NONALIGN, + RECTCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_eo_pa_di (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_EVEN_ODD, + PIXALIGN, + DIAGCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_nz_pa_di (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_WINDING, + PIXALIGN, + DIAGCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_eo_na_di (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_EVEN_ODD, + NONALIGN, + DIAGCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_nz_na_di (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral (cr, + CAIRO_FILL_RULE_WINDING, + NONALIGN, + DIAGCLOSE, + width, height, loops); +} + +static cairo_time_t +draw_spiral_nz_pa_box (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral_box (cr, + CAIRO_FILL_RULE_WINDING, PIXALIGN, + width, height, loops); +} + +static cairo_time_t +draw_spiral_nz_na_box (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral_box (cr, + CAIRO_FILL_RULE_WINDING, NONALIGN, + width, height, loops); +} + + +static cairo_time_t +draw_spiral_eo_pa_box (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral_box (cr, + CAIRO_FILL_RULE_EVEN_ODD, PIXALIGN, + width, height, loops); +} + +static cairo_time_t +draw_spiral_eo_na_box (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral_box (cr, + CAIRO_FILL_RULE_EVEN_ODD, NONALIGN, + width, height, loops); +} + +static cairo_time_t +draw_spiral_stroke_pa (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral_stroke (cr, + PIXALIGN, + width, height, loops); +} + +static cairo_time_t +draw_spiral_stroke_na (cairo_t *cr, int width, int height, int loops) +{ + return draw_spiral_stroke (cr, + NONALIGN, + width, height, loops); +} + +cairo_bool_t +spiral_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "spiral", NULL); +} + +void +spiral (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "spiral-box-nonalign-evenodd-fill", draw_spiral_eo_na_box, NULL); + cairo_perf_run (perf, "spiral-box-nonalign-nonzero-fill", draw_spiral_nz_na_box, NULL); + cairo_perf_run (perf, "spiral-box-pixalign-evenodd-fill", draw_spiral_eo_pa_box, NULL); + cairo_perf_run (perf, "spiral-box-pixalign-nonzero-fill", draw_spiral_nz_pa_box, NULL); + cairo_perf_run (perf, "spiral-diag-nonalign-evenodd-fill", draw_spiral_eo_na_di, NULL); + cairo_perf_run (perf, "spiral-diag-nonalign-nonzero-fill", draw_spiral_nz_na_di, NULL); + cairo_perf_run (perf, "spiral-diag-pixalign-evenodd-fill", draw_spiral_eo_pa_di, NULL); + cairo_perf_run (perf, "spiral-diag-pixalign-nonzero-fill", draw_spiral_nz_pa_di, NULL); + cairo_perf_run (perf, "spiral-rect-nonalign-evenodd-fill", draw_spiral_eo_na_re, NULL); + cairo_perf_run (perf, "spiral-rect-nonalign-nonzero-fill", draw_spiral_nz_na_re, NULL); + cairo_perf_run (perf, "spiral-rect-pixalign-evenodd-fill", draw_spiral_eo_pa_re, NULL); + cairo_perf_run (perf, "spiral-rect-pixalign-nonzero-fill", draw_spiral_nz_pa_re, NULL); + cairo_perf_run (perf, "spiral-nonalign-stroke", draw_spiral_stroke_na, NULL); + cairo_perf_run (perf, "spiral-pixalign-stroke", draw_spiral_stroke_pa, NULL); +} diff --git a/perf/micro/stroke.c b/perf/micro/stroke.c new file mode 100644 index 000000000..4b2954770 --- /dev/null +++ b/perf/micro/stroke.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_stroke (cairo_t *cr, int width, int height, int loops) +{ + cairo_arc (cr, + width/2.0, height/2.0, + width/3.0, + 0, 2 * M_PI); + cairo_close_path (cr); + + cairo_set_line_width (cr, width/5.0); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static void +rounded_rectangle (cairo_t *cr, + double x, double y, double w, double h, + double radius) +{ + cairo_move_to (cr, x+radius, y); + cairo_arc (cr, x+w-radius, y+radius, radius, M_PI + M_PI / 2, M_PI * 2 ); + cairo_arc (cr, x+w-radius, y+h-radius, radius, 0, M_PI / 2 ); + cairo_arc (cr, x+radius, y+h-radius, radius, M_PI/2, M_PI ); + cairo_arc (cr, x+radius, y+radius, radius, M_PI, 270 * M_PI / 180); +} + +static cairo_time_t +do_strokes (cairo_t *cr, int width, int height, int loops) +{ + /* a pair of overlapping rectangles */ + rounded_rectangle (cr, + 2, 2, width/2. + 10, height/2. + 10, + 10); + rounded_rectangle (cr, + width/2. - 10, height/2. - 10, + width/2. - 2, height/2. - 2, + 10); + + cairo_set_line_width (cr, 2.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +stroke_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "stroke", NULL); +} + +void +stroke (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "stroke", do_stroke, NULL); + cairo_perf_cover_sources_and_operators (perf, "strokes", do_strokes, NULL); +} diff --git a/perf/micro/subimage_copy.c b/perf/micro/subimage_copy.c new file mode 100644 index 000000000..e749c062f --- /dev/null +++ b/perf/micro/subimage_copy.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +/* This case exposes a performance bug found by Christopher "Monty" + * Montgomery in that copying a tiny portion of an image surface to an + * X surface causes the entire image surface to be copied to an + * intermediate surface. + * + * If the performance bug is fixed, then the time this test takes + * should be independent of the source and destination surface sizes. + */ + +static cairo_time_t +do_subimage_copy (cairo_t *cr, int width, int height, int loops) +{ + cairo_rectangle (cr, 2, 2, 4, 4); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +subimage_copy_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "subimage-copy", NULL); +} + +void +subimage_copy (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_surface_t *image; + cairo_t *cr2; + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cr2 = cairo_create (image); + cairo_set_source_rgb (cr2, 1, 0, 0); /* red */ + cairo_paint (cr2); + cairo_destroy (cr2); + + cairo_set_source_surface (cr, image, 0, 0); + cairo_surface_destroy (image); + + cairo_perf_run (perf, "subimage-copy", do_subimage_copy, NULL); +} diff --git a/perf/micro/tessellate.c b/perf/micro/tessellate.c new file mode 100644 index 000000000..b6277fe63 --- /dev/null +++ b/perf/micro/tessellate.c @@ -0,0 +1,181 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +typedef struct { + double x; + double y; +} point_t; + +point_t points[300] = { + {39.4383,84.0188}, {79.844,78.3099}, {19.7551,91.1647}, {76.823,33.5223}, {55.397,27.7775}, + {62.8871,47.7397}, {51.3401,36.4784}, {91.6195,95.223}, {71.7297,63.5712}, {60.6969,14.1603}, + {24.2887,1.63006}, {80.4177,13.7232}, {40.0944,15.6679}, {10.8809,12.979}, {21.8257,99.8925}, + {83.9112,51.2932}, {29.6032,61.264}, {52.4287,63.7552}, {97.2775,49.3583}, {77.1358,29.2517}, + {76.9914,52.6745}, {89.1529,40.0229}, {35.2458,28.3315}, {91.9026,80.7725}, {94.9327,6.97553}, + {8.60558,52.5995}, {66.3227,19.2214}, {34.8893,89.0233}, {2.0023,6.41713}, {6.30958,45.7702}, + {97.0634,23.828}, {85.092,90.2208}, {53.976,26.6666}, {76.0249,37.5207}, {66.7724,51.2535}, + {3.92803,53.1606}, {93.1835,43.7638}, {72.0952,93.081}, {73.8534,28.4293}, {35.4049,63.9979}, + {16.5974,68.7861}, {88.0075,44.0105}, {33.0337,82.9201}, {89.3372,22.8968}, {68.667,35.036}, + {58.864,95.6468}, {85.8676,65.7304}, {92.397,43.956}, {81.4767,39.8437}, {91.0972,68.4219}, + + {21.5825,48.2491}, {92.0128,95.0252}, {88.1062,14.766}, {43.1953,64.1081}, {28.1059,61.9596}, + {30.7458,78.6002}, {22.6107,44.7034}, {27.6235,18.7533}, {41.6501,55.6444}, {90.6804,16.9607}, + {12.6075,10.3171}, {76.0475,49.5444}, {93.5004,98.4752}, {38.3188,68.4445}, {36.8664,74.9771}, + {23.2262,29.416}, {24.4413,58.4489}, {73.2149,15.239}, {79.347,12.5475}, {74.5071,16.4102}, + {95.0104,7.45298}, {52.1563,5.25293}, {24.0062,17.6211}, {73.2654,79.7798}, {96.7405,65.6564}, + {75.9735,63.9458}, {13.4902,9.34805}, {7.82321,52.021}, {20.4655,6.99064}, {81.9677,46.142}, + {75.5581,57.3319}, {15.7807,5.19388}, {20.4329,99.9994}, {12.5468,88.9956}, {5.40576,99.7799}, + {7.23288,87.054}, {92.3069,0.416161}, {18.0372,59.3892}, {39.169,16.3131}, {81.9695,91.3027}, + {55.2485,35.9095}, {45.2576,57.943}, {9.96401,68.7387}, {75.7294,53.0808}, {99.2228,30.4295}, + {87.7614,57.6971}, {62.891,74.7809}, {74.7803,3.54209}, {92.5377,83.3239}, {83.1038,87.3271}, + + {74.3811,97.9434}, {98.3596,90.3366}, {49.7259,66.688}, {83.0012,16.3968}, {7.69947,88.8949}, + {24.8044,64.9707}, {22.9137,62.948}, {31.6867,70.062}, {23.1428,32.8777}, {63.3072,7.4161}, + {65.1132,22.3656}, {97.1466,51.0686}, {54.6107,28.0042}, {11.3281,71.9269}, {59.254,47.1483}, + {45.0918,94.4318}, {84.7684,33.6351}, {0.323146,43.4513}, {59.8481,34.4943}, {23.3892,83.3243}, + {48.295,67.5476}, {30.4956,48.1936}, {18.2556,71.2087}, {4.08643,62.1823}, {69.5984,41.3984}, + {63.764,67.3936}, {18.4622,34.7116}, {62.7158,60.9106}, {32.8374,73.0729}, {20.2213,74.0438}, + {68.4757,92.0914}, {25.7265,65.313}, {8.76436,53.2441}, {87.7384,26.0497}, {9.37402,68.6125}, + {36.1601,11.1276}, {59.3211,57.6691}, {28.8778,66.6557}, {28.8379,77.5767}, {18.9751,32.9642}, + {0.357857,98.4363}, {33.1479,82.7391}, {43.6497,18.8201}, {91.893,95.8637}, {69.9075,76.4871}, + {68.5786,12.1143}, {77.4273,38.3832}, {91.6273,94.3051}, {20.3548,86.1917}, {54.8042,79.3657}, + + {90.4932,29.7288}, {87.3979,90.9643}, {57.62,49.8144}, {27.3911,16.2757}, {49.2399,86.4579}, + {84.8942,46.3662}, {29.1053,49.5977}, {68.4178,18.0421}, {13.9058,72.755}, {49.2422,60.3109}, + {72.4252,83.8134}, {22.1966,17.8208}, {12.1259,49.8525}, {36.0443,13.8238}, {93.1895,32.4807}, + {62.2095,90.8485}, {81.8128,83.6828}, {33.4972,49.6074}, {65.8831,39.4327}, {25.8906,60.8883}, + {7.2545,15.123}, {64.7207,10.7848}, {28.827,36.3598}, {9.11486,33.1386}, {93.4495,42.7328}, + {26.5461,58.357}, {76.1778,65.8747}, {15.7272,48.7427}, {62.5665,88.3037}, {20.7844,51.7715}, + {42.6199,55.7561}, {39.4388,82.9939}, {32.6013,24.4327}, {63.8654,72.936}, {33.8243,98.4845}, + {13.6075,89.756}, {0.540855,41.0788}, {77.4386,78.3282}, {11.4668,29.3678}, {72.1006,86.5535}, + {44.9105,4.91625}, {70.7909,98.6467}, {47.3894,21.0883}, {9.39195,86.5181}, {38.2896,9.95593}, + {65.712,30.1763}, {13.1702,80.9095}, {5.34223,5.15083}, {78.0868,45.7716}, {44.256,69.2076}, + + {58.9637,11.9111}, {52.9899,57.8635}, {36.1917,59.5045}, {88.8723,30.4285}, {16.982,47.6585}, + {52.5747,60.9729}, {59.6196,61.8925}, {82.9808,23.3656}, {9.88374,7.00902}, {16.965,92.3728}, + {22.5491,48.1733}, {29.0829,82.6769}, {87.8278,35.7193}, {81.4909,34.4251}, {3.63274,65.9146}, + {77.8257,25.7469}, {83.6104,62.5964}, {22.1009,30.8157}, {61.2442,19.8021}, {67.4605,10.9733}, + {71.9462,78.2262}, {40.1188,20.0352}, {43.4009,31.5658}, {38.5748,23.0996}, {15.4724,53.2846}, + {1.45793,55.5398}, {38.2167,38.0215}, {73.7408,30.5408}, {64.9659,26.0445}, {91.9591,55.2316}, + {80.9785,68.5986}, {31.195,69.7848}, {0.600477,64.5889}, {84.391,53.296}, {64.2693,61.8447}, + {40.0709,51.8515}, {71.8867,36.2154}, {67.7812,80.1897}, {3.28927,15.2876}, {68.5722,6.35606}, + {61.8958,18.7616}, {56.7831,70.0301}, {0.570914,0.112548}, {26.157,30.5239}, {85.7555,65.5368}, + {34.1354,18.1161}, {87.9009,66.7341}, {31.323,65.3305}, {18.6265,88.5014}, {50.3461,15.7139}, + + {67.5654,82.8957}, {19.1112,90.417}, {70.6067,39.4521}, {54.7397,86.8924}, {93.2485,73.8959}, + {92.6576,23.3119}, {93.342,55.1443}, {55.2568,49.4407}, {79.9646,93.9129}, {59.4497,81.4139}, + {99.53,65.7201}, {32.4541,93.5852}, {58.9157,87.4309}, {75.9324,63.7771}, {79.491,77.5421}, + {60.4379,26.2785}, {16.6955,47.0564}, {86.5086,79.549}, {66.4414,87.3021}, {61.1981,41.2483}, + {64.5601,59.6899}, {14.8342,53.8557}, {3.29634,57.9022}, {51.8151,70.091}, {51.5049,83.2609}, + {48.981,11.2648}, {4.84997,51.0349}, {38.4658,81.4351}, {45.2122,63.7656}, {41.3078,14.3982}, + {40.6767,24.7033}, {71.7597,1.74566}, {81.2947,57.3721}, {44.6743,58.2682}, {99.5165,47.7361}, + {7.42604,5.87232}, {59.728,64.0766}, {21.9788,22.2602}, {92.3513,63.0243}, {46.2852,73.7939}, + {85.0586,43.8562}, {94.8911,95.2662}, {76.7014,89.9086}, {53.6742,33.3569}, {47.7551,21.9136}, + {46.6169,94.982}, {96.7277,88.4318}, {45.8039,18.3765}, {76.6448,78.0224}, {25.7585,90.4782} +}; + +static cairo_time_t +do_tessellate (cairo_t *cr, int num_points, int loops) +{ + int i; + + for (i=0; i < num_points; i++) + cairo_line_to (cr, points[i].x, points[i].y); + + cairo_perf_timer_start (); + + /* We'd like to measure just tessellation without + * rasterization. For now, we can do that with cairo_in_fill. But + * we'll have to be careful since cairo_in_fill might eventually + * be optimized to have an implementation that doesn't necessarily + * include tessellation. */ + while (loops--) + cairo_in_fill (cr, 50, 50); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +tessellate_16 (cairo_t *cr, int width, int height, int loops) +{ + return do_tessellate (cr, 16, loops); +} + +static cairo_time_t +tessellate_64 (cairo_t *cr, int width, int height, int loops) +{ + return do_tessellate (cr, 64, loops); +} + +static cairo_time_t +tessellate_256 (cairo_t *cr, int width, int height, int loops) +{ + return do_tessellate (cr, 256, loops); +} + +cairo_bool_t +tessellate_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "tessellate", NULL); +} + +void +tessellate (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "tessellate-16", tessellate_16, NULL); + cairo_perf_run (perf, "tessellate-64", tessellate_64, NULL); + cairo_perf_run (perf, "tessellate-256", tessellate_256, NULL); +} + +#if 0 +double +rand_within (double range) +{ + return range * (rand() / (RAND_MAX + 1.0)); +} + +int +main (void) +{ +#define SIZE 100 + int i; + + printf ("point_t points[] = {\n"); + + for (i=0; i < 1000; i++) { + printf (" {%g,%g},", rand_within (SIZE), rand_within (SIZE)); + if (i % 5 == 4) + printf ("\n"); + } + + printf ("};\n"); +} +#endif diff --git a/perf/micro/text.c b/perf/micro/text.c new file mode 100644 index 000000000..cdb319936 --- /dev/null +++ b/perf/micro/text.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_text (cairo_t *cr, int width, int height, int loops) +{ + const char text[] = "the jay, pig, fox, zebra and my wolves quack"; + int len = strlen (text); + double x, y; + int i = 0, j = 0; + + cairo_set_font_size (cr, 9); + + cairo_perf_timer_start (); + + while (loops--) { + do { + cairo_move_to (cr, 0, j++ * 10); + cairo_show_text (cr, text + i); + cairo_get_current_point (cr, &x, &y); + while (x < width && cairo_status (cr) == CAIRO_STATUS_SUCCESS) { + cairo_show_text (cr, text); + cairo_get_current_point (cr, &x, &y); + } + if (++i >= len) + i = 0; + } while (y < height && cairo_status (cr) == CAIRO_STATUS_SUCCESS); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +text_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "text", NULL); +} + +void +text (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_cover_sources_and_operators (perf, "text", do_text, NULL); +} diff --git a/perf/micro/tiger.c b/perf/micro/tiger.c new file mode 100644 index 000000000..9e7a9419a --- /dev/null +++ b/perf/micro/tiger.c @@ -0,0 +1,115 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "../../test/tiger.inc" + +static cairo_time_t +do_tiger (cairo_t *cr, int width, int height, int loops) +{ + unsigned int i; + + cairo_perf_timer_start (); + + while (loops--) { + cairo_identity_matrix (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 0.1, 0.2, 0.3, 1.0); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + + cairo_translate (cr, width/2, height/2); + cairo_scale (cr, .85 * width/500, .85 * height/500); + + for (i = 0; i < sizeof (tiger_commands)/sizeof(tiger_commands[0]);i++) { + const struct command *cmd = &tiger_commands[i]; + switch (cmd->type) { + case 'm': + cairo_move_to (cr, cmd->x0, cmd->y0); + break; + case 'l': + cairo_line_to (cr, cmd->x0, cmd->y0); + break; + case 'c': + cairo_curve_to (cr, + cmd->x0, cmd->y0, + cmd->x1, cmd->y1, + cmd->x2, cmd->y2); + break; + case 'f': + cairo_set_source_rgba (cr, + cmd->x0, cmd->y0, cmd->x1, cmd->y1); + cairo_fill (cr); + break; + } + } + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_mono_tiger (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + return do_tiger (cr, width, height, loops); +} + +static cairo_time_t +do_fast_tiger (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_FAST); + return do_tiger (cr, width, height, loops); +} + +static cairo_time_t +do_best_tiger (cairo_t *cr, int width, int height, int loops) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_BEST); + return do_tiger (cr, width, height, loops); +} + +cairo_bool_t +tiger_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "tiger", NULL); +} + +void +tiger (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "tiger-mono", do_mono_tiger, NULL); + cairo_perf_run (perf, "tiger-fast", do_fast_tiger, NULL); + cairo_perf_run (perf, "tiger-best", do_best_tiger, NULL); +} diff --git a/perf/micro/twin.c b/perf/micro/twin.c new file mode 100644 index 000000000..99433bd65 --- /dev/null +++ b/perf/micro/twin.c @@ -0,0 +1,59 @@ +#define WIDTH 1350 +#define HEIGHT 900 + +#include "cairo-perf.h" + +static cairo_time_t +do_twin (cairo_t *cr, + int width, + int height, + int loops) +{ + int i, j, h; + unsigned char s[2] = {0, 0}; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_perf_timer_start (); + + while (loops--) { + h = 2; + for (i = 8; i < 48; i >= 24 ? i+=3 : i++) { + cairo_set_font_size (cr, i); + for (j = 33; j < 128; j++) { + if (j == 33 || (j == 80 && i > 24)) { + h += i + 2; + cairo_move_to (cr, 10, h); + } + s[0] = j; + cairo_text_path (cr, (const char *) s); + } + } + cairo_fill (cr); + } + + cairo_perf_timer_stop (); + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +twin_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "twin", NULL); +} + +void +twin (cairo_perf_t *perf, + cairo_t *cr, + int width, + int height) +{ + cairo_perf_run (perf, "twin", do_twin, NULL); +} diff --git a/perf/micro/unaligned-clip.c b/perf/micro/unaligned-clip.c new file mode 100644 index 000000000..41e327f1e --- /dev/null +++ b/perf/micro/unaligned-clip.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2006 Jeff Muizelaar + * Copyright © 2006 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: Jeff Muizelaar + * Carl Worth + */ + +#include "cairo-perf.h" + +static cairo_time_t +do_unaligned_clip (cairo_t *cr, int width, int height, int loops) +{ + cairo_perf_timer_start (); + + while (loops--) { + cairo_save (cr); + + /* First a triangular clip that obviously isn't along device-pixel + * boundaries. */ + cairo_move_to (cr, 50, 50); + cairo_line_to (cr, 50, 90); + cairo_line_to (cr, 90, 90); + cairo_close_path (cr); + cairo_clip (cr); + + /* Then a rectangular clip that would be but for the non-integer + * scaling. */ + cairo_scale (cr, 1.1, 1.1); + cairo_rectangle (cr, 55, 55, 35, 35); + cairo_clip (cr); + + /* And paint something to force the clip to be evaluated. */ + cairo_paint (cr); + + cairo_restore (cr); + } + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +unaligned_clip_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "unaligned-clip", NULL); +} + +void +unaligned_clip (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "unaligned-clip", do_unaligned_clip, NULL); +} diff --git a/perf/micro/wave.c b/perf/micro/wave.c new file mode 100644 index 000000000..f6e6f74a3 --- /dev/null +++ b/perf/micro/wave.c @@ -0,0 +1,115 @@ +/* + * Copyright 2011 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-perf.h" + +static cairo_surface_t * +generate_random_waveform(cairo_t *target, int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr; + int i, r; + + srand (0xdeadbeef); + + surface = cairo_surface_create_similar (cairo_get_target (target), + CAIRO_CONTENT_ALPHA, + width, height); + cr = cairo_create (surface); + + r = height / 2; + + for (i = 0; i < width; i++) + { + r += rand () % (height / 4) - (height / 8); + if (r < 0) + r = 0; + else if (r > height) + r = height; + cairo_rectangle (cr, i, (height - r) / 2, 1, r); + } + cairo_fill (cr); + cairo_destroy (cr); + + return surface; +} + +static cairo_time_t +do_wave (cairo_t *cr, int width, int height, int loops) +{ + cairo_surface_t *wave; + cairo_pattern_t *mask; + + wave = generate_random_waveform (cr, width, height); + + cairo_perf_timer_start (); + + while (loops--) { + /* paint outline (and contents) */ + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_mask_surface (cr, wave, 0, 0); + + /* overdraw inline */ + /* first, create a mask */ + cairo_push_group_with_content (cr, CAIRO_CONTENT_ALPHA); + cairo_set_source_surface (cr, wave, 0, 0); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_surface (cr, wave, 1, 0); + cairo_paint (cr); + cairo_set_source_surface (cr, wave, -1, 0); + cairo_paint (cr); + cairo_set_source_surface (cr, wave, 0, 1); + cairo_paint (cr); + cairo_set_source_surface (cr, wave, 0, -1); + cairo_paint (cr); + mask = cairo_pop_group (cr); + + /* second, paint the mask */ + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_mask (cr, mask); + + cairo_pattern_destroy (mask); + } + + cairo_perf_timer_stop (); + + cairo_surface_destroy (wave); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +wave_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "wave", NULL); +} + +void +wave (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "wave", do_wave, NULL); +} diff --git a/perf/micro/wide-fills.c b/perf/micro/wide-fills.c new file mode 100644 index 000000000..0747e6e67 --- /dev/null +++ b/perf/micro/wide-fills.c @@ -0,0 +1,187 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + + +/* This is a variant on wide strokes where we precompute + * a simplified stroke-to-path. + * When we have a real stroke-to-path, it would useful to compare the cost + * of stroking vs filling the "identical" paths. + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_wide_fills_ha (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double y = floor (uniform_random (0, height)); + double x = floor (uniform_random (0, width)); + cairo_rectangle (cr, x, y, ceil (uniform_random (0, width)) - x, 5); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_fills_h (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double y = uniform_random (0, height); + double x = uniform_random (0, width); + cairo_rectangle (cr, x, y, uniform_random (0, width) - x, 5); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_fills_va (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double x = floor (uniform_random (0, width)); + double y = floor (uniform_random (0, height)); + cairo_rectangle (cr, x, y, 5, ceil (uniform_random (0, height) - y)); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_fills_v (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double x = uniform_random (0, width); + double y = uniform_random (0, height); + cairo_rectangle (cr, x, y, 5, uniform_random (0, height) - y); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_fills (cairo_t *cr, int width, int height, int loops) +{ + int count; + + /* lots and lots of overlapping stroke-like fills */ + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + cairo_save (cr); + cairo_translate (cr, + uniform_random (0, width), + uniform_random (0, height)); + cairo_rotate (cr, uniform_random (-M_PI,M_PI)); + cairo_rectangle (cr, 0, 0, uniform_random (0, width), 5); + cairo_restore (cr); + } + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +wide_fills_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "wide-fills", NULL); +} + +void +wide_fills (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "wide-fills-halign", do_wide_fills_ha, NULL); + cairo_perf_run (perf, "wide-fills-valign", do_wide_fills_va, NULL); + cairo_perf_run (perf, "wide-fills-horizontal", do_wide_fills_h, NULL); + cairo_perf_run (perf, "wide-fills-vertical", do_wide_fills_v, NULL); + cairo_perf_run (perf, "wide-fills-random", do_wide_fills, NULL); +} diff --git a/perf/micro/wide-strokes.c b/perf/micro/wide-strokes.c new file mode 100644 index 000000000..141309148 --- /dev/null +++ b/perf/micro/wide-strokes.c @@ -0,0 +1,188 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-perf.h" + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_time_t +do_wide_strokes_ha (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double h = floor (uniform_random (0, height)); + cairo_move_to (cr, floor (uniform_random (0, width)), h); + cairo_line_to (cr, ceil (uniform_random (0, width)), h); + } + + cairo_set_line_width (cr, 5.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_strokes_h (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double h = uniform_random (0, height); + cairo_move_to (cr, uniform_random (0, width), h); + cairo_line_to (cr, uniform_random (0, width), h); + } + + cairo_set_line_width (cr, 5.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_strokes_va (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double v = floor (uniform_random (0, width)); + cairo_move_to (cr, v, floor (uniform_random (0, height))); + cairo_line_to (cr, v, ceil (uniform_random (0, height))); + } + + cairo_set_line_width (cr, 5.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_strokes_v (cairo_t *cr, int width, int height, int loops) +{ + int count; + + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + double v = uniform_random (0, width); + cairo_move_to (cr, v, uniform_random (0, height)); + cairo_line_to (cr, v, uniform_random (0, height)); + } + + cairo_set_line_width (cr, 5.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_wide_strokes (cairo_t *cr, int width, int height, int loops) +{ + int count; + + /* lots and lots of overlapping strokes */ + state = 0xc0ffee; + for (count = 0; count < 1000; count++) { + cairo_line_to (cr, + uniform_random (0, width), + uniform_random (0, height)); + } + + cairo_set_line_width (cr, 5.); + + cairo_perf_timer_start (); + + while (loops--) + cairo_stroke_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +wide_strokes_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "wide-strokes", NULL); +} + +void +wide_strokes (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1., 1., 1.); + + cairo_perf_run (perf, "wide-strokes-halign", do_wide_strokes_ha, NULL); + cairo_perf_run (perf, "wide-strokes-valign", do_wide_strokes_va, NULL); + cairo_perf_run (perf, "wide-strokes-horizontal", do_wide_strokes_h, NULL); + cairo_perf_run (perf, "wide-strokes-vertical", do_wide_strokes_v, NULL); + cairo_perf_run (perf, "wide-strokes-random", do_wide_strokes, NULL); +} diff --git a/perf/micro/world-map.c b/perf/micro/world-map.c new file mode 100644 index 000000000..ff22eebf3 --- /dev/null +++ b/perf/micro/world-map.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +typedef enum { + WM_NEW_PATH, + WM_MOVE_TO, + WM_LINE_TO, + WM_HLINE_TO, + WM_VLINE_TO, + WM_REL_LINE_TO, + WM_END +} wm_type_t; + +typedef struct _wm_element { + wm_type_t type; + double x; + double y; +} wm_element_t; + +#include "world-map.h" + +enum { + STROKE = 1, + FILL = 2, +}; + +static cairo_time_t +do_world_map (cairo_t *cr, int width, int height, int loops, int mode) +{ + const wm_element_t *e; + double cx, cy; + + cairo_set_line_width (cr, 0.2); + + cairo_perf_timer_start (); + + while (loops--) { + cairo_set_source_rgb (cr, .68, .85, .90); /* lightblue */ + cairo_rectangle (cr, 0, 0, 800, 400); + cairo_fill (cr); + + e = &countries[0]; + while (1) { + switch (e->type) { + case WM_NEW_PATH: + case WM_END: + if (mode & FILL) { + cairo_set_source_rgb (cr, .75, .75, .75); /* silver */ + cairo_fill_preserve (cr); + } + if (mode & STROKE) { + cairo_set_source_rgb (cr, .50, .50, .50); /* gray */ + cairo_stroke (cr); + } + cairo_new_path (cr); + cairo_move_to (cr, e->x, e->y); + break; + case WM_MOVE_TO: + cairo_close_path (cr); + cairo_move_to (cr, e->x, e->y); + break; + case WM_LINE_TO: + cairo_line_to (cr, e->x, e->y); + break; + case WM_HLINE_TO: + cairo_get_current_point (cr, &cx, &cy); + cairo_line_to (cr, e->x, cy); + break; + case WM_VLINE_TO: + cairo_get_current_point (cr, &cx, &cy); + cairo_line_to (cr, cx, e->y); + break; + case WM_REL_LINE_TO: + cairo_rel_line_to (cr, e->x, e->y); + break; + } + if (e->type == WM_END) + break; + e++; + } + + cairo_new_path (cr); + } + + cairo_perf_timer_stop (); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +do_world_map_stroke (cairo_t *cr, int width, int height, int loops) +{ + return do_world_map (cr, width, height, loops, STROKE); +} + +static cairo_time_t +do_world_map_fill (cairo_t *cr, int width, int height, int loops) +{ + return do_world_map (cr, width, height, loops, FILL); +} + +static cairo_time_t +do_world_map_both (cairo_t *cr, int width, int height, int loops) +{ + return do_world_map (cr, width, height, loops, FILL | STROKE); +} + +cairo_bool_t +world_map_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "world-map", NULL); +} + +void +world_map (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + cairo_perf_run (perf, "world-map-stroke", do_world_map_stroke, NULL); + cairo_perf_run (perf, "world-map-fill", do_world_map_fill, NULL); + cairo_perf_run (perf, "world-map", do_world_map_both, NULL); +} diff --git a/perf/micro/world-map.h b/perf/micro/world-map.h new file mode 100644 index 000000000..af58b80f1 --- /dev/null +++ b/perf/micro/world-map.h @@ -0,0 +1,196 @@ +/* The data for this test case was provided by Gary Nicholson + * who originally created an interactive SVG map + * of the world as can be seen here: + * + * http://www.wherearewe.co.nz/svg.html + * + * The data is used here by permission from Gary given on 2006-11-08: + * + * Thanks for asking, I don't need any attribution if you are + * only using the vectors and not the entire map with + * interactivity etc. So feel free to do what you wish with + * the data. + */ + +#define N(x,y) { WM_NEW_PATH, x, y } +#define M(x,y) { WM_MOVE_TO, x, y } +#define L(x,y) { WM_LINE_TO, x, y } +#define H(x,y) { WM_HLINE_TO, x, y } +#define V(x,y) { WM_VLINE_TO, x, y } +#define l(x,y) { WM_REL_LINE_TO, x, y } +#define E(x,y) { WM_END, x, y } + +static const wm_element_t countries[] = { +N(413.519,90.071),l(.136,-.348),l(-.31,-.204),l(-.017,-.327),l(.213,-.322),l(.245,-.147),l(.142,-.08),l(.225,.072),l(.062,.301),l(.41,.312),l(.466,.096),l(-.044,.288),l(-.248,.144),l(.074,.353),l(-.145,-.063),l(-.568,-.011),l(-.642,-.063), +N(421.683,94.397),l(.193,.336),l(-.266,.274),l(.214,.288),l(-.09,.192),l(.622,.062),l(.008,.144),l(.55,.242),l(.579,-.332),l(.215,.117),l(-.029,.171),l(-.126,.309),l(.112,.212),l(-.038,.192),l(-.315,-.051),l(-.176,-.162),l(-.283,.091),l(-.081,.273),l(.244,.131),l(-.228,.415),l(-.244,-.333),l(-.469,.05),l(-.071,.122),l(-.216,.03),l(-.23,-.142),l(-.143,-.354),l(-.371,.081),l(.019,.333),l(-.425,.384),l(-.018,.535),l(-.285,.151),l(-.385,-.312),l(.098,-.182),l(-.311,-.071),l(-.534,-.363),l(-.016,-.415),l(-.777,.404),l(.103,.212),l(-.349,.432),l(-.275,.16),l(-.629,-.168),l(-.627,.204),l(-.599,-.062),l(-.102,-.424),l(-.312,-.806),l(-.616,.147),l(-.854,.668),l(-.369,-.111),l(.238,-.226),l(.013,-.322),l(-.08,-.137),l(.089,-.294),l(.718,-.418),l(-.038,-.315),l(.575,-.24),l(.012,-.076),l(.528,-.494),l(.173,-.035),l(-.116,-.089),l(-.153,-.028),l(.221,-.302),l(.446,.007),l(-.005,.096),l(.473,.007),l(.385,-.309),l(.271,.089),l(.272,-.117),l(.271,.096),l(.567,-.158),l(.278,.11),l(.354,-.021),l(-.179,-.199),l(.709,-.199),l(.017,.151),l(.199,-.014),l(.149,.089),l(.852,.007),l(.664,.261), +N(421.394,104.558),l(.104,.175),l(.04,.256),l(-.06,.475),l(.118,.054),l(.062,.333),l(-.076,.795),l(-.211,.327),l(-.118,.724),l(-.292,.501),l(-.298,-.043),l(-.057,-.196),l(-.41,-.076),l(-.227,-.152),l(.284,-.207),l(-.07,-.076),l(-.437,-.098),l(.257,-.332),l(-.11,-.071),l(-.291,.071),l(-.053,-.147),l(.115,-.022),l(.175,-.158),l(-.094,-.153),l(-.257,-.082),l(.015,-.164),l(.247,-.12),l(-.284,-.218),l(.241,-.284),l(.6,-.305),l(.27,-.022),l(.04,-.125),l(.292,-.043),l(.195,.104),l(.096,-.142),l(-.022,-.344),l(.072,-.224),l(.143,-.011),M(396.323,103.853),l(.375,-.122),l(.411,-.365),l(.549,-2.299),l(.397,-.091),l(-.21,-.29),l(-.226,.259),l(.125,-1.144),l(.223,-.826),l(.115,.153),l(.496,.306),l(.191,.382),l(.191,.229),l(-.281,-.673),l(-.63,-.582),l(-.242,-.233),l(.024,-.249),l(.359,-.477),l(-.202,-.375),l(-.2,-.274),l(-.326,-.216),l(-.685,-.1),l(-.515,-.571),l(-.416,-.323),l(.278,-.426),l(-.233,-.181),l(-.343,-.131),l(-.511,-.142),l(-.184,-.173),l(.247,-.376),l(-.329,-.173),l(-.509,.179),l(-.489,-.249),l(-.824,-.251),l(-.619,-.181),l(-.325,.014),l(-.215,-.25),l(-.91,.167),l(-.059,-.25),l(-.265,-.125),l(-.367,-.042),l(-.056,-.104),l(.861,-.083),l(-.085,-.229),l(-.526,-.104),l(.442,-.104),l(.086,-.205),l(-.275,.017),l(-.263,-.021),l(-.417,.083),l(.04,-.438),l(.303,.012),l(.305,-.146),l(.526,-.088),l(.562,-.174),l(.215,.188),l(.18,-.167),l(.474,.063),l(.112,-.26),l(.272,-.059),l(.764,-.078),l(.393,.366),l(.275,.26),l(.342,.083),l(.652,-.271),l(.317,.167),l(.276,-.127),l(.457,-.124),l(.029,.23),l(.591,-.065),l(.3,-.103),l(-.265,-.188),l(-.028,-.251),l(.056,-.345),l(-.037,-.428),l(-.131,.021),l(-.562,-.682),l(-.11,-.407),l(.927,.126),l(.607,-.105),l(-.084,.397),l(.248,.419),l(.342,-.146),l(1.241,.104),l(.501,.146),l(.079,-.014),l(.525,-.093),l(.662,-.27),l(-.534,-.124),l(.055,-.204),l(.166,-.175),l(.753,-.322),l(.756,-.181),l(.902,-.215),l(.314,-.235),l(.302,-.264),l(-.053,-.775),l(.135,-.542),l(.521,-.25),l(.46,-.16),l(.916,-.092),l(.177,-.096),l(.208,.447),l(.311,.335),l(.266,.127),l(.141,-.071),l(.41,-.208),l(.153,.17),l(.202,.458),l(.194,.133),l(.518,-.012),l(.159,.301),l(.259,-.012),l(.576,.048),l(.375,.168),l(-.159,.241),l(.091,.175),l(-.072,.198),l(.285,.122),l(.406,-.075),l(.446,-.035),l(.193,-.313),l(.245,-.072),l(-.119,.373),l(.146,.18),l(-.039,.228),l(.529,.048),l(.341,.192),l(.371,.204),l(.127,.228),l(.694,-.174),l(.079,.114),l(.642,.063),l(.568,.011),l(.145,.063),l(.428,.319),l(.337,.277),l(.395,-.055),l(.045,.145),l(.689,-.062),l(.072,-.048),l(.233,.007),l(.095,.186),l(.456,.09),l(.479,-.014),l(.605,.193),l(-.954,.806),l(-.054,.213),l(-.054,.358),l(-.321,.372),l(-.075,.295),l(.091,.076),l(-.216,.701),l(.135,.233),l(-.385,.309),l(-.473,-.007),l(.005,-.096),L(415.96,94.5),l(-.221,.302),l(.153,.028),l(.116,.089),l(-.173,.035),l(-.528,.494),l(-.012,.076),l(-.575,.24),l(.038,.315),l(-.718,.418),l(-.089,.294),l(.08,.137),l(-.013,.322),l(-.238,.226),l(.369,.111),l(.854,-.668),l(.616,-.147),l(.312,.806),l(.102,.424),l(-.624,.301),l(.532,.344),l(.025,.292),l(.43,.192),l(-.199,.272),l(-.541,.353),l(-.183,-.111),l(-.437,.186),l(.352,.358),l(.616,.191),l(.135,.331),l(-.175,.01),l(-.315,.371),l(.193,.442),l(.754,.391),l(.849,-.07),l(.062,.281),l(-.146,.469),l(-.346,.23),l(-.221,.215),l(-.833,.488),l(-.889,.659),l(-.427,.087),l(-.318,.043),l(-.798,.159),l(-.405,-.028),l(-.471,-.156),l(-.851,-.499),l(-.315,-.085),l(-.354,.029),l(-.231,.072),l(-.511,-.056),l(-.752,-.313),l(-.602,.044),l(-.731,.345),l(-.357,.258),l(-.555,.559),l(-.147,.386),l(.099,.514),l(.091,.379),l(-.334,-.091),l(-.75,.137),l(-.039,.136),l(-.485,-.015),l(-.427,-.197),l(-.395,.167),l(-.261,-.015),l(-.036,-.152),l(-.335,-.091),l(-.206,.03),l(-.374,.076),l(-.187,-.076),l(-.035,-.289),l(-.091,-.213),l(-1.252,-.304),l(-.355,0),l(.017,.319),l(-.542,-.015),l(-.337,.061),l(-.037,-.122),l(-.767,.03),l(-.084,-.114),l(-.028,-.038),l(-.431,-.152),l(-.131,.076),l(-.262,-.03),l(-.056,.076),l(-.507,-.395),l(-.15,.061),l(-1.088,-.334),l(-.112,.106),l(-.15,-.03),l(-.094,-.106),l(.205,-.243),l(-.058,-.122),l(-.469,.03),l(-.472,-.243), +N(681.312,116.395),l(.235,-.171),l(.283,-.256),l(.633,-.738),l(.315,-.157),l(.595,.011),l(.579,.068),l(.511,.096),l(.309,-.115),l(.571,-.678),l(.682,.621),l(1.178,1.611),l(.329,.495),l(.269,.664),l(.002,.75),l(-.034,.947),l(-.129,.637),l(.143,.113),l(.5,-.043),l(-.121,.41),l(-.282,.523),l(-.5,.75),l(-.316,.312),l(-.243,.043),l(-.567,-.211),l(-.256,.1),l(-.607,.58),l(-.431,-.083),l(-.289,-.225),l(-.544,.1),l(-.526,.199),l(-1.188,.835),l(-.462,.043),l(-.46,.312),l(-.055,-.564),l(-.056,-.324),l(-.163,-.705),l(-.137,-.395),l(.167,-.453),l(.499,-.468),l(0,-.353),l(.226,-.425),l(-.044,-.141),l(-.378,-.311),l(-.095,-.296),l(.015,-.467),l(-.087,-.339),l(-.289,-.126),l(-.603,-.084),l(.654,-.411),l(.303,-.114),l(.654,.268),l(.254,-.241),l(-.029,-.283),l(-.764,-.89),l(-.113,-.311),l(-.137,-.105), +N(475.646,121.847),l(-.018,.175),l(.338,.391),l(-.295,-.009),l(-.132,.108),l(-.104,-.059),l(-.327,-.021),l(-.121,.33),l(-.783,.257),l(-.384,.046),l(-.099,.053),l(0,.21),l(-.217,.006),l(-.072,-.192),l(-.402,.023),l(-.547,-.146),l(-.191,-.087),l(0,-.21),l(-.161,-.105),l(-.122,-.403),l(.082,-.035),l(.12,.1),l(.147,-.006),l(.405,-.304),l(.253,-.006),l(.328,.092),l(.077,-.086),l(.088,-.286),l(-.053,-.175),l(.627,.093),l(.658,.027),l(.367,-.056),l(.818,-.233),l(.689,-.304),l(.535,-.158),l(-.475,.295),l(-.436,.231),l(-.596,.444), +N(704.404,117.274),l(.197,-.099),l(1.108,-.271),l(.057,.354),l(-.481,.284),l(-.232,.241),l(-.068,.453),l(.139,.367),l(.291,.056),l(.221,-.114),l(.418,-.354),l(.24,-.085),l(1.656,-.697),l(.389,-.213),l(.46,-.326),l(.349,-.638),l(.76,-.412),l(.347,-.327),l(.191,-.269),l(.142,-.51),l(.538,-.582),l(-.01,-.142),l(.344,-.567),l(.159,-.468),l(.139,-.609),l(-.043,-.467),l(-.33,-.198),l(-.128,-.24),l(.234,-.213),l(.166,-.284),l(-.155,-1.023),l(.544,-.343),l(.176,-.242),l(.327,-.328),l(.192,0),l(.21,.355),l(.199,.227),l(.303,-.058),l(.799,-.257),l(-.169,-.526),l(-.311,-.028),l(-.36,-.312),l(.694,-.415),l(.441,.156),l(.336,.227),l(.025,.199),l(-.016,.868),l(.058,.611),l(.22,.127),l(.243,.312),l(.717,1.432),l(.001,.496),l(-.246,.709),l(-.709,.766),l(-.226,.439),l(.064,.368),l(-.15,.071),l(-.737,.285),l(-.161,.113),l(-.164,.199),l(-.174,.453),l(.02,.396),l(.094,.254),l(.131,.792),l(-.04,.693),l(-.686,.751),l(-.242,.736),l(.02,.707),l(.198,.296),l(.422,.353),l(-.617,.298),l(-.193,.127),l(-.166,.17),l(-.174,.834),l(-1.081,.439),l(-.094,-.282),l(.294,-.665),l(.184,-.523),l(-.198,-.126),l(-.514,.241),l(-.578,.623),l(-.476,.001),l(-.346,.312),l(-.066,.748),l(-.354,.269),l(-.188,-.028),l(-.066,-.155),l(.003,-.606),l(-.149,-.155),l(-.211,.042),l(-.309,.156),l(-.344,.311),l(-.325,.523),l(-.866,-.055),l(-.505,.057),l(-.631,.1),l(-.458,-.549),l(-.685,-.323),l(-.26,.254),l(-.067,.184),l(-.177,.353),l(.037,.056),l(.417,.197),l(.416,.323),l(-.293,.198),l(-.829,.129),l(-.433,.241),l(-.463,.622),l(-.522,.847),l(-.688,-.365),l(-.565,-.21),l(-.285,-.197),l(-.014,-.169),l(-.194,-.818),l(.099,-.155),l(.495,-.325),l(.179,-.269),l(-.067,-.282),l(-.18,-.042),l(-.601,.17),l(-.341,-.028),l(-.789,-.167),l(-.475,.128),l(-.427,.227),l(-.437,.184),l(-.269,-.098),l(-.256,-.027),l(-1.647,.398),l(-.814,.298),l(-.21,-.31),l(-.452,-.042),l(-.413,.438),l(-.006,.635),l(-.756,-.238),l(-.579,-.055),l(-1.1,.073),l(-.267,-.14),l(.072,-.339),l(.179,-.283),l(.483,.013),l(.499,-.114),l(.751,-.467),l(2.201,-1.953),l(.28,-.015),l(.427,-.128),l(.056,.424),l(.495,-.128),l(1.278,-.257),l(.933,-.058),l(1.183,-.172),l(.892,-.256),l(.068,.452),l(.377,.268),l(.167,-.085),l(.654,-.199),l(.446,-.34),l(-.003,-.353),l(.114,-.467),l(.465,-.51),l(.698,-.581),l(.371,-.453),l(-.062,-1.117),l(.182,-.213),M(695.464,127.756),l(-.292,-.197),l(-.223,-.268),l(-.101,-.381),l(-.177,-.395),l(-.492,-.535),l(.731,-.382),l(.287,-.269),l(.456,-.593),l(.409,.253),l(.615,-.015),l(.483,-.185),l(.311,-.339),l(.451,-.311),l(.454,-.029),l(.316,.169),l(.862,.224),l(.153,.254),l(-.1,.127),l(-.102,.423),l(-.292,.24),l(-.864,.876),l(-.181,-.211),l(-.424,-.295),l(-.467,-.042),l(-.612,.213),l(-.193,.184),l(-.245,.495),l(-.165,.508),l(-.153,.212),l(-.448,.269),M(691.12,131.448),l(-.366,-.042),l(-.056,-.141),l(.268,-.537),l(.128,-.593),l(-.334,-.112),l(-.239,.198),l(-.155,.466),l(-.381,.452),l(-.326,-.211),l(-.059,-.211),l(.322,-.466),l(.032,-.296),l(-.356,-.917),l(.169,-.113),l(.687,-.58),l(.083,-.141),l(.034,-.466),l(-.532,-.789),l(-.333,-.042),l(-.162,.269),l(-.419,.495),l(-.249,-.112),l(-.23,-.508),l(-.376,-.267),l(-.261,-.366),l(.41,-.325),l(.733,.083),l(.706,-.171),l(.315,-.466),l(.241,-.283),l(.484,-.058),l(.478,.056),l(.249,.38),l(.27,.168),l(.43,.084),l(.628,-.213),l(.225,.395),l(-.569,.438),l(.405,.239),l(.443,.437),l(.079,.254),l(-.596,.58),l(-.242,.41),l(-.104,.367),l(-.085,.621),l(-.109,.649),l(-.242,.353),l(-.194,.099),l(-.165,.071),l(-.197,.184),l(-.479,.678),M(711.938,108.369),l(-.222,-.241),l(-.077,-.271),l(.325,-.642),l(-.055,-.342),l(-.549,-.198),l(-.168,-.171),l(-.146,-.812),l(.583,-.386),l(.522,-.172),l(.646,-.373),l(.037,-.356),l(-.318,-.285),l(.277,-.3),l(.224,-.015),l(.661,.427),l(.373,.085),l(.532,-.201),l(-.004,-1.186),l(.455,-.187),l(.45,-.244),l(.074,-.743),l(.007,-.844),l(-.398,-.758),l(-.098,-.473),l(.166,-.216),l(.618,-.346),l(.063,.072),l(.507,.43),l(.904,.816),l(1.07,.842),l(1.083,.684),l(.627,.285),l(.528,.17),l(1.02,.198),l(.282,.042),l(.304,-.086),l(.866,-.66),l(.461,-.144),l(.002,.1),l(-.308,.358),l(-.335,.558),l(.198,.414),l(.469,.599),l(.197,.356),l(-.561,.272),l(-.447,.244),l(-.534,.158),l(-.365,.015),l(-.488,-.199),l(-.453,.015),l(-.363,.144),l(-.345,.229),l(-.754,.786),l(-.396,.5),l(-.26,.599),l(-.4,-.07),l(-.425,-.241),l(-2.031,-.965),l(-.461,-.085),l(-.72,.044),l(-1.038,.587),l(-.153,-.299),l(-.372,-.356),l(-.339,.029),l(-.266,.115),l(-.439,.272),l(.049,.299),l(1.16,.497),l(.56,.298),l(.302,.27),l(-.391,.214),l(-.303,.029),l(-.305,-.128),l(-.261,.043),l(-.324,.314),l(-.388,.471),l(-.347,.114), +N(597.917,139.685),l(1.251,-1.545),l(.609,-.539),l(.348,-.239),l(.149,-.103),l(.417,-.016),l(.309,.294),l(.479,.208),l(1.659,.047),l(.371,.041),l(.312,.209),l(.329,.619),l(-.07,.156),l(.042,.24),l(.326,.294),l(.313,.069),l(.258,.238),l(.017,.282),l(-.217,.58),l(-.624,.06),l(-1.036,.062),l(-1.238,-.063),l(-.335,-.125),l(-.301,-.055),l(-.531,.313),l(-.544,.074),l(-.085,-.021),l(-.869,-.214),l(-.559,-.081),l(-.637,-.18),l(-.235,-.493),l(.092,-.113), +N(362.764,152.723),l(.072,-.625),l(.395,-.876),l(.52,-.552),l(.488,-.566),l(.244,-.509),l(1.175,-2.559),l(.238,-.241),l(1.404,-1.175),l(.345,-.495),l(.051,-.918),l(.305,-1.088),l(.651,-1.075),l(.399,-.34),l(.404,-.198),l(.838,-.51),l(.361,-.495),l(.334,-.777),l(.428,-.851),l(1.635,-.04),l(2.511,0),l(2.677,-.001),l(1.718,.004),l(1.42,-.008),l(.027,.876),l(-.03,1.752),l(.002,.65),l(-.104,.396),l(-.56,-.011),l(-6.005,-.022),l(-.557,.074),l(-.047,.509),l(-.07,2.261),l(-.099,2.6),l(-.144,.128),l(-.809,.287),l(-.726,.315),l(-.575,.427),l(-.249,.383),l(-.01,.707),l(.164,1.539),l(.051,1.102),l(-.212,-.027),l(-.732,.033),l(-2.396,-.014),l(-5.055,-.056),l(-.474,-.013), +N(514.551,145.841),l(-.374,.027),l(-.336,-.083),l(-.008,-.615),l(-.153,-.437),l(-.108,-.791),l(.187,-.607),l(.188,-.11),l(-.059,-.187),l(.177,-.607),l(.33,-.269),l(.312,.083),l(.069,.315),l(.26,.093),l(.063,.199),l(.116,.326),l(-.106,.42),l(.031,.708),l(.118,.254),l(-.104,.381),l(-.327,.467),l(-.275,.433), +N(514.177,145.868),l(.374,-.027),l(.008,.288),l(.361,.14),l(.153,.128),l(.186,-.093),l(-.046,.443),l(.397,.001),l(.402,.127),l(.687,-.093),l(.103,-.21),l(.183,-.058),l(.218,.117),l(.424,-.042),l(.595,.112),l(.224,-.035),l(.079,-.105),l(1.358,.222),l(.732,-.14),l(-.022,-.292),l(.225,.175),l(.375,-.016),l(.157,-.099),l(.312,-.422),l(.232,-.073),l(.267,-.495),l(.131,-.297),l(.711,-.637),l(.813,-.889),l(.163,.105),l(.229,-.178),l(.85,-.708),l(.313,-.433),l(.15,.161),l(-.248,.42),l(-.107,.299),l(-.004,.176),l(.099,.064),l(.121,-.024),l(.454,.042),l(.09,.324),l(.001,.508),l(-.003,.358),l(-.49,.034),l(-.401,-.083),l(-.107,.396),l(.073,1.326),l(-.199,.34),l(-.536,.596),l(.003,.946),l(.024,2.075),l(.063,.183),l(-.152,.057),l(-.584,.469),l(-.839,-.108),l(-3.387,-.446),l(-3.362,-.375),l(-.261,-.902),l(-.548,-1.154),l(-1.043,-2.198), +N(668.627,151.365),l(-.102,-.056),l(-.107,-.325),l(-.922,-1.212),l(-.332,-.987),l(-.03,-.438),l(.156,-.749),l(.546,-.792),l(1.312,-1.852),l(.259,-.184),l(.425,-.128),l(.229,-.184),l(.358,-.227),l(.228,.127),l(.554,.394),l(-.334,.424),l(-.084,.142),l(.023,.31),l(-.067,.622),l(-.203,.296),l(-.182,.354),l(-.065,.692),l(-.1,.494),l(-.317,.805),l(-.473,.707),l(-.417,.833),l(-.014,.353),l(-.114,.438),l(-.228,.142), +N(389.765,144.543),l(.1,.084),l(.895,.531),l(2.054,1.344),l(.811,.575),l(3.283,2.241),l(1.924,1.26),l(1.292,.824),l(.397,.253),l(2.472,1.469),l(.181,.253),l(-.096,.396),l(.082,.183),l(.393,.28),l(1.111,1.039),l(.229,.027),l(.47,-.314),l(.588,.562),l(.375,.167),l(.748,.024),l(.309,.111),l(.277,.352),l(.099,.522),l(-.161,.679),l(.146,.564),l(2.176,-.408),l(.064,1.017),l(.034,2.203),l(.001,.96),l(-.08,.89),l(-.145,.919),l(-.434,1.246),l(-.596,.794),l(-.339,.271),l(-.29,.129),l(-2.533,.085),l(-1.808,.124),l(-.209,.072),l(-.562,.427),l(-.579,.272),l(-.678,-.053),l(-.581,-.081),l(-1.062,-.173),l(-.36,-.059),l(-.356,-.125),l(-.37,.073),l(-1.22,.713),l(-.947,.458),l(-.304,.228),l(-.314,.793),l(-.274,-.027),l(-.324,-.182),l(-.518,-.209),l(-.272,.101),l(-.638,.625),l(-.492,.667),l(-.393,.822),l(-.174,.227),l(-.45,.102),l(-.551,-.364),l(-.293,-.281),l(-.273,.058),l(-.397,.384),l(-.355,1.217),l(-.292,1.047),l(-.317,.369),l(-.543,.271),l(-.448,.158),l(-.257,.016),l(-.141,.255),l(.058,.749),l(-.133,.876),l(-.261,.92),l(-.172,.326),l(-.046,.156),l(-.08,.043),l(-.159,.1),l(-.604,.399),l(-.352,.059),l(-.148,-.239),l(-.117,-.381),l(-.004,-.297),l(-.147,-.211),l(-.257,-.041),l(-.239,.114),l(-.571,.483),l(-.362,.469),l(-.35,.228),l(-.455,-.436),l(-.566,-.321),l(-.352,.059),l(-.522,.54),l(-.559,-.901),l(-.194,-1.143),l(-.349,-.718),l(-.474,-.478),l(-.265,-.451),l(-.271,-.832),l(-.022,-.339),l(-.246,-.281),l(-.323,-.055),l(-.684,.428),l(-.3,.327),l(-.43,.243),l(-.565,-.152),l(-.356,-.153),l(-.338,-.026),l(-.475,.413),l(-.252,.256),l(-.536,-.265),l(-.882,-.715),l(-.18,-.183),l(-.113,-.028),l(.062,-.142),l(.004,-.565),l(-.082,-.833),l(-.265,-.337),l(-.554,-.322),l(-.181,-.197),l(-.22,-.479),l(-.144,-.663),l(-.251,-1.1),l(.057,-.339),l(.506,-.399),l(.332,-.284),l(.018,-.607),l(.181,-.552),l(.252,-.256),l(.402,-.073),l(.261,.111),l(.568,.83),l(.214,.168),l(.454,.082),l(.107,-.269),l(-.055,-.296),l(.06,-.212),l(.535,.124),l(.713,.137),l(.485,.054),l(.387,-.031),l(.945,-.344),l(1.953,-.026),l(6.457,-.01),l(.379,-1.613),l(-.724,-.787),l(-.186,-1.468),l(-.202,-2.386),l(-.325,-2.753),l(-.178,-1.736),l(-.19,-1.468),l(-.908,-7.962),l(-.049,-.776),l(3.231,-.089),l(.523,-.13), +N(525.37,142.384),l(.312,-.429),l(.155,-.17),l(.084,.833),l(-.423,.707),l(-.118,.156),l(-.121,.024),l(-.099,-.064),l(.004,-.176),l(.107,-.299),l(.248,-.42),l(-.15,-.161),M(525.923,144.712),l(0,.22),l(.456,.762),l(.408,.465),l(.782,.634),l(.677,.394),l(1.008,.52),l(.392,.154),l(.277,.014),l(.576,-.029),l(.364,.112),l(.873,.973),l(.518,.648),l(.46,.422),l(.81,.365),l(.025,.212),l(-.67,1.06),l(-.615,.721),l(-.883,.807),l(-.776,1.541),l(-.242,.142),l(-.562,-.083),l(-.235,-.084),l(-.252,.071),l(-.278,.509),l(-.062,1.115),l(.001,.791),l(.134,.621),l(-.403,.142),l(-1.046,.073),l(-.627,.27),l(-.367,.283),l(-.29,.495),l(-.131,.551),l(-.204,.283),l(-.444,.255),l(-.544,.1),l(-.292,0),l(-.386,-.042),l(-.326,.029),l(-.382,.283),l(-.22,.297),l(-.125,.508),l(.003,.353),l(-.091,.311),l(-.631,.396),l(-.344,.043),l(-.776,-.21),l(-.717,.058),l(-.896,.27),l(-.768,.298),l(-.283,.099),l(-.416,.145),l(-.241,-.306),l(-.483,-.689),l(.006,-.296),l(-.127,-.253),l(-.933,-1.364),l(-.604,-.971),l(-.226,-.634),l(-.092,-.663),l(1.691,-.815),l(2.35,-1.213),l(5.346,-2.982),l(-.155,-1.453),l(-.581,-.914),l(-.063,-.183),l(-.024,-2.075),l(-.003,-.946),l(.536,-.596),l(.199,-.34),l(-.073,-1.326),l(.107,-.396),l(.401,.083),l(.49,-.034), +N(405.733,173.04),l(-.568,-.971),l(-.562,-.025),l(-.37,.044),l(-.516,-.181),l(-.97,-.757),l(-.114,-.226),l(.335,-.439),l(-.018,-.212),l(-.179,-.268),l(-.502,-.42),l(-.389,-.266),l(-.422,-.492),l(-.426,-.93),l(-.019,-.396),l(.173,-.665),l(.581,.081),l(.678,.053),l(.579,-.272),l(.562,-.427),l(.209,-.072),l(1.808,-.124),l(2.533,-.085),l(.29,-.129),l(.339,-.271),l(.596,-.794),l(.434,-1.246),l(.145,-.919),l(.08,-.89),l(-.001,-.96),l(-.034,-2.203),l(-.064,-1.017),l(1.672,-.321),l(1.82,-.364),l(3.084,-2.617),l(.834,-.655),l(2.308,-1.454),l(1.607,-.956),l(4.012,-2.241),l(1.632,-.843),l(.265,-.186),l(.832,.137),l(1.646,.442),l(1.008,.333),l(.258,.182),l(1.192,.911),l(.231,-.157),l(1.519,-.729),l(.364,2.145),l(.169,1.298),l(.42,1.028),l(.554,.802),l(.703,.604),l(-.388,.722),l(-.265,.99),l(-.168,1.088),l(-.084,.989),l(.022,.537),l(-.062,.707),l(-.019,1.045),l(-.034,1.088),l(-.056,.466),l(-2.43,2.613),l(-.591,.78),l(-.87,1.333),l(-.572,.794),l(-.007,.678),l(.123,.719),l(.014,.269),l(-.951,.034),l(-.437,.2),l(-.453,.299),l(-.761,.697),l(-.259,.058),l(-.609,-.208),l(-.724,-.193),l(-.884,-.221),l(-.531,-.04),l(-.709,.047),l(-.628,.103),l(-.774,.287),l(-.403,.327),l(-.629,.399),l(-.273,.059),l(-.934,.005),l(-.965,-.277),l(-1.173,-.742),l(-.354,-.083),l(-.467,.116),l(-1.337,.544),l(-.37,.002),l(-.209,-.098),l(-1.095,-1.223),l(-.821,-.277),l(-1.111,-.121),l(-1.174,.108),l(-1.064,.188),l(-.676,.4),l(-.687,1.614),l(-.353,.482),l(-.158,.849),l(-.092,.961),l(-.902,-.503),l(-.727,-.589),l(-.339,-.28),l(-.321,.073),l(-.577,.3), +N(431.763,171.063),l(-.351,-.407),l(-.575,-.52),l(-.173,-.394),l(-.014,-.269),l(-.123,-.719),l(.007,-.678),l(.572,-.794),l(.87,-1.333),l(.591,-.78),l(2.43,-2.613),l(.056,-.466),l(.034,-1.088),l(.019,-1.045),l(.062,-.707),l(-.022,-.537),l(.084,-.989),l(.168,-1.088),l(.265,-.99),l(.388,-.722),l(-.703,-.604),l(-.554,-.802),l(-.42,-1.028),l(-.169,-1.298),l(-.364,-2.145),l(1.818,-.858),l(.41,-.059),l(5.231,2.554),l(4.941,2.372),l(5.577,2.792),l(1.981,.963),l(-.02,1.045),l(-.016,.946),l(-.036,.636),l(.085,2.5),l(-.038,.749),l(.036,1.002),l(.031,1.229),l(-.04,.283),l(-.839,-.009),l(-1.245,.05),l(-.229,.143),l(-.417,1.245),l(-.583,.809),l(-.122,.438),l(.131,.677),l(-.149,.212),l(-.718,.428),l(-.053,.24),l(.342,.662),l(-.087,.34),l(-.542,.596),l(-.316,.609),l(.219,.352),l(.517,-.088),l(.338,.012),l(.141,.225),l(.221,1.228),l(.137,.522),l(.155,.295),l(.444,.407),l(.266,.465),l(.026,.367),l(-.15,.425),l(-.559,-.208),l(-.321,-.012),l(-.322,.086),l(-.939,.613),l(-.372,.228),l(-.165,.382),l(-.005,.41),l(-.196,.284),l(-2.649,2.275),l(-.386,.087),l(-2.181,.055),l(-.434,.059),l(-.209,.199),l(-.117,.806),l(-.646,1.176),l(-.258,.143),l(-.368,.031),l(-.881,-.009),l(-.818,.273),l(-.754,.386),l(-.466,.271),l(-.224,.03),l(-.225,-.069),l(-.494,-.661),l(-1.363,.686),l(-.449,.158),l(-.24,-.027),l(-.096,-.084),l(-.208,-.183),l(-.382,-1.057),l(-.638,-1.07),l(-1.343,-1.179),l(-1.088,-1.067),l(.323,-.539),l(.29,-.312),l(.24,-.1),l(.481,.082),l(1.187,.191),l(.674,-.032),l(.225,-.143),l(-.047,-.127),l(-.208,-.21),l(-.381,-.633),l(-.205,-.578),l(-.169,-1.228),l(.134,-.651),l(-.119,-1.2),l(-.395,-.887),l(-.923,-1.238),l(-.208,-.083),l(-.627,-.109), +N(627.173,150.012),l(.483,-.229),l(.515,-.13),l(.341,.012),l(.597,.392),l(.325,.097),l(.584,-.413),l(.332,-.115),l(1.595,-.052),l(.807,-.117),l(.341,-.157),l(.696,-.554),l(.521,-.328),l(.298,-.101),l(.623,.575),l(.771,.235),l(.66,.053),l(.777,-.047),l(.237,.21),l(.056,.38),l(-.472,.75),l(.096,.521),l(.273,.365),l(.943,.615),l(.621,.166),l(.909,.107),l(.197,.143),l(-.19,.132),l(-.826,.482),l(.106,.465),l(-.203,.212),l(-1.261,-.054),l(-.136,.198),l(.057,.395),l(-.283,.382),l(-.585,.792),l(-.221,.142),l(-.533,.241),l(-.171,.127),l(-.27,.396),l(-.303,.932),l(-.388,.975),l(.268,.225),l(.469,.563),l(1.112,1.071),l(.023,.24),l(.042,.522),l(.087,.254),l(.42,.493),l(1.096,.83),l(1.282,1.296),l(.26,.197),l(.636,.069),l(.313,.38),l(.282,1.016),l(.302,.578),l(.638,.605),l(.293,.663),l(.341,1.382),l(.524,2.809),l(-.295,.438),l(-.235,.495),l(.05,.819),l(-.095,.41),l(.056,.664),l(-.027,.099),l(-.364,.551),l(-.447,.439),l(-.254,.127),l(-.509,.1),l(-.419,.17),l(-.501,.354),l(-.591,.622),l(-.579,.354),l(-.325,.043),l(-.512,-.197),l(-.404,-.31),l(-.179,-.141),l(-.153,.424),l(.051,.494),l(.048,.353),l(-.205,.721),l(-.388,.424),l(-.326,.071),l(-.235,-.07),l(-.246,.481),l(-.427,.326),l(-.523,.142),l(-.417,.213),l(-.459,.565),l(-.196,.269),l(-.406,.297),l(-.264,.099),l(-.365,-.042),l(.078,-.861),l(.1,-1.313),l(.151,-.494),l(.215,-.283),l(-.02,-.353),l(-.475,-.437),l(-.749,-.238),l(-.091,-.066),l(.3,-.289),l(.646,-.229),l(.915,-.528),l(.599,-.229),l(.497,.011),l(.688,.194),l(.17,-.27),l(-.03,-.197),l(-.568,-.435),l(-.216,-.422),l(.234,-.425),l(.99,-.571),l(.521,-.229),l(.932,-.443),l(.599,-.187),l(.385,-.285),l(.217,-.509),l(-.054,-1.073),l(.05,-.424),l(.076,-.367),l(-.455,-1.014),l(-.029,-.663),l(.215,-.905),l(.155,-.918),l(-.064,-.578),l(-.214,-.437),l(-.529,-.477),l(-.072,-.282),l(.226,-.439),l(-.136,-.395),l(-.358,-.308),l(-.685,-.391),l(-.471,-.52),l(-.57,-.914),l(-1.683,-2.121),l(-.698,-.772),l(-.637,-.646),l(-.632,-.476),l(-1.234,-.741),l(-.162,-.098),l(-.043,-.494),l(.277,-.369),l(.311,-.101),l(.476,.068),l(.287,-.058),l(.261,-.185),l(.255,-.326),l(-.009,-.508),l(-.87,-.968),l(-.434,-.675),l(-.262,-.083),l(-.39,.171),l(-.509,.483),l(-.287,.058),l(-.47,-.195),l(-.607,-.434),l(-.334,-.689),l(-.338,-.929),l(-.543,-.604),l(-.613,-.575),l(-.45,-.745), +N(217.961,150.385),l(.304,-.043),l(.84,-.27),l(-.17,-.254),l(-.312,-.112),l(-.369,-.056),l(-.651,.016),l(-.497,-.042),l(-.645,.157),l(-1.193,.92),l(-.371,.029),l(-.653,.001),l(-.211,.113),l(-.189,.452),l(-.396,.284),l(-.32,.043),l(-.786,.086),l(.259,-.325),l(.473,-.312),l(-.128,-.593),l(.282,-.382),l(.114,-.099),l(1.258,-.61),l(1.625,-.47),l(1.164,-.087),l(.842,-.157),l(.825,.041),l(.566,-.044),l(.73,.168),l(.848,.083),l(.603,.197),l(.557,.112),l(.477,.013),l(.499,.268),l(.573,.536),l(.382,.253),l(.581,.168),l(.768,.111),l(1.229,.351),l(1.02,.492),l(.453,.31),l(.374,.55),l(.33,.141),l(.479,.041),l(1.704,.519),l(1.018,.167),l(.327,.239),l(-.344,.58),l(.233,.155),l(.559,.042),l(.756,-.072),l(.495,.168),l(.507,.38),l(.591,.281),l(.381,.296),l(-.233,.085),l(-.981,.087),l(-1.15,.398),l(-.626,.058),l(-1.054,-.209),l(-.9,-.041),l(-.934,.186),l(-.943,.115),l(-.484,.029),l(-.449,-.07),l(.353,-.382),l(.728,-.623),l(.173,-.396),L(229,154.204),l(-.181,-.127),l(-.622,-.14),l(-.7,.001),l(-.603,-.112),l(-.651,-.338),l(-.141,-.748),l(-.258,-.536),l(-.218,-.155),l(-.396,-.027),l(-1.005,.044),l(-.836,-.139),l(-.621,-.225),l(-.956,-.493),l(-.739,-.238),l(-.615,-.069),l(-1.154,-.068),l(-.489,-.098),l(-.855,-.352), +N(634.036,168.444),l(.808,-.64),l(.121,-.438),l(-.002,-.945),l(-.157,-.507),l(-.419,-.703),l(-.979,-1.279),l(-.255,-.464),l(-.107,-.366),l(-.058,-1.524),l(-.435,-.632),l(-.688,-.659),l(-.285,-.535),l(-.052,-.282),l(-.266,-.153),l(-.893,-.192),l(-.403,-.012),l(-.286,.453),l(-.2,.538),l(-.543,.257),l(-.223,.072),l(-.59,-.265),l(-.835,-.348),l(-.346,.03),l(-1.173,1.178),l(-.37,.411),l(-.481,-.138),l(-.145,-.324),l(.027,-.494),l(.117,-.438),l(.528,-1.569),l(.085,-.41),l(-.249,-1.311),l(-.045,-.113),l(-.414,.045),l(-.489,.2),l(-.423,.003),l(-.186,-.154),l(-.066,-.367),l(.106,-.805),l(-.01,-.423),l(-.118,-.168),l(-.295,-.182),l(-.541,-.166),l(.193,-.185),l(.582,-.455),l(.442,-.581),l(.53,-.61),l(.502,-.355),l(.178,.196),l(.321,.21),l(.769,.08),l(.266,-.213),l(.109,-.339),l(-.119,-.521),l(-.228,-.366),l(-.138,-.592),l(.043,-.325),l(.24,-.241),l(.679,-.314),l(.45,.745),l(.613,.575),l(.543,.604),l(.338,.929),l(.334,.689),l(.607,.434),l(.47,.195),l(.287,-.058),l(.509,-.483),l(.39,-.171),l(.262,.083),l(.434,.675),l(.87,.968),l(.009,.508),l(-.255,.326),l(-.261,.185),l(-.287,.058),l(-.476,-.068),l(-.311,.101),l(-.277,.369),l(.043,.494),l(.162,.098),l(1.234,.741),l(.632,.476),l(.637,.646),l(.698,.772),l(1.683,2.121),l(.57,.914),l(.471,.52),l(.685,.391),l(.358,.308),l(.136,.395),l(-.226,.439),l(.072,.282),l(.529,.477),l(.214,.437),l(.064,.578),l(-.155,.918),l(-.209,.114),l(-.975,.429),l(-.3,.072),l(-.373,-.351),l(-.444,-.181),l(-.476,.186),l(-.392,.285),l(.107,.296),l(.187,.182),l(.103,.211),l(-.095,.24),l(-.248,.058),l(-.469,-.251),l(-.341,-.111),l(-.736,-.165),l(-.533,-.251), +N(60.074,72.607),l(-.099,.228),l(-.491,.472),l(-.395,.183),l(-.462,.062),L(58,73.461),l(-.961,-.362),l(-.153,-.197),l(.169,-.289),l(.54,-.274),l(.341,-.32),l(.716,.364),l(.3,.091),l(.465,-.26),l(.215,-.213),l(.064,-.366),l(.485,-.047),l(1.107,.135),l(.536,.334),l(.133,.213),l(-.756,.062),l(-.429,0),l(-.59,.184),l(-.11,.092),M(40.092,77.571),l(-.729,-.029),l(-.097,-.24),l(.011,-.3),l(.802,-.243),l(.326,-.211),l(.593,-.423),l(.448,-.137),l(.646,-.077),l(1.427,.253),l(.711,.24),l(-.079,.211),l(-.303,.046),l(-.754,-.074),l(-.496,.031),l(-1.077,.183),l(-.269,.226),l(-1.161,.543),M(38.426,77.979),l(-.515,-.209),l(-.139,-.285),l(.381,-.227),l(.674,.27),l(.093,.195),l(-.122,.15),l(-.372,.105),M(37.896,78.449),l(-.256,.084),l(-.558,.151),l(-1.109,-.058),l(-.387,.135),l(-.398,.434),l(-.31,.15),l(-.854,-.207),l(-.135,-.224),l(.497,-.359),l(.5,-.315),l(.955,-.166),l(.863,-.346),l(.39,.089),l(.461,.224),l(.341,.409),M(29.628,81.29),l(-.168,-.594),l(-.324,-.476),l(.839,-.136),l(.424,.088),l(.436,.238),l(-.244,.268),l(-.26,.06),l(-.073,.297),l(-.22,.09),l(-.412,.164),M(27.543,81.591),l(-.39,.031),l(-.741,.165),l(-.311,-.133),l(-.088,-.178),l(.104,-.119),l(.336,-.268),l(.294,-.09),l(.584,.222),l(.212,.371),M(54.394,157.986),l(-.559,-.356),l(-.044,-.884),l(-.243,-.677),l(.482,-.402),l(-.035,-.2),l(-.156,-.26),l(.052,-.149),l(.173,-.046),l(.354,.158),l(.652,.279),l(.593,.425),l(-.015,.275),l(.238,.046),l(.12,.287),l(.306,.149),l(-.062,.161),L(56,156.933),l(-.172,.204),l(-.766,.195),l(-.374,.23),l(-.295,.425),M(23.015,59.92),l(-1.613,-.646),l(-.75,-.205),l(-.792,-.062),l(-.9,.065),l(-.291,-.095),l(-.431,-.222),l(.179,-.287),l(.516,-.049),l(1.135,.221),l(.579,-.001),l(.543,-.081),l(.538,-.001),l(.828,.285),l(1.725,.362),l(.429,.237),l(.046,.111),l(-.569,-.03),l(-.646,.033),l(-.527,.365),M(99.855,70.993),l(.467,.929),l(-.071,.167),l(-.879,-.272),l(-.621,-.075),l(.067,.441),l(-.056,.228),l(-.935,-.607),L(97.03,71.41),l(.396,-.458),l(.263,-.153),l(.612,-.078),l(.784,.38),l(.771,-.108),M(100.975,73.606),l(.128,.272),l(-.086,.273),l(-.318,.483),l(-.559,-.815),l(-.597,-.909),l(-.04,-.228),l(.095,-.213),l(.407,.029),l(.568,.197),l(.402,.91),M(106.858,78.207),l(-1.872,-1.166),l(-.566,-.555),l(.01,-.467),l(-.559,-.843),l(.071,-.106),l(.456,.06),l(.274,.256),l(1.165,.48),l(.086,.196),l(-.059,.136),l(-.149,.226),l(.296,.436),l(.839,.374),l(.007,.974),M(140.191,127.819),l(-.043,-.094),l(-.198,-.36),l(-.049,-.067),l(-.032,.042),l(-.028,.05),l(-.04,-.092),l(.002,-.664),l(-.331,-.604),l(-.472,-.451),l(-.661,-.451),l(-.512,-.197),l(-.114,-.052),l(-.145,.034),l(.002,.092),l(-.088,.025),l(-.1,-.042),l(-.146,-.143),l(.076,-.076),l(-.073,-.202),l(-.228,-.252),l(-.283,-.025),l(-.312,.084),l(-.932,-.336),l(-.286,-.328),l(-.428,-.244),l(-.383,.042),l(-.932,-.16),l(-.721,.051),l(-.12,-.185),l(-.234,-.067),l(-.046,-.177),l(.094,-.117),l(-.157,-.504),l(.133,-.464),l(-.227,-.096),l(-.127,.008),l(-.249,-.134),l(0,-.101),l(.075,-.093),l(-.029,-.219),l(-.347,-.185),l(-.254,-.286),l(-.415,-.219),l(-.391,-.623),l(-.202,-.076),l(-.203,-.311),l(-.409,-.219),l(-.156,-.529),l(-.002,-.227),l(.178,.007),l(.147,-.164),l(.029,-.326),l(-.208,-.251),l(-.192,-.045),l(-.22,.037),l(-.303,-.126),l(-.535,-.514),l(.078,-.21),l(-.091,-.312),l(-.129,-.067),l(-.044,-.463),l(.058,-.152),l(.119,-.025),l(.099,.067),l(.073,.076),l(-.086,.101),l(.153,.202),l(.285,.126),l(.116,.118),l(.203,.017),l(-.385,-.564),l(-.183,-.144),l(-.021,-.236),l(-.184,-.109),l(-.051,-.344),l(-.13,.006),l(-.011,.144),l(.048,.446),l(-.093,.017),l(-.293,-.194),l(-.119,.042),l(-.516,-.404),l(-.136,-.363),l(-.377,-.514),l(-.531,-.379),l(-.624,-.583),l(-.123,-.142),l(.114,-.101),l(-.327,-.751),l(.161,-.43),l(-.254,-.479),l(-.22,-.355),l(-.738,-.782),l(-.104,-.299),l(.099,-.627),l(.252,-.628),l(.166,-.357),l(.059,-.856),l(-.215,-.785),l(-.692,-1.486),l(-.153,-.916),l(.096,-.287),l(.231,-.244),l(.402,-.201),l(.365,-.717),l(-.365,-.573),l(-.066,-.33),l(.424,-1.593),l(.153,-.575),l(.061,-.634),l(.091,-.778),l(.019,-.179),l(-.153,-.16),l(.08,-.231),l(-.103,-.167),l(.157,-.077),l(-.03,-.186),l(-.046,-.186),l(-.031,-.103),l(-.004,-.058),l(.322,.096),l(.209,-.019),l(.062,-.097),l(-.211,.006),l(-.614,-.122),l(.062,-.707),l(-.103,-.328),l(.017,-.277),l(.587,-.225),l(-.345,-.019),l(-.16,-.142),l(-.129,0),l(-.053,.045),l(.042,.116),l(-.12,.052),l(-.133,-.979),l(-.927,-1.463),l(-.017,-.465),l(.129,-.131),l(.544,.086),l(.632,.217),l(.785,.114),l(.641,.028),l(.546,-.044),l(.415,.086),l(.547,.318),l(.039,.435),l(-.42,.407),l(-.413,.347),l(.532,.146),l(.184,.188),l(.251,.169),l(.029,-.228),l(.161,-.232),l(.393,-.305),l(.21,-.581),l(.102,-.465),l(-.064,-.421),l(-.356,-.958),l(-.158,-.305),l(-.655,-.516),l(.194,.013),l(2.579,.001),l(1.335,.022),l(4.588,-.025),l(3.938,.008),l(2.87,-.001),l(1.687,.006),l(5.117,-.028),l(.74,.011),l(4.13,.021),l(1.089,-.035),l(3.821,.023),l(.875,-.005),l(3.617,-.004),l(4.84,.018),l(.601,-.003),l(2.935,.014),l(2.131,-.012),l(2.781,.029),l(2.915,-.016),l(2.105,.003),l(1.348,-.007),l(2.798,.029),l(2.687,-.029),l(.68,.003),l(-.387,-.588),l(-.131,-.347),l(.501,-.036),l(.896,.748),l(.279,.371),l(.468,.46),l(.833,.451),l(.518,-.076),l(1.425,.208),l(.02,.185),l(.271,-.012),l(.338,.48),l(.16,-.247),l(.502,.013),l(.241,.271),l(.469,.086),l(.064,.185),l(.506,.098),l(.573,-.141),l(.219,-.06),l(.412,-.191),l(.373,-.075),l(.028,.282),l(.197,.116),l(.855,-.083),l(.474,.041),l(.156,.115),l(.196,.144),l(.542,-.049),l(.707,.074),l(1.469,-.592),l(.805,-.189),l(.797,.227),l(.977,.386),l(3.975,1.576),l(2.15,1.061),l(.101,.429),l(.46,.465),l(.628,-.024),l(.178,.135),l(.184,.294),l(.916,.181),l(.307,.235),l(-.11,.318),l(.26,.33),l(2.529,1.05),l(.876,3.16),l(.054,.545),l(-.028,.746),l(-.377,.576),l(-.294,.544),l(-.264,.433),l(-.414,.294),l(-.707,.525),l(-.044,.218),l(.012,.33),l(.371,.427),l(.497,.169),l(.573,.068),l(.524,-.117),l(.925,-.506),l(.939,-.478),l(.88,-.262),l(.919,-.062),l(.944,-.163),l(1.464,-.452),l(.875,-.427),l(-.047,-.362),l(-.16,-.471),l(-.018,-.319),l(.162,-.375),l(.47,-.203),l(.93,-.091),l(1.123,.01),l(1.305,.138),l(1.156,-.197),l(.44,-.275),l(.163,-.512),l(.146,-.434),l(.545,-.164),l(1.754,-.814),l(.534,-.305),l(.968,-.523),l(1.76,-.009),l(2.508,.029),l(1.855,.004),l(1.093,.095),l(.174,-.375),l(.363,-.435),l(.402,-.06),l(1.161,.124),l(1.139,-1.45),l(1.139,-2.22),l(.514,-.626),l(.632,-.526),l(.273,.085),l(.505,.36),l(.381,.085),l(.41,-.176),l(.771,.025),l(.488,.288),l(.174,.274),l(.31,2.819),l(-.077,.229),l(.606,.231),l(.224,0),l(.042,.154),l(-.143,.069),l(.02,.256),l(-.192,.077),l(.16,.291),l(.188,-.153),l(.349,.495),l(-.268,.281),l(.299,-.04),l(.171,.093),l(-.511,.374),l(-.509,.093),l(-.297,-.12),l(-.013,.253),l(-.138,.067),l(-.077,-.107),l(-.231,-.08),l(-.277,.133),l(-.101,.28),l(-.171,-.013),l(-.15,.16),l(-.175,-.347),l(-.746,.28),l(-.204,-.093),l(.12,.413),l(-.666,-.213),l(.199,-.48),l(-.149,-.04),l(-.364,.52),l(-.332,.56),l(-.342,.333),l(-.324,-.227),l(-.249,.439),l(-.346,-.08),l(.122,-.307),l(-.325,.253),l(.165,.16),l(-.326,.293),l(-.318,-.133),l(.105,-.226),l(-.654,.253),l(.065,.359),l(-.264,.04),l(-.161,.373),l(-.352,.106),l(-.333,.679),l(-.404,.505),l(.173,.146),l(.068,.212),l(.168,.053),l(.083,-.08),l(.169,.013),l(-.122,.146),l(-.547,.106),l(.053,.093),l(-.392,.292),l(-.068,.159),l(.337,.027),l(.282,.093),l(.599,.704),l(.055,.398),l(.399,.106),l(.691,-.239),l(-.022,-.186),l(-.14,-.027),l(-.254,-.279),l(-.097,-.04),l(-.009,-.066),l(.196,0),l(.23,.133),l(.218,.358),l(.031,.425),l(-1.599,.292),l(-.032,-.385),l(-.124,-.066),l(-.109,.226),l(-.164,.04),l(-.03,.093),l(-.105,-.106),l(-.159,.266),l(-.164,.04),l(-.294,.04),l(-.045,-.332),l(.198,-.332),l(-.443,.119),l(-.154,-.146),l(-.082,.252),l(-.087,.664),l(-1.429,.132),l(-1.694,.159),l(-1.182,.345),l(-.787,.358),l(-.097,.212),l(-.32,.053),l(-.144,.172),l(-.032,-.04),l(.308,-.756),l(.024,-.106),l(-.071,.027),l(-.41,.994),l(-.079,-.08),l(-.406,.292),l(.218,.318),l(.553,.093),l(-.46,1.515),l(-.302,.429),l(-.259,-.092),l(.043,.251),l(-.062,.185),l(-.237,.145),l(-.462,.501),l(-.292,.304),l(-.167,.026),l(-.075,-.119),l(.177,-.31),l(-.113,-.178),l(-.43,.013),l(-.447,-.343),l(-.148,-.053),l(-.329,-.541),l(.315,-.257),l(.151,-.245),l(-.271,.119),l(-.362,.37),l(.489,.845),l(.033,.356),l(.387,.581),l(.28,.066),l(.104,.765),l(-.101,.238),l(-.151,.23),l(-.125,-.013),l(-.487,.666),l(-.396,.798),l(.034,.053),l(-.13,.132),l(-.107,-.125),l(-.374,.725),l(.026,.125),l(-.226,.04),l(-.137,-.263),l(.342,-.864),l(.195,-.29),l(.247,-.119),l(.061,-.237),l(-.093,-.059),l(-.374,.119),l(.226,-.383),l(-.218,.04),l(-.176,-.093),l(.012,-.191),l(.242,-.04),l(-.077,-.33),l(-.439,.296),l(-.241,-.204),l(-.157,.053),l(-.23,-.396),l(.355,-.171),l(.357,-.053),l(-.005,-.06),l(-.604,-.316),l(-.092,.165),l(-.072,0),l(.107,-.323),l(.089,-.02),l(.21,.159),l(.131,-.06),l(-.098,-.224),l(-.353,-.066),l(-.065,-.112),l(.096,-.112),l(.336,.02),l(.193,-.284),l(-.281,.046),l(-.158,-.059),l(.241,-.37),l(.652,-.152),l(-.328,-.06),l(.146,-.409),l(-.28,.093),l(-.096,.132),l(.11,.079),l(-.315,.191),l(-.035,-.224),l(-.093,.053),l(.051,.224),l(-.081,.086),l(-.051,-.158),l(-.097,-.066),l(-.103,.416),l(-.447,-.079),l(.402,.501),l(-.294,.666),l(.07,.237),l(.272,.488),l(-.055,.139),l(-.466,-.317),l(-.1,-.211),l(.026,.205),l(.174,.218),l(.421,.237),l(.132,.508),l(-.631,-.402),l(-.354,-.007),l(-.118,-.283),l(-.155,-.053),l(.066,.25),l(-.541,-.323),l(-.33,.04),l(.015,-.29),l(.427,-.323),l(-.428,.079),l(-.19,.468),l(.204,.231),l(.457,.046),l(.202,.25),l(.954,.297),l(-.047,.092),l(.554,.165),l(.158,.132),l(-.22,.468),l(-.227,.06),l(-1.042,-.804),l(.708,.811),l(.626,.171),l(-.248,.092),l(.323,.079),l(-.045,.079),l(.061,.06),l(-.034,.25),l(-.312,-.191),l(-.071,.073),l(.104,.211),l(-.216,.02),l(-.656,-.56),l(-.023,.026),l(.419,.475),l(.309,.158),l(.182,-.026),l(.191,.21),l(.018,.31),l(-.298,.059),l(-.492,-.534),l(-.474,-.198),l(-.199,.16),l(.046,.044),l(.44,.145),l(.488,.382),l(-.047,.237),l(.442,-.033),l(.031,-.119),l(.748,.119),l(.151,.382),l(.406,1.212),l(.448,.803),l(-.14,-.092),l(-.262,-.349),l(-.059,-.132),l(-.359,-1.172),l(-.147,-.277),l(-.056,.31),l(.135,0),l(.034,.198),l(-.292,-.066),l(.173,.283),l(.144,.099),l(.228,.58),l(-.144,-.053),l(-.211,-.382),l(.002,.224),l(-.52,-.303),l(-.06,.059),l(.266,.303),l(-.247,.119),l(-.526,-.204),l(.225,.204),l(-.375,.211),l(-.173,-.02),l(-.251,-.21),l(-.024,-.217),l(.083,-.158),l(-.081,-.053),l(-.091,.204),l(.044,.23),l(.116,.211),l(-.107,.158),l(.894,.02),l(.571,-.145),l(.125,.165),l(-.113,.191),l(-.072,.369),l(.14,.066),l(.092,-.257),l(.135,-.369),l(.18,-.105),l(.266,.31),l(.047,.296),l(-.166,.25),l(-.163,-.013),l(-.063,-.099),l(-.316,.474),l(-.254,.197),l(-.483,-.053),l(-.203,-.065),l(-.147,-.066),l(-.136,-.245),l(-.151,.014),l(.141,.244),l(-.075,.013),l(-.538,-.125),l(-.436,-.151),l(.162,.185),l(.269,.026),l(.833,.335),l(-.034,.119),l(-.396,.145),l(.247,.007),l(-.19,.25),l(-.281,.138),l(-.149,0),l(-.481,-.375),l(.242,.395),l(.43,.164),l(.302,-.171),l(.292,.026),l(.11,-.204),l(.04,.178),l(.217,.04),l(.048,.079),l(-.428,.322),l(-.013,.085),l(-.261,.072),l(-1.498,.214),l(-.865,.895),l(-.487,.609),l(-.13,.127),l(-.935,.143),l(-.528,.128),l(-.617,.241),l(-.678,.539),l(-.225,.424),l(-.096,.354),l(-.819,.694),l(-.693,.383),l(-.429,.199),l(-.797,.086),l(-.35,.58),l(-.177,.198),l(-.809,1.125),l(-.273,.781),l(-.459,1.249),l(.236,1.455),l(.387,.925),l(.456,.873),l(.934,1.562),l(.352,1.746),l(.486,1.194),l(-.075,.092),l(.287,.276),l(.123,.333),l(.062,.827),l(-.301,1.536),l(-.064,.278),l(-.31,.415),l(.108,.424),l(-.02,.252),l(-.393,.551),l(-.017,-.092),l(.129,-.241),l(-.025,-.138),l(-.256,.035),l(-.38,.137),l(-.291,-.126),l(-.509,.138),l(-.12,-.329),l(.014,-.233),l(-.567,-1.068),l(-.764,-.138),l(-.204,-.352),l(-.113,-.819),l(-.423,-.229),l(-.144,-.702),l(-.373,.093),l(-.608,-1.08),l(-.375,-.482),l(.296,0),l(.375,-.438),l(.048,-.226),l(-.167,-.226),l(-.471,.407),l(-.277,-.208),l(.126,-.573),l(.147,-.758),l(.158,-1.043),l(-.293,-.452),l(-.258,-.169),l(-.496,-.126),l(-.832,-.987),l(-.875,-.804),l(-.528,-.168),l(-.43,.072),l(-.536,.298),l(-.456,.354),l(-1.202,.299),l(-.273,-.213),l(-.131,-.62),l(-.253,-.254),l(-.264,-.113),l(-.752,-.069),l(-.516,-.296),l(-.22,-.233),l(-.504,.138),l(-1.052,.115),l(-.653,-.184),l(-.047,.298),l(-.64,.099),l(-.183,0),l(-.578,-.926),l(-.238,.781),l(-.447,-.135),l(-.65,.001),l(-1.328,-.04),l(-.672,.439),l(-.39,.055),l(-1,-.459),l(-.096,.009),l(-.142,.014),l(-.362,.528),l(.201,.229),l(.303,0),l(.211,0),l(.537,-.207),l(.406,.092),l(.676,.482),l(-.68,.373),l(.02,.254),l(.263,.353),l(.593,.146),l(.229,.217),l(.35,.334),l(-.533,.136),l(-.503,-.084),l(-.276,-.419),l(-.79,-.271),l(-.224,-.211),l(-.265,-.056),l(-.013,.02),l(-.209,.32),l(.209,.154),l(.248,.183),l(-.248,.179),l(-.069,.05),l(-.447,-.459),l(-.476,.192),l(-.287,.291),l(-1.025,-.472),l(-.419,-.494),l(-1.16,-.642),l(-.615,.066),l(.554,.393),l(-.307,.187),l(-1.17,-.083),l(-.886,-.252),l(-.896,-.168),l(-1.547,.173),l(-.632,.328),l(-.392,-.015),l(-.433,-.031),l(-.135,-.49),l(-.333,.057),l(-.112,.184),l(.474,.731),l(-.877,.64),l(-.808,.577),l(-.915,.317),l(-.419,.043),l(-.414,-.056),l(-.728,-.111),l(-.126,.198),l(.437,.437),l(-.239,.396),l(-.327,.199),l(-.631,.114),l(-.737,.27),l(-.268,.17),l(.558,.352),l(.111,.169),l(-.659,.694),l(-.154,.297),l(-.012,.848),l(.144,.636),l(.271,.762),l(.425,.903),l(-.347,-.119),l(-.816,-.377),l(-.296,.001),l(-.416,.116),l(-.264,-.069),l(-1.029,-.56),l(-.921,-.32),l(-.375,-.365),l(-.336,-.592),l(-.332,-.932),l(-.078,-.467),l(-.268,-.253),l(-.657,-.576),l(-.845,-1.042),l(-.744,-1.227),l(-.663,-1.029),l(-.363,-.366),l(-.412,-.252),l(-.783,-.321),l(-.475,-.082),l(-.643,.018),l(-.468,.201),l(-.576,.541),l(-.418,.413),l(-.283,.37),l(-.416,.158),l(-.501,-.011),l(-.337,-.069),l(-1.104,-.503),l(-1.092,-.659),l(-.445,-.549),l(-.318,-.847),l(-.284,-.678),l(-.179,-.226),l(-.708,-.491),l(-.837,-.519),l(-.766,-.632),l(-.631,-.662),l(-.209,-.112),l(-1.892,-.046),l(-1.858,-.003),l(-.096,.892),l(-.213,.101),l(-1.867,.011),l(-.966,-.037),l(-1.544,-.02),l(-1.662,-.019),l(-.338,-.055),l(-3.516,-1.112),l(-2.811,-.933),l(-1.186,-.39),l(-.267,-.154),l(-.316,-.31),l(-2.381,.084),l(-2.367,.155),l(-.34,.017),M(49.818,152.776),l(-.122,.086),l(-.279,.03),l(-.111,-.131),l(-.177,-.005),l(-.324,.051),l(-.304,-.39),l(-.071,-.263),l(.339,-.01),l(.299,-.253),l(.188,.218),l(.106,.294),l(.223,.096),l(.233,.279),M(52.785,154.312),l(-.155,-.081),l(-.085,-.356),l(-.461,-.321),l(.095,-.229),l(.143,-.058),l(.366,.209),l(.344,.055),l(.616,.356),l(-.005,.172),l(-.294,.184),l(-.563,.069),M(111.683,77.224),l(-.138,.415),l(-.45,.067),l(-.324,.113),l(-.295,.247),l(-.321,-.137),l(-.185,-.21),l(.087,-.443),l(.086,-.443),l(-.438,-.675),l(-.463,-.319),l(-.199,-.271),l(-1.281,.055),l(-.437,.098),l(-.153,.161),l(-.496,.097),l(-.019,-.193),l(-.034,-.432),l(.212,-.272),l(.184,-.212),l(-.378,-.347),l(-.641,-.438),l(-.693,-.696),l(-.723,-.317),l(-.453,-.136),l(.132,-.35),l(-.569,-.592),l(-.099,-.213),l(.371,-.229),l(-.068,-.122),l(-.301,-.152),l(-.445,-.076),l(-.392,-.274),l(-.237,-.259),l(-.57,-.305),l(-1,-.411),l(-.479,-.765),l(-.217,-.583),l(-.367,-.399),l(-.357,.016),l(-.101,.814),l(.42,.873),l(.104,.306),l(-.047,.153),l(-.701,-.136),l(-.272,-.076),l(-.511,-.504),l(-.4,-.459),l(-.537,.139),l(-1.219,-.228),l(1.263,.718),l(.032,.214),l(-1.62,.171),l(-1.093,-.35),l(-1.388,-.948),l(-.543,-.292),l(-.664,-.043),l(-.079,0),l(-.933,-.213),l(-1.3,-.536),l(.928,-.248),l(.135,-.169),L(90.8,67.129),l(-.384,-.153),l(-.792,.156),l(-.454,.14),l(-.656,.017),l(-1.058,-.06),l(-1.068,-.245),l(.027,-.247),l(-.148,-.186),l(-.325,-.108),l(-.359,.016),l(-.47,.202),l(-1.036,.049),l(-1.465,-.122),L(80.46,66.64),l(-.786,-.091),l(-.248,-.108),l(-.651,-.387),l(-.427,-.527),l(-.301,.218),l(-.788,.157),l(-.89,-.293),l(-.234,-.326),l(-.417,-.139),l(-.872,-.248),l(-1.538,-.23),l(-.817,-.248),l(-.671,-.342),l(-.553,.235),l(-.675,.079),l(.06,.437),l(-.193,.062),l(-.389,.25),l(-.249,.405),l(1.119,.293),l(.174,.294),l(-.096,.388),l(-.428,.449),l(-.458,.001),l(-.804,-.214),l(-.586,-.061),l(-.568,.094),l(-.978,.603),l(-1.066,.217),l(-.936,.448),l(-1.035,.448),l(-1.095,.109),l(.178,-.308),l(.063,-.123),l(.72,-.401),l(-.093,-.385),l(-.655,-.523),l(.004,-.108),L(64.1,66.19),l(.411,-.482),l(.157,-.42),l(.736,-.312),l(.87,-.235),l(1.165,-.018),l(1.085,.123),l(.239,-.156),l(-1.239,-.466),l(-.971,-.389),l(-1.043,.049),l(-.226,.219),l(-.449,.095),l(-.573,.438),l(-.865,.375),l(-1.019,.282),L(61.553,65.9),l(-.406,.094),l(-.298,.14),l(.131,.325),l(-.177,.526),l(-.563,.34),l(-.564,.078),L(59,67.544),l(-.592,.278),l(-.681,.601),l(-.035,.292),l(.38,.168),l(.36,.03),l(.667,.106),l(.465,.229),l(-.075,.184),l(-.43,.338),l(-.625,.2),l(-.557,.277),l(-.423,.398),l(-.544,.383),l(-.675,.093),l(-1.434,.308),l(-.678,.397),l(-1.036,.337),l(-.7,.367),l(.52,.5),l(-.1,.167),l(-1.106,.412),l(-.897,.153),l(-.778,.168),L(49.51,74.19),l(-1.214,.456),L(48.1,74.828),l(-.274,.394),l(-.753,.439),l(-1.193,.229),l(-1.234,.184),l(-.973,-.345),l(.001,-.181),l(.332,-.348),l(.763,-.273),l(.306,-.212),l(.445,-.364),l(1.171,-.441),l(1.403,.073),l(-.12,-.212),l(.02,-.516),l(.47,-.304),l(.725,-.291),l(.754,-.366),l(.266,-.214),l(.002,-.731),l(.246,-.749),l(.693,-.49),l(.194,-.398),l(.034,-.412),l(-.633,.122),l(-1.251,.186),l(-.676,-.029),l(-.5,-.597),l(-.266,.062),l(-.613,.216),l(-.136,.23),l(.239,.352),l(.021,.352),l(-.169,.046),L(47,70.115),l(-.567,-.32),l(-.487,-.397),l(-.509,-.291),l(-.56,-.03),l(-.812,-.106),l(-.91,.094),l(.028,.138),l(-.644,.338),l(-1.175,.14),l(-.649,-.09),l(-.064,-.123),l(-.082,-.107),l(-.125,-1.028),l(.3,-.508),l(-.142,-.431),l(-.864,-1.002),l(-1.43,.437),l(-.738,.078),l(-.406,.202),l(-1.091,.094),l(-.4,-.23),l(-.394,-.355),l(-.466,-.325),l(-1.007,-.463),l(-.179,-.28),l(.292,-.171),l(.337,-.437),l(.704,.139),l(1.312,.309),l(.69,.03),l(.238,-.234),l(-.375,-.482),l(-.458,-.264),l(-.363,0),l(-.541,.22),l(-.528,-.015),l(-1.342,-.513),l(-.623,-.186),l(-.197,.016),l(-.858,-.029),l(-.024,-.078),l(-.623,-.985),l(.79,-.19),l(.071,-.456),l(.495,-.221),l(.102,-.299),l(.227,-.347),l(.893,-.491),l(.337,-.38),l(.386,-.301),l(.527,-.476),l(.39,-.175),l(.719,.109),l(.98,.268),l(.485,.094),l(.752,-.144),l(.427,-.254),l(.675,-.429),l(1.252,-.257),l(.774,-.033),l(.955,-.049),l(.354,-.175),l(.187,-.478),l(-.259,-.669),l(-.814,-.686),l(.026,-.096),l(.927,-.034),l(.343,-.256),l(-.25,-.384),l(-.497,-.256),l(-.367,-.08),l(-1.88,.389),L(39.33,56.53),l(-.534,.289),l(-.496,.065),l(-1.907,-.333),l(-.848,-.031),L(34.8,56.49),l(-1.27,.162),l(-1.265,-.029),l(-1.349,-.174),l(-.53,-.207),l(-.183,-.788),l(.144,-.146),l(.636,-.033),l(1.008,-.002),l(.446,-.179),l(-1.057,-.241),l(-1.912,-.304),L(28.13,54.31),l(-1.285,-.208),l(.219,-.114),l(.781,-.262),l(1.568,-.214),l(1.325,-.328),l(.958,-.214),l(1.058,-.361),l(.953,-.23),l(1.399,-.281),l(1.513,.128),l(-.158,.523),l(.023,.277),l(1.051,.161),l(1.359,.095),l(1.074,-.019),l(.657,-.099),l(.784,-.246),l(.55,-.295),l(.262,-.083),l(.752,.064),l(.751,.113),l(1.021,-.051),l(.2,-.327),l(.007,-.18),l(-.689,-.064),l(-1.946,-.292),l(-1.283,-.047),l(-.312,-.755),l(-1.473,-.162),l(-.96,-.031),l(-1.573,-.096),l(-.194,-.511),l(-.484,-.312),l(-1.042,-.461),l(-.512,-.148),l(-2.66,-.659),l(-2.008,-.545),l(.317,-.167),l(.812,-.402),l(.086,-.485),l(2.136,-.054),l(.99,-.069),l(1.829,-.288),l(.784,-.354),l(.452,-.623),l(.788,-.575),l(.616,-.525),l(.818,-.41),l(.742,-.224),l(1.066,-.104),l(1.133,-.241),l(1.047,-.036),l(1.804,.065),l(.146,-.188),l(-.156,-.205),L(44.47,42.83),l(.018,-.206),l(1.936,-.089),l(1.143,.032),l(.974,-.054),l(1.344,-.14),l(1.098,-.416),l(.918,-.417),l(.957,-.019),l(.282,.051),l(.675,.241),l(.156,.172),l(-.383,.139),l(.017,.344),l(1.049,.136),l(.424,.034),l(.536,-.293),l(.297,-.208),l(1.419,.187),l(1.534,.049),l(1.062,.049),l(.715,.033),l(.711,.257),l(.359,.274),l(.783,.358),l(.494,.085),l(.421,-.086),l(1.292,.117),l(1.124,.015),l(1.556,-.054),l(1.449,-.088),l(1.213,.1),l(1.377,.254),l(.883,.118),l(3.424,.13),l(1.279,.168),l(.743,.169),l(2.027,-.038),l(2.339,-.141),l(1.123,.236),l(2.441,.791),l(1.206,.301),l(.227,.008),l(.102,.483),l(-.003,2.855),l(.039,2.259),l(.052,2.335),l(.129,2.796),l(-.026,2.183),l(-.043,4.334),l(.026,2.167),l(.089,1.046),l(.196,.279),l(.84,.074),l(2.424,-.122),l(.739,.059),l(.332,.388),l(.173,.387),l(.348,.292),l(2.162,1.318),l(.945,.673),l(.238,-.325),l(.848,-.205),l(1.225,-.67),l(.731,-.498),l(.495,-.126),l(.832,.073),l(.316,.199),l(.371,.492),l(.35,.322),l(2.048,1.175),l(.814,.58),l(1.769,1.768),l(1.67,1.882),l(.512,.393),l(.189,.029),l(.98,.314),l(2.025,.763),l(.402,.255),l(-.163,.788),l(.393,.777), +N(643.755,159.873),l(-1.092,-.52),l(-.637,-.337),l(-.203,-1.284),l(.036,-.282),l(.24,-.241),l(.42,-.241),l(.721,-.623),l(.493,.056),l(.049,-.17),l(.24,-.396),l(.239,.028),l(.573,.225),l(.321,-.312),l(.439,-.001),l(.798,-.171),l(.596,.69),l(-.163,.17),l(-.443,.354),l(-.412,.538),l(-.285,.734),l(.14,.296),l(-.22,.311),l(-.292,.085),l(-1.026,.383),l(-.532,.707),M(627.173,150.012),l(-.679,.314),l(-.24,.241),l(-.043,.325),l(.138,.592),l(.228,.366),l(.119,.521),l(-.109,.339),l(-.266,.213),l(-.769,-.08),l(-.321,-.21),l(-.178,-.196),l(-.153,-.239),l(-.111,-.38),l(-.628,.413),l(-.647,.159),l(-.246,-.083),l(-.378,-.266),l(-.341,-.746),l(-.291,-.379),l(-.481,.045),l(-.507,.003),l(-.228,-.098),l(-.117,-.352),l(.729,-1.584),l(-.033,-.268),l(-.521,-.096),l(-.554,.074),l(-.202,-.324),l(-.277,-1.762),l(-.156,-.126),l(-.479,.017),l(-.771,.089),l(-.819,.442),l(-.312,.086),l(-.216,-.069),l(0,-.268),l(.224,-.58),l(-.163,-.705),l(-.075,-.465),l(.617,-.85),l(.191,-.198),l(.487,-.271),l(.611,-.525),l(.429,-.722),l(.353,-.862),l(-.02,-.875),l(-.195,-1.649),l(-.146,-.14),l(-.504,.031),l(-.287,-.041),l(-.217,-.309),l(-.243,-.901),l(-.397,-.435),l(-.504,-.279),l(-.277,.044),l(-.306,.34),l(-.001,.127),l(-.624,-.081),l(-.73,-.179),l(-.657,-.081),l(-.3,-.055),l(-.102,-.056),l(.138,-.269),l(.354,-.454),l(-.046,-.38),l(-.716,-.715),l(-.455,-.392),l(-1.377,.84),l(-.377,.044),l(-.975,-.319),l(-.286,-.167),l(-.355,.087),l(-.546,.299),l(-1.105,.726),l(-.829,.258),l(-.543,.37),l(-1.123,1.107),l(-.397,.27),l(-.714,.216),l(-.784,.033),l(-.189,.1),l(-.329,-.619),l(-.312,-.209),l(-.371,-.041),l(-1.659,-.047),L(601,137.538),l(-.309,-.294),l(-.417,.016),l(-.149,.103),l(-.348,.239),l(-.609,.539),l(-1.251,1.545),l(-.212,-.662),l(.052,-.861),l(-.139,-.183),l(-.231,-.069),l(-.471,.102),l(-.345,.129),l(-.655,-.159),l(-.339,.281),l(-.341,-.116),l(-.849,.066),l(-.319,-.364),l(-.63,-.281),l(-.407,0),l(-.08,.331),l(-.271,.083),l(-.685,-.38),l(.01,.364),l(-.237,.099),l(-.141,-.463),l(-.54,-.496),l(-.365,.066),l(-.935,-.066),l(-.014,-.265),l(.175,-.396),l(-.326,-.017),l(-.333,.248),l(-1.451,-.893),l(.069,-.281),l(-.178,-.38),l(-.289,-.166),l(-.71,.116),l(-.158,.166),l(-.657,-.794),l(-.454,-.281),l(-.15,.132),l(-.472,-.215),l(-.726,-.595),l(-.867,-.264),l(-.132,-.612),l(-1.079,-.199),l(-.186,.182),l(-.275,-.066),l(-.134,.513),l(-.276,.314),l(-.299,-.05),l(-.24,-.43),l(-.859,-.596),l(-.154,.066),l(-.756,-.248),l(.116,-.364),l(-1.078,-.579),l(-.363,.116),l(-.772,-.843),l(-.383,-.248),l(-.477,.314),l(-.198,-.066),l(-.099,-.43),l(.215,-.215),l(-.272,-.364),l(.104,-.446),l(-.579,-.595),l(-.157,-.694),l(.785,-.198),l(.033,.364),l(.337,.264),l(.368,-.049),l(.376,-.281),l(.578,-.364),l(-.367,-.694),l(.104,-.414),l(-.68,-.099),l(-.044,-.182),l(-.092,-.078),l(-.718,-.096),l(-.294,-.221),l(-.037,-.552),l(-.073,-.589),l(.184,-.184),l(.331,-.221),l(-.221,-.258),l(-.441,-.405),l(-.81,-.11),l(-.221,-.515),l(-.441,-1.03),l(0,-.515),l(-.502,.152),l(-.147,-.126),l(-.305,-.111),l(-1.337,-.104),l(-.565,-.436),l(-.178,-.09),l(-.104,-.199),l(-.239,0),l(-.52,.196),l(-.252,-.281),l(-.198,-.218),l(-.301,-.07),l(.312,-.516),l(-.007,-.501),l(-.213,-.247),l(-.373,-.323),l(-.625,.009),l(-.282,.128),l(-.004,-.456),l(-.554,-.117),l(-.296,-.047),l(-.281,.21),l(-.105,-.112),l(-.313,-.14),l(-.048,-.088),l(-.236,-.012),l(-.01,-.269),l(.574,.059),l(.192,-.145),l(.354,-.136),l(.08,-.249),l(.181,-.185),l(-.2,-.163),l(.152,-.36),l(-.245,-.237),l(.126,-.428),l(-.049,-.123),l(-.152,-.012),l(-.028,-.246),l(.009,-.284),l(-.295,-.494),l(-.273,-.154),l(-.692,-.039),l(-.22,-.06),l(-.229,.162),l(-.463,.045),l(-.325,-.394),l(-.077,-.305),l(.207,-.223),l(-.023,-1.031),l(.011,-.069),l(.139,-.739),l(.129,-.213),l(.274,-.186),l(1.422,-.704),l(1.737,-.734),l(.359,-.03),l(.06,.071),l(.183,.567),l(.344,.055),l(.507,-.145),l(.885,-.132),l(.268,-.243),l(.463,-.784),l(.467,-.472),l(.238,-.03),l(1.248,.235),l(.459,-.017),l(.478,-.102),l(.646,-.345),l(.638,-.701),l(.405,-.301),l(.445,-.145),l(1.338,-.349),l(.97,-.219),l(.325,-.187),l(.051,-.157),l(-.031,-.194),l(-.139,-.86),l(.02,-.399),l(.32,-.401),l(.705,-.546),l(.222,-.33),l(-.119,-.47),l(-.29,-.441),l(-.345,-.627),l(-.03,-1.357),l(-.483,-.141),l(-.366,.06),l(-.232,-.185),l(.068,-.215),l(.215,-.302),l(.393,-.188),l(1.799,-.254),l(1.082,-.207),l(.35,-.06),l(.5,.184),l(1.133,.238),l(.394,-.074),l(.231,-.145),l(.156,-.245),l(-.126,-.286),l(-.622,-.514),l(.137,-.418),l(.286,-.605),l(.438,-.794),l(.516,-1.141),l(.427,-.507),l(1.096,.254),l(.721,.141),l(.594,.141),l(1.402,.079),l(.718,-.062),l(.417,-.103),l(.444,-.392),l(.157,-.39),l(-.213,-.707),l(-.097,-.75),l(.34,-.581),l(.428,-.277),l(1.199,-.093),l(.289,-.06),l(.306,-.219),l(.035,-.478),l(.011,-.275),l(.279,-.262),l(.542,-.148),l(.551,-.034),l(.228,-.014),l(.569,-.003),l(.244,-.074),l(.062,.145),l(.131,.405),l(.24,.563),l(.371,.433),l(1.301,.745),l(.834,.415),l(.614,.069),l(.731,.167),l(.633,.144),l(.354,.143),l(.568,.618),l(1.07,1.451),l(.401,.66),l(-.215,.447),l(-.237,.75),l(-.214,.389),l(-.369,.347),l(-.035,.129),l(.105,.43),l(.233,.229),l(.724,.312),l(1.062,.181),l(1.505,.021),l(.995,.038),l(.668,.083),l(.998,.224),l(.632,.268),l(1.645,.806),l(.839,.31),l(.744,.096),l(.105,.542),l(1.571,2.161),l(.467,.439),l(.444,.254),l(1.979,.018),l(1.241,.207),l(.802,.109),l(1.165,.022),l(2.861,-.059),l(.937,.023),l(1.164,.022),l(1.69,.119),l(.521,.168),l(.815,.551),l(1.006,.365),l(1.599,.433),l(.929,.123),l(.663,-.061),l(.61,.067),l(.253,.297),l(.433,.197),l(.481,-.017),l(.686,-.289),l(1.44,-.534),l(.303,-.101),l(.736,-.274),l(.816,-.289),l(1.204,-.349),l(1.339,-.007),l(1.514,-.065),l(.987,.08),l(.651,-.061),l(1.941,-.737),l(.265,-.172),l(1.111,-1.046),l(.67,-.389),l(1.265,-.292),l(.326,-.259),l(.123,-.271),l(-.188,-.228),l(-.599,-.411),l(-.389,-.569),l(-.003,-.343),l(.214,-.401),l(.539,-.589),l(.457,-.231),l(.316,-.073),l(.718,.154),l(.668,.382),l(.592,.125),l(.982,-.005),l(.744,-.047),l(.742,-.433),l(1.192,-.91),l(.224,.013),l(.438,.012),l(.624,.054),l(.896,-.134),l(.638,-.248),l(.347,-.188),l(.241,-.216),l(.312,-.82),l(.363,-.333),l(.47,-.204),l(.464,-.045),l(.483,.127),l(.353,-.189),l(.831,-.278),l(.539,-.146),l(.937,-.221),l(.854,-.033),l(.432,.099),l(1.074,.008),l(.464,.127),l(.414,-.218),l(.107,-.217),l(-.048,-.273),l(-.599,-.501),l(-.879,-.99),l(-.797,-.5),l(-.538,-.199),l(-.928,-.212),l(-.438,.002),l(-1.191,.786),l(-.292,-.07),l(-.431,-.416),l(-.317,-.085),l(-.576,.018),l(-.754,.062),l(-.929,.395),l(-.342,.045),l(-.051,-.029),l(-.269,-.836),l(.381,-.58),l(1.224,-1.959),l(.687,-1.207),l(.295,-.31),l(.046,.018),l(.452,.172),l(1.126,.574),l(.343,-.016),l(.438,-.089),l(2.44,-.752),l(.779,-.339),l(.123,-.233),l(-.056,-.306),l(-.35,-.348),l(-.062,-.146),l(.103,-.249),l(.422,-.426),l(.416,-.543),l(.667,-.779),l(.599,-.545),l(1.371,-.608),l(.167,-.794),l(-.107,-.249),l(-.465,-.306),l(-.558,-.026),l(-.822,.078),l(.119,-.25),l(.375,-.282),l(1.193,-.787),l(.478,-.165),l(.602,-.136),l(1.854,-.143),l(.836,-.123),l(1.203,-.109),l(.917,-.049),l(1.148,.215),l(1.037,.481),l(.683,.188),l(1.386,-.125),l(.539,.026),l(.763,.467),l(.742,.952),l(1.087,2.384),l(.94,1.588),l(.927,1.903),l(.436,.389),l(.507,.2),l(1.247,.341),l(1.523,.253),l(2.659,.839),l(.205,.144),l(.297,.866),l(.44,1.283),l(.261,.446),l(.68,-.033),l(.649,-.018),l(1.657,-.052),l(.604,-.22),l(.953,-.308),l(1.357,-.31),l(1.181,-.208),l(.902,-.034),l(.246,.114),l(.064,.259),l(.116,.389),l(.017,.504),l(-.566,.407),l(-.66,.393),l(-.291,.707),l(-.278,.893),l(-.538,1.066),l(-.627,1.08),l(-.329,.432),l(-.551,.69),l(-.47,.347),l(-.547,-.098),l(-.679,-.225),l(-.685,-.24),l(-.396,-.041),l(-1.664,.982),l(-.048,.557),l(.332,.897),l(.062,.656),l(-.006,.613),l(-.025,.385),l(-.097,.128),l(.112,.299),l(-.156,.329),l(-.511,.43),l(-1.252,.462),l(-.111,.058),l(-.579,-.68),l(-.247,.001),l(-.253,.129),l(-.383,.358),l(-.23,.713),l(-.955,.532),l(-.62,.259),l(-.538,.017),l(-.452,-.054),l(-.333,-.126),l(-.392,.059),l(-.273,.243),l(-.025,.342),l(.508,.765),l(.046,.113),l(-.527,.159),l(-.975,.048),l(-.508,-.153),l(-.493,-.253),l(-.273,-.396),l(-.448,.017),l(-.386,.13),l(-.686,1.027),l(-.636,.543),l(-1.032,.545),l(-1.533,.604),l(-.52,.329),l(-.415,.442),l(-.379,.528),l(-.066,-.092),l(-.417,.171),l(-1.222,.13),l(-.728,.171),l(-2.248,.925),l(-.632,.37),l(-.566,.469),l(-.604,.271),l(-.336,.015),l(.13,-.255),l(.862,-.682),l(.33,-.354),l(-.47,-.113),l(-.37,.072),l(-.153,-.297),l(.058,-.156),l(.953,-.781),l(.269,-.384),l(.55,-.413),l(.159,-.2),l(-.057,-.298),l(-.73,-.553),l(-.727,-.283),l(-.131,-.014),l(-.628,.03),l(-.166,.015),l(-.494,.371),l(-1.146,1.183),l(-.355,.157),l(-.643,.086),l(-.613,.243),l(-.36,.199),L(665.49,112),l(-.136,.411),l(-.131,.255),l(-.251,.255),l(-.437,.128),l(-.493,-.013),l(-.326,.27),l(-.307,.114),l(-.455,-.565),l(-.355,-.014),l(-.349,.128),l(-.396,.638),l(-.301,.694),l(.088,.34),l(.245,.368),l(.558,.268),l(.8,.268),l(1.21,-.045),l(.29,.254),l(-.019,.538),l(-.123,.581),l(.057,.538),l(.261,.283),l(.733,.069),l(.698,-.157),l(.76,-.525),l(.509,-.497),l(.552,-.228),l(.534,-.128),l(.287,.07),l(.895,.621),l(.543,.197),l(1.023,-.087),l(.361,.027),l(.471,.141),l(.274,0),l(-.248,.708),l(-.057,.552),l(-.612,-.197),l(-.297,-.084),l(-.525,.058),l(-1.677,.555),l(-.707,.44),l(-.072,.735),l(-.522,.157),l(-.146,-.113),l(-.017,-.269),l(-.127,-.084),l(-.501,.114),l(.138,.466),l(-.152,.368),l(-.485,.496),l(-1.397,1.119),l(-.126,.226),l(.039,.55),l(.62,.225),l(.712,.492),l(.785,.521),l(.391,.535),l(.424,1.241),l(.668,.647),l(.175,.437),l(-.13,.677),l(.172,.183),l(.694,.295),l(.399,.592),l(.562,.253),l(.272,.268),l(.087,.31),l(-.049,.155),l(-.789,.369),l(.088,.07),l(.425,.31),l(.314,.79),l(-.019,.296),l(-.141,.184),l(-.534,.043),l(-.651,.213),l(-.948,.552),l(-.849,.213),l(-.629,.297),l(.72,.21),l(.378,.056),l(.944,-.425),l(.488,-.058),l(.162,.056),l(.524,.592),l(.387,.168),l(.456,.027),l(.009,.155),l(-.231,.311),l(-.382,.227),l(-.304,.241),l(.11,.155),l(.326,-.029),l(.202,.084),l(-.184,.325),l(-.298,.749),l(-.192,.649),l(.028,.353),l(-.22,.452),l(-.209,.127),l(-.35,-.338),l(-.146,.142),l(-.569,.763),l(-.401,.622),l(-.215,.622),l(-.127,.296),l(-.595,.425),l(-.251,.438),l(-.254,.184),l(-.569,.029),l(-.382,.227),l(.279,.719),l(-.264,.508),l(.076,.593),l(-.093,.269),l(-.207,.269),l(-.532,.199),l(-.161,.282),l(-.174,.396),l(-.294,.636),l(-.626,.354),l(-.412,.495),l(-.492,-.14),l(-.443,-.069),l(-.142,.113),l(-.145,.198),l(.118,.833),l(-.213,.142),l(-.772,.651),l(-.356,.127),l(-.628,.171),l(-.563,.467),l(-.571,.213),l(-.107,.113),l(-.008,.48),l(-.133,.156),l(-.568,.058),l(-.5,.114),l(-.341,.438),l(-.364,-.126),l(-.52,-.168),l(-.274,.057),l(-.315,.326),l(-.435,.198),l(-.643,.1),l(-.047,-.465),l(-.52,.057),l(-.699,.213),l(-.32,.198),l(-.285,-.042),l(-.401,-.493),l(-.163,-.155),l(-.191,.283),l(.095,.169),l(-.045,.212),l(-.047,.691),l(-.209,.297),l(-.416,.114),l(-.501,-.182),l(-.123,.282),l(-.001,.24),l(-.146,.155),l(-.615,.058),l(-.366,.114),l(-.596,.043),l(-.463,-.211),l(-.217,.1),l(-.439,.48),l(-.227,.071),l(-.774,-.041),l(-.747,.227),l(-.406,.326),l(-.451,-.027),l(-.277,-.084),l(-.011,.057),l(-.069,.353),l(-.29,.396),l(.011,.113),l(.48,.634),l(.269,.126),l(.043,.198),l(-.36,.269),l(-.763,.157),l(-.481,-.719),l(-.241,-.691),l(.012,-.395),l(.396,-.777),l(-.015,-.169),l(-.587,-.253),l(-.226,.071),l(-.206,.297),l(-.454,.072),l(-.676,-.21),l(-.574,-.733),l(-.196,.085),l(-.017,.169),l(-.159,.396),l(-.27,.128),l(-.332,-.056),l(-.481,.043),l(-.055,.038),l(-.197,-.143),l(-.909,-.107),l(-.621,-.166),l(-.943,-.615),l(-.273,-.365),l(-.096,-.521),l(.472,-.75),l(-.056,-.38),l(-.237,-.21),l(-.777,.047),l(-.66,-.053),l(-.771,-.235),l(-.623,-.575),l(-.298,.101),l(-.521,.328),l(-.696,.554),l(-.341,.157),l(-.807,.117),l(-1.595,.052),l(-.332,.115),l(-.584,.413),l(-.325,-.097),l(-.597,-.392),l(-.341,-.012),l(-.515,.13),l(-.483,.229), +N(241.073,156.152),l(.017,.52),l(.098,1.215),l(.012,.212),l(-.379,.455),l(-.011,.17),l(.485,1.358),l(-.669,-.577),l(-.445,-.056),l(-.761,.143),l(-.877,-.012),l(-.666,-.14),l(-.574,-.056),l(-.474,.1),l(-.378,.354),l(-.135,-.042),l(-.993,-.549),l(-.171,-.325),l(.04,-.198),l(.269,-.184),l(1.051,.097),l(.631,.111),l(1.125,.167),l(.654,.041),l(.61,-.185),l(.386,-.156),l(-.198,-.155),l(-.692,-.464),l(-.136,-.296),l(.184,-.707),l(-.202,-.296),l(-.394,-.154),l(-.913,-.14),l(-.305,-.211),l(.04,-.184),l(.119,-.085),l(.344,-.1),l(.724,-.058),l(.781,.125),l(1.081,.294),l(.576,.056),l(.147,-.089), +N(241.295,160.082),l(-.485,-1.358),l(.011,-.17),l(.379,-.455),l(-.012,-.212),l(-.098,-1.215),l(-.017,-.52),l(.503,-.279),l(.393,.14),l(.342,0),l(.384,-.17),l(.369,-.043),l(.14,.198),l(.177,.112),l(1,.309),l(.657,-.072),l(.213,.395),l(.335,.338),l(.528,.324),l(.335,.084),l(.643,.21),l(.916,.45),l(.399,.352),l(.231,.311),l(-.191,.17),l(-.144,.297),l(-.314,.368),l(-.238,-.098),l(-.476,-.592),l(-.378,-.042),l(-.788,.058),l(-.288,-.098),l(-.373,0),l(-.329,.1),l(-.763,.539),l(-.396,-.056),l(-.319,-.494),l(-.166,-.028),l(-.155,.057),l(-.658,.326),l(-.344,.778),l(-.41,.65),l(-.289,-.112),l(-.325,-.551), +N(668.053,167.796),l(-.131,-.099),l(-.74,-.732),l(-.444,-1.255),l(.037,-.424),l(.054,-.706),l(-.292,-.465),l(.18,-.382),l(.978,.704),l(.202,-.424),l(.023,-.41),l(-.101,-.438),l(-.026,-.579),l(.145,-.438),l(.025,-.664),l(.082,-.861),l(.074,-.636),l(.38,-.862),l(.188,-.127),l(.337,-.142),l(.523,.055),l(1.21,.52),l(.576,.042),l(.188,-.212),l(.277,-.17),l(.199,.141),l(.018,.396),l(-.266,.438),l(-.045,.48),l(.14,.79),l(.541,.394),l(.182,.325),l(-.427,1.271),l(-.31,.467),l(-.834,.608),l(-.555,.312),l(-.082,.099),l(.003,.268),l(-.078,.565),l(-.28,.424),l(.127,.211),l(.35,.733),l(.345,1.101),l(.26,.62),l(.093,.028),l(.451,.324),l(.296,.07),l(.161,-.325),l(.485,-.537),l(.197,-.029),l(.418,.112),l(.226,.211),l(.179,.635),l(.286,.353),l(.326,.084),l(.505,-.58),l(.621,.267),l(.141,.028),l(.078,.127),l(-.168,.156),l(-.378,.156),l(-.208,.212),l(.936,1.226),l(-.315,.184),l(-.568,-.196),l(-.404,-.098),l(-.094,-.48),l(-.229,-.31),l(-.599,-.535),l(-.753,-.577),l(-.258,0),l(-.099,.226),l(.371,.776),l(-.218,.283),l(-.727,-.775),l(-.982,-.548),l(-.309,.015),l(-.344,.142),l(-.182,.255),l(-.14,.071),l(-.395,.057),l(-.322,-.225),l(-.591,-.366),l(-.195,-.423),l(.64,-.608),l(.323,.211),l(.358,.084),l(.4,-.199),l(-.151,-.169),l(-.713,-.295),l(-.422,-.395),l(-.522,-.168),l(-.239,.607),M(669.676,172.974),l(-.452,-.366),l(-.349,-.408),l(-.051,-.226),l(-.364,-1.114),l(-.459,-.521),l(.685,-.058),l(.868,.012),l(.314,.169),l(.274,.451),l(.028,.861),l(-.097,.48),l(-.214,.283),l(-.185,.438),M(679.073,175.368),l(-.562,-.267),l(-.178,-.254),l(-.237,-.169),l(-.064,-.127),l(.139,-.339),l(-.091,-.423),l(-.55,-.352),l(-.662,-.479),l(-.147,-.466),l(.513,-.1),l(1.017,-.143),l(.371,.112),l(.283,.409),l(.069,.818),l(.123,.805),l(.257,.79),l(-.112,.127),l(-.167,.057),M(671.406,176.824),l(.022,-.353),l(.186,-1.342),l(.061,-1.172),l(.482,.395),l(.576,.281),l(.366,.028),l(.634,-.185),l(.027,.438),l(-.079,.396),l(-.24,.269),l(-.184,.198),l(-.908,.651),l(-.943,.397),M(664.721,177.812),l(-.366,-.027),l(.127,-.297),l(.202,-.099),l(.314,-.396),l(.265,-.523),l(.082,-.607),l(.138,-.509),l(.326,-.184),l(.14,.183),l(-.16,.283),l(.276,.55),l(.212,.564),l(-.108,.113),l(-.664,.354),l(-.406,.368),l(-.377,.227),M(673.781,179.981),l(-.385,-.366),l(-.828,-.591),l(-.206,-.38),l(.099,-.368),l(.565,-.213),l(.22,-.269),l(.487,-1.822),l(.438,-.185),l(.271,.028),l(.113,.126),l(.049,.282),l(-.373,.905),l(-.089,.226),l(-.315,1.413),l(.165,.296),l(.214,.465),l(-.213,.41),l(-.212,.043),M(661.179,181.308),l(-.317,-.042),l(.215,-.48),l(.343,-.467),l(.35,-.34),l(.592,-.354),l(.636,-.496),l(.933,-1.089),l(.11,.55),l(-.118,.424),l(-.267,.297),l(-.24,.184),l(-.516,.213),l(-.172,.127),l(-.244,.622),l(-.327,.269),l(-.591,.171),l(-.386,.41),M(680.678,185.402),l(-.201,-.098),l(-.098,-.438),l(-.361,-.748),l(-.297,-.112),l(-.381,.608),l(-.361,.82),l(.246,.38),l(.166,.395),l(.148,.677),l(-.158,.495),l(-.383,.509),l(-.305,-.253),l(-.176,-.268),l(.201,-.41),l(-.076,-.325),l(-.363,-.07),l(-.361,.665),l(-.173,-.056),l(-1.114,-.619),l(-.557,-.549),l(-.206,-.508),l(-.037,-.635),l(.466,-.905),l(-.108,-.479),l(-.466,-.409),l(-.778,-.295),l(-.292,.043),l(-.062,.17),l(-.129,.226),l(-.5,.255),l(-.661,.058),l(-.027,-.494),l(-.174,-.24),l(-.399,.199),l(-.504,.961),l(-.525,.863),l(-.219,-.084),l(-.119,-.127),l(-.034,-.197),l(.054,-.311),l(.359,-.749),l(.185,-.537),l(.263,-.283),l(.383,-.184),l(.564,-.044),l(.219,-.127),l(.134,-.466),l(.205,-.156),l(.549,-.241),l(.777,-.101),l(.292,.353),l(.102,.72),l(.317,-.156),l(.485,-.058),l(.207,-.184),l(.207,-.565),l(.358,-.255),l(.479,.21),l(.186,.084),l(.158,-1.087),l(.29,-.015),l(.264,.465),l(.315,-.481),l(.205,-.142),l(.392,.098),l(.133,-.227),l(-.048,-.706),l(-.172,-.564),l(.146,-.353),l(.413,.549),l(.711,.803),l(.229,.48),l(.083,.324),l(-.336,.735),l(.237,.226),l(.537,-.1),l(.076,.423),l(-.114,.424),l(.056,.692),l(.207,.437),l(-.002,.438),l(-.111,.424),l(-.283,.579),l(-.332,.622), +N(251.898,160.229),l(-.547,-.112),l(-.073,-.212),l(.051,-.551),l(-.109,-.24),l(.11,-.17),l(.235,-.071),l(.543,.069),l(.404,-.015),l(1.505,.11),l(.393,.168),l(.113,.141),l(-.188,.354),l(-.07,.099),l(-.283,.227),l(-.335,.043),l(-.739,-.083),l(-.657,.072),l(-.354,.17), +N(228.82,160.519),l(-.299,-.056),l(-.693,-.224),l(-.229,-.268),l(-.47,-.366),l(-.465,-.084),l(-.142,-.211),l(.53,-.284),l(.704,-.072),l(1.364,.251),l(.97,.351),l(.651,.267),l(.279,.282),l(-.04,.198),l(-.332,.071),l(-.751,-.295),l(-.543,.058),l(-.227,.255),l(-.308,.128), +N(400.72,175.499),l(-.595,-.119),l(-.161,-.032),l(-.976,.458),l(-1.429,-.006),l(-.867,-.037),l(-2.119,.041),l(-.271,.157),l(-.125,.34),l(.261,1.934),l(.02,.41),l(-.191,.17),l(-.63,-.434),l(-.644,-.166),l(-.769,.075),l(-.608,.159),l(-.446,.257),l(-.368,.115),l(-.354,-.083),l(-.452,-.223),l(-.52,-.562),l(-.15,-.465),l(-.308,-.252),l(-.545,.003),l(-.259,-.168),l(.08,-.043),l(.046,-.156),l(.172,-.326),l(.261,-.92),l(.133,-.876),l(-.058,-.749),l(.141,-.255),l(.257,-.016),l(.448,-.158),l(.543,-.271),l(.317,-.369),l(.292,-1.047),l(.355,-1.217),l(.397,-.384),l(.273,-.058),l(.293,.281),l(.551,.364),l(.45,-.102),l(.174,-.227),l(.393,-.822),l(.492,-.667),l(.638,-.625),l(.272,-.101),l(.518,.209),l(.324,.182),l(.274,.027),l(.314,-.793),l(.304,-.228),l(.947,-.458),l(1.22,-.713),l(.37,-.073),l(.356,.125),l(.36,.059),l(1.062,.173),l(-.173,.665),l(.019,.396),l(.426,.93),l(.422,.492),l(.389,.266),l(.502,.42),l(.179,.268),l(.018,.212),l(-.335,.439),l(.114,.226),l(.97,.757),l(.516,.181),l(.37,-.044),l(.562,.025),l(.568,.971),l(.131,.367),l(-.237,.764),l(-.415,.468),l(-.337,.158),l(-.739,-.095),l(-.418,.045),l(-.415,.271),l(-.366,.553),l(-.24,.157),l(-.062,.142),l(-.29,-.041),l(-.611,-.166),l(-1.013,-.163), +N(209.823,175.47),l(-.388,-.645),l(-.932,-.888),l(-1.003,-1.085),l(-.837,-.817),l(-.723,-.464),l(-.196,-.183),l(-.023,-.226),l(.625,-.03),l(1.001,-.125),l(.29,-.143),l(.293,-.412),l(.005,-.961),l(.882,-.034),l(.513,-.583),l(.725,.42),l(1.207,-.997),l(.503,-.794),l(.294,-.242),l(.259,.013),l(.328,.182),l(.463,.097),l(.248,-.086),l(.424,-.229),l(1.425,-.486),l(.23,.519),l(.038,.339),l(-.057,.509),l(-.214,.707),l(-.543,.806),l(-.1,.749),l(.042,.904),l(-.245,1.13),l(-.188,.735),l(-.101,1.385),l(.031,.55),l(.184,.466),l(.188,.363),l(-.281,.274),l(-.767,-.149),l(-.241,-.46),l(-.285,.077),l(-.394,-.107),l(-.603,.25),l(-1.651,-.599),l(-.43,.271), +N(634.036,168.444),l(.533,.251),l(.736,.165),l(.341,.111),l(.469,.251),l(.248,-.058),l(.095,-.24),l(-.103,-.211),l(-.187,-.182),l(-.107,-.296),l(.392,-.285),l(.476,-.186),l(.444,.181),l(.373,.351),l(.3,-.072),l(.975,-.429),l(.209,-.114),l(-.215,.905),l(.029,.663),l(.455,1.014),l(-.076,.367),l(-.05,.424),l(.054,1.073),l(-.217,.509),l(-.385,.285),l(-.599,.187),l(-.932,.443),l(-.521,.229),l(-.99,.571),l(-.234,.425),l(.216,.422),l(.568,.435),l(.03,.197),l(-.17,.27),l(-.688,-.194),l(-.497,-.011),l(-.599,.229),l(-.915,.528),l(-.646,.229),l(-.3,.289),l(-.256,-.188),l(-.248,-.268),l(-.35,-.042),l(-.382,.142),l(-.205,-.042),l(-.293,.043),l(-.183,-.113),l(.142,-.311),l(.182,-.226),l(-.04,-.254),l(-.283,-.395),l(-.277,.043),l(-.462,.298),l(-.339,.015),l(-.171,-1.044),l(-.649,-1.488),l(.146,-.176),l(-.16,-.479),l(-.487,-.717),l(-.219,-.648),l(-.026,-.635),l(.076,-.382),l(.146,-.297),l(.92,-1.233),l(.521,-.441),l(.383,-.101),l(1.172,-.091),l(.798,.066),l(.558,-.074),l(.575,.039),l(.599,.109),l(.301,.167), +N(214.474,175.913),l(.821,.884),l(.385,.623),l(.314,.322),l(.225,.046),l(.465,.645),l(.441,.352),l(-.014,.006),l(-.074,.123),l(-.478,-.184),l(-.219,.205),l(-.014,.321),l(0,.58),l(.507,.307),l(-.396,.368),l(.125,.532),l(-.374,.369),l(.243,.184),l(-.204,.609),l(.003,-.466),l(-.296,-.307),l(.01,-.568),l(-.377,-.148),l(-.238,-.102),l(-.111,.082),l(.325,.41),l(.084,.225),l(-.113,.062),l(-.726,-.299),l(-.13,-.282),l(.251,-.339),l(.04,-.382),l(-.182,-.338),l(-.486,-.324),l(-.695,-.287),l(-.079,-.144),l(-.689,-.103),l(-.316,-.327),l(.007,-.421),l(-.146,-.255),l(-.249,-.098),l(-.576,-.353),l(-.416,-.266),l(.225,.512),l(.086,.222),l(.422,.044),l(.181,.266),l(-.544,.573),l(-.144,-.262),l(-.356,-.282),l(-.561,-.211),l(-.323,-.239),l(-.147,-.24),l(-.104,-.494),l(.128,-.421),l(.332,-.225),l(-.008,-.389),l(-.554,-.225),l(.363,-.123),l(-.057,-.227),l(-.238,.017),l(.43,-.271),l(1.651,.599),l(.603,-.25),l(.394,.107),l(.285,-.077),l(.241,.46),l(.767,.149),l(.281,-.274), +N(436.304,195.359),l(-.209,-.451),l(-.194,-.804),l(-.498,-.802),l(-1.217,-1.236),l(-.112,-.324),l(-.064,-.791),l(-.432,-.605),l(-.4,-.661),l(-.207,-.592),l(-.273,-1.185),l(-.112,-.776),l(.064,-.424),l(.144,-.198),l(.528,-.399),l(.4,-.511),l(.866,-1.743),l(.354,-.327),l(.208,-.114),l(.096,.084),l(.24,.027),l(.449,-.158),l(1.363,-.686),l(.494,.661),l(.225,.069),l(.224,-.03),l(.466,-.271),l(.754,-.386),l(.818,-.273),l(.881,.009),l(.368,-.031),l(.258,-.143),l(.646,-1.176),l(.117,-.806),l(.209,-.199),l(.434,-.059),l(2.181,-.055),l(.386,-.087),l(2.649,-2.275),l(.196,-.284),l(.005,-.41),l(.165,-.382),l(.372,-.228),l(.939,-.613),l(.322,-.086),l(.321,.012),l(.559,.208),l(1.342,1.673),l(.347,.549),l(.122,.536),l(-.416,1.472),l(.01,.664),l(.158,.211),l(.802,-.019),l(.272,-.001),l(.207,.126),l(.252,.493),l(.223,.225),l(.797,.447),l(.799,.235),l(.351,.196),l(.223,.267),l(-.148,.481),l(.173,.395),l(.445,.351),l(.558,.378),l(.717,.434),l(.207,.168),l(.206,.366),l(.059,.72),l(.285,.436),l(.367,.224),l(.814,.165),l(.558,.477),l(.157,.352),l(-.083,.679),l(.031,.07),l(-.496,.145),l(-.962,.344),l(-.319,-.026),l(-.287,-.167),l(-.687,-.264),l(-1.15,-.361),l(-.4,.13),l(-.082,.551),l(-.13,.241),l(-.256,.058),l(-.399,-.026),l(-.862,-.207),l(-.593,.102),l(-.93,.373),l(-.93,.486),l(-.271,.016),l(-.559,-.35),l(-.383,-.153),l(-.353,.186),l(-.677,1.36),l(-.176,.157),l(-.591,-.067),l(-1.934,-.511),l(-1.422,-.189),l(-.512,-.322),l(-.159,-.239),l(-.334,-.394),l(-.75,-.518),l(-.432,-.167),l(-.479,.06),l(-.529,.3),l(-.353,.341),l(-.785,.979),l(-.097,.297),l(.096,.452),l(-.017,.353),l(-.063,.594),l(-.16,.058),l(-.751,.287),l(-.895,-.093),l(-.624,-.138),l(-.367,-.054),l(-.975,.175),l(-.479,.102),l(-.255,.228),l(-.222,1.287),l(-.158,.523),l(-.365,.497),l(-.303,.312), +N(371.324,180.419),l(1.088,-1.235),l(.643,-.866),l(.238,-.157),l(.594,.039),l(1.137,-.148),l(.466,.04),l(.42,.224),l(.456,.421),l(.475,.619),l(.252,.761),l(.165,1.369),l(.26,.656),l(-.259,.502),l(-1.184,1.151),l(-.63,.724),l(-.285,.256),l(-.061,.103),l(-.631,-.523),l(-.661,-.408),l(-.483,-.196),l(-.033,-.141),l(.061,-.297),l(-.05,-.184),l(-.531,-.21),l(-.792,-.549),l(-.389,-.366),l(-.375,-.465),l(.494,-.241),l(.174,-.227),l(-.034,-.155),l(-.484,-.211),l(-.065,-.113),l(.022,-.173), +N(579.606,186.906),l(-.493,-.083),l(-.265,-.197),l(-.21,-.353),l(-.246,-.621),l(-.361,-1.256),l(-.034,-.649),l(.005,-.763),l(-.02,-.904),l(-.24,-.696),l(.188,-.513),l(-.298,-.35),l(.068,-.28),l(.423,.023),l(.349,-.43),l(.053,-.367),l(.226,-.369),l(-.152,-.537),l(.529,.48),l(.699,.38),l(.234,.395),l(.549,.776),l(.175,.324),l(-.099,.339),l(.024,.141),l(.592,.338),l(.266,.733),l(.798,1.368),l(.136,.508),l(-.193,.735),l(-.397,.679),l(-.369,.396),l(-.514,.425),l(-.78,.284),l(-.642,.043), +N(217.111,178.792),l(.52,.307),l(.195,.512),l(.02,.374),l(.363,.155),l(.628,.024),l(.244,-.205),l(.398,.43),l(.726,.082),l(.458,-.083),l(1.348,-.751),l(.514,-.046),l(1.387,-.921),l(.373,.144),l(.742,.069),l(.071,.156),l(.789,-.017),l(.767,.21),l(.666,.38),l(.644,.563),l(.406,.666),l(.084,.327),l(.228,.149),l(.509,1.038),l(-.322,.062),l(-.094,.43),l(-.584,.409),l(-.085,-.307),l(-.19,-.082),l(.045,.45),l(-.228,.082),l(-.256,.753),l(-.378,-.825),l(-.441,-.762),l(-.137,-.452),l(.179,-.24),l(.22,-.085),l(.786,.125),l(-.336,-.193),l(-.125,-.164),l(-.096,-.471),l(-.309,.307),l(-.439,.041),l(-.244,-.378),l(-.031,-.269),l(-.193,-.282),l(-.132,.151),l(-.226,-.287),l(-.11,.102),l(-.132,-.266),l(-.456,-.192),l(-.562,-.013),l(-.499,.241),l(-.382,.108),l(-.07,.359),l(.081,.234),l(-.529,.318),l(-.374,.184),l(-.335,.029),l(-.345,.41),l(.049,.296),l(.316,.297),l(.464,.43),l(.178,.386),l(-.011,.146),l(-.281,.081),l(-.243,-.042),l(-.431,.391),l(-.568,.105),l(-.339,-.042),l(-.189,-.146),l(.108,-.164),l(-.349,-.833),l(-.244,-.353),l(-.177,.674),l(-.812,-.409),l(-.227,-.757),l(-.207,.041),l(-.96,-.123),l(-.434,-.266),l(-.599,0),l(-.314,.113),l(-.361,.495),l(.204,-.609),l(-.243,-.184),l(.374,-.369),l(-.125,-.532),l(.396,-.368),l(-.507,-.307),l(0,-.58),l(.014,-.321),l(.219,-.205),l(.478,.184),l(.074,-.123), +N(266.015,188.956),l(-.503,-.647),l(-.732,-.745),l(-.324,-.521),l(.071,-.212),l(.395,-.539),l(-.008,-.58),l(.061,-.452),l(1.032,-.19),l(.41,-.144),l(.308,-.299),l(-.141,-.282),l(-.62,-.604),l(-.074,-.212),l(.101,-.255),l(1.655,-1.239),l(.061,-.41),l(-.095,-.296),l(.072,.049),l(.496,.338),l(.856,.521),l(.695,.521),l(.587,.663),l(.128,.409),l(-.036,.734),l(.148,.945),l(.298,-.593),l(.22,-.099),l(.6,.182),l(.101,.127),l(.507,.295),l(.708,.549),l(.401,.493),l(.374,.649),l(-.015,.339),l(-.142,.496),l(-.082,.862),l(-.183,.27),l(-1.131,.091),l(-.169,.17),l(.078,.777),l(-.095,.467),l(-.328,.694),l(.571,.831),l(.532,.675),l(.561,.067),l(.185,.295),l(.246,.832),l(.49,1.127),l(.332,.563),l(-.06,.212),l(-.943,-.022),l(-.934,.429),l(-1,.331),l(-.505,.314),l(-.694,.513),l(-.686,.075),l(-.613,-.392),l(-1.103,-.897),l(-.15,-.296),l(-.008,-.396),l(.072,-.354),l(-.167,-.31),l(-.281,-.394),l(-.156,-.465),l(.213,-.962),l(.547,-1.416),l(.179,-.368),l(-.435,-.958),l(-.533,-.138),l(-.304,.001),l(.452,-1.09),l(-.04,-.212),l(-.26,-.111),l(-.516,-.124),l(-.302,.058),l(-.375,.257), +N(377.518,182.142),l(.193,-.376),l(.252,-.242),l(.367,-.143),l(.528,-.046),l(.338,.097),l(.165,.366),l(.22,.846),l(.009,.65),l(-.044,.283),l(.277,.323),l(.404,.322),l(.321,.026),l(.756,-.922),l(.143,-.086),l(.337,.097),l(.339,.224),l(-.062,.17),l(.119,.55),l(-.059,.438),l(-.501,.865),l(.05,.183),l(.194,.183),l(.369,.097),l(.592,-.032),l(1.264,1.334),l(.131,.282),l(-.059,.452),l(-.247,.849),l(-.105,.565),l(-.041,.919),l(-1.513,-.643),l(-1.221,-.619),l(-1.012,-.562),l(-.403,-.423),l(-1.129,-1.113),l(-1.111,-.76),l(-.723,-.337),l(-.901,-.535),l(-.66,-.548),l(.061,-.103),l(.285,-.256),l(.63,-.724),l(1.184,-1.151),l(.259,-.502), +N(429.505,210.684),l(.484,.336),l(.177,.013),l(.443,-.271),l(.327,-.581),l(1.495,-.532),l(.054,.424),l(.042,.664),l(.147,.211),l(.57,-.328),l(.554,-.399),l(.931,-.811),l(.364,-.229),l(1.025,-.938),l(.086,-.706),l(-.122,-.72),l(.074,-.396),l(.193,-1.159),l(.343,-.751),l(.47,-.836),l(.41,-.454),l(.809,-.599),l(.525,-.229),l(.459,-.427),l(.139,-.523),l(.169,-.708),l(.115,-.61),l(.254,-1.342),l(.196,-2.021),l(.156,-.764),l(.094,-.551),l(.349,-.821),l(.558,-.837),l(.398,-1.203),l(.031,-.156),l(-.128,-.197),l(.16,-.058),l(.063,-.594),l(.017,-.353),l(-.096,-.452),l(.097,-.297),l(.785,-.979),l(.353,-.341),l(.529,-.3),l(.479,-.06),l(.432,.167),l(.75,.518),l(.334,.394),l(.159,.239),l(.512,.322),l(1.422,.189),l(1.934,.511),l(.591,.067),l(.176,-.157),l(.677,-1.36),l(.353,-.186),l(.383,.153),l(.559,.35),l(.271,-.016),l(.93,-.486),l(.93,-.373),l(.593,-.102),l(.862,.207),l(.399,.026),l(.256,-.058),l(.13,-.241),l(.082,-.551),l(.4,-.13),l(1.15,.361),l(.687,.264),l(.287,.167),l(.319,.026),l(.962,-.344),l(.496,-.145),l(.143,.239),l(.795,.772),l(.348,.493),l(.525,.477),l(.366,.195),l(.352,-.016),l(.258,-.242),l(.529,-.37),l(.384,.012),l(.684,.631),l(.16,-.1),l(.436,-.582),l(.258,-.157),l(.207,.083),l(1.032,.926),l(1.288,1.32),l(.063,.028),l(.159,.183),l(-.018,.424),l(-.26,1.88),l(.128,.253),l(.191,.027),l(.479,.04),l(.271,.182),l(.111,.31),l(-.191,.453),l(-1.195,1.066),l(-1.241,.996),l(-.255,.284),l(-.395,.681),l(-.217,1.02),l(-.107,.507),l(.021,.593),l(-.025,.734),l(.057,.748),l(-.076,.27),l(-.188,.298),l(-.426,.412),l(-.301,.171),l(-.269,.256),l(-.122,.425),l(-.49,1.358),l(.197,.338),l(.689,.999),l(.087,.381),l(-.04,.438),l(.014,.636),l(.237,.634),l(.017,1.329),l(-.064,.762),l(.425,1.439),l(-.102,.848),l(.122,.693),l(.486,.631),l(.936,.898),l(.428,.78),l(.689,1.804),l(-.563,.068),l(-3.015,.499),l(-.347,.214),l(-.154,.198),l(-.797,1.276),l(-.029,.622),l(.372,2.088),l(-.377,1.175),l(-.3,1.02),l(.043,.296),l(.456,.605),l(.837,.843),l(.445,.279),l(.515,.012),l(.448,-.455),l(.362,-.186),l(.136,.183),l(.032,.791),l(.028,1.427),l(-.041,.551),l(-.371,-.012),l(-1.355,-.091),l(-.348,-.21),l(-.381,-.647),l(-.561,-.731),l(-.416,-.351),l(-.477,-.252),l(-.895,-.263),l(-.38,-.28),l(-.728,-1.423),l(-.212,.354),l(-.522,.682),l(-.366,.087),l(-.325,-.111),l(-.922,-.164),l(-.925,-.249),l(-.489,-.194),l(-.58,-1.014),l(-.175,.071),l(-1.146,.289),l(-.195,-.056),l(-.172,-.352),l(-.365,-.379),l(-.678,-.096),l(-1.24,-.147),l(-.991,.146),l(-.859,.26),l(-.61,.004),l(-.199,-.197),l(-.007,-.254),l(.198,-.905),l(.003,-.466),l(-.306,-.62),l(-.844,-.998),l(-.117,-.211),l(-.021,-.212),l(.296,-1.033),l(.07,-1.06),l(-.109,-.607),l(-.303,-.605),l(.057,-.354),l(.177,-.693),l(-.052,-.183),l(-.322,-.098),l(-1.231,.093),l(-.88,.019),l(-.212,-.168),l(.055,-.48),l(-.181,-.225),l(-2.016,.082),l(-.112,.001),l(-.089,.354),l(.027,.593),l(-.286,.892),l(-.184,.411),l(-.993,.006),l(-.899,-.122),l(-1.021,.246),l(-.88,.034),l(-.292,-.168),l(-.64,-.787),l(-.597,-1.07),l(-.537,-1.409),l(-.059,-.579),l(-.121,-.521),l(-.082,-.127),l(-.321,-.111),l(-.385,-.012),l(-1.104,-.008),l(-.88,.034),l(-.624,.003),l(-1.312,-.048),l(-.945,-.052),l(-.783,.02),l(-.432,.03),l(-.318,.101),l(-.896,.062),l(-.699,.314),l(-.56,.06),l(-.112,-.013),l(-.322,-.922),l(.012,-.053),l(.74,-.3),l(-.017,-.085),l(.1,-.89),l(.094,-.143),l(.317,-.199),l(.583,-.568), +N(468.568,202.653),l(1.277,-.05),l(4.659,0),l(1.448,-.033),l(4.663,2.568),l(3.553,1.984),l(.137,.381),l(-.116,.552),l(.07,.239),l(2.427,1.752),l(1.067,.807),l(-.237,.427),l(-.419,1.329),l(-.137,1.017),l(.109,.551),l(.665,.987),l(.768,.577),l(-.024,.282),l(-.263,.354),l(-.371,1.046),l(.037,.17),l(.306,.041),l(.118,.226),l(-.172,.692),l(-.019,.946),l(.411,1.793),l(.18,.564),l(.401,.465),l(.823,.55),l(.396,.268),l(.177,.228),l(-1.157,.836),l(-.515,.342),l(-1.218,.402),l(-1.243,.559),l(-.448,.031),l(-.646,-.42),l(-.276,-.083),l(-.21,.326),l(-.543,.766),l(-.396,.144),l(-.42,-.054),l(-.964,.006),l(-.963,.02),l(-.512,-.294),l(-.323,-.394),l(-.229,-.083),l(-.123,.128),l(-.643,.356),l(-.526,.088),l(-1.019,-.149),l(-.898,-.018),l(-.196,-.559),l(-.135,-.766),l(-.053,-.584),l(-.135,-.946),l(-.448,-.841),l(-.663,-.538),l(-1.014,-.107),l(-.223,.016),l(-.385,-.407),l(-.732,-.349),l(-1.574,-.57),l(-1.269,-.6),l(-.729,-.265),l(-.263,-.21),l(-.703,-.641),l(-.689,-1.804),l(-.428,-.78),l(-.936,-.898),l(-.486,-.631),l(-.122,-.693),l(.102,-.848),l(-.425,-1.439),l(.064,-.762),l(1.252,-.348),l(.388,-.539),l(.645,-1.204),l(.687,-.853),l(.346,-.271),l(.044,-.212),l(-.148,-.239),l(-.273,-.125),l(-.401,-.068),l(-.211,-.211),l(.158,-.976),l(.304,-.016),l(.396,-.158),l(.142,-.17),l(.104,-.481),l(-.167,-.493),l(-.364,-.888),l(-.121,-.748), +N(464.786,206.235),l(-.197,-.338),l(.49,-1.358),l(.122,-.425),l(.269,-.256),l(.301,-.171),l(.426,-.412),l(.064,.042),l(.546,.223),l(.431,-.045),l(.458,-.427),l(.554,-.398),l(.319,-.017),l(.121,.748),l(.364,.888),l(.167,.493),l(-.104,.481),l(-.142,.17),l(-.396,.158),l(-.304,.016),l(-.559,.031),l(-.508,.159),l(-.391,.567),l(-.158,.085),l(-.396,.13),l(-.789,-.32),l(-.688,-.024), +N(465.79,210.652),l(-.017,-1.329),l(-.237,-.634),l(-.014,-.636),l(.04,-.438),l(-.087,-.381),l(-.689,-.999),l(.688,.024),l(.789,.32),l(.396,-.13),l(.158,-.085),l(.391,-.567),l(.508,-.159),l(.559,-.031),l(-.158,.976),l(.211,.211),l(.401,.068),l(.273,.125),l(.148,.239),l(-.044,.212),l(-.346,.271),l(-.687,.853),l(-.645,1.204),l(-.388,.539),l(-1.252,.348), +N(427.243,211.207),l(.536,-.414),l(.68,-.513),l(.351,-.13),l(.695,.533),l(-.583,.568),l(-.317,.199),l(-.094,.143),l(-.1,.89),l(.017,.085),l(-.74,.3),l(.143,-.625),l(-.082,-.24),l(-.505,-.796),M(427.998,213.843),l(.112,.013),l(.56,-.06),l(.699,-.314),l(.896,-.062),l(.318,-.101),l(.432,-.03),l(.783,-.02),l(.945,.052),l(1.312,.048),l(.624,-.003),l(.88,-.034),l(1.104,.008),l(.385,.012),l(.321,.111),l(.082,.127),l(.121,.521),l(.059,.579),l(.537,1.409),l(.597,1.07),l(.64,.787),l(.292,.168),l(.88,-.034),l(1.021,-.246),l(.899,.122),l(.993,-.006),l(.184,-.411),l(.286,-.892),l(-.027,-.593),l(.089,-.354),l(.112,-.001),l(2.016,-.082),l(.181,.225),l(-.055,.48),l(.212,.168),l(.88,-.019),l(1.231,-.093),l(.322,.098),l(.052,.183),l(-.177,.693),l(-.057,.354),l(.303,.605),l(.109,.607),l(-.07,1.06),l(-.296,1.033),l(.021,.212),l(.117,.211),l(.844,.998),l(.306,.62),l(-.003,.466),l(-.198,.905),l(.007,.254),l(.199,.197),l(.61,-.004),l(.859,-.26),l(.991,-.146),l(1.24,.147),l(-.214,1.344),l(.195,1.059),l(.269,.323),l(.089,.254),l(-.132,.368),l(-.436,.44),l(-.124,.594),l(-.125,.086),l(-.517,-.04),l(-3.408,.091),l(-.051,.877),l(.015,1.342),l(-.024,3.249),l(.017,.848),l(.023,.594),l(.099,.438),l(.308,.394),l(.471,.436),l(1.354,1.391),l(.611,.632),l(-.93,.218),l(-1.96,.379),l(-1.044,.203),l(-.717,-.08),l(-1.164,.063),l(-.408,-.083),l(-.349,-.21),l(-2.024,.026),l(-.697,-.024),l(-.622,-.151),l(-.401,-.322),l(-.305,-.366),l(-.408,-.096),l(-.989,-.023),l(-2.59,.016),l(-1.636,-.019),l(-.631,-.011),l(-1.296,-.006),l(-2.201,.013),l(-.636,-.151),l(-.463,-.309),l(-.45,-.478),l(-.294,-.083),l(-.499,.088),l(-.591,.286),l(-.778,.513),l(-.758,-.462),l(-.352,.144),l(-.248,.197),l(.048,-1.809),l(-.017,-.805),l(-.029,-.649),l(.397,-.34),l(.221,-.269),l(.26,-.707),l(.163,-.734),l(.184,-1.398),l(.239,-.976),l(.321,-.918),l(.584,-.665),l(.183,-.565),l(.268,-.354),l(.64,-.228),l(.268,-.325),l(.423,-.679),l(.364,-1.201),l(.053,-.664),l(-.046,-.848),l(-.191,-.959),l(-.201,-.536),l(-.492,-.705),l(-.476,-.776),l(-.268,-.775),l(.139,-.495),l(.476,-.382),l(.158,-.156),l(.107,-.424),l(-.006,-.479),l(-.199,-.579),l(-.489,-.69),l(-.441,-.733),l(-.203,-1.031),l(-.181,-.423),l(-.276,-.366),l(-.666,-.974),l(-.072,-.15), +N(452.198,239.34),l(-.611,-.632),l(-1.354,-1.391),l(-.471,-.436),l(-.308,-.394),l(-.099,-.438),l(-.023,-.594),l(-.017,-.848),l(.024,-3.249),l(-.015,-1.342),l(.051,-.877),l(3.408,-.091),l(.517,.04),l(.125,-.086),l(.124,-.594),l(.436,-.44),l(.132,-.368),l(-.089,-.254),l(-.269,-.323),l(-.195,-1.059),l(.214,-1.344),l(.678,.096),l(.365,.379),l(.172,.352),l(.195,.056),l(1.146,-.289),l(.175,-.071),l(.58,1.014),l(.489,.194),l(.925,.249),l(.922,.164),l(.325,.111),l(.366,-.087),l(.522,-.682),l(.212,-.354),l(.728,1.423),l(.38,.28),l(.895,.263),l(.477,.252),l(.416,.351),l(.561,.731),l(.381,.647),l(.348,.21),l(1.355,.091),l(.371,.012),l(.041,-.551),l(-.028,-1.427),l(-.032,-.791),l(-.136,-.183),l(-.362,.186),l(-.448,.455),l(-.515,-.012),l(-.445,-.279),l(-.837,-.843),l(-.456,-.605),l(-.043,-.296),l(.3,-1.02),l(.377,-1.175),l(-.372,-2.088),l(.029,-.622),l(.797,-1.276),l(.154,-.198),l(.347,-.214),l(3.015,-.499),l(.563,-.068),l(.703,.641),l(.263,.21),l(.729,.265),l(1.269,.6),l(1.574,.57),l(.732,.349),l(.385,.407),l(.559,.887),l(.434,.859),l(.013,.324),l(-.183,.27),l(-.709,.344),l(-.011,.127),l(.04,.594),l(-.091,1.682),l(.08,.353),l(.216,.168),l(.511,.266),l(.072,.197),l(-.197,.241),l(-.472,.258),l(-.792,.259),l(-.146,.34),l(-.094,.764),l(-.3,.807),l(.2,.479),l(.261,.408),l(.394,.125),l(-1.264,.53),l(-1.696,.575),l(-.932,.4),l(-2.165,.578),l(-.187,.128),l(-.009,.495),l(.152,.465),l(.087,.438),l(-.505,-.096),l(-.999,.049),l(-.794,.259),l(-.636,.54),l(-.312,.539),l(-.019,.579),l(-.168,.199),l(-.285,.114),l(-.999,.062),l(-.621,.202),l(-.306,.341),l(-.777,.937),l(-.562,.738),l(-.825,.951),l(-.354,.045),l(-.803,-.165),l(-.421,-.309),l(-.334,.129),l(-.521,.286),l(-.404,.017),l(-.594,-.209),l(-.264,-.097),l(-.154,-.169),l(-.163,-.027),l(-.187,-.154),l(-.456,-.393),l(-.294,-.055),l(-1.089,-.093),l(-.086,-.099),l(-.165,-.056),l(-1.845,.364), +N(477.231,225.874),l(-.224,1.184),l(-.107,.48),l(.252,.917),l(.177,1.017),l(.149,.408),l(.238,.268),l(.803,.588),l(1.189,1.166),l(.454,.661),l(.14,.48),l(-.155,2.346),l(-.04,.41),l(-.214,.213),l(-.432,.073),l(-.322,.017),l(-.229,.213),l(-.076,.622),l(.08,.509),l(.029,.479),l(-.096,.283),l(-.185,-.111),l(-.562,-.463),l(-.763,-1.112),l(-.484,-.548),l(-.234,-.423),l(.036,-.212),l(.499,-.61),l(.116,-.227),l(.025,-.693),l(-.1,-.96),l(-.22,-.479),l(-.261,-.056),l(-.674,.061),l(-.702,.132),l(-.27,-.211),l(-.343,-.407),l(-.382,-.549),l(-.195,-.041),l(-.394,-.125),l(-.261,-.408),l(-.2,-.479),l(.3,-.807),l(.094,-.764),l(.146,-.34),l(.792,-.259),l(.472,-.258),l(.197,-.241),l(-.072,-.197),l(-.511,-.266),l(-.216,-.168),l(-.08,-.353),l(.091,-1.682),l(-.04,-.594),l(.011,-.127),l(.709,-.344),l(.183,-.27),l(-.013,-.324),l(-.434,-.859),l(-.559,-.887),l(.223,-.016),l(1.014,.107),l(.663,.538),l(.448,.841),l(.135,.946),l(.053,.584),l(.135,.766),l(.196,.559), +N(245.934,224.314),l(.939,.136),l(1.122,.304),l(.355,-.03),l(.946,-.824),l(.336,.026),l(.48,.025),l(.415,-.243),l(1.471,-1.109),l(.874,-.485),l(.36,-.158),l(.934,-.076),l(1.283,.021),l(.045,.748),l(-.079,.621),l(-.064,.622),l(.036,.818),l(.141,.635),l(.335,.591),l(.813,.928),l(1.1,.939),l(.316,.097),l(.787,.023),l(.355,-.03),l(.676,.25),l(.688,.307),l(.75,.603),l(.3,.098),l(.882,.037),l(.096,.014),l(.385,.774),l(.398,.308),l(.22,.084),l(1.148,-.077),l(.636,.123),l(.537,.166),l(.403,.237),l(.085,.169),l(-.038,.565),l(.203,1.029),l(.03,.706),l(.138,2.032),l(.249,.944),l(.153,.112),l(.967,.036),l(.5,.012),l(1.615,.019),l(.693,.024),l(.042,.296),l(-.261,.835),l(.067,.563),l(.436,.407),l(.73,.362),l(.316,.479),l(.307,.774),l(.022,.494),l(-.185,1.173),l(-.238,.834),l(-.38,.765),l(-.421,.666),l(-.089,-.084),l(-1.952,-.991),l(-.352,-.054),l(-.928,.02),l(-.843,-.01),l(-.126,.128),l(-1.076,.204),l(-1.104,.162),l(-.784,.202),l(-.33,.044),l(-.332,.383),l(-.698,1.105),l(-.278,.341),l(-.133,.509),l(.016,.635),l(-.385,1.188),l(-.395,1.104),l(-.149,.325),l(-.592,-.109),l(-1.33,-.077),l(-.686,.004),l(-1.034,1.784),l(-.416,-1.084),l(-.341,-.309),l(-.37,-.195),l(-.531,-.067),l(-.527,.045),l(-.901,.034),l(-.615,-.194),l(-.193,-.169),l(-.322,-.181),l(-.292,.27),l(-2.026,2.087),l(-1.047,.006),l(-.272,-.182),l(-.397,-2.144),l(-.278,-.973),l(-.212,-.563),l(-.769,-1.11),l(-.249,-.676),l(.04,-.354),l(.437,-1.555),l(-.017,-.282),l(-.761,-.744),l(-.25,-.521),l(-.193,-1.213),l(-.304,-.647),l(-.555,-.745),l(-.152,-.253),l(-.018,-.142),l(-.132,-.295),l(-.049,-.48),l(.12,-.227),l(.723,-.61),l(.285,-.439),l(-.015,-.522),l(-.604,-1.168),l(-.022,-.48),l(.159,-.34),l(.21,-.368),l(-.347,-.845),l(.102,-.452),l(.532,-.582),l(.221,-.34),l(.156,-.34),l(-.236,-.902),l(-.057,-.522),l(.143,-.848),l(.15,-.523),l(.437,-.736),l(-.08,-.24),l(-.922,-1.646),l(-1.109,-1.843), +N(473.575,260.04),l(-1.331,.011),l(-.192,.058),l(-.068,-.382),l(-.261,-.889),l(.071,-.495),l(-.075,-.296),l(-.095,-.324),l(.03,-.806),l(.057,-1.301),l(-.072,-.763),l(-.147,-.678),l(-.33,-.944),l(-.441,-.689),l(-.181,-.946),l(-.295,-1.199),l(-.159,-.183),l(.448,-.384),l(.396,-.412),l(1.68,-1.706),l(.114,-.227),l(-.09,-.367),l(.075,-.834),l(.229,-.481),l(.736,-.683),l(.205,-.341),l(.168,-.41),l(-.594,-.845),l(-.118,-.805),l(-.113,-.494),l(.128,-.283),l(.448,-.596),l(.201,-.411),l(-.132,-.805),l(-.086,-1.144),l(-.031,-.791),l(-.178,-.818),l(-.441,-.379),l(-.515,-.224),l(-1.167,-.347),l(-1.042,-.445),l(-.658,-.223),l(-1.438,-.006),l(-.137,-.14),l(-.025,-.495),l(-.011,-.212),l(-.087,-.438),l(-.152,-.465),l(.009,-.495),l(.187,-.128),l(2.165,-.578),l(.932,-.4),l(1.696,-.575),l(1.264,-.53),l(.195,.041),l(.382,.549),l(.343,.407),l(.27,.211),l(.702,-.132),l(.674,-.061),l(.261,.056),l(.22,.479),l(.1,.96),l(-.025,.693),l(-.116,.227),l(-.499,.61),l(-.036,.212),l(.234,.423),l(.484,.548),l(.763,1.112),l(.562,.463),l(.185,.111),l(.096,-.283),l(-.029,-.479),l(-.08,-.509),l(.076,-.622),l(.229,-.213),l(.322,-.017),l(.432,-.073),l(.214,-.213),l(.04,-.41),l(.155,-2.346),l(-.14,-.48),l(-.454,-.661),l(-1.189,-1.166),l(-.803,-.588),l(-.238,-.268),l(-.149,-.408),l(-.177,-1.017),l(-.252,-.917),l(.107,-.48),l(.224,-1.184),l(.898,.018),l(1.019,.149),l(.526,-.088),l(.643,-.356),l(.123,-.128),l(.229,.083),l(.323,.394),l(.512,.294),l(.963,-.02),l(.964,-.006),l(.42,.054),l(.396,-.144),l(.543,-.766),l(.21,-.326),l(.276,.083),l(.646,.42),l(.448,-.031),l(1.243,-.559),l(1.218,-.402),l(.515,-.342),l(1.157,-.836),l(.128,.167),l(.212,.479),l(-.185,.579),l(-.302,.453),l(-.198,.255),l(.181,.451),l(.129,.72),l(-.012,.466),l(.182,1.115),l(-.101,.58),l(-.258,.325),l(.374,.705),l(.154,.494),l(-.006,1.115),l(-.004,.819),l(.043,.184),l(.185,.127),l(.327,.084),l(.015,.269),l(-.165,.494),l(-.563,.58),l(.184,.381),l(-.08,.283),l(-.418,.565),l(-.802,.906),l(-.512,.622),l(-.72,.651),l(-1.36,.751),l(-1.48,.653),l(-.73,.228),l(-1.308,.582),l(-.852,.637),l(-1.286,1.443),l(-.886,.85),l(-1.193,.878),l(-1.181,.836),l(-.268,.128),l(-.035,.96),l(-.083,.495),l(.058,.127),l(.719,.535),l(.188,.381),l(-.166,.452),l(-.085,.184),l(.461,1.511),l(.071,.564),l(.06,.155),l(.246,.014),l(.171,-.128),l(.141,-.085),l(.043,.607),l(-.234,2.218),l(-.284,.82),l(.325,.196),l(.152,.057),l(-.025,.325),l(-.157,.311),l(-.516,.566),l(-.699,.538),l(-.664,.34),l(-1.266,.412),l(-.796,.312),l(-.688,.228),l(-.895,.524),l(-.652,.665),l(-.337,.51),l(.292,.338),l(.589,.338),l(.045,.325),l(-.149,1.022), +N(499.85,236.166),l(.544,-.071),l(.622,-.369),l(.18,.028),l(.346,.098),l(.269,-.085),l(.396,-.368),l(.911,-.143),l(.311,.281),l(.305,-.028),l(.101,-.185),l(-.171,-.366),l(.771,-.539),l(.423,-.198),l(.322,.226),l(.389,-.213),l(-.308,-.494),l(.207,-.282),l(.505,-.425),l(.229,.296),l(.229,.056),l(.558,-.594),l(-.158,-.197),l(-.253,-.409),l(.094,-.297),l(.243,.014),l(.27,-.071),l(.172,-.34),l(-.297,-.875),l(.06,-.339),l(.255,-.043),l(.117,.07),l(.253,.438),l(.28,.099),l(.2,-.41),l(.692,-.524),l(.235,-.367),l(.134,-.452),l(.168,-.692),l(-.133,-.354),l(.003,-.226),l(.537,-.468),l(.356,.324),l(.455,.648),l(.612,.281),l(.141,.198),l(.213,.847),l(.294,1.821),l(.093,.663),l(.231,.791),l(.391,.733),l(.163,.466),l(-.038,.367),l(-.069,.155),l(-.058,.099),l(-.537,.807),l(-.22,-.127),l(-.189,-.366),l(-.555,-.748),l(-.297,.143),l(-.05,.424),l(.193,.875),l(.396,.521),l(.079,.396),l(-.307,.636),l(-.746,1.005),l(-.045,.452),l(.041,.89),l(-.18,.946),l(-.709,2.12),l(-.825,2.572),l(-1.254,3.788),l(-1.324,4.48),l(-.518,1.568),l(-.188,.255),l(-.508,.637),l(-.2,.113),l(-1.369,.102),l(-.999,.327),l(-.474,.468),l(-.813,.086),l(-.363,-.465),l(-.196,-.142),l(-.546,-.182),l(-.37,.071),l(-.269,-.057),l(-.863,-.718),l(-.104,-.24),l(-.02,-.565),l(-.104,-.239),l(-.46,-.366),l(-.124,-.282),l(.001,-.721),l(.345,-1.088),l(-.094,-.325),l(-.287,-.479),l(-.62,-.931),l(-.189,-.494),l(.075,-.664),l(.391,-1.37),l(.228,-.213),l(.474,-.185),l(.768,-1.371),l(.686,-1.174),l(.104,-.325),l(.151,-1.103),l(-.11,-.353),l(-.278,-.226),l(-.354,-.366),l(.066,-.184),l(.252,-.509),l(-.521,-.861),l(-.117,-.677),l(-.069,-.494),l(-.231,-.721),l(.024,-.112),l(.517,-.693),l(.362,-.594),l(.163,-.438),l(.007,-1.073),l(.484,-.016), +N(468.138,234.908),l(.011,.212),l(.025,.495),l(.137,.14),l(1.438,.006),l(.658,.223),l(1.042,.445),l(1.167,.347),l(.515,.224),l(.441,.379),l(.178,.818),l(.031,.791),l(.086,1.144),l(.132,.805),l(-.201,.411),l(-.448,.596),l(-.128,.283),l(.113,.494),l(.118,.805),l(.594,.845),l(-.168,.41),l(-.205,.341),l(-.736,.683),l(-.229,.481),l(-.075,.834),l(.09,.367),l(-.114,.227),l(-1.68,1.706),l(-.396,.412),l(-.448,.384),l(-.342,-.225),l(-.547,-.124),l(-.442,-.025),l(-.529,.145),l(-.31,.016),l(-.99,-.403),l(-.597,-.139),l(-.72,-.023),l(-.067,-.042),l(-.186,-.098),l(-.306,-.451),l(-.479,-.35),l(-.549,-.167),l(-.938,-.136),l(-.352,-.153),l(-.524,-.873),l(-.163,-.564),l(.032,-.565),l(-.127,-.239),l(-.78,.019),l(-.201,-.098),l(-.109,-.211),l(.051,-.537),l(-.106,-.169),l(-.552,-.266),l(-.533,-.223),l(-.57,-.321),l(-.563,-.491),l(-.377,-.662),l(-.246,-.96),l(-.469,-.604),l(-.43,-.478),l(-.267,-.451),l(.103,-.227),l(.594,.209),l(.404,-.017),l(.521,-.286),l(.334,-.129),l(.421,.309),l(.803,.165),l(.354,-.045),l(.825,-.951),l(.562,-.738),l(.777,-.937),l(.306,-.341),l(.621,-.202),l(.999,-.062),l(.285,-.114),l(.168,-.199),l(.019,-.579),l(.312,-.539),l(.636,-.54),l(.794,-.259),l(.999,-.049),l(.505,.096), +N(444.673,255.519),l(-.006,3.434),l(.031,1.894),l(.025,2.246),l(-.057,.205),l(-.454,.318),l(-.545,.302),l(-.581,.498),l(-.427,.034),l(-.581,-.166),l(-.745,-.042),l(-.892,.048),l(-.517,-.039),l(-.296,-.212),l(-.055,-.528),l(-.042,-.345),l(-.193,-.222),l(-.637,-.348),l(-.329,-.127),l(-.335,.116),l(-.109,.217),l(-.317,.416),l(-.584,.27),l(-.152,.068),l(-.458,-.491),l(-1.041,-1.001),l(-.458,-.606),l(-.359,-1.03),l(-.345,-.72),l(-.136,-.493),l(.12,-.269),l(.053,-.34),l(-.458,-.719),l(-.231,-.861),l(.148,-.861),l(-.002,-.48),l(-.537,-1.326),l(-.496,-2.244),l(.772,-.02),l(.04,-.678),l(-.077,-.749),l(-.456,-.006),l(.016,-.06),l(-.099,-.522),l(-.26,-.508),l(-1.018,-1.283),l(-.343,-.55),l(-1.102,-2.158),l(-.841,-1.623),l(-.9,-1.509),l(-.988,-1.269),l(-.511,-1.044),l(-.122,-.396),l(-.045,-.551),l(.015,-.578),l(.248,-.197),l(.352,-.144),l(.758,.462),l(.778,-.513),l(.591,-.286),l(.499,-.088),l(.294,.083),l(.45,.478),l(.463,.309),l(.636,.151),l(2.201,-.013),l(1.296,.006),l(.631,.011),l(1.636,.019),l(2.59,-.016),l(.989,.023),l(.408,.096),l(.305,.366),l(.401,.322),l(.622,.151),l(.697,.024),l(2.024,-.026),l(.349,.21),l(.408,.083),l(1.164,-.063),l(.717,.08),l(1.044,-.203),l(1.96,-.379),l(.93,-.218),l(1.845,-.364),l(.165,.056),l(.086,.099),l(1.089,.093),l(.294,.055),l(.456,.393),l(-.811,.315),l(-.891,.02),l(-.284,.143),l(-.993,.938),l(-.209,.029),l(-.62,-.773),l(-1.048,.134),l(-2.962,.47),l(-1.183,.021),l(.005,1.215),l(-.007,1.286),l(-.025,.876),l(-.043,1.201),l(.002,3.561),l(-.586,.046),l(-1.564,.052),l(-.146,.028),l(-.106,2.657),l(-.009,1.201),l(.013,1.624),l(.007,.806), +N(248.453,316.576),l(-.306,.101),l(-.892,-.087),l(-.538,-.293),l(-.236,-.015),l(-.311,.163),l(-.418,.398),l(-.498,.192),l(-1.156,.091),l(-.349,.09),l(-.358,.207),l(-.267,.621),l(-.114,.341),l(.06,.532),l(-.163,.622),l(-.104,.148),l(-.453,.031),l(-.534,.104),l(-.956,-.413),l(.667,-.639),l(.326,-.444),l(.582,-.4),l(.025,-.147),l(-.372,-.177),l(-.273,-.117),l(-1.353,.534),l(-1.01,-.013),l(-.545,.163),l(-.202,-.339),l(.128,-.192),l(.959,-.268),l(.266,.028),l(.792,-.208),l(.441,-.118),l(-.605,-.162),l(-.582,.002),l(-.77,.001),l(-.014,-.413),l(.265,-.31),l(-.007,-.191),l(-.446,-.073),l(-.356,-.44),l(-.66,.384),l(-.669,-.175),l(.292,-.53),l(.041,-.177),l(-.378,.045),l(-.361,.147),l(-.416,-.396),l(-.215,-.117),l(.413,-.279),l(.114,-.177),l(-.091,-.278),l(-.053,-.073),l(-.351,.03),l(-.773,-.424),l(-.135,-.059),l(.844,-.192),l(.253,-.161),l(.1,-.294),l(.396,-.366),l(.049,-.234),l(-.641,.06),l(-.257,.104),l(-.312,-.073),l(-.256,-.672),l(.573,-.395),l(-.565,-.378),l(-.12,-.421),l(.757,-.452),l(-.14,-.421),l(-.686,.422),l(-.091,-1.523),l(.399,-.596),l(-.185,-.825),l(.013,-.218),l(.593,.014),l(.41,.245),l(.711,.071),l(.171,-.246),l(.002,-.159),l(-.896,-.447),l(-.867,.146),l(-.317,-.173),l(-.536,.059),l(-.017,-.231),l(.339,-.333),l(.025,-.246),l(-.067,-.087),l(.186,-.202),l(.536,.014),l(.229,-.377),l(.01,-.216),l(-.722,-.389),l(-.354,-.129),l(-.886,.045),l(-.332,-.101),l(-.024,-.49),l(-.939,.16),l(-.115,-.101),l(.122,-.145),l(1.032,-.521),l(.251,-.116),l(.4,-.404),l(.266,-.389),l(.833,-.06),l(.268,.201),l(.059,.346),l(-.648,.202),l(-.323,.274),l(.11,.505),l(.117,.058),l(.191,-.102),l(.268,-.39),l(.183,-.087),l(.242,.101),l(-.037,.317),l(.057,.504),l(.886,-.996),l(.161,-.678),l(.056,-.647),l(.237,-.375),l(.079,-.058),l(.631,-.217),l(-.201,-.071),l(-.438,-.143),l(-.056,-.158),l(.101,-.273),l(.246,-.072),l(.571,-.245),l(.599,-.431),l(.271,-.459),l(-.061,-.229),l(-.394,-.157),l(-.662,-.399),l(-.053,-.372),l(.139,-.243),l(.105,-.458),l(-.06,-.828),l(.366,-.33),l(.676,-.272),l(-.431,-.585),l(-.053,-.784),l(.133,-.158),l(.554,-.157),l(.054,-.314),l(-.116,-.285),l(-.317,-.085),l(-.272,-.198),l(.233,-.329),l(.087,-.313),l(-.401,-.185),l(-.274,-.014),l(-.161,.101),l(-.476,.414),l(-.548,.058),l(-.087,.001),l(-.289,-.199),l(-.16,-.484),l(-.399,-.726),l(-.133,-.697),l(.188,-.911),l(.137,-.413),l(.722,-.739),l(.535,-.767),l(-.006,-.326),l(-.544,-1.757),l(.001,-.608),l(.088,-.567),l(-.076,-.438),l(-.528,-.891),l(-.04,-.298),l(.236,-.198),l(.499,.098),l(.182,-.085),l(.2,-.142),l(.097,-.143),l(.41,-1.288),l(.252,-.481),l(.304,-.935),l(.18,-.65),l(.664,-.808),l(.363,-.722),l(.201,-.636),l(.252,-.946),l(.311,-.691),l(.187,-.128),l(.273,-.382),l(.013,-.296),l(-.312,-.847),l(.082,-.184),l(.455,-.452),l(.206,-.339),l(.028,-.24),l(-.093,-.226),l(-.166,-.805),l(-.292,-2.088),l(-.098,-.86),l(.031,-.565),l(.412,-.565),l(.37,-.537),l(.207,-.564),l(.007,-.734),l(-.339,-.521),l(-.098,-.409),l(.295,-.96),l(.218,-.941),l(.127,-.556),l(.461,-.594),l(.171,-.918),l(.243,-.975),l(.126,-.805),l(.082,-.565),l(-.063,-1.087),l(.422,-.664),l(.211,-.494),l(-.221,-.932),l(-.048,-.833),l(.148,-.24),l(-.022,-.917),l(.229,-.607),l(-.124,-.297),l(-.365,-.084),l(.06,-.324),l(-.046,-.396),l(.223,-.198),l(.402,-.198),l(.137,-.424),l(-.008,-.819),l(.093,-.593),l(.182,-.918),l(-.004,-2.344),l(-.172,-2.074),l(-.042,-1.539),l(-.194,-.974),l(-.15,-.387),l(.852,-.275),l(.259,-.298),l(.228,-.933),l(.15,-.199),l(.586,-.187),l(.152,.253),l(.555,.745),l(.304,.647),l(.193,1.213),l(.25,.521),l(.761,.744),l(.017,.282),l(-.437,1.555),l(-.04,.354),l(.249,.676),l(.769,1.11),l(.212,.563),l(.278,.973),l(.397,2.144),l(.272,.182),l(1.047,-.006),l(.107,.056),l(.212,.14),l(.161,.154),l(-.093,.636),l(-.541,1.457),l(-.36,.256),l(-1.346,.53),l(-.819,.372),l(-.204,.312),l(.25,.817),l(-.421,.722),l(-.007,.579),l(.113,.437),l(.34,.449),l(.03,.226),l(-.273,.369),l(-.161,.382),l(.114,.507),l(.53,.477),l(.011,.227),l(-.152,.311),l(-.333,.017),l(-.791,.089),l(-.329,.835),l(-.464,.835),l(-.608,.694),l(-.282,.439),l(-.823,1.839),l(.167,1.466),l(.054,.762),l(-.124,.185),l(-.492,.271),l(-.292,.34),l(-.388,1.201),l(-.156,.961),l(.285,.633),l(.408,1.154),l(.784,2.816),l(.055,.69),l(-.075,.41),l(-1.083,1.854),l(-.319,.595),l(.088,.409),l(.189,1.06),l(-.078,.325),l(-1.334,1.11),l(-.231,.312),l(-.142,1.075),l(.014,1.16),l(.249,1.103),l(.437,.932),l(-.202,.143),l(-.951,.529),l(-.126,.17),l(-.053,.312),l(-.511,2.427),l(-.316,.541),l(-.1,.37),l(.123,1.835),l(.231,.867),l(.012,.427),l(-.596,.317),l(-.172,.172),l(-.106,.271),l(.094,1.226),l(.125,.128),l(.555,.111),l(.088,.655),l(-.191,1.458),l(.252,.585),l(.26,.185),l(.789,.11),l(.302,.17),l(-.007,.186),l(-.245,.202),l(-.322,.13),l(-.726,.033),l(-.757,.146),l(.176,.171),l(.586,.298),l(.552,.385),l(.017,.216),l(-.767,.794),l(-.059,1.094),l(.158,1.035),l(-.216,.896),l(-.212,.434),l(-.226,.262),l(-.598,.161),l(-.28,.219),l(-.249,.781),l(.446,.648),l(-.069,.188),l(-.296,1.218),l(-.307,.263),l(-1.729,1.01),l(-.271,.292),l(-.037,.45),l(.28,1.309),l(.508,1.123),l(.218,.043),l(.961,-.283),l(.654,-.121),l(.187,.248),l(.231,2.285),l(.778,.568),l(.669,.041),l(1.41,-.052),l(2.827,.132),l(.841,.217),l(1.385,.36),l(.286,.039),M(236.642,296.773),l(-.394,-.113),l(-.43,-.028),l(-.21,-.171),l(-.133,-.229),l(.21,-.457),l(.15,-.657),l(-.087,-.514),l(.011,-.414),l(.364,-.728),l(.817,-.116),l(.36,.327),l(.044,.328),l(-.688,.443),l(-.146,.229),l(.493,.771),l(-.194,1.058),l(-.167,.271),M(238.177,317.937),l(-.445,-.177),l(.083,-.842),l(-.849,.075),l(-.073,-.368),l(.218,-.354),l(.823,.102),l(.508,-.207),l(.205,.103),l(.054,.812),l(-.267,.34),l(-.257,.518),M(247.801,322.062),l(-1.033,.102),l(-.467,-.118),l(-.55,-.237),l(-.42,.001),l(-.481,.104),l(-.935,.226),l(-.496,.03),l(.125,-.343),l(.202,-.312),l(-.104,-.312),l(.906,-.15),l(1.434,.058),l(.433,.323),l(.706,-.007),l(-.622,-.689),l(-.307,-.163),l(-.56,-.117),l(-.178,-.089),l(-.188,.03),l(-.338,-.341),l(-.229,-.4),l(1.611,-.581),l(-.044,-.296),l(-.165,-.147),l(-1.819,.285),l(-.292,-.222),l(.263,-.474),l(.146,-.163),l(1.074,-.52),l(.868,-.637),l(.414,.28),l(1.153,.062),l(-.008,1.144),l(-.098,3.675), +N(456.133,239.67),l(.187,.154),l(.163,.027),l(.154,.169),l(.264,.097),l(-.103,.227),l(.267,.451),l(.43,.478),l(.469,.604),l(.246,.96),l(.377,.662),l(.563,.491),l(.57,.321),l(.533,.223),l(.552,.266),l(.106,.169),l(-.051,.537),l(.109,.211),l(.201,.098),l(.78,-.019),l(.127,.239),l(-.032,.565),l(.163,.564),l(.524,.873),l(.352,.153),l(.938,.136),l(.549,.167),l(.479,.35),l(.306,.451),l(.186,.098),l(-.317,.411),l(-.388,.327),l(-.507,.243),l(-.747,.075),l(-.304,.115),l(-.7,.823),l(-.586,.583),l(-.362,.229),l(-.747,.357),l(-.388,.355),l(-.107,.636),l(-.222,.666),l(-.247,.241),l(-.634,.357),l(-.98,.33),l(-.249,.214),l(-.217,.708),l(-.345,.963),l(-.288,.354),l(-.237,.129),l(-.584,.116),l(-.43,-.026),l(-.473,.06),l(-.511,-.011),l(-.819,-.193),l(-.744,-.32),l(-.979,-.645),l(-.545,-.039),l(-.333,.186),l(-.084,.24),l(-.585,1.134),l(-.382,.469),l(-.651,.625),l(-.632,.428),l(-.8,.372),l(-.823,.033),l(-.854,.047),l(-.368,-.097),l(-.11,-.183),l(.003,-.48),l(.243,-.609),l(.166,-.538),l(-.21,-.762),l(-.547,-.943),l(-.716,-.787),l(-.528,-.067),l(-.007,-.806),l(-.013,-1.624),l(.009,-1.201),l(.106,-2.657),l(.146,-.028),l(1.564,-.052),l(.586,-.046),l(-.002,-3.561),l(.043,-1.201),l(.025,-.876),l(.007,-1.286),l(-.005,-1.215),l(1.183,-.021),l(2.962,-.47),l(1.048,-.134),l(.62,.773),l(.209,-.029),l(.993,-.938),l(.284,-.143),l(.891,-.02),l(.811,-.315), +N(279.288,257.295),l(.02,.239),l(-.544,1.57),l(-.375,.468),l(-1.007,.74),l(-.301,.27),l(-.352,.51),l(-.609,-.363),l(-.35,-.097),l(-.235,.029),l(-.387,.172),l(-.745,.131),l(-.71,.005),l(-.564,-.096),l(-.992,-.333),l(-.607,-.025),l(-1.187,.332),l(-.19,-.056),l(.064,-.212),l(.425,-.426),l(.486,-.398),l(.11,-.198),l(-.21,-.619),l(.048,-.227),l(.625,-.851),l(.617,-1.203),l(.018,-.268),l(-.939,-.503),l(-.65,-.18),l(-1.448,-.697),l(-1.632,-1.106),l(-.671,-.307),l(-1.173,-.204),l(-.498,-.237),l(-.835,-.588),l(-.576,-.562),l(-1.271,-1.376),l(-.782,-.913),l(-.225,-.337),l(-.19,-.056),l(.149,-.325),l(.395,-1.104),l(.385,-1.188),l(-.016,-.635),l(.133,-.509),l(.278,-.341),l(.698,-1.105),l(.332,-.383),l(.33,-.044),l(.784,-.202),l(1.104,-.162),l(1.076,-.204),l(.126,-.128),l(.843,.01),l(.928,-.02),l(.352,.054),l(1.952,.991),l(.089,.084),l(.253,.408),l(.084,.663),l(.521,.872),l(.104,.959),l(-.132,.862),l(-.086,.721),l(-.006,.72),l(.372,.04),l(.818,.15),l(.925,.221),l(.346,-.03),l(.709,-.413),l(.115,-.001),l(.724,.278),l(.843,.404),l(.121,.437),l(.487,2.524),l(.254,.563),l(.224,.055),l(1.29,-.445),l(.234,.112),l(.491,.336),l(.019,.141),l(-.321,.75),l(-.298,.835),l(-.222,.819),l(-.027,.777),l(.063,.423), +N(444.673,255.519),l(.528,.067),l(.716,.787),l(.547,.943),l(.21,.762),l(-.166,.538),l(-.243,.609),l(-.003,.48),l(.11,.183),l(.368,.097),l(.854,-.047),l(.823,-.033),l(.8,-.372),l(.632,-.428),l(.651,-.625),l(.382,-.469),l(.585,-1.134),l(.084,-.24),l(.333,-.186),l(.545,.039),l(.979,.645),l(.744,.32),l(.819,.193),l(.511,.011),l(.473,-.06),l(.43,.026),l(.584,-.116),l(.237,-.129),l(.288,-.354),l(.345,-.963),l(.217,-.708),l(.249,-.214),l(.98,-.33),l(.634,-.357),l(.247,-.241),l(.222,-.666),l(.107,-.636),l(.388,-.355),l(.747,-.357),l(.362,-.229),l(.586,-.583),l(.7,-.823),l(.304,-.115),l(.747,-.075),l(.507,-.243),l(.388,-.327),l(.317,-.411),l(.067,.042),l(.72,.023),l(.597,.139),l(.99,.403),l(.31,-.016),l(.529,-.145),l(.442,.025),l(.547,.124),l(.342,.225),l(.159,.183),l(.295,1.199),l(.181,.946),l(.441,.689),l(.33,.944),l(.147,.678),l(.072,.763),l(-.057,1.301),l(-.03,.806),l(.095,.324),l(-1.449,-.585),l(-.279,.199),l(-.657,.979),l(-.28,.567),l(-.005,.325),l(.39,.676),l(.307,.465),l(.458,.322),l(.671,.109),l(.595,-.004),l(.076,-.594),l(.064,-.198),l(.312,-.186),l(.131,-.015),l(.192,-.058),l(1.331,-.011),l(-.182,1.195),l(-.352,.849),l(-.182,.184),l(-.404,.1),l(-.093,.24),l(.199,.536),l(-.104,.467),l(-.248,.354),l(-.569,.453),l(-.923,.581),l(-.591,.75),l(-1.383,1.98),l(-.631,.834),l(-1.242,1.373),l(-1.193,1.062),l(-.829,.863),l(-1.434,1.034),l(-1.379,1.091),l(-.552,.382),l(-.989,.638),l(-.676,.298),l(-.782,.101),l(-.98,-.012),l(-.549,.071),l(-.132,.354),l(.013,.127),l(-.109,.085),l(-.449,-.098),l(-.553,-.126),l(-.303,.015),l(-.25,.198),l(-.272,.312),l(-.226,.113),l(-.36,-.056),l(-.768,-.408),l(-.759,-.168),l(-.542,-.013),l(-.31,.113),l(-.38,.27),l(-.482,-.099),l(-.645,-.21),l(-.295,.1),l(-.638,.043),l(-.589,.214),l(-.729,.538),l(-.72,.086),l(-.44,-.013),l(-.667,-.084),l(-.738,.072),l(-.575,.199),l(-.827,.82),l(-1.251,-.576),l(-.092,-.509),l(-.218,-.183),l(-.479,-.056),l(-.28,.085),l(-.257,-.479),l(-.343,-.056),l(-.149,.255),l(-.035,.197),l(-.312,-.112),l(-.119,-.226),l(.267,-.495),l(.103,-.424),l(-.857,-1.354),l(-.323,-.282),l(-.134,-.226),l(.173,-.17),l(.636,-.044),l(.172,-.424),l(.06,-.819),l(-.163,-.663),l(-.186,-.522),l(-.61,-1.143),l(-.75,-1.029),l(-.472,-.903),l(-.612,-1.383),l(-.646,-1.467),l(-.573,-.818),l(-.436,-.467),l(.152,-.068),l(.584,-.27),l(.317,-.416),l(.109,-.217),l(.335,-.116),l(.329,.127),l(.637,.348),l(.193,.222),l(.042,.345),l(.055,.528),l(.296,.212),l(.517,.039),l(.892,-.048),l(.745,.042),l(.581,.166),l(.427,-.034),l(.581,-.498),l(.545,-.302),l(.454,-.318),l(.057,-.205),l(-.025,-2.246),l(-.031,-1.894),l(.006,-3.434),M(462.462,268.501),l(.412,-.044),l(.194,-.553),l(.633,-.343),l(1.035,-.303),l(.263,-.199),l(.582,-1.007),l(.268,-.326),l(.143,-.241),l(-.104,-.226),l(-.967,-.744),l(-.33,-.337),l(-.422,-.266),l(-.308,.086),l(-.995,.359),l(-.65,.329),l(-.513,.567),l(-.275,.44),l(-.691,.611),l(.12,.409),l(.582,.858),l(.285,.366),l(.739,.561),M(432.955,250.661),l(.456,.006),l(.077,.749),l(-.04,.678),l(-.772,.02),l(-.078,-.354),l(-.028,-.396),l(.285,-.297),l(.101,-.406), +N(471.719,258.047),l(.075,.296),l(-.071,.495),l(.261,.889),l(.068,.382),l(-.131,.015),l(-.312,.186),l(-.064,.198),l(-.076,.594),l(-.595,.004),l(-.671,-.109),l(-.458,-.322),l(-.307,-.465),l(-.39,-.676),l(.005,-.325),l(.28,-.567),l(.657,-.979),l(.279,-.199),l(1.449,.585), +N(462.462,268.501),l(-.739,-.561),l(-.285,-.366),l(-.582,-.858),l(-.12,-.409),l(.691,-.611),l(.275,-.44),l(.513,-.567),l(.65,-.329),l(.995,-.359),l(.308,-.086),l(.422,.266),l(.33,.337),l(.967,.744),l(.104,.226),l(-.143,.241),l(-.268,.326),l(-.582,1.007),l(-.263,.199),l(-1.035,.303),l(-.633,.343),l(-.194,.553),l(-.412,.044), +N(790.15,283.022),l(.738,.197),l(.008,-.227),l(-.242,-.524),l(.052,-.284),l(.233,.014),l(.389,.17),l(.37,.751),l(.277,.964),l(.48,.17),l(1.753,.691),l(.506,.113),l(.37,-.072),l(.699,-.483),l(.885,-.343),l(.4,.027),l(.329,.17),l(.066,.454),l(-.022,.198),l(-.402,1.236),l(-.283,.072),l(-.761,.058),l(-.035,.683),l(-.124,.156),l(-.424,.029),l(-.746,.016),l(-.432,.2),l(-.271,.284),l(.041,.384),l(.254,.525),l(-.002,.213),l(-.151,.199),l(-.646,.515),l(-.898,1.129),l(-.847,1.058),l(-.756,.587),l(-.68,.316),l(-.337,-.171),l(-.47,-.313),l(-.237,-.328),l(.056,-.314),l(.288,-.386),l(.307,-.671),l(.398,-.5),l(-.031,-.343),l(-.271,-.128),l(-.761,-.582),l(-.421,-.185),l(-.593,-.184),l(-.98,-.452),l(-.306,-.256),l(-.11,-.17),l(.081,-.128),l(.419,-.157),l(1.389,-.685),l(.209,-.512),l(-.078,-.695),l(.087,-.312),l(.396,-.441),l(.032,-.383),l(-.482,-.837),l(.081,-.567),l(-.156,-.311),l(-.479,-.655),l(-.574,-.678),l(.102,-.164),l(-.145,-.304),l(-.291,-.351),l(-.336,-.188),l(-.29,-.163),l(.117,.233),l(.497,.515),l(.049,.141),l(-.169,0),l(-.211,-.281),l(-.525,-.631),l(-.622,-.771),l(-.518,-.561),l(.001,-.117),l(-.268,-.257),l(.04,-.141),l(.013,-.14),l(-.048,-.188),l(-.197,-.396),l(-.379,-.42),l(-.347,-.257),l(.163,-.046),l(.205,.093),l(.358,-.047),l(.131,-.093),l(.084,.28),l(-.149,.187),l(.186,.303),l(.177,.21),l(.167,.116),l(.228,.164),l(.041,-.141),l(.269,.023),l(.519,.257),l(.42,.117),l(.274,.07),l(.128,.257),l(-.011,.141),l(.185,.023),l(.146,-.188),l(.185,.023),l(-.022,.164),l(.227,.351),l(.249,.187),l(.233,.28),l(-.18,.023),l(-.076,.164),l(.093,.163),l(-.242,-.023),l(-.175,-.047),l(.143,.117),l(.251,.188),l(.23,.233),l(.352,.28),l(.063,.234),l(.019,.21),l(-.261,-.047),l(.096,.164),l(.239,.351),l(.256,.188),l(-.292,.023),l(-.226,0),l(-.205,-.047),l(-.006,.141),l(.306,.14),l(.324,.164),l(-.09,.211),l(.205,.046),l(.265,-.023),l(.226,0),l(.223,.141),l(-.114,.07),l(-.031,.141),l(.025,.141),l(.136,.06),M(782.939,297.694),l(-.088,.158),l(-.558,.13),l(-.309,.288),l(-.322,.101),l(-.246,.244),l(-.692,-.242),l(-.16,.086),l(.15,.216),l(.429,.415),l(-.141,.173),l(.02,.259),l(-.064,.431),l(-.218,-.071),l(-.976,-.099),l(.418,.229),l(.449,.244),l(-.278,.49),l(-.427,.896),l(-.212,.549),l(-.418,.318),l(-.673,.349),l(-.171,.246),l(-.259,.145),l(-.581,.233),l(-.593,.406),l(-.398,.015),l(-1.156,-.258),l(-.628,.112),l(-.585,-.442),l(-.812,-.158),l(-.373,-.066),l(-.162,-.308),l(-.467,-.098),l(-.24,.142),l(-.062,.168),l(-.78,.095),l(-.214,-.166),l(-.515,-.095),l(-.146,-.286),l(.432,-.089),l(-.223,-.216),l(.328,-.116),l(.322,-.001),l(-.452,-.482),l(.82,.266),l(-.464,-.576),l(.121,-.145),l(.946,.156),l(.082,-.13),l(-.141,-.173),l(-.201,-.216),l(-.06,-.288),l(.283,-.303),l(.569,-.246),l(.328,-.374),l(.561,-.375),l(.102,-.302),l(.998,-.575),l(1.106,-.275),l(.713,-.331),l(.544,-.36),l(.377,-.101),l(.685,-.575),l(.066,-.272),l(.48,-.302),l(.373,-.015),l(.787,-.331),l(.664,-.402),l(.126,-.215),l(-.008,-.172),l(.266,-.144),l(.448,-.302),l(-.109,-.501),l(.076,-.214),l(.166,-.44),l(.306,.048),l(.066,-.152),l(.58,-.259),l(.444,-.272),l(.137,-.285),l(.131,-1.187),l(.512,-.647),l(.372,.047),l(.365,.165),l(.032,.259),l(.337,.06),l(.187,.186),l(.231,.799),l(.312,.242),l(.973,-.645),l(.426,-.029),l(.367,.113),l(.222,.5),l(-.197,.399),l(.299,.429),l(.066,.271),l(-.611,.659),l(-.261,.401),l(-.476,.358),l(-.868,.746),l(-.578,.359),l(-.295,.13),l(-.236,.258),l(-.389,.159),l(-.271,.258),l(.416,.407),l(.428,.047),l(.421,.289),l(-.276,.113),l(-.484,.07),l(-.503,-.296),l(-.488,.131),l(-.352,.158), +N(247.899,318.387),l(.008,-1.144),l(.821,.289),l(.06,.206),l(-.354,.312),l(-.534,.337),M(248.453,316.576),l(-.286,-.039),l(-1.385,-.36),l(-.841,-.217),l(-2.827,-.132),l(-1.41,.052),l(-.669,-.041),l(-.778,-.568),l(-.231,-2.285),l(-.187,-.248),l(-.654,.121),l(-.961,.283),l(-.218,-.043),l(-.508,-1.123),l(-.28,-1.309),l(.037,-.45),l(.271,-.292),l(1.729,-1.01),l(.307,-.263),l(.296,-1.218),l(.069,-.188),l(-.446,-.648),l(.249,-.781),l(.28,-.219),l(.598,-.161),l(.226,-.262),l(.212,-.434),l(.216,-.896),l(-.158,-1.035),l(.059,-1.094),l(.767,-.794),l(-.017,-.216),l(-.552,-.385),l(-.586,-.298),l(-.176,-.171),l(.757,-.146),l(.726,-.033),l(.322,-.13),l(.245,-.202),l(.007,-.186),l(-.302,-.17),l(-.789,-.11),l(-.26,-.185),l(-.252,-.585),l(.191,-1.458),l(-.088,-.655),l(-.555,-.111),l(-.125,-.128),l(-.094,-1.226),l(.106,-.271),l(.172,-.172),l(.596,-.317),l(-.012,-.427),l(-.231,-.867),l(-.123,-1.835),l(.1,-.37),l(.316,-.541),l(.511,-2.427),l(.053,-.312),l(.126,-.17),l(.951,-.529),l(.202,-.143),l(-.437,-.932),l(-.249,-1.103),l(-.014,-1.16),l(.142,-1.075),l(.231,-.312),l(1.334,-1.11),l(.078,-.325),l(-.189,-1.06),l(-.088,-.409),l(.319,-.595),l(1.083,-1.854),l(.075,-.41),l(-.055,-.69),l(-.784,-2.816),l(-.408,-1.154),l(-.285,-.633),l(.156,-.961),l(.388,-1.201),l(.292,-.34),l(.492,-.271),l(.124,-.185),l(-.054,-.762),l(-.167,-1.466),l(.823,-1.839),l(.282,-.439),l(.608,-.694),l(.464,-.835),l(.329,-.835),l(.791,-.089),l(.333,-.017),l(.152,-.311),l(-.011,-.227),l(-.53,-.477),l(-.114,-.507),l(.161,-.382),l(.273,-.369),l(-.03,-.226),l(-.34,-.449),l(-.113,-.437),l(.007,-.579),l(.421,-.722),l(-.25,-.817),l(.204,-.312),l(.819,-.372),l(1.346,-.53),l(.36,-.256),l(.541,-1.457),l(.093,-.636),l(-.161,-.154),l(-.212,-.14),l(-.107,-.056),l(2.026,-2.087),l(.292,-.27),l(.322,.181),l(.193,.169),l(.615,.194),l(.901,-.034),l(.527,-.045),l(.531,.067),l(.37,.195),l(.341,.309),l(.416,1.084),l(1.034,-1.784),l(.686,-.004),l(1.33,.077),l(.592,.109),l(.19,.056),l(.225,.337),l(.782,.913),l(1.271,1.376),l(.576,.562),l(.835,.588),l(.498,.237),l(1.173,.204),l(.671,.307),l(1.632,1.106),l(1.448,.697),l(.65,.18),l(.939,.503),l(-.018,.268),l(-.617,1.203),l(-.625,.851),l(-.048,.227),l(.21,.619),l(-.11,.198),l(-.486,.398),l(-.425,.426),l(-.064,.212),l(.19,.056),l(1.187,-.332),l(.607,.025),l(.992,.333),l(.564,.096),l(.71,-.005),l(.745,-.131),l(.387,-.172),l(.235,-.029),l(.35,.097),l(.609,.363),l(.352,-.51),l(.301,-.27),l(1.007,-.74),l(.375,-.468),l(.544,-1.57),l(-.02,-.239),l(.957,-.161),l(.462,-.017),l(.206,.196),l(.517,1.154),l(-.094,1.638),l(-.161,.467),l(-.521,.313),l(-1.754,.744),l(-.348,.242),l(-1.633,1.448),l(-1.435,1.363),l(-1.805,1.816),l(-.833,.88),l(-.214,.27),l(-.443,.524),l(-.065,.452),l(-.595,2.359),l(-.103,.522),l(.049,.847),l(.168,.986),l(-.118,.325),l(-.48,.524),l(-.24,.495),l(-.011,.522),l(.194,.577),l(-.054,.338),l(-.162,.273),l(-.26,.325),l(.015,.226),l(.924,.831),l(.68,.281),l(.715,.281),l(.283,.169),l(.281,.325),l(-.025,.325),l(-.362,.523),l(-.043,.396),l(.105,.339),l(.174,.269),l(.466,.325),l(.522,.168),l(.109,.113),l(.226,.892),l(-.308,.481),l(-.75,.937),l(-.729,.766),l(-.313,.737),l(-.368,.284),l(-.832,.342),l(-1.04,.342),l(-1.92,.401),l(-1.795,.188),l(-1.361,.116),l(-.945,.044),l(-1.175,-.11),l(-.934,-.226),l(-.128,.199),l(.036,.808),l(.322,.312),l(.308,.184),l(-.09,.298),l(-.381,.624),l(-.345,.498),l(-.069,.385),l(.392,.682),l(.066,.285),l(-.208,.214),l(-.105,.057),l(-1.251,.473),l(-1.137,.116),l(-.814,-.069),l(-.967,-.34),l(-1.47,-.396),l(-.246,.057),l(-.23,.271),l(.041,.598),l(.429,.684),l(.037,.398),l(-.242,.643),l(.092,.385),l(.773,.54),l(.796,.084),l(.369,-.2),l(-.387,-.398),l(.872,-.188),l(.383,-.043),l(.234,1.041),l(.052,.3),l(-.144,.157),l(-.299,.101),l(-.448,.072),l(-.261,-.157),l(-.104,-.299),l(-.115,-.071),l(-1.046,.073),l(-.67,.201),l(-.212,.101),l(.151,.214),l(.591,.07),l(.47,.113),l(.452,.113),l(.06,.028),l(-.864,.388),l(-.776,.287),l(-.577,.602),l(.003,.414),l(.161,.787),l(-.081,.258),l(-.815,.817),l(.022,.215),l(.423,.371),l(-.491,.116),l(-1.194,.088),l(-.48,.087),l(-.632,.246),l(-.619,.389),l(-.56,.548),l(-.549,.821),l(-.052,.389),l(.061,.375),l(.312,.591),l(.48,.446),l(.98,.633),l(.657,.244),l(.97,.143),l(.362,.086),l(.14,.274),l(-.151,.796),l(-.128,.348),l(-.342,.464),l(-.189,.145),l(-1.08,.524),l(-1.541,.814),l(-.712,.698),l(-.179,.276),l(-.093,.45),l(.111,.523),l(-.169,.451),l(-.239,.32),l(-.97,.454),l(-.969,.25),l(-.421,.221),l(-.323,.396),l(-.226,.791),l(-.054,.514),l(.2,.777),l(.547,.896),l(.699,.779),l(.235,.339),l(-.101,.032),M(247.899,318.387),l(.18,.182),l(.148,.073),l(.607,-.075),l(.344,.133),l(.648,.725),l(.908,.665),l(.993,.756),l(.525,.222),l(.73,.37),l(.246,.074),l(.42,-.001),l(.483,.163),l(1.283,.027),l(.142,-.016),l(-.006,.224),l(-.19,.209),l(-.492,.06),l(-1.198,.092),l(-.777,.196),l(-.364,0),l(-1.179,-.355),l(-.753,-.088),l(-1.15,-.027),l(-.814,-.014),l(-.831,.081),l(.098,-3.675), +N(346.758,54.457),l(.127,-.162),l(.42,-.179),l(.894,.015),l(.674,-.098),l(-.354,-.227),l(-.405,-.34),l(.317,-.342),l(.277,0),l(.956,.42),l(.67,.048),l(.3,-.163),l(-.191,-.26),l(-.625,-.373),l(.366,-.245),l(1.037,.226),l(.957,.08),l(.746,.275),l(.446,.551),l(-.119,.405),l(-.441,.292),l(.922,.806),l(.553,-.356),l(.352,-.13),l(.63,-.114),l(.49,-.179),l(.061,-.21),l(-.169,-.778),l(.542,-.245),l(.501,.454),l(.426,.307),l(.489,.209),l(.215,.016),l(.185,-.13),l(-.264,-.454),l(.243,-.163),l(.27,-.033),l(.817,-.164),l(.683,.438),l(.536,.242),l(.542,.063),l(.05,-.178),l(-.358,-.535),l(1.006,.145),l(1.439,.079),l(.787,-.115),l(.427,-.229),l(-.021,-.716),l(1.167,.08),l(.635,.471),l(1.118,.323),l(.683,.015),l(.273,.243),l(-.252,.552),l(.786,.29),l(1.674,.159),l(.127,.145),l(.143,.548),l(-.07,.387),l(-.152,.256),l(-.152,.256),l(-.443,.129),l(-.815,.018),l(-.195,.096),l(-.04,.431),l(-.515,.463),l(-.497,.16),l(-.568,-.031),l(-.422,-.159),l(-.817,.495),l(-.539,.144),l(-1.46,.463),l(-.853,.113),l(-.726,.001),l(-.771,.097),l(-.784,.587),l(-.473,.127),l(-1.078,.097),l(-.709,-.03),l(-1.316,-.171),l(-.608,-.142),l(-1.283,-.489),l(-1.058,-.093),l(-.443,.064),l(-1.041,-.014),l(-1.834,-.124),l(-.297,-.206),l(.434,-.191),l(1.127,-.352),l(.701,-.59),l(-.818,-.015),l(-.51,-.126),l(-.428,-.398),l(-.253,-.095),l(-.358,.081),l(-1.564,.115),l(-.557,.033),l(-.37,-.223),l(.141,-.192),l(.388,-.129),l(.669,-.097),l(.794,-.017),l(.729,-.114),l(1.049,-.098),l(.376,-.194),l(.178,-.322),l(-.144,-.258),l(-.358,-.177),l(-.426,-.015),l(-.478,-.145),l(-1.005,-.047),l(-.821,.099),l(-.424,.162),l(-.676,.082),l(-1.041,-.272),l(-.16,-.21), +N(462.829,67.958),l(.145,.053),l(.16,.131),l(-.043,.174),l(-.175,.044),l(-.189,0),l(-.116,0),l(-.088,.043),l(-.058,.131),l(-.175,.277),l(-.219,.204),l(-.319,.131),l(-.204,.131),l(-.088,.16),l(.029,.16),l(.131,.437),l(.073,.189),l(.029,.16),l(-.175,.131),l(0,.175),l(.175,.233),l(.203,.087),l(.088,.073),l(0,.073),l(.015,.087),l(.043,.146),l(.175,.043),l(.059,.059),l(-.175,.073),l(-.262,.043),l(-.16,.058),l(-.059,.102),l(-.087,.116),l(-.131,0),L(461.402,72),l(-.015,.087),l(-.116,.058),l(.081,.106),l(-.125,.025),l(-.087,-.015),l(-.306,-.043),l(-.16,-.058),l(-.175,-.073),l(-.204,-.044),l(-.131,.102),l(-.204,-.029),l(-.131,.044),l(-.16,.087),l(-.146,.014),l(-.146,-.087),l(-.116,-.029),l(-.175,0),l(-.204,-.117),l(-.116,-.174),l(-.203,-.117),l(-.146,-.043),l(-.072,-.117),l(-.189,0),l(-.247,-.043),l(-.204,-.117),l(-.029,0),l(-.276,-.014),l(-.102,-.102),l(-.248,-.043),l(-.116,-.102),l(-.189,-.087),l(0,.073),l(-.116,.087),l(-.131,-.058),l(-.015,-.073),l(-.087,-.029),l(-.103,0),l(-.276,.117),l(-.102,.029),l(-.131,.015),l(-.219,.015),l(-.146,.043),l(-.262,.029),l(-.276,.087),l(-.116,.102),l(-.087,0),l(.156,-.19),l(-.003,-.351),l(.183,-.238),l(-.368,-.21),l(-.605,.437),l(-.334,-.251),l(-.527,-.038),l(.043,-.942),l(-.396,.188),l(-.336,-.415),l(.158,-.202),l(-.209,-.254),l(.265,-.074),l(-.092,-.252),l(.344,-.042),l(1.026,-.084),l(-.006,-.132),l(.561,-.108),l(.133,-.188),l(.436,.101),l(.074,-.113),l(.317,.05),l(.083,-.215),l(1.104,.193),l(.446,-.294),l(.091,.165),l(.514,-.089),l(1.383,.029),l(1.152,.167),l(.305,.12),l(.592,-.045),l(.971,.09),l(.426,-.108),l(.271,-.24),l(-.006,-.009), +N(461.353,72.251),l(.37,-.004),l(-.015,.116),l(0,.117),l(.232,.073),l(.204,.087),l(.087,.073),l(.204,.058),l(-.015,.087),l(-.029,.116),l(-.015,.087),l(-.102,.073),l(-.087,.015),l(-.103,.029),l(.131,.087),l(-.072,.131),l(.029,.117),l(-.073,.087),l(-.102,.073),l(-.044,.102),l(.204,-.059),l(.146,-.015),l(.131,.073),l(.087,.014),l(.073,.044),l(-.059,.087),l(-.043,.073),l(.116,.102),l(.131,.058),l(.029,.16),l(.146,.102),l(.16,.043),l(-.059,.087),l(.131,.117),l(-.015,.189),l(.088,.233),l(-.044,.087),l(-.015,.117),l(-.061,.042),l(-.241,.044),l(-.24,.051),l(-.12,.12),l(-.223,.034),l(-.137,.154),l(-.137,.085),l(-.069,.103),l(-.068,.206),l(-.188,.035),l(-.239,-.035),l(-.24,-.034),l(-.325,-.034),l(-.359,0),l(-.172,.068),l(-.103,.137),l(-.223,.085),l(-.154,0),l(-.103,-.017),l(-.086,.052),l(-.377,-.035),l(-.273,-.068),l(-.154,-.171),l(-.138,-.154),l(-.325,-.137),l(-.497,-.223),l(-.342,-.24),l(-.377,-.034),l(-.583,-.035),l(-.325,-.12),l(-.291,-.188),l(-.086,-.257),l(-.188,.017),l(-.171,.068),l(-.36,.171),l(-.394,.017),l(-.24,0),l(-.273,.085),l(-.24,-.085),l(-.309,-.103),l(-.6,-.017),l(-.291,.069),l(-.359,-.069),l(-.291,-.051),l(-.154,.034),l(-.274,.069),l(-.103,-.052),l(-.12,-.137),l(-.154,0),l(-.257,.068),l(-.188,0),l(-.754,-.017),l(-.445,-.085),l(-.754,.171),l(-.599,.154),l(-.429,.103),l(-.257,.137),l(-.052,.188),l(-.526,.026),l(-.065,-.059),l(.073,-.837),l(.035,-.302),l(.127,-.167),l(.672,-.379),l(.034,-.717),l(.267,-.162),l(.267,-.273),l(.217,-.203),l(.296,-.026),l(1.056,-.199),l(.166,-.046),l(.162,-.066),l(.29,0),l(.049,.237),l(.657,.388),l(.422,.162),l(.23,.473),l(.091,.15),l(.441,.196),l(.785,.059),l(.868,-.244),l(.24,-.122),l(.178,-.288),l(-.052,-.394),l(-.193,-.869),l(.198,-.243),l(.045,-.055),l(.087,0),l(.116,-.102),l(.276,-.087),l(.262,-.029),l(.146,-.043),l(.219,-.015),l(.131,-.015),l(.102,-.029),l(.276,-.117),l(.103,0),l(.087,.029),l(.015,.073),l(.131,.058),l(.116,-.087),l(0,-.073),l(.189,.087),l(.116,.102),l(.248,.043),l(.102,.102),l(.276,.014),l(.029,0),l(.204,.117),l(.247,.043),l(.189,0),l(.072,.117),l(.146,.043),l(.203,.117),l(.116,.174),l(.204,.117),l(.175,0),l(.116,.029),l(.146,.087),l(.146,-.014),l(.16,-.087),l(.131,-.044),l(.204,.029),l(.131,-.102),l(.204,.044),l(.175,.073),l(.16,.058),l(.306,.043),l(.087,.015),l(.125,-.025), +N(451.02,79.165),l(-.029,-.038),l(-.034,-.137),l(-.018,-.171),l(.068,-.206),l(.068,-.154),l(.224,-.12),l(-.052,-.12),l(-.018,-.137),l(-.171,-.069),l(-.188,-.034),l(-.103,-.103),l(-.086,-.137),l(-.223,.017),l(-.257,0),l(-.445,0),l(-.223,.051),l(-.086,-.103),l(-.514,-.068),l(-.257,-.069),l(-.223,-.12),l(-.24,0),l(-.086,-.052),l(-.051,-.154),l(-.12,.034),l(-.353,.096),l(-.043,-.077),l(.128,-.012),l(.034,-.183),l(-.439,-.646),l(-.008,-.14),l(-.042,-.727),l(-.112,-.102),l(.526,-.026),l(.052,-.188),l(.257,-.137),l(.429,-.103),l(.599,-.154),l(.754,-.171),l(.445,.085),l(.754,.017),l(.188,0),l(.257,-.068),l(.154,0),l(.12,.137),l(.103,.052),l(.274,-.069),l(.154,-.034),l(.291,.051),l(.359,.069),l(.291,-.069),l(.6,.017),l(.309,.103),l(.24,.085),l(.273,-.085),l(.24,0),l(.394,-.017),l(.36,-.171),l(.171,-.068),l(.188,-.017),l(.086,.257),l(.291,.188),l(.325,.12),l(.583,.035),l(.377,.034),l(.342,.24),l(.497,.223),l(.325,.137),l(.138,.154),l(.154,.171),l(.273,.068),l(.377,.035),l(-.017,.171),l(-.086,.154),l(-.034,.12),l(-.12,.137),l(-.086,.137),l(.343,.034),l(.274,.052),l(.085,.051),l(-.119,.051),l(-.086,0),l(-.103,.154),l(-.018,.154),l(-.171,.017),l(-.12,-.086),l(-.12,.051),l(-.239,-.034),l(-.154,.034),l(-.086,.154),l(-.103,.154),l(-.257,.068),l(-.429,0),l(-.137,.137),l(-.12,.12),l(-.034,.154),l(-.086,.171),l(.103,.171),l(-.068,.137),l(-.239,.154),l(0,.137),l(-.068,.085),l(-.069,.137),l(.172,.034),l(.205,0),l(.138,.206),l(-.086,.188),l(-.274,.017),l(-.223,-.068),l(0,-.154),l(-.034,-.085),l(-.086,-.069),l(-.171,.051),l(-.12,.086),l(-.291,-.034),l(-.068,.137),l(-.24,.12),l(-.154,0),l(-.188,-.034),l(-.273,.103),l(.086,.171),l(-.069,.12),l(-.171,.034),l(-.137,-.034),l(-.206,.051),l(-.377,.154),l(-.291,0),l(-.068,-.103),l(-.12,-.051),l(-.239,.051),l(-.377,.017),l(-.24,.034),l(-.291,-.034),l(-.154,.034),l(-.093,-.035),l(-.09,-.171),l(-.016,-.029),l(-.099,-.186),l(-.284,-.487),l(-.679,-.243),l(-.04,-.014),l(-.641,.021), +N(452.867,80.273),l(.093,.035),l(.154,-.034),l(.291,.034),l(.24,-.034),l(.377,-.017),l(.239,-.051),l(.12,.051),l(.068,.103),l(.291,0),l(.377,-.154),l(.206,-.051),l(.137,.034),l(.171,-.034),l(.069,-.12),l(-.086,-.171),l(.273,-.103),l(.188,.034),l(.154,0),l(.24,-.12),l(.068,-.137),l(.291,.034),l(.12,-.086),l(.171,-.051),l(.086,.069),l(.034,.085),l(0,.154),l(.223,.068),l(.274,-.017),l(.086,-.188),l(-.138,-.206),l(-.205,0),l(-.172,-.034),l(.069,-.137),l(.068,-.085),l(0,-.137),l(.239,-.154),l(.068,-.137),l(-.103,-.171),l(.086,-.171),l(.034,-.154),l(.12,-.12),l(.137,-.137),l(.429,0),l(.257,-.068),l(.103,-.154),l(.086,-.154),l(.154,-.034),l(.239,.034),l(.12,-.051),l(.12,.086),l(.171,-.017),l(.018,-.154),l(.103,-.154),l(.086,0),l(.119,-.051),l(-.085,-.051),l(-.274,-.052),l(-.343,-.034),l(.086,-.137),l(.12,-.137),l(.034,-.12),l(.086,-.154),l(.017,-.171),l(.086,-.052),l(.103,.017),l(.154,0),l(.223,-.085),l(.103,-.137),l(.172,-.068),l(.359,0),l(.325,.034),l(.24,.034),l(.239,.035),l(.188,-.035),l(.068,-.206),l(.069,-.103),l(.137,-.085),l(.137,-.154),l(.223,-.034),l(.12,-.12),l(.24,-.051),l(.241,-.044),l(.165,.147),l(.229,.066),l(.197,-.131),l(.181,.016),l(.312,.033),l(.132,.148),l(.082,.148),l(.197,-.033),l(.214,-.065),l(.361,-.049),l(.312,.049),l(.296,.065),l(.147,.017),l(0,.115),l(-.164,.099),l(-.017,.099),l(.065,.148),l(.164,.148),l(.197,0),l(.214,-.197),l(.279,-.016),l(.165,0),l(.147,-.099),l(.23,-.083),l(.131,.049),l(.099,.049),l(.247,-.049),l(.542,.115),l(.132,.131),l(.279,.099),l(.099,.099),l(.147,.099),l(.165,.033),l(.147,-.033),l(.049,.115),l(-.065,.115),l(0,.083),l(-.033,.164),l(-.131,.165),l(.197,.247),l(.147,.099),l(.05,.164),l(-.066,.131),l(-.114,0),l(0,.083),l(-.115,.082),l(-.099,.049),l(-.033,.165),l(-.049,.147),l(.345,.049),l(.132,.181),l(.082,.115),l(.181,-.049),l(.132,.033),l(-.099,.115),l(-.066,.131),l(.017,.099),l(.214,.017),l(.164,.263),l(.115,.23),l(.443,.213),l(.23,.066),l(.279,.082),l(.164,.099),l(.066,.148),l(-.099,.197),l(-.066,.181),l(.182,.066),l(.361,-.066),l(.378,.066),l(.361,.099),l(.263,.066),l(-.032,.065),l(-.066,.049),l(-.082,.017),l(.099,.181),l(.296,.148),l(.279,.066),l(.033,.131),l(-.065,.164),l(-.296,0),l(-.148,.083),l(-.049,.065),l(-.444,.247),l(-.525,.099),l(-.51,-.016),l(-.197,-.132),l(-.328,-.049),l(-.362,.017),l(-.131,.165),l(-.099,.131),l(.017,.164),l(.279,.263),l(.296,.164),l(0,.165),l(-.132,.066),l(.099,.148),l(.147,.131),l(-.082,.099),l(.033,.164),l(.033,.23),l(-.033,.099),l(.164,.082),l(.082,.115),l(.165,.066),l(.002,.142),l(-.519,-.005),l(-.522,.056),l(-.112,.131),l(-.205,-.056),l(-.187,-.037),l(-.336,.075),l(-.057,.13),l(-.111,.112),l(-.317,.187),l(-.188,.261),l(-.261,.224),l(-.057,.206),l(.243,.205),l(.056,.149),l(-.131,.206),l(-.261,-.019),l(-.149,-.056),l(-.149,-.206),l(-.112,-.056),l(-.187,-.075),l(-.224,-.037),l(-.225,.037),l(-.242,.075),l(-.299,.019),l(-.149,-.131),l(-.224,.075),l(-.188,.093),l(-.316,.056),l(-.188,-.056),l(-.037,-.205),l(-.112,-.131),l(-.168,-.131),l(-.13,.038),l(-.131,.075),l(-.168,0),l(-.299,.149),l(-.131,.149),l(-.168,0),l(-.094,-.187),l(-.13,-.075),l(-.206,0),l(-.224,.112),l(-.131,-.187),l(-.224,-.093),l(-.131,.112),l(-.354,.056),l(-.262,-.112),l(-.112,0),l(-.019,.205),l(-.168,.093),l(-.093,-.056),l(.056,-.224),l(-.243,-.038),l(-.187,-.056),l(-.541,.112),l(0,-.149),l(-.187,0),l(.019,-.224),l(-.28,-.037),l(-.242,.075),l(-.523,-.112),l(-.578,-.056),l(-.075,-.056),l(-.522,0),l(-.205,-.168),l(-.262,.019),l(-.522,-.093),l(-.467,.075),l(-.485,0),l(-.354,-.056),l(-.355,.056),l(-.354,.056),l(-.485,-.038),l(-.485,.019),l(-.205,.187),l(-.037,.168),l(-.374,.168),l(-.373,.206),l(-.112,-.112),l(-.261,0),l(-.374,-.019),l(-.037,.131),l(0,.045),l(-.126,-.137),l(.315,-.752),l(-.013,-.25),l(-.218,-.146),l(-.149,-.176),l(-.421,-.146),l(-.289,-.012),l(.128,-.292),l(.291,-.328),l(.571,-.244),l(.44,-.03),l(.263,-.208),l(.023,-.236),l(-.172,-.502),l(-.615,-1.5),l(-.16,-.302), +N(400.125,81.146),l(.633,.305),l(.208,.207),l(.208,.37),l(-.038,.193),l(-.545,.563),l(.714,.176),l(.396,-.311),l(.527,-.119),l(.602,.028),l(.807,.176),l(.467,.354),l(.235,.752),l(-.077,.221),l(-.322,.414),l(-1.068,.473),l(-.767,.561),l(-.96,.237),l(1.223,.167),l(.501,.043),l(.354,-.104),l(.39,.117),l(-.066,.516),l(-.997,.308),l(.005,.199),l(-.479,-.084),l(-1.068,.443),l(-.879,-.142),l(-.293,-.048),l(-1.119,.211),l(-.587,-.211),l(-.598,.112),l(-1.584,.141),l(.137,.295),l(-.907,-.168),l(-.264,.168),l(-.911,-.337),l(-.334,.143),l(-.913,.089),l(-.093,.569),l(-.337,.316),l(-.37,.042),l(-.272,-.252),l(-.53,-.172),l(-.135,.151),l(-.527,-.077),l(-.948,.324),l(-.701,.552),l(-.326,-.231),l(-.775,-.147),l(1.2,-.472),l(.492,-.476),l(.447,-.097),l(.468,-.388),l(.118,-.485),l(.242,.063),l(.367,-.211),l(-.008,-.274),l(1.013,-.105),l(.76,.119),l(.927,.007),l(.073,-.338),l(.308,-.142),l(.321,-.556),l(-.939,.394),l(-.725,.016),l(-1.467,-.482),l(-1.866,-.055),l(-.399,-.191),l(-.156,-.162),l(.417,-.325),l(.983,-.194),l(.721,-.237),l(.38,-.384),l(.066,-.827),l(-.119,-.192),l(-.713,.046),l(-.34,-.044),l(.288,-.355),l(.387,-.223),l(.802,-.253),l(1.394,-.062),l(.922,-.076),l(-.316,-.548),l(.172,-.683),l(.253,-.461),l(-.045,-.312),l(-.834,.061),l(-.484,-.296),l(-.2,-.312),l(.309,-.507),l(.617,-.433),l(-.347,-.104),l(-.596,-.088),l(-.735,.3),l(-.476,.061),l(-.753,-.222),l(-.088,.194),l(-.222,.194),l(-.672,-.103),l(-.464,-.133),l(.1,-.343),l(.348,-.36),l(.604,-.706),l(-.293,-.134),l(-.305,-.39),l(.028,-.24),l(.304,-.106),l(.3,-.196),l(-.194,-.496),l(-.306,.076),l(-.636,.453),l(-.442,.031),l(-.526,.287),l(-.14,-.421),l(.302,-.527),l(.438,-.559),l(.065,-.257),l(-.417,-.195),l(-.196,-.045),l(-.218,.302),l(-.394,.257),l(-.493,-.165),l(.299,-.575),l(.54,-.455),l(.09,-.136),l(-.225,-.575),l(.366,-.092),l(.225,-.197),l(-.672,-.515),l(.432,-.351),l(.752,.151),l(.387,-.092),l(-.645,-.759),l(.975,-.169),l(-.457,-.502),l(.416,-.382),l(.924,.365),l(.824,-.093),l(.686,-.139),l(.867,-.047),l(.612,.014),l(.303,.259),l(-.307,.29),l(-1.726,.704),l(-.46,.274),l(-.218,.441),l(.222,.182),l(.784,.029),l(.877,-.078),l(.685,-.001),l(.53,.075),l(1.563,-.064),l(.458,.378),l(-.363,.425),l(-.212,.323),l(.098,.112),l(-.565,.66),l(-.226,.111),l(-.339,.437),l(-.696,.261),l(-.382,.038),l(.451,.186),l(.508,.167),l(-.116,.015),l(-.272,.19),l(-.61,.052),l(-.275,.196),l(-1.337,-.025),l(.404,.223),l(.302,0),l(.492,.093),l(.432,-.006),l(.519,-.223),l(.413,-.025),l(.449,.161),l(.656,.164),l(.673,.566),l(.496,.228),l(.118,.165),l(-.067,.238),l(.312,.78),l(.371,.536),l(.438,.189),l(.714,.107),l(.59,.549),l(.688,.593),l(.135,.52),l(-.188,.49),l(.257,.124),M(387.915,77.13),l(-.128,-.325),l(.149,-.335),l(.38,-.089),l(.079,.501),l(-.307,.251),l(-.173,-.003),M(386.786,80.184),l(-.178,-.272),l(-.967,.072),l(.123,-.256),l(-.364,-.15),l(-.26,-.257),l(-.335,-.107),l(-.253,.364),l(-.751,.257),l(-.778,-.192),l(-.401,-.278),l(-.101,-.278),l(.86,-.278),l(-.483,-.257),l(.817,-.107),l(.385,-.484),l(-.029,-.235),l(.449,-.09),l(.508,-.15),l(.781,-.077),l(.424,.044),l(.389,.104),l(.362,-.046),l(.218,.149),l(.519,.791),l(.047,.179),l(-.081,.298),l(.308,.446),l(-.155,.328),l(-.402,.328),l(-.354,.12),l(-.299,.038), +N(578.943,106.217),l(-.41,-.375),l(-.466,-.098),l(-.663,0),l(-.196,-.27),l(-.27,-.147),l(-.147,-.344),l(-.564,.049),l(-.981,-.246),l(-.662,.074),l(-1.35,-.024),l(-.662,-.098),l(-.712,-.221),l(-.785,.147),l(-.761,0),l(-.858,.024),l(-.441,.27),l(-.54,-.098),l(-.908,-.196),l(-.735,-.246),l(-.761,-.27),l(-.589,-.074),l(-.688,.123),l(-.466,.368),l(-.245,.736),l(.024,.442),l(-.344,-.123),l(-.81,-.123),l(-.688,-.196),l(-.883,-.245),l(-.883,-.147),l(-.663,.098),l(-.736,.123),l(-.318,.368),l(-.393,.442),l(.044,.273),l(-.322,.031),l(-.377,.377),l(-.283,-.126),l(-.22,.063),l(-.346,.283),l(-.534,.471),l(-.755,.189),l(-.943,.377),l(-.282,.188),l(-.221,.472),l(-.439,.188),l(-.504,.44),l(.157,.409),l(-.125,.188),l(-.66,0),l(-.44,-.346),l(.062,-.283),l(-.062,-.283),l(-.44,-.314),l(-.346,0),l(-1.006,.094),l(-.691,.032),l(-.503,-.063),l(-.346,-1.069),l(-.221,-.817),l(-1.006,0),l(-.031,-.754),l(.188,-.409),l(.031,-1.038),l(-.66,.314),l(-.66,-1.006),l(-.597,-.22),l(-.724,-.723),l(-1.1,.409),l(-2.767,-.188),l(-2.578,.346),l(-2.012,-1.666),l(-5.722,-2.986),l(-5.658,1.289),l(-.056,8.174),l(-.158,-.014),l(-.341,.106),l(-.489,.043),l(-.447,-.255),l(-.638,-.703),l(-.256,-.511),l(-.617,-.383),l(-.681,-.383),l(-.512,-.234),l(-.979,.085),l(-1.277,.298),l(-.937,.532),l(-.529,.453),l(.092,-.399),l(-.06,-.18),l(-.12,-.12),l(.14,-.26),l(.2,-.2),l(.14,-.32),l(.04,-.3),l(.18,-.2),l(-.159,-.24),l(-.4,-.16),l(-.459,.06),l(-.18,-.16),l(-.3,.06),l(-.2,.04),l(-.199,-.18),l(-.221,-.32),l(-.319,-.28),l(-.34,0),l(-.359,.02),l(0,-.2),l(.08,-.28),l(-.2,-.379),l(-.239,-.12),l(-.2,-.24),l(-.399,-.799),l(-.08,-.28),l(-.56,-.12),l(-.699,-.08),l(-.14,-.16),l(.02,-.439),l(.16,-.12),l(.3,-.06),l(.399,.02),l(.34,.02),l(.479,.14),l(.539,.18),l(.18,-.08),l(.36,-.08),l(-.2,-.16),l(-.26,-.12),l(-.399,-.2),l(-.2,-.24),l(.26,-.36),l(.28,-.04),l(.08,-.26),l(.18,-.299),l(.12,-.14),l(.26,.04),l(.319,-.08),l(.16,-.1),l(.339,.12),l(.24,0),l(1.119,-.04),l(.999,.14),l(.499,.02),l(-.159,-.08),l(-.34,-.2),l(-.479,-.12),l(-.021,-.3),l(.2,-.2),l(.279,-.22),l(.221,-.28),l(.119,-.52),l(.12,-.28),l(-.16,-.24),l(-.14,-.16),l(.1,-.2),l(.26,-.2),l(-.119,-.12),l(-.101,-.3),l(-.359,-.12),l(-.359,-.04),l(-.68,-.1),l(-.2,.16),l(-.199,.08),l(-.52,.08),l(-.46,-.12),l(-.319,-.26),l(-.26,-.06),l(-.68,-.12),l(-.56,.06),l(-.659,.319),l(-.42,.02),l(-.799,.5),l(-.72,.28),l(-.499,.06),l(-.42,-.02),l(-.279,.24),l(-.213,.18),l(-.616,-.19),l(-.857,-.377),l(-.068,-.308),l(.343,-.103),l(.309,.103),l(.445,.103),l(.138,-.103),l(-.96,-1.131),l(-.343,-.514),l(-.479,-.206),l(-.515,-.445),l(-.514,-.034),l(-.343,.034),l(-.583,-.206),l(-.103,.343),l(-.514,-.514),l(.068,-.309),l(-.138,-.377),l(-1.37,-.343),l(.65,-1.165),l(.446,-.274),l(.239,-.206),l(-.239,-.274),l(-.343,-.171),l(.205,-1.303),l(.823,-.137),l(.343,-.549),l(.103,-.308),l(.411,-.069),l(.514,.24),l(.48,.548),l(.514,.411),l(.651,0),l(.411,-.24),l(.068,-.446),l(-.171,-.411),l(-.068,-.445),l(.479,-.206),l(.891,-.411),l(.172,-.24),l(.309,-.309),l(.514,-.171),l(.549,-.068),l(.788,-.377),l(.548,-.343),l(.515,-.309),l(.651,.069),l(.479,0),l(.309,.274),l(.651,-.137),l(.273,-.137),l(.617,-.24),l(.411,.069),l(.411,.514),l(.788,.035),l(.617,-.069),l(.96,.171),l(0,.343),l(.582,.206),l(.789,.343),l(.411,.274),l(.068,.583),l(.274,.137),l(.239,-.274),l(-.205,-.48),l(-.034,-.24),l(.72,.068),l(.582,.548),l(.686,.137),l(.411,.24),l(.686,-.171),l(.274,-.274),l(.377,-.343),l(.514,-.377),l(.823,.068),l(.65,.035),l(.651,.411),l(.617,-.068),l(.137,-.412),l(1.062,-.103),l(.754,.103),l(.274,.548),l(.926,.309),l(.754,.137),l(.411,.171),l(.651,-.343),l(.171,-.309),l(.24,0),l(.343,.343),l(.959,.034),l(1.577,-.411),l(.137,-.309),l(.138,-.686),l(-.24,-.24),l(-1.165,-.171),l(-.274,-.308),l(-.651,-.069),l(-.377,-.137),l(.068,-.171),l(-.377,-.137),l(-.239,0),l(-.164,-.274),l(.467,-.067),l(.735,-.368),l(.588,-.147),l(.331,-.294),l(-.441,-.478),l(-.146,-.257),l(.662,-.515),l(.698,-.184),l(1.103,.147),l(.515,-.073),l(.11,-.257),l(-.956,-.294),l(-1.065,-.11),l(0,-.331),l(.294,-.074),l(-.294,-.221),l(-.074,-.441),l(.185,-.515),l(.33,-.074),l(1.066,.147),l(.515,0),l(.772,0),l(.368,-.184),l(1.396,-.405),l(1.029,-.037),l(.735,-.11),l(1.545,-.11),l(.588,-.073),l(.331,.073),l(.221,-.331),l(.625,-.331),l(1.177,-.037),l(2.021,-.405),l(1.876,-.073),l(.625,-.074),l(.367,-.368),V(0,77.39),l(.515,-.037),l(.589,-.184),l(.11,-.221),l(.735,-.037),l(.919,.147),l(.515,.11),l(.772,.257),l(.625,-.11),l(.882,-.037),l(.368,.404),l(-.037,.331),l(.147,.221),l(.515,.22),l(-.11,.331),l(-.147,.257),l(.073,.331),l(-.33,.037),l(.184,.257),l(.478,.074),l(.295,-.147),l(.44,.11),l(.368,-.147),l(.367,.074),l(.331,-.221),l(.294,.11),l(.295,.368),l(.367,.221),l(.147,-.147),l(.184,-.147),l(.478,.037),l(.405,.294),l(.478,.11),l(.441,-.221),l(.367,0),l(-.146,.294),l(-.441,.184),l(-.331,.441),l(.331,.184),l(.441,-.11),l(.771,-.073),l(.441,.037),l(.552,.184),l(.294,-.294),l(.772,-.441),l(1.103,-.257),l(.956,-.515),l(.772,-.221),l(.515,-.22),l(.809,-.074),l(0,.441),l(-.515,.11),l(-.11,.368),l(1.104,.588),l(.809,.294),l(1.287,.772),l(1.066,1.029),l(1.69,2.133),l(.846,.882),l(1.104,1.434),l(.515,-.257),l(.331,-.257),l(.367,-.515),l(.92,0),l(.367,.331),l(0,.368),l(.478,0),l(.258,.257),l(.184,.184),l(.589,0),l(.992,0),l(.993,-.221),l(.771,-.221),l(.993,-.037),l(.698,.441),l(.772,.588),l(.331,.625),l(.956,.147),l(.588,.552),l(.662,.699),l(.882,.073),l(.993,.074),l(.478,-.368),l(.625,-.184),l(-.073,.331),l(.441,.331),l(.294,.478),l(.589,0),l(.064,.145),l(-.551,.034),l(-.542,.148),l(-.279,.262),l(-.011,.275),l(-.035,.478),l(-.306,.219),l(-.289,.06),l(-1.199,.093),l(-.428,.277),l(-.34,.581),l(.097,.75),l(.213,.707),l(-.157,.39),l(-.444,.392),l(-.417,.103),l(-.718,.062),l(-1.402,-.079),l(-.594,-.141),l(-.721,-.141),l(-1.096,-.254),l(-.427,.507),l(-.516,1.141),L(584.2,97.43),l(-.286,.605),l(-.137,.418),l(.622,.514),l(.126,.286),l(-.156,.245),l(-.231,.145),l(-.394,.074),l(-1.133,-.238),l(-.5,-.184),l(-.35,.06),l(-1.082,.207),l(-1.799,.254),l(-.393,.188),l(-.215,.302),l(-.068,.215),l(.232,.185),l(.366,-.06),l(.483,.141),l(.03,1.357),l(.345,.627),l(.29,.441),l(.119,.47),l(-.222,.33),l(-.705,.546),l(-.32,.401),l(-.02,.399),l(.139,.86), +N(386.786,80.184),l(-.304,.038),l(-.223,.09),l(.241,.252),l(.361,.771),l(.287,1.213),l(-.061,.281),l(-.359,.341),l(-.242,.414),l(-.145,.473),l(-.185,.044),l(-.284,-.058),l(-.616,.031),l(-.15,.212),l(-.913,.042),l(-.84,.132),l(-.247,.144),l(-.661,.286),l(-.903,.498),l(-.628,.035),l(-.879,.283),l(-1.28,.084),l(.053,-.378),l(-.089,-.441),l(-.848,.1),l(-.171,-.487),l(.734,-.254),l(-1.186,-.021),l(.062,-.233),l(1.286,.027),l(.198,-.104),l(.039,-.222),l(.107,-.31),l(.515,-.134),l(.692,-.031),l(.13,-.281),l(-1.07,.099),l(.387,-.437),l(-.187,-.159),l(.481,-.468),l(.694,-.011),l(.163,-.089),l(-.174,-.311),l(-.348,.177),l(-.309,-.131),l(-.319,.03),l(-.391,-.177),l(-.414,.001),l(-.182,.106),L(378,81.478),l(.309,-.306),l(-.29,-.142),l(.759,-.126),l(-.139,-.301),l(.391,-.235),l(-.481,-.214),l(-.59,.128),L(378,79.792),l(.38,-.268),l(.215,-.16),l(.928,.187),l(.336,-.075),l(.527,.038),l(1.102,.123),l(-.214,-.358),L(382.132,79),l(.198,-.321),l(-1.373,0),l(.154,-.15),l(.569,-.107),l(.061,-.29),l(.291,-.479),l(.505,-.181),l(.804,-.169),l(.22,.302),l(.354,.149),l(.156,-.031),l(.029,.235),l(-.385,.484),l(-.817,.107),l(.483,.257),l(-.86,.278),l(.101,.278),l(.401,.278),l(.778,.192),l(.751,-.257),l(.253,-.364),l(.335,.107),l(.26,.257),l(.364,.15),l(-.123,.256),l(.967,-.072),l(.178,.272), +N(452.998,85.535),V(0,85.49),l(.037,-.131),l(.374,.019),l(.261,0),l(.112,.112),l(.373,-.206),l(.374,-.168),l(.037,-.168),l(.205,-.187),l(.485,-.019),l(.485,.038),l(.354,-.056),l(.355,-.056),l(.354,.056),l(.485,0),l(.467,-.075),l(.522,.093),l(.262,-.019),l(.205,.168),l(.522,0),l(.075,.056),l(.578,.056),l(.523,.112),l(.242,-.075),l(.28,.037),l(-.019,.224),l(.187,0),l(0,.149),l(.541,-.112),l(.187,.056),l(.243,.038),l(-.056,.224),l(.093,.056),l(.168,-.093),l(.019,-.205),l(.112,0),l(.262,.112),l(.354,-.056),l(.131,-.112),l(.224,.093),l(.131,.187),l(.224,-.112),l(.206,0),l(.13,.075),l(.094,.187),l(.168,0),l(.131,-.149),l(.299,-.149),l(.168,0),l(.131,-.075),l(.13,-.038),l(.168,.131),l(.112,.131),l(.037,.205),l(.188,.056),l(.316,-.056),l(.188,-.093),l(.224,-.075),l(.149,.131),l(.299,-.019),l(.242,-.075),l(.225,-.037),l(.224,.037),l(.187,.075),l(.112,.056),l(.149,.206),l(.149,.056),l(.261,.019),l(.131,-.206),l(-.056,-.149),l(-.243,-.205),l(.057,-.206),l(.261,-.224),l(.188,-.261),l(.317,-.187),l(.111,-.112),l(.057,-.13),l(.336,-.075),l(.187,.037),l(.205,.056),l(.112,-.131),l(.522,-.056),l(.519,.005),l(.357,.089),l(.469,.022),l(.313,-.156),l(.179,-.291),l(.134,-.268),l(.536,.246),l(.536,-.022),l(.67,-.223),l(.692,.112),l(.514,-.134),l(.201,.268),l(.312,.134),l(.246,.335),l(.134,.201),l(.246,.156),l(.312,.156),l(0,.268),l(-.312,-.022),l(-.312,.134),l(.134,.291),l(.111,.357),l(.269,.29),l(.647,0),l(.156,.112),l(.514,-.067),l(.38,.022),l(0,.312),l(.402,0),l(0,.357),l(.224,.268),l(.089,.246),l(-.089,.179),l(.089,.224),l(.179,.089),l(.291,.29),l(.268,-.179),l(.47,-.067),l(.268,.067),l(.469,.291),l(.201,-.067),l(.179,.022),l(.179,.156),l(.425,-.112),l(.312,-.112),l(.269,0),l(.536,-.134),l(.357,-.067),l(.111,.156),l(.268,.179),l(0,.134),l(.201,.179),l(.022,.134),l(.402,.044),l(.179,.179),l(.224,.112),l(.29,-.134),l(.045,-.157),l(.224,-.067),l(.29,.268),l(.425,.067),l(.469,.112),l(.268,.112),l(.357,-.067),l(.201,.179),l(.291,.089),l(.469,.022),l(.111,.224),l(.357,.156),l(.269,0),l(.134,-.044),l(.201,-.089),l(.156,.089),l(-.089,.111),l(-.022,.179),l(.111,.089),l(.09,.179),l(-.045,.224),l(-.201,.089),l(-.156,.067),l(-.357,.201),l(-.312,.044),l(.223,.246),l(.269,.089),l(.29,.044),l(-.134,.156),l(-.312,0),l(-.246,0),l(-.045,.179),l(-.044,.224),l(.156,.067),l(.179,.067),l(.044,.134),l(.045,.179),l(.09,.201),l(.066,.067),l(-.156,.491),l(-.156,.291),l(0,.156),l(-.335,.134),l(-.805,-.157),l(-.736,.045),l(-.269,0),l(-.022,.179),l(-.223,.179),l(-.38,.134),l(-.357,.022),l(-.224,.089),l(-.09,.514),l(0,.224),l(-.021,.112),l(-.012,.126),l(-.779,.104),l(-.971,.06),l(-.511,.405),l(-.729,.189),l(-1.135,.075),l(-1.119,.248),l(-.502,.318),l(-.463,.059),l(-.453,-.316),l(-.369,.621),l(-.31,.188),l(-.477,.044),l(-.438,-.057),l(-.959,.031),l(-.5,.16),l(.641,.287),l(1.957,1.004),l(.053,.172),l(-.093,.188),l(.163,.244),l(.562,.042),l(.511,-.13),l(.675,-.146),l(1.052,.013),l(.439,.114),l(-.235,.259),l(-.106,.245),l(-.228,.144),l(-.578,.116),l(-.31,.029),l(-.591,-.157),l(-.473,.044),l(-.71,.489),l(-1.007,.045),l(-.538,.188),l(-.527,.488),l(-.269,.101),l(-.786,-.07),l(-.588,-.171),l(.364,-.746),l(-.096,-.416),l(-.264,-.287),l(-.854,-.286),l(-.193,-.014),l(-.629,.016),l(-.151,.043),l(-.16,-.187),l(.887,-.505),l(.644,-.261),l(.772,-.188),l(.221,-.116),l(-.246,-.46),l(-.435,-.071),l(-.799,.044),l(-1.015,.045),l(-.698,-.1),l(-.195,-.101),l(-.418,-.432),l(.584,-.405),l(-.528,-.605),l(-.378,.361),l(-.541,.001),l(-1.001,.146),l(-.565,.131),l(-.694,.722),l(-1.003,.867),l(-.754,.203),l(-.223,.044),l(-.287,.504),l(.079,.158),l(.178,.093),l(-.706,-.131),l(-.665,.261),l(-.457,0),l(-.033,.189),l(-.609,-.047),l(-.398,-.166),l(-.119,-.249),l(-.15,.02),l(.055,-.077),l(.102,-.025),l(.126,.013),l(.113,.013),l(.189,0),l(.088,-.114),l(0,-.088),l(-.063,-.113),l(.025,-.113),l(.126,-.063),l(.051,-.063),l(.075,-.013),l(.089,-.025),l(.088,-.063),l(.089,-.088),l(.024,-.126),l(-.013,-.114),l(.14,-.013),l(.29,-.063),l(.075,-.076),l(-.025,-.088),l(-.062,-.088),l(.126,-.114),l(.037,-.063),l(-.012,-.088),l(-.114,-.113),l(.051,-.101),l(-.088,-.151),l(-.063,-.101),l(.202,-.151),l(.239,-.025),l(.126,-.088),l(.113,.025),l(.013,.088),l(-.013,.214),l(.063,.013),l(.113,0),V(0,96.92),l(-.013,-.063),l(.101,.038),l(.063,.051),l(.025,-.076),l(.075,-.038),l(.139,-.012),l(0,.075),l(.089,.063),l(.075,0),l(.126,.164),l(.076,-.076),l(.075,-.076),l(.013,-.05),l(.101,-.025),l(.177,0),l(-.037,.189),l(.176,.025),l(.038,-.038),l(.038,-.038),l(.139,.013),l(.227,0),l(.038,-.025),l(.075,-.076),l(-.126,-.013),l(-.164,-.126),l(-.101,-.051),l(-.075,-.05),l(.013,-.038),l(.101,-.063),l(-.025,-.113),l(.038,-.101),l(-.013,-.126),l(-.051,-.139),l(-.101,-.063),l(-.177,-.076),l(-.075,0),l(-.151,-.126),l(-.151,-.063),l(-.151,-.038),l(.051,-.151),l(.037,-.088),l(-.037,-.051),l(-.127,.038),l(-.062,-.114),l(.113,-.038),l(-.013,-.189),l(.089,-.075),l(-.025,-.101),l(-.038,-.088),l(-.113,0),l(-.102,.05),l(-.088,.051),l(-.113,-.088),l(-.089,-.101),l(-.188,-.101),l(-.139,-.025),l(-.102,-.139),l(-.05,-.139),l(.177,-.139),l(0,-.189),l(.024,-.114),l(.051,-.05),l(-.126,-.063),l(.164,-.151),l(-.113,-.025),l(-.076,-.063),l(-.062,-.126),l(-.14,-.013),l(-.062,.101),l(-.126,-.025),l(-.215,-.025),l(-.126,-.189),l(-.05,-.189),l(-.417,-.075),l(-.277,.012),l(-.062,.051),l(-.076,.101),l(-.062,-.05),l(0,-.076),l(-.089,-.025),l(-.101,.038),l(.038,-.05),l(.088,-.101),l(-.025,-.063),l(-.113,0),l(-.177,.038),l(-.126,-.025),l(-.101,.013),l(-.076,-.076),l(-.05,-.063),l(-.101,-.063),l(-.151,-.013),l(-.139,-.05),l(-.14,-.126),l(-.214,-.088),l(-.038,-.013),l(-.126,.025),l(-.05,.025),l(-.114,-.051),l(-.088,-.025),l(-.139,.025),l(-.177,.051),l(-.177,-.025),l(-.062,.038),l(-.126,.114),l(-.202,0),l(-.265,-.038),l(-.126,.051),l(-.315,-.114),l(-.088,.101),l(.012,.113),l(-.126,0),l(-.075,-.063),l(-.126,.114),l(-.06,.052),l(-.634,.08),l(-.151,.311),l(-.278,.178),l(-1.992,.191),l(-.186,.215),l(-.243,.119),l(-.339,.06),l(-.188,-.227),l(-.327,.004),l(-.025,-.231),l(-.363,.045),l(-1.115,-.066),l(-.958,-.193),l(-.241,.107),l(-.787,-.121),l(-.136,.085),l(-.678,-.387),l(-.554,-.2),l(-.668,-.301),l(-.166,.015),l(1.047,-1.471),l(.653,.018),l(-.349,-.383),l(-.044,-.552),l(.082,-.306),l(1.509,-1.218),l(.599,-.398),l(.286,-.181),l(.429,-.013),l(.255,-.24),l(.009,-.314),l(-.328,-.302),l(.085,-.133),l(.298,-.048),l(-.316,-.193),l(-.816,-.835),l(.074,-.242),l(-.161,-.175), +N(660.044,89.132),l(-.295,.31),l(-.687,1.207),l(-1.224,1.959),l(-.381,.58),l(.269,.836),l(.051,.029),l(.342,-.045),l(.929,-.395),l(.754,-.062),l(.576,-.018),l(.317,.085),l(.431,.416),l(.292,.07),l(1.191,-.786),l(.438,-.002),l(.928,.212),l(.538,.199),l(.797,.5),l(.879,.99),l(.599,.501),l(.048,.273),l(-.107,.217),l(-.414,.218),l(-.464,-.127),l(-1.074,-.008),l(-.432,-.099),l(-.854,.033),l(-.937,.221),l(-.539,.146),l(-.831,.278),l(-.353,.189),l(-.483,-.127),l(-.464,.045),l(-.47,.204),l(-.363,.333),l(-.312,.82),l(-.241,.216),l(-.347,.188),l(-.638,.248),l(-.896,.134),l(-.624,-.054),l(-.438,-.012),l(-.224,-.013),l(-1.192,.91),l(-.742,.433),l(-.744,.047),l(-.982,.005),l(-.592,-.125),l(-.668,-.382),l(-.718,-.154),l(-.316,.073),l(-.457,.231),l(-.539,.589),l(-.214,.401),l(.003,.343),l(.389,.569),l(.599,.411),l(.188,.228),l(-.123,.271),l(-.326,.259),l(-1.265,.292),l(-.67,.389),l(-1.111,1.046),l(-.265,.172),l(-1.941,.737),l(-.651,.061),l(-.987,-.08),l(-1.514,.065),l(-1.339,.007),l(-1.204,.349),l(-.816,.289),l(-.736,.274),l(-.303,.101),l(-1.44,.534),l(-.686,.289),l(-.481,.017),l(-.433,-.197),l(-.253,-.297),l(-.61,-.067),l(-.663,.061),l(-.929,-.123),l(-1.599,-.433),l(-1.006,-.365),l(-.815,-.551),l(-.521,-.168),l(-1.69,-.119),l(-1.164,-.022),l(-.937,-.023),l(-2.861,.059),l(-1.165,-.022),l(-.802,-.109),l(-1.241,-.207),l(-1.979,-.018),l(-.444,-.254),l(-.467,-.439),l(-1.571,-2.161),l(-.105,-.542),l(-.744,-.096),l(-.839,-.31),l(-1.645,-.806),l(-.632,-.268),l(-.998,-.224),l(-.668,-.083),l(-.995,-.038),l(-1.505,-.021),l(-1.062,-.181),l(-.724,-.312),l(-.233,-.229),l(-.105,-.43),l(.035,-.129),l(.369,-.347),l(.214,-.389),l(.237,-.75),l(.215,-.447),l(-.401,-.66),l(-1.07,-1.451),l(-.568,-.618),l(-.354,-.143),l(-.633,-.144),l(-.731,-.167),l(-.614,-.069),l(-.834,-.415),l(-1.301,-.745),l(-.371,-.433),l(-.24,-.563),l(-.131,-.405),l(-.062,-.145),l(.154,-.044),l(.799,-.425),l(.599,-.207),l(1.387,-.08),l(.603,-.148),l(.727,-.381),l(.017,-.012),l(.971,-.692),l(.787,-.398),l(1.143,-.341),l(1.512,-.476),l(.84,-.18),l(.953,.097),l(.932,.156),l(1.842,.122),l(.831,.083),l(.694,.755),l(.393,.406),l(.699,.113),l(1.458,-.008),l(.719,.083),l(.85,-.004),l(.875,.068),l(.312,.114),l(.576,.186),l(.562,-.018),l(.755,-.28),l(.31,-.162),l(.744,-.572),l(.163,-.526),l(-.116,-.204),l(-.396,-.304),l(-.409,-.86),l(.098,-.293),l(.905,-.839),l(1.269,-.96),l(.84,.201),l(1.028,.098),l(1.036,.185),l(1.748,.328),l(.702,.231),l(.989,.317),l(.767,.143),l(.145,.204),l(.004,.541),l(.182,.481),l(.408,.451),l(.421,.333),l(1.643,.531),l(.673,.113),l(2.48,-.538),l(.796,-.077),l(1.172,.037),l(1.423,.022),l(.769,.229),l(1.333,.75),l(.623,.331),l(1.132,.313),l(.812,.373),l(1.318,.254),l(.905,.241),l(.984,.082),l(.739,.039),l(1.602,-.11),l(1.018,-.063),l(.532,-.075),l(.867,-.106),l(1.147,-.136),l(.526,-.163),l(.604,-.264),l(.447,-.394),l(.755,-.498),l(1.165,-.487),l(.333,-.002),l(.609,-.047),l(.74,.156),l(.751,.506),l(.34,.129),l(.86,.169),l(1.228,-.297),l(.622,-.018),l(.431,.168), +N(406.183,86.551),l(1.051,-.494),l(.485,-.089),l(.574,.087),l(.465,-.016),l(.209,-.147),l(.477,.098),l(.407,.042),l(.52,-.034),l(-.025,-.157),l(.307,.012),l(.307,0),l(.267,-.182),l(.313,.242),l(.173,-.121),l(.228,.061),l(.292,.375),l(.535,-.109),l(.754,.375),l(-.11,.423),l(-.172,.097),l(.001,.338),l(.672,-.024),l(.344,.177),l(.282,.365),l(.038,.468),l(-.422,.376),l(-.225,-.072),l(-.142,.08),l(-.245,.147),l(-.213,.322),l(.017,.327),l(.31,.204),l(-.136,.348),l(-.079,-.114),l(-.694,.174),l(-.127,-.228),l(-.371,-.204),l(-.341,-.192),l(-.529,-.048),l(.039,-.228),l(-.146,-.18),l(.119,-.373),l(-.245,.072),l(-.193,.313),l(-.446,.035),l(-.406,.075),l(-.285,-.122),l(.072,-.198),l(-.091,-.175),l(.159,-.241),l(-.375,-.168),l(-.576,-.048),l(-.259,.012),l(-.159,-.301),l(-.518,.012),l(-.194,-.133),l(-.202,-.458),l(-.153,-.17),l(-.41,.208),l(-.141,.071),l(-.266,-.127),l(-.311,-.335),l(-.208,-.447), +N(438.22,91.952),l(.039,-.044),l(.065,-.105),l(.014,-.131),l(.092,-.066),l(.146,-.119),l(.026,-.04),l(.171,-.053),l(.093,-.026),l(.092,.053),l(.132,.053),l(.158,0),l(.065,-.026),l(.093,0),l(.065,.026),l(.065,.026),l(.093,-.026),l(.145,-.04),l(.132,0),l(.118,-.053),l(.079,-.053),l(.066,-.026),l(.105,-.026),l(.039,0),l(.053,-.079),l(.04,-.092),l(.079,-.079),l(.092,.026),l(.105,-.04),l(.145,-.066),l(.053,-.105),l(.053,-.079),l(.026,-.132),l(.026,-.092),l(.053,-.092),l(.118,-.013),l(.105,-.013),l(.132,-.079),l(.119,-.053),l(.118,-.092),l(.053,-.079),l(.132,-.066),l(.065,-.04),L(442,89.998),l(.145,.013),l(.105,.026),l(.066,-.04),l(.065,-.066),l(.071,.012),l(.285,.041),l(.03,.228),l(.43,-.048),l(.183,-.24),l(.193,.016),l(.062,-.112),l(.261,-.024),l(.194,.24),l(.073,.169),l(.331,-.025),l(.066,.18),l(-.026,.083),l(.003,.204),l(.389,-.083),l(.18,.12),l(.149,-.135),l(.104,-.177),l(.558,-.204),l(.168,.056),l(.483,-.046),l(.46,.254),l(.373,-.18),l(.073,-.137),l(.508,.041),l(.561,-.076),l(.129,.13),l(.703,.186),l(.104,.216),l(.424,.101),l(.831,.33),l(-1.047,1.471),l(-.629,.076),l(-.437,-.143),l(-.534,-.359),l(-1.062,.035),l(-.717,.047),l(-1.024,.759),L(444.857,93),l(-.59,-.072),l(-.499,.061),l(-.761,.134),l(-.255,.001),l(-.334,.568),l(-1.651,-.036),l(-.414,-.027),l(-.617,-.17),l(-.399,-.172),l(-.245,.146),l(-.761,-.547),l(-.155,-.26),l(.097,-.581),l(-.053,-.093), +N(442.391,98.111),l(-.589,.203),l(-.433,.031),l(-.668,.047),l(-.58,-.098),l(-1.116,-.671),l(-1.412,-.612),l(-.215,-.197),l(-.364,-.333),l(-.304,-.59),l(.346,-.299),l(.154,-.294),l(-.204,-.188),l(.04,-.375),l(.409,-.062),l(.157,-.206),l(-.136,-.196),l(-.452,-.063),l(.223,-.197),l(.325,0),l(.164,.134),l(.701,-.054),l(.019,-.367),l(.636,-.291),l(.245,-.146),l(.399,.172),l(.617,.17),l(.414,.027),l(1.651,.036),l(.334,-.568),l(.255,-.001),l(.761,-.134),l(.499,-.061),l(.59,.072),l(.427,-.063),l(1.024,-.759),l(.717,-.047),l(1.062,-.035),l(.534,.359),l(.437,.143),l(.629,-.076),l(.166,-.015),l(.668,.301),l(.554,.2),l(.678,.387),l(-.45,.338),l(-1.125,.267),l(-.581,.408),l(-.968,1.451),l(-.63,.84),l(-.753,.567),l(-.361,.16),l(-.724,.047),l(-.264,.103),l(-.176,-.002),l(-.907,-.067),l(-.889,.077),l(-1.535,.529), +N(459.717,92.836),l(.06,-.052),l(.126,-.114),l(.075,.063),l(.126,0),l(-.012,-.113),l(.088,-.101),l(.315,.114),l(.126,-.051),l(.265,.038),l(.202,0),l(.126,-.114),l(.062,-.038),l(.177,.025),l(.177,-.051),l(.139,-.025),l(.088,.025),l(.114,.051),l(.05,-.025),l(.126,-.025),l(.038,.013),l(.214,.088),l(.14,.126),l(.139,.05),l(.151,.013),l(.101,.063),l(.05,.063),l(.076,.076),l(.101,-.013),l(.126,.025),l(.177,-.038),l(.113,0),l(.025,.063),l(-.088,.101),l(-.038,.05),l(.101,-.038),l(.089,.025),l(0,.076),l(.062,.05),l(.076,-.101),l(.062,-.051),l(.277,-.012),l(.417,.075),l(.05,.189),l(.126,.189),l(.215,.025),l(.126,.025),l(.062,-.101),l(.14,.013),l(.062,.126),l(.076,.063),l(.113,.025),l(-.164,.151),l(.126,.063),l(-.051,.05),l(-.024,.114),l(0,.189),l(-.177,.139),l(.05,.139),l(.102,.139),l(.139,.025),l(.188,.101),l(.089,.101),l(.113,.088),l(.088,-.051),l(.102,-.05),l(.113,0),l(.038,.088),l(.025,.101),l(-.089,.075),l(.013,.189),l(-.113,.038),l(.062,.114),l(.127,-.038),l(.037,.051),l(-.037,.088),l(-.051,.151),l(.151,.038),l(.151,.063),l(.151,.126),l(.075,0),l(.177,.076),l(.101,.063),l(.051,.139),l(.013,.126),l(-.038,.101),l(.025,.113),l(-.101,.063),l(-.013,.038),l(.075,.05),l(.101,.051),l(.164,.126),l(.126,.013),l(-.075,.076),l(-.038,.025),l(-.227,0),l(-.139,-.013),l(-.038,.038),l(-.038,.038),l(-.176,-.025),l(.037,-.189),l(-.177,0),l(-.101,.025),l(-.013,.05),l(-.075,.076),l(-.076,.076),l(-.126,-.164),l(-.075,0),l(-.089,-.063),l(0,-.075),l(-.139,.012),l(-.075,.038),l(-.025,.076),l(-.063,-.051),l(-.101,-.038),l(.013,.063),l(0,.088),l(-.113,0),l(-.063,-.013),l(.013,-.214),l(-.013,-.088),l(-.113,-.025),l(-.126,.088),l(-.239,.025),l(-.202,.151),l(.063,.101),l(.088,.151),l(-.051,.101),l(.114,.113),l(.012,.088),l(-.037,.063),l(-.126,.114),l(.062,.088),l(.025,.088),l(-.075,.076),l(-.29,.063),l(-.14,.013),l(.013,.114),l(-.024,.126),l(-.089,.088),l(-.088,.063),l(-.089,.025),l(-.075,.013),l(-.051,.063),l(-.126,.063),l(-.025,.113),l(.063,.113),l(0,.088),l(-.088,.114),l(-.189,0),l(-.113,-.013),l(-.126,-.013),l(-.102,.025),l(-.055,.077),l(-.03,.004),l(-.062,-.237),l(-.218,-.106),l(.16,-.071),l(-.021,-.267),l(-.104,-.561),l(.323,-.978),l(.027,-.404),l(-.353,-.856),l(-.604,-.286),l(-1.037,-1.119),L(460.567,93),l(-.626,-.191),l(-.225,.028), +N(445.722,97.573),l(.176,.002),l(.264,-.103),l(.724,-.047),l(.361,-.16),l(.753,-.567),l(.63,-.84),l(.968,-1.451),l(.581,-.408),l(1.125,-.267),l(.45,-.338),l(.136,-.085),l(.787,.121),l(.241,-.107),l(.958,.193),l(1.115,.066),l(.363,-.045),l(.025,.231),l(.327,-.004),l(.188,.227),l(.339,-.06),l(.243,-.119),l(.186,-.215),l(1.992,-.191),l(.278,-.178),l(.151,-.311),l(.634,-.08),l(.225,-.028),L(460.567,93),l(.767,1.17),l(1.037,1.119),l(.604,.286),l(.353,.856),l(-.027,.404),l(-.323,.978),l(.104,.561),l(.021,.267),l(-.16,.071),l(.218,.106),l(.062,.237),l(.03,-.004),l(.15,-.02),l(.119,.249),l(.398,.166),l(.609,.047),l(.033,-.189),l(.457,0),l(.665,-.261),l(.706,.131),l(.149,.079),l(.062,.259),l(-.293,.446),l(-.27,.316),l(-.436,.044),l(-.382,.043),l(-.382,.245),l(-.515,.617),l(-.252,.645),l(-.096,.787),l(-.044,.223),l(-.671,-.12),l(-1.346,-.336),l(-.514,-.226),l(-.295,-.042),l(-.671,-.369),l(-.562,-.04),l(-.618,.218),l(-1.904,.771),l(-.38,.059),l(-1.385,-.35),l(-.3,-.013),l(-.69,.261),l(-.34,.031),l(-1.151,-.395),l(-.506,-.002),l(-.771,.189),l(-.266,.023),l(-.048,-.189),l(.234,-.318),l(-.352,-.106),l(-.392,-.204),l(-.418,-.186),l(-.146,-.33),l(.32,-.201),l(.351,.012),l(-.114,-.13),l(-.625,-.248),l(-.253,.13),l(-.215,.283),l(-.147,.118),l(-.414,-.239),l(-.194,-.139),l(-.594,-.059),l(-.02,-.189),l(-.234,0),l(-.245,-.036),l(-.052,-.165),l(.178,-.094),l(.271,-.071),l(-.239,-.083),l(-.183,-.059),l(.124,-.146),l(.19,-.127),l(-.069,-.142),l(-.306,-.118),l(-.555,-.141),l(-.712,-.471),l(.058,-.088),l(-.104,-.119),l(.075,-.356),l(-.202,-.036),l(-.19,-.237),l(-.569,-.178),l(-.054,-.309), +N(420.177,113.472),l(-.274,-.042),l(-.253,-.155),l(-.367,-.325),l(-.096,-.213),l(.202,-.738),l(.097,-.681),l(-.046,-.583),l(-.133,-.569),l(-.503,-.44),l(-.094,-.271),l(.181,-.157),l(.366,-.015),l(.801,-.001),l(.339,-.172),l(.861,-.543),l(.633,.625),l(.451,.754),l(-.014,.271),l(-.204,.285),l(-.145,.484),l(.149,.894),l(-.11,.525),l(-.377,.695),l(-.405,-.198),l(-.52,.03),l(-.143,.1),l(-.149,.27),l(-.248,.17),M(433.783,118.446),l(-.712,-.084),l(-.902,-.607),l(-.772,-.239),l(-1.904,-.817),l(-.833,-.126),l(-.232,-.127),l(-.173,-.283),l(.139,-.34),l(.328,-.34),l(.264,-.1),l(.629,.112),l(.569,-.341),l(.68,.424),l(.403,.141),l(.722,-.016),l(1.403,-.187),l(1.38,-.329),l(.148,.085),l(.043,.127),l(-.112,.127),l(-.536,.823),l(-.153,.497),l(.009,.382),l(.411,.509),l(-.179,.128),l(-.43,.567),l(-.188,.015),M(431.244,98.829),l(-.281,-.329),l(-.242,-.027),l(-.281,.196),l(-.156,-.125),l(-.47,-.071),l(-.114,.32),l(-.458,.054),l(-1.001,.364),l(.078,-.151),l(-.452,.133),l(-.063,.249),l(-.157,.044),l(-.01,.125),l(.303,.08),l(.021,.302),l(.193,.119),l(.253,.236),l(-.104,.213),l(-.449,.254),l(.016,.272),l(.143,.554),l(.783,.814),l(2.008,.889),l(.29,.357),l(.134,.558),l(.274,.557),l(.395,.585),l(.694,.57),l(.254,.274),l(.446,.195),l(.041,.21),l(.408,.167),l(1.17,.255),l(1.254,-.105),l(.388,.141),l(.024,.212),l(-.465,.247),l(-.258,.294),l(.262,.213),l(.954,.283),l(1.168,.411),l(.829,.366),l(1.589,.739),l(.058,.185),l(.719,.458),l(.31,.475),l(-.198,.435),l(-.152,.337),l(-.455,-.281),l(-.318,-.167),l(-.109,-.486),l(-.263,-.17),l(-.512,-.099),l(-.483,-.009),l(-.439,-.236),l(.086,-.217),l(-.353,-.065),l(-.301,.098),l(-.232,.262),l(-.259,.399),l(-.273,.208),l(.043,.271),l(-.197,.303),l(-.007,.298),l(.76,.342),l(.611,.271),l(-.093,.314),l(.03,.432),l(.133,.142),l(-.191,.238),l(-.659,-.024),l(-.41,.219),l(-.202,.228),l(.11,.595),l(-.536,.303),l(-.617,.866),l(-.595,.048),l(-.167,-.071),l(-.184,-.14),l(-.002,-.508),l(.364,-.141),l(.317,-.542),l(-.236,-.184),l(.361,-.249),l(.361,.074),l(.133,-.17),l(-.077,-.34),l(-.211,-.181),l(-.206,-.924),l(-.367,-.516),l(-.15,-.607),l(-.201,-.352),l(-.334,.058),l(-.187,.171),l(-.899,-.496),l(-.286,-.065),l(.208,-.291),l(-.092,-.398),l(-.461,-.34),l(-.909,.247),l(.034,-.109),l(.322,-.194),l(-.276,-.27),l(-.29,-.003),l(-.42,.19),l(-.242,-.512),l(-.198,-.207),l(-.124,-.228),l(-.663,-.241),l(-.505,-.027),l(-.654,-.127),l(-.745,-.355),l(-.548,-.441),l(-.959,-.612),l(-1.036,-.826),l(-.872,-.384),l(-.805,-.67),l(-.566,-.856),l(-.434,-1.043),l(-.347,-.443),l(-.505,-.457),l(-.483,-.243),l(-1.188,-.341),l(-.579,-.142),l(-.5,.044),l(-1.078,.647),l(-.46,.359),l(-.646,.173),l(-.303,.043),l(.146,-.469),l(-.062,-.281),l(-.849,.07),l(-.754,-.391),l(-.193,-.442),l(.315,-.371),l(.175,-.01),l(-.135,-.331),l(-.616,-.191),l(-.352,-.358),l(.437,-.186),l(.183,.111),l(.541,-.353),l(.199,-.272),l(-.43,-.192),l(-.025,-.292),l(-.532,-.344),l(.624,-.301),l(.599,.062),l(.627,-.204),l(.629,.168),l(.275,-.16),l(.349,-.432),l(-.103,-.212),l(.777,-.404),l(.016,.415),l(.534,.363),l(.311,.071),l(-.098,.182),l(.385,.312),l(.285,-.151),l(.018,-.535),l(.425,-.384),l(-.019,-.333),l(.371,-.081),l(.143,.354),l(.23,.142),l(.216,-.03),l(.071,-.122),l(.469,-.05),l(.244,.333),l(.228,-.415),l(-.244,-.131),l(.081,-.273),l(.283,-.091),l(.176,.162),l(.315,.051),l(.038,-.192),l(-.112,-.212),l(.126,-.309),l(.631,.171),l(.597,.034),l(.329,-.411),l(.366,-.096),l(.183,.083),l(.445,-.11),l(.301,.103),l(.856,-.227),l(.023,.363),l(.318,.096),l(.32,.391),l(1.311,.247),l(.894,.082),l(.478,.112),l(.116,.199),l(-.614,.303),l(.098,.151),l(.297,.002),l(.187,.185),l(-.367,.285),l(.336,.089),l(-.127,.361),l(.36,.11),l(.284,.198),l(-.056,.214), +N(430.73,96.731),l(1.04,.065),l(.179,.107),l(.612,-.009),l(.287,.152),l(.646,-.5),l(.566,-.107),l(.85,.08),l(.298,-.196),l(.89,.116),l(-.082,-.393),l(.693,-.157),l(.304,.59),l(.364,.333),l(-.035,-.009),l(-.1,-.073),l(-.145,-.036),l(-.172,0),l(-.145,.009),l(-.055,.063),l(0,.072),l(.019,.09),l(.009,.082),l(-.063,.009),l(-.136,-.009),l(-.108,-.036),l(-.091,.063),l(-.045,.082),l(-.081,.063),l(-.082,.045),l(-.081,.009),l(-.163,.036),l(-.117,.036),l(-.108,.036),l(-.055,.045),l(-.153,-.009),l(-.127,.072),l(-.063,.054),l(-.018,.082),l(.036,.072),l(.081,.054),l(.063,.055),l(.045,.045),l(.019,.063),l(.018,.09),l(-.036,.108),l(-.018,.063),l(-.046,.1),l(-.108,0),l(-.081,-.009),l(-.091,.027),l(-.108,.009),l(-.117,.054),l(-.091,.018),l(-.081,.027),l(-.1,.045),l(-.055,.063),l(-.036,.027),l(.055,.018),l(.063,.009),l(.026,.027),l(.037,.072),l(-.046,.063),l(-.027,.009),l(-.081,.027),l(-.009,.045),l(.045,.081),l(0,.072),l(.045,.1),l(-.054,.072),l(-.063,-.018),l(-.1,.045),l(-.117,.018),l(-.127,-.036),l(-.063,-.027),l(-.1,-.063),l(-.099,0),l(-.063,-.027),l(-.118,-.045),l(-.018,.045),l(-.027,.045),l(-.1,.027),l(-.136,0),l(-.054,-.045),l(-.072,-.063),l(-.127,-.018),l(-.019,-.09),l(-.026,-.018),l(-.063,-.054),l(-.055,-.027),l(-.018,-.054),l(-.01,-.054),l(-.036,-.009),l(-.063,.018),l(-.036,.054),l(-.009,.027),l(-.054,.063),l(-.019,.018),l(-.018,.081),l(-.063,.045),l(-.046,.018),l(-.062,.054),l(-.036,.009),l(-.254,0),l(-.108,-.027),l(-.108,.027),l(-.145,.009),l(-.1,-.009),l(-.1,-.036),l(-.045,-.019),l(-.055,0),l(0,.037),l(0,.036),l(-.045,.027),l(-.045,.018),l(-.136,-.009),l(-.027,-.036),l(-.108,.018),l(-.019,.018),l(-.136,.018),l(-.063,.018),l(-.126,.018),l(-.272,-.063),l(.428,-.077),l(.113,-.16),l(.056,-.214),l(-.284,-.198),l(-.36,-.11),l(.127,-.361),l(-.336,-.089),l(.367,-.285),l(-.187,-.185),l(-.297,-.002),l(-.098,-.151),l(.614,-.303),l(-.116,-.199), +N(439.573,104.709),l(-1.051,-.672),l(-.185,-.222),l(-.783,-.149),l(-.203,-.159),l(-.403,-.115),l(-.683,.177),l(-.326,-.486),l(-1.112,-.627),l(-.584,-.678),l(.277,.007),l(.608,.016),l(-.583,-.221),l(-.659,-.469),l(-.183,-.407),l(.086,-.452),l(-.289,-.336),l(-.646,-.418),l(-.378,-.126),l(-.258,.579),l(-.142,.116),l(.03,.15),l(-.284,.106),l(-.154,.248),l(-.213,.053),l(-.496,-.647),l(-.063,-.286),l(-.259,-.612),l(.065,-.012),l(.272,.063),l(.126,-.018),l(.063,-.018),l(.136,-.018),l(.019,-.018),l(.108,-.018),l(.027,.036),l(.136,.009),l(.045,-.018),l(.045,-.027),l(0,-.036),l(0,-.037),l(.055,0),l(.045,.019),l(.1,.036),l(.1,.009),l(.145,-.009),l(.108,-.027),l(.108,.027),l(.254,0),l(.036,-.009),l(.062,-.054),l(.046,-.018),l(.063,-.045),l(.018,-.081),l(.019,-.018),l(.054,-.063),l(.009,-.027),l(.036,-.054),l(.063,-.018),l(.036,.009),l(.01,.054),l(.018,.054),l(.055,.027),l(.063,.054),l(.026,.018),l(.019,.09),l(.127,.018),l(.072,.063),l(.054,.045),l(.136,0),l(.1,-.027),l(.027,-.045),l(.018,-.045),l(.118,.045),l(.063,.027),l(.099,0),l(.1,.063),l(.063,.027),l(.127,.036),l(.117,-.018),l(.1,-.045),l(.063,.018),l(.054,-.072),l(-.045,-.1),l(0,-.072),l(-.045,-.081),l(.009,-.045),l(.081,-.027),l(.027,-.009),l(.046,-.063),l(-.037,-.072),l(-.026,-.027),l(-.063,-.009),l(-.055,-.018),l(.036,-.027),l(.055,-.063),l(.1,-.045),l(.081,-.027),l(.091,-.018),l(.117,-.054),l(.108,-.009),l(.091,-.027),l(.081,.009),l(.108,0),l(.046,-.1),l(.018,-.063),l(.036,-.108),l(-.018,-.09),l(-.019,-.063),l(-.045,-.045),l(-.063,-.055),l(-.081,-.054),l(-.036,-.072),l(.018,-.082),l(.063,-.054),l(.127,-.072),l(.153,.009),l(.055,-.045),l(.108,-.036),l(.117,-.036),l(.163,-.036),l(.081,-.009),l(.082,-.045),l(.081,-.063),l(.045,-.082),l(.091,-.063),l(.108,.036),l(.136,.009),l(.063,-.009),l(-.009,-.082),l(-.019,-.09),l(0,-.072),l(.055,-.063),l(.145,-.009),l(.172,0),l(.145,.036),l(.1,.073),l(.035,.009),l(.215,.197),l(1.412,.612),l(1.116,.671),l(.58,.098),l(.668,-.047),l(.433,-.031),l(.589,-.203),l(.201,.142),l(.056,.089),l(.022,.112),l(-.022,.078),l(.045,.044),l(.011,.067),l(-.078,.056),l(-.011,.146),l(.078,.067),l(.145,-.034),l(.101,.034),l(.045,.089),l(-.078,.011),l(-.056,-.022),l(-.022,.078),l(.033,.1),l(-.045,.034),l(-.044,.022),l(.066,.111),l(.168,-.022),l(.033,.078),l(.123,.1),l(.122,0),l(.101,0),l(.09,.078),l(.122,.011),l(.134,0),l(.012,.078),l(-.033,.056),l(-.135,-.011),l(-.089,-.034),l(-.067,.022),l(-.078,-.011),l(-.066,-.045),l(-.056,-.011),l(-.045,.011),l(.033,.067),l(-.101,.089),l(-.078,0),l(0,.156),l(.045,.067),l(-.033,.078),l(.022,.078),l(.011,.078),l(-.089,.033),l(-.09,-.033),l(-.056,.067),l(.078,.089),l(-.078,.011),l(-.189,.022),l(-.201,-.022),l(-.145,-.123),l(.056,-.101),l(-.045,-.089),l(-.123,-.011),l(-.022,-.112),l(-.145,-.056),l(-.146,-.045),l(-.101,.089),l(-.1,-.011),l(-.156,-.078),l(-.067,-.022),l(-.146,0),l(-.156,-.045),l(-.111,.067),l(-.134,.045),l(-.134,-.045),l(-.111,-.067),l(-.112,0),l(-.122,.089),l(-.168,.078),l(-.156,-.067),l(-.268,-.089),l(-.179,.011),l(-.156,.011),l(-.189,-.056),l(-.168,-.011),l(-.156,-.089),l(-.089,.078),l(-.111,.022),l(-.057,-.056),l(-.234,-.078),l(-.156,-.056),l(-.134,-.045),l(-.089,-.011),l(-.134,.123),l(-.112,-.011),l(-.223,-.022),l(-.168,-.033),l(-.212,.022),l(-.101,.111),l(-.145,.145),l(-.123,.201),l(-.201,-.022),l(-.256,-.134),l(-.156,-.19),l(-.101,-.111),l(-.312,-.034),l(-.123,.044),l(-.089,.179),l(-.045,.167),l(.045,.134),l(0,.078),l(.033,.212),l(-.123,.067),l(.022,.089),l(.134,.078),l(.09,.089),l(.122,.034),l(.101,.033),l(.179,.179),l(.146,.234),l(.089,.134),l(.022,.123),l(.156,.111),l(-.078,.056),l(-.012,.1),l(.022,.146),l(.168,-.011),l(.089,.111),l(.056,.123),l(.112,.111),l(.167,.045),l(.167,.033),l(.369,.357),l(.021,.167),l(.078,.044),l(.213,.078),l(.379,.357),l(.224,.123),l(.223,.067),l(.101,.056),l(0,.112),l(.078,.279),l(.201,.078),l(.189,.167),l(.146,.112),l(.245,.123),l(.067,.212),l(-.284,.083),M(439.792,104.833),l(.132,-.118),l(.134,.011),l(.123,.034),l(.045,.078),l(.066,.089),l(.146,.089),l(.179,.078),l(.212,.011),l(.312,.257),l(.045,.067),l(.134,-.033),l(.123,.022),l(.089,.034),l(.062,.063),l(.005,.004),l(-.022,.089),l(.033,.078),l(.082,.072),l(.029,.092),l(-.002,.1),l(-.589,-.367),l(-.549,-.371),l(-.789,-.378), +N(451.009,101.725),l(-.328,.346),l(-.383,.374),l(-.18,.302),l(.056,.271),l(1.326,1.122),l(.028,.2),l(-.302,.302),l(-.762,.333),l(-.246,.301),l(-.008,.514),l(-.013,.208),l(-.058,-.017),l(-.072,.029),l(-.16,.022),l(-.145,.021),l(-.116,.022),l(-.058,.015),l(-.102,-.051),l(-.087,.043),l(-.088,.021),l(-.102,-.043),l(-.064,-.021),l(-.131,.116),l(-.087,.08),l(-.152,-.015),l(-.196,-.007),l(-.064,.007),l(-.175,-.043),l(-.152,.087),l(-.151,.102),l(-.109,.058),l(.059,.072),l(-.029,.058),l(-.116,0),l(-.094,-.109),l(-.131,-.058),l(-.087,-.073),l(-.08,.065),l(-.116,.058),l(-.246,.058),l(-.225,.058),l(-.088,.058),l(-.058,.167),l(.029,.13),l(-.029,.072),l(-.072,.087),l(-.188,0),l(-.14,-.049),l(-.018,-.109),l(-.733,-.866),l(-.382,-.369),l(-.058,-.004),l(.109,-.286),l(0,-.067),l(-.078,-.067),l(-.101,0),l(-.056,-.056),l(.022,-.089),l(.111,-.033),l(.146,.011),l(.167,.033),l(.057,-.033),l(.021,-.067),l(.09,-.044),l(.134,-.022),l(.089,-.011),l(-.011,-.089),l(-.101,-.101),l(-.167,-.067),l(-.134,-.045),l(-.057,-.044),l(-.111,.022),l(-.078,-.045),l(-.033,-.067),l(-.123,-.101),l(-.078,-.1),l(-.066,-.022),l(-.067,.044),l(-.078,-.011),l(-.101,-.056),l(-.279,-.078),l(-.078,-.022),l(-.056,-.033),l(-.167,-.134),l(-.101,-.146),l(-.111,-.111),l(-.168,-.078),l(-.156,-.101),l(-.223,-.056),l(0,-.101),l(.179,-.101),l(.089,-.111),l(.078,-.011),l(.067,.034),l(.078,.044),l(.1,.022),l(.045,-.022),l(.012,-.134),l(.011,-.19),l(-.134,-.145),l(-.179,-.19),l(-.212,-.134),l(-.101,-.145),l(.101,.022),l(.101,.011),l(.145,.056),l(.224,.044),l(.134,-.078),l(.089,-.056),l(.067,-.078),l(-.089,-.044),l(-.135,-.022),l(-.089,-.089),l(-.123,-.078),l(-.156,-.089),l(-.033,-.101),l(-.045,-.1),l(-.212,.011),l(-.167,-.056),l(-.078,-.1),l(-.022,-.134),l(.078,-.067),l(0,-.089),l(-.033,-.1),l(.056,-.056),l(.066,-.078),l(.156,-.156),l(.156,-.223),l(.034,-.167),l(.056,-.1),l(-.022,-.067),l(-.123,-.022),l(-.179,-.011),l(-.156,0),l(-.212,.112),l(-.078,-.089),l(.056,-.067),l(.09,.033),l(.089,-.033),l(-.011,-.078),l(-.022,-.078),l(.033,-.078),l(-.045,-.067),l(0,-.156),l(.078,0),l(.101,-.089),l(-.033,-.067),l(.045,-.011),l(.056,.011),l(.066,.045),l(.078,.011),l(.067,-.022),l(.089,.034),l(.135,.011),l(.033,-.056),l(-.012,-.078),l(-.134,0),l(-.122,-.011),l(-.09,-.078),l(-.101,0),l(-.122,0),l(-.123,-.1),l(-.033,-.078),l(-.168,.022),l(-.066,-.111),l(.044,-.022),l(.045,-.034),l(-.033,-.1),l(.022,-.078),l(.056,.022),l(.078,-.011),l(-.045,-.089),l(-.101,-.034),l(-.145,.034),l(-.078,-.067),l(.011,-.146),l(.078,-.056),l(-.011,-.067),l(-.045,-.044),l(.022,-.078),l(-.022,-.112),l(-.056,-.089),l(-.201,-.142),l(1.535,-.529),l(.889,-.077),l(.907,.067),l(.054,.309),l(.569,.178),l(.19,.237),l(.202,.036),l(-.075,.356),l(.104,.119),l(-.058,.088),l(.712,.471),l(.555,.141),l(.306,.118),l(.069,.142),l(-.19,.127),l(-.124,.146),l(.183,.059),l(.239,.083),l(-.271,.071),l(-.178,.094),l(.052,.165),l(.245,.036),l(.234,0),l(.02,.189),l(.594,.059),l(.194,.139),l(.414,.239),l(.147,-.118),l(.215,-.283),l(.253,-.13),l(.625,.248),l(.114,.13),l(-.351,-.012),l(-.32,.201),l(.146,.33),l(.418,.186), +N(551.198,117.997),l(-.351,-.48),l(-.236,-.126),l(-1.217,-.05),l(-.646,-.011),l(-.096,-.016),l(.091,-.726),l(-.062,-.503),l(.157,-.251),l(.062,-.22),l(-.503,-.094),l(-.534,-.283),l(-.566,-.189),l(-.471,.063),l(-.378,-.251),l(-1.132,-.597),l(-.565,-.22),l(-.943,-.597),l(-.314,.063),l(-1.006,-.503),l(-.377,-.44),l(-1.194,-.597),l(-1.384,-.975),l(0,-.283),l(-.188,-.44),l(-.283,-.188),l(-.408,-.597),l(-.126,-.566),l(-.22,-.377),l(-.881,-.251),l(-.188,.157),l(-.439,.063),l(-.535,-.126),l(-.439,.032),l(-.503,.094),l(-.314,-.157),l(-.691,-.314),l(.094,-.22),l(.157,-.188),l(-.188,-.22),l(.031,-.188),l(.188,-.157),l(-.439,-.283),l(0,-.22),l(-.032,-.22),l(-.251,-.22),l(-.534,-.094),l(-.692,-.095),l(-.22,-.314),l(-.346,-.032),l(-.629,-.377),l(-.472,-.095),l(-.188,.063),l(-.565,.157),l(.251,.251),l(.188,.377),l(-.597,-.283),l(-.283,0),l(-.126,.126),l(-.22,.346),l(-.283,.126),l(-.629,0),l(-.503,.251),l(-.503,.409),l(-.062,.628),l(.314,.409),l(-.126,.314),l(-1.383,.032),l(-1.03,-.063),l(.056,-8.174),l(5.658,-1.289),l(5.722,2.986),l(2.012,1.666),l(2.578,-.346),l(2.767,.188),l(1.1,-.409),l(.724,.723),l(.597,.22),l(.66,1.006),l(.66,-.314),l(-.031,1.038),l(-.188,.409),l(.031,.754),l(1.006,0),l(.221,.817),l(.346,1.069),l(.503,.063),l(.691,-.032),l(1.006,-.094),l(.346,0),l(.44,.314),l(.062,.283),l(-.062,.283),l(.44,.346),l(.66,0),l(.125,-.188),l(-.157,-.409),l(.504,-.44),l(.439,-.188),l(.221,-.472),l(.282,-.188),l(.943,-.377),l(.755,-.189),l(.534,-.471),l(.346,-.283),l(.22,-.063),l(.283,.126),l(.377,-.377),l(.322,-.031),l(.349,-.126),l(.441,.246),l(-.368,.172),l(-.368,.171),l(-.221,.049),l(-.073,.196),l(-.295,.049),l(-.294,.172),l(-.196,.147),l(-.441,.295),l(-.172,.098),l(-.024,.123),l(.294,.049),l(.295,.074),l(.146,.123),l(.418,-.147),l(.098,.221),l(.172,.221),l(.368,.27),l(.589,0),l(.393,0),l(.049,-.393),l(.221,.049),l(.196,-.196),l(.024,-.245),l(.196,.098),l(.196,.172),l(.172,.294),l(.049,.147),l(.393,.024),l(.147,-.024),l(.073,.246),l(.025,.098),l(.343,-.025),l(.319,.147),l(.245,.196),l(.516,.074),l(.466,.024),l(.172,.123),l(-.49,.221),l(-.197,.147),l(-.221,.147),l(-.49,-.024),l(-.245,-.049),l(.049,.171),l(0,.147),l(-.319,0),l(-.172,.049),l(-.343,.196),l(-.221,.196),l(-.271,.049),l(-.221,.196),l(-.245,-.147),l(-.319,-.098),l(-.294,-.098),l(-.221,.025),l(-.246,.073),l(-.318,-.073),l(-.042,.098),l(-.345,-.005),l(-.409,.031),l(-.188,-.283),l(-.251,-.063),l(-.126,-.188),l(.251,-.126),l(.409,-.346),l(.188,-.22),l(-.252,-.251),l(-.439,-.377),l(-.221,.251),l(-.471,.346),l(-.692,.188),l(-.22,.157),l(-.252,-.22),l(-.22,-.157),l(-.346,0),l(.031,.22),l(-.283,.314),l(.189,.314),l(-.032,.346),l(-.062,.126),l(-.472,-.095),l(-.565,.095),l(-.503,.094),l(.251,.125),l(.534,-.031),l(.126,.094),l(-.251,.063),l(-.188,.063),l(-.032,.346),l(-.188,0),l(-.251,.157),l(-.063,.409),l(-.282,.188),l(-1.069,-.094),l(-.629,-.126),l(-.472,.283),l(-.125,.471),l(.251,.283),l(.346,.188),l(.157,.157),l(.44,.032),l(.346,0),l(.126,.22),l(-.126,.22),l(-.031,.472),l(.126,.409),l(.471,.314),l(.126,.283),l(-.157,.22),l(-.503,.346),l(-.283,.503),l(-.377,.377),l(.063,.377),l(-.375,.843), +N(439.792,104.833),l(-.113,-.054),l(-.105,-.07),l(.284,-.083),l(-.067,-.212),l(-.245,-.123),l(-.146,-.112),l(-.189,-.167),l(-.201,-.078),l(-.078,-.279),l(0,-.112),l(-.101,-.056),l(-.223,-.067),l(-.224,-.123),l(-.379,-.357),l(-.213,-.078),l(-.078,-.044),l(-.021,-.167),l(-.369,-.357),l(-.167,-.033),l(-.167,-.045),l(-.112,-.111),l(-.056,-.123),l(-.089,-.111),l(-.168,.011),l(-.022,-.146),l(.012,-.1),l(.078,-.056),l(-.156,-.111),l(-.022,-.123),l(-.089,-.134),l(-.146,-.234),l(-.179,-.179),l(-.101,-.033),l(-.122,-.034),l(-.09,-.089),l(-.134,-.078),l(-.022,-.089),l(.123,-.067),l(-.033,-.212),l(0,-.078),l(-.045,-.134),l(.045,-.167),l(.089,-.179),l(.123,-.044),l(.312,.034),l(.101,.111),l(.156,.19),l(.256,.134),l(.201,.022),l(.123,-.201),l(.145,-.145),l(.101,-.111),l(.212,-.022),l(.168,.033),l(.223,.022),l(.112,.011),l(.134,-.123),l(.089,.011),l(.134,.045),l(.156,.056),l(.234,.078),l(.057,.056),l(.111,-.022),l(.089,-.078),l(.156,.089),l(.168,.011),l(.189,.056),l(.156,-.011),l(.179,-.011),l(.268,.089),l(.156,.067),l(.168,-.078),l(.122,-.089),l(.112,0),l(.111,.067),l(.134,.045),l(.134,-.045),l(.111,-.067),l(.156,.045),l(.146,0),l(.067,.022),l(.156,.078),l(.1,.011),l(.101,-.089),l(.146,.045),l(.145,.056),l(.022,.112),l(.123,.011),l(.045,.089),l(-.056,.101),l(.145,.123),l(.201,.022),l(.189,-.022),l(.078,-.011),l(.212,-.112),l(.156,0),l(.179,.011),l(.123,.022),l(.022,.067),l(-.056,.1),l(-.034,.167),l(-.156,.223),l(-.156,.156),l(-.066,.078),l(-.056,.056),l(.033,.1),l(0,.089),l(-.078,.067),l(.022,.134),l(.078,.1),l(.167,.056),l(.212,-.011),l(.045,.1),l(.033,.101),l(.156,.089),l(.123,.078),l(.089,.089),l(.135,.022),l(.089,.044),l(-.067,.078),l(-.089,.056),l(-.134,.078),l(-.224,-.044),l(-.145,-.056),l(-.101,-.011),l(-.101,-.022),l(.101,.145),l(.212,.134),l(.179,.19),l(.134,.145),l(-.011,.19),l(-.012,.134),l(-.045,.022),l(-.1,-.022),l(-.078,-.044),l(-.067,-.034),l(-.078,.011),l(-.089,.111),l(-.179,.101),l(-.056,-.033),l(-.156,.056),l(-.112,-.022),l(-.066,-.044),l(-.112,.033),l(-.078,.056),l(.012,.078),l(.089,.1),l(.123,.167),l(.056,.101),l(-.056,.101),l(-.111,0),l(-.09,-.056),l(-.056,-.089),l(-.056,-.044),l(-.123,-.011),l(-.122,.056),l(-.168,.078),l(-.045,.101),l(-.044,.089),l(-.112,.101),l(.034,.089),l(.011,.1),L(442,104.458),l(-.134,.011),l(-.111,.022),l(-.101,.089),l(-.012,.134),l(.012,.112),l(.011,.145),l(.012,.044),l(.066,.112),l(.078,.089),l(.045,.101),l(-.09,.089),l(-.183,.108),l(-.062,-.063),l(-.089,-.034),l(-.123,-.022),l(-.134,.033),l(-.045,-.067),l(-.312,-.257),l(-.212,-.011),l(-.179,-.078),l(-.146,-.089),l(-.066,-.089),l(-.045,-.078),l(-.123,-.034),l(-.134,-.011),l(-.132,.118), +N(450.198,105.998),l(.013,-.208),l(.008,-.514),l(.246,-.301),l(.762,-.333),l(.302,-.302),l(-.028,-.2),l(-1.326,-1.122),l(-.056,-.271),l(.18,-.302),l(.383,-.374),l(.328,-.346),l(.392,.204),l(.352,.106),l(-.234,.318),l(.048,.189),l(.266,-.023),l(.771,-.189),l(.506,.002),l(1.151,.395),l(.34,-.031),l(.69,-.261),l(.3,.013),l(1.385,.35),l(.38,-.059),l(1.904,-.771),l(.618,-.218),l(.562,.04),l(.671,.369),l(.295,.042),l(.514,.226),l(1.346,.336),l(.671,.12),l(-.066,.335),l(-.077,.258),l(-.261,.086),l(-.313,-.028),l(-.339,.129),l(-.327,.73),l(-.039,.586),l(-.075,.143),l(-.404,.115),l(-.338,.372),l(-.017,.257),l(.252,-.036),l(.255,.224),l(.033,.154),l(.391,.375),l(.01,.223),l(-1.333,-.005),l(-.527,-.111),l(-.497,.045),l(-.629,.374),l(-.498,.445),l(-.363,-.026),l(-.344,.216),l(.097,.327),l(-.086,.257),l(-1.117,.277),l(-.388,.031),l(-.619,-.21),l(-1.473,-.505),l(-.584,.06),l(-.799,.261),l(-1.855,.195),l(-.09,.029),l(-.047,-.199),l(.104,-.3),l(.006,-.499),l(-.225,-.469),l(-.358,-.383),l(-.666,-.296),l(-.134,-.213),l(.007,-.106), +N(381.009,107),l(-.121,-.278),l(.138,-.4),l(.343,-.5),l(-.358,-.471),l(-.304,-.428),l(-.514,-.07),l(-.164,-.1),l(-.053,-.329),l(.163,-.243),l(.409,-.272),l(.365,-.101),l(.563,-.03),l(.634,-.03),l(.133,-.172),l(.068,-.415),l(.535,-.273),l(.763,.042),l(1.078,.37),l(.763,.07),l(.756,-.087),l(.577,-.173),l(.508,-.144),l(.354,-.001),l(.629,.285),l(.694,.156),l(.939,.084),l(1.538,.04),l(.583,.027),l(.957,.141),l(.491,-.158),l(.419,-.229),l(.531,.027),l(.891,.47),l(.67,-.016),l(.335,.062),l(.472,.243),l(.469,-.03),l(.058,.122),l(-.205,.243),l(.094,.106),l(.15,.03),l(.112,-.106),l(1.088,.334),l(.15,-.061),l(.507,.395),l(.056,-.076),l(.262,.03),l(.131,-.076),l(.431,.152),l(.028,.038),l(.084,.114),l(.767,-.03),l(.037,.122),l(.337,-.061),l(.542,.015),l(-.017,-.319),l(.355,0),l(1.252,.304),l(.091,.213),l(.035,.289),l(.187,.076),l(.374,-.076),l(.206,-.03),l(.335,.091),l(.036,.152),l(.261,.015),l(.395,-.167),l(.427,.197),l(.485,.015),l(.039,-.136),l(.75,-.137),l(.334,.091),l(-.001,.088),l(-.001,.463),l(.156,.1),l(-.062,.485),l(-1.112,.528),l(-.95,.385),l(-.267,.328),l(-1.046,.198),l(-.664,.116),l(-.96,.301),l(-.323,.326),l(-.053,.2),l(.261,.128),l(-.088,.157),l(-.628,.143),l(-.594,.783),l(-.886,.787),l(-.096,.192),l(-.18,.361),l(-.245,.45),l(.353,.827),l(.072,.111),l(.084,.13),l(.648,.295),l(.103,.185),l(-.621,.327),l(-.215,.105),l(-.515,.252),l(-.286,.479),l(-.224,.085),l(-.461,.926),l(.155,.322),l(-.257,.099),l(-.992,.049),l(-.581,.242),l(-.425,.327),l(-.274,.757),l(-.663,.496),l(-.258,-.213),l(-.599,.028),l(-.305,.27),l(-.342,0),l(-.121,-.113),l(-3.282,.042),l(-.69,.524),l(-1.021,.17),l(-.35,.382),l(-.028,.283),l(-.083,.085),l(-.073,-.212),l(-.068,-.014),l(.005,.241),l(-.389,.127),l(-.421,-.142),l(-.788,-.467),l(-.224,-.382),l(.036,-.262),l(-.345,-.113),l(-.125,-.213),l(.175,-.163),l(-.468,-.51),l(-.702,-.284),L(385,117.498),l(-.484,-.135),l(-.586,.039),l(.008,-.018),l(.304,-.951),l(.242,-.37),l(.884,-.643),l(-.408,-.31),l(-.812,-.123),l(.17,-.455),l(.506,-.655),l(.347,-.371),l(-.163,-.198),l(-.455,-.551),l(-.488,-.494),l(.288,-.129),l(.482,-.045),l(.458,-.229),l(.043,-.199),l(-.057,-.938),l(.132,-.983),l(-.072,-.456),l(.051,-.442),l(.084,-.072),l(1.234,-.506),l(.288,-.216),l(-.062,-.242),l(-.842,-.495),l(-.15,-.242),l(-.272,-.227),l(-.335,-.055),l(-.531,.26),L(382.981,107),l(-.531,-.439),l(-.55,.188),L(381.009,107), +N(489.685,103.693),l(.112,-.309),l(.26,-.166),l(.284,.047),l(.07,.047),l(.402,.023),l(.449,.023),l(.283,.095),l(.284,.142),l(.188,.094),l(.189,.047),l(.331,0),l(.213,0),l(.212,.166),l(.261,.095),l(.307,.071),l(.355,.047),l(.307,0),l(.426,-.095),l(.544,0),l(.401,.166),l(.189,0),l(.283,-.047),l(.354,.166),l(.095,.142),l(.284,.213),l(.52,.118),l(.354,.071),l(.236,.118),l(.308,.119),l(-.142,.118),l(-.048,.118),l(.261,.118),l(.212,.071),l(.261,-.118),l(.283,0),l(.166,-.166),l(.094,-.095),l(.213,-.071),l(.354,0),l(.261,.071),l(.188,.142),l(.142,-.166),l(.095,-.071),l(.118,0),l(.236,.118),l(.143,.094),l(.212,0),l(.189,.118),l(.213,.166),l(.378,0),l(.354,.024),l(.118,.142),l(-.118,.189),l(-.118,.307),l(.354,.284),l(.284,.166),l(.26,.094),l(.284,.047),l(.236,-.023),l(.236,.071),l(.126,.189),l(-.268,.189),l(-.143,.142),l(-.095,.071),l(.143,.26),l(.213,.307),l(.614,.166),l(.118,.213),l(-.095,.331),l(-.236,.095),l(-.236,.047),l(-.26,-.189),l(-.143,-.071),l(-.188,-.023),l(-.284,.047),l(-.638,-.189),l(-.189,-.213),l(-.331,-.189),l(-.473,-.024),l(-.236,0),l(-.418,.308),l(-.291,.094),l(-.378,.047),l(-.591,.095),l(-.592,-.047),l(-.401,.118),l(-.426,.023),l(-.308,.095),l(-.307,-.024),l(-.377,.108),l(-.031,-.028),l(-1.326,-1.018),l(-.41,-.041),l(-.761,.36),l(-.226,.072),l(-.491,-.068),l(-1.212,-.082),l(.083,-.065),l(.322,-.585),l(.032,-.143),l(-.064,-.728),l(-.331,-1.084),l(-.206,-.399),l(-.639,-.513),l(-.341,-.128),l(-.916,-.155),l(-.679,-.271),l(-.341,-.243), +N(443.617,107.095),l(-.065,-.035),l(-.435,-.156),l(-.017,-.15),l(-.501,-.485),l(-.848,-.3),l(-.033,-.021),l(.002,-.1),l(-.029,-.092),l(-.082,-.072),l(-.033,-.078),l(.022,-.089),l(-.005,-.004),l(.183,-.108),l(.09,-.089),l(-.045,-.101),l(-.078,-.089),l(-.066,-.112),l(-.012,-.044),l(-.011,-.145),l(-.012,-.112),l(.012,-.134),l(.101,-.089),l(.111,-.022),l(.134,-.011),l(.056,-.056),l(-.011,-.1),l(-.034,-.089),l(.112,-.101),l(.044,-.089),l(.045,-.101),l(.168,-.078),l(.122,-.056),l(.123,.011),l(.056,.044),l(.056,.089),l(.09,.056),l(.111,0),l(.056,-.101),l(-.056,-.101),l(-.123,-.167),l(-.089,-.1),l(-.012,-.078),l(.078,-.056),l(.112,-.033),l(.066,.044),l(.112,.022),l(.156,-.056),l(.056,.033),l(0,.101),l(.223,.056),l(.156,.101),l(.168,.078),l(.111,.111),l(.101,.146),l(.167,.134),l(.056,.033),l(.078,.022),l(.279,.078),l(.101,.056),l(.078,.011),l(.067,-.044),l(.066,.022),l(.078,.1),l(.123,.101),l(.033,.067),l(.078,.045),l(.111,-.022),l(.057,.044),l(.134,.045),l(.167,.067),l(.101,.101),l(.011,.089),l(-.089,.011),l(-.134,.022),l(-.09,.044),l(-.021,.067),l(-.057,.033),l(-.167,-.033),l(-.146,-.011),l(-.111,.033),l(-.022,.089),l(.056,.056),l(.101,0),l(.078,.067),l(0,.067),l(-.109,.286),l(-.361,-.022),l(-.727,-.11),l(-.273,.273),l(-.279,.515),l(.133,.427),l(-.002,.342), +N(558.52,110.652),l(.042,-.098),l(.318,.073),l(.246,-.073),l(.221,-.025),l(.294,.098),l(.319,.098),l(.245,.147),l(.221,-.196),l(.271,-.049),l(.221,-.196),l(.343,-.196),l(.172,-.049),l(.319,0),l(0,-.147),l(-.049,-.171),l(.245,.049),l(.49,.024),l(.221,-.147),l(.197,-.147),l(.49,-.221),l(-.172,-.123),l(-.466,-.024),l(-.516,-.074),l(-.245,-.196),l(-.319,-.147),l(-.343,.025),l(-.025,-.098),l(-.073,-.246),l(-.147,.024),l(-.393,-.024),l(-.049,-.147),l(-.172,-.294),l(-.196,-.172),l(-.196,-.098),l(-.024,.245),l(-.196,.196),l(-.221,-.049),l(-.049,.393),l(-.393,0),l(-.589,0),l(-.368,-.27),l(-.172,-.221),l(-.098,-.221),l(-.418,.147),l(-.146,-.123),l(-.295,-.074),l(-.294,-.049),l(.024,-.123),l(.172,-.098),l(.441,-.295),l(.196,-.147),l(.294,-.172),l(.295,-.049),l(.073,-.196),l(.221,-.049),l(.368,-.171),l(.368,-.172),l(-.441,-.246),l(-.349,.126),l(-.044,-.273),l(.393,-.442),l(.318,-.368),l(.736,-.123),l(.663,-.098),l(.883,.147),l(.883,.245),l(.688,.196),l(.81,.123),l(.344,.123),l(-.024,-.442),l(.245,-.736),l(.466,-.368),l(.688,-.123),l(.589,.074),l(.761,.27),l(.735,.246),l(.908,.196),l(.54,.098),l(.441,-.27),l(.858,-.024),l(.761,0),l(.785,-.147),l(.712,.221),l(.662,.098),l(1.35,.024),l(.662,-.074),l(.981,.246),l(.564,-.049),l(.147,.344),l(.27,.147),l(.196,.27),l(.663,0),l(.466,.098),l(.41,.375),l(.031,.194),l(-.051,.157),l(-.325,.187),l(-.97,.219),l(-1.338,.349),l(-.445,.145),l(-.405,.301),l(-.638,.701),l(-.646,.345),l(-.478,.102),l(-.459,.017),l(-1.248,-.235),l(-.238,.03),l(-.467,.472),l(-.463,.784),l(-.268,.243),l(-.885,.132),l(-.507,.145),l(-.344,-.055),l(-.183,-.567),l(-.06,-.071),l(-.359,.03),l(-1.737,.734),l(-1.422,.704),l(-.274,.186),l(-.129,.213),l(-.139,.739),l(-.196,-.073),l(-.344,.098),l(-.344,.171),l(-.539,0),l(-.663,-.073),l(-.834,.221),l(-.172,.147),l(-.196,0),l(-.172,-.319),l(-.368,.024),l(-.318,.172),l(-.074,-.221),l(-.049,-.172),l(-.122,.024),l(-.319,-.123),l(-.049,-.147),l(-.221,-.024),l(-.442,.123),l(-.343,.049),l(.024,.221),l(-.295,.049),l(-.393,-.074),l(-.073,-.196),l(-.147,-.123),l(-.368,-.098),l(-.49,.147),l(-.196,-.073),l(-.688,.024),l(-.564,0),l(-.589,.024),l(-.122,-.098),l(-.049,-.147),l(-.099,-.27),l(.099,-.245),l(.196,-.196),l(.098,.221),l(.196,-.074),l(-.049,-.196),l(.098,-.27),l(.123,0),l(.981,-.196),l(.515,.147),l(.516,.196),l(.099,.172),l(.196,0),l(.024,-.246),l(.441,-.196),l(.302,-.147), +N(685.343,114.455),l(-.571,.678),l(-.309,.115),l(-.511,-.096),l(-.579,-.068),l(-.595,-.011),l(-.315,.157),l(-.633,.738),l(-.283,.256),l(-.235,.171),l(-.268,-.206),l(-.35,.34),l(-.319,.199),l(-.373,-.608),l(-.398,-.112),l(-.649,.78),l(-.195,-.382),l(-.232,-.254),l(-.683,-.367),l(-.169,-.453),l(.095,-.312),l(.429,-.411),l(.754,-.229),l(.056,-.269),l(-.591,-.282),l(.407,-.879),l(.189,-.34),l(-.199,-.269),l(-.632,-.296),l(-.139,0),l(-.381,.029),l(-.312,.143),l(-.234,-.07),l(-.52,-.368),l(-.167,-.233),l(.379,-.528),l(.415,-.442),l(.52,-.329),l(1.533,-.604),l(1.032,-.545),l(.636,-.543),l(.686,-1.027),l(.386,-.13),l(.448,-.017),l(.273,.396),l(.493,.253),l(.508,.153),l(.975,-.048),l(.527,-.159),l(-.046,-.113),l(-.508,-.765),l(.025,-.342),l(.273,-.243),l(.392,-.059),l(.333,.126),l(.452,.054),l(.538,-.017),l(.62,-.259),l(.955,-.532),l(.23,-.713),l(.383,-.358),l(.253,-.129),l(.247,-.001),l(.579,.68),l(.298,.439),l(.167,.393),l(-1.356,.923),l(-.408,.457),l(-.112,.414),l(.09,.427),l(-.154,.456),l(-.187,.868),l(-.668,.115),l(-.36,.229),l(-.497,.385),l(-.766,.641),l(-.468,.214),l(-.678,.03),l(-.577,.199),l(-.265,.228),l(-.248,.312),l(-.364,.893),l(.284,.326),l(1.225,.847),l(.419,.354), +N(536.625,121.017),l(-.078,-.028),l(-.15,-.692),l(-.01,-.565),l(-.038,-.848),l(-.185,-.211),l(-.787,.075),l(-.696,-.01),l(-.655,-.506),l(-1.803,-1.362),l(-.597,-.336),l(-.66,-.167),l(-.5,-.054),l(-.788,-.066),l(-.822,-.335),l(-.708,-.251),l(-.402,-.437),l(-1.055,-.107),l(-.519,-.054),l(-.343,.129),l(-.517,.343),l(-.333,.03),l(-.78,-.038),l(-.609,.032),l(-.413,.144),l(-.476,.328),l(-.621,.654),l(-.466,.3),l(-.562,.13),l(-.441,-.025),l(-.066,-.376),l(-.128,-.681),l(-.106,-.447),l(.128,-.298),l(0,-.383),l(0,-.532),l(.106,-.191),l(.106,-.298),l(.085,-.234),l(-.085,-.212),l(-.256,-.128),l(-.319,-.191),l(-.213,-.255),l(-.042,-.149),l(-.171,0),l(-.191,-.042),l(-.361,-.106),l(-.191,.192),l(-.086,-.234),l(.086,-.106),l(.148,-.255),l(.128,.106),l(.383,-.042),l(.426,.085),l(.128,.021),l(.043,-.128),l(-.319,-.213),l(-.256,-.021),l(-.085,-.277),l(.17,-.255),l(.213,-.191),l(-.404,-.042),l(-.319,.085),l(-.383,0),l(-.319,-.085),l(-.128,.149),l(-.17,-.255),l(-.149,-.298),l(0,-.34),l(-.042,-.298),l(.17,-.213),l(.106,-.319),l(.043,-.255),l(.105,-.277),l(.086,-.234),l(.213,.34),l(.063,.128),l(.17,.17),l(.405,-.085),l(.383,.128),l(.106,-.149),l(-.021,-.149),l(.106,0),l(.148,.021),l(.064,.319),l(.106,.191),l(.298,-.021),l(.298,-.063),l(.256,-.106),l(.233,.085),l(.192,.064),l(.085,-.128),l(-.149,-.191),l(-.042,-.213),l(.191,-.042),l(.106,.149),l(.233,.085),l(.256,-.085),l(.213,-.064),l(.021,-.234),l(-.171,-.341),l(-.34,-.234),l(-.532,-.319),l(-.426,-.213),l(-.063,-.319),l(-.043,-.34),l(-.213,-.17),l(0,-.213),l(0,-.213),l(-.085,-.127),l(-.554,-.064),l(-.617,.085),l(-.426,.021),l(-.446,.127),l(-.192,.277),l(-.085,.298),l(.128,.192),l(-.063,.276),l(-.086,.405),l(.064,.234),l(.021,.298),l(-.256,-.553),l(-.361,-.319),l(.042,-.17),l(-.063,-.191),l(-.274,-.143),l(.529,-.453),l(.937,-.532),l(1.277,-.298),l(.979,-.085),l(.512,.234),l(.681,.383),l(.617,.383),l(.256,.511),l(.638,.703),l(.447,.255),l(.489,-.043),l(.341,-.106),l(.158,.014),l(1.03,.063),l(1.383,-.032),l(.126,-.314),l(-.314,-.409),l(.062,-.628),l(.503,-.409),l(.503,-.251),l(.629,0),l(.283,-.126),l(.22,-.346),l(.126,-.126),l(.283,0),l(.597,.283),l(-.188,-.377),l(-.251,-.251),l(.565,-.157),l(.188,-.063),l(.472,.095),l(.629,.377),l(.346,.032),l(.22,.314),l(.692,.095),l(.534,.094),l(.251,.22),l(.032,.22),l(0,.22),l(.439,.283),l(-.188,.157),l(-.031,.188),l(.188,.22),l(-.157,.188),l(-.094,.22),l(.691,.314),l(.314,.157),l(.503,-.094),l(.439,-.032),l(.535,.126),l(.439,-.063),l(.188,-.157),l(.881,.251),l(.22,.377),l(.126,.566),l(.408,.597),l(.283,.188),l(.188,.44),l(0,.283),l(1.384,.975),l(1.194,.597),l(.377,.44),l(1.006,.503),l(.314,-.063),l(.943,.597),l(.565,.22),l(1.132,.597),l(.378,.251),l(.471,-.063),l(.566,.189),l(.534,.283),l(.503,.094),l(-.062,.22),l(-.157,.251),l(.062,.503),l(-.091,.726),l(-1.454,-.244),l(-.565,-.294),l(-.445,.356),l(-.417,.2),l(-1.135,.205),l(-.432,.809),l(-.203,.991),l(-.103,.128),l(-.508,.243),l(-1.985,.689),l(-.568,.159),l(-.119,.199),l(-.001,.466),l(-.22,.199),l(-.636,.3),l(-.534,.031),l(-.573,-.082),l(-.999,-.348),l(-.937,-.193),l(-.193,-.112), +N(445.294,112.196),l(-.07,-.115),l(-.138,-.469),l(-.5,-.452),l(-.966,-.541),l(.024,-.141),l(.23,.062),l(.023,-.237),l(-.345,-.414),l(.418,-.616),l(-.182,-.22),l(.188,-.563),l(-.251,-.282),l(.182,-.396),l(.268,-.079),l(-.027,-.45),l(-.331,-.081),l(-.2,-.107),l(.002,-.342),l(-.133,-.427),l(.279,-.515),l(.273,-.273),l(.727,.11),l(.361,.022),l(.058,.004),l(.382,.369),l(.733,.866),l(.018,.109),l(.035,.218),l(-.132,.429),l(.074,.641),l(.298,.668),l(.722,.608),l(-.09,.029),l(-.449,.842),l(-.402,.386),l(-.496,.472),l(-.583,.884), +N(451.512,108.463),l(-.507,.16),l(-.532,.245),l(-.622,-.054),l(-.361,-.041),l(-.365,.159),l(-.395,.429),l(-.606,.146),l(-.809,.076),l(-.722,-.608),l(-.298,-.668),l(-.074,-.641),l(.132,-.429),l(-.035,-.218),l(.14,.049),l(.188,0),l(.072,-.087),l(.029,-.072),l(-.029,-.13),l(.058,-.167),l(.088,-.058),l(.225,-.058),l(.246,-.058),l(.116,-.058),l(.08,-.065),l(.087,.073),l(.131,.058),l(.094,.109),l(.116,0),l(.029,-.058),l(-.059,-.072),l(.109,-.058),l(.151,-.102),l(.152,-.087),l(.175,.043),l(.064,-.007),l(.196,.007),l(.152,.015),l(.087,-.08),l(.131,-.116),l(.064,.021),l(.102,.043),l(.088,-.021),l(.087,-.043),l(.102,.051),l(.058,-.015),l(.116,-.022),l(.145,-.021),l(.16,-.022),l(.072,-.029),l(.058,.017),l(-.007,.106),l(.134,.213),l(.666,.296),l(.358,.383),l(.225,.469),l(-.006,.499),l(-.104,.3),l(.047,.199), +N(383.93,117.402),l(-.249,.101),l(-.517,.291),l(-.439,.052),l(-.548,-.178),l(-.58,0),l(-.28,-.073),l(-.719,.292),l(-.058,-.177),l(.389,-1.012),l(-.021,-.856),l(-.182,-.115),l(.244,-.542),l(-.054,-.397),l(.13,-.114),l(-.144,-.141),l(-.375,.085),l(-.476,.097),l(-.108,-.449),l(.48,-.052),l(.283,-.22),l(-.042,-.17),l(-.178,-.226),l(-.3,.417),l(-.413,.136),l(-.357,-.042),l(-.059,-.188),l(.198,-.397),l(.138,-.616),l(-.039,-.303),l(.258,-.114),l(.403,-.503),l(.45,-1.098),l(-.12,-.115),l(.612,-1.783),l(-.35,-.924),l(-.007,-.42),l(-.146,-.378),l(.255,-.271),l(.891,-.251),l(.55,-.188),l(.531,.439),l(1.822,.047),l(.531,-.26),l(.335,.055),l(.272,.227),l(.15,.242),l(.842,.495),l(.062,.242),l(-.288,.216),l(-1.234,.506),l(-.084,.072),l(-.051,.442),l(.072,.456),l(-.132,.983),l(.057,.938),l(-.043,.199),l(-.458,.229),l(-.482,.045),l(-.288,.129),l(.488,.494),l(.455,.551),l(.163,.198),l(-.347,.371),l(-.506,.655),l(-.17,.455),l(.812,.123),l(.408,.31),l(-.884,.643),l(-.242,.37),l(-.304,.951),l(-.008,.018), +N(500.121,117.572),l(-.407,-.016),l(-.433,.388),l(-.164,.126),l(-.318,-.105),l(-.102,-.269),l(.03,-.259),l(-.274,-.151),l(-.366,-.082),l(-.244,.234),l(-.343,-.023),l(-.811,-.153),l(-.364,.032),l(-.304,-.16),l(-.437,.094),l(-.266,.143),l(-.23,.043),l(-.064,-.245),l(-.207,-.023),l(-.24,.292),l(-.693,.304),l(-1.185,.224),l(-.711,-.039),l(-.747,-.123),l(-.439,.073),l(-1.498,.673),l(-.567,.13),l(-1.104,.176),l(-.556,-.153),l(-1.532,-.444),l(-.278,.03),l(-.929,.373),l(-.746,.075),l(-.575,-.025),l(-.777,-.166),l(-.222,.001),l(-.142,-.035),l(-.055,.319),l(.102,.452),l(.243,.423),l(-.627,.127),l(-.156,.374),l(-.2,.169),l(-.171,-.041),l(-.114,.127),l(-.39,-.125),l(-.311,.001),l(-.245,-.459),l(-.119,-.093),l(.097,-.175),l(.242,-.197),l(.617,-.403),l(.021,-.175),l(-.049,-.134),l(-.279,-.28),l(-.146,-.053),l(-.487,.368),l(-.23,.041),l(-.137,.064),l(.092,.041),l(-.118,.216),l(-.172,.023),l(-.063,-.047),l(-.076,.088),l(-.297,.058),l(-.332,-.222),l(-.447,-.198),l(-.461,-.157),l(-.395,.046),l(-.849,.548),l(-.337,.286),l(.006,.204),l(-.141,.046),l(-.122,.07),l(-.005,.082),l(-.179,-.169),l(-.604,.206),l(-.689,.185),l(-.594,-.013),l(-.587,-.07),l(-.678,-.267),l(-.963,-.819),l(-1.181,-.479),l(-1.034,-.182),l(-.692,.072),l(-.119,.255),l(-.097,.609),l(-.053,.411),l(-.173,.156),l(-.256,0),l(-.253,-.155),l(-1.12,.243),l(-.423,-.027),l(-.386,-.183),l(-.657,-1.159),l(-.42,.354),l(-.764,-.451),l(-.451,.057),l(-.562,.412),l(-.227,-.382),l(.066,-.127),l(.242,-.17),l(-.116,-.17),l(-.989,-.012),l(-.545,-.013),l(-.088,-.269),l(.571,-.199),l(-.074,-.241),l(-.284,-.198),l(-.454,-.07),l(-.084,-.297),l(.041,-.34),l(.087,-.284),l(-.089,-.255),l(-.396,-.126),l(-.627,-.353),l(-.371,.086),l(-.265,-.084),l(-.004,-.255),l(.171,-.501),l(.131,.059),l(.478,.311),l(.567,-.271),l(-.396,-.283),l(.021,-.124),l(-.296,-.128),l(.03,-.128),l(.571,-.159),l(.152,-.113),l(-.068,-.142),l(-.149,-.088),l(-.337,-.035),l(.01,-.187),l(.18,-.07),l(-.163,-.164),l(-.198,-.117),l(-.009,-.152),l(-.227,-.012),l(.263,-.181),l(.296,-.275),l(.161,-.035),l(.07,-.16),l(-.341,-.042),l(-.573,.12),l(-.905,.164),l(-.166,-.035),l(.046,-.33),l(.127,-.125),l(-.003,-.199),l(-.029,-.286),l(.13,-.264),l(.299,.012),l(.184,-.41),l(.175,-.023),l(.63,-.422),l(.514,.012),l(.133,-.129),l(.479,-.047),l(.128,.211),l(.268,.102),l(.169,.028),l(.529,.022),l(.147,-.129),l(-.067,-.129),l(-.269,-.129),l(.286,-.094),l(.324,.036),l(.117,.082),l(-.219,.223),l(.213,-.026),l(1.053,-.073),l(.619,.042),l(.379,.046),l(.279,.047),l(.155,-.176),l(-.086,-.094),l(-.468,-.035),l(-.212,-.118),l(.275,-.212),l(1.386,-.151),l(.417,-.012),l(.377,-.117),l(-.442,-.012),l(-.592,.023),l(-.215,0),l(-.068,-.146),l(-.611,-.382),l(.325,-.528),l(.926,.14),l(1.244,.048),l(.264,-.117),l(1.086,.321),l(1.051,-.031),l(.414,-.243),l(-.041,-.27),l(.624,-.244),l(.455,-.214),l(1.218,-.573),l(.598,-.215),l(1.039,-.23),l(.889,-.073),l(.758,.07),l(.905,.126),l(.798,.041),l(.753,-.372),l(.216,.527),l(.416,.298),l(.278,.099),l(.592,.013),l(.622,-.144),l(.453,.74),l(.492,.255),l(.574,-.172),l(.391,.056),l(.968,.582),l(1.265,.04),l(1.094,.197),l(.749,-.001),l(1.084,-.272),l(.514,-.044),l(.651,.141),l(.764,.098),l(.787,-.016),l(.554,-.144),l(1.518,-.573),l(.424,-.335),l(1.212,.082),l(.491,.068),l(.226,-.072),l(.761,-.36),l(.41,.041),l(1.326,1.018),l(.031,.028),l(.795,.722),l(.026,.199),l(-.421,.813),l(.033,.412),l(.284,.211),l(1.413,.12),l(.492,.451),l(-.072,.211),l(-.409,-.023),l(-.231,.141),l(-.009,.433),l(-.584,.267),l(-.039,.27),l(.264,.67),l(-.122,.375),l(.224,.492),l(.09,.117),l(.106,-.105),l(.288,.203),l(.039,.207),l(-.229,.281),l(-.287,.535),l(-.06,.128),l(.213,.14),l(.424,.111),l(-.145,.245),l(.099,.421),l(.42,.374),l(.275,.035),l(.023,.308),M(462.617,106.804),l(.241,.211),l(-.019,.287),l(.115,.285),l(.077,.071),l(.593,.355),l(.819,.241),l(.605,.155),l(.152,.121),L(464.943,109),l(-.304,.166),l(-.515,-.072),l(-.94,-.246),l(-.326,.07),l(-.209,.152),l(-1.019,-.012),l(-.357,.384),l(-.109,.273),l(-.833,.316),l(-.612,.282),l(-.222,.258),l(-.307,.152),l(-.268,.293),l(-.255,.082),l(.164,-.258),l(.019,-.141),l(-.062,-.176),l(.584,-.293),l(.22,-.141),l(-.226,-.191),l(-.082,.015),l(-.653,-.056),l(-.229,-.148),l(.326,-.546),l(.387,-.558),l(.678,-.631),l(-.127,-.227),l(-.427,-.197),l(-.105,0),l(.498,-.445),l(.629,-.374),l(.497,-.045),l(.527,.111),l(1.333,.005), +N(509.077,114.955),l(-.72,-.317),l(-.268,.016),l(-.356,-.433),l(-.374,-.105),l(-.13,-.363),l(.532,-.27),l(.095,-.222),l(-.43,-.176),l(-.027,-.188),l(.63,-.129),l(.094,-.155),l(-.061,-.113),l(-.487,-.21),l(-.351,-.281),l(-.306,-.166),l(-.456,.234),l(-1.058,.492),l(-.374,.445),l(-.642,.188),l(-.254,.255),l(-.014,-.027),l(.094,-.118),l(-.094,-.213),l(-.189,-.071),l(.26,-.095),l(.166,-.047),l(-.261,-.189),l(-.236,-.236),l(.236,-.118),l(.095,-.189),l(-.283,-.047),l(-.354,-.024),l(-.284,-.118),l(-.213,-.212),l(-.236,-.024),l(-.26,-.354),l(-.283,-.142),l(-.048,-.094),l(.166,0),l(.378,0),l(.165,-.236),l(0,-.236),l(-.213,-.024),l(-.188,-.142),l(-.544,-.331),l(-.283,-.354),l(.047,-.284),l(.402,-.142),l(-.119,-.236),l(-.212,-.166),l(-.426,-.071),l(-.284,-.095),l(.071,-.094),l(.071,-.118),l(-.284,-.095),l(-.087,-.212),l(.418,-.308),l(.236,0),l(.473,.024),l(.331,.189),l(.189,.213),l(.638,.189),l(.284,-.047),l(.188,.023),l(.143,.071),l(.26,.189),l(.236,-.047),l(.236,-.095),l(.095,-.331),l(-.118,-.213),l(-.614,-.166),l(-.213,-.307),l(-.143,-.26),l(.095,-.071),l(.143,-.142),l(.268,-.189),l(.229,-.023),l(.023,.166),l(.213,-.047),l(.189,0),l(.142,.189),l(.473,.284),l(.095,.118),l(.118,0),l(.283,.284),l(0,.308),l(.591,.094),l(.449,.142),l(.379,-.047),l(.165,-.213),l(.308,-.331),l(.283,-.094),l(.496,-.284),l(.292,-.449),l(.465,.331),l(.236,.378),l(.26,.189),l(.284,.307),l(.095,.52),l(.142,.236),l(.283,.26),l(.284,.165),l(0,.166),l(.449,.236),l(.473,-.047),l(.378,.071),l(.284,.166),l(.236,.189),l(.095,.189),l(0,.142),l(-.355,-.142),l(-.401,-.047),l(-.213,0),l(-.26,.047),l(-.142,.118),l(-.402,.071),l(-.213,.142),l(-.047,.189),l(-.023,.473),l(-.118,.26),l(-.095,.236),l(-.095,.378),l(.213,.236),l(-.023,.189),l(-.237,-.071),l(-.094,.095),l(-.071,.331),l(-.071,.26),l(-.118,-.047),l(-.094,-.236),l(-.143,-.095),l(-.165,.095),l(-.047,.307),l(.07,.166),l(-.118,.118),l(-.118,.095),l(.095,.26),l(-.363,.91),M(499.844,111.738),l(.709,.061),l(.142,-.047),l(.26,-.071),l(.236,.236),l(.071,.166),l(.378,.142),l(.213,.071),l(.308,-.118),l(.52,0),l(-.071,.213),l(.024,.236),l(.118,.023),l(.331,.166),l(-.071,.236),l(.421,.763),l(-.009,.001),l(-.253,-.133),l(-.416,.038),l(-.512,-.025),l(-.421,-.125),l(-.335,-.211),l(-.294,-.402),l(-.551,-.223),l(-.281,-.417),l(-.265,-.381),l(-.252,-.197), +N(455.452,122.442),l(.049,-.209),l(-.057,-.128),l(-.812,-.256),l(-.691,-.006),l(-.506,-.116),l(-.484,.017),l(-.121,-.046),l(-.103,-.093),l(.139,-.56),l(.315,-.005),l(-.005,-.088),l(-.009,-.122),l(.069,-.07),l(.083,.157),l(.021,.146),l(.303,.021),l(.172,.055),l(.184,-.076),l(-.014,-.082),l(.108,-.029),l(.157,.105),l(-.037,.093),l(-.099,.006),l(-.04,.053),l(.088,.023),l(.144,.035),l(.094,.046),l(.021,.128),l(.353,.041),l(.846,-.122),l(.509,.016),l(.035,.13),l(.192,.035),l(.608,.064),l(.307,.051),l(.358,-.121),l(.09,.05),l(-.101,.312),l(.163,.11),l(.105,0),l(.325,-.169),l(.286,-.058),l(.078,.052),l(.154,-.07),l(.232,-.146),l(-.083,.187),l(.015,.186),l(-.183,.268),l(-.582,-.046),l(-.349,.081),l(-.335,-.017),l(-1.994,.169),M(445.294,112.196),l(.583,-.884),l(.496,-.472),l(.402,-.386),l(.449,-.842),l(.09,-.029),l(.809,-.076),l(.606,-.146),l(.395,-.429),l(.365,-.159),l(.361,.041),l(.622,.054),l(.532,-.245),l(.507,-.16),l(.09,-.029),l(1.855,-.195),l(.799,-.261),l(.584,-.06),l(1.473,.505),l(.619,.21),l(.388,-.031),l(1.117,-.277),l(.086,-.257),l(-.097,-.327),l(.344,-.216),l(.363,.026),l(.105,0),l(.427,.197),l(.127,.227),l(-.678,.631),l(-.387,.558),l(-.326,.546),l(-.062,-.407),l(-.794,-.056),l(-.743,-.041),l(-.566,-.125),l(-.062,-.144),l(-.459,.186),l(-.248,.123),l(-.403,.012),l(-.031,-.247),l(-.335,.029),l(-.301,.314),l(-.431,.186),l(-.31,.03),l(-.306,-.159),l(-.252,.07),l(-.004,.133),l(.169,.185),l(.169,.34),l(.308,.059),l(.826,.609),l(-.166,.07),l(-.369,-.258),l(-.015,-.105),l(-.276,-.082),l(-.331,-.105),l(-.116,.099),l(-.211,.007),l(.069,.129),l(-.016,.129),l(.338,.164),l(.145,-.012),l(.114,.234),l(-.03,.129),l(-.245,.023),l(-.445,-.457),l(-.341,-.141),l(-.207,-.059),l(-.128,-.012),l(.003,.094),l(-.075,.035),l(.138,.164),l(.102,.105),l(.154,.141),l(.193,.059),l(.153,.035),l(.103,.094),l(-.093,.058),l(-.494,-.046),l(-.253,-.035),l(.035,-.176),l(-.137,-.293),l(-.164,-.188),l(-.401,-.108),l(-.472,-.373),l(.258,-.118),l(.025,-.136),l(-.053,-.122),l(-.182,-.035),l(-.153,.199),l(-.465,.176),l(.245,.224),l(-.25,.371),l(-.05,.249),l(.13,.121),l(.065,.172),l(.311,.338),l(.133,.036),l(.131,.479),l(.579,.421),l(.359,.467),l(-.172,.14),l(-.237,.082),l(.106,-.187),l(-.121,-.187),l(-.142,-.128),l(-.139,-.035),l(-.151,-.047),l(-.29,.175),l(.102,.188),l(.153,.081),l(.08,.316),l(-.193,.187),l(-.652,.141),l(.248,.046),l(.27,.14),l(.391,.058),l(.188,.222),l(.257,-.012),l(.155,.012),l(.048,.126),l(.367,.269),l(.306,.014),l(.138,.292),l(.282,.012),l(.27,0),l(.348,.303),l(.015,.128),l(-.193,.082),l(.238,.782),l(-.153,.175),l(-.185,0),l(-.226,-.385),l(-.222,-.047),l(-.207,-.278),l(-.101,-.142),l(-.17,0),l(-.496,.14),l(-.479,.105),l(-.184,.128),l(.315,.093),l(.013,.188),l(.007,.291),l(.229,.117),l(.153,-.026),l(.225,-.079),l(-.021,.198),l(.235,.175),l(-.519,.093),l(.002,.117),l(-.169,.062),l(-.309,-.086),l(.121,-.21),l(-.186,-.086),l(-.508,-.056),l(-.158,-.092),l(-.008,.206),l(.194,.453),l(.193,.17),l(-.045,.163),l(.209,.204),l(.213,.96),l(-.688,-.31),l(-.331,.071),l(-.298,.439),l(-.442,-.735),l(-.46,-.367),l(-.452,.44),l(-.428,-.353),l(-.127,-.297),l(.212,-.425),l(-.028,-.241),l(-.215,-.269),l(-.491,-.424),l(-.167,-.226),l(.017,-.17),l(.471,-.61),l(.609,.098),l(.425,-.298),l(.202,.042),l(1.668,.663),l(.337,-.1),l(.483,-.355),l(-.266,-.049),l(-.27,-.056),l(-1.204,-.493),l(-1.127,-.083),l(-.367,.058),l(-.66,.058),l(-.427,.143),l(-.89,-1.118),l(.269,-.1),l(.253,.056),l(.218,-.114),l(.122,-.185),l(-.339,-.24),l(-.235,.114),l(-.496,-.042),l(-1.035,-.721),l(-.199,-.325), +N(504.136,113.458),l(-.327,.328),l(-.377,.03),l(-.421,-.763),l(.071,-.236),l(-.331,-.166),l(-.118,-.023),l(-.024,-.236),l(.071,-.213),l(-.52,0),l(-.308,.118),l(-.213,-.071),l(-.378,-.142),l(-.071,-.166),l(-.236,-.236),l(-.26,.071),l(-.142,.047),l(-.709,-.061),l(-.492,-.451),l(-1.413,-.12),l(-.284,-.211),l(-.033,-.412),l(.421,-.813),l(-.026,-.199),l(-.795,-.722),l(.377,-.108),l(.307,.024),l(.308,-.095),l(.426,-.023),l(.401,-.118),l(.592,.047),l(.591,-.095),l(.378,-.047),l(.291,-.094),l(.087,.212),l(.284,.095),l(-.071,.118),l(-.071,.094),l(.284,.095),l(.426,.071),l(.212,.166),l(.119,.236),l(-.402,.142),l(-.047,.284),l(.283,.354),l(.544,.331),l(.188,.142),l(.213,.024),l(0,.236),l(-.165,.236),l(-.378,0),l(-.166,0),l(.048,.094),l(.283,.142),l(.26,.354),l(.236,.024),l(.213,.212),l(.284,.118),l(.354,.024),l(.283,.047),l(-.095,.189),l(-.236,.118),l(.236,.236),l(.261,.189),l(-.166,.047),l(-.26,.095),l(.189,.071),l(.094,.213),l(-.094,.118),l(.014,.027), +N(566.651,117.4),l(-.565,-.153),l(-.496,-.054),l(-.264,-.151),l(-.564,.227),l(-.974,.147),l(-.137,-.059),l(.129,-.176),l(-.198,-.077),l(-.678,.03),l(-.739,.315),l(-.592,.486),l(-.589,.064),l(-.745,.495),l(-.351,.03),l(-.368,-.026),l(-.128,-.084),l(-.164,-.409),l(-.199,-.521),l(.185,-.444),l(.099,-.775),l(.029,-.255),l(-.17,-.187),l(-.484,.093),l(.156,-.597),l(-.576,-.45),l(-.153,-.056),l(-.384,.016),l(-.286,.162),l(-.134,.363),l(-.435,.428),l(-.049,.425),l(.006,.255),l(-.208,.228),l(-.442,.158),l(-.133,-.013),l(-.587,-.152),l(-.292,.058),l(-.073,.185),l(.007,.311),l(-.3,.313),l(-.21,.128),l(-.381,.016),l(-.63,-.237),l(-.325,.001),l(-.581,.286),l(-.58,.343),l(-.485,.144),l(-.245,-.041),l(-.129,-.141),l(-.04,-.055),l(.375,-.843),l(-.063,-.377),l(.377,-.377),l(.283,-.503),l(.503,-.346),l(.157,-.22),l(-.126,-.283),l(-.471,-.314),l(-.126,-.409),l(.031,-.472),l(.126,-.22),l(-.126,-.22),l(-.346,0),l(-.44,-.032),l(-.157,-.157),l(-.346,-.188),l(-.251,-.283),l(.125,-.471),l(.472,-.283),l(.629,.126),l(1.069,.094),l(.282,-.188),l(.063,-.409),l(.251,-.157),l(.188,0),l(.032,-.346),l(.188,-.063),l(.251,-.063),l(-.126,-.094),l(-.534,.031),l(-.251,-.125),l(.503,-.094),l(.565,-.095),l(.472,.095),l(.062,-.126),l(.032,-.346),l(-.189,-.314),l(.283,-.314),l(-.031,-.22),l(.346,0),l(.22,.157),l(.252,.22),l(.22,-.157),l(.692,-.188),l(.471,-.346),l(.221,-.251),l(.439,.377),l(.252,.251),l(-.188,.22),l(-.409,.346),l(-.251,.126),l(.126,.188),l(.251,.063),l(.188,.283),l(.409,-.031),l(.345,.005),l(-.302,.147),l(-.441,.196),l(-.024,.246),l(-.196,0),l(-.099,-.172),l(-.516,-.196),l(-.515,-.147),l(-.981,.196),l(-.123,0),l(-.098,.27),l(.049,.196),l(-.196,.074),l(-.098,-.221),l(-.196,.196),l(-.099,.245),l(.099,.27),l(.049,.147),l(.122,.098),l(.589,-.024),l(.564,0),l(.688,-.024),l(.196,.073),l(.49,-.147),l(.368,.098),l(.147,.123),l(.073,.196),l(.393,.074),l(.295,-.049),l(-.024,-.221),l(.343,-.049),l(.442,-.123),l(.221,.024),l(.049,.147),l(.319,.123),l(.122,-.024),l(.049,.172),l(.074,.221),l(.318,-.172),l(.368,-.024),l(.172,.319),l(.196,0),l(.172,-.147),l(.834,-.221),l(.663,.073),l(.539,0),l(.344,-.171),l(.344,-.098),l(.196,.073),l(-.011,.069),l(.023,1.031),l(-.207,.223),l(.077,.305),l(.325,.394),l(.463,-.045),l(.229,-.162),l(.22,.06),l(.692,.039),l(.273,.154),l(.295,.494),l(-.009,.284),l(.028,.246),l(.152,.012),l(.049,.123),l(-.126,.428),l(.245,.237),l(-.152,.36),l(.2,.163),l(-.181,.185),l(-.08,.249),l(-.354,.136), +N(500.121,117.572),l(-.023,-.308),l(-.275,-.035),l(-.42,-.374),l(-.099,-.421),l(.145,-.245),l(-.424,-.111),l(-.213,-.14),l(.06,-.128),l(.287,-.535),l(.229,-.281),l(-.039,-.207),l(-.288,-.203),l(-.106,.105),l(-.09,-.117),l(-.224,-.492),l(.122,-.375),l(-.264,-.67),l(.039,-.27),l(.584,-.267),l(.009,-.433),l(.231,-.141),l(.409,.023),l(.072,-.211),l(.252,.197),l(.265,.381),l(.281,.417),l(.551,.223),l(.294,.402),l(.335,.211),l(.421,.125),l(.512,.025),l(.416,-.038),l(.253,.133),l(.009,-.001),l(.377,-.03),l(.327,-.328),l(.254,-.255),l(.642,-.188),l(.374,-.445),l(1.058,-.492),l(.456,-.234),l(.306,.166),l(.351,.281),l(.487,.21),l(.061,.113),l(-.094,.155),l(-.63,.129),l(.027,.188),l(.43,.176),l(-.095,.222),l(-.532,.27),l(.13,.363),l(.374,.105),l(.356,.433),l(.268,-.016),l(.72,.317),l(.015,.007),l(-.05,.707),l(-.143,.581),l(.205,.48),l(.494,.252),l(.925,.235),l(.827,.052),l(.424,.097),l(.162,.282),l(.312,.451),l(.687,.463),l(1.902,.513),l(.841,.052),l(.438,-.059),l(1.354,-.262),l(1.192,-.148),l(1.469,-.079),l(.41,-.229),l(.185,-.354),l(-.131,-.905),l(.015,0),l(.441,.025),l(.562,-.13),l(.466,-.3),l(.621,-.654),l(.476,-.328),l(.413,-.144),l(.609,-.032),l(.78,.038),l(.333,-.03),l(.517,-.343),l(.343,-.129),l(.519,.054),l(1.055,.107),l(.402,.437),l(.708,.251),l(.822,.335),l(.788,.066),l(.5,.054),l(.66,.167),l(.597,.336),l(1.803,1.362),l(.655,.506),l(.696,.01),l(.787,-.075),l(.185,.211),l(.038,.848),l(.01,.565),l(.15,.692),l(.078,.028),l(-.145,.241),l(-.084,.339),l(-.246,.807),l(-.49,1.272),l(-.222,.297),l(-.596,.384),l(-.016,.141),l(.119,.663),l(.096,.098),l(.738,.235),l(.026,.183),l(-.661,.935),l(-.034,.155),l(.254,1.085),l(.167,1.283),l(.143,.775),l(.191,.21),l(.209,.041),l(1.198,.275),l(.401,.167),l(.144,.366),l(.046,.437),l(-.425,.553),l(-.853,.795),l(-.853,1.034),l(.802,1.083),l(.71,1.068),l(.353,.464),l(.695,.391),l(1.144,.388),l(.409,.224),l(.168,.38),l(.111,1.34),l(.185,.394),l(.652,.053),l(.186,.281),l(-.036,.974),l(-.188,.255),l(-.209,.072),l(-1,.077),l(-.697,.258),l(-.794,.47),l(-.285,.383),l(-.31,.792),l(-.049,.354),l(-.182,.954),l(-.502,.028),l(-1.079,-.153),l(-.236,-.197),l(-.605,-.253),l(-.403,-.056),l(-1.43,.003),l(-.783,-.041),l(-.602,.072),l(-.475,-.38),l(-.163,-.126),l(-.835,-.026),l(-.576,.001),l(-.465,.014),l(-.212,-.239),l(-.756,-.125),l(-.305,-.183),l(-.162,-.014),l(-.021,-.5),l(-.295,-.128),l(-.103,-.514),l(-.292,-.349),l(-.013,-.639),l(-.309,-.493),l(-.237,.012),l(-.035,-.181),l(-.526,-.126),l(-.807,-.013),l(-.374,.017),l(-.209,.222),l(-.329,.018),l(-.517,.075),l(-.188,.364),l(-.538,.138),l(-.383,.443),l(-.368,.283),l(-.253,.043),l(-1.292,-.689),l(-.958,-.104),l(-.562,-.359),l(-1.088,-.317),l(-.247,-.301),l(-.324,-.282),l(-.497,-.592),l(-.997,-.436),l(-.584,-.083),l(-.194,-.028),l(-.58,-.465),l(-.596,-1.058),l(-.635,-1.114),l(-.209,-.268),l(.005,-.593),l(-.767,-.761),l(-.506,-.719),l(-.921,.143),l(-.46,-.042),l(-.13,-.126),l(-.291,-.056),l(-.191,-.268),l(-.029,-.565),l(-.448,.1),l(-.166,.099),l(-.32,.678),l(-.195,.184),l(-.355,.012),l(-.014,-.12),l(-.351,-.224),l(-.686,-.546),l(.064,-.212),l(-.007,-.395),l(-.164,-.465),l(-.215,-.013),l(-.551,.003),l(-.034,-.325),l(.055,-.579),l(.197,-.622),l(.014,-.508),l(-.112,-.239),l(-.29,-.28),l(-.774,-.603),l(-.436,-.209),l(-1.242,-.925),l(-.533,-.025),l(-.321,.115),L(503,127.106),l(.033,-.819),l(-1.02,-.954),l(-.312,-.351),l(-.002,-.184),l(.133,-.875),l(.235,-.763),l(1.142,-.98),l(-.422,-.761),l(.013,-.254),l(.468,-.596),l(-1.067,-.107),l(-.761,-.208),l(-.065,-.198),l(-.563,-1.086),l(-.69,-1.397), +N(535.734,133.791),l(.853,-1.034),l(.853,-.795),l(.425,-.553),l(-.046,-.437),l(-.144,-.366),l(-.401,-.167),l(-1.198,-.275),l(-.209,-.041),l(-.191,-.21),l(-.143,-.775),l(-.167,-1.283),l(-.254,-1.085),l(.034,-.155),l(.661,-.935),l(-.026,-.183),l(-.738,-.235),l(-.096,-.098),l(-.119,-.663),l(.016,-.141),l(.596,-.384),l(.222,-.297),l(.49,-1.272),l(.246,-.807),l(.084,-.339),l(.145,-.241),l(.193,.112),l(.937,.193),l(.999,.348),l(.573,.082),l(.534,-.031),l(.636,-.3),l(.22,-.199),l(.001,-.466),l(.119,-.199),l(.568,-.159),l(1.985,-.689),l(.508,-.243),l(.103,-.128),l(.203,-.991),l(.432,-.809),l(1.135,-.205),l(.417,-.2),l(.445,-.356),l(.565,.294),l(1.454,.244),l(.096,.016),l(.646,.011),l(1.217,.05),l(.236,.126),l(.351,.48),l(.04,.055),l(.129,.141),l(.245,.041),l(.485,-.144),l(.58,-.343),l(.581,-.286),l(.325,-.001),l(.63,.237),l(.381,-.016),l(.21,-.128),l(.3,-.313),l(-.007,-.311),l(.073,-.185),l(.292,-.058),l(.587,.152),l(.133,.013),l(.442,-.158),l(.208,-.228),l(-.006,-.255),l(.049,-.425),l(.435,-.428),l(.134,-.363),l(.286,-.162),l(.384,-.016),l(.153,.056),l(.576,.45),l(-.156,.597),l(.484,-.093),l(.17,.187),l(-.029,.255),l(-.099,.775),l(-.185,.444),l(.199,.521),l(.164,.409),l(.128,.084),l(.368,.026),l(.351,-.03),l(.745,-.495),l(.589,-.064),l(.592,-.486),l(.739,-.315),l(.678,-.03),l(.198,.077),l(-.129,.176),l(.137,.059),l(.974,-.147),l(.564,-.227),l(.264,.151),l(.496,.054),l(.565,.153),l(-.192,.145),l(-.574,-.059),l(.01,.269),l(.236,.012),l(.048,.088),l(-.148,.142),l(-.358,.004),l(-.455,.297),l(-.332,-.005),l(-.338,.179),l(-.647,-.144),l(-1.345,.012),l(-1.148,.152),l(-.53,.292),l(-.272,.19),l(-.559,.395),l(-.246,-.023),l(-.258,.214),l(-.464,.413),l(.01,.32),l(.411,.271),l(.01,.336),l(.232,.171),l(-.119,.483),l(.198,.477),l(-.324,.426),l(-.524,.355),l(-.4,.341),l(-.13,.283),l(.223,.478),l(.033,.31),l(-.289,.255),l(-.513,.215),l(-.698,-.039),l(-.997,-.122),l(-.355,.129),l(.35,.336),l(.365,.407),l(.129,.281),l(.088,.437),l(-.199,.255),l(-.315,.115),l(-.513,.031),l(-.416,.115),l(-.292,.228),l(-.224,.424),l(-.288,.834),l(-.139,1.214),l(-.021,.084),l(-.34,.383),l(-.237,.086),l(-1.001,-.375),l(-.562,-.025),l(-.559,.243),l(-.362,.271),l(-.321,.693),l(-.254,.086),l(-.516,-.082),l(-.644,-.039),l(-.283,.072),l(-.597,.441),l(-.412,.369),l(-.188,.34),l(-.232,.876),l(-.099,.903),l(-.069,.184),l(-.247,.156),l(-1.066,.274),l(-1.183,.19),l(-.964,.175),l(-1.234,.12),l(-1.005,-.135),l(-.349,.002),l(-1.187,.218),l(-.742,-.024),l(-.541,-.039),l(-.854,-.235),l(-1.069,-.248),l(-.63,-.194),l(-.887,-.32), +N(486.696,126.295),l(5.257,-2.711),l(.589,-2.701),l(-.024,-.467),l(-.187,-.508),l(.009,-.255),l(.23,-.355),l(.31,-.214),l(.866,-.174),l(.457,-.371),l(.944,-.883),l(-.059,-.24),l(.23,-.043),l(.266,-.143),l(.437,-.094),l(.304,.16),l(.364,-.032),l(.811,.153),l(.343,.023),l(.244,-.234),l(.366,.082),l(.274,.151),l(-.03,.259),l(.102,.269),l(.318,.105),l(.164,-.126),l(.433,-.388),l(.407,.016),l(.69,1.397),l(.563,1.086),l(.065,.198),l(.761,.208),l(1.067,.107),l(-.468,.596),l(-.013,.254),l(.422,.761),l(-1.142,.98),l(-.235,.763),l(-.133,.875),l(.002,.184),l(.312,.351),l(1.02,.954),L(503,127.106),l(.075,.155),l(.321,-.115),l(.533,.025),l(1.242,.925),l(.436,.209),l(.774,.603),l(.29,.28),l(.112,.239),l(-.014,.508),l(-.197,.622),l(-.055,.579),l(.034,.325),l(.551,-.003),l(.215,.013),l(.164,.465),l(.007,.395),l(-.064,.212),l(.686,.546),l(.351,.224),l(.014,.12),l(-.096,.003),l(-.664,.101),l(-.408,-.056),l(-.157,.057),l(-.103,.127),l(-1.271,.044),l(-.518,.13),l(-.343,.693),l(-.463,.609),l(-.521,.568),l(-4.048,-.132),l(-1.557,-.697),l(-.812,-.277),l(-.118,-.253),l(-.047,-.818),l(.118,-.396),l(-.135,-.366),l(-.973,.048),l(-.141,-.07),l(-.399,-.633),l(-.258,-.196),l(-2.44,-1.101),l(-1.14,-.473),l(-2.034,-.934),l(-.757,-.222),l(-1.129,-.459),l(-.093,-.056),l(-.093,-.056),l(-.311,-.69),l(-.87,-1.632), +N(479.916,127.377),l(-.082,-.085),l(.047,-.122),l(-.021,-.183),l(-.201,-.128),l(-.183,-.346),l(.398,-.209),l(.041,-.099),l(.526,-.396),l(-.048,-.058),l(-.223,-.099),l(.077,-.151),l(.298,-.25),l(.599,-.006),l(-.14,-.146),l(-.035,-.046),l(.078,-.111),l(.177,-.163),l(.169,-.116),l(.299,-.239),l(-.068,-.058),l(.023,-.163),l(-.09,-.047),l(-.031,-.221),l(-.241,-.157),l(-.222,-.058),l(.204,-.204),l(-.125,-.052),l(-.053,-.116),l(-.12,.058),l(-.335,.052),l(-.388,-.023),l(-.225,-.564),l(.129,-.593),l(.072,-.064),l(-.1,-.507),l(-.42,-.326),l(.126,-.093),l(.036,-.152),l(.117,-.128),l(-.093,-.222),l(.107,-.012),l(.259,-.32),l(-.061,-.112),l(.311,-.001),l(.39,.125),l(.114,-.127),l(.171,.041),l(.2,-.169),l(.156,-.374),l(.627,-.127),l(-.243,-.423),l(-.102,-.452),l(.055,-.319),l(.142,.035),l(.222,-.001),l(.777,.166),l(.575,.025),l(.746,-.075),l(.929,-.373),l(.278,-.03),l(1.532,.444),l(.556,.153),l(1.104,-.176),l(.567,-.13),l(1.498,-.673),l(.439,-.073),l(.747,.123),l(.711,.039),l(1.185,-.224),l(.693,-.304),l(.24,-.292),l(.207,.023),l(.064,.245),l(.059,.24),l(-.944,.883),l(-.457,.371),l(-.866,.174),l(-.31,.214),l(-.23,.355),l(-.009,.255),l(.187,.508),l(.024,.467),l(-.589,2.701),l(-5.257,2.711),l(-.161,.071),l(-2.96,1.541),l(-1.139,.656),l(-.253,.016),l(-.365,-.167),l(-1.902,-1.034), +N(426.068,126.434),l(-.093,.981),l(.064,.564),l(-.093,.269),l(-.802,.428),l(-.579,.314),l(-1.473,1.138),l(-.126,.354),l(.274,.973),l(-.147,.537),l(-.155,.227),l(-.864,.598),l(-.22,.143),l(-.564,-1.536),l(-.699,-2.242),l(-.323,-.464),l(-.363,-.252),l(-.432,-.181),l(-.484,-.831),l(-.225,-.465),l(-.363,-.28),l(-.452,-.097),l(-.336,-.774),l(-.301,-.888),l(.112,-.509),l(1,-.853),l(.414,-.355),l(.163,-.411),l(.048,-.537),l(-.052,-.594),l(-.026,-.892),l(-.012,-1.429),l(.114,-.439),l(.685,-.627),l(.012,-.184),l(.508,-.185),l(.633,-.455),l(.591,-.228),l(.703,-.016),l(.643,.183),l(.247,.212),l(.059,.241),l(.25,.538),l(.27,.084),l(.417,-.171),l(.584,-.44),l(.401,-.17),l(.034,.354),l(-.265,.567),l(-.638,.511),l(-.275,.468),l(.005,.283),l(.202,.438),l(.508,.466),l(.351,.127),l(.303,.848),l(-.094,.212),l(-.541,.764),l(-.59,.34),l(-1.017,.92),l(-.216,.339),l(.287,.451),l(.587,.55),l(.528,.295),l(.284,.056),l(.396,-.227),l(.316,.084),l(.244,.635),l(.582,.239), +N(381.402,139.704),l(-.027,-.876),l(.069,-2.006),l(.037,-.382),l(.686,-.314),l(1.512,-.998),l(.963,-.542),l(1.265,.078),l(.397,-.059),l(.181,-.693),l(.864,-.033),l(.777,-.174),l(.527,-.229),l(.524,-.356),l(.484,-.652),l(1.109,-.332),l(1.52,-.701),l(.129,-.227),l(-.296,-.62),l(-.025,-.396),l(.079,-.227),l(.265,-.114),l(1.186,-.12),l(.381,-.186),l(.309,-.553),l(1.022,.022),l(.67,-.018),l(1.826,.004),l(.34,-1.033),l(-.07,-.211),l(-.507,-.322),L(397,126.646),l(-.158,-.465),l(.016,-1.271),l(.022,-.833),l(-.165,-.889),l(-.189,-.211),l(-.563,-.279),l(-.259,-.508),l(.351,0),l(.66,-.143),l(.541,-.256),l(.369,-.566),l(.405,-.312),l(.509,-.086),l(.407,-.157),l(.679,-.27),l(.324,.226),l(.176,.017),l(.249,.024),l(.238,-.142),l(.407,-.51),l(.613,-.426),l(.682,-.355),l(.614,-.171),l(1.16,-.116),l(1.587,-.06),l(.513,-.072),l(.634,-.312),l(.578,.211),l(.564,-.072),l(.585,-.313),l(.343,-.1),l(.939,.012),l(.513,-.015),l(.307,.056),l(.221,.042),l(.322,.113),l(.816,.168),l(.529,-.015),l(.772,-.171),l(.705,-.2),l(.612,-.554),l(.994,.508),l(.339,.099),l(.312,-.143),l(.314,-.241),l(.228,-.156),l(.528,.042),l(.388,.197),l(.162,.269),l(.269,.126),l(.516,-.086),l(1.093,-.158),l(-.012,.184),l(-.685,.627),l(-.114,.439),l(.012,1.429),l(.026,.892),l(.052,.594),l(-.048,.537),l(-.163,.411),l(-.414,.355),l(-1,.853),l(-.112,.509),l(.301,.888),l(.336,.774),l(.452,.097),l(.363,.28),l(.225,.465),l(.484,.831),l(.432,.181),l(.363,.252),l(.323,.464),l(.699,2.242),l(.564,1.536),l(-.204,.156),l(-.241,.383),l(.88,1.605),l(.147,.833),l(.052,.691),l(-.1,.862),l(.101,.748),l(-.16,.622),l(-.158,.495),l(.457,1.156),l(-.061,.664),l(-.086,.17),l(-.666,.47),l(-.249,.128),l(-.152,.283),l(1.272,1.702),l(.249,.917),l(.562,.873),l(.244,.154),l(.544,-.201),l(.702,.165),l(1.028,.347),l(.178,.168),l(.86,1.506),l(.098,.07),l(-.265,.186),l(-1.632,.843),l(-4.012,2.241),l(-1.607,.956),l(-2.308,1.454),l(-.834,.655),l(-3.084,2.617),l(-1.82,.364),l(-1.672,.321),l(-2.176,.408),l(-.146,-.564),l(.161,-.679),l(-.099,-.522),l(-.277,-.352),l(-.309,-.111),l(-.748,-.024),l(-.375,-.167),l(-.588,-.562),l(-.47,.314),l(-.229,-.027),l(-1.111,-1.039),l(-.393,-.28),l(-.082,-.183),l(.096,-.396),l(-.181,-.253),l(-2.472,-1.469),l(-.397,-.253),l(-1.292,-.824),l(-1.924,-1.26),l(-3.283,-2.241),l(-.811,-.575),l(-2.054,-1.344),l(-.895,-.531),l(-.1,-.084),l(-1.414,-.91),l(-4.12,-2.42),l(-2.829,-1.509), +N(395.704,122.189),l(.259,.508),l(.563,.279),l(.189,.211),l(.165,.889),l(-.022,.833),l(-.016,1.271),l(.158,.465),l(.598,.788),l(.507,.322),l(.07,.211),l(-.34,1.033),l(-1.826,-.004),l(-.67,.018),l(-1.022,-.022),l(-.309,.553),l(-.381,.186),l(-1.186,.12),l(-.265,.114),l(-.079,.227),l(.025,.396),l(.296,.62),l(-.129,.227),l(-1.52,.701),l(-1.109,.332),l(-.484,.652),l(-.524,.356),l(-.527,.229),l(-.777,.174),l(-.864,.033),l(-.181,.693),l(-.397,.059),l(-1.265,-.078),l(-.963,.542),l(-1.512,.998),l(-.686,.314),l(-.037,.382),l(-.069,2.006),l(-1.42,.008),l(-1.718,-.004),l(-2.677,.001),l(-2.511,0),l(-1.635,.04),l(.141,-.28),l(.431,-.411),l(.427,-.085),l(1.296,-.285),l(1.143,-.455),l(.453,-.312),l(1.147,-.85),l(1.149,-.878),l(1.043,-1.104),l(.46,-.693),l(.133,-.509),l(-.05,-.494),l(-.427,-.776),l(-.09,-.678),l(.099,-.508),l(.396,-.636),l(.706,-.863),l(.211,-.65),l(-.063,-.367),l(.071,-.353),l(1.285,-1.203),l(.724,-.481),l(.916,-.327),l(1.266,-.469),l(.73,-.397),l(.558,-.552),l(.537,-.736),l(.466,-.905),l(.829,-1.925),l(.269,-.128),l(.54,-.171),l(.19,.127),l(.684,.848),l(.138,.099),l(1.148,.507),l(.661,-.001),l(.595,.042),l(1.304,-.074),l(.522,-.228),l(.437,-.27),l(.398,.551),l(.256,.099),l(.798,.097),l(.361,0), +N(480.248,123.437),l(.388,.023),l(.335,-.052),l(.12,-.058),l(.053,.116),l(.125,.052),l(-.204,.204),l(.222,.058),l(.241,.157),l(.031,.221),l(.09,.047),l(-.023,.163),l(.068,.058),l(-.299,.239),l(-.169,.116),l(-.177,.163),l(-.078,.111),l(.035,.046),l(.14,.146),l(-.599,.006),l(-.298,.25),l(-.077,.151),l(.223,.099),l(.048,.058),l(-.526,.396),l(-.041,.099),l(-.398,.209),l(-.07,-.023),l(-.088,.041),l(-.067,.193),l(-.009,.167),l(-.355,.07),l(-.07,-.099),l(-.151,-.022),l(-.372,.051),l(.26,-.291),l(.097,-.361),l(.169,-.227),l(.328,-.681),l(-.017,-.232),l(.181,0),l(.138,-.192),l(.072,-.32),l(.018,-.32),l(.409,-.431),l(.232,-.07),l(.116,-.174),l(-.048,-.157), +N(184.444,142.729),l(-.367,.82),l(-.518,.821),l(-.186,.763),l(-.179,1.159),l(.017,1.851),l(-.133,1.187),l(-.016,1.13),l(.564,1.737),l(.275,.805),l(.624,.945),l(.76,.903),l(.191,.452),l(.481,.521),l(.529,.974),l(.729,1.228),l(.375,.296),l(.677,.069),l(.436,-.015),l(.577,.154),l(.593,.451),l(.503,.508),l(.773,.069),l(1.016,-.242),l(1.55,-.456),l(1.396,-.3),l(.803,-.157),l(-.02,.542),l(.838,.223),l(.264,-.286),l(.293,-.199),l(-.104,-.247),l(-.393,-.175),l(1.073,-.62),l(.633,-.62),l(.086,-.827),l(.498,-.429),l(-.094,-.477),l(.092,-1.145),l(.254,-.699),l(.625,-.334),l(.164,-.043),l(.757,-.198),l(.701,-.1),l(1.088,-.229),l(1.016,-.37),l(.594,-.058),l(.499,.056),l(1.139,.181),l(.502,-.194),l(.378,.093),l(.62,.507),l(.047,.297),l(-.079,.424),l(-.298,.382),l(-.541,.496),l(-.433,.425),l(-.317,.445),l(-.02,.7),l(-.254,.297),l(-.188,.354),l(.155,.155),l(.337,-.138),l(-.101,.652),l(-.262,1.196),L(205.356,159),l(-.062,.24),l(-.34,-.534),l(-.167,-.452),l(-.072,-.155),l(-.386,.34),l(-.02,.549),l(-.437,.016),l(-.178,.447),l(-.599,.857),l(-.386,-.27),l(-.278,.095),l(.025,.329),l(-2.332,-.006),l(-1.792,-.005),l(-.04,1.24),l(-.999,.032),l(.396,.223),l(.495,.541),l(.624,.231),l(.359,.69),l(.532,.223),l(-.211,.683),l(-1.762,-.007),l(-1.06,.007),l(-1.076,1.812),l(.305,.397),l(-.207,.238),l(.054,.553),l(.044,.454),l(-.704,-.555),l(-.952,-.888),l(-.956,-.761),l(-1.069,-.859),l(-.534,-.352),l(-.053,-.071),l(-.639,-.252),l(-1.048,-.21),l(-.657,.044),l(-.817,.397),l(-1.1,.567),l(-.756,.256),l(-.931,-.069),l(-.724,-.21),l(-.48,-.197),l(-1.305,-.195),l(-.588,-.267),l(-.644,-.422),l(-.935,-.521),l(-.785,-.267),l(-1.711,-.392),l(-.963,-.365),l(-.722,-.366),l(-1.074,-.436),l(-.592,-.352),l(-1.123,-1),l(-.207,-.07),l(-.606,.058),l(-.689,-.14),l(-1.835,-.575),l(-.565,-.536),l(-.503,-.634),l(-.495,-.395),l(-1.049,-.577),l(-.619,-.267),l(-.5,-.494),l(-.742,-.987),l(-.363,-.55),l(-.038,-.113),l(.15,-.155),l(.504,-.086),l(.18,-.17),l(.047,-.184),l(-.331,-.367),l(.457,-.679),l(.041,-.381),l(-.172,-.466),l(-.744,-.959),l(.121,-.297),l(.146,-.17),l(-.07,-.268),l(-.665,-.62),l(-1.495,-1.777),l(-.546,-.493),l(-.963,-1.058),l(-.474,-.522),l(-.815,-.578),l(-.322,-.197),l(-.158,-.268),l(-.058,-.48),l(-.144,-.183),l(-.329,-.197),l(-.609,-.197),l(-.408,-.31),l(-.366,-.522),l(-.271,-.028),l(-.414,.114),l(-.238,-.155),l(-.163,-.367),l(-.005,-.325),l(.459,-.736),l(-.126,-.339),l(-.751,-.62),l(-.439,.255),l(-.375,-.621),l(-.118,-.353),l(-.359,-.211),l(-.61,-.168),l(-.319,-.296),l(-.125,-.254),l(.05,-.381),l(.084,-.269),l(-.185,-.226),l(-.561,-.21),l(-.46,-.098),l(-.46,-.253),l(-.935,-.86),l(-.478,-.706),l(-.281,-.551),l(-.646,-.832),l(-.736,-1.073),l(-.184,-.423),l(-.38,-.678),l(-.242,-.338),l(-.152,-.452),l(.042,-.509),l(.032,-.311),l(-.56,-.239),l(-.795,-.196),l(-.06,-.452),l(-.128,-.155),l(-.458,-.183),l(-.289,.326),l(-.251,.043),l(-1.43,-.647),l(-.285,1.004),l(-.045,.438),l(.033,.084),l(.265,.339),l(.264,.296),l(.028,1.046),l(.088,.509),l(.51,.677),l(.143,.169),l(.643,.267),l(.601,.536),l(.525,.663),l(.602,1.214),l(.44,.282),l(.328,.042),l(.237,.169),l(.325,1.398),l(.102,.169),l(.246,.155),l(.497,.056),l(.133,.056),l(.215,.438),l(.161,.65),l(.445,.79),l(.49,-.071),l(.223,-.142),l(.245,.452),l(.344,1.469),l(.531,1.059),l(.649,1.2),l(.069,.593),l(-.014,.522),l(.26,.353),l(.378,.154),l(.389,-.17),l(.234,-.198),l(.588,.804),l(.258,.579),l(.464,.253),l(.281,.014),l(.133,.311),l(-.196,.537),l(-.136,.127),l(-.691,.595),l(-.254,-.042),l(-.251,-.409),l(-.24,-.734),l(-.617,-.578),l(-.625,-.309),l(-.516,-.479),l(-.834,-.507),l(-1.143,-.986),l(-.416,-.451),l(-.162,-.269),l(.216,-.989),l(-.035,-.254),l(-.488,-1.002),l(-.238,-.381),l(-.327,-.282),l(-.44,-.098),l(-.5,-.31),l(-.675,-.677),l(-.305,.142),l(-.363,-.056),l(-1.262,-.746),l(-.722,-.31),l(-.896,-.973),l(-.139,-.127),l(-.246,-.254),l(.679,.15),l(.599,.013),l(.588,-.284),l(.244,-.326),l(.093,-.636),l(-.01,-.184),l(-.458,-.635),l(-.466,-.452),l(-1.1,-.888),l(-.986,-.493),l(-.402,-.338),l(-.203,-.522),l(-.272,-.649),l(-.091,-.155),l(-.447,-.126),l(-.15,-.353),l(-.026,-.594),l(-.203,-.395),l(-.623,-.734),l(-.434,-.706),l(-.003,-.254),l(.212,-.382),l(-.777,-.62),l(-.254,-.325),l(-.22,-.485),l(.34,-.017),l(2.367,-.155),l(2.381,-.084),l(.316,.31),l(.267,.154),l(1.186,.39),l(2.811,.933),l(3.516,1.112),l(.338,.055),l(1.662,.019),l(1.544,.02),l(.966,.037),l(1.867,-.011),l(.213,-.101),l(.096,-.892),l(1.858,.003),l(1.892,.046),l(.209,.112),l(.631,.662),l(.766,.632),l(.837,.519),l(.708,.491),l(.179,.226),l(.284,.678),l(.318,.847),l(.445,.549),l(1.092,.659),l(1.104,.503),l(.337,.069),l(.501,.011),l(.416,-.158),l(.283,-.37),l(.418,-.413),l(.576,-.541),l(.468,-.201),l(.643,-.018),l(.475,.082),l(.783,.321),l(.412,.252),l(.363,.366),l(.663,1.029),l(.744,1.227),l(.845,1.042),l(.657,.576),l(.268,.253),l(.078,.467),l(.332,.932),l(.336,.592),l(.375,.365),l(.921,.32),l(1.029,.56),l(.264,.069),l(.416,-.116),l(.296,-.001),l(.816,.377),l(.347,.119), +N(507.047,133.665),l(.055,.197),l(.134,.691),l(-.336,-.028),l(-.513,.513),l(.421,.194),l(.418,-.206),l(.306,.021),l(.698,1.84),l(-.644,.044),l(-1.07,-.05),l(-.185,-.239),l(-.334,-.619),l(-.408,-.054),l(-1.657,-.259),l(.521,-.568),l(.463,-.609),l(.343,-.693),l(.518,-.13),l(1.271,-.044), +N(606.155,150.953),l(.595,.152),l(.255,.14),l(.25,-.129),l(.273,-.368),l(.015,-.678),l(-.152,-.93),l(.228,-.185),l(.401,-.144),l(.191,-.354),l(-.146,-1.594),l(.133,-.283),l(.811,.32),l(.391,.11),l(.309,.013),l(.17,-.128),l(1.148,-2.25),l(0,-.324),l(-.192,-.408),l(.045,-.212),l(.938,-1.134),l(.136,-.382),l(-.057,-.761),l(.197,-.354),l(1.446,-.883),l(.719,-.512),l(.312,-.129),l(.558,.082),l(.853,.221),l(.295,-.058),l(-.184,-.718),l(.072,-.283),l(.596,-.582),l(.112,-.24),l(.018,-.508),l(.001,-.127),l(.306,-.34),l(.277,-.044),l(.504,.279),l(.397,.435),l(.243,.901),l(.217,.309),l(.287,.041),l(.504,-.031),l(.146,.14),l(.195,1.649),l(.02,.875),l(-.353,.862),l(-.429,.722),l(-.611,.525),l(-.487,.271),l(-.191,.198),l(-.617,.85),l(.075,.465),l(.163,.705),l(-.224,.58),l(0,.268),l(.216,.069),l(.312,-.086),l(.819,-.442),l(.771,-.089),l(.479,-.017),l(.156,.126),l(.277,1.762),l(.202,.324),l(.554,-.074),l(.521,.096),l(.033,.268),l(-.729,1.584),l(.117,.352),l(.228,.098),l(.507,-.003),l(.481,-.045),l(.291,.379),l(.341,.746),l(.378,.266),l(.246,.083),l(.647,-.159),l(.628,-.413),l(.111,.38),l(.153,.239),l(-.502,.355),l(-.53,.61),l(-.442,.581),l(-.582,.455),l(-.193,.185),l(-.08,.085),l(-.158,.071),l(-.645,.06),l(-.436,.172),l(-.528,.342),l(-.394,.595),l(-1.078,.316),l(-.62,.018),l(-.474,-.082),l(-.362,.411),l(-.143,.368),l(-.036,.819),l(-.114,.509),l(.064,.409),l(-.086,.24),l(-.163,.001),l(-.588,.131),l(.739,.884),l(.069,.183),l(.112,.875),l(.254,.14),l(1.091,.953),l(.148,.324),l(.646,1.041),l(.163,.338),l(-.194,.241),l(-.451,.229),l(-.128,.226),l(.231,1.185),l(-.171,.198),l(-.812,.428),l(.178,.38),l(.6,1.436),l(.54,.477),l(.606,.604),l(.203,.479),l(.088,.663),l(-.086,.636),l(.006,.254),l(.488,1.183),l(.586,1.225),l(-.077,.297),l(-1.011,1.559),l(-1.01,1.7),l(-.098,.374),l(-.359,-.181),l(-.075,-.805),l(.461,-.665),l(.174,-.495),l(.122,-.777),l(.287,-.466),l(-.512,-.027),l(-.104,-.084),l(-.004,-.282),l(.195,-.509),l(-.177,-1.524),l(-.246,-.832),l(-.639,-1.185),l(-.488,-1.312),l(-.347,-.846),l(-.179,-.875),l(-.174,-1.736),l(-.117,-.677),l(-.034,-.564),l(-.051,-.212),l(-.344,-.084),l(-.148,-.098),l(-.304,-.917),l(-.516,-.677),l(-.226,-.225),l(-.247,.029),l(-.081,.988),l(-.158,.424),l(-.43,.41),l(-.59,.284),l(-1.089,.511),l(-.359,.622),l(-.298,.297),l(-.196,.142),l(-.237,-.282),l(-.007,-.438),l(-.212,.015),l(-.338,.354),l(-.321,-.013),l(-.166,-.211),l(.147,-.495),l(-.001,-.113),l(-.621,.171),l(-.276,.127),l(-.247,.283),l(-.355,-.126),l(-.002,-.466),l(.553,-1.54),l(.162,-.791),l(.001,-.889),l(-.101,-1.059),l(-.384,-.973),l(-.431,-1.072),l(-.196,-.296),l(-.281,.537),l(-.32,-.126),l(-.526,-.366),l(.482,-.17),l(.312,-.015),l(-.149,-.479),l(-.054,-.268),l(-.684,-.775),l(-.182,-.183),l(-.19,-.028),l(-.407,.1),l(-.38,-.267),l(.086,-.438),l(-.026,-.141),l(-.209,-.112),l(-.365,.043),l(-.577,-.465),l(-.504,-.606),l(-.117,-.244),l(.252,-.341),l(.801,-.527),l(-.194,-1.607), +N(605.297,153.429),l(-.126,-.264),l(-.269,-.55),l(-.223,-1.213),l(-.611,-1.41),l(-.357,-.395),l(-.73,.354),l(-.393,0),l(-.034,-.084),l(-.242,-.211),l(-.356,-.592),l(-.124,-.042),l(-.152,.127),l(-.026,.537),l(.374,.79),l(-.006,.424),l(-.143,.169),l(-.455,.086),l(-.235,.537),l(-.261,.1),l(-.255,-.437),l(-.311,-.395),l(-.073,-.057),l(-.163,.669),l(-.28,.249),l(-.203,.043),l(-.271,-.536),l(-.495,.636),l(-.359,-.265),l(-.147,-.532),l(-.402,-1.775),l(-.325,-1.409),l(-.352,-.45),l(-.04,-.254),l(.505,-.765),l(.029,-.269),l(-.193,-.21),l(-1.042,-.431),l(-.339,-.323),l(.548,-.61),l(.4,-.299),l(.502,-.13),l(.382,-.101),l(.047,-.155),l(-.126,-.112),l(-1.224,-.938),l(-.494,-.237),l(-.083,-.155),l(.124,-.283),l(.555,-.525),l(.234,-.171),l(1.252,.303),l(.339,.266),l(.372,.266),l(.489,-.06),l(.417,.054),l(.129,.324),l(.053,.479),l(.079,.719),l(.095,.099),l(.537,.109),l(.547,.053),l(.916,-.062),l(.559,-.003),l(2.473,.198),l(.111,.098),l(.057,.127),l(-.012,.79),l(-.159,.34),l(-.938,.767),l(-.498,.13),l(-.651,.356),l(-.131,.283),l(.009,.522),l(.001,.381),l(.23,.281),l(.249,.267),l(.529,.448),l(.224,-.354),l(.395,-1.159),l(.281,-.115),l(.4,-.044),l(.064,.578),l(.627,2.479),l(.037,.466),l(.194,1.607),l(-.801,.527),l(-.252,.341), +N(627.408,186.411),l(-.086,.337),l(-.495,.35),l(-.11,.575),l(-.644,.089),l(-.05,-.478),l(-.309,-.163),l(-.279,.28),l(-.244,.394),l(-.204,-.083),l(-.118,-.239),l(.213,-.398),l(-.041,-.21),l(-.055,-.226),l(-.261,-.238),l(-.447,-.119),l(-.106,-.466),l(-.571,.013),l(-.448,.17),l(.013,-.104),l(.128,-.297),l(-.15,-.183),l(-.411,.212),l(-.301,-.07),l(-.38,-.38),l(-.116,-.508),l(.064,-.282),l(-.151,-.438),l(-.229,-.169),l(-.388,.043),l(-.39,-.719),l(-.209,-.508),l(-.3,-.324),l(-.311,-.155),l(-.456,-.395),l(-.343,.1),l(-.218,.142),l(-.216,-.381),l(-.04,-.607),l(.163,-.749),l(.559,-1.738),l(.29,-.848),l(-.087,-.044),l(.098,-.374),l(1.01,-1.7),l(1.011,-1.559),l(.077,-.297),l(-.586,-1.225),l(-.488,-1.183),l(-.006,-.254),l(.086,-.636),l(-.088,-.663),l(-.203,-.479),l(-.606,-.604),l(-.54,-.477),l(-.6,-1.436),l(-.178,-.38),l(.812,-.428),l(.171,-.198),l(-.231,-1.185),l(.128,-.226),l(.451,-.229),l(.194,-.241),l(-.163,-.338),l(-.646,-1.041),l(-.148,-.324),l(-1.091,-.953),l(-.254,-.14),l(-.112,-.875),l(-.069,-.183),l(-.739,-.884),l(.588,-.131),l(.163,-.001),l(.086,-.24),l(-.064,-.409),l(.114,-.509),l(.036,-.819),l(.143,-.368),l(.362,-.411),l(.474,.082),l(.62,-.018),l(1.078,-.316),l(.394,-.595),l(.528,-.342),l(.436,-.172),l(.645,-.06),l(.158,-.071),l(.08,-.085),l(.541,.166),l(.295,.182),l(.118,.168),l(.01,.423),l(-.106,.805),l(.066,.367),l(.186,.154),l(.423,-.003),l(.489,-.2),l(.414,-.045),l(.045,.113),l(.249,1.311),l(-.085,.41),l(-.528,1.569),l(-.117,.438),l(-.027,.494),l(.145,.324),l(.481,.138),l(.37,-.411),l(1.173,-1.178),l(.346,-.03),l(.835,.348),l(.59,.265),l(.223,-.072),l(.543,-.257),l(.2,-.538),l(.286,-.453),l(.403,.012),l(.893,.192),l(.266,.153),l(.052,.282),l(.285,.535),l(.688,.659),l(.435,.632),l(.058,1.524),l(.107,.366),l(.255,.464),l(.979,1.279),l(.419,.703),l(.157,.507),l(.002,.945),l(-.121,.438),l(-.808,.64),l(-.301,-.167),l(-.599,-.109),l(-.575,-.039),l(-.558,.074),l(-.798,-.066),l(-1.172,.091),l(-.383,.101),l(-.521,.441),l(-.92,1.233),l(-.146,.297),l(-.076,.382),l(.026,.635),l(.219,.648),l(.487,.717),l(.16,.479),l(-.146,.176),l(-.026,-.063),l(-.286,-.183),l(-.458,-.084),l(-.9,-.887),l(-.434,-.154),l(-.304,-.014),l(-.572,.227),l(-.391,-.112),l(-.29,-.141),l(-.337,-.014),l(0,-.282),l(.19,-1.243),l(-.107,-.184),l(-.719,-.055),l(-.248,-.084),l(-.521,.043),l(-.443,.212),l(-.244,.297),l(.207,.593),l(-.103,.339),l(-.318,.707),l(.083,.579),l(.054,.41),l(-.293,.664),l(-.583,1.187),l(-.7,1.682),l(-.255,1.314),l(.104,1.171),l(.172,.296),l(.229,.169),l(.55,-.072),l(.396,-.142),l(.252,.07),l(.135,.353),l(.009,.325),l(-.08,.466),l(.141,.282),l(.178,.211),l(.271,-.094),l(.17,.46),l(.209,.974),l(-.032,.254),l(.127,.737),l(.434,.871),l(.167,.155),l(.801,.281),l(.539,.112),l(.467,-.058),l(.294,.197),l(.266,.612),l(.664,.544),l(.212,.145), +N(204.31,158.989),l(-.175,.412),l(.612,-.173),l(.026,.429),l(-.419,1.241),l(.178,.269),l(-.237,.795),l(.189,.318),l(-.092,.397),l(-.358,.875),l(-.3,.35),l(-.36,.032),l(-.054,.286),l(-.388,.238),l(0,.286),l(-.69,.016),l(.215,-4.297),l(-.025,-.329),l(.278,-.095),l(.386,.27),l(.599,-.857),l(.178,-.447),l(.437,-.016), +N(200.276,169.481),l(-.151,-.056),l(-.928,-.342),l(-.614,.032),l(-.766,-.032),l(-.608,-.239),l(-.909,-.656),l(-.513,-.419),l(-.044,-.454),l(-.054,-.553),l(.207,-.238),l(-.305,-.397),l(1.076,-1.812),l(1.06,-.007),l(1.762,.007),l(.211,-.683),l(-.532,-.223),l(-.359,-.69),l(-.624,-.231),l(-.495,-.541),l(-.396,-.223),l(.999,-.032),l(.04,-1.24),l(1.792,.005),l(2.332,.006),l(-.215,4.297),l(.69,-.016),l(.303,.095),l(.311,.302),l(.14,-.191),l(-.066,-.381),l(.336,.157),l(.458,.367),l(-1.507,1.208),l(-.499,.238),l(-.177,.493),l(.162,.604),l(-.438,.302),l(-.467,.048),l(-.043,.254),l(.164,.159),l(-.351,.111),l(-.184,.302),l(-.22,-.016),l(-.565,.461),l(-.012,.223), +N(204.413,165.093),l(.312,-.03),l(.612,-.27),l(.639,-.058),l(.743,.126),l(.478,.069),l(1.443,.04),l(.699,-.228),l(.379,-.199),l(.567,.267),l(.788,-.03),l(.763,-.101),l(.63,-.001),l(.5,.126),l(.564,.253),l(-.038,.353),l(-.102,.226),l(.228,.282),l(.787,.238),l(.557,.069),l(.244,.524),l(-1.425,.486),l(-.424,.229),l(-.248,.086),l(-.463,-.097),l(-.328,-.182),l(-.259,-.013),l(-.294,.242),l(-.503,.794),l(-1.207,.997),l(-.725,-.42),l(-.513,.583),l(-.882,.034),l(-.005,.961),l(-.293,.412),l(-.29,.143),l(-1.001,.125),l(-.311,-.661),l(-.025,-.085),l(-.478,-.3),l(.085,-.731),l(-.128,-.175),l(-.272,0),l(-.541,-.276),l(-.433,.34),l(-.365,-.016),l(-.066,-.271),l(-.565,-.35),l(-.409,-.08),l(-.208,-.418),l(-.677,-.17),l(.438,-.302),l(-.162,-.604),l(.177,-.493),l(.499,-.238),l(1.507,-1.208), +N(205.532,170.085),l(.035,.076),l(-.203,.057),l(.01,.265),l(-.237,.334),l(-.68,-.046),l(-.853,-.139),l(-1.697,-.505),l(-1.305,-.435),l(-.325,-.21),l(.012,-.223),l(.565,-.461),l(.22,.016),l(.184,-.302),l(.351,-.111),l(-.164,-.159),l(.043,-.254),l(.467,-.048),l(.677,.17),l(.208,.418),l(.409,.08),l(.565,.35),l(.066,.271),l(.365,.016),l(.433,-.34),l(.541,.276),l(.272,0),l(.128,.175),l(-.085,.731), +N(242.38,173.617),l(-.128,-.105),l(-.84,.171),l(-.534,.156),l(-.414,.2),l(-.056,.288),l(.048,.497),l(-.129,.396),l(-.227,-.027),l(-.381,.059),l(-.99,1.758),l(-.172,.722),l(-.241,.722),l(-.709,1.191),l(.402,.025),l(.234,-.1),l(.384,-.017),l(.31,.606),l(.855,1.45),l(.103,.395),l(-.226,1.132),l(.099,.353),l(.401,.309),l(.429,.548),l(.397,.252),l(.496,-.017),l(1.163,-.12),l(1.167,-.05),l(.521,.181),l(.64,.321),l(.188,.253),l(.847,.998),l(.554,.576),l(.144,0),l(.522,-.13),l(.76,-.174),l(1.99,-.224),l(.644,.081),l(-.409,.525),l(-.085,1.004),l(-.379,.511),l(-.147,.326),l(.026,.254),l(.035,.438),l(.048,.367),l(.162,.804),l(.447,.789),l(.256,.437),l(.486,.647),l(.121,.282),l(-.731,.612),l(-.479,.526),l(.51,.491),l(.797,1.182),l(-.52,.286),l(-.834,.57),l(-.412,.158),l(-.463,.017),l(-2.812,-.082),l(-.64,-.024),l(-.042,.325),l(-.013,1.031),l(.178,.154),l(.896,.122),l(.177,.084),l(.293,.408),l(.052,.367),l(-.384,-.04),l(-.417,-.11),l(-.687,.032),l(-.493,.187),l(-.111,.085),l(-.001,1.071),l(0,.554),l(.192,.197),l(.688,.363),l(.192,.183),l(-.031,.777),l(.399,.562),l(.031,.212),l(-.326,1.428),l(-.706,4.411),l(-.073,.382),l(-.133,.198),l(-.156,-.14),l(-.575,-.703),l(-.237,-.126),l(-.161,.058),l(-.448,.031),l(1.155,-1.956),l(.035,-.198),l(-.127,-.069),l(-1.299,-.84),l(-.509,-.209),l(-.708,.442),l(-.397,-.182),l(-.523,-.421),l(-.452,.427),l(-.337,.157),l(-.496,.031),l(-1.038,-.008),l(-.573,-.152),l(-.092,-.281),l(.004,-.396),l(-.173,-.296),l(-.479,-.039),l(-.366,-.14),l(-.078,-.282),l(-.251,-.761),l(-.988,-.672),l(-.526,-.364),l(-.208,-.62),l(-.208,-.324),l(-.513,-.435),l(-.897,-.418),l(-.927,-.107),l(-.081,-.112),l(-.269,-.162),l(-.197,-.118),l(-.709,-.631),l(-.128,-.056),l(-.89,.401),l(-.67,.061),l(-.977,-.277),l(-.355,-.309),l(-.166,-.493),l(-.227,-.225),l(-1.432,-.656),l(-1.496,-.803),l(.033,-.068),l(-.117,-.311),l(-.181,-.282),l(.108,-.212),l(.509,-.114),l(.465,.112),l(.186,-.325),l(-.348,-.564),l(.086,-.424),l(.314,-.227),l(.878,-.058),l(.193,.042),l(.41,-.227),l(.445,-.679),l(.45,-.961),l(.651,-1.061),l(-.122,-.268),l(-.56,-.408),l(-.071,-.184),l(.306,-.721),l(.089,-.523),l(-.149,-.861),l(-.371,-.86),l(.085,-.254),l(.49,-.143),l(.135,-.212),l(-.088,-.198),l(-.565,-.479),l(-.042,-.226),l(.103,-.198),l(.242,-.326),l(.036,-.254),l(-.173,-.282),l(-.739,-.719),l(-.364,-.396),l(.256,-.753),l(.228,-.082),l(-.045,-.45),l(.19,.082),l(.085,.307),l(.584,-.409),l(.094,-.43),l(.322,-.062),l(-.509,-1.038),l(-.228,-.149),l(-.084,-.327),l(.142,.075),l(.42,.338),l(.397,.507),l(.22,.508),l(.235,.197),l(.199,-.17),l(.147,-.241),l(-.332,-.776),l(.02,-.212),l(.176,-.297),l(.445,-.34),l(.399,-.297),l(.501,-.736),l(.327,-.156),l(.684,-.101),l(.217,-.382),l(-.104,-.381),l(.174,-.777),l(.067,-.65),l(.207,-.48),l(.498,-.439),l(.429,-.283),l(.592,-.242),l(.113,0),l(.374,.206),l(.22,.443),l(.281,-.34),l(.031,-.438),l(.199,-.551),l(.22,-.071),l(.267,.126),l(.855,.041),l(.562,-.001),l(.623,-.27),l(.237,-.254),l(.476,-.298),l(.848,-.256),l(.435,-.396),l(.278,-.551),l(.333,-.255),l(.469,-.17),l(.58,.013),l(.526,.338),l(.155,.126),l(.155,.339),l(-.285,.332), +N(408.6,174.04),l(-.062,.777),l(.164,.762),l(.388,.718),l(-.316,.962),l(-.19,.566),l(-.223,.298),l(-.656,.414),l(-.095,.34),l(.116,.592),l(-.078,.368),l(-.433,.13),l(-.257,.03),l(-.237,.397),l(.002,.381),l(.003,.48),l(-.012,.876),l(-.09,.989),l(.217,1.439),l(-.121,1.188),l(.006,.234),l(-.333,.015),l(-1.232,.144),l(-.669,.052),l(-.106,-.205),l(-.295,-1.072),l(.188,-.708),l(.026,-.833),l(-.036,-.537),l(-.135,-.974),l(-.006,-.862),l(-.035,-.522),l(.013,-.579),l(-.442,-1.311),l(-.164,-.691),l(-.403,-.323),l(-.468,-.294),l(-.18,-.395),l(.141,-.594),l(.046,-.424),l(.062,-.142),l(.24,-.157),l(.366,-.553),l(.415,-.271),l(.418,-.045),l(.739,.095),l(.337,-.158),l(.415,-.468),l(.237,-.764),l(-.131,-.367),l(.577,-.3),l(.321,-.073),l(.339,.28),l(.727,.589),l(.902,.503), +N(394.266,178.814),l(.191,-.17),l(-.02,-.41),l(-.261,-1.934),l(.125,-.34),l(.271,-.157),l(2.119,-.041),l(.867,.037),l(1.429,.006),l(.976,-.458),l(.161,.032),l(.595,.119),l(-.25,.849),l(.05,.254),l(.633,.915),l(.244,.451),l(-.188,.721),l(.02,.396),l(.265,1.114),l(.181,.592),l(.503,.788),l(.032,.155),l(-.286,.242),l(-.174,.382),l(.01,1.314),l(-.011,.72),l(.021,.551),l(.18,.479),l(.468,.577),l(.752,.608),l(-.503,.682),l(-.304,.099),l(-.593,-.013),l(-.992,.144),l(-.463,.185),l(-.188,.098),l(-.898,.469),l(-1.263,.398),l(-.942,.412),l(-.958,.567),l(-.578,-.324),l(-.945,-.436),l(-.074,-.124),l(-.066,-.741),l(-.554,-1.155),l(-.263,-.747),l(-.103,-.706),l(.327,-1.005),l(.437,-1.274),l(.521,-.851),l(.203,-.595),l(-.334,-1.438),l(-.189,-1.285),l(-.178,-.154), +N(400.72,175.499),l(1.013,.163),l(.611,.166),l(.29,.041),l(-.046,.424),l(-.141,.594),l(.18,.395),l(.468,.294),l(.403,.323),l(.164,.691),l(.442,1.311),l(-.013,.579),l(.035,.522),l(.006,.862),l(.135,.974),l(.036,.537),l(-.026,.833),l(-.188,.708),l(.295,1.072),l(.106,.205),l(-.452,.035),l(-.479,.128),l(-.368,.212),l(-.023,.04),l(-.752,-.608),l(-.468,-.577),l(-.18,-.479),l(-.021,-.551),l(.011,-.72),l(-.01,-1.314),l(.174,-.382),l(.286,-.242),l(-.032,-.155),l(-.503,-.788),l(-.181,-.592),l(-.265,-1.114),l(-.02,-.396),l(.188,-.721),l(-.244,-.451),l(-.633,-.915),l(-.05,-.254),l(.25,-.849), +N(383.772,190.418),l(.041,-.919),l(.105,-.565),l(.247,-.849),l(.059,-.452),l(-.131,-.282),l(-1.264,-1.334),l(-.592,.032),l(-.369,-.097),l(-.194,-.183),l(-.05,-.183),l(.501,-.865),l(.059,-.438),l(-.119,-.55),l(.062,-.17),l(.047,-.099),l(.602,-.554),l(.188,-.354),l(-.179,-.21),l(-.296,-.549),l(.03,-.127),l(.158,-.199),l(.304,-.03),l(.548,.223),l(.304,.012),l(.19,-.143),l(-.051,-.226),l(-.648,-.561),l(-.309,-.351),l(.332,-.37),l(.125,-.283),l(-.197,-.31),l(-.695,-.405),l(-.214,-.409),l(.264,-.623),l(.379,-.397),l(.522,-.54),l(.352,-.059),l(.566,.321),l(.455,.436),l(.35,-.228),l(.362,-.469),l(.571,-.483),l(.239,-.114),l(.257,.041),l(.147,.211),l(.004,.297),l(.117,.381),l(.148,.239),l(.352,-.059),l(.604,-.399),l(.159,-.1),l(.259,.168),l(.545,-.003),l(.308,.252),l(.15,.465),l(.52,.562),l(.452,.223),l(.354,.083),l(.368,-.115),l(.446,-.257),l(.608,-.159),l(.769,-.075),l(.644,.166),l(.63,.434),l(.178,.154),l(.189,1.285),l(.334,1.438),l(-.203,.595),l(-.521,.851),l(-.437,1.274),l(-.327,1.005),l(.103,.706),l(.263,.747),l(.554,1.155),l(.066,.741),l(-.119,-.201),l(-.289,-.197),l(-.208,.015),l(-.143,.24),l(-.096,.042),l(-.48,-.027),l(-.705,-.167),l(-.608,-.083),l(-2.352,.062),l(-1.279,.243),l(-.575,.199),l(-1.07,.369),l(-1.739,.781),l(-.701,.425),l(-.256,-.013),l(-.075,-.032), +N(627.408,186.411),l(.035,.024),l(.523,.098),l(1.061,1.198),l(.693,.916),l(.506,.762),l(.081,.579),l(-.023,.805),l(-.134,.862),l(.07,1.073),l(-.07,.636),l(.097,.494),l(.196,.381),l(.53,.493),l(.338,.536),l(.705,1.608),l(.062,.127),l(-.366,-.069),l(-.895,-.055),l(-.401,.142),l(-.175,-.07),l(-.521,-.437),l(-.885,-.605),l(-.6,-.337),l(-1.231,-.675),l(-1.02,-.732),l(-.217,-.254),l(-.16,-.988),l(-.438,-.691),l(-.895,-.817),l(-.195,-.663),l(.039,-.494),l(.03,-.283),l(-.107,-.409),l(-.399,-.634),l(-.347,-1.849),l(-.188,-.72),l(.043,-.362),l(.448,-.17),l(.571,-.013),l(.106,.466),l(.447,.119),l(.261,.238),l(.055,.226),l(.041,.21),l(-.213,.398),l(.118,.239),l(.204,.083),l(.244,-.394),l(.279,-.28),l(.309,.163),l(.05,.478),l(.644,-.089),l(.11,-.575),l(.495,-.35),l(.086,-.337),M(643.95,196.042),l(.081,.044),l(.375,.408),l(.397,.141),l(.861,.083),l(.413,.168),l(.761,.436),l(.335,.042),l(.337,-.1),l(-.503,-.535),l(.169,-.551),l(.365,-.608),l(.528,-1.258),l(.584,-.27),l(1.481,-.342),l(1.018,-.299),l(.428,-.326),l(.524,-1.021),l(.523,-.323),l(.87,-1.117),l(.22,-.212),l(.244,-.147),l(.112,-.068),l(.084,.126),l(.062,.37),l(.234,-.012),l(.111,.259),l(.309,.271),l(.383,-.271),l(1.234,-.42),l(-.025,-.086),l(-.197,-.197),l(.013,-.247),l(.024,-.111),l(-.148,-.444),l(-.11,-.174),l(.167,-.042),l(.188,.143),l(.085,-.016),l(.449,-.084),l(.161,-.283),l(-.036,-.24),l(-.478,-.366),l(.197,-.396),l(.436,-.071),l(.511,.041),l(.154,-.605),l(.408,-.313),l(.284,-.48),l(.531,-.58),l(.498,-1.032),l(.075,-.17),l(.322,.465),l(.33,.098),l(.315,-.424),l(.305,.494),l(.351,.282),l(.402,.211),l(.075,.338),l(-.182,.354),l(-.234,.452),l(.037,.198),l(.631,-.128),l(.472,-.128),l(.115,.226),l(-.349,.495),l(.742,-.1),l(.357,-.085),l(.269,.056),l(1.035,.662),l(.345,.14),l(.1,.24),l(-.158,.269),l(-.201,.155),l(-.44,.143),l(-.594,.029),l(-.683,-.083),l(-.355,.311),l(.096,.254),l(.888,.69),l(-.161,.311),l(-.458,.199),l(-.646,.1),l(-.518,.114),l(-.067,.15),l(-.182,-.09),l(-.753,-.292),l(-.446,-.04),l(-.624,.018),l(-.651,-.081),l(-.748,-.081),l(-.464,.017),l(-.247,.157),l(-.381,.638),l(-.119,.565),l(.106,.988),l(-.22,.383),l(-.646,.244),l(-.218,.34),l(.076,.748),l(-.928,1.785),l(-.387,.299),l(-.864,.175),l(-.465,.172),l(-.467,.356),l(-.287,.03),l(-.559,-.152),l(-.524,-.223),l(-.557,-.251),l(-.431,-.11),l(-.479,.074),l(-.531,.441),l(-.403,.525),l(-.528,.342),l(-.399,.172),l(-.543,-.11),l(-.526,-.223),l(-.255,.001),l(-.928,.416),l(-.446,-.28),l(-.304,-.083),l(-1,-.983),l(-.253,-.295),l(-.288,-.792), +N(274.556,195.884),l(.06,-.212),l(-.332,-.563),l(-.49,-1.127),l(-.246,-.832),l(-.185,-.295),l(-.561,-.067),l(-.532,-.675),l(-.571,-.831),l(.328,-.694),l(.095,-.467),l(-.078,-.777),l(.169,-.17),l(1.131,-.091),l(.183,-.27),l(.082,-.862),l(.142,-.496),l(.015,-.339),l(.326,-.312),l(.382,-.057),l(1.392,.463),l(.465,.042),l(.083,-.41),l(.141,-.085),l(.337,.027),l(.833,.012),l(.863,-.03),l(.723,.069),l(.63,.182),l(.999,.427),l(-.647,.876),l(-.391,.751),l(-.137,.594),l(.094,.381),l(.134,.635),l(.086,.664),l(.521,.844),l(.029,.438),l(-.424,1.472),l(-.489,.963),l(-1.05,-.488),l(-.319,.001),l(-.534,.385),l(-.398,.059),l(-.418,-.139),l(-.642,-.124),l(-.172,.156),l(-.2,.326),l(.611,1.014),l(-.528,-.054),l(-1.108,-.276),l(-.4,-.04), +N(285.859,190.719),l(.015,.422),l(-1.102,1.646),l(-.427,.765),l(-.439,.992),l(-.464,.681),l(-.299,.214),l(-.56,-.025),l(-1.11,-.389),l(-.882,.613),l(-.225,-.069),l(-.649,-.505),l(.489,-.963),l(.424,-1.472),l(-.029,-.438),l(-.521,-.844),l(-.086,-.664),l(-.134,-.635),l(-.094,-.381),l(.137,-.594),l(.391,-.751),l(.647,-.876),l(.218,.093),l(1.033,.294),l(.55,.196),l(.799,.549),l(1.264,1.084),l(.545,.564),l(.317,.465),l(.193,.028), +N(429.505,210.684),l(-.695,-.533),l(-.351,.13),l(-.68,.513),l(-.536,.414),l(-.112,-.177),l(-.392,-.86),l(-1.381,-1.344),l(.184,-.295),l(.413,-.229),l(.803,.307),l(.343,-.681),l(-.052,-.296),l(-.274,-.253),l(-.39,-.521),l(-.116,-.366),l(.058,-.495),l(.127,-.1),l(.909,-.146),l(.604,-.243),l(.125,-.213),l(.167,-.807),l(.174,-.185),l(.239,-.029),l(.193,.14),l(.341,.479),l(.405,.521),l(.386,.195),l(.287,-.016),l(.188,-.228),l(.362,-.482),l(.29,.253),l(.167,.578),l(.146,.112),l(.304,.068),l(.255,-.114),l(.184,-.68),l(.243,-1.089),l(.131,-1.229),l(.229,-1.047),l(-.114,-.338),l(-.161,-.127),l(-.384,-.082),l(-.528,-.208),l(-.242,-.31),l(-.132,-.437),l(.008,-.109),l(.021,-.3),l(.157,-.284),l(.492,-.398),l(.556,-.441),l(.094,-.354),l(-.389,-.902),l(-.369,-.322),l(-.592,-.067),l(-.939,.5),l(-.463,-.025),l(-.146,-.253),l(-.068,-.734),l(.077,-.679),l(.396,-.468),l(.56,.109),l(.863,.023),l(.878,-.076),l(.271,.055),l(.479,.04),l(.56,.124),l(.576,.194),l(.864,.334),l(.863,.292),l(.271,-.086),l(-.1,-.861),l(.159,-.185),l(.303,-.312),l(.365,-.497),l(.158,-.523),l(.222,-1.287),l(.255,-.228),l(.479,-.102),l(.975,-.175),l(.367,.054),l(.624,.138),l(.895,.093),l(.751,-.287),l(.128,.197),l(-.031,.156),l(-.398,1.203),l(-.558,.837),l(-.349,.821),l(-.094,.551),l(-.156,.764),l(-.196,2.021),l(-.254,1.342),l(-.115,.61),l(-.169,.708),l(-.139,.523),l(-.459,.427),l(-.525,.229),l(-.809,.599),l(-.41,.454),l(-.47,.836),l(-.343,.751),l(-.193,1.159),l(-.074,.396),l(.122,.72),l(-.086,.706),l(-1.025,.938),l(-.364,.229),l(-.931,.811),l(-.554,.399),l(-.57,.328),l(-.147,-.211),l(-.042,-.664),l(-.054,-.424),l(-1.495,.532),l(-.327,.581),l(-.443,.271),l(-.177,-.013),l(-.484,-.336), +N(425.506,195.522),l(.045,-.495),l(.88,.093),l(1.773,.088),l(.831,.038),l(1.022,.149),l(-.396,.468),l(-.077,.679),l(.068,.734),l(.146,.253),l(.463,.025),l(.939,-.5),l(.592,.067),l(.369,.322),l(.389,.902),l(-.094,.354),l(-.556,.441),l(-.492,.398),l(-.157,.284),l(-.021,.3),l(-.008,.109),l(.132,.437),l(.242,.31),l(.528,.208),l(.384,.082),l(.161,.127),l(.114,.338),l(-.229,1.047),l(-.131,1.229),l(-.243,1.089),l(-.184,.68),l(-.255,.114),l(-.304,-.068),l(-.146,-.112),l(-.167,-.578),l(-.29,-.253),l(-.362,.482),l(-.188,.228),l(-.287,.016),l(-.386,-.195),l(-.405,-.521),l(-.341,-.479),l(-.193,-.14),l(-.239,.029),l(-.174,.185),l(-.167,.807),l(-.125,.213),l(-.604,.243),l(-.909,.146),l(-.127,.1),l(-.058,.495),l(.116,.366),l(.39,.521),l(.274,.253),l(.052,.296),l(-.343,.681),l(-.803,-.307),l(-.413,.229),l(-.184,.295),l(-.038,-.037),l(-.563,-.493),l(-.532,-.55),l(-.259,-.466),l(-1.318,-1.169),l(.286,-.312),l(-.369,-.281),l(-.528,-.056),l(-.918,-1.438),l(.382,-.297),l(.111,-.1),l(-.321,-.395),l(-.464,-.14),l(-.29,-.564),l(-.369,-.451),l(.319,-.17),l(.541,-.411),l(.223,-.396),l(.291,-.976),l(.089,-.295),l(.415,.07),l(.495,.013),l(-.064,-.211),l(-.56,-.352),l(-.561,-.451),l(.208,-.042),l(.271,-.128),l(.142,-.617),l(.83,-.043),l(.927,.008),l(1.245,.021),l(.575,-.032),l(-.001,-.155),l(-.02,-.551),l(-.026,-1.836), +N(422.536,195.513),l(1.005,-.007),l(1.965,.017),l(.026,1.836),l(.02,.551),l(.001,.155),l(-.575,.032),l(-1.245,-.021),l(-.927,-.008),l(-.83,.043),l(.033,-.146),l(-.049,-.297),l(-.144,-.084),l(-.416,-.098),l(.287,-.467),l(.447,-.523),l(.335,-.58),l(.066,-.403),M(419.636,193.273),l(-.484,-.049),l(-.049,-.218),l(.049,-.291),l(.242,-.097),l(.024,-.146),l(0,-.291),l(.17,-.097),l(.169,-.121),l(.219,.048),l(.218,.048),l(.097,.194),l(-.193,.169),l(-.146,.243),l(-.17,.339),l(-.146,.267), +N(222.291,207.801),l(.188,-.126),l(.264,-.312),l(.585,-1.061),l(.038,-.269),l(-.209,-.733),l(.058,-.391),l(-.478,.617),l(-.732,.623),l(-.333,-.098),l(-.601,-.324),l(-.408,-.408),l(.389,-.283),l(.1,-.24),l(-.167,-.579),l(.005,-.438),l(.133,-.466),l(-.109,-.282),l(-.362,-.649),l(.193,-.17),l(.48,-.198),l(.721,-.454),l(-.319,-.395),l(0,-.226),l(.175,-.354),l(.497,-.462),l(.157,-.146),l(.14,-.848),l(-.116,-.452),l(-.082,-.184),l(.11,-.226),l(.686,-.101),l(.891,-.341),l(.396,-.241),l(.474,-.382),l(.09,-.186),l(1.496,.803),l(1.432,.656),l(.227,.225),l(.166,.493),l(.355,.309),l(.977,.277),l(.67,-.061),l(.89,-.401),l(.128,.056),l(.709,.631),l(.197,.118),l(.269,.162),l(.081,.112),l(.387,.76),l(.321,.789),l(-.08,.255),l(-.352,.384),l(-.547,1.147),l(-.533,.779),l(-.71,.725),l(-1.001,.755),l(-.336,.087),l(-1.028,.303),l(-.901,.358),l(-.809,.499),l(-.59,.653),l(-.284,.51),l(-.987,2.506),l(-.267,.312),l(-.242,.072),l(-.398,-.068),l(-.398,-.491),l(-.191,-.479),l(-.312,-.252),l(-.815,.005),l(-.444,-.11),l(-.105,-.197),l(-.097,-.494),l(.233,-.34),l(.029,-.495),l(.005,-.569), +N(245.934,224.314),l(1.109,1.843),l(.922,1.646),l(.08,.24),l(-.437,.736),l(-.15,.523),l(-.143,.848),l(.057,.522),l(.236,.902),l(-.156,.34),l(-.221,.34),l(-.532,.582),l(-.102,.452),l(.347,.845),l(-.21,.368),l(-.159,.34),l(.022,.48),l(.604,1.168),l(.015,.522),l(-.285,.439),l(-.723,.61),l(-.12,.227),l(.049,.48),l(.132,.295),l(.018,.142),l(-.586,.187),l(-.15,.199),l(-.228,.933),l(-.259,.298),l(-.852,.275),l(-.201,-.517),l(-.289,-.31),l(-1.422,-.618),l(-.313,-.239),l(-.233,-.678),l(-.315,-.38),l(-.559,-.225),l(-.504,-.281),l(-.489,-.254),l(-.616,-.309),l(-.873,-.464),l(-.673,-.366),l(-.866,-.379),l(-.838,-.337),l(-1.271,-.845),l(-1.354,-.985),l(-1.232,-1.099),l(-.594,-.705),l(-.42,-.677),l(.008,-.438),l(0,-.903),l(-.269,-.606),l(-.781,-1.043),l(-1.389,-2.778),l(-.285,-.268),l(-.467,-.211),l(-.074,-.085),l(.055,-.536),l(-.02,-.396),l(-.149,-.396),l(-1.208,-2.199),l(-.997,-1.961),l(-.688,-1.27),l(-1.365,-1.917),l(-.272,-.353),l(-.598,-.973),l(-.462,-.423),l(-.75,-.437),l(-.914,-.365),l(-.61,-.365),l(.119,-.17),l(.181,-.113),l(.609,-.029),l(.144,-.41),l(-.118,-.282),l(-.592,-.874),l(-.353,-.437),l(-.258,-.72),l(.01,-.24),l(.244,-.523),l(.582,-.622),l(1.02,-.878),l(.47,-.198),l(.317,-.214),l(-.005,.569),l(-.029,.495),l(-.233,.34),l(.097,.494),l(.105,.197),l(.444,.11),l(.815,-.005),l(.312,.252),l(.191,.479),l(.398,.491),l(.398,.068),l(.242,-.072),l(.267,-.312),l(.987,-2.506),l(.284,-.51),l(.59,-.653),l(.809,-.499),l(.901,-.358),l(1.028,-.303),l(.336,-.087),l(1.001,-.755),l(.71,-.725),l(.533,-.779),l(.547,-1.147),l(.352,-.384),l(.08,-.255),l(-.321,-.789),l(-.387,-.76),l(.927,.107),l(.897,.418),l(.513,.435),l(.208,.324),l(.208,.62),l(.526,.364),l(.988,.672),l(.251,.761),l(.078,.282),l(.366,.14),l(.479,.039),l(.173,.296),l(-.004,.396),l(.092,.281),l(.573,.152),l(1.038,.008),l(.496,-.031),l(.337,-.157),l(.452,-.427),l(.523,.421),l(.397,.182),l(.708,-.442),l(.509,.209),l(1.299,.84),l(.127,.069),l(-.035,.198),l(-1.155,1.956),l(.448,-.031),l(.161,-.058),l(.237,.126),l(.575,.703),l(.156,.14),l(.136,.324),l(-.341,.186),l(-.793,-.235),l(-.493,-.096),l(-.322,.072),l(-.604,.441),l(-.371,.115),l(-.669,-.066),l(-1.895,.773),l(-.701,.442),l(-.372,.172),l(-.599,1.415),l(-.319,.511),l(-.021,.155),l(.277,.86),l(.012,.112),l(-.625,.498),l(-.62,.328),l(-.349,.342),l(-.247,.622),l(.106,.564),l(.619,.957),l(1.333,2.166),l(.106,.127),l(-.247,.495),l(-.208,.312),l(1.085,.12),l(.415,.04),l(.312,.182),l(.241,.323),l(.096,.663),l(1.843,.032),l(.762,-.499),l(.648,-.484),l(.326,-.114),l(-.059,1.511),l(-.098,1.173),l(.108,.353),l(.317,.337),l(.285,.068),l(.358,-.072),l(.786,-.259),l(.42,-.045), +N(279.288,257.295),l(-.063,-.423),l(.027,-.777),l(.222,-.819),l(.298,-.835),l(.321,-.75),l(-.019,-.141),l(-.491,-.336),l(-.234,-.112),l(-1.29,.445),l(-.224,-.055),l(-.254,-.563),l(-.487,-2.524),l(-.121,-.437),l(-.843,-.404),l(-.724,-.278),l(-.115,.001),l(-.709,.413),l(-.346,.03),l(-.925,-.221),l(-.818,-.15),l(-.372,-.04),l(.006,-.72),l(.086,-.721),l(.132,-.862),l(-.104,-.959),l(-.521,-.872),l(-.084,-.663),l(-.253,-.408),l(.421,-.666),l(.38,-.765),l(.238,-.834),l(.185,-1.173),l(-.022,-.494),l(-.307,-.774),l(-.316,-.479),l(-.73,-.362),l(-.436,-.407),l(-.067,-.563),l(.261,-.835),l(-.042,-.296),l(-.693,-.024),l(-1.615,-.019),l(-.5,-.012),l(-.967,-.036),l(-.153,-.112),l(-.249,-.944),l(-.138,-2.032),l(-.03,-.706),l(-.203,-1.029),l(.038,-.565),l(-.085,-.169),l(-.403,-.237),l(-.537,-.166),l(-.636,-.123),l(-1.148,.077),l(-.22,-.084),l(-.398,-.308),l(-.385,-.774),l(-.096,-.014),l(-.882,-.037),l(-.3,-.098),l(-.75,-.603),l(-.688,-.307),l(-.676,-.25),l(-.355,.03),l(-.787,-.023),l(-.316,-.097),l(-1.1,-.939),l(-.813,-.928),l(-.335,-.591),l(-.141,-.635),l(-.036,-.818),l(.064,-.622),l(.079,-.621),l(-.045,-.748),l(-1.283,-.021),l(-.934,.076),l(-.36,.158),l(-.874,.485),l(-1.471,1.109),l(-.415,.243),l(-.48,-.025),l(-.336,-.026),l(-.946,.824),l(-.355,.03),l(-1.122,-.304),l(-.939,-.136),l(-.42,.045),l(-.786,.259),l(-.358,.072),l(-.285,-.068),l(-.317,-.337),l(-.108,-.353),l(.098,-1.173),l(.059,-1.511),l(-.326,.114),l(-.648,.484),l(-.762,.499),l(-1.843,-.032),l(-.096,-.663),l(-.241,-.323),l(-.312,-.182),l(-.415,-.04),l(-1.085,-.12),l(.208,-.312),l(.247,-.495),l(-.106,-.127),l(-1.333,-2.166),l(-.619,-.957),l(-.106,-.564),l(.247,-.622),l(.349,-.342),l(.62,-.328),l(.625,-.498),l(-.012,-.112),l(-.277,-.86),l(.021,-.155),l(.319,-.511),l(.599,-1.415),l(.372,-.172),l(.701,-.442),l(1.895,-.773),l(.669,.066),l(.371,-.115),l(.604,-.441),l(.322,-.072),l(.493,.096),l(.793,.235),l(.341,-.186),l(-.136,-.324),l(.133,-.198),l(.073,-.382),l(.706,-4.411),l(.326,-1.428),l(-.031,-.212),l(-.399,-.562),l(.031,-.777),l(-.192,-.183),l(-.688,-.363),l(-.192,-.197),l(0,-.554),l(.001,-1.071),l(.111,-.085),l(.493,-.187),l(.687,-.032),l(.417,.11),l(.384,.04),l(-.052,-.367),l(-.293,-.408),l(-.177,-.084),l(-.896,-.122),l(-.178,-.154),l(.013,-1.031),l(.042,-.325),l(.64,.024),l(2.812,.082),l(.463,-.017),l(.412,-.158),l(.834,-.57),l(.52,-.286),l(.148,.168),l(.138,.437),l(.161,.861),l(.088,.452),l(.199,.437),l(.432,.054),l(.694,.546),l(.482,.223),l(.414,-.073),l(.757,-.697),l(.083,.183),l(.186,.776),l(.271,-.016),l(.645,-.739),l(.74,-.654),l(.554,-.286),l(.652,-.173),l(.235,-.213),l(.259,-.666),l(.203,-.199),l(.652,-.131),l(.569,-.272),l(.265,-.27),l(-.15,-.253),l(-.434,-.125),l(-.96,-.051),l(-.166,-.239),l(-.079,-.55),l(-.302,-1.524),l(-.391,-.69),l(-.616,-.688),l(.041,-.184),l(.159,-.029),l(.309,.125),l(.896,.461),l(.385,.04),l(1.149,-.035),l(.344,.224),l(.628,.618),l(.348,-.115),l(.232,-1.117),l(.284,-.115),l(.465,.054),l(.557,-.074),l(.807,-.23),l(1.74,-.9),l(.592,-.385),l(.163,-.326),l(-.103,-.169),l(.375,-.257),l(.302,-.058),l(.516,.124),l(.26,.111),l(.04,.212),l(-.452,1.09),l(.304,-.001),l(.533,.138),l(.435,.958),l(-.179,.368),l(-.547,1.416),l(-.213,.962),l(.156,.465),l(.281,.394),l(.167,.31),l(-.072,.354),l(.008,.396),l(.15,.296),l(1.103,.897),l(.613,.392),l(.686,-.075),l(.694,-.513),l(.505,-.314),l(1,-.331),l(.934,-.429),l(.943,.022),l(.4,.04),l(1.108,.276),l(.528,.054),l(-.611,-1.014),l(.2,-.326),l(.172,-.156),l(.642,.124),l(.418,.139),l(.398,-.059),l(.534,-.385),l(.319,-.001),l(1.05,.488),l(.649,.505),l(.225,.069),l(.882,-.613),l(1.11,.389),l(.56,.025),l(.299,-.214),l(.464,-.681),l(.439,-.992),l(.427,-.765),l(1.102,-1.646),l(-.015,-.422),l(.409,-.241),l(.276,.141),l(.235,.423),l(.164,.791),l(.414,1.34),l(.108,.607),l(.472,1.383),l(.296,.55),l(.324,.324),l(.978,.21),l(.196,.338),l(.038,.551),l(-.045,.254),l(-.524,.354),l(-.933,1.414),l(-.238,.325),l(-.51,.411),l(-.41,.231),l(-.244,.138),l(-.798,.778),l(-.544,.947),l(-.419,1.018),l(-.402,.453),l(.271,.112),l(.512,-.072),l(.497,-.198),l(1.202,-.709),l(.112,-.028),l(.299,.889),l(.442,.818),l(.255,.112),l(.287,.07),l(1.135,-.031),l(.592,-.058),l(.737,-.298),l(-.277,.679),l(-.017,.584),l(.448,-.557),l(1.254,-1.006),l(.289,-.156),l(.306,-.382),l(.499,-.933),l(.272,-.396),l(.256,-.099),l(1.006,-.003),l(.352,-.198),l(.175,0),l(.687,.549),l(.654,.267),l(.32,-.028),l(.814,.28),l(1.069,.45),l(.334,.281),l(.269,.593),l(.08,.028),l(.176,-.015),l(.402,-.354),l(.319,.042),l(.302,.254),l(.538,.789),l(.205,.396),l(-.13,.254),l(-.308,.41),l(-.116,.424),l(.091,.466),l(.171,.396),l(.825,-.821),l(.369,-.156),l(.609,-.156),l(.995,-.454),l(.224,-.028),l(.367,.069),l(.764,.38),l(.907,.436),l(.462,.098),l(1.117,.167),l(1.118,.083),l(.464,-.058),l(.48,-.029),l(.577,-.171),l(.416,-.016),l(1.131,.351),l(.731,.408),l(.762,.479),l(.586,.437),l(1.595,1.395),l(.742,.662),l(.821,.605),l(.41,.338),l(.477,.196),l(.734,.168),l(1.247,.097),l(.912,.04),l(.445,.197),l(.265,.465),l(.087,.607),l(.592,2.004),l(.268,1.143),l(.062,.988),l(-.076,.579),l(-.179,.904),l(-.243,.848),l(-.559,1.301),l(-.518,.849),l(-1.347,1.175),l(-1.388,1.288),l(-.44,.198),l(-.354,.043),l(-.39,.637),l(-.094,.396),l(-.012,.353),l(-.504,1.074),l(-.6,.976),l(-.8,1.104),l(-.266,.212),l(-.194,.015),l(-.079,-.423),l(-.278,-.296),l(-.367,-.084),l(-.064,.79),l(-.538,1.64),l(-.049,.734),l(-.077,.607),l(.318,2.738),l(.078,.988),l(-.577,2.543),l(-.039,.663),l(.14,.649),l(.043,.085),l(-.759,.495),l(-.404,.51),l(-.261,.791),l(-.04,.367),l(.245,1.468),l(-.106,.367),l(-.214,.283),l(-.676,.608),l(-.752,1.498),l(-1.01,1.4),l(-.201,.537),l(-.055,.311),l(.144,.945),l(-1.203,.37),l(-.544,.283),l(-.355,.368),l(-.084,.466),l(.021,.367),l(-.401,.114),l(-.864,-.041),l(-.979,.172),l(-.654,.001),l(-.764,-.055),l(-.465,-.112),l(-.922,.072),l(-.736,.002),l(-.214,.607),l(-.295,.198),l(-.795,.312),l(-.481,.453),l(-.21,.354),l(-.747,-.267),l(-.35,.071),l(-.563,.255),l(-1.864,1.232),l(-.528,.396),l(-.725,.383),l(-.616,.438),l(-.532,.679),l(-.486,.241),l(-.567,.072),l(-.278,-.014),l(.006,.24),l(.336,.225),l(.12,.536),l(-.111,.537),l(-.099,.282),l(-.282,.156),l(-.084,.155),l(.384,.648),l(.036,1.186),l(.05,1.045),l(-.057,.311),l(-.11,.594),l(-.198,.621),l(-.464,.735),l(-.566,.495),l(-.788,.524),l(-.866,1.046),l(-.208,.396),l(-.476,1.145),l(-.499,.933),l(-.75,1.004),l(-.69,.623),l(-.801,.78),l(.321,-.808),l(.436,-.594),l(.629,-.566),l(.605,-1.158),l(-.06,-.254),l(-.356,.142),l(-.397,-.014),l(-.633,-.21),l(-.075,.155),l(.002,.297),l(-.401,1.215),l(-.349,.48),l(-.661,.438),l(-.317,.283),l(-.225,.424),l(-.013,.354),l(-.448,1.709),l(-.481,.763),l(-.787,.934),l(-1.076,.979),l(-.101,-.313),l(-.258,-.746),l(.103,-.269),l(.634,-.766),l(.017,-.269),l(-.333,-.379),l(-.163,-.027),l(-.131,-.197),l(-.853,-1.109),l(-.474,-.435),l(-.999,-.587),l(-.55,-.194),l(-.617,-.194),l(-.432,-.576),l(-.365,-.393),l(-.693,.427),l(-.27,.016),l(-.232,-.38),l(-.59,-.814),l(-.379,-.407),l(-.47,-.364),l(-.266,-.098),l(-.25,.101),l(-1.042,.246),l(-.55,.003),l(.214,-.27),l(.833,-.88),l(1.805,-1.816),l(1.435,-1.363),l(1.633,-1.448),l(.348,-.242),l(1.754,-.744),l(.521,-.313),l(.161,-.467),l(.094,-1.638),l(-.517,-1.154),l(-.206,-.196),l(-.462,.017),l(-.957,.161),M(288.966,203.943),l(-.558,-.125),l(-.301,-.536),l(-.078,-.382),l(.16,-.197),l(-.094,-.636),l(.048,-.381),l(.208,-1.018),l(.176,-.099),l(.479,-.058),l(.879,.097),l(1.007,.11),l(.479,-.199),l(.368,.028),l(.479,.168),l(.479,.083),l(.319,.155),l(-.335,.538),l(-.193,.946),l(-.257,.494),l(-.289,.312),l(-.561,.326),l(-.464,.171),l(-.527,.015),l(-.783,.016),l(-.641,.171), +N(732.92,214.323),l(-.164,-.24),l(-.225,-.197),l(-.379,-.126),l(-.416,.198),l(-.399,-.38),l(-.287,-.184),l(-.659,-.238),l(-.243,-.239),l(.156,-.255),l(.29,.027),l(.731,-.058),l(.538,.126),l(.743,.083),l(.523,-.058),l(.258,-.185),l(.232,-.509),l(.056,.099),l(.351,.395),l(.286,.184),l(.241,.014),l(.961,-.2),l(.366,-.227),l(.361,-.722),l(.241,-.212),l(.653,-.029),l(.263,-.128),l(.04,-.282),l(-.064,-.565),l(-.043,-.536),l(.495,.196),l(.404,.056),l(.324,-.354),l(.318,.578),l(.077,.353),l(-.196,.495),l(-.099,.184),l(-.509,.044),l(-.159,.226),l(.061,.17),l(.437,.479),l(-.308,.354),l(-.264,.113),l(-.742,-.083),l(-.416,.001),l(-.091,.269),l(-.408,.495),l(-.275,.156),l(-.973,.426),l(-.484,.143),l(-.798,.029),l(-.807,.115),M(713.795,220.696),l(.031,-3.438),l(-.046,-.805),l(-.431,-1.368),l(.44,-.822),l(-.169,-7.966),l(2.581,.802),l(.85,.337),l(1.04,.295),l(1.254,.378),l(.848,.507),l(.613,.323),l(.597,.084),l(.38,-.058),l(.26,.508),l(.274,.254),l(.635,.352),l(.687,.395),l(.779,.718),l(-.3,.947),l(.033,.226),l(.305,.226),l(.665,.111),l(1.887,.787),l(.354,.027),l(.72,.183),l(.181,.254),l(.413,.535),l(.211,.579),l(-.166,.113),l(-1.114,.073),l(-.563,.156),l(-.098,.155),l(.047,.339),l(.589,.987),l(.5,.521),l(1.464,1),l(.218,.847),l(.725,1.044),l(.288,.141),l(.304,-.015),l(.712,-.086),l(.338,.013),l(.087,.198),l(-.354,.551),l(.218,.212),l(.401,.141),l(.423,.041),l(.63,.168),l(.096,.127),l(-.031,.142),l(-.648,.213),l(.287,.24),l(1.064,.28),l(.538,.295),l(.235,.763),l(-.064,.226),l(-1.094,-.012),l(-.215,-.154),l(-.146,-.466),l(-.126,-.099),l(-1.011,-.111),l(-1.063,-.266),l(-.644,-.126),l(-.752,.016),l(-.774,-.026),l(-.573,-.211),l(-.494,-.352),l(-.223,-.522),l(-.24,-.268),l(-.726,-.31),l(-.472,-.338),l(-.135,-.197),l(-1.089,-1.608),l(-.613,-.817),l(-.454,-.056),l(-1.524,-.336),l(-.671,-.31),l(-.55,-.055),l(-.415,.185),l(-.394,.071),l(-.78,-.45),l(.282,.762),l(-.027,.212),l(-.249,.071),l(-.382,-.126),l(-.311,.1),l(.296,.395),l(-.116,.113),l(-1.037,.045),l(-1.125,-.182),l(-.478,.029),l(.237,.127),l(.24,.154),l(.642,.169),l(.662,.352),l(.404,.338),l(.219,.395),l(-.411,.199),l(-.739,.425),l(-.458,.213),l(-.668,-.097),l(-1.801,-.039),l(-1.219,-.092), +N(726.605,297.247),l(-.479,-.229),l(-1.179,-.471),l(-.543,-.371),l(-.508,-.715),l(-.477,-.558),l(-.216,-.414),l(.264,-.044),l(.169,.1),l(.421,.171),l(.129,-.143),l(-.209,-.387),l(-.703,-.699),l(-.617,-.713),l(-.149,-.257),l(-.375,-.956),l(-.008,-.67),l(.177,-.044),l(1.004,.312),l(1.476,.354),l(1.089,.369),l(.797,-.03),l(.463,-.144),l(.382,-.115),l(.373,-.058),l(.684,.027),l(.306,-.301),l(.716,-.244),l(.475,.385),l(-.009,.1),l(.128,.8),l(-.009,.686),l(-.751,1.503),l(-.124,.758),l(-.245,.315),l(-.943,.26),l(-.553,.388),l(-.49,.689),l(-.189,.272),l(-.274,.072),M(716.883,224.344),l(.682,.394),l(.233,.509),l(.047,.649),l(.118,.678),l(.256,.197),l(.42,.013),l(.102,.24),l(-.45,.919),l(.715,.338),l(.175,.282),l(.147,.593),l(.08,1.3),l(.144,.621),l(.456,1.157),l(.293,.268),l(.422,.014),l(.328,-.312),l(.384,-.185),l(.32,.663),l(.363,.127),l(.563,.408),l(.385,.154),l(.144,.155),l(.002,.41),l(.083,.96),l(.275,.776),l(-.046,1.06),l(.279,.24),l(.93,1.325),l(.276,.706),l(.055,.777),l(-.209,.876),l(.403,.649),l(.275,.833),l(.204,.353),l(1.395,.803),l(.285,.154),l(.744,.111),l(.402,.649),l(.843,.535),l(.483,.169),l(1.141,.068),l(.117,.197),L(731,245.42),l(-.273,.565),l(.309,.424),l(.879,.479),l(.22,.564),l(.469,1.342),l(.211,.748),l(.112,.396),l(.252,.311),l(.771,.352),l(-.021,-.127),l(-.141,-.777),l(.913,.507),l(.567,.154),l(.184,.127),l(.136,.296),l(.106,1.752),l(.884,.762),l(.573,.323),l(.604,.154),l(.287,.296),l(.244,.579),l(.229,.424),l(.545,.168),l(.176,.297),l(.007,.269),l(.19,.536),l(.106,.113),l(.506,.126),l(.156,.112),l(.162,.354),l(.366,1.327),l(.026,.876),l(.013,.862),l(-.132,.41),l(-.181,.325),l(.778,1.271),l(.223,.48),l(.181,.833),l(.034,.749),l(-.293,.708),l(-.353,1.668),l(-.585,1.755),l(.137,.791),l(-.065,.806),l(-.306,.778),l(-.661,.977),l(-.203,.665),l(-.598,.821),l(-.45,.185),l(-.465,.1),l(-.423,.468),l(-.466,.68),l(-.328,1.527),l(-.477,.638),l(-.34,.495),l(.014,.65),l(-.208,.539),l(-.331,.312),l(-.601,.341),l(-.27,.326),l(-.3,1.021),l(-.169,1.049),l(-.079,.937),l(.021,.666),l(-.283,.64),l(-.322,.354),l(-.463,.3),l(-.754,.101),l(-1.158,.087),l(-.82,.03),l(-.527,.157),l(-.516,.299),l(-1.529,.94),l(-.443,.129),l(-.214,.284),l(-.346,.071),l(-.528,.059),l(-.286,-.014),l(.295,.368),l(.209,.27),l(-1.315,-.665),l(-.885,-.353),l(.003,-.469),l(-.073,-.156),l(-.56,-.467),l(-.628,-.368),l(-.421,-.014),l(-.485,.172),l(-.335,.242),l(.748,.467),l(-.97,.243),l(-.929,.428),l(-.953,.442),l(-.222,.028),l(-.604,-.226),l(-.886,-.438),l(-.67,-.226),l(-1.086,-.311),l(-.51,-.041),l(-.239,.156),l(-.044,.113),l(-.716,-.169),l(-.751,-.353),l(-.522,-.298),l(-.896,-.82),l(-.526,-.34),l(-.422,-.879),l(.09,-1.035),l(-.082,-.411),l(-.184,-.495),l(-.664,-.736),l(-.141,-.523),l(-.029,-.425),l(-.534,-.014),l(-.786,.398),l(-.597,.114),l(-.34,.058),l(-.178,-.07),l(-.167,-.17),l(.517,-.454),l(.233,-.567),l(.073,-.821),l(-.253,-.324),l(-.536,-.593),l(-.247,-.353),l(-.485,.735),l(-.443,1.431),l(-.19,.113),l(-.796,.002),l(-.199,.156),l(-.196,.015),l(-.255,.028),l(.198,-.396),l(.081,-.396),l(.079,-.1),l(.634,.041),l(.242,-.142),l(.126,-.255),l(-.105,-1.004),l(.454,-.835),l(.328,-.453),l(.091,-.396),l(.018,-.409),l(.151,-.128),l(.245,-.015),l(.218,-.354),l(-.052,-.227),l(-.323,-.494),l(-.338,-.494),l(-.107,.707),l(-.288,.255),l(-.518,.299),l(-.311,.467),l(-.086,.155),l(-.189,.467),l(-.281,.326),l(-.747,.242),l(-.735,.481),l(-.653,.567),l(-.36,.693),l(-.514,.808),l(-.41,-.339),l(-.38,-1.328),l(-.263,-.579),l(-.19,-.325),l(-.688,-.79),l(-.297,-.734),l(-.176,-.212),l(-.704,.072),l(-.235,-.099),l(-.139,-.24),l(-.085,-.269),l(.334,-.34),l(-.047,-.297),l(-.346,-.395),l(-.543,-.494),l(-.266,-.098),l(-.83,.157),l(-.486,-.07),l(-.95,-.549),l(-.274,-.014),l(-.438,.17),l(-.433,-.027),l(-.421,-.183),l(-.662,-.521),l(-.921,-.437),l(-.218,.001),l(-.723,.213),l(-1.282,.088),l(-.669,.001),l(-1.764,.061),l(-.611,.129),l(-.656,.213),l(-.989,.44),l(-.972,.256),l(-1.039,.257),l(-1.503,.088),l(-.794,-.013),l(-.383,.044),l(-.927,.284),l(-.993,.469),l(-.773,.397),l(-.538,.143),l(-.431,.085),l(-.361,.199),l(-.615,.693),l(-.774,1.02),l(-.588,.284),l(-.766,-.013),l(-.547,-.013),l(-.927,.143),l(-.4,.185),l(-.663,-.395),l(-.294,-.084),l(-.734,.016),l(-1.572,.173),l(-.938,.157),l(-.459,-.041),l(-.672,.044),l(-.398,.227),l(-.583,.793),l(-.344,.128),l(-.958,-.125),l(-.158,.057),l(-.57,.708),l(-.465,.368),l(-.919,.271),l(-.586,.086),l(-1.516,-.082),l(-.638,-.055),l(-.688,-.197),l(-.633,-.366),l(-.778,-.677),l(-.74,-.353),l(-.374,-.041),l(-.151,-.07),l(-.19,-1.229),l(.055,-.255),l(.489,.112),l(.45,-.086),l(.332,-.425),l(.197,-.467),l(.267,-1.357),l(-.043,-1.215),l(-.156,-.622),l(-.258,-.593),l(-1.117,-1.906),l(-.208,-.635),l(-.144,-.834),l(.027,-.989),l(-.16,-.692),l(-.467,-1.072),l(-.663,-.945),l(-.603,-.734),l(-.214,-.254),l(.128,-.904),l(-.215,-.536),l(-.733,-1.115),l(-.972,-1.018),l(-.273,-.583),l(.126,-.233),l(.188,.187),l(.152,.443),l(.183,.163),l(.235,.35),l(.327,.188),l(.354,.023),l(-.348,-1.144),l(-.437,-.396),l(-.226,-.326),l(.08,-.304),l(.748,.84),l(.495,.979),l(.477,.065),l(-.099,-.555),l(.289,-.039),l(.004,-.564),l(-.282,-.48),l(-1.03,-1.368),l(-.354,-.691),l(-.119,-.579),l(-.038,-.734),l(.355,-.595),l(.323,-.523),l(.21,-.664),l(-.083,-1.031),l(-.254,-.635),l(.033,-.368),l(.438,-.692),l(.109,-.325),l(.064,-.156),l(.271,.649),l(.011,.424),l(.105,.184),l(.35,.027),l(.171,-.113),l(.187,-.565),l(.141,-.48),l(.765,-.468),l(1.22,-.624),l(.484,-.326),l(.676,-.581),l(.585,-.467),l(.632,-.327),l(.79,-.114),l(.697,-.016),l(.7,-.002),l(.431,-.043),l(.352,-.185),l(.474,-.453),l(.494,-.128),l(.929,-.072),l(.279,-.143),l(.291,-.551),l(.158,-.1),l(.444,.027),l(.877,.224),l(.626,-.043),l(.911,-.299),l(1.084,-.469),l(.359,-.213),l(.716,-.665),l(.427,-.58),l(.29,-.622),l(.132,-.297),l(.41,-.369),l(.968,-.651),l(.079,-.17),l(-.067,-.409),l(-.242,-.805),l(-.016,-.495),l(1.063,-1.118),l(.387,-.692),l(.291,.169),l(.341,.437),l(.619,1.355),l(.262,.253),l(.177,-.579),l(.021,-.466),l(.436,.238),l(.272,.07),l(.189,-.607),l(-.06,-.142),l(-.563,-.238),l(-.175,-.24),l(.007,-.565),l(.044,-.112),l(.897,.04),l(.661,.253),l(.642,-.029),l(.334,-.029),l(.289,.074),l(-.699,-.455),l(-.431,-.141),l(.128,-.537),l(-.07,-.296),l(.135,-.509),l(.422,-.354),l(.165,-.07),l(.732,.394),l(.202,-.043),l(-.112,-.452),l(.11,-.48),l(.146,-.367),l(-.041,-.522),l(.358,-.171),l(.4,-.113),l(.813,.04),l(.529,-1.088),l(.371,-.298),l(.35,.169),l(.268,.451),l(.265,-.552),l(.222,-.227),l(.197,-.48),l(.695,.62),l(.513,.084),l(.293,.211),l(.331,.536),l(.632,.592),l(.122,.706),l(-.072,.594),l(.181,.197),l(.256,-.283),l(.462,-.679),l(.155,-.128),l(1.16,.082),l(.479,.155),l(.637,.492),l(.332,.141),l(.156,-.48),l(.302,-.297),l(.022,-.24),l(-.266,-.324),l(-.601,-.395),l(-.079,-.184),l(.008,-.24),l(.145,-.099),l(.604,-.538),l(.007,-.452),l(.191,-.213),l(.518,-.283),l(.268,-.241),l(.151,-.269),l(-.094,-.184),l(.003,-.296),l(.512,-.863),l(.121,-.057),l(.317,-.029),l(.397,-.029),l(.248,-.17),l(-.205,-.409),l(.377,-.396),l(.344,-.071),l(.793,.366),l(.616,-.072),l(1.291,-.088),l(.512,-.128),l(.232,-.17),l(.04,-.057),l(-.077,-.197),l(-.2,-.734),l(-.248,-.282),l(-.471,-.268),l(-.374,.086),l(-.244,-.141),l(.035,-.212),l(.367,-.143),l(.396,-.043),l(.617,.521),l(.255,.099),l(.34,-.1),l(.364,.31),l(.676,.465),l(.36,.154),l(1.297,.294),l(.591,.084),l(.413,-.143),l(.372,.014),l(.396,.606),l(.419,.112),l(.141,-.029),l(.562,-.438),l(.454,.027),l(.652,.38),l(.331,.479),l(.46,-.143),l(.122,-.791),l(.181,-.085),l(.455,.465),l(.337,.099),l(.152,.154),l(-.436,.411),l(-.126,.424),l(-.176,.212),l(-.011,.438),l(-.12,.255),l(-.513,.015),l(-.51,.228),l(-.396,.34),l(-.004,.551),l(.301,.353),l(-.187,.692),l(-.381,.58),l(-.559,.481),l(-.155,.48),l(.063,.17),l(.469,.437),l(1.038,.619),l(.81,.677),l(.508,.606),l(.246,.099),l(.349,-.114),l(.264,.027),l(.782,.352),l(.742,.465),l(.434,.451),l(.679,.535),l(.335,.127),l(.442,.027),l(.784,.182),l(.25,.184),l(.218,.621),l(.167,.169),l(.507,.31),l(.76,.423),l(.537,.154),l(.422,-.072),l(.414,-.17),l(.603,-.199),l(.208,-.156),l(.736,-1.344),l(.403,-1.131),l(.194,-1.314),l(.259,-.721),l(.43,-.679),l(-.131,-.424),l(-.409,-.621),l(.022,-.311),l(.236,-.637),l(.187,-.48),l(-.164,-.282),l(-.183,-.395),l(.088,-.692),l(.104,-1.004),l(.225,-.297),l(.329,-.156),l(.158,-.311),l(-.534,-.521),l(.033,-.198),l(.576,-.947),l(.312,-.934),l(.072,-.833),l(.191,-.241),l(.279,-.297), +N(270.934,276.123),l(.054,-.338),l(-.194,-.577),l(.011,-.522),l(.24,-.495),l(.48,-.524),l(.118,-.325),l(-.168,-.986),l(-.049,-.847),l(.103,-.522),l(.595,-2.359),l(.065,-.452),l(.443,-.524),l(.55,-.003),l(1.042,-.246),l(.25,-.101),l(.266,.098),l(.47,.364),l(.379,.407),l(.59,.814),l(.232,.38),l(.27,-.016),l(.693,-.427),l(.365,.393),l(.432,.576),l(.617,.194),l(.55,.194),l(.999,.587),l(.474,.435),l(.853,1.109),l(.131,.197),l(.163,.027),l(.333,.379),l(-.017,.269),l(-.634,.766),l(-.103,.269),l(.258,.746),l(.101,.313),l(-.059,.053),l(-.803,1.103),l(-.625,.552),l(-.775,.454),l(-.441,.156),l(-.818,.1),l(-.874,-.337),l(-.551,.044),l(-.551,.114),l(-.64,.283),l(-.38,-.042),l(-.846,-.676),l(-.637,-.252),l(-.76,-.154),l(-.469,.128),l(-.507,.072),l(-.327,-.127),l(-.548,-.563),l(-.354,-.159), +N(418.763,73.869),l(.391,-.499),l(.389,-.262),l(.283,.081),l(.663,-.062),l(.762,-.075),l(.324,-.137),l(.891,-.787),l(.979,-.2),l(.224,.025),l(.198,-.219),l(.175,.032),l(-.349,.531),l(.11,.106),l(.026,.481),l(-.288,.156),l(-.17,.368),l(-1.675,.069),l(-.376,-.106),l(-.428,.031),l(-.14,-.062),l(-.239,.081),l(-.275,.031),l(-.153,.417),l(-.249,.218),l(-.353,.118),l(-.08,.112),l(-.229,-.155),l(-.411,-.292),M(421.68,78.002),l(-1.839,.129),l(-.116,-.016),l(.064,-.404),l(-.19,-.638),l(-.174,.015),l(-.36,-.293),l(-.233,.184),l(-.398,-.172),l(.2,-.355),l(.434,-.293),l(-.007,-.181),l(-.445,-.541),l(.018,-.256),l(.131,-.498),l(.279,-.106),l(.318,.15),l(.495,.12),l(.43,-.574),l(.299,-.091),l(.296,.437),l(.391,-.046),l(.022,-.528),l(.107,-.363),l(1.032,-.017),l(.848,.089),l(.03,.544),l(.187,.301),l(1.138,.058),l(.14,.166),l(-.307,.604),l(-.565,.142),l(-.119,-.261),l(-.331,.031),l(-.263,.136),l(.121,.278),l(-.184,.414),l(-.312,.077),l(-.069,.244),l(-.635,.035),l(.157,.229),l(-.291,.094),l(-.191,.24),l(-.061,.285),l(.003,.21),l(-.215,.338),l(.166,.084),M(427.177,77.967),l(-.139,-.149),l(-.312,-.344),l(-.405,.031),l(-.665,-.059),l(-.123,-.329),l(-.285,-.66),l(.433,-.091),l(.603,-.467),l(.356,.495),l(.521,.179),l(.2,-.271),l(.078,-.586),l(.333,-.046),l(.459,.044),l(.056,.571),l(-.134,.36),l(-.144,.09),l(-.413,.286),l(.603,.299),l(-.285,.166),l(-.499,.39),l(-.238,.09), +N(417.259,94.301),l(-.135,-.233),l(.216,-.701),l(-.091,-.076),l(.075,-.295),l(.321,-.372),l(.054,-.358),l(.054,-.213),l(.954,-.806),l(-.605,-.193),l(-.479,.014),l(-.456,-.09),l(-.095,-.186),l(-.233,-.007),l(-.072,.048),l(-.689,.062),l(-.045,-.145),l(-.395,.055),l(-.337,-.277),l(-.428,-.319),l(-.074,-.353),l(.248,-.144),l(.044,-.288),l(-.466,-.096),l(-.41,-.312),l(-.062,-.301),l(.422,-.376),l(-.038,-.468),l(-.282,-.365),l(-.344,-.177),l(.165,-.278),l(-.143,-.217),l(-.182,-.037),l(.08,-.097),l(.235,-.133),l(.236,-.133),l(-.193,-.121),l(.201,-.275),l(.095,-.148),l(-.152,-.292),l(-.082,-.265),l(-.376,-.182),l(.07,-.182),l(.341,-.078),l(.175,-.092),l(.378,.134),l(.664,-.151),l(.32,-.152),l(.128,-.376),l(.412,-.207),l(.003,-.328),l(-.16,-.17),l(-.188,.061),l(-.44,-.134),l(.029,-.184),l(.113,-.181),l(.571,.036),l(.084,-.401),l(.345,-.361),l(-.151,-.438),l(.066,-.147),l(-.465,-.192),l(.126,-.43),l(.285,-.181),l(.371,-.028),l(1.12,-.062),l(.293,-.012),l(.095,.16),l(.195,.271),l(-.155,.158),l(.324,.113),l(.148,-.068),l(.042,-.192),l(-.159,-.204),l(.259,.012),l(.437,.169),l(-.163,-.362),l(.247,-.419),l(.687,.113),l(.614,-.091),l(-.596,-.17),l(-.084,-.227),l(.282,-.102),l(-.252,-.114),l(-.12,-.147),l(.166,-.08),l(.068,-.136),l(-.675,.08),l(-.06,-.182),l(.664,-.125),l(.218,-.193),l(-.464,-.42),l(-.324,-.341),l(.045,-.28),l(.116,.016),l(1.839,-.129),l(.254,.13),l(.565,.341),l(.271,.297),l(-.02,.228),l(-.252,.175),l(.445,-.05),l(.171,.216),l(.157,-.078),l(.283,.021),l(.235,.156),l(.45,.073),l(.866,-.121),l(.077,.208),l(-.07,.149),l(-.057,.125),l(-.665,.295),l(.316,.193),l(.649,-.136),l(.113,.182),l(.457,-.006),l(.349,-.391),l(1.059,-.136),l(.602,-.234),l(.757,-.266),l(.249,.113),l(.396,-.17),l(.184,.182),l(.085,.159),l(.634,.29),l(.182,.074),l(.526,-.12),l(.156,.12),l(.059,.34),l(.036,.227),l(.154,.102),l(.354,.125),l(.372,-.022),l(.028,.13),l(.201,.025),l(.319,.835),l(-.219,.52),l(-.391,.147),l(-.051,.328),l(.391,.102),l(.683,.429),l(-.217,.395),l(.094,.18),l(.312,.146),l(-.021,.304),l(.131,.102),l(-.118,.292),l(-.214,.124),l(-.007,.191),l(.325,.27),l(-.114,.258),l(.468,.188),l(.281,.485),l(-.435,.698),l(-.142,.115),l(-.344,-.072),l(-.031,-.278),l(-.308,-.121),l(-.436,.072),l(.282,.218),l(-.254,.084),l(-.284,.097),l(-.524,.048),l(-.124,.169),l(-.735,.024),l(-.112,.217),l(-.176,-.072),l(-.358,.061),l(-.097,.229),l(-.382,.012),l(-.078,.181),l(-.442,0),l(-.422,.201),l(-.293,-.033),l(-.26,.181),l(-.243,.168),l(.037,.056),l(.258,.378),l(.413,.098),l(-.155,.25),l(-.08,.406),l(.159,.085),l(.036,.233),l(.244,.173),l(.478,.265),l(.188,-.072),l(.573,.515),l(.431,.17),l(.184,.201),l(.219,-.084),l(.165,.18),l(.207,.036),l(.447,.633),l(-.682,.26),l(-.437,-.151),l(-.132,.027),l(-.039,.337),l(-.162,.172),l(-.968,.295),l(-.364,.227),l(.538,.571),l(-.197,.295),l(.334,.014),l(.056,.158),l(-.098,.343),l(-.082,.055),l(-.441,-.178),l(.049,-.165),l(-.146,-.117),l(-.564,.062),l(-.195,-.138),l(-.433,.035),l(-.092,.178),l(-1.25,.035),l(-.125,.171),l(-.319,.014),l(-.044,.13),L(425.4,94.7),l(-.594,.021),l(-.059,-.144),l(-.093,-.145),l(-.493,-.089),l(-.262,.055),l(-.237,-.041),l(.032,.274),l(-.452,.343),l(-.215,0),l(.078,-.195),l(-.26,-.039),l(.011,-.165),l(-.194,-.048),l(-.104,-.137),l(-.249,-.007),l(-.096,-.11),l(-.164,.137),l(-.368,-.014),l(-.664,-.261),l(-.852,-.007),l(-.149,-.089),l(-.199,.014),l(-.017,-.151),l(-.709,.199),l(.179,.199),l(-.354,.021),l(-.278,-.11),l(-.567,.158),l(-.271,-.096),l(-.272,.117),l(-.271,-.089),M(432.012,80.473),l(-.171,-.038),l(-.088,-.049),l(-.447,.08),l(-.111,-.264),l(.002,-.213),l(.647,.281),l(.168,.203), +N(450.734,91.05),l(-.831,-.33),l(-.424,-.101),l(-.104,-.216),l(-.703,-.186),l(-.129,-.13),l(-.561,.076),l(-.508,-.041),l(-.073,.137),l(-.373,.18),l(-.46,-.254),l(-.483,.046),l(-.168,-.056),l(-.558,.204),l(-.104,.177),l(-.149,.135),l(-.18,-.12),l(-.389,.083),l(-.003,-.204),l(.026,-.083),l(-.066,-.18),l(-.331,.025),l(-.073,-.169),l(-.194,-.24),l(-.261,.024),l(-.062,.112),l(-.193,-.016),l(-.183,.24),l(-.43,.048),l(-.03,-.228),l(-.285,-.041),l(-.105,-.331),l(-.382,-.096),l(-.188,-.208),l(.02,-.249),l(-.802,-.132),l(-.311,-.181),l(-.368,.161),l(-.293,-.013),l(-.013,-.221),l(.001,-.253),l(-.329,.084),l(.181,-.283),l(-.709,.005),l(-.258,-.121),l(-.509,-.193),l(-.286,-.024),l(-.003,.145),l(.282,.302),l(-.41,.12),l(-.22,.187),l(-.318,-.072),l(-.296,-.38),l(-.55,-.247),l(.224,-.211),l(.208,-.024),l(.099,-.121),l(-.199,-.181),l(-.257,-.024),l(-.061,.066),l(-.466,.066),l(.005,-.169),l(-.278,.037),l(-.132,-.181),l(-.568,-.054),l(-.201,-.025),l(-.363,-.163),l(-.093,-.26),l(-.211,-.091),l(-.361,.018),l(-.063,.084),l(.062,.073),l(-.024,.151),l(-.375,0),l(.435,-.698),l(-.281,-.485),l(-.468,-.188),l(.114,-.258),l(-.325,-.27),l(.007,-.191),l(.214,-.124),l(.118,-.292),l(-.131,-.102),l(.021,-.304),l(-.312,-.146),l(-.094,-.18),l(.217,-.395),l(-.683,-.429),l(-.391,-.102),l(.051,-.328),l(.391,-.147),l(.219,-.52),l(-.319,-.835),l(.34,.043),l(.23,.125),l(-.093,-.193),l(.156,-.153),l(-.019,-.147),l(-.166,-.13),l(-.021,-.129),l(-.012,-.075),l(.93,-.154),l(.431,-.051),l(.516,-.152),l(1.304,-.128),l(.48,-.158),l(.797,-.479),l(1.117,-.298),l(1.515,-.303),l(1.382,-.086),l(1.067,.417),l(-.882,-.294),l(-.054,.147),l(.256,.172),l(.132,.466),l(.355,.135),l(.648,.061),l(.645,-.11),l(1.063,-.409),l(.054,.004),l(-.978,.417),l(-.19,.11),l(-.004,.123),l(.218,.012),l(.286,-.123),l(.613,-.208),l(.543,-.253),l(.842,.006),l(2.246,.115),l(2.96,-.101),l(.641,-.021),l(.04,.014),l(.679,.243),l(.284,.487),l(.099,.186),l(.016,.029),l(.09,.171),l(.16,.302),l(.615,1.5),l(.172,.502),l(-.023,.236),l(-.263,.208),l(-.44,.03),l(-.571,.244),l(-.291,.328),l(-.128,.292),l(.289,.012),l(.421,.146),l(.149,.176),l(.218,.146),l(.013,.25),l(-.315,.752),l(.126,.137),l(.161,.175),l(-.074,.242),l(.816,.835),l(.316,.193),l(-.298,.048),l(-.085,.133),l(.328,.302),l(-.009,.314),l(-.255,.24),l(-.429,.013),l(-.286,.181),l(-.599,.398),l(-1.509,1.218),l(-.082,.306),l(.044,.552),l(.349,.383),l(-.653,-.018),M(431.844,80.27),l(.232,.024),l(.069,.208),l(-.134,-.029),l(-.168,-.203),M(432.739,80.361),l(-.03,.129),l(-.278,-.024),l(-.191,.03),l(-.046,-.208),l(.174,-.012),l(.266,0),l(.106,.085), +N(416.488,81.945),l(.151,.438),l(-.345,.361),l(-.084,.401),l(-.571,-.036),l(-.113,.181),l(-.029,.184),l(.44,.134),l(.188,-.061),l(.16,.17),l(-.003,.328),l(-.412,.207),l(-.128,.376),l(-.32,.152),l(-.664,.151),l(-.378,-.134),l(-.175,.092),l(-.341,.078),l(-.07,.182),l(.376,.182),l(.082,.265),l(.152,.292),l(-.095,.148),l(-.201,.275),l(.193,.121),l(-.236,.133),l(-.235,.133),l(-.08,.097),l(.182,.037),l(.143,.217),l(-.165,.278),l(-.672,.024),l(-.001,-.338),l(.172,-.097),l(.11,-.423),l(-.754,-.375),l(-.535,.109),l(-.292,-.375),l(-.228,-.061),l(-.173,.121),l(-.313,-.242),l(-.267,.182),l(-.307,0),l(-.307,-.012),l(.025,.157),l(-.52,.034),l(-.407,-.042),l(-.477,-.098),l(-.07,-.162),l(-.496,-.264),l(.795,-.472),l(.858,-.621),l(.273,-.354),l(.563,-1.167),l(.173,-.104),l(.644,-.12),l(.367,.251),l(.136,.268),l(-.28,.203),l(-.228,-.056),l(.066,.496),l(-.191,.124),l(1.163,.225),l(.225,-.236),l(.406,-.113),l(.134,-.417),l(-.458,-.022),l(-.123,-.124),l(-.02,-.203),l(.236,-.158),l(-.171,-.023),l(-.558,-.067),l(.072,-.328),l(-.034,-.13),l(-.023,-.034),l(.128,-.283),l(.572,-.198),l(.709,-.238),l(.654,.03),l(1.089,-.151),l(.245,.275),l(.329,.045),l(.076,.181),l(.259,0), +N(431.57,91.965),l(-.447,-.633),l(-.207,-.036),l(-.165,-.18),l(-.219,.084),L(430.349,91),l(-.431,-.17),l(-.573,-.515),l(-.188,.072),l(-.478,-.265),l(-.244,-.173),l(-.036,-.233),l(-.159,-.085),l(.08,-.406),l(.155,-.25),l(-.413,-.098),l(-.258,-.378),l(-.037,-.056),l(.243,-.168),l(.26,-.181),l(.293,.033),l(.422,-.201),l(.442,0),l(.078,-.181),l(.382,-.012),l(.097,-.229),l(.358,-.061),l(.176,.072),l(.112,-.217),l(.735,-.024),l(.124,-.169),l(.524,-.048),l(.284,-.097),l(.254,-.084),l(-.282,-.218),l(.436,-.072),l(.308,.121),l(.031,.278),l(.344,.072),l(.142,-.115),l(.375,0),l(.024,-.151),l(-.062,-.073),l(.063,-.084),l(.361,-.018),l(.211,.091),l(.093,.26),l(.363,.163),l(.201,.025),l(.568,.054),l(.132,.181),l(.278,-.037),l(-.005,.169),l(.466,-.066),l(.061,-.066),l(.257,.024),l(.199,.181),l(-.099,.121),l(-.208,.024),l(-.224,.211),l(.55,.247),l(.296,.38),l(.318,.072),l(.22,-.187),l(.41,-.12),l(-.282,-.302),l(.003,-.145),l(.286,.024),l(.509,.193),l(.258,.121),l(.709,-.005),l(-.181,.283),l(.329,-.084),l(-.001,.253),l(.013,.221),l(.293,.013),l(.368,-.161),l(.311,.181),l(.802,.132),l(-.02,.249),l(.188,.208),l(.382,.096),l(.105,.331),l(-.071,-.012),l(-.065,.066),l(-.066,.04),l(-.105,-.026),L(442,89.998),l(-.119,.013),l(-.065,.04),l(-.132,.066),l(-.053,.079),l(-.118,.092),l(-.119,.053),l(-.132,.079),l(-.105,.013),l(-.118,.013),l(-.053,.092),l(-.026,.092),l(-.026,.132),l(-.053,.079),l(-.053,.105),l(-.145,.066),l(-.105,.04),l(-.092,-.026),l(-.079,.079),l(-.04,.092),l(-.053,.079),l(-.039,0),l(-.105,.026),l(-.066,.026),l(-.079,.053),l(-.118,.053),l(-.132,0),l(-.145,.04),l(-.093,.026),l(-.065,-.026),l(-.065,-.026),l(-.093,0),l(-.065,.026),l(-.158,0),l(-.132,-.053),l(-.092,-.053),l(-.093,.026),l(-.171,.053),l(-.026,.04),l(-.146,.119),l(-.092,.066),l(-.014,.131),l(-.065,.105),l(-.039,.044),l(-.055,-.095),l(-.545,-.2),l(-1.332,.181),l(-1.019,-.227),l(-1.374,-.341),l(-.746,.773),l(-.598,.163),l(-.483,-.099),l(-.354,-.129),l(-.145,-.014), +N(421.683,94.397),l(.368,.014),l(.164,-.137),l(.096,.11),l(.249,.007),l(.104,.137),l(.194,.048),l(-.011,.165),l(.26,.039),l(-.078,.195),l(.215,0),l(.452,-.343),l(-.032,-.274),l(.237,.041),l(.262,-.055),l(.493,.089),l(.093,.145),l(.059,.144),L(425.4,94.7),l(.377,-.103),l(.044,-.13),l(.319,-.014),l(.125,-.171),l(1.25,-.035),l(.092,-.178),l(.433,-.035),l(.195,.138),l(.564,-.062),l(.146,.117),l(-.049,.165),l(.441,.178),l(.082,-.055),l(.098,-.343),l(-.056,-.158),l(-.334,-.014),l(.197,-.295),l(-.538,-.571),l(.364,-.227),l(.968,-.295),l(.162,-.172),l(.039,-.337),l(.132,-.027),l(.437,.151),l(.682,-.26),l(.145,.014),l(.354,.129),l(.483,.099),l(.598,-.163),l(.746,-.773),l(1.374,.341),l(1.019,.227),l(1.332,-.181),l(.545,.2),l(.055,.095),l(.053,.093),l(-.097,.581),l(.155,.26),l(.761,.547),l(-.636,.291),l(-.019,.367),l(-.701,.054),l(-.164,-.134),l(-.325,0),l(-.223,.197),l(.452,.063),l(.136,.196),l(-.157,.206),l(-.409,.062),l(-.04,.375),l(.204,.188),l(-.154,.294),l(-.346,.299),l(-.693,.157),l(.082,.393),l(-.89,-.116),l(-.298,.196),l(-.85,-.08),l(-.566,.107),l(-.646,.5),l(-.287,-.152),l(-.612,.009),l(-.179,-.107),l(-1.04,-.065),l(-.478,-.112),l(-.894,-.082),l(-1.311,-.247),l(-.32,-.391),l(-.318,-.096),l(-.023,-.363),l(-.856,.227),l(-.301,-.103),l(-.445,.11),l(-.183,-.083),l(-.366,.096),l(-.329,.411),l(-.597,-.034),l(-.631,-.171),l(.029,-.171),l(-.215,-.117),l(-.579,.332),l(-.55,-.242),l(-.008,-.144),l(-.622,-.062),l(.09,-.192),l(-.214,-.288),l(.266,-.274),l(-.193,-.336), +N(431.763,171.063),l(-.067,.354),l(.091,.72),l(.108,.508),l(.225,.168),l(.562,.11),l(.144,.183),l(.077,.353),l(-.089,1.116),l(-.146,.227),l(-.274,.171),l(-.885,.217),l(-.291,.256),l(-.664,1.275),l(-.503,1.203),l(-.243,1.004),l(-.354,.129),l(-.369,.03),l(-.129,.354),l(-.146,1.229),l(-.192,.312),l(-.385,.045),l(-.257,.284),l(-.417,.836),l(-.944,2.223),l(-.304,.624),l(-.352,.496),l(-.368,.355),l(-.239,.114),l(-.145,-.056),l(-.722,-.97),l(-.145,-.14),l(-1.104,-.05),l(-.272,.03),l(-1.31,1.265),l(-.941,.839),l(-.495,.526),l(.02,.974),l(-.189,.552),l(-.376,.686),l(-.188,-.119),l(-.224,-.042),l(-.176,-.127),l(-.145,.212),l(.144,.296),l(-.063,.127),l(-.353,.198),l(-.56,.03),l(-.977,.101),l(-.607,-.267),l(-.288,.043),l(-.271,.368),l(-.177,.113),l(-.432,-.07),l(-1.247,-.011),l(-.528,-.225),l(-.543,-.451),l(-.416,-.72),l(-.192,-.649),l(.048,-.254),l(.208,-.254),l(-.144,-.296),l(-.513,-.069),l(-.128,-.254),l(-.464,-.55),l(-.561,-.465),l(-.608,-.253),l(-.641,-.253),l(-.272,-.31),l(-.513,.072),l(-.24,.297),l(-.336,.071),l(-.881,.044),l(-.659,.03),l(-.006,-.234),l(.121,-1.188),l(-.217,-1.439),l(.09,-.989),l(.012,-.876),l(-.003,-.48),l(-.002,-.381),l(.237,-.397),l(.257,-.03),l(.433,-.13),l(.078,-.368),l(-.116,-.592),l(.095,-.34),l(.656,-.414),l(.223,-.298),l(.19,-.566),l(.316,-.962),l(-.388,-.718),l(-.164,-.762),l(.062,-.777),l(.092,-.961),l(.158,-.849),l(.353,-.482),l(.687,-1.614),l(.676,-.4),l(1.064,-.188),l(1.174,-.108),l(1.111,.121),l(.821,.277),l(1.095,1.223),l(.209,.098),l(.37,-.002),l(1.337,-.544),l(.467,-.116),l(.354,.083),l(1.173,.742),l(.965,.277),l(.934,-.005),l(.273,-.059),l(.629,-.399),l(.403,-.327),l(.774,-.287),l(.628,-.103),l(.709,-.047),l(.531,.04),l(.884,.221),l(.724,.193),l(.609,.208),l(.259,-.058),l(.761,-.697),l(.453,-.299),l(.437,-.2),l(.951,-.034),l(.173,.394),l(.575,.52),l(.351,.407), +N(425.506,195.522),l(-1.965,-.017),l(-1.005,.007),l(.029,-.176),l(-.208,-.536),l(.271,-.989),l(-.159,-.72),l(-.191,-.522),l(-.399,-.649),l(.433,-.396),l(-.287,-.367),l(-.24,-.056),l(-.576,.058),l(-.559,-.268),l(-.176,-.324),l(-.063,-.537),l(-.111,-.211),l(-.527,-.14),l(-.101,-.064),l(.376,-.686),l(.189,-.552),l(-.02,-.974),l(.495,-.526),l(.941,-.839),l(1.31,-1.265),l(.272,-.03),l(1.104,.05),l(.145,.14),l(.722,.97),l(.145,.056),l(.239,-.114),l(.368,-.355),l(.352,-.496),l(.304,-.624),l(.944,-2.223),l(.417,-.836),l(.257,-.284),l(.385,-.045),l(.192,-.312),l(.146,-1.229),l(.129,-.354),l(.369,-.03),l(.354,-.129),l(.243,-1.004),l(.503,-1.203),l(.664,-1.275),l(.291,-.256),l(.885,-.217),l(.274,-.171),l(.146,-.227),l(.089,-1.116),l(-.077,-.353),l(-.144,-.183),l(-.562,-.11),l(-.225,-.168),l(-.108,-.508),l(-.091,-.72),l(.067,-.354),l(.627,.109),l(.208,.083),l(.923,1.238),l(.395,.887),l(.119,1.2),l(-.134,.651),l(.169,1.228),l(.205,.578),l(.381,.633),l(.208,.21),l(.047,.127),l(-.225,.143),l(-.674,.032),l(-1.187,-.191),l(-.481,-.082),l(-.24,.1),l(-.29,.312),l(-.323,.539),l(1.088,1.067),l(1.343,1.179),l(.638,1.07),l(.382,1.057),l(.208,.183),l(-.208,.114),l(-.354,.327),l(-.866,1.743),l(-.4,.511),l(-.528,.399),l(-.144,.198),l(-.064,.424),l(.112,.776),l(.273,1.185),l(.207,.592),l(.4,.661),l(.432,.605),l(.064,.791),l(.112,.324),l(1.217,1.236),l(.498,.802),l(.194,.804),l(.209,.451),l(-.159,.185),l(.1,.861),l(-.271,.086),l(-.863,-.292),l(-.864,-.334),l(-.576,-.194),l(-.56,-.124),l(-.479,-.04),l(-.271,-.055),l(-.878,.076),l(-.863,-.023),l(-.56,-.109),l(-1.022,-.149),l(-.831,-.038),l(-1.773,-.088),l(-.88,-.093),l(-.045,.495), +N(551.793,147.278),l(-.788,-.111),l(-.458,-.253),l(-.379,-.367),l(-.248,-1.101),l(-.112,-.141),l(-.342,-.141),l(-.662,-.083),l(-.105,-.07),l(-.014,-.268),l(.116,-.466),l(-.178,-.451),l(-.418,-.38),l(-.294,-.013),l(-1.181,.412),l(-1.229,.087),l(-.81,.143),l(-.947,.073),l(-.415,-.083),l(-.263,-.226),l(-.135,-.197),l(-.909,.143),l(-.548,.382),l(-.856,.016),l(-1.264,-.011),l(-.691,.128),l(-.723,.115),l(-.541,.03),l(.182,-.954),l(.049,-.354),l(.31,-.792),l(.285,-.383),l(.794,-.47),l(.697,-.258),l(1,-.077),l(.209,-.072),l(.188,-.255),l(.036,-.974),l(-.186,-.281),l(-.652,-.053),l(-.185,-.394),l(-.111,-1.34),l(-.168,-.38),l(-.409,-.224),l(-1.144,-.388),l(-.695,-.391),l(-.353,-.464),l(-.71,-1.068),l(-.802,-1.083),l(.887,.32),l(.63,.194),l(1.069,.248),l(.854,.235),l(.541,.039),l(.742,.024),l(1.187,-.218),l(.349,-.002),l(1.005,.135),l(1.234,-.12),l(.964,-.175),l(1.183,-.19),l(1.066,-.274),l(.247,-.156),l(.069,-.184),l(.099,-.903),l(.232,-.876),l(.188,-.34),l(.412,-.369),l(.597,-.441),l(.283,-.072),l(.644,.039),l(.516,.082),l(.254,-.086),l(.321,-.693),l(.362,-.271),l(.559,-.243),l(.562,.025),l(1.001,.375),l(.237,-.086),l(.34,-.383),l(.021,-.084),l(.139,-1.214),l(.288,-.834),l(.224,-.424),l(.292,-.228),l(.416,-.115),l(.513,-.031),l(.315,-.115),l(.199,-.255),l(-.088,-.437),l(-.129,-.281),L(556.193,125),l(-.35,-.336),l(.355,-.129),l(.997,.122),l(.698,.039),l(.513,-.215),l(.289,-.255),l(-.033,-.31),l(-.223,-.478),l(.13,-.283),l(.4,-.341),l(.524,-.355),l(.324,-.426),l(-.198,-.477),l(.119,-.483),l(-.232,-.171),l(-.01,-.336),l(-.411,-.271),l(-.01,-.32),l(.464,-.413),l(.258,-.214),l(.246,.023),l(.559,-.395),l(.272,-.19),l(.53,-.292),l(1.148,-.152),l(1.345,-.012),l(.647,.144),l(.338,-.179),l(.332,.005),l(.455,-.297),l(.358,-.004),l(.148,-.142),l(.313,.14),l(.105,.112),l(.281,-.21),l(.296,.047),l(.554,.117),l(.004,.456),l(.282,-.128),l(.625,-.009),l(.373,.323),l(.213,.247),l(.007,.501),l(-.312,.516),l(.301,.07),l(.198,.218),l(.252,.281),l(.52,-.196),l(.239,0),l(.104,.199),l(.178,.09),l(.565,.436),l(1.337,.104),l(.305,.111),l(.147,.126),l(-.207,.084),l(-.688,.37),l(-.411,.232),l(-.155,.43),l(-.071,.479),l(-.234,.116),l(-.125,-.179),l(-.621,-.102),l(-.438,.132),l(-.271,.298),l(-.262,-.116),l(-.557,.265),l(-.928,-.149),l(-.568,-.138),l(-1.708,-.325),l(-.894,.265),l(-.38,.611),l(.09,.166),l(.336,0),l(.047,.314),l(-.202,.149),l(.101,.199),l(.598,-.017),l(-.002,.347),l(-.384,.099),l(-.139,.413),l(.389,.232),l(-.116,.479),l(-.215,.132),l(.089,.248),l(.606,.298),l(-.003,.532),l(.782,-.003),l(-.039,.43),l(.188,.248),l(.702,-.05),l(.668,.377),l(.012,.211),l(-.2,.255),l(-.504,.2),l(-.643,.196),l(-.517,.248),l(.032,.366),l(.188,.377),l(-.237,.977),l(-1.512,1.503),l(.261,.38),l(-.358,.281),l(-.609,.133),l(-.353,.467),l(-.509,1.216),l(-.478,.547),l(-1.193,.496),l(-.177,.364),l(-.277,.481),l(-.563,.61),l(-.076,.38),l(-.71,.259),l(-.734,-.011),l(-.895,.314),l(-.361,-.094),l(-.158,-.518),l(-.207,-.132),l(-.404,.083),l(-.535,.463),l(-.144,.446),l(-.979,.893),l(-.186,.543),l(-.079,.269),l(.116,.38),l(.541,.163),l(.504,.085),l(.425,.014),l(-.114,.689),l(-.154,.735),l(.412,.411),l(.33,.099),l(.537,-.099),l(.112,.441),l(.216,.507),l(.654,1.333),l(-.232,.149),l(.241,.463),l(-.317,.066),l(-.15,.248),l(-.55,.083),l(-.145,-.335),l(-.183,-.062),l(-.78,.215),l(-.2,.331),l(-.735,-.099),l(-.229,-.149),l(-.835,-.021),l(-.835,-.009),l(-.259,-.052),l(.015,.728),l(-.866,.017),l(-.296,.431),l(-.37,.036), +N(606.155,150.953),l(-.037,-.466),l(-.627,-2.479),l(-.064,-.578),l(-.4,.044),l(-.281,.115),l(-.395,1.159),l(-.224,.354),l(-.529,-.448),l(-.249,-.267),l(-.23,-.281),l(-.001,-.381),l(-.009,-.522),l(.131,-.283),l(.651,-.356),l(.498,-.13),l(.938,-.767),l(.159,-.34),l(.012,-.79),l(-.057,-.127),l(-.111,-.098),l(-2.473,-.198),l(-.559,.003),l(-.916,.062),l(-.547,-.053),l(-.537,-.109),l(-.095,-.099),l(-.079,-.719),l(-.053,-.479),l(-.129,-.324),l(-.417,-.054),l(-.489,.06),l(-.372,-.266),l(-.339,-.266),l(-1.252,-.303),l(-.234,.171),l(-.555,.525),l(-.124,.283),l(.083,.155),l(.494,.237),l(1.224,.938),l(.126,.112),l(-.047,.155),l(-.382,.101),l(-.502,.13),l(-.4,.299),l(-.548,.61),l(.339,.323),l(1.042,.431),l(.193,.21),l(-.029,.269),l(-.505,.765),l(.04,.254),l(.352,.45),l(.325,1.409),l(.402,1.775),l(.147,.532),l(-.172,.322),l(.068,.183),l(-.321,.071),l(-.35,-.056),l(-.148,-.706),l(-.198,-.084),l(-.253,.354),l(-.171,.354),l(-.172,.057),l(-.115,-.099),l(-.28,-.592),l(-.152,-.169),l(-.412,.537),l(-.504,.298),l(-.992,.397),l(-.571,.213),l(-.264,.226),l(-.05,.113),l(.106,.579),l(.183,.409),l(-.336,.495),l(-.305,.332),l(-.013,.257),l(-.548,.415),l(-.593,.467),l(-.467,.185),l(-.432,.057),l(-.746,.206),l(-.591,.362),l(-.459,.58),l(-.551,.552),l(-.88,1.061),l(-.611,.552),l(-.673,.276),l(-.675,.829),l(-.676,.467),l(-.728,.368),l(-.452,.241),l(-.427,.312),l(-.192,.509),l(-.073,.466),l(-.341,.41),l(-.649,.298),l(-.428,.058),l(-.506,-.098),l(-.258,.269),l(-.366,.887),l(-.277,.23),l(-.505,-.253),l(-.614,.142),l(-.354,.283),l(-.304,.565),l(-.165,.48),l(-.005,.508),l(.166,1.539),l(.018,.805),l(-.208,.495),l(.227,.324),l(.315,.423),l(-.015,.508),l(-.199,.607),l(-.669,1.611),l(-.341,.834),l(-.13,.636),l(.047,.649),l(.21,1.764),l(-.081,.24),l(-.643,.001),l(-.433,-.013),l(-.186,.142),l(-.334,.961),l(-.324,.594),l(.025,.127),l(.493,.352),l(-.805,.327),l(-.306,.015),l(-.77,.284),l(-.295,.41),l(-.101,.692),l(-.157,.255),l(-.367,.283),l(-.526,.255),l(-.099,.057),l(-.066,.042),l(-.231,.156),l(-.145,0),l(-.174,-.056),l(-1.417,-1.451),l(-.092,-.395),l(-.276,-.522),l(-.34,-1.397),l(-.689,-1.792),l(-.94,-1.933),l(-.979,-1.508),l(-.554,-1.722),l(-.507,-1.792),l(-.738,-1.636),l(-.82,-1.42),l(-.424,-.737),l(-.598,-1.439),l(-.363,-1.157),l(-.767,-3.274),l(-.469,-2.695),l(-.157,-1.566),l(-.051,-.24),l(.232,-.565),l(.546,-.834),l(.007,-.311),l(-.404,-.281),l(-.367,-.437),l(-.113,-.635),l(-.108,-.917),l(.065,-.622),l(-.837,.03),l(-.19,.212),l(-.235,.424),l(.009,.183),l(.276,.254),l(.074,.183),l(-.073,.438),l(-.301,.438),l(-.503,.368),l(-.812,.369),l(-.504,.114),l(-.617,.255),l(-.377,.015),l(-.861,-.281),l(-.572,-.38),l(-1.018,-1),l(-1.391,-1.268),l(-.516,-.705),l(.267,-.043),l(1.062,.125),l(.615,-.086),l(.443,-.142),l(.461,-.283),l(.521,-.608),l(-.067,-.24),l(-.156,.071),l(-.587,.114),l(-.847,-.026),l(-.607,-.112),l(-.632,-.132),l(-.5,-.218),l(-.203,-.07),l(-.929,-.661),l(-.668,-.775),l(-.057,-.197),l(.37,-.036),l(.296,-.431),l(.866,-.017),l(-.015,-.728),l(.259,.052),l(.835,.009),l(.835,.021),l(.229,.149),l(.735,.099),l(.2,-.331),l(.78,-.215),l(.183,.062),l(.145,.335),l(.55,-.083),l(.15,-.248),l(.317,-.066),l(-.241,-.463),l(.232,-.149),l(-.654,-1.333),l(-.216,-.507),l(-.112,-.441),L(557,143.058),l(-.33,-.099),l(-.412,-.411),l(.154,-.735),l(.114,-.689),l(-.425,-.014),l(-.504,-.085),l(-.541,-.163),l(-.116,-.38),l(.079,-.269),l(.186,-.543),l(.979,-.893),l(.144,-.446),l(.535,-.463),l(.404,-.083),l(.207,.132),l(.158,.518),l(.361,.094),l(.895,-.314),l(.734,.011),l(.71,-.259),l(.076,-.38),l(.563,-.61),l(.277,-.481),l(.177,-.364),l(1.193,-.496),l(.478,-.547),l(.509,-1.216),l(.353,-.467),l(.609,-.133),l(.358,-.281),l(-.261,-.38),l(1.512,-1.503),l(.237,-.977),l(-.188,-.377),l(-.032,-.366),l(.517,-.248),l(.643,-.196),l(.504,-.2),l(.2,-.255),l(-.012,-.211),l(-.668,-.377),l(-.702,.05),l(-.188,-.248),l(.039,-.43),l(-.782,.003),l(.003,-.532),l(-.606,-.298),l(-.089,-.248),l(.215,-.132),l(.116,-.479),l(-.389,-.232),l(.139,-.413),l(.384,-.099),l(.002,-.347),l(-.598,.017),l(-.101,-.199),l(.202,-.149),l(-.047,-.314),l(-.336,0),l(-.09,-.166),l(.38,-.611),l(.894,-.265),l(1.708,.325),l(.568,.138),l(.928,.149),l(.557,-.265),l(.262,.116),l(.271,-.298),l(.438,-.132),l(.621,.102),l(.125,.179),l(.234,-.116),l(.071,-.479),l(.155,-.43),l(.411,-.232),l(.688,-.37),l(.207,-.084),l(.502,-.152),l(0,.515),l(.441,1.03),l(.221,.515),l(.81,.11),l(.441,.405),l(.221,.258),l(-.331,.221),l(-.184,.184),l(.073,.589),l(.037,.552),l(.294,.221),l(.718,.096),l(.092,.078),l(.044,.182),l(.68,.099),l(-.104,.414),l(.367,.694),l(-.578,.364),l(-.376,.281),l(-.368,.049),l(-.337,-.264),l(-.033,-.364),l(-.785,.198),l(.157,.694),l(.579,.595),l(-.104,.446),l(.272,.364),l(-.215,.215),l(.099,.43),l(.198,.066),l(.477,-.314),l(.383,.248),l(.772,.843),l(.363,-.116),l(1.078,.579),l(-.116,.364),l(.756,.248),l(.154,-.066),l(.859,.596),l(-1.07,.909),l(-.281,.116),l(.008,.364),l(-.221,.265),l(.04,.396),l(-.309,.397),l(-.218,.43),l(.039,.248),l(.63,.38),l(.466,-.083),l(.665,.479),l(.704,.149),l(.305,.529),l(1.242,.678),l(.231,-.166),l(1.027,.595),l(.538,-.066),l(.182,.397),l(.835,.166),l(.304,.198),l(.15,-.066),l(.087,-.215),l(.503,0),l(.482,.265),l(.582,-.347),l(.494,.298),l(.643,.066),l(.142,.231),l(-.101,.446),l(.663,.149),l(.286,.281),l(.618,.265),l(.584,-.281),l(.313,.066),l(-.034,.331),l(.312,.248),l(.379,-.231),l(.721,.148),l(.847,.364),l(.606,-.297),l(.268,.364),l(.399,.116),l(.357,-.132),l(.271,.083),l(.687,-.132),l(.336,.05),l(.311,-.694),l(-.429,-.827),l(.07,-.876),l(.318,-.761),l(-.037,-.022),l(.345,-.129),l(.471,-.102),l(.231,.069),l(.139,.183),l(-.052,.861),l(.212,.662),l(-.092,.113),l(.235,.493),l(.637,.18),l(.559,.081),l(.869,.214),l(.085,.021),l(.544,-.074),l(.531,-.313),l(.301,.055),l(.335,.125),l(1.238,.063),l(1.036,-.062),l(.624,-.06),l(.217,-.58),l(-.017,-.282),l(-.258,-.238),l(-.313,-.069),l(-.326,-.294),l(-.042,-.24),l(.07,-.156),l(.189,-.1),l(.784,-.033),l(.714,-.216),l(.397,-.27),l(1.123,-1.107),l(.543,-.37),l(.829,-.258),l(1.105,-.726),l(.546,-.299),l(.355,-.087),l(.286,.167),l(.975,.319),l(.377,-.044),l(1.377,-.84),l(.455,.392),l(.716,.715),l(.046,.38),l(-.354,.454),l(-.138,.269),l(.102,.056),l(.3,.055),l(.657,.081),l(.73,.179),l(.624,.081),l(-.018,.508),l(-.112,.24),l(-.596,.582),l(-.072,.283),l(.184,.718),l(-.295,.058),l(-.853,-.221),l(-.558,-.082),l(-.312,.129),l(-.719,.512),l(-1.446,.883),l(-.197,.354),l(.057,.761),l(-.136,.382),l(-.938,1.134),l(-.045,.212),l(.192,.408),l(0,.324),l(-1.148,2.25),l(-.17,.128),l(-.309,-.013),l(-.391,-.11),l(-.811,-.32),l(-.133,.283),l(.146,1.594),l(-.191,.354),l(-.401,.144),l(-.228,.185),l(.152,.93),l(-.015,.678),l(-.273,.368),l(-.25,.129),l(-.255,-.14),l(-.595,-.152), +N(478.516,135.173),l(.052,-.292),l(-.049,-.169),l(-.197,-.107),l(.107,-.175),l(.292,-.919),l(-.015,-.818),l(.517,-1.09),l(.3,-.891),l(-.004,-.409),l(.133,-.283),l(.07,-.749),l(.033,-.847),l(.062,-.174),l(.026,-.278),l(-.065,-.411),l(.037,-.119),l(.102,-.063),l(1.902,1.034),l(.365,.167),l(.253,-.016),l(1.139,-.656),l(2.96,-1.541),l(.161,-.071),l(.87,1.632),l(.311,.69),l(.093,.056),l(-.46,.44),l(-.257,.171),l(-.97,.26),l(-2.586,.622),l(-.646,.229),l(1.146,1.32),l(.698,.885),l(-.765,.724),l(-.456,.37),l(-.24,.072),l(-1.249,.332),l(-.462,.61),l(-.975,.782),l(-2.079,-.299),l(-.154,-.017), +N(456.028,151.46),l(-.021,1.003),l(.033,3.078),l(-.088,.17),l(-1.561,-.019),l(-.52,-.011),l(-.073,1.13),l(-1.981,-.963),l(-5.577,-2.792),l(-4.941,-2.372),l(-5.231,-2.554),l(-.41,.059),l(-1.818,.858),l(-1.519,.729),l(-.231,.157),l(-1.192,-.911),l(-.258,-.182),l(-1.008,-.333),l(-1.646,-.442),l(-.832,-.137),l(-.098,-.07),l(-.86,-1.506),l(-.178,-.168),l(-1.028,-.347),l(-.702,-.165),l(-.544,.201),l(-.244,-.154),l(-.562,-.873),l(-.249,-.917),l(-1.272,-1.702),l(.152,-.283),l(.249,-.128),l(.666,-.47),l(.086,-.17),l(.061,-.664),l(-.457,-1.156),l(.158,-.495),l(.16,-.622),l(-.101,-.748),l(.1,-.862),l(-.052,-.691),l(-.147,-.833),l(-.88,-1.605),l(.241,-.383),l(.204,-.156),l(.22,-.143),l(.864,-.598),l(.155,-.227),l(.147,-.537),l(-.274,-.973),l(.126,-.354),l(1.473,-1.138),l(.579,-.314),l(.802,-.428),l(.093,-.269),l(-.064,-.564),l(.093,-.981),l(1.436,.59),l(.995,.309),l(.521,.013),l(.863,-.129),l(.604,.027),l(1.552,.223),l(.614,.479),l(.794,.224),l(.486,-.001),l(.342,.197),l(.173,.226),l(.26,.819),l(.39,.564),l(.688,.591),l(.378,.126),l(.678,.14),l(1.031,.083),l(.447,.07),l(.973,.224),l(.639,.224),l(.552,.281),l(1.289,.788),l(.84,.464),l(.465,.013),l(.441,-.128),l(.758,-.411),l(.706,-.623),l(.3,-.523),l(0,-.254),l(-.276,-.621),l(-.112,-.579),l(.044,-.41),l(.237,-.537),l(.661,-.58),l(.333,-.198),l(.554,-.241),l(.644,-.298),l(1.376,-.413),l(1.205,.054),l(.728,.154),l(.844,.365),l(.188,.169),l(.043,.508),l(.281,.253),l(.301,.014),l(.945,.125),l(.712,.309),l(.45,.027),l(1.286,.04),l(.302,.197),l(.068,.381),l(.276,.296),l(-.099,.208),l(-.369,.228),l(-.21,.34),l(.354,1.283),l(-.231,.425),l(-.322,.553),l(-.056,.311),l(.185,.945),l(.388,.916),l(.042,.367),l(-.015,.988),l(-.019,3.869),l(-.016,1.468),l(-.008,2.048),l(-.001,.692),l(.045,2.81),l(-.021,1.342),l(.011,2.612), +N(478.212,134.714),l(-.834,-1.746),l(-.796,-1.944),l(-.124,-.289),l(.109,-.066),l(.679,-.851),l(.219,-.438),l(.183,-.507),l(.171,-.566),l(.188,-.822),l(.116,.018),l(.137,-.093),l(.006,-.204),l(.028,-.315),l(.372,-.051),l(.151,.022),l(.07,.099),l(.355,-.07),l(.009,-.167),l(.067,-.193),l(.088,-.041),l(.07,.023),l(.183,.346),l(.201,.128),l(.021,.183),l(-.047,.122),l(.082,.085),l(-.102,.063),l(-.037,.119),l(.065,.411),l(-.026,.278),l(-.062,.174),l(-.033,.847),l(-.07,.749),l(-.133,.283),l(.004,.409),l(-.3,.891),l(-.517,1.09),l(.015,.818),l(-.292,.919),l(-.107,.175),l(-.067,.068),l(-.042,.042), +N(495.751,163.817),l(-.03,-.184),l(-.112,-.537),l(-.508,-.945),l(-.73,-.987),l(-.438,-.493),l(-.846,-.69),l(-.51,-.875),l(-.814,-1.876),l(-.474,-.889),l(-.28,-.409),l(-.794,-.507),l(-1.271,-.689),l(-.527,-.634),l(-.8,-1.17),l(-.081,-.96),l(-.061,-.776),l(-.002,-.89),l(-.104,-.381),l(-.312,-.663),l(-.944,-1.65),l(-.357,-.494),l(-.758,-.62),l(-.459,-.225),l(-.499,-.126),l(-.308,-.282),l(-.483,-.578),l(.149,-.692),l(-.111,-.437),l(-.474,-.818),l(-.747,-1.072),l(-.793,-.902),l(-1.069,-1.494),l(-.525,-.931),l(-.352,-.479),l(-.722,-.761),l(-.524,-.056),l(-.248,0),l(.077,-.296),l(.193,-.283),l(.311,-1.314),l(.104,-.583),l(.154,.017),l(2.079,.299),l(.975,-.782),l(.462,-.61),l(1.249,-.332),l(.24,-.072),l(.456,-.37),l(.765,-.724),l(-.698,-.885),l(-1.146,-1.32),l(.646,-.229),l(2.586,-.622),l(.97,-.26),l(.257,-.171),l(.46,-.44),l(.093,.056),l(1.129,.459),l(.757,.222),l(2.034,.934),l(1.14,.473),l(2.44,1.101),l(.258,.196),l(.399,.633),l(.141,.07),l(.973,-.048),l(.135,.366),l(-.118,.396),l(.047,.818),l(.118,.253),l(.812,.277),l(1.557,.697),l(4.048,.132),l(1.657,.259),l(.408,.054),l(.334,.619),l(.185,.239),l(1.07,.05),l(.644,-.044),l(.043,.121),l(.277,.648),l(.365,.494),l(.178,.663),l(.052,.113),l(.615,-.029),l(.248,.126),l(-.204,.237),l(.194,.187),l(.184,.282),l(.234,.067),l(.234,.27),l(.886,.168),l(.423,.437),l(-.07,.28),l(-.235,.035),l(-.111,.25),l(.316,.381),l(-.188,.593),l(-.122,.198),l(.165,.268),l(.302,.666),l(.149,-.117),l(.372,.282),l(.105,.616),l(.422,.696),l(-.028,.423),l(.222,.268),l(.16,.197),l(.287,.084),l(.136,-.007),l(.336,.083),l(1.043,2.198),l(.548,1.154),l(.261,.902),l(3.362,.375),l(3.387,.446),l(.839,.108),l(.584,-.469),l(.152,-.057),l(.581,.914),l(.155,1.453),l(-5.346,2.982),l(-2.35,1.213),l(-1.691,.815),l(-.169,.085),l(-1.148,.346),l(-3.097,1.035),l(-4.618,1.566),l(-.484,.229),l(-.041,.127),l(-.383,.397),l(-1.907,2.271),l(-2.042,2.667),l(-1.302,-2.703),l(-1.211,-2.45),l(-.452,-.012),l(-.715,.047),l(-.446,-.125),l(-.671,-.151),l(-.216,.1),l(-.174,.185),l(-.11,.495),l(.041,.678),l(-.113,.565),l(-.692,.563), +N(476.458,130.735),l(.124,.289),l(.796,1.944),l(.834,1.746),l(-.38,.381),l(-.479,1.145),l(-.334,1.413),l(-.171,.593),l(-.18,.156),l(-.407,-.07),l(-.448,-.521),l(-.782,-.676),l(-.386,-.494),l(-.338,-.988),l(-.521,-.45),l(-.289,-.621),l(-.17,-.479),l(-.198,-.353),l(-.466,.17),l(-.267,.523),l(.604,1.34),l(.131,.381),l(.634,.86),l(.933,1.042),l(.473,1.199),l(.526,.973),l(.277,.818),l(.391,.465),l(.912,1.735),l(1.072,1.904),l(.428,.705),l(.586,.549),l(.451,.352),l(.151,.183),l(-.241,.17),l(-.285,.1),l(-.043,.155),l(.238,1.087),l(.252,.467),l(.127,.238),l(.812,.591),l(.397,.168),l(.406,.521),l(.416,.38),l(.311,.56),l(-10.382,-.006),l(-2.138,-.001),l(-2.774,.002),l(-2.513,.015),l(-2.268,-.029),l(-1.664,.01),l(-1.241,.007),l(-1.614,-.019),l(-.914,.005),l(-.819,.089),l(-.011,-2.612),l(.021,-1.342),l(-.045,-2.81),l(.001,-.692),l(.008,-2.048),l(.016,-1.468),l(.019,-3.869),l(.015,-.988),l(-.042,-.367),l(-.388,-.916),l(-.185,-.945),l(.056,-.311),l(.322,-.553),l(.231,-.425),l(-.354,-1.283),l(.21,-.34),l(.369,-.228),l(.099,-.208),l(.337,.168),l(.553,-.015),l(.628,-.1),l(.786,-.001),l(1.513,.293),l(.587,.115),l(.779,.122),l(.721,.154),l(.348,.409),l(.4,0),l(.928,.083),l(.998,.394),l(.628,.069),l(.245,-.127),l(.72,-.538),l(.925,-.397),l(.837,-.186),l(.78,-.27),l(.375,-.072),l(.346,.056),l(.535,-.001),l(.723,.126),l(.202,.465),l(.596,.366),l(.518,-.156),l(.64,.267),l(.382,.027),l(.561,-.401),l(.241,.179),l(.277,.056),l(.674,.13),l(.338,-.062),l(.46,-.165),l(.51,-.308), +N(580.625,132.873),l(.24,.43),l(.299,.05),l(.276,-.314),l(.134,-.513),l(.275,.066),l(.186,-.182),l(1.079,.199),l(.132,.612),l(.867,.264),l(.726,.595),l(.472,.215),l(.15,-.132),l(.454,.281),l(.657,.794),l(.158,-.166),l(.71,-.116),l(.289,.166),l(.178,.38),l(-.069,.281),l(1.451,.893),l(.333,-.248),l(.326,.017),l(-.175,.396),l(.014,.265),l(.935,.066),l(.365,-.066),l(.54,.496),l(.141,.463),l(.237,-.099),l(-.01,-.364),l(.685,.38),l(.271,-.083),l(.08,-.331),l(.407,0),l(.63,.281),l(.319,.364),l(.849,-.066),l(.341,.116),l(.339,-.281),l(.655,.159),l(.037,.022),l(-.318,.761),l(-.07,.876),l(.429,.827),l(-.311,.694),l(-.336,-.05),l(-.687,.132),l(-.271,-.083),l(-.357,.132),l(-.399,-.116),l(-.268,-.364),l(-.606,.297),l(-.847,-.364),l(-.721,-.148),l(-.379,.231),l(-.312,-.248),l(.034,-.331),l(-.313,-.066),l(-.584,.281),l(-.618,-.265),l(-.286,-.281),l(-.663,-.149),l(.101,-.446),l(-.142,-.231),l(-.643,-.066),l(-.494,-.298),l(-.582,.347),l(-.482,-.265),l(-.503,0),l(-.087,.215),l(-.15,.066),l(-.304,-.198),l(-.835,-.166),l(-.182,-.397),l(-.538,.066),l(-1.027,-.595),l(-.231,.166),l(-1.242,-.678),l(-.305,-.529),l(-.704,-.149),l(-.665,-.479),l(-.466,.083),l(-.63,-.38),l(-.039,-.248),l(.218,-.43),l(.309,-.397),l(-.04,-.396),l(.221,-.265),l(-.008,-.364),l(.281,-.116),l(1.07,-.909), +N(374.125,167.166),l(-1.41,-.924),l(-.661,-.604),l(-.537,-.788),l(-.292,-.662),l(-.15,-.183),l(-.312,-.154),l(-.567,-.053),l(-.655,-.307),l(-.695,-.561),l(-.604,-.194),l(-.567,-.025),l(-1.209,.12),l(-1.821,.194),l(-.523,.417),l(.06,-.502),l(.563,-1.301),l(.188,-.819),l(.13,-1.13),l(-.162,-1.101),l(-.3,-.791),l(-.624,-.747),l(.267,-.283),l(.182,-.424),l(.067,-.975),l(-.065,-.537),l(-.174,-.353),l(-.808,-.817),l(-.297,-.112),l(-.393,.438),l(-.055,-.197),l(-.013,-.381),l(.08,-.689),l(.474,.013),l(5.055,.056),l(2.396,.014),l(.732,-.033),l(.212,.027),l(-.051,-1.102),l(-.164,-1.539),l(.01,-.707),l(.249,-.383),l(.575,-.427),l(.726,-.315),l(.809,-.287),l(.144,-.128),l(.099,-2.6),l(.07,-2.261),l(.047,-.509),l(.557,-.074),l(6.005,.022),l(.56,.011),l(.104,-.396),l(-.002,-.65),l(.03,-1.752),l(2.829,1.509),l(4.12,2.42),l(1.414,.91),l(-.523,.13),l(-3.231,.089),l(.049,.776),l(.908,7.962),l(.19,1.468),l(.178,1.736),l(.325,2.753),l(.202,2.386),l(.186,1.468),l(.724,.787),l(-.379,1.613),l(-6.457,.01),l(-1.953,.026),l(-.945,.344),l(-.387,.031),l(-.485,-.054),l(-.713,-.137),l(-.535,-.124),l(-.06,.212),l(.055,.296),l(-.107,.269),l(-.454,-.082),l(-.214,-.168),l(-.568,-.83),l(-.261,-.111),l(-.402,.073),l(-.252,.256),l(-.181,.552),l(-.018,.607),l(-.332,.284), +N(476.114,191.139),l(-.563,.54),l(-.626,.314),l(-.367,.016),l(-.303,-.196),l(-.303,-.097),l(-.88,.132),l(-.881,.33),l(-.911,.048),l(-.942,-.234),l(-.495,-.011),l(-.464,.087),l(-.496,.229),l(-1.288,-1.32),l(-1.032,-.926),l(-.207,-.083),l(-.258,.157),l(-.436,.582),l(-.16,.1),l(-.684,-.631),l(-.384,-.012),l(-.529,.37),l(-.258,.242),l(-.352,.016),l(-.366,-.195),l(-.525,-.477),l(-.348,-.493),l(-.795,-.772),l(-.143,-.239),l(-.031,-.07),l(.083,-.679),l(-.157,-.352),l(-.558,-.477),l(-.814,-.165),l(-.367,-.224),l(-.285,-.436),l(-.059,-.72),l(-.206,-.366),l(-.207,-.168),l(-.717,-.434),l(-.558,-.378),l(-.445,-.351),l(-.173,-.395),l(.148,-.481),l(-.223,-.267),l(-.351,-.196),l(-.799,-.235),l(-.797,-.447),l(-.223,-.225),l(-.252,-.493),l(-.207,-.126),l(-.272,.001),l(-.802,.019),l(-.158,-.211),l(-.01,-.664),l(.416,-1.472),l(-.122,-.536),l(-.347,-.549),l(-1.342,-1.673),l(.15,-.425),l(-.026,-.367),l(-.266,-.465),l(-.444,-.407),l(-.155,-.295),l(-.137,-.522),l(-.221,-1.228),l(-.141,-.225),l(-.338,-.012),l(-.517,.088),l(-.219,-.352),l(.316,-.609),l(.542,-.596),l(.087,-.34),l(-.342,-.662),l(.053,-.24),l(.718,-.428),l(.149,-.212),l(-.131,-.677),l(.122,-.438),l(.583,-.809),l(.417,-1.245),l(.229,-.143),l(1.245,-.05),l(.839,.009),l(.04,-.283),l(-.031,-1.229),l(-.036,-1.002),l(.038,-.749),l(-.085,-2.5),l(.036,-.636),l(.016,-.946),l(.02,-1.045),l(.073,-1.13),l(.52,.011),l(1.561,.019),l(.088,-.17),l(-.033,-3.078),l(.021,-1.003),l(.819,-.089),l(.914,-.005),l(1.614,.019),l(1.241,-.007),l(1.664,-.01),l(2.268,.029),l(2.513,-.015),l(2.774,-.002),l(2.138,.001),l(10.382,.006),l(.229,.414),l(.499,1.115),l(.281,3.501),l(.319,1.637),l(.182,.211),l(.625,.394),l(.595,.366),l(.617,.507),l(.491,.197),l(.254,.223),l(-.238,.199),l(-.277,.327),l(-.306,.566),l(-.369,.242),l(-.511,.172),l(-.427,.116),l(-.153,.142),l(-.235,.496),l(-.348,.171),l(-.73,.033),l(-.204,.552),l(-.038,.452),l(-.202,.862),l(-.242,.722),l(-.541,1.302),l(-.068,.495),l(.092,.903),l(-.013,.679),l(-.001,.083),l(-.148,.947),l(-.398,1.231),l(-.214,1.061),l(-1.04,.331),l(-.414,.37),l(-.693,1.134),l(-.154,.34),l(-.191,1.088),l(-.141,1.074),l(-.197,.185),l(-.274,.044),l(-.431,-.096),l(-.259,.072),l(-.163,.114),l(-.187,1.103),l(-.115,.933),l(-.2,1.272),l(.039,.522),l(-.229,1.159),l(-.469,.299),l(-.288,-.012),l(-.928,-.122),l(-.321,.03),l(-.188,.806),l(-.054,.466),l(.094,.141),l(.479,.11),l(.734,.123),l(.334,.167),l(.805,.913),l(1.06,1.067),l(.751,1.464),l(.345,.732),l(.348,.421),l(.462,.28),l(.415,.097),l(.269,.309),l(.117,.988),l(-.034,.17),l(-.018,.141),l(-.079,-.028),l(-.464,.017),l(-1.009,.133),l(-.832,.005),l(-.671,-.052),l(-.291,.327),l(-.678,.795), +N(518.402,163.079),l(-.282,.097),l(-.538,.27),l(-.656,.566),l(-.265,.297),l(-.166,.508),l(-.062,.41),l(-.41,.326),l(-1.418,.652),l(-2.27,.641),l(-1.285,.412),l(-.843,.312),l(-.356,.297),l(-.473,.622),l(-.436,.269),l(-.506,.114),l(-.593,-.069),l(-.521,.072),l(-.83,.439),l(-.65,.396),l(-.956,.397),l(-.752,.199),l(-1.16,.003),l(-.562,-.013),l(-.297,.128),l(-.386,.312),l(-.272,.297),l(-.45,.312),l(-.511,.241),l(-.389,.043),l(-.239,-.042),l(-.535,.411),l(-.839,.058),l(-.494,-.112),l(-.623,-.437),l(-.17,-.155),l(-.317,-.437),l(-.084,-.254),l(.18,-.721),l(-.081,-.635),l(-.312,-.507),l(-.341,-1.171),l(-.572,-1.919),l(-.072,-.438),l(.268,-.707),l(-.124,-.748),l(.692,-.563),l(.113,-.565),l(-.041,-.678),l(.11,-.495),l(.174,-.185),l(.216,-.1),l(.671,.151),l(.446,.125),l(.715,-.047),l(.452,.012),l(1.211,2.45),l(1.302,2.703),l(2.042,-2.667),l(1.907,-2.271),l(.383,-.397),l(.041,-.127),l(.484,-.229),l(4.618,-1.566),l(3.097,-1.035),l(1.148,-.346),l(.169,-.085),l(.092,.663),l(.226,.634),l(.604,.971),l(.933,1.364),l(.127,.253),l(-.006,.296),l(.483,.689),l(.241,.306), +N(494.64,172.627),l(-.261,-.166),l(-.476,-.633),l(-.475,-.159),l(-.437,-.911),l(-1.267,-.792),l(-.277,-.594),l(-.673,-.673),l(-.594,-.119),l(-.871,-.554),l(-.555,.079),l(-.158,-.158),l(-.237,.04),l(-.277,-.198),l(-.356,.159),l(-.476,.079),l(-.277,-.436),l(-.158,.237),l(-.436,.198),l(-.792,.079),l(-.554,-.594),l(-.238,0),l(-.396,-.317),l(-.832,1.663),l(-.436,-.871),l(-.475,.079),l(-.277,.356),l(-.396,-.08),l(-.349,.041),l(.013,-.679),l(-.092,-.903),l(.068,-.495),l(.541,-1.302),l(.242,-.722),l(.202,-.862),l(.038,-.452),l(.204,-.552),l(.73,-.033),l(.348,-.171),l(.235,-.496),l(.153,-.142),l(.427,-.116),l(.511,-.172),l(.369,-.242),l(.306,-.566),l(.277,-.327),l(.238,-.199),l(.098,.129),l(.718,2.102),l(.442,1.623),l(.689,1.919),l(.618,.832),l(.205,-.212),l(-.072,-.479),l(.093,-.226),l(.31,.253),l(.4,.677),l(.384,.395),l(.534,-.043),l(.242,.014),l(1.338,1.282),l(.809,.916),l(.124,.099),l(.706,.055),l(.618,.874),l(.021,.24),l(-.025,.198),l(.118,.212),l(.507,.182),l(.915,.869),l(-.075,.094),l(-.529,.78),l(-.331,-.182),l(-.396,-.125),l(-.214,.114),l(-.055,.085), +N(370.147,172.035),l(-2.301,-.043),l(-1.045,.006),l(-.505,.384),l(-.51,.187),l(-.74,-.024),l(-.819,.047),l(-.463,.139),l(-.009,-.003),l(-.278,-.226),l(-.169,-.409),l(.104,-.424),l(-.095,-.55),l(-.018,-.198),l(.001,-.046),l(1.695,.014),l(0,-.434),l(.155,0),l(.341,-.016),l(.186,-.077),l(.248,.062),l(.294,-.046),l(.124,-.093),l(.016,-.263),l(.077,-.078),l(.14,-.016),l(.155,.155),l(.232,.124),l(.356,.108),l(.046,.108),l(.139,.047),l(.217,-.031),l(.263,.108),l(.186,.17),l(.434,0),l(.186,-.108),l(.263,-.108),l(.279,0),l(.108,-.124),l(.016,-.124),l(-.155,-.217),l(-.202,-.077),l(-.201,.031),l(-.294,.093),l(-.108,.093),l(-.248,.062),l(-.279,-.186),l(-.031,-.186),l(-.186,-.108),l(-.17,-.015),l(-.186,.124),l(-.139,-.108),l(-.108,-.217),l(-.155,-.108),l(-.201,.031),l(-.17,-.062),l(-.387,.17),l(-.108,-.108),l(-.155,.046),l(-.202,.124),l(-.093,.294),l(-1.664,0),l(-.007,-.067),l(-.028,-.269),l(-.377,-.268),l(-.068,-.155),l(-.057,-.367),l(-.386,-.635),l(-.399,-.494),l(-.379,-.31),l(-.472,-.183),l(.54,-.34),l(.723,-.75),l(.588,-1.004),l(.334,-.82),l(.099,-.826),l(.523,-.417),l(1.821,-.194),l(1.209,-.12),l(.567,.025),l(.604,.194),l(.695,.561),l(.655,.307),l(.567,.053),l(.312,.154),l(.15,.183),l(.292,.662),l(.537,.788),l(.661,.604),l(1.41,.924),l(-.506,.399),l(-.057,.339),l(.251,1.1),l(.144,.663),l(.22,.479),l(.181,.197),l(.554,.322),l(.265,.337),l(.082,.833),l(-.004,.565),l(-.062,.142),l(-.146,-.042),l(-.963,.091),l(-.658,.074),l(-.725,-.081),l(-.503,-.209),l(-.795,-.32),l(-1.255,-.021), +N(495.973,175.881),l(-.363,.807),l(.083,.409),l(.428,.732),l(.587,.844),l(.732,.801),l(.596,.547),l(.634,.321),l(.54,.209),l(4.26,1.443),l(1.447,.472),l(1.875,-.04),l(.236,.154),l(-4.087,4.205),l(-1.562,1.69),l(-.813,.909),l(-.8,.004),l(-1.693,-.046),l(-.626,.088),l(-.562,.215),l(-.388,.214),l(-.502,.497),l(-.294,.426),l(-.337,.115),l(-1.216,.078),l(-.305,.101),l(-.453,.511),l(-1.103,-.106),l(-.461,-.181),l(-.46,-.336),l(-.271,-.098),l(-.852,.358),l(-.675,.343),l(-.258,.199),l(-.71,.753),l(-.16,.114),l(-.847,-.094),l(-.67,-.193),l(-1.373,-.133),l(-.335,-.041),l(-2.353,-1.525),l(-.604,-.293),l(-.749,-.193),l(-1.054,-.149),l(-.319,-.069),l(.018,-.141),l(.034,-.17),l(-.117,-.988),l(-.269,-.309),l(-.415,-.097),l(-.462,-.28),l(-.348,-.421),l(-.345,-.732),l(-.751,-1.464),l(-1.06,-1.067),l(-.805,-.913),l(-.334,-.167),l(-.734,-.123),l(-.479,-.11),l(-.094,-.141),l(.054,-.466),l(.188,-.806),l(.321,-.03),l(.928,.122),l(.288,.012),l(.469,-.299),l(.229,-1.159),l(-.039,-.522),l(.2,-1.272),l(.115,-.933),l(.187,-1.103),l(.163,-.114),l(.259,-.072),l(.431,.096),l(.274,-.044),l(.197,-.185),l(.141,-1.074),l(.191,-1.088),l(.154,-.34),l(.693,-1.134),l(.414,-.37),l(1.04,-.331),l(.214,-1.061),l(.398,-1.231),l(.148,-.947),l(.001,-.083),l(.349,-.041),l(.396,.08),l(.277,-.356),l(.475,-.079),l(.436,.871),l(.832,-1.663),l(.396,.317),l(.238,0),l(.554,.594),l(.792,-.079),l(.436,-.198),l(.158,-.237),l(.277,.436),l(.476,-.079),l(.356,-.159),l(.277,.198),l(.237,-.04),l(.158,.158),l(.555,-.079),l(.871,.554),l(.594,.119),l(.673,.673),l(.277,.594),l(1.267,.792),l(.437,.911),l(.475,.159),l(.476,.633),l(.261,.166),l(-.594,.921),l(-.488,.61),l(-.105,.254),l(-.029,.396),l(.202,1.157),l(.5,-.074),l(.892,-.246),l(.4,.04),l(.556,.195), +N(364.011,169.929),l(1.664,0),l(.093,-.294),l(.202,-.124),l(.155,-.046),l(.108,.108),l(.387,-.17),l(.17,.062),l(.201,-.031),l(.155,.108),l(.108,.217),l(.139,.108),l(.186,-.124),l(.17,.015),l(.186,.108),l(.031,.186),l(.279,.186),l(.248,-.062),l(.108,-.093),l(.294,-.093),l(.201,-.031),l(.202,.077),l(.155,.217),l(-.016,.124),l(-.108,.124),l(-.279,0),l(-.263,.108),l(-.186,.108),l(-.434,0),l(-.186,-.17),l(-.263,-.108),l(-.217,.031),l(-.139,-.047),l(-.046,-.108),l(-.356,-.108),l(-.232,-.124),l(-.155,-.155),l(-.14,.016),l(-.077,.078),l(-.016,.263),l(-.124,.093),l(-.294,.046),l(-.248,-.062),l(-.186,.077),l(-.341,.016),l(-.155,0),l(0,.434),l(-1.695,-.014),l(.019,-.477),l(.173,-.198),l(.434,-.058),l(.093,-.155),l(-.006,-.059), +N(495.973,175.881),l(-.556,-.195),l(-.4,-.04),l(-.892,.246),l(-.5,.074),l(-.202,-1.157),l(.029,-.396),l(.105,-.254),l(.488,-.61),l(.594,-.921),l(.055,-.085),l(.214,-.114),l(.396,.125),l(.331,.182),l(.529,-.78),l(.075,-.094),l(.627,.596),l(.285,.465),l(.036,.282),l(-.118,.113),l(-.361,.185),l(-.438,.1),l(-.56,.312),l(-.566,.467),l(.253,.127),l(.645,-.058),l(.321,.013),l(.434,.124),l(-.114,.26),l(-.37,.468),l(-.34,.567), +N(363.763,172.732),l(.463,-.139),l(.819,-.047),l(.74,.024),l(.51,-.187),l(.505,-.384),l(1.045,-.006),l(2.301,.043),l(-.111,.792),l(.115,.847),l(-.186,.312),l(-.333,.186),l(-.513,.031),l(-.401,.017),l(-.381,.186),l(-.789,.64),l(-.321,.372),l(-.047,-.126),l(-.192,0),l(-.501,-.14),l(-.165,-.254),l(.121,-.41),l(.33,-.438),l(.253,-.212),l(-.131,-.141),l(-.372,-.112),l(-.498,.015),l(-.415,.17),l(-.161,0),l(-.616,-.281),l(-.36,-.296),l(-.069,-.24),l(-.323,-.084),l(-.316,-.137), +N(383.005,177.596),l(-.379,.397),l(-.264,.623),l(.214,.409),l(.695,.405),l(.197,.31),l(-.125,.283),l(-.332,.37),l(.309,.351),l(.648,.561),l(.051,.226),l(-.19,.143),l(-.304,-.012),l(-.548,-.223),l(-.304,.03),l(-.158,.199),l(-.03,.127),l(.296,.549),l(.179,.21),l(-.188,.354),l(-.602,.554),l(-.047,.099),l(-.339,-.224),l(-.337,-.097),l(-.143,.086),l(-.756,.922),l(-.321,-.026),l(-.404,-.322),l(-.277,-.323),l(.044,-.283),l(-.009,-.65),l(-.22,-.846),l(-.165,-.366),l(-.338,-.097),l(-.528,.046),l(-.367,.143),l(-.252,.242),l(-.193,.376),l(-.26,-.656),l(-.165,-1.369),l(-.252,-.761),l(-.475,-.619),l(-.456,-.421),l(-.42,-.224),l(-.466,-.04),l(-1.137,.148),l(-.594,-.039),l(-.238,.157),l(-.643,.866),l(-1.088,1.235),l(.051,-.392),l(-.312,-.55),l(-.764,-.775),l(-.122,-.649),l(-.84,-.366),l(-.908,-.563),l(-.277,-.296),l(.09,-.396),l(-.053,-.311),l(-.547,-.041),l(-.323,-.098),l(-.115,-.155),l(.059,-.311),l(-.038,-.1),l(.321,-.372),l(.789,-.64),l(.381,-.186),l(.401,-.017),l(.513,-.031),l(.333,-.186),l(.186,-.312),l(-.115,-.847),l(.111,-.792),l(1.255,.021),l(.795,.32),l(.503,.209),l(.725,.081),l(.658,-.074),l(.963,-.091),l(.146,.042),l(.113,.028),l(.18,.183),l(.882,.715),l(.536,.265),l(.252,-.256),l(.475,-.413),l(.338,.026),l(.356,.153),l(.565,.152),l(.43,-.243),l(.3,-.327),l(.684,-.428),l(.323,.055),l(.246,.281),l(.022,.339),l(.271,.832),l(.265,.451),l(.474,.478),l(.349,.718),l(.194,1.143),l(.559,.901), +N(266.015,188.956),l(.103,.169),l(-.163,.326),l(-.592,.385),l(-1.74,.9),l(-.807,.23),l(-.557,.074),l(-.465,-.054),l(-.284,.115),l(-.232,1.117),l(-.348,.115),l(-.628,-.618),l(-.344,-.224),l(-1.149,.035),l(-.385,-.04),l(-.896,-.461),l(-.309,-.125),l(-.159,.029),l(-.041,.184),l(.616,.688),l(.391,.69),l(.302,1.524),l(.079,.55),l(.166,.239),l(.96,.051),l(.434,.125),l(.15,.253),l(-.265,.27),l(-.569,.272),l(-.652,.131),l(-.203,.199),l(-.259,.666),l(-.235,.213),l(-.652,.173),l(-.554,.286),l(-.74,.654),l(-.645,.739),l(-.271,.016),l(-.186,-.776),l(-.083,-.183),l(-.757,.697),l(-.414,.073),l(-.482,-.223),l(-.694,-.546),l(-.432,-.054),l(-.199,-.437),l(-.088,-.452),l(-.161,-.861),l(-.138,-.437),l(-.148,-.168),l(-.797,-1.182),l(-.51,-.491),l(.479,-.526),l(.731,-.612),l(-.121,-.282),l(-.486,-.647),l(-.256,-.437),l(-.447,-.789),l(-.162,-.804),l(-.048,-.367),l(-.035,-.438),l(-.026,-.254),l(.147,-.326),l(.379,-.511),l(.085,-1.004),l(.409,-.525),l(-.644,-.081),l(-1.99,.224),l(-.76,.174),l(-.522,.13),l(-.144,0),l(-.554,-.576),l(-.847,-.998),l(-.188,-.253),l(-.64,-.321),l(-.521,-.181),l(-1.167,.05),l(-1.163,.12),l(-.496,.017),l(-.397,-.252),l(-.429,-.548),l(-.401,-.309),l(-.099,-.353),l(.226,-1.132),l(-.103,-.395),l(-.855,-1.45),l(-.31,-.606),l(-.384,.017),l(-.234,.1),l(-.402,-.025),l(.709,-1.191),l(.241,-.722),l(.172,-.722),l(.99,-1.758),l(.381,-.059),l(.227,.027),l(.129,-.396),l(-.048,-.497),l(.056,-.288),l(.414,-.2),l(.534,-.156),l(.84,-.171),l(.128,.105),l(-.9,.151),l(-.731,.312),l(-.145,.212),l(.19,.607),l(.142,.407),l(.224,.126),l(-.043,.145),l(.153,.579),l(-.135,.367),l(-.327,.364),l(-.348,.824),l(-.137,.368),l(.253,.479),l(.288,.253),l(.25,.72),l(.341,.353),l(.523,-.114),l(.184,-.156),l(.419,-.255),l(.12,-.142),l(.066,-.523),l(-.167,-.649),l(-.21,-.282),l(-.438,-.804),l(-.136,-.135),l(-.118,-.395),l(-.247,-.18),l(.239,-.099),l(.095,-.251),l(-.204,-.144),l(1,-.379),l(1.085,-.327),l(.998,-.272),l(.086,-.225),l(.69,-.086),l(.143,-.008),l(-.042,-.157),l(-.055,-.198),l(-.125,-.036),l(-.039,-.108),l(-.128,-.072),l(-.226,.071),l(-.156,.027),l(-.229,-.012),l(-.315,-.55),l(.109,-.254),l(.337,-.213),l(.367,-.043),l(.09,.112),l(.14,.368),l(.186,.162),l(-.001,.148),l(.026,.193),l(.068,.09),l(.004,.198),l(.253,.258),l(.329,-.02),l(.699,.111),l(.455,.07),l(.593,.196),l(.323,.254),l(.393,.564),l(.156,.635),l(.358,.324),l(.359,.084),l(1.02,-.129),l(.928,-.059),l(.59,-.058),l(.799,-.059),l(.714,.125),l(.4,.479),l(.267,.169),l(.578,.253),l(.49,.14),l(1.094,.04),l(.382,-.057),l(.388,-.227),l(1.042,-.807),l(.47,-.185),l(.453,.042),l(.959,-.073),l(1.152,-.073),l(.919,.055),l(.248,.112),l(-.056,.141),l(-.294,.185),l(-.854,-.041),l(-.433,.015),l(-.083,.212),l(.059,.184),l(.593,.253),l(.609,.535),l(.195,.649),l(.246,-.523),l(.185,-.142),l(.415,.253),l(.483,.027),l(.374,.098),l(.258,.338),l(.918,.394),l(.464,.295),l(-.729,.496),l(-.161,.65),l(-.214,.226),l(-1.055,.417),l(.5,.064),l(.598,.098),l(.368,-.029),l(.33,-.142),l(.929,-.03),l(.725,.083),l(.84,.274),l(.095,.296),l(-.061,.41),l(-1.655,1.239),l(-.101,.255),l(.074,.212),l(.62,.604),l(.141,.282),l(-.308,.299),l(-.41,.144),l(-1.032,.19),l(-.061,.452),l(.008,.58),l(-.395,.539),l(-.071,.212),l(.324,.521),l(.732,.745),l(.503,.647), +N(493.044,204.258),l(-1.223,-1.771),l(-.027,-.932),l(-.03,-1.43),l(-.042,-2.045),l(-.003,-1.017),l(0,-.438),l(.016,-.848),l(.004,-1.215),l(.002,-.508),l(1.649,-2.467),l(.453,-.511),l(.305,-.101),l(1.216,-.078),l(.337,-.115),l(.294,-.426),l(.502,-.497),l(.388,-.214),l(.562,-.215),l(.626,-.088),l(1.693,.046),l(.8,-.004),l(.813,-.909),l(1.562,-1.69),l(4.087,-4.205),l(-.236,-.154),l(-1.875,.04),l(-1.447,-.472),l(-4.26,-1.443),l(-.54,-.209),l(-.634,-.321),l(-.596,-.547),l(-.732,-.801),l(-.587,-.844),l(-.428,-.732),l(-.083,-.409),l(.363,-.807),l(.34,-.567),l(.37,-.468),l(.114,-.26),l(.154,.044),l(.935,1.142),l(.586,.62),l(.243,.381),l(.265,.211),l(.372,-.071),l(.417,-.001),l(.465,.027),l(.372,-.071),l(.572,-.27),l(.836,-.425),l(.585,-.157),l(.397,.098),l(.76,.267),l(.549,-.072),l(.56,-.326),l(.779,-.566),l(.247,-.127),l(.447,.041),l(.479,.098),l(.419,-.043),l(1.195,-.482),l(.288,.027),l(.682,.196),l(.74,-.03),l(.764,-.185),l(.964,-.327),l(.9,-.666),l(.47,-.382),l(.604,.154),l(.391,.211),l(.08,.014),l(.147,.268),l(-.414,.919),l(.021,.564),l(.132,.621),l(-.165,.452),l(-.375,.509),l(-.028,.678),l(-.047,.833),l(-.163,.509),l(-1.264,2.262),l(-.842,.792),l(-.122,.311),l(.102,.353),l(-.893,1.569),l(-.834,1.272),l(-.214,.947),l(-.351,.636),l(-.712,1.117),l(-.874,1.188),l(-1.159,1.498),l(-.384,.439),l(-2.274,2.504),l(-1.82,1.557),l(-2.164,1.121),l(-.593,.382),l(-1.28,1.09),l(-1.74,1.755),l(-.06,.061),l(-1.055,1.1),l(-1.235,1.569),l(-.615,.835),l(.1,.353),l(-.094,.276), +N(264.768,176.039),l(-.128,.225),l(-.115,.067),l(-.029,.135),l(.039,.25),l(-.058,.086),l(.125,.376),l(-.039,.424),l(-.453,.154),l(-.135,-.01),l(-.144,.039),l(-.482,-.039),l(-.192,.039),l(-.087,-.048),l(-.356,0),l(-.02,-.058),l(.039,-.067),l(.202,-.029),l(.222,-.135),l(.019,-.087),l(.106,.02),l(.154,.01),l(.135,-.145),l(-.096,-.279),l(.048,-.125),l(.029,-.183),l(-.067,-.125),l(-.097,-.135),l(-.279,-.048),l(.116,-.096),l(.164,-.019),l(.231,-.029),l(.115,-.087),l(.385,.02),l(.106,-.039),l(.299,-.067),l(.244,.006), +N(654.075,190.187),l(.206,-.125),l(.63,-.114),l(.656,-.938),l(.241,-.07),l(-.069,.268),l(.122,.087),l(.187,-.046),l(.11,.174),l(.148,.444),l(-.024,.111),l(-.013,.247),l(.197,.197),l(.025,.086),l(-1.234,.42),l(-.383,.271),l(-.309,-.271),l(-.111,-.259),l(-.234,.012),l(-.062,-.37),l(-.084,-.126), +N(493.044,204.258),l(-.602,.389),l(-.557,.171),l(-.385,-.112),l(-.086,.777),l(-.282,.367),l(-.67,.115),l(-.394,.382),l(-.088,.48),l(.006,.353),l(-.356,.622),l(-.964,1.358),l(.092,.536),l(-.337,.65),l(-.25,.255),l(-.334,.1),l(-.084,.152),l(-1.067,-.807),l(-2.427,-1.752),l(-.07,-.239),l(.116,-.552),l(-.137,-.381),l(-3.553,-1.984),l(-4.663,-2.568),l(-1.448,.033),l(1.144,-2.479),l(.105,-.229),l(.656,-.835),l(.985,-.938),l(.477,-.525),l(.43,-.695),l(.143,-.566),l(-.048,-.664),l(-.223,-.606),l(-.224,-.352),l(-.732,-1.069),l(-.174,-.465),l(-.027,-.861),l(-.126,-.226),l(-.477,-.463),l(-.3,-.493),l(.678,-.795),l(.291,-.327),l(.671,.052),l(.832,-.005),l(1.009,-.133),l(.464,-.017),l(.079,.028),l(.319,.069),l(1.054,.149),l(.749,.193),l(.604,.293),l(2.353,1.525),l(.335,.041),l(1.373,.133),l(.67,.193),l(.847,.094),l(.16,-.114),l(.71,-.753),l(.258,-.199),l(.675,-.343),l(.852,-.358),l(.271,.098),l(.46,.336),l(.461,.181),l(1.103,.106),l(-1.649,2.467),l(-.002,.508),l(-.004,1.215),l(-.016,.848),l(0,.438),l(.003,1.017),l(.042,2.045),l(.03,1.43),l(.027,.932),l(1.223,1.771), +N(466.196,203.275),l(.188,-.298),l(.076,-.27),l(-.057,-.748),l(.025,-.734),l(-.021,-.593),l(.107,-.507),l(.217,-1.02),l(.395,-.681),l(.255,-.284),l(1.241,-.996),l(1.195,-1.066),l(.191,-.453),l(-.111,-.31),l(-.271,-.182),l(-.479,-.04),l(-.191,-.027),l(-.128,-.253),l(.26,-1.88),l(.018,-.424),l(-.159,-.183),l(-.063,-.028),l(.496,-.229),l(.464,-.087),l(.495,.011),l(.942,.234),l(.911,-.048),l(.881,-.33),l(.88,-.132),l(.303,.097),l(.303,.196),l(.367,-.016),l(.626,-.314),l(.563,-.54),l(.3,.493),l(.477,.463),l(.126,.226),l(.027,.861),l(.174,.465),l(.732,1.069),l(.224,.352),l(.223,.606),l(.048,.664),l(-.143,.566),l(-.43,.695),l(-.477,.525),l(-.985,.938),l(-.656,.835),l(-.105,.229),l(-1.144,2.479),l(-4.659,0),l(-1.277,.05),l(-.319,.017),l(-.554,.398),l(-.458,.427),l(-.431,.045),l(-.546,-.223),l(-.064,-.042), +N(713.621,206.298),l(.169,7.966),l(-.44,.822),l(.431,1.368),l(.046,.805),l(-.031,3.438),l(-.515,-.512),l(-.927,-.888),l(-.716,-.902),l(-.406,-.056),l(-.776,.101),l(-.739,.143),l(-.434,-.013),l(.091,-.382),l(.435,-.65),l(.006,-.283),l(-.561,-.521),l(-.565,-.775),l(.028,-.226),l(.442,.111),l(.236,-.042),l(.135,-.113),l(-.467,-.409),l(-.595,-.408),l(-.287,-.381),l(-.275,-.648),l(-1.053,-1.693),l(-.508,-.394),l(-.467,-.282),l(-.604,-.196),l(-1.983,-.603),l(-1.26,-.379),l(-.613,-.069),l(-.705,-.238),l(-.63,-.323),l(.072,-.34),l(-.098,-.268),l(-.193,-.028),l(-.617,.101),l(-.389,-.07),l(-.412,-.196),l(-.408,-.395),l(-.209,-.579),l(.133,-.494),l(-.155,-.226),l(-.187,.113),l(-.234,.396),l(-.122,.664),l(-.251,.608),l(-.334,.269),l(-.696,.354),l(-.155,-.169),l(-.331,-.677),l(.022,-.155),l(.384,-.27),l(-.152,-.424),l(-.173,-.239),l(-.564,-.395),l(-.707,-.394),l(-.338,-.056),l(-.059,-.212),l(.038,-.226),l(.413,-.044),l(.388,.084),l(.603,.239),l(.158,-.029),l(.368,-.34),l(.525,-.41),l(.146,.056),l(.3,.269),l(1.021,-.045),l(.139,-.128),l(.09,-.522),l(-.063,-.409),l(-.238,.028),l(-.345,.199),l(-.604,.071),l(-.656,-.041),l(-.766,.044),l(-1.026,-.082),l(-.411,-.31),l(-.135,-.197),l(-.148,-.664),l(-.202,-.338),l(-.42,-.155),l(-1.249,-.124),l(.265,-.297),l(.058,-.255),l(.004,-.593),l(.463,-.029),l(.92,-.411),l(.49,-.383),l(.444,-.283),l(.352,.027),l(.4,.069),l(1.494,.646),l(.515,.169),l(.913,.153),l(.382,.705),l(.138,.396),l(-.283,.749),l(-.067,.381),l(.221,.381),l(.115,.494),l(.115,.48),l(.215,.521),l(.186,.197),l(.197,.127),l(.226,-.65),l(.085,.113),l(.087,.141),l(.309,1.073),l(.169,.169),l(.234,.183),l(.294,.112),l(.354,.056),l(.58,-.198),l(.504,-.439),l(1.192,-1.853),l(.352,-.015),l(1.078,-.215),l(.378,-.142),l(.045,-.085),l(.014,-.509),l(.219,-.17),l(1.1,-.609),l(.335,-.043),l(1.732,.759),l(2.129,.941),l(1.54,.52),l(1.299,.404),M(691.208,208.707),l(-.388,-.069),l(-.693,-.38),l(-.852,-.647),l(-.295,-.141),l(-.414,.028),l(-.059,.1),l(.024,.452),l(-.206,.028),l(-1.014,-.407),l(-.258,-.353),l(-.582,.199),l(-.289,.269),l(-.326,.185),l(-.186,-.184),l(-.312,-.451),l(-.245,-.451),l(.246,-.198),l(.303,-.029),l(.274,.056),l(1.104,.04),l(.574,.31),l(.319,-.015),l(.544,-.326),l(.414,-.015),l(.534,.126),l(.857,.21),l(.499,.395),l(.293,.395),l(.179,.621),l(-.049,.254),M(682.045,208.699),l(-.419,-.056),l(-.715,-.493),l(-.232,-.451),l(.146,-.283),l(.603,-.1),l(.766,-.044),l(.246,.126),l(.256,.311),l(.313,.197),l(.108,.226),l(-.067,.226),l(-.125,.057),l(-.879,.285),M(707.635,219.095),l(-1.11,-.209),l(.589,-1.032),l(.56,-.708),l(.407,-.269),l(.427,-.072),l(.527,.338),l(.198,.24),l(-.11,.184),l(-.324,.637),l(-.256,.17),l(-.638,.693),l(-.27,.028),M(673.797,218.703),l(-.562,.257),l(.034,.233),l(-.886,.326),l(-.582,.274),l(-.339,-.041),l(-.453,.325),l(-.504,-.069),l(-.427,-.112),l(-.378,.255),l(-.3,.058),l(-.358,-.07),l(-.58,-.196),l(-1.046,-.04),l(-.316,.043),l(-.211,-.564),l(.027,-.24),l(.383,-.198),l(.672,-.199),l(.528,-.016),l(1.142,.407),l(.445,.324),l(.338,.013),l(.326,-.297),l(.464,-.016),l(.429,-.071),l(.414,.187),l(.467,-.116),l(-.072,-.222),l(.421,-.187),l(.404,-.233),l(.094,-.151),l(-.076,-.117),l(-.184,.023),l(.116,-.198),l(.16,.012),l(.22,.094),l(.177,.221),l(.013,.304),M(662.661,219.065),l(-.312,-.099),l(-.203,-.127),l(-.062,-.169),l(.03,-.212),l(.256,-.198),l(.315,-.036),l(.17,.092),l(.053,.212),l(.182,.098),l(.305,-.145),l(.34,.105),l(.104,.151),l(-.012,.451),l(.183,-.148),l(.163,-.304),l(.318,-.029),l(.229,.226),l(.021,.424),l(.181,-.036),l(.062,.104),l(-.025,.397),l(-.316,-.211),l(-.311,-.058),l(-.141,.058),l(.072,.155),l(-.852,.157),l(-.143,-.091),l(.097,-.268),l(-.085,-.059),l(-.308,.269),l(-.229,.256),l(-.296,-.046),l(-.63,.225),l(-.624,.199),l(-.357,-.051),l(-.31,.123),l(-.392,-.07),l(-.103,-.07),l(-.202,-.123),l(-.063,-.279),l(.143,-.261),l(-.08,-.253),l(.193,-.115),l(.23,-.113),l(.233,-.156),l(.224,.07),l(.61,.013),l(.4,.104),l(.089,.28),l(.291,.109),l(.294,.056),l(.189,-.259),l(.29,-.012),l(.051,-.187),l(-.263,-.15),M(656.294,219.602),l(-.393,-.282),l(-.855,-.449),l(-.118,-.269),l(.417,-.001),l(.514,-.185),l(.462,-.029),l(.925,.521),l(-.338,.17),l(-.232,.1),l(-.381,.425),M(631.053,200.125),l(-.061,.225),l(-.413,.439),l(-.204,.41),l(-.381,.354),l(.164,.353),l(.162,.169),l(.806,.493),l(.832,.055),l(.241,.112),l(.151,.381),l(.128,.763),l(-.007,.409),l(.267,.423),l(.212,.127),l(.544,.041),l(-.45,.933),l(.151,.212),l(.703,-.453),l(.824,.252),l(.177,.042),l(.265,.254),l(.144,.438),l(.698,.676),l(-.515,1.979),l(-.04,.452),l(.23,.946),l(-.021,.438),l(.021,.664),l(-.002,.268),l(-.149,1.06),l(-.087,.156),l(-.107,.07),l(-.367,-.253),l(-.381,-.522),l(-.261,-.084),l(-.262,.481),l(-.081,.268),l(-1.043,-.619),l(-.219,.086),l(.394,.747),l(-.163,.213),l(-.204,-.197),l(-1.343,-1.424),l(-.775,-.761),l(-1.011,-.859),l(-1.348,-.958),l(-.391,-.451),l(-.199,-.493),l(-.191,-.339),l(-1.003,-.633),l(-.697,-.677),l(-1.186,-1.509),l(-.074,-.353),l(.039,-.339),l(-.324,-.875),l(-.841,-1.467),l(-.667,-1.044),l(-.612,-.775),l(-.369,-.301),l(-.287,-.234),l(-.64,-.295),l(-.254,-.748),l(-.688,-1.806),l(.067,-.24),l(-.107,-.311),l(-.157,-.197),l(-.662,-.507),l(-.711,-.394),l(-.539,-.21),l(-.317,-.099),l(-.119,-.353),l(-.077,-.734),l(-.18,-.409),l(-.386,-.479),l(-.818,-.831),l(-.368,-.423),l(-.725,.128),l(-.613,-.676),l(-.646,-.606),l(-.593,-.69),l(-.562,-.945),l(-.229,-.635),l(-.032,-.367),l(.057,-.198),l(.149,-.113),l(.401,-.043),l(.364,.098),l(.25,.126),l(.632,.563),l(.361,.155),l(.922,.153),l(.335,.027),l(.548,-.1),l(.454,-.142),l(.4,-.015),l(.323,.31),l(.919,1.156),l(.513,.31),l(.058,.155),l(-.12,.537),l(1.066,.916),l(.749,.493),l(1.175,.689),l(.678,.323),l(.139,.169),l(.03,.593),l(-.02,.155),l(.573,.055),l(.745,.944),l(.612,.55),l(.271,-.015),l(.004,-.198),l(-.123,-.226),l(.069,-.24),l(.507,.21),l(.479,.804),l(.441,.38),l(.446,.056),l(.429,.197),l(.314,.366),l(.28,.734),l(.316,.437),l(.431,.268),l(.511,.126),l(.767,.083),l(.431,.154),l(.494,.38),l(.576,.606),l(-.019,.071),M(684.201,200.125),l(-.007,-.172),l(-.414,-1.058),l(.18,-.551),l(-.078,-.141),l(-.141,-.296),l(.036,-.325),l(.286,-.89),l(.514,-.82),l(.263,.367),l(.152,.353),l(-.054,.283),l(-.246,.396),l(-.361,.763),l(.061,.325),l(.19,.141),l(.097,-.141),l(.436,-.411),l(.135,-.522),l(.179,-.142),l(.806,-.412),l(.141,.141),l(-.052,.254),l(.104,.55),l(-.354,.212),l(-.467,.354),l(-.162,.311),l(.159,.099),l(.446,.126),l(.398,.211),l(-.016,.141),l(.159,.353),l(-.688,-.154),l(-.431,-.154),l(-.367,-.042),l(-.304,.156),l(-.08,.438),l(.049,.258),l(.131,.688),l(.341,.62),l(.405,.438),l(.196,.282),l(-.156,.212),l(-.26,-.211),l(-.664,-.648),l(-.55,-.733),l(-.002,-.396),l(-.011,-.251),M(637.361,207.144),l(-.863,-.394),l(-.377,-.239),l(-.205,-.367),l(-.045,-.367),l(-.156,-.395),l(-.507,-.395),l(-.291,-.099),l(-.446,.029),l(-.116,-.141),l(.271,-.65),l(.234,-.24),l(.509,.55),l(.148,-.467),l(.313,-.269),l(.072,.395),l(.312,.89),l(.648,.817),l(.698,.31),l(-.265,.184),l(-.118,.283),l(.183,.564),M(634.321,215.345),l(-.091,-.187),l(.316,-.023),l(.402,.093),l(.369,-.129),l(.068,-.524),l(.018,-.14),l(.309,.057),l(-.043,-.5),l(.222,-.235),l(.093,-.277),l(.202,.121),l(.631,.112),l(.474,-.047),l(.237,.443),l(.524,-.089),l(.158,-.297),l(.022,-.244),l(.259,.116),l(.618,.168),l(.411,.438),l(.338,-.046),l(.204,.271),l(.446,-.029),l(.453,-.185),l(.302,.211),l(.369,.522),l(.179,.521),l(.884,.041),l(.462,.188),l(.49,-.077),l(1.435,.124),l(.479,-.029),l(.34,-.17),l(.213,-.65),l(.271,-.269),l(.447,-.015),l(.223,.211),l(.289,.494),l(.633,.125),l(.53,.027),l(.774,.083),l(.796,.153),l(.289,.24),l(.293,.288),l(-.08,.445),l(.275,.466),l(.119,.099),l(.877,.352),l(.422,.069),l(.658,.013),l(.45,-.185),l(.415,-.015),l(.628,.238),l(.048,.197),l(-.255,.425),l(-.152,.494),l(.578,.776),l(-.499,-.211),l(-.802,-.196),l(-.599,-.253),l(-.891,-.309),l(-.528,.001),l(-.589,.256),l(-.348,.057),l(-.714,-.098),l(-1.454,-.138),l(-1.47,-.138),l(-.805,-.253),l(-.839,-.479),l(-1.099,-.336),l(-1.125,-.267),l(-.948,-.04),l(-.556,.298),l(-.445,.043),l(-.957,-.153),l(-.805,-.492),l(-.357,-.07),l(-1.606,-.066),l(-.363,-.155),l(.055,-.141),l(.448,-.468),l(-.402,-.267),l(-.551,-.099),l(-.506,-.14),l(-.307,-.027),l(-1.261,-.121),M(675.004,223.092),l(.249,-.494),l(.023,-.537),l(.113,-.312),l(.674,-.481),l(1.447,-.624),l(.662,-.454),l(.36,-.607),l(.466,-.157),l(1.578,-.102),l(.91,-.214),l(.541,-.044),l(.869,-.143),l(.118,.07),l(.099,.197),l(-.237,.212),l(-.36,.256),l(-1.609,.61),l(-1.369,.44),l(-.713,.256),l(-.606,.354),l(-1.09,.963),l(-.653,.481),l(-.439,.086),l(-.552,.228),l(-.48,.015),M(667.866,223.149),l(-.217,-.069),l(-.917,-.605),l(-.8,-.45),l(-.347,-.099),l(-.493,-.126),l(-.292,-.197),l(.108,-.212),l(.371,-.142),l(.992,-.03),l(.502,-.114),l(.35,.296),l(1.147,.746),l(.265,.381),l(-.125,.325),l(-.246,.24),l(-.299,.057),M(661.819,191.241),l(-.041,.09),l(.319,.691),l(-.23,.142),l(-.546,.043),l(-.579,.086),l(.198,.226),l(.115,.296),l(-.169,.226),l(.216,.211),l(.235,.112),l(.546,.832),l(.536,.747),l(.043,.198),l(-.338,.721),l(.075,.226),l(.406,.465),l(.743,.45),l(.6,.493),l(.551,.761),l(-.465,.17),l(-.75,-.026),l(-.797,-.238),l(-.337,.1),l(-.387,.467),l(-.354,.918),l(-.08,.476),l(-.046,.272),l(.132,.649),l(.116,.424),l(-.133,.848),l(-.256,0),l(-.466,-.154),l(-1.037,.963),l(-.433,.65),l(-.751,.608),l(.443,.381),l(.06,.396),l(.17,.296),l(-.685,.058),l(.452,.578),l(.009,.212),l(-.103,.227),l(-.547,.665),l(-.206,.396),l(-.127,.354),l(-.529,.594),l(-1.294,.61),l(-.607,.284),l(-.292,.198),l(-.194,-.311),l(.024,-.424),l(-.33,-.804),l(-.306,-.381),l(-.265,-.184),l(-.286,.029),l(-.503,.523),l(-.302,.029),l(-.328,-.508),l(-.313,-.197),l(-.437,-.112),l(-.387,-.451),l(-.342,-.154),l(-.35,.806),l(-.135,.198),l(-.381,.058),l(-.356,-.112),l(-.442,.128),l(-.318,.354),l(-.364,.071),l(-.059,-.551),l(.034,-.311),l(-.314,-1.03),l(-.336,.396),l(-1.42,.44),l(-.321,-.408),l(-.639,.015),l(-.281,.156),l(-.303,.029),l(-.058,-.649),l(-.022,-.65),l(-.267,-1.411),l(-.012,-.48),l(-.352,-.747),l(-.406,-.409),l(-.79,-.422),l(-.146,-.141),l(.555,-.354),l(-.531,-.38),l(-.258,-.296),l(.188,-.735),l(-.074,-.128),l(-.278,-.478),l(-.352,-.296),l(.065,-.466),l(-.125,-.593),l(.182,-.65),l(.133,-.353),l(.424,-.58),l(.303,-.806),l(.318,.028),l(.204,.11),l(.288,.792),l(.253,.295),l(1,.983),l(.304,.083),l(.446,.28),l(.928,-.416),l(.255,-.001),l(.526,.223),l(.543,.11),l(.399,-.172),l(.528,-.342),l(.403,-.525),l(.531,-.441),l(.479,-.074),l(.431,.11),l(.557,.251),l(.524,.223),l(.559,.152),l(.287,-.03),l(.467,-.356),l(.465,-.172),l(.864,-.175),l(.387,-.299),l(.928,-1.785),l(-.076,-.748),l(.218,-.34),l(.646,-.244),l(.22,-.383),l(-.106,-.988),l(.119,-.565),l(.381,-.638),l(.247,-.157),l(.464,-.017),l(.748,.081),l(.651,.081),l(.624,-.018),l(.446,.04),l(.753,.292),l(.182,.09),M(666.561,200.125),l(.012,-.049),l(.48,-1.188),l(.434,-.41),l(.289,-.142),l(.429,.338),l(.29,-.311),l(.162,-.325),l(.293,-.481),l(.496,-.058),l(.605,.14),l(.729,.535),l(.447,.027),l(.863,-.044),l(.478,.168),l(.749,.267),l(.577,-.227),l(1.853,.081),l(.72,-.128),l(.627,-.354),l(.211,-.283),l(-.156,-.268),l(.196,-.283),l(.388,-.241),l(.295,-.41),l(.289,-.057),l(.075,.24),l(-.073,.537),l(-.117,.311),l(-.081,.127),l(-.082,.127),l(-.969,1.259),l(-.416,.396),l(-.464,.1),l(-1.23,.229),l(-.495,-.069),l(-.591,-.422),l(-1.149,-.068),l(-1.151,.059),l(-.878,-.041),l(-1.039,.045),l(-.575,-.083),l(-.671,.029),l(-.415,.1),l(-.433,.368),l(-.259,.461),l(-.154,.274),l(-.187,.721),l(.068,.48),l(.263,.494),l(.194,.183),l(.403,.226),l(.259,.196),l(.221,.607),l(.179,.154),l(.226,.042),l(.815,.026),l(.249,-.269),l(.652,-.976),l(.385,.056),l(.307,.183),l(.496,.041),l(.363,-.227),l(.669,-.156),l(.62,-.143),l(.268,-.298),l(.271,-.057),l(.466,.196),l(.131,.212),l(-.083,.734),l(-.469,-.267),l(-.544,-.042),l(-.361,.298),l(-.389,.523),l(-.438,.425),l(-1.059,.439),l(-.214,.325),l(-.143,.029),l(-.241,-.042),l(-.468,-.126),l(-.03,.056),l(.025,.312),l(.212,.126),l(.676,.578),l(.467,.521),l(.854,1.24),l(-.097,.325),l(-.156,.679),l(.102,.409),l(.447,.535),l(.555,.438),l(.062,.226),l(-.045,.282),l(-.436,-.056),l(-.652,.059),l(-.412,.297),l(-.224,.692),l(-.498,-.026),l(-.461,-.183),l(-.107,-.17),l(.052,-.649),l(.204,-.58),l(-.978,-.845),l(-.417,-.31),l(-.174,-.269),l(.036,-.24),l(.284,-.396),l(.116,-.579),l(-.165,-.494),l(-.737,-.055),l(-.503,.213),l(-.494,.396),l(.16,.353),l(.143,.932),l(-.068,.509),l(-.236,1.145),l(.363,.903),l(-.01,.311),l(-.377,.636),l(-.019,.227),l(.275,.564),l(-.726,.171),l(-.513,.241),l(-.476,.071),l(-.245,-.324),l(-.16,-.522),l(.156,-.325),l(.181,-.466),l(.069,-.876),l(.06,-1.073),l(-.125,-.509),l(.029,-.339),l(-.213,-.395),l(-.311,-.127),l(-.391,.171),l(-.574,.029),l(.011,-.41),l(-.25,-1.284),l(.131,-.311),l(.491,-.524),l(.469,-.777),l(.161,-.48),l(-.089,-.918),l(-.006,-.254),l(.087,-.452),l(.339,-.721),l(.447,-.058),l(-.043,-.861),l(.254,-1.053), +N(341.05,41.069),l(2.084,.272),l(.344,.361),l(-.869,.174),l(-.541,.139),l(-1.678,.106),l(-1.159,.037),l(-.689,.156),l(-.372,.224),l(-.308,.6),l(-.361,.376),l(1.05,.39),l(.971,.168),l(2.117,.064),l(.601,-.001),l(1.775,-.242),l(1.93,-.038),l(.866,.135),l(.933,.219),l(.417,.135),l(.284,-.018),l(1.001,-.002),l(1.277,.032),l(.615,.05),l(-1.277,.626),l(-1.583,.457),l(-1.976,.523),l(-.556,-.016),l(-.695,-.116),l(-.951,.671),l(-1.061,.503),l(-1.246,.452),l(-1.125,.296),l(-.211,.056),l(-2.212,.054),l(-.525,.134),l(-.502,.001),l(-.982,.201),l(-.665,.167),l(-.528,.051),l(-.946,-.413),l(-.375,.05),l(-.69,.913),l(-.958,.118),l(-.631,-.065),l(-.743,-.197),l(-.622,-.463),l(-.854,-.43),l(-.647,-.215),l(-.109,0),l(.008,.2),l(.707,1.043),l(-.192,.249),l(-.319,.017),l(-.69,.249),l(-.84,.249),l(-.573,.38),l(-1,.906),l(-.657,.657),l(-1.051,.851),l(-.776,.262),l(-1.034,.083),l(-1.023,-.275),l(-.148,.554),l(-.438,.569),l(-.783,.277),l(-.992,-.095),l(-.616,.05),l(-1.18,.439),l(.942,-1.723),l(-.121,.017),l(-.795,-.015),l(-1.055,-.177),l(.26,.423),l(-.026,.455),l(-.386,.407),l(-.794,.39),l(-1.16,.164),l(-.973,.002),l(-1.255,.083),l(.467,.403),l(.212,.403),l(-.09,.387),l(-.379,.097),l(-.321,-.063),l(-.47,.033),l(-1.792,-.157),l(.517,.32),l(.765,.462),l(.295,.351),l(-.01,.224),l(-.26,.176),l(-1.197,.034),l(-1.051,.129),l(.844,.413),l(.47,.126),l(.448,.222),l(.389,.333),l(-.554,.461),l(-.285,.111),l(-.599,-.094),l(-.478,.096),l(.345,.474),l(-.009,.127),L(308.501,60),l(-.486,-.125),l(-.583,-.062),l(.026,.158),l(.255,.457),l(-.101,.347),l(-.288,0),l(-.656,-.093),l(-.089,-.016),l(-.979,.112),l(-1.081,.018),l(.682,.487),l(1.108,.391),l(.331,.204),l(-.077,1.035),l(-.382,.938),l(-.427,.094),l(-.815,-.061),l(.489,.591),l(-.016,.498),l(.156,.233),l(-.068,.373),l(-.316,.062),l(-.495,-.03),l(-.771,.079),l(.762,.386),l(.427,.603),l(-.117,.447),l(-.287,.031),l(-.967,-.26),l(-1.052,-.508),l(-.498,.294),l(-.425,.602),l(-.635,-.599),l(.158,-.573),l(-.387,-.201),l(-1.124,-.184),l(-.577,-.309),l(.04,-.187),l(.253,-.249),l(.066,-.218),l(-.325,-.28),l(-.366,-.186),l(-.668,.359),l(-.276,.016),l(-.3,.141),l(-.444,-.046),l(-.98,.064),l(-.417,.017),l(-.571,.296),l(-.476,.28),l(-.426,-.403),l(-.104,-.357),l(-.222,-.217),l(-.513,-.233),l(-.817,-.232),l(-.772,-.389),l(-.517,-.781),l(.07,-.737),l(-.199,-.156),l(-.434,-.094),l(-.467,.048),l(-.97,-.266),l(-.108,-.094),l(-.138,-.236),l(.14,-.457),l(.459,-.395),l(.071,-.269),l(-.258,-.062),l(-.551,-.031),l(-.542,-.094),l(-.278,-.221),l(-.058,-.633),l(-.458,-.126),l(-.616,.049),l(-.589,-.57),l(.023,-.191),l(.198,-.254),l(.618,-.367),l(1.22,-.337),l(.405,-.304),l(.476,-.128),l(.051,-.383),l(-.277,-.287),l(-.473,.097),l(-.921,.082),l(-.493,.097),l(-.635,.416),l(-.538,.129),l(-.63,.304),l(-.339,-.318),l(.038,-.623),l(-.114,-.784),l(-.206,-.451),l(.015,-.355),l(-.243,-.323),l(-.504,.082),l(-.271,-.032),l(-.666,-.355),l(-.594,-.485),l(-.013,-.357),l(.842,-.538),l(.265,.019),l(-.556,-.189),l(-1.083,.064),l(-.103,-.284),l(.383,-.176),l(.677,-.03),l(.586,-.052),l(.456,-.087),l(.322,-.672),l(-1.208,-.047),l(-.572,.05),l(-.362,-.032),l(-.29,-.163),l(-.116,-.197),l(.223,-.28),l(.218,-.008),l(.18,-.16),l(.427,-.055),l(-.375,-.188),l(-.552,.073),l(-.22,-.248),l(.057,-.188),l(.073,-.132),l(.259,0),l(.309,-.099),l(.827,-.25),l(1.218,.081),l(.854,.163),l(.776,.032),l(.378,.131),l(.927,.146),l(1.027,.097),l(-.031,-.363),l(.299,-.545),l(-.298,-.182),l(-1.02,-.263),l(-1.356,-.312),l(-.903,-.164),l(-1.592,-.33),l(-.354,-.116),l(.336,-.35),l(.788,-.001),l(1.462,.363),l(1.034,.048),l(.463,-.067),l(.114,-.067),l(.088,-.6),l(.088,-.301),l(.595,-.034),l(.528,.116),l(.227,-.101),l(-.027,-.351),l(-.195,-.184),l(-.891,-.317),l(.162,-.437),l(.528,-.455),l(-.258,-.286),l(-1.21,-.167),l(-1.154,.002),l(-1.178,-.286),l(-1.649,-.49),l(-.78,-.101),l(-.903,-.05),l(-.76,-.34),l(-.811,-.477),l(.156,-.035),l(.323,-.155),l(.605,-.001),l(.572,-.019),l(2.085,.305),l(.716,.033),l(1.249,.306),l(1.451,.458),l(.729,.169),l(.056,-.307),l(-.311,-.426),l(-.86,-.546),l(-.172,-.446),l(-.603,-.446),l(-.485,-.051),l(-.677,-.24),l(.361,-.277),l(.542,-.139),L(285.644,41),l(-.704,-.241),l(-1.101,-.015),l(-.625,-.086),l(-1.132,-.327),l(-.88,.608),l(-.324,.156),l(-.274,.294),l(-.875,.243),l(-1.402,-.066),l(-1.031,-.343),l(-.306,-.242),l(-.027,-.294),l(.438,-.313),l(.293,-.645),l(-.152,-1.259),l(.582,-.054),l(.691,.192),l(.372,-.124),l(.151,-.334),l(-.383,-.369),l(-.933,-.545),l(-.452,-.141),l(-.946,-.796),l(-.895,-.925),l(-1.105,-1.289),l(-.578,-.485),l(-1.855,-.379),l(-.667,-.255),l(-.291,-.202),l(-.052,-.701),l(-.904,-.406),l(-.962,-.109),l(-1.589,-.165),l(-1.928,-.425),l(-1.903,-.333),l(-2.133,-.183),l(-.997,-.054),l(-1.632,-.035),l(-.785,.189),l(-1.043,.096),l(-.806,.188),l(-1.419,.152),l(-1.228,-.166),l(-1.46,-.296),l(.319,.747),l(-.051,.093),l(-1.051,-.017),l(-1.294,-.184),l(-3.168,-.611),l(1.538,-.566),l(.463,-.114),l(-.092,-.226),l(-.423,-.169),l(-1.067,-.017),l(-2.21,-.015),l(-.812,-.074),l(-.629,-.018),l(-1.238,-.434),l(-.87,-.208),l(.587,-.306),l(1.257,-.041),l(3.036,.147),l(2.025,.034),l(1.343,.017),l(2.117,-.157),l(1.055,-.212),l(.292,-.096),l(.054,-.345),l(-.627,-.287),l(-.82,-.21),l(-1.217,.156),l(-1.11,.252),l(-1.31,.021),l(-1.138,-.113),l(-.753,.078),l(-.879,.098),l(-.68,-.056),l(-.857,-.19),l(-.664,-.365),l(-.816,-.191),l(-.662,-.057),l(-.726,.059),l(-.486,-.076),l(-1.416,-.481),l(-.044,-.35),l(.36,-.45),l(.81,-.119),l(1.235,-.1),l(1.517,-.14),l(2.074,-.161),l(1.29,-.081),l(.951,-.396),l(1.089,-.259),l(.843,-.081),l(2.478,-.005),l(1.101,-.101),l(1.942,.036),l(.402,-.139),l(.31,-.199),l(.609,-.16),l(.202,-.658),l(.276,-.501),l(.116,-.101),l(-.89,-.228),l(-1.947,-.039),l(-1.155,.194),l(-.959,-.125),l(-1.243,-.383),l(.595,-.781),l(1.38,-.332),l(2.845,-.359),l(1.407,-.225),l(1.962,-.249),l(2.112,-.162),l(1.163,.087),l(1.213,-.07),l(1.319,-.07),l(.345,-.181),l(.011,-.226),l(-.357,-.753),l(-.022,-.208),l(.522,-.14),l(1.886,-.05),l(1.526,.205),l(2.141,.41),l(1.296,.226),l(.802,.181),l(.823,-.275),l(-1.657,-.525),l(-.697,-.509),l(.167,-.047),l(2.2,-.122),l(1.166,-.12),l(1.854,-.216),l(2.52,-.195),l(.73,.069),l(1.064,.116),l(.232,1.738),l(.913,-.162),l(.539,-.322),l(.432,-1),l(1.003,.021),l(2.004,.323),l(1.858,.414),l(1.529,.25),l(.205,-.3),l(-.644,-.3),l(-.816,-.537),l(-.894,-.4),l(.295,-.287),l(.742,.022),l(1.758,.02),l(1.136,.212),l(2.754,.373),l(1.284,.279),l(2.109,.322),l(1.878,.274),l(1.872,.204),l(.8,-.209),l(.816,-1.483),l(-.326,-.191),l(-1.292,-.334),l(-1.176,-.533),l(.708,-.247),l(2.404,-.005),l(2.962,-.328),l(1.329,-.077),l(1.527,.17),l(2.221,.488),l(1.567,.167),l(2.005,.142),l(.3,-.761),l(-.3,-.472),l(2.646,-.206),l(2.021,-.08),l(2.589,.095),l(1.989,.146),l(1.886,-.18),l(2.367,-.207),l(2.043,-.005),l(1.859,.223),l(1.825,-.055),l(1.315,.072),l(.619,.099),l(.55,-.102),l(1.946,.146),l(1.707,.046),l(1.673,.096),l(2.438,.761),l(1.368,.241),l(1.345,-.076),l(1.118,.168),l(2.594,.237),l(.445,.408),l(-.304,.12),l(-.492,.192),l(-1.683,.146),l(-2.303,.124),l(-1.152,.121),l(-1.233,.05),l(-1.469,-.068),l(-2.831,-.064),l(-2.22,-.066),l(-1.389,.168),l(-1.614,.027),l(-1.933,.027),l(-1.16,.026),l(-1.485,.168),l(-.444,.118),l(-1.322,.213),l(-.335,.464),l(.743,.251),l(2.551,-.281),l(1.367,-.072),l(3.912,.038),l(2.223,-.12),l(2.331,-.005),l(.997,-.025),l(.93,.067),l(1.77,.434),l(.671,.09),l(1.087,-.186),l(1.663,-.21),l(1.536,-.281),l(1.964,-.144),l(.59,.462),l(-.566,.482),l(-2.316,.639),l(-.973,.338),l(-1.281,.734),l(.12,.307),l(.319,.152),l(.796,-.089),l(.477,-.044),l(1.616,-.553),l(1.766,-.537),l(1.413,-.385),l(1.706,-.32),l(.775,-.207),l(1.662,-.163),l(1.618,.111),l(1.391,.065),l(1.497,-.3),l(.703,-.324),l(1.129,-.234),l(2.148,-.004),l(1.672,.112),l(1.097,.044),l(1.197,.136),l(1.135,.228),l(1.107,.112),l(.316,.25),l(-.181,.273),l(-1.97,.252),l(-1.491,.138),l(-1.245,.494),l(-.557,.289),l(-1.604,.355),l(-1.57,.548),l(-1.063,.089),l(-.918,-.042),l(-1.592,.047),l(-2.213,-.039),l(-1.491,.198),l(-.731,.217),l(-.495,.535),l(.166,.322),l(1.949,-.305),l(1.581,-.046),l(1.856,.101),l(.003,.42),l(-.743,.241),l(-2.388,.124),l(-.463,.14),l(-.213,.199),l(-.156,.595),l(-.471,.71),l(-.678,.158),l(-1.06,-.077),l(-.742,.041),l(-.837,.9),l(-.987,1.087),l(-.15,.347),l(.454,.307),l(.403,.095),l(.602,-.481),l(.743,-.368),l(.856,-.041),l(2.345,.266),l(.353,.096),l(.262,.288),l(-.059,.211),l(-1.234,-.074),l(-.673,-.018),l(-.512,.097),l(-.136,.191),l(.29,.286),l(1.756,.188),l(.557,.132),l(1.802,-.137),l(.526,.208),l(.214,.323),l(-.049,.436),l(-.256,.133),l(-1.835,-.186),l(-1.653,-.054),l(-.781,-.074),l(-1.295,.078),l(-1.382,.475),l(-.823,-.13),l(-.49,-.15),l(-1.06,.04),l(-.283,.377),l(1.393,.599),l(1.187,.222),l(1.298,.128),l(1.665,.072),l(.696,.148),l(.551,.482),l(.272,.444),l(.014,.554),l(-.434,.405),l(-.384,.074),l(-1.292,-.181),l(-.82,-.109),l(-.372,.111),l(.023,.55),l(.118,.236),l(.426,.162),l(.618,.089),l(.723,.215),l(.914,.142),l(.752,.16),l(.383,.376),l(-.338,.233),l(-.832,.145),l(-.647,.126),l(-1.747,-.032),l(-1.176,-.087),l(-1.624,-.086),l(-.592,.448),l(.551,.195),l(1.396,.051),l(1.052,.158),l(.724,.248),l(.088,.319),l(-.035,.549),l(-.13,-.005),l(-1.092,-.045),l(-1.247,.108),l(-.596,.266),l(-1.246,.02),l(-1.225,-.139),l(-1.497,-.404),l(-.922,-.478),l(-.373,-.07),l(-1.094,.286),L(345,36.811),l(-1.084,.09),l(-.589,.178),l(-1.451,-.033),l(-.913,-.087),l(-.969,.143),l(-.395,.125),l(-.174,.283),l(.006,.141),l(.354,.527),l(.71,.245),l(1.284,.05),l(1.515,.26),l(1.567,-.056),l(1.323,.54),l(.758,.226),l(.482,.226),l(1.196,.329),l(1.252,.38),l(.376,.276),l(.483,.898),l(.892,-.208),l(.278,-.139),l(.397,.207),l(.298,.43),l(.071,.344),l(.198,1.164),l(-.169,.205),l(-.371,.12),l(-.541,-.101),l(-.546,-.119),l(-.917,.002),l(-1.041,.036),l(-1.488,-.27),l(-.637,-.409),l(-.415,-.634),l(-.354,-.274),l(-1.17,-.566),l(-.84,-.292),l(-.748,-.137),l(-1.095,-.084),l(-.521,.14),l(-.962,.105),M(351.365,40.026),l(-1.527,-.537),l(-.96,-.225),l(-.712,-.156),l(-.159,-.069),l(-.314,-.419),l(1.483,-.038),l(.893,.139),l(1.064,.26),l(.819,.296),l(.162,.488),l(-.215,.209),l(-.533,.053),M(281.574,46.135),l(-.568,-.133),l(-.707,-.318),l(-.801,-.183),l(-.197,-.101),l(-.25,-.218),l(-.08,-.844),l(.287,-.34),l(.368,-.018),l(.646,.135),l(1.157,.066),l(1.287,.27),l(.748,.269),l(.595,.1),l(.777,.217),l(.603,.335),l(-.144,.202),l(-.112,.034),l(-.543,.051),l(-.774,.035),l(-.77,.186),l(-1.009,.153),l(-.511,.102), +N(105.98,81.688),l(-.952,-.826),l(-.198,-.342),l(-.024,-.476),l(.095,-.104),l(.408,.044),l(.312,-.045),l(.781,.177),l(.658,-.076),l(.28,.119),l(.138,.163),l(-.234,.224),l(-.173,.565),l(-.028,.312),l(-.581,.075),l(-.483,.19),M(125.24,92.375),l(-1.312,-.288),l(-1.345,-.434),l(-.218,-.174),l(.061,-.189),l(.376,-.466),l(-1.023,.002),l(-.413,.248),l(-.299,-.072),l(-.416,-.188),l(.166,-.452),l(-.487,-.334),l(-.269,-.014),l(-.735,-.086),l(-.226,-.262),l(.317,-.292),l(-.976,-.524),l(-.556,.118),l(-.386,-.102),l(-.852,-.511),l(-1.277,-.863),l(-.219,-.235),l(.02,-.117),l(.962,-.12),l(.337,.043),l(1.979,.598),l(.981,.204),l(1.772,.202),l(.385,.263),l(.618,.526),l(.426,.642),l(.433,.422),l(.362,.189),l(1.587,.536),l(.316,.203),l(.48,.756),l(.116,.407),l(-.279,.349),l(-.407,.016),M(271.379,92.089),l(-1.202,-.23),l(.641,-.743),l(.358,-.161),l(.279,.058),l(.292,0),l(.355,-.263),l(-.697,-.653),l(.079,-.219),L(272,89.003),l(1.121,-1.35),l(1.454,-1.31),l(.725,-.442),l(.496,-.192),l(1.315,-.194),l(.198,.073),l(.11,.221),l(-.299,.221),l(-.582,.03),l(-.242,.133),l(.349,.44),l(-.755,.78),l(-1.226,1.438),l(-.271,.526),l(.113,.291),l(.11,0),l(.428,-.176),l(.483,-.555),l(.458,-.191),l(1.115,.305),l(-.896,.687),l(.261,.203),l(.229,.072),l(1.423,.565),l(.758,-.03),l(.325,-.408),l(.309,-.059),l(.718,.057),l(.826,.202),l(.616,.231),l(-.297,.292),l(-.373,.233),l(-.708,.467),l(.339,.333),l(.477,.362),l(.26,.014),l(.417,-.161),l(.464,-.132),l(.278,.116),l(.02,.16),l(-.254,.262),l(-.404,.248),l(-.892,.104),L(280.84,93),l(.273,.362),l(.124,.405),l(.28,.231),l(.183,-.203),l(.309,-.262),l(.527,.159),l(-.099,.449),l(.149,.275),l(.716,.028),l(.085,-.015),l(.015,.203),l(-.168,.304),l(-.25,.652),l(-.34,.651),l(-.222,-.072),l(-.71,-.128),l(-.301,-.144),l(-.042,-.651),l(-.601,.406),l(-.374,.015),l(-.095,-.274),l(.497,-.652),l(.011,-.333),l(-.421,-.478),l(-.279,-.072),l(-.388,.392),l(-.423,.291),l(-.365,.146),l(-.435,.204),l(-.552,.536),l(-.496,.334),l(-.881,-.042),l(-.222,-.217),l(.165,-.145),l(1.229,-.408),l(.466,-.522),l(.632,-.363),l(-.699,-.129),l(-.601,-.057),l(-.322,.464),l(-.412,.015),l(-.13,-.159),l(.04,-.493),l(-.757,.016),l(-.148,.29),l(-.41,.218),l(-1.052,.045),l(-.709,-.057),l(-1.139,-.186),l(-1.012,-.085),l(-1.355,.061),l(-1.014,.147),l(-.145,-.188),l(-.215,-.463),l(.187,-.175),l(.561,-.334),l(.734,-.408),l(.502,-.161),l(.636,-.335),M(265.435,98.655),l(-.469,-.057),l(-.497,-.273),l(-.356,-.562),l(.062,-.635),l(.742,-.738),l(.932,-1.043),l(.816,.432),l(-.375,.435),l(-.112,.462),l(-.233,.333),l(-.262,.116),l(-.58,.319),l(-.244,.448),l(.522,.244),l(.168,-.029),l(.279,-.26),l(.42,-.362),l(.617,-.319),l(.309,.057),l(.495,.461),l(-.177,.347),l(-.246,.159),l(-1.134,.42),l(-.682,.044),M(211.34,59.677),l(-.68,-.046),l(.068,-.872),l(-.375,-.333),l(-.958,.161),l(-2.375,.29),l(.107,-.461),l(.56,-.303),l(1.644,-.561),l(-.302,-.478),l(-.102,-.415),l(.106,-.417),l(.398,-.835),l(.434,-.566),l(.254,-.648),l(.331,-.471),l(1.11,.566),l(-.312,.518),l(.791,.386),l(.527,.047),l(.402,-.469),l(.67,.112),l(.806,.289),l(.917,.514),l(.582,.255),l(2.168,.492),l(.442,.271),l(.176,.255),l(-.09,.925),l(.539,.047),l(.57,-.065),l(.934,.046),l(.701,.142),l(1.019,.427),l(-.419,.096),l(-.269,.127),l(-.46,.271),l(-.949,-.046),l(-.623,-.125),l(-1.328,-.125),l(-.438,-.126),L(217.259,58),l(-.528,-.301),l(-1.017,-.237),l(-.528,.017),l(-.203,.271),l(.174,.588),l(-.126,.096),l(-1.314,.161),l(-.673,.493),l(-.588,.302),l(-1.116,.287),M(200.125,19.1),l(-.862,-.015),l(-1.085,-.195),l(-.308,-.664),l(.819,-.304),l(.77,-.072),l(.666,-.024),l(3.475,-.125),l(1.263,-.12),l(1.374,-.026),l(1.714,.324),l(.397,-.094),l(.397,-.377),l(1.303,-.287),l(1.759,-.099),l(1.975,.209),l(.746,-.001),l(2.562,.137),l(2.621,.324),l(1.424,.09),l(1.461,.161),l(.448,-.165),l(-1.433,-.42),l(-1.67,-.352),l(-.816,-.429),l(.293,-.242),l(1.361,-.148),l(1.101,-.246),l(1.431,-.101),l(2.382,-.201),l(1.666,.119),l(1.944,.191),l(1.009,.265),l(1.19,.456),l(.354,.047),l(.273,-.362),l(-.959,-.508),l(-.828,-.292),l(.499,-.248),l(1.45,.121),l(1.832,.168),l(1.653,.07),l(1.639,.46),l(.378,.023),l(.062,-.195),l(-.301,-.539),l(1.781,-.004),l(1.408,.046),l(.832,.269),l(.831,.34),l(.618,-.001),l(-.044,-.268),l(-.331,-.467),l(1.075,-.077),l(3.691,.386),l(2.726,.288),l(1.937,-.077),l(2.987,.018),l(.967,.047),l(.757,.12),l(.126,0),l(1.419,.094),l(1.089,.191),l(.744,.095),l(1.685,.044),l(1.357,.357),l(-.385,.358),l(-1.237,.121),l(-1.206,.356),l(-1.849,.191),l(-.978,-.045),l(-2.191,-.159),l(-2.284,.005),l(-.776,.142),l(-1.915,.168),l(-.597,.465),l(.75,.366),l(.761,.044),l(1.03,-.048),l(1.705,-.279),l(.79,.021),l(.808,.434),l(-.168,.114),l(-1.246,.139),l(-1.38,.207),l(-1.174,.295),l(-2.098,.518),l(-1.316,.224),l(-1.19,.355),l(-.924,.286),l(-2.252,.005),l(.65,.906),l(-.449,.193),l(-2.297,.455),l(-.768,-.019),l(-1.587,-.037),l(-1.462,-.218),l(-2.386,-.164),l(-.66,.33),l(2.591,.695),l(-.662,.141),l(-.967,-.038),l(-1.297,.022),l(-1.068,.022),l(-2.58,-.214),l(-2.009,.063),l(-.134,.66),l(1.257,-.105),l(1.065,.018),l(2.312,.292),l(.557,.157),l(.12,.67),l(-.33,.197),l(-1.031,.12),l(-.515,.705),l(-1.073,.021),l(-.448,-.058),l(-.402,.176),l(.297,.253),l(.759,.25),l(-.328,.136),l(-1.615,.08),l(-.867,-.037),l(-1.71,-.171),l(-.422,.078),l(.41,.791),l(-.08,.231),l(-.649,.289),l(-.767,.155),l(-1.52,-.112),l(-2.039,-.111),l(-1.43,-.227),l(-1.008,.079),l(-1.219,.5),l(1.031,.112),l(.368,.057),l(2.154,.11),l(1.759,.13),l(1.534,.168),l(2.001,.034),l(.66,.34),l(.045,.359),l(-.907,.398),l(-2.685,.268),l(-.927,.115),l(-1.054,.227),l(-1.115,.077),l(-.467,-.28),l(-.797,-.638),l(-.56,.039),l(-.631,.001),l(-1.453,-.318),l(-.001,.17),l(.331,.508),l(-1.477,-.016),l(-1.5,-.129),l(-.875,-.319),l(-1.033,-.471),l(-.388,.058),l(.527,.717),l(-.24,.17),l(-.821,.133),l(-1.72,-.109),l(-2.276,-.033),l(-.972,-.073),l(-1.382,-.394),l(-.642,-.131),l(-.282,.453),l(-.619,.152),l(-1.843,-.316),l(.161,-.586),l(.219,-.228),l(1.525,-.117),l(.61,-.249),l(.961,-.173),l(1.179,.036),l(.499,-.172),l(-1.073,-.4),l(-1.043,-.651),l(.052,-.154),l(.479,-.117),l(1.316,.036),l(1.743,.093),l(.888,.21),l(1.108,.517),l(1.35,.323),l(1.085,.093),l(1.667,-.022),l(.829,-.136),l(.086,-.268),l(.514,-.304),l(-3.019,.001),l(-1.025,-.171),l(-.156,-.85),l(.211,-.154),l(-1.74,-.153),l(-1.963,-.152),l(-.274,0),l(-.631,.114),l(.204,-.758),l(1.159,-.551),l(1.104,-.16),l(1.837,-.003),l(1.164,.037),l(1.37,.076),l(2.023,.311),l(1.342,.115),l(.486,-.158),l(1.132,-.041),l(-3.399,-.802),l(-1.742,-.313),l(-3.555,-1.27),l(-.406,.242),l(-1.398,-.878),l(.025,-.258),l(.313,-.108),l(1.747,.104),l(1.905,-.004),l(2.019,.06),l(1.6,.382),l(2.535,.784),l(1.448,-.043),l(.833,.095),l(-1.387,-.555),l(-2.015,-.317),l(1.208,-.743),l(1.456,-.329),l(1.731,-.025),l(1.529,-.222),l(2.042,-.07),l(1.157,-.112),l(1.414,-.051),l(-1.778,-.479),l(-1.425,-.153),l(-2.501,.027),l(-1.243,.248),l(-1.305,.158),l(-1.425,.202),l(-1.447,.047),l(-.586,.067),l(-1.532,-.438),l(-.214,.111),l(-.543,.156),l(-2.16,-.018),l(-1.58,.365),l(.311,-.828),l(.98,-.292),l(.007,-.202),l(-.606,-.247),l(-1.375,-.156),l(-1.39,.003),l(-4.189,.505),l(-2.031,.672),l(-.408,-.11),l(-.569,-.251),l(.395,-.133),l(.678,-.023),l(-.117,-.316),l(-.698,-.398),l(-1.216,-.056),l(-.216,-.003),M(200.125,20.844),l(.899,-.096),l(.832,.196),l(.339,.5),l(.511,.495),l(.427,.063),l(1.141,.041),l(-.081,-.236),l(.056,-.411),l(.438,-.109),l(.718,.194),l(.718,.322),l(.374,.3),l(-.066,.171),l(.056,.826),l(.764,.442),l(.953,-.017),l(1.276,-.074),l(1.646,.504),l(-1.123,-.264),l(-1.528,.34),l(-1.599,.221),l(-.83,.377),l(-.287,.197),l(-.265,.315),l(-.448,.021),l(-1.493,-.41),l(-.656,.335),l(.465,.43),l(-.029,.235),l(-.412,.196),l(-.392,.04),l(-1.086,-.31),l(-.944,-.311),l(-.26,.645),l(-.117,.068),l(-.083,.049),l(-.888,.041),l(-1.74,-.094),l(-1.458,-.153),l(-.888,-.154),l(-.494,.021),l(-3.115,-1.31),l(-.191,-.276),l(1.971,-.241),l(3.32,.093),l(.889,.097),l(1.573,.1),l(-2.485,-.693),l(-3.019,-.213),l(-1.103,.122),l(-1.43,-.017),l(-.597,.18),l(-1.008,.022),l(-.606,-.198),l(-1.066,-.517),l(-1.425,-.479),l(-.341,-.355),l(1.971,.124),l(2.278,-.175),l(-1.255,-.249),l(-.756,-.351),l(.38,-.305),l(.729,-.132),l(.769,-.023),l(.921,.042),l(.156,-.219),l(-1.799,-.793),l(1.053,-.114),l(1.213,-.182),l(1.13,.087),l(.584,-.046),l(.145,-.18),l(-.514,-.475),l(1.362,.134),l(.941,.066),l(.83,.202),l(1.589,.869),l(.653,.264),l(.772,.24),l(.674,-.001),l(.36,-.039),M(179.067,27.216),l(-1.156,-.056),l(-.604,-.173),l(-.926,-.638),l(-.621,-.193),l(-3.102,-.091),l(-1.487,.081),l(-.622,.001),l(-1.444,-.056),l(-.767,-.154),l(-1.019,-.37),l(-.161,-.234),l(.335,-.138),l(.802,-.001),l(1.687,.232),l(.867,-.021),l(-.031,-.235),l(-.252,-.275),l(-1.344,-.49),l(-.579,-.098),l(-1.075,-.077),l(-1.392,-.196),l(.065,-.397),l(2.246,-.124),l(2.392,.155),l(.77,.376),l(.999,.453),l(1.979,.193),l(2.189,.114),l(1.178,.233),l(.604,.254),l(1.123,.721),l(.581,.446),l(.168,.426),l(-.481,.194),l(-.919,.137),M(185.907,26.758),l(-1.078,-.037),L(184,26.529),l(-1.029,-.484),l(-1.144,-.76),l(-.03,-.216),l(.239,-.099),l(2.296,-.044),l(1.816,.311),l(3.101,.542),l(-.047,.351),l(-.254,.331),l(-.436,.04),l(-1.563,.177),l(-1.043,.08),M(156.886,26.865),l(-1.573,.646),l(-.558,.27),l(-1.85,.042),l(-1.019,.079),l(-1.898,-.15),l(-.577,-.114),l(-.302,-.423),l(.334,-.291),l(1.365,-.177),l(.899,.056),l(2.351,-.102),l(.496,0),l(2.331,.163),M(132.902,31.305),l(-.53,-.186),l(-.95,-.466),l(-.424,-.112),l(-.33,.057),l(-.56,.207),l(-1.269,.059),l(-.786,-.279),l(-.283,-.319),l(.23,-.264),l(1.13,-.097),l(.503,-.133),l(.771,-.134),l(.977,-.399),l(.848,-.211),l(.726,-.172),l(.548,-.344),l(1.083,-.231),l(1.277,-.079),l(2.532,-.158),l(1.68,.016),l(.888,-.29),l(1.038,-.079),l(1.503,.438),l(-.756,.097),l(-.852,.231),l(-.22,.268),l(.12,.266),l(.469,.474),l(-.777,.001),l(-.912,.115),l(-.918,.662),l(-1,-.017),l(-.867,-.981),l(-.694,-.15),l(-.379,.02),l(-.229,.285),l(-.588,.342),l(-.63,.623),l(-.595,.151),l(-.284,.375),l(-.705,.356),l(-.787,.058),M(191.827,30.313),l(-1.266,-.054),l(-2.278,-.165),l(-.426,.058),l(-.332,-.094),l(-.896,-.489),l(-1.185,-.414),l(.192,-.229),l(2.433,-.042),l(1.542,.263),l(1.472,.054),l(.171,0),l(.89,.358),l(-.179,.246),l(.123,.32),l(-.263,.188),M(144.688,31.739),l(-2.222,-.395),l(-.325,-.674),l(.503,-.057),l(.595,-.17),l(.945,-.096),l(.953,-.133),l(1.279,-.059),l(.522,.187),l(.65,.374),l(.659,.186),l(1.55,-.209),l(.617,.149),l(1.624,.762),l(1.016,.351),l(.897,.036),l(.96,-.058),l(1.418,.09),l(.591,-.02),l(1.116,-.169),l(.092,-.297),l(-.557,-.559),l(-.941,-.391),l(-1.347,-.354),l(.96,-.322),l(.524,-.379),l(.569,-.152),l(1.097,-.116),l(.507,.17),l(.773,.678),l(-.017,.413),l(.518,.654),l(.565,.111),l(.9,.036),l(1.805,.406),l(-.334,-.465),l(.151,-.28),l(.409,-.076),l(1.495,.24),l(.932,.39),l(-.292,.409),l(.039,.5),l(-.358,.461),l(-.573,.277),l(-.755,.111),l(-.782,.001),l(-1.682,.095),l(-1.156,-.071),l(-1.757,-.18),l(-.622,-.017),l(-1.129,.277),l(-1.132,.202),l(-.76,.182),l(-.977,.254),l(-1.625,.292),l(-1.338,.2),L(149.23,34.5),l(-.748,-.07),l(-1.445,-.286),l(-.276,-.378),l(.648,-.128),l(1.219,-.038),l(.738,-.146),l(.852,-.075),l(1.166,-.057),l(.622,.017),l(1.09,-.149),l(.483,-.553),l(-2.768,-.087),l(-.925,-.054),l(-1.564,.28),l(-1.625,.168),l(-1.292,.04),l(-.795,.093),l(-1.681,-.347),l(-.479,.167),l(-.92,.075),l(-.979,-.127),l(-.854,-.33),l(.023,-.111),l(.863,-.427),l(1.098,-.058),l(2.047,-.022),l(.96,-.159),M(178.479,33.234),l(-.984,-.219),l(-.193,-.294),l(.764,-.389),l(.433,-.112),l(.088,-.167),l(-.447,-.333),l(-1.161,-.054),l(-2.13,.227),l(-.939,.076),l(-.331,.019),l(-.854,-.276),l(.039,-.335),l(.739,-.02),l(.542,-.244),l(.587,-.057),l(-.466,-.598),l(.176,-.245),l(.132,-.226),l(.49,.018),l(.859,.224),l(1.942,.746),l(.426,.186),l(.46,-.094),l(-.101,-.243),l(-.959,-.486),l(-.371,-.131),l(-.407,-.357),l(.436,-.095),l(.956,-.059),l(.713,.131),l(1.033,.262),l(.572,.168),l(.27,.018),l(.162,-.452),l(.478,-.133),l(.73,.112),l(.717,.168),l(.327,.168),l(.367,.75),l(-.034,.616),l(-.247,.242),l(-.831,.335),l(-.017,.352),l(.35,.625),l(-.361,.147),l(-1.648,-.089),l(-.862,.112),l(-1.446,.003),M(200.125,30.572),l(-.895,.045),l(-.853,.17),l(-.37,.467),l(1.133,.054),l(.984,-.038),l(.046,-.001),l(.847,.11),l(.463,.129),l(.498,.463),l(.727,.424),l(.621,.091),l(.213,-.074),l(.043,-.314),l(.286,-.056),l(1.075,-.002),l(.883,-.187),l(.766,.11),l(.835,.239),l(.665,.257),l(.976,.053),l(.775,-.463),l(1.393,-.281),l(1.704,-.114),l(1.951,-.246),l(1.533,.053),l(2.59,.014),l(.381,.037),l(.79,.314),l(.911,.239),l(1.418,.146),l(.653,.128),l(.21,.037),l(.361,.166),l(.181,.257),l(-.4,.148),l(-1.833,.407),l(-.135,.255),l(.469,.666),l(-2.486,.076),l(-.592,.02),l(-.651,.091),l(-.768,-.053),l(-.846,-.16),l(-.405,-.125),l(-.306,-.667),l(-.833,-.218),l(-.366,.129),l(.072,.723),l(-.536,.127),l(-.747,-.053),l(-.91,.109),l(-.728,-.017),l(-.495,.001),l(-1.342,-.213),l(-.593,-.197),l(-.495,-.017),l(-.209,.433),l(-1.801,.111),l(-.831,.074),l(-1.453,-.069),l(-.404,-.251),l(-.144,-.686),l(-1.237,.129),l(-.389,.181),l(-.326,.325),l(-.955,.2),l(-1.011,-.034),l(-.112,-.027),l(-.704,-.169),l(-1.186,-.575),l(-.675,.489),l(-1.131,-.07),l(-.666,-.688),l(-.442,-.717),l(.587,-.481),l(.019,-.371),l(-.292,-.316),l(-1.249,-.651),l(-.617,-.299),l(-.047,-.338),l(.636,-.133),l(1.226,-.078),l(2.472,-.023),l(.763,.093),l(1.118,.261),l(.188,.04),l(.872,.184),l(-.613,.189),l(-.259,.013),M(128.19,41.985),l(-.926,-.016),l(-1.059,-.102),l(-.362,-.466),l(-.549,-.467),l(-.432,-.259),l(-1.123,-.363),l(-1.36,-.067),l(-.951,-.138),l(-.469,-.19),l(-.168,-.174),l(.537,-.106),l(.589,-.298),l(.481,-.211),l(.08,-.386),l(-.437,-.809),l(.552,-.001),l(.468,-.177),l(.307,-.372),l(1.104,-.533),l(.526,-.588),l(-.121,-.32),l(-.271,-.16),l(-1.229,-.677),l(-.375,-.448),l(.869,-.001),l(.823,-.056),l(1.455,.051),l(.97,.016),l(1.515,-.092),l(1.284,-.146),l(1.242,-.074),l(.495,.125),l(3.242,.801),l(.918,.088),l(.708,-.055),l(1.316,-.127),l(1.223,.016),l(.771,.07),l(1.35,.373),l(2.389,.815),l(-.242,.143),l(-.432,.036),l(-.26,.072),l(-1.609,.322),l(-1.073,.144),l(-1.829,.428),l(-1.069,.319),l(-1.604,.725),l(-1.025,.563),l(-.549,.089),l(-.974,.124),l(.066,.924),l(-.271,.504),l(-.662,.278),l(-1.215,.124),l(-1.213,-.067),l(-.521,.485),l(-.898,.312),M(190.483,39.666),l(-1.146,-.208),l(-.146,-.524),l(-.941,-.806),l(-.207,-.582),l(.058,-.389),l(.27,-.657),l(.377,-.321),l(1.256,.033),l(-.089,-.16),l(-.416,-.266),l(-.185,-.286),l(.211,-.09),l(.234,-.072),l(2.154,-.058),l(1.215,.087),l(1.464,.248),l(1.282,.051),l(1.316,-.146),l(1.051,.016),l(.694,.105),l(.639,.213),l(-.007,.089),l(-.224,.179),l(-.824,.428),l(-.874,.746),l(-1.513,.92),l(-1.386,.073),l(-2.379,-.154),l(-1.269,.055),l(1.392,.717),l(-.188,.315),l(-.855,.369),l(-.964,.072),M(181.204,41.523),l(-.491,-.085),l(-1.101,-.552),l(-.952,-.641),l(-1.014,-.468),l(-.978,-.225),l(-1.438,-.12),l(-.55,-.174),l(-2.255,-1.066),l(.866,-.654),l(.653,.14),l(1.032,.474),l(1.063,.227),l(.46,.052),l(.615,-.283),l(.908,-.619),l(.415,-.036),l(.018,-.212),l(-1.062,-.565),l(-1.068,-.424),l(-.177,-.231),l(.132,-.107),l(1.683,.086),l(.711,-.215),l(.42,0),l(.996,.39),l(.56,.035),l(.58,-.055),l(.435,-.25),l(1.232,-.127),l(1.354,.069),l(.912,.23),l(-.324,.268),l(-.58,.125),l(-.323,.338),l(-1.55,.375),l(-.392,.16),l(-.069,.194),l(.253,.247),l(.506,.105),l(.692,-.089),l(1.08,.174),l(.868,.245),l(.391,.017),l(.564,.262),l(.186,.438),l(-.681,.352),l(-.156,.35),l(-.271,.68),l(-.457,.366),l(-.508,.14),l(-.658,.019),l(-.582,-.103),l(-.773,-.346),l(-.653,-.103),l(.013,.208),l(1.054,.553),l(-.817,.399),l(-.77,.036),M(243.524,60.394),l(-.234,-.208),l(-1.199,-.235),l(-.673,-.331),l(-.154,-.269),l(.346,-.064),l(.616,-.461),l(-1.378,-.521),l(-1.132,-.125),l(-.76,-.349),l(-.929,-.731),l(-.035,-.511),l(-1.115,-.062),l(-1.311,-.366),l(-.675,-.031),l(.284,.767),l(-.155,.096),l(-.409,-.015),l(-1.704,-.332),l(-.309,.033),l(-.325,.304),l(-.441,.288),l(-1.312,.082),l(-1.349,-.173),l(-1.343,-.189),l(-.813,-.254),l(-.052,-.319),l(.196,-.4),l(.382,-.354),l(1.066,-.163),l(.192,-.178),l(-.128,-.516),l(.206,-.033),l(1.357,.11),l(1.408,.175),l(.517,.144),l(.962,.626),l(.051,-.386),l(-.154,-.193),l(.077,-.194),l(.585,-.033),l(.977,-.099),l(.652,-.163),l(.649,-.114),l(.515,.063),l(.785,.031),l(.166,-.275),l(-1.138,-.825),l(-.773,-.356),l(-.119,-.228),l(.167,-.163),l(.586,-.066),l(.72,-.246),l(1.409,-.591),l(.361,-.541),l(.771,-.46),l(.493,-.379),l(-.109,-.593),l(-.899,-.841),l(-.407,-.496),l(-.541,-.364),l(-.414,.001),l(-1.258,-.33),l(-1.041,-.481),l(-.244,-.467),l(-.527,-.384),l(-.442,.202),l(-.551,.202),l(-.825,-.015),l(-.293,.117),l(-.62,.018),l(-1.255,.169),l(-.214,-.667),l(1.032,-.052),l(1.23,-.103),l(.163,-.269),l(-1.604,-.618),l(-1.552,-.67),l(-.879,-.015),l(-.567,-.185),l(-.169,-.542),l(-.677,-.339),l(-.45,-.05),l(-.918,-.306),l(-.687,-.341),l(-.385,-.119),l(-.611,.155),l(-.81,-.187),l(-1.177,-.238),l(-.489,-.085),l(-.379,.138),l(.529,.307),l(.453,.05),l(2.838,.712),l(.438,.271),l(.069,.306),l(-.505,.221),l(-.669,.069),l(-.541,-.033),l(-.757,-.049),l(-.818,-.252),l(-1.153,-.27),l(-.667,-.066),l(-.323,.17),l(.044,.204),l(.426,.236),l(.259,.438),l(-1.703,-.553),l(-.47,-.05),l(-.396,.119),l(-.63,.153),l(-.767,-.218),l(-.693,-.117),l(-.859,.12),l(-1.474,-.184),l(-1.995,-.167),l(-1.321,.037),l(-1.146,-.032),l(-.862,-.186),l(-.003,-.597),l(-.363,-.153),l(-.904,-.049),l(-.396,.342),l(-.623,.086),l(-1.214,-.049),l(-1.076,-.168),l(-1.303,-.477),l(-.415,-.376),l(.123,-.275),l(.868,-.07),l(1.131,.067),l(1.212,.101),l(.879,-.019),l(.312,-.19),l(-.934,-.463),l(-.8,-.275),l(-.905,-.102),l(-1.106,-.119),l(-.752,.036),l(-.539,-.017),l(-1.249,-.223),l(.114,-.416),l(.292,-.557),l(.34,-.14),l(.646,-.054),l(.081,-.227),l(-1.082,-.4),l(-.044,-.175),l(.449,-.79),l(1.197,-.919),l(.565,-.284),l(.918,-.321),l(.74,-.374),l(.423,-.037),l(.37,-.178),l(.698,-.001),l(.481,-.125),l(.71,-.09),l(1.436,-.109),l(1.348,.033),l(.857,.194),l(-.92,.393),l(-.815,.48),l(-1.394,.639),l(-.43,.529),l(.169,.369),l(1.256,.541),l(-.444,.298),l(-.076,.402),l(.257,.313),l(.862,.554),l(1.559,.621),l(-.096,.121),l(-1.272,.331),l(-.072,.31),l(.959,.033),l(1.504,.101),l(.654,-.639),l(-.103,-.415),l(-.343,-.277),l(-.724,-.103),l(-.422,-.138),l(-.884,-.538),l(.101,-.157),l(.506,-.245),l(.473,-.193),l(1.001,.12),l(.837,-.071),l(-1.204,-.47),l(-.703,-.034),l(-.793,-.279),l(-.056,-.193),l(.053,-.545),l(.886,-.319),l(1.207,.086),l(1.509,-.056),l(-.939,-.281),l(-1.233,-.351),l(.793,-.303),l(1.288,-.198),l(1.044,-.126),l(1.688,-.323),l(1.114,.016),l(.642,.052),l(.833,.141),l(.782,.478),l(1.536,.97),l(.058,.141),l(-.583,.687),l(-.709,.632),l(.038,.733),l(.364,.086),l(.65,.033),l(1.088,-.315),l(.284,-.455),l(.595,-.088),l(.791,.034),l(.454,.174),l(-.006,.262),l(.16,.47),l(.875,.189),l(.196,-.122),l(-.204,-.854),l(.218,-.123),l(.456,-.474),l(1.038,-.265),l(.98,-.054),l(.748,.034),l(.98,.174),l(1.172,.138),l(1.151,-.09),l(.688,.139),l(.327,.262),l(.621,.331),l(.574,.191),L(235.438,40),l(0,.191),l(-.531,.088),l(-.484,.279),l(-.818,.262),l(-.148,.225),l(.45,.259),l(.427,.068),l(.897,-.417),l(.652,-.174),l(.502,.051),l(.476,.242),l(.365,.466),l(.516,.413),l(.342,-.242),l(1.304,-.798),l(1.935,.256),l(.915,.361),l(-.051,.069),l(-.638,.346),l(-.708,.517),l(1.167,-.054),l(.455,-.173),l(1.078,-.105),l(.033,.704),l(.797,.324),l(.523,-.069),l(.831,-.207),l(1.316,-.088),l(.816,.221),l(.566,.273),l(-.162,.154),l(-.461,.223),l(-1.87,.43),l(-.238,.272),l(.523,.253),l(.456,-.068),l(.747,-.171),l(1.235,-.122),l(.406,-.29),l(.361,-.103),l(.479,.067),l(.51,.187),l(.544,.339),l(.636,.522),l(-1.019,.002),l(-1.2,.053),l(-.424,.135),l(.059,.269),l(.372,.134),l(1.333,.065),l(.938,.183),l(.543,.217),l(.233,.301),l(-.37,.034),l(-.748,.001),l(-1.011,-.082),l(-.875,-.216),l(-.824,-.065),l(-.316,.185),l(1.23,.583),l(-.216,.201),l(-1.552,.12),l(.245,.283),l(.437,.166),l(.551,.032),l(1.331,.364),l(1.312,.347),l(.247,.182),l(.039,.282),l(.351,.38),l(.75,-.217),l(.536,.049),l(1.413,.295),l(.298,-.067),l(.649,-.15),l(.61,.032),l(.752,.379),l(.862,.477),l(.376,.346),l(-.685,.1),l(-.801,.117),l(-.027,.444),l(.795,-.001),l(1.405,-.052),l(.51,-.132),l(.895,.048),l(-.386,.559),l(.918,.179),l(.514,-.001),l(.943,-.379),l(.685,.343),l(1.089,.407),l(.194,.098),l(-.275,.229),l(-.254,.099),l(-.103,.326),l(-.819,.05),l(-.718,-.21),l(-.247,-.048),l(-.794,.213),l(.968,.454),l(.279,.162),l(.057,.276),l(-1.057,.197),l(-.356,.228),l(-.312,.292),l(-.372,-.113),l(-.819,-.583),l(-.29,1.103),l(.354,.903),l(-.419,.065),l(-.677,-.257),l(-.751,-.176),l(-.205,-.177),l(-.018,-.243),l(-.315,-.274),l(-.93,.276),l(-.743,-.613),l(.051,-.292),l(.27,-.374),l(-.304,-.129),l(-.224,-.016),l(-.992,-.08),l(-.718,-.292),l(-1.17,-.617),l(-.769,-.292),l(-.762,-.048),l(-.452,.23),l(-.645,.083),L(250,52.592),l(.281,.179),l(1.05,.682),l(-.321,.114),l(-.686,.05),l(-.359,-.259),L(249.277,53),l(-.646,-.21),l(.275,.488),l(.859,.972),l(.604,.015),l(.587,.08),l(.5,.581),l(.612,.805),l(.513,.432),l(.615,-.321),l(.285,.047),l(.592,.399),l(.585,.271),l(1.38,.396),l(-.634,.113),l(-.213,.208),l(.254,.19),l(.568,.286),l(.962,.444),l(.324,.237),l(.242,.682),l(-.112,.428),l(-1.302,-1.155),l(-.554,-.237),l(-.027,.238),l(.118,.27),l(1.055,1.281),l(-.01,.3),l(-.926,-.125),l(.053,.205),l(.432,.409),l(.378,.519),l(-.563,-.172),l(-.615,-.313),l(-.889,-.693),l(-.145,-.031),l(-.719,.064),l(-.91,-.188),l(-1.44,-.662),l(-.319,-.285),l(-1.062,-.665),l(.187,.777),l(-1.22,-.473),l(-.567,-.158),l(-.872,-.03),l(.095,.222),l(.799,.696),l(.853,.426),l(1.842,.645),l(1.296,.644),l(.774,.549),l(.442,.486),l(.429,.689),l(-1.833,-.341),l(-1.524,-.421),l(-1.251,-.28),l(-1.444,-.107),l(-1.092,-.25),l(-.898,-.644),l(-1.146,-.14),l(-.638,-.204),l(-.635,-.141),l(-.058,.145),M(146.194,38.698),l(.818,-.037),l(.78,-.125),l(1.138,-.548),l(.895,-.019),l(1.723,.243),l(.939,.262),l(-.188,.877),l(.515,-.071),l(.66,-.019),l(.792,-.229),l(.599,-.141),l(.758,.016),l(.334,-.071),l(-.989,-.965),l(.156,-.036),l(1.38,.138),l(1.208,.245),l(.675,.245),l(.259,.245),l(.194,.508),l(.965,1.063),l(.638,.346),l(1.045,-.315),l(.14,-.261),l(-1.243,-1.361),l(-.439,-1.321),l(.228,-.354),l(1.91,.262),l(1.775,.156),l(2.031,.719),l(.36,.175),l(.3,.316),l(.16,.701),l(.511,.645),l(.352,.26),l(.856,.606),l(.048,.19),l(-.178,.243),l(-.333,.605),l(.179,.31),l(.224,.12),l(1.4,.649),l(.509,.171),l(1.151,.254),l(1.513,.1),l(2.056,.576),l(1.012,.39),l(.364,.793),l(-.168,.101),l(-1.071,-.082),l(-.811,-.234),l(-.945,-.234),l(-.551,.169),l(-.665,.204),l(-1.021,.036),l(-.256,.118),l(.208,.689),l(1.087,-.069),l(.614,-.152),l(.676,-.119),l(.876,.536),l(-.01,.235),l(-.526,.151),l(-.517,.252),l(-.583,.102),l(-1.417,.12),l(-1.049,-.015),l(-1.194,-.082),l(-1.594,-.248),l(-2.278,-.499),l(-.553,-.217),l(-.436,-.335),l(-.482,-.033),l(-.581,.102),l(-.402,.37),l(-1.114,.505),l(-1.055,.019),l(-1.411,.103),l(-1.253,.42),l(-2.753,.356),l(-1.42,.019),l(-1.205,.086),l(-1.984,-.063),l(-.483,.101),l(-.916,-.015),l(-1,-.282),l(-.061,-.468),l(.198,-.101),l(.002,-.302),l(-.395,-.2),l(-.462,-.1),l(-3.146,-.112),l(-1.258,-.115),l(-.864,-.167),l(-.801,-.2),l(-.753,-.504),l(-1.274,-.554),l(.303,-.069),l(.531,-.222),l(1.572,-.054),l(.603,-.188),l(.558,.016),l(.91,-.019),l(.904,-.087),l(1.716,.031),l(.935,-.002),l(2.14,.047),l(1.09,-.002),l(1.711,-.038),l(.415,-.154),l(-.681,-.221),l(-2.312,-.492),l(-1.942,-.202),l(-4.059,-.061),l(-1.569,-.014),l(-1.694,.055),l(-.955,.053),l(-.604,.001),l(-1.651,-.529),l(.011,-.207),l(.28,-.069),l(.823,-.053),l(1.315,-.209),l(.996,.032),l(1.78,-.141),l(.931,-.105),l(.5,-.277),l(-.392,-.346),l(-2.023,.073),l(-1.578,.159),l(-.393,-.051),l(-.554,-.189),l(-.677,-.346),l(-.65,-.19),l(-.692,.054),l(-.709,-.242),l(-.039,-.279),l(1.304,-.981),l(2.62,-.848),l(.909,-.143),l(.373,-.177),l(1.297,-.267),l(1.324,-.162),l(.701,-.267),l(1.113,-.091),l(1.026,.246),l(-.07,.212),l(-.548,.354),l(-.021,.81),M(251.273,99.526),l(-.188,.153),l(-.16,-.291),l(.192,-.077),l(-.02,-.256),l(.143,-.069),l(-.042,-.154),l(-.224,0),l(-.606,-.231),l(.077,-.229),l(-.31,-2.819),l(-.174,-.274),l(-.488,-.288),l(-.771,-.025),l(-.41,.176),l(-.381,-.085),l(-.505,-.36),l(-.273,-.085),l(-.632,.526),l(-.514,.626),l(-1.139,2.22),l(-1.139,1.45),l(-1.161,-.124),l(-.402,.06),l(-.363,.435),l(-.174,.375),l(-1.093,-.095),l(-1.855,-.004),l(-2.508,-.029),l(-1.76,.009),l(-.968,.523),l(-.534,.305),l(-1.754,.814),l(-.545,.164),l(-.146,.434),l(-.163,.512),l(-.44,.275),l(-1.156,.197),l(-1.305,-.138),l(-1.123,-.01),l(-.93,.091),l(-.47,.203),l(-.162,.375),l(.018,.319),l(.16,.471),l(.047,.362),l(-.875,.427),l(-1.464,.452),l(-.944,.163),l(-.919,.062),l(-.88,.262),l(-.939,.478),l(-.925,.506),l(-.524,.117),l(-.573,-.068),l(-.497,-.169),l(-.371,-.427),l(-.012,-.33),l(.044,-.218),l(.707,-.525),l(.414,-.294),l(.264,-.433),l(.294,-.544),l(.377,-.576),l(.028,-.746),l(-.054,-.545),l(-.876,-3.16),l(-2.529,-1.05),l(-.26,-.33),l(.11,-.318),l(-.307,-.235),l(-.916,-.181),l(-.184,-.294),l(-.178,-.135),l(-.628,.024),l(-.46,-.465),l(-.101,-.429),l(-2.15,-1.061),l(-3.975,-1.576),l(-.977,-.386),l(-.797,-.227),l(-.805,.189),l(-1.469,.592),l(-.707,-.074),l(-.542,.049),l(-.196,-.144),l(-.156,-.115),l(-.474,-.041),l(-.855,.083),l(-.197,-.116),l(-.028,-.282),l(-.373,.075),l(-.412,.191),l(-.219,.06),l(-.573,.141),l(-.506,-.098),l(-.064,-.185),l(-.469,-.086),l(-.241,-.271),l(-.502,-.013),l(-.16,.247),l(-.338,-.48),l(-.271,.012),l(-.02,-.185),l(-1.425,-.208),l(-.518,.076),l(-.833,-.451),l(-.468,-.46),l(-.279,-.371),l(-.896,-.748),l(-.501,.036),l(.131,.347),l(.387,.588),l(-.68,-.003),l(-2.687,.029),l(-2.798,-.029),l(-1.348,.007),l(-2.105,-.003),l(-2.915,.016),l(-2.781,-.029),l(-2.131,.012),l(-2.935,-.014),l(-.601,.003),l(-4.84,-.018),l(-3.617,.004),l(-.875,.005),l(-3.821,-.023),l(-1.089,.035),l(-4.13,-.021),l(-.74,-.011),l(-5.117,.028),l(-1.687,-.006),l(-2.87,.001),l(-3.938,-.008),l(-4.588,.025),l(-1.335,-.022),l(-2.579,-.001),l(-.194,-.013),l(-.187,-.151),l(-.509,-.305),l(-.071,-.437),l(.074,-.346),l(-.708,.25),l(-.373,-.029),l(-.331,-.305),l(-.162,-.496),l(-.125,-.189),l(-.385,.088),l(-.23,.205),l(-.483,.059),l(-.721,-.495),l(-.119,-.425),l(-.201,-.821),l(-1.051,.104),l(-1.01,-.277),l(-.487,-.087),l(-.173,-.087),l(-.143,-.396),l(-.438,-.352),l(-.591,.222),l(-1.236,.046),l(-.461,-.117),l(-.383,-.249),l(-.106,-.25),l(.257,-.648),l(.458,-.222),l(-.227,-.294),l(-1.24,-.086),l(.617,-.518),l(.398,-.281),l(.547,-.149),l(.605,-.508),l(-.874,.006),l(-.621,.149),l(-.362,-.043),L(116,83.422),l(-.039,-.978),l(-.789,.002),l(-1.015,-1.066),l(.132,-.238),l(.034,-.53),l(-.547,.056),l(-.83,.492),l(-1.266,-.934),l(-.384,-.521),l(-.204,-.402),l(-.068,-.432),l(.419,-.404),l(.161,-.254),l(.436,-.3),l(-.358,-.689),l(-.393,-.777),l(.163,-.788),l(-.402,-.255),l(-2.025,-.763),l(-.98,-.314),l(-.189,-.029),l(-.512,-.393),l(-1.67,-1.882),l(-1.769,-1.768),l(-.814,-.58),l(-2.048,-1.175),l(-.35,-.322),l(-.371,-.492),l(-.316,-.199),l(-.832,-.073),l(-.495,.126),l(-.731,.498),l(-1.225,.67),l(-.848,.205),l(-.238,.325),l(-.945,-.673),l(-2.162,-1.318),l(-.348,-.292),l(-.173,-.387),l(-.332,-.388),l(-.739,-.059),l(-2.424,.122),l(-.84,-.074),l(-.196,-.279),l(-.089,-1.046),l(-.026,-2.167),l(.043,-4.334),l(.026,-2.183),l(-.129,-2.796),l(-.052,-2.335),l(-.039,-2.259),l(.003,-2.855),l(-.102,-.483),l(.71,.024),l(.9,-.086),l(.964,.116),l(2.012,.451),l(1.601,.518),l(1.214,.266),l(1.04,.115),l(.731,.032),l(1.619,.164),l(.888,.232),l(.429,.149),l(.254,-.034),l(-.452,-.601),l(-.357,-.2),l(-.345,-.15),l(-.064,-.419),l(1.344,-.423),l(.745,.066),l(.578,-.068),l(.15,-.102),l(1.736,.148),l(.771,-.001),l(1.125,-.373),l(.309,-.186),l(.442,0),l(.656,-.221),l(.759,-.069),l(.866,-.086),l(.734,-.086),l(.469,-.239),l(.392,-.188),l(.771,-.104),l(1.045,-.002),l(.872,.123),l(-.445,.404),l(-.352,.119),l(-1.101,.137),l(-1.092,.373),l(-1.244,.171),l(-1.22,.271),l(-.699,.522),l(-1.767,.255),l(-.681,.487),l(.846,.266),l(1.441,.748),l(-.219,-.55),l(.168,-.351),l(1.196,-.253),l(.39,-.235),l(.726,-.421),l(1.727,-.053),l(.96,-.372),l(1.158,-.389),l(2.066,-.173),l(.643,-.338),l(.921,-.272),l(.821,-.189),l(.476,-.239),l(-.178,-.272),l(-.702,-.392),l(-.655,-.444),l(.899,.101),l(.764,.272),l(.701,.306),l(.412,.324),l(.376,.476),l(.449,.523),l(.393,.235),l(1.246,.486),l(.186,.067),l(1.154,.216),l(.394,-.018),l(.199,-.151),l(-.511,-.639),l(.07,-.27),l(.548,-.035),l(.334,-.136),l(.627,-.103),l(.383,.354),l(.059,.421),l(-.205,.287),l(.833,.133),l(.938,-.069),l(1.136,-.457),l(.536,-.49),l(.479,-.069),l(1.131,.015),l(1.536,.267),l(1.745,.435),l(1.396,.334),l(2.095,.349),l(1.024,.216),l(.619,.066),l(1.572,.282),l(1.121,.065),l(1.144,.148),l(1.096,.032),l(1.4,-.086),l(.899,.099),l(1.008,.282),l(.982,.349),l(.434,.249),l(.191,.333),l(-.524,.134),l(-.935,-.032),l(-.566,.051),l(-.849,.135),l(-.354,.714),l(3.323,.358),l(1.726,.079),l(1.749,.014),l(.868,-.068),l(.738,-.051),l(.94,-.167),l(.895,-.118),l(.938,-.101),l(.886,.032),l(1.432,.477),l(1.452,.179),l(.42,.115),l(1.225,.443),l(-.013,.312),l(-.504,.083),l(-.35,.247),l(.305,.147),l(1.823,.979),l(-.162,-.392),l(-.024,-.312),l(.456,-.05),l(.617,-.132),l(-.062,-.181),l(-.972,-.656),l(-.128,-.198),l(-.145,-.445),l(.121,-.745),l(.35,-.034),l(1.944,-.136),l(.928,-.151),l(.207,-.299),l(.459,-.217),l(.613,-.035),l(1.098,.281),l(1.528,.279),l(.968,.064),l(.969,-.102),l(.612,.414),l(.248,.082),l(.962,.213),l(1.211,.13),l(.678,.081),l(1.146,-.002),l(.879,-.2),l(1.755,-.02),l(1.876,.029),l(1.07,-.052),l(1.18,-.267),l(.959,.478),l(.95,.296),l(.522,-.018),l(.243,-.314),l(-.017,-.513),l(-.666,-.231),l(-.732,-.131),l(-1.377,-.064),l(.089,-.449),l(1.193,-.085),l(.575,.065),l(.804,.214),l(.871,.198),l(.858,.048),l(.498,.198),l(.088,.183),l(-.095,.132),l(-.287,.86),l(.179,.51),l(.304,.164),l(.177,.065),l(.792,.097),l(.951,.311),l(-.071,-.559),l(-.466,-.989),l(.137,-.48),l(.258,-.266),l(.712,.015),l(.811,-.035),l(1.229,-.85),l(.492,-.051),l(.479,-.001),l(.517,-.151),l(.033,-.133),l(-.15,-.367),l(-.375,-.35),l(-.307,.001),l(-.81,.185),l(-.988,-.082),l(.535,-.52),l(.806,-.069),l(.435,-.168),l(.572,-.001),l(.739,.4),l(.464,.167),l(.065,-.268),l(-.081,-.956),l(-.744,.069),l(-.897,-.032),l(-.68,-.116),l(-.859,-.318),l(-.725,.085),l(-1.245,-.183),l(-.861,-.234),l(-.956,-.218),l(-.657,-.338),l(-.092,-.136),l(-.022,-.324),l(.33,-.137),l(.842,-.463),l(-.486,-.221),l(-1.188,-.375),l(.09,-.207),l(.58,-.604),l(.593,-.294),l(.387,-.035),l(1.032,.257),l(.139,-.035),l(.173,-.346),l(-.709,-.362),l(-.201,-.277),l(.23,-.035),l(.551,-.331),l(.367,-.035),l(1.841,-.021),l(.559,.086),l(.728,.189),l(1.26,.449),l(.432,.328),l(.195,.38),l(-.246,.603),l(1.261,.53),l(.809,.495),l(1.134,.493),l(-.377,.341),l(-.985,.036),l(-.474,.273),l(-.416,.557),l(.471,.067),l(1.071,.233),l(.805,.049),l(.387,-.136),l(.597,-.001),l(1.477,.351),l(-.335,.353),l(-.563,.219),l(.092,.151),l(.796,.467),l(.358,.601),l(.025,.833),l(.303,-.063),l(.021,-.004),l(.411,-.067),l(.608,-.367),l(.655,-1.137),l(.668,-.42),l(.523,.016),l(.731,.284),l(1.064,.55),l(.473,.383),l(.209,.45),l(-.159,.433),l(-.336,.034),l(-.796,-.098),l(-.202,.299),l(-.043,.415),l(.35,.396),l(1.146,.659),l(.61,.493),l(.463,.279),l(.595,-.166),l(.896,-.167),l(.369,-.132),l(.208,-.66),l(.764,-.398),l(.599,-.416),l(.249,-.664),l(.363,-.75),l(.237,-.184),l(1.394,.081),l(.329,-.067),l(.134,-.518),l(-.985,-.333),l(-.918,-.35),l(.088,-.891),l(.595,-.271),l(.787,.032),l(.42,-.068),l(.571,.016),l(3.459,.616),l(1.325,.669),l(.506,-.001),l(.553,-.068),l(.454,.201),l(.244,1.036),l(-.474,.268),l(-.431,.101),l(-.243,-.05),l(-.718,-.532),l(-.263,0),l(-.799,.269),l(.123,.316),l(.309,.515),l(.699,.729),l(.855,.528),l(1.108,.576),l(.024,.313),l(-.478,.642),l(-.439,.181),l(-1.407,.772),l(-.674,.083),l(-1.123,.509),l(-.763,-.276),l(-1.654,-.962),l(-.586,-.262),l(-.497,-.048),l(-.684,.281),l(1.364,.521),l(1.483,.896),l(-.708,.067),l(-.691,-.081),l(-1.288,.084),l(-.375,-.129),l(-.596,-.62),l(-1.147,-.014),l(-1.857,.118),l(-.253,.229),l(.614,.244),l(1.311,.421),l(-.159,.195),l(-.611,.327),l(-2.045,1.106),l(-.657,.179),l(-.527,.001),l(-.859,-.241),l(-.816,-.484),l(-.225,-.081),l(-1.189,-.225),l(-.736,-.259),l(-.598,-.112),l(-.947,.014),l(-.289,.004),l(-1.214,.174),l(1.503,.278),l(1.136,.21),l(1.751,.774),l(1.629,.433),l(1.233,.126),l(1.02,.031),l(-.618,1.091),l(-1.237,.705),l(-.856,.432),l(-.728,.161),l(-.829,.049),l(-.928,-.126),l(-1.062,-.38),l(-.048,.351),l(-.025,.287),l(.321,.572),l(-.02,.159),l(-.741,.031),l(-.058,.002),l(-1.365,-.108),l(-1.649,-.41),l(-.884,-.078),l(-2.962,-.322),l(2.146,.864),l(1.576,.156),l(1.367,.267),l(.562,.205),l(.33,.268),l(-.011,.19),l(-.642,.333),l(-1.106,.207),l(-1.429,-.076),l(-.511,-.062),l(-.367,.269),l(1.254,.423),l(-.469,.426),l(-1.06,.316),l(-1.454,.662),l(-.421,.252),l(.218,.704),l(-.313,.235),l(-.909,.205),l(-.31,.282),l(-.529,.64),l(-.276,.296),l(-.241,.669),l(-.274,.543),l(-.323,.666),l(.056,.416),l(-.161,.554),l(.123,.875),l(.136,.536),l(.598,.366),l(.25,.015),l(.257,.091),l(.664,.014),l(1.164,-.094),l(.276,.045),l(.367,.29),l(.413,.763),l(.813,1.157),l(.22,.668),l(-.132,.91),l(.673,.014),l(1.874,-.428),l(1.261,-.033),l(.723,.074),l(.535,.157),l(1.062,.311),l(2.129,.435),l(1.896,.903),l(.993,.933),l(3.5,.67),l(.644,.225),l(.982,.403),l(.986,.253),l(.553,.104),l(.702,-.091),l(.453,.044),l(.828,-.077),l(1.245,.163),l(1.407,.207),l(.401,.194),l(-.297,.702),l(-.142,.85),l(.154,.283),l(.307,.342),l(.07,.416),l(-.115,1.025),l(-.309,.593),l(.022,.208),l(.604,.266),l(.481,.339),l(.264,.354),l(.046,.488),l(-.076,.354),l(.97,.116),l(.963,.47),l(.676,.588),l(.392,.588),l(.078,.162),l(.64,.014),l(.726,.41),l(.907,.601),l(-.349,-.66),l(-.22,-.279),l(.134,-.338),l(.573,-.414),l(.365,.176),l(.381,.456),l(.262,.353),l(.165,-.354),l(.107,-.545),l(-.215,-.456),l(.541,-.532),l(.139,-.546),l(-.183,-.517),l(-.337,-.458),l(-.261,-.754),l(-.004,-.548),l(-.205,-.593),l(-.218,-.43),l(.615,-.016),l(-.097,-.476),l(-.296,-.252),l(-.657,-.163),l(-.375,-.282),l(-.326,-.923),l(1.252,-.271),l(.872,-.241),l(.625,-.271),l(1.758,-.949),l(.629,-.302),l(1.043,-.935),l(.434,-.544),l(.237,-.665),l(.054,-.529),l(-.257,-1.045),l(-.246,-.531),l(-.239,-.319),l(-.938,-.729),l(-.467,-.274),l(-1.105,-.532),l(-.363,-.122),l(-.453,-.274),l(-.151,-.046),l(-.293,-.351),l(.08,-.107),l(.868,-.522),l(.553,-.875),l(.293,-.416),l(.25,-.092),l(.447,-.017),l(.295,-.277),l(-.106,-.523),l(-.18,-.355),l(-.316,-.402),l(-.048,-.202),l(.258,-.357),l(.005,-.264),l(-1.751,-.105),l(1.084,-.92),l(.503,-.704),l(.007,-.125),l(-.316,-.203),l(-.609,-.265),l(-.244,-.266),l(-.043,-.533),l(.305,-.425),l(.554,-.315),l(.57,-.19),l(.827,.062),l(1.781,.374),l(1.097,.234),l(.753,.077),l(1.44,.013),l(1.08,-.144),l(.86,-.222),l(.21,-.047),l(.179,-.063),l(.589,.078),l(.991,.407),l(.254,.125),l(.754,.454),l(.918,.375),l(.796,.437),l(-.294,.391),l(.406,.233),l(1.698,.496),l(1.958,.354),l(.725,-.033),l(.368,-.203),l(.339,.295),l(-.013,.404),l(-.577,.343),l(-.123,.45),l(.438,1.327),l(.136,.722),l(.23,.414),l(-.049,.353),l(-.248,.169),l(-.445,-.014),l(-.347,-.015),l(-.138,.674),l(.375,.274),l(1.137,-.415),l(.366,-.047),l(.781,-.047),l(.286,.015),l(.677,.32),l(.378,.351),l(.004,.259),l(-.081,.123),l(.277,.32),l(.516,-.184),l(.306,-.046),l(1.173,-.079),l(.636,-.184),l(.436,-.383),l(.333,-.551),l(.326,.015),l(.194,.122),l(.693,.717),l(.042,-.062),l(.108,-.764),l(.317,-.583),l(.475,-.262),l(.539,-.385),l(-.651,-.505),l(.008,-.308),l(.272,-.139),l(.98,-.094),l(.193,-.139),l(.512,-.665),l(.667,.37),l(.607,.599),l(.785,.506),l(.596,.797),l(1.045,.764),l(.264,.352),l(-.344,.291),l(.095,.335),l(.573,-.031),l(.365,.777),l(.182,.183),l(.324,.121),l(.743,.136),l(.281,.258),l(.133,.38),l(-.379,.092),l(-.416,.168),l(.411,.318),l(.397,.227),l(.77,.196),l(.279,.227),l(.034,.424),l(-.056,.076),l(-.409,.106),l(-.676,-.029),l(-.745,-.12),l(-.316,.061),l(.091,.166),l(.273,.181),l(.189,.241),l(.333,.513),l(.411,.226),l(.634,.029),l(.462,.18),l(.838,.496),l(.899,.435),l(.246,.33),l(-.035,.195),l(-.447,.781),l(.508,.059),l(.663,-.166),l(.786,-.077),l(.79,.164),l(.574,.194),l(1.162,.49),l(.981,.132),l(1.517,.295),l(-.184,.253),l(-.718,.21),l(-.736,.21),l(-.663,.046),l(-.834,.24),l(-.583,.402),l(-.65,.225),l(-1.032,.061),l(-.286,.075),l(-.324,.268),l(.029,.371),l(-.271,.535),l(1.175,-.343),l(.542,-.09),l(.649,-.105),l(1.201,-.774),l(1.251,-.478),l(1.146,-.106),l(.662,.237),l(.35,.341),l(-.398,.446),l(.036,.119),l(.307,.296),l(.616,-.224),l(.455,-.164),l(.655,.192),l(1.051,.487),l(.226,.251),l(.022,.178),l(-.299,.43),l(-.05,.355),l(-.406,.444),l(1.001,.929),l(-.365,.37),l(-.795,.282),l(-1.078,.621),l(-.662,.281),l(-1.097,.046),l(-.823,.119),l(-1.548,.077),l(-.433,.413),l(-.916,.795),l(-.686,.427),l(-.612,.294),l(-.938,.222),l(-1.494,.172),l(-1.845,.127),l(-1.452,-.07),l(-2.031,-.084),l(-.355,.03),l(-1.073,.075),l(-1.058,-.012),l(-1.873,-.099),l(-.917,-.027),l(-1.758,.106),l(-.547,.206),l(-.523,.294),l(-.537,.585),l(-.205,.554),l(-.287,.335),l(-.591,.19),l(-1.07,.104),l(-.537,.147),l(-1.098,.555),l(-.774,.54),l(-.794,.612),l(-.325,.363),l(-.33,.233),l(-.868,.843),l(-.485,.566),l(-.418,.276),l(-.46,.58),l(-.518,.968),l(.749,-.737),l(.375,-.131),l(.688,-.479),l(1.059,-.944),l(1.097,-.785),l(2.028,-.948),l(1.245,-.395),l(1.797,-.512),l(1.065,-.235),l(1.03,-.235),l(1.473,-.148),l(.922,.056),l(.895,.289),l(.509,.29),l(.136,.189),l(.144,.464),l(-.125,.218),l(-.326,.219),l(-1.059,.292),l(-.753,.452),l(-.581,.044),l(-.845,-.23),l(-.726,.045),l(-.645,.19),l(.279,.08),l(1.13,.229),l(.17,.122),l(.256,.444),l(.074,.095),l(1.299,-.485),l(-.028,.216),l(.479,-.148),l(.372,.162),l(-.36,.229),l(-.231,.256),l(.112,.27),l(-.163,.014),l(-.074,.229),l(-.91,.444),l(1.216,.013),l(.077,.188),l(-.187,.282),l(.091,.43),l(.118,-.081),l(.239,.134),l(-.063,.134),l(.048,.202),l(.351,.457),l(.009,.147),l(.824,.054),l(.154,.094),l(.04,-.067),l(.727,.147),l(-.315,.134),l(-.373,-.013),l(-.047,.134),l(.525,.147),l(.211,.241),l(.569,-.081),l(.135,.134),l(.212,-.014),l(.134,.174),l(.418,-.04),l(-.075,-.107),l(.843,.067),l(.241,.107),l(-.207,.201),l(.242,-.107),l(.26,.027),l(.245,-.013),l(.696,-.362),l(.303,-.081),l(.104,.362),l(.377,.161),l(.538,-.121),l(.488,.416),l(-.405,.254),l(.089,.107),l(.825,.027),l(.164,.174),l(-.521,.121),l(-.161,-.121),l(-.3,.134),l(.118,.094),l(-.515,0),l(-.23,-.04),l(.109,.161),l(-.45,.04),l(.056,.107),l(-.443,.014),l(-.128,.147),l(-.45,.04),l(-.368,.253),l(-.09,-.106),l(-.706,.28),l(-.046,.053),l(-.529,.133),l(-.119,-.267),l(-.274,.106),l(-.163,.267),l(-.188,-.187),l(-.068,.253),l(-.218,.08),l(-.094,.187),l(-.513,0),l(-.081,-.08),l(-.169,-.053),l(.032,-.347),l(-.242,.36),l(-.202,.12),l(-.131,-.253),l(-.354,.027),l(.043,.24),l(-.233,.04),l(.312,.08),l(.033,.213),l(-.103,.12),l(-.174,-.067),l(-.768,.453),l(.127,.16),l(-.235,.12),l(-.194,.053),l(.015,.213),l(-.161,-.12),l(.083,.173),l(-.217,.08),l(-.14,-.107),l(.096,.253),l(-.222,.066),l(-.146,-.08),l(-.148,0),l(-.064,.133),l(-.156,-.106),l(-.243,.227),l(-.086,.292),l(-.201,-.226),l(-.344,.133),l(-.154,-.187),l(-.349,-.479),l(-.138,.24),l(-.419,-.866),l(.456,-.773),l(.284,-.16),l(.035,-.12),l(-.35,.12),l(-.357,.267),l(-.076,-.106),l(.924,-.507),l(.125,.146),l(.195,-.093),l(-.258,-.107),l(1.103,-.52),l(1.109,-.562),l(.658,-.361),l(.336,.094),l(-.067,.428),l(.179,-.054),l(.258,.281),l(-.044,-.201),l(-.017,-.174),l(.632,-.214),l(.73,-.134),l(.192,.067),l(.202,-.081),l(-.152,-.094),l(-.653,-.053),l(-.595,.053),l(-.42,-.053),l(-.804,-.014),l(-.306,.027),l(-.251,.081),l(-.246,.094),l(.033,-.214),l(1.128,-.563),l(.054,-.201),l(.252,-.08),l(-.052,-.174),l(-.523,.281),l(.097,-.134),l(-.502,-.51),l(.309,.443),l(-.36,.482),l(-.328,.013),l(-1.974,.817),l(-.284,.08),l(-.362,-.201),l(-.227,-.067),l(.23,.201),l(-.788,.401),l(-.219,-.174),l(-1.019,-.054),l(-.124,.147),l(-.38,-.241),M(186.193,47.833),l(-.713,-.032),l(-.922,-.181),l(-.882,-.065),l(-1.25,-.314),l(-.973,-.182),l(-.604,-.049),l(-1.083,-.199),l(.43,-.335),l(1.542,-.405),l(.385,-.186),l(.115,-.673),l(.305,-.236),l(.831,-.069),l(.743,.184),l(1.436,.603),l(1.287,.4),l(.074,.285),l(.315,.284),l(1.094,.516),l(-.288,.117),l(-1.263,.486),l(-.578,.051),M(231.09,50.646),l(-1.319,-.03),l(-.449,-.147),l(-.232,-.247),l(-.173,-.478),l(.3,-.43),l(.708,-.664),l(.662,-.267),l(1.359,-.168),l(.911,.197),l(.79,.314),l(-.021,.464),l(-.039,.727),l(-.362,.265),l(-1.025,.348),l(-1.108,.117), +N(444.972,79.145),l(.47,-.218),l(.307,-.093),l(-.294,-.024),l(-.419,.061),l(-.15,-.135),l(-.125,.184),l(-.108,-.012),l(.066,-.491),l(.177,-.218),l(.41,.009),l(1.489,.062),l(.417,.014),l(.339,-.075),l(.121,-.253),l(-.175,-.288),l(.246,-.05),l(-.068,-.122),l(-.068,-.123),l(.353,-.096),l(.12,-.034),l(.051,.154),l(.086,.052),l(.24,0),l(.223,.12),l(.257,.069),l(.514,.068),l(.086,.103),l(.223,-.051),l(.445,0),l(.257,0),l(.223,-.017),l(.086,.137),l(.103,.103),l(.188,.034),l(.171,.069),l(.018,.137),l(.052,.12),l(-.224,.12),l(-.068,.154),l(-.068,.206),l(.018,.171),l(.034,.137),l(.029,.038),l(-2.96,.101),l(-2.246,-.115),l(-.842,-.006),M(717.633,81.109),l(.42,.443),l(.429,.62),l(.183,.457),l(.01,.767),l(-.244,.442),l(-.197,.78),l(-.002,.764),l(.29,.777),l(.592,.849),l(.65,1.446),l(.899,1.614),l(1.115,1.679),l(-1.26,-.677),l(-.832,-.39),l(-.99,-.056),l(-.268,.088),l(-.396,.204),l(-.462,1.045),l(-.266,1.101),l(-.082,.579),l(.277,.982),l(.183,.216),l(.659,.908),l(.54,.201),l(.463,.648),l(-.314,1.246),l(-.664,-1.258),l(-.866,-.301),l(-.224,.029),l(-.415,.303),l(-.311,.534),l(-.643,.907),l(-.422,-.5),l(-.19,-.929),l(.637,-1.146),l(-.395,-.884),l(.175,-.454),l(.502,-.63),l(-.131,-.723),l(-.196,-.376),l(-.27,-.55),l(-.062,-.235),l(.403,-.302),l(.284,-.915),l(.075,-.784),l(.005,-1.326),l(.15,-1.302),l(-.09,-.732),l(-.213,-.469),l(-.83,-.85),l(-.1,-.897),l(.114,-.192),l(.359,-.722),l(.065,-.738),l(-.336,-.457),l(.172,-.237),l(.374,-.03),l(.62,-.031),l(1.023,-.534),M(471.158,84.281),l(-.002,-.142),l(-.165,-.066),l(-.082,-.115),l(-.164,-.082),l(.033,-.099),l(-.033,-.23),l(-.033,-.164),l(.082,-.099),l(-.147,-.131),l(-.099,-.148),l(.132,-.066),l(0,-.165),l(-.296,-.164),l(-.279,-.263),l(-.017,-.164),l(.099,-.131),l(.131,-.165),l(.362,-.017),l(.328,.049),l(.197,.132),l(.51,.016),l(.525,-.099),l(.444,-.247),l(.049,-.065),l(.148,-.083),l(.296,0),l(.065,-.164),l(-.033,-.131),l(-.279,-.066),l(-.296,-.148),l(-.099,-.181),l(.082,-.017),l(.066,-.049),l(.032,-.065),l(-.263,-.066),l(-.361,-.099),l(-.378,-.066),l(-.361,.066),l(-.182,-.066),l(.066,-.181),l(.099,-.197),l(-.066,-.148),l(-.164,-.099),l(-.279,-.082),l(-.23,-.066),l(-.443,-.213),l(-.115,-.23),l(-.164,-.263),l(-.214,-.017),l(-.017,-.099),l(.066,-.131),l(.099,-.115),l(-.132,-.033),l(-.181,.049),l(-.082,-.115),l(-.132,-.181),l(-.345,-.049),l(.049,-.147),l(.033,-.165),l(.099,-.049),l(.115,-.082),l(0,-.083),l(.114,0),l(.066,-.131),l(-.05,-.164),l(-.147,-.099),l(-.197,-.247),l(.131,-.165),l(.033,-.164),l(0,-.083),l(.065,-.115),l(-.049,-.115),l(-.147,.033),l(-.165,-.033),l(-.147,-.099),l(-.099,-.099),l(-.279,-.099),l(-.132,-.131),l(-.542,-.115),l(-.247,.049),l(-.099,-.049),l(-.131,-.049),l(-.23,.083),l(-.147,.099),l(-.165,0),l(-.279,.016),l(-.214,.197),l(-.197,0),l(-.164,-.148),l(-.065,-.148),l(.017,-.099),l(.164,-.099),l(0,-.115),l(-.147,-.017),l(-.296,-.065),l(-.312,-.049),l(-.361,.049),l(-.214,.065),l(-.197,.033),l(-.082,-.148),l(-.132,-.148),l(-.312,-.033),l(-.181,-.016),l(-.197,.131),l(-.229,-.066),l(-.165,-.147),l(.061,-.042),l(.015,-.117),l(.044,-.087),l(-.088,-.233),l(.015,-.189),l(-.131,-.117),l(.059,-.087),l(-.16,-.043),l(-.146,-.102),l(-.029,-.16),l(-.131,-.058),l(-.116,-.102),l(.043,-.073),l(.059,-.087),l(-.073,-.044),l(-.087,-.014),l(-.131,-.073),l(-.146,.015),l(-.204,.059),l(.044,-.102),l(.102,-.073),l(.073,-.087),l(-.029,-.117),l(.072,-.131),l(-.131,-.087),l(.103,-.029),l(.087,-.015),l(.102,-.073),l(.015,-.087),l(.029,-.116),l(.015,-.087),l(-.204,-.058),l(-.087,-.073),l(-.204,-.087),l(-.232,-.073),l(0,-.117),l(.015,-.116),l(-.37,.004),l(-.081,-.106),l(.116,-.058),L(461.402,72),l(.029,-.117),l(.131,0),l(.087,-.116),l(.059,-.102),l(.16,-.058),l(.262,-.043),l(.175,-.073),l(-.059,-.059),l(-.175,-.043),l(-.043,-.146),l(-.015,-.087),l(0,-.073),l(-.088,-.073),l(-.203,-.087),l(-.175,-.233),l(0,-.175),l(.175,-.131),l(-.029,-.16),l(-.073,-.189),l(-.131,-.437),l(-.029,-.16),l(.088,-.16),l(.204,-.131),l(.319,-.131),l(.219,-.204),l(.175,-.277),l(.058,-.131),l(.088,-.043),l(.116,0),l(.189,0),l(.175,-.044),l(.043,-.174),l(-.16,-.131),l(-.145,-.053),l(-.089,-.13),l(-.17,-.038),l(.1,-.253),l(.339,-.038),l(.153,.165),l(.229,.063),l(.188,-.088),l(-.094,-.139),l(.301,-.154),l(.485,.199),l(.296,-.062),l(.312,-.338),l(.311,-.185),l(.75,.106),l(.781,.275),l(.439,0),l(.363,-.154),l(-.386,-.399),l(-.59,-.323),l(-.393,-.03),l(-1.204,.08),l(-.616,-.091),l(-.271,-.108),l(-.299,-.309),l(.258,-.434),l(-.065,-.201),l(-.199,.044),l(.174,-.285),l(1.946,-1.145),l(1.983,-1.195),l(1.385,-.758),l(.591,-.536),l(.43,-.536),l(.105,-.409),l(-.161,-.346),l(-.436,-.392),l(-.703,-.265),l(-1.357,-.499),l(-.439,-.33),l(.327,-.191),l(.542,-.415),l(.057,-.254),l(-.151,-.253),l(-1.286,-1.395),l(-.37,-.509),l(.029,-.37),l(.187,-.403),l(.44,-.535),l(.196,-.356),l(-.772,-1.195),l(-1.402,-1.394),l(.328,-.296),l(1.303,-.777),l(.421,-.364),l(-.543,-.392),l(-.964,-.506),l(-.872,-.194),l(-.563,-.212),l(-.116,-.529),l(.258,-.465),l(.024,-.283),l(.689,-.303),l(1.013,-.672),l(1.023,-.49),l(.77,-.121),l(.824,-.021),l(.514,-.204),l(.404,-.288),l(.617,-.051),l(1.002,-.254),l(.643,-.237),l(.01,.151),l(.255,.386),l(.358,.284),l(.543,.2),l(.919,.082),l(.602,.1),l(.078,.602),l(.695,-.319),l(.421,.049),l(1.083,.048),l(.875,.015),l(.522,.032),l(1.116,-.002),l(1.293,.281),l(2.728,.512),l(.984,.364),l(1.595,.86),l(.583,.214),l(1.48,.246),l(1.296,.212),l(2.018,.623),l(.328,.279),l(-.051,.444),l(.147,.295),l(.426,.294),l(.104,.294),l(-.24,.344),l(-.69,.491),l(-1.092,.54),l(-.816,.262),l(-1.75,.36),l(-.907,.083),l(-1.631,-.013),l(-1.391,-.192),l(-2.038,-.175),l(-1.63,-.192),l(-1.342,-.339),l(-2.256,-.485),l(-1.114,-.112),l(-.476,-.048),l(-.621,-.473),l(-.371,-.163),l(-.771,-.13),l(-.943,.117),l(.307,.163),l(.149,.065),l(.73,.538),l(.482,.146),l(1.109,.601),l(.832,.291),l(.921,.161),l(.634,.242),l(.405,.453),l(-.002,.405),l(-.276,.291),l(-.684,.195),l(.086,.113),l(.208,.531),l(.771,.943),l(.093,.494),l(.155,.207),l(.438,.174),l(1.203,.078),l(.872,.125),l(.499,.619),l(.401,.095),l(1.26,.077),l(.575,.126),l(.364,.079),l(.402,-.128),l(.785,-.097),l(.243,-.302),l(-.001,-.318),l(-.387,-.397),l(-.471,-.079),l(-.455,.096),l(-.447,-.031),l(-.589,-.206),l(-.952,-.795),l(.701,-.674),l(.484,-.001),l(1.116,.479),l(1.441,.333),l(2.09,.427),l(.952,.078),l(.834,-.146),l(.723,.174),l(.261,-.224),l(.05,-.415),l(-.214,-.239),l(-.858,-.656),l(-.348,-.628),l(.285,-.323),l(.19,-.049),l(1.432,-.423),l(1.495,-.359),l(.599,-.244),l(1.133,-.717),l(.172,-.049),l(.462,.064),l(1.829,.29),l(1.41,.533),l(.341,-.001),l(.052,-.065),l(.154,-.503),l(.581,-.767),l(-.048,-.653),l(-.317,-.408),l(-.847,-.163),l(-.3,-.229),l(1.139,-1.005),l(.101,-.247),l(-.205,-.594),l(-.771,-.512),l(.069,-.315),l(.353,-.051),l(1.458,.23),l(2.025,-.12),l(.631,.132),l(.664,.611),l(.616,.445),l(.433,.461),l(-1.045,.051),l(-1.559,.085),l(-.822,.215),l(-.492,.51),l(.191,.18),l(.952,.293),l(.732,.555),l(.804,.194),l(.723,.097),l(1.268,-.133),l(1.33,-.084),l(.301,-.164),l(.257,-.491),l(.291,-.591),l(.284,-.412),l(1.232,-.2),l(1.223,-.414),l(.988,-.216),l(1.924,-.483),l(1.429,-.251),l(1.537,-.318),l(.921,-.3),l(.205,.464),l(.278,.083),l(.571,-.117),l(.487,-.266),l(.148,-.465),l(.386,-.167),l(.718,-.135),l(.859,.065),l(-.18,.399),l(-.058,.597),l(-.858,.084),l(-.178,.149),l(.002,.215),l(.687,.197),l(.507,-.083),l(1.169,-.167),l(.436,-.001),l(.161,.198),l(.23,.049),l(.278,-.133),l(.264,-.216),l(.29,-.431),l(.464,-.183),l(.861,-.118),l(1.049,-.068),l(.768,.032),l(1.075,.23),l(.755,-.018),l(.36,-.083),l(.963,-.467),l(1,-.285),l(.803,-.052),l(.952,.182),l(.326,.166),l(-.631,.45),l(.129,.232),l(.217,.099),l(.632,.131),l(.579,-.018),l(.288,-.232),l(.074,-.398),l(.342,-.084),l(.962,.065),l(.543,-.184),l(.395,-.316),l(.115,-.417),l(-1.37,-1.033),l(.405,-.168),l(.66,-.37),l(.403,-.068),l(.609,.016),l(2.171,.063),l(1.272,.199),l(1.241,.149),l(1.135,.199),l(2.111,.515),l(1.071,.098),l(1.712,.414),l(1.02,.248),l(1.305,.53),l(1.455,.611),l(.864,.379),l(.376,.049),l(.229,-.1),l(1.145,-1.047),l(.236,-.3),l(-.927,.035),l(-.4,-.049),l(-.564,-.232),l(-.365,-.433),l(.027,-.652),l(-.727,-.283),l(-1.987,-.147),l(-.19,-.268),l(.064,-.168),l(.305,-.303),l(.693,-.255),l(.236,-.153),l(.085,-.187),l(-.052,-.833),l(-.251,-.238),l(-1.135,-.066),l(-.232,-.29),l(.328,-.532),l(.359,-.241),l(.391,-.035),l(1.482,-.416),l(1.098,-.485),l(.521,-.416),l(.581,-.608),l(.544,-1.22),l(.637,-.421),l(.374,.069),l(1.562,.155),l(1.613,-.125),l(1.605,-.091),l(.695,.069),l(1.066,-.055),l(.574,.122),l(.309,.279),l(-.018,.332),l(-.423,.836),l(-.348,.348),l(-1.334,.833),l(-.223,.345),l(.752,.342),l(.931,.667),l(.277,.342),l(.21,.818),l(-.174,.222),l(-.575,.375),l(.254,1.179),l(-.058,1.305),l(.263,.583),l(.45,.381),l(1.027,.264),l(.19,.166),l(-.001,.133),l(-.485,.481),l(-.417,.826),l(-.333,.33),l(-.784,.462),l(-1.232,.625),l(-.63,.198),l(-.55,.263),l(.321,.522),l(-.433,.115),L(558,52.195),l(-1.599,-.372),l(-.731,-.08),l(-.97,.034),l(-.601,.115),l(.195,.31),l(.583,.276),l(.738,.21),l(1.569,.208),l(1.133,.079),l(.613,-.05),l(1.188,.144),l(.922,-.034),l(.472,-.358),l(.303,-.358),l(1.352,-.328),l(1.166,-.492),l(.268,-.278),l(.386,-.606),l(.818,-.313),l(.864,-.626),l(.064,-.362),l(-.225,-.561),l(-.609,-.545),l(.244,-.548),l(.237,-.1),l(.677,-.151),l(1.38,-.152),l(1.757,-.003),l(.74,.231),l(.842,.463),l(.151,.778),l(-.34,1.023),l(.302,.279),l(.92,.212),l(1.298,.047),l(.864,-.149),l(.129,-.296),l(-.514,-.18),l(-.797,-.18),l(-.571,.034),l(-.457,-.098),l(.068,-.379),l(1.03,-.382),l(.065,-.249),l(-.218,-.148),l(-.166,-.331),l(-.441,-.763),l(-.511,-.266),l(-.836,-.098),l(-1.093,-.231),l(-.801,-.116),l(-1.288,-.165),l(-.91,.186),l(-.638,.101),l(-1.297,-.181),l(-.896,.019),l(-.015,-.267),l(-.564,-1.071),l(.305,-.657),l(.736,-.697),l(.282,-.46),l(-.134,-.221),l(-1.092,-1.042),l(-.949,-.514),l(-.12,-.189),l(.833,-.554),l(1.213,-.106),l(.998,-.262),l(.744,-.348),l(.172,-.226),l(.169,-.644),l(-.13,-.663),l(.23,.069),l(.64,.051),l(.466,.086),l(.108,.471),l(-.186,.54),l(-.636,.608),l(-.167,.554),l(.14,.448),l(.373,.274),l(.485,.274),l(1.384,.134),l(1.574,.169),l(1.632,.083),l(.819,.409),l(.321,.017),l(.799,-.036),l(-.527,-.89),l(-.521,-.274),l(-1.893,-.1),l(-.931,-.067),l(-.576,-.154),l(-.609,-.448),l(.275,-.329),l(1.374,-.054),l(.444,.172),l(1.145,.084),l(.747,-.157),l(-.09,-.728),l(.408,-.088),l(.84,-.105),l(1.278,-.02),l(1.067,.207),l(1.413,.379),l(1.088,.535),l(1.326,.343),l(.547,.085),l(1.822,.014),l(.727,-.174),l(.138,.345),l(-.781,.38),l(-.696,.259),l(-.248,.771),l(-.129,.972),l(.333,.136),l(.68,-.785),l(.387,-.292),l(.285,.051),l(.604,.528),l(-.088,.749),l(.743,-.205),l(.681,-.273),l(-.044,-.306),l(-.191,-.119),l(-.147,-.358),l(-.748,-.821),l(.188,-.223),l(.686,-.759),l(-.797,-.448),l(-.772,-.258),l(-.93,-.241),l(-.257,-.382),l(-.655,-.051),l(-.979,-.242),l(-1.34,-.207),l(-.307,-.296),l(.062,-.577),l(-.096,-.386),l(-.811,-.667),l(.081,-.247),l(.266,-.16),l(.484,-.125),l(2.31,-.11),l(2.54,-.022),l(2.125,-.128),l(1.421,-.162),l(.475,.317),l(.382,.052),l(.844,-.267),l(1.056,-.286),l(1.413,-.109),l(.589,.194),l(-.957,.338),l(-.451,.407),l(1.737,-.233),l(.521,-.107),l(.955,-.374),l(.27,-.284),l(-.334,-.444),l(-.326,-.177),l(-.925,-.266),l(-.365,-.303),l(-.002,-.232),l(.324,-.539),l(1.176,-.397),l(.966,-.22),l(3.028,-.903),l(.889,-.094),l(.248,-.036),l(.522,-.076),l(1.899,-.096),l(1.663,-.114),l(2.302,-.244),l(2.048,-.263),l(1.595,-.43),l(.855,-.243),l(1.763,.034),l(1.065,-.002),l(.383,.185),l(-.351,.409),l(1.504,.108),l(1.018,-.039),l(1.261,-.188),l(1.345,-.225),l(.95,-.039),l(.982,.166),l(.687,.073),l(.693,-.206),l(.12,-.335),l(-.133,-.167),l(.466,-.337),l(.942,-.077),l(.939,.036),l(1.243,-.377),l(-.618,-.506),l(.122,-.34),l(1.165,-.438),l(1.554,-.383),l(2.23,-.406),l(1.229,-.077),l(.993,.056),l(1.486,-.003),l(.86,.265),l(.045,.266),l(-1.528,.401),l(-.66,.342),l(.488,.15),l(1.83,-.117),l(1.588,.148),l(2.039,-.079),l(.177,.113),l(-.375,.283),l(-1.187,.453),l(-.296,.3),l(1.971,-.004),l(.833,-.02),l(.234,.093),l(1.052,-.545),l(1.366,-.002),l(1.771,-.097),l(.631,.13),l(1.35,-.021),l(1.954,.165),l(1.4,.259),l(1.181,.427),l(.52,.445),l(.726,-.001),l(.854,-.076),l(.422,.5),l(-1.354,.832),l(.241,.128),l(.896,.365),l(-2.329,.859),l(-1.035,.235),l(-1.166,.11),l(-3.404,1.061),l(-3.018,.965),l(-.793,.285),l(-2.388,.375),l(-2.35,.586),l(-2.065,1.126),l(.715,.017),l(1.081,-.247),l(.922,-.458),l(1.663,-.161),l(1.231,-.02),l(2.101,-.268),l(1.879,-.286),l(.879,-.107),l(1.004,-.284),l(-.094,-.389),l(-.492,-.123),l(-.034,-.071),l(.281,-.249),l(.581,-.214),l(.873,.211),l(.603,.389),l(.621,.052),l(.593,.193),l(.737,.052),l(.853,-.055),l(1.155,-.268),l(.499,.07),l(.192,.3),l(.009,.512),l(.522,.404),l(1.422,-.778),l(1.66,-.021),l(1.506,-.145),l(2.354,.014),l(1.919,.155),l(.854,.034),l(1.204,.033),l(-.271,.74),l(.354,.333),l(2.043,.154),l(.848,.121),l(.698,.069),l(1.035,.103),l(2.49,-.145),l(1.209,-.02),l(1.42,.348),l(1.405,-.932),l(-.161,-.352),l(-.038,-.229),l(-.034,-.105),l(1.806,-.48),l(.521,-.019),l(.802,.104),l(1.148,.298),l(.851,.281),l(1.711,.032),l(1.354,-.073),l(1.384,.033),l(1.323,.431),l(.409,.181),l(.058,.386),l(-.52,.088),l(-.268,.036),l(-1.905,.406),l(-2.438,.737),l(-.233,.227),l(.253,.069),l(1.033,.067),l(.957,.016),l(.659,.155),l(.659,.293),l(1.014,.396),l(.583,.172),l(.78,.481),l(1.27,.805),l(1.814,.801),l(1.351,.305),l(.612,-.018),l(.795,-.394),l(.843,-.72),l(1.093,-1.051),l(.601,-.329),l(.29,.017),l(.236,.465),l(.772,.308),l(1.346,.29),l(1.105,.135),l(.848,-.087),l(1.973,-.468),l(.778,-.07),l(.813,.067),l(1.196,.239),l(1.921,.734),l(.315,-.052),l(.186,-.069),l(.491,-.258),l(.221,-.258),l(-.137,-.051),l(.013,-.189),l(.726,-.312),l(.509,-.018),l(.5,.257),l(.575,.188),l(1.302,.032),l(.181,-.5),l(-.194,-.466),l(.15,-.363),l(.093,-.521),l(-1.131,.159),l(-.643,.001),l(-.179,-.104),l(.442,-.296),l(.318,-.087),l(.986,-.089),l(1.021,-.02),l(.832,-.141),l(1.566,-.648),l(.254,0),l(1.76,.241),l(1.561,.137),l(2.036,.188),l(.997,.068),l(.654,.103),l(2.307,.065),l(-1.732,.628),l(.865,.051),l(1.011,-.089),l(.335,.138),l(-.305,.381),l(-.926,.192),l(-.846,.261),l(-.177,.293),l(.664,.033),l(.52,-.122),l(.916,-.14),l(.978,-.33),l(1.62,-.799),l(2.766,.012),l(1.196,.067),l(.903,.172),l(.946,.137),l(.205,.19),l(.221,.104),l(-2.247,.59),l(.559,.137),l(1.674,.289),l(2.174,.202),l(.946,.204),l(.801,.375),l(.367,.427),l(.564,.357),l(.522,.152),l(1.459,-.037),l(1.364,-.105),l(1.138,-.139),l(2.518,-.329),l(2.208,-.107),l(3.008,.131),l(1.515,.134),l(.734,.118),l(1.168,.424),l(.655,.169),l(.525,.338),l(.361,.39),l(-.123,.491),l(-.286,.521),l(.509,.25),l(.764,.065),l(.835,.015),l(.643,.083),l(-.017,.685),l(.419,.416),l(.686,-.168),l(.545,-.435),l(1.211,-.387),l(.348,-.067),l(.35,.049),l(1.696,-.02),l(1.521,-.288),l(.736,.032),l(.588,.434),l(.707,.116),l(1.541,.014),l(2.176,.062),l(.869,-.118),l(1.378,-.504),l(.406,.2),l(.93,.533),l(.396,.216),l(1.095,.265),l(.875,.332),l(.282,.398),l(.612,.148),l(1.556,-.136),l(1.653,-.319),l(.16,-.25),l(-.248,-.333),l(-.805,-.833),l(-.833,-.115),l(.4,-.336),l(.479,-.571),l(1.89,.098),l(1.214,.082),l(1.135,.065),l(1.221,.166),l(.222,.318),l(1.396,-.153),l(2.084,-.054),l(2.304,.013),l(1.292,.148),l(.786,.199),l(1.185,.199),l(1.391,.098),l(.751,.182),l(1.302,.332),l(.747,.065),l(.703,.182),l(1.145,.505),l(0,2.126),l(0,2.222),l(0,2.222),l(0,1.292),l(0,.157),l(0,.576),l(0,.219),l(-1.083,.371),l(-.651,.03),l(-.645,.37),l(-.56,.065),l(-1.044,.065),l(-.355,-.079),l(-.928,-.052),l(-.118,-.343),l(-.271,-.211),l(-.501,.027),l(.241,-.185),l(-.938,.324),l(-.846,.02),l(-.337,-.211),l(-.478,-.079),l(.424,.501),l(-.569,.29),l(.32,.103),l(.942,.205),l(.634,-.36),l(.395,.041),l(.335,.079),l(0,.477),l(.248,.206),l(.76,.269),l(1.059,-.228),l(-.439,.322),l(.741,-.243),l(.065,.336),l(.247,.206),l(.187,.363),l(.068,.189),l(-.722,.522),l(.593,-.064),l(.349,.172),l(.473,.503),l(.501,.157),l(.145,.251),l(-.162,.456),l(.792,-.111),l(-.125,.393),l(.023,.25),l(-.43,.299),l(-.691,.205),l(-.635,-.046),l(-.448,-.14),l(-1.243,-.154),l(-.889,-.077),l(-.347,-.14),l(.123,-.267),l(-.493,-.046),l(-.304,.032),l(-.559,.55),l(-.069,.11),l(-3.06,.913),l(-1.155,.174),l(-.245,0),l(-.43,.203),l(-.219,.188),l(-.719,.22),l(-.991,.033),l(-.308,.11),l(-.48,.405),l(-.462,.203),l(-.946,.033),l(-.854,.622),l(-.24,.279),l(-1.67,.452),l(-.392,.449),l(-1.229,.25),l(-.406,.14),l(-.151,.293),l(.01,.292),l(-.473,.292),l(-.406,.016),l(-.586,-.306),l(-.183,-.262),l(-.169,-.37),l(-.67,-.308),l(-1.074,-.044),l(-1.021,.048),l(-1.159,.172),l(-1.301,.188),l(-.523,.217),l(-1.333,.756),l(-.536,.277),l(-.184,-.138),l(.575,-1.293),l(-.55,.094),l(-.392,-.097),l(-.811,.531),l(-.67,.186),l(-.401,.155),l(-.114,.506),l(-.66,.154),l(-.317,-.168),l(-.253,-.49),l(-.483,-.261),l(-1.024,.636),l(.261,-.204),l(-.557,.062),l(-.283,.092),l(-.628,.522),l(-.141,.261),l(.126,.229),l(.344,.152),l(-.932,.521),l(-.182,.199),l(.342,.167),l(-.647,.352),l(-.88,.55),l(-.626,.503),l(-.298,.35),l(-.01,.531),l(.421,.317),l(.477,.09),l(1.382,-.048),l(.562,.166),l(.11,.167),l(-.436,.394),l(-.752,.455),l(-.181,.302),l(.224,.512),l(.292,.452),l(.786,.089),l(.165,.391),l(-.014,.616),l(-.349,.361),l(-.528,.061),l(-.481,-.209),l(-.017,-.21),l(.388,-.527),l(-.444,-.014),l(-.454,.242),l(-1.014,.843),l(-.56,.675),l(-.237,.599),l(.321,.672),l(.647,.311),l(.154,.237),l(-.294,.387),l(-.688,.313),l(-.956,.031),l(-.664,-.088),l(-.344,.001),l(-.619,.179),l(-.837,.476),l(-.214,.149),l(-.525,.504),l(-.137,.341),l(.111,.281),l(.492,.398),l(.038,.221),l(-.056,.133),l(-.679,.238),l(-.604,.016),L(753.44,82.4),l(-.727,.296),l(-.065,.251),l(.067,.28),l(-.161,.854),l(-.293,.412),l(-.8,.78),l(-1.53,.971),l(-.854,.5),l(-.285,.103),l(-.295,-.614),l(-.198,-.821),l(-.25,-.69),l(-.064,-.794),l(-.351,-.75),l(-.305,-.383),l(-.214,-.915),l(-.514,-1.36),l(-.008,-.578),l(-.154,-.563),l(-.017,-.327),l(-.105,-.193),l(-.262,-.817),l(-.026,-.792),l(.116,-.808),l(.271,-1.396),l(.167,-.226),l(1.185,-.86),l(.716,-.424),l(.57,-.695),l(.14,-.227),l(-.085,-.318),l(-.139,-.166),l(1.632,-.367),l(1.001,-.305),l(.811,-.32),l(1.729,-.884),l(.641,-.412),l(.431,-.428),l(.14,-.335),l(1.784,-.889),l(.872,-.445),l(1.535,-.861),l(.368,-.293),l(.26,-.433),l(1.252,-.435),l(2.106,-.514),l(.257,-.434),l(.773,-.528),l(.086,-.233),l(-.568,-.216),l(.814,-.904),l(-.036,-.483),l(.183,-.391),l(.598,-.204),l(1.729,-.082),l(.513,-.063),l(-.485,-.328),l(-2.065,-.215),l(-.71,.095),l(-1.062,.174),l(-.777,.189),l(.042,.328),l(-.664,.923),l(.125,.202),l(-.04,.14),l(-.662,.11),l(-.479,.11),l(-1.555,.718),l(-1.979,1.042),l(-1.169,.342),l(-.249,-.062),l(.156,-.325),l(.352,-.465),l(-.933,-.076),l(-.16,-.263),l(.252,-.451),l(.442,-.467),l(.207,-.328),l(-.069,-.202),l(-.339,-.031),l(-1.136,.454),l(-.496,.032),l(-.277,-.358),l(-.589,-.17),l(-1.606,.144),l(-1.312,.111),l(-.956,.08),l(-.606,.157),l(-.894,.359),l(-.093,.436),l(.082,.186),l(-1.262,.53),l(-.408,.233),l(.149,.495),l(-1.294,.357),l(-1.019,.434),l(-.84,.479),l(-.496,.461),l(-.332,.46),l(.004,.383),l(.527,.213),l(1.269,.043),l(.278,.275),l(.062,.122),l(-1.152,.139),l(-1.028,.262),l(-1.045,-.059),l(-.698,-.136),l(-.382,.031),l(-.311,.107),l(-.721,.398),l(-.695,-.35),l(-1.112,.383),l(-.747,.139),l(-.487,-.09),l(-.284,-.137),l(.108,-.29),l(.748,-.124),l(.868,-.124),l(.164,-.046),l(-.741,-.64),L(736.444,68),l(-1.06,.017),l(-.854,.155),l(-.353,-.061),l(-.868,-.458),l(-.775,-.029),l(-.745,.047),l(-.704,.246),l(.042,.398),l(-.26,.229),l(-.477,.215),l(-.695,-.243),l(-.408,-.122),l(-1.26,.063),l(-.784,.093),l(-.651,-.075),l(-.887,-.136),l(-.563,.078),l(-.067,.122),l(-.147,.474),l(-.677,.017),l(-.311,-.137),l(-.038,-.382),l(-.203,-.259),l(-1.241,.094),l(-1.014,-.059),l(-1.257,.033),l(-1.158,.063),l(-.836,-.029),l(-.18,.016),l(-1.085,.292),l(-.964,.444),l(-.74,.474),l(-.536,.504),l(-.789,.245),l(-.904,.336),l(-.194,.152),l(-1.047,1.17),l(-1.634,.684),l(-.949,.471),l(-1.157,.711),l(-1.653,1.253),l(-.828,.572),l(-1.573,.873),l(-.893,.376),l(-1.889,.871),l(-.632,.388),l(-.203,.298),l(.018,.357),l(.428,.281),l(.485,.043),l(.918,.013),l(1.046,-.15),l(.656,.043),l(-.329,1.261),l(.016,.415),l(.303,.103),l(.63,-.09),l(.601,-.371),l(.761,.117),l(-.127,.148),L(705.293,81),l(-.112,.222),l(.373,.073),l(1.645,-.018),l(.566,-.238),l(.39,-.519),l(.017,-.638),l(.763,.014),l(.647,-.001),l(.726,.014),l(.951,.265),l(.658,.354),l(.486,.591),l(.847,.575),l(.426,.176),l(.506,.324),l(-.07,.148),l(-.581,.355),l(.453,.221),l(.13,.309),l(-.336,.723),l(.491,.117),l(.215,.235),l(-.291,.515),l(-.348,.397),l(-.532,.559),l(-.724,1.364),l(-.181,.688),l(.057,.219),l(.24,.701),l(-.188,.917),l(-.098,.741),l(-.403,1.408),l(-.146,.493),l(-1.928,1.538),l(-.371,.435),l(-.217,.65),l(-.587,.42),l(-.741,.579),l(-.241,.361),l(-.574,.981),l(-.587,.606),l(-.941,.778),l(-1.784,1.512),l(-.464,.474),l(-.235,.458),l(-.323,.33),l(-.758,.388),l(-.618,.416),l(-.574,.702),l(-.431,.458),l(-.875,.673),l(-.955,.487),l(-1.838,.475),l(-.798,.244),l(-.278,-.427),l(-.519,-.085),l(-.243,.043),l(-.337,-.185),l(-.337,-.513),l(-.663,.272),l(-.464,.101),l(.424,-.586),l(-.624,.173),l(-.506,.486),l(-.649,.543),l(-1.326,1.001),l(-.072,.049),l(-.167,-.393),l(-.298,-.439),l(.111,-.058),l(1.252,-.462),l(.511,-.43),l(.156,-.329),l(-.112,-.299),l(.097,-.128),l(.025,-.385),l(.006,-.613),l(-.062,-.656),l(-.332,-.897),l(.048,-.557),l(1.664,-.982),l(.396,.041),l(.685,.24),l(.679,.225),l(.547,.098),l(.47,-.347),l(.551,-.69),l(.329,-.432),l(.627,-1.08),l(.538,-1.066),l(.278,-.893),l(.291,-.707),l(.66,-.393),l(.566,-.407),l(-.017,-.504),l(-.116,-.389),l(-.064,-.259),l(-.246,-.114),l(-.902,.034),l(-1.181,.208),l(-1.357,.31),l(-.953,.308),l(-.604,.22),l(-1.657,.052),l(-.649,.018),l(-.68,.033),l(-.261,-.446),l(-.44,-1.283),l(-.297,-.866),l(-.205,-.144),l(-2.659,-.839),l(-1.523,-.253),l(-1.247,-.341),l(-.507,-.2),l(-.436,-.389),l(-.927,-1.903),l(-.94,-1.588),l(-1.087,-2.384),l(-.742,-.952),l(-.763,-.467),l(-.539,-.026),l(-1.386,.125),l(-.683,-.188),l(-1.037,-.481),l(-1.148,-.215),l(-.917,.049),l(-1.203,.109),l(-.836,.123),l(-1.854,.143),l(-.602,.136),l(-.478,.165),l(-1.193,.787),l(-.375,.282),l(-.119,.25),l(.822,-.078),l(.558,.026),l(.465,.306),l(.107,.249),l(-.167,.794),l(-1.371,.608),l(-.599,.545),l(-.667,.779),l(-.416,.543),l(-.422,.426),l(-.103,.249),l(.062,.146),l(.35,.348),l(.056,.306),l(-.123,.233),l(-.779,.339),l(-2.44,.752),l(-.438,.089),l(-.343,.016),l(-1.126,-.574),l(-.452,-.172),l(-.046,-.018),l(-.431,-.168),l(-.622,.018),l(-1.228,.297),l(-.86,-.169),l(-.34,-.129),l(-.751,-.506),l(-.74,-.156),l(-.609,.047),l(-.333,.002),l(-1.165,.487),l(-.755,.498),l(-.447,.394),l(-.604,.264),l(-.526,.163),l(-1.147,.136),l(-.867,.106),l(-.532,.075),l(-1.018,.063),l(-1.602,.11),l(-.739,-.039),l(-.984,-.082),l(-.905,-.241),l(-1.318,-.254),l(-.812,-.373),l(-1.132,-.313),l(-.623,-.331),l(-1.333,-.75),l(-.769,-.229),l(-1.423,-.022),l(-1.172,-.037),l(-.796,.077),l(-2.48,.538),l(-.673,-.113),l(-1.643,-.531),l(-.421,-.333),l(-.408,-.451),l(-.182,-.481),l(-.004,-.541),l(-.145,-.204),l(-.767,-.143),l(-.989,-.317),l(-.702,-.231),l(-1.748,-.328),l(-1.036,-.185),l(-1.028,-.098),l(-.84,-.201),l(-1.269,.96),l(-.905,.839),l(-.098,.293),l(.409,.86),l(.396,.304),l(.116,.204),l(-.163,.526),l(-.744,.572),l(-.31,.162),l(-.755,.28),l(-.562,.018),l(-.576,-.186),l(-.312,-.114),l(-.875,-.068),l(-.85,.004),l(-.719,-.083),l(-1.458,.008),l(-.699,-.113),l(-.393,-.406),l(-.694,-.755),l(-.831,-.083),l(-1.842,-.122),l(-.932,-.156),l(-.953,-.097),l(-.84,.18),l(-1.512,.476),l(-1.143,.341),l(-.787,.398),l(-.971,.692),l(-.017,.012),l(-.727,.381),l(-.603,.148),l(-1.387,.08),l(-.599,.207),l(-.799,.425),l(-.154,.044),l(-.244,.074),l(-.569,.003),l(-.228,.014),l(-.064,-.145),l(-.589,0),l(-.294,-.478),l(-.441,-.331),l(.073,-.331),l(-.625,.184),l(-.478,.368),l(-.993,-.074),l(-.882,-.073),l(-.662,-.699),l(-.588,-.552),l(-.956,-.147),l(-.331,-.625),l(-.772,-.588),l(-.698,-.441),l(-.993,.037),l(-.771,.221),l(-.993,.221),l(-.992,0),l(-.589,0),l(-.184,-.184),l(-.258,-.257),l(-.478,0),l(0,-.368),l(-.367,-.331),l(-.92,0),l(-.367,.515),l(-.331,.257),l(-.515,.257),l(-1.104,-1.434),l(-.846,-.882),l(-1.69,-2.133),l(-1.066,-1.029),l(-1.287,-.772),l(-.809,-.294),l(-1.104,-.588),l(.11,-.368),l(.515,-.11),l(0,-.441),l(-.809,.074),l(-.515,.22),l(-.772,.221),l(-.956,.515),l(-1.103,.257),l(-.772,.441),l(-.294,.294),l(-.552,-.184),l(-.441,-.037),l(-.771,.073),l(-.441,.11),l(-.331,-.184),l(.331,-.441),l(.441,-.184),l(.146,-.294),l(-.367,0),l(-.441,.221),l(-.478,-.11),l(-.405,-.294),l(-.478,-.037),l(-.184,.147),l(-.147,.147),l(-.367,-.221),l(-.295,-.368),l(-.294,-.11),l(-.331,.221),l(-.367,-.074),l(-.368,.147),l(-.44,-.11),l(-.295,.147),l(-.478,-.074),l(-.184,-.257),l(.33,-.037),l(-.073,-.331),l(.147,-.257),l(.11,-.331),l(-.515,-.22),l(-.147,-.221),l(.037,-.331),l(-.368,-.404),l(-.882,.037),l(-.625,.11),l(-.772,-.257),l(-.515,-.11),l(-.919,-.147),l(-.735,.037),l(-.11,.221),l(-.589,.184),l(-.515,.037),l(0,.294),l(-.367,.368),l(-.625,.074),l(-1.876,.073),l(-2.021,.405),l(-1.177,.037),l(-.625,.331),l(-.221,.331),l(-.331,-.073),l(-.588,.073),l(-1.545,.11),l(-.735,.11),l(-1.029,.037),l(-1.396,.405),l(-.368,.184),l(-.772,0),l(-.515,0),L(537.304,80),l(-.33,.074),l(-.185,.515),l(.074,.441),l(.294,.221),l(-.294,.074),l(0,.331),l(1.065,.11),l(.956,.294),l(-.11,.257),l(-.515,.073),l(-1.103,-.147),l(-.698,.184),l(-.662,.515),l(.146,.257),l(.441,.478),l(-.331,.294),l(-.588,.147),l(-.735,.368),l(-.467,.067),l(.164,.274),l(.239,0),l(.377,.137),l(-.068,.171),l(.377,.137),l(.651,.069),l(.274,.308),l(1.165,.171),l(.24,.24),l(-.138,.686),l(-.137,.309),l(-1.577,.411),l(-.959,-.034),l(-.343,-.343),l(-.24,0),l(-.171,.309),l(-.651,.343),l(-.411,-.171),l(-.754,-.137),l(-.926,-.309),l(-.274,-.548),l(-.754,-.103),l(-1.062,.103),l(-.137,.412),l(-.617,.068),l(-.651,-.411),l(-.65,-.035),l(-.823,-.068),l(-.514,.377),l(-.377,.343),l(-.274,.274),l(-.686,.171),l(-.411,-.24),l(-.686,-.137),l(-.582,-.548),l(-.72,-.068),l(.034,.24),l(.205,.48),l(-.239,.274),l(-.274,-.137),l(-.068,-.583),l(-.411,-.274),l(-.789,-.343),l(-.582,-.206),l(0,-.343),l(-.96,-.171),l(-.617,.069),l(-.788,-.035),l(-.411,-.514),l(-.411,-.069),l(-.617,.24),l(-.273,.137),l(-.651,.137),l(-.309,-.274),l(-.479,0),l(-.651,-.069),l(-.515,.309),l(-.548,.343),l(-.788,.377),l(-.549,.068),l(-.514,.171),l(-.309,.309),l(-.172,.24),L(509.58,87.5),l(-.479,.206),l(.068,.445),l(.171,.411),l(-.068,.446),l(-.411,.24),l(-.651,0),l(-.514,-.411),l(-.48,-.548),l(-.514,-.24),l(-.411,.069),l(-.103,.308),l(-.343,.549),l(-.823,.137),l(-.205,1.303),l(.343,.171),l(.239,.274),l(-.239,.206),l(-.446,.274),l(-.65,1.165),l(1.37,.343),l(.138,.377),l(-.068,.309),l(.514,.514),l(.103,-.343),l(.583,.206),l(.343,-.034),l(.514,.034),l(.515,.445),l(.479,.206),l(.343,.514),l(.96,1.131),l(-.138,.103),l(-.445,-.103),l(-.309,-.103),l(-.343,.103),l(.068,.308),l(.857,.377),l(.616,.19),l(-.167,.2),l(-.399,.28),l(-.38,.12),l(-.12,0),l(0,.14),l(0,.22),l(-.14,.08),l(-.3,-.2),l(-.34,.2),l(-.399,.26),l(-.64,.12),l(-.319,.08),l(-.26,-.08),l(-.181,-.08),l(-.1,.04),l(-.06,.16),l(.12,.26),l(-.221,.2),l(-.18,.3),l(-.18,.319),l(-.319,.42),l(-.18,.28),l(-.32,.16),l(-.34,.24),l(-.14,.32),l(.08,.2),l(.34,.2),l(.319,.04),l(.18,.3),l(.24,.04),l(.239,.34),l(.28,.419),l(-.06,.38),l(-.101,.2),l(.061,.16),l(.1,-.2),l(.1,-.34),l(.12,-.22),l(.16,-.02),l(-.141,.439),l(-.22,.36),l(.061,.4),l(.12,.1),l(-.16,.2),l(-.04,.4),l(.38,.24),l(.119,.1),l(.12,.52),l(.28,.06),l(.359,.42),l(.2,.28),l(.439,.419),l(.18,.36),l(.359,.06),l(.047,.146),l(-.292,.449),l(-.496,.284),l(-.283,.094),l(-.308,.331),l(-.165,.213),l(-.379,.047),l(-.449,-.142),l(-.591,-.094),l(0,-.308),l(-.283,-.284),l(-.118,0),l(-.095,-.118),l(-.473,-.284),l(-.142,-.189),H(504.5,0),l(-.213,.047),L(504.264,107),l(-.229,.023),l(-.126,-.189),l(-.236,-.071),l(-.236,.023),l(-.284,-.047),l(-.26,-.094),l(-.284,-.166),l(-.354,-.284),l(.118,-.307),l(.118,-.189),l(-.118,-.142),l(-.354,-.024),l(-.378,0),l(-.213,-.166),l(-.189,-.118),l(-.212,0),l(-.143,-.094),l(-.236,-.118),l(-.118,0),l(-.095,.071),l(-.142,.166),l(-.188,-.142),l(-.261,-.071),l(-.354,0),l(-.213,.071),l(-.094,.095),l(-.166,.166),l(-.283,0),l(-.261,.118),l(-.212,-.071),l(-.261,-.118),l(.048,-.118),l(.142,-.118),l(-.308,-.119),l(-.236,-.118),l(-.354,-.071),l(-.52,-.118),l(-.284,-.213),l(-.095,-.142),l(-.354,-.166),l(-.283,.047),l(-.189,0),l(-.401,-.166),l(-.544,0),l(-.426,.095),l(-.307,0),l(-.355,-.047),l(-.307,-.071),l(-.261,-.095),l(-.212,-.166),l(-.213,0),l(-.331,0),l(-.189,-.047),l(-.188,-.094),l(-.284,-.142),l(-.283,-.095),l(-.449,-.023),l(-.402,-.023),l(-.07,-.047),l(-.284,-.047),l(-.26,.166),l(-.112,.309),l(-1.421,-1.012),l(-1.188,-.842),l(-.817,-.385),l(-.62,-.084),l(-.373,-.157),l(-.509,-.5),l(-.236,-.057),l(-.338,.159),l(-.329,-.042),l(-.347,-.515),l(-.795,-.674),l(.595,-.188),l(.519,-.001),l(.445,-.073),l(.1,-.519),l(.359,-.476),L(485,97.85),l(.526,-.03),l(.516,-.131),l(-.432,-.532),l(-.654,-.273),l(-.474,-.36),l(.243,-.116),l(.367,-.03),l(.82,-.117),l(.715,-.348),l(1.244,-.436),l(-.196,-.375),l(-.076,-.058),l(-.799,.088),l(-1.312,.175),l(.012,-.126),l(.021,-.112),l(0,-.224),l(.09,-.514),l(.224,-.089),l(.357,-.022),l(.38,-.134),l(.223,-.179),l(.022,-.179),l(.269,0),l(.736,-.045),l(.805,.157),l(.335,-.134),l(0,-.156),l(.156,-.291),l(.156,-.491),l(-.066,-.067),l(-.09,-.201),l(-.045,-.179),l(-.044,-.134),l(-.179,-.067),l(-.156,-.067),l(.044,-.224),l(.045,-.179),l(.246,0),l(.312,0),l(.134,-.156),l(-.29,-.044),l(-.269,-.089),l(-.223,-.246),l(.312,-.044),l(.357,-.201),l(.156,-.067),l(.201,-.089),l(.045,-.224),l(-.09,-.179),l(-.111,-.089),l(.022,-.179),l(.089,-.111),l(-.156,-.089),l(-.201,.089),l(-.134,.044),l(-.269,0),l(-.357,-.156),l(-.111,-.224),l(-.469,-.022),l(-.291,-.089),l(-.201,-.179),l(-.357,.067),l(-.268,-.112),l(-.469,-.112),l(-.425,-.067),l(-.29,-.268),l(-.224,.067),l(-.045,.157),l(-.29,.134),l(-.224,-.112),l(-.179,-.179),l(-.402,-.044),l(-.022,-.134),l(-.201,-.179),l(0,-.134),l(-.268,-.179),l(-.111,-.156),l(-.357,.067),l(-.536,.134),l(-.269,0),l(-.312,.112),l(-.425,.112),l(-.179,-.156),l(-.179,-.022),l(-.201,.067),l(-.469,-.291),l(-.268,-.067),l(-.47,.067),l(-.268,.179),l(-.291,-.29),l(-.179,-.089),l(-.089,-.224),l(.089,-.179),l(-.089,-.246),l(-.224,-.268),l(0,-.357),l(-.402,0),l(0,-.312),l(-.38,-.022),l(-.514,.067),l(-.156,-.112),l(-.647,0),l(-.269,-.29),l(-.111,-.357),l(-.134,-.291),l(.312,-.134),l(.312,.022),l(0,-.268),l(-.312,-.156),l(-.246,-.156),l(-.134,-.201),l(-.246,-.335),l(-.312,-.134),l(-.201,-.268),l(-.514,.134),l(-.692,-.112),l(-.67,.223),l(-.536,.022),l(-.536,-.246),l(-.134,.268),l(-.179,.291),l(-.313,.156),l(-.469,-.022),l(-.357,-.089),M(527.156,37.071),l(-.59,-.14),l(-.955,-.21),l(-1.128,-.139),l(-.739,.054),l(-.959,.037),l(-.732,.143),l(-.411,-.105),l(-1.025,-.476),l(.737,-.303),l(1.21,-.429),l(.654,-.09),l(1.549,-.002),l(.135,-.357),l(-.728,-.338),l(.351,-.269),l(.419,-.144),l(.676,-.02),l(.852,-.181),l(-.25,-.161),l(-.526,-.233),l(1.539,-.895),l(.513,-.129),l(.226,.073),l(.892,.017),l(.981,-.535),l(.863,-.333),l(1.02,-.261),l(.975,-.15),l(1.305,-.113),l(1.274,.053),l(.738,-.15),l(.786,-.615),l(.273,.018),l(.873,-.132),l(1.722,.276),l(.471,-.038),l(1.93,-.321),l(.958,-.039),l(2.184,-.247),l(1.864,-.116),l(.771,-.564),l(.376,-.152),l(2.511,-.137),l(1.965,-.079),l(.471,.131),l(.442,.225),l(.154,.357),l(-.812,.47),l(-.541,.169),l(-1.346,.319),l(-2.609,.433),l(-4.329,.49),l(-2.187,.281),l(-2.122,.299),l(-1.842,.316),l(-2.102,.242),l(-.941,.203),l(-.288,.274),l(.644,.216),l(-.422,.217),l(-.943,.361),l(-.527,.037),l(-2.047,-.068),l(-.432,.18),l(-.119,.233),l(.621,.249),l(-.331,.233),l(-1.206,.448),l(-.402,-.142),l(-.752,-.087),l(-.592,.304),l(.877,.283),l(.052,.319),l(-1.094,.657),l(-.822,.284),M(517.491,38.443),l(1.041,-.37),l(.512,-.299),l(.428,-.212),l(1.426,-.021),l(1.316,-.249),l(.987,-.02),l(1.412,-.091),l(.551,.069),l(.988,.227),l(-.063,.176),l(-.463,.528),l(-.302,.158),l(-.697,.071),l(-.443,.228),l(-.233,.385),l(.006,.818),l(.445,1.039),l(.957,.826),l(.505,.308),l(.775,.307),l(1.162,.392),l(-.028,.282),l(-2.62,-.089),l(-.844,.053),l(-.917,.326),l(-.596,.086),l(-.676,-.494),l(-.382,-.034),l(-1.091,.088),l(-.673,-.102),l(-.031,-.359),l(1.347,-.362),l(.073,-.24),l(-.102,-.017),l(-.944,-.273),l(-1.442,-.411),l(-1.519,-.17),l(-.33,.156),l(-.624,.122),l(-.681,-.033),l(-.625,-.396),l(-.114,-.415),l(.229,-.312),l(.39,-.209),l(.344,-.036),l(.318,.104),l(.65,.016),l(.518,-.192),l(1.121,-.768),l(.243,-.35),l(-.322,0),l(-.981,-.243),M(.125,56.089),l(0,-.562),l(0,-.576),l(0,-.157),l(0,-1.292),V(0,51.28),l(0,-2.222),l(0,-2.12),l(2.917,.61),l(1.693,.598),l(.933,.181),l(3.819,.99),l(1.059,.395),l(.204,.149),l(.074,.214),l(.445,.429),l(.406,.789),l(-.209,.428),l(1.034,.8),l(.982,.26),l(-.02,-.18),l(.297,-.148),l(-.051,-.196),l(-.638,-.392),l(.016,-.542),l(.077,-.296),l(1.026,-.183),l(.984,.278),l(.573,.098),l(.767,.064),l(1.003,-.117),l(.933,.13),l(.93,.425),l(.694,.359),l(1.676,.684),l(.32,.081),l(.584,.179),l(.43,.211),l(.09,.13),l(-.343,.033),l(-1.026,-.096),l(-.364,.034),l(-.808,.798),l(-1.539,-.468),l(.138,.178),l(.438,.227),l(.465,.324),l(-1.177,-.111),l(-1.008,.05),l(-1.202,-.387),l(-.708,-.096),l(.135,.129),l(.289,.259),l(.084,0),l(.561,.259),l(.205,.307),l(.131,.453),l(-.056,.339),l(-.814,.05),l(-.805,.065),l(-.189,.161),l(.5,.865),l(-.115,.272),l(-1.04,-.078),l(-.397,.081),l(-1.193,-.174),l(-.264,-.352),l(-1.795,-.51),l(-.253,.273),L(9.85,55.79),l(-.276,-.161),l(-.265,-.403),l(.174,-.178),l(-.321,-.42),l(-.87,-.339),l(-.565,-.063),l(-.762,.034),l(-.858,.229),l(-1.343,.084),L(3.57,54.443),l(.059,-.325),l(-.155,-.325),l(-.618,-.487),L(1.958,53.43),l(-.45,.409),l(-.655,1.228),l(-.166,.715),l(-.562,.307), +N(449.401,22.792),l(-1.596,-.014),l(-2.019,-.016),l(-1.739,.063),l(-.764,.061),l(-1.972,-.316),l(.812,-.456),l(.826,-.172),l(.735,-.453),l(1.148,-.588),l(1.354,.691),l(.998,.105),l(1.116,-.088),l(.9,.084),l(.704,.341),l(.865,-.323),l(.53,-.454),l(.868,-.306),l(-.311,.823),l(.086,.32),l(.851,-.001),l(.991,-.495),l(1.061,-.261),l(.803,.128),l(.559,.472),l(.705,.041),l(2.007,-.111),l(1.543,.189),l(.551,.376),l(-.507,.201),l(-2.004,.622),l(-1.623,.38),l(-1.069,.062),l(-.976,.14),l(-1.324,.366),l(-6.271,-.097),l(-.033,-.377),l(1.492,-.26),l(.702,-.677),M(430.027,22.752),l(.068,.697),l(.252,.119),l(1.694,.155),l(.221,-.377),l(.13,-.418),l(.573,-.141),l(.523,-.041),l(.949,.477),l(1.192,.771),l(.798,.235),l(.568,-.218),l(-.222,-.296),l(-.46,-.356),l(-.327,-.477),l(-.04,-.22),l(.91,-.407),l(1.001,.103),l(.485,.18),l(1.278,.018),l(.586,.179),l(-.08,.419),l(-.169,.298),l(.104,.159),l(.549,.118),l(.743,-.338),l(.44,-.1),l(.662,.396),l(.678,.335),l(.785,.156),l(.948,.117),l(1.672,.429),l(.498,.234),l(-1.305,.277),l(-1.981,.218),l(-.696,.293),l(-.731,1.144),l(-.885,.885),l(-1.243,.117),l(-.766,.535),l(-.455,.589),l(-.029,.378),l(-.786,.209),l(-.556,-.018),l(-1.593,-.355),l(-1.883,-.507),l(-1.365,-.568),l(.651,-.364),l(1.565,-.041),l(1.788,-.137),l(.944,-.386),l(-.652,-.249),l(-1.822,.139),l(-1.566,.118),l(-1.694,.042),l(-.502,-.519),l(.959,-.06),l(1.371,-.215),l(2.149,-.314),l(1.547,-.45),l(-2.525,-.405),l(-.881,-.292),l(-.589,.138),l(-1.036,.646),l(-1.069,.293),l(-.562,.059),l(-1.236,-.172),l(-.338,-.174),l(-1.05,-.368),l(-.807,-.233),l(-.698,-.41),l(1.698,-.396),l(-.817,-.571),l(-1.359,.319),l(-.467,-.078),l(-.924,-.751),l(.812,-.36),l(.516,-.021),l(1.075,-.122),l(1.017,.038),l(.577,-.061),l(1.188,-.042),M(425.42,68.82),l(-.148,-.21),l(-.629,.132),l(-.134,-.026),l(-.249,-.237),l(-.239,-.343),l(.188,-.158),l(-.143,-.291),l(-.361,.185),l(-.062,.29),l(.113,.237),l(-.147,.105),l(-.339,.316),l(-.086,.185),l(-.521,.105),l(-.533,-.131),l(-.781,.342),l(.057,.131),l(-.502,.289),l(-.498,.263),l(-1.658,.813),L(418.697,71),l(-.274,.052),l(-.271,0),l(-2.111,.209),l(-.188,-.236),l(-.33,-.131),l(-.183,.209),L(414.976,71),l(.384,-.184),l(-.935,-.236),l(-.794,-.341),l(-.574,-.052),l(-.479,-.578),l(.292,-.368),l(-.126,-.21),l(.34,.026),l(.085,.316),l(.284,-.21),l(.667,.263),l(-.244,-.197),l(.127,-.145),l(.5,-.092),l(-.479,.026),l(-.245,.105),l(-.263,-.184),l(-.111,-.132),l(.579,-.276),l(.455,-.185),l(-.482,.066),l(-.317,-.132),l(.441,-.237),l(.083,-.237),l(-.661,.475),l(-.036,-.264),l(-.265,-.171),l(.005,.211),l(.076,.171),l(-.419,.158),l(-.41,0),l(.014,-.277),l(-.15,.264),l(-.235,-.079),l(-.2,-.448),l(.658,-.449),l(.08,.436),l(.068,-.317),l(.438,.158),l(.211,-.092),l(-.166,-.106),l(.674,-.079),l(.479,-.251),l(-.611,.159),l(-.48,0),l(-.335,-.159),l(.196,-.132),l(.387,-.146),l(.196,-.471),l(-.821,-.014),l(-.546,.094),l(-.406,-.309),l(.368,-.14),l(.643,-.404),l(-.212,-.186),l(-.445,.063),l(-.399,-.062),l(-.211,-.217),l(.284,-.482),l(.619,-.265),l(-.595,-.248),l(-.225,-.374),l(.272,-.188),l(-.089,-.687),l(.106,-.094),l(.594,-.063),l(.392,-.045),l(.455,.044),l(.082,-.11),l(-.255,-.134),l(-.425,-.118),l(-.228,-.17),l(.098,-.188),l(.211,-.125),l(.575,-.064),l(.511,-.346),l(.567,.109),l(.498,-.111),l(.179,-.55),l(.835,.093),l(.668,.125),l(.571,-.252),l(-.989,-.234),l(-.266,-.314),l(.236,-.143),l(1.151,.014),l(.851,-.08),l(.538,.219),l(.06,-.473),l(.477,-.27),l(.297,-.333),l(.78,-.175),l(.438,.189),l(.138,.079),l(.5,-.476),l(.869,-.413),l(.084,-.429),l(.437,-.398),l(1.497,-.735),l(.335,-.192),l(.235,-.048),l(.481,.175),l(.335,-.001),l(.319,-.224),l(-.225,-.223),l(.141,-.128),l(.488,-.224),l(.457,-.305),l(.481,-.483),l(.245,.064),l(.676,-.017),l(-.067,-.612),l(-.471,-.112),l(.434,-.405),l(.511,-.648),l(.841,.063),l(.047,-.341),l(.096,-.228),l(.954,-.116),l(-.396,-.357),l(-.327,-.097),l(-.193,-.146),l(.164,-.245),l(.313,-.246),l(.464,.048),l(.888,-.067),l(-.543,-.522),l(.249,-.082),l(.435,-.034),l(.707,-.263),l(.592,-.067),l(.308,-.208),l(-.358,-.064),l(-.105,-.187),l(.289,-.1),l(.616,-.33),l(.557,.032),l(.351,.098),l(.434,-.264),l(.369,-.031),l(.035,-.176),l(-.421,-.321),l(.627,-.232),l(.146,-.275),l(.336,.01),l(.359,.297),l(.397,.082),l(.526,-.381),l(-.281,-.656),l(.438,.065),l(.698,-.058),l(.207,-.174),l(-.604,-.315),l(.411,-.224),l(.816,-.251),l(.093,-.257),l(.261,-.194),l(.73,-.135),l(.074,.067),l(.274,-.051),l(.102,-.067),l(.492,-.67),l(.521,.25),l(.96,-.153),l(.411,.133),l(.265,.1),l(.646,.065),l(.536,-.419),l(.747,-.84),l(.286,-.085),l(.16,.168),l(-.178,.286),l(-.182,.587),l(.791,-.454),l(.403,-.572),l(.819,-.085),l(.688,-.439),l(.437,.117),l(.665,.353),l(.567,-.643),l(.318,-.272),l(.976,.1),l(1.019,.506),l(.197,-.152),l(.479,-.595),l(.709,-.444),l(.283,-.052),l(.562,.067),l(.338,-.308),l(.469,-.291),l(.619,-.189),l(1.2,-.173),l(.984,.015),l(-1.337,.755),l(-.24,.273),l(-.107,.646),l(.42,.084),l(.691,-.579),l(1.53,-.941),l(.764,-.275),l(.028,.257),l(-.004,.905),l(.704,-.172),l(.438,-.239),l(.855,-.874),l(.959,-.104),l(.586,-.001),l(.216,.154),l(-.383,.257),l(-.335,.257),l(.074,.239),l(-.319,.41),l(.921,.118),l(.221,-.443),l(.902,-.651),l(.421,.017),l(1.682,.561),l(.667,.135),l(.935,.015),l(.649,.237),l(.1,.272),l(-1.216,.393),l(-1.148,.036),l(-2.233,-.047),l(.193,.084),l(.585,.304),l(1.058,.284),l(.383,.302),l(.728,-.052),l(.679,-.102),l(.831,.032),l(.708,.25),l(-.404,.288),l(-.514,.204),l(-.824,.021),l(-.77,.121),l(-1.023,.49),l(-1.013,.672),l(-.689,.303),l(-.001,-.2),l(.096,-.367),l(.874,-.923),l(-.044,-.268),l(-.88,-.348),l(-.672,-.114),l(-1.125,-.431),l(-.556,.003),l(-.555,.07),l(-2.004,.095),l(-.865,.374),l(-.567,.422),l(-.26,.437),l(-.079,.501),l(-.188,.5),l(-1.25,.472),l(-.582,.368),l(-.31,-.148),l(-1.288,-.492),l(-1.657,.225),l(-1.411,-.042),l(-.536,-.13),l(-.861,-.595),l(-.994,-.612),l(-.486,-.082),l(-.355,.103),l(-1.012,.656),l(-.114,-.063),l(-.41,-.031),l(-.865,.038),l(-.281,1.066),l(-.164,.449),l(-.271,.25),l(-.323,-.015),l(-.67,-.129),l(-.972,-.144),l(-1.731,-.389),l(-.168,.183),l(-.021,.663),l(-.083,.199),l(-.318,.299),l(-.695,.004),l(-.871,-.095),l(-.279,-.015),l(-.465,.167),l(-1.484,1.176),l(.05,.213),l(.171,.507),l(-.188,.345),l(-.615,.346),l(-1.325,.919),l(-.687,.442),l(-.981,.021),l(-.121,.244),l(-.06,.971),l(-.32,.598),l(-.383,.469),l(-.574,.499),l(-.495,.545),l(.339,.125),l(.381,.269),l(.252,.587),l(-.17,.176),l(-.44,.177),l(-.733,.036),l(-.932,-.027),l(-.618,.114),l(-.613,.257),l(-.617,.479),l(-.389,.492),l(-.077,.664),l(-.349,1.093),l(.65,.729),l(-.335,1.171),l(.582,.39),l(.715,.186),l(.297,.243),l(-.432,.67),l(-.941,.16),l(.571,.735),l(.26,.427),l(-.249,.346),l(-.029,.532),l(-.769,.384),l(-.414,.013),l(-.117,.423),l(-.506,.224),l(.22,.831),l(-.324,.737),l(-.41,.013),l(-.15,-.342),l(-.293,-.132), +N(464.349,47.431),l(-.024,.283),l(-.258,.465),l(.116,.529),l(.563,.212),l(.872,.194),l(.964,.506),l(.543,.392),l(-.421,.364),l(-1.303,.777),l(-.328,.296),l(1.402,1.394),l(.772,1.195),l(-.196,.356),l(-.44,.535),l(-.187,.403),l(-.029,.37),l(.37,.509),l(1.286,1.395),l(.151,.253),l(-.057,.254),l(-.542,.415),l(-.327,.191),l(.439,.33),l(1.357,.499),l(.703,.265),l(.436,.392),l(.161,.346),l(-.105,.409),l(-.43,.536),l(-.591,.536),l(-1.385,.758),l(-1.983,1.195),l(-1.946,1.145),l(-.174,.285),l(-.935,.206),l(-1.195,.188),l(-.149,.181),l(-.506,-.217),l(-.518,.146),l(-.052,.134),l(-.688,-.07),l(-.193,-.108),l(.057,-.387),l(-.241,.527),l(-.268,.14),l(-.633,.047),l(-.328,.03),l(-.1,.267),l(-.589,-.326),l(-.29,.275),l(-.676,.064),l(-.34,.178),l(-.052,-.127),l(-.504,.108),l(-.504,.108),l(-.211,.266),l(-.311,-.152),l(-.672,.126),l(-.04,-.114),l(-.658,.215),l(-.547,.013),l(-.482,.025),l(-.487,-.253),l(-.223,-.274),l(.273,-.34),l(-.846,.017),l(-.517,.177),l(.065,-.382),l(-.446,.076),l(-.644,-.271),l(-.409,-.061),l(-.415,-.231),l(-.26,-.403),l(-.036,-.714),l(.158,-.374),l(.05,-.436),l(.09,-.234),l(-.347,-.483),l(-.431,-.375),l(.3,-.658),l(-.02,-.392),l(-.305,-.204),l(-.37,-.093),l(.062,-.299),l(.295,-.331),l(.637,-.285),l(.144,-.189),l(-.113,-.331),l(.382,-.143),l(.633,.125),l(.274,.063),l(.483,-.222),l(.303,-.427),l(.104,-.459),l(.207,-.27),l(.301,.316),l(.27,0),l(1.678,-1.114),l(1.142,-.654),l(.835,-.576),l(1.026,-.401),l(.874,.03),l(.06,-.304),l(-.13,-.144),l(-.357,-.16),l(.119,-.371),l(.146,-.387),l(-.329,-.274),l(-1.139,-.095),l(-.836,-.451),l(-.594,-.024),l(-.113,-.234),l(-.327,-.307),l(-.208,-.535),l(.5,-.8),l(-.028,-.392),l(-.405,-.685),l(-.507,-.637),l(.004,-.526),l(.062,-.413),l(-.77,-.558),l(-.508,-.229),l(-1.583,-.207),l(-1.085,-.292),l(-1.286,-.658),l(-.616,-.463),l(-.146,-.033),l(1.012,-.656),l(.355,-.103),l(.486,.082),l(.994,.612),l(.861,.595),l(.536,.13),l(1.411,.042),l(1.657,-.225),l(1.288,.492),l(.31,.148),l(.582,-.368),l(1.25,-.472),l(.188,-.5),l(.079,-.501),l(.26,-.437),l(.567,-.422),l(.865,-.374),l(2.004,-.095),l(.555,-.07),l(.556,-.003),l(1.125,.431),l(.672,.114),l(.88,.348),l(.044,.268),l(-.874,.923),l(-.096,.367),l(.001,.2), +N(453.795,53.873),l(-.23,-.004),l(-.975,.164),l(-.447,.098),l(-.902,-.387),l(-.339,-.178),l(-.347,.114),l(-.641,.374),l(-.542,.599),l(-.309,.146),l(-.658,.018),l(-.545,.355),l(.325,.241),l(.146,.192),l(-.355,.273),l(-.907,.401),l(.317,.271),l(.385,.159),l(.33,.302),l(-.749,.367),l(-.405,.43),l(-.368,.461),l(-1.591,.669),l(-.699,.286),l(-.456,-.205),l(-.326,.08),l(-.538,.539),l(-.646,.144),l(-.663,.348),l(-.217,.284),l(-.191,.142),l(-.746,.033),l(-.221,-.031),l(.151,.535),l(-.484,.425),L(439,61.33),l(.216,.533),l(.243,.25),l(-.244,.955),l(-.498,.063),l(-.217,.204),l(.189,.757),l(-.009,.544),l(.381,.444),l(-.287,.175),l(.926,.082),l(.225,.187),l(.499,-.082),l(.652,.594),l(.428,.314),l(.86,.163),l(.198,.406),l(.32,.139),l(.014,.335),l(-.391,0),l(-.508,.323),l(-.861,.3),l(-.492,.162),l(-.521,-.012),l(-.146,-.115),l(-.805,-.115),l(-.66,-.173),l(-.634,-.069),l(-.137,.104),l(-.446,-.115),l(-.257,.3),l(.819,-.069),l(.497,.265),l(.591,.046),l(.205,.208),l(.481,.069),l(.021,-.127),l(.616,.069),l(.258,-.196),l(.297,.011),l(.481,-.104),l(.226,.081),l(.026,-.15),l(.164,0),l(.214,.15),l(-.029,.081),l(-.722,.023),l(.219,.288),l(-.792,.265),l(-.168,.288),l(-.386,.08),l(-.089,-.092),l(.042,-.161),l(-.014,-.276),l(-.258,.023),l(-.091,.46),l(-.501,.333),l(-.248,.058),l(-.36,-.069),l(-.005,.218),l(-1.418,.035),l(.156,.458),l(.513,.258),l(.066,.609),l(-.109,.33),l(-.281,.051),l(-.308,-.064),l(.038,.429),l(.29,.081),l(-.126,.268),l(.24,.228),l(-.365,.364),l(-.222,.455),l(-.041,.56),l(-.766,1.043),l(-.58,.71),l(-.165,-.062),l(-.442,-.236),l(-.614,.193),l(-1.262,-.089),l(-.106,.311),l(-.252,-.083),l(-.518,.264),l(-.295,.517),l(.356,.336),l(-.376,.374),l(-.48,-.129),l(-.173,-.037),l(-1.158,.269),l(-1.11,-.116),l(-.001,-.142),l(.19,-.078),l(-.062,-.181),l(.281,-.297),l(-.638,-.53),l(-.413,-.479),l(-.22,-.272),l(.529,-.116),l(-.082,-.312),l(.421,.077),l(.147,-.245),l(-.19,-.234),l(-.285,.013),l(-.292,-.377),l(-.527,-.221),l(-.63,-.99),l(-.286,0),l(.011,-.408),l(-.256,-.364),l(-.348,-.298),l(.221,-.484),l(.206,-.341),l(-.418,-.154),l(-.405,.102),l(-.055,-.288),l(-.412,.051),l(-.18,-1.207),l(-.225,-.131),l(.311,-.355),l(.293,.132),l(.15,.342),l(.41,-.013),l(.324,-.737),l(-.22,-.831),l(.506,-.224),l(.117,-.423),l(.414,-.013),l(.769,-.384),l(.029,-.532),l(.249,-.346),l(-.26,-.427),l(-.571,-.735),l(.941,-.16),l(.432,-.67),l(-.297,-.243),l(-.715,-.186),l(-.582,-.39),l(.335,-1.171),l(-.65,-.729),l(.349,-1.093),l(.077,-.664),l(.389,-.492),l(.617,-.479),l(.613,-.257),l(.618,-.114),l(.932,.027),l(.733,-.036),l(.44,-.177),l(.17,-.176),l(-.252,-.587),l(-.381,-.269),l(-.339,-.125),l(.495,-.545),l(.574,-.499),l(.383,-.469),l(.32,-.598),l(.06,-.971),l(.121,-.244),l(.981,-.021),l(.687,-.442),l(1.325,-.919),l(.615,-.346),l(.188,-.345),l(-.171,-.507),l(-.05,-.213),l(1.484,-1.176),l(.465,-.167),l(.279,.015),l(.871,.095),l(.695,-.004),l(.318,-.299),l(.083,-.199),l(.021,-.663),l(.168,-.183),l(1.731,.389),l(.972,.144),l(.67,.129),l(.323,.015),l(.271,-.25),l(.164,-.449),l(.281,-1.066),l(.865,-.038),l(.41,.031),l(.114,.063),l(.146,.033),l(.616,.463),l(1.286,.658),l(1.085,.292),l(1.583,.207),l(.508,.229),l(.77,.558),l(-.062,.413),l(-.004,.526),l(.507,.637),l(.405,.685),l(.028,.392),l(-.5,.8),l(.208,.535),l(.327,.307),l(.113,.234), +N(238.107,361.753),l(.515,-.688),l(.859,0),l(1.202,-.515),l(-.171,-.858),l(-3.091,.344),l(-2.061,.515),l(-1.545,-.344),l(-.515,-.858),l(1.374,-.515),l(1.202,-.172),l(3.091,-.172),l(1.374,-.515),l(-.172,-1.03),l(.859,-.516),l(0,-1.374),l(-1.326,-1.054),l(.982,-.491),l(1.202,-.344),l(1.545,-.172),l(.858,.344),l(.858,.858),l(1.03,1.374),l(1.374,1.202),l(1.03,1.373),l(-.515,2.061),l(-1.545,.516),l(-1.545,.858),l(-3.434,.172),l(-3.435,0),M(172.686,360.379),l(3.091,-.687),l(3.262,0),l(5.495,0),l(2.919,1.202),l(-2.748,.687),l(-3.759,-.337),l(-5.169,-.35),l(-3.091,-.516),M(65.13,371.085),l(1.194,-.265),l(1.393,.133),l(.796,.464),l(-1.99,0),l(-1.393,-.332),M(277.944,379.954),l(.515,-1.202),l(2.404,-1.03),l(2.748,-.172),l(2.061,-.171),l(1.545,-.859),l(.343,-1.545),l(1.374,-.687),l(3.091,-.688),l(4.464,0),l(2.404,0),l(3.434,.688),l(.687,1.889),l(0,1.202),l(-2.061,1.201),l(-11.848,1.03),l(-11.161,.344),M(36.004,376.434),l(1.202,-.858),l(2.061,-.343),l(4.121,.515),l(4.293,1.374),l(-.887,.482),l(-2.719,.204),l(-4.293,-.515),l(-3.777,-.859),M(777.843,385.46),l(3.823,.391),l(.899,.029),l(.322,.234),l(1.202,.294),l(2.329,.088),l(2.126,-.003),l(5.218,.329),l(3.046,.348),l(1.144,-.059),l(.762,.029),l(1.411,.37),l(0,2.175),l(0,2.223),l(0,2.222),l(0,2.223),l(0,2.222),l(0,1.551),l(-.041,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.182,0),l(-.041,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.182,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),H(9.014,0),H(6.792,0),H(4.569,0),H(2.347,0),H(.125,0),l(0,-1.544),l(0,-2.222),l(0,-2.223),l(0,-2.222),l(0,-2.223),l(0,-2.223),l(3.941,.297),l(10.131,0),l(7.898,.516),l(6.868,.172),l(8.586,.858),l(6.353,.515),l(8.757,.172),l(4.808,-.172),l(6.525,-.172),l(2.404,.344),l(3.606,-.858),l(16.312,.344),l(4.638,-.013),l(1.143,-.467),l(-14.366,-.551),l(-9.616,-.688),l(-2.232,0),l(-3.091,-.172),l(-.858,-.171),l(-1.545,-.344),l(-.498,-.455),l(.155,-1.434),l(.687,-.858),l(1.889,-.688),l(-3.263,-.687),l(-2.232,-.344),l(-.953,-.503),l(1.589,-.521),l(-2.891,-.6),l(-3.074,-.208),l(-.104,-.261),l(2.857,-.312),l(2.748,0),l(6.525,.343),l(3.434,0),l(2.576,.344),l(4.636,-1.202),l(2.404,-.687),l(-2.748,-1.03),l(-3.778,-.858),l(-4.391,-.405),l(-2.649,-.625),l(-3.262,-.172),l(-2.919,0),l(-2.919,-.858),l(2.576,-.516),l(1.28,-.342),l(-1.28,-.517),l(-2.919,.516),H(52.66,0),l(-1.717,-.344),L(49.054,373),l(.343,-1.202),l(1.956,-.07),l(1.65,-.273),l(4.98,0),l(4.626,.493),l(3.272,.709),l(1.374,.172),l(4.465,-.858),l(4.089,.243),l(0,-.729),l(.066,-.597),l(-2.255,-.73),l(-2.93,-.075),l(-2.576,-.344),l(2.404,-.687),l(4.121,.171),l(1.717,-.343),l(3.091,-.516),l(3.09,-.343),l(5.667,-.688),l(4.465,-.343),l(3.949,-.516),l(4.464,-.515),l(2.748,.343),l(5.667,0),l(4.464,.258),l(4.121,-.515),l(7.898,.343),l(7.555,-.687),l(3.091,.172),l(1.545,-.688),l(1.545,.516),l(5.323,-.172),l(.121,-.87),l(1.758,-.293),l(1.433,.325),l(.586,.554),l(-.423,.813),l(2.364,.329),l(1.38,-.264),l(-.006,-.938),l(1.438,-.267),l(1.48,.267),l(.212,1.036),l(-1.009,.423),l(.521,.781),l(3.024,-.351),l(1.889,.343),l(3.434,.172),l(2.576,-.687),l(3.778,.086),l(4.868,.33),l(2.344,.013),l(1.449,.109),l(.693,-.53),l(-.611,-.285),l(-2.202,-.122),l(1.305,-.285),l(.041,-.408),l(-.367,-.245),l(-1.386,.123),l(-.693,.04),l(-.856,-.979),l(-2.178,-.337),l(-.676,-.193),l(-.182,-.665),l(4.056,.462),l(3.874,-.245),l(-1.224,-.489),l(-6.035,-.163),l(-.774,-.082),l(-.653,-.489),l(0,-.815),l(2.301,.105),l(.839,.67),l(5.301,-.204),l(7.253,.736),l(2.404,-.172),l(3.262,-.172),l(4.464,.172),l(3.263,.172),l(2.061,-.516),l(.687,-.687),l(1.202,0),l(.344,1.03),l(2.576,.343),l(2.404,-.343),l(.858,.515),l(3.435,.688),l(3.777,.343),l(2.061,.172),l(1.03,-.515),l(.687,-1.202),l(2.747,-.172),l(1.03,.515),l(1.717,.688),l(3.091,-.172),l(3.434,.258),l(4.121,-.344),l(4.979,-.516),l(5.495,-.858),l(3.091,-.515),l(1.202,-.688),l(0,-1.373),l(-1.374,-1.202),l(-.859,-1.545),l(-1.202,-.688),l(-.344,-1.03),l(1.202,-1.03),l(1.717,-.343),l(.858,-1.202),l(-.343,-.858),l(-.172,-1.03),l(-1.202,-.516),l(.344,-1.545),l(1.889,-.172),l(2.404,-1.374),l(1.545,-.515),l(.859,-.859),l(1.03,-.687),l(2.919,-1.202),l(3.606,-.515),l(2.404,-1.202),l(2.404,-.172),l(2.232,-1.03),l(1.545,-.343),l(.343,1.03),l(-1.374,.515),l(-1.03,.344),l(-1.202,.515),l(-.858,0),l(-1.202,0),l(-2.919,1.202),l(-1.03,.687),l(-1.717,1.374),l(-.172,1.202),l(-.687,.687),l(-1.374,-.344),l(-1.03,0),l(-1.202,.516),l(-1.202,.687),l(-1.03,.688),l(-.687,1.201),l(.515,.688),l(.687,.687),l(1.374,.344),l(1.545,0),l(.858,.515),l(.687,1.202),l(1.545,1.546),l(.687,.858),l(1.03,.687),l(.687,1.374),l(.858,1.373),l(.344,1.546),l(-.344,.858),l(-.858,1.717),l(-2.919,1.889),l(-1.202,.172),l(-1.03,.858),l(-1.717,1.03),l(-3.263,.344),l(-4.979,.858),l(-2.404,.344),l(-2.919,.687),l(-7.377,-.141),l(-4.556,-.316),l(-.773,-.401),l(-1.717,-.344),l(-1.717,-.343),l(-1.374,0),l(-.859,.515),l(.515,.858),l(2.061,.688),l(4.121,1.202),l(4.995,.04),l(1.202,.759),l(-3.278,.574),l(-5.667,-.343),l(-4.979,-.516),l(-3.097,-.285),l(-2.151,.253),l(.823,.696),l(1.164,.538),l(3.262,.172),l(2.232,0),l(1.374,.343),l(-.249,.402),l(-.782,.113),l(-2.232,.515),l(-5.151,-.171),l(-1.374,-.172),l(-2.232,-1.202),l(-2.404,0),l(.128,.917),l(2.62,1.144),l(1.03,.172),l(1.202,-.172),l(1.374,.344),l(2.404,0),l(4.98,-.516),l(3.09,.687),l(.385,.431),l(-.041,.6),l(-2.061,.172),l(-3.263,.172),l(-2.608,-.185),l(3.811,.871),l(3.656,-.238),l(1.324,.41),l(2.576,.687),l(6.869,.859),l(8.585,.858),l(10.646,1.373),l(6.525,.516),l(2.061,.858),l(.687,1.03),l(3.091,-.344),l(5.323,-1.545),l(6.525,-.687),l(2.455,-.066),l(6.474,-.105),l(9.788,-.344),l(1.889,.344),l(2.576,-1.202),l(8.414,-1.03),l(11.333,-.172),l(8.929,-.858),l(1.202,-.858),l(-1.202,-.516),l(-.271,-1.07),l(-1.184,-.338),l(-5.071,.035),l(-2.232,.172),l(-4.808,-.344),l(-3.091,0),l(0,-1.202),l(3.263,-1.545),l(3.949,-1.202),l(2.404,-.172),l(4.121,-1.03),l(9.444,-1.202),l(5.323,-.858),l(6.525,0),l(4.979,-.516),l(2.747,-2.061),l(6.039,-1.541),l(-1.23,-.52),l(-2.576,.516),l(-2.061,-.344),l(1.545,-1.03),l(1.545,-.343),l(2.48,-.249),l(.696,-.742),l(3.85,-.742),l(1.577,-.418),l(.603,-.557),l(-1.716,-.881),l(-.093,-.604),l(1.252,-.231),l(.464,.742),l(1.017,-.097),l(2.061,-.858),l(1.03,-.343),l(.858,.171),l(1.203,1.544),l(2.403,-.342),l(.242,-.91),l(.96,-.807),l(1.889,-.516),l(1.374,.516),l(-1.162,.574),l(-.139,.604),l(3.189,-.319),l(4.808,.258),l(3.263,-.172),l(1.03,.858),l(1.545,-.344),l(1.717,-.515),l(5.839,-.858),l(7.212,-1.03),l(4.292,-.858),l(2.061,0),l(2.061,1.373),l(1.718,.344),l(1.889,-.344),l(1.545,-.858),l(7.556,-.344),l(3.434,-.171),l(4.293,.171),l(6.697,.945),l(2.575,0),l(4.293,-.516),l(6.01,-.687),l(5.151,-.688),l(2.404,-.515),l(2.231,-.344),l(.615,-.959),l(1.148,-.835),l(1.671,-.095),l(.938,.965),l(1.294,.409),l(1.732,1.052),l(1.009,.139),l(1.009,-.661),l(1.322,-.174),l(.209,.522),l(-.835,.312),l(.661,.244),l(.8,.278),l(.383,-.383),l(.313,-.383),l(.312,.209),l(-.174,.348),l(0,.521),l(.592,-.174),l(1.913,-.557),l(.418,-1.704),l(5.102,-1.137),l(1.374,-.687),l(3.605,-.172),l(1.363,-.646),l(2.758,-.126),l(.21,-.27),l(-.165,-.297),l(.692,-.23),l(1.221,.165),l(.197,.593),l(.66,.231),l(2.165,-.536),l(1.265,-.223),l(-.726,-.297),l(-.561,-.264),l(.099,-.362),l(1.451,-.1),l(1.562,.215),l(.647,.28),l(.692,-.132),l(-.066,-.33),l(-.527,-.33),l(0,-.561),l(.297,-.23),l(.846,-.242),l(4.292,-.858),l(2.92,-.172),l(3.058,.115),l(2.296,1.076),l(1.316,.023),l(.741,.144),l(.023,.383),l(-.908,.096),l(-.168,.454),l(1.723,.216),l(4.892,.646),l(5.571,.453),l(1.546,.172),l(1.717,-.172),l(7.556,.688),l(5.323,0),l(.687,.687),l(.2,1.075),l(-.73,1.232),l(-.672,.439),l(-.425,1.113),l(-.73,.319),l(-.905,-.402),l(-.83,.402),l(-.73,.959),l(1.507,.457),l(.594,.045),l(.959,-.593),l(.411,.365),l(-.867,1.05),l(-1.215,.062),l(-1.717,1.374),l(0,.858),l(1.889,.688),l(2.919,0),l(1.718,-.859),l(1.889,-1.545),l(1.717,-1.717),l(1.374,-.688),l(4.121,-1.03),l(2.231,-.687),l(3.263,-.344),l(2.061,-1.03),l(1.03,-1.03),l(3.435,-1.03),l(2.403,-.687),l(2.061,-.687),l(2.061,-.172),l(6.182,-.687),l(3.778,.171),l(1.204,-.542),l(.169,-.659),l(.54,-.759),l(.49,-.101),l(.471,.776),l(.305,.775),l(4.892,-.35),l(5.838,0),l(4.979,-.172),l(3.091,.344),l(2.112,-.214),l(1.328,.085),l(1.018,.594),l(1.188,-.764),l(2.714,-1.046),l(1.866,-.226),l(.664,-.028),l(.594,-.028),l(.777,-.057),l(1.512,.311),l(1.166,-.172),l(3.606,.687),l(3.777,.344),l(1.03,0),l(1.064,.573),l(.745,.088),l(2.149,-.088),l(1.271,-.263),l(1.315,-.438),l(-.192,-.216),l(.28,-.53),l(1.447,-.131),l(.921,-.088),l(.786,.062),l(2.195,-.501),l(2.097,.501),l(.688,.687),l(.373,.435),l(1.842,-.131),l(.921,-.044),l(.985,.255),l(1.889,.688),l(2.919,.515),l(2.919,-.343),l(4.121,-.258),l(2.232,-.344),l(2.404,0),l(3.521,.315),l(.702,-.755),l(2.158,-.162),l(.863,1.133),l(4.909,.323),l(.917,-1.133),l(1.889,-.593),l(5.988,.013),l(.756,-.283),l(1.996,.108),l(-.432,-1.403),l(.054,-.809),l(1.232,-.36),l(.872,1.277),l(-.647,1.079),l(.805,.219),l(2.81,.482),l(5.262,.376),l(5.494,.344),l(2.278,.583),l(1.283,.14),l(1.396,-.167),l(2.204,.446),l(1.961,-.167),l(.719,.278),l(-.435,.431),l(-.151,.351),l(.293,.123),l(2.081,.331),l(1.078,.484),l(2.706,-.134),l(.377,.595),l(1.038,.227),l(4.808,.515),l(-.123,.536),l(.567,.236),l(2.695,-.095),l(3.214,.181),l(-.329,-.984),l(.71,-.095),l(.804,.426),l(.331,.709),l(1.135,.284),l(2.672,.519),l(2.576,-.343),l(4.017,.999),l(1.626,.495),l(1.672,.871),l(1.626,.023),l(.504,.187),l(.532,-.021),l(.754,-.047),l(.777,.047),l(.896,.589),l(.541,.118),l(.542,.07),l(.142,-.259),l(.471,0),l(1.484,-.048),l(1.416,.237),l(5.951,.535),l(.729,.516),l(1.733,.323),l(2.979,.944),l(.43,-.335),l(.551,.191),l(.454,.67),l(-.741,.215),l(-1.124,.167),l(-.216,.359),l(.168,.263),l(.55,-.048),l(-.024,.67),l(-.43,-.048),l(-.096,.287),l(-.312,.071),l(-.598,.622),l(-.526,.12),l(-.55,.287),l(-.168,.669),l(-1.603,.096),l(-1.339,-.239),l(-1.794,.359),l(-2.153,.425),l(-2.629,.764),l(1.271,1.103),l(-1.907,.212),l(-1.23,-.255),l(-.763,.212),l(-.043,.637),l(-2.374,.169),l(.136,.514),l(.924,.632),l(-.127,.763),l(-.382,.085),l(-.466,.467),l(.551,.466),l(.085,.764),l(-.764,.424),l(.637,.254),l(.763,0),l(.764,.255),l(.339,.509),l(.17,.721),l(1.284,-.187),l(.836,.907),l(2.035,.297),l(.339,.339),l(2.672,.552),l(-4.113,0),l(-2.799,.138),l(-2.332,.541),l(-1.823,-.085),l(-.806,.212),l(-1.611,.339),l(-1.326,-.32),l(-.546,.426),l(1.116,.529),l(-.503,.447),l(-.669,.195),l(-1.117,.753),l(-2.623,.642),l(.475,.391),l(2.205,-.111),l(.53,0),l(.809,.307),l(.168,.363),l(.499,.18),l(.422,.183),l(.111,.894),l(.209,.502),l(3.195,.279),l(2.874,.948),l(3.662,.801),l(5.151,1.202),l(1.456,.062),l(1.015,.17),l(-.146,.234),l(-1.67,.264),l(-.47,.264),l(1.173,.088),l(2.198,-.293),l(1.988,.166), +E(0,0) +}; + +#undef N +#undef M +#undef L +#undef l +#undef E diff --git a/perf/micro/zrusin-another.h b/perf/micro/zrusin-another.h new file mode 100644 index 000000000..f6e72aed4 --- /dev/null +++ b/perf/micro/zrusin-another.h @@ -0,0 +1,668 @@ +/* The data in this file was created by Zack Rusin and downloaded from: + + http://ktown.kde.org/~zrusin/examples/cairorender.tar.bz2 + + It is included in the cairo performance test suite by his + permission, (given in email to Carl Worth on 2006-10-23) +*/ +point_t zrusin_another[] = { +{107.893088734820,103.841923410053}, {106.908713734820,104.920048410053}, +{106.605078419636,105.201721390261}, {102.286079757931,107.612435141518}, +{95.848592904540,109.855345077872}, {95.820873452616,109.863161445001}, +{90.517184462013,111.170008329713}, {87.125000000000,111.625000000000}, +{82.393245921775,111.316572641568}, {77.855183975790,110.402282596173}, +{73.577390672683,108.898617908665}, {69.626442523093,106.822066623894}, +{69.373711344187,106.641023992165}, {57.717461344187,97.141023992165}, +{60.861283165549,97.153157587308}, {52.861026127481,102.679312400770}, +{43.297199733607,107.707604120505}, {38.061787185467,109.824994465236}, +{32.824736230810,111.354170438973}, {27.636335844151,112.281599723349}, +{22.546875000000,112.593750000000}, {19.478437557032,111.949288129016}, +{16.158848619890,110.212087077375}, {13.224557514711,107.109984243309}, +{12.401022392395,105.215121771751}, {12.109375000000,103.234375000000}, +{12.857968117079,98.340329228563}, {15.050447208669,93.495802782054}, +{18.606861885297,88.792446786896}, {23.447261757492,84.321912369510}, +{23.462751811761,84.309735859104}, {29.835792474114,80.170241641945}, +{36.826339837257,77.183700966953}, {44.355342734713,75.374150023260}, +{52.343750000000,74.765625000000}, {54.172214431835,74.493658379815}, +{55.005326273741,73.240819884599}, {54.891695624471,73.637732784350}, +{55.835419478567,69.288398667240}, {56.941029555972,65.553969608663}, +{57.993585771605,68.524034756036}, {53.681468264740,66.410473849442}, +{48.062136369578,64.586219029579}, {42.258612309644,63.317877950046}, +{37.437500000000,62.906250000000}, {32.573685233275,63.044800246717}, +{26.989159126193,63.632907811096}, {20.752015377001,64.279295952574}, +{16.562500000000,64.484375000000}, {16.408072340842,64.479600861137}, +{11.611197340842,64.182725861137}, {11.453516511116,64.167941148499}, +{6.725716011250,62.845442977500}, {4.607850691978,60.769517471259}, +{3.781250000000,57.859375000000}, {4.373461857036,55.042556375256}, +{5.951936001924,52.702230099626}, {6.143541831166,52.540844514692}, +{9.884650718045,51.301737345381}, {10.233131146503,51.254965794601}, +{14.936256146503,50.958090794601}, {15.093750000000,50.953125000000}, +{19.896489079886,51.056672881330}, {25.533897731570,51.448761318515}, +{25.296875000000,51.437500000000}, {30.909892241200,52.067729129895}, +{30.484375000000,52.031250000000}, {39.960841830525,52.410121686268}, +{48.752300459876,53.538988916016}, {48.757228534847,53.539874692156}, +{54.123571896675,54.731960341587}, {58.970980406852,56.270657465230}, +{63.248918806945,58.141504425356}, {66.906851838519,60.330039584234}, +{66.896289983187,60.322652661852}, {70.654761046586,63.581911162241}, +{73.423041490057,67.400928399521}, {75.133561184297,71.670457102504}, +{75.718750000000,76.281250000000}, {74.721151272876,79.892293861068}, +{72.068677652167,83.513297493231}, {70.325052633091,85.868624092784}, +{69.828125000000,88.250000000000}, {70.186304443223,90.552747673203}, +{71.326302526678,92.735137555366}, {73.346308881046,94.894011912335}, +{76.344513137007,97.126213009954}, {79.989627194854,99.164217236556}, +{83.789048154438,100.596188457783}, {87.811323321056,101.441306202608}, +{92.125000000000,101.718750000000}, {97.462586180660,101.070932456387}, +{97.557831952069,101.055648080491}, {103.015964519671,99.851433056816}, +{103.984375000000,99.656250000000}, {106.046875000000,99.656250000000}, +{107.893088734820,103.841923410053}, {106.046875000000,104.656250000000}, +{103.984375000000,104.656250000000}, {104.952785480329,104.461066943184}, +{98.254668047931,106.006851919509}, {98.349913819340,105.991567543613}, +{92.125000000000,106.718750000000}, {87.170121991444,106.371193797392}, +{82.386733095562,105.341311542217}, {77.843380617646,103.648282763444}, +{73.608611862993,101.311286990046}, {69.914433306454,98.422394337665}, +{67.154166223322,95.217987444634}, {65.426000244277,91.794908576797}, +{64.828125000000,88.250000000000}, {65.079958470471,86.099459712769}, +{65.803853616909,83.955594657216}, {68.478197347833,80.033577506769}, +{70.243692477124,77.869424888932}, {70.718750000000,76.281250000000}, +{70.335188815703,72.767042897496}, {69.139458509943,69.692821600479}, +{67.063988953414,66.949338837759}, {64.041210016813,64.427347338148}, +{64.030648161481,64.419960415766}, {57.122769593148,60.885592534770}, +{47.867771465153,58.460125307844}, {47.872699540124,58.461011083984}, +{39.531345669475,57.386753313732}, {30.484375000000,57.031250000000}, +{30.058857758800,56.994770870105}, {25.296875000000,56.437500000000}, +{25.059852268430,56.426238681485}, {19.697260920114,56.052702118670}, +{15.093750000000,55.953125000000}, {15.251243853497,55.948159205399}, +{10.548118853497,56.245034205399}, {10.896599281955,56.198262654619}, +{9.168958168834,56.521655485308}, {9.360563998076,56.360269900374}, +{8.781250000000,57.859375000000}, {8.758601803360,58.189255218076}, +{8.735899308021,58.292982528741}, {8.961783988750,58.373307022500}, +{12.077733488884,59.207058851501}, {11.920052659158,59.192274138863}, +{16.716927659158,59.489149138863}, {16.562500000000,59.484375000000}, +{20.310484622999,59.298829047426}, {26.432715873807,58.663967188904}, +{32.129439766725,58.064574753283}, {37.437500000000,57.906250000000}, +{42.956231440356,58.377434549954}, {49.359738630422,59.757530970421}, +{55.603687985260,61.808276150558}, {60.600164228395,64.257215243964}, +{61.652720444028,67.227280391337}, {60.695830521433,70.461601332760}, +{59.795804375529,74.612267215650}, {59.682173726259,75.009180115401}, +{58.534870256371,76.967235761415}, {56.827785568165,78.467279120185}, +{54.713289027441,79.427384197713}, {52.343750000000,79.765625000000}, +{45.078251015287,80.284053101740}, {38.408035162743,81.855361533047}, +{32.254051275886,84.503586483055}, {26.537248188239,88.252764140896}, +{26.552738242508,88.240587630490}, {22.301341239703,92.064975088104}, +{19.363615291331,95.777634717946}, {17.659610007921,99.470217646437}, +{17.109375000000,103.234375000000}, {17.462942485289,104.745484506691}, +{18.934901380110,106.053537922625}, {21.052812442968,107.257743120984}, +{22.546875000000,107.593750000000}, {27.127336030849,107.323869026651}, +{31.729951269190,106.505204561027}, {36.405009689533,105.124224284764}, +{41.202800266393,103.167395879495}, {50.256161372519,98.422250099230}, +{57.732466834451,93.253092412692}, {60.876288655813,93.265226007835}, +{72.532538655813,102.765226007835}, {72.279807476907,102.584183376106}, +{75.647218702317,104.376772716335}, {79.199503524210,105.636779903827}, +{83.003238453225,106.380692983432}, {87.125000000000,106.625000000000}, +{94.491626547384,105.043088554999}, {94.463907095460,105.050904922128}, +{100.135795242069,103.121939858482}, {103.519921580364,101.267028609739}, +{103.216286265180,101.548701589947}, {104.200661265180,100.470576589947}, +{106.046875000000,104.656250000000}, {107.893088734820,103.841923410053}, +{55.872490683787,89.763134548637}, {54.997490683787,85.841259548637}, +{55.036476188094,85.993355189713}, {52.343750000000,85.750000000000}, +{46.702141892082,86.180801752650}, {41.285068752391,87.490050907175}, +{36.021375201732,89.703013308437}, {30.839905860908,92.844954801298}, +{30.840393168266,92.844613599752}, {24.841774707763,97.553563991314}, +{23.093750000000,100.109375000000}, {23.668337709691,101.518994849695}, +{23.371174656526,101.224323797050}, {23.620948599883,101.397798979282}, +{24.023420115060,101.552272092059}, {25.484375000000,101.718750000000}, +{29.298199671143,101.348354407082}, {33.545396502623,100.218839979757}, +{38.283160693967,98.302715245167}, {43.568687444697,95.572488730454}, +{43.462444284634,95.635929361188}, {56.978069284634,87.104679361188}, +{55.872490683787,89.763134548637}, {107.893088734820,103.841923410053}, +{59.646930715366,91.332820638812}, {46.131305715366,99.864070638812}, +{46.025062555303,99.927511269546}, {40.294964306033,102.857441004833}, +{34.923353497377,104.984285020243}, {29.967425328857,106.280551842918}, +{25.484375000000,106.718750000000}, {22.429704884940,106.291477907941}, +{20.160075343474,105.056926202950}, {19.862912290309,104.762255150305}, +{18.581942192719,102.559691058502}, {18.093750000000,100.109375000000}, +{18.781885833597,97.630167914546}, {20.751975292237,94.868311008686}, +{27.972106831734,88.749136400248}, {27.972594139092,88.748795198702}, +{33.744249798268,85.287221066563}, {39.777431247609,82.783386592825}, +{46.000983107918,81.262557622350}, {52.343750000000,80.750000000000}, +{54.881053553302,80.995299290410}, {57.121823397686,81.724997675285}, +{58.847249996203,82.929795925088}, {59.838523811906,84.600394810287}, +{59.877509316213,84.752490451363}, {60.752509316213,88.674365451363}, +{59.646930715366,91.332820638812}, {107.893088734820,103.841923410053}, +{155.484375000000,101.859375000000}, {154.564834615754,105.515207938449}, +{152.115670325806,108.366761454651}, {148.955163295626,109.891294781728}, +{145.437500000000,110.437500000000}, {142.960397099416,109.918703000637}, +{140.390467597390,108.438024620128}, {137.806753458193,106.109033784838}, +{135.288296646094,103.045299421136}, {135.165845369106,102.859481271949}, +{127.322095369106,89.718856271949}, {127.315939322101,89.708486304067}, +{123.037165252408,83.240466071649}, {119.422893480005,79.457711309224}, +{123.333764624626,78.181432151290}, {119.923748586047,88.267600564284}, +{116.288451493331,96.371224650234}, {116.310270123205,96.328970526240}, +{111.013619195867,105.085481651574}, {104.498474377631,112.833853093888}, +{102.718750000000,113.578125000000}, {98.109375000000,113.578125000000}, +{95.790533815800,112.012456612681}, {92.715536961613,101.759617602767}, +{90.624767168816,88.808240839597}, {90.625938562396,88.818553777181}, +{88.018863793847,68.357428789163}, {88.022375537533,68.374401202625}, +{86.904794319936,64.234191072834}, {85.466909526601,60.964474099786}, +{83.670654326939,58.467433589062}, {81.477961890361,56.645252846242}, +{80.463845731714,53.674615230649}, {82.823220731714,47.205865230649}, +{82.883587418943,47.055653464335}, {83.966380643129,44.754922491868}, +{85.291281927099,42.535861182972}, {88.514402164445,41.595109434025}, +{91.785870247761,43.817111177877}, {94.599270325866,47.029404143594}, +{96.906293571887,51.130222797294}, {98.658631158949,56.017801605095}, +{98.664492355983,56.039251079522}, {100.006630671722,63.228131068770}, +{101.762541190731,76.272848032637}, {101.765778670251,76.300425005941}, +{103.467098832178,87.353480411923}, {105.697048617918,94.795754781373}, +{102.319980907406,93.545204629259}, {104.354680083199,92.248641487426}, +{106.296883956259,90.334282557687}, {110.081726403105,84.371439341729}, +{110.069085073875,84.396782220394}, {112.413266990492,78.560599894318}, +{114.080111889746,71.934817013191}, {115.075734612596,64.464258680566}, +{115.406250000000,56.093750000000}, {117.906250000000,53.593750000000}, +{122.515625000000,53.593750000000}, {124.596624760838,54.708311442938}, +{155.065374760838,100.473936442938}, {155.484375000000,101.859375000000}, +{107.893088734820,103.841923410053}, {150.903375239162,103.244813557062}, +{120.434625239162,57.479188557062}, {122.515625000000,58.593750000000}, +{117.906250000000,58.593750000000}, {120.406250000000,56.093750000000}, +{120.037546637404,64.922460069434}, {118.935513110254,72.987057986809}, +{117.106264259508,80.232368855682}, {114.555914926125,86.603217779606}, +{114.543273596895,86.628560658271}, {112.308927321184,90.508291033149}, +{109.859366043741,93.751654942313}, {107.239069916801,96.288467887574}, +{104.492519092594,98.048545370741}, {101.115451382082,96.797995218627}, +{98.626651167822,88.552769588077}, {96.796721329749,76.855824994059}, +{96.799958809269,76.883401967363}, {95.087119328278,64.107806431230}, +{93.835507644017,57.335748920478}, {93.841368841051,57.357198394905}, +{92.427690803113,53.221339702706}, {90.736667174134,50.033095856406}, +{88.719989127239,47.690701322123}, {86.329347835555,46.092390565975}, +{89.552468072901,45.151638817028}, {88.346119356871,47.166952508132}, +{87.460162581057,49.069346535665}, {87.520529268286,48.919134769351}, +{85.161154268286,55.387884769351}, {84.147038109639,52.417247153758}, +{87.106689423061,54.909519535937}, {89.579965473399,58.293338400214}, +{91.528799430064,62.470887052166}, {92.915124462467,67.344348797375}, +{92.918636206153,67.361321210837}, {95.592811437604,88.243946222819}, +{95.593982831184,88.254259160403}, {97.565713038387,100.591944897233}, +{100.428216184200,110.143793387319}, {98.109375000000,108.578125000000}, +{102.718750000000,108.578125000000}, {100.939025622369,109.322396906112}, +{106.962943304133,102.180143348427}, {111.845979876795,94.077279473760}, +{111.867798506669,94.035025349766}, {115.287188913953,86.412086935716}, +{118.541235375374,76.756067848710}, {122.452106519995,75.479788690776}, +{126.837834747592,80.025158928351}, {131.621560677899,87.166513695933}, +{131.615404630894,87.156143728051}, {139.459154630894,100.296768728051}, +{139.336703353906,100.110950578864}, {142.906407402610,104.257287879872}, +{145.437500000000,105.437500000000}, {147.478430454374,105.175111468272}, +{149.243704674194,104.273863545349}, {150.251571634246,103.277760811551}, +{150.484375000000,101.859375000000}, {150.903375239162,103.244813557062}, +{107.893088734820,103.841923410053}, {231.343750000000,91.875000000000}, +{230.760913847107,95.964970754466}, {229.068047862611,99.735912943733}, +{226.348615757792,103.075786207286}, {222.686081243924,105.872550184609}, +{222.648873373705,105.894655312846}, {215.093162016193,109.098726800095}, +{205.138412990776,111.389009633945}, {205.099511514392,111.395066324151}, +{196.531910121565,112.292873746127}, {187.093750000000,112.593750000000}, +{180.736641615184,112.156201510495}, {174.578395035074,110.855968371846}, +{168.685194057574,108.711669078852}, {163.123222480588,105.741922126310}, +{163.102786019362,105.728945017668}, {158.065383006950,101.833715472335}, +{154.350564084671,97.489870440862}, {152.052565874896,92.798170193375}, +{151.265625000000,87.859375000000}, {151.531470468770,85.013668760581}, +{152.287360086651,82.060400295498}, {152.321821893194,81.964698849566}, +{155.704155919825,73.828381186220}, {158.270837388345,69.249451319292}, +{158.258242073026,69.265568807584}, {162.161895999987,65.281962610977}, +{167.278829839386,61.794937132641}, {173.532669176810,58.834467171163}, +{180.847039597849,56.430527525129}, {179.144548452656,58.005986305326}, +{180.222673452656,54.974736305326}, {180.222279555972,54.975844608663}, +{182.650011718926,50.400876966176}, {185.678714551395,49.466466465483}, +{192.833058049629,52.996232862321}, {201.831199616962,58.692914409530}, +{211.602112156950,65.789874557518}, {220.243790039283,73.085988470431}, +{220.250361498213,73.092084369790}, {227.553434625305,81.089470457139}, +{229.783449199558,84.667905408782}, {230.987849850362,87.897461316292}, +{231.037603485703,88.222391630780}, {231.334478485703,91.659891630780}, +{231.343750000000,91.875000000000}, {107.893088734820,103.841923410053}, +{226.353021514297,92.090108369220}, {226.056146514297,88.652608369220}, +{226.105900149638,88.977538683708}, {225.181394550443,86.544985216218}, +{223.368440374695,83.730842042861}, {216.843388501787,76.751665630210}, +{216.849959960717,76.757761529569}, {208.538512843050,69.741375442482}, +{199.012550383038,62.822710590470}, {190.370066950371,57.347517137679}, +{183.790035448605,54.096033534517}, {186.818738281074,53.161623033824}, +{184.933970444028,56.649155391337}, {184.933576547344,56.650263694674}, +{183.855451547344,59.681513694674}, {182.152960402151,61.256972474871}, +{175.418502698190,63.429204703837}, {169.900857660614,65.978500367359}, +{165.523650875013,68.934834264023}, {162.210507926974,72.328181192416}, +{162.197912611655,72.344298680708}, {160.116156580175,76.155993813780}, +{156.990678106806,83.754051150434}, {157.025139913349,83.658349704502}, +{156.265625000000,87.859375000000}, {156.814621625104,91.570970431625}, +{158.524435915329,95.017942059138}, {161.489304493050,98.301050152665}, +{165.803463980638,101.521054982332}, {165.783027519412,101.508077873690}, +{170.773790317426,104.198487171148}, {175.945042464926,106.097156628154}, +{181.362967759816,107.222704739505}, {187.093750000000,107.593750000000}, +{196.179027378435,107.308688753873}, {204.369238485608,106.448683675849}, +{204.330337009224,106.454740366055}, {213.484962983807,104.385648199905}, +{220.132376626295,101.574094687154}, {220.095168756076,101.596199815391}, +{222.954118617208,99.523823167714}, {224.892889637389,97.287524556267}, +{225.994945527893,94.775263620534}, {226.343750000000,91.875000000000}, +{226.353021514297,92.090108369220}, {107.893088734820,103.841923410053}, +{219.781250000000,95.890625000000}, {219.378166433508,93.853798730227}, +{218.111752188172,91.489941446073}, {212.645950385807,85.475693519170}, +{212.685981945341,85.511936058310}, {206.545320157918,80.643069684901}, +{198.180220478697,74.962876659750}, {198.191932106006,74.970352872652}, +{191.582535336704,71.037624006410}, {191.504903114611,70.993386859602}, +{190.358726480976,70.329891393482}, {194.093750000000,68.156250000000}, +{193.486799914207,72.326466575586}, {191.750022838432,75.648693620488}, +{191.727672642897,75.674671879974}, {189.796209835616,77.308949639626}, +{187.307360975056,78.497446987452}, {184.374093537693,79.223076311545}, +{181.109375000000,79.468750000000}, {178.539517280969,79.274893727068}, +{176.586499975916,78.676142180991}, {173.086052480141,74.877460550577}, +{176.026873378540,75.790765650642}, {173.637934677835,76.966105971818}, +{171.454775584042,78.628861257931}, {167.479150931130,83.659399177979}, +{167.492959438562,83.636441477986}, {164.707555748674,89.579684053440}, +{164.890625000000,88.640625000000}, {165.429801946489,91.718738201013}, +{167.140367049889,94.413281660069}, {170.161871706101,96.828214751252}, +{174.633867311024,99.067496848641}, {174.595883286589,99.052025896332}, +{183.311717611230,101.570655775842}, {188.036065935963,102.270678900324}, +{192.781250000000,102.500000000000}, {204.722829878151,102.082467436594}, +{212.458857303872,100.833616072622}, {214.905535432122,99.897801735668}, +{216.940228691241,98.604487224303}, {220.087216056537,94.692203098109}, +{219.781250000000,95.890625000000}, {107.893088734820,103.841923410053}, +{224.475283943463,97.089046901891}, {222.495392805158,99.992428606532}, +{220.012896308759,102.426762775697}, {217.106183317878,104.328760764332}, +{213.853642696128,105.635133927378}, {205.324045121849,107.034720063406}, +{192.781250000000,107.500000000000}, {187.549871564037,107.241039849676}, +{182.344532388770,106.476219224158}, {172.747866713411,103.697974103668}, +{172.709882688976,103.682503151359}, {167.310784543899,100.802644623748}, +{163.281507950111,97.266405839931}, {160.761604303511,93.177746173987}, +{160.111277146626,90.958745814619}, {159.890625000000,88.640625000000}, +{160.073694251326,87.701565946560}, {163.194540561438,81.082308522014}, +{163.208349068870,81.059350822021}, {165.573405849355,77.703241627766}, +{168.240536915958,74.886763742069}, {171.153080947165,72.670612778182}, +{174.254376621460,71.115484349358}, {177.195197519859,72.028789449423}, +{178.991625024084,74.292607819009}, {181.109375000000,74.468750000000}, +{185.450451524944,73.971303012548}, {187.959827357103,72.387828120026}, +{187.937477161568,72.413806379512}, {188.825700085793,70.736033424413}, +{189.093750000000,68.156250000000}, {192.828773519024,65.982608606518}, +{194.057596885389,66.694113140398}, {193.979964663296,66.649875993590}, +{200.870567893994,70.748397127348}, {200.882279521303,70.755873340250}, +{209.532804842082,76.638180315099}, {216.001518054659,81.769313941690}, +{216.041549614192,81.805556480830}, {219.736550554799,85.597619431325}, +{222.481997811828,89.260058553927}, {224.192146066492,92.716513769773}, +{224.781250000000,95.890625000000}, {224.475283943463,97.089046901891}, +{107.893088734820,103.841923410053}, {274.375000000000,74.921875000000}, +{274.375000000000,76.000000000000}, {273.941340954992,77.877573018672}, +{272.878932097861,79.515803527315}, {273.201644884750,79.109789854043}, +{272.240878131027,80.634530144823}, {272.178064435979,80.731878545843}, +{270.366672394243,82.164949472839}, {268.046875000000,82.703125000000}, +{266.183148747233,82.484226579792}, {265.676843902484,82.347511014208}, +{261.919943241226,81.056638412991}, {261.845529920936,81.035610157726}, +{257.771892015055,80.000491652766}, {254.812500000000,79.671875000000}, +{253.064641952966,80.017766952966}, {253.029646790629,80.052082662255}, +{253.183319188544,79.921363850038}, {253.251518993920,79.984611568497}, +{253.185946392942,81.106825858762}, {253.000000000000,86.578125000000}, +{253.496255380785,102.128843883245}, {253.498940253820,102.192840332413}, +{254.068093288267,110.651263719025}, {251.578125000000,113.375000000000}, +{246.875000000000,113.375000000000}, {246.340326851360,113.317155732979}, +{244.239667843345,112.409341061474}, {241.449240399376,110.489665586259}, +{233.966932708158,103.861287459859}, {233.964253154933,103.858697290509}, +{230.739570245917,99.429986748935}, {227.863465886694,92.900734302334}, +{227.865566738278,92.906614054351}, {224.904456445713,83.297192679644}, +{223.890625000000,76.390625000000}, {224.718172891760,73.652424627265}, +{226.991950628026,71.671512863124}, {230.398659300280,70.468125917422}, +{234.625000000000,70.062500000000}, {239.436000436064,69.828681464349}, +{240.453125000000,69.140625000000}, {239.621272369169,63.470278877568}, +{237.983036171748,55.833595299706}, {237.978023315197,55.813489579321}, +{235.265625000000,42.968750000000}, {235.414374888933,43.818233911095}, +{223.164374888933,9.911983911095}, {223.454623060848,7.647483743269}, +{225.610873060848,4.506858743269}, {225.803351703291,4.260965402925}, +{227.719534150475,2.932735689909}, {230.078782966130,2.347671229322}, +{230.218750000000,2.343750000000}, {231.580832848366,2.789728316683}, +{232.871346377781,3.980786060276}, {235.131457239225,7.716876589460}, +{240.051188613236,19.745668022304}, {244.970104457946,33.805503176211}, +{247.762510801176,44.143184476801}, {247.777764624530,44.225329525617}, +{252.184014624530,70.381579525617}, {251.352799675865,68.904817480577}, +{254.575226795957,69.673348314939}, {260.406250000000,70.359375000000}, +{270.523910039912,70.690857394210}, {273.186407177161,72.174765791999}, +{274.049624252688,73.457293811137}, {274.375000000000,74.921875000000}, +{107.893088734820,103.841923410053}, {269.375000000000,74.921875000000}, +{269.694839960088,75.621642605790}, {260.406250000000,75.359375000000}, +{253.596648204043,74.576651685061}, {250.197596782742,73.718304003256}, +{248.084700324135,72.688932519423}, {247.253485375470,71.212170474383}, +{242.847235375470,45.055920474383}, {242.862489198824,45.138065523199}, +{240.182239292054,35.233559323790}, {235.370686386764,21.504331977696}, +{230.614636510775,9.861248410540}, {229.674552059719,7.679370189724}, +{229.774391761009,7.390935745817}, {230.218750000000,7.343750000000}, +{230.358717033870,7.339828770678}, {229.540398296709,7.582784597075}, +{229.732876939152,7.336891256731}, {227.576626939152,10.477516256731}, +{227.866875111067,8.213016088905}, {240.116875111067,42.119266088905}, +{240.265625000000,42.968750000000}, {242.834476684803,54.624010420679}, +{242.829463828252,54.603904700294}, {244.534977630831,62.545346122432}, +{245.453125000000,69.140625000000}, {244.611402180226,71.735213821357}, +{242.306187063936,73.585381035651}, {238.867409665678,74.693638982119}, +{234.625000000000,75.062500000000}, {229.906486871974,75.367549636876}, +{229.092373983240,75.779215997735}, {228.934535185216,76.058687905577}, +{228.890625000000,76.390625000000}, {229.790856054287,82.319994820356}, +{232.571933261722,91.218385945649}, {232.574034113306,91.224265697666}, +{234.986992254083,96.851263251065}, {237.441996845067,100.266302709491}, +{237.439317291842,100.263712540141}, {244.074197100624,106.275959413741}, +{247.409673148640,108.432844267021}, {246.875000000000,108.375000000000}, +{251.578125000000,108.375000000000}, {249.088156711733,111.098736280975}, +{248.501059746180,102.338409667587}, {248.503744619215,102.402406116755}, +{248.000000000000,86.578125000000}, {248.204678607058,80.674424141238}, +{248.635199756080,78.226325931503}, {249.564103209371,76.447917337745}, +{249.529108047034,76.482233047034}, {251.855421271850,75.142541341903}, +{254.812500000000,74.671875000000}, {258.571857984945,75.077633347234}, +{263.279470079064,76.245639842274}, {263.205056758774,76.224611587009}, +{267.479406097516,77.683738985792}, {266.973101252767,77.547023420208}, +{268.046875000000,77.703125000000}, {268.247054721136,77.733964370993}, +{268.227077605757,77.803800527161}, {268.040685564021,77.924371454157}, +{267.977871868973,78.021719855177}, {268.985855115250,76.421460145957}, +{269.308567902139,76.015446472685}, {269.418034045008,75.973989481328}, +{269.375000000000,76.000000000000}, {269.375000000000,74.921875000000}, +{107.893088734820,103.841923410053}, {243.911209450369,105.662056821622}, +{240.832004992147,102.845101845416}, {236.815516984936,97.742848726260}, +{236.813922800164,97.740633958664}, {232.773597278734,91.287437871638}, +{230.710552894044,85.924483215760}, {230.745327869205,86.067653416413}, +{229.840275149638,82.415038683708}, {229.855893749637,82.481339062591}, +{229.093750000000,78.546875000000}, {229.510257350732,77.264688549054}, +{230.557731326090,76.286764971873}, {233.333290689663,75.138571514324}, +{238.843750000000,74.468750000000}, {241.980836948934,74.687319511759}, +{245.189547085049,75.561169162745}, {247.167986856352,77.549353232692}, +{248.217702574415,80.638507879225}, {248.687500000000,88.140625000000}, +{248.194671228610,98.736670034806}, {248.200295344311,98.650162873539}, +{247.698246960594,103.850772804200}, {243.911209450369,105.662056821622}, +{107.893088734820,103.841923410053}, {242.739253039406,103.211727195800}, +{243.205954655689,98.412337126461}, {243.211578771390,98.325829965194}, +{243.687500000000,88.140625000000}, {243.282297425585,81.439617120775}, +{243.185452914951,80.141955837255}, {241.300413051066,79.640805488241}, +{238.843750000000,79.468750000000}, {234.557334310337,79.986428485676}, +{234.323615830224,80.043375869145}, {234.139295619945,80.082650511165}, +{233.899908001681,80.106538837663}, {233.805549923910,79.924172528127}, +{234.093750000000,78.546875000000}, {234.706606250363,81.268660937409}, +{234.722224850362,81.334961316292}, {235.567172130795,84.744846583587}, +{235.601947105956,84.888016784240}, {237.273277721266,89.165687128362}, +{240.873577199836,94.821866041336}, {240.871983015064,94.819651273740}, +{244.355495007853,99.326773154584}, {246.526290549631,101.400443178378}, +{242.739253039406,103.211727195800}, {107.893088734820,103.841923410053}, +{304.579027849556,115.887559254375}, {299.647333003501,118.498603127587}, +{299.601234810263,118.526555579345}, {296.960609810263,120.089055579345}, +{295.687500000000,120.437500000000}, {292.434178516679,119.763451801101}, +{289.591538470777,117.850158805700}, {287.263626957927,114.860898415742}, +{285.554491073762,110.958948033170}, {285.546168760441,110.932189402305}, +{283.409425227272,100.413450166388}, {283.408069329655,100.405281467271}, +{280.968147929764,87.644193704042}, {284.218299056292,87.914012723915}, +{279.519746335556,93.766171451312}, {279.798545332977,93.224824860858}, +{274.937093489612,105.343910553875}, {272.454127837569,109.762553039486}, +{269.772550129691,112.314814767144}, {266.294988321147,110.999865652887}, +{264.699764075525,105.167535274279}, {264.676753039406,105.022647804200}, +{264.221109604112,100.702343060691}, {264.171875000000,98.828125000000}, +{263.607902205199,91.869081828698}, {263.613915250645,91.062865437610}, +{263.781250000000,89.718750000000}, {263.644962649638,88.985351183708}, +{262.873500431741,86.703985451358}, {262.739182179139,86.219942105230}, +{260.786057179139,74.844942105230}, {260.786249814804,74.846062487964}, +{256.958124814804,52.611687487964}, {256.955473276820,52.595988114755}, +{254.892973276820,40.142863114755}, {254.909488793847,40.232428789163}, +{254.331363793847,37.388678789163}, {254.339079247810,37.425229542768}, +{253.651579247810,34.284604542768}, {253.593750000000,33.750000000000}, +{254.239654341050,30.319069019177}, {254.154681406546,30.589185956325}, +{256.319133024351,26.771372253672}, {258.818704827809,25.924919245868}, +{261.217531024880,26.988383072536}, {263.253153025566,28.888095452080}, +{264.856582863559,31.480336604342}, {265.958832572550,34.621386749163}, +{266.013105788729,34.918097636045}, {267.200714432551,44.731495841479}, +{267.198350954149,44.712535224402}, {269.443623734153,61.037071609407}, +{269.421396014347,60.906344576785}, {270.652021489737,67.736566992690}, +{271.992261513603,76.440263813345}, {271.992747064473,76.443809223415}, +{273.038636247453,85.686082548185}, {273.390625000000,92.953125000000}, +{273.238407027301,96.898129287691}, {272.771685367998,99.590064317759}, +{267.989237947004,98.132898258783}, {271.223612947004,86.961023258783}, +{271.391159168632,86.533772766328}, {274.526090303798,81.379570646076}, +{274.584318175231,81.310286998919}, {276.982682022500,78.600716011250}, +{277.142029400154,78.326905342657}, {279.265919333198,75.301911531816}, +{279.298622345235,75.258362091268}, {281.876153531632,73.009942282517}, +{284.906250000000,72.125000000000}, {287.318073492888,72.767987310135}, +{289.339116026344,74.544184270464}, {290.903803647217,77.224443425871}, +{291.946562402359,80.579617321243}, {291.963278527291,80.666832095730}, +{293.477578855570,88.491377103079}, {294.532438780850,92.026218792971}, +{294.690170210143,92.371639700252}, {298.832669585147,102.687317191341}, +{298.821447919079,102.663322107333}, {301.483679194839,107.248880594573}, +{302.541048238599,108.202972500861}, {303.515625000000,108.484375000000}, +{306.015625000000,110.984375000000}, {306.015625000000,113.625000000000}, +{304.579027849556,115.887559254375}, {107.893088734820,103.841923410053}, +{301.015625000000,113.625000000000}, {301.015625000000,110.984375000000}, +{303.515625000000,113.484375000000}, {300.984342386401,112.859527499139}, +{298.555383305161,111.094869405427}, {296.303526841571,108.355227332168}, +{294.303552080921,104.805427892667}, {294.292330414853,104.781432808659}, +{289.997329789857,94.097110299748}, {290.155061219150,94.442531207029}, +{288.709921144430,89.953935396921}, {287.036721472709,81.520667904270}, +{287.053437597641,81.607882678757}, {286.004633973656,77.940190729536}, +{284.906250000000,77.125000000000}, {284.500063101353,77.160595459408}, +{284.155096468369,77.318182717483}, {283.263877654765,78.304137908732}, +{283.296580666802,78.260588468184}, {281.295470599846,81.110594657343}, +{281.454817977500,80.836783988750}, {278.353181824769,84.595963001081}, +{278.411409696202,84.526679353924}, {275.858840831368,88.778727233672}, +{276.026387052996,88.351476741217}, {272.792012052996,99.523351741217}, +{268.009564632002,98.066185682241}, {268.390625000000,92.953125000000}, +{268.055113752547,86.056104951815}, {267.038502935527,77.118690776585}, +{267.038988486397,77.122236186655}, {265.722978510263,68.575933007310}, +{264.516103985653,61.874905423215}, {264.493876265847,61.744178390593}, +{262.239149045851,45.349964775598}, {262.236785567449,45.331004158521}, +{261.049394211271,35.519402363955}, {261.103667427450,35.816113250837}, +{259.699971974434,32.150967047920}, {257.681295172191,30.793830754132}, +{260.180866975649,29.947377746328}, {259.001568593454,31.817064043675}, +{258.916595658950,32.087180980823}, {258.593750000000,33.750000000000}, +{258.535920752190,33.215395457232}, {259.223420752190,36.356020457232}, +{259.231136206153,36.392571210837}, {259.809261206153,39.236321210837}, +{259.825776723180,39.325886885245}, {261.888276723180,51.779011885245}, +{261.885625185196,51.763312512036}, {265.713750185196,73.997687512036}, +{265.713942820861,73.998807894770}, {267.667067820861,85.373807894770}, +{267.532749568259,84.889764548642}, {268.526912350362,87.905273816292}, +{268.781250000000,89.718750000000}, {268.542334749355,91.905884562390}, +{268.548347794801,91.099668171302}, {269.171875000000,98.828125000000}, +{269.216390395888,100.485156939309}, {269.635746960594,104.383602195800}, +{269.612735924475,104.238714725721}, {270.955011678853,109.187634347113}, +{267.477449870309,107.872685232856}, {268.686497162431,106.569478210514}, +{270.375406510388,103.296714446125}, {275.107704667023,91.493925139142}, +{275.386503664444,90.952578548688}, {278.700840527029,86.470174071108}, +{281.281700943708,83.867237276085}, {284.531852070236,84.137056295958}, +{285.408419686884,85.805066273498}, {286.324716189650,88.997159604327}, +{288.341930670345,99.594718532729}, {288.340574772728,99.586549833612}, +{290.328831239559,109.474060597695}, {290.320508926238,109.447301966830}, +{291.419966792073,112.312929709258}, {292.611586529223,114.157653694300}, +{293.999415233321,115.144751323899}, {295.687500000000,115.437500000000}, +{294.414390189737,115.785944420655}, {297.055015189737,114.223444420655}, +{297.008916996499,114.251396872413}, {302.452222150444,111.362440745625}, +{301.015625000000,113.625000000000}, {107.893088734820,103.841923410053}, +{374.437500000000,106.765625000000}, {373.775309600600,109.463093710969}, +{372.064906958700,112.117295697199}, {372.041004786215,112.144602045402}, +{368.522704503395,114.706400007155}, {366.442611342446,115.399541345014}, +{364.281250000000,115.640625000000}, {355.911205219123,114.726652651698}, +{341.052591424867,111.966274658224}, {341.038040421249,111.963294783992}, +{326.905309277070,108.757693347762}, {319.727026481732,106.439595965247}, +{319.807037817648,106.479160754059}, {310.484453831953,101.696158824691}, +{304.482826587959,97.721718623918}, {304.310358047034,97.564641952966}, +{302.095819571999,95.254869206705}, {298.220153609739,90.667578419636}, +{300.367638895226,91.618501549714}, {296.258263895226,91.915376549714}, +{296.078125000000,91.921875000000}, {293.025957236218,91.709450913344}, +{290.151865257421,91.083888117023}, {285.254658796565,88.663603177256}, +{285.219422230119,88.636374171395}, {281.529900243089,84.536170132203}, +{280.513144708967,82.282593311151}, {280.156250000000,80.015625000000}, +{280.896516775664,77.119922391977}, {282.806537684315,74.726645730656}, +{285.448073147177,73.263018105533}, {288.686079158715,72.443690273534}, +{290.750793112766,73.122099563886}, {293.797668112766,76.059599563886}, +{293.736465601749,76.002539206463}, {295.798965601749,77.861914206463}, +{294.222063773555,77.220634985862}, {301.862688773555,77.517509985862}, +{299.265625000000,80.015625000000}, {299.934685624955,74.754308742711}, +{301.898213943218,69.792099871114}, {305.090729619888,65.230982029954}, +{309.446752320064,61.172938863978}, {309.482902906976,61.145713152252}, +{318.065904047846,56.213131631660}, {329.455658353400,51.953267244508}, +{329.496351456999,51.941186017188}, {336.615241964605,50.572965088062}, +{336.666137267666,50.568817238037}, {342.150512267666,50.178192238037}, +{342.328125000000,50.171875000000}, {347.088673798588,50.461178987176}, +{351.635436696472,51.319590054257}, {355.904450990616,52.732856859568}, +{359.831753977986,54.686728061438}, {363.292951645549,57.250115143707}, +{365.880587968213,60.272932122861}, {367.501493801268,63.647371305944}, +{368.062500000000,67.265625000000}, {367.659428864193,69.524372763002}, +{366.507997055207,71.901249483478}, {362.306741008310,76.690232523947}, +{362.309449580203,76.687848273793}, {355.067416613929,81.592460070084}, +{345.579434368324,85.619156329617}, {345.543296906352,85.631025936969}, +{338.856518222681,87.434049611292}, {331.674077585810,88.726763309129}, +{324.032609882622,89.505258086643}, {315.968750000000,89.765625000000}, +{315.697255981477,89.750839477245}, {313.837880981477,89.547714477245}, +{314.109375000000,89.562500000000}, {315.203325765838,88.142787621838}, +{315.234375000000,87.750000000000}, {315.261368553241,87.459370280378}, +{315.416652198286,87.453346686481}, {316.557907675735,88.522399326740}, +{316.429841220906,88.403882310796}, {319.273591220906,90.857007310796}, +{318.935343465338,90.611377991437}, {331.091593465338,97.970752991437}, +{330.612118984109,97.746034726917}, {334.956642245028,98.975789357391}, +{339.851927078584,99.850564497063}, {351.453125000000,100.546875000000}, +{354.203872313810,100.381670729150}, {355.159915151904,99.886038066767}, +{355.055436157189,100.055596900919}, {357.900435727416,97.290434866877}, +{362.379803562479,95.425955323112}, {363.015625000000,95.343750000000}, +{366.828125000000,95.343750000000}, {368.997562855593,96.601357392681}, +{374.106937855593,105.523232392681}, {374.437500000000,106.765625000000}, +{107.893088734820,103.841923410053}, {369.768062144407,108.008017607319}, +{364.658687144407,99.086142607319}, {366.828125000000,100.343750000000}, +{363.015625000000,100.343750000000}, {363.651446437521,100.261544676888}, +{360.724564272584,101.303315133123}, {359.413313842811,102.506903099081}, +{359.308834848096,102.676461933233}, {358.021570604282,103.932262067178}, +{356.186752686190,104.829266770850}, {351.453125000000,105.546875000000}, +{345.006190631125,105.353277680068}, {339.085572921416,104.774435502937}, +{333.730857754972,103.813273142609}, {328.981631015891,102.472715273083}, +{328.502156534662,102.247997008563}, {316.345906534662,94.888622008563}, +{316.007658779094,94.642992689204}, {313.163908779094,92.189867689204}, +{313.035842324265,92.071350673260}, {311.083347801714,89.820090813519}, +{310.234375000000,87.750000000000}, {310.265424234162,87.357212378162}, +{310.780311953087,86.191927459145}, {311.752715552710,85.312201869144}, +{314.109375000000,84.562500000000}, {314.380869018523,84.577285522755}, +{316.240244018523,84.780410522755}, {315.968750000000,84.765625000000}, +{323.705671367377,84.524038788357}, {330.935297414190,83.796674190871}, +{337.694263027319,82.579622263708}, {344.019203093648,80.868974063031}, +{343.983065631676,80.880843670383}, {352.635708386071,77.251289929916}, +{359.003050419797,72.937151726207}, {359.005758991690,72.934767476053}, +{362.163877944793,69.637813016522}, {363.062500000000,67.265625000000}, +{362.747529636232,64.880949006556}, {361.740505781787,62.777849127139}, +{359.948259291951,60.848517668793}, {357.277621022014,58.985146938562}, +{353.920744321884,57.295463452932}, {350.352844553528,56.106191195743}, +{346.509959013911,55.403078825324}, {342.328125000000,55.171875000000}, +{342.505737732334,55.165557761963}, {337.021362732334,55.556182761963}, +{337.072258035395,55.552034911938}, {330.878648543001,56.746313982812}, +{330.919341646600,56.734232755492}, {320.246595952154,60.693118368340}, +{312.454597093024,65.166786847748}, {312.490747679936,65.139561136022}, +{308.794036005112,68.485814845046}, {306.234598556782,72.012587628886}, +{304.746955000045,75.821863132289}, {304.265625000000,80.015625000000}, +{301.668561226445,82.513740014138}, {294.027936226445,82.216865014138}, +{292.451034398251,81.575585793537}, {290.388534398251,79.716210793537}, +{290.327331887234,79.659150436114}, {287.280456887234,76.721650436114}, +{289.345170841285,77.400059726466}, {287.321458102823,77.850263144467}, +{285.927837315685,78.632729269344}, {285.271451974336,79.274608858023}, +{285.175338636761,79.581613557521}, {285.156250000000,80.015625000000}, +{285.837287256911,82.245079867797}, {288.311827769881,84.707375828605}, +{288.276591203435,84.680146822744}, {291.660634742579,86.384861882977}, +{296.078125000000,86.921875000000}, {295.897986104774,86.928373450286}, +{300.007361104774,86.631498450286}, {302.154846390261,87.582421580364}, +{305.732305428001,91.823255793295}, {307.845891952966,94.029108047034}, +{307.673423412041,93.872031376082}, {313.085858668047,97.436653675309}, +{321.942962182352,101.958339245941}, {322.022973518268,101.997904034753}, +{328.415003222930,104.000119152238}, {342.055709578751,107.067955216008}, +{342.041158575133,107.064975341776}, {356.698169780877,109.788972348302}, +{364.281250000000,110.640625000000}, {366.516357996605,110.246724992845}, +{368.302745213785,108.824147954598}, {368.278843041300,108.851454302801}, +{369.437500000000,106.765625000000}, {369.768062144407,108.008017607319}, +{107.893088734820,103.841923410053}, {359.034454681034,69.861443602839}, +{357.173548986071,72.638610976591}, {353.435826646756,75.215386191513}, +{347.992418306797,77.582163291606}, {341.014454609897,79.729336320871}, +{326.426284670840,82.761098429090}, {319.640717587115,83.525315463381}, +{313.234375000000,83.781250000000}, {312.706760041223,83.724940335389}, +{311.331760041223,83.428065335389}, {311.389194323030,83.439762979730}, +{309.920444323030,83.158512979730}, {310.390625000000,83.203125000000}, +{309.032298883605,83.610801187634}, {305.860259182280,80.222501196670}, +{308.487654632717,75.272571710106}, {311.451975717975,70.927537861140}, +{314.718319876723,67.239682598354}, {318.251784547635,64.261288870324}, +{318.235984828743,64.272646821685}, {322.460311501394,61.735717754517}, +{327.134482463160,59.899177687483}, {332.183220900533,58.782772982128}, +{337.531250000000,58.406250000000}, {345.475041381297,58.786142249068}, +{351.020038715603,59.929523334009}, {351.130689531816,59.972424607386}, +{353.699762084814,61.379594420291}, {355.915109055748,63.288105475323}, +{357.703808635445,65.619192847673}, {358.992939014732,68.294091612533}, +{359.034454681034,69.861443602839}, {107.893088734820,103.841923410053}, +{354.288310985268,69.987158387467}, {352.366140944252,66.657207024677}, +{349.213060468184,64.590075392614}, {349.323711284397,64.632976665991}, +{344.735896118703,63.713857750932}, {337.531250000000,63.406250000000}, +{332.857794724467,63.703555142872}, {328.623330036840,64.608634812517}, +{324.752579123606,66.141235370483}, {321.170265171257,68.321103178315}, +{321.154465452365,68.332461129676}, {318.096133248277,70.895083026646}, +{315.305836782025,74.049024638860}, {312.748673492282,77.846568914895}, +{310.389740817720,82.339998803330}, {307.217701116395,78.951698812366}, +{310.390625000000,78.203125000000}, {310.860805676970,78.247737020270}, +{312.329555676970,78.528987020270}, {312.386989958777,78.540684664611}, +{313.761989958777,78.837559664611}, {313.234375000000,78.781250000000}, +{319.326079287885,78.541090786619}, {325.753402829160,77.817026570910}, +{339.735545390103,74.895663679129}, {350.446985853244,71.354926308487}, +{353.125279138929,69.816467148409}, {354.246795318966,68.419806397161}, +{354.288310985268,69.987158387467}, {107.893088734820,103.841923410053}, +{412.906150029990,61.293260146951}, {409.761470127352,62.134684085464}, +{407.280172710472,63.259435125605}, {407.285792255081,63.256184676520}, +{404.793374271599,64.364965077547}, {402.406250000000,64.781250000000}, +{400.799037804796,64.455489160260}, {399.281565012266,63.565560595750}, +{396.896451926356,60.617324020679}, {395.843750000000,59.187500000000}, +{394.132759007664,59.586356110398}, {392.227223295325,60.862510968959}, +{387.514233459670,66.524236094764}, {387.523930329881,66.510005317299}, +{384.972470502350,70.813073903396}, {383.182220364063,75.072391356081}, +{382.127155126215,79.356608210051}, {381.781250000000,83.734375000000}, +{382.036891605602,86.926476407739}, {382.837535469594,90.232985146136}, +{382.953125000000,90.984375000000}, {382.953125000000,110.781250000000}, +{380.453125000000,113.281250000000}, {374.875000000000,113.281250000000}, +{372.797350977108,112.469290573921}, {370.771127450416,110.197059087430}, +{366.940746762890,102.253660683699}, {366.931766441279,102.229357657717}, +{364.988344509233,95.969248633492}, {363.592635453443,89.400212341223}, +{362.750737781251,82.563409292771}, {362.468750000000,75.500000000000}, +{362.469585639102,75.564633561058}, {362.375835639102,71.939633561058}, +{362.376194806642,71.952282634846}, {362.282444806642,68.921032634846}, +{362.281250000000,68.843750000000}, {362.557974048920,65.558176179264}, +{363.371209408870,62.925233614273}, {365.078767647837,60.585701488502}, +{367.830147985199,58.062445160283}, {369.390625000000,57.515625000000}, +{372.609375000000,57.515625000000}, {375.044088155839,59.448023159988}, +{375.637838155839,61.994898159988}, {375.701153736333,62.463240580013}, +{375.794903736333,64.822615580013}, {375.796875000000,64.921875000000}, +{375.796875000000,66.390625000000}, {375.727843254951,66.974057381188}, +{375.364882971473,68.609156073692}, {375.377354243352,68.535253718305}, +{374.986729243352,71.082128718305}, {375.015625000000,70.703125000000}, +{375.946084438562,73.051058522014}, {371.472688855144,73.407169646001}, +{374.338903268299,66.961197216653}, {377.510670879106,61.308691210684}, +{380.962283852915,56.499192859154}, {384.668034355078,52.582243393122}, +{384.668120639869,52.582165462116}, {388.032154904598,50.002880989291}, +{391.626628158728,48.110057708285}, {395.367786243461,46.944465688666}, +{399.171875000000,46.546875000000}, {400.072873198005,46.714879663986}, +{404.885373198005,48.574254663986}, {404.871260445955,48.568850974212}, +{412.883679720929,50.905386234424}, {414.906250000000,53.359375000000}, +{414.906250000000,58.843750000000}, {412.906150029990,61.293260146951}, +{107.893088734820,103.841923410053}, {409.906250000000,58.843750000000}, +{409.906250000000,53.359375000000}, {411.928820279071,55.813363765576}, +{403.097489554045,53.243649025788}, {403.083376801995,53.238245336014}, +{398.270876801995,51.378870336014}, {399.171875000000,51.546875000000}, +{396.227916881538,51.823112436334}, {393.443684341272,52.679004791715}, +{390.735423220402,54.155322135709}, {388.019379360131,56.292834537884}, +{388.019465644922,56.292756606878}, {384.707638022085,59.784010265846}, +{381.637766620894,64.074121289316}, {378.784143606701,69.212630908347}, +{376.121061144856,75.249080353999}, {371.647665561438,75.605191477986}, +{370.464152438185,73.063686657060}, {370.015625000000,70.703125000000}, +{370.044520756648,70.324121281695}, {370.435145756648,67.777246281695}, +{370.447617028527,67.703343926308}, {370.865906745049,65.807192618812}, +{370.796875000000,66.390625000000}, {370.796875000000,64.921875000000}, +{370.798846263667,65.021134419987}, {370.705096263667,62.661759419987}, +{370.768411844161,63.130101840012}, {370.174661844161,60.583226840012}, +{372.609375000000,62.515625000000}, {369.390625000000,62.515625000000}, +{370.951102014801,61.968804839717}, {367.847540591130,65.152891385727}, +{367.281250000000,68.843750000000}, {367.280055193358,68.766467365154}, +{367.373805193358,71.797717365154}, {367.374164360898,71.810366438942}, +{367.467914360898,75.435366438942}, {367.468750000000,75.500000000000}, +{367.725824718749,82.182684457229}, {368.501114546557,88.552912658777}, +{369.800717990767,94.651845116508}, {371.630733558721,100.520642342283}, +{371.621753237110,100.496339316301}, {374.875000000000,108.281250000000}, +{380.453125000000,108.281250000000}, {377.953125000000,110.781250000000}, +{377.953125000000,90.984375000000}, {378.068714530406,91.735764853864}, +{377.111545894398,87.698523592261}, {376.781250000000,83.734375000000}, +{377.206829248785,78.659016789949}, {378.466217135937,73.583858643919}, +{380.533388872650,68.577551096604}, {383.382319670119,63.708744682701}, +{383.392016540330,63.694513905236}, {386.493443824758,59.714265008269}, +{389.655589204675,56.723426531041}, {392.798881617336,54.841378264602}, +{395.843750000000,54.187500000000}, {397.450962195204,54.513260839740}, +{398.968434987734,55.403189404250}, {401.353548073644,58.351425979321}, +{402.406250000000,59.781250000000}, {404.776707744919,58.931315323480}, +{404.782327289528,58.928064874395}, {408.035404872648,57.459065914536}, +{411.906349970010,56.394239853049}, {409.906250000000,58.843750000000}, +{107.893088734820, 103.841923410053} +}; diff --git a/perf/micro/zrusin.c b/perf/micro/zrusin.c new file mode 100644 index 000000000..3dee74d23 --- /dev/null +++ b/perf/micro/zrusin.c @@ -0,0 +1,97 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-perf.h" + +typedef struct { + double x; + double y; +} point_t; + +#include "zrusin-another.h" + +static void +zrusin_another_path (cairo_t *cr) +{ + unsigned int i; + + for (i=0; i < ARRAY_LENGTH (zrusin_another); i++) + cairo_line_to (cr, zrusin_another[i].x, zrusin_another[i].y); +} + +static cairo_time_t +zrusin_another_tessellate (cairo_t *cr, int width, int height, int loops) +{ + zrusin_another_path (cr); + + cairo_perf_timer_start (); + + /* We'd like to measure just tessellation without + * rasterization. For now, we can do that with cairo_in_fill. But + * we'll have to be careful since cairo_in_fill might eventually + * be optimized to have an implementation that doesn't necessarily + * include tessellation. */ + while (loops--) + cairo_in_fill (cr, 50, 50); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +static cairo_time_t +zrusin_another_fill (cairo_t *cr, int width, int height, int loops) +{ + zrusin_another_path (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.8); /* blue */ + + cairo_perf_timer_start (); + + while (loops--) + cairo_fill_preserve (cr); + + cairo_perf_timer_stop (); + + cairo_new_path (cr); + + return cairo_perf_timer_elapsed (); +} + +cairo_bool_t +zrusin_enabled (cairo_perf_t *perf) +{ + return cairo_perf_can_run (perf, "zrusin", NULL); +} + +void +zrusin (cairo_perf_t *perf, cairo_t *cr, int width, int height) +{ + + cairo_perf_run (perf, "zrusin-another-tessellate", zrusin_another_tessellate, NULL); + cairo_perf_run (perf, "zrusin-another-fill", zrusin_another_fill, NULL); +} diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 000000000..acf0a8281 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,119 @@ +# Note: All source files are listed in Makefile.sources. + +include $(top_srcdir)/build/Makefile.am.common +include $(srcdir)/Makefile.am.features + +EXTRA_DIST += Makefile.win32 Makefile.win32.features +#MAINTAINERCLEANFILES += $(srcdir)/Makefile.win32.features + +AM_CPPFLAGS = -I$(srcdir) $(CAIRO_CFLAGS) +AM_LDFLAGS = $(CAIRO_LDFLAGS) + +if OS_WIN32 +export_symbols = -export-symbols cairo.def +cairo_def_dependency = cairo.def +endif + +$(top_builddir)/config.h: $(top_srcdir)/config.h.in + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h + +cairoincludedir = $(includedir)/cairo +cairoinclude_HEADERS = $(enabled_cairo_headers) + +lib_LTLIBRARIES = libcairo.la + +if BUILD_CXX +cairo_cxx_lib = libcairo_cxx.la +else +cairo_cxx_lib = +endif + +noinst_LTLIBRARIES = $(cairo_cxx_lib) +libcairo_cxx_la_SOURCES = \ + $(enabled_cairo_headers) \ + $(enabled_cairo_private) \ + $(enabled_cairo_cxx_sources) \ + $(NULL) +libcairo_cxx_la_LDFLAGS = $(AM_LDFLAGS) $(export_symbols) +libcairo_cxx_la_LIBADD = $(CAIRO_LIBS) +libcairo_cxx_la_DEPENDENCIES = $(cairo_def_dependency) + + +libcairo_la_SOURCES = \ + $(enabled_cairo_headers) \ + $(enabled_cairo_private) \ + $(enabled_cairo_sources) \ + $(NULL) +libcairo_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(CAIRO_LIBTOOL_VERSION_INFO) -no-undefined $(export_symbols) +libcairo_la_LIBADD = $(CAIRO_LIBS) \ + $(cairo_cxx_lib) +libcairo_la_DEPENDENCIES = $(cairo_def_dependency) $(cairo_cxx_lib) + +# Special headers +cairoinclude_HEADERS += $(top_srcdir)/cairo-version.h +libcairo_la_SOURCES += cairo-version.h +nodist_cairoinclude_HEADERS = cairo-features.h +nodist_libcairo_la_SOURCES = cairo-features.h +BUILT_SOURCES += cairo-features.h cairo-supported-features.h +DISTCLEANFILES += cairo-features.h cairo-supported-features.h +cairo-features.h cairo-supported-features.h: + cd $(top_builddir) && ./config.status src/$@ + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = $(enabled_cairo_pkgconf) + +CLEANFILES += cairo.def +cairo.def: cairo-features.h $(enabled_cairo_headers) + @echo Generating $@ + @(echo EXPORTS; \ + (cd $(srcdir); cat $(enabled_cairo_headers) || echo 'cairo_ERROR ()' ) | \ + $(EGREP) -v '^# *include' | \ + ( cat cairo-features.h - | $(CPP) -D__cplusplus - || echo 'cairo_ERROR ()' ) | \ + $(EGREP) '^cairo_.* \(' | \ + sed -e 's/[ ].*//' | \ + sort; \ + echo LIBRARY libcairo-$(CAIRO_VERSION_SONUM).dll; \ + ) >$@ + @ ! grep -q cairo_ERROR $@ || ($(RM) $@; false) + +TESTS_ENVIRONMENT = \ + srcdir="$(srcdir)" \ + MAKE="$(MAKE) $(AM_MAKEFLAGS)" \ + all_cairo_files="$(all_cairo_files)" \ + all_cairo_headers="$(all_cairo_headers)" \ + all_cairo_private="$(all_cairo_private)" \ + all_cairo_sources="$(all_cairo_sources)" \ + enabled_cairo_headers="$(enabled_cairo_headers)" \ + enabled_cairo_private="$(enabled_cairo_private)" \ + enabled_cairo_sources="$(enabled_cairo_sources)" \ + $(NULL) +TESTS_SH = \ + check-def.sh \ + check-doc-syntax.sh \ + check-headers.sh \ + check-plt.sh \ + check-preprocessor-syntax.sh \ + $(NULL) +TESTS += $(TESTS_SH) +if CROSS_COMPILING +else +TESTS += check-link$(EXEEXT) +endif + +EXTRA_DIST += $(TESTS_SH) check-has-hidden-symbols.c check-doc-syntax.awk +check_PROGRAMS += check-link +check_link_LDADD = libcairo.la + +check: headers-standalone + +PREPROCESS_ARGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) +COMPILE_ARGS = $(PREPROCESS_ARGS) $(AM_CFLAGS) $(CFLAGS) + +# The pre-processed result is used by check-{def,plt}.sh to determine whether +# cairo has been compiled with symbol hiding. +.c.i: $(cairoinclude_HEADERS) $(nodist_cairoinclude_HEADERS) cairoint.h $(top_builddir)/config.h + $(CPP) $(PREPROCESS_ARGS) $< -o $@ +.c.s: $(cairoinclude_HEADERS) $(nodist_cairoinclude_HEADERS) cairoint.h $(top_builddir)/config.h + $(CC) $(COMPILE_ARGS) $< -S -o $@ + +include $(srcdir)/Makefile.am.analysis diff --git a/src/Makefile.am.analysis b/src/Makefile.am.analysis new file mode 100644 index 000000000..fab4cf7a5 --- /dev/null +++ b/src/Makefile.am.analysis @@ -0,0 +1,35 @@ + +SPARSE = sparse +sparse: + @echo Checking enabled sources with sparse checker + @status=true; for f in $(enabled_cairo_sources) $(enabled_cairo_cxx_sources); do \ + echo $(SPARSE) $(PREPROCESS_ARGS) $(srcdir)/$$f; \ + $(SPARSE) $(PREPROCESS_ARGS) $(srcdir)/$$f || status=false; \ + done; $$status + +SPLINT = splint -badflag +splint: + @echo Checking enabled sources with splint checker + @status=true; for f in $(enabled_cairo_sources) $(enabled_cairo_cxx_sources); do \ + echo $(SPLINT) $(PREPROCESS_ARGS) $(srcdir)/$$f; \ + $(SPLINT) $(PREPROCESS_ARGS) $(srcdir)/$$f || status=false; \ + done; $$status + +UNO = uno +uno: + @echo Checking enabled sources with uno checker + cd $(srcdir); $(UNO) $(PREPROCESS_ARGS) -DHAVE_CONFIG_H -U__GNUC__ $(enabled_cairo_sources) + +headers-standalone: $(enabled_cairo_headers) $(enabled_cairo_private) + @echo Checking that enabled public/private headers can be compiled standalone + @status=true; for f in $(enabled_cairo_headers) $(enabled_cairo_private); do \ + echo " CHECK $$f"; \ + echo "#include \"$(srcdir)/$$f\"" > headers-standalone-tmp.c; \ + echo "int main(int argc, char * argv[]) { return 0; }" >> headers-standalone-tmp.c; \ + $(COMPILE) -o headers-standalone-tmp headers-standalone-tmp.c || status=false; \ + $(RM) headers-standalone-tmp headers-standalone-tmp.c; \ + done; $$status + @touch $@ +CLEANFILES += headers-standalone + +analysis: all headers-standalone sparse splint uno diff --git a/src/Makefile.am.features b/src/Makefile.am.features new file mode 100644 index 000000000..c58ac23da --- /dev/null +++ b/src/Makefile.am.features @@ -0,0 +1,657 @@ +# Generated by configure. Do not edit. + +include $(top_srcdir)/src/Makefile.sources + +supported_cairo_headers = $(cairo_headers) +unsupported_cairo_headers = +all_cairo_headers = $(cairo_headers) +all_cairo_private = $(cairo_private) +all_cairo_cxx_sources = $(cairo_cxx_sources) +all_cairo_sources = $(cairo_sources) + +enabled_cairo_headers = $(cairo_headers) +enabled_cairo_private = $(cairo_private) +enabled_cairo_cxx_sources = $(cairo_cxx_sources) +enabled_cairo_sources = $(cairo_sources) + +all_cairo_pkgconf = cairo.pc +enabled_cairo_pkgconf = cairo.pc + +supported_cairo_headers += $(cairo_xlib_headers) +all_cairo_headers += $(cairo_xlib_headers) +all_cairo_private += $(cairo_xlib_private) +all_cairo_cxx_sources += $(cairo_xlib_cxx_sources) +all_cairo_sources += $(cairo_xlib_sources) +if CAIRO_HAS_XLIB_SURFACE +enabled_cairo_headers += $(cairo_xlib_headers) +enabled_cairo_private += $(cairo_xlib_private) +enabled_cairo_cxx_sources += $(cairo_xlib_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_sources) +endif +all_cairo_pkgconf += cairo-xlib.pc +if CAIRO_HAS_XLIB_SURFACE +enabled_cairo_pkgconf += cairo-xlib.pc +endif + +supported_cairo_headers += $(cairo_xlib_xrender_headers) +all_cairo_headers += $(cairo_xlib_xrender_headers) +all_cairo_private += $(cairo_xlib_xrender_private) +all_cairo_cxx_sources += $(cairo_xlib_xrender_cxx_sources) +all_cairo_sources += $(cairo_xlib_xrender_sources) +if CAIRO_HAS_XLIB_XRENDER_SURFACE +enabled_cairo_headers += $(cairo_xlib_xrender_headers) +enabled_cairo_private += $(cairo_xlib_xrender_private) +enabled_cairo_cxx_sources += $(cairo_xlib_xrender_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_xrender_sources) +endif +all_cairo_pkgconf += cairo-xlib-xrender.pc +if CAIRO_HAS_XLIB_XRENDER_SURFACE +enabled_cairo_pkgconf += cairo-xlib-xrender.pc +endif + +supported_cairo_headers += $(cairo_xcb_headers) +all_cairo_headers += $(cairo_xcb_headers) +all_cairo_private += $(cairo_xcb_private) +all_cairo_cxx_sources += $(cairo_xcb_cxx_sources) +all_cairo_sources += $(cairo_xcb_sources) +if CAIRO_HAS_XCB_SURFACE +enabled_cairo_headers += $(cairo_xcb_headers) +enabled_cairo_private += $(cairo_xcb_private) +enabled_cairo_cxx_sources += $(cairo_xcb_cxx_sources) +enabled_cairo_sources += $(cairo_xcb_sources) +endif +all_cairo_pkgconf += cairo-xcb.pc +if CAIRO_HAS_XCB_SURFACE +enabled_cairo_pkgconf += cairo-xcb.pc +endif + +unsupported_cairo_headers += $(cairo_xlib_xcb_headers) +all_cairo_headers += $(cairo_xlib_xcb_headers) +all_cairo_private += $(cairo_xlib_xcb_private) +all_cairo_cxx_sources += $(cairo_xlib_xcb_cxx_sources) +all_cairo_sources += $(cairo_xlib_xcb_sources) +if CAIRO_HAS_XLIB_XCB_FUNCTIONS +enabled_cairo_headers += $(cairo_xlib_xcb_headers) +enabled_cairo_private += $(cairo_xlib_xcb_private) +enabled_cairo_cxx_sources += $(cairo_xlib_xcb_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_xcb_sources) +endif +all_cairo_pkgconf += cairo-xlib-xcb.pc +if CAIRO_HAS_XLIB_XCB_FUNCTIONS +enabled_cairo_pkgconf += cairo-xlib-xcb.pc +endif + +supported_cairo_headers += $(cairo_xcb_shm_headers) +all_cairo_headers += $(cairo_xcb_shm_headers) +all_cairo_private += $(cairo_xcb_shm_private) +all_cairo_cxx_sources += $(cairo_xcb_shm_cxx_sources) +all_cairo_sources += $(cairo_xcb_shm_sources) +if CAIRO_HAS_XCB_SHM_FUNCTIONS +enabled_cairo_headers += $(cairo_xcb_shm_headers) +enabled_cairo_private += $(cairo_xcb_shm_private) +enabled_cairo_cxx_sources += $(cairo_xcb_shm_cxx_sources) +enabled_cairo_sources += $(cairo_xcb_shm_sources) +endif +all_cairo_pkgconf += cairo-xcb-shm.pc +if CAIRO_HAS_XCB_SHM_FUNCTIONS +enabled_cairo_pkgconf += cairo-xcb-shm.pc +endif + +unsupported_cairo_headers += $(cairo_qt_headers) +all_cairo_headers += $(cairo_qt_headers) +all_cairo_private += $(cairo_qt_private) +all_cairo_cxx_sources += $(cairo_qt_cxx_sources) +all_cairo_sources += $(cairo_qt_sources) +if CAIRO_HAS_QT_SURFACE +enabled_cairo_headers += $(cairo_qt_headers) +enabled_cairo_private += $(cairo_qt_private) +enabled_cairo_cxx_sources += $(cairo_qt_cxx_sources) +enabled_cairo_sources += $(cairo_qt_sources) +endif +all_cairo_pkgconf += cairo-qt.pc +if CAIRO_HAS_QT_SURFACE +enabled_cairo_pkgconf += cairo-qt.pc +endif + +supported_cairo_headers += $(cairo_quartz_headers) +all_cairo_headers += $(cairo_quartz_headers) +all_cairo_private += $(cairo_quartz_private) +all_cairo_cxx_sources += $(cairo_quartz_cxx_sources) +all_cairo_sources += $(cairo_quartz_sources) +if CAIRO_HAS_QUARTZ_SURFACE +enabled_cairo_headers += $(cairo_quartz_headers) +enabled_cairo_private += $(cairo_quartz_private) +enabled_cairo_cxx_sources += $(cairo_quartz_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_sources) +endif +all_cairo_pkgconf += cairo-quartz.pc +if CAIRO_HAS_QUARTZ_SURFACE +enabled_cairo_pkgconf += cairo-quartz.pc +endif + +supported_cairo_headers += $(cairo_quartz_font_headers) +all_cairo_headers += $(cairo_quartz_font_headers) +all_cairo_private += $(cairo_quartz_font_private) +all_cairo_cxx_sources += $(cairo_quartz_font_cxx_sources) +all_cairo_sources += $(cairo_quartz_font_sources) +if CAIRO_HAS_QUARTZ_FONT +enabled_cairo_headers += $(cairo_quartz_font_headers) +enabled_cairo_private += $(cairo_quartz_font_private) +enabled_cairo_cxx_sources += $(cairo_quartz_font_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_font_sources) +endif +all_cairo_pkgconf += cairo-quartz-font.pc +if CAIRO_HAS_QUARTZ_FONT +enabled_cairo_pkgconf += cairo-quartz-font.pc +endif + +unsupported_cairo_headers += $(cairo_quartz_image_headers) +all_cairo_headers += $(cairo_quartz_image_headers) +all_cairo_private += $(cairo_quartz_image_private) +all_cairo_cxx_sources += $(cairo_quartz_image_cxx_sources) +all_cairo_sources += $(cairo_quartz_image_sources) +if CAIRO_HAS_QUARTZ_IMAGE_SURFACE +enabled_cairo_headers += $(cairo_quartz_image_headers) +enabled_cairo_private += $(cairo_quartz_image_private) +enabled_cairo_cxx_sources += $(cairo_quartz_image_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_image_sources) +endif +all_cairo_pkgconf += cairo-quartz-image.pc +if CAIRO_HAS_QUARTZ_IMAGE_SURFACE +enabled_cairo_pkgconf += cairo-quartz-image.pc +endif + +supported_cairo_headers += $(cairo_win32_headers) +all_cairo_headers += $(cairo_win32_headers) +all_cairo_private += $(cairo_win32_private) +all_cairo_cxx_sources += $(cairo_win32_cxx_sources) +all_cairo_sources += $(cairo_win32_sources) +if CAIRO_HAS_WIN32_SURFACE +enabled_cairo_headers += $(cairo_win32_headers) +enabled_cairo_private += $(cairo_win32_private) +enabled_cairo_cxx_sources += $(cairo_win32_cxx_sources) +enabled_cairo_sources += $(cairo_win32_sources) +endif +all_cairo_pkgconf += cairo-win32.pc +if CAIRO_HAS_WIN32_SURFACE +enabled_cairo_pkgconf += cairo-win32.pc +endif + +supported_cairo_headers += $(cairo_win32_font_headers) +all_cairo_headers += $(cairo_win32_font_headers) +all_cairo_private += $(cairo_win32_font_private) +all_cairo_cxx_sources += $(cairo_win32_font_cxx_sources) +all_cairo_sources += $(cairo_win32_font_sources) +if CAIRO_HAS_WIN32_FONT +enabled_cairo_headers += $(cairo_win32_font_headers) +enabled_cairo_private += $(cairo_win32_font_private) +enabled_cairo_cxx_sources += $(cairo_win32_font_cxx_sources) +enabled_cairo_sources += $(cairo_win32_font_sources) +endif +all_cairo_pkgconf += cairo-win32-font.pc +if CAIRO_HAS_WIN32_FONT +enabled_cairo_pkgconf += cairo-win32-font.pc +endif + +unsupported_cairo_headers += $(cairo_skia_headers) +all_cairo_headers += $(cairo_skia_headers) +all_cairo_private += $(cairo_skia_private) +all_cairo_cxx_sources += $(cairo_skia_cxx_sources) +all_cairo_sources += $(cairo_skia_sources) +if CAIRO_HAS_SKIA_SURFACE +enabled_cairo_headers += $(cairo_skia_headers) +enabled_cairo_private += $(cairo_skia_private) +enabled_cairo_cxx_sources += $(cairo_skia_cxx_sources) +enabled_cairo_sources += $(cairo_skia_sources) +endif +all_cairo_pkgconf += cairo-skia.pc +if CAIRO_HAS_SKIA_SURFACE +enabled_cairo_pkgconf += cairo-skia.pc +endif + +unsupported_cairo_headers += $(cairo_os2_headers) +all_cairo_headers += $(cairo_os2_headers) +all_cairo_private += $(cairo_os2_private) +all_cairo_cxx_sources += $(cairo_os2_cxx_sources) +all_cairo_sources += $(cairo_os2_sources) +if CAIRO_HAS_OS2_SURFACE +enabled_cairo_headers += $(cairo_os2_headers) +enabled_cairo_private += $(cairo_os2_private) +enabled_cairo_cxx_sources += $(cairo_os2_cxx_sources) +enabled_cairo_sources += $(cairo_os2_sources) +endif +all_cairo_pkgconf += cairo-os2.pc +if CAIRO_HAS_OS2_SURFACE +enabled_cairo_pkgconf += cairo-os2.pc +endif + +unsupported_cairo_headers += $(cairo_beos_headers) +all_cairo_headers += $(cairo_beos_headers) +all_cairo_private += $(cairo_beos_private) +all_cairo_cxx_sources += $(cairo_beos_cxx_sources) +all_cairo_sources += $(cairo_beos_sources) +if CAIRO_HAS_BEOS_SURFACE +enabled_cairo_headers += $(cairo_beos_headers) +enabled_cairo_private += $(cairo_beos_private) +enabled_cairo_cxx_sources += $(cairo_beos_cxx_sources) +enabled_cairo_sources += $(cairo_beos_sources) +endif +all_cairo_pkgconf += cairo-beos.pc +if CAIRO_HAS_BEOS_SURFACE +enabled_cairo_pkgconf += cairo-beos.pc +endif + +unsupported_cairo_headers += $(cairo_drm_headers) +all_cairo_headers += $(cairo_drm_headers) +all_cairo_private += $(cairo_drm_private) +all_cairo_cxx_sources += $(cairo_drm_cxx_sources) +all_cairo_sources += $(cairo_drm_sources) +if CAIRO_HAS_DRM_SURFACE +enabled_cairo_headers += $(cairo_drm_headers) +enabled_cairo_private += $(cairo_drm_private) +enabled_cairo_cxx_sources += $(cairo_drm_cxx_sources) +enabled_cairo_sources += $(cairo_drm_sources) +endif +all_cairo_pkgconf += cairo-drm.pc +if CAIRO_HAS_DRM_SURFACE +enabled_cairo_pkgconf += cairo-drm.pc +endif + +unsupported_cairo_headers += $(cairo_gallium_headers) +all_cairo_headers += $(cairo_gallium_headers) +all_cairo_private += $(cairo_gallium_private) +all_cairo_cxx_sources += $(cairo_gallium_cxx_sources) +all_cairo_sources += $(cairo_gallium_sources) +if CAIRO_HAS_GALLIUM_SURFACE +enabled_cairo_headers += $(cairo_gallium_headers) +enabled_cairo_private += $(cairo_gallium_private) +enabled_cairo_cxx_sources += $(cairo_gallium_cxx_sources) +enabled_cairo_sources += $(cairo_gallium_sources) +endif +all_cairo_pkgconf += cairo-gallium.pc +if CAIRO_HAS_GALLIUM_SURFACE +enabled_cairo_pkgconf += cairo-gallium.pc +endif + +supported_cairo_headers += $(cairo_png_headers) +all_cairo_headers += $(cairo_png_headers) +all_cairo_private += $(cairo_png_private) +all_cairo_cxx_sources += $(cairo_png_cxx_sources) +all_cairo_sources += $(cairo_png_sources) +if CAIRO_HAS_PNG_FUNCTIONS +enabled_cairo_headers += $(cairo_png_headers) +enabled_cairo_private += $(cairo_png_private) +enabled_cairo_cxx_sources += $(cairo_png_cxx_sources) +enabled_cairo_sources += $(cairo_png_sources) +endif +all_cairo_pkgconf += cairo-png.pc +if CAIRO_HAS_PNG_FUNCTIONS +enabled_cairo_pkgconf += cairo-png.pc +endif + +unsupported_cairo_headers += $(cairo_gl_headers) +all_cairo_headers += $(cairo_gl_headers) +all_cairo_private += $(cairo_gl_private) +all_cairo_cxx_sources += $(cairo_gl_cxx_sources) +all_cairo_sources += $(cairo_gl_sources) +if CAIRO_HAS_GL_SURFACE +enabled_cairo_headers += $(cairo_gl_headers) +enabled_cairo_private += $(cairo_gl_private) +enabled_cairo_cxx_sources += $(cairo_gl_cxx_sources) +enabled_cairo_sources += $(cairo_gl_sources) +endif +all_cairo_pkgconf += cairo-gl.pc +if CAIRO_HAS_GL_SURFACE +enabled_cairo_pkgconf += cairo-gl.pc +endif + +unsupported_cairo_headers += $(cairo_glesv2_headers) +all_cairo_headers += $(cairo_glesv2_headers) +all_cairo_private += $(cairo_glesv2_private) +all_cairo_cxx_sources += $(cairo_glesv2_cxx_sources) +all_cairo_sources += $(cairo_glesv2_sources) +if CAIRO_HAS_GLESV2_SURFACE +enabled_cairo_headers += $(cairo_glesv2_headers) +enabled_cairo_private += $(cairo_glesv2_private) +enabled_cairo_cxx_sources += $(cairo_glesv2_cxx_sources) +enabled_cairo_sources += $(cairo_glesv2_sources) +endif +all_cairo_pkgconf += cairo-glesv2.pc +if CAIRO_HAS_GLESV2_SURFACE +enabled_cairo_pkgconf += cairo-glesv2.pc +endif + +unsupported_cairo_headers += $(cairo_cogl_headers) +all_cairo_headers += $(cairo_cogl_headers) +all_cairo_private += $(cairo_cogl_private) +all_cairo_cxx_sources += $(cairo_cogl_cxx_sources) +all_cairo_sources += $(cairo_cogl_sources) +if CAIRO_HAS_COGL_SURFACE +enabled_cairo_headers += $(cairo_cogl_headers) +enabled_cairo_private += $(cairo_cogl_private) +enabled_cairo_cxx_sources += $(cairo_cogl_cxx_sources) +enabled_cairo_sources += $(cairo_cogl_sources) +endif +all_cairo_pkgconf += cairo-cogl.pc +if CAIRO_HAS_COGL_SURFACE +enabled_cairo_pkgconf += cairo-cogl.pc +endif + +unsupported_cairo_headers += $(cairo_directfb_headers) +all_cairo_headers += $(cairo_directfb_headers) +all_cairo_private += $(cairo_directfb_private) +all_cairo_cxx_sources += $(cairo_directfb_cxx_sources) +all_cairo_sources += $(cairo_directfb_sources) +if CAIRO_HAS_DIRECTFB_SURFACE +enabled_cairo_headers += $(cairo_directfb_headers) +enabled_cairo_private += $(cairo_directfb_private) +enabled_cairo_cxx_sources += $(cairo_directfb_cxx_sources) +enabled_cairo_sources += $(cairo_directfb_sources) +endif +all_cairo_pkgconf += cairo-directfb.pc +if CAIRO_HAS_DIRECTFB_SURFACE +enabled_cairo_pkgconf += cairo-directfb.pc +endif + +unsupported_cairo_headers += $(cairo_vg_headers) +all_cairo_headers += $(cairo_vg_headers) +all_cairo_private += $(cairo_vg_private) +all_cairo_cxx_sources += $(cairo_vg_cxx_sources) +all_cairo_sources += $(cairo_vg_sources) +if CAIRO_HAS_VG_SURFACE +enabled_cairo_headers += $(cairo_vg_headers) +enabled_cairo_private += $(cairo_vg_private) +enabled_cairo_cxx_sources += $(cairo_vg_cxx_sources) +enabled_cairo_sources += $(cairo_vg_sources) +endif +all_cairo_pkgconf += cairo-vg.pc +if CAIRO_HAS_VG_SURFACE +enabled_cairo_pkgconf += cairo-vg.pc +endif + +supported_cairo_headers += $(cairo_egl_headers) +all_cairo_headers += $(cairo_egl_headers) +all_cairo_private += $(cairo_egl_private) +all_cairo_cxx_sources += $(cairo_egl_cxx_sources) +all_cairo_sources += $(cairo_egl_sources) +if CAIRO_HAS_EGL_FUNCTIONS +enabled_cairo_headers += $(cairo_egl_headers) +enabled_cairo_private += $(cairo_egl_private) +enabled_cairo_cxx_sources += $(cairo_egl_cxx_sources) +enabled_cairo_sources += $(cairo_egl_sources) +endif +all_cairo_pkgconf += cairo-egl.pc +if CAIRO_HAS_EGL_FUNCTIONS +enabled_cairo_pkgconf += cairo-egl.pc +endif + +supported_cairo_headers += $(cairo_glx_headers) +all_cairo_headers += $(cairo_glx_headers) +all_cairo_private += $(cairo_glx_private) +all_cairo_cxx_sources += $(cairo_glx_cxx_sources) +all_cairo_sources += $(cairo_glx_sources) +if CAIRO_HAS_GLX_FUNCTIONS +enabled_cairo_headers += $(cairo_glx_headers) +enabled_cairo_private += $(cairo_glx_private) +enabled_cairo_cxx_sources += $(cairo_glx_cxx_sources) +enabled_cairo_sources += $(cairo_glx_sources) +endif +all_cairo_pkgconf += cairo-glx.pc +if CAIRO_HAS_GLX_FUNCTIONS +enabled_cairo_pkgconf += cairo-glx.pc +endif + +supported_cairo_headers += $(cairo_wgl_headers) +all_cairo_headers += $(cairo_wgl_headers) +all_cairo_private += $(cairo_wgl_private) +all_cairo_cxx_sources += $(cairo_wgl_cxx_sources) +all_cairo_sources += $(cairo_wgl_sources) +if CAIRO_HAS_WGL_FUNCTIONS +enabled_cairo_headers += $(cairo_wgl_headers) +enabled_cairo_private += $(cairo_wgl_private) +enabled_cairo_cxx_sources += $(cairo_wgl_cxx_sources) +enabled_cairo_sources += $(cairo_wgl_sources) +endif +all_cairo_pkgconf += cairo-wgl.pc +if CAIRO_HAS_WGL_FUNCTIONS +enabled_cairo_pkgconf += cairo-wgl.pc +endif + +supported_cairo_headers += $(cairo_script_headers) +all_cairo_headers += $(cairo_script_headers) +all_cairo_private += $(cairo_script_private) +all_cairo_cxx_sources += $(cairo_script_cxx_sources) +all_cairo_sources += $(cairo_script_sources) +if CAIRO_HAS_SCRIPT_SURFACE +enabled_cairo_headers += $(cairo_script_headers) +enabled_cairo_private += $(cairo_script_private) +enabled_cairo_cxx_sources += $(cairo_script_cxx_sources) +enabled_cairo_sources += $(cairo_script_sources) +endif +all_cairo_pkgconf += cairo-script.pc +if CAIRO_HAS_SCRIPT_SURFACE +enabled_cairo_pkgconf += cairo-script.pc +endif + +supported_cairo_headers += $(cairo_ft_headers) +all_cairo_headers += $(cairo_ft_headers) +all_cairo_private += $(cairo_ft_private) +all_cairo_cxx_sources += $(cairo_ft_cxx_sources) +all_cairo_sources += $(cairo_ft_sources) +if CAIRO_HAS_FT_FONT +enabled_cairo_headers += $(cairo_ft_headers) +enabled_cairo_private += $(cairo_ft_private) +enabled_cairo_cxx_sources += $(cairo_ft_cxx_sources) +enabled_cairo_sources += $(cairo_ft_sources) +endif +all_cairo_pkgconf += cairo-ft.pc +if CAIRO_HAS_FT_FONT +enabled_cairo_pkgconf += cairo-ft.pc +endif + +supported_cairo_headers += $(cairo_fc_headers) +all_cairo_headers += $(cairo_fc_headers) +all_cairo_private += $(cairo_fc_private) +all_cairo_cxx_sources += $(cairo_fc_cxx_sources) +all_cairo_sources += $(cairo_fc_sources) +if CAIRO_HAS_FC_FONT +enabled_cairo_headers += $(cairo_fc_headers) +enabled_cairo_private += $(cairo_fc_private) +enabled_cairo_cxx_sources += $(cairo_fc_cxx_sources) +enabled_cairo_sources += $(cairo_fc_sources) +endif +all_cairo_pkgconf += cairo-fc.pc +if CAIRO_HAS_FC_FONT +enabled_cairo_pkgconf += cairo-fc.pc +endif + +supported_cairo_headers += $(cairo_ps_headers) +all_cairo_headers += $(cairo_ps_headers) +all_cairo_private += $(cairo_ps_private) +all_cairo_cxx_sources += $(cairo_ps_cxx_sources) +all_cairo_sources += $(cairo_ps_sources) +if CAIRO_HAS_PS_SURFACE +enabled_cairo_headers += $(cairo_ps_headers) +enabled_cairo_private += $(cairo_ps_private) +enabled_cairo_cxx_sources += $(cairo_ps_cxx_sources) +enabled_cairo_sources += $(cairo_ps_sources) +endif +all_cairo_pkgconf += cairo-ps.pc +if CAIRO_HAS_PS_SURFACE +enabled_cairo_pkgconf += cairo-ps.pc +endif + +supported_cairo_headers += $(cairo_pdf_headers) +all_cairo_headers += $(cairo_pdf_headers) +all_cairo_private += $(cairo_pdf_private) +all_cairo_cxx_sources += $(cairo_pdf_cxx_sources) +all_cairo_sources += $(cairo_pdf_sources) +if CAIRO_HAS_PDF_SURFACE +enabled_cairo_headers += $(cairo_pdf_headers) +enabled_cairo_private += $(cairo_pdf_private) +enabled_cairo_cxx_sources += $(cairo_pdf_cxx_sources) +enabled_cairo_sources += $(cairo_pdf_sources) +endif +all_cairo_pkgconf += cairo-pdf.pc +if CAIRO_HAS_PDF_SURFACE +enabled_cairo_pkgconf += cairo-pdf.pc +endif + +supported_cairo_headers += $(cairo_svg_headers) +all_cairo_headers += $(cairo_svg_headers) +all_cairo_private += $(cairo_svg_private) +all_cairo_cxx_sources += $(cairo_svg_cxx_sources) +all_cairo_sources += $(cairo_svg_sources) +if CAIRO_HAS_SVG_SURFACE +enabled_cairo_headers += $(cairo_svg_headers) +enabled_cairo_private += $(cairo_svg_private) +enabled_cairo_cxx_sources += $(cairo_svg_cxx_sources) +enabled_cairo_sources += $(cairo_svg_sources) +endif +all_cairo_pkgconf += cairo-svg.pc +if CAIRO_HAS_SVG_SURFACE +enabled_cairo_pkgconf += cairo-svg.pc +endif + +all_cairo_private += $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +all_cairo_cxx_sources += $(cairo_test_surfaces_cxx_sources) +all_cairo_sources += $(cairo_test_surfaces_sources) +if CAIRO_HAS_TEST_SURFACES +enabled_cairo_private += $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +enabled_cairo_cxx_sources += $(cairo_test_surfaces_cxx_sources) +enabled_cairo_sources += $(cairo_test_surfaces_sources) +endif + +supported_cairo_headers += $(cairo_image_headers) +all_cairo_headers += $(cairo_image_headers) +all_cairo_private += $(cairo_image_private) +all_cairo_cxx_sources += $(cairo_image_cxx_sources) +all_cairo_sources += $(cairo_image_sources) +enabled_cairo_headers += $(cairo_image_headers) +enabled_cairo_private += $(cairo_image_private) +enabled_cairo_cxx_sources += $(cairo_image_cxx_sources) +enabled_cairo_sources += $(cairo_image_sources) + +supported_cairo_headers += $(cairo_mime_headers) +all_cairo_headers += $(cairo_mime_headers) +all_cairo_private += $(cairo_mime_private) +all_cairo_cxx_sources += $(cairo_mime_cxx_sources) +all_cairo_sources += $(cairo_mime_sources) +enabled_cairo_headers += $(cairo_mime_headers) +enabled_cairo_private += $(cairo_mime_private) +enabled_cairo_cxx_sources += $(cairo_mime_cxx_sources) +enabled_cairo_sources += $(cairo_mime_sources) + +supported_cairo_headers += $(cairo_recording_headers) +all_cairo_headers += $(cairo_recording_headers) +all_cairo_private += $(cairo_recording_private) +all_cairo_cxx_sources += $(cairo_recording_cxx_sources) +all_cairo_sources += $(cairo_recording_sources) +enabled_cairo_headers += $(cairo_recording_headers) +enabled_cairo_private += $(cairo_recording_private) +enabled_cairo_cxx_sources += $(cairo_recording_cxx_sources) +enabled_cairo_sources += $(cairo_recording_sources) + +supported_cairo_headers += $(cairo_observer_headers) +all_cairo_headers += $(cairo_observer_headers) +all_cairo_private += $(cairo_observer_private) +all_cairo_cxx_sources += $(cairo_observer_cxx_sources) +all_cairo_sources += $(cairo_observer_sources) +enabled_cairo_headers += $(cairo_observer_headers) +enabled_cairo_private += $(cairo_observer_private) +enabled_cairo_cxx_sources += $(cairo_observer_cxx_sources) +enabled_cairo_sources += $(cairo_observer_sources) + +unsupported_cairo_headers += $(cairo_tee_headers) +all_cairo_headers += $(cairo_tee_headers) +all_cairo_private += $(cairo_tee_private) +all_cairo_cxx_sources += $(cairo_tee_cxx_sources) +all_cairo_sources += $(cairo_tee_sources) +if CAIRO_HAS_TEE_SURFACE +enabled_cairo_headers += $(cairo_tee_headers) +enabled_cairo_private += $(cairo_tee_private) +enabled_cairo_cxx_sources += $(cairo_tee_cxx_sources) +enabled_cairo_sources += $(cairo_tee_sources) +endif +all_cairo_pkgconf += cairo-tee.pc +if CAIRO_HAS_TEE_SURFACE +enabled_cairo_pkgconf += cairo-tee.pc +endif + +unsupported_cairo_headers += $(cairo_xml_headers) +all_cairo_headers += $(cairo_xml_headers) +all_cairo_private += $(cairo_xml_private) +all_cairo_cxx_sources += $(cairo_xml_cxx_sources) +all_cairo_sources += $(cairo_xml_sources) +if CAIRO_HAS_XML_SURFACE +enabled_cairo_headers += $(cairo_xml_headers) +enabled_cairo_private += $(cairo_xml_private) +enabled_cairo_cxx_sources += $(cairo_xml_cxx_sources) +enabled_cairo_sources += $(cairo_xml_sources) +endif +all_cairo_pkgconf += cairo-xml.pc +if CAIRO_HAS_XML_SURFACE +enabled_cairo_pkgconf += cairo-xml.pc +endif + +supported_cairo_headers += $(cairo_user_headers) +all_cairo_headers += $(cairo_user_headers) +all_cairo_private += $(cairo_user_private) +all_cairo_cxx_sources += $(cairo_user_cxx_sources) +all_cairo_sources += $(cairo_user_sources) +enabled_cairo_headers += $(cairo_user_headers) +enabled_cairo_private += $(cairo_user_private) +enabled_cairo_cxx_sources += $(cairo_user_cxx_sources) +enabled_cairo_sources += $(cairo_user_sources) + +all_cairo_private += $(cairo_pthread_private) $(cairo_pthread_headers) +all_cairo_cxx_sources += $(cairo_pthread_cxx_sources) +all_cairo_sources += $(cairo_pthread_sources) +if CAIRO_HAS_PTHREAD +enabled_cairo_private += $(cairo_pthread_private) $(cairo_pthread_headers) +enabled_cairo_cxx_sources += $(cairo_pthread_cxx_sources) +enabled_cairo_sources += $(cairo_pthread_sources) +endif + +supported_cairo_headers += $(cairo_gobject_headers) +all_cairo_headers += $(cairo_gobject_headers) +all_cairo_private += $(cairo_gobject_private) +all_cairo_cxx_sources += $(cairo_gobject_cxx_sources) +all_cairo_sources += $(cairo_gobject_sources) +if CAIRO_HAS_GOBJECT_FUNCTIONS +enabled_cairo_headers += $(cairo_gobject_headers) +enabled_cairo_private += $(cairo_gobject_private) +enabled_cairo_cxx_sources += $(cairo_gobject_cxx_sources) +enabled_cairo_sources += $(cairo_gobject_sources) +endif +all_cairo_pkgconf += cairo-gobject.pc +if CAIRO_HAS_GOBJECT_FUNCTIONS +enabled_cairo_pkgconf += cairo-gobject.pc +endif + +all_cairo_private += $(cairo_trace_private) $(cairo_trace_headers) +all_cairo_cxx_sources += $(cairo_trace_cxx_sources) +all_cairo_sources += $(cairo_trace_sources) +if CAIRO_HAS_TRACE +enabled_cairo_private += $(cairo_trace_private) $(cairo_trace_headers) +enabled_cairo_cxx_sources += $(cairo_trace_cxx_sources) +enabled_cairo_sources += $(cairo_trace_sources) +endif + +all_cairo_private += $(cairo_interpreter_private) $(cairo_interpreter_headers) +all_cairo_cxx_sources += $(cairo_interpreter_cxx_sources) +all_cairo_sources += $(cairo_interpreter_sources) +if CAIRO_HAS_INTERPRETER +enabled_cairo_private += $(cairo_interpreter_private) $(cairo_interpreter_headers) +enabled_cairo_cxx_sources += $(cairo_interpreter_cxx_sources) +enabled_cairo_sources += $(cairo_interpreter_sources) +endif + +all_cairo_private += $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +all_cairo_cxx_sources += $(cairo_symbol_lookup_cxx_sources) +all_cairo_sources += $(cairo_symbol_lookup_sources) +if CAIRO_HAS_SYMBOL_LOOKUP +enabled_cairo_private += $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +enabled_cairo_cxx_sources += $(cairo_symbol_lookup_cxx_sources) +enabled_cairo_sources += $(cairo_symbol_lookup_sources) +endif diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 000000000..057cc1de7 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,3123 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Note: All source files are listed in Makefile.sources. + +# Generated by configure. Do not edit. + +# Makefile.sources +# +# This file is the canonical location listing all the source files used +# to build the cairo library. Every source file is categorized as one of: +# +# * public header file +# * private header file (must end in -private.h except for cairoint.h) +# * source code file +# +# Every source file should be specified exactly once, grouped with the +# feature that uses the source file. If more than one feature use the +# file (like pdf_operators or font_subset files), the files should be +# appended to to the base cairo files, and the code inside them +# enabled/disabled using C preprocessor macros defined in cairoint.h. +# See how pdf_operators or font_subset are handled. +# +# The sources are picked up according to the configured features +# by the generated file Makefile.am.features or Makefile.win32.features. +# +# These are a few special source files. Those are not included in this +# file to not confuse build systems. Each build system must handle them +# separately. These files include: +# +# * cairo-features.h: +# This file is generated by configure and includes macros signifying +# which features are enabled. This file should be installed like +# other public headers, but should NOT be distributed in the cairo +# distribution. +# +# * cairo-version.h: +# This is a dummy header file used during the build, but it should +# NOT be installed. Its sole purpose is to make sure changes in the +# cairo version do not trigger a full rebuild of the library, but +# just the functions actually using the version information. +# +# * $(top_srcdir)/cairo-version.h: +# This is the real file holding the cairo version number. This file +# should be installed like other public headers. This is used during +# the build by cairo-version.c only. +# +# * cairo-supported-features.h: +# This file is generated by configure and includes macros signifying +# all supported features. This is used by gtk-doc to generate +# documentation for all those macros, enabled or not. +# This file is NOT used during the build of the library and should +# NOT be installed or distributed. +# +# Please follow the strict syntax of this file, including keeping file +# lists sorted. +# + + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(srcdir)/Makefile.am.features \ + $(top_srcdir)/src/Makefile.sources \ + $(srcdir)/Makefile.am.analysis $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(srcdir)/cairo.pc.in \ + $(srcdir)/cairo-features.pc.in $(top_srcdir)/build/depcomp \ + $(am__cairoinclude_HEADERS_DIST) \ + $(top_srcdir)/build/test-driver README +EXTRA_PROGRAMS = +TESTS = $(am__EXEEXT_1) $(am__append_186) +check_PROGRAMS = check-link$(EXEEXT) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_1 = $(cairo_xlib_headers) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_2 = $(cairo_xlib_private) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_3 = $(cairo_xlib_cxx_sources) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_4 = $(cairo_xlib_sources) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_5 = cairo-xlib.pc +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_6 = $(cairo_xlib_xrender_headers) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_7 = $(cairo_xlib_xrender_private) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_8 = $(cairo_xlib_xrender_cxx_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_9 = $(cairo_xlib_xrender_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_10 = cairo-xlib-xrender.pc +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_11 = $(cairo_xcb_headers) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_12 = $(cairo_xcb_private) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_13 = $(cairo_xcb_cxx_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_14 = $(cairo_xcb_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_15 = cairo-xcb.pc +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_16 = $(cairo_xlib_xcb_headers) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_17 = $(cairo_xlib_xcb_private) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_18 = $(cairo_xlib_xcb_cxx_sources) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_19 = $(cairo_xlib_xcb_sources) +@CAIRO_HAS_XLIB_XCB_FUNCTIONS_TRUE@am__append_20 = cairo-xlib-xcb.pc +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_21 = $(cairo_xcb_shm_headers) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_22 = $(cairo_xcb_shm_private) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_23 = $(cairo_xcb_shm_cxx_sources) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_24 = $(cairo_xcb_shm_sources) +@CAIRO_HAS_XCB_SHM_FUNCTIONS_TRUE@am__append_25 = cairo-xcb-shm.pc +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_26 = $(cairo_qt_headers) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_27 = $(cairo_qt_private) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_28 = $(cairo_qt_cxx_sources) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_29 = $(cairo_qt_sources) +@CAIRO_HAS_QT_SURFACE_TRUE@am__append_30 = cairo-qt.pc +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_31 = $(cairo_quartz_headers) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_32 = $(cairo_quartz_private) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_33 = $(cairo_quartz_cxx_sources) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_34 = $(cairo_quartz_sources) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_35 = cairo-quartz.pc +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_36 = $(cairo_quartz_font_headers) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_37 = $(cairo_quartz_font_private) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_38 = $(cairo_quartz_font_cxx_sources) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_39 = $(cairo_quartz_font_sources) +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_40 = cairo-quartz-font.pc +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_41 = $(cairo_quartz_image_headers) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_42 = $(cairo_quartz_image_private) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_43 = $(cairo_quartz_image_cxx_sources) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_44 = $(cairo_quartz_image_sources) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_45 = cairo-quartz-image.pc +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_46 = $(cairo_win32_headers) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_47 = $(cairo_win32_private) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_48 = $(cairo_win32_cxx_sources) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_49 = $(cairo_win32_sources) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_50 = cairo-win32.pc +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_51 = $(cairo_win32_font_headers) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_52 = $(cairo_win32_font_private) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_53 = $(cairo_win32_font_cxx_sources) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_54 = $(cairo_win32_font_sources) +@CAIRO_HAS_WIN32_FONT_TRUE@am__append_55 = cairo-win32-font.pc +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_56 = $(cairo_skia_headers) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_57 = $(cairo_skia_private) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_58 = $(cairo_skia_cxx_sources) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_59 = $(cairo_skia_sources) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__append_60 = cairo-skia.pc +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_61 = $(cairo_os2_headers) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_62 = $(cairo_os2_private) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_63 = $(cairo_os2_cxx_sources) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_64 = $(cairo_os2_sources) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__append_65 = cairo-os2.pc +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_66 = $(cairo_beos_headers) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_67 = $(cairo_beos_private) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_68 = $(cairo_beos_cxx_sources) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_69 = $(cairo_beos_sources) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_70 = cairo-beos.pc +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_71 = $(cairo_drm_headers) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_72 = $(cairo_drm_private) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_73 = $(cairo_drm_cxx_sources) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_74 = $(cairo_drm_sources) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__append_75 = cairo-drm.pc +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_76 = $(cairo_gallium_headers) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_77 = $(cairo_gallium_private) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_78 = $(cairo_gallium_cxx_sources) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_79 = $(cairo_gallium_sources) +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__append_80 = cairo-gallium.pc +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_81 = $(cairo_png_headers) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_82 = $(cairo_png_private) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_83 = $(cairo_png_cxx_sources) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_84 = $(cairo_png_sources) +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_85 = cairo-png.pc +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_86 = $(cairo_gl_headers) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_87 = $(cairo_gl_private) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_88 = $(cairo_gl_cxx_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_89 = $(cairo_gl_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_90 = cairo-gl.pc +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_91 = $(cairo_glesv2_headers) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_92 = $(cairo_glesv2_private) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_93 = $(cairo_glesv2_cxx_sources) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_94 = $(cairo_glesv2_sources) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__append_95 = cairo-glesv2.pc +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_96 = $(cairo_cogl_headers) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_97 = $(cairo_cogl_private) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_98 = $(cairo_cogl_cxx_sources) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_99 = $(cairo_cogl_sources) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__append_100 = cairo-cogl.pc +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_101 = $(cairo_directfb_headers) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_102 = $(cairo_directfb_private) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_103 = $(cairo_directfb_cxx_sources) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_104 = $(cairo_directfb_sources) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_105 = cairo-directfb.pc +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_106 = $(cairo_vg_headers) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_107 = $(cairo_vg_private) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_108 = $(cairo_vg_cxx_sources) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_109 = $(cairo_vg_sources) +@CAIRO_HAS_VG_SURFACE_TRUE@am__append_110 = cairo-vg.pc +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_111 = $(cairo_egl_headers) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_112 = $(cairo_egl_private) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_113 = $(cairo_egl_cxx_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_114 = $(cairo_egl_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_115 = cairo-egl.pc +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_116 = $(cairo_glx_headers) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_117 = $(cairo_glx_private) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_118 = $(cairo_glx_cxx_sources) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_119 = $(cairo_glx_sources) +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__append_120 = cairo-glx.pc +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_121 = $(cairo_wgl_headers) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_122 = $(cairo_wgl_private) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_123 = $(cairo_wgl_cxx_sources) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_124 = $(cairo_wgl_sources) +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__append_125 = cairo-wgl.pc +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_126 = $(cairo_script_headers) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_127 = $(cairo_script_private) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_128 = $(cairo_script_cxx_sources) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_129 = $(cairo_script_sources) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_130 = cairo-script.pc +@CAIRO_HAS_FT_FONT_TRUE@am__append_131 = $(cairo_ft_headers) +@CAIRO_HAS_FT_FONT_TRUE@am__append_132 = $(cairo_ft_private) +@CAIRO_HAS_FT_FONT_TRUE@am__append_133 = $(cairo_ft_cxx_sources) +@CAIRO_HAS_FT_FONT_TRUE@am__append_134 = $(cairo_ft_sources) +@CAIRO_HAS_FT_FONT_TRUE@am__append_135 = cairo-ft.pc +@CAIRO_HAS_FC_FONT_TRUE@am__append_136 = $(cairo_fc_headers) +@CAIRO_HAS_FC_FONT_TRUE@am__append_137 = $(cairo_fc_private) +@CAIRO_HAS_FC_FONT_TRUE@am__append_138 = $(cairo_fc_cxx_sources) +@CAIRO_HAS_FC_FONT_TRUE@am__append_139 = $(cairo_fc_sources) +@CAIRO_HAS_FC_FONT_TRUE@am__append_140 = cairo-fc.pc +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_141 = $(cairo_ps_headers) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_142 = $(cairo_ps_private) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_143 = $(cairo_ps_cxx_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_144 = $(cairo_ps_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_145 = cairo-ps.pc +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_146 = $(cairo_pdf_headers) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_147 = $(cairo_pdf_private) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_148 = $(cairo_pdf_cxx_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_149 = $(cairo_pdf_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_150 = cairo-pdf.pc +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_151 = $(cairo_svg_headers) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_152 = $(cairo_svg_private) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_153 = $(cairo_svg_cxx_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_154 = $(cairo_svg_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_155 = cairo-svg.pc +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_156 = $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_157 = $(cairo_test_surfaces_cxx_sources) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_158 = $(cairo_test_surfaces_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_159 = $(cairo_tee_headers) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_160 = $(cairo_tee_private) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_161 = $(cairo_tee_cxx_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_162 = $(cairo_tee_sources) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_163 = cairo-tee.pc +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_164 = $(cairo_xml_headers) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_165 = $(cairo_xml_private) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_166 = $(cairo_xml_cxx_sources) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_167 = $(cairo_xml_sources) +@CAIRO_HAS_XML_SURFACE_TRUE@am__append_168 = cairo-xml.pc +@CAIRO_HAS_PTHREAD_TRUE@am__append_169 = $(cairo_pthread_private) $(cairo_pthread_headers) +@CAIRO_HAS_PTHREAD_TRUE@am__append_170 = $(cairo_pthread_cxx_sources) +@CAIRO_HAS_PTHREAD_TRUE@am__append_171 = $(cairo_pthread_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_172 = $(cairo_gobject_headers) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_173 = $(cairo_gobject_private) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_174 = $(cairo_gobject_cxx_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_175 = $(cairo_gobject_sources) +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_176 = cairo-gobject.pc +@CAIRO_HAS_TRACE_TRUE@am__append_177 = $(cairo_trace_private) $(cairo_trace_headers) +@CAIRO_HAS_TRACE_TRUE@am__append_178 = $(cairo_trace_cxx_sources) +@CAIRO_HAS_TRACE_TRUE@am__append_179 = $(cairo_trace_sources) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_180 = $(cairo_interpreter_private) $(cairo_interpreter_headers) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_181 = $(cairo_interpreter_cxx_sources) +@CAIRO_HAS_INTERPRETER_TRUE@am__append_182 = $(cairo_interpreter_sources) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_183 = $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_184 = $(cairo_symbol_lookup_cxx_sources) +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_185 = $(cairo_symbol_lookup_sources) +@CROSS_COMPILING_FALSE@am__append_186 = check-link$(EXEEXT) +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = cairo.pc cairo-xlib.pc cairo-xlib-xrender.pc \ + cairo-xcb.pc cairo-xlib-xcb.pc cairo-xcb-shm.pc cairo-qt.pc \ + cairo-quartz.pc cairo-quartz-font.pc cairo-quartz-image.pc \ + cairo-win32.pc cairo-win32-font.pc cairo-skia.pc cairo-os2.pc \ + cairo-beos.pc cairo-drm.pc cairo-gallium.pc cairo-png.pc \ + cairo-gl.pc cairo-glesv2.pc cairo-cogl.pc cairo-directfb.pc \ + cairo-vg.pc cairo-egl.pc cairo-glx.pc cairo-wgl.pc \ + cairo-script.pc cairo-ft.pc cairo-fc.pc cairo-ps.pc \ + cairo-pdf.pc cairo-svg.pc cairo-tee.pc cairo-xml.pc \ + cairo-gobject.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(cairoincludedir)" "$(DESTDIR)$(cairoincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +am__DEPENDENCIES_1 = +@BUILD_CXX_TRUE@am__DEPENDENCIES_2 = libcairo_cxx.la +am__libcairo_la_SOURCES_DIST = cairo.h cairo-deprecated.h cairo-xlib.h \ + cairo-xlib-xrender.h cairo-xcb.h cairo-qt.h cairo-quartz.h \ + cairo-quartz-image.h cairo-win32.h cairo-skia.h cairo-os2.h \ + cairo-beos.h cairo-drm.h cairo-gl.h cairo-cogl.h \ + cairo-directfb.h cairo-vg.h cairo-script.h cairo-ft.h \ + cairo-ps.h cairo-pdf.h cairo-svg.h cairo-tee.h cairo-xml.h \ + cairoint.h cairo-analysis-surface-private.h \ + cairo-arc-private.h cairo-array-private.h \ + cairo-atomic-private.h cairo-backend-private.h \ + cairo-box-inline.h cairo-boxes-private.h cairo-cache-private.h \ + cairo-clip-inline.h cairo-clip-private.h \ + cairo-combsort-inline.h cairo-compiler-private.h \ + cairo-compositor-private.h cairo-contour-inline.h \ + cairo-contour-private.h cairo-composite-rectangles-private.h \ + cairo-damage-private.h cairo-default-context-private.h \ + cairo-device-private.h cairo-error-inline.h \ + cairo-error-private.h cairo-fixed-private.h \ + cairo-fixed-type-private.h cairo-freelist-private.h \ + cairo-freelist-type-private.h cairo-freed-pool-private.h \ + cairo-fontconfig-private.h cairo-gstate-private.h \ + cairo-hash-private.h cairo-image-info-private.h \ + cairo-image-surface-inline.h cairo-image-surface-private.h \ + cairo-line-inline.h cairo-line-private.h cairo-list-inline.h \ + cairo-list-private.h cairo-malloc-private.h \ + cairo-mempool-private.h cairo-mutex-impl-private.h \ + cairo-mutex-list-private.h cairo-mutex-private.h \ + cairo-mutex-type-private.h cairo-output-stream-private.h \ + cairo-paginated-private.h cairo-paginated-surface-private.h \ + cairo-path-fixed-private.h cairo-path-private.h \ + cairo-pattern-inline.h cairo-pattern-private.h \ + cairo-pixman-private.h cairo-private.h \ + cairo-recording-surface-inline.h \ + cairo-recording-surface-private.h \ + cairo-reference-count-private.h cairo-region-private.h \ + cairo-rtree-private.h cairo-scaled-font-private.h \ + cairo-slope-private.h cairo-spans-private.h \ + cairo-spans-compositor-private.h cairo-stroke-dash-private.h \ + cairo-surface-inline.h cairo-surface-private.h \ + cairo-surface-backend-private.h \ + cairo-surface-clipper-private.h \ + cairo-surface-fallback-private.h \ + cairo-surface-observer-inline.h \ + cairo-surface-observer-private.h \ + cairo-surface-offset-private.h \ + cairo-surface-subsurface-inline.h \ + cairo-surface-subsurface-private.h \ + cairo-surface-snapshot-inline.h \ + cairo-surface-snapshot-private.h \ + cairo-surface-wrapper-private.h cairo-time-private.h \ + cairo-types-private.h cairo-traps-private.h \ + cairo-tristrip-private.h cairo-user-font-private.h \ + cairo-wideint-private.h cairo-wideint-type-private.h \ + cairo-scaled-font-subsets-private.h \ + cairo-truetype-subset-private.h cairo-type1-private.h \ + cairo-type3-glyph-surface-private.h \ + cairo-pdf-operators-private.h cairo-pdf-shading-private.h \ + cairo-xlib-private.h cairo-xlib-surface-private.h \ + cairo-xlib-xrender-private.h cairo-xcb-private.h \ + cairo-quartz-private.h win32/cairo-win32-private.h \ + skia/cairo-skia-private.h cairo-os2-private.h \ + drm/cairo-drm-private.h drm/cairo-drm-ioctl-private.h \ + drm/cairo-drm-intel-private.h \ + drm/cairo-drm-intel-brw-defines.h \ + drm/cairo-drm-intel-brw-structs.h drm/cairo-drm-intel-brw-eu.h \ + drm/cairo-drm-intel-command-private.h \ + drm/cairo-drm-intel-ioctl-private.h \ + drm/cairo-drm-i915-private.h drm/cairo-drm-i965-private.h \ + drm/cairo-drm-radeon-private.h cairo-gl-private.h \ + cairo-gl-dispatch-private.h cairo-gl-ext-def-private.h \ + cairo-gl-gradient-private.h cairo-cogl-private.h \ + cairo-cogl-gradient-private.h cairo-cogl-context-private.h \ + cairo-cogl-utils-private.h cairo-script-private.h \ + cairo-ft-private.h cairo-ps-surface-private.h \ + cairo-pdf-surface-private.h cairo-svg-surface-private.h \ + test-compositor-surface.h test-compositor-surface-private.h \ + test-null-compositor-surface.h test-paginated-surface.h \ + cairo-tee-surface-private.h cairo-analysis-surface.c \ + cairo-arc.c cairo-array.c cairo-atomic.c cairo-base64-stream.c \ + cairo-base85-stream.c cairo-bentley-ottmann.c \ + cairo-bentley-ottmann-rectangular.c \ + cairo-bentley-ottmann-rectilinear.c \ + cairo-botor-scan-converter.c cairo-boxes.c \ + cairo-boxes-intersect.c cairo.c cairo-cache.c cairo-clip.c \ + cairo-clip-boxes.c cairo-clip-polygon.c cairo-clip-region.c \ + cairo-clip-surface.c cairo-color.c \ + cairo-composite-rectangles.c cairo-compositor.c \ + cairo-contour.c cairo-damage.c cairo-debug.c \ + cairo-default-context.c cairo-device.c cairo-error.c \ + cairo-fallback-compositor.c cairo-fixed.c cairo-font-face.c \ + cairo-font-face-twin.c cairo-font-face-twin-data.c \ + cairo-font-options.c cairo-freelist.c cairo-freed-pool.c \ + cairo-gstate.c cairo-hash.c cairo-hull.c \ + cairo-image-compositor.c cairo-image-info.c \ + cairo-image-source.c cairo-image-surface.c cairo-line.c \ + cairo-lzw.c cairo-matrix.c cairo-mask-compositor.c \ + cairo-mesh-pattern-rasterizer.c cairo-mempool.c cairo-misc.c \ + cairo-mono-scan-converter.c cairo-mutex.c \ + cairo-no-compositor.c cairo-observer.c cairo-output-stream.c \ + cairo-paginated-surface.c cairo-path-bounds.c cairo-path.c \ + cairo-path-fill.c cairo-path-fixed.c cairo-path-in-fill.c \ + cairo-path-stroke.c cairo-path-stroke-boxes.c \ + cairo-path-stroke-polygon.c cairo-path-stroke-traps.c \ + cairo-path-stroke-tristrip.c cairo-pattern.c cairo-pen.c \ + cairo-polygon.c cairo-polygon-intersect.c \ + cairo-polygon-reduce.c cairo-raster-source-pattern.c \ + cairo-recording-surface.c cairo-rectangle.c \ + cairo-rectangular-scan-converter.c cairo-region.c \ + cairo-rtree.c cairo-scaled-font.c \ + cairo-shape-mask-compositor.c cairo-slope.c cairo-spans.c \ + cairo-spans-compositor.c cairo-spline.c cairo-stroke-dash.c \ + cairo-stroke-style.c cairo-surface.c cairo-surface-clipper.c \ + cairo-surface-fallback.c cairo-surface-observer.c \ + cairo-surface-offset.c cairo-surface-snapshot.c \ + cairo-surface-subsurface.c cairo-surface-wrapper.c \ + cairo-time.c cairo-tor-scan-converter.c \ + cairo-tor22-scan-converter.c cairo-clip-tor-scan-converter.c \ + cairo-toy-font-face.c cairo-traps.c cairo-tristrip.c \ + cairo-traps-compositor.c cairo-unicode.c cairo-user-font.c \ + cairo-version.c cairo-wideint.c cairo-cff-subset.c \ + cairo-scaled-font-subsets.c cairo-truetype-subset.c \ + cairo-type1-fallback.c cairo-type1-glyph-names.c \ + cairo-type1-subset.c cairo-type3-glyph-surface.c \ + cairo-pdf-operators.c cairo-pdf-shading.c \ + cairo-deflate-stream.c cairo-xlib-display.c \ + cairo-xlib-core-compositor.c cairo-xlib-fallback-compositor.c \ + cairo-xlib-render-compositor.c cairo-xlib-screen.c \ + cairo-xlib-source.c cairo-xlib-surface.c \ + cairo-xlib-surface-shm.c cairo-xlib-visual.c \ + cairo-xlib-xcb-surface.c cairo-xcb-connection.c \ + cairo-xcb-connection-core.c cairo-xcb-connection-render.c \ + cairo-xcb-connection-shm.c cairo-xcb-screen.c cairo-xcb-shm.c \ + cairo-xcb-surface.c cairo-xcb-surface-core.c \ + cairo-xcb-surface-render.c cairo-xcb-resources.c \ + cairo-quartz-surface.c cairo-quartz-font.c \ + cairo-quartz-image-surface.c win32/cairo-win32-debug.c \ + win32/cairo-win32-device.c win32/cairo-win32-gdi-compositor.c \ + win32/cairo-win32-system.c win32/cairo-win32-surface.c \ + win32/cairo-win32-display-surface.c \ + win32/cairo-win32-printing-surface.c win32/cairo-win32-font.c \ + cairo-os2-surface.c drm/cairo-drm.c drm/cairo-drm-bo.c \ + drm/cairo-drm-surface.c drm/cairo-drm-intel.c \ + drm/cairo-drm-intel-debug.c drm/cairo-drm-intel-surface.c \ + drm/cairo-drm-i915-surface.c drm/cairo-drm-i915-glyphs.c \ + drm/cairo-drm-i915-shader.c drm/cairo-drm-i915-spans.c \ + drm/cairo-drm-i965-surface.c drm/cairo-drm-i965-glyphs.c \ + drm/cairo-drm-i965-shader.c drm/cairo-drm-i965-spans.c \ + drm/cairo-drm-intel-brw-eu.c drm/cairo-drm-intel-brw-eu-emit.c \ + drm/cairo-drm-intel-brw-eu-util.c drm/cairo-drm-radeon.c \ + drm/cairo-drm-radeon-surface.c drm/cairo-drm-gallium-surface.c \ + cairo-png.c cairo-gl-composite.c cairo-gl-device.c \ + cairo-gl-dispatch.c cairo-gl-glyphs.c cairo-gl-gradient.c \ + cairo-gl-info.c cairo-gl-operand.c cairo-gl-shaders.c \ + cairo-gl-msaa-compositor.c cairo-gl-spans-compositor.c \ + cairo-gl-traps-compositor.c cairo-gl-source.c \ + cairo-gl-surface.c cairo-cogl-surface.c cairo-cogl-gradient.c \ + cairo-cogl-context.c cairo-cogl-utils.c \ + cairo-directfb-surface.c cairo-vg-surface.c \ + cairo-egl-context.c cairo-glx-context.c cairo-wgl-context.c \ + cairo-script-surface.c cairo-ft-font.c cairo-ps-surface.c \ + cairo-pdf-surface.c cairo-svg-surface.c \ + test-compositor-surface.c test-null-compositor-surface.c \ + test-base-compositor-surface.c test-paginated-surface.c \ + cairo-tee-surface.c cairo-xml-surface.c cairo-version.h +am__objects_1 = +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__objects_2 = $(am__objects_1) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__objects_3 = $(am__objects_1) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__objects_4 = $(am__objects_1) +@CAIRO_HAS_QT_SURFACE_TRUE@am__objects_5 = $(am__objects_1) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__objects_6 = $(am__objects_1) +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__objects_7 = $(am__objects_1) +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__objects_8 = $(am__objects_1) +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__objects_9 = $(am__objects_1) +@CAIRO_HAS_OS2_SURFACE_TRUE@am__objects_10 = $(am__objects_1) +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__objects_11 = $(am__objects_1) +@CAIRO_HAS_DRM_SURFACE_TRUE@am__objects_12 = $(am__objects_1) +@CAIRO_HAS_GL_SURFACE_TRUE@am__objects_13 = $(am__objects_1) +am__objects_14 = $(am__objects_1) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__objects_15 = $(am__objects_14) +@CAIRO_HAS_COGL_SURFACE_TRUE@am__objects_16 = $(am__objects_1) +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__objects_17 = $(am__objects_1) +@CAIRO_HAS_VG_SURFACE_TRUE@am__objects_18 = $(am__objects_1) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__objects_19 = $(am__objects_1) +@CAIRO_HAS_FT_FONT_TRUE@am__objects_20 = $(am__objects_1) +@CAIRO_HAS_PS_SURFACE_TRUE@am__objects_21 = $(am__objects_1) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_22 = $(am__objects_1) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_23 = $(am__objects_1) +@CAIRO_HAS_TEE_SURFACE_TRUE@am__objects_24 = $(am__objects_1) +@CAIRO_HAS_XML_SURFACE_TRUE@am__objects_25 = $(am__objects_1) +am__objects_26 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_1) $(am__objects_1) \ + $(am__objects_5) $(am__objects_6) $(am__objects_1) \ + $(am__objects_7) $(am__objects_8) $(am__objects_1) \ + $(am__objects_9) $(am__objects_10) $(am__objects_11) \ + $(am__objects_12) $(am__objects_1) $(am__objects_1) \ + $(am__objects_13) $(am__objects_15) $(am__objects_16) \ + $(am__objects_17) $(am__objects_18) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_19) \ + $(am__objects_20) $(am__objects_1) $(am__objects_21) \ + $(am__objects_22) $(am__objects_23) $(am__objects_24) \ + $(am__objects_25) $(am__objects_1) +am__objects_27 = $(am__objects_1) $(am__objects_1) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__objects_28 = $(am__objects_1) +am__objects_29 = $(am__objects_27) $(am__objects_2) $(am__objects_1) \ + $(am__objects_4) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_6) $(am__objects_1) \ + $(am__objects_1) $(am__objects_8) $(am__objects_1) \ + $(am__objects_9) $(am__objects_10) $(am__objects_1) \ + $(am__objects_12) $(am__objects_1) $(am__objects_1) \ + $(am__objects_13) $(am__objects_15) $(am__objects_16) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_19) \ + $(am__objects_20) $(am__objects_1) $(am__objects_21) \ + $(am__objects_22) $(am__objects_23) $(am__objects_28) \ + $(am__objects_24) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) +am__objects_30 = cairo-cff-subset.lo cairo-scaled-font-subsets.lo \ + cairo-truetype-subset.lo cairo-type1-fallback.lo \ + cairo-type1-glyph-names.lo cairo-type1-subset.lo \ + cairo-type3-glyph-surface.lo +am__objects_31 = cairo-pdf-operators.lo cairo-pdf-shading.lo +am__objects_32 = cairo-deflate-stream.lo +am__objects_33 = cairo-analysis-surface.lo cairo-arc.lo cairo-array.lo \ + cairo-atomic.lo cairo-base64-stream.lo cairo-base85-stream.lo \ + cairo-bentley-ottmann.lo cairo-bentley-ottmann-rectangular.lo \ + cairo-bentley-ottmann-rectilinear.lo \ + cairo-botor-scan-converter.lo cairo-boxes.lo \ + cairo-boxes-intersect.lo cairo.lo cairo-cache.lo cairo-clip.lo \ + cairo-clip-boxes.lo cairo-clip-polygon.lo cairo-clip-region.lo \ + cairo-clip-surface.lo cairo-color.lo \ + cairo-composite-rectangles.lo cairo-compositor.lo \ + cairo-contour.lo cairo-damage.lo cairo-debug.lo \ + cairo-default-context.lo cairo-device.lo cairo-error.lo \ + cairo-fallback-compositor.lo cairo-fixed.lo cairo-font-face.lo \ + cairo-font-face-twin.lo cairo-font-face-twin-data.lo \ + cairo-font-options.lo cairo-freelist.lo cairo-freed-pool.lo \ + cairo-gstate.lo cairo-hash.lo cairo-hull.lo \ + cairo-image-compositor.lo cairo-image-info.lo \ + cairo-image-source.lo cairo-image-surface.lo cairo-line.lo \ + cairo-lzw.lo cairo-matrix.lo cairo-mask-compositor.lo \ + cairo-mesh-pattern-rasterizer.lo cairo-mempool.lo \ + cairo-misc.lo cairo-mono-scan-converter.lo cairo-mutex.lo \ + cairo-no-compositor.lo cairo-observer.lo \ + cairo-output-stream.lo cairo-paginated-surface.lo \ + cairo-path-bounds.lo cairo-path.lo cairo-path-fill.lo \ + cairo-path-fixed.lo cairo-path-in-fill.lo cairo-path-stroke.lo \ + cairo-path-stroke-boxes.lo cairo-path-stroke-polygon.lo \ + cairo-path-stroke-traps.lo cairo-path-stroke-tristrip.lo \ + cairo-pattern.lo cairo-pen.lo cairo-polygon.lo \ + cairo-polygon-intersect.lo cairo-polygon-reduce.lo \ + cairo-raster-source-pattern.lo cairo-recording-surface.lo \ + cairo-rectangle.lo cairo-rectangular-scan-converter.lo \ + cairo-region.lo cairo-rtree.lo cairo-scaled-font.lo \ + cairo-shape-mask-compositor.lo cairo-slope.lo cairo-spans.lo \ + cairo-spans-compositor.lo cairo-spline.lo cairo-stroke-dash.lo \ + cairo-stroke-style.lo cairo-surface.lo \ + cairo-surface-clipper.lo cairo-surface-fallback.lo \ + cairo-surface-observer.lo cairo-surface-offset.lo \ + cairo-surface-snapshot.lo cairo-surface-subsurface.lo \ + cairo-surface-wrapper.lo cairo-time.lo \ + cairo-tor-scan-converter.lo cairo-tor22-scan-converter.lo \ + cairo-clip-tor-scan-converter.lo cairo-toy-font-face.lo \ + cairo-traps.lo cairo-tristrip.lo cairo-traps-compositor.lo \ + cairo-unicode.lo cairo-user-font.lo cairo-version.lo \ + cairo-wideint.lo $(am__objects_30) $(am__objects_31) \ + $(am__objects_32) +am__objects_34 = cairo-xlib-display.lo cairo-xlib-core-compositor.lo \ + cairo-xlib-fallback-compositor.lo \ + cairo-xlib-render-compositor.lo cairo-xlib-screen.lo \ + cairo-xlib-source.lo cairo-xlib-surface.lo \ + cairo-xlib-surface-shm.lo cairo-xlib-visual.lo \ + cairo-xlib-xcb-surface.lo +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__objects_35 = $(am__objects_34) +am__objects_36 = cairo-xcb-connection.lo cairo-xcb-connection-core.lo \ + cairo-xcb-connection-render.lo cairo-xcb-connection-shm.lo \ + cairo-xcb-screen.lo cairo-xcb-shm.lo cairo-xcb-surface.lo \ + cairo-xcb-surface-core.lo cairo-xcb-surface-render.lo \ + cairo-xcb-resources.lo +@CAIRO_HAS_XCB_SURFACE_TRUE@am__objects_37 = $(am__objects_36) +am__objects_38 = cairo-quartz-surface.lo +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__objects_39 = $(am__objects_38) +am__objects_40 = cairo-quartz-font.lo +@CAIRO_HAS_QUARTZ_FONT_TRUE@am__objects_41 = $(am__objects_40) +am__objects_42 = cairo-quartz-image-surface.lo +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__objects_43 = \ +@CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@ $(am__objects_42) +am__objects_44 = cairo-win32-debug.lo cairo-win32-device.lo \ + cairo-win32-gdi-compositor.lo cairo-win32-system.lo \ + cairo-win32-surface.lo cairo-win32-display-surface.lo \ + cairo-win32-printing-surface.lo +@CAIRO_HAS_WIN32_SURFACE_TRUE@am__objects_45 = $(am__objects_44) +am__objects_46 = cairo-win32-font.lo +@CAIRO_HAS_WIN32_FONT_TRUE@am__objects_47 = $(am__objects_46) +am__objects_48 = cairo-os2-surface.lo +@CAIRO_HAS_OS2_SURFACE_TRUE@am__objects_49 = $(am__objects_48) +am__objects_50 = cairo-drm.lo cairo-drm-bo.lo cairo-drm-surface.lo \ + cairo-drm-intel.lo cairo-drm-intel-debug.lo \ + cairo-drm-intel-surface.lo cairo-drm-i915-surface.lo \ + cairo-drm-i915-glyphs.lo cairo-drm-i915-shader.lo \ + cairo-drm-i915-spans.lo cairo-drm-i965-surface.lo \ + cairo-drm-i965-glyphs.lo cairo-drm-i965-shader.lo \ + cairo-drm-i965-spans.lo cairo-drm-intel-brw-eu.lo \ + cairo-drm-intel-brw-eu-emit.lo cairo-drm-intel-brw-eu-util.lo \ + cairo-drm-radeon.lo cairo-drm-radeon-surface.lo +@CAIRO_HAS_DRM_SURFACE_TRUE@am__objects_51 = $(am__objects_50) +am__objects_52 = cairo-drm-gallium-surface.lo +@CAIRO_HAS_GALLIUM_SURFACE_TRUE@am__objects_53 = $(am__objects_52) +am__objects_54 = cairo-png.lo +@CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__objects_55 = $(am__objects_54) +am__objects_56 = cairo-gl-composite.lo cairo-gl-device.lo \ + cairo-gl-dispatch.lo cairo-gl-glyphs.lo cairo-gl-gradient.lo \ + cairo-gl-info.lo cairo-gl-operand.lo cairo-gl-shaders.lo \ + cairo-gl-msaa-compositor.lo cairo-gl-spans-compositor.lo \ + cairo-gl-traps-compositor.lo cairo-gl-source.lo \ + cairo-gl-surface.lo +@CAIRO_HAS_GL_SURFACE_TRUE@am__objects_57 = $(am__objects_56) +am__objects_58 = $(am__objects_56) +@CAIRO_HAS_GLESV2_SURFACE_TRUE@am__objects_59 = $(am__objects_58) +am__objects_60 = cairo-cogl-surface.lo cairo-cogl-gradient.lo \ + cairo-cogl-context.lo cairo-cogl-utils.lo +@CAIRO_HAS_COGL_SURFACE_TRUE@am__objects_61 = $(am__objects_60) +am__objects_62 = cairo-directfb-surface.lo +@CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__objects_63 = $(am__objects_62) +am__objects_64 = cairo-vg-surface.lo +@CAIRO_HAS_VG_SURFACE_TRUE@am__objects_65 = $(am__objects_64) +am__objects_66 = cairo-egl-context.lo +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__objects_67 = $(am__objects_66) +am__objects_68 = cairo-glx-context.lo +@CAIRO_HAS_GLX_FUNCTIONS_TRUE@am__objects_69 = $(am__objects_68) +am__objects_70 = cairo-wgl-context.lo +@CAIRO_HAS_WGL_FUNCTIONS_TRUE@am__objects_71 = $(am__objects_70) +am__objects_72 = cairo-script-surface.lo +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__objects_73 = $(am__objects_72) +am__objects_74 = cairo-ft-font.lo +@CAIRO_HAS_FT_FONT_TRUE@am__objects_75 = $(am__objects_74) +am__objects_76 = cairo-ps-surface.lo +@CAIRO_HAS_PS_SURFACE_TRUE@am__objects_77 = $(am__objects_76) +am__objects_78 = cairo-pdf-surface.lo +@CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_79 = $(am__objects_78) +am__objects_80 = cairo-svg-surface.lo +@CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_81 = $(am__objects_80) +am__objects_82 = test-compositor-surface.lo \ + test-null-compositor-surface.lo \ + test-base-compositor-surface.lo test-paginated-surface.lo +@CAIRO_HAS_TEST_SURFACES_TRUE@am__objects_83 = $(am__objects_82) +am__objects_84 = cairo-tee-surface.lo +@CAIRO_HAS_TEE_SURFACE_TRUE@am__objects_85 = $(am__objects_84) +am__objects_86 = cairo-xml-surface.lo +@CAIRO_HAS_XML_SURFACE_TRUE@am__objects_87 = $(am__objects_86) +am__objects_88 = $(am__objects_33) $(am__objects_35) $(am__objects_1) \ + $(am__objects_37) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_39) $(am__objects_41) \ + $(am__objects_43) $(am__objects_45) $(am__objects_47) \ + $(am__objects_1) $(am__objects_49) $(am__objects_1) \ + $(am__objects_51) $(am__objects_53) $(am__objects_55) \ + $(am__objects_57) $(am__objects_59) $(am__objects_61) \ + $(am__objects_63) $(am__objects_65) $(am__objects_67) \ + $(am__objects_69) $(am__objects_71) $(am__objects_73) \ + $(am__objects_75) $(am__objects_1) $(am__objects_77) \ + $(am__objects_79) $(am__objects_81) $(am__objects_83) \ + $(am__objects_85) $(am__objects_87) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) +am_libcairo_la_OBJECTS = $(am__objects_26) $(am__objects_29) \ + $(am__objects_88) +nodist_libcairo_la_OBJECTS = +libcairo_la_OBJECTS = $(am_libcairo_la_OBJECTS) \ + $(nodist_libcairo_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcairo_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libcairo_la_LDFLAGS) $(LDFLAGS) -o $@ +am__libcairo_cxx_la_SOURCES_DIST = cairo.h cairo-deprecated.h \ + cairo-xlib.h cairo-xlib-xrender.h cairo-xcb.h cairo-qt.h \ + cairo-quartz.h cairo-quartz-image.h cairo-win32.h cairo-skia.h \ + cairo-os2.h cairo-beos.h cairo-drm.h cairo-gl.h cairo-cogl.h \ + cairo-directfb.h cairo-vg.h cairo-script.h cairo-ft.h \ + cairo-ps.h cairo-pdf.h cairo-svg.h cairo-tee.h cairo-xml.h \ + cairoint.h cairo-analysis-surface-private.h \ + cairo-arc-private.h cairo-array-private.h \ + cairo-atomic-private.h cairo-backend-private.h \ + cairo-box-inline.h cairo-boxes-private.h cairo-cache-private.h \ + cairo-clip-inline.h cairo-clip-private.h \ + cairo-combsort-inline.h cairo-compiler-private.h \ + cairo-compositor-private.h cairo-contour-inline.h \ + cairo-contour-private.h cairo-composite-rectangles-private.h \ + cairo-damage-private.h cairo-default-context-private.h \ + cairo-device-private.h cairo-error-inline.h \ + cairo-error-private.h cairo-fixed-private.h \ + cairo-fixed-type-private.h cairo-freelist-private.h \ + cairo-freelist-type-private.h cairo-freed-pool-private.h \ + cairo-fontconfig-private.h cairo-gstate-private.h \ + cairo-hash-private.h cairo-image-info-private.h \ + cairo-image-surface-inline.h cairo-image-surface-private.h \ + cairo-line-inline.h cairo-line-private.h cairo-list-inline.h \ + cairo-list-private.h cairo-malloc-private.h \ + cairo-mempool-private.h cairo-mutex-impl-private.h \ + cairo-mutex-list-private.h cairo-mutex-private.h \ + cairo-mutex-type-private.h cairo-output-stream-private.h \ + cairo-paginated-private.h cairo-paginated-surface-private.h \ + cairo-path-fixed-private.h cairo-path-private.h \ + cairo-pattern-inline.h cairo-pattern-private.h \ + cairo-pixman-private.h cairo-private.h \ + cairo-recording-surface-inline.h \ + cairo-recording-surface-private.h \ + cairo-reference-count-private.h cairo-region-private.h \ + cairo-rtree-private.h cairo-scaled-font-private.h \ + cairo-slope-private.h cairo-spans-private.h \ + cairo-spans-compositor-private.h cairo-stroke-dash-private.h \ + cairo-surface-inline.h cairo-surface-private.h \ + cairo-surface-backend-private.h \ + cairo-surface-clipper-private.h \ + cairo-surface-fallback-private.h \ + cairo-surface-observer-inline.h \ + cairo-surface-observer-private.h \ + cairo-surface-offset-private.h \ + cairo-surface-subsurface-inline.h \ + cairo-surface-subsurface-private.h \ + cairo-surface-snapshot-inline.h \ + cairo-surface-snapshot-private.h \ + cairo-surface-wrapper-private.h cairo-time-private.h \ + cairo-types-private.h cairo-traps-private.h \ + cairo-tristrip-private.h cairo-user-font-private.h \ + cairo-wideint-private.h cairo-wideint-type-private.h \ + cairo-scaled-font-subsets-private.h \ + cairo-truetype-subset-private.h cairo-type1-private.h \ + cairo-type3-glyph-surface-private.h \ + cairo-pdf-operators-private.h cairo-pdf-shading-private.h \ + cairo-xlib-private.h cairo-xlib-surface-private.h \ + cairo-xlib-xrender-private.h cairo-xcb-private.h \ + cairo-quartz-private.h win32/cairo-win32-private.h \ + skia/cairo-skia-private.h cairo-os2-private.h \ + drm/cairo-drm-private.h drm/cairo-drm-ioctl-private.h \ + drm/cairo-drm-intel-private.h \ + drm/cairo-drm-intel-brw-defines.h \ + drm/cairo-drm-intel-brw-structs.h drm/cairo-drm-intel-brw-eu.h \ + drm/cairo-drm-intel-command-private.h \ + drm/cairo-drm-intel-ioctl-private.h \ + drm/cairo-drm-i915-private.h drm/cairo-drm-i965-private.h \ + drm/cairo-drm-radeon-private.h cairo-gl-private.h \ + cairo-gl-dispatch-private.h cairo-gl-ext-def-private.h \ + cairo-gl-gradient-private.h cairo-cogl-private.h \ + cairo-cogl-gradient-private.h cairo-cogl-context-private.h \ + cairo-cogl-utils-private.h cairo-script-private.h \ + cairo-ft-private.h cairo-ps-surface-private.h \ + cairo-pdf-surface-private.h cairo-svg-surface-private.h \ + test-compositor-surface.h test-compositor-surface-private.h \ + test-null-compositor-surface.h test-paginated-surface.h \ + cairo-tee-surface-private.h cairo-qt-surface.cpp \ + skia/cairo-skia-context.cpp skia/cairo-skia-surface.cpp \ + cairo-beos-surface.cpp +am__objects_89 = cairo-qt-surface.lo +@CAIRO_HAS_QT_SURFACE_TRUE@am__objects_90 = $(am__objects_89) +am__objects_91 = cairo-skia-context.lo cairo-skia-surface.lo +@CAIRO_HAS_SKIA_SURFACE_TRUE@am__objects_92 = $(am__objects_91) +am__objects_93 = cairo-beos-surface.lo +@CAIRO_HAS_BEOS_SURFACE_TRUE@am__objects_94 = $(am__objects_93) +am__objects_95 = $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_90) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_92) \ + $(am__objects_1) $(am__objects_94) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) +am_libcairo_cxx_la_OBJECTS = $(am__objects_26) $(am__objects_29) \ + $(am__objects_95) +libcairo_cxx_la_OBJECTS = $(am_libcairo_cxx_la_OBJECTS) +libcairo_cxx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(libcairo_cxx_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@BUILD_CXX_TRUE@am_libcairo_cxx_la_rpath = +check_link_SOURCES = check-link.c +check_link_OBJECTS = check-link.$(OBJEXT) +check_link_DEPENDENCIES = libcairo.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libcairo_la_SOURCES) $(nodist_libcairo_la_SOURCES) \ + $(libcairo_cxx_la_SOURCES) check-link.c +DIST_SOURCES = $(am__libcairo_la_SOURCES_DIST) \ + $(am__libcairo_cxx_la_SOURCES_DIST) check-link.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +am__cairoinclude_HEADERS_DIST = cairo.h cairo-deprecated.h \ + cairo-xlib.h cairo-xlib-xrender.h cairo-xcb.h cairo-qt.h \ + cairo-quartz.h cairo-quartz-image.h cairo-win32.h cairo-skia.h \ + cairo-os2.h cairo-beos.h cairo-drm.h cairo-gl.h cairo-cogl.h \ + cairo-directfb.h cairo-vg.h cairo-script.h cairo-ft.h \ + cairo-ps.h cairo-pdf.h cairo-svg.h cairo-tee.h cairo-xml.h \ + $(top_srcdir)/cairo-version.h +HEADERS = $(cairoinclude_HEADERS) $(nodist_cairoinclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +am__EXEEXT_1 = check-def.sh check-doc-syntax.sh check-headers.sh \ + check-plt.sh check-preprocessor-syntax.sh +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = cairo-features.h cairo-supported-features.h +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) cairo.def headers-standalone +DISTCLEANFILES = $(BUILT_SOURCES) cairo-features.h \ + cairo-supported-features.h +EXTRA_DIST = Makefile.win32 Makefile.win32.features $(TESTS_SH) \ + check-has-hidden-symbols.c check-doc-syntax.awk +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in +cairo_headers = cairo.h cairo-deprecated.h +cairo_private = cairoint.h cairo-analysis-surface-private.h \ + cairo-arc-private.h cairo-array-private.h \ + cairo-atomic-private.h cairo-backend-private.h \ + cairo-box-inline.h cairo-boxes-private.h cairo-cache-private.h \ + cairo-clip-inline.h cairo-clip-private.h \ + cairo-combsort-inline.h cairo-compiler-private.h \ + cairo-compositor-private.h cairo-contour-inline.h \ + cairo-contour-private.h cairo-composite-rectangles-private.h \ + cairo-damage-private.h cairo-default-context-private.h \ + cairo-device-private.h cairo-error-inline.h \ + cairo-error-private.h cairo-fixed-private.h \ + cairo-fixed-type-private.h cairo-freelist-private.h \ + cairo-freelist-type-private.h cairo-freed-pool-private.h \ + cairo-fontconfig-private.h cairo-gstate-private.h \ + cairo-hash-private.h cairo-image-info-private.h \ + cairo-image-surface-inline.h cairo-image-surface-private.h \ + cairo-line-inline.h cairo-line-private.h cairo-list-inline.h \ + cairo-list-private.h cairo-malloc-private.h \ + cairo-mempool-private.h cairo-mutex-impl-private.h \ + cairo-mutex-list-private.h cairo-mutex-private.h \ + cairo-mutex-type-private.h cairo-output-stream-private.h \ + cairo-paginated-private.h cairo-paginated-surface-private.h \ + cairo-path-fixed-private.h cairo-path-private.h \ + cairo-pattern-inline.h cairo-pattern-private.h \ + cairo-pixman-private.h cairo-private.h \ + cairo-recording-surface-inline.h \ + cairo-recording-surface-private.h \ + cairo-reference-count-private.h cairo-region-private.h \ + cairo-rtree-private.h cairo-scaled-font-private.h \ + cairo-slope-private.h cairo-spans-private.h \ + cairo-spans-compositor-private.h cairo-stroke-dash-private.h \ + cairo-surface-inline.h cairo-surface-private.h \ + cairo-surface-backend-private.h \ + cairo-surface-clipper-private.h \ + cairo-surface-fallback-private.h \ + cairo-surface-observer-inline.h \ + cairo-surface-observer-private.h \ + cairo-surface-offset-private.h \ + cairo-surface-subsurface-inline.h \ + cairo-surface-subsurface-private.h \ + cairo-surface-snapshot-inline.h \ + cairo-surface-snapshot-private.h \ + cairo-surface-wrapper-private.h cairo-time-private.h \ + cairo-types-private.h cairo-traps-private.h \ + cairo-tristrip-private.h cairo-user-font-private.h \ + cairo-wideint-private.h cairo-wideint-type-private.h $(NULL) \ + $(_cairo_font_subset_private) $(_cairo_pdf_operators_private) +cairo_sources = cairo-analysis-surface.c cairo-arc.c cairo-array.c \ + cairo-atomic.c cairo-base64-stream.c cairo-base85-stream.c \ + cairo-bentley-ottmann.c cairo-bentley-ottmann-rectangular.c \ + cairo-bentley-ottmann-rectilinear.c \ + cairo-botor-scan-converter.c cairo-boxes.c \ + cairo-boxes-intersect.c cairo.c cairo-cache.c cairo-clip.c \ + cairo-clip-boxes.c cairo-clip-polygon.c cairo-clip-region.c \ + cairo-clip-surface.c cairo-color.c \ + cairo-composite-rectangles.c cairo-compositor.c \ + cairo-contour.c cairo-damage.c cairo-debug.c \ + cairo-default-context.c cairo-device.c cairo-error.c \ + cairo-fallback-compositor.c cairo-fixed.c cairo-font-face.c \ + cairo-font-face-twin.c cairo-font-face-twin-data.c \ + cairo-font-options.c cairo-freelist.c cairo-freed-pool.c \ + cairo-gstate.c cairo-hash.c cairo-hull.c \ + cairo-image-compositor.c cairo-image-info.c \ + cairo-image-source.c cairo-image-surface.c cairo-line.c \ + cairo-lzw.c cairo-matrix.c cairo-mask-compositor.c \ + cairo-mesh-pattern-rasterizer.c cairo-mempool.c cairo-misc.c \ + cairo-mono-scan-converter.c cairo-mutex.c \ + cairo-no-compositor.c cairo-observer.c cairo-output-stream.c \ + cairo-paginated-surface.c cairo-path-bounds.c cairo-path.c \ + cairo-path-fill.c cairo-path-fixed.c cairo-path-in-fill.c \ + cairo-path-stroke.c cairo-path-stroke-boxes.c \ + cairo-path-stroke-polygon.c cairo-path-stroke-traps.c \ + cairo-path-stroke-tristrip.c cairo-pattern.c cairo-pen.c \ + cairo-polygon.c cairo-polygon-intersect.c \ + cairo-polygon-reduce.c cairo-raster-source-pattern.c \ + cairo-recording-surface.c cairo-rectangle.c \ + cairo-rectangular-scan-converter.c cairo-region.c \ + cairo-rtree.c cairo-scaled-font.c \ + cairo-shape-mask-compositor.c cairo-slope.c cairo-spans.c \ + cairo-spans-compositor.c cairo-spline.c cairo-stroke-dash.c \ + cairo-stroke-style.c cairo-surface.c cairo-surface-clipper.c \ + cairo-surface-fallback.c cairo-surface-observer.c \ + cairo-surface-offset.c cairo-surface-snapshot.c \ + cairo-surface-subsurface.c cairo-surface-wrapper.c \ + cairo-time.c cairo-tor-scan-converter.c \ + cairo-tor22-scan-converter.c cairo-clip-tor-scan-converter.c \ + cairo-toy-font-face.c cairo-traps.c cairo-tristrip.c \ + cairo-traps-compositor.c cairo-unicode.c cairo-user-font.c \ + cairo-version.c cairo-wideint.c $(NULL) \ + $(_cairo_font_subset_sources) $(_cairo_pdf_operators_sources) \ + $(_cairo_deflate_stream_sources) +_cairo_font_subset_private = \ + cairo-scaled-font-subsets-private.h \ + cairo-truetype-subset-private.h \ + cairo-type1-private.h \ + cairo-type3-glyph-surface-private.h \ + $(NULL) + +_cairo_font_subset_sources = \ + cairo-cff-subset.c \ + cairo-scaled-font-subsets.c \ + cairo-truetype-subset.c \ + cairo-type1-fallback.c \ + cairo-type1-glyph-names.c \ + cairo-type1-subset.c \ + cairo-type3-glyph-surface.c \ + $(NULL) + +cairo_egl_sources = cairo-egl-context.c +cairo_glx_sources = cairo-glx-context.c +cairo_wgl_sources = cairo-wgl-context.c +_cairo_pdf_operators_private = cairo-pdf-operators-private.h cairo-pdf-shading-private.h +_cairo_pdf_operators_sources = cairo-pdf-operators.c cairo-pdf-shading.c +cairo_png_sources = cairo-png.c +cairo_ps_headers = cairo-ps.h +cairo_ps_private = cairo-ps-surface-private.h +cairo_ps_sources = cairo-ps-surface.c +_cairo_deflate_stream_sources = cairo-deflate-stream.c +cairo_pdf_headers = cairo-pdf.h +cairo_pdf_private = cairo-pdf-surface-private.h +cairo_pdf_sources = cairo-pdf-surface.c +cairo_svg_headers = cairo-svg.h +cairo_svg_private = cairo-svg-surface-private.h +cairo_svg_sources = cairo-svg-surface.c +cairo_ft_headers = cairo-ft.h +cairo_ft_private = cairo-ft-private.h +cairo_ft_sources = cairo-ft-font.c + +# These are private, even though they look like public headers +cairo_test_surfaces_private = \ + test-compositor-surface.h \ + test-compositor-surface-private.h \ + test-null-compositor-surface.h \ + test-paginated-surface.h \ + $(NULL) + +cairo_test_surfaces_sources = \ + test-compositor-surface.c \ + test-null-compositor-surface.c \ + test-base-compositor-surface.c \ + test-paginated-surface.c \ + $(NULL) + +cairo_xlib_headers = cairo-xlib.h +cairo_xlib_private = \ + cairo-xlib-private.h \ + cairo-xlib-surface-private.h \ + cairo-xlib-xrender-private.h \ + $(NULL) + +cairo_xlib_sources = \ + cairo-xlib-display.c \ + cairo-xlib-core-compositor.c \ + cairo-xlib-fallback-compositor.c \ + cairo-xlib-render-compositor.c \ + cairo-xlib-screen.c \ + cairo-xlib-source.c \ + cairo-xlib-surface.c \ + cairo-xlib-surface-shm.c \ + cairo-xlib-visual.c \ + cairo-xlib-xcb-surface.c \ + $(NULL) + +cairo_xlib_xrender_headers = cairo-xlib-xrender.h +cairo_xcb_headers = cairo-xcb.h +cairo_xcb_private = cairo-xcb-private.h +cairo_xcb_sources = \ + cairo-xcb-connection.c \ + cairo-xcb-connection-core.c \ + cairo-xcb-connection-render.c \ + cairo-xcb-connection-shm.c \ + cairo-xcb-screen.c \ + cairo-xcb-shm.c \ + cairo-xcb-surface.c \ + cairo-xcb-surface-core.c \ + cairo-xcb-surface-render.c \ + cairo-xcb-resources.c \ + $(NULL) + +cairo_qt_headers = cairo-qt.h +cairo_qt_cxx_sources = cairo-qt-surface.cpp +cairo_quartz_headers = cairo-quartz.h +cairo_quartz_private = cairo-quartz-private.h +cairo_quartz_sources = cairo-quartz-surface.c +cairo_quartz_image_headers = cairo-quartz-image.h +cairo_quartz_image_sources = cairo-quartz-image-surface.c +cairo_quartz_font_sources = cairo-quartz-font.c +cairo_win32_headers = cairo-win32.h +cairo_win32_private = win32/cairo-win32-private.h +cairo_win32_sources = \ + win32/cairo-win32-debug.c \ + win32/cairo-win32-device.c \ + win32/cairo-win32-gdi-compositor.c \ + win32/cairo-win32-system.c \ + win32/cairo-win32-surface.c \ + win32/cairo-win32-display-surface.c \ + win32/cairo-win32-printing-surface.c \ + $(NULL) + +cairo_win32_font_sources = \ + win32/cairo-win32-font.c \ + $(NULL) + +cairo_skia_headers = cairo-skia.h +cairo_skia_private = skia/cairo-skia-private.h +cairo_skia_cxx_sources = \ + skia/cairo-skia-context.cpp \ + skia/cairo-skia-surface.cpp \ + $(NULL) + +cairo_os2_headers = cairo-os2.h +cairo_os2_private = cairo-os2-private.h +cairo_os2_sources = cairo-os2-surface.c + +# automake is stupid enough to always use c++ linker if we enable the +# following lines, even if beos surface is not enabled. Disable it for now. +cairo_beos_headers = cairo-beos.h +cairo_beos_cxx_sources = cairo-beos-surface.cpp +cairo_gl_headers = cairo-gl.h +cairo_gl_private = cairo-gl-private.h \ + cairo-gl-dispatch-private.h \ + cairo-gl-ext-def-private.h \ + cairo-gl-gradient-private.h + +cairo_gl_sources = cairo-gl-composite.c \ + cairo-gl-device.c \ + cairo-gl-dispatch.c \ + cairo-gl-glyphs.c \ + cairo-gl-gradient.c \ + cairo-gl-info.c \ + cairo-gl-operand.c \ + cairo-gl-shaders.c \ + cairo-gl-msaa-compositor.c \ + cairo-gl-spans-compositor.c \ + cairo-gl-traps-compositor.c \ + cairo-gl-source.c \ + cairo-gl-surface.c + +cairo_glesv2_headers = $(cairo_gl_headers) +cairo_glesv2_private = $(cairo_gl_private) +cairo_glesv2_sources = $(cairo_gl_sources) +cairo_directfb_headers = cairo-directfb.h +cairo_directfb_sources = cairo-directfb-surface.c +cairo_drm_headers = cairo-drm.h +cairo_drm_private = drm/cairo-drm-private.h \ + drm/cairo-drm-ioctl-private.h \ + drm/cairo-drm-intel-private.h \ + drm/cairo-drm-intel-brw-defines.h \ + drm/cairo-drm-intel-brw-structs.h \ + drm/cairo-drm-intel-brw-eu.h \ + drm/cairo-drm-intel-command-private.h \ + drm/cairo-drm-intel-ioctl-private.h \ + drm/cairo-drm-i915-private.h \ + drm/cairo-drm-i965-private.h \ + drm/cairo-drm-radeon-private.h + +cairo_drm_sources = drm/cairo-drm.c \ + drm/cairo-drm-bo.c \ + drm/cairo-drm-surface.c \ + drm/cairo-drm-intel.c \ + drm/cairo-drm-intel-debug.c \ + drm/cairo-drm-intel-surface.c \ + drm/cairo-drm-i915-surface.c \ + drm/cairo-drm-i915-glyphs.c \ + drm/cairo-drm-i915-shader.c \ + drm/cairo-drm-i915-spans.c \ + drm/cairo-drm-i965-surface.c \ + drm/cairo-drm-i965-glyphs.c \ + drm/cairo-drm-i965-shader.c \ + drm/cairo-drm-i965-spans.c \ + drm/cairo-drm-intel-brw-eu.c \ + drm/cairo-drm-intel-brw-eu-emit.c \ + drm/cairo-drm-intel-brw-eu-util.c \ + drm/cairo-drm-radeon.c \ + drm/cairo-drm-radeon-surface.c + +cairo_gallium_sources = drm/cairo-drm-gallium-surface.c +cairo_script_headers = cairo-script.h +cairo_script_private = cairo-script-private.h +cairo_script_sources = cairo-script-surface.c +cairo_tee_headers = cairo-tee.h +cairo_tee_private = cairo-tee-surface-private.h +cairo_tee_sources = cairo-tee-surface.c +cairo_xml_headers = cairo-xml.h +cairo_xml_sources = cairo-xml-surface.c +cairo_vg_headers = cairo-vg.h +cairo_vg_sources = cairo-vg-surface.c +cairo_cogl_headers = cairo-cogl.h +cairo_cogl_private = cairo-cogl-private.h \ + cairo-cogl-gradient-private.h \ + cairo-cogl-context-private.h \ + cairo-cogl-utils-private.h + +cairo_cogl_sources = cairo-cogl-surface.c \ + cairo-cogl-gradient.c \ + cairo-cogl-context.c \ + cairo-cogl-utils.c + +supported_cairo_headers = $(cairo_headers) $(cairo_xlib_headers) \ + $(cairo_xlib_xrender_headers) $(cairo_xcb_headers) \ + $(cairo_xcb_shm_headers) $(cairo_quartz_headers) \ + $(cairo_quartz_font_headers) $(cairo_win32_headers) \ + $(cairo_win32_font_headers) $(cairo_png_headers) \ + $(cairo_egl_headers) $(cairo_glx_headers) $(cairo_wgl_headers) \ + $(cairo_script_headers) $(cairo_ft_headers) \ + $(cairo_fc_headers) $(cairo_ps_headers) $(cairo_pdf_headers) \ + $(cairo_svg_headers) $(cairo_image_headers) \ + $(cairo_mime_headers) $(cairo_recording_headers) \ + $(cairo_observer_headers) $(cairo_user_headers) \ + $(cairo_gobject_headers) +unsupported_cairo_headers = $(cairo_xlib_xcb_headers) \ + $(cairo_qt_headers) $(cairo_quartz_image_headers) \ + $(cairo_skia_headers) $(cairo_os2_headers) \ + $(cairo_beos_headers) $(cairo_drm_headers) \ + $(cairo_gallium_headers) $(cairo_gl_headers) \ + $(cairo_glesv2_headers) $(cairo_cogl_headers) \ + $(cairo_directfb_headers) $(cairo_vg_headers) \ + $(cairo_tee_headers) $(cairo_xml_headers) +all_cairo_headers = $(cairo_headers) $(cairo_xlib_headers) \ + $(cairo_xlib_xrender_headers) $(cairo_xcb_headers) \ + $(cairo_xlib_xcb_headers) $(cairo_xcb_shm_headers) \ + $(cairo_qt_headers) $(cairo_quartz_headers) \ + $(cairo_quartz_font_headers) $(cairo_quartz_image_headers) \ + $(cairo_win32_headers) $(cairo_win32_font_headers) \ + $(cairo_skia_headers) $(cairo_os2_headers) \ + $(cairo_beos_headers) $(cairo_drm_headers) \ + $(cairo_gallium_headers) $(cairo_png_headers) \ + $(cairo_gl_headers) $(cairo_glesv2_headers) \ + $(cairo_cogl_headers) $(cairo_directfb_headers) \ + $(cairo_vg_headers) $(cairo_egl_headers) $(cairo_glx_headers) \ + $(cairo_wgl_headers) $(cairo_script_headers) \ + $(cairo_ft_headers) $(cairo_fc_headers) $(cairo_ps_headers) \ + $(cairo_pdf_headers) $(cairo_svg_headers) \ + $(cairo_image_headers) $(cairo_mime_headers) \ + $(cairo_recording_headers) $(cairo_observer_headers) \ + $(cairo_tee_headers) $(cairo_xml_headers) \ + $(cairo_user_headers) $(cairo_gobject_headers) +all_cairo_private = $(cairo_private) $(cairo_xlib_private) \ + $(cairo_xlib_xrender_private) $(cairo_xcb_private) \ + $(cairo_xlib_xcb_private) $(cairo_xcb_shm_private) \ + $(cairo_qt_private) $(cairo_quartz_private) \ + $(cairo_quartz_font_private) $(cairo_quartz_image_private) \ + $(cairo_win32_private) $(cairo_win32_font_private) \ + $(cairo_skia_private) $(cairo_os2_private) \ + $(cairo_beos_private) $(cairo_drm_private) \ + $(cairo_gallium_private) $(cairo_png_private) \ + $(cairo_gl_private) $(cairo_glesv2_private) \ + $(cairo_cogl_private) $(cairo_directfb_private) \ + $(cairo_vg_private) $(cairo_egl_private) $(cairo_glx_private) \ + $(cairo_wgl_private) $(cairo_script_private) \ + $(cairo_ft_private) $(cairo_fc_private) $(cairo_ps_private) \ + $(cairo_pdf_private) $(cairo_svg_private) \ + $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) \ + $(cairo_image_private) $(cairo_mime_private) \ + $(cairo_recording_private) $(cairo_observer_private) \ + $(cairo_tee_private) $(cairo_xml_private) \ + $(cairo_user_private) $(cairo_pthread_private) \ + $(cairo_pthread_headers) $(cairo_gobject_private) \ + $(cairo_trace_private) $(cairo_trace_headers) \ + $(cairo_interpreter_private) $(cairo_interpreter_headers) \ + $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +all_cairo_cxx_sources = $(cairo_cxx_sources) $(cairo_xlib_cxx_sources) \ + $(cairo_xlib_xrender_cxx_sources) $(cairo_xcb_cxx_sources) \ + $(cairo_xlib_xcb_cxx_sources) $(cairo_xcb_shm_cxx_sources) \ + $(cairo_qt_cxx_sources) $(cairo_quartz_cxx_sources) \ + $(cairo_quartz_font_cxx_sources) \ + $(cairo_quartz_image_cxx_sources) $(cairo_win32_cxx_sources) \ + $(cairo_win32_font_cxx_sources) $(cairo_skia_cxx_sources) \ + $(cairo_os2_cxx_sources) $(cairo_beos_cxx_sources) \ + $(cairo_drm_cxx_sources) $(cairo_gallium_cxx_sources) \ + $(cairo_png_cxx_sources) $(cairo_gl_cxx_sources) \ + $(cairo_glesv2_cxx_sources) $(cairo_cogl_cxx_sources) \ + $(cairo_directfb_cxx_sources) $(cairo_vg_cxx_sources) \ + $(cairo_egl_cxx_sources) $(cairo_glx_cxx_sources) \ + $(cairo_wgl_cxx_sources) $(cairo_script_cxx_sources) \ + $(cairo_ft_cxx_sources) $(cairo_fc_cxx_sources) \ + $(cairo_ps_cxx_sources) $(cairo_pdf_cxx_sources) \ + $(cairo_svg_cxx_sources) $(cairo_test_surfaces_cxx_sources) \ + $(cairo_image_cxx_sources) $(cairo_mime_cxx_sources) \ + $(cairo_recording_cxx_sources) $(cairo_observer_cxx_sources) \ + $(cairo_tee_cxx_sources) $(cairo_xml_cxx_sources) \ + $(cairo_user_cxx_sources) $(cairo_pthread_cxx_sources) \ + $(cairo_gobject_cxx_sources) $(cairo_trace_cxx_sources) \ + $(cairo_interpreter_cxx_sources) \ + $(cairo_symbol_lookup_cxx_sources) +all_cairo_sources = $(cairo_sources) $(cairo_xlib_sources) \ + $(cairo_xlib_xrender_sources) $(cairo_xcb_sources) \ + $(cairo_xlib_xcb_sources) $(cairo_xcb_shm_sources) \ + $(cairo_qt_sources) $(cairo_quartz_sources) \ + $(cairo_quartz_font_sources) $(cairo_quartz_image_sources) \ + $(cairo_win32_sources) $(cairo_win32_font_sources) \ + $(cairo_skia_sources) $(cairo_os2_sources) \ + $(cairo_beos_sources) $(cairo_drm_sources) \ + $(cairo_gallium_sources) $(cairo_png_sources) \ + $(cairo_gl_sources) $(cairo_glesv2_sources) \ + $(cairo_cogl_sources) $(cairo_directfb_sources) \ + $(cairo_vg_sources) $(cairo_egl_sources) $(cairo_glx_sources) \ + $(cairo_wgl_sources) $(cairo_script_sources) \ + $(cairo_ft_sources) $(cairo_fc_sources) $(cairo_ps_sources) \ + $(cairo_pdf_sources) $(cairo_svg_sources) \ + $(cairo_test_surfaces_sources) $(cairo_image_sources) \ + $(cairo_mime_sources) $(cairo_recording_sources) \ + $(cairo_observer_sources) $(cairo_tee_sources) \ + $(cairo_xml_sources) $(cairo_user_sources) \ + $(cairo_pthread_sources) $(cairo_gobject_sources) \ + $(cairo_trace_sources) $(cairo_interpreter_sources) \ + $(cairo_symbol_lookup_sources) +enabled_cairo_headers = $(cairo_headers) $(am__append_1) \ + $(am__append_6) $(am__append_11) $(am__append_16) \ + $(am__append_21) $(am__append_26) $(am__append_31) \ + $(am__append_36) $(am__append_41) $(am__append_46) \ + $(am__append_51) $(am__append_56) $(am__append_61) \ + $(am__append_66) $(am__append_71) $(am__append_76) \ + $(am__append_81) $(am__append_86) $(am__append_91) \ + $(am__append_96) $(am__append_101) $(am__append_106) \ + $(am__append_111) $(am__append_116) $(am__append_121) \ + $(am__append_126) $(am__append_131) $(am__append_136) \ + $(am__append_141) $(am__append_146) $(am__append_151) \ + $(cairo_image_headers) $(cairo_mime_headers) \ + $(cairo_recording_headers) $(cairo_observer_headers) \ + $(am__append_159) $(am__append_164) $(cairo_user_headers) \ + $(am__append_172) +enabled_cairo_private = $(cairo_private) $(am__append_2) \ + $(am__append_7) $(am__append_12) $(am__append_17) \ + $(am__append_22) $(am__append_27) $(am__append_32) \ + $(am__append_37) $(am__append_42) $(am__append_47) \ + $(am__append_52) $(am__append_57) $(am__append_62) \ + $(am__append_67) $(am__append_72) $(am__append_77) \ + $(am__append_82) $(am__append_87) $(am__append_92) \ + $(am__append_97) $(am__append_102) $(am__append_107) \ + $(am__append_112) $(am__append_117) $(am__append_122) \ + $(am__append_127) $(am__append_132) $(am__append_137) \ + $(am__append_142) $(am__append_147) $(am__append_152) \ + $(am__append_156) $(cairo_image_private) $(cairo_mime_private) \ + $(cairo_recording_private) $(cairo_observer_private) \ + $(am__append_160) $(am__append_165) $(cairo_user_private) \ + $(am__append_169) $(am__append_173) $(am__append_177) \ + $(am__append_180) $(am__append_183) +enabled_cairo_cxx_sources = $(cairo_cxx_sources) $(am__append_3) \ + $(am__append_8) $(am__append_13) $(am__append_18) \ + $(am__append_23) $(am__append_28) $(am__append_33) \ + $(am__append_38) $(am__append_43) $(am__append_48) \ + $(am__append_53) $(am__append_58) $(am__append_63) \ + $(am__append_68) $(am__append_73) $(am__append_78) \ + $(am__append_83) $(am__append_88) $(am__append_93) \ + $(am__append_98) $(am__append_103) $(am__append_108) \ + $(am__append_113) $(am__append_118) $(am__append_123) \ + $(am__append_128) $(am__append_133) $(am__append_138) \ + $(am__append_143) $(am__append_148) $(am__append_153) \ + $(am__append_157) $(cairo_image_cxx_sources) \ + $(cairo_mime_cxx_sources) $(cairo_recording_cxx_sources) \ + $(cairo_observer_cxx_sources) $(am__append_161) \ + $(am__append_166) $(cairo_user_cxx_sources) $(am__append_170) \ + $(am__append_174) $(am__append_178) $(am__append_181) \ + $(am__append_184) +enabled_cairo_sources = $(cairo_sources) $(am__append_4) \ + $(am__append_9) $(am__append_14) $(am__append_19) \ + $(am__append_24) $(am__append_29) $(am__append_34) \ + $(am__append_39) $(am__append_44) $(am__append_49) \ + $(am__append_54) $(am__append_59) $(am__append_64) \ + $(am__append_69) $(am__append_74) $(am__append_79) \ + $(am__append_84) $(am__append_89) $(am__append_94) \ + $(am__append_99) $(am__append_104) $(am__append_109) \ + $(am__append_114) $(am__append_119) $(am__append_124) \ + $(am__append_129) $(am__append_134) $(am__append_139) \ + $(am__append_144) $(am__append_149) $(am__append_154) \ + $(am__append_158) $(cairo_image_sources) $(cairo_mime_sources) \ + $(cairo_recording_sources) $(cairo_observer_sources) \ + $(am__append_162) $(am__append_167) $(cairo_user_sources) \ + $(am__append_171) $(am__append_175) $(am__append_179) \ + $(am__append_182) $(am__append_185) +all_cairo_pkgconf = cairo.pc cairo-xlib.pc cairo-xlib-xrender.pc \ + cairo-xcb.pc cairo-xlib-xcb.pc cairo-xcb-shm.pc cairo-qt.pc \ + cairo-quartz.pc cairo-quartz-font.pc cairo-quartz-image.pc \ + cairo-win32.pc cairo-win32-font.pc cairo-skia.pc cairo-os2.pc \ + cairo-beos.pc cairo-drm.pc cairo-gallium.pc cairo-png.pc \ + cairo-gl.pc cairo-glesv2.pc cairo-cogl.pc cairo-directfb.pc \ + cairo-vg.pc cairo-egl.pc cairo-glx.pc cairo-wgl.pc \ + cairo-script.pc cairo-ft.pc cairo-fc.pc cairo-ps.pc \ + cairo-pdf.pc cairo-svg.pc cairo-tee.pc cairo-xml.pc \ + cairo-gobject.pc +enabled_cairo_pkgconf = cairo.pc $(am__append_5) $(am__append_10) \ + $(am__append_15) $(am__append_20) $(am__append_25) \ + $(am__append_30) $(am__append_35) $(am__append_40) \ + $(am__append_45) $(am__append_50) $(am__append_55) \ + $(am__append_60) $(am__append_65) $(am__append_70) \ + $(am__append_75) $(am__append_80) $(am__append_85) \ + $(am__append_90) $(am__append_95) $(am__append_100) \ + $(am__append_105) $(am__append_110) $(am__append_115) \ + $(am__append_120) $(am__append_125) $(am__append_130) \ + $(am__append_135) $(am__append_140) $(am__append_145) \ + $(am__append_150) $(am__append_155) $(am__append_163) \ + $(am__append_168) $(am__append_176) +#MAINTAINERCLEANFILES += $(srcdir)/Makefile.win32.features +AM_CPPFLAGS = -I$(srcdir) $(CAIRO_CFLAGS) +AM_LDFLAGS = $(CAIRO_LDFLAGS) +@OS_WIN32_TRUE@export_symbols = -export-symbols cairo.def +@OS_WIN32_TRUE@cairo_def_dependency = cairo.def +cairoincludedir = $(includedir)/cairo + +# Special headers +cairoinclude_HEADERS = $(enabled_cairo_headers) \ + $(top_srcdir)/cairo-version.h +lib_LTLIBRARIES = libcairo.la +@BUILD_CXX_FALSE@cairo_cxx_lib = +@BUILD_CXX_TRUE@cairo_cxx_lib = libcairo_cxx.la +noinst_LTLIBRARIES = $(cairo_cxx_lib) +libcairo_cxx_la_SOURCES = \ + $(enabled_cairo_headers) \ + $(enabled_cairo_private) \ + $(enabled_cairo_cxx_sources) \ + $(NULL) + +libcairo_cxx_la_LDFLAGS = $(AM_LDFLAGS) $(export_symbols) +libcairo_cxx_la_LIBADD = $(CAIRO_LIBS) +libcairo_cxx_la_DEPENDENCIES = $(cairo_def_dependency) +libcairo_la_SOURCES = $(enabled_cairo_headers) \ + $(enabled_cairo_private) $(enabled_cairo_sources) $(NULL) \ + cairo-version.h +libcairo_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(CAIRO_LIBTOOL_VERSION_INFO) -no-undefined $(export_symbols) +libcairo_la_LIBADD = $(CAIRO_LIBS) \ + $(cairo_cxx_lib) + +libcairo_la_DEPENDENCIES = $(cairo_def_dependency) $(cairo_cxx_lib) +nodist_cairoinclude_HEADERS = cairo-features.h +nodist_libcairo_la_SOURCES = cairo-features.h +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = $(enabled_cairo_pkgconf) +TESTS_ENVIRONMENT = \ + srcdir="$(srcdir)" \ + MAKE="$(MAKE) $(AM_MAKEFLAGS)" \ + all_cairo_files="$(all_cairo_files)" \ + all_cairo_headers="$(all_cairo_headers)" \ + all_cairo_private="$(all_cairo_private)" \ + all_cairo_sources="$(all_cairo_sources)" \ + enabled_cairo_headers="$(enabled_cairo_headers)" \ + enabled_cairo_private="$(enabled_cairo_private)" \ + enabled_cairo_sources="$(enabled_cairo_sources)" \ + $(NULL) + +TESTS_SH = \ + check-def.sh \ + check-doc-syntax.sh \ + check-headers.sh \ + check-plt.sh \ + check-preprocessor-syntax.sh \ + $(NULL) + +check_link_LDADD = libcairo.la +PREPROCESS_ARGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) +COMPILE_ARGS = $(PREPROCESS_ARGS) $(AM_CFLAGS) $(CFLAGS) +SPARSE = sparse +SPLINT = splint -badflag +UNO = uno +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .i .lo .log .o .obj .s .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(srcdir)/Makefile.am.features $(top_srcdir)/src/Makefile.sources $(srcdir)/Makefile.am.analysis $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(srcdir)/Makefile.am.features $(top_srcdir)/src/Makefile.sources $(srcdir)/Makefile.am.analysis: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +cairo.pc: $(top_builddir)/config.status $(srcdir)/cairo.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-xlib.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-xlib-xrender.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-xcb.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-xlib-xcb.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-xcb-shm.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-qt.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-quartz.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-quartz-font.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-quartz-image.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-win32.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-win32-font.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-skia.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-os2.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-beos.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-drm.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-gallium.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-png.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-gl.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-glesv2.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-cogl.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-directfb.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-vg.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-egl.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-glx.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-wgl.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-script.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-ft.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-fc.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-ps.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-pdf.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-svg.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-tee.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-xml.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +cairo-gobject.pc: $(top_builddir)/config.status $(srcdir)/cairo-features.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libcairo.la: $(libcairo_la_OBJECTS) $(libcairo_la_DEPENDENCIES) $(EXTRA_libcairo_la_DEPENDENCIES) + $(AM_V_CCLD)$(libcairo_la_LINK) -rpath $(libdir) $(libcairo_la_OBJECTS) $(libcairo_la_LIBADD) $(LIBS) + +libcairo_cxx.la: $(libcairo_cxx_la_OBJECTS) $(libcairo_cxx_la_DEPENDENCIES) $(EXTRA_libcairo_cxx_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libcairo_cxx_la_LINK) $(am_libcairo_cxx_la_rpath) $(libcairo_cxx_la_OBJECTS) $(libcairo_cxx_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +check-link$(EXEEXT): $(check_link_OBJECTS) $(check_link_DEPENDENCIES) $(EXTRA_check_link_DEPENDENCIES) + @rm -f check-link$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(check_link_OBJECTS) $(check_link_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-analysis-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-arc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-array.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-atomic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-base64-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-base85-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-bentley-ottmann-rectangular.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-bentley-ottmann-rectilinear.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-bentley-ottmann.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-beos-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-botor-scan-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boxes-intersect.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-boxes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-cache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-cff-subset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-clip-boxes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-clip-polygon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-clip-region.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-clip-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-clip-tor-scan-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-clip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-cogl-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-cogl-gradient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-cogl-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-cogl-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-color.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-composite-rectangles.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-contour.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-damage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-default-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-deflate-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-device.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-directfb-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-bo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-gallium-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i915-glyphs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i915-shader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i915-spans.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i915-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i965-glyphs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i965-shader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i965-spans.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-i965-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-intel-brw-eu-emit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-intel-brw-eu-util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-intel-brw-eu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-intel-debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-intel-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-intel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-radeon-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-radeon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-drm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-egl-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-error.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-fallback-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-fixed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-font-face-twin-data.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-font-face-twin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-font-face.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-font-options.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-freed-pool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-freelist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-ft-font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-composite.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-device.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-dispatch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-glyphs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-gradient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-msaa-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-operand.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-shaders.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-source.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-spans-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gl-traps-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-glx-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-gstate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-hash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-hull.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-image-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-image-info.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-image-source.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-image-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-line.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-lzw.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-mask-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-matrix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-mempool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-mesh-pattern-rasterizer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-mono-scan-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-mutex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-no-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-observer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-os2-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-output-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-paginated-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-bounds.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-fill.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-fixed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-in-fill.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-stroke-boxes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-stroke-polygon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-stroke-traps.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-stroke-tristrip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path-stroke.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-path.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-pattern.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-pdf-operators.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-pdf-shading.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-pdf-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-pen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-png.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-polygon-intersect.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-polygon-reduce.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-polygon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-ps-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-qt-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-quartz-font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-quartz-image-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-quartz-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-raster-source-pattern.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-recording-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-rectangle.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-rectangular-scan-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-region.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-rtree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-scaled-font-subsets.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-scaled-font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-script-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-shape-mask-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-skia-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-skia-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-slope.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-spans-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-spans.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-spline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-stroke-dash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-stroke-style.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-clipper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-fallback.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-observer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-offset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-snapshot.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-subsurface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface-wrapper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-svg-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-tee-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-time.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-tor-scan-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-tor22-scan-converter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-toy-font-face.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-traps-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-traps.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-tristrip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-truetype-subset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-type1-fallback.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-type1-glyph-names.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-type1-subset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-type3-glyph-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-unicode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-user-font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-version.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-vg-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-wgl-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-wideint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-device.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-display-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-font.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-gdi-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-printing-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-win32-system.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-connection-core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-connection-render.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-connection-shm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-connection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-resources.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-screen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-shm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-surface-core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-surface-render.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xcb-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-core-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-display.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-fallback-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-render-compositor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-screen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-source.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-surface-shm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-visual.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xlib-xcb-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo-xml-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-link.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-base-compositor-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-compositor-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-null-compositor-surface.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-paginated-surface.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +cairo-win32-debug.lo: win32/cairo-win32-debug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-debug.lo -MD -MP -MF $(DEPDIR)/cairo-win32-debug.Tpo -c -o cairo-win32-debug.lo `test -f 'win32/cairo-win32-debug.c' || echo '$(srcdir)/'`win32/cairo-win32-debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-debug.Tpo $(DEPDIR)/cairo-win32-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-debug.c' object='cairo-win32-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-debug.lo `test -f 'win32/cairo-win32-debug.c' || echo '$(srcdir)/'`win32/cairo-win32-debug.c + +cairo-win32-device.lo: win32/cairo-win32-device.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-device.lo -MD -MP -MF $(DEPDIR)/cairo-win32-device.Tpo -c -o cairo-win32-device.lo `test -f 'win32/cairo-win32-device.c' || echo '$(srcdir)/'`win32/cairo-win32-device.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-device.Tpo $(DEPDIR)/cairo-win32-device.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-device.c' object='cairo-win32-device.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-device.lo `test -f 'win32/cairo-win32-device.c' || echo '$(srcdir)/'`win32/cairo-win32-device.c + +cairo-win32-gdi-compositor.lo: win32/cairo-win32-gdi-compositor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-gdi-compositor.lo -MD -MP -MF $(DEPDIR)/cairo-win32-gdi-compositor.Tpo -c -o cairo-win32-gdi-compositor.lo `test -f 'win32/cairo-win32-gdi-compositor.c' || echo '$(srcdir)/'`win32/cairo-win32-gdi-compositor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-gdi-compositor.Tpo $(DEPDIR)/cairo-win32-gdi-compositor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-gdi-compositor.c' object='cairo-win32-gdi-compositor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-gdi-compositor.lo `test -f 'win32/cairo-win32-gdi-compositor.c' || echo '$(srcdir)/'`win32/cairo-win32-gdi-compositor.c + +cairo-win32-system.lo: win32/cairo-win32-system.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-system.lo -MD -MP -MF $(DEPDIR)/cairo-win32-system.Tpo -c -o cairo-win32-system.lo `test -f 'win32/cairo-win32-system.c' || echo '$(srcdir)/'`win32/cairo-win32-system.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-system.Tpo $(DEPDIR)/cairo-win32-system.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-system.c' object='cairo-win32-system.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-system.lo `test -f 'win32/cairo-win32-system.c' || echo '$(srcdir)/'`win32/cairo-win32-system.c + +cairo-win32-surface.lo: win32/cairo-win32-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-surface.lo -MD -MP -MF $(DEPDIR)/cairo-win32-surface.Tpo -c -o cairo-win32-surface.lo `test -f 'win32/cairo-win32-surface.c' || echo '$(srcdir)/'`win32/cairo-win32-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-surface.Tpo $(DEPDIR)/cairo-win32-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-surface.c' object='cairo-win32-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-surface.lo `test -f 'win32/cairo-win32-surface.c' || echo '$(srcdir)/'`win32/cairo-win32-surface.c + +cairo-win32-display-surface.lo: win32/cairo-win32-display-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-display-surface.lo -MD -MP -MF $(DEPDIR)/cairo-win32-display-surface.Tpo -c -o cairo-win32-display-surface.lo `test -f 'win32/cairo-win32-display-surface.c' || echo '$(srcdir)/'`win32/cairo-win32-display-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-display-surface.Tpo $(DEPDIR)/cairo-win32-display-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-display-surface.c' object='cairo-win32-display-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-display-surface.lo `test -f 'win32/cairo-win32-display-surface.c' || echo '$(srcdir)/'`win32/cairo-win32-display-surface.c + +cairo-win32-printing-surface.lo: win32/cairo-win32-printing-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-printing-surface.lo -MD -MP -MF $(DEPDIR)/cairo-win32-printing-surface.Tpo -c -o cairo-win32-printing-surface.lo `test -f 'win32/cairo-win32-printing-surface.c' || echo '$(srcdir)/'`win32/cairo-win32-printing-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-printing-surface.Tpo $(DEPDIR)/cairo-win32-printing-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-printing-surface.c' object='cairo-win32-printing-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-printing-surface.lo `test -f 'win32/cairo-win32-printing-surface.c' || echo '$(srcdir)/'`win32/cairo-win32-printing-surface.c + +cairo-win32-font.lo: win32/cairo-win32-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-win32-font.lo -MD -MP -MF $(DEPDIR)/cairo-win32-font.Tpo -c -o cairo-win32-font.lo `test -f 'win32/cairo-win32-font.c' || echo '$(srcdir)/'`win32/cairo-win32-font.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-win32-font.Tpo $(DEPDIR)/cairo-win32-font.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='win32/cairo-win32-font.c' object='cairo-win32-font.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-win32-font.lo `test -f 'win32/cairo-win32-font.c' || echo '$(srcdir)/'`win32/cairo-win32-font.c + +cairo-drm.lo: drm/cairo-drm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm.lo -MD -MP -MF $(DEPDIR)/cairo-drm.Tpo -c -o cairo-drm.lo `test -f 'drm/cairo-drm.c' || echo '$(srcdir)/'`drm/cairo-drm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm.Tpo $(DEPDIR)/cairo-drm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm.c' object='cairo-drm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm.lo `test -f 'drm/cairo-drm.c' || echo '$(srcdir)/'`drm/cairo-drm.c + +cairo-drm-bo.lo: drm/cairo-drm-bo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-bo.lo -MD -MP -MF $(DEPDIR)/cairo-drm-bo.Tpo -c -o cairo-drm-bo.lo `test -f 'drm/cairo-drm-bo.c' || echo '$(srcdir)/'`drm/cairo-drm-bo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-bo.Tpo $(DEPDIR)/cairo-drm-bo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-bo.c' object='cairo-drm-bo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-bo.lo `test -f 'drm/cairo-drm-bo.c' || echo '$(srcdir)/'`drm/cairo-drm-bo.c + +cairo-drm-surface.lo: drm/cairo-drm-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-surface.lo -MD -MP -MF $(DEPDIR)/cairo-drm-surface.Tpo -c -o cairo-drm-surface.lo `test -f 'drm/cairo-drm-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-surface.Tpo $(DEPDIR)/cairo-drm-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-surface.c' object='cairo-drm-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-surface.lo `test -f 'drm/cairo-drm-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-surface.c + +cairo-drm-intel.lo: drm/cairo-drm-intel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-intel.lo -MD -MP -MF $(DEPDIR)/cairo-drm-intel.Tpo -c -o cairo-drm-intel.lo `test -f 'drm/cairo-drm-intel.c' || echo '$(srcdir)/'`drm/cairo-drm-intel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-intel.Tpo $(DEPDIR)/cairo-drm-intel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-intel.c' object='cairo-drm-intel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-intel.lo `test -f 'drm/cairo-drm-intel.c' || echo '$(srcdir)/'`drm/cairo-drm-intel.c + +cairo-drm-intel-debug.lo: drm/cairo-drm-intel-debug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-intel-debug.lo -MD -MP -MF $(DEPDIR)/cairo-drm-intel-debug.Tpo -c -o cairo-drm-intel-debug.lo `test -f 'drm/cairo-drm-intel-debug.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-debug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-intel-debug.Tpo $(DEPDIR)/cairo-drm-intel-debug.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-intel-debug.c' object='cairo-drm-intel-debug.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-intel-debug.lo `test -f 'drm/cairo-drm-intel-debug.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-debug.c + +cairo-drm-intel-surface.lo: drm/cairo-drm-intel-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-intel-surface.lo -MD -MP -MF $(DEPDIR)/cairo-drm-intel-surface.Tpo -c -o cairo-drm-intel-surface.lo `test -f 'drm/cairo-drm-intel-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-intel-surface.Tpo $(DEPDIR)/cairo-drm-intel-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-intel-surface.c' object='cairo-drm-intel-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-intel-surface.lo `test -f 'drm/cairo-drm-intel-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-surface.c + +cairo-drm-i915-surface.lo: drm/cairo-drm-i915-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i915-surface.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i915-surface.Tpo -c -o cairo-drm-i915-surface.lo `test -f 'drm/cairo-drm-i915-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i915-surface.Tpo $(DEPDIR)/cairo-drm-i915-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i915-surface.c' object='cairo-drm-i915-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i915-surface.lo `test -f 'drm/cairo-drm-i915-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-surface.c + +cairo-drm-i915-glyphs.lo: drm/cairo-drm-i915-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i915-glyphs.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i915-glyphs.Tpo -c -o cairo-drm-i915-glyphs.lo `test -f 'drm/cairo-drm-i915-glyphs.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i915-glyphs.Tpo $(DEPDIR)/cairo-drm-i915-glyphs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i915-glyphs.c' object='cairo-drm-i915-glyphs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i915-glyphs.lo `test -f 'drm/cairo-drm-i915-glyphs.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-glyphs.c + +cairo-drm-i915-shader.lo: drm/cairo-drm-i915-shader.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i915-shader.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i915-shader.Tpo -c -o cairo-drm-i915-shader.lo `test -f 'drm/cairo-drm-i915-shader.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-shader.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i915-shader.Tpo $(DEPDIR)/cairo-drm-i915-shader.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i915-shader.c' object='cairo-drm-i915-shader.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i915-shader.lo `test -f 'drm/cairo-drm-i915-shader.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-shader.c + +cairo-drm-i915-spans.lo: drm/cairo-drm-i915-spans.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i915-spans.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i915-spans.Tpo -c -o cairo-drm-i915-spans.lo `test -f 'drm/cairo-drm-i915-spans.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-spans.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i915-spans.Tpo $(DEPDIR)/cairo-drm-i915-spans.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i915-spans.c' object='cairo-drm-i915-spans.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i915-spans.lo `test -f 'drm/cairo-drm-i915-spans.c' || echo '$(srcdir)/'`drm/cairo-drm-i915-spans.c + +cairo-drm-i965-surface.lo: drm/cairo-drm-i965-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i965-surface.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i965-surface.Tpo -c -o cairo-drm-i965-surface.lo `test -f 'drm/cairo-drm-i965-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i965-surface.Tpo $(DEPDIR)/cairo-drm-i965-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i965-surface.c' object='cairo-drm-i965-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i965-surface.lo `test -f 'drm/cairo-drm-i965-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-surface.c + +cairo-drm-i965-glyphs.lo: drm/cairo-drm-i965-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i965-glyphs.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i965-glyphs.Tpo -c -o cairo-drm-i965-glyphs.lo `test -f 'drm/cairo-drm-i965-glyphs.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i965-glyphs.Tpo $(DEPDIR)/cairo-drm-i965-glyphs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i965-glyphs.c' object='cairo-drm-i965-glyphs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i965-glyphs.lo `test -f 'drm/cairo-drm-i965-glyphs.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-glyphs.c + +cairo-drm-i965-shader.lo: drm/cairo-drm-i965-shader.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i965-shader.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i965-shader.Tpo -c -o cairo-drm-i965-shader.lo `test -f 'drm/cairo-drm-i965-shader.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-shader.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i965-shader.Tpo $(DEPDIR)/cairo-drm-i965-shader.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i965-shader.c' object='cairo-drm-i965-shader.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i965-shader.lo `test -f 'drm/cairo-drm-i965-shader.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-shader.c + +cairo-drm-i965-spans.lo: drm/cairo-drm-i965-spans.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-i965-spans.lo -MD -MP -MF $(DEPDIR)/cairo-drm-i965-spans.Tpo -c -o cairo-drm-i965-spans.lo `test -f 'drm/cairo-drm-i965-spans.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-spans.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-i965-spans.Tpo $(DEPDIR)/cairo-drm-i965-spans.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-i965-spans.c' object='cairo-drm-i965-spans.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-i965-spans.lo `test -f 'drm/cairo-drm-i965-spans.c' || echo '$(srcdir)/'`drm/cairo-drm-i965-spans.c + +cairo-drm-intel-brw-eu.lo: drm/cairo-drm-intel-brw-eu.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-intel-brw-eu.lo -MD -MP -MF $(DEPDIR)/cairo-drm-intel-brw-eu.Tpo -c -o cairo-drm-intel-brw-eu.lo `test -f 'drm/cairo-drm-intel-brw-eu.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-brw-eu.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-intel-brw-eu.Tpo $(DEPDIR)/cairo-drm-intel-brw-eu.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-intel-brw-eu.c' object='cairo-drm-intel-brw-eu.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-intel-brw-eu.lo `test -f 'drm/cairo-drm-intel-brw-eu.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-brw-eu.c + +cairo-drm-intel-brw-eu-emit.lo: drm/cairo-drm-intel-brw-eu-emit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-intel-brw-eu-emit.lo -MD -MP -MF $(DEPDIR)/cairo-drm-intel-brw-eu-emit.Tpo -c -o cairo-drm-intel-brw-eu-emit.lo `test -f 'drm/cairo-drm-intel-brw-eu-emit.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-brw-eu-emit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-intel-brw-eu-emit.Tpo $(DEPDIR)/cairo-drm-intel-brw-eu-emit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-intel-brw-eu-emit.c' object='cairo-drm-intel-brw-eu-emit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-intel-brw-eu-emit.lo `test -f 'drm/cairo-drm-intel-brw-eu-emit.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-brw-eu-emit.c + +cairo-drm-intel-brw-eu-util.lo: drm/cairo-drm-intel-brw-eu-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-intel-brw-eu-util.lo -MD -MP -MF $(DEPDIR)/cairo-drm-intel-brw-eu-util.Tpo -c -o cairo-drm-intel-brw-eu-util.lo `test -f 'drm/cairo-drm-intel-brw-eu-util.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-brw-eu-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-intel-brw-eu-util.Tpo $(DEPDIR)/cairo-drm-intel-brw-eu-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-intel-brw-eu-util.c' object='cairo-drm-intel-brw-eu-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-intel-brw-eu-util.lo `test -f 'drm/cairo-drm-intel-brw-eu-util.c' || echo '$(srcdir)/'`drm/cairo-drm-intel-brw-eu-util.c + +cairo-drm-radeon.lo: drm/cairo-drm-radeon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-radeon.lo -MD -MP -MF $(DEPDIR)/cairo-drm-radeon.Tpo -c -o cairo-drm-radeon.lo `test -f 'drm/cairo-drm-radeon.c' || echo '$(srcdir)/'`drm/cairo-drm-radeon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-radeon.Tpo $(DEPDIR)/cairo-drm-radeon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-radeon.c' object='cairo-drm-radeon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-radeon.lo `test -f 'drm/cairo-drm-radeon.c' || echo '$(srcdir)/'`drm/cairo-drm-radeon.c + +cairo-drm-radeon-surface.lo: drm/cairo-drm-radeon-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-radeon-surface.lo -MD -MP -MF $(DEPDIR)/cairo-drm-radeon-surface.Tpo -c -o cairo-drm-radeon-surface.lo `test -f 'drm/cairo-drm-radeon-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-radeon-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-radeon-surface.Tpo $(DEPDIR)/cairo-drm-radeon-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-radeon-surface.c' object='cairo-drm-radeon-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-radeon-surface.lo `test -f 'drm/cairo-drm-radeon-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-radeon-surface.c + +cairo-drm-gallium-surface.lo: drm/cairo-drm-gallium-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cairo-drm-gallium-surface.lo -MD -MP -MF $(DEPDIR)/cairo-drm-gallium-surface.Tpo -c -o cairo-drm-gallium-surface.lo `test -f 'drm/cairo-drm-gallium-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-gallium-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-drm-gallium-surface.Tpo $(DEPDIR)/cairo-drm-gallium-surface.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drm/cairo-drm-gallium-surface.c' object='cairo-drm-gallium-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cairo-drm-gallium-surface.lo `test -f 'drm/cairo-drm-gallium-surface.c' || echo '$(srcdir)/'`drm/cairo-drm-gallium-surface.c + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +cairo-skia-context.lo: skia/cairo-skia-context.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cairo-skia-context.lo -MD -MP -MF $(DEPDIR)/cairo-skia-context.Tpo -c -o cairo-skia-context.lo `test -f 'skia/cairo-skia-context.cpp' || echo '$(srcdir)/'`skia/cairo-skia-context.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-skia-context.Tpo $(DEPDIR)/cairo-skia-context.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='skia/cairo-skia-context.cpp' object='cairo-skia-context.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cairo-skia-context.lo `test -f 'skia/cairo-skia-context.cpp' || echo '$(srcdir)/'`skia/cairo-skia-context.cpp + +cairo-skia-surface.lo: skia/cairo-skia-surface.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cairo-skia-surface.lo -MD -MP -MF $(DEPDIR)/cairo-skia-surface.Tpo -c -o cairo-skia-surface.lo `test -f 'skia/cairo-skia-surface.cpp' || echo '$(srcdir)/'`skia/cairo-skia-surface.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo-skia-surface.Tpo $(DEPDIR)/cairo-skia-surface.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='skia/cairo-skia-surface.cpp' object='cairo-skia-surface.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cairo-skia-surface.lo `test -f 'skia/cairo-skia-surface.cpp' || echo '$(srcdir)/'`skia/cairo-skia-surface.cpp + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-cairoincludeHEADERS: $(cairoinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairoincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairoincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(cairoincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(cairoincludedir)" || exit $$?; \ + done + +uninstall-cairoincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(cairoincludedir)'; $(am__uninstall_files_from_dir) +install-nodist_cairoincludeHEADERS: $(nodist_cairoinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairoincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairoincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(cairoincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(cairoincludedir)" || exit $$?; \ + done + +uninstall-nodist_cairoincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(cairoincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-def.sh.log: check-def.sh + @p='check-def.sh'; \ + b='check-def.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-doc-syntax.sh.log: check-doc-syntax.sh + @p='check-doc-syntax.sh'; \ + b='check-doc-syntax.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-headers.sh.log: check-headers.sh + @p='check-headers.sh'; \ + b='check-headers.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-plt.sh.log: check-plt.sh + @p='check-plt.sh'; \ + b='check-plt.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-preprocessor-syntax.sh.log: check-preprocessor-syntax.sh + @p='check-preprocessor-syntax.sh'; \ + b='check-preprocessor-syntax.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-link.log: check-link$(EXEEXT) + @p='check-link$(EXEEXT)'; \ + b='check-link'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(cairoincludedir)" "$(DESTDIR)$(cairoincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-cairoincludeHEADERS \ + install-nodist_cairoincludeHEADERS install-pkgconfigDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-cairoincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-nodist_cairoincludeHEADERS uninstall-pkgconfigDATA + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am \ + install-cairoincludeHEADERS install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man \ + install-nodist_cairoincludeHEADERS install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-cairoincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-nodist_cairoincludeHEADERS uninstall-pkgconfigDATA + + +$(top_builddir)/config.h: $(top_srcdir)/config.h.in + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h +cairo-features.h cairo-supported-features.h: + cd $(top_builddir) && ./config.status src/$@ +cairo.def: cairo-features.h $(enabled_cairo_headers) + @echo Generating $@ + @(echo EXPORTS; \ + (cd $(srcdir); cat $(enabled_cairo_headers) || echo 'cairo_ERROR ()' ) | \ + $(EGREP) -v '^# *include' | \ + ( cat cairo-features.h - | $(CPP) -D__cplusplus - || echo 'cairo_ERROR ()' ) | \ + $(EGREP) '^cairo_.* \(' | \ + sed -e 's/[ ].*//' | \ + sort; \ + echo LIBRARY libcairo-$(CAIRO_VERSION_SONUM).dll; \ + ) >$@ + @ ! grep -q cairo_ERROR $@ || ($(RM) $@; false) + +check: headers-standalone + +# The pre-processed result is used by check-{def,plt}.sh to determine whether +# cairo has been compiled with symbol hiding. +.c.i: $(cairoinclude_HEADERS) $(nodist_cairoinclude_HEADERS) cairoint.h $(top_builddir)/config.h + $(CPP) $(PREPROCESS_ARGS) $< -o $@ +.c.s: $(cairoinclude_HEADERS) $(nodist_cairoinclude_HEADERS) cairoint.h $(top_builddir)/config.h + $(CC) $(COMPILE_ARGS) $< -S -o $@ +sparse: + @echo Checking enabled sources with sparse checker + @status=true; for f in $(enabled_cairo_sources) $(enabled_cairo_cxx_sources); do \ + echo $(SPARSE) $(PREPROCESS_ARGS) $(srcdir)/$$f; \ + $(SPARSE) $(PREPROCESS_ARGS) $(srcdir)/$$f || status=false; \ + done; $$status +splint: + @echo Checking enabled sources with splint checker + @status=true; for f in $(enabled_cairo_sources) $(enabled_cairo_cxx_sources); do \ + echo $(SPLINT) $(PREPROCESS_ARGS) $(srcdir)/$$f; \ + $(SPLINT) $(PREPROCESS_ARGS) $(srcdir)/$$f || status=false; \ + done; $$status +uno: + @echo Checking enabled sources with uno checker + cd $(srcdir); $(UNO) $(PREPROCESS_ARGS) -DHAVE_CONFIG_H -U__GNUC__ $(enabled_cairo_sources) + +headers-standalone: $(enabled_cairo_headers) $(enabled_cairo_private) + @echo Checking that enabled public/private headers can be compiled standalone + @status=true; for f in $(enabled_cairo_headers) $(enabled_cairo_private); do \ + echo " CHECK $$f"; \ + echo "#include \"$(srcdir)/$$f\"" > headers-standalone-tmp.c; \ + echo "int main(int argc, char * argv[]) { return 0; }" >> headers-standalone-tmp.c; \ + $(COMPILE) -o headers-standalone-tmp headers-standalone-tmp.c || status=false; \ + $(RM) headers-standalone-tmp headers-standalone-tmp.c; \ + done; $$status + @touch $@ + +analysis: all headers-standalone sparse splint uno + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/Makefile.sources b/src/Makefile.sources new file mode 100644 index 000000000..fac24d79d --- /dev/null +++ b/src/Makefile.sources @@ -0,0 +1,472 @@ +# Makefile.sources +# +# This file is the canonical location listing all the source files used +# to build the cairo library. Every source file is categorized as one of: +# +# * public header file +# * private header file (must end in -private.h except for cairoint.h) +# * source code file +# +# Every source file should be specified exactly once, grouped with the +# feature that uses the source file. If more than one feature use the +# file (like pdf_operators or font_subset files), the files should be +# appended to to the base cairo files, and the code inside them +# enabled/disabled using C preprocessor macros defined in cairoint.h. +# See how pdf_operators or font_subset are handled. +# +# The sources are picked up according to the configured features +# by the generated file Makefile.am.features or Makefile.win32.features. +# +# These are a few special source files. Those are not included in this +# file to not confuse build systems. Each build system must handle them +# separately. These files include: +# +# * cairo-features.h: +# This file is generated by configure and includes macros signifying +# which features are enabled. This file should be installed like +# other public headers, but should NOT be distributed in the cairo +# distribution. +# +# * cairo-version.h: +# This is a dummy header file used during the build, but it should +# NOT be installed. Its sole purpose is to make sure changes in the +# cairo version do not trigger a full rebuild of the library, but +# just the functions actually using the version information. +# +# * $(top_srcdir)/cairo-version.h: +# This is the real file holding the cairo version number. This file +# should be installed like other public headers. This is used during +# the build by cairo-version.c only. +# +# * cairo-supported-features.h: +# This file is generated by configure and includes macros signifying +# all supported features. This is used by gtk-doc to generate +# documentation for all those macros, enabled or not. +# This file is NOT used during the build of the library and should +# NOT be installed or distributed. +# +# Please follow the strict syntax of this file, including keeping file +# lists sorted. +# + +cairo_headers = cairo.h cairo-deprecated.h +cairo_private = \ + cairoint.h \ + cairo-analysis-surface-private.h \ + cairo-arc-private.h \ + cairo-array-private.h \ + cairo-atomic-private.h \ + cairo-backend-private.h \ + cairo-box-inline.h \ + cairo-boxes-private.h \ + cairo-cache-private.h \ + cairo-clip-inline.h \ + cairo-clip-private.h \ + cairo-combsort-inline.h \ + cairo-compiler-private.h \ + cairo-compositor-private.h \ + cairo-contour-inline.h \ + cairo-contour-private.h \ + cairo-composite-rectangles-private.h \ + cairo-damage-private.h \ + cairo-default-context-private.h \ + cairo-device-private.h \ + cairo-error-inline.h \ + cairo-error-private.h \ + cairo-fixed-private.h \ + cairo-fixed-type-private.h \ + cairo-freelist-private.h \ + cairo-freelist-type-private.h \ + cairo-freed-pool-private.h \ + cairo-fontconfig-private.h \ + cairo-gstate-private.h \ + cairo-hash-private.h \ + cairo-image-info-private.h \ + cairo-image-surface-inline.h \ + cairo-image-surface-private.h \ + cairo-line-inline.h \ + cairo-line-private.h \ + cairo-list-inline.h \ + cairo-list-private.h \ + cairo-malloc-private.h \ + cairo-mempool-private.h \ + cairo-mutex-impl-private.h \ + cairo-mutex-list-private.h \ + cairo-mutex-private.h \ + cairo-mutex-type-private.h \ + cairo-output-stream-private.h \ + cairo-paginated-private.h \ + cairo-paginated-surface-private.h \ + cairo-path-fixed-private.h \ + cairo-path-private.h \ + cairo-pattern-inline.h \ + cairo-pattern-private.h \ + cairo-pixman-private.h \ + cairo-private.h \ + cairo-recording-surface-inline.h \ + cairo-recording-surface-private.h \ + cairo-reference-count-private.h \ + cairo-region-private.h \ + cairo-rtree-private.h \ + cairo-scaled-font-private.h \ + cairo-slope-private.h \ + cairo-spans-private.h \ + cairo-spans-compositor-private.h \ + cairo-stroke-dash-private.h \ + cairo-surface-inline.h \ + cairo-surface-private.h \ + cairo-surface-backend-private.h \ + cairo-surface-clipper-private.h \ + cairo-surface-fallback-private.h \ + cairo-surface-observer-inline.h \ + cairo-surface-observer-private.h \ + cairo-surface-offset-private.h \ + cairo-surface-subsurface-inline.h \ + cairo-surface-subsurface-private.h \ + cairo-surface-snapshot-inline.h \ + cairo-surface-snapshot-private.h \ + cairo-surface-wrapper-private.h \ + cairo-time-private.h \ + cairo-types-private.h \ + cairo-traps-private.h \ + cairo-tristrip-private.h \ + cairo-user-font-private.h \ + cairo-wideint-private.h \ + cairo-wideint-type-private.h \ + $(NULL) +cairo_sources = \ + cairo-analysis-surface.c \ + cairo-arc.c \ + cairo-array.c \ + cairo-atomic.c \ + cairo-base64-stream.c \ + cairo-base85-stream.c \ + cairo-bentley-ottmann.c \ + cairo-bentley-ottmann-rectangular.c \ + cairo-bentley-ottmann-rectilinear.c \ + cairo-botor-scan-converter.c \ + cairo-boxes.c \ + cairo-boxes-intersect.c \ + cairo.c \ + cairo-cache.c \ + cairo-clip.c \ + cairo-clip-boxes.c \ + cairo-clip-polygon.c \ + cairo-clip-region.c \ + cairo-clip-surface.c \ + cairo-color.c \ + cairo-composite-rectangles.c \ + cairo-compositor.c \ + cairo-contour.c \ + cairo-damage.c \ + cairo-debug.c \ + cairo-default-context.c \ + cairo-device.c \ + cairo-error.c \ + cairo-fallback-compositor.c \ + cairo-fixed.c \ + cairo-font-face.c \ + cairo-font-face-twin.c \ + cairo-font-face-twin-data.c \ + cairo-font-options.c \ + cairo-freelist.c \ + cairo-freed-pool.c \ + cairo-gstate.c \ + cairo-hash.c \ + cairo-hull.c \ + cairo-image-compositor.c \ + cairo-image-info.c \ + cairo-image-source.c \ + cairo-image-surface.c \ + cairo-line.c \ + cairo-lzw.c \ + cairo-matrix.c \ + cairo-mask-compositor.c \ + cairo-mesh-pattern-rasterizer.c \ + cairo-mempool.c \ + cairo-misc.c \ + cairo-mono-scan-converter.c \ + cairo-mutex.c \ + cairo-no-compositor.c \ + cairo-observer.c \ + cairo-output-stream.c \ + cairo-paginated-surface.c \ + cairo-path-bounds.c \ + cairo-path.c \ + cairo-path-fill.c \ + cairo-path-fixed.c \ + cairo-path-in-fill.c \ + cairo-path-stroke.c \ + cairo-path-stroke-boxes.c \ + cairo-path-stroke-polygon.c \ + cairo-path-stroke-traps.c \ + cairo-path-stroke-tristrip.c \ + cairo-pattern.c \ + cairo-pen.c \ + cairo-polygon.c \ + cairo-polygon-intersect.c \ + cairo-polygon-reduce.c \ + cairo-raster-source-pattern.c \ + cairo-recording-surface.c \ + cairo-rectangle.c \ + cairo-rectangular-scan-converter.c \ + cairo-region.c \ + cairo-rtree.c \ + cairo-scaled-font.c \ + cairo-shape-mask-compositor.c \ + cairo-slope.c \ + cairo-spans.c \ + cairo-spans-compositor.c \ + cairo-spline.c \ + cairo-stroke-dash.c \ + cairo-stroke-style.c \ + cairo-surface.c \ + cairo-surface-clipper.c \ + cairo-surface-fallback.c \ + cairo-surface-observer.c \ + cairo-surface-offset.c \ + cairo-surface-snapshot.c \ + cairo-surface-subsurface.c \ + cairo-surface-wrapper.c \ + cairo-time.c \ + cairo-tor-scan-converter.c \ + cairo-tor22-scan-converter.c \ + cairo-clip-tor-scan-converter.c \ + cairo-toy-font-face.c \ + cairo-traps.c \ + cairo-tristrip.c \ + cairo-traps-compositor.c \ + cairo-unicode.c \ + cairo-user-font.c \ + cairo-version.c \ + cairo-wideint.c \ + $(NULL) + +_cairo_font_subset_private = \ + cairo-scaled-font-subsets-private.h \ + cairo-truetype-subset-private.h \ + cairo-type1-private.h \ + cairo-type3-glyph-surface-private.h \ + $(NULL) +_cairo_font_subset_sources = \ + cairo-cff-subset.c \ + cairo-scaled-font-subsets.c \ + cairo-truetype-subset.c \ + cairo-type1-fallback.c \ + cairo-type1-glyph-names.c \ + cairo-type1-subset.c \ + cairo-type3-glyph-surface.c \ + $(NULL) +cairo_private += $(_cairo_font_subset_private) +cairo_sources += $(_cairo_font_subset_sources) + +cairo_egl_sources = +cairo_glx_sources = +cairo_wgl_sources = + +_cairo_pdf_operators_private = cairo-pdf-operators-private.h cairo-pdf-shading-private.h +_cairo_pdf_operators_sources = cairo-pdf-operators.c cairo-pdf-shading.c +cairo_private += $(_cairo_pdf_operators_private) +cairo_sources += $(_cairo_pdf_operators_sources) + +cairo_png_sources = cairo-png.c + +cairo_ps_headers = cairo-ps.h +cairo_ps_private = cairo-ps-surface-private.h +cairo_ps_sources = cairo-ps-surface.c + +_cairo_deflate_stream_sources = cairo-deflate-stream.c +cairo_sources += $(_cairo_deflate_stream_sources) + +cairo_pdf_headers = cairo-pdf.h +cairo_pdf_private = cairo-pdf-surface-private.h +cairo_pdf_sources = cairo-pdf-surface.c + +cairo_svg_headers = cairo-svg.h +cairo_svg_private = cairo-svg-surface-private.h +cairo_svg_sources = cairo-svg-surface.c + +cairo_ft_headers = cairo-ft.h +cairo_ft_private = cairo-ft-private.h +cairo_ft_sources = cairo-ft-font.c + +# These are private, even though they look like public headers +cairo_test_surfaces_private = \ + test-compositor-surface.h \ + test-compositor-surface-private.h \ + test-null-compositor-surface.h \ + test-paginated-surface.h \ + $(NULL) +cairo_test_surfaces_sources = \ + test-compositor-surface.c \ + test-null-compositor-surface.c \ + test-base-compositor-surface.c \ + test-paginated-surface.c \ + $(NULL) + +cairo_xlib_headers = cairo-xlib.h +cairo_xlib_private = \ + cairo-xlib-private.h \ + cairo-xlib-surface-private.h \ + cairo-xlib-xrender-private.h \ + $(NULL) +cairo_xlib_sources = \ + cairo-xlib-display.c \ + cairo-xlib-core-compositor.c \ + cairo-xlib-fallback-compositor.c \ + cairo-xlib-render-compositor.c \ + cairo-xlib-screen.c \ + cairo-xlib-source.c \ + cairo-xlib-surface.c \ + cairo-xlib-surface-shm.c \ + cairo-xlib-visual.c \ + cairo-xlib-xcb-surface.c \ + $(NULL) + +cairo_xlib_xrender_headers = cairo-xlib-xrender.h + +cairo_xcb_headers = cairo-xcb.h +cairo_xcb_private = cairo-xcb-private.h +cairo_xcb_sources = \ + cairo-xcb-connection.c \ + cairo-xcb-connection-core.c \ + cairo-xcb-connection-render.c \ + cairo-xcb-connection-shm.c \ + cairo-xcb-screen.c \ + cairo-xcb-shm.c \ + cairo-xcb-surface.c \ + cairo-xcb-surface-core.c \ + cairo-xcb-surface-render.c \ + cairo-xcb-resources.c \ + $(NULL) + +cairo_qt_headers = cairo-qt.h +cairo_qt_cxx_sources = cairo-qt-surface.cpp + +cairo_quartz_headers = cairo-quartz.h +cairo_quartz_private = cairo-quartz-private.h +cairo_quartz_sources = cairo-quartz-surface.c + +cairo_quartz_image_headers = cairo-quartz-image.h +cairo_quartz_image_sources = cairo-quartz-image-surface.c + +cairo_quartz_font_sources = cairo-quartz-font.c + +cairo_win32_headers = cairo-win32.h +cairo_win32_private = win32/cairo-win32-private.h +cairo_win32_sources = \ + win32/cairo-win32-debug.c \ + win32/cairo-win32-device.c \ + win32/cairo-win32-gdi-compositor.c \ + win32/cairo-win32-system.c \ + win32/cairo-win32-surface.c \ + win32/cairo-win32-display-surface.c \ + win32/cairo-win32-printing-surface.c \ + $(NULL) +cairo_win32_font_sources = \ + win32/cairo-win32-font.c \ + $(NULL) + +cairo_skia_headers = cairo-skia.h +cairo_skia_private = skia/cairo-skia-private.h +cairo_skia_cxx_sources = \ + skia/cairo-skia-context.cpp \ + skia/cairo-skia-surface.cpp \ + $(NULL) + +cairo_os2_headers = cairo-os2.h +cairo_os2_private = cairo-os2-private.h +cairo_os2_sources = cairo-os2-surface.c + +# automake is stupid enough to always use c++ linker if we enable the +# following lines, even if beos surface is not enabled. Disable it for now. +cairo_beos_headers = cairo-beos.h +cairo_beos_cxx_sources = cairo-beos-surface.cpp + +cairo_gl_headers = cairo-gl.h +cairo_gl_private = cairo-gl-private.h \ + cairo-gl-dispatch-private.h \ + cairo-gl-ext-def-private.h \ + cairo-gl-gradient-private.h + +cairo_gl_sources = cairo-gl-composite.c \ + cairo-gl-device.c \ + cairo-gl-dispatch.c \ + cairo-gl-glyphs.c \ + cairo-gl-gradient.c \ + cairo-gl-info.c \ + cairo-gl-operand.c \ + cairo-gl-shaders.c \ + cairo-gl-msaa-compositor.c \ + cairo-gl-spans-compositor.c \ + cairo-gl-traps-compositor.c \ + cairo-gl-source.c \ + cairo-gl-surface.c + +cairo_glesv2_headers = $(cairo_gl_headers) +cairo_glesv2_private = $(cairo_gl_private) +cairo_glesv2_sources = $(cairo_gl_sources) + +cairo_egl_sources += cairo-egl-context.c +cairo_glx_sources += cairo-glx-context.c +cairo_wgl_sources += cairo-wgl-context.c + +cairo_directfb_headers = cairo-directfb.h +cairo_directfb_sources = cairo-directfb-surface.c + +cairo_drm_headers = cairo-drm.h +cairo_drm_private = drm/cairo-drm-private.h \ + drm/cairo-drm-ioctl-private.h \ + drm/cairo-drm-intel-private.h \ + drm/cairo-drm-intel-brw-defines.h \ + drm/cairo-drm-intel-brw-structs.h \ + drm/cairo-drm-intel-brw-eu.h \ + drm/cairo-drm-intel-command-private.h \ + drm/cairo-drm-intel-ioctl-private.h \ + drm/cairo-drm-i915-private.h \ + drm/cairo-drm-i965-private.h \ + drm/cairo-drm-radeon-private.h +cairo_drm_sources = drm/cairo-drm.c \ + drm/cairo-drm-bo.c \ + drm/cairo-drm-surface.c \ + drm/cairo-drm-intel.c \ + drm/cairo-drm-intel-debug.c \ + drm/cairo-drm-intel-surface.c \ + drm/cairo-drm-i915-surface.c \ + drm/cairo-drm-i915-glyphs.c \ + drm/cairo-drm-i915-shader.c \ + drm/cairo-drm-i915-spans.c \ + drm/cairo-drm-i965-surface.c \ + drm/cairo-drm-i965-glyphs.c \ + drm/cairo-drm-i965-shader.c \ + drm/cairo-drm-i965-spans.c \ + drm/cairo-drm-intel-brw-eu.c \ + drm/cairo-drm-intel-brw-eu-emit.c \ + drm/cairo-drm-intel-brw-eu-util.c \ + drm/cairo-drm-radeon.c \ + drm/cairo-drm-radeon-surface.c +cairo_gallium_sources = drm/cairo-drm-gallium-surface.c + +cairo_script_headers = cairo-script.h +cairo_script_private = cairo-script-private.h +cairo_script_sources = cairo-script-surface.c + +cairo_tee_headers = cairo-tee.h +cairo_tee_private = cairo-tee-surface-private.h +cairo_tee_sources = cairo-tee-surface.c + +cairo_xml_headers = cairo-xml.h +cairo_xml_sources = cairo-xml-surface.c + +cairo_vg_headers = cairo-vg.h +cairo_vg_sources = cairo-vg-surface.c + +cairo_cogl_headers = cairo-cogl.h +cairo_cogl_private = cairo-cogl-private.h \ + cairo-cogl-gradient-private.h \ + cairo-cogl-context-private.h \ + cairo-cogl-utils-private.h +cairo_cogl_sources = cairo-cogl-surface.c \ + cairo-cogl-gradient.c \ + cairo-cogl-context.c \ + cairo-cogl-utils.c diff --git a/src/Makefile.win32 b/src/Makefile.win32 new file mode 100644 index 000000000..864791f37 --- /dev/null +++ b/src/Makefile.win32 @@ -0,0 +1,29 @@ +top_srcdir = .. +include $(top_srcdir)/build/Makefile.win32.common +include Makefile.win32.features + +SOURCES = $(enabled_cairo_sources) + +STATIC_SOURCES = cairo-system.c + +OBJECTS = $(patsubst %.c, $(CFG)/%.obj, $(SOURCES)) +OBJECTS_STATIC = $(patsubst %cairo-system.obj, %cairo-system-static.obj, $(OBJECTS)) + +static: inform $(CFG)/cairo-static.lib +dynamic: inform $(CFG)/cairo.dll + +$(CFG)/cairo.dll: $(OBJECTS) + @$(LD) $(CAIRO_LDFLAGS) -DLL -OUT:$@ $(CAIRO_LIBS) $(PIXMAN_LIBS) $(OBJECTS) + +$(CFG)/cairo-static.lib: $(OBJECTS_STATIC) + @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(PIXMAN_LIBS) $(OBJECTS_STATIC) + +all: inform $(CFG)/cairo.dll $(CFG)/cairo-static.lib + @echo "Built successfully!" + @echo "You should copy the following files to a proper place now:" + @echo "" + @echo " cairo-version.h (NOTE: toplevel, not the src/cairo-version.h one!)" + @echo " src/cairo-features.h" + @for x in $(enabled_cairo_headers); do echo " src/$$x"; done + @echo " src/$(CFG)/cairo.dll" + @echo " src/$(CFG)/cairo-static.lib" diff --git a/src/Makefile.win32.features b/src/Makefile.win32.features new file mode 100644 index 000000000..2274f4ad6 --- /dev/null +++ b/src/Makefile.win32.features @@ -0,0 +1,661 @@ +# Generated by configure. Do not edit. + +ifeq ($(top_srcdir),) +include Makefile.sources +else +include $(top_srcdir)/src/Makefile.sources +endif + +supported_cairo_headers = $(cairo_headers) +unsupported_cairo_headers = +all_cairo_headers = $(cairo_headers) +all_cairo_private = $(cairo_private) +all_cairo_cxx_sources = $(cairo_cxx_sources) +all_cairo_sources = $(cairo_sources) + +enabled_cairo_headers = $(cairo_headers) +enabled_cairo_private = $(cairo_private) +enabled_cairo_cxx_sources = $(cairo_cxx_sources) +enabled_cairo_sources = $(cairo_sources) + +all_cairo_pkgconf = cairo.pc +enabled_cairo_pkgconf = cairo.pc + +supported_cairo_headers += $(cairo_xlib_headers) +all_cairo_headers += $(cairo_xlib_headers) +all_cairo_private += $(cairo_xlib_private) +all_cairo_cxx_sources += $(cairo_xlib_cxx_sources) +all_cairo_sources += $(cairo_xlib_sources) +ifeq ($(CAIRO_HAS_XLIB_SURFACE),1) +enabled_cairo_headers += $(cairo_xlib_headers) +enabled_cairo_private += $(cairo_xlib_private) +enabled_cairo_cxx_sources += $(cairo_xlib_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_sources) +endif +all_cairo_pkgconf += cairo-xlib.pc +ifeq ($(CAIRO_HAS_XLIB_SURFACE),1) +enabled_cairo_pkgconf += cairo-xlib.pc +endif + +supported_cairo_headers += $(cairo_xlib_xrender_headers) +all_cairo_headers += $(cairo_xlib_xrender_headers) +all_cairo_private += $(cairo_xlib_xrender_private) +all_cairo_cxx_sources += $(cairo_xlib_xrender_cxx_sources) +all_cairo_sources += $(cairo_xlib_xrender_sources) +ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1) +enabled_cairo_headers += $(cairo_xlib_xrender_headers) +enabled_cairo_private += $(cairo_xlib_xrender_private) +enabled_cairo_cxx_sources += $(cairo_xlib_xrender_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_xrender_sources) +endif +all_cairo_pkgconf += cairo-xlib-xrender.pc +ifeq ($(CAIRO_HAS_XLIB_XRENDER_SURFACE),1) +enabled_cairo_pkgconf += cairo-xlib-xrender.pc +endif + +supported_cairo_headers += $(cairo_xcb_headers) +all_cairo_headers += $(cairo_xcb_headers) +all_cairo_private += $(cairo_xcb_private) +all_cairo_cxx_sources += $(cairo_xcb_cxx_sources) +all_cairo_sources += $(cairo_xcb_sources) +ifeq ($(CAIRO_HAS_XCB_SURFACE),1) +enabled_cairo_headers += $(cairo_xcb_headers) +enabled_cairo_private += $(cairo_xcb_private) +enabled_cairo_cxx_sources += $(cairo_xcb_cxx_sources) +enabled_cairo_sources += $(cairo_xcb_sources) +endif +all_cairo_pkgconf += cairo-xcb.pc +ifeq ($(CAIRO_HAS_XCB_SURFACE),1) +enabled_cairo_pkgconf += cairo-xcb.pc +endif + +unsupported_cairo_headers += $(cairo_xlib_xcb_headers) +all_cairo_headers += $(cairo_xlib_xcb_headers) +all_cairo_private += $(cairo_xlib_xcb_private) +all_cairo_cxx_sources += $(cairo_xlib_xcb_cxx_sources) +all_cairo_sources += $(cairo_xlib_xcb_sources) +ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_xlib_xcb_headers) +enabled_cairo_private += $(cairo_xlib_xcb_private) +enabled_cairo_cxx_sources += $(cairo_xlib_xcb_cxx_sources) +enabled_cairo_sources += $(cairo_xlib_xcb_sources) +endif +all_cairo_pkgconf += cairo-xlib-xcb.pc +ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-xlib-xcb.pc +endif + +supported_cairo_headers += $(cairo_xcb_shm_headers) +all_cairo_headers += $(cairo_xcb_shm_headers) +all_cairo_private += $(cairo_xcb_shm_private) +all_cairo_cxx_sources += $(cairo_xcb_shm_cxx_sources) +all_cairo_sources += $(cairo_xcb_shm_sources) +ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_xcb_shm_headers) +enabled_cairo_private += $(cairo_xcb_shm_private) +enabled_cairo_cxx_sources += $(cairo_xcb_shm_cxx_sources) +enabled_cairo_sources += $(cairo_xcb_shm_sources) +endif +all_cairo_pkgconf += cairo-xcb-shm.pc +ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-xcb-shm.pc +endif + +unsupported_cairo_headers += $(cairo_qt_headers) +all_cairo_headers += $(cairo_qt_headers) +all_cairo_private += $(cairo_qt_private) +all_cairo_cxx_sources += $(cairo_qt_cxx_sources) +all_cairo_sources += $(cairo_qt_sources) +ifeq ($(CAIRO_HAS_QT_SURFACE),1) +enabled_cairo_headers += $(cairo_qt_headers) +enabled_cairo_private += $(cairo_qt_private) +enabled_cairo_cxx_sources += $(cairo_qt_cxx_sources) +enabled_cairo_sources += $(cairo_qt_sources) +endif +all_cairo_pkgconf += cairo-qt.pc +ifeq ($(CAIRO_HAS_QT_SURFACE),1) +enabled_cairo_pkgconf += cairo-qt.pc +endif + +supported_cairo_headers += $(cairo_quartz_headers) +all_cairo_headers += $(cairo_quartz_headers) +all_cairo_private += $(cairo_quartz_private) +all_cairo_cxx_sources += $(cairo_quartz_cxx_sources) +all_cairo_sources += $(cairo_quartz_sources) +ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1) +enabled_cairo_headers += $(cairo_quartz_headers) +enabled_cairo_private += $(cairo_quartz_private) +enabled_cairo_cxx_sources += $(cairo_quartz_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_sources) +endif +all_cairo_pkgconf += cairo-quartz.pc +ifeq ($(CAIRO_HAS_QUARTZ_SURFACE),1) +enabled_cairo_pkgconf += cairo-quartz.pc +endif + +supported_cairo_headers += $(cairo_quartz_font_headers) +all_cairo_headers += $(cairo_quartz_font_headers) +all_cairo_private += $(cairo_quartz_font_private) +all_cairo_cxx_sources += $(cairo_quartz_font_cxx_sources) +all_cairo_sources += $(cairo_quartz_font_sources) +ifeq ($(CAIRO_HAS_QUARTZ_FONT),1) +enabled_cairo_headers += $(cairo_quartz_font_headers) +enabled_cairo_private += $(cairo_quartz_font_private) +enabled_cairo_cxx_sources += $(cairo_quartz_font_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_font_sources) +endif +all_cairo_pkgconf += cairo-quartz-font.pc +ifeq ($(CAIRO_HAS_QUARTZ_FONT),1) +enabled_cairo_pkgconf += cairo-quartz-font.pc +endif + +unsupported_cairo_headers += $(cairo_quartz_image_headers) +all_cairo_headers += $(cairo_quartz_image_headers) +all_cairo_private += $(cairo_quartz_image_private) +all_cairo_cxx_sources += $(cairo_quartz_image_cxx_sources) +all_cairo_sources += $(cairo_quartz_image_sources) +ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1) +enabled_cairo_headers += $(cairo_quartz_image_headers) +enabled_cairo_private += $(cairo_quartz_image_private) +enabled_cairo_cxx_sources += $(cairo_quartz_image_cxx_sources) +enabled_cairo_sources += $(cairo_quartz_image_sources) +endif +all_cairo_pkgconf += cairo-quartz-image.pc +ifeq ($(CAIRO_HAS_QUARTZ_IMAGE_SURFACE),1) +enabled_cairo_pkgconf += cairo-quartz-image.pc +endif + +supported_cairo_headers += $(cairo_win32_headers) +all_cairo_headers += $(cairo_win32_headers) +all_cairo_private += $(cairo_win32_private) +all_cairo_cxx_sources += $(cairo_win32_cxx_sources) +all_cairo_sources += $(cairo_win32_sources) +ifeq ($(CAIRO_HAS_WIN32_SURFACE),1) +enabled_cairo_headers += $(cairo_win32_headers) +enabled_cairo_private += $(cairo_win32_private) +enabled_cairo_cxx_sources += $(cairo_win32_cxx_sources) +enabled_cairo_sources += $(cairo_win32_sources) +endif +all_cairo_pkgconf += cairo-win32.pc +ifeq ($(CAIRO_HAS_WIN32_SURFACE),1) +enabled_cairo_pkgconf += cairo-win32.pc +endif + +supported_cairo_headers += $(cairo_win32_font_headers) +all_cairo_headers += $(cairo_win32_font_headers) +all_cairo_private += $(cairo_win32_font_private) +all_cairo_cxx_sources += $(cairo_win32_font_cxx_sources) +all_cairo_sources += $(cairo_win32_font_sources) +ifeq ($(CAIRO_HAS_WIN32_FONT),1) +enabled_cairo_headers += $(cairo_win32_font_headers) +enabled_cairo_private += $(cairo_win32_font_private) +enabled_cairo_cxx_sources += $(cairo_win32_font_cxx_sources) +enabled_cairo_sources += $(cairo_win32_font_sources) +endif +all_cairo_pkgconf += cairo-win32-font.pc +ifeq ($(CAIRO_HAS_WIN32_FONT),1) +enabled_cairo_pkgconf += cairo-win32-font.pc +endif + +unsupported_cairo_headers += $(cairo_skia_headers) +all_cairo_headers += $(cairo_skia_headers) +all_cairo_private += $(cairo_skia_private) +all_cairo_cxx_sources += $(cairo_skia_cxx_sources) +all_cairo_sources += $(cairo_skia_sources) +ifeq ($(CAIRO_HAS_SKIA_SURFACE),1) +enabled_cairo_headers += $(cairo_skia_headers) +enabled_cairo_private += $(cairo_skia_private) +enabled_cairo_cxx_sources += $(cairo_skia_cxx_sources) +enabled_cairo_sources += $(cairo_skia_sources) +endif +all_cairo_pkgconf += cairo-skia.pc +ifeq ($(CAIRO_HAS_SKIA_SURFACE),1) +enabled_cairo_pkgconf += cairo-skia.pc +endif + +unsupported_cairo_headers += $(cairo_os2_headers) +all_cairo_headers += $(cairo_os2_headers) +all_cairo_private += $(cairo_os2_private) +all_cairo_cxx_sources += $(cairo_os2_cxx_sources) +all_cairo_sources += $(cairo_os2_sources) +ifeq ($(CAIRO_HAS_OS2_SURFACE),1) +enabled_cairo_headers += $(cairo_os2_headers) +enabled_cairo_private += $(cairo_os2_private) +enabled_cairo_cxx_sources += $(cairo_os2_cxx_sources) +enabled_cairo_sources += $(cairo_os2_sources) +endif +all_cairo_pkgconf += cairo-os2.pc +ifeq ($(CAIRO_HAS_OS2_SURFACE),1) +enabled_cairo_pkgconf += cairo-os2.pc +endif + +unsupported_cairo_headers += $(cairo_beos_headers) +all_cairo_headers += $(cairo_beos_headers) +all_cairo_private += $(cairo_beos_private) +all_cairo_cxx_sources += $(cairo_beos_cxx_sources) +all_cairo_sources += $(cairo_beos_sources) +ifeq ($(CAIRO_HAS_BEOS_SURFACE),1) +enabled_cairo_headers += $(cairo_beos_headers) +enabled_cairo_private += $(cairo_beos_private) +enabled_cairo_cxx_sources += $(cairo_beos_cxx_sources) +enabled_cairo_sources += $(cairo_beos_sources) +endif +all_cairo_pkgconf += cairo-beos.pc +ifeq ($(CAIRO_HAS_BEOS_SURFACE),1) +enabled_cairo_pkgconf += cairo-beos.pc +endif + +unsupported_cairo_headers += $(cairo_drm_headers) +all_cairo_headers += $(cairo_drm_headers) +all_cairo_private += $(cairo_drm_private) +all_cairo_cxx_sources += $(cairo_drm_cxx_sources) +all_cairo_sources += $(cairo_drm_sources) +ifeq ($(CAIRO_HAS_DRM_SURFACE),1) +enabled_cairo_headers += $(cairo_drm_headers) +enabled_cairo_private += $(cairo_drm_private) +enabled_cairo_cxx_sources += $(cairo_drm_cxx_sources) +enabled_cairo_sources += $(cairo_drm_sources) +endif +all_cairo_pkgconf += cairo-drm.pc +ifeq ($(CAIRO_HAS_DRM_SURFACE),1) +enabled_cairo_pkgconf += cairo-drm.pc +endif + +unsupported_cairo_headers += $(cairo_gallium_headers) +all_cairo_headers += $(cairo_gallium_headers) +all_cairo_private += $(cairo_gallium_private) +all_cairo_cxx_sources += $(cairo_gallium_cxx_sources) +all_cairo_sources += $(cairo_gallium_sources) +ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1) +enabled_cairo_headers += $(cairo_gallium_headers) +enabled_cairo_private += $(cairo_gallium_private) +enabled_cairo_cxx_sources += $(cairo_gallium_cxx_sources) +enabled_cairo_sources += $(cairo_gallium_sources) +endif +all_cairo_pkgconf += cairo-gallium.pc +ifeq ($(CAIRO_HAS_GALLIUM_SURFACE),1) +enabled_cairo_pkgconf += cairo-gallium.pc +endif + +supported_cairo_headers += $(cairo_png_headers) +all_cairo_headers += $(cairo_png_headers) +all_cairo_private += $(cairo_png_private) +all_cairo_cxx_sources += $(cairo_png_cxx_sources) +all_cairo_sources += $(cairo_png_sources) +ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_png_headers) +enabled_cairo_private += $(cairo_png_private) +enabled_cairo_cxx_sources += $(cairo_png_cxx_sources) +enabled_cairo_sources += $(cairo_png_sources) +endif +all_cairo_pkgconf += cairo-png.pc +ifeq ($(CAIRO_HAS_PNG_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-png.pc +endif + +unsupported_cairo_headers += $(cairo_gl_headers) +all_cairo_headers += $(cairo_gl_headers) +all_cairo_private += $(cairo_gl_private) +all_cairo_cxx_sources += $(cairo_gl_cxx_sources) +all_cairo_sources += $(cairo_gl_sources) +ifeq ($(CAIRO_HAS_GL_SURFACE),1) +enabled_cairo_headers += $(cairo_gl_headers) +enabled_cairo_private += $(cairo_gl_private) +enabled_cairo_cxx_sources += $(cairo_gl_cxx_sources) +enabled_cairo_sources += $(cairo_gl_sources) +endif +all_cairo_pkgconf += cairo-gl.pc +ifeq ($(CAIRO_HAS_GL_SURFACE),1) +enabled_cairo_pkgconf += cairo-gl.pc +endif + +unsupported_cairo_headers += $(cairo_glesv2_headers) +all_cairo_headers += $(cairo_glesv2_headers) +all_cairo_private += $(cairo_glesv2_private) +all_cairo_cxx_sources += $(cairo_glesv2_cxx_sources) +all_cairo_sources += $(cairo_glesv2_sources) +ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1) +enabled_cairo_headers += $(cairo_glesv2_headers) +enabled_cairo_private += $(cairo_glesv2_private) +enabled_cairo_cxx_sources += $(cairo_glesv2_cxx_sources) +enabled_cairo_sources += $(cairo_glesv2_sources) +endif +all_cairo_pkgconf += cairo-glesv2.pc +ifeq ($(CAIRO_HAS_GLESV2_SURFACE),1) +enabled_cairo_pkgconf += cairo-glesv2.pc +endif + +unsupported_cairo_headers += $(cairo_cogl_headers) +all_cairo_headers += $(cairo_cogl_headers) +all_cairo_private += $(cairo_cogl_private) +all_cairo_cxx_sources += $(cairo_cogl_cxx_sources) +all_cairo_sources += $(cairo_cogl_sources) +ifeq ($(CAIRO_HAS_COGL_SURFACE),1) +enabled_cairo_headers += $(cairo_cogl_headers) +enabled_cairo_private += $(cairo_cogl_private) +enabled_cairo_cxx_sources += $(cairo_cogl_cxx_sources) +enabled_cairo_sources += $(cairo_cogl_sources) +endif +all_cairo_pkgconf += cairo-cogl.pc +ifeq ($(CAIRO_HAS_COGL_SURFACE),1) +enabled_cairo_pkgconf += cairo-cogl.pc +endif + +unsupported_cairo_headers += $(cairo_directfb_headers) +all_cairo_headers += $(cairo_directfb_headers) +all_cairo_private += $(cairo_directfb_private) +all_cairo_cxx_sources += $(cairo_directfb_cxx_sources) +all_cairo_sources += $(cairo_directfb_sources) +ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1) +enabled_cairo_headers += $(cairo_directfb_headers) +enabled_cairo_private += $(cairo_directfb_private) +enabled_cairo_cxx_sources += $(cairo_directfb_cxx_sources) +enabled_cairo_sources += $(cairo_directfb_sources) +endif +all_cairo_pkgconf += cairo-directfb.pc +ifeq ($(CAIRO_HAS_DIRECTFB_SURFACE),1) +enabled_cairo_pkgconf += cairo-directfb.pc +endif + +unsupported_cairo_headers += $(cairo_vg_headers) +all_cairo_headers += $(cairo_vg_headers) +all_cairo_private += $(cairo_vg_private) +all_cairo_cxx_sources += $(cairo_vg_cxx_sources) +all_cairo_sources += $(cairo_vg_sources) +ifeq ($(CAIRO_HAS_VG_SURFACE),1) +enabled_cairo_headers += $(cairo_vg_headers) +enabled_cairo_private += $(cairo_vg_private) +enabled_cairo_cxx_sources += $(cairo_vg_cxx_sources) +enabled_cairo_sources += $(cairo_vg_sources) +endif +all_cairo_pkgconf += cairo-vg.pc +ifeq ($(CAIRO_HAS_VG_SURFACE),1) +enabled_cairo_pkgconf += cairo-vg.pc +endif + +supported_cairo_headers += $(cairo_egl_headers) +all_cairo_headers += $(cairo_egl_headers) +all_cairo_private += $(cairo_egl_private) +all_cairo_cxx_sources += $(cairo_egl_cxx_sources) +all_cairo_sources += $(cairo_egl_sources) +ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_egl_headers) +enabled_cairo_private += $(cairo_egl_private) +enabled_cairo_cxx_sources += $(cairo_egl_cxx_sources) +enabled_cairo_sources += $(cairo_egl_sources) +endif +all_cairo_pkgconf += cairo-egl.pc +ifeq ($(CAIRO_HAS_EGL_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-egl.pc +endif + +supported_cairo_headers += $(cairo_glx_headers) +all_cairo_headers += $(cairo_glx_headers) +all_cairo_private += $(cairo_glx_private) +all_cairo_cxx_sources += $(cairo_glx_cxx_sources) +all_cairo_sources += $(cairo_glx_sources) +ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_glx_headers) +enabled_cairo_private += $(cairo_glx_private) +enabled_cairo_cxx_sources += $(cairo_glx_cxx_sources) +enabled_cairo_sources += $(cairo_glx_sources) +endif +all_cairo_pkgconf += cairo-glx.pc +ifeq ($(CAIRO_HAS_GLX_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-glx.pc +endif + +supported_cairo_headers += $(cairo_wgl_headers) +all_cairo_headers += $(cairo_wgl_headers) +all_cairo_private += $(cairo_wgl_private) +all_cairo_cxx_sources += $(cairo_wgl_cxx_sources) +all_cairo_sources += $(cairo_wgl_sources) +ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_wgl_headers) +enabled_cairo_private += $(cairo_wgl_private) +enabled_cairo_cxx_sources += $(cairo_wgl_cxx_sources) +enabled_cairo_sources += $(cairo_wgl_sources) +endif +all_cairo_pkgconf += cairo-wgl.pc +ifeq ($(CAIRO_HAS_WGL_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-wgl.pc +endif + +supported_cairo_headers += $(cairo_script_headers) +all_cairo_headers += $(cairo_script_headers) +all_cairo_private += $(cairo_script_private) +all_cairo_cxx_sources += $(cairo_script_cxx_sources) +all_cairo_sources += $(cairo_script_sources) +ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1) +enabled_cairo_headers += $(cairo_script_headers) +enabled_cairo_private += $(cairo_script_private) +enabled_cairo_cxx_sources += $(cairo_script_cxx_sources) +enabled_cairo_sources += $(cairo_script_sources) +endif +all_cairo_pkgconf += cairo-script.pc +ifeq ($(CAIRO_HAS_SCRIPT_SURFACE),1) +enabled_cairo_pkgconf += cairo-script.pc +endif + +supported_cairo_headers += $(cairo_ft_headers) +all_cairo_headers += $(cairo_ft_headers) +all_cairo_private += $(cairo_ft_private) +all_cairo_cxx_sources += $(cairo_ft_cxx_sources) +all_cairo_sources += $(cairo_ft_sources) +ifeq ($(CAIRO_HAS_FT_FONT),1) +enabled_cairo_headers += $(cairo_ft_headers) +enabled_cairo_private += $(cairo_ft_private) +enabled_cairo_cxx_sources += $(cairo_ft_cxx_sources) +enabled_cairo_sources += $(cairo_ft_sources) +endif +all_cairo_pkgconf += cairo-ft.pc +ifeq ($(CAIRO_HAS_FT_FONT),1) +enabled_cairo_pkgconf += cairo-ft.pc +endif + +supported_cairo_headers += $(cairo_fc_headers) +all_cairo_headers += $(cairo_fc_headers) +all_cairo_private += $(cairo_fc_private) +all_cairo_cxx_sources += $(cairo_fc_cxx_sources) +all_cairo_sources += $(cairo_fc_sources) +ifeq ($(CAIRO_HAS_FC_FONT),1) +enabled_cairo_headers += $(cairo_fc_headers) +enabled_cairo_private += $(cairo_fc_private) +enabled_cairo_cxx_sources += $(cairo_fc_cxx_sources) +enabled_cairo_sources += $(cairo_fc_sources) +endif +all_cairo_pkgconf += cairo-fc.pc +ifeq ($(CAIRO_HAS_FC_FONT),1) +enabled_cairo_pkgconf += cairo-fc.pc +endif + +supported_cairo_headers += $(cairo_ps_headers) +all_cairo_headers += $(cairo_ps_headers) +all_cairo_private += $(cairo_ps_private) +all_cairo_cxx_sources += $(cairo_ps_cxx_sources) +all_cairo_sources += $(cairo_ps_sources) +ifeq ($(CAIRO_HAS_PS_SURFACE),1) +enabled_cairo_headers += $(cairo_ps_headers) +enabled_cairo_private += $(cairo_ps_private) +enabled_cairo_cxx_sources += $(cairo_ps_cxx_sources) +enabled_cairo_sources += $(cairo_ps_sources) +endif +all_cairo_pkgconf += cairo-ps.pc +ifeq ($(CAIRO_HAS_PS_SURFACE),1) +enabled_cairo_pkgconf += cairo-ps.pc +endif + +supported_cairo_headers += $(cairo_pdf_headers) +all_cairo_headers += $(cairo_pdf_headers) +all_cairo_private += $(cairo_pdf_private) +all_cairo_cxx_sources += $(cairo_pdf_cxx_sources) +all_cairo_sources += $(cairo_pdf_sources) +ifeq ($(CAIRO_HAS_PDF_SURFACE),1) +enabled_cairo_headers += $(cairo_pdf_headers) +enabled_cairo_private += $(cairo_pdf_private) +enabled_cairo_cxx_sources += $(cairo_pdf_cxx_sources) +enabled_cairo_sources += $(cairo_pdf_sources) +endif +all_cairo_pkgconf += cairo-pdf.pc +ifeq ($(CAIRO_HAS_PDF_SURFACE),1) +enabled_cairo_pkgconf += cairo-pdf.pc +endif + +supported_cairo_headers += $(cairo_svg_headers) +all_cairo_headers += $(cairo_svg_headers) +all_cairo_private += $(cairo_svg_private) +all_cairo_cxx_sources += $(cairo_svg_cxx_sources) +all_cairo_sources += $(cairo_svg_sources) +ifeq ($(CAIRO_HAS_SVG_SURFACE),1) +enabled_cairo_headers += $(cairo_svg_headers) +enabled_cairo_private += $(cairo_svg_private) +enabled_cairo_cxx_sources += $(cairo_svg_cxx_sources) +enabled_cairo_sources += $(cairo_svg_sources) +endif +all_cairo_pkgconf += cairo-svg.pc +ifeq ($(CAIRO_HAS_SVG_SURFACE),1) +enabled_cairo_pkgconf += cairo-svg.pc +endif + +all_cairo_private += $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +all_cairo_cxx_sources += $(cairo_test_surfaces_cxx_sources) +all_cairo_sources += $(cairo_test_surfaces_sources) +ifeq ($(CAIRO_HAS_TEST_SURFACES),1) +enabled_cairo_private += $(cairo_test_surfaces_private) $(cairo_test_surfaces_headers) +enabled_cairo_cxx_sources += $(cairo_test_surfaces_cxx_sources) +enabled_cairo_sources += $(cairo_test_surfaces_sources) +endif + +supported_cairo_headers += $(cairo_image_headers) +all_cairo_headers += $(cairo_image_headers) +all_cairo_private += $(cairo_image_private) +all_cairo_cxx_sources += $(cairo_image_cxx_sources) +all_cairo_sources += $(cairo_image_sources) +enabled_cairo_headers += $(cairo_image_headers) +enabled_cairo_private += $(cairo_image_private) +enabled_cairo_cxx_sources += $(cairo_image_cxx_sources) +enabled_cairo_sources += $(cairo_image_sources) + +supported_cairo_headers += $(cairo_mime_headers) +all_cairo_headers += $(cairo_mime_headers) +all_cairo_private += $(cairo_mime_private) +all_cairo_cxx_sources += $(cairo_mime_cxx_sources) +all_cairo_sources += $(cairo_mime_sources) +enabled_cairo_headers += $(cairo_mime_headers) +enabled_cairo_private += $(cairo_mime_private) +enabled_cairo_cxx_sources += $(cairo_mime_cxx_sources) +enabled_cairo_sources += $(cairo_mime_sources) + +supported_cairo_headers += $(cairo_recording_headers) +all_cairo_headers += $(cairo_recording_headers) +all_cairo_private += $(cairo_recording_private) +all_cairo_cxx_sources += $(cairo_recording_cxx_sources) +all_cairo_sources += $(cairo_recording_sources) +enabled_cairo_headers += $(cairo_recording_headers) +enabled_cairo_private += $(cairo_recording_private) +enabled_cairo_cxx_sources += $(cairo_recording_cxx_sources) +enabled_cairo_sources += $(cairo_recording_sources) + +supported_cairo_headers += $(cairo_observer_headers) +all_cairo_headers += $(cairo_observer_headers) +all_cairo_private += $(cairo_observer_private) +all_cairo_cxx_sources += $(cairo_observer_cxx_sources) +all_cairo_sources += $(cairo_observer_sources) +enabled_cairo_headers += $(cairo_observer_headers) +enabled_cairo_private += $(cairo_observer_private) +enabled_cairo_cxx_sources += $(cairo_observer_cxx_sources) +enabled_cairo_sources += $(cairo_observer_sources) + +unsupported_cairo_headers += $(cairo_tee_headers) +all_cairo_headers += $(cairo_tee_headers) +all_cairo_private += $(cairo_tee_private) +all_cairo_cxx_sources += $(cairo_tee_cxx_sources) +all_cairo_sources += $(cairo_tee_sources) +ifeq ($(CAIRO_HAS_TEE_SURFACE),1) +enabled_cairo_headers += $(cairo_tee_headers) +enabled_cairo_private += $(cairo_tee_private) +enabled_cairo_cxx_sources += $(cairo_tee_cxx_sources) +enabled_cairo_sources += $(cairo_tee_sources) +endif +all_cairo_pkgconf += cairo-tee.pc +ifeq ($(CAIRO_HAS_TEE_SURFACE),1) +enabled_cairo_pkgconf += cairo-tee.pc +endif + +unsupported_cairo_headers += $(cairo_xml_headers) +all_cairo_headers += $(cairo_xml_headers) +all_cairo_private += $(cairo_xml_private) +all_cairo_cxx_sources += $(cairo_xml_cxx_sources) +all_cairo_sources += $(cairo_xml_sources) +ifeq ($(CAIRO_HAS_XML_SURFACE),1) +enabled_cairo_headers += $(cairo_xml_headers) +enabled_cairo_private += $(cairo_xml_private) +enabled_cairo_cxx_sources += $(cairo_xml_cxx_sources) +enabled_cairo_sources += $(cairo_xml_sources) +endif +all_cairo_pkgconf += cairo-xml.pc +ifeq ($(CAIRO_HAS_XML_SURFACE),1) +enabled_cairo_pkgconf += cairo-xml.pc +endif + +supported_cairo_headers += $(cairo_user_headers) +all_cairo_headers += $(cairo_user_headers) +all_cairo_private += $(cairo_user_private) +all_cairo_cxx_sources += $(cairo_user_cxx_sources) +all_cairo_sources += $(cairo_user_sources) +enabled_cairo_headers += $(cairo_user_headers) +enabled_cairo_private += $(cairo_user_private) +enabled_cairo_cxx_sources += $(cairo_user_cxx_sources) +enabled_cairo_sources += $(cairo_user_sources) + +all_cairo_private += $(cairo_pthread_private) $(cairo_pthread_headers) +all_cairo_cxx_sources += $(cairo_pthread_cxx_sources) +all_cairo_sources += $(cairo_pthread_sources) +ifeq ($(CAIRO_HAS_PTHREAD),1) +enabled_cairo_private += $(cairo_pthread_private) $(cairo_pthread_headers) +enabled_cairo_cxx_sources += $(cairo_pthread_cxx_sources) +enabled_cairo_sources += $(cairo_pthread_sources) +endif + +supported_cairo_headers += $(cairo_gobject_headers) +all_cairo_headers += $(cairo_gobject_headers) +all_cairo_private += $(cairo_gobject_private) +all_cairo_cxx_sources += $(cairo_gobject_cxx_sources) +all_cairo_sources += $(cairo_gobject_sources) +ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1) +enabled_cairo_headers += $(cairo_gobject_headers) +enabled_cairo_private += $(cairo_gobject_private) +enabled_cairo_cxx_sources += $(cairo_gobject_cxx_sources) +enabled_cairo_sources += $(cairo_gobject_sources) +endif +all_cairo_pkgconf += cairo-gobject.pc +ifeq ($(CAIRO_HAS_GOBJECT_FUNCTIONS),1) +enabled_cairo_pkgconf += cairo-gobject.pc +endif + +all_cairo_private += $(cairo_trace_private) $(cairo_trace_headers) +all_cairo_cxx_sources += $(cairo_trace_cxx_sources) +all_cairo_sources += $(cairo_trace_sources) +ifeq ($(CAIRO_HAS_TRACE),1) +enabled_cairo_private += $(cairo_trace_private) $(cairo_trace_headers) +enabled_cairo_cxx_sources += $(cairo_trace_cxx_sources) +enabled_cairo_sources += $(cairo_trace_sources) +endif + +all_cairo_private += $(cairo_interpreter_private) $(cairo_interpreter_headers) +all_cairo_cxx_sources += $(cairo_interpreter_cxx_sources) +all_cairo_sources += $(cairo_interpreter_sources) +ifeq ($(CAIRO_HAS_INTERPRETER),1) +enabled_cairo_private += $(cairo_interpreter_private) $(cairo_interpreter_headers) +enabled_cairo_cxx_sources += $(cairo_interpreter_cxx_sources) +enabled_cairo_sources += $(cairo_interpreter_sources) +endif + +all_cairo_private += $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +all_cairo_cxx_sources += $(cairo_symbol_lookup_cxx_sources) +all_cairo_sources += $(cairo_symbol_lookup_sources) +ifeq ($(CAIRO_HAS_SYMBOL_LOOKUP),1) +enabled_cairo_private += $(cairo_symbol_lookup_private) $(cairo_symbol_lookup_headers) +enabled_cairo_cxx_sources += $(cairo_symbol_lookup_cxx_sources) +enabled_cairo_sources += $(cairo_symbol_lookup_sources) +endif diff --git a/src/README b/src/README new file mode 100644 index 000000000..03e4455ea --- /dev/null +++ b/src/README @@ -0,0 +1,69 @@ +Cairo Library Source Code +========================= + +This directory contains the source code of the cairo library. + + +Source Code Listing +------------------- + +The canonical list of source files is the file Makefile.sources. See that +file for how it works. + + +New Backends +------------ + +The rule of the thumb for adding new backends is to see how other +backends are integrated. Pick one of the simpler, unsupported, backends +and search the entire tree for it, and go from there. + +To add new backends you need to basically: + + * Modify $(top_srcdir)/configure.in to add checks for your backend. + + * Modify Makefile.sources to add source files for your backend, + + * Modify $(top_srcdir)/boilerplate/ to add boilerplate code for + testing your new backend. + + +New API +------- + +After adding new API, run "make check" in this directory and fix any +reported issues. Also add new API to the right location in +$(top_srcdir)/doc/public/cairo-sections.txt and run "make check" +in $(top_builddir)/doc/public to make sure that any newly added +documentation is correctly hooked up. + +Do not forget to add tests for the new API. See next section. + + +Tests +----- + +There are some tests in this directory that check the source code and +the build for various issues. The tests are very quick to run, and +particularly should be run after any documentation or API changes. It +does not hurt to run them after any source modification either. Run +them simply by calling: + + make check + +There are also extensive regression tests in $(top_srcdir)/test. It is +a good idea to run that test suite for any changes made to the source +code. Moreover, for any new feature, API, or bug fix, new tests should +be added to the regression test suite to test the new code. + + +Bibliography +------------ + +A detailed list of academic publications used in cairo code is available +in the file $(top_srcdir)/BIBLIOGRAPHY. Feel free to update as you +implement more papers. + +For more technical publications (eg. Adobe technical reports) just +point them out in a comment in the header of the file implementing them. + diff --git a/src/cairo-analysis-surface-private.h b/src/cairo-analysis-surface-private.h new file mode 100644 index 000000000..1e054c209 --- /dev/null +++ b/src/cairo-analysis-surface-private.h @@ -0,0 +1,74 @@ +/* + * Copyright © 2005 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith Packard + */ + +#ifndef CAIRO_ANALYSIS_SURFACE_H +#define CAIRO_ANALYSIS_SURFACE_H + +#include "cairoint.h" + +cairo_private cairo_surface_t * +_cairo_analysis_surface_create (cairo_surface_t *target); + +cairo_private void +_cairo_analysis_surface_set_ctm (cairo_surface_t *surface, + const cairo_matrix_t *ctm); + +cairo_private void +_cairo_analysis_surface_get_ctm (cairo_surface_t *surface, + cairo_matrix_t *ctm); + +cairo_private cairo_region_t * +_cairo_analysis_surface_get_supported (cairo_surface_t *surface); + +cairo_private cairo_region_t * +_cairo_analysis_surface_get_unsupported (cairo_surface_t *surface); + +cairo_private cairo_bool_t +_cairo_analysis_surface_has_supported (cairo_surface_t *surface); + +cairo_private cairo_bool_t +_cairo_analysis_surface_has_unsupported (cairo_surface_t *surface); + +cairo_private void +_cairo_analysis_surface_get_bounding_box (cairo_surface_t *surface, + cairo_box_t *bbox); + +cairo_private cairo_int_status_t +_cairo_analysis_surface_merge_status (cairo_int_status_t status_a, + cairo_int_status_t status_b); + +cairo_private cairo_surface_t * +_cairo_null_surface_create (cairo_content_t content); + +#endif /* CAIRO_ANALYSIS_SURFACE_H */ diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c new file mode 100644 index 000000000..8516094c2 --- /dev/null +++ b/src/cairo-analysis-surface.c @@ -0,0 +1,934 @@ +/* + * Copyright © 2006 Keith Packard + * Copyright © 2007 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith Packard + * Adrian Johnson + */ + +#include "cairoint.h" + +#include "cairo-analysis-surface-private.h" +#include "cairo-box-inline.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-paginated-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-inline.h" +#include "cairo-region-private.h" + +typedef struct { + cairo_surface_t base; + + cairo_surface_t *target; + + cairo_bool_t first_op; + cairo_bool_t has_supported; + cairo_bool_t has_unsupported; + + cairo_region_t supported_region; + cairo_region_t fallback_region; + cairo_box_t page_bbox; + + cairo_bool_t has_ctm; + cairo_matrix_t ctm; + +} cairo_analysis_surface_t; + +cairo_int_status_t +_cairo_analysis_surface_merge_status (cairo_int_status_t status_a, + cairo_int_status_t status_b) +{ + /* fatal errors should be checked and propagated at source */ + assert (! _cairo_int_status_is_error (status_a)); + assert (! _cairo_int_status_is_error (status_b)); + + /* return the most important status */ + if (status_a == CAIRO_INT_STATUS_UNSUPPORTED || + status_b == CAIRO_INT_STATUS_UNSUPPORTED) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (status_a == CAIRO_INT_STATUS_IMAGE_FALLBACK || + status_b == CAIRO_INT_STATUS_IMAGE_FALLBACK) + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + + if (status_a == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN || + status_b == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) + return CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN; + + if (status_a == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY || + status_b == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY) + return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + + /* at this point we have checked all the valid internal codes, so... */ + assert (status_a == CAIRO_INT_STATUS_SUCCESS && + status_b == CAIRO_INT_STATUS_SUCCESS); + + return CAIRO_INT_STATUS_SUCCESS; +} + +struct proxy { + cairo_surface_t base; + cairo_surface_t *target; +}; + +static cairo_status_t +proxy_finish (void *abstract_surface) +{ + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t proxy_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_NULL, + proxy_finish, +}; + +static cairo_surface_t * +attach_proxy (cairo_surface_t *source, + cairo_surface_t *target) +{ + struct proxy *proxy; + + proxy = malloc (sizeof (*proxy)); + if (unlikely (proxy == NULL)) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_surface_init (&proxy->base, &proxy_backend, NULL, target->content); + + proxy->target = target; + _cairo_surface_attach_snapshot (source, &proxy->base, NULL); + + return &proxy->base; +} + +static void +detach_proxy (cairo_surface_t *proxy) +{ + cairo_surface_finish (proxy); + cairo_surface_destroy (proxy); +} + +static cairo_int_status_t +_analyze_recording_surface_pattern (cairo_analysis_surface_t *surface, + const cairo_pattern_t *pattern) +{ + const cairo_surface_pattern_t *surface_pattern; + cairo_analysis_surface_t *tmp; + cairo_surface_t *source, *proxy; + cairo_matrix_t p2d; + cairo_status_t status, analysis_status; + + assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE); + surface_pattern = (const cairo_surface_pattern_t *) pattern; + assert (surface_pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING); + source = surface_pattern->surface; + + proxy = _cairo_surface_has_snapshot (source, &proxy_backend); + if (proxy != NULL) { + /* nothing untoward found so far */ + return CAIRO_STATUS_SUCCESS; + } + + tmp = (cairo_analysis_surface_t *) + _cairo_analysis_surface_create (surface->target); + if (unlikely (tmp->base.status)) + return tmp->base.status; + proxy = attach_proxy (source, &tmp->base); + + p2d = pattern->matrix; + status = cairo_matrix_invert (&p2d); + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_multiply (&tmp->ctm, &p2d, &surface->ctm); + tmp->has_ctm = ! _cairo_matrix_is_identity (&tmp->ctm); + + source = _cairo_surface_get_source (source, NULL); + status = _cairo_recording_surface_replay_and_create_regions (source, + &tmp->base); + analysis_status = tmp->has_unsupported ? CAIRO_INT_STATUS_IMAGE_FALLBACK : CAIRO_INT_STATUS_SUCCESS; + detach_proxy (proxy); + cairo_surface_destroy (&tmp->base); + + if (unlikely (status)) + return status; + + return analysis_status; +} + +static cairo_int_status_t +_add_operation (cairo_analysis_surface_t *surface, + cairo_rectangle_int_t *rect, + cairo_int_status_t backend_status) +{ + cairo_int_status_t status; + cairo_box_t bbox; + + if (rect->width == 0 || rect->height == 0) { + /* Even though the operation is not visible we must be careful + * to not allow unsupported operations to be replayed to the + * backend during CAIRO_PAGINATED_MODE_RENDER */ + if (backend_status == CAIRO_INT_STATUS_SUCCESS || + backend_status == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY || + backend_status == CAIRO_INT_STATUS_NOTHING_TO_DO) + { + return CAIRO_INT_STATUS_SUCCESS; + } + else + { + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + } + } + + _cairo_box_from_rectangle (&bbox, rect); + + if (surface->has_ctm) { + int tx, ty; + + if (_cairo_matrix_is_integer_translation (&surface->ctm, &tx, &ty)) { + rect->x += tx; + rect->y += ty; + + tx = _cairo_fixed_from_int (tx); + bbox.p1.x += tx; + bbox.p2.x += tx; + + ty = _cairo_fixed_from_int (ty); + bbox.p1.y += ty; + bbox.p2.y += ty; + } else { + _cairo_matrix_transform_bounding_box_fixed (&surface->ctm, + &bbox, NULL); + + if (bbox.p1.x == bbox.p2.x || bbox.p1.y == bbox.p2.y) { + /* Even though the operation is not visible we must be + * careful to not allow unsupported operations to be + * replayed to the backend during + * CAIRO_PAGINATED_MODE_RENDER */ + if (backend_status == CAIRO_INT_STATUS_SUCCESS || + backend_status == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY || + backend_status == CAIRO_INT_STATUS_NOTHING_TO_DO) + { + return CAIRO_INT_STATUS_SUCCESS; + } + else + { + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + } + } + + _cairo_box_round_to_rectangle (&bbox, rect); + } + } + + if (surface->first_op) { + surface->first_op = FALSE; + surface->page_bbox = bbox; + } else + _cairo_box_add_box(&surface->page_bbox, &bbox); + + /* If the operation is completely enclosed within the fallback + * region there is no benefit in emitting a native operation as + * the fallback image will be painted on top. + */ + if (cairo_region_contains_rectangle (&surface->fallback_region, rect) == CAIRO_REGION_OVERLAP_IN) + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + + if (backend_status == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY) { + /* A status of CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY indicates + * that the backend only supports this operation if the + * transparency removed. If the extents of this operation does + * not intersect any other native operation, the operation is + * natively supported and the backend will blend the + * transparency into the white background. + */ + if (cairo_region_contains_rectangle (&surface->supported_region, rect) == CAIRO_REGION_OVERLAP_OUT) + backend_status = CAIRO_INT_STATUS_SUCCESS; + } + + if (backend_status == CAIRO_INT_STATUS_SUCCESS) { + /* Add the operation to the supported region. Operations in + * this region will be emitted as native operations. + */ + surface->has_supported = TRUE; + return cairo_region_union_rectangle (&surface->supported_region, rect); + } + + /* Add the operation to the unsupported region. This region will + * be painted as an image after all native operations have been + * emitted. + */ + surface->has_unsupported = TRUE; + status = cairo_region_union_rectangle (&surface->fallback_region, rect); + + /* The status CAIRO_INT_STATUS_IMAGE_FALLBACK is used to indicate + * unsupported operations to the recording surface as using + * CAIRO_INT_STATUS_UNSUPPORTED would cause cairo-surface to + * invoke the cairo-surface-fallback path then return + * CAIRO_STATUS_SUCCESS. + */ + if (status == CAIRO_INT_STATUS_SUCCESS) + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + else + return status; +} + +static cairo_status_t +_cairo_analysis_surface_finish (void *abstract_surface) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + _cairo_region_fini (&surface->supported_region); + _cairo_region_fini (&surface->fallback_region); + + cairo_surface_destroy (surface->target); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_analysis_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_analysis_surface_t *surface = abstract_surface; + + return _cairo_surface_get_extents (surface->target, rectangle); +} + +static void +_rectangle_intersect_clip (cairo_rectangle_int_t *extents, const cairo_clip_t *clip) +{ + if (clip != NULL) + _cairo_rectangle_intersect (extents, _cairo_clip_get_extents (clip)); +} + +static void +_cairo_analysis_surface_operation_extents (cairo_analysis_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip, + cairo_rectangle_int_t *extents) +{ + cairo_bool_t is_empty; + + is_empty = _cairo_surface_get_extents (&surface->base, extents); + + if (_cairo_operator_bounded_by_source (op)) { + cairo_rectangle_int_t source_extents; + + _cairo_pattern_get_extents (source, &source_extents); + _cairo_rectangle_intersect (extents, &source_extents); + } + + _rectangle_intersect_clip (extents, clip); +} + +static cairo_int_status_t +_cairo_analysis_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_analysis_surface_t *surface = abstract_surface; + cairo_int_status_t backend_status; + cairo_rectangle_int_t extents; + + if (surface->target->backend->paint == NULL) { + backend_status = CAIRO_INT_STATUS_UNSUPPORTED; + } else { + backend_status = + surface->target->backend->paint (surface->target, + op, source, clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + + if (backend_status == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) + backend_status = _analyze_recording_surface_pattern (surface, source); + + _cairo_analysis_surface_operation_extents (surface, + op, source, clip, + &extents); + + return _add_operation (surface, &extents, backend_status); +} + +static cairo_int_status_t +_cairo_analysis_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_analysis_surface_t *surface = abstract_surface; + cairo_int_status_t backend_status; + cairo_rectangle_int_t extents; + + if (surface->target->backend->mask == NULL) { + backend_status = CAIRO_INT_STATUS_UNSUPPORTED; + } else { + backend_status = + surface->target->backend->mask (surface->target, + op, source, mask, clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + + if (backend_status == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) { + cairo_int_status_t backend_source_status = CAIRO_STATUS_SUCCESS; + cairo_int_status_t backend_mask_status = CAIRO_STATUS_SUCCESS; + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_t *src_surface = ((cairo_surface_pattern_t *)source)->surface; + src_surface = _cairo_surface_get_source (src_surface, NULL); + if (_cairo_surface_is_recording (src_surface)) { + backend_source_status = + _analyze_recording_surface_pattern (surface, source); + if (_cairo_int_status_is_error (backend_source_status)) + return backend_source_status; + } + } + + if (mask->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_t *mask_surface = ((cairo_surface_pattern_t *)mask)->surface; + mask_surface = _cairo_surface_get_source (mask_surface, NULL); + if (_cairo_surface_is_recording (mask_surface)) { + backend_mask_status = + _analyze_recording_surface_pattern (surface, mask); + if (_cairo_int_status_is_error (backend_mask_status)) + return backend_mask_status; + } + } + + backend_status = + _cairo_analysis_surface_merge_status (backend_source_status, + backend_mask_status); + } + + _cairo_analysis_surface_operation_extents (surface, + op, source, clip, + &extents); + + if (_cairo_operator_bounded_by_mask (op)) { + cairo_rectangle_int_t mask_extents; + + _cairo_pattern_get_extents (mask, &mask_extents); + _cairo_rectangle_intersect (&extents, &mask_extents); + } + + return _add_operation (surface, &extents, backend_status); +} + +static cairo_int_status_t +_cairo_analysis_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_analysis_surface_t *surface = abstract_surface; + cairo_int_status_t backend_status; + cairo_rectangle_int_t extents; + + if (surface->target->backend->stroke == NULL) { + backend_status = CAIRO_INT_STATUS_UNSUPPORTED; + } else { + backend_status = + surface->target->backend->stroke (surface->target, op, + source, path, style, + ctm, ctm_inverse, + tolerance, antialias, + clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + + if (backend_status == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) + backend_status = _analyze_recording_surface_pattern (surface, source); + + _cairo_analysis_surface_operation_extents (surface, + op, source, clip, + &extents); + + if (_cairo_operator_bounded_by_mask (op)) { + cairo_rectangle_int_t mask_extents; + cairo_int_status_t status; + + status = _cairo_path_fixed_stroke_extents (path, style, + ctm, ctm_inverse, + tolerance, + &mask_extents); + if (unlikely (status)) + return status; + + _cairo_rectangle_intersect (&extents, &mask_extents); + } + + return _add_operation (surface, &extents, backend_status); +} + +static cairo_int_status_t +_cairo_analysis_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_analysis_surface_t *surface = abstract_surface; + cairo_int_status_t backend_status; + cairo_rectangle_int_t extents; + + if (surface->target->backend->fill == NULL) { + backend_status = CAIRO_INT_STATUS_UNSUPPORTED; + } else { + backend_status = + surface->target->backend->fill (surface->target, op, + source, path, fill_rule, + tolerance, antialias, + clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + + if (backend_status == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) + backend_status = _analyze_recording_surface_pattern (surface, source); + + _cairo_analysis_surface_operation_extents (surface, + op, source, clip, + &extents); + + if (_cairo_operator_bounded_by_mask (op)) { + cairo_rectangle_int_t mask_extents; + + _cairo_path_fixed_fill_extents (path, fill_rule, tolerance, + &mask_extents); + + _cairo_rectangle_intersect (&extents, &mask_extents); + } + + return _add_operation (surface, &extents, backend_status); +} + +static cairo_int_status_t +_cairo_analysis_surface_show_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_analysis_surface_t *surface = abstract_surface; + cairo_int_status_t status, backend_status; + cairo_rectangle_int_t extents, glyph_extents; + + /* Adapted from _cairo_surface_show_glyphs */ + if (surface->target->backend->show_glyphs != NULL) { + backend_status = + surface->target->backend->show_glyphs (surface->target, op, + source, + glyphs, num_glyphs, + scaled_font, + clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + else if (surface->target->backend->show_text_glyphs != NULL) + { + backend_status = + surface->target->backend->show_text_glyphs (surface->target, op, + source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, + FALSE, + scaled_font, + clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + else + { + backend_status = CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (backend_status == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) + backend_status = _analyze_recording_surface_pattern (surface, source); + + _cairo_analysis_surface_operation_extents (surface, + op, source, clip, + &extents); + + if (_cairo_operator_bounded_by_mask (op)) { + status = _cairo_scaled_font_glyph_device_extents (scaled_font, + glyphs, + num_glyphs, + &glyph_extents, + NULL); + if (unlikely (status)) + return status; + + _cairo_rectangle_intersect (&extents, &glyph_extents); + } + + return _add_operation (surface, &extents, backend_status); +} + +static cairo_bool_t +_cairo_analysis_surface_has_show_text_glyphs (void *abstract_surface) +{ + cairo_analysis_surface_t *surface = abstract_surface; + + return cairo_surface_has_show_text_glyphs (surface->target); +} + +static cairo_int_status_t +_cairo_analysis_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_analysis_surface_t *surface = abstract_surface; + cairo_int_status_t status, backend_status; + cairo_rectangle_int_t extents, glyph_extents; + + /* Adapted from _cairo_surface_show_glyphs */ + backend_status = CAIRO_INT_STATUS_UNSUPPORTED; + if (surface->target->backend->show_text_glyphs != NULL) { + backend_status = + surface->target->backend->show_text_glyphs (surface->target, op, + source, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font, + clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + if (backend_status == CAIRO_INT_STATUS_UNSUPPORTED && + surface->target->backend->show_glyphs != NULL) + { + backend_status = + surface->target->backend->show_glyphs (surface->target, op, + source, + glyphs, num_glyphs, + scaled_font, + clip); + if (_cairo_int_status_is_error (backend_status)) + return backend_status; + } + + if (backend_status == CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN) + backend_status = _analyze_recording_surface_pattern (surface, source); + + _cairo_analysis_surface_operation_extents (surface, + op, source, clip, + &extents); + + if (_cairo_operator_bounded_by_mask (op)) { + status = _cairo_scaled_font_glyph_device_extents (scaled_font, + glyphs, + num_glyphs, + &glyph_extents, + NULL); + if (unlikely (status)) + return status; + + _cairo_rectangle_intersect (&extents, &glyph_extents); + } + + return _add_operation (surface, &extents, backend_status); +} + +static const cairo_surface_backend_t cairo_analysis_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_ANALYSIS, + + _cairo_analysis_surface_finish, + NULL, + + NULL, /* create_similar */ + NULL, /* create_similar_image */ + NULL, /* map_to_image */ + NULL, /* unmap */ + + NULL, /* source */ + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_analysis_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_analysis_surface_paint, + _cairo_analysis_surface_mask, + _cairo_analysis_surface_stroke, + _cairo_analysis_surface_fill, + NULL, /* fill_stroke */ + _cairo_analysis_surface_show_glyphs, + _cairo_analysis_surface_has_show_text_glyphs, + _cairo_analysis_surface_show_text_glyphs +}; + +cairo_surface_t * +_cairo_analysis_surface_create (cairo_surface_t *target) +{ + cairo_analysis_surface_t *surface; + cairo_status_t status; + + status = target->status; + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + surface = malloc (sizeof (cairo_analysis_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + /* I believe the content type here is truly arbitrary. I'm quite + * sure nothing will ever use this value. */ + _cairo_surface_init (&surface->base, + &cairo_analysis_surface_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + cairo_matrix_init_identity (&surface->ctm); + surface->has_ctm = FALSE; + + surface->target = cairo_surface_reference (target); + surface->first_op = TRUE; + surface->has_supported = FALSE; + surface->has_unsupported = FALSE; + + _cairo_region_init (&surface->supported_region); + _cairo_region_init (&surface->fallback_region); + + surface->page_bbox.p1.x = 0; + surface->page_bbox.p1.y = 0; + surface->page_bbox.p2.x = 0; + surface->page_bbox.p2.y = 0; + + return &surface->base; +} + +void +_cairo_analysis_surface_set_ctm (cairo_surface_t *abstract_surface, + const cairo_matrix_t *ctm) +{ + cairo_analysis_surface_t *surface; + + if (abstract_surface->status) + return; + + surface = (cairo_analysis_surface_t *) abstract_surface; + + surface->ctm = *ctm; + surface->has_ctm = ! _cairo_matrix_is_identity (&surface->ctm); +} + +void +_cairo_analysis_surface_get_ctm (cairo_surface_t *abstract_surface, + cairo_matrix_t *ctm) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + *ctm = surface->ctm; +} + + +cairo_region_t * +_cairo_analysis_surface_get_supported (cairo_surface_t *abstract_surface) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + return &surface->supported_region; +} + +cairo_region_t * +_cairo_analysis_surface_get_unsupported (cairo_surface_t *abstract_surface) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + return &surface->fallback_region; +} + +cairo_bool_t +_cairo_analysis_surface_has_supported (cairo_surface_t *abstract_surface) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + return surface->has_supported; +} + +cairo_bool_t +_cairo_analysis_surface_has_unsupported (cairo_surface_t *abstract_surface) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + return surface->has_unsupported; +} + +void +_cairo_analysis_surface_get_bounding_box (cairo_surface_t *abstract_surface, + cairo_box_t *bbox) +{ + cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; + + *bbox = surface->page_bbox; +} + +/* null surface type: a surface that does nothing (has no side effects, yay!) */ + +static cairo_int_status_t +_return_success (void) +{ + return CAIRO_STATUS_SUCCESS; +} + +/* These typedefs are just to silence the compiler... */ +typedef cairo_int_status_t +(*_paint_func) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +typedef cairo_int_status_t +(*_mask_func) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +typedef cairo_int_status_t +(*_stroke_func) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +typedef cairo_int_status_t +(*_fill_func) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +typedef cairo_int_status_t +(*_show_glyphs_func) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + +static const cairo_surface_backend_t cairo_null_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_NULL, + NULL, /* finish */ + + NULL, /* only accessed through the surface functions */ + + NULL, /* create_similar */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image*/ + + NULL, /* source */ + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + NULL, /* get_extents */ + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + (_paint_func) _return_success, /* paint */ + (_mask_func) _return_success, /* mask */ + (_stroke_func) _return_success, /* stroke */ + (_fill_func) _return_success, /* fill */ + NULL, /* fill_stroke */ + (_show_glyphs_func) _return_success, /* show_glyphs */ + NULL, /* has_show_text_glyphs */ + NULL /* show_text_glyphs */ +}; + +cairo_surface_t * +_cairo_null_surface_create (cairo_content_t content) +{ + cairo_surface_t *surface; + + surface = malloc (sizeof (cairo_surface_t)); + if (unlikely (surface == NULL)) { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + _cairo_surface_init (surface, + &cairo_null_surface_backend, + NULL, /* device */ + content); + + return surface; +} diff --git a/src/cairo-arc-private.h b/src/cairo-arc-private.h new file mode 100644 index 000000000..a22c01ac9 --- /dev/null +++ b/src/cairo-arc-private.h @@ -0,0 +1,61 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_ARC_PRIVATE_H +#define CAIRO_ARC_PRIVATE_H + +#include "cairoint.h" + +CAIRO_BEGIN_DECLS + +cairo_private void +_cairo_arc_path (cairo_t *cr, + double xc, + double yc, + double radius, + double angle1, + double angle2); + +cairo_private void +_cairo_arc_path_negative (cairo_t *cr, + double xc, + double yc, + double radius, + double angle1, + double angle2); + +CAIRO_END_DECLS + +#endif /* CAIRO_ARC_PRIVATE_H */ diff --git a/src/cairo-arc.c b/src/cairo-arc.c new file mode 100644 index 000000000..390397bae --- /dev/null +++ b/src/cairo-arc.c @@ -0,0 +1,312 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-arc-private.h" + +#define MAX_FULL_CIRCLES 65536 + +/* Spline deviation from the circle in radius would be given by: + + error = sqrt (x**2 + y**2) - 1 + + A simpler error function to work with is: + + e = x**2 + y**2 - 1 + + From "Good approximation of circles by curvature-continuous Bezier + curves", Tor Dokken and Morten Daehlen, Computer Aided Geometric + Design 8 (1990) 22-41, we learn: + + abs (max(e)) = 4/27 * sin**6(angle/4) / cos**2(angle/4) + + and + abs (error) =~ 1/2 * e + + Of course, this error value applies only for the particular spline + approximation that is used in _cairo_gstate_arc_segment. +*/ +static double +_arc_error_normalized (double angle) +{ + return 2.0/27.0 * pow (sin (angle / 4), 6) / pow (cos (angle / 4), 2); +} + +static double +_arc_max_angle_for_tolerance_normalized (double tolerance) +{ + double angle, error; + int i; + + /* Use table lookup to reduce search time in most cases. */ + struct { + double angle; + double error; + } table[] = { + { M_PI / 1.0, 0.0185185185185185036127 }, + { M_PI / 2.0, 0.000272567143730179811158 }, + { M_PI / 3.0, 2.38647043651461047433e-05 }, + { M_PI / 4.0, 4.2455377443222443279e-06 }, + { M_PI / 5.0, 1.11281001494389081528e-06 }, + { M_PI / 6.0, 3.72662000942734705475e-07 }, + { M_PI / 7.0, 1.47783685574284411325e-07 }, + { M_PI / 8.0, 6.63240432022601149057e-08 }, + { M_PI / 9.0, 3.2715520137536980553e-08 }, + { M_PI / 10.0, 1.73863223499021216974e-08 }, + { M_PI / 11.0, 9.81410988043554039085e-09 }, + }; + int table_size = ARRAY_LENGTH (table); + + for (i = 0; i < table_size; i++) + if (table[i].error < tolerance) + return table[i].angle; + + ++i; + do { + angle = M_PI / i++; + error = _arc_error_normalized (angle); + } while (error > tolerance); + + return angle; +} + +static int +_arc_segments_needed (double angle, + double radius, + cairo_matrix_t *ctm, + double tolerance) +{ + double major_axis, max_angle; + + /* the error is amplified by at most the length of the + * major axis of the circle; see cairo-pen.c for a more detailed analysis + * of this. */ + major_axis = _cairo_matrix_transformed_circle_major_axis (ctm, radius); + max_angle = _arc_max_angle_for_tolerance_normalized (tolerance / major_axis); + + return ceil (fabs (angle) / max_angle); +} + +/* We want to draw a single spline approximating a circular arc radius + R from angle A to angle B. Since we want a symmetric spline that + matches the endpoints of the arc in position and slope, we know + that the spline control points must be: + + (R * cos(A), R * sin(A)) + (R * cos(A) - h * sin(A), R * sin(A) + h * cos (A)) + (R * cos(B) + h * sin(B), R * sin(B) - h * cos (B)) + (R * cos(B), R * sin(B)) + + for some value of h. + + "Approximation of circular arcs by cubic polynomials", Michael + Goldapp, Computer Aided Geometric Design 8 (1991) 227-238, provides + various values of h along with error analysis for each. + + From that paper, a very practical value of h is: + + h = 4/3 * R * tan(angle/4) + + This value does not give the spline with minimal error, but it does + provide a very good approximation, (6th-order convergence), and the + error expression is quite simple, (see the comment for + _arc_error_normalized). +*/ +static void +_cairo_arc_segment (cairo_t *cr, + double xc, + double yc, + double radius, + double angle_A, + double angle_B) +{ + double r_sin_A, r_cos_A; + double r_sin_B, r_cos_B; + double h; + + r_sin_A = radius * sin (angle_A); + r_cos_A = radius * cos (angle_A); + r_sin_B = radius * sin (angle_B); + r_cos_B = radius * cos (angle_B); + + h = 4.0/3.0 * tan ((angle_B - angle_A) / 4.0); + + cairo_curve_to (cr, + xc + r_cos_A - h * r_sin_A, + yc + r_sin_A + h * r_cos_A, + xc + r_cos_B + h * r_sin_B, + yc + r_sin_B - h * r_cos_B, + xc + r_cos_B, + yc + r_sin_B); +} + +static void +_cairo_arc_in_direction (cairo_t *cr, + double xc, + double yc, + double radius, + double angle_min, + double angle_max, + cairo_direction_t dir) +{ + if (cairo_status (cr)) + return; + + assert (angle_max >= angle_min); + + if (angle_max - angle_min > 2 * M_PI * MAX_FULL_CIRCLES) { + angle_max = fmod (angle_max - angle_min, 2 * M_PI); + angle_min = fmod (angle_min, 2 * M_PI); + angle_max += angle_min + 2 * M_PI * MAX_FULL_CIRCLES; + } + + /* Recurse if drawing arc larger than pi */ + if (angle_max - angle_min > M_PI) { + double angle_mid = angle_min + (angle_max - angle_min) / 2.0; + if (dir == CAIRO_DIRECTION_FORWARD) { + _cairo_arc_in_direction (cr, xc, yc, radius, + angle_min, angle_mid, + dir); + + _cairo_arc_in_direction (cr, xc, yc, radius, + angle_mid, angle_max, + dir); + } else { + _cairo_arc_in_direction (cr, xc, yc, radius, + angle_mid, angle_max, + dir); + + _cairo_arc_in_direction (cr, xc, yc, radius, + angle_min, angle_mid, + dir); + } + } else if (angle_max != angle_min) { + cairo_matrix_t ctm; + int i, segments; + double step; + + cairo_get_matrix (cr, &ctm); + segments = _arc_segments_needed (angle_max - angle_min, + radius, &ctm, + cairo_get_tolerance (cr)); + step = (angle_max - angle_min) / segments; + segments -= 1; + + if (dir == CAIRO_DIRECTION_REVERSE) { + double t; + + t = angle_min; + angle_min = angle_max; + angle_max = t; + + step = -step; + } + + cairo_line_to (cr, + xc + radius * cos (angle_min), + yc + radius * sin (angle_min)); + + for (i = 0; i < segments; i++, angle_min += step) { + _cairo_arc_segment (cr, xc, yc, radius, + angle_min, angle_min + step); + } + + _cairo_arc_segment (cr, xc, yc, radius, + angle_min, angle_max); + } else { + cairo_line_to (cr, + xc + radius * cos (angle_min), + yc + radius * sin (angle_min)); + } +} + +/** + * _cairo_arc_path: + * @cr: a cairo context + * @xc: X position of the center of the arc + * @yc: Y position of the center of the arc + * @radius: the radius of the arc + * @angle1: the start angle, in radians + * @angle2: the end angle, in radians + * + * Compute a path for the given arc and append it onto the current + * path within @cr. The arc will be accurate within the current + * tolerance and given the current transformation. + **/ +void +_cairo_arc_path (cairo_t *cr, + double xc, + double yc, + double radius, + double angle1, + double angle2) +{ + _cairo_arc_in_direction (cr, xc, yc, + radius, + angle1, angle2, + CAIRO_DIRECTION_FORWARD); +} + +/** + * _cairo_arc_path_negative: + * @xc: X position of the center of the arc + * @yc: Y position of the center of the arc + * @radius: the radius of the arc + * @angle1: the start angle, in radians + * @angle2: the end angle, in radians + * @ctm: the current transformation matrix + * @tolerance: the current tolerance value + * @path: the path onto which the arc will be appended + * + * Compute a path for the given arc (defined in the negative + * direction) and append it onto the current path within @cr. The arc + * will be accurate within the current tolerance and given the current + * transformation. + **/ +void +_cairo_arc_path_negative (cairo_t *cr, + double xc, + double yc, + double radius, + double angle1, + double angle2) +{ + _cairo_arc_in_direction (cr, xc, yc, + radius, + angle2, angle1, + CAIRO_DIRECTION_REVERSE); +} diff --git a/src/cairo-array-private.h b/src/cairo-array-private.h new file mode 100644 index 000000000..35b29e5fc --- /dev/null +++ b/src/cairo-array-private.h @@ -0,0 +1,90 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_ARRAY_PRIVATE_H +#define CAIRO_ARRAY_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" + +CAIRO_BEGIN_DECLS + +/* cairo-array.c structures and functions */ + +cairo_private void +_cairo_array_init (cairo_array_t *array, unsigned int element_size); + +cairo_private void +_cairo_array_fini (cairo_array_t *array); + +cairo_private cairo_status_t +_cairo_array_grow_by (cairo_array_t *array, unsigned int additional); + +cairo_private void +_cairo_array_truncate (cairo_array_t *array, unsigned int num_elements); + +cairo_private cairo_status_t +_cairo_array_append (cairo_array_t *array, const void *element); + +cairo_private cairo_status_t +_cairo_array_append_multiple (cairo_array_t *array, + const void *elements, + unsigned int num_elements); + +cairo_private cairo_status_t +_cairo_array_allocate (cairo_array_t *array, + unsigned int num_elements, + void **elements); + +cairo_private void * +_cairo_array_index (cairo_array_t *array, unsigned int index); + +cairo_private const void * +_cairo_array_index_const (const cairo_array_t *array, unsigned int index); + +cairo_private void +_cairo_array_copy_element (const cairo_array_t *array, unsigned int index, void *dst); + +cairo_private unsigned int +_cairo_array_num_elements (const cairo_array_t *array); + +cairo_private unsigned int +_cairo_array_size (const cairo_array_t *array); + +CAIRO_END_DECLS + +#endif /* CAIRO_ARRAY_PRIVATE_H */ diff --git a/src/cairo-array.c b/src/cairo-array.c new file mode 100644 index 000000000..4f3c082ff --- /dev/null +++ b/src/cairo-array.c @@ -0,0 +1,526 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Carl Worth + */ + +#include "cairoint.h" +#include "cairo-array-private.h" +#include "cairo-error-private.h" + +/** + * _cairo_array_init: + * + * Initialize a new #cairo_array_t object to store objects each of size + * @element_size. + * + * The #cairo_array_t object provides grow-by-doubling storage. It + * never interprets the data passed to it, nor does it provide any + * sort of callback mechanism for freeing resources held onto by + * stored objects. + * + * When finished using the array, _cairo_array_fini() should be + * called to free resources allocated during use of the array. + **/ +void +_cairo_array_init (cairo_array_t *array, unsigned int element_size) +{ + array->size = 0; + array->num_elements = 0; + array->element_size = element_size; + array->elements = NULL; +} + +/** + * _cairo_array_fini: + * @array: A #cairo_array_t + * + * Free all resources associated with @array. After this call, @array + * should not be used again without a subsequent call to + * _cairo_array_init() again first. + **/ +void +_cairo_array_fini (cairo_array_t *array) +{ + free (array->elements); +} + +/** + * _cairo_array_grow_by: + * @array: a #cairo_array_t + * + * Increase the size of @array (if needed) so that there are at least + * @additional free spaces in the array. The actual size of the array + * is always increased by doubling as many times as necessary. + **/ +cairo_status_t +_cairo_array_grow_by (cairo_array_t *array, unsigned int additional) +{ + char *new_elements; + unsigned int old_size = array->size; + unsigned int required_size = array->num_elements + additional; + unsigned int new_size; + + /* check for integer overflow */ + if (required_size > INT_MAX || required_size < array->num_elements) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (required_size <= old_size) + return CAIRO_STATUS_SUCCESS; + + if (old_size == 0) + new_size = 1; + else + new_size = old_size * 2; + + while (new_size < required_size) + new_size = new_size * 2; + + array->size = new_size; + new_elements = _cairo_realloc_ab (array->elements, + array->size, array->element_size); + + if (unlikely (new_elements == NULL)) { + array->size = old_size; + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + array->elements = new_elements; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_array_truncate: + * @array: a #cairo_array_t + * + * Truncate size of the array to @num_elements if less than the + * current size. No memory is actually freed. The stored objects + * beyond @num_elements are simply "forgotten". + **/ +void +_cairo_array_truncate (cairo_array_t *array, unsigned int num_elements) +{ + if (num_elements < array->num_elements) + array->num_elements = num_elements; +} + +/** + * _cairo_array_index: + * @array: a #cairo_array_t + * Returns: A pointer to the object stored at @index. + * + * If the resulting value is assigned to a pointer to an object of the same + * element_size as initially passed to _cairo_array_init() then that + * pointer may be used for further direct indexing with []. For + * example: + * + * + * cairo_array_t array; + * double *values; + * + * _cairo_array_init (&array, sizeof(double)); + * ... calls to _cairo_array_append() here ... + * + * values = _cairo_array_index (&array, 0); + * for (i = 0; i < _cairo_array_num_elements (&array); i++) + * ... use values[i] here ... + * + **/ +void * +_cairo_array_index (cairo_array_t *array, unsigned int index) +{ + /* We allow an index of 0 for the no-elements case. + * This makes for cleaner calling code which will often look like: + * + * elements = _cairo_array_index (array, 0); + * for (i=0; i < num_elements; i++) { + * ... use elements[i] here ... + * } + * + * which in the num_elements==0 case gets the NULL pointer here, + * but never dereferences it. + */ + if (index == 0 && array->num_elements == 0) + return NULL; + + assert (index < array->num_elements); + + return array->elements + index * array->element_size; +} + +/** + * _cairo_array_index_const: + * @array: a #cairo_array_t + * Returns: A pointer to the object stored at @index. + * + * If the resulting value is assigned to a pointer to an object of the same + * element_size as initially passed to _cairo_array_init() then that + * pointer may be used for further direct indexing with []. For + * example: + * + * + * cairo_array_t array; + * const double *values; + * + * _cairo_array_init (&array, sizeof(double)); + * ... calls to _cairo_array_append() here ... + * + * values = _cairo_array_index_const (&array, 0); + * for (i = 0; i < _cairo_array_num_elements (&array); i++) + * ... read values[i] here ... + * + **/ +const void * +_cairo_array_index_const (const cairo_array_t *array, unsigned int index) +{ + /* We allow an index of 0 for the no-elements case. + * This makes for cleaner calling code which will often look like: + * + * elements = _cairo_array_index_const (array, 0); + * for (i=0; i < num_elements; i++) { + * ... read elements[i] here ... + * } + * + * which in the num_elements==0 case gets the NULL pointer here, + * but never dereferences it. + */ + if (index == 0 && array->num_elements == 0) + return NULL; + + assert (index < array->num_elements); + + return array->elements + index * array->element_size; +} + +/** + * _cairo_array_copy_element: + * @array: a #cairo_array_t + * + * Copy a single element out of the array from index @index into the + * location pointed to by @dst. + **/ +void +_cairo_array_copy_element (const cairo_array_t *array, + unsigned int index, + void *dst) +{ + memcpy (dst, _cairo_array_index_const (array, index), array->element_size); +} + +/** + * _cairo_array_append: + * @array: a #cairo_array_t + * + * Append a single item onto the array by growing the array by at + * least one element, then copying element_size bytes from @element + * into the array. The address of the resulting object within the + * array can be determined with: + * + * _cairo_array_index (array, _cairo_array_num_elements (array) - 1); + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if insufficient memory is available for the + * operation. + **/ +cairo_status_t +_cairo_array_append (cairo_array_t *array, + const void *element) +{ + return _cairo_array_append_multiple (array, element, 1); +} + +/** + * _cairo_array_append_multiple: + * @array: a #cairo_array_t + * + * Append one or more items onto the array by growing the array by + * @num_elements, then copying @num_elements * element_size bytes from + * @elements into the array. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if insufficient memory is available for the + * operation. + **/ +cairo_status_t +_cairo_array_append_multiple (cairo_array_t *array, + const void *elements, + unsigned int num_elements) +{ + cairo_status_t status; + void *dest; + + status = _cairo_array_allocate (array, num_elements, &dest); + if (unlikely (status)) + return status; + + memcpy (dest, elements, num_elements * array->element_size); + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_array_allocate: + * @array: a #cairo_array_t + * + * Allocate space at the end of the array for @num_elements additional + * elements, providing the address of the new memory chunk in + * @elements. This memory will be unitialized, but will be accounted + * for in the return value of _cairo_array_num_elements(). + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if insufficient memory is available for the + * operation. + **/ +cairo_status_t +_cairo_array_allocate (cairo_array_t *array, + unsigned int num_elements, + void **elements) +{ + cairo_status_t status; + + status = _cairo_array_grow_by (array, num_elements); + if (unlikely (status)) + return status; + + assert (array->num_elements + num_elements <= array->size); + + *elements = array->elements + array->num_elements * array->element_size; + + array->num_elements += num_elements; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_array_num_elements: + * @array: a #cairo_array_t + * Returns: The number of elements stored in @array. + * + * This space was left intentionally blank, but gtk-doc filled it. + **/ +unsigned int +_cairo_array_num_elements (const cairo_array_t *array) +{ + return array->num_elements; +} + +/** + * _cairo_array_size: + * @array: a #cairo_array_t + * Returns: The number of elements for which there is currently space + * allocated in @array. + * + * This space was left intentionally blank, but gtk-doc filled it. + **/ +unsigned int +_cairo_array_size (const cairo_array_t *array) +{ + return array->size; +} + +/** + * _cairo_user_data_array_init: + * @array: a #cairo_user_data_array_t + * + * Initializes a #cairo_user_data_array_t structure for future + * use. After initialization, the array has no keys. Call + * _cairo_user_data_array_fini() to free any allocated memory + * when done using the array. + **/ +void +_cairo_user_data_array_init (cairo_user_data_array_t *array) +{ + _cairo_array_init (array, sizeof (cairo_user_data_slot_t)); +} + +/** + * _cairo_user_data_array_fini: + * @array: a #cairo_user_data_array_t + * + * Destroys all current keys in the user data array and deallocates + * any memory allocated for the array itself. + **/ +void +_cairo_user_data_array_fini (cairo_user_data_array_t *array) +{ + unsigned int num_slots; + + num_slots = array->num_elements; + if (num_slots) { + cairo_user_data_slot_t *slots; + + slots = _cairo_array_index (array, 0); + while (num_slots--) { + cairo_user_data_slot_t *s = &slots[num_slots]; + if (s->user_data != NULL && s->destroy != NULL) + s->destroy (s->user_data); + } + } + + _cairo_array_fini (array); +} + +/** + * _cairo_user_data_array_get_data: + * @array: a #cairo_user_data_array_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Returns user data previously attached using the specified + * key. If no user data has been attached with the given key this + * function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + **/ +void * +_cairo_user_data_array_get_data (cairo_user_data_array_t *array, + const cairo_user_data_key_t *key) +{ + int i, num_slots; + cairo_user_data_slot_t *slots; + + /* We allow this to support degenerate objects such as cairo_surface_nil. */ + if (array == NULL) + return NULL; + + num_slots = array->num_elements; + slots = _cairo_array_index (array, 0); + for (i = 0; i < num_slots; i++) { + if (slots[i].key == key) + return slots[i].user_data; + } + + return NULL; +} + +/** + * _cairo_user_data_array_set_data: + * @array: a #cairo_user_data_array_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach + * @destroy: a #cairo_destroy_func_t which will be called when the + * user data array is destroyed or when new user data is attached using the + * same key. + * + * Attaches user data to a user data array. To remove user data, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + **/ +cairo_status_t +_cairo_user_data_array_set_data (cairo_user_data_array_t *array, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + cairo_status_t status; + int i, num_slots; + cairo_user_data_slot_t *slots, *slot, new_slot; + + if (user_data) { + new_slot.key = key; + new_slot.user_data = user_data; + new_slot.destroy = destroy; + } else { + new_slot.key = NULL; + new_slot.user_data = NULL; + new_slot.destroy = NULL; + } + + slot = NULL; + num_slots = array->num_elements; + slots = _cairo_array_index (array, 0); + for (i = 0; i < num_slots; i++) { + if (slots[i].key == key) { + slot = &slots[i]; + if (slot->destroy && slot->user_data) + slot->destroy (slot->user_data); + break; + } + if (user_data && slots[i].user_data == NULL) { + slot = &slots[i]; /* Have to keep searching for an exact match */ + } + } + + if (slot) { + *slot = new_slot; + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_array_append (array, &new_slot); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_user_data_array_copy (cairo_user_data_array_t *dst, + const cairo_user_data_array_t *src) +{ + /* discard any existing user-data */ + if (dst->num_elements != 0) { + _cairo_user_data_array_fini (dst); + _cairo_user_data_array_init (dst); + } + + return _cairo_array_append_multiple (dst, + _cairo_array_index_const (src, 0), + src->num_elements); +} + +void +_cairo_user_data_array_foreach (cairo_user_data_array_t *array, + void (*func) (const void *key, + void *elt, + void *closure), + void *closure) +{ + cairo_user_data_slot_t *slots; + int i, num_slots; + + num_slots = array->num_elements; + slots = _cairo_array_index (array, 0); + for (i = 0; i < num_slots; i++) { + if (slots[i].user_data != NULL) + func (slots[i].key, slots[i].user_data, closure); + } +} diff --git a/src/cairo-atomic-private.h b/src/cairo-atomic-private.h new file mode 100644 index 000000000..327fed1d9 --- /dev/null +++ b/src/cairo-atomic-private.h @@ -0,0 +1,272 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * Copyright © 2010 Andrea Canciani + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + * Andrea Canciani + */ + +#ifndef CAIRO_ATOMIC_PRIVATE_H +#define CAIRO_ATOMIC_PRIVATE_H + +# include "cairo-compiler-private.h" + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +/* The autoconf on OpenBSD 4.5 produces the malformed constant name + * SIZEOF_VOID__ rather than SIZEOF_VOID_P. Work around that here. */ +#if !defined(SIZEOF_VOID_P) && defined(SIZEOF_VOID__) +# define SIZEOF_VOID_P SIZEOF_VOID__ +#endif + +CAIRO_BEGIN_DECLS + +#if HAVE_INTEL_ATOMIC_PRIMITIVES + +#define HAS_ATOMIC_OPS 1 + +typedef int cairo_atomic_int_t; + +#ifdef ATOMIC_OP_NEEDS_MEMORY_BARRIER +static cairo_always_inline cairo_atomic_int_t +_cairo_atomic_int_get (cairo_atomic_int_t *x) +{ + __sync_synchronize (); + return *x; +} + +static cairo_always_inline void * +_cairo_atomic_ptr_get (void **x) +{ + __sync_synchronize (); + return *x; +} +#else +# define _cairo_atomic_int_get(x) (*x) +# define _cairo_atomic_ptr_get(x) (*x) +#endif + +# define _cairo_atomic_int_inc(x) ((void) __sync_fetch_and_add(x, 1)) +# define _cairo_atomic_int_dec(x) ((void) __sync_fetch_and_add(x, -1)) +# define _cairo_atomic_int_dec_and_test(x) (__sync_fetch_and_add(x, -1) == 1) +# define _cairo_atomic_int_cmpxchg(x, oldv, newv) __sync_bool_compare_and_swap (x, oldv, newv) +# define _cairo_atomic_int_cmpxchg_return_old(x, oldv, newv) __sync_val_compare_and_swap (x, oldv, newv) + +#if SIZEOF_VOID_P==SIZEOF_INT +typedef int cairo_atomic_intptr_t; +#elif SIZEOF_VOID_P==SIZEOF_LONG +typedef long cairo_atomic_intptr_t; +#elif SIZEOF_VOID_P==SIZEOF_LONG_LONG +typedef long long cairo_atomic_intptr_t; +#else +#error No matching integer pointer type +#endif + +# define _cairo_atomic_ptr_cmpxchg(x, oldv, newv) \ + __sync_bool_compare_and_swap ((cairo_atomic_intptr_t*)x, (cairo_atomic_intptr_t)oldv, (cairo_atomic_intptr_t)newv) + +# define _cairo_atomic_ptr_cmpxchg_return_old(x, oldv, newv) \ + _cairo_atomic_intptr_to_voidptr (__sync_val_compare_and_swap ((cairo_atomic_intptr_t*)x, (cairo_atomic_intptr_t)oldv, (cairo_atomic_intptr_t)newv)) + +#endif + +#if HAVE_LIB_ATOMIC_OPS +#include + +#define HAS_ATOMIC_OPS 1 + +typedef AO_t cairo_atomic_int_t; + +# define _cairo_atomic_int_get(x) (AO_load_full (x)) + +# define _cairo_atomic_int_inc(x) ((void) AO_fetch_and_add1_full(x)) +# define _cairo_atomic_int_dec(x) ((void) AO_fetch_and_sub1_full(x)) +# define _cairo_atomic_int_dec_and_test(x) (AO_fetch_and_sub1_full(x) == 1) +# define _cairo_atomic_int_cmpxchg(x, oldv, newv) AO_compare_and_swap_full(x, oldv, newv) + +#if SIZEOF_VOID_P==SIZEOF_INT +typedef unsigned int cairo_atomic_intptr_t; +#elif SIZEOF_VOID_P==SIZEOF_LONG +typedef unsigned long cairo_atomic_intptr_t; +#elif SIZEOF_VOID_P==SIZEOF_LONG_LONG +typedef unsigned long long cairo_atomic_intptr_t; +#else +#error No matching integer pointer type +#endif + +# define _cairo_atomic_ptr_get(x) _cairo_atomic_intptr_to_voidptr (AO_load_full (x)) +# define _cairo_atomic_ptr_cmpxchg(x, oldv, newv) \ + _cairo_atomic_int_cmpxchg ((cairo_atomic_intptr_t*)(x), (cairo_atomic_intptr_t)oldv, (cairo_atomic_intptr_t)newv) + +#endif + +#if HAVE_OS_ATOMIC_OPS +#include + +#define HAS_ATOMIC_OPS 1 + +typedef int32_t cairo_atomic_int_t; + +# define _cairo_atomic_int_get(x) (OSMemoryBarrier(), *(x)) + +# define _cairo_atomic_int_inc(x) ((void) OSAtomicIncrement32Barrier (x)) +# define _cairo_atomic_int_dec(x) ((void) OSAtomicDecrement32Barrier (x)) +# define _cairo_atomic_int_dec_and_test(x) (OSAtomicDecrement32Barrier (x) == 0) +# define _cairo_atomic_int_cmpxchg(x, oldv, newv) OSAtomicCompareAndSwap32Barrier(oldv, newv, x) + +#if SIZEOF_VOID_P==4 +typedef int32_t cairo_atomic_intptr_t; +# define _cairo_atomic_ptr_cmpxchg(x, oldv, newv) \ + OSAtomicCompareAndSwap32Barrier((cairo_atomic_intptr_t)oldv, (cairo_atomic_intptr_t)newv, (cairo_atomic_intptr_t *)x) + +#elif SIZEOF_VOID_P==8 +typedef int64_t cairo_atomic_intptr_t; +# define _cairo_atomic_ptr_cmpxchg(x, oldv, newv) \ + OSAtomicCompareAndSwap64Barrier((cairo_atomic_intptr_t)oldv, (cairo_atomic_intptr_t)newv, (cairo_atomic_intptr_t *)x) + +#else +#error No matching integer pointer type +#endif + +# define _cairo_atomic_ptr_get(x) (OSMemoryBarrier(), *(x)) + +#endif + +#ifndef HAS_ATOMIC_OPS + +#if SIZEOF_VOID_P==SIZEOF_INT +typedef unsigned int cairo_atomic_intptr_t; +#elif SIZEOF_VOID_P==SIZEOF_LONG +typedef unsigned long cairo_atomic_intptr_t; +#elif SIZEOF_VOID_P==SIZEOF_LONG_LONG +typedef unsigned long long cairo_atomic_intptr_t; +#else +#error No matching integer pointer type +#endif + +typedef cairo_atomic_intptr_t cairo_atomic_int_t; + +cairo_private void +_cairo_atomic_int_inc (cairo_atomic_int_t *x); + +#define _cairo_atomic_int_dec(x) _cairo_atomic_int_dec_and_test(x) + +cairo_private cairo_bool_t +_cairo_atomic_int_dec_and_test (cairo_atomic_int_t *x); + +cairo_private cairo_atomic_int_t +_cairo_atomic_int_cmpxchg_return_old_impl (cairo_atomic_int_t *x, cairo_atomic_int_t oldv, cairo_atomic_int_t newv); + +cairo_private void * +_cairo_atomic_ptr_cmpxchg_return_old_impl (void **x, void *oldv, void *newv); + +#define _cairo_atomic_int_cmpxchg_return_old(x, oldv, newv) _cairo_atomic_int_cmpxchg_return_old_impl (x, oldv, newv) +#define _cairo_atomic_ptr_cmpxchg_return_old(x, oldv, newv) _cairo_atomic_ptr_cmpxchg_return_old_impl (x, oldv, newv) + +#ifdef ATOMIC_OP_NEEDS_MEMORY_BARRIER +cairo_private cairo_atomic_int_t +_cairo_atomic_int_get (cairo_atomic_int_t *x); +# define _cairo_atomic_ptr_get(x) (void *) _cairo_atomic_int_get((cairo_atomic_int_t *) x) +#else +# define _cairo_atomic_int_get(x) (*x) +# define _cairo_atomic_ptr_get(x) (*x) +#endif + +#else + +/* Workaround GCC complaining about casts */ +static cairo_always_inline void * +_cairo_atomic_intptr_to_voidptr (cairo_atomic_intptr_t x) +{ + return (void *) x; +} + +static cairo_always_inline cairo_atomic_int_t +_cairo_atomic_int_cmpxchg_return_old_fallback(cairo_atomic_int_t *x, cairo_atomic_int_t oldv, cairo_atomic_int_t newv) +{ + cairo_atomic_int_t curr; + + do { + curr = _cairo_atomic_int_get (x); + } while (curr == oldv && !_cairo_atomic_int_cmpxchg (x, oldv, newv)); + + return curr; +} + +static cairo_always_inline void * +_cairo_atomic_ptr_cmpxchg_return_old_fallback(void **x, void *oldv, void *newv) +{ + void *curr; + + do { + curr = _cairo_atomic_ptr_get (x); + } while (curr == oldv && !_cairo_atomic_ptr_cmpxchg (x, oldv, newv)); + + return curr; +} +#endif + +#ifndef _cairo_atomic_int_cmpxchg_return_old +#define _cairo_atomic_int_cmpxchg_return_old(x, oldv, newv) _cairo_atomic_int_cmpxchg_return_old_fallback (x, oldv, newv) +#endif + +#ifndef _cairo_atomic_ptr_cmpxchg_return_old +#define _cairo_atomic_ptr_cmpxchg_return_old(x, oldv, newv) _cairo_atomic_ptr_cmpxchg_return_old_fallback (x, oldv, newv) +#endif + +#ifndef _cairo_atomic_int_cmpxchg +#define _cairo_atomic_int_cmpxchg(x, oldv, newv) (_cairo_atomic_int_cmpxchg_return_old (x, oldv, newv) == oldv) +#endif + +#ifndef _cairo_atomic_ptr_cmpxchg +#define _cairo_atomic_ptr_cmpxchg(x, oldv, newv) (_cairo_atomic_ptr_cmpxchg_return_old (x, oldv, newv) == oldv) +#endif + +#define _cairo_atomic_uint_get(x) _cairo_atomic_int_get(x) +#define _cairo_atomic_uint_cmpxchg(x, oldv, newv) \ + _cairo_atomic_int_cmpxchg((cairo_atomic_int_t *)x, oldv, newv) + +#define _cairo_status_set_error(status, err) do { \ + int ret__; \ + assert (err < CAIRO_STATUS_LAST_STATUS); \ + /* hide compiler warnings about cairo_status_t != int (gcc treats its as \ + * an unsigned integer instead, and about ignoring the return value. */ \ + ret__ = _cairo_atomic_int_cmpxchg ((cairo_atomic_int_t *) status, CAIRO_STATUS_SUCCESS, err); \ + (void) ret__; \ +} while (0) + +CAIRO_END_DECLS + +#endif diff --git a/src/cairo-atomic.c b/src/cairo-atomic.c new file mode 100644 index 000000000..909cfea49 --- /dev/null +++ b/src/cairo-atomic.c @@ -0,0 +1,106 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-atomic-private.h" +#include "cairo-mutex-private.h" + +#ifdef HAS_ATOMIC_OPS +COMPILE_TIME_ASSERT(sizeof(void*) == sizeof(int) || + sizeof(void*) == sizeof(long) || + sizeof(void*) == sizeof(long long)); +#else +void +_cairo_atomic_int_inc (cairo_atomic_intptr_t *x) +{ + CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); + *x += 1; + CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); +} + +cairo_bool_t +_cairo_atomic_int_dec_and_test (cairo_atomic_intptr_t *x) +{ + cairo_bool_t ret; + + CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); + ret = --*x == 0; + CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); + + return ret; +} + +cairo_atomic_intptr_t +_cairo_atomic_int_cmpxchg_return_old_impl (cairo_atomic_intptr_t *x, cairo_atomic_intptr_t oldv, cairo_atomic_intptr_t newv) +{ + cairo_atomic_intptr_t ret; + + CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); + ret = *x; + if (ret == oldv) + *x = newv; + CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); + + return ret; +} + +void * +_cairo_atomic_ptr_cmpxchg_return_old_impl (void **x, void *oldv, void *newv) +{ + void *ret; + + CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); + ret = *x; + if (ret == oldv) + *x = newv; + CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); + + return ret; +} + +#ifdef ATOMIC_OP_NEEDS_MEMORY_BARRIER +cairo_atomic_intptr_t +_cairo_atomic_int_get (cairo_atomic_intptr_t *x) +{ + cairo_atomic_intptr_t ret; + + CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); + ret = *x; + CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); + + return ret; +} +#endif + +#endif diff --git a/src/cairo-backend-private.h b/src/cairo-backend-private.h new file mode 100644 index 000000000..b05eca59a --- /dev/null +++ b/src/cairo-backend-private.h @@ -0,0 +1,201 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_BACKEND_PRIVATE_H +#define CAIRO_BACKEND_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-private.h" + +typedef enum _cairo_backend_type { + CAIRO_TYPE_DEFAULT, + CAIRO_TYPE_SKIA, +} cairo_backend_type_t; + +struct _cairo_backend { + cairo_backend_type_t type; + void (*destroy) (void *cr); + + cairo_surface_t *(*get_original_target) (void *cr); + cairo_surface_t *(*get_current_target) (void *cr); + + cairo_status_t (*save) (void *cr); + cairo_status_t (*restore) (void *cr); + + cairo_status_t (*push_group) (void *cr, cairo_content_t content); + cairo_pattern_t *(*pop_group) (void *cr); + + cairo_status_t (*set_source_rgba) (void *cr, double red, double green, double blue, double alpha); + cairo_status_t (*set_source_surface) (void *cr, cairo_surface_t *surface, double x, double y); + cairo_status_t (*set_source) (void *cr, cairo_pattern_t *source); + cairo_pattern_t *(*get_source) (void *cr); + + cairo_status_t (*set_antialias) (void *cr, cairo_antialias_t antialias); + cairo_status_t (*set_dash) (void *cr, const double *dashes, int num_dashes, double offset); + cairo_status_t (*set_fill_rule) (void *cr, cairo_fill_rule_t fill_rule); + cairo_status_t (*set_line_cap) (void *cr, cairo_line_cap_t line_cap); + cairo_status_t (*set_line_join) (void *cr, cairo_line_join_t line_join); + cairo_status_t (*set_line_width) (void *cr, double line_width); + cairo_status_t (*set_miter_limit) (void *cr, double limit); + cairo_status_t (*set_opacity) (void *cr, double opacity); + cairo_status_t (*set_operator) (void *cr, cairo_operator_t op); + cairo_status_t (*set_tolerance) (void *cr, double tolerance); + + cairo_antialias_t (*get_antialias) (void *cr); + void (*get_dash) (void *cr, double *dashes, int *num_dashes, double *offset); + cairo_fill_rule_t (*get_fill_rule) (void *cr); + cairo_line_cap_t (*get_line_cap) (void *cr); + cairo_line_join_t (*get_line_join) (void *cr); + double (*get_line_width) (void *cr); + double (*get_miter_limit) (void *cr); + double (*get_opacity) (void *cr); + cairo_operator_t (*get_operator) (void *cr); + double (*get_tolerance) (void *cr); + + cairo_status_t (*translate) (void *cr, double tx, double ty); + cairo_status_t (*scale) (void *cr, double sx, double sy); + cairo_status_t (*rotate) (void *cr, double theta); + cairo_status_t (*transform) (void *cr, const cairo_matrix_t *matrix); + cairo_status_t (*set_matrix) (void *cr, const cairo_matrix_t *matrix); + cairo_status_t (*set_identity_matrix) (void *cr); + void (*get_matrix) (void *cr, cairo_matrix_t *matrix); + + void (*user_to_device) (void *cr, double *x, double *y); + void (*user_to_device_distance) (void *cr, double *x, double *y); + void (*device_to_user) (void *cr, double *x, double *y); + void (*device_to_user_distance) (void *cr, double *x, double *y); + + void (*user_to_backend) (void *cr, double *x, double *y); + void (*user_to_backend_distance) (void *cr, double *x, double *y); + void (*backend_to_user) (void *cr, double *x, double *y); + void (*backend_to_user_distance) (void *cr, double *x, double *y); + + cairo_status_t (*new_path) (void *cr); + cairo_status_t (*new_sub_path) (void *cr); + cairo_status_t (*move_to) (void *cr, double x, double y); + cairo_status_t (*rel_move_to) (void *cr, double dx, double dy); + cairo_status_t (*line_to) (void *cr, double x, double y); + cairo_status_t (*rel_line_to) (void *cr, double dx, double dy); + cairo_status_t (*curve_to) (void *cr, double x1, double y1, double x2, double y2, double x3, double y3); + cairo_status_t (*rel_curve_to) (void *cr, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3); + cairo_status_t (*arc_to) (void *cr, double x1, double y1, double x2, double y2, double radius); + cairo_status_t (*rel_arc_to) (void *cr, double dx1, double dy1, double dx2, double dy2, double radius); + cairo_status_t (*close_path) (void *cr); + + cairo_status_t (*arc) (void *cr, double xc, double yc, double radius, double angle1, double angle2, cairo_bool_t forward); + cairo_status_t (*rectangle) (void *cr, double x, double y, double width, double height); + + void (*path_extents) (void *cr, double *x1, double *y1, double *x2, double *y2); + cairo_bool_t (*has_current_point) (void *cr); + cairo_bool_t (*get_current_point) (void *cr, double *x, double *y); + + cairo_path_t *(*copy_path) (void *cr); + cairo_path_t *(*copy_path_flat) (void *cr); + cairo_status_t (*append_path) (void *cr, const cairo_path_t *path); + + cairo_status_t (*stroke_to_path) (void *cr); + + cairo_status_t (*clip) (void *cr); + cairo_status_t (*clip_preserve) (void *cr); + cairo_status_t (*in_clip) (void *cr, double x, double y, cairo_bool_t *inside); + cairo_status_t (*clip_extents) (void *cr, double *x1, double *y1, double *x2, double *y2); + cairo_status_t (*reset_clip) (void *cr); + cairo_rectangle_list_t *(*clip_copy_rectangle_list) (void *cr); + + cairo_status_t (*paint) (void *cr); + cairo_status_t (*paint_with_alpha) (void *cr, double opacity); + cairo_status_t (*mask) (void *cr, cairo_pattern_t *pattern); + + cairo_status_t (*stroke) (void *cr); + cairo_status_t (*stroke_preserve) (void *cr); + cairo_status_t (*in_stroke) (void *cr, double x, double y, cairo_bool_t *inside); + cairo_status_t (*stroke_extents) (void *cr, double *x1, double *y1, double *x2, double *y2); + + cairo_status_t (*fill) (void *cr); + cairo_status_t (*fill_preserve) (void *cr); + cairo_status_t (*in_fill) (void *cr, double x, double y, cairo_bool_t *inside); + cairo_status_t (*fill_extents) (void *cr, double *x1, double *y1, double *x2, double *y2); + + cairo_status_t (*set_font_face) (void *cr, cairo_font_face_t *font_face); + cairo_font_face_t *(*get_font_face) (void *cr); + cairo_status_t (*set_font_size) (void *cr, double size); + cairo_status_t (*set_font_matrix) (void *cr, const cairo_matrix_t *matrix); + void (*get_font_matrix) (void *cr, cairo_matrix_t *matrix); + cairo_status_t (*set_font_options) (void *cr, const cairo_font_options_t *options); + void (*get_font_options) (void *cr, cairo_font_options_t *options); + cairo_status_t (*set_scaled_font) (void *cr, cairo_scaled_font_t *scaled_font); + cairo_scaled_font_t *(*get_scaled_font) (void *cr); + cairo_status_t (*font_extents) (void *cr, cairo_font_extents_t *extents); + + cairo_status_t (*glyphs) (void *cr, + const cairo_glyph_t *glyphs, int num_glyphs, + cairo_glyph_text_info_t *info); + cairo_status_t (*glyph_path) (void *cr, + const cairo_glyph_t *glyphs, int num_glyphs); + + cairo_status_t (*glyph_extents) (void *cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents); + + cairo_status_t (*copy_page) (void *cr); + cairo_status_t (*show_page) (void *cr); +}; + +static inline void +_cairo_backend_to_user (cairo_t *cr, double *x, double *y) +{ + cr->backend->backend_to_user (cr, x, y); +} + +static inline void +_cairo_backend_to_user_distance (cairo_t *cr, double *x, double *y) +{ + cr->backend->backend_to_user_distance (cr, x, y); +} + +static inline void +_cairo_user_to_backend (cairo_t *cr, double *x, double *y) +{ + cr->backend->user_to_backend (cr, x, y); +} + +static inline void +_cairo_user_to_backend_distance (cairo_t *cr, double *x, double *y) +{ + cr->backend->user_to_backend_distance (cr, x, y); +} + +#endif /* CAIRO_BACKEND_PRIVATE_H */ diff --git a/src/cairo-base64-stream.c b/src/cairo-base64-stream.c new file mode 100644 index 000000000..636431372 --- /dev/null +++ b/src/cairo-base64-stream.c @@ -0,0 +1,144 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005-2007 Emmanuel Pacaud + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Author(s): + * Kristian Høgsberg + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-error-private.h" +#include "cairo-output-stream-private.h" + +typedef struct _cairo_base64_stream { + cairo_output_stream_t base; + cairo_output_stream_t *output; + unsigned int in_mem; + unsigned int trailing; + unsigned char src[3]; +} cairo_base64_stream_t; + +static char const base64_table[64] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static cairo_status_t +_cairo_base64_stream_write (cairo_output_stream_t *base, + const unsigned char *data, + unsigned int length) +{ + cairo_base64_stream_t * stream = (cairo_base64_stream_t *) base; + unsigned char *src = stream->src; + unsigned int i; + + if (stream->in_mem + length < 3) { + for (i = 0; i < length; i++) { + src[i + stream->in_mem] = *data++; + } + stream->in_mem += length; + return CAIRO_STATUS_SUCCESS; + } + + do { + unsigned char dst[4]; + + for (i = stream->in_mem; i < 3; i++) { + src[i] = *data++; + length--; + } + stream->in_mem = 0; + + dst[0] = base64_table[src[0] >> 2]; + dst[1] = base64_table[(src[0] & 0x03) << 4 | src[1] >> 4]; + dst[2] = base64_table[(src[1] & 0x0f) << 2 | src[2] >> 6]; + dst[3] = base64_table[src[2] & 0xfc >> 2]; + /* Special case for the last missing bits */ + switch (stream->trailing) { + case 2: + dst[2] = '='; + case 1: + dst[3] = '='; + default: + break; + } + _cairo_output_stream_write (stream->output, dst, 4); + } while (length >= 3); + + for (i = 0; i < length; i++) { + src[i] = *data++; + } + stream->in_mem = length; + + return _cairo_output_stream_get_status (stream->output); +} + +static cairo_status_t +_cairo_base64_stream_close (cairo_output_stream_t *base) +{ + cairo_base64_stream_t *stream = (cairo_base64_stream_t *) base; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + if (stream->in_mem > 0) { + memset (stream->src + stream->in_mem, 0, 3 - stream->in_mem); + stream->trailing = 3 - stream->in_mem; + stream->in_mem = 3; + status = _cairo_base64_stream_write (base, NULL, 0); + } + + return status; +} + +cairo_output_stream_t * +_cairo_base64_stream_create (cairo_output_stream_t *output) +{ + cairo_base64_stream_t *stream; + + if (output->status) + return _cairo_output_stream_create_in_error (output->status); + + stream = malloc (sizeof (cairo_base64_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + _cairo_base64_stream_write, + NULL, + _cairo_base64_stream_close); + + stream->output = output; + stream->in_mem = 0; + stream->trailing = 0; + + return &stream->base; +} diff --git a/src/cairo-base85-stream.c b/src/cairo-base85-stream.c new file mode 100644 index 000000000..f81affb49 --- /dev/null +++ b/src/cairo-base85-stream.c @@ -0,0 +1,131 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Author(s): + * Kristian Høgsberg + */ + +#include "cairoint.h" +#include "cairo-error-private.h" +#include "cairo-output-stream-private.h" + +typedef struct _cairo_base85_stream { + cairo_output_stream_t base; + cairo_output_stream_t *output; + unsigned char four_tuple[4]; + int pending; +} cairo_base85_stream_t; + +static void +_expand_four_tuple_to_five (unsigned char four_tuple[4], + unsigned char five_tuple[5], + cairo_bool_t *all_zero) +{ + uint32_t value; + int digit, i; + + value = four_tuple[0] << 24 | four_tuple[1] << 16 | four_tuple[2] << 8 | four_tuple[3]; + if (all_zero) + *all_zero = TRUE; + for (i = 0; i < 5; i++) { + digit = value % 85; + if (digit != 0 && all_zero) + *all_zero = FALSE; + five_tuple[4-i] = digit + 33; + value = value / 85; + } +} + +static cairo_status_t +_cairo_base85_stream_write (cairo_output_stream_t *base, + const unsigned char *data, + unsigned int length) +{ + cairo_base85_stream_t *stream = (cairo_base85_stream_t *) base; + const unsigned char *ptr = data; + unsigned char five_tuple[5]; + cairo_bool_t is_zero; + + while (length) { + stream->four_tuple[stream->pending++] = *ptr++; + length--; + if (stream->pending == 4) { + _expand_four_tuple_to_five (stream->four_tuple, five_tuple, &is_zero); + if (is_zero) + _cairo_output_stream_write (stream->output, "z", 1); + else + _cairo_output_stream_write (stream->output, five_tuple, 5); + stream->pending = 0; + } + } + + return _cairo_output_stream_get_status (stream->output); +} + +static cairo_status_t +_cairo_base85_stream_close (cairo_output_stream_t *base) +{ + cairo_base85_stream_t *stream = (cairo_base85_stream_t *) base; + unsigned char five_tuple[5]; + + if (stream->pending) { + memset (stream->four_tuple + stream->pending, 0, 4 - stream->pending); + _expand_four_tuple_to_five (stream->four_tuple, five_tuple, NULL); + _cairo_output_stream_write (stream->output, five_tuple, stream->pending + 1); + } + + return _cairo_output_stream_get_status (stream->output); +} + +cairo_output_stream_t * +_cairo_base85_stream_create (cairo_output_stream_t *output) +{ + cairo_base85_stream_t *stream; + + if (output->status) + return _cairo_output_stream_create_in_error (output->status); + + stream = malloc (sizeof (cairo_base85_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + _cairo_base85_stream_write, + NULL, + _cairo_base85_stream_close); + stream->output = output; + stream->pending = 0; + + return &stream->base; +} diff --git a/src/cairo-bentley-ottmann-rectangular.c b/src/cairo-bentley-ottmann-rectangular.c new file mode 100644 index 000000000..5541bdc3a --- /dev/null +++ b/src/cairo-bentley-ottmann-rectangular.c @@ -0,0 +1,884 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-combsort-inline.h" +#include "cairo-list-private.h" +#include "cairo-traps-private.h" + +#include + +typedef struct _rectangle rectangle_t; +typedef struct _edge edge_t; + +struct _edge { + edge_t *next, *prev; + edge_t *right; + cairo_fixed_t x, top; + int dir; +}; + +struct _rectangle { + edge_t left, right; + int32_t top, bottom; +}; + +#define UNROLL3(x) x x x + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef struct _sweep_line { + rectangle_t **rectangles; + rectangle_t **stop; + edge_t head, tail, *insert, *cursor; + int32_t current_y; + int32_t last_y; + int stop_size; + + int32_t insert_x; + cairo_fill_rule_t fill_rule; + + cairo_bool_t do_traps; + void *container; + + jmp_buf unwind; +} sweep_line_t; + +#define DEBUG_TRAPS 0 + +#if DEBUG_TRAPS +static void +dump_traps (cairo_traps_t *traps, const char *filename) +{ + FILE *file; + int n; + + if (getenv ("CAIRO_DEBUG_TRAPS") == NULL) + return; + + file = fopen (filename, "a"); + if (file != NULL) { + for (n = 0; n < traps->num_traps; n++) { + fprintf (file, "%d %d L:(%d, %d), (%d, %d) R:(%d, %d), (%d, %d)\n", + traps->traps[n].top, + traps->traps[n].bottom, + traps->traps[n].left.p1.x, + traps->traps[n].left.p1.y, + traps->traps[n].left.p2.x, + traps->traps[n].left.p2.y, + traps->traps[n].right.p1.x, + traps->traps[n].right.p1.y, + traps->traps[n].right.p2.x, + traps->traps[n].right.p2.y); + } + fprintf (file, "\n"); + fclose (file); + } +} +#else +#define dump_traps(traps, filename) +#endif + +static inline int +rectangle_compare_start (const rectangle_t *a, + const rectangle_t *b) +{ + return a->top - b->top; +} + +static inline int +rectangle_compare_stop (const rectangle_t *a, + const rectangle_t *b) +{ + return a->bottom - b->bottom; +} + +static inline void +pqueue_push (sweep_line_t *sweep, rectangle_t *rectangle) +{ + rectangle_t **elements; + int i, parent; + + elements = sweep->stop; + for (i = ++sweep->stop_size; + i != PQ_FIRST_ENTRY && + rectangle_compare_stop (rectangle, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = rectangle; +} + +static inline void +rectangle_pop_stop (sweep_line_t *sweep) +{ + rectangle_t **elements = sweep->stop; + rectangle_t *tail; + int child, i; + + tail = elements[sweep->stop_size--]; + if (sweep->stop_size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= sweep->stop_size; + i = child) + { + if (child != sweep->stop_size && + rectangle_compare_stop (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (rectangle_compare_stop (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline rectangle_t * +rectangle_pop_start (sweep_line_t *sweep_line) +{ + return *sweep_line->rectangles++; +} + +static inline rectangle_t * +rectangle_peek_stop (sweep_line_t *sweep_line) +{ + return sweep_line->stop[PQ_FIRST_ENTRY]; +} + +CAIRO_COMBSORT_DECLARE (_rectangle_sort, + rectangle_t *, + rectangle_compare_start) + +static void +sweep_line_init (sweep_line_t *sweep_line, + rectangle_t **rectangles, + int num_rectangles, + cairo_fill_rule_t fill_rule, + cairo_bool_t do_traps, + void *container) +{ + rectangles[-2] = NULL; + rectangles[-1] = NULL; + rectangles[num_rectangles] = NULL; + sweep_line->rectangles = rectangles; + sweep_line->stop = rectangles - 2; + sweep_line->stop_size = 0; + + sweep_line->insert = NULL; + sweep_line->insert_x = INT_MAX; + sweep_line->cursor = &sweep_line->tail; + + sweep_line->head.dir = 0; + sweep_line->head.x = INT32_MIN; + sweep_line->head.right = NULL; + sweep_line->head.prev = NULL; + sweep_line->head.next = &sweep_line->tail; + sweep_line->tail.prev = &sweep_line->head; + sweep_line->tail.next = NULL; + sweep_line->tail.right = NULL; + sweep_line->tail.x = INT32_MAX; + sweep_line->tail.dir = 0; + + sweep_line->current_y = INT32_MIN; + sweep_line->last_y = INT32_MIN; + + sweep_line->fill_rule = fill_rule; + sweep_line->container = container; + sweep_line->do_traps = do_traps; +} + +static void +edge_end_box (sweep_line_t *sweep_line, edge_t *left, int32_t bot) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + /* Only emit (trivial) non-degenerate trapezoids with positive height. */ + if (likely (left->top < bot)) { + if (sweep_line->do_traps) { + cairo_line_t _left = { + { left->x, left->top }, + { left->x, bot }, + }, _right = { + { left->right->x, left->top }, + { left->right->x, bot }, + }; + _cairo_traps_add_trap (sweep_line->container, left->top, bot, &_left, &_right); + status = _cairo_traps_status ((cairo_traps_t *) sweep_line->container); + } else { + cairo_box_t box; + + box.p1.x = left->x; + box.p1.y = left->top; + box.p2.x = left->right->x; + box.p2.y = bot; + + status = _cairo_boxes_add (sweep_line->container, + CAIRO_ANTIALIAS_DEFAULT, + &box); + } + } + if (unlikely (status)) + longjmp (sweep_line->unwind, status); + + left->right = NULL; +} + +/* Start a new trapezoid at the given top y coordinate, whose edges + * are `edge' and `edge->next'. If `edge' already has a trapezoid, + * then either add it to the traps in `traps', if the trapezoid's + * right edge differs from `edge->next', or do nothing if the new + * trapezoid would be a continuation of the existing one. */ +static inline void +edge_start_or_continue_box (sweep_line_t *sweep_line, + edge_t *left, + edge_t *right, + int top) +{ + if (left->right == right) + return; + + if (left->right != NULL) { + if (left->right->x == right->x) { + /* continuation on right, so just swap edges */ + left->right = right; + return; + } + + edge_end_box (sweep_line, left, top); + } + + if (left->x != right->x) { + left->top = top; + left->right = right; + } +} +/* + * Merge two sorted edge lists. + * Input: + * - head_a: The head of the first list. + * - head_b: The head of the second list; head_b cannot be NULL. + * Output: + * Returns the head of the merged list. + * + * Implementation notes: + * To make it fast (in particular, to reduce to an insertion sort whenever + * one of the two input lists only has a single element) we iterate through + * a list until its head becomes greater than the head of the other list, + * then we switch their roles. As soon as one of the two lists is empty, we + * just attach the other one to the current list and exit. + * Writes to memory are only needed to "switch" lists (as it also requires + * attaching to the output list the list which we will be iterating next) and + * to attach the last non-empty list. + */ +static edge_t * +merge_sorted_edges (edge_t *head_a, edge_t *head_b) +{ + edge_t *head, *prev; + int32_t x; + + prev = head_a->prev; + if (head_a->x <= head_b->x) { + head = head_a; + } else { + head_b->prev = prev; + head = head_b; + goto start_with_b; + } + + do { + x = head_b->x; + while (head_a != NULL && head_a->x <= x) { + prev = head_a; + head_a = head_a->next; + } + + head_b->prev = prev; + prev->next = head_b; + if (head_a == NULL) + return head; + +start_with_b: + x = head_a->x; + while (head_b != NULL && head_b->x <= x) { + prev = head_b; + head_b = head_b->next; + } + + head_a->prev = prev; + prev->next = head_a; + if (head_b == NULL) + return head; + } while (1); +} + +/* + * Sort (part of) a list. + * Input: + * - list: The list to be sorted; list cannot be NULL. + * - limit: Recursion limit. + * Output: + * - head_out: The head of the sorted list containing the first 2^(level+1) elements of the + * input list; if the input list has fewer elements, head_out be a sorted list + * containing all the elements of the input list. + * Returns the head of the list of unprocessed elements (NULL if the sorted list contains + * all the elements of the input list). + * + * Implementation notes: + * Special case single element list, unroll/inline the sorting of the first two elements. + * Some tail recursion is used since we iterate on the bottom-up solution of the problem + * (we start with a small sorted list and keep merging other lists of the same size to it). + */ +static edge_t * +sort_edges (edge_t *list, + unsigned int level, + edge_t **head_out) +{ + edge_t *head_other, *remaining; + unsigned int i; + + head_other = list->next; + + if (head_other == NULL) { + *head_out = list; + return NULL; + } + + remaining = head_other->next; + if (list->x <= head_other->x) { + *head_out = list; + head_other->next = NULL; + } else { + *head_out = head_other; + head_other->prev = list->prev; + head_other->next = list; + list->prev = head_other; + list->next = NULL; + } + + for (i = 0; i < level && remaining; i++) { + remaining = sort_edges (remaining, i, &head_other); + *head_out = merge_sorted_edges (*head_out, head_other); + } + + return remaining; +} + +static edge_t * +merge_unsorted_edges (edge_t *head, edge_t *unsorted) +{ + sort_edges (unsorted, UINT_MAX, &unsorted); + return merge_sorted_edges (head, unsorted); +} + +static void +active_edges_insert (sweep_line_t *sweep) +{ + edge_t *prev; + int x; + + x = sweep->insert_x; + prev = sweep->cursor; + if (prev->x > x) { + do { + prev = prev->prev; + } while (prev->x > x); + } else { + while (prev->next->x < x) + prev = prev->next; + } + + prev->next = merge_unsorted_edges (prev->next, sweep->insert); + sweep->cursor = sweep->insert; + sweep->insert = NULL; + sweep->insert_x = INT_MAX; +} + +static inline void +active_edges_to_traps (sweep_line_t *sweep) +{ + int top = sweep->current_y; + edge_t *pos; + + if (sweep->last_y == sweep->current_y) + return; + + if (sweep->insert) + active_edges_insert (sweep); + + pos = sweep->head.next; + if (pos == &sweep->tail) + return; + + if (sweep->fill_rule == CAIRO_FILL_RULE_WINDING) { + do { + edge_t *left, *right; + int winding; + + left = pos; + winding = left->dir; + + right = left->next; + + /* Check if there is a co-linear edge with an existing trap */ + while (right->x == left->x) { + if (right->right != NULL) { + assert (left->right == NULL); + /* continuation on left */ + left->top = right->top; + left->right = right->right; + right->right = NULL; + } + winding += right->dir; + right = right->next; + } + + if (winding == 0) { + if (left->right != NULL) + edge_end_box (sweep, left, top); + pos = right; + continue; + } + + do { + /* End all subsumed traps */ + if (unlikely (right->right != NULL)) + edge_end_box (sweep, right, top); + + /* Greedily search for the closing edge, so that we generate + * the * maximal span width with the minimal number of + * boxes. + */ + winding += right->dir; + if (winding == 0 && right->x != right->next->x) + break; + + right = right->next; + } while (TRUE); + + edge_start_or_continue_box (sweep, left, right, top); + + pos = right->next; + } while (pos != &sweep->tail); + } else { + do { + edge_t *right = pos->next; + int count = 0; + + do { + /* End all subsumed traps */ + if (unlikely (right->right != NULL)) + edge_end_box (sweep, right, top); + + /* skip co-linear edges */ + if (++count & 1 && right->x != right->next->x) + break; + + right = right->next; + } while (TRUE); + + edge_start_or_continue_box (sweep, pos, right, top); + + pos = right->next; + } while (pos != &sweep->tail); + } + + sweep->last_y = sweep->current_y; +} + +static inline void +sweep_line_delete_edge (sweep_line_t *sweep, edge_t *edge) +{ + if (edge->right != NULL) { + edge_t *next = edge->next; + if (next->x == edge->x) { + next->top = edge->top; + next->right = edge->right; + } else + edge_end_box (sweep, edge, sweep->current_y); + } + + if (sweep->cursor == edge) + sweep->cursor = edge->prev; + + edge->prev->next = edge->next; + edge->next->prev = edge->prev; +} + +static inline cairo_bool_t +sweep_line_delete (sweep_line_t *sweep, rectangle_t *rectangle) +{ + cairo_bool_t update; + + update = TRUE; + if (sweep->fill_rule == CAIRO_FILL_RULE_WINDING && + rectangle->left.prev->dir == rectangle->left.dir) + { + update = rectangle->left.next != &rectangle->right; + } + + sweep_line_delete_edge (sweep, &rectangle->left); + sweep_line_delete_edge (sweep, &rectangle->right); + + rectangle_pop_stop (sweep); + return update; +} + +static inline void +sweep_line_insert (sweep_line_t *sweep, rectangle_t *rectangle) +{ + if (sweep->insert) + sweep->insert->prev = &rectangle->right; + rectangle->right.next = sweep->insert; + rectangle->right.prev = &rectangle->left; + rectangle->left.next = &rectangle->right; + rectangle->left.prev = NULL; + sweep->insert = &rectangle->left; + if (rectangle->left.x < sweep->insert_x) + sweep->insert_x = rectangle->left.x; + + pqueue_push (sweep, rectangle); +} + +static cairo_status_t +_cairo_bentley_ottmann_tessellate_rectangular (rectangle_t **rectangles, + int num_rectangles, + cairo_fill_rule_t fill_rule, + cairo_bool_t do_traps, + void *container) +{ + sweep_line_t sweep_line; + rectangle_t *rectangle; + cairo_status_t status; + cairo_bool_t update = FALSE; + + sweep_line_init (&sweep_line, + rectangles, num_rectangles, + fill_rule, + do_traps, container); + if ((status = setjmp (sweep_line.unwind))) + return status; + + rectangle = rectangle_pop_start (&sweep_line); + do { + if (rectangle->top != sweep_line.current_y) { + rectangle_t *stop; + + stop = rectangle_peek_stop (&sweep_line); + while (stop != NULL && stop->bottom < rectangle->top) { + if (stop->bottom != sweep_line.current_y) { + if (update) { + active_edges_to_traps (&sweep_line); + update = FALSE; + } + + sweep_line.current_y = stop->bottom; + } + + update |= sweep_line_delete (&sweep_line, stop); + stop = rectangle_peek_stop (&sweep_line); + } + + if (update) { + active_edges_to_traps (&sweep_line); + update = FALSE; + } + + sweep_line.current_y = rectangle->top; + } + + do { + sweep_line_insert (&sweep_line, rectangle); + } while ((rectangle = rectangle_pop_start (&sweep_line)) != NULL && + sweep_line.current_y == rectangle->top); + update = TRUE; + } while (rectangle); + + while ((rectangle = rectangle_peek_stop (&sweep_line)) != NULL) { + if (rectangle->bottom != sweep_line.current_y) { + if (update) { + active_edges_to_traps (&sweep_line); + update = FALSE; + } + sweep_line.current_y = rectangle->bottom; + } + + update |= sweep_line_delete (&sweep_line, rectangle); + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_bentley_ottmann_tessellate_rectangular_traps (cairo_traps_t *traps, + cairo_fill_rule_t fill_rule) +{ + rectangle_t stack_rectangles[CAIRO_STACK_ARRAY_LENGTH (rectangle_t)]; + rectangle_t *stack_rectangles_ptrs[ARRAY_LENGTH (stack_rectangles) + 3]; + rectangle_t *rectangles, **rectangles_ptrs; + cairo_status_t status; + int i; + + if (unlikely (traps->num_traps <= 1)) + return CAIRO_STATUS_SUCCESS; + + assert (traps->is_rectangular); + + dump_traps (traps, "bo-rects-traps-in.txt"); + + rectangles = stack_rectangles; + rectangles_ptrs = stack_rectangles_ptrs; + if (traps->num_traps > ARRAY_LENGTH (stack_rectangles)) { + rectangles = _cairo_malloc_ab_plus_c (traps->num_traps, + sizeof (rectangle_t) + + sizeof (rectangle_t *), + 3*sizeof (rectangle_t *)); + if (unlikely (rectangles == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + rectangles_ptrs = (rectangle_t **) (rectangles + traps->num_traps); + } + + for (i = 0; i < traps->num_traps; i++) { + if (traps->traps[i].left.p1.x < traps->traps[i].right.p1.x) { + rectangles[i].left.x = traps->traps[i].left.p1.x; + rectangles[i].left.dir = 1; + + rectangles[i].right.x = traps->traps[i].right.p1.x; + rectangles[i].right.dir = -1; + } else { + rectangles[i].right.x = traps->traps[i].left.p1.x; + rectangles[i].right.dir = 1; + + rectangles[i].left.x = traps->traps[i].right.p1.x; + rectangles[i].left.dir = -1; + } + + rectangles[i].left.right = NULL; + rectangles[i].right.right = NULL; + + rectangles[i].top = traps->traps[i].top; + rectangles[i].bottom = traps->traps[i].bottom; + + rectangles_ptrs[i+2] = &rectangles[i]; + } + /* XXX incremental sort */ + _rectangle_sort (rectangles_ptrs+2, i); + + _cairo_traps_clear (traps); + status = _cairo_bentley_ottmann_tessellate_rectangular (rectangles_ptrs+2, i, + fill_rule, + TRUE, traps); + traps->is_rectilinear = TRUE; + traps->is_rectangular = TRUE; + + if (rectangles != stack_rectangles) + free (rectangles); + + dump_traps (traps, "bo-rects-traps-out.txt"); + + return status; +} + +cairo_status_t +_cairo_bentley_ottmann_tessellate_boxes (const cairo_boxes_t *in, + cairo_fill_rule_t fill_rule, + cairo_boxes_t *out) +{ + rectangle_t stack_rectangles[CAIRO_STACK_ARRAY_LENGTH (rectangle_t)]; + rectangle_t *stack_rectangles_ptrs[ARRAY_LENGTH (stack_rectangles) + 3]; + rectangle_t *rectangles, **rectangles_ptrs; + rectangle_t *stack_rectangles_chain[CAIRO_STACK_ARRAY_LENGTH (rectangle_t *) ]; + rectangle_t **rectangles_chain = NULL; + const struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + int i, j, y_min, y_max; + + if (unlikely (in->num_boxes == 0)) { + _cairo_boxes_clear (out); + return CAIRO_STATUS_SUCCESS; + } + + if (in->num_boxes == 1) { + if (in == out) { + cairo_box_t *box = &in->chunks.base[0]; + + if (box->p1.x > box->p2.x) { + cairo_fixed_t tmp = box->p1.x; + box->p1.x = box->p2.x; + box->p2.x = tmp; + } + } else { + cairo_box_t box = in->chunks.base[0]; + + if (box.p1.x > box.p2.x) { + cairo_fixed_t tmp = box.p1.x; + box.p1.x = box.p2.x; + box.p2.x = tmp; + } + + _cairo_boxes_clear (out); + status = _cairo_boxes_add (out, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_STATUS_SUCCESS); + } + return CAIRO_STATUS_SUCCESS; + } + + y_min = INT_MAX; y_max = INT_MIN; + for (chunk = &in->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + if (box[i].p1.y < y_min) + y_min = box[i].p1.y; + if (box[i].p1.y > y_max) + y_max = box[i].p1.y; + } + } + y_min = _cairo_fixed_integer_floor (y_min); + y_max = _cairo_fixed_integer_floor (y_max) + 1; + y_max -= y_min; + + if (y_max < in->num_boxes) { + rectangles_chain = stack_rectangles_chain; + if (y_max > ARRAY_LENGTH (stack_rectangles_chain)) { + rectangles_chain = _cairo_malloc_ab (y_max, sizeof (rectangle_t *)); + if (unlikely (rectangles_chain == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + memset (rectangles_chain, 0, y_max * sizeof (rectangle_t*)); + } + + rectangles = stack_rectangles; + rectangles_ptrs = stack_rectangles_ptrs; + if (in->num_boxes > ARRAY_LENGTH (stack_rectangles)) { + rectangles = _cairo_malloc_ab_plus_c (in->num_boxes, + sizeof (rectangle_t) + + sizeof (rectangle_t *), + 3*sizeof (rectangle_t *)); + if (unlikely (rectangles == NULL)) { + if (rectangles_chain != stack_rectangles_chain) + free (rectangles_chain); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + rectangles_ptrs = (rectangle_t **) (rectangles + in->num_boxes); + } + + j = 0; + for (chunk = &in->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int h; + + if (box[i].p1.x < box[i].p2.x) { + rectangles[j].left.x = box[i].p1.x; + rectangles[j].left.dir = 1; + + rectangles[j].right.x = box[i].p2.x; + rectangles[j].right.dir = -1; + } else { + rectangles[j].right.x = box[i].p1.x; + rectangles[j].right.dir = 1; + + rectangles[j].left.x = box[i].p2.x; + rectangles[j].left.dir = -1; + } + + rectangles[j].left.right = NULL; + rectangles[j].right.right = NULL; + + rectangles[j].top = box[i].p1.y; + rectangles[j].bottom = box[i].p2.y; + + if (rectangles_chain) { + h = _cairo_fixed_integer_floor (box[i].p1.y) - y_min; + rectangles[j].left.next = (edge_t *)rectangles_chain[h]; + rectangles_chain[h] = &rectangles[j]; + } else { + rectangles_ptrs[j+2] = &rectangles[j]; + } + j++; + } + } + + if (rectangles_chain) { + j = 2; + for (y_min = 0; y_min < y_max; y_min++) { + rectangle_t *r; + int start = j; + for (r = rectangles_chain[y_min]; r; r = (rectangle_t *)r->left.next) + rectangles_ptrs[j++] = r; + if (j > start + 1) + _rectangle_sort (rectangles_ptrs + start, j - start); + } + + if (rectangles_chain != stack_rectangles_chain) + free (rectangles_chain); + + j -= 2; + } else { + _rectangle_sort (rectangles_ptrs + 2, j); + } + + _cairo_boxes_clear (out); + status = _cairo_bentley_ottmann_tessellate_rectangular (rectangles_ptrs+2, j, + fill_rule, + FALSE, out); + if (rectangles != stack_rectangles) + free (rectangles); + + return status; +} diff --git a/src/cairo-bentley-ottmann-rectilinear.c b/src/cairo-bentley-ottmann-rectilinear.c new file mode 100644 index 000000000..7c0be69b7 --- /dev/null +++ b/src/cairo-bentley-ottmann-rectilinear.c @@ -0,0 +1,600 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-boxes-private.h" +#include "cairo-combsort-inline.h" +#include "cairo-error-private.h" +#include "cairo-traps-private.h" + +typedef struct _cairo_bo_edge cairo_bo_edge_t; +typedef struct _cairo_bo_trap cairo_bo_trap_t; + +/* A deferred trapezoid of an edge */ +struct _cairo_bo_trap { + cairo_bo_edge_t *right; + int32_t top; +}; + +struct _cairo_bo_edge { + cairo_edge_t edge; + cairo_bo_edge_t *prev; + cairo_bo_edge_t *next; + cairo_bo_trap_t deferred_trap; +}; + +typedef enum { + CAIRO_BO_EVENT_TYPE_START, + CAIRO_BO_EVENT_TYPE_STOP +} cairo_bo_event_type_t; + +typedef struct _cairo_bo_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t *edge; +} cairo_bo_event_t; + +typedef struct _cairo_bo_sweep_line { + cairo_bo_event_t **events; + cairo_bo_edge_t *head; + cairo_bo_edge_t *stopped; + int32_t current_y; + cairo_bo_edge_t *current_edge; +} cairo_bo_sweep_line_t; + +static inline int +_cairo_point_compare (const cairo_point_t *a, + const cairo_point_t *b) +{ + int cmp; + + cmp = a->y - b->y; + if (likely (cmp)) + return cmp; + + return a->x - b->x; +} + +static inline int +_cairo_bo_edge_compare (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + int cmp; + + cmp = a->edge.line.p1.x - b->edge.line.p1.x; + if (likely (cmp)) + return cmp; + + return b->edge.bottom - a->edge.bottom; +} + +static inline int +cairo_bo_event_compare (const cairo_bo_event_t *a, + const cairo_bo_event_t *b) +{ + int cmp; + + cmp = _cairo_point_compare (&a->point, &b->point); + if (likely (cmp)) + return cmp; + + cmp = a->type - b->type; + if (cmp) + return cmp; + + return a - b; +} + +static inline cairo_bo_event_t * +_cairo_bo_event_dequeue (cairo_bo_sweep_line_t *sweep_line) +{ + return *sweep_line->events++; +} + +CAIRO_COMBSORT_DECLARE (_cairo_bo_event_queue_sort, + cairo_bo_event_t *, + cairo_bo_event_compare) + +static void +_cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_event_t **events, + int num_events) +{ + _cairo_bo_event_queue_sort (events, num_events); + events[num_events] = NULL; + sweep_line->events = events; + + sweep_line->head = NULL; + sweep_line->current_y = INT32_MIN; + sweep_line->current_edge = NULL; +} + +static void +_cairo_bo_sweep_line_insert (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (sweep_line->current_edge != NULL) { + cairo_bo_edge_t *prev, *next; + int cmp; + + cmp = _cairo_bo_edge_compare (sweep_line->current_edge, edge); + if (cmp < 0) { + prev = sweep_line->current_edge; + next = prev->next; + while (next != NULL && _cairo_bo_edge_compare (next, edge) < 0) + prev = next, next = prev->next; + + prev->next = edge; + edge->prev = prev; + edge->next = next; + if (next != NULL) + next->prev = edge; + } else if (cmp > 0) { + next = sweep_line->current_edge; + prev = next->prev; + while (prev != NULL && _cairo_bo_edge_compare (prev, edge) > 0) + next = prev, prev = next->prev; + + next->prev = edge; + edge->next = next; + edge->prev = prev; + if (prev != NULL) + prev->next = edge; + else + sweep_line->head = edge; + } else { + prev = sweep_line->current_edge; + edge->prev = prev; + edge->next = prev->next; + if (prev->next != NULL) + prev->next->prev = edge; + prev->next = edge; + } + } else { + sweep_line->head = edge; + } + + sweep_line->current_edge = edge; +} + +static void +_cairo_bo_sweep_line_delete (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (edge->prev != NULL) + edge->prev->next = edge->next; + else + sweep_line->head = edge->next; + + if (edge->next != NULL) + edge->next->prev = edge->prev; + + if (sweep_line->current_edge == edge) + sweep_line->current_edge = edge->prev ? edge->prev : edge->next; +} + +static inline cairo_bool_t +edges_collinear (const cairo_bo_edge_t *a, const cairo_bo_edge_t *b) +{ + return a->edge.line.p1.x == b->edge.line.p1.x; +} + +static cairo_status_t +_cairo_bo_edge_end_trap (cairo_bo_edge_t *left, + int32_t bot, + cairo_bool_t do_traps, + void *container) +{ + cairo_bo_trap_t *trap = &left->deferred_trap; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + /* Only emit (trivial) non-degenerate trapezoids with positive height. */ + if (likely (trap->top < bot)) { + if (do_traps) { + _cairo_traps_add_trap (container, + trap->top, bot, + &left->edge.line, &trap->right->edge.line); + status = _cairo_traps_status ((cairo_traps_t *) container); + } else { + cairo_box_t box; + + box.p1.x = left->edge.line.p1.x; + box.p1.y = trap->top; + box.p2.x = trap->right->edge.line.p1.x; + box.p2.y = bot; + status = _cairo_boxes_add (container, CAIRO_ANTIALIAS_DEFAULT, &box); + } + } + + trap->right = NULL; + + return status; +} + +/* Start a new trapezoid at the given top y coordinate, whose edges + * are `edge' and `edge->next'. If `edge' already has a trapezoid, + * then either add it to the traps in `traps', if the trapezoid's + * right edge differs from `edge->next', or do nothing if the new + * trapezoid would be a continuation of the existing one. */ +static inline cairo_status_t +_cairo_bo_edge_start_or_continue_trap (cairo_bo_edge_t *left, + cairo_bo_edge_t *right, + int top, + cairo_bool_t do_traps, + void *container) +{ + cairo_status_t status; + + if (left->deferred_trap.right == right) + return CAIRO_STATUS_SUCCESS; + + if (left->deferred_trap.right != NULL) { + if (right != NULL && edges_collinear (left->deferred_trap.right, right)) + { + /* continuation on right, so just swap edges */ + left->deferred_trap.right = right; + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_bo_edge_end_trap (left, top, do_traps, container); + if (unlikely (status)) + return status; + } + + if (right != NULL && ! edges_collinear (left, right)) { + left->deferred_trap.top = top; + left->deferred_trap.right = right; + } + + return CAIRO_STATUS_SUCCESS; +} + +static inline cairo_status_t +_active_edges_to_traps (cairo_bo_edge_t *left, + int32_t top, + cairo_fill_rule_t fill_rule, + cairo_bool_t do_traps, + void *container) +{ + cairo_bo_edge_t *right; + cairo_status_t status; + + if (fill_rule == CAIRO_FILL_RULE_WINDING) { + while (left != NULL) { + int in_out; + + /* Greedily search for the closing edge, so that we generate the + * maximal span width with the minimal number of trapezoids. + */ + in_out = left->edge.dir; + + /* Check if there is a co-linear edge with an existing trap */ + right = left->next; + if (left->deferred_trap.right == NULL) { + while (right != NULL && right->deferred_trap.right == NULL) + right = right->next; + + if (right != NULL && edges_collinear (left, right)) { + /* continuation on left */ + left->deferred_trap = right->deferred_trap; + right->deferred_trap.right = NULL; + } + } + + /* End all subsumed traps */ + right = left->next; + while (right != NULL) { + if (right->deferred_trap.right != NULL) { + status = _cairo_bo_edge_end_trap (right, top, do_traps, container); + if (unlikely (status)) + return status; + } + + in_out += right->edge.dir; + if (in_out == 0) { + /* skip co-linear edges */ + if (right->next == NULL || + ! edges_collinear (right, right->next)) + { + break; + } + } + + right = right->next; + } + + status = _cairo_bo_edge_start_or_continue_trap (left, right, top, + do_traps, container); + if (unlikely (status)) + return status; + + left = right; + if (left != NULL) + left = left->next; + } + } else { + while (left != NULL) { + int in_out = 0; + + right = left->next; + while (right != NULL) { + if (right->deferred_trap.right != NULL) { + status = _cairo_bo_edge_end_trap (right, top, do_traps, container); + if (unlikely (status)) + return status; + } + + if ((in_out++ & 1) == 0) { + cairo_bo_edge_t *next; + cairo_bool_t skip = FALSE; + + /* skip co-linear edges */ + next = right->next; + if (next != NULL) + skip = edges_collinear (right, next); + + if (! skip) + break; + } + + right = right->next; + } + + status = _cairo_bo_edge_start_or_continue_trap (left, right, top, + do_traps, container); + if (unlikely (status)) + return status; + + left = right; + if (left != NULL) + left = left->next; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_bentley_ottmann_tessellate_rectilinear (cairo_bo_event_t **start_events, + int num_events, + cairo_fill_rule_t fill_rule, + cairo_bool_t do_traps, + void *container) +{ + cairo_bo_sweep_line_t sweep_line; + cairo_bo_event_t *event; + cairo_status_t status; + + _cairo_bo_sweep_line_init (&sweep_line, start_events, num_events); + + while ((event = _cairo_bo_event_dequeue (&sweep_line))) { + if (event->point.y != sweep_line.current_y) { + status = _active_edges_to_traps (sweep_line.head, + sweep_line.current_y, + fill_rule, do_traps, container); + if (unlikely (status)) + return status; + + sweep_line.current_y = event->point.y; + } + + switch (event->type) { + case CAIRO_BO_EVENT_TYPE_START: + _cairo_bo_sweep_line_insert (&sweep_line, event->edge); + break; + + case CAIRO_BO_EVENT_TYPE_STOP: + _cairo_bo_sweep_line_delete (&sweep_line, event->edge); + + if (event->edge->deferred_trap.right != NULL) { + status = _cairo_bo_edge_end_trap (event->edge, + sweep_line.current_y, + do_traps, container); + if (unlikely (status)) + return status; + } + + break; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_bentley_ottmann_tessellate_rectilinear_polygon_to_boxes (const cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_boxes_t *boxes) +{ + cairo_status_t status; + cairo_bo_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_event_t)]; + cairo_bo_event_t *events; + cairo_bo_event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1]; + cairo_bo_event_t **event_ptrs; + cairo_bo_edge_t stack_edges[ARRAY_LENGTH (stack_events)]; + cairo_bo_edge_t *edges; + int num_events; + int i, j; + + if (unlikely (polygon->num_edges == 0)) + return CAIRO_STATUS_SUCCESS; + + num_events = 2 * polygon->num_edges; + + events = stack_events; + event_ptrs = stack_event_ptrs; + edges = stack_edges; + if (num_events > ARRAY_LENGTH (stack_events)) { + events = _cairo_malloc_ab_plus_c (num_events, + sizeof (cairo_bo_event_t) + + sizeof (cairo_bo_edge_t) + + sizeof (cairo_bo_event_t *), + sizeof (cairo_bo_event_t *)); + if (unlikely (events == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event_ptrs = (cairo_bo_event_t **) (events + num_events); + edges = (cairo_bo_edge_t *) (event_ptrs + num_events + 1); + } + + for (i = j = 0; i < polygon->num_edges; i++) { + edges[i].edge = polygon->edges[i]; + edges[i].deferred_trap.right = NULL; + edges[i].prev = NULL; + edges[i].next = NULL; + + event_ptrs[j] = &events[j]; + events[j].type = CAIRO_BO_EVENT_TYPE_START; + events[j].point.y = polygon->edges[i].top; + events[j].point.x = polygon->edges[i].line.p1.x; + events[j].edge = &edges[i]; + j++; + + event_ptrs[j] = &events[j]; + events[j].type = CAIRO_BO_EVENT_TYPE_STOP; + events[j].point.y = polygon->edges[i].bottom; + events[j].point.x = polygon->edges[i].line.p1.x; + events[j].edge = &edges[i]; + j++; + } + + status = _cairo_bentley_ottmann_tessellate_rectilinear (event_ptrs, j, + fill_rule, + FALSE, boxes); + if (events != stack_events) + free (events); + + return status; +} + +cairo_status_t +_cairo_bentley_ottmann_tessellate_rectilinear_traps (cairo_traps_t *traps, + cairo_fill_rule_t fill_rule) +{ + cairo_bo_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_event_t)]; + cairo_bo_event_t *events; + cairo_bo_event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1]; + cairo_bo_event_t **event_ptrs; + cairo_bo_edge_t stack_edges[ARRAY_LENGTH (stack_events)]; + cairo_bo_edge_t *edges; + cairo_status_t status; + int i, j, k; + + if (unlikely (traps->num_traps == 0)) + return CAIRO_STATUS_SUCCESS; + + assert (traps->is_rectilinear); + + i = 4 * traps->num_traps; + + events = stack_events; + event_ptrs = stack_event_ptrs; + edges = stack_edges; + if (i > ARRAY_LENGTH (stack_events)) { + events = _cairo_malloc_ab_plus_c (i, + sizeof (cairo_bo_event_t) + + sizeof (cairo_bo_edge_t) + + sizeof (cairo_bo_event_t *), + sizeof (cairo_bo_event_t *)); + if (unlikely (events == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event_ptrs = (cairo_bo_event_t **) (events + i); + edges = (cairo_bo_edge_t *) (event_ptrs + i + 1); + } + + for (i = j = k = 0; i < traps->num_traps; i++) { + edges[k].edge.top = traps->traps[i].top; + edges[k].edge.bottom = traps->traps[i].bottom; + edges[k].edge.line = traps->traps[i].left; + edges[k].edge.dir = 1; + edges[k].deferred_trap.right = NULL; + edges[k].prev = NULL; + edges[k].next = NULL; + + event_ptrs[j] = &events[j]; + events[j].type = CAIRO_BO_EVENT_TYPE_START; + events[j].point.y = traps->traps[i].top; + events[j].point.x = traps->traps[i].left.p1.x; + events[j].edge = &edges[k]; + j++; + + event_ptrs[j] = &events[j]; + events[j].type = CAIRO_BO_EVENT_TYPE_STOP; + events[j].point.y = traps->traps[i].bottom; + events[j].point.x = traps->traps[i].left.p1.x; + events[j].edge = &edges[k]; + j++; + k++; + + edges[k].edge.top = traps->traps[i].top; + edges[k].edge.bottom = traps->traps[i].bottom; + edges[k].edge.line = traps->traps[i].right; + edges[k].edge.dir = -1; + edges[k].deferred_trap.right = NULL; + edges[k].prev = NULL; + edges[k].next = NULL; + + event_ptrs[j] = &events[j]; + events[j].type = CAIRO_BO_EVENT_TYPE_START; + events[j].point.y = traps->traps[i].top; + events[j].point.x = traps->traps[i].right.p1.x; + events[j].edge = &edges[k]; + j++; + + event_ptrs[j] = &events[j]; + events[j].type = CAIRO_BO_EVENT_TYPE_STOP; + events[j].point.y = traps->traps[i].bottom; + events[j].point.x = traps->traps[i].right.p1.x; + events[j].edge = &edges[k]; + j++; + k++; + } + + _cairo_traps_clear (traps); + status = _cairo_bentley_ottmann_tessellate_rectilinear (event_ptrs, j, + fill_rule, + TRUE, traps); + traps->is_rectilinear = TRUE; + + if (events != stack_events) + free (events); + + return status; +} diff --git a/src/cairo-bentley-ottmann.c b/src/cairo-bentley-ottmann.c new file mode 100644 index 000000000..91e41f9c3 --- /dev/null +++ b/src/cairo-bentley-ottmann.c @@ -0,0 +1,1909 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-combsort-inline.h" +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-line-inline.h" +#include "cairo-traps-private.h" + +#define DEBUG_PRINT_STATE 0 +#define DEBUG_EVENTS 0 +#define DEBUG_TRAPS 0 + +typedef cairo_point_t cairo_bo_point32_t; + +typedef struct _cairo_bo_intersect_ordinate { + int32_t ordinate; + enum { EXACT, INEXACT } exactness; +} cairo_bo_intersect_ordinate_t; + +typedef struct _cairo_bo_intersect_point { + cairo_bo_intersect_ordinate_t x; + cairo_bo_intersect_ordinate_t y; +} cairo_bo_intersect_point_t; + +typedef struct _cairo_bo_edge cairo_bo_edge_t; +typedef struct _cairo_bo_trap cairo_bo_trap_t; + +/* A deferred trapezoid of an edge */ +struct _cairo_bo_trap { + cairo_bo_edge_t *right; + int32_t top; +}; + +struct _cairo_bo_edge { + cairo_edge_t edge; + cairo_bo_edge_t *prev; + cairo_bo_edge_t *next; + cairo_bo_edge_t *colinear; + cairo_bo_trap_t deferred_trap; +}; + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef enum { + CAIRO_BO_EVENT_TYPE_STOP, + CAIRO_BO_EVENT_TYPE_INTERSECTION, + CAIRO_BO_EVENT_TYPE_START +} cairo_bo_event_type_t; + +typedef struct _cairo_bo_event { + cairo_bo_event_type_t type; + cairo_point_t point; +} cairo_bo_event_t; + +typedef struct _cairo_bo_start_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t edge; +} cairo_bo_start_event_t; + +typedef struct _cairo_bo_queue_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t *e1; + cairo_bo_edge_t *e2; +} cairo_bo_queue_event_t; + +typedef struct _pqueue { + int size, max_size; + + cairo_bo_event_t **elements; + cairo_bo_event_t *elements_embedded[1024]; +} pqueue_t; + +typedef struct _cairo_bo_event_queue { + cairo_freepool_t pool; + pqueue_t pqueue; + cairo_bo_event_t **start_events; +} cairo_bo_event_queue_t; + +typedef struct _cairo_bo_sweep_line { + cairo_bo_edge_t *head; + cairo_bo_edge_t *stopped; + int32_t current_y; + cairo_bo_edge_t *current_edge; +} cairo_bo_sweep_line_t; + +#if DEBUG_TRAPS +static void +dump_traps (cairo_traps_t *traps, const char *filename) +{ + FILE *file; + cairo_box_t extents; + int n; + + if (getenv ("CAIRO_DEBUG_TRAPS") == NULL) + return; + +#if 0 + if (traps->has_limits) { + printf ("%s: limits=(%d, %d, %d, %d)\n", + filename, + traps->limits.p1.x, traps->limits.p1.y, + traps->limits.p2.x, traps->limits.p2.y); + } +#endif + _cairo_traps_extents (traps, &extents); + printf ("%s: extents=(%d, %d, %d, %d)\n", + filename, + extents.p1.x, extents.p1.y, + extents.p2.x, extents.p2.y); + + file = fopen (filename, "a"); + if (file != NULL) { + for (n = 0; n < traps->num_traps; n++) { + fprintf (file, "%d %d L:(%d, %d), (%d, %d) R:(%d, %d), (%d, %d)\n", + traps->traps[n].top, + traps->traps[n].bottom, + traps->traps[n].left.p1.x, + traps->traps[n].left.p1.y, + traps->traps[n].left.p2.x, + traps->traps[n].left.p2.y, + traps->traps[n].right.p1.x, + traps->traps[n].right.p1.y, + traps->traps[n].right.p2.x, + traps->traps[n].right.p2.y); + } + fprintf (file, "\n"); + fclose (file); + } +} + +static void +dump_edges (cairo_bo_start_event_t *events, + int num_edges, + const char *filename) +{ + FILE *file; + int n; + + if (getenv ("CAIRO_DEBUG_TRAPS") == NULL) + return; + + file = fopen (filename, "a"); + if (file != NULL) { + for (n = 0; n < num_edges; n++) { + fprintf (file, "(%d, %d), (%d, %d) %d %d %d\n", + events[n].edge.edge.line.p1.x, + events[n].edge.edge.line.p1.y, + events[n].edge.edge.line.p2.x, + events[n].edge.edge.line.p2.y, + events[n].edge.edge.top, + events[n].edge.edge.bottom, + events[n].edge.edge.dir); + } + fprintf (file, "\n"); + fclose (file); + } +} +#endif + +static cairo_fixed_t +_line_compute_intersection_x_for_y (const cairo_line_t *line, + cairo_fixed_t y) +{ + cairo_fixed_t x, dy; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + dy = line->p2.y - line->p1.y; + if (dy != 0) { + x += _cairo_fixed_mul_div_floor (y - line->p1.y, + line->p2.x - line->p1.x, + dy); + } + + return x; +} + +static inline int +_cairo_bo_point32_compare (cairo_bo_point32_t const *a, + cairo_bo_point32_t const *b) +{ + int cmp; + + cmp = a->y - b->y; + if (cmp) + return cmp; + + return a->x - b->x; +} + +/* Compare the slope of a to the slope of b, returning 1, 0, -1 if the + * slope a is respectively greater than, equal to, or less than the + * slope of b. + * + * For each edge, consider the direction vector formed from: + * + * top -> bottom + * + * which is: + * + * (dx, dy) = (line.p2.x - line.p1.x, line.p2.y - line.p1.y) + * + * We then define the slope of each edge as dx/dy, (which is the + * inverse of the slope typically used in math instruction). We never + * compute a slope directly as the value approaches infinity, but we + * can derive a slope comparison without division as follows, (where + * the ? represents our compare operator). + * + * 1. slope(a) ? slope(b) + * 2. adx/ady ? bdx/bdy + * 3. (adx * bdy) ? (bdx * ady) + * + * Note that from step 2 to step 3 there is no change needed in the + * sign of the result since both ady and bdy are guaranteed to be + * greater than or equal to 0. + * + * When using this slope comparison to sort edges, some care is needed + * when interpreting the results. Since the slope compare operates on + * distance vectors from top to bottom it gives a correct left to + * right sort for edges that have a common top point, (such as two + * edges with start events at the same location). On the other hand, + * the sense of the result will be exactly reversed for two edges that + * have a common stop point. + */ +static inline int +_slope_compare (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t adx = a->edge.line.p2.x - a->edge.line.p1.x; + int32_t bdx = b->edge.line.p2.x - b->edge.line.p1.x; + + /* Since the dy's are all positive by construction we can fast + * path several common cases. + */ + + /* First check for vertical lines. */ + if (adx == 0) + return -bdx; + if (bdx == 0) + return adx; + + /* Then where the two edges point in different directions wrt x. */ + if ((adx ^ bdx) < 0) + return adx; + + /* Finally we actually need to do the general comparison. */ + { + int32_t ady = a->edge.line.p2.y - a->edge.line.p1.y; + int32_t bdy = b->edge.line.p2.y - b->edge.line.p1.y; + cairo_int64_t adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + cairo_int64_t bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } +} + + +/* + * We need to compare the x-coordinate of a line for a particular y wrt to a + * given x, without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ X + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy (and (Y - A_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * (Y - A_y) * A_dx ∘ (X - A_x) * A_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 64 bit arithmetic. + * + * See the similar discussion for _slope_compare() and + * edges_compare_x_for_y_general(). + */ +static int +edge_compare_for_y_against_x (const cairo_bo_edge_t *a, + int32_t y, + int32_t x) +{ + int32_t adx, ady; + int32_t dx, dy; + cairo_int64_t L, R; + + if (x < a->edge.line.p1.x && x < a->edge.line.p2.x) + return 1; + if (x > a->edge.line.p1.x && x > a->edge.line.p2.x) + return -1; + + adx = a->edge.line.p2.x - a->edge.line.p1.x; + dx = x - a->edge.line.p1.x; + + if (adx == 0) + return -dx; + if (dx == 0 || (adx ^ dx) < 0) + return adx; + + dy = y - a->edge.line.p1.y; + ady = a->edge.line.p2.y - a->edge.line.p1.y; + + L = _cairo_int32x32_64_mul (dy, adx); + R = _cairo_int32x32_64_mul (dx, ady); + + return _cairo_int64_cmp (L, R); +} + +static inline int +_cairo_bo_sweep_line_compare_edges (const cairo_bo_sweep_line_t *sweep_line, + const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + int cmp; + + cmp = cairo_lines_compare_at_y (&a->edge.line, + &b->edge.line, + sweep_line->current_y); + if (cmp) + return cmp; + + /* We've got two collinear edges now. */ + return b->edge.bottom - a->edge.bottom; +} + +static inline cairo_int64_t +det32_64 (int32_t a, int32_t b, + int32_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int64_sub (_cairo_int32x32_64_mul (a, d), + _cairo_int32x32_64_mul (b, c)); +} + +static inline cairo_int128_t +det64x32_128 (cairo_int64_t a, int32_t b, + cairo_int64_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int128_sub (_cairo_int64x32_128_mul (a, d), + _cairo_int64x32_128_mul (c, b)); +} + +/* Compute the intersection of two lines as defined by two edges. The + * result is provided as a coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection or + * %CAIRO_BO_STATUS_PARALLEL if the two lines are exactly parallel. + */ +static cairo_bool_t +intersect_lines (cairo_bo_edge_t *a, + cairo_bo_edge_t *b, + cairo_bo_intersect_point_t *intersection) +{ + cairo_int64_t a_det, b_det; + + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm begins. + * What we're doing to mitigate this is to perform clamping in + * cairo_bo_tessellate_polygon(). + */ + int32_t dx1 = a->edge.line.p1.x - a->edge.line.p2.x; + int32_t dy1 = a->edge.line.p1.y - a->edge.line.p2.y; + + int32_t dx2 = b->edge.line.p1.x - b->edge.line.p2.x; + int32_t dy2 = b->edge.line.p1.y - b->edge.line.p2.y; + + cairo_int64_t den_det; + cairo_int64_t R; + cairo_quorem64_t qr; + + den_det = det32_64 (dx1, dy1, dx2, dy2); + + /* Q: Can we determine that the lines do not intersect (within range) + * much more cheaply than computing the intersection point i.e. by + * avoiding the division? + * + * X = ax + t * adx = bx + s * bdx; + * Y = ay + t * ady = by + s * bdy; + * ∴ t * (ady*bdx - bdy*adx) = bdx * (by - ay) + bdy * (ax - bx) + * => t * L = R + * + * Therefore we can reject any intersection (under the criteria for + * valid intersection events) if: + * L^R < 0 => t < 0, or + * L t > 1 + * + * (where top/bottom must at least extend to the line endpoints). + * + * A similar substitution can be performed for s, yielding: + * s * (ady*bdx - bdy*adx) = ady * (ax - bx) - adx * (ay - by) + */ + R = det32_64 (dx2, dy2, + b->edge.line.p1.x - a->edge.line.p1.x, + b->edge.line.p1.y - a->edge.line.p1.y); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + R = det32_64 (dy1, dx1, + a->edge.line.p1.y - b->edge.line.p1.y, + a->edge.line.p1.x - b->edge.line.p1.x); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + /* We now know that the two lines should intersect within range. */ + + a_det = det32_64 (a->edge.line.p1.x, a->edge.line.p1.y, + a->edge.line.p2.x, a->edge.line.p2.y); + b_det = det32_64 (b->edge.line.p1.x, b->edge.line.p1.y, + b->edge.line.p2.x, b->edge.line.p2.y); + + /* x = det (a_det, dx1, b_det, dx2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dx1, + b_det, dx2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->x.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->x.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->x.exactness = INEXACT; + } +#endif + intersection->x.ordinate = _cairo_int64_to_int32 (qr.quo); + + /* y = det (a_det, dy1, b_det, dy2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dy1, + b_det, dy2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->y.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->y.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->y.exactness = INEXACT; + } +#endif + intersection->y.ordinate = _cairo_int64_to_int32 (qr.quo); + + return TRUE; +} + +static int +_cairo_bo_intersect_ordinate_32_compare (cairo_bo_intersect_ordinate_t a, + int32_t b) +{ + /* First compare the quotient */ + if (a.ordinate > b) + return +1; + if (a.ordinate < b) + return -1; + /* With quotient identical, if remainder is 0 then compare equal */ + /* Otherwise, the non-zero remainder makes a > b */ + return INEXACT == a.exactness; +} + +/* Does the given edge contain the given point. The point must already + * be known to be contained within the line determined by the edge, + * (most likely the point results from an intersection of this edge + * with another). + * + * If we had exact arithmetic, then this function would simply be a + * matter of examining whether the y value of the point lies within + * the range of y values of the edge. But since intersection points + * are not exact due to being rounded to the nearest integer within + * the available precision, we must also examine the x value of the + * point. + * + * The definition of "contains" here is that the given intersection + * point will be seen by the sweep line after the start event for the + * given edge and before the stop event for the edge. See the comments + * in the implementation for more details. + */ +static cairo_bool_t +_cairo_bo_edge_contains_intersect_point (cairo_bo_edge_t *edge, + cairo_bo_intersect_point_t *point) +{ + int cmp_top, cmp_bottom; + + /* XXX: When running the actual algorithm, we don't actually need to + * compare against edge->top at all here, since any intersection above + * top is eliminated early via a slope comparison. We're leaving these + * here for now only for the sake of the quadratic-time intersection + * finder which needs them. + */ + + cmp_top = _cairo_bo_intersect_ordinate_32_compare (point->y, + edge->edge.top); + cmp_bottom = _cairo_bo_intersect_ordinate_32_compare (point->y, + edge->edge.bottom); + + if (cmp_top < 0 || cmp_bottom > 0) + { + return FALSE; + } + + if (cmp_top > 0 && cmp_bottom < 0) + { + return TRUE; + } + + /* At this stage, the point lies on the same y value as either + * edge->top or edge->bottom, so we have to examine the x value in + * order to properly determine containment. */ + + /* If the y value of the point is the same as the y value of the + * top of the edge, then the x value of the point must be greater + * to be considered as inside the edge. Similarly, if the y value + * of the point is the same as the y value of the bottom of the + * edge, then the x value of the point must be less to be + * considered as inside. */ + + if (cmp_top == 0) { + cairo_fixed_t top_x; + + top_x = _line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.top); + return _cairo_bo_intersect_ordinate_32_compare (point->x, top_x) > 0; + } else { /* cmp_bottom == 0 */ + cairo_fixed_t bot_x; + + bot_x = _line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.bottom); + return _cairo_bo_intersect_ordinate_32_compare (point->x, bot_x) < 0; + } +} + +/* Compute the intersection of two edges. The result is provided as a + * coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection + * that is within both edges, %CAIRO_BO_STATUS_NO_INTERSECTION if the + * intersection of the lines defined by the edges occurs outside of + * one or both edges, and %CAIRO_BO_STATUS_PARALLEL if the two edges + * are exactly parallel. + * + * Note that when determining if a candidate intersection is "inside" + * an edge, we consider both the infinitesimal shortening and the + * infinitesimal tilt rules described by John Hobby. Specifically, if + * the intersection is exactly the same as an edge point, it is + * effectively outside (no intersection is returned). Also, if the + * intersection point has the same + */ +static cairo_bool_t +_cairo_bo_edge_intersect (cairo_bo_edge_t *a, + cairo_bo_edge_t *b, + cairo_bo_point32_t *intersection) +{ + cairo_bo_intersect_point_t quorem; + + if (! intersect_lines (a, b, &quorem)) + return FALSE; + + if (! _cairo_bo_edge_contains_intersect_point (a, &quorem)) + return FALSE; + + if (! _cairo_bo_edge_contains_intersect_point (b, &quorem)) + return FALSE; + + /* Now that we've correctly compared the intersection point and + * determined that it lies within the edge, then we know that we + * no longer need any more bits of storage for the intersection + * than we do for our edge coordinates. We also no longer need the + * remainder from the division. */ + intersection->x = quorem.x.ordinate; + intersection->y = quorem.y.ordinate; + + return TRUE; +} + +static inline int +cairo_bo_event_compare (const cairo_bo_event_t *a, + const cairo_bo_event_t *b) +{ + int cmp; + + cmp = _cairo_bo_point32_compare (&a->point, &b->point); + if (cmp) + return cmp; + + cmp = a->type - b->type; + if (cmp) + return cmp; + + return a - b; +} + +static inline void +_pqueue_init (pqueue_t *pq) +{ + pq->max_size = ARRAY_LENGTH (pq->elements_embedded); + pq->size = 0; + + pq->elements = pq->elements_embedded; +} + +static inline void +_pqueue_fini (pqueue_t *pq) +{ + if (pq->elements != pq->elements_embedded) + free (pq->elements); +} + +static cairo_status_t +_pqueue_grow (pqueue_t *pq) +{ + cairo_bo_event_t **new_elements; + pq->max_size *= 2; + + if (pq->elements == pq->elements_embedded) { + new_elements = _cairo_malloc_ab (pq->max_size, + sizeof (cairo_bo_event_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (new_elements, pq->elements_embedded, + sizeof (pq->elements_embedded)); + } else { + new_elements = _cairo_realloc_ab (pq->elements, + pq->max_size, + sizeof (cairo_bo_event_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pq->elements = new_elements; + return CAIRO_STATUS_SUCCESS; +} + +static inline cairo_status_t +_pqueue_push (pqueue_t *pq, cairo_bo_event_t *event) +{ + cairo_bo_event_t **elements; + int i, parent; + + if (unlikely (pq->size + 1 == pq->max_size)) { + cairo_status_t status; + + status = _pqueue_grow (pq); + if (unlikely (status)) + return status; + } + + elements = pq->elements; + + for (i = ++pq->size; + i != PQ_FIRST_ENTRY && + cairo_bo_event_compare (event, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = event; + + return CAIRO_STATUS_SUCCESS; +} + +static inline void +_pqueue_pop (pqueue_t *pq) +{ + cairo_bo_event_t **elements = pq->elements; + cairo_bo_event_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + cairo_bo_event_compare (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (cairo_bo_event_compare (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline cairo_status_t +_cairo_bo_event_queue_insert (cairo_bo_event_queue_t *queue, + cairo_bo_event_type_t type, + cairo_bo_edge_t *e1, + cairo_bo_edge_t *e2, + const cairo_point_t *point) +{ + cairo_bo_queue_event_t *event; + + event = _cairo_freepool_alloc (&queue->pool); + if (unlikely (event == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event->type = type; + event->e1 = e1; + event->e2 = e2; + event->point = *point; + + return _pqueue_push (&queue->pqueue, (cairo_bo_event_t *) event); +} + +static void +_cairo_bo_event_queue_delete (cairo_bo_event_queue_t *queue, + cairo_bo_event_t *event) +{ + _cairo_freepool_free (&queue->pool, event); +} + +static cairo_bo_event_t * +_cairo_bo_event_dequeue (cairo_bo_event_queue_t *event_queue) +{ + cairo_bo_event_t *event, *cmp; + + event = event_queue->pqueue.elements[PQ_FIRST_ENTRY]; + cmp = *event_queue->start_events; + if (event == NULL || + (cmp != NULL && cairo_bo_event_compare (cmp, event) < 0)) + { + event = cmp; + event_queue->start_events++; + } + else + { + _pqueue_pop (&event_queue->pqueue); + } + + return event; +} + +CAIRO_COMBSORT_DECLARE (_cairo_bo_event_queue_sort, + cairo_bo_event_t *, + cairo_bo_event_compare) + +static void +_cairo_bo_event_queue_init (cairo_bo_event_queue_t *event_queue, + cairo_bo_event_t **start_events, + int num_events) +{ + event_queue->start_events = start_events; + + _cairo_freepool_init (&event_queue->pool, + sizeof (cairo_bo_queue_event_t)); + _pqueue_init (&event_queue->pqueue); + event_queue->pqueue.elements[PQ_FIRST_ENTRY] = NULL; +} + +static cairo_status_t +_cairo_bo_event_queue_insert_stop (cairo_bo_event_queue_t *event_queue, + cairo_bo_edge_t *edge) +{ + cairo_bo_point32_t point; + + point.y = edge->edge.bottom; + point.x = _line_compute_intersection_x_for_y (&edge->edge.line, + point.y); + return _cairo_bo_event_queue_insert (event_queue, + CAIRO_BO_EVENT_TYPE_STOP, + edge, NULL, + &point); +} + +static void +_cairo_bo_event_queue_fini (cairo_bo_event_queue_t *event_queue) +{ + _pqueue_fini (&event_queue->pqueue); + _cairo_freepool_fini (&event_queue->pool); +} + +static inline cairo_status_t +_cairo_bo_event_queue_insert_if_intersect_below_current_y (cairo_bo_event_queue_t *event_queue, + cairo_bo_edge_t *left, + cairo_bo_edge_t *right) +{ + cairo_bo_point32_t intersection; + + if (MAX (left->edge.line.p1.x, left->edge.line.p2.x) <= + MIN (right->edge.line.p1.x, right->edge.line.p2.x)) + return CAIRO_STATUS_SUCCESS; + + if (cairo_lines_equal (&left->edge.line, &right->edge.line)) + return CAIRO_STATUS_SUCCESS; + + /* The names "left" and "right" here are correct descriptions of + * the order of the two edges within the active edge list. So if a + * slope comparison also puts left less than right, then we know + * that the intersection of these two segments has already + * occurred before the current sweep line position. */ + if (_slope_compare (left, right) <= 0) + return CAIRO_STATUS_SUCCESS; + + if (! _cairo_bo_edge_intersect (left, right, &intersection)) + return CAIRO_STATUS_SUCCESS; + + return _cairo_bo_event_queue_insert (event_queue, + CAIRO_BO_EVENT_TYPE_INTERSECTION, + left, right, + &intersection); +} + +static void +_cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line) +{ + sweep_line->head = NULL; + sweep_line->stopped = NULL; + sweep_line->current_y = INT32_MIN; + sweep_line->current_edge = NULL; +} + +static void +_cairo_bo_sweep_line_insert (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (sweep_line->current_edge != NULL) { + cairo_bo_edge_t *prev, *next; + int cmp; + + cmp = _cairo_bo_sweep_line_compare_edges (sweep_line, + sweep_line->current_edge, + edge); + if (cmp < 0) { + prev = sweep_line->current_edge; + next = prev->next; + while (next != NULL && + _cairo_bo_sweep_line_compare_edges (sweep_line, + next, edge) < 0) + { + prev = next, next = prev->next; + } + + prev->next = edge; + edge->prev = prev; + edge->next = next; + if (next != NULL) + next->prev = edge; + } else if (cmp > 0) { + next = sweep_line->current_edge; + prev = next->prev; + while (prev != NULL && + _cairo_bo_sweep_line_compare_edges (sweep_line, + prev, edge) > 0) + { + next = prev, prev = next->prev; + } + + next->prev = edge; + edge->next = next; + edge->prev = prev; + if (prev != NULL) + prev->next = edge; + else + sweep_line->head = edge; + } else { + prev = sweep_line->current_edge; + edge->prev = prev; + edge->next = prev->next; + if (prev->next != NULL) + prev->next->prev = edge; + prev->next = edge; + } + } else { + sweep_line->head = edge; + edge->next = NULL; + } + + sweep_line->current_edge = edge; +} + +static void +_cairo_bo_sweep_line_delete (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (edge->prev != NULL) + edge->prev->next = edge->next; + else + sweep_line->head = edge->next; + + if (edge->next != NULL) + edge->next->prev = edge->prev; + + if (sweep_line->current_edge == edge) + sweep_line->current_edge = edge->prev ? edge->prev : edge->next; +} + +static void +_cairo_bo_sweep_line_swap (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *left, + cairo_bo_edge_t *right) +{ + if (left->prev != NULL) + left->prev->next = right; + else + sweep_line->head = right; + + if (right->next != NULL) + right->next->prev = left; + + left->next = right->next; + right->next = left; + + right->prev = left->prev; + left->prev = right; +} + +#if DEBUG_PRINT_STATE +static void +_cairo_bo_edge_print (cairo_bo_edge_t *edge) +{ + printf ("(0x%x, 0x%x)-(0x%x, 0x%x)", + edge->edge.line.p1.x, edge->edge.line.p1.y, + edge->edge.line.p2.x, edge->edge.line.p2.y); +} + +static void +_cairo_bo_event_print (cairo_bo_event_t *event) +{ + switch (event->type) { + case CAIRO_BO_EVENT_TYPE_START: + printf ("Start: "); + break; + case CAIRO_BO_EVENT_TYPE_STOP: + printf ("Stop: "); + break; + case CAIRO_BO_EVENT_TYPE_INTERSECTION: + printf ("Intersection: "); + break; + } + printf ("(%d, %d)\t", event->point.x, event->point.y); + _cairo_bo_edge_print (event->e1); + if (event->type == CAIRO_BO_EVENT_TYPE_INTERSECTION) { + printf (" X "); + _cairo_bo_edge_print (event->e2); + } + printf ("\n"); +} + +static void +_cairo_bo_event_queue_print (cairo_bo_event_queue_t *event_queue) +{ + /* XXX: fixme to print the start/stop array too. */ + printf ("Event queue:\n"); +} + +static void +_cairo_bo_sweep_line_print (cairo_bo_sweep_line_t *sweep_line) +{ + cairo_bool_t first = TRUE; + cairo_bo_edge_t *edge; + + printf ("Sweep line from edge list: "); + first = TRUE; + for (edge = sweep_line->head; + edge; + edge = edge->next) + { + if (!first) + printf (", "); + _cairo_bo_edge_print (edge); + first = FALSE; + } + printf ("\n"); +} + +static void +print_state (const char *msg, + cairo_bo_event_t *event, + cairo_bo_event_queue_t *event_queue, + cairo_bo_sweep_line_t *sweep_line) +{ + printf ("%s ", msg); + _cairo_bo_event_print (event); + _cairo_bo_event_queue_print (event_queue); + _cairo_bo_sweep_line_print (sweep_line); + printf ("\n"); +} +#endif + +#if DEBUG_EVENTS +static void CAIRO_PRINTF_FORMAT (1, 2) +event_log (const char *fmt, ...) +{ + FILE *file; + + if (getenv ("CAIRO_DEBUG_EVENTS") == NULL) + return; + + file = fopen ("bo-events.txt", "a"); + if (file != NULL) { + va_list ap; + + va_start (ap, fmt); + vfprintf (file, fmt, ap); + va_end (ap); + + fclose (file); + } +} +#endif + +#define HAS_COLINEAR(a, b) ((cairo_bo_edge_t *)(((uintptr_t)(a))&~1) == (b)) +#define IS_COLINEAR(e) (((uintptr_t)(e))&1) +#define MARK_COLINEAR(e, v) ((cairo_bo_edge_t *)(((uintptr_t)(e))|(v))) + +static inline cairo_bool_t +edges_colinear (cairo_bo_edge_t *a, const cairo_bo_edge_t *b) +{ + unsigned p; + + if (HAS_COLINEAR(a->colinear, b)) + return IS_COLINEAR(a->colinear); + + if (HAS_COLINEAR(b->colinear, a)) { + p = IS_COLINEAR(b->colinear); + a->colinear = MARK_COLINEAR(b, p); + return p; + } + + p = 0; + p |= (a->edge.line.p1.x == b->edge.line.p1.x) << 0; + p |= (a->edge.line.p1.y == b->edge.line.p1.y) << 1; + p |= (a->edge.line.p2.x == b->edge.line.p2.x) << 3; + p |= (a->edge.line.p2.y == b->edge.line.p2.y) << 4; + if (p == ((1 << 0) | (1 << 1) | (1 << 3) | (1 << 4))) { + a->colinear = MARK_COLINEAR(b, 1); + return TRUE; + } + + if (_slope_compare (a, b)) { + a->colinear = MARK_COLINEAR(b, 0); + return FALSE; + } + + /* The choice of y is not truly arbitrary since we must guarantee that it + * is greater than the start of either line. + */ + if (p != 0) { + /* colinear if either end-point are coincident */ + p = (((p >> 1) & p) & 5) != 0; + } else if (a->edge.line.p1.y < b->edge.line.p1.y) { + p = edge_compare_for_y_against_x (b, + a->edge.line.p1.y, + a->edge.line.p1.x) == 0; + } else { + p = edge_compare_for_y_against_x (a, + b->edge.line.p1.y, + b->edge.line.p1.x) == 0; + } + + a->colinear = MARK_COLINEAR(b, p); + return p; +} + +/* Adds the trapezoid, if any, of the left edge to the #cairo_traps_t */ +static void +_cairo_bo_edge_end_trap (cairo_bo_edge_t *left, + int32_t bot, + cairo_traps_t *traps) +{ + cairo_bo_trap_t *trap = &left->deferred_trap; + + /* Only emit (trivial) non-degenerate trapezoids with positive height. */ + if (likely (trap->top < bot)) { + _cairo_traps_add_trap (traps, + trap->top, bot, + &left->edge.line, &trap->right->edge.line); + +#if DEBUG_PRINT_STATE + printf ("Deferred trap: left=(%x, %x)-(%x,%x) " + "right=(%x,%x)-(%x,%x) top=%x, bot=%x\n", + left->edge.line.p1.x, left->edge.line.p1.y, + left->edge.line.p2.x, left->edge.line.p2.y, + trap->right->edge.line.p1.x, trap->right->edge.line.p1.y, + trap->right->edge.line.p2.x, trap->right->edge.line.p2.y, + trap->top, bot); +#endif +#if DEBUG_EVENTS + event_log ("end trap: %lu %lu %d %d\n", + (long) left, + (long) trap->right, + trap->top, + bot); +#endif + } + + trap->right = NULL; +} + + +/* Start a new trapezoid at the given top y coordinate, whose edges + * are `edge' and `edge->next'. If `edge' already has a trapezoid, + * then either add it to the traps in `traps', if the trapezoid's + * right edge differs from `edge->next', or do nothing if the new + * trapezoid would be a continuation of the existing one. */ +static inline void +_cairo_bo_edge_start_or_continue_trap (cairo_bo_edge_t *left, + cairo_bo_edge_t *right, + int top, + cairo_traps_t *traps) +{ + if (left->deferred_trap.right == right) + return; + + assert (right); + if (left->deferred_trap.right != NULL) { + if (edges_colinear (left->deferred_trap.right, right)) + { + /* continuation on right, so just swap edges */ + left->deferred_trap.right = right; + return; + } + + _cairo_bo_edge_end_trap (left, top, traps); + } + + if (! edges_colinear (left, right)) { + left->deferred_trap.top = top; + left->deferred_trap.right = right; + +#if DEBUG_EVENTS + event_log ("begin trap: %lu %lu %d\n", + (long) left, + (long) right, + top); +#endif + } +} + +static inline void +_active_edges_to_traps (cairo_bo_edge_t *pos, + int32_t top, + unsigned mask, + cairo_traps_t *traps) +{ + cairo_bo_edge_t *left; + int in_out; + + +#if DEBUG_PRINT_STATE + printf ("Processing active edges for %x\n", top); +#endif + + in_out = 0; + left = pos; + while (pos != NULL) { + if (pos != left && pos->deferred_trap.right) { + /* XXX It shouldn't be possible to here with 2 deferred traps + * on colinear edges... See bug-bo-rictoz. + */ + if (left->deferred_trap.right == NULL && + edges_colinear (left, pos)) + { + /* continuation on left */ + left->deferred_trap = pos->deferred_trap; + pos->deferred_trap.right = NULL; + } + else + { + _cairo_bo_edge_end_trap (pos, top, traps); + } + } + + in_out += pos->edge.dir; + if ((in_out & mask) == 0) { + /* skip co-linear edges */ + if (pos->next == NULL || ! edges_colinear (pos, pos->next)) { + _cairo_bo_edge_start_or_continue_trap (left, pos, top, traps); + left = pos->next; + } + } + + pos = pos->next; + } +} + +/* Execute a single pass of the Bentley-Ottmann algorithm on edges, + * generating trapezoids according to the fill_rule and appending them + * to traps. */ +static cairo_status_t +_cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events, + int num_events, + unsigned fill_rule, + cairo_traps_t *traps, + int *num_intersections) +{ + cairo_status_t status; + int intersection_count = 0; + cairo_bo_event_queue_t event_queue; + cairo_bo_sweep_line_t sweep_line; + cairo_bo_event_t *event; + cairo_bo_edge_t *left, *right; + cairo_bo_edge_t *e1, *e2; + + /* convert the fill_rule into a winding mask */ + if (fill_rule == CAIRO_FILL_RULE_WINDING) + fill_rule = (unsigned) -1; + else + fill_rule = 1; + +#if DEBUG_EVENTS + { + int i; + + for (i = 0; i < num_events; i++) { + cairo_bo_start_event_t *event = + ((cairo_bo_start_event_t **) start_events)[i]; + event_log ("edge: %lu (%d, %d) (%d, %d) (%d, %d) %d\n", + (long) &events[i].edge, + event->edge.edge.line.p1.x, + event->edge.edge.line.p1.y, + event->edge.edge.line.p2.x, + event->edge.edge.line.p2.y, + event->edge.top, + event->edge.bottom, + event->edge.edge.dir); + } + } +#endif + + _cairo_bo_event_queue_init (&event_queue, start_events, num_events); + _cairo_bo_sweep_line_init (&sweep_line); + + while ((event = _cairo_bo_event_dequeue (&event_queue))) { + if (event->point.y != sweep_line.current_y) { + for (e1 = sweep_line.stopped; e1; e1 = e1->next) { + if (e1->deferred_trap.right != NULL) { + _cairo_bo_edge_end_trap (e1, + e1->edge.bottom, + traps); + } + } + sweep_line.stopped = NULL; + + _active_edges_to_traps (sweep_line.head, + sweep_line.current_y, + fill_rule, traps); + + sweep_line.current_y = event->point.y; + } + +#if DEBUG_EVENTS + event_log ("event: %d (%ld, %ld) %lu, %lu\n", + event->type, + (long) event->point.x, + (long) event->point.y, + (long) event->e1, + (long) event->e2); +#endif + + switch (event->type) { + case CAIRO_BO_EVENT_TYPE_START: + e1 = &((cairo_bo_start_event_t *) event)->edge; + + _cairo_bo_sweep_line_insert (&sweep_line, e1); + + status = _cairo_bo_event_queue_insert_stop (&event_queue, e1); + if (unlikely (status)) + goto unwind; + + /* check to see if this is a continuation of a stopped edge */ + /* XXX change to an infinitesimal lengthening rule */ + for (left = sweep_line.stopped; left; left = left->next) { + if (e1->edge.top <= left->edge.bottom && + edges_colinear (e1, left)) + { + e1->deferred_trap = left->deferred_trap; + if (left->prev != NULL) + left->prev = left->next; + else + sweep_line.stopped = left->next; + if (left->next != NULL) + left->next->prev = left->prev; + break; + } + } + + left = e1->prev; + right = e1->next; + + if (left != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, e1); + if (unlikely (status)) + goto unwind; + } + + if (right != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, e1, right); + if (unlikely (status)) + goto unwind; + } + + break; + + case CAIRO_BO_EVENT_TYPE_STOP: + e1 = ((cairo_bo_queue_event_t *) event)->e1; + _cairo_bo_event_queue_delete (&event_queue, event); + + left = e1->prev; + right = e1->next; + + _cairo_bo_sweep_line_delete (&sweep_line, e1); + + /* first, check to see if we have a continuation via a fresh edge */ + if (e1->deferred_trap.right != NULL) { + e1->next = sweep_line.stopped; + if (sweep_line.stopped != NULL) + sweep_line.stopped->prev = e1; + sweep_line.stopped = e1; + e1->prev = NULL; + } + + if (left != NULL && right != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, right); + if (unlikely (status)) + goto unwind; + } + + break; + + case CAIRO_BO_EVENT_TYPE_INTERSECTION: + e1 = ((cairo_bo_queue_event_t *) event)->e1; + e2 = ((cairo_bo_queue_event_t *) event)->e2; + _cairo_bo_event_queue_delete (&event_queue, event); + + /* skip this intersection if its edges are not adjacent */ + if (e2 != e1->next) + break; + + intersection_count++; + + left = e1->prev; + right = e2->next; + + _cairo_bo_sweep_line_swap (&sweep_line, e1, e2); + + /* after the swap e2 is left of e1 */ + + if (left != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, e2); + if (unlikely (status)) + goto unwind; + } + + if (right != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, e1, right); + if (unlikely (status)) + goto unwind; + } + + break; + } + } + + *num_intersections = intersection_count; + for (e1 = sweep_line.stopped; e1; e1 = e1->next) { + if (e1->deferred_trap.right != NULL) { + _cairo_bo_edge_end_trap (e1, e1->edge.bottom, traps); + } + } + status = traps->status; + unwind: + _cairo_bo_event_queue_fini (&event_queue); + +#if DEBUG_EVENTS + event_log ("\n"); +#endif + + return status; +} + +cairo_status_t +_cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps, + const cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule) +{ + int intersections; + cairo_bo_start_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_start_event_t)]; + cairo_bo_start_event_t *events; + cairo_bo_event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1]; + cairo_bo_event_t **event_ptrs; + cairo_bo_start_event_t *stack_event_y[64]; + cairo_bo_start_event_t **event_y = NULL; + int i, num_events, y, ymin, ymax; + cairo_status_t status; + + num_events = polygon->num_edges; + if (unlikely (0 == num_events)) + return CAIRO_STATUS_SUCCESS; + + if (polygon->num_limits) { + ymin = _cairo_fixed_integer_floor (polygon->limit.p1.y); + ymax = _cairo_fixed_integer_ceil (polygon->limit.p2.y) - ymin; + + if (ymax > 64) + event_y = _cairo_malloc_ab(sizeof (cairo_bo_event_t*), ymax); + else + event_y = stack_event_y; + memset (event_y, 0, ymax * sizeof(cairo_bo_event_t *)); + } + + events = stack_events; + event_ptrs = stack_event_ptrs; + if (num_events > ARRAY_LENGTH (stack_events)) { + events = _cairo_malloc_ab_plus_c (num_events, + sizeof (cairo_bo_start_event_t) + + sizeof (cairo_bo_event_t *), + sizeof (cairo_bo_event_t *)); + if (unlikely (events == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event_ptrs = (cairo_bo_event_t **) (events + num_events); + } + + for (i = 0; i < num_events; i++) { + events[i].type = CAIRO_BO_EVENT_TYPE_START; + events[i].point.y = polygon->edges[i].top; + events[i].point.x = + _line_compute_intersection_x_for_y (&polygon->edges[i].line, + events[i].point.y); + + events[i].edge.edge = polygon->edges[i]; + events[i].edge.deferred_trap.right = NULL; + events[i].edge.prev = NULL; + events[i].edge.next = NULL; + events[i].edge.colinear = NULL; + + if (event_y) { + y = _cairo_fixed_integer_floor (events[i].point.y) - ymin; + events[i].edge.next = (cairo_bo_edge_t *) event_y[y]; + event_y[y] = (cairo_bo_start_event_t *) &events[i]; + } else + event_ptrs[i] = (cairo_bo_event_t *) &events[i]; + } + + if (event_y) { + for (y = i = 0; y < ymax && i < num_events; y++) { + cairo_bo_start_event_t *e; + int j = i; + for (e = event_y[y]; e; e = (cairo_bo_start_event_t *)e->edge.next) + event_ptrs[i++] = (cairo_bo_event_t *) e; + if (i > j + 1) + _cairo_bo_event_queue_sort (event_ptrs+j, i-j); + } + if (event_y != stack_event_y) + free (event_y); + } else + _cairo_bo_event_queue_sort (event_ptrs, i); + event_ptrs[i] = NULL; + +#if DEBUG_TRAPS + dump_edges (events, num_events, "bo-polygon-edges.txt"); +#endif + + /* XXX: This would be the convenient place to throw in multiple + * passes of the Bentley-Ottmann algorithm. It would merely + * require storing the results of each pass into a temporary + * cairo_traps_t. */ + status = _cairo_bentley_ottmann_tessellate_bo_edges (event_ptrs, num_events, + fill_rule, traps, + &intersections); +#if DEBUG_TRAPS + dump_traps (traps, "bo-polygon-out.txt"); +#endif + + if (events != stack_events) + free (events); + + return status; +} + +cairo_status_t +_cairo_bentley_ottmann_tessellate_traps (cairo_traps_t *traps, + cairo_fill_rule_t fill_rule) +{ + cairo_status_t status; + cairo_polygon_t polygon; + int i; + + if (unlikely (0 == traps->num_traps)) + return CAIRO_STATUS_SUCCESS; + +#if DEBUG_TRAPS + dump_traps (traps, "bo-traps-in.txt"); +#endif + + _cairo_polygon_init (&polygon, traps->limits, traps->num_limits); + + for (i = 0; i < traps->num_traps; i++) { + status = _cairo_polygon_add_line (&polygon, + &traps->traps[i].left, + traps->traps[i].top, + traps->traps[i].bottom, + 1); + if (unlikely (status)) + goto CLEANUP; + + status = _cairo_polygon_add_line (&polygon, + &traps->traps[i].right, + traps->traps[i].top, + traps->traps[i].bottom, + -1); + if (unlikely (status)) + goto CLEANUP; + } + + _cairo_traps_clear (traps); + status = _cairo_bentley_ottmann_tessellate_polygon (traps, + &polygon, + fill_rule); + +#if DEBUG_TRAPS + dump_traps (traps, "bo-traps-out.txt"); +#endif + + CLEANUP: + _cairo_polygon_fini (&polygon); + + return status; +} + +#if 0 +static cairo_bool_t +edges_have_an_intersection_quadratic (cairo_bo_edge_t *edges, + int num_edges) + +{ + int i, j; + cairo_bo_edge_t *a, *b; + cairo_bo_point32_t intersection; + + /* We must not be given any upside-down edges. */ + for (i = 0; i < num_edges; i++) { + assert (_cairo_bo_point32_compare (&edges[i].top, &edges[i].bottom) < 0); + edges[i].line.p1.x <<= CAIRO_BO_GUARD_BITS; + edges[i].line.p1.y <<= CAIRO_BO_GUARD_BITS; + edges[i].line.p2.x <<= CAIRO_BO_GUARD_BITS; + edges[i].line.p2.y <<= CAIRO_BO_GUARD_BITS; + } + + for (i = 0; i < num_edges; i++) { + for (j = 0; j < num_edges; j++) { + if (i == j) + continue; + + a = &edges[i]; + b = &edges[j]; + + if (! _cairo_bo_edge_intersect (a, b, &intersection)) + continue; + + printf ("Found intersection (%d,%d) between (%d,%d)-(%d,%d) and (%d,%d)-(%d,%d)\n", + intersection.x, + intersection.y, + a->line.p1.x, a->line.p1.y, + a->line.p2.x, a->line.p2.y, + b->line.p1.x, b->line.p1.y, + b->line.p2.x, b->line.p2.y); + + return TRUE; + } + } + return FALSE; +} + +#define TEST_MAX_EDGES 10 + +typedef struct test { + const char *name; + const char *description; + int num_edges; + cairo_bo_edge_t edges[TEST_MAX_EDGES]; +} test_t; + +static test_t +tests[] = { + { + "3 near misses", + "3 edges all intersecting very close to each other", + 3, + { + { { 4, 2}, {0, 0}, { 9, 9}, NULL, NULL }, + { { 7, 2}, {0, 0}, { 2, 3}, NULL, NULL }, + { { 5, 2}, {0, 0}, { 1, 7}, NULL, NULL } + } + }, + { + "inconsistent data", + "Derived from random testing---was leading to skip list and edge list disagreeing.", + 2, + { + { { 2, 3}, {0, 0}, { 8, 9}, NULL, NULL }, + { { 2, 3}, {0, 0}, { 6, 7}, NULL, NULL } + } + }, + { + "failed sort", + "A test derived from random testing that leads to an inconsistent sort --- looks like we just can't attempt to validate the sweep line with edge_compare?", + 3, + { + { { 6, 2}, {0, 0}, { 6, 5}, NULL, NULL }, + { { 3, 5}, {0, 0}, { 5, 6}, NULL, NULL }, + { { 9, 2}, {0, 0}, { 5, 6}, NULL, NULL }, + } + }, + { + "minimal-intersection", + "Intersection of a two from among the smallest possible edges.", + 2, + { + { { 0, 0}, {0, 0}, { 1, 1}, NULL, NULL }, + { { 1, 0}, {0, 0}, { 0, 1}, NULL, NULL } + } + }, + { + "simple", + "A simple intersection of two edges at an integer (2,2).", + 2, + { + { { 1, 1}, {0, 0}, { 3, 3}, NULL, NULL }, + { { 2, 1}, {0, 0}, { 2, 3}, NULL, NULL } + } + }, + { + "bend-to-horizontal", + "With intersection truncation one edge bends to horizontal", + 2, + { + { { 9, 1}, {0, 0}, {3, 7}, NULL, NULL }, + { { 3, 5}, {0, 0}, {9, 9}, NULL, NULL } + } + } +}; + +/* + { + "endpoint", + "An intersection that occurs at the endpoint of a segment.", + { + { { 4, 6}, { 5, 6}, NULL, { { NULL }} }, + { { 4, 5}, { 5, 7}, NULL, { { NULL }} }, + { { 0, 0}, { 0, 0}, NULL, { { NULL }} }, + } + } + { + name = "overlapping", + desc = "Parallel segments that share an endpoint, with different slopes.", + edges = { + { top = { x = 2, y = 0}, bottom = { x = 1, y = 1}}, + { top = { x = 2, y = 0}, bottom = { x = 0, y = 2}}, + { top = { x = 0, y = 3}, bottom = { x = 1, y = 3}}, + { top = { x = 0, y = 3}, bottom = { x = 2, y = 3}}, + { top = { x = 0, y = 4}, bottom = { x = 0, y = 6}}, + { top = { x = 0, y = 5}, bottom = { x = 0, y = 6}} + } + }, + { + name = "hobby_stage_3", + desc = "A particularly tricky part of the 3rd stage of the 'hobby' test below.", + edges = { + { top = { x = -1, y = -2}, bottom = { x = 4, y = 2}}, + { top = { x = 5, y = 3}, bottom = { x = 9, y = 5}}, + { top = { x = 5, y = 3}, bottom = { x = 6, y = 3}}, + } + }, + { + name = "hobby", + desc = "Example from John Hobby's paper. Requires 3 passes of the iterative algorithm.", + edges = { + { top = { x = 0, y = 0}, bottom = { x = 9, y = 5}}, + { top = { x = 0, y = 0}, bottom = { x = 13, y = 6}}, + { top = { x = -1, y = -2}, bottom = { x = 9, y = 5}} + } + }, + { + name = "slope", + desc = "Edges with same start/stop points but different slopes", + edges = { + { top = { x = 4, y = 1}, bottom = { x = 6, y = 3}}, + { top = { x = 4, y = 1}, bottom = { x = 2, y = 3}}, + { top = { x = 2, y = 4}, bottom = { x = 4, y = 6}}, + { top = { x = 6, y = 4}, bottom = { x = 4, y = 6}} + } + }, + { + name = "horizontal", + desc = "Test of a horizontal edge", + edges = { + { top = { x = 1, y = 1}, bottom = { x = 6, y = 6}}, + { top = { x = 2, y = 3}, bottom = { x = 5, y = 3}} + } + }, + { + name = "vertical", + desc = "Test of a vertical edge", + edges = { + { top = { x = 5, y = 1}, bottom = { x = 5, y = 7}}, + { top = { x = 2, y = 4}, bottom = { x = 8, y = 5}} + } + }, + { + name = "congruent", + desc = "Two overlapping edges with the same slope", + edges = { + { top = { x = 5, y = 1}, bottom = { x = 5, y = 7}}, + { top = { x = 5, y = 2}, bottom = { x = 5, y = 6}}, + { top = { x = 2, y = 4}, bottom = { x = 8, y = 5}} + } + }, + { + name = "multi", + desc = "Several segments with a common intersection point", + edges = { + { top = { x = 1, y = 2}, bottom = { x = 5, y = 4} }, + { top = { x = 1, y = 1}, bottom = { x = 5, y = 5} }, + { top = { x = 2, y = 1}, bottom = { x = 4, y = 5} }, + { top = { x = 4, y = 1}, bottom = { x = 2, y = 5} }, + { top = { x = 5, y = 1}, bottom = { x = 1, y = 5} }, + { top = { x = 5, y = 2}, bottom = { x = 1, y = 4} } + } + } +}; +*/ + +static int +run_test (const char *test_name, + cairo_bo_edge_t *test_edges, + int num_edges) +{ + int i, intersections, passes; + cairo_bo_edge_t *edges; + cairo_array_t intersected_edges; + + printf ("Testing: %s\n", test_name); + + _cairo_array_init (&intersected_edges, sizeof (cairo_bo_edge_t)); + + intersections = _cairo_bentley_ottmann_intersect_edges (test_edges, num_edges, &intersected_edges); + if (intersections) + printf ("Pass 1 found %d intersections:\n", intersections); + + + /* XXX: Multi-pass Bentley-Ottmmann. Preferable would be to add a + * pass of Hobby's tolerance-square algorithm instead. */ + passes = 1; + while (intersections) { + int num_edges = _cairo_array_num_elements (&intersected_edges); + passes++; + edges = _cairo_malloc_ab (num_edges, sizeof (cairo_bo_edge_t)); + assert (edges != NULL); + memcpy (edges, _cairo_array_index (&intersected_edges, 0), num_edges * sizeof (cairo_bo_edge_t)); + _cairo_array_fini (&intersected_edges); + _cairo_array_init (&intersected_edges, sizeof (cairo_bo_edge_t)); + intersections = _cairo_bentley_ottmann_intersect_edges (edges, num_edges, &intersected_edges); + free (edges); + + if (intersections){ + printf ("Pass %d found %d remaining intersections:\n", passes, intersections); + } else { + if (passes > 3) + for (i = 0; i < passes; i++) + printf ("*"); + printf ("No remainining intersections found after pass %d\n", passes); + } + } + + if (edges_have_an_intersection_quadratic (_cairo_array_index (&intersected_edges, 0), + _cairo_array_num_elements (&intersected_edges))) + printf ("*** FAIL ***\n"); + else + printf ("PASS\n"); + + _cairo_array_fini (&intersected_edges); + + return 0; +} + +#define MAX_RANDOM 300 + +int +main (void) +{ + char random_name[] = "random-XX"; + cairo_bo_edge_t random_edges[MAX_RANDOM], *edge; + unsigned int i, num_random; + test_t *test; + + for (i = 0; i < ARRAY_LENGTH (tests); i++) { + test = &tests[i]; + run_test (test->name, test->edges, test->num_edges); + } + + for (num_random = 0; num_random < MAX_RANDOM; num_random++) { + srand (0); + for (i = 0; i < num_random; i++) { + do { + edge = &random_edges[i]; + edge->line.p1.x = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); + edge->line.p1.y = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); + edge->line.p2.x = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); + edge->line.p2.y = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); + if (edge->line.p1.y > edge->line.p2.y) { + int32_t tmp = edge->line.p1.y; + edge->line.p1.y = edge->line.p2.y; + edge->line.p2.y = tmp; + } + } while (edge->line.p1.y == edge->line.p2.y); + } + + sprintf (random_name, "random-%02d", num_random); + + run_test (random_name, random_edges, num_random); + } + + return 0; +} +#endif diff --git a/src/cairo-beos-surface.cpp b/src/cairo-beos-surface.cpp new file mode 100644 index 000000000..c97641685 --- /dev/null +++ b/src/cairo-beos-surface.cpp @@ -0,0 +1,984 @@ +/* vim:set ts=8 sw=4 noet cin: */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Christian Biesinger + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Christian Biesinger + * + * + * Contributor(s): + */ + +// This is a C++ file in order to use the C++ BeOS API + +#include "cairoint.h" + +#include "cairo-beos.h" + +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" + +#include + +#include +#include +#if 0 +#include +#endif +#include +#include +#include + +/** + * SECTION:beos-surface + * @Title: BeOS Surfaces + * @Short_Description: BeOS surface support + * @See_Also: #cairo_surface_t + * + * The BeOS surface is used to render cairo graphics to BeOS views + * and bitmaps. + **/ + +#define CAIRO_INT_STATUS_SUCCESS (cairo_int_status_t)(CAIRO_STATUS_SUCCESS) + +struct cairo_beos_surface_t { + cairo_surface_t base; + + cairo_region_t *clip_region; + + BView* view; + + /* + * A view is either attached to a bitmap, a window, or unattached. + * If it is attached to a window, we can copy data out of it using BScreen. + * If it is attached to a bitmap, we can read the bitmap data. + * If it is not attached, it doesn't draw anything, we need not bother. + * + * Since there doesn't seem to be a way to get the bitmap from a view if it + * is attached to one, we have to use a special surface creation function. + */ + + BBitmap* bitmap; + + // If true, surface and view should be deleted when this surface is + // destroyed + bool owns_bitmap_view; +}; + +class AutoLockView { + public: + AutoLockView(BView* view) : mView(view) { + mOK = mView->LockLooper(); + } + + ~AutoLockView() { + if (mOK) + mView->UnlockLooper(); + } + + operator bool() { + return mOK; + } + + private: + BView* mView; + bool mOK; +}; + +static cairo_surface_t * +_cairo_beos_surface_create_internal (BView* view, + BBitmap* bmp, + bool owns_bitmap_view = false); + +static inline BRect +_cairo_rectangle_to_brect (const cairo_rectangle_int_t* rect) +{ + // A BRect is one pixel wider than you'd think + return BRect (rect->x, rect->y, + rect->x + rect->width - 1, + rect->y + rect->height - 1); +} + +static inline cairo_rectangle_int_t +_brect_to_cairo_rectangle (const BRect &rect) +{ + cairo_rectangle_int_t retval; + retval.x = floor (rect.left); + retval.y = floor (rect.top); + retval.width = ceil (rect.right) - retval.x + 1; + retval.height = ceil (rect.bottom) - rectval.y + 1; + return retval; +} + +static inline rgb_color +_cairo_color_to_be_color (const cairo_color_t *color) +{ + // This factor ensures a uniform distribution of numbers + const float factor = 256 - 1e-5; + // Using doubles to have non-premultiplied colors + rgb_color be_color = { uint8(color->red * factor), + uint8(color->green * factor), + uint8(color->blue * factor), + uint8(color->alpha * factor) }; + + return be_color; +} + +enum ViewCopyStatus { + OK, + NOT_VISIBLE, // The view or the interest rect is not visible on screen + ERROR // The view was visible, but the rect could not be copied. Probably OOM +}; + +/** + * _cairo_beos_view_to_bitmap: + * @bitmap: [out] The resulting bitmap. + * @rect: [out] The rectangle that was copied, in the view's coordinate system + * @interestRect: If non-null, only this part of the view will be copied (view's coord system). + * + * Gets the contents of the view as a BBitmap*. Caller must delete the bitmap. + **/ +static ViewCopyStatus +_cairo_beos_view_to_bitmap (BView* view, + BBitmap** bitmap, + BRect* rect = NULL, + const BRect* interestRect = NULL) +{ + *bitmap = NULL; + + BWindow* wnd = view->Window(); + // If we have no window, can't do anything + if (!wnd) + return NOT_VISIBLE; + + view->Sync(); + wnd->Sync(); + +#if 0 + // Is it a direct window? + BDirectWindow* directWnd = dynamic_cast(wnd); + if (directWnd) { + // WRITEME + } +#endif + + // Is it visible? If so, we can copy the content off the screen + if (wnd->IsHidden()) + return NOT_VISIBLE; + + BRect rectToCopy(view->Bounds()); + if (interestRect) + rectToCopy = rectToCopy & *interestRect; + + if (!rectToCopy.IsValid()) + return NOT_VISIBLE; + + BScreen screen(wnd); + BRect screenRect(view->ConvertToScreen(rectToCopy)); + screenRect = screenRect & screen.Frame(); + + if (!screen.IsValid()) + return NOT_VISIBLE; + + if (rect) + *rect = view->ConvertFromScreen(screenRect); + + if (screen.GetBitmap(bitmap, false, &screenRect) == B_OK) + return OK; + + return ERROR; +} + +static void +unpremultiply_bgra (unsigned char* data, + int width, + int height, + int stride, + unsigned char* retdata) +{ + unsigned char* end = data + stride * height; + for (unsigned char* in = data, *out = retdata; + in < end; + in += stride, out += stride) + { + for (int i = 0; i < width; i ++) { + uint8_t *b = &out[4*i]; + uint32_t pixel; + uint8_t alpha; + + memcpy (&pixel, &data[4*i], sizeof (uint32_t)); + alpha = pixel & 0xff; + if (alpha == 0) { + b[0] = b[1] = b[2] = b[3] = 0; + } else { + b[0] = (((pixel >> 24) & 0xff) * 255 + alpha / 2) / alpha; + b[1] = (((pixel >> 16) & 0xff) * 255 + alpha / 2) / alpha; + b[2] = (((pixel >> 8) & 0xff) * 255 + alpha / 2) / alpha; + b[3] = alpha; + } + } + } +} + +static inline int +multiply_alpha (int alpha, int color) +{ + int temp = (alpha * color) + 0x80; + return ((temp + (temp >> 8)) >> 8); +} + +static unsigned char* +premultiply_bgra (unsigned char* data, + int width, + int height, + int stride) +{ + uint8_t * retdata = reinterpret_cast(_cairo_malloc_ab(height, stride)); + if (!retdata) + return NULL; + + uint8_t * end = data + stride * height; + for (uint8_t * in = data, *out = retdata; + in < end; + in += stride, out += stride) + { + for (int i = 0; i < width; i ++) { + uint8_t *base = &in[4*i]; + uint8_t alpha = base[3]; + uint32_t p; + + if (alpha == 0) { + p = 0; + } else { + uint8_t blue = base[0]; + uint8_t green = base[1]; + uint8_t red = base[2]; + + if (alpha != 0xff) { + blue = multiply_alpha (alpha, blue); + green = multiply_alpha (alpha, green); + red = multiply_alpha (alpha, red); + } + p = (alpha << 0) | (red << 8) | (green << 16) | (blue << 24); + } + memcpy (&out[4*i], &p, sizeof (uint32_t)); + } + } + return retdata; +} + +static cairo_int_status_t +_cairo_beos_surface_set_clip_region (cairo_beos_surface_t *surface, + cairo_region_t *region) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + AutoLockView locker(surface->view); + assert (locker); + + if (region == surface->clip_region) + return CAIRO_INT_STATUS_SUCCESS; + + cairo_region_destroy (surface->clip_region); + surface->clip_region = cairo_region_reference (region); + + if (region == NULL) { + // No clipping + surface->view->ConstrainClippingRegion(NULL); + return CAIRO_INT_STATUS_SUCCESS; + } + + int count = cairo_region_num_rectangles (region); + BRegion bregion; + for (int i = 0; i < count; ++i) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (region, i, &rect); + // Have to subtract one, because for pixman, the second coordinate + // lies outside the rectangle. + bregion.Include (_cairo_rectangle_to_brect (&rect)); + } + surface->view->ConstrainClippingRegion(&bregion); + return CAIRO_INT_STATUS_SUCCESS; +} + + +/** + * _cairo_beos_bitmap_to_surface: + * + * Returns an addrefed image surface for a BBitmap. The bitmap need not outlive + * the surface. + **/ +static cairo_image_surface_t* +_cairo_beos_bitmap_to_surface (BBitmap* bitmap) +{ + color_space format = bitmap->ColorSpace(); + if (format != B_RGB32 && format != B_RGBA32) { + BBitmap bmp(bitmap->Bounds(), B_RGB32, true); + BView view(bitmap->Bounds(), "Cairo bitmap drawing view", + B_FOLLOW_ALL_SIDES, 0); + bmp.AddChild(&view); + + view.LockLooper(); + + view.DrawBitmap(bitmap, BPoint(0.0, 0.0)); + view.Sync(); + + cairo_image_surface_t* imgsurf = _cairo_beos_bitmap_to_surface(&bmp); + + view.UnlockLooper(); + bmp.RemoveChild(&view); + return imgsurf; + } + + cairo_format_t cformat = format == B_RGB32 ? + CAIRO_FORMAT_RGB24 : CAIRO_FORMAT_ARGB32; + + BRect bounds(bitmap->Bounds()); + unsigned char* bits = reinterpret_cast(bitmap->Bits()); + int width = bounds.IntegerWidth() + 1; + int height = bounds.IntegerHeight() + 1; + unsigned char* premultiplied; + if (cformat == CAIRO_FORMAT_ARGB32) { + premultiplied = premultiply_bgra (bits, width, height, + bitmap->BytesPerRow()); + } else { + premultiplied = reinterpret_cast( + _cairo_malloc_ab(bitmap->BytesPerRow(), height)); + if (premultiplied) + memcpy(premultiplied, bits, bitmap->BytesPerRow() * height); + } + if (!premultiplied) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + cairo_image_surface_t* surf = reinterpret_cast + (cairo_image_surface_create_for_data(premultiplied, + cformat, + width, + height, + bitmap->BytesPerRow())); + if (surf->base.status) + free(premultiplied); + else + _cairo_image_surface_assume_ownership_of_data(surf); + return surf; +} + +/** + * _cairo_image_surface_to_bitmap: + * + * Converts an image surface to a BBitmap. The return value must be freed with + * delete. + **/ +static BBitmap* +_cairo_image_surface_to_bitmap (cairo_image_surface_t* surface) +{ + BRect size(0.0, 0.0, surface->width - 1, surface->height - 1); + switch (surface->format) { + case CAIRO_FORMAT_ARGB32: { + BBitmap* data = new BBitmap(size, B_RGBA32); + unpremultiply_bgra (surface->data, + surface->width, + surface->height, + surface->stride, + reinterpret_cast(data->Bits())); + return data; + } + case CAIRO_FORMAT_RGB24: { + BBitmap* data = new BBitmap(size, B_RGB32); + memcpy(data->Bits(), surface->data, surface->height * surface->stride); + return data; + } + default: + assert(0); + return NULL; + } +} + +/** + * _cairo_op_to_be_op: + * + * Converts a cairo drawing operator to a beos drawing_mode. Returns true if + * the operator could be converted, false otherwise. + **/ +static bool +_cairo_op_to_be_op (cairo_operator_t cairo_op, + drawing_mode* beos_op) +{ + switch (cairo_op) { + case CAIRO_OPERATOR_SOURCE: + *beos_op = B_OP_COPY; + return true; + case CAIRO_OPERATOR_OVER: + *beos_op = B_OP_ALPHA; + return true; + + case CAIRO_OPERATOR_ADD: + // Does not actually work + // XXX This is a fundamental compositing operator, it has to work! +#if 1 + return false; +#else + *beos_op = B_OP_ADD; + return true; +#endif + + case CAIRO_OPERATOR_CLEAR: + // Does not map to B_OP_ERASE - it replaces the dest with the low + // color, instead of transparency; could be done by setting low + // color appropriately. + + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_ATOP: + + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_DEST_ATOP: + + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_SATURATE: + + default: + return false; + } +} + +static cairo_surface_t * +_cairo_beos_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + + if (width <= 0) + width = 1; + if (height <= 0) + height = 1; + + BRect rect(0.0, 0.0, width - 1, height - 1); + BBitmap* bmp; + switch (content) { + case CAIRO_CONTENT_ALPHA: + return NULL; + case CAIRO_CONTENT_COLOR_ALPHA: + bmp = new BBitmap(rect, B_RGBA32, true); + break; + case CAIRO_CONTENT_COLOR: + // Match the color depth + if (surface->bitmap) { + color_space space = surface->bitmap->ColorSpace(); + // No alpha was requested -> make sure not to return + // a surface with alpha + if (space == B_RGBA32) + space = B_RGB32; + if (space == B_RGBA15) + space = B_RGB15; + bmp = new BBitmap(rect, space, true); + } else { + BScreen scr(surface->view->Window()); + color_space space = B_RGB32; + if (scr.IsValid()) + space = scr.ColorSpace(); + bmp = new BBitmap(rect, space, true); + } + break; + default: + ASSERT_NOT_REACHED; + return NULL; + } + BView* view = new BView(rect, "Cairo bitmap view", B_FOLLOW_ALL_SIDES, 0); + bmp->AddChild(view); + return _cairo_beos_surface_create_internal(view, bmp, true); +} + +static cairo_status_t +_cairo_beos_surface_finish (void *abstract_surface) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + if (surface->owns_bitmap_view) { + if (surface->bitmap) + surface->bitmap->RemoveChild(surface->view); + + delete surface->view; + delete surface->bitmap; + + surface->view = NULL; + surface->bitmap = NULL; + } + + cairo_region_destroy (surface->clip_region); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_beos_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + AutoLockView locker(surface->view); + if (!locker) + return CAIRO_STATUS_NO_MEMORY; /// XXX not exactly right, but what can we do? + + + surface->view->Sync(); + + if (surface->bitmap) { + *image_out = _cairo_beos_bitmap_to_surface (surface->bitmap); + if (unlikely ((*image_out)->base.status)) + return (*image_out)->base.status; + + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; + } + + BBitmap* bmp; + if (_cairo_beos_view_to_bitmap(surface->view, &bmp) != OK) + return CAIRO_STATUS_NO_MEMORY; /// XXX incorrect if the error was NOT_VISIBLE + + *image_out = _cairo_beos_bitmap_to_surface (bmp); + if (unlikely ((*image_out)->base.status)) { + delete bmp; + return (*image_out)->base.status; + } + *image_extra = bmp; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_beos_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); + + if (image_extra != NULL) { + BBitmap* bmp = static_cast(image_extra); + delete bmp; + } +} + +static cairo_status_t +_cairo_beos_surface_acquire_dest_image (void *abstract_surface, + cairo_rectangle_int_t *interest_rect, + cairo_image_surface_t **image_out, + cairo_rectangle_int_t *image_rect, + void **image_extra) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + + AutoLockView locker(surface->view); + if (!locker) { + *image_out = NULL; + *image_extra = NULL; + return (cairo_status_t) CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + if (surface->bitmap) { + surface->view->Sync(); + *image_out = _cairo_beos_bitmap_to_surface(surface->bitmap); + if (unlikely ((*image_out)->base.status)) + return (*image_out)->base.status; + + image_rect->x = 0; + image_rect->y = 0; + image_rect->width = (*image_out)->width; + image_rect->height = (*image_out)->height; + + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; + } + + BRect b_interest_rect (_cairo_rectangle_to_brect (interest_rect)); + + BRect rect; + BBitmap* bitmap; + ViewCopyStatus status = _cairo_beos_view_to_bitmap(surface->view, &bitmap, + &rect, &b_interest_rect); + if (status == NOT_VISIBLE) { + *image_out = NULL; + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; + } + if (status == ERROR) + return CAIRO_STATUS_NO_MEMORY; + + *image_rect = _brect_to_cairo_rectangle(rect); + *image_out = _cairo_beos_bitmap_to_surface(bitmap); + delete bitmap; + if (unlikely ((*image_out)->base.status)) + return (*image_out)->base.status; + + *image_extra = NULL; + + return CAIRO_STATUS_SUCCESS; +} + + +static void +_cairo_beos_surface_release_dest_image (void *abstract_surface, + cairo_rectangle_int_t *intersect_rect, + cairo_image_surface_t *image, + cairo_rectangle_int_t *image_rect, + void *image_extra) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + + AutoLockView locker(surface->view); + if (!locker) + return; + + BBitmap* bitmap_to_draw = _cairo_image_surface_to_bitmap(image); + surface->view->PushState(); + + surface->view->SetDrawingMode(B_OP_COPY); + + surface->view->DrawBitmap (bitmap_to_draw, + _cairo_rectangle_to_brect (image_rect)); + + surface->view->PopState(); + + delete bitmap_to_draw; + cairo_surface_destroy(&image->base); +} + +static cairo_int_status_t +_cairo_beos_surface_composite (cairo_operator_t op, + cairo_pattern_t *src, + cairo_pattern_t *mask, + void *dst, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height, + cairo_region_t *clip_region) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + dst); + cairo_int_status_t status; + AutoLockView locker(surface->view); + if (!locker) + return CAIRO_INT_STATUS_SUCCESS; + + drawing_mode mode; + if (!_cairo_op_to_be_op(op, &mode)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + // XXX Masks are not yet supported + if (mask) + return CAIRO_INT_STATUS_UNSUPPORTED; + + // XXX should eventually support the others + if (src->type != CAIRO_PATTERN_TYPE_SURFACE || + src->extend != CAIRO_EXTEND_NONE) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + // Can we maybe support other matrices as well? (scale? if the filter is right) + int itx, ity; + if (!_cairo_matrix_is_integer_translation(&src->matrix, &itx, &ity)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_beos_surface_set_clip_region (surface, clip_region); + if (unlikely (status)) + return status; + + BRect srcRect(src_x + itx, + src_y + ity, + src_x + itx + width - 1, + src_y + ity + height - 1); + BRect dstRect(dst_x, dst_y, dst_x + width - 1, dst_y + height - 1); + + cairo_surface_t* src_surface = reinterpret_cast(src)-> + surface; + + // Get a bitmap + BBitmap* bmp = NULL; + bool free_bmp = false; + if (_cairo_surface_is_image(src_surface)) { + cairo_image_surface_t* img_surface = + reinterpret_cast(src_surface); + + bmp = _cairo_image_surface_to_bitmap(img_surface); + free_bmp = true; + } else if (src_surface->backend == surface->base.backend) { + cairo_beos_surface_t *beos_surface = + reinterpret_cast(src_surface); + if (beos_surface->bitmap) { + AutoLockView locker(beos_surface->view); + if (locker) + beos_surface->view->Sync(); + bmp = beos_surface->bitmap; + } else { + _cairo_beos_view_to_bitmap(surface->view, &bmp); + free_bmp = true; + } + } + + if (!bmp) + return CAIRO_INT_STATUS_UNSUPPORTED; + + // So, BeOS seems to screw up painting an opaque bitmap onto a + // translucent one (it makes them partly transparent). Just return + // unsupported. + if (bmp->ColorSpace() == B_RGB32 && surface->bitmap && + surface->bitmap->ColorSpace() == B_RGBA32 && + (mode == B_OP_COPY || mode == B_OP_ALPHA)) + { + if (free_bmp) + delete bmp; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + // Draw it on screen. + surface->view->PushState(); + + // If our image rect is only a subrect of the desired size, and we + // aren't using B_OP_ALPHA, then we need to fill the rect first. + if (mode == B_OP_COPY && !bmp->Bounds().Contains(srcRect)) { + rgb_color black = { 0, 0, 0, 0 }; + + surface->view->SetDrawingMode(mode); + surface->view->SetHighColor(black); + surface->view->FillRect(dstRect); + } + + if (mode == B_OP_ALPHA && bmp->ColorSpace() == B_RGB32) { + mode = B_OP_COPY; + } + surface->view->SetDrawingMode(mode); + + if (surface->bitmap && surface->bitmap->ColorSpace() == B_RGBA32) + surface->view->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_COMPOSITE); + else + surface->view->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); + + surface->view->DrawBitmap(bmp, srcRect, dstRect); + + surface->view->PopState(); + + if (free_bmp) + delete bmp; + + return CAIRO_INT_STATUS_SUCCESS; +} + + +static cairo_int_status_t +_cairo_beos_surface_fill_rectangles (void *abstract_surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_rectangle_int_t *rects, + int num_rects, + cairo_region_t *clip_region) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + cairo_int_status_t status; + + if (num_rects <= 0) + return CAIRO_INT_STATUS_SUCCESS; + + AutoLockView locker(surface->view); + if (!locker) + return CAIRO_INT_STATUS_SUCCESS; + + drawing_mode mode; + if (!_cairo_op_to_be_op(op, &mode)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_beos_surface_set_clip_region (surface, clip_region); + if (unlikely (status)) + return status; + + rgb_color be_color = _cairo_color_to_be_color(color); + + if (mode == B_OP_ALPHA && be_color.alpha == 0xFF) + mode = B_OP_COPY; + + // For CAIRO_OPERATOR_SOURCE, cairo expects us to use the premultiplied + // color info. This is only relevant when drawing into an rgb24 buffer + // (as for others, we can convert when asked for the image) + if (mode == B_OP_COPY && be_color.alpha != 0xFF && + (!surface->bitmap || surface->bitmap->ColorSpace() != B_RGBA32)) + { + be_color.red = color->red_short >> 8; + be_color.green = color->green_short >> 8; + be_color.blue = color->blue_short >> 8; + } + + surface->view->PushState(); + + surface->view->SetDrawingMode(mode); + surface->view->SetHighColor(be_color); + if (surface->bitmap && surface->bitmap->ColorSpace() == B_RGBA32) + surface->view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE); + else + surface->view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); + + for (int i = 0; i < num_rects; ++i) + surface->view->FillRect (_cairo_rectangle_to_brect (&rects[i])); + + surface->view->PopState(); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_beos_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_beos_surface_t *surface = reinterpret_cast( + abstract_surface); + AutoLockView locker(surface->view); + if (!locker) + return FALSE; + + *rectangle = _brect_to_cairo_rectangle (surface->view->Bounds()); + return TRUE; +} + +static const struct _cairo_surface_backend cairo_beos_surface_backend = { + CAIRO_SURFACE_TYPE_BEOS, + _cairo_beos_surface_create_similar, + _cairo_beos_surface_finish, + _cairo_beos_surface_acquire_source_image, + _cairo_beos_surface_release_source_image, + _cairo_beos_surface_acquire_dest_image, + _cairo_beos_surface_release_dest_image, + NULL, /* clone_similar */ + _cairo_beos_surface_composite, /* composite */ + _cairo_beos_surface_fill_rectangles, + NULL, /* composite_trapezoids */ + NULL, /* create_span_renderer */ + NULL, /* check_span_renderer */ + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_beos_surface_get_extents, + NULL, /* old_show_glyphs */ + NULL, /* get_font_options */ + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + NULL, /* scaled_font_fini */ + NULL, /* scaled_glyph_fini */ + + NULL, /* paint */ + NULL, /* mask */ + NULL, /* stroke */ + NULL, /* fill */ + NULL /* show_glyphs */ +}; + +static cairo_surface_t * +_cairo_beos_surface_create_internal (BView* view, + BBitmap* bmp, + bool owns_bitmap_view) +{ + // Must use malloc, because cairo code will use free() on the surface + cairo_beos_surface_t *surface = static_cast( + malloc(sizeof(cairo_beos_surface_t))); + if (surface == NULL) { + _cairo_error (CAIRO_STATUS_NO_MEMORY); + return const_cast(&_cairo_surface_nil); + } + + cairo_content_t content = CAIRO_CONTENT_COLOR; + if (bmp && (bmp->ColorSpace() == B_RGBA32 || bmp->ColorSpace() == B_RGBA15)) + content = CAIRO_CONTENT_COLOR_ALPHA; + _cairo_surface_init (&surface->base, + &cairo_beos_surface_backend, + NULL, /* device */ + content); + + surface->view = view; + surface->bitmap = bmp; + surface->owns_bitmap_view = owns_bitmap_view; + + surface->clip_region = NULL; + + return &surface->base; +} + +/** + * cairo_beos_surface_create: + * @view: The view to draw on + * + * Creates a Cairo surface that draws onto a BeOS BView. + * The caller must ensure that the view does not get deleted before the surface. + * If the view is attached to a bitmap rather than an on-screen window, use + * cairo_beos_surface_create_for_bitmap() instead of this function. + * + * Since: TBD + **/ +cairo_surface_t * +cairo_beos_surface_create (BView* view) +{ + return cairo_beos_surface_create_for_bitmap(view, NULL); +} + +/** + * cairo_beos_surface_create_for_bitmap: + * @view: The view to draw on + * @bmp: The bitmap to which the view is attached + * + * Creates a Cairo surface that draws onto a BeOS BView which is attached to a + * BBitmap. + * The caller must ensure that the view and the bitmap do not get deleted + * before the surface. + * + * For views that draw to a bitmap (as opposed to a screen), use this function + * rather than cairo_beos_surface_create(). Not using this function WILL lead to + * incorrect behaviour. + * + * For now, only views that draw to the entire area of bmp are supported. + * The view must already be attached to the bitmap. + * + * Since: TBD + **/ +cairo_surface_t * +cairo_beos_surface_create_for_bitmap (BView* view, + BBitmap* bmp) +{ + return _cairo_beos_surface_create_internal(view, bmp); +} diff --git a/src/cairo-beos.h b/src/cairo-beos.h new file mode 100644 index 000000000..fdb89a6c4 --- /dev/null +++ b/src/cairo-beos.h @@ -0,0 +1,60 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Christian Biesinger + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Christian Biesinger + * + * + * Contributor(s): + */ + +#ifndef CAIRO_BEOS_H +#define CAIRO_BEOS_H + +#include "cairo.h" + +#if CAIRO_HAS_BEOS_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_beos_surface_create (BView* view); + +cairo_public cairo_surface_t * +cairo_beos_surface_create_for_bitmap (BView* view, + BBitmap* bmp); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_BEOS_SURFACE */ +# error Cairo was not compiled with support for the beos backend +#endif /* CAIRO_HAS_BEOS_SURFACE */ + +#endif /* CAIRO_BEOS_H */ diff --git a/src/cairo-botor-scan-converter.c b/src/cairo-botor-scan-converter.c new file mode 100644 index 000000000..515305bf2 --- /dev/null +++ b/src/cairo-botor-scan-converter.c @@ -0,0 +1,2164 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2007 David Turner + * Copyright © 2008 M Joonas Pihlaja + * Copyright © 2008 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * M Joonas Pihlaja + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-list-inline.h" +#include "cairo-freelist-private.h" +#include "cairo-combsort-inline.h" + +#include + +#define STEP_X CAIRO_FIXED_ONE +#define STEP_Y CAIRO_FIXED_ONE +#define UNROLL3(x) x x x + +#define STEP_XY (2*STEP_X*STEP_Y) /* Unit area in the step. */ +#define AREA_TO_ALPHA(c) (((c)*255 + STEP_XY/2) / STEP_XY) + +typedef struct _cairo_bo_intersect_ordinate { + int32_t ordinate; + enum { EXACT, INEXACT } exactness; +} cairo_bo_intersect_ordinate_t; + +typedef struct _cairo_bo_intersect_point { + cairo_bo_intersect_ordinate_t x; + cairo_bo_intersect_ordinate_t y; +} cairo_bo_intersect_point_t; + +struct quorem { + cairo_fixed_t quo; + cairo_fixed_t rem; +}; + +struct run { + struct run *next; + int sign; + cairo_fixed_t y; +}; + +typedef struct edge { + cairo_list_t link; + + cairo_edge_t edge; + + /* Current x coordinate and advancement. + * Initialised to the x coordinate of the top of the + * edge. The quotient is in cairo_fixed_t units and the + * remainder is mod dy in cairo_fixed_t units. + */ + cairo_fixed_t dy; + struct quorem x; + struct quorem dxdy; + struct quorem dxdy_full; + + cairo_bool_t vertical; + unsigned int flags; + + int current_sign; + struct run *runs; +} edge_t; + +enum { + START = 0x1, + STOP = 0x2, +}; + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef enum { + EVENT_TYPE_STOP, + EVENT_TYPE_INTERSECTION, + EVENT_TYPE_START +} event_type_t; + +typedef struct _event { + cairo_fixed_t y; + event_type_t type; +} event_t; + +typedef struct _start_event { + cairo_fixed_t y; + event_type_t type; + edge_t *edge; +} start_event_t; + +typedef struct _queue_event { + cairo_fixed_t y; + event_type_t type; + edge_t *e1; + edge_t *e2; +} queue_event_t; + +typedef struct _pqueue { + int size, max_size; + + event_t **elements; + event_t *elements_embedded[1024]; +} pqueue_t; + +struct cell { + struct cell *prev; + struct cell *next; + int x; + int uncovered_area; + int covered_height; +}; + +typedef struct _sweep_line { + cairo_list_t active; + cairo_list_t stopped; + cairo_list_t *insert_cursor; + cairo_bool_t is_vertical; + + cairo_fixed_t current_row; + cairo_fixed_t current_subrow; + + struct coverage { + struct cell head; + struct cell tail; + + struct cell *cursor; + int count; + + cairo_freepool_t pool; + } coverage; + + struct event_queue { + pqueue_t pq; + event_t **start_events; + + cairo_freepool_t pool; + } queue; + + cairo_freepool_t runs; + + jmp_buf unwind; +} sweep_line_t; + +cairo_always_inline static struct quorem +floored_divrem (int a, int b) +{ + struct quorem qr; + qr.quo = a/b; + qr.rem = a%b; + if ((a^b)<0 && qr.rem) { + qr.quo--; + qr.rem += b; + } + return qr; +} + +static struct quorem +floored_muldivrem(int x, int a, int b) +{ + struct quorem qr; + long long xa = (long long)x*a; + qr.quo = xa/b; + qr.rem = xa%b; + if ((xa>=0) != (b>=0) && qr.rem) { + qr.quo--; + qr.rem += b; + } + return qr; +} + +static cairo_fixed_t +line_compute_intersection_x_for_y (const cairo_line_t *line, + cairo_fixed_t y) +{ + cairo_fixed_t x, dy; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + dy = line->p2.y - line->p1.y; + if (dy != 0) { + x += _cairo_fixed_mul_div_floor (y - line->p1.y, + line->p2.x - line->p1.x, + dy); + } + + return x; +} + +/* + * We need to compare the x-coordinates of a pair of lines for a particular y, + * without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ B_x + (Y - B_y) * B_dx / B_dy, + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy and B_dy (and (Y - A_y), (Y - B_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * A_dy * B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx * A_dy + * - (Y - A_y) * A_dx * B_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 128 bit arithmetic. For certain, but common, + * input we can reduce this down to a single 32 bit compare by inspecting the + * deltas. + * + * (And put the burden of the work on developing fast 128 bit ops, which are + * required throughout the tessellator.) + * + * See the similar discussion for _slope_compare(). + */ +static int +edges_compare_x_for_y_general (const cairo_edge_t *a, + const cairo_edge_t *b, + int32_t y) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t dx; + int32_t adx, ady; + int32_t bdx, bdy; + enum { + HAVE_NONE = 0x0, + HAVE_DX = 0x1, + HAVE_ADX = 0x2, + HAVE_DX_ADX = HAVE_DX | HAVE_ADX, + HAVE_BDX = 0x4, + HAVE_DX_BDX = HAVE_DX | HAVE_BDX, + HAVE_ADX_BDX = HAVE_ADX | HAVE_BDX, + HAVE_ALL = HAVE_DX | HAVE_ADX | HAVE_BDX + } have_dx_adx_bdx = HAVE_ALL; + + /* don't bother solving for abscissa if the edges' bounding boxes + * can be used to order them. */ + { + int32_t amin, amax; + int32_t bmin, bmax; + if (a->line.p1.x < a->line.p2.x) { + amin = a->line.p1.x; + amax = a->line.p2.x; + } else { + amin = a->line.p2.x; + amax = a->line.p1.x; + } + if (b->line.p1.x < b->line.p2.x) { + bmin = b->line.p1.x; + bmax = b->line.p2.x; + } else { + bmin = b->line.p2.x; + bmax = b->line.p1.x; + } + if (amax < bmin) return -1; + if (amin > bmax) return +1; + } + + ady = a->line.p2.y - a->line.p1.y; + adx = a->line.p2.x - a->line.p1.x; + if (adx == 0) + have_dx_adx_bdx &= ~HAVE_ADX; + + bdy = b->line.p2.y - b->line.p1.y; + bdx = b->line.p2.x - b->line.p1.x; + if (bdx == 0) + have_dx_adx_bdx &= ~HAVE_BDX; + + dx = a->line.p1.x - b->line.p1.x; + if (dx == 0) + have_dx_adx_bdx &= ~HAVE_DX; + +#define L _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (ady, bdy), dx) +#define A _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (adx, bdy), y - a->line.p1.y) +#define B _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (bdx, ady), y - b->line.p1.y) + switch (have_dx_adx_bdx) { + default: + case HAVE_NONE: + return 0; + case HAVE_DX: + /* A_dy * B_dy * (A_x - B_x) ∘ 0 */ + return dx; /* ady * bdy is positive definite */ + case HAVE_ADX: + /* 0 ∘ - (Y - A_y) * A_dx * B_dy */ + return adx; /* bdy * (y - a->top.y) is positive definite */ + case HAVE_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy */ + return -bdx; /* ady * (y - b->top.y) is positive definite */ + case HAVE_ADX_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy - (Y - A_y) * A_dx * B_dy */ + if ((adx ^ bdx) < 0) { + return adx; + } else if (a->line.p1.y == b->line.p1.y) { /* common origin */ + cairo_int64_t adx_bdy, bdx_ady; + + /* ∴ A_dx * B_dy ∘ B_dx * A_dy */ + + adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } else + return _cairo_int128_cmp (A, B); + case HAVE_DX_ADX: + /* A_dy * (A_x - B_x) ∘ - (Y - A_y) * A_dx */ + if ((-adx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t ady_dx, dy_adx; + + ady_dx = _cairo_int32x32_64_mul (ady, dx); + dy_adx = _cairo_int32x32_64_mul (a->line.p1.y - y, adx); + + return _cairo_int64_cmp (ady_dx, dy_adx); + } + case HAVE_DX_BDX: + /* B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx */ + if ((bdx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t bdy_dx, dy_bdx; + + bdy_dx = _cairo_int32x32_64_mul (bdy, dx); + dy_bdx = _cairo_int32x32_64_mul (y - b->line.p1.y, bdx); + + return _cairo_int64_cmp (bdy_dx, dy_bdx); + } + case HAVE_ALL: + /* XXX try comparing (a->line.p2.x - b->line.p2.x) et al */ + return _cairo_int128_cmp (L, _cairo_int128_sub (B, A)); + } +#undef B +#undef A +#undef L +} + +/* + * We need to compare the x-coordinate of a line for a particular y wrt to a + * given x, without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ X + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy (and (Y - A_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * (Y - A_y) * A_dx ∘ (X - A_x) * A_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 64 bit arithmetic. + * + * See the similar discussion for _slope_compare() and + * edges_compare_x_for_y_general(). + */ +static int +edge_compare_for_y_against_x (const cairo_edge_t *a, + int32_t y, + int32_t x) +{ + int32_t adx, ady; + int32_t dx, dy; + cairo_int64_t L, R; + + if (a->line.p1.x <= a->line.p2.x) { + if (x < a->line.p1.x) + return 1; + if (x > a->line.p2.x) + return -1; + } else { + if (x < a->line.p2.x) + return 1; + if (x > a->line.p1.x) + return -1; + } + + adx = a->line.p2.x - a->line.p1.x; + dx = x - a->line.p1.x; + + if (adx == 0) + return -dx; + if (dx == 0 || (adx ^ dx) < 0) + return adx; + + dy = y - a->line.p1.y; + ady = a->line.p2.y - a->line.p1.y; + + L = _cairo_int32x32_64_mul (dy, adx); + R = _cairo_int32x32_64_mul (dx, ady); + + return _cairo_int64_cmp (L, R); +} + +static int +edges_compare_x_for_y (const cairo_edge_t *a, + const cairo_edge_t *b, + int32_t y) +{ + /* If the sweep-line is currently on an end-point of a line, + * then we know its precise x value (and considering that we often need to + * compare events at end-points, this happens frequently enough to warrant + * special casing). + */ + enum { + HAVE_NEITHER = 0x0, + HAVE_AX = 0x1, + HAVE_BX = 0x2, + HAVE_BOTH = HAVE_AX | HAVE_BX + } have_ax_bx = HAVE_BOTH; + int32_t ax, bx; + + /* XXX given we have x and dx? */ + + if (y == a->line.p1.y) + ax = a->line.p1.x; + else if (y == a->line.p2.y) + ax = a->line.p2.x; + else + have_ax_bx &= ~HAVE_AX; + + if (y == b->line.p1.y) + bx = b->line.p1.x; + else if (y == b->line.p2.y) + bx = b->line.p2.x; + else + have_ax_bx &= ~HAVE_BX; + + switch (have_ax_bx) { + default: + case HAVE_NEITHER: + return edges_compare_x_for_y_general (a, b, y); + case HAVE_AX: + return -edge_compare_for_y_against_x (b, y, ax); + case HAVE_BX: + return edge_compare_for_y_against_x (a, y, bx); + case HAVE_BOTH: + return ax - bx; + } +} + +static inline int +slope_compare (const edge_t *a, + const edge_t *b) +{ + cairo_int64_t L, R; + int cmp; + + cmp = a->dxdy.quo - b->dxdy.quo; + if (cmp) + return cmp; + + if (a->dxdy.rem == 0) + return -b->dxdy.rem; + if (b->dxdy.rem == 0) + return a->dxdy.rem; + + L = _cairo_int32x32_64_mul (b->dy, a->dxdy.rem); + R = _cairo_int32x32_64_mul (a->dy, b->dxdy.rem); + return _cairo_int64_cmp (L, R); +} + +static inline int +line_equal (const cairo_line_t *a, const cairo_line_t *b) +{ + return a->p1.x == b->p1.x && a->p1.y == b->p1.y && + a->p2.x == b->p2.x && a->p2.y == b->p2.y; +} + +static inline int +sweep_line_compare_edges (const edge_t *a, + const edge_t *b, + cairo_fixed_t y) +{ + int cmp; + + if (line_equal (&a->edge.line, &b->edge.line)) + return 0; + + cmp = edges_compare_x_for_y (&a->edge, &b->edge, y); + if (cmp) + return cmp; + + return slope_compare (a, b); +} + +static inline cairo_int64_t +det32_64 (int32_t a, int32_t b, + int32_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int64_sub (_cairo_int32x32_64_mul (a, d), + _cairo_int32x32_64_mul (b, c)); +} + +static inline cairo_int128_t +det64x32_128 (cairo_int64_t a, int32_t b, + cairo_int64_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int128_sub (_cairo_int64x32_128_mul (a, d), + _cairo_int64x32_128_mul (c, b)); +} + +/* Compute the intersection of two lines as defined by two edges. The + * result is provided as a coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection or + * %CAIRO_BO_STATUS_PARALLEL if the two lines are exactly parallel. + */ +static cairo_bool_t +intersect_lines (const edge_t *a, const edge_t *b, + cairo_bo_intersect_point_t *intersection) +{ + cairo_int64_t a_det, b_det; + + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm begins. + * What we're doing to mitigate this is to perform clamping in + * cairo_bo_tessellate_polygon(). + */ + int32_t dx1 = a->edge.line.p1.x - a->edge.line.p2.x; + int32_t dy1 = a->edge.line.p1.y - a->edge.line.p2.y; + + int32_t dx2 = b->edge.line.p1.x - b->edge.line.p2.x; + int32_t dy2 = b->edge.line.p1.y - b->edge.line.p2.y; + + cairo_int64_t den_det; + cairo_int64_t R; + cairo_quorem64_t qr; + + den_det = det32_64 (dx1, dy1, dx2, dy2); + + /* Q: Can we determine that the lines do not intersect (within range) + * much more cheaply than computing the intersection point i.e. by + * avoiding the division? + * + * X = ax + t * adx = bx + s * bdx; + * Y = ay + t * ady = by + s * bdy; + * ∴ t * (ady*bdx - bdy*adx) = bdx * (by - ay) + bdy * (ax - bx) + * => t * L = R + * + * Therefore we can reject any intersection (under the criteria for + * valid intersection events) if: + * L^R < 0 => t < 0, or + * L t > 1 + * + * (where top/bottom must at least extend to the line endpoints). + * + * A similar substitution can be performed for s, yielding: + * s * (ady*bdx - bdy*adx) = ady * (ax - bx) - adx * (ay - by) + */ + R = det32_64 (dx2, dy2, + b->edge.line.p1.x - a->edge.line.p1.x, + b->edge.line.p1.y - a->edge.line.p1.y); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + R = det32_64 (dy1, dx1, + a->edge.line.p1.y - b->edge.line.p1.y, + a->edge.line.p1.x - b->edge.line.p1.x); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + /* We now know that the two lines should intersect within range. */ + + a_det = det32_64 (a->edge.line.p1.x, a->edge.line.p1.y, + a->edge.line.p2.x, a->edge.line.p2.y); + b_det = det32_64 (b->edge.line.p1.x, b->edge.line.p1.y, + b->edge.line.p2.x, b->edge.line.p2.y); + + /* x = det (a_det, dx1, b_det, dx2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dx1, + b_det, dx2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->x.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->x.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->x.exactness = INEXACT; + } +#endif + intersection->x.ordinate = _cairo_int64_to_int32 (qr.quo); + + /* y = det (a_det, dy1, b_det, dy2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dy1, + b_det, dy2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->y.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->y.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + /* compute ceiling away from zero */ + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + intersection->y.exactness = INEXACT; + } +#endif + intersection->y.ordinate = _cairo_int64_to_int32 (qr.quo); + + return TRUE; +} + +static int +bo_intersect_ordinate_32_compare (int32_t a, int32_t b, int exactness) +{ + int cmp; + + /* First compare the quotient */ + cmp = a - b; + if (cmp) + return cmp; + + /* With quotient identical, if remainder is 0 then compare equal */ + /* Otherwise, the non-zero remainder makes a > b */ + return -(INEXACT == exactness); +} + +/* Does the given edge contain the given point. The point must already + * be known to be contained within the line determined by the edge, + * (most likely the point results from an intersection of this edge + * with another). + * + * If we had exact arithmetic, then this function would simply be a + * matter of examining whether the y value of the point lies within + * the range of y values of the edge. But since intersection points + * are not exact due to being rounded to the nearest integer within + * the available precision, we must also examine the x value of the + * point. + * + * The definition of "contains" here is that the given intersection + * point will be seen by the sweep line after the start event for the + * given edge and before the stop event for the edge. See the comments + * in the implementation for more details. + */ +static cairo_bool_t +bo_edge_contains_intersect_point (const edge_t *edge, + cairo_bo_intersect_point_t *point) +{ + int cmp_top, cmp_bottom; + + /* XXX: When running the actual algorithm, we don't actually need to + * compare against edge->top at all here, since any intersection above + * top is eliminated early via a slope comparison. We're leaving these + * here for now only for the sake of the quadratic-time intersection + * finder which needs them. + */ + + cmp_top = bo_intersect_ordinate_32_compare (point->y.ordinate, + edge->edge.top, + point->y.exactness); + if (cmp_top < 0) + return FALSE; + + cmp_bottom = bo_intersect_ordinate_32_compare (point->y.ordinate, + edge->edge.bottom, + point->y.exactness); + if (cmp_bottom > 0) + return FALSE; + + if (cmp_top > 0 && cmp_bottom < 0) + return TRUE; + + /* At this stage, the point lies on the same y value as either + * edge->top or edge->bottom, so we have to examine the x value in + * order to properly determine containment. */ + + /* If the y value of the point is the same as the y value of the + * top of the edge, then the x value of the point must be greater + * to be considered as inside the edge. Similarly, if the y value + * of the point is the same as the y value of the bottom of the + * edge, then the x value of the point must be less to be + * considered as inside. */ + + if (cmp_top == 0) { + cairo_fixed_t top_x; + + top_x = line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.top); + return bo_intersect_ordinate_32_compare (top_x, point->x.ordinate, point->x.exactness) < 0; + } else { /* cmp_bottom == 0 */ + cairo_fixed_t bot_x; + + bot_x = line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.bottom); + return bo_intersect_ordinate_32_compare (point->x.ordinate, bot_x, point->x.exactness) < 0; + } +} + +static cairo_bool_t +edge_intersect (const edge_t *a, + const edge_t *b, + cairo_point_t *intersection) +{ + cairo_bo_intersect_point_t quorem; + + if (! intersect_lines (a, b, &quorem)) + return FALSE; + + if (a->edge.top != a->edge.line.p1.y || a->edge.bottom != a->edge.line.p2.y) { + if (! bo_edge_contains_intersect_point (a, &quorem)) + return FALSE; + } + + if (b->edge.top != b->edge.line.p1.y || b->edge.bottom != b->edge.line.p2.y) { + if (! bo_edge_contains_intersect_point (b, &quorem)) + return FALSE; + } + + /* Now that we've correctly compared the intersection point and + * determined that it lies within the edge, then we know that we + * no longer need any more bits of storage for the intersection + * than we do for our edge coordinates. We also no longer need the + * remainder from the division. */ + intersection->x = quorem.x.ordinate; + intersection->y = quorem.y.ordinate; + + return TRUE; +} + +static inline int +event_compare (const event_t *a, const event_t *b) +{ + return a->y - b->y; +} + +static void +pqueue_init (pqueue_t *pq) +{ + pq->max_size = ARRAY_LENGTH (pq->elements_embedded); + pq->size = 0; + + pq->elements = pq->elements_embedded; +} + +static void +pqueue_fini (pqueue_t *pq) +{ + if (pq->elements != pq->elements_embedded) + free (pq->elements); +} + +static cairo_bool_t +pqueue_grow (pqueue_t *pq) +{ + event_t **new_elements; + pq->max_size *= 2; + + if (pq->elements == pq->elements_embedded) { + new_elements = _cairo_malloc_ab (pq->max_size, + sizeof (event_t *)); + if (unlikely (new_elements == NULL)) + return FALSE; + + memcpy (new_elements, pq->elements_embedded, + sizeof (pq->elements_embedded)); + } else { + new_elements = _cairo_realloc_ab (pq->elements, + pq->max_size, + sizeof (event_t *)); + if (unlikely (new_elements == NULL)) + return FALSE; + } + + pq->elements = new_elements; + return TRUE; +} + +static inline void +pqueue_push (sweep_line_t *sweep_line, event_t *event) +{ + event_t **elements; + int i, parent; + + if (unlikely (sweep_line->queue.pq.size + 1 == sweep_line->queue.pq.max_size)) { + if (unlikely (! pqueue_grow (&sweep_line->queue.pq))) { + longjmp (sweep_line->unwind, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + elements = sweep_line->queue.pq.elements; + for (i = ++sweep_line->queue.pq.size; + i != PQ_FIRST_ENTRY && + event_compare (event, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = event; +} + +static inline void +pqueue_pop (pqueue_t *pq) +{ + event_t **elements = pq->elements; + event_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + event_compare (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (event_compare (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline void +event_insert (sweep_line_t *sweep_line, + event_type_t type, + edge_t *e1, + edge_t *e2, + cairo_fixed_t y) +{ + queue_event_t *event; + + event = _cairo_freepool_alloc (&sweep_line->queue.pool); + if (unlikely (event == NULL)) { + longjmp (sweep_line->unwind, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + event->y = y; + event->type = type; + event->e1 = e1; + event->e2 = e2; + + pqueue_push (sweep_line, (event_t *) event); +} + +static void +event_delete (sweep_line_t *sweep_line, + event_t *event) +{ + _cairo_freepool_free (&sweep_line->queue.pool, event); +} + +static inline event_t * +event_next (sweep_line_t *sweep_line) +{ + event_t *event, *cmp; + + event = sweep_line->queue.pq.elements[PQ_FIRST_ENTRY]; + cmp = *sweep_line->queue.start_events; + if (event == NULL || + (cmp != NULL && event_compare (cmp, event) < 0)) + { + event = cmp; + sweep_line->queue.start_events++; + } + else + { + pqueue_pop (&sweep_line->queue.pq); + } + + return event; +} + +CAIRO_COMBSORT_DECLARE (start_event_sort, event_t *, event_compare) + +static inline void +event_insert_stop (sweep_line_t *sweep_line, + edge_t *edge) +{ + event_insert (sweep_line, + EVENT_TYPE_STOP, + edge, NULL, + edge->edge.bottom); +} + +static inline void +event_insert_if_intersect_below_current_y (sweep_line_t *sweep_line, + edge_t *left, + edge_t *right) +{ + cairo_point_t intersection; + + /* start points intersect */ + if (left->edge.line.p1.x == right->edge.line.p1.x && + left->edge.line.p1.y == right->edge.line.p1.y) + { + return; + } + + /* end points intersect, process DELETE events first */ + if (left->edge.line.p2.x == right->edge.line.p2.x && + left->edge.line.p2.y == right->edge.line.p2.y) + { + return; + } + + if (slope_compare (left, right) <= 0) + return; + + if (! edge_intersect (left, right, &intersection)) + return; + + event_insert (sweep_line, + EVENT_TYPE_INTERSECTION, + left, right, + intersection.y); +} + +static inline edge_t * +link_to_edge (cairo_list_t *link) +{ + return (edge_t *) link; +} + +static void +sweep_line_insert (sweep_line_t *sweep_line, + edge_t *edge) +{ + cairo_list_t *pos; + cairo_fixed_t y = sweep_line->current_subrow; + + pos = sweep_line->insert_cursor; + if (pos == &sweep_line->active) + pos = sweep_line->active.next; + if (pos != &sweep_line->active) { + int cmp; + + cmp = sweep_line_compare_edges (link_to_edge (pos), + edge, + y); + if (cmp < 0) { + while (pos->next != &sweep_line->active && + sweep_line_compare_edges (link_to_edge (pos->next), + edge, + y) < 0) + { + pos = pos->next; + } + } else if (cmp > 0) { + do { + pos = pos->prev; + } while (pos != &sweep_line->active && + sweep_line_compare_edges (link_to_edge (pos), + edge, + y) > 0); + } + } + cairo_list_add (&edge->link, pos); + sweep_line->insert_cursor = &edge->link; +} + +inline static void +coverage_rewind (struct coverage *cells) +{ + cells->cursor = &cells->head; +} + +static void +coverage_init (struct coverage *cells) +{ + _cairo_freepool_init (&cells->pool, + sizeof (struct cell)); + cells->head.prev = NULL; + cells->head.next = &cells->tail; + cells->head.x = INT_MIN; + cells->tail.prev = &cells->head; + cells->tail.next = NULL; + cells->tail.x = INT_MAX; + cells->count = 0; + coverage_rewind (cells); +} + +static void +coverage_fini (struct coverage *cells) +{ + _cairo_freepool_fini (&cells->pool); +} + +inline static void +coverage_reset (struct coverage *cells) +{ + cells->head.next = &cells->tail; + cells->tail.prev = &cells->head; + cells->count = 0; + _cairo_freepool_reset (&cells->pool); + coverage_rewind (cells); +} + +static struct cell * +coverage_alloc (sweep_line_t *sweep_line, + struct cell *tail, + int x) +{ + struct cell *cell; + + cell = _cairo_freepool_alloc (&sweep_line->coverage.pool); + if (unlikely (NULL == cell)) { + longjmp (sweep_line->unwind, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + tail->prev->next = cell; + cell->prev = tail->prev; + cell->next = tail; + tail->prev = cell; + cell->x = x; + cell->uncovered_area = 0; + cell->covered_height = 0; + sweep_line->coverage.count++; + return cell; +} + +inline static struct cell * +coverage_find (sweep_line_t *sweep_line, int x) +{ + struct cell *cell; + + cell = sweep_line->coverage.cursor; + if (unlikely (cell->x > x)) { + do { + if (cell->prev->x < x) + break; + cell = cell->prev; + } while (TRUE); + } else { + if (cell->x == x) + return cell; + + do { + UNROLL3({ + cell = cell->next; + if (cell->x >= x) + break; + }); + } while (TRUE); + } + + if (cell->x != x) + cell = coverage_alloc (sweep_line, cell, x); + + return sweep_line->coverage.cursor = cell; +} + +static void +coverage_render_cells (sweep_line_t *sweep_line, + cairo_fixed_t left, cairo_fixed_t right, + cairo_fixed_t y1, cairo_fixed_t y2, + int sign) +{ + int fx1, fx2; + int ix1, ix2; + int dx, dy; + + /* Orient the edge left-to-right. */ + dx = right - left; + if (dx >= 0) { + ix1 = _cairo_fixed_integer_part (left); + fx1 = _cairo_fixed_fractional_part (left); + + ix2 = _cairo_fixed_integer_part (right); + fx2 = _cairo_fixed_fractional_part (right); + + dy = y2 - y1; + } else { + ix1 = _cairo_fixed_integer_part (right); + fx1 = _cairo_fixed_fractional_part (right); + + ix2 = _cairo_fixed_integer_part (left); + fx2 = _cairo_fixed_fractional_part (left); + + dx = -dx; + sign = -sign; + dy = y1 - y2; + y1 = y2 - dy; + y2 = y1 + dy; + } + + /* Add coverage for all pixels [ix1,ix2] on this row crossed + * by the edge. */ + { + struct quorem y = floored_divrem ((STEP_X - fx1)*dy, dx); + struct cell *cell; + + cell = sweep_line->coverage.cursor; + if (cell->x != ix1) { + if (unlikely (cell->x > ix1)) { + do { + if (cell->prev->x < ix1) + break; + cell = cell->prev; + } while (TRUE); + } else do { + UNROLL3({ + if (cell->x >= ix1) + break; + cell = cell->next; + }); + } while (TRUE); + + if (cell->x != ix1) + cell = coverage_alloc (sweep_line, cell, ix1); + } + + cell->uncovered_area += sign * y.quo * (STEP_X + fx1); + cell->covered_height += sign * y.quo; + y.quo += y1; + + cell = cell->next; + if (cell->x != ++ix1) + cell = coverage_alloc (sweep_line, cell, ix1); + if (ix1 < ix2) { + struct quorem dydx_full = floored_divrem (STEP_X*dy, dx); + + do { + cairo_fixed_t y_skip = dydx_full.quo; + y.rem += dydx_full.rem; + if (y.rem >= dx) { + ++y_skip; + y.rem -= dx; + } + + y.quo += y_skip; + + y_skip *= sign; + cell->covered_height += y_skip; + cell->uncovered_area += y_skip*STEP_X; + + cell = cell->next; + if (cell->x != ++ix1) + cell = coverage_alloc (sweep_line, cell, ix1); + } while (ix1 != ix2); + } + cell->uncovered_area += sign*(y2 - y.quo)*fx2; + cell->covered_height += sign*(y2 - y.quo); + sweep_line->coverage.cursor = cell; + } +} + +inline static void +full_inc_edge (edge_t *edge) +{ + edge->x.quo += edge->dxdy_full.quo; + edge->x.rem += edge->dxdy_full.rem; + if (edge->x.rem >= 0) { + ++edge->x.quo; + edge->x.rem -= edge->dy; + } +} + +static void +full_add_edge (sweep_line_t *sweep_line, edge_t *edge, int sign) +{ + struct cell *cell; + cairo_fixed_t x1, x2; + int ix1, ix2; + int frac; + + edge->current_sign = sign; + + ix1 = _cairo_fixed_integer_part (edge->x.quo); + + if (edge->vertical) { + frac = _cairo_fixed_fractional_part (edge->x.quo); + cell = coverage_find (sweep_line, ix1); + cell->covered_height += sign * STEP_Y; + cell->uncovered_area += sign * 2 * frac * STEP_Y; + return; + } + + x1 = edge->x.quo; + full_inc_edge (edge); + x2 = edge->x.quo; + + ix2 = _cairo_fixed_integer_part (edge->x.quo); + + /* Edge is entirely within a column? */ + if (likely (ix1 == ix2)) { + frac = _cairo_fixed_fractional_part (x1) + + _cairo_fixed_fractional_part (x2); + cell = coverage_find (sweep_line, ix1); + cell->covered_height += sign * STEP_Y; + cell->uncovered_area += sign * frac * STEP_Y; + return; + } + + coverage_render_cells (sweep_line, x1, x2, 0, STEP_Y, sign); +} + +static void +full_nonzero (sweep_line_t *sweep_line) +{ + cairo_list_t *pos; + + sweep_line->is_vertical = TRUE; + pos = sweep_line->active.next; + do { + edge_t *left = link_to_edge (pos), *right; + int winding = left->edge.dir; + + sweep_line->is_vertical &= left->vertical; + + pos = left->link.next; + do { + if (unlikely (pos == &sweep_line->active)) { + full_add_edge (sweep_line, left, +1); + return; + } + + right = link_to_edge (pos); + pos = pos->next; + sweep_line->is_vertical &= right->vertical; + + winding += right->edge.dir; + if (0 == winding) { + if (pos == &sweep_line->active || + link_to_edge (pos)->x.quo != right->x.quo) + { + break; + } + } + + if (! right->vertical) + full_inc_edge (right); + } while (TRUE); + + full_add_edge (sweep_line, left, +1); + full_add_edge (sweep_line, right, -1); + } while (pos != &sweep_line->active); +} + +static void +full_evenodd (sweep_line_t *sweep_line) +{ + cairo_list_t *pos; + + sweep_line->is_vertical = TRUE; + pos = sweep_line->active.next; + do { + edge_t *left = link_to_edge (pos), *right; + int winding = 0; + + sweep_line->is_vertical &= left->vertical; + + pos = left->link.next; + do { + if (pos == &sweep_line->active) { + full_add_edge (sweep_line, left, +1); + return; + } + + right = link_to_edge (pos); + pos = pos->next; + sweep_line->is_vertical &= right->vertical; + + if (++winding & 1) { + if (pos == &sweep_line->active || + link_to_edge (pos)->x.quo != right->x.quo) + { + break; + } + } + + if (! right->vertical) + full_inc_edge (right); + } while (TRUE); + + full_add_edge (sweep_line, left, +1); + full_add_edge (sweep_line, right, -1); + } while (pos != &sweep_line->active); +} + +static void +render_rows (cairo_botor_scan_converter_t *self, + sweep_line_t *sweep_line, + int y, int height, + cairo_span_renderer_t *renderer) +{ + cairo_half_open_span_t spans_stack[CAIRO_STACK_ARRAY_LENGTH (cairo_half_open_span_t)]; + cairo_half_open_span_t *spans = spans_stack; + struct cell *cell; + int prev_x, cover; + int num_spans; + cairo_status_t status; + + if (unlikely (sweep_line->coverage.count == 0)) { + status = renderer->render_rows (renderer, y, height, NULL, 0); + if (unlikely (status)) + longjmp (sweep_line->unwind, status); + return; + } + + /* Allocate enough spans for the row. */ + + num_spans = 2*sweep_line->coverage.count+2; + if (unlikely (num_spans > ARRAY_LENGTH (spans_stack))) { + spans = _cairo_malloc_ab (num_spans, sizeof (cairo_half_open_span_t)); + if (unlikely (spans == NULL)) { + longjmp (sweep_line->unwind, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + /* Form the spans from the coverage and areas. */ + num_spans = 0; + prev_x = self->xmin; + cover = 0; + cell = sweep_line->coverage.head.next; + do { + int x = cell->x; + int area; + + if (x > prev_x) { + spans[num_spans].x = prev_x; + spans[num_spans].inverse = 0; + spans[num_spans].coverage = AREA_TO_ALPHA (cover); + ++num_spans; + } + + cover += cell->covered_height*STEP_X*2; + area = cover - cell->uncovered_area; + + spans[num_spans].x = x; + spans[num_spans].coverage = AREA_TO_ALPHA (area); + ++num_spans; + + prev_x = x + 1; + } while ((cell = cell->next) != &sweep_line->coverage.tail); + + if (prev_x <= self->xmax) { + spans[num_spans].x = prev_x; + spans[num_spans].inverse = 0; + spans[num_spans].coverage = AREA_TO_ALPHA (cover); + ++num_spans; + } + + if (cover && prev_x < self->xmax) { + spans[num_spans].x = self->xmax; + spans[num_spans].inverse = 1; + spans[num_spans].coverage = 0; + ++num_spans; + } + + status = renderer->render_rows (renderer, y, height, spans, num_spans); + + if (unlikely (spans != spans_stack)) + free (spans); + + coverage_reset (&sweep_line->coverage); + + if (unlikely (status)) + longjmp (sweep_line->unwind, status); +} + +static void +full_repeat (sweep_line_t *sweep) +{ + edge_t *edge; + + cairo_list_foreach_entry (edge, edge_t, &sweep->active, link) { + if (edge->current_sign) + full_add_edge (sweep, edge, edge->current_sign); + else if (! edge->vertical) + full_inc_edge (edge); + } +} + +static void +full_reset (sweep_line_t *sweep) +{ + edge_t *edge; + + cairo_list_foreach_entry (edge, edge_t, &sweep->active, link) + edge->current_sign = 0; +} + +static void +full_step (cairo_botor_scan_converter_t *self, + sweep_line_t *sweep_line, + cairo_fixed_t row, + cairo_span_renderer_t *renderer) +{ + int top, bottom; + + top = _cairo_fixed_integer_part (sweep_line->current_row); + bottom = _cairo_fixed_integer_part (row); + if (cairo_list_is_empty (&sweep_line->active)) { + cairo_status_t status; + + status = renderer->render_rows (renderer, top, bottom - top, NULL, 0); + if (unlikely (status)) + longjmp (sweep_line->unwind, status); + + return; + } + + if (self->fill_rule == CAIRO_FILL_RULE_WINDING) + full_nonzero (sweep_line); + else + full_evenodd (sweep_line); + + if (sweep_line->is_vertical || bottom == top + 1) { + render_rows (self, sweep_line, top, bottom - top, renderer); + full_reset (sweep_line); + return; + } + + render_rows (self, sweep_line, top++, 1, renderer); + do { + full_repeat (sweep_line); + render_rows (self, sweep_line, top, 1, renderer); + } while (++top != bottom); + + full_reset (sweep_line); +} + +cairo_always_inline static void +sub_inc_edge (edge_t *edge, + cairo_fixed_t height) +{ + if (height == 1) { + edge->x.quo += edge->dxdy.quo; + edge->x.rem += edge->dxdy.rem; + if (edge->x.rem >= 0) { + ++edge->x.quo; + edge->x.rem -= edge->dy; + } + } else { + edge->x.quo += height * edge->dxdy.quo; + edge->x.rem += height * edge->dxdy.rem; + if (edge->x.rem >= 0) { + int carry = edge->x.rem / edge->dy + 1; + edge->x.quo += carry; + edge->x.rem -= carry * edge->dy; + } + } +} + +static void +sub_add_run (sweep_line_t *sweep_line, edge_t *edge, int y, int sign) +{ + struct run *run; + + run = _cairo_freepool_alloc (&sweep_line->runs); + if (unlikely (run == NULL)) + longjmp (sweep_line->unwind, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + + run->y = y; + run->sign = sign; + run->next = edge->runs; + edge->runs = run; + + edge->current_sign = sign; +} + +inline static cairo_bool_t +edges_coincident (edge_t *left, edge_t *right, cairo_fixed_t y) +{ + /* XXX is compare_x_for_y() worth executing during sub steps? */ + return line_equal (&left->edge.line, &right->edge.line); + //edges_compare_x_for_y (&left->edge, &right->edge, y) >= 0; +} + +static void +sub_nonzero (sweep_line_t *sweep_line) +{ + cairo_fixed_t y = sweep_line->current_subrow; + cairo_fixed_t fy = _cairo_fixed_fractional_part (y); + cairo_list_t *pos; + + pos = sweep_line->active.next; + do { + edge_t *left = link_to_edge (pos), *right; + int winding = left->edge.dir; + + pos = left->link.next; + do { + if (unlikely (pos == &sweep_line->active)) { + if (left->current_sign != +1) + sub_add_run (sweep_line, left, fy, +1); + return; + } + + right = link_to_edge (pos); + pos = pos->next; + + winding += right->edge.dir; + if (0 == winding) { + if (pos == &sweep_line->active || + ! edges_coincident (right, link_to_edge (pos), y)) + { + break; + } + } + + if (right->current_sign) + sub_add_run (sweep_line, right, fy, 0); + } while (TRUE); + + if (left->current_sign != +1) + sub_add_run (sweep_line, left, fy, +1); + if (right->current_sign != -1) + sub_add_run (sweep_line, right, fy, -1); + } while (pos != &sweep_line->active); +} + +static void +sub_evenodd (sweep_line_t *sweep_line) +{ + cairo_fixed_t y = sweep_line->current_subrow; + cairo_fixed_t fy = _cairo_fixed_fractional_part (y); + cairo_list_t *pos; + + pos = sweep_line->active.next; + do { + edge_t *left = link_to_edge (pos), *right; + int winding = 0; + + pos = left->link.next; + do { + if (unlikely (pos == &sweep_line->active)) { + if (left->current_sign != +1) + sub_add_run (sweep_line, left, fy, +1); + return; + } + + right = link_to_edge (pos); + pos = pos->next; + + if (++winding & 1) { + if (pos == &sweep_line->active || + ! edges_coincident (right, link_to_edge (pos), y)) + { + break; + } + } + + if (right->current_sign) + sub_add_run (sweep_line, right, fy, 0); + } while (TRUE); + + if (left->current_sign != +1) + sub_add_run (sweep_line, left, fy, +1); + if (right->current_sign != -1) + sub_add_run (sweep_line, right, fy, -1); + } while (pos != &sweep_line->active); +} + +cairo_always_inline static void +sub_step (cairo_botor_scan_converter_t *self, + sweep_line_t *sweep_line) +{ + if (cairo_list_is_empty (&sweep_line->active)) + return; + + if (self->fill_rule == CAIRO_FILL_RULE_WINDING) + sub_nonzero (sweep_line); + else + sub_evenodd (sweep_line); +} + +static void +coverage_render_runs (sweep_line_t *sweep, edge_t *edge, + cairo_fixed_t y1, cairo_fixed_t y2) +{ + struct run tail; + struct run *run = &tail; + + tail.next = NULL; + tail.y = y2; + + /* Order the runs top->bottom */ + while (edge->runs) { + struct run *r; + + r = edge->runs; + edge->runs = r->next; + r->next = run; + run = r; + } + + if (run->y > y1) + sub_inc_edge (edge, run->y - y1); + + do { + cairo_fixed_t x1, x2; + + y1 = run->y; + y2 = run->next->y; + + x1 = edge->x.quo; + if (y2 - y1 == STEP_Y) + full_inc_edge (edge); + else + sub_inc_edge (edge, y2 - y1); + x2 = edge->x.quo; + + if (run->sign) { + int ix1, ix2; + + ix1 = _cairo_fixed_integer_part (x1); + ix2 = _cairo_fixed_integer_part (x2); + + /* Edge is entirely within a column? */ + if (likely (ix1 == ix2)) { + struct cell *cell; + int frac; + + frac = _cairo_fixed_fractional_part (x1) + + _cairo_fixed_fractional_part (x2); + cell = coverage_find (sweep, ix1); + cell->covered_height += run->sign * (y2 - y1); + cell->uncovered_area += run->sign * (y2 - y1) * frac; + } else { + coverage_render_cells (sweep, x1, x2, y1, y2, run->sign); + } + } + + run = run->next; + } while (run->next != NULL); +} + +static void +coverage_render_vertical_runs (sweep_line_t *sweep, edge_t *edge, cairo_fixed_t y2) +{ + struct cell *cell; + struct run *run; + int height = 0; + + for (run = edge->runs; run != NULL; run = run->next) { + if (run->sign) + height += run->sign * (y2 - run->y); + y2 = run->y; + } + + cell = coverage_find (sweep, _cairo_fixed_integer_part (edge->x.quo)); + cell->covered_height += height; + cell->uncovered_area += 2 * _cairo_fixed_fractional_part (edge->x.quo) * height; +} + +cairo_always_inline static void +sub_emit (cairo_botor_scan_converter_t *self, + sweep_line_t *sweep, + cairo_span_renderer_t *renderer) +{ + edge_t *edge; + + sub_step (self, sweep); + + /* convert the runs into coverages */ + + cairo_list_foreach_entry (edge, edge_t, &sweep->active, link) { + if (edge->runs == NULL) { + if (! edge->vertical) { + if (edge->flags & START) { + sub_inc_edge (edge, + STEP_Y - _cairo_fixed_fractional_part (edge->edge.top)); + edge->flags &= ~START; + } else + full_inc_edge (edge); + } + } else { + if (edge->vertical) { + coverage_render_vertical_runs (sweep, edge, STEP_Y); + } else { + int y1 = 0; + if (edge->flags & START) { + y1 = _cairo_fixed_fractional_part (edge->edge.top); + edge->flags &= ~START; + } + coverage_render_runs (sweep, edge, y1, STEP_Y); + } + } + edge->current_sign = 0; + edge->runs = NULL; + } + + cairo_list_foreach_entry (edge, edge_t, &sweep->stopped, link) { + int y2 = _cairo_fixed_fractional_part (edge->edge.bottom); + if (edge->vertical) { + coverage_render_vertical_runs (sweep, edge, y2); + } else { + int y1 = 0; + if (edge->flags & START) + y1 = _cairo_fixed_fractional_part (edge->edge.top); + coverage_render_runs (sweep, edge, y1, y2); + } + } + cairo_list_init (&sweep->stopped); + + _cairo_freepool_reset (&sweep->runs); + + render_rows (self, sweep, + _cairo_fixed_integer_part (sweep->current_row), 1, + renderer); +} + +static void +sweep_line_init (sweep_line_t *sweep_line, + event_t **start_events, + int num_events) +{ + cairo_list_init (&sweep_line->active); + cairo_list_init (&sweep_line->stopped); + sweep_line->insert_cursor = &sweep_line->active; + + sweep_line->current_row = INT32_MIN; + sweep_line->current_subrow = INT32_MIN; + + coverage_init (&sweep_line->coverage); + _cairo_freepool_init (&sweep_line->runs, sizeof (struct run)); + + start_event_sort (start_events, num_events); + start_events[num_events] = NULL; + + sweep_line->queue.start_events = start_events; + + _cairo_freepool_init (&sweep_line->queue.pool, + sizeof (queue_event_t)); + pqueue_init (&sweep_line->queue.pq); + sweep_line->queue.pq.elements[PQ_FIRST_ENTRY] = NULL; +} + +static void +sweep_line_delete (sweep_line_t *sweep_line, + edge_t *edge) +{ + if (sweep_line->insert_cursor == &edge->link) + sweep_line->insert_cursor = edge->link.prev; + + cairo_list_del (&edge->link); + if (edge->runs) + cairo_list_add_tail (&edge->link, &sweep_line->stopped); + edge->flags |= STOP; +} + +static void +sweep_line_swap (sweep_line_t *sweep_line, + edge_t *left, + edge_t *right) +{ + right->link.prev = left->link.prev; + left->link.next = right->link.next; + right->link.next = &left->link; + left->link.prev = &right->link; + left->link.next->prev = &left->link; + right->link.prev->next = &right->link; +} + +static void +sweep_line_fini (sweep_line_t *sweep_line) +{ + pqueue_fini (&sweep_line->queue.pq); + _cairo_freepool_fini (&sweep_line->queue.pool); + coverage_fini (&sweep_line->coverage); + _cairo_freepool_fini (&sweep_line->runs); +} + +static cairo_status_t +botor_generate (cairo_botor_scan_converter_t *self, + event_t **start_events, + cairo_span_renderer_t *renderer) +{ + cairo_status_t status; + sweep_line_t sweep_line; + cairo_fixed_t ybot; + event_t *event; + cairo_list_t *left, *right; + edge_t *e1, *e2; + int bottom; + + sweep_line_init (&sweep_line, start_events, self->num_edges); + if ((status = setjmp (sweep_line.unwind))) + goto unwind; + + ybot = self->extents.p2.y; + sweep_line.current_subrow = self->extents.p1.y; + sweep_line.current_row = _cairo_fixed_floor (self->extents.p1.y); + event = *sweep_line.queue.start_events++; + do { + /* Can we process a full step in one go? */ + if (event->y >= sweep_line.current_row + STEP_Y) { + bottom = _cairo_fixed_floor (event->y); + full_step (self, &sweep_line, bottom, renderer); + sweep_line.current_row = bottom; + sweep_line.current_subrow = bottom; + } + + do { + if (event->y > sweep_line.current_subrow) { + sub_step (self, &sweep_line); + sweep_line.current_subrow = event->y; + } + + do { + /* Update the active list using Bentley-Ottmann */ + switch (event->type) { + case EVENT_TYPE_START: + e1 = ((start_event_t *) event)->edge; + + sweep_line_insert (&sweep_line, e1); + event_insert_stop (&sweep_line, e1); + + left = e1->link.prev; + right = e1->link.next; + + if (left != &sweep_line.active) { + event_insert_if_intersect_below_current_y (&sweep_line, + link_to_edge (left), e1); + } + + if (right != &sweep_line.active) { + event_insert_if_intersect_below_current_y (&sweep_line, + e1, link_to_edge (right)); + } + + break; + + case EVENT_TYPE_STOP: + e1 = ((queue_event_t *) event)->e1; + event_delete (&sweep_line, event); + + left = e1->link.prev; + right = e1->link.next; + + sweep_line_delete (&sweep_line, e1); + + if (left != &sweep_line.active && + right != &sweep_line.active) + { + event_insert_if_intersect_below_current_y (&sweep_line, + link_to_edge (left), + link_to_edge (right)); + } + + break; + + case EVENT_TYPE_INTERSECTION: + e1 = ((queue_event_t *) event)->e1; + e2 = ((queue_event_t *) event)->e2; + + event_delete (&sweep_line, event); + if (e1->flags & STOP) + break; + if (e2->flags & STOP) + break; + + /* skip this intersection if its edges are not adjacent */ + if (&e2->link != e1->link.next) + break; + + left = e1->link.prev; + right = e2->link.next; + + sweep_line_swap (&sweep_line, e1, e2); + + /* after the swap e2 is left of e1 */ + if (left != &sweep_line.active) { + event_insert_if_intersect_below_current_y (&sweep_line, + link_to_edge (left), e2); + } + + if (right != &sweep_line.active) { + event_insert_if_intersect_below_current_y (&sweep_line, + e1, link_to_edge (right)); + } + + break; + } + + event = event_next (&sweep_line); + if (event == NULL) + goto end; + } while (event->y == sweep_line.current_subrow); + } while (event->y < sweep_line.current_row + STEP_Y); + + bottom = sweep_line.current_row + STEP_Y; + sub_emit (self, &sweep_line, renderer); + sweep_line.current_subrow = bottom; + sweep_line.current_row = sweep_line.current_subrow; + } while (TRUE); + + end: + /* flush any partial spans */ + if (sweep_line.current_subrow != sweep_line.current_row) { + sub_emit (self, &sweep_line, renderer); + sweep_line.current_row += STEP_Y; + sweep_line.current_subrow = sweep_line.current_row; + } + /* clear the rest */ + if (sweep_line.current_subrow < ybot) { + bottom = _cairo_fixed_integer_part (sweep_line.current_row); + status = renderer->render_rows (renderer, + bottom, _cairo_fixed_integer_ceil (ybot) - bottom, + NULL, 0); + } + + unwind: + sweep_line_fini (&sweep_line); + + return status; +} + +static cairo_status_t +_cairo_botor_scan_converter_generate (void *converter, + cairo_span_renderer_t *renderer) +{ + cairo_botor_scan_converter_t *self = converter; + start_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (start_event_t)]; + start_event_t *events; + event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1]; + event_t **event_ptrs; + struct _cairo_botor_scan_converter_chunk *chunk; + cairo_status_t status; + int num_events; + int i, j; + + num_events = self->num_edges; + if (unlikely (0 == num_events)) { + return renderer->render_rows (renderer, + _cairo_fixed_integer_floor (self->extents.p1.y), + _cairo_fixed_integer_ceil (self->extents.p2.y) - + _cairo_fixed_integer_floor (self->extents.p1.y), + NULL, 0); + } + + events = stack_events; + event_ptrs = stack_event_ptrs; + if (unlikely (num_events >= ARRAY_LENGTH (stack_events))) { + events = _cairo_malloc_ab_plus_c (num_events, + sizeof (start_event_t) + sizeof (event_t *), + sizeof (event_t *)); + if (unlikely (events == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event_ptrs = (event_t **) (events + num_events); + } + + j = 0; + for (chunk = &self->chunks; chunk != NULL; chunk = chunk->next) { + edge_t *edge; + + edge = chunk->base; + for (i = 0; i < chunk->count; i++) { + event_ptrs[j] = (event_t *) &events[j]; + + events[j].y = edge->edge.top; + events[j].type = EVENT_TYPE_START; + events[j].edge = edge; + + edge++, j++; + } + } + + status = botor_generate (self, event_ptrs, renderer); + + if (events != stack_events) + free (events); + + return status; +} + +static edge_t * +botor_allocate_edge (cairo_botor_scan_converter_t *self) +{ + struct _cairo_botor_scan_converter_chunk *chunk; + + chunk = self->tail; + if (chunk->count == chunk->size) { + int size; + + size = chunk->size * 2; + chunk->next = _cairo_malloc_ab_plus_c (size, + sizeof (edge_t), + sizeof (struct _cairo_botor_scan_converter_chunk)); + if (unlikely (chunk->next == NULL)) + return NULL; + + chunk = chunk->next; + chunk->next = NULL; + chunk->count = 0; + chunk->size = size; + chunk->base = chunk + 1; + self->tail = chunk; + } + + return (edge_t *) chunk->base + chunk->count++; +} + +static cairo_status_t +botor_add_edge (cairo_botor_scan_converter_t *self, + const cairo_edge_t *edge) +{ + edge_t *e; + cairo_fixed_t dx, dy; + + e = botor_allocate_edge (self); + if (unlikely (e == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cairo_list_init (&e->link); + e->edge = *edge; + + dx = edge->line.p2.x - edge->line.p1.x; + dy = edge->line.p2.y - edge->line.p1.y; + e->dy = dy; + + if (dx == 0) { + e->vertical = TRUE; + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + e->dxdy.quo = 0; + e->dxdy.rem = 0; + e->dxdy_full.quo = 0; + e->dxdy_full.rem = 0; + } else { + e->vertical = FALSE; + e->dxdy = floored_divrem (dx, dy); + if (edge->top == edge->line.p1.y) { + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + } else { + e->x = floored_muldivrem (edge->top - edge->line.p1.y, + dx, dy); + e->x.quo += edge->line.p1.x; + } + + if (_cairo_fixed_integer_part (edge->bottom) - _cairo_fixed_integer_part (edge->top) > 1) { + e->dxdy_full = floored_muldivrem (STEP_Y, dx, dy); + } else { + e->dxdy_full.quo = 0; + e->dxdy_full.rem = 0; + } + } + + e->x.rem = -e->dy; + e->current_sign = 0; + e->runs = NULL; + e->flags = START; + + self->num_edges++; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_botor_scan_converter_destroy (void *converter) +{ + cairo_botor_scan_converter_t *self = converter; + struct _cairo_botor_scan_converter_chunk *chunk, *next; + + for (chunk = self->chunks.next; chunk != NULL; chunk = next) { + next = chunk->next; + free (chunk); + } +} + +void +_cairo_botor_scan_converter_init (cairo_botor_scan_converter_t *self, + const cairo_box_t *extents, + cairo_fill_rule_t fill_rule) +{ + self->base.destroy = _cairo_botor_scan_converter_destroy; + self->base.generate = _cairo_botor_scan_converter_generate; + + self->extents = *extents; + self->fill_rule = fill_rule; + + self->xmin = _cairo_fixed_integer_floor (extents->p1.x); + self->xmax = _cairo_fixed_integer_ceil (extents->p2.x); + + self->chunks.base = self->buf; + self->chunks.next = NULL; + self->chunks.count = 0; + self->chunks.size = sizeof (self->buf) / sizeof (edge_t); + self->tail = &self->chunks; + + self->num_edges = 0; +} diff --git a/src/cairo-box-inline.h b/src/cairo-box-inline.h new file mode 100644 index 000000000..d6b994127 --- /dev/null +++ b/src/cairo-box-inline.h @@ -0,0 +1,121 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Andrea Canciani + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Andrea Canciani + */ + +#ifndef CAIRO_BOX_H +#define CAIRO_BOX_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" +#include "cairo-fixed-private.h" + +static inline void +_cairo_box_set (cairo_box_t *box, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + box->p1 = *p1; + box->p2 = *p2; +} + +static inline void +_cairo_box_from_integers (cairo_box_t *box, int x, int y, int w, int h) +{ + box->p1.x = _cairo_fixed_from_int (x); + box->p1.y = _cairo_fixed_from_int (y); + box->p2.x = _cairo_fixed_from_int (x + w); + box->p2.y = _cairo_fixed_from_int (y + h); +} + +/* assumes box->p1 is top-left, p2 bottom-right */ +static inline void +_cairo_box_add_point (cairo_box_t *box, + const cairo_point_t *point) +{ + if (point->x < box->p1.x) + box->p1.x = point->x; + else if (point->x > box->p2.x) + box->p2.x = point->x; + + if (point->y < box->p1.y) + box->p1.y = point->y; + else if (point->y > box->p2.y) + box->p2.y = point->y; +} + +static inline void +_cairo_box_add_box (cairo_box_t *box, + const cairo_box_t *add) +{ + if (add->p1.x < box->p1.x) + box->p1.x = add->p1.x; + if (add->p2.x > box->p2.x) + box->p2.x = add->p2.x; + + if (add->p1.y < box->p1.y) + box->p1.y = add->p1.y; + if (add->p2.y > box->p2.y) + box->p2.y = add->p2.y; +} + +/* assumes box->p1 is top-left, p2 bottom-right */ +static inline cairo_bool_t +_cairo_box_contains_point (const cairo_box_t *box, + const cairo_point_t *point) +{ + return box->p1.x <= point->x && point->x <= box->p2.x && + box->p1.y <= point->y && point->y <= box->p2.y; +} + +static inline cairo_bool_t +_cairo_box_is_pixel_aligned (const cairo_box_t *box) +{ +#if CAIRO_FIXED_FRAC_BITS <= 8 && 0 + return ((box->p1.x & CAIRO_FIXED_FRAC_MASK) << 24 | + (box->p1.y & CAIRO_FIXED_FRAC_MASK) << 16 | + (box->p2.x & CAIRO_FIXED_FRAC_MASK) << 8 | + (box->p2.y & CAIRO_FIXED_FRAC_MASK) << 0) == 0; +#else /* GCC on i7 prefers this variant (bizarrely according to the profiler) */ + cairo_fixed_t f; + + f = 0; + f |= box->p1.x & CAIRO_FIXED_FRAC_MASK; + f |= box->p1.y & CAIRO_FIXED_FRAC_MASK; + f |= box->p2.x & CAIRO_FIXED_FRAC_MASK; + f |= box->p2.y & CAIRO_FIXED_FRAC_MASK; + + return f == 0; +#endif +} + +#endif /* CAIRO_BOX_H */ diff --git a/src/cairo-boxes-intersect.c b/src/cairo-boxes-intersect.c new file mode 100644 index 000000000..96ae66334 --- /dev/null +++ b/src/cairo-boxes-intersect.c @@ -0,0 +1,690 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-combsort-inline.h" +#include "cairo-list-private.h" + +#include + +typedef struct _rectangle rectangle_t; +typedef struct _edge edge_t; + +struct _edge { + edge_t *next, *prev; + edge_t *right; + cairo_fixed_t x, top; + int a_or_b; + int dir; +}; + +struct _rectangle { + edge_t left, right; + int32_t top, bottom; +}; + +#define UNROLL3(x) x x x + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef struct _pqueue { + int size, max_size; + + rectangle_t **elements; + rectangle_t *elements_embedded[1024]; +} pqueue_t; + +typedef struct _sweep_line { + rectangle_t **rectangles; + pqueue_t pq; + edge_t head, tail; + edge_t *insert_left, *insert_right; + int32_t current_y; + int32_t last_y; + + jmp_buf unwind; +} sweep_line_t; + +#define DEBUG_TRAPS 0 + +#if DEBUG_TRAPS +static void +dump_traps (cairo_traps_t *traps, const char *filename) +{ + FILE *file; + int n; + + if (getenv ("CAIRO_DEBUG_TRAPS") == NULL) + return; + + file = fopen (filename, "a"); + if (file != NULL) { + for (n = 0; n < traps->num_traps; n++) { + fprintf (file, "%d %d L:(%d, %d), (%d, %d) R:(%d, %d), (%d, %d)\n", + traps->traps[n].top, + traps->traps[n].bottom, + traps->traps[n].left.p1.x, + traps->traps[n].left.p1.y, + traps->traps[n].left.p2.x, + traps->traps[n].left.p2.y, + traps->traps[n].right.p1.x, + traps->traps[n].right.p1.y, + traps->traps[n].right.p2.x, + traps->traps[n].right.p2.y); + } + fprintf (file, "\n"); + fclose (file); + } +} +#else +#define dump_traps(traps, filename) +#endif + +static inline int +rectangle_compare_start (const rectangle_t *a, + const rectangle_t *b) +{ + return a->top - b->top; +} + +static inline int +rectangle_compare_stop (const rectangle_t *a, + const rectangle_t *b) +{ + return a->bottom - b->bottom; +} + +static inline void +pqueue_init (pqueue_t *pq) +{ + pq->max_size = ARRAY_LENGTH (pq->elements_embedded); + pq->size = 0; + + pq->elements = pq->elements_embedded; + pq->elements[PQ_FIRST_ENTRY] = NULL; +} + +static inline void +pqueue_fini (pqueue_t *pq) +{ + if (pq->elements != pq->elements_embedded) + free (pq->elements); +} + +static cairo_bool_t +pqueue_grow (pqueue_t *pq) +{ + rectangle_t **new_elements; + pq->max_size *= 2; + + if (pq->elements == pq->elements_embedded) { + new_elements = _cairo_malloc_ab (pq->max_size, + sizeof (rectangle_t *)); + if (unlikely (new_elements == NULL)) + return FALSE; + + memcpy (new_elements, pq->elements_embedded, + sizeof (pq->elements_embedded)); + } else { + new_elements = _cairo_realloc_ab (pq->elements, + pq->max_size, + sizeof (rectangle_t *)); + if (unlikely (new_elements == NULL)) + return FALSE; + } + + pq->elements = new_elements; + return TRUE; +} + +static inline void +pqueue_push (sweep_line_t *sweep, rectangle_t *rectangle) +{ + rectangle_t **elements; + int i, parent; + + if (unlikely (sweep->pq.size + 1 == sweep->pq.max_size)) { + if (unlikely (! pqueue_grow (&sweep->pq))) { + longjmp (sweep->unwind, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + elements = sweep->pq.elements; + for (i = ++sweep->pq.size; + i != PQ_FIRST_ENTRY && + rectangle_compare_stop (rectangle, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = rectangle; +} + +static inline void +pqueue_pop (pqueue_t *pq) +{ + rectangle_t **elements = pq->elements; + rectangle_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + rectangle_compare_stop (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (rectangle_compare_stop (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline rectangle_t * +rectangle_pop_start (sweep_line_t *sweep_line) +{ + return *sweep_line->rectangles++; +} + +static inline rectangle_t * +rectangle_peek_stop (sweep_line_t *sweep_line) +{ + return sweep_line->pq.elements[PQ_FIRST_ENTRY]; +} + +CAIRO_COMBSORT_DECLARE (_rectangle_sort, + rectangle_t *, + rectangle_compare_start) + +static void +sweep_line_init (sweep_line_t *sweep_line, + rectangle_t **rectangles, + int num_rectangles) +{ + _rectangle_sort (rectangles, num_rectangles); + rectangles[num_rectangles] = NULL; + sweep_line->rectangles = rectangles; + + sweep_line->head.x = INT32_MIN; + sweep_line->head.right = NULL; + sweep_line->head.dir = 0; + sweep_line->head.next = &sweep_line->tail; + sweep_line->tail.x = INT32_MAX; + sweep_line->tail.right = NULL; + sweep_line->tail.dir = 0; + sweep_line->tail.prev = &sweep_line->head; + + sweep_line->insert_left = &sweep_line->tail; + sweep_line->insert_right = &sweep_line->tail; + + sweep_line->current_y = INT32_MIN; + sweep_line->last_y = INT32_MIN; + + pqueue_init (&sweep_line->pq); +} + +static void +sweep_line_fini (sweep_line_t *sweep_line) +{ + pqueue_fini (&sweep_line->pq); +} + +static void +end_box (sweep_line_t *sweep_line, edge_t *left, int32_t bot, cairo_boxes_t *out) +{ + if (likely (left->top < bot)) { + cairo_status_t status; + cairo_box_t box; + + box.p1.x = left->x; + box.p1.y = left->top; + box.p2.x = left->right->x; + box.p2.y = bot; + + status = _cairo_boxes_add (out, CAIRO_ANTIALIAS_DEFAULT, &box); + if (unlikely (status)) + longjmp (sweep_line->unwind, status); + } + + left->right = NULL; +} + +/* Start a new trapezoid at the given top y coordinate, whose edges + * are `edge' and `edge->next'. If `edge' already has a trapezoid, + * then either add it to the traps in `traps', if the trapezoid's + * right edge differs from `edge->next', or do nothing if the new + * trapezoid would be a continuation of the existing one. */ +static inline void +start_or_continue_box (sweep_line_t *sweep_line, + edge_t *left, + edge_t *right, + int top, + cairo_boxes_t *out) +{ + if (left->right == right) + return; + + if (left->right != NULL) { + if (right != NULL && left->right->x == right->x) { + /* continuation on right, so just swap edges */ + left->right = right; + return; + } + + end_box (sweep_line, left, top, out); + } + + if (right != NULL && left->x != right->x) { + left->top = top; + left->right = right; + } +} + +static inline int is_zero(const int *winding) +{ + return winding[0] == 0 || winding[1] == 0; +} + +static inline void +active_edges (sweep_line_t *sweep, cairo_boxes_t *out) +{ + int top = sweep->current_y; + int winding[2] = { 0 }; + edge_t *pos; + + if (sweep->last_y == sweep->current_y) + return; + + pos = sweep->head.next; + if (pos == &sweep->tail) + return; + + do { + edge_t *left, *right; + + left = pos; + do { + winding[left->a_or_b] += left->dir; + if (!is_zero (winding)) + break; + if (left->next == &sweep->tail) + goto out; + + if (unlikely (left->right != NULL)) + end_box (sweep, left, top, out); + + left = left->next; + } while (1); + + right = left->next; + do { + if (unlikely (right->right != NULL)) + end_box (sweep, right, top, out); + + winding[right->a_or_b] += right->dir; + if (is_zero (winding)) { + /* skip co-linear edges */ + if (likely (right->x != right->next->x)) + break; + } + + right = right->next; + } while (TRUE); + + start_or_continue_box (sweep, left, right, top, out); + + pos = right->next; + } while (pos != &sweep->tail); + +out: + sweep->last_y = sweep->current_y; +} + +static inline void +sweep_line_delete_edge (sweep_line_t *sweep_line, edge_t *edge, cairo_boxes_t *out) +{ + if (edge->right != NULL) { + edge_t *next = edge->next; + if (next->x == edge->x) { + next->top = edge->top; + next->right = edge->right; + } else { + end_box (sweep_line, edge, sweep_line->current_y, out); + } + } + + if (sweep_line->insert_left == edge) + sweep_line->insert_left = edge->next; + if (sweep_line->insert_right == edge) + sweep_line->insert_right = edge->next; + + edge->prev->next = edge->next; + edge->next->prev = edge->prev; +} + +static inline void +sweep_line_delete (sweep_line_t *sweep, + rectangle_t *rectangle, + cairo_boxes_t *out) +{ + sweep_line_delete_edge (sweep, &rectangle->left, out); + sweep_line_delete_edge (sweep, &rectangle->right, out); + + pqueue_pop (&sweep->pq); +} + +static inline void +insert_edge (edge_t *edge, edge_t *pos) +{ + if (pos->x != edge->x) { + if (pos->x > edge->x) { + do { + UNROLL3({ + if (pos->prev->x <= edge->x) + break; + pos = pos->prev; + }) + } while (TRUE); + } else { + do { + UNROLL3({ + pos = pos->next; + if (pos->x >= edge->x) + break; + }) + } while (TRUE); + } + } + + pos->prev->next = edge; + edge->prev = pos->prev; + edge->next = pos; + pos->prev = edge; +} + +static inline void +sweep_line_insert (sweep_line_t *sweep, rectangle_t *rectangle) +{ + edge_t *pos; + + /* right edge */ + pos = sweep->insert_right; + insert_edge (&rectangle->right, pos); + sweep->insert_right = &rectangle->right; + + /* left edge */ + pos = sweep->insert_left; + if (pos->x > sweep->insert_right->x) + pos = sweep->insert_right->prev; + insert_edge (&rectangle->left, pos); + sweep->insert_left = &rectangle->left; + + pqueue_push (sweep, rectangle); +} + +static cairo_status_t +intersect (rectangle_t **rectangles, int num_rectangles, cairo_boxes_t *out) +{ + sweep_line_t sweep_line; + rectangle_t *rectangle; + cairo_status_t status; + + sweep_line_init (&sweep_line, rectangles, num_rectangles); + if ((status = setjmp (sweep_line.unwind))) + goto unwind; + + rectangle = rectangle_pop_start (&sweep_line); + do { + if (rectangle->top != sweep_line.current_y) { + rectangle_t *stop; + + stop = rectangle_peek_stop (&sweep_line); + while (stop != NULL && stop->bottom < rectangle->top) { + if (stop->bottom != sweep_line.current_y) { + active_edges (&sweep_line, out); + sweep_line.current_y = stop->bottom; + } + + sweep_line_delete (&sweep_line, stop, out); + + stop = rectangle_peek_stop (&sweep_line); + } + + active_edges (&sweep_line, out); + sweep_line.current_y = rectangle->top; + } + + sweep_line_insert (&sweep_line, rectangle); + } while ((rectangle = rectangle_pop_start (&sweep_line)) != NULL); + + while ((rectangle = rectangle_peek_stop (&sweep_line)) != NULL) { + if (rectangle->bottom != sweep_line.current_y) { + active_edges (&sweep_line, out); + sweep_line.current_y = rectangle->bottom; + } + + sweep_line_delete (&sweep_line, rectangle, out); + } + +unwind: + sweep_line_fini (&sweep_line); + return status; +} + +static cairo_status_t +_cairo_boxes_intersect_with_box (const cairo_boxes_t *boxes, + const cairo_box_t *box, + cairo_boxes_t *out) +{ + cairo_status_t status; + int i, j; + + if (out == boxes) { /* inplace update */ + struct _cairo_boxes_chunk *chunk; + + out->num_boxes = 0; + for (chunk = &out->chunks; chunk != NULL; chunk = chunk->next) { + for (i = j = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + + b->p1.x = MAX (b->p1.x, box->p1.x); + b->p1.y = MAX (b->p1.y, box->p1.y); + b->p2.x = MIN (b->p2.x, box->p2.x); + b->p2.y = MIN (b->p2.y, box->p2.y); + if (b->p1.x < b->p2.x && b->p1.y < b->p2.y) { + if (i != j) + chunk->base[j] = *b; + j++; + } + } + /* XXX unlink empty chains? */ + chunk->count = j; + out->num_boxes += j; + } + } else { + const struct _cairo_boxes_chunk *chunk; + + _cairo_boxes_clear (out); + _cairo_boxes_limit (out, box, 1); + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + status = _cairo_boxes_add (out, + CAIRO_ANTIALIAS_DEFAULT, + &chunk->base[i]); + if (unlikely (status)) + return status; + } + } + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_boxes_intersect (const cairo_boxes_t *a, + const cairo_boxes_t *b, + cairo_boxes_t *out) +{ + rectangle_t stack_rectangles[CAIRO_STACK_ARRAY_LENGTH (rectangle_t)]; + rectangle_t *rectangles; + rectangle_t *stack_rectangles_ptrs[ARRAY_LENGTH (stack_rectangles) + 1]; + rectangle_t **rectangles_ptrs; + const struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + int i, j, count; + + if (unlikely (a->num_boxes == 0 || b->num_boxes == 0)) { + _cairo_boxes_clear (out); + return CAIRO_STATUS_SUCCESS; + } + + if (a->num_boxes == 1) { + cairo_box_t box = a->chunks.base[0]; + return _cairo_boxes_intersect_with_box (b, &box, out); + } + if (b->num_boxes == 1) { + cairo_box_t box = b->chunks.base[0]; + return _cairo_boxes_intersect_with_box (a, &box, out); + } + + rectangles = stack_rectangles; + rectangles_ptrs = stack_rectangles_ptrs; + count = a->num_boxes + b->num_boxes; + if (count > ARRAY_LENGTH (stack_rectangles)) { + rectangles = _cairo_malloc_ab_plus_c (count, + sizeof (rectangle_t) + + sizeof (rectangle_t *), + sizeof (rectangle_t *)); + if (unlikely (rectangles == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + rectangles_ptrs = (rectangle_t **) (rectangles + count); + } + + j = 0; + for (chunk = &a->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + if (box[i].p1.x < box[i].p2.x) { + rectangles[j].left.x = box[i].p1.x; + rectangles[j].left.dir = 1; + + rectangles[j].right.x = box[i].p2.x; + rectangles[j].right.dir = -1; + } else { + rectangles[j].right.x = box[i].p1.x; + rectangles[j].right.dir = 1; + + rectangles[j].left.x = box[i].p2.x; + rectangles[j].left.dir = -1; + } + + rectangles[j].left.a_or_b = 0; + rectangles[j].left.right = NULL; + rectangles[j].right.a_or_b = 0; + rectangles[j].right.right = NULL; + + rectangles[j].top = box[i].p1.y; + rectangles[j].bottom = box[i].p2.y; + + rectangles_ptrs[j] = &rectangles[j]; + j++; + } + } + for (chunk = &b->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + if (box[i].p1.x < box[i].p2.x) { + rectangles[j].left.x = box[i].p1.x; + rectangles[j].left.dir = 1; + + rectangles[j].right.x = box[i].p2.x; + rectangles[j].right.dir = -1; + } else { + rectangles[j].right.x = box[i].p1.x; + rectangles[j].right.dir = 1; + + rectangles[j].left.x = box[i].p2.x; + rectangles[j].left.dir = -1; + } + + rectangles[j].left.a_or_b = 1; + rectangles[j].left.right = NULL; + rectangles[j].right.a_or_b = 1; + rectangles[j].right.right = NULL; + + rectangles[j].top = box[i].p1.y; + rectangles[j].bottom = box[i].p2.y; + + rectangles_ptrs[j] = &rectangles[j]; + j++; + } + } + assert (j == count); + + _cairo_boxes_clear (out); + status = intersect (rectangles_ptrs, j, out); + if (rectangles != stack_rectangles) + free (rectangles); + + return status; +} diff --git a/src/cairo-boxes-private.h b/src/cairo-boxes-private.h new file mode 100644 index 000000000..d1f9dfcd1 --- /dev/null +++ b/src/cairo-boxes-private.h @@ -0,0 +1,123 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_BOXES_H +#define CAIRO_BOXES_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" + +#include +#include + +struct _cairo_boxes_t { + cairo_status_t status; + + cairo_box_t limit; + const cairo_box_t *limits; + int num_limits; + + int num_boxes; + + unsigned int is_pixel_aligned; + + struct _cairo_boxes_chunk { + struct _cairo_boxes_chunk *next; + cairo_box_t *base; + int count; + int size; + } chunks, *tail; + cairo_box_t boxes_embedded[32]; +}; + +cairo_private void +_cairo_boxes_init (cairo_boxes_t *boxes); + +cairo_private void +_cairo_boxes_init_with_clip (cairo_boxes_t *boxes, + cairo_clip_t *clip); + +cairo_private void +_cairo_boxes_init_for_array (cairo_boxes_t *boxes, + cairo_box_t *array, + int num_boxes); + +cairo_private void +_cairo_boxes_init_from_rectangle (cairo_boxes_t *boxes, + int x, int y, int w, int h); + +cairo_private void +_cairo_boxes_limit (cairo_boxes_t *boxes, + const cairo_box_t *limits, + int num_limits); + +cairo_private cairo_status_t +_cairo_boxes_add (cairo_boxes_t *boxes, + cairo_antialias_t antialias, + const cairo_box_t *box); + +cairo_private void +_cairo_boxes_extents (const cairo_boxes_t *boxes, + cairo_box_t *box); + +cairo_private cairo_box_t * +_cairo_boxes_to_array (const cairo_boxes_t *boxes, + int *num_boxes, + cairo_bool_t force_allocation); + +cairo_private cairo_status_t +_cairo_boxes_intersect (const cairo_boxes_t *a, + const cairo_boxes_t *b, + cairo_boxes_t *out); + +cairo_private void +_cairo_boxes_clear (cairo_boxes_t *boxes); + +cairo_private_no_warn cairo_bool_t +_cairo_boxes_for_each_box (cairo_boxes_t *boxes, + cairo_bool_t (*func) (cairo_box_t *box, void *data), + void *data); + +cairo_private cairo_status_t +_cairo_rasterise_polygon_to_boxes (cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_boxes_t *boxes); + +cairo_private void +_cairo_boxes_fini (cairo_boxes_t *boxes); + +cairo_private void +_cairo_debug_print_boxes (FILE *stream, + const cairo_boxes_t *boxes); + +#endif /* CAIRO_BOXES_H */ diff --git a/src/cairo-boxes.c b/src/cairo-boxes.c new file mode 100644 index 000000000..63b68ddfb --- /dev/null +++ b/src/cairo-boxes.c @@ -0,0 +1,460 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" + +void +_cairo_boxes_init (cairo_boxes_t *boxes) +{ + boxes->status = CAIRO_STATUS_SUCCESS; + boxes->num_limits = 0; + boxes->num_boxes = 0; + + boxes->tail = &boxes->chunks; + boxes->chunks.next = NULL; + boxes->chunks.base = boxes->boxes_embedded; + boxes->chunks.size = ARRAY_LENGTH (boxes->boxes_embedded); + boxes->chunks.count = 0; + + boxes->is_pixel_aligned = TRUE; +} + +void +_cairo_boxes_init_from_rectangle (cairo_boxes_t *boxes, + int x, int y, int w, int h) +{ + _cairo_boxes_init (boxes); + + _cairo_box_from_integers (&boxes->chunks.base[0], x, y, w, h); + boxes->num_boxes = 1; +} + +void +_cairo_boxes_init_with_clip (cairo_boxes_t *boxes, + cairo_clip_t *clip) +{ + _cairo_boxes_init (boxes); + if (clip) + _cairo_boxes_limit (boxes, clip->boxes, clip->num_boxes); +} + +void +_cairo_boxes_init_for_array (cairo_boxes_t *boxes, + cairo_box_t *array, + int num_boxes) +{ + int n; + + boxes->status = CAIRO_STATUS_SUCCESS; + boxes->num_limits = 0; + boxes->num_boxes = num_boxes; + + boxes->tail = &boxes->chunks; + boxes->chunks.next = NULL; + boxes->chunks.base = array; + boxes->chunks.size = num_boxes; + boxes->chunks.count = num_boxes; + + for (n = 0; n < num_boxes; n++) { + if (! _cairo_fixed_is_integer (array[n].p1.x) || + ! _cairo_fixed_is_integer (array[n].p1.y) || + ! _cairo_fixed_is_integer (array[n].p2.x) || + ! _cairo_fixed_is_integer (array[n].p2.y)) + { + break; + } + } + + boxes->is_pixel_aligned = n == num_boxes; +} + +void +_cairo_boxes_limit (cairo_boxes_t *boxes, + const cairo_box_t *limits, + int num_limits) +{ + int n; + + boxes->limits = limits; + boxes->num_limits = num_limits; + + if (boxes->num_limits) { + boxes->limit = limits[0]; + for (n = 1; n < num_limits; n++) { + if (limits[n].p1.x < boxes->limit.p1.x) + boxes->limit.p1.x = limits[n].p1.x; + + if (limits[n].p1.y < boxes->limit.p1.y) + boxes->limit.p1.y = limits[n].p1.y; + + if (limits[n].p2.x > boxes->limit.p2.x) + boxes->limit.p2.x = limits[n].p2.x; + + if (limits[n].p2.y > boxes->limit.p2.y) + boxes->limit.p2.y = limits[n].p2.y; + } + } +} + +static void +_cairo_boxes_add_internal (cairo_boxes_t *boxes, + const cairo_box_t *box) +{ + struct _cairo_boxes_chunk *chunk; + + if (unlikely (boxes->status)) + return; + + chunk = boxes->tail; + if (unlikely (chunk->count == chunk->size)) { + int size; + + size = chunk->size * 2; + chunk->next = _cairo_malloc_ab_plus_c (size, + sizeof (cairo_box_t), + sizeof (struct _cairo_boxes_chunk)); + + if (unlikely (chunk->next == NULL)) { + boxes->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return; + } + + chunk = chunk->next; + boxes->tail = chunk; + + chunk->next = NULL; + chunk->count = 0; + chunk->size = size; + chunk->base = (cairo_box_t *) (chunk + 1); + } + + chunk->base[chunk->count++] = *box; + boxes->num_boxes++; + + if (boxes->is_pixel_aligned) + boxes->is_pixel_aligned = _cairo_box_is_pixel_aligned (box); +} + +cairo_status_t +_cairo_boxes_add (cairo_boxes_t *boxes, + cairo_antialias_t antialias, + const cairo_box_t *box) +{ + cairo_box_t b; + + if (antialias == CAIRO_ANTIALIAS_NONE) { + b.p1.x = _cairo_fixed_round_down (box->p1.x); + b.p1.y = _cairo_fixed_round_down (box->p1.y); + b.p2.x = _cairo_fixed_round_down (box->p2.x); + b.p2.y = _cairo_fixed_round_down (box->p2.y); + box = &b; + } + + if (box->p1.y == box->p2.y) + return CAIRO_STATUS_SUCCESS; + + if (box->p1.x == box->p2.x) + return CAIRO_STATUS_SUCCESS; + + if (boxes->num_limits) { + cairo_point_t p1, p2; + cairo_bool_t reversed = FALSE; + int n; + + /* support counter-clockwise winding for rectangular tessellation */ + if (box->p1.x < box->p2.x) { + p1.x = box->p1.x; + p2.x = box->p2.x; + } else { + p2.x = box->p1.x; + p1.x = box->p2.x; + reversed = ! reversed; + } + + if (p1.x >= boxes->limit.p2.x || p2.x <= boxes->limit.p1.x) + return CAIRO_STATUS_SUCCESS; + + if (box->p1.y < box->p2.y) { + p1.y = box->p1.y; + p2.y = box->p2.y; + } else { + p2.y = box->p1.y; + p1.y = box->p2.y; + reversed = ! reversed; + } + + if (p1.y >= boxes->limit.p2.y || p2.y <= boxes->limit.p1.y) + return CAIRO_STATUS_SUCCESS; + + for (n = 0; n < boxes->num_limits; n++) { + const cairo_box_t *limits = &boxes->limits[n]; + cairo_box_t _box; + cairo_point_t _p1, _p2; + + if (p1.x >= limits->p2.x || p2.x <= limits->p1.x) + continue; + if (p1.y >= limits->p2.y || p2.y <= limits->p1.y) + continue; + + /* Otherwise, clip the box to the limits. */ + _p1 = p1; + if (_p1.x < limits->p1.x) + _p1.x = limits->p1.x; + if (_p1.y < limits->p1.y) + _p1.y = limits->p1.y; + + _p2 = p2; + if (_p2.x > limits->p2.x) + _p2.x = limits->p2.x; + if (_p2.y > limits->p2.y) + _p2.y = limits->p2.y; + + if (_p2.y <= _p1.y || _p2.x <= _p1.x) + continue; + + _box.p1.y = _p1.y; + _box.p2.y = _p2.y; + if (reversed) { + _box.p1.x = _p2.x; + _box.p2.x = _p1.x; + } else { + _box.p1.x = _p1.x; + _box.p2.x = _p2.x; + } + + _cairo_boxes_add_internal (boxes, &_box); + } + } else { + _cairo_boxes_add_internal (boxes, box); + } + + return boxes->status; +} + +void +_cairo_boxes_extents (const cairo_boxes_t *boxes, + cairo_box_t *box) +{ + const struct _cairo_boxes_chunk *chunk; + cairo_box_t b; + int i; + + if (boxes->num_boxes == 0) { + box->p1.x = box->p1.y = box->p2.x = box->p2.y = 0; + return; + } + + b = boxes->chunks.base[0]; + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + if (chunk->base[i].p1.x < b.p1.x) + b.p1.x = chunk->base[i].p1.x; + + if (chunk->base[i].p1.y < b.p1.y) + b.p1.y = chunk->base[i].p1.y; + + if (chunk->base[i].p2.x > b.p2.x) + b.p2.x = chunk->base[i].p2.x; + + if (chunk->base[i].p2.y > b.p2.y) + b.p2.y = chunk->base[i].p2.y; + } + } + *box = b; +} + +void +_cairo_boxes_clear (cairo_boxes_t *boxes) +{ + struct _cairo_boxes_chunk *chunk, *next; + + for (chunk = boxes->chunks.next; chunk != NULL; chunk = next) { + next = chunk->next; + free (chunk); + } + + boxes->tail = &boxes->chunks; + boxes->chunks.next = 0; + boxes->chunks.count = 0; + boxes->chunks.base = boxes->boxes_embedded; + boxes->chunks.size = ARRAY_LENGTH (boxes->boxes_embedded); + boxes->num_boxes = 0; + + boxes->is_pixel_aligned = TRUE; +} + +cairo_box_t * +_cairo_boxes_to_array (const cairo_boxes_t *boxes, + int *num_boxes, + cairo_bool_t force_allocation) +{ + const struct _cairo_boxes_chunk *chunk; + cairo_box_t *box; + int i, j; + + *num_boxes = boxes->num_boxes; + if (boxes->chunks.next == NULL && ! force_allocation) + return boxes->chunks.base; + + box = _cairo_malloc_ab (boxes->num_boxes, sizeof (cairo_box_t)); + if (box == NULL) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + j = 0; + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) + box[j++] = chunk->base[i]; + } + + return box; +} + +void +_cairo_boxes_fini (cairo_boxes_t *boxes) +{ + struct _cairo_boxes_chunk *chunk, *next; + + for (chunk = boxes->chunks.next; chunk != NULL; chunk = next) { + next = chunk->next; + free (chunk); + } +} + +cairo_bool_t +_cairo_boxes_for_each_box (cairo_boxes_t *boxes, + cairo_bool_t (*func) (cairo_box_t *box, void *data), + void *data) +{ + struct _cairo_boxes_chunk *chunk; + int i; + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) + if (! func (&chunk->base[i], data)) + return FALSE; + } + + return TRUE; +} + +struct cairo_box_renderer { + cairo_span_renderer_t base; + cairo_boxes_t *boxes; +}; + +static cairo_status_t +span_to_boxes (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + struct cairo_box_renderer *r = abstract_renderer; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_box_t box; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + box.p1.y = _cairo_fixed_from_int (y); + box.p2.y = _cairo_fixed_from_int (y + h); + do { + if (spans[0].coverage) { + box.p1.x = _cairo_fixed_from_int(spans[0].x); + box.p2.x = _cairo_fixed_from_int(spans[1].x); + status = _cairo_boxes_add (r->boxes, CAIRO_ANTIALIAS_DEFAULT, &box); + } + spans++; + } while (--num_spans > 1 && status == CAIRO_STATUS_SUCCESS); + + return status; +} + +cairo_status_t +_cairo_rasterise_polygon_to_boxes (cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_boxes_t *boxes) +{ + struct cairo_box_renderer renderer; + cairo_scan_converter_t *converter; + cairo_int_status_t status; + cairo_rectangle_int_t r; + + TRACE ((stderr, "%s: fill_rule=%d\n", __FUNCTION__, fill_rule)); + + _cairo_box_round_to_rectangle (&polygon->extents, &r); + converter = _cairo_mono_scan_converter_create (r.x, r.y, + r.x + r.width, + r.y + r.height, + fill_rule); + status = _cairo_mono_scan_converter_add_polygon (converter, polygon); + if (unlikely (status)) + goto cleanup_converter; + + renderer.boxes = boxes; + renderer.base.render_rows = span_to_boxes; + + status = converter->generate (converter, &renderer.base); +cleanup_converter: + converter->destroy (converter); + return status; +} + +void +_cairo_debug_print_boxes (FILE *stream, const cairo_boxes_t *boxes) +{ + const struct _cairo_boxes_chunk *chunk; + cairo_box_t extents; + int i; + + _cairo_boxes_extents (boxes, &extents); + fprintf (stream, "boxes x %d: (%f, %f) x (%f, %f)\n", + boxes->num_boxes, + _cairo_fixed_to_double (extents.p1.x), + _cairo_fixed_to_double (extents.p1.y), + _cairo_fixed_to_double (extents.p2.x), + _cairo_fixed_to_double (extents.p2.y)); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + fprintf (stderr, " box[%d]: (%f, %f), (%f, %f)\n", i, + _cairo_fixed_to_double (chunk->base[i].p1.x), + _cairo_fixed_to_double (chunk->base[i].p1.y), + _cairo_fixed_to_double (chunk->base[i].p2.x), + _cairo_fixed_to_double (chunk->base[i].p2.y)); + } + } +} diff --git a/src/cairo-cache-private.h b/src/cairo-cache-private.h new file mode 100644 index 000000000..24b6d0b20 --- /dev/null +++ b/src/cairo-cache-private.h @@ -0,0 +1,145 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Keith Packard + * Graydon Hoare + * Carl Worth + */ + +#ifndef CAIRO_CACHE_PRIVATE_H +#define CAIRO_CACHE_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" + +/** + * _cairo_cache_entry: + * + * A #cairo_cache_entry_t contains both a key and a value for + * #cairo_cache_t. User-derived types for #cairo_cache_entry_t must + * have a #cairo_cache_entry_t as their first field. For example: + * + * typedef _my_entry { + * cairo_cache_entry_t base; + * ... Remainder of key and value fields here .. + * } my_entry_t; + * + * which then allows a pointer to my_entry_t to be passed to any of + * the #cairo_cache_t functions as follows without requiring a cast: + * + * _cairo_cache_insert (cache, &my_entry->base, size); + * + * IMPORTANT: The caller is responsible for initializing + * my_entry->base.hash with a hash code derived from the key. The + * essential property of the hash code is that keys_equal must never + * return %TRUE for two keys that have different hashes. The best hash + * code will reduce the frequency of two keys with the same code for + * which keys_equal returns %FALSE. + * + * The user must also initialize my_entry->base.size to indicate + * the size of the current entry. What units to use for size is + * entirely up to the caller, (though the same units must be used for + * the max_size parameter passed to _cairo_cache_create()). If all + * entries are close to the same size, the simplest thing to do is to + * just use units of "entries", (eg. set size==1 in all entries and + * set max_size to the number of entries which you want to be saved + * in the cache). + * + * Which parts of the entry make up the "key" and which part make up + * the value are entirely up to the caller, (as determined by the + * computation going into base.hash as well as the keys_equal + * function). A few of the #cairo_cache_t functions accept an entry which + * will be used exclusively as a "key", (indicated by a parameter name + * of key). In these cases, the value-related fields of the entry need + * not be initialized if so desired. + **/ +typedef struct _cairo_cache_entry { + unsigned long hash; + unsigned long size; +} cairo_cache_entry_t; + +typedef cairo_bool_t (*cairo_cache_predicate_func_t) (const void *entry); + +struct _cairo_cache { + cairo_hash_table_t *hash_table; + + cairo_cache_predicate_func_t predicate; + cairo_destroy_func_t entry_destroy; + + unsigned long max_size; + unsigned long size; + + int freeze_count; +}; + +typedef cairo_bool_t +(*cairo_cache_keys_equal_func_t) (const void *key_a, const void *key_b); + +typedef void +(*cairo_cache_callback_func_t) (void *entry, + void *closure); + +cairo_private cairo_status_t +_cairo_cache_init (cairo_cache_t *cache, + cairo_cache_keys_equal_func_t keys_equal, + cairo_cache_predicate_func_t predicate, + cairo_destroy_func_t entry_destroy, + unsigned long max_size); + +cairo_private void +_cairo_cache_fini (cairo_cache_t *cache); + +cairo_private void +_cairo_cache_freeze (cairo_cache_t *cache); + +cairo_private void +_cairo_cache_thaw (cairo_cache_t *cache); + +cairo_private void * +_cairo_cache_lookup (cairo_cache_t *cache, + cairo_cache_entry_t *key); + +cairo_private cairo_status_t +_cairo_cache_insert (cairo_cache_t *cache, + cairo_cache_entry_t *entry); + +cairo_private void +_cairo_cache_remove (cairo_cache_t *cache, + cairo_cache_entry_t *entry); + +cairo_private void +_cairo_cache_foreach (cairo_cache_t *cache, + cairo_cache_callback_func_t cache_callback, + void *closure); + +#endif diff --git a/src/cairo-cache.c b/src/cairo-cache.c new file mode 100644 index 000000000..5c4e4caa3 --- /dev/null +++ b/src/cairo-cache.c @@ -0,0 +1,338 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Keith Packard + * Graydon Hoare + * Carl Worth + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +static void +_cairo_cache_shrink_to_accommodate (cairo_cache_t *cache, + unsigned long additional); + +static cairo_bool_t +_cairo_cache_entry_is_non_zero (const void *entry) +{ + return ((const cairo_cache_entry_t *) entry)->size; +} + + +/** + * _cairo_cache_init: + * @cache: the #cairo_cache_t to initialise + * @keys_equal: a function to return %TRUE if two keys are equal + * @entry_destroy: destroy notifier for cache entries + * @max_size: the maximum size for this cache + * Returns: the newly created #cairo_cache_t + * + * Creates a new cache using the keys_equal() function to determine + * the equality of entries. + * + * Data is provided to the cache in the form of user-derived version + * of #cairo_cache_entry_t. A cache entry must be able to hold hash + * code, a size, and the key/value pair being stored in the + * cache. Sometimes only the key will be necessary, (as in + * _cairo_cache_lookup()), and in these cases the value portion of the + * entry need not be initialized. + * + * The units for max_size can be chosen by the caller, but should be + * consistent with the units of the size field of cache entries. When + * adding an entry with _cairo_cache_insert() if the total size of + * entries in the cache would exceed max_size then entries will be + * removed at random until the new entry would fit or the cache is + * empty. Then the new entry is inserted. + * + * There are cases in which the automatic removal of entries is + * undesired. If the cache entries have reference counts, then it is a + * simple matter to use the reference counts to ensure that entries + * continue to live even after being ejected from the cache. However, + * in some cases the memory overhead of adding a reference count to + * the entry would be objectionable. In such cases, the + * _cairo_cache_freeze() and _cairo_cache_thaw() calls can be + * used to establish a window during which no automatic removal of + * entries will occur. + **/ +cairo_status_t +_cairo_cache_init (cairo_cache_t *cache, + cairo_cache_keys_equal_func_t keys_equal, + cairo_cache_predicate_func_t predicate, + cairo_destroy_func_t entry_destroy, + unsigned long max_size) +{ + cache->hash_table = _cairo_hash_table_create (keys_equal); + if (unlikely (cache->hash_table == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (predicate == NULL) + predicate = _cairo_cache_entry_is_non_zero; + cache->predicate = predicate; + cache->entry_destroy = entry_destroy; + + cache->max_size = max_size; + cache->size = 0; + + cache->freeze_count = 0; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_cache_pluck (void *entry, void *closure) +{ + _cairo_cache_remove (closure, entry); +} + +/** + * _cairo_cache_fini: + * @cache: a cache to destroy + * + * Immediately destroys the given cache, freeing all resources + * associated with it. As part of this process, the entry_destroy() + * function, (as passed to _cairo_cache_init()), will be called for + * each entry in the cache. + **/ +void +_cairo_cache_fini (cairo_cache_t *cache) +{ + _cairo_hash_table_foreach (cache->hash_table, + _cairo_cache_pluck, + cache); + assert (cache->size == 0); + _cairo_hash_table_destroy (cache->hash_table); +} + +/** + * _cairo_cache_freeze: + * @cache: a cache with some precious entries in it (or about to be + * added) + * + * Disable the automatic ejection of entries from the cache. For as + * long as the cache is "frozen", calls to _cairo_cache_insert() will + * add new entries to the cache regardless of how large the cache + * grows. See _cairo_cache_thaw(). + * + * Note: Multiple calls to _cairo_cache_freeze() will stack, in that + * the cache will remain "frozen" until a corresponding number of + * calls are made to _cairo_cache_thaw(). + **/ +void +_cairo_cache_freeze (cairo_cache_t *cache) +{ + assert (cache->freeze_count >= 0); + + cache->freeze_count++; +} + +/** + * _cairo_cache_thaw: + * @cache: a cache, just after the entries in it have become less + * precious + * + * Cancels the effects of _cairo_cache_freeze(). + * + * When a number of calls to _cairo_cache_thaw() is made corresponding + * to the number of calls to _cairo_cache_freeze() the cache will no + * longer be "frozen". If the cache had grown larger than max_size + * while frozen, entries will immediately be ejected (by random) from + * the cache until the cache is smaller than max_size. Also, the + * automatic ejection of entries on _cairo_cache_insert() will resume. + **/ +void +_cairo_cache_thaw (cairo_cache_t *cache) +{ + assert (cache->freeze_count > 0); + + if (--cache->freeze_count == 0) + _cairo_cache_shrink_to_accommodate (cache, 0); +} + +/** + * _cairo_cache_lookup: + * @cache: a cache + * @key: the key of interest + * @entry_return: pointer for return value + * + * Performs a lookup in @cache looking for an entry which has a key + * that matches @key, (as determined by the keys_equal() function + * passed to _cairo_cache_init()). + * + * Return value: %TRUE if there is an entry in the cache that matches + * @key, (which will now be in *entry_return). %FALSE otherwise, (in + * which case *entry_return will be %NULL). + **/ +void * +_cairo_cache_lookup (cairo_cache_t *cache, + cairo_cache_entry_t *key) +{ + return _cairo_hash_table_lookup (cache->hash_table, + (cairo_hash_entry_t *) key); +} + +/** + * _cairo_cache_remove_random: + * @cache: a cache + * + * Remove a random entry from the cache. + * + * Return value: %TRUE if an entry was successfully removed. + * %FALSE if there are no entries that can be removed. + **/ +static cairo_bool_t +_cairo_cache_remove_random (cairo_cache_t *cache) +{ + cairo_cache_entry_t *entry; + + entry = _cairo_hash_table_random_entry (cache->hash_table, + cache->predicate); + if (unlikely (entry == NULL)) + return FALSE; + + _cairo_cache_remove (cache, entry); + + return TRUE; +} + +/** + * _cairo_cache_shrink_to_accommodate: + * @cache: a cache + * @additional: additional size requested in bytes + * + * If cache is not frozen, eject entries randomly until the size of + * the cache is at least @additional bytes less than + * cache->max_size. That is, make enough room to accommodate a new + * entry of size @additional. + **/ +static void +_cairo_cache_shrink_to_accommodate (cairo_cache_t *cache, + unsigned long additional) +{ + while (cache->size + additional > cache->max_size) { + if (! _cairo_cache_remove_random (cache)) + return; + } +} + +/** + * _cairo_cache_insert: + * @cache: a cache + * @entry: an entry to be inserted + * + * Insert @entry into the cache. If an entry exists in the cache with + * a matching key, then the old entry will be removed first, (and the + * entry_destroy() callback will be called on it). + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if insufficient memory is available. + **/ +cairo_status_t +_cairo_cache_insert (cairo_cache_t *cache, + cairo_cache_entry_t *entry) +{ + cairo_status_t status; + + if (entry->size && ! cache->freeze_count) + _cairo_cache_shrink_to_accommodate (cache, entry->size); + + status = _cairo_hash_table_insert (cache->hash_table, + (cairo_hash_entry_t *) entry); + if (unlikely (status)) + return status; + + cache->size += entry->size; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_cache_remove: + * @cache: a cache + * @entry: an entry that exists in the cache + * + * Remove an existing entry from the cache. + **/ +void +_cairo_cache_remove (cairo_cache_t *cache, + cairo_cache_entry_t *entry) +{ + cache->size -= entry->size; + + _cairo_hash_table_remove (cache->hash_table, + (cairo_hash_entry_t *) entry); + + if (cache->entry_destroy) + cache->entry_destroy (entry); +} + +/** + * _cairo_cache_foreach: + * @cache: a cache + * @cache_callback: function to be called for each entry + * @closure: additional argument to be passed to @cache_callback + * + * Call @cache_callback for each entry in the cache, in a + * non-specified order. + **/ +void +_cairo_cache_foreach (cairo_cache_t *cache, + cairo_cache_callback_func_t cache_callback, + void *closure) +{ + _cairo_hash_table_foreach (cache->hash_table, + cache_callback, + closure); +} + +unsigned long +_cairo_hash_string (const char *c) +{ + /* This is the djb2 hash. */ + unsigned long hash = _CAIRO_HASH_INIT_VALUE; + while (c && *c) + hash = ((hash << 5) + hash) + *c++; + return hash; +} + +unsigned long +_cairo_hash_bytes (unsigned long hash, + const void *ptr, + unsigned int length) +{ + const uint8_t *bytes = ptr; + /* This is the djb2 hash. */ + while (length--) + hash = ((hash << 5) + hash) + *bytes++; + return hash; +} diff --git a/src/cairo-cff-subset.c b/src/cairo-cff-subset.c new file mode 100644 index 000000000..f15deb5ea --- /dev/null +++ b/src/cairo-cff-subset.c @@ -0,0 +1,3440 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + * Eugeniy Meshcheryakov + */ + +/* + * Useful links: + * http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5176.CFF.pdf + * http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5177.Type2.pdf + */ + +#define _BSD_SOURCE /* for snprintf(), strdup() */ +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-truetype-subset-private.h" +#include +#include + +/* CFF Dict Operators. If the high byte is 0 the command is encoded + * with a single byte. */ +#define BASEFONTNAME_OP 0x0c16 +#define CIDCOUNT_OP 0x0c22 +#define CHARSET_OP 0x000f +#define CHARSTRINGS_OP 0x0011 +#define COPYRIGHT_OP 0x0c00 +#define DEFAULTWIDTH_OP 0x0014 +#define ENCODING_OP 0x0010 +#define FAMILYNAME_OP 0x0003 +#define FDARRAY_OP 0x0c24 +#define FDSELECT_OP 0x0c25 +#define FONTBBOX_OP 0x0005 +#define FONTMATRIX_OP 0x0c07 +#define FONTNAME_OP 0x0c26 +#define FULLNAME_OP 0x0002 +#define LOCAL_SUB_OP 0x0013 +#define NOMINALWIDTH_OP 0x0015 +#define NOTICE_OP 0x0001 +#define POSTSCRIPT_OP 0x0c15 +#define PRIVATE_OP 0x0012 +#define ROS_OP 0x0c1e +#define UNIQUEID_OP 0x000d +#define VERSION_OP 0x0000 +#define WEIGHT_OP 0x0004 +#define XUID_OP 0x000e + +#define NUM_STD_STRINGS 391 + +/* Type 2 Charstring operators */ +#define TYPE2_hstem 0x0001 +#define TYPE2_vstem 0x0003 +#define TYPE2_callsubr 0x000a + +#define TYPE2_return 0x000b +#define TYPE2_endchar 0x000e + +#define TYPE2_hstemhm 0x0012 +#define TYPE2_hintmask 0x0013 +#define TYPE2_cntrmask 0x0014 +#define TYPE2_vstemhm 0x0017 +#define TYPE2_callgsubr 0x001d + +#define TYPE2_rmoveto 0x0015 +#define TYPE2_hmoveto 0x0016 +#define TYPE2_vmoveto 0x0004 + + +#define MAX_SUBROUTINE_NESTING 10 /* From Type2 Charstring spec */ + + +typedef struct _cff_header { + uint8_t major; + uint8_t minor; + uint8_t header_size; + uint8_t offset_size; +} cff_header_t; + +typedef struct _cff_index_element { + cairo_bool_t is_copy; + unsigned char *data; + int length; +} cff_index_element_t; + +typedef struct _cff_dict_operator { + cairo_hash_entry_t base; + + unsigned short operator; + unsigned char *operand; + int operand_length; + int operand_offset; +} cff_dict_operator_t; + +typedef struct _cairo_cff_font { + + cairo_scaled_font_subset_t *scaled_font_subset; + const cairo_scaled_font_backend_t *backend; + + /* Font Data */ + unsigned char *data; + unsigned long data_length; + unsigned char *current_ptr; + unsigned char *data_end; + cff_header_t *header; + char *font_name; + char *ps_name; + cairo_hash_table_t *top_dict; + cairo_hash_table_t *private_dict; + cairo_array_t strings_index; + cairo_array_t charstrings_index; + cairo_array_t global_sub_index; + cairo_array_t local_sub_index; + unsigned char *charset; + int num_glyphs; + cairo_bool_t is_cid; + cairo_bool_t is_opentype; + int units_per_em; + int global_sub_bias; + int local_sub_bias; + double default_width; + double nominal_width; + + /* CID Font Data */ + int *fdselect; + unsigned int num_fontdicts; + cairo_hash_table_t **fd_dict; + cairo_hash_table_t **fd_private_dict; + cairo_array_t *fd_local_sub_index; + int *fd_local_sub_bias; + double *fd_default_width; + double *fd_nominal_width; + + /* Subsetted Font Data */ + char *subset_font_name; + cairo_array_t charstrings_subset_index; + cairo_array_t strings_subset_index; + int euro_sid; + int *fdselect_subset; + unsigned int num_subset_fontdicts; + int *fd_subset_map; + int *private_dict_offset; + cairo_bool_t subset_subroutines; + cairo_bool_t *global_subs_used; + cairo_bool_t *local_subs_used; + cairo_bool_t **fd_local_subs_used; + cairo_array_t output; + + /* Subset Metrics */ + int *widths; + int x_min, y_min, x_max, y_max; + int ascent, descent; + + /* Type 2 charstring data */ + int type2_stack_size; + int type2_stack_top_value; + cairo_bool_t type2_stack_top_is_int; + int type2_num_hints; + int type2_hintmask_bytes; + int type2_nesting_level; + cairo_bool_t type2_seen_first_int; + cairo_bool_t type2_find_width; + cairo_bool_t type2_found_width; + int type2_width; + cairo_bool_t type2_has_path; + +} cairo_cff_font_t; + +/* Encoded integer using maximum sized encoding. This is required for + * operands that are later modified after encoding. */ +static unsigned char * +encode_integer_max (unsigned char *p, int i) +{ + *p++ = 29; + *p++ = i >> 24; + *p++ = (i >> 16) & 0xff; + *p++ = (i >> 8) & 0xff; + *p++ = i & 0xff; + return p; +} + +static unsigned char * +encode_integer (unsigned char *p, int i) +{ + if (i >= -107 && i <= 107) { + *p++ = i + 139; + } else if (i >= 108 && i <= 1131) { + i -= 108; + *p++ = (i >> 8)+ 247; + *p++ = i & 0xff; + } else if (i >= -1131 && i <= -108) { + i = -i - 108; + *p++ = (i >> 8)+ 251; + *p++ = i & 0xff; + } else if (i >= -32768 && i <= 32767) { + *p++ = 28; + *p++ = (i >> 8) & 0xff; + *p++ = i & 0xff; + } else { + p = encode_integer_max (p, i); + } + return p; +} + +static unsigned char * +decode_integer (unsigned char *p, int *integer) +{ + if (*p == 28) { + *integer = (int)(p[1]<<8 | p[2]); + p += 3; + } else if (*p == 29) { + *integer = (int)((p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4]); + p += 5; + } else if (*p >= 32 && *p <= 246) { + *integer = *p++ - 139; + } else if (*p <= 250) { + *integer = (p[0] - 247) * 256 + p[1] + 108; + p += 2; + } else if (*p <= 254) { + *integer = -(p[0] - 251) * 256 - p[1] - 108; + p += 2; + } else { + *integer = 0; + p += 1; + } + return p; +} + +static char * +decode_nibble (int n, char *buf) +{ + switch (n) + { + case 0xa: + *buf++ = '.'; + break; + case 0xb: + *buf++ = 'E'; + break; + case 0xc: + *buf++ = 'E'; + *buf++ = '-'; + break; + case 0xd: + *buf++ = '-'; + break; + case 0xe: + *buf++ = '-'; + break; + case 0xf: + break; + default: + *buf++ = '0' + n; + break; + } + + return buf; +} + +static unsigned char * +decode_real (unsigned char *p, double *real) +{ + const char *decimal_point; + int decimal_point_len; + int n; + char buffer[100]; + char buffer2[200]; + char *q; + char *buf = buffer; + char *buf_end = buffer + sizeof (buffer); + + decimal_point = cairo_get_locale_decimal_point (); + decimal_point_len = strlen (decimal_point); + + assert (decimal_point_len != 0); + assert (sizeof(buffer) + decimal_point_len < sizeof(buffer2)); + + p++; + while (buf + 2 < buf_end) { + n = *p >> 4; + buf = decode_nibble (n, buf); + n = *p & 0x0f; + buf = decode_nibble (n, buf); + if ((*p & 0x0f) == 0x0f) { + p++; + break; + } + p++; + }; + *buf = 0; + + buf = buffer; + if (strchr (buffer, '.')) { + q = strchr (buffer, '.'); + strncpy (buffer2, buffer, q - buffer); + buf = buffer2 + (q - buffer); + strncpy (buf, decimal_point, decimal_point_len); + buf += decimal_point_len; + strcpy (buf, q + 1); + buf = buffer2; + } + + if (sscanf(buf, "%lf", real) != 1) + *real = 0.0; + + return p; +} + +static unsigned char * +decode_number (unsigned char *p, double *number) +{ + if (*p == 30) { + p = decode_real (p, number); + } else { + int i; + p = decode_integer (p, &i); + *number = i; + } + return p; +} + +static unsigned char * +decode_operator (unsigned char *p, unsigned short *operator) +{ + unsigned short op = 0; + + op = *p++; + if (op == 12) { + op <<= 8; + op |= *p++; + } + *operator = op; + return p; +} + +/* return 0 if not an operand */ +static int +operand_length (unsigned char *p) +{ + unsigned char *begin = p; + + if (*p == 28) + return 3; + + if (*p == 29) + return 5; + + if (*p >= 32 && *p <= 246) + return 1; + + if (*p >= 247 && *p <= 254) + return 2; + + if (*p == 30) { + while ((*p & 0x0f) != 0x0f) + p++; + return p - begin + 1; + } + + return 0; +} + +static unsigned char * +encode_index_offset (unsigned char *p, int offset_size, unsigned long offset) +{ + while (--offset_size >= 0) { + p[offset_size] = (unsigned char) (offset & 0xff); + offset >>= 8; + } + return p + offset_size; +} + +static unsigned long +decode_index_offset(unsigned char *p, int off_size) +{ + unsigned long offset = 0; + + while (off_size-- > 0) + offset = offset*256 + *p++; + return offset; +} + +static void +cff_index_init (cairo_array_t *index) +{ + _cairo_array_init (index, sizeof (cff_index_element_t)); +} + +static cairo_int_status_t +cff_index_read (cairo_array_t *index, unsigned char **ptr, unsigned char *end_ptr) +{ + cff_index_element_t element; + unsigned char *data, *p; + cairo_status_t status; + int offset_size, count, start, i; + int end = 0; + + p = *ptr; + if (p + 2 > end_ptr) + return CAIRO_INT_STATUS_UNSUPPORTED; + count = get_unaligned_be16 (p); + p += 2; + if (count > 0) { + offset_size = *p++; + if (p + (count + 1)*offset_size > end_ptr) + return CAIRO_INT_STATUS_UNSUPPORTED; + data = p + offset_size*(count + 1) - 1; + start = decode_index_offset (p, offset_size); + p += offset_size; + for (i = 0; i < count; i++) { + end = decode_index_offset (p, offset_size); + p += offset_size; + if (p > end_ptr) + return CAIRO_INT_STATUS_UNSUPPORTED; + element.length = end - start; + element.is_copy = FALSE; + element.data = data + start; + status = _cairo_array_append (index, &element); + if (unlikely (status)) + return status; + start = end; + } + p = data + end; + } + *ptr = p; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cff_index_write (cairo_array_t *index, cairo_array_t *output) +{ + int offset_size; + int offset; + int num_elem; + int i; + cff_index_element_t *element; + uint16_t count; + unsigned char buf[5]; + cairo_status_t status; + + num_elem = _cairo_array_num_elements (index); + count = cpu_to_be16 ((uint16_t) num_elem); + status = _cairo_array_append_multiple (output, &count, 2); + if (unlikely (status)) + return status; + + if (num_elem == 0) + return CAIRO_STATUS_SUCCESS; + + /* Find maximum offset to determine offset size */ + offset = 1; + for (i = 0; i < num_elem; i++) { + element = _cairo_array_index (index, i); + offset += element->length; + } + if (offset < 0x100) + offset_size = 1; + else if (offset < 0x10000) + offset_size = 2; + else if (offset < 0x1000000) + offset_size = 3; + else + offset_size = 4; + + buf[0] = (unsigned char) offset_size; + status = _cairo_array_append (output, buf); + if (unlikely (status)) + return status; + + offset = 1; + encode_index_offset (buf, offset_size, offset); + status = _cairo_array_append_multiple (output, buf, offset_size); + if (unlikely (status)) + return status; + + for (i = 0; i < num_elem; i++) { + element = _cairo_array_index (index, i); + offset += element->length; + encode_index_offset (buf, offset_size, offset); + status = _cairo_array_append_multiple (output, buf, offset_size); + if (unlikely (status)) + return status; + } + + for (i = 0; i < num_elem; i++) { + element = _cairo_array_index (index, i); + if (element->length > 0) { + status = _cairo_array_append_multiple (output, + element->data, + element->length); + } + if (unlikely (status)) + return status; + } + return CAIRO_STATUS_SUCCESS; +} + +static void +cff_index_set_object (cairo_array_t *index, int obj_index, + unsigned char *object , int length) +{ + cff_index_element_t *element; + + element = _cairo_array_index (index, obj_index); + if (element->is_copy) + free (element->data); + + element->data = object; + element->length = length; + element->is_copy = FALSE; +} + +static cairo_status_t +cff_index_append (cairo_array_t *index, unsigned char *object , int length) +{ + cff_index_element_t element; + + element.length = length; + element.is_copy = FALSE; + element.data = object; + + return _cairo_array_append (index, &element); +} + +static cairo_status_t +cff_index_append_copy (cairo_array_t *index, + const unsigned char *object, + unsigned int length) +{ + cff_index_element_t element; + cairo_status_t status; + + element.length = length; + element.is_copy = TRUE; + element.data = malloc (element.length); + if (unlikely (element.data == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (element.data, object, element.length); + + status = _cairo_array_append (index, &element); + if (unlikely (status)) { + free (element.data); + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +cff_index_fini (cairo_array_t *index) +{ + cff_index_element_t *element; + unsigned int i; + + for (i = 0; i < _cairo_array_num_elements (index); i++) { + element = _cairo_array_index (index, i); + if (element->is_copy && element->data) + free (element->data); + } + _cairo_array_fini (index); +} + +static cairo_bool_t +_cairo_cff_dict_equal (const void *key_a, const void *key_b) +{ + const cff_dict_operator_t *op_a = key_a; + const cff_dict_operator_t *op_b = key_b; + + return op_a->operator == op_b->operator; +} + +static cairo_status_t +cff_dict_init (cairo_hash_table_t **dict) +{ + *dict = _cairo_hash_table_create (_cairo_cff_dict_equal); + if (unlikely (*dict == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_dict_init_key (cff_dict_operator_t *key, int operator) +{ + key->base.hash = (unsigned long) operator; + key->operator = operator; +} + +static cairo_status_t +cff_dict_create_operator (int operator, + unsigned char *operand, + int size, + cff_dict_operator_t **out) +{ + cff_dict_operator_t *op; + + op = malloc (sizeof (cff_dict_operator_t)); + if (unlikely (op == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_dict_init_key (op, operator); + op->operand = malloc (size); + if (unlikely (op->operand == NULL)) { + free (op); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + memcpy (op->operand, operand, size); + op->operand_length = size; + op->operand_offset = -1; + + *out = op; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cff_dict_read (cairo_hash_table_t *dict, unsigned char *p, int dict_size) +{ + unsigned char *end; + cairo_array_t operands; + cff_dict_operator_t *op; + unsigned short operator; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + int size; + + end = p + dict_size; + _cairo_array_init (&operands, 1); + while (p < end) { + size = operand_length (p); + if (size != 0) { + status = _cairo_array_append_multiple (&operands, p, size); + if (unlikely (status)) + goto fail; + + p += size; + } else { + p = decode_operator (p, &operator); + status = cff_dict_create_operator (operator, + _cairo_array_index (&operands, 0), + _cairo_array_num_elements (&operands), + &op); + if (unlikely (status)) + goto fail; + + status = _cairo_hash_table_insert (dict, &op->base); + if (unlikely (status)) + goto fail; + + _cairo_array_truncate (&operands, 0); + } + } + +fail: + _cairo_array_fini (&operands); + + return status; +} + +static void +cff_dict_remove (cairo_hash_table_t *dict, unsigned short operator) +{ + cff_dict_operator_t key, *op; + + _cairo_dict_init_key (&key, operator); + op = _cairo_hash_table_lookup (dict, &key.base); + if (op != NULL) { + free (op->operand); + _cairo_hash_table_remove (dict, (cairo_hash_entry_t *) op); + free (op); + } +} + +static unsigned char * +cff_dict_get_operands (cairo_hash_table_t *dict, + unsigned short operator, + int *size) +{ + cff_dict_operator_t key, *op; + + _cairo_dict_init_key (&key, operator); + op = _cairo_hash_table_lookup (dict, &key.base); + if (op != NULL) { + *size = op->operand_length; + return op->operand; + } + + return NULL; +} + +static cairo_status_t +cff_dict_set_operands (cairo_hash_table_t *dict, + unsigned short operator, + unsigned char *operand, + int size) +{ + cff_dict_operator_t key, *op; + cairo_status_t status; + + _cairo_dict_init_key (&key, operator); + op = _cairo_hash_table_lookup (dict, &key.base); + if (op != NULL) { + free (op->operand); + op->operand = malloc (size); + if (unlikely (op->operand == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (op->operand, operand, size); + op->operand_length = size; + } + else + { + status = cff_dict_create_operator (operator, operand, size, &op); + if (unlikely (status)) + return status; + + status = _cairo_hash_table_insert (dict, &op->base); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static int +cff_dict_get_location (cairo_hash_table_t *dict, + unsigned short operator, + int *size) +{ + cff_dict_operator_t key, *op; + + _cairo_dict_init_key (&key, operator); + op = _cairo_hash_table_lookup (dict, &key.base); + if (op != NULL) { + *size = op->operand_length; + return op->operand_offset; + } + + return -1; +} + +typedef struct _dict_write_info { + cairo_array_t *output; + cairo_status_t status; +} dict_write_info_t; + +static void +cairo_dict_write_operator (cff_dict_operator_t *op, dict_write_info_t *write_info) +{ + unsigned char data; + + op->operand_offset = _cairo_array_num_elements (write_info->output); + write_info->status = _cairo_array_append_multiple (write_info->output, op->operand, op->operand_length); + if (write_info->status) + return; + + if (op->operator & 0xff00) { + data = op->operator >> 8; + write_info->status = _cairo_array_append (write_info->output, &data); + if (write_info->status) + return; + } + data = op->operator & 0xff; + write_info->status = _cairo_array_append (write_info->output, &data); +} + +static void +_cairo_dict_collect (void *entry, void *closure) +{ + dict_write_info_t *write_info = closure; + cff_dict_operator_t *op = entry; + + if (write_info->status) + return; + + /* The ROS operator is handled separately in cff_dict_write() */ + if (op->operator != ROS_OP) + cairo_dict_write_operator (op, write_info); +} + +static cairo_status_t +cff_dict_write (cairo_hash_table_t *dict, cairo_array_t *output) +{ + dict_write_info_t write_info; + cff_dict_operator_t key, *op; + + write_info.output = output; + write_info.status = CAIRO_STATUS_SUCCESS; + + /* The CFF specification requires that the Top Dict of CID fonts + * begin with the ROS operator. */ + _cairo_dict_init_key (&key, ROS_OP); + op = _cairo_hash_table_lookup (dict, &key.base); + if (op != NULL) + cairo_dict_write_operator (op, &write_info); + + _cairo_hash_table_foreach (dict, _cairo_dict_collect, &write_info); + + return write_info.status; +} + +static void +_cff_dict_entry_pluck (void *_entry, void *dict) +{ + cff_dict_operator_t *entry = _entry; + + _cairo_hash_table_remove (dict, &entry->base); + free (entry->operand); + free (entry); +} + +static void +cff_dict_fini (cairo_hash_table_t *dict) +{ + _cairo_hash_table_foreach (dict, _cff_dict_entry_pluck, dict); + _cairo_hash_table_destroy (dict); +} + +static cairo_int_status_t +cairo_cff_font_read_header (cairo_cff_font_t *font) +{ + if (font->data_length < sizeof (cff_header_t)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + + font->header = (cff_header_t *) font->data; + font->current_ptr = font->data + font->header->header_size; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_cff_font_read_name (cairo_cff_font_t *font) +{ + cairo_array_t index; + cairo_int_status_t status; + cff_index_element_t *element; + unsigned char *p; + int i, len; + + cff_index_init (&index); + status = cff_index_read (&index, &font->current_ptr, font->data_end); + if (!font->is_opentype) { + element = _cairo_array_index (&index, 0); + p = element->data; + len = element->length; + + /* If font name is prefixed with a subset tag, strip it off. */ + if (len > 7 && p[6] == '+') { + for (i = 0; i < 6; i++) + if (p[i] < 'A' || p[i] > 'Z') + break; + if (i == 6) { + p += 7; + len -= 7; + } + } + font->ps_name = malloc (len + 1); + if (unlikely (font->ps_name == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (font->ps_name, p, len); + font->ps_name[len] = 0; + + status = _cairo_escape_ps_name (&font->ps_name); + } + cff_index_fini (&index); + + return status; +} + +static cairo_int_status_t +cairo_cff_font_read_private_dict (cairo_cff_font_t *font, + cairo_hash_table_t *private_dict, + cairo_array_t *local_sub_index, + int *local_sub_bias, + cairo_bool_t **local_subs_used, + double *default_width, + double *nominal_width, + unsigned char *ptr, + int size) +{ + cairo_int_status_t status; + unsigned char buf[10]; + unsigned char *end_buf; + int offset; + int i; + unsigned char *operand; + unsigned char *p; + int num_subs; + + status = cff_dict_read (private_dict, ptr, size); + if (unlikely (status)) + return status; + + operand = cff_dict_get_operands (private_dict, LOCAL_SUB_OP, &i); + if (operand) { + decode_integer (operand, &offset); + p = ptr + offset; + status = cff_index_read (local_sub_index, &p, font->data_end); + if (unlikely (status)) + return status; + + /* Use maximum sized encoding to reserve space for later modification. */ + end_buf = encode_integer_max (buf, 0); + status = cff_dict_set_operands (private_dict, LOCAL_SUB_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + } + + *default_width = 0; + operand = cff_dict_get_operands (private_dict, DEFAULTWIDTH_OP, &i); + if (operand) + decode_number (operand, default_width); + + *nominal_width = 0; + operand = cff_dict_get_operands (private_dict, NOMINALWIDTH_OP, &i); + if (operand) + decode_number (operand, nominal_width); + + num_subs = _cairo_array_num_elements (local_sub_index); + *local_subs_used = calloc (num_subs, sizeof (cairo_bool_t)); + if (unlikely (*local_subs_used == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (num_subs < 1240) + *local_sub_bias = 107; + else if (num_subs < 33900) + *local_sub_bias = 1131; + else + *local_sub_bias = 32768; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_cff_font_read_fdselect (cairo_cff_font_t *font, unsigned char *p) +{ + int type, num_ranges, first, last, fd, i, j; + + font->fdselect = calloc (font->num_glyphs, sizeof (int)); + if (unlikely (font->fdselect == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + type = *p++; + if (type == 0) + { + for (i = 0; i < font->num_glyphs; i++) + font->fdselect[i] = *p++; + } else if (type == 3) { + num_ranges = get_unaligned_be16 (p); + p += 2; + for (i = 0; i < num_ranges; i++) + { + first = get_unaligned_be16 (p); + p += 2; + fd = *p++; + last = get_unaligned_be16 (p); + for (j = first; j < last; j++) + font->fdselect[j] = fd; + } + } else { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_cff_font_read_cid_fontdict (cairo_cff_font_t *font, unsigned char *ptr) +{ + cairo_array_t index; + cff_index_element_t *element; + unsigned int i; + int size; + unsigned char *operand; + int offset; + cairo_int_status_t status; + unsigned char buf[100]; + unsigned char *end_buf; + + cff_index_init (&index); + status = cff_index_read (&index, &ptr, font->data_end); + if (unlikely (status)) + goto fail; + + font->num_fontdicts = _cairo_array_num_elements (&index); + + font->fd_dict = calloc (sizeof (cairo_hash_table_t *), font->num_fontdicts); + if (unlikely (font->fd_dict == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + font->fd_private_dict = calloc (sizeof (cairo_hash_table_t *), font->num_fontdicts); + if (unlikely (font->fd_private_dict == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + font->fd_local_sub_index = calloc (sizeof (cairo_array_t), font->num_fontdicts); + if (unlikely (font->fd_local_sub_index == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + font->fd_local_sub_bias = calloc (sizeof (int), font->num_fontdicts); + if (unlikely (font->fd_local_sub_bias == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + font->fd_local_subs_used = calloc (sizeof (cairo_bool_t *), font->num_fontdicts); + if (unlikely (font->fd_local_subs_used == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + font->fd_default_width = calloc (font->num_fontdicts, sizeof (double)); + if (unlikely (font->fd_default_width == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + font->fd_nominal_width = calloc (font->num_fontdicts, sizeof (double)); + if (unlikely (font->fd_nominal_width == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + + for (i = 0; i < font->num_fontdicts; i++) { + status = cff_dict_init (&font->fd_dict[i]); + if (unlikely (status)) + goto fail; + + element = _cairo_array_index (&index, i); + status = cff_dict_read (font->fd_dict[i], element->data, element->length); + if (unlikely (status)) + goto fail; + + operand = cff_dict_get_operands (font->fd_dict[i], PRIVATE_OP, &size); + if (operand == NULL) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto fail; + } + operand = decode_integer (operand, &size); + decode_integer (operand, &offset); + status = cff_dict_init (&font->fd_private_dict[i]); + if (unlikely (status)) + goto fail; + + cff_index_init (&font->fd_local_sub_index[i]); + status = cairo_cff_font_read_private_dict (font, + font->fd_private_dict[i], + &font->fd_local_sub_index[i], + &font->fd_local_sub_bias[i], + &font->fd_local_subs_used[i], + &font->fd_default_width[i], + &font->fd_nominal_width[i], + font->data + offset, + size); + if (unlikely (status)) + goto fail; + + /* Set integer operand to max value to use max size encoding to reserve + * space for any value later */ + end_buf = encode_integer_max (buf, 0); + end_buf = encode_integer_max (end_buf, 0); + status = cff_dict_set_operands (font->fd_dict[i], PRIVATE_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + } + + return CAIRO_STATUS_SUCCESS; + +fail: + cff_index_fini (&index); + + return status; +} + +static void +cairo_cff_font_read_font_metrics (cairo_cff_font_t *font, cairo_hash_table_t *top_dict) +{ + unsigned char *p; + unsigned char *end; + int size; + double x_min, y_min, x_max, y_max; + double xx, yx, xy, yy; + + x_min = 0.0; + y_min = 0.0; + x_max = 0.0; + y_max = 0.0; + p = cff_dict_get_operands (font->top_dict, FONTBBOX_OP, &size); + if (p) { + end = p + size; + if (p < end) + p = decode_number (p, &x_min); + if (p < end) + p = decode_number (p, &y_min); + if (p < end) + p = decode_number (p, &x_max); + if (p < end) + p = decode_number (p, &y_max); + } + font->x_min = floor (x_min); + font->y_min = floor (y_min); + font->x_max = floor (x_max); + font->y_max = floor (y_max); + font->ascent = font->y_max; + font->descent = font->y_min; + + xx = 0.001; + yx = 0.0; + xy = 0.0; + yy = 0.001; + p = cff_dict_get_operands (font->top_dict, FONTMATRIX_OP, &size); + if (p) { + end = p + size; + if (p < end) + p = decode_number (p, &xx); + if (p < end) + p = decode_number (p, &yx); + if (p < end) + p = decode_number (p, &xy); + if (p < end) + p = decode_number (p, &yy); + } + /* Freetype uses 1/yy to get units per EM */ + font->units_per_em = _cairo_round(1.0/yy); +} + +static cairo_int_status_t +cairo_cff_font_read_top_dict (cairo_cff_font_t *font) +{ + cairo_array_t index; + cff_index_element_t *element; + unsigned char buf[20]; + unsigned char *end_buf; + unsigned char *operand; + cairo_int_status_t status; + unsigned char *p; + int size; + int offset; + + cff_index_init (&index); + status = cff_index_read (&index, &font->current_ptr, font->data_end); + if (unlikely (status)) + goto fail; + + element = _cairo_array_index (&index, 0); + status = cff_dict_read (font->top_dict, element->data, element->length); + if (unlikely (status)) + goto fail; + + if (cff_dict_get_operands (font->top_dict, ROS_OP, &size) != NULL) + font->is_cid = TRUE; + else + font->is_cid = FALSE; + + operand = cff_dict_get_operands (font->top_dict, CHARSTRINGS_OP, &size); + decode_integer (operand, &offset); + p = font->data + offset; + status = cff_index_read (&font->charstrings_index, &p, font->data_end); + if (unlikely (status)) + goto fail; + font->num_glyphs = _cairo_array_num_elements (&font->charstrings_index); + + if (font->is_cid) { + operand = cff_dict_get_operands (font->top_dict, CHARSET_OP, &size); + if (!operand) + return CAIRO_INT_STATUS_UNSUPPORTED; + + decode_integer (operand, &offset); + font->charset = font->data + offset; + if (font->charset >= font->data_end) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (!font->is_opentype) + cairo_cff_font_read_font_metrics (font, font->top_dict); + + if (font->is_cid) { + operand = cff_dict_get_operands (font->top_dict, FDSELECT_OP, &size); + decode_integer (operand, &offset); + status = cairo_cff_font_read_fdselect (font, font->data + offset); + if (unlikely (status)) + goto fail; + + operand = cff_dict_get_operands (font->top_dict, FDARRAY_OP, &size); + decode_integer (operand, &offset); + status = cairo_cff_font_read_cid_fontdict (font, font->data + offset); + if (unlikely (status)) + goto fail; + } else { + operand = cff_dict_get_operands (font->top_dict, PRIVATE_OP, &size); + operand = decode_integer (operand, &size); + decode_integer (operand, &offset); + status = cairo_cff_font_read_private_dict (font, + font->private_dict, + &font->local_sub_index, + &font->local_sub_bias, + &font->local_subs_used, + &font->default_width, + &font->nominal_width, + font->data + offset, + size); + if (unlikely (status)) + goto fail; + } + + /* Use maximum sized encoding to reserve space for later modification. */ + end_buf = encode_integer_max (buf, 0); + status = cff_dict_set_operands (font->top_dict, + CHARSTRINGS_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + + status = cff_dict_set_operands (font->top_dict, + CHARSET_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + + if (font->scaled_font_subset->is_latin) { + status = cff_dict_set_operands (font->top_dict, + ENCODING_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + + /* Private has two operands - size and offset */ + end_buf = encode_integer_max (end_buf, 0); + cff_dict_set_operands (font->top_dict, PRIVATE_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + + } else { + status = cff_dict_set_operands (font->top_dict, + FDSELECT_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + + status = cff_dict_set_operands (font->top_dict, + FDARRAY_OP, buf, end_buf - buf); + if (unlikely (status)) + goto fail; + + cff_dict_remove (font->top_dict, ENCODING_OP); + cff_dict_remove (font->top_dict, PRIVATE_OP); + } + + /* Remove the unique identifier operators as the subsetted font is + * not the same is the original font. */ + cff_dict_remove (font->top_dict, UNIQUEID_OP); + cff_dict_remove (font->top_dict, XUID_OP); + +fail: + cff_index_fini (&index); + + return status; +} + +static cairo_int_status_t +cairo_cff_font_read_strings (cairo_cff_font_t *font) +{ + return cff_index_read (&font->strings_index, &font->current_ptr, font->data_end); +} + +static cairo_int_status_t +cairo_cff_font_read_global_subroutines (cairo_cff_font_t *font) +{ + cairo_int_status_t status; + int num_subs; + + status = cff_index_read (&font->global_sub_index, &font->current_ptr, font->data_end); + if (unlikely (status)) + return status; + + num_subs = _cairo_array_num_elements (&font->global_sub_index); + font->global_subs_used = calloc (num_subs, sizeof(cairo_bool_t)); + if (unlikely (font->global_subs_used == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (num_subs < 1240) + font->global_sub_bias = 107; + else if (num_subs < 33900) + font->global_sub_bias = 1131; + else + font->global_sub_bias = 32768; + + return CAIRO_STATUS_SUCCESS; +} + +typedef cairo_int_status_t +(*font_read_t) (cairo_cff_font_t *font); + +static const font_read_t font_read_funcs[] = { + cairo_cff_font_read_header, + cairo_cff_font_read_name, + cairo_cff_font_read_top_dict, + cairo_cff_font_read_strings, + cairo_cff_font_read_global_subroutines, +}; + +static cairo_int_status_t +cairo_cff_font_read_font (cairo_cff_font_t *font) +{ + cairo_int_status_t status; + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH (font_read_funcs); i++) { + status = font_read_funcs[i] (font); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_set_ros_strings (cairo_cff_font_t *font) +{ + cairo_status_t status; + unsigned char buf[30]; + unsigned char *p; + int sid1, sid2; + const char *registry = "Adobe"; + const char *ordering = "Identity"; + + sid1 = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); + status = cff_index_append_copy (&font->strings_subset_index, + (unsigned char *)registry, + strlen(registry)); + if (unlikely (status)) + return status; + + sid2 = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); + status = cff_index_append_copy (&font->strings_subset_index, + (unsigned char *)ordering, + strlen(ordering)); + if (unlikely (status)) + return status; + + p = encode_integer (buf, sid1); + p = encode_integer (p, sid2); + p = encode_integer (p, 0); + status = cff_dict_set_operands (font->top_dict, ROS_OP, buf, p - buf); + if (unlikely (status)) + return status; + + p = encode_integer (buf, font->scaled_font_subset->num_glyphs); + status = cff_dict_set_operands (font->top_dict, CIDCOUNT_OP, buf, p - buf); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_subset_dict_string(cairo_cff_font_t *font, + cairo_hash_table_t *dict, + int operator) +{ + int size; + unsigned char *p; + int sid; + unsigned char buf[100]; + cff_index_element_t *element; + cairo_status_t status; + + p = cff_dict_get_operands (dict, operator, &size); + if (!p) + return CAIRO_STATUS_SUCCESS; + + decode_integer (p, &sid); + if (sid < NUM_STD_STRINGS) + return CAIRO_STATUS_SUCCESS; + + element = _cairo_array_index (&font->strings_index, sid - NUM_STD_STRINGS); + sid = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); + status = cff_index_append (&font->strings_subset_index, element->data, element->length); + if (unlikely (status)) + return status; + + p = encode_integer (buf, sid); + status = cff_dict_set_operands (dict, operator, buf, p - buf); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static const int dict_strings[] = { + VERSION_OP, + NOTICE_OP, + COPYRIGHT_OP, + FULLNAME_OP, + FAMILYNAME_OP, + WEIGHT_OP, + POSTSCRIPT_OP, + BASEFONTNAME_OP, + FONTNAME_OP, +}; + +static cairo_status_t +cairo_cff_font_subset_dict_strings (cairo_cff_font_t *font, + cairo_hash_table_t *dict) +{ + cairo_status_t status; + unsigned int i; + + for (i = 0; i < ARRAY_LENGTH (dict_strings); i++) { + status = cairo_cff_font_subset_dict_string (font, dict, dict_strings[i]); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static unsigned char * +type2_decode_integer (unsigned char *p, int *integer) +{ + if (*p == 28) { + *integer = p[1] << 8 | p[2]; + p += 3; + } else if (*p <= 246) { + *integer = *p++ - 139; + } else if (*p <= 250) { + *integer = (p[0] - 247) * 256 + p[1] + 108; + p += 2; + } else if (*p <= 254) { + *integer = -(p[0] - 251) * 256 - p[1] - 108; + p += 2; + } else { /* *p == 255 */ + /* 16.16 fixed-point number. The fraction is ignored. */ + *integer = (int16_t)((p[1] << 8) | p[2]); + p += 5; + } + return p; +} + +/* Type 2 charstring parser for finding calls to local or global + * subroutines. For non Opentype CFF fonts it also gets the glyph + * widths. + * + * When we find a subroutine operator, the subroutine is marked as in + * use and recursively followed. The subroutine number is the value on + * the top of the stack when the subroutine operator is executed. In + * most fonts the subroutine number is encoded in an integer + * immediately preceding the subroutine operator. However it is + * possible for the subroutine number on the stack to be the result of + * a computation (in which case there will be an operator preceding + * the subroutine operator). If this occurs, subroutine subsetting is + * disabled since we can't easily determine which subroutines are + * used. + * + * The width, if present, is the first integer in the charstring. The + * only way to confirm if the integer at the start of the charstring is + * the width is when the first stack clearing operator is parsed, + * check if there is an extra integer left over on the stack. + * + * When the first stack clearing operator is encountered + * type2_find_width is set to FALSE and type2_found_width is set to + * TRUE if an extra argument is found, otherwise FALSE. + */ +static cairo_status_t +cairo_cff_parse_charstring (cairo_cff_font_t *font, + unsigned char *charstring, int length, + int glyph_id, + cairo_bool_t need_width) +{ + unsigned char *p = charstring; + unsigned char *end = charstring + length; + int integer; + int hint_bytes; + int sub_num; + cff_index_element_t *element; + int fd; + + while (p < end) { + if (*p == 28 || *p >= 32) { + /* Integer value */ + p = type2_decode_integer (p, &integer); + font->type2_stack_size++; + font->type2_stack_top_value = integer; + font->type2_stack_top_is_int = TRUE; + if (!font->type2_seen_first_int) { + font->type2_width = integer; + font->type2_seen_first_int = TRUE; + } + } else if (*p == TYPE2_hstem || *p == TYPE2_vstem || + *p == TYPE2_hstemhm || *p == TYPE2_vstemhm) { + /* Hint operator. The number of hints declared by the + * operator depends on the size of the stack. */ + font->type2_stack_top_is_int = FALSE; + font->type2_num_hints += font->type2_stack_size/2; + if (font->type2_find_width && font->type2_stack_size % 2) + font->type2_found_width = TRUE; + + font->type2_stack_size = 0; + font->type2_find_width = FALSE; + p++; + } else if (*p == TYPE2_hintmask || *p == TYPE2_cntrmask) { + /* Hintmask operator. These operators are followed by a + * variable length mask where the length depends on the + * number of hints declared. The first time this is called + * it is also an implicit vstem if there are arguments on + * the stack. */ + if (font->type2_hintmask_bytes == 0) { + font->type2_stack_top_is_int = FALSE; + font->type2_num_hints += font->type2_stack_size/2; + if (font->type2_find_width && font->type2_stack_size % 2) + font->type2_found_width = TRUE; + + font->type2_stack_size = 0; + font->type2_find_width = FALSE; + font->type2_hintmask_bytes = (font->type2_num_hints+7)/8; + } + + hint_bytes = font->type2_hintmask_bytes; + p++; + p += hint_bytes; + } else if (*p == TYPE2_rmoveto) { + if (font->type2_find_width && font->type2_stack_size > 2) + font->type2_found_width = TRUE; + + font->type2_stack_size = 0; + font->type2_find_width = FALSE; + font->type2_has_path = TRUE; + p++; + } else if (*p == TYPE2_hmoveto || *p == TYPE2_vmoveto) { + if (font->type2_find_width && font->type2_stack_size > 1) + font->type2_found_width = TRUE; + + font->type2_stack_size = 0; + font->type2_find_width = FALSE; + font->type2_has_path = TRUE; + p++; + } else if (*p == TYPE2_endchar) { + if (!font->type2_has_path && font->type2_stack_size > 3) + return CAIRO_INT_STATUS_UNSUPPORTED; /* seac (Ref Appendix C of Type 2 Charstring Format */ + + if (font->type2_find_width && font->type2_stack_size > 0) + font->type2_found_width = TRUE; + + return CAIRO_STATUS_SUCCESS; + } else if (*p == TYPE2_callsubr) { + /* call to local subroutine */ + if (! font->type2_stack_top_is_int) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (++font->type2_nesting_level > MAX_SUBROUTINE_NESTING) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p++; + font->type2_stack_top_is_int = FALSE; + font->type2_stack_size--; + if (font->type2_find_width && font->type2_stack_size == 0) + font->type2_seen_first_int = FALSE; + + if (font->is_cid) { + fd = font->fdselect[glyph_id]; + sub_num = font->type2_stack_top_value + font->fd_local_sub_bias[fd]; + element = _cairo_array_index (&font->fd_local_sub_index[fd], sub_num); + if (! font->fd_local_subs_used[fd][sub_num]) { + font->fd_local_subs_used[fd][sub_num] = TRUE; + cairo_cff_parse_charstring (font, element->data, element->length, glyph_id, need_width); + } + } else { + sub_num = font->type2_stack_top_value + font->local_sub_bias; + element = _cairo_array_index (&font->local_sub_index, sub_num); + if (! font->local_subs_used[sub_num] || + (need_width && !font->type2_found_width)) + { + font->local_subs_used[sub_num] = TRUE; + cairo_cff_parse_charstring (font, element->data, element->length, glyph_id, need_width); + } + } + font->type2_nesting_level--; + } else if (*p == TYPE2_callgsubr) { + /* call to global subroutine */ + if (! font->type2_stack_top_is_int) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (++font->type2_nesting_level > MAX_SUBROUTINE_NESTING) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p++; + font->type2_stack_size--; + font->type2_stack_top_is_int = FALSE; + if (font->type2_find_width && font->type2_stack_size == 0) + font->type2_seen_first_int = FALSE; + + sub_num = font->type2_stack_top_value + font->global_sub_bias; + element = _cairo_array_index (&font->global_sub_index, sub_num); + if (! font->global_subs_used[sub_num] || + (need_width && !font->type2_found_width)) + { + font->global_subs_used[sub_num] = TRUE; + cairo_cff_parse_charstring (font, element->data, element->length, glyph_id, need_width); + } + font->type2_nesting_level--; + } else if (*p == 12) { + /* 2 byte instruction */ + + /* All the 2 byte operators are either not valid before a + * stack clearing operator or they are one of the + * arithmetic, storage, or conditional operators. */ + if (need_width && font->type2_find_width) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p += 2; + font->type2_stack_top_is_int = FALSE; + } else { + /* 1 byte instruction */ + p++; + font->type2_stack_top_is_int = FALSE; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_find_width_and_subroutines_used (cairo_cff_font_t *font, + unsigned char *charstring, int length, + int glyph_id, int subset_id) +{ + cairo_status_t status; + int width; + int fd; + + font->type2_stack_size = 0; + font->type2_stack_top_value = 0;; + font->type2_stack_top_is_int = FALSE; + font->type2_num_hints = 0; + font->type2_hintmask_bytes = 0; + font->type2_nesting_level = 0; + font->type2_seen_first_int = FALSE; + font->type2_find_width = TRUE; + font->type2_found_width = FALSE; + font->type2_width = 0; + font->type2_has_path = FALSE; + + status = cairo_cff_parse_charstring (font, charstring, length, glyph_id, TRUE); + if (status) + return status; + + if (!font->is_opentype) { + if (font->is_cid) { + fd = font->fdselect[glyph_id]; + if (font->type2_found_width) + width = font->fd_nominal_width[fd] + font->type2_width; + else + width = font->fd_default_width[fd]; + } else { + if (font->type2_found_width) + width = font->nominal_width + font->type2_width; + else + width = font->default_width; + } + font->widths[subset_id] = width; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_cff_font_get_gid_for_cid (cairo_cff_font_t *font, unsigned long cid, unsigned long *gid) +{ + unsigned char *p; + unsigned long first_gid; + unsigned long first_cid; + int num_left; + unsigned long c, g; + + if (cid == 0) { + *gid = 0; + return CAIRO_STATUS_SUCCESS; + } + + switch (font->charset[0]) { + /* Format 0 */ + case 0: + p = font->charset + 1; + g = 1; + while (g <= (unsigned)font->num_glyphs && p < font->data_end) { + c = get_unaligned_be16 (p); + if (c == cid) { + *gid = g; + return CAIRO_STATUS_SUCCESS; + } + g++; + p += 2; + } + break; + + /* Format 1 */ + case 1: + first_gid = 1; + p = font->charset + 1; + while (first_gid <= (unsigned)font->num_glyphs && p + 2 < font->data_end) { + first_cid = get_unaligned_be16 (p); + num_left = p[2]; + if (cid >= first_cid && cid <= first_cid + num_left) { + *gid = first_gid + cid - first_cid; + return CAIRO_STATUS_SUCCESS; + } + first_gid += num_left + 1; + p += 3; + } + break; + + /* Format 2 */ + case 2: + first_gid = 1; + p = font->charset + 1; + while (first_gid <= (unsigned)font->num_glyphs && p + 3 < font->data_end) { + first_cid = get_unaligned_be16 (p); + num_left = get_unaligned_be16 (p+2); + if (cid >= first_cid && cid <= first_cid + num_left) { + *gid = first_gid + cid - first_cid; + return CAIRO_STATUS_SUCCESS; + } + first_gid += num_left + 1; + p += 4; + } + break; + + default: + break; + } + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_int_status_t +cairo_cff_font_subset_charstrings_and_subroutines (cairo_cff_font_t *font) +{ + cff_index_element_t *element; + unsigned int i; + cairo_int_status_t status; + unsigned long glyph, cid; + + font->subset_subroutines = TRUE; + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + if (font->is_cid) { + cid = font->scaled_font_subset->glyphs[i]; + status = cairo_cff_font_get_gid_for_cid (font, cid, &glyph); + if (unlikely (status)) + return status; + } else { + glyph = font->scaled_font_subset->glyphs[i]; + } + element = _cairo_array_index (&font->charstrings_index, glyph); + status = cff_index_append (&font->charstrings_subset_index, + element->data, + element->length); + if (unlikely (status)) + return status; + + if (font->subset_subroutines) { + status = cairo_cff_find_width_and_subroutines_used (font, + element->data, element->length, + glyph, i); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + /* If parsing the charstrings fails we embed all the + * subroutines. But if the font is not opentype we + * need to successfully parse all charstrings to get + * the widths. */ + font->subset_subroutines = FALSE; + if (!font->is_opentype) + return status; + } else if (unlikely (status)) { + return status; + } + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_subset_fontdict (cairo_cff_font_t *font) +{ + unsigned int i; + int fd; + int *reverse_map; + unsigned long cid, gid; + cairo_int_status_t status; + + font->fdselect_subset = calloc (font->scaled_font_subset->num_glyphs, + sizeof (int)); + if (unlikely (font->fdselect_subset == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->fd_subset_map = calloc (font->num_fontdicts, sizeof (int)); + if (unlikely (font->fd_subset_map == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->private_dict_offset = calloc (font->num_fontdicts, sizeof (int)); + if (unlikely (font->private_dict_offset == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + reverse_map = calloc (font->num_fontdicts, sizeof (int)); + if (unlikely (reverse_map == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + for (i = 0; i < font->num_fontdicts; i++) + reverse_map[i] = -1; + + font->num_subset_fontdicts = 0; + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + cid = font->scaled_font_subset->glyphs[i]; + status = cairo_cff_font_get_gid_for_cid (font, cid, &gid); + if (unlikely (status)) { + free (reverse_map); + return status; + } + + fd = font->fdselect[gid]; + if (reverse_map[fd] < 0) { + font->fd_subset_map[font->num_subset_fontdicts] = fd; + reverse_map[fd] = font->num_subset_fontdicts++; + } + font->fdselect_subset[i] = reverse_map[fd]; + } + + free (reverse_map); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_create_cid_fontdict (cairo_cff_font_t *font) +{ + unsigned char buf[100]; + unsigned char *end_buf; + cairo_status_t status; + + font->num_fontdicts = 1; + font->fd_dict = malloc (sizeof (cairo_hash_table_t *)); + if (unlikely (font->fd_dict == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (cff_dict_init (&font->fd_dict[0])) { + free (font->fd_dict); + font->fd_dict = NULL; + font->num_fontdicts = 0; + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + font->fd_subset_map = malloc (sizeof (int)); + if (unlikely (font->fd_subset_map == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->private_dict_offset = malloc (sizeof (int)); + if (unlikely (font->private_dict_offset == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->fd_subset_map[0] = 0; + font->num_subset_fontdicts = 1; + + /* Set integer operand to max value to use max size encoding to reserve + * space for any value later */ + end_buf = encode_integer_max (buf, 0); + end_buf = encode_integer_max (end_buf, 0); + status = cff_dict_set_operands (font->fd_dict[0], PRIVATE_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_subset_strings (cairo_cff_font_t *font) +{ + cairo_status_t status; + unsigned int i; + + status = cairo_cff_font_subset_dict_strings (font, font->top_dict); + if (unlikely (status)) + return status; + + if (font->is_cid) { + for (i = 0; i < font->num_subset_fontdicts; i++) { + status = cairo_cff_font_subset_dict_strings (font, font->fd_dict[font->fd_subset_map[i]]); + if (unlikely (status)) + return status; + + status = cairo_cff_font_subset_dict_strings (font, font->fd_private_dict[font->fd_subset_map[i]]); + if (unlikely (status)) + return status; + } + } else { + status = cairo_cff_font_subset_dict_strings (font, font->private_dict); + } + + return status; +} + +/* The Euro is the only the only character in the winansi encoding + * with a glyph name that is not a CFF standard string. As the strings + * are written before the charset, we need to check during the + * subsetting phase if the Euro glyph is required and add the + * glyphname to the list of strings to write out. + */ +static cairo_status_t +cairo_cff_font_add_euro_charset_string (cairo_cff_font_t *font) +{ + cairo_status_t status; + unsigned int i; + int ch; + const char *euro = "Euro"; + + for (i = 1; i < font->scaled_font_subset->num_glyphs; i++) { + ch = font->scaled_font_subset->to_latin_char[i]; + if (ch == 128) { + font->euro_sid = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); + status = cff_index_append_copy (&font->strings_subset_index, + (unsigned char *)euro, strlen(euro)); + return status; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_subset_font (cairo_cff_font_t *font) +{ + cairo_status_t status; + + if (!font->scaled_font_subset->is_latin) { + status = cairo_cff_font_set_ros_strings (font); + if (unlikely (status)) + return status; + } + + status = cairo_cff_font_subset_charstrings_and_subroutines (font); + if (unlikely (status)) + return status; + + if (!font->scaled_font_subset->is_latin) { + if (font->is_cid) + status = cairo_cff_font_subset_fontdict (font); + else + status = cairo_cff_font_create_cid_fontdict (font); + if (unlikely (status)) + return status; + } else { + font->private_dict_offset = malloc (sizeof (int)); + if (unlikely (font->private_dict_offset == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + status = cairo_cff_font_subset_strings (font); + if (unlikely (status)) + return status; + + if (font->scaled_font_subset->is_latin) + status = cairo_cff_font_add_euro_charset_string (font); + + return status; +} + +/* Set the operand of the specified operator in the (already written) + * top dict to point to the current position in the output + * array. Operands updated with this function must have previously + * been encoded with the 5-byte (max) integer encoding. */ +static void +cairo_cff_font_set_topdict_operator_to_cur_pos (cairo_cff_font_t *font, + int operator) +{ + int cur_pos; + int offset; + int size; + unsigned char buf[10]; + unsigned char *buf_end; + unsigned char *op_ptr; + + cur_pos = _cairo_array_num_elements (&font->output); + buf_end = encode_integer_max (buf, cur_pos); + offset = cff_dict_get_location (font->top_dict, operator, &size); + assert (offset > 0); + op_ptr = _cairo_array_index (&font->output, offset); + memcpy (op_ptr, buf, buf_end - buf); +} + +static cairo_status_t +cairo_cff_font_write_header (cairo_cff_font_t *font) +{ + return _cairo_array_append_multiple (&font->output, + font->header, + font->header->header_size); +} + +static cairo_status_t +cairo_cff_font_write_name (cairo_cff_font_t *font) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_array_t index; + + cff_index_init (&index); + + status = cff_index_append_copy (&index, + (unsigned char *) font->ps_name, + strlen(font->ps_name)); + if (unlikely (status)) + goto FAIL; + + status = cff_index_write (&index, &font->output); + if (unlikely (status)) + goto FAIL; + +FAIL: + cff_index_fini (&index); + + return status; +} + +static cairo_status_t +cairo_cff_font_write_top_dict (cairo_cff_font_t *font) +{ + uint16_t count; + unsigned char buf[10]; + unsigned char *p; + int offset_index; + int dict_start, dict_size; + int offset_size = 4; + cairo_status_t status; + + /* Write an index containing the top dict */ + + count = cpu_to_be16 (1); + status = _cairo_array_append_multiple (&font->output, &count, 2); + if (unlikely (status)) + return status; + buf[0] = offset_size; + status = _cairo_array_append (&font->output, buf); + if (unlikely (status)) + return status; + encode_index_offset (buf, offset_size, 1); + status = _cairo_array_append_multiple (&font->output, buf, offset_size); + if (unlikely (status)) + return status; + + /* Reserve space for last element of offset array and update after + * dict is written */ + offset_index = _cairo_array_num_elements (&font->output); + status = _cairo_array_append_multiple (&font->output, buf, offset_size); + if (unlikely (status)) + return status; + + dict_start = _cairo_array_num_elements (&font->output); + status = cff_dict_write (font->top_dict, &font->output); + if (unlikely (status)) + return status; + dict_size = _cairo_array_num_elements (&font->output) - dict_start; + + encode_index_offset (buf, offset_size, dict_size + 1); + p = _cairo_array_index (&font->output, offset_index); + memcpy (p, buf, offset_size); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_strings (cairo_cff_font_t *font) +{ + return cff_index_write (&font->strings_subset_index, &font->output); +} + +static cairo_status_t +cairo_cff_font_write_global_subrs (cairo_cff_font_t *font) +{ + unsigned int i; + unsigned char return_op = TYPE2_return; + + /* poppler and fontforge don't like zero length subroutines so we + * replace unused subroutines with a 'return' instruction. */ + if (font->subset_subroutines) { + for (i = 0; i < _cairo_array_num_elements (&font->global_sub_index); i++) { + if (! font->global_subs_used[i]) + cff_index_set_object (&font->global_sub_index, i, &return_op, 1); + } + } + + return cff_index_write (&font->global_sub_index, &font->output); +} + +static cairo_status_t +cairo_cff_font_write_encoding (cairo_cff_font_t *font) +{ + unsigned char buf[2]; + cairo_status_t status; + unsigned int i; + + cairo_cff_font_set_topdict_operator_to_cur_pos (font, ENCODING_OP); + buf[0] = 0; /* Format 0 */ + buf[1] = font->scaled_font_subset->num_glyphs - 1; + status = _cairo_array_append_multiple (&font->output, buf, 2); + if (unlikely (status)) + return status; + + for (i = 1; i < font->scaled_font_subset->num_glyphs; i++) { + unsigned char ch = font->scaled_font_subset->to_latin_char[i]; + status = _cairo_array_append (&font->output, &ch); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_fdselect (cairo_cff_font_t *font) +{ + unsigned char data; + unsigned int i; + cairo_int_status_t status; + + cairo_cff_font_set_topdict_operator_to_cur_pos (font, FDSELECT_OP); + + if (font->is_cid) { + data = 0; + status = _cairo_array_append (&font->output, &data); + if (unlikely (status)) + return status; + + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + data = font->fdselect_subset[i]; + status = _cairo_array_append (&font->output, &data); + if (unlikely (status)) + return status; + } + } else { + unsigned char byte; + uint16_t word; + + status = _cairo_array_grow_by (&font->output, 9); + if (unlikely (status)) + return status; + + byte = 3; + status = _cairo_array_append (&font->output, &byte); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + word = cpu_to_be16 (1); + status = _cairo_array_append_multiple (&font->output, &word, 2); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + word = cpu_to_be16 (0); + status = _cairo_array_append_multiple (&font->output, &word, 2); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + byte = 0; + status = _cairo_array_append (&font->output, &byte); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + word = cpu_to_be16 (font->scaled_font_subset->num_glyphs); + status = _cairo_array_append_multiple (&font->output, &word, 2); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + return CAIRO_STATUS_SUCCESS; +} + +/* Winansi to CFF standard strings mapping for characters 128 to 255 */ +static const int winansi_to_cff_std_string[] = { + /* 128 */ + 0, 0, 117, 101, 118, 121, 112, 113, + 126, 122, 192, 107, 142, 0, 199, 0, + /* 144 */ + 0, 65, 8, 105, 119, 116, 111, 137, + 127, 153, 221, 108, 148, 0, 228, 198, + /* 160 */ + 0, 96, 97, 98, 103, 100, 160, 102, + 131, 170, 139, 106, 151, 0, 165, 128, + /* 176 */ + 161, 156, 164, 169, 125, 152, 115, 114, + 133, 150, 143, 120, 158, 155, 163, 123, + /* 192 */ + 174, 171, 172, 176, 173, 175, 138, 177, + 181, 178, 179, 180, 185, 182, 183, 184, + /* 208 */ + 154, 186, 190, 187, 188, 191, 189, 168, + 141, 196, 193, 194, 195, 197, 157, 149, + /* 224 */ + 203, 200, 201, 205, 202, 204, 144, 206, + 210, 207, 208, 209, 214, 211, 212, 213, + /* 240 */ + 167, 215, 219, 216, 217, 220, 218, 159, + 147, 225, 222, 223, 224, 226, 162, 227, +}; + +static int +cairo_cff_font_get_sid_for_winansi_char (cairo_cff_font_t *font, int ch) +{ + int sid; + + if (ch == 39) { + sid = 104; + + } else if (ch == 96) { + sid = 124; + + } else if (ch >= 32 && ch <= 126) { + sid = ch - 31; + + } else if (ch == 128) { + assert (font->euro_sid >= NUM_STD_STRINGS); + sid = font->euro_sid; + + } else if (ch >= 128 && ch <= 255) { + sid = winansi_to_cff_std_string[ch - 128]; + + } else { + sid = 0; + } + + return sid; +} + +static cairo_status_t +cairo_cff_font_write_type1_charset (cairo_cff_font_t *font) +{ + unsigned char format = 0; + unsigned int i; + int ch, sid; + cairo_status_t status; + uint16_t sid_be16; + + cairo_cff_font_set_topdict_operator_to_cur_pos (font, CHARSET_OP); + status = _cairo_array_append (&font->output, &format); + if (unlikely (status)) + return status; + + for (i = 1; i < font->scaled_font_subset->num_glyphs; i++) { + ch = font->scaled_font_subset->to_latin_char[i]; + sid = cairo_cff_font_get_sid_for_winansi_char (font, ch); + if (unlikely (status)) + return status; + + sid_be16 = cpu_to_be16(sid); + status = _cairo_array_append_multiple (&font->output, &sid_be16, sizeof(sid_be16)); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_cid_charset (cairo_cff_font_t *font) +{ + unsigned char byte; + uint16_t word; + cairo_status_t status; + + cairo_cff_font_set_topdict_operator_to_cur_pos (font, CHARSET_OP); + status = _cairo_array_grow_by (&font->output, 5); + if (unlikely (status)) + return status; + + byte = 2; + status = _cairo_array_append (&font->output, &byte); + assert (status == CAIRO_STATUS_SUCCESS); + + word = cpu_to_be16 (1); + status = _cairo_array_append_multiple (&font->output, &word, 2); + assert (status == CAIRO_STATUS_SUCCESS); + + word = cpu_to_be16 (font->scaled_font_subset->num_glyphs - 2); + status = _cairo_array_append_multiple (&font->output, &word, 2); + assert (status == CAIRO_STATUS_SUCCESS); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_charstrings (cairo_cff_font_t *font) +{ + cairo_cff_font_set_topdict_operator_to_cur_pos (font, CHARSTRINGS_OP); + + return cff_index_write (&font->charstrings_subset_index, &font->output); +} + +static cairo_status_t +cairo_cff_font_write_cid_fontdict (cairo_cff_font_t *font) +{ + unsigned int i; + cairo_int_status_t status; + unsigned int offset_array; + unsigned char *offset_array_ptr; + int offset_base; + uint16_t count; + uint8_t offset_size = 4; + + cairo_cff_font_set_topdict_operator_to_cur_pos (font, FDARRAY_OP); + count = cpu_to_be16 (font->num_subset_fontdicts); + status = _cairo_array_append_multiple (&font->output, &count, sizeof (uint16_t)); + if (unlikely (status)) + return status; + status = _cairo_array_append (&font->output, &offset_size); + if (unlikely (status)) + return status; + + offset_array = _cairo_array_num_elements (&font->output); + status = _cairo_array_allocate (&font->output, + (font->num_subset_fontdicts + 1)*offset_size, + (void **) &offset_array_ptr); + if (unlikely (status)) + return status; + offset_base = _cairo_array_num_elements (&font->output) - 1; + put_unaligned_be32(1, offset_array_ptr); + offset_array += sizeof(uint32_t); + for (i = 0; i < font->num_subset_fontdicts; i++) { + status = cff_dict_write (font->fd_dict[font->fd_subset_map[i]], + &font->output); + if (unlikely (status)) + return status; + + offset_array_ptr = _cairo_array_index (&font->output, offset_array); + put_unaligned_be32 (_cairo_array_num_elements (&font->output) - offset_base, + offset_array_ptr); + offset_array += sizeof(uint32_t); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_private_dict (cairo_cff_font_t *font, + int dict_num, + cairo_hash_table_t *parent_dict, + cairo_hash_table_t *private_dict) +{ + int offset; + int size; + unsigned char buf[10]; + unsigned char *buf_end; + unsigned char *p; + cairo_status_t status; + + /* Write private dict and update offset and size in top dict */ + font->private_dict_offset[dict_num] = _cairo_array_num_elements (&font->output); + status = cff_dict_write (private_dict, &font->output); + if (unlikely (status)) + return status; + + size = _cairo_array_num_elements (&font->output) - font->private_dict_offset[dict_num]; + /* private entry has two operands - size and offset */ + buf_end = encode_integer_max (buf, size); + buf_end = encode_integer_max (buf_end, font->private_dict_offset[dict_num]); + offset = cff_dict_get_location (parent_dict, PRIVATE_OP, &size); + assert (offset > 0); + p = _cairo_array_index (&font->output, offset); + memcpy (p, buf, buf_end - buf); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_local_sub (cairo_cff_font_t *font, + int dict_num, + cairo_hash_table_t *private_dict, + cairo_array_t *local_sub_index, + cairo_bool_t *local_subs_used) +{ + int offset; + int size; + unsigned char buf[10]; + unsigned char *buf_end; + unsigned char *p; + cairo_status_t status; + unsigned int i; + unsigned char return_op = TYPE2_return; + + if (_cairo_array_num_elements (local_sub_index) > 0) { + /* Write local subroutines and update offset in private + * dict. Local subroutines offset is relative to start of + * private dict */ + offset = _cairo_array_num_elements (&font->output) - font->private_dict_offset[dict_num]; + buf_end = encode_integer_max (buf, offset); + offset = cff_dict_get_location (private_dict, LOCAL_SUB_OP, &size); + assert (offset > 0); + p = _cairo_array_index (&font->output, offset); + memcpy (p, buf, buf_end - buf); + + /* poppler and fontforge don't like zero length subroutines so + * we replace unused subroutines with a 'return' instruction. + */ + if (font->subset_subroutines) { + for (i = 0; i < _cairo_array_num_elements (local_sub_index); i++) { + if (! local_subs_used[i]) + cff_index_set_object (local_sub_index, i, &return_op, 1); + } + } + status = cff_index_write (local_sub_index, &font->output); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + + +static cairo_status_t +cairo_cff_font_write_cid_private_dict_and_local_sub (cairo_cff_font_t *font) +{ + unsigned int i; + cairo_int_status_t status; + + if (font->is_cid) { + for (i = 0; i < font->num_subset_fontdicts; i++) { + status = cairo_cff_font_write_private_dict ( + font, + i, + font->fd_dict[font->fd_subset_map[i]], + font->fd_private_dict[font->fd_subset_map[i]]); + if (unlikely (status)) + return status; + } + + for (i = 0; i < font->num_subset_fontdicts; i++) { + status = cairo_cff_font_write_local_sub ( + font, + i, + font->fd_private_dict[font->fd_subset_map[i]], + &font->fd_local_sub_index[font->fd_subset_map[i]], + font->fd_local_subs_used[font->fd_subset_map[i]]); + if (unlikely (status)) + return status; + } + } else { + status = cairo_cff_font_write_private_dict (font, + 0, + font->fd_dict[0], + font->private_dict); + if (unlikely (status)) + return status; + + status = cairo_cff_font_write_local_sub (font, + 0, + font->private_dict, + &font->local_sub_index, + font->local_subs_used); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_cff_font_write_type1_private_dict_and_local_sub (cairo_cff_font_t *font) +{ + cairo_int_status_t status; + + status = cairo_cff_font_write_private_dict (font, + 0, + font->top_dict, + font->private_dict); + if (unlikely (status)) + return status; + + status = cairo_cff_font_write_local_sub (font, + 0, + font->private_dict, + &font->local_sub_index, + font->local_subs_used); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + + +typedef cairo_status_t +(*font_write_t) (cairo_cff_font_t *font); + +static const font_write_t font_write_cid_funcs[] = { + cairo_cff_font_write_header, + cairo_cff_font_write_name, + cairo_cff_font_write_top_dict, + cairo_cff_font_write_strings, + cairo_cff_font_write_global_subrs, + cairo_cff_font_write_cid_charset, + cairo_cff_font_write_fdselect, + cairo_cff_font_write_charstrings, + cairo_cff_font_write_cid_fontdict, + cairo_cff_font_write_cid_private_dict_and_local_sub, +}; + +static const font_write_t font_write_type1_funcs[] = { + cairo_cff_font_write_header, + cairo_cff_font_write_name, + cairo_cff_font_write_top_dict, + cairo_cff_font_write_strings, + cairo_cff_font_write_global_subrs, + cairo_cff_font_write_encoding, + cairo_cff_font_write_type1_charset, + cairo_cff_font_write_charstrings, + cairo_cff_font_write_type1_private_dict_and_local_sub, +}; + +static cairo_status_t +cairo_cff_font_write_subset (cairo_cff_font_t *font) +{ + cairo_int_status_t status; + unsigned int i; + + if (font->scaled_font_subset->is_latin) { + for (i = 0; i < ARRAY_LENGTH (font_write_type1_funcs); i++) { + status = font_write_type1_funcs[i] (font); + if (unlikely (status)) + return status; + } + } else { + for (i = 0; i < ARRAY_LENGTH (font_write_cid_funcs); i++) { + status = font_write_cid_funcs[i] (font); + if (unlikely (status)) + return status; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_cff_font_generate (cairo_cff_font_t *font, + const char **data, + unsigned long *length) +{ + cairo_int_status_t status; + + status = cairo_cff_font_read_font (font); + if (unlikely (status)) + return status; + + /* If the PS name is not found, create a CairoFont-x-y name. */ + if (font->ps_name == NULL) { + font->ps_name = malloc (30); + if (unlikely (font->ps_name == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + snprintf(font->ps_name, 30, "CairoFont-%u-%u", + font->scaled_font_subset->font_id, + font->scaled_font_subset->subset_id); + } + + status = cairo_cff_font_subset_font (font); + if (unlikely (status)) + return status; + + status = cairo_cff_font_write_subset (font); + if (unlikely (status)) + return status; + + + *data = _cairo_array_index (&font->output, 0); + *length = _cairo_array_num_elements (&font->output); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_cff_font_create_set_widths (cairo_cff_font_t *font) +{ + unsigned long size; + unsigned long long_entry_size; + unsigned long short_entry_size; + unsigned int i; + tt_hhea_t hhea; + int num_hmetrics; + uint16_t short_entry; + int glyph_index; + cairo_int_status_t status; + + size = sizeof (tt_hhea_t); + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hhea, 0, + (unsigned char*) &hhea, &size); + if (unlikely (status)) + return status; + num_hmetrics = be16_to_cpu (hhea.num_hmetrics); + + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + glyph_index = font->scaled_font_subset->glyphs[i]; + long_entry_size = 2 * sizeof (int16_t); + short_entry_size = sizeof (int16_t); + if (glyph_index < num_hmetrics) { + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hmtx, + glyph_index * long_entry_size, + (unsigned char *) &short_entry, + &short_entry_size); + if (unlikely (status)) + return status; + } + else + { + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hmtx, + (num_hmetrics - 1) * long_entry_size, + (unsigned char *) &short_entry, + &short_entry_size); + if (unlikely (status)) + return status; + } + font->widths[i] = be16_to_cpu (short_entry); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +check_fontdata_is_cff (const unsigned char *data, long length) +{ + cff_header_t *header; + + if (length < (long)sizeof (cff_header_t)) + return FALSE; + + header = (cff_header_t *) data; + if (header->major == 1 && + header->minor == 0 && + header->header_size == 4) + { + return TRUE; + } + + return FALSE; +} + +static cairo_int_status_t +_cairo_cff_font_load_opentype_cff (cairo_cff_font_t *font) +{ + const cairo_scaled_font_backend_t *backend = font->backend; + cairo_status_t status; + tt_head_t head; + tt_hhea_t hhea; + unsigned long size, data_length; + + if (!backend->load_truetype_table) + return CAIRO_INT_STATUS_UNSUPPORTED; + + data_length = 0; + status = backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_CFF, 0, NULL, &data_length); + if (status) + return status; + + size = sizeof (tt_head_t); + status = backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_head, 0, + (unsigned char *) &head, &size); + if (unlikely (status)) + return status; + + size = sizeof (tt_hhea_t); + status = backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hhea, 0, + (unsigned char *) &hhea, &size); + if (unlikely (status)) + return status; + + size = 0; + status = backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hmtx, 0, NULL, &size); + if (unlikely (status)) + return status; + + font->x_min = (int16_t) be16_to_cpu (head.x_min); + font->y_min = (int16_t) be16_to_cpu (head.y_min); + font->x_max = (int16_t) be16_to_cpu (head.x_max); + font->y_max = (int16_t) be16_to_cpu (head.y_max); + font->ascent = (int16_t) be16_to_cpu (hhea.ascender); + font->descent = (int16_t) be16_to_cpu (hhea.descender); + font->units_per_em = (int16_t) be16_to_cpu (head.units_per_em); + if (font->units_per_em == 0) + font->units_per_em = 1000; + + font->font_name = NULL; + status = _cairo_truetype_read_font_name (font->scaled_font_subset->scaled_font, + &font->ps_name, + &font->font_name); + if (_cairo_status_is_error (status)) + return status; + + font->is_opentype = TRUE; + font->data_length = data_length; + font->data = malloc (data_length); + if (unlikely (font->data == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_CFF, 0, font->data, + &font->data_length); + if (unlikely (status)) + return status; + + if (!check_fontdata_is_cff (font->data, data_length)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_cff_font_load_cff (cairo_cff_font_t *font) +{ + const cairo_scaled_font_backend_t *backend = font->backend; + cairo_status_t status; + unsigned long data_length; + + if (!backend->load_type1_data) + return CAIRO_INT_STATUS_UNSUPPORTED; + + data_length = 0; + status = backend->load_type1_data (font->scaled_font_subset->scaled_font, + 0, NULL, &data_length); + if (unlikely (status)) + return status; + + font->font_name = NULL; + font->is_opentype = FALSE; + font->data_length = data_length; + font->data = malloc (data_length); + if (unlikely (font->data == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = font->backend->load_type1_data (font->scaled_font_subset->scaled_font, + 0, font->data, &font->data_length); + if (unlikely (status)) + return status; + + if (!check_fontdata_is_cff (font->data, data_length)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_cff_font_create (cairo_scaled_font_subset_t *scaled_font_subset, + cairo_cff_font_t **font_return, + const char *subset_name) +{ + const cairo_scaled_font_backend_t *backend; + cairo_int_status_t status; + cairo_cff_font_t *font; + + backend = scaled_font_subset->scaled_font->backend; + + /* We need to use a fallback font generated from the synthesized outlines. */ + if (backend->is_synthetic && backend->is_synthetic (scaled_font_subset->scaled_font)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + font = calloc (1, sizeof (cairo_cff_font_t)); + if (unlikely (font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->backend = backend; + font->scaled_font_subset = scaled_font_subset; + + status = _cairo_cff_font_load_opentype_cff (font); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + status = _cairo_cff_font_load_cff (font); + if (status) + goto fail1; + + font->data_end = font->data + font->data_length; + _cairo_array_init (&font->output, sizeof (char)); + status = _cairo_array_grow_by (&font->output, 4096); + if (unlikely (status)) + goto fail2; + + font->subset_font_name = strdup (subset_name); + if (unlikely (font->subset_font_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + + font->widths = calloc (font->scaled_font_subset->num_glyphs, sizeof (int)); + if (unlikely (font->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + + if (font->is_opentype) { + status = cairo_cff_font_create_set_widths (font); + if (unlikely (status)) + goto fail4; + } + + status = cff_dict_init (&font->top_dict); + if (unlikely (status)) + goto fail4; + + status = cff_dict_init (&font->private_dict); + if (unlikely (status)) + goto fail5; + + cff_index_init (&font->strings_index); + cff_index_init (&font->charstrings_index); + cff_index_init (&font->global_sub_index); + cff_index_init (&font->local_sub_index); + cff_index_init (&font->charstrings_subset_index); + cff_index_init (&font->strings_subset_index); + font->euro_sid = 0; + font->fdselect = NULL; + font->fd_dict = NULL; + font->fd_private_dict = NULL; + font->fd_local_sub_index = NULL; + font->fd_local_sub_bias = NULL; + font->fdselect_subset = NULL; + font->fd_subset_map = NULL; + font->private_dict_offset = NULL; + font->global_subs_used = NULL; + font->local_subs_used = NULL; + font->fd_local_subs_used = NULL; + + *font_return = font; + + return CAIRO_STATUS_SUCCESS; + +fail5: + _cairo_hash_table_destroy (font->top_dict); +fail4: + free (font->widths); +fail3: + free (font->subset_font_name); +fail2: + free (font->ps_name); + _cairo_array_fini (&font->output); +fail1: + free (font->data); + free (font->font_name); + free (font); + + return status; +} + +static void +cairo_cff_font_destroy (cairo_cff_font_t *font) +{ + unsigned int i; + + free (font->widths); + free (font->font_name); + free (font->ps_name); + free (font->subset_font_name); + _cairo_array_fini (&font->output); + cff_dict_fini (font->top_dict); + cff_dict_fini (font->private_dict); + cff_index_fini (&font->strings_index); + cff_index_fini (&font->charstrings_index); + cff_index_fini (&font->global_sub_index); + cff_index_fini (&font->local_sub_index); + cff_index_fini (&font->charstrings_subset_index); + cff_index_fini (&font->strings_subset_index); + + /* If we bailed out early as a result of an error some of the + * following cairo_cff_font_t members may still be NULL */ + if (font->fd_dict) { + for (i = 0; i < font->num_fontdicts; i++) { + if (font->fd_dict[i]) + cff_dict_fini (font->fd_dict[i]); + } + free (font->fd_dict); + } + free (font->global_subs_used); + free (font->local_subs_used); + free (font->fd_subset_map); + free (font->private_dict_offset); + + if (font->is_cid) { + free (font->fdselect); + free (font->fdselect_subset); + if (font->fd_private_dict) { + for (i = 0; i < font->num_fontdicts; i++) { + if (font->fd_private_dict[i]) + cff_dict_fini (font->fd_private_dict[i]); + } + free (font->fd_private_dict); + } + if (font->fd_local_sub_index) { + for (i = 0; i < font->num_fontdicts; i++) + cff_index_fini (&font->fd_local_sub_index[i]); + free (font->fd_local_sub_index); + } + free (font->fd_local_sub_bias); + if (font->fd_local_subs_used) { + for (i = 0; i < font->num_fontdicts; i++) { + free (font->fd_local_subs_used[i]); + } + free (font->fd_local_subs_used); + } + free (font->fd_default_width); + free (font->fd_nominal_width); + } + + free (font->data); + + free (font); +} + +cairo_status_t +_cairo_cff_subset_init (cairo_cff_subset_t *cff_subset, + const char *subset_name, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_cff_font_t *font = NULL; /* squelch bogus compiler warning */ + cairo_status_t status; + const char *data = NULL; /* squelch bogus compiler warning */ + unsigned long length = 0; /* squelch bogus compiler warning */ + unsigned int i; + + status = _cairo_cff_font_create (font_subset, &font, subset_name); + if (unlikely (status)) + return status; + + status = cairo_cff_font_generate (font, &data, &length); + if (unlikely (status)) + goto fail1; + + cff_subset->ps_name = strdup (font->ps_name); + if (unlikely (cff_subset->ps_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + if (font->font_name) { + cff_subset->family_name_utf8 = strdup (font->font_name); + if (cff_subset->family_name_utf8 == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + } else { + cff_subset->family_name_utf8 = NULL; + } + + cff_subset->widths = calloc (sizeof (double), font->scaled_font_subset->num_glyphs); + if (unlikely (cff_subset->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) + cff_subset->widths[i] = (double)font->widths[i]/font->units_per_em; + + cff_subset->x_min = (double)font->x_min/font->units_per_em; + cff_subset->y_min = (double)font->y_min/font->units_per_em; + cff_subset->x_max = (double)font->x_max/font->units_per_em; + cff_subset->y_max = (double)font->y_max/font->units_per_em; + cff_subset->ascent = (double)font->ascent/font->units_per_em; + cff_subset->descent = (double)font->descent/font->units_per_em; + + cff_subset->data = malloc (length); + if (unlikely (cff_subset->data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail4; + } + + memcpy (cff_subset->data, data, length); + cff_subset->data_length = length; + + cairo_cff_font_destroy (font); + + return CAIRO_STATUS_SUCCESS; + + fail4: + free (cff_subset->widths); + fail3: + free (cff_subset->family_name_utf8); + fail2: + free (cff_subset->ps_name); + fail1: + cairo_cff_font_destroy (font); + + return status; +} + +void +_cairo_cff_subset_fini (cairo_cff_subset_t *subset) +{ + free (subset->ps_name); + free (subset->family_name_utf8); + free (subset->widths); + free (subset->data); +} + +cairo_bool_t +_cairo_cff_scaled_font_is_cid_cff (cairo_scaled_font_t *scaled_font) +{ + const cairo_scaled_font_backend_t *backend; + cairo_int_status_t status; + unsigned char *data; + unsigned long data_length; + unsigned char *current_ptr; + unsigned char *data_end; + cff_header_t *header; + cff_index_element_t *element; + cairo_hash_table_t *top_dict; + cairo_array_t index; + int size; + cairo_bool_t is_cid = FALSE; + + backend = scaled_font->backend; + data = NULL; + data_length = 0; + status = CAIRO_INT_STATUS_UNSUPPORTED; + /* Try to load an OpenType/CFF font */ + if (backend->load_truetype_table && + (status = backend->load_truetype_table (scaled_font, TT_TAG_CFF, + 0, NULL, &data_length)) == CAIRO_INT_STATUS_SUCCESS) + { + data = malloc (data_length); + if (unlikely (data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + status = backend->load_truetype_table (scaled_font, TT_TAG_CFF, + 0, data, &data_length); + if (unlikely (status)) + goto fail1; + } + /* Try to load a CFF font */ + if (status == CAIRO_INT_STATUS_UNSUPPORTED && + backend->load_type1_data && + (status = backend->load_type1_data (scaled_font, + 0, NULL, &data_length)) == CAIRO_INT_STATUS_SUCCESS) + { + data = malloc (data_length); + if (unlikely (data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + status = backend->load_type1_data (scaled_font, 0, data, &data_length); + if (unlikely (status)) + goto fail1; + } + if (status) + goto fail1; + + /* Check if it looks like a CFF font */ + if (!check_fontdata_is_cff (data, data_length)) + goto fail1; + + data_end = data + data_length; + + /* skip header */ + if (data_length < sizeof (cff_header_t)) + goto fail1; + + header = (cff_header_t *) data; + current_ptr = data + header->header_size; + + /* skip name */ + cff_index_init (&index); + status = cff_index_read (&index, ¤t_ptr, data_end); + cff_index_fini (&index); + + if (status) + goto fail1; + + /* read top dict */ + cff_index_init (&index); + status = cff_index_read (&index, ¤t_ptr, data_end); + if (unlikely (status)) + goto fail2; + + status = cff_dict_init (&top_dict); + if (unlikely (status)) + goto fail2; + + element = _cairo_array_index (&index, 0); + status = cff_dict_read (top_dict, element->data, element->length); + if (unlikely (status)) + goto fail3; + + /* check for ROS operator indicating a CID font */ + if (cff_dict_get_operands (top_dict, ROS_OP, &size) != NULL) + is_cid = TRUE; + +fail3: + cff_dict_fini (top_dict); + +fail2: + cff_index_fini (&index); + +fail1: + free (data); + + return is_cid; +} + +static cairo_int_status_t +_cairo_cff_font_fallback_create (cairo_scaled_font_subset_t *scaled_font_subset, + cairo_cff_font_t **font_return, + const char *subset_name) +{ + cairo_status_t status; + cairo_cff_font_t *font; + + font = malloc (sizeof (cairo_cff_font_t)); + if (unlikely (font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->backend = NULL; + font->scaled_font_subset = scaled_font_subset; + + _cairo_array_init (&font->output, sizeof (char)); + status = _cairo_array_grow_by (&font->output, 4096); + if (unlikely (status)) + goto fail1; + + font->subset_font_name = strdup (subset_name); + if (unlikely (font->subset_font_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + font->ps_name = strdup (subset_name); + if (unlikely (font->ps_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + font->font_name = NULL; + + font->x_min = 0; + font->y_min = 0; + font->x_max = 0; + font->y_max = 0; + font->ascent = 0; + font->descent = 0; + + font->widths = calloc (font->scaled_font_subset->num_glyphs, sizeof (int)); + if (unlikely (font->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + + font->data_length = 0; + font->data = NULL; + font->data_end = NULL; + + status = cff_dict_init (&font->top_dict); + if (unlikely (status)) + goto fail4; + + status = cff_dict_init (&font->private_dict); + if (unlikely (status)) + goto fail5; + + cff_index_init (&font->strings_index); + cff_index_init (&font->charstrings_index); + cff_index_init (&font->global_sub_index); + cff_index_init (&font->local_sub_index); + cff_index_init (&font->charstrings_subset_index); + cff_index_init (&font->strings_subset_index); + font->global_subs_used = NULL; + font->local_subs_used = NULL; + font->subset_subroutines = FALSE; + font->fdselect = NULL; + font->fd_dict = NULL; + font->fd_private_dict = NULL; + font->fd_local_sub_index = NULL; + font->fdselect_subset = NULL; + font->fd_subset_map = NULL; + font->private_dict_offset = NULL; + + *font_return = font; + + return CAIRO_STATUS_SUCCESS; + +fail5: + _cairo_hash_table_destroy (font->top_dict); +fail4: + free (font->widths); +fail3: + free (font->font_name); + free (font->ps_name); +fail2: + free (font->subset_font_name); +fail1: + _cairo_array_fini (&font->output); + free (font); + return status; +} + +static cairo_int_status_t +cairo_cff_font_fallback_generate (cairo_cff_font_t *font, + cairo_type2_charstrings_t *type2_subset, + const char **data, + unsigned long *length) +{ + cairo_int_status_t status; + cff_header_t header; + cairo_array_t *charstring; + unsigned char buf[40]; + unsigned char *end_buf, *end_buf2; + unsigned int i; + int sid; + + /* Create header */ + header.major = 1; + header.minor = 0; + header.header_size = 4; + header.offset_size = 4; + font->header = &header; + + /* Create Top Dict */ + font->is_cid = FALSE; + + snprintf((char*)buf, sizeof(buf), "CairoFont-%u-%u", + font->scaled_font_subset->font_id, + font->scaled_font_subset->subset_id); + sid = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); + status = cff_index_append_copy (&font->strings_subset_index, + (unsigned char *)buf, + strlen((char*)buf)); + if (unlikely (status)) + return status; + + end_buf = encode_integer (buf, sid); + status = cff_dict_set_operands (font->top_dict, FULLNAME_OP, + buf, end_buf - buf); + if (unlikely (status)) + return status; + + status = cff_dict_set_operands (font->top_dict, FAMILYNAME_OP, + buf, end_buf - buf); + if (unlikely (status)) + return status; + + end_buf = encode_integer (buf, type2_subset->x_min); + end_buf = encode_integer (end_buf, type2_subset->y_min); + end_buf = encode_integer (end_buf, type2_subset->x_max); + end_buf = encode_integer (end_buf, type2_subset->y_max); + status = cff_dict_set_operands (font->top_dict, + FONTBBOX_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + + end_buf = encode_integer_max (buf, 0); + status = cff_dict_set_operands (font->top_dict, + CHARSTRINGS_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + + + if (font->scaled_font_subset->is_latin) { + status = cff_dict_set_operands (font->top_dict, + ENCODING_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + + /* Private has two operands - size and offset */ + end_buf2 = encode_integer_max (end_buf, 0); + cff_dict_set_operands (font->top_dict, PRIVATE_OP, buf, end_buf2 - buf); + if (unlikely (status)) + return status; + + } else { + status = cff_dict_set_operands (font->top_dict, + FDSELECT_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + + status = cff_dict_set_operands (font->top_dict, + FDARRAY_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + } + + status = cff_dict_set_operands (font->top_dict, + CHARSET_OP, buf, end_buf - buf); + if (unlikely (status)) + return status; + + if (!font->scaled_font_subset->is_latin) { + status = cairo_cff_font_set_ros_strings (font); + if (unlikely (status)) + return status; + + /* Create CID FD dictionary */ + status = cairo_cff_font_create_cid_fontdict (font); + if (unlikely (status)) + return status; + } else { + font->private_dict_offset = malloc (sizeof (int)); + if (unlikely (font->private_dict_offset == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* Create charstrings */ + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + charstring = _cairo_array_index(&type2_subset->charstrings, i); + + status = cff_index_append (&font->charstrings_subset_index, + _cairo_array_index (charstring, 0), + _cairo_array_num_elements (charstring)); + + if (unlikely (status)) + return status; + } + + if (font->scaled_font_subset->is_latin) + status = cairo_cff_font_add_euro_charset_string (font); + + status = cairo_cff_font_write_subset (font); + if (unlikely (status)) + return status; + + *data = _cairo_array_index (&font->output, 0); + *length = _cairo_array_num_elements (&font->output); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_cff_fallback_init (cairo_cff_subset_t *cff_subset, + const char *subset_name, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_cff_font_t *font = NULL; /* squelch bogus compiler warning */ + cairo_status_t status; + const char *data = NULL; /* squelch bogus compiler warning */ + unsigned long length = 0; /* squelch bogus compiler warning */ + unsigned int i; + cairo_type2_charstrings_t type2_subset; + + status = _cairo_cff_font_fallback_create (font_subset, &font, subset_name); + if (unlikely (status)) + return status; + + status = _cairo_type2_charstrings_init (&type2_subset, font_subset); + if (unlikely (status)) + goto fail1; + + status = cairo_cff_font_fallback_generate (font, &type2_subset, &data, &length); + if (unlikely (status)) + goto fail2; + + cff_subset->family_name_utf8 = NULL; + cff_subset->ps_name = strdup (font->ps_name); + if (unlikely (cff_subset->ps_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + + cff_subset->widths = calloc (sizeof (double), font->scaled_font_subset->num_glyphs); + if (unlikely (cff_subset->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) + cff_subset->widths[i] = (double)type2_subset.widths[i]/1000; + + cff_subset->x_min = (double)type2_subset.x_min/1000; + cff_subset->y_min = (double)type2_subset.y_min/1000; + cff_subset->x_max = (double)type2_subset.x_max/1000; + cff_subset->y_max = (double)type2_subset.y_max/1000; + cff_subset->ascent = (double)type2_subset.y_max/1000; + cff_subset->descent = (double)type2_subset.y_min/1000; + + cff_subset->data = malloc (length); + if (unlikely (cff_subset->data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail4; + } + + memcpy (cff_subset->data, data, length); + cff_subset->data_length = length; + + _cairo_type2_charstrings_fini (&type2_subset); + cairo_cff_font_destroy (font); + + return CAIRO_STATUS_SUCCESS; + + fail4: + free (cff_subset->widths); + fail3: + free (cff_subset->ps_name); + fail2: + _cairo_type2_charstrings_fini (&type2_subset); + fail1: + cairo_cff_font_destroy (font); + + return status; +} + +void +_cairo_cff_fallback_fini (cairo_cff_subset_t *subset) +{ + free (subset->ps_name); + free (subset->widths); + free (subset->data); +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-clip-boxes.c b/src/cairo-clip-boxes.c new file mode 100644 index 000000000..7bcbeb191 --- /dev/null +++ b/src/cairo-clip-boxes.c @@ -0,0 +1,599 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-gstate-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-pattern-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-region-private.h" + +static inline int +pot (int v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + +static cairo_bool_t +_cairo_clip_contains_rectangle_box (const cairo_clip_t *clip, + const cairo_rectangle_int_t *rect, + const cairo_box_t *box) +{ + int i; + + /* clip == NULL means no clip, so the clip contains everything */ + if (clip == NULL) + return TRUE; + + if (_cairo_clip_is_all_clipped (clip)) + return FALSE; + + /* If we have a non-trivial path, just say no */ + if (clip->path) + return FALSE; + + if (! _cairo_rectangle_contains_rectangle (&clip->extents, rect)) + return FALSE; + + if (clip->num_boxes == 0) + return TRUE; + + /* Check for a clip-box that wholly contains the rectangle */ + for (i = 0; i < clip->num_boxes; i++) { + if (box->p1.x >= clip->boxes[i].p1.x && + box->p1.y >= clip->boxes[i].p1.y && + box->p2.x <= clip->boxes[i].p2.x && + box->p2.y <= clip->boxes[i].p2.y) + { + return TRUE; + } + } + + return FALSE; +} + +cairo_bool_t +_cairo_clip_contains_box (const cairo_clip_t *clip, + const cairo_box_t *box) +{ + cairo_rectangle_int_t rect; + + _cairo_box_round_to_rectangle (box, &rect); + return _cairo_clip_contains_rectangle_box(clip, &rect, box); +} + +cairo_bool_t +_cairo_clip_contains_rectangle (const cairo_clip_t *clip, + const cairo_rectangle_int_t *rect) +{ + cairo_box_t box; + + box.p1.x = _cairo_fixed_from_int (rect->x); + box.p1.y = _cairo_fixed_from_int (rect->y); + box.p2.x = _cairo_fixed_from_int (rect->x + rect->width); + box.p2.y = _cairo_fixed_from_int (rect->y + rect->height); + + return _cairo_clip_contains_rectangle_box (clip, rect, &box); +} + +cairo_clip_t * +_cairo_clip_intersect_rectilinear_path (cairo_clip_t *clip, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias) +{ + cairo_status_t status; + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_STATUS_SUCCESS && boxes.num_boxes)) + clip = _cairo_clip_intersect_boxes (clip, &boxes); + else + clip = _cairo_clip_set_all_clipped (clip); + _cairo_boxes_fini (&boxes); + + return clip; +} + +static cairo_clip_t * +_cairo_clip_intersect_rectangle_box (cairo_clip_t *clip, + const cairo_rectangle_int_t *r, + const cairo_box_t *box) +{ + cairo_box_t extents_box; + cairo_bool_t changed = FALSE; + int i, j; + + if (clip == NULL) { + clip = _cairo_clip_create (); + if (clip == NULL) + return _cairo_clip_set_all_clipped (clip); + } + + if (clip->num_boxes == 0) { + clip->boxes = &clip->embedded_box; + clip->boxes[0] = *box; + clip->num_boxes = 1; + if (clip->path == NULL) { + clip->extents = *r; + } else { + if (! _cairo_rectangle_intersect (&clip->extents, r)) + return _cairo_clip_set_all_clipped (clip); + } + if (clip->path == NULL) + clip->is_region = _cairo_box_is_pixel_aligned (box); + return clip; + } + + /* Does the new box wholly subsume the clip? Perform a cheap check + * for the common condition of a single clip rectangle. + */ + if (clip->num_boxes == 1 && + clip->boxes[0].p1.x >= box->p1.x && + clip->boxes[0].p1.y >= box->p1.y && + clip->boxes[0].p2.x <= box->p2.x && + clip->boxes[0].p2.y <= box->p2.y) + { + return clip; + } + + for (i = j = 0; i < clip->num_boxes; i++) { + cairo_box_t *b = &clip->boxes[j]; + + if (j != i) + *b = clip->boxes[i]; + + if (box->p1.x > b->p1.x) + b->p1.x = box->p1.x, changed = TRUE; + if (box->p2.x < b->p2.x) + b->p2.x = box->p2.x, changed = TRUE; + + if (box->p1.y > b->p1.y) + b->p1.y = box->p1.y, changed = TRUE; + if (box->p2.y < b->p2.y) + b->p2.y = box->p2.y, changed = TRUE; + + j += b->p2.x > b->p1.x && b->p2.y > b->p1.y; + } + clip->num_boxes = j; + + if (clip->num_boxes == 0) + return _cairo_clip_set_all_clipped (clip); + + if (! changed) + return clip; + + extents_box = clip->boxes[0]; + for (i = 1; i < clip->num_boxes; i++) { + if (clip->boxes[i].p1.x < extents_box.p1.x) + extents_box.p1.x = clip->boxes[i].p1.x; + + if (clip->boxes[i].p1.y < extents_box.p1.y) + extents_box.p1.y = clip->boxes[i].p1.y; + + if (clip->boxes[i].p2.x > extents_box.p2.x) + extents_box.p2.x = clip->boxes[i].p2.x; + + if (clip->boxes[i].p2.y > extents_box.p2.y) + extents_box.p2.y = clip->boxes[i].p2.y; + } + + if (clip->path == NULL) { + _cairo_box_round_to_rectangle (&extents_box, &clip->extents); + } else { + cairo_rectangle_int_t extents_rect; + + _cairo_box_round_to_rectangle (&extents_box, &extents_rect); + if (! _cairo_rectangle_intersect (&clip->extents, &extents_rect)) + return _cairo_clip_set_all_clipped (clip); + } + + if (clip->region) { + cairo_region_destroy (clip->region); + clip->region = NULL; + } + + clip->is_region = FALSE; + return clip; +} + +cairo_clip_t * +_cairo_clip_intersect_box (cairo_clip_t *clip, + const cairo_box_t *box) +{ + cairo_rectangle_int_t r; + + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + _cairo_box_round_to_rectangle (box, &r); + if (r.width == 0 || r.height == 0) + return _cairo_clip_set_all_clipped (clip); + + return _cairo_clip_intersect_rectangle_box (clip, &r, box); +} + +cairo_clip_t * +_cairo_clip_intersect_boxes (cairo_clip_t *clip, + const cairo_boxes_t *boxes) +{ + cairo_boxes_t clip_boxes; + cairo_box_t limits; + cairo_rectangle_int_t extents; + + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + if (boxes->num_boxes == 0) + return _cairo_clip_set_all_clipped (clip); + + if (boxes->num_boxes == 1) + return _cairo_clip_intersect_box (clip, boxes->chunks.base); + + if (clip == NULL) + clip = _cairo_clip_create (); + + if (clip->num_boxes) { + _cairo_boxes_init_for_array (&clip_boxes, clip->boxes, clip->num_boxes); + if (unlikely (_cairo_boxes_intersect (&clip_boxes, boxes, &clip_boxes))) { + clip = _cairo_clip_set_all_clipped (clip); + goto out; + } + + if (clip->boxes != &clip->embedded_box) + free (clip->boxes); + + clip->boxes = NULL; + boxes = &clip_boxes; + } + + if (boxes->num_boxes == 0) { + clip = _cairo_clip_set_all_clipped (clip); + goto out; + } else if (boxes->num_boxes == 1) { + clip->boxes = &clip->embedded_box; + clip->boxes[0] = boxes->chunks.base[0]; + clip->num_boxes = 1; + } else { + clip->boxes = _cairo_boxes_to_array (boxes, &clip->num_boxes, TRUE); + } + _cairo_boxes_extents (boxes, &limits); + + _cairo_box_round_to_rectangle (&limits, &extents); + if (clip->path == NULL) { + clip->extents = extents; + } else if (! _cairo_rectangle_intersect (&clip->extents, &extents)) { + clip = _cairo_clip_set_all_clipped (clip); + goto out; + } + + if (clip->region) { + cairo_region_destroy (clip->region); + clip->region = NULL; + } + clip->is_region = FALSE; + +out: + if (boxes == &clip_boxes) + _cairo_boxes_fini (&clip_boxes); + + return clip; +} + +cairo_clip_t * +_cairo_clip_intersect_rectangle (cairo_clip_t *clip, + const cairo_rectangle_int_t *r) +{ + cairo_box_t box; + + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + if (r->width == 0 || r->height == 0) + return _cairo_clip_set_all_clipped (clip); + + box.p1.x = _cairo_fixed_from_int (r->x); + box.p1.y = _cairo_fixed_from_int (r->y); + box.p2.x = _cairo_fixed_from_int (r->x + r->width); + box.p2.y = _cairo_fixed_from_int (r->y + r->height); + + return _cairo_clip_intersect_rectangle_box (clip, r, &box); +} + +struct reduce { + cairo_clip_t *clip; + cairo_box_t limit; + cairo_box_t extents; + cairo_bool_t inside; + + cairo_point_t current_point; + cairo_point_t last_move_to; +}; + +static void +_add_clipped_edge (struct reduce *r, + const cairo_point_t *p1, + const cairo_point_t *p2, + int y1, int y2) +{ + cairo_fixed_t x; + + x = _cairo_edge_compute_intersection_x_for_y (p1, p2, y1); + if (x < r->extents.p1.x) + r->extents.p1.x = x; + + x = _cairo_edge_compute_intersection_x_for_y (p1, p2, y2); + if (x > r->extents.p2.x) + r->extents.p2.x = x; + + if (y1 < r->extents.p1.y) + r->extents.p1.y = y1; + + if (y2 > r->extents.p2.y) + r->extents.p2.y = y2; + + r->inside = TRUE; +} + +static void +_add_edge (struct reduce *r, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + int top, bottom; + int top_y, bot_y; + int n; + + if (p1->y < p2->y) { + top = p1->y; + bottom = p2->y; + } else { + top = p2->y; + bottom = p1->y; + } + + if (bottom < r->limit.p1.y || top > r->limit.p2.y) + return; + + if (p1->x > p2->x) { + const cairo_point_t *t = p1; + p1 = p2; + p2 = t; + } + + if (p2->x <= r->limit.p1.x || p1->x >= r->limit.p2.x) + return; + + for (n = 0; n < r->clip->num_boxes; n++) { + const cairo_box_t *limits = &r->clip->boxes[n]; + + if (bottom < limits->p1.y || top > limits->p2.y) + continue; + + if (p2->x <= limits->p1.x || p1->x >= limits->p2.x) + continue; + + if (p1->x >= limits->p1.x && p2->x <= limits->p1.x) { + top_y = top; + bot_y = bottom; + } else { + int p1_y, p2_y; + + p1_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, + limits->p1.x); + p2_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, + limits->p2.x); + if (p1_y < p2_y) { + top_y = p1_y; + bot_y = p2_y; + } else { + top_y = p2_y; + bot_y = p1_y; + } + + if (top_y < top) + top_y = top; + if (bot_y > bottom) + bot_y = bottom; + } + + if (top_y < limits->p1.y) + top_y = limits->p1.y; + + if (bot_y > limits->p2.y) + bot_y = limits->p2.y; + if (bot_y > top_y) + _add_clipped_edge (r, p1, p2, top_y, bot_y); + } +} + +static cairo_status_t +_reduce_line_to (void *closure, + const cairo_point_t *point) +{ + struct reduce *r = closure; + + _add_edge (r, &r->current_point, point); + r->current_point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_reduce_close (void *closure) +{ + struct reduce *r = closure; + + return _reduce_line_to (r, &r->last_move_to); +} + +static cairo_status_t +_reduce_move_to (void *closure, + const cairo_point_t *point) +{ + struct reduce *r = closure; + cairo_status_t status; + + /* close current subpath */ + status = _reduce_close (closure); + + /* make sure that the closure represents a degenerate path */ + r->current_point = *point; + r->last_move_to = *point; + + return status; +} + +static cairo_clip_t * +_cairo_clip_reduce_to_boxes (cairo_clip_t *clip) +{ + struct reduce r; + cairo_clip_path_t *clip_path; + cairo_status_t status; + + return clip; + if (clip->path == NULL) + return clip; + + r.clip = clip; + r.extents.p1.x = r.extents.p1.y = INT_MAX; + r.extents.p2.x = r.extents.p2.y = INT_MIN; + r.inside = FALSE; + + r.limit.p1.x = _cairo_fixed_from_int (clip->extents.x); + r.limit.p1.y = _cairo_fixed_from_int (clip->extents.y); + r.limit.p2.x = _cairo_fixed_from_int (clip->extents.x + clip->extents.width); + r.limit.p2.y = _cairo_fixed_from_int (clip->extents.y + clip->extents.height); + + clip_path = clip->path; + do { + r.current_point.x = 0; + r.current_point.y = 0; + r.last_move_to = r.current_point; + + status = _cairo_path_fixed_interpret_flat (&clip_path->path, + _reduce_move_to, + _reduce_line_to, + _reduce_close, + &r, + clip_path->tolerance); + assert (status == CAIRO_STATUS_SUCCESS); + _reduce_close (&r); + } while ((clip_path = clip_path->prev)); + + if (! r.inside) { + _cairo_clip_path_destroy (clip->path); + clip->path = NULL; + } + + return _cairo_clip_intersect_box (clip, &r.extents); +} + +cairo_clip_t * +_cairo_clip_reduce_to_rectangle (const cairo_clip_t *clip, + const cairo_rectangle_int_t *r) +{ + cairo_clip_t *copy; + + if (_cairo_clip_is_all_clipped (clip)) + return (cairo_clip_t *) clip; + + if (_cairo_clip_contains_rectangle (clip, r)) + return _cairo_clip_intersect_rectangle (NULL, r); + + copy = _cairo_clip_copy_intersect_rectangle (clip, r); + if (_cairo_clip_is_all_clipped (copy)) + return copy; + + return _cairo_clip_reduce_to_boxes (copy); +} + +cairo_clip_t * +_cairo_clip_reduce_for_composite (const cairo_clip_t *clip, + cairo_composite_rectangles_t *extents) +{ + const cairo_rectangle_int_t *r; + + r = extents->is_bounded ? &extents->bounded : &extents->unbounded; + return _cairo_clip_reduce_to_rectangle (clip, r); +} + +cairo_clip_t * +_cairo_clip_from_boxes (const cairo_boxes_t *boxes) +{ + cairo_box_t extents; + cairo_clip_t *clip = _cairo_clip_create (); + if (clip == NULL) + return _cairo_clip_set_all_clipped (clip); + + /* XXX cow-boxes? */ + if(boxes->num_boxes == 1) { + clip->boxes = &clip->embedded_box; + clip->boxes[0] = boxes->chunks.base[0]; + clip->num_boxes = 1; + } else { + clip->boxes = _cairo_boxes_to_array (boxes, &clip->num_boxes, TRUE); + if (clip->boxes == NULL) + return _cairo_clip_set_all_clipped (clip); + } + + _cairo_boxes_extents (boxes, &extents); + _cairo_box_round_to_rectangle (&extents, &clip->extents); + + return clip; +} diff --git a/src/cairo-clip-inline.h b/src/cairo-clip-inline.h new file mode 100644 index 000000000..a9f232692 --- /dev/null +++ b/src/cairo-clip-inline.h @@ -0,0 +1,83 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Chris Wilson + */ + +#ifndef CAIRO_CLIP_INLINE_H +#define CAIRO_CLIP_INLINE_H + +#include "cairo-clip-private.h" + +static inline cairo_bool_t _cairo_clip_is_all_clipped(const cairo_clip_t *clip) +{ + return clip == &__cairo_clip_all; +} + +static inline cairo_clip_t * +_cairo_clip_set_all_clipped (cairo_clip_t *clip) +{ + _cairo_clip_destroy (clip); + return (cairo_clip_t *) &__cairo_clip_all; +} + +static inline cairo_clip_t * +_cairo_clip_copy_intersect_rectangle (const cairo_clip_t *clip, + const cairo_rectangle_int_t *r) +{ + return _cairo_clip_intersect_rectangle (_cairo_clip_copy (clip), r); +} + +static inline cairo_clip_t * +_cairo_clip_copy_intersect_clip (const cairo_clip_t *clip, + const cairo_clip_t *other) +{ + return _cairo_clip_intersect_clip (_cairo_clip_copy (clip), other); +} + +static inline void +_cairo_clip_steal_boxes (cairo_clip_t *clip, cairo_boxes_t *boxes) +{ + _cairo_boxes_init_for_array (boxes, clip->boxes, clip->num_boxes); + clip->boxes = NULL; + clip->num_boxes = 0; +} + +static inline void +_cairo_clip_unsteal_boxes (cairo_clip_t *clip, cairo_boxes_t *boxes) +{ + clip->boxes = boxes->chunks.base; + clip->num_boxes = boxes->num_boxes; +} + +#endif /* CAIRO_CLIP_INLINE_H */ diff --git a/src/cairo-clip-polygon.c b/src/cairo-clip-polygon.c new file mode 100644 index 000000000..f40faefba --- /dev/null +++ b/src/cairo-clip-polygon.c @@ -0,0 +1,156 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-gstate-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-pattern-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-region-private.h" + +static cairo_bool_t +can_convert_to_polygon (const cairo_clip_t *clip) +{ + cairo_clip_path_t *clip_path = clip->path; + cairo_antialias_t antialias = clip_path->antialias; + + while ((clip_path = clip_path->prev) != NULL) { + if (clip_path->antialias != antialias) + return FALSE; + } + + return TRUE; +} + +cairo_int_status_t +_cairo_clip_get_polygon (const cairo_clip_t *clip, + cairo_polygon_t *polygon, + cairo_fill_rule_t *fill_rule, + cairo_antialias_t *antialias) +{ + cairo_status_t status; + cairo_clip_path_t *clip_path; + + if (_cairo_clip_is_all_clipped (clip)) { + _cairo_polygon_init (polygon, NULL, 0); + return CAIRO_INT_STATUS_SUCCESS; + } + + /* If there is no clip, we need an infinite polygon */ + assert (clip && (clip->path || clip->num_boxes)); + + if (clip->path == NULL) { + *fill_rule = CAIRO_FILL_RULE_WINDING; + *antialias = CAIRO_ANTIALIAS_DEFAULT; + return _cairo_polygon_init_box_array (polygon, + clip->boxes, + clip->num_boxes); + } + + /* check that residual is all of the same type/tolerance */ + if (! can_convert_to_polygon (clip)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (clip->num_boxes < 2) + _cairo_polygon_init_with_clip (polygon, clip); + else + _cairo_polygon_init_with_clip (polygon, NULL); + + clip_path = clip->path; + *fill_rule = clip_path->fill_rule; + *antialias = clip_path->antialias; + + status = _cairo_path_fixed_fill_to_polygon (&clip_path->path, + clip_path->tolerance, + polygon); + if (unlikely (status)) + goto err; + + if (clip->num_boxes > 1) { + status = _cairo_polygon_intersect_with_boxes (polygon, fill_rule, + clip->boxes, clip->num_boxes); + if (unlikely (status)) + goto err; + } + + polygon->limits = NULL; + polygon->num_limits = 0; + + while ((clip_path = clip_path->prev) != NULL) { + cairo_polygon_t next; + + _cairo_polygon_init (&next, NULL, 0); + status = _cairo_path_fixed_fill_to_polygon (&clip_path->path, + clip_path->tolerance, + &next); + if (likely (status == CAIRO_STATUS_SUCCESS)) + status = _cairo_polygon_intersect (polygon, *fill_rule, + &next, clip_path->fill_rule); + _cairo_polygon_fini (&next); + if (unlikely (status)) + goto err; + + *fill_rule = CAIRO_FILL_RULE_WINDING; + } + + return CAIRO_STATUS_SUCCESS; + +err: + _cairo_polygon_fini (polygon); + return status; +} + +cairo_bool_t +_cairo_clip_is_polygon (const cairo_clip_t *clip) +{ + if (_cairo_clip_is_all_clipped (clip)) + return TRUE; + + /* If there is no clip, we need an infinite polygon */ + if (clip == NULL) + return FALSE; + + if (clip->path == NULL) + return TRUE; + + /* check that residual is all of the same type/tolerance */ + return can_convert_to_polygon (clip); +} diff --git a/src/cairo-clip-private.h b/src/cairo-clip-private.h new file mode 100644 index 000000000..5fc05a64e --- /dev/null +++ b/src/cairo-clip-private.h @@ -0,0 +1,198 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Chris Wilson + */ + +#ifndef CAIRO_CLIP_PRIVATE_H +#define CAIRO_CLIP_PRIVATE_H + +#include "cairo-types-private.h" + +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-reference-count-private.h" + +extern const cairo_private cairo_rectangle_list_t _cairo_rectangles_nil; + +struct _cairo_clip_path { + cairo_reference_count_t ref_count; + cairo_path_fixed_t path; + cairo_fill_rule_t fill_rule; + double tolerance; + cairo_antialias_t antialias; + cairo_clip_path_t *prev; +}; + +struct _cairo_clip { + cairo_rectangle_int_t extents; + cairo_clip_path_t *path; + + cairo_box_t *boxes; + int num_boxes; + + cairo_region_t *region; + cairo_bool_t is_region; + + cairo_box_t embedded_box; +}; + +cairo_private cairo_clip_t * +_cairo_clip_create (void); + +cairo_private cairo_clip_path_t * +_cairo_clip_path_reference (cairo_clip_path_t *clip_path); + +cairo_private void +_cairo_clip_path_destroy (cairo_clip_path_t *clip_path); + +cairo_private void +_cairo_clip_destroy (cairo_clip_t *clip); + +cairo_private extern const cairo_clip_t __cairo_clip_all; + +cairo_private cairo_clip_t * +_cairo_clip_copy (const cairo_clip_t *clip); + +cairo_private cairo_clip_t * +_cairo_clip_copy_region (const cairo_clip_t *clip); + +cairo_private cairo_clip_t * +_cairo_clip_copy_path (const cairo_clip_t *clip); + +cairo_private cairo_clip_t * +_cairo_clip_translate (cairo_clip_t *clip, int tx, int ty); + +cairo_private cairo_clip_t * +_cairo_clip_transform (cairo_clip_t *clip, const cairo_matrix_t *m); + +cairo_private cairo_clip_t * +_cairo_clip_copy_with_translation (const cairo_clip_t *clip, int tx, int ty); + +cairo_private cairo_bool_t +_cairo_clip_equal (const cairo_clip_t *clip_a, + const cairo_clip_t *clip_b); + +cairo_private cairo_clip_t * +_cairo_clip_intersect_rectangle (cairo_clip_t *clip, + const cairo_rectangle_int_t *rectangle); + +cairo_private cairo_clip_t * +_cairo_clip_intersect_clip (cairo_clip_t *clip, + const cairo_clip_t *other); + +cairo_private cairo_clip_t * +_cairo_clip_intersect_box (cairo_clip_t *clip, + const cairo_box_t *box); + +cairo_private cairo_clip_t * +_cairo_clip_intersect_boxes (cairo_clip_t *clip, + const cairo_boxes_t *boxes); + +cairo_private cairo_clip_t * +_cairo_clip_intersect_rectilinear_path (cairo_clip_t *clip, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias); + +cairo_private cairo_clip_t * +_cairo_clip_intersect_path (cairo_clip_t *clip, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias); + +cairo_private const cairo_rectangle_int_t * +_cairo_clip_get_extents (const cairo_clip_t *clip); + +cairo_private cairo_surface_t * +_cairo_clip_get_surface (const cairo_clip_t *clip, cairo_surface_t *dst, int *tx, int *ty); + +cairo_private cairo_surface_t * +_cairo_clip_get_image (const cairo_clip_t *clip, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_clip_combine_with_surface (const cairo_clip_t *clip, + cairo_surface_t *dst, + int dst_x, int dst_y); + +cairo_private cairo_clip_t * +_cairo_clip_from_boxes (const cairo_boxes_t *boxes); + +cairo_private cairo_region_t * +_cairo_clip_get_region (const cairo_clip_t *clip); + +cairo_private cairo_bool_t +_cairo_clip_is_region (const cairo_clip_t *clip); + +cairo_private cairo_clip_t * +_cairo_clip_reduce_to_rectangle (const cairo_clip_t *clip, + const cairo_rectangle_int_t *r); + +cairo_private cairo_clip_t * +_cairo_clip_reduce_for_composite (const cairo_clip_t *clip, + cairo_composite_rectangles_t *extents); + +cairo_private cairo_bool_t +_cairo_clip_contains_rectangle (const cairo_clip_t *clip, + const cairo_rectangle_int_t *rect); + +cairo_private cairo_bool_t +_cairo_clip_contains_box (const cairo_clip_t *clip, + const cairo_box_t *box); + +cairo_private cairo_bool_t +_cairo_clip_contains_extents (const cairo_clip_t *clip, + const cairo_composite_rectangles_t *extents); + +cairo_private cairo_rectangle_list_t* +_cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate); + +cairo_private cairo_rectangle_list_t * +_cairo_rectangle_list_create_in_error (cairo_status_t status); + +cairo_private cairo_bool_t +_cairo_clip_is_polygon (const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_clip_get_polygon (const cairo_clip_t *clip, + cairo_polygon_t *polygon, + cairo_fill_rule_t *fill_rule, + cairo_antialias_t *antialias); + +#endif /* CAIRO_CLIP_PRIVATE_H */ diff --git a/src/cairo-clip-region.c b/src/cairo-clip-region.c new file mode 100644 index 000000000..e3f4891e3 --- /dev/null +++ b/src/cairo-clip-region.c @@ -0,0 +1,123 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-gstate-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-pattern-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-region-private.h" + +static void +_cairo_clip_extract_region (cairo_clip_t *clip) +{ + cairo_rectangle_int_t stack_rects[CAIRO_STACK_ARRAY_LENGTH (cairo_rectangle_int_t)]; + cairo_rectangle_int_t *r = stack_rects; + cairo_bool_t is_region; + int i; + + if (clip->num_boxes == 0) + return; + + if (clip->num_boxes > ARRAY_LENGTH (stack_rects)) { + r = _cairo_malloc_ab (clip->num_boxes, sizeof (cairo_rectangle_int_t)); + if (r == NULL){ + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return; + } + } + + is_region = clip->path == NULL; + for (i = 0; i < clip->num_boxes; i++) { + cairo_box_t *b = &clip->boxes[i]; + if (is_region) + is_region = + _cairo_fixed_is_integer (b->p1.x | b->p1.y | b->p2.x | b->p2.y); + r[i].x = _cairo_fixed_integer_floor (b->p1.x); + r[i].y = _cairo_fixed_integer_floor (b->p1.y); + r[i].width = _cairo_fixed_integer_ceil (b->p2.x) - r[i].x; + r[i].height = _cairo_fixed_integer_ceil (b->p2.y) - r[i].y; + } + clip->is_region = is_region; + + clip->region = cairo_region_create_rectangles (r, i); + + if (r != stack_rects) + free (r); +} + +cairo_region_t * +_cairo_clip_get_region (const cairo_clip_t *clip) +{ + if (clip == NULL) + return NULL; + + if (clip->region == NULL) + _cairo_clip_extract_region ((cairo_clip_t *) clip); + + return clip->region; +} + +cairo_bool_t +_cairo_clip_is_region (const cairo_clip_t *clip) +{ + if (clip == NULL) + return TRUE; + + if (clip->is_region) + return TRUE; + + /* XXX Geometric reduction? */ + + if (clip->path) + return FALSE; + + if (clip->num_boxes == 0) + return TRUE; + + if (clip->region == NULL) + _cairo_clip_extract_region ((cairo_clip_t *) clip); + + return clip->is_region; +} diff --git a/src/cairo-clip-surface.c b/src/cairo-clip-surface.c new file mode 100644 index 000000000..85feaa649 --- /dev/null +++ b/src/cairo-clip-surface.c @@ -0,0 +1,240 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-gstate-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-pattern-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-region-private.h" + +cairo_status_t +_cairo_clip_combine_with_surface (const cairo_clip_t *clip, + cairo_surface_t *dst, + int dst_x, int dst_y) +{ + cairo_clip_path_t *copy_path; + cairo_clip_path_t *clip_path; + cairo_clip_t *copy; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + copy = _cairo_clip_copy_with_translation (clip, -dst_x, -dst_y); + copy_path = copy->path; + copy->path = NULL; + + if (copy->boxes) { + status = _cairo_surface_paint (dst, + CAIRO_OPERATOR_IN, + &_cairo_pattern_white.base, + copy); + } + + clip = NULL; + if (_cairo_clip_is_region (copy)) + clip = copy; + clip_path = copy_path; + while (status == CAIRO_STATUS_SUCCESS && clip_path) { + status = _cairo_surface_fill (dst, + CAIRO_OPERATOR_IN, + &_cairo_pattern_white.base, + &clip_path->path, + clip_path->fill_rule, + clip_path->tolerance, + clip_path->antialias, + clip); + clip_path = clip_path->prev; + } + + copy->path = copy_path; + _cairo_clip_destroy (copy); + return status; +} + +static cairo_status_t +_cairo_path_fixed_add_box (cairo_path_fixed_t *path, + const cairo_box_t *box, + cairo_fixed_t fx, + cairo_fixed_t fy) +{ + cairo_status_t status; + + status = _cairo_path_fixed_move_to (path, box->p1.x + fx, box->p1.y + fy); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x + fx, box->p1.y + fy); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x + fx, box->p2.y + fy); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p1.x + fx, box->p2.y + fy); + if (unlikely (status)) + return status; + + return _cairo_path_fixed_close_path (path); +} + +cairo_surface_t * +_cairo_clip_get_surface (const cairo_clip_t *clip, + cairo_surface_t *target, + int *tx, int *ty) +{ + cairo_surface_t *surface; + cairo_status_t status; + cairo_clip_t *copy, *region; + cairo_clip_path_t *copy_path, *clip_path; + + if (clip->num_boxes) { + cairo_path_fixed_t path; + int i; + + surface = _cairo_surface_create_scratch (target, + CAIRO_CONTENT_ALPHA, + clip->extents.width, + clip->extents.height, + CAIRO_COLOR_TRANSPARENT); + if (unlikely (surface->status)) + return surface; + + _cairo_path_fixed_init (&path); + status = CAIRO_STATUS_SUCCESS; + for (i = 0; status == CAIRO_STATUS_SUCCESS && i < clip->num_boxes; i++) { + status = _cairo_path_fixed_add_box (&path, &clip->boxes[i], + -_cairo_fixed_from_int (clip->extents.x), + -_cairo_fixed_from_int (clip->extents.y)); + } + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_surface_fill (surface, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + &path, + CAIRO_FILL_RULE_WINDING, + 1., + CAIRO_ANTIALIAS_DEFAULT, + NULL); + _cairo_path_fixed_fini (&path); + if (unlikely (status)) { + cairo_surface_destroy (surface); + return _cairo_surface_create_in_error (status); + } + } else { + surface = _cairo_surface_create_scratch (target, + CAIRO_CONTENT_ALPHA, + clip->extents.width, + clip->extents.height, + CAIRO_COLOR_WHITE); + if (unlikely (surface->status)) + return surface; + } + + copy = _cairo_clip_copy_with_translation (clip, + -clip->extents.x, + -clip->extents.y); + copy_path = copy->path; + copy->path = NULL; + + region = copy; + if (! _cairo_clip_is_region (copy)) + region = _cairo_clip_copy_region (copy); + + status = CAIRO_STATUS_SUCCESS; + clip_path = copy_path; + while (status == CAIRO_STATUS_SUCCESS && clip_path) { + status = _cairo_surface_fill (surface, + CAIRO_OPERATOR_IN, + &_cairo_pattern_white.base, + &clip_path->path, + clip_path->fill_rule, + clip_path->tolerance, + clip_path->antialias, + region); + clip_path = clip_path->prev; + } + + copy->path = copy_path; + _cairo_clip_destroy (copy); + if (region != copy) + _cairo_clip_destroy (region); + + if (unlikely (status)) { + cairo_surface_destroy (surface); + return _cairo_surface_create_in_error (status); + } + + *tx = clip->extents.x; + *ty = clip->extents.y; + return surface; +} + +cairo_surface_t * +_cairo_clip_get_image (const cairo_clip_t *clip, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *surface; + cairo_status_t status; + + surface = cairo_surface_create_similar_image (target, + CAIRO_FORMAT_A8, + extents->width, + extents->height); + if (unlikely (surface->status)) + return surface; + + status = _cairo_surface_paint (surface, CAIRO_OPERATOR_SOURCE, + &_cairo_pattern_white.base, NULL); + if (likely (status == CAIRO_STATUS_SUCCESS)) + status = _cairo_clip_combine_with_surface (clip, surface, + extents->x, extents->y); + + if (unlikely (status)) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + + return surface; +} diff --git a/src/cairo-clip-tor-scan-converter.c b/src/cairo-clip-tor-scan-converter.c new file mode 100644 index 000000000..e32a5a9d9 --- /dev/null +++ b/src/cairo-clip-tor-scan-converter.c @@ -0,0 +1,1845 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* glitter-paths - polygon scan converter + * + * Copyright (c) 2008 M Joonas Pihlaja + * Copyright (c) 2007 David Turner + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +/* This is the Glitter paths scan converter incorporated into cairo. + * The source is from commit 734c53237a867a773640bd5b64816249fa1730f8 + * of + * + * http://gitweb.freedesktop.org/?p=users/joonas/glitter-paths + */ +/* Glitter-paths is a stand alone polygon rasteriser derived from + * David Turner's reimplementation of Tor Anderssons's 15x17 + * supersampling rasteriser from the Apparition graphics library. The + * main new feature here is cheaply choosing per-scan line between + * doing fully analytical coverage computation for an entire row at a + * time vs. using a supersampling approach. + * + * David Turner's code can be found at + * + * http://david.freetype.org/rasterizer-shootout/raster-comparison-20070813.tar.bz2 + * + * In particular this file incorporates large parts of ftgrays_tor10.h + * from raster-comparison-20070813.tar.bz2 + */ +/* Overview + * + * A scan converter's basic purpose to take polygon edges and convert + * them into an RLE compressed A8 mask. This one works in two phases: + * gathering edges and generating spans. + * + * 1) As the user feeds the scan converter edges they are vertically + * clipped and bucketted into a _polygon_ data structure. The edges + * are also snapped from the user's coordinates to the subpixel grid + * coordinates used during scan conversion. + * + * user + * | + * | edges + * V + * polygon buckets + * + * 2) Generating spans works by performing a vertical sweep of pixel + * rows from top to bottom and maintaining an _active_list_ of edges + * that intersect the row. From the active list the fill rule + * determines which edges are the left and right edges of the start of + * each span, and their contribution is then accumulated into a pixel + * coverage list (_cell_list_) as coverage deltas. Once the coverage + * deltas of all edges are known we can form spans of constant pixel + * coverage by summing the deltas during a traversal of the cell list. + * At the end of a pixel row the cell list is sent to a coverage + * blitter for rendering to some target surface. + * + * The pixel coverages are computed by either supersampling the row + * and box filtering a mono rasterisation, or by computing the exact + * coverages of edges in the active list. The supersampling method is + * used whenever some edge starts or stops within the row or there are + * edge intersections in the row. + * + * polygon bucket for \ + * current pixel row | + * | | + * | activate new edges | Repeat GRID_Y times if we + * V \ are supersampling this row, + * active list / or just once if we're computing + * | | analytical coverage. + * | coverage deltas | + * V | + * pixel coverage list / + * | + * V + * coverage blitter + */ +#include "cairoint.h" +#include "cairo-spans-private.h" +#include "cairo-error-private.h" + +#include +#include +#include +#include +#include + +/* The input coordinate scale and the rasterisation grid scales. */ +#define GLITTER_INPUT_BITS CAIRO_FIXED_FRAC_BITS +#define GRID_X_BITS CAIRO_FIXED_FRAC_BITS +#define GRID_Y 15 + +/* Set glitter up to use a cairo span renderer to do the coverage + * blitting. */ +struct pool; +struct cell_list; + +/*------------------------------------------------------------------------- + * glitter-paths.h + */ + +/* "Input scaled" numbers are fixed precision reals with multiplier + * 2**GLITTER_INPUT_BITS. Input coordinates are given to glitter as + * pixel scaled numbers. These get converted to the internal grid + * scaled numbers as soon as possible. Internal overflow is possible + * if GRID_X/Y inside glitter-paths.c is larger than + * 1< +#include +#include + +/* All polygon coordinates are snapped onto a subsample grid. "Grid + * scaled" numbers are fixed precision reals with multiplier GRID_X or + * GRID_Y. */ +typedef int grid_scaled_t; +typedef int grid_scaled_x_t; +typedef int grid_scaled_y_t; + +/* Default x/y scale factors. + * You can either define GRID_X/Y_BITS to get a power-of-two scale + * or define GRID_X/Y separately. */ +#if !defined(GRID_X) && !defined(GRID_X_BITS) +# define GRID_X_BITS 8 +#endif +#if !defined(GRID_Y) && !defined(GRID_Y_BITS) +# define GRID_Y 15 +#endif + +/* Use GRID_X/Y_BITS to define GRID_X/Y if they're available. */ +#ifdef GRID_X_BITS +# define GRID_X (1 << GRID_X_BITS) +#endif +#ifdef GRID_Y_BITS +# define GRID_Y (1 << GRID_Y_BITS) +#endif + +/* The GRID_X_TO_INT_FRAC macro splits a grid scaled coordinate into + * integer and fractional parts. The integer part is floored. */ +#if defined(GRID_X_TO_INT_FRAC) + /* do nothing */ +#elif defined(GRID_X_BITS) +# define GRID_X_TO_INT_FRAC(x, i, f) \ + _GRID_TO_INT_FRAC_shift(x, i, f, GRID_X_BITS) +#else +# define GRID_X_TO_INT_FRAC(x, i, f) \ + _GRID_TO_INT_FRAC_general(x, i, f, GRID_X) +#endif + +#define _GRID_TO_INT_FRAC_general(t, i, f, m) do { \ + (i) = (t) / (m); \ + (f) = (t) % (m); \ + if ((f) < 0) { \ + --(i); \ + (f) += (m); \ + } \ +} while (0) + +#define _GRID_TO_INT_FRAC_shift(t, i, f, b) do { \ + (f) = (t) & ((1 << (b)) - 1); \ + (i) = (t) >> (b); \ +} while (0) + +/* A grid area is a real in [0,1] scaled by 2*GRID_X*GRID_Y. We want + * to be able to represent exactly areas of subpixel trapezoids whose + * vertices are given in grid scaled coordinates. The scale factor + * comes from needing to accurately represent the area 0.5*dx*dy of a + * triangle with base dx and height dy in grid scaled numbers. */ +typedef int grid_area_t; +#define GRID_XY (2*GRID_X*GRID_Y) /* Unit area on the grid. */ + +/* GRID_AREA_TO_ALPHA(area): map [0,GRID_XY] to [0,255]. */ +#if GRID_XY == 510 +# define GRID_AREA_TO_ALPHA(c) (((c)+1) >> 1) +#elif GRID_XY == 255 +# define GRID_AREA_TO_ALPHA(c) (c) +#elif GRID_XY == 64 +# define GRID_AREA_TO_ALPHA(c) (((c) << 2) | -(((c) & 0x40) >> 6)) +#elif GRID_XY == 128 +# define GRID_AREA_TO_ALPHA(c) ((((c) << 1) | -((c) >> 7)) & 255) +#elif GRID_XY == 256 +# define GRID_AREA_TO_ALPHA(c) (((c) | -((c) >> 8)) & 255) +#elif GRID_XY == 15 +# define GRID_AREA_TO_ALPHA(c) (((c) << 4) + (c)) +#elif GRID_XY == 2*256*15 +# define GRID_AREA_TO_ALPHA(c) (((c) + ((c)<<4) + 256) >> 9) +#else +# define GRID_AREA_TO_ALPHA(c) (((c)*255 + GRID_XY/2) / GRID_XY) +#endif + +#define UNROLL3(x) x x x + +struct quorem { + int32_t quo; + int32_t rem; +}; + +/* Header for a chunk of memory in a memory pool. */ +struct _pool_chunk { + /* # bytes used in this chunk. */ + size_t size; + + /* # bytes total in this chunk */ + size_t capacity; + + /* Pointer to the previous chunk or %NULL if this is the sentinel + * chunk in the pool header. */ + struct _pool_chunk *prev_chunk; + + /* Actual data starts here. Well aligned for pointers. */ +}; + +/* A memory pool. This is supposed to be embedded on the stack or + * within some other structure. It may optionally be followed by an + * embedded array from which requests are fulfilled until + * malloc needs to be called to allocate a first real chunk. */ +struct pool { + /* Chunk we're allocating from. */ + struct _pool_chunk *current; + + jmp_buf *jmp; + + /* Free list of previously allocated chunks. All have >= default + * capacity. */ + struct _pool_chunk *first_free; + + /* The default capacity of a chunk. */ + size_t default_capacity; + + /* Header for the sentinel chunk. Directly following the pool + * struct should be some space for embedded elements from which + * the sentinel chunk allocates from. */ + struct _pool_chunk sentinel[1]; +}; + +/* A polygon edge. */ +struct edge { + /* Next in y-bucket or active list. */ + struct edge *next; + + /* Current x coordinate while the edge is on the active + * list. Initialised to the x coordinate of the top of the + * edge. The quotient is in grid_scaled_x_t units and the + * remainder is mod dy in grid_scaled_y_t units.*/ + struct quorem x; + + /* Advance of the current x when moving down a subsample line. */ + struct quorem dxdy; + + /* Advance of the current x when moving down a full pixel + * row. Only initialised when the height of the edge is large + * enough that there's a chance the edge could be stepped by a + * full row's worth of subsample rows at a time. */ + struct quorem dxdy_full; + + /* The clipped y of the top of the edge. */ + grid_scaled_y_t ytop; + + /* y2-y1 after orienting the edge downwards. */ + grid_scaled_y_t dy; + + /* Number of subsample rows remaining to scan convert of this + * edge. */ + grid_scaled_y_t height_left; + + /* Original sign of the edge: +1 for downwards, -1 for upwards + * edges. */ + int dir; + int vertical; + int clip; +}; + +/* Number of subsample rows per y-bucket. Must be GRID_Y. */ +#define EDGE_Y_BUCKET_HEIGHT GRID_Y + +#define EDGE_Y_BUCKET_INDEX(y, ymin) (((y) - (ymin))/EDGE_Y_BUCKET_HEIGHT) + +/* A collection of sorted and vertically clipped edges of the polygon. + * Edges are moved from the polygon to an active list while scan + * converting. */ +struct polygon { + /* The vertical clip extents. */ + grid_scaled_y_t ymin, ymax; + + /* Array of edges all starting in the same bucket. An edge is put + * into bucket EDGE_BUCKET_INDEX(edge->ytop, polygon->ymin) when + * it is added to the polygon. */ + struct edge **y_buckets; + struct edge *y_buckets_embedded[64]; + + struct { + struct pool base[1]; + struct edge embedded[32]; + } edge_pool; +}; + +/* A cell records the effect on pixel coverage of polygon edges + * passing through a pixel. It contains two accumulators of pixel + * coverage. + * + * Consider the effects of a polygon edge on the coverage of a pixel + * it intersects and that of the following one. The coverage of the + * following pixel is the height of the edge multiplied by the width + * of the pixel, and the coverage of the pixel itself is the area of + * the trapezoid formed by the edge and the right side of the pixel. + * + * +-----------------------+-----------------------+ + * | | | + * | | | + * |_______________________|_______________________| + * | \...................|.......................|\ + * | \..................|.......................| | + * | \.................|.......................| | + * | \....covered.....|.......................| | + * | \....area.......|.......................| } covered height + * | \..............|.......................| | + * |uncovered\.............|.......................| | + * | area \............|.......................| | + * |___________\...........|.......................|/ + * | | | + * | | | + * | | | + * +-----------------------+-----------------------+ + * + * Since the coverage of the following pixel will always be a multiple + * of the width of the pixel, we can store the height of the covered + * area instead. The coverage of the pixel itself is the total + * coverage minus the area of the uncovered area to the left of the + * edge. As it's faster to compute the uncovered area we only store + * that and subtract it from the total coverage later when forming + * spans to blit. + * + * The heights and areas are signed, with left edges of the polygon + * having positive sign and right edges having negative sign. When + * two edges intersect they swap their left/rightness so their + * contribution above and below the intersection point must be + * computed separately. */ +struct cell { + struct cell *next; + int x; + grid_area_t uncovered_area; + grid_scaled_y_t covered_height; + grid_scaled_y_t clipped_height; +}; + +/* A cell list represents the scan line sparsely as cells ordered by + * ascending x. It is geared towards scanning the cells in order + * using an internal cursor. */ +struct cell_list { + /* Sentinel nodes */ + struct cell head, tail; + + /* Cursor state for iterating through the cell list. */ + struct cell *cursor; + + /* Cells in the cell list are owned by the cell list and are + * allocated from this pool. */ + struct { + struct pool base[1]; + struct cell embedded[32]; + } cell_pool; +}; + +struct cell_pair { + struct cell *cell1; + struct cell *cell2; +}; + +/* The active list contains edges in the current scan line ordered by + * the x-coordinate of the intercept of the edge and the scan line. */ +struct active_list { + /* Leftmost edge on the current scan line. */ + struct edge *head; + + /* A lower bound on the height of the active edges is used to + * estimate how soon some active edge ends. We can't advance the + * scan conversion by a full pixel row if an edge ends somewhere + * within it. */ + grid_scaled_y_t min_height; +}; + +struct glitter_scan_converter { + struct polygon polygon[1]; + struct active_list active[1]; + struct cell_list coverages[1]; + + /* Clip box. */ + grid_scaled_y_t ymin, ymax; +}; + +/* Compute the floored division a/b. Assumes / and % perform symmetric + * division. */ +inline static struct quorem +floored_divrem(int a, int b) +{ + struct quorem qr; + qr.quo = a/b; + qr.rem = a%b; + if ((a^b)<0 && qr.rem) { + qr.quo -= 1; + qr.rem += b; + } + return qr; +} + +/* Compute the floored division (x*a)/b. Assumes / and % perform symmetric + * division. */ +static struct quorem +floored_muldivrem(int x, int a, int b) +{ + struct quorem qr; + long long xa = (long long)x*a; + qr.quo = xa/b; + qr.rem = xa%b; + if ((xa>=0) != (b>=0) && qr.rem) { + qr.quo -= 1; + qr.rem += b; + } + return qr; +} + +static struct _pool_chunk * +_pool_chunk_init( + struct _pool_chunk *p, + struct _pool_chunk *prev_chunk, + size_t capacity) +{ + p->prev_chunk = prev_chunk; + p->size = 0; + p->capacity = capacity; + return p; +} + +static struct _pool_chunk * +_pool_chunk_create(struct pool *pool, size_t size) +{ + struct _pool_chunk *p; + + p = malloc(size + sizeof(struct _pool_chunk)); + if (unlikely (NULL == p)) + longjmp (*pool->jmp, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + + return _pool_chunk_init(p, pool->current, size); +} + +static void +pool_init(struct pool *pool, + jmp_buf *jmp, + size_t default_capacity, + size_t embedded_capacity) +{ + pool->jmp = jmp; + pool->current = pool->sentinel; + pool->first_free = NULL; + pool->default_capacity = default_capacity; + _pool_chunk_init(pool->sentinel, NULL, embedded_capacity); +} + +static void +pool_fini(struct pool *pool) +{ + struct _pool_chunk *p = pool->current; + do { + while (NULL != p) { + struct _pool_chunk *prev = p->prev_chunk; + if (p != pool->sentinel) + free(p); + p = prev; + } + p = pool->first_free; + pool->first_free = NULL; + } while (NULL != p); +} + +/* Satisfy an allocation by first allocating a new large enough chunk + * and adding it to the head of the pool's chunk list. This function + * is called as a fallback if pool_alloc() couldn't do a quick + * allocation from the current chunk in the pool. */ +static void * +_pool_alloc_from_new_chunk( + struct pool *pool, + size_t size) +{ + struct _pool_chunk *chunk; + void *obj; + size_t capacity; + + /* If the allocation is smaller than the default chunk size then + * try getting a chunk off the free list. Force alloc of a new + * chunk for large requests. */ + capacity = size; + chunk = NULL; + if (size < pool->default_capacity) { + capacity = pool->default_capacity; + chunk = pool->first_free; + if (chunk) { + pool->first_free = chunk->prev_chunk; + _pool_chunk_init(chunk, pool->current, chunk->capacity); + } + } + + if (NULL == chunk) + chunk = _pool_chunk_create (pool, capacity); + pool->current = chunk; + + obj = ((unsigned char*)chunk + sizeof(*chunk) + chunk->size); + chunk->size += size; + return obj; +} + +/* Allocate size bytes from the pool. The first allocated address + * returned from a pool is aligned to sizeof(void*). Subsequent + * addresses will maintain alignment as long as multiples of void* are + * allocated. Returns the address of a new memory area or %NULL on + * allocation failures. The pool retains ownership of the returned + * memory. */ +inline static void * +pool_alloc (struct pool *pool, size_t size) +{ + struct _pool_chunk *chunk = pool->current; + + if (size <= chunk->capacity - chunk->size) { + void *obj = ((unsigned char*)chunk + sizeof(*chunk) + chunk->size); + chunk->size += size; + return obj; + } else { + return _pool_alloc_from_new_chunk(pool, size); + } +} + +/* Relinquish all pool_alloced memory back to the pool. */ +static void +pool_reset (struct pool *pool) +{ + /* Transfer all used chunks to the chunk free list. */ + struct _pool_chunk *chunk = pool->current; + if (chunk != pool->sentinel) { + while (chunk->prev_chunk != pool->sentinel) { + chunk = chunk->prev_chunk; + } + chunk->prev_chunk = pool->first_free; + pool->first_free = pool->current; + } + /* Reset the sentinel as the current chunk. */ + pool->current = pool->sentinel; + pool->sentinel->size = 0; +} + +/* Rewinds the cell list's cursor to the beginning. After rewinding + * we're good to cell_list_find() the cell any x coordinate. */ +inline static void +cell_list_rewind (struct cell_list *cells) +{ + cells->cursor = &cells->head; +} + +/* Rewind the cell list if its cursor has been advanced past x. */ +inline static void +cell_list_maybe_rewind (struct cell_list *cells, int x) +{ + struct cell *tail = cells->cursor; + if (tail->x > x) + cell_list_rewind (cells); +} + +static void +cell_list_init(struct cell_list *cells, jmp_buf *jmp) +{ + pool_init(cells->cell_pool.base, jmp, + 256*sizeof(struct cell), + sizeof(cells->cell_pool.embedded)); + cells->tail.next = NULL; + cells->tail.x = INT_MAX; + cells->head.x = INT_MIN; + cells->head.next = &cells->tail; + cell_list_rewind (cells); +} + +static void +cell_list_fini(struct cell_list *cells) +{ + pool_fini (cells->cell_pool.base); +} + +/* Empty the cell list. This is called at the start of every pixel + * row. */ +inline static void +cell_list_reset (struct cell_list *cells) +{ + cell_list_rewind (cells); + cells->head.next = &cells->tail; + pool_reset (cells->cell_pool.base); +} + +static struct cell * +cell_list_alloc (struct cell_list *cells, + struct cell *tail, + int x) +{ + struct cell *cell; + + cell = pool_alloc (cells->cell_pool.base, sizeof (struct cell)); + cell->next = tail->next; + tail->next = cell; + cell->x = x; + cell->uncovered_area = 0; + cell->covered_height = 0; + cell->clipped_height = 0; + return cell; +} + +/* Find a cell at the given x-coordinate. Returns %NULL if a new cell + * needed to be allocated but couldn't be. Cells must be found with + * non-decreasing x-coordinate until the cell list is rewound using + * cell_list_rewind(). Ownership of the returned cell is retained by + * the cell list. */ +inline static struct cell * +cell_list_find (struct cell_list *cells, int x) +{ + struct cell *tail = cells->cursor; + + while (1) { + UNROLL3({ + if (tail->next->x > x) + break; + tail = tail->next; + }); + } + + if (tail->x != x) + tail = cell_list_alloc (cells, tail, x); + return cells->cursor = tail; + +} + +/* Find two cells at x1 and x2. This is exactly equivalent + * to + * + * pair.cell1 = cell_list_find(cells, x1); + * pair.cell2 = cell_list_find(cells, x2); + * + * except with less function call overhead. */ +inline static struct cell_pair +cell_list_find_pair(struct cell_list *cells, int x1, int x2) +{ + struct cell_pair pair; + + pair.cell1 = cells->cursor; + while (1) { + UNROLL3({ + if (pair.cell1->next->x > x1) + break; + pair.cell1 = pair.cell1->next; + }); + } + if (pair.cell1->x != x1) { + struct cell *cell = pool_alloc (cells->cell_pool.base, + sizeof (struct cell)); + cell->x = x1; + cell->uncovered_area = 0; + cell->covered_height = 0; + cell->clipped_height = 0; + cell->next = pair.cell1->next; + pair.cell1->next = cell; + pair.cell1 = cell; + } + + pair.cell2 = pair.cell1; + while (1) { + UNROLL3({ + if (pair.cell2->next->x > x2) + break; + pair.cell2 = pair.cell2->next; + }); + } + if (pair.cell2->x != x2) { + struct cell *cell = pool_alloc (cells->cell_pool.base, + sizeof (struct cell)); + cell->uncovered_area = 0; + cell->covered_height = 0; + cell->clipped_height = 0; + cell->x = x2; + cell->next = pair.cell2->next; + pair.cell2->next = cell; + pair.cell2 = cell; + } + + cells->cursor = pair.cell2; + return pair; +} + +/* Add a subpixel span covering [x1, x2) to the coverage cells. */ +inline static void +cell_list_add_subspan(struct cell_list *cells, + grid_scaled_x_t x1, + grid_scaled_x_t x2) +{ + int ix1, fx1; + int ix2, fx2; + + GRID_X_TO_INT_FRAC(x1, ix1, fx1); + GRID_X_TO_INT_FRAC(x2, ix2, fx2); + + if (ix1 != ix2) { + struct cell_pair p; + p = cell_list_find_pair(cells, ix1, ix2); + p.cell1->uncovered_area += 2*fx1; + ++p.cell1->covered_height; + p.cell2->uncovered_area -= 2*fx2; + --p.cell2->covered_height; + } else { + struct cell *cell = cell_list_find(cells, ix1); + cell->uncovered_area += 2*(fx1-fx2); + } +} + +/* Adds the analytical coverage of an edge crossing the current pixel + * row to the coverage cells and advances the edge's x position to the + * following row. + * + * This function is only called when we know that during this pixel row: + * + * 1) The relative order of all edges on the active list doesn't + * change. In particular, no edges intersect within this row to pixel + * precision. + * + * 2) No new edges start in this row. + * + * 3) No existing edges end mid-row. + * + * This function depends on being called with all edges from the + * active list in the order they appear on the list (i.e. with + * non-decreasing x-coordinate.) */ +static void +cell_list_render_edge( + struct cell_list *cells, + struct edge *edge, + int sign) +{ + grid_scaled_y_t y1, y2, dy; + grid_scaled_x_t dx; + int ix1, ix2; + grid_scaled_x_t fx1, fx2; + + struct quorem x1 = edge->x; + struct quorem x2 = x1; + + if (! edge->vertical) { + x2.quo += edge->dxdy_full.quo; + x2.rem += edge->dxdy_full.rem; + if (x2.rem >= 0) { + ++x2.quo; + x2.rem -= edge->dy; + } + + edge->x = x2; + } + + GRID_X_TO_INT_FRAC(x1.quo, ix1, fx1); + GRID_X_TO_INT_FRAC(x2.quo, ix2, fx2); + + /* Edge is entirely within a column? */ + if (ix1 == ix2) { + /* We always know that ix1 is >= the cell list cursor in this + * case due to the no-intersections precondition. */ + struct cell *cell = cell_list_find(cells, ix1); + cell->covered_height += sign*GRID_Y; + cell->uncovered_area += sign*(fx1 + fx2)*GRID_Y; + return; + } + + /* Orient the edge left-to-right. */ + dx = x2.quo - x1.quo; + if (dx >= 0) { + y1 = 0; + y2 = GRID_Y; + } else { + int tmp; + tmp = ix1; ix1 = ix2; ix2 = tmp; + tmp = fx1; fx1 = fx2; fx2 = tmp; + dx = -dx; + sign = -sign; + y1 = GRID_Y; + y2 = 0; + } + dy = y2 - y1; + + /* Add coverage for all pixels [ix1,ix2] on this row crossed + * by the edge. */ + { + struct cell_pair pair; + struct quorem y = floored_divrem((GRID_X - fx1)*dy, dx); + + /* When rendering a previous edge on the active list we may + * advance the cell list cursor past the leftmost pixel of the + * current edge even though the two edges don't intersect. + * e.g. consider two edges going down and rightwards: + * + * --\_+---\_+-----+-----+---- + * \_ \_ | | + * | \_ | \_ | | + * | \_| \_| | + * | \_ \_ | + * ----+-----+-\---+-\---+---- + * + * The left edge touches cells past the starting cell of the + * right edge. Fortunately such cases are rare. + * + * The rewinding is never necessary if the current edge stays + * within a single column because we've checked before calling + * this function that the active list order won't change. */ + cell_list_maybe_rewind(cells, ix1); + + pair = cell_list_find_pair(cells, ix1, ix1+1); + pair.cell1->uncovered_area += sign*y.quo*(GRID_X + fx1); + pair.cell1->covered_height += sign*y.quo; + y.quo += y1; + + if (ix1+1 < ix2) { + struct quorem dydx_full = floored_divrem(GRID_X*dy, dx); + struct cell *cell = pair.cell2; + + ++ix1; + do { + grid_scaled_y_t y_skip = dydx_full.quo; + y.rem += dydx_full.rem; + if (y.rem >= dx) { + ++y_skip; + y.rem -= dx; + } + + y.quo += y_skip; + + y_skip *= sign; + cell->uncovered_area += y_skip*GRID_X; + cell->covered_height += y_skip; + + ++ix1; + cell = cell_list_find(cells, ix1); + } while (ix1 != ix2); + + pair.cell2 = cell; + } + pair.cell2->uncovered_area += sign*(y2 - y.quo)*fx2; + pair.cell2->covered_height += sign*(y2 - y.quo); + } +} + +static void +polygon_init (struct polygon *polygon, jmp_buf *jmp) +{ + polygon->ymin = polygon->ymax = 0; + polygon->y_buckets = polygon->y_buckets_embedded; + pool_init (polygon->edge_pool.base, jmp, + 8192 - sizeof (struct _pool_chunk), + sizeof (polygon->edge_pool.embedded)); +} + +static void +polygon_fini (struct polygon *polygon) +{ + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + pool_fini (polygon->edge_pool.base); +} + +/* Empties the polygon of all edges. The polygon is then prepared to + * receive new edges and clip them to the vertical range + * [ymin,ymax). */ +static cairo_status_t +polygon_reset (struct polygon *polygon, + grid_scaled_y_t ymin, + grid_scaled_y_t ymax) +{ + unsigned h = ymax - ymin; + unsigned num_buckets = EDGE_Y_BUCKET_INDEX(ymax + EDGE_Y_BUCKET_HEIGHT-1, + ymin); + + pool_reset(polygon->edge_pool.base); + + if (unlikely (h > 0x7FFFFFFFU - EDGE_Y_BUCKET_HEIGHT)) + goto bail_no_mem; /* even if you could, you wouldn't want to. */ + + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + polygon->y_buckets = polygon->y_buckets_embedded; + if (num_buckets > ARRAY_LENGTH (polygon->y_buckets_embedded)) { + polygon->y_buckets = _cairo_malloc_ab (num_buckets, + sizeof (struct edge *)); + if (unlikely (NULL == polygon->y_buckets)) + goto bail_no_mem; + } + memset (polygon->y_buckets, 0, num_buckets * sizeof (struct edge *)); + + polygon->ymin = ymin; + polygon->ymax = ymax; + return CAIRO_STATUS_SUCCESS; + + bail_no_mem: + polygon->ymin = 0; + polygon->ymax = 0; + return CAIRO_STATUS_NO_MEMORY; +} + +static void +_polygon_insert_edge_into_its_y_bucket( + struct polygon *polygon, + struct edge *e) +{ + unsigned ix = EDGE_Y_BUCKET_INDEX(e->ytop, polygon->ymin); + struct edge **ptail = &polygon->y_buckets[ix]; + e->next = *ptail; + *ptail = e; +} + +inline static void +polygon_add_edge (struct polygon *polygon, + const cairo_edge_t *edge, + int clip) +{ + struct edge *e; + grid_scaled_x_t dx; + grid_scaled_y_t dy; + grid_scaled_y_t ytop, ybot; + grid_scaled_y_t ymin = polygon->ymin; + grid_scaled_y_t ymax = polygon->ymax; + + assert (edge->bottom > edge->top); + + if (unlikely (edge->top >= ymax || edge->bottom <= ymin)) + return; + + e = pool_alloc (polygon->edge_pool.base, sizeof (struct edge)); + + dx = edge->line.p2.x - edge->line.p1.x; + dy = edge->line.p2.y - edge->line.p1.y; + e->dy = dy; + e->dir = edge->dir; + e->clip = clip; + + ytop = edge->top >= ymin ? edge->top : ymin; + ybot = edge->bottom <= ymax ? edge->bottom : ymax; + e->ytop = ytop; + e->height_left = ybot - ytop; + + if (dx == 0) { + e->vertical = TRUE; + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + e->dxdy.quo = 0; + e->dxdy.rem = 0; + e->dxdy_full.quo = 0; + e->dxdy_full.rem = 0; + } else { + e->vertical = FALSE; + e->dxdy = floored_divrem (dx, dy); + if (ytop == edge->line.p1.y) { + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + } else { + e->x = floored_muldivrem (ytop - edge->line.p1.y, dx, dy); + e->x.quo += edge->line.p1.x; + } + + if (e->height_left >= GRID_Y) { + e->dxdy_full = floored_muldivrem (GRID_Y, dx, dy); + } else { + e->dxdy_full.quo = 0; + e->dxdy_full.rem = 0; + } + } + + _polygon_insert_edge_into_its_y_bucket (polygon, e); + + e->x.rem -= dy; /* Bias the remainder for faster + * edge advancement. */ +} + +static void +active_list_reset (struct active_list *active) +{ + active->head = NULL; + active->min_height = 0; +} + +static void +active_list_init(struct active_list *active) +{ + active_list_reset(active); +} + +/* + * Merge two sorted edge lists. + * Input: + * - head_a: The head of the first list. + * - head_b: The head of the second list; head_b cannot be NULL. + * Output: + * Returns the head of the merged list. + * + * Implementation notes: + * To make it fast (in particular, to reduce to an insertion sort whenever + * one of the two input lists only has a single element) we iterate through + * a list until its head becomes greater than the head of the other list, + * then we switch their roles. As soon as one of the two lists is empty, we + * just attach the other one to the current list and exit. + * Writes to memory are only needed to "switch" lists (as it also requires + * attaching to the output list the list which we will be iterating next) and + * to attach the last non-empty list. + */ +static struct edge * +merge_sorted_edges (struct edge *head_a, struct edge *head_b) +{ + struct edge *head, **next; + int32_t x; + + if (head_a == NULL) + return head_b; + + next = &head; + if (head_a->x.quo <= head_b->x.quo) { + head = head_a; + } else { + head = head_b; + goto start_with_b; + } + + do { + x = head_b->x.quo; + while (head_a != NULL && head_a->x.quo <= x) { + next = &head_a->next; + head_a = head_a->next; + } + + *next = head_b; + if (head_a == NULL) + return head; + +start_with_b: + x = head_a->x.quo; + while (head_b != NULL && head_b->x.quo <= x) { + next = &head_b->next; + head_b = head_b->next; + } + + *next = head_a; + if (head_b == NULL) + return head; + } while (1); +} + +/* + * Sort (part of) a list. + * Input: + * - list: The list to be sorted; list cannot be NULL. + * - limit: Recursion limit. + * Output: + * - head_out: The head of the sorted list containing the first 2^(level+1) elements of the + * input list; if the input list has fewer elements, head_out be a sorted list + * containing all the elements of the input list. + * Returns the head of the list of unprocessed elements (NULL if the sorted list contains + * all the elements of the input list). + * + * Implementation notes: + * Special case single element list, unroll/inline the sorting of the first two elements. + * Some tail recursion is used since we iterate on the bottom-up solution of the problem + * (we start with a small sorted list and keep merging other lists of the same size to it). + */ +static struct edge * +sort_edges (struct edge *list, + unsigned int level, + struct edge **head_out) +{ + struct edge *head_other, *remaining; + unsigned int i; + + head_other = list->next; + + /* Single element list -> return */ + if (head_other == NULL) { + *head_out = list; + return NULL; + } + + /* Unroll the first iteration of the following loop (halves the number of calls to merge_sorted_edges): + * - Initialize remaining to be the list containing the elements after the second in the input list. + * - Initialize *head_out to be the sorted list containing the first two element. + */ + remaining = head_other->next; + if (list->x.quo <= head_other->x.quo) { + *head_out = list; + /* list->next = head_other; */ /* The input list is already like this. */ + head_other->next = NULL; + } else { + *head_out = head_other; + head_other->next = list; + list->next = NULL; + } + + for (i = 0; i < level && remaining; i++) { + /* Extract a sorted list of the same size as *head_out + * (2^(i+1) elements) from the list of remaining elements. */ + remaining = sort_edges (remaining, i, &head_other); + *head_out = merge_sorted_edges (*head_out, head_other); + } + + /* *head_out now contains (at most) 2^(level+1) elements. */ + + return remaining; +} + +/* Test if the edges on the active list can be safely advanced by a + * full row without intersections or any edges ending. */ +inline static int +active_list_can_step_full_row (struct active_list *active) +{ + const struct edge *e; + int prev_x = INT_MIN; + + /* Recomputes the minimum height of all edges on the active + * list if we have been dropping edges. */ + if (active->min_height <= 0) { + int min_height = INT_MAX; + + e = active->head; + while (NULL != e) { + if (e->height_left < min_height) + min_height = e->height_left; + e = e->next; + } + + active->min_height = min_height; + } + + if (active->min_height < GRID_Y) + return 0; + + /* Check for intersections as no edges end during the next row. */ + e = active->head; + while (NULL != e) { + struct quorem x = e->x; + + if (! e->vertical) { + x.quo += e->dxdy_full.quo; + x.rem += e->dxdy_full.rem; + if (x.rem >= 0) + ++x.quo; + } + + if (x.quo <= prev_x) + return 0; + + prev_x = x.quo; + e = e->next; + } + + return 1; +} + +/* Merges edges on the given subpixel row from the polygon to the + * active_list. */ +inline static void +active_list_merge_edges_from_polygon(struct active_list *active, + struct edge **ptail, + grid_scaled_y_t y, + struct polygon *polygon) +{ + /* Split off the edges on the current subrow and merge them into + * the active list. */ + int min_height = active->min_height; + struct edge *subrow_edges = NULL; + struct edge *tail = *ptail; + + do { + struct edge *next = tail->next; + + if (y == tail->ytop) { + tail->next = subrow_edges; + subrow_edges = tail; + + if (tail->height_left < min_height) + min_height = tail->height_left; + + *ptail = next; + } else + ptail = &tail->next; + + tail = next; + } while (tail); + + if (subrow_edges) { + sort_edges (subrow_edges, UINT_MAX, &subrow_edges); + active->head = merge_sorted_edges (active->head, subrow_edges); + active->min_height = min_height; + } +} + +/* Advance the edges on the active list by one subsample row by + * updating their x positions. Drop edges from the list that end. */ +inline static void +active_list_substep_edges(struct active_list *active) +{ + struct edge **cursor = &active->head; + grid_scaled_x_t prev_x = INT_MIN; + struct edge *unsorted = NULL; + struct edge *edge = *cursor; + + do { + UNROLL3({ + struct edge *next; + + if (NULL == edge) + break; + + next = edge->next; + if (--edge->height_left) { + edge->x.quo += edge->dxdy.quo; + edge->x.rem += edge->dxdy.rem; + if (edge->x.rem >= 0) { + ++edge->x.quo; + edge->x.rem -= edge->dy; + } + + if (edge->x.quo < prev_x) { + *cursor = next; + edge->next = unsorted; + unsorted = edge; + } else { + prev_x = edge->x.quo; + cursor = &edge->next; + } + } else { + *cursor = next; + } + edge = next; + }) + } while (1); + + if (unsorted) { + sort_edges (unsorted, UINT_MAX, &unsorted); + active->head = merge_sorted_edges (active->head, unsorted); + } +} + +inline static void +apply_nonzero_fill_rule_for_subrow (struct active_list *active, + struct cell_list *coverages) +{ + struct edge *edge = active->head; + int winding = 0; + int xstart; + int xend; + + cell_list_rewind (coverages); + + while (NULL != edge) { + xstart = edge->x.quo; + winding = edge->dir; + while (1) { + edge = edge->next; + if (NULL == edge) { + ASSERT_NOT_REACHED; + return; + } + + winding += edge->dir; + if (0 == winding) { + if (edge->next == NULL || edge->next->x.quo != edge->x.quo) + break; + } + } + + xend = edge->x.quo; + cell_list_add_subspan (coverages, xstart, xend); + + edge = edge->next; + } +} + +static void +apply_evenodd_fill_rule_for_subrow (struct active_list *active, + struct cell_list *coverages) +{ + struct edge *edge = active->head; + int xstart; + int xend; + + cell_list_rewind (coverages); + + while (NULL != edge) { + xstart = edge->x.quo; + + while (1) { + edge = edge->next; + if (NULL == edge) { + ASSERT_NOT_REACHED; + return; + } + + if (edge->next == NULL || edge->next->x.quo != edge->x.quo) + break; + + edge = edge->next; + } + + xend = edge->x.quo; + cell_list_add_subspan (coverages, xstart, xend); + + edge = edge->next; + } +} + +static void +apply_nonzero_fill_rule_and_step_edges (struct active_list *active, + struct cell_list *coverages) +{ + struct edge **cursor = &active->head; + struct edge *left_edge; + + left_edge = *cursor; + while (NULL != left_edge) { + struct edge *right_edge; + int winding = left_edge->dir; + + left_edge->height_left -= GRID_Y; + if (left_edge->height_left) + cursor = &left_edge->next; + else + *cursor = left_edge->next; + + while (1) { + right_edge = *cursor; + if (NULL == right_edge) { + cell_list_render_edge (coverages, left_edge, +1); + return; + } + + right_edge->height_left -= GRID_Y; + if (right_edge->height_left) + cursor = &right_edge->next; + else + *cursor = right_edge->next; + + winding += right_edge->dir; + if (0 == winding) { + if (right_edge->next == NULL || + right_edge->next->x.quo != right_edge->x.quo) + { + break; + } + } + + if (! right_edge->vertical) { + right_edge->x.quo += right_edge->dxdy_full.quo; + right_edge->x.rem += right_edge->dxdy_full.rem; + if (right_edge->x.rem >= 0) { + ++right_edge->x.quo; + right_edge->x.rem -= right_edge->dy; + } + } + } + + cell_list_render_edge (coverages, left_edge, +1); + cell_list_render_edge (coverages, right_edge, -1); + + left_edge = *cursor; + } +} + +static void +apply_evenodd_fill_rule_and_step_edges (struct active_list *active, + struct cell_list *coverages) +{ + struct edge **cursor = &active->head; + struct edge *left_edge; + + left_edge = *cursor; + while (NULL != left_edge) { + struct edge *right_edge; + + left_edge->height_left -= GRID_Y; + if (left_edge->height_left) + cursor = &left_edge->next; + else + *cursor = left_edge->next; + + while (1) { + right_edge = *cursor; + if (NULL == right_edge) { + cell_list_render_edge (coverages, left_edge, +1); + return; + } + + right_edge->height_left -= GRID_Y; + if (right_edge->height_left) + cursor = &right_edge->next; + else + *cursor = right_edge->next; + + if (right_edge->next == NULL || + right_edge->next->x.quo != right_edge->x.quo) + { + break; + } + + if (! right_edge->vertical) { + right_edge->x.quo += right_edge->dxdy_full.quo; + right_edge->x.rem += right_edge->dxdy_full.rem; + if (right_edge->x.rem >= 0) { + ++right_edge->x.quo; + right_edge->x.rem -= right_edge->dy; + } + } + } + + cell_list_render_edge (coverages, left_edge, +1); + cell_list_render_edge (coverages, right_edge, -1); + + left_edge = *cursor; + } +} + +static void +_glitter_scan_converter_init(glitter_scan_converter_t *converter, jmp_buf *jmp) +{ + polygon_init(converter->polygon, jmp); + active_list_init(converter->active); + cell_list_init(converter->coverages, jmp); + converter->ymin=0; + converter->ymax=0; +} + +static void +_glitter_scan_converter_fini(glitter_scan_converter_t *converter) +{ + polygon_fini(converter->polygon); + cell_list_fini(converter->coverages); + converter->ymin=0; + converter->ymax=0; +} + +static grid_scaled_t +int_to_grid_scaled(int i, int scale) +{ + /* Clamp to max/min representable scaled number. */ + if (i >= 0) { + if (i >= INT_MAX/scale) + i = INT_MAX/scale; + } + else { + if (i <= INT_MIN/scale) + i = INT_MIN/scale; + } + return i*scale; +} + +#define int_to_grid_scaled_x(x) int_to_grid_scaled((x), GRID_X) +#define int_to_grid_scaled_y(x) int_to_grid_scaled((x), GRID_Y) + +static cairo_status_t +glitter_scan_converter_reset(glitter_scan_converter_t *converter, + int ymin, int ymax) +{ + cairo_status_t status; + + converter->ymin = 0; + converter->ymax = 0; + + ymin = int_to_grid_scaled_y(ymin); + ymax = int_to_grid_scaled_y(ymax); + + active_list_reset(converter->active); + cell_list_reset(converter->coverages); + status = polygon_reset(converter->polygon, ymin, ymax); + if (status) + return status; + + converter->ymin = ymin; + converter->ymax = ymax; + return CAIRO_STATUS_SUCCESS; +} + +/* INPUT_TO_GRID_X/Y (in_coord, out_grid_scaled, grid_scale) + * These macros convert an input coordinate in the client's + * device space to the rasterisation grid. + */ +/* Gah.. this bit of ugly defines INPUT_TO_GRID_X/Y so as to use + * shifts if possible, and something saneish if not. + */ +#if !defined(INPUT_TO_GRID_Y) && defined(GRID_Y_BITS) && GRID_Y_BITS <= GLITTER_INPUT_BITS +# define INPUT_TO_GRID_Y(in, out) (out) = (in) >> (GLITTER_INPUT_BITS - GRID_Y_BITS) +#else +# define INPUT_TO_GRID_Y(in, out) INPUT_TO_GRID_general(in, out, GRID_Y) +#endif + +#if !defined(INPUT_TO_GRID_X) && defined(GRID_X_BITS) && GRID_X_BITS <= GLITTER_INPUT_BITS +# define INPUT_TO_GRID_X(in, out) (out) = (in) >> (GLITTER_INPUT_BITS - GRID_X_BITS) +#else +# define INPUT_TO_GRID_X(in, out) INPUT_TO_GRID_general(in, out, GRID_X) +#endif + +#define INPUT_TO_GRID_general(in, out, grid_scale) do { \ + long long tmp__ = (long long)(grid_scale) * (in); \ + tmp__ >>= GLITTER_INPUT_BITS; \ + (out) = tmp__; \ +} while (0) + +static void +glitter_scan_converter_add_edge (glitter_scan_converter_t *converter, + const cairo_edge_t *edge, + int clip) +{ + cairo_edge_t e; + + INPUT_TO_GRID_Y (edge->top, e.top); + INPUT_TO_GRID_Y (edge->bottom, e.bottom); + if (e.top >= e.bottom) + return; + + /* XXX: possible overflows if GRID_X/Y > 2**GLITTER_INPUT_BITS */ + INPUT_TO_GRID_Y (edge->line.p1.y, e.line.p1.y); + INPUT_TO_GRID_Y (edge->line.p2.y, e.line.p2.y); + if (e.line.p1.y == e.line.p2.y) + return; + + INPUT_TO_GRID_X (edge->line.p1.x, e.line.p1.x); + INPUT_TO_GRID_X (edge->line.p2.x, e.line.p2.x); + + e.dir = edge->dir; + + polygon_add_edge (converter->polygon, &e, clip); +} + +static cairo_bool_t +active_list_is_vertical (struct active_list *active) +{ + struct edge *e; + + for (e = active->head; e != NULL; e = e->next) { + if (! e->vertical) + return FALSE; + } + + return TRUE; +} + +static void +step_edges (struct active_list *active, int count) +{ + struct edge **cursor = &active->head; + struct edge *edge; + + for (edge = *cursor; edge != NULL; edge = *cursor) { + edge->height_left -= GRID_Y * count; + if (edge->height_left) + cursor = &edge->next; + else + *cursor = edge->next; + } +} + +static cairo_status_t +blit_coverages (struct cell_list *cells, + cairo_span_renderer_t *renderer, + struct pool *span_pool, + int y, int height) +{ + struct cell *cell = cells->head.next; + int prev_x = -1; + int cover = 0, last_cover = 0; + int clip = 0; + cairo_half_open_span_t *spans; + unsigned num_spans; + + assert (cell != &cells->tail); + + /* Count number of cells remaining. */ + { + struct cell *next = cell; + num_spans = 2; + while (next->next) { + next = next->next; + ++num_spans; + } + num_spans = 2*num_spans; + } + + /* Allocate enough spans for the row. */ + pool_reset (span_pool); + spans = pool_alloc (span_pool, sizeof(spans[0])*num_spans); + num_spans = 0; + + /* Form the spans from the coverages and areas. */ + for (; cell->next; cell = cell->next) { + int x = cell->x; + int area; + + if (x > prev_x && cover != last_cover) { + spans[num_spans].x = prev_x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (cover); + spans[num_spans].inverse = 0; + last_cover = cover; + ++num_spans; + } + + cover += cell->covered_height*GRID_X*2; + clip += cell->covered_height*GRID_X*2; + area = cover - cell->uncovered_area; + + if (area != last_cover) { + spans[num_spans].x = x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (area); + spans[num_spans].inverse = 0; + last_cover = area; + ++num_spans; + } + + prev_x = x+1; + } + + /* Dump them into the renderer. */ + return renderer->render_rows (renderer, y, height, spans, num_spans); +} + +static void +glitter_scan_converter_render(glitter_scan_converter_t *converter, + int nonzero_fill, + cairo_span_renderer_t *span_renderer, + struct pool *span_pool) +{ + int i, j; + int ymax_i = converter->ymax / GRID_Y; + int ymin_i = converter->ymin / GRID_Y; + int h = ymax_i - ymin_i; + struct polygon *polygon = converter->polygon; + struct cell_list *coverages = converter->coverages; + struct active_list *active = converter->active; + + /* Render each pixel row. */ + for (i = 0; i < h; i = j) { + int do_full_step = 0; + + j = i + 1; + + /* Determine if we can ignore this row or use the full pixel + * stepper. */ + if (GRID_Y == EDGE_Y_BUCKET_HEIGHT && ! polygon->y_buckets[i]) { + if (! active->head) { + for (; j < h && ! polygon->y_buckets[j]; j++) + ; + continue; + } + + do_full_step = active_list_can_step_full_row (active); + } + + if (do_full_step) { + /* Step by a full pixel row's worth. */ + if (nonzero_fill) + apply_nonzero_fill_rule_and_step_edges (active, coverages); + else + apply_evenodd_fill_rule_and_step_edges (active, coverages); + + if (active_list_is_vertical (active)) { + while (j < h && + polygon->y_buckets[j] == NULL && + active->min_height >= 2*GRID_Y) + { + active->min_height -= GRID_Y; + j++; + } + if (j != i + 1) + step_edges (active, j - (i + 1)); + } + } else { + grid_scaled_y_t suby; + + /* Subsample this row. */ + for (suby = 0; suby < GRID_Y; suby++) { + grid_scaled_y_t y = (i+ymin_i)*GRID_Y + suby; + + if (polygon->y_buckets[i]) { + active_list_merge_edges_from_polygon (active, + &polygon->y_buckets[i], y, + polygon); + } + + if (nonzero_fill) + apply_nonzero_fill_rule_for_subrow (active, coverages); + else + apply_evenodd_fill_rule_for_subrow (active, coverages); + + active_list_substep_edges(active); + } + } + + blit_coverages (coverages, span_renderer, span_pool, i+ymin_i, j -i); + cell_list_reset (coverages); + + if (! active->head) + active->min_height = INT_MAX; + else + active->min_height -= GRID_Y; + } +} + +struct _cairo_clip_tor_scan_converter { + cairo_scan_converter_t base; + + glitter_scan_converter_t converter[1]; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + + cairo_fill_rule_t clip_fill_rule; + cairo_antialias_t clip_antialias; + + jmp_buf jmp; + + struct { + struct pool base[1]; + cairo_half_open_span_t embedded[32]; + } span_pool; +}; + +typedef struct _cairo_clip_tor_scan_converter cairo_clip_tor_scan_converter_t; + +static void +_cairo_clip_tor_scan_converter_destroy (void *converter) +{ + cairo_clip_tor_scan_converter_t *self = converter; + if (self == NULL) { + return; + } + _glitter_scan_converter_fini (self->converter); + pool_fini (self->span_pool.base); + free(self); +} + +static cairo_status_t +_cairo_clip_tor_scan_converter_generate (void *converter, + cairo_span_renderer_t *renderer) +{ + cairo_clip_tor_scan_converter_t *self = converter; + cairo_status_t status; + + if ((status = setjmp (self->jmp))) + return _cairo_scan_converter_set_error (self, _cairo_error (status)); + + glitter_scan_converter_render (self->converter, + self->fill_rule == CAIRO_FILL_RULE_WINDING, + renderer, + self->span_pool.base); + return CAIRO_STATUS_SUCCESS; +} + +cairo_scan_converter_t * +_cairo_clip_tor_scan_converter_create (cairo_clip_t *clip, + cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias) +{ + cairo_clip_tor_scan_converter_t *self; + cairo_polygon_t clipper; + cairo_status_t status; + int i; + + self = calloc (1, sizeof(struct _cairo_clip_tor_scan_converter)); + if (unlikely (self == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto bail_nomem; + } + + self->base.destroy = _cairo_clip_tor_scan_converter_destroy; + self->base.generate = _cairo_clip_tor_scan_converter_generate; + + pool_init (self->span_pool.base, &self->jmp, + 250 * sizeof(self->span_pool.embedded[0]), + sizeof(self->span_pool.embedded)); + + _glitter_scan_converter_init (self->converter, &self->jmp); + status = glitter_scan_converter_reset (self->converter, + clip->extents.y, + clip->extents.y + clip->extents.height); + if (unlikely (status)) + goto bail; + + self->fill_rule = fill_rule; + self->antialias = antialias; + + for (i = 0; i < polygon->num_edges; i++) + glitter_scan_converter_add_edge (self->converter, + &polygon->edges[i], + FALSE); + + status = _cairo_clip_get_polygon (clip, + &clipper, + &self->clip_fill_rule, + &self->clip_antialias); + if (unlikely (status)) + goto bail; + + for (i = 0; i < clipper.num_edges; i++) + glitter_scan_converter_add_edge (self->converter, + &clipper.edges[i], + TRUE); + _cairo_polygon_fini (&clipper); + + return &self->base; + + bail: + self->base.destroy(&self->base); + bail_nomem: + return _cairo_scan_converter_create_in_error (status); +} + diff --git a/src/cairo-clip.c b/src/cairo-clip.c new file mode 100644 index 000000000..0df9b06bf --- /dev/null +++ b/src/cairo-clip.c @@ -0,0 +1,838 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-gstate-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-pattern-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-region-private.h" + +static freed_pool_t clip_path_pool; +static freed_pool_t clip_pool; + +const cairo_clip_t __cairo_clip_all; + +static cairo_clip_path_t * +_cairo_clip_path_create (cairo_clip_t *clip) +{ + cairo_clip_path_t *clip_path; + + clip_path = _freed_pool_get (&clip_path_pool); + if (unlikely (clip_path == NULL)) { + clip_path = malloc (sizeof (cairo_clip_path_t)); + if (unlikely (clip_path == NULL)) + return NULL; + } + + CAIRO_REFERENCE_COUNT_INIT (&clip_path->ref_count, 1); + + clip_path->prev = clip->path; + clip->path = clip_path; + + return clip_path; +} + +cairo_clip_path_t * +_cairo_clip_path_reference (cairo_clip_path_t *clip_path) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&clip_path->ref_count)); + + _cairo_reference_count_inc (&clip_path->ref_count); + + return clip_path; +} + +void +_cairo_clip_path_destroy (cairo_clip_path_t *clip_path) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&clip_path->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&clip_path->ref_count)) + return; + + _cairo_path_fixed_fini (&clip_path->path); + + if (clip_path->prev != NULL) + _cairo_clip_path_destroy (clip_path->prev); + + _freed_pool_put (&clip_path_pool, clip_path); +} + +cairo_clip_t * +_cairo_clip_create (void) +{ + cairo_clip_t *clip; + + clip = _freed_pool_get (&clip_pool); + if (unlikely (clip == NULL)) { + clip = malloc (sizeof (cairo_clip_t)); + if (unlikely (clip == NULL)) + return NULL; + } + + clip->extents = _cairo_unbounded_rectangle; + + clip->path = NULL; + clip->boxes = NULL; + clip->num_boxes = 0; + clip->region = NULL; + clip->is_region = FALSE; + + return clip; +} + +void +_cairo_clip_destroy (cairo_clip_t *clip) +{ + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return; + + if (clip->path != NULL) + _cairo_clip_path_destroy (clip->path); + + if (clip->boxes != &clip->embedded_box) + free (clip->boxes); + cairo_region_destroy (clip->region); + + _freed_pool_put (&clip_pool, clip); +} + +cairo_clip_t * +_cairo_clip_copy (const cairo_clip_t *clip) +{ + cairo_clip_t *copy; + + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return (cairo_clip_t *) clip; + + copy = _cairo_clip_create (); + + if (clip->path) + copy->path = _cairo_clip_path_reference (clip->path); + + if (clip->num_boxes) { + if (clip->num_boxes == 1) { + copy->boxes = ©->embedded_box; + } else { + copy->boxes = _cairo_malloc_ab (clip->num_boxes, sizeof (cairo_box_t)); + if (unlikely (copy->boxes == NULL)) + return _cairo_clip_set_all_clipped (copy); + } + + memcpy (copy->boxes, clip->boxes, + clip->num_boxes * sizeof (cairo_box_t)); + copy->num_boxes = clip->num_boxes; + } + + copy->extents = clip->extents; + copy->region = cairo_region_reference (clip->region); + copy->is_region = clip->is_region; + + return copy; +} + +cairo_clip_t * +_cairo_clip_copy_path (const cairo_clip_t *clip) +{ + cairo_clip_t *copy; + + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return (cairo_clip_t *) clip; + + assert (clip->num_boxes); + + copy = _cairo_clip_create (); + copy->extents = clip->extents; + if (clip->path) + copy->path = _cairo_clip_path_reference (clip->path); + + return copy; +} + +cairo_clip_t * +_cairo_clip_copy_region (const cairo_clip_t *clip) +{ + cairo_clip_t *copy; + int i; + + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return (cairo_clip_t *) clip; + + assert (clip->num_boxes); + + copy = _cairo_clip_create (); + copy->extents = clip->extents; + + if (clip->num_boxes == 1) { + copy->boxes = ©->embedded_box; + } else { + copy->boxes = _cairo_malloc_ab (clip->num_boxes, sizeof (cairo_box_t)); + if (unlikely (copy->boxes == NULL)) + return _cairo_clip_set_all_clipped (copy); + } + + for (i = 0; i < clip->num_boxes; i++) { + copy->boxes[i].p1.x = _cairo_fixed_floor (clip->boxes[i].p1.x); + copy->boxes[i].p1.y = _cairo_fixed_floor (clip->boxes[i].p1.y); + copy->boxes[i].p2.x = _cairo_fixed_ceil (clip->boxes[i].p2.x); + copy->boxes[i].p2.y = _cairo_fixed_ceil (clip->boxes[i].p2.y); + } + copy->num_boxes = clip->num_boxes; + + copy->region = cairo_region_reference (clip->region); + copy->is_region = TRUE; + + return copy; +} + +cairo_clip_t * +_cairo_clip_intersect_path (cairo_clip_t *clip, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_clip_path_t *clip_path; + cairo_status_t status; + cairo_rectangle_int_t extents; + cairo_box_t box; + + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + /* catch the empty clip path */ + if (_cairo_path_fixed_fill_is_empty (path)) + return _cairo_clip_set_all_clipped (clip); + + if (_cairo_path_fixed_is_box (path, &box)) { + if (antialias == CAIRO_ANTIALIAS_NONE) { + box.p1.x = _cairo_fixed_round_down (box.p1.x); + box.p1.y = _cairo_fixed_round_down (box.p1.y); + box.p2.x = _cairo_fixed_round_down (box.p2.x); + box.p2.y = _cairo_fixed_round_down (box.p2.y); + } + + return _cairo_clip_intersect_box (clip, &box); + } + if (_cairo_path_fixed_fill_is_rectilinear (path)) + return _cairo_clip_intersect_rectilinear_path (clip, path, + fill_rule, antialias); + + _cairo_path_fixed_approximate_clip_extents (path, &extents); + if (extents.width == 0 || extents.height == 0) + return _cairo_clip_set_all_clipped (clip); + + clip = _cairo_clip_intersect_rectangle (clip, &extents); + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + clip_path = _cairo_clip_path_create (clip); + if (unlikely (clip_path == NULL)) + return _cairo_clip_set_all_clipped (clip); + + status = _cairo_path_fixed_init_copy (&clip_path->path, path); + if (unlikely (status)) + return _cairo_clip_set_all_clipped (clip); + + clip_path->fill_rule = fill_rule; + clip_path->tolerance = tolerance; + clip_path->antialias = antialias; + + if (clip->region) { + cairo_region_destroy (clip->region); + clip->region = NULL; + } + + clip->is_region = FALSE; + return clip; +} + +static cairo_clip_t * +_cairo_clip_intersect_clip_path (cairo_clip_t *clip, + const cairo_clip_path_t *clip_path) +{ + if (clip_path->prev) + clip = _cairo_clip_intersect_clip_path (clip, clip_path->prev); + + return _cairo_clip_intersect_path (clip, + &clip_path->path, + clip_path->fill_rule, + clip_path->tolerance, + clip_path->antialias); +} + +cairo_clip_t * +_cairo_clip_intersect_clip (cairo_clip_t *clip, + const cairo_clip_t *other) +{ + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + if (other == NULL) + return clip; + + if (clip == NULL) + return _cairo_clip_copy (other); + + if (_cairo_clip_is_all_clipped (other)) + return _cairo_clip_set_all_clipped (clip); + + if (! _cairo_rectangle_intersect (&clip->extents, &other->extents)) + return _cairo_clip_set_all_clipped (clip); + + if (other->num_boxes) { + cairo_boxes_t boxes; + + _cairo_boxes_init_for_array (&boxes, other->boxes, other->num_boxes); + clip = _cairo_clip_intersect_boxes (clip, &boxes); + } + + if (! _cairo_clip_is_all_clipped (clip)) { + if (other->path) { + if (clip->path == NULL) + clip->path = _cairo_clip_path_reference (other->path); + else + clip = _cairo_clip_intersect_clip_path (clip, other->path); + } + } + + if (clip->region) { + cairo_region_destroy (clip->region); + clip->region = NULL; + } + clip->is_region = FALSE; + + return clip; +} + +cairo_bool_t +_cairo_clip_equal (const cairo_clip_t *clip_a, + const cairo_clip_t *clip_b) +{ + const cairo_clip_path_t *cp_a, *cp_b; + + /* are both all-clipped or no-clip? */ + if (clip_a == clip_b) + return TRUE; + + /* or just one of them? */ + if (clip_a == NULL || clip_b == NULL || + _cairo_clip_is_all_clipped (clip_a) || + _cairo_clip_is_all_clipped (clip_b)) + { + return FALSE; + } + + /* We have a pair of normal clips, check their contents */ + + if (clip_a->num_boxes != clip_b->num_boxes) + return FALSE; + + if (memcmp (clip_a->boxes, clip_b->boxes, + sizeof (cairo_box_t) * clip_a->num_boxes)) + return FALSE; + + cp_a = clip_a->path; + cp_b = clip_b->path; + while (cp_a && cp_b) { + if (cp_a == cp_b) + return TRUE; + + /* XXX compare reduced polygons? */ + + if (cp_a->antialias != cp_b->antialias) + return FALSE; + + if (cp_a->tolerance != cp_b->tolerance) + return FALSE; + + if (cp_a->fill_rule != cp_b->fill_rule) + return FALSE; + + if (! _cairo_path_fixed_equal (&cp_a->path, + &cp_b->path)) + return FALSE; + + cp_a = cp_a->prev; + cp_b = cp_b->prev; + } + + return cp_a == NULL && cp_b == NULL; +} + +static cairo_clip_t * +_cairo_clip_path_copy_with_translation (cairo_clip_t *clip, + cairo_clip_path_t *other_path, + int fx, int fy) +{ + cairo_status_t status; + cairo_clip_path_t *clip_path; + + if (other_path->prev != NULL) + clip = _cairo_clip_path_copy_with_translation (clip, other_path->prev, + fx, fy); + if (_cairo_clip_is_all_clipped (clip)) + return clip; + + clip_path = _cairo_clip_path_create (clip); + if (unlikely (clip_path == NULL)) + return _cairo_clip_set_all_clipped (clip); + + status = _cairo_path_fixed_init_copy (&clip_path->path, + &other_path->path); + if (unlikely (status)) + return _cairo_clip_set_all_clipped (clip); + + _cairo_path_fixed_translate (&clip_path->path, fx, fy); + + clip_path->fill_rule = other_path->fill_rule; + clip_path->tolerance = other_path->tolerance; + clip_path->antialias = other_path->antialias; + + return clip; +} + +cairo_clip_t * +_cairo_clip_translate (cairo_clip_t *clip, int tx, int ty) +{ + int fx, fy, i; + cairo_clip_path_t *clip_path; + + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return clip; + + if (tx == 0 && ty == 0) + return clip; + + fx = _cairo_fixed_from_int (tx); + fy = _cairo_fixed_from_int (ty); + + for (i = 0; i < clip->num_boxes; i++) { + clip->boxes[i].p1.x += fx; + clip->boxes[i].p2.x += fx; + clip->boxes[i].p1.y += fy; + clip->boxes[i].p2.y += fy; + } + + clip->extents.x += tx; + clip->extents.y += ty; + + if (clip->path == NULL) + return clip; + + clip_path = clip->path; + clip->path = NULL; + clip = _cairo_clip_path_copy_with_translation (clip, clip_path, fx, fy); + _cairo_clip_path_destroy (clip_path); + + return clip; +} + +static cairo_status_t +_cairo_path_fixed_add_box (cairo_path_fixed_t *path, + const cairo_box_t *box) +{ + cairo_status_t status; + + status = _cairo_path_fixed_move_to (path, box->p1.x, box->p1.y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x, box->p1.y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x, box->p2.y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p1.x, box->p2.y); + if (unlikely (status)) + return status; + + return _cairo_path_fixed_close_path (path); +} + +static cairo_status_t +_cairo_path_fixed_init_from_boxes (cairo_path_fixed_t *path, + const cairo_boxes_t *boxes) +{ + cairo_status_t status; + const struct _cairo_boxes_chunk *chunk; + int i; + + _cairo_path_fixed_init (path); + if (boxes->num_boxes == 0) + return CAIRO_STATUS_SUCCESS; + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + status = _cairo_path_fixed_add_box (path, &chunk->base[i]); + if (unlikely (status)) { + _cairo_path_fixed_fini (path); + return status; + } + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_clip_t * +_cairo_clip_intersect_clip_path_transformed (cairo_clip_t *clip, + const cairo_clip_path_t *clip_path, + const cairo_matrix_t *m) +{ + cairo_path_fixed_t path; + + if (clip_path->prev) + clip = _cairo_clip_intersect_clip_path_transformed (clip, + clip_path->prev, + m); + + if (_cairo_path_fixed_init_copy (&path, &clip_path->path)) + return _cairo_clip_set_all_clipped (clip); + + _cairo_path_fixed_transform (&path, m); + + clip = _cairo_clip_intersect_path (clip, + &path, + clip_path->fill_rule, + clip_path->tolerance, + clip_path->antialias); + _cairo_path_fixed_fini (&path); + + return clip; +} + +cairo_clip_t * +_cairo_clip_transform (cairo_clip_t *clip, const cairo_matrix_t *m) +{ + cairo_clip_t *copy; + + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return clip; + + if (_cairo_matrix_is_translation (m)) + return _cairo_clip_translate (clip, m->x0, m->y0); + + copy = _cairo_clip_create (); + + if (clip->num_boxes) { + cairo_path_fixed_t path; + cairo_boxes_t boxes; + + _cairo_boxes_init_for_array (&boxes, clip->boxes, clip->num_boxes); + _cairo_path_fixed_init_from_boxes (&path, &boxes); + _cairo_path_fixed_transform (&path, m); + + copy = _cairo_clip_intersect_path (copy, &path, + CAIRO_FILL_RULE_WINDING, + 0.1, + CAIRO_ANTIALIAS_DEFAULT); + + _cairo_path_fixed_fini (&path); + } + + if (clip->path) + copy = _cairo_clip_intersect_clip_path_transformed (copy, clip->path,m); + + _cairo_clip_destroy (clip); + return copy; +} + +cairo_clip_t * +_cairo_clip_copy_with_translation (const cairo_clip_t *clip, int tx, int ty) +{ + cairo_clip_t *copy; + int fx, fy, i; + + if (clip == NULL || _cairo_clip_is_all_clipped (clip)) + return (cairo_clip_t *)clip; + + if (tx == 0 && ty == 0) + return _cairo_clip_copy (clip); + + copy = _cairo_clip_create (); + if (copy == NULL) + return _cairo_clip_set_all_clipped (copy); + + fx = _cairo_fixed_from_int (tx); + fy = _cairo_fixed_from_int (ty); + + if (clip->num_boxes) { + if (clip->num_boxes == 1) { + copy->boxes = ©->embedded_box; + } else { + copy->boxes = _cairo_malloc_ab (clip->num_boxes, sizeof (cairo_box_t)); + if (unlikely (copy->boxes == NULL)) + return _cairo_clip_set_all_clipped (copy); + } + + for (i = 0; i < clip->num_boxes; i++) { + copy->boxes[i].p1.x = clip->boxes[i].p1.x + fx; + copy->boxes[i].p2.x = clip->boxes[i].p2.x + fx; + copy->boxes[i].p1.y = clip->boxes[i].p1.y + fy; + copy->boxes[i].p2.y = clip->boxes[i].p2.y + fy; + } + copy->num_boxes = clip->num_boxes; + } + + copy->extents = clip->extents; + copy->extents.x += tx; + copy->extents.y += ty; + + if (clip->path == NULL) + return copy; + + return _cairo_clip_path_copy_with_translation (copy, clip->path, fx, fy); +} + +cairo_bool_t +_cairo_clip_contains_extents (const cairo_clip_t *clip, + const cairo_composite_rectangles_t *extents) +{ + const cairo_rectangle_int_t *rect; + + rect = extents->is_bounded ? &extents->bounded : &extents->unbounded; + return _cairo_clip_contains_rectangle (clip, rect); +} + +void +_cairo_debug_print_clip (FILE *stream, const cairo_clip_t *clip) +{ + int i; + + if (clip == NULL) { + fprintf (stream, "no clip\n"); + return; + } + + if (_cairo_clip_is_all_clipped (clip)) { + fprintf (stream, "clip: all-clipped\n"); + return; + } + + fprintf (stream, "clip:\n"); + fprintf (stream, " extents: (%d, %d) x (%d, %d), is-region? %d", + clip->extents.x, clip->extents.y, + clip->extents.width, clip->extents.height, + clip->is_region); + + fprintf (stream, " num_boxes = %d\n", clip->num_boxes); + for (i = 0; i < clip->num_boxes; i++) { + fprintf (stream, " [%d] = (%f, %f), (%f, %f)\n", i, + _cairo_fixed_to_double (clip->boxes[i].p1.x), + _cairo_fixed_to_double (clip->boxes[i].p1.y), + _cairo_fixed_to_double (clip->boxes[i].p2.x), + _cairo_fixed_to_double (clip->boxes[i].p2.y)); + } + + if (clip->path) { + cairo_clip_path_t *clip_path = clip->path; + do { + fprintf (stream, "path: aa=%d, tolerance=%f, rule=%d: ", + clip_path->antialias, + clip_path->tolerance, + clip_path->fill_rule); + _cairo_debug_print_path (stream, &clip_path->path); + fprintf (stream, "\n"); + } while ((clip_path = clip_path->prev) != NULL); + } +} + +const cairo_rectangle_int_t * +_cairo_clip_get_extents (const cairo_clip_t *clip) +{ + if (clip == NULL) + return &_cairo_unbounded_rectangle; + + if (_cairo_clip_is_all_clipped (clip)) + return &_cairo_empty_rectangle; + + return &clip->extents; +} + +const cairo_rectangle_list_t _cairo_rectangles_nil = + { CAIRO_STATUS_NO_MEMORY, NULL, 0 }; +static const cairo_rectangle_list_t _cairo_rectangles_not_representable = + { CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, NULL, 0 }; + +static cairo_bool_t +_cairo_clip_int_rect_to_user (cairo_gstate_t *gstate, + cairo_rectangle_int_t *clip_rect, + cairo_rectangle_t *user_rect) +{ + cairo_bool_t is_tight; + + double x1 = clip_rect->x; + double y1 = clip_rect->y; + double x2 = clip_rect->x + (int) clip_rect->width; + double y2 = clip_rect->y + (int) clip_rect->height; + + _cairo_gstate_backend_to_user_rectangle (gstate, + &x1, &y1, &x2, &y2, + &is_tight); + + user_rect->x = x1; + user_rect->y = y1; + user_rect->width = x2 - x1; + user_rect->height = y2 - y1; + + return is_tight; +} + +cairo_rectangle_list_t * +_cairo_rectangle_list_create_in_error (cairo_status_t status) +{ + cairo_rectangle_list_t *list; + + if (status == CAIRO_STATUS_NO_MEMORY) + return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; + if (status == CAIRO_STATUS_CLIP_NOT_REPRESENTABLE) + return (cairo_rectangle_list_t*) &_cairo_rectangles_not_representable; + + list = malloc (sizeof (*list)); + if (unlikely (list == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; + } + + list->status = status; + list->rectangles = NULL; + list->num_rectangles = 0; + + return list; +} + +cairo_rectangle_list_t * +_cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate) +{ +#define ERROR_LIST(S) _cairo_rectangle_list_create_in_error (_cairo_error (S)) + + cairo_rectangle_list_t *list; + cairo_rectangle_t *rectangles = NULL; + cairo_region_t *region = NULL; + int n_rects = 0; + int i; + + if (clip == NULL) + return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); + + if (_cairo_clip_is_all_clipped (clip)) + goto DONE; + + if (! _cairo_clip_is_region (clip)) + return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); + + region = _cairo_clip_get_region (clip); + if (region == NULL) + return ERROR_LIST (CAIRO_STATUS_NO_MEMORY); + + n_rects = cairo_region_num_rectangles (region); + if (n_rects) { + rectangles = _cairo_malloc_ab (n_rects, sizeof (cairo_rectangle_t)); + if (unlikely (rectangles == NULL)) { + return ERROR_LIST (CAIRO_STATUS_NO_MEMORY); + } + + for (i = 0; i < n_rects; ++i) { + cairo_rectangle_int_t clip_rect; + + cairo_region_get_rectangle (region, i, &clip_rect); + + if (! _cairo_clip_int_rect_to_user (gstate, + &clip_rect, + &rectangles[i])) + { + free (rectangles); + return ERROR_LIST (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); + } + } + } + + DONE: + list = malloc (sizeof (cairo_rectangle_list_t)); + if (unlikely (list == NULL)) { + free (rectangles); + return ERROR_LIST (CAIRO_STATUS_NO_MEMORY); + } + + list->status = CAIRO_STATUS_SUCCESS; + list->rectangles = rectangles; + list->num_rectangles = n_rects; + return list; + +#undef ERROR_LIST +} + +/** + * cairo_rectangle_list_destroy: + * @rectangle_list: a rectangle list, as obtained from cairo_copy_clip_rectangle_list() + * + * Unconditionally frees @rectangle_list and all associated + * references. After this call, the @rectangle_list pointer must not + * be dereferenced. + * + * Since: 1.4 + **/ +void +cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list) +{ + if (rectangle_list == NULL || rectangle_list == &_cairo_rectangles_nil || + rectangle_list == &_cairo_rectangles_not_representable) + return; + + free (rectangle_list->rectangles); + free (rectangle_list); +} + +void +_cairo_clip_reset_static_data (void) +{ + _freed_pool_reset (&clip_path_pool); + _freed_pool_reset (&clip_pool); +} diff --git a/src/cairo-cogl-context-private.h b/src/cairo-cogl-context-private.h new file mode 100644 index 000000000..0a7185ef1 --- /dev/null +++ b/src/cairo-cogl-context-private.h @@ -0,0 +1,52 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ + +#ifndef CAIRO_COGL_CONTEXT_PRIVATE_H +#define CAIRO_COGL_CONTEXT_PRIVATE_H + +#include "cairo-default-context-private.h" +#include "cairo-cogl-private.h" + +typedef struct _cairo_cogl_context { + cairo_default_context_t base; + + cairo_cogl_device_t *dev; + int path_ctm_age; + cairo_path_fixed_t user_path; + + cairo_bool_t path_is_rectangle; + double x, y, width, height; +} cairo_cogl_context_t; + +cairo_t * +_cairo_cogl_context_create (void *target); + +#endif /* CAIRO_COGL_CONTEXT_PRIVATE_H */ diff --git a/src/cairo-cogl-context.c b/src/cairo-cogl-context.c new file mode 100644 index 000000000..0116b0a5a --- /dev/null +++ b/src/cairo-cogl-context.c @@ -0,0 +1,822 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ + +/* so long as we can verify that the ctm doesn't change multiple times + * during the construction of a path we can build a shadow + * #cairo_path_fixed_t in user coordinates that we can use to create a + * hash value for caching tessellations of that path. + * + * We need to hook into all the points where the ctm can be changed + * so we can bump a cr->path_ctm_age counter. + * + * We need to hook into all the points where the path can be modified + * so we can catch the start of a path and reset the cr->path_ctm_age + * counter at that point. + * + * When a draw operation is hit we can then check that the + * path_ctm_age == 0 and if so we create a hash of the path. + * + * We use this hash to lookup a #cairo_cogl_path_meta_t struct which + * may contain tessellated triangles for the path or may just contain + * a count of how many times the path has been re-seen (we only cache + * tessellated triangles if there is evidence that the path is being + * used multiple times because there is a cost involved in allocating + * a separate buffer for the triangles). + */ + +#include "cairoint.h" + +#include "cairo-cogl-context-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-arc-private.h" +#include "cairo-path-fixed-private.h" + +#include + +static freed_pool_t context_pool; + +void +_cairo_cogl_context_reset_static_data (void) +{ + _freed_pool_reset (&context_pool); +} + +static cairo_status_t +_cairo_cogl_context_rectangle_real (cairo_cogl_context_t *cr, + double x, double y, + double width, double height) +{ + cairo_status_t status; + status = cr->dev->backend_parent.rectangle (cr, x, y, width, height); + if (unlikely (status)) + return status; + + return _cairo_cogl_path_fixed_rectangle (&cr->user_path, + _cairo_fixed_from_double (x), + _cairo_fixed_from_double (y), + _cairo_fixed_from_double (width), + _cairo_fixed_from_double (height)); +} + +/* The idea here is that we have a simplified way of tracking rectangle paths + * because rectangles are perhaps the most common shape drawn with cairo. + * + * Basically we have a speculative store for a rectangle path that doesn't + * need to use the #cairo_path_fixed_t api to describe a rectangle in terms of + * (move_to,rel_line_to,rel_line_to,_rel_line_to,close) because if you profile + * heavy rectangle drawing with Cairo that process can be overly expensive. + * + * If the user asks to add more than just a rectangle to their current path + * then we "flush" any speculative rectangle stored into the current path + * before continuing to append their operations. + * + * In addition to the speculative store cairo-cogl also has a fast-path + * fill_rectangle drawing operation that further aims to minimize the cost + * of drawing rectangles. + */ +static cairo_status_t +_flush_cr_rectangle (cairo_cogl_context_t *cr) +{ + if (!cr->path_is_rectangle) + return CAIRO_STATUS_SUCCESS; + + cr->path_is_rectangle = FALSE; + return _cairo_cogl_context_rectangle_real (cr, cr->x, cr->y, cr->width, cr->height); +} + +static cairo_status_t +_cairo_cogl_context_restore (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.restore (abstract_cr); +} + +static cairo_status_t +_cairo_cogl_context_translate (void *abstract_cr, double tx, double ty) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.translate (abstract_cr, tx, ty); +} + +static cairo_status_t +_cairo_cogl_context_scale (void *abstract_cr, double sx, double sy) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.scale (abstract_cr, sx, sy); +} + +static cairo_status_t +_cairo_cogl_context_rotate (void *abstract_cr, double theta) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.rotate (abstract_cr, theta); +} + +static cairo_status_t +_cairo_cogl_context_transform (void *abstract_cr, const cairo_matrix_t *matrix) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.transform (abstract_cr, matrix); +} + +static cairo_status_t +_cairo_cogl_context_set_matrix (void *abstract_cr, const cairo_matrix_t *matrix) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.set_matrix (abstract_cr, matrix); +} + +static cairo_status_t +_cairo_cogl_context_set_identity_matrix (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + cr->path_ctm_age++; + return cr->dev->backend_parent.set_identity_matrix (abstract_cr); +} + +static cairo_status_t +_cairo_cogl_context_new_path (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.new_path (abstract_cr); + if (unlikely (status)) + return status; + + _cairo_path_fixed_fini (&cr->user_path); + _cairo_path_fixed_init (&cr->user_path); + cr->path_is_rectangle = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_context_new_sub_path (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.new_sub_path (abstract_cr); + if (unlikely (status)) + return status; + + _cairo_path_fixed_new_sub_path (&cr->user_path); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_context_move_to (void *abstract_cr, double x, double y) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_fixed_t x_fixed, y_fixed; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.move_to (abstract_cr, x, y); + if (unlikely (status)) + return status; + + x_fixed = _cairo_fixed_from_double (x); + y_fixed = _cairo_fixed_from_double (y); + + return _cairo_path_fixed_move_to (&cr->user_path, x_fixed, y_fixed); +} + +static cairo_status_t +_cairo_cogl_context_line_to (void *abstract_cr, double x, double y) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_fixed_t x_fixed, y_fixed; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.line_to (abstract_cr, x, y); + if (unlikely (status)) + return status; + + x_fixed = _cairo_fixed_from_double (x); + y_fixed = _cairo_fixed_from_double (y); + + if (cr->user_path.buf.base.num_ops == 0) + cr->path_ctm_age = 0; + + return _cairo_path_fixed_line_to (&cr->user_path, x_fixed, y_fixed); +} + +static cairo_status_t +_cairo_cogl_context_curve_to (void *abstract_cr, + double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_fixed_t x1_fixed, y1_fixed; + cairo_fixed_t x2_fixed, y2_fixed; + cairo_fixed_t x3_fixed, y3_fixed; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.curve_to (abstract_cr, x1, y1, x2, y2, x3, y3); + if (unlikely (status)) + return status; + + x1_fixed = _cairo_fixed_from_double (x1); + y1_fixed = _cairo_fixed_from_double (y1); + + x2_fixed = _cairo_fixed_from_double (x2); + y2_fixed = _cairo_fixed_from_double (y2); + + x3_fixed = _cairo_fixed_from_double (x3); + y3_fixed = _cairo_fixed_from_double (y3); + + if (cr->user_path.buf.base.num_ops == 0) + cr->path_ctm_age = 0; + + return _cairo_path_fixed_curve_to (&cr->user_path, + x1_fixed, y1_fixed, + x2_fixed, y2_fixed, + x3_fixed, y3_fixed); +} + +static cairo_status_t +_cairo_cogl_context_arc (void *abstract_cr, + double xc, double yc, double radius, + double angle1, double angle2, + cairo_bool_t forward) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.arc (abstract_cr, xc, yc, radius, angle1, angle2, forward); + if (unlikely (status)) + return status; + + if (cr->user_path.buf.base.num_ops == 0) + cr->path_ctm_age = 0; + + /* Do nothing, successfully, if radius is <= 0 */ + if (radius <= 0.0) { + cairo_fixed_t x_fixed, y_fixed; + + x_fixed = _cairo_fixed_from_double (xc); + y_fixed = _cairo_fixed_from_double (yc); + status = _cairo_path_fixed_line_to (&cr->user_path, x_fixed, y_fixed); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (&cr->user_path, x_fixed, y_fixed); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_cogl_context_line_to (cr, + xc + radius * cos (angle1), + yc + radius * sin (angle1)); + + if (unlikely (status)) + return status; + + if (forward) + _cairo_arc_path (&cr->base.base, xc, yc, radius, angle1, angle2); + else + _cairo_arc_path_negative (&cr->base.base, xc, yc, radius, angle1, angle2); + + return CAIRO_STATUS_SUCCESS; /* any error will have already been set on cr */ +} + +static cairo_status_t +_cairo_cogl_context_rel_move_to (void *abstract_cr, double dx, double dy) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_fixed_t dx_fixed, dy_fixed; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.rel_move_to (abstract_cr, dx, dy); + if (unlikely (status)) + return status; + + dx_fixed = _cairo_fixed_from_double (dx); + dy_fixed = _cairo_fixed_from_double (dy); + + return _cairo_path_fixed_rel_move_to (&cr->user_path, dx_fixed, dy_fixed); +} + +static cairo_status_t +_cairo_cogl_context_rel_line_to (void *abstract_cr, double dx, double dy) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_fixed_t dx_fixed, dy_fixed; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.rel_line_to (abstract_cr, dx, dy); + if (unlikely (status)) + return status; + + dx_fixed = _cairo_fixed_from_double (dx); + dy_fixed = _cairo_fixed_from_double (dy); + + if (cr->user_path.buf.base.num_ops == 0) + cr->path_ctm_age = 0; + + return _cairo_path_fixed_rel_line_to (&cr->user_path, dx_fixed, dy_fixed); +} + + +static cairo_status_t +_cairo_cogl_context_rel_curve_to (void *abstract_cr, + double dx1, double dy1, + double dx2, double dy2, + double dx3, double dy3) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_fixed_t dx1_fixed, dy1_fixed; + cairo_fixed_t dx2_fixed, dy2_fixed; + cairo_fixed_t dx3_fixed, dy3_fixed; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.rel_curve_to (abstract_cr, dx1, dy1, dx2, dy2, dx3, dy3); + if (unlikely (status)) + return status; + + dx1_fixed = _cairo_fixed_from_double (dx1); + dy1_fixed = _cairo_fixed_from_double (dy1); + + dx2_fixed = _cairo_fixed_from_double (dx2); + dy2_fixed = _cairo_fixed_from_double (dy2); + + dx3_fixed = _cairo_fixed_from_double (dx3); + dy3_fixed = _cairo_fixed_from_double (dy3); + + if (cr->user_path.buf.base.num_ops == 0) + cr->path_ctm_age = 0; + + return _cairo_path_fixed_rel_curve_to (&cr->user_path, + dx1_fixed, dy1_fixed, + dx2_fixed, dy2_fixed, + dx3_fixed, dy3_fixed); +} + +#if 0 +static cairo_status_t +_cairo_cogl_context_arc_to (void *abstract_cr, + double x1, double y1, + double x2, double y2, + double radius) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.arc_to (abstract_cr, x1, y1, x2, y2, radius); + if (unlikely (status)) + return status; +#warning "FIXME" +} + +static cairo_status_t +_cairo_cogl_rel_arc_to (void *cr, + double dx1, double dy1, + double dx2, double dy2, + double radius) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.rel_arc_to (abstract_cr, dx1, dy2, dx2, dy2, radius); + if (unlikely (status)) + return status; +#warning "FIXME" +} +#endif + +static cairo_status_t +_cairo_cogl_context_close_path (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + if (cr->path_is_rectangle) { + status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + status = cr->dev->backend_parent.close_path (abstract_cr); + if (unlikely (status)) + return status; + + if (cr->user_path.buf.base.num_ops == 0) + cr->path_ctm_age = 0; + + return _cairo_path_fixed_close_path (&cr->user_path); +} + +static cairo_status_t +_cairo_cogl_context_rectangle (void *abstract_cr, + double x, double y, + double width, double height) +{ + cairo_cogl_context_t *cr = abstract_cr; + + if (cr->user_path.buf.base.num_ops == 0) { + cr->path_ctm_age = 0; + +#if 1 + /* XXX: Since drawing rectangles is so common we have a + * fast-path for drawing a single rectangle. */ + cr->x = x; + cr->y = y; + cr->width = width; + cr->height = height; + cr->path_is_rectangle = TRUE; + return CAIRO_STATUS_SUCCESS; +#endif + } + + if (cr->path_is_rectangle) { + cairo_status_t status = _flush_cr_rectangle (cr); + if (unlikely (status)) + return status; + } + + return _cairo_cogl_context_rectangle_real (cr, x, y, width, height); +} + +/* Since the surface backend drawing operator functions don't get + * passed the current #cairo_t context we don't have a good way + * to get our user-coordinates path into our surface operator + * functions. + * + * For now we use this function to set side band data on the surface + * itself. + */ +static void +_cairo_cogl_surface_set_side_band_state (cairo_cogl_surface_t *surface, + cairo_cogl_context_t *cr) +{ + + if (cr->path_ctm_age <= 1) { + surface->user_path = &cr->user_path; + surface->ctm = &cr->base.gstate->ctm; + surface->ctm_inverse = &cr->base.gstate->ctm_inverse; + surface->path_is_rectangle = cr->path_is_rectangle; + if (surface->path_is_rectangle) { + surface->path_rectangle_x = cr->x; + surface->path_rectangle_y = cr->y; + surface->path_rectangle_width = cr->width; + surface->path_rectangle_height = cr->height; + } + } else { + surface->user_path = NULL; + surface->path_is_rectangle = FALSE; + } +} + +static cairo_status_t +_cairo_cogl_context_fill (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)cr->base.gstate->target; + + if (cr->path_is_rectangle) { + status = _cairo_cogl_surface_fill_rectangle (cr->base.gstate->target, + cr->base.gstate->op, + cr->base.gstate->source, + cr->x, + cr->y, + cr->width, + cr->height, + &cr->base.gstate->ctm, + cr->base.gstate->clip); + if (status == CAIRO_STATUS_SUCCESS) + goto DONE; + _flush_cr_rectangle (cr); + } + + _cairo_cogl_surface_set_side_band_state (surface, cr); + + status = cr->dev->backend_parent.fill (abstract_cr); + if (unlikely (status)) + return status; + +DONE: + _cairo_path_fixed_fini (&cr->user_path); + _cairo_path_fixed_init (&cr->user_path); + cr->path_is_rectangle = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_context_fill_preserve (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)cr->base.gstate->target; + + _cairo_cogl_surface_set_side_band_state (surface, cr); + + status = cr->dev->backend_parent.fill_preserve (abstract_cr); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_context_stroke (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)cr->base.gstate->target; + + _cairo_cogl_surface_set_side_band_state (surface, cr); + + status = cr->dev->backend_parent.stroke (abstract_cr); + if (unlikely (status)) + return status; + + _cairo_path_fixed_fini (&cr->user_path); + _cairo_path_fixed_init (&cr->user_path); + cr->path_is_rectangle = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_context_stroke_preserve (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)cr->base.gstate->target; + + _cairo_cogl_surface_set_side_band_state (surface, cr); + + status = cr->dev->backend_parent.stroke_preserve (abstract_cr); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_context_clip (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + cairo_status_t status; + + status = cr->dev->backend_parent.clip (abstract_cr); + if (unlikely (status)) + return status; + + _cairo_path_fixed_fini (&cr->user_path); + _cairo_path_fixed_init (&cr->user_path); + cr->path_is_rectangle = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_cogl_context_destroy (void *abstract_cr) +{ + cairo_cogl_context_t *cr = abstract_cr; + + _cairo_default_context_fini (&cr->base); + + _cairo_path_fixed_fini (&cr->user_path); + + /* mark the context as invalid to protect against misuse */ + cr->base.base.status = CAIRO_STATUS_NULL_POINTER; + _freed_pool_put (&context_pool, cr); +} + +/* We want to hook into the frontend of the path construction APIs so + * we can build up a path description in user coordinates instead of + * backend coordinates so that we can recognize user coordinate + * rectangles and so we can hash a user path independent of its + * transform. (With some care to catch unusual cases where the ctm + * changes mid-path) */ +cairo_t * +_cairo_cogl_context_create (void *target) +{ + cairo_cogl_surface_t *surface = target; + cairo_cogl_context_t *cr; + cairo_status_t status; + + cr = _freed_pool_get (&context_pool); + if (unlikely (cr == NULL)) { + cr = malloc (sizeof (cairo_cogl_context_t)); + if (unlikely (cr == NULL)) + return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + status = _cairo_default_context_init (&cr->base, target); + if (unlikely (status)) { + _freed_pool_put (&context_pool, cr); + return _cairo_create_in_error (status); + } + + cr->dev = (cairo_cogl_device_t *)surface->base.device; + + if (unlikely (cr->dev->backend_vtable_initialized == FALSE)) { + cairo_backend_t *backend = &cr->dev->backend; + memcpy (backend, cr->base.base.backend, sizeof (cairo_backend_t)); + memcpy (&cr->dev->backend_parent, cr->base.base.backend, sizeof (cairo_backend_t)); + + backend->destroy = _cairo_cogl_context_destroy; + + backend->restore = _cairo_cogl_context_restore; + backend->translate = _cairo_cogl_context_translate; + backend->scale = _cairo_cogl_context_scale; + backend->rotate = _cairo_cogl_context_rotate; + backend->transform = _cairo_cogl_context_transform; + backend->set_matrix = _cairo_cogl_context_set_matrix; + backend->set_identity_matrix = _cairo_cogl_context_set_identity_matrix; + + backend->new_path = _cairo_cogl_context_new_path; + backend->new_sub_path = _cairo_cogl_context_new_sub_path; + backend->move_to = _cairo_cogl_context_move_to; + backend->rel_move_to = _cairo_cogl_context_rel_move_to; + backend->line_to = _cairo_cogl_context_line_to; + backend->rel_line_to = _cairo_cogl_context_rel_line_to; + backend->curve_to = _cairo_cogl_context_curve_to; + backend->rel_curve_to = _cairo_cogl_context_rel_curve_to; +#if 0 + backend->arc_to = _cairo_cogl_context_arc_to; + backend->rel_arc_to = _cairo_cogl_context_rel_arc_to; +#endif + backend->close_path = _cairo_cogl_context_close_path; + //backend->arc = _cairo_cogl_context_arc; + backend->rectangle = _cairo_cogl_context_rectangle; + + /* Try to automatically catch if any new path APIs are added that mean + * we may need to overload more functions... */ + assert (((char *)&backend->path_extents - (char *)&backend->device_to_user_distance) + == (sizeof (void *) * 14)); + + backend->fill = _cairo_cogl_context_fill; + backend->fill_preserve = _cairo_cogl_context_fill_preserve; + backend->stroke = _cairo_cogl_context_stroke; + backend->stroke_preserve = _cairo_cogl_context_stroke_preserve; + backend->clip = _cairo_cogl_context_clip; + + cr->dev->backend_vtable_initialized = TRUE; + } + + cr->base.base.backend = &cr->dev->backend; + + _cairo_path_fixed_init (&cr->user_path); + cr->path_is_rectangle = FALSE; + + return &cr->base.base; +} diff --git a/src/cairo-cogl-gradient-private.h b/src/cairo-cogl-gradient-private.h new file mode 100644 index 000000000..fa684d2c6 --- /dev/null +++ b/src/cairo-cogl-gradient-private.h @@ -0,0 +1,89 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ + +#ifndef CAIRO_COGL_GRADIENT_PRIVATE_H +#define CAIRO_COGL_GRADIENT_PRIVATE_H + +#include "cairoint.h" +#include "cairo-pattern-private.h" + +#include + +#define CAIRO_COGL_LINEAR_GRADIENT_CACHE_SIZE (1024 * 1024) + +typedef enum _cairo_cogl_gradient_compatibility { + CAIRO_COGL_GRADIENT_CAN_EXTEND_PAD = 1<<0, + CAIRO_COGL_GRADIENT_CAN_EXTEND_REPEAT = 1<<1, + CAIRO_COGL_GRADIENT_CAN_EXTEND_REFLECT = 1<<2, + CAIRO_COGL_GRADIENT_CAN_EXTEND_NONE = 1<<3 +} cairo_cogl_gradient_compatibility_t; +#define CAIRO_COGL_GRADIENT_CAN_EXTEND_ALL (CAIRO_COGL_GRADIENT_CAN_EXTEND_PAD |\ + CAIRO_COGL_GRADIENT_CAN_EXTEND_REPEAT|\ + CAIRO_COGL_GRADIENT_CAN_EXTEND_REFLECT|\ + CAIRO_COGL_GRADIENT_CAN_EXTEND_NONE) + +typedef struct _cairo_cogl_linear_texture_entry { + cairo_cogl_gradient_compatibility_t compatibility; + CoglTexture *texture; + float translate_x; + float scale_x; +} cairo_cogl_linear_texture_entry_t; + +typedef struct _cairo_cogl_linear_gradient { + cairo_cache_entry_t cache_entry; + cairo_reference_count_t ref_count; + GList *textures; + int n_stops; + const cairo_gradient_stop_t *stops; + cairo_gradient_stop_t stops_embedded[1]; +} cairo_cogl_linear_gradient_t; + +cairo_int_status_t +_cairo_cogl_get_linear_gradient (cairo_cogl_device_t *context, + cairo_extend_t extend_mode, + int n_stops, + const cairo_gradient_stop_t *stops, + cairo_cogl_linear_gradient_t **gradient_out); + +cairo_cogl_linear_texture_entry_t * +_cairo_cogl_linear_gradient_texture_for_extend (cairo_cogl_linear_gradient_t *gradient, + cairo_extend_t extend_mode); + +cairo_cogl_linear_gradient_t * +_cairo_cogl_linear_gradient_reference (cairo_cogl_linear_gradient_t *gradient); + +void +_cairo_cogl_linear_gradient_destroy (cairo_cogl_linear_gradient_t *gradient); + +cairo_bool_t +_cairo_cogl_linear_gradient_equal (const void *key_a, const void *key_b); + +#endif /* CAIRO_COGL_GRADIENT_PRIVATE_H */ diff --git a/src/cairo-cogl-gradient.c b/src/cairo-cogl-gradient.c new file mode 100644 index 000000000..f8c800416 --- /dev/null +++ b/src/cairo-cogl-gradient.c @@ -0,0 +1,642 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ +//#include "cairoint.h" + +#include "cairo-cogl-private.h" +#include "cairo-cogl-gradient-private.h" +#include "cairo-image-surface-private.h" + +#include +#include + +#define DUMP_GRADIENTS_TO_PNG + +static unsigned long +_cairo_cogl_linear_gradient_hash (unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + return _cairo_hash_bytes (n_stops, stops, + sizeof (cairo_gradient_stop_t) * n_stops); +} + +static cairo_cogl_linear_gradient_t * +_cairo_cogl_linear_gradient_lookup (cairo_cogl_device_t *ctx, + unsigned long hash, + unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + cairo_cogl_linear_gradient_t lookup; + + lookup.cache_entry.hash = hash, + lookup.n_stops = n_stops; + lookup.stops = stops; + + return _cairo_cache_lookup (&ctx->linear_cache, &lookup.cache_entry); +} + +cairo_bool_t +_cairo_cogl_linear_gradient_equal (const void *key_a, const void *key_b) +{ + const cairo_cogl_linear_gradient_t *a = key_a; + const cairo_cogl_linear_gradient_t *b = key_b; + + if (a->n_stops != b->n_stops) + return FALSE; + + return memcmp (a->stops, b->stops, a->n_stops * sizeof (cairo_gradient_stop_t)) == 0; +} + +cairo_cogl_linear_gradient_t * +_cairo_cogl_linear_gradient_reference (cairo_cogl_linear_gradient_t *gradient) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&gradient->ref_count)); + + _cairo_reference_count_inc (&gradient->ref_count); + + return gradient; +} + +void +_cairo_cogl_linear_gradient_destroy (cairo_cogl_linear_gradient_t *gradient) +{ + GList *l; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&gradient->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&gradient->ref_count)) + return; + + for (l = gradient->textures; l; l = l->next) { + cairo_cogl_linear_texture_entry_t *entry = l->data; + cogl_object_unref (entry->texture); + free (entry); + } + g_list_free (gradient->textures); + + free (gradient); +} + +static int +_cairo_cogl_util_next_p2 (int a) +{ + int rval = 1; + + while (rval < a) + rval <<= 1; + + return rval; +} + +static float +get_max_color_component_range (const cairo_color_stop_t *color0, const cairo_color_stop_t *color1) +{ + float range; + float max = 0; + + range = fabs (color0->red - color1->red); + max = MAX (range, max); + range = fabs (color0->green - color1->green); + max = MAX (range, max); + range = fabs (color0->blue - color1->blue); + max = MAX (range, max); + range = fabs (color0->alpha - color1->alpha); + max = MAX (range, max); + + return max; +} + +static int +_cairo_cogl_linear_gradient_width_for_stops (cairo_extend_t extend, + unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + unsigned int n; + float max_texels_per_unit_offset = 0; + float total_offset_range; + + /* Find the stop pair demanding the most precision because we are + * interpolating the largest color-component range. + * + * From that we can define the relative sizes of all the other + * stop pairs within our texture and thus the overall size. + * + * To determine the maximum number of texels for a given gap we + * look at the range of colors we are expected to interpolate (so + * long as the stop offsets are not degenerate) and we simply + * assume we want one texel for each unique color value possible + * for a one byte-per-component representation. + * XXX: maybe this is overkill and just allowing 128 levels + * instead of 256 would be enough and then we'd rely on the + * bilinear filtering to give the full range. + * + * XXX: potentially we could try and map offsets to pixels to come + * up with a more precise mapping, but we are aiming to cache + * the gradients so we can't make assumptions about how it will be + * scaled in the future. + */ + for (n = 1; n < n_stops; n++) { + float color_range; + float offset_range; + float texels; + float texels_per_unit_offset; + + /* note: degenerate stops don't need to be represented in the + * texture but we want to be sure that solid gaps get at least + * one texel and all other gaps get at least 2 texels. + */ + + if (stops[n].offset == stops[n-1].offset) + continue; + + color_range = get_max_color_component_range (&stops[n].color, &stops[n-1].color); + if (color_range == 0) + texels = 1; + else + texels = MAX (2, 256.0f * color_range); + + /* So how many texels would we need to map over the full [0,1] + * gradient range so this gap would have enough texels? ... */ + offset_range = stops[n].offset - stops[n - 1].offset; + texels_per_unit_offset = texels / offset_range; + + if (texels_per_unit_offset > max_texels_per_unit_offset) + max_texels_per_unit_offset = texels_per_unit_offset; + } + + total_offset_range = fabs (stops[n_stops - 1].offset - stops[0].offset); + return max_texels_per_unit_offset * total_offset_range; +} + +/* Aim to create gradient textures without an alpha component so we can avoid + * needing to use blending... */ +static CoglPixelFormat +_cairo_cogl_linear_gradient_format_for_stops (cairo_extend_t extend, + unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + unsigned int n; + + /* We have to add extra transparent texels to the end of the gradient to + * handle CAIRO_EXTEND_NONE... */ + if (extend == CAIRO_EXTEND_NONE) + return COGL_PIXEL_FORMAT_BGRA_8888_PRE; + + for (n = 1; n < n_stops; n++) { + if (stops[n].color.alpha != 1.0) + return COGL_PIXEL_FORMAT_BGRA_8888_PRE; + } + + return COGL_PIXEL_FORMAT_BGR_888; +} + +static cairo_cogl_gradient_compatibility_t +_cairo_cogl_compatibility_from_extend_mode (cairo_extend_t extend_mode) +{ + switch (extend_mode) + { + case CAIRO_EXTEND_NONE: + return CAIRO_COGL_GRADIENT_CAN_EXTEND_NONE; + case CAIRO_EXTEND_PAD: + return CAIRO_COGL_GRADIENT_CAN_EXTEND_PAD; + case CAIRO_EXTEND_REPEAT: + return CAIRO_COGL_GRADIENT_CAN_EXTEND_REPEAT; + case CAIRO_EXTEND_REFLECT: + return CAIRO_COGL_GRADIENT_CAN_EXTEND_REFLECT; + } + + assert (0); /* not reached */ + return CAIRO_EXTEND_NONE; +} + +cairo_cogl_linear_texture_entry_t * +_cairo_cogl_linear_gradient_texture_for_extend (cairo_cogl_linear_gradient_t *gradient, + cairo_extend_t extend_mode) +{ + GList *l; + cairo_cogl_gradient_compatibility_t compatibility = + _cairo_cogl_compatibility_from_extend_mode (extend_mode); + for (l = gradient->textures; l; l = l->next) { + cairo_cogl_linear_texture_entry_t *entry = l->data; + if (entry->compatibility & compatibility) + return entry; + } + return NULL; +} + +static void +color_stop_lerp (const cairo_color_stop_t *c0, + const cairo_color_stop_t *c1, + float factor, + cairo_color_stop_t *dest) +{ + /* NB: we always ignore the short members in this file so we don't need to + * worry about initializing them here. */ + dest->red = c0->red * (1.0f-factor) + c1->red * factor; + dest->green = c0->green * (1.0f-factor) + c1->green * factor; + dest->blue = c0->blue * (1.0f-factor) + c1->blue * factor; + dest->alpha = c0->alpha * (1.0f-factor) + c1->alpha * factor; +} + +static size_t +_cairo_cogl_linear_gradient_size (cairo_cogl_linear_gradient_t *gradient) +{ + GList *l; + size_t size = 0; + for (l = gradient->textures; l; l = l->next) { + cairo_cogl_linear_texture_entry_t *entry = l->data; + size += cogl_texture_get_width (entry->texture) * 4; + } + return size; +} + +static void +emit_stop (CoglVertexP2C4 **position, + float left, + float right, + const cairo_color_stop_t *left_color, + const cairo_color_stop_t *right_color) +{ + CoglVertexP2C4 *p = *position; + + guint8 lr = left_color->red * 255; + guint8 lg = left_color->green * 255; + guint8 lb = left_color->blue * 255; + guint8 la = left_color->alpha * 255; + + guint8 rr = right_color->red * 255; + guint8 rg = right_color->green * 255; + guint8 rb = right_color->blue * 255; + guint8 ra = right_color->alpha * 255; + + p[0].x = left; + p[0].y = 0; + p[0].r = lr; p[0].g = lg; p[0].b = lb; p[0].a = la; + p[1].x = left; + p[1].y = 1; + p[1].r = lr; p[1].g = lg; p[1].b = lb; p[1].a = la; + p[2].x = right; + p[2].y = 1; + p[2].r = rr; p[2].g = rg; p[2].b = rb; p[2].a = ra; + + p[3].x = left; + p[3].y = 0; + p[3].r = lr; p[3].g = lg; p[3].b = lb; p[3].a = la; + p[4].x = right; + p[4].y = 1; + p[4].r = rr; p[4].g = rg; p[4].b = rb; p[4].a = ra; + p[5].x = right; + p[5].y = 0; + p[5].r = rr; p[5].g = rg; p[5].b = rb; p[5].a = ra; + + *position = &p[6]; +} + +#ifdef DUMP_GRADIENTS_TO_PNG +static void +dump_gradient_to_png (CoglTexture *texture) +{ + cairo_image_surface_t *image = (cairo_image_surface_t *) + cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + cogl_texture_get_width (texture), + cogl_texture_get_height (texture)); + CoglPixelFormat format; + static int gradient_id = 0; + char *gradient_name; + + if (image->base.status) + return; + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + format = COGL_PIXEL_FORMAT_BGRA_8888_PRE; +#else + format = COGL_PIXEL_FORMAT_ARGB_8888_PRE; +#endif + cogl_texture_get_data (texture, + format, + 0, + image->data); + gradient_name = g_strdup_printf ("./gradient%d.png", gradient_id++); + g_print ("writing gradient: %s\n", gradient_name); + cairo_surface_write_to_png ((cairo_surface_t *)image, gradient_name); + g_free (gradient_name); +} +#endif + +cairo_int_status_t +_cairo_cogl_get_linear_gradient (cairo_cogl_device_t *device, + cairo_extend_t extend_mode, + int n_stops, + const cairo_gradient_stop_t *stops, + cairo_cogl_linear_gradient_t **gradient_out) +{ + unsigned long hash; + cairo_cogl_linear_gradient_t *gradient; + cairo_cogl_linear_texture_entry_t *entry; + cairo_gradient_stop_t *internal_stops; + int stop_offset; + int n_internal_stops; + int n; + cairo_cogl_gradient_compatibility_t compatibilities; + int width; + int left_padding = 0; + cairo_color_stop_t left_padding_color; + int right_padding = 0; + cairo_color_stop_t right_padding_color; + CoglPixelFormat format; + CoglTexture2D *tex; + GError *error = NULL; + int un_padded_width; + CoglHandle offscreen; + cairo_int_status_t status; + int n_quads; + int n_vertices; + float prev; + float right; + CoglVertexP2C4 *vertices; + CoglVertexP2C4 *p; + CoglPrimitive *prim; + + hash = _cairo_cogl_linear_gradient_hash (n_stops, stops); + + gradient = _cairo_cogl_linear_gradient_lookup (device, hash, n_stops, stops); + if (gradient) { + cairo_cogl_linear_texture_entry_t *entry = + _cairo_cogl_linear_gradient_texture_for_extend (gradient, extend_mode); + if (entry) { + *gradient_out = _cairo_cogl_linear_gradient_reference (gradient); + return CAIRO_INT_STATUS_SUCCESS; + } + } + + if (!gradient) { + gradient = malloc (sizeof (cairo_cogl_linear_gradient_t) + + sizeof (cairo_gradient_stop_t) * (n_stops - 1)); + if (!gradient) + return CAIRO_INT_STATUS_NO_MEMORY; + + CAIRO_REFERENCE_COUNT_INIT (&gradient->ref_count, 1); + /* NB: we update the cache_entry size at the end before + * [re]adding it to the cache. */ + gradient->cache_entry.hash = hash; + gradient->textures = NULL; + gradient->n_stops = n_stops; + gradient->stops = gradient->stops_embedded; + memcpy (gradient->stops_embedded, stops, sizeof (cairo_gradient_stop_t) * n_stops); + } else + _cairo_cogl_linear_gradient_reference (gradient); + + entry = malloc (sizeof (cairo_cogl_linear_texture_entry_t)); + if (!entry) { + status = CAIRO_INT_STATUS_NO_MEMORY; + goto BAIL; + } + + compatibilities = _cairo_cogl_compatibility_from_extend_mode (extend_mode); + + n_internal_stops = n_stops; + stop_offset = 0; + + /* We really need stops covering the full [0,1] range for repeat/reflect + * if we want to use sampler REPEAT/MIRROR wrap modes so we may need + * to add some extra stops... */ + if (extend_mode == CAIRO_EXTEND_REPEAT || extend_mode == CAIRO_EXTEND_REFLECT) + { + /* If we don't need any extra stops then actually the texture + * will be shareable for repeat and reflect... */ + compatibilities = (CAIRO_COGL_GRADIENT_CAN_EXTEND_REPEAT | + CAIRO_COGL_GRADIENT_CAN_EXTEND_REFLECT); + + if (stops[0].offset != 0) { + n_internal_stops++; + stop_offset++; + } + + if (stops[n_stops - 1].offset != 1) + n_internal_stops++; + } + + internal_stops = alloca (n_internal_stops * sizeof (cairo_gradient_stop_t)); + memcpy (&internal_stops[stop_offset], stops, sizeof (cairo_gradient_stop_t) * n_stops); + + /* cairo_color_stop_t values are all unpremultiplied but we need to + * interpolate premultiplied colors so we premultiply all the double + * components now. (skipping any extra stops added for repeat/reflect) + * + * Anothing thing to note is that by premultiplying the colors + * early we'll also reduce the range of colors to interpolate + * which can result in smaller gradient textures. + */ + for (n = stop_offset; n < n_stops; n++) { + cairo_color_stop_t *color = &internal_stops[n].color; + color->red *= color->alpha; + color->green *= color->alpha; + color->blue *= color->alpha; + } + + if (n_internal_stops != n_stops) + { + if (extend_mode == CAIRO_EXTEND_REPEAT) { + compatibilities &= ~CAIRO_COGL_GRADIENT_CAN_EXTEND_REFLECT; + if (stops[0].offset != 0) { + /* what's the wrap-around distance between the user's end-stops? */ + double dx = (1.0 - stops[n_stops - 1].offset) + stops[0].offset; + internal_stops[0].offset = 0; + color_stop_lerp (&stops[0].color, + &stops[n_stops - 1].color, + stops[0].offset / dx, + &internal_stops[0].color); + } + if (stops[n_stops - 1].offset != 1) { + internal_stops[n_internal_stops - 1].offset = 1; + internal_stops[n_internal_stops - 1].color = internal_stops[0].color; + } + } else if (extend_mode == CAIRO_EXTEND_REFLECT) { + compatibilities &= ~CAIRO_COGL_GRADIENT_CAN_EXTEND_REPEAT; + if (stops[0].offset != 0) { + internal_stops[0].offset = 0; + internal_stops[0].color = stops[n_stops - 1].color; + } + if (stops[n_stops - 1].offset != 1) { + internal_stops[n_internal_stops - 1].offset = 1; + internal_stops[n_internal_stops - 1].color = stops[0].color; + } + } + } + + stops = internal_stops; + n_stops = n_internal_stops; + + width = _cairo_cogl_linear_gradient_width_for_stops (extend_mode, n_stops, stops); + + if (extend_mode == CAIRO_EXTEND_PAD) { + + /* Here we need to guarantee that the edge texels of our + * texture correspond to the desired padding color so we + * can use CLAMP_TO_EDGE. + * + * For short stop-gaps and especially for degenerate stops + * it's possible that without special consideration the + * user's end stop colors would not be present in our final + * texture. + * + * To handle this we forcibly add two extra padding texels + * at the edges which extend beyond the [0,1] range of the + * gradient itself and we will later report a translate and + * scale transform to compensate for this. + */ + + /* XXX: If we consider generating a mipmap for our 1d texture + * at some point then we also need to consider how much + * padding to add to be sure lower mipmap levels still have + * the desired edge color (as opposed to a linear blend with + * other colors of the gradient). + */ + + left_padding = 1; + left_padding_color = stops[0].color; + right_padding = 1; + right_padding_color = stops[n_stops - 1].color; + } else if (extend_mode == CAIRO_EXTEND_NONE) { + /* We handle EXTEND_NONE by adding two extra, transparent, texels at + * the ends of the texture and use CLAMP_TO_EDGE. + * + * We add a scale and translate transform so to account for our texels + * extending beyond the [0,1] range. */ + + left_padding = 1; + left_padding_color.red = 0; + left_padding_color.green = 0; + left_padding_color.blue = 0; + left_padding_color.alpha = 0; + right_padding = 1; + right_padding_color = left_padding_color; + } + + /* If we still have stops that don't cover the full [0,1] range + * then we need to define a texture-coordinate scale + translate + * transform to account for that... */ + if (stops[n_stops - 1].offset - stops[0].offset < 1) { + float range = stops[n_stops - 1].offset - stops[0].offset; + entry->scale_x = 1.0 / range; + entry->translate_x = -(stops[0].offset * entry->scale_x); + } + + width += left_padding + right_padding; + + width = _cairo_cogl_util_next_p2 (width); + width = MIN (4096, width); /* lets not go too stupidly big! */ + format = _cairo_cogl_linear_gradient_format_for_stops (extend_mode, n_stops, stops); + + do { + tex = cogl_texture_2d_new_with_size (device->cogl_context, + width, + 1, + format, + &error); + if (!tex) + g_error_free (error); + } while (tex == NULL && width >> 1); + + if (!tex) { + status = CAIRO_INT_STATUS_NO_MEMORY; + goto BAIL; + } + + entry->texture = COGL_TEXTURE (tex); + entry->compatibility = compatibilities; + + un_padded_width = width - left_padding - right_padding; + + /* XXX: only when we know the final texture width can we calculate the + * scale and translate factors needed to account for padding... */ + if (un_padded_width != width) + entry->scale_x *= (float)un_padded_width / (float)width; + if (left_padding) + entry->translate_x += (entry->scale_x / (float)un_padded_width) * (float)left_padding; + + offscreen = cogl_offscreen_new_to_texture (tex); + cogl_push_framebuffer (COGL_FRAMEBUFFER (offscreen)); + cogl_ortho (0, width, 1, 0, -1, 100); + cogl_framebuffer_clear4f (COGL_FRAMEBUFFER (offscreen), + COGL_BUFFER_BIT_COLOR, + 0, 0, 0, 0); + + n_quads = n_stops - 1 + !!left_padding + !!right_padding; + n_vertices = 6 * n_quads; + vertices = alloca (sizeof (CoglVertexP2C4) * n_vertices); + p = vertices; + if (left_padding) + emit_stop (&p, 0, left_padding, &left_padding_color, &left_padding_color); + prev = (float)left_padding; + for (n = 1; n < n_stops; n++) { + right = (float)left_padding + (float)un_padded_width * stops[n].offset; + emit_stop (&p, prev, right, &stops[n-1].color, &stops[n].color); + prev = right; + } + if (right_padding) + emit_stop (&p, prev, width, &right_padding_color, &right_padding_color); + + prim = cogl_primitive_new_p2c4 (COGL_VERTICES_MODE_TRIANGLES, + n_vertices, + vertices); + /* Just use this as the simplest way to setup a default pipeline... */ + cogl_set_source_color4f (0, 0, 0, 0); + cogl_primitive_draw (prim); + cogl_object_unref (prim); + + cogl_pop_framebuffer (); + cogl_object_unref (offscreen); + + gradient->textures = g_list_prepend (gradient->textures, entry); + gradient->cache_entry.size = _cairo_cogl_linear_gradient_size (gradient); + +#ifdef DUMP_GRADIENTS_TO_PNG + dump_gradient_to_png (COGL_TEXTURE (tex)); +#endif + +#warning "FIXME:" + /* XXX: it seems the documentation of _cairo_cache_insert isn't true - it + * doesn't handle re-adding the same entry gracefully - the cache will + * just keep on growing and then it will start randomly evicting things + * pointlessly */ + /* we ignore errors here and just return an uncached gradient */ + if (likely (! _cairo_cache_insert (&device->linear_cache, &gradient->cache_entry))) + _cairo_cogl_linear_gradient_reference (gradient); + + *gradient_out = gradient; + return CAIRO_INT_STATUS_SUCCESS; + +BAIL: + free (entry); + if (gradient) + _cairo_cogl_linear_gradient_destroy (gradient); + return status; +} diff --git a/src/cairo-cogl-private.h b/src/cairo-cogl-private.h new file mode 100644 index 000000000..13fe5a8dc --- /dev/null +++ b/src/cairo-cogl-private.h @@ -0,0 +1,164 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ + +#ifndef CAIRO_COGL_PRIVATE_H +#define CAIRO_COGL_PRIVATE_H + +#include "cairo-device-private.h" +#include "cairo-cache-private.h" +#include "cairo-backend-private.h" +#include "cairo-default-context-private.h" +#include "cairo-surface-private.h" + +#include + +typedef enum _cairo_cogl_template_type { + CAIRO_COGL_TEMPLATE_TYPE_SOLID, + CAIRO_COGL_TEMPLATE_TYPE_TEXTURE, + CAIRO_COGL_TEMPLATE_TYPE_MASK_SOLID, + CAIRO_COGL_TEMPLATE_TYPE_MASK_TEXTURE, + CAIRO_COGL_TEMPLATE_TYPE_COUNT +} cairo_cogl_template_type; + +typedef struct _cairo_cogl_device { + cairo_device_t base; + + cairo_bool_t backend_vtable_initialized; + cairo_backend_t backend; + + /* We save a copy of all the original backend methods that we override so + * we can chain up... + */ + cairo_backend_t backend_parent; + + CoglContext *cogl_context; + + CoglTexture *dummy_texture; + + /* This is a sparsely filled set of templates because we don't support + * the full range of operators that cairo has. All entries corresponding + * to unsupported operators are NULL. + * + * The CAIRO_OPERATOR_ADD is the operator enum with the highest value that + * we support so we at least cap the size of the array by that. + * + * For each operator we have a template for when we have a solid source + * and another for each texture format that could be used as a source. + */ + CoglPipeline *template_pipelines[CAIRO_OPERATOR_ADD + 1][CAIRO_COGL_TEMPLATE_TYPE_COUNT]; + + CoglMatrix identity; + + /* Caches 1d linear gradient textures */ + cairo_cache_t linear_cache; + + cairo_cache_t path_fill_staging_cache; + cairo_cache_t path_fill_prim_cache; + cairo_cache_t path_stroke_staging_cache; + cairo_cache_t path_stroke_prim_cache; +} cairo_cogl_device_t; + +typedef struct _cairo_cogl_clip_primitives { + cairo_t *clip; + CoglPrimitive **primitives; +} cairo_cogl_clip_primitives_t; + +typedef struct _cairo_cogl_surface { + cairo_surface_t base; + + CoglPixelFormat cogl_format; + cairo_bool_t ignore_alpha; + + /* We currently have 3 basic kinds of Cogl surfaces: + * 1) A light surface simply wrapping a CoglTexture + * 2) A CoglOffscreen framebuffer that implicitly also wraps a CoglTexture + * 3) A CoglOnscreen framebuffer which could potentially be mapped to + * a CoglTexture (e.g. via tfp on X11) but we don't currently do + * that. + */ + + CoglTexture *texture; + CoglFramebuffer *framebuffer; + + int width; + int height; + + GQueue *journal; + + CoglAttributeBuffer *buffer_stack; + size_t buffer_stack_size; + size_t buffer_stack_offset; + guint8 *buffer_stack_pointer; + + cairo_clip_t *last_clip; + + /* A small fifo of recently used cairo_clip_ts paired with CoglPrimitives + * that can be used to mask the stencil buffer. */ + GList *clips_fifo; + + int n_clip_updates_per_frame; + + /* Since the surface backend drawing operator functions don't get + * passed the current cairo_t context we don't have a good way + * to get our user-coordinates path into our surface_fill function. + * + * For now we use our _cairo_cogl_context_fill() wrapper to set this + * side band data on the surface... + */ + cairo_path_fixed_t *user_path; + cairo_matrix_t *ctm; + cairo_matrix_t *ctm_inverse; + cairo_bool_t path_is_rectangle; + double path_rectangle_x; + double path_rectangle_y; + double path_rectangle_width; + double path_rectangle_height; +} cairo_cogl_surface_t; + +cairo_status_t +_cairo_cogl_path_fixed_rectangle (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y, + cairo_fixed_t width, + cairo_fixed_t height); + +cairo_int_status_t +_cairo_cogl_surface_fill_rectangle (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + double x, + double y, + double width, + double height, + cairo_matrix_t *ctm, + const cairo_clip_t *clip); + +#endif /* CAIRO_COGL_PRIVATE_H */ diff --git a/src/cairo-cogl-surface.c b/src/cairo-cogl-surface.c new file mode 100644 index 000000000..c57fd7f43 --- /dev/null +++ b/src/cairo-cogl-surface.c @@ -0,0 +1,2805 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ +#include "cairoint.h" + +#include "cairo-cache-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-fixed-private.h" +#include "cairo-device-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-cogl-private.h" +#include "cairo-cogl-gradient-private.h" +#include "cairo-arc-private.h" +#include "cairo-traps-private.h" +#include "cairo-cogl-context-private.h" +#include "cairo-cogl-utils-private.h" +#include "cairo-box-inline.h" +#include "cairo-surface-subsurface-inline.h" +#include "cairo-surface-fallback-private.h" +#include "cairo-surface-offset-private.h" + +#include "cairo-cogl.h" + +#include +#include + +#define CAIRO_COGL_DEBUG 0 +//#define FILL_WITH_COGL_PATH +//#define USE_CAIRO_PATH_FLATTENER +#define ENABLE_PATH_CACHE +//#define DISABLE_BATCHING +#define USE_COGL_RECTANGLE_API +#define ENABLE_RECTANGLES_FASTPATH + +#if defined (USE_COGL_RECTANGLE_API) || defined (ENABLE_PATH_CACHE) +#define NEED_COGL_CONTEXT +#endif + +#if CAIRO_COGL_DEBUG && __GNUC__ +#define UNSUPPORTED(reason) ({ \ + g_warning ("cairo-cogl: hit unsupported operation: %s", reason); \ + CAIRO_INT_STATUS_UNSUPPORTED; \ +}) +#else +#define UNSUPPORTED(reason) CAIRO_INT_STATUS_UNSUPPORTED +#endif + +#define CAIRO_COGL_PATH_META_CACHE_SIZE (1024 * 1024) + +typedef struct _cairo_cogl_texture_attributes { + /* nabbed from cairo_surface_attributes_t... */ + cairo_matrix_t matrix; + cairo_extend_t extend; + cairo_filter_t filter; + cairo_bool_t has_component_alpha; + + CoglPipelineWrapMode s_wrap; + CoglPipelineWrapMode t_wrap; +} cairo_cogl_texture_attributes_t; + +typedef enum _cairo_cogl_journal_entry_type { + CAIRO_COGL_JOURNAL_ENTRY_TYPE_RECTANGLE, + CAIRO_COGL_JOURNAL_ENTRY_TYPE_PRIMITIVE, + CAIRO_COGL_JOURNAL_ENTRY_TYPE_PATH, + CAIRO_COGL_JOURNAL_ENTRY_TYPE_CLIP +} cairo_cogl_journal_entry_type_t; + +typedef struct _cairo_cogl_journal_entry { + cairo_cogl_journal_entry_type_t type; +} cairo_cogl_journal_entry_t; + +typedef struct _cairo_cogl_journal_clip_entry { + cairo_cogl_journal_entry_t base; + cairo_clip_t *clip; +} cairo_cogl_journal_clip_entry_t; + +typedef struct _cairo_cogl_journal_rect_entry { + cairo_cogl_journal_entry_t base; + CoglPipeline *pipeline; + float x; + float y; + float width; + float height; + int n_layers; + cairo_matrix_t ctm; +} cairo_cogl_journal_rect_entry_t; + +typedef struct _cairo_cogl_journal_prim_entry { + cairo_cogl_journal_entry_t base; + CoglPipeline *pipeline; + CoglPrimitive *primitive; + gboolean has_transform; + cairo_matrix_t transform; +} cairo_cogl_journal_prim_entry_t; + +typedef struct _cairo_cogl_journal_path_entry { + cairo_cogl_journal_entry_t base; + CoglPipeline *pipeline; + CoglPath *path; +} cairo_cogl_journal_path_entry_t; + +typedef struct _cairo_cogl_path_fill_meta { + cairo_cache_entry_t cache_entry; + cairo_reference_count_t ref_count; + int counter; + cairo_path_fixed_t *user_path; + cairo_matrix_t ctm_inverse; + + /* TODO */ +#if 0 + /* A cached path tessellation should be re-usable with different rotations + * and translations but not for different scales. + * + * one idea is to track the diagonal lenghts of a unit rectangle + * transformed through the original ctm use to tessellate the geometry + * so we can check what the lengths are for any new ctm to know if + * this geometry is compatible. + */ +#endif + + CoglPrimitive *prim; +} cairo_cogl_path_fill_meta_t; + +typedef struct _cairo_cogl_path_stroke_meta { + cairo_cache_entry_t cache_entry; + cairo_reference_count_t ref_count; + int counter; + cairo_path_fixed_t *user_path; + cairo_matrix_t ctm_inverse; + cairo_stroke_style_t style; + double tolerance; + + /* TODO */ +#if 0 + /* A cached path tessellation should be re-usable with different rotations + * and translations but not for different scales. + * + * one idea is to track the diagonal lenghts of a unit rectangle + * transformed through the original ctm use to tessellate the geometry + * so we can check what the lengths are for any new ctm to know if + * this geometry is compatible. + */ +#endif + + CoglPrimitive *prim; +} cairo_cogl_path_stroke_meta_t; + +static cairo_surface_t * +_cairo_cogl_surface_create_full (cairo_cogl_device_t *dev, + cairo_bool_t ignore_alpha, + CoglFramebuffer *framebuffer, + CoglTexture *texture); + +static cairo_int_status_t +_cairo_cogl_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +static void +_cairo_cogl_journal_flush (cairo_cogl_surface_t *surface); + +cairo_private extern const cairo_surface_backend_t _cairo_cogl_surface_backend; + +slim_hidden_proto (cairo_cogl_device_create); +slim_hidden_proto (cairo_cogl_surface_create); +slim_hidden_proto (cairo_cogl_surface_get_framebuffer); +slim_hidden_proto (cairo_cogl_surface_get_texture); +slim_hidden_proto (cairo_cogl_surface_end_frame); + +static cairo_cogl_device_t * +to_device (cairo_device_t *device) +{ + return (cairo_cogl_device_t *)device; +} + +/* moves trap points such that they become the actual corners of the trapezoid */ +static void +_sanitize_trap (cairo_trapezoid_t *t) +{ + cairo_trapezoid_t s = *t; + +#define FIX(lr, tb, p) \ + if (t->lr.p.y != t->tb) { \ + t->lr.p.x = s.lr.p2.x + _cairo_fixed_mul_div_floor (s.lr.p1.x - s.lr.p2.x, s.tb - s.lr.p2.y, s.lr.p1.y - s.lr.p2.y); \ + t->lr.p.y = s.tb; \ + } + FIX (left, top, p1); + FIX (left, bottom, p2); + FIX (right, top, p1); + FIX (right, bottom, p2); +} + +static cairo_status_t +_cairo_cogl_surface_ensure_framebuffer (cairo_cogl_surface_t *surface) +{ + GError *error = NULL; + + if (surface->framebuffer) + return CAIRO_STATUS_SUCCESS; + + surface->framebuffer = COGL_FRAMEBUFFER (cogl_offscreen_new_to_texture (surface->texture)); + if (!cogl_framebuffer_allocate (surface->framebuffer, &error)) { + g_error_free (error); + cogl_object_unref (surface->framebuffer); + surface->framebuffer = NULL; + return CAIRO_STATUS_NO_MEMORY; + } + + cogl_push_framebuffer (surface->framebuffer); + cogl_ortho (0, surface->width, + surface->height, 0, + -1, 100); + cogl_pop_framebuffer (); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_cogl_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_cogl_surface_t *reference_surface = abstract_surface; + cairo_cogl_surface_t *surface; + CoglTexture *texture; + cairo_status_t status; + + texture = cogl_texture_new_with_size (width, height, + COGL_TEXTURE_NO_SLICING, + (content & CAIRO_CONTENT_COLOR) ? + COGL_PIXEL_FORMAT_BGRA_8888_PRE : + COGL_PIXEL_FORMAT_A_8); + if (!texture) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface = (cairo_cogl_surface_t *) + _cairo_cogl_surface_create_full (to_device(reference_surface->base.device), + (content & CAIRO_CONTENT_ALPHA) == 0, + NULL, + texture); + if (unlikely (surface->base.status)) + return &surface->base; + + status = _cairo_cogl_surface_ensure_framebuffer (surface); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return _cairo_surface_create_in_error (status); + } + + return &surface->base; +} + +static cairo_bool_t +_cairo_cogl_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_cogl_surface_t *surface = abstract_surface; + + extents->x = 0; + extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + + return TRUE; +} + +static void +_cairo_cogl_journal_free (cairo_cogl_surface_t *surface) +{ + GList *l; + + for (l = surface->journal->head; l; l = l->next) { + cairo_cogl_journal_entry_t *entry = l->data; + + if (entry->type == CAIRO_COGL_JOURNAL_ENTRY_TYPE_PRIMITIVE) { + cairo_cogl_journal_prim_entry_t *prim_entry = + (cairo_cogl_journal_prim_entry_t *)entry; + cogl_object_unref (prim_entry->primitive); + } else if (entry->type == CAIRO_COGL_JOURNAL_ENTRY_TYPE_PATH) { + cairo_cogl_journal_path_entry_t *path_entry = + (cairo_cogl_journal_path_entry_t *)entry; + cogl_object_unref (path_entry->path); + } + } + + g_queue_free (surface->journal); + surface->journal = NULL; +} + +#ifdef FILL_WITH_COGL_PATH +static void +_cairo_cogl_journal_log_path (cairo_cogl_surface_t *surface, + CoglPipeline *pipeline, + CoglPath *path) +{ + cairo_cogl_journal_path_entry_t *entry; + + if (unlikely (surface->journal == NULL)) + surface->journal = g_queue_new (); + + /* FIXME: Instead of a GList here we should stack allocate the journal + * entries so it would be cheaper to allocate and they can all be freed in + * one go after flushing! */ + entry = g_slice_new (cairo_cogl_journal_path_entry_t); + entry->base.type = CAIRO_COGL_JOURNAL_ENTRY_TYPE_PATH; + + entry->pipeline = cogl_object_ref (pipeline); + entry->path = cogl_object_ref (path); + + g_queue_push_tail (surface->journal, entry); + +#ifdef DISABLE_BATCHING + _cairo_cogl_journal_flush (surface); +#endif +} +#endif /* FILL_WITH_COGL_PATH */ + +static void +_cairo_cogl_journal_log_primitive (cairo_cogl_surface_t *surface, + CoglPipeline *pipeline, + CoglPrimitive *primitive, + cairo_matrix_t *transform) +{ + cairo_cogl_journal_prim_entry_t *entry; + + if (unlikely (surface->journal == NULL)) + surface->journal = g_queue_new (); + + /* FIXME: Instead of a GList here we should stack allocate the journal + * entries so it would be cheaper to allocate and they can all be freed in + * one go after flushing! */ + entry = g_slice_new (cairo_cogl_journal_prim_entry_t); + entry->base.type = CAIRO_COGL_JOURNAL_ENTRY_TYPE_PRIMITIVE; + + entry->pipeline = cogl_object_ref (pipeline); + + if (transform) { + entry->transform = *transform; + entry->has_transform = TRUE; + } else + entry->has_transform = FALSE; + + entry->primitive = cogl_object_ref (primitive); + + g_queue_push_tail (surface->journal, entry); + +#ifdef DISABLE_BATCHING + _cairo_cogl_journal_flush (surface); +#endif +} + +static void +_cairo_cogl_journal_log_rectangle (cairo_cogl_surface_t *surface, + CoglPipeline *pipeline, + float x, + float y, + float width, + float height, + int n_layers, + cairo_matrix_t *ctm) +{ + cairo_cogl_journal_rect_entry_t *entry; + + if (unlikely (surface->journal == NULL)) + surface->journal = g_queue_new (); + + /* FIXME: Instead of a GList here we should stack allocate the journal + * entries so it would be cheaper to allocate and they can all be freed in + * one go after flushing! */ + entry = g_slice_new (cairo_cogl_journal_rect_entry_t); + entry->base.type = CAIRO_COGL_JOURNAL_ENTRY_TYPE_RECTANGLE; + + entry->pipeline = cogl_object_ref (pipeline); + + entry->x = x; + entry->y = y; + entry->width = width; + entry->height = height; + entry->ctm = *ctm; + + entry->n_layers = n_layers; + + g_queue_push_tail (surface->journal, entry); + +#ifdef DISABLE_BATCHING + _cairo_cogl_journal_flush (surface); +#endif +} + +static void +_cairo_cogl_journal_log_clip (cairo_cogl_surface_t *surface, + const cairo_clip_t *clip) +{ + cairo_cogl_journal_clip_entry_t *entry; + + if (unlikely (surface->journal == NULL)) + surface->journal = g_queue_new (); + + /* FIXME: Instead of a GList here we should stack allocate the journal + * entries so it would be cheaper to allocate and they can all be freed in + * one go after flushing! */ + entry = g_slice_new (cairo_cogl_journal_clip_entry_t); + entry->base.type = CAIRO_COGL_JOURNAL_ENTRY_TYPE_CLIP; + entry->clip = _cairo_clip_copy (clip); + + g_queue_push_tail (surface->journal, entry); +} + +static void +_cairo_cogl_journal_discard (cairo_cogl_surface_t *surface) +{ + GList *l; + + if (!surface->journal) { + assert (surface->last_clip == NULL); + return; + } + + if (surface->buffer_stack && surface->buffer_stack_offset) { + cogl_buffer_unmap (COGL_BUFFER (surface->buffer_stack)); + cogl_object_unref (surface->buffer_stack); + surface->buffer_stack = NULL; + } + + for (l = surface->journal->head; l; l = l->next) { + cairo_cogl_journal_entry_t *entry = l->data; + gsize entry_size; + + switch (entry->type) + { + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_CLIP: { + cairo_cogl_journal_clip_entry_t *clip_entry = + (cairo_cogl_journal_clip_entry_t *)entry; + _cairo_clip_destroy (clip_entry->clip); + entry_size = sizeof (cairo_cogl_journal_clip_entry_t); + break; + } + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_RECTANGLE: { + cairo_cogl_journal_rect_entry_t *rect_entry = + (cairo_cogl_journal_rect_entry_t *)entry; + cogl_object_unref (rect_entry->pipeline); + entry_size = sizeof (cairo_cogl_journal_rect_entry_t); + break; + } + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_PRIMITIVE: { + cairo_cogl_journal_prim_entry_t *prim_entry = + (cairo_cogl_journal_prim_entry_t *)entry; + cogl_object_unref (prim_entry->pipeline); + cogl_object_unref (prim_entry->primitive); + entry_size = sizeof (cairo_cogl_journal_prim_entry_t); + break; + } + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_PATH: { + cairo_cogl_journal_path_entry_t *path_entry = + (cairo_cogl_journal_path_entry_t *)entry; + cogl_object_unref (path_entry->pipeline); + cogl_object_unref (path_entry->path); + entry_size = sizeof (cairo_cogl_journal_path_entry_t); + break; + } + default: + assert (0); /* not reached! */ + entry_size = 0; /* avoid compiler warning */ + } + g_slice_free1 (entry_size, entry); + } + + g_queue_clear (surface->journal); + + if (surface->last_clip) { + _cairo_clip_destroy (surface->last_clip); + surface->last_clip = NULL; + } +} + +static CoglAttributeBuffer * +_cairo_cogl_surface_allocate_buffer_space (cairo_cogl_surface_t *surface, + size_t size, + size_t *offset, + void **pointer) +{ + /* XXX: In the Cogl journal we found it more efficient to have a pool of + * buffers that we re-cycle but for now we simply thow away our stack + * buffer each time we flush. */ + if (unlikely (surface->buffer_stack && + (surface->buffer_stack_size - surface->buffer_stack_offset) < size)) { + cogl_buffer_unmap (COGL_BUFFER (surface->buffer_stack)); + cogl_object_unref (surface->buffer_stack); + surface->buffer_stack = NULL; + surface->buffer_stack_size *= 2; + } + + if (unlikely (surface->buffer_stack_size < size)) + surface->buffer_stack_size = size * 2; + + if (unlikely (surface->buffer_stack == NULL)) { + surface->buffer_stack = cogl_attribute_buffer_new (surface->buffer_stack_size, NULL); + surface->buffer_stack_pointer = + cogl_buffer_map (COGL_BUFFER (surface->buffer_stack), + COGL_BUFFER_ACCESS_WRITE, + COGL_BUFFER_MAP_HINT_DISCARD); + surface->buffer_stack_offset = 0; + } + + *pointer = surface->buffer_stack_pointer + surface->buffer_stack_offset; + *offset = surface->buffer_stack_offset; + + surface->buffer_stack_offset += size; + return cogl_object_ref (surface->buffer_stack); +} + + +static CoglAttributeBuffer * +_cairo_cogl_traps_to_triangles_buffer (cairo_cogl_surface_t *surface, + cairo_traps_t *traps, + size_t *offset, + gboolean one_shot) +{ + CoglAttributeBuffer *buffer; + int n_traps = traps->num_traps; + int i; + CoglVertexP2 *triangles; + + if (one_shot) { + buffer = _cairo_cogl_surface_allocate_buffer_space (surface, + n_traps * sizeof (CoglVertexP2) * 6, + offset, + (void **)&triangles); + if (!buffer) + return NULL; + } else { + buffer = cogl_attribute_buffer_new (n_traps * sizeof (CoglVertexP2) * 6, NULL); + if (!buffer) + return NULL; + triangles = cogl_buffer_map (COGL_BUFFER (buffer), + COGL_BUFFER_ACCESS_WRITE, + COGL_BUFFER_MAP_HINT_DISCARD); + if (!triangles) + return NULL; + *offset = 0; + } + + /* XXX: This is can be very expensive. I'm not sure a.t.m if it's + * predominantly the bandwidth required or the cost of the fixed_to_float + * conversions but either way we should try using an index buffer to + * reduce the amount we upload by 1/3 (offset by allocating and uploading + * indices though) sadly though my experience with the intel mesa drivers + * is that slow paths can easily be hit when starting to use indices. + */ + for (i = 0; i < n_traps; i++) + { + CoglVertexP2 *p = &triangles[i * 6]; + cairo_trapezoid_t *trap = &traps->traps[i]; + + p[0].x = _cairo_cogl_util_fixed_to_float (trap->left.p1.x); + p[0].y = _cairo_cogl_util_fixed_to_float (trap->left.p1.y); + + p[1].x = _cairo_cogl_util_fixed_to_float (trap->left.p2.x); + p[1].y = _cairo_cogl_util_fixed_to_float (trap->left.p2.y); + + p[2].x = _cairo_cogl_util_fixed_to_float (trap->right.p2.x); + p[2].y = _cairo_cogl_util_fixed_to_float (trap->right.p2.y); + + p[3].x = _cairo_cogl_util_fixed_to_float (trap->left.p1.x); + p[3].y = _cairo_cogl_util_fixed_to_float (trap->left.p1.y); + + p[4].x = _cairo_cogl_util_fixed_to_float (trap->right.p2.x); + p[4].y = _cairo_cogl_util_fixed_to_float (trap->right.p2.y); + + p[5].x = _cairo_cogl_util_fixed_to_float (trap->right.p1.x); + p[5].y = _cairo_cogl_util_fixed_to_float (trap->right.p1.y); + } + + if (!one_shot) + cogl_buffer_unmap (COGL_BUFFER (buffer)); + + return buffer; +} + +/* Used for solid fills, in this case we just need a mesh made of + * a single (2-component) position attribute. */ +static CoglPrimitive * +_cairo_cogl_traps_to_composite_prim_p2 (cairo_cogl_surface_t *surface, + cairo_traps_t *traps, + gboolean one_shot) +{ + size_t offset; + CoglAttributeBuffer *buffer = _cairo_cogl_traps_to_triangles_buffer (surface, traps, &offset, one_shot); + CoglAttribute *pos = cogl_attribute_new (buffer, + "cogl_position_in", + sizeof (CoglVertexP2), + offset, + 2, + COGL_ATTRIBUTE_TYPE_FLOAT); + CoglPrimitive *prim; + + /* The attribute will have taken a reference on the buffer */ + cogl_object_unref (buffer); + + prim = cogl_primitive_new (COGL_VERTICES_MODE_TRIANGLES, + traps->num_traps * 6, pos, NULL); + + /* The primitive will now keep the attribute alive... */ + cogl_object_unref (pos); + + return prim; +} + +/* Used for surface fills, in this case we need a mesh made of a single + * (2-component) position attribute + we also alias the same attribute as + * (2-component) texture coordinates */ +static CoglPrimitive * +_cairo_cogl_traps_to_composite_prim_p2t2 (cairo_cogl_surface_t *surface, + cairo_traps_t *traps, + gboolean one_shot) +{ + size_t offset; + CoglAttributeBuffer *buffer = _cairo_cogl_traps_to_triangles_buffer (surface, traps, &offset, one_shot); + CoglAttribute *pos = cogl_attribute_new (buffer, + "cogl_position_in", + sizeof (CoglVertexP2), + offset, + 2, + COGL_ATTRIBUTE_TYPE_FLOAT); + CoglAttribute *tex_coords = cogl_attribute_new (buffer, + "cogl_tex_coord0_in", + sizeof (CoglVertexP2), + 0, + 2, + COGL_ATTRIBUTE_TYPE_FLOAT); + CoglPrimitive *prim; + + /* The attributes will have taken references on the buffer */ + cogl_object_unref (buffer); + + prim = cogl_primitive_new (COGL_VERTICES_MODE_TRIANGLES, + traps->num_traps * 6, pos, tex_coords, NULL); + + /* The primitive will now keep the attributes alive... */ + cogl_object_unref (pos); + cogl_object_unref (tex_coords); + + return prim; +} + +static CoglPrimitive * +_cairo_cogl_traps_to_composite_prim (cairo_cogl_surface_t *surface, + cairo_traps_t *traps, + int n_layers, + gboolean one_shot) +{ + int n_traps = traps->num_traps; + int i; + + /* XXX: Ideally we would skip tessellating to traps entirely since + * given their representation, conversion to triangles is quite expensive. + * + * This simplifies the conversion to triangles by making the end points of + * the two side lines actually just correspond to the corners of the + * traps. + */ + for (i = 0; i < n_traps; i++) + _sanitize_trap (&traps->traps[i]); + + if (n_layers == 0) + return _cairo_cogl_traps_to_composite_prim_p2 (surface, traps, one_shot); + else { + assert (n_layers == 1); + return _cairo_cogl_traps_to_composite_prim_p2t2 (surface, traps, one_shot); + } +} + +static cairo_int_status_t +_cairo_cogl_fill_to_primitive (cairo_cogl_surface_t *surface, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + int n_layers, + cairo_bool_t one_shot, + CoglPrimitive **primitive, + size_t *size) +{ + cairo_traps_t traps; + cairo_int_status_t status; + + _cairo_traps_init (&traps); + status = _cairo_path_fixed_fill_to_traps (path, fill_rule, tolerance, &traps); + if (unlikely (status)) + goto BAIL; + + if (traps.num_traps == 0) { + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + goto BAIL; + } + + *size = traps.num_traps * sizeof (CoglVertexP2) * 6; + + *primitive = _cairo_cogl_traps_to_composite_prim (surface, &traps, n_layers, one_shot); + if (!*primitive) { + status = CAIRO_INT_STATUS_NO_MEMORY; + goto BAIL; + } + +BAIL: + _cairo_traps_fini (&traps); + return status; +} + +static void +_cairo_cogl_clip_push_box (const cairo_box_t *box) +{ + if (_cairo_box_is_pixel_aligned (box)) { + cairo_rectangle_int_t rect; + _cairo_box_round_to_rectangle (box, &rect); + cogl_clip_push_window_rectangle (rect.x, rect.y, + rect.width, rect.height); + } else { + double x1, y1, x2, y2; + _cairo_box_to_doubles (box, &x1, &y1, &x2, &y2); + cogl_clip_push_rectangle (x1, y1, x2, y2); + } +} + +static void +_cairo_cogl_journal_flush (cairo_cogl_surface_t *surface) +{ + GList *l; + int clip_stack_depth = 0; + int i; + + if (!surface->journal) + return; + + if (surface->buffer_stack && surface->buffer_stack_offset) { + cogl_buffer_unmap (COGL_BUFFER (surface->buffer_stack)); + cogl_object_unref (surface->buffer_stack); + surface->buffer_stack = NULL; + } + + cogl_set_framebuffer (surface->framebuffer); + + cogl_push_matrix (); + + for (l = surface->journal->head; l; l = l->next) { + cairo_cogl_journal_entry_t *entry = l->data; + + switch (entry->type) + { + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_CLIP: { + cairo_cogl_journal_clip_entry_t *clip_entry = + (cairo_cogl_journal_clip_entry_t *)entry; + cairo_clip_path_t *path; +#if 0 + cairo_bool_t checked_for_primitives = FALSE; + cairo_cogl_clip_primitives_t *clip_primitives; +#endif + + for (i = 0; i < clip_stack_depth; i++) + cogl_clip_pop (); + clip_stack_depth = 0; + + for (path = clip_entry->clip->path, i = 0; path; path = path->prev, i++) { + cairo_rectangle_int_t extents; + cairo_int_status_t status; + CoglPrimitive *prim; + size_t prim_size; + + _cairo_path_fixed_approximate_clip_extents (&path->path, &extents); + + /* TODO - maintain a fifo of the last 10 used clips with cached + * primitives to see if we can avoid tessellating the path and + * uploading the vertices... + */ +#if 0 + if (!checked_for_primitives) { + clip_primitives = find_clip_primitives (clip); + checked_for_primitives = TRUE; + } + if (clip_primitives) + prim = clip_primitives->primitives[i]; +#endif + status = _cairo_cogl_fill_to_primitive (surface, + &path->path, + path->fill_rule, + path->tolerance, + 0, + TRUE, + &prim, + &prim_size); + if (unlikely (status)) { + g_warning ("Failed to get primitive for clip path while flushing journal"); + continue; + } + clip_stack_depth++; + cogl_clip_push_primitive (prim, + extents.x, extents.y, + extents.x + extents.width, + extents.y + extents.height); + cogl_object_unref (prim); + } + + for (i = 0; i < clip_entry->clip->num_boxes; i++) { + clip_stack_depth++; + _cairo_cogl_clip_push_box (&clip_entry->clip->boxes[i]); + } + + surface->n_clip_updates_per_frame++; + break; + } + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_RECTANGLE: { + cairo_cogl_journal_rect_entry_t *rect_entry = + (cairo_cogl_journal_rect_entry_t *)entry; + float tex_coords[8]; + float x1 = rect_entry->x; + float y1 = rect_entry->y; + float x2 = rect_entry->x + rect_entry->width; + float y2 = rect_entry->y + rect_entry->height; + cairo_matrix_t *ctm = &rect_entry->ctm; + float ctmfv[16] = { + ctm->xx, ctm->yx, 0, 0, + ctm->xy, ctm->yy, 0, 0, + 0, 0, 1, 0, + ctm->x0, ctm->y0, 0, 1 + }; + CoglMatrix transform; + + cogl_matrix_init_from_array (&transform, ctmfv); + + if (rect_entry->n_layers) { + g_assert (rect_entry->n_layers <= 2); + tex_coords[0] = x1; + tex_coords[1] = y1; + tex_coords[2] = x2; + tex_coords[3] = y2; + if (rect_entry->n_layers > 1) + memcpy (&tex_coords[4], tex_coords, sizeof (float) * 4); + } + + cogl_set_source (rect_entry->pipeline); + cogl_push_matrix (); + cogl_transform (&transform); + cogl_rectangle_with_multitexture_coords (x1, y1, x2, y2, + tex_coords, 4 * rect_entry->n_layers); + cogl_pop_matrix (); + break; + } + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_PRIMITIVE: { + cairo_cogl_journal_prim_entry_t *prim_entry = + (cairo_cogl_journal_prim_entry_t *)entry; + CoglMatrix transform; + + cogl_push_matrix (); + if (prim_entry->has_transform) { + cairo_matrix_t *ctm = &prim_entry->transform; + float ctmfv[16] = { + ctm->xx, ctm->yx, 0, 0, + ctm->xy, ctm->yy, 0, 0, + 0, 0, 1, 0, + ctm->x0, ctm->y0, 0, 1 + }; + cogl_matrix_init_from_array (&transform, ctmfv); + cogl_transform (&transform); + } else { + cogl_matrix_init_identity (&transform); + cogl_set_modelview_matrix (&transform); + } + + cogl_set_source (prim_entry->pipeline); + cogl_primitive_draw (prim_entry->primitive); + cogl_pop_matrix (); + break; + } + case CAIRO_COGL_JOURNAL_ENTRY_TYPE_PATH: { + cairo_cogl_journal_path_entry_t *path_entry = + (cairo_cogl_journal_path_entry_t *)entry; + + cogl_set_source (path_entry->pipeline); + cogl_path_fill (path_entry->path); + break; + } + default: + assert (0); /* not reached! */ + } + } + + cogl_pop_matrix (); + + for (i = 0; i < clip_stack_depth; i++) + cogl_clip_pop (); + + _cairo_cogl_journal_discard (surface); +} + +static cairo_status_t +_cairo_cogl_surface_flush (void *abstract_surface, + unsigned flags) +{ + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)abstract_surface; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + _cairo_cogl_journal_flush (surface); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_surface_finish (void *abstract_surface) +{ + cairo_cogl_surface_t *surface = abstract_surface; + + if (surface->texture) + cogl_object_unref (surface->texture); + + if (surface->framebuffer) + cogl_object_unref (surface->framebuffer); + + if (surface->journal) + _cairo_cogl_journal_free (surface); + + /*XXX wtf */ + cairo_device_release (surface->base.device); + + return CAIRO_STATUS_SUCCESS; +} + +static CoglPixelFormat +get_cogl_format_from_cairo_format (cairo_format_t cairo_format); + +/* XXX: We often use RGBA format for onscreen framebuffers so make sure + * to handle CAIRO_FORMAT_INVALID sensibly */ +static cairo_format_t +get_cairo_format_from_cogl_format (CoglPixelFormat format) +{ + switch ((int)format) + { + case COGL_PIXEL_FORMAT_A_8: + return CAIRO_FORMAT_A8; + case COGL_PIXEL_FORMAT_RGB_565: + return CAIRO_FORMAT_RGB16_565; + + case COGL_PIXEL_FORMAT_BGRA_8888_PRE: + case COGL_PIXEL_FORMAT_ARGB_8888_PRE: + case COGL_PIXEL_FORMAT_RGBA_8888_PRE: + /* Note: this is ambiguous since CAIRO_FORMAT_RGB24 + * would also map to the same CoglPixelFormat */ + return CAIRO_FORMAT_ARGB32; + + default: + g_warning("bad format: %x a? %d, bgr? %d, pre %d, format: %d\n", + format, + format & COGL_A_BIT, + format & COGL_BGR_BIT, + format & COGL_PREMULT_BIT, + format & ~(COGL_A_BIT | COGL_BGR_BIT | COGL_PREMULT_BIT)); + return CAIRO_FORMAT_INVALID; + } +} + +static CoglPixelFormat +get_cogl_format_from_cairo_format (cairo_format_t cairo_format) +{ + switch (cairo_format) + { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + return COGL_PIXEL_FORMAT_BGRA_8888_PRE; +#else + return COGL_PIXEL_FORMAT_ARGB_8888_PRE; +#endif + case CAIRO_FORMAT_A8: + return COGL_PIXEL_FORMAT_A_8; + case CAIRO_FORMAT_RGB16_565: + return COGL_PIXEL_FORMAT_RGB_565; + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB30: + return 0; + } + + g_warn_if_reached (); + return 0; +} + +static cairo_status_t +_cairo_cogl_surface_read_rect_to_image_surface (cairo_cogl_surface_t *surface, + cairo_rectangle_int_t *interest, + cairo_image_surface_t **image_out) +{ + cairo_image_surface_t *image; + cairo_status_t status; + cairo_format_t cairo_format; + CoglPixelFormat cogl_format; + + /* TODO: Add cogl_texture_get_region() API so we don't have to ensure the + * surface is bound to an fbo to read back pixels */ + status = _cairo_cogl_surface_ensure_framebuffer (surface); + if (unlikely (status)) + return status; + + cairo_format = get_cairo_format_from_cogl_format (surface->cogl_format); + if (cairo_format == CAIRO_FORMAT_INVALID) { + cairo_format = CAIRO_FORMAT_ARGB32; + cogl_format = get_cogl_format_from_cairo_format (cairo_format); + } else { + cogl_format = cogl_framebuffer_get_color_format (surface->framebuffer); + } + + image = (cairo_image_surface_t *) + cairo_image_surface_create (cairo_format, surface->width, surface->height); + if (image->base.status) + return image->base.status; + + /* TODO: Add cogl_framebuffer_read_pixels() API */ + cogl_push_framebuffer (surface->framebuffer); + cogl_read_pixels (0, 0, surface->width, surface->height, + COGL_READ_PIXELS_COLOR_BUFFER, + cogl_format, + image->data); + cogl_pop_framebuffer (); + + *image_out = image; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_cogl_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_cogl_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (surface->texture) { + cairo_format_t format = get_cairo_format_from_cogl_format (surface->cogl_format); + cairo_image_surface_t *image = (cairo_image_surface_t *) + cairo_image_surface_create (format, surface->width, surface->height); + if (image->base.status) + return image->base.status; + + cogl_texture_get_data (surface->texture, + cogl_texture_get_format (surface->texture), + 0, + image->data); + + image->base.is_clear = FALSE; + *image_out = image; + } else { + cairo_rectangle_int_t extents = { + 0, 0, surface->width, surface->height + }; + status = _cairo_cogl_surface_read_rect_to_image_surface (surface, &extents, + image_out); + if (unlikely (status)) + return status; + } + + *image_extra = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_cogl_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_status_t +_cairo_cogl_surface_clear (cairo_cogl_surface_t *surface, + const cairo_color_t *color) +{ + /* Anything batched in the journal up until now is redundant... */ + _cairo_cogl_journal_discard (surface); + + /* XXX: we currently implicitly clear the depth and stencil buffer here + * but since we use the framebuffer_discard extension when available I + * suppose this doesn't matter too much. + * + * The main concern is that we want to avoid re-loading an external z + * buffer at the start of each frame, but also many gpu architectures have + * optimizations for how they handle the depth/stencil buffers and can get + * upset if they aren't cleared together at the start of the frame. + * + * FIXME: we need a way to assert that the clip stack currently isn't + * using the stencil buffer before clearing it here! + */ + cogl_framebuffer_clear4f (surface->framebuffer, + COGL_BUFFER_BIT_COLOR | + COGL_BUFFER_BIT_DEPTH | + COGL_BUFFER_BIT_STENCIL, + color->red * color->alpha, + color->green * color->alpha, + color->blue * color->alpha, + color->alpha); + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_cogl_path_fixed_rectangle (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y, + cairo_fixed_t width, + cairo_fixed_t height) +{ + cairo_status_t status; + + status = _cairo_path_fixed_move_to (path, x, y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_rel_line_to (path, width, 0); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_rel_line_to (path, 0, height); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_rel_line_to (path, -width, 0); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_close_path (path); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_cogl_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_cogl_surface_t *surface; + cairo_path_fixed_t path; + cairo_status_t status; + cairo_matrix_t identity; + + if (clip == NULL) { + if (op == CAIRO_OPERATOR_CLEAR) + return _cairo_cogl_surface_clear (abstract_surface, CAIRO_COLOR_TRANSPARENT); + else if (source->type == CAIRO_PATTERN_TYPE_SOLID && + (op == CAIRO_OPERATOR_SOURCE || + (op == CAIRO_OPERATOR_OVER && (((cairo_surface_t *)abstract_surface)->is_clear || _cairo_pattern_is_opaque_solid (source))))) { + return _cairo_cogl_surface_clear (abstract_surface, + &((cairo_solid_pattern_t *) source)->color); + } + } + + /* fallback to handling the paint in terms of a fill... */ + + surface = abstract_surface; + + _cairo_path_fixed_init (&path); + + status = _cairo_cogl_path_fixed_rectangle (&path, 0, 0, surface->width, surface->height); + if (unlikely (status)) + goto BAIL; + +#ifdef NEED_COGL_CONTEXT + /* XXX: in cairo-cogl-context.c we set some sideband data on the + * surface before issuing a fill so we need to do that here too... */ + surface->user_path = &path; + cairo_matrix_init_identity (&identity); + surface->ctm = &identity; + surface->ctm_inverse = &identity; + surface->path_is_rectangle = TRUE; + surface->path_rectangle_x = 0; + surface->path_rectangle_y = 0; + surface->path_rectangle_width = surface->width; + surface->path_rectangle_height = surface->height; +#endif + + status = _cairo_cogl_surface_fill (abstract_surface, + op, + source, + &path, + CAIRO_FILL_RULE_WINDING, + 1, + CAIRO_ANTIALIAS_DEFAULT, + clip); +BAIL: + _cairo_path_fixed_fini (&path); + return status; +} + +static CoglPipelineWrapMode +get_cogl_wrap_mode_for_extend (cairo_extend_t extend_mode) +{ + switch (extend_mode) + { + case CAIRO_EXTEND_NONE: + return COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE; + case CAIRO_EXTEND_PAD: + return COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE; + case CAIRO_EXTEND_REPEAT: + return COGL_PIPELINE_WRAP_MODE_REPEAT; + case CAIRO_EXTEND_REFLECT: + /* TODO: return COGL_PIPELINE_WRAP_MODE_MIRROR; */ + return CAIRO_EXTEND_REPEAT; + } + assert (0); /* not reached */ + return COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE; +} + +#if 0 +/* Given an arbitrary texture, check if it's already a pot texture and simply + * return it back if so. If not create a new pot texture, scale the old to + * fill it, unref the old and return a pointer to the new pot texture. */ +static cairo_int_status_t +_cairo_cogl_get_pot_texture (CoglContext *context, + CoglTexture *texture, + CoglTexture **pot_texture) +{ + int width = cogl_texture_get_width (texture); + int height = cogl_texture_get_height (texture); + int pot_width; + int pot_height; + CoglHandle offscreen = NULL; + CoglTexture2D *pot = NULL; + GError *error; + + pot_width = _cairo_cogl_util_next_p2 (width); + pot_height = _cairo_cogl_util_next_p2 (height); + + if (pot_width == width && pot_height == height) + return CAIRO_INT_STATUS_SUCCESS; + + for (;;) { + error = NULL; + pot = cogl_texture_2d_new_with_size (context, + pot_width, + pot_height, + cogl_texture_get_format (texture), + &error); + if (pot) + break; + else + g_error_free (error); + + if (pot_width > pot_height) + pot_width >>= 1; + else + pot_height >>= 1; + + if (!pot_width || !pot_height) + break; + } + + *pot_texture = COGL_TEXTURE (pot); + + if (!pot) + return CAIRO_INT_STATUS_NO_MEMORY; + + /* Use the GPU to do a bilinear filtered scale from npot to pot... */ + offscreen = cogl_offscreen_new_to_texture (COGL_TEXTURE (pot)); + error = NULL; + if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), &error)) { + /* NB: if we don't pass an error then Cogl is allowed to simply abort + * automatically. */ + g_error_free (error); + cogl_object_unref (pot); + *pot_texture = NULL; + return CAIRO_INT_STATUS_NO_MEMORY; + } + + cogl_push_framebuffer (COGL_FRAMEBUFFER (offscreen)); + cogl_set_source_texture (texture); + cogl_rectangle (-1, 1, 1, -1); + cogl_pop_framebuffer (); + + cogl_object_unref (offscreen); +} +#endif + +/* NB: a reference for the texture is transferred to the caller which should + * be unrefed */ +static CoglTexture * +_cairo_cogl_acquire_surface_texture (cairo_cogl_surface_t *reference_surface, + cairo_surface_t *abstract_surface) +{ + cairo_image_surface_t *image; + cairo_image_surface_t *acquired_image = NULL; + void *image_extra; + CoglPixelFormat format; + cairo_image_surface_t *image_clone = NULL; + CoglTexture2D *texture; + GError *error = NULL; + cairo_surface_t *clone; + + if (abstract_surface->device == reference_surface->base.device) { + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)abstract_surface; + _cairo_cogl_surface_flush (surface, 0); + return surface->texture ? cogl_object_ref (surface->texture) : NULL; + } + + if (abstract_surface->type == CAIRO_SURFACE_TYPE_COGL) { + if (_cairo_surface_is_subsurface (abstract_surface)) { + cairo_cogl_surface_t *surface; + + surface = (cairo_cogl_surface_t *) + _cairo_surface_subsurface_get_target (abstract_surface); + if (surface->base.device == reference_surface->base.device) + return surface->texture ? cogl_object_ref (surface->texture) : NULL; + } + } + + clone = _cairo_surface_has_snapshot (abstract_surface, &_cairo_cogl_surface_backend); + if (clone) { + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)clone; + return surface->texture ? cogl_object_ref (surface->texture) : NULL; + } + + g_warning ("Uploading image surface to texture"); + + if (_cairo_surface_is_image (abstract_surface)) { + image = (cairo_image_surface_t *)abstract_surface; + } else { + cairo_status_t status = _cairo_surface_acquire_source_image (abstract_surface, + &acquired_image, &image_extra); + if (unlikely (status)) { + g_warning ("acquire_source_image failed: %s [%d]\n", + cairo_status_to_string (status), status); + return NULL; + } + image = acquired_image; + } + + format = get_cogl_format_from_cairo_format (image->format); + if (!format) + { + image_clone = _cairo_image_surface_coerce (image); + if (unlikely (image_clone->base.status)) { + g_warning ("image_surface_coerce failed"); + texture = NULL; + goto BAIL; + } + + format = get_cogl_format_from_cairo_format (image_clone->format); + assert (format); + } + + texture = cogl_texture_2d_new_from_data (to_device(reference_surface->base.device)->cogl_context, + image->width, + image->height, + format, /* incoming */ + format, /* desired */ + image->stride, + image->data, + &error); + if (!texture) { + g_warning ("Failed to allocate texture: %s", error->message); + g_error_free (error); + goto BAIL; + } + + clone = _cairo_cogl_surface_create_full (to_device(reference_surface->base.device), + reference_surface->ignore_alpha, + NULL, COGL_TEXTURE (texture)); + + _cairo_surface_attach_snapshot (abstract_surface, clone, NULL); + + /* Attaching the snapshot will take a reference on the clone surface... */ + cairo_surface_destroy (clone); + +BAIL: + if (image_clone) + cairo_surface_destroy (&image_clone->base); + if (acquired_image) + _cairo_surface_release_source_image (abstract_surface, acquired_image, image_extra); + + return COGL_TEXTURE (texture); +} + +/* NB: a reference for the texture is transferred to the caller which should + * be unrefed */ +static CoglTexture * +_cairo_cogl_acquire_pattern_texture (const cairo_pattern_t *pattern, + cairo_cogl_surface_t *destination, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + cairo_cogl_texture_attributes_t *attributes) +{ + CoglTexture *texture = NULL; + + switch ((int)pattern->type) + { + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_t *surface = ((cairo_surface_pattern_t *)pattern)->surface; + texture = _cairo_cogl_acquire_surface_texture (destination, surface); + if (!texture) + return NULL; + + /* XXX: determine if it would have no effect to change the + * extend mode to EXTEND_PAD instead since we can simply map + * EXTEND_PAD to CLAMP_TO_EDGE without needing fragment shader + * tricks or extra border texels. */ +#if 0 + /* TODO: We still need to consider HW such as SGX which doesn't have + * full support for NPOT textures. */ + if (pattern->extend == CAIRO_EXTEND_REPEAT || pattern->extend == CAIRO_EXTEND_REFLECT) { + _cairo_cogl_get_pot_texture (); + } +#endif + + cairo_matrix_init_identity (&attributes->matrix); + + /* Convert from un-normalized source coordinates in backend + * coordinates to normalized texture coordinates */ + cairo_matrix_scale (&attributes->matrix, + 1.0f / cogl_texture_get_width (texture), + 1.0f / cogl_texture_get_height (texture)); + + /* XXX: need to multiply in the pattern->matrix */ + + attributes->extend = pattern->extend; + attributes->filter = CAIRO_FILTER_BILINEAR; + attributes->has_component_alpha = pattern->has_component_alpha; + + attributes->s_wrap = get_cogl_wrap_mode_for_extend (pattern->extend); + attributes->t_wrap = attributes->s_wrap; + + return texture; + } + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: { + cairo_surface_t *surface; + cairo_matrix_t texture_matrix; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + extents->width, extents->height); + if (_cairo_surface_offset_paint (surface, + extents->x, extents->y, + CAIRO_OPERATOR_SOURCE, + pattern, NULL)) { + cairo_surface_destroy (surface); + return NULL; + } + + texture = _cairo_cogl_acquire_surface_texture (destination, surface); + if (!texture) + goto BAIL; + + cairo_matrix_init_identity (&texture_matrix); + + /* Convert from un-normalized source coordinates in backend + * coordinates to normalized texture coordinates */ + cairo_matrix_scale (&texture_matrix, + 1.0f / cogl_texture_get_width (texture), + 1.0f / cogl_texture_get_height (texture)); + + cairo_matrix_translate (&texture_matrix, -extents->x, -extents->y); + + attributes->matrix = texture_matrix; + attributes->extend = pattern->extend; + attributes->filter = CAIRO_FILTER_NEAREST; + attributes->has_component_alpha = pattern->has_component_alpha; + + /* any pattern extend modes have already been dealt with... */ + attributes->s_wrap = COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE; + attributes->t_wrap = attributes->s_wrap; + +BAIL: + cairo_surface_destroy (surface); + + return texture; + } + case CAIRO_PATTERN_TYPE_LINEAR: { + cairo_linear_pattern_t *linear_pattern = (cairo_linear_pattern_t *)pattern; + cairo_cogl_linear_gradient_t *gradient; + cairo_cogl_linear_texture_entry_t *linear_texture; + cairo_int_status_t status; + float a, b; + float dist; + float scale; + float angle; + + status = _cairo_cogl_get_linear_gradient (to_device(destination->base.device), + pattern->extend, + linear_pattern->base.n_stops, + linear_pattern->base.stops, + &gradient); + if (unlikely (status)) + return NULL; + + linear_texture = _cairo_cogl_linear_gradient_texture_for_extend (gradient, pattern->extend); + + attributes->extend = pattern->extend; + attributes->filter = CAIRO_FILTER_BILINEAR; + attributes->has_component_alpha = pattern->has_component_alpha; + attributes->s_wrap = get_cogl_wrap_mode_for_extend (pattern->extend); + attributes->t_wrap = COGL_PIPELINE_WRAP_MODE_REPEAT; + + cairo_matrix_init_identity (&attributes->matrix); + + a = linear_pattern->pd2.x - linear_pattern->pd1.x; + b = linear_pattern->pd2.y - linear_pattern->pd1.y; + dist = sqrtf (a*a + b*b); + scale = 1.0f / dist; + angle = - atan2f (b, a); + + cairo_matrix_rotate (&attributes->matrix, angle); + cairo_matrix_scale (&attributes->matrix, scale, scale); + + cairo_matrix_translate (&attributes->matrix, + -linear_pattern->pd1.x, + -linear_pattern->pd1.y); + + /* XXX: this caught me out: cairo doesn't follow the standard + * maths convention for multiplying two matrices A x B - cairo + * does B x A so the final matrix is as if A's transforms were + * applied first. + */ + cairo_matrix_multiply (&attributes->matrix, + &pattern->matrix, + &attributes->matrix); + + return cogl_object_ref (linear_texture->texture); + } + default: + g_warning ("Un-supported source type"); + return NULL; + } +} + +static void +set_layer_texture_with_attributes (CoglPipeline *pipeline, + int layer_index, + CoglTexture *texture, + cairo_cogl_texture_attributes_t *attributes) +{ + cogl_pipeline_set_layer_texture (pipeline, layer_index, texture); + + if (!_cairo_matrix_is_identity (&attributes->matrix)) { + cairo_matrix_t *m = &attributes->matrix; + float texture_matrixfv[16] = { + m->xx, m->yx, 0, 0, + m->xy, m->yy, 0, 0, + 0, 0, 1, 0, + m->x0, m->y0, 0, 1 + }; + CoglMatrix texture_matrix; + cogl_matrix_init_from_array (&texture_matrix, texture_matrixfv); + cogl_pipeline_set_layer_matrix (pipeline, layer_index, &texture_matrix); + } + + if (attributes->s_wrap != attributes->t_wrap) { + cogl_pipeline_set_layer_wrap_mode_s (pipeline, layer_index, attributes->s_wrap); + cogl_pipeline_set_layer_wrap_mode_t (pipeline, layer_index, attributes->t_wrap); + } else + cogl_pipeline_set_layer_wrap_mode (pipeline, layer_index, attributes->s_wrap); +} + +static CoglPipeline * +get_source_mask_operator_destination_pipeline (const cairo_pattern_t *mask, + const cairo_pattern_t *source, + cairo_operator_t op, + cairo_cogl_surface_t *destination, + cairo_composite_rectangles_t *extents) +{ + cairo_cogl_template_type template_type; + CoglPipeline *pipeline; + + switch ((int)source->type) + { + case CAIRO_PATTERN_TYPE_SOLID: + template_type = mask ? + CAIRO_COGL_TEMPLATE_TYPE_MASK_SOLID : CAIRO_COGL_TEMPLATE_TYPE_SOLID; + break; + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + template_type = mask ? + CAIRO_COGL_TEMPLATE_TYPE_MASK_TEXTURE : CAIRO_COGL_TEMPLATE_TYPE_TEXTURE; + break; + default: + g_warning ("Un-supported source type"); + return NULL; + } + + pipeline = cogl_pipeline_copy (to_device(destination->base.device)->template_pipelines[op][template_type]); + + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid_pattern = (cairo_solid_pattern_t *)source; + cogl_pipeline_set_color4f (pipeline, + solid_pattern->color.red * solid_pattern->color.alpha, + solid_pattern->color.green * solid_pattern->color.alpha, + solid_pattern->color.blue * solid_pattern->color.alpha, + solid_pattern->color.alpha); + } else { + cairo_cogl_texture_attributes_t attributes; + CoglTexture *texture = + _cairo_cogl_acquire_pattern_texture (source, destination, + &extents->bounded, + &extents->source_sample_area, + &attributes); + if (!texture) + goto BAIL; + set_layer_texture_with_attributes (pipeline, 0, texture, &attributes); + cogl_object_unref (texture); + } + + if (mask) { + if (mask->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid_pattern = (cairo_solid_pattern_t *)mask; + CoglColor color; + cogl_color_init_from_4f (&color, + solid_pattern->color.red * solid_pattern->color.alpha, + solid_pattern->color.green * solid_pattern->color.alpha, + solid_pattern->color.blue * solid_pattern->color.alpha, + solid_pattern->color.alpha); + cogl_pipeline_set_layer_combine_constant (pipeline, 1, &color); + } else { + cairo_cogl_texture_attributes_t attributes; + CoglTexture *texture = + _cairo_cogl_acquire_pattern_texture (mask, destination, + &extents->bounded, + &extents->mask_sample_area, + &attributes); + if (!texture) + goto BAIL; + set_layer_texture_with_attributes (pipeline, 1, texture, &attributes); + cogl_object_unref (texture); + } + } + + return pipeline; + +BAIL: + cogl_object_unref (pipeline); + return NULL; +} + +#if 0 +CoglPrimitive * +_cairo_cogl_rectangle_new_p2t2t2 (float x, + float y, + float width, + float height) +{ + CoglVertexP2 vertices[] = { + {x, y}, {x, y + height}, {x + width, y + height}, + {x, y}, {x + width, y + height}, {x + width, y} + }; + CoglAttributeBuffer *buffer = cogl_attribute_buffer_new (sizeof (vertices)); + CoglAttribute *pos = cogl_attribute_new (buffer, + "cogl_position_in", + sizeof (CoglVertexP2), + 0, + 2, + COGL_ATTRIBUTE_TYPE_FLOAT); + CoglAttribute *tex_coords0 = cogl_attribute_new (buffer, + "cogl_tex_coord0_in", + sizeof (CoglVertexP2), + 0, + 2, + COGL_ATTRIBUTE_TYPE_FLOAT); + CoglAttribute *tex_coords0 = cogl_attribute_new (buffer, + "cogl_tex_coord0_in", + sizeof (CoglVertexP2), + 0, + 2, + COGL_ATTRIBUTE_TYPE_FLOAT); + CoglPrimitive *prim; + + cogl_buffer_set_data (COGL_BUFFER (buffer), 0, vertices, sizeof (vertices)); + + /* The attributes will now keep the buffer alive... */ + cogl_object_unref (buffer); + + prim = cogl_primitive_new (COGL_VERTICES_MODE_TRIANGLES, + 6, pos, tex_coords, NULL); + + /* The primitive will now keep the attribute alive... */ + cogl_object_unref (pos); + + return prim; +} +#endif + +static void +_cairo_cogl_log_clip (cairo_cogl_surface_t *surface, + const cairo_clip_t *clip) +{ + if (!_cairo_clip_equal (clip, surface->last_clip)) { + _cairo_cogl_journal_log_clip (surface, clip); + _cairo_clip_destroy (surface->last_clip); + surface->last_clip = _cairo_clip_copy (clip); + } +} + +static void +_cairo_cogl_maybe_log_clip (cairo_cogl_surface_t *surface, + cairo_composite_rectangles_t *composite) +{ + cairo_clip_t *clip = composite->clip; + + if (_cairo_composite_rectangles_can_reduce_clip (composite, clip)) + clip = NULL; + + if (clip == NULL) { + if (_cairo_composite_rectangles_can_reduce_clip (composite, + surface->last_clip)) + return; + } + + _cairo_cogl_log_clip (surface, clip); +} + +static cairo_bool_t +is_operator_supported (cairo_operator_t op) +{ + switch ((int)op) { + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_ADD: + return TRUE; + + default: + return FALSE; + } +} + +static cairo_int_status_t +_cairo_cogl_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_cogl_surface_t *surface = abstract_surface; + cairo_composite_rectangles_t extents; + cairo_status_t status; + CoglPipeline *pipeline; + cairo_matrix_t identity; + + /* XXX: Use this to smoke test the acquire_source/dest_image fallback + * paths... */ + //return CAIRO_INT_STATUS_UNSUPPORTED; + + if (!is_operator_supported (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_composite_rectangles_init_for_mask (&extents, + &surface->base, + op, source, mask, clip); + if (unlikely (status)) + return status; + + pipeline = get_source_mask_operator_destination_pipeline (mask, source, + op, surface, &extents); + if (!pipeline){ + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto BAIL; + } + + _cairo_cogl_maybe_log_clip (surface, &extents); + + cairo_matrix_init_identity (&identity); + _cairo_cogl_journal_log_rectangle (surface, pipeline, + extents.bounded.x, + extents.bounded.y, + extents.bounded.width, + extents.bounded.height, + 2, + &identity); + + /* The journal will take a reference on the pipeline and clip_path... */ + cogl_object_unref (pipeline); + +BAIL: + return status; +} + +static int +_cairo_cogl_source_n_layers (const cairo_pattern_t *source) +{ + switch ((int)source->type) + { + case CAIRO_PATTERN_TYPE_SOLID: + return 0; + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_SURFACE: + return 1; + default: + g_warning ("Unsupported source type"); + return 0; + } +} + +static cairo_bool_t +_cairo_cogl_path_fill_meta_equal (const void *key_a, const void *key_b) +{ + const cairo_cogl_path_fill_meta_t *meta0 = key_a; + const cairo_cogl_path_fill_meta_t *meta1 = key_b; + + return _cairo_path_fixed_equal (meta0->user_path, meta1->user_path); +} + +static cairo_bool_t +_cairo_cogl_stroke_style_equal (const cairo_stroke_style_t *a, + const cairo_stroke_style_t *b) +{ + if (a->line_width == b->line_width && + a->line_cap == b->line_cap && + a->line_join == b->line_join && + a->miter_limit == b->miter_limit && + a->num_dashes == b->num_dashes && + a->dash_offset == b->dash_offset) + { + unsigned int i; + for (i = 0; i < a->num_dashes; i++) { + if (a->dash[i] != b->dash[i]) + return FALSE; + } + } + return TRUE; +} + +static cairo_bool_t +_cairo_cogl_path_stroke_meta_equal (const void *key_a, const void *key_b) +{ + const cairo_cogl_path_stroke_meta_t *meta0 = key_a; + const cairo_cogl_path_stroke_meta_t *meta1 = key_b; + + return _cairo_cogl_stroke_style_equal (&meta0->style, &meta1->style) && + _cairo_path_fixed_equal (meta0->user_path, meta1->user_path); +} + +static cairo_cogl_path_stroke_meta_t * +_cairo_cogl_path_stroke_meta_reference (cairo_cogl_path_stroke_meta_t *meta) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&meta->ref_count)); + + _cairo_reference_count_inc (&meta->ref_count); + + return meta; +} + +static void +_cairo_cogl_path_stroke_meta_destroy (cairo_cogl_path_stroke_meta_t *meta) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&meta->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&meta->ref_count)) + return; + + _cairo_path_fixed_fini (meta->user_path); + free (meta->user_path); + + _cairo_stroke_style_fini (&meta->style); + + if (meta->prim) + cogl_object_unref (meta->prim); + + free (meta); +} + +static cairo_cogl_path_stroke_meta_t * +_cairo_cogl_path_stroke_meta_lookup (cairo_cogl_device_t *ctx, + unsigned long hash, + cairo_path_fixed_t *user_path, + const cairo_stroke_style_t *style, + double tolerance) +{ + cairo_cogl_path_stroke_meta_t *ret; + cairo_cogl_path_stroke_meta_t lookup; + + lookup.cache_entry.hash = hash; + lookup.user_path = user_path; + lookup.style = *style; + lookup.tolerance = tolerance; + + ret = _cairo_cache_lookup (&ctx->path_stroke_staging_cache, &lookup.cache_entry); + if (!ret) + ret = _cairo_cache_lookup (&ctx->path_stroke_prim_cache, &lookup.cache_entry); + return ret; +} + +static void +_cairo_cogl_path_stroke_meta_set_prim_size (cairo_cogl_surface_t *surface, + cairo_cogl_path_stroke_meta_t *meta, + size_t size) +{ + /* now that we know the meta structure is associated with a primitive + * we promote it from the staging cache into the primitive cache. + */ + + /* XXX: _cairo_cache borks if you try and remove an entry that's already + * been evicted so we explicitly look it up first... */ + if (_cairo_cache_lookup (&to_device(surface->base.device)->path_stroke_staging_cache, &meta->cache_entry)) { + _cairo_cogl_path_stroke_meta_reference (meta); + _cairo_cache_remove (&to_device(surface->base.device)->path_stroke_staging_cache, &meta->cache_entry); + } + + meta->cache_entry.size = size; + if (_cairo_cache_insert (&to_device(surface->base.device)->path_stroke_prim_cache, &meta->cache_entry) != + CAIRO_STATUS_SUCCESS) + _cairo_cogl_path_stroke_meta_destroy (meta); +} + +static unsigned int +_cairo_cogl_stroke_style_hash (unsigned int hash, + const cairo_stroke_style_t *style) +{ + unsigned int i; + hash = _cairo_hash_bytes (hash, &style->line_width, sizeof (style->line_width)); + hash = _cairo_hash_bytes (hash, &style->line_cap, sizeof (style->line_cap)); + hash = _cairo_hash_bytes (hash, &style->line_join, sizeof (style->line_join)); + hash = _cairo_hash_bytes (hash, &style->miter_limit, sizeof (style->miter_limit)); + hash = _cairo_hash_bytes (hash, &style->num_dashes, sizeof (style->num_dashes)); + hash = _cairo_hash_bytes (hash, &style->dash_offset, sizeof (style->dash_offset)); + for (i = 0; i < style->num_dashes; i++) + hash = _cairo_hash_bytes (hash, &style->dash[i], sizeof (double)); + return hash; +} + +static cairo_cogl_path_stroke_meta_t * +_cairo_cogl_get_path_stroke_meta (cairo_cogl_surface_t *surface, + const cairo_stroke_style_t *style, + double tolerance) +{ + unsigned long hash; + cairo_cogl_path_stroke_meta_t *meta = NULL; + cairo_path_fixed_t *meta_path = NULL; + cairo_status_t status; + + if (!surface->user_path) + return NULL; + + hash = _cairo_path_fixed_hash (surface->user_path); + hash = _cairo_cogl_stroke_style_hash (hash, style); + hash = _cairo_hash_bytes (hash, &tolerance, sizeof (tolerance)); + + meta = _cairo_cogl_path_stroke_meta_lookup (to_device(surface->base.device), hash, + surface->user_path, style, tolerance); + if (meta) + return meta; + + meta = calloc (1, sizeof (cairo_cogl_path_stroke_meta_t)); + if (!meta) + goto BAIL; + CAIRO_REFERENCE_COUNT_INIT (&meta->ref_count, 1); + meta->cache_entry.hash = hash; + meta->counter = 0; + meta_path = malloc (sizeof (cairo_path_fixed_t)); + if (!meta_path) + goto BAIL; + /* FIXME: we should add a ref-counted wrapper for our user_paths + * so we don't have to keep copying them here! */ + status = _cairo_path_fixed_init_copy (meta_path, surface->user_path); + if (unlikely (status)) + goto BAIL; + meta->user_path = meta_path; + meta->ctm_inverse = *surface->ctm_inverse; + + status = _cairo_stroke_style_init_copy (&meta->style, style); + if (unlikely (status)) { + _cairo_path_fixed_fini (meta_path); + goto BAIL; + } + meta->tolerance = tolerance; + + return meta; + +BAIL: + free (meta_path); + free (meta); + return NULL; +} + +static cairo_int_status_t +_cairo_cogl_stroke_to_primitive (cairo_cogl_surface_t *surface, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + int n_layers, + cairo_bool_t one_shot, + CoglPrimitive **primitive, + size_t *size) +{ + cairo_traps_t traps; + cairo_int_status_t status; + + _cairo_traps_init (&traps); + + status = _cairo_path_fixed_stroke_polygon_to_traps (path, style, + ctm, ctm_inverse, + tolerance, + &traps); + if (unlikely (status)) + goto BAIL; + + if (traps.num_traps == 0) { + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + goto BAIL; + } + + *size = traps.num_traps * sizeof (CoglVertexP2) * 6; + + //g_print ("new stroke prim\n"); + *primitive = _cairo_cogl_traps_to_composite_prim (surface, &traps, n_layers, one_shot); + if (!*primitive) { + status = CAIRO_INT_STATUS_NO_MEMORY; + goto BAIL; + } + +BAIL: + _cairo_traps_fini (&traps); + return status; +} + +static cairo_int_status_t +_cairo_cogl_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)abstract_surface; + cairo_composite_rectangles_t extents; + CoglPipeline *pipeline; + cairo_status_t status; +#ifdef ENABLE_PATH_CACHE + cairo_cogl_path_stroke_meta_t *meta = NULL; + cairo_matrix_t transform_matrix; +#endif + cairo_matrix_t *transform = NULL; + gboolean one_shot = TRUE; + CoglPrimitive *prim = NULL; + cairo_bool_t new_prim = FALSE; + + if (! is_operator_supported (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* FIXME - support unbounded operators */ + if (!_cairo_operator_bounded_by_mask (op)) { + /* Currently IN this is the only unbounded operator we aim to support + * in cairo-cogl. */ + assert (op == CAIRO_OPERATOR_IN); + g_warning ("FIXME: handle stroking with unbounded operators!"); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = _cairo_composite_rectangles_init_for_stroke (&extents, + &surface->base, + op, source, path, + style, + ctm, + clip); + if (unlikely (status)) + return status; + +#ifdef ENABLE_PATH_CACHE + /* FIXME: we are currently leaking the meta state if we don't reach + * the cache_insert at the end. */ + meta = _cairo_cogl_get_path_stroke_meta (surface, style, tolerance); + if (meta) { + prim = meta->prim; + if (prim) { + cairo_matrix_multiply (&transform_matrix, &meta->ctm_inverse, surface->ctm); + transform = &transform_matrix; + } else if (meta->counter++ > 10) + one_shot = FALSE; + } +#endif + + if (!prim) { + int n_layers = _cairo_cogl_source_n_layers (source); + size_t prim_size = 0; + status = _cairo_cogl_stroke_to_primitive (surface, path, style, + ctm, ctm_inverse, tolerance, + n_layers, one_shot, + &prim, &prim_size); + if (unlikely (status)) + return status; + new_prim = TRUE; +#if defined (ENABLE_PATH_CACHE) + if (meta) { + meta->prim = cogl_object_ref (prim); + _cairo_cogl_path_stroke_meta_set_prim_size (surface, meta, prim_size); + } +#endif + } + + pipeline = get_source_mask_operator_destination_pipeline (NULL, source, + op, surface, &extents); + if (!pipeline) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_cogl_maybe_log_clip (surface, &extents); + + _cairo_cogl_journal_log_primitive (surface, pipeline, prim, transform); + + /* The journal will take a reference on the pipeline and primitive... */ + cogl_object_unref (pipeline); + if (new_prim) + cogl_object_unref (prim); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_cogl_path_fill_meta_t * +_cairo_cogl_path_fill_meta_reference (cairo_cogl_path_fill_meta_t *meta) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&meta->ref_count)); + + _cairo_reference_count_inc (&meta->ref_count); + + return meta; +} + +static void +_cairo_cogl_path_fill_meta_destroy (cairo_cogl_path_fill_meta_t *meta) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&meta->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&meta->ref_count)) + return; + + _cairo_path_fixed_fini (meta->user_path); + free (meta->user_path); + + if (meta->prim) + cogl_object_unref (meta->prim); + + free (meta); +} + +static cairo_cogl_path_fill_meta_t * +_cairo_cogl_path_fill_meta_lookup (cairo_cogl_device_t *ctx, + unsigned long hash, + cairo_path_fixed_t *user_path) +{ + cairo_cogl_path_fill_meta_t *ret; + cairo_cogl_path_fill_meta_t lookup; + + lookup.cache_entry.hash = hash; + lookup.user_path = user_path; + + ret = _cairo_cache_lookup (&ctx->path_fill_staging_cache, &lookup.cache_entry); + if (!ret) + ret = _cairo_cache_lookup (&ctx->path_fill_prim_cache, &lookup.cache_entry); + return ret; +} + +static void +_cairo_cogl_path_fill_meta_set_prim_size (cairo_cogl_surface_t *surface, + cairo_cogl_path_fill_meta_t *meta, + size_t size) +{ + /* now that we know the meta structure is associated with a primitive + * we promote it from the staging cache into the primitive cache. + */ + + /* XXX: _cairo_cache borks if you try and remove an entry that's already + * been evicted so we explicitly look it up first... */ + if (_cairo_cache_lookup (&to_device(surface->base.device)->path_fill_staging_cache, &meta->cache_entry)) { + _cairo_cogl_path_fill_meta_reference (meta); + _cairo_cache_remove (&to_device(surface->base.device)->path_fill_staging_cache, &meta->cache_entry); + } + + meta->cache_entry.size = size; + if (_cairo_cache_insert (&to_device(surface->base.device)->path_fill_prim_cache, &meta->cache_entry) != + CAIRO_STATUS_SUCCESS) + _cairo_cogl_path_fill_meta_destroy (meta); +} + +static cairo_cogl_path_fill_meta_t * +_cairo_cogl_get_path_fill_meta (cairo_cogl_surface_t *surface) +{ + unsigned long hash; + cairo_cogl_path_fill_meta_t *meta = NULL; + cairo_path_fixed_t *meta_path = NULL; + cairo_status_t status; + + if (!surface->user_path) + return NULL; + + hash = _cairo_path_fixed_hash (surface->user_path); + + meta = _cairo_cogl_path_fill_meta_lookup (to_device(surface->base.device), + hash, surface->user_path); + if (meta) + return meta; + + meta = calloc (1, sizeof (cairo_cogl_path_fill_meta_t)); + if (!meta) + goto BAIL; + meta->cache_entry.hash = hash; + meta->counter = 0; + CAIRO_REFERENCE_COUNT_INIT (&meta->ref_count, 1); + meta_path = malloc (sizeof (cairo_path_fixed_t)); + if (!meta_path) + goto BAIL; + /* FIXME: we should add a ref-counted wrapper for our user_paths + * so we don't have to keep copying them here! */ + status = _cairo_path_fixed_init_copy (meta_path, surface->user_path); + if (unlikely (status)) + goto BAIL; + meta->user_path = meta_path; + meta->ctm_inverse = *surface->ctm_inverse; + + /* To start with - until we associate a CoglPrimitive with the meta + * structure - we keep the meta in a staging structure until we + * see whether it actually gets re-used. */ + meta->cache_entry.size = 1; + if (_cairo_cache_insert (&to_device(surface->base.device)->path_fill_staging_cache, &meta->cache_entry) != + CAIRO_STATUS_SUCCESS) + _cairo_cogl_path_fill_meta_destroy (meta); + + return meta; + +BAIL: + free (meta_path); + free (meta); + return NULL; +} + +static cairo_int_status_t +_cairo_cogl_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_cogl_surface_t *surface = abstract_surface; + cairo_composite_rectangles_t extents; + cairo_status_t status; +#ifdef ENABLE_PATH_CACHE + cairo_cogl_path_fill_meta_t *meta = NULL; + cairo_matrix_t transform_matrix; +#endif + cairo_matrix_t *transform = NULL; + cairo_bool_t one_shot = TRUE; + CoglPrimitive *prim = NULL; + cairo_bool_t new_prim = FALSE; + CoglPipeline *pipeline; + + if (! is_operator_supported (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* FIXME - support unbounded operators */ + if (!_cairo_operator_bounded_by_mask (op)) { + /* Currently IN this is the only unbounded operator we aim to support + * in cairo-cogl. */ + assert (op == CAIRO_OPERATOR_IN); + g_warning ("FIXME: handle filling with unbounded operators!"); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = _cairo_composite_rectangles_init_for_fill (&extents, + &surface->base, + op, source, path, + clip); + if (unlikely (status)) + return status; + +#ifndef FILL_WITH_COGL_PATH +#ifdef ENABLE_PATH_CACHE + meta = _cairo_cogl_get_path_fill_meta (surface); + if (meta) { + prim = meta->prim; + if (prim) { + cairo_matrix_multiply (&transform_matrix, &meta->ctm_inverse, surface->ctm); + transform = &transform_matrix; + } else if (meta->counter++ > 10) + one_shot = FALSE; + } +#endif /* ENABLE_PATH_CACHE */ + + if (!prim) { + int n_layers = _cairo_cogl_source_n_layers (source); + size_t prim_size; + status = _cairo_cogl_fill_to_primitive (surface, path, fill_rule, tolerance, + one_shot, n_layers, &prim, &prim_size); + if (unlikely (status)) + return status; + new_prim = TRUE; +#ifdef ENABLE_PATH_CACHE + if (meta) { + meta->prim = cogl_object_ref (prim); + _cairo_cogl_path_fill_meta_set_prim_size (surface, meta, prim_size); + } +#endif /* ENABLE_PATH_CACHE */ + } + +#endif /* !FILL_WITH_COGL_PATH */ + + pipeline = get_source_mask_operator_destination_pipeline (NULL, source, + op, surface, &extents); + if (!pipeline) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_cogl_maybe_log_clip (surface, &extents); + +#ifndef FILL_WITH_COGL_PATH + _cairo_cogl_journal_log_primitive (surface, pipeline, prim, transform); + /* The journal will take a reference on the prim */ + if (new_prim) + cogl_object_unref (prim); +#else + CoglPath * cogl_path = _cairo_cogl_util_path_from_cairo (path, fill_rule, tolerance); + _cairo_cogl_journal_log_path (surface, pipeline, cogl_path); + cogl_object_unref (cogl_path); +#endif + + /* The journal will take a reference on the pipeline... */ + cogl_object_unref (pipeline); + + return CAIRO_INT_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_cogl_surface_fill_rectangle (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + double x, + double y, + double width, + double height, + cairo_matrix_t *ctm, + const cairo_clip_t *clip) +{ + cairo_cogl_surface_t *surface = abstract_surface; + CoglPipeline *pipeline; + + if (! is_operator_supported (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* FIXME - support unbounded operators */ + if (!_cairo_operator_bounded_by_mask (op)) { + /* Currently IN this is the only unbounded operator we aim to support + * in cairo-cogl. */ + assert (op == CAIRO_OPERATOR_IN); + g_warning ("FIXME: handle filling with unbounded operators!"); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* FIXME */ +#if 0 + status = _cairo_composite_rectangles_init_for_fill_rectangle (&extents, + &surface->base, + op, source, path, + clip); + if (unlikely (status)) + return status; +#endif + + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + double x1 = x; + double y1 = y; + double x2 = x1 + width; + double y2 = y1 + height; + + pipeline = get_source_mask_operator_destination_pipeline (NULL, source, + op, surface, NULL); + if (!pipeline) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_cogl_log_clip (surface, clip); + + _cairo_cogl_journal_log_rectangle (surface, + pipeline, + x1, y1, x2, y2, + 0, + ctm); + return CAIRO_INT_STATUS_SUCCESS; + } else + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* TODO: + * We need to acquire the textures here, look at the corresponding + * attributes and see if this can be trivially handled by logging + * a textured rectangle only needing simple scaling or translation + * of texture coordinates. + * + * At this point we should also aim to remap the default + * EXTEND_NONE mode to EXTEND_PAD which is more efficient if we + * know it makes no difference either way since we can map that to + * CLAMP_TO_EDGE. + */ +} + +static cairo_int_status_t +_cairo_cogl_surface_show_glyphs (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +const cairo_surface_backend_t _cairo_cogl_surface_backend = { + CAIRO_SURFACE_TYPE_COGL, + _cairo_cogl_surface_finish, +#ifdef NEED_COGL_CONTEXT + _cairo_cogl_context_create, +#else + _cairo_default_context_create, +#endif + + _cairo_cogl_surface_create_similar, + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + _cairo_cogl_surface_acquire_source_image, + _cairo_cogl_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_cogl_surface_get_extents, + NULL, /* get_font_options */ + + _cairo_cogl_surface_flush, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_cogl_surface_paint, + _cairo_cogl_surface_mask, + _cairo_cogl_surface_stroke, + _cairo_cogl_surface_fill, + NULL, /* fill_stroke*/ + _cairo_surface_fallback_glyphs, +}; + +static cairo_surface_t * +_cairo_cogl_surface_create_full (cairo_cogl_device_t *dev, + cairo_bool_t ignore_alpha, + CoglFramebuffer *framebuffer, + CoglTexture *texture) +{ + cairo_cogl_surface_t *surface; + cairo_status_t status; + + status = cairo_device_acquire (&dev->base); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + surface = malloc (sizeof (cairo_cogl_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface->ignore_alpha = ignore_alpha; + + surface->framebuffer = framebuffer; + if (framebuffer) { + surface->width = cogl_framebuffer_get_width (framebuffer); + surface->height = cogl_framebuffer_get_height (framebuffer); + surface->cogl_format = cogl_framebuffer_get_color_format (framebuffer); + cogl_object_ref (framebuffer); + } + + /* FIXME: If texture == NULL and we are given an offscreen framebuffer + * then we want a way to poke inside the framebuffer to get a texture */ + surface->texture = texture; + if (texture) { + if (!framebuffer) { + surface->width = cogl_texture_get_width (texture); + surface->height = cogl_texture_get_height (texture); + surface->cogl_format = cogl_texture_get_format (texture); + } + cogl_object_ref (texture); + } + + assert(surface->width && surface->height); + + surface->journal = NULL; + + surface->buffer_stack = NULL; + surface->buffer_stack_size = 4096; + + surface->last_clip = NULL; + + surface->n_clip_updates_per_frame = 0; + + _cairo_surface_init (&surface->base, + &_cairo_cogl_surface_backend, + &dev->base, + CAIRO_CONTENT_COLOR_ALPHA); + + return &surface->base; +} + +cairo_surface_t * +cairo_cogl_surface_create (cairo_device_t *abstract_device, + CoglFramebuffer *framebuffer) +{ + cairo_cogl_device_t *dev = (cairo_cogl_device_t *)abstract_device; + + if (abstract_device == NULL) + return _cairo_surface_create_in_error (CAIRO_STATUS_DEVICE_ERROR); + + if (abstract_device->status) + return _cairo_surface_create_in_error (abstract_device->status); + + if (abstract_device->backend->type != CAIRO_DEVICE_TYPE_COGL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + + return _cairo_cogl_surface_create_full (dev, FALSE, framebuffer, NULL); +} +slim_hidden_def (cairo_cogl_surface_create); + +CoglFramebuffer * +cairo_cogl_surface_get_framebuffer (cairo_surface_t *abstract_surface) +{ + cairo_cogl_surface_t *surface; + + if (abstract_surface->backend != &_cairo_cogl_surface_backend) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + surface = (cairo_cogl_surface_t *) abstract_surface; + + return surface->framebuffer; +} +slim_hidden_def (cairo_cogl_surface_get_framebuffer); + +CoglTexture * +cairo_cogl_surface_get_texture (cairo_surface_t *abstract_surface) +{ + cairo_cogl_surface_t *surface; + + if (abstract_surface->backend != &_cairo_cogl_surface_backend) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + surface = (cairo_cogl_surface_t *) abstract_surface; + + return surface->texture; +} +slim_hidden_def (cairo_cogl_surface_get_texture); + +static cairo_status_t +_cairo_cogl_device_flush (void *device) +{ + cairo_status_t status; + + status = cairo_device_acquire (device); + if (unlikely (status)) + return status; + + /* XXX: we don't need to flush Cogl here, we just need to flush + * any batching we do of compositing primitives. */ + + cairo_device_release (device); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_cogl_device_finish (void *device) +{ + cairo_status_t status; + + status = cairo_device_acquire (device); + if (unlikely (status)) + return; + + /* XXX: Drop references to external resources */ + + cairo_device_release (device); +} + +static void +_cairo_cogl_device_destroy (void *device) +{ + cairo_cogl_device_t *dev = device; + + /* FIXME: Free stuff! */ + + g_free (dev); +} + +static const cairo_device_backend_t _cairo_cogl_device_backend = { + CAIRO_DEVICE_TYPE_COGL, + + NULL, /* lock */ + NULL, /* unlock */ + + _cairo_cogl_device_flush, + _cairo_cogl_device_finish, + _cairo_cogl_device_destroy, +}; + +static cairo_bool_t +set_blend (CoglPipeline *pipeline, const char *blend_string) +{ + GError *error = NULL; + if (!cogl_pipeline_set_blend (pipeline, blend_string, &error)) { + g_warning ("Unsupported blend string with current gpu/driver: %s", blend_string); + g_error_free (error); + return FALSE; + } + return TRUE; +} + +static cairo_bool_t +_cairo_cogl_setup_op_state (CoglPipeline *pipeline, cairo_operator_t op) +{ + cairo_bool_t status = FALSE; + + switch ((int)op) + { + case CAIRO_OPERATOR_SOURCE: + status = set_blend (pipeline, "RGBA = ADD (SRC_COLOR, 0)"); + break; + case CAIRO_OPERATOR_OVER: + status = set_blend (pipeline, "RGBA = ADD (SRC_COLOR, DST_COLOR * (1 - SRC_COLOR[A]))"); + break; + case CAIRO_OPERATOR_IN: + status = set_blend (pipeline, "RGBA = ADD (SRC_COLOR * DST_COLOR[A], 0)"); + break; + case CAIRO_OPERATOR_DEST_OVER: + status = set_blend (pipeline, "RGBA = ADD (SRC_COLOR * (1 - DST_COLOR[A]), DST_COLOR)"); + break; + case CAIRO_OPERATOR_DEST_IN: + status = set_blend (pipeline, "RGBA = ADD (0, DST_COLOR * SRC_COLOR[A])"); + break; + case CAIRO_OPERATOR_ADD: + status = set_blend (pipeline, "RGBA = ADD (SRC_COLOR, DST_COLOR)"); + break; + } + + return status; +} + +static void +create_templates_for_op (cairo_cogl_device_t *dev, cairo_operator_t op) +{ + CoglPipeline *base = cogl_pipeline_new (); + CoglPipeline *pipeline; + CoglColor color; + + if (!_cairo_cogl_setup_op_state (base, op)) { + cogl_object_unref (base); + return; + } + + dev->template_pipelines[op][CAIRO_COGL_TEMPLATE_TYPE_SOLID] = base; + + pipeline = cogl_pipeline_copy (base); + cogl_pipeline_set_layer_texture (pipeline, 0, dev->dummy_texture); + dev->template_pipelines[op][CAIRO_COGL_TEMPLATE_TYPE_TEXTURE] = pipeline; + + pipeline = cogl_pipeline_copy (base); + cogl_pipeline_set_layer_combine (pipeline, 1, + "RGBA = MODULATE (PREVIOUS, CONSTANT[A])", + NULL); + cogl_pipeline_set_layer_combine_constant (pipeline, 1, &color); + cogl_pipeline_set_layer_texture (pipeline, 1, dev->dummy_texture); + dev->template_pipelines[op][CAIRO_COGL_TEMPLATE_TYPE_MASK_SOLID] = pipeline; + + pipeline = cogl_pipeline_copy (base); + cogl_pipeline_set_layer_combine (pipeline, 1, + "RGBA = MODULATE (PREVIOUS, TEXTURE[A])", + NULL); + cogl_pipeline_set_layer_texture (pipeline, 1, dev->dummy_texture); + dev->template_pipelines[op][CAIRO_COGL_TEMPLATE_TYPE_MASK_TEXTURE] = pipeline; +} + +cairo_device_t * +cairo_cogl_device_create (CoglContext *cogl_context) +{ + cairo_cogl_device_t *dev = g_new0 (cairo_cogl_device_t, 1); + cairo_status_t status; + + dev->backend_vtable_initialized = FALSE; + + dev->cogl_context = cogl_context; + + dev->dummy_texture = cogl_texture_new_with_size (1, 1, + COGL_TEXTURE_NO_SLICING, + COGL_PIXEL_FORMAT_ANY); + if (!dev->dummy_texture) + goto ERROR; + + memset (dev->template_pipelines, 0, sizeof (dev->template_pipelines)); + create_templates_for_op (dev, CAIRO_OPERATOR_SOURCE); + create_templates_for_op (dev, CAIRO_OPERATOR_OVER); + create_templates_for_op (dev, CAIRO_OPERATOR_IN); + create_templates_for_op (dev, CAIRO_OPERATOR_DEST_OVER); + create_templates_for_op (dev, CAIRO_OPERATOR_DEST_IN); + create_templates_for_op (dev, CAIRO_OPERATOR_ADD); + + status = _cairo_cache_init (&dev->linear_cache, + _cairo_cogl_linear_gradient_equal, + NULL, + (cairo_destroy_func_t) _cairo_cogl_linear_gradient_destroy, + CAIRO_COGL_LINEAR_GRADIENT_CACHE_SIZE); + if (unlikely (status)) + return _cairo_device_create_in_error(status); + + status = _cairo_cache_init (&dev->path_fill_staging_cache, + _cairo_cogl_path_fill_meta_equal, + NULL, + (cairo_destroy_func_t) _cairo_cogl_path_fill_meta_destroy, + 1000); + + status = _cairo_cache_init (&dev->path_stroke_staging_cache, + _cairo_cogl_path_stroke_meta_equal, + NULL, + (cairo_destroy_func_t) _cairo_cogl_path_stroke_meta_destroy, + 1000); + + status = _cairo_cache_init (&dev->path_fill_prim_cache, + _cairo_cogl_path_fill_meta_equal, + NULL, + (cairo_destroy_func_t) _cairo_cogl_path_fill_meta_destroy, + CAIRO_COGL_PATH_META_CACHE_SIZE); + + status = _cairo_cache_init (&dev->path_stroke_prim_cache, + _cairo_cogl_path_stroke_meta_equal, + NULL, + (cairo_destroy_func_t) _cairo_cogl_path_stroke_meta_destroy, + CAIRO_COGL_PATH_META_CACHE_SIZE); + + _cairo_device_init (&dev->base, &_cairo_cogl_device_backend); + return &dev->base; + +ERROR: + g_free (dev); + return _cairo_device_create_in_error (CAIRO_STATUS_DEVICE_ERROR); +} +slim_hidden_def (cairo_cogl_device_create); + +void +cairo_cogl_surface_end_frame (cairo_surface_t *abstract_surface) +{ + cairo_cogl_surface_t *surface = (cairo_cogl_surface_t *)abstract_surface; + cairo_surface_flush (abstract_surface); + + //g_print ("n_clip_update_per_frame = %d\n", surface->n_clip_updates_per_frame); + surface->n_clip_updates_per_frame = 0; +} +slim_hidden_def (cairo_cogl_surface_end_frame); diff --git a/src/cairo-cogl-utils-private.h b/src/cairo-cogl-utils-private.h new file mode 100644 index 000000000..ee77f3034 --- /dev/null +++ b/src/cairo-cogl-utils-private.h @@ -0,0 +1,54 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ + +#ifndef CAIRO_COGL_UTILS_PRIVATE_H +#define CAIRO_COGL_UTILS_PRIVATE_H + +#include "cairo-path-fixed-private.h" +#include + +CoglPath * +_cairo_cogl_util_path_from_cairo (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + float tolerance); + +int +_cairo_cogl_util_next_p2 (int a); + +#define CAIRO_FIXED_ONE_FLOAT ((float)(1 << CAIRO_FIXED_FRAC_BITS)) + +static inline float +_cairo_cogl_util_fixed_to_float (cairo_fixed_t f) +{ + return ((float) f) / CAIRO_FIXED_ONE_FLOAT; +} + +#endif /* CAIRO_COGL_UTILS_PRIVATE_H */ diff --git a/src/cairo-cogl-utils.c b/src/cairo-cogl-utils.c new file mode 100644 index 000000000..4f02aaa52 --- /dev/null +++ b/src/cairo-cogl-utils.c @@ -0,0 +1,126 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Robert Bragg + */ + +#include "cairoint.h" +#include "cairo-cogl-utils-private.h" + +#include +#include + +static cairo_status_t +_cogl_move_to (void *closure, + const cairo_point_t *point) +{ + cogl_path_move_to (closure, + _cairo_cogl_util_fixed_to_float (point->x), + _cairo_cogl_util_fixed_to_float (point->y)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cogl_line_to (void *closure, + const cairo_point_t *point) +{ + cogl_path_line_to (closure, + _cairo_cogl_util_fixed_to_float (point->x), + _cairo_cogl_util_fixed_to_float (point->y)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cogl_curve_to (void *closure, + const cairo_point_t *p0, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + cogl_path_curve_to (closure, + _cairo_cogl_util_fixed_to_float (p0->x), + _cairo_cogl_util_fixed_to_float (p0->y), + _cairo_cogl_util_fixed_to_float (p1->x), + _cairo_cogl_util_fixed_to_float (p1->y), + _cairo_cogl_util_fixed_to_float (p2->x), + _cairo_cogl_util_fixed_to_float (p2->y)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cogl_close_path (void *closure) +{ + cogl_path_close (closure); + return CAIRO_STATUS_SUCCESS; +} + +CoglPath * +_cairo_cogl_util_path_from_cairo (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + float tolerance) +{ + CoglPath *cogl_path = cogl_path_new (); + cairo_status_t status; + + if (fill_rule == CAIRO_FILL_RULE_EVEN_ODD) + cogl_path_set_fill_rule (cogl_path, COGL_PATH_FILL_RULE_EVEN_ODD); + else + cogl_path_set_fill_rule (cogl_path, COGL_PATH_FILL_RULE_NON_ZERO); + +#ifdef USE_CAIRO_PATH_FLATTENER + /* XXX: rely on cairo to do path flattening, since it seems Cogl's + * curve_to flattening is much slower */ + status = _cairo_path_fixed_interpret_flat (path, + _cogl_move_to, + _cogl_line_to, + _cogl_close_path, + cogl_path, + tolerance); +#else + status = _cairo_path_fixed_interpret (path, + _cogl_move_to, + _cogl_line_to, + _cogl_curve_to, + _cogl_close_path, + cogl_path); +#endif + + assert (status == CAIRO_STATUS_SUCCESS); + return cogl_path; +} + +int +_cairo_cogl_util_next_p2 (int a) +{ + int rval = 1; + + while (rval < a) + rval <<= 1; + + return rval; +} + diff --git a/src/cairo-cogl.h b/src/cairo-cogl.h new file mode 100644 index 000000000..f270d74d3 --- /dev/null +++ b/src/cairo-cogl.h @@ -0,0 +1,69 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Corporation. + * + * Contributor(s): + * Robert Bragg + */ + +#ifndef CAIRO_VG_H +#define CAIRO_VG_H + +#include "cairo.h" + +#if CAIRO_HAS_COGL_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_device_t * +cairo_cogl_device_create (CoglContext *context); + +cairo_public cairo_surface_t * +cairo_cogl_surface_create (cairo_device_t *device, + CoglFramebuffer *framebuffer); + +cairo_public CoglFramebuffer * +cairo_cogl_surface_get_framebuffer (cairo_surface_t *surface); + +cairo_public CoglTexture * +cairo_cogl_surface_get_texture (cairo_surface_t *surface); + +cairo_public void +cairo_cogl_surface_end_frame (cairo_surface_t *surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_COGL_SURFACE*/ +# error Cairo was not compiled with support for the Cogl backend +#endif /* CAIRO_HAS_COGL_SURFACE*/ + +#endif /* CAIRO_COGL_H */ diff --git a/src/cairo-color.c b/src/cairo-color.c new file mode 100644 index 000000000..c2a11a177 --- /dev/null +++ b/src/cairo-color.c @@ -0,0 +1,193 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +static cairo_color_t const cairo_color_white = { + 1.0, 1.0, 1.0, 1.0, + 0xffff, 0xffff, 0xffff, 0xffff +}; + +static cairo_color_t const cairo_color_black = { + 0.0, 0.0, 0.0, 1.0, + 0x0, 0x0, 0x0, 0xffff +}; + +static cairo_color_t const cairo_color_transparent = { + 0.0, 0.0, 0.0, 0.0, + 0x0, 0x0, 0x0, 0x0 +}; + +static cairo_color_t const cairo_color_magenta = { + 1.0, 0.0, 1.0, 1.0, + 0xffff, 0x0, 0xffff, 0xffff +}; + +const cairo_color_t * +_cairo_stock_color (cairo_stock_t stock) +{ + switch (stock) { + case CAIRO_STOCK_WHITE: + return &cairo_color_white; + case CAIRO_STOCK_BLACK: + return &cairo_color_black; + case CAIRO_STOCK_TRANSPARENT: + return &cairo_color_transparent; + + case CAIRO_STOCK_NUM_COLORS: + default: + ASSERT_NOT_REACHED; + /* If the user can get here somehow, give a color that indicates a + * problem. */ + return &cairo_color_magenta; + } +} + +/* Convert a double in [0.0, 1.0] to an integer in [0, 65535] + * The conversion is designed to choose the integer i such that + * i / 65535.0 is as close as possible to the input value. + */ +uint16_t +_cairo_color_double_to_short (double d) +{ + return d * 65535.0 + 0.5; +} + +static void +_cairo_color_compute_shorts (cairo_color_t *color) +{ + color->red_short = _cairo_color_double_to_short (color->red * color->alpha); + color->green_short = _cairo_color_double_to_short (color->green * color->alpha); + color->blue_short = _cairo_color_double_to_short (color->blue * color->alpha); + color->alpha_short = _cairo_color_double_to_short (color->alpha); +} + +void +_cairo_color_init_rgba (cairo_color_t *color, + double red, double green, double blue, + double alpha) +{ + color->red = red; + color->green = green; + color->blue = blue; + color->alpha = alpha; + + _cairo_color_compute_shorts (color); +} + +void +_cairo_color_multiply_alpha (cairo_color_t *color, + double alpha) +{ + color->alpha *= alpha; + + _cairo_color_compute_shorts (color); +} + +void +_cairo_color_get_rgba (cairo_color_t *color, + double *red, + double *green, + double *blue, + double *alpha) +{ + *red = color->red; + *green = color->green; + *blue = color->blue; + *alpha = color->alpha; +} + +void +_cairo_color_get_rgba_premultiplied (cairo_color_t *color, + double *red, + double *green, + double *blue, + double *alpha) +{ + *red = color->red * color->alpha; + *green = color->green * color->alpha; + *blue = color->blue * color->alpha; + *alpha = color->alpha; +} + +/* NB: This function works both for unmultiplied and premultiplied colors */ +cairo_bool_t +_cairo_color_equal (const cairo_color_t *color_a, + const cairo_color_t *color_b) +{ + if (color_a == color_b) + return TRUE; + + if (color_a->alpha_short != color_b->alpha_short) + return FALSE; + + if (color_a->alpha_short == 0) + return TRUE; + + return color_a->red_short == color_b->red_short && + color_a->green_short == color_b->green_short && + color_a->blue_short == color_b->blue_short; +} + +cairo_bool_t +_cairo_color_stop_equal (const cairo_color_stop_t *color_a, + const cairo_color_stop_t *color_b) +{ + if (color_a == color_b) + return TRUE; + + return color_a->alpha_short == color_b->alpha_short && + color_a->red_short == color_b->red_short && + color_a->green_short == color_b->green_short && + color_a->blue_short == color_b->blue_short; +} + +cairo_content_t +_cairo_color_get_content (const cairo_color_t *color) +{ + if (CAIRO_COLOR_IS_OPAQUE (color)) + return CAIRO_CONTENT_COLOR; + + if (color->red_short == 0 && + color->green_short == 0 && + color->blue_short == 0) + { + return CAIRO_CONTENT_ALPHA; + } + + return CAIRO_CONTENT_COLOR_ALPHA; +} diff --git a/src/cairo-combsort-inline.h b/src/cairo-combsort-inline.h new file mode 100644 index 000000000..d359faeb5 --- /dev/null +++ b/src/cairo-combsort-inline.h @@ -0,0 +1,94 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +/* This fragment implements a comb sort (specifically combsort11) */ +#ifndef _HAVE_CAIRO_COMBSORT_NEWGAP +#define _HAVE_CAIRO_COMBSORT_NEWGAP +static inline unsigned int +_cairo_combsort_newgap (unsigned int gap) +{ + gap = 10 * gap / 13; + if (gap == 9 || gap == 10) + gap = 11; + if (gap < 1) + gap = 1; + return gap; +} +#endif + +#define CAIRO_COMBSORT_DECLARE(NAME, TYPE, CMP) \ +static void \ +NAME (TYPE *base, unsigned int nmemb) \ +{ \ + unsigned int gap = nmemb; \ + unsigned int i, j; \ + int swapped; \ + do { \ + gap = _cairo_combsort_newgap (gap); \ + swapped = gap > 1; \ + for (i = 0; i < nmemb-gap ; i++) { \ + j = i + gap; \ + if (CMP (base[i], base[j]) > 0 ) { \ + TYPE tmp; \ + tmp = base[i]; \ + base[i] = base[j]; \ + base[j] = tmp; \ + swapped = 1; \ + } \ + } \ + } while (swapped); \ +} + +#define CAIRO_COMBSORT_DECLARE_WITH_DATA(NAME, TYPE, CMP) \ +static void \ +NAME (TYPE *base, unsigned int nmemb, void *data) \ +{ \ + unsigned int gap = nmemb; \ + unsigned int i, j; \ + int swapped; \ + do { \ + gap = _cairo_combsort_newgap (gap); \ + swapped = gap > 1; \ + for (i = 0; i < nmemb-gap ; i++) { \ + j = i + gap; \ + if (CMP (base[i], base[j], data) > 0 ) { \ + TYPE tmp; \ + tmp = base[i]; \ + base[i] = base[j]; \ + base[j] = tmp; \ + swapped = 1; \ + } \ + } \ + } while (swapped); \ +} diff --git a/src/cairo-compiler-private.h b/src/cairo-compiler-private.h new file mode 100644 index 000000000..216e71b4e --- /dev/null +++ b/src/cairo-compiler-private.h @@ -0,0 +1,244 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_COMPILER_PRIVATE_H +#define CAIRO_COMPILER_PRIVATE_H + +#include "cairo.h" + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +/* Size in bytes of buffer to use off the stack per functions. + * Mostly used by text functions. For larger allocations, they'll + * malloc(). */ +#ifndef CAIRO_STACK_BUFFER_SIZE +#define CAIRO_STACK_BUFFER_SIZE (512 * sizeof (int)) +#endif + +#define CAIRO_STACK_ARRAY_LENGTH(T) (CAIRO_STACK_BUFFER_SIZE / sizeof(T)) + +/* + * The goal of this block is to define the following macros for + * providing faster linkage to functions in the public API for calls + * from within cairo. + * + * slim_hidden_proto(f) + * slim_hidden_proto_no_warn(f) + * + * Declares `f' as a library internal function and hides the + * function from the global symbol table. This macro must be + * expanded after `f' has been declared with a prototype but before + * any calls to the function are seen by the compiler. The no_warn + * variant inhibits warnings about the return value being unused at + * call sites. The macro works by renaming `f' to an internal name + * in the symbol table and hiding that. As far as cairo internal + * calls are concerned they're calling a library internal function + * and thus don't need to bounce via the PLT. + * + * slim_hidden_def(f) + * + * Exports `f' back to the global symbol table. This macro must be + * expanded right after the function definition and only for symbols + * hidden previously with slim_hidden_proto(). The macro works by + * adding a global entry to the symbol table which points at the + * internal name of `f' created by slim_hidden_proto(). + * + * Functions in the public API which aren't called by the library + * don't need to be hidden and re-exported using the slim hidden + * macros. + */ +#if __GNUC__ >= 3 && defined(__ELF__) && !defined(__sun) +# define slim_hidden_proto(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) cairo_private +# define slim_hidden_proto_no_warn(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) cairo_private_no_warn +# define slim_hidden_def(name) slim_hidden_def1(name, slim_hidden_int_name(name)) +# define slim_hidden_int_name(name) INT_##name +# define slim_hidden_proto1(name, internal) \ + extern __typeof (name) name \ + __asm__ (slim_hidden_asmname (internal)) +# define slim_hidden_def1(name, internal) \ + extern __typeof (name) EXT_##name __asm__(slim_hidden_asmname(name)) \ + __attribute__((__alias__(slim_hidden_asmname(internal)))) +# define slim_hidden_ulp slim_hidden_ulp1(__USER_LABEL_PREFIX__) +# define slim_hidden_ulp1(x) slim_hidden_ulp2(x) +# define slim_hidden_ulp2(x) #x +# define slim_hidden_asmname(name) slim_hidden_asmname1(name) +# define slim_hidden_asmname1(name) slim_hidden_ulp #name +#else +# define slim_hidden_proto(name) int _cairo_dummy_prototype(void) +# define slim_hidden_proto_no_warn(name) int _cairo_dummy_prototype(void) +# define slim_hidden_def(name) int _cairo_dummy_prototype(void) +#endif + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#else +#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) +#endif + +/* slim_internal.h */ +#define CAIRO_HAS_HIDDEN_SYMBOLS 1 +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && \ + (defined(__ELF__) || defined(__APPLE__)) && \ + !defined(__sun) +#define cairo_private_no_warn __attribute__((__visibility__("hidden"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +#define cairo_private_no_warn __hidden +#else /* not gcc >= 3.3 and not Sun Studio >= 8 */ +#define cairo_private_no_warn +#undef CAIRO_HAS_HIDDEN_SYMBOLS +#endif + +#ifndef WARN_UNUSED_RESULT +#define WARN_UNUSED_RESULT +#endif +/* Add attribute(warn_unused_result) if supported */ +#define cairo_warn WARN_UNUSED_RESULT +#define cairo_private cairo_private_no_warn cairo_warn + +/* This macro allow us to deprecate a function by providing an alias + for the old function name to the new function name. With this + macro, binary compatibility is preserved. The macro only works on + some platforms --- tough. + + Meanwhile, new definitions in the public header file break the + source code so that it will no longer link against the old + symbols. Instead it will give a descriptive error message + indicating that the old function has been deprecated by the new + function. +*/ +#if __GNUC__ >= 2 && defined(__ELF__) +# define CAIRO_FUNCTION_ALIAS(old, new) \ + extern __typeof (new) old \ + __asm__ ("" #old) \ + __attribute__((__alias__("" #new))) +#else +# define CAIRO_FUNCTION_ALIAS(old, new) +#endif + +/* + * Cairo uses the following function attributes in order to improve the + * generated code (effectively by manual inter-procedural analysis). + * + * 'cairo_pure': The function is only allowed to read from its arguments + * and global memory (i.e. following a pointer argument or + * accessing a shared variable). The return value should + * only depend on its arguments, and for an identical set of + * arguments should return the same value. + * + * 'cairo_const': The function is only allowed to read from its arguments. + * It is not allowed to access global memory. The return + * value should only depend its arguments, and for an + * identical set of arguments should return the same value. + * This is currently the most strict function attribute. + * + * Both these function attributes allow gcc to perform CSE and + * constant-folding, with 'cairo_const 'also guaranteeing that pointer contents + * do not change across the function call. + */ +#if __GNUC__ >= 3 +#define cairo_pure __attribute__((pure)) +#define cairo_const __attribute__((const)) +#define cairo_always_inline inline __attribute__((always_inline)) +#else +#define cairo_pure +#define cairo_const +#define cairo_always_inline inline +#endif + +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +#define likely(expr) (__builtin_expect (!!(expr), 1)) +#define unlikely(expr) (__builtin_expect (!!(expr), 0)) +#else +#define likely(expr) (expr) +#define unlikely(expr) (expr) +#endif + +#ifndef __GNUC__ +#undef __attribute__ +#define __attribute__(x) +#endif + +#if (defined(__WIN32__) && !defined(__WINE__)) || defined(_MSC_VER) +#define access _access +#define fdopen _fdopen +#define hypot _hypot +#define pclose _pclose +#define popen _popen +#define snprintf _snprintf +#define strdup _strdup +#define unlink _unlink +#define vsnprintf _vsnprintf +#endif + +#ifdef _MSC_VER +#ifndef __cplusplus +#undef inline +#define inline __inline +#endif +#endif + +#if defined(_MSC_VER) && defined(_M_IX86) +/* When compiling with /Gy and /OPT:ICF identical functions will be folded in together. + The CAIRO_ENSURE_UNIQUE macro ensures that a function is always unique and + will never be folded into another one. Something like this might eventually + be needed for GCC but it seems fine for now. */ +#define CAIRO_ENSURE_UNIQUE \ + do { \ + char file[] = __FILE__; \ + __asm { \ + __asm jmp __internal_skip_line_no \ + __asm _emit (__COUNTER__ & 0xff) \ + __asm _emit ((__COUNTER__>>8) & 0xff) \ + __asm _emit ((__COUNTER__>>16) & 0xff)\ + __asm _emit ((__COUNTER__>>24) & 0xff)\ + __asm lea eax, dword ptr file \ + __asm __internal_skip_line_no: \ + }; \ + } while (0) +#else +#define CAIRO_ENSURE_UNIQUE do { } while (0) +#endif + +#ifdef __STRICT_ANSI__ +#undef inline +#define inline __inline__ +#endif + +#endif diff --git a/src/cairo-composite-rectangles-private.h b/src/cairo-composite-rectangles-private.h new file mode 100644 index 000000000..fd7728995 --- /dev/null +++ b/src/cairo-composite-rectangles-private.h @@ -0,0 +1,159 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_COMPOSITE_RECTANGLES_PRIVATE_H +#define CAIRO_COMPOSITE_RECTANGLES_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-error-private.h" +#include "cairo-pattern-private.h" + +CAIRO_BEGIN_DECLS + +/* Rectangles that take part in a composite operation. + * + * The source and mask track the extents of the respective patterns in device + * space. The unbounded rectangle is essentially the clip rectangle. And the + * intersection of all is the bounded rectangle, which is the minimum extents + * the operation may require. Whether or not the operation is actually bounded + * is tracked in the is_bounded boolean. + * + */ +struct _cairo_composite_rectangles { + cairo_surface_t *surface; + cairo_operator_t op; + + cairo_rectangle_int_t source; + cairo_rectangle_int_t mask; + cairo_rectangle_int_t destination; + + cairo_rectangle_int_t bounded; /* source? IN mask? IN unbounded */ + cairo_rectangle_int_t unbounded; /* destination IN clip */ + uint32_t is_bounded; + + cairo_rectangle_int_t source_sample_area; + cairo_rectangle_int_t mask_sample_area; + + cairo_pattern_union_t source_pattern; + cairo_pattern_union_t mask_pattern; + const cairo_pattern_t *original_source_pattern; + const cairo_pattern_t *original_mask_pattern; + + cairo_clip_t *clip; /* clip will be reduced to the minimal container */ +}; + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_paint (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_mask (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_stroke (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_fill (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_boxes (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_boxes_t *boxes, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_polygon (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_polygon_t *polygon, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_init_for_glyphs (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_clip_t *clip, + cairo_bool_t *overlap); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_intersect_source_extents (cairo_composite_rectangles_t *extents, + const cairo_box_t *box); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_intersect_mask_extents (cairo_composite_rectangles_t *extents, + const cairo_box_t *box); + +cairo_private cairo_bool_t +_cairo_composite_rectangles_can_reduce_clip (cairo_composite_rectangles_t *composite, + cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_composite_rectangles_add_to_damage (cairo_composite_rectangles_t *composite, + cairo_boxes_t *damage); + +cairo_private void +_cairo_composite_rectangles_fini (cairo_composite_rectangles_t *extents); + +CAIRO_END_DECLS + +#endif /* CAIRO_COMPOSITE_RECTANGLES_PRIVATE_H */ diff --git a/src/cairo-composite-rectangles.c b/src/cairo-composite-rectangles.c new file mode 100644 index 000000000..6c3e97d4a --- /dev/null +++ b/src/cairo-composite-rectangles.c @@ -0,0 +1,500 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-error-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-pattern-private.h" + +/* A collection of routines to facilitate writing compositors. */ + +void _cairo_composite_rectangles_fini (cairo_composite_rectangles_t *extents) +{ + _cairo_clip_destroy (extents->clip); +} + +static void +_cairo_composite_reduce_pattern (const cairo_pattern_t *src, + cairo_pattern_union_t *dst) +{ + int tx, ty; + + _cairo_pattern_init_static_copy (&dst->base, src); + if (dst->base.type == CAIRO_PATTERN_TYPE_SOLID) + return; + + dst->base.filter = _cairo_pattern_analyze_filter (&dst->base); + + tx = ty = 0; + if (_cairo_matrix_is_pixman_translation (&dst->base.matrix, + dst->base.filter, + &tx, &ty)) + { + dst->base.matrix.x0 = tx; + dst->base.matrix.y0 = ty; + } +} + +static inline cairo_bool_t +_cairo_composite_rectangles_init (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + if (_cairo_clip_is_all_clipped (clip)) + return FALSE; + + extents->surface = surface; + extents->op = op; + + _cairo_surface_get_extents (surface, &extents->destination); + extents->clip = NULL; + + extents->unbounded = extents->destination; + if (clip && ! _cairo_rectangle_intersect (&extents->unbounded, + _cairo_clip_get_extents (clip))) + return FALSE; + + extents->bounded = extents->unbounded; + extents->is_bounded = _cairo_operator_bounded_by_either (op); + + extents->original_source_pattern = source; + _cairo_composite_reduce_pattern (source, &extents->source_pattern); + + _cairo_pattern_get_extents (&extents->source_pattern.base, + &extents->source); + if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_SOURCE) { + if (! _cairo_rectangle_intersect (&extents->bounded, &extents->source)) + return FALSE; + } + + extents->original_mask_pattern = NULL; + extents->mask_pattern.base.type = CAIRO_PATTERN_TYPE_SOLID; + extents->mask_pattern.solid.color.alpha = 1.; /* XXX full initialisation? */ + extents->mask_pattern.solid.color.alpha_short = 0xffff; + + return TRUE; +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_paint (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + if (! _cairo_composite_rectangles_init (extents, + surface, op, source, clip)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + extents->mask = extents->destination; + + extents->clip = _cairo_clip_reduce_for_composite (clip, extents); + if (_cairo_clip_is_all_clipped (extents->clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (! _cairo_rectangle_intersect (&extents->unbounded, + _cairo_clip_get_extents (extents->clip))) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (extents->source_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) + _cairo_pattern_sampled_area (&extents->source_pattern.base, + &extents->bounded, + &extents->source_sample_area); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_composite_rectangles_intersect (cairo_composite_rectangles_t *extents, + const cairo_clip_t *clip) +{ + cairo_bool_t ret; + + ret = _cairo_rectangle_intersect (&extents->bounded, &extents->mask); + if (! ret && extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE)) { + extents->unbounded = extents->bounded; + } else if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) { + if (!_cairo_rectangle_intersect (&extents->unbounded, &extents->mask)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + extents->clip = _cairo_clip_reduce_for_composite (clip, extents); + if (_cairo_clip_is_all_clipped (extents->clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (! _cairo_rectangle_intersect (&extents->unbounded, + _cairo_clip_get_extents (extents->clip))) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (! _cairo_rectangle_intersect (&extents->bounded, + _cairo_clip_get_extents (extents->clip)) && + extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + if (extents->source_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) + _cairo_pattern_sampled_area (&extents->source_pattern.base, + &extents->bounded, + &extents->source_sample_area); + if (extents->mask_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) { + _cairo_pattern_sampled_area (&extents->mask_pattern.base, + &extents->bounded, + &extents->mask_sample_area); + if (extents->mask_sample_area.width == 0 || + extents->mask_sample_area.height == 0) { + _cairo_composite_rectangles_fini (extents); + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_composite_rectangles_intersect_source_extents (cairo_composite_rectangles_t *extents, + const cairo_box_t *box) +{ + cairo_rectangle_int_t rect; + cairo_clip_t *clip; + + _cairo_box_round_to_rectangle (box, &rect); + if (rect.x == extents->source.x && + rect.y == extents->source.y && + rect.width == extents->source.width && + rect.height == extents->source.height) + { + return CAIRO_INT_STATUS_SUCCESS; + } + + _cairo_rectangle_intersect (&extents->source, &rect); + + rect = extents->bounded; + if (! _cairo_rectangle_intersect (&extents->bounded, &extents->source) && + extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_SOURCE) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (rect.width == extents->bounded.width && + rect.height == extents->bounded.height) + return CAIRO_INT_STATUS_SUCCESS; + + if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE)) { + extents->unbounded = extents->bounded; + } else if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) { + if (!_cairo_rectangle_intersect (&extents->unbounded, &extents->mask)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + clip = extents->clip; + extents->clip = _cairo_clip_reduce_for_composite (clip, extents); + if (clip != extents->clip) + _cairo_clip_destroy (clip); + + if (_cairo_clip_is_all_clipped (extents->clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (! _cairo_rectangle_intersect (&extents->unbounded, + _cairo_clip_get_extents (extents->clip))) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (extents->source_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) + _cairo_pattern_sampled_area (&extents->source_pattern.base, + &extents->bounded, + &extents->source_sample_area); + if (extents->mask_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) { + _cairo_pattern_sampled_area (&extents->mask_pattern.base, + &extents->bounded, + &extents->mask_sample_area); + if (extents->mask_sample_area.width == 0 || + extents->mask_sample_area.height == 0) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_composite_rectangles_intersect_mask_extents (cairo_composite_rectangles_t *extents, + const cairo_box_t *box) +{ + cairo_rectangle_int_t mask; + cairo_clip_t *clip; + + _cairo_box_round_to_rectangle (box, &mask); + if (mask.x == extents->mask.x && + mask.y == extents->mask.y && + mask.width == extents->mask.width && + mask.height == extents->mask.height) + { + return CAIRO_INT_STATUS_SUCCESS; + } + + _cairo_rectangle_intersect (&extents->mask, &mask); + + mask = extents->bounded; + if (! _cairo_rectangle_intersect (&extents->bounded, &extents->mask) && + extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (mask.width == extents->bounded.width && + mask.height == extents->bounded.height) + return CAIRO_INT_STATUS_SUCCESS; + + if (extents->is_bounded == (CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE)) { + extents->unbounded = extents->bounded; + } else if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) { + if (!_cairo_rectangle_intersect (&extents->unbounded, &extents->mask)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + clip = extents->clip; + extents->clip = _cairo_clip_reduce_for_composite (clip, extents); + if (clip != extents->clip) + _cairo_clip_destroy (clip); + + if (_cairo_clip_is_all_clipped (extents->clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (! _cairo_rectangle_intersect (&extents->unbounded, + _cairo_clip_get_extents (extents->clip))) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (extents->source_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) + _cairo_pattern_sampled_area (&extents->source_pattern.base, + &extents->bounded, + &extents->source_sample_area); + if (extents->mask_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) { + _cairo_pattern_sampled_area (&extents->mask_pattern.base, + &extents->bounded, + &extents->mask_sample_area); + if (extents->mask_sample_area.width == 0 || + extents->mask_sample_area.height == 0) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_mask (cairo_composite_rectangles_t *extents, + cairo_surface_t*surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + if (! _cairo_composite_rectangles_init (extents, + surface, op, source, clip)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + extents->original_mask_pattern = mask; + _cairo_composite_reduce_pattern (mask, &extents->mask_pattern); + _cairo_pattern_get_extents (&extents->mask_pattern.base, &extents->mask); + + return _cairo_composite_rectangles_intersect (extents, clip); +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_stroke (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_clip_t *clip) +{ + if (! _cairo_composite_rectangles_init (extents, + surface, op, source, clip)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + _cairo_path_fixed_approximate_stroke_extents (path, style, ctm, &extents->mask); + + return _cairo_composite_rectangles_intersect (extents, clip); +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_fill (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_clip_t *clip) +{ + if (! _cairo_composite_rectangles_init (extents, + surface, op, source, clip)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + _cairo_path_fixed_approximate_fill_extents (path, &extents->mask); + + return _cairo_composite_rectangles_intersect (extents, clip); +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_polygon (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_polygon_t *polygon, + const cairo_clip_t *clip) +{ + if (! _cairo_composite_rectangles_init (extents, + surface, op, source, clip)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + _cairo_box_round_to_rectangle (&polygon->extents, &extents->mask); + return _cairo_composite_rectangles_intersect (extents, clip); +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_boxes (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_boxes_t *boxes, + const cairo_clip_t *clip) +{ + cairo_box_t box; + + if (! _cairo_composite_rectangles_init (extents, + surface, op, source, clip)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + _cairo_boxes_extents (boxes, &box); + _cairo_box_round_to_rectangle (&box, &extents->mask); + return _cairo_composite_rectangles_intersect (extents, clip); +} + +cairo_int_status_t +_cairo_composite_rectangles_init_for_glyphs (cairo_composite_rectangles_t *extents, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_clip_t *clip, + cairo_bool_t *overlap) +{ + cairo_status_t status; + + if (! _cairo_composite_rectangles_init (extents, surface, op, source, clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + /* Computing the exact bbox and the overlap is expensive. + * First perform a cheap test to see if the glyphs are all clipped out. + */ + if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK && + _cairo_scaled_font_glyph_approximate_extents (scaled_font, + glyphs, num_glyphs, + &extents->mask)) + { + if (! _cairo_rectangle_intersect (&extents->bounded, &extents->mask)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + status = _cairo_scaled_font_glyph_device_extents (scaled_font, + glyphs, num_glyphs, + &extents->mask, + overlap); + if (unlikely (status)) + return status; + + if (overlap && *overlap && + scaled_font->options.antialias == CAIRO_ANTIALIAS_NONE && + _cairo_pattern_is_opaque_solid (&extents->source_pattern.base)) + { + *overlap = FALSE; + } + + return _cairo_composite_rectangles_intersect (extents, clip); +} + +cairo_bool_t +_cairo_composite_rectangles_can_reduce_clip (cairo_composite_rectangles_t *composite, + cairo_clip_t *clip) +{ + cairo_rectangle_int_t extents; + cairo_box_t box; + + if (clip == NULL) + return TRUE; + + extents = composite->destination; + if (composite->is_bounded & CAIRO_OPERATOR_BOUND_BY_SOURCE) + _cairo_rectangle_intersect (&extents, &composite->source); + if (composite->is_bounded & CAIRO_OPERATOR_BOUND_BY_MASK) + _cairo_rectangle_intersect (&extents, &composite->mask); + + _cairo_box_from_rectangle (&box, &extents); + return _cairo_clip_contains_box (clip, &box); +} + +cairo_int_status_t +_cairo_composite_rectangles_add_to_damage (cairo_composite_rectangles_t *composite, + cairo_boxes_t *damage) +{ + cairo_int_status_t status; + int n; + + for (n = 0; n < composite->clip->num_boxes; n++) { + status = _cairo_boxes_add (damage, + CAIRO_ANTIALIAS_NONE, + &composite->clip->boxes[n]); + if (unlikely (status)) + return status; + } + + return CAIRO_INT_STATUS_SUCCESS; +} diff --git a/src/cairo-compositor-private.h b/src/cairo-compositor-private.h new file mode 100644 index 000000000..019972333 --- /dev/null +++ b/src/cairo-compositor-private.h @@ -0,0 +1,365 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_COMPOSITOR_PRIVATE_H +#define CAIRO_COMPOSITOR_PRIVATE_H + +#include "cairo-composite-rectangles-private.h" + +CAIRO_BEGIN_DECLS + +typedef struct { + cairo_scaled_font_t *font; + cairo_glyph_t *glyphs; + int num_glyphs; + cairo_bool_t use_mask; + cairo_rectangle_int_t extents; +} cairo_composite_glyphs_info_t; + +struct cairo_compositor { + const cairo_compositor_t *delegate; + + cairo_warn cairo_int_status_t + (*paint) (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents); + + cairo_warn cairo_int_status_t + (*mask) (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents); + + cairo_warn cairo_int_status_t + (*stroke) (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias); + + cairo_warn cairo_int_status_t + (*fill) (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias); + + cairo_warn cairo_int_status_t + (*glyphs) (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap); +}; + +struct cairo_mask_compositor { + cairo_compositor_t base; + + cairo_int_status_t (*acquire) (void *surface); + cairo_int_status_t (*release) (void *surface); + + cairo_int_status_t (*set_clip_region) (void *surface, + cairo_region_t *clip_region); + + cairo_surface_t * (*pattern_to_surface) (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y); + + cairo_int_status_t (*draw_image_boxes) (void *surface, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy); + + cairo_int_status_t (*copy_boxes) (void *surface, + cairo_surface_t *src, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents, + int dx, int dy); + + cairo_int_status_t + (*fill_rectangles) (void *surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_rectangle_int_t *rectangles, + int num_rects); + + cairo_int_status_t + (*fill_boxes) (void *surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes); + + cairo_int_status_t + (*check_composite) (const cairo_composite_rectangles_t *extents); + + cairo_int_status_t + (*composite) (void *dst, + cairo_operator_t op, + cairo_surface_t *src, + cairo_surface_t *mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height); + + cairo_int_status_t + (*composite_boxes) (void *surface, + cairo_operator_t op, + cairo_surface_t *source, + cairo_surface_t *mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents); + + cairo_int_status_t + (*check_composite_glyphs) (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs); + cairo_int_status_t + (*composite_glyphs) (void *surface, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info); +}; + +struct cairo_traps_compositor { + cairo_compositor_t base; + + cairo_int_status_t + (*acquire) (void *surface); + + cairo_int_status_t + (*release) (void *surface); + + cairo_int_status_t + (*set_clip_region) (void *surface, + cairo_region_t *clip_region); + + cairo_surface_t * + (*pattern_to_surface) (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y); + + cairo_int_status_t (*draw_image_boxes) (void *surface, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy); + + cairo_int_status_t (*copy_boxes) (void *surface, + cairo_surface_t *src, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents, + int dx, int dy); + + cairo_int_status_t + (*fill_boxes) (void *surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes); + + cairo_int_status_t + (*check_composite) (const cairo_composite_rectangles_t *extents); + + cairo_int_status_t + (*composite) (void *dst, + cairo_operator_t op, + cairo_surface_t *src, + cairo_surface_t *mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height); + cairo_int_status_t + (*lerp) (void *_dst, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height); + + cairo_int_status_t + (*composite_boxes) (void *surface, + cairo_operator_t op, + cairo_surface_t *source, + cairo_surface_t *mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents); + + cairo_int_status_t + (*composite_traps) (void *dst, + cairo_operator_t op, + cairo_surface_t *source, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_traps_t *traps); + + cairo_int_status_t + (*composite_tristrip) (void *dst, + cairo_operator_t op, + cairo_surface_t *source, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_tristrip_t *tristrip); + + cairo_int_status_t + (*check_composite_glyphs) (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs); + cairo_int_status_t + (*composite_glyphs) (void *surface, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info); +}; + +cairo_private extern const cairo_compositor_t __cairo_no_compositor; +cairo_private extern const cairo_compositor_t _cairo_fallback_compositor; + +cairo_private void +_cairo_mask_compositor_init (cairo_mask_compositor_t *compositor, + const cairo_compositor_t *delegate); + +cairo_private void +_cairo_shape_mask_compositor_init (cairo_compositor_t *compositor, + const cairo_compositor_t *delegate); + +cairo_private void +_cairo_traps_compositor_init (cairo_traps_compositor_t *compositor, + const cairo_compositor_t *delegate); + +cairo_private cairo_int_status_t +_cairo_compositor_paint (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_compositor_mask (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_compositor_stroke (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_compositor_fill (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + +CAIRO_END_DECLS + +#endif /* CAIRO_COMPOSITOR_PRIVATE_H */ diff --git a/src/cairo-compositor.c b/src/cairo-compositor.c new file mode 100644 index 000000000..b31413b99 --- /dev/null +++ b/src/cairo-compositor.c @@ -0,0 +1,268 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-compositor-private.h" +#include "cairo-damage-private.h" +#include "cairo-error-private.h" + +cairo_int_status_t +_cairo_compositor_paint (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = _cairo_composite_rectangles_init_for_paint (&extents, surface, + op, source, + clip); + if (unlikely (status)) + return status; + + do { + while (compositor->paint == NULL) + compositor = compositor->delegate; + + status = compositor->paint (compositor, &extents); + + compositor = compositor->delegate; + } while (status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (status == CAIRO_INT_STATUS_SUCCESS && surface->damage) { + TRACE ((stderr, "%s: applying damage (%d,%d)x(%d, %d)\n", + __FUNCTION__, + extents.unbounded.x, extents.unbounded.y, + extents.unbounded.width, extents.unbounded.height)); + surface->damage = _cairo_damage_add_rectangle (surface->damage, + &extents.unbounded); + } + + _cairo_composite_rectangles_fini (&extents); + + return status; +} + +cairo_int_status_t +_cairo_compositor_mask (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = _cairo_composite_rectangles_init_for_mask (&extents, surface, + op, source, mask, + clip); + if (unlikely (status)) + return status; + + do { + while (compositor->mask == NULL) + compositor = compositor->delegate; + + status = compositor->mask (compositor, &extents); + + compositor = compositor->delegate; + } while (status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (status == CAIRO_INT_STATUS_SUCCESS && surface->damage) { + TRACE ((stderr, "%s: applying damage (%d,%d)x(%d, %d)\n", + __FUNCTION__, + extents.unbounded.x, extents.unbounded.y, + extents.unbounded.width, extents.unbounded.height)); + surface->damage = _cairo_damage_add_rectangle (surface->damage, + &extents.unbounded); + } + + _cairo_composite_rectangles_fini (&extents); + + return status; +} + +cairo_int_status_t +_cairo_compositor_stroke (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (_cairo_pen_vertices_needed (tolerance, style->line_width/2, ctm) <= 1) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + status = _cairo_composite_rectangles_init_for_stroke (&extents, surface, + op, source, + path, style, ctm, + clip); + if (unlikely (status)) + return status; + + do { + while (compositor->stroke == NULL) + compositor = compositor->delegate; + + status = compositor->stroke (compositor, &extents, + path, style, ctm, ctm_inverse, + tolerance, antialias); + + compositor = compositor->delegate; + } while (status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (status == CAIRO_INT_STATUS_SUCCESS && surface->damage) { + TRACE ((stderr, "%s: applying damage (%d,%d)x(%d, %d)\n", + __FUNCTION__, + extents.unbounded.x, extents.unbounded.y, + extents.unbounded.width, extents.unbounded.height)); + surface->damage = _cairo_damage_add_rectangle (surface->damage, + &extents.unbounded); + } + + _cairo_composite_rectangles_fini (&extents); + + return status; +} + +cairo_int_status_t +_cairo_compositor_fill (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = _cairo_composite_rectangles_init_for_fill (&extents, surface, + op, source, path, + clip); + if (unlikely (status)) + return status; + + do { + while (compositor->fill == NULL) + compositor = compositor->delegate; + + status = compositor->fill (compositor, &extents, + path, fill_rule, tolerance, antialias); + + compositor = compositor->delegate; + } while (status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (status == CAIRO_INT_STATUS_SUCCESS && surface->damage) { + TRACE ((stderr, "%s: applying damage (%d,%d)x(%d, %d)\n", + __FUNCTION__, + extents.unbounded.x, extents.unbounded.y, + extents.unbounded.width, extents.unbounded.height)); + surface->damage = _cairo_damage_add_rectangle (surface->damage, + &extents.unbounded); + } + + _cairo_composite_rectangles_fini (&extents); + + return status; +} + +cairo_int_status_t +_cairo_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_composite_rectangles_t extents; + cairo_bool_t overlap; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = _cairo_composite_rectangles_init_for_glyphs (&extents, surface, + op, source, + scaled_font, + glyphs, num_glyphs, + clip, &overlap); + if (unlikely (status)) + return status; + + do { + while (compositor->glyphs == NULL) + compositor = compositor->delegate; + + status = compositor->glyphs (compositor, &extents, + scaled_font, glyphs, num_glyphs, overlap); + + compositor = compositor->delegate; + } while (status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (status == CAIRO_INT_STATUS_SUCCESS && surface->damage) { + TRACE ((stderr, "%s: applying damage (%d,%d)x(%d, %d)\n", + __FUNCTION__, + extents.unbounded.x, extents.unbounded.y, + extents.unbounded.width, extents.unbounded.height)); + surface->damage = _cairo_damage_add_rectangle (surface->damage, + &extents.unbounded); + } + + _cairo_composite_rectangles_fini (&extents); + + return status; +} diff --git a/src/cairo-contour-inline.h b/src/cairo-contour-inline.h new file mode 100644 index 000000000..7972c1ac5 --- /dev/null +++ b/src/cairo-contour-inline.h @@ -0,0 +1,80 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_CONTOUR_INLINE_H +#define CAIRO_CONTOUR_INLINE_H + +#include "cairo-contour-private.h" + +CAIRO_BEGIN_DECLS + +static inline cairo_int_status_t +_cairo_contour_add_point (cairo_contour_t *contour, + const cairo_point_t *point) +{ + struct _cairo_contour_chain *tail = contour->tail; + + if (unlikely (tail->num_points == tail->size_points)) + return __cairo_contour_add_point (contour, point); + + tail->points[tail->num_points++] = *point; + return CAIRO_INT_STATUS_SUCCESS; +} + +static inline cairo_point_t * +_cairo_contour_first_point (cairo_contour_t *c) +{ + return &c->chain.points[0]; +} + +static inline cairo_point_t * +_cairo_contour_last_point (cairo_contour_t *c) +{ + return &c->tail->points[c->tail->num_points-1]; +} + +static inline void +_cairo_contour_remove_last_point (cairo_contour_t *contour) +{ + if (contour->chain.num_points == 0) + return; + + if (--contour->tail->num_points == 0) + __cairo_contour_remove_last_chain (contour); +} + +CAIRO_END_DECLS + +#endif /* CAIRO_CONTOUR_INLINE_H */ diff --git a/src/cairo-contour-private.h b/src/cairo-contour-private.h new file mode 100644 index 000000000..1dfc46f3a --- /dev/null +++ b/src/cairo-contour-private.h @@ -0,0 +1,124 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_CONTOUR_PRIVATE_H +#define CAIRO_CONTOUR_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" +#include "cairo-list-private.h" + +#include + +CAIRO_BEGIN_DECLS + +/* A contour is simply a closed chain of points that divide the infinite plane + * into inside and outside. Each contour is a simple polygon, that is it + * contains no holes or self-intersections, but maybe either concave or convex. + */ + +struct _cairo_contour_chain { + cairo_point_t *points; + int num_points, size_points; + struct _cairo_contour_chain *next; +}; + +struct _cairo_contour_iter { + cairo_point_t *point; + cairo_contour_chain_t *chain; +}; + +struct _cairo_contour { + cairo_list_t next; + int direction; + cairo_contour_chain_t chain, *tail; + + cairo_point_t embedded_points[64]; +}; + +/* Initial definition of a shape is a set of contours (some representing holes) */ +struct _cairo_shape { + cairo_list_t contours; +}; + +typedef struct _cairo_shape cairo_shape_t; + +#if 0 +cairo_private cairo_status_t +_cairo_shape_init_from_polygon (cairo_shape_t *shape, + const cairo_polygon_t *polygon); + +cairo_private cairo_status_t +_cairo_shape_reduce (cairo_shape_t *shape, double tolerance); +#endif + +cairo_private void +_cairo_contour_init (cairo_contour_t *contour, + int direction); + +cairo_private cairo_int_status_t +__cairo_contour_add_point (cairo_contour_t *contour, + const cairo_point_t *point); + +cairo_private void +_cairo_contour_simplify (cairo_contour_t *contour, double tolerance); + +cairo_private void +_cairo_contour_reverse (cairo_contour_t *contour); + +cairo_private cairo_int_status_t +_cairo_contour_add (cairo_contour_t *dst, + const cairo_contour_t *src); + +cairo_private cairo_int_status_t +_cairo_contour_add_reversed (cairo_contour_t *dst, + const cairo_contour_t *src); + +cairo_private void +__cairo_contour_remove_last_chain (cairo_contour_t *contour); + +cairo_private void +_cairo_contour_reset (cairo_contour_t *contour); + +cairo_private void +_cairo_contour_fini (cairo_contour_t *contour); + +cairo_private void +_cairo_debug_print_contour (FILE *file, cairo_contour_t *contour); + +CAIRO_END_DECLS + +#endif /* CAIRO_CONTOUR_PRIVATE_H */ diff --git a/src/cairo-contour.c b/src/cairo-contour.c new file mode 100644 index 000000000..9ad75bdbf --- /dev/null +++ b/src/cairo-contour.c @@ -0,0 +1,453 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-combsort-inline.h" +#include "cairo-contour-inline.h" +#include "cairo-contour-private.h" + +void +_cairo_contour_init (cairo_contour_t *contour, + int direction) +{ + contour->direction = direction; + contour->chain.points = contour->embedded_points; + contour->chain.next = NULL; + contour->chain.num_points = 0; + contour->chain.size_points = ARRAY_LENGTH (contour->embedded_points); + contour->tail = &contour->chain; +} + +cairo_int_status_t +__cairo_contour_add_point (cairo_contour_t *contour, + const cairo_point_t *point) +{ + cairo_contour_chain_t *tail = contour->tail; + cairo_contour_chain_t *next; + + assert (tail->next == NULL); + + next = _cairo_malloc_ab_plus_c (tail->size_points*2, + sizeof (cairo_point_t), + sizeof (cairo_contour_chain_t)); + if (unlikely (next == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + next->size_points = tail->size_points*2; + next->num_points = 1; + next->points = (cairo_point_t *)(next+1); + next->next = NULL; + tail->next = next; + contour->tail = next; + + next->points[0] = *point; + return CAIRO_INT_STATUS_SUCCESS; +} + +static void +first_inc (cairo_contour_t *contour, + cairo_point_t **p, + cairo_contour_chain_t **chain) +{ + if (*p == (*chain)->points + (*chain)->num_points) { + assert ((*chain)->next); + *chain = (*chain)->next; + *p = &(*chain)->points[0]; + } else + ++*p; +} + +static void +last_dec (cairo_contour_t *contour, + cairo_point_t **p, + cairo_contour_chain_t **chain) +{ + if (*p == (*chain)->points) { + cairo_contour_chain_t *prev; + assert (*chain != &contour->chain); + for (prev = &contour->chain; prev->next != *chain; prev = prev->next) + ; + *chain = prev; + *p = &(*chain)->points[(*chain)->num_points-1]; + } else + --*p; +} + +void +_cairo_contour_reverse (cairo_contour_t *contour) +{ + cairo_contour_chain_t *first_chain, *last_chain; + cairo_point_t *first, *last; + + contour->direction = -contour->direction; + + if (contour->chain.num_points <= 1) + return; + + first_chain = &contour->chain; + last_chain = contour->tail; + + first = &first_chain->points[0]; + last = &last_chain->points[last_chain->num_points-1]; + + while (first != last) { + cairo_point_t p; + + p = *first; + *first = *last; + *last = p; + + first_inc (contour, &first, &first_chain); + last_dec (contour, &last, &last_chain); + } +} + +cairo_int_status_t +_cairo_contour_add (cairo_contour_t *dst, + const cairo_contour_t *src) +{ + const cairo_contour_chain_t *chain; + cairo_int_status_t status; + int i; + + for (chain = &src->chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + status = _cairo_contour_add_point (dst, &chain->points[i]); + if (unlikely (status)) + return status; + } + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +static inline cairo_bool_t +iter_next (cairo_contour_iter_t *iter) +{ + if (iter->point == &iter->chain->points[iter->chain->size_points-1]) { + iter->chain = iter->chain->next; + if (iter->chain == NULL) + return FALSE; + + iter->point = &iter->chain->points[0]; + return TRUE; + } else { + iter->point++; + return TRUE; + } +} + +static cairo_bool_t +iter_equal (const cairo_contour_iter_t *i1, + const cairo_contour_iter_t *i2) +{ + return i1->chain == i2->chain && i1->point == i2->point; +} + +static void +iter_init (cairo_contour_iter_t *iter, cairo_contour_t *contour) +{ + iter->chain = &contour->chain; + iter->point = &contour->chain.points[0]; +} + +static void +iter_init_last (cairo_contour_iter_t *iter, cairo_contour_t *contour) +{ + iter->chain = contour->tail; + iter->point = &contour->tail->points[contour->tail->num_points-1]; +} + +static const cairo_contour_chain_t *prev_const_chain(const cairo_contour_t *contour, + const cairo_contour_chain_t *chain) +{ + const cairo_contour_chain_t *prev; + + if (chain == &contour->chain) + return NULL; + + for (prev = &contour->chain; prev->next != chain; prev = prev->next) + ; + + return prev; +} + +cairo_int_status_t +_cairo_contour_add_reversed (cairo_contour_t *dst, + const cairo_contour_t *src) +{ + const cairo_contour_chain_t *last; + cairo_int_status_t status; + int i; + + if (src->chain.num_points == 0) + return CAIRO_INT_STATUS_SUCCESS; + + for (last = src->tail; last; last = prev_const_chain (src, last)) { + for (i = last->num_points-1; i >= 0; i--) { + status = _cairo_contour_add_point (dst, &last->points[i]); + if (unlikely (status)) + return status; + } + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_uint64_t +point_distance_sq (const cairo_point_t *p1, + const cairo_point_t *p2) +{ + int32_t dx = p1->x - p2->x; + int32_t dy = p1->y - p2->y; + return _cairo_int32x32_64_mul (dx, dx) + _cairo_int32x32_64_mul (dy, dy); +} + +#define DELETED(p) ((p)->x == INT_MIN && (p)->y == INT_MAX) +#define MARK_DELETED(p) ((p)->x = INT_MIN, (p)->y = INT_MAX) + +static cairo_bool_t +_cairo_contour_simplify_chain (cairo_contour_t *contour, const double tolerance, + const cairo_contour_iter_t *first, + const cairo_contour_iter_t *last) +{ + cairo_contour_iter_t iter, furthest; + uint64_t max_error; + int x0, y0; + int nx, ny; + int count; + + iter = *first; + iter_next (&iter); + if (iter_equal (&iter, last)) + return FALSE; + + x0 = first->point->x; + y0 = first->point->y; + nx = last->point->y - y0; + ny = x0 - last->point->x; + + count = 0; + max_error = 0; + do { + cairo_point_t *p = iter.point; + if (! DELETED(p)) { + uint64_t d = (uint64_t)nx * (x0 - p->x) + (uint64_t)ny * (y0 - p->y); + if (d * d > max_error) { + max_error = d * d; + furthest = iter; + } + count++; + } + iter_next (&iter); + } while (! iter_equal (&iter, last)); + if (count == 0) + return FALSE; + + if (max_error > tolerance * ((uint64_t)nx * nx + (uint64_t)ny * ny)) { + cairo_bool_t simplified; + + simplified = FALSE; + simplified |= _cairo_contour_simplify_chain (contour, tolerance, + first, &furthest); + simplified |= _cairo_contour_simplify_chain (contour, tolerance, + &furthest, last); + return simplified; + } else { + iter = *first; + iter_next (&iter); + do { + MARK_DELETED (iter.point); + iter_next (&iter); + } while (! iter_equal (&iter, last)); + + return TRUE; + } +} + +void +_cairo_contour_simplify (cairo_contour_t *contour, double tolerance) +{ + cairo_contour_chain_t *chain; + cairo_point_t *last = NULL; + cairo_contour_iter_t iter, furthest; + cairo_bool_t simplified; + uint64_t max = 0; + int i; + + if (contour->chain.num_points <= 2) + return; + + tolerance = tolerance * CAIRO_FIXED_ONE; + tolerance *= tolerance; + + /* stage 1: vertex reduction */ + for (chain = &contour->chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + if (last == NULL || + point_distance_sq (last, &chain->points[i]) > tolerance) { + last = &chain->points[i]; + } else { + MARK_DELETED (&chain->points[i]); + } + } + } + + /* stage2: polygon simplification using Douglas-Peucker */ + do { + last = &contour->chain.points[0]; + iter_init (&furthest, contour); + max = 0; + for (chain = &contour->chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + uint64_t d; + + if (DELETED (&chain->points[i])) + continue; + + d = point_distance_sq (last, &chain->points[i]); + if (d > max) { + furthest.chain = chain; + furthest.point = &chain->points[i]; + max = d; + } + } + } + assert (max); + + simplified = FALSE; + iter_init (&iter, contour); + simplified |= _cairo_contour_simplify_chain (contour, tolerance, + &iter, &furthest); + + iter_init_last (&iter, contour); + if (! iter_equal (&furthest, &iter)) + simplified |= _cairo_contour_simplify_chain (contour, tolerance, + &furthest, &iter); + } while (simplified); + + iter_init (&iter, contour); + for (chain = &contour->chain; chain; chain = chain->next) { + int num_points = chain->num_points; + chain->num_points = 0; + for (i = 0; i < num_points; i++) { + if (! DELETED(&chain->points[i])) { + if (iter.point != &chain->points[i]) + *iter.point = chain->points[i]; + iter.chain->num_points++; + iter_next (&iter); + } + } + } + + if (iter.chain) { + cairo_contour_chain_t *next; + + for (chain = iter.chain->next; chain; chain = next) { + next = chain->next; + free (chain); + } + + iter.chain->next = NULL; + contour->tail = iter.chain; + } +} + +void +_cairo_contour_reset (cairo_contour_t *contour) +{ + _cairo_contour_fini (contour); + _cairo_contour_init (contour, contour->direction); +} + +void +_cairo_contour_fini (cairo_contour_t *contour) +{ + cairo_contour_chain_t *chain, *next; + + for (chain = contour->chain.next; chain; chain = next) { + next = chain->next; + free (chain); + } +} + +void +_cairo_debug_print_contour (FILE *file, cairo_contour_t *contour) +{ + cairo_contour_chain_t *chain; + int num_points, size_points; + int i; + + num_points = 0; + size_points = 0; + for (chain = &contour->chain; chain; chain = chain->next) { + num_points += chain->num_points; + size_points += chain->size_points; + } + + fprintf (file, "contour: direction=%d, num_points=%d / %d\n", + contour->direction, num_points, size_points); + + num_points = 0; + for (chain = &contour->chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + fprintf (file, " [%d] = (%f, %f)\n", + num_points++, + _cairo_fixed_to_double (chain->points[i].x), + _cairo_fixed_to_double (chain->points[i].y)); + } + } +} + +void +__cairo_contour_remove_last_chain (cairo_contour_t *contour) +{ + cairo_contour_chain_t *chain; + + if (contour->tail == &contour->chain) + return; + + for (chain = &contour->chain; chain->next != contour->tail; chain = chain->next) + ; + free (contour->tail); + contour->tail = chain; + chain->next = NULL; +} diff --git a/src/cairo-damage-private.h b/src/cairo-damage-private.h new file mode 100644 index 000000000..97b177e86 --- /dev/null +++ b/src/cairo-damage-private.h @@ -0,0 +1,85 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_DAMAGE_PRIVATE_H +#define CAIRO_DAMAGE_PRIVATE_H + +#include "cairo-types-private.h" + +#include + +CAIRO_BEGIN_DECLS + +struct _cairo_damage { + cairo_status_t status; + cairo_region_t *region; + + int dirty, remain; + struct _cairo_damage_chunk { + struct _cairo_damage_chunk *next; + cairo_box_t *base; + int count; + int size; + } chunks, *tail; + cairo_box_t boxes[32]; +}; + +cairo_private cairo_damage_t * +_cairo_damage_create (void); + +cairo_private cairo_damage_t * +_cairo_damage_create_in_error (cairo_status_t status); + +cairo_private cairo_damage_t * +_cairo_damage_add_box (cairo_damage_t *damage, + const cairo_box_t *box); + +cairo_private cairo_damage_t * +_cairo_damage_add_rectangle (cairo_damage_t *damage, + const cairo_rectangle_int_t *rect); + +cairo_private cairo_damage_t * +_cairo_damage_add_region (cairo_damage_t *damage, + const cairo_region_t *region); + +cairo_private cairo_damage_t * +_cairo_damage_reduce (cairo_damage_t *damage); + +cairo_private void +_cairo_damage_destroy (cairo_damage_t *damage); + +CAIRO_END_DECLS + +#endif /* CAIRO_DAMAGE_PRIVATE_H */ diff --git a/src/cairo-damage.c b/src/cairo-damage.c new file mode 100644 index 000000000..63191fee9 --- /dev/null +++ b/src/cairo-damage.c @@ -0,0 +1,241 @@ +/* + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-damage-private.h" +#include "cairo-region-private.h" + +static const cairo_damage_t __cairo_damage__nil = { CAIRO_STATUS_NO_MEMORY }; + +cairo_damage_t * +_cairo_damage_create_in_error (cairo_status_t status) +{ + _cairo_error_throw (status); + return (cairo_damage_t *) &__cairo_damage__nil; +} + +cairo_damage_t * +_cairo_damage_create (void) +{ + cairo_damage_t *damage; + + damage = malloc (sizeof (*damage)); + if (unlikely (damage == NULL)) { + _cairo_error_throw(CAIRO_STATUS_NO_MEMORY); + return (cairo_damage_t *) &__cairo_damage__nil; + } + + damage->status = CAIRO_STATUS_SUCCESS; + damage->region = NULL; + damage->dirty = 0; + damage->tail = &damage->chunks; + damage->chunks.base = damage->boxes; + damage->chunks.size = ARRAY_LENGTH(damage->boxes); + damage->chunks.count = 0; + damage->chunks.next = NULL; + + damage->remain = damage->chunks.size; + + return damage; +} + +void +_cairo_damage_destroy (cairo_damage_t *damage) +{ + struct _cairo_damage_chunk *chunk, *next; + + if (damage == (cairo_damage_t *) &__cairo_damage__nil) + return; + + for (chunk = damage->chunks.next; chunk != NULL; chunk = next) { + next = chunk->next; + free (chunk); + } + cairo_region_destroy (damage->region); + free (damage); +} + +static cairo_damage_t * +_cairo_damage_add_boxes(cairo_damage_t *damage, + const cairo_box_t *boxes, + int count) +{ + struct _cairo_damage_chunk *chunk; + int n, size; + + TRACE ((stderr, "%s x%d\n", __FUNCTION__, count)); + + if (damage == NULL) + damage = _cairo_damage_create (); + if (damage->status) + return damage; + + damage->dirty += count; + + n = count; + if (n > damage->remain) + n = damage->remain; + + memcpy (damage->tail->base + damage->tail->count, boxes, + n * sizeof (cairo_box_t)); + + count -= n; + damage->tail->count += n; + damage->remain -= n; + + if (count == 0) + return damage; + + size = 2 * damage->tail->size; + if (size < count) + size = (count + 64) & ~63; + + chunk = malloc (sizeof (*chunk) + sizeof (cairo_box_t) * size); + if (unlikely (chunk == NULL)) { + _cairo_damage_destroy (damage); + return (cairo_damage_t *) &__cairo_damage__nil; + } + + chunk->next = NULL; + chunk->base = (cairo_box_t *) (chunk + 1); + chunk->size = size; + chunk->count = count; + + damage->tail->next = chunk; + damage->tail = chunk; + + memcpy (damage->tail->base, boxes + n, + count * sizeof (cairo_box_t)); + damage->remain = size - count; + + return damage; +} + +cairo_damage_t * +_cairo_damage_add_box(cairo_damage_t *damage, + const cairo_box_t *box) +{ + TRACE ((stderr, "%s: (%d, %d),(%d, %d)\n", __FUNCTION__, + box->p1.x, box->p1.y, box->p2.x, box->p2.y)); + + return _cairo_damage_add_boxes(damage, box, 1); +} + +cairo_damage_t * +_cairo_damage_add_rectangle(cairo_damage_t *damage, + const cairo_rectangle_int_t *r) +{ + cairo_box_t box; + + TRACE ((stderr, "%s: (%d, %d)x(%d, %d)\n", __FUNCTION__, + r->x, r->y, r->width, r->height)); + + box.p1.x = r->x; + box.p1.y = r->y; + box.p2.x = r->x + r->width; + box.p2.y = r->y + r->height; + + return _cairo_damage_add_boxes(damage, &box, 1); +} + +cairo_damage_t * +_cairo_damage_add_region (cairo_damage_t *damage, + const cairo_region_t *region) +{ + cairo_box_t *boxes; + int nbox; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + boxes = _cairo_region_get_boxes (region, &nbox); + return _cairo_damage_add_boxes(damage, boxes, nbox); +} + +cairo_damage_t * +_cairo_damage_reduce (cairo_damage_t *damage) +{ + cairo_box_t *free_boxes = NULL; + cairo_box_t *boxes, *b; + struct _cairo_damage_chunk *chunk, *last; + + TRACE ((stderr, "%s: dirty=%d\n", __FUNCTION__, + damage ? damage->dirty : -1)); + if (damage == NULL || damage->status || !damage->dirty) + return damage; + + if (damage->region) { + cairo_region_t *region; + + region = damage->region; + damage->region = NULL; + + damage = _cairo_damage_add_region (damage, region); + cairo_region_destroy (region); + + if (unlikely (damage->status)) + return damage; + } + + boxes = damage->tail->base; + if (damage->dirty > damage->tail->size) { + boxes = free_boxes = malloc (damage->dirty * sizeof (cairo_box_t)); + if (unlikely (boxes == NULL)) { + _cairo_damage_destroy (damage); + return (cairo_damage_t *) &__cairo_damage__nil; + } + + b = boxes; + last = NULL; + } else { + b = boxes + damage->tail->count; + last = damage->tail; + } + + for (chunk = &damage->chunks; chunk != last; chunk = chunk->next) { + memcpy (b, chunk->base, chunk->count * sizeof (cairo_box_t)); + b += chunk->count; + } + + damage->region = _cairo_region_create_from_boxes (boxes, damage->dirty); + free (free_boxes); + + if (unlikely (damage->region->status)) { + _cairo_damage_destroy (damage); + return (cairo_damage_t *) &__cairo_damage__nil; + } + + damage->dirty = 0; + return damage; +} diff --git a/src/cairo-debug.c b/src/cairo-debug.c new file mode 100644 index 000000000..33d46aa3f --- /dev/null +++ b/src/cairo-debug.c @@ -0,0 +1,304 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" +#include "cairo-image-surface-private.h" + +/** + * cairo_debug_reset_static_data: + * + * Resets all static data within cairo to its original state, + * (ie. identical to the state at the time of program invocation). For + * example, all caches within cairo will be flushed empty. + * + * This function is intended to be useful when using memory-checking + * tools such as valgrind. When valgrind's memcheck analyzes a + * cairo-using program without a call to cairo_debug_reset_static_data(), + * it will report all data reachable via cairo's static objects as + * "still reachable". Calling cairo_debug_reset_static_data() just prior + * to program termination will make it easier to get squeaky clean + * reports from valgrind. + * + * WARNING: It is only safe to call this function when there are no + * active cairo objects remaining, (ie. the appropriate destroy + * functions have been called as necessary). If there are active cairo + * objects, this call is likely to cause a crash, (eg. an assertion + * failure due to a hash table being destroyed when non-empty). + * + * Since: 1.0 + **/ +void +cairo_debug_reset_static_data (void) +{ + CAIRO_MUTEX_INITIALIZE (); + + _cairo_scaled_font_map_destroy (); + + _cairo_toy_font_face_reset_static_data (); + +#if CAIRO_HAS_FT_FONT + _cairo_ft_font_reset_static_data (); +#endif + +#if CAIRO_HAS_WIN32_FONT + _cairo_win32_font_reset_static_data (); +#endif + + _cairo_intern_string_reset_static_data (); + + _cairo_scaled_font_reset_static_data (); + + _cairo_pattern_reset_static_data (); + + _cairo_clip_reset_static_data (); + + _cairo_image_reset_static_data (); + +#if CAIRO_HAS_DRM_SURFACE + _cairo_drm_device_reset_static_data (); +#endif + + _cairo_default_context_reset_static_data (); + +#if CAIRO_HAS_COGL_SURFACE + _cairo_cogl_context_reset_static_data (); +#endif + + CAIRO_MUTEX_FINALIZE (); +} + +#if HAVE_VALGRIND +void +_cairo_debug_check_image_surface_is_defined (const cairo_surface_t *surface) +{ + const cairo_image_surface_t *image = (cairo_image_surface_t *) surface; + const uint8_t *bits; + int row, width; + + if (surface == NULL) + return; + + if (! RUNNING_ON_VALGRIND) + return; + + bits = image->data; + switch (image->format) { + case CAIRO_FORMAT_A1: + width = (image->width + 7)/8; + break; + case CAIRO_FORMAT_A8: + width = image->width; + break; + case CAIRO_FORMAT_RGB16_565: + width = image->width*2; + break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: + width = image->width*4; + break; + case CAIRO_FORMAT_INVALID: + default: + /* XXX compute width from pixman bpp */ + return; + } + + for (row = 0; row < image->height; row++) { + VALGRIND_CHECK_MEM_IS_DEFINED (bits, width); + /* and then silence any future valgrind warnings */ + VALGRIND_MAKE_MEM_DEFINED (bits, width); + bits += image->stride; + } +} +#endif + + +#if 0 +void +_cairo_image_surface_write_to_ppm (cairo_image_surface_t *isurf, const char *fn) +{ + char *fmt; + if (isurf->format == CAIRO_FORMAT_ARGB32 || isurf->format == CAIRO_FORMAT_RGB24) + fmt = "P6"; + else if (isurf->format == CAIRO_FORMAT_A8) + fmt = "P5"; + else + return; + + FILE *fp = fopen(fn, "wb"); + if (!fp) + return; + + fprintf (fp, "%s %d %d 255\n", fmt,isurf->width, isurf->height); + for (int j = 0; j < isurf->height; j++) { + unsigned char *row = isurf->data + isurf->stride * j; + for (int i = 0; i < isurf->width; i++) { + if (isurf->format == CAIRO_FORMAT_ARGB32 || isurf->format == CAIRO_FORMAT_RGB24) { + unsigned char r = *row++; + unsigned char g = *row++; + unsigned char b = *row++; + *row++; + putc(r, fp); + putc(g, fp); + putc(b, fp); + } else { + unsigned char a = *row++; + putc(a, fp); + } + } + } + + fclose (fp); + + fprintf (stderr, "Wrote %s\n", fn); +} +#endif + +static cairo_status_t +_print_move_to (void *closure, + const cairo_point_t *point) +{ + fprintf (closure, + " %f %f m", + _cairo_fixed_to_double (point->x), + _cairo_fixed_to_double (point->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_print_line_to (void *closure, + const cairo_point_t *point) +{ + fprintf (closure, + " %f %f l", + _cairo_fixed_to_double (point->x), + _cairo_fixed_to_double (point->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_print_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + fprintf (closure, + " %f %f %f %f %f %f c", + _cairo_fixed_to_double (p1->x), + _cairo_fixed_to_double (p1->y), + _cairo_fixed_to_double (p2->x), + _cairo_fixed_to_double (p2->y), + _cairo_fixed_to_double (p3->x), + _cairo_fixed_to_double (p3->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_print_close (void *closure) +{ + fprintf (closure, " h"); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_debug_print_path (FILE *stream, cairo_path_fixed_t *path) +{ + cairo_status_t status; + cairo_box_t box; + + fprintf (stream, + "path: extents=(%f, %f), (%f, %f)\n", + _cairo_fixed_to_double (path->extents.p1.x), + _cairo_fixed_to_double (path->extents.p1.y), + _cairo_fixed_to_double (path->extents.p2.x), + _cairo_fixed_to_double (path->extents.p2.y)); + + status = _cairo_path_fixed_interpret (path, + _print_move_to, + _print_line_to, + _print_curve_to, + _print_close, + stream); + assert (status == CAIRO_STATUS_SUCCESS); + + if (_cairo_path_fixed_is_box (path, &box)) { + fprintf (stream, "[box (%d, %d), (%d, %d)]", + box.p1.x, box.p1.y, box.p2.x, box.p2.y); + } + + printf ("\n"); +} + +void +_cairo_debug_print_polygon (FILE *stream, cairo_polygon_t *polygon) +{ + int n; + + fprintf (stream, + "polygon: extents=(%f, %f), (%f, %f)\n", + _cairo_fixed_to_double (polygon->extents.p1.x), + _cairo_fixed_to_double (polygon->extents.p1.y), + _cairo_fixed_to_double (polygon->extents.p2.x), + _cairo_fixed_to_double (polygon->extents.p2.y)); + if (polygon->num_limits) { + fprintf (stream, + " : limit=(%f, %f), (%f, %f) x %d\n", + _cairo_fixed_to_double (polygon->limit.p1.x), + _cairo_fixed_to_double (polygon->limit.p1.y), + _cairo_fixed_to_double (polygon->limit.p2.x), + _cairo_fixed_to_double (polygon->limit.p2.y), + polygon->num_limits); + } + + for (n = 0; n < polygon->num_edges; n++) { + cairo_edge_t *edge = &polygon->edges[n]; + + fprintf (stream, + " [%d] = [(%f, %f), (%f, %f)], top=%f, bottom=%f, dir=%d\n", + n, + _cairo_fixed_to_double (edge->line.p1.x), + _cairo_fixed_to_double (edge->line.p1.y), + _cairo_fixed_to_double (edge->line.p2.x), + _cairo_fixed_to_double (edge->line.p2.y), + _cairo_fixed_to_double (edge->top), + _cairo_fixed_to_double (edge->bottom), + edge->dir); + + } +} diff --git a/src/cairo-default-context-private.h b/src/cairo-default-context-private.h new file mode 100644 index 000000000..fd159b496 --- /dev/null +++ b/src/cairo-default-context-private.h @@ -0,0 +1,68 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_DEFAULT_CONTEXT_PRIVATE_H +#define CAIRO_DEFAULT_CONTEXT_PRIVATE_H + +#include "cairo-private.h" +#include "cairo-gstate-private.h" +#include "cairo-path-fixed-private.h" + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_default_context cairo_default_context_t; + +struct _cairo_default_context { + cairo_t base; + + cairo_gstate_t *gstate; + cairo_gstate_t gstate_tail[2]; + cairo_gstate_t *gstate_freelist; + + cairo_path_fixed_t path[1]; +}; + +cairo_private cairo_t * +_cairo_default_context_create (void *target); + +cairo_private cairo_status_t +_cairo_default_context_init (cairo_default_context_t *cr, void *target); + +cairo_private void +_cairo_default_context_fini (cairo_default_context_t *cr); + +CAIRO_END_DECLS + +#endif /* CAIRO_DEFAULT_CONTEXT_PRIVATE_H */ diff --git a/src/cairo-default-context.c b/src/cairo-default-context.c new file mode 100644 index 000000000..1e5067bf1 --- /dev/null +++ b/src/cairo-default-context.c @@ -0,0 +1,1475 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-private.h" +#include "cairo-arc-private.h" +#include "cairo-backend-private.h" +#include "cairo-clip-inline.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-path-private.h" +#include "cairo-pattern-private.h" + +#define CAIRO_TOLERANCE_MINIMUM _cairo_fixed_to_double(1) + +#if !defined(INFINITY) +#define INFINITY HUGE_VAL +#endif + +static freed_pool_t context_pool; + +void +_cairo_default_context_reset_static_data (void) +{ + _freed_pool_reset (&context_pool); +} + +void +_cairo_default_context_fini (cairo_default_context_t *cr) +{ + while (cr->gstate != &cr->gstate_tail[0]) { + if (_cairo_gstate_restore (&cr->gstate, &cr->gstate_freelist)) + break; + } + + _cairo_gstate_fini (cr->gstate); + cr->gstate_freelist = cr->gstate_freelist->next; /* skip over tail[1] */ + while (cr->gstate_freelist != NULL) { + cairo_gstate_t *gstate = cr->gstate_freelist; + cr->gstate_freelist = gstate->next; + free (gstate); + } + + _cairo_path_fixed_fini (cr->path); + + _cairo_fini (&cr->base); +} + +static void +_cairo_default_context_destroy (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_default_context_fini (cr); + + /* mark the context as invalid to protect against misuse */ + cr->base.status = CAIRO_STATUS_NULL_POINTER; + _freed_pool_put (&context_pool, cr); +} + +static cairo_surface_t * +_cairo_default_context_get_original_target (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_original_target (cr->gstate); +} + +static cairo_surface_t * +_cairo_default_context_get_current_target (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_target (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_save (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_save (&cr->gstate, &cr->gstate_freelist); +} + +static cairo_status_t +_cairo_default_context_restore (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + if (unlikely (_cairo_gstate_is_group (cr->gstate))) + return _cairo_error (CAIRO_STATUS_INVALID_RESTORE); + + return _cairo_gstate_restore (&cr->gstate, &cr->gstate_freelist); +} + +static cairo_status_t +_cairo_default_context_push_group (void *abstract_cr, cairo_content_t content) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_surface_t *group_surface; + cairo_clip_t *clip; + cairo_status_t status; + + clip = _cairo_gstate_get_clip (cr->gstate); + if (_cairo_clip_is_all_clipped (clip)) { + group_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); + status = group_surface->status; + if (unlikely (status)) + goto bail; + } else { + cairo_surface_t *parent_surface; + cairo_rectangle_int_t extents; + cairo_bool_t bounded, is_empty; + + parent_surface = _cairo_gstate_get_target (cr->gstate); + + if (unlikely (parent_surface->status)) + return parent_surface->status; + if (unlikely (parent_surface->finished)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + /* Get the extents that we'll use in creating our new group surface */ + bounded = _cairo_surface_get_extents (parent_surface, &extents); + if (clip) + /* XXX: This assignment just fixes a compiler warning? */ + is_empty = _cairo_rectangle_intersect (&extents, + _cairo_clip_get_extents (clip)); + + if (!bounded) { + /* XXX: Generic solution? */ + group_surface = cairo_recording_surface_create (content, NULL); + extents.x = extents.y = 0; + } else { + group_surface = _cairo_surface_create_scratch (parent_surface, + content, + extents.width, + extents.height, + CAIRO_COLOR_TRANSPARENT); + } + status = group_surface->status; + if (unlikely (status)) + goto bail; + + /* Set device offsets on the new surface so that logically it appears at + * the same location on the parent surface -- when we pop_group this, + * the source pattern will get fixed up for the appropriate target surface + * device offsets, so we want to set our own surface offsets from /that/, + * and not from the device origin. */ + cairo_surface_set_device_offset (group_surface, + parent_surface->device_transform.x0 - extents.x, + parent_surface->device_transform.y0 - extents.y); + + cairo_surface_set_device_scale (group_surface, + parent_surface->device_transform.xx, + parent_surface->device_transform.yy); + + /* If we have a current path, we need to adjust it to compensate for + * the device offset just applied. */ + _cairo_path_fixed_translate (cr->path, + _cairo_fixed_from_int (-extents.x), + _cairo_fixed_from_int (-extents.y)); + } + + /* create a new gstate for the redirect */ + status = _cairo_gstate_save (&cr->gstate, &cr->gstate_freelist); + if (unlikely (status)) + goto bail; + + status = _cairo_gstate_redirect_target (cr->gstate, group_surface); + +bail: + cairo_surface_destroy (group_surface); + return status; +} + +static cairo_pattern_t * +_cairo_default_context_pop_group (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_surface_t *group_surface; + cairo_pattern_t *group_pattern; + cairo_surface_t *parent_surface; + cairo_matrix_t group_matrix; + cairo_status_t status; + + /* Verify that we are at the right nesting level */ + if (unlikely (! _cairo_gstate_is_group (cr->gstate))) + return _cairo_pattern_create_in_error (CAIRO_STATUS_INVALID_POP_GROUP); + + /* Get a reference to the active surface before restoring */ + group_surface = _cairo_gstate_get_target (cr->gstate); + group_surface = cairo_surface_reference (group_surface); + + status = _cairo_gstate_restore (&cr->gstate, &cr->gstate_freelist); + assert (status == CAIRO_STATUS_SUCCESS); + + parent_surface = _cairo_gstate_get_target (cr->gstate); + + group_pattern = cairo_pattern_create_for_surface (group_surface); + status = group_pattern->status; + if (unlikely (status)) + goto done; + + _cairo_gstate_get_matrix (cr->gstate, &group_matrix); + cairo_pattern_set_matrix (group_pattern, &group_matrix); + + /* If we have a current path, we need to adjust it to compensate for + * the device offset just removed. */ + _cairo_path_fixed_translate (cr->path, + _cairo_fixed_from_int (parent_surface->device_transform.x0 - group_surface->device_transform.x0), + _cairo_fixed_from_int (parent_surface->device_transform.y0 - group_surface->device_transform.y0)); + +done: + cairo_surface_destroy (group_surface); + + return group_pattern; +} + +static cairo_status_t +_cairo_default_context_set_source (void *abstract_cr, + cairo_pattern_t *source) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_source (cr->gstate, source); +} + +static cairo_bool_t +_current_source_matches_solid (const cairo_pattern_t *pattern, + double red, + double green, + double blue, + double alpha) +{ + cairo_color_t color; + + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) + return FALSE; + + red = _cairo_restrict_value (red, 0.0, 1.0); + green = _cairo_restrict_value (green, 0.0, 1.0); + blue = _cairo_restrict_value (blue, 0.0, 1.0); + alpha = _cairo_restrict_value (alpha, 0.0, 1.0); + + _cairo_color_init_rgba (&color, red, green, blue, alpha); + return _cairo_color_equal (&color, + &((cairo_solid_pattern_t *) pattern)->color); +} + +static cairo_status_t +_cairo_default_context_set_source_rgba (void *abstract_cr, double red, double green, double blue, double alpha) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_pattern_t *pattern; + cairo_status_t status; + + if (_current_source_matches_solid (cr->gstate->source, + red, green, blue, alpha)) + return CAIRO_STATUS_SUCCESS; + + /* push the current pattern to the freed lists */ + _cairo_default_context_set_source (cr, (cairo_pattern_t *) &_cairo_pattern_black); + + pattern = cairo_pattern_create_rgba (red, green, blue, alpha); + if (unlikely (pattern->status)) + return pattern->status; + + status = _cairo_default_context_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + return status; +} + +static cairo_status_t +_cairo_default_context_set_source_surface (void *abstract_cr, + cairo_surface_t *surface, + double x, + double y) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + cairo_status_t status; + + /* push the current pattern to the freed lists */ + _cairo_default_context_set_source (cr, (cairo_pattern_t *) &_cairo_pattern_black); + + pattern = cairo_pattern_create_for_surface (surface); + if (unlikely (pattern->status)) + return pattern->status; + + cairo_matrix_init_translate (&matrix, -x, -y); + cairo_pattern_set_matrix (pattern, &matrix); + + status = _cairo_default_context_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + return status; +} + +static cairo_pattern_t * +_cairo_default_context_get_source (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_source (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_set_tolerance (void *abstract_cr, + double tolerance) +{ + cairo_default_context_t *cr = abstract_cr; + + if (tolerance < CAIRO_TOLERANCE_MINIMUM) + tolerance = CAIRO_TOLERANCE_MINIMUM; + + return _cairo_gstate_set_tolerance (cr->gstate, tolerance); +} + +static cairo_status_t +_cairo_default_context_set_operator (void *abstract_cr, cairo_operator_t op) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_operator (cr->gstate, op); +} + +static cairo_status_t +_cairo_default_context_set_opacity (void *abstract_cr, double opacity) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_opacity (cr->gstate, opacity); +} + +static cairo_status_t +_cairo_default_context_set_antialias (void *abstract_cr, + cairo_antialias_t antialias) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_antialias (cr->gstate, antialias); +} + +static cairo_status_t +_cairo_default_context_set_fill_rule (void *abstract_cr, + cairo_fill_rule_t fill_rule) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_fill_rule (cr->gstate, fill_rule); +} + +static cairo_status_t +_cairo_default_context_set_line_width (void *abstract_cr, + double line_width) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_line_width (cr->gstate, line_width); +} + +static cairo_status_t +_cairo_default_context_set_line_cap (void *abstract_cr, + cairo_line_cap_t line_cap) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_line_cap (cr->gstate, line_cap); +} + +static cairo_status_t +_cairo_default_context_set_line_join (void *abstract_cr, + cairo_line_join_t line_join) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_line_join (cr->gstate, line_join); +} + +static cairo_status_t +_cairo_default_context_set_dash (void *abstract_cr, + const double *dashes, + int num_dashes, + double offset) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_dash (cr->gstate, + dashes, num_dashes, offset); +} + +static cairo_status_t +_cairo_default_context_set_miter_limit (void *abstract_cr, + double limit) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_miter_limit (cr->gstate, limit); +} + +static cairo_antialias_t +_cairo_default_context_get_antialias (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_antialias (cr->gstate); +} + +static void +_cairo_default_context_get_dash (void *abstract_cr, + double *dashes, + int *num_dashes, + double *offset) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_get_dash (cr->gstate, dashes, num_dashes, offset); +} + +static cairo_fill_rule_t +_cairo_default_context_get_fill_rule (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_fill_rule (cr->gstate); +} + +static double +_cairo_default_context_get_line_width (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_line_width (cr->gstate); +} + +static cairo_line_cap_t +_cairo_default_context_get_line_cap (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_line_cap (cr->gstate); +} + +static cairo_line_join_t +_cairo_default_context_get_line_join (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_line_join (cr->gstate); +} + +static double +_cairo_default_context_get_miter_limit (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_miter_limit (cr->gstate); +} + +static cairo_operator_t +_cairo_default_context_get_operator (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_operator (cr->gstate); +} + +static double +_cairo_default_context_get_opacity (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_opacity (cr->gstate); +} + +static double +_cairo_default_context_get_tolerance (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_tolerance (cr->gstate); +} + + +/* Current tranformation matrix */ + +static cairo_status_t +_cairo_default_context_translate (void *abstract_cr, + double tx, + double ty) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_translate (cr->gstate, tx, ty); +} + +static cairo_status_t +_cairo_default_context_scale (void *abstract_cr, + double sx, + double sy) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_scale (cr->gstate, sx, sy); +} + +static cairo_status_t +_cairo_default_context_rotate (void *abstract_cr, + double theta) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_rotate (cr->gstate, theta); +} + +static cairo_status_t +_cairo_default_context_transform (void *abstract_cr, + const cairo_matrix_t *matrix) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_transform (cr->gstate, matrix); +} + +static cairo_status_t +_cairo_default_context_set_matrix (void *abstract_cr, + const cairo_matrix_t *matrix) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_matrix (cr->gstate, matrix); +} + +static cairo_status_t +_cairo_default_context_set_identity_matrix (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_identity_matrix (cr->gstate); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_default_context_get_matrix (void *abstract_cr, + cairo_matrix_t *matrix) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_get_matrix (cr->gstate, matrix); +} + +static void +_cairo_default_context_user_to_device (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_user_to_device (cr->gstate, x, y); +} + +static void +_cairo_default_context_user_to_device_distance (void *abstract_cr, double *dx, double *dy) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_user_to_device_distance (cr->gstate, dx, dy); +} + +static void +_cairo_default_context_device_to_user (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_device_to_user (cr->gstate, x, y); +} + +static void +_cairo_default_context_device_to_user_distance (void *abstract_cr, + double *dx, + double *dy) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_device_to_user_distance (cr->gstate, dx, dy); +} + +static void +_cairo_default_context_backend_to_user (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_backend_to_user (cr->gstate, x, y); +} + +static void +_cairo_default_context_backend_to_user_distance (void *abstract_cr, double *dx, double *dy) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_backend_to_user_distance (cr->gstate, dx, dy); +} + +static void +_cairo_default_context_user_to_backend (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_user_to_backend (cr->gstate, x, y); +} + +static void +_cairo_default_context_user_to_backend_distance (void *abstract_cr, + double *dx, + double *dy) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_user_to_backend_distance (cr->gstate, dx, dy); +} + +/* Path constructor */ + +static cairo_status_t +_cairo_default_context_new_path (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_path_fixed_fini (cr->path); + _cairo_path_fixed_init (cr->path); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_default_context_new_sub_path (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_path_fixed_new_sub_path (cr->path); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_default_context_move_to (void *abstract_cr, double x, double y) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t x_fixed, y_fixed; + + _cairo_gstate_user_to_backend (cr->gstate, &x, &y); + x_fixed = _cairo_fixed_from_double (x); + y_fixed = _cairo_fixed_from_double (y); + + return _cairo_path_fixed_move_to (cr->path, x_fixed, y_fixed); +} + +static cairo_status_t +_cairo_default_context_line_to (void *abstract_cr, double x, double y) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t x_fixed, y_fixed; + + _cairo_gstate_user_to_backend (cr->gstate, &x, &y); + x_fixed = _cairo_fixed_from_double (x); + y_fixed = _cairo_fixed_from_double (y); + + return _cairo_path_fixed_line_to (cr->path, x_fixed, y_fixed); +} + +static cairo_status_t +_cairo_default_context_curve_to (void *abstract_cr, + double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t x1_fixed, y1_fixed; + cairo_fixed_t x2_fixed, y2_fixed; + cairo_fixed_t x3_fixed, y3_fixed; + + _cairo_gstate_user_to_backend (cr->gstate, &x1, &y1); + _cairo_gstate_user_to_backend (cr->gstate, &x2, &y2); + _cairo_gstate_user_to_backend (cr->gstate, &x3, &y3); + + x1_fixed = _cairo_fixed_from_double (x1); + y1_fixed = _cairo_fixed_from_double (y1); + + x2_fixed = _cairo_fixed_from_double (x2); + y2_fixed = _cairo_fixed_from_double (y2); + + x3_fixed = _cairo_fixed_from_double (x3); + y3_fixed = _cairo_fixed_from_double (y3); + + return _cairo_path_fixed_curve_to (cr->path, + x1_fixed, y1_fixed, + x2_fixed, y2_fixed, + x3_fixed, y3_fixed); +} + +static cairo_status_t +_cairo_default_context_arc (void *abstract_cr, + double xc, double yc, double radius, + double angle1, double angle2, + cairo_bool_t forward) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_status_t status; + + /* Do nothing, successfully, if radius is <= 0 */ + if (radius <= 0.0) { + cairo_fixed_t x_fixed, y_fixed; + + _cairo_gstate_user_to_backend (cr->gstate, &xc, &yc); + x_fixed = _cairo_fixed_from_double (xc); + y_fixed = _cairo_fixed_from_double (yc); + status = _cairo_path_fixed_line_to (cr->path, x_fixed, y_fixed); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (cr->path, x_fixed, y_fixed); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_default_context_line_to (cr, + xc + radius * cos (angle1), + yc + radius * sin (angle1)); + + if (unlikely (status)) + return status; + + if (forward) + _cairo_arc_path (&cr->base, xc, yc, radius, angle1, angle2); + else + _cairo_arc_path_negative (&cr->base, xc, yc, radius, angle1, angle2); + + return CAIRO_STATUS_SUCCESS; /* any error will have already been set on cr */ +} + +static cairo_status_t +_cairo_default_context_rel_move_to (void *abstract_cr, double dx, double dy) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t dx_fixed, dy_fixed; + + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx, &dy); + + dx_fixed = _cairo_fixed_from_double (dx); + dy_fixed = _cairo_fixed_from_double (dy); + + return _cairo_path_fixed_rel_move_to (cr->path, dx_fixed, dy_fixed); +} + +static cairo_status_t +_cairo_default_context_rel_line_to (void *abstract_cr, double dx, double dy) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t dx_fixed, dy_fixed; + + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx, &dy); + + dx_fixed = _cairo_fixed_from_double (dx); + dy_fixed = _cairo_fixed_from_double (dy); + + return _cairo_path_fixed_rel_line_to (cr->path, dx_fixed, dy_fixed); +} + + +static cairo_status_t +_cairo_default_context_rel_curve_to (void *abstract_cr, + double dx1, double dy1, + double dx2, double dy2, + double dx3, double dy3) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t dx1_fixed, dy1_fixed; + cairo_fixed_t dx2_fixed, dy2_fixed; + cairo_fixed_t dx3_fixed, dy3_fixed; + + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx1, &dy1); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx2, &dy2); + _cairo_gstate_user_to_backend_distance (cr->gstate, &dx3, &dy3); + + dx1_fixed = _cairo_fixed_from_double (dx1); + dy1_fixed = _cairo_fixed_from_double (dy1); + + dx2_fixed = _cairo_fixed_from_double (dx2); + dy2_fixed = _cairo_fixed_from_double (dy2); + + dx3_fixed = _cairo_fixed_from_double (dx3); + dy3_fixed = _cairo_fixed_from_double (dy3); + + return _cairo_path_fixed_rel_curve_to (cr->path, + dx1_fixed, dy1_fixed, + dx2_fixed, dy2_fixed, + dx3_fixed, dy3_fixed); +} + +static cairo_status_t +_cairo_default_context_close_path (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_path_fixed_close_path (cr->path); +} + +static cairo_status_t +_cairo_default_context_rectangle (void *abstract_cr, + double x, double y, + double width, double height) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_status_t status; + + status = _cairo_default_context_move_to (cr, x, y); + if (unlikely (status)) + return status; + + status = _cairo_default_context_rel_line_to (cr, width, 0); + if (unlikely (status)) + return status; + + status = _cairo_default_context_rel_line_to (cr, 0, height); + if (unlikely (status)) + return status; + + status = _cairo_default_context_rel_line_to (cr, -width, 0); + if (unlikely (status)) + return status; + + return _cairo_default_context_close_path (cr); +} + +static void +_cairo_default_context_path_extents (void *abstract_cr, + double *x1, + double *y1, + double *x2, + double *y2) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_path_extents (cr->gstate, + cr->path, + x1, y1, x2, y2); +} + +static cairo_bool_t +_cairo_default_context_has_current_point (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return cr->path->has_current_point; +} + +static cairo_bool_t +_cairo_default_context_get_current_point (void *abstract_cr, + double *x, + double *y) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_fixed_t x_fixed, y_fixed; + + if (_cairo_path_fixed_get_current_point (cr->path, &x_fixed, &y_fixed)) + { + *x = _cairo_fixed_to_double (x_fixed); + *y = _cairo_fixed_to_double (y_fixed); + _cairo_gstate_backend_to_user (cr->gstate, x, y); + + return TRUE; + } + else + { + return FALSE; + } +} + +static cairo_path_t * +_cairo_default_context_copy_path (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_path_create (cr->path, &cr->base); +} + +static cairo_path_t * +_cairo_default_context_copy_path_flat (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_path_create_flat (cr->path, &cr->base); +} + +static cairo_status_t +_cairo_default_context_append_path (void *abstract_cr, + const cairo_path_t *path) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_path_append_to_context (path, &cr->base); +} + +static cairo_status_t +_cairo_default_context_paint (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_paint (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_paint_with_alpha (void *abstract_cr, + double alpha) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_solid_pattern_t pattern; + cairo_status_t status; + cairo_color_t color; + + if (CAIRO_ALPHA_IS_OPAQUE (alpha)) + return _cairo_gstate_paint (cr->gstate); + + if (CAIRO_ALPHA_IS_ZERO (alpha) && + _cairo_operator_bounded_by_mask (cr->gstate->op)) { + return CAIRO_STATUS_SUCCESS; + } + + _cairo_color_init_rgba (&color, 0., 0., 0., alpha); + _cairo_pattern_init_solid (&pattern, &color); + + status = _cairo_gstate_mask (cr->gstate, &pattern.base); + _cairo_pattern_fini (&pattern.base); + + return status; +} + +static cairo_status_t +_cairo_default_context_mask (void *abstract_cr, + cairo_pattern_t *mask) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_mask (cr->gstate, mask); +} + +static cairo_status_t +_cairo_default_context_stroke_preserve (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_stroke (cr->gstate, cr->path); +} + +static cairo_status_t +_cairo_default_context_stroke (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_status_t status; + + status = _cairo_gstate_stroke (cr->gstate, cr->path); + if (unlikely (status)) + return status; + + return _cairo_default_context_new_path (cr); +} + +static cairo_status_t +_cairo_default_context_in_stroke (void *abstract_cr, + double x, double y, + cairo_bool_t *inside) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_in_stroke (cr->gstate, + cr->path, + x, y, + inside); +} + +static cairo_status_t +_cairo_default_context_stroke_extents (void *abstract_cr, + double *x1, double *y1, double *x2, double *y2) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_stroke_extents (cr->gstate, + cr->path, + x1, y1, x2, y2); +} + +static cairo_status_t +_cairo_default_context_fill_preserve (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_fill (cr->gstate, cr->path); +} + +static cairo_status_t +_cairo_default_context_fill (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_status_t status; + + status = _cairo_gstate_fill (cr->gstate, cr->path); + if (unlikely (status)) + return status; + + return _cairo_default_context_new_path (cr); +} + +static cairo_status_t +_cairo_default_context_in_fill (void *abstract_cr, + double x, double y, + cairo_bool_t *inside) +{ + cairo_default_context_t *cr = abstract_cr; + + *inside = _cairo_gstate_in_fill (cr->gstate, + cr->path, + x, y); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_default_context_fill_extents (void *abstract_cr, + double *x1, double *y1, double *x2, double *y2) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_fill_extents (cr->gstate, + cr->path, + x1, y1, x2, y2); +} + +static cairo_status_t +_cairo_default_context_clip_preserve (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_clip (cr->gstate, cr->path); +} + +static cairo_status_t +_cairo_default_context_clip (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_status_t status; + + status = _cairo_gstate_clip (cr->gstate, cr->path); + if (unlikely (status)) + return status; + + return _cairo_default_context_new_path (cr); +} + +static cairo_status_t +_cairo_default_context_in_clip (void *abstract_cr, + double x, double y, + cairo_bool_t *inside) +{ + cairo_default_context_t *cr = abstract_cr; + + *inside = _cairo_gstate_in_clip (cr->gstate, x, y); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_default_context_reset_clip (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_reset_clip (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_clip_extents (void *abstract_cr, + double *x1, double *y1, double *x2, double *y2) +{ + cairo_default_context_t *cr = abstract_cr; + + if (! _cairo_gstate_clip_extents (cr->gstate, x1, y1, x2, y2)) { + *x1 = -INFINITY; + *y1 = -INFINITY; + *x2 = +INFINITY; + *y2 = +INFINITY; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_rectangle_list_t * +_cairo_default_context_copy_clip_rectangle_list (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_copy_clip_rectangle_list (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_copy_page (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_copy_page (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_show_page (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_show_page (cr->gstate); +} + +static cairo_status_t +_cairo_default_context_set_font_face (void *abstract_cr, + cairo_font_face_t *font_face) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_font_face (cr->gstate, font_face); +} + +static cairo_font_face_t * +_cairo_default_context_get_font_face (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_font_face_t *font_face; + cairo_status_t status; + + status = _cairo_gstate_get_font_face (cr->gstate, &font_face); + if (unlikely (status)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *) &_cairo_font_face_nil; + } + + return font_face; +} + +static cairo_status_t +_cairo_default_context_font_extents (void *abstract_cr, + cairo_font_extents_t *extents) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_get_font_extents (cr->gstate, extents); +} + +static cairo_status_t +_cairo_default_context_set_font_size (void *abstract_cr, + double size) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_font_size (cr->gstate, size); +} + +static cairo_status_t +_cairo_default_context_set_font_matrix (void *abstract_cr, + const cairo_matrix_t *matrix) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_set_font_matrix (cr->gstate, matrix); +} + +static void +_cairo_default_context_get_font_matrix (void *abstract_cr, + cairo_matrix_t *matrix) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_get_font_matrix (cr->gstate, matrix); +} + +static cairo_status_t +_cairo_default_context_set_font_options (void *abstract_cr, + const cairo_font_options_t *options) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_set_font_options (cr->gstate, options); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_default_context_get_font_options (void *abstract_cr, + cairo_font_options_t *options) +{ + cairo_default_context_t *cr = abstract_cr; + + _cairo_gstate_get_font_options (cr->gstate, options); +} + +static cairo_status_t +_cairo_default_context_set_scaled_font (void *abstract_cr, + cairo_scaled_font_t *scaled_font) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_bool_t was_previous; + cairo_status_t status; + + if (scaled_font == cr->gstate->scaled_font) + return CAIRO_STATUS_SUCCESS; + + was_previous = scaled_font == cr->gstate->previous_scaled_font; + + status = _cairo_gstate_set_font_face (cr->gstate, scaled_font->font_face); + if (unlikely (status)) + return status; + + status = _cairo_gstate_set_font_matrix (cr->gstate, &scaled_font->font_matrix); + if (unlikely (status)) + return status; + + _cairo_gstate_set_font_options (cr->gstate, &scaled_font->options); + + if (was_previous) + cr->gstate->scaled_font = cairo_scaled_font_reference (scaled_font); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_scaled_font_t * +_cairo_default_context_get_scaled_font (void *abstract_cr) +{ + cairo_default_context_t *cr = abstract_cr; + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + + status = _cairo_gstate_get_scaled_font (cr->gstate, &scaled_font); + if (unlikely (status)) + return _cairo_scaled_font_create_in_error (status); + + return scaled_font; +} + +static cairo_status_t +_cairo_default_context_glyphs (void *abstract_cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_glyph_text_info_t *info) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_show_text_glyphs (cr->gstate, glyphs, num_glyphs, info); +} + +static cairo_status_t +_cairo_default_context_glyph_path (void *abstract_cr, + const cairo_glyph_t *glyphs, + int num_glyphs) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_glyph_path (cr->gstate, + glyphs, num_glyphs, + cr->path); +} + +static cairo_status_t +_cairo_default_context_glyph_extents (void *abstract_cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents) +{ + cairo_default_context_t *cr = abstract_cr; + + return _cairo_gstate_glyph_extents (cr->gstate, glyphs, num_glyphs, extents); +} + +static const cairo_backend_t _cairo_default_context_backend = { + CAIRO_TYPE_DEFAULT, + _cairo_default_context_destroy, + + _cairo_default_context_get_original_target, + _cairo_default_context_get_current_target, + + _cairo_default_context_save, + _cairo_default_context_restore, + + _cairo_default_context_push_group, + _cairo_default_context_pop_group, + + _cairo_default_context_set_source_rgba, + _cairo_default_context_set_source_surface, + _cairo_default_context_set_source, + _cairo_default_context_get_source, + + _cairo_default_context_set_antialias, + _cairo_default_context_set_dash, + _cairo_default_context_set_fill_rule, + _cairo_default_context_set_line_cap, + _cairo_default_context_set_line_join, + _cairo_default_context_set_line_width, + _cairo_default_context_set_miter_limit, + _cairo_default_context_set_opacity, + _cairo_default_context_set_operator, + _cairo_default_context_set_tolerance, + _cairo_default_context_get_antialias, + _cairo_default_context_get_dash, + _cairo_default_context_get_fill_rule, + _cairo_default_context_get_line_cap, + _cairo_default_context_get_line_join, + _cairo_default_context_get_line_width, + _cairo_default_context_get_miter_limit, + _cairo_default_context_get_opacity, + _cairo_default_context_get_operator, + _cairo_default_context_get_tolerance, + + _cairo_default_context_translate, + _cairo_default_context_scale, + _cairo_default_context_rotate, + _cairo_default_context_transform, + _cairo_default_context_set_matrix, + _cairo_default_context_set_identity_matrix, + _cairo_default_context_get_matrix, + + _cairo_default_context_user_to_device, + _cairo_default_context_user_to_device_distance, + _cairo_default_context_device_to_user, + _cairo_default_context_device_to_user_distance, + + _cairo_default_context_user_to_backend, + _cairo_default_context_user_to_backend_distance, + _cairo_default_context_backend_to_user, + _cairo_default_context_backend_to_user_distance, + + _cairo_default_context_new_path, + _cairo_default_context_new_sub_path, + _cairo_default_context_move_to, + _cairo_default_context_rel_move_to, + _cairo_default_context_line_to, + _cairo_default_context_rel_line_to, + _cairo_default_context_curve_to, + _cairo_default_context_rel_curve_to, + NULL, /* arc-to */ + NULL, /* rel-arc-to */ + _cairo_default_context_close_path, + _cairo_default_context_arc, + _cairo_default_context_rectangle, + _cairo_default_context_path_extents, + _cairo_default_context_has_current_point, + _cairo_default_context_get_current_point, + _cairo_default_context_copy_path, + _cairo_default_context_copy_path_flat, + _cairo_default_context_append_path, + + NULL, /* stroke-to-path */ + + _cairo_default_context_clip, + _cairo_default_context_clip_preserve, + _cairo_default_context_in_clip, + _cairo_default_context_clip_extents, + _cairo_default_context_reset_clip, + _cairo_default_context_copy_clip_rectangle_list, + + _cairo_default_context_paint, + _cairo_default_context_paint_with_alpha, + _cairo_default_context_mask, + + _cairo_default_context_stroke, + _cairo_default_context_stroke_preserve, + _cairo_default_context_in_stroke, + _cairo_default_context_stroke_extents, + + _cairo_default_context_fill, + _cairo_default_context_fill_preserve, + _cairo_default_context_in_fill, + _cairo_default_context_fill_extents, + + _cairo_default_context_set_font_face, + _cairo_default_context_get_font_face, + _cairo_default_context_set_font_size, + _cairo_default_context_set_font_matrix, + _cairo_default_context_get_font_matrix, + _cairo_default_context_set_font_options, + _cairo_default_context_get_font_options, + _cairo_default_context_set_scaled_font, + _cairo_default_context_get_scaled_font, + _cairo_default_context_font_extents, + + _cairo_default_context_glyphs, + _cairo_default_context_glyph_path, + _cairo_default_context_glyph_extents, + + _cairo_default_context_copy_page, + _cairo_default_context_show_page, +}; + +cairo_status_t +_cairo_default_context_init (cairo_default_context_t *cr, void *target) +{ + _cairo_init (&cr->base, &_cairo_default_context_backend); + _cairo_path_fixed_init (cr->path); + + cr->gstate = &cr->gstate_tail[0]; + cr->gstate_freelist = &cr->gstate_tail[1]; + cr->gstate_tail[1].next = NULL; + + return _cairo_gstate_init (cr->gstate, target); +} + +cairo_t * +_cairo_default_context_create (void *target) +{ + cairo_default_context_t *cr; + cairo_status_t status; + + cr = _freed_pool_get (&context_pool); + if (unlikely (cr == NULL)) { + cr = malloc (sizeof (cairo_default_context_t)); + if (unlikely (cr == NULL)) + return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + status = _cairo_default_context_init (cr, target); + if (unlikely (status)) { + _freed_pool_put (&context_pool, cr); + return _cairo_create_in_error (status); + } + + return &cr->base; +} diff --git a/src/cairo-deflate-stream.c b/src/cairo-deflate-stream.c new file mode 100644 index 000000000..ae23bda94 --- /dev/null +++ b/src/cairo-deflate-stream.c @@ -0,0 +1,156 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Author(s): + * Adrian Johnson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_DEFLATE_STREAM + +#include "cairo-error-private.h" +#include "cairo-output-stream-private.h" +#include + +#define BUFFER_SIZE 16384 + +typedef struct _cairo_deflate_stream { + cairo_output_stream_t base; + cairo_output_stream_t *output; + z_stream zlib_stream; + unsigned char input_buf[BUFFER_SIZE]; + unsigned char output_buf[BUFFER_SIZE]; +} cairo_deflate_stream_t; + +static void +cairo_deflate_stream_deflate (cairo_deflate_stream_t *stream, cairo_bool_t flush) +{ + int ret; + cairo_bool_t finished; + + do { + ret = deflate (&stream->zlib_stream, flush ? Z_FINISH : Z_NO_FLUSH); + if (flush || stream->zlib_stream.avail_out == 0) + { + _cairo_output_stream_write (stream->output, + stream->output_buf, + BUFFER_SIZE - stream->zlib_stream.avail_out); + stream->zlib_stream.next_out = stream->output_buf; + stream->zlib_stream.avail_out = BUFFER_SIZE; + } + + finished = TRUE; + if (stream->zlib_stream.avail_in != 0) + finished = FALSE; + if (flush && ret != Z_STREAM_END) + finished = FALSE; + + } while (!finished); + + stream->zlib_stream.next_in = stream->input_buf; +} + +static cairo_status_t +_cairo_deflate_stream_write (cairo_output_stream_t *base, + const unsigned char *data, + unsigned int length) +{ + cairo_deflate_stream_t *stream = (cairo_deflate_stream_t *) base; + unsigned int count; + const unsigned char *p = data; + + while (length) { + count = length; + if (count > BUFFER_SIZE - stream->zlib_stream.avail_in) + count = BUFFER_SIZE - stream->zlib_stream.avail_in; + memcpy (stream->input_buf + stream->zlib_stream.avail_in, p, count); + p += count; + stream->zlib_stream.avail_in += count; + length -= count; + + if (stream->zlib_stream.avail_in == BUFFER_SIZE) + cairo_deflate_stream_deflate (stream, FALSE); + } + + return _cairo_output_stream_get_status (stream->output); +} + +static cairo_status_t +_cairo_deflate_stream_close (cairo_output_stream_t *base) +{ + cairo_deflate_stream_t *stream = (cairo_deflate_stream_t *) base; + + cairo_deflate_stream_deflate (stream, TRUE); + deflateEnd (&stream->zlib_stream); + + return _cairo_output_stream_get_status (stream->output); +} + +cairo_output_stream_t * +_cairo_deflate_stream_create (cairo_output_stream_t *output) +{ + cairo_deflate_stream_t *stream; + + if (output->status) + return _cairo_output_stream_create_in_error (output->status); + + stream = malloc (sizeof (cairo_deflate_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + _cairo_deflate_stream_write, + NULL, + _cairo_deflate_stream_close); + stream->output = output; + + stream->zlib_stream.zalloc = Z_NULL; + stream->zlib_stream.zfree = Z_NULL; + stream->zlib_stream.opaque = Z_NULL; + + if (deflateInit (&stream->zlib_stream, Z_DEFAULT_COMPRESSION) != Z_OK) { + free (stream); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + stream->zlib_stream.next_in = stream->input_buf; + stream->zlib_stream.avail_in = 0; + stream->zlib_stream.next_out = stream->output_buf; + stream->zlib_stream.avail_out = BUFFER_SIZE; + + return &stream->base; +} + +#endif /* CAIRO_HAS_DEFLATE_STREAM */ diff --git a/src/cairo-deprecated.h b/src/cairo-deprecated.h new file mode 100644 index 000000000..7a56aadbf --- /dev/null +++ b/src/cairo-deprecated.h @@ -0,0 +1,123 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_DEPRECATED_H +#define CAIRO_DEPRECATED_H + +#define CAIRO_FONT_TYPE_ATSUI CAIRO_FONT_TYPE_QUARTZ + +/* Obsolete functions. These definitions exist to coerce the compiler + * into providing a little bit of guidance with its error + * messages. The idea is to help users port their old code without + * having to dig through lots of documentation. + * + * The first set of REPLACED_BY functions is for functions whose names + * have just been changed. So fixing these up is mechanical, (and + * automated by means of the cairo/util/cairo-api-update script. + * + * The second set of DEPRECATED_BY functions is for functions where + * the replacement is used in a different way, (ie. different + * arguments, multiple functions instead of one, etc). Fixing these up + * will require a bit more work on the user's part, (and hopefully we + * can get cairo-api-update to find these and print some guiding + * information). + */ +#define cairo_current_font_extents cairo_current_font_extents_REPLACED_BY_cairo_font_extents +#define cairo_get_font_extents cairo_get_font_extents_REPLACED_BY_cairo_font_extents +#define cairo_current_operator cairo_current_operator_REPLACED_BY_cairo_get_operator +#define cairo_current_tolerance cairo_current_tolerance_REPLACED_BY_cairo_get_tolerance +#define cairo_current_point cairo_current_point_REPLACED_BY_cairo_get_current_point +#define cairo_current_fill_rule cairo_current_fill_rule_REPLACED_BY_cairo_get_fill_rule +#define cairo_current_line_width cairo_current_line_width_REPLACED_BY_cairo_get_line_width +#define cairo_current_line_cap cairo_current_line_cap_REPLACED_BY_cairo_get_line_cap +#define cairo_current_line_join cairo_current_line_join_REPLACED_BY_cairo_get_line_join +#define cairo_current_miter_limit cairo_current_miter_limit_REPLACED_BY_cairo_get_miter_limit +#define cairo_current_matrix cairo_current_matrix_REPLACED_BY_cairo_get_matrix +#define cairo_current_target_surface cairo_current_target_surface_REPLACED_BY_cairo_get_target +#define cairo_get_status cairo_get_status_REPLACED_BY_cairo_status +#define cairo_concat_matrix cairo_concat_matrix_REPLACED_BY_cairo_transform +#define cairo_scale_font cairo_scale_font_REPLACED_BY_cairo_set_font_size +#define cairo_select_font cairo_select_font_REPLACED_BY_cairo_select_font_face +#define cairo_transform_font cairo_transform_font_REPLACED_BY_cairo_set_font_matrix +#define cairo_transform_point cairo_transform_point_REPLACED_BY_cairo_user_to_device +#define cairo_transform_distance cairo_transform_distance_REPLACED_BY_cairo_user_to_device_distance +#define cairo_inverse_transform_point cairo_inverse_transform_point_REPLACED_BY_cairo_device_to_user +#define cairo_inverse_transform_distance cairo_inverse_transform_distance_REPLACED_BY_cairo_device_to_user_distance +#define cairo_init_clip cairo_init_clip_REPLACED_BY_cairo_reset_clip +#define cairo_surface_create_for_image cairo_surface_create_for_image_REPLACED_BY_cairo_image_surface_create_for_data +#define cairo_default_matrix cairo_default_matrix_REPLACED_BY_cairo_identity_matrix +#define cairo_matrix_set_affine cairo_matrix_set_affine_REPLACED_BY_cairo_matrix_init +#define cairo_matrix_set_identity cairo_matrix_set_identity_REPLACED_BY_cairo_matrix_init_identity +#define cairo_pattern_add_color_stop cairo_pattern_add_color_stop_REPLACED_BY_cairo_pattern_add_color_stop_rgba +#define cairo_set_rgb_color cairo_set_rgb_color_REPLACED_BY_cairo_set_source_rgb +#define cairo_set_pattern cairo_set_pattern_REPLACED_BY_cairo_set_source +#define cairo_xlib_surface_create_for_pixmap_with_visual cairo_xlib_surface_create_for_pixmap_with_visual_REPLACED_BY_cairo_xlib_surface_create +#define cairo_xlib_surface_create_for_window_with_visual cairo_xlib_surface_create_for_window_with_visual_REPLACED_BY_cairo_xlib_surface_create +#define cairo_xcb_surface_create_for_pixmap_with_visual cairo_xcb_surface_create_for_pixmap_with_visual_REPLACED_BY_cairo_xcb_surface_create +#define cairo_xcb_surface_create_for_window_with_visual cairo_xcb_surface_create_for_window_with_visual_REPLACED_BY_cairo_xcb_surface_create +#define cairo_ps_surface_set_dpi cairo_ps_surface_set_dpi_REPLACED_BY_cairo_surface_set_fallback_resolution +#define cairo_pdf_surface_set_dpi cairo_pdf_surface_set_dpi_REPLACED_BY_cairo_surface_set_fallback_resolution +#define cairo_svg_surface_set_dpi cairo_svg_surface_set_dpi_REPLACED_BY_cairo_surface_set_fallback_resolution +#define cairo_atsui_font_face_create_for_atsu_font_id cairo_atsui_font_face_create_for_atsu_font_id_REPLACED_BY_cairo_quartz_font_face_create_for_atsu_font_id + +#define cairo_current_path cairo_current_path_DEPRECATED_BY_cairo_copy_path +#define cairo_current_path_flat cairo_current_path_flat_DEPRECATED_BY_cairo_copy_path_flat +#define cairo_get_path cairo_get_path_DEPRECATED_BY_cairo_copy_path +#define cairo_get_path_flat cairo_get_path_flat_DEPRECATED_BY_cairo_get_path_flat +#define cairo_set_alpha cairo_set_alpha_DEPRECATED_BY_cairo_set_source_rgba_OR_cairo_paint_with_alpha +#define cairo_show_surface cairo_show_surface_DEPRECATED_BY_cairo_set_source_surface_AND_cairo_paint +#define cairo_copy cairo_copy_DEPRECATED_BY_cairo_create_AND_MANY_INDIVIDUAL_FUNCTIONS +#define cairo_surface_set_repeat cairo_surface_set_repeat_DEPRECATED_BY_cairo_pattern_set_extend +#define cairo_surface_set_matrix cairo_surface_set_matrix_DEPRECATED_BY_cairo_pattern_set_matrix +#define cairo_surface_get_matrix cairo_surface_get_matrix_DEPRECATED_BY_cairo_pattern_get_matrix +#define cairo_surface_set_filter cairo_surface_set_filter_DEPRECATED_BY_cairo_pattern_set_filter +#define cairo_surface_get_filter cairo_surface_get_filter_DEPRECATED_BY_cairo_pattern_get_filter +#define cairo_matrix_create cairo_matrix_create_DEPRECATED_BY_cairo_matrix_t +#define cairo_matrix_destroy cairo_matrix_destroy_DEPRECATED_BY_cairo_matrix_t +#define cairo_matrix_copy cairo_matrix_copy_DEPRECATED_BY_cairo_matrix_t +#define cairo_matrix_get_affine cairo_matrix_get_affine_DEPRECATED_BY_cairo_matrix_t +#define cairo_set_target_surface cairo_set_target_surface_DEPRECATED_BY_cairo_create +#define cairo_set_target_image cairo_set_target_image_DEPRECATED_BY_cairo_image_surface_create_for_data +#define cairo_set_target_pdf cairo_set_target_pdf_DEPRECATED_BY_cairo_pdf_surface_create +#define cairo_set_target_png cairo_set_target_png_DEPRECATED_BY_cairo_surface_write_to_png +#define cairo_set_target_ps cairo_set_target_ps_DEPRECATED_BY_cairo_ps_surface_create +#define cairo_set_target_quartz cairo_set_target_quartz_DEPRECATED_BY_cairo_quartz_surface_create +#define cairo_set_target_win32 cairo_set_target_win32_DEPRECATED_BY_cairo_win32_surface_create +#define cairo_set_target_xcb cairo_set_target_xcb_DEPRECATED_BY_cairo_xcb_surface_create +#define cairo_set_target_drawable cairo_set_target_drawable_DEPRECATED_BY_cairo_xlib_surface_create +#define cairo_get_status_string cairo_get_status_string_DEPRECATED_BY_cairo_status_AND_cairo_status_to_string +#define cairo_status_string cairo_status_string_DEPRECATED_BY_cairo_status_AND_cairo_status_to_string + +#endif /* CAIRO_DEPRECATED_H */ diff --git a/src/cairo-device-private.h b/src/cairo-device-private.h new file mode 100644 index 000000000..6eb44f3b6 --- /dev/null +++ b/src/cairo-device-private.h @@ -0,0 +1,86 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributors(s): + * Chris Wilson + */ + +#ifndef _CAIRO_DEVICE_PRIVATE_H_ +#define _CAIRO_DEVICE_PRIVATE_H_ + +#include "cairo-compiler-private.h" +#include "cairo-mutex-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-types-private.h" + +struct _cairo_device { + cairo_reference_count_t ref_count; + cairo_status_t status; + cairo_user_data_array_t user_data; + + const cairo_device_backend_t *backend; + + cairo_recursive_mutex_t mutex; + unsigned mutex_depth; + + cairo_bool_t finished; +}; + +struct _cairo_device_backend { + cairo_device_type_t type; + + void (*lock) (void *device); + void (*unlock) (void *device); + + cairo_warn cairo_status_t (*flush) (void *device); + void (*finish) (void *device); + void (*destroy) (void *device); +}; + +cairo_private cairo_device_t * +_cairo_device_create_in_error (cairo_status_t status); + +cairo_private void +_cairo_device_init (cairo_device_t *device, + const cairo_device_backend_t *backend); + +cairo_private cairo_status_t +_cairo_device_set_error (cairo_device_t *device, + cairo_status_t error); + +slim_hidden_proto_no_warn (cairo_device_reference); +slim_hidden_proto (cairo_device_acquire); +slim_hidden_proto (cairo_device_release); +slim_hidden_proto (cairo_device_flush); +slim_hidden_proto (cairo_device_finish); +slim_hidden_proto (cairo_device_destroy); + +#endif /* _CAIRO_DEVICE_PRIVATE_H_ */ diff --git a/src/cairo-device.c b/src/cairo-device.c new file mode 100644 index 000000000..585a9c1c4 --- /dev/null +++ b/src/cairo-device.c @@ -0,0 +1,541 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributors(s): + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-device-private.h" +#include "cairo-error-private.h" + +/** + * SECTION:cairo-device + * @Title: cairo_device_t + * @Short_Description: interface to underlying rendering system + * @See_Also: #cairo_surface_t + * + * Devices are the abstraction Cairo employs for the rendering system + * used by a #cairo_surface_t. You can get the device of a surface using + * cairo_surface_get_device(). + * + * Devices are created using custom functions specific to the rendering + * system you want to use. See the documentation for the surface types + * for those functions. + * + * An important function that devices fulfill is sharing access to the + * rendering system between Cairo and your application. If you want to + * access a device directly that you used to draw to with Cairo, you must + * first call cairo_device_flush() to ensure that Cairo finishes all + * operations on the device and resets it to a clean state. + * + * Cairo also provides the functions cairo_device_acquire() and + * cairo_device_release() to synchronize access to the rendering system + * in a multithreaded environment. This is done internally, but can also + * be used by applications. + * + * Putting this all together, a function that works with devices should + * look something like this: + * + * void + * my_device_modifying_function (cairo_device_t *device) + * { + * cairo_status_t status; + * + * // Ensure the device is properly reset + * cairo_device_flush (device); + * // Try to acquire the device + * status = cairo_device_acquire (device); + * if (status != CAIRO_STATUS_SUCCESS) { + * printf ("Failed to acquire the device: %s\n", cairo_status_to_string (status)); + * return; + * } + * + * // Do the custom operations on the device here. + * // But do not call any Cairo functions that might acquire devices. + * + * // Release the device when done. + * cairo_device_release (device); + * } + * + * + * Please refer to the documentation of each backend for + * additional usage requirements, guarantees provided, and + * interactions with existing surface API of the device functions for + * surfaces of that type. + * + **/ + +static const cairo_device_t _nil_device = { + CAIRO_REFERENCE_COUNT_INVALID, + CAIRO_STATUS_NO_MEMORY, +}; + +static const cairo_device_t _mismatch_device = { + CAIRO_REFERENCE_COUNT_INVALID, + CAIRO_STATUS_DEVICE_TYPE_MISMATCH, +}; + +static const cairo_device_t _invalid_device = { + CAIRO_REFERENCE_COUNT_INVALID, + CAIRO_STATUS_DEVICE_ERROR, +}; + +cairo_device_t * +_cairo_device_create_in_error (cairo_status_t status) +{ + switch (status) { + case CAIRO_STATUS_NO_MEMORY: + return (cairo_device_t *) &_nil_device; + case CAIRO_STATUS_DEVICE_ERROR: + return (cairo_device_t *) &_invalid_device; + case CAIRO_STATUS_DEVICE_TYPE_MISMATCH: + return (cairo_device_t *) &_mismatch_device; + + case CAIRO_STATUS_SUCCESS: + case CAIRO_STATUS_LAST_STATUS: + ASSERT_NOT_REACHED; + /* fall-through */ + case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: + case CAIRO_STATUS_INVALID_STATUS: + case CAIRO_STATUS_INVALID_FORMAT: + case CAIRO_STATUS_INVALID_VISUAL: + case CAIRO_STATUS_READ_ERROR: + case CAIRO_STATUS_WRITE_ERROR: + case CAIRO_STATUS_FILE_NOT_FOUND: + case CAIRO_STATUS_TEMP_FILE_ERROR: + case CAIRO_STATUS_INVALID_STRIDE: + case CAIRO_STATUS_INVALID_SIZE: + case CAIRO_STATUS_INVALID_RESTORE: + case CAIRO_STATUS_INVALID_POP_GROUP: + case CAIRO_STATUS_NO_CURRENT_POINT: + case CAIRO_STATUS_INVALID_MATRIX: + case CAIRO_STATUS_NULL_POINTER: + case CAIRO_STATUS_INVALID_STRING: + case CAIRO_STATUS_INVALID_PATH_DATA: + case CAIRO_STATUS_SURFACE_FINISHED: + case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: + case CAIRO_STATUS_INVALID_DASH: + case CAIRO_STATUS_INVALID_DSC_COMMENT: + case CAIRO_STATUS_INVALID_INDEX: + case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: + case CAIRO_STATUS_FONT_TYPE_MISMATCH: + case CAIRO_STATUS_USER_FONT_IMMUTABLE: + case CAIRO_STATUS_USER_FONT_ERROR: + case CAIRO_STATUS_NEGATIVE_COUNT: + case CAIRO_STATUS_INVALID_CLUSTERS: + case CAIRO_STATUS_INVALID_SLANT: + case CAIRO_STATUS_INVALID_WEIGHT: + case CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: + case CAIRO_STATUS_INVALID_CONTENT: + case CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: + case CAIRO_STATUS_DEVICE_FINISHED: + case CAIRO_STATUS_JBIG2_GLOBAL_MISSING: + default: + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_device_t *) &_nil_device; + } +} + +void +_cairo_device_init (cairo_device_t *device, + const cairo_device_backend_t *backend) +{ + CAIRO_REFERENCE_COUNT_INIT (&device->ref_count, 1); + device->status = CAIRO_STATUS_SUCCESS; + + device->backend = backend; + + CAIRO_RECURSIVE_MUTEX_INIT (device->mutex); + device->mutex_depth = 0; + + device->finished = FALSE; + + _cairo_user_data_array_init (&device->user_data); +} + +/** + * cairo_device_reference: + * @device: a #cairo_device_t + * + * Increases the reference count on @device by one. This prevents + * @device from being destroyed until a matching call to + * cairo_device_destroy() is made. + * + * The number of references to a #cairo_device_t can be get using + * cairo_device_get_reference_count(). + * + * Return value: the referenced #cairo_device_t. + * + * Since: 1.10 + **/ +cairo_device_t * +cairo_device_reference (cairo_device_t *device) +{ + if (device == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&device->ref_count)) + { + return device; + } + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&device->ref_count)); + _cairo_reference_count_inc (&device->ref_count); + + return device; +} +slim_hidden_def (cairo_device_reference); + +/** + * cairo_device_status: + * @device: a #cairo_device_t + * + * Checks whether an error has previously occurred for this + * device. + * + * Return value: %CAIRO_STATUS_SUCCESS on success or an error code if + * the device is in an error state. + * + * Since: 1.10 + **/ +cairo_status_t +cairo_device_status (cairo_device_t *device) +{ + if (device == NULL) + return CAIRO_STATUS_NULL_POINTER; + + return device->status; +} + +/** + * cairo_device_flush: + * @device: a #cairo_device_t + * + * Finish any pending operations for the device and also restore any + * temporary modifications cairo has made to the device's state. + * This function must be called before switching from using the + * device with Cairo to operating on it directly with native APIs. + * If the device doesn't support direct access, then this function + * does nothing. + * + * This function may acquire devices. + * + * Since: 1.10 + **/ +void +cairo_device_flush (cairo_device_t *device) +{ + cairo_status_t status; + + if (device == NULL || device->status) + return; + + if (device->finished) + return; + + if (device->backend->flush != NULL) { + status = device->backend->flush (device); + if (unlikely (status)) + status = _cairo_device_set_error (device, status); + } +} +slim_hidden_def (cairo_device_flush); + +/** + * cairo_device_finish: + * @device: the #cairo_device_t to finish + * + * This function finishes the device and drops all references to + * external resources. All surfaces, fonts and other objects created + * for this @device will be finished, too. + * Further operations on the @device will not affect the @device but + * will instead trigger a %CAIRO_STATUS_DEVICE_FINISHED error. + * + * When the last call to cairo_device_destroy() decreases the + * reference count to zero, cairo will call cairo_device_finish() if + * it hasn't been called already, before freeing the resources + * associated with the device. + * + * This function may acquire devices. + * + * Since: 1.10 + **/ +void +cairo_device_finish (cairo_device_t *device) +{ + if (device == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&device->ref_count)) + { + return; + } + + if (device->finished) + return; + + cairo_device_flush (device); + + if (device->backend->finish != NULL) + device->backend->finish (device); + + /* We only finish the device after the backend's callback returns because + * the device might still be needed during the callback + * (e.g. for cairo_device_acquire ()). + */ + device->finished = TRUE; +} +slim_hidden_def (cairo_device_finish); + +/** + * cairo_device_destroy: + * @device: a #cairo_device_t + * + * Decreases the reference count on @device by one. If the result is + * zero, then @device and all associated resources are freed. See + * cairo_device_reference(). + * + * This function may acquire devices if the last reference was dropped. + * + * Since: 1.10 + **/ +void +cairo_device_destroy (cairo_device_t *device) +{ + cairo_user_data_array_t user_data; + + if (device == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&device->ref_count)) + { + return; + } + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&device->ref_count)); + if (! _cairo_reference_count_dec_and_test (&device->ref_count)) + return; + + cairo_device_finish (device); + + assert (device->mutex_depth == 0); + CAIRO_MUTEX_FINI (device->mutex); + + user_data = device->user_data; + + device->backend->destroy (device); + + _cairo_user_data_array_fini (&user_data); + +} +slim_hidden_def (cairo_device_destroy); + +/** + * cairo_device_get_type: + * @device: a #cairo_device_t + * + * This function returns the type of the device. See #cairo_device_type_t + * for available types. + * + * Return value: The type of @device. + * + * Since: 1.10 + **/ +cairo_device_type_t +cairo_device_get_type (cairo_device_t *device) +{ + if (device == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&device->ref_count)) + { + return CAIRO_DEVICE_TYPE_INVALID; + } + + return device->backend->type; +} + +/** + * cairo_device_acquire: + * @device: a #cairo_device_t + * + * Acquires the @device for the current thread. This function will block + * until no other thread has acquired the device. + * + * If the return value is %CAIRO_STATUS_SUCCESS, you successfully acquired the + * device. From now on your thread owns the device and no other thread will be + * able to acquire it until a matching call to cairo_device_release(). It is + * allowed to recursively acquire the device multiple times from the same + * thread. + * + * You must never acquire two different devices at the same time + * unless this is explicitly allowed. Otherwise the possibility of deadlocks + * exist. + * + * As various Cairo functions can acquire devices when called, these functions + * may also cause deadlocks when you call them with an acquired device. So you + * must not have a device acquired when calling them. These functions are + * marked in the documentation. + * + * + * Return value: %CAIRO_STATUS_SUCCESS on success or an error code if + * the device is in an error state and could not be + * acquired. After a successful call to cairo_device_acquire(), + * a matching call to cairo_device_release() is required. + * + * Since: 1.10 + **/ +cairo_status_t +cairo_device_acquire (cairo_device_t *device) +{ + if (device == NULL) + return CAIRO_STATUS_SUCCESS; + + if (unlikely (device->status)) + return device->status; + + if (unlikely (device->finished)) + return _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_FINISHED); + + CAIRO_MUTEX_LOCK (device->mutex); + if (device->mutex_depth++ == 0) { + if (device->backend->lock != NULL) + device->backend->lock (device); + } + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_device_acquire); + +/** + * cairo_device_release: + * @device: a #cairo_device_t + * + * Releases a @device previously acquired using cairo_device_acquire(). See + * that function for details. + * + * Since: 1.10 + **/ +void +cairo_device_release (cairo_device_t *device) +{ + if (device == NULL) + return; + + assert (device->mutex_depth > 0); + + if (--device->mutex_depth == 0) { + if (device->backend->unlock != NULL) + device->backend->unlock (device); + } + + CAIRO_MUTEX_UNLOCK (device->mutex); +} +slim_hidden_def (cairo_device_release); + +cairo_status_t +_cairo_device_set_error (cairo_device_t *device, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS) + return CAIRO_STATUS_SUCCESS; + + _cairo_status_set_error (&device->status, status); + + return _cairo_error (status); +} + +/** + * cairo_device_get_reference_count: + * @device: a #cairo_device_t + * + * Returns the current reference count of @device. + * + * Return value: the current reference count of @device. If the + * object is a nil object, 0 will be returned. + * + * Since: 1.10 + **/ +unsigned int +cairo_device_get_reference_count (cairo_device_t *device) +{ + if (device == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&device->ref_count)) + return 0; + + return CAIRO_REFERENCE_COUNT_GET_VALUE (&device->ref_count); +} + +/** + * cairo_device_get_user_data: + * @device: a #cairo_device_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Return user data previously attached to @device using the + * specified key. If no user data has been attached with the given + * key this function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + * + * Since: 1.10 + **/ +void * +cairo_device_get_user_data (cairo_device_t *device, + const cairo_user_data_key_t *key) +{ + return _cairo_user_data_array_get_data (&device->user_data, + key); +} + +/** + * cairo_device_set_user_data: + * @device: a #cairo_device_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach to the #cairo_device_t + * @destroy: a #cairo_destroy_func_t which will be called when the + * #cairo_t is destroyed or when new user data is attached using the + * same key. + * + * Attach user data to @device. To remove user data from a surface, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.10 + **/ +cairo_status_t +cairo_device_set_user_data (cairo_device_t *device, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&device->ref_count)) + return device->status; + + return _cairo_user_data_array_set_data (&device->user_data, + key, user_data, destroy); +} diff --git a/src/cairo-directfb-surface.c b/src/cairo-directfb-surface.c new file mode 100644 index 000000000..5ac64ba98 --- /dev/null +++ b/src/cairo-directfb-surface.c @@ -0,0 +1,544 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-directfb.h" + +#include "cairo-clip-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-fallback-private.h" + +#include + +#include +#include +#include +#include +#include + +slim_hidden_proto(cairo_directfb_surface_create); + +typedef struct _cairo_dfb_surface { + cairo_image_surface_t image; + + IDirectFB *dfb; + IDirectFBSurface *dfb_surface; + + unsigned blit_premultiplied : 1; +} cairo_dfb_surface_t; + +static cairo_content_t +_directfb_format_to_content (DFBSurfacePixelFormat format) +{ + cairo_content_t content = 0; + + if (DFB_PIXELFORMAT_HAS_ALPHA (format)) + content |= CAIRO_CONTENT_ALPHA; + if (DFB_COLOR_BITS_PER_PIXEL (format)) + content |= CAIRO_CONTENT_COLOR_ALPHA; + + assert(content); + return content; +} + +static inline pixman_format_code_t +_directfb_to_pixman_format (DFBSurfacePixelFormat format) +{ + switch (format) { + case DSPF_UNKNOWN: return 0; + case DSPF_ARGB1555: return PIXMAN_a1r5g5b5; + case DSPF_RGB16: return PIXMAN_r5g6b5; + case DSPF_RGB24: return PIXMAN_r8g8b8; + case DSPF_RGB32: return PIXMAN_x8r8g8b8; + case DSPF_ARGB: return PIXMAN_a8r8g8b8; + case DSPF_A8: return PIXMAN_a8; + case DSPF_YUY2: return PIXMAN_yuy2; + case DSPF_RGB332: return PIXMAN_r3g3b2; + case DSPF_UYVY: return 0; + case DSPF_I420: return 0; + case DSPF_YV12: return PIXMAN_yv12; + case DSPF_LUT8: return 0; + case DSPF_ALUT44: return 0; + case DSPF_AiRGB: return 0; + case DSPF_A1: return 0; /* bit reversed, oops */ + case DSPF_NV12: return 0; + case DSPF_NV16: return 0; + case DSPF_ARGB2554: return 0; + case DSPF_ARGB4444: return PIXMAN_a4r4g4b4; + case DSPF_NV21: return 0; + case DSPF_AYUV: return 0; + case DSPF_A4: return PIXMAN_a4; + case DSPF_ARGB1666: return 0; + case DSPF_ARGB6666: return 0; + case DSPF_RGB18: return 0; + case DSPF_LUT2: return 0; + case DSPF_RGB444: return PIXMAN_x4r4g4b4; + case DSPF_RGB555: return PIXMAN_x1r5g5b5; +#if DFB_NUM_PIXELFORMATS >= 29 + case DSPF_BGR555: return PIXMAN_x1b5g5r5; +#endif + } + return 0; +} + +static cairo_surface_t * +_cairo_dfb_surface_create_similar (void *abstract_src, + cairo_content_t content, + int width, + int height) +{ + cairo_dfb_surface_t *other = abstract_src; + DFBSurfacePixelFormat format; + IDirectFBSurface *buffer; + DFBSurfaceDescription dsc; + cairo_surface_t *surface; + + if (width <= 0 || height <= 0) + return _cairo_image_surface_create_with_content (content, width, height); + + switch (content) { + default: + ASSERT_NOT_REACHED; + case CAIRO_CONTENT_COLOR_ALPHA: + format = DSPF_ARGB; + break; + case CAIRO_CONTENT_COLOR: + format = DSPF_RGB32; + break; + case CAIRO_CONTENT_ALPHA: + format = DSPF_A8; + break; + } + + dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; + dsc.caps = DSCAPS_PREMULTIPLIED; + dsc.width = width; + dsc.height = height; + dsc.pixelformat = format; + + if (other->dfb->CreateSurface (other->dfb, &dsc, &buffer)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_DEVICE_ERROR)); + + surface = cairo_directfb_surface_create (other->dfb, buffer); + buffer->Release (buffer); + + return surface; +} + +static cairo_status_t +_cairo_dfb_surface_finish (void *abstract_surface) +{ + cairo_dfb_surface_t *surface = abstract_surface; + + surface->dfb_surface->Release (surface->dfb_surface); + return _cairo_image_surface_finish (abstract_surface); +} + +static cairo_image_surface_t * +_cairo_dfb_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_dfb_surface_t *surface = abstract_surface; + + if (surface->image.pixman_image == NULL) { + IDirectFBSurface *buffer = surface->dfb_surface; + pixman_image_t *image; + void *data; + int pitch; + + if (buffer->Lock (buffer, DSLF_READ | DSLF_WRITE, &data, &pitch)) + return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + image = pixman_image_create_bits (surface->image.pixman_format, + surface->image.width, + surface->image.height, + data, pitch); + if (image == NULL) { + buffer->Unlock (buffer); + return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + _cairo_image_surface_init (&surface->image, image, surface->image.pixman_format); + } + + return _cairo_image_surface_map_to_image (&surface->image.base, extents); +} + +static cairo_int_status_t +_cairo_dfb_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_dfb_surface_t *surface = abstract_surface; + return _cairo_image_surface_unmap_image (&surface->image.base, image); +} + +static cairo_status_t +_cairo_dfb_surface_flush (void *abstract_surface, + unsigned flags) +{ + cairo_dfb_surface_t *surface = abstract_surface; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (surface->image.pixman_image) { + surface->dfb_surface->Unlock (surface->dfb_surface); + + pixman_image_unref (surface->image.pixman_image); + surface->image.pixman_image = NULL; + surface->image.data = NULL; + } + + return CAIRO_STATUS_SUCCESS; +} + +#if 0 +static inline DFBSurfacePixelFormat +_directfb_from_pixman_format (pixman_format_code_t format) +{ + switch ((int) format) { + case PIXMAN_a1r5g5b5: return DSPF_ARGB1555; + case PIXMAN_r5g6b5: return DSPF_RGB16; + case PIXMAN_r8g8b8: return DSPF_RGB24; + case PIXMAN_x8r8g8b8: return DSPF_RGB32; + case PIXMAN_a8r8g8b8: return DSPF_ARGB; + case PIXMAN_a8: return DSPF_A8; + case PIXMAN_yuy2: return DSPF_YUY2; + case PIXMAN_r3g3b2: return DSPF_RGB332; + case PIXMAN_yv12: return DSPF_YV12; + case PIXMAN_a1: return DSPF_A1; /* bit reversed, oops */ + case PIXMAN_a4r4g4b4: return DSPF_ARGB4444; + case PIXMAN_a4: return DSPF_A4; + case PIXMAN_x4r4g4b4: return DSPF_RGB444; + case PIXMAN_x1r5g5b5: return DSPF_RGB555; +#if DFB_NUM_PIXELFORMATS >= 29 + case PIXMAN_x1b5g5r5: return DSPF_BGR555; +#endif + default: return 0; + } +} + +static cairo_bool_t +_directfb_get_operator (cairo_operator_t operator, + DFBSurfaceBlendFunction *ret_srcblend, + DFBSurfaceBlendFunction *ret_dstblend) +{ + DFBSurfaceBlendFunction srcblend = DSBF_ONE; + DFBSurfaceBlendFunction dstblend = DSBF_ZERO; + + switch (operator) { + case CAIRO_OPERATOR_CLEAR: + srcblend = DSBF_ZERO; + dstblend = DSBF_ZERO; + break; + case CAIRO_OPERATOR_SOURCE: + srcblend = DSBF_ONE; + dstblend = DSBF_ZERO; + break; + case CAIRO_OPERATOR_OVER: + srcblend = DSBF_ONE; + dstblend = DSBF_INVSRCALPHA; + break; + case CAIRO_OPERATOR_IN: + srcblend = DSBF_DESTALPHA; + dstblend = DSBF_ZERO; + break; + case CAIRO_OPERATOR_OUT: + srcblend = DSBF_INVDESTALPHA; + dstblend = DSBF_ZERO; + break; + case CAIRO_OPERATOR_ATOP: + srcblend = DSBF_DESTALPHA; + dstblend = DSBF_INVSRCALPHA; + break; + case CAIRO_OPERATOR_DEST: + srcblend = DSBF_ZERO; + dstblend = DSBF_ONE; + break; + case CAIRO_OPERATOR_DEST_OVER: + srcblend = DSBF_INVDESTALPHA; + dstblend = DSBF_ONE; + break; + case CAIRO_OPERATOR_DEST_IN: + srcblend = DSBF_ZERO; + dstblend = DSBF_SRCALPHA; + break; + case CAIRO_OPERATOR_DEST_OUT: + srcblend = DSBF_ZERO; + dstblend = DSBF_INVSRCALPHA; + break; + case CAIRO_OPERATOR_DEST_ATOP: + srcblend = DSBF_INVDESTALPHA; + dstblend = DSBF_SRCALPHA; + break; + case CAIRO_OPERATOR_XOR: + srcblend = DSBF_INVDESTALPHA; + dstblend = DSBF_INVSRCALPHA; + break; + case CAIRO_OPERATOR_ADD: + srcblend = DSBF_ONE; + dstblend = DSBF_ONE; + break; + case CAIRO_OPERATOR_SATURATE: + /* XXX This does not work. */ +#if 0 + srcblend = DSBF_SRCALPHASAT; + dstblend = DSBF_ONE; + break; +#endif + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + default: + return FALSE; + } + + *ret_srcblend = srcblend; + *ret_dstblend = dstblend; + + return TRUE; +} +#define RUN_CLIPPED(surface, clip_region, clip, func) {\ + if ((clip_region) != NULL) {\ + int n_clips = cairo_region_num_rectangles (clip_region), n; \ + for (n = 0; n < n_clips; n++) {\ + if (clip) {\ + DFBRegion reg, *cli = (clip); \ + cairo_rectangle_int_t rect; \ + cairo_region_get_rectangle (clip_region, n, &rect); \ + reg.x1 = rect.x; \ + reg.y1 = rect.y; \ + reg.x2 = rect.x + rect.width - 1; \ + reg.y2 = rect.y + rect.height - 1; \ + if (reg.x2 < cli->x1 || reg.y2 < cli->y1 ||\ + reg.x1 > cli->x2 || reg.y1 > cli->y2)\ + continue;\ + if (reg.x1 < cli->x1)\ + reg.x1 = cli->x1;\ + if (reg.y1 < cli->y1)\ + reg.y1 = cli->y1;\ + if (reg.x2 > cli->x2)\ + reg.x2 = cli->x2;\ + if (reg.y2 > cli->y2)\ + reg.y2 = cli->y2;\ + (surface)->dfbsurface->SetClip ((surface)->dfbsurface, ®);\ + } else {\ + DFBRegion reg; \ + cairo_rectangle_int_t rect; \ + cairo_region_get_rectangle (clip_region, n, &rect); \ + reg.x1 = rect.x; \ + reg.y1 = rect.y; \ + reg.x2 = rect.x + rect.width - 1; \ + reg.y2 = rect.y + rect.height - 1; \ + (surface)->dfbsurface->SetClip ((surface)->dfbsurface, ®); \ + }\ + func;\ + }\ + } else {\ + (surface)->dfbsurface->SetClip ((surface)->dfbsurface, clip);\ + func;\ + }\ +} + +static cairo_int_status_t +_cairo_dfb_surface_fill_rectangles (void *abstract_surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_rectangle_int_t *rects, + int n_rects) +{ + cairo_dfb_surface_t *dst = abstract_surface; + DFBSurfaceDrawingFlags flags; + DFBSurfaceBlendFunction sblend; + DFBSurfaceBlendFunction dblend; + DFBRectangle r[n_rects]; + int i; + + D_DEBUG_AT (CairoDFB_Render, + "%s( dst=%p, op=%d, color=%p, rects=%p, n_rects=%d ).\n", + __FUNCTION__, dst, op, color, rects, n_rects); + + if (! dst->supported_destination) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _directfb_get_operator (op, &sblend, &dblend)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (CAIRO_COLOR_IS_OPAQUE (color)) { + if (sblend == DSBF_SRCALPHA) + sblend = DSBF_ONE; + else if (sblend == DSBF_INVSRCALPHA) + sblend = DSBF_ZERO; + + if (dblend == DSBF_SRCALPHA) + dblend = DSBF_ONE; + else if (dblend == DSBF_INVSRCALPHA) + dblend = DSBF_ZERO; + } + if ((dst->base.content & CAIRO_CONTENT_ALPHA) == 0) { + if (sblend == DSBF_DESTALPHA) + sblend = DSBF_ONE; + else if (sblend == DSBF_INVDESTALPHA) + sblend = DSBF_ZERO; + + if (dblend == DSBF_DESTALPHA) + dblend = DSBF_ONE; + else if (dblend == DSBF_INVDESTALPHA) + dblend = DSBF_ZERO; + } + + flags = (sblend == DSBF_ONE && dblend == DSBF_ZERO) ? DSDRAW_NOFX : DSDRAW_BLEND; + dst->dfbsurface->SetDrawingFlags (dst->dfbsurface, flags); + if (flags & DSDRAW_BLEND) { + dst->dfbsurface->SetSrcBlendFunction (dst->dfbsurface, sblend); + dst->dfbsurface->SetDstBlendFunction (dst->dfbsurface, dblend); + } + + dst->dfbsurface->SetColor (dst->dfbsurface, + color->red_short >> 8, + color->green_short >> 8, + color->blue_short >> 8, + color->alpha_short >> 8); + + for (i = 0; i < n_rects; i++) { + r[i].x = rects[i].x; + r[i].y = rects[i].y; + r[i].w = rects[i].width; + r[i].h = rects[i].height; + } + + RUN_CLIPPED (dst, NULL, NULL, + dst->dfbsurface->FillRectangles (dst->dfbsurface, r, n_rects)); + + return CAIRO_STATUS_SUCCESS; +} +#endif + +static cairo_surface_backend_t +_cairo_dfb_surface_backend = { + CAIRO_SURFACE_TYPE_DIRECTFB, /*type*/ + _cairo_dfb_surface_finish, /*finish*/ + _cairo_default_context_create, + + _cairo_dfb_surface_create_similar,/*create_similar*/ + NULL, /* create similar image */ + _cairo_dfb_surface_map_to_image, + _cairo_dfb_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_surface_default_acquire_source_image, + _cairo_surface_default_release_source_image, + NULL, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_image_surface_get_extents, + _cairo_image_surface_get_font_options, + + _cairo_dfb_surface_flush, + NULL, /* mark_dirty_rectangle */ + + _cairo_surface_fallback_paint, + _cairo_surface_fallback_mask, + _cairo_surface_fallback_stroke, + _cairo_surface_fallback_fill, + NULL, /* fill-stroke */ + _cairo_surface_fallback_glyphs, +}; + +cairo_surface_t * +cairo_directfb_surface_create (IDirectFB *dfb, IDirectFBSurface *dfbsurface) +{ + cairo_dfb_surface_t *surface; + DFBSurfacePixelFormat format; + DFBSurfaceCapabilities caps; + pixman_format_code_t pixman_format; + int width, height; + + D_ASSERT (dfb != NULL); + D_ASSERT (dfbsurface != NULL); + + dfbsurface->GetPixelFormat (dfbsurface, &format); + dfbsurface->GetSize (dfbsurface, &width, &height); + + pixman_format = _directfb_to_pixman_format (format); + if (! pixman_format_supported_destination (pixman_format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + surface = calloc (1, sizeof (cairo_dfb_surface_t)); + if (surface == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + /* XXX dfb -> device */ + _cairo_surface_init (&surface->image.base, + &_cairo_dfb_surface_backend, + NULL, /* device */ + _directfb_format_to_content (format)); + + surface->image.pixman_format = pixman_format; + surface->image.format = _cairo_format_from_pixman_format (pixman_format); + + surface->image.width = width; + surface->image.height = height; + surface->image.depth = PIXMAN_FORMAT_DEPTH(pixman_format); + + surface->dfb = dfb; + surface->dfb_surface = dfbsurface; + dfbsurface->AddRef (dfbsurface); + + dfbsurface->GetCapabilities (dfbsurface, &caps); + if (caps & DSCAPS_PREMULTIPLIED) + surface->blit_premultiplied = TRUE; + + return &surface->image.base; +} +slim_hidden_def(cairo_directfb_surface_create); diff --git a/src/cairo-directfb.h b/src/cairo-directfb.h new file mode 100644 index 000000000..e3d818c66 --- /dev/null +++ b/src/cairo-directfb.h @@ -0,0 +1,67 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +/* + * Environment variables affecting the backend: + * + * %CAIRO_DIRECTFB_NO_ACCEL (boolean) + * if found, disables acceleration at all + * + * %CAIRO_DIRECTFB_ARGB_FONT (boolean) + * if found, enables using ARGB fonts instead of A8 + */ + +#ifndef CAIRO_DIRECTFB_H +#define CAIRO_DIRECTFB_H + +#include "cairo.h" + +#if CAIRO_HAS_DIRECTFB_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_directfb_surface_create (IDirectFB *dfb, IDirectFBSurface *surface); + +CAIRO_END_DECLS + +#else /*CAIRO_HAS_DIRECTFB_SURFACE*/ +# error Cairo was not compiled with support for the directfb backend +#endif /*CAIRO_HAS_DIRECTFB_SURFACE*/ + +#endif /*CAIRO_DIRECTFB_H*/ diff --git a/src/cairo-drm.h b/src/cairo-drm.h new file mode 100644 index 000000000..907610dcd --- /dev/null +++ b/src/cairo-drm.h @@ -0,0 +1,120 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#ifndef CAIRO_DRM_H +#define CAIRO_DRM_H + +#include "cairo.h" + +#if CAIRO_HAS_DRM_SURFACE + +CAIRO_BEGIN_DECLS + +struct udev_device; + +cairo_public cairo_device_t * +cairo_drm_device_get (struct udev_device *device); + +cairo_public cairo_device_t * +cairo_drm_device_get_for_fd (int fd); + +cairo_public cairo_device_t * +cairo_drm_device_default (void); + +cairo_public int +cairo_drm_device_get_fd (cairo_device_t *device); + +cairo_public void +cairo_drm_device_throttle (cairo_device_t *device); + +cairo_public cairo_surface_t * +cairo_drm_surface_create (cairo_device_t *device, + cairo_format_t format, + int width, int height); + +cairo_public cairo_surface_t * +cairo_drm_surface_create_for_name (cairo_device_t *device, + unsigned int name, + cairo_format_t format, + int width, int height, int stride); + +cairo_public cairo_surface_t * +cairo_drm_surface_create_from_cacheable_image (cairo_device_t *device, + cairo_surface_t *surface); + +cairo_public cairo_status_t +cairo_drm_surface_enable_scan_out (cairo_surface_t *surface); + +cairo_public unsigned int +cairo_drm_surface_get_handle (cairo_surface_t *surface); + +cairo_public unsigned int +cairo_drm_surface_get_name (cairo_surface_t *surface); + +cairo_public cairo_format_t +cairo_drm_surface_get_format (cairo_surface_t *surface); + +cairo_public int +cairo_drm_surface_get_width (cairo_surface_t *surface); + +cairo_public int +cairo_drm_surface_get_height (cairo_surface_t *surface); + +cairo_public int +cairo_drm_surface_get_stride (cairo_surface_t *surface); + +/* XXX map/unmap, general surface layer? */ + +/* Rough outline, culled from a conversation on IRC: + * map() returns an image-surface representation of the drm-surface, + * which you unmap() when you are finished, i.e. map() pulls the buffer back + * from the GPU, maps it into the CPU domain and gives you direct access to + * the pixels. With the unmap(), the buffer is ready to be used again by the + * GPU and *until* the unmap(), all operations will be done in software. + * + * (Technically calling cairo_surface_flush() on the underlying drm-surface + * will also disassociate the mapping.) +*/ +cairo_public cairo_surface_t * +cairo_drm_surface_map_to_image (cairo_surface_t *surface); + +cairo_public void +cairo_drm_surface_unmap (cairo_surface_t *drm_surface, + cairo_surface_t *image_surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_DRM_SURFACE */ +# error Cairo was not compiled with support for the DRM backend +#endif /* CAIRO_HAS_DRM_SURFACE */ + +#endif /* CAIRO_DRM_H */ diff --git a/src/cairo-egl-context.c b/src/cairo-egl-context.c new file mode 100644 index 000000000..bf704c630 --- /dev/null +++ b/src/cairo-egl-context.c @@ -0,0 +1,317 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-error-private.h" + +typedef struct _cairo_egl_context { + cairo_gl_context_t base; + + EGLDisplay display; + EGLContext context; + + EGLSurface dummy_surface; + + EGLContext previous_context; + EGLSurface previous_surface; +} cairo_egl_context_t; + +typedef struct _cairo_egl_surface { + cairo_gl_surface_t base; + + EGLSurface egl; +} cairo_egl_surface_t; + + +static cairo_bool_t +_context_acquisition_changed_egl_state (cairo_egl_context_t *ctx, + EGLSurface current_surface) +{ + return ctx->previous_context != ctx->context || + ctx->previous_surface != current_surface; +} + +static EGLSurface +_egl_get_current_surface (cairo_egl_context_t *ctx) +{ + if (ctx->base.current_target == NULL || + _cairo_gl_surface_is_texture (ctx->base.current_target)) { + return ctx->dummy_surface; + } + + return ((cairo_egl_surface_t *) ctx->base.current_target)->egl; +} + +static void +_egl_query_current_state (cairo_egl_context_t *ctx) +{ + ctx->previous_surface = eglGetCurrentSurface (EGL_DRAW); + ctx->previous_context = eglGetCurrentContext (); + + /* If any of the values were none, assume they are all none. Not all + drivers seem well behaved when it comes to using these values across + multiple threads. */ + if (ctx->previous_surface == EGL_NO_SURFACE || + ctx->previous_context == EGL_NO_CONTEXT) { + ctx->previous_surface = EGL_NO_SURFACE; + ctx->previous_context = EGL_NO_CONTEXT; + } +} + +static void +_egl_acquire (void *abstract_ctx) +{ + cairo_egl_context_t *ctx = abstract_ctx; + EGLSurface current_surface = _egl_get_current_surface (ctx); + + _egl_query_current_state (ctx); + if (!_context_acquisition_changed_egl_state (ctx, current_surface)) + return; + + eglMakeCurrent (ctx->display, + current_surface, current_surface, ctx->context); +} + +static void +_egl_release (void *abstract_ctx) +{ + cairo_egl_context_t *ctx = abstract_ctx; + if (!ctx->base.thread_aware || + !_context_acquisition_changed_egl_state (ctx, + _egl_get_current_surface (ctx))) { + return; + } + + eglMakeCurrent (ctx->display, + EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); +} + +static void +_egl_make_current (void *abstract_ctx, + cairo_gl_surface_t *abstract_surface) +{ + cairo_egl_context_t *ctx = abstract_ctx; + cairo_egl_surface_t *surface = (cairo_egl_surface_t *) abstract_surface; + + eglMakeCurrent(ctx->display, surface->egl, surface->egl, ctx->context); +} + +static void +_egl_swap_buffers (void *abstract_ctx, + cairo_gl_surface_t *abstract_surface) +{ + cairo_egl_context_t *ctx = abstract_ctx; + cairo_egl_surface_t *surface = (cairo_egl_surface_t *) abstract_surface; + + eglSwapBuffers (ctx->display, surface->egl); +} + +static void +_egl_destroy (void *abstract_ctx) +{ + cairo_egl_context_t *ctx = abstract_ctx; + + eglMakeCurrent (ctx->display, + EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (ctx->dummy_surface != EGL_NO_SURFACE) + eglDestroySurface (ctx->display, ctx->dummy_surface); +} + +static cairo_bool_t +_egl_make_current_surfaceless(cairo_egl_context_t *ctx) +{ + const char *extensions; + + extensions = eglQueryString(ctx->display, EGL_EXTENSIONS); + if (strstr(extensions, "EGL_KHR_surfaceless_context") == NULL && + strstr(extensions, "EGL_KHR_surfaceless_opengl") == NULL) + return FALSE; + + if (!eglMakeCurrent(ctx->display, + EGL_NO_SURFACE, EGL_NO_SURFACE, ctx->context)) + return FALSE; + + return TRUE; +} + +cairo_device_t * +cairo_egl_device_create (EGLDisplay dpy, EGLContext egl) +{ + cairo_egl_context_t *ctx; + cairo_status_t status; + int attribs[] = { + EGL_WIDTH, 1, + EGL_HEIGHT, 1, + EGL_NONE, + }; + EGLConfig config; + EGLint numConfigs; + + ctx = calloc (1, sizeof (cairo_egl_context_t)); + if (unlikely (ctx == NULL)) + return _cairo_gl_context_create_in_error (CAIRO_STATUS_NO_MEMORY); + + ctx->display = dpy; + ctx->context = egl; + + ctx->base.acquire = _egl_acquire; + ctx->base.release = _egl_release; + ctx->base.make_current = _egl_make_current; + ctx->base.swap_buffers = _egl_swap_buffers; + ctx->base.destroy = _egl_destroy; + + /* We are about the change the current state of EGL, so we should + * query the pre-existing surface now instead of later. */ + _egl_query_current_state (ctx); + + if (!_egl_make_current_surfaceless (ctx)) { + /* Fall back to dummy surface, meh. */ + EGLint config_attribs[] = { + EGL_CONFIG_ID, 0, + EGL_NONE + }; + + /* + * In order to be able to make an egl context current when using a + * pbuffer surface, that surface must have been created with a config + * that is compatible with the context config. For Mesa, this means + * that the configs must be the same. + */ + eglQueryContext (dpy, egl, EGL_CONFIG_ID, &config_attribs[1]); + eglChooseConfig (dpy, config_attribs, &config, 1, &numConfigs); + + ctx->dummy_surface = eglCreatePbufferSurface (dpy, config, attribs); + if (ctx->dummy_surface == NULL) { + free (ctx); + return _cairo_gl_context_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + if (!eglMakeCurrent (dpy, ctx->dummy_surface, ctx->dummy_surface, egl)) { + free (ctx); + return _cairo_gl_context_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + } + + status = _cairo_gl_dispatch_init (&ctx->base.dispatch, eglGetProcAddress); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + status = _cairo_gl_context_init (&ctx->base); + if (unlikely (status)) { + if (ctx->dummy_surface != EGL_NO_SURFACE) + eglDestroySurface (dpy, ctx->dummy_surface); + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + /* Tune the default VBO size to reduce overhead on embedded devices. + * This smaller size means that flushing needs to be done more often, + * but it is less demanding of scarce memory on embedded devices. + */ + ctx->base.vbo_size = 16*1024; + + eglMakeCurrent (dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + return &ctx->base.base; +} + +cairo_surface_t * +cairo_gl_surface_create_for_egl (cairo_device_t *device, + EGLSurface egl, + int width, + int height) +{ + cairo_egl_surface_t *surface; + + if (unlikely (device->status)) + return _cairo_surface_create_in_error (device->status); + + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + + if (width <= 0 || height <= 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + surface = calloc (1, sizeof (cairo_egl_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_gl_surface_init (device, &surface->base, + CAIRO_CONTENT_COLOR_ALPHA, width, height); + surface->egl = egl; + + return &surface->base.base; +} + +static cairo_bool_t is_egl_device (cairo_device_t *device) +{ + return (device->backend != NULL && + device->backend->type == CAIRO_DEVICE_TYPE_GL); +} + +static cairo_egl_context_t *to_egl_context (cairo_device_t *device) +{ + return (cairo_egl_context_t *) device; +} + +EGLDisplay +cairo_egl_device_get_display (cairo_device_t *device) +{ + if (! is_egl_device (device)) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return EGL_NO_DISPLAY; + } + + return to_egl_context (device)->display; +} + +cairo_public EGLContext +cairo_egl_device_get_context (cairo_device_t *device) +{ + if (! is_egl_device (device)) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return EGL_NO_CONTEXT; + } + + return to_egl_context (device)->context; +} diff --git a/src/cairo-error-inline.h b/src/cairo-error-inline.h new file mode 100644 index 000000000..9126c5e61 --- /dev/null +++ b/src/cairo-error-inline.h @@ -0,0 +1,52 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef _CAIRO_ERROR_INLINE_H_ +#define _CAIRO_ERROR_INLINE_H_ + +#include "cairo-error-private.h" + +CAIRO_BEGIN_DECLS + +static inline cairo_status_t +_cairo_public_status (cairo_int_status_t status) +{ + assert (status <= CAIRO_INT_STATUS_LAST_STATUS); + return (cairo_status_t) status; +} + +#endif /* _CAIRO_ERROR_INLINE_H_ */ diff --git a/src/cairo-error-private.h b/src/cairo-error-private.h new file mode 100644 index 000000000..178078ad6 --- /dev/null +++ b/src/cairo-error-private.h @@ -0,0 +1,127 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef _CAIRO_ERROR_PRIVATE_H_ +#define _CAIRO_ERROR_PRIVATE_H_ + +#include "cairo.h" +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" + +#include + +CAIRO_BEGIN_DECLS + +/* _cairo_int_status: internal status + * + * Sure wish C had a real enum type so that this would be distinct + * from #cairo_status_t. Oh well, without that, I'll use this bogus 100 + * offset. We want to keep it fit in int8_t as the compiler may choose + * that for #cairo_status_t + */ +enum _cairo_int_status { + CAIRO_INT_STATUS_SUCCESS = 0, + + CAIRO_INT_STATUS_NO_MEMORY, + CAIRO_INT_STATUS_INVALID_RESTORE, + CAIRO_INT_STATUS_INVALID_POP_GROUP, + CAIRO_INT_STATUS_NO_CURRENT_POINT, + CAIRO_INT_STATUS_INVALID_MATRIX, + CAIRO_INT_STATUS_INVALID_STATUS, + CAIRO_INT_STATUS_NULL_POINTER, + CAIRO_INT_STATUS_INVALID_STRING, + CAIRO_INT_STATUS_INVALID_PATH_DATA, + CAIRO_INT_STATUS_READ_ERROR, + CAIRO_INT_STATUS_WRITE_ERROR, + CAIRO_INT_STATUS_SURFACE_FINISHED, + CAIRO_INT_STATUS_SURFACE_TYPE_MISMATCH, + CAIRO_INT_STATUS_PATTERN_TYPE_MISMATCH, + CAIRO_INT_STATUS_INVALID_CONTENT, + CAIRO_INT_STATUS_INVALID_FORMAT, + CAIRO_INT_STATUS_INVALID_VISUAL, + CAIRO_INT_STATUS_FILE_NOT_FOUND, + CAIRO_INT_STATUS_INVALID_DASH, + CAIRO_INT_STATUS_INVALID_DSC_COMMENT, + CAIRO_INT_STATUS_INVALID_INDEX, + CAIRO_INT_STATUS_CLIP_NOT_REPRESENTABLE, + CAIRO_INT_STATUS_TEMP_FILE_ERROR, + CAIRO_INT_STATUS_INVALID_STRIDE, + CAIRO_INT_STATUS_FONT_TYPE_MISMATCH, + CAIRO_INT_STATUS_USER_FONT_IMMUTABLE, + CAIRO_INT_STATUS_USER_FONT_ERROR, + CAIRO_INT_STATUS_NEGATIVE_COUNT, + CAIRO_INT_STATUS_INVALID_CLUSTERS, + CAIRO_INT_STATUS_INVALID_SLANT, + CAIRO_INT_STATUS_INVALID_WEIGHT, + CAIRO_INT_STATUS_INVALID_SIZE, + CAIRO_INT_STATUS_USER_FONT_NOT_IMPLEMENTED, + CAIRO_INT_STATUS_DEVICE_TYPE_MISMATCH, + CAIRO_INT_STATUS_DEVICE_ERROR, + CAIRO_INT_STATUS_INVALID_MESH_CONSTRUCTION, + CAIRO_INT_STATUS_DEVICE_FINISHED, + CAIRO_INT_STATUS_JBIG2_GLOBAL_MISSING, + + CAIRO_INT_STATUS_LAST_STATUS, + + CAIRO_INT_STATUS_UNSUPPORTED = 100, + CAIRO_INT_STATUS_DEGENERATE, + CAIRO_INT_STATUS_NOTHING_TO_DO, + CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY, + CAIRO_INT_STATUS_IMAGE_FALLBACK, + CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN, +}; + +typedef enum _cairo_int_status cairo_int_status_t; + +#define _cairo_status_is_error(status) \ + (status != CAIRO_STATUS_SUCCESS && status < CAIRO_STATUS_LAST_STATUS) + +#define _cairo_int_status_is_error(status) \ + (status != CAIRO_INT_STATUS_SUCCESS && status < CAIRO_INT_STATUS_LAST_STATUS) + +cairo_private cairo_status_t +_cairo_error (cairo_status_t status); + +/* hide compiler warnings when discarding the return value */ +#define _cairo_error_throw(status) do { \ + cairo_status_t status__ = _cairo_error (status); \ + (void) status__; \ +} while (0) + +CAIRO_END_DECLS + +#endif /* _CAIRO_ERROR_PRIVATE_H_ */ diff --git a/src/cairo-error.c b/src/cairo-error.c new file mode 100644 index 000000000..1b9bd76be --- /dev/null +++ b/src/cairo-error.c @@ -0,0 +1,73 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" +#include "cairo-private.h" + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" + +#include + +/** + * _cairo_error: + * @status: a status value indicating an error, (eg. not + * %CAIRO_STATUS_SUCCESS) + * + * Checks that status is an error status, but does nothing else. + * + * All assignments of an error status to any user-visible object + * within the cairo application should result in a call to + * _cairo_error(). + * + * The purpose of this function is to allow the user to set a + * breakpoint in _cairo_error() to generate a stack trace for when the + * user causes cairo to detect an error. + * + * Return value: the error status. + **/ +cairo_status_t +_cairo_error (cairo_status_t status) +{ + CAIRO_ENSURE_UNIQUE; + assert (_cairo_status_is_error (status)); + + return status; +} + +COMPILE_TIME_ASSERT ((int)CAIRO_INT_STATUS_LAST_STATUS == (int)CAIRO_STATUS_LAST_STATUS); diff --git a/src/cairo-fallback-compositor.c b/src/cairo-fallback-compositor.c new file mode 100644 index 000000000..3f6199fe2 --- /dev/null +++ b/src/cairo-fallback-compositor.c @@ -0,0 +1,185 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-compositor-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-offset-private.h" + +/* high-level compositor interface */ + +static cairo_int_status_t +_cairo_fallback_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_image_surface_t *image; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = _cairo_surface_map_to_image (extents->surface, &extents->unbounded); + + status = _cairo_surface_offset_paint (&image->base, + extents->unbounded.x, + extents->unbounded.y, + extents->op, + &extents->source_pattern.base, + extents->clip); + + return _cairo_surface_unmap_image (extents->surface, image); +} + +static cairo_int_status_t +_cairo_fallback_compositor_mask (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_image_surface_t *image; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = _cairo_surface_map_to_image (extents->surface, &extents->unbounded); + + status = _cairo_surface_offset_mask (&image->base, + extents->unbounded.x, + extents->unbounded.y, + extents->op, + &extents->source_pattern.base, + &extents->mask_pattern.base, + extents->clip); + + return _cairo_surface_unmap_image (extents->surface, image); +} + +static cairo_int_status_t +_cairo_fallback_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_image_surface_t *image; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = _cairo_surface_map_to_image (extents->surface, &extents->unbounded); + + status = _cairo_surface_offset_stroke (&image->base, + extents->unbounded.x, + extents->unbounded.y, + extents->op, + &extents->source_pattern.base, + path, style, + ctm, ctm_inverse, + tolerance, + antialias, + extents->clip); + + return _cairo_surface_unmap_image (extents->surface, image); +} + +static cairo_int_status_t +_cairo_fallback_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_image_surface_t *image; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = _cairo_surface_map_to_image (extents->surface, &extents->unbounded); + + status = _cairo_surface_offset_fill (&image->base, + extents->unbounded.x, + extents->unbounded.y, + extents->op, + &extents->source_pattern.base, + path, + fill_rule, tolerance, antialias, + extents->clip); + + return _cairo_surface_unmap_image (extents->surface, image); +} + +static cairo_int_status_t +_cairo_fallback_compositor_glyphs (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_image_surface_t *image; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = _cairo_surface_map_to_image (extents->surface, &extents->unbounded); + + status = _cairo_surface_offset_glyphs (&image->base, + extents->unbounded.x, + extents->unbounded.y, + extents->op, + &extents->source_pattern.base, + scaled_font, glyphs, num_glyphs, + extents->clip); + + return _cairo_surface_unmap_image (extents->surface, image); +} + +const cairo_compositor_t _cairo_fallback_compositor = { + &__cairo_no_compositor, + + _cairo_fallback_compositor_paint, + _cairo_fallback_compositor_mask, + _cairo_fallback_compositor_stroke, + _cairo_fallback_compositor_fill, + _cairo_fallback_compositor_glyphs, +}; diff --git a/src/cairo-features-uninstalled.pc.in b/src/cairo-features-uninstalled.pc.in new file mode 100644 index 000000000..b9cd9d3ad --- /dev/null +++ b/src/cairo-features-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: @FEATURE_PC@ +Description: @FEATURE_NAME@ for cairo graphics library +Version: @VERSION@ + +Requires: @FEATURE_BASE@ @FEATURE_REQUIRES@ +Libs: @FEATURE_NONPKGCONFIG_LIBS@ @FEATURE_NONPKGCONFIG_EXTRA_LIBS@ +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@/src @FEATURE_NONPKGCONFIG_CFLAGS@ diff --git a/src/cairo-features.pc.in b/src/cairo-features.pc.in new file mode 100644 index 000000000..9a4b657c8 --- /dev/null +++ b/src/cairo-features.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @FEATURE_PC@ +Description: @FEATURE_NAME@ for cairo graphics library +Version: @VERSION@ + +Requires: @FEATURE_BASE@ @FEATURE_REQUIRES@ +Libs: @FEATURE_NONPKGCONFIG_LIBS@ @FEATURE_NONPKGCONFIG_EXTRA_LIBS@ +Cflags: -I${includedir}/cairo @FEATURE_NONPKGCONFIG_CFLAGS@ diff --git a/src/cairo-fixed-private.h b/src/cairo-fixed-private.h new file mode 100644 index 000000000..9ff8f7503 --- /dev/null +++ b/src/cairo-fixed-private.h @@ -0,0 +1,395 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#ifndef CAIRO_FIXED_PRIVATE_H +#define CAIRO_FIXED_PRIVATE_H + +#include "cairo-fixed-type-private.h" + +#include "cairo-wideint-private.h" +#include "cairoint.h" + +/* Implementation */ + +#if (CAIRO_FIXED_BITS != 32) +# error CAIRO_FIXED_BITS must be 32, and the type must be a 32-bit type. +# error To remove this limitation, you will have to fix the tessellator. +#endif + +#define CAIRO_FIXED_ONE ((cairo_fixed_t)(1 << CAIRO_FIXED_FRAC_BITS)) +#define CAIRO_FIXED_ONE_DOUBLE ((double)(1 << CAIRO_FIXED_FRAC_BITS)) +#define CAIRO_FIXED_EPSILON ((cairo_fixed_t)(1)) + +#define CAIRO_FIXED_ERROR_DOUBLE (1. / (2 * CAIRO_FIXED_ONE_DOUBLE)) + +#define CAIRO_FIXED_FRAC_MASK ((cairo_fixed_t)(((cairo_fixed_unsigned_t)(-1)) >> (CAIRO_FIXED_BITS - CAIRO_FIXED_FRAC_BITS))) +#define CAIRO_FIXED_WHOLE_MASK (~CAIRO_FIXED_FRAC_MASK) + +static inline cairo_fixed_t +_cairo_fixed_from_int (int i) +{ + return i << CAIRO_FIXED_FRAC_BITS; +} + +/* This is the "magic number" approach to converting a double into fixed + * point as described here: + * + * http://www.stereopsis.com/sree/fpu2006.html (an overview) + * http://www.d6.com/users/checker/pdfs/gdmfp.pdf (in detail) + * + * The basic idea is to add a large enough number to the double that the + * literal floating point is moved up to the extent that it forces the + * double's value to be shifted down to the bottom of the mantissa (to make + * room for the large number being added in). Since the mantissa is, at a + * given moment in time, a fixed point integer itself, one can convert a + * float to various fixed point representations by moving around the point + * of a floating point number through arithmetic operations. This behavior + * is reliable on most modern platforms as it is mandated by the IEEE-754 + * standard for floating point arithmetic. + * + * For our purposes, a "magic number" must be carefully selected that is + * both large enough to produce the desired point-shifting effect, and also + * has no lower bits in its representation that would interfere with our + * value at the bottom of the mantissa. The magic number is calculated as + * follows: + * + * (2 ^ (MANTISSA_SIZE - FRACTIONAL_SIZE)) * 1.5 + * + * where in our case: + * - MANTISSA_SIZE for 64-bit doubles is 52 + * - FRACTIONAL_SIZE for 16.16 fixed point is 16 + * + * Although this approach provides a very large speedup of this function + * on a wide-array of systems, it does come with two caveats: + * + * 1) It uses banker's rounding as opposed to arithmetic rounding. + * 2) It doesn't function properly if the FPU is in single-precision + * mode. + */ + +/* The 16.16 number must always be available */ +#define CAIRO_MAGIC_NUMBER_FIXED_16_16 (103079215104.0) + +#if CAIRO_FIXED_BITS <= 32 +#define CAIRO_MAGIC_NUMBER_FIXED ((1LL << (52 - CAIRO_FIXED_FRAC_BITS)) * 1.5) + +/* For 32-bit fixed point numbers */ +static inline cairo_fixed_t +_cairo_fixed_from_double (double d) +{ + union { + double d; + int32_t i[2]; + } u; + + u.d = d + CAIRO_MAGIC_NUMBER_FIXED; +#ifdef FLOAT_WORDS_BIGENDIAN + return u.i[1]; +#else + return u.i[0]; +#endif +} + +#else +# error Please define a magic number for your fixed point type! +# error See cairo-fixed-private.h for details. +#endif + +static inline cairo_fixed_t +_cairo_fixed_from_26_6 (uint32_t i) +{ +#if CAIRO_FIXED_FRAC_BITS > 6 + return i << (CAIRO_FIXED_FRAC_BITS - 6); +#else + return i >> (6 - CAIRO_FIXED_FRAC_BITS); +#endif +} + +static inline cairo_fixed_t +_cairo_fixed_from_16_16 (uint32_t i) +{ +#if CAIRO_FIXED_FRAC_BITS > 16 + return i << (CAIRO_FIXED_FRAC_BITS - 16); +#else + return i >> (16 - CAIRO_FIXED_FRAC_BITS); +#endif +} + +static inline double +_cairo_fixed_to_double (cairo_fixed_t f) +{ + return ((double) f) / CAIRO_FIXED_ONE_DOUBLE; +} + +static inline int +_cairo_fixed_is_integer (cairo_fixed_t f) +{ + return (f & CAIRO_FIXED_FRAC_MASK) == 0; +} + +static inline cairo_fixed_t +_cairo_fixed_floor (cairo_fixed_t f) +{ + return f & ~CAIRO_FIXED_FRAC_MASK; +} + +static inline cairo_fixed_t +_cairo_fixed_ceil (cairo_fixed_t f) +{ + return _cairo_fixed_floor (f + CAIRO_FIXED_FRAC_MASK); +} + +static inline cairo_fixed_t +_cairo_fixed_round (cairo_fixed_t f) +{ + return _cairo_fixed_floor (f + (CAIRO_FIXED_FRAC_MASK+1)/2); +} + +static inline cairo_fixed_t +_cairo_fixed_round_down (cairo_fixed_t f) +{ + return _cairo_fixed_floor (f + CAIRO_FIXED_FRAC_MASK/2); +} + +static inline int +_cairo_fixed_integer_part (cairo_fixed_t f) +{ + return f >> CAIRO_FIXED_FRAC_BITS; +} + +static inline int +_cairo_fixed_integer_round (cairo_fixed_t f) +{ + return _cairo_fixed_integer_part (f + (CAIRO_FIXED_FRAC_MASK+1)/2); +} + +static inline int +_cairo_fixed_integer_round_down (cairo_fixed_t f) +{ + return _cairo_fixed_integer_part (f + CAIRO_FIXED_FRAC_MASK/2); +} + +static inline int +_cairo_fixed_fractional_part (cairo_fixed_t f) +{ + return f & CAIRO_FIXED_FRAC_MASK; +} + +static inline int +_cairo_fixed_integer_floor (cairo_fixed_t f) +{ + if (f >= 0) + return f >> CAIRO_FIXED_FRAC_BITS; + else + return -((-f - 1) >> CAIRO_FIXED_FRAC_BITS) - 1; +} + +static inline int +_cairo_fixed_integer_ceil (cairo_fixed_t f) +{ + if (f > 0) + return ((f - 1)>>CAIRO_FIXED_FRAC_BITS) + 1; + else + return - (-f >> CAIRO_FIXED_FRAC_BITS); +} + +/* A bunch of explicit 16.16 operators; we need these + * to interface with pixman and other backends that require + * 16.16 fixed point types. + */ +static inline cairo_fixed_16_16_t +_cairo_fixed_to_16_16 (cairo_fixed_t f) +{ +#if (CAIRO_FIXED_FRAC_BITS == 16) && (CAIRO_FIXED_BITS == 32) + return f; +#elif CAIRO_FIXED_FRAC_BITS > 16 + /* We're just dropping the low bits, so we won't ever got over/underflow here */ + return f >> (CAIRO_FIXED_FRAC_BITS - 16); +#else + cairo_fixed_16_16_t x; + + /* Handle overflow/underflow by clamping to the lowest/highest + * value representable as 16.16 + */ + if ((f >> CAIRO_FIXED_FRAC_BITS) < INT16_MIN) { + x = INT32_MIN; + } else if ((f >> CAIRO_FIXED_FRAC_BITS) > INT16_MAX) { + x = INT32_MAX; + } else { + x = f << (16 - CAIRO_FIXED_FRAC_BITS); + } + + return x; +#endif +} + +static inline cairo_fixed_16_16_t +_cairo_fixed_16_16_from_double (double d) +{ + union { + double d; + int32_t i[2]; + } u; + + u.d = d + CAIRO_MAGIC_NUMBER_FIXED_16_16; +#ifdef FLOAT_WORDS_BIGENDIAN + return u.i[1]; +#else + return u.i[0]; +#endif +} + +static inline int +_cairo_fixed_16_16_floor (cairo_fixed_16_16_t f) +{ + if (f >= 0) + return f >> 16; + else + return -((-f - 1) >> 16) - 1; +} + +static inline double +_cairo_fixed_16_16_to_double (cairo_fixed_16_16_t f) +{ + return ((double) f) / (double) (1 << 16); +} + +#if CAIRO_FIXED_BITS == 32 + +static inline cairo_fixed_t +_cairo_fixed_mul (cairo_fixed_t a, cairo_fixed_t b) +{ + cairo_int64_t temp = _cairo_int32x32_64_mul (a, b); + return _cairo_int64_to_int32(_cairo_int64_rsl (temp, CAIRO_FIXED_FRAC_BITS)); +} + +/* computes round (a * b / c) */ +static inline cairo_fixed_t +_cairo_fixed_mul_div (cairo_fixed_t a, cairo_fixed_t b, cairo_fixed_t c) +{ + cairo_int64_t ab = _cairo_int32x32_64_mul (a, b); + cairo_int64_t c64 = _cairo_int32_to_int64 (c); + return _cairo_int64_to_int32 (_cairo_int64_divrem (ab, c64).quo); +} + +/* computes floor (a * b / c) */ +static inline cairo_fixed_t +_cairo_fixed_mul_div_floor (cairo_fixed_t a, cairo_fixed_t b, cairo_fixed_t c) +{ + return _cairo_int64_32_div (_cairo_int32x32_64_mul (a, b), c); +} + +/* compute y from x so that (x,y), p1, and p2 are collinear */ +static inline cairo_fixed_t +_cairo_edge_compute_intersection_y_for_x (const cairo_point_t *p1, + const cairo_point_t *p2, + cairo_fixed_t x) +{ + cairo_fixed_t y, dx; + + if (x == p1->x) + return p1->y; + if (x == p2->x) + return p2->y; + + y = p1->y; + dx = p2->x - p1->x; + if (dx != 0) + y += _cairo_fixed_mul_div_floor (x - p1->x, p2->y - p1->y, dx); + + return y; +} + +/* compute x from y so that (x,y), p1, and p2 are collinear */ +static inline cairo_fixed_t +_cairo_edge_compute_intersection_x_for_y (const cairo_point_t *p1, + const cairo_point_t *p2, + cairo_fixed_t y) +{ + cairo_fixed_t x, dy; + + if (y == p1->y) + return p1->x; + if (y == p2->y) + return p2->x; + + x = p1->x; + dy = p2->y - p1->y; + if (dy != 0) + x += _cairo_fixed_mul_div_floor (y - p1->y, p2->x - p1->x, dy); + + return x; +} + +/* Intersect two segments based on the algorithm described at + * http://paulbourke.net/geometry/pointlineplane/. This implementation + * uses floating point math. */ +static inline cairo_bool_t +_slow_segment_intersection (const cairo_point_t *seg1_p1, + const cairo_point_t *seg1_p2, + const cairo_point_t *seg2_p1, + const cairo_point_t *seg2_p2, + cairo_point_t *intersection) +{ + double denominator, u_a, u_b; + double seg1_dx, seg1_dy, seg2_dx, seg2_dy, seg_start_dx, seg_start_dy; + + seg1_dx = _cairo_fixed_to_double (seg1_p2->x - seg1_p1->x); + seg1_dy = _cairo_fixed_to_double (seg1_p2->y - seg1_p1->y); + seg2_dx = _cairo_fixed_to_double (seg2_p2->x - seg2_p1->x); + seg2_dy = _cairo_fixed_to_double (seg2_p2->y - seg2_p1->y); + denominator = (seg2_dy * seg1_dx) - (seg2_dx * seg1_dy); + if (denominator == 0) + return FALSE; + + seg_start_dx = _cairo_fixed_to_double (seg1_p1->x - seg2_p1->x); + seg_start_dy = _cairo_fixed_to_double (seg1_p1->y - seg2_p1->y); + u_a = ((seg2_dx * seg_start_dy) - (seg2_dy * seg_start_dx)) / denominator; + u_b = ((seg1_dx * seg_start_dy) - (seg1_dy * seg_start_dx)) / denominator; + + if (u_a <= 0 || u_a >= 1 || u_b <= 0 || u_b >= 1) + return FALSE; + + intersection->x = seg1_p1->x + _cairo_fixed_from_double ((u_a * seg1_dx)); + intersection->y = seg1_p1->y + _cairo_fixed_from_double ((u_a * seg1_dy)); + return TRUE; +} + +#else +# error Please define multiplication and other operands for your fixed-point type size +#endif + +#endif /* CAIRO_FIXED_PRIVATE_H */ diff --git a/src/cairo-fixed-type-private.h b/src/cairo-fixed-type-private.h new file mode 100644 index 000000000..e9f26f615 --- /dev/null +++ b/src/cairo-fixed-type-private.h @@ -0,0 +1,75 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#ifndef CAIRO_FIXED_TYPE_PRIVATE_H +#define CAIRO_FIXED_TYPE_PRIVATE_H + +#include "cairo-wideint-type-private.h" + +/* + * Fixed-point configuration + */ + +typedef int32_t cairo_fixed_16_16_t; +typedef cairo_int64_t cairo_fixed_32_32_t; +typedef cairo_int64_t cairo_fixed_48_16_t; +typedef cairo_int128_t cairo_fixed_64_64_t; +typedef cairo_int128_t cairo_fixed_96_32_t; + +/* Eventually, we should allow changing this, but I think + * there are some assumptions in the tessellator about the + * size of a fixed type. For now, it must be 32. + */ +#define CAIRO_FIXED_BITS 32 + +/* The number of fractional bits. Changing this involves + * making sure that you compute a double-to-fixed magic number. + * (see below). + */ +#define CAIRO_FIXED_FRAC_BITS 8 + +/* A signed type %CAIRO_FIXED_BITS in size; the main fixed point type */ +typedef int32_t cairo_fixed_t; + +/* An unsigned type of the same size as #cairo_fixed_t */ +typedef uint32_t cairo_fixed_unsigned_t; + +typedef struct _cairo_point { + cairo_fixed_t x; + cairo_fixed_t y; +} cairo_point_t; + +#endif /* CAIRO_FIXED_TYPE_PRIVATE_H */ diff --git a/src/cairo-fixed.c b/src/cairo-fixed.c new file mode 100644 index 000000000..03e055923 --- /dev/null +++ b/src/cairo-fixed.c @@ -0,0 +1,39 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-fixed-private.h" diff --git a/src/cairo-font-face-twin-data.c b/src/cairo-font-face-twin-data.c new file mode 100644 index 000000000..ff09cb2be --- /dev/null +++ b/src/cairo-font-face-twin-data.c @@ -0,0 +1,1072 @@ +/* See cairo-font-face-twin.c for copyright info */ + +#include "cairoint.h" + +const int8_t _cairo_twin_outlines[] = { +/* 0x0 '\0' offset 0 */ + 0, 24, 42, 0, 2, 2, + 0, 24, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 24, -42, + 'l', 24, 0, + 'l', 0, 0, + 'e', + 'X', 'X', +/* 0x20 ' ' offset 28 */ + 0, 4, 0, 0, 0, 0, + /* snap_x */ + /* snap_y */ + 'e', + 'X', 'X', 'X', + 'X', 'X', +/* 0x21 '!' offset 40 */ + 0, 0, 42, 0, 1, 3, + 0, /* snap_x */ + -42, -14, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, -14, + 'm', 0, 0, + 'l', 0, 0, + 'e', + 'X', 'X', 'X', 'X', 'X', 'X', + 'X', 'X', 'X', 'X', 'X', 'X', + 'X', 'X', 'X', 'X', 'X', 'X', + 'X', 'X', 'X', 'X', 'X', 'X', + 'X', 'X', 'X', +/* 0x22 '"' offset 90 */ + 0, 16, 42, -28, 2, 2, + 0, 16, /* snap_x */ + -42, -28, /* snap_y */ + 'm', 0, -42, + 'l', 0, -28, + 'm', 16, -42, + 'l', 16, -28, + 'e', + 'X', +/* 0x23 '#' offset 114 */ + 0, 30, 50, 14, 2, 5, + 0, 30, /* snap_x */ + -24, -21, -15, -12, 0, /* snap_y */ + 'm', 16, -50, + 'l', 2, 14, + 'm', 28, -50, + 'l', 14, 14, + 'm', 2, -24, + 'l', 30, -24, + 'm', 0, -12, + 'l', 28, -12, + 'e', +/* 0x24 '$' offset 152 */ + 0, 28, 50, 8, 4, 4, + 0, 10, 18, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 10, -50, + 'l', 10, 8, + 'm', 18, -50, + 'l', 18, 8, + 'm', 28, -36, + 'c', 24, -42, 18, -42, 14, -42, + 'c', 10, -42, 0, -42, 0, -34, + 'c', 0, -25, 8, -24, 14, -22, + 'c', 20, -20, 28, -19, 28, -9, + 'c', 28, 0, 18, 0, 14, 0, + 'c', 10, 0, 4, 0, 0, -6, + 'e', +/* 0x25 '%' offset 224 */ + 0, 36, 42, 0, 4, 7, + 0, 14, 22, 36, /* snap_x */ + -42, -38, -28, -21, -15, -14, 0, /* snap_y */ + 'm', 10, -42, + 'c', 12, -41, 14, -40, 14, -36, + 'c', 14, -30, 11, -28, 6, -28, + 'c', 2, -28, 0, -30, 0, -34, + 'c', 0, -39, 3, -42, 8, -42, + 'l', 10, -42, + 'c', 18, -37, 28, -37, 36, -42, + 'l', 0, 0, + 'm', 28, -14, + 'c', 24, -14, 22, -11, 22, -6, + 'c', 22, -2, 24, 0, 28, 0, + 'c', 33, 0, 36, -2, 36, -8, + 'c', 36, -12, 34, -14, 30, -14, + 'l', 28, -14, + 'e', + 'X', 'X', 'X', +/* 0x26 '&' offset 323 */ + 0, 40, 42, 0, 4, 4, + 0, 10, 22, 40, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 40, -24, + 'c', 40, -27, 39, -28, 37, -28, + 'c', 29, -28, 32, 0, 12, 0, + 'c', 0, 0, 0, -8, 0, -10, + 'c', 0, -24, 22, -20, 22, -34, + 'c', 22, -45, 10, -45, 10, -34, + 'c', 10, -27, 25, 0, 36, 0, + 'c', 39, 0, 40, -1, 40, -4, + 'e', +/* 0x27 ''' offset 390 */ + 0, 4, 42, -30, 2, 2, + 0, 4, /* snap_x */ + -42, -28, /* snap_y */ + 'm', 2, -38, + 'c', -1, -38, -1, -42, 2, -42, + 'c', 6, -42, 5, -33, 0, -30, + 'e', + 'X', +/* 0x28 '(' offset 419 */ + 0, 14, 50, 14, 2, 2, + 0, 14, /* snap_x */ + -50, 14, /* snap_y */ + 'm', 14, -50, + 'c', -5, -32, -5, -5, 14, 14, + 'e', + 'X', +/* 0x29 ')' offset 441 */ + 0, 14, 50, 14, 2, 2, + 0, 14, /* snap_x */ + -15, 14, /* snap_y */ + 'm', 0, -50, + 'c', 19, -34, 19, -2, 0, 14, + 'e', + 'X', +/* 0x2a '*' offset 463 */ + 0, 20, 30, -6, 3, 3, + 0, 10, 20, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 10, -30, + 'l', 10, -6, + 'm', 0, -24, + 'l', 20, -12, + 'm', 20, -24, + 'l', 0, -12, + 'e', +/* 0x2b '+' offset 494 */ + 0, 36, 36, 0, 3, 4, + 0, 18, 36, /* snap_x */ + -21, -18, -15, 0, /* snap_y */ + 'm', 18, -36, + 'l', 18, 0, + 'm', 0, -18, + 'l', 36, -18, + 'e', +/* 0x2c ',' offset 520 */ + 0, 4, 4, 8, 2, 3, + 0, 4, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 4, -2, + 'c', 4, 1, 0, 1, 0, -2, + 'c', 0, -5, 4, -5, 4, -2, + 'c', 4, 4, 2, 6, 0, 8, + 'e', +/* 0x2d '-' offset 556 */ + 0, 36, 18, -18, 2, 4, + 0, 36, /* snap_x */ + -21, -18, -15, 0, /* snap_y */ + 'm', 0, -18, + 'l', 36, -18, + 'e', +/* 0x2e '.' offset 575 */ + 0, 4, 4, 0, 2, 3, + 0, 4, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 2, -4, + 'c', -1, -4, -1, 0, 2, 0, + 'c', 5, 0, 5, -4, 2, -4, + 'e', +/* 0x2f '/' offset 604 */ + 0, 36, 50, 14, 2, 3, + 0, 36, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 36, -50, + 'l', 0, 14, + 'e', +/* 0x30 '0' offset 622 */ + 0, 28, 42, 0, 2, 4, + 0, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 14, -42, + 'c', 9, -42, 0, -42, 0, -21, + 'c', 0, 0, 9, 0, 14, 0, + 'c', 19, 0, 28, 0, 28, -21, + 'c', 28, -42, 19, -42, 14, -42, + 'E', +/* 0x31 '1' offset 666 */ + 0, 28, 42, 0, 2, 3, + 0, 17, 28 /* snap_x */ + -42, -34, 0, /* snap_y */ + 'm', 7, -34, + 'c', 11, -35, 15, -38, 17, -42, + 'l', 17, 0, + 'e', +/* 0x32 '2' offset 691 */ + 0, 28, 42, 0, 4, 4, + 0, 2, 26, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 2, -32, + 'c', 2, -34, 2, -42, 14, -42, + 'c', 26, -42, 26, -34, 26, -32, + 'c', 26, -30, 25, -25, 10, -10, + 'l', 0, 0, + 'l', 28, 0, + 'e', +/* 0x33 '3' offset 736 */ + 0, 28, 42, 0, 2, 5, + 0, 28, /* snap_x */ + -42, -26, -21, -15, 0, /* snap_y */ + 'm', 4, -42, + 'l', 26, -42, + 'l', 14, -26, + 'c', 21, -26, 28, -26, 28, -14, + 'c', 28, 0, 17, 0, 13, 0, + 'c', 8, 0, 3, -1, 0, -8, + 'e', +/* 0x34 '4' offset 780 */ + 0, 28, 42, 0, 3, 3, + 0, 20, 30, /* snap_x */ + -42, -14, 0, /* snap_y */ + 'm', 20, 0, + 'l', 20, -42, + 'l', 0, -14, + 'l', 30, -14, + 'e', + 'X', 'X', 'X', + 'X', +/* 0x35 '5' offset 809 */ + 0, 28, 42, 0, 2, 5, + 0, 28, /* snap_x */ + -42, -28, -21, -15, 0, /* snap_y */ + 'm', 24, -42, + 'l', 4, -42, + 'l', 2, -24, + 'c', 5, -27, 10, -28, 13, -28, + 'c', 16, -28, 28, -28, 28, -14, + 'c', 28, 0, 16, 0, 13, 0, + 'c', 10, 0, 3, 0, 0, -8, + 'e', +/* 0x36 '6' offset 860 */ + 0, 28, 42, 0, 2, 5, + 0, 26, /* snap_x */ + -42, -26, -21, -15, 0, /* snap_y */ + 'm', 24, -36, + 'c', 22, -41, 19, -42, 14, -42, + 'c', 9, -42, 0, -41, 0, -19, + 'c', 0, -1, 9, 0, 13, 0, + 'c', 18, 0, 26, -3, 26, -13, + 'c', 26, -18, 23, -26, 13, -26, + 'c', 10, -26, 1, -24, 0, -14, + 'e', +/* 0x37 '7' offset 919 */ + 0, 28, 42, 0, 2, 4, + 0, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 0, -42, + 'l', 28, -42, + 'l', 8, 0, + 'e', + 'X', 'X', 'X', +/* 0x38 '8' offset 944 */ + 0, 28, 42, 0, 4, 4, + 0, 2, 26, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 14, -42, + 'c', 5, -42, 2, -40, 2, -34, + 'c', 2, -18, 28, -32, 28, -11, + 'c', 28, 0, 18, 0, 14, 0, + 'c', 10, 0, 0, 0, 0, -11, + 'c', 0, -32, 26, -18, 26, -34, + 'c', 26, -40, 23, -42, 14, -42, + 'E', +/* 0x39 '9' offset 1004 */ + 0, 28, 42, 0, 2, 5, + 0, 26, /* snap_x */ + -42, -21, -16, -15, 0, /* snap_y */ + 'm', 26, -28, + 'c', 25, -16, 13, -16, 13, -16, + 'c', 8, -16, 0, -19, 0, -29, + 'c', 0, -34, 3, -42, 13, -42, + 'c', 24, -42, 26, -32, 26, -23, + 'c', 26, -14, 24, 0, 12, 0, + 'c', 7, 0, 4, -2, 2, -6, + 'e', +/* 0x3a ':' offset 1063 */ + 0, 4, 28, 0, 2, 3, + 0, 4, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 2, -28, + 'c', -1, -28, -1, -24, 2, -24, + 'c', 5, -24, 5, -28, 2, -28, + 'm', 2, -4, + 'c', -1, -4, -1, 0, 2, 0, + 'c', 5, 0, 5, -4, 2, -4, + 'e', +/* 0x3b ';' offset 1109 */ + 0, 4, 28, 8, 2, 3, + 0, 4, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 2, -28, + 'c', -1, -28, -1, -24, 2, -24, + 'c', 5, -24, 5, -28, 2, -28, + 'm', 4, -2, + 'c', 4, 1, 0, 1, 0, -2, + 'c', 0, -5, 4, -5, 4, -2, + 'c', 4, 3, 2, 6, 0, 8, + 'e', +/* 0x3c '<' offset 1162 */ + 0, 32, 36, 0, 2, 3, + 0, 32, /* snap_x */ + -36, -18, 0, /* snap_y */ + 'm', 32, -36, + 'l', 0, -18, + 'l', 32, 0, + 'e', +/* 0x3d '=' offset 1183 */ + 0, 36, 24, -12, 2, 2, + 0, 36, /* snap_x */ + -24, -15, /* snap_y */ + 'm', 0, -24, + 'l', 36, -24, + 'm', 0, -12, + 'l', 36, -12, + 'e', + 'X', 'X', 'X', +/* 0x3e '>' offset 1209 */ + 0, 32, 36, 0, 2, 3, + 0, 32, /* snap_x */ + -36, -18, 0, /* snap_y */ + 'm', 0, -36, + 'l', 32, -18, + 'l', 0, 0, + 'e', +/* 0x3f '?' offset 1230 */ + 0, 24, 42, 0, 3, 4, + 0, 12, 24, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 0, -32, + 'c', 0, -34, 0, -42, 12, -42, + 'c', 24, -42, 24, -34, 24, -32, + 'c', 24, -29, 24, -24, 12, -20, + 'l', 12, -14, + 'm', 12, 0, + 'l', 12, 0, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', +/* 0x40 '@' offset 1288 */ + 0, 42, 42, 0, 1, 6, + 30, /* snap_x */ + -42, -32, -21, -15, -10, 0, /* snap_y */ + 'm', 30, -26, + 'c', 28, -31, 24, -32, 21, -32, + 'c', 10, -32, 10, -23, 10, -19, + 'c', 10, -13, 11, -10, 19, -10, + 'c', 30, -10, 28, -21, 30, -32, + 'c', 27, -10, 30, -10, 34, -10, + 'c', 41, -10, 42, -19, 42, -22, + 'c', 42, -34, 34, -42, 21, -42, + 'c', 9, -42, 0, -34, 0, -21, + 'c', 0, -9, 8, 0, 21, 0, + 'c', 30, 0, 34, -3, 36, -6, + 'e', +/* 0x41 'A' offset 1375 */ + 0, 32, 42, 0, 2, 3, + 0, 32, /* snap_x */ + -42, -14, 0, /* snap_y */ + 'm', 0, 0, + 'l', 16, -42, + 'l', 32, 0, + 'm', 6, -14, + 'l', 26, -14, + 'e', + 'X', 'X', 'X', + 'X', +/* 0x42 'B' offset 1406 */ + 0, 28, 42, 0, 2, 3, + 0, 28, /* snap_x */ + -42, -22, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 18, -42, + 'c', 32, -42, 32, -22, 18, -22, + 'l', 0, -22, + 'l', 18, -22, + 'c', 32, -22, 32, 0, 18, 0, + 'E', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', +/* 0x43 'C' offset 1455 */ + 0, 30, 42, 0, 2, 4, + 0, 30, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 30, -32, + 'c', 26, -42, 21, -42, 16, -42, + 'c', 2, -42, 0, -29, 0, -21, + 'c', 0, -13, 2, 0, 16, 0, + 'c', 21, 0, 26, 0, 30, -10, + 'e', +/* 0x44 'D' offset 1499 */ + 0, 28, 42, 0, 2, 2, + 0, 28, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 14, -42, + 'c', 33, -42, 33, 0, 14, 0, + 'E', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', +/* 0x45 'E' offset 1534 */ + 0, 26, 42, 0, 2, 3, + 0, 26, /* snap_x */ + -42, -22, 0, /* snap_y */ + 'm', 26, -42, + 'l', 0, -42, + 'l', 0, 0, + 'l', 26, 0, + 'm', 0, -22, + 'l', 16, -22, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', +/* 0x46 'F' offset 1572 */ + 0, 26, 42, 0, 2, 3, + 0, 26, /* snap_x */ + -42, -22, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 26, -42, + 'm', 0, -22, + 'l', 16, -22, + 'e', + 'X', 'X', 'X', + 'X', 'X', +/* 0x47 'G' offset 1604 */ + 0, 30, 42, 0, 2, 5, + 0, 30, /* snap_x */ + -42, -21, -16, -15, 0, /* snap_y */ + 'm', 30, -32, + 'c', 26, -42, 21, -42, 16, -42, + 'c', 2, -42, 0, -29, 0, -21, + 'c', 0, -13, 2, 0, 16, 0, + 'c', 28, 0, 30, -7, 30, -16, + 'l', 20, -16, + 'e', + 'X', 'X', 'X', +/* 0x48 'H' offset 1655 */ + 0, 28, 42, 0, 2, 3, + 0, 28, /* snap_x */ + -42, -22, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'm', 28, -42, + 'l', 28, 0, + 'm', 0, -22, + 'l', 28, -22, + 'e', + 'X', +/* 0x49 'I' offset 1686 */ + 0, 0, 42, 0, 1, 2, + 0, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'e', + 'X', +/* 0x4a 'J' offset 1703 */ + 0, 20, 42, 0, 2, 3, + 0, 20, /* snap_x */ + -42, -15, 0, /* snap_y */ + 'm', 20, -42, + 'l', 20, -10, + 'c', 20, 3, 0, 3, 0, -10, + 'l', 0, -14, + 'e', +/* 0x4b 'K' offset 1731 */ + 0, 28, 42, 0, 2, 3, + 0, 28, /* snap_x */ + -42, -15, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'm', 28, -42, + 'l', 0, -14, + 'm', 10, -24, + 'l', 28, 0, + 'e', +/* 0x4c 'L' offset 1761 */ + 0, 24, 42, 0, 2, 2, + 0, 24, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'l', 24, 0, + 'e', + 'X', 'X', 'X', + 'X', +/* 0x4d 'M' offset 1785 */ + 0, 32, 42, 0, 2, 2, + 0, 32, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 16, 0, + 'l', 32, -42, + 'l', 32, 0, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', +/* 0x4e 'N' offset 1821 */ + 0, 28, 42, 0, 2, 2, + 0, 28, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 28, 0, + 'l', 28, -42, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', +/* 0x4f 'O' offset 1851 */ + 0, 32, 42, 0, 2, 4, + 0, 32, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 16, -42, + 'c', 2, -42, 0, -29, 0, -21, + 'c', 0, -13, 2, 0, 16, 0, + 'c', 30, 0, 32, -13, 32, -21, + 'c', 32, -29, 30, -42, 16, -42, + 'E', +/* 0x50 'P' offset 1895 */ + 0, 28, 42, 0, 2, 5, + 0, 28, /* snap_x */ + -42, -21, -20, -15, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 18, -42, + 'c', 32, -42, 32, -20, 18, -20, + 'l', 0, -20, + 'e', + 'X', 'X', 'X', +/* 0x51 'Q' offset 1931 */ + 0, 32, 42, 4, 2, 4, + 0, 32, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 16, -42, + 'c', 2, -42, 0, -29, 0, -21, + 'c', 0, -13, 2, 0, 16, 0, + 'c', 30, 0, 32, -13, 32, -21, + 'c', 32, -29, 30, -42, 16, -42, + 'M', 18, -8, + 'l', 30, 4, + 'e', +/* 0x52 'R' offset 1981 */ + 0, 28, 42, 0, 2, 5, + 0, 28, /* snap_x */ + -42, -22, -21, -15, 0, /* snap_y */ + 'm', 0, 0, + 'l', 0, -42, + 'l', 18, -42, + 'c', 32, -42, 31, -22, 18, -22, + 'l', 0, -22, + 'm', 14, -22, + 'l', 28, 0, + 'e', + 'X', 'X', 'X', +/* 0x53 'S' offset 2023 */ + 0, 28, 42, 0, 2, 4, + 0, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 28, -36, + 'c', 25, -41, 21, -42, 14, -42, + 'c', 10, -42, 0, -42, 0, -34, + 'c', 0, -17, 28, -28, 28, -9, + 'c', 28, 0, 19, 0, 14, 0, + 'c', 7, 0, 3, -1, 0, -6, + 'e', +/* 0x54 'T' offset 2074 */ + 0, 28, 42, 0, 3, 4, + 0, 14, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 14, -42, + 'l', 14, 0, + 'm', 0, -42, + 'l', 28, -42, + 'e', +/* 0x55 'U' offset 2100 */ + 0, 28, 42, 0, 2, 2, + 0, 28, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, -12, + 'c', 0, 4, 28, 4, 28, -12, + 'l', 28, -42, + 'e', + 'X', +/* 0x56 'V' offset 2128 */ + 0, 32, 42, 0, 2, 2, + 0, 32, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 16, 0, + 'l', 32, -42, + 'e', + 'X', 'X', 'X', + 'X', +/* 0x57 'W' offset 2152 */ + 0, 40, 42, 0, 2, 2, + 0, 40, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 10, 0, + 'l', 20, -42, + 'l', 30, 0, + 'l', 40, -42, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', +/* 0x58 'X' offset 2188 */ + 0, 28, 42, 0, 2, 2, + 0, 28, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 28, 0, + 'm', 28, -42, + 'l', 0, 0, + 'e', + 'X', +/* 0x59 'Y' offset 2212 */ + 0, 32, 42, 0, 3, 3, + 0, 16, 32, /* snap_x */ + -42, -21, 0, /* snap_y */ + 'm', 0, -42, + 'l', 16, -22, + 'l', 16, 0, + 'm', 32, -42, + 'l', 16, -22, + 'e', +/* 0x5a 'Z' offset 2240 */ + 0, 28, 42, 0, 2, 4, + 0, 28, /* snap_x */ + -42, -21, -15, 0, /* snap_y */ + 'm', 28, 0, + 'l', 0, 0, + 'l', 28, -42, + 'l', 0, -42, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', +/* 0x5b '[' offset 2271 */ + 0, 14, 44, 0, 2, 4, + 0, 14, /* snap_x */ + -44, -21, -15, 0, /* snap_y */ + 'm', 14, -44, + 'l', 0, -44, + 'l', 0, 0, + 'l', 14, 0, + 'e', +/* 0x5c '\' offset 2296 */ + 0, 36, 50, 14, 2, 3, + 0, 36, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 0, -50, + 'l', 36, 14, + 'e', +/* 0x5d ']' offset 2314 */ + 0, 14, 44, 0, 2, 4, + 0, 14, /* snap_x */ + -44, -21, -15, 0, /* snap_y */ + 'm', 0, -44, + 'l', 14, -44, + 'l', 14, 0, + 'l', 0, 0, + 'e', +/* 0x5e '^' offset 2339 */ + 0, 32, 46, -18, 2, 3, + 0, 32, /* snap_x */ + -21, -15, 0, /* snap_y */ + 'm', 0, -18, + 'l', 16, -46, + 'l', 32, -18, + 'e', + 'X', 'X', 'X', +/* 0x5f '_' offset 2363 */ + 0, 36, 0, 0, 2, 1, + 0, 36, /* snap_x */ + 0, /* snap_y */ + 'm', 0, 0, + 'l', 36, 0, + 'e', + 'X', 'X', +/* 0x60 '`' offset 2381 */ + 0, 4, 42, -30, 2, 2, + 0, 4, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 4, -42, + 'c', 2, -40, 0, -39, 0, -32, + 'c', 0, -31, 1, -30, 2, -30, + 'c', 5, -30, 5, -34, 2, -34, + 'e', + 'X', +/* 0x61 'a' offset 2417 */ + 0, 24, 28, 0, 2, 4, + 0, 24, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 24, -28, + 'l', 24, 0, + 'm', 24, -22, + 'c', 21, -27, 18, -28, 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 18, 0, 21, -1, 24, -6, + 'e', +/* 0x62 'b' offset 2467 */ + 0, 24, 42, 0, 2, 4, + 0, 24, /* snap_x */ + -42, -28, -15, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'm', 0, -22, + 'c', 3, -26, 6, -28, 11, -28, + 'c', 22, -28, 24, -19, 24, -14, + 'c', 24, -9, 22, 0, 11, 0, + 'c', 6, 0, 3, -2, 0, -6, + 'e', +/* 0x63 'c' offset 2517 */ + 0, 24, 28, 0, 2, 4, + 0, 24, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 24, -22, + 'c', 21, -26, 18, -28, 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 18, 0, 21, -2, 24, -6, + 'e', +/* 0x64 'd' offset 2561 */ + 0, 24, 42, 0, 2, 4, + 0, 24, /* snap_x */ + -42, -28, -15, 0, /* snap_y */ + 'm', 24, -42, + 'l', 24, 0, + 'm', 24, -22, + 'c', 21, -26, 18, -28, 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 18, 0, 21, -2, 24, -6, + 'e', +/* 0x65 'e' offset 2611 */ + 0, 24, 28, 0, 2, 5, + 0, 24, /* snap_x */ + -28, -21, -16, -15, 0, /* snap_y */ + 'm', 0, -16, + 'l', 24, -16, + 'c', 24, -20, 24, -28, 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 18, 0, 21, -2, 24, -6, + 'e', +/* 0x66 'f' offset 2659 */ + 0, 16, 42, 0, 3, 5, + 0, 6, 16, /* snap_x */ + -42, -28, -21, -15, 0, /* snap_y */ + 'm', 16, -42, + 'c', 8, -42, 6, -40, 6, -34, + 'l', 6, 0, + 'm', 0, -28, + 'l', 14, -28, + 'e', +/* 0x67 'g' offset 2693 */ + 0, 24, 28, 14, 2, 5, + 0, 24, /* snap_x */ + -28, -21, -15, 0, 14, /* snap_y */ + 'm', 24, -28, + 'l', 24, 4, + 'c', 23, 14, 16, 14, 13, 14, + 'c', 10, 14, 8, 14, 6, 12, + 'm', 24, -22, + 'c', 21, -26, 18, -28, 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 18, 0, 21, -2, 24, -6, + 'e', +/* 0x68 'h' offset 2758 */ + 0, 22, 42, 0, 2, 4, + 0, 22, /* snap_x */ + -42, -28, -15, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'm', 0, -20, + 'c', 8, -32, 22, -31, 22, -20, + 'l', 22, 0, + 'e', +/* 0x69 'i' offset 2790 */ + 0, 0, 44, 0, 1, 3, + 0, /* snap_x */ + -42, -28, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, -42, + 'm', 0, -28, + 'l', 0, 0, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', + 'X', 'X', +/* 0x6a 'j' offset 2826 */ + -8, 4, 44, 14, 3, 5, + -8, 2, 4, /* snap_x */ + -42, -21, -15, 0, 14, /* snap_y */ + 'm', 2, -42, + 'l', 2, -42, + 'm', 2, -28, + 'l', 2, 6, + 'c', 2, 13, -1, 14, -8, 14, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', +/* 0x6b 'k' offset 2870 */ + 0, 22, 42, 0, 2, 3, + 0, 22, /* snap_x */ + -42, -28, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'm', 20, -28, + 'l', 0, -8, + 'm', 8, -16, + 'l', 22, 0, + 'e', +/* 0x6c 'l' offset 2900 */ + 0, 0, 42, 0, 1, 2, + 0, /* snap_x */ + -42, 0, /* snap_y */ + 'm', 0, -42, + 'l', 0, 0, + 'e', + 'X', +/* 0x6d 'm' offset 2917 */ + 0, 44, 28, 0, 3, 3, + 0, 22, 44, /* snap_x */ + -28, -21, 0, /* snap_y */ + 'm', 0, -28, + 'l', 0, 0, + 'm', 0, -20, + 'c', 5, -29, 22, -33, 22, -20, + 'l', 22, 0, + 'm', 22, -20, + 'c', 27, -29, 44, -33, 44, -20, + 'l', 44, 0, + 'e', + 'X', +/* 0x6e 'n' offset 2963 */ + 0, 22, 28, 0, 2, 3, + 0, 22, /* snap_x */ + -28, -21, 0, /* snap_y */ + 'm', 0, -28, + 'l', 0, 0, + 'm', 0, -20, + 'c', 4, -28, 22, -34, 22, -20, + 'l', 22, 0, + 'e', + 'X', +/* 0x6f 'o' offset 2995 */ + 0, 26, 28, 0, 2, 4, + 0, 26, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 24, 0, 26, -9, 26, -14, + 'c', 26, -19, 24, -28, 13, -28, + 'E', +/* 0x70 'p' offset 3039 */ + 0, 24, 28, 14, 2, 4, + 0, 24, /* snap_x */ + -28, -21, 0, 14, /* snap_y */ + 'm', 0, -28, + 'l', 0, 14, + 'm', 0, -22, + 'c', 3, -26, 6, -28, 11, -28, + 'c', 22, -28, 24, -19, 24, -14, + 'c', 24, -9, 22, 0, 11, 0, + 'c', 6, 0, 3, -2, 0, -6, + 'e', +/* 0x71 'q' offset 3089 */ + 0, 24, 28, 14, 2, 4, + 0, 24, /* snap_x */ + -28, -21, 0, 14, /* snap_y */ + 'm', 24, -28, + 'l', 24, 14, + 'm', 24, -22, + 'c', 21, -26, 18, -28, 13, -28, + 'c', 2, -28, 0, -19, 0, -14, + 'c', 0, -9, 2, 0, 13, 0, + 'c', 18, 0, 21, -2, 24, -6, + 'e', +/* 0x72 'r' offset 3139 */ + 0, 16, 28, 0, 2, 4, + 0, 16, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 0, -28, + 'l', 0, 0, + 'm', 0, -16, + 'c', 2, -27, 7, -28, 16, -28, + 'e', +/* 0x73 's' offset 3168 */ + 0, 22, 28, 0, 2, 4, + 0, 22, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 22, -22, + 'c', 22, -27, 16, -28, 11, -28, + 'c', 4, -28, 0, -26, 0, -22, + 'c', 0, -11, 22, -20, 22, -7, + 'c', 22, 0, 17, 0, 11, 0, + 'c', 6, 0, 0, -1, 0, -6, + 'e', +/* 0x74 't' offset 3219 */ + 0, 16, 42, 0, 3, 4, + 0, 6, 16, /* snap_x */ + -42, -28, -21, 0, /* snap_y */ + 'm', 6, -42, + 'l', 6, -8, + 'c', 6, -2, 8, 0, 16, 0, + 'm', 0, -28, + 'l', 14, -28, + 'e', +/* 0x75 'u' offset 3252 */ + 0, 22, 28, 0, 2, 3, + 0, 22, /* snap_x */ + -28, -15, 0, /* snap_y */ + 'm', 0, -28, + 'l', 0, -8, + 'c', 0, 6, 18, 0, 22, -8, + 'm', 22, -28, + 'l', 22, 0, + 'e', +/* 0x76 'v' offset 3283 */ + 0, 24, 28, 0, 2, 3, + 0, 24, /* snap_x */ + -28, -15, 0, /* snap_y */ + 'm', 0, -28, + 'l', 12, 0, + 'l', 24, -28, + 'e', + 'X', 'X', 'X', +/* 0x77 'w' offset 3307 */ + 0, 32, 28, 0, 2, 3, + 0, 32, /* snap_x */ + -28, -15, 0, /* snap_y */ + 'm', 0, -28, + 'l', 8, 0, + 'l', 16, -28, + 'l', 24, 0, + 'l', 32, -28, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', + 'X', 'X', 'X', +/* 0x78 'x' offset 3343 */ + 0, 22, 28, 0, 2, 2, + 0, 22, /* snap_x */ + -28, 0, /* snap_y */ + 'm', 0, -28, + 'l', 22, 0, + 'm', 22, -28, + 'l', 0, 0, + 'e', + 'X', +/* 0x79 'y' offset 3367 */ + -2, 24, 28, 14, 2, 4, + 0, 24, /* snap_x */ + -28, -15, 0, 14, /* snap_y */ + 'm', 0, -28, + 'l', 12, 0, + 'm', 24, -28, + 'l', 12, 0, + 'c', 6, 13, 0, 14, -2, 14, + 'e', +/* 0x7a 'z' offset 3399 */ + 0, 22, 28, 0, 2, 4, + 0, 22, /* snap_x */ + -28, -21, -15, 0, /* snap_y */ + 'm', 22, 0, + 'l', 0, 0, + 'l', 22, -28, + 'l', 0, -28, + 'e', + 'X', 'X', 'X', + 'X', 'X', 'X', +/* 0x7b '{' offset 3430 */ + 0, 16, 44, 0, 3, 5, + 0, 6, 16, /* snap_x */ + -44, -24, -21, -15, 0, /* snap_y */ + 'm', 16, -44, + 'c', 10, -44, 6, -42, 6, -36, + 'l', 6, -24, + 'l', 0, -24, + 'l', 6, -24, + 'l', 6, -8, + 'c', 6, -2, 10, 0, 16, 0, + 'e', +/* 0x7c '|' offset 3474 */ + 0, 0, 50, 14, 1, 2, + 0, /* snap_x */ + -50, 14, /* snap_y */ + 'm', 0, -50, + 'l', 0, 14, + 'e', + 'X', +/* 0x7d '}' offset 3491 */ + 0, 16, 44, 0, 3, 5, + 0, 10, 16, /* snap_x */ + -44, -24, -21, -15, 0, /* snap_y */ + 'm', 0, -44, + 'c', 6, -44, 10, -42, 10, -36, + 'l', 10, -24, + 'l', 16, -24, + 'l', 10, -24, + 'l', 10, -8, + 'c', 10, -2, 6, 0, 0, 0, + 'e', +/* 0x7e '~' offset 3535 */ + 0, 36, 24, -12, 2, 5, + 0, 36, /* snap_x */ + -24, -21, -15, -12, 0, /* snap_y */ + 'm', 0, -14, + 'c', 1, -21, 4, -24, 8, -24, + 'c', 18, -24, 18, -12, 28, -12, + 'c', 32, -12, 35, -15, 36, -22, + 'e', +}; + +const uint16_t _cairo_twin_charmap[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 28, 40, 90, 114, 152, 224, 323, 390, + 419, 441, 463, 494, 520, 556, 575, 604, + 622, 666, 691, 736, 780, 809, 860, 919, + 944, 1004, 1063, 1109, 1162, 1183, 1209, 1230, + 1288, 1375, 1406, 1455, 1499, 1534, 1572, 1604, + 1655, 1686, 1703, 1731, 1761, 1785, 1821, 1851, + 1895, 1931, 1981, 2023, 2074, 2100, 2128, 2152, + 2188, 2212, 2240, 2271, 2296, 2314, 2339, 2363, + 2381, 2417, 2467, 2517, 2561, 2611, 2659, 2693, + 2758, 2790, 2826, 2870, 2900, 2917, 2963, 2995, + 3039, 3089, 3139, 3168, 3219, 3252, 3283, 3307, + 3343, 3367, 3399, 3430, 3474, 3491, 3535, 0, +}; + diff --git a/src/cairo-font-face-twin.c b/src/cairo-font-face-twin.c new file mode 100644 index 000000000..2ad263028 --- /dev/null +++ b/src/cairo-font-face-twin.c @@ -0,0 +1,752 @@ +/* + * Copyright © 2004 Keith Packard + * Copyright © 2008 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith Packard + * Behdad Esfahbod + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +#include + +/* + * This file implements a user-font rendering the descendant of the Hershey + * font coded by Keith Packard for use in the Twin window system. + * The actual font data is in cairo-font-face-twin-data.c + * + * Ported to cairo user font and extended by Behdad Esfahbod. + */ + + + +static cairo_user_data_key_t twin_properties_key; + + +/* + * Face properties + */ + +/* We synthesize multiple faces from the twin data. Here is the parameters. */ + +/* The following tables and matching code are copied from Pango */ + +/* CSS weight */ +typedef enum { + TWIN_WEIGHT_THIN = 100, + TWIN_WEIGHT_ULTRALIGHT = 200, + TWIN_WEIGHT_LIGHT = 300, + TWIN_WEIGHT_BOOK = 380, + TWIN_WEIGHT_NORMAL = 400, + TWIN_WEIGHT_MEDIUM = 500, + TWIN_WEIGHT_SEMIBOLD = 600, + TWIN_WEIGHT_BOLD = 700, + TWIN_WEIGHT_ULTRABOLD = 800, + TWIN_WEIGHT_HEAVY = 900, + TWIN_WEIGHT_ULTRAHEAVY = 1000 +} twin_face_weight_t; + +/* CSS stretch */ +typedef enum { + TWIN_STRETCH_ULTRA_CONDENSED, + TWIN_STRETCH_EXTRA_CONDENSED, + TWIN_STRETCH_CONDENSED, + TWIN_STRETCH_SEMI_CONDENSED, + TWIN_STRETCH_NORMAL, + TWIN_STRETCH_SEMI_EXPANDED, + TWIN_STRETCH_EXPANDED, + TWIN_STRETCH_EXTRA_EXPANDED, + TWIN_STRETCH_ULTRA_EXPANDED +} twin_face_stretch_t; + +typedef struct +{ + int value; + const char str[16]; +} FieldMap; + +static const FieldMap slant_map[] = { + { CAIRO_FONT_SLANT_NORMAL, "" }, + { CAIRO_FONT_SLANT_NORMAL, "Roman" }, + { CAIRO_FONT_SLANT_OBLIQUE, "Oblique" }, + { CAIRO_FONT_SLANT_ITALIC, "Italic" } +}; + +static const FieldMap smallcaps_map[] = { + { FALSE, "" }, + { TRUE, "Small-Caps" } +}; + +static const FieldMap weight_map[] = { + { TWIN_WEIGHT_THIN, "Thin" }, + { TWIN_WEIGHT_ULTRALIGHT, "Ultra-Light" }, + { TWIN_WEIGHT_ULTRALIGHT, "Extra-Light" }, + { TWIN_WEIGHT_LIGHT, "Light" }, + { TWIN_WEIGHT_BOOK, "Book" }, + { TWIN_WEIGHT_NORMAL, "" }, + { TWIN_WEIGHT_NORMAL, "Regular" }, + { TWIN_WEIGHT_MEDIUM, "Medium" }, + { TWIN_WEIGHT_SEMIBOLD, "Semi-Bold" }, + { TWIN_WEIGHT_SEMIBOLD, "Demi-Bold" }, + { TWIN_WEIGHT_BOLD, "Bold" }, + { TWIN_WEIGHT_ULTRABOLD, "Ultra-Bold" }, + { TWIN_WEIGHT_ULTRABOLD, "Extra-Bold" }, + { TWIN_WEIGHT_HEAVY, "Heavy" }, + { TWIN_WEIGHT_HEAVY, "Black" }, + { TWIN_WEIGHT_ULTRAHEAVY, "Ultra-Heavy" }, + { TWIN_WEIGHT_ULTRAHEAVY, "Extra-Heavy" }, + { TWIN_WEIGHT_ULTRAHEAVY, "Ultra-Black" }, + { TWIN_WEIGHT_ULTRAHEAVY, "Extra-Black" } +}; + +static const FieldMap stretch_map[] = { + { TWIN_STRETCH_ULTRA_CONDENSED, "Ultra-Condensed" }, + { TWIN_STRETCH_EXTRA_CONDENSED, "Extra-Condensed" }, + { TWIN_STRETCH_CONDENSED, "Condensed" }, + { TWIN_STRETCH_SEMI_CONDENSED, "Semi-Condensed" }, + { TWIN_STRETCH_NORMAL, "" }, + { TWIN_STRETCH_SEMI_EXPANDED, "Semi-Expanded" }, + { TWIN_STRETCH_EXPANDED, "Expanded" }, + { TWIN_STRETCH_EXTRA_EXPANDED, "Extra-Expanded" }, + { TWIN_STRETCH_ULTRA_EXPANDED, "Ultra-Expanded" } +}; + +static const FieldMap monospace_map[] = { + { FALSE, "" }, + { TRUE, "Mono" }, + { TRUE, "Monospace" } +}; + + +typedef struct _twin_face_properties { + cairo_font_slant_t slant; + twin_face_weight_t weight; + twin_face_stretch_t stretch; + + /* lets have some fun */ + cairo_bool_t monospace; + cairo_bool_t smallcaps; +} twin_face_properties_t; + +static cairo_bool_t +field_matches (const char *s1, + const char *s2, + int len) +{ + int c1, c2; + + while (len && *s1 && *s2) + { +#define TOLOWER(c) \ + (((c) >= 'A' && (c) <= 'Z') ? (c) - 'A' + 'a' : (c)) + + c1 = TOLOWER (*s1); + c2 = TOLOWER (*s2); + if (c1 != c2) { + if (c1 == '-') { + s1++; + continue; + } + return FALSE; + } + s1++; s2++; + len--; + } + + return len == 0 && *s1 == '\0'; +} + +static cairo_bool_t +parse_int (const char *word, + size_t wordlen, + int *out) +{ + char *end; + long val = strtol (word, &end, 10); + int i = val; + + if (end != word && (end == word + wordlen) && val >= 0 && val == i) + { + if (out) + *out = i; + + return TRUE; + } + + return FALSE; +} + +static cairo_bool_t +find_field (const char *what, + const FieldMap *map, + int n_elements, + const char *str, + int len, + int *val) +{ + int i; + cairo_bool_t had_prefix = FALSE; + + if (what) + { + i = strlen (what); + if (len > i && 0 == strncmp (what, str, i) && str[i] == '=') + { + str += i + 1; + len -= i + 1; + had_prefix = TRUE; + } + } + + for (i=0; iNAME)) \ + return; \ + + FIELD (weight); + FIELD (slant); + FIELD (stretch); + FIELD (smallcaps); + FIELD (monospace); + +#undef FIELD +} + +static void +face_props_parse (twin_face_properties_t *props, + const char *s) +{ + const char *start, *end; + + for (start = end = s; *end; end++) { + if (*end != ' ' && *end != ':') + continue; + + if (start < end) + parse_field (props, start, end - start); + start = end + 1; + } + if (start < end) + parse_field (props, start, end - start); +} + +static twin_face_properties_t * +twin_font_face_create_properties (cairo_font_face_t *twin_face) +{ + twin_face_properties_t *props; + + props = malloc (sizeof (twin_face_properties_t)); + if (unlikely (props == NULL)) + return NULL; + + props->stretch = TWIN_STRETCH_NORMAL; + props->slant = CAIRO_FONT_SLANT_NORMAL; + props->weight = TWIN_WEIGHT_NORMAL; + props->monospace = FALSE; + props->smallcaps = FALSE; + + if (unlikely (cairo_font_face_set_user_data (twin_face, + &twin_properties_key, + props, free))) { + free (props); + return NULL; + } + + return props; +} + +static cairo_status_t +twin_font_face_set_properties_from_toy (cairo_font_face_t *twin_face, + cairo_toy_font_face_t *toy_face) +{ + twin_face_properties_t *props; + + props = twin_font_face_create_properties (twin_face); + if (unlikely (props == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + props->slant = toy_face->slant; + props->weight = toy_face->weight == CAIRO_FONT_WEIGHT_NORMAL ? + TWIN_WEIGHT_NORMAL : TWIN_WEIGHT_BOLD; + face_props_parse (props, toy_face->family); + + return CAIRO_STATUS_SUCCESS; +} + + +/* + * Scaled properties + */ + +typedef struct _twin_scaled_properties { + twin_face_properties_t *face_props; + + cairo_bool_t snap; /* hint outlines */ + + double weight; /* unhinted pen width */ + double penx, peny; /* hinted pen width */ + double marginl, marginr; /* hinted side margins */ + + double stretch; /* stretch factor */ +} twin_scaled_properties_t; + +static void +compute_hinting_scale (cairo_t *cr, + double x, double y, + double *scale, double *inv) +{ + cairo_user_to_device_distance (cr, &x, &y); + *scale = x == 0 ? y : y == 0 ? x :sqrt (x*x + y*y); + *inv = 1 / *scale; +} + +static void +compute_hinting_scales (cairo_t *cr, + double *x_scale, double *x_scale_inv, + double *y_scale, double *y_scale_inv) +{ + double x, y; + + x = 1; y = 0; + compute_hinting_scale (cr, x, y, x_scale, x_scale_inv); + + x = 0; y = 1; + compute_hinting_scale (cr, x, y, y_scale, y_scale_inv); +} + +#define SNAPXI(p) (_cairo_round ((p) * x_scale) * x_scale_inv) +#define SNAPYI(p) (_cairo_round ((p) * y_scale) * y_scale_inv) + +/* This controls the global font size */ +#define F(g) ((g) / 72.) + +static void +twin_hint_pen_and_margins(cairo_t *cr, + double *penx, double *peny, + double *marginl, double *marginr) +{ + double x_scale, x_scale_inv; + double y_scale, y_scale_inv; + double margin; + + compute_hinting_scales (cr, + &x_scale, &x_scale_inv, + &y_scale, &y_scale_inv); + + *penx = SNAPXI (*penx); + if (*penx < x_scale_inv) + *penx = x_scale_inv; + + *peny = SNAPYI (*peny); + if (*peny < y_scale_inv) + *peny = y_scale_inv; + + margin = *marginl + *marginr; + *marginl = SNAPXI (*marginl); + if (*marginl < x_scale_inv) + *marginl = x_scale_inv; + + *marginr = margin - *marginl; + if (*marginr < 0) + *marginr = 0; + *marginr = SNAPXI (*marginr); +} + +static cairo_status_t +twin_scaled_font_compute_properties (cairo_scaled_font_t *scaled_font, + cairo_t *cr) +{ + cairo_status_t status; + twin_scaled_properties_t *props; + + props = malloc (sizeof (twin_scaled_properties_t)); + if (unlikely (props == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + + props->face_props = cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &twin_properties_key); + + props->snap = scaled_font->options.hint_style > CAIRO_HINT_STYLE_NONE; + + /* weight */ + props->weight = props->face_props->weight * (F (4) / TWIN_WEIGHT_NORMAL); + + /* pen & margins */ + props->penx = props->peny = props->weight; + props->marginl = props->marginr = F (4); + if (scaled_font->options.hint_style > CAIRO_HINT_STYLE_SLIGHT) + twin_hint_pen_and_margins(cr, + &props->penx, &props->peny, + &props->marginl, &props->marginr); + + /* stretch */ + props->stretch = 1 + .1 * ((int) props->face_props->stretch - (int) TWIN_STRETCH_NORMAL); + + + /* Save it */ + status = cairo_scaled_font_set_user_data (scaled_font, + &twin_properties_key, + props, free); + if (unlikely (status)) + goto FREE_PROPS; + + return CAIRO_STATUS_SUCCESS; + +FREE_PROPS: + free (props); + return status; +} + + +/* + * User-font implementation + */ + +static cairo_status_t +twin_scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *metrics) +{ + metrics->ascent = F (54); + metrics->descent = 1 - metrics->ascent; + + return twin_scaled_font_compute_properties (scaled_font, cr); +} + +#define TWIN_GLYPH_MAX_SNAP_X 4 +#define TWIN_GLYPH_MAX_SNAP_Y 7 + +typedef struct { + int n_snap_x; + int8_t snap_x[TWIN_GLYPH_MAX_SNAP_X]; + double snapped_x[TWIN_GLYPH_MAX_SNAP_X]; + int n_snap_y; + int8_t snap_y[TWIN_GLYPH_MAX_SNAP_Y]; + double snapped_y[TWIN_GLYPH_MAX_SNAP_Y]; +} twin_snap_info_t; + +#define twin_glyph_left(g) ((g)[0]) +#define twin_glyph_right(g) ((g)[1]) +#define twin_glyph_ascent(g) ((g)[2]) +#define twin_glyph_descent(g) ((g)[3]) + +#define twin_glyph_n_snap_x(g) ((g)[4]) +#define twin_glyph_n_snap_y(g) ((g)[5]) +#define twin_glyph_snap_x(g) (&g[6]) +#define twin_glyph_snap_y(g) (twin_glyph_snap_x(g) + twin_glyph_n_snap_x(g)) +#define twin_glyph_draw(g) (twin_glyph_snap_y(g) + twin_glyph_n_snap_y(g)) + +static void +twin_compute_snap (cairo_t *cr, + twin_snap_info_t *info, + const signed char *b) +{ + int s, n; + const signed char *snap; + double x_scale, x_scale_inv; + double y_scale, y_scale_inv; + + compute_hinting_scales (cr, + &x_scale, &x_scale_inv, + &y_scale, &y_scale_inv); + + snap = twin_glyph_snap_x (b); + n = twin_glyph_n_snap_x (b); + info->n_snap_x = n; + assert (n <= TWIN_GLYPH_MAX_SNAP_X); + for (s = 0; s < n; s++) { + info->snap_x[s] = snap[s]; + info->snapped_x[s] = SNAPXI (F (snap[s])); + } + + snap = twin_glyph_snap_y (b); + n = twin_glyph_n_snap_y (b); + info->n_snap_y = n; + assert (n <= TWIN_GLYPH_MAX_SNAP_Y); + for (s = 0; s < n; s++) { + info->snap_y[s] = snap[s]; + info->snapped_y[s] = SNAPYI (F (snap[s])); + } +} + +static double +twin_snap (int8_t v, int n, int8_t *snap, double *snapped) +{ + int s; + + if (!n) + return F(v); + + if (snap[0] == v) + return snapped[0]; + + for (s = 0; s < n - 1; s++) + { + if (snap[s+1] == v) + return snapped[s+1]; + + if (snap[s] <= v && v <= snap[s+1]) + { + int before = snap[s]; + int after = snap[s+1]; + int dist = after - before; + double snap_before = snapped[s]; + double snap_after = snapped[s+1]; + double dist_before = v - before; + return snap_before + (snap_after - snap_before) * dist_before / dist; + } + } + return F(v); +} + +#define SNAPX(p) twin_snap (p, info.n_snap_x, info.snap_x, info.snapped_x) +#define SNAPY(p) twin_snap (p, info.n_snap_y, info.snap_y, info.snapped_y) + +static cairo_status_t +twin_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + double x1, y1, x2, y2, x3, y3; + double marginl; + twin_scaled_properties_t *props; + twin_snap_info_t info; + const int8_t *b; + const int8_t *g; + int8_t w; + double gw; + + props = cairo_scaled_font_get_user_data (scaled_font, &twin_properties_key); + + /* Save glyph space, we need it when stroking */ + cairo_save (cr); + + /* center the pen */ + cairo_translate (cr, props->penx * .5, -props->peny * .5); + + /* small-caps */ + if (props->face_props->smallcaps && glyph >= 'a' && glyph <= 'z') { + glyph += 'A' - 'a'; + /* 28 and 42 are small and capital letter heights of the glyph data */ + cairo_scale (cr, 1, 28. / 42); + } + + /* slant */ + if (props->face_props->slant != CAIRO_FONT_SLANT_NORMAL) { + cairo_matrix_t shear = { 1, 0, -.2, 1, 0, 0}; + cairo_transform (cr, &shear); + } + + b = _cairo_twin_outlines + + _cairo_twin_charmap[unlikely (glyph >= ARRAY_LENGTH (_cairo_twin_charmap)) ? 0 : glyph]; + g = twin_glyph_draw(b); + w = twin_glyph_right(b); + gw = F(w); + + marginl = props->marginl; + + /* monospace */ + if (props->face_props->monospace) { + double monow = F(24); + double extra = props->penx + props->marginl + props->marginr; + cairo_scale (cr, (monow + extra) / (gw + extra), 1); + gw = monow; + + /* resnap margin for new transform */ + { + double x, y, x_scale, x_scale_inv; + x = 1; y = 0; + compute_hinting_scale (cr, x, y, &x_scale, &x_scale_inv); + marginl = SNAPXI (marginl); + } + } + + cairo_translate (cr, marginl, 0); + + /* stretch */ + cairo_scale (cr, props->stretch, 1); + + if (props->snap) + twin_compute_snap (cr, &info, b); + else + info.n_snap_x = info.n_snap_y = 0; + + /* advance width */ + metrics->x_advance = gw * props->stretch + props->penx + props->marginl + props->marginr; + + /* glyph shape */ + for (;;) { + switch (*g++) { + case 'M': + cairo_close_path (cr); + /* fall through */ + case 'm': + x1 = SNAPX(*g++); + y1 = SNAPY(*g++); + cairo_move_to (cr, x1, y1); + continue; + case 'L': + cairo_close_path (cr); + /* fall through */ + case 'l': + x1 = SNAPX(*g++); + y1 = SNAPY(*g++); + cairo_line_to (cr, x1, y1); + continue; + case 'C': + cairo_close_path (cr); + /* fall through */ + case 'c': + x1 = SNAPX(*g++); + y1 = SNAPY(*g++); + x2 = SNAPX(*g++); + y2 = SNAPY(*g++); + x3 = SNAPX(*g++); + y3 = SNAPY(*g++); + cairo_curve_to (cr, x1, y1, x2, y2, x3, y3); + continue; + case 'E': + cairo_close_path (cr); + /* fall through */ + case 'e': + cairo_restore (cr); /* restore glyph space */ + cairo_set_tolerance (cr, 0.01); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 1); + cairo_scale (cr, props->penx, props->peny); + cairo_stroke (cr); + break; + case 'X': + /* filler */ + continue; + } + break; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +twin_scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph) +{ + /* We use an identity charmap. Which means we could live + * with no unicode_to_glyph method too. But we define this + * to map all unknown chars to a single unknown glyph to + * reduce pressure on cache. */ + + if (likely (unicode < ARRAY_LENGTH (_cairo_twin_charmap))) + *glyph = unicode; + else + *glyph = 0; + + return CAIRO_STATUS_SUCCESS; +} + + +/* + * Face constructor + */ + +static cairo_font_face_t * +_cairo_font_face_twin_create_internal (void) +{ + cairo_font_face_t *twin_font_face; + + twin_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_init_func (twin_font_face, twin_scaled_font_init); + cairo_user_font_face_set_render_glyph_func (twin_font_face, twin_scaled_font_render_glyph); + cairo_user_font_face_set_unicode_to_glyph_func (twin_font_face, twin_scaled_font_unicode_to_glyph); + + return twin_font_face; +} + +cairo_font_face_t * +_cairo_font_face_twin_create_fallback (void) +{ + cairo_font_face_t *twin_font_face; + + twin_font_face = _cairo_font_face_twin_create_internal (); + if (! twin_font_face_create_properties (twin_font_face)) { + cairo_font_face_destroy (twin_font_face); + return (cairo_font_face_t *) &_cairo_font_face_nil; + } + + return twin_font_face; +} + +cairo_status_t +_cairo_font_face_twin_create_for_toy (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face) +{ + cairo_status_t status; + cairo_font_face_t *twin_font_face; + + twin_font_face = _cairo_font_face_twin_create_internal (); + status = twin_font_face_set_properties_from_toy (twin_font_face, toy_face); + if (status) { + cairo_font_face_destroy (twin_font_face); + return status; + } + + *font_face = twin_font_face; + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/cairo-font-face.c b/src/cairo-font-face.c new file mode 100644 index 000000000..3bcd2a1e6 --- /dev/null +++ b/src/cairo-font-face.c @@ -0,0 +1,338 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Graydon Hoare + * Owen Taylor + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +/** + * SECTION:cairo-font-face + * @Title: cairo_font_face_t + * @Short_Description: Base class for font faces + * @See_Also: #cairo_scaled_font_t + * + * #cairo_font_face_t represents a particular font at a particular weight, + * slant, and other characteristic but no size, transformation, or size. + * + * Font faces are created using font-backend-specific + * constructors, typically of the form + * cairo_backend_font_face_create(), + * or implicitly using the toy text API by way of + * cairo_select_font_face(). The resulting face can be accessed using + * cairo_get_font_face(). + **/ + +/* #cairo_font_face_t */ + +const cairo_font_face_t _cairo_font_face_nil = { + { 0 }, /* hash_entry */ + CAIRO_STATUS_NO_MEMORY, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + NULL +}; + +cairo_status_t +_cairo_font_face_set_error (cairo_font_face_t *font_face, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS) + return status; + + /* Don't overwrite an existing error. This preserves the first + * error, which is the most significant. */ + _cairo_status_set_error (&font_face->status, status); + + return _cairo_error (status); +} + +void +_cairo_font_face_init (cairo_font_face_t *font_face, + const cairo_font_face_backend_t *backend) +{ + CAIRO_MUTEX_INITIALIZE (); + + font_face->status = CAIRO_STATUS_SUCCESS; + CAIRO_REFERENCE_COUNT_INIT (&font_face->ref_count, 1); + font_face->backend = backend; + + _cairo_user_data_array_init (&font_face->user_data); +} + +/** + * cairo_font_face_reference: + * @font_face: a #cairo_font_face_t, (may be %NULL in which case this + * function does nothing). + * + * Increases the reference count on @font_face by one. This prevents + * @font_face from being destroyed until a matching call to + * cairo_font_face_destroy() is made. + * + * The number of references to a #cairo_font_face_t can be get using + * cairo_font_face_get_reference_count(). + * + * Return value: the referenced #cairo_font_face_t. + * + * Since: 1.0 + **/ +cairo_font_face_t * +cairo_font_face_reference (cairo_font_face_t *font_face) +{ + if (font_face == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) + return font_face; + + /* We would normally assert that we have a reference here but we + * can't get away with that due to the zombie case as documented + * in _cairo_ft_font_face_destroy. */ + + _cairo_reference_count_inc (&font_face->ref_count); + + return font_face; +} +slim_hidden_def (cairo_font_face_reference); + +static inline cairo_bool_t +__put(cairo_reference_count_t *v) +{ + int c, old; + + c = CAIRO_REFERENCE_COUNT_GET_VALUE(v); + while (c != 1 && (old = _cairo_atomic_int_cmpxchg_return_old(&v->ref_count, c, c - 1)) != c) + c = old; + + return c != 1; +} + +cairo_bool_t +_cairo_font_face_destroy (void *abstract_face) +{ +#if 0 /* Nothing needs to be done, we can just drop the last reference */ + cairo_font_face_t *font_face = abstract_face; + return _cairo_reference_count_dec_and_test (&font_face->ref_count); +#endif + return TRUE; +} + +/** + * cairo_font_face_destroy: + * @font_face: a #cairo_font_face_t + * + * Decreases the reference count on @font_face by one. If the result + * is zero, then @font_face and all associated resources are freed. + * See cairo_font_face_reference(). + * + * Since: 1.0 + **/ +void +cairo_font_face_destroy (cairo_font_face_t *font_face) +{ + if (font_face == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&font_face->ref_count)); + + /* We allow resurrection to deal with some memory management for the + * FreeType backend where cairo_ft_font_face_t and cairo_ft_unscaled_font_t + * need to effectively mutually reference each other + */ + if (__put (&font_face->ref_count)) + return; + + if (! font_face->backend->destroy (font_face)) + return; + + _cairo_user_data_array_fini (&font_face->user_data); + + free (font_face); +} +slim_hidden_def (cairo_font_face_destroy); + +/** + * cairo_font_face_get_type: + * @font_face: a font face + * + * This function returns the type of the backend used to create + * a font face. See #cairo_font_type_t for available types. + * + * Return value: The type of @font_face. + * + * Since: 1.2 + **/ +cairo_font_type_t +cairo_font_face_get_type (cairo_font_face_t *font_face) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) + return CAIRO_FONT_TYPE_TOY; + + return font_face->backend->type; +} + +/** + * cairo_font_face_get_reference_count: + * @font_face: a #cairo_font_face_t + * + * Returns the current reference count of @font_face. + * + * Return value: the current reference count of @font_face. If the + * object is a nil object, 0 will be returned. + * + * Since: 1.4 + **/ +unsigned int +cairo_font_face_get_reference_count (cairo_font_face_t *font_face) +{ + if (font_face == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) + return 0; + + return CAIRO_REFERENCE_COUNT_GET_VALUE (&font_face->ref_count); +} + +/** + * cairo_font_face_status: + * @font_face: a #cairo_font_face_t + * + * Checks whether an error has previously occurred for this + * font face + * + * Return value: %CAIRO_STATUS_SUCCESS or another error such as + * %CAIRO_STATUS_NO_MEMORY. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_font_face_status (cairo_font_face_t *font_face) +{ + return font_face->status; +} + +/** + * cairo_font_face_get_user_data: + * @font_face: a #cairo_font_face_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Return user data previously attached to @font_face using the specified + * key. If no user data has been attached with the given key this + * function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + * + * Since: 1.0 + **/ +void * +cairo_font_face_get_user_data (cairo_font_face_t *font_face, + const cairo_user_data_key_t *key) +{ + return _cairo_user_data_array_get_data (&font_face->user_data, + key); +} +slim_hidden_def (cairo_font_face_get_user_data); + +/** + * cairo_font_face_set_user_data: + * @font_face: a #cairo_font_face_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach to the font face + * @destroy: a #cairo_destroy_func_t which will be called when the + * font face is destroyed or when new user data is attached using the + * same key. + * + * Attach user data to @font_face. To remove user data from a font face, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_font_face_set_user_data (cairo_font_face_t *font_face, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) + return font_face->status; + + return _cairo_user_data_array_set_data (&font_face->user_data, + key, user_data, destroy); +} +slim_hidden_def (cairo_font_face_set_user_data); + +void +_cairo_unscaled_font_init (cairo_unscaled_font_t *unscaled_font, + const cairo_unscaled_font_backend_t *backend) +{ + CAIRO_REFERENCE_COUNT_INIT (&unscaled_font->ref_count, 1); + unscaled_font->backend = backend; +} + +cairo_unscaled_font_t * +_cairo_unscaled_font_reference (cairo_unscaled_font_t *unscaled_font) +{ + if (unscaled_font == NULL) + return NULL; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&unscaled_font->ref_count)); + + _cairo_reference_count_inc (&unscaled_font->ref_count); + + return unscaled_font; +} + +void +_cairo_unscaled_font_destroy (cairo_unscaled_font_t *unscaled_font) +{ + if (unscaled_font == NULL) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&unscaled_font->ref_count)); + + if (__put (&unscaled_font->ref_count)) + return; + + if (! unscaled_font->backend->destroy (unscaled_font)) + return; + + free (unscaled_font); +} diff --git a/src/cairo-font-options.c b/src/cairo-font-options.c new file mode 100644 index 000000000..ad28745e6 --- /dev/null +++ b/src/cairo-font-options.c @@ -0,0 +1,535 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Owen Taylor + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +/** + * SECTION:cairo-font-options + * @Title: cairo_font_options_t + * @Short_Description: How a font should be rendered + * @See_Also: #cairo_scaled_font_t + * + * The font options specify how fonts should be rendered. Most of the + * time the font options implied by a surface are just right and do not + * need any changes, but for pixel-based targets tweaking font options + * may result in superior output on a particular display. + **/ + +static const cairo_font_options_t _cairo_font_options_nil = { + CAIRO_ANTIALIAS_DEFAULT, + CAIRO_SUBPIXEL_ORDER_DEFAULT, + CAIRO_LCD_FILTER_DEFAULT, + CAIRO_HINT_STYLE_DEFAULT, + CAIRO_HINT_METRICS_DEFAULT, + CAIRO_ROUND_GLYPH_POS_DEFAULT +}; + +/** + * _cairo_font_options_init_default: + * @options: a #cairo_font_options_t + * + * Initializes all fields of the font options object to default values. + **/ +void +_cairo_font_options_init_default (cairo_font_options_t *options) +{ + options->antialias = CAIRO_ANTIALIAS_DEFAULT; + options->subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; + options->lcd_filter = CAIRO_LCD_FILTER_DEFAULT; + options->hint_style = CAIRO_HINT_STYLE_DEFAULT; + options->hint_metrics = CAIRO_HINT_METRICS_DEFAULT; + options->round_glyph_positions = CAIRO_ROUND_GLYPH_POS_DEFAULT; +} + +void +_cairo_font_options_init_copy (cairo_font_options_t *options, + const cairo_font_options_t *other) +{ + options->antialias = other->antialias; + options->subpixel_order = other->subpixel_order; + options->lcd_filter = other->lcd_filter; + options->hint_style = other->hint_style; + options->hint_metrics = other->hint_metrics; + options->round_glyph_positions = other->round_glyph_positions; +} + +/** + * cairo_font_options_create: + * + * Allocates a new font options object with all options initialized + * to default values. + * + * Return value: a newly allocated #cairo_font_options_t. Free with + * cairo_font_options_destroy(). This function always returns a + * valid pointer; if memory cannot be allocated, then a special + * error object is returned where all operations on the object do nothing. + * You can check for this with cairo_font_options_status(). + * + * Since: 1.0 + **/ +cairo_font_options_t * +cairo_font_options_create (void) +{ + cairo_font_options_t *options; + + options = malloc (sizeof (cairo_font_options_t)); + if (!options) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_options_t *) &_cairo_font_options_nil; + } + + _cairo_font_options_init_default (options); + + return options; +} + +/** + * cairo_font_options_copy: + * @original: a #cairo_font_options_t + * + * Allocates a new font options object copying the option values from + * @original. + * + * Return value: a newly allocated #cairo_font_options_t. Free with + * cairo_font_options_destroy(). This function always returns a + * valid pointer; if memory cannot be allocated, then a special + * error object is returned where all operations on the object do nothing. + * You can check for this with cairo_font_options_status(). + * + * Since: 1.0 + **/ +cairo_font_options_t * +cairo_font_options_copy (const cairo_font_options_t *original) +{ + cairo_font_options_t *options; + + if (cairo_font_options_status ((cairo_font_options_t *) original)) + return (cairo_font_options_t *) &_cairo_font_options_nil; + + options = malloc (sizeof (cairo_font_options_t)); + if (!options) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_options_t *) &_cairo_font_options_nil; + } + + _cairo_font_options_init_copy (options, original); + + return options; +} + +/** + * cairo_font_options_destroy: + * @options: a #cairo_font_options_t + * + * Destroys a #cairo_font_options_t object created with + * cairo_font_options_create() or cairo_font_options_copy(). + * + * Since: 1.0 + **/ +void +cairo_font_options_destroy (cairo_font_options_t *options) +{ + if (cairo_font_options_status (options)) + return; + + free (options); +} + +/** + * cairo_font_options_status: + * @options: a #cairo_font_options_t + * + * Checks whether an error has previously occurred for this + * font options object + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.0 + **/ +cairo_status_t +cairo_font_options_status (cairo_font_options_t *options) +{ + if (options == NULL) + return CAIRO_STATUS_NULL_POINTER; + else if (options == (cairo_font_options_t *) &_cairo_font_options_nil) + return CAIRO_STATUS_NO_MEMORY; + else + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_font_options_status); + +/** + * cairo_font_options_merge: + * @options: a #cairo_font_options_t + * @other: another #cairo_font_options_t + * + * Merges non-default options from @other into @options, replacing + * existing values. This operation can be thought of as somewhat + * similar to compositing @other onto @options with the operation + * of %CAIRO_OPERATOR_OVER. + * + * Since: 1.0 + **/ +void +cairo_font_options_merge (cairo_font_options_t *options, + const cairo_font_options_t *other) +{ + if (cairo_font_options_status (options)) + return; + + if (cairo_font_options_status ((cairo_font_options_t *) other)) + return; + + if (other->antialias != CAIRO_ANTIALIAS_DEFAULT) + options->antialias = other->antialias; + if (other->subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) + options->subpixel_order = other->subpixel_order; + if (other->lcd_filter != CAIRO_LCD_FILTER_DEFAULT) + options->lcd_filter = other->lcd_filter; + if (other->hint_style != CAIRO_HINT_STYLE_DEFAULT) + options->hint_style = other->hint_style; + if (other->hint_metrics != CAIRO_HINT_METRICS_DEFAULT) + options->hint_metrics = other->hint_metrics; + if (other->round_glyph_positions != CAIRO_ROUND_GLYPH_POS_DEFAULT) + options->round_glyph_positions = other->round_glyph_positions; +} +slim_hidden_def (cairo_font_options_merge); + +/** + * cairo_font_options_equal: + * @options: a #cairo_font_options_t + * @other: another #cairo_font_options_t + * + * Compares two font options objects for equality. + * + * Return value: %TRUE if all fields of the two font options objects match. + * Note that this function will return %FALSE if either object is in + * error. + * + * Since: 1.0 + **/ +cairo_bool_t +cairo_font_options_equal (const cairo_font_options_t *options, + const cairo_font_options_t *other) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return FALSE; + if (cairo_font_options_status ((cairo_font_options_t *) other)) + return FALSE; + + if (options == other) + return TRUE; + + return (options->antialias == other->antialias && + options->subpixel_order == other->subpixel_order && + options->lcd_filter == other->lcd_filter && + options->hint_style == other->hint_style && + options->hint_metrics == other->hint_metrics && + options->round_glyph_positions == other->round_glyph_positions); +} +slim_hidden_def (cairo_font_options_equal); + +/** + * cairo_font_options_hash: + * @options: a #cairo_font_options_t + * + * Compute a hash for the font options object; this value will + * be useful when storing an object containing a #cairo_font_options_t + * in a hash table. + * + * Return value: the hash value for the font options object. + * The return value can be cast to a 32-bit type if a + * 32-bit hash value is needed. + * + * Since: 1.0 + **/ +unsigned long +cairo_font_options_hash (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + options = &_cairo_font_options_nil; /* force default values */ + + return ((options->antialias) | + (options->subpixel_order << 4) | + (options->lcd_filter << 8) | + (options->hint_style << 12) | + (options->hint_metrics << 16)); +} +slim_hidden_def (cairo_font_options_hash); + +/** + * cairo_font_options_set_antialias: + * @options: a #cairo_font_options_t + * @antialias: the new antialiasing mode + * + * Sets the antialiasing mode for the font options object. This + * specifies the type of antialiasing to do when rendering text. + * + * Since: 1.0 + **/ +void +cairo_font_options_set_antialias (cairo_font_options_t *options, + cairo_antialias_t antialias) +{ + if (cairo_font_options_status (options)) + return; + + options->antialias = antialias; +} +slim_hidden_def (cairo_font_options_set_antialias); + +/** + * cairo_font_options_get_antialias: + * @options: a #cairo_font_options_t + * + * Gets the antialiasing mode for the font options object. + * + * Return value: the antialiasing mode + * + * Since: 1.0 + **/ +cairo_antialias_t +cairo_font_options_get_antialias (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return CAIRO_ANTIALIAS_DEFAULT; + + return options->antialias; +} + +/** + * cairo_font_options_set_subpixel_order: + * @options: a #cairo_font_options_t + * @subpixel_order: the new subpixel order + * + * Sets the subpixel order for the font options object. The subpixel + * order specifies the order of color elements within each pixel on + * the display device when rendering with an antialiasing mode of + * %CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for + * #cairo_subpixel_order_t for full details. + * + * Since: 1.0 + **/ +void +cairo_font_options_set_subpixel_order (cairo_font_options_t *options, + cairo_subpixel_order_t subpixel_order) +{ + if (cairo_font_options_status (options)) + return; + + options->subpixel_order = subpixel_order; +} +slim_hidden_def (cairo_font_options_set_subpixel_order); + +/** + * cairo_font_options_get_subpixel_order: + * @options: a #cairo_font_options_t + * + * Gets the subpixel order for the font options object. + * See the documentation for #cairo_subpixel_order_t for full details. + * + * Return value: the subpixel order for the font options object + * + * Since: 1.0 + **/ +cairo_subpixel_order_t +cairo_font_options_get_subpixel_order (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return CAIRO_SUBPIXEL_ORDER_DEFAULT; + + return options->subpixel_order; +} + +/** + * _cairo_font_options_set_lcd_filter: + * @options: a #cairo_font_options_t + * @lcd_filter: the new LCD filter + * + * Sets the LCD filter for the font options object. The LCD filter + * specifies how pixels are filtered when rendered with an antialiasing + * mode of %CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for + * #cairo_lcd_filter_t for full details. + **/ +void +_cairo_font_options_set_lcd_filter (cairo_font_options_t *options, + cairo_lcd_filter_t lcd_filter) +{ + if (cairo_font_options_status (options)) + return; + + options->lcd_filter = lcd_filter; +} + +/** + * _cairo_font_options_get_lcd_filter: + * @options: a #cairo_font_options_t + * + * Gets the LCD filter for the font options object. + * See the documentation for #cairo_lcd_filter_t for full details. + * + * Return value: the LCD filter for the font options object + **/ +cairo_lcd_filter_t +_cairo_font_options_get_lcd_filter (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return CAIRO_LCD_FILTER_DEFAULT; + + return options->lcd_filter; +} + +/** + * _cairo_font_options_set_round_glyph_positions: + * @options: a #cairo_font_options_t + * @round: the new rounding value + * + * Sets the rounding options for the font options object. If rounding is set, a + * glyph's position will be rounded to integer values. + **/ +void +_cairo_font_options_set_round_glyph_positions (cairo_font_options_t *options, + cairo_round_glyph_positions_t round) +{ + if (cairo_font_options_status (options)) + return; + + options->round_glyph_positions = round; +} + +/** + * _cairo_font_options_get_round_glyph_positions: + * @options: a #cairo_font_options_t + * + * Gets the glyph position rounding option for the font options object. + * + * Return value: The round glyph posistions flag for the font options object. + **/ +cairo_round_glyph_positions_t +_cairo_font_options_get_round_glyph_positions (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return CAIRO_ROUND_GLYPH_POS_DEFAULT; + + return options->round_glyph_positions; +} + +/** + * cairo_font_options_set_hint_style: + * @options: a #cairo_font_options_t + * @hint_style: the new hint style + * + * Sets the hint style for font outlines for the font options object. + * This controls whether to fit font outlines to the pixel grid, + * and if so, whether to optimize for fidelity or contrast. + * See the documentation for #cairo_hint_style_t for full details. + * + * Since: 1.0 + **/ +void +cairo_font_options_set_hint_style (cairo_font_options_t *options, + cairo_hint_style_t hint_style) +{ + if (cairo_font_options_status (options)) + return; + + options->hint_style = hint_style; +} +slim_hidden_def (cairo_font_options_set_hint_style); + +/** + * cairo_font_options_get_hint_style: + * @options: a #cairo_font_options_t + * + * Gets the hint style for font outlines for the font options object. + * See the documentation for #cairo_hint_style_t for full details. + * + * Return value: the hint style for the font options object + * + * Since: 1.0 + **/ +cairo_hint_style_t +cairo_font_options_get_hint_style (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return CAIRO_HINT_STYLE_DEFAULT; + + return options->hint_style; +} + +/** + * cairo_font_options_set_hint_metrics: + * @options: a #cairo_font_options_t + * @hint_metrics: the new metrics hinting mode + * + * Sets the metrics hinting mode for the font options object. This + * controls whether metrics are quantized to integer values in + * device units. + * See the documentation for #cairo_hint_metrics_t for full details. + * + * Since: 1.0 + **/ +void +cairo_font_options_set_hint_metrics (cairo_font_options_t *options, + cairo_hint_metrics_t hint_metrics) +{ + if (cairo_font_options_status (options)) + return; + + options->hint_metrics = hint_metrics; +} +slim_hidden_def (cairo_font_options_set_hint_metrics); + +/** + * cairo_font_options_get_hint_metrics: + * @options: a #cairo_font_options_t + * + * Gets the metrics hinting mode for the font options object. + * See the documentation for #cairo_hint_metrics_t for full details. + * + * Return value: the metrics hinting mode for the font options object + * + * Since: 1.0 + **/ +cairo_hint_metrics_t +cairo_font_options_get_hint_metrics (const cairo_font_options_t *options) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return CAIRO_HINT_METRICS_DEFAULT; + + return options->hint_metrics; +} diff --git a/src/cairo-fontconfig-private.h b/src/cairo-fontconfig-private.h new file mode 100644 index 000000000..ea873abe7 --- /dev/null +++ b/src/cairo-fontconfig-private.h @@ -0,0 +1,78 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2000 Keith Packard + * Copyright © 2005 Red Hat, Inc + * Copyright © 2010 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Graydon Hoare + * Owen Taylor + * Keith Packard + * Carl Worth + * Chris Wilson + */ + +#ifndef _CAIRO_FONTCONFIG_PRIVATE_H +#define _CAIRO_FONTCONFIG_PRIVATE_H + +#include "cairo.h" + +#if CAIRO_HAS_FC_FONT +#include +#include +#endif + +/* sub-pixel order */ +#ifndef FC_RGBA_UNKNOWN +#define FC_RGBA_UNKNOWN 0 +#define FC_RGBA_RGB 1 +#define FC_RGBA_BGR 2 +#define FC_RGBA_VRGB 3 +#define FC_RGBA_VBGR 4 +#define FC_RGBA_NONE 5 +#endif + +/* hinting style */ +#ifndef FC_HINT_NONE +#define FC_HINT_NONE 0 +#define FC_HINT_SLIGHT 1 +#define FC_HINT_MEDIUM 2 +#define FC_HINT_FULL 3 +#endif + +/* LCD filter */ +#ifndef FC_LCD_NONE +#define FC_LCD_NONE 0 +#define FC_LCD_DEFAULT 1 +#define FC_LCD_LIGHT 2 +#define FC_LCD_LEGACY 3 +#endif + +#endif /* _CAIRO_FONTCONFIG_PRIVATE_H */ diff --git a/src/cairo-freed-pool-private.h b/src/cairo-freed-pool-private.h new file mode 100644 index 000000000..0ec6de3d1 --- /dev/null +++ b/src/cairo-freed-pool-private.h @@ -0,0 +1,139 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_FREED_POOL_H +#define CAIRO_FREED_POOL_H + +#include "cairoint.h" +#include "cairo-atomic-private.h" + +CAIRO_BEGIN_DECLS + +#define DISABLE_FREED_POOLS 0 + +#if HAS_ATOMIC_OPS && ! DISABLE_FREED_POOLS +/* Keep a stash of recently freed clip_paths, since we need to + * reallocate them frequently. + */ +#define MAX_FREED_POOL_SIZE 16 +typedef struct { + void *pool[MAX_FREED_POOL_SIZE]; + int top; +} freed_pool_t; + +static cairo_always_inline void * +_atomic_fetch (void **slot) +{ + void *ptr; + + do { + ptr = _cairo_atomic_ptr_get (slot); + } while (! _cairo_atomic_ptr_cmpxchg (slot, ptr, NULL)); + + return ptr; +} + +static cairo_always_inline cairo_bool_t +_atomic_store (void **slot, void *ptr) +{ + return _cairo_atomic_ptr_cmpxchg (slot, NULL, ptr); +} + +cairo_private void * +_freed_pool_get_search (freed_pool_t *pool); + +static inline void * +_freed_pool_get (freed_pool_t *pool) +{ + void *ptr; + int i; + + i = pool->top - 1; + if (i < 0) + i = 0; + + ptr = _atomic_fetch (&pool->pool[i]); + if (likely (ptr != NULL)) { + pool->top = i; + return ptr; + } + + /* either empty or contended */ + return _freed_pool_get_search (pool); +} + +cairo_private void +_freed_pool_put_search (freed_pool_t *pool, void *ptr); + +static inline void +_freed_pool_put (freed_pool_t *pool, void *ptr) +{ + int i; + + i = pool->top; + if (likely (i < ARRAY_LENGTH (pool->pool) && + _atomic_store (&pool->pool[i], ptr))) + { + pool->top = i + 1; + return; + } + + /* either full or contended */ + _freed_pool_put_search (pool, ptr); +} + +cairo_private void +_freed_pool_reset (freed_pool_t *pool); + +#define HAS_FREED_POOL 1 + +#else + +/* A warning about an unused freed-pool in a build without atomics + * enabled usually indicates a missing _freed_pool_reset() in the + * static reset function */ + +typedef int freed_pool_t; + +#define _freed_pool_get(pool) NULL +#define _freed_pool_put(pool, ptr) free(ptr) +#define _freed_pool_reset(ptr) + +#endif + +CAIRO_END_DECLS + +#endif /* CAIRO_FREED_POOL_PRIVATE_H */ diff --git a/src/cairo-freed-pool.c b/src/cairo-freed-pool.c new file mode 100644 index 000000000..cfdc8e96b --- /dev/null +++ b/src/cairo-freed-pool.c @@ -0,0 +1,93 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-freed-pool-private.h" + +#if HAS_FREED_POOL + +void * +_freed_pool_get_search (freed_pool_t *pool) +{ + void *ptr; + int i; + + for (i = ARRAY_LENGTH (pool->pool); i--;) { + ptr = _atomic_fetch (&pool->pool[i]); + if (ptr != NULL) { + pool->top = i; + return ptr; + } + } + + /* empty */ + pool->top = 0; + return NULL; +} + +void +_freed_pool_put_search (freed_pool_t *pool, void *ptr) +{ + int i; + + for (i = 0; i < ARRAY_LENGTH (pool->pool); i++) { + if (_atomic_store (&pool->pool[i], ptr)) { + pool->top = i + 1; + return; + } + } + + /* full */ + pool->top = i; + free (ptr); +} + +void +_freed_pool_reset (freed_pool_t *pool) +{ + int i; + + for (i = 0; i < ARRAY_LENGTH (pool->pool); i++) { + free (pool->pool[i]); + pool->pool[i] = NULL; + } + + pool->top = 0; +} + +#endif diff --git a/src/cairo-freelist-private.h b/src/cairo-freelist-private.h new file mode 100644 index 000000000..8fe6516f3 --- /dev/null +++ b/src/cairo-freelist-private.h @@ -0,0 +1,139 @@ +/* + * Copyright © 2006 Joonas Pihlaja + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ +#ifndef CAIRO_FREELIST_H +#define CAIRO_FREELIST_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" +#include "cairo-freelist-type-private.h" + +/* for stand-alone compilation*/ +#ifndef VG +#define VG(x) +#endif + +#ifndef NULL +#define NULL (void *) 0 +#endif + +/* Initialise a freelist that will be responsible for allocating + * nodes of size nodesize. */ +cairo_private void +_cairo_freelist_init (cairo_freelist_t *freelist, unsigned nodesize); + +/* Deallocate any nodes in the freelist. */ +cairo_private void +_cairo_freelist_fini (cairo_freelist_t *freelist); + +/* Allocate a new node from the freelist. If the freelist contains no + * nodes, a new one will be allocated using malloc(). The caller is + * responsible for calling _cairo_freelist_free() or free() on the + * returned node. Returns %NULL on memory allocation error. */ +cairo_private void * +_cairo_freelist_alloc (cairo_freelist_t *freelist); + +/* Allocate a new node from the freelist. If the freelist contains no + * nodes, a new one will be allocated using calloc(). The caller is + * responsible for calling _cairo_freelist_free() or free() on the + * returned node. Returns %NULL on memory allocation error. */ +cairo_private void * +_cairo_freelist_calloc (cairo_freelist_t *freelist); + +/* Return a node to the freelist. This does not deallocate the memory, + * but makes it available for later reuse by + * _cairo_freelist_alloc(). */ +cairo_private void +_cairo_freelist_free (cairo_freelist_t *freelist, void *node); + + +cairo_private void +_cairo_freepool_init (cairo_freepool_t *freepool, unsigned nodesize); + +cairo_private void +_cairo_freepool_fini (cairo_freepool_t *freepool); + +static inline void +_cairo_freepool_reset (cairo_freepool_t *freepool) +{ + while (freepool->pools != &freepool->embedded_pool) { + cairo_freelist_pool_t *pool = freepool->pools; + freepool->pools = pool->next; + pool->next = freepool->freepools; + freepool->freepools = pool; + } + + freepool->embedded_pool.rem = sizeof (freepool->embedded_data); + freepool->embedded_pool.data = freepool->embedded_data; +} + +cairo_private void * +_cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool); + +static inline void * +_cairo_freepool_alloc_from_pool (cairo_freepool_t *freepool) +{ + cairo_freelist_pool_t *pool; + uint8_t *ptr; + + pool = freepool->pools; + if (unlikely (freepool->nodesize > pool->rem)) + return _cairo_freepool_alloc_from_new_pool (freepool); + + ptr = pool->data; + pool->data += freepool->nodesize; + pool->rem -= freepool->nodesize; + VG (VALGRIND_MAKE_MEM_UNDEFINED (ptr, freepool->nodesize)); + return ptr; +} + +static inline void * +_cairo_freepool_alloc (cairo_freepool_t *freepool) +{ + cairo_freelist_node_t *node; + + node = freepool->first_free_node; + if (node == NULL) + return _cairo_freepool_alloc_from_pool (freepool); + + VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); + freepool->first_free_node = node->next; + VG (VALGRIND_MAKE_MEM_UNDEFINED (node, freepool->nodesize)); + + return node; +} + +cairo_private cairo_status_t +_cairo_freepool_alloc_array (cairo_freepool_t *freepool, + int count, + void **array); + +static inline void +_cairo_freepool_free (cairo_freepool_t *freepool, void *ptr) +{ + cairo_freelist_node_t *node = ptr; + + node->next = freepool->first_free_node; + freepool->first_free_node = node; + VG (VALGRIND_MAKE_MEM_NOACCESS (node, freepool->nodesize)); +} + +#endif /* CAIRO_FREELIST_H */ diff --git a/src/cairo-freelist-type-private.h b/src/cairo-freelist-type-private.h new file mode 100644 index 000000000..4dd056461 --- /dev/null +++ b/src/cairo-freelist-type-private.h @@ -0,0 +1,54 @@ +/* + * Copyright © 2010 Joonas Pihlaja + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ +#ifndef CAIRO_FREELIST_TYPE_H +#define CAIRO_FREELIST_TYPE_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" + +typedef struct _cairo_freelist_node cairo_freelist_node_t; +struct _cairo_freelist_node { + cairo_freelist_node_t *next; +}; + +typedef struct _cairo_freelist { + cairo_freelist_node_t *first_free_node; + unsigned nodesize; +} cairo_freelist_t; + +typedef struct _cairo_freelist_pool cairo_freelist_pool_t; +struct _cairo_freelist_pool { + cairo_freelist_pool_t *next; + unsigned size, rem; + uint8_t *data; +}; + +typedef struct _cairo_freepool { + cairo_freelist_node_t *first_free_node; + cairo_freelist_pool_t *pools; + cairo_freelist_pool_t *freepools; + unsigned nodesize; + cairo_freelist_pool_t embedded_pool; + uint8_t embedded_data[1000]; +} cairo_freepool_t; + +#endif /* CAIRO_FREELIST_TYPE_H */ diff --git a/src/cairo-freelist.c b/src/cairo-freelist.c new file mode 100644 index 000000000..d596eab81 --- /dev/null +++ b/src/cairo-freelist.c @@ -0,0 +1,191 @@ +/* + * Copyright © 2006 Joonas Pihlaja + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" + +void +_cairo_freelist_init (cairo_freelist_t *freelist, unsigned nodesize) +{ + memset (freelist, 0, sizeof (cairo_freelist_t)); + freelist->nodesize = nodesize; +} + +void +_cairo_freelist_fini (cairo_freelist_t *freelist) +{ + cairo_freelist_node_t *node = freelist->first_free_node; + while (node) { + cairo_freelist_node_t *next; + + VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); + next = node->next; + + free (node); + node = next; + } +} + +void * +_cairo_freelist_alloc (cairo_freelist_t *freelist) +{ + if (freelist->first_free_node) { + cairo_freelist_node_t *node; + + node = freelist->first_free_node; + VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); + freelist->first_free_node = node->next; + VG (VALGRIND_MAKE_MEM_UNDEFINED (node, freelist->nodesize)); + + return node; + } + + return malloc (freelist->nodesize); +} + +void * +_cairo_freelist_calloc (cairo_freelist_t *freelist) +{ + void *node = _cairo_freelist_alloc (freelist); + if (node) + memset (node, 0, freelist->nodesize); + return node; +} + +void +_cairo_freelist_free (cairo_freelist_t *freelist, void *voidnode) +{ + cairo_freelist_node_t *node = voidnode; + if (node) { + node->next = freelist->first_free_node; + freelist->first_free_node = node; + VG (VALGRIND_MAKE_MEM_NOACCESS (node, freelist->nodesize)); + } +} + +void +_cairo_freepool_init (cairo_freepool_t *freepool, unsigned nodesize) +{ + freepool->first_free_node = NULL; + freepool->pools = &freepool->embedded_pool; + freepool->freepools = NULL; + freepool->nodesize = nodesize; + + freepool->embedded_pool.next = NULL; + freepool->embedded_pool.size = sizeof (freepool->embedded_data); + freepool->embedded_pool.rem = sizeof (freepool->embedded_data); + freepool->embedded_pool.data = freepool->embedded_data; + + VG (VALGRIND_MAKE_MEM_NOACCESS (freepool->embedded_data, sizeof (freepool->embedded_data))); +} + +void +_cairo_freepool_fini (cairo_freepool_t *freepool) +{ + cairo_freelist_pool_t *pool; + + pool = freepool->pools; + while (pool != &freepool->embedded_pool) { + cairo_freelist_pool_t *next = pool->next; + free (pool); + pool = next; + } + + pool = freepool->freepools; + while (pool != NULL) { + cairo_freelist_pool_t *next = pool->next; + free (pool); + pool = next; + } + + VG (VALGRIND_MAKE_MEM_NOACCESS (freepool, sizeof (freepool))); +} + +void * +_cairo_freepool_alloc_from_new_pool (cairo_freepool_t *freepool) +{ + cairo_freelist_pool_t *pool; + int poolsize; + + if (freepool->freepools != NULL) { + pool = freepool->freepools; + freepool->freepools = pool->next; + + poolsize = pool->size; + } else { + if (freepool->pools != &freepool->embedded_pool) + poolsize = 2 * freepool->pools->size; + else + poolsize = (128 * freepool->nodesize + 8191) & -8192; + + pool = malloc (sizeof (cairo_freelist_pool_t) + poolsize); + if (unlikely (pool == NULL)) + return pool; + + pool->size = poolsize; + } + + pool->next = freepool->pools; + freepool->pools = pool; + + pool->rem = poolsize - freepool->nodesize; + pool->data = (uint8_t *) (pool + 1) + freepool->nodesize; + + VG (VALGRIND_MAKE_MEM_NOACCESS (pool->data, pool->rem)); + + return pool + 1; +} + +cairo_status_t +_cairo_freepool_alloc_array (cairo_freepool_t *freepool, + int count, + void **array) +{ + int i; + + for (i = 0; i < count; i++) { + cairo_freelist_node_t *node; + + node = freepool->first_free_node; + if (likely (node != NULL)) { + VG (VALGRIND_MAKE_MEM_DEFINED (node, sizeof (node->next))); + freepool->first_free_node = node->next; + VG (VALGRIND_MAKE_MEM_UNDEFINED (node, freepool->nodesize)); + } else { + node = _cairo_freepool_alloc_from_pool (freepool); + if (unlikely (node == NULL)) + goto CLEANUP; + } + + array[i] = node; + } + + return CAIRO_STATUS_SUCCESS; + + CLEANUP: + while (i--) + _cairo_freepool_free (freepool, array[i]); + + return _cairo_error (CAIRO_STATUS_NO_MEMORY); +} diff --git a/src/cairo-ft-font.c b/src/cairo-ft-font.c new file mode 100644 index 000000000..87e733bb7 --- /dev/null +++ b/src/cairo-ft-font.c @@ -0,0 +1,3577 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2000 Keith Packard + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Graydon Hoare + * Owen Taylor + * Keith Packard + * Carl Worth + */ + +#define _BSD_SOURCE /* for strdup() */ +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-ft-private.h" +#include "cairo-pattern-private.h" +#include "cairo-pixman-private.h" + +#include + +#include "cairo-fontconfig-private.h" + +#include +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_IMAGE_H +#include FT_BITMAP_H +#include FT_TRUETYPE_TABLES_H +#include FT_XFREE86_H +#if HAVE_FT_GLYPHSLOT_EMBOLDEN +#include FT_SYNTHESIS_H +#endif + +#if HAVE_FT_LIBRARY_SETLCDFILTER +#include FT_LCD_FILTER_H +#endif + +#if HAVE_UNISTD_H +#include +#else +#define access(p, m) 0 +#endif + +/* Fontconfig version older than 2.6 didn't have these options */ +#ifndef FC_LCD_FILTER +#define FC_LCD_FILTER "lcdfilter" +#endif +/* Some Ubuntu versions defined FC_LCD_FILTER without defining the following */ +#ifndef FC_LCD_NONE +#define FC_LCD_NONE 0 +#define FC_LCD_DEFAULT 1 +#define FC_LCD_LIGHT 2 +#define FC_LCD_LEGACY 3 +#endif + +/* FreeType version older than 2.3.5(?) didn't have these options */ +#ifndef FT_LCD_FILTER_NONE +#define FT_LCD_FILTER_NONE 0 +#define FT_LCD_FILTER_DEFAULT 1 +#define FT_LCD_FILTER_LIGHT 2 +#define FT_LCD_FILTER_LEGACY 16 +#endif + +#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) +#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) +#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) +#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0) + +/* This is the max number of FT_face objects we keep open at once + */ +#define MAX_OPEN_FACES 10 + +/** + * SECTION:cairo-ft + * @Title: FreeType Fonts + * @Short_Description: Font support for FreeType + * @See_Also: #cairo_font_face_t + * + * The FreeType font backend is primarily used to render text on GNU/Linux + * systems, but can be used on other platforms too. + **/ + +/** + * CAIRO_HAS_FT_FONT: + * + * Defined if the FreeType font backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.0 + **/ + +/** + * CAIRO_HAS_FC_FONT: + * + * Defined if the Fontconfig-specific functions of the FreeType font backend + * are available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.10 + **/ + +/* + * The simple 2x2 matrix is converted into separate scale and shape + * factors so that hinting works right + */ + +typedef struct _cairo_ft_font_transform { + double x_scale, y_scale; + double shape[2][2]; +} cairo_ft_font_transform_t; + +/* + * We create an object that corresponds to a single font on the disk; + * (identified by a filename/id pair) these are shared between all + * fonts using that file. For cairo_ft_font_face_create_for_ft_face(), we + * just create a one-off version with a permanent face value. + */ + +typedef struct _cairo_ft_font_face cairo_ft_font_face_t; + +struct _cairo_ft_unscaled_font { + cairo_unscaled_font_t base; + + cairo_bool_t from_face; /* was the FT_Face provided by user? */ + FT_Face face; /* provided or cached face */ + + /* only set if from_face is false */ + char *filename; + int id; + + /* We temporarily scale the unscaled font as needed */ + cairo_bool_t have_scale; + cairo_matrix_t current_scale; + double x_scale; /* Extracted X scale factor */ + double y_scale; /* Extracted Y scale factor */ + cairo_bool_t have_shape; /* true if the current scale has a non-scale component*/ + cairo_matrix_t current_shape; + FT_Matrix Current_Shape; + + cairo_mutex_t mutex; + int lock_count; + + cairo_ft_font_face_t *faces; /* Linked list of faces for this font */ +}; + +static int +_cairo_ft_unscaled_font_keys_equal (const void *key_a, + const void *key_b); + +static void +_cairo_ft_unscaled_font_fini (cairo_ft_unscaled_font_t *unscaled); + +typedef struct _cairo_ft_options { + cairo_font_options_t base; + unsigned int load_flags; /* flags for FT_Load_Glyph */ + unsigned int synth_flags; +} cairo_ft_options_t; + +struct _cairo_ft_font_face { + cairo_font_face_t base; + + cairo_ft_unscaled_font_t *unscaled; + cairo_ft_options_t ft_options; + cairo_ft_font_face_t *next; + +#if CAIRO_HAS_FC_FONT + FcPattern *pattern; /* if pattern is set, the above fields will be NULL */ + cairo_font_face_t *resolved_font_face; + FcConfig *resolved_config; +#endif +}; + +static const cairo_unscaled_font_backend_t cairo_ft_unscaled_font_backend; + +#if CAIRO_HAS_FC_FONT +static cairo_status_t +_cairo_ft_font_options_substitute (const cairo_font_options_t *options, + FcPattern *pattern); + +static cairo_font_face_t * +_cairo_ft_resolve_pattern (FcPattern *pattern, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options); + +#endif + +/* + * We maintain a hash table to map file/id => #cairo_ft_unscaled_font_t. + * The hash table itself isn't limited in size. However, we limit the + * number of FT_Face objects we keep around; when we've exceeded that + * limit and need to create a new FT_Face, we dump the FT_Face from a + * random #cairo_ft_unscaled_font_t which has an unlocked FT_Face, (if + * there are any). + */ + +typedef struct _cairo_ft_unscaled_font_map { + cairo_hash_table_t *hash_table; + FT_Library ft_library; + int num_open_faces; +} cairo_ft_unscaled_font_map_t; + +static cairo_ft_unscaled_font_map_t *cairo_ft_unscaled_font_map = NULL; + + +static FT_Face +_cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled); + +static void +_cairo_ft_unscaled_font_unlock_face (cairo_ft_unscaled_font_t *unscaled); + +static cairo_bool_t +_cairo_ft_scaled_font_is_vertical (cairo_scaled_font_t *scaled_font); + + +static void +_font_map_release_face_lock_held (cairo_ft_unscaled_font_map_t *font_map, + cairo_ft_unscaled_font_t *unscaled) +{ + if (unscaled->face) { + FT_Done_Face (unscaled->face); + unscaled->face = NULL; + unscaled->have_scale = FALSE; + + font_map->num_open_faces--; + } +} + +static cairo_status_t +_cairo_ft_unscaled_font_map_create (void) +{ + cairo_ft_unscaled_font_map_t *font_map; + + /* This function is only intended to be called from + * _cairo_ft_unscaled_font_map_lock. So we'll crash if we can + * detect some other call path. */ + assert (cairo_ft_unscaled_font_map == NULL); + + font_map = malloc (sizeof (cairo_ft_unscaled_font_map_t)); + if (unlikely (font_map == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font_map->hash_table = + _cairo_hash_table_create (_cairo_ft_unscaled_font_keys_equal); + + if (unlikely (font_map->hash_table == NULL)) + goto FAIL; + + if (unlikely (FT_Init_FreeType (&font_map->ft_library))) + goto FAIL; + + font_map->num_open_faces = 0; + + cairo_ft_unscaled_font_map = font_map; + return CAIRO_STATUS_SUCCESS; + +FAIL: + if (font_map->hash_table) + _cairo_hash_table_destroy (font_map->hash_table); + free (font_map); + + return _cairo_error (CAIRO_STATUS_NO_MEMORY); +} + + +static void +_cairo_ft_unscaled_font_map_pluck_entry (void *entry, void *closure) +{ + cairo_ft_unscaled_font_t *unscaled = entry; + cairo_ft_unscaled_font_map_t *font_map = closure; + + _cairo_hash_table_remove (font_map->hash_table, + &unscaled->base.hash_entry); + + if (! unscaled->from_face) + _font_map_release_face_lock_held (font_map, unscaled); + + _cairo_ft_unscaled_font_fini (unscaled); + free (unscaled); +} + +static void +_cairo_ft_unscaled_font_map_destroy (void) +{ + cairo_ft_unscaled_font_map_t *font_map; + + CAIRO_MUTEX_LOCK (_cairo_ft_unscaled_font_map_mutex); + font_map = cairo_ft_unscaled_font_map; + cairo_ft_unscaled_font_map = NULL; + CAIRO_MUTEX_UNLOCK (_cairo_ft_unscaled_font_map_mutex); + + if (font_map != NULL) { + _cairo_hash_table_foreach (font_map->hash_table, + _cairo_ft_unscaled_font_map_pluck_entry, + font_map); + assert (font_map->num_open_faces == 0); + + FT_Done_FreeType (font_map->ft_library); + + _cairo_hash_table_destroy (font_map->hash_table); + + free (font_map); + } +} + +static cairo_ft_unscaled_font_map_t * +_cairo_ft_unscaled_font_map_lock (void) +{ + CAIRO_MUTEX_LOCK (_cairo_ft_unscaled_font_map_mutex); + + if (unlikely (cairo_ft_unscaled_font_map == NULL)) { + if (unlikely (_cairo_ft_unscaled_font_map_create ())) { + CAIRO_MUTEX_UNLOCK (_cairo_ft_unscaled_font_map_mutex); + return NULL; + } + } + + return cairo_ft_unscaled_font_map; +} + +static void +_cairo_ft_unscaled_font_map_unlock (void) +{ + CAIRO_MUTEX_UNLOCK (_cairo_ft_unscaled_font_map_mutex); +} + +static void +_cairo_ft_unscaled_font_init_key (cairo_ft_unscaled_font_t *key, + cairo_bool_t from_face, + char *filename, + int id, + FT_Face face) +{ + unsigned long hash; + + key->from_face = from_face; + key->filename = filename; + key->id = id; + key->face = face; + + hash = _cairo_hash_string (filename); + /* the constants are just arbitrary primes */ + hash += ((unsigned long) id) * 1607; + hash += ((unsigned long) face) * 2137; + + key->base.hash_entry.hash = hash; +} + +/** + * _cairo_ft_unscaled_font_init: + * + * Initialize a #cairo_ft_unscaled_font_t. + * + * There are two basic flavors of #cairo_ft_unscaled_font_t, one + * created from an FT_Face and the other created from a filename/id + * pair. These two flavors are identified as from_face and !from_face. + * + * To initialize a from_face font, pass filename==%NULL, id=0 and the + * desired face. + * + * To initialize a !from_face font, pass the filename/id as desired + * and face==%NULL. + * + * Note that the code handles these two flavors in very distinct + * ways. For example there is a hash_table mapping + * filename/id->#cairo_unscaled_font_t in the !from_face case, but no + * parallel in the from_face case, (where the calling code would have + * to do its own mapping to ensure similar sharing). + **/ +static cairo_status_t +_cairo_ft_unscaled_font_init (cairo_ft_unscaled_font_t *unscaled, + cairo_bool_t from_face, + const char *filename, + int id, + FT_Face face) +{ + _cairo_unscaled_font_init (&unscaled->base, + &cairo_ft_unscaled_font_backend); + + if (from_face) { + unscaled->from_face = TRUE; + _cairo_ft_unscaled_font_init_key (unscaled, TRUE, NULL, 0, face); + } else { + char *filename_copy; + + unscaled->from_face = FALSE; + unscaled->face = NULL; + + filename_copy = strdup (filename); + if (unlikely (filename_copy == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_ft_unscaled_font_init_key (unscaled, FALSE, filename_copy, id, NULL); + } + + unscaled->have_scale = FALSE; + CAIRO_MUTEX_INIT (unscaled->mutex); + unscaled->lock_count = 0; + + unscaled->faces = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_ft_unscaled_font_fini: + * + * Free all data associated with a #cairo_ft_unscaled_font_t. + * + * CAUTION: The unscaled->face field must be %NULL before calling this + * function. This is because the #cairo_ft_unscaled_font_t_map keeps a + * count of these faces (font_map->num_open_faces) so it maintains the + * unscaled->face field while it has its lock held. See + * _font_map_release_face_lock_held(). + **/ +static void +_cairo_ft_unscaled_font_fini (cairo_ft_unscaled_font_t *unscaled) +{ + assert (unscaled->face == NULL); + + free (unscaled->filename); + unscaled->filename = NULL; + + CAIRO_MUTEX_FINI (unscaled->mutex); +} + +static int +_cairo_ft_unscaled_font_keys_equal (const void *key_a, + const void *key_b) +{ + const cairo_ft_unscaled_font_t *unscaled_a = key_a; + const cairo_ft_unscaled_font_t *unscaled_b = key_b; + + if (unscaled_a->id == unscaled_b->id && + unscaled_a->from_face == unscaled_b->from_face) + { + if (unscaled_a->from_face) + return unscaled_a->face == unscaled_b->face; + + if (unscaled_a->filename == NULL && unscaled_b->filename == NULL) + return TRUE; + else if (unscaled_a->filename == NULL || unscaled_b->filename == NULL) + return FALSE; + else + return (strcmp (unscaled_a->filename, unscaled_b->filename) == 0); + } + + return FALSE; +} + +/* Finds or creates a #cairo_ft_unscaled_font_t for the filename/id from + * pattern. Returns a new reference to the unscaled font. + */ +static cairo_status_t +_cairo_ft_unscaled_font_create_internal (cairo_bool_t from_face, + char *filename, + int id, + FT_Face font_face, + cairo_ft_unscaled_font_t **out) +{ + cairo_ft_unscaled_font_t key, *unscaled; + cairo_ft_unscaled_font_map_t *font_map; + cairo_status_t status; + + font_map = _cairo_ft_unscaled_font_map_lock (); + if (unlikely (font_map == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_ft_unscaled_font_init_key (&key, from_face, filename, id, font_face); + + /* Return existing unscaled font if it exists in the hash table. */ + unscaled = _cairo_hash_table_lookup (font_map->hash_table, + &key.base.hash_entry); + if (unscaled != NULL) { + _cairo_unscaled_font_reference (&unscaled->base); + goto DONE; + } + + /* Otherwise create it and insert into hash table. */ + unscaled = malloc (sizeof (cairo_ft_unscaled_font_t)); + if (unlikely (unscaled == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto UNWIND_FONT_MAP_LOCK; + } + + status = _cairo_ft_unscaled_font_init (unscaled, from_face, filename, id, font_face); + if (unlikely (status)) + goto UNWIND_UNSCALED_MALLOC; + + assert (unscaled->base.hash_entry.hash == key.base.hash_entry.hash); + status = _cairo_hash_table_insert (font_map->hash_table, + &unscaled->base.hash_entry); + if (unlikely (status)) + goto UNWIND_UNSCALED_FONT_INIT; + +DONE: + _cairo_ft_unscaled_font_map_unlock (); + *out = unscaled; + return CAIRO_STATUS_SUCCESS; + +UNWIND_UNSCALED_FONT_INIT: + _cairo_ft_unscaled_font_fini (unscaled); +UNWIND_UNSCALED_MALLOC: + free (unscaled); +UNWIND_FONT_MAP_LOCK: + _cairo_ft_unscaled_font_map_unlock (); + return status; +} + + +#if CAIRO_HAS_FC_FONT +static cairo_status_t +_cairo_ft_unscaled_font_create_for_pattern (FcPattern *pattern, + cairo_ft_unscaled_font_t **out) +{ + FT_Face font_face = NULL; + char *filename = NULL; + int id = 0; + FcResult ret; + + ret = FcPatternGetFTFace (pattern, FC_FT_FACE, 0, &font_face); + if (ret == FcResultMatch) + goto DONE; + if (ret == FcResultOutOfMemory) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + ret = FcPatternGetString (pattern, FC_FILE, 0, (FcChar8 **) &filename); + if (ret == FcResultOutOfMemory) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + if (ret == FcResultMatch) { + if (access (filename, R_OK) == 0) { + /* If FC_INDEX is not set, we just use 0 */ + ret = FcPatternGetInteger (pattern, FC_INDEX, 0, &id); + if (ret == FcResultOutOfMemory) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + goto DONE; + } else + return _cairo_error (CAIRO_STATUS_FILE_NOT_FOUND); + } + + /* The pattern contains neither a face nor a filename, resolve it later. */ + *out = NULL; + return CAIRO_STATUS_SUCCESS; + +DONE: + return _cairo_ft_unscaled_font_create_internal (font_face != NULL, + filename, id, font_face, + out); +} +#endif + +static cairo_status_t +_cairo_ft_unscaled_font_create_from_face (FT_Face face, + cairo_ft_unscaled_font_t **out) +{ + return _cairo_ft_unscaled_font_create_internal (TRUE, NULL, 0, face, out); +} + +static cairo_bool_t +_cairo_ft_unscaled_font_destroy (void *abstract_font) +{ + cairo_ft_unscaled_font_t *unscaled = abstract_font; + cairo_ft_unscaled_font_map_t *font_map; + + font_map = _cairo_ft_unscaled_font_map_lock (); + /* All created objects must have been mapped in the font map. */ + assert (font_map != NULL); + + if (! _cairo_reference_count_dec_and_test (&unscaled->base.ref_count)) { + /* somebody recreated the font whilst we waited for the lock */ + _cairo_ft_unscaled_font_map_unlock (); + return FALSE; + } + + _cairo_hash_table_remove (font_map->hash_table, + &unscaled->base.hash_entry); + + if (unscaled->from_face) { + /* See comments in _ft_font_face_destroy about the "zombie" state + * for a _ft_font_face. + */ + if (unscaled->faces && unscaled->faces->unscaled == NULL) { + assert (unscaled->faces->next == NULL); + cairo_font_face_destroy (&unscaled->faces->base); + } + } else { + _font_map_release_face_lock_held (font_map, unscaled); + } + unscaled->face = NULL; + + _cairo_ft_unscaled_font_map_unlock (); + + _cairo_ft_unscaled_font_fini (unscaled); + return TRUE; +} + +static cairo_bool_t +_has_unlocked_face (const void *entry) +{ + const cairo_ft_unscaled_font_t *unscaled = entry; + + return (!unscaled->from_face && unscaled->lock_count == 0 && unscaled->face); +} + +/* Ensures that an unscaled font has a face object. If we exceed + * MAX_OPEN_FACES, try to close some. + * + * This differs from _cairo_ft_scaled_font_lock_face in that it doesn't + * set the scale on the face, but just returns it at the last scale. + */ +static cairo_warn FT_Face +_cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) +{ + cairo_ft_unscaled_font_map_t *font_map; + FT_Face face = NULL; + + CAIRO_MUTEX_LOCK (unscaled->mutex); + unscaled->lock_count++; + + if (unscaled->face) + return unscaled->face; + + /* If this unscaled font was created from an FT_Face then we just + * returned it above. */ + assert (!unscaled->from_face); + + font_map = _cairo_ft_unscaled_font_map_lock (); + { + assert (font_map != NULL); + + while (font_map->num_open_faces >= MAX_OPEN_FACES) + { + cairo_ft_unscaled_font_t *entry; + + entry = _cairo_hash_table_random_entry (font_map->hash_table, + _has_unlocked_face); + if (entry == NULL) + break; + + _font_map_release_face_lock_held (font_map, entry); + } + } + _cairo_ft_unscaled_font_map_unlock (); + + if (FT_New_Face (font_map->ft_library, + unscaled->filename, + unscaled->id, + &face) != FT_Err_Ok) + { + unscaled->lock_count--; + CAIRO_MUTEX_UNLOCK (unscaled->mutex); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + unscaled->face = face; + + font_map->num_open_faces++; + + return face; +} + + +/* Unlock unscaled font locked with _cairo_ft_unscaled_font_lock_face + */ +static void +_cairo_ft_unscaled_font_unlock_face (cairo_ft_unscaled_font_t *unscaled) +{ + assert (unscaled->lock_count > 0); + + unscaled->lock_count--; + + CAIRO_MUTEX_UNLOCK (unscaled->mutex); +} + + +static cairo_status_t +_compute_transform (cairo_ft_font_transform_t *sf, + cairo_matrix_t *scale, + cairo_ft_unscaled_font_t *unscaled) +{ + cairo_status_t status; + double x_scale, y_scale; + cairo_matrix_t normalized = *scale; + + /* The font matrix has x and y "scale" components which we extract and + * use as character scale values. These influence the way freetype + * chooses hints, as well as selecting different bitmaps in + * hand-rendered fonts. We also copy the normalized matrix to + * freetype's transformation. + */ + + status = _cairo_matrix_compute_basis_scale_factors (scale, + &x_scale, &y_scale, + 1); + if (unlikely (status)) + return status; + + /* FreeType docs say this about x_scale and y_scale: + * "A character width or height smaller than 1pt is set to 1pt;" + * So, we cap them from below at 1.0 and let the FT transform + * take care of sub-1.0 scaling. */ + if (x_scale < 1.0) + x_scale = 1.0; + if (y_scale < 1.0) + y_scale = 1.0; + + if (unscaled && (unscaled->face->face_flags & FT_FACE_FLAG_SCALABLE) == 0) { + double min_distance = DBL_MAX; + cairo_bool_t magnify = TRUE; + int i; + double best_x_size = 0; + double best_y_size = 0; + + for (i = 0; i < unscaled->face->num_fixed_sizes; i++) { + double x_size = unscaled->face->available_sizes[i].x_ppem / 64.; + double y_size = unscaled->face->available_sizes[i].y_ppem / 64.; + double distance = y_size - y_scale; + + /* + * distance is positive if current strike is larger than desired + * size, and negative if smaller. + * + * We like to prefer down-scaling to upscaling. + */ + + if ((magnify && distance >= 0) || fabs (distance) <= min_distance) { + magnify = distance < 0; + min_distance = fabs (distance); + best_x_size = x_size; + best_y_size = y_size; + } + } + + x_scale = best_x_size; + y_scale = best_y_size; + } + + sf->x_scale = x_scale; + sf->y_scale = y_scale; + + cairo_matrix_scale (&normalized, 1.0 / x_scale, 1.0 / y_scale); + + _cairo_matrix_get_affine (&normalized, + &sf->shape[0][0], &sf->shape[0][1], + &sf->shape[1][0], &sf->shape[1][1], + NULL, NULL); + + return CAIRO_STATUS_SUCCESS; +} + +/* Temporarily scales an unscaled font to the give scale. We catch + * scaling to the same size, since changing a FT_Face is expensive. + */ +static cairo_status_t +_cairo_ft_unscaled_font_set_scale (cairo_ft_unscaled_font_t *unscaled, + cairo_matrix_t *scale) +{ + cairo_status_t status; + cairo_ft_font_transform_t sf; + FT_Matrix mat; + FT_Error error; + + assert (unscaled->face != NULL); + + if (unscaled->have_scale && + scale->xx == unscaled->current_scale.xx && + scale->yx == unscaled->current_scale.yx && + scale->xy == unscaled->current_scale.xy && + scale->yy == unscaled->current_scale.yy) + return CAIRO_STATUS_SUCCESS; + + unscaled->have_scale = TRUE; + unscaled->current_scale = *scale; + + status = _compute_transform (&sf, scale, unscaled); + if (unlikely (status)) + return status; + + unscaled->x_scale = sf.x_scale; + unscaled->y_scale = sf.y_scale; + + mat.xx = DOUBLE_TO_16_16(sf.shape[0][0]); + mat.yx = - DOUBLE_TO_16_16(sf.shape[0][1]); + mat.xy = - DOUBLE_TO_16_16(sf.shape[1][0]); + mat.yy = DOUBLE_TO_16_16(sf.shape[1][1]); + + unscaled->have_shape = (mat.xx != 0x10000 || + mat.yx != 0x00000 || + mat.xy != 0x00000 || + mat.yy != 0x10000); + + unscaled->Current_Shape = mat; + cairo_matrix_init (&unscaled->current_shape, + sf.shape[0][0], sf.shape[0][1], + sf.shape[1][0], sf.shape[1][1], + 0.0, 0.0); + + FT_Set_Transform(unscaled->face, &mat, NULL); + + error = FT_Set_Char_Size (unscaled->face, + sf.x_scale * 64.0 + .5, + sf.y_scale * 64.0 + .5, + 0, 0); + if (error) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} + +/* we sometimes need to convert the glyph bitmap in a FT_GlyphSlot + * into a different format. For example, we want to convert a + * FT_PIXEL_MODE_LCD or FT_PIXEL_MODE_LCD_V bitmap into a 32-bit + * ARGB or ABGR bitmap. + * + * this function prepares a target descriptor for this operation. + * + * input :: target bitmap descriptor. The function will set its + * 'width', 'rows' and 'pitch' fields, and only these + * + * slot :: the glyph slot containing the source bitmap. this + * function assumes that slot->format == FT_GLYPH_FORMAT_BITMAP + * + * mode :: the requested final rendering mode. supported values are + * MONO, NORMAL (i.e. gray), LCD and LCD_V + * + * the function returns the size in bytes of the corresponding buffer, + * it's up to the caller to allocate the corresponding memory block + * before calling _fill_xrender_bitmap + * + * it also returns -1 in case of error (e.g. incompatible arguments, + * like trying to convert a gray bitmap into a monochrome one) + */ +static int +_compute_xrender_bitmap_size(FT_Bitmap *target, + FT_GlyphSlot slot, + FT_Render_Mode mode) +{ + FT_Bitmap *ftbit; + int width, height, pitch; + + if (slot->format != FT_GLYPH_FORMAT_BITMAP) + return -1; + + /* compute the size of the final bitmap */ + ftbit = &slot->bitmap; + + width = ftbit->width; + height = ftbit->rows; + pitch = (width + 3) & ~3; + + switch (ftbit->pixel_mode) { + case FT_PIXEL_MODE_MONO: + if (mode == FT_RENDER_MODE_MONO) { + pitch = (((width + 31) & ~31) >> 3); + break; + } + /* fall-through */ + + case FT_PIXEL_MODE_GRAY: + if (mode == FT_RENDER_MODE_LCD || + mode == FT_RENDER_MODE_LCD_V) + { + /* each pixel is replicated into a 32-bit ARGB value */ + pitch = width * 4; + } + break; + + case FT_PIXEL_MODE_LCD: + if (mode != FT_RENDER_MODE_LCD) + return -1; + + /* horz pixel triplets are packed into 32-bit ARGB values */ + width /= 3; + pitch = width * 4; + break; + + case FT_PIXEL_MODE_LCD_V: + if (mode != FT_RENDER_MODE_LCD_V) + return -1; + + /* vert pixel triplets are packed into 32-bit ARGB values */ + height /= 3; + pitch = width * 4; + break; + + default: /* unsupported source format */ + return -1; + } + + target->width = width; + target->rows = height; + target->pitch = pitch; + target->buffer = NULL; + + return pitch * height; +} + +/* this functions converts the glyph bitmap found in a FT_GlyphSlot + * into a different format (see _compute_xrender_bitmap_size) + * + * you should call this function after _compute_xrender_bitmap_size + * + * target :: target bitmap descriptor. Note that its 'buffer' pointer + * must point to memory allocated by the caller + * + * slot :: the glyph slot containing the source bitmap + * + * mode :: the requested final rendering mode + * + * bgr :: boolean, set if BGR or VBGR pixel ordering is needed + */ +static void +_fill_xrender_bitmap(FT_Bitmap *target, + FT_GlyphSlot slot, + FT_Render_Mode mode, + int bgr) +{ + FT_Bitmap *ftbit = &slot->bitmap; + unsigned char *srcLine = ftbit->buffer; + unsigned char *dstLine = target->buffer; + int src_pitch = ftbit->pitch; + int width = target->width; + int height = target->rows; + int pitch = target->pitch; + int subpixel; + int h; + + subpixel = (mode == FT_RENDER_MODE_LCD || + mode == FT_RENDER_MODE_LCD_V); + + if (src_pitch < 0) + srcLine -= src_pitch * (ftbit->rows - 1); + + target->pixel_mode = ftbit->pixel_mode; + + switch (ftbit->pixel_mode) { + case FT_PIXEL_MODE_MONO: + if (subpixel) { + /* convert mono to ARGB32 values */ + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) { + int x; + + for (x = 0; x < width; x++) { + if (srcLine[(x >> 3)] & (0x80 >> (x & 7))) + ((unsigned int *) dstLine)[x] = 0xffffffffU; + } + } + target->pixel_mode = FT_PIXEL_MODE_LCD; + + } else if (mode == FT_RENDER_MODE_NORMAL) { + /* convert mono to 8-bit gray */ + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) { + int x; + + for (x = 0; x < width; x++) { + if (srcLine[(x >> 3)] & (0x80 >> (x & 7))) + dstLine[x] = 0xff; + } + } + target->pixel_mode = FT_PIXEL_MODE_GRAY; + + } else { + /* copy mono to mono */ + + int bytes = (width + 7) >> 3; + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) + memcpy (dstLine, srcLine, bytes); + } + break; + + case FT_PIXEL_MODE_GRAY: + if (subpixel) { + /* convert gray to ARGB32 values */ + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) { + int x; + unsigned int *dst = (unsigned int *) dstLine; + + for (x = 0; x < width; x++) { + unsigned int pix = srcLine[x]; + + pix |= (pix << 8); + pix |= (pix << 16); + + dst[x] = pix; + } + } + target->pixel_mode = FT_PIXEL_MODE_LCD; + } else { + /* copy gray into gray */ + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) + memcpy (dstLine, srcLine, width); + } + break; + + case FT_PIXEL_MODE_LCD: + if (!bgr) { + /* convert horizontal RGB into ARGB32 */ + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) { + int x; + unsigned char *src = srcLine; + unsigned int *dst = (unsigned int *) dstLine; + + for (x = 0; x < width; x++, src += 3) { + unsigned int pix; + + pix = ((unsigned int)src[0] << 16) | + ((unsigned int)src[1] << 8) | + ((unsigned int)src[2] ) | + ((unsigned int)src[1] << 24) ; + + dst[x] = pix; + } + } + } else { + /* convert horizontal BGR into ARGB32 */ + + for (h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch) { + + int x; + unsigned char *src = srcLine; + unsigned int *dst = (unsigned int *) dstLine; + + for (x = 0; x < width; x++, src += 3) { + unsigned int pix; + + pix = ((unsigned int)src[2] << 16) | + ((unsigned int)src[1] << 8) | + ((unsigned int)src[0] ) | + ((unsigned int)src[1] << 24) ; + + dst[x] = pix; + } + } + } + break; + + default: /* FT_PIXEL_MODE_LCD_V */ + /* convert vertical RGB into ARGB32 */ + if (!bgr) { + + for (h = height; h > 0; h--, srcLine += 3 * src_pitch, dstLine += pitch) { + int x; + unsigned char* src = srcLine; + unsigned int* dst = (unsigned int *) dstLine; + + for (x = 0; x < width; x++, src += 1) { + unsigned int pix; + pix = ((unsigned int)src[0] << 16) | + ((unsigned int)src[src_pitch] << 8) | + ((unsigned int)src[src_pitch*2] ) | + ((unsigned int)src[src_pitch] << 24) ; + dst[x] = pix; + } + } + } else { + + for (h = height; h > 0; h--, srcLine += 3*src_pitch, dstLine += pitch) { + int x; + unsigned char *src = srcLine; + unsigned int *dst = (unsigned int *) dstLine; + + for (x = 0; x < width; x++, src += 1) { + unsigned int pix; + + pix = ((unsigned int)src[src_pitch * 2] << 16) | + ((unsigned int)src[src_pitch] << 8) | + ((unsigned int)src[0] ) | + ((unsigned int)src[src_pitch] << 24) ; + + dst[x] = pix; + } + } + } + } +} + + +/* Fills in val->image with an image surface created from @bitmap + */ +static cairo_status_t +_get_bitmap_surface (FT_Bitmap *bitmap, + FT_Library library, + cairo_bool_t own_buffer, + cairo_font_options_t *font_options, + cairo_image_surface_t **surface) +{ + unsigned int width, height; + unsigned char *data; + int format = CAIRO_FORMAT_A8; + int stride; + cairo_image_surface_t *image; + cairo_bool_t component_alpha = FALSE; + + width = bitmap->width; + height = bitmap->rows; + + if (width == 0 || height == 0) { + *surface = (cairo_image_surface_t *) + cairo_image_surface_create_for_data (NULL, format, 0, 0, 0); + return (*surface)->base.status; + } + + switch (bitmap->pixel_mode) { + case FT_PIXEL_MODE_MONO: + stride = (((width + 31) & ~31) >> 3); + if (own_buffer) { + data = bitmap->buffer; + assert (stride == bitmap->pitch); + } else { + data = _cairo_malloc_ab (height, stride); + if (!data) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (stride == bitmap->pitch) { + memcpy (data, bitmap->buffer, stride * height); + } else { + int i; + unsigned char *source, *dest; + + source = bitmap->buffer; + dest = data; + for (i = height; i; i--) { + memcpy (dest, source, bitmap->pitch); + memset (dest + bitmap->pitch, '\0', stride - bitmap->pitch); + + source += bitmap->pitch; + dest += stride; + } + } + } + +#ifndef WORDS_BIGENDIAN + { + uint8_t *d = data; + int count = stride * height; + + while (count--) { + *d = CAIRO_BITSWAP8 (*d); + d++; + } + } +#endif + format = CAIRO_FORMAT_A1; + break; + + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + case FT_PIXEL_MODE_GRAY: + if (font_options->antialias != CAIRO_ANTIALIAS_SUBPIXEL || + bitmap->pixel_mode == FT_PIXEL_MODE_GRAY) + { + stride = bitmap->pitch; + + /* We don't support stride not multiple of 4. */ + if (stride & 3) + { + assert (!own_buffer); + goto convert; + } + + if (own_buffer) { + data = bitmap->buffer; + } else { + data = _cairo_malloc_ab (height, stride); + if (!data) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (data, bitmap->buffer, stride * height); + } + + format = CAIRO_FORMAT_A8; + } else { + data = bitmap->buffer; + stride = bitmap->pitch; + format = CAIRO_FORMAT_ARGB32; + component_alpha = TRUE; + } + break; +#ifdef FT_LOAD_COLOR + case FT_PIXEL_MODE_BGRA: + stride = width * 4; + if (own_buffer) { + data = bitmap->buffer; + } else { + data = _cairo_malloc_ab (height, stride); + if (!data) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (data, bitmap->buffer, stride * height); + } + format = CAIRO_FORMAT_ARGB32; + break; +#endif + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + convert: + if (!own_buffer && library) + { + /* This is pretty much the only case that we can get in here. */ + /* Convert to 8bit grayscale. */ + + FT_Bitmap tmp; + FT_Int align; + + format = CAIRO_FORMAT_A8; + + align = cairo_format_stride_for_width (format, bitmap->width); + + FT_Bitmap_New( &tmp ); + + if (FT_Bitmap_Convert( library, bitmap, &tmp, align )) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + + stride = bitmap->pitch; + data = _cairo_malloc_ab (height, stride); + if (!data) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (bitmap->num_grays != 256) + { + unsigned int x, y; + unsigned int mul = 255 / (bitmap->num_grays - 1); + FT_Byte *p = bitmap->buffer; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) + p[x] *= mul; + p += bitmap->pitch; + } + } + + memcpy (data, bitmap->buffer, stride * height); + break; + } + /* These could be triggered by very rare types of TrueType fonts */ + default: + if (own_buffer) + free (bitmap->buffer); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* XXX */ + *surface = image = (cairo_image_surface_t *) + cairo_image_surface_create_for_data (data, + format, + width, height, stride); + if (image->base.status) { + free (data); + return (*surface)->base.status; + } + + if (component_alpha) + pixman_image_set_component_alpha (image->pixman_image, TRUE); + + _cairo_image_surface_assume_ownership_of_data (image); + + _cairo_debug_check_image_surface_is_defined (&image->base); + + return CAIRO_STATUS_SUCCESS; +} + +/* Converts an outline FT_GlyphSlot into an image + * + * This could go through _render_glyph_bitmap as well, letting + * FreeType convert the outline to a bitmap, but doing it ourselves + * has two minor advantages: first, we save a copy of the bitmap + * buffer: we can directly use the buffer that FreeType renders + * into. + * + * Second, it may help when we add support for subpixel + * rendering: the Xft code does it this way. (Keith thinks that + * it may also be possible to get the subpixel rendering with + * FT_Render_Glyph: something worth looking into in more detail + * when we add subpixel support. If so, we may want to eliminate + * this version of the code path entirely. + */ +static cairo_status_t +_render_glyph_outline (FT_Face face, + cairo_font_options_t *font_options, + cairo_image_surface_t **surface) +{ + int rgba = FC_RGBA_UNKNOWN; + int lcd_filter = FT_LCD_FILTER_LEGACY; + FT_GlyphSlot glyphslot = face->glyph; + FT_Outline *outline = &glyphslot->outline; + FT_Bitmap bitmap; + FT_BBox cbox; + unsigned int width, height; + cairo_status_t status; + FT_Error fterror; + FT_Library library = glyphslot->library; + FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL; + + switch (font_options->antialias) { + case CAIRO_ANTIALIAS_NONE: + render_mode = FT_RENDER_MODE_MONO; + break; + + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_BEST: + switch (font_options->subpixel_order) { + case CAIRO_SUBPIXEL_ORDER_DEFAULT: + case CAIRO_SUBPIXEL_ORDER_RGB: + case CAIRO_SUBPIXEL_ORDER_BGR: + render_mode = FT_RENDER_MODE_LCD; + break; + + case CAIRO_SUBPIXEL_ORDER_VRGB: + case CAIRO_SUBPIXEL_ORDER_VBGR: + render_mode = FT_RENDER_MODE_LCD_V; + break; + } + + switch (font_options->lcd_filter) { + case CAIRO_LCD_FILTER_NONE: + lcd_filter = FT_LCD_FILTER_NONE; + break; + case CAIRO_LCD_FILTER_DEFAULT: + case CAIRO_LCD_FILTER_INTRA_PIXEL: + lcd_filter = FT_LCD_FILTER_LEGACY; + break; + case CAIRO_LCD_FILTER_FIR3: + lcd_filter = FT_LCD_FILTER_LIGHT; + break; + case CAIRO_LCD_FILTER_FIR5: + lcd_filter = FT_LCD_FILTER_DEFAULT; + break; + } + + break; + + case CAIRO_ANTIALIAS_DEFAULT: + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_GOOD: + case CAIRO_ANTIALIAS_FAST: + render_mode = FT_RENDER_MODE_NORMAL; + } + + FT_Outline_Get_CBox (outline, &cbox); + + cbox.xMin &= -64; + cbox.yMin &= -64; + cbox.xMax = (cbox.xMax + 63) & -64; + cbox.yMax = (cbox.yMax + 63) & -64; + + width = (unsigned int) ((cbox.xMax - cbox.xMin) >> 6); + height = (unsigned int) ((cbox.yMax - cbox.yMin) >> 6); + + if (width * height == 0) { + cairo_format_t format; + /* Looks like fb handles zero-sized images just fine */ + switch (render_mode) { + case FT_RENDER_MODE_MONO: + format = CAIRO_FORMAT_A1; + break; + case FT_RENDER_MODE_LCD: + case FT_RENDER_MODE_LCD_V: + format= CAIRO_FORMAT_ARGB32; + break; + case FT_RENDER_MODE_LIGHT: + case FT_RENDER_MODE_NORMAL: + case FT_RENDER_MODE_MAX: + default: + format = CAIRO_FORMAT_A8; + break; + } + + (*surface) = (cairo_image_surface_t *) + cairo_image_surface_create_for_data (NULL, format, 0, 0, 0); + if ((*surface)->base.status) + return (*surface)->base.status; + } else { + + int bitmap_size; + + switch (render_mode) { + case FT_RENDER_MODE_LCD: + if (font_options->subpixel_order == CAIRO_SUBPIXEL_ORDER_BGR) + rgba = FC_RGBA_BGR; + else + rgba = FC_RGBA_RGB; + break; + + case FT_RENDER_MODE_LCD_V: + if (font_options->subpixel_order == CAIRO_SUBPIXEL_ORDER_VBGR) + rgba = FC_RGBA_VBGR; + else + rgba = FC_RGBA_VRGB; + break; + + case FT_RENDER_MODE_MONO: + case FT_RENDER_MODE_LIGHT: + case FT_RENDER_MODE_NORMAL: + case FT_RENDER_MODE_MAX: + default: + break; + } + +#if HAVE_FT_LIBRARY_SETLCDFILTER + FT_Library_SetLcdFilter (library, lcd_filter); +#endif + + fterror = FT_Render_Glyph (face->glyph, render_mode); + +#if HAVE_FT_LIBRARY_SETLCDFILTER + FT_Library_SetLcdFilter (library, FT_LCD_FILTER_NONE); +#endif + + if (fterror != 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + bitmap_size = _compute_xrender_bitmap_size (&bitmap, + face->glyph, + render_mode); + if (bitmap_size < 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + bitmap.buffer = calloc (1, bitmap_size); + if (bitmap.buffer == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _fill_xrender_bitmap (&bitmap, face->glyph, render_mode, + (rgba == FC_RGBA_BGR || rgba == FC_RGBA_VBGR)); + + /* Note: + * _get_bitmap_surface will free bitmap.buffer if there is an error + */ + status = _get_bitmap_surface (&bitmap, NULL, TRUE, font_options, surface); + if (unlikely (status)) + return status; + + /* Note: the font's coordinate system is upside down from ours, so the + * Y coordinate of the control box needs to be negated. Moreover, device + * offsets are position of glyph origin relative to top left while xMin + * and yMax are offsets of top left relative to origin. Another negation. + */ + cairo_surface_set_device_offset (&(*surface)->base, + (double)-glyphslot->bitmap_left, + (double)+glyphslot->bitmap_top); + } + + return CAIRO_STATUS_SUCCESS; +} + +/* Converts a bitmap (or other) FT_GlyphSlot into an image */ +static cairo_status_t +_render_glyph_bitmap (FT_Face face, + cairo_font_options_t *font_options, + cairo_image_surface_t **surface) +{ + FT_GlyphSlot glyphslot = face->glyph; + cairo_status_t status; + FT_Error error; + + /* According to the FreeType docs, glyphslot->format could be + * something other than FT_GLYPH_FORMAT_OUTLINE or + * FT_GLYPH_FORMAT_BITMAP. Calling FT_Render_Glyph gives FreeType + * the opportunity to convert such to + * bitmap. FT_GLYPH_FORMAT_COMPOSITE will not be encountered since + * we avoid the FT_LOAD_NO_RECURSE flag. + */ + error = FT_Render_Glyph (glyphslot, FT_RENDER_MODE_NORMAL); + /* XXX ignoring all other errors for now. They are not fatal, typically + * just a glyph-not-found. */ + if (error == FT_Err_Out_Of_Memory) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _get_bitmap_surface (&glyphslot->bitmap, + glyphslot->library, + FALSE, font_options, + surface); + if (unlikely (status)) + return status; + + /* + * Note: the font's coordinate system is upside down from ours, so the + * Y coordinate of the control box needs to be negated. Moreover, device + * offsets are position of glyph origin relative to top left while + * bitmap_left and bitmap_top are offsets of top left relative to origin. + * Another negation. + */ + cairo_surface_set_device_offset (&(*surface)->base, + -glyphslot->bitmap_left, + +glyphslot->bitmap_top); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_transform_glyph_bitmap (cairo_matrix_t * shape, + cairo_image_surface_t ** surface) +{ + cairo_matrix_t original_to_transformed; + cairo_matrix_t transformed_to_original; + cairo_image_surface_t *old_image; + cairo_surface_t *image; + double x[4], y[4]; + double origin_x, origin_y; + int orig_width, orig_height; + int i; + int x_min, y_min, x_max, y_max; + int width, height; + cairo_status_t status; + cairo_surface_pattern_t pattern; + + /* We want to compute a transform that takes the origin + * (device_x_offset, device_y_offset) to 0,0, then applies + * the "shape" portion of the font transform + */ + original_to_transformed = *shape; + + cairo_surface_get_device_offset (&(*surface)->base, &origin_x, &origin_y); + orig_width = (*surface)->width; + orig_height = (*surface)->height; + + cairo_matrix_translate (&original_to_transformed, + -origin_x, -origin_y); + + /* Find the bounding box of the original bitmap under that + * transform + */ + x[0] = 0; y[0] = 0; + x[1] = orig_width; y[1] = 0; + x[2] = orig_width; y[2] = orig_height; + x[3] = 0; y[3] = orig_height; + + for (i = 0; i < 4; i++) + cairo_matrix_transform_point (&original_to_transformed, + &x[i], &y[i]); + + x_min = floor (x[0]); y_min = floor (y[0]); + x_max = ceil (x[0]); y_max = ceil (y[0]); + + for (i = 1; i < 4; i++) { + if (x[i] < x_min) + x_min = floor (x[i]); + else if (x[i] > x_max) + x_max = ceil (x[i]); + if (y[i] < y_min) + y_min = floor (y[i]); + else if (y[i] > y_max) + y_max = ceil (y[i]); + } + + /* Adjust the transform so that the bounding box starts at 0,0 ... + * this gives our final transform from original bitmap to transformed + * bitmap. + */ + original_to_transformed.x0 -= x_min; + original_to_transformed.y0 -= y_min; + + /* Create the transformed bitmap */ + width = x_max - x_min; + height = y_max - y_min; + + transformed_to_original = original_to_transformed; + status = cairo_matrix_invert (&transformed_to_original); + if (unlikely (status)) + return status; + + if ((*surface)->format == CAIRO_FORMAT_ARGB32 && + !pixman_image_get_component_alpha ((*surface)->pixman_image)) + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + else + image = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + if (unlikely (image->status)) + return image->status; + + /* Draw the original bitmap transformed into the new bitmap + */ + _cairo_pattern_init_for_surface (&pattern, &(*surface)->base); + cairo_pattern_set_matrix (&pattern.base, &transformed_to_original); + + status = _cairo_surface_paint (image, + CAIRO_OPERATOR_SOURCE, + &pattern.base, + NULL); + + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (image); + return status; + } + + /* Now update the cache entry for the new bitmap, recomputing + * the origin based on the final transform. + */ + cairo_matrix_transform_point (&original_to_transformed, + &origin_x, &origin_y); + + old_image = (*surface); + (*surface) = (cairo_image_surface_t *)image; + cairo_surface_destroy (&old_image->base); + + cairo_surface_set_device_offset (&(*surface)->base, + _cairo_lround (origin_x), + _cairo_lround (origin_y)); + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_unscaled_font_backend_t cairo_ft_unscaled_font_backend = { + _cairo_ft_unscaled_font_destroy, +#if 0 + _cairo_ft_unscaled_font_create_glyph +#endif +}; + +/* #cairo_ft_scaled_font_t */ + +typedef struct _cairo_ft_scaled_font { + cairo_scaled_font_t base; + cairo_ft_unscaled_font_t *unscaled; + cairo_ft_options_t ft_options; +} cairo_ft_scaled_font_t; + +static const cairo_scaled_font_backend_t _cairo_ft_scaled_font_backend; + +#if CAIRO_HAS_FC_FONT +/* The load flags passed to FT_Load_Glyph control aspects like hinting and + * antialiasing. Here we compute them from the fields of a FcPattern. + */ +static void +_get_pattern_ft_options (FcPattern *pattern, cairo_ft_options_t *ret) +{ + FcBool antialias, vertical_layout, hinting, autohint, bitmap, embolden; + cairo_ft_options_t ft_options; + int rgba; +#ifdef FC_HINT_STYLE + int hintstyle; +#endif + + _cairo_font_options_init_default (&ft_options.base); + ft_options.load_flags = FT_LOAD_DEFAULT; + ft_options.synth_flags = 0; + +#ifndef FC_EMBEDDED_BITMAP +#define FC_EMBEDDED_BITMAP "embeddedbitmap" +#endif + + /* Check whether to force use of embedded bitmaps */ + if (FcPatternGetBool (pattern, + FC_EMBEDDED_BITMAP, 0, &bitmap) != FcResultMatch) + bitmap = FcFalse; + + /* disable antialiasing if requested */ + if (FcPatternGetBool (pattern, + FC_ANTIALIAS, 0, &antialias) != FcResultMatch) + antialias = FcTrue; + + if (antialias) { + cairo_subpixel_order_t subpixel_order; + int lcd_filter; + + /* disable hinting if requested */ + if (FcPatternGetBool (pattern, + FC_HINTING, 0, &hinting) != FcResultMatch) + hinting = FcTrue; + + if (FcPatternGetInteger (pattern, + FC_RGBA, 0, &rgba) != FcResultMatch) + rgba = FC_RGBA_UNKNOWN; + + switch (rgba) { + case FC_RGBA_RGB: + subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB; + break; + case FC_RGBA_BGR: + subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR; + break; + case FC_RGBA_VRGB: + subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB; + break; + case FC_RGBA_VBGR: + subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR; + break; + case FC_RGBA_UNKNOWN: + case FC_RGBA_NONE: + default: + subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; + break; + } + + if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) { + ft_options.base.subpixel_order = subpixel_order; + ft_options.base.antialias = CAIRO_ANTIALIAS_SUBPIXEL; + } + + if (FcPatternGetInteger (pattern, + FC_LCD_FILTER, 0, &lcd_filter) == FcResultMatch) + { + switch (lcd_filter) { + case FC_LCD_NONE: + ft_options.base.lcd_filter = CAIRO_LCD_FILTER_NONE; + break; + case FC_LCD_DEFAULT: + ft_options.base.lcd_filter = CAIRO_LCD_FILTER_FIR5; + break; + case FC_LCD_LIGHT: + ft_options.base.lcd_filter = CAIRO_LCD_FILTER_FIR3; + break; + case FC_LCD_LEGACY: + ft_options.base.lcd_filter = CAIRO_LCD_FILTER_INTRA_PIXEL; + break; + } + } + +#ifdef FC_HINT_STYLE + if (FcPatternGetInteger (pattern, + FC_HINT_STYLE, 0, &hintstyle) != FcResultMatch) + hintstyle = FC_HINT_FULL; + + if (!hinting) + hintstyle = FC_HINT_NONE; + + switch (hintstyle) { + case FC_HINT_NONE: + ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE; + break; + case FC_HINT_SLIGHT: + ft_options.base.hint_style = CAIRO_HINT_STYLE_SLIGHT; + break; + case FC_HINT_MEDIUM: + default: + ft_options.base.hint_style = CAIRO_HINT_STYLE_MEDIUM; + break; + case FC_HINT_FULL: + ft_options.base.hint_style = CAIRO_HINT_STYLE_FULL; + break; + } +#else /* !FC_HINT_STYLE */ + if (!hinting) { + ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE; + } +#endif /* FC_HINT_STYLE */ + + /* Force embedded bitmaps off if no hinting requested */ + if (ft_options.base.hint_style == CAIRO_HINT_STYLE_NONE) + bitmap = FcFalse; + + if (!bitmap) + ft_options.load_flags |= FT_LOAD_NO_BITMAP; + + } else { + ft_options.base.antialias = CAIRO_ANTIALIAS_NONE; + } + + /* force autohinting if requested */ + if (FcPatternGetBool (pattern, + FC_AUTOHINT, 0, &autohint) != FcResultMatch) + autohint = FcFalse; + + if (autohint) + ft_options.load_flags |= FT_LOAD_FORCE_AUTOHINT; + + if (FcPatternGetBool (pattern, + FC_VERTICAL_LAYOUT, 0, &vertical_layout) != FcResultMatch) + vertical_layout = FcFalse; + + if (vertical_layout) + ft_options.load_flags |= FT_LOAD_VERTICAL_LAYOUT; + +#ifndef FC_EMBOLDEN +#define FC_EMBOLDEN "embolden" +#endif + if (FcPatternGetBool (pattern, + FC_EMBOLDEN, 0, &embolden) != FcResultMatch) + embolden = FcFalse; + + if (embolden) + ft_options.synth_flags |= CAIRO_FT_SYNTHESIZE_BOLD; + + *ret = ft_options; +} +#endif + +static void +_cairo_ft_options_merge (cairo_ft_options_t *options, + cairo_ft_options_t *other) +{ + int load_flags = other->load_flags; + int load_target = FT_LOAD_TARGET_NORMAL; + + /* clear load target mode */ + load_flags &= ~(FT_LOAD_TARGET_(FT_LOAD_TARGET_MODE(other->load_flags))); + + if (load_flags & FT_LOAD_NO_HINTING) + other->base.hint_style = CAIRO_HINT_STYLE_NONE; + + if (other->base.antialias == CAIRO_ANTIALIAS_NONE || + options->base.antialias == CAIRO_ANTIALIAS_NONE) { + options->base.antialias = CAIRO_ANTIALIAS_NONE; + options->base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; + } + + if (other->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL && + (options->base.antialias == CAIRO_ANTIALIAS_DEFAULT || + options->base.antialias == CAIRO_ANTIALIAS_GRAY)) { + options->base.antialias = CAIRO_ANTIALIAS_SUBPIXEL; + options->base.subpixel_order = other->base.subpixel_order; + } + + if (options->base.hint_style == CAIRO_HINT_STYLE_DEFAULT) + options->base.hint_style = other->base.hint_style; + + if (other->base.hint_style == CAIRO_HINT_STYLE_NONE) + options->base.hint_style = CAIRO_HINT_STYLE_NONE; + + if (options->base.lcd_filter == CAIRO_LCD_FILTER_DEFAULT) + options->base.lcd_filter = other->base.lcd_filter; + + if (other->base.lcd_filter == CAIRO_LCD_FILTER_NONE) + options->base.lcd_filter = CAIRO_LCD_FILTER_NONE; + + if (options->base.antialias == CAIRO_ANTIALIAS_NONE) { + if (options->base.hint_style == CAIRO_HINT_STYLE_NONE) + load_flags |= FT_LOAD_NO_HINTING; + else + load_target = FT_LOAD_TARGET_MONO; + load_flags |= FT_LOAD_MONOCHROME; + } else { + switch (options->base.hint_style) { + case CAIRO_HINT_STYLE_NONE: + load_flags |= FT_LOAD_NO_HINTING; + break; + case CAIRO_HINT_STYLE_SLIGHT: + load_target = FT_LOAD_TARGET_LIGHT; + break; + case CAIRO_HINT_STYLE_MEDIUM: + break; + case CAIRO_HINT_STYLE_FULL: + case CAIRO_HINT_STYLE_DEFAULT: + if (options->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL) { + switch (options->base.subpixel_order) { + case CAIRO_SUBPIXEL_ORDER_DEFAULT: + case CAIRO_SUBPIXEL_ORDER_RGB: + case CAIRO_SUBPIXEL_ORDER_BGR: + load_target = FT_LOAD_TARGET_LCD; + break; + case CAIRO_SUBPIXEL_ORDER_VRGB: + case CAIRO_SUBPIXEL_ORDER_VBGR: + load_target = FT_LOAD_TARGET_LCD_V; + break; + } + } + break; + } + } + + options->load_flags = load_flags | load_target; + options->synth_flags = other->synth_flags; +} + +static cairo_status_t +_cairo_ft_font_face_scaled_font_create (void *abstract_font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **font_out) +{ + cairo_ft_font_face_t *font_face = abstract_font_face; + cairo_ft_scaled_font_t *scaled_font; + FT_Face face; + FT_Size_Metrics *metrics; + cairo_font_extents_t fs_metrics; + cairo_status_t status; + cairo_ft_unscaled_font_t *unscaled; + + assert (font_face->unscaled); + + face = _cairo_ft_unscaled_font_lock_face (font_face->unscaled); + if (unlikely (face == NULL)) /* backend error */ + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + scaled_font = malloc (sizeof (cairo_ft_scaled_font_t)); + if (unlikely (scaled_font == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL; + } + + scaled_font->unscaled = unscaled = font_face->unscaled; + _cairo_unscaled_font_reference (&unscaled->base); + + _cairo_font_options_init_copy (&scaled_font->ft_options.base, options); + _cairo_ft_options_merge (&scaled_font->ft_options, &font_face->ft_options); + + status = _cairo_scaled_font_init (&scaled_font->base, + &font_face->base, + font_matrix, ctm, options, + &_cairo_ft_scaled_font_backend); + if (unlikely (status)) + goto CLEANUP_SCALED_FONT; + + status = _cairo_ft_unscaled_font_set_scale (unscaled, + &scaled_font->base.scale); + if (unlikely (status)) { + /* This can only fail if we encounter an error with the underlying + * font, so propagate the error back to the font-face. */ + _cairo_ft_unscaled_font_unlock_face (unscaled); + _cairo_unscaled_font_destroy (&unscaled->base); + free (scaled_font); + return status; + } + + + metrics = &face->size->metrics; + + /* + * Get to unscaled metrics so that the upper level can get back to + * user space + * + * Also use this path for bitmap-only fonts. The other branch uses + * face members that are only relevant for scalable fonts. This is + * detected by simply checking for units_per_EM==0. + */ + if (scaled_font->base.options.hint_metrics != CAIRO_HINT_METRICS_OFF || + face->units_per_EM == 0) { + double x_factor, y_factor; + + if (unscaled->x_scale == 0) + x_factor = 0; + else + x_factor = 1 / unscaled->x_scale; + + if (unscaled->y_scale == 0) + y_factor = 0; + else + y_factor = 1 / unscaled->y_scale; + + fs_metrics.ascent = DOUBLE_FROM_26_6(metrics->ascender) * y_factor; + fs_metrics.descent = DOUBLE_FROM_26_6(- metrics->descender) * y_factor; + fs_metrics.height = DOUBLE_FROM_26_6(metrics->height) * y_factor; + if (!_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) { + fs_metrics.max_x_advance = DOUBLE_FROM_26_6(metrics->max_advance) * x_factor; + fs_metrics.max_y_advance = 0; + } else { + fs_metrics.max_x_advance = 0; + fs_metrics.max_y_advance = DOUBLE_FROM_26_6(metrics->max_advance) * y_factor; + } + } else { + double scale = face->units_per_EM; + + fs_metrics.ascent = face->ascender / scale; + fs_metrics.descent = - face->descender / scale; + fs_metrics.height = face->height / scale; + if (!_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) { + fs_metrics.max_x_advance = face->max_advance_width / scale; + fs_metrics.max_y_advance = 0; + } else { + fs_metrics.max_x_advance = 0; + fs_metrics.max_y_advance = face->max_advance_height / scale; + } + } + + status = _cairo_scaled_font_set_metrics (&scaled_font->base, &fs_metrics); + if (unlikely (status)) + goto CLEANUP_SCALED_FONT; + + _cairo_ft_unscaled_font_unlock_face (unscaled); + + *font_out = &scaled_font->base; + return CAIRO_STATUS_SUCCESS; + + CLEANUP_SCALED_FONT: + _cairo_unscaled_font_destroy (&unscaled->base); + free (scaled_font); + FAIL: + _cairo_ft_unscaled_font_unlock_face (font_face->unscaled); + *font_out = _cairo_scaled_font_create_in_error (status); + return CAIRO_STATUS_SUCCESS; /* non-backend error */ +} + +cairo_bool_t +_cairo_scaled_font_is_ft (cairo_scaled_font_t *scaled_font) +{ + return scaled_font->backend == &_cairo_ft_scaled_font_backend; +} + +static void +_cairo_ft_scaled_font_fini (void *abstract_font) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + + if (scaled_font == NULL) + return; + + _cairo_unscaled_font_destroy (&scaled_font->unscaled->base); +} + +static int +_move_to (FT_Vector *to, void *closure) +{ + cairo_path_fixed_t *path = closure; + cairo_fixed_t x, y; + + x = _cairo_fixed_from_26_6 (to->x); + y = _cairo_fixed_from_26_6 (to->y); + + if (_cairo_path_fixed_close_path (path) != CAIRO_STATUS_SUCCESS) + return 1; + if (_cairo_path_fixed_move_to (path, x, y) != CAIRO_STATUS_SUCCESS) + return 1; + + return 0; +} + +static int +_line_to (FT_Vector *to, void *closure) +{ + cairo_path_fixed_t *path = closure; + cairo_fixed_t x, y; + + x = _cairo_fixed_from_26_6 (to->x); + y = _cairo_fixed_from_26_6 (to->y); + + if (_cairo_path_fixed_line_to (path, x, y) != CAIRO_STATUS_SUCCESS) + return 1; + + return 0; +} + +static int +_conic_to (FT_Vector *control, FT_Vector *to, void *closure) +{ + cairo_path_fixed_t *path = closure; + + cairo_fixed_t x0, y0; + cairo_fixed_t x1, y1; + cairo_fixed_t x2, y2; + cairo_fixed_t x3, y3; + cairo_point_t conic; + + if (! _cairo_path_fixed_get_current_point (path, &x0, &y0)) + return 1; + + conic.x = _cairo_fixed_from_26_6 (control->x); + conic.y = _cairo_fixed_from_26_6 (control->y); + + x3 = _cairo_fixed_from_26_6 (to->x); + y3 = _cairo_fixed_from_26_6 (to->y); + + x1 = x0 + 2.0/3.0 * (conic.x - x0); + y1 = y0 + 2.0/3.0 * (conic.y - y0); + + x2 = x3 + 2.0/3.0 * (conic.x - x3); + y2 = y3 + 2.0/3.0 * (conic.y - y3); + + if (_cairo_path_fixed_curve_to (path, + x1, y1, + x2, y2, + x3, y3) != CAIRO_STATUS_SUCCESS) + return 1; + + return 0; +} + +static int +_cubic_to (FT_Vector *control1, FT_Vector *control2, + FT_Vector *to, void *closure) +{ + cairo_path_fixed_t *path = closure; + cairo_fixed_t x0, y0; + cairo_fixed_t x1, y1; + cairo_fixed_t x2, y2; + + x0 = _cairo_fixed_from_26_6 (control1->x); + y0 = _cairo_fixed_from_26_6 (control1->y); + + x1 = _cairo_fixed_from_26_6 (control2->x); + y1 = _cairo_fixed_from_26_6 (control2->y); + + x2 = _cairo_fixed_from_26_6 (to->x); + y2 = _cairo_fixed_from_26_6 (to->y); + + if (_cairo_path_fixed_curve_to (path, + x0, y0, + x1, y1, + x2, y2) != CAIRO_STATUS_SUCCESS) + return 1; + + return 0; +} + +static cairo_status_t +_decompose_glyph_outline (FT_Face face, + cairo_font_options_t *options, + cairo_path_fixed_t **pathp) +{ + static const FT_Outline_Funcs outline_funcs = { + (FT_Outline_MoveToFunc)_move_to, + (FT_Outline_LineToFunc)_line_to, + (FT_Outline_ConicToFunc)_conic_to, + (FT_Outline_CubicToFunc)_cubic_to, + 0, /* shift */ + 0, /* delta */ + }; + static const FT_Matrix invert_y = { + DOUBLE_TO_16_16 (1.0), 0, + 0, DOUBLE_TO_16_16 (-1.0), + }; + + FT_GlyphSlot glyph; + cairo_path_fixed_t *path; + cairo_status_t status; + + path = _cairo_path_fixed_create (); + if (!path) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + glyph = face->glyph; + + /* Font glyphs have an inverted Y axis compared to cairo. */ + FT_Outline_Transform (&glyph->outline, &invert_y); + if (FT_Outline_Decompose (&glyph->outline, &outline_funcs, path)) { + _cairo_path_fixed_destroy (path); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + status = _cairo_path_fixed_close_path (path); + if (unlikely (status)) { + _cairo_path_fixed_destroy (path); + return status; + } + + *pathp = path; + + return CAIRO_STATUS_SUCCESS; +} + +/* + * Translate glyph to match its metrics. + */ +static void +_cairo_ft_scaled_glyph_vertical_layout_bearing_fix (void *abstract_font, + FT_GlyphSlot glyph) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + FT_Vector vector; + + vector.x = glyph->metrics.vertBearingX - glyph->metrics.horiBearingX; + vector.y = -glyph->metrics.vertBearingY - glyph->metrics.horiBearingY; + + if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) { + FT_Vector_Transform (&vector, &scaled_font->unscaled->Current_Shape); + FT_Outline_Translate(&glyph->outline, vector.x, vector.y); + } else if (glyph->format == FT_GLYPH_FORMAT_BITMAP) { + glyph->bitmap_left += vector.x / 64; + glyph->bitmap_top += vector.y / 64; + } +} + +static cairo_int_status_t +_cairo_ft_scaled_glyph_init (void *abstract_font, + cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_info_t info) +{ + cairo_text_extents_t fs_metrics; + cairo_ft_scaled_font_t *scaled_font = abstract_font; + cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; + FT_GlyphSlot glyph; + FT_Face face; + FT_Error error; + int load_flags = scaled_font->ft_options.load_flags; + FT_Glyph_Metrics *metrics; + double x_factor, y_factor; + cairo_bool_t vertical_layout = FALSE; + cairo_status_t status; + + face = _cairo_ft_unscaled_font_lock_face (unscaled); + if (!face) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_ft_unscaled_font_set_scale (scaled_font->unscaled, + &scaled_font->base.scale); + if (unlikely (status)) + goto FAIL; + + /* Ignore global advance unconditionally */ + load_flags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; + + if ((info & CAIRO_SCALED_GLYPH_INFO_PATH) != 0 && + (info & CAIRO_SCALED_GLYPH_INFO_SURFACE) == 0) + load_flags |= FT_LOAD_NO_BITMAP; + + /* + * Don't pass FT_LOAD_VERTICAL_LAYOUT to FT_Load_Glyph here as + * suggested by freetype people. + */ + if (load_flags & FT_LOAD_VERTICAL_LAYOUT) { + load_flags &= ~FT_LOAD_VERTICAL_LAYOUT; + vertical_layout = TRUE; + } + +#ifdef FT_LOAD_COLOR + /* Color-glyph support: + * + * This flags needs plumbing through fontconfig (does it?), and + * maybe we should cache color and grayscale bitmaps separately + * such that users of the font (ie. the surface) can choose which + * version to use based on target content type. + * + * Moreover, none of our backends and compositors currently support + * color glyphs. As such, this is currently disabled. + */ + /* load_flags |= FT_LOAD_COLOR; */ +#endif + + error = FT_Load_Glyph (face, + _cairo_scaled_glyph_index(scaled_glyph), + load_flags); + /* XXX ignoring all other errors for now. They are not fatal, typically + * just a glyph-not-found. */ + if (error == FT_Err_Out_Of_Memory) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL; + } + + glyph = face->glyph; + + /* + * synthesize glyphs if requested + */ +#if HAVE_FT_GLYPHSLOT_EMBOLDEN + if (scaled_font->ft_options.synth_flags & CAIRO_FT_SYNTHESIZE_BOLD) + FT_GlyphSlot_Embolden (glyph); +#endif + +#if HAVE_FT_GLYPHSLOT_OBLIQUE + if (scaled_font->ft_options.synth_flags & CAIRO_FT_SYNTHESIZE_OBLIQUE) + FT_GlyphSlot_Oblique (glyph); +#endif + + if (vertical_layout) + _cairo_ft_scaled_glyph_vertical_layout_bearing_fix (scaled_font, glyph); + + if (info & CAIRO_SCALED_GLYPH_INFO_METRICS) { + + cairo_bool_t hint_metrics = scaled_font->base.options.hint_metrics != CAIRO_HINT_METRICS_OFF; + /* + * Compute font-space metrics + */ + metrics = &glyph->metrics; + + if (unscaled->x_scale == 0) + x_factor = 0; + else + x_factor = 1 / unscaled->x_scale; + + if (unscaled->y_scale == 0) + y_factor = 0; + else + y_factor = 1 / unscaled->y_scale; + + /* + * Note: Y coordinates of the horizontal bearing need to be negated. + * + * Scale metrics back to glyph space from the scaled glyph space returned + * by FreeType + * + * If we want hinted metrics but aren't asking for hinted glyphs from + * FreeType, then we need to do the metric hinting ourselves. + */ + + if (hint_metrics && (load_flags & FT_LOAD_NO_HINTING)) + { + FT_Pos x1, x2; + FT_Pos y1, y2; + FT_Pos advance; + + if (!vertical_layout) { + x1 = (metrics->horiBearingX) & -64; + x2 = (metrics->horiBearingX + metrics->width + 63) & -64; + y1 = (-metrics->horiBearingY) & -64; + y2 = (-metrics->horiBearingY + metrics->height + 63) & -64; + + advance = ((metrics->horiAdvance + 32) & -64); + + fs_metrics.x_bearing = DOUBLE_FROM_26_6 (x1) * x_factor; + fs_metrics.y_bearing = DOUBLE_FROM_26_6 (y1) * y_factor; + + fs_metrics.width = DOUBLE_FROM_26_6 (x2 - x1) * x_factor; + fs_metrics.height = DOUBLE_FROM_26_6 (y2 - y1) * y_factor; + + fs_metrics.x_advance = DOUBLE_FROM_26_6 (advance) * x_factor; + fs_metrics.y_advance = 0; + } else { + x1 = (metrics->vertBearingX) & -64; + x2 = (metrics->vertBearingX + metrics->width + 63) & -64; + y1 = (metrics->vertBearingY) & -64; + y2 = (metrics->vertBearingY + metrics->height + 63) & -64; + + advance = ((metrics->vertAdvance + 32) & -64); + + fs_metrics.x_bearing = DOUBLE_FROM_26_6 (x1) * x_factor; + fs_metrics.y_bearing = DOUBLE_FROM_26_6 (y1) * y_factor; + + fs_metrics.width = DOUBLE_FROM_26_6 (x2 - x1) * x_factor; + fs_metrics.height = DOUBLE_FROM_26_6 (y2 - y1) * y_factor; + + fs_metrics.x_advance = 0; + fs_metrics.y_advance = DOUBLE_FROM_26_6 (advance) * y_factor; + } + } else { + fs_metrics.width = DOUBLE_FROM_26_6 (metrics->width) * x_factor; + fs_metrics.height = DOUBLE_FROM_26_6 (metrics->height) * y_factor; + + if (!vertical_layout) { + fs_metrics.x_bearing = DOUBLE_FROM_26_6 (metrics->horiBearingX) * x_factor; + fs_metrics.y_bearing = DOUBLE_FROM_26_6 (-metrics->horiBearingY) * y_factor; + + if (hint_metrics || glyph->format != FT_GLYPH_FORMAT_OUTLINE) + fs_metrics.x_advance = DOUBLE_FROM_26_6 (metrics->horiAdvance) * x_factor; + else + fs_metrics.x_advance = DOUBLE_FROM_16_16 (glyph->linearHoriAdvance) * x_factor; + fs_metrics.y_advance = 0 * y_factor; + } else { + fs_metrics.x_bearing = DOUBLE_FROM_26_6 (metrics->vertBearingX) * x_factor; + fs_metrics.y_bearing = DOUBLE_FROM_26_6 (metrics->vertBearingY) * y_factor; + + fs_metrics.x_advance = 0 * x_factor; + if (hint_metrics || glyph->format != FT_GLYPH_FORMAT_OUTLINE) + fs_metrics.y_advance = DOUBLE_FROM_26_6 (metrics->vertAdvance) * y_factor; + else + fs_metrics.y_advance = DOUBLE_FROM_16_16 (glyph->linearVertAdvance) * y_factor; + } + } + + _cairo_scaled_glyph_set_metrics (scaled_glyph, + &scaled_font->base, + &fs_metrics); + } + + if ((info & CAIRO_SCALED_GLYPH_INFO_SURFACE) != 0) { + cairo_image_surface_t *surface; + + if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) { + status = _render_glyph_outline (face, &scaled_font->ft_options.base, + &surface); + } else { + status = _render_glyph_bitmap (face, &scaled_font->ft_options.base, + &surface); + if (likely (status == CAIRO_STATUS_SUCCESS) && + unscaled->have_shape) + { + status = _transform_glyph_bitmap (&unscaled->current_shape, + &surface); + if (unlikely (status)) + cairo_surface_destroy (&surface->base); + } + } + if (unlikely (status)) + goto FAIL; + + _cairo_scaled_glyph_set_surface (scaled_glyph, + &scaled_font->base, + surface); + } + + if (info & CAIRO_SCALED_GLYPH_INFO_PATH) { + cairo_path_fixed_t *path = NULL; /* hide compiler warning */ + + /* + * A kludge -- the above code will trash the outline, + * so reload it. This will probably never occur though + */ + if ((info & CAIRO_SCALED_GLYPH_INFO_SURFACE) != 0) { + error = FT_Load_Glyph (face, + _cairo_scaled_glyph_index(scaled_glyph), + load_flags | FT_LOAD_NO_BITMAP); + /* XXX ignoring all other errors for now. They are not fatal, typically + * just a glyph-not-found. */ + if (error == FT_Err_Out_Of_Memory) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL; + } +#if HAVE_FT_GLYPHSLOT_EMBOLDEN + if (scaled_font->ft_options.synth_flags & CAIRO_FT_SYNTHESIZE_BOLD) + FT_GlyphSlot_Embolden (glyph); +#endif +#if HAVE_FT_GLYPHSLOT_OBLIQUE + if (scaled_font->ft_options.synth_flags & CAIRO_FT_SYNTHESIZE_OBLIQUE) + FT_GlyphSlot_Oblique (glyph); +#endif + if (vertical_layout) + _cairo_ft_scaled_glyph_vertical_layout_bearing_fix (scaled_font, glyph); + + } + if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) + status = _decompose_glyph_outline (face, &scaled_font->ft_options.base, + &path); + else + status = CAIRO_INT_STATUS_UNSUPPORTED; + + if (unlikely (status)) + goto FAIL; + + _cairo_scaled_glyph_set_path (scaled_glyph, + &scaled_font->base, + path); + } + FAIL: + _cairo_ft_unscaled_font_unlock_face (unscaled); + + return status; +} + +static unsigned long +_cairo_ft_ucs4_to_index (void *abstract_font, + uint32_t ucs4) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; + FT_Face face; + FT_UInt index; + + face = _cairo_ft_unscaled_font_lock_face (unscaled); + if (!face) + return 0; + +#if CAIRO_HAS_FC_FONT + index = FcFreeTypeCharIndex (face, ucs4); +#else + index = FT_Get_Char_Index (face, ucs4); +#endif + + _cairo_ft_unscaled_font_unlock_face (unscaled); + return index; +} + +static cairo_int_status_t +_cairo_ft_load_truetype_table (void *abstract_font, + unsigned long tag, + long offset, + unsigned char *buffer, + unsigned long *length) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; + FT_Face face; + cairo_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + /* We don't support the FreeType feature of loading a table + * without specifying the size since this may overflow our + * buffer. */ + assert (length != NULL); + + if (_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) + return CAIRO_INT_STATUS_UNSUPPORTED; + +#if HAVE_FT_LOAD_SFNT_TABLE + face = _cairo_ft_unscaled_font_lock_face (unscaled); + if (!face) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (FT_IS_SFNT (face)) { + if (buffer == NULL) + *length = 0; + + if (FT_Load_Sfnt_Table (face, tag, offset, buffer, length) == 0) + status = CAIRO_STATUS_SUCCESS; + } + + _cairo_ft_unscaled_font_unlock_face (unscaled); +#endif + + return status; +} + +static cairo_int_status_t +_cairo_ft_index_to_ucs4(void *abstract_font, + unsigned long index, + uint32_t *ucs4) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; + FT_Face face; + FT_ULong charcode; + FT_UInt gindex; + + face = _cairo_ft_unscaled_font_lock_face (unscaled); + if (!face) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + *ucs4 = (uint32_t) -1; + charcode = FT_Get_First_Char(face, &gindex); + while (gindex != 0) { + if (gindex == index) { + *ucs4 = charcode; + break; + } + charcode = FT_Get_Next_Char (face, charcode, &gindex); + } + + _cairo_ft_unscaled_font_unlock_face (unscaled); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_ft_is_synthetic (void *abstract_font) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + return scaled_font->ft_options.synth_flags != 0; +} + +static cairo_int_status_t +_cairo_index_to_glyph_name (void *abstract_font, + char **glyph_names, + int num_glyph_names, + unsigned long glyph_index, + unsigned long *glyph_array_index) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; + FT_Face face; + char buffer[256]; /* PLRM spcifies max name length of 127 */ + FT_Error error; + int i; + + face = _cairo_ft_unscaled_font_lock_face (unscaled); + if (!face) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + error = FT_Get_Glyph_Name (face, glyph_index, buffer, sizeof buffer); + + _cairo_ft_unscaled_font_unlock_face (unscaled); + + if (error != FT_Err_Ok) { + /* propagate fatal errors from FreeType */ + if (error == FT_Err_Out_Of_Memory) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* FT first numbers the glyphs in the order they are read from the + * Type 1 font. Then if .notdef is not the first glyph, the first + * glyph is swapped with .notdef to ensure that .notdef is at + * glyph index 0. + * + * As all but two glyphs in glyph_names already have the same + * index as the FT glyph index, we first check if + * glyph_names[glyph_index] is the name we are looking for. If not + * we fall back to searching the entire array. + */ + + if ((long)glyph_index < num_glyph_names && + strcmp (glyph_names[glyph_index], buffer) == 0) + { + *glyph_array_index = glyph_index; + + return CAIRO_STATUS_SUCCESS; + } + + for (i = 0; i < num_glyph_names; i++) { + if (strcmp (glyph_names[i], buffer) == 0) { + *glyph_array_index = i; + + return CAIRO_STATUS_SUCCESS; + } + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_bool_t +_ft_is_type1 (FT_Face face) +{ +#if HAVE_FT_GET_X11_FONT_FORMAT + const char *font_format = FT_Get_X11_Font_Format (face); + if (font_format && + (strcmp (font_format, "Type 1") == 0 || + strcmp (font_format, "CFF") == 0)) + { + return TRUE; + } +#endif + + return FALSE; +} + +static cairo_int_status_t +_cairo_ft_load_type1_data (void *abstract_font, + long offset, + unsigned char *buffer, + unsigned long *length) +{ + cairo_ft_scaled_font_t *scaled_font = abstract_font; + cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; + FT_Face face; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + unsigned long available_length; + unsigned long ret; + + assert (length != NULL); + + if (_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + face = _cairo_ft_unscaled_font_lock_face (unscaled); + if (!face) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + +#if HAVE_FT_LOAD_SFNT_TABLE + if (FT_IS_SFNT (face)) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto unlock; + } +#endif + + if (! _ft_is_type1 (face)) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto unlock; + } + + available_length = MAX (face->stream->size - offset, 0); + if (!buffer) { + *length = available_length; + } else { + if (*length > available_length) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + } else if (face->stream->read != NULL) { + /* Note that read() may be implemented as a macro, thanks POSIX!, so we + * need to wrap the following usage in parentheses in order to + * disambiguate it for the pre-processor - using the verbose function + * pointer dereference for clarity. + */ + ret = (* face->stream->read) (face->stream, + offset, + buffer, + *length); + if (ret != *length) + status = _cairo_error (CAIRO_STATUS_READ_ERROR); + } else { + memcpy (buffer, face->stream->base + offset, *length); + } + } + + unlock: + _cairo_ft_unscaled_font_unlock_face (unscaled); + + return status; +} + +static const cairo_scaled_font_backend_t _cairo_ft_scaled_font_backend = { + CAIRO_FONT_TYPE_FT, + _cairo_ft_scaled_font_fini, + _cairo_ft_scaled_glyph_init, + NULL, /* text_to_glyphs */ + _cairo_ft_ucs4_to_index, + _cairo_ft_load_truetype_table, + _cairo_ft_index_to_ucs4, + _cairo_ft_is_synthetic, + _cairo_index_to_glyph_name, + _cairo_ft_load_type1_data +}; + +/* #cairo_ft_font_face_t */ + +#if CAIRO_HAS_FC_FONT +static cairo_font_face_t * +_cairo_ft_font_face_create_for_pattern (FcPattern *pattern); + +static cairo_status_t +_cairo_ft_font_face_create_for_toy (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face_out) +{ + cairo_font_face_t *font_face = (cairo_font_face_t *) &_cairo_font_face_nil; + FcPattern *pattern; + int fcslant; + int fcweight; + + pattern = FcPatternCreate (); + if (!pattern) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return font_face->status; + } + + if (!FcPatternAddString (pattern, + FC_FAMILY, (unsigned char *) toy_face->family)) + { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + goto FREE_PATTERN; + } + + switch (toy_face->slant) + { + case CAIRO_FONT_SLANT_ITALIC: + fcslant = FC_SLANT_ITALIC; + break; + case CAIRO_FONT_SLANT_OBLIQUE: + fcslant = FC_SLANT_OBLIQUE; + break; + case CAIRO_FONT_SLANT_NORMAL: + default: + fcslant = FC_SLANT_ROMAN; + break; + } + + if (!FcPatternAddInteger (pattern, FC_SLANT, fcslant)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + goto FREE_PATTERN; + } + + switch (toy_face->weight) + { + case CAIRO_FONT_WEIGHT_BOLD: + fcweight = FC_WEIGHT_BOLD; + break; + case CAIRO_FONT_WEIGHT_NORMAL: + default: + fcweight = FC_WEIGHT_MEDIUM; + break; + } + + if (!FcPatternAddInteger (pattern, FC_WEIGHT, fcweight)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + goto FREE_PATTERN; + } + + font_face = _cairo_ft_font_face_create_for_pattern (pattern); + + FREE_PATTERN: + FcPatternDestroy (pattern); + + *font_face_out = font_face; + return font_face->status; +} +#endif + +static cairo_bool_t +_cairo_ft_font_face_destroy (void *abstract_face) +{ + cairo_ft_font_face_t *font_face = abstract_face; + + /* When destroying a face created by cairo_ft_font_face_create_for_ft_face, + * we have a special "zombie" state for the face when the unscaled font + * is still alive but there are no other references to a font face with + * the same FT_Face. + * + * We go from: + * + * font_face ------> unscaled + * <-....weak....../ + * + * To: + * + * font_face <------- unscaled + */ + + if (font_face->unscaled && + font_face->unscaled->from_face && + font_face->next == NULL && + font_face->unscaled->faces == font_face && + CAIRO_REFERENCE_COUNT_GET_VALUE (&font_face->unscaled->base.ref_count) > 1) + { + _cairo_unscaled_font_destroy (&font_face->unscaled->base); + font_face->unscaled = NULL; + + return FALSE; + } + + if (font_face->unscaled) { + cairo_ft_font_face_t *tmp_face = NULL; + cairo_ft_font_face_t *last_face = NULL; + + /* Remove face from linked list */ + for (tmp_face = font_face->unscaled->faces; + tmp_face; + tmp_face = tmp_face->next) + { + if (tmp_face == font_face) { + if (last_face) + last_face->next = tmp_face->next; + else + font_face->unscaled->faces = tmp_face->next; + } + + last_face = tmp_face; + } + + _cairo_unscaled_font_destroy (&font_face->unscaled->base); + font_face->unscaled = NULL; + } + +#if CAIRO_HAS_FC_FONT + if (font_face->pattern) { + FcPatternDestroy (font_face->pattern); + cairo_font_face_destroy (font_face->resolved_font_face); + } +#endif + + return TRUE; +} + +static cairo_font_face_t * +_cairo_ft_font_face_get_implementation (void *abstract_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options) +{ + cairo_ft_font_face_t *font_face = abstract_face; + + /* The handling of font options is different depending on how the + * font face was created. When the user creates a font face with + * cairo_ft_font_face_create_for_ft_face(), then the load flags + * passed in augment the load flags for the options. But for + * cairo_ft_font_face_create_for_pattern(), the load flags are + * derived from a pattern where the user has called + * cairo_ft_font_options_substitute(), so *just* use those load + * flags and ignore the options. + */ + +#if CAIRO_HAS_FC_FONT + /* If we have an unresolved pattern, resolve it and create + * unscaled font. Otherwise, use the ones stored in font_face. + */ + if (font_face->pattern) { + cairo_font_face_t *resolved; + + /* Cache the resolved font whilst the FcConfig remains consistent. */ + resolved = font_face->resolved_font_face; + if (resolved != NULL) { + if (! FcInitBringUptoDate ()) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *) &_cairo_font_face_nil; + } + + if (font_face->resolved_config == FcConfigGetCurrent ()) + return cairo_font_face_reference (resolved); + + cairo_font_face_destroy (resolved); + font_face->resolved_font_face = NULL; + } + + resolved = _cairo_ft_resolve_pattern (font_face->pattern, + font_matrix, + ctm, + options); + if (unlikely (resolved->status)) + return resolved; + + font_face->resolved_font_face = cairo_font_face_reference (resolved); + font_face->resolved_config = FcConfigGetCurrent (); + + return resolved; + } +#endif + + return abstract_face; +} + +const cairo_font_face_backend_t _cairo_ft_font_face_backend = { + CAIRO_FONT_TYPE_FT, +#if CAIRO_HAS_FC_FONT + _cairo_ft_font_face_create_for_toy, +#else + NULL, +#endif + _cairo_ft_font_face_destroy, + _cairo_ft_font_face_scaled_font_create, + _cairo_ft_font_face_get_implementation +}; + +#if CAIRO_HAS_FC_FONT +static cairo_font_face_t * +_cairo_ft_font_face_create_for_pattern (FcPattern *pattern) +{ + cairo_ft_font_face_t *font_face; + + font_face = malloc (sizeof (cairo_ft_font_face_t)); + if (unlikely (font_face == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *) &_cairo_font_face_nil; + } + + font_face->unscaled = NULL; + font_face->next = NULL; + + font_face->pattern = FcPatternDuplicate (pattern); + if (unlikely (font_face->pattern == NULL)) { + free (font_face); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *) &_cairo_font_face_nil; + } + + font_face->resolved_font_face = NULL; + font_face->resolved_config = NULL; + + _cairo_font_face_init (&font_face->base, &_cairo_ft_font_face_backend); + + return &font_face->base; +} +#endif + +static cairo_font_face_t * +_cairo_ft_font_face_create (cairo_ft_unscaled_font_t *unscaled, + cairo_ft_options_t *ft_options) +{ + cairo_ft_font_face_t *font_face, **prev_font_face; + + /* Looked for an existing matching font face */ + for (font_face = unscaled->faces, prev_font_face = &unscaled->faces; + font_face; + prev_font_face = &font_face->next, font_face = font_face->next) + { + if (font_face->ft_options.load_flags == ft_options->load_flags && + font_face->ft_options.synth_flags == ft_options->synth_flags && + cairo_font_options_equal (&font_face->ft_options.base, &ft_options->base)) + { + if (font_face->base.status) { + /* The font_face has been left in an error state, abandon it. */ + *prev_font_face = font_face->next; + break; + } + + if (font_face->unscaled == NULL) { + /* Resurrect this "zombie" font_face (from + * _cairo_ft_font_face_destroy), switching its unscaled_font + * from owner to ownee. */ + font_face->unscaled = unscaled; + _cairo_unscaled_font_reference (&unscaled->base); + return &font_face->base; + } else + return cairo_font_face_reference (&font_face->base); + } + } + + /* No match found, create a new one */ + font_face = malloc (sizeof (cairo_ft_font_face_t)); + if (unlikely (!font_face)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *)&_cairo_font_face_nil; + } + + font_face->unscaled = unscaled; + _cairo_unscaled_font_reference (&unscaled->base); + + font_face->ft_options = *ft_options; + + if (unscaled->faces && unscaled->faces->unscaled == NULL) { + /* This "zombie" font_face (from _cairo_ft_font_face_destroy) + * is no longer needed. */ + assert (unscaled->from_face && unscaled->faces->next == NULL); + cairo_font_face_destroy (&unscaled->faces->base); + unscaled->faces = NULL; + } + + font_face->next = unscaled->faces; + unscaled->faces = font_face; + +#if CAIRO_HAS_FC_FONT + font_face->pattern = NULL; +#endif + + _cairo_font_face_init (&font_face->base, &_cairo_ft_font_face_backend); + + return &font_face->base; +} + +/* implement the platform-specific interface */ + +#if CAIRO_HAS_FC_FONT +static cairo_status_t +_cairo_ft_font_options_substitute (const cairo_font_options_t *options, + FcPattern *pattern) +{ + FcValue v; + + if (options->antialias != CAIRO_ANTIALIAS_DEFAULT) + { + if (FcPatternGet (pattern, FC_ANTIALIAS, 0, &v) == FcResultNoMatch) + { + if (! FcPatternAddBool (pattern, + FC_ANTIALIAS, + options->antialias != CAIRO_ANTIALIAS_NONE)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (options->antialias != CAIRO_ANTIALIAS_SUBPIXEL) { + FcPatternDel (pattern, FC_RGBA); + if (! FcPatternAddInteger (pattern, FC_RGBA, FC_RGBA_NONE)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + } + + if (options->antialias != CAIRO_ANTIALIAS_DEFAULT) + { + if (FcPatternGet (pattern, FC_RGBA, 0, &v) == FcResultNoMatch) + { + int rgba; + + if (options->antialias == CAIRO_ANTIALIAS_SUBPIXEL) { + switch (options->subpixel_order) { + case CAIRO_SUBPIXEL_ORDER_DEFAULT: + case CAIRO_SUBPIXEL_ORDER_RGB: + default: + rgba = FC_RGBA_RGB; + break; + case CAIRO_SUBPIXEL_ORDER_BGR: + rgba = FC_RGBA_BGR; + break; + case CAIRO_SUBPIXEL_ORDER_VRGB: + rgba = FC_RGBA_VRGB; + break; + case CAIRO_SUBPIXEL_ORDER_VBGR: + rgba = FC_RGBA_VBGR; + break; + } + } else { + rgba = FC_RGBA_NONE; + } + + if (! FcPatternAddInteger (pattern, FC_RGBA, rgba)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + if (options->lcd_filter != CAIRO_LCD_FILTER_DEFAULT) + { + if (FcPatternGet (pattern, FC_LCD_FILTER, 0, &v) == FcResultNoMatch) + { + int lcd_filter; + + switch (options->lcd_filter) { + case CAIRO_LCD_FILTER_NONE: + lcd_filter = FT_LCD_FILTER_NONE; + break; + case CAIRO_LCD_FILTER_DEFAULT: + case CAIRO_LCD_FILTER_INTRA_PIXEL: + lcd_filter = FT_LCD_FILTER_LEGACY; + break; + case CAIRO_LCD_FILTER_FIR3: + lcd_filter = FT_LCD_FILTER_LIGHT; + break; + default: + case CAIRO_LCD_FILTER_FIR5: + lcd_filter = FT_LCD_FILTER_DEFAULT; + break; + } + + if (! FcPatternAddInteger (pattern, FC_LCD_FILTER, lcd_filter)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + if (options->hint_style != CAIRO_HINT_STYLE_DEFAULT) + { + if (FcPatternGet (pattern, FC_HINTING, 0, &v) == FcResultNoMatch) + { + if (! FcPatternAddBool (pattern, + FC_HINTING, + options->hint_style != CAIRO_HINT_STYLE_NONE)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + +#ifdef FC_HINT_STYLE + if (FcPatternGet (pattern, FC_HINT_STYLE, 0, &v) == FcResultNoMatch) + { + int hint_style; + + switch (options->hint_style) { + case CAIRO_HINT_STYLE_NONE: + hint_style = FC_HINT_NONE; + break; + case CAIRO_HINT_STYLE_SLIGHT: + hint_style = FC_HINT_SLIGHT; + break; + case CAIRO_HINT_STYLE_MEDIUM: + hint_style = FC_HINT_MEDIUM; + break; + case CAIRO_HINT_STYLE_FULL: + case CAIRO_HINT_STYLE_DEFAULT: + default: + hint_style = FC_HINT_FULL; + break; + } + + if (! FcPatternAddInteger (pattern, FC_HINT_STYLE, hint_style)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } +#endif + } + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_ft_font_options_substitute: + * @options: a #cairo_font_options_t object + * @pattern: an existing #FcPattern + * + * Add options to a #FcPattern based on a #cairo_font_options_t font + * options object. Options that are already in the pattern, are not overridden, + * so you should call this function after calling FcConfigSubstitute() (the + * user's settings should override options based on the surface type), but + * before calling FcDefaultSubstitute(). + * + * Since: 1.0 + **/ +void +cairo_ft_font_options_substitute (const cairo_font_options_t *options, + FcPattern *pattern) +{ + if (cairo_font_options_status ((cairo_font_options_t *) options)) + return; + + _cairo_ft_font_options_substitute (options, pattern); +} + +static cairo_font_face_t * +_cairo_ft_resolve_pattern (FcPattern *pattern, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *font_options) +{ + cairo_status_t status; + + cairo_matrix_t scale; + FcPattern *resolved; + cairo_ft_font_transform_t sf; + FcResult result; + cairo_ft_unscaled_font_t *unscaled; + cairo_ft_options_t ft_options; + cairo_font_face_t *font_face; + + scale = *ctm; + scale.x0 = scale.y0 = 0; + cairo_matrix_multiply (&scale, + font_matrix, + &scale); + + status = _compute_transform (&sf, &scale, NULL); + if (unlikely (status)) + return (cairo_font_face_t *)&_cairo_font_face_nil; + + pattern = FcPatternDuplicate (pattern); + if (pattern == NULL) + return (cairo_font_face_t *)&_cairo_font_face_nil; + + if (! FcPatternAddDouble (pattern, FC_PIXEL_SIZE, sf.y_scale)) { + font_face = (cairo_font_face_t *)&_cairo_font_face_nil; + goto FREE_PATTERN; + } + + if (! FcConfigSubstitute (NULL, pattern, FcMatchPattern)) { + font_face = (cairo_font_face_t *)&_cairo_font_face_nil; + goto FREE_PATTERN; + } + + status = _cairo_ft_font_options_substitute (font_options, pattern); + if (status) { + font_face = (cairo_font_face_t *)&_cairo_font_face_nil; + goto FREE_PATTERN; + } + + FcDefaultSubstitute (pattern); + + status = _cairo_ft_unscaled_font_create_for_pattern (pattern, &unscaled); + if (unlikely (status)) { + font_face = (cairo_font_face_t *)&_cairo_font_face_nil; + goto FREE_PATTERN; + } + + if (unscaled == NULL) { + resolved = FcFontMatch (NULL, pattern, &result); + if (!resolved) { + /* We failed to find any font. Substitute twin so that the user can + * see something (and hopefully recognise that the font is missing) + * and not just receive a NO_MEMORY error during rendering. + */ + font_face = _cairo_font_face_twin_create_fallback (); + goto FREE_PATTERN; + } + + status = _cairo_ft_unscaled_font_create_for_pattern (resolved, &unscaled); + if (unlikely (status || unscaled == NULL)) { + font_face = (cairo_font_face_t *)&_cairo_font_face_nil; + goto FREE_RESOLVED; + } + } else + resolved = pattern; + + _get_pattern_ft_options (resolved, &ft_options); + font_face = _cairo_ft_font_face_create (unscaled, &ft_options); + _cairo_unscaled_font_destroy (&unscaled->base); + +FREE_RESOLVED: + if (resolved != pattern) + FcPatternDestroy (resolved); + +FREE_PATTERN: + FcPatternDestroy (pattern); + + return font_face; +} + +/** + * cairo_ft_font_face_create_for_pattern: + * @pattern: A fontconfig pattern. Cairo makes a copy of the pattern + * if it needs to. You are free to modify or free @pattern after this call. + * + * Creates a new font face for the FreeType font backend based on a + * fontconfig pattern. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). The + * #cairo_scaled_font_t returned from cairo_scaled_font_create() is + * also for the FreeType backend and can be used with functions such + * as cairo_ft_scaled_font_lock_face(). + * + * Font rendering options are represented both here and when you + * call cairo_scaled_font_create(). Font options that have a representation + * in a #FcPattern must be passed in here; to modify #FcPattern + * appropriately to reflect the options in a #cairo_font_options_t, call + * cairo_ft_font_options_substitute(). + * + * The pattern's FC_FT_FACE element is inspected first and if that is set, + * that will be the FreeType font face associated with the returned cairo + * font face. Otherwise the FC_FILE element is checked. If it's set, + * that and the value of the FC_INDEX element (defaults to zero) of @pattern + * are used to load a font face from file. + * + * If both steps from the previous paragraph fails, @pattern will be passed + * to FcConfigSubstitute, FcDefaultSubstitute, and finally FcFontMatch, + * and the resulting font pattern is used. + * + * If the FC_FT_FACE element of @pattern is set, the user is responsible + * for making sure that the referenced FT_Face remains valid for the life + * time of the returned #cairo_font_face_t. See + * cairo_ft_font_face_create_for_ft_face() for an example of how to couple + * the life time of the FT_Face to that of the cairo font-face. + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.0 + **/ +cairo_font_face_t * +cairo_ft_font_face_create_for_pattern (FcPattern *pattern) +{ + cairo_ft_unscaled_font_t *unscaled; + cairo_font_face_t *font_face; + cairo_ft_options_t ft_options; + cairo_status_t status; + + status = _cairo_ft_unscaled_font_create_for_pattern (pattern, &unscaled); + if (unlikely (status)) + return (cairo_font_face_t *) &_cairo_font_face_nil; + if (unlikely (unscaled == NULL)) { + /* Store the pattern. We will resolve it and create unscaled + * font when creating scaled fonts */ + return _cairo_ft_font_face_create_for_pattern (pattern); + } + + _get_pattern_ft_options (pattern, &ft_options); + font_face = _cairo_ft_font_face_create (unscaled, &ft_options); + _cairo_unscaled_font_destroy (&unscaled->base); + + return font_face; +} +#endif + +/** + * cairo_ft_font_face_create_for_ft_face: + * @face: A FreeType face object, already opened. This must + * be kept around until the face's ref_count drops to + * zero and it is freed. Since the face may be referenced + * internally to Cairo, the best way to determine when it + * is safe to free the face is to pass a + * #cairo_destroy_func_t to cairo_font_face_set_user_data() + * @load_flags: flags to pass to FT_Load_Glyph when loading + * glyphs from the font. These flags are OR'ed together with + * the flags derived from the #cairo_font_options_t passed + * to cairo_scaled_font_create(), so only a few values such + * as %FT_LOAD_VERTICAL_LAYOUT, and %FT_LOAD_FORCE_AUTOHINT + * are useful. You should not pass any of the flags affecting + * the load target, such as %FT_LOAD_TARGET_LIGHT. + * + * Creates a new font face for the FreeType font backend from a + * pre-opened FreeType face. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). The + * #cairo_scaled_font_t returned from cairo_scaled_font_create() is + * also for the FreeType backend and can be used with functions such + * as cairo_ft_scaled_font_lock_face(). Note that Cairo may keep a reference + * to the FT_Face alive in a font-cache and the exact lifetime of the reference + * depends highly upon the exact usage pattern and is subject to external + * factors. You must not call FT_Done_Face() before the last reference to the + * #cairo_font_face_t has been dropped. + * + * As an example, below is how one might correctly couple the lifetime of + * the FreeType face object to the #cairo_font_face_t. + * + * + * static const cairo_user_data_key_t key; + * + * font_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0); + * status = cairo_font_face_set_user_data (font_face, &key, + * ft_face, (cairo_destroy_func_t) FT_Done_Face); + * if (status) { + * cairo_font_face_destroy (font_face); + * FT_Done_Face (ft_face); + * return ERROR; + * } + * + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.0 + **/ +cairo_font_face_t * +cairo_ft_font_face_create_for_ft_face (FT_Face face, + int load_flags) +{ + cairo_ft_unscaled_font_t *unscaled; + cairo_font_face_t *font_face; + cairo_ft_options_t ft_options; + cairo_status_t status; + + status = _cairo_ft_unscaled_font_create_from_face (face, &unscaled); + if (unlikely (status)) + return (cairo_font_face_t *)&_cairo_font_face_nil; + + ft_options.load_flags = load_flags; + ft_options.synth_flags = 0; + _cairo_font_options_init_default (&ft_options.base); + + font_face = _cairo_ft_font_face_create (unscaled, &ft_options); + _cairo_unscaled_font_destroy (&unscaled->base); + + return font_face; +} + +/** + * cairo_ft_font_face_set_synthesize: + * @font_face: The #cairo_ft_font_face_t object to modify + * @synth_flags: the set of synthesis options to enable + * + * FreeType provides the ability to synthesize different glyphs from a base + * font, which is useful if you lack those glyphs from a true bold or oblique + * font. See also #cairo_ft_synthesize_t. + * + * Since: 1.12 + **/ +void +cairo_ft_font_face_set_synthesize (cairo_font_face_t *font_face, + unsigned int synth_flags) +{ + cairo_ft_font_face_t *ft; + + if (font_face->backend->type != CAIRO_FONT_TYPE_FT) + return; + + ft = (cairo_ft_font_face_t *) font_face; + ft->ft_options.synth_flags |= synth_flags; +} + +/** + * cairo_ft_font_face_unset_synthesize: + * @font_face: The #cairo_ft_font_face_t object to modify + * @synth_flags: the set of synthesis options to disable + * + * See cairo_ft_font_face_set_synthesize(). + * + * Since: 1.12 + **/ +void +cairo_ft_font_face_unset_synthesize (cairo_font_face_t *font_face, + unsigned int synth_flags) +{ + cairo_ft_font_face_t *ft; + + if (font_face->backend->type != CAIRO_FONT_TYPE_FT) + return; + + ft = (cairo_ft_font_face_t *) font_face; + ft->ft_options.synth_flags &= ~synth_flags; +} + +/** + * cairo_ft_font_face_get_synthesize: + * @font_face: The #cairo_ft_font_face_t object to query + * + * See #cairo_ft_synthesize_t. + * + * Returns: the current set of synthesis options. + * + * Since: 1.12 + **/ +unsigned int +cairo_ft_font_face_get_synthesize (cairo_font_face_t *font_face) +{ + cairo_ft_font_face_t *ft; + + if (font_face->backend->type != CAIRO_FONT_TYPE_FT) + return 0; + + ft = (cairo_ft_font_face_t *) font_face; + return ft->ft_options.synth_flags; +} + +/** + * cairo_ft_scaled_font_lock_face: + * @scaled_font: A #cairo_scaled_font_t from the FreeType font backend. Such an + * object can be created by calling cairo_scaled_font_create() on a + * FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), + * cairo_ft_font_face_create_for_ft_face()). + * + * cairo_ft_scaled_font_lock_face() gets the #FT_Face object from a FreeType + * backend font and scales it appropriately for the font. You must + * release the face with cairo_ft_scaled_font_unlock_face() + * when you are done using it. Since the #FT_Face object can be + * shared between multiple #cairo_scaled_font_t objects, you must not + * lock any other font objects until you unlock this one. A count is + * kept of the number of times cairo_ft_scaled_font_lock_face() is + * called. cairo_ft_scaled_font_unlock_face() must be called the same number + * of times. + * + * You must be careful when using this function in a library or in a + * threaded application, because freetype's design makes it unsafe to + * call freetype functions simultaneously from multiple threads, (even + * if using distinct FT_Face objects). Because of this, application + * code that acquires an FT_Face object with this call must add its + * own locking to protect any use of that object, (and which also must + * protect any other calls into cairo as almost any cairo function + * might result in a call into the freetype library). + * + * Return value: The #FT_Face object for @font, scaled appropriately, + * or %NULL if @scaled_font is in an error state (see + * cairo_scaled_font_status()) or there is insufficient memory. + * + * Since: 1.0 + **/ +FT_Face +cairo_ft_scaled_font_lock_face (cairo_scaled_font_t *abstract_font) +{ + cairo_ft_scaled_font_t *scaled_font = (cairo_ft_scaled_font_t *) abstract_font; + FT_Face face; + cairo_status_t status; + + if (! _cairo_scaled_font_is_ft (abstract_font)) { + _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); + return NULL; + } + + if (scaled_font->base.status) + return NULL; + + face = _cairo_ft_unscaled_font_lock_face (scaled_font->unscaled); + if (unlikely (face == NULL)) { + status = _cairo_scaled_font_set_error (&scaled_font->base, CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + status = _cairo_ft_unscaled_font_set_scale (scaled_font->unscaled, + &scaled_font->base.scale); + if (unlikely (status)) { + _cairo_ft_unscaled_font_unlock_face (scaled_font->unscaled); + status = _cairo_scaled_font_set_error (&scaled_font->base, status); + return NULL; + } + + /* Note: We deliberately release the unscaled font's mutex here, + * so that we are not holding a lock across two separate calls to + * cairo function, (which would give the application some + * opportunity for creating deadlock. This is obviously unsafe, + * but as documented, the user must add manual locking when using + * this function. */ + CAIRO_MUTEX_UNLOCK (scaled_font->unscaled->mutex); + + return face; +} + +/** + * cairo_ft_scaled_font_unlock_face: + * @scaled_font: A #cairo_scaled_font_t from the FreeType font backend. Such an + * object can be created by calling cairo_scaled_font_create() on a + * FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), + * cairo_ft_font_face_create_for_ft_face()). + * + * Releases a face obtained with cairo_ft_scaled_font_lock_face(). + * + * Since: 1.0 + **/ +void +cairo_ft_scaled_font_unlock_face (cairo_scaled_font_t *abstract_font) +{ + cairo_ft_scaled_font_t *scaled_font = (cairo_ft_scaled_font_t *) abstract_font; + + if (! _cairo_scaled_font_is_ft (abstract_font)) { + _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); + return; + } + + if (scaled_font->base.status) + return; + + /* Note: We released the unscaled font's mutex at the end of + * cairo_ft_scaled_font_lock_face, so we have to acquire it again + * as _cairo_ft_unscaled_font_unlock_face expects it to be held + * when we call into it. */ + CAIRO_MUTEX_LOCK (scaled_font->unscaled->mutex); + + _cairo_ft_unscaled_font_unlock_face (scaled_font->unscaled); +} + +static cairo_bool_t +_cairo_ft_scaled_font_is_vertical (cairo_scaled_font_t *scaled_font) +{ + cairo_ft_scaled_font_t *ft_scaled_font; + + if (!_cairo_scaled_font_is_ft (scaled_font)) + return FALSE; + + ft_scaled_font = (cairo_ft_scaled_font_t *) scaled_font; + if (ft_scaled_font->ft_options.load_flags & FT_LOAD_VERTICAL_LAYOUT) + return TRUE; + return FALSE; +} + +unsigned int +_cairo_ft_scaled_font_get_load_flags (cairo_scaled_font_t *scaled_font) +{ + cairo_ft_scaled_font_t *ft_scaled_font; + + if (! _cairo_scaled_font_is_ft (scaled_font)) + return 0; + + ft_scaled_font = (cairo_ft_scaled_font_t *) scaled_font; + return ft_scaled_font->ft_options.load_flags; +} + +void +_cairo_ft_font_reset_static_data (void) +{ + _cairo_ft_unscaled_font_map_destroy (); +} diff --git a/src/cairo-ft-private.h b/src/cairo-ft-private.h new file mode 100644 index 000000000..0dc811472 --- /dev/null +++ b/src/cairo-ft-private.h @@ -0,0 +1,61 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Graydon Hoare + * Owen Taylor + */ + +#ifndef CAIRO_FT_PRIVATE_H +#define CAIRO_FT_PRIVATE_H + +#include "cairoint.h" +#include "cairo-ft.h" + +#if CAIRO_HAS_FT_FONT + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_ft_unscaled_font cairo_ft_unscaled_font_t; + +cairo_private cairo_bool_t +_cairo_scaled_font_is_ft (cairo_scaled_font_t *scaled_font); + +/* These functions are needed by the PDF backend, which needs to keep track of the + * the different fonts-on-disk used by a document, so it can embed them + */ +cairo_private unsigned int +_cairo_ft_scaled_font_get_load_flags (cairo_scaled_font_t *scaled_font); + +CAIRO_END_DECLS + +#endif /* CAIRO_HAS_FT_FONT */ +#endif /* CAIRO_FT_PRIVATE_H */ diff --git a/src/cairo-ft.h b/src/cairo-ft.h new file mode 100644 index 000000000..29c43c965 --- /dev/null +++ b/src/cairo-ft.h @@ -0,0 +1,118 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Graydon Hoare + * Owen Taylor + */ + +#ifndef CAIRO_FT_H +#define CAIRO_FT_H + +#include "cairo.h" + +#if CAIRO_HAS_FT_FONT + +/* Fontconfig/Freetype platform-specific font interface */ + +#include +#include FT_FREETYPE_H + +#if CAIRO_HAS_FC_FONT +#include +#endif + +CAIRO_BEGIN_DECLS + +cairo_public cairo_font_face_t * +cairo_ft_font_face_create_for_ft_face (FT_Face face, + int load_flags); + +/** + * cairo_ft_synthesize_t: + * @CAIRO_FT_SYNTHESIZE_BOLD: Embolden the glyphs (redraw with a pixel offset) + * @CAIRO_FT_SYNTHESIZE_OBLIQUE: Slant the glyph outline by 12 degrees to the + * right. + * + * A set of synthesis options to control how FreeType renders the glyphs + * for a particular font face. + * + * Individual synthesis features of a #cairo_ft_font_face_t can be set + * using cairo_ft_font_face_set_synthesize(), or disabled using + * cairo_ft_font_face_unset_synthesize(). The currently enabled set of + * synthesis options can be queried with cairo_ft_font_face_get_synthesize(). + * + * Note: that when synthesizing glyphs, the font metrics returned will only + * be estimates. + * + * Since: 1.12 + **/ +typedef enum { + CAIRO_FT_SYNTHESIZE_BOLD = 1 << 0, + CAIRO_FT_SYNTHESIZE_OBLIQUE = 1 << 1 +} cairo_ft_synthesize_t; + +cairo_public void +cairo_ft_font_face_set_synthesize (cairo_font_face_t *font_face, + unsigned int synth_flags); + +cairo_public void +cairo_ft_font_face_unset_synthesize (cairo_font_face_t *font_face, + unsigned int synth_flags); + +cairo_public unsigned int +cairo_ft_font_face_get_synthesize (cairo_font_face_t *font_face); + + +cairo_public FT_Face +cairo_ft_scaled_font_lock_face (cairo_scaled_font_t *scaled_font); + +cairo_public void +cairo_ft_scaled_font_unlock_face (cairo_scaled_font_t *scaled_font); + +#if CAIRO_HAS_FC_FONT + +cairo_public cairo_font_face_t * +cairo_ft_font_face_create_for_pattern (FcPattern *pattern); + +cairo_public void +cairo_ft_font_options_substitute (const cairo_font_options_t *options, + FcPattern *pattern); + +#endif + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_FT_FONT */ +# error Cairo was not compiled with support for the freetype font backend +#endif /* CAIRO_HAS_FT_FONT */ + +#endif /* CAIRO_FT_H */ diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c new file mode 100644 index 000000000..b50f9a76c --- /dev/null +++ b/src/cairo-gl-composite.c @@ -0,0 +1,1265 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * Copyright © 2011 Linaro Limited + * Copyright © 2011 Samsung Electronics + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + * Alexandros Frantzis + * Henry Song + * Martin Robinson + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" + +cairo_int_status_t +_cairo_gl_composite_set_source (cairo_gl_composite_t *setup, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen) +{ + _cairo_gl_operand_destroy (&setup->src); + return _cairo_gl_operand_init (&setup->src, pattern, setup->dst, + sample, extents, use_texgen); +} + +void +_cairo_gl_composite_set_source_operand (cairo_gl_composite_t *setup, + const cairo_gl_operand_t *source) +{ + _cairo_gl_operand_destroy (&setup->src); + _cairo_gl_operand_copy (&setup->src, source); +} + +void +_cairo_gl_composite_set_solid_source (cairo_gl_composite_t *setup, + const cairo_color_t *color) +{ + _cairo_gl_operand_destroy (&setup->src); + _cairo_gl_solid_operand_init (&setup->src, color); +} + +cairo_int_status_t +_cairo_gl_composite_set_mask (cairo_gl_composite_t *setup, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen) +{ + _cairo_gl_operand_destroy (&setup->mask); + if (pattern == NULL) + return CAIRO_STATUS_SUCCESS; + + return _cairo_gl_operand_init (&setup->mask, pattern, setup->dst, + sample, extents, use_texgen); +} + +void +_cairo_gl_composite_set_mask_operand (cairo_gl_composite_t *setup, + const cairo_gl_operand_t *mask) +{ + _cairo_gl_operand_destroy (&setup->mask); + if (mask) + _cairo_gl_operand_copy (&setup->mask, mask); +} + +void +_cairo_gl_composite_set_spans (cairo_gl_composite_t *setup) +{ + setup->spans = TRUE; +} + +void +_cairo_gl_composite_set_multisample (cairo_gl_composite_t *setup) +{ + setup->multisample = TRUE; +} + +void +_cairo_gl_composite_set_clip_region (cairo_gl_composite_t *setup, + cairo_region_t *clip_region) +{ + setup->clip_region = clip_region; +} + +void +_cairo_gl_composite_set_clip (cairo_gl_composite_t *setup, + cairo_clip_t *clip) +{ + setup->clip = clip; +} + +static void +_cairo_gl_composite_bind_to_shader (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup) +{ + _cairo_gl_shader_bind_matrix4f(ctx, ctx->current_shader->mvp_location, + ctx->modelviewprojection_matrix); + _cairo_gl_operand_bind_to_shader (ctx, &setup->src, CAIRO_GL_TEX_SOURCE); + _cairo_gl_operand_bind_to_shader (ctx, &setup->mask, CAIRO_GL_TEX_MASK); +} + +static void +_cairo_gl_texture_set_filter (cairo_gl_context_t *ctx, + GLuint target, + cairo_filter_t filter) +{ + switch (filter) { + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + break; + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_BILINEAR: + glTexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + break; + default: + case CAIRO_FILTER_GAUSSIAN: + ASSERT_NOT_REACHED; + } +} + +static void +_cairo_gl_texture_set_extend (cairo_gl_context_t *ctx, + GLuint target, + cairo_extend_t extend) +{ + GLint wrap_mode; + assert (! _cairo_gl_device_requires_power_of_two_textures (&ctx->base) || + (extend != CAIRO_EXTEND_REPEAT && extend != CAIRO_EXTEND_REFLECT)); + + switch (extend) { + case CAIRO_EXTEND_NONE: + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES) + wrap_mode = GL_CLAMP_TO_EDGE; + else + wrap_mode = GL_CLAMP_TO_BORDER; + break; + case CAIRO_EXTEND_PAD: + wrap_mode = GL_CLAMP_TO_EDGE; + break; + case CAIRO_EXTEND_REPEAT: + if (ctx->has_npot_repeat) + wrap_mode = GL_REPEAT; + else + wrap_mode = GL_CLAMP_TO_EDGE; + break; + case CAIRO_EXTEND_REFLECT: + if (ctx->has_npot_repeat) + wrap_mode = GL_MIRRORED_REPEAT; + else + wrap_mode = GL_CLAMP_TO_EDGE; + break; + default: + wrap_mode = 0; + } + + if (likely (wrap_mode)) { + glTexParameteri (target, GL_TEXTURE_WRAP_S, wrap_mode); + glTexParameteri (target, GL_TEXTURE_WRAP_T, wrap_mode); + } +} + + +static void +_cairo_gl_context_setup_operand (cairo_gl_context_t *ctx, + cairo_gl_tex_t tex_unit, + cairo_gl_operand_t *operand, + unsigned int vertex_offset, + cairo_bool_t vertex_size_changed) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + cairo_bool_t needs_setup; + + /* XXX: we need to do setup when switching from shaders + * to no shaders (or back) */ + needs_setup = vertex_size_changed; + needs_setup |= _cairo_gl_operand_needs_setup (&ctx->operands[tex_unit], + operand, + vertex_offset); + + if (needs_setup) { + _cairo_gl_composite_flush (ctx); + _cairo_gl_context_destroy_operand (ctx, tex_unit); + } + + memcpy (&ctx->operands[tex_unit], operand, sizeof (cairo_gl_operand_t)); + ctx->operands[tex_unit].vertex_offset = vertex_offset; + + if (! needs_setup) + return; + + switch (operand->type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + break; + /* fall through */ + case CAIRO_GL_OPERAND_CONSTANT: + break; + case CAIRO_GL_OPERAND_TEXTURE: + glActiveTexture (GL_TEXTURE0 + tex_unit); + glBindTexture (ctx->tex_target, operand->texture.tex); + _cairo_gl_texture_set_extend (ctx, ctx->tex_target, + operand->texture.attributes.extend); + _cairo_gl_texture_set_filter (ctx, ctx->tex_target, + operand->texture.attributes.filter); + + if (! operand->texture.texgen) { + dispatch->VertexAttribPointer (CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + tex_unit, 2, + GL_FLOAT, GL_FALSE, ctx->vertex_size, + ctx->vb + vertex_offset); + dispatch->EnableVertexAttribArray (CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + tex_unit); + } + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + glActiveTexture (GL_TEXTURE0 + tex_unit); + glBindTexture (ctx->tex_target, operand->gradient.gradient->tex); + _cairo_gl_texture_set_extend (ctx, ctx->tex_target, operand->gradient.extend); + _cairo_gl_texture_set_filter (ctx, ctx->tex_target, CAIRO_FILTER_BILINEAR); + + if (! operand->gradient.texgen) { + dispatch->VertexAttribPointer (CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + tex_unit, 2, + GL_FLOAT, GL_FALSE, ctx->vertex_size, + ctx->vb + vertex_offset); + dispatch->EnableVertexAttribArray (CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + tex_unit); + } + break; + } +} + +static void +_cairo_gl_context_setup_spans (cairo_gl_context_t *ctx, + cairo_bool_t spans_enabled, + unsigned int vertex_size, + unsigned int vertex_offset) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + + if (! spans_enabled) { + dispatch->DisableVertexAttribArray (CAIRO_GL_COLOR_ATTRIB_INDEX); + ctx->spans = FALSE; + return; + } + + dispatch->VertexAttribPointer (CAIRO_GL_COLOR_ATTRIB_INDEX, 4, + GL_UNSIGNED_BYTE, GL_TRUE, vertex_size, + ctx->vb + vertex_offset); + dispatch->EnableVertexAttribArray (CAIRO_GL_COLOR_ATTRIB_INDEX); + ctx->spans = TRUE; +} + +void +_cairo_gl_context_destroy_operand (cairo_gl_context_t *ctx, + cairo_gl_tex_t tex_unit) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + + if (!_cairo_gl_context_is_flushed (ctx)) + _cairo_gl_composite_flush (ctx); + + switch (ctx->operands[tex_unit].type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + break; + /* fall through */ + case CAIRO_GL_OPERAND_CONSTANT: + break; + case CAIRO_GL_OPERAND_TEXTURE: + dispatch->DisableVertexAttribArray (CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + tex_unit); + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + dispatch->DisableVertexAttribArray (CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + tex_unit); + break; + } + + memset (&ctx->operands[tex_unit], 0, sizeof (cairo_gl_operand_t)); +} + +static void +_cairo_gl_set_operator (cairo_gl_context_t *ctx, + cairo_operator_t op, + cairo_bool_t component_alpha) +{ + struct { + GLenum src; + GLenum dst; + } blend_factors[] = { + { GL_ZERO, GL_ZERO }, /* Clear */ + { GL_ONE, GL_ZERO }, /* Source */ + { GL_ONE, GL_ONE_MINUS_SRC_ALPHA }, /* Over */ + { GL_DST_ALPHA, GL_ZERO }, /* In */ + { GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, /* Out */ + { GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, /* Atop */ + + { GL_ZERO, GL_ONE }, /* Dest */ + { GL_ONE_MINUS_DST_ALPHA, GL_ONE }, /* DestOver */ + { GL_ZERO, GL_SRC_ALPHA }, /* DestIn */ + { GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, /* DestOut */ + { GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA }, /* DestAtop */ + + { GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA }, /* Xor */ + { GL_ONE, GL_ONE }, /* Add */ + }; + GLenum src_factor, dst_factor; + + assert (op < ARRAY_LENGTH (blend_factors)); + /* different dst and component_alpha changes cause flushes elsewhere */ + if (ctx->current_operator != op) + _cairo_gl_composite_flush (ctx); + ctx->current_operator = op; + + src_factor = blend_factors[op].src; + dst_factor = blend_factors[op].dst; + + /* Even when the user requests CAIRO_CONTENT_COLOR, we use GL_RGBA + * due to texture filtering of GL_CLAMP_TO_BORDER. So fix those + * bits in that case. + */ + if (ctx->current_target->base.content == CAIRO_CONTENT_COLOR) { + if (src_factor == GL_ONE_MINUS_DST_ALPHA) + src_factor = GL_ZERO; + if (src_factor == GL_DST_ALPHA) + src_factor = GL_ONE; + } + + if (component_alpha) { + if (dst_factor == GL_ONE_MINUS_SRC_ALPHA) + dst_factor = GL_ONE_MINUS_SRC_COLOR; + if (dst_factor == GL_SRC_ALPHA) + dst_factor = GL_SRC_COLOR; + } + + if (ctx->current_target->base.content == CAIRO_CONTENT_ALPHA) { + glBlendFuncSeparate (GL_ZERO, GL_ZERO, src_factor, dst_factor); + } else if (ctx->current_target->base.content == CAIRO_CONTENT_COLOR) { + glBlendFuncSeparate (src_factor, dst_factor, GL_ONE, GL_ONE); + } else { + glBlendFunc (src_factor, dst_factor); + } +} + +static cairo_status_t +_cairo_gl_composite_begin_component_alpha (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup) +{ + cairo_gl_shader_t *pre_shader = NULL; + cairo_status_t status; + + /* For CLEAR, cairo's rendering equation (quoting Owen's description in: + * http://lists.cairographics.org/archives/cairo/2005-August/004992.html) + * is: + * mask IN clip ? src OP dest : dest + * or more simply: + * mask IN CLIP ? 0 : dest + * + * where the ternary operator A ? B : C is (A * B) + ((1 - A) * C). + * + * The model we use in _cairo_gl_set_operator() is Render's: + * src IN mask IN clip OP dest + * which would boil down to: + * 0 (bounded by the extents of the drawing). + * + * However, we can do a Render operation using an opaque source + * and DEST_OUT to produce: + * 1 IN mask IN clip DEST_OUT dest + * which is + * mask IN clip ? 0 : dest + */ + if (setup->op == CAIRO_OPERATOR_CLEAR) { + _cairo_gl_solid_operand_init (&setup->src, CAIRO_COLOR_WHITE); + setup->op = CAIRO_OPERATOR_DEST_OUT; + } + + /* + * implements component-alpha %CAIRO_OPERATOR_OVER using two passes of + * the simpler operations %CAIRO_OPERATOR_DEST_OUT and %CAIRO_OPERATOR_ADD. + * + * From http://anholt.livejournal.com/32058.html: + * + * The trouble is that component-alpha rendering requires two different sources + * for blending: one for the source value to the blender, which is the + * per-channel multiplication of source and mask, and one for the source alpha + * for multiplying with the destination channels, which is the multiplication + * of the source channels by the mask alpha. So the equation for Over is: + * + * dst.A = src.A * mask.A + (1 - (src.A * mask.A)) * dst.A + * dst.R = src.R * mask.R + (1 - (src.A * mask.R)) * dst.R + * dst.G = src.G * mask.G + (1 - (src.A * mask.G)) * dst.G + * dst.B = src.B * mask.B + (1 - (src.A * mask.B)) * dst.B + * + * But we can do some simpler operations, right? How about PictOpOutReverse, + * which has a source factor of 0 and dest factor of (1 - source alpha). We + * can get the source alpha value (srca.X = src.A * mask.X) out of the texture + * blenders pretty easily. So we can do a component-alpha OutReverse, which + * gets us: + * + * dst.A = 0 + (1 - (src.A * mask.A)) * dst.A + * dst.R = 0 + (1 - (src.A * mask.R)) * dst.R + * dst.G = 0 + (1 - (src.A * mask.G)) * dst.G + * dst.B = 0 + (1 - (src.A * mask.B)) * dst.B + * + * OK. And if an op doesn't use the source alpha value for the destination + * factor, then we can do the channel multiplication in the texture blenders + * to get the source value, and ignore the source alpha that we wouldn't use. + * We've supported this in the Radeon driver for a long time. An example would + * be PictOpAdd, which does: + * + * dst.A = src.A * mask.A + dst.A + * dst.R = src.R * mask.R + dst.R + * dst.G = src.G * mask.G + dst.G + * dst.B = src.B * mask.B + dst.B + * + * Hey, this looks good! If we do a PictOpOutReverse and then a PictOpAdd right + * after it, we get: + * + * dst.A = src.A * mask.A + ((1 - (src.A * mask.A)) * dst.A) + * dst.R = src.R * mask.R + ((1 - (src.A * mask.R)) * dst.R) + * dst.G = src.G * mask.G + ((1 - (src.A * mask.G)) * dst.G) + * dst.B = src.B * mask.B + ((1 - (src.A * mask.B)) * dst.B) + * + * This two-pass trickery could be avoided using a new GL extension that + * lets two values come out of the shader and into the blend unit. + */ + if (setup->op == CAIRO_OPERATOR_OVER) { + setup->op = CAIRO_OPERATOR_ADD; + status = _cairo_gl_get_shader_by_type (ctx, + &setup->src, + &setup->mask, + setup->spans, + CAIRO_GL_SHADER_IN_CA_SOURCE_ALPHA, + &pre_shader); + if (unlikely (status)) + return status; + } + + if (ctx->pre_shader != pre_shader) + _cairo_gl_composite_flush (ctx); + ctx->pre_shader = pre_shader; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_scissor_to_doubles (cairo_gl_surface_t *surface, + double x1, double y1, + double x2, double y2) +{ + double height; + + height = y2 - y1; + if (_cairo_gl_surface_is_texture (surface) == FALSE) + y1 = surface->height - (y1 + height); + glScissor (x1, y1, x2 - x1, height); + glEnable (GL_SCISSOR_TEST); +} + +void +_cairo_gl_scissor_to_rectangle (cairo_gl_surface_t *surface, + const cairo_rectangle_int_t *r) +{ + _scissor_to_doubles (surface, r->x, r->y, r->x+r->width, r->y+r->height); +} + +static void +_scissor_to_box (cairo_gl_surface_t *surface, + const cairo_box_t *box) +{ + double x1, y1, x2, y2; + _cairo_box_to_doubles (box, &x1, &y1, &x2, &y2); + _scissor_to_doubles (surface, x1, y1, x2, y2); +} + +static cairo_bool_t +_cairo_gl_composite_setup_vbo (cairo_gl_context_t *ctx, + unsigned int size_per_vertex) +{ + cairo_bool_t vertex_size_changed = ctx->vertex_size != size_per_vertex; + if (vertex_size_changed) { + ctx->vertex_size = size_per_vertex; + _cairo_gl_composite_flush (ctx); + } + + if (_cairo_gl_context_is_flushed (ctx)) { + ctx->dispatch.VertexAttribPointer (CAIRO_GL_VERTEX_ATTRIB_INDEX, 2, + GL_FLOAT, GL_FALSE, size_per_vertex, + ctx->vb); + ctx->dispatch.EnableVertexAttribArray (CAIRO_GL_VERTEX_ATTRIB_INDEX); + } + + return vertex_size_changed; +} + +static void +_disable_stencil_buffer (void) +{ + glDisable (GL_STENCIL_TEST); + glDepthMask (GL_FALSE); +} + +static cairo_int_status_t +_cairo_gl_composite_setup_painted_clipping (cairo_gl_composite_t *setup, + cairo_gl_context_t *ctx, + int vertex_size) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + + cairo_gl_surface_t *dst = setup->dst; + cairo_clip_t *clip = setup->clip; + + if (clip->num_boxes == 1 && clip->path == NULL) { + _scissor_to_box (dst, &clip->boxes[0]); + goto disable_stencil_buffer_and_return; + } + + if (! _cairo_gl_ensure_stencil (ctx, setup->dst)) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto disable_stencil_buffer_and_return; + } + + /* We only want to clear the part of the stencil buffer + * that we are about to use. It also does not hurt to + * scissor around the painted clip. */ + _cairo_gl_scissor_to_rectangle (dst, _cairo_clip_get_extents (clip)); + + /* The clip is not rectangular, so use the stencil buffer. */ + glDepthMask (GL_TRUE); + glEnable (GL_STENCIL_TEST); + + /* Texture surfaces have private depth/stencil buffers, so we can + * rely on any previous clip being cached there. */ + if (_cairo_gl_surface_is_texture (setup->dst)) { + cairo_clip_t *old_clip = setup->dst->clip_on_stencil_buffer; + if (_cairo_clip_equal (old_clip, setup->clip)) + goto activate_stencil_buffer_and_return; + + if (old_clip) { + _cairo_clip_destroy (setup->dst->clip_on_stencil_buffer); + } + + setup->dst->clip_on_stencil_buffer = _cairo_clip_copy (setup->clip); + } + + glClearStencil (0); + glClear (GL_STENCIL_BUFFER_BIT); + + glStencilOp (GL_REPLACE, GL_REPLACE, GL_REPLACE); + glStencilFunc (GL_EQUAL, 1, 0xffffffff); + glColorMask (0, 0, 0, 0); + + status = _cairo_gl_msaa_compositor_draw_clip (ctx, setup, clip); + + if (unlikely (status)) { + glColorMask (1, 1, 1, 1); + goto disable_stencil_buffer_and_return; + } + + /* We want to only render to the stencil buffer, so draw everything now. + Flushing also unbinds the VBO, which we want to rebind for regular + drawing. */ + _cairo_gl_composite_flush (ctx); + _cairo_gl_composite_setup_vbo (ctx, vertex_size); + +activate_stencil_buffer_and_return: + glColorMask (1, 1, 1, 1); + glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); + glStencilFunc (GL_EQUAL, 1, 0xffffffff); + return CAIRO_INT_STATUS_SUCCESS; + +disable_stencil_buffer_and_return: + _disable_stencil_buffer (); + return status; +} + +static cairo_int_status_t +_cairo_gl_composite_setup_clipping (cairo_gl_composite_t *setup, + cairo_gl_context_t *ctx, + int vertex_size) +{ + cairo_bool_t clip_changing = TRUE; + cairo_bool_t clip_region_changing = TRUE; + + if (! ctx->clip && ! setup->clip && ! setup->clip_region && ! ctx->clip_region) + goto disable_all_clipping; + + clip_changing = ! _cairo_clip_equal (ctx->clip, setup->clip); + clip_region_changing = ! cairo_region_equal (ctx->clip_region, setup->clip_region); + if (! _cairo_gl_context_is_flushed (ctx) && + (clip_region_changing || clip_changing)) + _cairo_gl_composite_flush (ctx); + + assert (!setup->clip_region || !setup->clip); + + /* setup->clip is only used by the msaa compositor and setup->clip_region + * only by the other compositors, so it's safe to wait to clean up obsolete + * clips. */ + if (clip_region_changing) { + cairo_region_destroy (ctx->clip_region); + ctx->clip_region = cairo_region_reference (setup->clip_region); + } + if (clip_changing) { + _cairo_clip_destroy (ctx->clip); + ctx->clip = _cairo_clip_copy (setup->clip); + } + + /* For clip regions, we scissor right before drawing. */ + if (setup->clip_region) + goto disable_all_clipping; + + if (setup->clip) + return _cairo_gl_composite_setup_painted_clipping (setup, ctx, + vertex_size); +disable_all_clipping: + _disable_stencil_buffer (); + glDisable (GL_SCISSOR_TEST); + return CAIRO_INT_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gl_set_operands_and_operator (cairo_gl_composite_t *setup, + cairo_gl_context_t *ctx) +{ + unsigned int dst_size, src_size, mask_size, vertex_size; + cairo_status_t status; + cairo_gl_shader_t *shader; + cairo_bool_t component_alpha; + cairo_bool_t vertex_size_changed; + + component_alpha = + setup->mask.type == CAIRO_GL_OPERAND_TEXTURE && + setup->mask.texture.attributes.has_component_alpha; + + /* Do various magic for component alpha */ + if (component_alpha) { + status = _cairo_gl_composite_begin_component_alpha (ctx, setup); + if (unlikely (status)) + return status; + } else { + if (ctx->pre_shader) { + _cairo_gl_composite_flush (ctx); + ctx->pre_shader = NULL; + } + } + + status = _cairo_gl_get_shader_by_type (ctx, + &setup->src, + &setup->mask, + setup->spans, + component_alpha ? + CAIRO_GL_SHADER_IN_CA_SOURCE : + CAIRO_GL_SHADER_IN_NORMAL, + &shader); + if (unlikely (status)) { + ctx->pre_shader = NULL; + return status; + } + if (ctx->current_shader != shader) + _cairo_gl_composite_flush (ctx); + + status = CAIRO_STATUS_SUCCESS; + + dst_size = 2 * sizeof (GLfloat); + src_size = _cairo_gl_operand_get_vertex_size (&setup->src); + mask_size = _cairo_gl_operand_get_vertex_size (&setup->mask); + vertex_size = dst_size + src_size + mask_size; + + if (setup->spans) + vertex_size += sizeof (GLfloat); + + vertex_size_changed = _cairo_gl_composite_setup_vbo (ctx, vertex_size); + + _cairo_gl_context_setup_operand (ctx, CAIRO_GL_TEX_SOURCE, &setup->src, dst_size, vertex_size_changed); + _cairo_gl_context_setup_operand (ctx, CAIRO_GL_TEX_MASK, &setup->mask, dst_size + src_size, vertex_size_changed); + + _cairo_gl_context_setup_spans (ctx, setup->spans, vertex_size, + dst_size + src_size + mask_size); + + _cairo_gl_set_operator (ctx, setup->op, component_alpha); + + if (_cairo_gl_context_is_flushed (ctx)) { + if (ctx->pre_shader) { + _cairo_gl_set_shader (ctx, ctx->pre_shader); + _cairo_gl_composite_bind_to_shader (ctx, setup); + } + _cairo_gl_set_shader (ctx, shader); + _cairo_gl_composite_bind_to_shader (ctx, setup); + } + + return status; +} + +cairo_status_t +_cairo_gl_composite_begin (cairo_gl_composite_t *setup, + cairo_gl_context_t **ctx_out) +{ + cairo_gl_context_t *ctx; + cairo_status_t status; + + assert (setup->dst); + + status = _cairo_gl_context_acquire (setup->dst->base.device, &ctx); + if (unlikely (status)) + return status; + + _cairo_gl_context_set_destination (ctx, setup->dst, setup->multisample); + glEnable (GL_BLEND); + + status = _cairo_gl_set_operands_and_operator (setup, ctx); + if (unlikely (status)) + goto FAIL; + + status = _cairo_gl_composite_setup_clipping (setup, ctx, ctx->vertex_size); + if (unlikely (status)) + goto FAIL; + + *ctx_out = ctx; + +FAIL: + if (unlikely (status)) + status = _cairo_gl_context_release (ctx, status); + + return status; +} + +static inline void +_cairo_gl_composite_draw_tristrip (cairo_gl_context_t *ctx) +{ + cairo_array_t* indices = &ctx->tristrip_indices; + const unsigned short *indices_array = _cairo_array_index_const (indices, 0); + + if (ctx->pre_shader) { + cairo_gl_shader_t *prev_shader = ctx->current_shader; + + _cairo_gl_set_shader (ctx, ctx->pre_shader); + _cairo_gl_set_operator (ctx, CAIRO_OPERATOR_DEST_OUT, TRUE); + glDrawElements (GL_TRIANGLE_STRIP, _cairo_array_num_elements (indices), GL_UNSIGNED_SHORT, indices_array); + + _cairo_gl_set_shader (ctx, prev_shader); + _cairo_gl_set_operator (ctx, CAIRO_OPERATOR_ADD, TRUE); + } + + glDrawElements (GL_TRIANGLE_STRIP, _cairo_array_num_elements (indices), GL_UNSIGNED_SHORT, indices_array); + _cairo_array_truncate (indices, 0); +} + +static inline void +_cairo_gl_composite_draw_triangles (cairo_gl_context_t *ctx, + unsigned int count) +{ + if (! ctx->pre_shader) { + glDrawArrays (GL_TRIANGLES, 0, count); + } else { + cairo_gl_shader_t *prev_shader = ctx->current_shader; + + _cairo_gl_set_shader (ctx, ctx->pre_shader); + _cairo_gl_set_operator (ctx, CAIRO_OPERATOR_DEST_OUT, TRUE); + glDrawArrays (GL_TRIANGLES, 0, count); + + _cairo_gl_set_shader (ctx, prev_shader); + _cairo_gl_set_operator (ctx, CAIRO_OPERATOR_ADD, TRUE); + glDrawArrays (GL_TRIANGLES, 0, count); + } +} + +static void +_cairo_gl_composite_draw_triangles_with_clip_region (cairo_gl_context_t *ctx, + unsigned int count) +{ + int i, num_rectangles; + + if (!ctx->clip_region) { + _cairo_gl_composite_draw_triangles (ctx, count); + return; + } + + num_rectangles = cairo_region_num_rectangles (ctx->clip_region); + for (i = 0; i < num_rectangles; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (ctx->clip_region, i, &rect); + + _cairo_gl_scissor_to_rectangle (ctx->current_target, &rect); + _cairo_gl_composite_draw_triangles (ctx, count); + } +} + +static void +_cairo_gl_composite_unmap_vertex_buffer (cairo_gl_context_t *ctx) +{ + ctx->vb_offset = 0; +} + +void +_cairo_gl_composite_flush (cairo_gl_context_t *ctx) +{ + unsigned int count; + int i; + + if (_cairo_gl_context_is_flushed (ctx)) + return; + + count = ctx->vb_offset / ctx->vertex_size; + _cairo_gl_composite_unmap_vertex_buffer (ctx); + + if (ctx->primitive_type == CAIRO_GL_PRIMITIVE_TYPE_TRISTRIPS) { + _cairo_gl_composite_draw_tristrip (ctx); + } else { + assert (ctx->primitive_type == CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES); + _cairo_gl_composite_draw_triangles_with_clip_region (ctx, count); + } + + for (i = 0; i < ARRAY_LENGTH (&ctx->glyph_cache); i++) + _cairo_gl_glyph_cache_unlock (&ctx->glyph_cache[i]); +} + +static void +_cairo_gl_composite_prepare_buffer (cairo_gl_context_t *ctx, + unsigned int n_vertices, + cairo_gl_primitive_type_t primitive_type) +{ + if (ctx->primitive_type != primitive_type) { + _cairo_gl_composite_flush (ctx); + ctx->primitive_type = primitive_type; + } + + assert(ctx->vbo_size > 0); + if (ctx->vb_offset + n_vertices * ctx->vertex_size > ctx->vbo_size) + _cairo_gl_composite_flush (ctx); +} + +static inline void +_cairo_gl_composite_emit_vertex (cairo_gl_context_t *ctx, + GLfloat x, GLfloat y) +{ + GLfloat *vb = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset]; + + *vb++ = x; + *vb++ = y; + + _cairo_gl_operand_emit (&ctx->operands[CAIRO_GL_TEX_SOURCE], &vb, x, y); + _cairo_gl_operand_emit (&ctx->operands[CAIRO_GL_TEX_MASK ], &vb, x, y); + + ctx->vb_offset += ctx->vertex_size; +} + +static inline void +_cairo_gl_composite_emit_alpha_vertex (cairo_gl_context_t *ctx, + GLfloat x, GLfloat y, uint8_t alpha) +{ + GLfloat *vb = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset]; + union fi { + float f; + GLbyte bytes[4]; + } fi; + + *vb++ = x; + *vb++ = y; + + _cairo_gl_operand_emit (&ctx->operands[CAIRO_GL_TEX_SOURCE], &vb, x, y); + _cairo_gl_operand_emit (&ctx->operands[CAIRO_GL_TEX_MASK ], &vb, x, y); + + fi.bytes[0] = 0; + fi.bytes[1] = 0; + fi.bytes[2] = 0; + fi.bytes[3] = alpha; + *vb++ = fi.f; + + ctx->vb_offset += ctx->vertex_size; +} + +static void +_cairo_gl_composite_emit_point (cairo_gl_context_t *ctx, + const cairo_point_t *point) +{ + _cairo_gl_composite_emit_vertex (ctx, + _cairo_fixed_to_double (point->x), + _cairo_fixed_to_double (point->y)); +} + +static void +_cairo_gl_composite_emit_rect (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2) +{ + _cairo_gl_composite_prepare_buffer (ctx, 6, + CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES); + + _cairo_gl_composite_emit_vertex (ctx, x1, y1); + _cairo_gl_composite_emit_vertex (ctx, x2, y1); + _cairo_gl_composite_emit_vertex (ctx, x1, y2); + + _cairo_gl_composite_emit_vertex (ctx, x2, y1); + _cairo_gl_composite_emit_vertex (ctx, x2, y2); + _cairo_gl_composite_emit_vertex (ctx, x1, y2); +} + +cairo_gl_emit_rect_t +_cairo_gl_context_choose_emit_rect (cairo_gl_context_t *ctx) +{ + return _cairo_gl_composite_emit_rect; +} + +void +_cairo_gl_context_emit_rect (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2) +{ + _cairo_gl_composite_emit_rect (ctx, x1, y1, x2, y2); +} + +static void +_cairo_gl_composite_emit_span (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2, + uint8_t alpha) +{ + _cairo_gl_composite_prepare_buffer (ctx, 6, + CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES); + + _cairo_gl_composite_emit_alpha_vertex (ctx, x1, y1, alpha); + _cairo_gl_composite_emit_alpha_vertex (ctx, x2, y1, alpha); + _cairo_gl_composite_emit_alpha_vertex (ctx, x1, y2, alpha); + + _cairo_gl_composite_emit_alpha_vertex (ctx, x2, y1, alpha); + _cairo_gl_composite_emit_alpha_vertex (ctx, x2, y2, alpha); + _cairo_gl_composite_emit_alpha_vertex (ctx, x1, y2, alpha); +} + +static void +_cairo_gl_composite_emit_solid_span (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2, + uint8_t alpha) +{ + GLfloat *v; + union fi { + float f; + GLbyte bytes[4]; + } fi; + + _cairo_gl_composite_prepare_buffer (ctx, 6, + CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES); + v = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset]; + + v[15] = v[ 6] = v[0] = x1; + v[10] = v[ 4] = v[1] = y1; + v[12] = v[ 9] = v[3] = x2; + v[16] = v[13] = v[7] = y2; + + fi.bytes[0] = 0; + fi.bytes[1] = 0; + fi.bytes[2] = 0; + fi.bytes[3] = alpha; + v[17] =v[14] = v[11] = v[8] = v[5] = v[2] = fi.f; + + ctx->vb_offset += 6*3 * sizeof(GLfloat); +} + +cairo_gl_emit_span_t +_cairo_gl_context_choose_emit_span (cairo_gl_context_t *ctx) +{ + if (ctx->operands[CAIRO_GL_TEX_MASK].type != CAIRO_GL_OPERAND_NONE) { + switch (ctx->operands[CAIRO_GL_TEX_MASK].type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + break; + + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + if (!ctx->operands[CAIRO_GL_TEX_MASK].gradient.texgen) + return _cairo_gl_composite_emit_span; + break; + + case CAIRO_GL_OPERAND_TEXTURE: + if (!ctx->operands[CAIRO_GL_TEX_MASK].texture.texgen) + return _cairo_gl_composite_emit_span; + break; + } + } + + switch (ctx->operands[CAIRO_GL_TEX_SOURCE].type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + break; + + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + if (!ctx->operands[CAIRO_GL_TEX_SOURCE].gradient.texgen) + return _cairo_gl_composite_emit_span; + break; + + case CAIRO_GL_OPERAND_TEXTURE: + if (!ctx->operands[CAIRO_GL_TEX_SOURCE].texture.texgen) + return _cairo_gl_composite_emit_span; + } + + return _cairo_gl_composite_emit_solid_span; +} + +static inline void +_cairo_gl_composite_emit_glyph_vertex (cairo_gl_context_t *ctx, + GLfloat x, GLfloat y, + GLfloat glyph_x, GLfloat glyph_y) +{ + GLfloat *vb = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset]; + + *vb++ = x; + *vb++ = y; + + _cairo_gl_operand_emit (&ctx->operands[CAIRO_GL_TEX_SOURCE], &vb, x, y); + + *vb++ = glyph_x; + *vb++ = glyph_y; + + ctx->vb_offset += ctx->vertex_size; +} + +static void +_cairo_gl_composite_emit_glyph (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2, + GLfloat glyph_x1, GLfloat glyph_y1, + GLfloat glyph_x2, GLfloat glyph_y2) +{ + _cairo_gl_composite_prepare_buffer (ctx, 6, + CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES); + + _cairo_gl_composite_emit_glyph_vertex (ctx, x1, y1, glyph_x1, glyph_y1); + _cairo_gl_composite_emit_glyph_vertex (ctx, x2, y1, glyph_x2, glyph_y1); + _cairo_gl_composite_emit_glyph_vertex (ctx, x1, y2, glyph_x1, glyph_y2); + + _cairo_gl_composite_emit_glyph_vertex (ctx, x2, y1, glyph_x2, glyph_y1); + _cairo_gl_composite_emit_glyph_vertex (ctx, x2, y2, glyph_x2, glyph_y2); + _cairo_gl_composite_emit_glyph_vertex (ctx, x1, y2, glyph_x1, glyph_y2); +} + +static void +_cairo_gl_composite_emit_solid_glyph (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2, + GLfloat glyph_x1, GLfloat glyph_y1, + GLfloat glyph_x2, GLfloat glyph_y2) +{ + GLfloat *v; + + _cairo_gl_composite_prepare_buffer (ctx, 6, + CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES); + + v = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset]; + + v[20] = v[ 8] = v[0] = x1; + v[13] = v[ 5] = v[1] = y1; + v[22] = v[10] = v[2] = glyph_x1; + v[15] = v[ 7] = v[3] = glyph_y1; + + v[16] = v[12] = v[4] = x2; + v[18] = v[14] = v[6] = glyph_x2; + + v[21] = v[17] = v[ 9] = y2; + v[23] = v[19] = v[11] = glyph_y2; + + ctx->vb_offset += 4 * 6 * sizeof (GLfloat); +} + +cairo_gl_emit_glyph_t +_cairo_gl_context_choose_emit_glyph (cairo_gl_context_t *ctx) +{ + switch (ctx->operands[CAIRO_GL_TEX_SOURCE].type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + return _cairo_gl_composite_emit_solid_glyph; + + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + case CAIRO_GL_OPERAND_TEXTURE: + return _cairo_gl_composite_emit_glyph; + } +} + +void +_cairo_gl_composite_fini (cairo_gl_composite_t *setup) +{ + _cairo_gl_operand_destroy (&setup->src); + _cairo_gl_operand_destroy (&setup->mask); +} + +cairo_status_t +_cairo_gl_composite_set_operator (cairo_gl_composite_t *setup, + cairo_operator_t op, + cairo_bool_t assume_component_alpha) +{ + if (assume_component_alpha) { + if (op != CAIRO_OPERATOR_CLEAR && + op != CAIRO_OPERATOR_OVER && + op != CAIRO_OPERATOR_ADD) + return UNSUPPORTED ("unsupported component alpha operator"); + } else { + if (! _cairo_gl_operator_is_supported (op)) + return UNSUPPORTED ("unsupported operator"); + } + + setup->op = op; + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gl_composite_init (cairo_gl_composite_t *setup, + cairo_operator_t op, + cairo_gl_surface_t *dst, + cairo_bool_t assume_component_alpha) +{ + cairo_status_t status; + + memset (setup, 0, sizeof (cairo_gl_composite_t)); + + status = _cairo_gl_composite_set_operator (setup, op, + assume_component_alpha); + if (status) + return status; + + setup->dst = dst; + setup->clip_region = dst->clip_region; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_gl_composite_append_vertex_indices (cairo_gl_context_t *ctx, + int number_of_new_indices) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + cairo_array_t *indices = &ctx->tristrip_indices; + int number_of_indices = _cairo_array_num_elements (indices); + unsigned short current_vertex_index = 0; + int i; + + assert (number_of_new_indices > 0); + + /* If any preexisting triangle triangle strip indices exist on this + context, we insert a set of degenerate triangles from the last + preexisting vertex to our first one. */ + if (number_of_indices > 0) { + const unsigned short *indices_array = _cairo_array_index_const (indices, 0); + current_vertex_index = indices_array[number_of_indices - 1]; + + status = _cairo_array_append (indices, ¤t_vertex_index); + if (unlikely (status)) + return status; + + current_vertex_index++; + status =_cairo_array_append (indices, ¤t_vertex_index); + if (unlikely (status)) + return status; + } + + for (i = 0; i < number_of_new_indices; i++) { + status = _cairo_array_append (indices, ¤t_vertex_index); + current_vertex_index++; + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_gl_composite_emit_quad_as_tristrip (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + const cairo_point_t quad[4]) +{ + _cairo_gl_composite_prepare_buffer (ctx, 4, + CAIRO_GL_PRIMITIVE_TYPE_TRISTRIPS); + + _cairo_gl_composite_emit_point (ctx, &quad[0]); + _cairo_gl_composite_emit_point (ctx, &quad[1]); + + /* Cairo stores quad vertices in counter-clockwise order, but we need to + emit them from top to bottom in the triangle strip, so we need to reverse + the order of the last two vertices. */ + _cairo_gl_composite_emit_point (ctx, &quad[3]); + _cairo_gl_composite_emit_point (ctx, &quad[2]); + + return _cairo_gl_composite_append_vertex_indices (ctx, 4); +} + +cairo_int_status_t +_cairo_gl_composite_emit_triangle_as_tristrip (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + const cairo_point_t triangle[3]) +{ + _cairo_gl_composite_prepare_buffer (ctx, 3, + CAIRO_GL_PRIMITIVE_TYPE_TRISTRIPS); + + _cairo_gl_composite_emit_point (ctx, &triangle[0]); + _cairo_gl_composite_emit_point (ctx, &triangle[1]); + _cairo_gl_composite_emit_point (ctx, &triangle[2]); + return _cairo_gl_composite_append_vertex_indices (ctx, 3); +} diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c new file mode 100644 index 000000000..7235d9ae1 --- /dev/null +++ b/src/cairo-gl-device.c @@ -0,0 +1,804 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * Copyright © 2010 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + * Alexandros Frantzis + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-gl-private.h" + +#define MAX_MSAA_SAMPLES 4 + +static void +_gl_lock (void *device) +{ + cairo_gl_context_t *ctx = (cairo_gl_context_t *) device; + + ctx->acquire (ctx); +} + +static void +_gl_unlock (void *device) +{ + cairo_gl_context_t *ctx = (cairo_gl_context_t *) device; + + ctx->release (ctx); +} + +static cairo_status_t +_gl_flush (void *device) +{ + cairo_gl_context_t *ctx; + cairo_status_t status; + + status = _cairo_gl_context_acquire (device, &ctx); + if (unlikely (status)) + return status; + + _cairo_gl_composite_flush (ctx); + + _cairo_gl_context_destroy_operand (ctx, CAIRO_GL_TEX_SOURCE); + _cairo_gl_context_destroy_operand (ctx, CAIRO_GL_TEX_MASK); + + if (ctx->clip_region) { + cairo_region_destroy (ctx->clip_region); + ctx->clip_region = NULL; + } + + ctx->current_target = NULL; + ctx->current_operator = -1; + ctx->vertex_size = 0; + ctx->pre_shader = NULL; + _cairo_gl_set_shader (ctx, NULL); + + ctx->dispatch.BindBuffer (GL_ARRAY_BUFFER, 0); + + glDisable (GL_SCISSOR_TEST); + glDisable (GL_BLEND); + + return _cairo_gl_context_release (ctx, status); +} + +static void +_gl_finish (void *device) +{ + cairo_gl_context_t *ctx = device; + int n; + + _gl_lock (device); + + _cairo_cache_fini (&ctx->gradients); + + _cairo_gl_context_fini_shaders (ctx); + + for (n = 0; n < ARRAY_LENGTH (ctx->glyph_cache); n++) + _cairo_gl_glyph_cache_fini (ctx, &ctx->glyph_cache[n]); + + _gl_unlock (device); +} + +static void +_gl_destroy (void *device) +{ + cairo_gl_context_t *ctx = device; + + ctx->acquire (ctx); + + while (! cairo_list_is_empty (&ctx->fonts)) { + cairo_gl_font_t *font; + + font = cairo_list_first_entry (&ctx->fonts, + cairo_gl_font_t, + link); + + cairo_list_del (&font->base.link); + cairo_list_del (&font->link); + free (font); + } + + _cairo_array_fini (&ctx->tristrip_indices); + + cairo_region_destroy (ctx->clip_region); + _cairo_clip_destroy (ctx->clip); + + free (ctx->vb); + + ctx->destroy (ctx); + + free (ctx); +} + +static const cairo_device_backend_t _cairo_gl_device_backend = { + CAIRO_DEVICE_TYPE_GL, + + _gl_lock, + _gl_unlock, + + _gl_flush, /* flush */ + _gl_finish, + _gl_destroy, +}; + +static cairo_bool_t +_cairo_gl_msaa_compositor_enabled (void) +{ + const char *env = getenv ("CAIRO_GL_COMPOSITOR"); + return env && strcmp(env, "msaa") == 0; +} + +static cairo_bool_t +test_can_read_bgra (cairo_gl_flavor_t gl_flavor) +{ + /* Desktop GL always supports BGRA formats. */ + if (gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + return TRUE; + + assert (gl_flavor == CAIRO_GL_FLAVOR_ES); + + /* For OpenGL ES we have to look for the specific extension and BGRA only + * matches cairo's integer packed bytes on little-endian machines. */ + if (!_cairo_is_little_endian()) + return FALSE; + return _cairo_gl_has_extension ("EXT_read_format_bgra"); +} + +cairo_status_t +_cairo_gl_context_init (cairo_gl_context_t *ctx) +{ + cairo_status_t status; + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + int gl_version = _cairo_gl_get_version (); + cairo_gl_flavor_t gl_flavor = _cairo_gl_get_flavor (); + int n; + + cairo_bool_t is_desktop = gl_flavor == CAIRO_GL_FLAVOR_DESKTOP; + cairo_bool_t is_gles = gl_flavor == CAIRO_GL_FLAVOR_ES; + + _cairo_device_init (&ctx->base, &_cairo_gl_device_backend); + + /* XXX The choice of compositor should be made automatically at runtime. + * However, it is useful to force one particular compositor whilst + * testing. + */ + if (_cairo_gl_msaa_compositor_enabled ()) + ctx->compositor = _cairo_gl_msaa_compositor_get (); + else + ctx->compositor = _cairo_gl_span_compositor_get (); + + + ctx->thread_aware = TRUE; + + memset (ctx->glyph_cache, 0, sizeof (ctx->glyph_cache)); + cairo_list_init (&ctx->fonts); + + /* Support only GL version >= 1.3 */ + if (gl_version < CAIRO_GL_VERSION_ENCODE (1, 3)) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + /* Check for required extensions */ + if (is_desktop) { + if (_cairo_gl_has_extension ("GL_ARB_texture_non_power_of_two")) { + ctx->tex_target = GL_TEXTURE_2D; + ctx->has_npot_repeat = TRUE; + } else if (_cairo_gl_has_extension ("GL_ARB_texture_rectangle")) { + ctx->tex_target = GL_TEXTURE_RECTANGLE; + ctx->has_npot_repeat = FALSE; + } else + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + } else { + ctx->tex_target = GL_TEXTURE_2D; + if (_cairo_gl_has_extension ("GL_OES_texture_npot") || + _cairo_gl_has_extension ("GL_IMG_texture_npot")) + ctx->has_npot_repeat = TRUE; + else + ctx->has_npot_repeat = FALSE; + } + + if (is_desktop && gl_version < CAIRO_GL_VERSION_ENCODE (2, 1) && + ! _cairo_gl_has_extension ("GL_ARB_pixel_buffer_object")) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + if (is_gles && ! _cairo_gl_has_extension ("GL_EXT_texture_format_BGRA8888")) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + ctx->has_map_buffer = + is_desktop || (is_gles && _cairo_gl_has_extension ("GL_OES_mapbuffer")); + + ctx->can_read_bgra = test_can_read_bgra (gl_flavor); + + ctx->has_mesa_pack_invert = + _cairo_gl_has_extension ("GL_MESA_pack_invert"); + + ctx->has_packed_depth_stencil = + (is_desktop && _cairo_gl_has_extension ("GL_EXT_packed_depth_stencil")) || + (is_gles && _cairo_gl_has_extension ("GL_OES_packed_depth_stencil")); + + ctx->num_samples = 1; + +#if CAIRO_HAS_GL_SURFACE + if (is_desktop && ctx->has_packed_depth_stencil && + (gl_version >= CAIRO_GL_VERSION_ENCODE (3, 0) || + _cairo_gl_has_extension ("GL_ARB_framebuffer_object") || + (_cairo_gl_has_extension ("GL_EXT_framebuffer_blit") && + _cairo_gl_has_extension ("GL_EXT_framebuffer_multisample")))) { + glGetIntegerv(GL_MAX_SAMPLES_EXT, &ctx->num_samples); + } +#endif + +#if CAIRO_HAS_GLESV2_SURFACE && defined(GL_MAX_SAMPLES_EXT) + if (is_gles && ctx->has_packed_depth_stencil && + _cairo_gl_has_extension ("GL_EXT_multisampled_render_to_texture")) { + glGetIntegerv(GL_MAX_SAMPLES_EXT, &ctx->num_samples); + } +#endif + +#if CAIRO_HAS_GLESV2_SURFACE && defined(GL_MAX_SAMPLES_IMG) + if (is_gles && ctx->has_packed_depth_stencil && + _cairo_gl_has_extension ("GL_IMG_multisampled_render_to_texture")) { + glGetIntegerv(GL_MAX_SAMPLES_IMG, &ctx->num_samples); + } +#endif + + ctx->supports_msaa = ctx->num_samples > 1; + if (ctx->num_samples > MAX_MSAA_SAMPLES) + ctx->num_samples = MAX_MSAA_SAMPLES; + + + ctx->current_operator = -1; + ctx->gl_flavor = gl_flavor; + + status = _cairo_gl_context_init_shaders (ctx); + if (unlikely (status)) + return status; + + status = _cairo_cache_init (&ctx->gradients, + _cairo_gl_gradient_equal, + NULL, + (cairo_destroy_func_t) _cairo_gl_gradient_destroy, + CAIRO_GL_GRADIENT_CACHE_SIZE); + if (unlikely (status)) + return status; + + ctx->vbo_size = _cairo_gl_get_vbo_size(); + + ctx->vb = malloc (ctx->vbo_size); + if (unlikely (ctx->vb == NULL)) { + _cairo_cache_fini (&ctx->gradients); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + ctx->primitive_type = CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES; + _cairo_array_init (&ctx->tristrip_indices, sizeof (unsigned short)); + + /* PBO for any sort of texture upload */ + dispatch->GenBuffers (1, &ctx->texture_load_pbo); + + ctx->max_framebuffer_size = 0; + glGetIntegerv (GL_MAX_RENDERBUFFER_SIZE, &ctx->max_framebuffer_size); + ctx->max_texture_size = 0; + glGetIntegerv (GL_MAX_TEXTURE_SIZE, &ctx->max_texture_size); + ctx->max_textures = 0; + glGetIntegerv (GL_MAX_TEXTURE_IMAGE_UNITS, &ctx->max_textures); + + for (n = 0; n < ARRAY_LENGTH (ctx->glyph_cache); n++) + _cairo_gl_glyph_cache_init (&ctx->glyph_cache[n]); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gl_context_activate (cairo_gl_context_t *ctx, + cairo_gl_tex_t tex_unit) +{ + if (ctx->max_textures <= (GLint) tex_unit) { + if (tex_unit < 2) { + _cairo_gl_composite_flush (ctx); + _cairo_gl_context_destroy_operand (ctx, ctx->max_textures - 1); + } + glActiveTexture (ctx->max_textures - 1); + } else { + glActiveTexture (GL_TEXTURE0 + tex_unit); + } +} + +static GLenum +_get_depth_stencil_format (cairo_gl_context_t *ctx) +{ + /* This is necessary to properly handle the situation where both + OpenGL and OpenGLES are active and returning a sane default. */ +#if CAIRO_HAS_GL_SURFACE + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + return GL_DEPTH_STENCIL; +#endif + +#if CAIRO_HAS_GLESV2_SURFACE + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + return GL_DEPTH24_STENCIL8_OES; +#endif + +#if CAIRO_HAS_GL_SURFACE + return GL_DEPTH_STENCIL; +#elif CAIRO_HAS_GLESV2_SURFACE + return GL_DEPTH24_STENCIL8_OES; +#endif +} + +#if CAIRO_HAS_GLESV2_SURFACE +static void +_cairo_gl_ensure_msaa_gles_framebuffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + if (surface->msaa_active) + return; + + ctx->dispatch.FramebufferTexture2DMultisample(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + ctx->tex_target, + surface->tex, + 0, + ctx->num_samples); + + /* From now on MSAA will always be active on this surface. */ + surface->msaa_active = TRUE; +} +#endif + +static void +_cairo_gl_ensure_framebuffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + GLenum status; + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + + if (likely (surface->fb)) + return; + + /* Create a framebuffer object wrapping the texture so that we can render + * to it. + */ + dispatch->GenFramebuffers (1, &surface->fb); + dispatch->BindFramebuffer (GL_FRAMEBUFFER, surface->fb); + + /* Unlike for desktop GL we only maintain one multisampling framebuffer + for OpenGLES since the EXT_multisampled_render_to_texture extension + does not require an explicit multisample resolution. */ +#if CAIRO_HAS_GLESV2_SURFACE + if (surface->supports_msaa && _cairo_gl_msaa_compositor_enabled () && + ctx->gl_flavor == CAIRO_GL_FLAVOR_ES) { + _cairo_gl_ensure_msaa_gles_framebuffer (ctx, surface); + } else +#endif + dispatch->FramebufferTexture2D (GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + ctx->tex_target, + surface->tex, + 0); + +#if CAIRO_HAS_GL_SURFACE + glDrawBuffer (GL_COLOR_ATTACHMENT0); + glReadBuffer (GL_COLOR_ATTACHMENT0); +#endif + + status = dispatch->CheckFramebufferStatus (GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + const char *str; + switch (status) { + //case GL_FRAMEBUFFER_UNDEFINED: str= "undefined"; break; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: str= "incomplete attachment"; break; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: str= "incomplete/missing attachment"; break; + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: str= "incomplete draw buffer"; break; + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: str= "incomplete read buffer"; break; + case GL_FRAMEBUFFER_UNSUPPORTED: str= "unsupported"; break; + case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: str= "incomplete multiple"; break; + default: str = "unknown error"; break; + } + + fprintf (stderr, + "destination is framebuffer incomplete: %s [%#x]\n", + str, status); + } +} +#if CAIRO_HAS_GL_SURFACE +static void +_cairo_gl_ensure_multisampling (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + assert (surface->supports_msaa); + assert (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP); + + if (surface->msaa_fb) + return; + + /* We maintain a separate framebuffer for multisampling operations. + This allows us to do a fast paint to the non-multisampling framebuffer + when mulitsampling is disabled. */ + ctx->dispatch.GenFramebuffers (1, &surface->msaa_fb); + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, surface->msaa_fb); + ctx->dispatch.GenRenderbuffers (1, &surface->msaa_rb); + ctx->dispatch.BindRenderbuffer (GL_RENDERBUFFER, surface->msaa_rb); + + /* FIXME: For now we assume that textures passed from the outside have GL_RGBA + format, but eventually we need to expose a way for the API consumer to pass + this information. */ + ctx->dispatch.RenderbufferStorageMultisample (GL_RENDERBUFFER, + ctx->num_samples, + GL_RGBA, + surface->width, + surface->height); + ctx->dispatch.FramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + surface->msaa_rb); + + /* Cairo surfaces start out initialized to transparent (black) */ + glDisable (GL_SCISSOR_TEST); + glClearColor (0, 0, 0, 0); + glClear (GL_COLOR_BUFFER_BIT); +} +#endif + +static cairo_bool_t +_cairo_gl_ensure_msaa_depth_stencil_buffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + if (surface->msaa_depth_stencil) + return TRUE; + + _cairo_gl_ensure_framebuffer (ctx, surface); +#if CAIRO_HAS_GL_SURFACE + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + _cairo_gl_ensure_multisampling (ctx, surface); +#endif + + dispatch->GenRenderbuffers (1, &surface->msaa_depth_stencil); + dispatch->BindRenderbuffer (GL_RENDERBUFFER, + surface->msaa_depth_stencil); + + dispatch->RenderbufferStorageMultisample (GL_RENDERBUFFER, + ctx->num_samples, + _get_depth_stencil_format (ctx), + surface->width, + surface->height); + +#if CAIRO_HAS_GL_SURFACE + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) { + dispatch->FramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_DEPTH_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, + surface->msaa_depth_stencil); + } +#endif + +#if CAIRO_HAS_GLESV2_SURFACE + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES) { + dispatch->FramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + surface->msaa_depth_stencil); + dispatch->FramebufferRenderbuffer (GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, + surface->msaa_depth_stencil); + } +#endif + + if (dispatch->CheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + dispatch->DeleteRenderbuffers (1, &surface->msaa_depth_stencil); + surface->msaa_depth_stencil = 0; + return FALSE; + } + + return TRUE; +} + +static cairo_bool_t +_cairo_gl_ensure_depth_stencil_buffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + + if (surface->depth_stencil) + return TRUE; + + _cairo_gl_ensure_framebuffer (ctx, surface); + + dispatch->GenRenderbuffers (1, &surface->depth_stencil); + dispatch->BindRenderbuffer (GL_RENDERBUFFER, surface->depth_stencil); + dispatch->RenderbufferStorage (GL_RENDERBUFFER, + _get_depth_stencil_format (ctx), + surface->width, surface->height); + + dispatch->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, surface->depth_stencil); + dispatch->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, surface->depth_stencil); + if (dispatch->CheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + dispatch->DeleteRenderbuffers (1, &surface->depth_stencil); + surface->depth_stencil = 0; + return FALSE; + } + + return TRUE; +} + +cairo_bool_t +_cairo_gl_ensure_stencil (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + if (! _cairo_gl_surface_is_texture (surface)) + return TRUE; /* best guess for now, will check later */ + if (! ctx->has_packed_depth_stencil) + return FALSE; + + if (surface->msaa_active) + return _cairo_gl_ensure_msaa_depth_stencil_buffer (ctx, surface); + else + return _cairo_gl_ensure_depth_stencil_buffer (ctx, surface); +} + +/* + * Stores a parallel projection transformation in matrix 'm', + * using column-major order. + * + * This is equivalent to: + * + * glLoadIdentity() + * gluOrtho2D() + * + * The calculation for the ortho tranformation was taken from the + * mesa source code. + */ +static void +_gl_identity_ortho (GLfloat *m, + GLfloat left, GLfloat right, + GLfloat bottom, GLfloat top) +{ +#define M(row,col) m[col*4+row] + M(0,0) = 2.f / (right - left); + M(0,1) = 0.f; + M(0,2) = 0.f; + M(0,3) = -(right + left) / (right - left); + + M(1,0) = 0.f; + M(1,1) = 2.f / (top - bottom); + M(1,2) = 0.f; + M(1,3) = -(top + bottom) / (top - bottom); + + M(2,0) = 0.f; + M(2,1) = 0.f; + M(2,2) = -1.f; + M(2,3) = 0.f; + + M(3,0) = 0.f; + M(3,1) = 0.f; + M(3,2) = 0.f; + M(3,3) = 1.f; +#undef M +} + +#if CAIRO_HAS_GL_SURFACE +static void +bind_multisample_framebuffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + cairo_bool_t stencil_test_enabled; + cairo_bool_t scissor_test_enabled; + + assert (surface->supports_msaa); + assert (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP); + + _cairo_gl_ensure_framebuffer (ctx, surface); + _cairo_gl_ensure_multisampling (ctx, surface); + + if (surface->msaa_active) { + glEnable (GL_MULTISAMPLE); + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, surface->msaa_fb); + return; + } + + _cairo_gl_composite_flush (ctx); + + stencil_test_enabled = glIsEnabled (GL_STENCIL_TEST); + scissor_test_enabled = glIsEnabled (GL_SCISSOR_TEST); + glDisable (GL_STENCIL_TEST); + glDisable (GL_SCISSOR_TEST); + + glEnable (GL_MULTISAMPLE); + + /* The last time we drew to the surface, we were not using multisampling, + so we need to blit from the non-multisampling framebuffer into the + multisampling framebuffer. */ + ctx->dispatch.BindFramebuffer (GL_DRAW_FRAMEBUFFER, surface->msaa_fb); + ctx->dispatch.BindFramebuffer (GL_READ_FRAMEBUFFER, surface->fb); + ctx->dispatch.BlitFramebuffer (0, 0, surface->width, surface->height, + 0, 0, surface->width, surface->height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, surface->msaa_fb); + + if (stencil_test_enabled) + glEnable (GL_STENCIL_TEST); + if (scissor_test_enabled) + glEnable (GL_SCISSOR_TEST); +} +#endif + +#if CAIRO_HAS_GL_SURFACE +static void +bind_singlesample_framebuffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface) +{ + cairo_bool_t stencil_test_enabled; + cairo_bool_t scissor_test_enabled; + + assert (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP); + _cairo_gl_ensure_framebuffer (ctx, surface); + + if (! surface->msaa_active) { + glDisable (GL_MULTISAMPLE); + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, surface->fb); + return; + } + + _cairo_gl_composite_flush (ctx); + + stencil_test_enabled = glIsEnabled (GL_STENCIL_TEST); + scissor_test_enabled = glIsEnabled (GL_SCISSOR_TEST); + glDisable (GL_STENCIL_TEST); + glDisable (GL_SCISSOR_TEST); + + glDisable (GL_MULTISAMPLE); + + /* The last time we drew to the surface, we were using multisampling, + so we need to blit from the multisampling framebuffer into the + non-multisampling framebuffer. */ + ctx->dispatch.BindFramebuffer (GL_DRAW_FRAMEBUFFER, surface->fb); + ctx->dispatch.BindFramebuffer (GL_READ_FRAMEBUFFER, surface->msaa_fb); + ctx->dispatch.BlitFramebuffer (0, 0, surface->width, surface->height, + 0, 0, surface->width, surface->height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, surface->fb); + + if (stencil_test_enabled) + glEnable (GL_STENCIL_TEST); + if (scissor_test_enabled) + glEnable (GL_SCISSOR_TEST); +} +#endif + +void +_cairo_gl_context_bind_framebuffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface, + cairo_bool_t multisampling) +{ + if (_cairo_gl_surface_is_texture (surface)) { + /* OpenGL ES surfaces only have either a multisample framebuffer or a + * singlesample framebuffer, so we cannot switch back and forth. */ + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES) { + _cairo_gl_ensure_framebuffer (ctx, surface); + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, surface->fb); + return; + } + +#if CAIRO_HAS_GL_SURFACE + if (multisampling) + bind_multisample_framebuffer (ctx, surface); + else + bind_singlesample_framebuffer (ctx, surface); +#endif + } else { + ctx->dispatch.BindFramebuffer (GL_FRAMEBUFFER, 0); + +#if CAIRO_HAS_GL_SURFACE + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) { + if (multisampling) + glEnable (GL_MULTISAMPLE); + else + glDisable (GL_MULTISAMPLE); + } +#endif + } + + surface->msaa_active = multisampling; +} + +void +_cairo_gl_context_set_destination (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface, + cairo_bool_t multisampling) +{ + cairo_bool_t changing_surface, changing_sampling; + + /* The decision whether or not to use multisampling happens when + * we create an OpenGL ES surface, so we can never switch modes. */ + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES) + multisampling = surface->msaa_active; + + changing_surface = ctx->current_target != surface || surface->needs_update; + changing_sampling = surface->msaa_active != multisampling; + if (! changing_surface && ! changing_sampling) + return; + + if (! changing_surface) { + _cairo_gl_composite_flush (ctx); + _cairo_gl_context_bind_framebuffer (ctx, surface, multisampling); + return; + } + + _cairo_gl_composite_flush (ctx); + + ctx->current_target = surface; + surface->needs_update = FALSE; + + if (! _cairo_gl_surface_is_texture (surface)) { + ctx->make_current (ctx, surface); + } + + _cairo_gl_context_bind_framebuffer (ctx, surface, multisampling); + + if (! _cairo_gl_surface_is_texture (surface)) { +#if CAIRO_HAS_GL_SURFACE + glDrawBuffer (GL_BACK_LEFT); + glReadBuffer (GL_BACK_LEFT); +#endif + } + + glDisable (GL_DITHER); + glViewport (0, 0, surface->width, surface->height); + + if (_cairo_gl_surface_is_texture (surface)) + _gl_identity_ortho (ctx->modelviewprojection_matrix, + 0, surface->width, 0, surface->height); + else + _gl_identity_ortho (ctx->modelviewprojection_matrix, + 0, surface->width, surface->height, 0); +} + +void +cairo_gl_device_set_thread_aware (cairo_device_t *device, + cairo_bool_t thread_aware) +{ + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return; + } + ((cairo_gl_context_t *) device)->thread_aware = thread_aware; +} diff --git a/src/cairo-gl-dispatch-private.h b/src/cairo-gl-dispatch-private.h new file mode 100644 index 000000000..cabf76f0d --- /dev/null +++ b/src/cairo-gl-dispatch-private.h @@ -0,0 +1,129 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Alexandros Frantzis + */ + +#ifndef CAIRO_GL_DISPATCH_PRIVATE_H +#define CAIRO_GL_DISPATCH_PRIVATE_H + +#include "cairo-gl-private.h" +#include + +typedef enum _cairo_gl_dispatch_name { + CAIRO_GL_DISPATCH_NAME_CORE, + CAIRO_GL_DISPATCH_NAME_EXT, + CAIRO_GL_DISPATCH_NAME_ES, + CAIRO_GL_DISPATCH_NAME_COUNT +} cairo_gl_dispatch_name_t; + +typedef struct _cairo_gl_dispatch_entry { + const char *name[CAIRO_GL_DISPATCH_NAME_COUNT]; + size_t offset; +} cairo_gl_dispatch_entry_t; + +#define DISPATCH_ENTRY_ARB(name) { { "gl"#name, "gl"#name"ARB", "gl"#name }, \ + offsetof(cairo_gl_dispatch_t, name) } +#define DISPATCH_ENTRY_EXT(name) { { "gl"#name, "gl"#name"EXT", "gl"#name }, \ + offsetof(cairo_gl_dispatch_t, name) } +#define DISPATCH_ENTRY_ARB_OES(name) { { "gl"#name, "gl"#name"ARB", "gl"#name"OES" }, \ + offsetof(cairo_gl_dispatch_t, name) } +#define DISPATCH_ENTRY_EXT_IMG(name) { { "gl"#name, "gl"#name"EXT", "gl"#name"IMG" }, \ + offsetof(cairo_gl_dispatch_t, name) } +#define DISPATCH_ENTRY_CUSTOM(name, name2) { { "gl"#name, "gl"#name2, "gl"#name }, \ + offsetof(cairo_gl_dispatch_t, name)} +#define DISPATCH_ENTRY_LAST { { NULL, NULL, NULL }, 0 } + +cairo_private cairo_gl_dispatch_entry_t dispatch_buffers_entries[] = { + DISPATCH_ENTRY_ARB (GenBuffers), + DISPATCH_ENTRY_ARB (BindBuffer), + DISPATCH_ENTRY_ARB (BufferData), + DISPATCH_ENTRY_ARB_OES (MapBuffer), + DISPATCH_ENTRY_ARB_OES (UnmapBuffer), + DISPATCH_ENTRY_LAST +}; + +cairo_private cairo_gl_dispatch_entry_t dispatch_shaders_entries[] = { + /* Shaders */ + DISPATCH_ENTRY_CUSTOM (CreateShader, CreateShaderObjectARB), + DISPATCH_ENTRY_ARB (ShaderSource), + DISPATCH_ENTRY_ARB (CompileShader), + DISPATCH_ENTRY_CUSTOM (GetShaderiv, GetObjectParameterivARB), + DISPATCH_ENTRY_CUSTOM (GetShaderInfoLog, GetInfoLogARB), + DISPATCH_ENTRY_CUSTOM (DeleteShader, DeleteObjectARB), + + /* Programs */ + DISPATCH_ENTRY_CUSTOM (CreateProgram, CreateProgramObjectARB), + DISPATCH_ENTRY_CUSTOM (AttachShader, AttachObjectARB), + DISPATCH_ENTRY_CUSTOM (DeleteProgram, DeleteObjectARB), + DISPATCH_ENTRY_ARB (LinkProgram), + DISPATCH_ENTRY_CUSTOM (UseProgram, UseProgramObjectARB), + DISPATCH_ENTRY_CUSTOM (GetProgramiv, GetObjectParameterivARB), + DISPATCH_ENTRY_CUSTOM (GetProgramInfoLog, GetInfoLogARB), + + /* Uniforms */ + DISPATCH_ENTRY_ARB (GetUniformLocation), + DISPATCH_ENTRY_ARB (Uniform1f), + DISPATCH_ENTRY_ARB (Uniform2f), + DISPATCH_ENTRY_ARB (Uniform3f), + DISPATCH_ENTRY_ARB (Uniform4f), + DISPATCH_ENTRY_ARB (UniformMatrix3fv), + DISPATCH_ENTRY_ARB (UniformMatrix4fv), + DISPATCH_ENTRY_ARB (Uniform1i), + + /* Attributes */ + DISPATCH_ENTRY_ARB (BindAttribLocation), + DISPATCH_ENTRY_ARB (VertexAttribPointer), + DISPATCH_ENTRY_ARB (EnableVertexAttribArray), + DISPATCH_ENTRY_ARB (DisableVertexAttribArray), + + DISPATCH_ENTRY_LAST +}; + +cairo_private cairo_gl_dispatch_entry_t dispatch_fbo_entries[] = { + DISPATCH_ENTRY_EXT (GenFramebuffers), + DISPATCH_ENTRY_EXT (BindFramebuffer), + DISPATCH_ENTRY_EXT (FramebufferTexture2D), + DISPATCH_ENTRY_EXT (CheckFramebufferStatus), + DISPATCH_ENTRY_EXT (DeleteFramebuffers), + DISPATCH_ENTRY_EXT (GenRenderbuffers), + DISPATCH_ENTRY_EXT (BindRenderbuffer), + DISPATCH_ENTRY_EXT (RenderbufferStorage), + DISPATCH_ENTRY_EXT (FramebufferRenderbuffer), + DISPATCH_ENTRY_EXT (DeleteRenderbuffers), + DISPATCH_ENTRY_EXT (BlitFramebuffer), + DISPATCH_ENTRY_LAST +}; + +cairo_private cairo_gl_dispatch_entry_t dispatch_multisampling_entries[] = { + DISPATCH_ENTRY_EXT_IMG (RenderbufferStorageMultisample), + DISPATCH_ENTRY_EXT_IMG (FramebufferTexture2DMultisample), + DISPATCH_ENTRY_LAST +}; + +#endif /* CAIRO_GL_DISPATCH_PRIVATE_H */ diff --git a/src/cairo-gl-dispatch.c b/src/cairo-gl-dispatch.c new file mode 100644 index 000000000..76c3115ba --- /dev/null +++ b/src/cairo-gl-dispatch.c @@ -0,0 +1,261 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Alexandros Frantzis + */ + +#include "cairoint.h" +#include "cairo-gl-private.h" +#include "cairo-gl-dispatch-private.h" +#if CAIRO_HAS_DLSYM +#include +#endif + +#if CAIRO_HAS_DLSYM +static void * +_cairo_gl_dispatch_open_lib (void) +{ + return dlopen (NULL, RTLD_LAZY); +} + +static void +_cairo_gl_dispatch_close_lib (void *handle) +{ + dlclose (handle); +} + +static cairo_gl_generic_func_t +_cairo_gl_dispatch_get_proc_addr (void *handle, const char *name) +{ + return (cairo_gl_generic_func_t) dlsym (handle, name); +} +#else +static void * +_cairo_gl_dispatch_open_lib (void) +{ + return NULL; +} + +static void +_cairo_gl_dispatch_close_lib (void *handle) +{ + return; +} + +static cairo_gl_generic_func_t +_cairo_gl_dispatch_get_proc_addr (void *handle, const char *name) +{ + return NULL; +} +#endif /* CAIRO_HAS_DLSYM */ + + +static void +_cairo_gl_dispatch_init_entries (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr, + cairo_gl_dispatch_entry_t *entries, + cairo_gl_dispatch_name_t dispatch_name) +{ + cairo_gl_dispatch_entry_t *entry = entries; + void *handle = _cairo_gl_dispatch_open_lib (); + + while (entry->name[CAIRO_GL_DISPATCH_NAME_CORE] != NULL) { + void *dispatch_ptr = &((char *) dispatch)[entry->offset]; + const char *name = entry->name[dispatch_name]; + + /* + * In strictly conforming EGL implementations, eglGetProcAddress() can + * be used only to get extension functions, but some of the functions + * we want belong to core GL(ES). If the *GetProcAddress function + * provided by the context fails, try to get the address of the wanted + * GL function using standard system facilities (eg dlsym() in *nix + * systems). + */ + cairo_gl_generic_func_t func = get_proc_addr (name); + if (func == NULL) + func = _cairo_gl_dispatch_get_proc_addr (handle, name); + + *((cairo_gl_generic_func_t *) dispatch_ptr) = func; + + ++entry; + } + + _cairo_gl_dispatch_close_lib (handle); +} + +static cairo_status_t +_cairo_gl_dispatch_init_buffers (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr, + int gl_version, cairo_gl_flavor_t gl_flavor) +{ + cairo_gl_dispatch_name_t dispatch_name; + + if (gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + { + if (gl_version >= CAIRO_GL_VERSION_ENCODE (1, 5)) + dispatch_name = CAIRO_GL_DISPATCH_NAME_CORE; + else if (_cairo_gl_has_extension ("GL_ARB_vertex_buffer_object")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_EXT; + else + return CAIRO_STATUS_DEVICE_ERROR; + } + else if (gl_flavor == CAIRO_GL_FLAVOR_ES && + gl_version >= CAIRO_GL_VERSION_ENCODE (2, 0)) + { + dispatch_name = CAIRO_GL_DISPATCH_NAME_ES; + } + else + { + return CAIRO_STATUS_DEVICE_ERROR; + } + + _cairo_gl_dispatch_init_entries (dispatch, get_proc_addr, + dispatch_buffers_entries, dispatch_name); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_dispatch_init_shaders (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr, + int gl_version, cairo_gl_flavor_t gl_flavor) +{ + cairo_gl_dispatch_name_t dispatch_name; + + if (gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + { + if (gl_version >= CAIRO_GL_VERSION_ENCODE (2, 0)) + dispatch_name = CAIRO_GL_DISPATCH_NAME_CORE; + else if (_cairo_gl_has_extension ("GL_ARB_shader_objects")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_EXT; + else + return CAIRO_STATUS_DEVICE_ERROR; + } + else if (gl_flavor == CAIRO_GL_FLAVOR_ES && + gl_version >= CAIRO_GL_VERSION_ENCODE (2, 0)) + { + dispatch_name = CAIRO_GL_DISPATCH_NAME_ES; + } + else + { + return CAIRO_STATUS_DEVICE_ERROR; + } + + _cairo_gl_dispatch_init_entries (dispatch, get_proc_addr, + dispatch_shaders_entries, dispatch_name); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_dispatch_init_fbo (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr, + int gl_version, cairo_gl_flavor_t gl_flavor) +{ + cairo_gl_dispatch_name_t dispatch_name; + + if (gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + { + if (gl_version >= CAIRO_GL_VERSION_ENCODE (3, 0) || + _cairo_gl_has_extension ("GL_ARB_framebuffer_object")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_CORE; + else if (_cairo_gl_has_extension ("GL_EXT_framebuffer_object")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_EXT; + else + return CAIRO_STATUS_DEVICE_ERROR; + } + else if (gl_flavor == CAIRO_GL_FLAVOR_ES && + gl_version >= CAIRO_GL_VERSION_ENCODE (2, 0)) + { + dispatch_name = CAIRO_GL_DISPATCH_NAME_ES; + } + else + { + return CAIRO_STATUS_DEVICE_ERROR; + } + + _cairo_gl_dispatch_init_entries (dispatch, get_proc_addr, + dispatch_fbo_entries, dispatch_name); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_dispatch_init_multisampling (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr, + int gl_version, + cairo_gl_flavor_t gl_flavor) +{ + /* For the multisampling table, there are two GLES versions of the + * extension, so we put one in the EXT slot and one in the real ES slot.*/ + cairo_gl_dispatch_name_t dispatch_name = CAIRO_GL_DISPATCH_NAME_CORE; + if (gl_flavor == CAIRO_GL_FLAVOR_ES) { + if (_cairo_gl_has_extension ("GL_EXT_multisampled_render_to_texture")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_EXT; + else if (_cairo_gl_has_extension ("GL_IMG_multisampled_render_to_texture")) + dispatch_name = CAIRO_GL_DISPATCH_NAME_ES; + } + _cairo_gl_dispatch_init_entries (dispatch, get_proc_addr, + dispatch_multisampling_entries, + dispatch_name); + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gl_dispatch_init (cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr) +{ + cairo_status_t status; + int gl_version; + cairo_gl_flavor_t gl_flavor; + + gl_version = _cairo_gl_get_version (); + gl_flavor = _cairo_gl_get_flavor (); + + status = _cairo_gl_dispatch_init_buffers (dispatch, get_proc_addr, + gl_version, gl_flavor); + if (status != CAIRO_STATUS_SUCCESS) + return status; + + status = _cairo_gl_dispatch_init_shaders (dispatch, get_proc_addr, + gl_version, gl_flavor); + if (status != CAIRO_STATUS_SUCCESS) + return status; + + status = _cairo_gl_dispatch_init_fbo (dispatch, get_proc_addr, + gl_version, gl_flavor); + if (status != CAIRO_STATUS_SUCCESS) + return status; + + status = _cairo_gl_dispatch_init_multisampling (dispatch, get_proc_addr, + gl_version, gl_flavor); + if (status != CAIRO_STATUS_SUCCESS) + return status; + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/cairo-gl-ext-def-private.h b/src/cairo-gl-ext-def-private.h new file mode 100644 index 000000000..a261947be --- /dev/null +++ b/src/cairo-gl-ext-def-private.h @@ -0,0 +1,143 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Alexandros Frantzis + */ + +#ifndef CAIRO_GL_EXT_DEF_PRIVATE_H +#define CAIRO_GL_EXT_DEF_PRIVATE_H + +#ifndef GL_TEXTURE_RECTANGLE +#define GL_TEXTURE_RECTANGLE 0x84F5 +#endif + +#ifndef GL_ARRAY_BUFFER +#define GL_ARRAY_BUFFER 0x8892 +#endif + +#ifndef GL_STREAM_DRAW +#define GL_STREAM_DRAW 0x88E0 +#endif + +#ifndef GL_WRITE_ONLY +#define GL_WRITE_ONLY 0x88B9 +#endif + +#ifndef GL_PIXEL_UNPACK_BUFFER +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#endif + +#ifndef GL_FRAMEBUFFER +#define GL_FRAMEBUFFER 0x8D40 +#endif + +#ifndef GL_COLOR_ATTACHMENT0 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#endif + +#ifndef GL_FRAMEBUFFER_COMPLETE +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_FORMATS +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS 0x8CDA +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#endif + +#ifndef GL_FRAMEBUFFER_UNSUPPORTED +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#endif + +#ifndef GL_PACK_INVERT_MESA +#define GL_PACK_INVERT_MESA 0x8758 +#endif + +#ifndef GL_CLAMP_TO_BORDER +#define GL_CLAMP_TO_BORDER 0x812D +#endif + +#ifndef GL_BGR +#define GL_BGR 0x80E0 +#endif + +#ifndef GL_BGRA +#define GL_BGRA 0x80E1 +#endif + +#ifndef GL_RGBA8 +#define GL_RGBA8 0x8058 +#endif + +#ifndef GL_UNSIGNED_INT_8_8_8_8 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#endif + +#ifndef GL_UNSIGNED_SHORT_5_6_5_REV +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#endif + +#ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#endif + +#ifndef GL_UNSIGNED_INT_8_8_8_8_REV +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#endif + +#ifndef GL_PACK_ROW_LENGTH +#define GL_PACK_ROW_LENGTH 0x0D02 +#endif + +#ifndef GL_UNPACK_ROW_LENGTH +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#endif + +#endif /* CAIRO_GL_EXT_DEF_PRIVATE_H */ diff --git a/src/cairo-gl-glyphs.c b/src/cairo-gl-glyphs.c new file mode 100644 index 000000000..8a1a548d9 --- /dev/null +++ b/src/cairo-gl-glyphs.c @@ -0,0 +1,503 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * Copyright © 2010 Intel Corporation + * Copyright © 2010 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributors: + * Benjamin Otte + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-rtree-private.h" + +#define GLYPH_CACHE_WIDTH 1024 +#define GLYPH_CACHE_HEIGHT 1024 +#define GLYPH_CACHE_MIN_SIZE 4 +#define GLYPH_CACHE_MAX_SIZE 128 + +typedef struct _cairo_gl_glyph { + cairo_rtree_node_t node; + cairo_scaled_glyph_private_t base; + cairo_scaled_glyph_t *glyph; + cairo_gl_glyph_cache_t *cache; + struct { float x, y; } p1, p2; +} cairo_gl_glyph_t; + +static void +_cairo_gl_node_destroy (cairo_rtree_node_t *node) +{ + cairo_gl_glyph_t *priv = cairo_container_of (node, cairo_gl_glyph_t, node); + cairo_scaled_glyph_t *glyph; + + glyph = priv->glyph; + if (glyph == NULL) + return; + + if (glyph->dev_private_key == priv->cache) { + glyph->dev_private = NULL; + glyph->dev_private_key = NULL; + } + cairo_list_del (&priv->base.link); + priv->glyph = NULL; +} + +static void +_cairo_gl_glyph_fini (cairo_scaled_glyph_private_t *glyph_private, + cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font) +{ + cairo_gl_glyph_t *priv = cairo_container_of (glyph_private, + cairo_gl_glyph_t, + base); + + assert (priv->glyph); + + _cairo_gl_node_destroy (&priv->node); + + /* XXX thread-safety? Probably ok due to the frozen scaled-font. */ + if (! priv->node.pinned) + _cairo_rtree_node_remove (&priv->cache->rtree, &priv->node); + + assert (priv->glyph == NULL); +} + +static cairo_int_status_t +_cairo_gl_glyph_cache_add_glyph (cairo_gl_context_t *ctx, + cairo_gl_glyph_cache_t *cache, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_image_surface_t *glyph_surface = scaled_glyph->surface; + cairo_gl_glyph_t *glyph_private; + cairo_rtree_node_t *node = NULL; + cairo_int_status_t status; + int width, height; + + width = glyph_surface->width; + if (width < GLYPH_CACHE_MIN_SIZE) + width = GLYPH_CACHE_MIN_SIZE; + height = glyph_surface->height; + if (height < GLYPH_CACHE_MIN_SIZE) + height = GLYPH_CACHE_MIN_SIZE; + + /* search for an available slot */ + status = _cairo_rtree_insert (&cache->rtree, width, height, &node); + /* search for an unlocked slot */ + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_rtree_evict_random (&cache->rtree, + width, height, &node); + if (status == CAIRO_INT_STATUS_SUCCESS) { + status = _cairo_rtree_node_insert (&cache->rtree, + node, width, height, &node); + } + } + if (status) + return status; + + /* XXX: Make sure we use the mask texture. This should work automagically somehow */ + glActiveTexture (GL_TEXTURE1); + status = _cairo_gl_surface_draw_image (cache->surface, glyph_surface, + 0, 0, + glyph_surface->width, glyph_surface->height, + node->x, node->y, FALSE); + if (unlikely (status)) + return status; + + glyph_private = (cairo_gl_glyph_t *) node; + glyph_private->cache = cache; + glyph_private->glyph = scaled_glyph; + _cairo_scaled_glyph_attach_private (scaled_glyph, + &glyph_private->base, + cache, + _cairo_gl_glyph_fini); + + scaled_glyph->dev_private = glyph_private; + scaled_glyph->dev_private_key = cache; + + /* compute tex coords */ + glyph_private->p1.x = node->x; + glyph_private->p1.y = node->y; + glyph_private->p2.x = node->x + glyph_surface->width; + glyph_private->p2.y = node->y + glyph_surface->height; + if (! _cairo_gl_device_requires_power_of_two_textures (&ctx->base)) { + glyph_private->p1.x /= GLYPH_CACHE_WIDTH; + glyph_private->p2.x /= GLYPH_CACHE_WIDTH; + glyph_private->p1.y /= GLYPH_CACHE_HEIGHT; + glyph_private->p2.y /= GLYPH_CACHE_HEIGHT; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_gl_glyph_t * +_cairo_gl_glyph_cache_lock (cairo_gl_glyph_cache_t *cache, + cairo_scaled_glyph_t *scaled_glyph) +{ + return _cairo_rtree_pin (&cache->rtree, scaled_glyph->dev_private); +} + +static cairo_status_t +cairo_gl_context_get_glyph_cache (cairo_gl_context_t *ctx, + cairo_format_t format, + cairo_gl_glyph_cache_t **cache_out) +{ + cairo_gl_glyph_cache_t *cache; + cairo_content_t content; + + switch (format) { + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + cache = &ctx->glyph_cache[0]; + content = CAIRO_CONTENT_COLOR_ALPHA; + break; + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + cache = &ctx->glyph_cache[1]; + content = CAIRO_CONTENT_ALPHA; + break; + default: + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + } + + if (unlikely (cache->surface == NULL)) { + cairo_surface_t *surface; + + surface = _cairo_gl_surface_create_scratch_for_caching (ctx, + content, + GLYPH_CACHE_WIDTH, + GLYPH_CACHE_HEIGHT); + if (unlikely (surface->status)) + return surface->status; + + _cairo_surface_release_device_reference (surface); + + cache->surface = (cairo_gl_surface_t *)surface; + cache->surface->operand.texture.attributes.has_component_alpha = + content == CAIRO_CONTENT_COLOR_ALPHA; + } + + *cache_out = cache; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +render_glyphs (cairo_gl_surface_t *dst, + int dst_x, int dst_y, + cairo_operator_t op, + cairo_surface_t *source, + cairo_composite_glyphs_info_t *info, + cairo_bool_t *has_component_alpha, + cairo_clip_t *clip) +{ + cairo_format_t last_format = CAIRO_FORMAT_INVALID; + cairo_gl_glyph_cache_t *cache = NULL; + cairo_gl_context_t *ctx; + cairo_gl_emit_glyph_t emit = NULL; + cairo_gl_composite_t setup; + cairo_int_status_t status; + int i = 0; + + TRACE ((stderr, "%s (%d, %d)x(%d, %d)\n", __FUNCTION__, + info->extents.x, info->extents.y, + info->extents.width, info->extents.height)); + + *has_component_alpha = FALSE; + + status = _cairo_gl_context_acquire (dst->base.device, &ctx); + if (unlikely (status)) + return status; + + status = _cairo_gl_composite_init (&setup, op, dst, TRUE); + if (unlikely (status)) + goto FINISH; + + if (source == NULL) { + _cairo_gl_composite_set_solid_source (&setup, CAIRO_COLOR_WHITE); + } else { + _cairo_gl_composite_set_source_operand (&setup, + source_to_operand (source)); + + } + + _cairo_gl_composite_set_clip (&setup, clip); + + for (i = 0; i < info->num_glyphs; i++) { + cairo_scaled_glyph_t *scaled_glyph; + cairo_gl_glyph_t *glyph; + double x_offset, y_offset; + double x1, x2, y1, y2; + + status = _cairo_scaled_glyph_lookup (info->font, + info->glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + if (unlikely (status)) + goto FINISH; + + if (scaled_glyph->surface->width == 0 || + scaled_glyph->surface->height == 0) + { + continue; + } + if (scaled_glyph->surface->format != last_format) { + status = cairo_gl_context_get_glyph_cache (ctx, + scaled_glyph->surface->format, + &cache); + if (unlikely (status)) + goto FINISH; + + last_format = scaled_glyph->surface->format; + + _cairo_gl_composite_set_mask_operand (&setup, &cache->surface->operand); + *has_component_alpha |= cache->surface->operand.texture.attributes.has_component_alpha; + + /* XXX Shoot me. */ + status = _cairo_gl_composite_begin (&setup, &ctx); + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) + goto FINISH; + + emit = _cairo_gl_context_choose_emit_glyph (ctx); + } + + if (scaled_glyph->dev_private_key != cache) { + cairo_scaled_glyph_private_t *priv; + + priv = _cairo_scaled_glyph_find_private (scaled_glyph, cache); + if (priv) { + scaled_glyph->dev_private_key = cache; + scaled_glyph->dev_private = cairo_container_of (priv, + cairo_gl_glyph_t, + base); + } else { + status = _cairo_gl_glyph_cache_add_glyph (ctx, cache, scaled_glyph); + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + /* Cache is full, so flush existing prims and try again. */ + _cairo_gl_composite_flush (ctx); + _cairo_gl_glyph_cache_unlock (cache); + status = _cairo_gl_glyph_cache_add_glyph (ctx, cache, scaled_glyph); + } + + if (unlikely (_cairo_int_status_is_error (status))) + goto FINISH; + } + } + + x_offset = scaled_glyph->surface->base.device_transform.x0; + y_offset = scaled_glyph->surface->base.device_transform.y0; + + x1 = _cairo_lround (info->glyphs[i].x - x_offset - dst_x); + y1 = _cairo_lround (info->glyphs[i].y - y_offset - dst_y); + x2 = x1 + scaled_glyph->surface->width; + y2 = y1 + scaled_glyph->surface->height; + + glyph = _cairo_gl_glyph_cache_lock (cache, scaled_glyph); + assert (emit); + emit (ctx, + x1, y1, x2, y2, + glyph->p1.x, glyph->p1.y, + glyph->p2.x, glyph->p2.y); + } + + status = CAIRO_STATUS_SUCCESS; + FINISH: + status = _cairo_gl_context_release (ctx, status); + + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_int_status_t +render_glyphs_via_mask (cairo_gl_surface_t *dst, + int dst_x, int dst_y, + cairo_operator_t op, + cairo_surface_t *source, + cairo_composite_glyphs_info_t *info, + cairo_clip_t *clip) +{ + cairo_surface_t *mask; + cairo_status_t status; + cairo_bool_t has_component_alpha; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + /* XXX: For non-CA, this should be CAIRO_CONTENT_ALPHA to save memory */ + mask = cairo_gl_surface_create (dst->base.device, + CAIRO_CONTENT_COLOR_ALPHA, + info->extents.width, + info->extents.height); + if (unlikely (mask->status)) + return mask->status; + + status = render_glyphs ((cairo_gl_surface_t *) mask, + info->extents.x, info->extents.y, + CAIRO_OPERATOR_ADD, NULL, + info, &has_component_alpha, NULL); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + cairo_surface_pattern_t mask_pattern; + cairo_surface_pattern_t source_pattern; + cairo_rectangle_int_t clip_extents; + + mask->is_clear = FALSE; + _cairo_pattern_init_for_surface (&mask_pattern, mask); + mask_pattern.base.has_component_alpha = has_component_alpha; + mask_pattern.base.filter = CAIRO_FILTER_NEAREST; + mask_pattern.base.extend = CAIRO_EXTEND_NONE; + + cairo_matrix_init_translate (&mask_pattern.base.matrix, + dst_x-info->extents.x, dst_y-info->extents.y); + + _cairo_pattern_init_for_surface (&source_pattern, source); + cairo_matrix_init_translate (&source_pattern.base.matrix, + dst_x-info->extents.x, dst_y-info->extents.y); + + clip = _cairo_clip_copy (clip); + clip_extents.x = info->extents.x - dst_x; + clip_extents.y = info->extents.y - dst_y; + clip_extents.width = info->extents.width; + clip_extents.height = info->extents.height; + clip = _cairo_clip_intersect_rectangle (clip, &clip_extents); + + status = _cairo_surface_mask (&dst->base, op, + &source_pattern.base, + &mask_pattern.base, + clip); + + _cairo_clip_destroy (clip); + + _cairo_pattern_fini (&mask_pattern.base); + _cairo_pattern_fini (&source_pattern.base); + } + + cairo_surface_destroy (mask); + + return status; +} + +cairo_int_status_t +_cairo_gl_check_composite_glyphs (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs) +{ + if (! _cairo_gl_operator_is_supported (extents->op)) + return UNSUPPORTED ("unsupported operator"); + + /* XXX use individual masks for large glyphs? */ + if (ceil (scaled_font->max_scale) >= GLYPH_CACHE_MAX_SIZE) + return UNSUPPORTED ("glyphs too large"); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_gl_composite_glyphs_with_clip (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info, + cairo_clip_t *clip) +{ + cairo_gl_surface_t *dst = _dst; + cairo_bool_t has_component_alpha; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + /* If any of the glyphs require component alpha, we have to go through + * a mask, since only _cairo_gl_surface_composite() currently supports + * component alpha. + */ + if (!dst->base.is_clear && ! info->use_mask && op != CAIRO_OPERATOR_OVER && + (info->font->options.antialias == CAIRO_ANTIALIAS_SUBPIXEL || + info->font->options.antialias == CAIRO_ANTIALIAS_BEST)) + { + info->use_mask = TRUE; + } + + if (info->use_mask) { + return render_glyphs_via_mask (dst, dst_x, dst_y, + op, _src, info, clip); + } else { + return render_glyphs (dst, dst_x, dst_y, + op, _src, info, + &has_component_alpha, + clip); + } + +} + +cairo_int_status_t +_cairo_gl_composite_glyphs (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + return _cairo_gl_composite_glyphs_with_clip (_dst, op, _src, src_x, src_y, + dst_x, dst_y, info, NULL); +} + +void +_cairo_gl_glyph_cache_init (cairo_gl_glyph_cache_t *cache) +{ + _cairo_rtree_init (&cache->rtree, + GLYPH_CACHE_WIDTH, + GLYPH_CACHE_HEIGHT, + GLYPH_CACHE_MIN_SIZE, + sizeof (cairo_gl_glyph_t), + _cairo_gl_node_destroy); +} + +void +_cairo_gl_glyph_cache_fini (cairo_gl_context_t *ctx, + cairo_gl_glyph_cache_t *cache) +{ + _cairo_rtree_fini (&cache->rtree); + cairo_surface_destroy (&cache->surface->base); +} diff --git a/src/cairo-gl-gradient-private.h b/src/cairo-gl-gradient-private.h new file mode 100644 index 000000000..77f9bbdc5 --- /dev/null +++ b/src/cairo-gl-gradient-private.h @@ -0,0 +1,93 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + */ + +#ifndef CAIRO_GL_GRADIENT_PRIVATE_H +#define CAIRO_GL_GRADIENT_PRIVATE_H + +#define GL_GLEXT_PROTOTYPES + +#include "cairo-cache-private.h" +#include "cairo-device-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-pattern-private.h" +#include "cairo-types-private.h" + +#include "cairo-gl.h" + +#if CAIRO_HAS_GL_SURFACE +#include +#include +#elif CAIRO_HAS_GLESV2_SURFACE +#include +#include +#endif + +#define CAIRO_GL_GRADIENT_CACHE_SIZE 4096 + +/* XXX: Declare in a better place */ +typedef struct _cairo_gl_context cairo_gl_context_t; + +typedef struct _cairo_gl_gradient { + cairo_cache_entry_t cache_entry; + cairo_reference_count_t ref_count; + cairo_device_t *device; /* NB: we don't hold a reference */ + GLuint tex; + unsigned int n_stops; + const cairo_gradient_stop_t *stops; + cairo_gradient_stop_t stops_embedded[1]; +} cairo_gl_gradient_t; + +cairo_private cairo_int_status_t +_cairo_gl_gradient_create (cairo_gl_context_t *ctx, + unsigned int n_stops, + const cairo_gradient_stop_t *stops, + cairo_gl_gradient_t **gradient_out); + +cairo_private_no_warn cairo_gl_gradient_t * +_cairo_gl_gradient_reference (cairo_gl_gradient_t *gradient); + +cairo_private void +_cairo_gl_gradient_destroy (cairo_gl_gradient_t *gradient); + +cairo_private cairo_bool_t +_cairo_gl_gradient_equal (const void *key_a, const void *key_b); + + +#endif /* CAIRO_GL_GRADIENT_PRIVATE_H */ diff --git a/src/cairo-gl-gradient.c b/src/cairo-gl-gradient.c new file mode 100644 index 000000000..ac3292101 --- /dev/null +++ b/src/cairo-gl-gradient.c @@ -0,0 +1,338 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-gl-gradient-private.h" +#include "cairo-gl-private.h" + + +static int +_cairo_gl_gradient_sample_width (unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + unsigned int n; + int width; + + width = 8; + for (n = 1; n < n_stops; n++) { + double dx = stops[n].offset - stops[n-1].offset; + double delta, max; + int ramp; + + if (dx == 0) + return 1024; /* we need to emulate an infinitely sharp step */ + + max = fabs (stops[n].color.red - stops[n-1].color.red); + + delta = fabs (stops[n].color.green - stops[n-1].color.green); + if (delta > max) + max = delta; + + delta = fabs (stops[n].color.blue - stops[n-1].color.blue); + if (delta > max) + max = delta; + + delta = fabs (stops[n].color.alpha - stops[n-1].color.alpha); + if (delta > max) + max = delta; + + ramp = 128 * max / dx; + if (ramp > width) + width = ramp; + } + + return (width + 7) & -8; +} + +static uint8_t premultiply(double c, double a) +{ + int v = c * a * 256; + return v - (v >> 8); +} + +static uint32_t color_stop_to_pixel(const cairo_gradient_stop_t *stop) +{ + uint8_t a, r, g, b; + + a = stop->color.alpha_short >> 8; + r = premultiply(stop->color.red, stop->color.alpha); + g = premultiply(stop->color.green, stop->color.alpha); + b = premultiply(stop->color.blue, stop->color.alpha); + + if (_cairo_is_little_endian ()) + return a << 24 | r << 16 | g << 8 | b << 0; + else + return a << 0 | r << 8 | g << 16 | b << 24; +} + +static cairo_status_t +_cairo_gl_gradient_render (const cairo_gl_context_t *ctx, + unsigned int n_stops, + const cairo_gradient_stop_t *stops, + void *bytes, + int width) +{ + pixman_image_t *gradient, *image; + pixman_gradient_stop_t pixman_stops_stack[32]; + pixman_gradient_stop_t *pixman_stops; + pixman_point_fixed_t p1, p2; + unsigned int i; + pixman_format_code_t gradient_pixman_format; + + /* + * Ensure that the order of the gradient's components in memory is BGRA. + * This is done so that the gradient's pixel data is always suitable for + * texture upload using format=GL_BGRA and type=GL_UNSIGNED_BYTE. + */ + if (_cairo_is_little_endian ()) + gradient_pixman_format = PIXMAN_a8r8g8b8; + else + gradient_pixman_format = PIXMAN_b8g8r8a8; + + pixman_stops = pixman_stops_stack; + if (unlikely (n_stops > ARRAY_LENGTH (pixman_stops_stack))) { + pixman_stops = _cairo_malloc_ab (n_stops, + sizeof (pixman_gradient_stop_t)); + if (unlikely (pixman_stops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + for (i = 0; i < n_stops; i++) { + pixman_stops[i].x = _cairo_fixed_16_16_from_double (stops[i].offset); + pixman_stops[i].color.red = stops[i].color.red_short; + pixman_stops[i].color.green = stops[i].color.green_short; + pixman_stops[i].color.blue = stops[i].color.blue_short; + pixman_stops[i].color.alpha = stops[i].color.alpha_short; + } + + p1.x = _cairo_fixed_16_16_from_double (0.5); + p1.y = 0; + p2.x = _cairo_fixed_16_16_from_double (width - 0.5); + p2.y = 0; + + gradient = pixman_image_create_linear_gradient (&p1, &p2, + pixman_stops, + n_stops); + if (pixman_stops != pixman_stops_stack) + free (pixman_stops); + + if (unlikely (gradient == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pixman_image_set_filter (gradient, PIXMAN_FILTER_BILINEAR, NULL, 0); + pixman_image_set_repeat (gradient, PIXMAN_REPEAT_PAD); + + image = pixman_image_create_bits (gradient_pixman_format, width, 1, + bytes, sizeof(uint32_t)*width); + if (unlikely (image == NULL)) { + pixman_image_unref (gradient); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pixman_image_composite32 (PIXMAN_OP_SRC, + gradient, NULL, image, + 0, 0, + 0, 0, + 0, 0, + width, 1); + + pixman_image_unref (gradient); + pixman_image_unref (image); + + /* We need to fudge pixel 0 to hold the left-most color stop and not + * the neareset stop to the zeroth pixel centre in order to correctly + * populate the border color. For completeness, do both edges. + */ + ((uint32_t*)bytes)[0] = color_stop_to_pixel(&stops[0]); + ((uint32_t*)bytes)[width-1] = color_stop_to_pixel(&stops[n_stops-1]); + + return CAIRO_STATUS_SUCCESS; +} + +static unsigned long +_cairo_gl_gradient_hash (unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + return _cairo_hash_bytes (n_stops, + stops, + sizeof (cairo_gradient_stop_t) * n_stops); +} + +static cairo_gl_gradient_t * +_cairo_gl_gradient_lookup (cairo_gl_context_t *ctx, + unsigned long hash, + unsigned int n_stops, + const cairo_gradient_stop_t *stops) +{ + cairo_gl_gradient_t lookup; + + lookup.cache_entry.hash = hash, + lookup.n_stops = n_stops; + lookup.stops = stops; + + return _cairo_cache_lookup (&ctx->gradients, &lookup.cache_entry); +} + +cairo_bool_t +_cairo_gl_gradient_equal (const void *key_a, const void *key_b) +{ + const cairo_gl_gradient_t *a = key_a; + const cairo_gl_gradient_t *b = key_b; + + if (a->n_stops != b->n_stops) + return FALSE; + + return memcmp (a->stops, b->stops, a->n_stops * sizeof (cairo_gradient_stop_t)) == 0; +} + +cairo_int_status_t +_cairo_gl_gradient_create (cairo_gl_context_t *ctx, + unsigned int n_stops, + const cairo_gradient_stop_t *stops, + cairo_gl_gradient_t **gradient_out) +{ + unsigned long hash; + cairo_gl_gradient_t *gradient; + cairo_status_t status; + int tex_width; + GLint internal_format; + void *data; + + if ((unsigned int) ctx->max_texture_size / 2 <= n_stops) + return CAIRO_INT_STATUS_UNSUPPORTED; + + hash = _cairo_gl_gradient_hash (n_stops, stops); + + gradient = _cairo_gl_gradient_lookup (ctx, hash, n_stops, stops); + if (gradient) { + *gradient_out = _cairo_gl_gradient_reference (gradient); + return CAIRO_STATUS_SUCCESS; + } + + gradient = malloc (sizeof (cairo_gl_gradient_t) + sizeof (cairo_gradient_stop_t) * (n_stops - 1)); + if (gradient == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + tex_width = _cairo_gl_gradient_sample_width (n_stops, stops); + if (tex_width > ctx->max_texture_size) + tex_width = ctx->max_texture_size; + + CAIRO_REFERENCE_COUNT_INIT (&gradient->ref_count, 2); + gradient->cache_entry.hash = hash; + gradient->cache_entry.size = tex_width; + gradient->device = &ctx->base; + gradient->n_stops = n_stops; + gradient->stops = gradient->stops_embedded; + memcpy (gradient->stops_embedded, stops, n_stops * sizeof (cairo_gradient_stop_t)); + + glGenTextures (1, &gradient->tex); + _cairo_gl_context_activate (ctx, CAIRO_GL_TEX_TEMP); + glBindTexture (ctx->tex_target, gradient->tex); + + data = _cairo_malloc_ab (tex_width, sizeof (uint32_t)); + if (unlikely (data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup_gradient; + } + + status = _cairo_gl_gradient_render (ctx, n_stops, stops, data, tex_width); + if (unlikely (status)) + goto cleanup_data; + + /* + * In OpenGL ES 2.0 no format conversion is allowed i.e. 'internalFormat' + * must match 'format' in glTexImage2D. + */ + if (_cairo_gl_get_flavor () == CAIRO_GL_FLAVOR_ES) + internal_format = GL_BGRA; + else + internal_format = GL_RGBA; + + glTexImage2D (ctx->tex_target, 0, internal_format, tex_width, 1, 0, + GL_BGRA, GL_UNSIGNED_BYTE, data); + + free (data); + + /* we ignore errors here and just return an uncached gradient */ + if (unlikely (_cairo_cache_insert (&ctx->gradients, &gradient->cache_entry))) + CAIRO_REFERENCE_COUNT_INIT (&gradient->ref_count, 1); + + *gradient_out = gradient; + return CAIRO_STATUS_SUCCESS; + +cleanup_data: + free (data); +cleanup_gradient: + free (gradient); + return status; +} + +cairo_gl_gradient_t * +_cairo_gl_gradient_reference (cairo_gl_gradient_t *gradient) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&gradient->ref_count)); + + _cairo_reference_count_inc (&gradient->ref_count); + + return gradient; +} + +void +_cairo_gl_gradient_destroy (cairo_gl_gradient_t *gradient) +{ + cairo_gl_context_t *ctx; + cairo_status_t ignore; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&gradient->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&gradient->ref_count)) + return; + + if (_cairo_gl_context_acquire (gradient->device, &ctx) == CAIRO_STATUS_SUCCESS) { + /* The gradient my still be active in the last operation, so flush */ + _cairo_gl_composite_flush (ctx); + glDeleteTextures (1, &gradient->tex); + ignore = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + } + + free (gradient); +} diff --git a/src/cairo-gl-info.c b/src/cairo-gl-info.c new file mode 100644 index 000000000..acefbb910 --- /dev/null +++ b/src/cairo-gl-info.c @@ -0,0 +1,111 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Alexandros Frantzis + */ + +#include "cairoint.h" +#include "cairo-gl-private.h" + +#include + +int +_cairo_gl_get_version (void) +{ + int major, minor; + const char *version = (const char *) glGetString (GL_VERSION); + const char *dot = version == NULL ? NULL : strchr (version, '.'); + const char *major_start = dot; + + /* Sanity check */ + if (dot == NULL || dot == version || *(dot + 1) == '\0') { + major = 0; + minor = 0; + } else { + /* Find the start of the major version in the string */ + while (major_start > version && *major_start != ' ') + --major_start; + major = strtol (major_start, NULL, 10); + minor = strtol (dot + 1, NULL, 10); + } + + return CAIRO_GL_VERSION_ENCODE (major, minor); +} + +cairo_gl_flavor_t +_cairo_gl_get_flavor (void) +{ + const char *version = (const char *) glGetString (GL_VERSION); + cairo_gl_flavor_t flavor; + + if (version == NULL) + flavor = CAIRO_GL_FLAVOR_NONE; + else if (strstr (version, "OpenGL ES") != NULL) + flavor = CAIRO_GL_FLAVOR_ES; + else + flavor = CAIRO_GL_FLAVOR_DESKTOP; + + return flavor; +} + +unsigned long +_cairo_gl_get_vbo_size (void) +{ + unsigned long vbo_size; + + const char *env = getenv ("CAIRO_GL_VBO_SIZE"); + if (env == NULL) { + vbo_size = CAIRO_GL_VBO_SIZE_DEFAULT; + } else { + errno = 0; + vbo_size = strtol (env, NULL, 10); + assert (errno == 0); + assert (vbo_size > 0); + } + + return vbo_size; +} + +cairo_bool_t +_cairo_gl_has_extension (const char *ext) +{ + const char *extensions = (const char *) glGetString (GL_EXTENSIONS); + size_t len = strlen (ext); + const char *ext_ptr = extensions; + + if (unlikely (ext_ptr == NULL)) + return 0; + + while ((ext_ptr = strstr (ext_ptr, ext)) != NULL) { + if (ext_ptr[len] == ' ' || ext_ptr[len] == '\0') + break; + ext_ptr += len; + } + + return (ext_ptr != NULL); +} diff --git a/src/cairo-gl-msaa-compositor.c b/src/cairo-gl-msaa-compositor.c new file mode 100644 index 000000000..83e8eb2d1 --- /dev/null +++ b/src/cairo-gl-msaa-compositor.c @@ -0,0 +1,944 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * Copyright © 2011 Samsung Electronics + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Henry Song + * Martin Robinson + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-gl-private.h" +#include "cairo-path-private.h" +#include "cairo-traps-private.h" + +static cairo_bool_t +can_use_msaa_compositor (cairo_gl_surface_t *surface, + cairo_antialias_t antialias); + +static void +query_surface_capabilities (cairo_gl_surface_t *surface); + +struct _tristrip_composite_info { + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; +}; + +static cairo_int_status_t +_draw_trap (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + cairo_trapezoid_t *trap) +{ + cairo_point_t quad[4]; + + quad[0].x = _cairo_edge_compute_intersection_x_for_y (&trap->left.p1, + &trap->left.p2, + trap->top); + quad[0].y = trap->top; + + quad[1].x = _cairo_edge_compute_intersection_x_for_y (&trap->left.p1, + &trap->left.p2, + trap->bottom); + quad[1].y = trap->bottom; + + quad[2].x = _cairo_edge_compute_intersection_x_for_y (&trap->right.p1, + &trap->right.p2, + trap->bottom); + quad[2].y = trap->bottom; + + quad[3].x = _cairo_edge_compute_intersection_x_for_y (&trap->right.p1, + &trap->right.p2, + trap->top); + quad[3].y = trap->top; + return _cairo_gl_composite_emit_quad_as_tristrip (ctx, setup, quad); +} + +static cairo_int_status_t +_draw_traps (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + cairo_traps_t *traps) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + int i; + + for (i = 0; i < traps->num_traps; i++) { + cairo_trapezoid_t *trap = traps->traps + i; + if (unlikely ((status = _draw_trap (ctx, setup, trap)))) + return status; + } + + return status; +} + +static cairo_int_status_t +_draw_int_rect (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + cairo_rectangle_int_t *rect) +{ + cairo_box_t box; + cairo_point_t quad[4]; + + _cairo_box_from_rectangle (&box, rect); + quad[0].x = box.p1.x; + quad[0].y = box.p1.y; + quad[1].x = box.p1.x; + quad[1].y = box.p2.y; + quad[2].x = box.p2.x; + quad[2].y = box.p2.y; + quad[3].x = box.p2.x; + quad[3].y = box.p1.y; + + return _cairo_gl_composite_emit_quad_as_tristrip (ctx, setup, quad); +} + +static cairo_int_status_t +_draw_triangle_fan (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + const cairo_point_t *midpt, + const cairo_point_t *points, + int npoints) +{ + int i; + + /* Our strategy here is to not even try to build a triangle fan, but to + draw each triangle as if it was an unconnected member of a triangle strip. */ + for (i = 1; i < npoints; i++) { + cairo_int_status_t status; + cairo_point_t triangle[3]; + + triangle[0] = *midpt; + triangle[1] = points[i - 1]; + triangle[2] = points[i]; + + status = _cairo_gl_composite_emit_triangle_as_tristrip (ctx, setup, triangle); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_clip_to_traps (cairo_clip_t *clip, + cairo_traps_t *traps) +{ + cairo_int_status_t status; + cairo_polygon_t polygon; + cairo_antialias_t antialias; + cairo_fill_rule_t fill_rule; + + _cairo_traps_init (traps); + + if (clip->num_boxes == 1 && clip->path == NULL) { + cairo_boxes_t boxes; + _cairo_boxes_init_for_array (&boxes, clip->boxes, clip->num_boxes); + return _cairo_traps_init_boxes (traps, &boxes); + } + + status = _cairo_clip_get_polygon (clip, &polygon, &fill_rule, &antialias); + if (unlikely (status)) + return status; + + /* We ignore the antialias mode of the clip here, since the user requested + * unantialiased rendering of their path and we expect that this stencil + * based rendering of the clip to be a reasonable approximation to + * the intersection between that clip and the path. + * + * In other words, what the user expects when they try to perform + * a geometric intersection between an unantialiased polygon and an + * antialiased polygon is open to interpretation. And we choose the fast + * option. + */ + + _cairo_traps_init (traps); + status = _cairo_bentley_ottmann_tessellate_polygon (traps, + &polygon, + fill_rule); + _cairo_polygon_fini (&polygon); + + return status; +} + +cairo_int_status_t +_cairo_gl_msaa_compositor_draw_clip (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + cairo_clip_t *clip) +{ + cairo_int_status_t status; + cairo_traps_t traps; + + status = _clip_to_traps (clip, &traps); + if (unlikely (status)) + return status; + status = _draw_traps (ctx, setup, &traps); + + _cairo_traps_fini (&traps); + return status; +} + +static cairo_bool_t +_should_use_unbounded_surface (cairo_composite_rectangles_t *composite) +{ + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + cairo_rectangle_int_t *source = &composite->source; + + if (composite->is_bounded) + return FALSE; + + /* This isn't just an optimization. It also detects when painting is used + to paint back the unbounded surface, preventing infinite recursion. */ + return ! (source->x <= 0 && source->y <= 0 && + source->height + source->y >= dst->height && + source->width + source->x >= dst->width); +} + +static cairo_surface_t* +_prepare_unbounded_surface (cairo_gl_surface_t *dst) +{ + + cairo_surface_t* surface = cairo_gl_surface_create (dst->base.device, + dst->base.content, + dst->width, + dst->height); + if (surface == NULL) + return NULL; + if (unlikely (surface->status)) { + cairo_surface_destroy (surface); + return NULL; + } + return surface; +} + +static cairo_int_status_t +_paint_back_unbounded_surface (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + cairo_surface_t *surface) +{ + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + cairo_int_status_t status; + + cairo_pattern_t *pattern = cairo_pattern_create_for_surface (surface); + if (unlikely (pattern->status)) { + status = pattern->status; + goto finish; + } + + status = _cairo_compositor_paint (compositor, &dst->base, + composite->op, pattern, + composite->clip); + +finish: + cairo_pattern_destroy (pattern); + cairo_surface_destroy (surface); + return status; +} + +static cairo_bool_t +can_use_msaa_compositor (cairo_gl_surface_t *surface, + cairo_antialias_t antialias) +{ + query_surface_capabilities (surface); + if (! surface->supports_stencil) + return FALSE; + + /* Multisampling OpenGL ES surfaces only maintain one multisampling + framebuffer and thus must use the spans compositor to do non-antialiased + rendering. */ + if (((cairo_gl_context_t *) surface->base.device)->gl_flavor == CAIRO_GL_FLAVOR_ES + && surface->supports_msaa + && antialias == CAIRO_ANTIALIAS_NONE) + return FALSE; + + /* The MSAA compositor has a single-sample mode, so we can + support non-antialiased rendering. */ + if (antialias == CAIRO_ANTIALIAS_NONE) + return TRUE; + + if (antialias == CAIRO_ANTIALIAS_FAST || antialias == CAIRO_ANTIALIAS_DEFAULT) + return surface->supports_msaa; + return FALSE; +} + +static void +_cairo_gl_msaa_compositor_set_clip (cairo_composite_rectangles_t *composite, + cairo_gl_composite_t *setup) +{ + if (_cairo_composite_rectangles_can_reduce_clip (composite, composite->clip)) + return; + _cairo_gl_composite_set_clip (setup, composite->clip); +} + +/* Masking with the SOURCE operator requires two passes. In the first + * pass we use the mask as the source to get: + * result = (1 - ma) * dst + * In the second pass we use the add operator to achieve: + * result = (src * ma) + dst + * Combined this produces: + * result = (src * ma) + (1 - ma) * dst + */ +static cairo_int_status_t +_cairo_gl_msaa_compositor_mask_source_operator (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + cairo_gl_composite_t setup; + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + cairo_gl_context_t *ctx = NULL; + cairo_int_status_t status; + + cairo_clip_t *clip = composite->clip; + cairo_traps_t traps; + + /* If we have a non-rectangular clip, we can avoid using the stencil buffer + * for clipping and just draw the clip polygon. */ + if (clip) { + status = _clip_to_traps (clip, &traps); + if (unlikely (status)) { + _cairo_traps_fini (&traps); + return status; + } + } + + status = _cairo_gl_composite_init (&setup, + CAIRO_OPERATOR_DEST_OUT, + dst, + FALSE /* assume_component_alpha */); + if (unlikely (status)) + return status; + status = _cairo_gl_composite_set_source (&setup, + &composite->mask_pattern.base, + &composite->mask_sample_area, + &composite->bounded, + FALSE); + if (unlikely (status)) + goto finish; + _cairo_gl_composite_set_multisample (&setup); + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto finish; + + if (! clip) + status = _draw_int_rect (ctx, &setup, &composite->bounded); + else + status = _draw_traps (ctx, &setup, &traps); + if (unlikely (status)) + goto finish; + + /* Now draw the second pass. */ + status = _cairo_gl_composite_set_operator (&setup, CAIRO_OPERATOR_ADD, + FALSE /* assume_component_alpha */); + if (unlikely (status)) + goto finish; + status = _cairo_gl_composite_set_source (&setup, + &composite->source_pattern.base, + &composite->source_sample_area, + &composite->bounded, + FALSE); + if (unlikely (status)) + goto finish; + status = _cairo_gl_composite_set_mask (&setup, + &composite->mask_pattern.base, + &composite->source_sample_area, + &composite->bounded, + FALSE); + if (unlikely (status)) + goto finish; + status = _cairo_gl_set_operands_and_operator (&setup, ctx); + if (unlikely (status)) + goto finish; + + if (! clip) + status = _draw_int_rect (ctx, &setup, &composite->bounded); + else + status = _draw_traps (ctx, &setup, &traps); + +finish: + _cairo_gl_composite_fini (&setup); + if (ctx) + status = _cairo_gl_context_release (ctx, status); + if (clip) + _cairo_traps_fini (&traps); + + return status; +} + +static cairo_int_status_t +_cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + cairo_gl_composite_t setup; + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + cairo_gl_context_t *ctx = NULL; + cairo_int_status_t status; + cairo_operator_t op = composite->op; + cairo_clip_t *clip = composite->clip; + + if (! can_use_msaa_compositor (dst, CAIRO_ANTIALIAS_DEFAULT)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (composite->op == CAIRO_OPERATOR_CLEAR && + composite->original_mask_pattern != NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* GL compositing operators cannot properly represent a mask operation + using the SOURCE compositing operator in one pass. This only matters if + there actually is a mask (there isn't in a paint operation) and if the + mask isn't totally opaque. */ + if (op == CAIRO_OPERATOR_SOURCE && + composite->original_mask_pattern != NULL && + ! _cairo_pattern_is_opaque (&composite->mask_pattern.base, + &composite->mask_sample_area)) { + + if (! _cairo_pattern_is_opaque (&composite->source_pattern.base, + &composite->source_sample_area)) { + return _cairo_gl_msaa_compositor_mask_source_operator (compositor, composite); + } + + /* If the source is opaque the operation reduces to OVER. */ + op = CAIRO_OPERATOR_OVER; + } + + if (_should_use_unbounded_surface (composite)) { + cairo_surface_t* surface = _prepare_unbounded_surface (dst); + + if (unlikely (surface == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* This may be a paint operation. */ + if (composite->original_mask_pattern == NULL) { + status = _cairo_compositor_paint (compositor, surface, + CAIRO_OPERATOR_SOURCE, + &composite->source_pattern.base, + NULL); + } else { + status = _cairo_compositor_mask (compositor, surface, + CAIRO_OPERATOR_SOURCE, + &composite->source_pattern.base, + &composite->mask_pattern.base, + NULL); + } + + if (unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + + return _paint_back_unbounded_surface (compositor, composite, surface); + } + + status = _cairo_gl_composite_init (&setup, + op, + dst, + FALSE /* assume_component_alpha */); + if (unlikely (status)) + return status; + + status = _cairo_gl_composite_set_source (&setup, + &composite->source_pattern.base, + &composite->source_sample_area, + &composite->bounded, + FALSE); + if (unlikely (status)) + goto finish; + + if (composite->original_mask_pattern != NULL) { + status = _cairo_gl_composite_set_mask (&setup, + &composite->mask_pattern.base, + &composite->mask_sample_area, + &composite->bounded, + FALSE); + } + if (unlikely (status)) + goto finish; + + /* We always use multisampling here, because we do not yet have the smarts + to calculate when the clip or the source requires it. */ + _cairo_gl_composite_set_multisample (&setup); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto finish; + + if (! clip) + status = _draw_int_rect (ctx, &setup, &composite->bounded); + else + status = _cairo_gl_msaa_compositor_draw_clip (ctx, &setup, clip); + +finish: + _cairo_gl_composite_fini (&setup); + + if (ctx) + status = _cairo_gl_context_release (ctx, status); + + return status; +} + +static cairo_int_status_t +_cairo_gl_msaa_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + return _cairo_gl_msaa_compositor_mask (compositor, composite); +} + +static cairo_status_t +_stroke_shaper_add_triangle (void *closure, + const cairo_point_t triangle[3]) +{ + struct _tristrip_composite_info *info = closure; + return _cairo_gl_composite_emit_triangle_as_tristrip (info->ctx, + &info->setup, + triangle); +} + +static cairo_status_t +_stroke_shaper_add_triangle_fan (void *closure, + const cairo_point_t *midpoint, + const cairo_point_t *points, + int npoints) +{ + struct _tristrip_composite_info *info = closure; + return _draw_triangle_fan (info->ctx, &info->setup, + midpoint, points, npoints); +} + +static cairo_status_t +_stroke_shaper_add_quad (void *closure, + const cairo_point_t quad[4]) +{ + struct _tristrip_composite_info *info = closure; + return _cairo_gl_composite_emit_quad_as_tristrip (info->ctx, &info->setup, + quad); +} + +static cairo_int_status_t +_prevent_overlapping_strokes (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm) +{ + cairo_rectangle_int_t stroke_extents; + + if (! _cairo_gl_ensure_stencil (ctx, setup->dst)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (_cairo_pattern_is_opaque (&composite->source_pattern.base, + &composite->source_sample_area)) + return CAIRO_INT_STATUS_SUCCESS; + + if (glIsEnabled (GL_STENCIL_TEST) == FALSE) { + cairo_bool_t scissor_was_enabled; + + /* In case we have pending operations we have to flush before + adding the stencil buffer. */ + _cairo_gl_composite_flush (ctx); + + /* Enable the stencil buffer, even if we are not using it for clipping, + so we can use it below to prevent overlapping shapes. We initialize + it all to one here which represents infinite clip. */ + glDepthMask (GL_TRUE); + glEnable (GL_STENCIL_TEST); + + /* We scissor here so that we don't have to clear the entire stencil + * buffer. If the scissor test is already enabled, it was enabled + * for clipping. In that case, instead of calculating an intersection, + * we just reuse it, and risk clearing too much. */ + scissor_was_enabled = glIsEnabled (GL_SCISSOR_TEST); + if (! scissor_was_enabled) { + _cairo_path_fixed_approximate_stroke_extents (path, style, ctm, + &stroke_extents); + _cairo_gl_scissor_to_rectangle (setup->dst, &stroke_extents); + } + glClearStencil (1); + glClear (GL_STENCIL_BUFFER_BIT); + if (! scissor_was_enabled) + glDisable (GL_SCISSOR_TEST); + + glStencilFunc (GL_EQUAL, 1, 1); + } + + /* This means that once we draw to a particular pixel nothing else can + be drawn there until the stencil buffer is reset or the stencil test + is disabled. */ + glStencilOp (GL_ZERO, GL_ZERO, GL_ZERO); + + _cairo_clip_destroy (setup->dst->clip_on_stencil_buffer); + setup->dst->clip_on_stencil_buffer = NULL; + + return CAIRO_INT_STATUS_SUCCESS; +} + +static void +query_surface_capabilities (cairo_gl_surface_t *surface) +{ + GLint samples, stencil_bits; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + /* Texture surfaces are create in such a way that they always + have stencil and multisample bits if possible, so we don't + need to query their capabilities lazily. */ + if (_cairo_gl_surface_is_texture (surface)) + return; + if (surface->stencil_and_msaa_caps_initialized) + return; + + surface->stencil_and_msaa_caps_initialized = TRUE; + surface->supports_stencil = FALSE; + surface->supports_msaa = FALSE; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return; + + _cairo_gl_context_set_destination (ctx, surface, FALSE); + + glGetIntegerv(GL_SAMPLES, &samples); + glGetIntegerv(GL_STENCIL_BITS, &stencil_bits); + surface->supports_stencil = stencil_bits > 0; + surface->supports_msaa = samples > 1; + + status = _cairo_gl_context_release (ctx, status); +} + +static cairo_int_status_t +_cairo_gl_msaa_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_int_status_t status; + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + struct _tristrip_composite_info info; + + if (! can_use_msaa_compositor (dst, antialias)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (composite->is_bounded == FALSE) { + cairo_surface_t* surface = _prepare_unbounded_surface (dst); + + if (unlikely (surface == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_stroke (compositor, surface, + CAIRO_OPERATOR_SOURCE, + &composite->source_pattern.base, + path, style, ctm, ctm_inverse, + tolerance, antialias, NULL); + if (unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + + return _paint_back_unbounded_surface (compositor, composite, surface); + } + + status = _cairo_gl_composite_init (&info.setup, + composite->op, + dst, + FALSE /* assume_component_alpha */); + if (unlikely (status)) + return status; + + info.ctx = NULL; + + status = _cairo_gl_composite_set_source (&info.setup, + &composite->source_pattern.base, + &composite->source_sample_area, + &composite->bounded, + FALSE); + if (unlikely (status)) + goto finish; + + _cairo_gl_msaa_compositor_set_clip (composite, &info.setup); + if (antialias != CAIRO_ANTIALIAS_NONE) + _cairo_gl_composite_set_multisample (&info.setup); + + status = _cairo_gl_composite_begin (&info.setup, &info.ctx); + if (unlikely (status)) + goto finish; + + status = _prevent_overlapping_strokes (info.ctx, &info.setup, + composite, path, style, ctm); + if (unlikely (status)) + goto finish; + + status = _cairo_path_fixed_stroke_to_shaper ((cairo_path_fixed_t *) path, + style, + ctm, + ctm_inverse, + tolerance, + _stroke_shaper_add_triangle, + _stroke_shaper_add_triangle_fan, + _stroke_shaper_add_quad, + &info); + if (unlikely (status)) + goto finish; + +finish: + _cairo_gl_composite_fini (&info.setup); + + if (info.ctx) + status = _cairo_gl_context_release (info.ctx, status); + + return status; +} + +static cairo_int_status_t +_draw_simple_quad_path (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + const cairo_path_fixed_t *path) +{ + cairo_point_t triangle[3]; + cairo_int_status_t status; + const cairo_point_t *points; + + points = cairo_path_head (path)->points; + triangle[0] = points[0]; + triangle[1] = points[1]; + triangle[2] = points[2]; + status = _cairo_gl_composite_emit_triangle_as_tristrip (ctx, setup, triangle); + if (status) + return status; + + triangle[0] = points[2]; + triangle[1] = points[3]; + triangle[2] = points[0]; + return _cairo_gl_composite_emit_triangle_as_tristrip (ctx, setup, triangle); +} + +static cairo_int_status_t +_cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_gl_composite_t setup; + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + cairo_gl_context_t *ctx = NULL; + cairo_int_status_t status; + cairo_traps_t traps; + cairo_bool_t draw_path_with_traps; + + if (! can_use_msaa_compositor (dst, antialias)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (composite->is_bounded == FALSE) { + cairo_surface_t* surface = _prepare_unbounded_surface (dst); + + if (unlikely (surface == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + + status = _cairo_compositor_fill (compositor, surface, + CAIRO_OPERATOR_SOURCE, + &composite->source_pattern.base, + path, fill_rule, tolerance, + antialias, NULL); + + if (unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + + return _paint_back_unbounded_surface (compositor, composite, surface); + } + + draw_path_with_traps = ! _cairo_path_fixed_is_simple_quad (path); + + if (draw_path_with_traps) { + _cairo_traps_init (&traps); + status = _cairo_path_fixed_fill_to_traps (path, fill_rule, tolerance, &traps); + if (unlikely (status)) + goto cleanup_traps; + } + + status = _cairo_gl_composite_init (&setup, + composite->op, + dst, + FALSE /* assume_component_alpha */); + if (unlikely (status)) + goto cleanup_traps; + + status = _cairo_gl_composite_set_source (&setup, + &composite->source_pattern.base, + &composite->source_sample_area, + &composite->bounded, + FALSE); + if (unlikely (status)) + goto cleanup_setup; + + _cairo_gl_msaa_compositor_set_clip (composite, &setup); + if (antialias != CAIRO_ANTIALIAS_NONE) + _cairo_gl_composite_set_multisample (&setup); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto cleanup_setup; + + if (! draw_path_with_traps) + status = _draw_simple_quad_path (ctx, &setup, path); + else + status = _draw_traps (ctx, &setup, &traps); + if (unlikely (status)) + goto cleanup_setup; + +cleanup_setup: + _cairo_gl_composite_fini (&setup); + + if (ctx) + status = _cairo_gl_context_release (ctx, status); + +cleanup_traps: + if (draw_path_with_traps) + _cairo_traps_fini (&traps); + + return status; +} + +static cairo_int_status_t +_cairo_gl_msaa_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_int_status_t status; + cairo_surface_t *src = NULL; + int src_x, src_y; + cairo_composite_glyphs_info_t info; + + cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; + + query_surface_capabilities (dst); + if (! dst->supports_stencil) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (composite->op == CAIRO_OPERATOR_CLEAR) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (composite->is_bounded == FALSE) { + cairo_surface_t* surface = _prepare_unbounded_surface (dst); + + if (unlikely (surface == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_glyphs (compositor, surface, + CAIRO_OPERATOR_SOURCE, + &composite->source_pattern.base, + glyphs, num_glyphs, + scaled_font, composite->clip); + + if (unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + + return _paint_back_unbounded_surface (compositor, composite, surface); + } + + src = _cairo_gl_pattern_to_source (&dst->base, + &composite->source_pattern.base, + FALSE, + &composite->bounded, + &composite->source_sample_area, + &src_x, &src_y); + if (unlikely (src->status)) { + status = src->status; + goto finish; + } + + status = _cairo_gl_check_composite_glyphs (composite, + scaled_font, glyphs, + &num_glyphs); + if (unlikely (status != CAIRO_INT_STATUS_SUCCESS)) + goto finish; + + info.font = scaled_font; + info.glyphs = glyphs; + info.num_glyphs = num_glyphs; + info.use_mask = overlap || ! composite->is_bounded || + composite->op == CAIRO_OPERATOR_SOURCE; + info.extents = composite->bounded; + + _cairo_scaled_font_freeze_cache (scaled_font); + status = _cairo_gl_composite_glyphs_with_clip (dst, composite->op, + src, src_x, src_y, + 0, 0, &info, + composite->clip); + + _cairo_scaled_font_thaw_cache (scaled_font); + +finish: + if (src) + cairo_surface_destroy (src); + + return status; +} + +static void +_cairo_gl_msaa_compositor_init (cairo_compositor_t *compositor, + const cairo_compositor_t *delegate) +{ + compositor->delegate = delegate; + + compositor->paint = _cairo_gl_msaa_compositor_paint; + compositor->mask = _cairo_gl_msaa_compositor_mask; + compositor->fill = _cairo_gl_msaa_compositor_fill; + compositor->stroke = _cairo_gl_msaa_compositor_stroke; + compositor->glyphs = _cairo_gl_msaa_compositor_glyphs; +} + +const cairo_compositor_t * +_cairo_gl_msaa_compositor_get (void) +{ + static cairo_compositor_t compositor; + if (compositor.delegate == NULL) + _cairo_gl_msaa_compositor_init (&compositor, + _cairo_gl_span_compositor_get ()); + + return &compositor; +} diff --git a/src/cairo-gl-operand.c b/src/cairo-gl-operand.c new file mode 100644 index 000000000..401574717 --- /dev/null +++ b/src/cairo-gl-operand.c @@ -0,0 +1,788 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-offset-private.h" +#include "cairo-surface-subsurface-inline.h" + +static cairo_int_status_t +_cairo_gl_create_gradient_texture (cairo_gl_surface_t *dst, + const cairo_gradient_pattern_t *pattern, + cairo_gl_gradient_t **gradient) +{ + cairo_gl_context_t *ctx; + cairo_status_t status; + + status = _cairo_gl_context_acquire (dst->base.device, &ctx); + if (unlikely (status)) + return status; + + status = _cairo_gl_gradient_create (ctx, pattern->n_stops, pattern->stops, gradient); + + return _cairo_gl_context_release (ctx, status); +} + +static cairo_status_t +_cairo_gl_subsurface_clone_operand_init (cairo_gl_operand_t *operand, + const cairo_pattern_t *_src, + cairo_gl_surface_t *dst, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen) +{ + const cairo_surface_pattern_t *src = (cairo_surface_pattern_t *)_src; + cairo_surface_pattern_t local_pattern; + cairo_surface_subsurface_t *sub; + cairo_gl_surface_t *surface; + cairo_gl_context_t *ctx; + cairo_surface_attributes_t *attributes; + cairo_status_t status; + + sub = (cairo_surface_subsurface_t *) src->surface; + + if (sub->snapshot && + sub->snapshot->type == CAIRO_SURFACE_TYPE_GL && + sub->snapshot->device == dst->base.device) + { + surface = (cairo_gl_surface_t *) + cairo_surface_reference (sub->snapshot); + } + else + { + status = _cairo_gl_context_acquire (dst->base.device, &ctx); + if (unlikely (status)) + return status; + + /* XXX Trim surface to the sample area within the subsurface? */ + surface = (cairo_gl_surface_t *) + _cairo_gl_surface_create_scratch (ctx, + sub->target->content, + sub->extents.width, + sub->extents.height); + if (surface->base.status) + return _cairo_gl_context_release (ctx, surface->base.status); + + _cairo_pattern_init_for_surface (&local_pattern, sub->target); + cairo_matrix_init_translate (&local_pattern.base.matrix, + sub->extents.x, sub->extents.y); + local_pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (&surface->base, + CAIRO_OPERATOR_SOURCE, + &local_pattern.base, + NULL); + _cairo_pattern_fini (&local_pattern.base); + + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return status; + } + + _cairo_surface_subsurface_set_snapshot (&sub->base, &surface->base); + } + + status = _cairo_gl_surface_resolve_multisampling (surface); + if (unlikely (status)) + return status; + + attributes = &operand->texture.attributes; + + operand->type = CAIRO_GL_OPERAND_TEXTURE; + operand->texture.surface = surface; + operand->texture.owns_surface = surface; + operand->texture.tex = surface->tex; + + if (_cairo_gl_device_requires_power_of_two_textures (dst->base.device)) { + attributes->matrix = src->base.matrix; + } else { + cairo_matrix_t m; + + cairo_matrix_init_scale (&m, + 1.0 / surface->width, + 1.0 / surface->height); + cairo_matrix_multiply (&attributes->matrix, &src->base.matrix, &m); + } + + attributes->extend = src->base.extend; + attributes->filter = src->base.filter; + attributes->has_component_alpha = src->base.has_component_alpha; + + operand->texture.texgen = use_texgen; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_subsurface_operand_init (cairo_gl_operand_t *operand, + const cairo_pattern_t *_src, + cairo_gl_surface_t *dst, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen) +{ + const cairo_surface_pattern_t *src = (cairo_surface_pattern_t *)_src; + cairo_surface_subsurface_t *sub; + cairo_gl_surface_t *surface; + cairo_surface_attributes_t *attributes; + cairo_int_status_t status; + + sub = (cairo_surface_subsurface_t *) src->surface; + + if (sample->x < 0 || sample->y < 0 || + sample->x + sample->width > sub->extents.width || + sample->y + sample->height > sub->extents.height) + { + return _cairo_gl_subsurface_clone_operand_init (operand, _src, + dst, sample, extents, + use_texgen); + } + + surface = (cairo_gl_surface_t *) sub->target; + if (surface->base.device && surface->base.device != dst->base.device) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_gl_surface_is_texture (surface)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_gl_surface_resolve_multisampling (surface); + if (unlikely (status)) + return status; + + /* Translate the matrix from + * (unnormalized src -> unnormalized src) to + * (unnormalized dst -> unnormalized src) + */ + _cairo_gl_operand_copy(operand, &surface->operand); + + attributes = &operand->texture.attributes; + attributes->matrix = src->base.matrix; + attributes->matrix.x0 += sub->extents.x; + attributes->matrix.y0 += sub->extents.y; + cairo_matrix_multiply (&attributes->matrix, + &attributes->matrix, + &surface->operand.texture.attributes.matrix); + + attributes->extend = src->base.extend; + attributes->filter = src->base.filter; + attributes->has_component_alpha = src->base.has_component_alpha; + + operand->texture.texgen = use_texgen; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_surface_operand_init (cairo_gl_operand_t *operand, + const cairo_pattern_t *_src, + cairo_gl_surface_t *dst, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen) +{ + const cairo_surface_pattern_t *src = (cairo_surface_pattern_t *)_src; + cairo_gl_surface_t *surface; + cairo_surface_attributes_t *attributes; + cairo_int_status_t status; + + surface = (cairo_gl_surface_t *) src->surface; + if (surface->base.type != CAIRO_SURFACE_TYPE_GL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface->base.backend->type != CAIRO_SURFACE_TYPE_GL) { + if (_cairo_surface_is_subsurface (&surface->base)) + return _cairo_gl_subsurface_operand_init (operand, _src, dst, + sample, extents, + use_texgen); + + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (surface->base.device && surface->base.device != dst->base.device) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface->base.device && ! _cairo_gl_surface_is_texture (surface)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_gl_surface_resolve_multisampling (surface); + if (unlikely (status)) + return status; + + _cairo_gl_operand_copy(operand, &surface->operand); + + attributes = &operand->texture.attributes; + cairo_matrix_multiply (&attributes->matrix, + &src->base.matrix, + &attributes->matrix); + + attributes->extend = src->base.extend; + attributes->filter = src->base.filter; + attributes->has_component_alpha = src->base.has_component_alpha; + + operand->texture.texgen = use_texgen; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_pattern_texture_setup (cairo_gl_operand_t *operand, + const cairo_pattern_t *_src, + cairo_gl_surface_t *dst, + const cairo_rectangle_int_t *extents) +{ + cairo_status_t status; + cairo_gl_surface_t *surface; + cairo_gl_context_t *ctx; + cairo_image_surface_t *image; + cairo_bool_t src_is_gl_surface = FALSE; + cairo_rectangle_int_t map_extents; + + if (_src->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_t* src_surface = ((cairo_surface_pattern_t *) _src)->surface; + src_is_gl_surface = src_surface->type == CAIRO_SURFACE_TYPE_GL; + } + + status = _cairo_gl_context_acquire (dst->base.device, &ctx); + if (unlikely (status)) + return status; + + surface = (cairo_gl_surface_t *) + _cairo_gl_surface_create_scratch (ctx, + CAIRO_CONTENT_COLOR_ALPHA, + extents->width, extents->height); + map_extents = *extents; + map_extents.x = map_extents.y = 0; + image = _cairo_surface_map_to_image (&surface->base, &map_extents); + + /* If the pattern is a GL surface, it belongs to some other GL context, + so we need to release this device while we paint it to the image. */ + if (src_is_gl_surface) { + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) + goto fail; + } + + status = _cairo_surface_offset_paint (&image->base, extents->x, extents->y, + CAIRO_OPERATOR_SOURCE, _src, NULL); + + if (src_is_gl_surface) { + status = _cairo_gl_context_acquire (dst->base.device, &ctx); + if (unlikely (status)) + goto fail; + } + + status = _cairo_surface_unmap_image (&surface->base, image); + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) + goto fail; + + *operand = surface->operand; + operand->texture.owns_surface = surface; + operand->texture.attributes.matrix.x0 -= extents->x * operand->texture.attributes.matrix.xx; + operand->texture.attributes.matrix.y0 -= extents->y * operand->texture.attributes.matrix.yy; + return CAIRO_STATUS_SUCCESS; + +fail: + cairo_surface_destroy (&surface->base); + return status; +} + +void +_cairo_gl_solid_operand_init (cairo_gl_operand_t *operand, + const cairo_color_t *color) +{ + operand->type = CAIRO_GL_OPERAND_CONSTANT; + operand->constant.color[0] = color->red * color->alpha; + operand->constant.color[1] = color->green * color->alpha; + operand->constant.color[2] = color->blue * color->alpha; + operand->constant.color[3] = color->alpha; +} + +void +_cairo_gl_operand_translate (cairo_gl_operand_t *operand, + double tx, double ty) +{ + switch (operand->type) { + case CAIRO_GL_OPERAND_TEXTURE: + operand->texture.attributes.matrix.x0 -= tx * operand->texture.attributes.matrix.xx; + operand->texture.attributes.matrix.y0 -= ty * operand->texture.attributes.matrix.yy; + break; + + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + operand->gradient.m.x0 -= tx * operand->gradient.m.xx; + operand->gradient.m.y0 -= ty * operand->gradient.m.yy; + break; + + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + case CAIRO_GL_OPERAND_COUNT: + default: + break; + } +} + +static cairo_status_t +_cairo_gl_gradient_operand_init (cairo_gl_operand_t *operand, + const cairo_pattern_t *pattern, + cairo_gl_surface_t *dst, + cairo_bool_t use_texgen) +{ + const cairo_gradient_pattern_t *gradient = (const cairo_gradient_pattern_t *)pattern; + cairo_status_t status; + + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + if (! _cairo_gl_device_has_glsl (dst->base.device)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_gl_create_gradient_texture (dst, + gradient, + &operand->gradient.gradient); + if (unlikely (status)) + return status; + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + double x0, y0, dx, dy, sf, offset; + + dx = linear->pd2.x - linear->pd1.x; + dy = linear->pd2.y - linear->pd1.y; + sf = 1.0 / (dx * dx + dy * dy); + dx *= sf; + dy *= sf; + + x0 = linear->pd1.x; + y0 = linear->pd1.y; + offset = dx * x0 + dy * y0; + + operand->type = CAIRO_GL_OPERAND_LINEAR_GRADIENT; + + cairo_matrix_init (&operand->gradient.m, dx, 0, dy, 1, -offset, 0); + if (! _cairo_matrix_is_identity (&pattern->matrix)) { + cairo_matrix_multiply (&operand->gradient.m, + &pattern->matrix, + &operand->gradient.m); + } + } else { + cairo_matrix_t m; + cairo_circle_double_t circles[2]; + double x0, y0, r0, dx, dy, dr; + + /* + * Some fragment shader implementations use half-floats to + * represent numbers, so the maximum number they can represent + * is about 2^14. Some intermediate computations used in the + * radial gradient shaders can produce results of up to 2*k^4. + * Setting k=8 makes the maximum result about 8192 (assuming + * that the extreme circles are not much smaller than the + * destination image). + */ + _cairo_gradient_pattern_fit_to_range (gradient, 8., + &operand->gradient.m, circles); + + x0 = circles[0].center.x; + y0 = circles[0].center.y; + r0 = circles[0].radius; + dx = circles[1].center.x - x0; + dy = circles[1].center.y - y0; + dr = circles[1].radius - r0; + + operand->gradient.a = dx * dx + dy * dy - dr * dr; + operand->gradient.radius_0 = r0; + operand->gradient.circle_d.center.x = dx; + operand->gradient.circle_d.center.y = dy; + operand->gradient.circle_d.radius = dr; + + if (operand->gradient.a == 0) + operand->type = CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0; + else if (pattern->extend == CAIRO_EXTEND_NONE) + operand->type = CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE; + else + operand->type = CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT; + + cairo_matrix_init_translate (&m, -x0, -y0); + cairo_matrix_multiply (&operand->gradient.m, + &operand->gradient.m, + &m); + } + + operand->gradient.extend = pattern->extend; + operand->gradient.texgen = use_texgen; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gl_operand_copy (cairo_gl_operand_t *dst, + const cairo_gl_operand_t *src) +{ + *dst = *src; + switch (dst->type) { + case CAIRO_GL_OPERAND_CONSTANT: + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + _cairo_gl_gradient_reference (dst->gradient.gradient); + break; + case CAIRO_GL_OPERAND_TEXTURE: + cairo_surface_reference (&dst->texture.owns_surface->base); + break; + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + break; + } +} + +void +_cairo_gl_operand_destroy (cairo_gl_operand_t *operand) +{ + switch (operand->type) { + case CAIRO_GL_OPERAND_CONSTANT: + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + _cairo_gl_gradient_destroy (operand->gradient.gradient); + break; + case CAIRO_GL_OPERAND_TEXTURE: + cairo_surface_destroy (&operand->texture.owns_surface->base); + break; + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + break; + } + + operand->type = CAIRO_GL_OPERAND_NONE; +} + +cairo_int_status_t +_cairo_gl_operand_init (cairo_gl_operand_t *operand, + const cairo_pattern_t *pattern, + cairo_gl_surface_t *dst, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s: type=%d\n", __FUNCTION__, pattern->type)); + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + _cairo_gl_solid_operand_init (operand, + &((cairo_solid_pattern_t *) pattern)->color); + return CAIRO_STATUS_SUCCESS; + case CAIRO_PATTERN_TYPE_SURFACE: + status = _cairo_gl_surface_operand_init (operand, pattern, dst, + sample, extents, use_texgen); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + break; + + return status; + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + status = _cairo_gl_gradient_operand_init (operand, pattern, dst, + use_texgen); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + break; + + return status; + + default: + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + break; + } + + return _cairo_gl_pattern_texture_setup (operand, pattern, dst, extents); +} + +cairo_filter_t +_cairo_gl_operand_get_filter (cairo_gl_operand_t *operand) +{ + cairo_filter_t filter; + + switch ((int) operand->type) { + case CAIRO_GL_OPERAND_TEXTURE: + filter = operand->texture.attributes.filter; + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + filter = CAIRO_FILTER_BILINEAR; + break; + default: + filter = CAIRO_FILTER_DEFAULT; + break; + } + + return filter; +} + +GLint +_cairo_gl_operand_get_gl_filter (cairo_gl_operand_t *operand) +{ + cairo_filter_t filter = _cairo_gl_operand_get_filter (operand); + + return filter != CAIRO_FILTER_FAST && filter != CAIRO_FILTER_NEAREST ? + GL_LINEAR : + GL_NEAREST; +} + +cairo_extend_t +_cairo_gl_operand_get_extend (cairo_gl_operand_t *operand) +{ + cairo_extend_t extend; + + switch ((int) operand->type) { + case CAIRO_GL_OPERAND_TEXTURE: + extend = operand->texture.attributes.extend; + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + extend = operand->gradient.extend; + break; + default: + extend = CAIRO_EXTEND_NONE; + break; + } + + return extend; +} + + +void +_cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx, + cairo_gl_operand_t *operand, + cairo_gl_tex_t tex_unit) +{ + const cairo_matrix_t *texgen = NULL; + + switch (operand->type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + return; + + case CAIRO_GL_OPERAND_CONSTANT: + _cairo_gl_shader_bind_vec4 (ctx, + ctx->current_shader->constant_location[tex_unit], + operand->constant.color[0], + operand->constant.color[1], + operand->constant.color[2], + operand->constant.color[3]); + return; + + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + _cairo_gl_shader_bind_float (ctx, + ctx->current_shader->a_location[tex_unit], + operand->gradient.a); + /* fall through */ + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + _cairo_gl_shader_bind_vec3 (ctx, + ctx->current_shader->circle_d_location[tex_unit], + operand->gradient.circle_d.center.x, + operand->gradient.circle_d.center.y, + operand->gradient.circle_d.radius); + _cairo_gl_shader_bind_float (ctx, + ctx->current_shader->radius_0_location[tex_unit], + operand->gradient.radius_0); + /* fall through */ + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_TEXTURE: + /* + * For GLES2 we use shaders to implement GL_CLAMP_TO_BORDER (used + * with CAIRO_EXTEND_NONE). When bilinear filtering is enabled, + * these shaders need the texture dimensions for their calculations. + */ + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES && + _cairo_gl_operand_get_extend (operand) == CAIRO_EXTEND_NONE && + _cairo_gl_operand_get_gl_filter (operand) == GL_LINEAR) + { + float width, height; + if (operand->type == CAIRO_GL_OPERAND_TEXTURE) { + width = operand->texture.surface->width; + height = operand->texture.surface->height; + } + else { + width = operand->gradient.gradient->cache_entry.size, + height = 1; + } + _cairo_gl_shader_bind_vec2 (ctx, + ctx->current_shader->texdims_location[tex_unit], + width, height); + } + break; + } + + if (operand->type == CAIRO_GL_OPERAND_TEXTURE) { + if (operand->texture.texgen) + texgen = &operand->texture.attributes.matrix; + } else { + if (operand->gradient.texgen) + texgen = &operand->gradient.m; + } + if (texgen) { + _cairo_gl_shader_bind_matrix(ctx, + ctx->current_shader->texgen_location[tex_unit], + texgen); + } +} + + +cairo_bool_t +_cairo_gl_operand_needs_setup (cairo_gl_operand_t *dest, + cairo_gl_operand_t *source, + unsigned int vertex_offset) +{ + if (dest->type != source->type) + return TRUE; + if (dest->vertex_offset != vertex_offset) + return TRUE; + + switch (source->type) { + case CAIRO_GL_OPERAND_NONE: + return FALSE; + case CAIRO_GL_OPERAND_CONSTANT: + return dest->constant.color[0] != source->constant.color[0] || + dest->constant.color[1] != source->constant.color[1] || + dest->constant.color[2] != source->constant.color[2] || + dest->constant.color[3] != source->constant.color[3]; + case CAIRO_GL_OPERAND_TEXTURE: + return dest->texture.surface != source->texture.surface || + dest->texture.attributes.extend != source->texture.attributes.extend || + dest->texture.attributes.filter != source->texture.attributes.filter || + dest->texture.attributes.has_component_alpha != source->texture.attributes.has_component_alpha; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + /* XXX: improve this */ + return TRUE; + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + break; + } + return TRUE; +} + +unsigned int +_cairo_gl_operand_get_vertex_size (const cairo_gl_operand_t *operand) +{ + switch (operand->type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + return 0; + case CAIRO_GL_OPERAND_TEXTURE: + return operand->texture.texgen ? 0 : 2 * sizeof (GLfloat); + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + return operand->gradient.texgen ? 0 : 2 * sizeof (GLfloat); + } +} + +void +_cairo_gl_operand_emit (cairo_gl_operand_t *operand, + GLfloat ** vb, + GLfloat x, + GLfloat y) +{ + switch (operand->type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + if (! operand->gradient.texgen) { + double s = x; + double t = y; + + cairo_matrix_transform_point (&operand->gradient.m, &s, &t); + + *(*vb)++ = s; + *(*vb)++ = t; + } + break; + case CAIRO_GL_OPERAND_TEXTURE: + if (! operand->texture.texgen) { + cairo_surface_attributes_t *src_attributes = &operand->texture.attributes; + double s = x; + double t = y; + + cairo_matrix_transform_point (&src_attributes->matrix, &s, &t); + *(*vb)++ = s; + *(*vb)++ = t; + } + break; + } +} diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h new file mode 100644 index 000000000..cb915c8cf --- /dev/null +++ b/src/cairo-gl-private.h @@ -0,0 +1,853 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * Copyright © 2011 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + * T. Zachary Laine + * Alexandros Frantzis + */ + +#ifndef CAIRO_GL_PRIVATE_H +#define CAIRO_GL_PRIVATE_H + +#define GL_GLEXT_PROTOTYPES + +#include "cairoint.h" + +#include "cairo-gl.h" +#include "cairo-gl-gradient-private.h" + +#include "cairo-device-private.h" +#include "cairo-error-private.h" +#include "cairo-rtree-private.h" +#include "cairo-scaled-font-private.h" +#include "cairo-spans-compositor-private.h" +#include "cairo-array-private.h" + +#include + +#if CAIRO_HAS_GL_SURFACE +#include +#include +#elif CAIRO_HAS_GLESV2_SURFACE +#include +#include +#endif + +#include "cairo-gl-ext-def-private.h" + +#define DEBUG_GL 0 + +#if DEBUG_GL && __GNUC__ +#define UNSUPPORTED(reason) ({ \ + fprintf (stderr, \ + "cairo-gl: hit unsupported operation in %s(), line %d: %s\n", \ + __FUNCTION__, __LINE__, reason); \ + CAIRO_INT_STATUS_UNSUPPORTED; \ +}) +#else +#define UNSUPPORTED(reason) CAIRO_INT_STATUS_UNSUPPORTED +#endif + +#define CAIRO_GL_VERSION_ENCODE(major, minor) ( \ + ((major) * 256) \ + + ((minor) * 1)) + +/* maximal number of shaders we keep in the cache. + * Random number that is hopefully big enough to not cause many cache evictions. */ +#define CAIRO_GL_MAX_SHADERS_PER_CONTEXT 64 + +/* VBO size that we allocate, smaller size means we gotta flush more often, + * but larger means hogging more memory and can cause trouble for drivers + * (especially on embedded devices). Use the CAIRO_GL_VBO_SIZE environment + * variable to set this to a different size. */ +#define CAIRO_GL_VBO_SIZE_DEFAULT (1024*1024) + +typedef struct _cairo_gl_surface cairo_gl_surface_t; + +/* GL flavor */ +typedef enum cairo_gl_flavor { + CAIRO_GL_FLAVOR_NONE = 0, + CAIRO_GL_FLAVOR_DESKTOP = 1, + CAIRO_GL_FLAVOR_ES = 2 +} cairo_gl_flavor_t; + +/* Indices for vertex attributes used by BindAttribLocation etc */ +enum { + CAIRO_GL_VERTEX_ATTRIB_INDEX = 0, + CAIRO_GL_COLOR_ATTRIB_INDEX = 1, + CAIRO_GL_TEXCOORD0_ATTRIB_INDEX = 2, + CAIRO_GL_TEXCOORD1_ATTRIB_INDEX = CAIRO_GL_TEXCOORD0_ATTRIB_INDEX + 1 +}; + +typedef enum cairo_gl_operand_type { + CAIRO_GL_OPERAND_NONE, + CAIRO_GL_OPERAND_CONSTANT, + CAIRO_GL_OPERAND_TEXTURE, + CAIRO_GL_OPERAND_LINEAR_GRADIENT, + CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0, + CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE, + CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT, + + CAIRO_GL_OPERAND_COUNT +} cairo_gl_operand_type_t; + +/* This union structure describes a potential source or mask operand to the + * compositing equation. + */ +typedef struct cairo_gl_operand { + cairo_gl_operand_type_t type; + union { + struct { + GLuint tex; + cairo_gl_surface_t *surface; + cairo_gl_surface_t *owns_surface; + cairo_surface_attributes_t attributes; + int texgen; + } texture; + struct { + GLfloat color[4]; + } constant; + struct { + cairo_gl_gradient_t *gradient; + cairo_matrix_t m; + cairo_circle_double_t circle_d; + double radius_0, a; + cairo_extend_t extend; + int texgen; + } gradient; + }; + unsigned int vertex_offset; +} cairo_gl_operand_t; + +typedef struct cairo_gl_source { + cairo_surface_t base; + cairo_gl_operand_t operand; +} cairo_gl_source_t; + +struct _cairo_gl_surface { + cairo_surface_t base; + cairo_gl_operand_t operand; + + int width, height; + + GLuint tex; /* GL texture object containing our data. */ + GLuint fb; /* GL framebuffer object wrapping our data. */ + GLuint depth_stencil; /* GL renderbuffer object for holding stencil buffer clip. */ + +#if CAIRO_HAS_GL_SURFACE + GLuint msaa_rb; /* The ARB MSAA path uses a renderbuffer. */ + GLuint msaa_fb; +#endif + GLuint msaa_depth_stencil; + + cairo_bool_t stencil_and_msaa_caps_initialized; + cairo_bool_t supports_stencil; /* Stencil support for for non-texture surfaces. */ + cairo_bool_t supports_msaa; + cairo_bool_t msaa_active; /* Whether the multisampling + framebuffer is active or not. */ + cairo_clip_t *clip_on_stencil_buffer; + + int owns_tex; + cairo_bool_t needs_update; + + cairo_region_t *clip_region; +}; + +typedef struct cairo_gl_glyph_cache { + cairo_rtree_t rtree; + cairo_gl_surface_t *surface; +} cairo_gl_glyph_cache_t; + +typedef enum cairo_gl_tex { + CAIRO_GL_TEX_SOURCE = 0, + CAIRO_GL_TEX_MASK = 1, + CAIRO_GL_TEX_TEMP = 2 +} cairo_gl_tex_t; + +typedef struct cairo_gl_shader { + GLuint fragment_shader; + GLuint program; + GLint mvp_location; + GLint constant_location[2]; + GLint a_location[2]; + GLint circle_d_location[2]; + GLint radius_0_location[2]; + GLint texdims_location[2]; + GLint texgen_location[2]; +} cairo_gl_shader_t; + +typedef enum cairo_gl_shader_in { + CAIRO_GL_SHADER_IN_NORMAL, + CAIRO_GL_SHADER_IN_CA_SOURCE, + CAIRO_GL_SHADER_IN_CA_SOURCE_ALPHA, + + CAIRO_GL_SHADER_IN_COUNT +} cairo_gl_shader_in_t; + +typedef enum cairo_gl_var_type { + CAIRO_GL_VAR_NONE, + CAIRO_GL_VAR_TEXCOORDS, + CAIRO_GL_VAR_TEXGEN, +} cairo_gl_var_type_t; + +typedef enum cairo_gl_primitive_type { + CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES, + CAIRO_GL_PRIMITIVE_TYPE_TRISTRIPS +} cairo_gl_primitive_type_t; + +typedef void (*cairo_gl_emit_rect_t) (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2); + +typedef void (*cairo_gl_emit_span_t) (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2, + uint8_t alpha); + +typedef void (*cairo_gl_emit_glyph_t) (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2, + GLfloat glyph_x1, GLfloat glyph_y1, + GLfloat glyph_x2, GLfloat glyph_y2); + +#define cairo_gl_var_type_hash(src,mask,spans,dest) ((spans) << 5) | ((mask) << 3 | (src << 1) | (dest)) +#define CAIRO_GL_VAR_TYPE_MAX (1 << 6) + +typedef void (*cairo_gl_generic_func_t)(void); +typedef cairo_gl_generic_func_t (*cairo_gl_get_proc_addr_func_t)(const char *procname); + +typedef struct _cairo_gl_dispatch { + /* Buffers */ + void (*GenBuffers) (GLsizei n, GLuint *buffers); + void (*BindBuffer) (GLenum target, GLuint buffer); + void (*BufferData) (GLenum target, GLsizeiptr size, + const GLvoid* data, GLenum usage); + GLvoid *(*MapBuffer) (GLenum target, GLenum access); + GLboolean (*UnmapBuffer) (GLenum target); + + /* Shaders */ + GLuint (*CreateShader) (GLenum type); + void (*ShaderSource) (GLuint shader, GLsizei count, + const GLchar** string, const GLint* length); + void (*CompileShader) (GLuint shader); + void (*GetShaderiv) (GLuint shader, GLenum pname, GLint *params); + void (*GetShaderInfoLog) (GLuint shader, GLsizei bufSize, + GLsizei *length, GLchar *infoLog); + void (*DeleteShader) (GLuint shader); + + /* Programs */ + GLuint (*CreateProgram) (void); + void (*AttachShader) (GLuint program, GLuint shader); + void (*DeleteProgram) (GLuint program); + void (*LinkProgram) (GLuint program); + void (*UseProgram) (GLuint program); + void (*GetProgramiv) (GLuint program, GLenum pname, GLint *params); + void (*GetProgramInfoLog) (GLuint program, GLsizei bufSize, + GLsizei *length, GLchar *infoLog); + + /* Uniforms */ + GLint (*GetUniformLocation) (GLuint program, const GLchar* name); + void (*Uniform1f) (GLint location, GLfloat x); + void (*Uniform2f) (GLint location, GLfloat x, GLfloat y); + void (*Uniform3f) (GLint location, GLfloat x, GLfloat y, GLfloat z); + void (*Uniform4f) (GLint location, GLfloat x, GLfloat y, GLfloat z, + GLfloat w); + void (*UniformMatrix3fv) (GLint location, GLsizei count, + GLboolean transpose, const GLfloat *value); + void (*UniformMatrix4fv) (GLint location, GLsizei count, + GLboolean transpose, const GLfloat *value); + void (*Uniform1i) (GLint location, GLint x); + + /* Attributes */ + void (*BindAttribLocation) (GLuint program, GLuint index, + const GLchar *name); + void (*VertexAttribPointer) (GLuint index, GLint size, GLenum type, + GLboolean normalized, GLsizei stride, + const GLvoid *pointer); + void (*EnableVertexAttribArray) (GLuint index); + void (*DisableVertexAttribArray) (GLuint index); + + /* Framebuffer objects */ + void (*GenFramebuffers) (GLsizei n, GLuint* framebuffers); + void (*BindFramebuffer) (GLenum target, GLuint framebuffer); + void (*FramebufferTexture2D) (GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, + GLint level); + GLenum (*CheckFramebufferStatus) (GLenum target); + void (*DeleteFramebuffers) (GLsizei n, const GLuint* framebuffers); + void (*GenRenderbuffers) (GLsizei n, GLuint *renderbuffers); + void (*BindRenderbuffer) (GLenum target, GLuint renderbuffer); + void (*RenderbufferStorage) (GLenum target, GLenum internal_format, + GLsizei width, GLsizei height); + void (*FramebufferRenderbuffer) (GLenum target, GLenum attachment, + GLenum renderbuffer_ttarget, GLuint renderbuffer); + void (*DeleteRenderbuffers) (GLsizei n, GLuint *renderbuffers); + void (*BlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, + GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, + GLbitfield mask, GLenum filter); + void (*RenderbufferStorageMultisample) (GLenum target, GLsizei samples, + GLenum internalformat, + GLsizei width, GLsizei height); + void (*FramebufferTexture2DMultisample) (GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, + GLint level, GLsizei samples); +} cairo_gl_dispatch_t; + +struct _cairo_gl_context { + cairo_device_t base; + + const cairo_compositor_t *compositor; + + GLuint texture_load_pbo; + GLint max_framebuffer_size; + GLint max_texture_size; + GLint max_textures; + GLenum tex_target; + + GLint num_samples; + cairo_bool_t supports_msaa; + char *vb; + + cairo_bool_t has_shader_support; + + GLuint vertex_shaders[CAIRO_GL_VAR_TYPE_MAX]; + cairo_gl_shader_t fill_rectangles_shader; + cairo_cache_t shaders; + + cairo_cache_t gradients; + + cairo_gl_glyph_cache_t glyph_cache[2]; + cairo_list_t fonts; + + cairo_gl_surface_t *current_target; + cairo_operator_t current_operator; + cairo_gl_shader_t *pre_shader; /* for component alpha */ + cairo_gl_shader_t *current_shader; + + cairo_gl_operand_t operands[2]; + cairo_bool_t spans; + + unsigned int vbo_size; + unsigned int vb_offset; + unsigned int vertex_size; + cairo_region_t *clip_region; + cairo_clip_t *clip; + + cairo_gl_primitive_type_t primitive_type; + cairo_array_t tristrip_indices; + + cairo_bool_t has_mesa_pack_invert; + cairo_gl_dispatch_t dispatch; + GLfloat modelviewprojection_matrix[16]; + cairo_gl_flavor_t gl_flavor; + cairo_bool_t has_map_buffer; + cairo_bool_t has_packed_depth_stencil; + cairo_bool_t has_npot_repeat; + cairo_bool_t can_read_bgra; + + cairo_bool_t thread_aware; + + void (*acquire) (void *ctx); + void (*release) (void *ctx); + + void (*make_current) (void *ctx, cairo_gl_surface_t *surface); + void (*swap_buffers)(void *ctx, cairo_gl_surface_t *surface); + void (*destroy) (void *ctx); +}; + +typedef struct _cairo_gl_composite { + cairo_gl_surface_t *dst; + cairo_operator_t op; + cairo_region_t *clip_region; + + cairo_gl_operand_t src; + cairo_gl_operand_t mask; + cairo_bool_t spans; + + cairo_clip_t *clip; + cairo_bool_t multisample; +} cairo_gl_composite_t; + +typedef struct _cairo_gl_font { + cairo_scaled_font_private_t base; + cairo_device_t *device; + cairo_list_t link; +} cairo_gl_font_t; + +static cairo_always_inline GLenum +_cairo_gl_get_error (void) +{ + GLenum err = glGetError(); + + if (unlikely (err)) + while (glGetError ()); + + return err; +} + +static inline cairo_device_t * +_cairo_gl_context_create_in_error (cairo_status_t status) +{ + return (cairo_device_t *) _cairo_device_create_in_error (status); +} + +cairo_private cairo_status_t +_cairo_gl_context_init (cairo_gl_context_t *ctx); + +cairo_private void +_cairo_gl_surface_init (cairo_device_t *device, + cairo_gl_surface_t *surface, + cairo_content_t content, + int width, int height); + +static cairo_always_inline cairo_bool_t cairo_warn +_cairo_gl_surface_is_texture (cairo_gl_surface_t *surface) +{ + return surface->tex != 0; +} + +cairo_private cairo_status_t +_cairo_gl_surface_draw_image (cairo_gl_surface_t *dst, + cairo_image_surface_t *src, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y, + cairo_bool_t force_flush); + +cairo_private cairo_int_status_t +_cairo_gl_surface_resolve_multisampling (cairo_gl_surface_t *surface); + +static cairo_always_inline cairo_bool_t +_cairo_gl_device_has_glsl (cairo_device_t *device) +{ + return ((cairo_gl_context_t *) device)->has_shader_support; +} + +static cairo_always_inline cairo_bool_t +_cairo_gl_device_requires_power_of_two_textures (cairo_device_t *device) +{ + return ((cairo_gl_context_t *) device)->tex_target == GL_TEXTURE_RECTANGLE; +} + +static cairo_always_inline cairo_status_t cairo_warn +_cairo_gl_context_acquire (cairo_device_t *device, + cairo_gl_context_t **ctx) +{ + cairo_status_t status; + + status = cairo_device_acquire (device); + if (unlikely (status)) + return status; + + /* clear potential previous GL errors */ + _cairo_gl_get_error (); + + *ctx = (cairo_gl_context_t *) device; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_always_inline cairo_warn cairo_status_t +_cairo_gl_context_release (cairo_gl_context_t *ctx, cairo_status_t status) +{ + GLenum err; + + err = _cairo_gl_get_error (); + + if (unlikely (err)) { + cairo_status_t new_status; + new_status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + if (status == CAIRO_STATUS_SUCCESS) + status = new_status; + } + + cairo_device_release (&(ctx)->base); + + return status; +} + +cairo_private void +_cairo_gl_context_set_destination (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface, + cairo_bool_t multisampling); + +cairo_private void +_cairo_gl_context_bind_framebuffer (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface, + cairo_bool_t multisampling); + +cairo_private cairo_gl_emit_rect_t +_cairo_gl_context_choose_emit_rect (cairo_gl_context_t *ctx); + +cairo_private void +_cairo_gl_context_emit_rect (cairo_gl_context_t *ctx, + GLfloat x1, GLfloat y1, + GLfloat x2, GLfloat y2); + +cairo_private cairo_gl_emit_span_t +_cairo_gl_context_choose_emit_span (cairo_gl_context_t *ctx); + +cairo_private cairo_gl_emit_glyph_t +_cairo_gl_context_choose_emit_glyph (cairo_gl_context_t *ctx); + +cairo_private void +_cairo_gl_context_activate (cairo_gl_context_t *ctx, + cairo_gl_tex_t tex_unit); + +cairo_private cairo_bool_t +_cairo_gl_operator_is_supported (cairo_operator_t op); + +cairo_private cairo_bool_t +_cairo_gl_ensure_stencil (cairo_gl_context_t *ctx, + cairo_gl_surface_t *surface); + +cairo_private cairo_status_t +_cairo_gl_composite_init (cairo_gl_composite_t *setup, + cairo_operator_t op, + cairo_gl_surface_t *dst, + cairo_bool_t has_component_alpha); + +cairo_private void +_cairo_gl_composite_fini (cairo_gl_composite_t *setup); + +cairo_private cairo_status_t +_cairo_gl_composite_set_operator (cairo_gl_composite_t *setup, + cairo_operator_t op, + cairo_bool_t assume_component_alpha); + +cairo_private void +_cairo_gl_composite_set_clip_region (cairo_gl_composite_t *setup, + cairo_region_t *clip_region); + +cairo_private void +_cairo_gl_composite_set_clip(cairo_gl_composite_t *setup, + cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_gl_composite_set_source (cairo_gl_composite_t *setup, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen); + +cairo_private void +_cairo_gl_composite_set_solid_source (cairo_gl_composite_t *setup, + const cairo_color_t *color); + +cairo_private void +_cairo_gl_composite_set_source_operand (cairo_gl_composite_t *setup, + const cairo_gl_operand_t *source); + +cairo_private cairo_int_status_t +_cairo_gl_composite_set_mask (cairo_gl_composite_t *setup, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen); + +cairo_private void +_cairo_gl_composite_set_mask_operand (cairo_gl_composite_t *setup, + const cairo_gl_operand_t *mask); + +cairo_private void +_cairo_gl_composite_set_spans (cairo_gl_composite_t *setup); + +cairo_private void +_cairo_gl_composite_set_multisample (cairo_gl_composite_t *setup); + +cairo_private cairo_status_t +_cairo_gl_composite_begin (cairo_gl_composite_t *setup, + cairo_gl_context_t **ctx); + +cairo_private cairo_status_t +_cairo_gl_set_operands_and_operator (cairo_gl_composite_t *setup, + cairo_gl_context_t *ctx); + +cairo_private void +_cairo_gl_composite_flush (cairo_gl_context_t *ctx); + +cairo_private cairo_int_status_t +_cairo_gl_composite_emit_quad_as_tristrip (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + const cairo_point_t quad[4]); + +cairo_private cairo_int_status_t +_cairo_gl_composite_emit_triangle_as_tristrip (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + const cairo_point_t triangle[3]); + +cairo_private void +_cairo_gl_context_destroy_operand (cairo_gl_context_t *ctx, + cairo_gl_tex_t tex_unit); + +cairo_private cairo_bool_t +_cairo_gl_get_image_format_and_type (cairo_gl_flavor_t flavor, + pixman_format_code_t pixman_format, + GLenum *internal_format, GLenum *format, + GLenum *type, cairo_bool_t *has_alpha, + cairo_bool_t *needs_swap); + +cairo_private void +_cairo_gl_glyph_cache_init (cairo_gl_glyph_cache_t *cache); + +cairo_private void +_cairo_gl_glyph_cache_fini (cairo_gl_context_t *ctx, + cairo_gl_glyph_cache_t *cache); + +cairo_private cairo_int_status_t +_cairo_gl_surface_show_glyphs (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip, + int *remaining_glyphs); + +cairo_private cairo_status_t +_cairo_gl_context_init_shaders (cairo_gl_context_t *ctx); + +cairo_private void +_cairo_gl_context_fini_shaders (cairo_gl_context_t *ctx); + +static cairo_always_inline cairo_bool_t +_cairo_gl_context_is_flushed (cairo_gl_context_t *ctx) +{ + return ctx->vb_offset == 0; +} + +cairo_private cairo_status_t +_cairo_gl_get_shader_by_type (cairo_gl_context_t *ctx, + cairo_gl_operand_t *source, + cairo_gl_operand_t *mask, + cairo_bool_t use_coverage, + cairo_gl_shader_in_t in, + cairo_gl_shader_t **shader); + +cairo_private void +_cairo_gl_shader_bind_float (cairo_gl_context_t *ctx, + GLint location, + float value); + +cairo_private void +_cairo_gl_shader_bind_vec2 (cairo_gl_context_t *ctx, + GLint location, + float value0, float value1); + +cairo_private void +_cairo_gl_shader_bind_vec3 (cairo_gl_context_t *ctx, + GLint location, + float value0, + float value1, + float value2); + +cairo_private void +_cairo_gl_shader_bind_vec4 (cairo_gl_context_t *ctx, + GLint location, + float value0, float value1, + float value2, float value3); + +cairo_private void +_cairo_gl_shader_bind_matrix (cairo_gl_context_t *ctx, + GLint location, + const cairo_matrix_t* m); + +cairo_private void +_cairo_gl_shader_bind_matrix4f (cairo_gl_context_t *ctx, + GLint location, + GLfloat* gl_m); + +cairo_private void +_cairo_gl_set_shader (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader); + +cairo_private void +_cairo_gl_shader_fini (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader); + +cairo_private int +_cairo_gl_get_version (void); + +cairo_private cairo_gl_flavor_t +_cairo_gl_get_flavor (void); + +cairo_private unsigned long +_cairo_gl_get_vbo_size (void); + +cairo_private cairo_bool_t +_cairo_gl_has_extension (const char *ext); + +cairo_private cairo_status_t +_cairo_gl_dispatch_init(cairo_gl_dispatch_t *dispatch, + cairo_gl_get_proc_addr_func_t get_proc_addr); + +cairo_private cairo_int_status_t +_cairo_gl_operand_init (cairo_gl_operand_t *operand, + const cairo_pattern_t *pattern, + cairo_gl_surface_t *dst, + const cairo_rectangle_int_t *sample, + const cairo_rectangle_int_t *extents, + cairo_bool_t use_texgen); + +cairo_private void +_cairo_gl_solid_operand_init (cairo_gl_operand_t *operand, + const cairo_color_t *color); + +cairo_private cairo_filter_t +_cairo_gl_operand_get_filter (cairo_gl_operand_t *operand); + +cairo_private GLint +_cairo_gl_operand_get_gl_filter (cairo_gl_operand_t *operand); + +cairo_private cairo_extend_t +_cairo_gl_operand_get_extend (cairo_gl_operand_t *operand); + +cairo_private unsigned int +_cairo_gl_operand_get_vertex_size (const cairo_gl_operand_t *operand); + +cairo_private cairo_bool_t +_cairo_gl_operand_needs_setup (cairo_gl_operand_t *dest, + cairo_gl_operand_t *source, + unsigned int vertex_offset); + +cairo_private void +_cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx, + cairo_gl_operand_t *operand, + cairo_gl_tex_t tex_unit); + +cairo_private void +_cairo_gl_operand_emit (cairo_gl_operand_t *operand, + GLfloat ** vb, + GLfloat x, + GLfloat y); + +cairo_private void +_cairo_gl_operand_copy (cairo_gl_operand_t *dst, + const cairo_gl_operand_t *src); + +cairo_private void +_cairo_gl_operand_translate (cairo_gl_operand_t *operand, + double tx, double ty); + +cairo_private void +_cairo_gl_operand_destroy (cairo_gl_operand_t *operand); + +cairo_private const cairo_compositor_t * +_cairo_gl_msaa_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_gl_span_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_gl_traps_compositor_get (void); + +cairo_private cairo_int_status_t +_cairo_gl_check_composite_glyphs (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs); + +cairo_private cairo_int_status_t +_cairo_gl_composite_glyphs (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info); + +cairo_private cairo_int_status_t +_cairo_gl_composite_glyphs_with_clip (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info, + cairo_clip_t *clip); + +cairo_private cairo_surface_t * +_cairo_gl_surface_create_scratch (cairo_gl_context_t *ctx, + cairo_content_t content, + int width, + int height); + +cairo_private cairo_surface_t * +_cairo_gl_surface_create_scratch_for_caching (cairo_gl_context_t *ctx, + cairo_content_t content, + int width, + int height); + +cairo_private cairo_surface_t * +_cairo_gl_pattern_to_source (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y); + +cairo_private cairo_int_status_t +_cairo_gl_msaa_compositor_draw_clip (cairo_gl_context_t *ctx, + cairo_gl_composite_t *setup, + cairo_clip_t *clip); + +cairo_private cairo_surface_t * +_cairo_gl_white_source (void); + +cairo_private void +_cairo_gl_scissor_to_rectangle (cairo_gl_surface_t *surface, + const cairo_rectangle_int_t *r); + +static inline cairo_gl_operand_t * +source_to_operand (cairo_surface_t *surface) +{ + cairo_gl_source_t *source = (cairo_gl_source_t *)surface; + return source ? &source->operand : NULL; +} + +static inline void +_cairo_gl_glyph_cache_unlock (cairo_gl_glyph_cache_t *cache) +{ + _cairo_rtree_unpin (&cache->rtree); +} + + +slim_hidden_proto (cairo_gl_surface_create); +slim_hidden_proto (cairo_gl_surface_create_for_texture); + +#endif /* CAIRO_GL_PRIVATE_H */ diff --git a/src/cairo-gl-shaders.c b/src/cairo-gl-shaders.c new file mode 100644 index 000000000..271060666 --- /dev/null +++ b/src/cairo-gl-shaders.c @@ -0,0 +1,1093 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 T. Zachary Laine + * Copyright © 2010 Eric Anholt + * Copyright © 2010 Red Hat, Inc + * Copyright © 2010 Linaro Limited + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is T. Zachary Laine. + * + * Contributor(s): + * Benjamin Otte + * Eric Anholt + * T. Zachary Laine + * Alexandros Frantzis + */ + +#include "cairoint.h" +#include "cairo-gl-private.h" +#include "cairo-error-private.h" +#include "cairo-output-stream-private.h" + +static cairo_status_t +_cairo_gl_shader_compile_and_link (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader, + cairo_gl_var_type_t src, + cairo_gl_var_type_t mask, + cairo_bool_t use_coverage, + const char *fragment_text); + +typedef struct _cairo_shader_cache_entry { + cairo_cache_entry_t base; + + unsigned vertex; + + cairo_gl_operand_type_t src; + cairo_gl_operand_type_t mask; + cairo_gl_operand_type_t dest; + cairo_bool_t use_coverage; + + cairo_gl_shader_in_t in; + GLint src_gl_filter; + cairo_bool_t src_border_fade; + cairo_extend_t src_extend; + GLint mask_gl_filter; + cairo_bool_t mask_border_fade; + cairo_extend_t mask_extend; + + cairo_gl_context_t *ctx; /* XXX: needed to destroy the program */ + cairo_gl_shader_t shader; +} cairo_shader_cache_entry_t; + +static cairo_bool_t +_cairo_gl_shader_cache_equal_desktop (const void *key_a, const void *key_b) +{ + const cairo_shader_cache_entry_t *a = key_a; + const cairo_shader_cache_entry_t *b = key_b; + cairo_bool_t both_have_npot_repeat = + a->ctx->has_npot_repeat && b->ctx->has_npot_repeat; + + return (a->vertex == b->vertex && + a->src == b->src && + a->mask == b->mask && + a->dest == b->dest && + a->use_coverage == b->use_coverage && + a->in == b->in && + (both_have_npot_repeat || a->src_extend == b->src_extend) && + (both_have_npot_repeat || a->mask_extend == b->mask_extend)); +} + +/* + * For GLES2 we use more complicated shaders to implement missing GL + * features. In this case we need more parameters to uniquely identify + * a shader (vs _cairo_gl_shader_cache_equal_desktop()). + */ +static cairo_bool_t +_cairo_gl_shader_cache_equal_gles2 (const void *key_a, const void *key_b) +{ + const cairo_shader_cache_entry_t *a = key_a; + const cairo_shader_cache_entry_t *b = key_b; + cairo_bool_t both_have_npot_repeat = + a->ctx->has_npot_repeat && b->ctx->has_npot_repeat; + + return (a->vertex == b->vertex && + a->src == b->src && + a->mask == b->mask && + a->dest == b->dest && + a->use_coverage == b->use_coverage && + a->in == b->in && + a->src_gl_filter == b->src_gl_filter && + a->src_border_fade == b->src_border_fade && + (both_have_npot_repeat || a->src_extend == b->src_extend) && + a->mask_gl_filter == b->mask_gl_filter && + a->mask_border_fade == b->mask_border_fade && + (both_have_npot_repeat || a->mask_extend == b->mask_extend)); +} + +static unsigned long +_cairo_gl_shader_cache_hash (const cairo_shader_cache_entry_t *entry) +{ + return ((entry->src << 24) | (entry->mask << 16) | (entry->dest << 8) | (entry->in << 1) | entry->use_coverage) ^ entry->vertex; +} + +static void +_cairo_gl_shader_cache_destroy (void *data) +{ + cairo_shader_cache_entry_t *entry = data; + + _cairo_gl_shader_fini (entry->ctx, &entry->shader); + if (entry->ctx->current_shader == &entry->shader) + entry->ctx->current_shader = NULL; + free (entry); +} + +static void +_cairo_gl_shader_init (cairo_gl_shader_t *shader) +{ + shader->fragment_shader = 0; + shader->program = 0; +} + +cairo_status_t +_cairo_gl_context_init_shaders (cairo_gl_context_t *ctx) +{ + static const char *fill_fs_source = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "uniform vec4 color;\n" + "void main()\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; + cairo_status_t status; + + if (_cairo_gl_get_version () >= CAIRO_GL_VERSION_ENCODE (2, 0) || + (_cairo_gl_has_extension ("GL_ARB_shader_objects") && + _cairo_gl_has_extension ("GL_ARB_fragment_shader") && + _cairo_gl_has_extension ("GL_ARB_vertex_shader"))) { + ctx->has_shader_support = TRUE; + } else { + ctx->has_shader_support = FALSE; + fprintf (stderr, "Error: The cairo gl backend requires shader support!\n"); + return CAIRO_STATUS_DEVICE_ERROR; + } + + memset (ctx->vertex_shaders, 0, sizeof (ctx->vertex_shaders)); + + status = _cairo_cache_init (&ctx->shaders, + ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP ? + _cairo_gl_shader_cache_equal_desktop : + _cairo_gl_shader_cache_equal_gles2, + NULL, + _cairo_gl_shader_cache_destroy, + CAIRO_GL_MAX_SHADERS_PER_CONTEXT); + if (unlikely (status)) + return status; + + _cairo_gl_shader_init (&ctx->fill_rectangles_shader); + status = _cairo_gl_shader_compile_and_link (ctx, + &ctx->fill_rectangles_shader, + CAIRO_GL_VAR_NONE, + CAIRO_GL_VAR_NONE, + FALSE, + fill_fs_source); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gl_context_fini_shaders (cairo_gl_context_t *ctx) +{ + int i; + + for (i = 0; i < CAIRO_GL_VAR_TYPE_MAX; i++) { + if (ctx->vertex_shaders[i]) + ctx->dispatch.DeleteShader (ctx->vertex_shaders[i]); + } + + _cairo_cache_fini (&ctx->shaders); +} + +void +_cairo_gl_shader_fini (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader) +{ + if (shader->fragment_shader) + ctx->dispatch.DeleteShader (shader->fragment_shader); + + if (shader->program) + ctx->dispatch.DeleteProgram (shader->program); +} + +static const char *operand_names[] = { "source", "mask", "dest" }; + +static cairo_gl_var_type_t +cairo_gl_operand_get_var_type (cairo_gl_operand_t *operand) +{ + switch (operand->type) { + default: + case CAIRO_GL_OPERAND_COUNT: + ASSERT_NOT_REACHED; + case CAIRO_GL_OPERAND_NONE: + case CAIRO_GL_OPERAND_CONSTANT: + return CAIRO_GL_VAR_NONE; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + return operand->gradient.texgen ? CAIRO_GL_VAR_TEXGEN : CAIRO_GL_VAR_TEXCOORDS; + case CAIRO_GL_OPERAND_TEXTURE: + return operand->texture.texgen ? CAIRO_GL_VAR_TEXGEN : CAIRO_GL_VAR_TEXCOORDS; + } +} + +static void +cairo_gl_shader_emit_variable (cairo_output_stream_t *stream, + cairo_gl_var_type_t type, + cairo_gl_tex_t name) +{ + switch (type) { + default: + ASSERT_NOT_REACHED; + case CAIRO_GL_VAR_NONE: + break; + case CAIRO_GL_VAR_TEXCOORDS: + _cairo_output_stream_printf (stream, + "attribute vec4 MultiTexCoord%d;\n" + "varying vec2 %s_texcoords;\n", + name, + operand_names[name]); + break; + case CAIRO_GL_VAR_TEXGEN: + _cairo_output_stream_printf (stream, + "uniform mat3 %s_texgen;\n" + "varying vec2 %s_texcoords;\n", + operand_names[name], + operand_names[name]); + break; + } +} + +static void +cairo_gl_shader_emit_vertex (cairo_output_stream_t *stream, + cairo_gl_var_type_t type, + cairo_gl_tex_t name) +{ + switch (type) { + default: + ASSERT_NOT_REACHED; + case CAIRO_GL_VAR_NONE: + break; + case CAIRO_GL_VAR_TEXCOORDS: + _cairo_output_stream_printf (stream, + " %s_texcoords = MultiTexCoord%d.xy;\n", + operand_names[name], name); + break; + + case CAIRO_GL_VAR_TEXGEN: + _cairo_output_stream_printf (stream, + " %s_texcoords = (%s_texgen * Vertex.xyw).xy;\n", + operand_names[name], operand_names[name]); + break; + } +} + +static void +cairo_gl_shader_dcl_coverage (cairo_output_stream_t *stream) +{ + _cairo_output_stream_printf (stream, "varying float coverage;\n"); +} + +static void +cairo_gl_shader_def_coverage (cairo_output_stream_t *stream) +{ + _cairo_output_stream_printf (stream, " coverage = Color.a;\n"); +} + +static cairo_status_t +cairo_gl_shader_get_vertex_source (cairo_gl_var_type_t src, + cairo_gl_var_type_t mask, + cairo_bool_t use_coverage, + cairo_gl_var_type_t dest, + char **out) +{ + cairo_output_stream_t *stream = _cairo_memory_stream_create (); + unsigned char *source; + unsigned long length; + cairo_status_t status; + + cairo_gl_shader_emit_variable (stream, src, CAIRO_GL_TEX_SOURCE); + cairo_gl_shader_emit_variable (stream, mask, CAIRO_GL_TEX_MASK); + if (use_coverage) + cairo_gl_shader_dcl_coverage (stream); + + _cairo_output_stream_printf (stream, + "attribute vec4 Vertex;\n" + "attribute vec4 Color;\n" + "uniform mat4 ModelViewProjectionMatrix;\n" + "void main()\n" + "{\n" + " gl_Position = ModelViewProjectionMatrix * Vertex;\n"); + + cairo_gl_shader_emit_vertex (stream, src, CAIRO_GL_TEX_SOURCE); + cairo_gl_shader_emit_vertex (stream, mask, CAIRO_GL_TEX_MASK); + if (use_coverage) + cairo_gl_shader_def_coverage (stream); + + _cairo_output_stream_write (stream, + "}\n\0", 3); + + status = _cairo_memory_stream_destroy (stream, &source, &length); + if (unlikely (status)) + return status; + + *out = (char *) source; + return CAIRO_STATUS_SUCCESS; +} + +/* + * Returns whether an operand needs a special border fade fragment shader + * to simulate the GL_CLAMP_TO_BORDER wrapping method that is missing in GLES2. + */ +static cairo_bool_t +_cairo_gl_shader_needs_border_fade (cairo_gl_operand_t *operand) +{ + cairo_extend_t extend =_cairo_gl_operand_get_extend (operand); + + return extend == CAIRO_EXTEND_NONE && + (operand->type == CAIRO_GL_OPERAND_TEXTURE || + operand->type == CAIRO_GL_OPERAND_LINEAR_GRADIENT || + operand->type == CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE || + operand->type == CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0); +} + +static void +cairo_gl_shader_emit_color (cairo_output_stream_t *stream, + cairo_gl_context_t *ctx, + cairo_gl_operand_t *op, + cairo_gl_tex_t name) +{ + const char *namestr = operand_names[name]; + const char *rectstr = (ctx->tex_target == GL_TEXTURE_RECTANGLE ? "Rect" : ""); + + switch (op->type) { + case CAIRO_GL_OPERAND_COUNT: + default: + ASSERT_NOT_REACHED; + break; + case CAIRO_GL_OPERAND_NONE: + _cairo_output_stream_printf (stream, + "vec4 get_%s()\n" + "{\n" + " return vec4 (0, 0, 0, 1);\n" + "}\n", + namestr); + break; + case CAIRO_GL_OPERAND_CONSTANT: + _cairo_output_stream_printf (stream, + "uniform vec4 %s_constant;\n" + "vec4 get_%s()\n" + "{\n" + " return %s_constant;\n" + "}\n", + namestr, namestr, namestr); + break; + case CAIRO_GL_OPERAND_TEXTURE: + _cairo_output_stream_printf (stream, + "uniform sampler2D%s %s_sampler;\n" + "uniform vec2 %s_texdims;\n" + "varying vec2 %s_texcoords;\n" + "vec4 get_%s()\n" + "{\n", + rectstr, namestr, namestr, namestr, namestr); + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES && + _cairo_gl_shader_needs_border_fade (op)) + { + _cairo_output_stream_printf (stream, + " vec2 border_fade = %s_border_fade (%s_texcoords, %s_texdims);\n" + " vec4 texel = texture2D%s (%s_sampler, %s_texcoords);\n" + " return texel * border_fade.x * border_fade.y;\n" + "}\n", + namestr, namestr, namestr, rectstr, namestr, namestr); + } + else + { + _cairo_output_stream_printf (stream, + " return texture2D%s (%s_sampler, %s_wrap (%s_texcoords));\n" + "}\n", + rectstr, namestr, namestr, namestr); + } + break; + case CAIRO_GL_OPERAND_LINEAR_GRADIENT: + _cairo_output_stream_printf (stream, + "varying vec2 %s_texcoords;\n" + "uniform vec2 %s_texdims;\n" + "uniform sampler2D%s %s_sampler;\n" + "\n" + "vec4 get_%s()\n" + "{\n", + namestr, namestr, rectstr, namestr, namestr); + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES && + _cairo_gl_shader_needs_border_fade (op)) + { + _cairo_output_stream_printf (stream, + " float border_fade = %s_border_fade (%s_texcoords.x, %s_texdims.x);\n" + " vec4 texel = texture2D%s (%s_sampler, vec2 (%s_texcoords.x, 0.5));\n" + " return texel * border_fade;\n" + "}\n", + namestr, namestr, namestr, rectstr, namestr, namestr); + } + else + { + _cairo_output_stream_printf (stream, + " return texture2D%s (%s_sampler, %s_wrap (vec2 (%s_texcoords.x, 0.5)));\n" + "}\n", + rectstr, namestr, namestr, namestr); + } + break; + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0: + _cairo_output_stream_printf (stream, + "varying vec2 %s_texcoords;\n" + "uniform vec2 %s_texdims;\n" + "uniform sampler2D%s %s_sampler;\n" + "uniform vec3 %s_circle_d;\n" + "uniform float %s_radius_0;\n" + "\n" + "vec4 get_%s()\n" + "{\n" + " vec3 pos = vec3 (%s_texcoords, %s_radius_0);\n" + " \n" + " float B = dot (pos, %s_circle_d);\n" + " float C = dot (pos, vec3 (pos.xy, -pos.z));\n" + " \n" + " float t = 0.5 * C / B;\n" + " float is_valid = step (-%s_radius_0, t * %s_circle_d.z);\n", + namestr, namestr, rectstr, namestr, namestr, namestr, namestr, + namestr, namestr, namestr, namestr, namestr); + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES && + _cairo_gl_shader_needs_border_fade (op)) + { + _cairo_output_stream_printf (stream, + " float border_fade = %s_border_fade (t, %s_texdims.x);\n" + " vec4 texel = texture2D%s (%s_sampler, vec2 (t, 0.5));\n" + " return mix (vec4 (0.0), texel * border_fade, is_valid);\n" + "}\n", + namestr, namestr, rectstr, namestr); + } + else + { + _cairo_output_stream_printf (stream, + " vec4 texel = texture2D%s (%s_sampler, %s_wrap (vec2 (t, 0.5)));\n" + " return mix (vec4 (0.0), texel, is_valid);\n" + "}\n", + rectstr, namestr, namestr); + } + break; + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE: + _cairo_output_stream_printf (stream, + "varying vec2 %s_texcoords;\n" + "uniform vec2 %s_texdims;\n" + "uniform sampler2D%s %s_sampler;\n" + "uniform vec3 %s_circle_d;\n" + "uniform float %s_a;\n" + "uniform float %s_radius_0;\n" + "\n" + "vec4 get_%s()\n" + "{\n" + " vec3 pos = vec3 (%s_texcoords, %s_radius_0);\n" + " \n" + " float B = dot (pos, %s_circle_d);\n" + " float C = dot (pos, vec3 (pos.xy, -pos.z));\n" + " \n" + " float det = dot (vec2 (B, %s_a), vec2 (B, -C));\n" + " float sqrtdet = sqrt (abs (det));\n" + " vec2 t = (B + vec2 (sqrtdet, -sqrtdet)) / %s_a;\n" + " \n" + " vec2 is_valid = step (vec2 (0.0), t) * step (t, vec2(1.0));\n" + " float has_color = step (0., det) * max (is_valid.x, is_valid.y);\n" + " \n" + " float upper_t = mix (t.y, t.x, is_valid.x);\n", + namestr, namestr, rectstr, namestr, namestr, namestr, namestr, + namestr, namestr, namestr, namestr, namestr, namestr); + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES && + _cairo_gl_shader_needs_border_fade (op)) + { + _cairo_output_stream_printf (stream, + " float border_fade = %s_border_fade (upper_t, %s_texdims.x);\n" + " vec4 texel = texture2D%s (%s_sampler, vec2 (upper_t, 0.5));\n" + " return mix (vec4 (0.0), texel * border_fade, has_color);\n" + "}\n", + namestr, namestr, rectstr, namestr); + } + else + { + _cairo_output_stream_printf (stream, + " vec4 texel = texture2D%s (%s_sampler, %s_wrap (vec2(upper_t, 0.5)));\n" + " return mix (vec4 (0.0), texel, has_color);\n" + "}\n", + rectstr, namestr, namestr); + } + break; + case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT: + _cairo_output_stream_printf (stream, + "varying vec2 %s_texcoords;\n" + "uniform sampler2D%s %s_sampler;\n" + "uniform vec3 %s_circle_d;\n" + "uniform float %s_a;\n" + "uniform float %s_radius_0;\n" + "\n" + "vec4 get_%s()\n" + "{\n" + " vec3 pos = vec3 (%s_texcoords, %s_radius_0);\n" + " \n" + " float B = dot (pos, %s_circle_d);\n" + " float C = dot (pos, vec3 (pos.xy, -pos.z));\n" + " \n" + " float det = dot (vec2 (B, %s_a), vec2 (B, -C));\n" + " float sqrtdet = sqrt (abs (det));\n" + " vec2 t = (B + vec2 (sqrtdet, -sqrtdet)) / %s_a;\n" + " \n" + " vec2 is_valid = step (vec2 (-%s_radius_0), t * %s_circle_d.z);\n" + " float has_color = step (0., det) * max (is_valid.x, is_valid.y);\n" + " \n" + " float upper_t = mix (t.y, t.x, is_valid.x);\n" + " vec4 texel = texture2D%s (%s_sampler, %s_wrap (vec2(upper_t, 0.5)));\n" + " return mix (vec4 (0.0), texel, has_color);\n" + "}\n", + namestr, rectstr, namestr, namestr, namestr, namestr, + namestr, namestr, namestr, namestr, namestr, + namestr, namestr, namestr, rectstr, namestr, namestr); + break; + } +} + +/* + * Emits the border fade functions used by an operand. + * + * If bilinear filtering is used, the emitted function performs a linear + * fade to transparency effect in the intervals [-1/2n, 1/2n] and + * [1 - 1/2n, 1 + 1/2n] (n: texture size). + * + * If nearest filtering is used, the emitted function just returns + * 0.0 for all values outside [0, 1). + */ +static void +_cairo_gl_shader_emit_border_fade (cairo_output_stream_t *stream, + cairo_gl_operand_t *operand, + cairo_gl_tex_t name) +{ + const char *namestr = operand_names[name]; + GLint gl_filter = _cairo_gl_operand_get_gl_filter (operand); + + /* 2D version */ + _cairo_output_stream_printf (stream, + "vec2 %s_border_fade (vec2 coords, vec2 dims)\n" + "{\n", + namestr); + + if (gl_filter == GL_LINEAR) + _cairo_output_stream_printf (stream, + " return clamp(-abs(dims * (coords - 0.5)) + (dims + vec2(1.0)) * 0.5, 0.0, 1.0);\n"); + else + _cairo_output_stream_printf (stream, + " bvec2 in_tex1 = greaterThanEqual (coords, vec2 (0.0));\n" + " bvec2 in_tex2 = lessThan (coords, vec2 (1.0));\n" + " return vec2 (float (all (in_tex1) && all (in_tex2)));\n"); + + _cairo_output_stream_printf (stream, "}\n"); + + /* 1D version */ + _cairo_output_stream_printf (stream, + "float %s_border_fade (float x, float dim)\n" + "{\n", + namestr); + if (gl_filter == GL_LINEAR) + _cairo_output_stream_printf (stream, + " return clamp(-abs(dim * (x - 0.5)) + (dim + 1.0) * 0.5, 0.0, 1.0);\n"); + else + _cairo_output_stream_printf (stream, + " bool in_tex = x >= 0.0 && x < 1.0;\n" + " return float (in_tex);\n"); + + _cairo_output_stream_printf (stream, "}\n"); +} + +/* + * Emits the wrap function used by an operand. + * + * In OpenGL ES 2.0, repeat wrap modes (GL_REPEAT and GL_MIRRORED REPEAT) are + * only available for NPOT textures if the GL_OES_texture_npot is supported. + * If GL_OES_texture_npot is not supported, we need to implement the wrapping + * functionality in the shader. + */ +static void +_cairo_gl_shader_emit_wrap (cairo_gl_context_t *ctx, + cairo_output_stream_t *stream, + cairo_gl_operand_t *operand, + cairo_gl_tex_t name) +{ + const char *namestr = operand_names[name]; + cairo_extend_t extend = _cairo_gl_operand_get_extend (operand); + + _cairo_output_stream_printf (stream, + "vec2 %s_wrap(vec2 coords)\n" + "{\n", + namestr); + + if (! ctx->has_npot_repeat && + (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT)) + { + if (extend == CAIRO_EXTEND_REPEAT) { + _cairo_output_stream_printf (stream, + " return fract(coords);\n"); + } else { /* CAIRO_EXTEND_REFLECT */ + _cairo_output_stream_printf (stream, + " return mix(fract(coords), 1.0 - fract(coords), floor(mod(coords, 2.0)));\n"); + } + } + else + { + _cairo_output_stream_printf (stream, " return coords;\n"); + } + + _cairo_output_stream_printf (stream, "}\n"); +} + +static cairo_status_t +cairo_gl_shader_get_fragment_source (cairo_gl_context_t *ctx, + cairo_gl_shader_in_t in, + cairo_gl_operand_t *src, + cairo_gl_operand_t *mask, + cairo_bool_t use_coverage, + cairo_gl_operand_type_t dest_type, + char **out) +{ + cairo_output_stream_t *stream = _cairo_memory_stream_create (); + unsigned char *source; + unsigned long length; + cairo_status_t status; + const char *coverage_str; + + _cairo_output_stream_printf (stream, + "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n"); + + _cairo_gl_shader_emit_wrap (ctx, stream, src, CAIRO_GL_TEX_SOURCE); + _cairo_gl_shader_emit_wrap (ctx, stream, mask, CAIRO_GL_TEX_MASK); + + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES) { + if (_cairo_gl_shader_needs_border_fade (src)) + _cairo_gl_shader_emit_border_fade (stream, src, CAIRO_GL_TEX_SOURCE); + if (_cairo_gl_shader_needs_border_fade (mask)) + _cairo_gl_shader_emit_border_fade (stream, mask, CAIRO_GL_TEX_MASK); + } + + cairo_gl_shader_emit_color (stream, ctx, src, CAIRO_GL_TEX_SOURCE); + cairo_gl_shader_emit_color (stream, ctx, mask, CAIRO_GL_TEX_MASK); + + coverage_str = ""; + if (use_coverage) { + _cairo_output_stream_printf (stream, "varying float coverage;\n"); + coverage_str = " * coverage"; + } + + _cairo_output_stream_printf (stream, + "void main()\n" + "{\n"); + switch (in) { + case CAIRO_GL_SHADER_IN_COUNT: + default: + ASSERT_NOT_REACHED; + case CAIRO_GL_SHADER_IN_NORMAL: + _cairo_output_stream_printf (stream, + " gl_FragColor = get_source() * get_mask().a%s;\n", + coverage_str); + break; + case CAIRO_GL_SHADER_IN_CA_SOURCE: + _cairo_output_stream_printf (stream, + " gl_FragColor = get_source() * get_mask()%s;\n", + coverage_str); + break; + case CAIRO_GL_SHADER_IN_CA_SOURCE_ALPHA: + _cairo_output_stream_printf (stream, + " gl_FragColor = get_source().a * get_mask()%s;\n", + coverage_str); + break; + } + + _cairo_output_stream_write (stream, + "}\n\0", 3); + + status = _cairo_memory_stream_destroy (stream, &source, &length); + if (unlikely (status)) + return status; + + *out = (char *) source; + return CAIRO_STATUS_SUCCESS; +} + +static void +compile_shader (cairo_gl_context_t *ctx, + GLuint *shader, + GLenum type, + const char *source) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + GLint success, log_size, num_chars; + char *log; + + *shader = dispatch->CreateShader (type); + dispatch->ShaderSource (*shader, 1, &source, 0); + dispatch->CompileShader (*shader); + dispatch->GetShaderiv (*shader, GL_COMPILE_STATUS, &success); + + if (success) + return; + + dispatch->GetShaderiv (*shader, GL_INFO_LOG_LENGTH, &log_size); + if (log_size < 0) { + printf ("OpenGL shader compilation failed.\n"); + ASSERT_NOT_REACHED; + return; + } + + log = _cairo_malloc (log_size + 1); + dispatch->GetShaderInfoLog (*shader, log_size, &num_chars, log); + log[num_chars] = '\0'; + + printf ("OpenGL shader compilation failed. Shader:\n%s\n", source); + printf ("OpenGL compilation log:\n%s\n", log); + + free (log); + ASSERT_NOT_REACHED; +} + +static void +link_shader_program (cairo_gl_context_t *ctx, + GLuint *program, + GLuint vert, + GLuint frag) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + GLint success, log_size, num_chars; + char *log; + + *program = dispatch->CreateProgram (); + dispatch->AttachShader (*program, vert); + dispatch->AttachShader (*program, frag); + + dispatch->BindAttribLocation (*program, CAIRO_GL_VERTEX_ATTRIB_INDEX, + "Vertex"); + dispatch->BindAttribLocation (*program, CAIRO_GL_COLOR_ATTRIB_INDEX, + "Color"); + dispatch->BindAttribLocation (*program, CAIRO_GL_TEXCOORD0_ATTRIB_INDEX, + "MultiTexCoord0"); + dispatch->BindAttribLocation (*program, CAIRO_GL_TEXCOORD1_ATTRIB_INDEX, + "MultiTexCoord1"); + + dispatch->LinkProgram (*program); + dispatch->GetProgramiv (*program, GL_LINK_STATUS, &success); + if (success) + return; + + dispatch->GetProgramiv (*program, GL_INFO_LOG_LENGTH, &log_size); + if (log_size < 0) { + printf ("OpenGL shader link failed.\n"); + ASSERT_NOT_REACHED; + return; + } + + log = _cairo_malloc (log_size + 1); + dispatch->GetProgramInfoLog (*program, log_size, &num_chars, log); + log[num_chars] = '\0'; + + printf ("OpenGL shader link failed:\n%s\n", log); + free (log); + ASSERT_NOT_REACHED; +} + +static GLint +_cairo_gl_get_op_uniform_location(cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader, + cairo_gl_tex_t tex_unit, + const char *suffix) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + char uniform_name[100]; + const char *unit_name[2] = { "source", "mask" }; + + snprintf (uniform_name, sizeof (uniform_name), "%s_%s", + unit_name[tex_unit], suffix); + + return dispatch->GetUniformLocation (shader->program, uniform_name); +} + +static cairo_status_t +_cairo_gl_shader_compile_and_link (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader, + cairo_gl_var_type_t src, + cairo_gl_var_type_t mask, + cairo_bool_t use_coverage, + const char *fragment_text) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + unsigned int vertex_shader; + cairo_status_t status; + int i; + + assert (shader->program == 0); + + vertex_shader = cairo_gl_var_type_hash (src, mask, use_coverage, + CAIRO_GL_VAR_NONE); + if (ctx->vertex_shaders[vertex_shader] == 0) { + char *source; + + status = cairo_gl_shader_get_vertex_source (src, + mask, + use_coverage, + CAIRO_GL_VAR_NONE, + &source); + if (unlikely (status)) + goto FAILURE; + + compile_shader (ctx, &ctx->vertex_shaders[vertex_shader], + GL_VERTEX_SHADER, source); + free (source); + } + + compile_shader (ctx, &shader->fragment_shader, + GL_FRAGMENT_SHADER, fragment_text); + + link_shader_program (ctx, &shader->program, + ctx->vertex_shaders[vertex_shader], + shader->fragment_shader); + + shader->mvp_location = + dispatch->GetUniformLocation (shader->program, + "ModelViewProjectionMatrix"); + + for (i = 0; i < 2; i++) { + shader->constant_location[i] = + _cairo_gl_get_op_uniform_location (ctx, shader, i, "constant"); + shader->a_location[i] = + _cairo_gl_get_op_uniform_location (ctx, shader, i, "a"); + shader->circle_d_location[i] = + _cairo_gl_get_op_uniform_location (ctx, shader, i, "circle_d"); + shader->radius_0_location[i] = + _cairo_gl_get_op_uniform_location (ctx, shader, i, "radius_0"); + shader->texdims_location[i] = + _cairo_gl_get_op_uniform_location (ctx, shader, i, "texdims"); + shader->texgen_location[i] = + _cairo_gl_get_op_uniform_location (ctx, shader, i, "texgen"); + } + + return CAIRO_STATUS_SUCCESS; + + FAILURE: + _cairo_gl_shader_fini (ctx, shader); + shader->fragment_shader = 0; + shader->program = 0; + + return status; +} + +/* We always bind the source to texture unit 0 if present, and mask to + * texture unit 1 if present, so we can just initialize these once at + * compile time. + */ +static void +_cairo_gl_shader_set_samplers (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + GLint location; + GLint saved_program; + + /* We have to save/restore the current program because we might be + * asked for a different program while a shader is bound. This shouldn't + * be a performance issue, since this is only called once per compile. + */ + glGetIntegerv (GL_CURRENT_PROGRAM, &saved_program); + dispatch->UseProgram (shader->program); + + location = dispatch->GetUniformLocation (shader->program, "source_sampler"); + if (location != -1) { + dispatch->Uniform1i (location, CAIRO_GL_TEX_SOURCE); + } + + location = dispatch->GetUniformLocation (shader->program, "mask_sampler"); + if (location != -1) { + dispatch->Uniform1i (location, CAIRO_GL_TEX_MASK); + } + + dispatch->UseProgram (saved_program); +} + +void +_cairo_gl_shader_bind_float (cairo_gl_context_t *ctx, + GLint location, + float value) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + assert (location != -1); + dispatch->Uniform1f (location, value); +} + +void +_cairo_gl_shader_bind_vec2 (cairo_gl_context_t *ctx, + GLint location, + float value0, + float value1) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + assert (location != -1); + dispatch->Uniform2f (location, value0, value1); +} + +void +_cairo_gl_shader_bind_vec3 (cairo_gl_context_t *ctx, + GLint location, + float value0, + float value1, + float value2) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + assert (location != -1); + dispatch->Uniform3f (location, value0, value1, value2); +} + +void +_cairo_gl_shader_bind_vec4 (cairo_gl_context_t *ctx, + GLint location, + float value0, float value1, + float value2, float value3) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + assert (location != -1); + dispatch->Uniform4f (location, value0, value1, value2, value3); +} + +void +_cairo_gl_shader_bind_matrix (cairo_gl_context_t *ctx, + GLint location, + const cairo_matrix_t* m) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + float gl_m[9] = { + m->xx, m->xy, m->x0, + m->yx, m->yy, m->y0, + 0, 0, 1 + }; + assert (location != -1); + dispatch->UniformMatrix3fv (location, 1, GL_TRUE, gl_m); +} + +void +_cairo_gl_shader_bind_matrix4f (cairo_gl_context_t *ctx, + GLint location, GLfloat* gl_m) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + assert (location != -1); + dispatch->UniformMatrix4fv (location, 1, GL_FALSE, gl_m); +} + +void +_cairo_gl_set_shader (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader) +{ + if (ctx->current_shader == shader) + return; + + if (shader) + ctx->dispatch.UseProgram (shader->program); + else + ctx->dispatch.UseProgram (0); + + ctx->current_shader = shader; +} + +cairo_status_t +_cairo_gl_get_shader_by_type (cairo_gl_context_t *ctx, + cairo_gl_operand_t *source, + cairo_gl_operand_t *mask, + cairo_bool_t use_coverage, + cairo_gl_shader_in_t in, + cairo_gl_shader_t **shader) +{ + cairo_shader_cache_entry_t lookup, *entry; + char *fs_source; + cairo_status_t status; + + lookup.ctx = ctx; + + lookup.vertex = cairo_gl_var_type_hash (cairo_gl_operand_get_var_type (source), + cairo_gl_operand_get_var_type (mask), + use_coverage, + CAIRO_GL_VAR_NONE); + + lookup.src = source->type; + lookup.mask = mask->type; + lookup.dest = CAIRO_GL_OPERAND_NONE; + lookup.use_coverage = use_coverage; + lookup.in = in; + lookup.src_gl_filter = _cairo_gl_operand_get_gl_filter (source); + lookup.src_border_fade = _cairo_gl_shader_needs_border_fade (source); + lookup.src_extend = _cairo_gl_operand_get_extend (source); + lookup.mask_gl_filter = _cairo_gl_operand_get_gl_filter (mask); + lookup.mask_border_fade = _cairo_gl_shader_needs_border_fade (mask); + lookup.mask_extend = _cairo_gl_operand_get_extend (mask); + lookup.base.hash = _cairo_gl_shader_cache_hash (&lookup); + lookup.base.size = 1; + + entry = _cairo_cache_lookup (&ctx->shaders, &lookup.base); + if (entry) { + assert (entry->shader.program); + *shader = &entry->shader; + return CAIRO_STATUS_SUCCESS; + } + + status = cairo_gl_shader_get_fragment_source (ctx, + in, + source, + mask, + use_coverage, + CAIRO_GL_OPERAND_NONE, + &fs_source); + if (unlikely (status)) + return status; + + entry = malloc (sizeof (cairo_shader_cache_entry_t)); + if (unlikely (entry == NULL)) { + free (fs_source); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + memcpy (entry, &lookup, sizeof (cairo_shader_cache_entry_t)); + + entry->ctx = ctx; + _cairo_gl_shader_init (&entry->shader); + status = _cairo_gl_shader_compile_and_link (ctx, + &entry->shader, + cairo_gl_operand_get_var_type (source), + cairo_gl_operand_get_var_type (mask), + use_coverage, + fs_source); + free (fs_source); + + if (unlikely (status)) { + free (entry); + return status; + } + + _cairo_gl_shader_set_samplers (ctx, &entry->shader); + + status = _cairo_cache_insert (&ctx->shaders, &entry->base); + if (unlikely (status)) { + _cairo_gl_shader_fini (ctx, &entry->shader); + free (entry); + return status; + } + + *shader = &entry->shader; + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/cairo-gl-source.c b/src/cairo-gl-source.c new file mode 100644 index 000000000..12235295f --- /dev/null +++ b/src/cairo-gl-source.c @@ -0,0 +1,111 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-surface-backend-private.h" + +static cairo_status_t +_cairo_gl_source_finish (void *abstract_surface) +{ + cairo_gl_source_t *source = abstract_surface; + + _cairo_gl_operand_destroy (&source->operand); + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t cairo_gl_source_backend = { + CAIRO_SURFACE_TYPE_GL, + _cairo_gl_source_finish, + NULL, /* read-only wrapper */ +}; + +cairo_surface_t * +_cairo_gl_pattern_to_source (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_gl_source_t *source; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (pattern == NULL) + return _cairo_gl_white_source (); + + source = malloc (sizeof (*source)); + if (unlikely (source == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&source->base, + &cairo_gl_source_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + *src_x = *src_y = 0; + status = _cairo_gl_operand_init (&source->operand, pattern, + (cairo_gl_surface_t *)dst, + sample, extents, + FALSE); + if (unlikely (status)) { + cairo_surface_destroy (&source->base); + return _cairo_surface_create_in_error (status); + } + + return &source->base; +} + +cairo_surface_t * +_cairo_gl_white_source (void) +{ + cairo_gl_source_t *source; + + source = malloc (sizeof (*source)); + if (unlikely (source == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&source->base, + &cairo_gl_source_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + _cairo_gl_solid_operand_init (&source->operand, CAIRO_COLOR_WHITE); + + return &source->base; +} diff --git a/src/cairo-gl-spans-compositor.c b/src/cairo-gl-spans-compositor.c new file mode 100644 index 000000000..4317ccd07 --- /dev/null +++ b/src/cairo-gl-spans-compositor.c @@ -0,0 +1,553 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-spans-compositor-private.h" +#include "cairo-surface-backend-private.h" + +typedef struct _cairo_gl_span_renderer { + cairo_span_renderer_t base; + + cairo_gl_composite_t setup; + double opacity; + + cairo_gl_emit_span_t emit; + + int xmin, xmax; + int ymin, ymax; + + cairo_gl_context_t *ctx; +} cairo_gl_span_renderer_t; + +static cairo_status_t +_cairo_gl_bounded_opaque_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_gl_span_renderer_t *r = abstract_renderer; + cairo_gl_emit_span_t emit = r->emit; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (spans[0].coverage) { + emit (r->ctx, + spans[0].x, y, + spans[1].x, y + height, + spans[0].coverage); + } + + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_bounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_gl_span_renderer_t *r = abstract_renderer; + cairo_gl_emit_span_t emit = r->emit; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (spans[0].coverage) { + emit (r->ctx, + spans[0].x, y, + spans[1].x, y + height, + r->opacity * spans[0].coverage); + } + + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_unbounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_gl_span_renderer_t *r = abstract_renderer; + cairo_gl_emit_span_t emit = r->emit; + + if (y > r->ymin) { + emit (r->ctx, + r->xmin, r->ymin, + r->xmax, y, + 0); + } + + if (num_spans == 0) { + emit (r->ctx, + r->xmin, y, + r->xmax, y + height, + 0); + } else { + if (spans[0].x != r->xmin) { + emit (r->ctx, + r->xmin, y, + spans[0].x, y + height, + 0); + } + + do { + emit (r->ctx, + spans[0].x, y, + spans[1].x, y + height, + r->opacity * spans[0].coverage); + spans++; + } while (--num_spans > 1); + + if (spans[0].x != r->xmax) { + emit (r->ctx, + spans[0].x, y, + r->xmax, y + height, + 0); + } + } + + r->ymin = y + height; + return CAIRO_STATUS_SUCCESS; +} + +/* XXX */ +static cairo_status_t +_cairo_gl_clipped_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_gl_span_renderer_t *r = abstract_renderer; + cairo_gl_emit_span_t emit = r->emit; + + if (y > r->ymin) { + emit (r->ctx, + r->xmin, r->ymin, + r->xmax, y, + 0); + } + + if (num_spans == 0) { + emit (r->ctx, + r->xmin, y, + r->xmax, y + height, + 0); + } else { + if (spans[0].x != r->xmin) { + emit (r->ctx, + r->xmin, y, + spans[0].x, y + height, + 0); + } + + do { + emit (r->ctx, + spans[0].x, y, + spans[1].x, y + height, + r->opacity * spans[0].coverage); + spans++; + } while (--num_spans > 1); + + if (spans[0].x != r->xmax) { + emit (r->ctx, + spans[0].x, y, + r->xmax, y + height, + 0); + } + } + + r->ymin = y + height; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gl_finish_unbounded_spans (void *abstract_renderer) +{ + cairo_gl_span_renderer_t *r = abstract_renderer; + cairo_gl_emit_span_t emit = r->emit; + + if (r->ymax > r->ymin) { + emit (r->ctx, + r->xmin, r->ymin, + r->xmax, r->ymax, + 0); + } + + return _cairo_gl_context_release (r->ctx, CAIRO_STATUS_SUCCESS); +} + +static cairo_status_t +_cairo_gl_finish_bounded_spans (void *abstract_renderer) +{ + cairo_gl_span_renderer_t *r = abstract_renderer; + + return _cairo_gl_context_release (r->ctx, CAIRO_STATUS_SUCCESS); +} + +static void +emit_aligned_boxes (cairo_gl_context_t *ctx, + const cairo_boxes_t *boxes) +{ + const struct _cairo_boxes_chunk *chunk; + cairo_gl_emit_rect_t emit = _cairo_gl_context_choose_emit_rect (ctx); + int i; + + TRACE ((stderr, "%s: num_boxes=%d\n", __FUNCTION__, boxes->num_boxes)); + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + emit (ctx, x1, y1, x2, y2); + } + } +} + +static cairo_int_status_t +fill_boxes (void *_dst, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_solid_source (&setup, color); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + emit_aligned_boxes (ctx, boxes); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_int_status_t +draw_image_boxes (void *_dst, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy) +{ + cairo_gl_surface_t *dst = _dst; + struct _cairo_boxes_chunk *chunk; + int i; + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + int x = _cairo_fixed_integer_part (b->p1.x); + int y = _cairo_fixed_integer_part (b->p1.y); + int w = _cairo_fixed_integer_part (b->p2.x) - x; + int h = _cairo_fixed_integer_part (b->p2.y) - y; + cairo_status_t status; + + status = _cairo_gl_surface_draw_image (dst, image, + x + dx, y + dy, + w, h, + x, y, TRUE); + if (unlikely (status)) + return status; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t copy_boxes (void *_dst, + cairo_surface_t *_src, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents, + int dx, int dy) +{ + cairo_gl_surface_t *dst = _dst; + cairo_gl_surface_t *src = (cairo_gl_surface_t *)_src; + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (! _cairo_gl_surface_is_texture (src)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (src->base.device != dst->base.device) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_gl_composite_init (&setup, CAIRO_OPERATOR_SOURCE, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_source_operand (&setup, &src->operand); + _cairo_gl_operand_translate (&setup.src, -dx, -dy); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + emit_aligned_boxes (ctx, boxes); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_int_status_t +composite_boxes (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + cairo_gl_operand_t tmp_operand; + cairo_gl_operand_t *src_operand; + + TRACE ((stderr, "%s mask=(%d,%d), dst=(%d, %d)\n", __FUNCTION__, + mask_x, mask_y, dst_x, dst_y)); + + if (abstract_mask) { + if (op == CAIRO_OPERATOR_CLEAR) { + _cairo_gl_solid_operand_init (&tmp_operand, CAIRO_COLOR_WHITE); + src_operand = &tmp_operand; + op = CAIRO_OPERATOR_DEST_OUT; + } else if (op == CAIRO_OPERATOR_SOURCE) { + /* requires a LERP in the shader between dest and source */ + return CAIRO_INT_STATUS_UNSUPPORTED; + } else + src_operand = source_to_operand (abstract_src); + } else + src_operand = source_to_operand (abstract_src); + + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_source_operand (&setup, + src_operand); + _cairo_gl_operand_translate (&setup.src, -src_x, -src_y); + + _cairo_gl_composite_set_mask_operand (&setup, + source_to_operand (abstract_mask)); + _cairo_gl_operand_translate (&setup.mask, -mask_x, -mask_y); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + emit_aligned_boxes (ctx, boxes); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + if (src_operand == &tmp_operand) + _cairo_gl_operand_destroy (&tmp_operand); + return status; +} + +static cairo_int_status_t +_cairo_gl_span_renderer_init (cairo_abstract_span_renderer_t *_r, + const cairo_composite_rectangles_t *composite, + cairo_antialias_t antialias, + cairo_bool_t needs_clip) +{ + cairo_gl_span_renderer_t *r = (cairo_gl_span_renderer_t *)_r; + const cairo_pattern_t *source = &composite->source_pattern.base; + cairo_operator_t op = composite->op; + cairo_int_status_t status; + + if (op == CAIRO_OPERATOR_SOURCE) { + if (! _cairo_pattern_is_opaque (&composite->source_pattern.base, + &composite->source_sample_area)) + return CAIRO_INT_STATUS_UNSUPPORTED; + op = CAIRO_OPERATOR_OVER; + } + + /* XXX earlier! */ + if (op == CAIRO_OPERATOR_CLEAR) { + source = &_cairo_pattern_white.base; + op = CAIRO_OPERATOR_DEST_OUT; + } else if (composite->surface->is_clear && + (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_OVER || + op == CAIRO_OPERATOR_ADD)) { + op = CAIRO_OPERATOR_SOURCE; + } else if (op == CAIRO_OPERATOR_SOURCE) { + /* no lerp equivalent without some major PITA */ + return CAIRO_INT_STATUS_UNSUPPORTED; + } else if (! _cairo_gl_operator_is_supported (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_gl_composite_init (&r->setup, + op, (cairo_gl_surface_t *)composite->surface, + FALSE); + if (unlikely (status)) + goto FAIL; + + status = _cairo_gl_composite_set_source (&r->setup, source, + &composite->source_sample_area, + &composite->unbounded, + TRUE); + if (unlikely (status)) + goto FAIL; + + r->opacity = 1.0; + if (composite->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID) { + r->opacity = composite->mask_pattern.solid.color.alpha; + } else { + status = _cairo_gl_composite_set_mask (&r->setup, + &composite->mask_pattern.base, + &composite->mask_sample_area, + &composite->unbounded, + TRUE); + if (unlikely (status)) + goto FAIL; + } + + _cairo_gl_composite_set_spans (&r->setup); + + status = _cairo_gl_composite_begin (&r->setup, &r->ctx); + if (unlikely (status)) + goto FAIL; + + r->emit = _cairo_gl_context_choose_emit_span (r->ctx); + if (composite->is_bounded) { + if (r->opacity == 1.) + r->base.render_rows = _cairo_gl_bounded_opaque_spans; + else + r->base.render_rows = _cairo_gl_bounded_spans; + r->base.finish = _cairo_gl_finish_bounded_spans; + } else { + if (needs_clip) + r->base.render_rows = _cairo_gl_clipped_spans; + else + r->base.render_rows = _cairo_gl_unbounded_spans; + r->base.finish = _cairo_gl_finish_unbounded_spans; + r->xmin = composite->unbounded.x; + r->xmax = composite->unbounded.x + composite->unbounded.width; + r->ymin = composite->unbounded.y; + r->ymax = composite->unbounded.y + composite->unbounded.height; + } + + return CAIRO_STATUS_SUCCESS; + +FAIL: + return status; +} + +static void +_cairo_gl_span_renderer_fini (cairo_abstract_span_renderer_t *_r, + cairo_int_status_t status) +{ + cairo_gl_span_renderer_t *r = (cairo_gl_span_renderer_t *) _r; + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + return; + + if (status == CAIRO_INT_STATUS_SUCCESS) + r->base.finish (r); + + _cairo_gl_composite_fini (&r->setup); +} + +const cairo_compositor_t * +_cairo_gl_span_compositor_get (void) +{ + static cairo_spans_compositor_t spans; + static cairo_compositor_t shape; + + if (spans.base.delegate == NULL) { + /* The fallback to traps here is essentially just for glyphs... */ + _cairo_shape_mask_compositor_init (&shape, + _cairo_gl_traps_compositor_get()); + shape.glyphs = NULL; + + _cairo_spans_compositor_init (&spans, &shape); + spans.fill_boxes = fill_boxes; + spans.draw_image_boxes = draw_image_boxes; + spans.copy_boxes = copy_boxes; + //spans.check_composite_boxes = check_composite_boxes; + spans.pattern_to_surface = _cairo_gl_pattern_to_source; + spans.composite_boxes = composite_boxes; + //spans.check_span_renderer = check_span_renderer; + spans.renderer_init = _cairo_gl_span_renderer_init; + spans.renderer_fini = _cairo_gl_span_renderer_fini; + } + + return &spans.base; +} diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c new file mode 100644 index 000000000..cfccf4dfd --- /dev/null +++ b/src/cairo-gl-surface.c @@ -0,0 +1,1459 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-surface-backend-private.h" + +static const cairo_surface_backend_t _cairo_gl_surface_backend; + +static cairo_status_t +_cairo_gl_surface_flush (void *abstract_surface, unsigned flags); + +static cairo_bool_t _cairo_surface_is_gl (cairo_surface_t *surface) +{ + return surface->backend == &_cairo_gl_surface_backend; +} + +static cairo_bool_t +_cairo_gl_get_image_format_and_type_gles2 (pixman_format_code_t pixman_format, + GLenum *internal_format, GLenum *format, + GLenum *type, cairo_bool_t *has_alpha, + cairo_bool_t *needs_swap) +{ + cairo_bool_t is_little_endian = _cairo_is_little_endian (); + + *has_alpha = TRUE; + + switch ((int) pixman_format) { + case PIXMAN_a8r8g8b8: + *internal_format = GL_BGRA; + *format = GL_BGRA; + *type = GL_UNSIGNED_BYTE; + *needs_swap = !is_little_endian; + return TRUE; + + case PIXMAN_x8r8g8b8: + *internal_format = GL_BGRA; + *format = GL_BGRA; + *type = GL_UNSIGNED_BYTE; + *has_alpha = FALSE; + *needs_swap = !is_little_endian; + return TRUE; + + case PIXMAN_a8b8g8r8: + *internal_format = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_BYTE; + *needs_swap = !is_little_endian; + return TRUE; + + case PIXMAN_x8b8g8r8: + *internal_format = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_BYTE; + *has_alpha = FALSE; + *needs_swap = !is_little_endian; + return TRUE; + + case PIXMAN_b8g8r8a8: + *internal_format = GL_BGRA; + *format = GL_BGRA; + *type = GL_UNSIGNED_BYTE; + *needs_swap = is_little_endian; + return TRUE; + + case PIXMAN_b8g8r8x8: + *internal_format = GL_BGRA; + *format = GL_BGRA; + *type = GL_UNSIGNED_BYTE; + *has_alpha = FALSE; + *needs_swap = is_little_endian; + return TRUE; + + case PIXMAN_r8g8b8: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_BYTE; + *needs_swap = is_little_endian; + return TRUE; + + case PIXMAN_b8g8r8: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_BYTE; + *needs_swap = !is_little_endian; + return TRUE; + + case PIXMAN_r5g6b5: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_SHORT_5_6_5; + *needs_swap = FALSE; + return TRUE; + + case PIXMAN_b5g6r5: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_SHORT_5_6_5; + *needs_swap = TRUE; + return TRUE; + + case PIXMAN_a1b5g5r5: + *internal_format = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_SHORT_5_5_5_1; + *needs_swap = TRUE; + return TRUE; + + case PIXMAN_x1b5g5r5: + *internal_format = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_SHORT_5_5_5_1; + *has_alpha = FALSE; + *needs_swap = TRUE; + return TRUE; + + case PIXMAN_a8: + *internal_format = GL_ALPHA; + *format = GL_ALPHA; + *type = GL_UNSIGNED_BYTE; + *needs_swap = FALSE; + return TRUE; + + default: + return FALSE; + } +} + +static cairo_bool_t +_cairo_gl_get_image_format_and_type_gl (pixman_format_code_t pixman_format, + GLenum *internal_format, GLenum *format, + GLenum *type, cairo_bool_t *has_alpha, + cairo_bool_t *needs_swap) +{ + *has_alpha = TRUE; + *needs_swap = FALSE; + + switch (pixman_format) { + case PIXMAN_a8r8g8b8: + *internal_format = GL_RGBA; + *format = GL_BGRA; + *type = GL_UNSIGNED_INT_8_8_8_8_REV; + return TRUE; + case PIXMAN_x8r8g8b8: + *internal_format = GL_RGB; + *format = GL_BGRA; + *type = GL_UNSIGNED_INT_8_8_8_8_REV; + *has_alpha = FALSE; + return TRUE; + case PIXMAN_a8b8g8r8: + *internal_format = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_INT_8_8_8_8_REV; + return TRUE; + case PIXMAN_x8b8g8r8: + *internal_format = GL_RGB; + *format = GL_RGBA; + *type = GL_UNSIGNED_INT_8_8_8_8_REV; + *has_alpha = FALSE; + return TRUE; + case PIXMAN_b8g8r8a8: + *internal_format = GL_RGBA; + *format = GL_BGRA; + *type = GL_UNSIGNED_INT_8_8_8_8; + return TRUE; + case PIXMAN_b8g8r8x8: + *internal_format = GL_RGB; + *format = GL_BGRA; + *type = GL_UNSIGNED_INT_8_8_8_8; + *has_alpha = FALSE; + return TRUE; + case PIXMAN_r8g8b8: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_BYTE; + return TRUE; + case PIXMAN_b8g8r8: + *internal_format = GL_RGB; + *format = GL_BGR; + *type = GL_UNSIGNED_BYTE; + return TRUE; + case PIXMAN_r5g6b5: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_SHORT_5_6_5; + return TRUE; + case PIXMAN_b5g6r5: + *internal_format = GL_RGB; + *format = GL_RGB; + *type = GL_UNSIGNED_SHORT_5_6_5_REV; + return TRUE; + case PIXMAN_a1r5g5b5: + *internal_format = GL_RGBA; + *format = GL_BGRA; + *type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + return TRUE; + case PIXMAN_x1r5g5b5: + *internal_format = GL_RGB; + *format = GL_BGRA; + *type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + *has_alpha = FALSE; + return TRUE; + case PIXMAN_a1b5g5r5: + *internal_format = GL_RGBA; + *format = GL_RGBA; + *type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + return TRUE; + case PIXMAN_x1b5g5r5: + *internal_format = GL_RGB; + *format = GL_RGBA; + *type = GL_UNSIGNED_SHORT_1_5_5_5_REV; + *has_alpha = FALSE; + return TRUE; + case PIXMAN_a8: + *internal_format = GL_ALPHA; + *format = GL_ALPHA; + *type = GL_UNSIGNED_BYTE; + return TRUE; + +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,27,2) + case PIXMAN_a8r8g8b8_sRGB: +#endif + case PIXMAN_a2b10g10r10: + case PIXMAN_x2b10g10r10: + case PIXMAN_a4r4g4b4: + case PIXMAN_x4r4g4b4: + case PIXMAN_a4b4g4r4: + case PIXMAN_x4b4g4r4: + case PIXMAN_r3g3b2: + case PIXMAN_b2g3r3: + case PIXMAN_a2r2g2b2: + case PIXMAN_a2b2g2r2: + case PIXMAN_c8: + case PIXMAN_x4a4: + /* case PIXMAN_x4c4: */ + case PIXMAN_x4g4: + case PIXMAN_a4: + case PIXMAN_r1g2b1: + case PIXMAN_b1g2r1: + case PIXMAN_a1r1g1b1: + case PIXMAN_a1b1g1r1: + case PIXMAN_c4: + case PIXMAN_g4: + case PIXMAN_a1: + case PIXMAN_g1: + case PIXMAN_yuy2: + case PIXMAN_yv12: + case PIXMAN_x2r10g10b10: + case PIXMAN_a2r10g10b10: + case PIXMAN_r8g8b8x8: + case PIXMAN_r8g8b8a8: + case PIXMAN_x14r6g6b6: + default: + return FALSE; + } +} + +/* + * Extracts pixel data from an image surface. + */ +static cairo_status_t +_cairo_gl_surface_extract_image_data (cairo_image_surface_t *image, + int x, int y, + int width, int height, + void **output) +{ + int cpp = PIXMAN_FORMAT_BPP (image->pixman_format) / 8; + char *data = _cairo_malloc_ab (width * height, cpp); + char *dst = data; + unsigned char *src = image->data + y * image->stride + x * cpp; + int i; + + if (unlikely (data == NULL)) + return CAIRO_STATUS_NO_MEMORY; + + for (i = 0; i < height; i++) { + memcpy (dst, src, width * cpp); + src += image->stride; + dst += width * cpp; + } + + *output = data; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +_cairo_gl_get_image_format_and_type (cairo_gl_flavor_t flavor, + pixman_format_code_t pixman_format, + GLenum *internal_format, GLenum *format, + GLenum *type, cairo_bool_t *has_alpha, + cairo_bool_t *needs_swap) +{ + if (flavor == CAIRO_GL_FLAVOR_DESKTOP) + return _cairo_gl_get_image_format_and_type_gl (pixman_format, + internal_format, format, + type, has_alpha, + needs_swap); + else + return _cairo_gl_get_image_format_and_type_gles2 (pixman_format, + internal_format, format, + type, has_alpha, + needs_swap); + +} + +cairo_bool_t +_cairo_gl_operator_is_supported (cairo_operator_t op) +{ + return op < CAIRO_OPERATOR_SATURATE; +} + +static void +_cairo_gl_surface_embedded_operand_init (cairo_gl_surface_t *surface) +{ + cairo_gl_operand_t *operand = &surface->operand; + cairo_surface_attributes_t *attributes = &operand->texture.attributes; + + memset (operand, 0, sizeof (cairo_gl_operand_t)); + + operand->type = CAIRO_GL_OPERAND_TEXTURE; + operand->texture.surface = surface; + operand->texture.tex = surface->tex; + + if (_cairo_gl_device_requires_power_of_two_textures (surface->base.device)) { + cairo_matrix_init_identity (&attributes->matrix); + } else { + cairo_matrix_init_scale (&attributes->matrix, + 1.0 / surface->width, + 1.0 / surface->height); + } + + attributes->extend = CAIRO_EXTEND_NONE; + attributes->filter = CAIRO_FILTER_NEAREST; +} + +void +_cairo_gl_surface_init (cairo_device_t *device, + cairo_gl_surface_t *surface, + cairo_content_t content, + int width, int height) +{ + assert (width > 0 && height > 0); + + _cairo_surface_init (&surface->base, + &_cairo_gl_surface_backend, + device, + content); + + surface->width = width; + surface->height = height; + surface->needs_update = FALSE; + + _cairo_gl_surface_embedded_operand_init (surface); +} + +static cairo_bool_t +_cairo_gl_surface_size_valid_for_context (cairo_gl_context_t *ctx, + int width, int height) +{ + return width > 0 && height > 0 && + width <= ctx->max_framebuffer_size && + height <= ctx->max_framebuffer_size; +} + +static cairo_bool_t +_cairo_gl_surface_size_valid (cairo_gl_surface_t *surface, + int width, int height) +{ + cairo_gl_context_t *ctx = (cairo_gl_context_t *)surface->base.device; + return _cairo_gl_surface_size_valid_for_context (ctx, width, height); +} + +static cairo_surface_t * +_cairo_gl_surface_create_scratch_for_texture (cairo_gl_context_t *ctx, + cairo_content_t content, + GLuint tex, + int width, + int height) +{ + cairo_gl_surface_t *surface; + + surface = calloc (1, sizeof (cairo_gl_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface->tex = tex; + _cairo_gl_surface_init (&ctx->base, surface, content, width, height); + + surface->supports_msaa = ctx->supports_msaa; + surface->supports_stencil = TRUE; + + /* Create the texture used to store the surface's data. */ + _cairo_gl_context_activate (ctx, CAIRO_GL_TEX_TEMP); + glBindTexture (ctx->tex_target, surface->tex); + glTexParameteri (ctx->tex_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri (ctx->tex_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + return &surface->base; +} + +static cairo_surface_t * +_create_scratch_internal (cairo_gl_context_t *ctx, + cairo_content_t content, + int width, + int height, + cairo_bool_t for_caching) +{ + cairo_gl_surface_t *surface; + GLenum format; + GLuint tex; + + glGenTextures (1, &tex); + surface = (cairo_gl_surface_t *) + _cairo_gl_surface_create_scratch_for_texture (ctx, content, + tex, width, height); + if (unlikely (surface->base.status)) + return &surface->base; + + surface->owns_tex = TRUE; + + /* adjust the texture size after setting our real extents */ + if (width < 1) + width = 1; + if (height < 1) + height = 1; + + switch (content) { + default: + ASSERT_NOT_REACHED; + case CAIRO_CONTENT_COLOR_ALPHA: + format = GL_RGBA; + break; + case CAIRO_CONTENT_ALPHA: + /* When using GL_ALPHA, compositing doesn't work properly, but for + * caching surfaces, we are just uploading pixel data, so it isn't + * an issue. */ + if (for_caching) + format = GL_ALPHA; + else + format = GL_RGBA; + break; + case CAIRO_CONTENT_COLOR: + /* GL_RGB is almost what we want here -- sampling 1 alpha when + * texturing, using 1 as destination alpha factor in blending, + * etc. However, when filtering with GL_CLAMP_TO_BORDER, the + * alpha channel of the border color will also be clamped to + * 1, when we actually want the border color we explicitly + * specified. So, we have to store RGBA, and fill the alpha + * channel with 1 when blending. + */ + format = GL_RGBA; + break; + } + + glTexImage2D (ctx->tex_target, 0, format, width, height, 0, + format, GL_UNSIGNED_BYTE, NULL); + + return &surface->base; +} + +cairo_surface_t * +_cairo_gl_surface_create_scratch (cairo_gl_context_t *ctx, + cairo_content_t content, + int width, + int height) +{ + return _create_scratch_internal (ctx, content, width, height, FALSE); +} + +cairo_surface_t * +_cairo_gl_surface_create_scratch_for_caching (cairo_gl_context_t *ctx, + cairo_content_t content, + int width, + int height) +{ + return _create_scratch_internal (ctx, content, width, height, TRUE); +} + +static cairo_status_t +_cairo_gl_surface_clear (cairo_gl_surface_t *surface, + const cairo_color_t *color) +{ + cairo_gl_context_t *ctx; + cairo_status_t status; + double r, g, b, a; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return status; + + _cairo_gl_context_set_destination (ctx, surface, surface->msaa_active); + if (surface->base.content & CAIRO_CONTENT_COLOR) { + r = color->red * color->alpha; + g = color->green * color->alpha; + b = color->blue * color->alpha; + } else { + r = g = b = 0; + } + if (surface->base.content & CAIRO_CONTENT_ALPHA) { + a = color->alpha; + } else { + a = 1.0; + } + + glDisable (GL_SCISSOR_TEST); + glClearColor (r, g, b, a); + glClear (GL_COLOR_BUFFER_BIT); + + if (a == 0) + surface->base.is_clear = TRUE; + + return _cairo_gl_context_release (ctx, status); +} + +static cairo_surface_t * +_cairo_gl_surface_create_and_clear_scratch (cairo_gl_context_t *ctx, + cairo_content_t content, + int width, + int height) +{ + cairo_gl_surface_t *surface; + cairo_int_status_t status; + + surface = (cairo_gl_surface_t *) + _cairo_gl_surface_create_scratch (ctx, content, width, height); + if (unlikely (surface->base.status)) + return &surface->base; + + /* Cairo surfaces start out initialized to transparent (black) */ + status = _cairo_gl_surface_clear (surface, CAIRO_COLOR_TRANSPARENT); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return _cairo_surface_create_in_error (status); + } + + return &surface->base; +} + +cairo_surface_t * +cairo_gl_surface_create (cairo_device_t *abstract_device, + cairo_content_t content, + int width, + int height) +{ + cairo_gl_context_t *ctx; + cairo_gl_surface_t *surface; + cairo_status_t status; + + if (! CAIRO_CONTENT_VALID (content)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); + + if (abstract_device == NULL) + return _cairo_image_surface_create_with_content (content, width, height); + + if (abstract_device->status) + return _cairo_surface_create_in_error (abstract_device->status); + + if (abstract_device->backend->type != CAIRO_DEVICE_TYPE_GL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + + status = _cairo_gl_context_acquire (abstract_device, &ctx); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (! _cairo_gl_surface_size_valid_for_context (ctx, width, height)) { + status = _cairo_gl_context_release (ctx, status); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + surface = (cairo_gl_surface_t *) + _cairo_gl_surface_create_and_clear_scratch (ctx, content, width, height); + if (unlikely (surface->base.status)) { + status = _cairo_gl_context_release (ctx, surface->base.status); + cairo_surface_destroy (&surface->base); + return _cairo_surface_create_in_error (status); + } + + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return _cairo_surface_create_in_error (status); + } + + return &surface->base; +} +slim_hidden_def (cairo_gl_surface_create); + +/** + * cairo_gl_surface_create_for_texture: + * @content: type of content in the surface + * @tex: name of texture to use for storage of surface pixels + * @width: width of the surface, in pixels + * @height: height of the surface, in pixels + * + * Creates a GL surface for the specified texture with the specified + * content and dimensions. The texture must be kept around until the + * #cairo_surface_t is destroyed or cairo_surface_finish() is called + * on the surface. The initial contents of @tex will be used as the + * initial image contents; you must explicitly clear the buffer, + * using, for example, cairo_rectangle() and cairo_fill() if you want + * it cleared. The format of @tex should be compatible with @content, + * in the sense that it must have the color components required by + * @content. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: TBD + **/ +cairo_surface_t * +cairo_gl_surface_create_for_texture (cairo_device_t *abstract_device, + cairo_content_t content, + unsigned int tex, + int width, + int height) +{ + cairo_gl_context_t *ctx; + cairo_gl_surface_t *surface; + cairo_status_t status; + + if (! CAIRO_CONTENT_VALID (content)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); + + if (abstract_device == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NULL_POINTER)); + + if (abstract_device->status) + return _cairo_surface_create_in_error (abstract_device->status); + + if (abstract_device->backend->type != CAIRO_DEVICE_TYPE_GL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH)); + + status = _cairo_gl_context_acquire (abstract_device, &ctx); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (! _cairo_gl_surface_size_valid_for_context (ctx, width, height)) { + status = _cairo_gl_context_release (ctx, status); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + surface = (cairo_gl_surface_t *) + _cairo_gl_surface_create_scratch_for_texture (ctx, content, + tex, width, height); + status = _cairo_gl_context_release (ctx, status); + + return &surface->base; +} +slim_hidden_def (cairo_gl_surface_create_for_texture); + + +void +cairo_gl_surface_set_size (cairo_surface_t *abstract_surface, + int width, + int height) +{ + cairo_gl_surface_t *surface = (cairo_gl_surface_t *) abstract_surface; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (! _cairo_surface_is_gl (abstract_surface) || + _cairo_gl_surface_is_texture (surface)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + if (surface->width != width || surface->height != height) { + surface->needs_update = TRUE; + surface->width = width; + surface->height = height; + } +} + +int +cairo_gl_surface_get_width (cairo_surface_t *abstract_surface) +{ + cairo_gl_surface_t *surface = (cairo_gl_surface_t *) abstract_surface; + + if (! _cairo_surface_is_gl (abstract_surface)) + return 0; + + return surface->width; +} + +int +cairo_gl_surface_get_height (cairo_surface_t *abstract_surface) +{ + cairo_gl_surface_t *surface = (cairo_gl_surface_t *) abstract_surface; + + if (! _cairo_surface_is_gl (abstract_surface)) + return 0; + + return surface->height; +} + +void +cairo_gl_surface_swapbuffers (cairo_surface_t *abstract_surface) +{ + cairo_gl_surface_t *surface = (cairo_gl_surface_t *) abstract_surface; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (! _cairo_surface_is_gl (abstract_surface)) { + _cairo_surface_set_error (abstract_surface, + CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return; + } + + if (! _cairo_gl_surface_is_texture (surface)) { + cairo_gl_context_t *ctx; + cairo_status_t status; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return; + + /* For swapping on EGL, at least, we need a valid context/target. */ + _cairo_gl_context_set_destination (ctx, surface, FALSE); + /* And in any case we should flush any pending operations. */ + _cairo_gl_composite_flush (ctx); + + ctx->swap_buffers (ctx, surface); + + status = _cairo_gl_context_release (ctx, status); + if (status) + status = _cairo_surface_set_error (abstract_surface, status); + } +} + +static cairo_surface_t * +_cairo_gl_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_surface_t *surface = abstract_surface; + cairo_gl_context_t *ctx; + cairo_status_t status; + + if (! _cairo_gl_surface_size_valid (abstract_surface, width, height)) + return _cairo_image_surface_create_with_content (content, width, height); + + status = _cairo_gl_context_acquire (surface->device, &ctx); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + surface = _cairo_gl_surface_create_and_clear_scratch (ctx, content, width, height); + + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) { + cairo_surface_destroy (surface); + return _cairo_surface_create_in_error (status); + } + + return surface; +} + +static cairo_int_status_t +_cairo_gl_surface_fill_alpha_channel (cairo_gl_surface_t *dst, + cairo_gl_context_t *ctx, + int x, int y, + int width, int height) +{ + cairo_gl_composite_t setup; + cairo_status_t status; + + _cairo_gl_composite_flush (ctx); + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); + + status = _cairo_gl_composite_init (&setup, CAIRO_OPERATOR_SOURCE, + dst, FALSE); + if (unlikely (status)) + goto CLEANUP; + + _cairo_gl_composite_set_solid_source (&setup, CAIRO_COLOR_BLACK); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto CLEANUP; + + _cairo_gl_context_emit_rect (ctx, x, y, x + width, y + height); + + status = _cairo_gl_context_release (ctx, status); + + CLEANUP: + _cairo_gl_composite_fini (&setup); + + _cairo_gl_composite_flush (ctx); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + return status; +} + +cairo_status_t +_cairo_gl_surface_draw_image (cairo_gl_surface_t *dst, + cairo_image_surface_t *src, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y, + cairo_bool_t force_flush) +{ + GLenum internal_format, format, type; + cairo_bool_t has_alpha, needs_swap; + cairo_image_surface_t *clone = NULL; + cairo_gl_context_t *ctx; + int cpp; + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + + status = _cairo_gl_context_acquire (dst->base.device, &ctx); + if (unlikely (status)) + return status; + + if (! _cairo_gl_get_image_format_and_type (ctx->gl_flavor, + src->pixman_format, + &internal_format, + &format, + &type, + &has_alpha, + &needs_swap)) + { + cairo_bool_t is_supported; + + clone = _cairo_image_surface_coerce (src); + if (unlikely (status = clone->base.status)) + goto FAIL; + + is_supported = + _cairo_gl_get_image_format_and_type (ctx->gl_flavor, + clone->pixman_format, + &internal_format, + &format, + &type, + &has_alpha, + &needs_swap); + assert (is_supported); + assert (!needs_swap); + src = clone; + } + + cpp = PIXMAN_FORMAT_BPP (src->pixman_format) / 8; + + if (force_flush) { + status = _cairo_gl_surface_flush (&dst->base, 0); + if (unlikely (status)) + goto FAIL; + } + + if (_cairo_gl_surface_is_texture (dst)) { + void *data_start = src->data + src_y * src->stride + src_x * cpp; + void *data_start_gles2 = NULL; + + /* + * Due to GL_UNPACK_ROW_LENGTH missing in GLES2 we have to extract the + * image data ourselves in some cases. In particular, we must extract + * the pixels if: + * a. we don't want full-length lines or + * b. the row stride cannot be handled by GL itself using a 4 byte + * alignment constraint + */ + if (src->stride < 0 || + (ctx->gl_flavor == CAIRO_GL_FLAVOR_ES && + (src->width * cpp < src->stride - 3 || + width != src->width))) + { + glPixelStorei (GL_UNPACK_ALIGNMENT, 1); + status = _cairo_gl_surface_extract_image_data (src, src_x, src_y, + width, height, + &data_start_gles2); + if (unlikely (status)) + goto FAIL; + + data_start = data_start_gles2; + } + else + { + glPixelStorei (GL_UNPACK_ALIGNMENT, 4); + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + glPixelStorei (GL_UNPACK_ROW_LENGTH, src->stride / cpp); + } + + _cairo_gl_context_activate (ctx, CAIRO_GL_TEX_TEMP); + glBindTexture (ctx->tex_target, dst->tex); + glTexParameteri (ctx->tex_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri (ctx->tex_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexSubImage2D (ctx->tex_target, 0, + dst_x, dst_y, width, height, + format, type, data_start); + + free (data_start_gles2); + + /* If we just treated some rgb-only data as rgba, then we have to + * go back and fix up the alpha channel where we filled in this + * texture data. + */ + if (!has_alpha) { + _cairo_gl_surface_fill_alpha_channel (dst, ctx, + dst_x, dst_y, + width, height); + } + } else { + cairo_surface_t *tmp; + + tmp = _cairo_gl_surface_create_scratch (ctx, + dst->base.content, + width, height); + if (unlikely (tmp->status)) + goto FAIL; + + status = _cairo_gl_surface_draw_image ((cairo_gl_surface_t *) tmp, + src, + src_x, src_y, + width, height, + 0, 0, force_flush); + if (status == CAIRO_INT_STATUS_SUCCESS) { + cairo_surface_pattern_t tmp_pattern; + cairo_rectangle_int_t r; + cairo_clip_t *clip; + + _cairo_pattern_init_for_surface (&tmp_pattern, tmp); + cairo_matrix_init_translate (&tmp_pattern.base.matrix, + -dst_x, -dst_y); + tmp_pattern.base.filter = CAIRO_FILTER_NEAREST; + tmp_pattern.base.extend = CAIRO_EXTEND_NONE; + + r.x = dst_x; + r.y = dst_y; + r.width = width; + r.height = height; + clip = _cairo_clip_intersect_rectangle (NULL, &r); + status = _cairo_surface_paint (&dst->base, + CAIRO_OPERATOR_SOURCE, + &tmp_pattern.base, + clip); + _cairo_clip_destroy (clip); + _cairo_pattern_fini (&tmp_pattern.base); + } + + cairo_surface_destroy (tmp); + } + +FAIL: + status = _cairo_gl_context_release (ctx, status); + + if (clone) + cairo_surface_destroy (&clone->base); + + return status; +} + +static int _cairo_gl_surface_flavor (cairo_gl_surface_t *surface) +{ + cairo_gl_context_t *ctx = (cairo_gl_context_t *)surface->base.device; + return ctx->gl_flavor; +} + +static cairo_status_t +_cairo_gl_surface_finish (void *abstract_surface) +{ + cairo_gl_surface_t *surface = abstract_surface; + cairo_status_t status; + cairo_gl_context_t *ctx; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return status; + + if (ctx->operands[CAIRO_GL_TEX_SOURCE].type == CAIRO_GL_OPERAND_TEXTURE && + ctx->operands[CAIRO_GL_TEX_SOURCE].texture.surface == surface) + _cairo_gl_context_destroy_operand (ctx, CAIRO_GL_TEX_SOURCE); + if (ctx->operands[CAIRO_GL_TEX_MASK].type == CAIRO_GL_OPERAND_TEXTURE && + ctx->operands[CAIRO_GL_TEX_MASK].texture.surface == surface) + _cairo_gl_context_destroy_operand (ctx, CAIRO_GL_TEX_MASK); + if (ctx->current_target == surface) + ctx->current_target = NULL; + + if (surface->fb) + ctx->dispatch.DeleteFramebuffers (1, &surface->fb); + if (surface->depth_stencil) + ctx->dispatch.DeleteRenderbuffers (1, &surface->depth_stencil); + if (surface->owns_tex) + glDeleteTextures (1, &surface->tex); + + if (surface->msaa_depth_stencil) + ctx->dispatch.DeleteRenderbuffers (1, &surface->msaa_depth_stencil); + +#if CAIRO_HAS_GL_SURFACE + if (surface->msaa_fb) + ctx->dispatch.DeleteFramebuffers (1, &surface->msaa_fb); + if (surface->msaa_rb) + ctx->dispatch.DeleteRenderbuffers (1, &surface->msaa_rb); +#endif + + _cairo_clip_destroy (surface->clip_on_stencil_buffer); + + return _cairo_gl_context_release (ctx, status); +} + +static cairo_image_surface_t * +_cairo_gl_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_gl_surface_t *surface = abstract_surface; + cairo_image_surface_t *image; + cairo_gl_context_t *ctx; + GLenum format, type; + pixman_format_code_t pixman_format; + unsigned int cpp; + cairo_bool_t flipped, mesa_invert; + cairo_status_t status; + int y; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) { + return _cairo_image_surface_create_in_error (status); + } + + /* Want to use a switch statement here but the compiler gets whiny. */ + if (surface->base.content == CAIRO_CONTENT_COLOR_ALPHA) { + format = GL_BGRA; + pixman_format = PIXMAN_a8r8g8b8; + type = GL_UNSIGNED_INT_8_8_8_8_REV; + cpp = 4; + } else if (surface->base.content == CAIRO_CONTENT_COLOR) { + format = GL_BGRA; + pixman_format = PIXMAN_x8r8g8b8; + type = GL_UNSIGNED_INT_8_8_8_8_REV; + cpp = 4; + } else if (surface->base.content == CAIRO_CONTENT_ALPHA) { + format = GL_ALPHA; + pixman_format = PIXMAN_a8; + type = GL_UNSIGNED_BYTE; + cpp = 1; + } else { + ASSERT_NOT_REACHED; + return NULL; + } + + if (_cairo_gl_surface_flavor (surface) == CAIRO_GL_FLAVOR_ES) { + /* If only RGBA is supported, we must download data in a compatible + * format. This means that pixman will convert the data on the CPU when + * interacting with other image surfaces. For ALPHA, GLES2 does not + * support GL_PACK_ROW_LENGTH anyway, and this makes sure that the + * pixman image that is created has row_stride = row_width * bpp. */ + if (surface->base.content == CAIRO_CONTENT_ALPHA || !ctx->can_read_bgra) { + cairo_bool_t little_endian = _cairo_is_little_endian (); + format = GL_RGBA; + + if (surface->base.content == CAIRO_CONTENT_COLOR) { + pixman_format = little_endian ? + PIXMAN_x8b8g8r8 : PIXMAN_r8g8b8x8; + } else { + pixman_format = little_endian ? + PIXMAN_a8b8g8r8 : PIXMAN_r8g8b8a8; + } + } + + /* GLES2 only supports GL_UNSIGNED_BYTE. */ + type = GL_UNSIGNED_BYTE; + cpp = 4; + } + + image = (cairo_image_surface_t*) + _cairo_image_surface_create_with_pixman_format (NULL, + pixman_format, + extents->width, + extents->height, + -1); + if (unlikely (image->base.status)) { + status = _cairo_gl_context_release (ctx, status); + return image; + } + + cairo_surface_set_device_offset (&image->base, -extents->x, -extents->y); + + /* If the original surface has not been modified or + * is clear, we can avoid downloading data. */ + if (surface->base.is_clear || surface->base.serial == 0) { + status = _cairo_gl_context_release (ctx, status); + return image; + } + + /* This is inefficient, as we'd rather just read the thing without making + * it the destination. But then, this is the fallback path, so let's not + * fall back instead. + */ + _cairo_gl_composite_flush (ctx); + _cairo_gl_context_set_destination (ctx, surface, FALSE); + + flipped = ! _cairo_gl_surface_is_texture (surface); + mesa_invert = flipped && ctx->has_mesa_pack_invert; + + glPixelStorei (GL_PACK_ALIGNMENT, 4); + if (ctx->gl_flavor == CAIRO_GL_FLAVOR_DESKTOP) + glPixelStorei (GL_PACK_ROW_LENGTH, image->stride / cpp); + if (mesa_invert) + glPixelStorei (GL_PACK_INVERT_MESA, 1); + + y = extents->y; + if (flipped) + y = surface->height - extents->y - extents->height; + + glReadPixels (extents->x, y, + extents->width, extents->height, + format, type, image->data); + if (mesa_invert) + glPixelStorei (GL_PACK_INVERT_MESA, 0); + + status = _cairo_gl_context_release (ctx, status); + if (unlikely (status)) { + cairo_surface_destroy (&image->base); + return _cairo_image_surface_create_in_error (status); + } + + /* We must invert the image manualy if we lack GL_MESA_pack_invert */ + if (flipped && ! mesa_invert) { + uint8_t stack[1024], *row = stack; + uint8_t *top = image->data; + uint8_t *bot = image->data + (image->height-1)*image->stride; + + if (image->stride > (int)sizeof(stack)) { + row = malloc (image->stride); + if (unlikely (row == NULL)) { + cairo_surface_destroy (&image->base); + return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + while (top < bot) { + memcpy (row, top, image->stride); + memcpy (top, bot, image->stride); + memcpy (bot, row, image->stride); + top += image->stride; + bot -= image->stride; + } + + if (row != stack) + free(row); + } + + image->base.is_clear = FALSE; + return image; +} + +static cairo_surface_t * +_cairo_gl_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_gl_surface_t *surface = abstract_surface; + + if (extents) { + extents->x = extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + } + + return &surface->base; +} + +static cairo_status_t +_cairo_gl_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_gl_surface_t *surface = abstract_surface; + cairo_rectangle_int_t extents; + + *image_extra = NULL; + + extents.x = extents.y = 0; + extents.width = surface->width; + extents.height = surface->height; + + *image_out = (cairo_image_surface_t *) + _cairo_gl_surface_map_to_image (surface, &extents); + return (*image_out)->base.status; +} + +static void +_cairo_gl_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_int_status_t +_cairo_gl_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_int_status_t status; + + status = _cairo_gl_surface_draw_image (abstract_surface, image, + 0, 0, + image->width, image->height, + image->base.device_transform_inverse.x0, + image->base.device_transform_inverse.y0, + TRUE); + + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return status; +} + +static cairo_bool_t +_cairo_gl_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_gl_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = surface->width; + rectangle->height = surface->height; + + return TRUE; +} + +static cairo_status_t +_cairo_gl_surface_flush (void *abstract_surface, unsigned flags) +{ + cairo_gl_surface_t *surface = abstract_surface; + cairo_status_t status; + cairo_gl_context_t *ctx; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return status; + + if ((ctx->operands[CAIRO_GL_TEX_SOURCE].type == CAIRO_GL_OPERAND_TEXTURE && + ctx->operands[CAIRO_GL_TEX_SOURCE].texture.surface == surface) || + (ctx->operands[CAIRO_GL_TEX_MASK].type == CAIRO_GL_OPERAND_TEXTURE && + ctx->operands[CAIRO_GL_TEX_MASK].texture.surface == surface) || + (ctx->current_target == surface)) + _cairo_gl_composite_flush (ctx); + + status = _cairo_gl_surface_resolve_multisampling (surface); + + return _cairo_gl_context_release (ctx, status); +} + +cairo_int_status_t +_cairo_gl_surface_resolve_multisampling (cairo_gl_surface_t *surface) +{ + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + if (! surface->msaa_active) + return CAIRO_INT_STATUS_SUCCESS; + + if (surface->base.device == NULL) + return CAIRO_INT_STATUS_SUCCESS; + + /* GLES surfaces do not need explicit resolution. */ + if (((cairo_gl_context_t *) surface->base.device)->gl_flavor == CAIRO_GL_FLAVOR_ES) + return CAIRO_INT_STATUS_SUCCESS; + + if (! _cairo_gl_surface_is_texture (surface)) + return CAIRO_INT_STATUS_SUCCESS; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return status; + + ctx->current_target = surface; + +#if CAIRO_HAS_GL_SURFACE + _cairo_gl_context_bind_framebuffer (ctx, surface, FALSE); +#endif + + status = _cairo_gl_context_release (ctx, status); + return status; +} + +static const cairo_compositor_t * +get_compositor (cairo_gl_surface_t *surface) +{ + cairo_gl_context_t *ctx = (cairo_gl_context_t *)surface->base.device; + return ctx->compositor; +} + +static cairo_int_status_t +_cairo_gl_surface_paint (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + /* simplify the common case of clearing the surface */ + if (clip == NULL) { + if (op == CAIRO_OPERATOR_CLEAR) + return _cairo_gl_surface_clear (surface, CAIRO_COLOR_TRANSPARENT); + else if (source->type == CAIRO_PATTERN_TYPE_SOLID && + (op == CAIRO_OPERATOR_SOURCE || + (op == CAIRO_OPERATOR_OVER && _cairo_pattern_is_opaque_solid (source)))) { + return _cairo_gl_surface_clear (surface, + &((cairo_solid_pattern_t *) source)->color); + } + } + + return _cairo_compositor_paint (get_compositor (surface), surface, + op, source, clip); +} + +static cairo_int_status_t +_cairo_gl_surface_mask (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + return _cairo_compositor_mask (get_compositor (surface), surface, + op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_gl_surface_stroke (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + return _cairo_compositor_stroke (get_compositor (surface), surface, + op, source, path, style, + ctm, ctm_inverse, tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_gl_surface_fill (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + return _cairo_compositor_fill (get_compositor (surface), surface, + op, source, path, + fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_gl_surface_glyphs (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *font, + const cairo_clip_t *clip) +{ + return _cairo_compositor_glyphs (get_compositor (surface), surface, + op, source, glyphs, num_glyphs, font, + clip); +} + +static const cairo_surface_backend_t _cairo_gl_surface_backend = { + CAIRO_SURFACE_TYPE_GL, + _cairo_gl_surface_finish, + _cairo_default_context_create, + + _cairo_gl_surface_create_similar, + NULL, /* similar image */ + _cairo_gl_surface_map_to_image, + _cairo_gl_surface_unmap_image, + + _cairo_gl_surface_source, + _cairo_gl_surface_acquire_source_image, + _cairo_gl_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_gl_surface_get_extents, + _cairo_image_surface_get_font_options, + + _cairo_gl_surface_flush, + NULL, /* mark_dirty_rectangle */ + + _cairo_gl_surface_paint, + _cairo_gl_surface_mask, + _cairo_gl_surface_stroke, + _cairo_gl_surface_fill, + NULL, /* fill/stroke */ + _cairo_gl_surface_glyphs, +}; diff --git a/src/cairo-gl-traps-compositor.c b/src/cairo-gl-traps-compositor.c new file mode 100644 index 000000000..125ed4eab --- /dev/null +++ b/src/cairo-gl-traps-compositor.c @@ -0,0 +1,558 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005,2010 Red Hat, Inc + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Benjamin Otte + * Carl Worth + * Chris Wilson + * Eric Anholt + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-spans-compositor-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-offset-private.h" + +static cairo_int_status_t +acquire (void *abstract_dst) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +release (void *abstract_dst) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +set_clip_region (void *_surface, + cairo_region_t *region) +{ + cairo_gl_surface_t *surface = _surface; + + surface->clip_region = region; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +draw_image_boxes (void *_dst, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy) +{ + cairo_gl_surface_t *dst = _dst; + struct _cairo_boxes_chunk *chunk; + int i; + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + int x = _cairo_fixed_integer_part (b->p1.x); + int y = _cairo_fixed_integer_part (b->p1.y); + int w = _cairo_fixed_integer_part (b->p2.x) - x; + int h = _cairo_fixed_integer_part (b->p2.y) - y; + cairo_status_t status; + + status = _cairo_gl_surface_draw_image (dst, image, + x + dx, y + dy, + w, h, + x, y, + TRUE); + if (unlikely (status)) + return status; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +emit_aligned_boxes (cairo_gl_context_t *ctx, + const cairo_boxes_t *boxes) +{ + const struct _cairo_boxes_chunk *chunk; + cairo_gl_emit_rect_t emit = _cairo_gl_context_choose_emit_rect (ctx); + int i; + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + emit (ctx, x1, y1, x2, y2); + } + } +} + +static cairo_int_status_t +fill_boxes (void *_dst, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_solid_source (&setup, color); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + emit_aligned_boxes (ctx, boxes); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_int_status_t +composite_boxes (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_source_operand (&setup, + source_to_operand (abstract_src)); + _cairo_gl_operand_translate (&setup.src, dst_x-src_x, dst_y-src_y); + + _cairo_gl_composite_set_mask_operand (&setup, + source_to_operand (abstract_mask)); + _cairo_gl_operand_translate (&setup.mask, dst_x-mask_x, dst_y-mask_y); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + emit_aligned_boxes (ctx, boxes); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_int_status_t +composite (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_source_operand (&setup, + source_to_operand (abstract_src)); + _cairo_gl_operand_translate (&setup.src, dst_x-src_x, dst_y-src_y); + + _cairo_gl_composite_set_mask_operand (&setup, + source_to_operand (abstract_mask)); + _cairo_gl_operand_translate (&setup.mask, dst_x-mask_x, dst_y-mask_y); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + /* XXX clip */ + _cairo_gl_context_emit_rect (ctx, dst_x, dst_y, dst_x+width, dst_y+height); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_int_status_t +lerp (void *dst, + cairo_surface_t *src, + cairo_surface_t *mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + cairo_int_status_t status; + + /* we could avoid some repetition... */ + status = composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + mask_x, mask_y, + 0, 0, + dst_x, dst_y, + width, height); + if (unlikely (status)) + return status; + + status = composite (dst, CAIRO_OPERATOR_ADD, src, mask, + src_x, src_y, + mask_x, mask_y, + dst_x, dst_y, + width, height); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +traps_to_operand (void *_dst, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_traps_t *traps, + cairo_gl_operand_t *operand, + int dst_x, int dst_y) +{ + pixman_format_code_t pixman_format; + pixman_image_t *pixman_image; + cairo_surface_t *image, *mask; + cairo_surface_pattern_t pattern; + cairo_status_t status; + + pixman_format = antialias != CAIRO_ANTIALIAS_NONE ? PIXMAN_a8 : PIXMAN_a1; + pixman_image = pixman_image_create_bits (pixman_format, + extents->width, + extents->height, + NULL, 0); + if (unlikely (pixman_image == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _pixman_image_add_traps (pixman_image, extents->x, extents->y, traps); + image = _cairo_image_surface_create_for_pixman_image (pixman_image, + pixman_format); + if (unlikely (image->status)) { + pixman_image_unref (pixman_image); + return image->status; + } + + /* GLES2 only supports RGB/RGBA when uploading */ + if (_cairo_gl_get_flavor () == CAIRO_GL_FLAVOR_ES) { + cairo_surface_pattern_t pattern; + cairo_surface_t *rgba_image; + + /* XXX perform this fixup inside _cairo_gl_draw_image() */ + + rgba_image = + _cairo_image_surface_create_with_pixman_format (NULL, + _cairo_is_little_endian () ? PIXMAN_a8b8g8r8 : PIXMAN_r8g8b8a8, + extents->width, + extents->height, + 0); + if (unlikely (rgba_image->status)) + return rgba_image->status; + + _cairo_pattern_init_for_surface (&pattern, image); + status = _cairo_surface_paint (rgba_image, CAIRO_OPERATOR_SOURCE, + &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + + cairo_surface_destroy (image); + image = rgba_image; + + if (unlikely (status)) { + cairo_surface_destroy (image); + return status; + } + } + + mask = _cairo_surface_create_scratch (_dst, + CAIRO_CONTENT_COLOR_ALPHA, + extents->width, + extents->height, + NULL); + if (unlikely (mask->status)) { + cairo_surface_destroy (image); + return mask->status; + } + + status = _cairo_gl_surface_draw_image ((cairo_gl_surface_t *)mask, + (cairo_image_surface_t *)image, + 0, 0, + extents->width, extents->height, + 0, 0, + TRUE); + cairo_surface_destroy (image); + + if (unlikely (status)) + goto error; + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->x+dst_x, -extents->y+dst_y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + status = _cairo_gl_operand_init (operand, &pattern.base, _dst, + &_cairo_unbounded_rectangle, + &_cairo_unbounded_rectangle, + FALSE); + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) + goto error; + + operand->texture.owns_surface = (cairo_gl_surface_t *)mask; + return CAIRO_STATUS_SUCCESS; + +error: + cairo_surface_destroy (mask); + return status; +} + +static cairo_int_status_t +composite_traps (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_traps_t *traps) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_source_operand (&setup, + source_to_operand (abstract_src)); + _cairo_gl_operand_translate (&setup.src, -src_x-dst_x, -src_y-dst_y); + status = traps_to_operand (_dst, extents, antialias, traps, &setup.mask, dst_x, dst_y); + if (unlikely (status)) + goto FAIL; + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + /* XXX clip */ + _cairo_gl_context_emit_rect (ctx, + extents->x-dst_x, extents->y-dst_y, + extents->x-dst_x+extents->width, + extents->y-dst_y+extents->height); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + return status; +} + +static cairo_gl_surface_t * +tristrip_to_surface (void *_dst, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_tristrip_t *strip) +{ + pixman_format_code_t pixman_format; + pixman_image_t *pixman_image; + cairo_surface_t *image, *mask; + cairo_status_t status; + + pixman_format = antialias != CAIRO_ANTIALIAS_NONE ? PIXMAN_a8 : PIXMAN_a1, + pixman_image = pixman_image_create_bits (pixman_format, + extents->width, + extents->height, + NULL, 0); + if (unlikely (pixman_image == NULL)) + return (cairo_gl_surface_t *)_cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _pixman_image_add_tristrip (pixman_image, extents->x, extents->y, strip); + image = _cairo_image_surface_create_for_pixman_image (pixman_image, + pixman_format); + if (unlikely (image->status)) { + pixman_image_unref (pixman_image); + return (cairo_gl_surface_t *)image; + } + + mask = _cairo_surface_create_scratch (_dst, + CAIRO_CONTENT_COLOR_ALPHA, + extents->width, + extents->height, + NULL); + if (unlikely (mask->status)) { + cairo_surface_destroy (image); + return (cairo_gl_surface_t *)mask; + } + + status = _cairo_gl_surface_draw_image ((cairo_gl_surface_t *)mask, + (cairo_image_surface_t *)image, + 0, 0, + extents->width, extents->height, + 0, 0, + TRUE); + cairo_surface_destroy (image); + if (unlikely (status)) { + cairo_surface_destroy (mask); + return (cairo_gl_surface_t*)_cairo_surface_create_in_error (status); + } + + return (cairo_gl_surface_t*)mask; +} + +static cairo_int_status_t +composite_tristrip (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_tristrip_t *strip) +{ + cairo_gl_composite_t setup; + cairo_gl_context_t *ctx; + cairo_gl_surface_t *mask; + cairo_int_status_t status; + + mask = tristrip_to_surface (_dst, extents, antialias, strip); + if (unlikely (mask->base.status)) + return mask->base.status; + + status = _cairo_gl_composite_init (&setup, op, _dst, FALSE); + if (unlikely (status)) + goto FAIL; + + _cairo_gl_composite_set_source_operand (&setup, + source_to_operand (abstract_src)); + + //_cairo_gl_composite_set_mask_surface (&setup, mask, 0, 0); + + status = _cairo_gl_composite_begin (&setup, &ctx); + if (unlikely (status)) + goto FAIL; + + /* XXX clip */ + _cairo_gl_context_emit_rect (ctx, + dst_x, dst_y, + dst_x+extents->width, + dst_y+extents->height); + status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS); + +FAIL: + _cairo_gl_composite_fini (&setup); + cairo_surface_destroy (&mask->base); + return status; +} + +static cairo_int_status_t +check_composite (const cairo_composite_rectangles_t *extents) +{ + if (! _cairo_gl_operator_is_supported (extents->op)) + return UNSUPPORTED ("unsupported operator"); + + return CAIRO_STATUS_SUCCESS; +} + +const cairo_compositor_t * +_cairo_gl_traps_compositor_get (void) +{ + static cairo_traps_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_traps_compositor_init (&compositor, &_cairo_fallback_compositor); + compositor.acquire = acquire; + compositor.release = release; + compositor.set_clip_region = set_clip_region; + compositor.pattern_to_surface = _cairo_gl_pattern_to_source; + compositor.draw_image_boxes = draw_image_boxes; + //compositor.copy_boxes = copy_boxes; + compositor.fill_boxes = fill_boxes; + compositor.check_composite = check_composite; + compositor.composite = composite; + compositor.lerp = lerp; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + //compositor.check_composite_traps = check_composite_traps; + compositor.composite_traps = composite_traps; + //compositor.check_composite_tristrip = check_composite_traps; + compositor.composite_tristrip = composite_tristrip; + compositor.check_composite_glyphs = _cairo_gl_check_composite_glyphs; + compositor.composite_glyphs = _cairo_gl_composite_glyphs; + } + + return &compositor.base; +} diff --git a/src/cairo-gl.h b/src/cairo-gl.h new file mode 100644 index 000000000..9fd7608f5 --- /dev/null +++ b/src/cairo-gl.h @@ -0,0 +1,155 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Eric Anholt. + */ + +/* + * cairo-gl.h: + * + * The cairo-gl backend provides an implementation of possibly + * hardware-accelerated cairo rendering by targeting the OpenGL API. + * The goal of the cairo-gl backend is to provide better performance + * with equal functionality to cairo-image where possible. It does + * not directly provide for applying additional OpenGL effects to + * cairo surfaces. + * + * Cairo-gl allows interoperability with other GL rendering through GL + * context sharing. Cairo-gl surfaces are created in reference to a + * #cairo_device_t, which represents a GL context created by the user. + * When that GL context is created with its sharePtr set to another + * context (or vice versa), its objects (textures backing cairo-gl + * surfaces) can be accessed in the other OpenGL context. This allows + * cairo-gl to maintain its drawing state in one context while the + * user's 3D rendering occurs in the user's other context. + * + * However, as only one context can be current to a thread at a time, + * cairo-gl may make its context current to the thread on any cairo + * call which interacts with a cairo-gl surface or the cairo-gl + * device. As a result, the user must make their own context current + * between any cairo calls and their own OpenGL rendering. + **/ + +#ifndef CAIRO_GL_H +#define CAIRO_GL_H + +#include "cairo.h" + +#if CAIRO_HAS_GL_SURFACE || CAIRO_HAS_GLESV2_SURFACE + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_gl_surface_create (cairo_device_t *device, + cairo_content_t content, + int width, int height); + +cairo_public cairo_surface_t * +cairo_gl_surface_create_for_texture (cairo_device_t *abstract_device, + cairo_content_t content, + unsigned int tex, + int width, int height); +cairo_public void +cairo_gl_surface_set_size (cairo_surface_t *surface, int width, int height); + +cairo_public int +cairo_gl_surface_get_width (cairo_surface_t *abstract_surface); + +cairo_public int +cairo_gl_surface_get_height (cairo_surface_t *abstract_surface); + +cairo_public void +cairo_gl_surface_swapbuffers (cairo_surface_t *surface); + +cairo_public void +cairo_gl_device_set_thread_aware (cairo_device_t *device, + cairo_bool_t thread_aware); + +#if CAIRO_HAS_GLX_FUNCTIONS +#include + +cairo_public cairo_device_t * +cairo_glx_device_create (Display *dpy, GLXContext gl_ctx); + +cairo_public Display * +cairo_glx_device_get_display (cairo_device_t *device); + +cairo_public GLXContext +cairo_glx_device_get_context (cairo_device_t *device); + +cairo_public cairo_surface_t * +cairo_gl_surface_create_for_window (cairo_device_t *device, + Window win, + int width, int height); +#endif + +#if CAIRO_HAS_WGL_FUNCTIONS +#include + +cairo_public cairo_device_t * +cairo_wgl_device_create (HGLRC rc); + +cairo_public HGLRC +cairo_wgl_device_get_context (cairo_device_t *device); + +cairo_public cairo_surface_t * +cairo_gl_surface_create_for_dc (cairo_device_t *device, + HDC dc, + int width, + int height); +#endif + +#if CAIRO_HAS_EGL_FUNCTIONS +#include + +cairo_public cairo_device_t * +cairo_egl_device_create (EGLDisplay dpy, EGLContext egl); + +cairo_public cairo_surface_t * +cairo_gl_surface_create_for_egl (cairo_device_t *device, + EGLSurface egl, + int width, + int height); + +cairo_public EGLDisplay +cairo_egl_device_get_display (cairo_device_t *device); + +cairo_public EGLSurface +cairo_egl_device_get_context (cairo_device_t *device); + +#endif + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_GL_SURFACE */ +# error Cairo was not compiled with support for the GL backend +#endif /* CAIRO_HAS_GL_SURFACE */ + +#endif /* CAIRO_GL_H */ diff --git a/src/cairo-glx-context.c b/src/cairo-glx-context.c new file mode 100644 index 000000000..3761b9079 --- /dev/null +++ b/src/cairo-glx-context.c @@ -0,0 +1,324 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-error-private.h" + +#include + +/* XXX needs hooking into XCloseDisplay() */ + +typedef struct _cairo_glx_context { + cairo_gl_context_t base; + + Display *display; + Window dummy_window; + GLXContext context; + + GLXDrawable previous_drawable; + GLXContext previous_context; + + cairo_bool_t has_multithread_makecurrent; +} cairo_glx_context_t; + +typedef struct _cairo_glx_surface { + cairo_gl_surface_t base; + + Window win; +} cairo_glx_surface_t; + +static cairo_bool_t +_context_acquisition_changed_glx_state (cairo_glx_context_t *ctx, + GLXDrawable current_drawable) +{ + return ctx->previous_drawable != current_drawable || + ctx->previous_context != ctx->context; +} + +static GLXDrawable +_glx_get_current_drawable (cairo_glx_context_t *ctx) +{ + if (ctx->base.current_target == NULL || + _cairo_gl_surface_is_texture (ctx->base.current_target)) { + return ctx->dummy_window; + } + + return ((cairo_glx_surface_t *) ctx->base.current_target)->win; +} + +static void +_glx_query_current_state (cairo_glx_context_t * ctx) +{ + ctx->previous_drawable = glXGetCurrentDrawable (); + ctx->previous_context = glXGetCurrentContext (); + + /* If any of the values were none, assume they are all none. Not all + drivers seem well behaved when it comes to using these values across + multiple threads. */ + if (ctx->previous_drawable == None || + ctx->previous_context == None) { + ctx->previous_drawable = None; + ctx->previous_context = None; + } +} + +static void +_glx_acquire (void *abstract_ctx) +{ + cairo_glx_context_t *ctx = abstract_ctx; + GLXDrawable current_drawable = _glx_get_current_drawable (ctx); + + _glx_query_current_state (ctx); + if (!_context_acquisition_changed_glx_state (ctx, current_drawable)) + return; + + glXMakeCurrent (ctx->display, current_drawable, ctx->context); +} + +static void +_glx_make_current (void *abstract_ctx, cairo_gl_surface_t *abstract_surface) +{ + cairo_glx_context_t *ctx = abstract_ctx; + cairo_glx_surface_t *surface = (cairo_glx_surface_t *) abstract_surface; + + /* Set the window as the target of our context. */ + glXMakeCurrent (ctx->display, surface->win, ctx->context); +} + +static void +_glx_release (void *abstract_ctx) +{ + cairo_glx_context_t *ctx = abstract_ctx; + + if (ctx->has_multithread_makecurrent || !ctx->base.thread_aware || + !_context_acquisition_changed_glx_state (ctx, + _glx_get_current_drawable (ctx))) { + return; + } + + glXMakeCurrent (ctx->display, None, None); +} + +static void +_glx_swap_buffers (void *abstract_ctx, + cairo_gl_surface_t *abstract_surface) +{ + cairo_glx_context_t *ctx = abstract_ctx; + cairo_glx_surface_t *surface = (cairo_glx_surface_t *) abstract_surface; + + glXSwapBuffers (ctx->display, surface->win); +} + +static void +_glx_destroy (void *abstract_ctx) +{ + cairo_glx_context_t *ctx = abstract_ctx; + + if (ctx->dummy_window != None) + XDestroyWindow (ctx->display, ctx->dummy_window); + + glXMakeCurrent (ctx->display, None, None); +} + +static cairo_status_t +_glx_dummy_window (Display *dpy, GLXContext gl_ctx, Window *dummy) +{ + int attr[3] = { GLX_FBCONFIG_ID, 0, None }; + GLXFBConfig *config; + XVisualInfo *vi; + Colormap cmap; + XSetWindowAttributes swa; + Window win = None; + int cnt; + + /* Create a dummy window created for the target GLX context that we can + * use to query the available GL/GLX extensions. + */ + glXQueryContext (dpy, gl_ctx, GLX_FBCONFIG_ID, &attr[1]); + + cnt = 0; + config = glXChooseFBConfig (dpy, DefaultScreen (dpy), attr, &cnt); + if (unlikely (cnt == 0)) + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + + vi = glXGetVisualFromFBConfig (dpy, config[0]); + XFree (config); + + if (unlikely (vi == NULL)) + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + + cmap = XCreateColormap (dpy, + RootWindow (dpy, vi->screen), + vi->visual, + AllocNone); + swa.colormap = cmap; + swa.border_pixel = 0; + win = XCreateWindow (dpy, RootWindow (dpy, vi->screen), + -1, -1, 1, 1, 0, + vi->depth, + InputOutput, + vi->visual, + CWBorderPixel | CWColormap, &swa); + XFreeColormap (dpy, cmap); + XFree (vi); + + XFlush (dpy); + if (unlikely (! glXMakeCurrent (dpy, win, gl_ctx))) { + XDestroyWindow (dpy, win); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + *dummy = win; + return CAIRO_STATUS_SUCCESS; +} + +cairo_device_t * +cairo_glx_device_create (Display *dpy, GLXContext gl_ctx) +{ + cairo_glx_context_t *ctx; + cairo_status_t status; + Window dummy = None; + const char *glx_extensions; + + ctx = calloc (1, sizeof (cairo_glx_context_t)); + if (unlikely (ctx == NULL)) + return _cairo_gl_context_create_in_error (CAIRO_STATUS_NO_MEMORY); + + /* glx_dummy_window will call glXMakeCurrent, so we need to + * query the current state of the context now. */ + _glx_query_current_state (ctx); + + status = _glx_dummy_window (dpy, gl_ctx, &dummy); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + ctx->display = dpy; + ctx->dummy_window = dummy; + ctx->context = gl_ctx; + + ctx->base.acquire = _glx_acquire; + ctx->base.release = _glx_release; + ctx->base.make_current = _glx_make_current; + ctx->base.swap_buffers = _glx_swap_buffers; + ctx->base.destroy = _glx_destroy; + + status = _cairo_gl_dispatch_init (&ctx->base.dispatch, + (cairo_gl_get_proc_addr_func_t) glXGetProcAddress); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + status = _cairo_gl_context_init (&ctx->base); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + glx_extensions = glXQueryExtensionsString (dpy, DefaultScreen (dpy)); + if (strstr(glx_extensions, "GLX_MESA_multithread_makecurrent")) { + ctx->has_multithread_makecurrent = TRUE; + } + + ctx->base.release (ctx); + + return &ctx->base.base; +} + +Display * +cairo_glx_device_get_display (cairo_device_t *device) +{ + cairo_glx_context_t *ctx; + + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return NULL; + } + + ctx = (cairo_glx_context_t *) device; + + return ctx->display; +} + +GLXContext +cairo_glx_device_get_context (cairo_device_t *device) +{ + cairo_glx_context_t *ctx; + + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return NULL; + } + + ctx = (cairo_glx_context_t *) device; + + return ctx->context; +} + +cairo_surface_t * +cairo_gl_surface_create_for_window (cairo_device_t *device, + Window win, + int width, + int height) +{ + cairo_glx_surface_t *surface; + + if (unlikely (device->status)) + return _cairo_surface_create_in_error (device->status); + + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + + if (width <= 0 || height <= 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + surface = calloc (1, sizeof (cairo_glx_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_gl_surface_init (device, &surface->base, + CAIRO_CONTENT_COLOR_ALPHA, width, height); + surface->win = win; + + return &surface->base.base; +} diff --git a/src/cairo-gstate-private.h b/src/cairo-gstate-private.h new file mode 100644 index 000000000..b2ccc76d1 --- /dev/null +++ b/src/cairo-gstate-private.h @@ -0,0 +1,387 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_GSTATE_PRIVATE_H +#define CAIRO_GSTATE_PRIVATE_H + +#include "cairo-clip-private.h" + +struct _cairo_gstate { + cairo_operator_t op; + + double opacity; + double tolerance; + cairo_antialias_t antialias; + + cairo_stroke_style_t stroke_style; + + cairo_fill_rule_t fill_rule; + + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; /* Specific to the current CTM */ + cairo_scaled_font_t *previous_scaled_font; /* holdover */ + cairo_matrix_t font_matrix; + cairo_font_options_t font_options; + + cairo_clip_t *clip; + + cairo_surface_t *target; /* The target to which all rendering is directed */ + cairo_surface_t *parent_target; /* The previous target which was receiving rendering */ + cairo_surface_t *original_target; /* The original target the initial gstate was created with */ + + /* the user is allowed to update the device after we have cached the matrices... */ + cairo_observer_t device_transform_observer; + + cairo_matrix_t ctm; + cairo_matrix_t ctm_inverse; + cairo_matrix_t source_ctm_inverse; /* At the time ->source was set */ + cairo_bool_t is_identity; + + cairo_pattern_t *source; + + struct _cairo_gstate *next; +}; + +/* cairo-gstate.c */ +cairo_private cairo_status_t +_cairo_gstate_init (cairo_gstate_t *gstate, + cairo_surface_t *target); + +cairo_private void +_cairo_gstate_fini (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_save (cairo_gstate_t **gstate, cairo_gstate_t **freelist); + +cairo_private cairo_status_t +_cairo_gstate_restore (cairo_gstate_t **gstate, cairo_gstate_t **freelist); + +cairo_private cairo_bool_t +_cairo_gstate_is_group (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_redirect_target (cairo_gstate_t *gstate, cairo_surface_t *child); + +cairo_private cairo_surface_t * +_cairo_gstate_get_target (cairo_gstate_t *gstate); + +cairo_private cairo_surface_t * +_cairo_gstate_get_original_target (cairo_gstate_t *gstate); + +cairo_private cairo_clip_t * +_cairo_gstate_get_clip (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_source (cairo_gstate_t *gstate, cairo_pattern_t *source); + +cairo_private cairo_pattern_t * +_cairo_gstate_get_source (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_operator (cairo_gstate_t *gstate, cairo_operator_t op); + +cairo_private cairo_operator_t +_cairo_gstate_get_operator (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_opacity (cairo_gstate_t *gstate, double opacity); + +cairo_private double +_cairo_gstate_get_opacity (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_tolerance (cairo_gstate_t *gstate, double tolerance); + +cairo_private double +_cairo_gstate_get_tolerance (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_fill_rule (cairo_gstate_t *gstate, cairo_fill_rule_t fill_rule); + +cairo_private cairo_fill_rule_t +_cairo_gstate_get_fill_rule (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width); + +cairo_private double +_cairo_gstate_get_line_width (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap); + +cairo_private cairo_line_cap_t +_cairo_gstate_get_line_cap (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join); + +cairo_private cairo_line_join_t +_cairo_gstate_get_line_join (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_set_dash (cairo_gstate_t *gstate, const double *dash, int num_dashes, double offset); + +cairo_private void +_cairo_gstate_get_dash (cairo_gstate_t *gstate, double *dash, int *num_dashes, double *offset); + +cairo_private cairo_status_t +_cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit); + +cairo_private double +_cairo_gstate_get_miter_limit (cairo_gstate_t *gstate); + +cairo_private void +_cairo_gstate_get_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix); + +cairo_private cairo_status_t +_cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty); + +cairo_private cairo_status_t +_cairo_gstate_scale (cairo_gstate_t *gstate, double sx, double sy); + +cairo_private cairo_status_t +_cairo_gstate_rotate (cairo_gstate_t *gstate, double angle); + +cairo_private cairo_status_t +_cairo_gstate_transform (cairo_gstate_t *gstate, + const cairo_matrix_t *matrix); + +cairo_private cairo_status_t +_cairo_gstate_set_matrix (cairo_gstate_t *gstate, + const cairo_matrix_t *matrix); + +cairo_private void +_cairo_gstate_identity_matrix (cairo_gstate_t *gstate); + +cairo_private void +_cairo_gstate_user_to_device (cairo_gstate_t *gstate, double *x, double *y); + +cairo_private void +_cairo_gstate_user_to_device_distance (cairo_gstate_t *gstate, double *dx, double *dy); + +cairo_private void +_cairo_gstate_device_to_user (cairo_gstate_t *gstate, double *x, double *y); + +cairo_private void +_cairo_gstate_device_to_user_distance (cairo_gstate_t *gstate, double *dx, double *dy); + +cairo_private void +_do_cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y); + +static inline void +_cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y) +{ + if (! gstate->is_identity) + _do_cairo_gstate_user_to_backend (gstate, x, y); +} + +cairo_private void +_do_cairo_gstate_user_to_backend_distance (cairo_gstate_t *gstate, double *x, double *y); + +static inline void +_cairo_gstate_user_to_backend_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + if (! gstate->is_identity) + _do_cairo_gstate_user_to_backend_distance (gstate, x, y); +} + +cairo_private void +_do_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y); + +static inline void +_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y) +{ + if (! gstate->is_identity) + _do_cairo_gstate_backend_to_user (gstate, x, y); +} + +cairo_private void +_do_cairo_gstate_backend_to_user_distance (cairo_gstate_t *gstate, double *x, double *y); + +static inline void +_cairo_gstate_backend_to_user_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + if (! gstate->is_identity) + _do_cairo_gstate_backend_to_user_distance (gstate, x, y); +} + +cairo_private void +_cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate, + double *x1, double *y1, + double *x2, double *y2, + cairo_bool_t *is_tight); + +cairo_private void +_cairo_gstate_path_extents (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double *x1, double *y1, + double *x2, double *y2); + +cairo_private cairo_status_t +_cairo_gstate_paint (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_mask (cairo_gstate_t *gstate, + cairo_pattern_t *mask); + +cairo_private cairo_status_t +_cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_gstate_copy_page (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_show_page (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_stroke_extents (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double *x1, double *y1, + double *x2, double *y2); + +cairo_private cairo_status_t +_cairo_gstate_fill_extents (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double *x1, double *y1, + double *x2, double *y2); + +cairo_private cairo_status_t +_cairo_gstate_in_stroke (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double x, + double y, + cairo_bool_t *inside_ret); + +cairo_private cairo_bool_t +_cairo_gstate_in_fill (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double x, + double y); + +cairo_private cairo_bool_t +_cairo_gstate_in_clip (cairo_gstate_t *gstate, + double x, + double y); + +cairo_private cairo_status_t +_cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_gstate_reset_clip (cairo_gstate_t *gstate); + +cairo_private cairo_bool_t +_cairo_gstate_clip_extents (cairo_gstate_t *gstate, + double *x1, + double *y1, + double *x2, + double *y2); + +cairo_private cairo_rectangle_list_t* +_cairo_gstate_copy_clip_rectangle_list (cairo_gstate_t *gstate); + +cairo_private cairo_status_t +_cairo_gstate_show_surface (cairo_gstate_t *gstate, + cairo_surface_t *surface, + double x, + double y, + double width, + double height); + +cairo_private cairo_status_t +_cairo_gstate_set_font_size (cairo_gstate_t *gstate, + double size); + +cairo_private void +_cairo_gstate_get_font_matrix (cairo_gstate_t *gstate, + cairo_matrix_t *matrix); + +cairo_private cairo_status_t +_cairo_gstate_set_font_matrix (cairo_gstate_t *gstate, + const cairo_matrix_t *matrix); + +cairo_private void +_cairo_gstate_get_font_options (cairo_gstate_t *gstate, + cairo_font_options_t *options); + +cairo_private void +_cairo_gstate_set_font_options (cairo_gstate_t *gstate, + const cairo_font_options_t *options); + +cairo_private cairo_status_t +_cairo_gstate_get_font_face (cairo_gstate_t *gstate, + cairo_font_face_t **font_face); + +cairo_private cairo_status_t +_cairo_gstate_get_scaled_font (cairo_gstate_t *gstate, + cairo_scaled_font_t **scaled_font); + +cairo_private cairo_status_t +_cairo_gstate_get_font_extents (cairo_gstate_t *gstate, + cairo_font_extents_t *extents); + +cairo_private cairo_status_t +_cairo_gstate_set_font_face (cairo_gstate_t *gstate, + cairo_font_face_t *font_face); + +cairo_private cairo_status_t +_cairo_gstate_glyph_extents (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents); + +cairo_private cairo_status_t +_cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_glyph_text_info_t *info); + +cairo_private cairo_status_t +_cairo_gstate_glyph_path (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_gstate_set_antialias (cairo_gstate_t *gstate, + cairo_antialias_t antialias); + +cairo_private cairo_antialias_t +_cairo_gstate_get_antialias (cairo_gstate_t *gstate); + +#endif /* CAIRO_GSTATE_PRIVATE_H */ diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c new file mode 100644 index 000000000..b4e988e96 --- /dev/null +++ b/src/cairo-gstate.c @@ -0,0 +1,2346 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-list-inline.h" +#include "cairo-gstate-private.h" +#include "cairo-pattern-private.h" +#include "cairo-traps-private.h" + +#if _XOPEN_SOURCE >= 600 || defined (_ISOC99_SOURCE) +#define ISFINITE(x) isfinite (x) +#else +#define ISFINITE(x) ((x) * (x) >= 0.) /* check for NaNs */ +#endif + +static cairo_status_t +_cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other); + +static cairo_status_t +_cairo_gstate_ensure_font_face (cairo_gstate_t *gstate); + +static cairo_status_t +_cairo_gstate_ensure_scaled_font (cairo_gstate_t *gstate); + +static void +_cairo_gstate_unset_scaled_font (cairo_gstate_t *gstate); + +static void +_cairo_gstate_transform_glyphs_to_backend (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_glyph_t *transformed_glyphs, + int *num_transformed_glyphs, + cairo_text_cluster_t *transformed_clusters); + +static void +_cairo_gstate_update_device_transform (cairo_observer_t *observer, + void *arg) +{ + cairo_gstate_t *gstate = cairo_container_of (observer, + cairo_gstate_t, + device_transform_observer); + + gstate->is_identity = (_cairo_matrix_is_identity (&gstate->ctm) && + _cairo_matrix_is_identity (&gstate->target->device_transform)); +} + +cairo_status_t +_cairo_gstate_init (cairo_gstate_t *gstate, + cairo_surface_t *target) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (gstate, sizeof (cairo_gstate_t))); + + gstate->next = NULL; + + gstate->op = CAIRO_GSTATE_OPERATOR_DEFAULT; + gstate->opacity = 1.; + + gstate->tolerance = CAIRO_GSTATE_TOLERANCE_DEFAULT; + gstate->antialias = CAIRO_ANTIALIAS_DEFAULT; + + _cairo_stroke_style_init (&gstate->stroke_style); + + gstate->fill_rule = CAIRO_GSTATE_FILL_RULE_DEFAULT; + + gstate->font_face = NULL; + gstate->scaled_font = NULL; + gstate->previous_scaled_font = NULL; + + cairo_matrix_init_scale (&gstate->font_matrix, + CAIRO_GSTATE_DEFAULT_FONT_SIZE, + CAIRO_GSTATE_DEFAULT_FONT_SIZE); + + _cairo_font_options_init_default (&gstate->font_options); + + gstate->clip = NULL; + + gstate->target = cairo_surface_reference (target); + gstate->parent_target = NULL; + gstate->original_target = cairo_surface_reference (target); + + gstate->device_transform_observer.callback = _cairo_gstate_update_device_transform; + cairo_list_add (&gstate->device_transform_observer.link, + &gstate->target->device_transform_observers); + + gstate->is_identity = _cairo_matrix_is_identity (&gstate->target->device_transform); + cairo_matrix_init_identity (&gstate->ctm); + gstate->ctm_inverse = gstate->ctm; + gstate->source_ctm_inverse = gstate->ctm; + + gstate->source = (cairo_pattern_t *) &_cairo_pattern_black.base; + + /* Now that the gstate is fully initialized and ready for the eventual + * _cairo_gstate_fini(), we can check for errors (and not worry about + * the resource deallocation). */ + return target->status; +} + +/** + * _cairo_gstate_init_copy: + * + * Initialize @gstate by performing a deep copy of state fields from + * @other. Note that gstate->next is not copied but is set to %NULL by + * this function. + **/ +static cairo_status_t +_cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other) +{ + cairo_status_t status; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (gstate, sizeof (cairo_gstate_t))); + + gstate->op = other->op; + gstate->opacity = other->opacity; + + gstate->tolerance = other->tolerance; + gstate->antialias = other->antialias; + + status = _cairo_stroke_style_init_copy (&gstate->stroke_style, + &other->stroke_style); + if (unlikely (status)) + return status; + + gstate->fill_rule = other->fill_rule; + + gstate->font_face = cairo_font_face_reference (other->font_face); + gstate->scaled_font = cairo_scaled_font_reference (other->scaled_font); + gstate->previous_scaled_font = cairo_scaled_font_reference (other->previous_scaled_font); + + gstate->font_matrix = other->font_matrix; + + _cairo_font_options_init_copy (&gstate->font_options , &other->font_options); + + gstate->clip = _cairo_clip_copy (other->clip); + + gstate->target = cairo_surface_reference (other->target); + /* parent_target is always set to NULL; it's only ever set by redirect_target */ + gstate->parent_target = NULL; + gstate->original_target = cairo_surface_reference (other->original_target); + + gstate->device_transform_observer.callback = _cairo_gstate_update_device_transform; + cairo_list_add (&gstate->device_transform_observer.link, + &gstate->target->device_transform_observers); + + gstate->is_identity = other->is_identity; + gstate->ctm = other->ctm; + gstate->ctm_inverse = other->ctm_inverse; + gstate->source_ctm_inverse = other->source_ctm_inverse; + + gstate->source = cairo_pattern_reference (other->source); + + gstate->next = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gstate_fini (cairo_gstate_t *gstate) +{ + _cairo_stroke_style_fini (&gstate->stroke_style); + + cairo_font_face_destroy (gstate->font_face); + gstate->font_face = NULL; + + cairo_scaled_font_destroy (gstate->previous_scaled_font); + gstate->previous_scaled_font = NULL; + + cairo_scaled_font_destroy (gstate->scaled_font); + gstate->scaled_font = NULL; + + _cairo_clip_destroy (gstate->clip); + + cairo_list_del (&gstate->device_transform_observer.link); + + cairo_surface_destroy (gstate->target); + gstate->target = NULL; + + cairo_surface_destroy (gstate->parent_target); + gstate->parent_target = NULL; + + cairo_surface_destroy (gstate->original_target); + gstate->original_target = NULL; + + cairo_pattern_destroy (gstate->source); + gstate->source = NULL; + + VG (VALGRIND_MAKE_MEM_NOACCESS (gstate, sizeof (cairo_gstate_t))); +} + +/** + * _cairo_gstate_save: + * @gstate: input/output gstate pointer + * + * Makes a copy of the current state of @gstate and saves it + * to @gstate->next, then put the address of the newly allcated + * copy into @gstate. _cairo_gstate_restore() reverses this. + **/ +cairo_status_t +_cairo_gstate_save (cairo_gstate_t **gstate, cairo_gstate_t **freelist) +{ + cairo_gstate_t *top; + cairo_status_t status; + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + top = *freelist; + if (top == NULL) { + top = malloc (sizeof (cairo_gstate_t)); + if (unlikely (top == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + *freelist = top->next; + + status = _cairo_gstate_init_copy (top, *gstate); + if (unlikely (status)) { + top->next = *freelist; + *freelist = top; + return status; + } + + top->next = *gstate; + *gstate = top; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_gstate_restore: + * @gstate: input/output gstate pointer + * + * Reverses the effects of one _cairo_gstate_save() call. + **/ +cairo_status_t +_cairo_gstate_restore (cairo_gstate_t **gstate, cairo_gstate_t **freelist) +{ + cairo_gstate_t *top; + + top = *gstate; + if (top->next == NULL) + return _cairo_error (CAIRO_STATUS_INVALID_RESTORE); + + *gstate = top->next; + + _cairo_gstate_fini (top); + VG (VALGRIND_MAKE_MEM_UNDEFINED (&top->next, sizeof (cairo_gstate_t *))); + top->next = *freelist; + *freelist = top; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_gstate_redirect_target: + * @gstate: a #cairo_gstate_t + * @child: the new child target + * + * Redirect @gstate rendering to a "child" target. The original + * "parent" target with which the gstate was created will not be + * affected. See _cairo_gstate_get_target(). + **/ +cairo_status_t +_cairo_gstate_redirect_target (cairo_gstate_t *gstate, cairo_surface_t *child) +{ + /* If this gstate is already redirected, this is an error; we need a + * new gstate to be able to redirect */ + assert (gstate->parent_target == NULL); + + /* Set up our new parent_target based on our current target; + * gstate->parent_target will take the ref that is held by gstate->target + */ + gstate->parent_target = gstate->target; + + /* Now set up our new target; we overwrite gstate->target directly, + * since its ref is now owned by gstate->parent_target */ + gstate->target = cairo_surface_reference (child); + gstate->is_identity &= _cairo_matrix_is_identity (&child->device_transform); + cairo_list_move (&gstate->device_transform_observer.link, + &gstate->target->device_transform_observers); + + /* The clip is in surface backend coordinates for the previous target; + * translate it into the child's backend coordinates. */ + _cairo_clip_destroy (gstate->clip); + gstate->clip = _cairo_clip_copy_with_translation (gstate->next->clip, + child->device_transform.x0 - gstate->parent_target->device_transform.x0, + child->device_transform.y0 - gstate->parent_target->device_transform.y0); + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_gstate_is_group: + * @gstate: a #cairo_gstate_t + * + * Check if _cairo_gstate_redirect_target has been called on the head + * of the stack. + * + * Return value: %TRUE if @gstate is redirected to a target different + * than the previous state in the stack, %FALSE otherwise. + **/ +cairo_bool_t +_cairo_gstate_is_group (cairo_gstate_t *gstate) +{ + return gstate->parent_target != NULL; +} + +/** + * _cairo_gstate_get_target: + * @gstate: a #cairo_gstate_t + * + * Return the current drawing target; if drawing is not redirected, + * this will be the same as _cairo_gstate_get_original_target(). + * + * Return value: the current target surface + **/ +cairo_surface_t * +_cairo_gstate_get_target (cairo_gstate_t *gstate) +{ + return gstate->target; +} + +/** + * _cairo_gstate_get_original_target: + * @gstate: a #cairo_gstate_t + * + * Return the original target with which @gstate was created. This + * function always returns the original target independent of any + * child target that may have been set with + * _cairo_gstate_redirect_target. + * + * Return value: the original target surface + **/ +cairo_surface_t * +_cairo_gstate_get_original_target (cairo_gstate_t *gstate) +{ + return gstate->original_target; +} + +/** + * _cairo_gstate_get_clip: + * @gstate: a #cairo_gstate_t + * + * This space left intentionally blank. + * + * Return value: a pointer to the gstate's #cairo_clip_t structure. + **/ +cairo_clip_t * +_cairo_gstate_get_clip (cairo_gstate_t *gstate) +{ + return gstate->clip; +} + +cairo_status_t +_cairo_gstate_set_source (cairo_gstate_t *gstate, + cairo_pattern_t *source) +{ + if (source->status) + return source->status; + + source = cairo_pattern_reference (source); + cairo_pattern_destroy (gstate->source); + gstate->source = source; + gstate->source_ctm_inverse = gstate->ctm_inverse; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_pattern_t * +_cairo_gstate_get_source (cairo_gstate_t *gstate) +{ + if (gstate->source == &_cairo_pattern_black.base) { + /* do not expose the static object to the user */ + gstate->source = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK); + } + + return gstate->source; +} + +cairo_status_t +_cairo_gstate_set_operator (cairo_gstate_t *gstate, cairo_operator_t op) +{ + gstate->op = op; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_operator_t +_cairo_gstate_get_operator (cairo_gstate_t *gstate) +{ + return gstate->op; +} + +cairo_status_t +_cairo_gstate_set_opacity (cairo_gstate_t *gstate, double op) +{ + gstate->opacity = op; + + return CAIRO_STATUS_SUCCESS; +} + +double +_cairo_gstate_get_opacity (cairo_gstate_t *gstate) +{ + return gstate->opacity; +} + +cairo_status_t +_cairo_gstate_set_tolerance (cairo_gstate_t *gstate, double tolerance) +{ + gstate->tolerance = tolerance; + + return CAIRO_STATUS_SUCCESS; +} + +double +_cairo_gstate_get_tolerance (cairo_gstate_t *gstate) +{ + return gstate->tolerance; +} + +cairo_status_t +_cairo_gstate_set_fill_rule (cairo_gstate_t *gstate, cairo_fill_rule_t fill_rule) +{ + gstate->fill_rule = fill_rule; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_fill_rule_t +_cairo_gstate_get_fill_rule (cairo_gstate_t *gstate) +{ + return gstate->fill_rule; +} + +cairo_status_t +_cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width) +{ + gstate->stroke_style.line_width = width; + + return CAIRO_STATUS_SUCCESS; +} + +double +_cairo_gstate_get_line_width (cairo_gstate_t *gstate) +{ + return gstate->stroke_style.line_width; +} + +cairo_status_t +_cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap) +{ + gstate->stroke_style.line_cap = line_cap; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_line_cap_t +_cairo_gstate_get_line_cap (cairo_gstate_t *gstate) +{ + return gstate->stroke_style.line_cap; +} + +cairo_status_t +_cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join) +{ + gstate->stroke_style.line_join = line_join; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_line_join_t +_cairo_gstate_get_line_join (cairo_gstate_t *gstate) +{ + return gstate->stroke_style.line_join; +} + +cairo_status_t +_cairo_gstate_set_dash (cairo_gstate_t *gstate, const double *dash, int num_dashes, double offset) +{ + double dash_total, on_total, off_total; + int i, j; + + free (gstate->stroke_style.dash); + + gstate->stroke_style.num_dashes = num_dashes; + + if (gstate->stroke_style.num_dashes == 0) { + gstate->stroke_style.dash = NULL; + gstate->stroke_style.dash_offset = 0.0; + return CAIRO_STATUS_SUCCESS; + } + + gstate->stroke_style.dash = _cairo_malloc_ab (gstate->stroke_style.num_dashes, sizeof (double)); + if (unlikely (gstate->stroke_style.dash == NULL)) { + gstate->stroke_style.num_dashes = 0; + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + on_total = off_total = dash_total = 0.0; + for (i = j = 0; i < num_dashes; i++) { + if (dash[i] < 0) + return _cairo_error (CAIRO_STATUS_INVALID_DASH); + + if (dash[i] == 0 && i > 0 && i < num_dashes - 1) { + if (dash[++i] < 0) + return _cairo_error (CAIRO_STATUS_INVALID_DASH); + + gstate->stroke_style.dash[j-1] += dash[i]; + gstate->stroke_style.num_dashes -= 2; + } else + gstate->stroke_style.dash[j++] = dash[i]; + + if (dash[i]) { + dash_total += dash[i]; + if ((i & 1) == 0) + on_total += dash[i]; + else + off_total += dash[i]; + } + } + + if (dash_total == 0.0) + return _cairo_error (CAIRO_STATUS_INVALID_DASH); + + /* An odd dash value indicate symmetric repeating, so the total + * is twice as long. */ + if (gstate->stroke_style.num_dashes & 1) { + dash_total *= 2; + on_total += off_total; + } + + if (dash_total - on_total < CAIRO_FIXED_ERROR_DOUBLE) { + /* Degenerate dash -> solid line */ + free (gstate->stroke_style.dash); + gstate->stroke_style.dash = NULL; + gstate->stroke_style.num_dashes = 0; + gstate->stroke_style.dash_offset = 0.0; + return CAIRO_STATUS_SUCCESS; + } + + /* The dashing code doesn't like a negative offset or a big positive + * offset, so we compute an equivalent offset which is guaranteed to be + * positive and less than twice the pattern length. */ + offset = fmod (offset, dash_total); + if (offset < 0.0) + offset += dash_total; + if (offset <= 0.0) /* Take care of -0 */ + offset = 0.0; + gstate->stroke_style.dash_offset = offset; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gstate_get_dash (cairo_gstate_t *gstate, + double *dashes, + int *num_dashes, + double *offset) +{ + if (dashes) { + memcpy (dashes, + gstate->stroke_style.dash, + sizeof (double) * gstate->stroke_style.num_dashes); + } + + if (num_dashes) + *num_dashes = gstate->stroke_style.num_dashes; + + if (offset) + *offset = gstate->stroke_style.dash_offset; +} + +cairo_status_t +_cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit) +{ + gstate->stroke_style.miter_limit = limit; + + return CAIRO_STATUS_SUCCESS; +} + +double +_cairo_gstate_get_miter_limit (cairo_gstate_t *gstate) +{ + return gstate->stroke_style.miter_limit; +} + +void +_cairo_gstate_get_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix) +{ + *matrix = gstate->ctm; +} + +cairo_status_t +_cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty) +{ + cairo_matrix_t tmp; + + if (! ISFINITE (tx) || ! ISFINITE (ty)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + _cairo_gstate_unset_scaled_font (gstate); + + cairo_matrix_init_translate (&tmp, tx, ty); + cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); + gstate->is_identity = FALSE; + + /* paranoid check against gradual numerical instability */ + if (! _cairo_matrix_is_invertible (&gstate->ctm)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + cairo_matrix_init_translate (&tmp, -tx, -ty); + cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_scale (cairo_gstate_t *gstate, double sx, double sy) +{ + cairo_matrix_t tmp; + + if (sx * sy == 0.) /* either sx or sy is 0, or det == 0 due to underflow */ + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + if (! ISFINITE (sx) || ! ISFINITE (sy)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + _cairo_gstate_unset_scaled_font (gstate); + + cairo_matrix_init_scale (&tmp, sx, sy); + cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); + gstate->is_identity = FALSE; + + /* paranoid check against gradual numerical instability */ + if (! _cairo_matrix_is_invertible (&gstate->ctm)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + cairo_matrix_init_scale (&tmp, 1/sx, 1/sy); + cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_rotate (cairo_gstate_t *gstate, double angle) +{ + cairo_matrix_t tmp; + + if (angle == 0.) + return CAIRO_STATUS_SUCCESS; + + if (! ISFINITE (angle)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + _cairo_gstate_unset_scaled_font (gstate); + + cairo_matrix_init_rotate (&tmp, angle); + cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); + gstate->is_identity = FALSE; + + /* paranoid check against gradual numerical instability */ + if (! _cairo_matrix_is_invertible (&gstate->ctm)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + cairo_matrix_init_rotate (&tmp, -angle); + cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_transform (cairo_gstate_t *gstate, + const cairo_matrix_t *matrix) +{ + cairo_matrix_t tmp; + cairo_status_t status; + + if (! _cairo_matrix_is_invertible (matrix)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + if (_cairo_matrix_is_identity (matrix)) + return CAIRO_STATUS_SUCCESS; + + tmp = *matrix; + status = cairo_matrix_invert (&tmp); + if (unlikely (status)) + return status; + + _cairo_gstate_unset_scaled_font (gstate); + + cairo_matrix_multiply (&gstate->ctm, matrix, &gstate->ctm); + cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); + gstate->is_identity = FALSE; + + /* paranoid check against gradual numerical instability */ + if (! _cairo_matrix_is_invertible (&gstate->ctm)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_set_matrix (cairo_gstate_t *gstate, + const cairo_matrix_t *matrix) +{ + cairo_status_t status; + + if (memcmp (matrix, &gstate->ctm, sizeof (cairo_matrix_t)) == 0) + return CAIRO_STATUS_SUCCESS; + + if (! _cairo_matrix_is_invertible (matrix)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + if (_cairo_matrix_is_identity (matrix)) { + _cairo_gstate_identity_matrix (gstate); + return CAIRO_STATUS_SUCCESS; + } + + _cairo_gstate_unset_scaled_font (gstate); + + gstate->ctm = *matrix; + gstate->ctm_inverse = *matrix; + status = cairo_matrix_invert (&gstate->ctm_inverse); + assert (status == CAIRO_STATUS_SUCCESS); + gstate->is_identity = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gstate_identity_matrix (cairo_gstate_t *gstate) +{ + if (_cairo_matrix_is_identity (&gstate->ctm)) + return; + + _cairo_gstate_unset_scaled_font (gstate); + + cairo_matrix_init_identity (&gstate->ctm); + cairo_matrix_init_identity (&gstate->ctm_inverse); + gstate->is_identity = _cairo_matrix_is_identity (&gstate->target->device_transform); +} + +void +_cairo_gstate_user_to_device (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_point (&gstate->ctm, x, y); +} + +void +_cairo_gstate_user_to_device_distance (cairo_gstate_t *gstate, + double *dx, double *dy) +{ + cairo_matrix_transform_distance (&gstate->ctm, dx, dy); +} + +void +_cairo_gstate_device_to_user (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_point (&gstate->ctm_inverse, x, y); +} + +void +_cairo_gstate_device_to_user_distance (cairo_gstate_t *gstate, + double *dx, double *dy) +{ + cairo_matrix_transform_distance (&gstate->ctm_inverse, dx, dy); +} + +void +_do_cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_point (&gstate->ctm, x, y); + cairo_matrix_transform_point (&gstate->target->device_transform, x, y); +} + +void +_do_cairo_gstate_user_to_backend_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_distance (&gstate->ctm, x, y); + cairo_matrix_transform_distance (&gstate->target->device_transform, x, y); +} + +void +_do_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_point (&gstate->target->device_transform_inverse, x, y); + cairo_matrix_transform_point (&gstate->ctm_inverse, x, y); +} + +void +_do_cairo_gstate_backend_to_user_distance (cairo_gstate_t *gstate, double *x, double *y) +{ + cairo_matrix_transform_distance (&gstate->target->device_transform_inverse, x, y); + cairo_matrix_transform_distance (&gstate->ctm_inverse, x, y); +} + +void +_cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate, + double *x1, double *y1, + double *x2, double *y2, + cairo_bool_t *is_tight) +{ + cairo_matrix_t matrix_inverse; + + if (! _cairo_matrix_is_identity (&gstate->target->device_transform_inverse) || + ! _cairo_matrix_is_identity (&gstate->ctm_inverse)) + { + cairo_matrix_multiply (&matrix_inverse, + &gstate->target->device_transform_inverse, + &gstate->ctm_inverse); + _cairo_matrix_transform_bounding_box (&matrix_inverse, + x1, y1, x2, y2, is_tight); + } + + else + { + if (is_tight) + *is_tight = TRUE; + } +} + +/* XXX: NYI +cairo_status_t +_cairo_gstate_stroke_to_path (cairo_gstate_t *gstate) +{ + cairo_status_t status; + + _cairo_pen_init (&gstate); + return CAIRO_STATUS_SUCCESS; +} +*/ + +void +_cairo_gstate_path_extents (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double *x1, double *y1, + double *x2, double *y2) +{ + cairo_box_t box; + double px1, py1, px2, py2; + + if (_cairo_path_fixed_extents (path, &box)) { + px1 = _cairo_fixed_to_double (box.p1.x); + py1 = _cairo_fixed_to_double (box.p1.y); + px2 = _cairo_fixed_to_double (box.p2.x); + py2 = _cairo_fixed_to_double (box.p2.y); + + _cairo_gstate_backend_to_user_rectangle (gstate, + &px1, &py1, &px2, &py2, + NULL); + } else { + px1 = 0.0; + py1 = 0.0; + px2 = 0.0; + py2 = 0.0; + } + + if (x1) + *x1 = px1; + if (y1) + *y1 = py1; + if (x2) + *x2 = px2; + if (y2) + *y2 = py2; +} + +static void +_cairo_gstate_copy_pattern (cairo_pattern_t *pattern, + const cairo_pattern_t *original) +{ + /* First check if the we can replace the original with a much simpler + * pattern. For example, gradients that are uniform or just have a single + * stop can sometimes be replaced with a solid. + */ + + if (_cairo_pattern_is_clear (original)) { + _cairo_pattern_init_solid ((cairo_solid_pattern_t *) pattern, + CAIRO_COLOR_TRANSPARENT); + return; + } + + if (original->type == CAIRO_PATTERN_TYPE_LINEAR || + original->type == CAIRO_PATTERN_TYPE_RADIAL) + { + cairo_color_t color; + if (_cairo_gradient_pattern_is_solid ((cairo_gradient_pattern_t *) original, + NULL, + &color)) + { + _cairo_pattern_init_solid ((cairo_solid_pattern_t *) pattern, + &color); + return; + } + } + + _cairo_pattern_init_static_copy (pattern, original); +} + +static void +_cairo_gstate_copy_transformed_pattern (cairo_gstate_t *gstate, + cairo_pattern_t *pattern, + const cairo_pattern_t *original, + const cairo_matrix_t *ctm_inverse) +{ + _cairo_gstate_copy_pattern (pattern, original); + + /* apply device_transform first so that it is transformed by ctm_inverse */ + if (original->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern; + cairo_surface_t *surface; + + surface_pattern = (cairo_surface_pattern_t *) original; + surface = surface_pattern->surface; + + if (_cairo_surface_has_device_transform (surface)) + _cairo_pattern_pretransform (pattern, &surface->device_transform); + } + + if (! _cairo_matrix_is_identity (ctm_inverse)) + _cairo_pattern_transform (pattern, ctm_inverse); + + if (_cairo_surface_has_device_transform (gstate->target)) { + _cairo_pattern_transform (pattern, + &gstate->target->device_transform_inverse); + } +} + +static void +_cairo_gstate_copy_transformed_source (cairo_gstate_t *gstate, + cairo_pattern_t *pattern) +{ + _cairo_gstate_copy_transformed_pattern (gstate, pattern, + gstate->source, + &gstate->source_ctm_inverse); +} + +static void +_cairo_gstate_copy_transformed_mask (cairo_gstate_t *gstate, + cairo_pattern_t *pattern, + cairo_pattern_t *mask) +{ + _cairo_gstate_copy_transformed_pattern (gstate, pattern, + mask, + &gstate->ctm_inverse); +} + +static cairo_operator_t +_reduce_op (cairo_gstate_t *gstate) +{ + cairo_operator_t op; + const cairo_pattern_t *pattern; + + op = gstate->op; + if (op != CAIRO_OPERATOR_SOURCE) + return op; + + pattern = gstate->source; + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; + if (solid->color.alpha_short <= 0x00ff) { + op = CAIRO_OPERATOR_CLEAR; + } else if ((gstate->target->content & CAIRO_CONTENT_ALPHA) == 0) { + if ((solid->color.red_short | + solid->color.green_short | + solid->color.blue_short) <= 0x00ff) + { + op = CAIRO_OPERATOR_CLEAR; + } + } + } else if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + const cairo_surface_pattern_t *surface = (cairo_surface_pattern_t *) pattern; + if (surface->surface->is_clear && + surface->surface->content & CAIRO_CONTENT_ALPHA) + { + op = CAIRO_OPERATOR_CLEAR; + } + } else { + const cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; + if (gradient->n_stops == 0) + op = CAIRO_OPERATOR_CLEAR; + } + + return op; +} + +static cairo_status_t +_cairo_gstate_get_pattern_status (const cairo_pattern_t *pattern) +{ + if (unlikely (pattern->type == CAIRO_PATTERN_TYPE_MESH && + ((const cairo_mesh_pattern_t *) pattern)->current_patch)) + { + /* If current patch != NULL, the pattern is under construction + * and cannot be used as a source */ + return CAIRO_STATUS_INVALID_MESH_CONSTRUCTION; + } + + return pattern->status; +} + +cairo_status_t +_cairo_gstate_paint (cairo_gstate_t *gstate) +{ + cairo_pattern_union_t source_pattern; + const cairo_pattern_t *pattern; + cairo_status_t status; + cairo_operator_t op; + + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; + + if (gstate->op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_clip_is_all_clipped (gstate->clip)) + return CAIRO_STATUS_SUCCESS; + + op = _reduce_op (gstate); + if (op == CAIRO_OPERATOR_CLEAR) { + pattern = &_cairo_pattern_clear.base; + } else { + _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); + pattern = &source_pattern.base; + } + + return _cairo_surface_paint (gstate->target, + op, pattern, + gstate->clip); +} + +cairo_status_t +_cairo_gstate_mask (cairo_gstate_t *gstate, + cairo_pattern_t *mask) +{ + cairo_pattern_union_t source_pattern, mask_pattern; + const cairo_pattern_t *source; + cairo_operator_t op; + cairo_status_t status; + + status = _cairo_gstate_get_pattern_status (mask); + if (unlikely (status)) + return status; + + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; + + if (gstate->op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_clip_is_all_clipped (gstate->clip)) + return CAIRO_STATUS_SUCCESS; + + assert (gstate->opacity == 1.0); + + if (_cairo_pattern_is_opaque (mask, NULL)) + return _cairo_gstate_paint (gstate); + + if (_cairo_pattern_is_clear (mask) && + _cairo_operator_bounded_by_mask (gstate->op)) + { + return CAIRO_STATUS_SUCCESS; + } + + op = _reduce_op (gstate); + if (op == CAIRO_OPERATOR_CLEAR) { + source = &_cairo_pattern_clear.base; + } else { + _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); + source = &source_pattern.base; + } + _cairo_gstate_copy_transformed_mask (gstate, &mask_pattern.base, mask); + + if (source->type == CAIRO_PATTERN_TYPE_SOLID && + mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID && + _cairo_operator_bounded_by_source (op)) + { + const cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; + cairo_color_t combined; + + if (mask_pattern.base.has_component_alpha) { +#define M(R, A, B, c) R.c = A.c * B.c + M(combined, solid->color, mask_pattern.solid.color, red); + M(combined, solid->color, mask_pattern.solid.color, green); + M(combined, solid->color, mask_pattern.solid.color, blue); + M(combined, solid->color, mask_pattern.solid.color, alpha); +#undef M + } else { + combined = solid->color; + _cairo_color_multiply_alpha (&combined, mask_pattern.solid.color.alpha); + } + + _cairo_pattern_init_solid (&source_pattern.solid, &combined); + + status = _cairo_surface_paint (gstate->target, op, + &source_pattern.base, + gstate->clip); + } + else + { + status = _cairo_surface_mask (gstate->target, op, + source, + &mask_pattern.base, + gstate->clip); + } + + return status; +} + +cairo_status_t +_cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) +{ + cairo_pattern_union_t source_pattern; + cairo_stroke_style_t style; + double dash[2]; + cairo_status_t status; + cairo_matrix_t aggregate_transform; + cairo_matrix_t aggregate_transform_inverse; + + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; + + if (gstate->op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (gstate->stroke_style.line_width <= 0.0) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_clip_is_all_clipped (gstate->clip)) + return CAIRO_STATUS_SUCCESS; + + assert (gstate->opacity == 1.0); + + cairo_matrix_multiply (&aggregate_transform, + &gstate->ctm, + &gstate->target->device_transform); + cairo_matrix_multiply (&aggregate_transform_inverse, + &gstate->target->device_transform_inverse, + &gstate->ctm_inverse); + + memcpy (&style, &gstate->stroke_style, sizeof (gstate->stroke_style)); + if (_cairo_stroke_style_dash_can_approximate (&gstate->stroke_style, &aggregate_transform, gstate->tolerance)) { + style.dash = dash; + _cairo_stroke_style_dash_approximate (&gstate->stroke_style, &gstate->ctm, gstate->tolerance, + &style.dash_offset, + style.dash, + &style.num_dashes); + } + + _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); + + return _cairo_surface_stroke (gstate->target, + gstate->op, + &source_pattern.base, + path, + &style, + &aggregate_transform, + &aggregate_transform_inverse, + gstate->tolerance, + gstate->antialias, + gstate->clip); +} + +cairo_status_t +_cairo_gstate_in_stroke (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double x, + double y, + cairo_bool_t *inside_ret) +{ + cairo_status_t status; + cairo_rectangle_int_t extents; + cairo_box_t limit; + cairo_traps_t traps; + + if (gstate->stroke_style.line_width <= 0.0) { + *inside_ret = FALSE; + return CAIRO_STATUS_SUCCESS; + } + + _cairo_gstate_user_to_backend (gstate, &x, &y); + + /* Before we perform the expensive stroke analysis, + * check whether the point is within the extents of the path. + */ + _cairo_path_fixed_approximate_stroke_extents (path, + &gstate->stroke_style, + &gstate->ctm, + &extents); + if (x < extents.x || x > extents.x + extents.width || + y < extents.y || y > extents.y + extents.height) + { + *inside_ret = FALSE; + return CAIRO_STATUS_SUCCESS; + } + + limit.p1.x = _cairo_fixed_from_double (x) - 1; + limit.p1.y = _cairo_fixed_from_double (y) - 1; + limit.p2.x = limit.p1.x + 2; + limit.p2.y = limit.p1.y + 2; + + _cairo_traps_init (&traps); + _cairo_traps_limit (&traps, &limit, 1); + + status = _cairo_path_fixed_stroke_polygon_to_traps (path, + &gstate->stroke_style, + &gstate->ctm, + &gstate->ctm_inverse, + gstate->tolerance, + &traps); + if (unlikely (status)) + goto BAIL; + + *inside_ret = _cairo_traps_contain (&traps, x, y); + +BAIL: + _cairo_traps_fini (&traps); + + return status; +} + +cairo_status_t +_cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path) +{ + cairo_status_t status; + + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; + + if (gstate->op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_clip_is_all_clipped (gstate->clip)) + return CAIRO_STATUS_SUCCESS; + + assert (gstate->opacity == 1.0); + + if (_cairo_path_fixed_fill_is_empty (path)) { + if (_cairo_operator_bounded_by_mask (gstate->op)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_paint (gstate->target, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + gstate->clip); + } else { + cairo_pattern_union_t source_pattern; + const cairo_pattern_t *pattern; + cairo_operator_t op; + cairo_rectangle_int_t extents; + cairo_box_t box; + + op = _reduce_op (gstate); + if (op == CAIRO_OPERATOR_CLEAR) { + pattern = &_cairo_pattern_clear.base; + } else { + _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); + pattern = &source_pattern.base; + } + + /* Toolkits often paint the entire background with a fill */ + if (_cairo_surface_get_extents (gstate->target, &extents) && + _cairo_path_fixed_is_box (path, &box) && + box.p1.x <= _cairo_fixed_from_int (extents.x) && + box.p1.y <= _cairo_fixed_from_int (extents.y) && + box.p2.x >= _cairo_fixed_from_int (extents.x + extents.width) && + box.p2.y >= _cairo_fixed_from_int (extents.y + extents.height)) + { + status = _cairo_surface_paint (gstate->target, op, pattern, + gstate->clip); + } + else + { + status = _cairo_surface_fill (gstate->target, op, pattern, + path, + gstate->fill_rule, + gstate->tolerance, + gstate->antialias, + gstate->clip); + } + } + + return status; +} + +cairo_bool_t +_cairo_gstate_in_fill (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double x, + double y) +{ + _cairo_gstate_user_to_backend (gstate, &x, &y); + + return _cairo_path_fixed_in_fill (path, + gstate->fill_rule, + gstate->tolerance, + x, y); +} + +cairo_bool_t +_cairo_gstate_in_clip (cairo_gstate_t *gstate, + double x, + double y) +{ + cairo_clip_t *clip = gstate->clip; + int i; + + if (_cairo_clip_is_all_clipped (clip)) + return FALSE; + + if (clip == NULL) + return TRUE; + + _cairo_gstate_user_to_backend (gstate, &x, &y); + + if (x < clip->extents.x || + x >= clip->extents.x + clip->extents.width || + y < clip->extents.y || + y >= clip->extents.y + clip->extents.height) + { + return FALSE; + } + + if (clip->num_boxes) { + int fx, fy; + + fx = _cairo_fixed_from_double (x); + fy = _cairo_fixed_from_double (y); + for (i = 0; i < clip->num_boxes; i++) { + if (fx >= clip->boxes[i].p1.x && fx <= clip->boxes[i].p2.x && + fy >= clip->boxes[i].p1.y && fy <= clip->boxes[i].p2.y) + break; + } + if (i == clip->num_boxes) + return FALSE; + } + + if (clip->path) { + cairo_clip_path_t *clip_path = clip->path; + do { + if (! _cairo_path_fixed_in_fill (&clip_path->path, + clip_path->fill_rule, + clip_path->tolerance, + x, y)) + return FALSE; + } while ((clip_path = clip_path->prev) != NULL); + } + + return TRUE; +} + +cairo_status_t +_cairo_gstate_copy_page (cairo_gstate_t *gstate) +{ + cairo_surface_copy_page (gstate->target); + return cairo_surface_status (gstate->target); +} + +cairo_status_t +_cairo_gstate_show_page (cairo_gstate_t *gstate) +{ + cairo_surface_show_page (gstate->target); + return cairo_surface_status (gstate->target); +} + +static void +_cairo_gstate_extents_to_user_rectangle (cairo_gstate_t *gstate, + const cairo_box_t *extents, + double *x1, double *y1, + double *x2, double *y2) +{ + double px1, py1, px2, py2; + + px1 = _cairo_fixed_to_double (extents->p1.x); + py1 = _cairo_fixed_to_double (extents->p1.y); + px2 = _cairo_fixed_to_double (extents->p2.x); + py2 = _cairo_fixed_to_double (extents->p2.y); + + _cairo_gstate_backend_to_user_rectangle (gstate, + &px1, &py1, &px2, &py2, + NULL); + if (x1) + *x1 = px1; + if (y1) + *y1 = py1; + if (x2) + *x2 = px2; + if (y2) + *y2 = py2; +} + +cairo_status_t +_cairo_gstate_stroke_extents (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double *x1, double *y1, + double *x2, double *y2) +{ + cairo_int_status_t status; + cairo_box_t extents; + cairo_bool_t empty; + + if (x1) + *x1 = 0.0; + if (y1) + *y1 = 0.0; + if (x2) + *x2 = 0.0; + if (y2) + *y2 = 0.0; + + if (gstate->stroke_style.line_width <= 0.0) + return CAIRO_STATUS_SUCCESS; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + &gstate->stroke_style, + &gstate->ctm, + gstate->antialias, + &boxes); + empty = boxes.num_boxes == 0; + if (! empty) + _cairo_boxes_extents (&boxes, &extents); + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_polygon_t polygon; + + _cairo_polygon_init (&polygon, NULL, 0); + status = _cairo_path_fixed_stroke_to_polygon (path, + &gstate->stroke_style, + &gstate->ctm, + &gstate->ctm_inverse, + gstate->tolerance, + &polygon); + empty = polygon.num_edges == 0; + if (! empty) + extents = polygon.extents; + _cairo_polygon_fini (&polygon); + } + if (! empty) { + _cairo_gstate_extents_to_user_rectangle (gstate, &extents, + x1, y1, x2, y2); + } + + return status; +} + +cairo_status_t +_cairo_gstate_fill_extents (cairo_gstate_t *gstate, + cairo_path_fixed_t *path, + double *x1, double *y1, + double *x2, double *y2) +{ + cairo_status_t status; + cairo_box_t extents; + cairo_bool_t empty; + + if (x1) + *x1 = 0.0; + if (y1) + *y1 = 0.0; + if (x2) + *x2 = 0.0; + if (y2) + *y2 = 0.0; + + if (_cairo_path_fixed_fill_is_empty (path)) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + gstate->fill_rule, + gstate->antialias, + &boxes); + empty = boxes.num_boxes == 0; + if (! empty) + _cairo_boxes_extents (&boxes, &extents); + + _cairo_boxes_fini (&boxes); + } else { + cairo_traps_t traps; + + _cairo_traps_init (&traps); + + status = _cairo_path_fixed_fill_to_traps (path, + gstate->fill_rule, + gstate->tolerance, + &traps); + empty = traps.num_traps == 0; + if (! empty) + _cairo_traps_extents (&traps, &extents); + + _cairo_traps_fini (&traps); + } + + if (! empty) { + _cairo_gstate_extents_to_user_rectangle (gstate, &extents, + x1, y1, x2, y2); + } + + return status; +} + +cairo_status_t +_cairo_gstate_reset_clip (cairo_gstate_t *gstate) +{ + _cairo_clip_destroy (gstate->clip); + gstate->clip = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path) +{ + gstate->clip = + _cairo_clip_intersect_path (gstate->clip, + path, + gstate->fill_rule, + gstate->tolerance, + gstate->antialias); + /* XXX */ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_gstate_int_clip_extents (cairo_gstate_t *gstate, + cairo_rectangle_int_t *extents) +{ + cairo_bool_t is_bounded; + + is_bounded = _cairo_surface_get_extents (gstate->target, extents); + + if (gstate->clip) { + _cairo_rectangle_intersect (extents, + _cairo_clip_get_extents (gstate->clip)); + is_bounded = TRUE; + } + + return is_bounded; +} + +cairo_bool_t +_cairo_gstate_clip_extents (cairo_gstate_t *gstate, + double *x1, + double *y1, + double *x2, + double *y2) +{ + cairo_rectangle_int_t extents; + double px1, py1, px2, py2; + + if (! _cairo_gstate_int_clip_extents (gstate, &extents)) + return FALSE; + + px1 = extents.x; + py1 = extents.y; + px2 = extents.x + (int) extents.width; + py2 = extents.y + (int) extents.height; + + _cairo_gstate_backend_to_user_rectangle (gstate, + &px1, &py1, &px2, &py2, + NULL); + + if (x1) + *x1 = px1; + if (y1) + *y1 = py1; + if (x2) + *x2 = px2; + if (y2) + *y2 = py2; + + return TRUE; +} + +cairo_rectangle_list_t* +_cairo_gstate_copy_clip_rectangle_list (cairo_gstate_t *gstate) +{ + cairo_rectangle_int_t extents; + cairo_rectangle_list_t *list; + cairo_clip_t *clip; + + if (_cairo_surface_get_extents (gstate->target, &extents)) + clip = _cairo_clip_copy_intersect_rectangle (gstate->clip, &extents); + else + clip = gstate->clip; + + list = _cairo_clip_copy_rectangle_list (clip, gstate); + + if (clip != gstate->clip) + _cairo_clip_destroy (clip); + + return list; +} + +static void +_cairo_gstate_unset_scaled_font (cairo_gstate_t *gstate) +{ + if (gstate->scaled_font == NULL) + return; + + if (gstate->previous_scaled_font != NULL) + cairo_scaled_font_destroy (gstate->previous_scaled_font); + + gstate->previous_scaled_font = gstate->scaled_font; + gstate->scaled_font = NULL; +} + +cairo_status_t +_cairo_gstate_set_font_size (cairo_gstate_t *gstate, + double size) +{ + _cairo_gstate_unset_scaled_font (gstate); + + cairo_matrix_init_scale (&gstate->font_matrix, size, size); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_set_font_matrix (cairo_gstate_t *gstate, + const cairo_matrix_t *matrix) +{ + if (memcmp (matrix, &gstate->font_matrix, sizeof (cairo_matrix_t)) == 0) + return CAIRO_STATUS_SUCCESS; + + _cairo_gstate_unset_scaled_font (gstate); + + gstate->font_matrix = *matrix; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_gstate_get_font_matrix (cairo_gstate_t *gstate, + cairo_matrix_t *matrix) +{ + *matrix = gstate->font_matrix; +} + +void +_cairo_gstate_set_font_options (cairo_gstate_t *gstate, + const cairo_font_options_t *options) +{ + if (memcmp (options, &gstate->font_options, sizeof (cairo_font_options_t)) == 0) + return; + + _cairo_gstate_unset_scaled_font (gstate); + + _cairo_font_options_init_copy (&gstate->font_options, options); +} + +void +_cairo_gstate_get_font_options (cairo_gstate_t *gstate, + cairo_font_options_t *options) +{ + *options = gstate->font_options; +} + +cairo_status_t +_cairo_gstate_get_font_face (cairo_gstate_t *gstate, + cairo_font_face_t **font_face) +{ + cairo_status_t status; + + status = _cairo_gstate_ensure_font_face (gstate); + if (unlikely (status)) + return status; + + *font_face = gstate->font_face; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_get_scaled_font (cairo_gstate_t *gstate, + cairo_scaled_font_t **scaled_font) +{ + cairo_status_t status; + + status = _cairo_gstate_ensure_scaled_font (gstate); + if (unlikely (status)) + return status; + + *scaled_font = gstate->scaled_font; + + return CAIRO_STATUS_SUCCESS; +} + +/* + * Like everything else in this file, fonts involve Too Many Coordinate Spaces; + * it is easy to get confused about what's going on. + * + * The user's view + * --------------- + * + * Users ask for things in user space. When cairo starts, a user space unit + * is about 1/96 inch, which is similar to (but importantly different from) + * the normal "point" units most users think in terms of. When a user + * selects a font, its scale is set to "one user unit". The user can then + * independently scale the user coordinate system *or* the font matrix, in + * order to adjust the rendered size of the font. + * + * Metrics are returned in user space, whether they are obtained from + * the currently selected font in a #cairo_t or from a #cairo_scaled_font_t + * which is a font specialized to a particular scale matrix, CTM, and target + * surface. + * + * The font's view + * --------------- + * + * Fonts are designed and stored (in say .ttf files) in "font space", which + * describes an "EM Square" (a design tile) and has some abstract number + * such as 1000, 1024, or 2048 units per "EM". This is basically an + * uninteresting space for us, but we need to remember that it exists. + * + * Font resources (from libraries or operating systems) render themselves + * to a particular device. Since they do not want to make most programmers + * worry about the font design space, the scaling API is simplified to + * involve just telling the font the required pixel size of the EM square + * (that is, in device space). + * + * + * Cairo's gstate view + * ------------------- + * + * In addition to the CTM and CTM inverse, we keep a matrix in the gstate + * called the "font matrix" which describes the user's most recent + * font-scaling or font-transforming request. This is kept in terms of an + * abstract scale factor, composed with the CTM and used to set the font's + * pixel size. So if the user asks to "scale the font by 12", the matrix + * is: + * + * [ 12.0, 0.0, 0.0, 12.0, 0.0, 0.0 ] + * + * It is an affine matrix, like all cairo matrices, where its tx and ty + * components are used to "nudging" fonts around and are handled in gstate + * and then ignored by the "scaled-font" layer. + * + * In order to perform any action on a font, we must build an object + * called a #cairo_font_scale_t; this contains the central 2x2 matrix + * resulting from "font matrix * CTM" (sans the font matrix translation + * components as stated in the previous paragraph). + * + * We pass this to the font when making requests of it, which causes it to + * reply for a particular [user request, device] combination, under the CTM + * (to accommodate the "zoom in" == "bigger fonts" issue above). + * + * The other terms in our communication with the font are therefore in + * device space. When we ask it to perform text->glyph conversion, it will + * produce a glyph string in device space. Glyph vectors we pass to it for + * measuring or rendering should be in device space. The metrics which we + * get back from the font will be in device space. The contents of the + * global glyph image cache will be in device space. + * + * + * Cairo's public view + * ------------------- + * + * Since the values entering and leaving via public API calls are in user + * space, the gstate functions typically need to multiply arguments by the + * CTM (for user-input glyph vectors), and return values by the CTM inverse + * (for font responses such as metrics or glyph vectors). + * + */ + +static cairo_status_t +_cairo_gstate_ensure_font_face (cairo_gstate_t *gstate) +{ + cairo_font_face_t *font_face; + + if (gstate->font_face != NULL) + return gstate->font_face->status; + + + font_face = cairo_toy_font_face_create (CAIRO_FONT_FAMILY_DEFAULT, + CAIRO_FONT_SLANT_DEFAULT, + CAIRO_FONT_WEIGHT_DEFAULT); + if (font_face->status) + return font_face->status; + + gstate->font_face = font_face; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_gstate_ensure_scaled_font (cairo_gstate_t *gstate) +{ + cairo_status_t status; + cairo_font_options_t options; + cairo_scaled_font_t *scaled_font; + cairo_matrix_t font_ctm; + + if (gstate->scaled_font != NULL) + return gstate->scaled_font->status; + + status = _cairo_gstate_ensure_font_face (gstate); + if (unlikely (status)) + return status; + + cairo_surface_get_font_options (gstate->target, &options); + cairo_font_options_merge (&options, &gstate->font_options); + + cairo_matrix_multiply (&font_ctm, + &gstate->ctm, + &gstate->target->device_transform); + + scaled_font = cairo_scaled_font_create (gstate->font_face, + &gstate->font_matrix, + &font_ctm, + &options); + + status = cairo_scaled_font_status (scaled_font); + if (unlikely (status)) + return status; + + gstate->scaled_font = scaled_font; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_get_font_extents (cairo_gstate_t *gstate, + cairo_font_extents_t *extents) +{ + cairo_status_t status = _cairo_gstate_ensure_scaled_font (gstate); + if (unlikely (status)) + return status; + + cairo_scaled_font_extents (gstate->scaled_font, extents); + + return cairo_scaled_font_status (gstate->scaled_font); +} + +cairo_status_t +_cairo_gstate_set_font_face (cairo_gstate_t *gstate, + cairo_font_face_t *font_face) +{ + if (font_face && font_face->status) + return _cairo_error (font_face->status); + + if (font_face == gstate->font_face) + return CAIRO_STATUS_SUCCESS; + + cairo_font_face_destroy (gstate->font_face); + gstate->font_face = cairo_font_face_reference (font_face); + + _cairo_gstate_unset_scaled_font (gstate); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_gstate_glyph_extents (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents) +{ + cairo_status_t status; + + status = _cairo_gstate_ensure_scaled_font (gstate); + if (unlikely (status)) + return status; + + cairo_scaled_font_glyph_extents (gstate->scaled_font, + glyphs, num_glyphs, + extents); + + return cairo_scaled_font_status (gstate->scaled_font); +} + +cairo_status_t +_cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_glyph_text_info_t *info) +{ + cairo_glyph_t stack_transformed_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)]; + cairo_text_cluster_t stack_transformed_clusters[CAIRO_STACK_ARRAY_LENGTH (cairo_text_cluster_t)]; + cairo_pattern_union_t source_pattern; + cairo_glyph_t *transformed_glyphs; + const cairo_pattern_t *pattern; + cairo_text_cluster_t *transformed_clusters; + cairo_operator_t op; + cairo_status_t status; + + status = _cairo_gstate_get_pattern_status (gstate->source); + if (unlikely (status)) + return status; + + if (gstate->op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_clip_is_all_clipped (gstate->clip)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_gstate_ensure_scaled_font (gstate); + if (unlikely (status)) + return status; + + transformed_glyphs = stack_transformed_glyphs; + transformed_clusters = stack_transformed_clusters; + + if (num_glyphs > ARRAY_LENGTH (stack_transformed_glyphs)) { + transformed_glyphs = cairo_glyph_allocate (num_glyphs); + if (unlikely (transformed_glyphs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + if (info != NULL) { + if (info->num_clusters > ARRAY_LENGTH (stack_transformed_clusters)) { + transformed_clusters = cairo_text_cluster_allocate (info->num_clusters); + if (unlikely (transformed_clusters == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_GLYPHS; + } + } + + _cairo_gstate_transform_glyphs_to_backend (gstate, + glyphs, num_glyphs, + info->clusters, + info->num_clusters, + info->cluster_flags, + transformed_glyphs, + &num_glyphs, + transformed_clusters); + } else { + _cairo_gstate_transform_glyphs_to_backend (gstate, + glyphs, num_glyphs, + NULL, 0, 0, + transformed_glyphs, + &num_glyphs, + NULL); + } + + if (num_glyphs == 0) + goto CLEANUP_GLYPHS; + + op = _reduce_op (gstate); + if (op == CAIRO_OPERATOR_CLEAR) { + pattern = &_cairo_pattern_clear.base; + } else { + _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); + pattern = &source_pattern.base; + } + + /* For really huge font sizes, we can just do path;fill instead of + * show_glyphs, as show_glyphs would put excess pressure on the cache, + * and moreover, not all components below us correctly handle huge font + * sizes. I wanted to set the limit at 256. But alas, seems like cairo's + * rasterizer is something like ten times slower than freetype's for huge + * sizes. So, no win just yet. For now, do it for insanely-huge sizes, + * just to make sure we don't make anyone unhappy. When we get a really + * fast rasterizer in cairo, we may want to readjust this. + * + * Needless to say, do this only if show_text_glyphs is not available. */ + if (cairo_surface_has_show_text_glyphs (gstate->target) || + _cairo_scaled_font_get_max_scale (gstate->scaled_font) <= 10240) + { + + if (info != NULL) { + status = _cairo_surface_show_text_glyphs (gstate->target, op, pattern, + info->utf8, info->utf8_len, + transformed_glyphs, num_glyphs, + transformed_clusters, info->num_clusters, + info->cluster_flags, + gstate->scaled_font, + gstate->clip); + } else { + status = _cairo_surface_show_text_glyphs (gstate->target, op, pattern, + NULL, 0, + transformed_glyphs, num_glyphs, + NULL, 0, 0, + gstate->scaled_font, + gstate->clip); + } + } + else + { + cairo_path_fixed_t path; + + _cairo_path_fixed_init (&path); + + status = _cairo_scaled_font_glyph_path (gstate->scaled_font, + transformed_glyphs, num_glyphs, + &path); + + if (status == CAIRO_STATUS_SUCCESS) { + status = _cairo_surface_fill (gstate->target, op, pattern, + &path, + CAIRO_FILL_RULE_WINDING, + gstate->tolerance, + gstate->scaled_font->options.antialias, + gstate->clip); + } + + _cairo_path_fixed_fini (&path); + } + +CLEANUP_GLYPHS: + if (transformed_glyphs != stack_transformed_glyphs) + cairo_glyph_free (transformed_glyphs); + if (transformed_clusters != stack_transformed_clusters) + cairo_text_cluster_free (transformed_clusters); + + return status; +} + +cairo_status_t +_cairo_gstate_glyph_path (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_path_fixed_t *path) +{ + cairo_glyph_t stack_transformed_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)]; + cairo_glyph_t *transformed_glyphs; + cairo_status_t status; + + status = _cairo_gstate_ensure_scaled_font (gstate); + if (unlikely (status)) + return status; + + if (num_glyphs < ARRAY_LENGTH (stack_transformed_glyphs)) { + transformed_glyphs = stack_transformed_glyphs; + } else { + transformed_glyphs = cairo_glyph_allocate (num_glyphs); + if (unlikely (transformed_glyphs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_gstate_transform_glyphs_to_backend (gstate, + glyphs, num_glyphs, + NULL, 0, 0, + transformed_glyphs, + &num_glyphs, NULL); + + status = _cairo_scaled_font_glyph_path (gstate->scaled_font, + transformed_glyphs, num_glyphs, + path); + + if (transformed_glyphs != stack_transformed_glyphs) + cairo_glyph_free (transformed_glyphs); + + return status; +} + +cairo_status_t +_cairo_gstate_set_antialias (cairo_gstate_t *gstate, + cairo_antialias_t antialias) +{ + gstate->antialias = antialias; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_antialias_t +_cairo_gstate_get_antialias (cairo_gstate_t *gstate) +{ + return gstate->antialias; +} + +/** + * _cairo_gstate_transform_glyphs_to_backend: + * @gstate: a #cairo_gstate_t + * @glyphs: the array of #cairo_glyph_t objects to be transformed + * @num_glyphs: the number of elements in @glyphs + * @transformed_glyphs: a pre-allocated array of at least @num_glyphs + * #cairo_glyph_t objects + * @num_transformed_glyphs: the number of elements in @transformed_glyphs + * after dropping out of bounds glyphs, or %NULL if glyphs shouldn't be + * dropped + * + * Transform an array of glyphs to backend space by first adding the offset + * of the font matrix, then transforming from user space to backend space. + * The result of the transformation is placed in @transformed_glyphs. + * + * This also uses information from the scaled font and the surface to + * cull/drop glyphs that will not be visible. + **/ +static void +_cairo_gstate_transform_glyphs_to_backend (cairo_gstate_t *gstate, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_glyph_t *transformed_glyphs, + int *num_transformed_glyphs, + cairo_text_cluster_t *transformed_clusters) +{ + cairo_rectangle_int_t surface_extents; + cairo_matrix_t *ctm = &gstate->ctm; + cairo_matrix_t *font_matrix = &gstate->font_matrix; + cairo_matrix_t *device_transform = &gstate->target->device_transform; + cairo_bool_t drop = FALSE; + double x1 = 0, x2 = 0, y1 = 0, y2 = 0; + int i, j, k; + + drop = TRUE; + if (! _cairo_gstate_int_clip_extents (gstate, &surface_extents)) { + drop = FALSE; /* unbounded surface */ + } else { + double scale10 = 10 * _cairo_scaled_font_get_max_scale (gstate->scaled_font); + if (surface_extents.width == 0 || surface_extents.height == 0) { + /* No visible area. Don't draw anything */ + *num_transformed_glyphs = 0; + return; + } + /* XXX We currently drop any glyphs that has its position outside + * of the surface boundaries by a safety margin depending on the + * font scale. This however can fail in extreme cases where the + * font has really long swashes for example... We can correctly + * handle that by looking the glyph up and using its device bbox + * to device if it's going to be visible, but I'm not inclined to + * do that now. + */ + x1 = surface_extents.x - scale10; + y1 = surface_extents.y - scale10; + x2 = surface_extents.x + (int) surface_extents.width + scale10; + y2 = surface_extents.y + (int) surface_extents.height + scale10; + } + + if (!drop) + *num_transformed_glyphs = num_glyphs; + +#define KEEP_GLYPH(glyph) (x1 <= glyph.x && glyph.x <= x2 && y1 <= glyph.y && glyph.y <= y2) + + j = 0; + if (_cairo_matrix_is_identity (ctm) && + _cairo_matrix_is_identity (device_transform) && + font_matrix->x0 == 0 && font_matrix->y0 == 0) + { + if (! drop) { + memcpy (transformed_glyphs, glyphs, + num_glyphs * sizeof (cairo_glyph_t)); + memcpy (transformed_clusters, clusters, + num_clusters * sizeof (cairo_text_cluster_t)); + j = num_glyphs; + } else if (num_clusters == 0) { + for (i = 0; i < num_glyphs; i++) { + transformed_glyphs[j].index = glyphs[i].index; + transformed_glyphs[j].x = glyphs[i].x; + transformed_glyphs[j].y = glyphs[i].y; + if (KEEP_GLYPH (transformed_glyphs[j])) + j++; + } + } else { + const cairo_glyph_t *cur_glyph; + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph = glyphs + num_glyphs - 1; + else + cur_glyph = glyphs; + + for (i = 0; i < num_clusters; i++) { + cairo_bool_t cluster_visible = FALSE; + + for (k = 0; k < clusters[i].num_glyphs; k++) { + transformed_glyphs[j+k].index = cur_glyph->index; + transformed_glyphs[j+k].x = cur_glyph->x; + transformed_glyphs[j+k].y = cur_glyph->y; + if (KEEP_GLYPH (transformed_glyphs[j+k])) + cluster_visible = TRUE; + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph--; + else + cur_glyph++; + } + + transformed_clusters[i] = clusters[i]; + if (cluster_visible) + j += k; + else + transformed_clusters[i].num_glyphs = 0; + } + } + } + else if (_cairo_matrix_is_translation (ctm) && + _cairo_matrix_is_translation (device_transform)) + { + double tx = font_matrix->x0 + ctm->x0 + device_transform->x0; + double ty = font_matrix->y0 + ctm->y0 + device_transform->y0; + + if (! drop || num_clusters == 0) { + for (i = 0; i < num_glyphs; i++) { + transformed_glyphs[j].index = glyphs[i].index; + transformed_glyphs[j].x = glyphs[i].x + tx; + transformed_glyphs[j].y = glyphs[i].y + ty; + if (!drop || KEEP_GLYPH (transformed_glyphs[j])) + j++; + } + memcpy (transformed_clusters, clusters, + num_clusters * sizeof (cairo_text_cluster_t)); + } else { + const cairo_glyph_t *cur_glyph; + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph = glyphs + num_glyphs - 1; + else + cur_glyph = glyphs; + + for (i = 0; i < num_clusters; i++) { + cairo_bool_t cluster_visible = FALSE; + + for (k = 0; k < clusters[i].num_glyphs; k++) { + transformed_glyphs[j+k].index = cur_glyph->index; + transformed_glyphs[j+k].x = cur_glyph->x + tx; + transformed_glyphs[j+k].y = cur_glyph->y + ty; + if (KEEP_GLYPH (transformed_glyphs[j+k])) + cluster_visible = TRUE; + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph--; + else + cur_glyph++; + } + + transformed_clusters[i] = clusters[i]; + if (cluster_visible) + j += k; + else + transformed_clusters[i].num_glyphs = 0; + } + } + } + else + { + cairo_matrix_t aggregate_transform; + + cairo_matrix_init_translate (&aggregate_transform, + gstate->font_matrix.x0, + gstate->font_matrix.y0); + cairo_matrix_multiply (&aggregate_transform, + &aggregate_transform, ctm); + cairo_matrix_multiply (&aggregate_transform, + &aggregate_transform, device_transform); + + if (! drop || num_clusters == 0) { + for (i = 0; i < num_glyphs; i++) { + transformed_glyphs[j] = glyphs[i]; + cairo_matrix_transform_point (&aggregate_transform, + &transformed_glyphs[j].x, + &transformed_glyphs[j].y); + if (! drop || KEEP_GLYPH (transformed_glyphs[j])) + j++; + } + memcpy (transformed_clusters, clusters, + num_clusters * sizeof (cairo_text_cluster_t)); + } else { + const cairo_glyph_t *cur_glyph; + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph = glyphs + num_glyphs - 1; + else + cur_glyph = glyphs; + + for (i = 0; i < num_clusters; i++) { + cairo_bool_t cluster_visible = FALSE; + for (k = 0; k < clusters[i].num_glyphs; k++) { + transformed_glyphs[j+k] = *cur_glyph; + cairo_matrix_transform_point (&aggregate_transform, + &transformed_glyphs[j+k].x, + &transformed_glyphs[j+k].y); + if (KEEP_GLYPH (transformed_glyphs[j+k])) + cluster_visible = TRUE; + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph--; + else + cur_glyph++; + } + + transformed_clusters[i] = clusters[i]; + if (cluster_visible) + j += k; + else + transformed_clusters[i].num_glyphs = 0; + } + } + } + *num_transformed_glyphs = j; + + if (num_clusters != 0 && cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) { + for (i = 0; i < --j; i++) { + cairo_glyph_t tmp; + + tmp = transformed_glyphs[i]; + transformed_glyphs[i] = transformed_glyphs[j]; + transformed_glyphs[j] = tmp; + } + } +} diff --git a/src/cairo-hash-private.h b/src/cairo-hash-private.h new file mode 100644 index 000000000..30e51ffe6 --- /dev/null +++ b/src/cairo-hash-private.h @@ -0,0 +1,87 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Keith Packard + * Graydon Hoare + * Carl Worth + */ + +#ifndef CAIRO_HASH_PRIVATE_H +#define CAIRO_HASH_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" + +/* XXX: I'd like this file to be self-contained in terms of + * includeability, but that's not really possible with the current + * monolithic cairoint.h. So, for now, just include cairoint.h instead + * if you want to include this file. */ + +typedef cairo_bool_t +(*cairo_hash_keys_equal_func_t) (const void *key_a, const void *key_b); + +typedef cairo_bool_t +(*cairo_hash_predicate_func_t) (const void *entry); + +typedef void +(*cairo_hash_callback_func_t) (void *entry, + void *closure); + +cairo_private cairo_hash_table_t * +_cairo_hash_table_create (cairo_hash_keys_equal_func_t keys_equal); + +cairo_private void +_cairo_hash_table_destroy (cairo_hash_table_t *hash_table); + +cairo_private void * +_cairo_hash_table_lookup (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key); + +cairo_private void * +_cairo_hash_table_random_entry (cairo_hash_table_t *hash_table, + cairo_hash_predicate_func_t predicate); + +cairo_private cairo_status_t +_cairo_hash_table_insert (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *entry); + +cairo_private void +_cairo_hash_table_remove (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key); + +cairo_private void +_cairo_hash_table_foreach (cairo_hash_table_t *hash_table, + cairo_hash_callback_func_t hash_callback, + void *closure); + +#endif diff --git a/src/cairo-hash.c b/src/cairo-hash.c new file mode 100644 index 000000000..928c74b8b --- /dev/null +++ b/src/cairo-hash.c @@ -0,0 +1,578 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Keith Packard + * Graydon Hoare + * Carl Worth + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +/* + * An entry can be in one of three states: + * + * FREE: Entry has never been used, terminates all searches. + * Appears in the table as a %NULL pointer. + * + * DEAD: Entry had been live in the past. A dead entry can be reused + * but does not terminate a search for an exact entry. + * Appears in the table as a pointer to DEAD_ENTRY. + * + * LIVE: Entry is currently being used. + * Appears in the table as any non-%NULL, non-DEAD_ENTRY pointer. + */ + +#define DEAD_ENTRY ((cairo_hash_entry_t *) 0x1) + +#define ENTRY_IS_FREE(entry) ((entry) == NULL) +#define ENTRY_IS_DEAD(entry) ((entry) == DEAD_ENTRY) +#define ENTRY_IS_LIVE(entry) ((entry) > DEAD_ENTRY) + +/* + * This table is open-addressed with double hashing. Each table size + * is a prime and it makes for the "first" hash modulus; a second + * prime (2 less than the first prime) serves as the "second" hash + * modulus, which is smaller and thus guarantees a complete + * permutation of table indices. + * + * Hash tables are rehashed in order to keep between 12.5% and 50% + * entries in the hash table alive and at least 25% free. When table + * size is changed, the new table has about 25% live elements. + * + * The free entries guarantee an expected constant-time lookup. + * Doubling/halving the table in the described fashion guarantees + * amortized O(1) insertion/removal. + * + * This structure, and accompanying table, is borrowed/modified from the + * file xserver/render/glyph.c in the freedesktop.org x server, with + * permission (and suggested modification of doubling sizes) by Keith + * Packard. + */ + +static const unsigned long hash_table_sizes[] = { + 43, + 73, + 151, + 283, + 571, + 1153, + 2269, + 4519, + 9013, + 18043, + 36109, + 72091, + 144409, + 288361, + 576883, + 1153459, + 2307163, + 4613893, + 9227641, + 18455029, + 36911011, + 73819861, + 147639589, + 295279081, + 590559793 +}; + +struct _cairo_hash_table { + cairo_hash_keys_equal_func_t keys_equal; + + cairo_hash_entry_t *cache[32]; + + const unsigned long *table_size; + cairo_hash_entry_t **entries; + + unsigned long live_entries; + unsigned long free_entries; + unsigned long iterating; /* Iterating, no insert, no resize */ +}; + +/** + * _cairo_hash_table_uid_keys_equal: + * @key_a: the first key to be compared + * @key_b: the second key to be compared + * + * Provides a #cairo_hash_keys_equal_func_t which always returns + * %TRUE. This is useful to create hash tables using keys whose hash + * completely describes the key, because in this special case + * comparing the hashes is sufficient to guarantee that the keys are + * equal. + * + * Return value: %TRUE. + **/ +static cairo_bool_t +_cairo_hash_table_uid_keys_equal (const void *key_a, const void *key_b) +{ + return TRUE; +} + +/** + * _cairo_hash_table_create: + * @keys_equal: a function to return %TRUE if two keys are equal + * + * Creates a new hash table which will use the keys_equal() function + * to compare hash keys. Data is provided to the hash table in the + * form of user-derived versions of #cairo_hash_entry_t. A hash entry + * must be able to hold both a key (including a hash code) and a + * value. Sometimes only the key will be necessary, (as in + * _cairo_hash_table_remove), and other times both a key and a value + * will be necessary, (as in _cairo_hash_table_insert). + * + * If @keys_equal is %NULL, two keys will be considered equal if and + * only if their hashes are equal. + * + * See #cairo_hash_entry_t for more details. + * + * Return value: the new hash table or %NULL if out of memory. + **/ +cairo_hash_table_t * +_cairo_hash_table_create (cairo_hash_keys_equal_func_t keys_equal) +{ + cairo_hash_table_t *hash_table; + + hash_table = malloc (sizeof (cairo_hash_table_t)); + if (unlikely (hash_table == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + if (keys_equal == NULL) + hash_table->keys_equal = _cairo_hash_table_uid_keys_equal; + else + hash_table->keys_equal = keys_equal; + + memset (&hash_table->cache, 0, sizeof (hash_table->cache)); + hash_table->table_size = &hash_table_sizes[0]; + + hash_table->entries = calloc (*hash_table->table_size, + sizeof (cairo_hash_entry_t *)); + if (unlikely (hash_table->entries == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + free (hash_table); + return NULL; + } + + hash_table->live_entries = 0; + hash_table->free_entries = *hash_table->table_size; + hash_table->iterating = 0; + + return hash_table; +} + +/** + * _cairo_hash_table_destroy: + * @hash_table: an empty hash table to destroy + * + * Immediately destroys the given hash table, freeing all resources + * associated with it. + * + * WARNING: The hash_table must have no live entries in it before + * _cairo_hash_table_destroy is called. It is a fatal error otherwise, + * and this function will halt. The rationale for this behavior is to + * avoid memory leaks and to avoid needless complication of the API + * with destroy notifiy callbacks. + * + * WARNING: The hash_table must have no running iterators in it when + * _cairo_hash_table_destroy is called. It is a fatal error otherwise, + * and this function will halt. + **/ +void +_cairo_hash_table_destroy (cairo_hash_table_t *hash_table) +{ + /* The hash table must be empty. Otherwise, halt. */ + assert (hash_table->live_entries == 0); + /* No iterators can be running. Otherwise, halt. */ + assert (hash_table->iterating == 0); + + free (hash_table->entries); + free (hash_table); +} + +static cairo_hash_entry_t ** +_cairo_hash_table_lookup_unique_key (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key) +{ + unsigned long table_size, i, idx, step; + cairo_hash_entry_t **entry; + + table_size = *hash_table->table_size; + idx = key->hash % table_size; + + entry = &hash_table->entries[idx]; + if (! ENTRY_IS_LIVE (*entry)) + return entry; + + i = 1; + step = 1 + key->hash % (table_size - 2); + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = &hash_table->entries[idx]; + if (! ENTRY_IS_LIVE (*entry)) + return entry; + } while (++i < table_size); + + ASSERT_NOT_REACHED; + return NULL; +} + +/** + * _cairo_hash_table_manage: + * @hash_table: a hash table + * + * Resize the hash table if the number of entries has gotten much + * bigger or smaller than the ideal number of entries for the current + * size and guarantee some free entries to be used as lookup + * termination points. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if out of memory. + **/ +static cairo_status_t +_cairo_hash_table_manage (cairo_hash_table_t *hash_table) +{ + cairo_hash_table_t tmp; + unsigned long new_size, i; + + /* Keep between 12.5% and 50% entries in the hash table alive and + * at least 25% free. */ + unsigned long live_high = *hash_table->table_size >> 1; + unsigned long live_low = live_high >> 2; + unsigned long free_low = live_high >> 1; + + tmp = *hash_table; + + if (hash_table->live_entries > live_high) + { + tmp.table_size = hash_table->table_size + 1; + /* This code is being abused if we can't make a table big enough. */ + assert (tmp.table_size - hash_table_sizes < + ARRAY_LENGTH (hash_table_sizes)); + } + else if (hash_table->live_entries < live_low) + { + /* Can't shrink if we're at the smallest size */ + if (hash_table->table_size == &hash_table_sizes[0]) + tmp.table_size = hash_table->table_size; + else + tmp.table_size = hash_table->table_size - 1; + } + + if (tmp.table_size == hash_table->table_size && + hash_table->free_entries > free_low) + { + /* The number of live entries is within the desired bounds + * (we're not going to resize the table) and we have enough + * free entries. Do nothing. */ + return CAIRO_STATUS_SUCCESS; + } + + new_size = *tmp.table_size; + tmp.entries = calloc (new_size, sizeof (cairo_hash_entry_t*)); + if (unlikely (tmp.entries == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + for (i = 0; i < *hash_table->table_size; ++i) { + if (ENTRY_IS_LIVE (hash_table->entries[i])) { + *_cairo_hash_table_lookup_unique_key (&tmp, hash_table->entries[i]) + = hash_table->entries[i]; + } + } + + free (hash_table->entries); + hash_table->entries = tmp.entries; + hash_table->table_size = tmp.table_size; + hash_table->free_entries = new_size - hash_table->live_entries; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_hash_table_lookup: + * @hash_table: a hash table + * @key: the key of interest + * + * Performs a lookup in @hash_table looking for an entry which has a + * key that matches @key, (as determined by the keys_equal() function + * passed to _cairo_hash_table_create). + * + * Return value: the matching entry, of %NULL if no match was found. + **/ +void * +_cairo_hash_table_lookup (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key) +{ + cairo_hash_entry_t *entry; + unsigned long table_size, i, idx, step; + unsigned long hash = key->hash; + + entry = hash_table->cache[hash & 31]; + if (entry && entry->hash == hash && hash_table->keys_equal (key, entry)) + return entry; + + table_size = *hash_table->table_size; + idx = hash % table_size; + + entry = hash_table->entries[idx]; + if (ENTRY_IS_LIVE (entry)) { + if (entry->hash == hash && hash_table->keys_equal (key, entry)) + goto insert_cache; + } else if (ENTRY_IS_FREE (entry)) + return NULL; + + i = 1; + step = 1 + hash % (table_size - 2); + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = hash_table->entries[idx]; + if (ENTRY_IS_LIVE (entry)) { + if (entry->hash == hash && hash_table->keys_equal (key, entry)) + goto insert_cache; + } else if (ENTRY_IS_FREE (entry)) + return NULL; + } while (++i < table_size); + + ASSERT_NOT_REACHED; + return NULL; + +insert_cache: + hash_table->cache[hash & 31] = entry; + return entry; +} + +/** + * _cairo_hash_table_random_entry: + * @hash_table: a hash table + * @predicate: a predicate function. + * + * Find a random entry in the hash table satisfying the given + * @predicate. + * + * We use the same algorithm as the lookup algorithm to walk over the + * entries in the hash table in a pseudo-random order. Walking + * linearly would favor entries following gaps in the hash table. We + * could also call rand() repeatedly, which works well for almost-full + * tables, but degrades when the table is almost empty, or predicate + * returns %TRUE for most entries. + * + * Return value: a random live entry or %NULL if there are no entries + * that match the given predicate. In particular, if predicate is + * %NULL, a %NULL return value indicates that the table is empty. + **/ +void * +_cairo_hash_table_random_entry (cairo_hash_table_t *hash_table, + cairo_hash_predicate_func_t predicate) +{ + cairo_hash_entry_t *entry; + unsigned long hash; + unsigned long table_size, i, idx, step; + + assert (predicate != NULL); + + table_size = *hash_table->table_size; + hash = rand (); + idx = hash % table_size; + + entry = hash_table->entries[idx]; + if (ENTRY_IS_LIVE (entry) && predicate (entry)) + return entry; + + i = 1; + step = 1 + hash % (table_size - 2); + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = hash_table->entries[idx]; + if (ENTRY_IS_LIVE (entry) && predicate (entry)) + return entry; + } while (++i < table_size); + + return NULL; +} + +/** + * _cairo_hash_table_insert: + * @hash_table: a hash table + * @key_and_value: an entry to be inserted + * + * Insert the entry #key_and_value into the hash table. + * + * WARNING: There must not be an existing entry in the hash table + * with a matching key. + * + * WARNING: It is a fatal error to insert an element while + * an iterator is running + * + * Instead of using insert to replace an entry, consider just editing + * the entry obtained with _cairo_hash_table_lookup. Or if absolutely + * necessary, use _cairo_hash_table_remove first. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if insufficient memory is available. + **/ +cairo_status_t +_cairo_hash_table_insert (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key_and_value) +{ + cairo_hash_entry_t **entry; + cairo_status_t status; + + /* Insert is illegal while an iterator is running. */ + assert (hash_table->iterating == 0); + + status = _cairo_hash_table_manage (hash_table); + if (unlikely (status)) + return status; + + entry = _cairo_hash_table_lookup_unique_key (hash_table, key_and_value); + + if (ENTRY_IS_FREE (*entry)) + hash_table->free_entries--; + + *entry = key_and_value; + hash_table->cache[key_and_value->hash & 31] = key_and_value; + hash_table->live_entries++; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_hash_entry_t ** +_cairo_hash_table_lookup_exact_key (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key) +{ + unsigned long table_size, i, idx, step; + cairo_hash_entry_t **entry; + + table_size = *hash_table->table_size; + idx = key->hash % table_size; + + entry = &hash_table->entries[idx]; + if (*entry == key) + return entry; + + i = 1; + step = 1 + key->hash % (table_size - 2); + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = &hash_table->entries[idx]; + if (*entry == key) + return entry; + } while (++i < table_size); + + ASSERT_NOT_REACHED; + return NULL; +} +/** + * _cairo_hash_table_remove: + * @hash_table: a hash table + * @key: key of entry to be removed + * + * Remove an entry from the hash table which points to @key. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if out of memory. + **/ +void +_cairo_hash_table_remove (cairo_hash_table_t *hash_table, + cairo_hash_entry_t *key) +{ + *_cairo_hash_table_lookup_exact_key (hash_table, key) = DEAD_ENTRY; + hash_table->live_entries--; + hash_table->cache[key->hash & 31] = NULL; + + /* Check for table resize. Don't do this when iterating as this will + * reorder elements of the table and cause the iteration to potentially + * skip some elements. */ + if (hash_table->iterating == 0) { + /* This call _can_ fail, but only in failing to allocate new + * memory to shrink the hash table. It does leave the table in a + * consistent state, and we've already succeeded in removing the + * entry, so we don't examine the failure status of this call. */ + _cairo_hash_table_manage (hash_table); + } +} + +/** + * _cairo_hash_table_foreach: + * @hash_table: a hash table + * @hash_callback: function to be called for each live entry + * @closure: additional argument to be passed to @hash_callback + * + * Call @hash_callback for each live entry in the hash table, in a + * non-specified order. + * + * Entries in @hash_table may be removed by code executed from @hash_callback. + * + * Entries may not be inserted to @hash_table, nor may @hash_table + * be destroyed by code executed from @hash_callback. The relevant + * functions will halt in these cases. + **/ +void +_cairo_hash_table_foreach (cairo_hash_table_t *hash_table, + cairo_hash_callback_func_t hash_callback, + void *closure) +{ + unsigned long i; + cairo_hash_entry_t *entry; + + /* Mark the table for iteration */ + ++hash_table->iterating; + for (i = 0; i < *hash_table->table_size; i++) { + entry = hash_table->entries[i]; + if (ENTRY_IS_LIVE(entry)) + hash_callback (entry, closure); + } + /* If some elements were deleted during the iteration, + * the table may need resizing. Just do this every time + * as the check is inexpensive. + */ + if (--hash_table->iterating == 0) { + /* Should we fail to shrink the hash table, it is left unaltered, + * and we don't need to propagate the error status. */ + _cairo_hash_table_manage (hash_table); + } +} diff --git a/src/cairo-hull.c b/src/cairo-hull.c new file mode 100644 index 000000000..c65593327 --- /dev/null +++ b/src/cairo-hull.c @@ -0,0 +1,235 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-slope-private.h" + +typedef struct cairo_hull { + cairo_point_t point; + cairo_slope_t slope; + int discard; + int id; +} cairo_hull_t; + +static void +_cairo_hull_init (cairo_hull_t *hull, + cairo_pen_vertex_t *vertices, + int num_vertices) +{ + cairo_point_t *p, *extremum, tmp; + int i; + + extremum = &vertices[0].point; + for (i = 1; i < num_vertices; i++) { + p = &vertices[i].point; + if (p->y < extremum->y || (p->y == extremum->y && p->x < extremum->x)) + extremum = p; + } + /* Put the extremal point at the beginning of the array */ + tmp = *extremum; + *extremum = vertices[0].point; + vertices[0].point = tmp; + + for (i = 0; i < num_vertices; i++) { + hull[i].point = vertices[i].point; + _cairo_slope_init (&hull[i].slope, &hull[0].point, &hull[i].point); + + /* give each point a unique id for later comparison */ + hull[i].id = i; + + /* Don't discard by default */ + hull[i].discard = 0; + + /* Discard all points coincident with the extremal point */ + if (i != 0 && hull[i].slope.dx == 0 && hull[i].slope.dy == 0) + hull[i].discard = 1; + } +} + +static inline cairo_int64_t +_slope_length (cairo_slope_t *slope) +{ + return _cairo_int64_add (_cairo_int32x32_64_mul (slope->dx, slope->dx), + _cairo_int32x32_64_mul (slope->dy, slope->dy)); +} + +static int +_cairo_hull_vertex_compare (const void *av, const void *bv) +{ + cairo_hull_t *a = (cairo_hull_t *) av; + cairo_hull_t *b = (cairo_hull_t *) bv; + int ret; + + /* Some libraries are reported to actually compare identical + * pointers and require the result to be 0. This is the crazy world we + * have to live in. + */ + if (a == b) + return 0; + + ret = _cairo_slope_compare (&a->slope, &b->slope); + + /* + * In the case of two vertices with identical slope from the + * extremal point discard the nearer point. + */ + if (ret == 0) { + int cmp; + + cmp = _cairo_int64_cmp (_slope_length (&a->slope), + _slope_length (&b->slope)); + + /* + * Use the points' ids to ensure a well-defined ordering, + * and avoid setting discard on both points. + */ + if (cmp < 0 || (cmp == 0 && a->id < b->id)) { + a->discard = 1; + ret = -1; + } else { + b->discard = 1; + ret = 1; + } + } + + return ret; +} + +static int +_cairo_hull_prev_valid (cairo_hull_t *hull, int num_hull, int index) +{ + /* hull[0] is always valid, and we never need to wraparound, (if + * we are passed an index of 0 here, then the calling loop is just + * about to terminate). */ + if (index == 0) + return 0; + + do { + index--; + } while (hull[index].discard); + + return index; +} + +static int +_cairo_hull_next_valid (cairo_hull_t *hull, int num_hull, int index) +{ + do { + index = (index + 1) % num_hull; + } while (hull[index].discard); + + return index; +} + +static void +_cairo_hull_eliminate_concave (cairo_hull_t *hull, int num_hull) +{ + int i, j, k; + cairo_slope_t slope_ij, slope_jk; + + i = 0; + j = _cairo_hull_next_valid (hull, num_hull, i); + k = _cairo_hull_next_valid (hull, num_hull, j); + + do { + _cairo_slope_init (&slope_ij, &hull[i].point, &hull[j].point); + _cairo_slope_init (&slope_jk, &hull[j].point, &hull[k].point); + + /* Is the angle formed by ij and jk concave? */ + if (_cairo_slope_compare (&slope_ij, &slope_jk) >= 0) { + if (i == k) + return; + hull[j].discard = 1; + j = i; + i = _cairo_hull_prev_valid (hull, num_hull, j); + } else { + i = j; + j = k; + k = _cairo_hull_next_valid (hull, num_hull, j); + } + } while (j != 0); +} + +static void +_cairo_hull_to_pen (cairo_hull_t *hull, cairo_pen_vertex_t *vertices, int *num_vertices) +{ + int i, j = 0; + + for (i = 0; i < *num_vertices; i++) { + if (hull[i].discard) + continue; + vertices[j++].point = hull[i].point; + } + + *num_vertices = j; +} + +/* Given a set of vertices, compute the convex hull using the Graham + scan algorithm. */ +cairo_status_t +_cairo_hull_compute (cairo_pen_vertex_t *vertices, int *num_vertices) +{ + cairo_hull_t hull_stack[CAIRO_STACK_ARRAY_LENGTH (cairo_hull_t)]; + cairo_hull_t *hull; + int num_hull = *num_vertices; + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (num_hull > ARRAY_LENGTH (hull_stack)) { + hull = _cairo_malloc_ab (num_hull, sizeof (cairo_hull_t)); + if (unlikely (hull == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else { + hull = hull_stack; + } + + _cairo_hull_init (hull, vertices, num_hull); + + qsort (hull + 1, num_hull - 1, + sizeof (cairo_hull_t), _cairo_hull_vertex_compare); + + _cairo_hull_eliminate_concave (hull, num_hull); + + _cairo_hull_to_pen (hull, vertices, num_vertices); + + if (hull != hull_stack) + free (hull); + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/cairo-image-compositor.c b/src/cairo-image-compositor.c new file mode 100644 index 000000000..48072f81b --- /dev/null +++ b/src/cairo-image-compositor.c @@ -0,0 +1,3137 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * Copyright © 2009,2010,2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* The primarily reason for keeping a traps-compositor around is + * for validating cairo-xlib (which currently also uses traps). + */ + +#include "cairoint.h" + +#include "cairo-image-surface-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-spans-compositor-private.h" + +#include "cairo-region-private.h" +#include "cairo-traps-private.h" +#include "cairo-tristrip-private.h" + +#include "cairo-pixman-private.h" + +static pixman_image_t * +to_pixman_image (cairo_surface_t *s) +{ + return ((cairo_image_surface_t *)s)->pixman_image; +} + +static cairo_int_status_t +acquire (void *abstract_dst) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +release (void *abstract_dst) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +set_clip_region (void *_surface, + cairo_region_t *region) +{ + cairo_image_surface_t *surface = _surface; + pixman_region32_t *rgn = region ? ®ion->rgn : NULL; + + if (! pixman_image_set_clip_region32 (surface->pixman_image, rgn)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +draw_image_boxes (void *_dst, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy) +{ + cairo_image_surface_t *dst = _dst; + struct _cairo_boxes_chunk *chunk; + int i; + + TRACE ((stderr, "%s x %d\n", __FUNCTION__, boxes->num_boxes)); + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + int x = _cairo_fixed_integer_part (b->p1.x); + int y = _cairo_fixed_integer_part (b->p1.y); + int w = _cairo_fixed_integer_part (b->p2.x) - x; + int h = _cairo_fixed_integer_part (b->p2.y) - y; + if (dst->pixman_format != image->pixman_format || + ! pixman_blt ((uint32_t *)image->data, (uint32_t *)dst->data, + image->stride / sizeof (uint32_t), + dst->stride / sizeof (uint32_t), + PIXMAN_FORMAT_BPP (image->pixman_format), + PIXMAN_FORMAT_BPP (dst->pixman_format), + x + dx, y + dy, + x, y, + w, h)) + { + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, NULL, dst->pixman_image, + x + dx, y + dy, + 0, 0, + x, y, + w, h); + } + } + } + return CAIRO_STATUS_SUCCESS; +} + +static inline uint32_t +color_to_uint32 (const cairo_color_t *color) +{ + return + (color->alpha_short >> 8 << 24) | + (color->red_short >> 8 << 16) | + (color->green_short & 0xff00) | + (color->blue_short >> 8); +} + +static inline cairo_bool_t +color_to_pixel (const cairo_color_t *color, + pixman_format_code_t format, + uint32_t *pixel) +{ + uint32_t c; + + if (!(format == PIXMAN_a8r8g8b8 || + format == PIXMAN_x8r8g8b8 || + format == PIXMAN_a8b8g8r8 || + format == PIXMAN_x8b8g8r8 || + format == PIXMAN_b8g8r8a8 || + format == PIXMAN_b8g8r8x8 || + format == PIXMAN_r5g6b5 || + format == PIXMAN_b5g6r5 || + format == PIXMAN_a8)) + { + return FALSE; + } + + c = color_to_uint32 (color); + + if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_ABGR) { + c = ((c & 0xff000000) >> 0) | + ((c & 0x00ff0000) >> 16) | + ((c & 0x0000ff00) >> 0) | + ((c & 0x000000ff) << 16); + } + + if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_BGRA) { + c = ((c & 0xff000000) >> 24) | + ((c & 0x00ff0000) >> 8) | + ((c & 0x0000ff00) << 8) | + ((c & 0x000000ff) << 24); + } + + if (format == PIXMAN_a8) { + c = c >> 24; + } else if (format == PIXMAN_r5g6b5 || format == PIXMAN_b5g6r5) { + c = ((((c) >> 3) & 0x001f) | + (((c) >> 5) & 0x07e0) | + (((c) >> 8) & 0xf800)); + } + + *pixel = c; + return TRUE; +} + +static pixman_op_t +_pixman_operator (cairo_operator_t op) +{ + switch ((int) op) { + case CAIRO_OPERATOR_CLEAR: + return PIXMAN_OP_CLEAR; + + case CAIRO_OPERATOR_SOURCE: + return PIXMAN_OP_SRC; + case CAIRO_OPERATOR_OVER: + return PIXMAN_OP_OVER; + case CAIRO_OPERATOR_IN: + return PIXMAN_OP_IN; + case CAIRO_OPERATOR_OUT: + return PIXMAN_OP_OUT; + case CAIRO_OPERATOR_ATOP: + return PIXMAN_OP_ATOP; + + case CAIRO_OPERATOR_DEST: + return PIXMAN_OP_DST; + case CAIRO_OPERATOR_DEST_OVER: + return PIXMAN_OP_OVER_REVERSE; + case CAIRO_OPERATOR_DEST_IN: + return PIXMAN_OP_IN_REVERSE; + case CAIRO_OPERATOR_DEST_OUT: + return PIXMAN_OP_OUT_REVERSE; + case CAIRO_OPERATOR_DEST_ATOP: + return PIXMAN_OP_ATOP_REVERSE; + + case CAIRO_OPERATOR_XOR: + return PIXMAN_OP_XOR; + case CAIRO_OPERATOR_ADD: + return PIXMAN_OP_ADD; + case CAIRO_OPERATOR_SATURATE: + return PIXMAN_OP_SATURATE; + + case CAIRO_OPERATOR_MULTIPLY: + return PIXMAN_OP_MULTIPLY; + case CAIRO_OPERATOR_SCREEN: + return PIXMAN_OP_SCREEN; + case CAIRO_OPERATOR_OVERLAY: + return PIXMAN_OP_OVERLAY; + case CAIRO_OPERATOR_DARKEN: + return PIXMAN_OP_DARKEN; + case CAIRO_OPERATOR_LIGHTEN: + return PIXMAN_OP_LIGHTEN; + case CAIRO_OPERATOR_COLOR_DODGE: + return PIXMAN_OP_COLOR_DODGE; + case CAIRO_OPERATOR_COLOR_BURN: + return PIXMAN_OP_COLOR_BURN; + case CAIRO_OPERATOR_HARD_LIGHT: + return PIXMAN_OP_HARD_LIGHT; + case CAIRO_OPERATOR_SOFT_LIGHT: + return PIXMAN_OP_SOFT_LIGHT; + case CAIRO_OPERATOR_DIFFERENCE: + return PIXMAN_OP_DIFFERENCE; + case CAIRO_OPERATOR_EXCLUSION: + return PIXMAN_OP_EXCLUSION; + case CAIRO_OPERATOR_HSL_HUE: + return PIXMAN_OP_HSL_HUE; + case CAIRO_OPERATOR_HSL_SATURATION: + return PIXMAN_OP_HSL_SATURATION; + case CAIRO_OPERATOR_HSL_COLOR: + return PIXMAN_OP_HSL_COLOR; + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return PIXMAN_OP_HSL_LUMINOSITY; + + default: + ASSERT_NOT_REACHED; + return PIXMAN_OP_OVER; + } +} + +static cairo_bool_t +__fill_reduces_to_source (cairo_operator_t op, + const cairo_color_t *color, + const cairo_image_surface_t *dst) +{ + if (op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_CLEAR) + return TRUE; + if (op == CAIRO_OPERATOR_OVER && CAIRO_COLOR_IS_OPAQUE (color)) + return TRUE; + if (dst->base.is_clear) + return op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD; + + return FALSE; +} + +static cairo_bool_t +fill_reduces_to_source (cairo_operator_t op, + const cairo_color_t *color, + const cairo_image_surface_t *dst, + uint32_t *pixel) +{ + if (__fill_reduces_to_source (op, color, dst)) { + return color_to_pixel (color, dst->pixman_format, pixel); + } + + return FALSE; +} + +static cairo_int_status_t +fill_rectangles (void *_dst, + cairo_operator_t op, + const cairo_color_t *color, + cairo_rectangle_int_t *rects, + int num_rects) +{ + cairo_image_surface_t *dst = _dst; + uint32_t pixel; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (fill_reduces_to_source (op, color, dst, &pixel)) { + for (i = 0; i < num_rects; i++) { + pixman_fill ((uint32_t *) dst->data, dst->stride / sizeof (uint32_t), + PIXMAN_FORMAT_BPP (dst->pixman_format), + rects[i].x, rects[i].y, + rects[i].width, rects[i].height, + pixel); + } + } else { + pixman_image_t *src = _pixman_image_for_color (color); + if (unlikely (src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + op = _pixman_operator (op); + for (i = 0; i < num_rects; i++) { + pixman_image_composite32 (op, + src, NULL, dst->pixman_image, + 0, 0, + 0, 0, + rects[i].x, rects[i].y, + rects[i].width, rects[i].height); + } + + pixman_image_unref (src); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +fill_boxes (void *_dst, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + cairo_image_surface_t *dst = _dst; + struct _cairo_boxes_chunk *chunk; + uint32_t pixel; + int i; + + TRACE ((stderr, "%s x %d\n", __FUNCTION__, boxes->num_boxes)); + + if (fill_reduces_to_source (op, color, dst, &pixel)) { + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int w = _cairo_fixed_integer_part (chunk->base[i].p2.x) - x; + int h = _cairo_fixed_integer_part (chunk->base[i].p2.y) - y; + pixman_fill ((uint32_t *) dst->data, + dst->stride / sizeof (uint32_t), + PIXMAN_FORMAT_BPP (dst->pixman_format), + x, y, w, h, pixel); + } + } + } + else + { + pixman_image_t *src = _pixman_image_for_color (color); + if (unlikely (src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + op = _pixman_operator (op); + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + pixman_image_composite32 (op, + src, NULL, dst->pixman_image, + 0, 0, + 0, 0, + x1, y1, + x2-x1, y2-y1); + } + } + + pixman_image_unref (src); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + cairo_image_source_t *src = (cairo_image_source_t *)abstract_src; + cairo_image_source_t *mask = (cairo_image_source_t *)abstract_mask; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (mask) { + pixman_image_composite32 (_pixman_operator (op), + src->pixman_image, mask->pixman_image, to_pixman_image (_dst), + src_x, src_y, + mask_x, mask_y, + dst_x, dst_y, + width, height); + } else { + pixman_image_composite32 (_pixman_operator (op), + src->pixman_image, NULL, to_pixman_image (_dst), + src_x, src_y, + 0, 0, + dst_x, dst_y, + width, height); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +lerp (void *_dst, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + cairo_image_surface_t *dst = _dst; + cairo_image_source_t *src = (cairo_image_source_t *)abstract_src; + cairo_image_source_t *mask = (cairo_image_source_t *)abstract_mask; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + +#if PIXMAN_HAS_OP_LERP + pixman_image_composite32 (PIXMAN_OP_LERP_SRC, + src->pixman_image, mask->pixman_image, dst->pixman_image, + src_x, src_y, + mask_x, mask_y, + dst_x, dst_y, + width, height); +#else + /* Punch the clip out of the destination */ + TRACE ((stderr, "%s - OUT_REVERSE (mask=%d/%p, dst=%d/%p)\n", + __FUNCTION__, + mask->base.unique_id, mask->pixman_image, + dst->base.unique_id, dst->pixman_image)); + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + mask->pixman_image, NULL, dst->pixman_image, + mask_x, mask_y, + 0, 0, + dst_x, dst_y, + width, height); + + /* Now add the two results together */ + TRACE ((stderr, "%s - ADD (src=%d/%p, mask=%d/%p, dst=%d/%p)\n", + __FUNCTION__, + src->base.unique_id, src->pixman_image, + mask->base.unique_id, mask->pixman_image, + dst->base.unique_id, dst->pixman_image)); + pixman_image_composite32 (PIXMAN_OP_ADD, + src->pixman_image, mask->pixman_image, dst->pixman_image, + src_x, src_y, + mask_x, mask_y, + dst_x, dst_y, + width, height); +#endif + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_boxes (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents) +{ + pixman_image_t *dst = to_pixman_image (_dst); + pixman_image_t *src = ((cairo_image_source_t *)abstract_src)->pixman_image; + pixman_image_t *mask = abstract_mask ? ((cairo_image_source_t *)abstract_mask)->pixman_image : NULL; + pixman_image_t *free_src = NULL; + struct _cairo_boxes_chunk *chunk; + int i; + + /* XXX consider using a region? saves multiple prepare-composite */ + TRACE ((stderr, "%s x %d\n", __FUNCTION__, boxes->num_boxes)); + + if (((cairo_surface_t *)_dst)->is_clear && + (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_OVER || + op == CAIRO_OPERATOR_ADD)) { + op = PIXMAN_OP_SRC; + } else if (mask) { + if (op == CAIRO_OPERATOR_CLEAR) { +#if PIXMAN_HAS_OP_LERP + op = PIXMAN_OP_LERP_CLEAR; +#else + free_src = src = _pixman_image_for_color (CAIRO_COLOR_WHITE); + if (unlikely (src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + op = PIXMAN_OP_OUT_REVERSE; +#endif + } else if (op == CAIRO_OPERATOR_SOURCE) { +#if PIXMAN_HAS_OP_LERP + op = PIXMAN_OP_LERP_SRC; +#else + return CAIRO_INT_STATUS_UNSUPPORTED; +#endif + } else { + op = _pixman_operator (op); + } + } else { + op = _pixman_operator (op); + } + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + pixman_image_composite32 (op, src, mask, dst, + x1 + src_x, y1 + src_y, + x1 + mask_x, y1 + mask_y, + x1 + dst_x, y1 + dst_y, + x2 - x1, y2 - y1); + } + } + + if (free_src) + pixman_image_unref (free_src); + + return CAIRO_STATUS_SUCCESS; +} + +#define CAIRO_FIXED_16_16_MIN _cairo_fixed_from_int (-32768) +#define CAIRO_FIXED_16_16_MAX _cairo_fixed_from_int (32767) + +static cairo_bool_t +line_exceeds_16_16 (const cairo_line_t *line) +{ + return + line->p1.x <= CAIRO_FIXED_16_16_MIN || + line->p1.x >= CAIRO_FIXED_16_16_MAX || + + line->p2.x <= CAIRO_FIXED_16_16_MIN || + line->p2.x >= CAIRO_FIXED_16_16_MAX || + + line->p1.y <= CAIRO_FIXED_16_16_MIN || + line->p1.y >= CAIRO_FIXED_16_16_MAX || + + line->p2.y <= CAIRO_FIXED_16_16_MIN || + line->p2.y >= CAIRO_FIXED_16_16_MAX; +} + +static void +project_line_x_onto_16_16 (const cairo_line_t *line, + cairo_fixed_t top, + cairo_fixed_t bottom, + pixman_line_fixed_t *out) +{ + /* XXX use fixed-point arithmetic? */ + cairo_point_double_t p1, p2; + double m; + + p1.x = _cairo_fixed_to_double (line->p1.x); + p1.y = _cairo_fixed_to_double (line->p1.y); + + p2.x = _cairo_fixed_to_double (line->p2.x); + p2.y = _cairo_fixed_to_double (line->p2.y); + + m = (p2.x - p1.x) / (p2.y - p1.y); + out->p1.x = _cairo_fixed_16_16_from_double (p1.x + m * _cairo_fixed_to_double (top - line->p1.y)); + out->p2.x = _cairo_fixed_16_16_from_double (p1.x + m * _cairo_fixed_to_double (bottom - line->p1.y)); +} + +void +_pixman_image_add_traps (pixman_image_t *image, + int dst_x, int dst_y, + cairo_traps_t *traps) +{ + cairo_trapezoid_t *t = traps->traps; + int num_traps = traps->num_traps; + while (num_traps--) { + pixman_trapezoid_t trap; + + /* top/bottom will be clamped to surface bounds */ + trap.top = _cairo_fixed_to_16_16 (t->top); + trap.bottom = _cairo_fixed_to_16_16 (t->bottom); + + /* However, all the other coordinates will have been left untouched so + * as not to introduce numerical error. Recompute them if they + * exceed the 16.16 limits. + */ + if (unlikely (line_exceeds_16_16 (&t->left))) { + project_line_x_onto_16_16 (&t->left, t->top, t->bottom, &trap.left); + trap.left.p1.y = trap.top; + trap.left.p2.y = trap.bottom; + } else { + trap.left.p1.x = _cairo_fixed_to_16_16 (t->left.p1.x); + trap.left.p1.y = _cairo_fixed_to_16_16 (t->left.p1.y); + trap.left.p2.x = _cairo_fixed_to_16_16 (t->left.p2.x); + trap.left.p2.y = _cairo_fixed_to_16_16 (t->left.p2.y); + } + + if (unlikely (line_exceeds_16_16 (&t->right))) { + project_line_x_onto_16_16 (&t->right, t->top, t->bottom, &trap.right); + trap.right.p1.y = trap.top; + trap.right.p2.y = trap.bottom; + } else { + trap.right.p1.x = _cairo_fixed_to_16_16 (t->right.p1.x); + trap.right.p1.y = _cairo_fixed_to_16_16 (t->right.p1.y); + trap.right.p2.x = _cairo_fixed_to_16_16 (t->right.p2.x); + trap.right.p2.y = _cairo_fixed_to_16_16 (t->right.p2.y); + } + + pixman_rasterize_trapezoid (image, &trap, -dst_x, -dst_y); + t++; + } +} + +static cairo_int_status_t +composite_traps (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_traps_t *traps) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *) _dst; + cairo_image_source_t *src = (cairo_image_source_t *) abstract_src; + cairo_int_status_t status; + pixman_image_t *mask; + pixman_format_code_t format; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + /* pixman doesn't eliminate self-intersecting trapezoids/edges */ + status = _cairo_bentley_ottmann_tessellate_traps (traps, + CAIRO_FILL_RULE_WINDING); + if (status != CAIRO_INT_STATUS_SUCCESS) + return status; + + /* Special case adding trapezoids onto a mask surface; we want to avoid + * creating an intermediate temporary mask unnecessarily. + * + * We make the assumption here that the portion of the trapezoids + * contained within the surface is bounded by [dst_x,dst_y,width,height]; + * the Cairo core code passes bounds based on the trapezoid extents. + */ + format = antialias == CAIRO_ANTIALIAS_NONE ? PIXMAN_a1 : PIXMAN_a8; + if (dst->pixman_format == format && + (abstract_src == NULL || + (op == CAIRO_OPERATOR_ADD && src->is_opaque_solid))) + { + _pixman_image_add_traps (dst->pixman_image, dst_x, dst_y, traps); + return CAIRO_STATUS_SUCCESS; + } + + mask = pixman_image_create_bits (format, + extents->width, extents->height, + NULL, 0); + if (unlikely (mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _pixman_image_add_traps (mask, extents->x, extents->y, traps); + pixman_image_composite32 (_pixman_operator (op), + src->pixman_image, mask, dst->pixman_image, + extents->x + src_x, extents->y + src_y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + pixman_image_unref (mask); + + return CAIRO_STATUS_SUCCESS; +} + +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,22,0) +static void +set_point (pixman_point_fixed_t *p, cairo_point_t *c) +{ + p->x = _cairo_fixed_to_16_16 (c->x); + p->y = _cairo_fixed_to_16_16 (c->y); +} + +void +_pixman_image_add_tristrip (pixman_image_t *image, + int dst_x, int dst_y, + cairo_tristrip_t *strip) +{ + pixman_triangle_t tri; + pixman_point_fixed_t *p[3] = {&tri.p1, &tri.p2, &tri.p3 }; + int n; + + set_point (p[0], &strip->points[0]); + set_point (p[1], &strip->points[1]); + set_point (p[2], &strip->points[2]); + pixman_add_triangles (image, -dst_x, -dst_y, 1, &tri); + for (n = 3; n < strip->num_points; n++) { + set_point (p[n%3], &strip->points[n]); + pixman_add_triangles (image, -dst_x, -dst_y, 1, &tri); + } +} + +static cairo_int_status_t +composite_tristrip (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_tristrip_t *strip) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *) _dst; + cairo_image_source_t *src = (cairo_image_source_t *) abstract_src; + pixman_image_t *mask; + pixman_format_code_t format; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (strip->num_points < 3) + return CAIRO_STATUS_SUCCESS; + + if (1) { /* pixman doesn't eliminate self-intersecting triangles/edges */ + cairo_int_status_t status; + cairo_traps_t traps; + int n; + + _cairo_traps_init (&traps); + for (n = 0; n < strip->num_points; n++) { + cairo_point_t p[4]; + + p[0] = strip->points[0]; + p[1] = strip->points[1]; + p[2] = strip->points[2]; + p[3] = strip->points[0]; + + _cairo_traps_tessellate_convex_quad (&traps, p); + } + status = composite_traps (_dst, op, abstract_src, + src_x, src_y, + dst_x, dst_y, + extents, antialias, &traps); + _cairo_traps_fini (&traps); + + return status; + } + + format = antialias == CAIRO_ANTIALIAS_NONE ? PIXMAN_a1 : PIXMAN_a8; + if (dst->pixman_format == format && + (abstract_src == NULL || + (op == CAIRO_OPERATOR_ADD && src->is_opaque_solid))) + { + _pixman_image_add_tristrip (dst->pixman_image, dst_x, dst_y, strip); + return CAIRO_STATUS_SUCCESS; + } + + mask = pixman_image_create_bits (format, + extents->width, extents->height, + NULL, 0); + if (unlikely (mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _pixman_image_add_tristrip (mask, extents->x, extents->y, strip); + pixman_image_composite32 (_pixman_operator (op), + src->pixman_image, mask, dst->pixman_image, + extents->x + src_x, extents->y + src_y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + pixman_image_unref (mask); + + return CAIRO_STATUS_SUCCESS; +} +#endif + +static cairo_int_status_t +check_composite_glyphs (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs) +{ + return CAIRO_STATUS_SUCCESS; +} + +#if HAS_PIXMAN_GLYPHS +static pixman_glyph_cache_t *global_glyph_cache; + +static inline pixman_glyph_cache_t * +get_glyph_cache (void) +{ + if (!global_glyph_cache) + global_glyph_cache = pixman_glyph_cache_create (); + + return global_glyph_cache; +} + +void +_cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + CAIRO_MUTEX_LOCK (_cairo_glyph_cache_mutex); + + if (global_glyph_cache) { + pixman_glyph_cache_remove ( + global_glyph_cache, scaled_font, + (void *)_cairo_scaled_glyph_index (scaled_glyph)); + } + + CAIRO_MUTEX_UNLOCK (_cairo_glyph_cache_mutex); +} + +static cairo_int_status_t +composite_glyphs (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + pixman_glyph_cache_t *glyph_cache; + pixman_glyph_t pglyphs_stack[CAIRO_STACK_ARRAY_LENGTH (pixman_glyph_t)]; + pixman_glyph_t *pglyphs = pglyphs_stack; + pixman_glyph_t *pg; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + CAIRO_MUTEX_LOCK (_cairo_glyph_cache_mutex); + + glyph_cache = get_glyph_cache(); + if (unlikely (glyph_cache == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto out_unlock; + } + + pixman_glyph_cache_freeze (glyph_cache); + + if (info->num_glyphs > ARRAY_LENGTH (pglyphs_stack)) { + pglyphs = _cairo_malloc_ab (info->num_glyphs, sizeof (pixman_glyph_t)); + if (unlikely (pglyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto out_thaw; + } + } + + pg = pglyphs; + for (i = 0; i < info->num_glyphs; i++) { + unsigned long index = info->glyphs[i].index; + const void *glyph; + + glyph = pixman_glyph_cache_lookup (glyph_cache, info->font, (void *)index); + if (!glyph) { + cairo_scaled_glyph_t *scaled_glyph; + cairo_image_surface_t *glyph_surface; + + /* This call can actually end up recursing, so we have to + * drop the mutex around it. + */ + CAIRO_MUTEX_UNLOCK (_cairo_glyph_cache_mutex); + status = _cairo_scaled_glyph_lookup (info->font, index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + CAIRO_MUTEX_LOCK (_cairo_glyph_cache_mutex); + + if (unlikely (status)) + goto out_thaw; + + glyph_surface = scaled_glyph->surface; + glyph = pixman_glyph_cache_insert (glyph_cache, info->font, (void *)index, + glyph_surface->base.device_transform.x0, + glyph_surface->base.device_transform.y0, + glyph_surface->pixman_image); + if (unlikely (!glyph)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto out_thaw; + } + } + + pg->x = _cairo_lround (info->glyphs[i].x); + pg->y = _cairo_lround (info->glyphs[i].y); + pg->glyph = glyph; + pg++; + } + + if (info->use_mask) { + pixman_format_code_t mask_format; + + mask_format = pixman_glyph_get_mask_format (glyph_cache, pg - pglyphs, pglyphs); + + pixman_composite_glyphs (_pixman_operator (op), + ((cairo_image_source_t *)_src)->pixman_image, + to_pixman_image (_dst), + mask_format, + info->extents.x + src_x, info->extents.y + src_y, + info->extents.x, info->extents.y, + info->extents.x - dst_x, info->extents.y - dst_y, + info->extents.width, info->extents.height, + glyph_cache, pg - pglyphs, pglyphs); + } else { + pixman_composite_glyphs_no_mask (_pixman_operator (op), + ((cairo_image_source_t *)_src)->pixman_image, + to_pixman_image (_dst), + src_x, src_y, + - dst_x, - dst_y, + glyph_cache, pg - pglyphs, pglyphs); + } + +out_thaw: + pixman_glyph_cache_thaw (glyph_cache); + + if (pglyphs != pglyphs_stack) + free(pglyphs); + +out_unlock: + CAIRO_MUTEX_UNLOCK (_cairo_glyph_cache_mutex); + return status; +} +#else +void +_cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ +} + +static cairo_int_status_t +composite_one_glyph (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + cairo_image_surface_t *glyph_surface; + cairo_scaled_glyph_t *scaled_glyph; + cairo_status_t status; + int x, y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = _cairo_scaled_glyph_lookup (info->font, + info->glyphs[0].index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + + if (unlikely (status)) + return status; + + glyph_surface = scaled_glyph->surface; + if (glyph_surface->width == 0 || glyph_surface->height == 0) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + /* round glyph locations to the nearest pixel */ + /* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */ + x = _cairo_lround (info->glyphs[0].x - + glyph_surface->base.device_transform.x0); + y = _cairo_lround (info->glyphs[0].y - + glyph_surface->base.device_transform.y0); + + pixman_image_composite32 (_pixman_operator (op), + ((cairo_image_source_t *)_src)->pixman_image, + glyph_surface->pixman_image, + to_pixman_image (_dst), + x + src_x, y + src_y, + 0, 0, + x - dst_x, y - dst_y, + glyph_surface->width, + glyph_surface->height); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_glyphs_via_mask (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + cairo_scaled_glyph_t *glyph_cache[64]; + pixman_image_t *white = _pixman_image_for_color (CAIRO_COLOR_WHITE); + cairo_scaled_glyph_t *scaled_glyph; + uint8_t buf[2048]; + pixman_image_t *mask; + pixman_format_code_t format; + cairo_status_t status; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (unlikely (white == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* XXX convert the glyphs to common formats a8/a8r8g8b8 to hit + * optimised paths through pixman. Should we increase the bit + * depth of the target surface, we should reconsider the appropriate + * mask formats. + */ + + status = _cairo_scaled_glyph_lookup (info->font, + info->glyphs[0].index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + if (unlikely (status)) { + pixman_image_unref (white); + return status; + } + + memset (glyph_cache, 0, sizeof (glyph_cache)); + glyph_cache[info->glyphs[0].index % ARRAY_LENGTH (glyph_cache)] = scaled_glyph; + + format = PIXMAN_a8; + i = (info->extents.width + 3) & ~3; + if (scaled_glyph->surface->base.content & CAIRO_CONTENT_COLOR) { + format = PIXMAN_a8r8g8b8; + i = info->extents.width * 4; + } + + if (i * info->extents.height > (int) sizeof (buf)) { + mask = pixman_image_create_bits (format, + info->extents.width, + info->extents.height, + NULL, 0); + } else { + memset (buf, 0, i * info->extents.height); + mask = pixman_image_create_bits (format, + info->extents.width, + info->extents.height, + (uint32_t *)buf, i); + } + if (unlikely (mask == NULL)) { + pixman_image_unref (white); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + status = CAIRO_STATUS_SUCCESS; + for (i = 0; i < info->num_glyphs; i++) { + unsigned long glyph_index = info->glyphs[i].index; + int cache_index = glyph_index % ARRAY_LENGTH (glyph_cache); + cairo_image_surface_t *glyph_surface; + int x, y; + + scaled_glyph = glyph_cache[cache_index]; + if (scaled_glyph == NULL || + _cairo_scaled_glyph_index (scaled_glyph) != glyph_index) + { + status = _cairo_scaled_glyph_lookup (info->font, glyph_index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + + if (unlikely (status)) { + pixman_image_unref (mask); + pixman_image_unref (white); + return status; + } + + glyph_cache[cache_index] = scaled_glyph; + } + + glyph_surface = scaled_glyph->surface; + if (glyph_surface->width && glyph_surface->height) { + if (glyph_surface->base.content & CAIRO_CONTENT_COLOR && + format == PIXMAN_a8) { + pixman_image_t *ca_mask; + + format = PIXMAN_a8r8g8b8; + ca_mask = pixman_image_create_bits (format, + info->extents.width, + info->extents.height, + NULL, 0); + if (unlikely (ca_mask == NULL)) { + pixman_image_unref (mask); + pixman_image_unref (white); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pixman_image_composite32 (PIXMAN_OP_SRC, + white, mask, ca_mask, + 0, 0, + 0, 0, + 0, 0, + info->extents.width, + info->extents.height); + pixman_image_unref (mask); + mask = ca_mask; + } + + /* round glyph locations to the nearest pixel */ + /* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */ + x = _cairo_lround (info->glyphs[i].x - + glyph_surface->base.device_transform.x0); + y = _cairo_lround (info->glyphs[i].y - + glyph_surface->base.device_transform.y0); + + if (glyph_surface->pixman_format == format) { + pixman_image_composite32 (PIXMAN_OP_ADD, + glyph_surface->pixman_image, NULL, mask, + 0, 0, + 0, 0, + x - info->extents.x, y - info->extents.y, + glyph_surface->width, + glyph_surface->height); + } else { + pixman_image_composite32 (PIXMAN_OP_ADD, + white, glyph_surface->pixman_image, mask, + 0, 0, + 0, 0, + x - info->extents.x, y - info->extents.y, + glyph_surface->width, + glyph_surface->height); + } + } + } + + if (format == PIXMAN_a8r8g8b8) + pixman_image_set_component_alpha (mask, TRUE); + + pixman_image_composite32 (_pixman_operator (op), + ((cairo_image_source_t *)_src)->pixman_image, + mask, + to_pixman_image (_dst), + info->extents.x + src_x, info->extents.y + src_y, + 0, 0, + info->extents.x - dst_x, info->extents.y - dst_y, + info->extents.width, info->extents.height); + pixman_image_unref (mask); + pixman_image_unref (white); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_glyphs (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + cairo_scaled_glyph_t *glyph_cache[64]; + pixman_image_t *dst, *src; + cairo_status_t status; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (info->num_glyphs == 1) + return composite_one_glyph(_dst, op, _src, src_x, src_y, dst_x, dst_y, info); + + if (info->use_mask) + return composite_glyphs_via_mask(_dst, op, _src, src_x, src_y, dst_x, dst_y, info); + + op = _pixman_operator (op); + dst = to_pixman_image (_dst); + src = ((cairo_image_source_t *)_src)->pixman_image; + + memset (glyph_cache, 0, sizeof (glyph_cache)); + status = CAIRO_STATUS_SUCCESS; + + for (i = 0; i < info->num_glyphs; i++) { + int x, y; + cairo_image_surface_t *glyph_surface; + cairo_scaled_glyph_t *scaled_glyph; + unsigned long glyph_index = info->glyphs[i].index; + int cache_index = glyph_index % ARRAY_LENGTH (glyph_cache); + + scaled_glyph = glyph_cache[cache_index]; + if (scaled_glyph == NULL || + _cairo_scaled_glyph_index (scaled_glyph) != glyph_index) + { + status = _cairo_scaled_glyph_lookup (info->font, glyph_index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + + if (unlikely (status)) + break; + + glyph_cache[cache_index] = scaled_glyph; + } + + glyph_surface = scaled_glyph->surface; + if (glyph_surface->width && glyph_surface->height) { + /* round glyph locations to the nearest pixel */ + /* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */ + x = _cairo_lround (info->glyphs[i].x - + glyph_surface->base.device_transform.x0); + y = _cairo_lround (info->glyphs[i].y - + glyph_surface->base.device_transform.y0); + + pixman_image_composite32 (op, src, glyph_surface->pixman_image, dst, + x + src_x, y + src_y, + 0, 0, + x - dst_x, y - dst_y, + glyph_surface->width, + glyph_surface->height); + } + } + + return status; +} +#endif + +static cairo_int_status_t +check_composite (const cairo_composite_rectangles_t *extents) +{ + return CAIRO_STATUS_SUCCESS; +} + +const cairo_compositor_t * +_cairo_image_traps_compositor_get (void) +{ + static cairo_traps_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_traps_compositor_init (&compositor, + &__cairo_no_compositor); + compositor.acquire = acquire; + compositor.release = release; + compositor.set_clip_region = set_clip_region; + compositor.pattern_to_surface = _cairo_image_source_create_for_pattern; + compositor.draw_image_boxes = draw_image_boxes; + //compositor.copy_boxes = copy_boxes; + compositor.fill_boxes = fill_boxes; + compositor.check_composite = check_composite; + compositor.composite = composite; + compositor.lerp = lerp; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + //compositor.check_composite_traps = check_composite_traps; + compositor.composite_traps = composite_traps; + //compositor.check_composite_tristrip = check_composite_traps; +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,22,0) + compositor.composite_tristrip = composite_tristrip; +#endif + compositor.check_composite_glyphs = check_composite_glyphs; + compositor.composite_glyphs = composite_glyphs; + } + + return &compositor.base; +} + +const cairo_compositor_t * +_cairo_image_mask_compositor_get (void) +{ + static cairo_mask_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_mask_compositor_init (&compositor, + _cairo_image_traps_compositor_get ()); + compositor.acquire = acquire; + compositor.release = release; + compositor.set_clip_region = set_clip_region; + compositor.pattern_to_surface = _cairo_image_source_create_for_pattern; + compositor.draw_image_boxes = draw_image_boxes; + compositor.fill_rectangles = fill_rectangles; + compositor.fill_boxes = fill_boxes; + compositor.check_composite = check_composite; + compositor.composite = composite; + //compositor.lerp = lerp; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + compositor.check_composite_glyphs = check_composite_glyphs; + compositor.composite_glyphs = composite_glyphs; + } + + return &compositor.base; +} + +#if PIXMAN_HAS_COMPOSITOR +typedef struct _cairo_image_span_renderer { + cairo_span_renderer_t base; + + pixman_image_compositor_t *compositor; + pixman_image_t *src, *mask; + float opacity; + cairo_rectangle_int_t extents; +} cairo_image_span_renderer_t; +COMPILE_TIME_ASSERT (sizeof (cairo_image_span_renderer_t) <= sizeof (cairo_abstract_span_renderer_t)); + +static cairo_status_t +_cairo_image_bounded_opaque_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (spans[0].coverage) + pixman_image_compositor_blt (r->compositor, + spans[0].x, y, + spans[1].x - spans[0].x, height, + spans[0].coverage); + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_image_bounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (spans[0].coverage) { + pixman_image_compositor_blt (r->compositor, + spans[0].x, y, + spans[1].x - spans[0].x, height, + r->opacity * spans[0].coverage); + } + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_image_unbounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + assert (y + height <= r->extents.height); + if (y > r->extents.y) { + pixman_image_compositor_blt (r->compositor, + r->extents.x, r->extents.y, + r->extents.width, y - r->extents.y, + 0); + } + + if (num_spans == 0) { + pixman_image_compositor_blt (r->compositor, + r->extents.x, y, + r->extents.width, height, + 0); + } else { + if (spans[0].x != r->extents.x) { + pixman_image_compositor_blt (r->compositor, + r->extents.x, y, + spans[0].x - r->extents.x, + height, + 0); + } + + do { + assert (spans[0].x < r->extents.x + r->extents.width); + pixman_image_compositor_blt (r->compositor, + spans[0].x, y, + spans[1].x - spans[0].x, height, + r->opacity * spans[0].coverage); + spans++; + } while (--num_spans > 1); + + if (spans[0].x != r->extents.x + r->extents.width) { + assert (spans[0].x < r->extents.x + r->extents.width); + pixman_image_compositor_blt (r->compositor, + spans[0].x, y, + r->extents.x + r->extents.width - spans[0].x, height, + 0); + } + } + + r->extents.y = y + height; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_image_clipped_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + assert (num_spans); + + do { + if (! spans[0].inverse) + pixman_image_compositor_blt (r->compositor, + spans[0].x, y, + spans[1].x - spans[0].x, height, + r->opacity * spans[0].coverage); + spans++; + } while (--num_spans > 1); + + r->extents.y = y + height; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_image_finish_unbounded_spans (void *abstract_renderer) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (r->extents.y < r->extents.height) { + pixman_image_compositor_blt (r->compositor, + r->extents.x, r->extents.y, + r->extents.width, + r->extents.height - r->extents.y, + 0); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +span_renderer_init (cairo_abstract_span_renderer_t *_r, + const cairo_composite_rectangles_t *composite, + cairo_bool_t needs_clip) +{ + cairo_image_span_renderer_t *r = (cairo_image_span_renderer_t *)_r; + cairo_image_surface_t *dst = (cairo_image_surface_t *)composite->surface; + const cairo_pattern_t *source = &composite->source_pattern.base; + cairo_operator_t op = composite->op; + int src_x, src_y; + int mask_x, mask_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (op == CAIRO_OPERATOR_CLEAR) { + op = PIXMAN_OP_LERP_CLEAR; + } else if (dst->base.is_clear && + (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_OVER || + op == CAIRO_OPERATOR_ADD)) { + op = PIXMAN_OP_SRC; + } else if (op == CAIRO_OPERATOR_SOURCE) { + op = PIXMAN_OP_LERP_SRC; + } else { + op = _pixman_operator (op); + } + + r->compositor = NULL; + r->mask = NULL; + r->src = _pixman_image_for_pattern (dst, source, FALSE, + &composite->unbounded, + &composite->source_sample_area, + &src_x, &src_y); + if (unlikely (r->src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + r->opacity = 1.0; + if (composite->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID) { + r->opacity = composite->mask_pattern.solid.color.alpha; + } else { + r->mask = _pixman_image_for_pattern (dst, + &composite->mask_pattern.base, + TRUE, + &composite->unbounded, + &composite->mask_sample_area, + &mask_x, &mask_y); + if (unlikely (r->mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* XXX Component-alpha? */ + if ((dst->base.content & CAIRO_CONTENT_COLOR) == 0 && + _cairo_pattern_is_opaque (source, &composite->source_sample_area)) + { + pixman_image_unref (r->src); + r->src = r->mask; + src_x = mask_x; + src_y = mask_y; + r->mask = NULL; + } + } + + if (composite->is_bounded) { + if (r->opacity == 1.) + r->base.render_rows = _cairo_image_bounded_opaque_spans; + else + r->base.render_rows = _cairo_image_bounded_spans; + r->base.finish = NULL; + } else { + if (needs_clip) + r->base.render_rows = _cairo_image_clipped_spans; + else + r->base.render_rows = _cairo_image_unbounded_spans; + r->base.finish = _cairo_image_finish_unbounded_spans; + r->extents = composite->unbounded; + r->extents.height += r->extents.y; + } + + r->compositor = + pixman_image_create_compositor (op, r->src, r->mask, dst->pixman_image, + composite->unbounded.x + src_x, + composite->unbounded.y + src_y, + composite->unbounded.x + mask_x, + composite->unbounded.y + mask_y, + composite->unbounded.x, + composite->unbounded.y, + composite->unbounded.width, + composite->unbounded.height); + if (unlikely (r->compositor == NULL)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + return CAIRO_STATUS_SUCCESS; +} + +static void +span_renderer_fini (cairo_abstract_span_renderer_t *_r, + cairo_int_status_t status) +{ + cairo_image_span_renderer_t *r = (cairo_image_span_renderer_t *) _r; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (status == CAIRO_INT_STATUS_SUCCESS && r->base.finish) + r->base.finish (r); + + if (r->compositor) + pixman_image_compositor_destroy (r->compositor); + + if (r->src) + pixman_image_unref (r->src); + if (r->mask) + pixman_image_unref (r->mask); +} +#else +typedef struct _cairo_image_span_renderer { + cairo_span_renderer_t base; + + const cairo_composite_rectangles_t *composite; + + float opacity; + uint8_t op; + int bpp; + + pixman_image_t *src, *mask; + union { + struct fill { + int stride; + uint8_t *data; + uint32_t pixel; + } fill; + struct blit { + int stride; + uint8_t *data; + int src_stride; + uint8_t *src_data; + } blit; + struct composite { + pixman_image_t *dst; + int src_x, src_y; + int mask_x, mask_y; + int run_length; + } composite; + struct finish { + cairo_rectangle_int_t extents; + int src_x, src_y; + int stride; + uint8_t *data; + } mask; + } u; + uint8_t _buf[0]; +#define SZ_BUF (int)(sizeof (cairo_abstract_span_renderer_t) - sizeof (cairo_image_span_renderer_t)) +} cairo_image_span_renderer_t; +COMPILE_TIME_ASSERT (sizeof (cairo_image_span_renderer_t) <= sizeof (cairo_abstract_span_renderer_t)); + +static cairo_status_t +_cairo_image_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + uint8_t *mask, *row; + int len; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + mask = r->u.mask.data + (y - r->u.mask.extents.y) * r->u.mask.stride; + mask += spans[0].x - r->u.mask.extents.x; + row = mask; + + do { + len = spans[1].x - spans[0].x; + if (spans[0].coverage) { + *row++ = r->opacity * spans[0].coverage; + if (--len) + memset (row, row[-1], len); + } + row += len; + spans++; + } while (--num_spans > 1); + + len = row - mask; + row = mask; + while (--height) { + mask += r->u.mask.stride; + memcpy (mask, row, len); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_image_spans_and_zero (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + uint8_t *mask; + int len; + + mask = r->u.mask.data; + if (y > r->u.mask.extents.y) { + len = (y - r->u.mask.extents.y) * r->u.mask.stride; + memset (mask, 0, len); + mask += len; + } + + r->u.mask.extents.y = y + height; + r->u.mask.data = mask + height * r->u.mask.stride; + if (num_spans == 0) { + memset (mask, 0, height * r->u.mask.stride); + } else { + uint8_t *row = mask; + + if (spans[0].x != r->u.mask.extents.x) { + len = spans[0].x - r->u.mask.extents.x; + memset (row, 0, len); + row += len; + } + + do { + len = spans[1].x - spans[0].x; + *row++ = r->opacity * spans[0].coverage; + if (len > 1) { + memset (row, row[-1], --len); + row += len; + } + spans++; + } while (--num_spans > 1); + + if (spans[0].x != r->u.mask.extents.x + r->u.mask.extents.width) { + len = r->u.mask.extents.x + r->u.mask.extents.width - spans[0].x; + memset (row, 0, len); + } + + row = mask; + while (--height) { + mask += r->u.mask.stride; + memcpy (mask, row, r->u.mask.extents.width); + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_image_finish_spans_and_zero (void *abstract_renderer) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (r->u.mask.extents.y < r->u.mask.extents.height) + memset (r->u.mask.data, 0, (r->u.mask.extents.height - r->u.mask.extents.y) * r->u.mask.stride); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_fill8_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + do { + if (spans[0].coverage) { + int len = spans[1].x - spans[0].x; + uint8_t *d = r->u.fill.data + r->u.fill.stride*y + spans[0].x; + if (len == 1) + *d = r->u.fill.pixel; + else + memset(d, r->u.fill.pixel, len); + } + spans++; + } while (--num_spans > 1); + } else { + do { + if (spans[0].coverage) { + int yy = y, hh = h; + do { + int len = spans[1].x - spans[0].x; + uint8_t *d = r->u.fill.data + r->u.fill.stride*yy + spans[0].x; + if (len == 1) + *d = r->u.fill.pixel; + else + memset(d, r->u.fill.pixel, len); + yy++; + } while (--hh); + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_fill16_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + do { + if (spans[0].coverage) { + int len = spans[1].x - spans[0].x; + uint16_t *d = (uint16_t*)(r->u.fill.data + r->u.fill.stride*y + spans[0].x*2); + while (len--) + *d++ = r->u.fill.pixel; + } + spans++; + } while (--num_spans > 1); + } else { + do { + if (spans[0].coverage) { + int yy = y, hh = h; + do { + int len = spans[1].x - spans[0].x; + uint16_t *d = (uint16_t*)(r->u.fill.data + r->u.fill.stride*yy + spans[0].x*2); + while (len--) + *d++ = r->u.fill.pixel; + yy++; + } while (--hh); + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_fill32_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + do { + if (spans[0].coverage) { + int len = spans[1].x - spans[0].x; + if (len > 32) { + pixman_fill ((uint32_t *)r->u.fill.data, r->u.fill.stride / sizeof(uint32_t), r->bpp, + spans[0].x, y, len, 1, r->u.fill.pixel); + } else { + uint32_t *d = (uint32_t*)(r->u.fill.data + r->u.fill.stride*y + spans[0].x*4); + while (len--) + *d++ = r->u.fill.pixel; + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + if (spans[0].coverage) { + if (spans[1].x - spans[0].x > 16) { + pixman_fill ((uint32_t *)r->u.fill.data, r->u.fill.stride / sizeof(uint32_t), r->bpp, + spans[0].x, y, spans[1].x - spans[0].x, h, + r->u.fill.pixel); + } else { + int yy = y, hh = h; + do { + int len = spans[1].x - spans[0].x; + uint32_t *d = (uint32_t*)(r->u.fill.data + r->u.fill.stride*yy + spans[0].x*4); + while (len--) + *d++ = r->u.fill.pixel; + yy++; + } while (--hh); + } + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +#if 0 +static cairo_status_t +_fill_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (spans[0].coverage) { + pixman_fill ((uint32_t *) r->data, r->stride, r->bpp, + spans[0].x, y, + spans[1].x - spans[0].x, h, + r->pixel); + } + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} +#endif + +static cairo_status_t +_blit_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + int cpp; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + cpp = r->bpp/8; + if (likely (h == 1)) { + uint8_t *src = r->u.blit.src_data + y*r->u.blit.src_stride; + uint8_t *dst = r->u.blit.data + y*r->u.blit.stride; + do { + if (spans[0].coverage) { + void *s = src + spans[0].x*cpp; + void *d = dst + spans[0].x*cpp; + int len = (spans[1].x - spans[0].x) * cpp; + switch (len) { + case 1: + *(uint8_t *)d = *(uint8_t *)s; + break; + case 2: + *(uint16_t *)d = *(uint16_t *)s; + break; + case 4: + *(uint32_t *)d = *(uint32_t *)s; + break; +#if HAVE_UINT64_T + case 8: + *(uint64_t *)d = *(uint64_t *)s; + break; +#endif + default: + memcpy(d, s, len); + break; + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + if (spans[0].coverage) { + int yy = y, hh = h; + do { + void *src = r->u.blit.src_data + yy*r->u.blit.src_stride + spans[0].x*cpp; + void *dst = r->u.blit.data + yy*r->u.blit.stride + spans[0].x*cpp; + int len = (spans[1].x - spans[0].x) * cpp; + switch (len) { + case 1: + *(uint8_t *)dst = *(uint8_t *)src; + break; + case 2: + *(uint16_t *)dst = *(uint16_t *)src; + break; + case 4: + *(uint32_t *)dst = *(uint32_t *)src; + break; +#if HAVE_UINT64_T + case 8: + *(uint64_t *)dst = *(uint64_t *)src; + break; +#endif + default: + memcpy(dst, src, len); + break; + } + yy++; + } while (--hh); + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_mono_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (spans[0].coverage) { + pixman_image_composite32 (r->op, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, y + r->u.composite.src_y, + 0, 0, + spans[0].x, y, + spans[1].x - spans[0].x, h); + } + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_mono_unbounded_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) { + pixman_image_composite32 (PIXMAN_OP_CLEAR, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, y + r->u.composite.src_y, + 0, 0, + r->composite->unbounded.x, y, + r->composite->unbounded.width, h); + r->u.composite.mask_y = y + h; + return CAIRO_STATUS_SUCCESS; + } + + if (y != r->u.composite.mask_y) { + pixman_image_composite32 (PIXMAN_OP_CLEAR, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, y + r->u.composite.src_y, + 0, 0, + r->composite->unbounded.x, r->u.composite.mask_y, + r->composite->unbounded.width, y - r->u.composite.mask_y); + } + + if (spans[0].x != r->composite->unbounded.x) { + pixman_image_composite32 (PIXMAN_OP_CLEAR, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, y + r->u.composite.src_y, + 0, 0, + r->composite->unbounded.x, y, + spans[0].x - r->composite->unbounded.x, h); + } + + do { + int op = spans[0].coverage ? r->op : PIXMAN_OP_CLEAR; + pixman_image_composite32 (op, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, y + r->u.composite.src_y, + 0, 0, + spans[0].x, y, + spans[1].x - spans[0].x, h); + spans++; + } while (--num_spans > 1); + + if (spans[0].x != r->composite->unbounded.x + r->composite->unbounded.width) { + pixman_image_composite32 (PIXMAN_OP_CLEAR, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, y + r->u.composite.src_y, + 0, 0, + spans[0].x, y, + r->composite->unbounded.x + r->composite->unbounded.width - spans[0].x, h); + } + + r->u.composite.mask_y = y + h; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_mono_finish_unbounded_spans (void *abstract_renderer) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (r->u.composite.mask_y < r->composite->unbounded.y + r->composite->unbounded.height) { + pixman_image_composite32 (PIXMAN_OP_CLEAR, + r->src, NULL, r->u.composite.dst, + r->composite->unbounded.x + r->u.composite.src_x, r->u.composite.mask_y + r->u.composite.src_y, + 0, 0, + r->composite->unbounded.x, r->u.composite.mask_y, + r->composite->unbounded.width, + r->composite->unbounded.y + r->composite->unbounded.height - r->u.composite.mask_y); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +mono_renderer_init (cairo_image_span_renderer_t *r, + const cairo_composite_rectangles_t *composite, + cairo_antialias_t antialias, + cairo_bool_t needs_clip) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *)composite->surface; + + if (antialias != CAIRO_ANTIALIAS_NONE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (!_cairo_pattern_is_opaque_solid (&composite->mask_pattern.base)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + r->base.render_rows = NULL; + if (composite->source_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_color_t *color; + + color = &composite->source_pattern.solid.color; + if (composite->op == CAIRO_OPERATOR_CLEAR) + color = CAIRO_COLOR_TRANSPARENT; + + if (fill_reduces_to_source (composite->op, color, dst, &r->u.fill.pixel)) { + /* Use plain C for the fill operations as the span length is + * typically small, too small to payback the startup overheads of + * using SSE2 etc. + */ + switch (PIXMAN_FORMAT_BPP(dst->pixman_format)) { + case 8: r->base.render_rows = _fill8_spans; break; + case 16: r->base.render_rows = _fill16_spans; break; + case 32: r->base.render_rows = _fill32_spans; break; + default: break; + } + r->u.fill.data = dst->data; + r->u.fill.stride = dst->stride; + } + } else if ((composite->op == CAIRO_OPERATOR_SOURCE || + (composite->op == CAIRO_OPERATOR_OVER && + (dst->base.is_clear || (dst->base.content & CAIRO_CONTENT_ALPHA) == 0))) && + composite->source_pattern.base.type == CAIRO_PATTERN_TYPE_SURFACE && + composite->source_pattern.surface.surface->backend->type == CAIRO_SURFACE_TYPE_IMAGE && + to_image_surface(composite->source_pattern.surface.surface)->format == dst->format) + { + cairo_image_surface_t *src = + to_image_surface(composite->source_pattern.surface.surface); + int tx, ty; + + if (_cairo_matrix_is_integer_translation(&composite->source_pattern.base.matrix, + &tx, &ty) && + composite->bounded.x + tx >= 0 && + composite->bounded.y + ty >= 0 && + composite->bounded.x + composite->bounded.width + tx <= src->width && + composite->bounded.y + composite->bounded.height + ty <= src->height) { + + r->u.blit.stride = dst->stride; + r->u.blit.data = dst->data; + r->u.blit.src_stride = src->stride; + r->u.blit.src_data = src->data + src->stride * ty + tx * 4; + r->base.render_rows = _blit_spans; + } + } + + if (r->base.render_rows == NULL) { + r->src = _pixman_image_for_pattern (dst, &composite->source_pattern.base, FALSE, + &composite->unbounded, + &composite->source_sample_area, + &r->u.composite.src_x, &r->u.composite.src_y); + if (unlikely (r->src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + r->u.composite.dst = to_pixman_image (composite->surface); + r->op = _pixman_operator (composite->op); + if (composite->is_bounded == 0) { + r->base.render_rows = _mono_unbounded_spans; + r->base.finish = _mono_finish_unbounded_spans; + r->u.composite.mask_y = composite->unbounded.y; + } else + r->base.render_rows = _mono_spans; + } + r->bpp = PIXMAN_FORMAT_BPP(dst->pixman_format); + + return CAIRO_INT_STATUS_SUCCESS; +} + +#define ONE_HALF 0x7f +#define RB_MASK 0x00ff00ff +#define RB_ONE_HALF 0x007f007f +#define RB_MASK_PLUS_ONE 0x01000100 +#define G_SHIFT 8 +static inline uint32_t +mul8x2_8 (uint32_t a, uint8_t b) +{ + uint32_t t = (a & RB_MASK) * b + RB_ONE_HALF; + return ((t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT) & RB_MASK; +} + +static inline uint32_t +add8x2_8x2 (uint32_t a, uint32_t b) +{ + uint32_t t = a + b; + t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK); + return t & RB_MASK; +} + +static inline uint8_t +mul8_8 (uint8_t a, uint8_t b) +{ + uint16_t t = a * (uint16_t)b + ONE_HALF; + return ((t >> G_SHIFT) + t) >> G_SHIFT; +} + +static inline uint32_t +lerp8x4 (uint32_t src, uint8_t a, uint32_t dst) +{ + return (add8x2_8x2 (mul8x2_8 (src, a), + mul8x2_8 (dst, ~a)) | + add8x2_8x2 (mul8x2_8 (src >> G_SHIFT, a), + mul8x2_8 (dst >> G_SHIFT, ~a)) << G_SHIFT); +} + +static cairo_status_t +_fill_a8_lerp_opaque_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + uint8_t *d = r->u.fill.data + r->u.fill.stride*y; + do { + uint8_t a = spans[0].coverage; + if (a) { + int len = spans[1].x - spans[0].x; + if (a == 0xff) { + memset(d + spans[0].x, r->u.fill.pixel, len); + } else { + uint8_t s = mul8_8(a, r->u.fill.pixel); + uint8_t *dst = d + spans[0].x; + a = ~a; + while (len--) { + uint8_t t = mul8_8(*dst, a); + *dst++ = t + s; + } + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + uint8_t a = spans[0].coverage; + if (a) { + int yy = y, hh = h; + if (a == 0xff) { + do { + int len = spans[1].x - spans[0].x; + uint8_t *d = r->u.fill.data + r->u.fill.stride*yy + spans[0].x; + memset(d, r->u.fill.pixel, len); + yy++; + } while (--hh); + } else { + uint8_t s = mul8_8(a, r->u.fill.pixel); + a = ~a; + do { + int len = spans[1].x - spans[0].x; + uint8_t *d = r->u.fill.data + r->u.fill.stride*yy + spans[0].x; + while (len--) { + uint8_t t = mul8_8(*d, a); + *d++ = t + s; + } + yy++; + } while (--hh); + } + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_fill_xrgb32_lerp_opaque_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + do { + uint8_t a = spans[0].coverage; + if (a) { + int len = spans[1].x - spans[0].x; + uint32_t *d = (uint32_t*)(r->u.fill.data + r->u.fill.stride*y + spans[0].x*4); + if (a == 0xff) { + if (len > 31) { + pixman_fill ((uint32_t *)r->u.fill.data, r->u.fill.stride / sizeof(uint32_t), 32, + spans[0].x, y, len, 1, r->u.fill.pixel); + } else { + uint32_t *d = (uint32_t*)(r->u.fill.data + r->u.fill.stride*y + spans[0].x*4); + while (len-- > 0) + *d++ = r->u.fill.pixel; + } + } else while (len-- > 0) { + *d = lerp8x4 (r->u.fill.pixel, a, *d); + d++; + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + uint8_t a = spans[0].coverage; + if (a) { + if (a == 0xff) { + if (spans[1].x - spans[0].x > 16) { + pixman_fill ((uint32_t *)r->u.fill.data, r->u.fill.stride / sizeof(uint32_t), 32, + spans[0].x, y, spans[1].x - spans[0].x, h, + r->u.fill.pixel); + } else { + int yy = y, hh = h; + do { + int len = spans[1].x - spans[0].x; + uint32_t *d = (uint32_t*)(r->u.fill.data + r->u.fill.stride*yy + spans[0].x*4); + while (len--) + *d++ = r->u.fill.pixel; + yy++; + } while (--hh); + } + } else { + int yy = y, hh = h; + do { + int len = spans[1].x - spans[0].x; + uint32_t *d = (uint32_t *)(r->u.fill.data + r->u.fill.stride*yy + spans[0].x*4); + while (len--) { + *d = lerp8x4 (r->u.fill.pixel, a, *d); + d++; + } + yy++; + } while (--hh); + } + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_fill_a8_lerp_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + do { + uint8_t a = mul8_8 (spans[0].coverage, r->bpp); + if (a) { + int len = spans[1].x - spans[0].x; + uint8_t *d = r->u.fill.data + r->u.fill.stride*y + spans[0].x; + uint16_t p = (uint16_t)a * r->u.fill.pixel + 0x7f; + uint16_t ia = ~a; + while (len--) { + uint16_t t = *d*ia + p; + *d++ = (t + (t>>8)) >> 8; + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + uint8_t a = mul8_8 (spans[0].coverage, r->bpp); + if (a) { + int yy = y, hh = h; + uint16_t p = (uint16_t)a * r->u.fill.pixel + 0x7f; + uint16_t ia = ~a; + do { + int len = spans[1].x - spans[0].x; + uint8_t *d = r->u.fill.data + r->u.fill.stride*yy + spans[0].x; + while (len--) { + uint16_t t = *d*ia + p; + *d++ = (t + (t>>8)) >> 8; + } + yy++; + } while (--hh); + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_fill_xrgb32_lerp_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + do { + uint8_t a = mul8_8 (spans[0].coverage, r->bpp); + if (a) { + int len = spans[1].x - spans[0].x; + uint32_t *d = (uint32_t*)(r->u.fill.data + r->u.fill.stride*y + spans[0].x*4); + while (len--) { + *d = lerp8x4 (r->u.fill.pixel, a, *d); + d++; + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + uint8_t a = mul8_8 (spans[0].coverage, r->bpp); + if (a) { + int yy = y, hh = h; + do { + int len = spans[1].x - spans[0].x; + uint32_t *d = (uint32_t *)(r->u.fill.data + r->u.fill.stride*yy + spans[0].x*4); + while (len--) { + *d = lerp8x4 (r->u.fill.pixel, a, *d); + d++; + } + yy++; + } while (--hh); + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_blit_xrgb32_lerp_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (likely(h == 1)) { + uint8_t *src = r->u.blit.src_data + y*r->u.blit.src_stride; + uint8_t *dst = r->u.blit.data + y*r->u.blit.stride; + do { + uint8_t a = mul8_8 (spans[0].coverage, r->bpp); + if (a) { + uint32_t *s = (uint32_t*)src + spans[0].x; + uint32_t *d = (uint32_t*)dst + spans[0].x; + int len = spans[1].x - spans[0].x; + if (a == 0xff) { + if (len == 1) + *d = *s; + else + memcpy(d, s, len*4); + } else { + while (len--) { + *d = lerp8x4 (*s, a, *d); + s++, d++; + } + } + } + spans++; + } while (--num_spans > 1); + } else { + do { + uint8_t a = mul8_8 (spans[0].coverage, r->bpp); + if (a) { + int yy = y, hh = h; + do { + uint32_t *s = (uint32_t *)(r->u.blit.src_data + yy*r->u.blit.src_stride + spans[0].x * 4); + uint32_t *d = (uint32_t *)(r->u.blit.data + yy*r->u.blit.stride + spans[0].x * 4); + int len = spans[1].x - spans[0].x; + if (a == 0xff) { + if (len == 1) + *d = *s; + else + memcpy(d, s, len * 4); + } else { + while (len--) { + *d = lerp8x4 (*s, a, *d); + s++, d++; + } + } + yy++; + } while (--hh); + } + spans++; + } while (--num_spans > 1); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_inplace_spans (void *abstract_renderer, + int y, int h, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + uint8_t *mask; + int x0, x1; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + if (num_spans == 2 && spans[0].coverage == 0xff) { + pixman_image_composite32 (r->op, r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + spans[0].x, y, + spans[1].x - spans[0].x, h); + return CAIRO_STATUS_SUCCESS; + } + + mask = (uint8_t *)pixman_image_get_data (r->mask); + x1 = x0 = spans[0].x; + do { + int len = spans[1].x - spans[0].x; + *mask++ = spans[0].coverage; + if (len > 1) { + if (len >= r->u.composite.run_length && spans[0].coverage == 0xff) { + if (x1 != x0) { + pixman_image_composite32 (r->op, r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + x1 - x0, h); + } + pixman_image_composite32 (r->op, r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + spans[0].x, y, + len, h); + mask = (uint8_t *)pixman_image_get_data (r->mask); + x0 = spans[1].x; + } else if (spans[0].coverage == 0x0 && + x1 - x0 > r->u.composite.run_length) { + pixman_image_composite32 (r->op, r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + x1 - x0, h); + mask = (uint8_t *)pixman_image_get_data (r->mask); + x0 = spans[1].x; + }else { + memset (mask, spans[0].coverage, --len); + mask += len; + } + } + x1 = spans[1].x; + spans++; + } while (--num_spans > 1); + + if (x1 != x0) { + pixman_image_composite32 (r->op, r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + x1 - x0, h); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_inplace_opacity_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + uint8_t *mask; + int x0, x1; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + mask = (uint8_t *)pixman_image_get_data (r->mask); + x1 = x0 = spans[0].x; + do { + int len = spans[1].x - spans[0].x; + uint8_t m = mul8_8(spans[0].coverage, r->bpp); + *mask++ = m; + if (len > 1) { + if (m == 0 && + x1 - x0 > r->u.composite.run_length) { + pixman_image_composite32 (r->op, r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + x1 - x0, h); + mask = (uint8_t *)pixman_image_get_data (r->mask); + x0 = spans[1].x; + }else { + memset (mask, m, --len); + mask += len; + } + } + x1 = spans[1].x; + spans++; + } while (--num_spans > 1); + + if (x1 != x0) { + pixman_image_composite32 (r->op, r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + x1 - x0, h); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_inplace_src_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + uint8_t *m; + int x0; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + x0 = spans[0].x; + m = r->_buf; + do { + int len = spans[1].x - spans[0].x; + if (len >= r->u.composite.run_length && spans[0].coverage == 0xff) { + if (spans[0].x != x0) { +#if PIXMAN_HAS_OP_LERP + pixman_image_composite32 (PIXMAN_OP_LERP_SRC, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#else + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + r->mask, NULL, r->u.composite.dst, + 0, 0, + 0, 0, + x0, y, + spans[0].x - x0, h); + pixman_image_composite32 (PIXMAN_OP_ADD, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#endif + } + + pixman_image_composite32 (PIXMAN_OP_SRC, + r->src, NULL, r->u.composite.dst, + spans[0].x + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + spans[0].x, y, + spans[1].x - spans[0].x, h); + + m = r->_buf; + x0 = spans[1].x; + } else if (spans[0].coverage == 0x0) { + if (spans[0].x != x0) { +#if PIXMAN_HAS_OP_LERP + pixman_image_composite32 (PIXMAN_OP_LERP_SRC, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#else + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + r->mask, NULL, r->u.composite.dst, + 0, 0, + 0, 0, + x0, y, + spans[0].x - x0, h); + pixman_image_composite32 (PIXMAN_OP_ADD, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#endif + } + + m = r->_buf; + x0 = spans[1].x; + } else { + *m++ = spans[0].coverage; + if (len > 1) { + memset (m, spans[0].coverage, --len); + m += len; + } + } + spans++; + } while (--num_spans > 1); + + if (spans[0].x != x0) { +#if PIXMAN_HAS_OP_LERP + pixman_image_composite32 (PIXMAN_OP_LERP_SRC, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#else + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + r->mask, NULL, r->u.composite.dst, + 0, 0, + 0, 0, + x0, y, + spans[0].x - x0, h); + pixman_image_composite32 (PIXMAN_OP_ADD, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#endif + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_inplace_src_opacity_spans (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + cairo_image_span_renderer_t *r = abstract_renderer; + uint8_t *mask; + int x0; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + x0 = spans[0].x; + mask = (uint8_t *)pixman_image_get_data (r->mask); + do { + int len = spans[1].x - spans[0].x; + uint8_t m = mul8_8(spans[0].coverage, r->bpp); + if (m == 0) { + if (spans[0].x != x0) { +#if PIXMAN_HAS_OP_LERP + pixman_image_composite32 (PIXMAN_OP_LERP_SRC, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#else + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + r->mask, NULL, r->u.composite.dst, + 0, 0, + 0, 0, + x0, y, + spans[0].x - x0, h); + pixman_image_composite32 (PIXMAN_OP_ADD, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#endif + } + + mask = (uint8_t *)pixman_image_get_data (r->mask); + x0 = spans[1].x; + } else { + *mask++ = m; + if (len > 1) { + memset (mask, m, --len); + mask += len; + } + } + spans++; + } while (--num_spans > 1); + + if (spans[0].x != x0) { +#if PIXMAN_HAS_OP_LERP + pixman_image_composite32 (PIXMAN_OP_LERP_SRC, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#else + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + r->mask, NULL, r->u.composite.dst, + 0, 0, + 0, 0, + x0, y, + spans[0].x - x0, h); + pixman_image_composite32 (PIXMAN_OP_ADD, + r->src, r->mask, r->u.composite.dst, + x0 + r->u.composite.src_x, + y + r->u.composite.src_y, + 0, 0, + x0, y, + spans[0].x - x0, h); +#endif + } + + return CAIRO_STATUS_SUCCESS; +} + +static void free_pixels (pixman_image_t *image, void *data) +{ + free (data); +} + +static cairo_int_status_t +inplace_renderer_init (cairo_image_span_renderer_t *r, + const cairo_composite_rectangles_t *composite, + cairo_antialias_t antialias, + cairo_bool_t needs_clip) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *)composite->surface; + uint8_t *buf; + + if (composite->mask_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) + return CAIRO_INT_STATUS_UNSUPPORTED; + + r->base.render_rows = NULL; + r->bpp = composite->mask_pattern.solid.color.alpha_short >> 8; + + if (composite->source_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_color_t *color; + + color = &composite->source_pattern.solid.color; + if (composite->op == CAIRO_OPERATOR_CLEAR) + color = CAIRO_COLOR_TRANSPARENT; + + if (fill_reduces_to_source (composite->op, color, dst, &r->u.fill.pixel)) { + /* Use plain C for the fill operations as the span length is + * typically small, too small to payback the startup overheads of + * using SSE2 etc. + */ + if (r->bpp == 0xff) { + switch (dst->format) { + case CAIRO_FORMAT_A8: + r->base.render_rows = _fill_a8_lerp_opaque_spans; + break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_ARGB32: + r->base.render_rows = _fill_xrgb32_lerp_opaque_spans; + break; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + default: break; + } + } else { + switch (dst->format) { + case CAIRO_FORMAT_A8: + r->base.render_rows = _fill_a8_lerp_spans; + break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_ARGB32: + r->base.render_rows = _fill_xrgb32_lerp_spans; + break; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + default: break; + } + } + r->u.fill.data = dst->data; + r->u.fill.stride = dst->stride; + } + } else if ((dst->format == CAIRO_FORMAT_ARGB32 || dst->format == CAIRO_FORMAT_RGB24) && + (composite->op == CAIRO_OPERATOR_SOURCE || + (composite->op == CAIRO_OPERATOR_OVER && + (dst->base.is_clear || (dst->base.content & CAIRO_CONTENT_ALPHA) == 0))) && + composite->source_pattern.base.type == CAIRO_PATTERN_TYPE_SURFACE && + composite->source_pattern.surface.surface->backend->type == CAIRO_SURFACE_TYPE_IMAGE && + to_image_surface(composite->source_pattern.surface.surface)->format == dst->format) + { + cairo_image_surface_t *src = + to_image_surface(composite->source_pattern.surface.surface); + int tx, ty; + + if (_cairo_matrix_is_integer_translation(&composite->source_pattern.base.matrix, + &tx, &ty) && + composite->bounded.x + tx >= 0 && + composite->bounded.y + ty >= 0 && + composite->bounded.x + composite->bounded.width + tx <= src->width && + composite->bounded.y + composite->bounded.height + ty <= src->height) { + + assert(PIXMAN_FORMAT_BPP(dst->pixman_format) == 32); + r->u.blit.stride = dst->stride; + r->u.blit.data = dst->data; + r->u.blit.src_stride = src->stride; + r->u.blit.src_data = src->data + src->stride * ty + tx * 4; + r->base.render_rows = _blit_xrgb32_lerp_spans; + } + } + if (r->base.render_rows == NULL) { + const cairo_pattern_t *src = &composite->source_pattern.base; + unsigned int width; + + if (composite->is_bounded == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + r->base.render_rows = r->bpp == 0xff ? _inplace_spans : _inplace_opacity_spans; + width = (composite->bounded.width + 3) & ~3; + + r->u.composite.run_length = 8; + if (src->type == CAIRO_PATTERN_TYPE_LINEAR || + src->type == CAIRO_PATTERN_TYPE_RADIAL) + r->u.composite.run_length = 256; + if (dst->base.is_clear && + (composite->op == CAIRO_OPERATOR_SOURCE || + composite->op == CAIRO_OPERATOR_OVER || + composite->op == CAIRO_OPERATOR_ADD)) { + r->op = PIXMAN_OP_SRC; + } else if (composite->op == CAIRO_OPERATOR_SOURCE) { + r->base.render_rows = r->bpp == 0xff ? _inplace_src_spans : _inplace_src_opacity_spans; + r->u.composite.mask_y = r->composite->unbounded.y; + width = (composite->unbounded.width + 3) & ~3; + } else if (composite->op == CAIRO_OPERATOR_CLEAR) { + r->op = PIXMAN_OP_OUT_REVERSE; + src = NULL; + } else { + r->op = _pixman_operator (composite->op); + } + + r->src = _pixman_image_for_pattern (dst, src, FALSE, + &composite->bounded, + &composite->source_sample_area, + &r->u.composite.src_x, &r->u.composite.src_y); + if (unlikely (r->src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* Create an effectively unbounded mask by repeating the single line */ + buf = r->_buf; + if (width > SZ_BUF) { + buf = malloc (width); + if (unlikely (buf == NULL)) { + pixman_image_unref (r->src); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + r->mask = pixman_image_create_bits (PIXMAN_a8, + width, composite->unbounded.height, + (uint32_t *)buf, 0); + if (unlikely (r->mask == NULL)) { + pixman_image_unref (r->src); + if (buf != r->_buf) + free (buf); + return _cairo_error(CAIRO_STATUS_NO_MEMORY); + } + + if (buf != r->_buf) + pixman_image_set_destroy_function (r->mask, free_pixels, buf); + + r->u.composite.dst = dst->pixman_image; + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +span_renderer_init (cairo_abstract_span_renderer_t *_r, + const cairo_composite_rectangles_t *composite, + cairo_antialias_t antialias, + cairo_bool_t needs_clip) +{ + cairo_image_span_renderer_t *r = (cairo_image_span_renderer_t *)_r; + cairo_image_surface_t *dst = (cairo_image_surface_t *)composite->surface; + const cairo_pattern_t *source = &composite->source_pattern.base; + cairo_operator_t op = composite->op; + cairo_int_status_t status; + + TRACE ((stderr, "%s: antialias=%d, needs_clip=%d\n", __FUNCTION__, + antialias, needs_clip)); + + if (needs_clip) + return CAIRO_INT_STATUS_UNSUPPORTED; + + r->composite = composite; + r->mask = NULL; + r->src = NULL; + r->base.finish = NULL; + + status = mono_renderer_init (r, composite, antialias, needs_clip); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = inplace_renderer_init (r, composite, antialias, needs_clip); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + r->bpp = 0; + + if (op == CAIRO_OPERATOR_CLEAR) { +#if PIXMAN_HAS_OP_LERP + op = PIXMAN_OP_LERP_CLEAR; +#else + source = &_cairo_pattern_white.base; + op = PIXMAN_OP_OUT_REVERSE; +#endif + } else if (dst->base.is_clear && + (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_OVER || + op == CAIRO_OPERATOR_ADD)) { + op = PIXMAN_OP_SRC; + } else if (op == CAIRO_OPERATOR_SOURCE) { + if (_cairo_pattern_is_opaque (&composite->source_pattern.base, + &composite->source_sample_area)) + { + op = PIXMAN_OP_OVER; + } + else + { +#if PIXMAN_HAS_OP_LERP + op = PIXMAN_OP_LERP_SRC; +#else + return CAIRO_INT_STATUS_UNSUPPORTED; +#endif + } + } else { + op = _pixman_operator (op); + } + r->op = op; + + r->src = _pixman_image_for_pattern (dst, source, FALSE, + &composite->unbounded, + &composite->source_sample_area, + &r->u.mask.src_x, &r->u.mask.src_y); + if (unlikely (r->src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + r->opacity = 1.0; + if (composite->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID) { + r->opacity = composite->mask_pattern.solid.color.alpha; + } else { + pixman_image_t *mask; + int mask_x, mask_y; + + mask = _pixman_image_for_pattern (dst, + &composite->mask_pattern.base, + TRUE, + &composite->unbounded, + &composite->mask_sample_area, + &mask_x, &mask_y); + if (unlikely (mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* XXX Component-alpha? */ + if ((dst->base.content & CAIRO_CONTENT_COLOR) == 0 && + _cairo_pattern_is_opaque (source, &composite->source_sample_area)) + { + pixman_image_unref (r->src); + r->src = mask; + r->u.mask.src_x = mask_x; + r->u.mask.src_y = mask_y; + mask = NULL; + } + + if (mask) { + pixman_image_unref (mask); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + + r->u.mask.extents = composite->unbounded; + r->u.mask.stride = (r->u.mask.extents.width + 3) & ~3; + if (r->u.mask.extents.height * r->u.mask.stride > SZ_BUF) { + r->mask = pixman_image_create_bits (PIXMAN_a8, + r->u.mask.extents.width, + r->u.mask.extents.height, + NULL, 0); + + r->base.render_rows = _cairo_image_spans; + r->base.finish = NULL; + } else { + r->mask = pixman_image_create_bits (PIXMAN_a8, + r->u.mask.extents.width, + r->u.mask.extents.height, + (uint32_t *)r->_buf, r->u.mask.stride); + + r->base.render_rows = _cairo_image_spans_and_zero; + r->base.finish = _cairo_image_finish_spans_and_zero; + } + if (unlikely (r->mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + r->u.mask.data = (uint8_t *) pixman_image_get_data (r->mask); + r->u.mask.stride = pixman_image_get_stride (r->mask); + + r->u.mask.extents.height += r->u.mask.extents.y; + return CAIRO_STATUS_SUCCESS; +} + +static void +span_renderer_fini (cairo_abstract_span_renderer_t *_r, + cairo_int_status_t status) +{ + cairo_image_span_renderer_t *r = (cairo_image_span_renderer_t *) _r; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + if (r->base.finish) + r->base.finish (r); + } + if (likely (status == CAIRO_INT_STATUS_SUCCESS && r->bpp == 0)) { + const cairo_composite_rectangles_t *composite = r->composite; + + pixman_image_composite32 (r->op, r->src, r->mask, + to_pixman_image (composite->surface), + composite->unbounded.x + r->u.mask.src_x, + composite->unbounded.y + r->u.mask.src_y, + 0, 0, + composite->unbounded.x, + composite->unbounded.y, + composite->unbounded.width, + composite->unbounded.height); + } + + if (r->src) + pixman_image_unref (r->src); + if (r->mask) + pixman_image_unref (r->mask); +} +#endif + +const cairo_compositor_t * +_cairo_image_spans_compositor_get (void) +{ + static cairo_spans_compositor_t spans; + static cairo_compositor_t shape; + + if (spans.base.delegate == NULL) { + _cairo_shape_mask_compositor_init (&shape, + _cairo_image_traps_compositor_get()); + shape.glyphs = NULL; + + _cairo_spans_compositor_init (&spans, &shape); + + spans.flags = 0; +#if PIXMAN_HAS_OP_LERP + spans.flags |= CAIRO_SPANS_COMPOSITOR_HAS_LERP; +#endif + + //spans.acquire = acquire; + //spans.release = release; + spans.fill_boxes = fill_boxes; + spans.draw_image_boxes = draw_image_boxes; + //spans.copy_boxes = copy_boxes; + spans.pattern_to_surface = _cairo_image_source_create_for_pattern; + //spans.check_composite_boxes = check_composite_boxes; + spans.composite_boxes = composite_boxes; + //spans.check_span_renderer = check_span_renderer; + spans.renderer_init = span_renderer_init; + spans.renderer_fini = span_renderer_fini; + } + + return &spans.base; +} diff --git a/src/cairo-image-info-private.h b/src/cairo-image-info-private.h new file mode 100644 index 000000000..e64928e40 --- /dev/null +++ b/src/cairo-image-info-private.h @@ -0,0 +1,68 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + */ + +#ifndef CAIRO_IMAGE_INFO_PRIVATE_H +#define CAIRO_IMAGE_INFO_PRIVATE_H + +#include "cairoint.h" + +typedef struct _cairo_image_info { + int width; + int height; + int num_components; + int bits_per_component; +} cairo_image_info_t; + +cairo_private cairo_int_status_t +_cairo_image_info_get_jpeg_info (cairo_image_info_t *info, + const unsigned char *data, + long length); + +cairo_private cairo_int_status_t +_cairo_image_info_get_jpx_info (cairo_image_info_t *info, + const unsigned char *data, + unsigned long length); + +cairo_private cairo_int_status_t +_cairo_image_info_get_png_info (cairo_image_info_t *info, + const unsigned char *data, + unsigned long length); + +cairo_private cairo_int_status_t +_cairo_image_info_get_jbig2_info (cairo_image_info_t *info, + const unsigned char *data, + unsigned long length); + +#endif /* CAIRO_IMAGE_INFO_PRIVATE_H */ diff --git a/src/cairo-image-info.c b/src/cairo-image-info.c new file mode 100644 index 000000000..26e7ae5af --- /dev/null +++ b/src/cairo-image-info.c @@ -0,0 +1,421 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-image-info-private.h" + +/* JPEG (image/jpeg) + * + * http://www.w3.org/Graphics/JPEG/itu-t81.pdf + */ + +/* Markers with no parameters. All other markers are followed by a two + * byte length of the parameters. */ +#define TEM 0x01 +#define RST_begin 0xd0 +#define RST_end 0xd7 +#define SOI 0xd8 +#define EOI 0xd9 + +/* Start of frame markers. */ +#define SOF0 0xc0 +#define SOF1 0xc1 +#define SOF2 0xc2 +#define SOF3 0xc3 +#define SOF5 0xc5 +#define SOF6 0xc6 +#define SOF7 0xc7 +#define SOF9 0xc9 +#define SOF10 0xca +#define SOF11 0xcb +#define SOF13 0xcd +#define SOF14 0xce +#define SOF15 0xcf + +static const unsigned char * +_jpeg_skip_segment (const unsigned char *p) +{ + int len; + + p++; + len = (p[0] << 8) | p[1]; + + return p + len; +} + +static void +_jpeg_extract_info (cairo_image_info_t *info, const unsigned char *p) +{ + info->width = (p[6] << 8) + p[7]; + info->height = (p[4] << 8) + p[5]; + info->num_components = p[8]; + info->bits_per_component = p[3]; +} + +cairo_int_status_t +_cairo_image_info_get_jpeg_info (cairo_image_info_t *info, + const unsigned char *data, + long length) +{ + const unsigned char *p = data; + + while (p + 1 < data + length) { + if (*p != 0xff) + return CAIRO_INT_STATUS_UNSUPPORTED; + p++; + + switch (*p) { + /* skip fill bytes */ + case 0xff: + p++; + break; + + case TEM: + case SOI: + case EOI: + p++; + break; + + case SOF0: + case SOF1: + case SOF2: + case SOF3: + case SOF5: + case SOF6: + case SOF7: + case SOF9: + case SOF10: + case SOF11: + case SOF13: + case SOF14: + case SOF15: + /* Start of frame found. Extract the image parameters. */ + if (p + 8 > data + length) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _jpeg_extract_info (info, p); + return CAIRO_STATUS_SUCCESS; + + default: + if (*p >= RST_begin && *p <= RST_end) { + p++; + break; + } + + if (p + 2 > data + length) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p = _jpeg_skip_segment (p); + break; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +/* JPEG 2000 (image/jp2) + * + * http://www.jpeg.org/public/15444-1annexi.pdf + */ + +#define JPX_FILETYPE 0x66747970 +#define JPX_JP2_HEADER 0x6A703268 +#define JPX_IMAGE_HEADER 0x69686472 + +static const unsigned char _jpx_signature[] = { + 0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a +}; + +static const unsigned char * +_jpx_next_box (const unsigned char *p) +{ + return p + get_unaligned_be32 (p); +} + +static const unsigned char * +_jpx_get_box_contents (const unsigned char *p) +{ + return p + 8; +} + +static cairo_bool_t +_jpx_match_box (const unsigned char *p, const unsigned char *end, uint32_t type) +{ + uint32_t length; + + if (p + 8 < end) { + length = get_unaligned_be32 (p); + if (get_unaligned_be32 (p + 4) == type && p + length < end) + return TRUE; + } + + return FALSE; +} + +static const unsigned char * +_jpx_find_box (const unsigned char *p, const unsigned char *end, uint32_t type) +{ + while (p < end) { + if (_jpx_match_box (p, end, type)) + return p; + p = _jpx_next_box (p); + } + + return NULL; +} + +static void +_jpx_extract_info (const unsigned char *p, cairo_image_info_t *info) +{ + info->height = get_unaligned_be32 (p); + info->width = get_unaligned_be32 (p + 4); + info->num_components = (p[8] << 8) + p[9]; + info->bits_per_component = p[10]; +} + +cairo_int_status_t +_cairo_image_info_get_jpx_info (cairo_image_info_t *info, + const unsigned char *data, + unsigned long length) +{ + const unsigned char *p = data; + const unsigned char *end = data + length; + + /* First 12 bytes must be the JPEG 2000 signature box. */ + if (length < ARRAY_LENGTH(_jpx_signature) || + memcmp(p, _jpx_signature, ARRAY_LENGTH(_jpx_signature)) != 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p += ARRAY_LENGTH(_jpx_signature); + + /* Next box must be a File Type Box */ + if (! _jpx_match_box (p, end, JPX_FILETYPE)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p = _jpx_next_box (p); + + /* Locate the JP2 header box. */ + p = _jpx_find_box (p, end, JPX_JP2_HEADER); + if (!p) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Step into the JP2 header box. First box must be the Image + * Header */ + p = _jpx_get_box_contents (p); + if (! _jpx_match_box (p, end, JPX_IMAGE_HEADER)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Get the image info */ + p = _jpx_get_box_contents (p); + _jpx_extract_info (p, info); + + return CAIRO_STATUS_SUCCESS; +} + +/* PNG (image/png) + * + * http://www.w3.org/TR/2003/REC-PNG-20031110/ + */ + +#define PNG_IHDR 0x49484452 + +static const unsigned char _png_magic[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; + +cairo_int_status_t +_cairo_image_info_get_png_info (cairo_image_info_t *info, + const unsigned char *data, + unsigned long length) +{ + const unsigned char *p = data; + const unsigned char *end = data + length; + + if (length < 8 || memcmp (data, _png_magic, 8) != 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p += 8; + + /* The first chunk must be IDHR. IDHR has 13 bytes of data plus + * the 12 bytes of overhead for the chunk. */ + if (p + 13 + 12 > end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p += 4; + if (get_unaligned_be32 (p) != PNG_IHDR) + return CAIRO_INT_STATUS_UNSUPPORTED; + + p += 4; + info->width = get_unaligned_be32 (p); + p += 4; + info->height = get_unaligned_be32 (p); + + return CAIRO_STATUS_SUCCESS; +} + +static const unsigned char * +_jbig2_find_data_end (const unsigned char *p, + const unsigned char *end, + int type) +{ + unsigned char end_seq[2]; + int mmr; + + /* Segments of type "Immediate generic region" may have an + * unspecified data length. The JBIG2 specification specifies the + * method to find the end of the data for these segments. */ + if (type == 36 || type == 38 || type == 39) { + if (p + 18 < end) { + mmr = p[17] & 0x01; + if (mmr) { + /* MMR encoding ends with 0x00, 0x00 */ + end_seq[0] = 0x00; + end_seq[1] = 0x00; + } else { + /* Template encoding ends with 0xff, 0xac */ + end_seq[0] = 0xff; + end_seq[1] = 0xac; + } + p += 18; + while (p < end) { + if (p[0] == end_seq[0] && p[1] == end_seq[1]) { + /* Skip the 2 terminating bytes and the 4 byte row count that follows. */ + p += 6; + if (p < end) + return p; + } + p++; + } + } + } + + return NULL; +} + +static const unsigned char * +_jbig2_get_next_segment (const unsigned char *p, + const unsigned char *end, + int *type, + const unsigned char **data, + unsigned long *data_len) +{ + unsigned long seg_num; + cairo_bool_t big_page_size; + int num_segs; + int ref_seg_bytes; + int referred_size; + + if (p + 6 >= end) + return NULL; + + seg_num = get_unaligned_be32 (p); + *type = p[4] & 0x3f; + big_page_size = (p[4] & 0x40) != 0; + p += 5; + + num_segs = p[0] >> 5; + if (num_segs == 7) { + num_segs = get_unaligned_be32 (p) & 0x1fffffff; + ref_seg_bytes = 4 + ((num_segs + 1)/8); + } else { + ref_seg_bytes = 1; + } + p += ref_seg_bytes; + + if (seg_num <= 256) + referred_size = 1; + else if (seg_num <= 65536) + referred_size = 2; + else + referred_size = 4; + + p += num_segs * referred_size; + p += big_page_size ? 4 : 1; + if (p + 4 >= end) + return NULL; + + *data_len = get_unaligned_be32 (p); + p += 4; + *data = p; + + if (*data_len == 0xffffffff) { + /* if data length is -1 we have to scan through the data to find the end */ + p = _jbig2_find_data_end (*data, end, *type); + if (!p || p >= end) + return NULL; + + *data_len = p - *data; + } else { + p += *data_len; + } + + if (p < end) + return p; + else + return NULL; +} + +static void +_jbig2_extract_info (cairo_image_info_t *info, const unsigned char *p) +{ + info->width = get_unaligned_be32 (p); + info->height = get_unaligned_be32 (p + 4); + info->num_components = 1; + info->bits_per_component = 1; +} + +cairo_int_status_t +_cairo_image_info_get_jbig2_info (cairo_image_info_t *info, + const unsigned char *data, + unsigned long length) +{ + const unsigned char *p = data; + const unsigned char *end = data + length; + int seg_type; + const unsigned char *seg_data; + unsigned long seg_data_len; + + while (p && p < end) { + p = _jbig2_get_next_segment (p, end, &seg_type, &seg_data, &seg_data_len); + if (p && seg_type == 48 && seg_data_len > 8) { + /* page information segment */ + _jbig2_extract_info (info, seg_data); + return CAIRO_STATUS_SUCCESS; + } + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c new file mode 100644 index 000000000..950053db2 --- /dev/null +++ b/src/cairo-image-source.c @@ -0,0 +1,1601 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * Copyright © 2009,2010,2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* The purpose of this file/surface is to simply translate a pattern + * to a pixman_image_t and thence to feed it back to the general + * compositor interface. + */ + +#include "cairoint.h" + +#include "cairo-image-surface-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-error-private.h" +#include "cairo-pattern-inline.h" +#include "cairo-paginated-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-observer-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-private.h" + +#define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */ + +#if CAIRO_NO_MUTEX +#define PIXMAN_HAS_ATOMIC_OPS 1 +#endif + +#if PIXMAN_HAS_ATOMIC_OPS +static pixman_image_t *__pixman_transparent_image; +static pixman_image_t *__pixman_black_image; +static pixman_image_t *__pixman_white_image; + +static pixman_image_t * +_pixman_transparent_image (void) +{ + pixman_image_t *image; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = __pixman_transparent_image; + if (unlikely (image == NULL)) { + pixman_color_t color; + + color.red = 0x00; + color.green = 0x00; + color.blue = 0x00; + color.alpha = 0x00; + + image = pixman_image_create_solid_fill (&color); + if (unlikely (image == NULL)) + return NULL; + + if (_cairo_atomic_ptr_cmpxchg (&__pixman_transparent_image, + NULL, image)) + { + pixman_image_ref (image); + } + } else { + pixman_image_ref (image); + } + + return image; +} + +static pixman_image_t * +_pixman_black_image (void) +{ + pixman_image_t *image; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = __pixman_black_image; + if (unlikely (image == NULL)) { + pixman_color_t color; + + color.red = 0x00; + color.green = 0x00; + color.blue = 0x00; + color.alpha = 0xffff; + + image = pixman_image_create_solid_fill (&color); + if (unlikely (image == NULL)) + return NULL; + + if (_cairo_atomic_ptr_cmpxchg (&__pixman_black_image, + NULL, image)) + { + pixman_image_ref (image); + } + } else { + pixman_image_ref (image); + } + + return image; +} + +static pixman_image_t * +_pixman_white_image (void) +{ + pixman_image_t *image; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + image = __pixman_white_image; + if (unlikely (image == NULL)) { + pixman_color_t color; + + color.red = 0xffff; + color.green = 0xffff; + color.blue = 0xffff; + color.alpha = 0xffff; + + image = pixman_image_create_solid_fill (&color); + if (unlikely (image == NULL)) + return NULL; + + if (_cairo_atomic_ptr_cmpxchg (&__pixman_white_image, + NULL, image)) + { + pixman_image_ref (image); + } + } else { + pixman_image_ref (image); + } + + return image; +} + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + static uint32_t x; + return x = (x ^ rol (x, 5) ^ rol (x, 24)) + 0x37798849; +#undef rol +} + +static struct { + cairo_color_t color; + pixman_image_t *image; +} cache[16]; +static int n_cached; + +#else /* !PIXMAN_HAS_ATOMIC_OPS */ +static pixman_image_t * +_pixman_transparent_image (void) +{ + TRACE ((stderr, "%s\n", __FUNCTION__)); + return _pixman_image_for_color (CAIRO_COLOR_TRANSPARENT); +} + +static pixman_image_t * +_pixman_black_image (void) +{ + TRACE ((stderr, "%s\n", __FUNCTION__)); + return _pixman_image_for_color (CAIRO_COLOR_BLACK); +} + +static pixman_image_t * +_pixman_white_image (void) +{ + TRACE ((stderr, "%s\n", __FUNCTION__)); + return _pixman_image_for_color (CAIRO_COLOR_WHITE); +} +#endif /* !PIXMAN_HAS_ATOMIC_OPS */ + + +pixman_image_t * +_pixman_image_for_color (const cairo_color_t *cairo_color) +{ + pixman_color_t color; + pixman_image_t *image; + +#if PIXMAN_HAS_ATOMIC_OPS + int i; + + if (CAIRO_COLOR_IS_CLEAR (cairo_color)) + return _pixman_transparent_image (); + + if (CAIRO_COLOR_IS_OPAQUE (cairo_color)) { + if (cairo_color->red_short <= 0x00ff && + cairo_color->green_short <= 0x00ff && + cairo_color->blue_short <= 0x00ff) + { + return _pixman_black_image (); + } + + if (cairo_color->red_short >= 0xff00 && + cairo_color->green_short >= 0xff00 && + cairo_color->blue_short >= 0xff00) + { + return _pixman_white_image (); + } + } + + CAIRO_MUTEX_LOCK (_cairo_image_solid_cache_mutex); + for (i = 0; i < n_cached; i++) { + if (_cairo_color_equal (&cache[i].color, cairo_color)) { + image = pixman_image_ref (cache[i].image); + goto UNLOCK; + } + } +#endif + + color.red = cairo_color->red_short; + color.green = cairo_color->green_short; + color.blue = cairo_color->blue_short; + color.alpha = cairo_color->alpha_short; + + image = pixman_image_create_solid_fill (&color); +#if PIXMAN_HAS_ATOMIC_OPS + if (image == NULL) + goto UNLOCK; + + if (n_cached < ARRAY_LENGTH (cache)) { + i = n_cached++; + } else { + i = hars_petruska_f54_1_random () % ARRAY_LENGTH (cache); + pixman_image_unref (cache[i].image); + } + cache[i].image = pixman_image_ref (image); + cache[i].color = *cairo_color; + +UNLOCK: + CAIRO_MUTEX_UNLOCK (_cairo_image_solid_cache_mutex); +#endif + return image; +} + + +void +_cairo_image_reset_static_data (void) +{ +#if PIXMAN_HAS_ATOMIC_OPS + while (n_cached) + pixman_image_unref (cache[--n_cached].image); + + if (__pixman_transparent_image) { + pixman_image_unref (__pixman_transparent_image); + __pixman_transparent_image = NULL; + } + + if (__pixman_black_image) { + pixman_image_unref (__pixman_black_image); + __pixman_black_image = NULL; + } + + if (__pixman_white_image) { + pixman_image_unref (__pixman_white_image); + __pixman_white_image = NULL; + } +#endif +} + +static pixman_image_t * +_pixman_image_for_gradient (const cairo_gradient_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + int *ix, int *iy) +{ + pixman_image_t *pixman_image; + pixman_gradient_stop_t pixman_stops_static[2]; + pixman_gradient_stop_t *pixman_stops = pixman_stops_static; + pixman_transform_t pixman_transform; + cairo_matrix_t matrix; + cairo_circle_double_t extremes[2]; + pixman_point_fixed_t p1, p2; + unsigned int i; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (pattern->n_stops > ARRAY_LENGTH(pixman_stops_static)) { + pixman_stops = _cairo_malloc_ab (pattern->n_stops, + sizeof(pixman_gradient_stop_t)); + if (unlikely (pixman_stops == NULL)) + return NULL; + } + + for (i = 0; i < pattern->n_stops; i++) { + pixman_stops[i].x = _cairo_fixed_16_16_from_double (pattern->stops[i].offset); + pixman_stops[i].color.red = pattern->stops[i].color.red_short; + pixman_stops[i].color.green = pattern->stops[i].color.green_short; + pixman_stops[i].color.blue = pattern->stops[i].color.blue_short; + pixman_stops[i].color.alpha = pattern->stops[i].color.alpha_short; + } + + _cairo_gradient_pattern_fit_to_range (pattern, PIXMAN_MAX_INT >> 1, &matrix, extremes); + + p1.x = _cairo_fixed_16_16_from_double (extremes[0].center.x); + p1.y = _cairo_fixed_16_16_from_double (extremes[0].center.y); + p2.x = _cairo_fixed_16_16_from_double (extremes[1].center.x); + p2.y = _cairo_fixed_16_16_from_double (extremes[1].center.y); + + if (pattern->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + pixman_image = pixman_image_create_linear_gradient (&p1, &p2, + pixman_stops, + pattern->n_stops); + } else { + pixman_fixed_t r1, r2; + + r1 = _cairo_fixed_16_16_from_double (extremes[0].radius); + r2 = _cairo_fixed_16_16_from_double (extremes[1].radius); + + pixman_image = pixman_image_create_radial_gradient (&p1, &p2, r1, r2, + pixman_stops, + pattern->n_stops); + } + + if (pixman_stops != pixman_stops_static) + free (pixman_stops); + + if (unlikely (pixman_image == NULL)) + return NULL; + + *ix = *iy = 0; + status = _cairo_matrix_to_pixman_matrix_offset (&matrix, pattern->base.filter, + extents->x + extents->width/2., + extents->y + extents->height/2., + &pixman_transform, ix, iy); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + if (unlikely (status != CAIRO_INT_STATUS_SUCCESS) || + ! pixman_image_set_transform (pixman_image, &pixman_transform)) + { + pixman_image_unref (pixman_image); + return NULL; + } + } + + { + pixman_repeat_t pixman_repeat; + + switch (pattern->base.extend) { + default: + case CAIRO_EXTEND_NONE: + pixman_repeat = PIXMAN_REPEAT_NONE; + break; + case CAIRO_EXTEND_REPEAT: + pixman_repeat = PIXMAN_REPEAT_NORMAL; + break; + case CAIRO_EXTEND_REFLECT: + pixman_repeat = PIXMAN_REPEAT_REFLECT; + break; + case CAIRO_EXTEND_PAD: + pixman_repeat = PIXMAN_REPEAT_PAD; + break; + } + + pixman_image_set_repeat (pixman_image, pixman_repeat); + } + + return pixman_image; +} + +static pixman_image_t * +_pixman_image_for_mesh (const cairo_mesh_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + int *tx, int *ty) +{ + pixman_image_t *image; + int width, height; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + *tx = -extents->x; + *ty = -extents->y; + width = extents->width; + height = extents->height; + + image = pixman_image_create_bits (PIXMAN_a8r8g8b8, width, height, NULL, 0); + if (unlikely (image == NULL)) + return NULL; + + _cairo_mesh_pattern_rasterize (pattern, + pixman_image_get_data (image), + width, height, + pixman_image_get_stride (image), + *tx, *ty); + return image; +} + +struct acquire_source_cleanup { + cairo_surface_t *surface; + cairo_image_surface_t *image; + void *image_extra; +}; + +static void +_acquire_source_cleanup (pixman_image_t *pixman_image, + void *closure) +{ + struct acquire_source_cleanup *data = closure; + + _cairo_surface_release_source_image (data->surface, + data->image, + data->image_extra); + free (data); +} + +static void +_defer_free_cleanup (pixman_image_t *pixman_image, + void *closure) +{ + cairo_surface_destroy (closure); +} + +static uint16_t +expand_channel (uint16_t v, uint32_t bits) +{ + int offset = 16 - bits; + while (offset > 0) { + v |= v >> bits; + offset -= bits; + bits += bits; + } + return v; +} + +static pixman_image_t * +_pixel_to_solid (cairo_image_surface_t *image, int x, int y) +{ + uint32_t pixel; + pixman_color_t color; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + switch (image->format) { + default: + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return NULL; + + case CAIRO_FORMAT_A1: + pixel = *(uint8_t *) (image->data + y * image->stride + x/8); + return pixel & (1 << (x&7)) ? _pixman_black_image () : _pixman_transparent_image (); + + case CAIRO_FORMAT_A8: + color.alpha = *(uint8_t *) (image->data + y * image->stride + x); + color.alpha |= color.alpha << 8; + if (color.alpha == 0) + return _pixman_transparent_image (); + if (color.alpha == 0xffff) + return _pixman_black_image (); + + color.red = color.green = color.blue = 0; + return pixman_image_create_solid_fill (&color); + + case CAIRO_FORMAT_RGB16_565: + pixel = *(uint16_t *) (image->data + y * image->stride + 2 * x); + if (pixel == 0) + return _pixman_black_image (); + if (pixel == 0xffff) + return _pixman_white_image (); + + color.alpha = 0xffff; + color.red = expand_channel ((pixel >> 11 & 0x1f) << 11, 5); + color.green = expand_channel ((pixel >> 5 & 0x3f) << 10, 6); + color.blue = expand_channel ((pixel & 0x1f) << 11, 5); + return pixman_image_create_solid_fill (&color); + + case CAIRO_FORMAT_RGB30: + pixel = *(uint32_t *) (image->data + y * image->stride + 4 * x); + pixel &= 0x3fffffff; /* ignore alpha bits */ + if (pixel == 0) + return _pixman_black_image (); + if (pixel == 0x3fffffff) + return _pixman_white_image (); + + /* convert 10bpc to 16bpc */ + color.alpha = 0xffff; + color.red = expand_channel((pixel >> 20) & 0x3fff, 10); + color.green = expand_channel((pixel >> 10) & 0x3fff, 10); + color.blue = expand_channel(pixel & 0x3fff, 10); + return pixman_image_create_solid_fill (&color); + + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + pixel = *(uint32_t *) (image->data + y * image->stride + 4 * x); + color.alpha = image->format == CAIRO_FORMAT_ARGB32 ? (pixel >> 24) | (pixel >> 16 & 0xff00) : 0xffff; + if (color.alpha == 0) + return _pixman_transparent_image (); + if (pixel == 0xffffffff) + return _pixman_white_image (); + if (color.alpha == 0xffff && (pixel & 0xffffff) == 0) + return _pixman_black_image (); + + color.red = (pixel >> 16 & 0xff) | (pixel >> 8 & 0xff00); + color.green = (pixel >> 8 & 0xff) | (pixel & 0xff00); + color.blue = (pixel & 0xff) | (pixel << 8 & 0xff00); + return pixman_image_create_solid_fill (&color); + } +} + +/* ========================================================================== */ + +/* Index into filter table */ +typedef enum +{ + KERNEL_IMPULSE, + KERNEL_BOX, + KERNEL_LINEAR, + KERNEL_MITCHELL, + KERNEL_NOTCH, + KERNEL_CATMULL_ROM, + KERNEL_LANCZOS3, + KERNEL_LANCZOS3_STRETCHED, + KERNEL_TENT +} kernel_t; + +/* Produce contribution of a filter of size r for pixel centered on x. + For a typical low-pass function this evaluates the function at x/r. + If the frequency is higher than 1/2, such as when r is less than 1, + this may need to integrate several samples, see cubic for examples. +*/ +typedef double (* kernel_func_t) (double x, double r); + +/* Return maximum number of pixels that will be non-zero. Except for + impluse this is the maximum of 2 and the width of the non-zero part + of the filter rounded up to the next integer. +*/ +typedef int (* kernel_width_func_t) (double r); + +/* Table of filters */ +typedef struct +{ + kernel_t kernel; + kernel_func_t func; + kernel_width_func_t width; +} filter_info_t; + +/* PIXMAN_KERNEL_IMPULSE: Returns pixel nearest the center. This + matches PIXMAN_FILTER_NEAREST. This is useful if you wish to + combine the result of nearest in one direction with another filter + in the other. +*/ + +static double +impulse_kernel (double x, double r) +{ + return 1; +} + +static int +impulse_width (double r) +{ + return 1; +} + +/* PIXMAN_KERNEL_BOX: Intersection of a box of width r with square + pixels. This is the smallest possible filter such that the output + image contains an equal contribution from all the input + pixels. Lots of software uses this. The function is a trapazoid of + width r+1, not a box. + + When r == 1.0, PIXMAN_KERNEL_BOX, PIXMAN_KERNEL_LINEAR, and + PIXMAN_KERNEL_TENT all produce the same filter, allowing + them to be exchanged at this point. +*/ + +static double +box_kernel (double x, double r) +{ + return MAX (0.0, MIN (MIN (r, 1.0), + MIN ((r + 1) / 2 - x, (r + 1) / 2 + x))); +} + +static int +box_width (double r) +{ + return r < 1.0 ? 2 : ceil(r + 1); +} + +/* PIXMAN_KERNEL_LINEAR: Weighted sum of the two pixels nearest the + center, or a triangle of width 2. This matches + PIXMAN_FILTER_BILINEAR. This is useful if you wish to combine the + result of bilinear in one direction with another filter in the + other. This is not a good filter if r > 1. You may actually want + PIXMAN_FILTER_TENT. + + When r == 1.0, PIXMAN_KERNEL_BOX, PIXMAN_KERNEL_LINEAR, and + PIXMAN_KERNEL_TENT all produce the same filter, allowing + them to be exchanged at this point. +*/ + +static double +linear_kernel (double x, double r) +{ + return MAX (1.0 - fabs(x), 0.0); +} + +static int +linear_width (double r) +{ + return 2; +} + +/* Cubic functions described in the Mitchell-Netravali paper. + http://mentallandscape.com/Papers_siggraph88.pdf. This describes + all possible cubic functions that can be used for sampling. +*/ + +static double +general_cubic (double x, double r, double B, double C) +{ + double ax; + if (r < 1.0) + return + general_cubic(x * 2 - .5, r * 2, B, C) + + general_cubic(x * 2 + .5, r * 2, B, C); + + ax = fabs (x / r); + + if (ax < 1) + { + return (((12 - 9 * B - 6 * C) * ax + + (-18 + 12 * B + 6 * C)) * ax * ax + + (6 - 2 * B)) / 6; + } + else if (ax < 2) + { + return ((((-B - 6 * C) * ax + + (6 * B + 30 * C)) * ax + + (-12 * B - 48 * C)) * ax + + (8 * B + 24 * C)) / 6; + } + else + { + return 0.0; + } +} + +static int +cubic_width (double r) +{ + return MAX (2, ceil (r * 4)); +} + +/* PIXMAN_KERNEL_CATMULL_ROM: Catmull-Rom interpolation. Often called + "cubic interpolation", "b-spline", or just "cubic" by other + software. This filter has negative values so it can produce ringing + and output pixels outside the range of input pixels. This is very + close to lanczos2 so there is no reason to supply that as well. +*/ + +static double +cubic_kernel (double x, double r) +{ + return general_cubic (x, r, 0.0, 0.5); +} + +/* PIXMAN_KERNEL_MITCHELL: Cubic recommended by the Mitchell-Netravali + paper. This has negative values and because the values at +/-1 are + not zero it does not interpolate the pixels, meaning it will change + an image even if there is no translation. +*/ + +static double +mitchell_kernel (double x, double r) +{ + return general_cubic (x, r, 1/3.0, 1/3.0); +} + +/* PIXMAN_KERNEL_NOTCH: Cubic recommended by the Mitchell-Netravali + paper to remove postaliasing artifacts. This does not remove + aliasing already present in the source image, though it may appear + to due to it's excessive blurriness. In any case this is more + useful than gaussian for image reconstruction. +*/ + +static double +notch_kernel (double x, double r) +{ + return general_cubic (x, r, 1.5, -0.25); +} + +/* PIXMAN_KERNEL_LANCZOS3: lanczos windowed sinc function from -3 to + +3. Very popular with high-end software though I think any + advantage over cubics is hidden by quantization and programming + mistakes. You will see LANCZOS5 or even 7 sometimes. +*/ + +static double +sinc (double x) +{ + return x ? sin (M_PI * x) / (M_PI * x) : 1.0; +} + +static double +lanczos (double x, double n) +{ + return fabs (x) < n ? sinc (x) * sinc (x * (1.0 / n)) : 0.0; +} + +static double +lanczos3_kernel (double x, double r) +{ + if (r < 1.0) + return + lanczos3_kernel (x * 2 - .5, r * 2) + + lanczos3_kernel (x * 2 + .5, r * 2); + else + return lanczos (x / r, 3.0); +} + +static int +lanczos3_width (double r) +{ + return MAX (2, ceil (r * 6)); +} + +/* PIXMAN_KERNEL_LANCZOS3_STRETCHED - The LANCZOS3 kernel widened by + 4/3. Recommended by Jim Blinn + http://graphics.cs.cmu.edu/nsp/course/15-462/Fall07/462/papers/jaggy.pdf +*/ + +static double +nice_kernel (double x, double r) +{ + return lanczos3_kernel (x, r * (4.0/3)); +} + +static int +nice_width (double r) +{ + return MAX (2.0, ceil (r * 8)); +} + +/* PIXMAN_KERNEL_TENT: Triangle of width 2r. Lots of software uses + this as a "better" filter, twice the size of a box but smaller than + a cubic. + + When r == 1.0, PIXMAN_KERNEL_BOX, PIXMAN_KERNEL_LINEAR, and + PIXMAN_KERNEL_TENT all produce the same filter, allowing + them to be exchanged at this point. +*/ + +static double +tent_kernel (double x, double r) +{ + if (r < 1.0) + return box_kernel(x, r); + else + return MAX (1.0 - fabs(x / r), 0.0); +} + +static int +tent_width (double r) +{ + return r < 1.0 ? 2 : ceil(2 * r); +} + + +static const filter_info_t filters[] = +{ + { KERNEL_IMPULSE, impulse_kernel, impulse_width }, + { KERNEL_BOX, box_kernel, box_width }, + { KERNEL_LINEAR, linear_kernel, linear_width }, + { KERNEL_MITCHELL, mitchell_kernel, cubic_width }, + { KERNEL_NOTCH, notch_kernel, cubic_width }, + { KERNEL_CATMULL_ROM, cubic_kernel, cubic_width }, + { KERNEL_LANCZOS3, lanczos3_kernel, lanczos3_width }, + { KERNEL_LANCZOS3_STRETCHED,nice_kernel, nice_width }, + { KERNEL_TENT, tent_kernel, tent_width } +}; + +/* Fills in one dimension of the filter array */ +static void get_filter(kernel_t filter, double r, + int width, int subsample, + pixman_fixed_t* out) +{ + int i; + pixman_fixed_t *p = out; + int n_phases = 1 << subsample; + double step = 1.0 / n_phases; + kernel_func_t func = filters[filter].func; + + /* special-case the impulse filter: */ + if (width <= 1) + { + for (i = 0; i < n_phases; ++i) + *p++ = pixman_fixed_1; + return; + } + + for (i = 0; i < n_phases; ++i) + { + double frac = (i + .5) * step; + /* Center of left-most pixel: */ + double x1 = ceil (frac - width / 2.0 - 0.5) - frac + 0.5; + double total = 0; + pixman_fixed_t new_total = 0; + int j; + + for (j = 0; j < width; ++j) + { + double v = func(x1 + j, r); + total += v; + p[j] = pixman_double_to_fixed (v); + } + + /* Normalize */ + total = 1 / total; + for (j = 0; j < width; ++j) + new_total += (p[j] *= total); + + /* Put any error on center pixel */ + p[width / 2] += (pixman_fixed_1 - new_total); + + p += width; + } +} + + +/* Create the parameter list for a SEPARABLE_CONVOLUTION filter + * with the given kernels and scale parameters. + */ +static pixman_fixed_t * +create_separable_convolution (int *n_values, + kernel_t xfilter, + double sx, + kernel_t yfilter, + double sy) +{ + int xwidth, xsubsample, ywidth, ysubsample, size_x, size_y; + pixman_fixed_t *params; + + xwidth = filters[xfilter].width(sx); + xsubsample = 0; + if (xwidth > 1) + while (sx * (1 << xsubsample) <= 128.0) xsubsample++; + size_x = (1 << xsubsample) * xwidth; + + ywidth = filters[yfilter].width(sy); + ysubsample = 0; + if (ywidth > 1) + while (sy * (1 << ysubsample) <= 128.0) ysubsample++; + size_y = (1 << ysubsample) * ywidth; + + *n_values = 4 + size_x + size_y; + params = malloc (*n_values * sizeof (pixman_fixed_t)); + if (!params) return 0; + + params[0] = pixman_int_to_fixed (xwidth); + params[1] = pixman_int_to_fixed (ywidth); + params[2] = pixman_int_to_fixed (xsubsample); + params[3] = pixman_int_to_fixed (ysubsample); + + get_filter(xfilter, sx, xwidth, xsubsample, params + 4); + get_filter(yfilter, sy, ywidth, ysubsample, params + 4 + size_x); + + return params; +} + +/* ========================================================================== */ + +static cairo_bool_t +_pixman_image_set_properties (pixman_image_t *pixman_image, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + int *ix,int *iy) +{ + pixman_transform_t pixman_transform; + cairo_int_status_t status; + + status = _cairo_matrix_to_pixman_matrix_offset (&pattern->matrix, + pattern->filter, + extents->x + extents->width/2., + extents->y + extents->height/2., + &pixman_transform, ix, iy); + if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) + { + /* If the transform is an identity, we don't need to set it + * and we can use any filtering, so choose the fastest one. */ + pixman_image_set_filter (pixman_image, PIXMAN_FILTER_NEAREST, NULL, 0); + } + else if (unlikely (status != CAIRO_INT_STATUS_SUCCESS || + ! pixman_image_set_transform (pixman_image, + &pixman_transform))) + { + return FALSE; + } + else + { + pixman_filter_t pixman_filter; + kernel_t kernel; + double dx, dy; + + /* Compute scale factors from the pattern matrix. These scale + * factors are from user to pattern space, and as such they + * are greater than 1.0 for downscaling and less than 1.0 for + * upscaling. The factors are the size of an axis-aligned + * rectangle with the same area as the parallelgram a 1x1 + * square transforms to. + */ + dx = hypot (pattern->matrix.xx, pattern->matrix.xy); + dy = hypot (pattern->matrix.yx, pattern->matrix.yy); + + /* Clip at maximum pixman_fixed number. Besides making it + * passable to pixman, this avoids errors from inf and nan. + */ + if (! (dx < 0x7FFF)) dx = 0x7FFF; + if (! (dy < 0x7FFF)) dy = 0x7FFF; + + switch (pattern->filter) { + case CAIRO_FILTER_FAST: + pixman_filter = PIXMAN_FILTER_FAST; + break; + case CAIRO_FILTER_GOOD: + pixman_filter = PIXMAN_FILTER_SEPARABLE_CONVOLUTION; + kernel = KERNEL_BOX; + /* Clip the filter size to prevent extreme slowness. This + value could be raised if 2-pass filtering is done */ + if (dx > 16.0) dx = 16.0; + if (dy > 16.0) dy = 16.0; + /* Match the bilinear filter for scales > .75: */ + if (dx < 1.0/0.75) dx = 1.0; + if (dy < 1.0/0.75) dy = 1.0; + break; + case CAIRO_FILTER_BEST: + pixman_filter = PIXMAN_FILTER_SEPARABLE_CONVOLUTION; + kernel = KERNEL_CATMULL_ROM; /* LANCZOS3 is better but not much */ + /* Clip the filter size to prevent extreme slowness. This + value could be raised if 2-pass filtering is done */ + if (dx > 16.0) { dx = 16.0; kernel = KERNEL_BOX; } + /* blur up to 2x scale, then blend to square pixels for larger: */ + else if (dx < 1.0) { + if (dx < 1.0/128) dx = 1.0/127; + else if (dx < 0.5) dx = 1.0 / (1.0 / dx - 1.0); + else dx = 1.0; + } + if (dy > 16.0) { dy = 16.0; kernel = KERNEL_BOX; } + else if (dy < 1.0) { + if (dy < 1.0/128) dy = 1.0/127; + else if (dy < 0.5) dy = 1.0 / (1.0 / dy - 1.0); + else dy = 1.0; + } + break; + case CAIRO_FILTER_NEAREST: + pixman_filter = PIXMAN_FILTER_NEAREST; + break; + case CAIRO_FILTER_BILINEAR: + pixman_filter = PIXMAN_FILTER_BILINEAR; + break; + case CAIRO_FILTER_GAUSSIAN: + /* XXX: The GAUSSIAN value has no implementation in cairo + * whatsoever, so it was really a mistake to have it in the + * API. We could fix this by officially deprecating it, or + * else inventing semantics and providing an actual + * implementation for it. */ + default: + pixman_filter = PIXMAN_FILTER_BEST; + } + + if (pixman_filter == PIXMAN_FILTER_SEPARABLE_CONVOLUTION) { + int n_params; + pixman_fixed_t *params; + params = create_separable_convolution + (&n_params, kernel, dx, kernel, dy); + pixman_image_set_filter (pixman_image, pixman_filter, + params, n_params); + free (params); + } else { + pixman_image_set_filter (pixman_image, pixman_filter, NULL, 0); + } + } + + { + pixman_repeat_t pixman_repeat; + + switch (pattern->extend) { + default: + case CAIRO_EXTEND_NONE: + pixman_repeat = PIXMAN_REPEAT_NONE; + break; + case CAIRO_EXTEND_REPEAT: + pixman_repeat = PIXMAN_REPEAT_NORMAL; + break; + case CAIRO_EXTEND_REFLECT: + pixman_repeat = PIXMAN_REPEAT_REFLECT; + break; + case CAIRO_EXTEND_PAD: + pixman_repeat = PIXMAN_REPEAT_PAD; + break; + } + + pixman_image_set_repeat (pixman_image, pixman_repeat); + } + + if (pattern->has_component_alpha) + pixman_image_set_component_alpha (pixman_image, TRUE); + + return TRUE; +} + +struct proxy { + cairo_surface_t base; + cairo_surface_t *image; +}; + +static cairo_status_t +proxy_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + struct proxy *proxy = abstract_surface; + return _cairo_surface_acquire_source_image (proxy->image, image_out, image_extra); +} + +static void +proxy_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + struct proxy *proxy = abstract_surface; + _cairo_surface_release_source_image (proxy->image, image, image_extra); +} + +static cairo_status_t +proxy_finish (void *abstract_surface) +{ + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t proxy_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_NULL, + proxy_finish, + NULL, + + NULL, /* create similar */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + proxy_acquire_source_image, + proxy_release_source_image, +}; + +static cairo_surface_t * +attach_proxy (cairo_surface_t *source, + cairo_surface_t *image) +{ + struct proxy *proxy; + + proxy = malloc (sizeof (*proxy)); + if (unlikely (proxy == NULL)) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_surface_init (&proxy->base, &proxy_backend, NULL, image->content); + + proxy->image = image; + _cairo_surface_attach_snapshot (source, &proxy->base, NULL); + + return &proxy->base; +} + +static void +detach_proxy (cairo_surface_t *source, + cairo_surface_t *proxy) +{ + cairo_surface_finish (proxy); + cairo_surface_destroy (proxy); +} + +static cairo_surface_t * +get_proxy (cairo_surface_t *proxy) +{ + return ((struct proxy *)proxy)->image; +} + +static pixman_image_t * +_pixman_image_for_recording (cairo_image_surface_t *dst, + const cairo_surface_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *ix, int *iy) +{ + cairo_surface_t *source, *clone, *proxy; + cairo_rectangle_int_t limit; + pixman_image_t *pixman_image; + cairo_status_t status; + cairo_extend_t extend; + cairo_matrix_t *m, matrix; + int tx = 0, ty = 0; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + *ix = *iy = 0; + + source = _cairo_pattern_get_source (pattern, &limit); + + extend = pattern->base.extend; + if (_cairo_rectangle_contains_rectangle (&limit, sample)) + extend = CAIRO_EXTEND_NONE; + if (extend == CAIRO_EXTEND_NONE) { + if (! _cairo_rectangle_intersect (&limit, sample)) + return _pixman_transparent_image (); + + if (! _cairo_matrix_is_identity (&pattern->base.matrix)) { + double x1, y1, x2, y2; + + matrix = pattern->base.matrix; + status = cairo_matrix_invert (&matrix); + assert (status == CAIRO_STATUS_SUCCESS); + + x1 = limit.x; + y1 = limit.y; + x2 = limit.x + limit.width; + y2 = limit.y + limit.height; + + _cairo_matrix_transform_bounding_box (&matrix, + &x1, &y1, &x2, &y2, NULL); + + limit.x = floor (x1); + limit.y = floor (y1); + limit.width = ceil (x2) - limit.x; + limit.height = ceil (y2) - limit.y; + } + } + tx = limit.x; + ty = limit.y; + + /* XXX transformations! */ + proxy = _cairo_surface_has_snapshot (source, &proxy_backend); + if (proxy != NULL) { + clone = cairo_surface_reference (get_proxy (proxy)); + goto done; + } + + if (is_mask) { + clone = cairo_image_surface_create (CAIRO_FORMAT_A8, + limit.width, limit.height); + } else { + if (dst->base.content == source->content) + clone = cairo_image_surface_create (dst->format, + limit.width, limit.height); + else + clone = _cairo_image_surface_create_with_content (source->content, + limit.width, + limit.height); + } + + m = NULL; + if (extend == CAIRO_EXTEND_NONE) { + matrix = pattern->base.matrix; + if (tx | ty) + cairo_matrix_translate (&matrix, tx, ty); + m = &matrix; + } else { + /* XXX extract scale factor for repeating patterns */ + } + + /* Handle recursion by returning future reads from the current image */ + proxy = attach_proxy (source, clone); + status = _cairo_recording_surface_replay_with_clip (source, m, clone, NULL); + detach_proxy (source, proxy); + if (unlikely (status)) { + cairo_surface_destroy (clone); + return NULL; + } + +done: + pixman_image = pixman_image_ref (((cairo_image_surface_t *)clone)->pixman_image); + cairo_surface_destroy (clone); + + *ix = -limit.x; + *iy = -limit.y; + if (extend != CAIRO_EXTEND_NONE) { + if (! _pixman_image_set_properties (pixman_image, + &pattern->base, extents, + ix, iy)) { + pixman_image_unref (pixman_image); + pixman_image= NULL; + } + } + + return pixman_image; +} + +static pixman_image_t * +_pixman_image_for_surface (cairo_image_surface_t *dst, + const cairo_surface_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *ix, int *iy) +{ + cairo_extend_t extend = pattern->base.extend; + pixman_image_t *pixman_image; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + *ix = *iy = 0; + pixman_image = NULL; + if (pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + return _pixman_image_for_recording(dst, pattern, + is_mask, extents, sample, + ix, iy); + + if (pattern->surface->type == CAIRO_SURFACE_TYPE_IMAGE && + (! is_mask || ! pattern->base.has_component_alpha || + (pattern->surface->content & CAIRO_CONTENT_COLOR) == 0)) + { + cairo_surface_t *defer_free = NULL; + cairo_image_surface_t *source = (cairo_image_surface_t *) pattern->surface; + cairo_surface_type_t type; + + if (_cairo_surface_is_snapshot (&source->base)) { + defer_free = _cairo_surface_snapshot_get_target (&source->base); + source = (cairo_image_surface_t *) defer_free; + } + + type = source->base.backend->type; + if (type == CAIRO_SURFACE_TYPE_IMAGE) { + if (extend != CAIRO_EXTEND_NONE && + sample->x >= 0 && + sample->y >= 0 && + sample->x + sample->width <= source->width && + sample->y + sample->height <= source->height) + { + extend = CAIRO_EXTEND_NONE; + } + + if (sample->width == 1 && sample->height == 1) { + if (sample->x < 0 || + sample->y < 0 || + sample->x >= source->width || + sample->y >= source->height) + { + if (extend == CAIRO_EXTEND_NONE) { + cairo_surface_destroy (defer_free); + return _pixman_transparent_image (); + } + } + else + { + pixman_image = _pixel_to_solid (source, + sample->x, sample->y); + if (pixman_image) { + cairo_surface_destroy (defer_free); + return pixman_image; + } + } + } + +#if PIXMAN_HAS_ATOMIC_OPS + /* avoid allocating a 'pattern' image if we can reuse the original */ + if (extend == CAIRO_EXTEND_NONE && + _cairo_matrix_is_pixman_translation (&pattern->base.matrix, + pattern->base.filter, + ix, iy)) + { + cairo_surface_destroy (defer_free); + return pixman_image_ref (source->pixman_image); + } +#endif + + pixman_image = pixman_image_create_bits (source->pixman_format, + source->width, + source->height, + (uint32_t *) source->data, + source->stride); + if (unlikely (pixman_image == NULL)) { + cairo_surface_destroy (defer_free); + return NULL; + } + + if (defer_free) { + pixman_image_set_destroy_function (pixman_image, + _defer_free_cleanup, + defer_free); + } + } else if (type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub; + cairo_bool_t is_contained = FALSE; + + sub = (cairo_surface_subsurface_t *) source; + source = (cairo_image_surface_t *) sub->target; + + if (sample->x >= 0 && + sample->y >= 0 && + sample->x + sample->width <= sub->extents.width && + sample->y + sample->height <= sub->extents.height) + { + is_contained = TRUE; + } + + if (sample->width == 1 && sample->height == 1) { + if (is_contained) { + pixman_image = _pixel_to_solid (source, + sub->extents.x + sample->x, + sub->extents.y + sample->y); + if (pixman_image) + return pixman_image; + } else { + if (extend == CAIRO_EXTEND_NONE) + return _pixman_transparent_image (); + } + } + +#if PIXMAN_HAS_ATOMIC_OPS + *ix = sub->extents.x; + *iy = sub->extents.y; + if (is_contained && + _cairo_matrix_is_pixman_translation (&pattern->base.matrix, + pattern->base.filter, + ix, iy)) + { + return pixman_image_ref (source->pixman_image); + } +#endif + + /* Avoid sub-byte offsets, force a copy in that case. */ + if (PIXMAN_FORMAT_BPP (source->pixman_format) >= 8) { + if (is_contained) { + void *data = source->data + + sub->extents.x * PIXMAN_FORMAT_BPP(source->pixman_format)/8 + + sub->extents.y * source->stride; + pixman_image = pixman_image_create_bits (source->pixman_format, + sub->extents.width, + sub->extents.height, + data, + source->stride); + if (unlikely (pixman_image == NULL)) + return NULL; + } else { + /* XXX for a simple translation and EXTEND_NONE we can + * fix up the pattern matrix instead. + */ + } + } + } + } + + if (pixman_image == NULL) { + struct acquire_source_cleanup *cleanup; + cairo_image_surface_t *image; + void *extra; + cairo_status_t status; + + status = _cairo_surface_acquire_source_image (pattern->surface, &image, &extra); + if (unlikely (status)) + return NULL; + + pixman_image = pixman_image_create_bits (image->pixman_format, + image->width, + image->height, + (uint32_t *) image->data, + image->stride); + if (unlikely (pixman_image == NULL)) { + _cairo_surface_release_source_image (pattern->surface, image, extra); + return NULL; + } + + cleanup = malloc (sizeof (*cleanup)); + if (unlikely (cleanup == NULL)) { + _cairo_surface_release_source_image (pattern->surface, image, extra); + pixman_image_unref (pixman_image); + return NULL; + } + + cleanup->surface = pattern->surface; + cleanup->image = image; + cleanup->image_extra = extra; + pixman_image_set_destroy_function (pixman_image, + _acquire_source_cleanup, cleanup); + } + + if (! _pixman_image_set_properties (pixman_image, + &pattern->base, extents, + ix, iy)) { + pixman_image_unref (pixman_image); + pixman_image= NULL; + } + + return pixman_image; +} + +struct raster_source_cleanup { + const cairo_pattern_t *pattern; + cairo_surface_t *surface; + cairo_image_surface_t *image; + void *image_extra; +}; + +static void +_raster_source_cleanup (pixman_image_t *pixman_image, + void *closure) +{ + struct raster_source_cleanup *data = closure; + + _cairo_surface_release_source_image (data->surface, + data->image, + data->image_extra); + + _cairo_raster_source_pattern_release (data->pattern, + data->surface); + + free (data); +} + +static pixman_image_t * +_pixman_image_for_raster (cairo_image_surface_t *dst, + const cairo_raster_source_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *ix, int *iy) +{ + pixman_image_t *pixman_image; + struct raster_source_cleanup *cleanup; + cairo_image_surface_t *image; + void *extra; + cairo_status_t status; + cairo_surface_t *surface; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + *ix = *iy = 0; + + surface = _cairo_raster_source_pattern_acquire (&pattern->base, + &dst->base, NULL); + if (unlikely (surface == NULL || surface->status)) + return NULL; + + status = _cairo_surface_acquire_source_image (surface, &image, &extra); + if (unlikely (status)) { + _cairo_raster_source_pattern_release (&pattern->base, surface); + return NULL; + } + + assert (image->width == pattern->extents.width); + assert (image->height == pattern->extents.height); + + pixman_image = pixman_image_create_bits (image->pixman_format, + image->width, + image->height, + (uint32_t *) image->data, + image->stride); + if (unlikely (pixman_image == NULL)) { + _cairo_surface_release_source_image (surface, image, extra); + _cairo_raster_source_pattern_release (&pattern->base, surface); + return NULL; + } + + cleanup = malloc (sizeof (*cleanup)); + if (unlikely (cleanup == NULL)) { + pixman_image_unref (pixman_image); + _cairo_surface_release_source_image (surface, image, extra); + _cairo_raster_source_pattern_release (&pattern->base, surface); + return NULL; + } + + cleanup->pattern = &pattern->base; + cleanup->surface = surface; + cleanup->image = image; + cleanup->image_extra = extra; + pixman_image_set_destroy_function (pixman_image, + _raster_source_cleanup, cleanup); + + if (! _pixman_image_set_properties (pixman_image, + &pattern->base, extents, + ix, iy)) { + pixman_image_unref (pixman_image); + pixman_image= NULL; + } + + return pixman_image; +} + +pixman_image_t * +_pixman_image_for_pattern (cairo_image_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *tx, int *ty) +{ + *tx = *ty = 0; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (pattern == NULL) + return _pixman_white_image (); + + switch (pattern->type) { + default: + ASSERT_NOT_REACHED; + case CAIRO_PATTERN_TYPE_SOLID: + return _pixman_image_for_color (&((const cairo_solid_pattern_t *) pattern)->color); + + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_LINEAR: + return _pixman_image_for_gradient ((const cairo_gradient_pattern_t *) pattern, + extents, tx, ty); + + case CAIRO_PATTERN_TYPE_MESH: + return _pixman_image_for_mesh ((const cairo_mesh_pattern_t *) pattern, + extents, tx, ty); + + case CAIRO_PATTERN_TYPE_SURFACE: + return _pixman_image_for_surface (dst, + (const cairo_surface_pattern_t *) pattern, + is_mask, extents, sample, + tx, ty); + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _pixman_image_for_raster (dst, + (const cairo_raster_source_pattern_t *) pattern, + is_mask, extents, sample, + tx, ty); + } +} + +static cairo_status_t +_cairo_image_source_finish (void *abstract_surface) +{ + cairo_image_source_t *source = abstract_surface; + + pixman_image_unref (source->pixman_image); + return CAIRO_STATUS_SUCCESS; +} + +const cairo_surface_backend_t _cairo_image_source_backend = { + CAIRO_SURFACE_TYPE_IMAGE, + _cairo_image_source_finish, + NULL, /* read-only wrapper */ +}; + +cairo_surface_t * +_cairo_image_source_create_for_pattern (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_image_source_t *source; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + source = malloc (sizeof (cairo_image_source_t)); + if (unlikely (source == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + source->pixman_image = + _pixman_image_for_pattern ((cairo_image_surface_t *)dst, + pattern, is_mask, + extents, sample, + src_x, src_y); + if (unlikely (source->pixman_image == NULL)) { + free (source); + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_surface_init (&source->base, + &_cairo_image_source_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + source->is_opaque_solid = + pattern == NULL || _cairo_pattern_is_opaque_solid (pattern); + + return &source->base; +} diff --git a/src/cairo-image-surface-inline.h b/src/cairo-image-surface-inline.h new file mode 100644 index 000000000..743d5fd3e --- /dev/null +++ b/src/cairo-image-surface-inline.h @@ -0,0 +1,96 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_IMAGE_SURFACE_INLINE_H +#define CAIRO_IMAGE_SURFACE_INLINE_H + +#include "cairo-surface-private.h" +#include "cairo-image-surface-private.h" + +CAIRO_BEGIN_DECLS + +static inline cairo_image_surface_t * +_cairo_image_surface_create_in_error (cairo_status_t status) +{ + return (cairo_image_surface_t *) _cairo_surface_create_in_error (status); +} + +static inline void +_cairo_image_surface_set_parent (cairo_image_surface_t *image, + cairo_surface_t *parent) +{ + image->parent = parent; +} + +static inline cairo_bool_t +_cairo_image_surface_is_clone (cairo_image_surface_t *image) +{ + return image->parent != NULL; +} + +/** + * _cairo_surface_is_image: + * @surface: a #cairo_surface_t + * + * Checks if a surface is an #cairo_image_surface_t + * + * Return value: %TRUE if the surface is an image surface + **/ +static inline cairo_bool_t +_cairo_surface_is_image (const cairo_surface_t *surface) +{ + /* _cairo_surface_nil sets a NULL backend so be safe */ + return surface->backend && surface->backend->type == CAIRO_SURFACE_TYPE_IMAGE; +} + +/** + * _cairo_surface_is_image_source: + * @surface: a #cairo_surface_t + * + * Checks if a surface is an #cairo_image_source_t + * + * Return value: %TRUE if the surface is an image source + **/ +static inline cairo_bool_t +_cairo_surface_is_image_source (const cairo_surface_t *surface) +{ + return surface->backend == &_cairo_image_source_backend; +} + +CAIRO_END_DECLS + +#endif /* CAIRO_IMAGE_SURFACE_INLINE_H */ diff --git a/src/cairo-image-surface-private.h b/src/cairo-image-surface-private.h new file mode 100644 index 000000000..8ca694c5e --- /dev/null +++ b/src/cairo-image-surface-private.h @@ -0,0 +1,238 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_IMAGE_SURFACE_PRIVATE_H +#define CAIRO_IMAGE_SURFACE_PRIVATE_H + +#include "cairo-surface-private.h" + +#include + +CAIRO_BEGIN_DECLS + +/* The canonical image backend */ +struct _cairo_image_surface { + cairo_surface_t base; + + pixman_image_t *pixman_image; + const cairo_compositor_t *compositor; + + /* Parenting is tricky wrt lifetime tracking... + * + * One use for tracking the parent of an image surface is for + * create_similar_image() where we wish to create a device specific + * surface but return an image surface to the user. In such a case, + * the image may be owned by the device specific surface, its parent, + * but the user lifetime tracking is then performed on the image. So + * when the image is then finalized we call cairo_surface_destroy() + * on the parent. However, for normal usage where the lifetime tracking + * is done on the parent surface, we need to be careful to unhook + * the image->parent pointer before finalizing the image. + */ + cairo_surface_t *parent; + + pixman_format_code_t pixman_format; + cairo_format_t format; + unsigned char *data; + + int width; + int height; + int stride; + int depth; + + unsigned owns_data : 1; + unsigned transparency : 2; + unsigned color : 2; +}; +#define to_image_surface(S) ((cairo_image_surface_t *)(S)) + +/* A wrapper for holding pixman images returned by create_for_pattern */ +typedef struct _cairo_image_source { + cairo_surface_t base; + + pixman_image_t *pixman_image; + unsigned is_opaque_solid : 1; +} cairo_image_source_t; + +cairo_private extern const cairo_surface_backend_t _cairo_image_surface_backend; +cairo_private extern const cairo_surface_backend_t _cairo_image_source_backend; + +cairo_private const cairo_compositor_t * +_cairo_image_mask_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_image_traps_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_image_spans_compositor_get (void); + +#define _cairo_image_default_compositor_get _cairo_image_spans_compositor_get + +cairo_private cairo_int_status_t +_cairo_image_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_image_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_image_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_image_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_image_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + +cairo_private void +_cairo_image_surface_init (cairo_image_surface_t *surface, + pixman_image_t *pixman_image, + pixman_format_code_t pixman_format); + +cairo_private cairo_surface_t * +_cairo_image_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, + int height); + +cairo_private cairo_image_surface_t * +_cairo_image_surface_map_to_image (void *abstract_other, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_int_status_t +_cairo_image_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image); + +cairo_private cairo_surface_t * +_cairo_image_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_image_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra); + +cairo_private void +_cairo_image_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra); + +cairo_private cairo_surface_t * +_cairo_image_surface_snapshot (void *abstract_surface); + +cairo_private_no_warn cairo_bool_t +_cairo_image_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle); + +cairo_private void +_cairo_image_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options); + +cairo_private cairo_surface_t * +_cairo_image_source_create_for_pattern (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y); + +cairo_private cairo_status_t +_cairo_image_surface_finish (void *abstract_surface); + +cairo_private pixman_image_t * +_pixman_image_for_color (const cairo_color_t *cairo_color); + +cairo_private pixman_image_t * +_pixman_image_for_pattern (cairo_image_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *tx, int *ty); + +cairo_private void +_pixman_image_add_traps (pixman_image_t *image, + int dst_x, int dst_y, + cairo_traps_t *traps); + +cairo_private void +_pixman_image_add_tristrip (pixman_image_t *image, + int dst_x, int dst_y, + cairo_tristrip_t *strip); + +cairo_private cairo_image_surface_t * +_cairo_image_surface_clone_subimage (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents); + +/* Similar to clone; but allow format conversion */ +cairo_private cairo_image_surface_t * +_cairo_image_surface_create_from_image (cairo_image_surface_t *other, + pixman_format_code_t format, + int x, int y, int width, int height, + int stride); + +CAIRO_END_DECLS + +#endif /* CAIRO_IMAGE_SURFACE_PRIVATE_H */ diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c new file mode 100644 index 000000000..1fd563d1c --- /dev/null +++ b/src/cairo-image-surface.c @@ -0,0 +1,1321 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * Copyright © 2009,2010,2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-boxes-private.h" +#include "cairo-clip-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-paginated-private.h" +#include "cairo-pattern-private.h" +#include "cairo-pixman-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-region-private.h" +#include "cairo-scaled-font-private.h" +#include "cairo-surface-snapshot-private.h" +#include "cairo-surface-subsurface-private.h" + +/* Limit on the width / height of an image surface in pixels. This is + * mainly determined by coordinates of things sent to pixman at the + * moment being in 16.16 format. */ +#define MAX_IMAGE_SIZE 32767 + +/** + * SECTION:cairo-image + * @Title: Image Surfaces + * @Short_Description: Rendering to memory buffers + * @See_Also: #cairo_surface_t + * + * Image surfaces provide the ability to render to memory buffers + * either allocated by cairo or by the calling code. The supported + * image formats are those defined in #cairo_format_t. + **/ + +/** + * CAIRO_HAS_IMAGE_SURFACE: + * + * Defined if the image surface backend is available. + * The image surface backend is always built in. + * This macro was added for completeness in cairo 1.8. + * + * Since: 1.8 + **/ + +static cairo_bool_t +_cairo_image_surface_is_size_valid (int width, int height) +{ + return 0 <= width && width <= MAX_IMAGE_SIZE && + 0 <= height && height <= MAX_IMAGE_SIZE; +} + +cairo_format_t +_cairo_format_from_pixman_format (pixman_format_code_t pixman_format) +{ + switch (pixman_format) { + case PIXMAN_a8r8g8b8: + return CAIRO_FORMAT_ARGB32; + case PIXMAN_x2r10g10b10: + return CAIRO_FORMAT_RGB30; + case PIXMAN_x8r8g8b8: + return CAIRO_FORMAT_RGB24; + case PIXMAN_a8: + return CAIRO_FORMAT_A8; + case PIXMAN_a1: + return CAIRO_FORMAT_A1; + case PIXMAN_r5g6b5: + return CAIRO_FORMAT_RGB16_565; +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,22,0) + case PIXMAN_r8g8b8a8: case PIXMAN_r8g8b8x8: +#endif +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,27,2) + case PIXMAN_a8r8g8b8_sRGB: +#endif + case PIXMAN_a8b8g8r8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: + case PIXMAN_b8g8r8: case PIXMAN_b5g6r5: + case PIXMAN_a1r5g5b5: case PIXMAN_x1r5g5b5: case PIXMAN_a1b5g5r5: + case PIXMAN_x1b5g5r5: case PIXMAN_a4r4g4b4: case PIXMAN_x4r4g4b4: + case PIXMAN_a4b4g4r4: case PIXMAN_x4b4g4r4: case PIXMAN_r3g3b2: + case PIXMAN_b2g3r3: case PIXMAN_a2r2g2b2: case PIXMAN_a2b2g2r2: + case PIXMAN_c8: case PIXMAN_g8: case PIXMAN_x4a4: + case PIXMAN_a4: case PIXMAN_r1g2b1: case PIXMAN_b1g2r1: + case PIXMAN_a1r1g1b1: case PIXMAN_a1b1g1r1: case PIXMAN_c4: + case PIXMAN_g4: case PIXMAN_g1: + case PIXMAN_yuy2: case PIXMAN_yv12: + case PIXMAN_b8g8r8x8: + case PIXMAN_b8g8r8a8: + case PIXMAN_a2b10g10r10: + case PIXMAN_x2b10g10r10: + case PIXMAN_a2r10g10b10: +#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,22,0) + case PIXMAN_x14r6g6b6: +#endif + default: + return CAIRO_FORMAT_INVALID; + } + + return CAIRO_FORMAT_INVALID; +} + +cairo_content_t +_cairo_content_from_pixman_format (pixman_format_code_t pixman_format) +{ + cairo_content_t content; + + content = 0; + if (PIXMAN_FORMAT_RGB (pixman_format)) + content |= CAIRO_CONTENT_COLOR; + if (PIXMAN_FORMAT_A (pixman_format)) + content |= CAIRO_CONTENT_ALPHA; + + return content; +} + +void +_cairo_image_surface_init (cairo_image_surface_t *surface, + pixman_image_t *pixman_image, + pixman_format_code_t pixman_format) +{ + surface->parent = NULL; + surface->pixman_image = pixman_image; + + surface->pixman_format = pixman_format; + surface->format = _cairo_format_from_pixman_format (pixman_format); + surface->data = (uint8_t *) pixman_image_get_data (pixman_image); + surface->owns_data = FALSE; + surface->transparency = CAIRO_IMAGE_UNKNOWN; + surface->color = CAIRO_IMAGE_UNKNOWN_COLOR; + + surface->width = pixman_image_get_width (pixman_image); + surface->height = pixman_image_get_height (pixman_image); + surface->stride = pixman_image_get_stride (pixman_image); + surface->depth = pixman_image_get_depth (pixman_image); + + surface->base.is_clear = surface->width == 0 || surface->height == 0; + + surface->compositor = _cairo_image_spans_compositor_get (); +} + +cairo_surface_t * +_cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, + pixman_format_code_t pixman_format) +{ + cairo_image_surface_t *surface; + + surface = malloc (sizeof (cairo_image_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_image_surface_backend, + NULL, /* device */ + _cairo_content_from_pixman_format (pixman_format)); + + _cairo_image_surface_init (surface, pixman_image, pixman_format); + + return &surface->base; +} + +cairo_bool_t +_pixman_format_from_masks (cairo_format_masks_t *masks, + pixman_format_code_t *format_ret) +{ + pixman_format_code_t format; + int format_type; + int a, r, g, b; + cairo_format_masks_t format_masks; + + a = _cairo_popcount (masks->alpha_mask); + r = _cairo_popcount (masks->red_mask); + g = _cairo_popcount (masks->green_mask); + b = _cairo_popcount (masks->blue_mask); + + if (masks->red_mask) { + if (masks->red_mask > masks->blue_mask) + format_type = PIXMAN_TYPE_ARGB; + else + format_type = PIXMAN_TYPE_ABGR; + } else if (masks->alpha_mask) { + format_type = PIXMAN_TYPE_A; + } else { + return FALSE; + } + + format = PIXMAN_FORMAT (masks->bpp, format_type, a, r, g, b); + + if (! pixman_format_supported_destination (format)) + return FALSE; + + /* Sanity check that we got out of PIXMAN_FORMAT exactly what we + * expected. This avoid any problems from something bizarre like + * alpha in the least-significant bits, or insane channel order, + * or whatever. */ + if (!_pixman_format_to_masks (format, &format_masks) || + masks->bpp != format_masks.bpp || + masks->red_mask != format_masks.red_mask || + masks->green_mask != format_masks.green_mask || + masks->blue_mask != format_masks.blue_mask) + { + return FALSE; + } + + *format_ret = format; + return TRUE; +} + +/* A mask consisting of N bits set to 1. */ +#define MASK(N) ((1UL << (N))-1) + +cairo_bool_t +_pixman_format_to_masks (pixman_format_code_t format, + cairo_format_masks_t *masks) +{ + int a, r, g, b; + + masks->bpp = PIXMAN_FORMAT_BPP (format); + + /* Number of bits in each channel */ + a = PIXMAN_FORMAT_A (format); + r = PIXMAN_FORMAT_R (format); + g = PIXMAN_FORMAT_G (format); + b = PIXMAN_FORMAT_B (format); + + switch (PIXMAN_FORMAT_TYPE (format)) { + case PIXMAN_TYPE_ARGB: + masks->alpha_mask = MASK (a) << (r + g + b); + masks->red_mask = MASK (r) << (g + b); + masks->green_mask = MASK (g) << (b); + masks->blue_mask = MASK (b); + return TRUE; + case PIXMAN_TYPE_ABGR: + masks->alpha_mask = MASK (a) << (b + g + r); + masks->blue_mask = MASK (b) << (g + r); + masks->green_mask = MASK (g) << (r); + masks->red_mask = MASK (r); + return TRUE; +#ifdef PIXMAN_TYPE_BGRA + case PIXMAN_TYPE_BGRA: + masks->blue_mask = MASK (b) << (masks->bpp - b); + masks->green_mask = MASK (g) << (masks->bpp - b - g); + masks->red_mask = MASK (r) << (masks->bpp - b - g - r); + masks->alpha_mask = MASK (a); + return TRUE; +#endif + case PIXMAN_TYPE_A: + masks->alpha_mask = MASK (a); + masks->red_mask = 0; + masks->green_mask = 0; + masks->blue_mask = 0; + return TRUE; + case PIXMAN_TYPE_OTHER: + case PIXMAN_TYPE_COLOR: + case PIXMAN_TYPE_GRAY: + case PIXMAN_TYPE_YUY2: + case PIXMAN_TYPE_YV12: + default: + masks->alpha_mask = 0; + masks->red_mask = 0; + masks->green_mask = 0; + masks->blue_mask = 0; + return FALSE; + } +} + +pixman_format_code_t +_cairo_format_to_pixman_format_code (cairo_format_t format) +{ + pixman_format_code_t ret; + switch (format) { + case CAIRO_FORMAT_A1: + ret = PIXMAN_a1; + break; + case CAIRO_FORMAT_A8: + ret = PIXMAN_a8; + break; + case CAIRO_FORMAT_RGB24: + ret = PIXMAN_x8r8g8b8; + break; + case CAIRO_FORMAT_RGB30: + ret = PIXMAN_x2r10g10b10; + break; + case CAIRO_FORMAT_RGB16_565: + ret = PIXMAN_r5g6b5; + break; + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_INVALID: + default: + ret = PIXMAN_a8r8g8b8; + break; + } + return ret; +} + +cairo_surface_t * +_cairo_image_surface_create_with_pixman_format (unsigned char *data, + pixman_format_code_t pixman_format, + int width, + int height, + int stride) +{ + cairo_surface_t *surface; + pixman_image_t *pixman_image; + + if (! _cairo_image_surface_is_size_valid (width, height)) + { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + pixman_image = pixman_image_create_bits (pixman_format, width, height, + (uint32_t *) data, stride); + + if (unlikely (pixman_image == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface = _cairo_image_surface_create_for_pixman_image (pixman_image, + pixman_format); + if (unlikely (surface->status)) { + pixman_image_unref (pixman_image); + return surface; + } + + /* we can not make any assumptions about the initial state of user data */ + surface->is_clear = data == NULL; + return surface; +} + +/** + * cairo_image_surface_create: + * @format: format of pixels in the surface to create + * @width: width of the surface, in pixels + * @height: height of the surface, in pixels + * + * Creates an image surface of the specified format and + * dimensions. Initially the surface contents are all + * 0. (Specifically, within each pixel, each color or alpha channel + * belonging to format will be 0. The contents of bits within a pixel, + * but not belonging to the given format are undefined). + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_image_surface_create (cairo_format_t format, + int width, + int height) +{ + pixman_format_code_t pixman_format; + + if (! CAIRO_FORMAT_VALID (format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + pixman_format = _cairo_format_to_pixman_format_code (format); + + return _cairo_image_surface_create_with_pixman_format (NULL, pixman_format, + width, height, -1); +} +slim_hidden_def (cairo_image_surface_create); + + cairo_surface_t * +_cairo_image_surface_create_with_content (cairo_content_t content, + int width, + int height) +{ + return cairo_image_surface_create (_cairo_format_from_content (content), + width, height); +} + +/** + * cairo_format_stride_for_width: + * @format: A #cairo_format_t value + * @width: The desired width of an image surface to be created. + * + * This function provides a stride value that will respect all + * alignment requirements of the accelerated image-rendering code + * within cairo. Typical usage will be of the form: + * + * + * int stride; + * unsigned char *data; + * cairo_surface_t *surface; + * + * stride = cairo_format_stride_for_width (format, width); + * data = malloc (stride * height); + * surface = cairo_image_surface_create_for_data (data, format, + * width, height, + * stride); + * + * + * Return value: the appropriate stride to use given the desired + * format and width, or -1 if either the format is invalid or the width + * too large. + * + * Since: 1.6 + **/ + int +cairo_format_stride_for_width (cairo_format_t format, + int width) +{ + int bpp; + + if (! CAIRO_FORMAT_VALID (format)) { + _cairo_error_throw (CAIRO_STATUS_INVALID_FORMAT); + return -1; + } + + bpp = _cairo_format_bits_per_pixel (format); + if ((unsigned) (width) >= (INT32_MAX - 7) / (unsigned) (bpp)) + return -1; + + return CAIRO_STRIDE_FOR_WIDTH_BPP (width, bpp); +} +slim_hidden_def (cairo_format_stride_for_width); + +/** + * cairo_image_surface_create_for_data: + * @data: a pointer to a buffer supplied by the application in which + * to write contents. This pointer must be suitably aligned for any + * kind of variable, (for example, a pointer returned by malloc). + * @format: the format of pixels in the buffer + * @width: the width of the image to be stored in the buffer + * @height: the height of the image to be stored in the buffer + * @stride: the number of bytes between the start of rows in the + * buffer as allocated. This value should always be computed by + * cairo_format_stride_for_width() before allocating the data + * buffer. + * + * Creates an image surface for the provided pixel data. The output + * buffer must be kept around until the #cairo_surface_t is destroyed + * or cairo_surface_finish() is called on the surface. The initial + * contents of @data will be used as the initial image contents; you + * must explicitly clear the buffer, using, for example, + * cairo_rectangle() and cairo_fill() if you want it cleared. + * + * Note that the stride may be larger than + * width*bytes_per_pixel to provide proper alignment for each pixel + * and row. This alignment is required to allow high-performance rendering + * within cairo. The correct way to obtain a legal stride value is to + * call cairo_format_stride_for_width() with the desired format and + * maximum image width value, and then use the resulting stride value + * to allocate the data and to create the image surface. See + * cairo_format_stride_for_width() for example code. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface in the case of an error such as out of + * memory or an invalid stride value. In case of invalid stride value + * the error status of the returned surface will be + * %CAIRO_STATUS_INVALID_STRIDE. You can use + * cairo_surface_status() to check for this. + * + * See cairo_surface_set_user_data() for a means of attaching a + * destroy-notification fallback to the surface if necessary. + * + * Since: 1.0 + **/ + cairo_surface_t * +cairo_image_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride) +{ + pixman_format_code_t pixman_format; + int minstride; + + if (! CAIRO_FORMAT_VALID (format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + if ((stride & (CAIRO_STRIDE_ALIGNMENT-1)) != 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + + if (! _cairo_image_surface_is_size_valid (width, height)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + minstride = cairo_format_stride_for_width (format, width); + if (stride < 0) { + if (stride > -minstride) { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + } + } else { + if (stride < minstride) { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + } + } + + pixman_format = _cairo_format_to_pixman_format_code (format); + return _cairo_image_surface_create_with_pixman_format (data, + pixman_format, + width, height, + stride); +} +slim_hidden_def (cairo_image_surface_create_for_data); + +/** + * cairo_image_surface_get_data: + * @surface: a #cairo_image_surface_t + * + * Get a pointer to the data of the image surface, for direct + * inspection or modification. + * + * A call to cairo_surface_flush() is required before accessing the + * pixel data to ensure that all pending drawing operations are + * finished. A call to cairo_surface_mark_dirty() is required after + * the data is modified. + * + * Return value: a pointer to the image data of this surface or %NULL + * if @surface is not an image surface, or if cairo_surface_finish() + * has been called. + * + * Since: 1.2 + **/ +unsigned char * +cairo_image_surface_get_data (cairo_surface_t *surface) +{ + cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; + + if (! _cairo_surface_is_image (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return image_surface->data; +} +slim_hidden_def (cairo_image_surface_get_data); + +/** + * cairo_image_surface_get_format: + * @surface: a #cairo_image_surface_t + * + * Get the format of the surface. + * + * Return value: the format of the surface + * + * Since: 1.2 + **/ +cairo_format_t +cairo_image_surface_get_format (cairo_surface_t *surface) +{ + cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; + + if (! _cairo_surface_is_image (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return CAIRO_FORMAT_INVALID; + } + + return image_surface->format; +} +slim_hidden_def (cairo_image_surface_get_format); + +/** + * cairo_image_surface_get_width: + * @surface: a #cairo_image_surface_t + * + * Get the width of the image surface in pixels. + * + * Return value: the width of the surface in pixels. + * + * Since: 1.0 + **/ +int +cairo_image_surface_get_width (cairo_surface_t *surface) +{ + cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; + + if (! _cairo_surface_is_image (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return image_surface->width; +} +slim_hidden_def (cairo_image_surface_get_width); + +/** + * cairo_image_surface_get_height: + * @surface: a #cairo_image_surface_t + * + * Get the height of the image surface in pixels. + * + * Return value: the height of the surface in pixels. + * + * Since: 1.0 + **/ +int +cairo_image_surface_get_height (cairo_surface_t *surface) +{ + cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; + + if (! _cairo_surface_is_image (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return image_surface->height; +} +slim_hidden_def (cairo_image_surface_get_height); + +/** + * cairo_image_surface_get_stride: + * @surface: a #cairo_image_surface_t + * + * Get the stride of the image surface in bytes + * + * Return value: the stride of the image surface in bytes (or 0 if + * @surface is not an image surface). The stride is the distance in + * bytes from the beginning of one row of the image data to the + * beginning of the next row. + * + * Since: 1.2 + **/ +int +cairo_image_surface_get_stride (cairo_surface_t *surface) +{ + + cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; + + if (! _cairo_surface_is_image (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return image_surface->stride; +} +slim_hidden_def (cairo_image_surface_get_stride); + + cairo_format_t +_cairo_format_from_content (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_COLOR: + return CAIRO_FORMAT_RGB24; + case CAIRO_CONTENT_ALPHA: + return CAIRO_FORMAT_A8; + case CAIRO_CONTENT_COLOR_ALPHA: + return CAIRO_FORMAT_ARGB32; + } + + ASSERT_NOT_REACHED; + return CAIRO_FORMAT_INVALID; +} + + cairo_content_t +_cairo_content_from_format (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + return CAIRO_CONTENT_COLOR_ALPHA; + case CAIRO_FORMAT_RGB30: + return CAIRO_CONTENT_COLOR; + case CAIRO_FORMAT_RGB24: + return CAIRO_CONTENT_COLOR; + case CAIRO_FORMAT_RGB16_565: + return CAIRO_CONTENT_COLOR; + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + return CAIRO_CONTENT_ALPHA; + case CAIRO_FORMAT_INVALID: + break; + } + + ASSERT_NOT_REACHED; + return CAIRO_CONTENT_COLOR_ALPHA; +} + + int +_cairo_format_bits_per_pixel (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_RGB24: + return 32; + case CAIRO_FORMAT_RGB16_565: + return 16; + case CAIRO_FORMAT_A8: + return 8; + case CAIRO_FORMAT_A1: + return 1; + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +cairo_surface_t * +_cairo_image_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, + int height) +{ + cairo_image_surface_t *other = abstract_other; + + TRACE ((stderr, "%s (other=%u)\n", __FUNCTION__, other->base.unique_id)); + + if (! _cairo_image_surface_is_size_valid (width, height)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + if (content == other->base.content) { + return _cairo_image_surface_create_with_pixman_format (NULL, + other->pixman_format, + width, height, + 0); + } + + return _cairo_image_surface_create_with_content (content, + width, height); +} + +cairo_surface_t * +_cairo_image_surface_snapshot (void *abstract_surface) +{ + cairo_image_surface_t *image = abstract_surface; + cairo_image_surface_t *clone; + + /* If we own the image, we can simply steal the memory for the snapshot */ + if (image->owns_data && image->base._finishing) { + clone = (cairo_image_surface_t *) + _cairo_image_surface_create_for_pixman_image (image->pixman_image, + image->pixman_format); + if (unlikely (clone->base.status)) + return &clone->base; + + image->pixman_image = NULL; + image->owns_data = FALSE; + + clone->transparency = image->transparency; + clone->color = image->color; + + clone->owns_data = TRUE; + return &clone->base; + } + + clone = (cairo_image_surface_t *) + _cairo_image_surface_create_with_pixman_format (NULL, + image->pixman_format, + image->width, + image->height, + 0); + if (unlikely (clone->base.status)) + return &clone->base; + + if (clone->stride == image->stride) { + memcpy (clone->data, image->data, clone->stride * clone->height); + } else { + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, NULL, clone->pixman_image, + 0, 0, + 0, 0, + 0, 0, + image->width, image->height); + } + clone->base.is_clear = FALSE; + return &clone->base; +} + +cairo_image_surface_t * +_cairo_image_surface_map_to_image (void *abstract_other, + const cairo_rectangle_int_t *extents) +{ + cairo_image_surface_t *other = abstract_other; + cairo_surface_t *surface; + uint8_t *data; + + data = other->data; + data += extents->y * other->stride; + data += extents->x * PIXMAN_FORMAT_BPP (other->pixman_format)/ 8; + + surface = + _cairo_image_surface_create_with_pixman_format (data, + other->pixman_format, + extents->width, + extents->height, + other->stride); + + cairo_surface_set_device_offset (surface, -extents->x, -extents->y); + return (cairo_image_surface_t *) surface; +} + +cairo_int_status_t +_cairo_image_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return CAIRO_INT_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_image_surface_finish (void *abstract_surface) +{ + cairo_image_surface_t *surface = abstract_surface; + + if (surface->pixman_image) { + pixman_image_unref (surface->pixman_image); + surface->pixman_image = NULL; + } + + if (surface->owns_data) { + free (surface->data); + surface->data = NULL; + } + + if (surface->parent) { + cairo_surface_t *parent = surface->parent; + surface->parent = NULL; + cairo_surface_destroy (parent); + } + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_image_surface_assume_ownership_of_data (cairo_image_surface_t *surface) +{ + surface->owns_data = TRUE; +} + +cairo_surface_t * +_cairo_image_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_image_surface_t *surface = abstract_surface; + + if (extents) { + extents->x = extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + } + + return &surface->base; +} + +cairo_status_t +_cairo_image_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + *image_out = abstract_surface; + *image_extra = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_image_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ +} + +/* high level image interface */ +cairo_bool_t +_cairo_image_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_image_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = surface->width; + rectangle->height = surface->height; + + return TRUE; +} + +cairo_int_status_t +_cairo_image_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_image_surface_t *surface = abstract_surface; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->base.unique_id)); + + return _cairo_compositor_paint (surface->compositor, + &surface->base, op, source, clip); +} + +cairo_int_status_t +_cairo_image_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_image_surface_t *surface = abstract_surface; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->base.unique_id)); + + return _cairo_compositor_mask (surface->compositor, + &surface->base, op, source, mask, clip); +} + +cairo_int_status_t +_cairo_image_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_image_surface_t *surface = abstract_surface; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->base.unique_id)); + + return _cairo_compositor_stroke (surface->compositor, &surface->base, + op, source, path, + style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +cairo_int_status_t +_cairo_image_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_image_surface_t *surface = abstract_surface; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->base.unique_id)); + + return _cairo_compositor_fill (surface->compositor, &surface->base, + op, source, path, + fill_rule, tolerance, antialias, + clip); +} + +cairo_int_status_t +_cairo_image_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_image_surface_t *surface = abstract_surface; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->base.unique_id)); + + return _cairo_compositor_glyphs (surface->compositor, &surface->base, + op, source, + glyphs, num_glyphs, scaled_font, + clip); +} + +void +_cairo_image_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_ON); +} + +const cairo_surface_backend_t _cairo_image_surface_backend = { + CAIRO_SURFACE_TYPE_IMAGE, + _cairo_image_surface_finish, + + _cairo_default_context_create, + + _cairo_image_surface_create_similar, + NULL, /* create similar image */ + _cairo_image_surface_map_to_image, + _cairo_image_surface_unmap_image, + + _cairo_image_surface_source, + _cairo_image_surface_acquire_source_image, + _cairo_image_surface_release_source_image, + _cairo_image_surface_snapshot, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_image_surface_get_extents, + _cairo_image_surface_get_font_options, + + NULL, /* flush */ + NULL, + + _cairo_image_surface_paint, + _cairo_image_surface_mask, + _cairo_image_surface_stroke, + _cairo_image_surface_fill, + NULL, /* fill-stroke */ + _cairo_image_surface_glyphs, +}; + +/* A convenience function for when one needs to coerce an image + * surface to an alternate format. */ +cairo_image_surface_t * +_cairo_image_surface_coerce (cairo_image_surface_t *surface) +{ + return _cairo_image_surface_coerce_to_format (surface, + _cairo_format_from_content (surface->base.content)); +} + +/* A convenience function for when one needs to coerce an image + * surface to an alternate format. */ +cairo_image_surface_t * +_cairo_image_surface_coerce_to_format (cairo_image_surface_t *surface, + cairo_format_t format) +{ + cairo_image_surface_t *clone; + cairo_status_t status; + + status = surface->base.status; + if (unlikely (status)) + return (cairo_image_surface_t *)_cairo_surface_create_in_error (status); + + if (surface->format == format) + return (cairo_image_surface_t *)cairo_surface_reference(&surface->base); + + clone = (cairo_image_surface_t *) + cairo_image_surface_create (format, surface->width, surface->height); + if (unlikely (clone->base.status)) + return clone; + + pixman_image_composite32 (PIXMAN_OP_SRC, + surface->pixman_image, NULL, clone->pixman_image, + 0, 0, + 0, 0, + 0, 0, + surface->width, surface->height); + clone->base.is_clear = FALSE; + + clone->base.device_transform = + surface->base.device_transform; + clone->base.device_transform_inverse = + surface->base.device_transform_inverse; + + return clone; +} + +cairo_image_surface_t * +_cairo_image_surface_create_from_image (cairo_image_surface_t *other, + pixman_format_code_t format, + int x, int y, + int width, int height, int stride) +{ + cairo_image_surface_t *surface; + cairo_status_t status; + pixman_image_t *image; + void *mem = NULL; + + status = other->base.status; + if (unlikely (status)) + goto cleanup; + + if (stride) { + mem = _cairo_malloc_ab (height, stride); + if (unlikely (mem == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + } + + image = pixman_image_create_bits (format, width, height, mem, stride); + if (unlikely (image == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup_mem; + } + + surface = (cairo_image_surface_t *) + _cairo_image_surface_create_for_pixman_image (image, format); + if (unlikely (surface->base.status)) { + status = surface->base.status; + goto cleanup_image; + } + + pixman_image_composite32 (PIXMAN_OP_SRC, + other->pixman_image, NULL, image, + x, y, + 0, 0, + 0, 0, + width, height); + surface->base.is_clear = FALSE; + surface->owns_data = mem != NULL; + + return surface; + +cleanup_image: + pixman_image_unref (image); +cleanup_mem: + free (mem); +cleanup: + return (cairo_image_surface_t *) _cairo_surface_create_in_error (status); +} + +cairo_image_transparency_t +_cairo_image_analyze_transparency (cairo_image_surface_t *image) +{ + int x, y; + + if (image->transparency != CAIRO_IMAGE_UNKNOWN) + return image->transparency; + + if ((image->base.content & CAIRO_CONTENT_ALPHA) == 0) + return image->transparency = CAIRO_IMAGE_IS_OPAQUE; + + if (image->base.is_clear) + return image->transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; + + if ((image->base.content & CAIRO_CONTENT_COLOR) == 0) { + if (image->format == CAIRO_FORMAT_A1) { + return image->transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; + } else if (image->format == CAIRO_FORMAT_A8) { + for (y = 0; y < image->height; y++) { + uint8_t *alpha = (uint8_t *) (image->data + y * image->stride); + + for (x = 0; x < image->width; x++, alpha++) { + if (*alpha > 0 && *alpha < 255) + return image->transparency = CAIRO_IMAGE_HAS_ALPHA; + } + } + return image->transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; + } else { + return image->transparency = CAIRO_IMAGE_HAS_ALPHA; + } + } + + if (image->format == CAIRO_FORMAT_RGB16_565) { + image->transparency = CAIRO_IMAGE_IS_OPAQUE; + return CAIRO_IMAGE_IS_OPAQUE; + } + + if (image->format != CAIRO_FORMAT_ARGB32) + return image->transparency = CAIRO_IMAGE_HAS_ALPHA; + + image->transparency = CAIRO_IMAGE_IS_OPAQUE; + for (y = 0; y < image->height; y++) { + uint32_t *pixel = (uint32_t *) (image->data + y * image->stride); + + for (x = 0; x < image->width; x++, pixel++) { + int a = (*pixel & 0xff000000) >> 24; + if (a > 0 && a < 255) { + return image->transparency = CAIRO_IMAGE_HAS_ALPHA; + } else if (a == 0) { + image->transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; + } + } + } + + return image->transparency; +} + +cairo_image_color_t +_cairo_image_analyze_color (cairo_image_surface_t *image) +{ + int x, y; + + if (image->color != CAIRO_IMAGE_UNKNOWN_COLOR) + return image->color; + + if (image->format == CAIRO_FORMAT_A1) + return image->color = CAIRO_IMAGE_IS_MONOCHROME; + + if (image->format == CAIRO_FORMAT_A8) + return image->color = CAIRO_IMAGE_IS_GRAYSCALE; + + if (image->format == CAIRO_FORMAT_ARGB32) { + image->color = CAIRO_IMAGE_IS_MONOCHROME; + for (y = 0; y < image->height; y++) { + uint32_t *pixel = (uint32_t *) (image->data + y * image->stride); + + for (x = 0; x < image->width; x++, pixel++) { + int a = (*pixel & 0xff000000) >> 24; + int r = (*pixel & 0x00ff0000) >> 16; + int g = (*pixel & 0x0000ff00) >> 8; + int b = (*pixel & 0x000000ff); + if (a == 0) { + r = g = b = 0; + } else { + r = (r * 255 + a / 2) / a; + g = (g * 255 + a / 2) / a; + b = (b * 255 + a / 2) / a; + } + if (!(r == g && g == b)) + return image->color = CAIRO_IMAGE_IS_COLOR; + else if (r > 0 && r < 255) + image->color = CAIRO_IMAGE_IS_GRAYSCALE; + } + } + return image->color; + } + + if (image->format == CAIRO_FORMAT_RGB24) { + image->color = CAIRO_IMAGE_IS_MONOCHROME; + for (y = 0; y < image->height; y++) { + uint32_t *pixel = (uint32_t *) (image->data + y * image->stride); + + for (x = 0; x < image->width; x++, pixel++) { + int r = (*pixel & 0x00ff0000) >> 16; + int g = (*pixel & 0x0000ff00) >> 8; + int b = (*pixel & 0x000000ff); + if (!(r == g && g == b)) + return image->color = CAIRO_IMAGE_IS_COLOR; + else if (r > 0 && r < 255) + image->color = CAIRO_IMAGE_IS_GRAYSCALE; + } + } + return image->color; + } + + return image->color = CAIRO_IMAGE_IS_COLOR; +} + +cairo_image_surface_t * +_cairo_image_surface_clone_subimage (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *image; + cairo_surface_pattern_t pattern; + cairo_status_t status; + + image = cairo_surface_create_similar_image (surface, + _cairo_format_from_content (surface->content), + extents->width, + extents->height); + if (image->status) + return to_image_surface (image); + + /* TODO: check me with non-identity device_transform. Should we + * clone the scaling, too? */ + cairo_surface_set_device_offset (image, + -extents->x, + -extents->y); + + _cairo_pattern_init_for_surface (&pattern, surface); + pattern.base.filter = CAIRO_FILTER_NEAREST; + + status = _cairo_surface_paint (image, + CAIRO_OPERATOR_SOURCE, + &pattern.base, + NULL); + + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) + goto error; + + /* We use the parent as a flag during map-to-image/umap-image that the + * resultant image came from a fallback rather than as direct call + * to the backend's map_to_image(). Whilst we use it as a simple flag, + * we need to make sure the parent surface obeys the reference counting + * semantics and is consistent for all callers. + */ + _cairo_image_surface_set_parent (to_image_surface (image), + cairo_surface_reference (surface)); + + return to_image_surface (image); + +error: + cairo_surface_destroy (image); + return to_image_surface (_cairo_surface_create_in_error (status)); +} diff --git a/src/cairo-line-inline.h b/src/cairo-line-inline.h new file mode 100644 index 000000000..71cc5e7eb --- /dev/null +++ b/src/cairo-line-inline.h @@ -0,0 +1,48 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2014 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + */ + +#ifndef CAIRO_LINE_INLINE_H +#define CAIRO_LINE_INLINE_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" +#include "cairo-fixed-private.h" +#include "cairo-line-private.h" + +static inline int +cairo_lines_equal (const cairo_line_t *a, const cairo_line_t *b) +{ + return (a->p1.x == b->p1.x && a->p1.y == b->p1.y && + a->p2.x == b->p2.x && a->p2.y == b->p2.y); +} + +#endif /* CAIRO_LINE_INLINE_H */ diff --git a/src/cairo-line-private.h b/src/cairo-line-private.h new file mode 100644 index 000000000..08bf4b358 --- /dev/null +++ b/src/cairo-line-private.h @@ -0,0 +1,51 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2014 Intel Corporation, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + */ + +#ifndef CAIRO_LINE_PRIVATE_H +#define CAIRO_LINE_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-error-private.h" +#include "cairo-compiler-private.h" + +CAIRO_BEGIN_DECLS + +cairo_private int +cairo_lines_compare_at_y(const cairo_line_t *a, + const cairo_line_t *b, + int y); + +CAIRO_END_DECLS + +#endif /* CAIRO_LINE_PRIVATE_H */ diff --git a/src/cairo-line.c b/src/cairo-line.c new file mode 100644 index 000000000..cb13927bd --- /dev/null +++ b/src/cairo-line.c @@ -0,0 +1,306 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * Copyright © 2014 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + * + */ + +#include "cairoint.h" + +#include "cairo-line-inline.h" +#include "cairo-slope-private.h" + +static int +line_compare_for_y_against_x (const cairo_line_t *a, + int32_t y, + int32_t x) +{ + int32_t adx, ady; + int32_t dx, dy; + cairo_int64_t L, R; + + if (x < a->p1.x && x < a->p2.x) + return 1; + if (x > a->p1.x && x > a->p2.x) + return -1; + + adx = a->p2.x - a->p1.x; + dx = x - a->p1.x; + + if (adx == 0) + return -dx; + if (dx == 0 || (adx ^ dx) < 0) + return adx; + + dy = y - a->p1.y; + ady = a->p2.y - a->p1.y; + + L = _cairo_int32x32_64_mul (dy, adx); + R = _cairo_int32x32_64_mul (dx, ady); + + return _cairo_int64_cmp (L, R); +} + +/* + * We need to compare the x-coordinates of a pair of lines for a particular y, + * without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ B_x + (Y - B_y) * B_dx / B_dy, + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy and B_dy (and (Y - A_y), (Y - B_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * A_dy * B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx * A_dy + * - (Y - A_y) * A_dx * B_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 128 bit arithmetic. For certain, but common, + * input we can reduce this down to a single 32 bit compare by inspecting the + * deltas. + * + * (And put the burden of the work on developing fast 128 bit ops, which are + * required throughout the tessellator.) + * + * See the similar discussion for _slope_compare(). + */ +static int +lines_compare_x_for_y_general (const cairo_line_t *a, + const cairo_line_t *b, + int32_t y) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t dx; + int32_t adx, ady; + int32_t bdx, bdy; + enum { + HAVE_NONE = 0x0, + HAVE_DX = 0x1, + HAVE_ADX = 0x2, + HAVE_DX_ADX = HAVE_DX | HAVE_ADX, + HAVE_BDX = 0x4, + HAVE_DX_BDX = HAVE_DX | HAVE_BDX, + HAVE_ADX_BDX = HAVE_ADX | HAVE_BDX, + HAVE_ALL = HAVE_DX | HAVE_ADX | HAVE_BDX + } have_dx_adx_bdx = HAVE_ALL; + + ady = a->p2.y - a->p1.y; + adx = a->p2.x - a->p1.x; + if (adx == 0) + have_dx_adx_bdx &= ~HAVE_ADX; + + bdy = b->p2.y - b->p1.y; + bdx = b->p2.x - b->p1.x; + if (bdx == 0) + have_dx_adx_bdx &= ~HAVE_BDX; + + dx = a->p1.x - b->p1.x; + if (dx == 0) + have_dx_adx_bdx &= ~HAVE_DX; + +#define L _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (ady, bdy), dx) +#define A _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (adx, bdy), y - a->p1.y) +#define B _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (bdx, ady), y - b->p1.y) + switch (have_dx_adx_bdx) { + default: + case HAVE_NONE: + return 0; + case HAVE_DX: + /* A_dy * B_dy * (A_x - B_x) ∘ 0 */ + return dx; /* ady * bdy is positive definite */ + case HAVE_ADX: + /* 0 ∘ - (Y - A_y) * A_dx * B_dy */ + return adx; /* bdy * (y - a->top.y) is positive definite */ + case HAVE_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy */ + return -bdx; /* ady * (y - b->top.y) is positive definite */ + case HAVE_ADX_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy - (Y - A_y) * A_dx * B_dy */ + if ((adx ^ bdx) < 0) { + return adx; + } else if (a->p1.y == b->p1.y) { /* common origin */ + cairo_int64_t adx_bdy, bdx_ady; + + /* ∴ A_dx * B_dy ∘ B_dx * A_dy */ + + adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } else + return _cairo_int128_cmp (A, B); + case HAVE_DX_ADX: + /* A_dy * (A_x - B_x) ∘ - (Y - A_y) * A_dx */ + if ((-adx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t ady_dx, dy_adx; + + ady_dx = _cairo_int32x32_64_mul (ady, dx); + dy_adx = _cairo_int32x32_64_mul (a->p1.y - y, adx); + + return _cairo_int64_cmp (ady_dx, dy_adx); + } + case HAVE_DX_BDX: + /* B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx */ + if ((bdx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t bdy_dx, dy_bdx; + + bdy_dx = _cairo_int32x32_64_mul (bdy, dx); + dy_bdx = _cairo_int32x32_64_mul (y - b->p1.y, bdx); + + return _cairo_int64_cmp (bdy_dx, dy_bdx); + } + case HAVE_ALL: + /* XXX try comparing (a->p2.x - b->p2.x) et al */ + return _cairo_int128_cmp (L, _cairo_int128_sub (B, A)); + } +#undef B +#undef A +#undef L +} + +static int +lines_compare_x_for_y (const cairo_line_t *a, + const cairo_line_t *b, + int32_t y) +{ + /* If the sweep-line is currently on an end-point of a line, + * then we know its precise x value (and considering that we often need to + * compare events at end-points, this happens frequently enough to warrant + * special casing). + */ + enum { + HAVE_NEITHER = 0x0, + HAVE_AX = 0x1, + HAVE_BX = 0x2, + HAVE_BOTH = HAVE_AX | HAVE_BX + } have_ax_bx = HAVE_BOTH; + int32_t ax, bx; + + if (y == a->p1.y) + ax = a->p1.x; + else if (y == a->p2.y) + ax = a->p2.x; + else + have_ax_bx &= ~HAVE_AX; + + if (y == b->p1.y) + bx = b->p1.x; + else if (y == b->p2.y) + bx = b->p2.x; + else + have_ax_bx &= ~HAVE_BX; + + switch (have_ax_bx) { + default: + case HAVE_NEITHER: + return lines_compare_x_for_y_general (a, b, y); + case HAVE_AX: + return -line_compare_for_y_against_x (b, y, ax); + case HAVE_BX: + return line_compare_for_y_against_x (a, y, bx); + case HAVE_BOTH: + return ax - bx; + } +} + +static int bbox_compare (const cairo_line_t *a, + const cairo_line_t *b) +{ + int32_t amin, amax; + int32_t bmin, bmax; + + if (a->p1.x < a->p2.x) { + amin = a->p1.x; + amax = a->p2.x; + } else { + amin = a->p2.x; + amax = a->p1.x; + } + + if (b->p1.x < b->p2.x) { + bmin = b->p1.x; + bmax = b->p2.x; + } else { + bmin = b->p2.x; + bmax = b->p1.x; + } + + if (amax < bmin) + return -1; + + if (amin > bmax) + return +1; + + return 0; +} + +int cairo_lines_compare_at_y (const cairo_line_t *a, + const cairo_line_t *b, + int y) +{ + cairo_slope_t sa, sb; + int ret; + + if (cairo_lines_equal (a, b)) + return 0; + + /* Don't bother solving for abscissa if the edges' bounding boxes + * can be used to order them. + */ + ret = bbox_compare (a, b); + if (ret) + return ret; + + ret = lines_compare_x_for_y (a, b, y); + if (ret) + return ret; + + _cairo_slope_init (&sa, &a->p1, &a->p2); + _cairo_slope_init (&sb, &b->p1, &b->p2); + + return _cairo_slope_compare (&sb, &sa); +} diff --git a/src/cairo-list-inline.h b/src/cairo-list-inline.h new file mode 100644 index 000000000..0955178d2 --- /dev/null +++ b/src/cairo-list-inline.h @@ -0,0 +1,215 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + * + */ + +#ifndef CAIRO_LIST_INLINE_H +#define CAIRO_LIST_INLINE_H + +#include "cairo-list-private.h" + +#define cairo_list_entry(ptr, type, member) \ + cairo_container_of(ptr, type, member) + +#define cairo_list_first_entry(ptr, type, member) \ + cairo_list_entry((ptr)->next, type, member) + +#define cairo_list_last_entry(ptr, type, member) \ + cairo_list_entry((ptr)->prev, type, member) + +#define cairo_list_foreach(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#define cairo_list_foreach_entry(pos, type, head, member) \ + for (pos = cairo_list_entry((head)->next, type, member);\ + &pos->member != (head); \ + pos = cairo_list_entry(pos->member.next, type, member)) + +#define cairo_list_foreach_entry_safe(pos, n, type, head, member) \ + for (pos = cairo_list_entry ((head)->next, type, member),\ + n = cairo_list_entry (pos->member.next, type, member);\ + &pos->member != (head); \ + pos = n, n = cairo_list_entry (n->member.next, type, member)) + +#define cairo_list_foreach_entry_reverse(pos, type, head, member) \ + for (pos = cairo_list_entry((head)->prev, type, member);\ + &pos->member != (head); \ + pos = cairo_list_entry(pos->member.prev, type, member)) + +#define cairo_list_foreach_entry_reverse_safe(pos, n, type, head, member) \ + for (pos = cairo_list_entry((head)->prev, type, member),\ + n = cairo_list_entry (pos->member.prev, type, member);\ + &pos->member != (head); \ + pos = n, n = cairo_list_entry (n->member.prev, type, member)) + +#ifdef CAIRO_LIST_DEBUG +static inline void +_cairo_list_validate (const cairo_list_t *link) +{ + assert (link->next->prev == link); + assert (link->prev->next == link); +} +static inline void +cairo_list_validate (const cairo_list_t *head) +{ + cairo_list_t *link; + + cairo_list_foreach (link, head) + _cairo_list_validate (link); +} +static inline cairo_bool_t +cairo_list_is_empty (const cairo_list_t *head); +static inline void +cairo_list_validate_is_empty (const cairo_list_t *head) +{ + assert (head->next == NULL || (cairo_list_is_empty (head) && head->next == head->prev)); +} +#else +#define _cairo_list_validate(link) +#define cairo_list_validate(head) +#define cairo_list_validate_is_empty(head) +#endif + +static inline void +cairo_list_init (cairo_list_t *entry) +{ + entry->next = entry; + entry->prev = entry; +} + +static inline void +__cairo_list_add (cairo_list_t *entry, + cairo_list_t *prev, + cairo_list_t *next) +{ + next->prev = entry; + entry->next = next; + entry->prev = prev; + prev->next = entry; +} + +static inline void +cairo_list_add (cairo_list_t *entry, cairo_list_t *head) +{ + cairo_list_validate (head); + cairo_list_validate_is_empty (entry); + __cairo_list_add (entry, head, head->next); + cairo_list_validate (head); +} + +static inline void +cairo_list_add_tail (cairo_list_t *entry, cairo_list_t *head) +{ + cairo_list_validate (head); + cairo_list_validate_is_empty (entry); + __cairo_list_add (entry, head->prev, head); + cairo_list_validate (head); +} + +static inline void +__cairo_list_del (cairo_list_t *prev, cairo_list_t *next) +{ + next->prev = prev; + prev->next = next; +} + +static inline void +_cairo_list_del (cairo_list_t *entry) +{ + __cairo_list_del (entry->prev, entry->next); +} + +static inline void +cairo_list_del (cairo_list_t *entry) +{ + _cairo_list_del (entry); + cairo_list_init (entry); +} + +static inline void +cairo_list_move (cairo_list_t *entry, cairo_list_t *head) +{ + cairo_list_validate (head); + __cairo_list_del (entry->prev, entry->next); + __cairo_list_add (entry, head, head->next); + cairo_list_validate (head); +} + +static inline void +cairo_list_move_tail (cairo_list_t *entry, cairo_list_t *head) +{ + cairo_list_validate (head); + __cairo_list_del (entry->prev, entry->next); + __cairo_list_add (entry, head->prev, head); + cairo_list_validate (head); +} + +static inline void +cairo_list_swap (cairo_list_t *entry, cairo_list_t *other) +{ + __cairo_list_add (entry, other->prev, other->next); + cairo_list_init (other); +} + +static inline cairo_bool_t +cairo_list_is_first (const cairo_list_t *entry, + const cairo_list_t *head) +{ + cairo_list_validate (head); + return entry->prev == head; +} + +static inline cairo_bool_t +cairo_list_is_last (const cairo_list_t *entry, + const cairo_list_t *head) +{ + cairo_list_validate (head); + return entry->next == head; +} + +static inline cairo_bool_t +cairo_list_is_empty (const cairo_list_t *head) +{ + cairo_list_validate (head); + return head->next == head; +} + +static inline cairo_bool_t +cairo_list_is_singular (const cairo_list_t *head) +{ + cairo_list_validate (head); + return head->next == head || head->next == head->prev; +} + +#endif /* CAIRO_LIST_INLINE_H */ diff --git a/src/cairo-list-private.h b/src/cairo-list-private.h new file mode 100644 index 000000000..9f39b668f --- /dev/null +++ b/src/cairo-list-private.h @@ -0,0 +1,48 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + * + */ + +#ifndef CAIRO_LIST_PRIVATE_H +#define CAIRO_LIST_PRIVATE_H + +#include "cairo-compiler-private.h" + +/* Basic circular, doubly linked list implementation */ + +typedef struct _cairo_list { + struct _cairo_list *next, *prev; +} cairo_list_t; + +#endif /* CAIRO_LIST_PRIVATE_H */ diff --git a/src/cairo-lzw.c b/src/cairo-lzw.c new file mode 100644 index 000000000..de7f99983 --- /dev/null +++ b/src/cairo-lzw.c @@ -0,0 +1,404 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +typedef struct _lzw_buf { + cairo_status_t status; + + unsigned char *data; + int data_size; + int num_data; + uint32_t pending; + unsigned int pending_bits; +} lzw_buf_t; + +/* An lzw_buf_t is a simple, growable chunk of memory for holding + * variable-size objects of up to 16 bits each. + * + * Initialize an lzw_buf_t to the given size in bytes. + * + * To store objects into the lzw_buf_t, call _lzw_buf_store_bits and + * when finished, call _lzw_buf_store_pending, (which flushes out the + * last few bits that hadn't yet made a complete byte yet). + * + * Instead of returning failure from any functions, lzw_buf_t provides + * a status value that the caller can query, (and should query at + * least once when done with the object). The status value will be + * either %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY; + */ +static void +_lzw_buf_init (lzw_buf_t *buf, int size) +{ + if (size == 0) + size = 16; + + buf->status = CAIRO_STATUS_SUCCESS; + buf->data_size = size; + buf->num_data = 0; + buf->pending = 0; + buf->pending_bits = 0; + + buf->data = malloc (size); + if (unlikely (buf->data == NULL)) { + buf->data_size = 0; + buf->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return; + } +} + +/* Increase the buffer size by doubling. + * + * Returns %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + */ +static cairo_status_t +_lzw_buf_grow (lzw_buf_t *buf) +{ + int new_size = buf->data_size * 2; + unsigned char *new_data; + + if (buf->status) + return buf->status; + + new_data = NULL; + /* check for integer overflow */ + if (new_size / 2 == buf->data_size) + new_data = realloc (buf->data, new_size); + + if (unlikely (new_data == NULL)) { + free (buf->data); + buf->data_size = 0; + buf->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return buf->status; + } + + buf->data = new_data; + buf->data_size = new_size; + + return CAIRO_STATUS_SUCCESS; +} + +/* Store the lowest num_bits bits of values into buf. + * + * Note: The bits of value above size_in_bits must be 0, (so don't lie + * about the size). + * + * See also _lzw_buf_store_pending which must be called after the last + * call to _lzw_buf_store_bits. + * + * Sets buf->status to either %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY. + */ +static void +_lzw_buf_store_bits (lzw_buf_t *buf, uint16_t value, int num_bits) +{ + cairo_status_t status; + + assert (value <= (1 << num_bits) - 1); + + if (buf->status) + return; + + buf->pending = (buf->pending << num_bits) | value; + buf->pending_bits += num_bits; + + while (buf->pending_bits >= 8) { + if (buf->num_data >= buf->data_size) { + status = _lzw_buf_grow (buf); + if (unlikely (status)) + return; + } + buf->data[buf->num_data++] = buf->pending >> (buf->pending_bits - 8); + buf->pending_bits -= 8; + } +} + +/* Store the last remaining pending bits into the buffer. + * + * Note: This function must be called after the last call to + * _lzw_buf_store_bits. + * + * Sets buf->status to either %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY. + */ +static void +_lzw_buf_store_pending (lzw_buf_t *buf) +{ + cairo_status_t status; + + if (buf->status) + return; + + if (buf->pending_bits == 0) + return; + + assert (buf->pending_bits < 8); + + if (buf->num_data >= buf->data_size) { + status = _lzw_buf_grow (buf); + if (unlikely (status)) + return; + } + + buf->data[buf->num_data++] = buf->pending << (8 - buf->pending_bits); + buf->pending_bits = 0; +} + +/* LZW defines a few magic code values */ +#define LZW_CODE_CLEAR_TABLE 256 +#define LZW_CODE_EOD 257 +#define LZW_CODE_FIRST 258 + +/* We pack three separate values into a symbol as follows: + * + * 12 bits (31 down to 20): CODE: code value used to represent this symbol + * 12 bits (19 down to 8): PREV: previous code value in chain + * 8 bits ( 7 down to 0): NEXT: next byte value in chain + */ +typedef uint32_t lzw_symbol_t; + +#define LZW_SYMBOL_SET(sym, prev, next) ((sym) = ((prev) << 8)|(next)) +#define LZW_SYMBOL_SET_CODE(sym, code, prev, next) ((sym) = ((code << 20)|(prev) << 8)|(next)) +#define LZW_SYMBOL_GET_CODE(sym) (((sym) >> 20)) +#define LZW_SYMBOL_GET_PREV(sym) (((sym) >> 8) & 0x7ff) +#define LZW_SYMBOL_GET_BYTE(sym) (((sym) >> 0) & 0x0ff) + +/* The PREV+NEXT fields can be seen as the key used to fetch values + * from the hash table, while the code is the value fetched. + */ +#define LZW_SYMBOL_KEY_MASK 0x000fffff + +/* Since code values are only stored starting with 258 we can safely + * use a zero value to represent free slots in the hash table. */ +#define LZW_SYMBOL_FREE 0x00000000 + +/* These really aren't very free for modifying. First, the PostScript + * specification sets the 9-12 bit range. Second, the encoding of + * lzw_symbol_t above also relies on 2 of LZW_BITS_MAX plus one byte + * fitting within 32 bits. + * + * But other than that, the LZW compression scheme could function with + * more bits per code. + */ +#define LZW_BITS_MIN 9 +#define LZW_BITS_MAX 12 +#define LZW_BITS_BOUNDARY(bits) ((1<<(bits))-1) +#define LZW_MAX_SYMBOLS (1<table, 0, LZW_SYMBOL_TABLE_SIZE * sizeof (lzw_symbol_t)); +} + +/* Lookup a symbol in the symbol table. The PREV and NEXT fields of + * symbol form the key for the lookup. + * + * If successful, then this function returns %TRUE and slot_ret will be + * left pointing at the result that will have the CODE field of + * interest. + * + * If the lookup fails, then this function returns %FALSE and slot_ret + * will be pointing at the location in the table to which a new CODE + * value should be stored along with PREV and NEXT. + */ +static cairo_bool_t +_lzw_symbol_table_lookup (lzw_symbol_table_t *table, + lzw_symbol_t symbol, + lzw_symbol_t **slot_ret) +{ + /* The algorithm here is identical to that in cairo-hash.c. We + * copy it here to allow for a rather more efficient + * implementation due to several circumstances that do not apply + * to the more general case: + * + * 1) We have a known bound on the total number of symbols, so we + * have a fixed-size table without any copying when growing + * + * 2) We never delete any entries, so we don't need to + * support/check for DEAD entries during lookup. + * + * 3) The object fits in 32 bits so we store each object in its + * entirety within the table rather than storing objects + * externally and putting pointers in the table, (which here + * would just double the storage requirements and have negative + * impacts on memory locality). + */ + int i, idx, step, hash = symbol & LZW_SYMBOL_KEY_MASK; + lzw_symbol_t candidate; + + idx = hash % LZW_SYMBOL_MOD1; + step = 0; + + *slot_ret = NULL; + for (i = 0; i < LZW_SYMBOL_TABLE_SIZE; i++) + { + candidate = table->table[idx]; + if (candidate == LZW_SYMBOL_FREE) + { + *slot_ret = &table->table[idx]; + return FALSE; + } + else /* candidate is LIVE */ + { + if ((candidate & LZW_SYMBOL_KEY_MASK) == + (symbol & LZW_SYMBOL_KEY_MASK)) + { + *slot_ret = &table->table[idx]; + return TRUE; + } + } + + if (step == 0) { + step = hash % LZW_SYMBOL_MOD2; + if (step == 0) + step = 1; + } + + idx += step; + if (idx >= LZW_SYMBOL_TABLE_SIZE) + idx -= LZW_SYMBOL_TABLE_SIZE; + } + + return FALSE; +} + +/* Compress a bytestream using the LZW algorithm. + * + * This is an original implementation based on reading the + * specification of the LZWDecode filter in the PostScript Language + * Reference. The free parameters in the LZW algorithm are set to the + * values mandated by PostScript, (symbols encoded with widths from 9 + * to 12 bits). + * + * This function returns a pointer to a newly allocated buffer holding + * the compressed data, or %NULL if an out-of-memory situation + * occurs. + * + * Notice that any one of the _lzw_buf functions called here could + * trigger an out-of-memory condition. But lzw_buf_t uses cairo's + * shutdown-on-error idiom, so it's safe to continue to call into + * lzw_buf without having to check for errors, (until a final check at + * the end). + */ +unsigned char * +_cairo_lzw_compress (unsigned char *data, unsigned long *size_in_out) +{ + int bytes_remaining = *size_in_out; + lzw_buf_t buf; + lzw_symbol_table_t table; + lzw_symbol_t symbol, *slot = NULL; /* just to squelch a warning */ + int code_next = LZW_CODE_FIRST; + int code_bits = LZW_BITS_MIN; + int prev, next = 0; /* just to squelch a warning */ + + if (*size_in_out == 0) + return NULL; + + _lzw_buf_init (&buf, *size_in_out); + + _lzw_symbol_table_init (&table); + + /* The LZW header is a clear table code. */ + _lzw_buf_store_bits (&buf, LZW_CODE_CLEAR_TABLE, code_bits); + + while (1) { + + /* Find the longest existing code in the symbol table that + * matches the current input, if any. */ + prev = *data++; + bytes_remaining--; + if (bytes_remaining) { + do + { + next = *data++; + bytes_remaining--; + LZW_SYMBOL_SET (symbol, prev, next); + if (_lzw_symbol_table_lookup (&table, symbol, &slot)) + prev = LZW_SYMBOL_GET_CODE (*slot); + } while (bytes_remaining && *slot != LZW_SYMBOL_FREE); + if (*slot == LZW_SYMBOL_FREE) { + data--; + bytes_remaining++; + } + } + + /* Write the code into the output. This is either a byte read + * directly from the input, or a code from the last successful + * lookup. */ + _lzw_buf_store_bits (&buf, prev, code_bits); + + if (bytes_remaining == 0) + break; + + LZW_SYMBOL_SET_CODE (*slot, code_next++, prev, next); + + if (code_next > LZW_BITS_BOUNDARY(code_bits)) + { + code_bits++; + if (code_bits > LZW_BITS_MAX) { + _lzw_symbol_table_init (&table); + _lzw_buf_store_bits (&buf, LZW_CODE_CLEAR_TABLE, code_bits - 1); + code_bits = LZW_BITS_MIN; + code_next = LZW_CODE_FIRST; + } + } + } + + /* The LZW footer is an end-of-data code. */ + _lzw_buf_store_bits (&buf, LZW_CODE_EOD, code_bits); + + _lzw_buf_store_pending (&buf); + + /* See if we ever ran out of memory while writing to buf. */ + if (buf.status == CAIRO_STATUS_NO_MEMORY) { + *size_in_out = 0; + return NULL; + } + + assert (buf.status == CAIRO_STATUS_SUCCESS); + + *size_in_out = buf.num_data; + return buf.data; +} diff --git a/src/cairo-malloc-private.h b/src/cairo-malloc-private.h new file mode 100644 index 000000000..1e2c67f8d --- /dev/null +++ b/src/cairo-malloc-private.h @@ -0,0 +1,149 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#ifndef CAIRO_MALLOC_PRIVATE_H +#define CAIRO_MALLOC_PRIVATE_H + +#include "cairo-wideint-private.h" +#include + +#if HAVE_MEMFAULT +#include +#define CAIRO_INJECT_FAULT() MEMFAULT_INJECT_FAULT() +#else +#define CAIRO_INJECT_FAULT() 0 +#endif + +/** + * _cairo_malloc: + * @size: size in bytes + * + * Allocate @size memory using malloc(). + * The memory should be freed using free(). + * malloc is skipped, if 0 bytes are requested, and %NULL will be returned. + * + * Return value: A pointer to the newly allocated memory, or %NULL in + * case of malloc() failure or size is 0. + **/ + +#define _cairo_malloc(size) \ + ((size) ? malloc((unsigned) (size)) : NULL) + +/** + * _cairo_malloc_ab: + * @a: number of elements to allocate + * @size: size of each element + * + * Allocates @a*@size memory using _cairo_malloc(), taking care to not + * overflow when doing the multiplication. Behaves much like + * calloc(), except that the returned memory is not set to zero. + * The memory should be freed using free(). + * + * @size should be a constant so that the compiler can optimize + * out a constant division. + * + * Return value: A pointer to the newly allocated memory, or %NULL in + * case of malloc() failure or overflow. + **/ + +#define _cairo_malloc_ab(a, size) \ + ((size) && (unsigned) (a) >= INT32_MAX / (unsigned) (size) ? NULL : \ + _cairo_malloc((unsigned) (a) * (unsigned) (size))) + +/** + * _cairo_realloc_ab: + * @ptr: original pointer to block of memory to be resized + * @a: number of elements to allocate + * @size: size of each element + * + * Reallocates @ptr a block of @a*@size memory using realloc(), taking + * care to not overflow when doing the multiplication. The memory + * should be freed using free(). + * + * @size should be a constant so that the compiler can optimize + * out a constant division. + * + * Return value: A pointer to the newly allocated memory, or %NULL in + * case of realloc() failure or overflow (whereupon the original block + * of memory * is left untouched). + **/ + +#define _cairo_realloc_ab(ptr, a, size) \ + ((size) && (unsigned) (a) >= INT32_MAX / (unsigned) (size) ? NULL : \ + realloc(ptr, (unsigned) (a) * (unsigned) (size))) + +/** + * _cairo_malloc_abc: + * @a: first factor of number of elements to allocate + * @b: second factor of number of elements to allocate + * @size: size of each element + * + * Allocates @a*@b*@size memory using _cairo_malloc(), taking care to not + * overflow when doing the multiplication. Behaves like + * _cairo_malloc_ab(). The memory should be freed using free(). + * + * @size should be a constant so that the compiler can optimize + * out a constant division. + * + * Return value: A pointer to the newly allocated memory, or %NULL in + * case of malloc() failure or overflow. + **/ + +#define _cairo_malloc_abc(a, b, size) \ + ((b) && (unsigned) (a) >= INT32_MAX / (unsigned) (b) ? NULL : \ + (size) && (unsigned) ((a)*(b)) >= INT32_MAX / (unsigned) (size) ? NULL : \ + _cairo_malloc((unsigned) (a) * (unsigned) (b) * (unsigned) (size))) + +/** + * _cairo_malloc_ab_plus_c: + * @a: number of elements to allocate + * @size: size of each element + * @c: additional size to allocate + * + * Allocates @a*@size+@c memory using _cairo_malloc(), taking care to not + * overflow when doing the arithmetic. Behaves similar to + * _cairo_malloc_ab(). The memory should be freed using free(). + * + * Return value: A pointer to the newly allocated memory, or %NULL in + * case of malloc() failure or overflow. + **/ + +#define _cairo_malloc_ab_plus_c(a, size, c) \ + ((size) && (unsigned) (a) >= INT32_MAX / (unsigned) (size) ? NULL : \ + (unsigned) (c) >= INT32_MAX - (unsigned) (a) * (unsigned) (size) ? NULL : \ + _cairo_malloc((unsigned) (a) * (unsigned) (size) + (unsigned) (c))) + +#endif /* CAIRO_MALLOC_PRIVATE_H */ diff --git a/src/cairo-mask-compositor.c b/src/cairo-mask-compositor.c new file mode 100644 index 000000000..4d6b118dd --- /dev/null +++ b/src/cairo-mask-compositor.c @@ -0,0 +1,1481 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +/* This compositor renders the shape to a mask using an image surface + * then calls composite. + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-compositor-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-pattern-inline.h" +#include "cairo-region-private.h" +#include "cairo-surface-observer-private.h" +#include "cairo-surface-offset-private.h" +#include "cairo-surface-snapshot-private.h" +#include "cairo-surface-subsurface-private.h" + +typedef cairo_int_status_t +(*draw_func_t) (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *src, + const cairo_rectangle_int_t *src_sample, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip); + +static void do_unaligned_row(void (*blt)(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage), + void *closure, + const cairo_box_t *b, + int tx, int y, int h, + uint16_t coverage) +{ + int x1 = _cairo_fixed_integer_part (b->p1.x) - tx; + int x2 = _cairo_fixed_integer_part (b->p2.x) - tx; + if (x2 > x1) { + if (! _cairo_fixed_is_integer (b->p1.x)) { + blt(closure, x1, y, 1, h, + coverage * (256 - _cairo_fixed_fractional_part (b->p1.x))); + x1++; + } + + if (x2 > x1) + blt(closure, x1, y, x2-x1, h, (coverage << 8) - (coverage >> 8)); + + if (! _cairo_fixed_is_integer (b->p2.x)) + blt(closure, x2, y, 1, h, + coverage * _cairo_fixed_fractional_part (b->p2.x)); + } else + blt(closure, x1, y, 1, h, + coverage * (b->p2.x - b->p1.x)); +} + +static void do_unaligned_box(void (*blt)(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage), + void *closure, + const cairo_box_t *b, int tx, int ty) +{ + int y1 = _cairo_fixed_integer_part (b->p1.y) - ty; + int y2 = _cairo_fixed_integer_part (b->p2.y) - ty; + if (y2 > y1) { + if (! _cairo_fixed_is_integer (b->p1.y)) { + do_unaligned_row(blt, closure, b, tx, y1, 1, + 256 - _cairo_fixed_fractional_part (b->p1.y)); + y1++; + } + + if (y2 > y1) + do_unaligned_row(blt, closure, b, tx, y1, y2-y1, 256); + + if (! _cairo_fixed_is_integer (b->p2.y)) + do_unaligned_row(blt, closure, b, tx, y2, 1, + _cairo_fixed_fractional_part (b->p2.y)); + } else + do_unaligned_row(blt, closure, b, tx, y1, 1, + b->p2.y - b->p1.y); +} + +struct blt_in { + const cairo_mask_compositor_t *compositor; + cairo_surface_t *dst; +}; + +static void blt_in(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct blt_in *info = closure; + cairo_color_t color; + cairo_rectangle_int_t rect; + + if (coverage == 0xffff) + return; + + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + + _cairo_color_init_rgba (&color, 0, 0, 0, coverage / (double) 0xffff); + info->compositor->fill_rectangles (info->dst, CAIRO_OPERATOR_IN, + &color, &rect, 1); +} + +static cairo_surface_t * +create_composite_mask (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + void *draw_closure, + draw_func_t draw_func, + draw_func_t mask_func, + const cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *surface; + cairo_int_status_t status; + struct blt_in info; + int i; + + surface = _cairo_surface_create_scratch (dst, CAIRO_CONTENT_ALPHA, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (surface->status)) + return surface; + + status = compositor->acquire (surface); + if (unlikely (status)) { + cairo_surface_destroy (surface); + return _cairo_int_surface_create_in_error (status); + } + + if (!surface->is_clear) { + cairo_rectangle_int_t rect; + + rect.x = rect.y = 0; + rect.width = extents->bounded.width; + rect.height = extents->bounded.height; + + status = compositor->fill_rectangles (surface, CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &rect, 1); + if (unlikely (status)) + goto error; + } + + if (mask_func) { + status = mask_func (compositor, surface, draw_closure, + CAIRO_OPERATOR_SOURCE, NULL, NULL, + extents->bounded.x, extents->bounded.y, + &extents->bounded, extents->clip); + if (likely (status != CAIRO_INT_STATUS_UNSUPPORTED)) + goto out; + } + + /* Is it worth setting the clip region here? */ + status = draw_func (compositor, surface, draw_closure, + CAIRO_OPERATOR_ADD, NULL, NULL, + extents->bounded.x, extents->bounded.y, + &extents->bounded, NULL); + if (unlikely (status)) + goto error; + + info.compositor = compositor; + info.dst = surface; + for (i = 0; i < extents->clip->num_boxes; i++) { + cairo_box_t *b = &extents->clip->boxes[i]; + + if (! _cairo_fixed_is_integer (b->p1.x) || + ! _cairo_fixed_is_integer (b->p1.y) || + ! _cairo_fixed_is_integer (b->p2.x) || + ! _cairo_fixed_is_integer (b->p2.y)) + { + do_unaligned_box(blt_in, &info, b, + extents->bounded.x, + extents->bounded.y); + } + } + + if (extents->clip->path != NULL) { + status = _cairo_clip_combine_with_surface (extents->clip, surface, + extents->bounded.x, + extents->bounded.y); + if (unlikely (status)) + goto error; + } + +out: + compositor->release (surface); + surface->is_clear = FALSE; + return surface; + +error: + compositor->release (surface); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + cairo_surface_destroy (surface); + surface = _cairo_int_surface_create_in_error (status); + } + return surface; +} + +/* Handles compositing with a clip surface when the operator allows + * us to combine the clip with the mask + */ +static cairo_status_t +clip_and_composite_with_mask (const cairo_mask_compositor_t *compositor, + void *draw_closure, + draw_func_t draw_func, + draw_func_t mask_func, + cairo_operator_t op, + cairo_pattern_t *pattern, + const cairo_composite_rectangles_t*extents) +{ + cairo_surface_t *dst = extents->surface; + cairo_surface_t *mask, *src; + int src_x, src_y; + + mask = create_composite_mask (compositor, dst, draw_closure, + draw_func, mask_func, + extents); + if (unlikely (mask->status)) + return mask->status; + + if (pattern != NULL || dst->content != CAIRO_CONTENT_ALPHA) { + src = compositor->pattern_to_surface (dst, + &extents->source_pattern.base, + FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (unlikely (src->status)) { + cairo_surface_destroy (mask); + return src->status; + } + + compositor->composite (dst, op, src, mask, + extents->bounded.x + src_x, + extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + cairo_surface_destroy (src); + } else { + compositor->composite (dst, op, mask, NULL, + 0, 0, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } + cairo_surface_destroy (mask); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +get_clip_source (const cairo_mask_compositor_t *compositor, + cairo_clip_t *clip, + cairo_surface_t *dst, + const cairo_rectangle_int_t *bounds, + int *out_x, int *out_y) +{ + cairo_surface_pattern_t pattern; + cairo_rectangle_int_t r; + cairo_surface_t *surface; + + surface = _cairo_clip_get_image (clip, dst, bounds); + if (unlikely (surface->status)) + return surface; + + _cairo_pattern_init_for_surface (&pattern, surface); + pattern.base.filter = CAIRO_FILTER_NEAREST; + cairo_surface_destroy (surface); + + r.x = r.y = 0; + r.width = bounds->width; + r.height = bounds->height; + + surface = compositor->pattern_to_surface (dst, &pattern.base, TRUE, + &r, &r, out_x, out_y); + _cairo_pattern_fini (&pattern.base); + + *out_x += -bounds->x; + *out_y += -bounds->y; + return surface; +} + +/* Handles compositing with a clip surface when we have to do the operation + * in two pieces and combine them together. + */ +static cairo_status_t +clip_and_composite_combine (const cairo_mask_compositor_t *compositor, + void *draw_closure, + draw_func_t draw_func, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_composite_rectangles_t*extents) +{ + cairo_surface_t *dst = extents->surface; + cairo_surface_t *tmp, *clip; + cairo_status_t status; + int clip_x, clip_y; + + tmp = _cairo_surface_create_scratch (dst, dst->content, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (tmp->status)) + return tmp->status; + + compositor->composite (tmp, CAIRO_OPERATOR_SOURCE, dst, NULL, + extents->bounded.x, extents->bounded.y, + 0, 0, + 0, 0, + extents->bounded.width, extents->bounded.height); + + status = draw_func (compositor, tmp, draw_closure, op, + pattern, &extents->source_sample_area, + extents->bounded.x, extents->bounded.y, + &extents->bounded, NULL); + if (unlikely (status)) + goto cleanup; + + clip = get_clip_source (compositor, + extents->clip, dst, &extents->bounded, + &clip_x, &clip_y); + if (unlikely ((status = clip->status))) + goto cleanup; + + if (dst->is_clear) { + compositor->composite (dst, CAIRO_OPERATOR_SOURCE, tmp, clip, + 0, 0, + clip_x, clip_y, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } else { + /* Punch the clip out of the destination */ + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, clip, NULL, + clip_x, clip_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + /* Now add the two results together */ + compositor->composite (dst, CAIRO_OPERATOR_ADD, tmp, clip, + 0, 0, + clip_x, clip_y, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } + cairo_surface_destroy (clip); + +cleanup: + cairo_surface_destroy (tmp); + return status; +} + +/* Handles compositing for %CAIRO_OPERATOR_SOURCE, which is special; it's + * defined as (src IN mask IN clip) ADD (dst OUT (mask IN clip)) + */ +static cairo_status_t +clip_and_composite_source (const cairo_mask_compositor_t *compositor, + void *draw_closure, + draw_func_t draw_func, + draw_func_t mask_func, + cairo_pattern_t *pattern, + const cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *dst = extents->surface; + cairo_surface_t *mask, *src; + int src_x, src_y; + + /* Create a surface that is mask IN clip */ + mask = create_composite_mask (compositor, dst, draw_closure, + draw_func, mask_func, + extents); + if (unlikely (mask->status)) + return mask->status; + + src = compositor->pattern_to_surface (dst, + pattern, + FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (unlikely (src->status)) { + cairo_surface_destroy (mask); + return src->status; + } + + if (dst->is_clear) { + compositor->composite (dst, CAIRO_OPERATOR_SOURCE, src, mask, + extents->bounded.x + src_x, extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } else { + /* Compute dest' = dest OUT (mask IN clip) */ + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + 0, 0, 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + /* Now compute (src IN (mask IN clip)) ADD dest' */ + compositor->composite (dst, CAIRO_OPERATOR_ADD, src, mask, + extents->bounded.x + src_x, extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } + + cairo_surface_destroy (src); + cairo_surface_destroy (mask); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +can_reduce_alpha_op (cairo_operator_t op) +{ + int iop = op; + switch (iop) { + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_ADD: + return TRUE; + default: + return FALSE; + } +} + +static cairo_bool_t +reduce_alpha_op (cairo_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern) +{ + return dst->is_clear && + dst->content == CAIRO_CONTENT_ALPHA && + _cairo_pattern_is_opaque_solid (pattern) && + can_reduce_alpha_op (op); +} + +static cairo_status_t +fixup_unbounded (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + const cairo_composite_rectangles_t *extents) +{ + cairo_rectangle_int_t rects[4]; + int n; + + if (extents->bounded.width == extents->unbounded.width && + extents->bounded.height == extents->unbounded.height) + { + return CAIRO_STATUS_SUCCESS; + } + + n = 0; + if (extents->bounded.width == 0 || extents->bounded.height == 0) { + rects[n].x = extents->unbounded.x; + rects[n].width = extents->unbounded.width; + rects[n].y = extents->unbounded.y; + rects[n].height = extents->unbounded.height; + n++; + } else { + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + rects[n].x = extents->unbounded.x; + rects[n].width = extents->unbounded.width; + rects[n].y = extents->unbounded.y; + rects[n].height = extents->bounded.y - extents->unbounded.y; + n++; + } + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + rects[n].x = extents->unbounded.x; + rects[n].width = extents->bounded.x - extents->unbounded.x; + rects[n].y = extents->bounded.y; + rects[n].height = extents->bounded.height; + n++; + } + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + rects[n].x = extents->bounded.x + extents->bounded.width; + rects[n].width = extents->unbounded.x + extents->unbounded.width - rects[n].x; + rects[n].y = extents->bounded.y; + rects[n].height = extents->bounded.height; + n++; + } + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + rects[n].x = extents->unbounded.x; + rects[n].width = extents->unbounded.width; + rects[n].y = extents->bounded.y + extents->bounded.height; + rects[n].height = extents->unbounded.y + extents->unbounded.height - rects[n].y; + n++; + } + } + + return compositor->fill_rectangles (dst, CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + rects, n); +} + +static cairo_status_t +fixup_unbounded_with_mask (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + const cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *mask; + int mask_x, mask_y; + + mask = get_clip_source (compositor, + extents->clip, dst, &extents->unbounded, + &mask_x, &mask_y); + if (unlikely (mask->status)) + return mask->status; + + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + int x = extents->unbounded.x; + int y = extents->unbounded.y; + int width = extents->unbounded.width; + int height = extents->bounded.y - y; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + x + mask_x, y + mask_y, + 0, 0, + x, y, + width, height); + } + + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + int x = extents->unbounded.x; + int y = extents->bounded.y; + int width = extents->bounded.x - x; + int height = extents->bounded.height; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + x + mask_x, y + mask_y, + 0, 0, + x, y, + width, height); + } + + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + int x = extents->bounded.x + extents->bounded.width; + int y = extents->bounded.y; + int width = extents->unbounded.x + extents->unbounded.width - x; + int height = extents->bounded.height; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + x + mask_x, y + mask_y, + 0, 0, + x, y, + width, height); + } + + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + int x = extents->unbounded.x; + int y = extents->bounded.y + extents->bounded.height; + int width = extents->unbounded.width; + int height = extents->unbounded.y + extents->unbounded.height - y; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + x + mask_x, y + mask_y, + 0, 0, + x, y, + width, height); + } + + cairo_surface_destroy (mask); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +fixup_unbounded_boxes (const cairo_mask_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + cairo_boxes_t clear; + cairo_region_t *clip_region; + cairo_box_t box; + cairo_status_t status; + struct _cairo_boxes_chunk *chunk; + int i; + + assert (boxes->is_pixel_aligned); + + clip_region = NULL; + if (_cairo_clip_is_region (extents->clip) && + (clip_region = _cairo_clip_get_region (extents->clip)) && + cairo_region_contains_rectangle (clip_region, + &extents->bounded) == CAIRO_REGION_OVERLAP_IN) + clip_region = NULL; + + + if (boxes->num_boxes <= 1 && clip_region == NULL) + return fixup_unbounded (compositor, dst, extents); + + _cairo_boxes_init (&clear); + + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); + + if (clip_region == NULL) { + cairo_boxes_t tmp; + + _cairo_boxes_init (&tmp); + + status = _cairo_boxes_add (&tmp, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + tmp.chunks.next = &boxes->chunks; + tmp.num_boxes += boxes->num_boxes; + + status = _cairo_bentley_ottmann_tessellate_boxes (&tmp, + CAIRO_FILL_RULE_WINDING, + &clear); + + tmp.chunks.next = NULL; + } else { + pixman_box32_t *pbox; + + pbox = pixman_region32_rectangles (&clip_region->rgn, &i); + _cairo_boxes_limit (&clear, (cairo_box_t *) pbox, i); + + status = _cairo_boxes_add (&clear, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + status = _cairo_boxes_add (&clear, + CAIRO_ANTIALIAS_DEFAULT, + &chunk->base[i]); + if (unlikely (status)) { + _cairo_boxes_fini (&clear); + return status; + } + } + } + + status = _cairo_bentley_ottmann_tessellate_boxes (&clear, + CAIRO_FILL_RULE_WINDING, + &clear); + } + + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = compositor->fill_boxes (dst, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + } + + _cairo_boxes_fini (&clear); + + return status; +} + +enum { + NEED_CLIP_REGION = 0x1, + NEED_CLIP_SURFACE = 0x2, + FORCE_CLIP_REGION = 0x4, +}; + +static cairo_bool_t +need_bounded_clip (cairo_composite_rectangles_t *extents) +{ + unsigned int flags = NEED_CLIP_REGION; + if (! _cairo_clip_is_region (extents->clip)) + flags |= NEED_CLIP_SURFACE; + return flags; +} + +static cairo_bool_t +need_unbounded_clip (cairo_composite_rectangles_t *extents) +{ + unsigned int flags = 0; + if (! extents->is_bounded) { + flags |= NEED_CLIP_REGION; + if (! _cairo_clip_is_region (extents->clip)) + flags |= NEED_CLIP_SURFACE; + } + if (extents->clip->path != NULL) + flags |= NEED_CLIP_SURFACE; + return flags; +} + +static cairo_status_t +clip_and_composite (const cairo_mask_compositor_t *compositor, + draw_func_t draw_func, + draw_func_t mask_func, + void *draw_closure, + cairo_composite_rectangles_t*extents, + unsigned int need_clip) +{ + cairo_surface_t *dst = extents->surface; + cairo_operator_t op = extents->op; + cairo_pattern_t *src = &extents->source_pattern.base; + cairo_region_t *clip_region = NULL; + cairo_status_t status; + + compositor->acquire (dst); + + if (need_clip & NEED_CLIP_REGION) { + clip_region = _cairo_clip_get_region (extents->clip); + if ((need_clip & FORCE_CLIP_REGION) == 0 && + _cairo_composite_rectangles_can_reduce_clip (extents, + extents->clip)) + clip_region = NULL; + if (clip_region != NULL) { + status = compositor->set_clip_region (dst, clip_region); + if (unlikely (status)) { + compositor->release (dst); + return status; + } + } + } + + if (reduce_alpha_op (dst, op, &extents->source_pattern.base)) { + op = CAIRO_OPERATOR_ADD; + src = NULL; + } + + if (op == CAIRO_OPERATOR_SOURCE) { + status = clip_and_composite_source (compositor, + draw_closure, draw_func, mask_func, + src, extents); + } else { + if (op == CAIRO_OPERATOR_CLEAR) { + op = CAIRO_OPERATOR_DEST_OUT; + src = NULL; + } + + if (need_clip & NEED_CLIP_SURFACE) { + if (extents->is_bounded) { + status = clip_and_composite_with_mask (compositor, + draw_closure, + draw_func, + mask_func, + op, src, extents); + } else { + status = clip_and_composite_combine (compositor, + draw_closure, + draw_func, + op, src, extents); + } + } else { + status = draw_func (compositor, + dst, draw_closure, + op, src, &extents->source_sample_area, + 0, 0, + &extents->bounded, + extents->clip); + } + } + + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) { + if (need_clip & NEED_CLIP_SURFACE) + status = fixup_unbounded_with_mask (compositor, dst, extents); + else + status = fixup_unbounded (compositor, dst, extents); + } + + if (clip_region) + compositor->set_clip_region (dst, NULL); + + compositor->release (dst); + + return status; +} + +static cairo_int_status_t +trim_extents_to_boxes (cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_box_t box; + + _cairo_boxes_extents (boxes, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_status_t +upload_boxes (const cairo_mask_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + const cairo_pattern_t *source = &extents->source_pattern.base; + cairo_surface_t *src; + cairo_rectangle_int_t limit; + cairo_int_status_t status; + int tx, ty; + + src = _cairo_pattern_get_source ((cairo_surface_pattern_t *)source, &limit); + if (!(src->type == CAIRO_SURFACE_TYPE_IMAGE || src->type == dst->type)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, &tx, &ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Check that the data is entirely within the image */ + if (extents->bounded.x + tx < limit.x || extents->bounded.y + ty < limit.y) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (extents->bounded.x + extents->bounded.width + tx > limit.x + limit.width || + extents->bounded.y + extents->bounded.height + ty > limit.y + limit.height) + return CAIRO_INT_STATUS_UNSUPPORTED; + + tx += limit.x; + ty += limit.y; + + if (src->type == CAIRO_SURFACE_TYPE_IMAGE) + status = compositor->draw_image_boxes (dst, + (cairo_image_surface_t *)src, + boxes, tx, ty); + else + status = compositor->copy_boxes (dst, src, boxes, &extents->bounded, + tx, ty); + + return status; +} + +static cairo_status_t +composite_boxes (const cairo_mask_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + cairo_operator_t op = extents->op; + const cairo_pattern_t *source = &extents->source_pattern.base; + cairo_bool_t need_clip_mask = extents->clip->path != NULL; + cairo_status_t status; + + if (need_clip_mask && + (! extents->is_bounded || op == CAIRO_OPERATOR_SOURCE)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = compositor->acquire (dst); + if (unlikely (status)) + return status; + + if (! need_clip_mask && source->type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_color_t *color; + + color = &((cairo_solid_pattern_t *) source)->color; + status = compositor->fill_boxes (dst, op, color, boxes); + } else { + cairo_surface_t *src, *mask = NULL; + int src_x, src_y; + int mask_x = 0, mask_y = 0; + + if (need_clip_mask) { + mask = get_clip_source (compositor, + extents->clip, dst, &extents->bounded, + &mask_x, &mask_y); + if (unlikely (mask->status)) + return mask->status; + + if (op == CAIRO_OPERATOR_CLEAR) { + source = NULL; + op = CAIRO_OPERATOR_DEST_OUT; + } + } + + if (source || mask == NULL) { + src = compositor->pattern_to_surface (dst, source, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + } else { + src = mask; + src_x = mask_x; + src_y = mask_y; + mask = NULL; + } + + status = compositor->composite_boxes (dst, op, src, mask, + src_x, src_y, + mask_x, mask_y, + 0, 0, + boxes, &extents->bounded); + + cairo_surface_destroy (src); + cairo_surface_destroy (mask); + } + + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) + status = fixup_unbounded_boxes (compositor, extents, boxes); + + compositor->release (dst); + + return status; +} + +static cairo_status_t +clip_and_composite_boxes (const cairo_mask_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + cairo_int_status_t status; + + if (boxes->num_boxes == 0) { + if (extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + return fixup_unbounded_boxes (compositor, extents, boxes); + } + + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = trim_extents_to_boxes (extents, boxes); + if (unlikely (status)) + return status; + + if (extents->source_pattern.base.type == CAIRO_PATTERN_TYPE_SURFACE && + extents->clip->path == NULL && + (extents->op == CAIRO_OPERATOR_SOURCE || + (dst->is_clear && (extents->op == CAIRO_OPERATOR_OVER || + extents->op == CAIRO_OPERATOR_ADD)))) + { + status = upload_boxes (compositor, extents, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + return composite_boxes (compositor, extents, boxes); +} + +/* high-level compositor interface */ + +static cairo_int_status_t +_cairo_mask_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor; + cairo_boxes_t boxes; + cairo_int_status_t status; + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + _cairo_clip_steal_boxes (extents->clip, &boxes); + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_clip_unsteal_boxes (extents->clip, &boxes); + + return status; +} + +struct composite_opacity_info { + const cairo_mask_compositor_t *compositor; + uint8_t op; + cairo_surface_t *dst; + cairo_surface_t *src; + int src_x, src_y; + double opacity; +}; + +static void composite_opacity(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct composite_opacity_info *info = closure; + const cairo_mask_compositor_t *compositor = info->compositor; + cairo_surface_t *mask; + int mask_x, mask_y; + cairo_color_t color; + cairo_solid_pattern_t solid; + + _cairo_color_init_rgba (&color, 0, 0, 0, info->opacity * coverage); + _cairo_pattern_init_solid (&solid, &color); + mask = compositor->pattern_to_surface (info->dst, &solid.base, TRUE, + &_cairo_unbounded_rectangle, + &_cairo_unbounded_rectangle, + &mask_x, &mask_y); + if (likely (mask->status == CAIRO_STATUS_SUCCESS)) { + if (info->src) { + compositor->composite (info->dst, info->op, info->src, mask, + x + info->src_x, y + info->src_y, + mask_x, mask_y, + x, y, + w, h); + } else { + compositor->composite (info->dst, info->op, mask, NULL, + mask_x, mask_y, + 0, 0, + x, y, + w, h); + } + } + + cairo_surface_destroy (mask); +} + +static cairo_int_status_t +composite_opacity_boxes (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + const cairo_rectangle_int_t *src_sample, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + const cairo_solid_pattern_t *mask_pattern = closure; + struct composite_opacity_info info; + int i; + + assert (clip); + + info.compositor = compositor; + info.op = op; + info.dst = dst; + + if (src_pattern != NULL) { + info.src = compositor->pattern_to_surface (dst, src_pattern, FALSE, + extents, src_sample, + &info.src_x, &info.src_y); + if (unlikely (info.src->status)) + return info.src->status; + } else + info.src = NULL; + + info.opacity = mask_pattern->color.alpha / (double) 0xffff; + + /* XXX for lots of boxes create a clip region for the fully opaque areas */ + for (i = 0; i < clip->num_boxes; i++) + do_unaligned_box(composite_opacity, &info, + &clip->boxes[i], dst_x, dst_y); + cairo_surface_destroy (info.src); + + return CAIRO_STATUS_SUCCESS; +} + +struct composite_box_info { + const cairo_mask_compositor_t *compositor; + cairo_surface_t *dst; + cairo_surface_t *src; + int src_x, src_y; + uint8_t op; +}; + +static void composite_box(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct composite_box_info *info = closure; + const cairo_mask_compositor_t *compositor = info->compositor; + + if (! CAIRO_ALPHA_SHORT_IS_OPAQUE (coverage)) { + cairo_surface_t *mask; + cairo_color_t color; + cairo_solid_pattern_t solid; + int mask_x, mask_y; + + _cairo_color_init_rgba (&color, 0, 0, 0, coverage / (double)0xffff); + _cairo_pattern_init_solid (&solid, &color); + + mask = compositor->pattern_to_surface (info->dst, &solid.base, FALSE, + &_cairo_unbounded_rectangle, + &_cairo_unbounded_rectangle, + &mask_x, &mask_y); + + if (likely (mask->status == CAIRO_STATUS_SUCCESS)) { + compositor->composite (info->dst, info->op, info->src, mask, + x + info->src_x, y + info->src_y, + mask_x, mask_y, + x, y, + w, h); + } + + cairo_surface_destroy (mask); + } else { + compositor->composite (info->dst, info->op, info->src, NULL, + x + info->src_x, y + info->src_y, + 0, 0, + x, y, + w, h); + } +} + +static cairo_int_status_t +composite_mask_clip_boxes (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + const cairo_rectangle_int_t *src_sample, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + cairo_composite_rectangles_t *composite = closure; + struct composite_box_info info; + int i; + + assert (src_pattern == NULL); + assert (op == CAIRO_OPERATOR_SOURCE); + + info.compositor = compositor; + info.op = CAIRO_OPERATOR_SOURCE; + info.dst = dst; + info.src = compositor->pattern_to_surface (dst, + &composite->mask_pattern.base, + FALSE, extents, + &composite->mask_sample_area, + &info.src_x, &info.src_y); + if (unlikely (info.src->status)) + return info.src->status; + + info.src_x += dst_x; + info.src_y += dst_y; + + for (i = 0; i < clip->num_boxes; i++) + do_unaligned_box(composite_box, &info, &clip->boxes[i], dst_x, dst_y); + + cairo_surface_destroy (info.src); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_mask (const cairo_mask_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + const cairo_rectangle_int_t *src_sample, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + cairo_composite_rectangles_t *composite = closure; + cairo_surface_t *src, *mask; + int src_x, src_y; + int mask_x, mask_y; + + if (src_pattern != NULL) { + src = compositor->pattern_to_surface (dst, src_pattern, FALSE, + extents, src_sample, + &src_x, &src_y); + if (unlikely (src->status)) + return src->status; + + mask = compositor->pattern_to_surface (dst, &composite->mask_pattern.base, TRUE, + extents, &composite->mask_sample_area, + &mask_x, &mask_y); + if (unlikely (mask->status)) { + cairo_surface_destroy (src); + return mask->status; + } + + compositor->composite (dst, op, src, mask, + extents->x + src_x, extents->y + src_y, + extents->x + mask_x, extents->y + mask_y, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + cairo_surface_destroy (mask); + cairo_surface_destroy (src); + } else { + src = compositor->pattern_to_surface (dst, &composite->mask_pattern.base, FALSE, + extents, &composite->mask_sample_area, + &src_x, &src_y); + if (unlikely (src->status)) + return src->status; + + compositor->composite (dst, op, src, NULL, + extents->x + src_x, extents->y + src_y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + cairo_surface_destroy (src); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_mask_compositor_mask (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor; + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + if (extents->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID && + extents->clip->path == NULL && + _cairo_clip_is_region (extents->clip)) { + status = clip_and_composite (compositor, + composite_opacity_boxes, + composite_opacity_boxes, + &extents->mask_pattern.solid, + extents, need_unbounded_clip (extents)); + } else { + status = clip_and_composite (compositor, + composite_mask, + extents->clip->path == NULL ? composite_mask_clip_boxes : NULL, + extents, + extents, need_bounded_clip (extents)); + } + + return status; +} + +static cairo_int_status_t +_cairo_mask_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor; + cairo_surface_t *mask; + cairo_surface_pattern_t pattern; + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, extents->clip); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + style, + ctm, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + mask = cairo_surface_create_similar_image (extents->surface, + CAIRO_FORMAT_A8, + extents->bounded.width, + extents->bounded.height); + if (unlikely (mask->status)) + return mask->status; + + status = _cairo_surface_offset_stroke (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + path, style, ctm, ctm_inverse, + tolerance, antialias, + extents->clip); + if (unlikely (status)) { + cairo_surface_destroy (mask); + return status; + } + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_surface_destroy (mask); + + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + status = _cairo_surface_mask (extents->surface, + extents->op, + &extents->source_pattern.base, + &pattern.base, + extents->clip); + _cairo_pattern_fini (&pattern.base); + } + + return status; +} + +static cairo_int_status_t +_cairo_mask_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor; + cairo_surface_t *mask; + cairo_surface_pattern_t pattern; + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, extents->clip); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + mask = cairo_surface_create_similar_image (extents->surface, + CAIRO_FORMAT_A8, + extents->bounded.width, + extents->bounded.height); + if (unlikely (mask->status)) + return mask->status; + + status = _cairo_surface_offset_fill (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + path, fill_rule, tolerance, antialias, + extents->clip); + if (unlikely (status)) { + cairo_surface_destroy (mask); + return status; + } + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_surface_destroy (mask); + + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + status = _cairo_surface_mask (extents->surface, + extents->op, + &extents->source_pattern.base, + &pattern.base, + extents->clip); + _cairo_pattern_fini (&pattern.base); + } + + return status; +} + +static cairo_int_status_t +_cairo_mask_compositor_glyphs (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + const cairo_mask_compositor_t *compositor = (cairo_mask_compositor_t*)_compositor; + cairo_surface_t *mask; + cairo_surface_pattern_t pattern; + cairo_int_status_t status; + + status = compositor->check_composite (extents); + if (unlikely (status)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + mask = cairo_surface_create_similar_image (extents->surface, + CAIRO_FORMAT_A8, + extents->bounded.width, + extents->bounded.height); + if (unlikely (mask->status)) + return mask->status; + + status = _cairo_surface_offset_glyphs (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + scaled_font, glyphs, num_glyphs, + extents->clip); + if (unlikely (status)) { + cairo_surface_destroy (mask); + return status; + } + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_surface_destroy (mask); + + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + status = _cairo_surface_mask (extents->surface, + extents->op, + &extents->source_pattern.base, + &pattern.base, + extents->clip); + _cairo_pattern_fini (&pattern.base); + + return status; +} + +void +_cairo_mask_compositor_init (cairo_mask_compositor_t *compositor, + const cairo_compositor_t *delegate) +{ + compositor->base.delegate = delegate; + + compositor->base.paint = _cairo_mask_compositor_paint; + compositor->base.mask = _cairo_mask_compositor_mask; + compositor->base.fill = _cairo_mask_compositor_fill; + compositor->base.stroke = _cairo_mask_compositor_stroke; + compositor->base.glyphs = _cairo_mask_compositor_glyphs; +} diff --git a/src/cairo-matrix.c b/src/cairo-matrix.c new file mode 100644 index 000000000..ae498f515 --- /dev/null +++ b/src/cairo-matrix.c @@ -0,0 +1,1212 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" +#include "cairo-error-private.h" +#include + +#define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */ + +#if _XOPEN_SOURCE >= 600 || defined (_ISOC99_SOURCE) +#define ISFINITE(x) isfinite (x) +#else +#define ISFINITE(x) ((x) * (x) >= 0.) /* check for NaNs */ +#endif + +/** + * SECTION:cairo-matrix + * @Title: cairo_matrix_t + * @Short_Description: Generic matrix operations + * @See_Also: #cairo_t + * + * #cairo_matrix_t is used throughout cairo to convert between different + * coordinate spaces. A #cairo_matrix_t holds an affine transformation, + * such as a scale, rotation, shear, or a combination of these. + * The transformation of a point (x,y) + * is given by: + * + * + * x_new = xx * x + xy * y + x0; + * y_new = yx * x + yy * y + y0; + * + * + * The current transformation matrix of a #cairo_t, represented as a + * #cairo_matrix_t, defines the transformation from user-space + * coordinates to device-space coordinates. See cairo_get_matrix() and + * cairo_set_matrix(). + **/ + +static void +_cairo_matrix_scalar_multiply (cairo_matrix_t *matrix, double scalar); + +static void +_cairo_matrix_compute_adjoint (cairo_matrix_t *matrix); + +/** + * cairo_matrix_init_identity: + * @matrix: a #cairo_matrix_t + * + * Modifies @matrix to be an identity transformation. + * + * Since: 1.0 + **/ +void +cairo_matrix_init_identity (cairo_matrix_t *matrix) +{ + cairo_matrix_init (matrix, + 1, 0, + 0, 1, + 0, 0); +} +slim_hidden_def(cairo_matrix_init_identity); + +/** + * cairo_matrix_init: + * @matrix: a #cairo_matrix_t + * @xx: xx component of the affine transformation + * @yx: yx component of the affine transformation + * @xy: xy component of the affine transformation + * @yy: yy component of the affine transformation + * @x0: X translation component of the affine transformation + * @y0: Y translation component of the affine transformation + * + * Sets @matrix to be the affine transformation given by + * @xx, @yx, @xy, @yy, @x0, @y0. The transformation is given + * by: + * + * x_new = xx * x + xy * y + x0; + * y_new = yx * x + yy * y + y0; + * + * + * Since: 1.0 + **/ +void +cairo_matrix_init (cairo_matrix_t *matrix, + double xx, double yx, + + double xy, double yy, + double x0, double y0) +{ + matrix->xx = xx; matrix->yx = yx; + matrix->xy = xy; matrix->yy = yy; + matrix->x0 = x0; matrix->y0 = y0; +} +slim_hidden_def(cairo_matrix_init); + +/** + * _cairo_matrix_get_affine: + * @matrix: a #cairo_matrix_t + * @xx: location to store xx component of matrix + * @yx: location to store yx component of matrix + * @xy: location to store xy component of matrix + * @yy: location to store yy component of matrix + * @x0: location to store x0 (X-translation component) of matrix, or %NULL + * @y0: location to store y0 (Y-translation component) of matrix, or %NULL + * + * Gets the matrix values for the affine transformation that @matrix represents. + * See cairo_matrix_init(). + * + * + * This function is a leftover from the old public API, but is still + * mildly useful as an internal means for getting at the matrix + * members in a positional way. For example, when reassigning to some + * external matrix type, or when renaming members to more meaningful + * names (such as a,b,c,d,e,f) for particular manipulations. + **/ +void +_cairo_matrix_get_affine (const cairo_matrix_t *matrix, + double *xx, double *yx, + double *xy, double *yy, + double *x0, double *y0) +{ + *xx = matrix->xx; + *yx = matrix->yx; + + *xy = matrix->xy; + *yy = matrix->yy; + + if (x0) + *x0 = matrix->x0; + if (y0) + *y0 = matrix->y0; +} + +/** + * cairo_matrix_init_translate: + * @matrix: a #cairo_matrix_t + * @tx: amount to translate in the X direction + * @ty: amount to translate in the Y direction + * + * Initializes @matrix to a transformation that translates by @tx and + * @ty in the X and Y dimensions, respectively. + * + * Since: 1.0 + **/ +void +cairo_matrix_init_translate (cairo_matrix_t *matrix, + double tx, double ty) +{ + cairo_matrix_init (matrix, + 1, 0, + 0, 1, + tx, ty); +} +slim_hidden_def(cairo_matrix_init_translate); + +/** + * cairo_matrix_translate: + * @matrix: a #cairo_matrix_t + * @tx: amount to translate in the X direction + * @ty: amount to translate in the Y direction + * + * Applies a translation by @tx, @ty to the transformation in + * @matrix. The effect of the new transformation is to first translate + * the coordinates by @tx and @ty, then apply the original transformation + * to the coordinates. + * + * Since: 1.0 + **/ +void +cairo_matrix_translate (cairo_matrix_t *matrix, double tx, double ty) +{ + cairo_matrix_t tmp; + + cairo_matrix_init_translate (&tmp, tx, ty); + + cairo_matrix_multiply (matrix, &tmp, matrix); +} +slim_hidden_def (cairo_matrix_translate); + +/** + * cairo_matrix_init_scale: + * @matrix: a #cairo_matrix_t + * @sx: scale factor in the X direction + * @sy: scale factor in the Y direction + * + * Initializes @matrix to a transformation that scales by @sx and @sy + * in the X and Y dimensions, respectively. + * + * Since: 1.0 + **/ +void +cairo_matrix_init_scale (cairo_matrix_t *matrix, + double sx, double sy) +{ + cairo_matrix_init (matrix, + sx, 0, + 0, sy, + 0, 0); +} +slim_hidden_def(cairo_matrix_init_scale); + +/** + * cairo_matrix_scale: + * @matrix: a #cairo_matrix_t + * @sx: scale factor in the X direction + * @sy: scale factor in the Y direction + * + * Applies scaling by @sx, @sy to the transformation in @matrix. The + * effect of the new transformation is to first scale the coordinates + * by @sx and @sy, then apply the original transformation to the coordinates. + * + * Since: 1.0 + **/ +void +cairo_matrix_scale (cairo_matrix_t *matrix, double sx, double sy) +{ + cairo_matrix_t tmp; + + cairo_matrix_init_scale (&tmp, sx, sy); + + cairo_matrix_multiply (matrix, &tmp, matrix); +} +slim_hidden_def(cairo_matrix_scale); + +/** + * cairo_matrix_init_rotate: + * @matrix: a #cairo_matrix_t + * @radians: angle of rotation, in radians. The direction of rotation + * is defined such that positive angles rotate in the direction from + * the positive X axis toward the positive Y axis. With the default + * axis orientation of cairo, positive angles rotate in a clockwise + * direction. + * + * Initialized @matrix to a transformation that rotates by @radians. + * + * Since: 1.0 + **/ +void +cairo_matrix_init_rotate (cairo_matrix_t *matrix, + double radians) +{ + double s; + double c; + + s = sin (radians); + c = cos (radians); + + cairo_matrix_init (matrix, + c, s, + -s, c, + 0, 0); +} +slim_hidden_def(cairo_matrix_init_rotate); + +/** + * cairo_matrix_rotate: + * @matrix: a #cairo_matrix_t + * @radians: angle of rotation, in radians. The direction of rotation + * is defined such that positive angles rotate in the direction from + * the positive X axis toward the positive Y axis. With the default + * axis orientation of cairo, positive angles rotate in a clockwise + * direction. + * + * Applies rotation by @radians to the transformation in + * @matrix. The effect of the new transformation is to first rotate the + * coordinates by @radians, then apply the original transformation + * to the coordinates. + * + * Since: 1.0 + **/ +void +cairo_matrix_rotate (cairo_matrix_t *matrix, double radians) +{ + cairo_matrix_t tmp; + + cairo_matrix_init_rotate (&tmp, radians); + + cairo_matrix_multiply (matrix, &tmp, matrix); +} + +/** + * cairo_matrix_multiply: + * @result: a #cairo_matrix_t in which to store the result + * @a: a #cairo_matrix_t + * @b: a #cairo_matrix_t + * + * Multiplies the affine transformations in @a and @b together + * and stores the result in @result. The effect of the resulting + * transformation is to first apply the transformation in @a to the + * coordinates and then apply the transformation in @b to the + * coordinates. + * + * It is allowable for @result to be identical to either @a or @b. + * + * Since: 1.0 + **/ +/* + * XXX: The ordering of the arguments to this function corresponds + * to [row_vector]*A*B. If we want to use column vectors instead, + * then we need to switch the two arguments and fix up all + * uses. + */ +void +cairo_matrix_multiply (cairo_matrix_t *result, const cairo_matrix_t *a, const cairo_matrix_t *b) +{ + cairo_matrix_t r; + + r.xx = a->xx * b->xx + a->yx * b->xy; + r.yx = a->xx * b->yx + a->yx * b->yy; + + r.xy = a->xy * b->xx + a->yy * b->xy; + r.yy = a->xy * b->yx + a->yy * b->yy; + + r.x0 = a->x0 * b->xx + a->y0 * b->xy + b->x0; + r.y0 = a->x0 * b->yx + a->y0 * b->yy + b->y0; + + *result = r; +} +slim_hidden_def(cairo_matrix_multiply); + +void +_cairo_matrix_multiply (cairo_matrix_t *r, + const cairo_matrix_t *a, + const cairo_matrix_t *b) +{ + r->xx = a->xx * b->xx + a->yx * b->xy; + r->yx = a->xx * b->yx + a->yx * b->yy; + + r->xy = a->xy * b->xx + a->yy * b->xy; + r->yy = a->xy * b->yx + a->yy * b->yy; + + r->x0 = a->x0 * b->xx + a->y0 * b->xy + b->x0; + r->y0 = a->x0 * b->yx + a->y0 * b->yy + b->y0; +} + +/** + * cairo_matrix_transform_distance: + * @matrix: a #cairo_matrix_t + * @dx: X component of a distance vector. An in/out parameter + * @dy: Y component of a distance vector. An in/out parameter + * + * Transforms the distance vector (@dx,@dy) by @matrix. This is + * similar to cairo_matrix_transform_point() except that the translation + * components of the transformation are ignored. The calculation of + * the returned vector is as follows: + * + * + * dx2 = dx1 * a + dy1 * c; + * dy2 = dx1 * b + dy1 * d; + * + * + * Affine transformations are position invariant, so the same vector + * always transforms to the same vector. If (@x1,@y1) transforms + * to (@x2,@y2) then (@x1+@dx1,@y1+@dy1) will transform to + * (@x1+@dx2,@y1+@dy2) for all values of @x1 and @x2. + * + * Since: 1.0 + **/ +void +cairo_matrix_transform_distance (const cairo_matrix_t *matrix, double *dx, double *dy) +{ + double new_x, new_y; + + new_x = (matrix->xx * *dx + matrix->xy * *dy); + new_y = (matrix->yx * *dx + matrix->yy * *dy); + + *dx = new_x; + *dy = new_y; +} +slim_hidden_def(cairo_matrix_transform_distance); + +/** + * cairo_matrix_transform_point: + * @matrix: a #cairo_matrix_t + * @x: X position. An in/out parameter + * @y: Y position. An in/out parameter + * + * Transforms the point (@x, @y) by @matrix. + * + * Since: 1.0 + **/ +void +cairo_matrix_transform_point (const cairo_matrix_t *matrix, double *x, double *y) +{ + cairo_matrix_transform_distance (matrix, x, y); + + *x += matrix->x0; + *y += matrix->y0; +} +slim_hidden_def(cairo_matrix_transform_point); + +void +_cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix, + double *x1, double *y1, + double *x2, double *y2, + cairo_bool_t *is_tight) +{ + int i; + double quad_x[4], quad_y[4]; + double min_x, max_x; + double min_y, max_y; + + if (matrix->xy == 0. && matrix->yx == 0.) { + /* non-rotation/skew matrix, just map the two extreme points */ + + if (matrix->xx != 1.) { + quad_x[0] = *x1 * matrix->xx; + quad_x[1] = *x2 * matrix->xx; + if (quad_x[0] < quad_x[1]) { + *x1 = quad_x[0]; + *x2 = quad_x[1]; + } else { + *x1 = quad_x[1]; + *x2 = quad_x[0]; + } + } + if (matrix->x0 != 0.) { + *x1 += matrix->x0; + *x2 += matrix->x0; + } + + if (matrix->yy != 1.) { + quad_y[0] = *y1 * matrix->yy; + quad_y[1] = *y2 * matrix->yy; + if (quad_y[0] < quad_y[1]) { + *y1 = quad_y[0]; + *y2 = quad_y[1]; + } else { + *y1 = quad_y[1]; + *y2 = quad_y[0]; + } + } + if (matrix->y0 != 0.) { + *y1 += matrix->y0; + *y2 += matrix->y0; + } + + if (is_tight) + *is_tight = TRUE; + + return; + } + + /* general matrix */ + quad_x[0] = *x1; + quad_y[0] = *y1; + cairo_matrix_transform_point (matrix, &quad_x[0], &quad_y[0]); + + quad_x[1] = *x2; + quad_y[1] = *y1; + cairo_matrix_transform_point (matrix, &quad_x[1], &quad_y[1]); + + quad_x[2] = *x1; + quad_y[2] = *y2; + cairo_matrix_transform_point (matrix, &quad_x[2], &quad_y[2]); + + quad_x[3] = *x2; + quad_y[3] = *y2; + cairo_matrix_transform_point (matrix, &quad_x[3], &quad_y[3]); + + min_x = max_x = quad_x[0]; + min_y = max_y = quad_y[0]; + + for (i=1; i < 4; i++) { + if (quad_x[i] < min_x) + min_x = quad_x[i]; + if (quad_x[i] > max_x) + max_x = quad_x[i]; + + if (quad_y[i] < min_y) + min_y = quad_y[i]; + if (quad_y[i] > max_y) + max_y = quad_y[i]; + } + + *x1 = min_x; + *y1 = min_y; + *x2 = max_x; + *y2 = max_y; + + if (is_tight) { + /* it's tight if and only if the four corner points form an axis-aligned + rectangle. + And that's true if and only if we can derive corners 0 and 3 from + corners 1 and 2 in one of two straightforward ways... + We could use a tolerance here but for now we'll fall back to FALSE in the case + of floating point error. + */ + *is_tight = + (quad_x[1] == quad_x[0] && quad_y[1] == quad_y[3] && + quad_x[2] == quad_x[3] && quad_y[2] == quad_y[0]) || + (quad_x[1] == quad_x[3] && quad_y[1] == quad_y[0] && + quad_x[2] == quad_x[0] && quad_y[2] == quad_y[3]); + } +} + +cairo_private void +_cairo_matrix_transform_bounding_box_fixed (const cairo_matrix_t *matrix, + cairo_box_t *bbox, + cairo_bool_t *is_tight) +{ + double x1, y1, x2, y2; + + _cairo_box_to_doubles (bbox, &x1, &y1, &x2, &y2); + _cairo_matrix_transform_bounding_box (matrix, &x1, &y1, &x2, &y2, is_tight); + _cairo_box_from_doubles (bbox, &x1, &y1, &x2, &y2); +} + +static void +_cairo_matrix_scalar_multiply (cairo_matrix_t *matrix, double scalar) +{ + matrix->xx *= scalar; + matrix->yx *= scalar; + + matrix->xy *= scalar; + matrix->yy *= scalar; + + matrix->x0 *= scalar; + matrix->y0 *= scalar; +} + +/* This function isn't a correct adjoint in that the implicit 1 in the + homogeneous result should actually be ad-bc instead. But, since this + adjoint is only used in the computation of the inverse, which + divides by det (A)=ad-bc anyway, everything works out in the end. */ +static void +_cairo_matrix_compute_adjoint (cairo_matrix_t *matrix) +{ + /* adj (A) = transpose (C:cofactor (A,i,j)) */ + double a, b, c, d, tx, ty; + + _cairo_matrix_get_affine (matrix, + &a, &b, + &c, &d, + &tx, &ty); + + cairo_matrix_init (matrix, + d, -b, + -c, a, + c*ty - d*tx, b*tx - a*ty); +} + +/** + * cairo_matrix_invert: + * @matrix: a #cairo_matrix_t + * + * Changes @matrix to be the inverse of its original value. Not + * all transformation matrices have inverses; if the matrix + * collapses points together (it is degenerate), + * then it has no inverse and this function will fail. + * + * Returns: If @matrix has an inverse, modifies @matrix to + * be the inverse matrix and returns %CAIRO_STATUS_SUCCESS. Otherwise, + * returns %CAIRO_STATUS_INVALID_MATRIX. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_matrix_invert (cairo_matrix_t *matrix) +{ + double det; + + /* Simple scaling|translation matrices are quite common... */ + if (matrix->xy == 0. && matrix->yx == 0.) { + matrix->x0 = -matrix->x0; + matrix->y0 = -matrix->y0; + + if (matrix->xx != 1.) { + if (matrix->xx == 0.) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + matrix->xx = 1. / matrix->xx; + matrix->x0 *= matrix->xx; + } + + if (matrix->yy != 1.) { + if (matrix->yy == 0.) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + matrix->yy = 1. / matrix->yy; + matrix->y0 *= matrix->yy; + } + + return CAIRO_STATUS_SUCCESS; + } + + /* inv (A) = 1/det (A) * adj (A) */ + det = _cairo_matrix_compute_determinant (matrix); + + if (! ISFINITE (det)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + if (det == 0) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + _cairo_matrix_compute_adjoint (matrix); + _cairo_matrix_scalar_multiply (matrix, 1 / det); + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def(cairo_matrix_invert); + +cairo_bool_t +_cairo_matrix_is_invertible (const cairo_matrix_t *matrix) +{ + double det; + + det = _cairo_matrix_compute_determinant (matrix); + + return ISFINITE (det) && det != 0.; +} + +cairo_bool_t +_cairo_matrix_is_scale_0 (const cairo_matrix_t *matrix) +{ + return matrix->xx == 0. && + matrix->xy == 0. && + matrix->yx == 0. && + matrix->yy == 0.; +} + +double +_cairo_matrix_compute_determinant (const cairo_matrix_t *matrix) +{ + double a, b, c, d; + + a = matrix->xx; b = matrix->yx; + c = matrix->xy; d = matrix->yy; + + return a*d - b*c; +} + +/** + * _cairo_matrix_compute_basis_scale_factors: + * @matrix: a matrix + * @basis_scale: the scale factor in the direction of basis + * @normal_scale: the scale factor in the direction normal to the basis + * @x_basis: basis to use. X basis if true, Y basis otherwise. + * + * Computes |Mv| and det(M)/|Mv| for v=[1,0] if x_basis is true, and v=[0,1] + * otherwise, and M is @matrix. + * + * Return value: the scale factor of @matrix on the height of the font, + * or 1.0 if @matrix is %NULL. + **/ +cairo_status_t +_cairo_matrix_compute_basis_scale_factors (const cairo_matrix_t *matrix, + double *basis_scale, double *normal_scale, + cairo_bool_t x_basis) +{ + double det; + + det = _cairo_matrix_compute_determinant (matrix); + + if (! ISFINITE (det)) + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + + if (det == 0) + { + *basis_scale = *normal_scale = 0; + } + else + { + double x = x_basis != 0; + double y = x == 0; + double major, minor; + + cairo_matrix_transform_distance (matrix, &x, &y); + major = hypot (x, y); + /* + * ignore mirroring + */ + if (det < 0) + det = -det; + if (major) + minor = det / major; + else + minor = 0.0; + if (x_basis) + { + *basis_scale = major; + *normal_scale = minor; + } + else + { + *basis_scale = minor; + *normal_scale = major; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +_cairo_matrix_is_integer_translation (const cairo_matrix_t *matrix, + int *itx, int *ity) +{ + if (_cairo_matrix_is_translation (matrix)) + { + cairo_fixed_t x0_fixed = _cairo_fixed_from_double (matrix->x0); + cairo_fixed_t y0_fixed = _cairo_fixed_from_double (matrix->y0); + + if (_cairo_fixed_is_integer (x0_fixed) && + _cairo_fixed_is_integer (y0_fixed)) + { + if (itx) + *itx = _cairo_fixed_integer_part (x0_fixed); + if (ity) + *ity = _cairo_fixed_integer_part (y0_fixed); + + return TRUE; + } + } + + return FALSE; +} + +#define SCALING_EPSILON _cairo_fixed_to_double(1) + +/* This only returns true if the matrix is 90 degree rotations or + * flips. It appears calling code is relying on this. It will return + * false for other rotations even if the scale is one. Approximations + * are allowed to handle matricies filled in using trig functions + * such as sin(M_PI_2). + */ +cairo_bool_t +_cairo_matrix_has_unity_scale (const cairo_matrix_t *matrix) +{ + /* check that the determinant is near +/-1 */ + double det = _cairo_matrix_compute_determinant (matrix); + if (fabs (det * det - 1.0) < SCALING_EPSILON) { + /* check that one axis is close to zero */ + if (fabs (matrix->xy) < SCALING_EPSILON && + fabs (matrix->yx) < SCALING_EPSILON) + return TRUE; + if (fabs (matrix->xx) < SCALING_EPSILON && + fabs (matrix->yy) < SCALING_EPSILON) + return TRUE; + /* If rotations are allowed then it must instead test for + * orthogonality. This is xx*xy+yx*yy ~= 0. + */ + } + return FALSE; +} + +/* By pixel exact here, we mean a matrix that is composed only of + * 90 degree rotations, flips, and integer translations and produces a 1:1 + * mapping between source and destination pixels. If we transform an image + * with a pixel-exact matrix, filtering is not useful. + */ +cairo_bool_t +_cairo_matrix_is_pixel_exact (const cairo_matrix_t *matrix) +{ + cairo_fixed_t x0_fixed, y0_fixed; + + if (! _cairo_matrix_has_unity_scale (matrix)) + return FALSE; + + x0_fixed = _cairo_fixed_from_double (matrix->x0); + y0_fixed = _cairo_fixed_from_double (matrix->y0); + + return _cairo_fixed_is_integer (x0_fixed) && _cairo_fixed_is_integer (y0_fixed); +} + +/* + A circle in user space is transformed into an ellipse in device space. + + The following is a derivation of a formula to calculate the length of the + major axis for this ellipse; this is useful for error bounds calculations. + + Thanks to Walter Brisken for this derivation: + + 1. First some notation: + + All capital letters represent vectors in two dimensions. A prime ' + represents a transformed coordinate. Matrices are written in underlined + form, ie _R_. Lowercase letters represent scalar real values. + + 2. The question has been posed: What is the maximum expansion factor + achieved by the linear transformation + + X' = X _R_ + + where _R_ is a real-valued 2x2 matrix with entries: + + _R_ = [a b] + [c d] . + + In other words, what is the maximum radius, MAX[ |X'| ], reached for any + X on the unit circle ( |X| = 1 ) ? + + 3. Some useful formulae + + (A) through (C) below are standard double-angle formulae. (D) is a lesser + known result and is derived below: + + (A) sin²(θ) = (1 - cos(2*θ))/2 + (B) cos²(θ) = (1 + cos(2*θ))/2 + (C) sin(θ)*cos(θ) = sin(2*θ)/2 + (D) MAX[a*cos(θ) + b*sin(θ)] = sqrt(a² + b²) + + Proof of (D): + + find the maximum of the function by setting the derivative to zero: + + -a*sin(θ)+b*cos(θ) = 0 + + From this it follows that + + tan(θ) = b/a + + and hence + + sin(θ) = b/sqrt(a² + b²) + + and + + cos(θ) = a/sqrt(a² + b²) + + Thus the maximum value is + + MAX[a*cos(θ) + b*sin(θ)] = (a² + b²)/sqrt(a² + b²) + = sqrt(a² + b²) + + 4. Derivation of maximum expansion + + To find MAX[ |X'| ] we search brute force method using calculus. The unit + circle on which X is constrained is to be parameterized by t: + + X(θ) = (cos(θ), sin(θ)) + + Thus + + X'(θ) = X(θ) * _R_ = (cos(θ), sin(θ)) * [a b] + [c d] + = (a*cos(θ) + c*sin(θ), b*cos(θ) + d*sin(θ)). + + Define + + r(θ) = |X'(θ)| + + Thus + + r²(θ) = (a*cos(θ) + c*sin(θ))² + (b*cos(θ) + d*sin(θ))² + = (a² + b²)*cos²(θ) + (c² + d²)*sin²(θ) + + 2*(a*c + b*d)*cos(θ)*sin(θ) + + Now apply the double angle formulae (A) to (C) from above: + + r²(θ) = (a² + b² + c² + d²)/2 + + (a² + b² - c² - d²)*cos(2*θ)/2 + + (a*c + b*d)*sin(2*θ) + = f + g*cos(φ) + h*sin(φ) + + Where + + f = (a² + b² + c² + d²)/2 + g = (a² + b² - c² - d²)/2 + h = (a*c + d*d) + φ = 2*θ + + It is clear that MAX[ |X'| ] = sqrt(MAX[ r² ]). Here we determine MAX[ r² ] + using (D) from above: + + MAX[ r² ] = f + sqrt(g² + h²) + + And finally + + MAX[ |X'| ] = sqrt( f + sqrt(g² + h²) ) + + Which is the solution to this problem. + + Walter Brisken + 2004/10/08 + + (Note that the minor axis length is at the minimum of the above solution, + which is just sqrt ( f - sqrt(g² + h²) ) given the symmetry of (D)). + + + For another derivation of the same result, using Singular Value Decomposition, + see doc/tutorial/src/singular.c. +*/ + +/* determine the length of the major axis of a circle of the given radius + after applying the transformation matrix. */ +double +_cairo_matrix_transformed_circle_major_axis (const cairo_matrix_t *matrix, + double radius) +{ + double a, b, c, d, f, g, h, i, j; + + if (_cairo_matrix_has_unity_scale (matrix)) + return radius; + + _cairo_matrix_get_affine (matrix, + &a, &b, + &c, &d, + NULL, NULL); + + i = a*a + b*b; + j = c*c + d*d; + + f = 0.5 * (i + j); + g = 0.5 * (i - j); + h = a*c + b*d; + + return radius * sqrt (f + hypot (g, h)); + + /* + * we don't need the minor axis length, which is + * double min = radius * sqrt (f - sqrt (g*g+h*h)); + */ +} + +static const pixman_transform_t pixman_identity_transform = {{ + {1 << 16, 0, 0}, + { 0, 1 << 16, 0}, + { 0, 0, 1 << 16} + }}; + +static cairo_status_t +_cairo_matrix_to_pixman_matrix (const cairo_matrix_t *matrix, + pixman_transform_t *pixman_transform, + double xc, + double yc) +{ + cairo_matrix_t inv; + unsigned max_iterations; + + pixman_transform->matrix[0][0] = _cairo_fixed_16_16_from_double (matrix->xx); + pixman_transform->matrix[0][1] = _cairo_fixed_16_16_from_double (matrix->xy); + pixman_transform->matrix[0][2] = _cairo_fixed_16_16_from_double (matrix->x0); + + pixman_transform->matrix[1][0] = _cairo_fixed_16_16_from_double (matrix->yx); + pixman_transform->matrix[1][1] = _cairo_fixed_16_16_from_double (matrix->yy); + pixman_transform->matrix[1][2] = _cairo_fixed_16_16_from_double (matrix->y0); + + pixman_transform->matrix[2][0] = 0; + pixman_transform->matrix[2][1] = 0; + pixman_transform->matrix[2][2] = 1 << 16; + + /* The conversion above breaks cairo's translation invariance: + * a translation of (a, b) in device space translates to + * a translation of (xx * a + xy * b, yx * a + yy * b) + * for cairo, while pixman uses rounded versions of xx ... yy. + * This error increases as a and b get larger. + * + * To compensate for this, we fix the point (xc, yc) in pattern + * space and adjust pixman's transform to agree with cairo's at + * that point. + */ + + if (_cairo_matrix_has_unity_scale (matrix)) + return CAIRO_STATUS_SUCCESS; + + if (unlikely (fabs (matrix->xx) > PIXMAN_MAX_INT || + fabs (matrix->xy) > PIXMAN_MAX_INT || + fabs (matrix->x0) > PIXMAN_MAX_INT || + fabs (matrix->yx) > PIXMAN_MAX_INT || + fabs (matrix->yy) > PIXMAN_MAX_INT || + fabs (matrix->y0) > PIXMAN_MAX_INT)) + { + return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); + } + + /* Note: If we can't invert the transformation, skip the adjustment. */ + inv = *matrix; + if (cairo_matrix_invert (&inv) != CAIRO_STATUS_SUCCESS) + return CAIRO_STATUS_SUCCESS; + + /* find the pattern space coordinate that maps to (xc, yc) */ + max_iterations = 5; + do { + double x,y; + pixman_vector_t vector; + cairo_fixed_16_16_t dx, dy; + + vector.vector[0] = _cairo_fixed_16_16_from_double (xc); + vector.vector[1] = _cairo_fixed_16_16_from_double (yc); + vector.vector[2] = 1 << 16; + + /* If we can't transform the reference point, skip the adjustment. */ + if (! pixman_transform_point_3d (pixman_transform, &vector)) + return CAIRO_STATUS_SUCCESS; + + x = pixman_fixed_to_double (vector.vector[0]); + y = pixman_fixed_to_double (vector.vector[1]); + cairo_matrix_transform_point (&inv, &x, &y); + + /* Ideally, the vector should now be (xc, yc). + * We can now compensate for the resulting error. + */ + x -= xc; + y -= yc; + cairo_matrix_transform_distance (matrix, &x, &y); + dx = _cairo_fixed_16_16_from_double (x); + dy = _cairo_fixed_16_16_from_double (y); + pixman_transform->matrix[0][2] -= dx; + pixman_transform->matrix[1][2] -= dy; + + if (dx == 0 && dy == 0) + return CAIRO_STATUS_SUCCESS; + } while (--max_iterations); + + /* We didn't find an exact match between cairo and pixman, but + * the matrix should be mostly correct */ + return CAIRO_STATUS_SUCCESS; +} + +static inline double +_pixman_nearest_sample (double d) +{ + return ceil (d - .5); +} + +/** + * _cairo_matrix_is_pixman_translation: + * @matrix: a matrix + * @filter: the filter to be used on the pattern transformed by @matrix + * @x_offset: the translation in the X direction + * @y_offset: the translation in the Y direction + * + * Checks if @matrix translated by (x_offset, y_offset) can be + * represented using just an offset (within the range pixman can + * accept) and an identity matrix. + * + * Passing a non-zero value in x_offset/y_offset has the same effect + * as applying cairo_matrix_translate(matrix, x_offset, y_offset) and + * setting x_offset and y_offset to 0. + * + * Upon return x_offset and y_offset contain the translation vector if + * the return value is %TRUE. If the return value is %FALSE, they will + * not be modified. + * + * Return value: %TRUE if @matrix can be represented as a pixman + * translation, %FALSE otherwise. + **/ +cairo_bool_t +_cairo_matrix_is_pixman_translation (const cairo_matrix_t *matrix, + cairo_filter_t filter, + int *x_offset, + int *y_offset) +{ + double tx, ty; + + if (!_cairo_matrix_is_translation (matrix)) + return FALSE; + + if (matrix->x0 == 0. && matrix->y0 == 0.) + return TRUE; + + tx = matrix->x0 + *x_offset; + ty = matrix->y0 + *y_offset; + + if (filter == CAIRO_FILTER_FAST || filter == CAIRO_FILTER_NEAREST) { + tx = _pixman_nearest_sample (tx); + ty = _pixman_nearest_sample (ty); + } else if (tx != floor (tx) || ty != floor (ty)) { + return FALSE; + } + + if (fabs (tx) > PIXMAN_MAX_INT || fabs (ty) > PIXMAN_MAX_INT) + return FALSE; + + *x_offset = _cairo_lround (tx); + *y_offset = _cairo_lround (ty); + return TRUE; +} + +/** + * _cairo_matrix_to_pixman_matrix_offset: + * @matrix: a matrix + * @filter: the filter to be used on the pattern transformed by @matrix + * @xc: the X coordinate of the point to fix in pattern space + * @yc: the Y coordinate of the point to fix in pattern space + * @out_transform: the transformation which best approximates @matrix + * @x_offset: the translation in the X direction + * @y_offset: the translation in the Y direction + * + * This function tries to represent @matrix translated by (x_offset, + * y_offset) as a %pixman_transform_t and an translation. + * + * Passing a non-zero value in x_offset/y_offset has the same effect + * as applying cairo_matrix_translate(matrix, x_offset, y_offset) and + * setting x_offset and y_offset to 0. + * + * If it is possible to represent the matrix with an identity + * %pixman_transform_t and a translation within the valid range for + * pixman, this function will set @out_transform to be the identity, + * @x_offset and @y_offset to be the translation vector and will + * return %CAIRO_INT_STATUS_NOTHING_TO_DO. Otherwise it will try to + * evenly divide the translational component of @matrix between + * @out_transform and (@x_offset, @y_offset). + * + * Upon return x_offset and y_offset contain the translation vector. + * + * Return value: %CAIRO_INT_STATUS_NOTHING_TO_DO if the out_transform + * is the identity, %CAIRO_STATUS_INVALID_MATRIX if it was not + * possible to represent @matrix as a pixman_transform_t without + * overflows, %CAIRO_STATUS_SUCCESS otherwise. + **/ +cairo_status_t +_cairo_matrix_to_pixman_matrix_offset (const cairo_matrix_t *matrix, + cairo_filter_t filter, + double xc, + double yc, + pixman_transform_t *out_transform, + int *x_offset, + int *y_offset) +{ + cairo_bool_t is_pixman_translation; + + is_pixman_translation = _cairo_matrix_is_pixman_translation (matrix, + filter, + x_offset, + y_offset); + + if (is_pixman_translation) { + *out_transform = pixman_identity_transform; + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } else { + cairo_matrix_t m; + + m = *matrix; + cairo_matrix_translate (&m, *x_offset, *y_offset); + if (m.x0 != 0.0 || m.y0 != 0.0) { + double tx, ty, norm; + int i, j; + + /* pixman also limits the [xy]_offset to 16 bits so evenly + * spread the bits between the two. + * + * To do this, find the solutions of: + * |x| = |x*m.xx + y*m.xy + m.x0| + * |y| = |x*m.yx + y*m.yy + m.y0| + * + * and select the one whose maximum norm is smallest. + */ + tx = m.x0; + ty = m.y0; + norm = MAX (fabs (tx), fabs (ty)); + + for (i = -1; i < 2; i+=2) { + for (j = -1; j < 2; j+=2) { + double x, y, den, new_norm; + + den = (m.xx + i) * (m.yy + j) - m.xy * m.yx; + if (fabs (den) < DBL_EPSILON) + continue; + + x = m.y0 * m.xy - m.x0 * (m.yy + j); + y = m.x0 * m.yx - m.y0 * (m.xx + i); + + den = 1 / den; + x *= den; + y *= den; + + new_norm = MAX (fabs (x), fabs (y)); + if (norm > new_norm) { + norm = new_norm; + tx = x; + ty = y; + } + } + } + + tx = floor (tx); + ty = floor (ty); + *x_offset = -tx; + *y_offset = -ty; + cairo_matrix_translate (&m, tx, ty); + } else { + *x_offset = 0; + *y_offset = 0; + } + + return _cairo_matrix_to_pixman_matrix (&m, out_transform, xc, yc); + } +} diff --git a/src/cairo-mempool-private.h b/src/cairo-mempool-private.h new file mode 100644 index 000000000..a09f6ce51 --- /dev/null +++ b/src/cairo-mempool-private.h @@ -0,0 +1,85 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributors(s): + * Chris Wilson + */ + +#ifndef CAIRO_MEMPOOL_PRIVATE_H +#define CAIRO_MEMPOOL_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" + +#include /* for size_t */ + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_mempool cairo_mempool_t; + +struct _cairo_mempool { + char *base; + struct _cairo_memblock { + int bits; + cairo_list_t link; + } *blocks; + cairo_list_t free[32]; + unsigned char *map; + + unsigned int num_blocks; + int min_bits; /* Minimum block size is 1 << min_bits */ + int num_sizes; + int max_free_bits; + + size_t free_bytes; + size_t max_bytes; +}; + +cairo_private cairo_status_t +_cairo_mempool_init (cairo_mempool_t *pool, + void *base, + size_t bytes, + int min_bits, + int num_sizes); + +cairo_private void * +_cairo_mempool_alloc (cairo_mempool_t *pi, size_t bytes); + +cairo_private void +_cairo_mempool_free (cairo_mempool_t *pi, void *storage); + +cairo_private void +_cairo_mempool_fini (cairo_mempool_t *pool); + +CAIRO_END_DECLS + +#endif /* CAIRO_MEMPOOL_PRIVATE_H */ diff --git a/src/cairo-mempool.c b/src/cairo-mempool.c new file mode 100644 index 000000000..751ede320 --- /dev/null +++ b/src/cairo-mempool.c @@ -0,0 +1,369 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipoolent may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributors(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-mempool-private.h" +#include "cairo-list-inline.h" + +/* a simple buddy allocator for memory pools + * XXX fragmentation? use Doug Lea's malloc? + */ + +#define BITTEST(p, n) ((p)->map[(n) >> 3] & (128 >> ((n) & 7))) +#define BITSET(p, n) ((p)->map[(n) >> 3] |= (128 >> ((n) & 7))) +#define BITCLEAR(p, n) ((p)->map[(n) >> 3] &= ~(128 >> ((n) & 7))) + +static void +clear_bits (cairo_mempool_t *pool, size_t first, size_t last) +{ + size_t i, n = last; + size_t first_full = (first + 7) & ~7; + size_t past_full = last & ~7; + size_t bytes; + + if (n > first_full) + n = first_full; + for (i = first; i < n; i++) + BITCLEAR (pool, i); + + if (past_full > first_full) { + bytes = past_full - first_full; + bytes = bytes >> 3; + memset (pool->map + (first_full >> 3), 0, bytes); + } + + if (past_full < n) + past_full = n; + for (i = past_full; i < last; i++) + BITCLEAR (pool, i); +} + +static void +free_bits (cairo_mempool_t *pool, size_t start, int bits, cairo_bool_t clear) +{ + struct _cairo_memblock *block; + + if (clear) + clear_bits (pool, start, start + (1 << bits)); + + block = pool->blocks + start; + block->bits = bits; + + cairo_list_add (&block->link, &pool->free[bits]); + + pool->free_bytes += 1 << (bits + pool->min_bits); + if (bits > pool->max_free_bits) + pool->max_free_bits = bits; +} + +/* Add a chunk to the free list */ +static void +free_blocks (cairo_mempool_t *pool, + size_t first, + size_t last, + cairo_bool_t clear) +{ + size_t i, len; + int bits = 0; + + for (i = first, len = 1; i < last; i += len) { + /* To avoid cost quadratic in the number of different + * blocks produced from this chunk of store, we have to + * use the size of the previous block produced from this + * chunk as the starting point to work out the size of the + * next block we can produce. If you look at the binary + * representation of the starting points of the blocks + * produced, you can see that you first of all increase the + * size of the blocks produced up to some maximum as the + * address dealt with gets offsets added on which zap out + * low order bits, then decrease as the low order bits of the + * final block produced get added in. E.g. as you go from + * 001 to 0111 you generate blocks + * of size 001 at 001 taking you to 010 + * of size 010 at 010 taking you to 100 + * of size 010 at 100 taking you to 110 + * of size 001 at 110 taking you to 111 + * So the maximum total cost of the loops below this comment + * is one trip from the lowest blocksize to the highest and + * back again. + */ + while (bits < pool->num_sizes - 1) { + size_t next_bits = bits + 1; + size_t next_len = len << 1; + + if (i + next_bits > last) { + /* off end of chunk to be freed */ + break; + } + + if (i & (next_len - 1)) /* block would not be on boundary */ + break; + + bits = next_bits; + len = next_len; + } + + do { + if (i + len <= last && /* off end of chunk to be freed */ + (i & (len - 1)) == 0) /* block would not be on boundary */ + break; + + bits--; len >>=1; + } while (len); + + if (len == 0) + break; + + free_bits (pool, i, bits, clear); + } +} + +static struct _cairo_memblock * +get_buddy (cairo_mempool_t *pool, size_t offset, int bits) +{ + struct _cairo_memblock *block; + + if (offset + (1 << bits) >= pool->num_blocks) + return NULL; /* invalid */ + + if (BITTEST (pool, offset + (1 << bits) - 1)) + return NULL; /* buddy is allocated */ + + block = pool->blocks + offset; + if (block->bits != bits) + return NULL; /* buddy is partially allocated */ + + return block; +} + +static void +merge_buddies (cairo_mempool_t *pool, + struct _cairo_memblock *block, + int max_bits) +{ + size_t block_offset = block - pool->blocks; + int bits = block->bits; + + while (bits < max_bits - 1) { + /* while you can, merge two blocks and get a legal block size */ + size_t buddy_offset = block_offset ^ (1 << bits); + + block = get_buddy (pool, buddy_offset, bits); + if (block == NULL) + break; + + cairo_list_del (&block->link); + + /* Merged block starts at buddy */ + if (buddy_offset < block_offset) + block_offset = buddy_offset; + + bits++; + } + + block = pool->blocks + block_offset; + block->bits = bits; + cairo_list_add (&block->link, &pool->free[bits]); + + if (bits > pool->max_free_bits) + pool->max_free_bits = bits; +} + +/* attempt to merge all available buddies up to a particular size */ +static int +merge_bits (cairo_mempool_t *pool, int max_bits) +{ + struct _cairo_memblock *block, *buddy, *next; + int bits; + + for (bits = 0; bits < max_bits - 1; bits++) { + cairo_list_foreach_entry_safe (block, next, + struct _cairo_memblock, + &pool->free[bits], + link) + { + size_t buddy_offset = (block - pool->blocks) ^ (1 << bits); + + buddy = get_buddy (pool, buddy_offset, bits); + if (buddy == NULL) + continue; + + if (buddy == next) { + next = cairo_container_of (buddy->link.next, + struct _cairo_memblock, + link); + } + + cairo_list_del (&block->link); + merge_buddies (pool, block, max_bits); + } + } + + return pool->max_free_bits; +} + +/* find store for 1 << bits blocks */ +static void * +buddy_malloc (cairo_mempool_t *pool, int bits) +{ + size_t past, offset; + struct _cairo_memblock *block; + int b; + + if (bits > pool->max_free_bits && bits > merge_bits (pool, bits)) + return NULL; + + /* Find a list with blocks big enough on it */ + block = NULL; + for (b = bits; b <= pool->max_free_bits; b++) { + if (! cairo_list_is_empty (&pool->free[b])) { + block = cairo_list_first_entry (&pool->free[b], + struct _cairo_memblock, + link); + break; + } + } + assert (block != NULL); + + cairo_list_del (&block->link); + + while (cairo_list_is_empty (&pool->free[pool->max_free_bits])) { + if (--pool->max_free_bits == -1) + break; + } + + /* Mark end of allocated area */ + offset = block - pool->blocks; + past = offset + (1 << bits); + BITSET (pool, past - 1); + block->bits = bits; + + /* If we used a larger free block than we needed, free the rest */ + pool->free_bytes -= 1 << (b + pool->min_bits); + free_blocks (pool, past, offset + (1 << b), 0); + + return pool->base + ((block - pool->blocks) << pool->min_bits); +} + +cairo_status_t +_cairo_mempool_init (cairo_mempool_t *pool, + void *base, size_t bytes, + int min_bits, int num_sizes) +{ + unsigned long tmp; + int num_blocks; + int i; + + /* Align the start to an integral chunk */ + tmp = ((unsigned long) base) & ((1 << min_bits) - 1); + if (tmp) { + tmp = (1 << min_bits) - tmp; + base = (char *)base + tmp; + bytes -= tmp; + } + + assert ((((unsigned long) base) & ((1 << min_bits) - 1)) == 0); + assert (num_sizes < ARRAY_LENGTH (pool->free)); + + pool->base = base; + pool->free_bytes = 0; + pool->max_bytes = bytes; + pool->max_free_bits = -1; + + num_blocks = bytes >> min_bits; + pool->blocks = calloc (num_blocks, sizeof (struct _cairo_memblock)); + if (pool->blocks == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pool->num_blocks = num_blocks; + pool->min_bits = min_bits; + pool->num_sizes = num_sizes; + + for (i = 0; i < ARRAY_LENGTH (pool->free); i++) + cairo_list_init (&pool->free[i]); + + pool->map = malloc ((num_blocks + 7) >> 3); + if (pool->map == NULL) { + free (pool->blocks); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + memset (pool->map, -1, (num_blocks + 7) >> 3); + clear_bits (pool, 0, num_blocks); + + /* Now add all blocks to the free list */ + free_blocks (pool, 0, num_blocks, 1); + + return CAIRO_STATUS_SUCCESS; +} + +void * +_cairo_mempool_alloc (cairo_mempool_t *pool, size_t bytes) +{ + size_t size; + int bits; + + size = 1 << pool->min_bits; + for (bits = 0; size < bytes; bits++) + size <<= 1; + if (bits >= pool->num_sizes) + return NULL; + + return buddy_malloc (pool, bits); +} + +void +_cairo_mempool_free (cairo_mempool_t *pool, void *storage) +{ + size_t block_offset; + struct _cairo_memblock *block; + + block_offset = ((char *)storage - pool->base) >> pool->min_bits; + block = pool->blocks + block_offset; + + BITCLEAR (pool, block_offset + ((1 << block->bits) - 1)); + pool->free_bytes += 1 << (block->bits + pool->min_bits); + + merge_buddies (pool, block, pool->num_sizes); +} + +void +_cairo_mempool_fini (cairo_mempool_t *pool) +{ + free (pool->map); + free (pool->blocks); +} diff --git a/src/cairo-mesh-pattern-rasterizer.c b/src/cairo-mesh-pattern-rasterizer.c new file mode 100644 index 000000000..1b63ca8a6 --- /dev/null +++ b/src/cairo-mesh-pattern-rasterizer.c @@ -0,0 +1,941 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright 2009 Andrea Canciani + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Andrea Canciani. + * + * Contributor(s): + * Andrea Canciani + */ + +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-pattern-private.h" + +/* + * Rasterizer for mesh patterns. + * + * This implementation is based on techniques derived from several + * papers (available from ACM): + * + * - Lien, Shantz and Pratt "Adaptive Forward Differencing for + * Rendering Curves and Surfaces" (discussion of the AFD technique, + * bound of 1/sqrt(2) on step length without proof) + * + * - Popescu and Rosen, "Forward rasterization" (description of + * forward rasterization, proof of the previous bound) + * + * - Klassen, "Integer Forward Differencing of Cubic Polynomials: + * Analysis and Algorithms" + * + * - Klassen, "Exact Integer Hybrid Subdivision and Forward + * Differencing of Cubics" (improving the bound on the minimum + * number of steps) + * + * - Chang, Shantz and Rocchetti, "Rendering Cubic Curves and Surfaces + * with Integer Adaptive Forward Differencing" (analysis of forward + * differencing applied to Bezier patches) + * + * Notes: + * - Poor performance expected in degenerate cases + * + * - Patches mostly outside the drawing area are drawn completely (and + * clipped), wasting time + * + * - Both previous problems are greatly reduced by splitting until a + * reasonably small size and clipping the new tiles: execution time + * is quadratic in the convex-hull diameter instead than linear to + * the painted area. Splitting the tiles doesn't change the painted + * area but (usually) reduces the bounding box area (bbox area can + * remain the same after splitting, but cannot grow) + * + * - The initial implementation used adaptive forward differencing, + * but simple forward differencing scored better in benchmarks + * + * Idea: + * + * We do a sampling over the cubic patch with step du and dv (in the + * two parameters) that guarantees that any point of our sampling will + * be at most at 1/sqrt(2) from its adjacent points. In formulae + * (assuming B is the patch): + * + * |B(u,v) - B(u+du,v)| < 1/sqrt(2) + * |B(u,v) - B(u,v+dv)| < 1/sqrt(2) + * + * This means that every pixel covered by the patch will contain at + * least one of the samples, thus forward rasterization can be + * performed. Sketch of proof (from Popescu and Rosen): + * + * Let's take the P pixel we're interested into. If we assume it to be + * square, its boundaries define 9 regions on the plane: + * + * 1|2|3 + * -+-+- + * 8|P|4 + * -+-+- + * 7|6|5 + * + * Let's check that the pixel P will contain at least one point + * assuming that it is covered by the patch. + * + * Since the pixel is covered by the patch, its center will belong to + * (at least) one of the quads: + * + * {(B(u,v), B(u+du,v), B(u,v+dv), B(u+du,v+dv)) for u,v in [0,1]} + * + * If P doesn't contain any of the corners of the quad: + * + * - if one of the corners is in 1,3,5 or 7, other two of them have to + * be in 2,4,6 or 8, thus if the last corner is not in P, the length + * of one of the edges will be > 1/sqrt(2) + * + * - if none of the corners is in 1,3,5 or 7, all of them are in 2,4,6 + * and/or 8. If they are all in different regions, they can't + * satisfy the distance constraint. If two of them are in the same + * region (let's say 2), no point is in 6 and again it is impossible + * to have the center of P in the quad respecting the distance + * constraint (both these assertions can be checked by continuity + * considering the length of the edges of a quad with the vertices + * on the edges of P) + * + * Each of the cases led to a contradiction, so P contains at least + * one of the corners of the quad. + */ + +/* + * Make sure that errors are less than 1 in fixed point math if you + * change these values. + * + * The error is amplified by about steps^3/4 times. + * The rasterizer always uses a number of steps that is a power of 2. + * + * 256 is the maximum allowed number of steps (to have error < 1) + * using 8.24 for the differences. + */ +#define STEPS_MAX_V 256.0 +#define STEPS_MAX_U 256.0 + +/* + * If the patch/curve is only partially visible, split it to a finer + * resolution to get higher chances to clip (part of) it. + * + * These values have not been computed, but simply obtained + * empirically (by benchmarking some patches). They should never be + * greater than STEPS_MAX_V (or STEPS_MAX_U), but they can be as small + * as 1 (depending on how much you want to spend time in splitting the + * patch/curve when trying to save some rasterization time). + */ +#define STEPS_CLIP_V 64.0 +#define STEPS_CLIP_U 64.0 + + +/* Utils */ +static inline double +sqlen (cairo_point_double_t p0, cairo_point_double_t p1) +{ + cairo_point_double_t delta; + + delta.x = p0.x - p1.x; + delta.y = p0.y - p1.y; + + return delta.x * delta.x + delta.y * delta.y; +} + +static inline int16_t +_color_delta_to_shifted_short (int32_t from, int32_t to, int shift) +{ + int32_t delta = to - from; + + /* We need to round toward zero, because otherwise adding the + * delta 2^shift times can overflow */ + if (delta >= 0) + return delta >> shift; + else + return -((-delta) >> shift); +} + +/* + * Convert a number of steps to the equivalent shift. + * + * Input: the square of the minimum number of steps + * + * Output: the smallest integer x such that 2^x > steps + */ +static inline int +sqsteps2shift (double steps_sq) +{ + int r; + frexp (MAX (1.0, steps_sq), &r); + return (r + 1) >> 1; +} + +/* + * FD functions + * + * A Bezier curve is defined (with respect to a parameter t in + * [0,1]) from its nodes (x,y,z,w) like this: + * + * B(t) = x(1-t)^3 + 3yt(1-t)^2 + 3zt^2(1-t) + wt^3 + * + * To efficiently evaluate a Bezier curve, the rasterizer uses forward + * differences. Given x, y, z, w (the 4 nodes of the Bezier curve), it + * is possible to convert them to forward differences form and walk + * over the curve using fd_init (), fd_down () and fd_fwd (). + * + * f[0] is always the value of the Bezier curve for "current" t. + */ + +/* + * Initialize the coefficient for forward differences. + * + * Input: x,y,z,w are the 4 nodes of the Bezier curve + * + * Output: f[i] is the i-th difference of the curve + * + * f[0] is the value of the curve for t==0, i.e. f[0]==x. + * + * The initial step is 1; this means that each step increases t by 1 + * (so fd_init () immediately followed by fd_fwd (f) n times makes + * f[0] be the value of the curve for t==n). + */ +static inline void +fd_init (double x, double y, double z, double w, double f[4]) +{ + f[0] = x; + f[1] = w - x; + f[2] = 6. * (w - 2. * z + y); + f[3] = 6. * (w - 3. * z + 3. * y - x); +} + +/* + * Halve the step of the coefficients for forward differences. + * + * Input: f[i] is the i-th difference of the curve + * + * Output: f[i] is the i-th difference of the curve with half the + * original step + * + * f[0] is not affected, so the current t is not changed. + * + * The other coefficients are changed so that the step is half the + * original step. This means that doing fd_fwd (f) n times with the + * input f results in the same f[0] as doing fd_fwd (f) 2n times with + * the output f. + */ +static inline void +fd_down (double f[4]) +{ + f[3] *= 0.125; + f[2] = f[2] * 0.25 - f[3]; + f[1] = (f[1] - f[2]) * 0.5; +} + +/* + * Perform one step of forward differences along the curve. + * + * Input: f[i] is the i-th difference of the curve + * + * Output: f[i] is the i-th difference of the curve after one step + */ +static inline void +fd_fwd (double f[4]) +{ + f[0] += f[1]; + f[1] += f[2]; + f[2] += f[3]; +} + +/* + * Transform to integer forward differences. + * + * Input: d[n] is the n-th difference (in double precision) + * + * Output: i[n] is the n-th difference (in fixed point precision) + * + * i[0] is 9.23 fixed point, other differences are 4.28 fixed point. + */ +static inline void +fd_fixed (double d[4], int32_t i[4]) +{ + i[0] = _cairo_fixed_16_16_from_double (256 * 2 * d[0]); + i[1] = _cairo_fixed_16_16_from_double (256 * 16 * d[1]); + i[2] = _cairo_fixed_16_16_from_double (256 * 16 * d[2]); + i[3] = _cairo_fixed_16_16_from_double (256 * 16 * d[3]); +} + +/* + * Perform one step of integer forward differences along the curve. + * + * Input: f[n] is the n-th difference + * + * Output: f[n] is the n-th difference + * + * f[0] is 9.23 fixed point, other differences are 4.28 fixed point. + */ +static inline void +fd_fixed_fwd (int32_t f[4]) +{ + f[0] += (f[1] >> 5) + ((f[1] >> 4) & 1); + f[1] += f[2]; + f[2] += f[3]; +} + +/* + * Compute the minimum number of steps that guarantee that walking + * over a curve will leave no holes. + * + * Input: p[0..3] the nodes of the Bezier curve + * + * Returns: the square of the number of steps + * + * Idea: + * + * We want to make sure that at every step we move by less than + * 1/sqrt(2). + * + * The derivative of the cubic Bezier with nodes (p0, p1, p2, p3) is + * the quadratic Bezier with nodes (p1-p0, p2-p1, p3-p2) scaled by 3, + * so (since a Bezier curve is always bounded by its convex hull), we + * can say that: + * + * max(|B'(t)|) <= 3 max (|p1-p0|, |p2-p1|, |p3-p2|) + * + * We can improve this by noticing that a quadratic Bezier (a,b,c) is + * bounded by the quad (a,lerp(a,b,t),lerp(b,c,t),c) for any t, so + * (substituting the previous values, using t=0.5 and simplifying): + * + * max(|B'(t)|) <= 3 max (|p1-p0|, |p2-p0|/2, |p3-p1|/2, |p3-p2|) + * + * So, to guarantee a maximum step length of 1/sqrt(2) we must do: + * + * 3 max (|p1-p0|, |p2-p0|/2, |p3-p1|/2, |p3-p2|) sqrt(2) steps + */ +static inline double +bezier_steps_sq (cairo_point_double_t p[4]) +{ + double tmp = sqlen (p[0], p[1]); + tmp = MAX (tmp, sqlen (p[2], p[3])); + tmp = MAX (tmp, sqlen (p[0], p[2]) * .25); + tmp = MAX (tmp, sqlen (p[1], p[3]) * .25); + return 18.0 * tmp; +} + +/* + * Split a 1D Bezier cubic using de Casteljau's algorithm. + * + * Input: x,y,z,w the nodes of the Bezier curve + * + * Output: x0,y0,z0,w0 and x1,y1,z1,w1 are respectively the nodes of + * the first half and of the second half of the curve + * + * The output control nodes have to be distinct. + */ +static inline void +split_bezier_1D (double x, double y, double z, double w, + double *x0, double *y0, double *z0, double *w0, + double *x1, double *y1, double *z1, double *w1) +{ + double tmp; + + *x0 = x; + *w1 = w; + + tmp = 0.5 * (y + z); + *y0 = 0.5 * (x + y); + *z1 = 0.5 * (z + w); + + *z0 = 0.5 * (*y0 + tmp); + *y1 = 0.5 * (tmp + *z1); + + *w0 = *x1 = 0.5 * (*z0 + *y1); +} + +/* + * Split a Bezier curve using de Casteljau's algorithm. + * + * Input: p[0..3] the nodes of the Bezier curve + * + * Output: fst_half[0..3] and snd_half[0..3] are respectively the + * nodes of the first and of the second half of the curve + * + * fst_half and snd_half must be different, but they can be the same as + * nodes. + */ +static void +split_bezier (cairo_point_double_t p[4], + cairo_point_double_t fst_half[4], + cairo_point_double_t snd_half[4]) +{ + split_bezier_1D (p[0].x, p[1].x, p[2].x, p[3].x, + &fst_half[0].x, &fst_half[1].x, &fst_half[2].x, &fst_half[3].x, + &snd_half[0].x, &snd_half[1].x, &snd_half[2].x, &snd_half[3].x); + + split_bezier_1D (p[0].y, p[1].y, p[2].y, p[3].y, + &fst_half[0].y, &fst_half[1].y, &fst_half[2].y, &fst_half[3].y, + &snd_half[0].y, &snd_half[1].y, &snd_half[2].y, &snd_half[3].y); +} + + +typedef enum _intersection { + INSIDE = -1, /* the interval is entirely contained in the reference interval */ + OUTSIDE = 0, /* the interval has no intersection with the reference interval */ + PARTIAL = 1 /* the interval intersects the reference interval (but is not fully inside it) */ +} intersection_t; + +/* + * Check if an interval if inside another. + * + * Input: a,b are the extrema of the first interval + * c,d are the extrema of the second interval + * + * Returns: INSIDE iff [a,b) intersection [c,d) = [a,b) + * OUTSIDE iff [a,b) intersection [c,d) = {} + * PARTIAL otherwise + * + * The function assumes a < b and c < d + * + * Note: Bitwise-anding the results along each component gives the + * expected result for [a,b) x [A,B) intersection [c,d) x [C,D). + */ +static inline int +intersect_interval (double a, double b, double c, double d) +{ + if (c <= a && b <= d) + return INSIDE; + else if (a >= d || b <= c) + return OUTSIDE; + else + return PARTIAL; +} + +/* + * Set the color of a pixel. + * + * Input: data is the base pointer of the image + * width, height are the dimensions of the image + * stride is the stride in bytes between adjacent rows + * x, y are the coordinates of the pixel to be colored + * r,g,b,a are the color components of the color to be set + * + * Output: the (x,y) pixel in data has the (r,g,b,a) color + * + * The input color components are not premultiplied, but the data + * stored in the image is assumed to be in CAIRO_FORMAT_ARGB32 (8 bpc, + * premultiplied). + * + * If the pixel to be set is outside the image, this function does + * nothing. + */ +static inline void +draw_pixel (unsigned char *data, int width, int height, int stride, + int x, int y, uint16_t r, uint16_t g, uint16_t b, uint16_t a) +{ + if (likely (0 <= x && 0 <= y && x < width && y < height)) { + uint32_t tr, tg, tb, ta; + + /* Premultiply and round */ + ta = a; + tr = r * ta + 0x8000; + tg = g * ta + 0x8000; + tb = b * ta + 0x8000; + + tr += tr >> 16; + tg += tg >> 16; + tb += tb >> 16; + + *((uint32_t*) (data + y*stride + 4*x)) = ((ta << 16) & 0xff000000) | + ((tr >> 8) & 0xff0000) | ((tg >> 16) & 0xff00) | (tb >> 24); + } +} + +/* + * Forward-rasterize a cubic curve using forward differences. + * + * Input: data is the base pointer of the image + * width, height are the dimensions of the image + * stride is the stride in bytes between adjacent rows + * ushift is log2(n) if n is the number of desired steps + * dxu[i], dyu[i] are the x,y forward differences of the curve + * r0,g0,b0,a0 are the color components of the start point + * r3,g3,b3,a3 are the color components of the end point + * + * Output: data will be changed to have the requested curve drawn in + * the specified colors + * + * The input color components are not premultiplied, but the data + * stored in the image is assumed to be in CAIRO_FORMAT_ARGB32 (8 bpc, + * premultiplied). + * + * The function draws n+1 pixels, that is from the point at step 0 to + * the point at step n, both included. This is the discrete equivalent + * to drawing the curve for values of the interpolation parameter in + * [0,1] (including both extremes). + */ +static inline void +rasterize_bezier_curve (unsigned char *data, int width, int height, int stride, + int ushift, double dxu[4], double dyu[4], + uint16_t r0, uint16_t g0, uint16_t b0, uint16_t a0, + uint16_t r3, uint16_t g3, uint16_t b3, uint16_t a3) +{ + int32_t xu[4], yu[4]; + int x0, y0, u, usteps = 1 << ushift; + + uint16_t r = r0, g = g0, b = b0, a = a0; + int16_t dr = _color_delta_to_shifted_short (r0, r3, ushift); + int16_t dg = _color_delta_to_shifted_short (g0, g3, ushift); + int16_t db = _color_delta_to_shifted_short (b0, b3, ushift); + int16_t da = _color_delta_to_shifted_short (a0, a3, ushift); + + fd_fixed (dxu, xu); + fd_fixed (dyu, yu); + + /* + * Use (dxu[0],dyu[0]) as origin for the forward differences. + * + * This makes it possible to handle much larger coordinates (the + * ones that can be represented as cairo_fixed_t) + */ + x0 = _cairo_fixed_from_double (dxu[0]); + y0 = _cairo_fixed_from_double (dyu[0]); + xu[0] = 0; + yu[0] = 0; + + for (u = 0; u <= usteps; ++u) { + /* + * This rasterizer assumes that pixels are integer aligned + * squares, so a generic (x,y) point belongs to the pixel with + * top-left coordinates (floor(x), floor(y)) + */ + + int x = _cairo_fixed_integer_floor (x0 + (xu[0] >> 15) + ((xu[0] >> 14) & 1)); + int y = _cairo_fixed_integer_floor (y0 + (yu[0] >> 15) + ((yu[0] >> 14) & 1)); + + draw_pixel (data, width, height, stride, x, y, r, g, b, a); + + fd_fixed_fwd (xu); + fd_fixed_fwd (yu); + r += dr; + g += dg; + b += db; + a += da; + } +} + +/* + * Clip, split and rasterize a Bezier curve. + * + * Input: data is the base pointer of the image + * width, height are the dimensions of the image + * stride is the stride in bytes between adjacent rows + * p[i] is the i-th node of the Bezier curve + * c0[i] is the i-th color component at the start point + * c3[i] is the i-th color component at the end point + * + * Output: data will be changed to have the requested curve drawn in + * the specified colors + * + * The input color components are not premultiplied, but the data + * stored in the image is assumed to be in CAIRO_FORMAT_ARGB32 (8 bpc, + * premultiplied). + * + * The color components are red, green, blue and alpha, in this order. + * + * The function guarantees that it will draw the curve with a step + * small enough to never have a distance above 1/sqrt(2) between two + * consecutive points (which is needed to ensure that no hole can + * appear when using this function to rasterize a patch). + */ +static void +draw_bezier_curve (unsigned char *data, int width, int height, int stride, + cairo_point_double_t p[4], double c0[4], double c3[4]) +{ + double top, bottom, left, right, steps_sq; + int i, v; + + top = bottom = p[0].y; + for (i = 1; i < 4; ++i) { + top = MIN (top, p[i].y); + bottom = MAX (bottom, p[i].y); + } + + /* Check visibility */ + v = intersect_interval (top, bottom, 0, height); + if (v == OUTSIDE) + return; + + left = right = p[0].x; + for (i = 1; i < 4; ++i) { + left = MIN (left, p[i].x); + right = MAX (right, p[i].x); + } + + v &= intersect_interval (left, right, 0, width); + if (v == OUTSIDE) + return; + + steps_sq = bezier_steps_sq (p); + if (steps_sq >= (v == INSIDE ? STEPS_MAX_U * STEPS_MAX_U : STEPS_CLIP_U * STEPS_CLIP_U)) { + /* + * The number of steps is greater than the threshold. This + * means that either the error would become too big if we + * directly rasterized it or that we can probably save some + * time by splitting the curve and clipping part of it + */ + cairo_point_double_t first[4], second[4]; + double midc[4]; + split_bezier (p, first, second); + midc[0] = (c0[0] + c3[0]) * 0.5; + midc[1] = (c0[1] + c3[1]) * 0.5; + midc[2] = (c0[2] + c3[2]) * 0.5; + midc[3] = (c0[3] + c3[3]) * 0.5; + draw_bezier_curve (data, width, height, stride, first, c0, midc); + draw_bezier_curve (data, width, height, stride, second, midc, c3); + } else { + double xu[4], yu[4]; + int ushift = sqsteps2shift (steps_sq), k; + + fd_init (p[0].x, p[1].x, p[2].x, p[3].x, xu); + fd_init (p[0].y, p[1].y, p[2].y, p[3].y, yu); + + for (k = 0; k < ushift; ++k) { + fd_down (xu); + fd_down (yu); + } + + rasterize_bezier_curve (data, width, height, stride, ushift, + xu, yu, + _cairo_color_double_to_short (c0[0]), + _cairo_color_double_to_short (c0[1]), + _cairo_color_double_to_short (c0[2]), + _cairo_color_double_to_short (c0[3]), + _cairo_color_double_to_short (c3[0]), + _cairo_color_double_to_short (c3[1]), + _cairo_color_double_to_short (c3[2]), + _cairo_color_double_to_short (c3[3])); + + /* Draw the end point, to make sure that we didn't leave it + * out because of rounding */ + draw_pixel (data, width, height, stride, + _cairo_fixed_integer_floor (_cairo_fixed_from_double (p[3].x)), + _cairo_fixed_integer_floor (_cairo_fixed_from_double (p[3].y)), + _cairo_color_double_to_short (c3[0]), + _cairo_color_double_to_short (c3[1]), + _cairo_color_double_to_short (c3[2]), + _cairo_color_double_to_short (c3[3])); + } +} + +/* + * Forward-rasterize a cubic Bezier patch using forward differences. + * + * Input: data is the base pointer of the image + * width, height are the dimensions of the image + * stride is the stride in bytes between adjacent rows + * vshift is log2(n) if n is the number of desired steps + * p[i][j], p[i][j] are the the nodes of the Bezier patch + * col[i][j] is the j-th color component of the i-th corner + * + * Output: data will be changed to have the requested patch drawn in + * the specified colors + * + * The nodes of the patch are as follows: + * + * u\v 0 - > 1 + * 0 p00 p01 p02 p03 + * | p10 p11 p12 p13 + * v p20 p21 p22 p23 + * 1 p30 p31 p32 p33 + * + * i.e. u varies along the first component (rows), v varies along the + * second one (columns). + * + * The color components are red, green, blue and alpha, in this order. + * c[0..3] are the colors in p00, p30, p03, p33 respectively + * + * The input color components are not premultiplied, but the data + * stored in the image is assumed to be in CAIRO_FORMAT_ARGB32 (8 bpc, + * premultiplied). + * + * If the patch folds over itself, the part with the highest v + * parameter is considered above. If both have the same v, the one + * with the highest u parameter is above. + * + * The function draws n+1 curves, that is from the curve at step 0 to + * the curve at step n, both included. This is the discrete equivalent + * to drawing the patch for values of the interpolation parameter in + * [0,1] (including both extremes). + */ +static inline void +rasterize_bezier_patch (unsigned char *data, int width, int height, int stride, int vshift, + cairo_point_double_t p[4][4], double col[4][4]) +{ + double pv[4][2][4], cstart[4], cend[4], dcstart[4], dcend[4]; + int v, i, k; + + v = 1 << vshift; + + /* + * pv[i][0] is the function (represented using forward + * differences) mapping v to the x coordinate of the i-th node of + * the Bezier curve with parameter u. + * (Likewise p[i][0] gives the y coordinate). + * + * This means that (pv[0][0][0],pv[0][1][0]), + * (pv[1][0][0],pv[1][1][0]), (pv[2][0][0],pv[2][1][0]) and + * (pv[3][0][0],pv[3][1][0]) are the nodes of the Bezier curve for + * the "current" v value (see the FD comments for more details). + */ + for (i = 0; i < 4; ++i) { + fd_init (p[i][0].x, p[i][1].x, p[i][2].x, p[i][3].x, pv[i][0]); + fd_init (p[i][0].y, p[i][1].y, p[i][2].y, p[i][3].y, pv[i][1]); + for (k = 0; k < vshift; ++k) { + fd_down (pv[i][0]); + fd_down (pv[i][1]); + } + } + + for (i = 0; i < 4; ++i) { + cstart[i] = col[0][i]; + cend[i] = col[1][i]; + dcstart[i] = (col[2][i] - col[0][i]) / v; + dcend[i] = (col[3][i] - col[1][i]) / v; + } + + v++; + while (v--) { + cairo_point_double_t nodes[4]; + for (i = 0; i < 4; ++i) { + nodes[i].x = pv[i][0][0]; + nodes[i].y = pv[i][1][0]; + } + + draw_bezier_curve (data, width, height, stride, nodes, cstart, cend); + + for (i = 0; i < 4; ++i) { + fd_fwd (pv[i][0]); + fd_fwd (pv[i][1]); + cstart[i] += dcstart[i]; + cend[i] += dcend[i]; + } + } +} + +/* + * Clip, split and rasterize a Bezier cubic patch. + * + * Input: data is the base pointer of the image + * width, height are the dimensions of the image + * stride is the stride in bytes between adjacent rows + * p[i][j], p[i][j] are the nodes of the patch + * col[i][j] is the j-th color component of the i-th corner + * + * Output: data will be changed to have the requested patch drawn in + * the specified colors + * + * The nodes of the patch are as follows: + * + * u\v 0 - > 1 + * 0 p00 p01 p02 p03 + * | p10 p11 p12 p13 + * v p20 p21 p22 p23 + * 1 p30 p31 p32 p33 + * + * i.e. u varies along the first component (rows), v varies along the + * second one (columns). + * + * The color components are red, green, blue and alpha, in this order. + * c[0..3] are the colors in p00, p30, p03, p33 respectively + * + * The input color components are not premultiplied, but the data + * stored in the image is assumed to be in CAIRO_FORMAT_ARGB32 (8 bpc, + * premultiplied). + * + * If the patch folds over itself, the part with the highest v + * parameter is considered above. If both have the same v, the one + * with the highest u parameter is above. + * + * The function guarantees that it will draw the patch with a step + * small enough to never have a distance above 1/sqrt(2) between two + * adjacent points (which guarantees that no hole can appear). + * + * This function can be used to rasterize a tile of PDF type 7 + * shadings (see http://www.adobe.com/devnet/pdf/pdf_reference.html). + */ +static void +draw_bezier_patch (unsigned char *data, int width, int height, int stride, + cairo_point_double_t p[4][4], double c[4][4]) +{ + double top, bottom, left, right, steps_sq; + int i, j, v; + + top = bottom = p[0][0].y; + for (i = 0; i < 4; ++i) { + for (j= 0; j < 4; ++j) { + top = MIN (top, p[i][j].y); + bottom = MAX (bottom, p[i][j].y); + } + } + + v = intersect_interval (top, bottom, 0, height); + if (v == OUTSIDE) + return; + + left = right = p[0][0].x; + for (i = 0; i < 4; ++i) { + for (j= 0; j < 4; ++j) { + left = MIN (left, p[i][j].x); + right = MAX (right, p[i][j].x); + } + } + + v &= intersect_interval (left, right, 0, width); + if (v == OUTSIDE) + return; + + steps_sq = 0; + for (i = 0; i < 4; ++i) + steps_sq = MAX (steps_sq, bezier_steps_sq (p[i])); + + if (steps_sq >= (v == INSIDE ? STEPS_MAX_V * STEPS_MAX_V : STEPS_CLIP_V * STEPS_CLIP_V)) { + /* The number of steps is greater than the threshold. This + * means that either the error would become too big if we + * directly rasterized it or that we can probably save some + * time by splitting the curve and clipping part of it. The + * patch is only split in the v direction to guarantee that + * rasterizing each part will overwrite parts with low v with + * overlapping parts with higher v. */ + + cairo_point_double_t first[4][4], second[4][4]; + double subc[4][4]; + + for (i = 0; i < 4; ++i) + split_bezier (p[i], first[i], second[i]); + + for (i = 0; i < 4; ++i) { + subc[0][i] = c[0][i]; + subc[1][i] = c[1][i]; + subc[2][i] = 0.5 * (c[0][i] + c[2][i]); + subc[3][i] = 0.5 * (c[1][i] + c[3][i]); + } + + draw_bezier_patch (data, width, height, stride, first, subc); + + for (i = 0; i < 4; ++i) { + subc[0][i] = subc[2][i]; + subc[1][i] = subc[3][i]; + subc[2][i] = c[2][i]; + subc[3][i] = c[3][i]; + } + draw_bezier_patch (data, width, height, stride, second, subc); + } else { + rasterize_bezier_patch (data, width, height, stride, sqsteps2shift (steps_sq), p, c); + } +} + +/* + * Draw a tensor product shading pattern. + * + * Input: mesh is the mesh pattern + * data is the base pointer of the image + * width, height are the dimensions of the image + * stride is the stride in bytes between adjacent rows + * + * Output: data will be changed to have the pattern drawn on it + * + * data is assumed to be clear and its content is assumed to be in + * CAIRO_FORMAT_ARGB32 (8 bpc, premultiplied). + * + * This function can be used to rasterize a PDF type 7 shading (see + * http://www.adobe.com/devnet/pdf/pdf_reference.html). + */ +void +_cairo_mesh_pattern_rasterize (const cairo_mesh_pattern_t *mesh, + void *data, + int width, + int height, + int stride, + double x_offset, + double y_offset) +{ + cairo_point_double_t nodes[4][4]; + double colors[4][4]; + cairo_matrix_t p2u; + unsigned int i, j, k, n; + cairo_status_t status; + const cairo_mesh_patch_t *patch; + const cairo_color_t *c; + + assert (mesh->base.status == CAIRO_STATUS_SUCCESS); + assert (mesh->current_patch == NULL); + + p2u = mesh->base.matrix; + status = cairo_matrix_invert (&p2u); + assert (status == CAIRO_STATUS_SUCCESS); + + n = _cairo_array_num_elements (&mesh->patches); + patch = _cairo_array_index_const (&mesh->patches, 0); + for (i = 0; i < n; i++) { + for (j = 0; j < 4; j++) { + for (k = 0; k < 4; k++) { + nodes[j][k] = patch->points[j][k]; + cairo_matrix_transform_point (&p2u, &nodes[j][k].x, &nodes[j][k].y); + nodes[j][k].x += x_offset; + nodes[j][k].y += y_offset; + } + } + + c = &patch->colors[0]; + colors[0][0] = c->red; + colors[0][1] = c->green; + colors[0][2] = c->blue; + colors[0][3] = c->alpha; + + c = &patch->colors[3]; + colors[1][0] = c->red; + colors[1][1] = c->green; + colors[1][2] = c->blue; + colors[1][3] = c->alpha; + + c = &patch->colors[1]; + colors[2][0] = c->red; + colors[2][1] = c->green; + colors[2][2] = c->blue; + colors[2][3] = c->alpha; + + c = &patch->colors[2]; + colors[3][0] = c->red; + colors[3][1] = c->green; + colors[3][2] = c->blue; + colors[3][3] = c->alpha; + + draw_bezier_patch (data, width, height, stride, nodes, colors); + patch++; + } +} diff --git a/src/cairo-misc.c b/src/cairo-misc.c new file mode 100644 index 000000000..df8a4efc9 --- /dev/null +++ b/src/cairo-misc.c @@ -0,0 +1,955 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2007 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Adrian Johnson + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +COMPILE_TIME_ASSERT ((int)CAIRO_STATUS_LAST_STATUS < (int)CAIRO_INT_STATUS_UNSUPPORTED); +COMPILE_TIME_ASSERT (CAIRO_INT_STATUS_LAST_STATUS <= 127); + +/** + * SECTION:cairo-status + * @Title: Error handling + * @Short_Description: Decoding cairo's status + * @See_Also: cairo_status(), cairo_surface_status(), cairo_pattern_status(), + * cairo_font_face_status(), cairo_scaled_font_status(), + * cairo_region_status() + * + * Cairo uses a single status type to represent all kinds of errors. A status + * value of %CAIRO_STATUS_SUCCESS represents no error and has an integer value + * of zero. All other status values represent an error. + * + * Cairo's error handling is designed to be easy to use and safe. All major + * cairo objects retain an error status internally which + * can be queried anytime by the users using cairo*_status() calls. In + * the mean time, it is safe to call all cairo functions normally even if the + * underlying object is in an error status. This means that no error handling + * code is required before or after each individual cairo function call. + **/ + +/* Public stuff */ + +/** + * cairo_status_to_string: + * @status: a cairo status + * + * Provides a human-readable description of a #cairo_status_t. + * + * Returns: a string representation of the status + * + * Since: 1.0 + **/ +const char * +cairo_status_to_string (cairo_status_t status) +{ + switch (status) { + case CAIRO_STATUS_SUCCESS: + return "no error has occurred"; + case CAIRO_STATUS_NO_MEMORY: + return "out of memory"; + case CAIRO_STATUS_INVALID_RESTORE: + return "cairo_restore() without matching cairo_save()"; + case CAIRO_STATUS_INVALID_POP_GROUP: + return "no saved group to pop, i.e. cairo_pop_group() without matching cairo_push_group()"; + case CAIRO_STATUS_NO_CURRENT_POINT: + return "no current point defined"; + case CAIRO_STATUS_INVALID_MATRIX: + return "invalid matrix (not invertible)"; + case CAIRO_STATUS_INVALID_STATUS: + return "invalid value for an input cairo_status_t"; + case CAIRO_STATUS_NULL_POINTER: + return "NULL pointer"; + case CAIRO_STATUS_INVALID_STRING: + return "input string not valid UTF-8"; + case CAIRO_STATUS_INVALID_PATH_DATA: + return "input path data not valid"; + case CAIRO_STATUS_READ_ERROR: + return "error while reading from input stream"; + case CAIRO_STATUS_WRITE_ERROR: + return "error while writing to output stream"; + case CAIRO_STATUS_SURFACE_FINISHED: + return "the target surface has been finished"; + case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: + return "the surface type is not appropriate for the operation"; + case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: + return "the pattern type is not appropriate for the operation"; + case CAIRO_STATUS_INVALID_CONTENT: + return "invalid value for an input cairo_content_t"; + case CAIRO_STATUS_INVALID_FORMAT: + return "invalid value for an input cairo_format_t"; + case CAIRO_STATUS_INVALID_VISUAL: + return "invalid value for an input Visual*"; + case CAIRO_STATUS_FILE_NOT_FOUND: + return "file not found"; + case CAIRO_STATUS_INVALID_DASH: + return "invalid value for a dash setting"; + case CAIRO_STATUS_INVALID_DSC_COMMENT: + return "invalid value for a DSC comment"; + case CAIRO_STATUS_INVALID_INDEX: + return "invalid index passed to getter"; + case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: + return "clip region not representable in desired format"; + case CAIRO_STATUS_TEMP_FILE_ERROR: + return "error creating or writing to a temporary file"; + case CAIRO_STATUS_INVALID_STRIDE: + return "invalid value for stride"; + case CAIRO_STATUS_FONT_TYPE_MISMATCH: + return "the font type is not appropriate for the operation"; + case CAIRO_STATUS_USER_FONT_IMMUTABLE: + return "the user-font is immutable"; + case CAIRO_STATUS_USER_FONT_ERROR: + return "error occurred in a user-font callback function"; + case CAIRO_STATUS_NEGATIVE_COUNT: + return "negative number used where it is not allowed"; + case CAIRO_STATUS_INVALID_CLUSTERS: + return "input clusters do not represent the accompanying text and glyph arrays"; + case CAIRO_STATUS_INVALID_SLANT: + return "invalid value for an input cairo_font_slant_t"; + case CAIRO_STATUS_INVALID_WEIGHT: + return "invalid value for an input cairo_font_weight_t"; + case CAIRO_STATUS_INVALID_SIZE: + return "invalid value (typically too big) for the size of the input (surface, pattern, etc.)"; + case CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: + return "user-font method not implemented"; + case CAIRO_STATUS_DEVICE_TYPE_MISMATCH: + return "the device type is not appropriate for the operation"; + case CAIRO_STATUS_DEVICE_ERROR: + return "an operation to the device caused an unspecified error"; + case CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: + return "invalid operation during mesh pattern construction"; + case CAIRO_STATUS_DEVICE_FINISHED: + return "the target device has been finished"; + case CAIRO_STATUS_JBIG2_GLOBAL_MISSING: + return "CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID used but no CAIRO_MIME_TYPE_JBIG2_GLOBAL data provided"; + default: + case CAIRO_STATUS_LAST_STATUS: + return ""; + } +} + + +/** + * cairo_glyph_allocate: + * @num_glyphs: number of glyphs to allocate + * + * Allocates an array of #cairo_glyph_t's. + * This function is only useful in implementations of + * #cairo_user_scaled_font_text_to_glyphs_func_t where the user + * needs to allocate an array of glyphs that cairo will free. + * For all other uses, user can use their own allocation method + * for glyphs. + * + * This function returns %NULL if @num_glyphs is not positive, + * or if out of memory. That means, the %NULL return value + * signals out-of-memory only if @num_glyphs was positive. + * + * Returns: the newly allocated array of glyphs that should be + * freed using cairo_glyph_free() + * + * Since: 1.8 + **/ +cairo_glyph_t * +cairo_glyph_allocate (int num_glyphs) +{ + if (num_glyphs <= 0) + return NULL; + + return _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); +} +slim_hidden_def (cairo_glyph_allocate); + +/** + * cairo_glyph_free: + * @glyphs: array of glyphs to free, or %NULL + * + * Frees an array of #cairo_glyph_t's allocated using cairo_glyph_allocate(). + * This function is only useful to free glyph array returned + * by cairo_scaled_font_text_to_glyphs() where cairo returns + * an array of glyphs that the user will free. + * For all other uses, user can use their own allocation method + * for glyphs. + * + * Since: 1.8 + **/ +void +cairo_glyph_free (cairo_glyph_t *glyphs) +{ + free (glyphs); +} +slim_hidden_def (cairo_glyph_free); + +/** + * cairo_text_cluster_allocate: + * @num_clusters: number of text_clusters to allocate + * + * Allocates an array of #cairo_text_cluster_t's. + * This function is only useful in implementations of + * #cairo_user_scaled_font_text_to_glyphs_func_t where the user + * needs to allocate an array of text clusters that cairo will free. + * For all other uses, user can use their own allocation method + * for text clusters. + * + * This function returns %NULL if @num_clusters is not positive, + * or if out of memory. That means, the %NULL return value + * signals out-of-memory only if @num_clusters was positive. + * + * Returns: the newly allocated array of text clusters that should be + * freed using cairo_text_cluster_free() + * + * Since: 1.8 + **/ +cairo_text_cluster_t * +cairo_text_cluster_allocate (int num_clusters) +{ + if (num_clusters <= 0) + return NULL; + + return _cairo_malloc_ab (num_clusters, sizeof (cairo_text_cluster_t)); +} +slim_hidden_def (cairo_text_cluster_allocate); + +/** + * cairo_text_cluster_free: + * @clusters: array of text clusters to free, or %NULL + * + * Frees an array of #cairo_text_cluster's allocated using cairo_text_cluster_allocate(). + * This function is only useful to free text cluster array returned + * by cairo_scaled_font_text_to_glyphs() where cairo returns + * an array of text clusters that the user will free. + * For all other uses, user can use their own allocation method + * for text clusters. + * + * Since: 1.8 + **/ +void +cairo_text_cluster_free (cairo_text_cluster_t *clusters) +{ + free (clusters); +} +slim_hidden_def (cairo_text_cluster_free); + + +/* Private stuff */ + +/** + * _cairo_validate_text_clusters: + * @utf8: UTF-8 text + * @utf8_len: length of @utf8 in bytes + * @glyphs: array of glyphs + * @num_glyphs: number of glyphs + * @clusters: array of cluster mapping information + * @num_clusters: number of clusters in the mapping + * @cluster_flags: cluster flags + * + * Check that clusters cover the entire glyphs and utf8 arrays, + * and that cluster boundaries are UTF-8 boundaries. + * + * Return value: %CAIRO_STATUS_SUCCESS upon success, or + * %CAIRO_STATUS_INVALID_CLUSTERS on error. + * The error is either invalid UTF-8 input, + * or bad cluster mapping. + **/ +cairo_status_t +_cairo_validate_text_clusters (const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags) +{ + cairo_status_t status; + unsigned int n_bytes = 0; + unsigned int n_glyphs = 0; + int i; + + for (i = 0; i < num_clusters; i++) { + int cluster_bytes = clusters[i].num_bytes; + int cluster_glyphs = clusters[i].num_glyphs; + + if (cluster_bytes < 0 || cluster_glyphs < 0) + goto BAD; + + /* A cluster should cover at least one character or glyph. + * I can't see any use for a 0,0 cluster. + * I can't see an immediate use for a zero-text cluster + * right now either, but they don't harm. + * Zero-glyph clusters on the other hand are useful for + * things like U+200C ZERO WIDTH NON-JOINER */ + if (cluster_bytes == 0 && cluster_glyphs == 0) + goto BAD; + + /* Since n_bytes and n_glyphs are unsigned, but the rest of + * values involved are signed, we can detect overflow easily */ + if (n_bytes+cluster_bytes > (unsigned int)utf8_len || n_glyphs+cluster_glyphs > (unsigned int)num_glyphs) + goto BAD; + + /* Make sure we've got valid UTF-8 for the cluster */ + status = _cairo_utf8_to_ucs4 (utf8+n_bytes, cluster_bytes, NULL, NULL); + if (unlikely (status)) + return _cairo_error (CAIRO_STATUS_INVALID_CLUSTERS); + + n_bytes += cluster_bytes ; + n_glyphs += cluster_glyphs; + } + + if (n_bytes != (unsigned int) utf8_len || n_glyphs != (unsigned int) num_glyphs) { + BAD: + return _cairo_error (CAIRO_STATUS_INVALID_CLUSTERS); + } + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_operator_bounded_by_mask: + * @op: a #cairo_operator_t + * + * A bounded operator is one where mask pixel + * of zero results in no effect on the destination image. + * + * Unbounded operators often require special handling; if you, for + * example, draw trapezoids with an unbounded operator, the effect + * extends past the bounding box of the trapezoids. + * + * Return value: %TRUE if the operator is bounded by the mask operand + **/ +cairo_bool_t +_cairo_operator_bounded_by_mask (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_ATOP: + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return TRUE; + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_ATOP: + return FALSE; + } + + ASSERT_NOT_REACHED; + return FALSE; +} + +/** + * _cairo_operator_bounded_by_source: + * @op: a #cairo_operator_t + * + * A bounded operator is one where source pixels of zero + * (in all four components, r, g, b and a) effect no change + * in the resulting destination image. + * + * Unbounded operators often require special handling; if you, for + * example, copy a surface with the SOURCE operator, the effect + * extends past the bounding box of the source surface. + * + * Return value: %TRUE if the operator is bounded by the source operand + **/ +cairo_bool_t +_cairo_operator_bounded_by_source (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_ATOP: + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return TRUE; + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_ATOP: + return FALSE; + } + + ASSERT_NOT_REACHED; + return FALSE; +} + +uint32_t +_cairo_operator_bounded_by_either (cairo_operator_t op) +{ + switch (op) { + default: + ASSERT_NOT_REACHED; + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_ATOP: + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return CAIRO_OPERATOR_BOUND_BY_MASK | CAIRO_OPERATOR_BOUND_BY_SOURCE; + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + return CAIRO_OPERATOR_BOUND_BY_MASK; + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_ATOP: + return 0; + } + +} + +#if DISABLE_SOME_FLOATING_POINT +/* This function is identical to the C99 function lround(), except that it + * performs arithmetic rounding (floor(d + .5) instead of away-from-zero rounding) and + * has a valid input range of (INT_MIN, INT_MAX] instead of + * [INT_MIN, INT_MAX]. It is much faster on both x86 and FPU-less systems + * than other commonly used methods for rounding (lround, round, rint, lrint + * or float (d + 0.5)). + * + * The reason why this function is much faster on x86 than other + * methods is due to the fact that it avoids the fldcw instruction. + * This instruction incurs a large performance penalty on modern Intel + * processors due to how it prevents efficient instruction pipelining. + * + * The reason why this function is much faster on FPU-less systems is for + * an entirely different reason. All common rounding methods involve multiple + * floating-point operations. Each one of these operations has to be + * emulated in software, which adds up to be a large performance penalty. + * This function doesn't perform any floating-point calculations, and thus + * avoids this penalty. + */ +int +_cairo_lround (double d) +{ + uint32_t top, shift_amount, output; + union { + double d; + uint64_t ui64; + uint32_t ui32[2]; + } u; + + u.d = d; + + /* If the integer word order doesn't match the float word order, we swap + * the words of the input double. This is needed because we will be + * treating the whole double as a 64-bit unsigned integer. Notice that we + * use WORDS_BIGENDIAN to detect the integer word order, which isn't + * exactly correct because WORDS_BIGENDIAN refers to byte order, not word + * order. Thus, we are making the assumption that the byte order is the + * same as the integer word order which, on the modern machines that we + * care about, is OK. + */ +#if ( defined(FLOAT_WORDS_BIGENDIAN) && !defined(WORDS_BIGENDIAN)) || \ + (!defined(FLOAT_WORDS_BIGENDIAN) && defined(WORDS_BIGENDIAN)) + { + uint32_t temp = u.ui32[0]; + u.ui32[0] = u.ui32[1]; + u.ui32[1] = temp; + } +#endif + +#ifdef WORDS_BIGENDIAN + #define MSW (0) /* Most Significant Word */ + #define LSW (1) /* Least Significant Word */ +#else + #define MSW (1) + #define LSW (0) +#endif + + /* By shifting the most significant word of the input double to the + * right 20 places, we get the very "top" of the double where the exponent + * and sign bit lie. + */ + top = u.ui32[MSW] >> 20; + + /* Here, we calculate how much we have to shift the mantissa to normalize + * it to an integer value. We extract the exponent "top" by masking out the + * sign bit, then we calculate the shift amount by subtracting the exponent + * from the bias. Notice that the correct bias for 64-bit doubles is + * actually 1075, but we use 1053 instead for two reasons: + * + * 1) To perform rounding later on, we will first need the target + * value in a 31.1 fixed-point format. Thus, the bias needs to be one + * less: (1075 - 1: 1074). + * + * 2) To avoid shifting the mantissa as a full 64-bit integer (which is + * costly on certain architectures), we break the shift into two parts. + * First, the upper and lower parts of the mantissa are shifted + * individually by a constant amount that all valid inputs will require + * at the very least. This amount is chosen to be 21, because this will + * allow the two parts of the mantissa to later be combined into a + * single 32-bit representation, on which the remainder of the shift + * will be performed. Thus, we decrease the bias by an additional 21: + * (1074 - 21: 1053). + */ + shift_amount = 1053 - (top & 0x7FF); + + /* We are done with the exponent portion in "top", so here we shift it off + * the end. + */ + top >>= 11; + + /* Before we perform any operations on the mantissa, we need to OR in + * the implicit 1 at the top (see the IEEE-754 spec). We needn't mask + * off the sign bit nor the exponent bits because these higher bits won't + * make a bit of difference in the rest of our calculations. + */ + u.ui32[MSW] |= 0x100000; + + /* If the input double is negative, we have to decrease the mantissa + * by a hair. This is an important part of performing arithmetic rounding, + * as negative numbers must round towards positive infinity in the + * halfwase case of -x.5. Since "top" contains only the sign bit at this + * point, we can just decrease the mantissa by the value of "top". + */ + u.ui64 -= top; + + /* By decrementing "top", we create a bitmask with a value of either + * 0x0 (if the input was negative) or 0xFFFFFFFF (if the input was positive + * and thus the unsigned subtraction underflowed) that we'll use later. + */ + top--; + + /* Here, we shift the mantissa by the constant value as described above. + * We can emulate a 64-bit shift right by 21 through shifting the top 32 + * bits left 11 places and ORing in the bottom 32 bits shifted 21 places + * to the right. Both parts of the mantissa are now packed into a single + * 32-bit integer. Although we severely truncate the lower part in the + * process, we still have enough significant bits to perform the conversion + * without error (for all valid inputs). + */ + output = (u.ui32[MSW] << 11) | (u.ui32[LSW] >> 21); + + /* Next, we perform the shift that converts the X.Y fixed-point number + * currently found in "output" to the desired 31.1 fixed-point format + * needed for the following rounding step. It is important to consider + * all possible values for "shift_amount" at this point: + * + * - {shift_amount < 0} Since shift_amount is an unsigned integer, it + * really can't have a value less than zero. But, if the shift_amount + * calculation above caused underflow (which would happen with + * input > INT_MAX or input <= INT_MIN) then shift_amount will now be + * a very large number, and so this shift will result in complete + * garbage. But that's OK, as the input was out of our range, so our + * output is undefined. + * + * - {shift_amount > 31} If the magnitude of the input was very small + * (i.e. |input| << 1.0), shift_amount will have a value greater than + * 31. Thus, this shift will also result in garbage. After performing + * the shift, we will zero-out "output" if this is the case. + * + * - {0 <= shift_amount < 32} In this case, the shift will properly convert + * the mantissa into a 31.1 fixed-point number. + */ + output >>= shift_amount; + + /* This is where we perform rounding with the 31.1 fixed-point number. + * Since what we're after is arithmetic rounding, we simply add the single + * fractional bit into the integer part of "output", and just keep the + * integer part. + */ + output = (output >> 1) + (output & 1); + + /* Here, we zero-out the result if the magnitude if the input was very small + * (as explained in the section above). Notice that all input out of the + * valid range is also caught by this condition, which means we produce 0 + * for all invalid input, which is a nice side effect. + * + * The most straightforward way to do this would be: + * + * if (shift_amount > 31) + * output = 0; + * + * But we can use a little trick to avoid the potential branch. The + * expression (shift_amount > 31) will be either 1 or 0, which when + * decremented will be either 0x0 or 0xFFFFFFFF (unsigned underflow), + * which can be used to conditionally mask away all the bits in "output" + * (in the 0x0 case), effectively zeroing it out. Certain, compilers would + * have done this for us automatically. + */ + output &= ((shift_amount > 31) - 1); + + /* If the input double was a negative number, then we have to negate our + * output. The most straightforward way to do this would be: + * + * if (!top) + * output = -output; + * + * as "top" at this point is either 0x0 (if the input was negative) or + * 0xFFFFFFFF (if the input was positive). But, we can use a trick to + * avoid the branch. Observe that the following snippet of code has the + * same effect as the reference snippet above: + * + * if (!top) + * output = 0 - output; + * else + * output = output - 0; + * + * Armed with the bitmask found in "top", we can condense the two statements + * into the following: + * + * output = (output & top) - (output & ~top); + * + * where, in the case that the input double was negative, "top" will be 0, + * and the statement will be equivalent to: + * + * output = (0) - (output); + * + * and if the input double was positive, "top" will be 0xFFFFFFFF, and the + * statement will be equivalent to: + * + * output = (output) - (0); + * + * Which, as pointed out earlier, is equivalent to the original reference + * snippet. + */ + output = (output & top) - (output & ~top); + + return output; +#undef MSW +#undef LSW +} +#endif + +/* Convert a 32-bit IEEE single precision floating point number to a + * 'half' representation (s10.5) + */ +uint16_t +_cairo_half_from_float (float f) +{ + union { + uint32_t ui; + float f; + } u; + int s, e, m; + + u.f = f; + s = (u.ui >> 16) & 0x00008000; + e = ((u.ui >> 23) & 0x000000ff) - (127 - 15); + m = u.ui & 0x007fffff; + if (e <= 0) { + if (e < -10) { + /* underflow */ + return 0; + } + + m = (m | 0x00800000) >> (1 - e); + + /* round to nearest, round 0.5 up. */ + if (m & 0x00001000) + m += 0x00002000; + return s | (m >> 13); + } else if (e == 0xff - (127 - 15)) { + if (m == 0) { + /* infinity */ + return s | 0x7c00; + } else { + /* nan */ + m >>= 13; + return s | 0x7c00 | m | (m == 0); + } + } else { + /* round to nearest, round 0.5 up. */ + if (m & 0x00001000) { + m += 0x00002000; + + if (m & 0x00800000) { + m = 0; + e += 1; + } + } + + if (e > 30) { + /* overflow -> infinity */ + return s | 0x7c00; + } + + return s | (e << 10) | (m >> 13); + } +} + +#ifndef __BIONIC__ +# include + +const char * +cairo_get_locale_decimal_point (void) +{ + struct lconv *locale_data = localeconv (); + return locale_data->decimal_point; +} + +#else +/* Android's Bionic libc doesn't provide decimal_point */ +const char * +cairo_get_locale_decimal_point (void) +{ + return '.'; +} +#endif + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include +#include + +#if !_WIN32_WCE +/* tmpfile() replacement for Windows. + * + * On Windows tmpfile() creates the file in the root directory. This + * may fail due to unsufficient privileges. However, this isn't a + * problem on Windows CE so we don't use it there. + */ +FILE * +_cairo_win32_tmpfile (void) +{ + DWORD path_len; + WCHAR path_name[MAX_PATH + 1]; + WCHAR file_name[MAX_PATH + 1]; + HANDLE handle; + int fd; + FILE *fp; + + path_len = GetTempPathW (MAX_PATH, path_name); + if (path_len <= 0 || path_len >= MAX_PATH) + return NULL; + + if (GetTempFileNameW (path_name, L"ps_", 0, file_name) == 0) + return NULL; + + handle = CreateFileW (file_name, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + DeleteFileW (file_name); + return NULL; + } + + fd = _open_osfhandle((intptr_t) handle, 0); + if (fd < 0) { + CloseHandle (handle); + return NULL; + } + + fp = fdopen(fd, "w+b"); + if (fp == NULL) { + _close(fd); + return NULL; + } + + return fp; +} +#endif /* !_WIN32_WCE */ + +#endif /* _WIN32 */ + +typedef struct _cairo_intern_string { + cairo_hash_entry_t hash_entry; + int len; + char *string; +} cairo_intern_string_t; + +static cairo_hash_table_t *_cairo_intern_string_ht; + +static unsigned long +_intern_string_hash (const char *str, int len) +{ + const signed char *p = (const signed char *) str; + unsigned int h = *p; + + for (p += 1; --len; p++) + h = (h << 5) - h + *p; + + return h; +} + +static cairo_bool_t +_intern_string_equal (const void *_a, const void *_b) +{ + const cairo_intern_string_t *a = _a; + const cairo_intern_string_t *b = _b; + + if (a->len != b->len) + return FALSE; + + return memcmp (a->string, b->string, a->len) == 0; +} + +cairo_status_t +_cairo_intern_string (const char **str_inout, int len) +{ + char *str = (char *) *str_inout; + cairo_intern_string_t tmpl, *istring; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (len < 0) + len = strlen (str); + tmpl.hash_entry.hash = _intern_string_hash (str, len); + tmpl.len = len; + tmpl.string = (char *) str; + + CAIRO_MUTEX_LOCK (_cairo_intern_string_mutex); + if (_cairo_intern_string_ht == NULL) { + _cairo_intern_string_ht = _cairo_hash_table_create (_intern_string_equal); + if (unlikely (_cairo_intern_string_ht == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + } + + istring = _cairo_hash_table_lookup (_cairo_intern_string_ht, + &tmpl.hash_entry); + if (istring == NULL) { + istring = malloc (sizeof (cairo_intern_string_t) + len + 1); + if (likely (istring != NULL)) { + istring->hash_entry.hash = tmpl.hash_entry.hash; + istring->len = tmpl.len; + istring->string = (char *) (istring + 1); + memcpy (istring->string, str, len); + istring->string[len] = '\0'; + + status = _cairo_hash_table_insert (_cairo_intern_string_ht, + &istring->hash_entry); + if (unlikely (status)) { + free (istring); + goto BAIL; + } + } else { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + } + + *str_inout = istring->string; + + BAIL: + CAIRO_MUTEX_UNLOCK (_cairo_intern_string_mutex); + return status; +} + +static void +_intern_string_pluck (void *entry, void *closure) +{ + _cairo_hash_table_remove (closure, entry); + free (entry); +} + +void +_cairo_intern_string_reset_static_data (void) +{ + CAIRO_MUTEX_LOCK (_cairo_intern_string_mutex); + if (_cairo_intern_string_ht != NULL) { + _cairo_hash_table_foreach (_cairo_intern_string_ht, + _intern_string_pluck, + _cairo_intern_string_ht); + _cairo_hash_table_destroy(_cairo_intern_string_ht); + _cairo_intern_string_ht = NULL; + } + CAIRO_MUTEX_UNLOCK (_cairo_intern_string_mutex); +} diff --git a/src/cairo-mono-scan-converter.c b/src/cairo-mono-scan-converter.c new file mode 100644 index 000000000..2a9546cf8 --- /dev/null +++ b/src/cairo-mono-scan-converter.c @@ -0,0 +1,612 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* + * Copyright (c) 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "cairoint.h" +#include "cairo-spans-private.h" +#include "cairo-error-private.h" + +#include +#include +#include + +struct quorem { + int32_t quo; + int32_t rem; +}; + +struct edge { + struct edge *next, *prev; + + int32_t height_left; + int32_t dir; + int32_t vertical; + + int32_t dy; + struct quorem x; + struct quorem dxdy; +}; + +/* A collection of sorted and vertically clipped edges of the polygon. + * Edges are moved from the polygon to an active list while scan + * converting. */ +struct polygon { + /* The vertical clip extents. */ + int32_t ymin, ymax; + + int num_edges; + struct edge *edges; + + /* Array of edges all starting in the same bucket. An edge is put + * into bucket EDGE_BUCKET_INDEX(edge->ytop, polygon->ymin) when + * it is added to the polygon. */ + struct edge **y_buckets; + + struct edge *y_buckets_embedded[64]; + struct edge edges_embedded[32]; +}; + +struct mono_scan_converter { + struct polygon polygon[1]; + + /* Leftmost edge on the current scan line. */ + struct edge head, tail; + int is_vertical; + + cairo_half_open_span_t *spans; + cairo_half_open_span_t spans_embedded[64]; + int num_spans; + + /* Clip box. */ + int32_t xmin, xmax; + int32_t ymin, ymax; +}; + +#define I(x) _cairo_fixed_integer_round_down(x) + +/* Compute the floored division a/b. Assumes / and % perform symmetric + * division. */ +inline static struct quorem +floored_divrem(int a, int b) +{ + struct quorem qr; + qr.quo = a/b; + qr.rem = a%b; + if ((a^b)<0 && qr.rem) { + qr.quo -= 1; + qr.rem += b; + } + return qr; +} + +/* Compute the floored division (x*a)/b. Assumes / and % perform symmetric + * division. */ +static struct quorem +floored_muldivrem(int x, int a, int b) +{ + struct quorem qr; + long long xa = (long long)x*a; + qr.quo = xa/b; + qr.rem = xa%b; + if ((xa>=0) != (b>=0) && qr.rem) { + qr.quo -= 1; + qr.rem += b; + } + return qr; +} + +static cairo_status_t +polygon_init (struct polygon *polygon, int ymin, int ymax) +{ + unsigned h = ymax - ymin + 1; + + polygon->y_buckets = polygon->y_buckets_embedded; + if (h > ARRAY_LENGTH (polygon->y_buckets_embedded)) { + polygon->y_buckets = _cairo_malloc_ab (h, sizeof (struct edge *)); + if (unlikely (NULL == polygon->y_buckets)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + memset (polygon->y_buckets, 0, h * sizeof (struct edge *)); + polygon->y_buckets[h-1] = (void *)-1; + + polygon->ymin = ymin; + polygon->ymax = ymax; + return CAIRO_STATUS_SUCCESS; +} + +static void +polygon_fini (struct polygon *polygon) +{ + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + if (polygon->edges != polygon->edges_embedded) + free (polygon->edges); +} + +static void +_polygon_insert_edge_into_its_y_bucket(struct polygon *polygon, + struct edge *e, + int y) +{ + struct edge **ptail = &polygon->y_buckets[y - polygon->ymin]; + if (*ptail) + (*ptail)->prev = e; + e->next = *ptail; + e->prev = NULL; + *ptail = e; +} + +inline static void +polygon_add_edge (struct polygon *polygon, + const cairo_edge_t *edge) +{ + struct edge *e; + cairo_fixed_t dx; + cairo_fixed_t dy; + int y, ytop, ybot; + int ymin = polygon->ymin; + int ymax = polygon->ymax; + + y = I(edge->top); + ytop = MAX(y, ymin); + + y = I(edge->bottom); + ybot = MIN(y, ymax); + + if (ybot <= ytop) + return; + + e = polygon->edges + polygon->num_edges++; + e->height_left = ybot - ytop; + e->dir = edge->dir; + + dx = edge->line.p2.x - edge->line.p1.x; + dy = edge->line.p2.y - edge->line.p1.y; + + if (dx == 0) { + e->vertical = TRUE; + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + e->dxdy.quo = 0; + e->dxdy.rem = 0; + e->dy = 0; + } else { + e->vertical = FALSE; + e->dxdy = floored_muldivrem (dx, CAIRO_FIXED_ONE, dy); + e->dy = dy; + + e->x = floored_muldivrem (ytop * CAIRO_FIXED_ONE + CAIRO_FIXED_FRAC_MASK/2 - edge->line.p1.y, + dx, dy); + e->x.quo += edge->line.p1.x; + } + e->x.rem -= dy; + + _polygon_insert_edge_into_its_y_bucket (polygon, e, ytop); +} + +static struct edge * +merge_sorted_edges (struct edge *head_a, struct edge *head_b) +{ + struct edge *head, **next, *prev; + int32_t x; + + prev = head_a->prev; + next = &head; + if (head_a->x.quo <= head_b->x.quo) { + head = head_a; + } else { + head = head_b; + head_b->prev = prev; + goto start_with_b; + } + + do { + x = head_b->x.quo; + while (head_a != NULL && head_a->x.quo <= x) { + prev = head_a; + next = &head_a->next; + head_a = head_a->next; + } + + head_b->prev = prev; + *next = head_b; + if (head_a == NULL) + return head; + +start_with_b: + x = head_a->x.quo; + while (head_b != NULL && head_b->x.quo <= x) { + prev = head_b; + next = &head_b->next; + head_b = head_b->next; + } + + head_a->prev = prev; + *next = head_a; + if (head_b == NULL) + return head; + } while (1); +} + +static struct edge * +sort_edges (struct edge *list, + unsigned int level, + struct edge **head_out) +{ + struct edge *head_other, *remaining; + unsigned int i; + + head_other = list->next; + + if (head_other == NULL) { + *head_out = list; + return NULL; + } + + remaining = head_other->next; + if (list->x.quo <= head_other->x.quo) { + *head_out = list; + head_other->next = NULL; + } else { + *head_out = head_other; + head_other->prev = list->prev; + head_other->next = list; + list->prev = head_other; + list->next = NULL; + } + + for (i = 0; i < level && remaining; i++) { + remaining = sort_edges (remaining, i, &head_other); + *head_out = merge_sorted_edges (*head_out, head_other); + } + + return remaining; +} + +static struct edge * +merge_unsorted_edges (struct edge *head, struct edge *unsorted) +{ + sort_edges (unsorted, UINT_MAX, &unsorted); + return merge_sorted_edges (head, unsorted); +} + +inline static void +active_list_merge_edges (struct mono_scan_converter *c, struct edge *edges) +{ + struct edge *e; + + for (e = edges; c->is_vertical && e; e = e->next) + c->is_vertical = e->vertical; + + c->head.next = merge_unsorted_edges (c->head.next, edges); +} + +inline static void +add_span (struct mono_scan_converter *c, int x1, int x2) +{ + int n; + + if (x1 < c->xmin) + x1 = c->xmin; + if (x2 > c->xmax) + x2 = c->xmax; + if (x2 <= x1) + return; + + n = c->num_spans++; + c->spans[n].x = x1; + c->spans[n].coverage = 255; + + n = c->num_spans++; + c->spans[n].x = x2; + c->spans[n].coverage = 0; +} + +inline static void +row (struct mono_scan_converter *c, unsigned int mask) +{ + struct edge *edge = c->head.next; + int xstart = INT_MIN, prev_x = INT_MIN; + int winding = 0; + + c->num_spans = 0; + while (&c->tail != edge) { + struct edge *next = edge->next; + int xend = I(edge->x.quo); + + if (--edge->height_left) { + if (!edge->vertical) { + edge->x.quo += edge->dxdy.quo; + edge->x.rem += edge->dxdy.rem; + if (edge->x.rem >= 0) { + ++edge->x.quo; + edge->x.rem -= edge->dy; + } + } + + if (edge->x.quo < prev_x) { + struct edge *pos = edge->prev; + pos->next = next; + next->prev = pos; + do { + pos = pos->prev; + } while (edge->x.quo < pos->x.quo); + pos->next->prev = edge; + edge->next = pos->next; + edge->prev = pos; + pos->next = edge; + } else + prev_x = edge->x.quo; + } else { + edge->prev->next = next; + next->prev = edge->prev; + } + + winding += edge->dir; + if ((winding & mask) == 0) { + if (I(next->x.quo) > xend + 1) { + add_span (c, xstart, xend); + xstart = INT_MIN; + } + } else if (xstart == INT_MIN) + xstart = xend; + + edge = next; + } +} + +inline static void dec (struct edge *e, int h) +{ + e->height_left -= h; + if (e->height_left == 0) { + e->prev->next = e->next; + e->next->prev = e->prev; + } +} + +static cairo_status_t +_mono_scan_converter_init(struct mono_scan_converter *c, + int xmin, int ymin, + int xmax, int ymax) +{ + cairo_status_t status; + int max_num_spans; + + status = polygon_init (c->polygon, ymin, ymax); + if (unlikely (status)) + return status; + + max_num_spans = xmax - xmin + 1; + if (max_num_spans > ARRAY_LENGTH(c->spans_embedded)) { + c->spans = _cairo_malloc_ab (max_num_spans, + sizeof (cairo_half_open_span_t)); + if (unlikely (c->spans == NULL)) { + polygon_fini (c->polygon); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } else + c->spans = c->spans_embedded; + + c->xmin = xmin; + c->xmax = xmax; + c->ymin = ymin; + c->ymax = ymax; + + c->head.vertical = 1; + c->head.height_left = INT_MAX; + c->head.x.quo = _cairo_fixed_from_int (_cairo_fixed_integer_part (INT_MIN)); + c->head.prev = NULL; + c->head.next = &c->tail; + c->tail.prev = &c->head; + c->tail.next = NULL; + c->tail.x.quo = _cairo_fixed_from_int (_cairo_fixed_integer_part (INT_MAX)); + c->tail.height_left = INT_MAX; + c->tail.vertical = 1; + + c->is_vertical = 1; + return CAIRO_STATUS_SUCCESS; +} + +static void +_mono_scan_converter_fini(struct mono_scan_converter *self) +{ + if (self->spans != self->spans_embedded) + free (self->spans); + + polygon_fini(self->polygon); +} + +static cairo_status_t +mono_scan_converter_allocate_edges(struct mono_scan_converter *c, + int num_edges) + +{ + c->polygon->num_edges = 0; + c->polygon->edges = c->polygon->edges_embedded; + if (num_edges > ARRAY_LENGTH (c->polygon->edges_embedded)) { + c->polygon->edges = _cairo_malloc_ab (num_edges, sizeof (struct edge)); + if (unlikely (c->polygon->edges == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +mono_scan_converter_add_edge (struct mono_scan_converter *c, + const cairo_edge_t *edge) +{ + polygon_add_edge (c->polygon, edge); +} + +static void +step_edges (struct mono_scan_converter *c, int count) +{ + struct edge *edge; + + for (edge = c->head.next; edge != &c->tail; edge = edge->next) { + edge->height_left -= count; + if (! edge->height_left) { + edge->prev->next = edge->next; + edge->next->prev = edge->prev; + } + } +} + +static cairo_status_t +mono_scan_converter_render(struct mono_scan_converter *c, + unsigned int winding_mask, + cairo_span_renderer_t *renderer) +{ + struct polygon *polygon = c->polygon; + int i, j, h = c->ymax - c->ymin; + cairo_status_t status; + + for (i = 0; i < h; i = j) { + j = i + 1; + + if (polygon->y_buckets[i]) + active_list_merge_edges (c, polygon->y_buckets[i]); + + if (c->is_vertical) { + int min_height; + struct edge *e; + + e = c->head.next; + min_height = e->height_left; + while (e != &c->tail) { + if (e->height_left < min_height) + min_height = e->height_left; + e = e->next; + } + + while (--min_height >= 1 && polygon->y_buckets[j] == NULL) + j++; + if (j != i + 1) + step_edges (c, j - (i + 1)); + } + + row (c, winding_mask); + if (c->num_spans) { + status = renderer->render_rows (renderer, c->ymin+i, j-i, + c->spans, c->num_spans); + if (unlikely (status)) + return status; + } + + /* XXX recompute after dropping edges? */ + if (c->head.next == &c->tail) + c->is_vertical = 1; + } + + return CAIRO_STATUS_SUCCESS; +} + +struct _cairo_mono_scan_converter { + cairo_scan_converter_t base; + + struct mono_scan_converter converter[1]; + cairo_fill_rule_t fill_rule; +}; + +typedef struct _cairo_mono_scan_converter cairo_mono_scan_converter_t; + +static void +_cairo_mono_scan_converter_destroy (void *converter) +{ + cairo_mono_scan_converter_t *self = converter; + _mono_scan_converter_fini (self->converter); + free(self); +} + +cairo_status_t +_cairo_mono_scan_converter_add_polygon (void *converter, + const cairo_polygon_t *polygon) +{ + cairo_mono_scan_converter_t *self = converter; + cairo_status_t status; + int i; + +#if 0 + FILE *file = fopen ("polygon.txt", "w"); + _cairo_debug_print_polygon (file, polygon); + fclose (file); +#endif + + status = mono_scan_converter_allocate_edges (self->converter, + polygon->num_edges); + if (unlikely (status)) + return status; + + for (i = 0; i < polygon->num_edges; i++) + mono_scan_converter_add_edge (self->converter, &polygon->edges[i]); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_mono_scan_converter_generate (void *converter, + cairo_span_renderer_t *renderer) +{ + cairo_mono_scan_converter_t *self = converter; + + return mono_scan_converter_render (self->converter, + self->fill_rule == CAIRO_FILL_RULE_WINDING ? ~0 : 1, + renderer); +} + +cairo_scan_converter_t * +_cairo_mono_scan_converter_create (int xmin, + int ymin, + int xmax, + int ymax, + cairo_fill_rule_t fill_rule) +{ + cairo_mono_scan_converter_t *self; + cairo_status_t status; + + self = malloc (sizeof(struct _cairo_mono_scan_converter)); + if (unlikely (self == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto bail_nomem; + } + + self->base.destroy = _cairo_mono_scan_converter_destroy; + self->base.generate = _cairo_mono_scan_converter_generate; + + status = _mono_scan_converter_init (self->converter, + xmin, ymin, xmax, ymax); + if (unlikely (status)) + goto bail; + + self->fill_rule = fill_rule; + + return &self->base; + + bail: + self->base.destroy(&self->base); + bail_nomem: + return _cairo_scan_converter_create_in_error (status); +} diff --git a/src/cairo-mutex-impl-private.h b/src/cairo-mutex-impl-private.h new file mode 100644 index 000000000..25223f3ea --- /dev/null +++ b/src/cairo-mutex-impl-private.h @@ -0,0 +1,278 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005,2007 Red Hat, Inc. + * Copyright © 2007 Mathias Hasselmann + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Mathias Hasselmann + * Behdad Esfahbod + */ + +#ifndef CAIRO_MUTEX_IMPL_PRIVATE_H +#define CAIRO_MUTEX_IMPL_PRIVATE_H + +#include "cairo.h" + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#if HAVE_LOCKDEP +#include +#endif + +/* A fully qualified no-operation statement */ +#define CAIRO_MUTEX_IMPL_NOOP do {/*no-op*/} while (0) +/* And one that evaluates its argument once */ +#define CAIRO_MUTEX_IMPL_NOOP1(expr) do { (void)(expr); } while (0) +/* Note: 'if (expr) {}' is an alternative to '(void)(expr);' that will 'use' the + * result of __attribute__((warn_used_result)) functions. */ + +/* Cairo mutex implementation: + * + * Any new mutex implementation needs to do the following: + * + * - Condition on the right header or feature. Headers are + * preferred as eg. you still can use win32 mutex implementation + * on a win32 system even if you do not compile the win32 + * surface/backend. + * + * - typedef #cairo_mutex_impl_t to the proper mutex type on your target + * system. Note that you may or may not need to use a pointer, + * depending on what kinds of initialization your mutex + * implementation supports. No trailing semicolon needed. + * You should be able to compile the following snippet (don't try + * running it): + * + * + * cairo_mutex_impl_t _cairo_some_mutex; + * + * + * - #define %CAIRO_MUTEX_IMPL_ 1 with suitable name for your platform. You + * can later use this symbol in cairo-system.c. + * + * - #define CAIRO_MUTEX_IMPL_LOCK(mutex) and CAIRO_MUTEX_IMPL_UNLOCK(mutex) to + * proper statement to lock/unlock the mutex object passed in. + * You can (and should) assume that the mutex is already + * initialized, and is-not-already-locked/is-locked, + * respectively. Use the "do { ... } while (0)" idiom if necessary. + * No trailing semicolons are needed (in any macro you define here). + * You should be able to compile the following snippet: + * + * + * cairo_mutex_impl_t _cairo_some_mutex; + * + * if (1) + * CAIRO_MUTEX_IMPL_LOCK (_cairo_some_mutex); + * else + * CAIRO_MUTEX_IMPL_UNLOCK (_cairo_some_mutex); + * + * + * - #define %CAIRO_MUTEX_IMPL_NIL_INITIALIZER to something that can + * initialize the #cairo_mutex_impl_t type you defined. Most of the + * time one of 0, %NULL, or {} works. At this point + * you should be able to compile the following snippet: + * + * + * cairo_mutex_impl_t _cairo_some_mutex = CAIRO_MUTEX_IMPL_NIL_INITIALIZER; + * + * if (1) + * CAIRO_MUTEX_IMPL_LOCK (_cairo_some_mutex); + * else + * CAIRO_MUTEX_IMPL_UNLOCK (_cairo_some_mutex); + * + * + * - If the above code is not enough to initialize a mutex on + * your platform, #define CAIRO_MUTEX_IMPL_INIT(mutex) to statement + * to initialize the mutex (allocate resources, etc). Such that + * you should be able to compile AND RUN the following snippet: + * + * + * cairo_mutex_impl_t _cairo_some_mutex = CAIRO_MUTEX_IMPL_NIL_INITIALIZER; + * + * CAIRO_MUTEX_IMPL_INIT (_cairo_some_mutex); + * + * if (1) + * CAIRO_MUTEX_IMPL_LOCK (_cairo_some_mutex); + * else + * CAIRO_MUTEX_IMPL_UNLOCK (_cairo_some_mutex); + * + * + * - If you define CAIRO_MUTEX_IMPL_INIT(mutex), cairo will use it to + * initialize all static mutex'es. If for any reason that should + * not happen (eg. %CAIRO_MUTEX_IMPL_INIT is just a faster way than + * what cairo does using %CAIRO_MUTEX_IMPL_NIL_INITIALIZER), then + * + * #define CAIRO_MUTEX_IMPL_INITIALIZE() CAIRO_MUTEX_IMPL_NOOP + * + * + * - If your system supports freeing a mutex object (deallocating + * resources, etc), then #define CAIRO_MUTEX_IMPL_FINI(mutex) to do + * that. + * + * - If you define CAIRO_MUTEX_IMPL_FINI(mutex), cairo will use it to + * define a finalizer function to finalize all static mutex'es. + * However, it's up to you to call CAIRO_MUTEX_IMPL_FINALIZE() at + * proper places, eg. when the system is unloading the cairo library. + * So, if for any reason finalizing static mutex'es is not needed + * (eg. you never call CAIRO_MUTEX_IMPL_FINALIZE()), then + * + * #define CAIRO_MUTEX_IMPL_FINALIZE() CAIRO_MUTEX_IMPL_NOOP + * + * + * - That is all. If for any reason you think the above API is + * not enough to implement #cairo_mutex_impl_t on your system, please + * stop and write to the cairo mailing list about it. DO NOT + * poke around cairo-mutex-private.h for possible solutions. + */ + +#if CAIRO_NO_MUTEX + +/* No mutexes */ + + typedef int cairo_mutex_impl_t; + +# define CAIRO_MUTEX_IMPL_NO 1 +# define CAIRO_MUTEX_IMPL_INITIALIZE() CAIRO_MUTEX_IMPL_NOOP +# define CAIRO_MUTEX_IMPL_LOCK(mutex) CAIRO_MUTEX_IMPL_NOOP1(mutex) +# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) CAIRO_MUTEX_IMPL_NOOP1(mutex) +# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER 0 + +# define CAIRO_MUTEX_HAS_RECURSIVE_IMPL 1 + + typedef int cairo_recursive_mutex_impl_t; + +# define CAIRO_RECURSIVE_MUTEX_IMPL_INIT(mutex) +# define CAIRO_RECURSIVE_MUTEX_IMPL_NIL_INITIALIZER 0 + +#elif defined(_WIN32) /******************************************************/ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +# include + + typedef CRITICAL_SECTION cairo_mutex_impl_t; + +# define CAIRO_MUTEX_IMPL_WIN32 1 +# define CAIRO_MUTEX_IMPL_LOCK(mutex) EnterCriticalSection (&(mutex)) +# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) LeaveCriticalSection (&(mutex)) +# define CAIRO_MUTEX_IMPL_INIT(mutex) InitializeCriticalSection (&(mutex)) +# define CAIRO_MUTEX_IMPL_FINI(mutex) DeleteCriticalSection (&(mutex)) +# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER { NULL, 0, 0, NULL, NULL, 0 } + +#elif defined __OS2__ /******************************************************/ + +# define INCL_BASE +# define INCL_PM +# include + + typedef HMTX cairo_mutex_impl_t; + +# define CAIRO_MUTEX_IMPL_OS2 1 +# define CAIRO_MUTEX_IMPL_LOCK(mutex) DosRequestMutexSem(mutex, SEM_INDEFINITE_WAIT) +# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) DosReleaseMutexSem(mutex) +# define CAIRO_MUTEX_IMPL_INIT(mutex) DosCreateMutexSem (NULL, &(mutex), 0L, FALSE) +# define CAIRO_MUTEX_IMPL_FINI(mutex) DosCloseMutexSem (mutex) +# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER 0 + +#elif CAIRO_HAS_BEOS_SURFACE /***********************************************/ + + typedef BLocker* cairo_mutex_impl_t; + +# define CAIRO_MUTEX_IMPL_BEOS 1 +# define CAIRO_MUTEX_IMPL_LOCK(mutex) (mutex)->Lock() +# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) (mutex)->Unlock() +# define CAIRO_MUTEX_IMPL_INIT(mutex) (mutex) = new BLocker() +# define CAIRO_MUTEX_IMPL_FINI(mutex) delete (mutex) +# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER NULL + +#elif CAIRO_HAS_PTHREAD /* and finally if there are no native mutexes ********/ + +# include + + typedef pthread_mutex_t cairo_mutex_impl_t; + typedef pthread_mutex_t cairo_recursive_mutex_impl_t; + +# define CAIRO_MUTEX_IMPL_PTHREAD 1 +#if HAVE_LOCKDEP +/* expose all mutexes to the validator */ +# define CAIRO_MUTEX_IMPL_INIT(mutex) pthread_mutex_init (&(mutex), NULL) +#endif +# define CAIRO_MUTEX_IMPL_LOCK(mutex) pthread_mutex_lock (&(mutex)) +# define CAIRO_MUTEX_IMPL_UNLOCK(mutex) pthread_mutex_unlock (&(mutex)) +#if HAVE_LOCKDEP +# define CAIRO_MUTEX_IS_LOCKED(mutex) LOCKDEP_IS_LOCKED (&(mutex)) +# define CAIRO_MUTEX_IS_UNLOCKED(mutex) LOCKDEP_IS_UNLOCKED (&(mutex)) +#endif +# define CAIRO_MUTEX_IMPL_FINI(mutex) pthread_mutex_destroy (&(mutex)) +#if ! HAVE_LOCKDEP +# define CAIRO_MUTEX_IMPL_FINALIZE() CAIRO_MUTEX_IMPL_NOOP +#endif +# define CAIRO_MUTEX_IMPL_NIL_INITIALIZER PTHREAD_MUTEX_INITIALIZER + +# define CAIRO_MUTEX_HAS_RECURSIVE_IMPL 1 +# define CAIRO_RECURSIVE_MUTEX_IMPL_INIT(mutex) do { \ + pthread_mutexattr_t attr; \ + pthread_mutexattr_init (&attr); \ + pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); \ + pthread_mutex_init (&(mutex), &attr); \ + pthread_mutexattr_destroy (&attr); \ +} while (0) +# define CAIRO_RECURSIVE_MUTEX_IMPL_NIL_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP + +#else /**********************************************************************/ + +# error "XXX: No mutex implementation found. Cairo will not work with multiple threads. Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support." + +#endif + +/* By default mutex implementations are assumed to be recursive */ +#if ! CAIRO_MUTEX_HAS_RECURSIVE_IMPL + +# define CAIRO_MUTEX_HAS_RECURSIVE_IMPL 1 + + typedef cairo_mutex_impl_t cairo_recursive_mutex_impl_t; + +# define CAIRO_RECURSIVE_MUTEX_IMPL_INIT(mutex) CAIRO_MUTEX_IMPL_INIT(mutex) +# define CAIRO_RECURSIVE_MUTEX_IMPL_NIL_INITIALIZER CAIRO_MUTEX_IMPL_NIL_INITIALIZER + +#endif + +#endif diff --git a/src/cairo-mutex-list-private.h b/src/cairo-mutex-list-private.h new file mode 100644 index 000000000..f46afadb0 --- /dev/null +++ b/src/cairo-mutex-list-private.h @@ -0,0 +1,78 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Mathias Hasselmann + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Mathias Hasselmann + */ + +#ifndef CAIRO_FEATURES_H +/* This block is to just make this header file standalone */ +#define CAIRO_MUTEX_DECLARE(mutex) +#endif + +CAIRO_MUTEX_DECLARE (_cairo_pattern_solid_surface_cache_lock) + +CAIRO_MUTEX_DECLARE (_cairo_image_solid_cache_mutex) + +CAIRO_MUTEX_DECLARE (_cairo_toy_font_face_mutex) +CAIRO_MUTEX_DECLARE (_cairo_intern_string_mutex) +CAIRO_MUTEX_DECLARE (_cairo_scaled_font_map_mutex) +CAIRO_MUTEX_DECLARE (_cairo_scaled_glyph_page_cache_mutex) +CAIRO_MUTEX_DECLARE (_cairo_scaled_font_error_mutex) +CAIRO_MUTEX_DECLARE (_cairo_glyph_cache_mutex) + +#if CAIRO_HAS_FT_FONT +CAIRO_MUTEX_DECLARE (_cairo_ft_unscaled_font_map_mutex) +#endif + +#if CAIRO_HAS_WIN32_FONT +CAIRO_MUTEX_DECLARE (_cairo_win32_font_face_mutex) +#endif + +#if CAIRO_HAS_XLIB_SURFACE +CAIRO_MUTEX_DECLARE (_cairo_xlib_display_mutex) +#endif + +#if CAIRO_HAS_XCB_SURFACE +CAIRO_MUTEX_DECLARE (_cairo_xcb_connections_mutex) +#endif + +#if CAIRO_HAS_GL_SURFACE +CAIRO_MUTEX_DECLARE (_cairo_gl_context_mutex) +#endif + +#if !defined (HAS_ATOMIC_OPS) || defined (ATOMIC_OP_NEEDS_MEMORY_BARRIER) +CAIRO_MUTEX_DECLARE (_cairo_atomic_mutex) +#endif + +#if CAIRO_HAS_DRM_SURFACE +CAIRO_MUTEX_DECLARE (_cairo_drm_device_mutex) +#endif +/* Undefine, to err on unintended inclusion */ +#undef CAIRO_MUTEX_DECLARE diff --git a/src/cairo-mutex-private.h b/src/cairo-mutex-private.h new file mode 100644 index 000000000..61a7160a0 --- /dev/null +++ b/src/cairo-mutex-private.h @@ -0,0 +1,67 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005,2007 Red Hat, Inc. + * Copyright © 2007 Mathias Hasselmann + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Mathias Hasselmann + * Behdad Esfahbod + */ + +#ifndef CAIRO_MUTEX_PRIVATE_H +#define CAIRO_MUTEX_PRIVATE_H + +#include "cairo-mutex-type-private.h" + +CAIRO_BEGIN_DECLS + +#if _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER +cairo_private void _cairo_mutex_initialize (void); +#endif +#if _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER +cairo_private void _cairo_mutex_finalize (void); +#endif +/* only if using static initializer and/or finalizer define the boolean */ +#if _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER || _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER + cairo_private extern cairo_bool_t _cairo_mutex_initialized; +#endif + +/* Finally, extern the static mutexes and undef */ + +#define CAIRO_MUTEX_DECLARE(mutex) cairo_private extern cairo_mutex_t mutex; +#include "cairo-mutex-list-private.h" +#undef CAIRO_MUTEX_DECLARE + +CAIRO_END_DECLS + +#endif diff --git a/src/cairo-mutex-type-private.h b/src/cairo-mutex-type-private.h new file mode 100644 index 000000000..e8c493985 --- /dev/null +++ b/src/cairo-mutex-type-private.h @@ -0,0 +1,194 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005,2007 Red Hat, Inc. + * Copyright © 2007 Mathias Hasselmann + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Mathias Hasselmann + * Behdad Esfahbod + */ + +#ifndef CAIRO_MUTEX_TYPE_PRIVATE_H +#define CAIRO_MUTEX_TYPE_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-mutex-impl-private.h" + +/* Only the following four are mandatory at this point */ +#ifndef CAIRO_MUTEX_IMPL_LOCK +# error "CAIRO_MUTEX_IMPL_LOCK not defined. Check cairo-mutex-impl-private.h." +#endif +#ifndef CAIRO_MUTEX_IMPL_UNLOCK +# error "CAIRO_MUTEX_IMPL_UNLOCK not defined. Check cairo-mutex-impl-private.h." +#endif +#ifndef CAIRO_MUTEX_IMPL_NIL_INITIALIZER +# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined. Check cairo-mutex-impl-private.h." +#endif +#ifndef CAIRO_RECURSIVE_MUTEX_IMPL_INIT +# error "CAIRO_RECURSIVE_MUTEX_IMPL_INIT not defined. Check cairo-mutex-impl-private.h." +#endif + + +/* make sure implementations don't fool us: we decide these ourself */ +#undef _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER +#undef _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER + + +#ifdef CAIRO_MUTEX_IMPL_INIT + +/* If %CAIRO_MUTEX_IMPL_INIT is defined, we may need to initialize all + * static mutex'es. */ +# ifndef CAIRO_MUTEX_IMPL_INITIALIZE +# define CAIRO_MUTEX_IMPL_INITIALIZE() do { \ + if (!_cairo_mutex_initialized) \ + _cairo_mutex_initialize (); \ + } while(0) + +/* and make sure we implement the above */ +# define _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER 1 +# endif /* CAIRO_MUTEX_IMPL_INITIALIZE */ + +#else /* no CAIRO_MUTEX_IMPL_INIT */ + +/* Otherwise we probably don't need to initialize static mutex'es, */ +# ifndef CAIRO_MUTEX_IMPL_INITIALIZE +# define CAIRO_MUTEX_IMPL_INITIALIZE() CAIRO_MUTEX_IMPL_NOOP +# endif /* CAIRO_MUTEX_IMPL_INITIALIZE */ + +/* and dynamic ones can be initialized using the static initializer. */ +# define CAIRO_MUTEX_IMPL_INIT(mutex) do { \ + cairo_mutex_t _tmp_mutex = CAIRO_MUTEX_IMPL_NIL_INITIALIZER; \ + memcpy (&(mutex), &_tmp_mutex, sizeof (_tmp_mutex)); \ + } while (0) + +#endif /* CAIRO_MUTEX_IMPL_INIT */ + +#ifdef CAIRO_MUTEX_IMPL_FINI + +/* If %CAIRO_MUTEX_IMPL_FINI is defined, we may need to finalize all + * static mutex'es. */ +# ifndef CAIRO_MUTEX_IMPL_FINALIZE +# define CAIRO_MUTEX_IMPL_FINALIZE() do { \ + if (_cairo_mutex_initialized) \ + _cairo_mutex_finalize (); \ + } while(0) + +/* and make sure we implement the above */ +# define _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER 1 +# endif /* CAIRO_MUTEX_IMPL_FINALIZE */ + +#else /* no CAIRO_MUTEX_IMPL_FINI */ + +/* Otherwise we probably don't need to finalize static mutex'es, */ +# ifndef CAIRO_MUTEX_IMPL_FINALIZE +# define CAIRO_MUTEX_IMPL_FINALIZE() CAIRO_MUTEX_IMPL_NOOP +# endif /* CAIRO_MUTEX_IMPL_FINALIZE */ + +/* neither do the dynamic ones. */ +# define CAIRO_MUTEX_IMPL_FINI(mutex) CAIRO_MUTEX_IMPL_NOOP1(mutex) + +#endif /* CAIRO_MUTEX_IMPL_FINI */ + + +#ifndef _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER +#define _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER 0 +#endif +#ifndef _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER +#define _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER 0 +#endif + + +/* Make sure everything we want is defined */ +#ifndef CAIRO_MUTEX_IMPL_INITIALIZE +# error "CAIRO_MUTEX_IMPL_INITIALIZE not defined" +#endif +#ifndef CAIRO_MUTEX_IMPL_FINALIZE +# error "CAIRO_MUTEX_IMPL_FINALIZE not defined" +#endif +#ifndef CAIRO_MUTEX_IMPL_LOCK +# error "CAIRO_MUTEX_IMPL_LOCK not defined" +#endif +#ifndef CAIRO_MUTEX_IMPL_UNLOCK +# error "CAIRO_MUTEX_IMPL_UNLOCK not defined" +#endif +#ifndef CAIRO_MUTEX_IMPL_INIT +# error "CAIRO_MUTEX_IMPL_INIT not defined" +#endif +#ifndef CAIRO_MUTEX_IMPL_FINI +# error "CAIRO_MUTEX_IMPL_FINI not defined" +#endif +#ifndef CAIRO_MUTEX_IMPL_NIL_INITIALIZER +# error "CAIRO_MUTEX_IMPL_NIL_INITIALIZER not defined" +#endif + + +/* Public interface. */ + +/* By default it simply uses the implementation provided. + * But we can provide for debugging features by overriding them */ + +#ifndef CAIRO_MUTEX_DEBUG +typedef cairo_mutex_impl_t cairo_mutex_t; +typedef cairo_recursive_mutex_impl_t cairo_recursive_mutex_t; +#else +# define cairo_mutex_t cairo_mutex_impl_t +#endif + +#define CAIRO_MUTEX_INITIALIZE CAIRO_MUTEX_IMPL_INITIALIZE +#define CAIRO_MUTEX_FINALIZE CAIRO_MUTEX_IMPL_FINALIZE +#define CAIRO_MUTEX_LOCK CAIRO_MUTEX_IMPL_LOCK +#define CAIRO_MUTEX_UNLOCK CAIRO_MUTEX_IMPL_UNLOCK +#define CAIRO_MUTEX_INIT CAIRO_MUTEX_IMPL_INIT +#define CAIRO_MUTEX_FINI CAIRO_MUTEX_IMPL_FINI +#define CAIRO_MUTEX_NIL_INITIALIZER CAIRO_MUTEX_IMPL_NIL_INITIALIZER + +#define CAIRO_RECURSIVE_MUTEX_INIT CAIRO_RECURSIVE_MUTEX_IMPL_INIT +#define CAIRO_RECURSIVE_MUTEX_NIL_INITIALIZER CAIRO_RECURSIVE_MUTEX_IMPL_NIL_INITIALIZER + +#ifndef CAIRO_MUTEX_IS_LOCKED +# define CAIRO_MUTEX_IS_LOCKED(name) 1 +#endif +#ifndef CAIRO_MUTEX_IS_UNLOCKED +# define CAIRO_MUTEX_IS_UNLOCKED(name) 1 +#endif + + +/* Debugging support */ + +#ifdef CAIRO_MUTEX_DEBUG + +/* TODO add mutex debugging facilities here (eg deadlock detection) */ + +#endif /* CAIRO_MUTEX_DEBUG */ + +#endif diff --git a/src/cairo-mutex.c b/src/cairo-mutex.c new file mode 100644 index 000000000..0a31dced3 --- /dev/null +++ b/src/cairo-mutex.c @@ -0,0 +1,82 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Mathias Hasselmann + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Mathias Hasselmann + */ + +#include "cairoint.h" + +#include "cairo-mutex-private.h" + +#define CAIRO_MUTEX_DECLARE(mutex) cairo_mutex_t mutex = CAIRO_MUTEX_NIL_INITIALIZER; +#include "cairo-mutex-list-private.h" +#undef CAIRO_MUTEX_DECLARE + +#if _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER || _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER + +# if _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER +# define _CAIRO_MUTEX_IMPL_INITIALIZED_DEFAULT_VALUE FALSE +# else +# define _CAIRO_MUTEX_IMPL_INITIALIZED_DEFAULT_VALUE TRUE +# endif + +cairo_bool_t _cairo_mutex_initialized = _CAIRO_MUTEX_IMPL_INITIALIZED_DEFAULT_VALUE; + +# undef _CAIRO_MUTEX_IMPL_INITIALIZED_DEFAULT_VALUE + +#endif + +#if _CAIRO_MUTEX_IMPL_USE_STATIC_INITIALIZER +void _cairo_mutex_initialize (void) +{ + if (_cairo_mutex_initialized) + return; + + _cairo_mutex_initialized = TRUE; + +#define CAIRO_MUTEX_DECLARE(mutex) CAIRO_MUTEX_INIT (mutex); +#include "cairo-mutex-list-private.h" +#undef CAIRO_MUTEX_DECLARE +} +#endif + +#if _CAIRO_MUTEX_IMPL_USE_STATIC_FINALIZER +void _cairo_mutex_finalize (void) +{ + if (!_cairo_mutex_initialized) + return; + + _cairo_mutex_initialized = FALSE; + +#define CAIRO_MUTEX_DECLARE(mutex) CAIRO_MUTEX_FINI (mutex); +#include "cairo-mutex-list-private.h" +#undef CAIRO_MUTEX_DECLARE +} +#endif diff --git a/src/cairo-no-compositor.c b/src/cairo-no-compositor.c new file mode 100644 index 000000000..1602a12f6 --- /dev/null +++ b/src/cairo-no-compositor.c @@ -0,0 +1,107 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-compositor-private.h" + +static cairo_int_status_t +_cairo_no_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_no_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_no_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_no_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_no_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +const cairo_compositor_t __cairo_no_compositor = { + NULL, + _cairo_no_compositor_paint, + _cairo_no_compositor_mask, + _cairo_no_compositor_stroke, + _cairo_no_compositor_fill, + _cairo_no_compositor_glyphs, +}; diff --git a/src/cairo-observer.c b/src/cairo-observer.c new file mode 100644 index 000000000..36d6b93bd --- /dev/null +++ b/src/cairo-observer.c @@ -0,0 +1,52 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-list-inline.h" + +void +_cairo_observers_notify (cairo_list_t *observers, void *arg) +{ + cairo_observer_t *obs, *next; + + cairo_list_foreach_entry_safe (obs, next, + cairo_observer_t, + observers, link) + { + obs->callback (obs, arg); + } +} diff --git a/src/cairo-os2-private.h b/src/cairo-os2-private.h new file mode 100644 index 000000000..829dd3c8d --- /dev/null +++ b/src/cairo-os2-private.h @@ -0,0 +1,67 @@ +/* vim: set sw=4 sts=4 et cin: */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2005-2006 netlabs.org + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is + * Doodle + * + * Contributor(s): + * Peter Weilbacher + */ + +#ifndef CAIRO_OS2_PRIVATE_H +#define CAIRO_OS2_PRIVATE_H + +#include "cairo-os2.h" +#include "cairoint.h" + +typedef struct _cairo_os2_surface +{ + cairo_surface_t base; + + /* Mutex semaphore to protect private fields from concurrent access */ + HMTX hmtx_use_private_fields; + /* Private fields: */ + HPS hps_client_window; + HWND hwnd_client_window; + BITMAPINFO2 bitmap_info; + unsigned char *pixels; + cairo_image_surface_t *image_surface; + int pixel_array_lend_count; + HEV hev_pixel_array_came_back; + + RECTL rcl_dirty_area; + cairo_bool_t dirty_area_present; + + /* General flags: */ + cairo_bool_t blit_as_changes; + cairo_bool_t use_24bpp; +} cairo_os2_surface_t; + +#endif /* CAIRO_OS2_PRIVATE_H */ diff --git a/src/cairo-os2-surface.c b/src/cairo-os2-surface.c new file mode 100644 index 000000000..1ab50f977 --- /dev/null +++ b/src/cairo-os2-surface.c @@ -0,0 +1,1415 @@ +/* vim: set sw=4 sts=4 et cin: */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2005-2006 netlabs.org + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is + * Doodle + * + * Contributor(s): + * Peter Weilbacher + * Rich Walsh + */ + +#include "cairoint.h" + +#include "cairo-os2-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-surface-fallback-private.h" +#include "cairo-image-surface-private.h" + +#if CAIRO_HAS_FC_FONT +#include +#endif + +#include +#ifdef BUILD_CAIRO_DLL +# include "cairo-os2.h" +# ifndef __WATCOMC__ +# include +# endif +#endif + +/* + * Here comes the extra API for the OS/2 platform. Currently it consists + * of two extra functions, the cairo_os2_init() and the + * cairo_os2_fini(). Both of them are called automatically if + * Cairo is compiled to be a DLL file, but you have to call them before + * using the Cairo API if you link to Cairo statically! + * + * You'll also find the code in here which deals with DLL initialization + * and termination, if the code is built to be a DLL. + * (if BUILD_CAIRO_DLL is defined) + */ + +/* Initialization counter: */ +static int cairo_os2_initialization_count = 0; + +static inline void +DisableFPUException (void) +{ + unsigned short usCW; + + /* Some OS/2 PM API calls modify the FPU Control Word, + * but forget to restore it. + * + * This can result in XCPT_FLOAT_INVALID_OPCODE exceptions, + * so to be sure, we disable Invalid Opcode FPU exception + * before using FPU stuffs. + */ + usCW = _control87 (0, 0); + usCW = usCW | EM_INVALID | 0x80; + _control87 (usCW, MCW_EM | 0x80); +} + +/** + * cairo_os2_init: + * + * Initializes the Cairo library. This function is automatically called if + * Cairo was compiled to be a DLL (however it's not a problem if it's called + * multiple times). But if you link to Cairo statically, you have to call it + * once to set up Cairo's internal structures and mutexes. + * + * Since: 1.4 + **/ +cairo_public void +cairo_os2_init (void) +{ + /* This may initialize some stuffs, like create mutex semaphores etc.. */ + + cairo_os2_initialization_count++; + if (cairo_os2_initialization_count > 1) return; + + DisableFPUException (); + +#if CAIRO_HAS_FC_FONT + /* Initialize FontConfig */ + FcInit (); +#endif + + CAIRO_MUTEX_INITIALIZE (); +} + +/** + * cairo_os2_fini: + * + * Uninitializes the Cairo library. This function is automatically called if + * Cairo was compiled to be a DLL (however it's not a problem if it's called + * multiple times). But if you link to Cairo statically, you have to call it + * once to shut down Cairo, to let it free all the resources it has allocated. + * + * Since: 1.4 + **/ +cairo_public void +cairo_os2_fini (void) +{ + /* This has to uninitialize some stuffs, like destroy mutex semaphores etc.. */ + + if (cairo_os2_initialization_count <= 0) return; + cairo_os2_initialization_count--; + if (cairo_os2_initialization_count > 0) return; + + DisableFPUException (); + + cairo_debug_reset_static_data (); + +#if CAIRO_HAS_FC_FONT +# if HAVE_FCFINI + /* Uninitialize FontConfig */ + FcFini (); +# endif +#endif + +#ifdef __WATCOMC__ + /* It can happen that the libraries we use have memory leaks, + * so there are still memory chunks allocated at this point. + * In these cases, Watcom might still have a bigger memory chunk, + * called "the heap" allocated from the OS. + * As we want to minimize the memory we lose from the point of + * view of the OS, we call this function to shrink that heap + * as much as possible. + */ + _heapshrink (); +#else + /* GCC has a heapmin function that approximately corresponds to + * what the Watcom function does + */ + _heapmin (); +#endif +} + +/* + * This function calls the allocation function depending on which + * method was compiled into the library: it can be native allocation + * (DosAllocMem/DosFreeMem) or C-Library based allocation (malloc/free). + * Actually, for pixel buffers that we use this function for, cairo + * uses _cairo_malloc_abc, so we use that here, too. And use the + * change to check the size argument + */ +void *_buffer_alloc (size_t a, size_t b, const unsigned int size) +{ + size_t nbytes; + void *buffer = NULL; + + if (!a || !b || !size || + a >= INT32_MAX / b || a*b >= INT32_MAX / size) { + return NULL; + } + nbytes = a * b * size; + +#ifdef OS2_USE_PLATFORM_ALLOC + /* Using OBJ_ANY on a machine that isn't configured for hi-mem + * will cause ERROR_INVALID_PARAMETER. If this occurs, or this + * build doesn't have hi-mem enabled, fall back to using lo-mem. + */ +#ifdef OS2_HIGH_MEMORY + if (!DosAllocMem (&buffer, nbytes, + OBJ_ANY | PAG_READ | PAG_WRITE | PAG_COMMIT)) + return buffer; +#endif + if (DosAllocMem (&buffer, nbytes, + PAG_READ | PAG_WRITE | PAG_COMMIT)) + return NULL; +#else + /* Clear the malloc'd buffer the way DosAllocMem() does. */ + buffer = malloc (nbytes); + if (buffer) { + memset (buffer, 0, nbytes); + } +#endif + return buffer; +} + +/* + * This function selects the free function depending on which + * allocation method was compiled into the library + */ +void _buffer_free (void *buffer) +{ +#ifdef OS2_USE_PLATFORM_ALLOC + DosFreeMem (buffer); +#else + free (buffer); +#endif +} + +/* XXX + * The cairo_os2_ini() and cairo_os2_fini() functions should be removed and + * the LibMain code moved to cairo-system.c. It should also call + * cairo_debug_reset_static_data() instead of duplicating its logic... + */ + +#ifdef BUILD_CAIRO_DLL +/* The main DLL entry for DLL initialization and uninitialization */ +/* Only include this code if we're about to build a DLL. */ + +#ifdef __WATCOMC__ +unsigned _System +LibMain (unsigned hmod, + unsigned termination) +#else +unsigned long _System +_DLL_InitTerm (unsigned long hModule, + unsigned long termination) +#endif +{ + if (termination) { + /* Unloading the DLL */ + cairo_os2_fini (); + +#ifndef __WATCOMC__ + /* Uninitialize RTL of GCC */ + __ctordtorTerm (); + _CRT_term (); +#endif + return 1; + } else { + /* Loading the DLL */ +#ifndef __WATCOMC__ + /* Initialize RTL of GCC */ + if (_CRT_init () != 0) + return 0; + __ctordtorInit (); +#endif + + cairo_os2_init (); + return 1; + } +} + +#endif /* BUILD_CAIRO_DLL */ + +/* + * The following part of the source file contains the code which might + * be called the "core" of the OS/2 backend support. This contains the + * OS/2 surface support functions and structures. + */ + +/* Forward declaration */ +static const cairo_surface_backend_t cairo_os2_surface_backend; + +/* Unpublished API: + * GpiEnableYInversion = PMGPI.723 + * GpiQueryYInversion = PMGPI.726 + * BOOL APIENTRY GpiEnableYInversion (HPS hps, LONG lHeight); + * LONG APIENTRY GpiQueryYInversion (HPS hps); + */ +BOOL APIENTRY GpiEnableYInversion (HPS hps, LONG lHeight); +LONG APIENTRY GpiQueryYInversion (HPS hps); + +#ifdef __WATCOMC__ +/* Function declaration for GpiDrawBits () (missing from OpenWatcom headers) */ +LONG APIENTRY GpiDrawBits (HPS hps, + PVOID pBits, + PBITMAPINFO2 pbmiInfoTable, + LONG lCount, + PPOINTL aptlPoints, + LONG lRop, + ULONG flOptions); +#endif + +static void +_cairo_os2_surface_blit_pixels (cairo_os2_surface_t *surface, + HPS hps_begin_paint, + PRECTL prcl_begin_paint_rect) +{ + POINTL aptlPoints[4]; + LONG lOldYInversion; + LONG rc = GPI_OK; + + /* Check the limits (may not be necessary) */ + if (prcl_begin_paint_rect->xLeft < 0) + prcl_begin_paint_rect->xLeft = 0; + if (prcl_begin_paint_rect->yBottom < 0) + prcl_begin_paint_rect->yBottom = 0; + if (prcl_begin_paint_rect->xRight > (LONG) surface->bitmap_info.cx) + prcl_begin_paint_rect->xRight = (LONG) surface->bitmap_info.cx; + if (prcl_begin_paint_rect->yTop > (LONG) surface->bitmap_info.cy) + prcl_begin_paint_rect->yTop = (LONG) surface->bitmap_info.cy; + + /* Exit if the rectangle is empty */ + if (prcl_begin_paint_rect->xLeft >= prcl_begin_paint_rect->xRight || + prcl_begin_paint_rect->yBottom >= prcl_begin_paint_rect->yTop) + return; + + /* Set the Target & Source coordinates */ + *((PRECTL)&aptlPoints[0]) = *prcl_begin_paint_rect; + *((PRECTL)&aptlPoints[2]) = *prcl_begin_paint_rect; + + /* Make the Target coordinates non-inclusive */ + aptlPoints[1].x -= 1; + aptlPoints[1].y -= 1; + + /* Enable Y Inversion for the HPS, so GpiDrawBits will + * work with upside-top image, not with upside-down image! + */ + lOldYInversion = GpiQueryYInversion (hps_begin_paint); + GpiEnableYInversion (hps_begin_paint, surface->bitmap_info.cy-1); + + /* Debug code to draw rectangle limits */ +#if 0 + { + int x, y; + unsigned char *pixels; + + pixels = surface->pixels; + for (x = 0; x < surface->bitmap_info.cx; x++) { + for (y = 0; y < surface->bitmap_info.cy; y++) { + if ((x == 0) || + (y == 0) || + (x == y) || + (x >= surface->bitmap_info.cx-1) || + (y >= surface->bitmap_info.cy-1)) + { + pixels[y*surface->bitmap_info.cx*4+x*4] = 255; + } + } + } + } +#endif + if (!surface->use_24bpp) { + rc = GpiDrawBits (hps_begin_paint, + surface->pixels, + &(surface->bitmap_info), + 4, + aptlPoints, + ROP_SRCCOPY, + BBO_IGNORE); + if (rc != GPI_OK) + surface->use_24bpp = TRUE; + } + + if (surface->use_24bpp) { + /* If GpiDrawBits () failed then this is most likely because the + * display driver could not handle a 32bit bitmap. So we need to + * - create a buffer that only contains 3 bytes per pixel + * - change the bitmap info header to contain 24bit + * - pass the new buffer to GpiDrawBits () again + * - clean up the new buffer + */ + BITMAPINFO2 bmpinfo; + unsigned char *pchPixBuf; + unsigned char *pchTarget; + ULONG *pulSource; + ULONG ulX; + ULONG ulY; + ULONG ulPad; + + /* Set up the bitmap header, but this time for 24bit depth. */ + bmpinfo = surface->bitmap_info; + bmpinfo.cBitCount = 24; + + /* The start of each row has to be DWORD aligned. Calculate the + * of number aligned bytes per row, the total size of the bitmap, + * and the number of padding bytes at the end of each row. + */ + ulX = (((bmpinfo.cx * bmpinfo.cBitCount) + 31) / 32) * 4; + bmpinfo.cbImage = ulX * bmpinfo.cy; + ulPad = ulX - bmpinfo.cx * 3; + + /* Allocate temporary pixel buffer. If the rows don't need + * padding, it has to be 1 byte larger than the size of the + * bitmap or else the high-order byte from the last source + * row will end up in unallocated memory. + */ + pchPixBuf = (unsigned char *)_buffer_alloc (1, 1, + bmpinfo.cbImage + (ulPad ? 0 : 1)); + + if (pchPixBuf) { + /* Copy 4 bytes from the source but advance the target ptr only + * 3 bytes, so the high-order alpha byte will be overwritten by + * the next copy. At the end of each row, skip over the padding. + */ + pchTarget = pchPixBuf; + pulSource = (ULONG*)surface->pixels; + for (ulY = bmpinfo.cy; ulY; ulY--) { + for (ulX = bmpinfo.cx; ulX; ulX--) { + *((ULONG*)pchTarget) = *pulSource++; + pchTarget += 3; + } + pchTarget += ulPad; + } + + rc = GpiDrawBits (hps_begin_paint, + pchPixBuf, + &bmpinfo, + 4, + aptlPoints, + ROP_SRCCOPY, + BBO_IGNORE); + if (rc != GPI_OK) + surface->use_24bpp = FALSE; + + _buffer_free (pchPixBuf); + } + } + + /* Restore Y inversion */ + GpiEnableYInversion (hps_begin_paint, lOldYInversion); +} + +static void +_cairo_os2_surface_get_pixels_from_screen (cairo_os2_surface_t *surface, + HPS hps_begin_paint, + PRECTL prcl_begin_paint_rect) +{ + HPS hps; + HDC hdc; + SIZEL sizlTemp; + HBITMAP hbmpTemp; + BITMAPINFO2 bmi2Temp; + POINTL aptlPoints[4]; + int y; + unsigned char *pchTemp; + + /* To copy pixels from screen to our buffer, we do the following steps: + * + * - Blit pixels from screen to a HBITMAP: + * -- Create Memory Device Context + * -- Create a PS into it + * -- Create a HBITMAP + * -- Select HBITMAP into memory PS + * -- Blit dirty pixels from screen to HBITMAP + * - Copy HBITMAP lines (pixels) into our buffer + * - Free resources + */ + + /* Create a memory device context */ + hdc = DevOpenDC (0, OD_MEMORY,"*",0L, NULL, NULLHANDLE); + if (!hdc) { + return; + } + + /* Create a memory PS */ + sizlTemp.cx = prcl_begin_paint_rect->xRight - prcl_begin_paint_rect->xLeft; + sizlTemp.cy = prcl_begin_paint_rect->yTop - prcl_begin_paint_rect->yBottom; + hps = GpiCreatePS (0, + hdc, + &sizlTemp, + PU_PELS | GPIT_NORMAL | GPIA_ASSOC); + if (!hps) { + DevCloseDC (hdc); + return; + } + + /* Create an uninitialized bitmap. */ + /* Prepare BITMAPINFO2 structure for our buffer */ + memset (&bmi2Temp, 0, sizeof (bmi2Temp)); + bmi2Temp.cbFix = sizeof (BITMAPINFOHEADER2); + bmi2Temp.cx = sizlTemp.cx; + bmi2Temp.cy = sizlTemp.cy; + bmi2Temp.cPlanes = 1; + bmi2Temp.cBitCount = 32; + + hbmpTemp = GpiCreateBitmap (hps, + (PBITMAPINFOHEADER2) &bmi2Temp, + 0, + NULL, + NULL); + + if (!hbmpTemp) { + GpiDestroyPS (hps); + DevCloseDC (hdc); + return; + } + + /* Select the bitmap into the memory device context. */ + GpiSetBitmap (hps, hbmpTemp); + + /* Target coordinates (Noninclusive) */ + aptlPoints[0].x = 0; + aptlPoints[0].y = 0; + + aptlPoints[1].x = sizlTemp.cx; + aptlPoints[1].y = sizlTemp.cy; + + /* Source coordinates (Inclusive) */ + aptlPoints[2].x = prcl_begin_paint_rect->xLeft; + aptlPoints[2].y = surface->bitmap_info.cy - prcl_begin_paint_rect->yBottom; + + aptlPoints[3].x = prcl_begin_paint_rect->xRight; + aptlPoints[3].y = surface->bitmap_info.cy - prcl_begin_paint_rect->yTop; + + /* Blit pixels from screen to bitmap */ + GpiBitBlt (hps, + hps_begin_paint, + 4, + aptlPoints, + ROP_SRCCOPY, + BBO_IGNORE); + + /* Now we have to extract the pixels from the bitmap. */ + pchTemp = + surface->pixels + + (prcl_begin_paint_rect->yBottom)*surface->bitmap_info.cx*4 + + prcl_begin_paint_rect->xLeft*4; + for (y = 0; y < sizlTemp.cy; y++) { + /* Get one line of pixels */ + GpiQueryBitmapBits (hps, + sizlTemp.cy - y - 1, /* lScanStart */ + 1, /* lScans */ + (PBYTE)pchTemp, + &bmi2Temp); + + /* Go for next line */ + pchTemp += surface->bitmap_info.cx*4; + } + + /* Clean up resources */ + GpiSetBitmap (hps, (HBITMAP) NULL); + GpiDeleteBitmap (hbmpTemp); + GpiDestroyPS (hps); + DevCloseDC (hdc); +} + +static cairo_status_t +_cairo_os2_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_os2_surface_t *surface = (cairo_os2_surface_t *) abstract_surface; + + DosRequestMutexSem (surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); + + /* Increase lend counter */ + surface->pixel_array_lend_count++; + + *image_out = surface->image_surface; + *image_extra = NULL; + + DosReleaseMutexSem (surface->hmtx_use_private_fields); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_os2_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_os2_surface_t *surface = (cairo_os2_surface_t *) abstract_surface; + + /* Decrease Lend counter! */ + DosRequestMutexSem (surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); + + if (surface->pixel_array_lend_count > 0) + surface->pixel_array_lend_count--; + DosPostEventSem (surface->hev_pixel_array_came_back); + + DosReleaseMutexSem (surface->hmtx_use_private_fields); +} + +static cairo_image_surface_t * +_cairo_os2_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_os2_surface_t *surface = (cairo_os2_surface_t *) abstract_surface; + + DosRequestMutexSem (surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); + /* Increase lend counter */ + surface->pixel_array_lend_count++; + DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); + + /* XXX: BROKEN! */ + *image_out = _cairo_surface_create_for_rectangle_int (surface->image_surface, + extents); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_os2_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_os2_surface_t *surface = (cairo_os2_surface_t *) abstract_surface; + + /* So, we got back the image, and if all goes well, then + * something has been changed inside the interest_rect. + * So, we blit it to the screen! + */ + if (surface->blit_as_changes) { + RECTL rclToBlit; + + /* Get mutex, we'll work with the pixel array! */ + if (DosRequestMutexSem (surface->hmtx_use_private_fields, + SEM_INDEFINITE_WAIT) != NO_ERROR) + { + /* Could not get mutex! */ + return; + } + + rclToBlit.xLeft = image->base.device_transform_inverse.x0; + rclToBlit.xRight = rclToBlit.xLeft + image->width; /* Noninclusive */ + rclToBlit.yTop = image->base.device_transform_inverse.y0; + rclToBlit.yBottom = rclToBlit.yTop + image->height; /* Noninclusive */ + + if (surface->hwnd_client_window) { + /* We know the HWND, so let's invalidate the window region, + * so the application will redraw itself, using the + * cairo_os2_surface_refresh_window () API from its own PM thread. + * + * This is the safe method, which should be preferred every time. + */ + rclToBlit.yTop = surface->bitmap_info.cy - rclToBlit.yTop; + rclToBlit.yBottom = surface->bitmap_info.cy - rclToBlit.yTop; + WinInvalidateRect (surface->hwnd_client_window, + &rclToBlit, + FALSE); + } else { + /* We don't know the HWND, so try to blit the pixels from here! + * Please note that it can be problematic if this is not the PM thread! + * + * It can cause internal PM stuffs to be screwed up, for some reason. + * Please always tell the HWND to the surface using the + * cairo_os2_surface_set_hwnd () API, and call cairo_os2_surface_refresh_window () + * from your WM_PAINT, if it's possible! + */ + _cairo_os2_surface_blit_pixels (surface, + surface->hps_client_window, + &rclToBlit); + } + + DosReleaseMutexSem (surface->hmtx_use_private_fields); + } + /* Also decrease Lend counter! */ + DosRequestMutexSem (surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); + + if (surface->pixel_array_lend_count > 0) + surface->pixel_array_lend_count--; + DosPostEventSem (surface->hev_pixel_array_came_back); + + DosReleaseMutexSem (surface->hmtx_use_private_fields); +} + +static cairo_bool_t +_cairo_os2_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_os2_surface_t *surface = (cairo_os2_surface_t *) abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = surface->bitmap_info.cx; + rectangle->height = surface->bitmap_info.cy; + + return TRUE; +} + +/** + * cairo_os2_surface_create: + * @hps_client_window: the presentation handle to bind the surface to + * @width: the width of the surface + * @height: the height of the surface + * + * Create a Cairo surface which is bound to a given presentation space (HPS). + * The caller retains ownership of the HPS and must dispose of it after the + * the surface has been destroyed. The surface will be created to have the + * given size. By default every change to the surface will be made visible + * immediately by blitting it into the window. This can be changed with + * cairo_os2_surface_set_manual_window_refresh(). + * Note that the surface will contain garbage when created, so the pixels + * have to be initialized by hand first. You can use the Cairo functions to + * fill it with black, or use cairo_surface_mark_dirty() to fill the surface + * with pixels from the window/HPS. + * + * Return value: the newly created surface + * + * Since: 1.4 + **/ +cairo_surface_t * +cairo_os2_surface_create (HPS hps_client_window, + int width, + int height) +{ + cairo_os2_surface_t *local_os2_surface = 0; + cairo_status_t status; + int rc; + + /* Check the size of the window */ + if ((width <= 0) || (height <= 0)) { + status = _cairo_error (CAIRO_STATUS_INVALID_SIZE); + goto error_exit; + } + + /* Allocate an OS/2 surface structure. */ + local_os2_surface = (cairo_os2_surface_t *) malloc (sizeof (cairo_os2_surface_t)); + if (!local_os2_surface) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto error_exit; + } + + memset(local_os2_surface, 0, sizeof(cairo_os2_surface_t)); + + /* Allocate resources: mutex & event semaphores and the pixel buffer */ + if (DosCreateMutexSem (NULL, + &(local_os2_surface->hmtx_use_private_fields), + 0, + FALSE)) + { + status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + goto error_exit; + } + + if (DosCreateEventSem (NULL, + &(local_os2_surface->hev_pixel_array_came_back), + 0, + FALSE)) + { + status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + goto error_exit; + } + + local_os2_surface->pixels = (unsigned char *) _buffer_alloc (height, width, 4); + if (!local_os2_surface->pixels) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto error_exit; + } + + /* Create image surface from pixel array */ + local_os2_surface->image_surface = (cairo_image_surface_t *) + cairo_image_surface_create_for_data (local_os2_surface->pixels, + CAIRO_FORMAT_ARGB32, + width, /* Width */ + height, /* Height */ + width * 4); /* Rowstride */ + status = local_os2_surface->image_surface->base.status; + if (status) + goto error_exit; + + /* Set values for OS/2-specific data that aren't zero/NULL/FALSE. + * Note: hps_client_window may be null if this was called by + * cairo_os2_surface_create_for_window(). + */ + local_os2_surface->hps_client_window = hps_client_window; + local_os2_surface->blit_as_changes = TRUE; + + /* Prepare BITMAPINFO2 structure for our buffer */ + local_os2_surface->bitmap_info.cbFix = sizeof (BITMAPINFOHEADER2); + local_os2_surface->bitmap_info.cx = width; + local_os2_surface->bitmap_info.cy = height; + local_os2_surface->bitmap_info.cPlanes = 1; + local_os2_surface->bitmap_info.cBitCount = 32; + + /* Initialize base surface */ + _cairo_surface_init (&local_os2_surface->base, + &cairo_os2_surface_backend, + NULL, /* device */ + _cairo_content_from_format (CAIRO_FORMAT_ARGB32)); + + /* Successful exit */ + return (cairo_surface_t *)local_os2_surface; + + error_exit: + + /* This point will only be reached if an error occurred */ + + if (local_os2_surface) { + if (local_os2_surface->pixels) + _buffer_free (local_os2_surface->pixels); + if (local_os2_surface->hev_pixel_array_came_back) + DosCloseEventSem (local_os2_surface->hev_pixel_array_came_back); + if (local_os2_surface->hmtx_use_private_fields) + DosCloseMutexSem (local_os2_surface->hmtx_use_private_fields); + free (local_os2_surface); + } + + return _cairo_surface_create_in_error (status); +} + +/** + * cairo_os2_surface_create_for_window: + * @hwnd_client_window: the window handle to bind the surface to + * @width: the width of the surface + * @height: the height of the surface + * + * Create a Cairo surface which is bound to a given window; the caller retains + * ownership of the window. This is a convenience function for use with + * windows that will only be updated when cairo_os2_surface_refresh_window() + * is called (usually in response to a WM_PAINT message). It avoids the need + * to create a persistent HPS for every window and assumes that one will be + * supplied by the caller when a cairo function needs one. If it isn't, an + * HPS will be created on-the-fly and released before the function which needs + * it returns. + * + * Return value: the newly created surface + * + * Since: 1.10 + **/ +cairo_surface_t * +cairo_os2_surface_create_for_window (HWND hwnd_client_window, + int width, + int height) +{ + cairo_os2_surface_t *local_os2_surface; + + /* A window handle must be provided. */ + if (!hwnd_client_window) { + return _cairo_surface_create_in_error ( + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + /* Create the surface. */ + local_os2_surface = (cairo_os2_surface_t *) + cairo_os2_surface_create (0, width, height); + + /* If successful, save the hwnd & turn off automatic repainting. */ + if (!local_os2_surface->image_surface->base.status) { + local_os2_surface->hwnd_client_window = hwnd_client_window; + local_os2_surface->blit_as_changes = FALSE; + } + + return (cairo_surface_t *)local_os2_surface; +} + +/** + * cairo_os2_surface_set_size: + * @surface: the cairo surface to resize + * @new_width: the new width of the surface + * @new_height: the new height of the surface + * @timeout: timeout value in milliseconds + * + * When the client window is resized, call this API to set the new size in the + * underlying surface accordingly. This function will reallocate everything, + * so you'll have to redraw everything in the surface after this call. + * The surface will contain garbage after the resizing. So the notes of + * cairo_os2_surface_create() apply here, too. + * + * The timeout value specifies how long the function should wait on other parts + * of the program to release the buffers. It is necessary, because it can happen + * that Cairo is just drawing something into the surface while we want to + * destroy and recreate it. + * + * Return value: %CAIRO_STATUS_SUCCESS if the surface could be resized, + * %CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface is not an OS/2 surface, + * %CAIRO_STATUS_INVALID_SIZE for invalid sizes + * %CAIRO_STATUS_NO_MEMORY if the new size could not be allocated, or if the + * timeout happened before all the buffers were released + * + * Since: 1.4 + **/ +int +cairo_os2_surface_set_size (cairo_surface_t *surface, + int new_width, + int new_height, + int timeout) +{ + cairo_os2_surface_t *local_os2_surface; + unsigned char *pchNewPixels; + int rc; + cairo_image_surface_t *pNewImageSurface; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + } + + if ((new_width <= 0) || + (new_height <= 0)) + { + /* Invalid size! */ + return _cairo_error (CAIRO_STATUS_INVALID_SIZE); + } + + /* Allocate memory for new stuffs */ + pchNewPixels = (unsigned char *) _buffer_alloc (new_height, new_width, 4); + if (!pchNewPixels) { + /* Not enough memory for the pixels! + * Everything remains the same! + */ + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* Create image surface from new pixel array */ + pNewImageSurface = (cairo_image_surface_t *) + cairo_image_surface_create_for_data (pchNewPixels, + CAIRO_FORMAT_ARGB32, + new_width, /* Width */ + new_height, /* Height */ + new_width * 4); /* Rowstride */ + + if (pNewImageSurface->base.status) { + /* Could not create image surface! + * Everything remains the same! + */ + _buffer_free (pchNewPixels); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* Okay, new memory allocated, so it's time to swap old buffers + * to new ones! + */ + if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT)!=NO_ERROR) { + /* Could not get mutex! + * Everything remains the same! + */ + cairo_surface_destroy ((cairo_surface_t *) pNewImageSurface); + _buffer_free (pchNewPixels); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* We have to make sure that we won't destroy a surface which + * is lent to some other code (Cairo is drawing into it)! + */ + while (local_os2_surface->pixel_array_lend_count > 0) { + ULONG ulPostCount; + DosResetEventSem (local_os2_surface->hev_pixel_array_came_back, &ulPostCount); + DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); + /* Wait for somebody to return the pixels! */ + rc = DosWaitEventSem (local_os2_surface->hev_pixel_array_came_back, timeout); + if (rc != NO_ERROR) { + /* Either timeout or something wrong... Exit. */ + cairo_surface_destroy ((cairo_surface_t *) pNewImageSurface); + _buffer_free (pchNewPixels); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + /* Okay, grab mutex and check counter again! */ + if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) + != NO_ERROR) + { + /* Could not get mutex! + * Everything remains the same! + */ + cairo_surface_destroy ((cairo_surface_t *) pNewImageSurface); + _buffer_free (pchNewPixels); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + /* Destroy old image surface */ + cairo_surface_destroy ((cairo_surface_t *) (local_os2_surface->image_surface)); + /* Destroy old pixel buffer */ + _buffer_free (local_os2_surface->pixels); + /* Set new image surface */ + local_os2_surface->image_surface = pNewImageSurface; + /* Set new pixel buffer */ + local_os2_surface->pixels = pchNewPixels; + /* Change bitmap2 structure */ + local_os2_surface->bitmap_info.cx = new_width; + local_os2_surface->bitmap_info.cy = new_height; + + DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_os2_surface_refresh_window: + * @surface: the cairo surface to refresh + * @hps_begin_paint: the presentation handle of the window to refresh + * @prcl_begin_paint_rect: the rectangle to redraw + * + * This function can be used to force a repaint of a given area of the client + * window. It should usually be called from the WM_PAINT processing of the + * window procedure. However, it can be called any time a given part of the + * window has to be updated. + * + * The HPS and RECTL to be passed can be taken from the usual WinBeginPaint call + * of the window procedure, but you can also get the HPS using WinGetPS, and you + * can assemble your own update rectangle by hand. + * If hps_begin_paint is %NULL, the function will use the HPS passed into + * cairo_os2_surface_create(). If @prcl_begin_paint_rect is %NULL, the function + * will query the current window size and repaint the whole window. + * + * Cairo assumes that if you set the HWND to the surface using + * cairo_os2_surface_set_hwnd(), this function will be called by the application + * every time it gets a WM_PAINT for that HWND. If the HWND is set in the + * surface, Cairo uses this function to handle dirty areas too. + * + * Since: 1.4 + **/ +void +cairo_os2_surface_refresh_window (cairo_surface_t *surface, + HPS hps_begin_paint, + PRECTL prcl_begin_paint_rect) +{ + cairo_os2_surface_t *local_os2_surface; + RECTL rclTemp; + HPS hpsTemp = 0; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return; + } + + /* If an HPS wasn't provided, see if we can get one. */ + if (!hps_begin_paint) { + hps_begin_paint = local_os2_surface->hps_client_window; + if (!hps_begin_paint) { + if (local_os2_surface->hwnd_client_window) { + hpsTemp = WinGetPS(local_os2_surface->hwnd_client_window); + hps_begin_paint = hpsTemp; + } + /* No HPS & no way to get one, so exit */ + if (!hps_begin_paint) + return; + } + } + + if (prcl_begin_paint_rect == NULL) { + /* Update the whole window! */ + rclTemp.xLeft = 0; + rclTemp.xRight = local_os2_surface->bitmap_info.cx; + rclTemp.yTop = local_os2_surface->bitmap_info.cy; + rclTemp.yBottom = 0; + } else { + /* Use the rectangle we got passed as parameter! */ + rclTemp.xLeft = prcl_begin_paint_rect->xLeft; + rclTemp.xRight = prcl_begin_paint_rect->xRight; + rclTemp.yTop = local_os2_surface->bitmap_info.cy - prcl_begin_paint_rect->yBottom; + rclTemp.yBottom = local_os2_surface->bitmap_info.cy - prcl_begin_paint_rect->yTop ; + } + + /* Get mutex, we'll work with the pixel array! */ + if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) + != NO_ERROR) + { + /* Could not get mutex! */ + if (hpsTemp) + WinReleasePS(hpsTemp); + return; + } + + if ((local_os2_surface->dirty_area_present) && + (local_os2_surface->rcl_dirty_area.xLeft == rclTemp.xLeft) && + (local_os2_surface->rcl_dirty_area.xRight == rclTemp.xRight) && + (local_os2_surface->rcl_dirty_area.yTop == rclTemp.yTop) && + (local_os2_surface->rcl_dirty_area.yBottom == rclTemp.yBottom)) + { + /* Aha, this call was because of a dirty area, so in this case we + * have to blit the pixels from the screen to the surface! + */ + local_os2_surface->dirty_area_present = FALSE; + _cairo_os2_surface_get_pixels_from_screen (local_os2_surface, + hps_begin_paint, + &rclTemp); + } else { + /* Okay, we have the surface, have the HPS + * (might be from WinBeginPaint () or from WinGetPS () ) + * Now blit there the stuffs! + */ + _cairo_os2_surface_blit_pixels (local_os2_surface, + hps_begin_paint, + &rclTemp); + } + + DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); + + if (hpsTemp) + WinReleasePS(hpsTemp); +} + +static cairo_status_t +_cairo_os2_surface_finish (void *abstract_surface) +{ + cairo_os2_surface_t *local_os2_surface; + + local_os2_surface = (cairo_os2_surface_t *) abstract_surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + } + + DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); + + /* Destroy old image surface */ + cairo_surface_destroy ((cairo_surface_t *) (local_os2_surface->image_surface)); + /* Destroy old pixel buffer */ + _buffer_free (local_os2_surface->pixels); + DosCloseMutexSem (local_os2_surface->hmtx_use_private_fields); + DosCloseEventSem (local_os2_surface->hev_pixel_array_came_back); + + /* The memory itself will be free'd by the cairo_surface_destroy () + * who called us. + */ + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_os2_surface_set_hwnd: + * @surface: the cairo surface to associate with the window handle + * @hwnd_client_window: the window handle of the client window + * + * Sets window handle for surface; the caller retains ownership of the window. + * If Cairo wants to blit into the window because it is set to blit as the + * surface changes (see cairo_os2_surface_set_manual_window_refresh()), then + * there are two ways it can choose: + * If it knows the HWND of the surface, then it invalidates that area, so the + * application will get a WM_PAINT message and it can call + * cairo_os2_surface_refresh_window() to redraw that area. Otherwise cairo itself + * will use the HPS it got at surface creation time, and blit the pixels itself. + * It's also a solution, but experience shows that if this happens from a non-PM + * thread, then it can screw up PM internals. + * + * So, best solution is to set the HWND for the surface after the surface + * creation, so every blit will be done from application's message processing + * loop, which is the safest way to do. + * + * Since: 1.4 + **/ +void +cairo_os2_surface_set_hwnd (cairo_surface_t *surface, + HWND hwnd_client_window) +{ + cairo_os2_surface_t *local_os2_surface; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return; + } + + if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) + != NO_ERROR) + { + /* Could not get mutex! */ + return; + } + + local_os2_surface->hwnd_client_window = hwnd_client_window; + + DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); +} + +/** + * cairo_os2_surface_set_manual_window_refresh: + * @surface: the cairo surface to set the refresh mode for + * @manual_refresh: the switch for manual surface refresh + * + * This API can tell Cairo if it should show every change to this surface + * immediately in the window or if it should be cached and will only be visible + * once the user calls cairo_os2_surface_refresh_window() explicitly. If the + * HWND was not set in the cairo surface, then the HPS will be used to blit the + * graphics. Otherwise it will invalidate the given window region so the user + * will get the WM_PAINT message to redraw that area of the window. + * + * So, if you're only interested in displaying the final result after several + * drawing operations, you might get better performance if you put the surface + * into manual refresh mode by passing a true value to this function. Then call + * cairo_os2_surface_refresh() whenever desired. + * + * Since: 1.4 + **/ +void +cairo_os2_surface_set_manual_window_refresh (cairo_surface_t *surface, + cairo_bool_t manual_refresh) +{ + cairo_os2_surface_t *local_os2_surface; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return; + } + + local_os2_surface->blit_as_changes = !manual_refresh; +} + +/** + * cairo_os2_surface_get_manual_window_refresh: + * @surface: the cairo surface to query the refresh mode from + * + * This space left intentionally blank. + * + * Return value: current refresh mode of the surface (true by default) + * + * Since: 1.4 + **/ +cairo_bool_t +cairo_os2_surface_get_manual_window_refresh (cairo_surface_t *surface) +{ + cairo_os2_surface_t *local_os2_surface; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return FALSE; + } + + return !(local_os2_surface->blit_as_changes); +} + +/** + * cairo_os2_surface_get_hps: + * @surface: the cairo surface to be querued + * @hps: HPS currently associated with the surface (if any) + * + * This API retrieves the HPS associated with the surface. + * + * Return value: %CAIRO_STATUS_SUCCESS if the hps could be retrieved, + * %CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface is not an OS/2 surface, + * %CAIRO_STATUS_NULL_POINTER if the hps argument is null + * + * Since: 1.10 + **/ +cairo_status_t +cairo_os2_surface_get_hps (cairo_surface_t *surface, + HPS *hps) +{ + cairo_os2_surface_t *local_os2_surface; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + } + if (!hps) + { + return _cairo_error (CAIRO_STATUS_NULL_POINTER); + } + *hps = local_os2_surface->hps_client_window; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_os2_surface_set_hps: + * @surface: the cairo surface to associate with the HPS + * @hps: new HPS to be associated with the surface (the HPS may be null) + * + * This API replaces the HPS associated with the surface with a new one. + * The caller retains ownership of the HPS and must dispose of it after + * the surface has been destroyed or it has been replaced by another + * call to this function. + * + * Return value: %CAIRO_STATUS_SUCCESS if the hps could be replaced, + * %CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface is not an OS/2 surface, + * + * Since: 1.10 + **/ +cairo_status_t +cairo_os2_surface_set_hps (cairo_surface_t *surface, + HPS hps) +{ + cairo_os2_surface_t *local_os2_surface; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + } + local_os2_surface->hps_client_window = hps; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_os2_surface_mark_dirty_rectangle (void *surface, + int x, + int y, + int width, + int height) +{ + cairo_os2_surface_t *local_os2_surface; + RECTL rclToBlit; + + local_os2_surface = (cairo_os2_surface_t *) surface; + if ((!local_os2_surface) || + (local_os2_surface->base.backend != &cairo_os2_surface_backend)) + { + /* Invalid parameter (wrong surface)! */ + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + } + + /* Get mutex, we'll work with the pixel array! */ + if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) + != NO_ERROR) + { + /* Could not get mutex! */ + return CAIRO_STATUS_NO_MEMORY; + } + + /* Check for defaults */ + if (width < 0) + width = local_os2_surface->bitmap_info.cx; + if (height < 0) + height = local_os2_surface->bitmap_info.cy; + + if (local_os2_surface->hwnd_client_window) { + /* We know the HWND, so let's invalidate the window region, + * so the application will redraw itself, using the + * cairo_os2_surface_refresh_window () API from its own PM thread. + * From that function we'll note that it's not a redraw but a + * dirty-rectangle deal stuff, so we'll handle the things from + * there. + * + * This is the safe method, which should be preferred every time. + */ + rclToBlit.xLeft = x; + rclToBlit.xRight = x + width; /* Noninclusive */ + rclToBlit.yTop = local_os2_surface->bitmap_info.cy - (y); + rclToBlit.yBottom = local_os2_surface->bitmap_info.cy - (y + height); /* Noninclusive */ + +#if 0 + if (local_os2_surface->dirty_area_present) { + /* Yikes, there is already a dirty area which should be + * cleaned up, but we'll overwrite it. Sorry. + * TODO: Something clever should be done here. + */ + } +#endif + + /* Set up dirty area reminder stuff */ + memcpy (&(local_os2_surface->rcl_dirty_area), &rclToBlit, sizeof (RECTL)); + local_os2_surface->dirty_area_present = TRUE; + + /* Invalidate window area */ + WinInvalidateRect (local_os2_surface->hwnd_client_window, + &rclToBlit, + FALSE); + } else { + /* We don't know the HWND, so try to blit the pixels from here! + * Please note that it can be problematic if this is not the PM thread! + * + * It can cause internal PM stuffs to be scewed up, for some reason. + * Please always tell the HWND to the surface using the + * cairo_os2_surface_set_hwnd () API, and call cairo_os2_surface_refresh_window () + * from your WM_PAINT, if it's possible! + */ + + rclToBlit.xLeft = x; + rclToBlit.xRight = x + width; /* Noninclusive */ + rclToBlit.yBottom = y; + rclToBlit.yTop = y + height; /* Noninclusive */ + /* Now get the pixels from the screen! */ + _cairo_os2_surface_get_pixels_from_screen (local_os2_surface, + local_os2_surface->hps_client_window, + &rclToBlit); + } + + DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t cairo_os2_surface_backend = { + CAIRO_SURFACE_TYPE_OS2, + _cairo_os2_surface_finish, + _cairo_default_context_create, + + NULL, /* create_similar */ + NULL, /* create_similar_image */ + _cairo_os2_surface_map_to_image, + _cairo_os2_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_os2_surface_acquire_source_image, + _cairo_os2_surface_release_source_image, + NULL, /* snapshot */ + + _cairo_os2_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + _cairo_os2_surface_mark_dirty_rectangle, + + _cairo_surface_fallback_paint, + _cairo_surface_fallback_mask, + _cairo_surface_fallback_fill, + _cairo_surface_fallback_stroke, + NULL, /* fill/stroke */ + _cairo_surface_fallback_glyphs, +}; diff --git a/src/cairo-os2.h b/src/cairo-os2.h new file mode 100644 index 000000000..d23f2dec4 --- /dev/null +++ b/src/cairo-os2.h @@ -0,0 +1,110 @@ +/* vim: set sw=4 sts=4 et cin: */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2005-2006 netlabs.org + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is + * Doodle + * + * Contributor(s): + * Peter Weilbacher + * Rich Walsh + */ + +#ifndef _CAIRO_OS2_H_ +#define _CAIRO_OS2_H_ + +#define INCL_DOS +#define INCL_DOSSEMAPHORES +#define INCL_DOSERRORS +#define INCL_WIN +#define INCL_GPI + +#include "cairo.h" + +#include + +CAIRO_BEGIN_DECLS + +/* The OS/2 Specific Cairo API */ + +cairo_public void +cairo_os2_init (void); + +cairo_public void +cairo_os2_fini (void); + +#if CAIRO_HAS_OS2_SURFACE + +cairo_public cairo_surface_t * +cairo_os2_surface_create (HPS hps_client_window, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_os2_surface_create_for_window (HWND hwnd_client_window, + int width, + int height); + +cairo_public void +cairo_os2_surface_set_hwnd (cairo_surface_t *surface, + HWND hwnd_client_window); + +cairo_public int +cairo_os2_surface_set_size (cairo_surface_t *surface, + int new_width, + int new_height, + int timeout); + +cairo_public void +cairo_os2_surface_refresh_window (cairo_surface_t *surface, + HPS hps_begin_paint, + PRECTL prcl_begin_paint_rect); + +cairo_public void +cairo_os2_surface_set_manual_window_refresh (cairo_surface_t *surface, + cairo_bool_t manual_refresh); + +cairo_public cairo_bool_t +cairo_os2_surface_get_manual_window_refresh (cairo_surface_t *surface); + +cairo_public cairo_status_t +cairo_os2_surface_get_hps (cairo_surface_t *surface, + HPS *hps); + +cairo_public cairo_status_t +cairo_os2_surface_set_hps (cairo_surface_t *surface, + HPS hps); + +#else /* CAIRO_HAS_OS2_SURFACE */ +# error Cairo was not compiled with support for the OS/2 backend +#endif /* CAIRO_HAS_OS2_SURFACE */ + +CAIRO_END_DECLS + +#endif /* _CAIRO_OS2_H_ */ diff --git a/src/cairo-output-stream-private.h b/src/cairo-output-stream-private.h new file mode 100644 index 000000000..2542646b8 --- /dev/null +++ b/src/cairo-output-stream-private.h @@ -0,0 +1,201 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Author(s): + * Kristian Høgsberg + */ + +#ifndef CAIRO_OUTPUT_STREAM_PRIVATE_H +#define CAIRO_OUTPUT_STREAM_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" + +#include +#include +#include + +typedef cairo_status_t +(*cairo_output_stream_write_func_t) (cairo_output_stream_t *output_stream, + const unsigned char *data, + unsigned int length); + +typedef cairo_status_t +(*cairo_output_stream_flush_func_t) (cairo_output_stream_t *output_stream); + +typedef cairo_status_t +(*cairo_output_stream_close_func_t) (cairo_output_stream_t *output_stream); + +struct _cairo_output_stream { + cairo_output_stream_write_func_t write_func; + cairo_output_stream_flush_func_t flush_func; + cairo_output_stream_close_func_t close_func; + unsigned long position; + cairo_status_t status; + cairo_bool_t closed; +}; + +extern const cairo_private cairo_output_stream_t _cairo_output_stream_nil; + +cairo_private void +_cairo_output_stream_init (cairo_output_stream_t *stream, + cairo_output_stream_write_func_t write_func, + cairo_output_stream_flush_func_t flush_func, + cairo_output_stream_close_func_t close_func); + +cairo_private cairo_status_t +_cairo_output_stream_fini (cairo_output_stream_t *stream); + + +/* We already have the following declared in cairo.h: + +typedef cairo_status_t (*cairo_write_func_t) (void *closure, + const unsigned char *data, + unsigned int length); +*/ +typedef cairo_status_t (*cairo_close_func_t) (void *closure); + + +/* This function never returns %NULL. If an error occurs (NO_MEMORY) + * while trying to create the output stream this function returns a + * valid pointer to a nil output stream. + * + * Note that even with a nil surface, the close_func callback will be + * called by a call to _cairo_output_stream_close or + * _cairo_output_stream_destroy. + */ +cairo_private cairo_output_stream_t * +_cairo_output_stream_create (cairo_write_func_t write_func, + cairo_close_func_t close_func, + void *closure); + +cairo_private cairo_output_stream_t * +_cairo_output_stream_create_in_error (cairo_status_t status); + +/* Tries to flush any buffer maintained by the stream or its delegates. */ +cairo_private cairo_status_t +_cairo_output_stream_flush (cairo_output_stream_t *stream); + +/* Returns the final status value associated with this object, just + * before its last gasp. This final status value will capture any + * status failure returned by the stream's close_func as well. */ +cairo_private cairo_status_t +_cairo_output_stream_close (cairo_output_stream_t *stream); + +/* Returns the final status value associated with this object, just + * before its last gasp. This final status value will capture any + * status failure returned by the stream's close_func as well. */ +cairo_private cairo_status_t +_cairo_output_stream_destroy (cairo_output_stream_t *stream); + +cairo_private void +_cairo_output_stream_write (cairo_output_stream_t *stream, + const void *data, size_t length); + +cairo_private void +_cairo_output_stream_write_hex_string (cairo_output_stream_t *stream, + const unsigned char *data, + size_t length); + +cairo_private void +_cairo_output_stream_vprintf (cairo_output_stream_t *stream, + const char *fmt, + va_list ap) CAIRO_PRINTF_FORMAT ( 2, 0); + +cairo_private void +_cairo_output_stream_printf (cairo_output_stream_t *stream, + const char *fmt, + ...) CAIRO_PRINTF_FORMAT (2, 3); + +/* Print matrix element values with rounding of insignificant digits. */ +cairo_private void +_cairo_output_stream_print_matrix (cairo_output_stream_t *stream, + const cairo_matrix_t *matrix); + +cairo_private long +_cairo_output_stream_get_position (cairo_output_stream_t *stream); + +cairo_private cairo_status_t +_cairo_output_stream_get_status (cairo_output_stream_t *stream); + +/* This function never returns %NULL. If an error occurs (NO_MEMORY or + * WRITE_ERROR) while trying to create the output stream this function + * returns a valid pointer to a nil output stream. + * + * Note: Even if a nil surface is returned, the caller should still + * call _cairo_output_stream_destroy (or _cairo_output_stream_close at + * least) in order to ensure that everything is properly cleaned up. + */ +cairo_private cairo_output_stream_t * +_cairo_output_stream_create_for_filename (const char *filename); + +/* This function never returns %NULL. If an error occurs (NO_MEMORY or + * WRITE_ERROR) while trying to create the output stream this function + * returns a valid pointer to a nil output stream. + * + * The caller still "owns" file and is responsible for calling fclose + * on it when finished. The stream will not do this itself. + */ +cairo_private cairo_output_stream_t * +_cairo_output_stream_create_for_file (FILE *file); + +cairo_private cairo_output_stream_t * +_cairo_memory_stream_create (void); + +cairo_private void +_cairo_memory_stream_copy (cairo_output_stream_t *base, + cairo_output_stream_t *dest); + +cairo_private int +_cairo_memory_stream_length (cairo_output_stream_t *stream); + +cairo_private cairo_status_t +_cairo_memory_stream_destroy (cairo_output_stream_t *abstract_stream, + unsigned char **data_out, + unsigned long *length_out); + +cairo_private cairo_output_stream_t * +_cairo_null_stream_create (void); + +/* cairo-base85-stream.c */ +cairo_private cairo_output_stream_t * +_cairo_base85_stream_create (cairo_output_stream_t *output); + +/* cairo-base64-stream.c */ +cairo_private cairo_output_stream_t * +_cairo_base64_stream_create (cairo_output_stream_t *output); + +/* cairo-deflate-stream.c */ +cairo_private cairo_output_stream_t * +_cairo_deflate_stream_create (cairo_output_stream_t *output); + + +#endif /* CAIRO_OUTPUT_STREAM_PRIVATE_H */ diff --git a/src/cairo-output-stream.c b/src/cairo-output-stream.c new file mode 100644 index 000000000..369a59bfb --- /dev/null +++ b/src/cairo-output-stream.c @@ -0,0 +1,802 @@ +/* cairo-output-stream.c: Output stream abstraction + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Author(s): + * Kristian Høgsberg + */ + +#define _BSD_SOURCE /* for snprintf() */ +#include "cairoint.h" + +#include "cairo-output-stream-private.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" +#include "cairo-compiler-private.h" + +#include +#include + +/* Numbers printed with %f are printed with this number of significant + * digits after the decimal. + */ +#define SIGNIFICANT_DIGITS_AFTER_DECIMAL 6 + +/* Numbers printed with %g are assumed to only have %CAIRO_FIXED_FRAC_BITS + * bits of precision available after the decimal point. + * + * FIXED_POINT_DECIMAL_DIGITS specifies the minimum number of decimal + * digits after the decimal point required to preserve the available + * precision. + * + * The conversion is: + * + * + * FIXED_POINT_DECIMAL_DIGITS = ceil( CAIRO_FIXED_FRAC_BITS * ln(2)/ln(10) ) + * + * + * We can replace ceil(x) with (int)(x+1) since x will never be an + * integer for any likely value of %CAIRO_FIXED_FRAC_BITS. + */ +#define FIXED_POINT_DECIMAL_DIGITS ((int)(CAIRO_FIXED_FRAC_BITS*0.301029996 + 1)) + +void +_cairo_output_stream_init (cairo_output_stream_t *stream, + cairo_output_stream_write_func_t write_func, + cairo_output_stream_flush_func_t flush_func, + cairo_output_stream_close_func_t close_func) +{ + stream->write_func = write_func; + stream->flush_func = flush_func; + stream->close_func = close_func; + stream->position = 0; + stream->status = CAIRO_STATUS_SUCCESS; + stream->closed = FALSE; +} + +cairo_status_t +_cairo_output_stream_fini (cairo_output_stream_t *stream) +{ + return _cairo_output_stream_close (stream); +} + +const cairo_output_stream_t _cairo_output_stream_nil = { + NULL, /* write_func */ + NULL, /* flush_func */ + NULL, /* close_func */ + 0, /* position */ + CAIRO_STATUS_NO_MEMORY, + FALSE /* closed */ +}; + +static const cairo_output_stream_t _cairo_output_stream_nil_write_error = { + NULL, /* write_func */ + NULL, /* flush_func */ + NULL, /* close_func */ + 0, /* position */ + CAIRO_STATUS_WRITE_ERROR, + FALSE /* closed */ +}; + +typedef struct _cairo_output_stream_with_closure { + cairo_output_stream_t base; + cairo_write_func_t write_func; + cairo_close_func_t close_func; + void *closure; +} cairo_output_stream_with_closure_t; + + +static cairo_status_t +closure_write (cairo_output_stream_t *stream, + const unsigned char *data, unsigned int length) +{ + cairo_output_stream_with_closure_t *stream_with_closure = + (cairo_output_stream_with_closure_t *) stream; + + if (stream_with_closure->write_func == NULL) + return CAIRO_STATUS_SUCCESS; + + return stream_with_closure->write_func (stream_with_closure->closure, + data, length); +} + +static cairo_status_t +closure_close (cairo_output_stream_t *stream) +{ + cairo_output_stream_with_closure_t *stream_with_closure = + (cairo_output_stream_with_closure_t *) stream; + + if (stream_with_closure->close_func != NULL) + return stream_with_closure->close_func (stream_with_closure->closure); + else + return CAIRO_STATUS_SUCCESS; +} + +cairo_output_stream_t * +_cairo_output_stream_create (cairo_write_func_t write_func, + cairo_close_func_t close_func, + void *closure) +{ + cairo_output_stream_with_closure_t *stream; + + stream = malloc (sizeof (cairo_output_stream_with_closure_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + closure_write, NULL, closure_close); + stream->write_func = write_func; + stream->close_func = close_func; + stream->closure = closure; + + return &stream->base; +} + +cairo_output_stream_t * +_cairo_output_stream_create_in_error (cairo_status_t status) +{ + cairo_output_stream_t *stream; + + /* check for the common ones */ + if (status == CAIRO_STATUS_NO_MEMORY) + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + if (status == CAIRO_STATUS_WRITE_ERROR) + return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; + + stream = malloc (sizeof (cairo_output_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (stream, NULL, NULL, NULL); + stream->status = status; + + return stream; +} + +cairo_status_t +_cairo_output_stream_flush (cairo_output_stream_t *stream) +{ + cairo_status_t status; + + if (stream->closed) + return stream->status; + + if (stream == &_cairo_output_stream_nil || + stream == &_cairo_output_stream_nil_write_error) + { + return stream->status; + } + + if (stream->flush_func) { + status = stream->flush_func (stream); + /* Don't overwrite a pre-existing status failure. */ + if (stream->status == CAIRO_STATUS_SUCCESS) + stream->status = status; + } + + return stream->status; +} + +cairo_status_t +_cairo_output_stream_close (cairo_output_stream_t *stream) +{ + cairo_status_t status; + + if (stream->closed) + return stream->status; + + if (stream == &_cairo_output_stream_nil || + stream == &_cairo_output_stream_nil_write_error) + { + return stream->status; + } + + if (stream->close_func) { + status = stream->close_func (stream); + /* Don't overwrite a pre-existing status failure. */ + if (stream->status == CAIRO_STATUS_SUCCESS) + stream->status = status; + } + + stream->closed = TRUE; + + return stream->status; +} + +cairo_status_t +_cairo_output_stream_destroy (cairo_output_stream_t *stream) +{ + cairo_status_t status; + + assert (stream != NULL); + + if (stream == &_cairo_output_stream_nil || + stream == &_cairo_output_stream_nil_write_error) + { + return stream->status; + } + + status = _cairo_output_stream_fini (stream); + free (stream); + + return status; +} + +void +_cairo_output_stream_write (cairo_output_stream_t *stream, + const void *data, size_t length) +{ + if (length == 0) + return; + + if (stream->status) + return; + + stream->status = stream->write_func (stream, data, length); + stream->position += length; +} + +void +_cairo_output_stream_write_hex_string (cairo_output_stream_t *stream, + const unsigned char *data, + size_t length) +{ + const char hex_chars[] = "0123456789abcdef"; + char buffer[2]; + unsigned int i, column; + + if (stream->status) + return; + + for (i = 0, column = 0; i < length; i++, column++) { + if (column == 38) { + _cairo_output_stream_write (stream, "\n", 1); + column = 0; + } + buffer[0] = hex_chars[(data[i] >> 4) & 0x0f]; + buffer[1] = hex_chars[data[i] & 0x0f]; + _cairo_output_stream_write (stream, buffer, 2); + } +} + +/* Format a double in a locale independent way and trim trailing + * zeros. Based on code from Alex Larson . + * http://mail.gnome.org/archives/gtk-devel-list/2001-October/msg00087.html + * + * The code in the patch is copyright Red Hat, Inc under the LGPL, but + * has been relicensed under the LGPL/MPL dual license for inclusion + * into cairo (see COPYING). -- Kristian Høgsberg + */ +static void +_cairo_dtostr (char *buffer, size_t size, double d, cairo_bool_t limited_precision) +{ + const char *decimal_point; + int decimal_point_len; + char *p; + int decimal_len; + int num_zeros, decimal_digits; + + /* Omit the minus sign from negative zero. */ + if (d == 0.0) + d = 0.0; + + decimal_point = cairo_get_locale_decimal_point (); + decimal_point_len = strlen (decimal_point); + + assert (decimal_point_len != 0); + + if (limited_precision) { + snprintf (buffer, size, "%.*f", FIXED_POINT_DECIMAL_DIGITS, d); + } else { + /* Using "%f" to print numbers less than 0.1 will result in + * reduced precision due to the default 6 digits after the + * decimal point. + * + * For numbers is < 0.1, we print with maximum precision and count + * the number of zeros between the decimal point and the first + * significant digit. We then print the number again with the + * number of decimal places that gives us the required number of + * significant digits. This ensures the number is correctly + * rounded. + */ + if (fabs (d) >= 0.1) { + snprintf (buffer, size, "%f", d); + } else { + snprintf (buffer, size, "%.18f", d); + p = buffer; + + if (*p == '+' || *p == '-') + p++; + + while (_cairo_isdigit (*p)) + p++; + + if (strncmp (p, decimal_point, decimal_point_len) == 0) + p += decimal_point_len; + + num_zeros = 0; + while (*p++ == '0') + num_zeros++; + + decimal_digits = num_zeros + SIGNIFICANT_DIGITS_AFTER_DECIMAL; + + if (decimal_digits < 18) + snprintf (buffer, size, "%.*f", decimal_digits, d); + } + } + p = buffer; + + if (*p == '+' || *p == '-') + p++; + + while (_cairo_isdigit (*p)) + p++; + + if (strncmp (p, decimal_point, decimal_point_len) == 0) { + *p = '.'; + decimal_len = strlen (p + decimal_point_len); + memmove (p + 1, p + decimal_point_len, decimal_len); + p[1 + decimal_len] = 0; + + /* Remove trailing zeros and decimal point if possible. */ + for (p = p + decimal_len; *p == '0'; p--) + *p = 0; + + if (*p == '.') { + *p = 0; + p--; + } + } +} + +enum { + LENGTH_MODIFIER_LONG = 0x100 +}; + +/* Here's a limited reimplementation of printf. The reason for doing + * this is primarily to special case handling of doubles. We want + * locale independent formatting of doubles and we want to trim + * trailing zeros. This is handled by dtostr() above, and the code + * below handles everything else by calling snprintf() to do the + * formatting. This functionality is only for internal use and we + * only implement the formats we actually use. + */ +void +_cairo_output_stream_vprintf (cairo_output_stream_t *stream, + const char *fmt, va_list ap) +{ +#define SINGLE_FMT_BUFFER_SIZE 32 + char buffer[512], single_fmt[SINGLE_FMT_BUFFER_SIZE]; + int single_fmt_length; + char *p; + const char *f, *start; + int length_modifier, width; + cairo_bool_t var_width; + + if (stream->status) + return; + + f = fmt; + p = buffer; + while (*f != '\0') { + if (p == buffer + sizeof (buffer)) { + _cairo_output_stream_write (stream, buffer, sizeof (buffer)); + p = buffer; + } + + if (*f != '%') { + *p++ = *f++; + continue; + } + + start = f; + f++; + + if (*f == '0') + f++; + + var_width = FALSE; + if (*f == '*') { + var_width = TRUE; + f++; + } + + while (_cairo_isdigit (*f)) + f++; + + length_modifier = 0; + if (*f == 'l') { + length_modifier = LENGTH_MODIFIER_LONG; + f++; + } + + /* The only format strings exist in the cairo implementation + * itself. So there's an internal consistency problem if any + * of them is larger than our format buffer size. */ + single_fmt_length = f - start + 1; + assert (single_fmt_length + 1 <= SINGLE_FMT_BUFFER_SIZE); + + /* Reuse the format string for this conversion. */ + memcpy (single_fmt, start, single_fmt_length); + single_fmt[single_fmt_length] = '\0'; + + /* Flush contents of buffer before snprintf()'ing into it. */ + _cairo_output_stream_write (stream, buffer, p - buffer); + + /* We group signed and unsigned together in this switch, the + * only thing that matters here is the size of the arguments, + * since we're just passing the data through to sprintf(). */ + switch (*f | length_modifier) { + case '%': + buffer[0] = *f; + buffer[1] = 0; + break; + case 'd': + case 'u': + case 'o': + case 'x': + case 'X': + if (var_width) { + width = va_arg (ap, int); + snprintf (buffer, sizeof buffer, + single_fmt, width, va_arg (ap, int)); + } else { + snprintf (buffer, sizeof buffer, single_fmt, va_arg (ap, int)); + } + break; + case 'd' | LENGTH_MODIFIER_LONG: + case 'u' | LENGTH_MODIFIER_LONG: + case 'o' | LENGTH_MODIFIER_LONG: + case 'x' | LENGTH_MODIFIER_LONG: + case 'X' | LENGTH_MODIFIER_LONG: + if (var_width) { + width = va_arg (ap, int); + snprintf (buffer, sizeof buffer, + single_fmt, width, va_arg (ap, long int)); + } else { + snprintf (buffer, sizeof buffer, + single_fmt, va_arg (ap, long int)); + } + break; + case 's': + snprintf (buffer, sizeof buffer, + single_fmt, va_arg (ap, const char *)); + break; + case 'f': + _cairo_dtostr (buffer, sizeof buffer, va_arg (ap, double), FALSE); + break; + case 'g': + _cairo_dtostr (buffer, sizeof buffer, va_arg (ap, double), TRUE); + break; + case 'c': + buffer[0] = va_arg (ap, int); + buffer[1] = 0; + break; + default: + ASSERT_NOT_REACHED; + } + p = buffer + strlen (buffer); + f++; + } + + _cairo_output_stream_write (stream, buffer, p - buffer); +} + +void +_cairo_output_stream_printf (cairo_output_stream_t *stream, + const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + + _cairo_output_stream_vprintf (stream, fmt, ap); + + va_end (ap); +} + +/* Matrix elements that are smaller than the value of the largest element * MATRIX_ROUNDING_TOLERANCE + * are rounded down to zero. */ +#define MATRIX_ROUNDING_TOLERANCE 1e-12 + +void +_cairo_output_stream_print_matrix (cairo_output_stream_t *stream, + const cairo_matrix_t *matrix) +{ + cairo_matrix_t m; + double s, e; + + m = *matrix; + s = fabs (m.xx); + if (fabs (m.xy) > s) + s = fabs (m.xy); + if (fabs (m.yx) > s) + s = fabs (m.yx); + if (fabs (m.yy) > s) + s = fabs (m.yy); + + e = s * MATRIX_ROUNDING_TOLERANCE; + if (fabs(m.xx) < e) + m.xx = 0; + if (fabs(m.xy) < e) + m.xy = 0; + if (fabs(m.yx) < e) + m.yx = 0; + if (fabs(m.yy) < e) + m.yy = 0; + if (fabs(m.x0) < e) + m.x0 = 0; + if (fabs(m.y0) < e) + m.y0 = 0; + + _cairo_output_stream_printf (stream, + "%f %f %f %f %f %f", + m.xx, m.yx, m.xy, m.yy, m.x0, m.y0); +} + +long +_cairo_output_stream_get_position (cairo_output_stream_t *stream) +{ + return stream->position; +} + +cairo_status_t +_cairo_output_stream_get_status (cairo_output_stream_t *stream) +{ + return stream->status; +} + +/* Maybe this should be a configure time option, so embedded targets + * don't have to pull in stdio. */ + + +typedef struct _stdio_stream { + cairo_output_stream_t base; + FILE *file; +} stdio_stream_t; + +static cairo_status_t +stdio_write (cairo_output_stream_t *base, + const unsigned char *data, unsigned int length) +{ + stdio_stream_t *stream = (stdio_stream_t *) base; + + if (fwrite (data, 1, length, stream->file) != length) + return _cairo_error (CAIRO_STATUS_WRITE_ERROR); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +stdio_flush (cairo_output_stream_t *base) +{ + stdio_stream_t *stream = (stdio_stream_t *) base; + + fflush (stream->file); + + if (ferror (stream->file)) + return _cairo_error (CAIRO_STATUS_WRITE_ERROR); + else + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +stdio_close (cairo_output_stream_t *base) +{ + cairo_status_t status; + stdio_stream_t *stream = (stdio_stream_t *) base; + + status = stdio_flush (base); + + fclose (stream->file); + + return status; +} + +cairo_output_stream_t * +_cairo_output_stream_create_for_file (FILE *file) +{ + stdio_stream_t *stream; + + if (file == NULL) { + _cairo_error_throw (CAIRO_STATUS_WRITE_ERROR); + return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; + } + + stream = malloc (sizeof *stream); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + stdio_write, stdio_flush, stdio_flush); + stream->file = file; + + return &stream->base; +} + +cairo_output_stream_t * +_cairo_output_stream_create_for_filename (const char *filename) +{ + stdio_stream_t *stream; + FILE *file; + + if (filename == NULL) + return _cairo_null_stream_create (); + + file = fopen (filename, "wb"); + if (file == NULL) { + switch (errno) { + case ENOMEM: + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + default: + _cairo_error_throw (CAIRO_STATUS_WRITE_ERROR); + return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; + } + } + + stream = malloc (sizeof *stream); + if (unlikely (stream == NULL)) { + fclose (file); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + stdio_write, stdio_flush, stdio_close); + stream->file = file; + + return &stream->base; +} + + +typedef struct _memory_stream { + cairo_output_stream_t base; + cairo_array_t array; +} memory_stream_t; + +static cairo_status_t +memory_write (cairo_output_stream_t *base, + const unsigned char *data, unsigned int length) +{ + memory_stream_t *stream = (memory_stream_t *) base; + + return _cairo_array_append_multiple (&stream->array, data, length); +} + +static cairo_status_t +memory_close (cairo_output_stream_t *base) +{ + memory_stream_t *stream = (memory_stream_t *) base; + + _cairo_array_fini (&stream->array); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_output_stream_t * +_cairo_memory_stream_create (void) +{ + memory_stream_t *stream; + + stream = malloc (sizeof *stream); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, memory_write, NULL, memory_close); + _cairo_array_init (&stream->array, 1); + + return &stream->base; +} + +cairo_status_t +_cairo_memory_stream_destroy (cairo_output_stream_t *abstract_stream, + unsigned char **data_out, + unsigned long *length_out) +{ + memory_stream_t *stream; + cairo_status_t status; + + status = abstract_stream->status; + if (unlikely (status)) + return _cairo_output_stream_destroy (abstract_stream); + + stream = (memory_stream_t *) abstract_stream; + + *length_out = _cairo_array_num_elements (&stream->array); + *data_out = malloc (*length_out); + if (unlikely (*data_out == NULL)) { + status = _cairo_output_stream_destroy (abstract_stream); + assert (status == CAIRO_STATUS_SUCCESS); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + memcpy (*data_out, _cairo_array_index (&stream->array, 0), *length_out); + + return _cairo_output_stream_destroy (abstract_stream); +} + +void +_cairo_memory_stream_copy (cairo_output_stream_t *base, + cairo_output_stream_t *dest) +{ + memory_stream_t *stream = (memory_stream_t *) base; + + if (dest->status) + return; + + if (base->status) { + dest->status = base->status; + return; + } + + _cairo_output_stream_write (dest, + _cairo_array_index (&stream->array, 0), + _cairo_array_num_elements (&stream->array)); +} + +int +_cairo_memory_stream_length (cairo_output_stream_t *base) +{ + memory_stream_t *stream = (memory_stream_t *) base; + + return _cairo_array_num_elements (&stream->array); +} + +static cairo_status_t +null_write (cairo_output_stream_t *base, + const unsigned char *data, unsigned int length) +{ + return CAIRO_STATUS_SUCCESS; +} + +cairo_output_stream_t * +_cairo_null_stream_create (void) +{ + cairo_output_stream_t *stream; + + stream = malloc (sizeof *stream); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (stream, null_write, NULL, NULL); + + return stream; +} diff --git a/src/cairo-paginated-private.h b/src/cairo-paginated-private.h new file mode 100644 index 000000000..b827faba0 --- /dev/null +++ b/src/cairo-paginated-private.h @@ -0,0 +1,168 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + */ + +#ifndef CAIRO_PAGINATED_H +#define CAIRO_PAGINATED_H + +#include "cairoint.h" + +struct _cairo_paginated_surface_backend { + /* Optional. Will be called once for each page. + * + * Note: With respect to the order of drawing operations as seen + * by the target, this call will occur before any drawing + * operations for the relevant page. However, with respect to the + * function calls as made by the user, this call will be *after* + * any drawing operations for the page, (that is, it will occur + * during the user's call to cairo_show_page or cairo_copy_page). + */ + cairo_warn cairo_int_status_t + (*start_page) (void *surface); + + /* Required. Will be called twice for each page, once with an + * argument of CAIRO_PAGINATED_MODE_ANALYZE and once with + * CAIRO_PAGINATED_MODE_RENDER. See more details in the + * documentation for _cairo_paginated_surface_create below. + */ + void + (*set_paginated_mode) (void *surface, + cairo_paginated_mode_t mode); + + /* Optional. Specifies the smallest box that encloses all objects + * on the page. Will be called at the end of the ANALYZE phase but + * before the mode is changed to RENDER. + */ + cairo_warn cairo_int_status_t + (*set_bounding_box) (void *surface, + cairo_box_t *bbox); + + /* Optional. Indicates whether the page requires fallback images. + * Will be called at the end of the ANALYZE phase but before the + * mode is changed to RENDER. + */ + cairo_warn cairo_int_status_t + (*set_fallback_images_required) (void *surface, + cairo_bool_t fallbacks_required); + + cairo_bool_t + (*supports_fine_grained_fallbacks) (void *surface); +}; + +/* A #cairo_paginated_surface_t provides a very convenient wrapper that + * is well-suited for doing the analysis common to most surfaces that + * have paginated output, (that is, things directed at printers, or + * for saving content in files such as PostScript or PDF files). + * + * To use the paginated surface, you'll first need to create your + * 'real' surface using _cairo_surface_init() and the standard + * #cairo_surface_backend_t. Then you also call + * _cairo_paginated_surface_create which takes its own, much simpler, + * #cairo_paginated_surface_backend_t. You are free to return the result + * of _cairo_paginated_surface_create() from your public + * cairo__surface_create(). The paginated backend will be careful + * to not let the user see that they really got a "wrapped" + * surface. See test-paginated-surface.c for a fairly minimal example + * of a paginated-using surface. That should be a reasonable example + * to follow. + * + * What the paginated surface does is first save all drawing + * operations for a page into a recording-surface. Then when the user calls + * cairo_show_page(), the paginated surface performs the following + * sequence of operations (using the backend functions passed to + * cairo_paginated_surface_create()): + * + * 1. Calls start_page() (if not %NULL). At this point, it is appropriate + * for the target to emit any page-specific header information into + * its output. + * + * 2. Calls set_paginated_mode() with an argument of %CAIRO_PAGINATED_MODE_ANALYZE + * + * 3. Replays the recording-surface to the target surface, (with an + * analysis surface inserted between which watches the return value + * from each operation). This analysis stage is used to decide which + * operations will require fallbacks. + * + * 4. Calls set_bounding_box() to provide the target surface with the + * tight bounding box of the page. + * + * 5. Calls set_paginated_mode() with an argument of %CAIRO_PAGINATED_MODE_RENDER + * + * 6. Replays a subset of the recording-surface operations to the target surface + * + * 7. Calls set_paginated_mode() with an argument of %CAIRO_PAGINATED_MODE_FALLBACK + * + * 8. Replays the remaining operations to an image surface, sets an + * appropriate clip on the target, then paints the resulting image + * surface to the target. + * + * So, the target will see drawing operations during three separate + * stages, (ANALYZE, RENDER and FALLBACK). During the ANALYZE phase + * the target should not actually perform any rendering, (for example, + * if performing output to a file, no output should be generated + * during this stage). Instead the drawing functions simply need to + * return %CAIRO_STATUS_SUCCESS or %CAIRO_INT_STATUS_UNSUPPORTED to + * indicate whether rendering would be supported. And it should do + * this as quickly as possible. The FALLBACK phase allows the surface + * to distinguish fallback images from native rendering in case they + * need to be handled as a special case. + * + * Note: The paginated surface layer assumes that the target surface + * is "blank" by default at the beginning of each page, without any + * need for an explicit erase operation, (as opposed to an image + * surface, for example, which might have uninitialized content + * originally). As such, it optimizes away CLEAR operations that + * happen at the beginning of each page---the target surface will not + * even see these operations. + */ +cairo_private cairo_surface_t * +_cairo_paginated_surface_create (cairo_surface_t *target, + cairo_content_t content, + const cairo_paginated_surface_backend_t *backend); + +cairo_private cairo_surface_t * +_cairo_paginated_surface_get_target (cairo_surface_t *surface); + +cairo_private cairo_surface_t * +_cairo_paginated_surface_get_recording (cairo_surface_t *surface); + +cairo_private cairo_bool_t +_cairo_surface_is_paginated (cairo_surface_t *surface); + +cairo_private cairo_status_t +_cairo_paginated_surface_set_size (cairo_surface_t *surface, + int width, + int height); + +#endif /* CAIRO_PAGINATED_H */ diff --git a/src/cairo-paginated-surface-private.h b/src/cairo-paginated-surface-private.h new file mode 100644 index 000000000..ebf4b3424 --- /dev/null +++ b/src/cairo-paginated-surface-private.h @@ -0,0 +1,62 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + */ + +#ifndef CAIRO_PAGINATED_SURFACE_H +#define CAIRO_PAGINATED_SURFACE_H + +#include "cairo.h" + +#include "cairo-surface-private.h" + +typedef struct _cairo_paginated_surface { + cairo_surface_t base; + + /* The target surface to hold the final result. */ + cairo_surface_t *target; + + cairo_content_t content; + + /* Paginated-surface specific functions for the target */ + const cairo_paginated_surface_backend_t *backend; + + /* A cairo_recording_surface to record all operations. To be replayed + * against target, and also against image surface as necessary for + * fallbacks. */ + cairo_surface_t *recording_surface; + + int page_num; +} cairo_paginated_surface_t; + +#endif /* CAIRO_PAGINATED_SURFACE_H */ diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c new file mode 100644 index 000000000..68e4e0e34 --- /dev/null +++ b/src/cairo-paginated-surface.c @@ -0,0 +1,716 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * Copyright © 2007 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + * Keith Packard + * Adrian Johnson + */ + +/* The paginated surface layer exists to provide as much code sharing + * as possible for the various paginated surface backends in cairo + * (PostScript, PDF, etc.). See cairo-paginated-private.h for + * more details on how it works and how to use it. + */ + +#include "cairoint.h" + +#include "cairo-paginated-private.h" +#include "cairo-paginated-surface-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-analysis-surface-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-subsurface-inline.h" + +static const cairo_surface_backend_t cairo_paginated_surface_backend; + +static cairo_int_status_t +_cairo_paginated_surface_show_page (void *abstract_surface); + +static cairo_surface_t * +_cairo_paginated_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_rectangle_t rect; + rect.x = rect.y = 0.; + rect.width = width; + rect.height = height; + return cairo_recording_surface_create (content, &rect); +} + +static cairo_surface_t * +_create_recording_surface_for_target (cairo_surface_t *target, + cairo_content_t content) +{ + cairo_rectangle_int_t rect; + + if (_cairo_surface_get_extents (target, &rect)) { + cairo_rectangle_t recording_extents; + + recording_extents.x = rect.x; + recording_extents.y = rect.y; + recording_extents.width = rect.width; + recording_extents.height = rect.height; + + return cairo_recording_surface_create (content, &recording_extents); + } else { + return cairo_recording_surface_create (content, NULL); + } +} + +cairo_surface_t * +_cairo_paginated_surface_create (cairo_surface_t *target, + cairo_content_t content, + const cairo_paginated_surface_backend_t *backend) +{ + cairo_paginated_surface_t *surface; + cairo_status_t status; + + surface = malloc (sizeof (cairo_paginated_surface_t)); + if (unlikely (surface == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL; + } + + _cairo_surface_init (&surface->base, + &cairo_paginated_surface_backend, + NULL, /* device */ + content); + + /* Override surface->base.type with target's type so we don't leak + * evidence of the paginated wrapper out to the user. */ + surface->base.type = target->type; + + surface->target = cairo_surface_reference (target); + + surface->content = content; + surface->backend = backend; + + surface->recording_surface = _create_recording_surface_for_target (target, content); + status = surface->recording_surface->status; + if (unlikely (status)) + goto FAIL_CLEANUP_SURFACE; + + surface->page_num = 1; + surface->base.is_clear = TRUE; + + return &surface->base; + + FAIL_CLEANUP_SURFACE: + cairo_surface_destroy (target); + free (surface); + FAIL: + return _cairo_surface_create_in_error (status); +} + +cairo_bool_t +_cairo_surface_is_paginated (cairo_surface_t *surface) +{ + return surface->backend == &cairo_paginated_surface_backend; +} + +cairo_surface_t * +_cairo_paginated_surface_get_target (cairo_surface_t *surface) +{ + cairo_paginated_surface_t *paginated_surface; + + assert (_cairo_surface_is_paginated (surface)); + + paginated_surface = (cairo_paginated_surface_t *) surface; + return paginated_surface->target; +} + +cairo_surface_t * +_cairo_paginated_surface_get_recording (cairo_surface_t *surface) +{ + cairo_paginated_surface_t *paginated_surface; + + assert (_cairo_surface_is_paginated (surface)); + + paginated_surface = (cairo_paginated_surface_t *) surface; + return paginated_surface->recording_surface; +} + +cairo_status_t +_cairo_paginated_surface_set_size (cairo_surface_t *surface, + int width, + int height) +{ + cairo_paginated_surface_t *paginated_surface; + cairo_status_t status; + cairo_rectangle_t recording_extents; + + assert (_cairo_surface_is_paginated (surface)); + + paginated_surface = (cairo_paginated_surface_t *) surface; + + recording_extents.x = 0; + recording_extents.y = 0; + recording_extents.width = width; + recording_extents.height = height; + + cairo_surface_destroy (paginated_surface->recording_surface); + paginated_surface->recording_surface = cairo_recording_surface_create (paginated_surface->content, + &recording_extents); + status = paginated_surface->recording_surface->status; + if (unlikely (status)) + return _cairo_surface_set_error (surface, status); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_paginated_surface_finish (void *abstract_surface) +{ + cairo_paginated_surface_t *surface = abstract_surface; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + if (! surface->base.is_clear || surface->page_num == 1) { + /* Bypass some of the sanity checking in cairo-surface.c, as we + * know that the surface is finished... + */ + status = _cairo_paginated_surface_show_page (surface); + } + + /* XXX We want to propagate any errors from destroy(), but those are not + * returned via the api. So we need to explicitly finish the target, + * and check the status afterwards. However, we can only call finish() + * on the target, if we own it. + */ + if (CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->target->ref_count) == 1) + cairo_surface_finish (surface->target); + if (status == CAIRO_STATUS_SUCCESS) + status = cairo_surface_status (surface->target); + cairo_surface_destroy (surface->target); + + cairo_surface_finish (surface->recording_surface); + if (status == CAIRO_STATUS_SUCCESS) + status = cairo_surface_status (surface->recording_surface); + cairo_surface_destroy (surface->recording_surface); + + return status; +} + +static cairo_surface_t * +_cairo_paginated_surface_create_image_surface (void *abstract_surface, + int width, + int height) +{ + cairo_paginated_surface_t *surface = abstract_surface; + cairo_surface_t *image; + cairo_font_options_t options; + + image = _cairo_image_surface_create_with_content (surface->content, + width, + height); + + cairo_surface_get_font_options (&surface->base, &options); + _cairo_surface_set_font_options (image, &options); + + return image; +} + +static cairo_surface_t * +_cairo_paginated_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_paginated_surface_t *surface = abstract_surface; + return _cairo_surface_get_source (surface->target, extents); +} + +static cairo_status_t +_cairo_paginated_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_paginated_surface_t *surface = abstract_surface; + cairo_bool_t is_bounded; + cairo_surface_t *image; + cairo_status_t status; + cairo_rectangle_int_t extents; + + is_bounded = _cairo_surface_get_extents (surface->target, &extents); + if (! is_bounded) + return CAIRO_INT_STATUS_UNSUPPORTED; + + image = _cairo_paginated_surface_create_image_surface (surface, + extents.width, + extents.height); + + status = _cairo_recording_surface_replay (surface->recording_surface, image); + if (unlikely (status)) { + cairo_surface_destroy (image); + return status; + } + + *image_out = (cairo_image_surface_t*) image; + *image_extra = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_paginated_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_int_status_t +_paint_fallback_image (cairo_paginated_surface_t *surface, + cairo_rectangle_int_t *rect) +{ + double x_scale = surface->base.x_fallback_resolution / surface->target->x_resolution; + double y_scale = surface->base.y_fallback_resolution / surface->target->y_resolution; + int x, y, width, height; + cairo_status_t status; + cairo_surface_t *image; + cairo_surface_pattern_t pattern; + cairo_clip_t *clip; + + x = rect->x; + y = rect->y; + width = rect->width; + height = rect->height; + image = _cairo_paginated_surface_create_image_surface (surface, + ceil (width * x_scale), + ceil (height * y_scale)); + cairo_surface_set_device_scale (image, x_scale, y_scale); + /* set_device_offset just sets the x0/y0 components of the matrix; + * so we have to do the scaling manually. */ + cairo_surface_set_device_offset (image, -x*x_scale, -y*y_scale); + + status = _cairo_recording_surface_replay (surface->recording_surface, image); + if (unlikely (status)) + goto CLEANUP_IMAGE; + + _cairo_pattern_init_for_surface (&pattern, image); + cairo_matrix_init (&pattern.base.matrix, + x_scale, 0, 0, y_scale, -x*x_scale, -y*y_scale); + /* the fallback should be rendered at native resolution, so disable + * filtering (if possible) to avoid introducing potential artifacts. */ + pattern.base.filter = CAIRO_FILTER_NEAREST; + + clip = _cairo_clip_intersect_rectangle (NULL, rect); + status = _cairo_surface_paint (surface->target, + CAIRO_OPERATOR_SOURCE, + &pattern.base, clip); + _cairo_clip_destroy (clip); + _cairo_pattern_fini (&pattern.base); + +CLEANUP_IMAGE: + cairo_surface_destroy (image); + + return status; +} + +static cairo_int_status_t +_paint_page (cairo_paginated_surface_t *surface) +{ + cairo_surface_t *analysis; + cairo_int_status_t status; + cairo_bool_t has_supported, has_page_fallback, has_finegrained_fallback; + + if (unlikely (surface->target->status)) + return surface->target->status; + + analysis = _cairo_analysis_surface_create (surface->target); + if (unlikely (analysis->status)) + return _cairo_surface_set_error (surface->target, analysis->status); + + surface->backend->set_paginated_mode (surface->target, + CAIRO_PAGINATED_MODE_ANALYZE); + status = _cairo_recording_surface_replay_and_create_regions (surface->recording_surface, + analysis); + if (status) + goto FAIL; + + assert (analysis->status == CAIRO_STATUS_SUCCESS); + + if (surface->backend->set_bounding_box) { + cairo_box_t bbox; + + _cairo_analysis_surface_get_bounding_box (analysis, &bbox); + status = surface->backend->set_bounding_box (surface->target, &bbox); + if (unlikely (status)) + goto FAIL; + } + + if (surface->backend->set_fallback_images_required) { + cairo_bool_t has_fallbacks = _cairo_analysis_surface_has_unsupported (analysis); + + status = surface->backend->set_fallback_images_required (surface->target, + has_fallbacks); + if (unlikely (status)) + goto FAIL; + } + + /* Finer grained fallbacks are currently only supported for some + * surface types */ + if (surface->backend->supports_fine_grained_fallbacks != NULL && + surface->backend->supports_fine_grained_fallbacks (surface->target)) + { + has_supported = _cairo_analysis_surface_has_supported (analysis); + has_page_fallback = FALSE; + has_finegrained_fallback = _cairo_analysis_surface_has_unsupported (analysis); + } + else + { + if (_cairo_analysis_surface_has_unsupported (analysis)) { + has_supported = FALSE; + has_page_fallback = TRUE; + } else { + has_supported = TRUE; + has_page_fallback = FALSE; + } + has_finegrained_fallback = FALSE; + } + + if (has_supported) { + surface->backend->set_paginated_mode (surface->target, + CAIRO_PAGINATED_MODE_RENDER); + + status = _cairo_recording_surface_replay_region (surface->recording_surface, + NULL, + surface->target, + CAIRO_RECORDING_REGION_NATIVE); + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + if (unlikely (status)) + goto FAIL; + } + + if (has_page_fallback) { + cairo_rectangle_int_t extents; + cairo_bool_t is_bounded; + + surface->backend->set_paginated_mode (surface->target, + CAIRO_PAGINATED_MODE_FALLBACK); + + is_bounded = _cairo_surface_get_extents (surface->target, &extents); + if (! is_bounded) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto FAIL; + } + + status = _paint_fallback_image (surface, &extents); + if (unlikely (status)) + goto FAIL; + } + + if (has_finegrained_fallback) { + cairo_region_t *region; + int num_rects, i; + + surface->backend->set_paginated_mode (surface->target, + CAIRO_PAGINATED_MODE_FALLBACK); + + region = _cairo_analysis_surface_get_unsupported (analysis); + + num_rects = cairo_region_num_rectangles (region); + for (i = 0; i < num_rects; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (region, i, &rect); + status = _paint_fallback_image (surface, &rect); + if (unlikely (status)) + goto FAIL; + } + } + + FAIL: + cairo_surface_destroy (analysis); + + return _cairo_surface_set_error (surface->target, status); +} + +static cairo_status_t +_start_page (cairo_paginated_surface_t *surface) +{ + if (surface->target->status) + return surface->target->status; + + if (! surface->backend->start_page) + return CAIRO_STATUS_SUCCESS; + + return _cairo_surface_set_error (surface->target, + surface->backend->start_page (surface->target)); +} + +static cairo_int_status_t +_cairo_paginated_surface_copy_page (void *abstract_surface) +{ + cairo_status_t status; + cairo_paginated_surface_t *surface = abstract_surface; + + status = _start_page (surface); + if (unlikely (status)) + return status; + + status = _paint_page (surface); + if (unlikely (status)) + return status; + + surface->page_num++; + + /* XXX: It might make sense to add some support here for calling + * cairo_surface_copy_page on the target surface. It would be an + * optimization for the output, but the interaction with image + * fallbacks gets tricky. For now, we just let the target see a + * show_page and we implement the copying by simply not destroying + * the recording-surface. */ + + cairo_surface_show_page (surface->target); + return cairo_surface_status (surface->target); +} + +static cairo_int_status_t +_cairo_paginated_surface_show_page (void *abstract_surface) +{ + cairo_status_t status; + cairo_paginated_surface_t *surface = abstract_surface; + + status = _start_page (surface); + if (unlikely (status)) + return status; + + status = _paint_page (surface); + if (unlikely (status)) + return status; + + cairo_surface_show_page (surface->target); + status = surface->target->status; + if (unlikely (status)) + return status; + + status = surface->recording_surface->status; + if (unlikely (status)) + return status; + + if (! surface->base.finished) { + cairo_surface_destroy (surface->recording_surface); + + surface->recording_surface = _create_recording_surface_for_target (surface->target, + surface->content); + status = surface->recording_surface->status; + if (unlikely (status)) + return status; + + surface->page_num++; + surface->base.is_clear = TRUE; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_paginated_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_get_extents (surface->target, rectangle); +} + +static void +_cairo_paginated_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + cairo_surface_get_font_options (surface->target, options); +} + +static cairo_int_status_t +_cairo_paginated_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_paint (surface->recording_surface, op, source, clip); +} + +static cairo_int_status_t +_cairo_paginated_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_mask (surface->recording_surface, op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_paginated_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_stroke (surface->recording_surface, op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_paginated_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_fill (surface->recording_surface, op, source, + path, fill_rule, + tolerance, antialias, + clip); +} + +static cairo_bool_t +_cairo_paginated_surface_has_show_text_glyphs (void *abstract_surface) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return cairo_surface_has_show_text_glyphs (surface->target); +} + +static cairo_int_status_t +_cairo_paginated_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_show_text_glyphs (surface->recording_surface, op, source, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font, + clip); +} + +static const char ** +_cairo_paginated_surface_get_supported_mime_types (void *abstract_surface) +{ + cairo_paginated_surface_t *surface = abstract_surface; + + if (surface->target->backend->get_supported_mime_types) + return surface->target->backend->get_supported_mime_types (surface->target); + + return NULL; +} + +static cairo_surface_t * +_cairo_paginated_surface_snapshot (void *abstract_other) +{ + cairo_paginated_surface_t *other = abstract_other; + + return other->recording_surface->backend->snapshot (other->recording_surface); +} + +static cairo_t * +_cairo_paginated_context_create (void *target) +{ + cairo_paginated_surface_t *surface = target; + + if (_cairo_surface_is_subsurface (&surface->base)) + surface = (cairo_paginated_surface_t *) + _cairo_surface_subsurface_get_target (&surface->base); + + return surface->recording_surface->backend->create_context (target); +} + +static const cairo_surface_backend_t cairo_paginated_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_PAGINATED, + _cairo_paginated_surface_finish, + + _cairo_paginated_context_create, + + _cairo_paginated_surface_create_similar, + NULL, /* create simlar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_paginated_surface_source, + _cairo_paginated_surface_acquire_source_image, + _cairo_paginated_surface_release_source_image, + _cairo_paginated_surface_snapshot, + + _cairo_paginated_surface_copy_page, + _cairo_paginated_surface_show_page, + + _cairo_paginated_surface_get_extents, + _cairo_paginated_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_paginated_surface_paint, + _cairo_paginated_surface_mask, + _cairo_paginated_surface_stroke, + _cairo_paginated_surface_fill, + NULL, /* fill_stroke */ + NULL, /* show_glyphs */ + _cairo_paginated_surface_has_show_text_glyphs, + _cairo_paginated_surface_show_text_glyphs, + _cairo_paginated_surface_get_supported_mime_types, +}; diff --git a/src/cairo-path-bounds.c b/src/cairo-path-bounds.c new file mode 100644 index 000000000..9c7222426 --- /dev/null +++ b/src/cairo-path-bounds.c @@ -0,0 +1,207 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" +#include "cairo-box-inline.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" + +typedef struct _cairo_path_bounder { + cairo_point_t current_point; + cairo_bool_t has_extents; + cairo_box_t extents; +} cairo_path_bounder_t; + +static cairo_status_t +_cairo_path_bounder_move_to (void *closure, + const cairo_point_t *point) +{ + cairo_path_bounder_t *bounder = closure; + + bounder->current_point = *point; + + if (likely (bounder->has_extents)) { + _cairo_box_add_point (&bounder->extents, point); + } else { + bounder->has_extents = TRUE; + _cairo_box_set (&bounder->extents, point, point); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_bounder_line_to (void *closure, + const cairo_point_t *point) +{ + cairo_path_bounder_t *bounder = closure; + + bounder->current_point = *point; + _cairo_box_add_point (&bounder->extents, point); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_bounder_curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + cairo_path_bounder_t *bounder = closure; + + _cairo_box_add_curve_to (&bounder->extents, + &bounder->current_point, + b, c, d); + bounder->current_point = *d; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_bounder_close_path (void *closure) +{ + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +_cairo_path_bounder_extents (const cairo_path_fixed_t *path, + cairo_box_t *extents) +{ + cairo_path_bounder_t bounder; + cairo_status_t status; + + bounder.has_extents = FALSE; + status = _cairo_path_fixed_interpret (path, + _cairo_path_bounder_move_to, + _cairo_path_bounder_line_to, + _cairo_path_bounder_curve_to, + _cairo_path_bounder_close_path, + &bounder); + assert (!status); + + if (bounder.has_extents) + *extents = bounder.extents; + + return bounder.has_extents; +} + +void +_cairo_path_fixed_approximate_clip_extents (const cairo_path_fixed_t *path, + cairo_rectangle_int_t *extents) +{ + _cairo_path_fixed_approximate_fill_extents (path, extents); +} + +void +_cairo_path_fixed_approximate_fill_extents (const cairo_path_fixed_t *path, + cairo_rectangle_int_t *extents) +{ + _cairo_path_fixed_fill_extents (path, CAIRO_FILL_RULE_WINDING, 0, extents); +} + +void +_cairo_path_fixed_fill_extents (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_rectangle_int_t *extents) +{ + if (path->extents.p1.x < path->extents.p2.x && + path->extents.p1.y < path->extents.p2.y) { + _cairo_box_round_to_rectangle (&path->extents, extents); + } else { + extents->x = extents->y = 0; + extents->width = extents->height = 0; + } +} + +/* Adjusts the fill extents (above) by the device-space pen. */ +void +_cairo_path_fixed_approximate_stroke_extents (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + cairo_rectangle_int_t *extents) +{ + if (path->has_extents) { + cairo_box_t box_extents; + double dx, dy; + + _cairo_stroke_style_max_distance_from_path (style, path, ctm, &dx, &dy); + + box_extents = path->extents; + box_extents.p1.x -= _cairo_fixed_from_double (dx); + box_extents.p1.y -= _cairo_fixed_from_double (dy); + box_extents.p2.x += _cairo_fixed_from_double (dx); + box_extents.p2.y += _cairo_fixed_from_double (dy); + + _cairo_box_round_to_rectangle (&box_extents, extents); + } else { + extents->x = extents->y = 0; + extents->width = extents->height = 0; + } +} + +cairo_status_t +_cairo_path_fixed_stroke_extents (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_rectangle_int_t *extents) +{ + cairo_polygon_t polygon; + cairo_status_t status; + + _cairo_polygon_init (&polygon, NULL, 0); + status = _cairo_path_fixed_stroke_to_polygon (path, + stroke_style, + ctm, ctm_inverse, + tolerance, + &polygon); + _cairo_box_round_to_rectangle (&polygon.extents, extents); + _cairo_polygon_fini (&polygon); + + return status; +} + +cairo_bool_t +_cairo_path_fixed_extents (const cairo_path_fixed_t *path, + cairo_box_t *box) +{ + *box = path->extents; + return path->has_extents; +} diff --git a/src/cairo-path-fill.c b/src/cairo-path-fill.c new file mode 100644 index 000000000..4000c9c58 --- /dev/null +++ b/src/cairo-path-fill.c @@ -0,0 +1,341 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-region-private.h" +#include "cairo-traps-private.h" + +typedef struct cairo_filler { + cairo_polygon_t *polygon; + double tolerance; + + cairo_box_t limit; + cairo_bool_t has_limits; + + cairo_point_t current_point; + cairo_point_t last_move_to; +} cairo_filler_t; + +static cairo_status_t +_cairo_filler_line_to (void *closure, + const cairo_point_t *point) +{ + cairo_filler_t *filler = closure; + cairo_status_t status; + + status = _cairo_polygon_add_external_edge (filler->polygon, + &filler->current_point, + point); + + filler->current_point = *point; + + return status; +} + +static cairo_status_t +_cairo_filler_close (void *closure) +{ + cairo_filler_t *filler = closure; + + /* close the subpath */ + return _cairo_filler_line_to (closure, &filler->last_move_to); +} + +static cairo_status_t +_cairo_filler_move_to (void *closure, + const cairo_point_t *point) +{ + cairo_filler_t *filler = closure; + cairo_status_t status; + + /* close current subpath */ + status = _cairo_filler_close (closure); + if (unlikely (status)) + return status; + + /* make sure that the closure represents a degenerate path */ + filler->current_point = *point; + filler->last_move_to = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_filler_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + cairo_filler_t *filler = closure; + cairo_spline_t spline; + + if (filler->has_limits) { + if (! _cairo_spline_intersects (&filler->current_point, p1, p2, p3, + &filler->limit)) + return _cairo_filler_line_to (filler, p3); + } + + if (! _cairo_spline_init (&spline, + (cairo_spline_add_point_func_t)_cairo_filler_line_to, filler, + &filler->current_point, p1, p2, p3)) + { + return _cairo_filler_line_to (closure, p3); + } + + return _cairo_spline_decompose (&spline, filler->tolerance); +} + +cairo_status_t +_cairo_path_fixed_fill_to_polygon (const cairo_path_fixed_t *path, + double tolerance, + cairo_polygon_t *polygon) +{ + cairo_filler_t filler; + cairo_status_t status; + + filler.polygon = polygon; + filler.tolerance = tolerance; + + filler.has_limits = FALSE; + if (polygon->num_limits) { + filler.has_limits = TRUE; + filler.limit = polygon->limit; + } + + /* make sure that the closure represents a degenerate path */ + filler.current_point.x = 0; + filler.current_point.y = 0; + filler.last_move_to = filler.current_point; + + status = _cairo_path_fixed_interpret (path, + _cairo_filler_move_to, + _cairo_filler_line_to, + _cairo_filler_curve_to, + _cairo_filler_close, + &filler); + if (unlikely (status)) + return status; + + return _cairo_filler_close (&filler); +} + +typedef struct cairo_filler_rectilinear_aligned { + cairo_polygon_t *polygon; + + cairo_point_t current_point; + cairo_point_t last_move_to; +} cairo_filler_ra_t; + +static cairo_status_t +_cairo_filler_ra_line_to (void *closure, + const cairo_point_t *point) +{ + cairo_filler_ra_t *filler = closure; + cairo_status_t status; + cairo_point_t p; + + p.x = _cairo_fixed_round_down (point->x); + p.y = _cairo_fixed_round_down (point->y); + + status = _cairo_polygon_add_external_edge (filler->polygon, + &filler->current_point, + &p); + + filler->current_point = p; + + return status; +} + +static cairo_status_t +_cairo_filler_ra_close (void *closure) +{ + cairo_filler_ra_t *filler = closure; + return _cairo_filler_ra_line_to (closure, &filler->last_move_to); +} + +static cairo_status_t +_cairo_filler_ra_move_to (void *closure, + const cairo_point_t *point) +{ + cairo_filler_ra_t *filler = closure; + cairo_status_t status; + cairo_point_t p; + + /* close current subpath */ + status = _cairo_filler_ra_close (closure); + if (unlikely (status)) + return status; + + p.x = _cairo_fixed_round_down (point->x); + p.y = _cairo_fixed_round_down (point->y); + + /* make sure that the closure represents a degenerate path */ + filler->current_point = p; + filler->last_move_to = p; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_path_fixed_fill_rectilinear_to_polygon (const cairo_path_fixed_t *path, + cairo_antialias_t antialias, + cairo_polygon_t *polygon) +{ + cairo_filler_ra_t filler; + cairo_status_t status; + + if (antialias != CAIRO_ANTIALIAS_NONE) + return _cairo_path_fixed_fill_to_polygon (path, 0., polygon); + + filler.polygon = polygon; + + /* make sure that the closure represents a degenerate path */ + filler.current_point.x = 0; + filler.current_point.y = 0; + filler.last_move_to = filler.current_point; + + status = _cairo_path_fixed_interpret_flat (path, + _cairo_filler_ra_move_to, + _cairo_filler_ra_line_to, + _cairo_filler_ra_close, + &filler, + 0.); + if (unlikely (status)) + return status; + + return _cairo_filler_ra_close (&filler); +} + +cairo_status_t +_cairo_path_fixed_fill_to_traps (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_traps_t *traps) +{ + cairo_polygon_t polygon; + cairo_status_t status; + + if (_cairo_path_fixed_fill_is_empty (path)) + return CAIRO_STATUS_SUCCESS; + + _cairo_polygon_init (&polygon, traps->limits, traps->num_limits); + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &polygon); + if (unlikely (status || polygon.num_edges == 0)) + goto CLEANUP; + + status = _cairo_bentley_ottmann_tessellate_polygon (traps, + &polygon, fill_rule); + + CLEANUP: + _cairo_polygon_fini (&polygon); + return status; +} + +static cairo_status_t +_cairo_path_fixed_fill_rectilinear_tessellate_to_boxes (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias, + cairo_boxes_t *boxes) +{ + cairo_polygon_t polygon; + cairo_status_t status; + + _cairo_polygon_init (&polygon, boxes->limits, boxes->num_limits); + boxes->num_limits = 0; + + /* tolerance will be ignored as the path is rectilinear */ + status = _cairo_path_fixed_fill_rectilinear_to_polygon (path, antialias, &polygon); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = + _cairo_bentley_ottmann_tessellate_rectilinear_polygon_to_boxes (&polygon, + fill_rule, + boxes); + } + + _cairo_polygon_fini (&polygon); + + return status; +} + +cairo_status_t +_cairo_path_fixed_fill_rectilinear_to_boxes (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias, + cairo_boxes_t *boxes) +{ + cairo_path_fixed_iter_t iter; + cairo_status_t status; + cairo_box_t box; + + if (_cairo_path_fixed_is_box (path, &box)) + return _cairo_boxes_add (boxes, antialias, &box); + + _cairo_path_fixed_iter_init (&iter, path); + while (_cairo_path_fixed_iter_is_fill_box (&iter, &box)) { + if (box.p1.y == box.p2.y || box.p1.x == box.p2.x) + continue; + + if (box.p1.y > box.p2.y) { + cairo_fixed_t t; + + t = box.p1.y; + box.p1.y = box.p2.y; + box.p2.y = t; + + t = box.p1.x; + box.p1.x = box.p2.x; + box.p2.x = t; + } + + status = _cairo_boxes_add (boxes, antialias, &box); + if (unlikely (status)) + return status; + } + + if (_cairo_path_fixed_iter_at_end (&iter)) + return _cairo_bentley_ottmann_tessellate_boxes (boxes, fill_rule, boxes); + + /* path is not rectangular, try extracting clipped rectilinear edges */ + _cairo_boxes_clear (boxes); + return _cairo_path_fixed_fill_rectilinear_tessellate_to_boxes (path, + fill_rule, + antialias, + boxes); +} diff --git a/src/cairo-path-fixed-private.h b/src/cairo-path-fixed-private.h new file mode 100644 index 000000000..cf7cd0836 --- /dev/null +++ b/src/cairo-path-fixed-private.h @@ -0,0 +1,206 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PATH_FIXED_PRIVATE_H +#define CAIRO_PATH_FIXED_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" +#include "cairo-list-private.h" + +#define WATCH_PATH 0 +#if WATCH_PATH +#include +#endif + +enum cairo_path_op { + CAIRO_PATH_OP_MOVE_TO = 0, + CAIRO_PATH_OP_LINE_TO = 1, + CAIRO_PATH_OP_CURVE_TO = 2, + CAIRO_PATH_OP_CLOSE_PATH = 3 +}; + +/* we want to make sure a single byte is used for the enum */ +typedef char cairo_path_op_t; + +/* make _cairo_path_fixed fit into ~512 bytes -- about 50 items */ +#define CAIRO_PATH_BUF_SIZE ((512 - sizeof (cairo_path_buf_t)) \ + / (2 * sizeof (cairo_point_t) + sizeof (cairo_path_op_t))) + +#define cairo_path_head(path__) (&(path__)->buf.base) +#define cairo_path_tail(path__) cairo_path_buf_prev (cairo_path_head (path__)) + +#define cairo_path_buf_next(pos__) \ + cairo_list_entry ((pos__)->link.next, cairo_path_buf_t, link) +#define cairo_path_buf_prev(pos__) \ + cairo_list_entry ((pos__)->link.prev, cairo_path_buf_t, link) + +#define cairo_path_foreach_buf_start(pos__, path__) \ + pos__ = cairo_path_head (path__); do +#define cairo_path_foreach_buf_end(pos__, path__) \ + while ((pos__ = cairo_path_buf_next (pos__)) != cairo_path_head (path__)) + + +typedef struct _cairo_path_buf { + cairo_list_t link; + unsigned int num_ops; + unsigned int size_ops; + unsigned int num_points; + unsigned int size_points; + + cairo_path_op_t *op; + cairo_point_t *points; +} cairo_path_buf_t; + +typedef struct _cairo_path_buf_fixed { + cairo_path_buf_t base; + + cairo_path_op_t op[CAIRO_PATH_BUF_SIZE]; + cairo_point_t points[2 * CAIRO_PATH_BUF_SIZE]; +} cairo_path_buf_fixed_t; + +/* + NOTES: + has_curve_to => !stroke_is_rectilinear + fill_is_rectilinear => stroke_is_rectilinear + fill_is_empty => fill_is_rectilinear + fill_maybe_region => fill_is_rectilinear +*/ +struct _cairo_path_fixed { + cairo_point_t last_move_point; + cairo_point_t current_point; + unsigned int has_current_point : 1; + unsigned int needs_move_to : 1; + unsigned int has_extents : 1; + unsigned int has_curve_to : 1; + unsigned int stroke_is_rectilinear : 1; + unsigned int fill_is_rectilinear : 1; + unsigned int fill_maybe_region : 1; + unsigned int fill_is_empty : 1; + + cairo_box_t extents; + + cairo_path_buf_fixed_t buf; +}; + +cairo_private void +_cairo_path_fixed_translate (cairo_path_fixed_t *path, + cairo_fixed_t offx, + cairo_fixed_t offy); + +cairo_private cairo_status_t +_cairo_path_fixed_append (cairo_path_fixed_t *path, + const cairo_path_fixed_t *other, + cairo_fixed_t tx, + cairo_fixed_t ty); + +cairo_private unsigned long +_cairo_path_fixed_hash (const cairo_path_fixed_t *path); + +cairo_private unsigned long +_cairo_path_fixed_size (const cairo_path_fixed_t *path); + +cairo_private cairo_bool_t +_cairo_path_fixed_equal (const cairo_path_fixed_t *a, + const cairo_path_fixed_t *b); + +typedef struct _cairo_path_fixed_iter { + const cairo_path_buf_t *first; + const cairo_path_buf_t *buf; + unsigned int n_op; + unsigned int n_point; +} cairo_path_fixed_iter_t; + +cairo_private void +_cairo_path_fixed_iter_init (cairo_path_fixed_iter_t *iter, + const cairo_path_fixed_t *path); + +cairo_private cairo_bool_t +_cairo_path_fixed_iter_is_fill_box (cairo_path_fixed_iter_t *_iter, + cairo_box_t *box); + +cairo_private cairo_bool_t +_cairo_path_fixed_iter_at_end (const cairo_path_fixed_iter_t *iter); + +static inline cairo_bool_t +_cairo_path_fixed_fill_is_empty (const cairo_path_fixed_t *path) +{ + return path->fill_is_empty; +} + +static inline cairo_bool_t +_cairo_path_fixed_fill_is_rectilinear (const cairo_path_fixed_t *path) +{ + if (! path->fill_is_rectilinear) + return 0; + + if (! path->has_current_point || path->needs_move_to) + return 1; + + /* check whether the implicit close preserves the rectilinear property */ + return path->current_point.x == path->last_move_point.x || + path->current_point.y == path->last_move_point.y; +} + +static inline cairo_bool_t +_cairo_path_fixed_stroke_is_rectilinear (const cairo_path_fixed_t *path) +{ + return path->stroke_is_rectilinear; +} + +static inline cairo_bool_t +_cairo_path_fixed_fill_maybe_region (const cairo_path_fixed_t *path) +{ + if (! path->fill_maybe_region) + return 0; + + if (! path->has_current_point || path->needs_move_to) + return 1; + + /* check whether the implicit close preserves the rectilinear property + * (the integer point property is automatically preserved) + */ + return path->current_point.x == path->last_move_point.x || + path->current_point.y == path->last_move_point.y; +} + +cairo_private cairo_bool_t +_cairo_path_fixed_is_stroke_box (const cairo_path_fixed_t *path, + cairo_box_t *box); + +cairo_private cairo_bool_t +_cairo_path_fixed_is_simple_quad (const cairo_path_fixed_t *path); + +#endif /* CAIRO_PATH_FIXED_PRIVATE_H */ diff --git a/src/cairo-path-fixed.c b/src/cairo-path-fixed.c new file mode 100644 index 000000000..4bbf496f0 --- /dev/null +++ b/src/cairo-path-fixed.c @@ -0,0 +1,1589 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-error-private.h" +#include "cairo-list-inline.h" +#include "cairo-path-fixed-private.h" +#include "cairo-slope-private.h" + +static cairo_status_t +_cairo_path_fixed_add (cairo_path_fixed_t *path, + cairo_path_op_t op, + const cairo_point_t *points, + int num_points); + +static void +_cairo_path_fixed_add_buf (cairo_path_fixed_t *path, + cairo_path_buf_t *buf); + +static cairo_path_buf_t * +_cairo_path_buf_create (int size_ops, int size_points); + +static void +_cairo_path_buf_destroy (cairo_path_buf_t *buf); + +static void +_cairo_path_buf_add_op (cairo_path_buf_t *buf, + cairo_path_op_t op); + +static void +_cairo_path_buf_add_points (cairo_path_buf_t *buf, + const cairo_point_t *points, + int num_points); + +void +_cairo_path_fixed_init (cairo_path_fixed_t *path) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (path, sizeof (cairo_path_fixed_t))); + + cairo_list_init (&path->buf.base.link); + + path->buf.base.num_ops = 0; + path->buf.base.num_points = 0; + path->buf.base.size_ops = ARRAY_LENGTH (path->buf.op); + path->buf.base.size_points = ARRAY_LENGTH (path->buf.points); + path->buf.base.op = path->buf.op; + path->buf.base.points = path->buf.points; + + path->current_point.x = 0; + path->current_point.y = 0; + path->last_move_point = path->current_point; + + path->has_current_point = FALSE; + path->needs_move_to = TRUE; + path->has_extents = FALSE; + path->has_curve_to = FALSE; + path->stroke_is_rectilinear = TRUE; + path->fill_is_rectilinear = TRUE; + path->fill_maybe_region = TRUE; + path->fill_is_empty = TRUE; + + path->extents.p1.x = path->extents.p1.y = 0; + path->extents.p2.x = path->extents.p2.y = 0; +} + +cairo_status_t +_cairo_path_fixed_init_copy (cairo_path_fixed_t *path, + const cairo_path_fixed_t *other) +{ + cairo_path_buf_t *buf, *other_buf; + unsigned int num_points, num_ops; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (path, sizeof (cairo_path_fixed_t))); + + cairo_list_init (&path->buf.base.link); + + path->buf.base.op = path->buf.op; + path->buf.base.points = path->buf.points; + path->buf.base.size_ops = ARRAY_LENGTH (path->buf.op); + path->buf.base.size_points = ARRAY_LENGTH (path->buf.points); + + path->current_point = other->current_point; + path->last_move_point = other->last_move_point; + + path->has_current_point = other->has_current_point; + path->needs_move_to = other->needs_move_to; + path->has_extents = other->has_extents; + path->has_curve_to = other->has_curve_to; + path->stroke_is_rectilinear = other->stroke_is_rectilinear; + path->fill_is_rectilinear = other->fill_is_rectilinear; + path->fill_maybe_region = other->fill_maybe_region; + path->fill_is_empty = other->fill_is_empty; + + path->extents = other->extents; + + path->buf.base.num_ops = other->buf.base.num_ops; + path->buf.base.num_points = other->buf.base.num_points; + memcpy (path->buf.op, other->buf.base.op, + other->buf.base.num_ops * sizeof (other->buf.op[0])); + memcpy (path->buf.points, other->buf.points, + other->buf.base.num_points * sizeof (other->buf.points[0])); + + num_points = num_ops = 0; + for (other_buf = cairo_path_buf_next (cairo_path_head (other)); + other_buf != cairo_path_head (other); + other_buf = cairo_path_buf_next (other_buf)) + { + num_ops += other_buf->num_ops; + num_points += other_buf->num_points; + } + + if (num_ops) { + buf = _cairo_path_buf_create (num_ops, num_points); + if (unlikely (buf == NULL)) { + _cairo_path_fixed_fini (path); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + for (other_buf = cairo_path_buf_next (cairo_path_head (other)); + other_buf != cairo_path_head (other); + other_buf = cairo_path_buf_next (other_buf)) + { + memcpy (buf->op + buf->num_ops, other_buf->op, + other_buf->num_ops * sizeof (buf->op[0])); + buf->num_ops += other_buf->num_ops; + + memcpy (buf->points + buf->num_points, other_buf->points, + other_buf->num_points * sizeof (buf->points[0])); + buf->num_points += other_buf->num_points; + } + + _cairo_path_fixed_add_buf (path, buf); + } + + return CAIRO_STATUS_SUCCESS; +} + +unsigned long +_cairo_path_fixed_hash (const cairo_path_fixed_t *path) +{ + unsigned long hash = _CAIRO_HASH_INIT_VALUE; + const cairo_path_buf_t *buf; + unsigned int count; + + count = 0; + cairo_path_foreach_buf_start (buf, path) { + hash = _cairo_hash_bytes (hash, buf->op, + buf->num_ops * sizeof (buf->op[0])); + count += buf->num_ops; + } cairo_path_foreach_buf_end (buf, path); + hash = _cairo_hash_bytes (hash, &count, sizeof (count)); + + count = 0; + cairo_path_foreach_buf_start (buf, path) { + hash = _cairo_hash_bytes (hash, buf->points, + buf->num_points * sizeof (buf->points[0])); + count += buf->num_points; + } cairo_path_foreach_buf_end (buf, path); + hash = _cairo_hash_bytes (hash, &count, sizeof (count)); + + return hash; +} + +unsigned long +_cairo_path_fixed_size (const cairo_path_fixed_t *path) +{ + const cairo_path_buf_t *buf; + int num_points, num_ops; + + num_ops = num_points = 0; + cairo_path_foreach_buf_start (buf, path) { + num_ops += buf->num_ops; + num_points += buf->num_points; + } cairo_path_foreach_buf_end (buf, path); + + return num_ops * sizeof (buf->op[0]) + + num_points * sizeof (buf->points[0]); +} + +cairo_bool_t +_cairo_path_fixed_equal (const cairo_path_fixed_t *a, + const cairo_path_fixed_t *b) +{ + const cairo_path_buf_t *buf_a, *buf_b; + const cairo_path_op_t *ops_a, *ops_b; + const cairo_point_t *points_a, *points_b; + int num_points_a, num_ops_a; + int num_points_b, num_ops_b; + + if (a == b) + return TRUE; + + /* use the flags to quickly differentiate based on contents */ + if (a->has_curve_to != b->has_curve_to) + { + return FALSE; + } + + if (a->extents.p1.x != b->extents.p1.x || + a->extents.p1.y != b->extents.p1.y || + a->extents.p2.x != b->extents.p2.x || + a->extents.p2.y != b->extents.p2.y) + { + return FALSE; + } + + num_ops_a = num_points_a = 0; + cairo_path_foreach_buf_start (buf_a, a) { + num_ops_a += buf_a->num_ops; + num_points_a += buf_a->num_points; + } cairo_path_foreach_buf_end (buf_a, a); + + num_ops_b = num_points_b = 0; + cairo_path_foreach_buf_start (buf_b, b) { + num_ops_b += buf_b->num_ops; + num_points_b += buf_b->num_points; + } cairo_path_foreach_buf_end (buf_b, b); + + if (num_ops_a == 0 && num_ops_b == 0) + return TRUE; + + if (num_ops_a != num_ops_b || num_points_a != num_points_b) + return FALSE; + + buf_a = cairo_path_head (a); + num_points_a = buf_a->num_points; + num_ops_a = buf_a->num_ops; + ops_a = buf_a->op; + points_a = buf_a->points; + + buf_b = cairo_path_head (b); + num_points_b = buf_b->num_points; + num_ops_b = buf_b->num_ops; + ops_b = buf_b->op; + points_b = buf_b->points; + + while (TRUE) { + int num_ops = MIN (num_ops_a, num_ops_b); + int num_points = MIN (num_points_a, num_points_b); + + if (memcmp (ops_a, ops_b, num_ops * sizeof (cairo_path_op_t))) + return FALSE; + if (memcmp (points_a, points_b, num_points * sizeof (cairo_point_t))) + return FALSE; + + num_ops_a -= num_ops; + ops_a += num_ops; + num_points_a -= num_points; + points_a += num_points; + if (num_ops_a == 0 || num_points_a == 0) { + if (num_ops_a || num_points_a) + return FALSE; + + buf_a = cairo_path_buf_next (buf_a); + if (buf_a == cairo_path_head (a)) + break; + + num_points_a = buf_a->num_points; + num_ops_a = buf_a->num_ops; + ops_a = buf_a->op; + points_a = buf_a->points; + } + + num_ops_b -= num_ops; + ops_b += num_ops; + num_points_b -= num_points; + points_b += num_points; + if (num_ops_b == 0 || num_points_b == 0) { + if (num_ops_b || num_points_b) + return FALSE; + + buf_b = cairo_path_buf_next (buf_b); + if (buf_b == cairo_path_head (b)) + break; + + num_points_b = buf_b->num_points; + num_ops_b = buf_b->num_ops; + ops_b = buf_b->op; + points_b = buf_b->points; + } + } + + return TRUE; +} + +cairo_path_fixed_t * +_cairo_path_fixed_create (void) +{ + cairo_path_fixed_t *path; + + path = malloc (sizeof (cairo_path_fixed_t)); + if (!path) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + _cairo_path_fixed_init (path); + return path; +} + +void +_cairo_path_fixed_fini (cairo_path_fixed_t *path) +{ + cairo_path_buf_t *buf; + + buf = cairo_path_buf_next (cairo_path_head (path)); + while (buf != cairo_path_head (path)) { + cairo_path_buf_t *this = buf; + buf = cairo_path_buf_next (buf); + _cairo_path_buf_destroy (this); + } + + VG (VALGRIND_MAKE_MEM_NOACCESS (path, sizeof (cairo_path_fixed_t))); +} + +void +_cairo_path_fixed_destroy (cairo_path_fixed_t *path) +{ + _cairo_path_fixed_fini (path); + free (path); +} + +static cairo_path_op_t +_cairo_path_fixed_last_op (cairo_path_fixed_t *path) +{ + cairo_path_buf_t *buf; + + buf = cairo_path_tail (path); + assert (buf->num_ops != 0); + + return buf->op[buf->num_ops - 1]; +} + +static inline const cairo_point_t * +_cairo_path_fixed_penultimate_point (cairo_path_fixed_t *path) +{ + cairo_path_buf_t *buf; + + buf = cairo_path_tail (path); + if (likely (buf->num_points >= 2)) { + return &buf->points[buf->num_points - 2]; + } else { + cairo_path_buf_t *prev_buf = cairo_path_buf_prev (buf); + + assert (prev_buf->num_points >= 2 - buf->num_points); + return &prev_buf->points[prev_buf->num_points - (2 - buf->num_points)]; + } +} + +static void +_cairo_path_fixed_drop_line_to (cairo_path_fixed_t *path) +{ + cairo_path_buf_t *buf; + + assert (_cairo_path_fixed_last_op (path) == CAIRO_PATH_OP_LINE_TO); + + buf = cairo_path_tail (path); + buf->num_points--; + buf->num_ops--; +} + +cairo_status_t +_cairo_path_fixed_move_to (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y) +{ + _cairo_path_fixed_new_sub_path (path); + + path->has_current_point = TRUE; + path->current_point.x = x; + path->current_point.y = y; + path->last_move_point = path->current_point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_fixed_move_to_apply (cairo_path_fixed_t *path) +{ + if (likely (! path->needs_move_to)) + return CAIRO_STATUS_SUCCESS; + + path->needs_move_to = FALSE; + + if (path->has_extents) { + _cairo_box_add_point (&path->extents, &path->current_point); + } else { + _cairo_box_set (&path->extents, &path->current_point, &path->current_point); + path->has_extents = TRUE; + } + + if (path->fill_maybe_region) { + path->fill_maybe_region = _cairo_fixed_is_integer (path->current_point.x) && + _cairo_fixed_is_integer (path->current_point.y); + } + + path->last_move_point = path->current_point; + + return _cairo_path_fixed_add (path, CAIRO_PATH_OP_MOVE_TO, &path->current_point, 1); +} + +void +_cairo_path_fixed_new_sub_path (cairo_path_fixed_t *path) +{ + if (! path->needs_move_to) { + /* If the current subpath doesn't need_move_to, it contains at least one command */ + if (path->fill_is_rectilinear) { + /* Implicitly close for fill */ + path->fill_is_rectilinear = path->current_point.x == path->last_move_point.x || + path->current_point.y == path->last_move_point.y; + path->fill_maybe_region &= path->fill_is_rectilinear; + } + path->needs_move_to = TRUE; + } + + path->has_current_point = FALSE; +} + +cairo_status_t +_cairo_path_fixed_rel_move_to (cairo_path_fixed_t *path, + cairo_fixed_t dx, + cairo_fixed_t dy) +{ + if (unlikely (! path->has_current_point)) + return _cairo_error (CAIRO_STATUS_NO_CURRENT_POINT); + + return _cairo_path_fixed_move_to (path, + path->current_point.x + dx, + path->current_point.y + dy); + +} + +cairo_status_t +_cairo_path_fixed_line_to (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y) +{ + cairo_status_t status; + cairo_point_t point; + + point.x = x; + point.y = y; + + /* When there is not yet a current point, the line_to operation + * becomes a move_to instead. Note: We have to do this by + * explicitly calling into _cairo_path_fixed_move_to to ensure + * that the last_move_point state is updated properly. + */ + if (! path->has_current_point) + return _cairo_path_fixed_move_to (path, point.x, point.y); + + status = _cairo_path_fixed_move_to_apply (path); + if (unlikely (status)) + return status; + + /* If the previous op was but the initial MOVE_TO and this segment + * is degenerate, then we can simply skip this point. Note that + * a move-to followed by a degenerate line-to is a valid path for + * stroking, but at all other times is simply a degenerate segment. + */ + if (_cairo_path_fixed_last_op (path) != CAIRO_PATH_OP_MOVE_TO) { + if (x == path->current_point.x && y == path->current_point.y) + return CAIRO_STATUS_SUCCESS; + } + + /* If the previous op was also a LINE_TO with the same gradient, + * then just change its end-point rather than adding a new op. + */ + if (_cairo_path_fixed_last_op (path) == CAIRO_PATH_OP_LINE_TO) { + const cairo_point_t *p; + + p = _cairo_path_fixed_penultimate_point (path); + if (p->x == path->current_point.x && p->y == path->current_point.y) { + /* previous line element was degenerate, replace */ + _cairo_path_fixed_drop_line_to (path); + } else { + cairo_slope_t prev, self; + + _cairo_slope_init (&prev, p, &path->current_point); + _cairo_slope_init (&self, &path->current_point, &point); + if (_cairo_slope_equal (&prev, &self) && + /* cannot trim anti-parallel segments whilst stroking */ + ! _cairo_slope_backwards (&prev, &self)) + { + _cairo_path_fixed_drop_line_to (path); + /* In this case the flags might be more restrictive than + * what we actually need. + * When changing the flags definition we should check if + * changing the line_to point can affect them. + */ + } + } + } + + if (path->stroke_is_rectilinear) { + path->stroke_is_rectilinear = path->current_point.x == x || + path->current_point.y == y; + path->fill_is_rectilinear &= path->stroke_is_rectilinear; + path->fill_maybe_region &= path->fill_is_rectilinear; + if (path->fill_maybe_region) { + path->fill_maybe_region = _cairo_fixed_is_integer (x) && + _cairo_fixed_is_integer (y); + } + if (path->fill_is_empty) { + path->fill_is_empty = path->current_point.x == x && + path->current_point.y == y; + } + } + + path->current_point = point; + + _cairo_box_add_point (&path->extents, &point); + + return _cairo_path_fixed_add (path, CAIRO_PATH_OP_LINE_TO, &point, 1); +} + +cairo_status_t +_cairo_path_fixed_rel_line_to (cairo_path_fixed_t *path, + cairo_fixed_t dx, + cairo_fixed_t dy) +{ + if (unlikely (! path->has_current_point)) + return _cairo_error (CAIRO_STATUS_NO_CURRENT_POINT); + + return _cairo_path_fixed_line_to (path, + path->current_point.x + dx, + path->current_point.y + dy); +} + +cairo_status_t +_cairo_path_fixed_curve_to (cairo_path_fixed_t *path, + cairo_fixed_t x0, cairo_fixed_t y0, + cairo_fixed_t x1, cairo_fixed_t y1, + cairo_fixed_t x2, cairo_fixed_t y2) +{ + cairo_status_t status; + cairo_point_t point[3]; + + /* If this curves does not move, replace it with a line-to. + * This frequently happens with rounded-rectangles and r==0. + */ + if (path->current_point.x == x2 && path->current_point.y == y2) { + if (x1 == x2 && x0 == x2 && y1 == y2 && y0 == y2) + return _cairo_path_fixed_line_to (path, x2, y2); + + /* We may want to check for the absence of a cusp, in which case + * we can also replace the curve-to with a line-to. + */ + } + + /* make sure subpaths are started properly */ + if (! path->has_current_point) { + status = _cairo_path_fixed_move_to (path, x0, y0); + assert (status == CAIRO_STATUS_SUCCESS); + } + + status = _cairo_path_fixed_move_to_apply (path); + if (unlikely (status)) + return status; + + /* If the previous op was a degenerate LINE_TO, drop it. */ + if (_cairo_path_fixed_last_op (path) == CAIRO_PATH_OP_LINE_TO) { + const cairo_point_t *p; + + p = _cairo_path_fixed_penultimate_point (path); + if (p->x == path->current_point.x && p->y == path->current_point.y) { + /* previous line element was degenerate, replace */ + _cairo_path_fixed_drop_line_to (path); + } + } + + point[0].x = x0; point[0].y = y0; + point[1].x = x1; point[1].y = y1; + point[2].x = x2; point[2].y = y2; + + _cairo_box_add_curve_to (&path->extents, &path->current_point, + &point[0], &point[1], &point[2]); + + path->current_point = point[2]; + path->has_curve_to = TRUE; + path->stroke_is_rectilinear = FALSE; + path->fill_is_rectilinear = FALSE; + path->fill_maybe_region = FALSE; + path->fill_is_empty = FALSE; + + return _cairo_path_fixed_add (path, CAIRO_PATH_OP_CURVE_TO, point, 3); +} + +cairo_status_t +_cairo_path_fixed_rel_curve_to (cairo_path_fixed_t *path, + cairo_fixed_t dx0, cairo_fixed_t dy0, + cairo_fixed_t dx1, cairo_fixed_t dy1, + cairo_fixed_t dx2, cairo_fixed_t dy2) +{ + if (unlikely (! path->has_current_point)) + return _cairo_error (CAIRO_STATUS_NO_CURRENT_POINT); + + return _cairo_path_fixed_curve_to (path, + path->current_point.x + dx0, + path->current_point.y + dy0, + + path->current_point.x + dx1, + path->current_point.y + dy1, + + path->current_point.x + dx2, + path->current_point.y + dy2); +} + +cairo_status_t +_cairo_path_fixed_close_path (cairo_path_fixed_t *path) +{ + cairo_status_t status; + + if (! path->has_current_point) + return CAIRO_STATUS_SUCCESS; + + /* + * Add a line_to, to compute flags and solve any degeneracy. + * It will be removed later (if it was actually added). + */ + status = _cairo_path_fixed_line_to (path, + path->last_move_point.x, + path->last_move_point.y); + if (unlikely (status)) + return status; + + /* + * If the command used to close the path is a line_to, drop it. + * We must check that last command is actually a line_to, + * because the path could have been closed with a curve_to (and + * the previous line_to not added as it would be degenerate). + */ + if (_cairo_path_fixed_last_op (path) == CAIRO_PATH_OP_LINE_TO) + _cairo_path_fixed_drop_line_to (path); + + path->needs_move_to = TRUE; /* After close_path, add an implicit move_to */ + + return _cairo_path_fixed_add (path, CAIRO_PATH_OP_CLOSE_PATH, NULL, 0); +} + +cairo_bool_t +_cairo_path_fixed_get_current_point (cairo_path_fixed_t *path, + cairo_fixed_t *x, + cairo_fixed_t *y) +{ + if (! path->has_current_point) + return FALSE; + + *x = path->current_point.x; + *y = path->current_point.y; + + return TRUE; +} + +static cairo_status_t +_cairo_path_fixed_add (cairo_path_fixed_t *path, + cairo_path_op_t op, + const cairo_point_t *points, + int num_points) +{ + cairo_path_buf_t *buf = cairo_path_tail (path); + + if (buf->num_ops + 1 > buf->size_ops || + buf->num_points + num_points > buf->size_points) + { + buf = _cairo_path_buf_create (buf->num_ops * 2, buf->num_points * 2); + if (unlikely (buf == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_path_fixed_add_buf (path, buf); + } + + if (WATCH_PATH) { + const char *op_str[] = { + "move-to", + "line-to", + "curve-to", + "close-path", + }; + char buf[1024]; + int len = 0; + int i; + + len += snprintf (buf + len, sizeof (buf), "["); + for (i = 0; i < num_points; i++) { + if (i != 0) + len += snprintf (buf + len, sizeof (buf), " "); + len += snprintf (buf + len, sizeof (buf), "(%f, %f)", + _cairo_fixed_to_double (points[i].x), + _cairo_fixed_to_double (points[i].y)); + } + len += snprintf (buf + len, sizeof (buf), "]"); + +#define STRINGIFYFLAG(x) (path->x ? #x " " : "") + fprintf (stderr, + "_cairo_path_fixed_add (%s, %s) [%s%s%s%s%s%s%s%s]\n", + op_str[(int) op], buf, + STRINGIFYFLAG(has_current_point), + STRINGIFYFLAG(needs_move_to), + STRINGIFYFLAG(has_extents), + STRINGIFYFLAG(has_curve_to), + STRINGIFYFLAG(stroke_is_rectilinear), + STRINGIFYFLAG(fill_is_rectilinear), + STRINGIFYFLAG(fill_is_empty), + STRINGIFYFLAG(fill_maybe_region) + ); +#undef STRINGIFYFLAG + } + + _cairo_path_buf_add_op (buf, op); + _cairo_path_buf_add_points (buf, points, num_points); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_path_fixed_add_buf (cairo_path_fixed_t *path, + cairo_path_buf_t *buf) +{ + cairo_list_add_tail (&buf->link, &cairo_path_head (path)->link); +} + +COMPILE_TIME_ASSERT (sizeof (cairo_path_op_t) == 1); +static cairo_path_buf_t * +_cairo_path_buf_create (int size_ops, int size_points) +{ + cairo_path_buf_t *buf; + + /* adjust size_ops to ensure that buf->points is naturally aligned */ + size_ops += sizeof (double) - ((sizeof (cairo_path_buf_t) + size_ops) % sizeof (double)); + buf = _cairo_malloc_ab_plus_c (size_points, sizeof (cairo_point_t), size_ops + sizeof (cairo_path_buf_t)); + if (buf) { + buf->num_ops = 0; + buf->num_points = 0; + buf->size_ops = size_ops; + buf->size_points = size_points; + + buf->op = (cairo_path_op_t *) (buf + 1); + buf->points = (cairo_point_t *) (buf->op + size_ops); + } + + return buf; +} + +static void +_cairo_path_buf_destroy (cairo_path_buf_t *buf) +{ + free (buf); +} + +static void +_cairo_path_buf_add_op (cairo_path_buf_t *buf, + cairo_path_op_t op) +{ + buf->op[buf->num_ops++] = op; +} + +static void +_cairo_path_buf_add_points (cairo_path_buf_t *buf, + const cairo_point_t *points, + int num_points) +{ + if (num_points == 0) + return; + + memcpy (buf->points + buf->num_points, + points, + sizeof (points[0]) * num_points); + buf->num_points += num_points; +} + +cairo_status_t +_cairo_path_fixed_interpret (const cairo_path_fixed_t *path, + cairo_path_fixed_move_to_func_t *move_to, + cairo_path_fixed_line_to_func_t *line_to, + cairo_path_fixed_curve_to_func_t *curve_to, + cairo_path_fixed_close_path_func_t *close_path, + void *closure) +{ + const cairo_path_buf_t *buf; + cairo_status_t status; + + cairo_path_foreach_buf_start (buf, path) { + const cairo_point_t *points = buf->points; + unsigned int i; + + for (i = 0; i < buf->num_ops; i++) { + switch (buf->op[i]) { + case CAIRO_PATH_OP_MOVE_TO: + status = (*move_to) (closure, &points[0]); + points += 1; + break; + case CAIRO_PATH_OP_LINE_TO: + status = (*line_to) (closure, &points[0]); + points += 1; + break; + case CAIRO_PATH_OP_CURVE_TO: + status = (*curve_to) (closure, &points[0], &points[1], &points[2]); + points += 3; + break; + default: + ASSERT_NOT_REACHED; + case CAIRO_PATH_OP_CLOSE_PATH: + status = (*close_path) (closure); + break; + } + + if (unlikely (status)) + return status; + } + } cairo_path_foreach_buf_end (buf, path); + + if (path->needs_move_to && path->has_current_point) + return (*move_to) (closure, &path->current_point); + + return CAIRO_STATUS_SUCCESS; +} + +typedef struct _cairo_path_fixed_append_closure { + cairo_point_t offset; + cairo_path_fixed_t *path; +} cairo_path_fixed_append_closure_t; + +static cairo_status_t +_append_move_to (void *abstract_closure, + const cairo_point_t *point) +{ + cairo_path_fixed_append_closure_t *closure = abstract_closure; + + return _cairo_path_fixed_move_to (closure->path, + point->x + closure->offset.x, + point->y + closure->offset.y); +} + +static cairo_status_t +_append_line_to (void *abstract_closure, + const cairo_point_t *point) +{ + cairo_path_fixed_append_closure_t *closure = abstract_closure; + + return _cairo_path_fixed_line_to (closure->path, + point->x + closure->offset.x, + point->y + closure->offset.y); +} + +static cairo_status_t +_append_curve_to (void *abstract_closure, + const cairo_point_t *p0, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + cairo_path_fixed_append_closure_t *closure = abstract_closure; + + return _cairo_path_fixed_curve_to (closure->path, + p0->x + closure->offset.x, + p0->y + closure->offset.y, + p1->x + closure->offset.x, + p1->y + closure->offset.y, + p2->x + closure->offset.x, + p2->y + closure->offset.y); +} + +static cairo_status_t +_append_close_path (void *abstract_closure) +{ + cairo_path_fixed_append_closure_t *closure = abstract_closure; + + return _cairo_path_fixed_close_path (closure->path); +} + +cairo_status_t +_cairo_path_fixed_append (cairo_path_fixed_t *path, + const cairo_path_fixed_t *other, + cairo_fixed_t tx, + cairo_fixed_t ty) +{ + cairo_path_fixed_append_closure_t closure; + + closure.path = path; + closure.offset.x = tx; + closure.offset.y = ty; + + return _cairo_path_fixed_interpret (other, + _append_move_to, + _append_line_to, + _append_curve_to, + _append_close_path, + &closure); +} + +static void +_cairo_path_fixed_offset_and_scale (cairo_path_fixed_t *path, + cairo_fixed_t offx, + cairo_fixed_t offy, + cairo_fixed_t scalex, + cairo_fixed_t scaley) +{ + cairo_path_buf_t *buf; + unsigned int i; + + if (scalex == CAIRO_FIXED_ONE && scaley == CAIRO_FIXED_ONE) { + _cairo_path_fixed_translate (path, offx, offy); + return; + } + + path->last_move_point.x = _cairo_fixed_mul (scalex, path->last_move_point.x) + offx; + path->last_move_point.y = _cairo_fixed_mul (scaley, path->last_move_point.y) + offy; + path->current_point.x = _cairo_fixed_mul (scalex, path->current_point.x) + offx; + path->current_point.y = _cairo_fixed_mul (scaley, path->current_point.y) + offy; + + path->fill_maybe_region = TRUE; + + cairo_path_foreach_buf_start (buf, path) { + for (i = 0; i < buf->num_points; i++) { + if (scalex != CAIRO_FIXED_ONE) + buf->points[i].x = _cairo_fixed_mul (buf->points[i].x, scalex); + buf->points[i].x += offx; + + if (scaley != CAIRO_FIXED_ONE) + buf->points[i].y = _cairo_fixed_mul (buf->points[i].y, scaley); + buf->points[i].y += offy; + + if (path->fill_maybe_region) { + path->fill_maybe_region = _cairo_fixed_is_integer (buf->points[i].x) && + _cairo_fixed_is_integer (buf->points[i].y); + } + } + } cairo_path_foreach_buf_end (buf, path); + + path->fill_maybe_region &= path->fill_is_rectilinear; + + path->extents.p1.x = _cairo_fixed_mul (scalex, path->extents.p1.x) + offx; + path->extents.p2.x = _cairo_fixed_mul (scalex, path->extents.p2.x) + offx; + if (scalex < 0) { + cairo_fixed_t t = path->extents.p1.x; + path->extents.p1.x = path->extents.p2.x; + path->extents.p2.x = t; + } + + path->extents.p1.y = _cairo_fixed_mul (scaley, path->extents.p1.y) + offy; + path->extents.p2.y = _cairo_fixed_mul (scaley, path->extents.p2.y) + offy; + if (scaley < 0) { + cairo_fixed_t t = path->extents.p1.y; + path->extents.p1.y = path->extents.p2.y; + path->extents.p2.y = t; + } +} + +void +_cairo_path_fixed_translate (cairo_path_fixed_t *path, + cairo_fixed_t offx, + cairo_fixed_t offy) +{ + cairo_path_buf_t *buf; + unsigned int i; + + if (offx == 0 && offy == 0) + return; + + path->last_move_point.x += offx; + path->last_move_point.y += offy; + path->current_point.x += offx; + path->current_point.y += offy; + + path->fill_maybe_region = TRUE; + + cairo_path_foreach_buf_start (buf, path) { + for (i = 0; i < buf->num_points; i++) { + buf->points[i].x += offx; + buf->points[i].y += offy; + + if (path->fill_maybe_region) { + path->fill_maybe_region = _cairo_fixed_is_integer (buf->points[i].x) && + _cairo_fixed_is_integer (buf->points[i].y); + } + } + } cairo_path_foreach_buf_end (buf, path); + + path->fill_maybe_region &= path->fill_is_rectilinear; + + path->extents.p1.x += offx; + path->extents.p1.y += offy; + path->extents.p2.x += offx; + path->extents.p2.y += offy; +} + + +static inline void +_cairo_path_fixed_transform_point (cairo_point_t *p, + const cairo_matrix_t *matrix) +{ + double dx, dy; + + dx = _cairo_fixed_to_double (p->x); + dy = _cairo_fixed_to_double (p->y); + cairo_matrix_transform_point (matrix, &dx, &dy); + p->x = _cairo_fixed_from_double (dx); + p->y = _cairo_fixed_from_double (dy); +} + +/** + * _cairo_path_fixed_transform: + * @path: a #cairo_path_fixed_t to be transformed + * @matrix: a #cairo_matrix_t + * + * Transform the fixed-point path according to the given matrix. + * There is a fast path for the case where @matrix has no rotation + * or shear. + **/ +void +_cairo_path_fixed_transform (cairo_path_fixed_t *path, + const cairo_matrix_t *matrix) +{ + cairo_box_t extents; + cairo_point_t point; + cairo_path_buf_t *buf; + unsigned int i; + + if (matrix->yx == 0.0 && matrix->xy == 0.0) { + /* Fast path for the common case of scale+transform */ + _cairo_path_fixed_offset_and_scale (path, + _cairo_fixed_from_double (matrix->x0), + _cairo_fixed_from_double (matrix->y0), + _cairo_fixed_from_double (matrix->xx), + _cairo_fixed_from_double (matrix->yy)); + return; + } + + _cairo_path_fixed_transform_point (&path->last_move_point, matrix); + _cairo_path_fixed_transform_point (&path->current_point, matrix); + + buf = cairo_path_head (path); + if (buf->num_points == 0) + return; + + extents = path->extents; + point = buf->points[0]; + _cairo_path_fixed_transform_point (&point, matrix); + _cairo_box_set (&path->extents, &point, &point); + + cairo_path_foreach_buf_start (buf, path) { + for (i = 0; i < buf->num_points; i++) { + _cairo_path_fixed_transform_point (&buf->points[i], matrix); + _cairo_box_add_point (&path->extents, &buf->points[i]); + } + } cairo_path_foreach_buf_end (buf, path); + + if (path->has_curve_to) { + cairo_bool_t is_tight; + + _cairo_matrix_transform_bounding_box_fixed (matrix, &extents, &is_tight); + if (!is_tight) { + cairo_bool_t has_extents; + + has_extents = _cairo_path_bounder_extents (path, &extents); + assert (has_extents); + } + path->extents = extents; + } + + /* flags might become more strict than needed */ + path->stroke_is_rectilinear = FALSE; + path->fill_is_rectilinear = FALSE; + path->fill_is_empty = FALSE; + path->fill_maybe_region = FALSE; +} + +/* Closure for path flattening */ +typedef struct cairo_path_flattener { + double tolerance; + cairo_point_t current_point; + cairo_path_fixed_move_to_func_t *move_to; + cairo_path_fixed_line_to_func_t *line_to; + cairo_path_fixed_close_path_func_t *close_path; + void *closure; +} cpf_t; + +static cairo_status_t +_cpf_move_to (void *closure, + const cairo_point_t *point) +{ + cpf_t *cpf = closure; + + cpf->current_point = *point; + + return cpf->move_to (cpf->closure, point); +} + +static cairo_status_t +_cpf_line_to (void *closure, + const cairo_point_t *point) +{ + cpf_t *cpf = closure; + + cpf->current_point = *point; + + return cpf->line_to (cpf->closure, point); +} + +static cairo_status_t +_cpf_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + cpf_t *cpf = closure; + cairo_spline_t spline; + + cairo_point_t *p0 = &cpf->current_point; + + if (! _cairo_spline_init (&spline, + (cairo_spline_add_point_func_t)cpf->line_to, + cpf->closure, + p0, p1, p2, p3)) + { + return _cpf_line_to (closure, p3); + } + + cpf->current_point = *p3; + + return _cairo_spline_decompose (&spline, cpf->tolerance); +} + +static cairo_status_t +_cpf_close_path (void *closure) +{ + cpf_t *cpf = closure; + + return cpf->close_path (cpf->closure); +} + +cairo_status_t +_cairo_path_fixed_interpret_flat (const cairo_path_fixed_t *path, + cairo_path_fixed_move_to_func_t *move_to, + cairo_path_fixed_line_to_func_t *line_to, + cairo_path_fixed_close_path_func_t *close_path, + void *closure, + double tolerance) +{ + cpf_t flattener; + + if (! path->has_curve_to) { + return _cairo_path_fixed_interpret (path, + move_to, + line_to, + NULL, + close_path, + closure); + } + + flattener.tolerance = tolerance; + flattener.move_to = move_to; + flattener.line_to = line_to; + flattener.close_path = close_path; + flattener.closure = closure; + return _cairo_path_fixed_interpret (path, + _cpf_move_to, + _cpf_line_to, + _cpf_curve_to, + _cpf_close_path, + &flattener); +} + +static inline void +_canonical_box (cairo_box_t *box, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + if (p1->x <= p2->x) { + box->p1.x = p1->x; + box->p2.x = p2->x; + } else { + box->p1.x = p2->x; + box->p2.x = p1->x; + } + + if (p1->y <= p2->y) { + box->p1.y = p1->y; + box->p2.y = p2->y; + } else { + box->p1.y = p2->y; + box->p2.y = p1->y; + } +} + +static inline cairo_bool_t +_path_is_quad (const cairo_path_fixed_t *path) +{ + const cairo_path_buf_t *buf = cairo_path_head (path); + + /* Do we have the right number of ops? */ + if (buf->num_ops < 4 || buf->num_ops > 6) + return FALSE; + + /* Check whether the ops are those that would be used for a rectangle */ + if (buf->op[0] != CAIRO_PATH_OP_MOVE_TO || + buf->op[1] != CAIRO_PATH_OP_LINE_TO || + buf->op[2] != CAIRO_PATH_OP_LINE_TO || + buf->op[3] != CAIRO_PATH_OP_LINE_TO) + { + return FALSE; + } + + /* we accept an implicit close for filled paths */ + if (buf->num_ops > 4) { + /* Now, there are choices. The rectangle might end with a LINE_TO + * (to the original point), but this isn't required. If it + * doesn't, then it must end with a CLOSE_PATH. */ + if (buf->op[4] == CAIRO_PATH_OP_LINE_TO) { + if (buf->points[4].x != buf->points[0].x || + buf->points[4].y != buf->points[0].y) + return FALSE; + } else if (buf->op[4] != CAIRO_PATH_OP_CLOSE_PATH) { + return FALSE; + } + + if (buf->num_ops == 6) { + /* A trailing CLOSE_PATH or MOVE_TO is ok */ + if (buf->op[5] != CAIRO_PATH_OP_MOVE_TO && + buf->op[5] != CAIRO_PATH_OP_CLOSE_PATH) + return FALSE; + } + } + + return TRUE; +} + +static inline cairo_bool_t +_points_form_rect (const cairo_point_t *points) +{ + if (points[0].y == points[1].y && + points[1].x == points[2].x && + points[2].y == points[3].y && + points[3].x == points[0].x) + return TRUE; + if (points[0].x == points[1].x && + points[1].y == points[2].y && + points[2].x == points[3].x && + points[3].y == points[0].y) + return TRUE; + return FALSE; +} + +/* + * Check whether the given path contains a single rectangle. + */ +cairo_bool_t +_cairo_path_fixed_is_box (const cairo_path_fixed_t *path, + cairo_box_t *box) +{ + const cairo_path_buf_t *buf; + + if (! path->fill_is_rectilinear) + return FALSE; + + if (! _path_is_quad (path)) + return FALSE; + + buf = cairo_path_head (path); + if (_points_form_rect (buf->points)) { + _canonical_box (box, &buf->points[0], &buf->points[2]); + return TRUE; + } + + return FALSE; +} + +/* Determine whether two lines A->B and C->D intersect based on the + * algorithm described here: http://paulbourke.net/geometry/pointlineplane/ */ +static inline cairo_bool_t +_lines_intersect_or_are_coincident (cairo_point_t a, + cairo_point_t b, + cairo_point_t c, + cairo_point_t d) +{ + cairo_int64_t numerator_a, numerator_b, denominator; + cairo_bool_t denominator_negative; + + denominator = _cairo_int64_sub (_cairo_int32x32_64_mul (d.y - c.y, b.x - a.x), + _cairo_int32x32_64_mul (d.x - c.x, b.y - a.y)); + numerator_a = _cairo_int64_sub (_cairo_int32x32_64_mul (d.x - c.x, a.y - c.y), + _cairo_int32x32_64_mul (d.y - c.y, a.x - c.x)); + numerator_b = _cairo_int64_sub (_cairo_int32x32_64_mul (b.x - a.x, a.y - c.y), + _cairo_int32x32_64_mul (b.y - a.y, a.x - c.x)); + + if (_cairo_int64_is_zero (denominator)) { + /* If the denominator and numerators are both zero, + * the lines are coincident. */ + if (_cairo_int64_is_zero (numerator_a) && _cairo_int64_is_zero (numerator_b)) + return TRUE; + + /* Otherwise, a zero denominator indicates the lines are + * parallel and never intersect. */ + return FALSE; + } + + /* The lines intersect if both quotients are between 0 and 1 (exclusive). */ + + /* We first test whether either quotient is a negative number. */ + denominator_negative = _cairo_int64_negative (denominator); + if (_cairo_int64_negative (numerator_a) ^ denominator_negative) + return FALSE; + if (_cairo_int64_negative (numerator_b) ^ denominator_negative) + return FALSE; + + /* A zero quotient indicates an "intersection" at an endpoint, which + * we aren't considering a true intersection. */ + if (_cairo_int64_is_zero (numerator_a) || _cairo_int64_is_zero (numerator_b)) + return FALSE; + + /* If the absolute value of the numerator is larger than or equal to the + * denominator the result of the division would be greater than or equal + * to one. */ + if (! denominator_negative) { + if (! _cairo_int64_lt (numerator_a, denominator) || + ! _cairo_int64_lt (numerator_b, denominator)) + return FALSE; + } else { + if (! _cairo_int64_lt (denominator, numerator_a) || + ! _cairo_int64_lt (denominator, numerator_b)) + return FALSE; + } + + return TRUE; +} + +cairo_bool_t +_cairo_path_fixed_is_simple_quad (const cairo_path_fixed_t *path) +{ + const cairo_point_t *points; + + if (! _path_is_quad (path)) + return FALSE; + + points = cairo_path_head (path)->points; + if (_points_form_rect (points)) + return TRUE; + + if (_lines_intersect_or_are_coincident (points[0], points[1], + points[3], points[2])) + return FALSE; + + if (_lines_intersect_or_are_coincident (points[0], points[3], + points[1], points[2])) + return FALSE; + + return TRUE; +} + +cairo_bool_t +_cairo_path_fixed_is_stroke_box (const cairo_path_fixed_t *path, + cairo_box_t *box) +{ + const cairo_path_buf_t *buf = cairo_path_head (path); + + if (! path->fill_is_rectilinear) + return FALSE; + + /* Do we have the right number of ops? */ + if (buf->num_ops != 5) + return FALSE; + + /* Check whether the ops are those that would be used for a rectangle */ + if (buf->op[0] != CAIRO_PATH_OP_MOVE_TO || + buf->op[1] != CAIRO_PATH_OP_LINE_TO || + buf->op[2] != CAIRO_PATH_OP_LINE_TO || + buf->op[3] != CAIRO_PATH_OP_LINE_TO || + buf->op[4] != CAIRO_PATH_OP_CLOSE_PATH) + { + return FALSE; + } + + /* Ok, we may have a box, if the points line up */ + if (buf->points[0].y == buf->points[1].y && + buf->points[1].x == buf->points[2].x && + buf->points[2].y == buf->points[3].y && + buf->points[3].x == buf->points[0].x) + { + _canonical_box (box, &buf->points[0], &buf->points[2]); + return TRUE; + } + + if (buf->points[0].x == buf->points[1].x && + buf->points[1].y == buf->points[2].y && + buf->points[2].x == buf->points[3].x && + buf->points[3].y == buf->points[0].y) + { + _canonical_box (box, &buf->points[0], &buf->points[2]); + return TRUE; + } + + return FALSE; +} + +/* + * Check whether the given path contains a single rectangle + * that is logically equivalent to: + * + * cairo_move_to (cr, x, y); + * cairo_rel_line_to (cr, width, 0); + * cairo_rel_line_to (cr, 0, height); + * cairo_rel_line_to (cr, -width, 0); + * cairo_close_path (cr); + * + */ +cairo_bool_t +_cairo_path_fixed_is_rectangle (const cairo_path_fixed_t *path, + cairo_box_t *box) +{ + const cairo_path_buf_t *buf; + + if (! _cairo_path_fixed_is_box (path, box)) + return FALSE; + + /* This check is valid because the current implementation of + * _cairo_path_fixed_is_box () only accepts rectangles like: + * move,line,line,line[,line|close[,close|move]]. */ + buf = cairo_path_head (path); + if (buf->num_ops > 4) + return TRUE; + + return FALSE; +} + +void +_cairo_path_fixed_iter_init (cairo_path_fixed_iter_t *iter, + const cairo_path_fixed_t *path) +{ + iter->first = iter->buf = cairo_path_head (path); + iter->n_op = 0; + iter->n_point = 0; +} + +static cairo_bool_t +_cairo_path_fixed_iter_next_op (cairo_path_fixed_iter_t *iter) +{ + if (++iter->n_op >= iter->buf->num_ops) { + iter->buf = cairo_path_buf_next (iter->buf); + if (iter->buf == iter->first) { + iter->buf = NULL; + return FALSE; + } + + iter->n_op = 0; + iter->n_point = 0; + } + + return TRUE; +} + +cairo_bool_t +_cairo_path_fixed_iter_is_fill_box (cairo_path_fixed_iter_t *_iter, + cairo_box_t *box) +{ + cairo_point_t points[5]; + cairo_path_fixed_iter_t iter; + + if (_iter->buf == NULL) + return FALSE; + + iter = *_iter; + + if (iter.n_op == iter.buf->num_ops && ! _cairo_path_fixed_iter_next_op (&iter)) + return FALSE; + + /* Check whether the ops are those that would be used for a rectangle */ + if (iter.buf->op[iter.n_op] != CAIRO_PATH_OP_MOVE_TO) + return FALSE; + points[0] = iter.buf->points[iter.n_point++]; + if (! _cairo_path_fixed_iter_next_op (&iter)) + return FALSE; + + if (iter.buf->op[iter.n_op] != CAIRO_PATH_OP_LINE_TO) + return FALSE; + points[1] = iter.buf->points[iter.n_point++]; + if (! _cairo_path_fixed_iter_next_op (&iter)) + return FALSE; + + /* a horizontal/vertical closed line is also a degenerate rectangle */ + switch (iter.buf->op[iter.n_op]) { + case CAIRO_PATH_OP_CLOSE_PATH: + _cairo_path_fixed_iter_next_op (&iter); + case CAIRO_PATH_OP_MOVE_TO: /* implicit close */ + box->p1 = box->p2 = points[0]; + *_iter = iter; + return TRUE; + default: + return FALSE; + case CAIRO_PATH_OP_LINE_TO: + break; + } + + points[2] = iter.buf->points[iter.n_point++]; + if (! _cairo_path_fixed_iter_next_op (&iter)) + return FALSE; + + if (iter.buf->op[iter.n_op] != CAIRO_PATH_OP_LINE_TO) + return FALSE; + points[3] = iter.buf->points[iter.n_point++]; + + /* Now, there are choices. The rectangle might end with a LINE_TO + * (to the original point), but this isn't required. If it + * doesn't, then it must end with a CLOSE_PATH (which may be implicit). */ + if (! _cairo_path_fixed_iter_next_op (&iter)) { + /* implicit close due to fill */ + } else if (iter.buf->op[iter.n_op] == CAIRO_PATH_OP_LINE_TO) { + points[4] = iter.buf->points[iter.n_point++]; + if (points[4].x != points[0].x || points[4].y != points[0].y) + return FALSE; + _cairo_path_fixed_iter_next_op (&iter); + } else if (iter.buf->op[iter.n_op] == CAIRO_PATH_OP_CLOSE_PATH) { + _cairo_path_fixed_iter_next_op (&iter); + } else if (iter.buf->op[iter.n_op] == CAIRO_PATH_OP_MOVE_TO) { + /* implicit close-path due to new-sub-path */ + } else { + return FALSE; + } + + /* Ok, we may have a box, if the points line up */ + if (points[0].y == points[1].y && + points[1].x == points[2].x && + points[2].y == points[3].y && + points[3].x == points[0].x) + { + box->p1 = points[0]; + box->p2 = points[2]; + *_iter = iter; + return TRUE; + } + + if (points[0].x == points[1].x && + points[1].y == points[2].y && + points[2].x == points[3].x && + points[3].y == points[0].y) + { + box->p1 = points[1]; + box->p2 = points[3]; + *_iter = iter; + return TRUE; + } + + return FALSE; +} + +cairo_bool_t +_cairo_path_fixed_iter_at_end (const cairo_path_fixed_iter_t *iter) +{ + if (iter->buf == NULL) + return TRUE; + + return iter->n_op == iter->buf->num_ops; +} diff --git a/src/cairo-path-in-fill.c b/src/cairo-path-in-fill.c new file mode 100644 index 000000000..1787fb1a3 --- /dev/null +++ b/src/cairo-path-in-fill.c @@ -0,0 +1,290 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-path-fixed-private.h" + +typedef struct cairo_in_fill { + double tolerance; + cairo_bool_t on_edge; + int winding; + + cairo_fixed_t x, y; + + cairo_bool_t has_current_point; + cairo_point_t current_point; + cairo_point_t first_point; +} cairo_in_fill_t; + +static void +_cairo_in_fill_init (cairo_in_fill_t *in_fill, + double tolerance, + double x, + double y) +{ + in_fill->on_edge = FALSE; + in_fill->winding = 0; + in_fill->tolerance = tolerance; + + in_fill->x = _cairo_fixed_from_double (x); + in_fill->y = _cairo_fixed_from_double (y); + + in_fill->has_current_point = FALSE; + in_fill->current_point.x = 0; + in_fill->current_point.y = 0; +} + +static void +_cairo_in_fill_fini (cairo_in_fill_t *in_fill) +{ +} + +static int +edge_compare_for_y_against_x (const cairo_point_t *p1, + const cairo_point_t *p2, + cairo_fixed_t y, + cairo_fixed_t x) +{ + cairo_fixed_t adx, ady; + cairo_fixed_t dx, dy; + cairo_int64_t L, R; + + adx = p2->x - p1->x; + dx = x - p1->x; + + if (adx == 0) + return -dx; + if ((adx ^ dx) < 0) + return adx; + + dy = y - p1->y; + ady = p2->y - p1->y; + + L = _cairo_int32x32_64_mul (dy, adx); + R = _cairo_int32x32_64_mul (dx, ady); + + return _cairo_int64_cmp (L, R); +} + +static void +_cairo_in_fill_add_edge (cairo_in_fill_t *in_fill, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + int dir; + + if (in_fill->on_edge) + return; + + /* count the number of edge crossing to -∞ */ + + dir = 1; + if (p2->y < p1->y) { + const cairo_point_t *tmp; + + tmp = p1; + p1 = p2; + p2 = tmp; + + dir = -1; + } + + /* First check whether the query is on an edge */ + if ((p1->x == in_fill->x && p1->y == in_fill->y) || + (p2->x == in_fill->x && p2->y == in_fill->y) || + (! (p2->y < in_fill->y || p1->y > in_fill->y || + (p1->x > in_fill->x && p2->x > in_fill->x) || + (p1->x < in_fill->x && p2->x < in_fill->x)) && + edge_compare_for_y_against_x (p1, p2, in_fill->y, in_fill->x) == 0)) + { + in_fill->on_edge = TRUE; + return; + } + + /* edge is entirely above or below, note the shortening rule */ + if (p2->y <= in_fill->y || p1->y > in_fill->y) + return; + + /* edge lies wholly to the right */ + if (p1->x >= in_fill->x && p2->x >= in_fill->x) + return; + + if ((p1->x <= in_fill->x && p2->x <= in_fill->x) || + edge_compare_for_y_against_x (p1, p2, in_fill->y, in_fill->x) < 0) + { + in_fill->winding += dir; + } +} + +static cairo_status_t +_cairo_in_fill_move_to (void *closure, + const cairo_point_t *point) +{ + cairo_in_fill_t *in_fill = closure; + + /* implicit close path */ + if (in_fill->has_current_point) { + _cairo_in_fill_add_edge (in_fill, + &in_fill->current_point, + &in_fill->first_point); + } + + in_fill->first_point = *point; + in_fill->current_point = *point; + in_fill->has_current_point = TRUE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_in_fill_line_to (void *closure, + const cairo_point_t *point) +{ + cairo_in_fill_t *in_fill = closure; + + if (in_fill->has_current_point) + _cairo_in_fill_add_edge (in_fill, &in_fill->current_point, point); + + in_fill->current_point = *point; + in_fill->has_current_point = TRUE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_in_fill_curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + cairo_in_fill_t *in_fill = closure; + cairo_spline_t spline; + cairo_fixed_t top, bot, left; + + /* first reject based on bbox */ + bot = top = in_fill->current_point.y; + if (b->y < top) top = b->y; + if (b->y > bot) bot = b->y; + if (c->y < top) top = c->y; + if (c->y > bot) bot = c->y; + if (d->y < top) top = d->y; + if (d->y > bot) bot = d->y; + if (bot < in_fill->y || top > in_fill->y) { + in_fill->current_point = *d; + return CAIRO_STATUS_SUCCESS; + } + + left = in_fill->current_point.x; + if (b->x < left) left = b->x; + if (c->x < left) left = c->x; + if (d->x < left) left = d->x; + if (left > in_fill->x) { + in_fill->current_point = *d; + return CAIRO_STATUS_SUCCESS; + } + + /* XXX Investigate direct inspection of the inflections? */ + if (! _cairo_spline_init (&spline, + (cairo_spline_add_point_func_t)_cairo_in_fill_line_to, + in_fill, + &in_fill->current_point, b, c, d)) + { + return CAIRO_STATUS_SUCCESS; + } + + return _cairo_spline_decompose (&spline, in_fill->tolerance); +} + +static cairo_status_t +_cairo_in_fill_close_path (void *closure) +{ + cairo_in_fill_t *in_fill = closure; + + if (in_fill->has_current_point) { + _cairo_in_fill_add_edge (in_fill, + &in_fill->current_point, + &in_fill->first_point); + + in_fill->has_current_point = FALSE; + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +_cairo_path_fixed_in_fill (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + double x, + double y) +{ + cairo_in_fill_t in_fill; + cairo_status_t status; + cairo_bool_t is_inside; + + if (_cairo_path_fixed_fill_is_empty (path)) + return FALSE; + + _cairo_in_fill_init (&in_fill, tolerance, x, y); + + status = _cairo_path_fixed_interpret (path, + _cairo_in_fill_move_to, + _cairo_in_fill_line_to, + _cairo_in_fill_curve_to, + _cairo_in_fill_close_path, + &in_fill); + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_in_fill_close_path (&in_fill); + + if (in_fill.on_edge) { + is_inside = TRUE; + } else switch (fill_rule) { + case CAIRO_FILL_RULE_EVEN_ODD: + is_inside = in_fill.winding & 1; + break; + case CAIRO_FILL_RULE_WINDING: + is_inside = in_fill.winding != 0; + break; + default: + ASSERT_NOT_REACHED; + is_inside = FALSE; + break; + } + + _cairo_in_fill_fini (&in_fill); + + return is_inside; +} diff --git a/src/cairo-path-private.h b/src/cairo-path-private.h new file mode 100644 index 000000000..7b54317e2 --- /dev/null +++ b/src/cairo-path-private.h @@ -0,0 +1,57 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PATH_PRIVATE_H +#define CAIRO_PATH_PRIVATE_H + +#include "cairoint.h" + +cairo_private cairo_path_t * +_cairo_path_create (cairo_path_fixed_t *path, + cairo_t *cr); + +cairo_private cairo_path_t * +_cairo_path_create_flat (cairo_path_fixed_t *path, + cairo_t *cr); + +cairo_private cairo_path_t * +_cairo_path_create_in_error (cairo_status_t status); + +cairo_private cairo_status_t +_cairo_path_append_to_context (const cairo_path_t *path, + cairo_t *cr); + +#endif /* CAIRO_PATH_DATA_PRIVATE_H */ diff --git a/src/cairo-path-stroke-boxes.c b/src/cairo-path-stroke-boxes.c new file mode 100644 index 000000000..7f25bf76c --- /dev/null +++ b/src/cairo-path-stroke-boxes.c @@ -0,0 +1,711 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#define _BSD_SOURCE /* for hypot() */ +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-slope-private.h" +#include "cairo-stroke-dash-private.h" + +typedef struct _segment_t { + cairo_point_t p1, p2; + unsigned flags; +#define HORIZONTAL 0x1 +#define FORWARDS 0x2 +#define JOIN 0x4 +} segment_t; + +typedef struct _cairo_rectilinear_stroker { + const cairo_stroke_style_t *stroke_style; + const cairo_matrix_t *ctm; + cairo_antialias_t antialias; + + cairo_fixed_t half_line_x, half_line_y; + cairo_boxes_t *boxes; + cairo_point_t current_point; + cairo_point_t first_point; + cairo_bool_t open_sub_path; + + cairo_stroker_dash_t dash; + + cairo_bool_t has_bounds; + cairo_box_t bounds; + + int num_segments; + int segments_size; + segment_t *segments; + segment_t segments_embedded[8]; /* common case is a single rectangle */ +} cairo_rectilinear_stroker_t; + +static void +_cairo_rectilinear_stroker_limit (cairo_rectilinear_stroker_t *stroker, + const cairo_box_t *boxes, + int num_boxes) +{ + stroker->has_bounds = TRUE; + _cairo_boxes_get_extents (boxes, num_boxes, &stroker->bounds); + + stroker->bounds.p1.x -= stroker->half_line_x; + stroker->bounds.p2.x += stroker->half_line_x; + + stroker->bounds.p1.y -= stroker->half_line_y; + stroker->bounds.p2.y += stroker->half_line_y; +} + +static cairo_bool_t +_cairo_rectilinear_stroker_init (cairo_rectilinear_stroker_t *stroker, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + cairo_antialias_t antialias, + cairo_boxes_t *boxes) +{ + /* This special-case rectilinear stroker only supports + * miter-joined lines (not curves) and a translation-only matrix + * (though it could probably be extended to support a matrix with + * uniform, integer scaling). + * + * It also only supports horizontal and vertical line_to + * elements. But we don't catch that here, but instead return + * UNSUPPORTED from _cairo_rectilinear_stroker_line_to if any + * non-rectilinear line_to is encountered. + */ + if (stroke_style->line_join != CAIRO_LINE_JOIN_MITER) + return FALSE; + + /* If the miter limit turns right angles into bevels, then we + * can't use this optimization. Remember, the ratio is + * 1/sin(ɸ/2). So the cutoff is 1/sin(Ï€/4.0) or ⎷2, + * which we round for safety. */ + if (stroke_style->miter_limit < M_SQRT2) + return FALSE; + + if (! (stroke_style->line_cap == CAIRO_LINE_CAP_BUTT || + stroke_style->line_cap == CAIRO_LINE_CAP_SQUARE)) + { + return FALSE; + } + + if (! _cairo_matrix_is_scale (ctm)) + return FALSE; + + stroker->stroke_style = stroke_style; + stroker->ctm = ctm; + stroker->antialias = antialias; + + stroker->half_line_x = + _cairo_fixed_from_double (fabs(ctm->xx) * stroke_style->line_width / 2.0); + stroker->half_line_y = + _cairo_fixed_from_double (fabs(ctm->yy) * stroke_style->line_width / 2.0); + + stroker->open_sub_path = FALSE; + stroker->segments = stroker->segments_embedded; + stroker->segments_size = ARRAY_LENGTH (stroker->segments_embedded); + stroker->num_segments = 0; + + _cairo_stroker_dash_init (&stroker->dash, stroke_style); + + stroker->has_bounds = FALSE; + + stroker->boxes = boxes; + + return TRUE; +} + +static void +_cairo_rectilinear_stroker_fini (cairo_rectilinear_stroker_t *stroker) +{ + if (stroker->segments != stroker->segments_embedded) + free (stroker->segments); +} + +static cairo_status_t +_cairo_rectilinear_stroker_add_segment (cairo_rectilinear_stroker_t *stroker, + const cairo_point_t *p1, + const cairo_point_t *p2, + unsigned flags) +{ + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (stroker->num_segments == stroker->segments_size) { + int new_size = stroker->segments_size * 2; + segment_t *new_segments; + + if (stroker->segments == stroker->segments_embedded) { + new_segments = _cairo_malloc_ab (new_size, sizeof (segment_t)); + if (unlikely (new_segments == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (new_segments, stroker->segments, + stroker->num_segments * sizeof (segment_t)); + } else { + new_segments = _cairo_realloc_ab (stroker->segments, + new_size, sizeof (segment_t)); + if (unlikely (new_segments == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + stroker->segments_size = new_size; + stroker->segments = new_segments; + } + + stroker->segments[stroker->num_segments].p1 = *p1; + stroker->segments[stroker->num_segments].p2 = *p2; + stroker->segments[stroker->num_segments].flags = flags; + stroker->num_segments++; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_rectilinear_stroker_emit_segments (cairo_rectilinear_stroker_t *stroker) +{ + cairo_line_cap_t line_cap = stroker->stroke_style->line_cap; + cairo_fixed_t half_line_x = stroker->half_line_x; + cairo_fixed_t half_line_y = stroker->half_line_y; + cairo_status_t status; + int i, j; + + /* For each segment we generate a single rectangle. + * This rectangle is based on a perpendicular extension (by half the + * line width) of the segment endpoints * after some adjustments of the + * endpoints to account for caps and joins. + */ + for (i = 0; i < stroker->num_segments; i++) { + cairo_bool_t lengthen_initial, lengthen_final; + cairo_point_t *a, *b; + cairo_box_t box; + + a = &stroker->segments[i].p1; + b = &stroker->segments[i].p2; + + /* We adjust the initial point of the segment to extend the + * rectangle to include the previous cap or join, (this + * adjustment applies to all segments except for the first + * segment of open, butt-capped paths). However, we must be + * careful not to emit a miter join across a degenerate segment + * which has been elided. + * + * Overlapping segments will be eliminated by the tessellation. + * Ideally, we would not emit these self-intersections at all, + * but that is tricky with segments shorter than half_line_width. + */ + j = i == 0 ? stroker->num_segments - 1 : i-1; + lengthen_initial = (stroker->segments[i].flags ^ stroker->segments[j].flags) & HORIZONTAL; + j = i == stroker->num_segments - 1 ? 0 : i+1; + lengthen_final = (stroker->segments[i].flags ^ stroker->segments[j].flags) & HORIZONTAL; + if (stroker->open_sub_path) { + if (i == 0) + lengthen_initial = line_cap != CAIRO_LINE_CAP_BUTT; + + if (i == stroker->num_segments - 1) + lengthen_final = line_cap != CAIRO_LINE_CAP_BUTT; + } + + /* Perform the adjustments of the endpoints. */ + if (lengthen_initial | lengthen_final) { + if (a->y == b->y) { + if (a->x < b->x) { + if (lengthen_initial) + a->x -= half_line_x; + if (lengthen_final) + b->x += half_line_x; + } else { + if (lengthen_initial) + a->x += half_line_x; + if (lengthen_final) + b->x -= half_line_x; + } + } else { + if (a->y < b->y) { + if (lengthen_initial) + a->y -= half_line_y; + if (lengthen_final) + b->y += half_line_y; + } else { + if (lengthen_initial) + a->y += half_line_y; + if (lengthen_final) + b->y -= half_line_y; + } + } + } + + /* Form the rectangle by expanding by half the line width in + * either perpendicular direction. */ + if (a->y == b->y) { + a->y -= half_line_y; + b->y += half_line_y; + } else { + a->x -= half_line_x; + b->x += half_line_x; + } + + if (a->x < b->x) { + box.p1.x = a->x; + box.p2.x = b->x; + } else { + box.p1.x = b->x; + box.p2.x = a->x; + } + if (a->y < b->y) { + box.p1.y = a->y; + box.p2.y = b->y; + } else { + box.p1.y = b->y; + box.p2.y = a->y; + } + + status = _cairo_boxes_add (stroker->boxes, stroker->antialias, &box); + if (unlikely (status)) + return status; + } + + stroker->num_segments = 0; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_rectilinear_stroker_emit_segments_dashed (cairo_rectilinear_stroker_t *stroker) +{ + cairo_status_t status; + cairo_line_cap_t line_cap = stroker->stroke_style->line_cap; + cairo_fixed_t half_line_x = stroker->half_line_x; + cairo_fixed_t half_line_y = stroker->half_line_y; + int i; + + for (i = 0; i < stroker->num_segments; i++) { + cairo_point_t *a, *b; + cairo_bool_t is_horizontal; + cairo_box_t box; + + a = &stroker->segments[i].p1; + b = &stroker->segments[i].p2; + + is_horizontal = stroker->segments[i].flags & HORIZONTAL; + + /* Handle the joins for a potentially degenerate segment. */ + if (line_cap == CAIRO_LINE_CAP_BUTT && + stroker->segments[i].flags & JOIN && + (i != stroker->num_segments - 1 || + (! stroker->open_sub_path && stroker->dash.dash_starts_on))) + { + cairo_slope_t out_slope; + int j = (i + 1) % stroker->num_segments; + cairo_bool_t forwards = !!(stroker->segments[i].flags & FORWARDS); + + _cairo_slope_init (&out_slope, + &stroker->segments[j].p1, + &stroker->segments[j].p2); + box.p2 = box.p1 = stroker->segments[i].p2; + + if (is_horizontal) { + if (forwards) + box.p2.x += half_line_x; + else + box.p1.x -= half_line_x; + + if (out_slope.dy > 0) + box.p1.y -= half_line_y; + else + box.p2.y += half_line_y; + } else { + if (forwards) + box.p2.y += half_line_y; + else + box.p1.y -= half_line_y; + + if (out_slope.dx > 0) + box.p1.x -= half_line_x; + else + box.p2.x += half_line_x; + } + + status = _cairo_boxes_add (stroker->boxes, stroker->antialias, &box); + if (unlikely (status)) + return status; + } + + /* Perform the adjustments of the endpoints. */ + if (is_horizontal) { + if (line_cap == CAIRO_LINE_CAP_SQUARE) { + if (a->x <= b->x) { + a->x -= half_line_x; + b->x += half_line_x; + } else { + a->x += half_line_x; + b->x -= half_line_x; + } + } + + a->y += half_line_y; + b->y -= half_line_y; + } else { + if (line_cap == CAIRO_LINE_CAP_SQUARE) { + if (a->y <= b->y) { + a->y -= half_line_y; + b->y += half_line_y; + } else { + a->y += half_line_y; + b->y -= half_line_y; + } + } + + a->x += half_line_x; + b->x -= half_line_x; + } + + if (a->x == b->x && a->y == b->y) + continue; + + if (a->x < b->x) { + box.p1.x = a->x; + box.p2.x = b->x; + } else { + box.p1.x = b->x; + box.p2.x = a->x; + } + if (a->y < b->y) { + box.p1.y = a->y; + box.p2.y = b->y; + } else { + box.p1.y = b->y; + box.p2.y = a->y; + } + + status = _cairo_boxes_add (stroker->boxes, stroker->antialias, &box); + if (unlikely (status)) + return status; + } + + stroker->num_segments = 0; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_rectilinear_stroker_move_to (void *closure, + const cairo_point_t *point) +{ + cairo_rectilinear_stroker_t *stroker = closure; + cairo_status_t status; + + if (stroker->dash.dashed) + status = _cairo_rectilinear_stroker_emit_segments_dashed (stroker); + else + status = _cairo_rectilinear_stroker_emit_segments (stroker); + if (unlikely (status)) + return status; + + /* reset the dash pattern for new sub paths */ + _cairo_stroker_dash_start (&stroker->dash); + + stroker->current_point = *point; + stroker->first_point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_rectilinear_stroker_line_to (void *closure, + const cairo_point_t *b) +{ + cairo_rectilinear_stroker_t *stroker = closure; + cairo_point_t *a = &stroker->current_point; + cairo_status_t status; + + /* We only support horizontal or vertical elements. */ + assert (a->x == b->x || a->y == b->y); + + /* We don't draw anything for degenerate paths. */ + if (a->x == b->x && a->y == b->y) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_rectilinear_stroker_add_segment (stroker, a, b, + (a->y == b->y) | JOIN); + + stroker->current_point = *b; + stroker->open_sub_path = TRUE; + + return status; +} + +static cairo_status_t +_cairo_rectilinear_stroker_line_to_dashed (void *closure, + const cairo_point_t *point) +{ + cairo_rectilinear_stroker_t *stroker = closure; + const cairo_point_t *a = &stroker->current_point; + const cairo_point_t *b = point; + cairo_bool_t fully_in_bounds; + double sf, sign, remain; + cairo_fixed_t mag; + cairo_status_t status; + cairo_line_t segment; + cairo_bool_t dash_on = FALSE; + unsigned is_horizontal; + + /* We don't draw anything for degenerate paths. */ + if (a->x == b->x && a->y == b->y) + return CAIRO_STATUS_SUCCESS; + + /* We only support horizontal or vertical elements. */ + assert (a->x == b->x || a->y == b->y); + + fully_in_bounds = TRUE; + if (stroker->has_bounds && + (! _cairo_box_contains_point (&stroker->bounds, a) || + ! _cairo_box_contains_point (&stroker->bounds, b))) + { + fully_in_bounds = FALSE; + } + + is_horizontal = a->y == b->y; + if (is_horizontal) { + mag = b->x - a->x; + sf = fabs (stroker->ctm->xx); + } else { + mag = b->y - a->y; + sf = fabs (stroker->ctm->yy); + } + if (mag < 0) { + remain = _cairo_fixed_to_double (-mag); + sign = 1.; + } else { + remain = _cairo_fixed_to_double (mag); + is_horizontal |= FORWARDS; + sign = -1.; + } + + segment.p2 = segment.p1 = *a; + while (remain > 0.) { + double step_length; + + step_length = MIN (sf * stroker->dash.dash_remain, remain); + remain -= step_length; + + mag = _cairo_fixed_from_double (sign*remain); + if (is_horizontal & 0x1) + segment.p2.x = b->x + mag; + else + segment.p2.y = b->y + mag; + + if (stroker->dash.dash_on && + (fully_in_bounds || + _cairo_box_intersects_line_segment (&stroker->bounds, &segment))) + { + status = _cairo_rectilinear_stroker_add_segment (stroker, + &segment.p1, + &segment.p2, + is_horizontal | (remain <= 0.) << 2); + if (unlikely (status)) + return status; + + dash_on = TRUE; + } + else + { + dash_on = FALSE; + } + + _cairo_stroker_dash_step (&stroker->dash, step_length / sf); + segment.p1 = segment.p2; + } + + if (stroker->dash.dash_on && ! dash_on && + (fully_in_bounds || + _cairo_box_intersects_line_segment (&stroker->bounds, &segment))) + { + + /* This segment ends on a transition to dash_on, compute a new face + * and add cap for the beginning of the next dash_on step. + */ + + status = _cairo_rectilinear_stroker_add_segment (stroker, + &segment.p1, + &segment.p1, + is_horizontal | JOIN); + if (unlikely (status)) + return status; + } + + stroker->current_point = *point; + stroker->open_sub_path = TRUE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_rectilinear_stroker_close_path (void *closure) +{ + cairo_rectilinear_stroker_t *stroker = closure; + cairo_status_t status; + + /* We don't draw anything for degenerate paths. */ + if (! stroker->open_sub_path) + return CAIRO_STATUS_SUCCESS; + + if (stroker->dash.dashed) { + status = _cairo_rectilinear_stroker_line_to_dashed (stroker, + &stroker->first_point); + } else { + status = _cairo_rectilinear_stroker_line_to (stroker, + &stroker->first_point); + } + if (unlikely (status)) + return status; + + stroker->open_sub_path = FALSE; + + if (stroker->dash.dashed) + status = _cairo_rectilinear_stroker_emit_segments_dashed (stroker); + else + status = _cairo_rectilinear_stroker_emit_segments (stroker); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_path_fixed_stroke_rectilinear_to_boxes (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + cairo_antialias_t antialias, + cairo_boxes_t *boxes) +{ + cairo_rectilinear_stroker_t rectilinear_stroker; + cairo_int_status_t status; + cairo_box_t box; + + assert (_cairo_path_fixed_stroke_is_rectilinear (path)); + + if (! _cairo_rectilinear_stroker_init (&rectilinear_stroker, + stroke_style, ctm, antialias, + boxes)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (! rectilinear_stroker.dash.dashed && + _cairo_path_fixed_is_stroke_box (path, &box) && + /* if the segments overlap we need to feed them into the tessellator */ + box.p2.x - box.p1.x > 2* rectilinear_stroker.half_line_x && + box.p2.y - box.p1.y > 2* rectilinear_stroker.half_line_y) + { + cairo_box_t b; + + /* top */ + b.p1.x = box.p1.x - rectilinear_stroker.half_line_x; + b.p2.x = box.p2.x + rectilinear_stroker.half_line_x; + b.p1.y = box.p1.y - rectilinear_stroker.half_line_y; + b.p2.y = box.p1.y + rectilinear_stroker.half_line_y; + status = _cairo_boxes_add (boxes, antialias, &b); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + /* left (excluding top/bottom) */ + b.p1.x = box.p1.x - rectilinear_stroker.half_line_x; + b.p2.x = box.p1.x + rectilinear_stroker.half_line_x; + b.p1.y = box.p1.y + rectilinear_stroker.half_line_y; + b.p2.y = box.p2.y - rectilinear_stroker.half_line_y; + status = _cairo_boxes_add (boxes, antialias, &b); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + /* right (excluding top/bottom) */ + b.p1.x = box.p2.x - rectilinear_stroker.half_line_x; + b.p2.x = box.p2.x + rectilinear_stroker.half_line_x; + b.p1.y = box.p1.y + rectilinear_stroker.half_line_y; + b.p2.y = box.p2.y - rectilinear_stroker.half_line_y; + status = _cairo_boxes_add (boxes, antialias, &b); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + /* bottom */ + b.p1.x = box.p1.x - rectilinear_stroker.half_line_x; + b.p2.x = box.p2.x + rectilinear_stroker.half_line_x; + b.p1.y = box.p2.y - rectilinear_stroker.half_line_y; + b.p2.y = box.p2.y + rectilinear_stroker.half_line_y; + status = _cairo_boxes_add (boxes, antialias, &b); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + goto done; + } + + if (boxes->num_limits) { + _cairo_rectilinear_stroker_limit (&rectilinear_stroker, + boxes->limits, + boxes->num_limits); + } + + status = _cairo_path_fixed_interpret (path, + _cairo_rectilinear_stroker_move_to, + rectilinear_stroker.dash.dashed ? + _cairo_rectilinear_stroker_line_to_dashed : + _cairo_rectilinear_stroker_line_to, + NULL, + _cairo_rectilinear_stroker_close_path, + &rectilinear_stroker); + if (unlikely (status)) + goto BAIL; + + if (rectilinear_stroker.dash.dashed) + status = _cairo_rectilinear_stroker_emit_segments_dashed (&rectilinear_stroker); + else + status = _cairo_rectilinear_stroker_emit_segments (&rectilinear_stroker); + if (unlikely (status)) + goto BAIL; + + /* As we incrementally tessellate, we do not eliminate self-intersections */ + status = _cairo_bentley_ottmann_tessellate_boxes (boxes, + CAIRO_FILL_RULE_WINDING, + boxes); + if (unlikely (status)) + goto BAIL; + +done: + _cairo_rectilinear_stroker_fini (&rectilinear_stroker); + return CAIRO_STATUS_SUCCESS; + +BAIL: + _cairo_rectilinear_stroker_fini (&rectilinear_stroker); + _cairo_boxes_clear (boxes); + return status; +} diff --git a/src/cairo-path-stroke-polygon.c b/src/cairo-path-stroke-polygon.c new file mode 100644 index 000000000..e5082bbec --- /dev/null +++ b/src/cairo-path-stroke-polygon.c @@ -0,0 +1,1364 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#define _BSD_SOURCE /* for hypot() */ +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-contour-inline.h" +#include "cairo-contour-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-slope-private.h" + +#define DEBUG 0 + +struct stroker { + cairo_stroke_style_t style; + +#if DEBUG + cairo_contour_t path; +#endif + + struct stroke_contour { + /* Note that these are not strictly contours as they may intersect */ + cairo_contour_t contour; + } cw, ccw; + cairo_uint64_t contour_tolerance; + cairo_polygon_t *polygon; + + const cairo_matrix_t *ctm; + const cairo_matrix_t *ctm_inverse; + double tolerance; + double spline_cusp_tolerance; + double half_line_width; + cairo_bool_t ctm_det_positive; + + cairo_pen_t pen; + + cairo_point_t first_point; + + cairo_bool_t has_initial_sub_path; + + cairo_bool_t has_current_face; + cairo_stroke_face_t current_face; + + cairo_bool_t has_first_face; + cairo_stroke_face_t first_face; + + cairo_bool_t has_bounds; + cairo_box_t bounds; +}; + +static inline double +normalize_slope (double *dx, double *dy); + +static void +compute_face (const cairo_point_t *point, + const cairo_slope_t *dev_slope, + struct stroker *stroker, + cairo_stroke_face_t *face); + +static cairo_uint64_t +point_distance_sq (const cairo_point_t *p1, + const cairo_point_t *p2) +{ + int32_t dx = p1->x - p2->x; + int32_t dy = p1->y - p2->y; + return _cairo_int32x32_64_mul (dx, dx) + _cairo_int32x32_64_mul (dy, dy); +} + +static cairo_bool_t +within_tolerance (const cairo_point_t *p1, + const cairo_point_t *p2, + cairo_uint64_t tolerance) +{ + return FALSE; + return _cairo_int64_lt (point_distance_sq (p1, p2), tolerance); +} + +static void +contour_add_point (struct stroker *stroker, + struct stroke_contour *c, + const cairo_point_t *point) +{ + if (! within_tolerance (point, _cairo_contour_last_point (&c->contour), + stroker->contour_tolerance)) + _cairo_contour_add_point (&c->contour, point); + //*_cairo_contour_last_point (&c->contour) = *point; +} + +static void +translate_point (cairo_point_t *point, const cairo_point_t *offset) +{ + point->x += offset->x; + point->y += offset->y; +} + +static int +slope_compare_sgn (double dx1, double dy1, double dx2, double dy2) +{ + double c = (dx1 * dy2 - dx2 * dy1); + + if (c > 0) return 1; + if (c < 0) return -1; + return 0; +} + +static inline int +range_step (int i, int step, int max) +{ + i += step; + if (i < 0) + i = max - 1; + if (i >= max) + i = 0; + return i; +} + +/* + * Construct a fan around the midpoint using the vertices from pen between + * inpt and outpt. + */ +static void +add_fan (struct stroker *stroker, + const cairo_slope_t *in_vector, + const cairo_slope_t *out_vector, + const cairo_point_t *midpt, + cairo_bool_t clockwise, + struct stroke_contour *c) +{ + cairo_pen_t *pen = &stroker->pen; + int start, stop; + + if (stroker->has_bounds && + ! _cairo_box_contains_point (&stroker->bounds, midpt)) + return; + + assert (stroker->pen.num_vertices); + + if (clockwise) { + _cairo_pen_find_active_cw_vertices (pen, + in_vector, out_vector, + &start, &stop); + while (start != stop) { + cairo_point_t p = *midpt; + translate_point (&p, &pen->vertices[start].point); + contour_add_point (stroker, c, &p); + + if (++start == pen->num_vertices) + start = 0; + } + } else { + _cairo_pen_find_active_ccw_vertices (pen, + in_vector, out_vector, + &start, &stop); + while (start != stop) { + cairo_point_t p = *midpt; + translate_point (&p, &pen->vertices[start].point); + contour_add_point (stroker, c, &p); + + if (start-- == 0) + start += pen->num_vertices; + } + } +} + +static int +join_is_clockwise (const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + return _cairo_slope_compare (&in->dev_vector, &out->dev_vector) < 0; +} + +static void +inner_join (struct stroker *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out, + int clockwise) +{ +#if 0 + cairo_point_t last; + const cairo_point_t *p, *outpt; + struct stroke_contour *inner; + cairo_int64_t d_p, d_last; + cairo_int64_t half_line_width; + cairo_bool_t negate; + + /* XXX line segments shorter than line-width */ + + if (clockwise) { + inner = &stroker->ccw; + outpt = &out->ccw; + negate = 1; + } else { + inner = &stroker->cw; + outpt = &out->cw; + negate = 0; + } + + half_line_width = CAIRO_FIXED_ONE*CAIRO_FIXED_ONE/2 * stroker->style.line_width * out->length + .5; + + /* On the inside, the previous end-point is always + * closer to the new face by definition. + */ + last = *_cairo_contour_last_point (&inner->contour); + d_last = distance_from_face (out, &last, negate); + _cairo_contour_remove_last_point (&inner->contour); + +prev: + if (inner->contour.chain.num_points == 0) { + contour_add_point (stroker, inner, outpt); + return; + } + p = _cairo_contour_last_point (&inner->contour); + d_p = distance_from_face (out, p, negate); + if (_cairo_int64_lt (d_p, half_line_width) && + !_cairo_int64_negative (distance_along_face (out, p))) + { + last = *p; + d_last = d_p; + _cairo_contour_remove_last_point (&inner->contour); + goto prev; + } + + compute_inner_joint (&last, d_last, p, d_p, half_line_width); + contour_add_point (stroker, inner, &last); +#else + const cairo_point_t *outpt; + struct stroke_contour *inner; + + if (clockwise) { + inner = &stroker->ccw; + outpt = &out->ccw; + } else { + inner = &stroker->cw; + outpt = &out->cw; + } + contour_add_point (stroker, inner, &in->point); + contour_add_point (stroker, inner, outpt); +#endif +} + +static void +inner_close (struct stroker *stroker, + const cairo_stroke_face_t *in, + cairo_stroke_face_t *out) +{ +#if 0 + cairo_point_t last; + const cairo_point_t *p, *outpt, *inpt; + struct stroke_contour *inner; + struct _cairo_contour_chain *chain; + + /* XXX line segments shorter than line-width */ + + if (join_is_clockwise (in, out)) { + inner = &stroker->ccw; + outpt = &in->ccw; + inpt = &out->ccw; + } else { + inner = &stroker->cw; + outpt = &in->cw; + inpt = &out->cw; + } + + if (inner->contour.chain.num_points == 0) { + contour_add_point (stroker, inner, &in->point); + contour_add_point (stroker, inner, inpt); + *_cairo_contour_first_point (&inner->contour) = + *_cairo_contour_last_point (&inner->contour); + return; + } + + line_width = stroker->style.line_width/2; + line_width *= CAIRO_FIXED_ONE; + + d_last = sign * distance_from_face (out, outpt); + last = *outpt; + + for (chain = &inner->contour.chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + p = &chain->points[i]; + if ((d_p = sign * distance_from_face (in, p)) >= line_width && + distance_from_edge (stroker, inpt, &last, p) < line_width) + { + goto out; + } + + if (p->x != last.x || p->y != last.y) { + last = *p; + d_last = d_p; + } + } + } +out: + + if (d_p != d_last) { + double dot = (line_width - d_last) / (d_p - d_last); + last.x += dot * (p->x - last.x); + last.y += dot * (p->y - last.y); + } + *_cairo_contour_last_point (&inner->contour) = last; + + for (chain = &inner->contour.chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + cairo_point_t *pp = &chain->points[i]; + if (pp == p) + return; + *pp = last; + } + } +#else + const cairo_point_t *inpt; + struct stroke_contour *inner; + + if (join_is_clockwise (in, out)) { + inner = &stroker->ccw; + inpt = &out->ccw; + } else { + inner = &stroker->cw; + inpt = &out->cw; + } + + contour_add_point (stroker, inner, &in->point); + contour_add_point (stroker, inner, inpt); + *_cairo_contour_first_point (&inner->contour) = + *_cairo_contour_last_point (&inner->contour); +#endif +} + +static void +outer_close (struct stroker *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + const cairo_point_t *inpt, *outpt; + struct stroke_contour *outer; + int clockwise; + + if (in->cw.x == out->cw.x && in->cw.y == out->cw.y && + in->ccw.x == out->ccw.x && in->ccw.y == out->ccw.y) + { + return; + } + + clockwise = join_is_clockwise (in, out); + if (clockwise) { + inpt = &in->cw; + outpt = &out->cw; + outer = &stroker->cw; + } else { + inpt = &in->ccw; + outpt = &out->ccw; + outer = &stroker->ccw; + } + + if (within_tolerance (inpt, outpt, stroker->contour_tolerance)) { + *_cairo_contour_first_point (&outer->contour) = + *_cairo_contour_last_point (&outer->contour); + return; + } + + switch (stroker->style.line_join) { + case CAIRO_LINE_JOIN_ROUND: + /* construct a fan around the common midpoint */ + if ((in->dev_slope.x * out->dev_slope.x + + in->dev_slope.y * out->dev_slope.y) < stroker->spline_cusp_tolerance) + { + add_fan (stroker, + &in->dev_vector, &out->dev_vector, &in->point, + clockwise, outer); + break; + } + + case CAIRO_LINE_JOIN_MITER: + default: { + /* dot product of incoming slope vector with outgoing slope vector */ + double in_dot_out = in->dev_slope.x * out->dev_slope.x + + in->dev_slope.y * out->dev_slope.y; + double ml = stroker->style.miter_limit; + + /* Check the miter limit -- lines meeting at an acute angle + * can generate long miters, the limit converts them to bevel + * + * Consider the miter join formed when two line segments + * meet at an angle psi: + * + * /.\ + * /. .\ + * /./ \.\ + * /./psi\.\ + * + * We can zoom in on the right half of that to see: + * + * |\ + * | \ psi/2 + * | \ + * | \ + * | \ + * | \ + * miter \ + * length \ + * | \ + * | .\ + * | . \ + * |. line \ + * \ width \ + * \ \ + * + * + * The right triangle in that figure, (the line-width side is + * shown faintly with three '.' characters), gives us the + * following expression relating miter length, angle and line + * width: + * + * 1 /sin (psi/2) = miter_length / line_width + * + * The right-hand side of this relationship is the same ratio + * in which the miter limit (ml) is expressed. We want to know + * when the miter length is within the miter limit. That is + * when the following condition holds: + * + * 1/sin(psi/2) <= ml + * 1 <= ml sin(psi/2) + * 1 <= ml² sin²(psi/2) + * 2 <= ml² 2 sin²(psi/2) + * 2·sin²(psi/2) = 1-cos(psi) + * 2 <= ml² (1-cos(psi)) + * + * in · out = |in| |out| cos (psi) + * + * in and out are both unit vectors, so: + * + * in · out = cos (psi) + * + * 2 <= ml² (1 - in · out) + * + */ + if (2 <= ml * ml * (1 + in_dot_out)) { + double x1, y1, x2, y2; + double mx, my; + double dx1, dx2, dy1, dy2; + double ix, iy; + double fdx1, fdy1, fdx2, fdy2; + double mdx, mdy; + + /* + * we've got the points already transformed to device + * space, but need to do some computation with them and + * also need to transform the slope from user space to + * device space + */ + /* outer point of incoming line face */ + x1 = _cairo_fixed_to_double (inpt->x); + y1 = _cairo_fixed_to_double (inpt->y); + dx1 = in->dev_slope.x; + dy1 = in->dev_slope.y; + + /* outer point of outgoing line face */ + x2 = _cairo_fixed_to_double (outpt->x); + y2 = _cairo_fixed_to_double (outpt->y); + dx2 = out->dev_slope.x; + dy2 = out->dev_slope.y; + + /* + * Compute the location of the outer corner of the miter. + * That's pretty easy -- just the intersection of the two + * outer edges. We've got slopes and points on each + * of those edges. Compute my directly, then compute + * mx by using the edge with the larger dy; that avoids + * dividing by values close to zero. + */ + my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / + (dx1 * dy2 - dx2 * dy1)); + if (fabs (dy1) >= fabs (dy2)) + mx = (my - y1) * dx1 / dy1 + x1; + else + mx = (my - y2) * dx2 / dy2 + x2; + + /* + * When the two outer edges are nearly parallel, slight + * perturbations in the position of the outer points of the lines + * caused by representing them in fixed point form can cause the + * intersection point of the miter to move a large amount. If + * that moves the miter intersection from between the two faces, + * then draw a bevel instead. + */ + + ix = _cairo_fixed_to_double (in->point.x); + iy = _cairo_fixed_to_double (in->point.y); + + /* slope of one face */ + fdx1 = x1 - ix; fdy1 = y1 - iy; + + /* slope of the other face */ + fdx2 = x2 - ix; fdy2 = y2 - iy; + + /* slope from the intersection to the miter point */ + mdx = mx - ix; mdy = my - iy; + + /* + * Make sure the miter point line lies between the two + * faces by comparing the slopes + */ + if (slope_compare_sgn (fdx1, fdy1, mdx, mdy) != + slope_compare_sgn (fdx2, fdy2, mdx, mdy)) + { + cairo_point_t p; + + p.x = _cairo_fixed_from_double (mx); + p.y = _cairo_fixed_from_double (my); + + *_cairo_contour_last_point (&outer->contour) = p; + *_cairo_contour_first_point (&outer->contour) = p; + return; + } + } + break; + } + + case CAIRO_LINE_JOIN_BEVEL: + break; + } + contour_add_point (stroker, outer, outpt); +} + +static void +outer_join (struct stroker *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out, + int clockwise) +{ + const cairo_point_t *inpt, *outpt; + struct stroke_contour *outer; + + if (in->cw.x == out->cw.x && in->cw.y == out->cw.y && + in->ccw.x == out->ccw.x && in->ccw.y == out->ccw.y) + { + return; + } + if (clockwise) { + inpt = &in->cw; + outpt = &out->cw; + outer = &stroker->cw; + } else { + inpt = &in->ccw; + outpt = &out->ccw; + outer = &stroker->ccw; + } + + switch (stroker->style.line_join) { + case CAIRO_LINE_JOIN_ROUND: + /* construct a fan around the common midpoint */ + add_fan (stroker, + &in->dev_vector, &out->dev_vector, &in->point, + clockwise, outer); + break; + + case CAIRO_LINE_JOIN_MITER: + default: { + /* dot product of incoming slope vector with outgoing slope vector */ + double in_dot_out = in->dev_slope.x * out->dev_slope.x + + in->dev_slope.y * out->dev_slope.y; + double ml = stroker->style.miter_limit; + + /* Check the miter limit -- lines meeting at an acute angle + * can generate long miters, the limit converts them to bevel + * + * Consider the miter join formed when two line segments + * meet at an angle psi: + * + * /.\ + * /. .\ + * /./ \.\ + * /./psi\.\ + * + * We can zoom in on the right half of that to see: + * + * |\ + * | \ psi/2 + * | \ + * | \ + * | \ + * | \ + * miter \ + * length \ + * | \ + * | .\ + * | . \ + * |. line \ + * \ width \ + * \ \ + * + * + * The right triangle in that figure, (the line-width side is + * shown faintly with three '.' characters), gives us the + * following expression relating miter length, angle and line + * width: + * + * 1 /sin (psi/2) = miter_length / line_width + * + * The right-hand side of this relationship is the same ratio + * in which the miter limit (ml) is expressed. We want to know + * when the miter length is within the miter limit. That is + * when the following condition holds: + * + * 1/sin(psi/2) <= ml + * 1 <= ml sin(psi/2) + * 1 <= ml² sin²(psi/2) + * 2 <= ml² 2 sin²(psi/2) + * 2·sin²(psi/2) = 1-cos(psi) + * 2 <= ml² (1-cos(psi)) + * + * in · out = |in| |out| cos (psi) + * + * in and out are both unit vectors, so: + * + * in · out = cos (psi) + * + * 2 <= ml² (1 - in · out) + * + */ + if (2 <= ml * ml * (1 + in_dot_out)) { + double x1, y1, x2, y2; + double mx, my; + double dx1, dx2, dy1, dy2; + double ix, iy; + double fdx1, fdy1, fdx2, fdy2; + double mdx, mdy; + + /* + * we've got the points already transformed to device + * space, but need to do some computation with them and + * also need to transform the slope from user space to + * device space + */ + /* outer point of incoming line face */ + x1 = _cairo_fixed_to_double (inpt->x); + y1 = _cairo_fixed_to_double (inpt->y); + dx1 = in->dev_slope.x; + dy1 = in->dev_slope.y; + + /* outer point of outgoing line face */ + x2 = _cairo_fixed_to_double (outpt->x); + y2 = _cairo_fixed_to_double (outpt->y); + dx2 = out->dev_slope.x; + dy2 = out->dev_slope.y; + + /* + * Compute the location of the outer corner of the miter. + * That's pretty easy -- just the intersection of the two + * outer edges. We've got slopes and points on each + * of those edges. Compute my directly, then compute + * mx by using the edge with the larger dy; that avoids + * dividing by values close to zero. + */ + my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / + (dx1 * dy2 - dx2 * dy1)); + if (fabs (dy1) >= fabs (dy2)) + mx = (my - y1) * dx1 / dy1 + x1; + else + mx = (my - y2) * dx2 / dy2 + x2; + + /* + * When the two outer edges are nearly parallel, slight + * perturbations in the position of the outer points of the lines + * caused by representing them in fixed point form can cause the + * intersection point of the miter to move a large amount. If + * that moves the miter intersection from between the two faces, + * then draw a bevel instead. + */ + + ix = _cairo_fixed_to_double (in->point.x); + iy = _cairo_fixed_to_double (in->point.y); + + /* slope of one face */ + fdx1 = x1 - ix; fdy1 = y1 - iy; + + /* slope of the other face */ + fdx2 = x2 - ix; fdy2 = y2 - iy; + + /* slope from the intersection to the miter point */ + mdx = mx - ix; mdy = my - iy; + + /* + * Make sure the miter point line lies between the two + * faces by comparing the slopes + */ + if (slope_compare_sgn (fdx1, fdy1, mdx, mdy) != + slope_compare_sgn (fdx2, fdy2, mdx, mdy)) + { + cairo_point_t p; + + p.x = _cairo_fixed_from_double (mx); + p.y = _cairo_fixed_from_double (my); + + *_cairo_contour_last_point (&outer->contour) = p; + return; + } + } + break; + } + + case CAIRO_LINE_JOIN_BEVEL: + break; + } + contour_add_point (stroker,outer, outpt); +} + +static void +add_cap (struct stroker *stroker, + const cairo_stroke_face_t *f, + struct stroke_contour *c) +{ + switch (stroker->style.line_cap) { + case CAIRO_LINE_CAP_ROUND: { + cairo_slope_t slope; + + slope.dx = -f->dev_vector.dx; + slope.dy = -f->dev_vector.dy; + + add_fan (stroker, &f->dev_vector, &slope, &f->point, FALSE, c); + break; + } + + case CAIRO_LINE_CAP_SQUARE: { + cairo_slope_t fvector; + cairo_point_t p; + double dx, dy; + + dx = f->usr_vector.x; + dy = f->usr_vector.y; + dx *= stroker->half_line_width; + dy *= stroker->half_line_width; + cairo_matrix_transform_distance (stroker->ctm, &dx, &dy); + fvector.dx = _cairo_fixed_from_double (dx); + fvector.dy = _cairo_fixed_from_double (dy); + + p.x = f->ccw.x + fvector.dx; + p.y = f->ccw.y + fvector.dy; + contour_add_point (stroker, c, &p); + + p.x = f->cw.x + fvector.dx; + p.y = f->cw.y + fvector.dy; + contour_add_point (stroker, c, &p); + } + + case CAIRO_LINE_CAP_BUTT: + default: + break; + } + contour_add_point (stroker, c, &f->cw); +} + +static void +add_leading_cap (struct stroker *stroker, + const cairo_stroke_face_t *face, + struct stroke_contour *c) +{ + cairo_stroke_face_t reversed; + cairo_point_t t; + + reversed = *face; + + /* The initial cap needs an outward facing vector. Reverse everything */ + reversed.usr_vector.x = -reversed.usr_vector.x; + reversed.usr_vector.y = -reversed.usr_vector.y; + reversed.dev_vector.dx = -reversed.dev_vector.dx; + reversed.dev_vector.dy = -reversed.dev_vector.dy; + + t = reversed.cw; + reversed.cw = reversed.ccw; + reversed.ccw = t; + + add_cap (stroker, &reversed, c); +} + +static void +add_trailing_cap (struct stroker *stroker, + const cairo_stroke_face_t *face, + struct stroke_contour *c) +{ + add_cap (stroker, face, c); +} + +static inline double +normalize_slope (double *dx, double *dy) +{ + double dx0 = *dx, dy0 = *dy; + double mag; + + assert (dx0 != 0.0 || dy0 != 0.0); + + if (dx0 == 0.0) { + *dx = 0.0; + if (dy0 > 0.0) { + mag = dy0; + *dy = 1.0; + } else { + mag = -dy0; + *dy = -1.0; + } + } else if (dy0 == 0.0) { + *dy = 0.0; + if (dx0 > 0.0) { + mag = dx0; + *dx = 1.0; + } else { + mag = -dx0; + *dx = -1.0; + } + } else { + mag = hypot (dx0, dy0); + *dx = dx0 / mag; + *dy = dy0 / mag; + } + + return mag; +} + +static void +compute_face (const cairo_point_t *point, + const cairo_slope_t *dev_slope, + struct stroker *stroker, + cairo_stroke_face_t *face) +{ + double face_dx, face_dy; + cairo_point_t offset_ccw, offset_cw; + double slope_dx, slope_dy; + + slope_dx = _cairo_fixed_to_double (dev_slope->dx); + slope_dy = _cairo_fixed_to_double (dev_slope->dy); + face->length = normalize_slope (&slope_dx, &slope_dy); + face->dev_slope.x = slope_dx; + face->dev_slope.y = slope_dy; + + /* + * rotate to get a line_width/2 vector along the face, note that + * the vector must be rotated the right direction in device space, + * but by 90° in user space. So, the rotation depends on + * whether the ctm reflects or not, and that can be determined + * by looking at the determinant of the matrix. + */ + if (! _cairo_matrix_is_identity (stroker->ctm_inverse)) { + /* Normalize the matrix! */ + cairo_matrix_transform_distance (stroker->ctm_inverse, + &slope_dx, &slope_dy); + normalize_slope (&slope_dx, &slope_dy); + + if (stroker->ctm_det_positive) { + face_dx = - slope_dy * stroker->half_line_width; + face_dy = slope_dx * stroker->half_line_width; + } else { + face_dx = slope_dy * stroker->half_line_width; + face_dy = - slope_dx * stroker->half_line_width; + } + + /* back to device space */ + cairo_matrix_transform_distance (stroker->ctm, &face_dx, &face_dy); + } else { + face_dx = - slope_dy * stroker->half_line_width; + face_dy = slope_dx * stroker->half_line_width; + } + + offset_ccw.x = _cairo_fixed_from_double (face_dx); + offset_ccw.y = _cairo_fixed_from_double (face_dy); + offset_cw.x = -offset_ccw.x; + offset_cw.y = -offset_ccw.y; + + face->ccw = *point; + translate_point (&face->ccw, &offset_ccw); + + face->point = *point; + + face->cw = *point; + translate_point (&face->cw, &offset_cw); + + face->usr_vector.x = slope_dx; + face->usr_vector.y = slope_dy; + + face->dev_vector = *dev_slope; +} + +static void +add_caps (struct stroker *stroker) +{ + /* check for a degenerative sub_path */ + if (stroker->has_initial_sub_path && + ! stroker->has_first_face && + ! stroker->has_current_face && + stroker->style.line_cap == CAIRO_LINE_CAP_ROUND) + { + /* pick an arbitrary slope to use */ + cairo_slope_t slope = { CAIRO_FIXED_ONE, 0 }; + cairo_stroke_face_t face; + + /* arbitrarily choose first_point */ + compute_face (&stroker->first_point, &slope, stroker, &face); + + add_leading_cap (stroker, &face, &stroker->ccw); + add_trailing_cap (stroker, &face, &stroker->ccw); + + /* ensure the circle is complete */ + _cairo_contour_add_point (&stroker->ccw.contour, + _cairo_contour_first_point (&stroker->ccw.contour)); + + _cairo_polygon_add_contour (stroker->polygon, &stroker->ccw.contour); + _cairo_contour_reset (&stroker->ccw.contour); + } else { + if (stroker->has_current_face) + add_trailing_cap (stroker, &stroker->current_face, &stroker->ccw); + +#if DEBUG + { + FILE *file = fopen ("contours.txt", "a"); + _cairo_debug_print_contour (file, &stroker->path); + _cairo_debug_print_contour (file, &stroker->cw.contour); + _cairo_debug_print_contour (file, &stroker->ccw.contour); + fclose (file); + _cairo_contour_reset (&stroker->path); + } +#endif + + _cairo_polygon_add_contour (stroker->polygon, &stroker->ccw.contour); + _cairo_contour_reset (&stroker->ccw.contour); + + if (stroker->has_first_face) { + _cairo_contour_add_point (&stroker->ccw.contour, + &stroker->first_face.cw); + add_leading_cap (stroker, &stroker->first_face, &stroker->ccw); +#if DEBUG + { + FILE *file = fopen ("contours.txt", "a"); + _cairo_debug_print_contour (file, &stroker->ccw.contour); + fclose (file); + } +#endif + + _cairo_polygon_add_contour (stroker->polygon, + &stroker->ccw.contour); + _cairo_contour_reset (&stroker->ccw.contour); + } + + _cairo_polygon_add_contour (stroker->polygon, &stroker->cw.contour); + _cairo_contour_reset (&stroker->cw.contour); + } +} + +static cairo_status_t +close_path (void *closure); + +static cairo_status_t +move_to (void *closure, + const cairo_point_t *point) +{ + struct stroker *stroker = closure; + + /* Cap the start and end of the previous sub path as needed */ + add_caps (stroker); + + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + stroker->has_initial_sub_path = FALSE; + + stroker->first_point = *point; + +#if DEBUG + _cairo_contour_add_point (&stroker->path, point); +#endif + + stroker->current_face.point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +line_to (void *closure, + const cairo_point_t *point) +{ + struct stroker *stroker = closure; + cairo_stroke_face_t start; + cairo_point_t *p1 = &stroker->current_face.point; + cairo_slope_t dev_slope; + + stroker->has_initial_sub_path = TRUE; + + if (p1->x == point->x && p1->y == point->y) + return CAIRO_STATUS_SUCCESS; + +#if DEBUG + _cairo_contour_add_point (&stroker->path, point); +#endif + + _cairo_slope_init (&dev_slope, p1, point); + compute_face (p1, &dev_slope, stroker, &start); + + if (stroker->has_current_face) { + int clockwise = _cairo_slope_compare (&stroker->current_face.dev_vector, + &start.dev_vector); + if (clockwise) { + clockwise = clockwise < 0; + /* Join with final face from previous segment */ + if (! within_tolerance (&stroker->current_face.ccw, &start.ccw, + stroker->contour_tolerance) || + ! within_tolerance (&stroker->current_face.cw, &start.cw, + stroker->contour_tolerance)) + { + outer_join (stroker, &stroker->current_face, &start, clockwise); + inner_join (stroker, &stroker->current_face, &start, clockwise); + } + } + } else { + if (! stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = start; + stroker->has_first_face = TRUE; + } + stroker->has_current_face = TRUE; + + contour_add_point (stroker, &stroker->cw, &start.cw); + contour_add_point (stroker, &stroker->ccw, &start.ccw); + } + + stroker->current_face = start; + stroker->current_face.point = *point; + stroker->current_face.ccw.x += dev_slope.dx; + stroker->current_face.ccw.y += dev_slope.dy; + stroker->current_face.cw.x += dev_slope.dx; + stroker->current_face.cw.y += dev_slope.dy; + + contour_add_point (stroker, &stroker->cw, &stroker->current_face.cw); + contour_add_point (stroker, &stroker->ccw, &stroker->current_face.ccw); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +spline_to (void *closure, + const cairo_point_t *point, + const cairo_slope_t *tangent) +{ + struct stroker *stroker = closure; + cairo_stroke_face_t face; + +#if DEBUG + _cairo_contour_add_point (&stroker->path, point); +#endif + if ((tangent->dx | tangent->dy) == 0) { + struct stroke_contour *outer; + cairo_point_t t; + int clockwise; + + face = stroker->current_face; + + face.usr_vector.x = -face.usr_vector.x; + face.usr_vector.y = -face.usr_vector.y; + face.dev_vector.dx = -face.dev_vector.dx; + face.dev_vector.dy = -face.dev_vector.dy; + + t = face.cw; + face.cw = face.ccw; + face.ccw = t; + + clockwise = join_is_clockwise (&stroker->current_face, &face); + if (clockwise) { + outer = &stroker->cw; + } else { + outer = &stroker->ccw; + } + + add_fan (stroker, + &stroker->current_face.dev_vector, + &face.dev_vector, + &stroker->current_face.point, + clockwise, outer); + } else { + compute_face (point, tangent, stroker, &face); + + if ((face.dev_slope.x * stroker->current_face.dev_slope.x + + face.dev_slope.y * stroker->current_face.dev_slope.y) < stroker->spline_cusp_tolerance) + { + struct stroke_contour *outer; + int clockwise = join_is_clockwise (&stroker->current_face, &face); + + stroker->current_face.cw.x += face.point.x - stroker->current_face.point.x; + stroker->current_face.cw.y += face.point.y - stroker->current_face.point.y; + contour_add_point (stroker, &stroker->cw, &stroker->current_face.cw); + + stroker->current_face.ccw.x += face.point.x - stroker->current_face.point.x; + stroker->current_face.ccw.y += face.point.y - stroker->current_face.point.y; + contour_add_point (stroker, &stroker->ccw, &stroker->current_face.ccw); + + if (clockwise) { + outer = &stroker->cw; + } else { + outer = &stroker->ccw; + } + add_fan (stroker, + &stroker->current_face.dev_vector, + &face.dev_vector, + &stroker->current_face.point, + clockwise, outer); + } + + contour_add_point (stroker, &stroker->cw, &face.cw); + contour_add_point (stroker, &stroker->ccw, &face.ccw); + } + + stroker->current_face = face; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + struct stroker *stroker = closure; + cairo_spline_t spline; + cairo_stroke_face_t face; + + if (stroker->has_bounds && + ! _cairo_spline_intersects (&stroker->current_face.point, b, c, d, + &stroker->bounds)) + return line_to (closure, d); + + if (! _cairo_spline_init (&spline, spline_to, stroker, + &stroker->current_face.point, b, c, d)) + return line_to (closure, d); + + compute_face (&stroker->current_face.point, &spline.initial_slope, + stroker, &face); + + if (stroker->has_current_face) { + int clockwise = join_is_clockwise (&stroker->current_face, &face); + /* Join with final face from previous segment */ + outer_join (stroker, &stroker->current_face, &face, clockwise); + inner_join (stroker, &stroker->current_face, &face, clockwise); + } else { + if (! stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = face; + stroker->has_first_face = TRUE; + } + stroker->has_current_face = TRUE; + + contour_add_point (stroker, &stroker->cw, &face.cw); + contour_add_point (stroker, &stroker->ccw, &face.ccw); + } + stroker->current_face = face; + + return _cairo_spline_decompose (&spline, stroker->tolerance); +} + +static cairo_status_t +close_path (void *closure) +{ + struct stroker *stroker = closure; + cairo_status_t status; + + status = line_to (stroker, &stroker->first_point); + if (unlikely (status)) + return status; + + if (stroker->has_first_face && stroker->has_current_face) { + /* Join first and final faces of sub path */ + outer_close (stroker, &stroker->current_face, &stroker->first_face); + inner_close (stroker, &stroker->current_face, &stroker->first_face); +#if 0 + *_cairo_contour_first_point (&stroker->ccw.contour) = + *_cairo_contour_last_point (&stroker->ccw.contour); + + *_cairo_contour_first_point (&stroker->cw.contour) = + *_cairo_contour_last_point (&stroker->cw.contour); +#endif + + _cairo_polygon_add_contour (stroker->polygon, &stroker->cw.contour); + _cairo_polygon_add_contour (stroker->polygon, &stroker->ccw.contour); + +#if DEBUG + { + FILE *file = fopen ("contours.txt", "a"); + _cairo_debug_print_contour (file, &stroker->path); + _cairo_debug_print_contour (file, &stroker->cw.contour); + _cairo_debug_print_contour (file, &stroker->ccw.contour); + fclose (file); + + _cairo_contour_reset (&stroker->path); + } +#endif + _cairo_contour_reset (&stroker->cw.contour); + _cairo_contour_reset (&stroker->ccw.contour); + } else { + /* Cap the start and end of the sub path as needed */ + add_caps (stroker); + } + + stroker->has_initial_sub_path = FALSE; + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_path_fixed_stroke_to_polygon (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_polygon_t *polygon) +{ + struct stroker stroker; + cairo_status_t status; + + if (style->num_dashes) { + return _cairo_path_fixed_stroke_dashed_to_polygon (path, + style, + ctm, + ctm_inverse, + tolerance, + polygon); + } + + stroker.has_bounds = polygon->num_limits; + if (stroker.has_bounds) { + /* Extend the bounds in each direction to account for the maximum area + * we might generate trapezoids, to capture line segments that are + * outside of the bounds but which might generate rendering that's + * within bounds. + */ + double dx, dy; + cairo_fixed_t fdx, fdy; + int i; + + stroker.bounds = polygon->limits[0]; + for (i = 1; i < polygon->num_limits; i++) + _cairo_box_add_box (&stroker.bounds, &polygon->limits[i]); + + _cairo_stroke_style_max_distance_from_path (style, path, ctm, &dx, &dy); + fdx = _cairo_fixed_from_double (dx); + fdy = _cairo_fixed_from_double (dy); + + stroker.bounds.p1.x -= fdx; + stroker.bounds.p2.x += fdx; + stroker.bounds.p1.y -= fdy; + stroker.bounds.p2.y += fdy; + } + + stroker.style = *style; + stroker.ctm = ctm; + stroker.ctm_inverse = ctm_inverse; + stroker.tolerance = tolerance; + stroker.half_line_width = style->line_width / 2.; + /* To test whether we need to join two segments of a spline using + * a round-join or a bevel-join, we can inspect the angle between the + * two segments. If the difference between the chord distance + * (half-line-width times the cosine of the bisection angle) and the + * half-line-width itself is greater than tolerance then we need to + * inject a point. + */ + stroker.spline_cusp_tolerance = 1 - tolerance / stroker.half_line_width; + stroker.spline_cusp_tolerance *= stroker.spline_cusp_tolerance; + stroker.spline_cusp_tolerance *= 2; + stroker.spline_cusp_tolerance -= 1; + stroker.ctm_det_positive = + _cairo_matrix_compute_determinant (ctm) >= 0.0; + + stroker.pen.num_vertices = 0; + if (path->has_curve_to || + style->line_join == CAIRO_LINE_JOIN_ROUND || + style->line_cap == CAIRO_LINE_CAP_ROUND) { + status = _cairo_pen_init (&stroker.pen, + stroker.half_line_width, + tolerance, ctm); + if (unlikely (status)) + return status; + + /* If the line width is so small that the pen is reduced to a + single point, then we have nothing to do. */ + if (stroker.pen.num_vertices <= 1) + return CAIRO_STATUS_SUCCESS; + } + + stroker.has_current_face = FALSE; + stroker.has_first_face = FALSE; + stroker.has_initial_sub_path = FALSE; + +#if DEBUG + remove ("contours.txt"); + remove ("polygons.txt"); + _cairo_contour_init (&stroker.path, 0); +#endif + _cairo_contour_init (&stroker.cw.contour, 1); + _cairo_contour_init (&stroker.ccw.contour, -1); + tolerance *= CAIRO_FIXED_ONE; + tolerance *= tolerance; + stroker.contour_tolerance = tolerance; + stroker.polygon = polygon; + + status = _cairo_path_fixed_interpret (path, + move_to, + line_to, + curve_to, + close_path, + &stroker); + /* Cap the start and end of the final sub path as needed */ + if (likely (status == CAIRO_STATUS_SUCCESS)) + add_caps (&stroker); + + _cairo_contour_fini (&stroker.cw.contour); + _cairo_contour_fini (&stroker.ccw.contour); + if (stroker.pen.num_vertices) + _cairo_pen_fini (&stroker.pen); + +#if DEBUG + { + FILE *file = fopen ("polygons.txt", "a"); + _cairo_debug_print_polygon (file, polygon); + fclose (file); + } +#endif + + return status; +} diff --git a/src/cairo-path-stroke-traps.c b/src/cairo-path-stroke-traps.c new file mode 100644 index 000000000..da54e5a35 --- /dev/null +++ b/src/cairo-path-stroke-traps.c @@ -0,0 +1,1149 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2013 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-path-fixed-private.h" +#include "cairo-slope-private.h" +#include "cairo-stroke-dash-private.h" +#include "cairo-traps-private.h" + +#include + +struct stroker { + const cairo_stroke_style_t *style; + + const cairo_matrix_t *ctm; + const cairo_matrix_t *ctm_inverse; + double spline_cusp_tolerance; + double half_line_width; + double tolerance; + double ctm_determinant; + cairo_bool_t ctm_det_positive; + cairo_line_join_t line_join; + + cairo_traps_t *traps; + + cairo_pen_t pen; + + cairo_point_t first_point; + + cairo_bool_t has_initial_sub_path; + + cairo_bool_t has_current_face; + cairo_stroke_face_t current_face; + + cairo_bool_t has_first_face; + cairo_stroke_face_t first_face; + + cairo_stroker_dash_t dash; + + cairo_bool_t has_bounds; + cairo_box_t tight_bounds; + cairo_box_t line_bounds; + cairo_box_t join_bounds; +}; + +static cairo_status_t +stroker_init (struct stroker *stroker, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_traps_t *traps) +{ + cairo_status_t status; + + stroker->style = style; + stroker->ctm = ctm; + stroker->ctm_inverse = NULL; + if (! _cairo_matrix_is_identity (ctm_inverse)) + stroker->ctm_inverse = ctm_inverse; + stroker->line_join = style->line_join; + stroker->half_line_width = style->line_width / 2.0; + stroker->tolerance = tolerance; + stroker->traps = traps; + + /* To test whether we need to join two segments of a spline using + * a round-join or a bevel-join, we can inspect the angle between the + * two segments. If the difference between the chord distance + * (half-line-width times the cosine of the bisection angle) and the + * half-line-width itself is greater than tolerance then we need to + * inject a point. + */ + stroker->spline_cusp_tolerance = 1 - tolerance / stroker->half_line_width; + stroker->spline_cusp_tolerance *= stroker->spline_cusp_tolerance; + stroker->spline_cusp_tolerance *= 2; + stroker->spline_cusp_tolerance -= 1; + + stroker->ctm_determinant = _cairo_matrix_compute_determinant (stroker->ctm); + stroker->ctm_det_positive = stroker->ctm_determinant >= 0.0; + + status = _cairo_pen_init (&stroker->pen, + stroker->half_line_width, + tolerance, ctm); + if (unlikely (status)) + return status; + + stroker->has_current_face = FALSE; + stroker->has_first_face = FALSE; + stroker->has_initial_sub_path = FALSE; + + _cairo_stroker_dash_init (&stroker->dash, style); + + stroker->has_bounds = traps->num_limits; + if (stroker->has_bounds) { + /* Extend the bounds in each direction to account for the maximum area + * we might generate trapezoids, to capture line segments that are outside + * of the bounds but which might generate rendering that's within bounds. + */ + double dx, dy; + cairo_fixed_t fdx, fdy; + + stroker->tight_bounds = traps->bounds; + + _cairo_stroke_style_max_distance_from_path (stroker->style, path, + stroker->ctm, &dx, &dy); + + _cairo_stroke_style_max_line_distance_from_path (stroker->style, path, + stroker->ctm, &dx, &dy); + + fdx = _cairo_fixed_from_double (dx); + fdy = _cairo_fixed_from_double (dy); + + stroker->line_bounds = stroker->tight_bounds; + stroker->line_bounds.p1.x -= fdx; + stroker->line_bounds.p2.x += fdx; + stroker->line_bounds.p1.y -= fdy; + stroker->line_bounds.p2.y += fdy; + + _cairo_stroke_style_max_join_distance_from_path (stroker->style, path, + stroker->ctm, &dx, &dy); + + fdx = _cairo_fixed_from_double (dx); + fdy = _cairo_fixed_from_double (dy); + + stroker->join_bounds = stroker->tight_bounds; + stroker->join_bounds.p1.x -= fdx; + stroker->join_bounds.p2.x += fdx; + stroker->join_bounds.p1.y -= fdy; + stroker->join_bounds.p2.y += fdy; + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +stroker_fini (struct stroker *stroker) +{ + _cairo_pen_fini (&stroker->pen); +} + +static void +translate_point (cairo_point_t *point, cairo_point_t *offset) +{ + point->x += offset->x; + point->y += offset->y; +} + +static int +join_is_clockwise (const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + return _cairo_slope_compare (&in->dev_vector, &out->dev_vector) < 0; +} + +static int +slope_compare_sgn (double dx1, double dy1, double dx2, double dy2) +{ + double c = dx1 * dy2 - dx2 * dy1; + if (c > 0) return 1; + if (c < 0) return -1; + return 0; +} + +static cairo_bool_t +stroker_intersects_join (const struct stroker *stroker, + const cairo_point_t *in, + const cairo_point_t *out) +{ + cairo_line_t segment; + + if (! stroker->has_bounds) + return TRUE; + + segment.p1 = *in; + segment.p2 = *out; + return _cairo_box_intersects_line_segment (&stroker->join_bounds, &segment); +} + +static void +join (struct stroker *stroker, + cairo_stroke_face_t *in, + cairo_stroke_face_t *out) +{ + int clockwise = join_is_clockwise (out, in); + cairo_point_t *inpt, *outpt; + + if (in->cw.x == out->cw.x && + in->cw.y == out->cw.y && + in->ccw.x == out->ccw.x && + in->ccw.y == out->ccw.y) + { + return; + } + + if (clockwise) { + inpt = &in->ccw; + outpt = &out->ccw; + } else { + inpt = &in->cw; + outpt = &out->cw; + } + + if (! stroker_intersects_join (stroker, inpt, outpt)) + return; + + switch (stroker->line_join) { + case CAIRO_LINE_JOIN_ROUND: + /* construct a fan around the common midpoint */ + if ((in->dev_slope.x * out->dev_slope.x + + in->dev_slope.y * out->dev_slope.y) < stroker->spline_cusp_tolerance) + { + int start, stop; + cairo_point_t tri[3], edges[4]; + cairo_pen_t *pen = &stroker->pen; + + edges[0] = in->cw; + edges[1] = in->ccw; + tri[0] = in->point; + tri[1] = *inpt; + if (clockwise) { + _cairo_pen_find_active_ccw_vertices (pen, + &in->dev_vector, &out->dev_vector, + &start, &stop); + while (start != stop) { + tri[2] = in->point; + translate_point (&tri[2], &pen->vertices[start].point); + edges[2] = in->point; + edges[3] = tri[2]; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, + tri, edges); + tri[1] = tri[2]; + edges[0] = edges[2]; + edges[1] = edges[3]; + + if (start-- == 0) + start += pen->num_vertices; + } + } else { + _cairo_pen_find_active_cw_vertices (pen, + &in->dev_vector, &out->dev_vector, + &start, &stop); + while (start != stop) { + tri[2] = in->point; + translate_point (&tri[2], &pen->vertices[start].point); + edges[2] = in->point; + edges[3] = tri[2]; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, + tri, edges); + tri[1] = tri[2]; + edges[0] = edges[2]; + edges[1] = edges[3]; + + if (++start == pen->num_vertices) + start = 0; + } + } + tri[2] = *outpt; + edges[2] = out->cw; + edges[3] = out->ccw; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, + tri, edges); + } else { + cairo_point_t t[] = { { in->point.x, in->point.y}, { inpt->x, inpt->y }, { outpt->x, outpt->y } }; + cairo_point_t e[] = { { in->cw.x, in->cw.y}, { in->ccw.x, in->ccw.y }, + { out->cw.x, out->cw.y}, { out->ccw.x, out->ccw.y } }; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, t, e); + } + break; + + case CAIRO_LINE_JOIN_MITER: + default: { + /* dot product of incoming slope vector with outgoing slope vector */ + double in_dot_out = (-in->usr_vector.x * out->usr_vector.x + + -in->usr_vector.y * out->usr_vector.y); + double ml = stroker->style->miter_limit; + + /* Check the miter limit -- lines meeting at an acute angle + * can generate long miters, the limit converts them to bevel + * + * Consider the miter join formed when two line segments + * meet at an angle psi: + * + * /.\ + * /. .\ + * /./ \.\ + * /./psi\.\ + * + * We can zoom in on the right half of that to see: + * + * |\ + * | \ psi/2 + * | \ + * | \ + * | \ + * | \ + * miter \ + * length \ + * | \ + * | .\ + * | . \ + * |. line \ + * \ width \ + * \ \ + * + * + * The right triangle in that figure, (the line-width side is + * shown faintly with three '.' characters), gives us the + * following expression relating miter length, angle and line + * width: + * + * 1 /sin (psi/2) = miter_length / line_width + * + * The right-hand side of this relationship is the same ratio + * in which the miter limit (ml) is expressed. We want to know + * when the miter length is within the miter limit. That is + * when the following condition holds: + * + * 1/sin(psi/2) <= ml + * 1 <= ml sin(psi/2) + * 1 <= ml² sin²(psi/2) + * 2 <= ml² 2 sin²(psi/2) + * 2·sin²(psi/2) = 1-cos(psi) + * 2 <= ml² (1-cos(psi)) + * + * in · out = |in| |out| cos (psi) + * + * in and out are both unit vectors, so: + * + * in · out = cos (psi) + * + * 2 <= ml² (1 - in · out) + * + */ + if (2 <= ml * ml * (1 - in_dot_out)) { + double x1, y1, x2, y2; + double mx, my; + double dx1, dx2, dy1, dy2; + cairo_point_t outer; + cairo_point_t quad[4]; + double ix, iy; + double fdx1, fdy1, fdx2, fdy2; + double mdx, mdy; + + /* + * we've got the points already transformed to device + * space, but need to do some computation with them and + * also need to transform the slope from user space to + * device space + */ + /* outer point of incoming line face */ + x1 = _cairo_fixed_to_double (inpt->x); + y1 = _cairo_fixed_to_double (inpt->y); + dx1 = in->usr_vector.x; + dy1 = in->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx1, &dy1); + + /* outer point of outgoing line face */ + x2 = _cairo_fixed_to_double (outpt->x); + y2 = _cairo_fixed_to_double (outpt->y); + dx2 = out->usr_vector.x; + dy2 = out->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); + + /* + * Compute the location of the outer corner of the miter. + * That's pretty easy -- just the intersection of the two + * outer edges. We've got slopes and points on each + * of those edges. Compute my directly, then compute + * mx by using the edge with the larger dy; that avoids + * dividing by values close to zero. + */ + my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / + (dx1 * dy2 - dx2 * dy1)); + if (fabs (dy1) >= fabs (dy2)) + mx = (my - y1) * dx1 / dy1 + x1; + else + mx = (my - y2) * dx2 / dy2 + x2; + + /* + * When the two outer edges are nearly parallel, slight + * perturbations in the position of the outer points of the lines + * caused by representing them in fixed point form can cause the + * intersection point of the miter to move a large amount. If + * that moves the miter intersection from between the two faces, + * then draw a bevel instead. + */ + + ix = _cairo_fixed_to_double (in->point.x); + iy = _cairo_fixed_to_double (in->point.y); + + /* slope of one face */ + fdx1 = x1 - ix; fdy1 = y1 - iy; + + /* slope of the other face */ + fdx2 = x2 - ix; fdy2 = y2 - iy; + + /* slope from the intersection to the miter point */ + mdx = mx - ix; mdy = my - iy; + + /* + * Make sure the miter point line lies between the two + * faces by comparing the slopes + */ + if (slope_compare_sgn (fdx1, fdy1, mdx, mdy) != + slope_compare_sgn (fdx2, fdy2, mdx, mdy)) + { + /* + * Draw the quadrilateral + */ + outer.x = _cairo_fixed_from_double (mx); + outer.y = _cairo_fixed_from_double (my); + + quad[0] = in->point; + quad[1] = *inpt; + quad[2] = outer; + quad[3] = *outpt; + + _cairo_traps_tessellate_convex_quad (stroker->traps, quad); + break; + } + } + /* fall through ... */ + } + + case CAIRO_LINE_JOIN_BEVEL: { + cairo_point_t t[] = { { in->point.x, in->point.y }, { inpt->x, inpt->y }, { outpt->x, outpt->y } }; + cairo_point_t e[] = { { in->cw.x, in->cw.y }, { in->ccw.x, in->ccw.y }, + { out->cw.x, out->cw.y }, { out->ccw.x, out->ccw.y } }; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, t, e); + break; + } + } +} + +static void +add_cap (struct stroker *stroker, cairo_stroke_face_t *f) +{ + switch (stroker->style->line_cap) { + case CAIRO_LINE_CAP_ROUND: { + int start, stop; + cairo_slope_t in_slope, out_slope; + cairo_point_t tri[3], edges[4]; + cairo_pen_t *pen = &stroker->pen; + + in_slope = f->dev_vector; + out_slope.dx = -in_slope.dx; + out_slope.dy = -in_slope.dy; + _cairo_pen_find_active_cw_vertices (pen, &in_slope, &out_slope, + &start, &stop); + edges[0] = f->cw; + edges[1] = f->ccw; + tri[0] = f->point; + tri[1] = f->cw; + while (start != stop) { + tri[2] = f->point; + translate_point (&tri[2], &pen->vertices[start].point); + edges[2] = f->point; + edges[3] = tri[2]; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, + tri, edges); + + tri[1] = tri[2]; + edges[0] = edges[2]; + edges[1] = edges[3]; + if (++start == pen->num_vertices) + start = 0; + } + tri[2] = f->ccw; + edges[2] = f->cw; + edges[3] = f->ccw; + _cairo_traps_tessellate_triangle_with_edges (stroker->traps, + tri, edges); + break; + } + + case CAIRO_LINE_CAP_SQUARE: { + double dx, dy; + cairo_slope_t fvector; + cairo_point_t quad[4]; + + dx = f->usr_vector.x; + dy = f->usr_vector.y; + dx *= stroker->half_line_width; + dy *= stroker->half_line_width; + cairo_matrix_transform_distance (stroker->ctm, &dx, &dy); + fvector.dx = _cairo_fixed_from_double (dx); + fvector.dy = _cairo_fixed_from_double (dy); + + quad[0] = f->cw; + quad[1].x = f->cw.x + fvector.dx; + quad[1].y = f->cw.y + fvector.dy; + quad[2].x = f->ccw.x + fvector.dx; + quad[2].y = f->ccw.y + fvector.dy; + quad[3] = f->ccw; + + _cairo_traps_tessellate_convex_quad (stroker->traps, quad); + break; + } + + case CAIRO_LINE_CAP_BUTT: + default: + break; + } +} + +static void +add_leading_cap (struct stroker *stroker, + cairo_stroke_face_t *face) +{ + cairo_stroke_face_t reversed; + cairo_point_t t; + + reversed = *face; + + /* The initial cap needs an outward facing vector. Reverse everything */ + reversed.usr_vector.x = -reversed.usr_vector.x; + reversed.usr_vector.y = -reversed.usr_vector.y; + reversed.dev_vector.dx = -reversed.dev_vector.dx; + reversed.dev_vector.dy = -reversed.dev_vector.dy; + t = reversed.cw; + reversed.cw = reversed.ccw; + reversed.ccw = t; + + add_cap (stroker, &reversed); +} + +static void +add_trailing_cap (struct stroker *stroker, cairo_stroke_face_t *face) +{ + add_cap (stroker, face); +} + +static inline double +normalize_slope (double *dx, double *dy) +{ + double dx0 = *dx, dy0 = *dy; + + if (dx0 == 0.0 && dy0 == 0.0) + return 0; + + if (dx0 == 0.0) { + *dx = 0.0; + if (dy0 > 0.0) { + *dy = 1.0; + return dy0; + } else { + *dy = -1.0; + return -dy0; + } + } else if (dy0 == 0.0) { + *dy = 0.0; + if (dx0 > 0.0) { + *dx = 1.0; + return dx0; + } else { + *dx = -1.0; + return -dx0; + } + } else { + double mag = hypot (dx0, dy0); + *dx = dx0 / mag; + *dy = dy0 / mag; + return mag; + } +} + +static void +compute_face (const cairo_point_t *point, + const cairo_slope_t *dev_slope, + struct stroker *stroker, + cairo_stroke_face_t *face) +{ + double face_dx, face_dy; + cairo_point_t offset_ccw, offset_cw; + double slope_dx, slope_dy; + + slope_dx = _cairo_fixed_to_double (dev_slope->dx); + slope_dy = _cairo_fixed_to_double (dev_slope->dy); + face->length = normalize_slope (&slope_dx, &slope_dy); + face->dev_slope.x = slope_dx; + face->dev_slope.y = slope_dy; + + /* + * rotate to get a line_width/2 vector along the face, note that + * the vector must be rotated the right direction in device space, + * but by 90° in user space. So, the rotation depends on + * whether the ctm reflects or not, and that can be determined + * by looking at the determinant of the matrix. + */ + if (stroker->ctm_inverse) { + cairo_matrix_transform_distance (stroker->ctm_inverse, &slope_dx, &slope_dy); + normalize_slope (&slope_dx, &slope_dy); + + if (stroker->ctm_det_positive) { + face_dx = - slope_dy * stroker->half_line_width; + face_dy = slope_dx * stroker->half_line_width; + } else { + face_dx = slope_dy * stroker->half_line_width; + face_dy = - slope_dx * stroker->half_line_width; + } + + /* back to device space */ + cairo_matrix_transform_distance (stroker->ctm, &face_dx, &face_dy); + } else { + face_dx = - slope_dy * stroker->half_line_width; + face_dy = slope_dx * stroker->half_line_width; + } + + offset_ccw.x = _cairo_fixed_from_double (face_dx); + offset_ccw.y = _cairo_fixed_from_double (face_dy); + offset_cw.x = -offset_ccw.x; + offset_cw.y = -offset_ccw.y; + + face->ccw = *point; + translate_point (&face->ccw, &offset_ccw); + + face->point = *point; + + face->cw = *point; + translate_point (&face->cw, &offset_cw); + + face->usr_vector.x = slope_dx; + face->usr_vector.y = slope_dy; + + face->dev_vector = *dev_slope; +} + +static void +add_caps (struct stroker *stroker) +{ + /* check for a degenerative sub_path */ + if (stroker->has_initial_sub_path && + !stroker->has_first_face && + !stroker->has_current_face && + stroker->style->line_cap == CAIRO_LINE_CAP_ROUND) + { + /* pick an arbitrary slope to use */ + cairo_slope_t slope = { CAIRO_FIXED_ONE, 0 }; + cairo_stroke_face_t face; + + /* arbitrarily choose first_point + * first_point and current_point should be the same */ + compute_face (&stroker->first_point, &slope, stroker, &face); + + add_leading_cap (stroker, &face); + add_trailing_cap (stroker, &face); + } + + if (stroker->has_first_face) + add_leading_cap (stroker, &stroker->first_face); + + if (stroker->has_current_face) + add_trailing_cap (stroker, &stroker->current_face); +} + +static cairo_bool_t +stroker_intersects_edge (const struct stroker *stroker, + const cairo_stroke_face_t *start, + const cairo_stroke_face_t *end) +{ + cairo_box_t box; + + if (! stroker->has_bounds) + return TRUE; + + if (_cairo_box_contains_point (&stroker->tight_bounds, &start->cw)) + return TRUE; + box.p2 = box.p1 = start->cw; + + if (_cairo_box_contains_point (&stroker->tight_bounds, &start->ccw)) + return TRUE; + _cairo_box_add_point (&box, &start->ccw); + + if (_cairo_box_contains_point (&stroker->tight_bounds, &end->cw)) + return TRUE; + _cairo_box_add_point (&box, &end->cw); + + if (_cairo_box_contains_point (&stroker->tight_bounds, &end->ccw)) + return TRUE; + _cairo_box_add_point (&box, &end->ccw); + + return (box.p2.x > stroker->tight_bounds.p1.x && + box.p1.x < stroker->tight_bounds.p2.x && + box.p2.y > stroker->tight_bounds.p1.y && + box.p1.y < stroker->tight_bounds.p2.y); +} + +static void +add_sub_edge (struct stroker *stroker, + const cairo_point_t *p1, const cairo_point_t *p2, + const cairo_slope_t *dev_slope, + cairo_stroke_face_t *start, cairo_stroke_face_t *end) +{ + cairo_point_t rectangle[4]; + + compute_face (p1, dev_slope, stroker, start); + + *end = *start; + end->point = *p2; + rectangle[0].x = p2->x - p1->x; + rectangle[0].y = p2->y - p1->y; + translate_point (&end->ccw, &rectangle[0]); + translate_point (&end->cw, &rectangle[0]); + + if (p1->x == p2->x && p1->y == p2->y) + return; + + if (! stroker_intersects_edge (stroker, start, end)) + return; + + rectangle[0] = start->cw; + rectangle[1] = start->ccw; + rectangle[2] = end->ccw; + rectangle[3] = end->cw; + + _cairo_traps_tessellate_convex_quad (stroker->traps, rectangle); +} + +static cairo_status_t +move_to (void *closure, const cairo_point_t *point) +{ + struct stroker *stroker = closure; + + /* Cap the start and end of the previous sub path as needed */ + add_caps (stroker); + + stroker->first_point = *point; + stroker->current_face.point = *point; + + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + stroker->has_initial_sub_path = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +move_to_dashed (void *closure, const cairo_point_t *point) +{ + /* reset the dash pattern for new sub paths */ + struct stroker *stroker = closure; + + _cairo_stroker_dash_start (&stroker->dash); + return move_to (closure, point); +} + +static cairo_status_t +line_to (void *closure, const cairo_point_t *point) +{ + struct stroker *stroker = closure; + cairo_stroke_face_t start, end; + const cairo_point_t *p1 = &stroker->current_face.point; + const cairo_point_t *p2 = point; + cairo_slope_t dev_slope; + + stroker->has_initial_sub_path = TRUE; + + if (p1->x == p2->x && p1->y == p2->y) + return CAIRO_STATUS_SUCCESS; + + _cairo_slope_init (&dev_slope, p1, p2); + add_sub_edge (stroker, p1, p2, &dev_slope, &start, &end); + + if (stroker->has_current_face) { + /* Join with final face from previous segment */ + join (stroker, &stroker->current_face, &start); + } else if (!stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = start; + stroker->has_first_face = TRUE; + } + stroker->current_face = end; + stroker->has_current_face = TRUE; + + return CAIRO_STATUS_SUCCESS; +} + +/* + * Dashed lines. Cap each dash end, join around turns when on + */ +static cairo_status_t +line_to_dashed (void *closure, const cairo_point_t *point) +{ + struct stroker *stroker = closure; + double mag, remain, step_length = 0; + double slope_dx, slope_dy; + double dx2, dy2; + cairo_stroke_face_t sub_start, sub_end; + const cairo_point_t *p1 = &stroker->current_face.point; + const cairo_point_t *p2 = point; + cairo_slope_t dev_slope; + cairo_line_t segment; + cairo_bool_t fully_in_bounds; + + stroker->has_initial_sub_path = stroker->dash.dash_starts_on; + + if (p1->x == p2->x && p1->y == p2->y) + return CAIRO_STATUS_SUCCESS; + + fully_in_bounds = TRUE; + if (stroker->has_bounds && + (! _cairo_box_contains_point (&stroker->join_bounds, p1) || + ! _cairo_box_contains_point (&stroker->join_bounds, p2))) + { + fully_in_bounds = FALSE; + } + + _cairo_slope_init (&dev_slope, p1, p2); + + slope_dx = _cairo_fixed_to_double (p2->x - p1->x); + slope_dy = _cairo_fixed_to_double (p2->y - p1->y); + + if (stroker->ctm_inverse) + cairo_matrix_transform_distance (stroker->ctm_inverse, &slope_dx, &slope_dy); + mag = normalize_slope (&slope_dx, &slope_dy); + if (mag <= DBL_EPSILON) + return CAIRO_STATUS_SUCCESS; + + remain = mag; + segment.p1 = *p1; + while (remain) { + step_length = MIN (stroker->dash.dash_remain, remain); + remain -= step_length; + dx2 = slope_dx * (mag - remain); + dy2 = slope_dy * (mag - remain); + cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); + segment.p2.x = _cairo_fixed_from_double (dx2) + p1->x; + segment.p2.y = _cairo_fixed_from_double (dy2) + p1->y; + + if (stroker->dash.dash_on && + (fully_in_bounds || + (! stroker->has_first_face && stroker->dash.dash_starts_on) || + _cairo_box_intersects_line_segment (&stroker->join_bounds, &segment))) + { + add_sub_edge (stroker, + &segment.p1, &segment.p2, + &dev_slope, + &sub_start, &sub_end); + + if (stroker->has_current_face) { + /* Join with final face from previous segment */ + join (stroker, &stroker->current_face, &sub_start); + + stroker->has_current_face = FALSE; + } else if (! stroker->has_first_face && stroker->dash.dash_starts_on) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = sub_start; + stroker->has_first_face = TRUE; + } else { + /* Cap dash start if not connecting to a previous segment */ + add_leading_cap (stroker, &sub_start); + } + + if (remain) { + /* Cap dash end if not at end of segment */ + add_trailing_cap (stroker, &sub_end); + } else { + stroker->current_face = sub_end; + stroker->has_current_face = TRUE; + } + } else { + if (stroker->has_current_face) { + /* Cap final face from previous segment */ + add_trailing_cap (stroker, &stroker->current_face); + + stroker->has_current_face = FALSE; + } + } + + _cairo_stroker_dash_step (&stroker->dash, step_length); + segment.p1 = segment.p2; + } + + if (stroker->dash.dash_on && ! stroker->has_current_face) { + /* This segment ends on a transition to dash_on, compute a new face + * and add cap for the beginning of the next dash_on step. + * + * Note: this will create a degenerate cap if this is not the last line + * in the path. Whether this behaviour is desirable or not is debatable. + * On one side these degenerate caps can not be reproduced with regular + * path stroking. + * On the other hand, Acroread 7 also produces the degenerate caps. + */ + compute_face (point, &dev_slope, stroker, &stroker->current_face); + + add_leading_cap (stroker, &stroker->current_face); + + stroker->has_current_face = TRUE; + } else + stroker->current_face.point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +spline_to (void *closure, + const cairo_point_t *point, + const cairo_slope_t *tangent) +{ + struct stroker *stroker = closure; + cairo_stroke_face_t face; + + if ((tangent->dx | tangent->dy) == 0) { + cairo_point_t t; + + face = stroker->current_face; + + face.usr_vector.x = -face.usr_vector.x; + face.usr_vector.y = -face.usr_vector.y; + face.dev_slope.x = -face.dev_slope.x; + face.dev_slope.y = -face.dev_slope.y; + face.dev_vector.dx = -face.dev_vector.dx; + face.dev_vector.dy = -face.dev_vector.dy; + + t = face.cw; + face.cw = face.ccw; + face.ccw = t; + + join (stroker, &stroker->current_face, &face); + } else { + cairo_point_t rectangle[4]; + + compute_face (&stroker->current_face.point, tangent, stroker, &face); + join (stroker, &stroker->current_face, &face); + + rectangle[0] = face.cw; + rectangle[1] = face.ccw; + + rectangle[2].x = point->x - face.point.x; + rectangle[2].y = point->y - face.point.y; + face.point = *point; + translate_point (&face.ccw, &rectangle[2]); + translate_point (&face.cw, &rectangle[2]); + + rectangle[2] = face.ccw; + rectangle[3] = face.cw; + + _cairo_traps_tessellate_convex_quad (stroker->traps, rectangle); + } + + stroker->current_face = face; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + struct stroker *stroker = closure; + cairo_line_join_t line_join_save; + cairo_spline_t spline; + cairo_stroke_face_t face; + cairo_status_t status; + + if (stroker->has_bounds && + ! _cairo_spline_intersects (&stroker->current_face.point, b, c, d, + &stroker->line_bounds)) + return line_to (closure, d); + + if (! _cairo_spline_init (&spline, spline_to, stroker, + &stroker->current_face.point, b, c, d)) + return line_to (closure, d); + + compute_face (&stroker->current_face.point, &spline.initial_slope, + stroker, &face); + + if (stroker->has_current_face) { + /* Join with final face from previous segment */ + join (stroker, &stroker->current_face, &face); + } else { + if (! stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = face; + stroker->has_first_face = TRUE; + } + stroker->has_current_face = TRUE; + } + stroker->current_face = face; + + /* Temporarily modify the stroker to use round joins to guarantee + * smooth stroked curves. */ + line_join_save = stroker->line_join; + stroker->line_join = CAIRO_LINE_JOIN_ROUND; + + status = _cairo_spline_decompose (&spline, stroker->tolerance); + + stroker->line_join = line_join_save; + + return status; +} + +static cairo_status_t +curve_to_dashed (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + struct stroker *stroker = closure; + cairo_spline_t spline; + cairo_line_join_t line_join_save; + cairo_spline_add_point_func_t func; + cairo_status_t status; + + func = (cairo_spline_add_point_func_t)line_to_dashed; + + if (stroker->has_bounds && + ! _cairo_spline_intersects (&stroker->current_face.point, b, c, d, + &stroker->line_bounds)) + return func (closure, d, NULL); + + if (! _cairo_spline_init (&spline, func, stroker, + &stroker->current_face.point, b, c, d)) + return func (closure, d, NULL); + + /* Temporarily modify the stroker to use round joins to guarantee + * smooth stroked curves. */ + line_join_save = stroker->line_join; + stroker->line_join = CAIRO_LINE_JOIN_ROUND; + + status = _cairo_spline_decompose (&spline, stroker->tolerance); + + stroker->line_join = line_join_save; + + return status; +} + +static cairo_status_t +_close_path (struct stroker *stroker) +{ + if (stroker->has_first_face && stroker->has_current_face) { + /* Join first and final faces of sub path */ + join (stroker, &stroker->current_face, &stroker->first_face); + } else { + /* Cap the start and end of the sub path as needed */ + add_caps (stroker); + } + + stroker->has_initial_sub_path = FALSE; + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +close_path (void *closure) +{ + struct stroker *stroker = closure; + cairo_status_t status; + + status = line_to (stroker, &stroker->first_point); + if (unlikely (status)) + return status; + + return _close_path (stroker); +} + +static cairo_status_t +close_path_dashed (void *closure) +{ + struct stroker *stroker = closure; + cairo_status_t status; + + status = line_to_dashed (stroker, &stroker->first_point); + if (unlikely (status)) + return status; + + return _close_path (stroker); +} + +cairo_int_status_t +_cairo_path_fixed_stroke_to_traps (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_traps_t *traps) +{ + struct stroker stroker; + cairo_status_t status; + + status = stroker_init (&stroker, path, style, + ctm, ctm_inverse, tolerance, + traps); + if (unlikely (status)) + return status; + + if (stroker.dash.dashed) + status = _cairo_path_fixed_interpret (path, + move_to_dashed, + line_to_dashed, + curve_to_dashed, + close_path_dashed, + &stroker); + else + status = _cairo_path_fixed_interpret (path, + move_to, + line_to, + curve_to, + close_path, + &stroker); + assert(status == CAIRO_STATUS_SUCCESS); + add_caps (&stroker); + + stroker_fini (&stroker); + + return traps->status; +} diff --git a/src/cairo-path-stroke-tristrip.c b/src/cairo-path-stroke-tristrip.c new file mode 100644 index 000000000..6ce4131cc --- /dev/null +++ b/src/cairo-path-stroke-tristrip.c @@ -0,0 +1,1088 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#define _BSD_SOURCE /* for hypot() */ +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-slope-private.h" +#include "cairo-tristrip-private.h" + +struct stroker { + cairo_stroke_style_t style; + + cairo_tristrip_t *strip; + + const cairo_matrix_t *ctm; + const cairo_matrix_t *ctm_inverse; + double tolerance; + cairo_bool_t ctm_det_positive; + + cairo_pen_t pen; + + cairo_bool_t has_sub_path; + + cairo_point_t first_point; + + cairo_bool_t has_current_face; + cairo_stroke_face_t current_face; + + cairo_bool_t has_first_face; + cairo_stroke_face_t first_face; + + cairo_box_t limit; + cairo_bool_t has_limits; +}; + +static inline double +normalize_slope (double *dx, double *dy); + +static void +compute_face (const cairo_point_t *point, + const cairo_slope_t *dev_slope, + struct stroker *stroker, + cairo_stroke_face_t *face); + +static void +translate_point (cairo_point_t *point, const cairo_point_t *offset) +{ + point->x += offset->x; + point->y += offset->y; +} + +static int +slope_compare_sgn (double dx1, double dy1, double dx2, double dy2) +{ + double c = (dx1 * dy2 - dx2 * dy1); + + if (c > 0) return 1; + if (c < 0) return -1; + return 0; +} + +static inline int +range_step (int i, int step, int max) +{ + i += step; + if (i < 0) + i = max - 1; + if (i >= max) + i = 0; + return i; +} + +/* + * Construct a fan around the midpoint using the vertices from pen between + * inpt and outpt. + */ +static void +add_fan (struct stroker *stroker, + const cairo_slope_t *in_vector, + const cairo_slope_t *out_vector, + const cairo_point_t *midpt, + const cairo_point_t *inpt, + const cairo_point_t *outpt, + cairo_bool_t clockwise) +{ + int start, stop, step, i, npoints; + + if (clockwise) { + step = 1; + + start = _cairo_pen_find_active_cw_vertex_index (&stroker->pen, + in_vector); + if (_cairo_slope_compare (&stroker->pen.vertices[start].slope_cw, + in_vector) < 0) + start = range_step (start, 1, stroker->pen.num_vertices); + + stop = _cairo_pen_find_active_cw_vertex_index (&stroker->pen, + out_vector); + if (_cairo_slope_compare (&stroker->pen.vertices[stop].slope_ccw, + out_vector) > 0) + { + stop = range_step (stop, -1, stroker->pen.num_vertices); + if (_cairo_slope_compare (&stroker->pen.vertices[stop].slope_cw, + in_vector) < 0) + return; + } + + npoints = stop - start; + } else { + step = -1; + + start = _cairo_pen_find_active_ccw_vertex_index (&stroker->pen, + in_vector); + if (_cairo_slope_compare (&stroker->pen.vertices[start].slope_ccw, + in_vector) < 0) + start = range_step (start, -1, stroker->pen.num_vertices); + + stop = _cairo_pen_find_active_ccw_vertex_index (&stroker->pen, + out_vector); + if (_cairo_slope_compare (&stroker->pen.vertices[stop].slope_cw, + out_vector) > 0) + { + stop = range_step (stop, 1, stroker->pen.num_vertices); + if (_cairo_slope_compare (&stroker->pen.vertices[stop].slope_ccw, + in_vector) < 0) + return; + } + + npoints = start - stop; + } + stop = range_step (stop, step, stroker->pen.num_vertices); + if (npoints < 0) + npoints += stroker->pen.num_vertices; + if (npoints <= 1) + return; + + for (i = start; + i != stop; + i = range_step (i, step, stroker->pen.num_vertices)) + { + cairo_point_t p = *midpt; + translate_point (&p, &stroker->pen.vertices[i].point); + //contour_add_point (stroker, c, &p); + } +} + +static int +join_is_clockwise (const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + return _cairo_slope_compare (&in->dev_vector, &out->dev_vector) < 0; +} + +static void +inner_join (struct stroker *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out, + int clockwise) +{ + const cairo_point_t *outpt; + + if (clockwise) { + outpt = &out->ccw; + } else { + outpt = &out->cw; + } + //contour_add_point (stroker, inner, &in->point); + //contour_add_point (stroker, inner, outpt); +} + +static void +inner_close (struct stroker *stroker, + const cairo_stroke_face_t *in, + cairo_stroke_face_t *out) +{ + const cairo_point_t *inpt; + + if (join_is_clockwise (in, out)) { + inpt = &out->ccw; + } else { + inpt = &out->cw; + } + + //contour_add_point (stroker, inner, &in->point); + //contour_add_point (stroker, inner, inpt); + //*_cairo_contour_first_point (&inner->contour) = + //*_cairo_contour_last_point (&inner->contour); +} + +static void +outer_close (struct stroker *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + const cairo_point_t *inpt, *outpt; + int clockwise; + + if (in->cw.x == out->cw.x && in->cw.y == out->cw.y && + in->ccw.x == out->ccw.x && in->ccw.y == out->ccw.y) + { + return; + } + clockwise = join_is_clockwise (in, out); + if (clockwise) { + inpt = &in->cw; + outpt = &out->cw; + } else { + inpt = &in->ccw; + outpt = &out->ccw; + } + + switch (stroker->style.line_join) { + case CAIRO_LINE_JOIN_ROUND: + /* construct a fan around the common midpoint */ + add_fan (stroker, + &in->dev_vector, + &out->dev_vector, + &in->point, inpt, outpt, + clockwise); + break; + + case CAIRO_LINE_JOIN_MITER: + default: { + /* dot product of incoming slope vector with outgoing slope vector */ + double in_dot_out = -in->usr_vector.x * out->usr_vector.x + + -in->usr_vector.y * out->usr_vector.y; + double ml = stroker->style.miter_limit; + + /* Check the miter limit -- lines meeting at an acute angle + * can generate long miters, the limit converts them to bevel + * + * Consider the miter join formed when two line segments + * meet at an angle psi: + * + * /.\ + * /. .\ + * /./ \.\ + * /./psi\.\ + * + * We can zoom in on the right half of that to see: + * + * |\ + * | \ psi/2 + * | \ + * | \ + * | \ + * | \ + * miter \ + * length \ + * | \ + * | .\ + * | . \ + * |. line \ + * \ width \ + * \ \ + * + * + * The right triangle in that figure, (the line-width side is + * shown faintly with three '.' characters), gives us the + * following expression relating miter length, angle and line + * width: + * + * 1 /sin (psi/2) = miter_length / line_width + * + * The right-hand side of this relationship is the same ratio + * in which the miter limit (ml) is expressed. We want to know + * when the miter length is within the miter limit. That is + * when the following condition holds: + * + * 1/sin(psi/2) <= ml + * 1 <= ml sin(psi/2) + * 1 <= ml² sin²(psi/2) + * 2 <= ml² 2 sin²(psi/2) + * 2·sin²(psi/2) = 1-cos(psi) + * 2 <= ml² (1-cos(psi)) + * + * in · out = |in| |out| cos (psi) + * + * in and out are both unit vectors, so: + * + * in · out = cos (psi) + * + * 2 <= ml² (1 - in · out) + * + */ + if (2 <= ml * ml * (1 - in_dot_out)) { + double x1, y1, x2, y2; + double mx, my; + double dx1, dx2, dy1, dy2; + double ix, iy; + double fdx1, fdy1, fdx2, fdy2; + double mdx, mdy; + + /* + * we've got the points already transformed to device + * space, but need to do some computation with them and + * also need to transform the slope from user space to + * device space + */ + /* outer point of incoming line face */ + x1 = _cairo_fixed_to_double (inpt->x); + y1 = _cairo_fixed_to_double (inpt->y); + dx1 = in->usr_vector.x; + dy1 = in->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx1, &dy1); + + /* outer point of outgoing line face */ + x2 = _cairo_fixed_to_double (outpt->x); + y2 = _cairo_fixed_to_double (outpt->y); + dx2 = out->usr_vector.x; + dy2 = out->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); + + /* + * Compute the location of the outer corner of the miter. + * That's pretty easy -- just the intersection of the two + * outer edges. We've got slopes and points on each + * of those edges. Compute my directly, then compute + * mx by using the edge with the larger dy; that avoids + * dividing by values close to zero. + */ + my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / + (dx1 * dy2 - dx2 * dy1)); + if (fabs (dy1) >= fabs (dy2)) + mx = (my - y1) * dx1 / dy1 + x1; + else + mx = (my - y2) * dx2 / dy2 + x2; + + /* + * When the two outer edges are nearly parallel, slight + * perturbations in the position of the outer points of the lines + * caused by representing them in fixed point form can cause the + * intersection point of the miter to move a large amount. If + * that moves the miter intersection from between the two faces, + * then draw a bevel instead. + */ + + ix = _cairo_fixed_to_double (in->point.x); + iy = _cairo_fixed_to_double (in->point.y); + + /* slope of one face */ + fdx1 = x1 - ix; fdy1 = y1 - iy; + + /* slope of the other face */ + fdx2 = x2 - ix; fdy2 = y2 - iy; + + /* slope from the intersection to the miter point */ + mdx = mx - ix; mdy = my - iy; + + /* + * Make sure the miter point line lies between the two + * faces by comparing the slopes + */ + if (slope_compare_sgn (fdx1, fdy1, mdx, mdy) != + slope_compare_sgn (fdx2, fdy2, mdx, mdy)) + { + cairo_point_t p; + + p.x = _cairo_fixed_from_double (mx); + p.y = _cairo_fixed_from_double (my); + + //*_cairo_contour_last_point (&outer->contour) = p; + //*_cairo_contour_first_point (&outer->contour) = p; + return; + } + } + break; + } + + case CAIRO_LINE_JOIN_BEVEL: + break; + } + //contour_add_point (stroker, outer, outpt); +} + +static void +outer_join (struct stroker *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out, + int clockwise) +{ + const cairo_point_t *inpt, *outpt; + + if (in->cw.x == out->cw.x && in->cw.y == out->cw.y && + in->ccw.x == out->ccw.x && in->ccw.y == out->ccw.y) + { + return; + } + if (clockwise) { + inpt = &in->cw; + outpt = &out->cw; + } else { + inpt = &in->ccw; + outpt = &out->ccw; + } + + switch (stroker->style.line_join) { + case CAIRO_LINE_JOIN_ROUND: + /* construct a fan around the common midpoint */ + add_fan (stroker, + &in->dev_vector, + &out->dev_vector, + &in->point, inpt, outpt, + clockwise); + break; + + case CAIRO_LINE_JOIN_MITER: + default: { + /* dot product of incoming slope vector with outgoing slope vector */ + double in_dot_out = -in->usr_vector.x * out->usr_vector.x + + -in->usr_vector.y * out->usr_vector.y; + double ml = stroker->style.miter_limit; + + /* Check the miter limit -- lines meeting at an acute angle + * can generate long miters, the limit converts them to bevel + * + * Consider the miter join formed when two line segments + * meet at an angle psi: + * + * /.\ + * /. .\ + * /./ \.\ + * /./psi\.\ + * + * We can zoom in on the right half of that to see: + * + * |\ + * | \ psi/2 + * | \ + * | \ + * | \ + * | \ + * miter \ + * length \ + * | \ + * | .\ + * | . \ + * |. line \ + * \ width \ + * \ \ + * + * + * The right triangle in that figure, (the line-width side is + * shown faintly with three '.' characters), gives us the + * following expression relating miter length, angle and line + * width: + * + * 1 /sin (psi/2) = miter_length / line_width + * + * The right-hand side of this relationship is the same ratio + * in which the miter limit (ml) is expressed. We want to know + * when the miter length is within the miter limit. That is + * when the following condition holds: + * + * 1/sin(psi/2) <= ml + * 1 <= ml sin(psi/2) + * 1 <= ml² sin²(psi/2) + * 2 <= ml² 2 sin²(psi/2) + * 2·sin²(psi/2) = 1-cos(psi) + * 2 <= ml² (1-cos(psi)) + * + * in · out = |in| |out| cos (psi) + * + * in and out are both unit vectors, so: + * + * in · out = cos (psi) + * + * 2 <= ml² (1 - in · out) + * + */ + if (2 <= ml * ml * (1 - in_dot_out)) { + double x1, y1, x2, y2; + double mx, my; + double dx1, dx2, dy1, dy2; + double ix, iy; + double fdx1, fdy1, fdx2, fdy2; + double mdx, mdy; + + /* + * we've got the points already transformed to device + * space, but need to do some computation with them and + * also need to transform the slope from user space to + * device space + */ + /* outer point of incoming line face */ + x1 = _cairo_fixed_to_double (inpt->x); + y1 = _cairo_fixed_to_double (inpt->y); + dx1 = in->usr_vector.x; + dy1 = in->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx1, &dy1); + + /* outer point of outgoing line face */ + x2 = _cairo_fixed_to_double (outpt->x); + y2 = _cairo_fixed_to_double (outpt->y); + dx2 = out->usr_vector.x; + dy2 = out->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); + + /* + * Compute the location of the outer corner of the miter. + * That's pretty easy -- just the intersection of the two + * outer edges. We've got slopes and points on each + * of those edges. Compute my directly, then compute + * mx by using the edge with the larger dy; that avoids + * dividing by values close to zero. + */ + my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / + (dx1 * dy2 - dx2 * dy1)); + if (fabs (dy1) >= fabs (dy2)) + mx = (my - y1) * dx1 / dy1 + x1; + else + mx = (my - y2) * dx2 / dy2 + x2; + + /* + * When the two outer edges are nearly parallel, slight + * perturbations in the position of the outer points of the lines + * caused by representing them in fixed point form can cause the + * intersection point of the miter to move a large amount. If + * that moves the miter intersection from between the two faces, + * then draw a bevel instead. + */ + + ix = _cairo_fixed_to_double (in->point.x); + iy = _cairo_fixed_to_double (in->point.y); + + /* slope of one face */ + fdx1 = x1 - ix; fdy1 = y1 - iy; + + /* slope of the other face */ + fdx2 = x2 - ix; fdy2 = y2 - iy; + + /* slope from the intersection to the miter point */ + mdx = mx - ix; mdy = my - iy; + + /* + * Make sure the miter point line lies between the two + * faces by comparing the slopes + */ + if (slope_compare_sgn (fdx1, fdy1, mdx, mdy) != + slope_compare_sgn (fdx2, fdy2, mdx, mdy)) + { + cairo_point_t p; + + p.x = _cairo_fixed_from_double (mx); + p.y = _cairo_fixed_from_double (my); + + //*_cairo_contour_last_point (&outer->contour) = p; + return; + } + } + break; + } + + case CAIRO_LINE_JOIN_BEVEL: + break; + } + //contour_add_point (stroker,outer, outpt); +} + +static void +add_cap (struct stroker *stroker, + const cairo_stroke_face_t *f) +{ + switch (stroker->style.line_cap) { + case CAIRO_LINE_CAP_ROUND: { + cairo_slope_t slope; + + slope.dx = -f->dev_vector.dx; + slope.dy = -f->dev_vector.dy; + + add_fan (stroker, &f->dev_vector, &slope, + &f->point, &f->ccw, &f->cw, + FALSE); + break; + } + + case CAIRO_LINE_CAP_SQUARE: { + double dx, dy; + cairo_slope_t fvector; + cairo_point_t quad[4]; + + dx = f->usr_vector.x; + dy = f->usr_vector.y; + dx *= stroker->style.line_width / 2.0; + dy *= stroker->style.line_width / 2.0; + cairo_matrix_transform_distance (stroker->ctm, &dx, &dy); + fvector.dx = _cairo_fixed_from_double (dx); + fvector.dy = _cairo_fixed_from_double (dy); + + quad[0] = f->ccw; + quad[1].x = f->ccw.x + fvector.dx; + quad[1].y = f->ccw.y + fvector.dy; + quad[2].x = f->cw.x + fvector.dx; + quad[2].y = f->cw.y + fvector.dy; + quad[3] = f->cw; + + //contour_add_point (stroker, c, &quad[1]); + //contour_add_point (stroker, c, &quad[2]); + } + + case CAIRO_LINE_CAP_BUTT: + default: + break; + } + //contour_add_point (stroker, c, &f->cw); +} + +static void +add_leading_cap (struct stroker *stroker, + const cairo_stroke_face_t *face) +{ + cairo_stroke_face_t reversed; + cairo_point_t t; + + reversed = *face; + + /* The initial cap needs an outward facing vector. Reverse everything */ + reversed.usr_vector.x = -reversed.usr_vector.x; + reversed.usr_vector.y = -reversed.usr_vector.y; + reversed.dev_vector.dx = -reversed.dev_vector.dx; + reversed.dev_vector.dy = -reversed.dev_vector.dy; + + t = reversed.cw; + reversed.cw = reversed.ccw; + reversed.ccw = t; + + add_cap (stroker, &reversed); +} + +static void +add_trailing_cap (struct stroker *stroker, + const cairo_stroke_face_t *face) +{ + add_cap (stroker, face); +} + +static inline double +normalize_slope (double *dx, double *dy) +{ + double dx0 = *dx, dy0 = *dy; + double mag; + + assert (dx0 != 0.0 || dy0 != 0.0); + + if (dx0 == 0.0) { + *dx = 0.0; + if (dy0 > 0.0) { + mag = dy0; + *dy = 1.0; + } else { + mag = -dy0; + *dy = -1.0; + } + } else if (dy0 == 0.0) { + *dy = 0.0; + if (dx0 > 0.0) { + mag = dx0; + *dx = 1.0; + } else { + mag = -dx0; + *dx = -1.0; + } + } else { + mag = hypot (dx0, dy0); + *dx = dx0 / mag; + *dy = dy0 / mag; + } + + return mag; +} + +static void +compute_face (const cairo_point_t *point, + const cairo_slope_t *dev_slope, + struct stroker *stroker, + cairo_stroke_face_t *face) +{ + double face_dx, face_dy; + cairo_point_t offset_ccw, offset_cw; + double slope_dx, slope_dy; + + slope_dx = _cairo_fixed_to_double (dev_slope->dx); + slope_dy = _cairo_fixed_to_double (dev_slope->dy); + face->length = normalize_slope (&slope_dx, &slope_dy); + face->dev_slope.x = slope_dx; + face->dev_slope.y = slope_dy; + + /* + * rotate to get a line_width/2 vector along the face, note that + * the vector must be rotated the right direction in device space, + * but by 90° in user space. So, the rotation depends on + * whether the ctm reflects or not, and that can be determined + * by looking at the determinant of the matrix. + */ + if (! _cairo_matrix_is_identity (stroker->ctm_inverse)) { + /* Normalize the matrix! */ + cairo_matrix_transform_distance (stroker->ctm_inverse, + &slope_dx, &slope_dy); + normalize_slope (&slope_dx, &slope_dy); + + if (stroker->ctm_det_positive) { + face_dx = - slope_dy * (stroker->style.line_width / 2.0); + face_dy = slope_dx * (stroker->style.line_width / 2.0); + } else { + face_dx = slope_dy * (stroker->style.line_width / 2.0); + face_dy = - slope_dx * (stroker->style.line_width / 2.0); + } + + /* back to device space */ + cairo_matrix_transform_distance (stroker->ctm, &face_dx, &face_dy); + } else { + face_dx = - slope_dy * (stroker->style.line_width / 2.0); + face_dy = slope_dx * (stroker->style.line_width / 2.0); + } + + offset_ccw.x = _cairo_fixed_from_double (face_dx); + offset_ccw.y = _cairo_fixed_from_double (face_dy); + offset_cw.x = -offset_ccw.x; + offset_cw.y = -offset_ccw.y; + + face->ccw = *point; + translate_point (&face->ccw, &offset_ccw); + + face->point = *point; + + face->cw = *point; + translate_point (&face->cw, &offset_cw); + + face->usr_vector.x = slope_dx; + face->usr_vector.y = slope_dy; + + face->dev_vector = *dev_slope; +} + +static void +add_caps (struct stroker *stroker) +{ + /* check for a degenerative sub_path */ + if (stroker->has_sub_path && + ! stroker->has_first_face && + ! stroker->has_current_face && + stroker->style.line_cap == CAIRO_LINE_CAP_ROUND) + { + /* pick an arbitrary slope to use */ + cairo_slope_t slope = { CAIRO_FIXED_ONE, 0 }; + cairo_stroke_face_t face; + + /* arbitrarily choose first_point */ + compute_face (&stroker->first_point, &slope, stroker, &face); + + add_leading_cap (stroker, &face); + add_trailing_cap (stroker, &face); + + /* ensure the circle is complete */ + //_cairo_contour_add_point (&stroker->ccw.contour, + //_cairo_contour_first_point (&stroker->ccw.contour)); + } else { + if (stroker->has_current_face) + add_trailing_cap (stroker, &stroker->current_face); + + //_cairo_polygon_add_contour (stroker->polygon, &stroker->ccw.contour); + //_cairo_contour_reset (&stroker->ccw.contour); + + if (stroker->has_first_face) { + //_cairo_contour_add_point (&stroker->ccw.contour, + //&stroker->first_face.cw); + add_leading_cap (stroker, &stroker->first_face); + //_cairo_polygon_add_contour (stroker->polygon, + //&stroker->ccw.contour); + //_cairo_contour_reset (&stroker->ccw.contour); + } + } +} + +static cairo_status_t +move_to (void *closure, + const cairo_point_t *point) +{ + struct stroker *stroker = closure; + + /* Cap the start and end of the previous sub path as needed */ + add_caps (stroker); + + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + stroker->has_sub_path = FALSE; + + stroker->first_point = *point; + + stroker->current_face.point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +line_to (void *closure, + const cairo_point_t *point) +{ + struct stroker *stroker = closure; + cairo_stroke_face_t start; + cairo_point_t *p1 = &stroker->current_face.point; + cairo_slope_t dev_slope; + + stroker->has_sub_path = TRUE; + + if (p1->x == point->x && p1->y == point->y) + return CAIRO_STATUS_SUCCESS; + + _cairo_slope_init (&dev_slope, p1, point); + compute_face (p1, &dev_slope, stroker, &start); + + if (stroker->has_current_face) { + int clockwise = join_is_clockwise (&stroker->current_face, &start); + /* Join with final face from previous segment */ + outer_join (stroker, &stroker->current_face, &start, clockwise); + inner_join (stroker, &stroker->current_face, &start, clockwise); + } else { + if (! stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = start; + _cairo_tristrip_move_to (stroker->strip, &start.cw); + stroker->has_first_face = TRUE; + } + stroker->has_current_face = TRUE; + + _cairo_tristrip_add_point (stroker->strip, &start.cw); + _cairo_tristrip_add_point (stroker->strip, &start.ccw); + } + + stroker->current_face = start; + stroker->current_face.point = *point; + stroker->current_face.ccw.x += dev_slope.dx; + stroker->current_face.ccw.y += dev_slope.dy; + stroker->current_face.cw.x += dev_slope.dx; + stroker->current_face.cw.y += dev_slope.dy; + + _cairo_tristrip_add_point (stroker->strip, &stroker->current_face.cw); + _cairo_tristrip_add_point (stroker->strip, &stroker->current_face.ccw); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +spline_to (void *closure, + const cairo_point_t *point, + const cairo_slope_t *tangent) +{ + struct stroker *stroker = closure; + cairo_stroke_face_t face; + + if (tangent->dx == 0 && tangent->dy == 0) { + const cairo_point_t *inpt, *outpt; + cairo_point_t t; + int clockwise; + + face = stroker->current_face; + + face.usr_vector.x = -face.usr_vector.x; + face.usr_vector.y = -face.usr_vector.y; + face.dev_vector.dx = -face.dev_vector.dx; + face.dev_vector.dy = -face.dev_vector.dy; + + t = face.cw; + face.cw = face.ccw; + face.ccw = t; + + clockwise = join_is_clockwise (&stroker->current_face, &face); + if (clockwise) { + inpt = &stroker->current_face.cw; + outpt = &face.cw; + } else { + inpt = &stroker->current_face.ccw; + outpt = &face.ccw; + } + + add_fan (stroker, + &stroker->current_face.dev_vector, + &face.dev_vector, + &stroker->current_face.point, inpt, outpt, + clockwise); + } else { + compute_face (point, tangent, stroker, &face); + + if (face.dev_slope.x * stroker->current_face.dev_slope.x + + face.dev_slope.y * stroker->current_face.dev_slope.y < 0) + { + const cairo_point_t *inpt, *outpt; + int clockwise = join_is_clockwise (&stroker->current_face, &face); + + stroker->current_face.cw.x += face.point.x - stroker->current_face.point.x; + stroker->current_face.cw.y += face.point.y - stroker->current_face.point.y; + //contour_add_point (stroker, &stroker->cw, &stroker->current_face.cw); + + stroker->current_face.ccw.x += face.point.x - stroker->current_face.point.x; + stroker->current_face.ccw.y += face.point.y - stroker->current_face.point.y; + //contour_add_point (stroker, &stroker->ccw, &stroker->current_face.ccw); + + if (clockwise) { + inpt = &stroker->current_face.cw; + outpt = &face.cw; + } else { + inpt = &stroker->current_face.ccw; + outpt = &face.ccw; + } + add_fan (stroker, + &stroker->current_face.dev_vector, + &face.dev_vector, + &stroker->current_face.point, inpt, outpt, + clockwise); + } + + _cairo_tristrip_add_point (stroker->strip, &face.cw); + _cairo_tristrip_add_point (stroker->strip, &face.ccw); + } + + stroker->current_face = face; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + struct stroker *stroker = closure; + cairo_spline_t spline; + cairo_stroke_face_t face; + + if (stroker->has_limits) { + if (! _cairo_spline_intersects (&stroker->current_face.point, b, c, d, + &stroker->limit)) + return line_to (closure, d); + } + + if (! _cairo_spline_init (&spline, spline_to, stroker, + &stroker->current_face.point, b, c, d)) + return line_to (closure, d); + + compute_face (&stroker->current_face.point, &spline.initial_slope, + stroker, &face); + + if (stroker->has_current_face) { + int clockwise = join_is_clockwise (&stroker->current_face, &face); + /* Join with final face from previous segment */ + outer_join (stroker, &stroker->current_face, &face, clockwise); + inner_join (stroker, &stroker->current_face, &face, clockwise); + } else { + if (! stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = face; + _cairo_tristrip_move_to (stroker->strip, &face.cw); + stroker->has_first_face = TRUE; + } + stroker->has_current_face = TRUE; + + _cairo_tristrip_add_point (stroker->strip, &face.cw); + _cairo_tristrip_add_point (stroker->strip, &face.ccw); + } + stroker->current_face = face; + + return _cairo_spline_decompose (&spline, stroker->tolerance); +} + +static cairo_status_t +close_path (void *closure) +{ + struct stroker *stroker = closure; + cairo_status_t status; + + status = line_to (stroker, &stroker->first_point); + if (unlikely (status)) + return status; + + if (stroker->has_first_face && stroker->has_current_face) { + /* Join first and final faces of sub path */ + outer_close (stroker, &stroker->current_face, &stroker->first_face); + inner_close (stroker, &stroker->current_face, &stroker->first_face); + } else { + /* Cap the start and end of the sub path as needed */ + add_caps (stroker); + } + + stroker->has_sub_path = FALSE; + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_path_fixed_stroke_to_tristrip (const cairo_path_fixed_t *path, + const cairo_stroke_style_t*style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_tristrip_t *strip) +{ + struct stroker stroker; + cairo_int_status_t status; + int i; + + if (style->num_dashes) + return CAIRO_INT_STATUS_UNSUPPORTED; + + stroker.style = *style; + stroker.ctm = ctm; + stroker.ctm_inverse = ctm_inverse; + stroker.tolerance = tolerance; + + stroker.ctm_det_positive = + _cairo_matrix_compute_determinant (ctm) >= 0.0; + + status = _cairo_pen_init (&stroker.pen, + style->line_width / 2.0, + tolerance, ctm); + if (unlikely (status)) + return status; + + if (stroker.pen.num_vertices <= 1) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + stroker.has_current_face = FALSE; + stroker.has_first_face = FALSE; + stroker.has_sub_path = FALSE; + + stroker.has_limits = strip->num_limits > 0; + stroker.limit = strip->limits[0]; + for (i = 1; i < strip->num_limits; i++) + _cairo_box_add_box (&stroker.limit, &strip->limits[i]); + + stroker.strip = strip; + + status = _cairo_path_fixed_interpret (path, + move_to, + line_to, + curve_to, + close_path, + &stroker); + /* Cap the start and end of the final sub path as needed */ + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + add_caps (&stroker); + + _cairo_pen_fini (&stroker.pen); + + return status; +} diff --git a/src/cairo-path-stroke.c b/src/cairo-path-stroke.c new file mode 100644 index 000000000..4d4ede813 --- /dev/null +++ b/src/cairo-path-stroke.c @@ -0,0 +1,1485 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#define _BSD_SOURCE /* for hypot() */ +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-slope-private.h" +#include "cairo-stroke-dash-private.h" +#include "cairo-traps-private.h" + +typedef struct cairo_stroker { + cairo_stroke_style_t style; + + const cairo_matrix_t *ctm; + const cairo_matrix_t *ctm_inverse; + double half_line_width; + double tolerance; + double spline_cusp_tolerance; + double ctm_determinant; + cairo_bool_t ctm_det_positive; + + void *closure; + cairo_status_t (*add_external_edge) (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2); + cairo_status_t (*add_triangle) (void *closure, + const cairo_point_t triangle[3]); + cairo_status_t (*add_triangle_fan) (void *closure, + const cairo_point_t *midpt, + const cairo_point_t *points, + int npoints); + cairo_status_t (*add_convex_quad) (void *closure, + const cairo_point_t quad[4]); + + cairo_pen_t pen; + + cairo_point_t current_point; + cairo_point_t first_point; + + cairo_bool_t has_initial_sub_path; + + cairo_bool_t has_current_face; + cairo_stroke_face_t current_face; + + cairo_bool_t has_first_face; + cairo_stroke_face_t first_face; + + cairo_stroker_dash_t dash; + + cairo_bool_t has_bounds; + cairo_box_t bounds; +} cairo_stroker_t; + +static void +_cairo_stroker_limit (cairo_stroker_t *stroker, + const cairo_path_fixed_t *path, + const cairo_box_t *boxes, + int num_boxes) +{ + double dx, dy; + cairo_fixed_t fdx, fdy; + + stroker->has_bounds = TRUE; + _cairo_boxes_get_extents (boxes, num_boxes, &stroker->bounds); + + /* Extend the bounds in each direction to account for the maximum area + * we might generate trapezoids, to capture line segments that are outside + * of the bounds but which might generate rendering that's within bounds. + */ + + _cairo_stroke_style_max_distance_from_path (&stroker->style, path, + stroker->ctm, &dx, &dy); + + fdx = _cairo_fixed_from_double (dx); + fdy = _cairo_fixed_from_double (dy); + + stroker->bounds.p1.x -= fdx; + stroker->bounds.p2.x += fdx; + + stroker->bounds.p1.y -= fdy; + stroker->bounds.p2.y += fdy; +} + +static cairo_status_t +_cairo_stroker_init (cairo_stroker_t *stroker, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + const cairo_box_t *limits, + int num_limits) +{ + cairo_status_t status; + + stroker->style = *stroke_style; + stroker->ctm = ctm; + stroker->ctm_inverse = ctm_inverse; + stroker->tolerance = tolerance; + stroker->half_line_width = stroke_style->line_width / 2.0; + + /* To test whether we need to join two segments of a spline using + * a round-join or a bevel-join, we can inspect the angle between the + * two segments. If the difference between the chord distance + * (half-line-width times the cosine of the bisection angle) and the + * half-line-width itself is greater than tolerance then we need to + * inject a point. + */ + stroker->spline_cusp_tolerance = 1 - tolerance / stroker->half_line_width; + stroker->spline_cusp_tolerance *= stroker->spline_cusp_tolerance; + stroker->spline_cusp_tolerance *= 2; + stroker->spline_cusp_tolerance -= 1; + + stroker->ctm_determinant = _cairo_matrix_compute_determinant (stroker->ctm); + stroker->ctm_det_positive = stroker->ctm_determinant >= 0.0; + + status = _cairo_pen_init (&stroker->pen, + stroker->half_line_width, tolerance, ctm); + if (unlikely (status)) + return status; + + stroker->has_current_face = FALSE; + stroker->has_first_face = FALSE; + stroker->has_initial_sub_path = FALSE; + + _cairo_stroker_dash_init (&stroker->dash, stroke_style); + + stroker->add_external_edge = NULL; + + stroker->has_bounds = FALSE; + if (num_limits) + _cairo_stroker_limit (stroker, path, limits, num_limits); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_stroker_fini (cairo_stroker_t *stroker) +{ + _cairo_pen_fini (&stroker->pen); +} + +static void +_translate_point (cairo_point_t *point, const cairo_point_t *offset) +{ + point->x += offset->x; + point->y += offset->y; +} + +static int +_cairo_stroker_join_is_clockwise (const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + cairo_slope_t in_slope, out_slope; + + _cairo_slope_init (&in_slope, &in->point, &in->cw); + _cairo_slope_init (&out_slope, &out->point, &out->cw); + + return _cairo_slope_compare (&in_slope, &out_slope) < 0; +} + +/** + * _cairo_slope_compare_sgn: + * + * Return -1, 0 or 1 depending on the relative slopes of + * two lines. + **/ +static int +_cairo_slope_compare_sgn (double dx1, double dy1, double dx2, double dy2) +{ + double c = (dx1 * dy2 - dx2 * dy1); + + if (c > 0) return 1; + if (c < 0) return -1; + return 0; +} + +static inline int +_range_step (int i, int step, int max) +{ + i += step; + if (i < 0) + i = max - 1; + if (i >= max) + i = 0; + return i; +} + +/* + * Construct a fan around the midpoint using the vertices from pen between + * inpt and outpt. + */ +static cairo_status_t +_tessellate_fan (cairo_stroker_t *stroker, + const cairo_slope_t *in_vector, + const cairo_slope_t *out_vector, + const cairo_point_t *midpt, + const cairo_point_t *inpt, + const cairo_point_t *outpt, + cairo_bool_t clockwise) +{ + cairo_point_t stack_points[64], *points = stack_points; + cairo_pen_t *pen = &stroker->pen; + int start, stop, num_points = 0; + cairo_status_t status; + + if (stroker->has_bounds && + ! _cairo_box_contains_point (&stroker->bounds, midpt)) + goto BEVEL; + + assert (stroker->pen.num_vertices); + + if (clockwise) { + _cairo_pen_find_active_ccw_vertices (pen, + in_vector, out_vector, + &start, &stop); + if (stroker->add_external_edge) { + cairo_point_t last; + last = *inpt; + while (start != stop) { + cairo_point_t p = *midpt; + _translate_point (&p, &pen->vertices[start].point); + + status = stroker->add_external_edge (stroker->closure, + &last, &p); + if (unlikely (status)) + return status; + last = p; + + if (start-- == 0) + start += pen->num_vertices; + } + status = stroker->add_external_edge (stroker->closure, + &last, outpt); + } else { + if (start == stop) + goto BEVEL; + + num_points = stop - start; + if (num_points < 0) + num_points += pen->num_vertices; + num_points += 2; + if (num_points > ARRAY_LENGTH(stack_points)) { + points = _cairo_malloc_ab (num_points, sizeof (cairo_point_t)); + if (unlikely (points == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + points[0] = *inpt; + num_points = 1; + while (start != stop) { + points[num_points] = *midpt; + _translate_point (&points[num_points], &pen->vertices[start].point); + num_points++; + + if (start-- == 0) + start += pen->num_vertices; + } + points[num_points++] = *outpt; + } + } else { + _cairo_pen_find_active_cw_vertices (pen, + in_vector, out_vector, + &start, &stop); + if (stroker->add_external_edge) { + cairo_point_t last; + last = *inpt; + while (start != stop) { + cairo_point_t p = *midpt; + _translate_point (&p, &pen->vertices[start].point); + + status = stroker->add_external_edge (stroker->closure, + &p, &last); + if (unlikely (status)) + return status; + last = p; + + if (++start == pen->num_vertices) + start = 0; + } + status = stroker->add_external_edge (stroker->closure, + outpt, &last); + } else { + if (start == stop) + goto BEVEL; + + num_points = stop - start; + if (num_points < 0) + num_points += pen->num_vertices; + num_points += 2; + if (num_points > ARRAY_LENGTH(stack_points)) { + points = _cairo_malloc_ab (num_points, sizeof (cairo_point_t)); + if (unlikely (points == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + points[0] = *inpt; + num_points = 1; + while (start != stop) { + points[num_points] = *midpt; + _translate_point (&points[num_points], &pen->vertices[start].point); + num_points++; + + if (++start == pen->num_vertices) + start = 0; + } + points[num_points++] = *outpt; + } + } + + if (num_points) { + status = stroker->add_triangle_fan (stroker->closure, + midpt, points, num_points); + } + + if (points != stack_points) + free (points); + + return status; + +BEVEL: + /* Ensure a leak free connection... */ + if (stroker->add_external_edge != NULL) { + if (clockwise) + return stroker->add_external_edge (stroker->closure, inpt, outpt); + else + return stroker->add_external_edge (stroker->closure, outpt, inpt); + } else { + stack_points[0] = *midpt; + stack_points[1] = *inpt; + stack_points[2] = *outpt; + return stroker->add_triangle (stroker->closure, stack_points); + } +} + +static cairo_status_t +_cairo_stroker_join (cairo_stroker_t *stroker, + const cairo_stroke_face_t *in, + const cairo_stroke_face_t *out) +{ + int clockwise = _cairo_stroker_join_is_clockwise (out, in); + const cairo_point_t *inpt, *outpt; + cairo_point_t points[4]; + cairo_status_t status; + + if (in->cw.x == out->cw.x && in->cw.y == out->cw.y && + in->ccw.x == out->ccw.x && in->ccw.y == out->ccw.y) + { + return CAIRO_STATUS_SUCCESS; + } + + if (clockwise) { + if (stroker->add_external_edge != NULL) { + status = stroker->add_external_edge (stroker->closure, + &out->cw, &in->point); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &in->point, &in->cw); + if (unlikely (status)) + return status; + } + + inpt = &in->ccw; + outpt = &out->ccw; + } else { + if (stroker->add_external_edge != NULL) { + status = stroker->add_external_edge (stroker->closure, + &in->ccw, &in->point); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &in->point, &out->ccw); + if (unlikely (status)) + return status; + } + + inpt = &in->cw; + outpt = &out->cw; + } + + switch (stroker->style.line_join) { + case CAIRO_LINE_JOIN_ROUND: + /* construct a fan around the common midpoint */ + return _tessellate_fan (stroker, + &in->dev_vector, + &out->dev_vector, + &in->point, inpt, outpt, + clockwise); + + case CAIRO_LINE_JOIN_MITER: + default: { + /* dot product of incoming slope vector with outgoing slope vector */ + double in_dot_out = -in->usr_vector.x * out->usr_vector.x + + -in->usr_vector.y * out->usr_vector.y; + double ml = stroker->style.miter_limit; + + /* Check the miter limit -- lines meeting at an acute angle + * can generate long miters, the limit converts them to bevel + * + * Consider the miter join formed when two line segments + * meet at an angle psi: + * + * /.\ + * /. .\ + * /./ \.\ + * /./psi\.\ + * + * We can zoom in on the right half of that to see: + * + * |\ + * | \ psi/2 + * | \ + * | \ + * | \ + * | \ + * miter \ + * length \ + * | \ + * | .\ + * | . \ + * |. line \ + * \ width \ + * \ \ + * + * + * The right triangle in that figure, (the line-width side is + * shown faintly with three '.' characters), gives us the + * following expression relating miter length, angle and line + * width: + * + * 1 /sin (psi/2) = miter_length / line_width + * + * The right-hand side of this relationship is the same ratio + * in which the miter limit (ml) is expressed. We want to know + * when the miter length is within the miter limit. That is + * when the following condition holds: + * + * 1/sin(psi/2) <= ml + * 1 <= ml sin(psi/2) + * 1 <= ml² sin²(psi/2) + * 2 <= ml² 2 sin²(psi/2) + * 2·sin²(psi/2) = 1-cos(psi) + * 2 <= ml² (1-cos(psi)) + * + * in · out = |in| |out| cos (psi) + * + * in and out are both unit vectors, so: + * + * in · out = cos (psi) + * + * 2 <= ml² (1 - in · out) + * + */ + if (2 <= ml * ml * (1 - in_dot_out)) { + double x1, y1, x2, y2; + double mx, my; + double dx1, dx2, dy1, dy2; + double ix, iy; + double fdx1, fdy1, fdx2, fdy2; + double mdx, mdy; + + /* + * we've got the points already transformed to device + * space, but need to do some computation with them and + * also need to transform the slope from user space to + * device space + */ + /* outer point of incoming line face */ + x1 = _cairo_fixed_to_double (inpt->x); + y1 = _cairo_fixed_to_double (inpt->y); + dx1 = in->usr_vector.x; + dy1 = in->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx1, &dy1); + + /* outer point of outgoing line face */ + x2 = _cairo_fixed_to_double (outpt->x); + y2 = _cairo_fixed_to_double (outpt->y); + dx2 = out->usr_vector.x; + dy2 = out->usr_vector.y; + cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); + + /* + * Compute the location of the outer corner of the miter. + * That's pretty easy -- just the intersection of the two + * outer edges. We've got slopes and points on each + * of those edges. Compute my directly, then compute + * mx by using the edge with the larger dy; that avoids + * dividing by values close to zero. + */ + my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / + (dx1 * dy2 - dx2 * dy1)); + if (fabs (dy1) >= fabs (dy2)) + mx = (my - y1) * dx1 / dy1 + x1; + else + mx = (my - y2) * dx2 / dy2 + x2; + + /* + * When the two outer edges are nearly parallel, slight + * perturbations in the position of the outer points of the lines + * caused by representing them in fixed point form can cause the + * intersection point of the miter to move a large amount. If + * that moves the miter intersection from between the two faces, + * then draw a bevel instead. + */ + + ix = _cairo_fixed_to_double (in->point.x); + iy = _cairo_fixed_to_double (in->point.y); + + /* slope of one face */ + fdx1 = x1 - ix; fdy1 = y1 - iy; + + /* slope of the other face */ + fdx2 = x2 - ix; fdy2 = y2 - iy; + + /* slope from the intersection to the miter point */ + mdx = mx - ix; mdy = my - iy; + + /* + * Make sure the miter point line lies between the two + * faces by comparing the slopes + */ + if (_cairo_slope_compare_sgn (fdx1, fdy1, mdx, mdy) != + _cairo_slope_compare_sgn (fdx2, fdy2, mdx, mdy)) + { + if (stroker->add_external_edge != NULL) { + points[0].x = _cairo_fixed_from_double (mx); + points[0].y = _cairo_fixed_from_double (my); + + if (clockwise) { + status = stroker->add_external_edge (stroker->closure, + inpt, &points[0]); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &points[0], outpt); + if (unlikely (status)) + return status; + } else { + status = stroker->add_external_edge (stroker->closure, + outpt, &points[0]); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &points[0], inpt); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; + } else { + points[0] = in->point; + points[1] = *inpt; + points[2].x = _cairo_fixed_from_double (mx); + points[2].y = _cairo_fixed_from_double (my); + points[3] = *outpt; + + return stroker->add_convex_quad (stroker->closure, points); + } + } + } + } + + /* fall through ... */ + + case CAIRO_LINE_JOIN_BEVEL: + if (stroker->add_external_edge != NULL) { + if (clockwise) { + return stroker->add_external_edge (stroker->closure, + inpt, outpt); + } else { + return stroker->add_external_edge (stroker->closure, + outpt, inpt); + } + } else { + points[0] = in->point; + points[1] = *inpt; + points[2] = *outpt; + + return stroker->add_triangle (stroker->closure, points); + } + } +} + +static cairo_status_t +_cairo_stroker_add_cap (cairo_stroker_t *stroker, + const cairo_stroke_face_t *f) +{ + switch (stroker->style.line_cap) { + case CAIRO_LINE_CAP_ROUND: { + cairo_slope_t slope; + + slope.dx = -f->dev_vector.dx; + slope.dy = -f->dev_vector.dy; + + return _tessellate_fan (stroker, + &f->dev_vector, + &slope, + &f->point, &f->cw, &f->ccw, + FALSE); + + } + + case CAIRO_LINE_CAP_SQUARE: { + double dx, dy; + cairo_slope_t fvector; + cairo_point_t quad[4]; + + dx = f->usr_vector.x; + dy = f->usr_vector.y; + dx *= stroker->half_line_width; + dy *= stroker->half_line_width; + cairo_matrix_transform_distance (stroker->ctm, &dx, &dy); + fvector.dx = _cairo_fixed_from_double (dx); + fvector.dy = _cairo_fixed_from_double (dy); + + quad[0] = f->ccw; + quad[1].x = f->ccw.x + fvector.dx; + quad[1].y = f->ccw.y + fvector.dy; + quad[2].x = f->cw.x + fvector.dx; + quad[2].y = f->cw.y + fvector.dy; + quad[3] = f->cw; + + if (stroker->add_external_edge != NULL) { + cairo_status_t status; + + status = stroker->add_external_edge (stroker->closure, + &quad[0], &quad[1]); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &quad[1], &quad[2]); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &quad[2], &quad[3]); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; + } else { + return stroker->add_convex_quad (stroker->closure, quad); + } + } + + case CAIRO_LINE_CAP_BUTT: + default: + if (stroker->add_external_edge != NULL) { + return stroker->add_external_edge (stroker->closure, + &f->ccw, &f->cw); + } else { + return CAIRO_STATUS_SUCCESS; + } + } +} + +static cairo_status_t +_cairo_stroker_add_leading_cap (cairo_stroker_t *stroker, + const cairo_stroke_face_t *face) +{ + cairo_stroke_face_t reversed; + cairo_point_t t; + + reversed = *face; + + /* The initial cap needs an outward facing vector. Reverse everything */ + reversed.usr_vector.x = -reversed.usr_vector.x; + reversed.usr_vector.y = -reversed.usr_vector.y; + reversed.dev_vector.dx = -reversed.dev_vector.dx; + reversed.dev_vector.dy = -reversed.dev_vector.dy; + t = reversed.cw; + reversed.cw = reversed.ccw; + reversed.ccw = t; + + return _cairo_stroker_add_cap (stroker, &reversed); +} + +static cairo_status_t +_cairo_stroker_add_trailing_cap (cairo_stroker_t *stroker, + const cairo_stroke_face_t *face) +{ + return _cairo_stroker_add_cap (stroker, face); +} + +static inline cairo_bool_t +_compute_normalized_device_slope (double *dx, double *dy, + const cairo_matrix_t *ctm_inverse, + double *mag_out) +{ + double dx0 = *dx, dy0 = *dy; + double mag; + + cairo_matrix_transform_distance (ctm_inverse, &dx0, &dy0); + + if (dx0 == 0.0 && dy0 == 0.0) { + if (mag_out) + *mag_out = 0.0; + return FALSE; + } + + if (dx0 == 0.0) { + *dx = 0.0; + if (dy0 > 0.0) { + mag = dy0; + *dy = 1.0; + } else { + mag = -dy0; + *dy = -1.0; + } + } else if (dy0 == 0.0) { + *dy = 0.0; + if (dx0 > 0.0) { + mag = dx0; + *dx = 1.0; + } else { + mag = -dx0; + *dx = -1.0; + } + } else { + mag = hypot (dx0, dy0); + *dx = dx0 / mag; + *dy = dy0 / mag; + } + + if (mag_out) + *mag_out = mag; + + return TRUE; +} + +static void +_compute_face (const cairo_point_t *point, + const cairo_slope_t *dev_slope, + double slope_dx, + double slope_dy, + cairo_stroker_t *stroker, + cairo_stroke_face_t *face) +{ + double face_dx, face_dy; + cairo_point_t offset_ccw, offset_cw; + + /* + * rotate to get a line_width/2 vector along the face, note that + * the vector must be rotated the right direction in device space, + * but by 90° in user space. So, the rotation depends on + * whether the ctm reflects or not, and that can be determined + * by looking at the determinant of the matrix. + */ + if (stroker->ctm_det_positive) + { + face_dx = - slope_dy * stroker->half_line_width; + face_dy = slope_dx * stroker->half_line_width; + } + else + { + face_dx = slope_dy * stroker->half_line_width; + face_dy = - slope_dx * stroker->half_line_width; + } + + /* back to device space */ + cairo_matrix_transform_distance (stroker->ctm, &face_dx, &face_dy); + + offset_ccw.x = _cairo_fixed_from_double (face_dx); + offset_ccw.y = _cairo_fixed_from_double (face_dy); + offset_cw.x = -offset_ccw.x; + offset_cw.y = -offset_ccw.y; + + face->ccw = *point; + _translate_point (&face->ccw, &offset_ccw); + + face->point = *point; + + face->cw = *point; + _translate_point (&face->cw, &offset_cw); + + face->usr_vector.x = slope_dx; + face->usr_vector.y = slope_dy; + + face->dev_vector = *dev_slope; +} + +static cairo_status_t +_cairo_stroker_add_caps (cairo_stroker_t *stroker) +{ + cairo_status_t status; + + /* check for a degenerative sub_path */ + if (stroker->has_initial_sub_path + && ! stroker->has_first_face + && ! stroker->has_current_face + && stroker->style.line_cap == CAIRO_LINE_CAP_ROUND) + { + /* pick an arbitrary slope to use */ + double dx = 1.0, dy = 0.0; + cairo_slope_t slope = { CAIRO_FIXED_ONE, 0 }; + cairo_stroke_face_t face; + + _compute_normalized_device_slope (&dx, &dy, + stroker->ctm_inverse, NULL); + + /* arbitrarily choose first_point + * first_point and current_point should be the same */ + _compute_face (&stroker->first_point, &slope, dx, dy, stroker, &face); + + status = _cairo_stroker_add_leading_cap (stroker, &face); + if (unlikely (status)) + return status; + + status = _cairo_stroker_add_trailing_cap (stroker, &face); + if (unlikely (status)) + return status; + } + + if (stroker->has_first_face) { + status = _cairo_stroker_add_leading_cap (stroker, + &stroker->first_face); + if (unlikely (status)) + return status; + } + + if (stroker->has_current_face) { + status = _cairo_stroker_add_trailing_cap (stroker, + &stroker->current_face); + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_stroker_add_sub_edge (cairo_stroker_t *stroker, + const cairo_point_t *p1, + const cairo_point_t *p2, + cairo_slope_t *dev_slope, + double slope_dx, double slope_dy, + cairo_stroke_face_t *start, + cairo_stroke_face_t *end) +{ + _compute_face (p1, dev_slope, slope_dx, slope_dy, stroker, start); + *end = *start; + + if (p1->x == p2->x && p1->y == p2->y) + return CAIRO_STATUS_SUCCESS; + + end->point = *p2; + end->ccw.x += p2->x - p1->x; + end->ccw.y += p2->y - p1->y; + end->cw.x += p2->x - p1->x; + end->cw.y += p2->y - p1->y; + + if (stroker->add_external_edge != NULL) { + cairo_status_t status; + + status = stroker->add_external_edge (stroker->closure, + &end->cw, &start->cw); + if (unlikely (status)) + return status; + + status = stroker->add_external_edge (stroker->closure, + &start->ccw, &end->ccw); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; + } else { + cairo_point_t quad[4]; + + quad[0] = start->cw; + quad[1] = end->cw; + quad[2] = end->ccw; + quad[3] = start->ccw; + + return stroker->add_convex_quad (stroker->closure, quad); + } +} + +static cairo_status_t +_cairo_stroker_move_to (void *closure, + const cairo_point_t *point) +{ + cairo_stroker_t *stroker = closure; + cairo_status_t status; + + /* reset the dash pattern for new sub paths */ + _cairo_stroker_dash_start (&stroker->dash); + + /* Cap the start and end of the previous sub path as needed */ + status = _cairo_stroker_add_caps (stroker); + if (unlikely (status)) + return status; + + stroker->first_point = *point; + stroker->current_point = *point; + + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + stroker->has_initial_sub_path = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_stroker_line_to (void *closure, + const cairo_point_t *point) +{ + cairo_stroker_t *stroker = closure; + cairo_stroke_face_t start, end; + cairo_point_t *p1 = &stroker->current_point; + cairo_slope_t dev_slope; + double slope_dx, slope_dy; + cairo_status_t status; + + stroker->has_initial_sub_path = TRUE; + + if (p1->x == point->x && p1->y == point->y) + return CAIRO_STATUS_SUCCESS; + + _cairo_slope_init (&dev_slope, p1, point); + slope_dx = _cairo_fixed_to_double (point->x - p1->x); + slope_dy = _cairo_fixed_to_double (point->y - p1->y); + _compute_normalized_device_slope (&slope_dx, &slope_dy, + stroker->ctm_inverse, NULL); + + status = _cairo_stroker_add_sub_edge (stroker, + p1, point, + &dev_slope, + slope_dx, slope_dy, + &start, &end); + if (unlikely (status)) + return status; + + if (stroker->has_current_face) { + /* Join with final face from previous segment */ + status = _cairo_stroker_join (stroker, + &stroker->current_face, + &start); + if (unlikely (status)) + return status; + } else if (! stroker->has_first_face) { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = start; + stroker->has_first_face = TRUE; + } + stroker->current_face = end; + stroker->has_current_face = TRUE; + + stroker->current_point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_stroker_spline_to (void *closure, + const cairo_point_t *point, + const cairo_slope_t *tangent) +{ + cairo_stroker_t *stroker = closure; + cairo_stroke_face_t new_face; + double slope_dx, slope_dy; + cairo_point_t points[3]; + cairo_point_t intersect_point; + + stroker->has_initial_sub_path = TRUE; + + if (stroker->current_point.x == point->x && + stroker->current_point.y == point->y) + return CAIRO_STATUS_SUCCESS; + + slope_dx = _cairo_fixed_to_double (tangent->dx); + slope_dy = _cairo_fixed_to_double (tangent->dy); + + if (! _compute_normalized_device_slope (&slope_dx, &slope_dy, + stroker->ctm_inverse, NULL)) + return CAIRO_STATUS_SUCCESS; + + _compute_face (point, tangent, + slope_dx, slope_dy, + stroker, &new_face); + + assert (stroker->has_current_face); + + if ((new_face.dev_slope.x * stroker->current_face.dev_slope.x + + new_face.dev_slope.y * stroker->current_face.dev_slope.y) < stroker->spline_cusp_tolerance) { + + const cairo_point_t *inpt, *outpt; + int clockwise = _cairo_stroker_join_is_clockwise (&new_face, + &stroker->current_face); + + if (clockwise) { + inpt = &stroker->current_face.cw; + outpt = &new_face.cw; + } else { + inpt = &stroker->current_face.ccw; + outpt = &new_face.ccw; + } + + _tessellate_fan (stroker, + &stroker->current_face.dev_vector, + &new_face.dev_vector, + &stroker->current_face.point, + inpt, outpt, + clockwise); + } + + if (_slow_segment_intersection (&stroker->current_face.cw, + &stroker->current_face.ccw, + &new_face.cw, + &new_face.ccw, + &intersect_point)) { + points[0] = stroker->current_face.ccw; + points[1] = new_face.ccw; + points[2] = intersect_point; + stroker->add_triangle (stroker->closure, points); + + points[0] = stroker->current_face.cw; + points[1] = new_face.cw; + stroker->add_triangle (stroker->closure, points); + } else { + points[0] = stroker->current_face.ccw; + points[1] = stroker->current_face.cw; + points[2] = new_face.cw; + stroker->add_triangle (stroker->closure, points); + + points[0] = stroker->current_face.ccw; + points[1] = new_face.cw; + points[2] = new_face.ccw; + stroker->add_triangle (stroker->closure, points); + } + + stroker->current_face = new_face; + stroker->has_current_face = TRUE; + stroker->current_point = *point; + + return CAIRO_STATUS_SUCCESS; +} + +/* + * Dashed lines. Cap each dash end, join around turns when on + */ +static cairo_status_t +_cairo_stroker_line_to_dashed (void *closure, + const cairo_point_t *p2) +{ + cairo_stroker_t *stroker = closure; + double mag, remain, step_length = 0; + double slope_dx, slope_dy; + double dx2, dy2; + cairo_stroke_face_t sub_start, sub_end; + cairo_point_t *p1 = &stroker->current_point; + cairo_slope_t dev_slope; + cairo_line_t segment; + cairo_bool_t fully_in_bounds; + cairo_status_t status; + + stroker->has_initial_sub_path = stroker->dash.dash_starts_on; + + if (p1->x == p2->x && p1->y == p2->y) + return CAIRO_STATUS_SUCCESS; + + fully_in_bounds = TRUE; + if (stroker->has_bounds && + (! _cairo_box_contains_point (&stroker->bounds, p1) || + ! _cairo_box_contains_point (&stroker->bounds, p2))) + { + fully_in_bounds = FALSE; + } + + _cairo_slope_init (&dev_slope, p1, p2); + + slope_dx = _cairo_fixed_to_double (p2->x - p1->x); + slope_dy = _cairo_fixed_to_double (p2->y - p1->y); + + if (! _compute_normalized_device_slope (&slope_dx, &slope_dy, + stroker->ctm_inverse, &mag)) + { + return CAIRO_STATUS_SUCCESS; + } + + remain = mag; + segment.p1 = *p1; + while (remain) { + step_length = MIN (stroker->dash.dash_remain, remain); + remain -= step_length; + dx2 = slope_dx * (mag - remain); + dy2 = slope_dy * (mag - remain); + cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); + segment.p2.x = _cairo_fixed_from_double (dx2) + p1->x; + segment.p2.y = _cairo_fixed_from_double (dy2) + p1->y; + + if (stroker->dash.dash_on && + (fully_in_bounds || + (! stroker->has_first_face && stroker->dash.dash_starts_on) || + _cairo_box_intersects_line_segment (&stroker->bounds, &segment))) + { + status = _cairo_stroker_add_sub_edge (stroker, + &segment.p1, &segment.p2, + &dev_slope, + slope_dx, slope_dy, + &sub_start, &sub_end); + if (unlikely (status)) + return status; + + if (stroker->has_current_face) + { + /* Join with final face from previous segment */ + status = _cairo_stroker_join (stroker, + &stroker->current_face, + &sub_start); + if (unlikely (status)) + return status; + + stroker->has_current_face = FALSE; + } + else if (! stroker->has_first_face && + stroker->dash.dash_starts_on) + { + /* Save sub path's first face in case needed for closing join */ + stroker->first_face = sub_start; + stroker->has_first_face = TRUE; + } + else + { + /* Cap dash start if not connecting to a previous segment */ + status = _cairo_stroker_add_leading_cap (stroker, &sub_start); + if (unlikely (status)) + return status; + } + + if (remain) { + /* Cap dash end if not at end of segment */ + status = _cairo_stroker_add_trailing_cap (stroker, &sub_end); + if (unlikely (status)) + return status; + } else { + stroker->current_face = sub_end; + stroker->has_current_face = TRUE; + } + } else { + if (stroker->has_current_face) { + /* Cap final face from previous segment */ + status = _cairo_stroker_add_trailing_cap (stroker, + &stroker->current_face); + if (unlikely (status)) + return status; + + stroker->has_current_face = FALSE; + } + } + + _cairo_stroker_dash_step (&stroker->dash, step_length); + segment.p1 = segment.p2; + } + + if (stroker->dash.dash_on && ! stroker->has_current_face) { + /* This segment ends on a transition to dash_on, compute a new face + * and add cap for the beginning of the next dash_on step. + * + * Note: this will create a degenerate cap if this is not the last line + * in the path. Whether this behaviour is desirable or not is debatable. + * On one side these degenerate caps can not be reproduced with regular + * path stroking. + * On the other hand, Acroread 7 also produces the degenerate caps. + */ + _compute_face (p2, &dev_slope, + slope_dx, slope_dy, + stroker, + &stroker->current_face); + + status = _cairo_stroker_add_leading_cap (stroker, + &stroker->current_face); + if (unlikely (status)) + return status; + + stroker->has_current_face = TRUE; + } + + stroker->current_point = *p2; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_stroker_curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + cairo_stroker_t *stroker = closure; + cairo_spline_t spline; + cairo_line_join_t line_join_save; + cairo_stroke_face_t face; + double slope_dx, slope_dy; + cairo_spline_add_point_func_t line_to; + cairo_spline_add_point_func_t spline_to; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + line_to = stroker->dash.dashed ? + (cairo_spline_add_point_func_t) _cairo_stroker_line_to_dashed : + (cairo_spline_add_point_func_t) _cairo_stroker_line_to; + + /* spline_to is only capable of rendering non-degenerate splines. */ + spline_to = stroker->dash.dashed ? + (cairo_spline_add_point_func_t) _cairo_stroker_line_to_dashed : + (cairo_spline_add_point_func_t) _cairo_stroker_spline_to; + + if (! _cairo_spline_init (&spline, + spline_to, + stroker, + &stroker->current_point, b, c, d)) + { + cairo_slope_t fallback_slope; + _cairo_slope_init (&fallback_slope, &stroker->current_point, d); + return line_to (closure, d, &fallback_slope); + } + + /* If the line width is so small that the pen is reduced to a + single point, then we have nothing to do. */ + if (stroker->pen.num_vertices <= 1) + return CAIRO_STATUS_SUCCESS; + + /* Compute the initial face */ + if (! stroker->dash.dashed || stroker->dash.dash_on) { + slope_dx = _cairo_fixed_to_double (spline.initial_slope.dx); + slope_dy = _cairo_fixed_to_double (spline.initial_slope.dy); + if (_compute_normalized_device_slope (&slope_dx, &slope_dy, + stroker->ctm_inverse, NULL)) + { + _compute_face (&stroker->current_point, + &spline.initial_slope, + slope_dx, slope_dy, + stroker, &face); + } + if (stroker->has_current_face) { + status = _cairo_stroker_join (stroker, + &stroker->current_face, &face); + if (unlikely (status)) + return status; + } else if (! stroker->has_first_face) { + stroker->first_face = face; + stroker->has_first_face = TRUE; + } + + stroker->current_face = face; + stroker->has_current_face = TRUE; + } + + /* Temporarily modify the stroker to use round joins to guarantee + * smooth stroked curves. */ + line_join_save = stroker->style.line_join; + stroker->style.line_join = CAIRO_LINE_JOIN_ROUND; + + status = _cairo_spline_decompose (&spline, stroker->tolerance); + if (unlikely (status)) + return status; + + /* And join the final face */ + if (! stroker->dash.dashed || stroker->dash.dash_on) { + slope_dx = _cairo_fixed_to_double (spline.final_slope.dx); + slope_dy = _cairo_fixed_to_double (spline.final_slope.dy); + if (_compute_normalized_device_slope (&slope_dx, &slope_dy, + stroker->ctm_inverse, NULL)) + { + _compute_face (&stroker->current_point, + &spline.final_slope, + slope_dx, slope_dy, + stroker, &face); + } + + status = _cairo_stroker_join (stroker, &stroker->current_face, &face); + if (unlikely (status)) + return status; + + stroker->current_face = face; + } + + stroker->style.line_join = line_join_save; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_stroker_close_path (void *closure) +{ + cairo_stroker_t *stroker = closure; + cairo_status_t status; + + if (stroker->dash.dashed) + status = _cairo_stroker_line_to_dashed (stroker, &stroker->first_point); + else + status = _cairo_stroker_line_to (stroker, &stroker->first_point); + if (unlikely (status)) + return status; + + if (stroker->has_first_face && stroker->has_current_face) { + /* Join first and final faces of sub path */ + status = _cairo_stroker_join (stroker, + &stroker->current_face, + &stroker->first_face); + if (unlikely (status)) + return status; + } else { + /* Cap the start and end of the sub path as needed */ + status = _cairo_stroker_add_caps (stroker); + if (unlikely (status)) + return status; + } + + stroker->has_initial_sub_path = FALSE; + stroker->has_first_face = FALSE; + stroker->has_current_face = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_path_fixed_stroke_to_shaper (cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_status_t (*add_triangle) (void *closure, + const cairo_point_t triangle[3]), + cairo_status_t (*add_triangle_fan) (void *closure, + const cairo_point_t *midpt, + const cairo_point_t *points, + int npoints), + cairo_status_t (*add_convex_quad) (void *closure, + const cairo_point_t quad[4]), + void *closure) +{ + cairo_stroker_t stroker; + cairo_status_t status; + + status = _cairo_stroker_init (&stroker, path, stroke_style, + ctm, ctm_inverse, tolerance, + NULL, 0); + if (unlikely (status)) + return status; + + stroker.add_triangle = add_triangle; + stroker.add_triangle_fan = add_triangle_fan; + stroker.add_convex_quad = add_convex_quad; + stroker.closure = closure; + + status = _cairo_path_fixed_interpret (path, + _cairo_stroker_move_to, + stroker.dash.dashed ? + _cairo_stroker_line_to_dashed : + _cairo_stroker_line_to, + _cairo_stroker_curve_to, + _cairo_stroker_close_path, + &stroker); + + if (unlikely (status)) + goto BAIL; + + /* Cap the start and end of the final sub path as needed */ + status = _cairo_stroker_add_caps (&stroker); + +BAIL: + _cairo_stroker_fini (&stroker); + + return status; +} + +cairo_status_t +_cairo_path_fixed_stroke_dashed_to_polygon (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_polygon_t *polygon) +{ + cairo_stroker_t stroker; + cairo_status_t status; + + status = _cairo_stroker_init (&stroker, path, stroke_style, + ctm, ctm_inverse, tolerance, + polygon->limits, polygon->num_limits); + if (unlikely (status)) + return status; + + stroker.add_external_edge = _cairo_polygon_add_external_edge, + stroker.closure = polygon; + + status = _cairo_path_fixed_interpret (path, + _cairo_stroker_move_to, + stroker.dash.dashed ? + _cairo_stroker_line_to_dashed : + _cairo_stroker_line_to, + _cairo_stroker_curve_to, + _cairo_stroker_close_path, + &stroker); + + if (unlikely (status)) + goto BAIL; + + /* Cap the start and end of the final sub path as needed */ + status = _cairo_stroker_add_caps (&stroker); + +BAIL: + _cairo_stroker_fini (&stroker); + + return status; +} + +cairo_int_status_t +_cairo_path_fixed_stroke_polygon_to_traps (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_traps_t *traps) +{ + cairo_int_status_t status; + cairo_polygon_t polygon; + + _cairo_polygon_init (&polygon, traps->limits, traps->num_limits); + status = _cairo_path_fixed_stroke_to_polygon (path, + stroke_style, + ctm, + ctm_inverse, + tolerance, + &polygon); + if (unlikely (status)) + goto BAIL; + + status = _cairo_polygon_status (&polygon); + if (unlikely (status)) + goto BAIL; + + status = _cairo_bentley_ottmann_tessellate_polygon (traps, &polygon, + CAIRO_FILL_RULE_WINDING); + +BAIL: + _cairo_polygon_fini (&polygon); + + return status; +} diff --git a/src/cairo-path.c b/src/cairo-path.c new file mode 100644 index 000000000..43cd175a3 --- /dev/null +++ b/src/cairo-path.c @@ -0,0 +1,479 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-private.h" +#include "cairo-backend-private.h" +#include "cairo-error-private.h" +#include "cairo-path-private.h" +#include "cairo-path-fixed-private.h" + +/** + * SECTION:cairo-paths + * @Title: Paths + * @Short_Description: Creating paths and manipulating path data + * + * Paths are the most basic drawing tools and are primarily used to implicitly + * generate simple masks. + **/ + +static const cairo_path_t _cairo_path_nil = { CAIRO_STATUS_NO_MEMORY, NULL, 0 }; + +/* Closure for path interpretation. */ +typedef struct cairo_path_count { + int count; +} cpc_t; + +static cairo_status_t +_cpc_move_to (void *closure, + const cairo_point_t *point) +{ + cpc_t *cpc = closure; + + cpc->count += 2; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cpc_line_to (void *closure, + const cairo_point_t *point) +{ + cpc_t *cpc = closure; + + cpc->count += 2; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cpc_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + cpc_t *cpc = closure; + + cpc->count += 4; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cpc_close_path (void *closure) +{ + cpc_t *cpc = closure; + + cpc->count += 1; + + return CAIRO_STATUS_SUCCESS; +} + +static int +_cairo_path_count (cairo_path_t *path, + cairo_path_fixed_t *path_fixed, + double tolerance, + cairo_bool_t flatten) +{ + cairo_status_t status; + cpc_t cpc; + + cpc.count = 0; + + if (flatten) { + status = _cairo_path_fixed_interpret_flat (path_fixed, + _cpc_move_to, + _cpc_line_to, + _cpc_close_path, + &cpc, + tolerance); + } else { + status = _cairo_path_fixed_interpret (path_fixed, + _cpc_move_to, + _cpc_line_to, + _cpc_curve_to, + _cpc_close_path, + &cpc); + } + + if (unlikely (status)) + return -1; + + return cpc.count; +} + +/* Closure for path interpretation. */ +typedef struct cairo_path_populate { + cairo_path_data_t *data; + cairo_t *cr; +} cpp_t; + +static cairo_status_t +_cpp_move_to (void *closure, + const cairo_point_t *point) +{ + cpp_t *cpp = closure; + cairo_path_data_t *data = cpp->data; + double x, y; + + x = _cairo_fixed_to_double (point->x); + y = _cairo_fixed_to_double (point->y); + + _cairo_backend_to_user (cpp->cr, &x, &y); + + data->header.type = CAIRO_PATH_MOVE_TO; + data->header.length = 2; + + /* We index from 1 to leave room for data->header */ + data[1].point.x = x; + data[1].point.y = y; + + cpp->data += data->header.length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cpp_line_to (void *closure, + const cairo_point_t *point) +{ + cpp_t *cpp = closure; + cairo_path_data_t *data = cpp->data; + double x, y; + + x = _cairo_fixed_to_double (point->x); + y = _cairo_fixed_to_double (point->y); + + _cairo_backend_to_user (cpp->cr, &x, &y); + + data->header.type = CAIRO_PATH_LINE_TO; + data->header.length = 2; + + /* We index from 1 to leave room for data->header */ + data[1].point.x = x; + data[1].point.y = y; + + cpp->data += data->header.length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cpp_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + cpp_t *cpp = closure; + cairo_path_data_t *data = cpp->data; + double x1, y1; + double x2, y2; + double x3, y3; + + x1 = _cairo_fixed_to_double (p1->x); + y1 = _cairo_fixed_to_double (p1->y); + _cairo_backend_to_user (cpp->cr, &x1, &y1); + + x2 = _cairo_fixed_to_double (p2->x); + y2 = _cairo_fixed_to_double (p2->y); + _cairo_backend_to_user (cpp->cr, &x2, &y2); + + x3 = _cairo_fixed_to_double (p3->x); + y3 = _cairo_fixed_to_double (p3->y); + _cairo_backend_to_user (cpp->cr, &x3, &y3); + + data->header.type = CAIRO_PATH_CURVE_TO; + data->header.length = 4; + + /* We index from 1 to leave room for data->header */ + data[1].point.x = x1; + data[1].point.y = y1; + + data[2].point.x = x2; + data[2].point.y = y2; + + data[3].point.x = x3; + data[3].point.y = y3; + + cpp->data += data->header.length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cpp_close_path (void *closure) +{ + cpp_t *cpp = closure; + cairo_path_data_t *data = cpp->data; + + data->header.type = CAIRO_PATH_CLOSE_PATH; + data->header.length = 1; + + cpp->data += data->header.length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_populate (cairo_path_t *path, + cairo_path_fixed_t *path_fixed, + cairo_t *cr, + cairo_bool_t flatten) +{ + cairo_status_t status; + cpp_t cpp; + + cpp.data = path->data; + cpp.cr = cr; + + if (flatten) { + status = _cairo_path_fixed_interpret_flat (path_fixed, + _cpp_move_to, + _cpp_line_to, + _cpp_close_path, + &cpp, + cairo_get_tolerance (cr)); + } else { + status = _cairo_path_fixed_interpret (path_fixed, + _cpp_move_to, + _cpp_line_to, + _cpp_curve_to, + _cpp_close_path, + &cpp); + } + + if (unlikely (status)) + return status; + + /* Sanity check the count */ + assert (cpp.data - path->data == path->num_data); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_path_t * +_cairo_path_create_in_error (cairo_status_t status) +{ + cairo_path_t *path; + + /* special case NO_MEMORY so as to avoid allocations */ + if (status == CAIRO_STATUS_NO_MEMORY) + return (cairo_path_t*) &_cairo_path_nil; + + path = malloc (sizeof (cairo_path_t)); + if (unlikely (path == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_path_t*) &_cairo_path_nil; + } + + path->num_data = 0; + path->data = NULL; + path->status = status; + + return path; +} + +static cairo_path_t * +_cairo_path_create_internal (cairo_path_fixed_t *path_fixed, + cairo_t *cr, + cairo_bool_t flatten) +{ + cairo_path_t *path; + + path = malloc (sizeof (cairo_path_t)); + if (unlikely (path == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_path_t*) &_cairo_path_nil; + } + + path->num_data = _cairo_path_count (path, path_fixed, + cairo_get_tolerance (cr), + flatten); + if (path->num_data < 0) { + free (path); + return (cairo_path_t*) &_cairo_path_nil; + } + + if (path->num_data) { + path->data = _cairo_malloc_ab (path->num_data, + sizeof (cairo_path_data_t)); + if (unlikely (path->data == NULL)) { + free (path); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_path_t*) &_cairo_path_nil; + } + + path->status = _cairo_path_populate (path, path_fixed, cr, flatten); + } else { + path->data = NULL; + path->status = CAIRO_STATUS_SUCCESS; + } + + return path; +} + +/** + * cairo_path_destroy: + * @path: a path previously returned by either cairo_copy_path() or + * cairo_copy_path_flat(). + * + * Immediately releases all memory associated with @path. After a call + * to cairo_path_destroy() the @path pointer is no longer valid and + * should not be used further. + * + * Note: cairo_path_destroy() should only be called with a + * pointer to a #cairo_path_t returned by a cairo function. Any path + * that is created manually (ie. outside of cairo) should be destroyed + * manually as well. + * + * Since: 1.0 + **/ +void +cairo_path_destroy (cairo_path_t *path) +{ + if (path == NULL || path == &_cairo_path_nil) + return; + + free (path->data); + + free (path); +} +slim_hidden_def (cairo_path_destroy); + +/** + * _cairo_path_create: + * @path: a fixed-point, device-space path to be converted and copied + * @cr: the current graphics context + * + * Creates a user-space #cairo_path_t copy of the given device-space + * @path. The @cr parameter provides the inverse CTM for the + * conversion. + * + * Return value: the new copy of the path. If there is insufficient + * memory a pointer to a special static nil #cairo_path_t will be + * returned instead with status==%CAIRO_STATUS_NO_MEMORY and + * data==%NULL. + **/ +cairo_path_t * +_cairo_path_create (cairo_path_fixed_t *path, + cairo_t *cr) +{ + return _cairo_path_create_internal (path, cr, FALSE); +} + +/** + * _cairo_path_create_flat: + * @path: a fixed-point, device-space path to be flattened, converted and copied + * @cr: the current graphics context + * + * Creates a flattened, user-space #cairo_path_t copy of the given + * device-space @path. The @cr parameter provide the inverse CTM + * for the conversion, as well as the tolerance value to control the + * accuracy of the flattening. + * + * Return value: the flattened copy of the path. If there is insufficient + * memory a pointer to a special static nil #cairo_path_t will be + * returned instead with status==%CAIRO_STATUS_NO_MEMORY and + * data==%NULL. + **/ +cairo_path_t * +_cairo_path_create_flat (cairo_path_fixed_t *path, + cairo_t *cr) +{ + return _cairo_path_create_internal (path, cr, TRUE); +} + +/** + * _cairo_path_append_to_context: + * @path: the path data to be appended + * @cr: a cairo context + * + * Append @path to the current path within @cr. + * + * Return value: %CAIRO_STATUS_INVALID_PATH_DATA if the data in @path + * is invalid, and %CAIRO_STATUS_SUCCESS otherwise. + **/ +cairo_status_t +_cairo_path_append_to_context (const cairo_path_t *path, + cairo_t *cr) +{ + const cairo_path_data_t *p, *end; + + end = &path->data[path->num_data]; + for (p = &path->data[0]; p < end; p += p->header.length) { + switch (p->header.type) { + case CAIRO_PATH_MOVE_TO: + if (unlikely (p->header.length < 2)) + return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); + + cairo_move_to (cr, p[1].point.x, p[1].point.y); + break; + + case CAIRO_PATH_LINE_TO: + if (unlikely (p->header.length < 2)) + return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); + + cairo_line_to (cr, p[1].point.x, p[1].point.y); + break; + + case CAIRO_PATH_CURVE_TO: + if (unlikely (p->header.length < 4)) + return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); + + cairo_curve_to (cr, + p[1].point.x, p[1].point.y, + p[2].point.x, p[2].point.y, + p[3].point.x, p[3].point.y); + break; + + case CAIRO_PATH_CLOSE_PATH: + if (unlikely (p->header.length < 1)) + return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); + + cairo_close_path (cr); + break; + + default: + return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); + } + + if (unlikely (cr->status)) + return cr->status; + } + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/cairo-pattern-inline.h b/src/cairo-pattern-inline.h new file mode 100644 index 000000000..97e8ea034 --- /dev/null +++ b/src/cairo-pattern-inline.h @@ -0,0 +1,65 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PATTERN_INLINE_H +#define CAIRO_PATTERN_INLINE_H + +#include "cairo-pattern-private.h" + +#include "cairo-list-inline.h" + +CAIRO_BEGIN_DECLS + +static inline void +_cairo_pattern_add_observer (cairo_pattern_t *pattern, + cairo_pattern_observer_t *observer, + void (*func) (cairo_pattern_observer_t *, + cairo_pattern_t *, + unsigned int)) +{ + observer->notify = func; + cairo_list_add (&observer->link, &pattern->observers); +} + +static inline cairo_surface_t * +_cairo_pattern_get_source (const cairo_surface_pattern_t *pattern, + cairo_rectangle_int_t *extents) +{ + return _cairo_surface_get_source (pattern->surface, extents); +} + +CAIRO_END_DECLS + +#endif /* CAIRO_PATTERN_INLINE_H */ diff --git a/src/cairo-pattern-private.h b/src/cairo-pattern-private.h new file mode 100644 index 000000000..be8ab9fc2 --- /dev/null +++ b/src/cairo-pattern-private.h @@ -0,0 +1,369 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PATTERN_PRIVATE_H +#define CAIRO_PATTERN_PRIVATE_H + +#include "cairo-error-private.h" +#include "cairo-types-private.h" +#include "cairo-list-private.h" +#include "cairo-surface-private.h" + +#include /* FILE* */ + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_pattern_observer cairo_pattern_observer_t; + +enum { + CAIRO_PATTERN_NOTIFY_MATRIX = 0x1, + CAIRO_PATTERN_NOTIFY_FILTER = 0x2, + CAIRO_PATTERN_NOTIFY_EXTEND = 0x4, + CAIRO_PATTERN_NOTIFY_OPACITY = 0x9, +}; + +struct _cairo_pattern_observer { + void (*notify) (cairo_pattern_observer_t *, + cairo_pattern_t *pattern, + unsigned int flags); + cairo_list_t link; +}; + +struct _cairo_pattern { + cairo_reference_count_t ref_count; + cairo_status_t status; + cairo_user_data_array_t user_data; + cairo_list_t observers; + + cairo_pattern_type_t type; + + cairo_filter_t filter; + cairo_extend_t extend; + cairo_bool_t has_component_alpha; + + cairo_matrix_t matrix; + double opacity; +}; + +struct _cairo_solid_pattern { + cairo_pattern_t base; + cairo_color_t color; +}; + +typedef struct _cairo_surface_pattern { + cairo_pattern_t base; + + cairo_surface_t *surface; +} cairo_surface_pattern_t; + +typedef struct _cairo_gradient_stop { + double offset; + cairo_color_stop_t color; +} cairo_gradient_stop_t; + +typedef struct _cairo_gradient_pattern { + cairo_pattern_t base; + + unsigned int n_stops; + unsigned int stops_size; + cairo_gradient_stop_t *stops; + cairo_gradient_stop_t stops_embedded[2]; +} cairo_gradient_pattern_t; + +typedef struct _cairo_linear_pattern { + cairo_gradient_pattern_t base; + + cairo_point_double_t pd1; + cairo_point_double_t pd2; +} cairo_linear_pattern_t; + +typedef struct _cairo_radial_pattern { + cairo_gradient_pattern_t base; + + cairo_circle_double_t cd1; + cairo_circle_double_t cd2; +} cairo_radial_pattern_t; + +typedef union { + cairo_gradient_pattern_t base; + + cairo_linear_pattern_t linear; + cairo_radial_pattern_t radial; +} cairo_gradient_pattern_union_t; + +/* + * A mesh patch is a tensor-product patch (bicubic Bezier surface + * patch). It has 16 control points. Each set of 4 points along the + * sides of the 4x4 grid of control points is a Bezier curve that + * defines one side of the patch. A color is assigned to each + * corner. The inner 4 points provide additional control over the + * shape and the color mapping. + * + * Cairo uses the same convention as the PDF Reference for numbering + * the points and side of the patch. + * + * + * Side 1 + * + * p[0][3] p[1][3] p[2][3] p[3][3] + * Side 0 p[0][2] p[1][2] p[2][2] p[3][2] Side 2 + * p[0][1] p[1][1] p[2][1] p[3][1] + * p[0][0] p[1][0] p[2][0] p[3][0] + * + * Side 3 + * + * + * Point Color + * ------------------------- + * points[0][0] colors[0] + * points[0][3] colors[1] + * points[3][3] colors[2] + * points[3][0] colors[3] + */ + +typedef struct _cairo_mesh_patch { + cairo_point_double_t points[4][4]; + cairo_color_t colors[4]; +} cairo_mesh_patch_t; + +typedef struct _cairo_mesh_pattern { + cairo_pattern_t base; + + cairo_array_t patches; + cairo_mesh_patch_t *current_patch; + int current_side; + cairo_bool_t has_control_point[4]; + cairo_bool_t has_color[4]; +} cairo_mesh_pattern_t; + +typedef struct _cairo_raster_source_pattern { + cairo_pattern_t base; + + cairo_content_t content; + cairo_rectangle_int_t extents; + + cairo_raster_source_acquire_func_t acquire; + cairo_raster_source_release_func_t release; + cairo_raster_source_snapshot_func_t snapshot; + cairo_raster_source_copy_func_t copy; + cairo_raster_source_finish_func_t finish; + + /* an explicit pre-allocated member in preference to the general user-data */ + void *user_data; +} cairo_raster_source_pattern_t; + +typedef union { + cairo_pattern_t base; + + cairo_solid_pattern_t solid; + cairo_surface_pattern_t surface; + cairo_gradient_pattern_union_t gradient; + cairo_mesh_pattern_t mesh; + cairo_raster_source_pattern_t raster_source; +} cairo_pattern_union_t; + +/* cairo-pattern.c */ + +cairo_private cairo_pattern_t * +_cairo_pattern_create_in_error (cairo_status_t status); + +cairo_private cairo_status_t +_cairo_pattern_create_copy (cairo_pattern_t **pattern, + const cairo_pattern_t *other); + +cairo_private void +_cairo_pattern_init (cairo_pattern_t *pattern, + cairo_pattern_type_t type); + +cairo_private cairo_status_t +_cairo_pattern_init_copy (cairo_pattern_t *pattern, + const cairo_pattern_t *other); + +cairo_private void +_cairo_pattern_init_static_copy (cairo_pattern_t *pattern, + const cairo_pattern_t *other); + +cairo_private cairo_status_t +_cairo_pattern_init_snapshot (cairo_pattern_t *pattern, + const cairo_pattern_t *other); + +cairo_private void +_cairo_pattern_init_solid (cairo_solid_pattern_t *pattern, + const cairo_color_t *color); + +cairo_private void +_cairo_pattern_init_for_surface (cairo_surface_pattern_t *pattern, + cairo_surface_t *surface); + +cairo_private void +_cairo_pattern_fini (cairo_pattern_t *pattern); + +cairo_private cairo_pattern_t * +_cairo_pattern_create_solid (const cairo_color_t *color); + +cairo_private void +_cairo_pattern_transform (cairo_pattern_t *pattern, + const cairo_matrix_t *ctm_inverse); + +cairo_private void +_cairo_pattern_pretransform (cairo_pattern_t *pattern, + const cairo_matrix_t *ctm); + +cairo_private cairo_bool_t +_cairo_pattern_is_opaque_solid (const cairo_pattern_t *pattern); + +cairo_private cairo_bool_t +_cairo_pattern_is_opaque (const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_bool_t +_cairo_pattern_is_clear (const cairo_pattern_t *pattern); + +cairo_private cairo_bool_t +_cairo_gradient_pattern_is_solid (const cairo_gradient_pattern_t *gradient, + const cairo_rectangle_int_t *extents, + cairo_color_t *color); + +cairo_private void +_cairo_gradient_pattern_fit_to_range (const cairo_gradient_pattern_t *gradient, + double max_value, + cairo_matrix_t *out_matrix, + cairo_circle_double_t out_circle[2]); + +cairo_private cairo_bool_t +_cairo_radial_pattern_focus_is_inside (const cairo_radial_pattern_t *radial); + +cairo_private void +_cairo_gradient_pattern_box_to_parameter (const cairo_gradient_pattern_t *gradient, + double x0, double y0, + double x1, double y1, + double tolerance, + double out_range[2]); + +cairo_private void +_cairo_gradient_pattern_interpolate (const cairo_gradient_pattern_t *gradient, + double t, + cairo_circle_double_t *out_circle); + +cairo_private void +_cairo_pattern_alpha_range (const cairo_pattern_t *pattern, + double *out_min, + double *out_max); + +cairo_private cairo_bool_t +_cairo_mesh_pattern_coord_box (const cairo_mesh_pattern_t *mesh, + double *out_xmin, + double *out_ymin, + double *out_xmax, + double *out_ymax); + +cairo_private void +_cairo_pattern_sampled_area (const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + cairo_rectangle_int_t *sample); + +cairo_private void +_cairo_pattern_get_extents (const cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents); + +cairo_private cairo_int_status_t +_cairo_pattern_get_ink_extents (const cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents); + +cairo_private unsigned long +_cairo_pattern_hash (const cairo_pattern_t *pattern); + +cairo_private unsigned long +_cairo_linear_pattern_hash (unsigned long hash, + const cairo_linear_pattern_t *linear); + +cairo_private unsigned long +_cairo_radial_pattern_hash (unsigned long hash, + const cairo_radial_pattern_t *radial); + +cairo_private cairo_bool_t +_cairo_linear_pattern_equal (const cairo_linear_pattern_t *a, + const cairo_linear_pattern_t *b); + +cairo_private unsigned long +_cairo_pattern_size (const cairo_pattern_t *pattern); + +cairo_private cairo_bool_t +_cairo_radial_pattern_equal (const cairo_radial_pattern_t *a, + const cairo_radial_pattern_t *b); + +cairo_private cairo_bool_t +_cairo_pattern_equal (const cairo_pattern_t *a, + const cairo_pattern_t *b); + +cairo_private cairo_filter_t +_cairo_pattern_analyze_filter (const cairo_pattern_t *pattern); + +/* cairo-mesh-pattern-rasterizer.c */ + +cairo_private void +_cairo_mesh_pattern_rasterize (const cairo_mesh_pattern_t *mesh, + void *data, + int width, + int height, + int stride, + double x_offset, + double y_offset); + +cairo_private cairo_surface_t * +_cairo_raster_source_pattern_acquire (const cairo_pattern_t *abstract_pattern, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_raster_source_pattern_release (const cairo_pattern_t *abstract_pattern, + cairo_surface_t *surface); + +cairo_private cairo_status_t +_cairo_raster_source_pattern_snapshot (cairo_pattern_t *abstract_pattern); + +cairo_private cairo_status_t +_cairo_raster_source_pattern_init_copy (cairo_pattern_t *pattern, + const cairo_pattern_t *other); + +cairo_private void +_cairo_raster_source_pattern_finish (cairo_pattern_t *abstract_pattern); + +cairo_private void +_cairo_debug_print_pattern (FILE *file, const cairo_pattern_t *pattern); + +CAIRO_END_DECLS + +#endif /* CAIRO_PATTERN_PRIVATE */ diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c new file mode 100644 index 000000000..ac5d7af20 --- /dev/null +++ b/src/cairo-pattern.c @@ -0,0 +1,4699 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 David Reveman + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of David + * Reveman not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. David Reveman makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: David Reveman + * Keith Packard + * Carl Worth + */ + +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-path-private.h" +#include "cairo-pattern-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-surface-snapshot-inline.h" + +#include + +#define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */ + +/** + * SECTION:cairo-pattern + * @Title: cairo_pattern_t + * @Short_Description: Sources for drawing + * @See_Also: #cairo_t, #cairo_surface_t + * + * #cairo_pattern_t is the paint with which cairo draws. + * The primary use of patterns is as the source for all cairo drawing + * operations, although they can also be used as masks, that is, as the + * brush too. + * + * A cairo pattern is created by using one of the many constructors, + * of the form + * cairo_pattern_create_type() + * or implicitly through + * cairo_set_source_type() + * functions. + **/ + +static freed_pool_t freed_pattern_pool[5]; + +static const cairo_solid_pattern_t _cairo_pattern_nil = { + { + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + CAIRO_STATUS_NO_MEMORY, /* status */ + { 0, 0, 0, NULL }, /* user_data */ + { NULL, NULL }, /* observers */ + + CAIRO_PATTERN_TYPE_SOLID, /* type */ + CAIRO_FILTER_DEFAULT, /* filter */ + CAIRO_EXTEND_GRADIENT_DEFAULT, /* extend */ + FALSE, /* has component alpha */ + { 1., 0., 0., 1., 0., 0., }, /* matrix */ + 1.0 /* opacity */ + } +}; + +static const cairo_solid_pattern_t _cairo_pattern_nil_null_pointer = { + { + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + CAIRO_STATUS_NULL_POINTER, /* status */ + { 0, 0, 0, NULL }, /* user_data */ + { NULL, NULL }, /* observers */ + + CAIRO_PATTERN_TYPE_SOLID, /* type */ + CAIRO_FILTER_DEFAULT, /* filter */ + CAIRO_EXTEND_GRADIENT_DEFAULT, /* extend */ + FALSE, /* has component alpha */ + { 1., 0., 0., 1., 0., 0., }, /* matrix */ + 1.0 /* opacity */ + } +}; + +const cairo_solid_pattern_t _cairo_pattern_black = { + { + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + CAIRO_STATUS_SUCCESS, /* status */ + { 0, 0, 0, NULL }, /* user_data */ + { NULL, NULL }, /* observers */ + + CAIRO_PATTERN_TYPE_SOLID, /* type */ + CAIRO_FILTER_NEAREST, /* filter */ + CAIRO_EXTEND_REPEAT, /* extend */ + FALSE, /* has component alpha */ + { 1., 0., 0., 1., 0., 0., }, /* matrix */ + 1.0 /* opacity */ + }, + { 0., 0., 0., 1., 0, 0, 0, 0xffff },/* color (double rgba, short rgba) */ +}; + +const cairo_solid_pattern_t _cairo_pattern_clear = { + { + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + CAIRO_STATUS_SUCCESS, /* status */ + { 0, 0, 0, NULL }, /* user_data */ + { NULL, NULL }, /* observers */ + + CAIRO_PATTERN_TYPE_SOLID, /* type */ + CAIRO_FILTER_NEAREST, /* filter */ + CAIRO_EXTEND_REPEAT, /* extend */ + FALSE, /* has component alpha */ + { 1., 0., 0., 1., 0., 0., }, /* matrix */ + 1.0 /* opacity */ + }, + { 0., 0., 0., 0., 0, 0, 0, 0 },/* color (double rgba, short rgba) */ +}; + +const cairo_solid_pattern_t _cairo_pattern_white = { + { + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + CAIRO_STATUS_SUCCESS, /* status */ + { 0, 0, 0, NULL }, /* user_data */ + { NULL, NULL }, /* observers */ + + CAIRO_PATTERN_TYPE_SOLID, /* type */ + CAIRO_FILTER_NEAREST, /* filter */ + CAIRO_EXTEND_REPEAT, /* extend */ + FALSE, /* has component alpha */ + { 1., 0., 0., 1., 0., 0., }, /* matrix */ + 1.0 /* opacity */ + }, + { 1., 1., 1., 1., 0xffff, 0xffff, 0xffff, 0xffff },/* color (double rgba, short rgba) */ +}; + +static void +_cairo_pattern_notify_observers (cairo_pattern_t *pattern, + unsigned int flags) +{ + cairo_pattern_observer_t *pos; + + cairo_list_foreach_entry (pos, cairo_pattern_observer_t, &pattern->observers, link) + pos->notify (pos, pattern, flags); +} + +/** + * _cairo_pattern_set_error: + * @pattern: a pattern + * @status: a status value indicating an error + * + * Atomically sets pattern->status to @status and calls _cairo_error; + * Does nothing if status is %CAIRO_STATUS_SUCCESS. + * + * All assignments of an error status to pattern->status should happen + * through _cairo_pattern_set_error(). Note that due to the nature of + * the atomic operation, it is not safe to call this function on the nil + * objects. + * + * The purpose of this function is to allow the user to set a + * breakpoint in _cairo_error() to generate a stack trace for when the + * user causes cairo to detect an error. + **/ +static cairo_status_t +_cairo_pattern_set_error (cairo_pattern_t *pattern, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS) + return status; + + /* Don't overwrite an existing error. This preserves the first + * error, which is the most significant. */ + _cairo_status_set_error (&pattern->status, status); + + return _cairo_error (status); +} + +void +_cairo_pattern_init (cairo_pattern_t *pattern, cairo_pattern_type_t type) +{ +#if HAVE_VALGRIND + switch (type) { + case CAIRO_PATTERN_TYPE_SOLID: + VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_solid_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_SURFACE: + VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_surface_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_LINEAR: + VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_linear_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_RADIAL: + VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_radial_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_MESH: + VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_mesh_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + break; + } +#endif + + pattern->type = type; + pattern->status = CAIRO_STATUS_SUCCESS; + + /* Set the reference count to zero for on-stack patterns. + * Callers needs to explicitly increment the count for heap allocations. */ + CAIRO_REFERENCE_COUNT_INIT (&pattern->ref_count, 0); + + _cairo_user_data_array_init (&pattern->user_data); + + if (type == CAIRO_PATTERN_TYPE_SURFACE || + type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) + pattern->extend = CAIRO_EXTEND_SURFACE_DEFAULT; + else + pattern->extend = CAIRO_EXTEND_GRADIENT_DEFAULT; + + pattern->filter = CAIRO_FILTER_DEFAULT; + pattern->opacity = 1.0; + + pattern->has_component_alpha = FALSE; + + cairo_matrix_init_identity (&pattern->matrix); + + cairo_list_init (&pattern->observers); +} + +static cairo_status_t +_cairo_gradient_pattern_init_copy (cairo_gradient_pattern_t *pattern, + const cairo_gradient_pattern_t *other) +{ + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (other->base.type == CAIRO_PATTERN_TYPE_LINEAR) + { + cairo_linear_pattern_t *dst = (cairo_linear_pattern_t *) pattern; + cairo_linear_pattern_t *src = (cairo_linear_pattern_t *) other; + + *dst = *src; + } + else + { + cairo_radial_pattern_t *dst = (cairo_radial_pattern_t *) pattern; + cairo_radial_pattern_t *src = (cairo_radial_pattern_t *) other; + + *dst = *src; + } + + if (other->stops == other->stops_embedded) + pattern->stops = pattern->stops_embedded; + else if (other->stops) + { + pattern->stops = _cairo_malloc_ab (other->stops_size, + sizeof (cairo_gradient_stop_t)); + if (unlikely (pattern->stops == NULL)) { + pattern->stops_size = 0; + pattern->n_stops = 0; + return _cairo_pattern_set_error (&pattern->base, CAIRO_STATUS_NO_MEMORY); + } + + memcpy (pattern->stops, other->stops, + other->n_stops * sizeof (cairo_gradient_stop_t)); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_mesh_pattern_init_copy (cairo_mesh_pattern_t *pattern, + const cairo_mesh_pattern_t *other) +{ + *pattern = *other; + + _cairo_array_init (&pattern->patches, sizeof (cairo_mesh_patch_t)); + return _cairo_array_append_multiple (&pattern->patches, + _cairo_array_index_const (&other->patches, 0), + _cairo_array_num_elements (&other->patches)); +} + +cairo_status_t +_cairo_pattern_init_copy (cairo_pattern_t *pattern, + const cairo_pattern_t *other) +{ + cairo_status_t status; + + if (other->status) + return _cairo_pattern_set_error (pattern, other->status); + + switch (other->type) { + case CAIRO_PATTERN_TYPE_SOLID: { + cairo_solid_pattern_t *dst = (cairo_solid_pattern_t *) pattern; + cairo_solid_pattern_t *src = (cairo_solid_pattern_t *) other; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_solid_pattern_t))); + + *dst = *src; + } break; + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_pattern_t *dst = (cairo_surface_pattern_t *) pattern; + cairo_surface_pattern_t *src = (cairo_surface_pattern_t *) other; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_surface_pattern_t))); + + *dst = *src; + cairo_surface_reference (dst->surface); + } break; + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: { + cairo_gradient_pattern_t *dst = (cairo_gradient_pattern_t *) pattern; + cairo_gradient_pattern_t *src = (cairo_gradient_pattern_t *) other; + + if (other->type == CAIRO_PATTERN_TYPE_LINEAR) { + VG (VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_linear_pattern_t))); + } else { + VG (VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_radial_pattern_t))); + } + + status = _cairo_gradient_pattern_init_copy (dst, src); + if (unlikely (status)) + return status; + + } break; + case CAIRO_PATTERN_TYPE_MESH: { + cairo_mesh_pattern_t *dst = (cairo_mesh_pattern_t *) pattern; + cairo_mesh_pattern_t *src = (cairo_mesh_pattern_t *) other; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_mesh_pattern_t))); + + status = _cairo_mesh_pattern_init_copy (dst, src); + if (unlikely (status)) + return status; + + } break; + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: { + status = _cairo_raster_source_pattern_init_copy (pattern, other); + if (unlikely (status)) + return status; + } break; + } + + /* The reference count and user_data array are unique to the copy. */ + CAIRO_REFERENCE_COUNT_INIT (&pattern->ref_count, 0); + _cairo_user_data_array_init (&pattern->user_data); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_pattern_init_static_copy (cairo_pattern_t *pattern, + const cairo_pattern_t *other) +{ + int size; + + assert (other->status == CAIRO_STATUS_SUCCESS); + + switch (other->type) { + default: + ASSERT_NOT_REACHED; + case CAIRO_PATTERN_TYPE_SOLID: + size = sizeof (cairo_solid_pattern_t); + break; + case CAIRO_PATTERN_TYPE_SURFACE: + size = sizeof (cairo_surface_pattern_t); + break; + case CAIRO_PATTERN_TYPE_LINEAR: + size = sizeof (cairo_linear_pattern_t); + break; + case CAIRO_PATTERN_TYPE_RADIAL: + size = sizeof (cairo_radial_pattern_t); + break; + case CAIRO_PATTERN_TYPE_MESH: + size = sizeof (cairo_mesh_pattern_t); + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + size = sizeof (cairo_raster_source_pattern_t); + break; + } + + memcpy (pattern, other, size); + + CAIRO_REFERENCE_COUNT_INIT (&pattern->ref_count, 0); + _cairo_user_data_array_init (&pattern->user_data); +} + +cairo_status_t +_cairo_pattern_init_snapshot (cairo_pattern_t *pattern, + const cairo_pattern_t *other) +{ + cairo_status_t status; + + /* We don't bother doing any fancy copy-on-write implementation + * for the pattern's data. It's generally quite tiny. */ + status = _cairo_pattern_init_copy (pattern, other); + if (unlikely (status)) + return status; + + /* But we do let the surface snapshot stuff be as fancy as it + * would like to be. */ + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = + (cairo_surface_pattern_t *) pattern; + cairo_surface_t *surface = surface_pattern->surface; + + surface_pattern->surface = _cairo_surface_snapshot (surface); + + cairo_surface_destroy (surface); + + status = surface_pattern->surface->status; + } else if (pattern->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) + status = _cairo_raster_source_pattern_snapshot (pattern); + + return status; +} + +void +_cairo_pattern_fini (cairo_pattern_t *pattern) +{ + _cairo_user_data_array_fini (&pattern->user_data); + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + break; + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_pattern_t *surface_pattern = + (cairo_surface_pattern_t *) pattern; + + cairo_surface_destroy (surface_pattern->surface); + } break; + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: { + cairo_gradient_pattern_t *gradient = + (cairo_gradient_pattern_t *) pattern; + + if (gradient->stops && gradient->stops != gradient->stops_embedded) + free (gradient->stops); + } break; + case CAIRO_PATTERN_TYPE_MESH: { + cairo_mesh_pattern_t *mesh = + (cairo_mesh_pattern_t *) pattern; + + _cairo_array_fini (&mesh->patches); + } break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + _cairo_raster_source_pattern_finish (pattern); + break; + } + +#if HAVE_VALGRIND + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + VALGRIND_MAKE_MEM_NOACCESS (pattern, sizeof (cairo_solid_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_SURFACE: + VALGRIND_MAKE_MEM_NOACCESS (pattern, sizeof (cairo_surface_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_LINEAR: + VALGRIND_MAKE_MEM_NOACCESS (pattern, sizeof (cairo_linear_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_RADIAL: + VALGRIND_MAKE_MEM_NOACCESS (pattern, sizeof (cairo_radial_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_MESH: + VALGRIND_MAKE_MEM_NOACCESS (pattern, sizeof (cairo_mesh_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + break; + } +#endif +} + +cairo_status_t +_cairo_pattern_create_copy (cairo_pattern_t **pattern_out, + const cairo_pattern_t *other) +{ + cairo_pattern_t *pattern; + cairo_status_t status; + + if (other->status) + return other->status; + + switch (other->type) { + case CAIRO_PATTERN_TYPE_SOLID: + pattern = malloc (sizeof (cairo_solid_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_SURFACE: + pattern = malloc (sizeof (cairo_surface_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_LINEAR: + pattern = malloc (sizeof (cairo_linear_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_RADIAL: + pattern = malloc (sizeof (cairo_radial_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_MESH: + pattern = malloc (sizeof (cairo_mesh_pattern_t)); + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + pattern = malloc (sizeof (cairo_raster_source_pattern_t)); + break; + default: + ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + } + if (unlikely (pattern == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_pattern_init_copy (pattern, other); + if (unlikely (status)) { + free (pattern); + return status; + } + + CAIRO_REFERENCE_COUNT_INIT (&pattern->ref_count, 1); + *pattern_out = pattern; + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_pattern_init_solid (cairo_solid_pattern_t *pattern, + const cairo_color_t *color) +{ + _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SOLID); + pattern->color = *color; +} + +void +_cairo_pattern_init_for_surface (cairo_surface_pattern_t *pattern, + cairo_surface_t *surface) +{ + if (surface->status) { + /* Force to solid to simplify the pattern_fini process. */ + _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SOLID); + _cairo_pattern_set_error (&pattern->base, surface->status); + return; + } + + _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SURFACE); + + pattern->surface = cairo_surface_reference (surface); +} + +static void +_cairo_pattern_init_gradient (cairo_gradient_pattern_t *pattern, + cairo_pattern_type_t type) +{ + _cairo_pattern_init (&pattern->base, type); + + pattern->n_stops = 0; + pattern->stops_size = 0; + pattern->stops = NULL; +} + +static void +_cairo_pattern_init_linear (cairo_linear_pattern_t *pattern, + double x0, double y0, double x1, double y1) +{ + _cairo_pattern_init_gradient (&pattern->base, CAIRO_PATTERN_TYPE_LINEAR); + + pattern->pd1.x = x0; + pattern->pd1.y = y0; + pattern->pd2.x = x1; + pattern->pd2.y = y1; +} + +static void +_cairo_pattern_init_radial (cairo_radial_pattern_t *pattern, + double cx0, double cy0, double radius0, + double cx1, double cy1, double radius1) +{ + _cairo_pattern_init_gradient (&pattern->base, CAIRO_PATTERN_TYPE_RADIAL); + + pattern->cd1.center.x = cx0; + pattern->cd1.center.y = cy0; + pattern->cd1.radius = fabs (radius0); + pattern->cd2.center.x = cx1; + pattern->cd2.center.y = cy1; + pattern->cd2.radius = fabs (radius1); +} + +cairo_pattern_t * +_cairo_pattern_create_solid (const cairo_color_t *color) +{ + cairo_solid_pattern_t *pattern; + + pattern = + _freed_pool_get (&freed_pattern_pool[CAIRO_PATTERN_TYPE_SOLID]); + if (unlikely (pattern == NULL)) { + /* None cached, need to create a new pattern. */ + pattern = malloc (sizeof (cairo_solid_pattern_t)); + if (unlikely (pattern == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_pattern_t *) &_cairo_pattern_nil; + } + } + + _cairo_pattern_init_solid (pattern, color); + CAIRO_REFERENCE_COUNT_INIT (&pattern->base.ref_count, 1); + + return &pattern->base; +} + +cairo_pattern_t * +_cairo_pattern_create_in_error (cairo_status_t status) +{ + cairo_pattern_t *pattern; + + if (status == CAIRO_STATUS_NO_MEMORY) + return (cairo_pattern_t *)&_cairo_pattern_nil.base; + + CAIRO_MUTEX_INITIALIZE (); + + pattern = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK); + if (pattern->status == CAIRO_STATUS_SUCCESS) + status = _cairo_pattern_set_error (pattern, status); + + return pattern; +} + +/** + * cairo_pattern_create_rgb: + * @red: red component of the color + * @green: green component of the color + * @blue: blue component of the color + * + * Creates a new #cairo_pattern_t corresponding to an opaque color. The + * color components are floating point numbers in the range 0 to 1. + * If the values passed in are outside that range, they will be + * clamped. + * + * Return value: the newly created #cairo_pattern_t if successful, or + * an error pattern in case of no memory. The caller owns the + * returned object and should call cairo_pattern_destroy() when + * finished with it. + * + * This function will always return a valid pointer, but if an error + * occurred the pattern status will be set to an error. To inspect + * the status of a pattern use cairo_pattern_status(). + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_pattern_create_rgb (double red, double green, double blue) +{ + return cairo_pattern_create_rgba (red, green, blue, 1.0); +} +slim_hidden_def (cairo_pattern_create_rgb); + +/** + * cairo_pattern_create_rgba: + * @red: red component of the color + * @green: green component of the color + * @blue: blue component of the color + * @alpha: alpha component of the color + * + * Creates a new #cairo_pattern_t corresponding to a translucent color. + * The color components are floating point numbers in the range 0 to + * 1. If the values passed in are outside that range, they will be + * clamped. + * + * Return value: the newly created #cairo_pattern_t if successful, or + * an error pattern in case of no memory. The caller owns the + * returned object and should call cairo_pattern_destroy() when + * finished with it. + * + * This function will always return a valid pointer, but if an error + * occurred the pattern status will be set to an error. To inspect + * the status of a pattern use cairo_pattern_status(). + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_pattern_create_rgba (double red, double green, double blue, + double alpha) +{ + cairo_color_t color; + + red = _cairo_restrict_value (red, 0.0, 1.0); + green = _cairo_restrict_value (green, 0.0, 1.0); + blue = _cairo_restrict_value (blue, 0.0, 1.0); + alpha = _cairo_restrict_value (alpha, 0.0, 1.0); + + _cairo_color_init_rgba (&color, red, green, blue, alpha); + + CAIRO_MUTEX_INITIALIZE (); + + return _cairo_pattern_create_solid (&color); +} +slim_hidden_def (cairo_pattern_create_rgba); + +/** + * cairo_pattern_create_for_surface: + * @surface: the surface + * + * Create a new #cairo_pattern_t for the given surface. + * + * Return value: the newly created #cairo_pattern_t if successful, or + * an error pattern in case of no memory. The caller owns the + * returned object and should call cairo_pattern_destroy() when + * finished with it. + * + * This function will always return a valid pointer, but if an error + * occurred the pattern status will be set to an error. To inspect + * the status of a pattern use cairo_pattern_status(). + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface) +{ + cairo_surface_pattern_t *pattern; + + if (surface == NULL) { + _cairo_error_throw (CAIRO_STATUS_NULL_POINTER); + return (cairo_pattern_t*) &_cairo_pattern_nil_null_pointer; + } + + if (surface->status) + return _cairo_pattern_create_in_error (surface->status); + + pattern = + _freed_pool_get (&freed_pattern_pool[CAIRO_PATTERN_TYPE_SURFACE]); + if (unlikely (pattern == NULL)) { + pattern = malloc (sizeof (cairo_surface_pattern_t)); + if (unlikely (pattern == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_pattern_t *)&_cairo_pattern_nil.base; + } + } + + CAIRO_MUTEX_INITIALIZE (); + + _cairo_pattern_init_for_surface (pattern, surface); + CAIRO_REFERENCE_COUNT_INIT (&pattern->base.ref_count, 1); + + return &pattern->base; +} +slim_hidden_def (cairo_pattern_create_for_surface); + +/** + * cairo_pattern_create_linear: + * @x0: x coordinate of the start point + * @y0: y coordinate of the start point + * @x1: x coordinate of the end point + * @y1: y coordinate of the end point + * + * Create a new linear gradient #cairo_pattern_t along the line defined + * by (x0, y0) and (x1, y1). Before using the gradient pattern, a + * number of color stops should be defined using + * cairo_pattern_add_color_stop_rgb() or + * cairo_pattern_add_color_stop_rgba(). + * + * Note: The coordinates here are in pattern space. For a new pattern, + * pattern space is identical to user space, but the relationship + * between the spaces can be changed with cairo_pattern_set_matrix(). + * + * Return value: the newly created #cairo_pattern_t if successful, or + * an error pattern in case of no memory. The caller owns the + * returned object and should call cairo_pattern_destroy() when + * finished with it. + * + * This function will always return a valid pointer, but if an error + * occurred the pattern status will be set to an error. To inspect + * the status of a pattern use cairo_pattern_status(). + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_pattern_create_linear (double x0, double y0, double x1, double y1) +{ + cairo_linear_pattern_t *pattern; + + pattern = + _freed_pool_get (&freed_pattern_pool[CAIRO_PATTERN_TYPE_LINEAR]); + if (unlikely (pattern == NULL)) { + pattern = malloc (sizeof (cairo_linear_pattern_t)); + if (unlikely (pattern == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_pattern_t *) &_cairo_pattern_nil.base; + } + } + + CAIRO_MUTEX_INITIALIZE (); + + _cairo_pattern_init_linear (pattern, x0, y0, x1, y1); + CAIRO_REFERENCE_COUNT_INIT (&pattern->base.base.ref_count, 1); + + return &pattern->base.base; +} + +/** + * cairo_pattern_create_radial: + * @cx0: x coordinate for the center of the start circle + * @cy0: y coordinate for the center of the start circle + * @radius0: radius of the start circle + * @cx1: x coordinate for the center of the end circle + * @cy1: y coordinate for the center of the end circle + * @radius1: radius of the end circle + * + * Creates a new radial gradient #cairo_pattern_t between the two + * circles defined by (cx0, cy0, radius0) and (cx1, cy1, radius1). Before using the + * gradient pattern, a number of color stops should be defined using + * cairo_pattern_add_color_stop_rgb() or + * cairo_pattern_add_color_stop_rgba(). + * + * Note: The coordinates here are in pattern space. For a new pattern, + * pattern space is identical to user space, but the relationship + * between the spaces can be changed with cairo_pattern_set_matrix(). + * + * Return value: the newly created #cairo_pattern_t if successful, or + * an error pattern in case of no memory. The caller owns the + * returned object and should call cairo_pattern_destroy() when + * finished with it. + * + * This function will always return a valid pointer, but if an error + * occurred the pattern status will be set to an error. To inspect + * the status of a pattern use cairo_pattern_status(). + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_pattern_create_radial (double cx0, double cy0, double radius0, + double cx1, double cy1, double radius1) +{ + cairo_radial_pattern_t *pattern; + + pattern = + _freed_pool_get (&freed_pattern_pool[CAIRO_PATTERN_TYPE_RADIAL]); + if (unlikely (pattern == NULL)) { + pattern = malloc (sizeof (cairo_radial_pattern_t)); + if (unlikely (pattern == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_pattern_t *) &_cairo_pattern_nil.base; + } + } + + CAIRO_MUTEX_INITIALIZE (); + + _cairo_pattern_init_radial (pattern, cx0, cy0, radius0, cx1, cy1, radius1); + CAIRO_REFERENCE_COUNT_INIT (&pattern->base.base.ref_count, 1); + + return &pattern->base.base; +} + +/* This order is specified in the diagram in the documentation for + * cairo_pattern_create_mesh() */ +static const int mesh_path_point_i[12] = { 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 2, 1 }; +static const int mesh_path_point_j[12] = { 0, 1, 2, 3, 3, 3, 3, 2, 1, 0, 0, 0 }; +static const int mesh_control_point_i[4] = { 1, 1, 2, 2 }; +static const int mesh_control_point_j[4] = { 1, 2, 2, 1 }; + +/** + * cairo_pattern_create_mesh: + * + * Create a new mesh pattern. + * + * Mesh patterns are tensor-product patch meshes (type 7 shadings in + * PDF). Mesh patterns may also be used to create other types of + * shadings that are special cases of tensor-product patch meshes such + * as Coons patch meshes (type 6 shading in PDF) and Gouraud-shaded + * triangle meshes (type 4 and 5 shadings in PDF). + * + * Mesh patterns consist of one or more tensor-product patches, which + * should be defined before using the mesh pattern. Using a mesh + * pattern with a partially defined patch as source or mask will put + * the context in an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * A tensor-product patch is defined by 4 Bézier curves (side 0, 1, 2, + * 3) and by 4 additional control points (P0, P1, P2, P3) that provide + * further control over the patch and complete the definition of the + * tensor-product patch. The corner C0 is the first point of the + * patch. + * + * Degenerate sides are permitted so straight lines may be used. A + * zero length line on one side may be used to create 3 sided patches. + * + * + * C1 Side 1 C2 + * +---------------+ + * | | + * | P1 P2 | + * | | + * Side 0 | | Side 2 + * | | + * | | + * | P0 P3 | + * | | + * +---------------+ + * C0 Side 3 C3 + * + * + * Each patch is constructed by first calling + * cairo_mesh_pattern_begin_patch(), then cairo_mesh_pattern_move_to() + * to specify the first point in the patch (C0). Then the sides are + * specified with calls to cairo_mesh_pattern_curve_to() and + * cairo_mesh_pattern_line_to(). + * + * The four additional control points (P0, P1, P2, P3) in a patch can + * be specified with cairo_mesh_pattern_set_control_point(). + * + * At each corner of the patch (C0, C1, C2, C3) a color may be + * specified with cairo_mesh_pattern_set_corner_color_rgb() or + * cairo_mesh_pattern_set_corner_color_rgba(). Any corner whose color + * is not explicitly specified defaults to transparent black. + * + * A Coons patch is a special case of the tensor-product patch where + * the control points are implicitly defined by the sides of the + * patch. The default value for any control point not specified is the + * implicit value for a Coons patch, i.e. if no control points are + * specified the patch is a Coons patch. + * + * A triangle is a special case of the tensor-product patch where the + * control points are implicitly defined by the sides of the patch, + * all the sides are lines and one of them has length 0, i.e. if the + * patch is specified using just 3 lines, it is a triangle. If the + * corners connected by the 0-length side have the same color, the + * patch is a Gouraud-shaded triangle. + * + * Patches may be oriented differently to the above diagram. For + * example the first point could be at the top left. The diagram only + * shows the relationship between the sides, corners and control + * points. Regardless of where the first point is located, when + * specifying colors, corner 0 will always be the first point, corner + * 1 the point between side 0 and side 1 etc. + * + * Calling cairo_mesh_pattern_end_patch() completes the current + * patch. If less than 4 sides have been defined, the first missing + * side is defined as a line from the current point to the first point + * of the patch (C0) and the other sides are degenerate lines from C0 + * to C0. The corners between the added sides will all be coincident + * with C0 of the patch and their color will be set to be the same as + * the color of C0. + * + * Additional patches may be added with additional calls to + * cairo_mesh_pattern_begin_patch()/cairo_mesh_pattern_end_patch(). + * + * + * cairo_pattern_t *pattern = cairo_pattern_create_mesh (); + * + * /* Add a Coons patch */ + * cairo_mesh_pattern_begin_patch (pattern); + * cairo_mesh_pattern_move_to (pattern, 0, 0); + * cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); + * cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); + * cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); + * cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + * cairo_mesh_pattern_end_patch (pattern); + * + * /* Add a Gouraud-shaded triangle */ + * cairo_mesh_pattern_begin_patch (pattern) + * cairo_mesh_pattern_move_to (pattern, 100, 100); + * cairo_mesh_pattern_line_to (pattern, 130, 130); + * cairo_mesh_pattern_line_to (pattern, 130, 70); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + * cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + * cairo_mesh_pattern_end_patch (pattern) + * + * + * When two patches overlap, the last one that has been added is drawn + * over the first one. + * + * When a patch folds over itself, points are sorted depending on + * their parameter coordinates inside the patch. The v coordinate + * ranges from 0 to 1 when moving from side 3 to side 1; the u + * coordinate ranges from 0 to 1 when going from side 0 to side + * 2. Points with higher v coordinate hide points with lower v + * coordinate. When two points have the same v coordinate, the one + * with higher u coordinate is above. This means that points nearer to + * side 1 are above points nearer to side 3; when this is not + * sufficient to decide which point is above (for example when both + * points belong to side 1 or side 3) points nearer to side 2 are + * above points nearer to side 0. + * + * For a complete definition of tensor-product patches, see the PDF + * specification (ISO32000), which describes the parametrization in + * detail. + * + * Note: The coordinates are always in pattern space. For a new + * pattern, pattern space is identical to user space, but the + * relationship between the spaces can be changed with + * cairo_pattern_set_matrix(). + * + * Return value: the newly created #cairo_pattern_t if successful, or + * an error pattern in case of no memory. The caller owns the returned + * object and should call cairo_pattern_destroy() when finished with + * it. + * + * This function will always return a valid pointer, but if an error + * occurred the pattern status will be set to an error. To inspect the + * status of a pattern use cairo_pattern_status(). + * + * Since: 1.12 + **/ +cairo_pattern_t * +cairo_pattern_create_mesh (void) +{ + cairo_mesh_pattern_t *pattern; + + pattern = + _freed_pool_get (&freed_pattern_pool[CAIRO_PATTERN_TYPE_MESH]); + if (unlikely (pattern == NULL)) { + pattern = malloc (sizeof (cairo_mesh_pattern_t)); + if (unlikely (pattern == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_pattern_t *) &_cairo_pattern_nil.base; + } + } + + CAIRO_MUTEX_INITIALIZE (); + + _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_MESH); + _cairo_array_init (&pattern->patches, sizeof (cairo_mesh_patch_t)); + pattern->current_patch = NULL; + CAIRO_REFERENCE_COUNT_INIT (&pattern->base.ref_count, 1); + + return &pattern->base; +} + +/** + * cairo_pattern_reference: + * @pattern: a #cairo_pattern_t + * + * Increases the reference count on @pattern by one. This prevents + * @pattern from being destroyed until a matching call to + * cairo_pattern_destroy() is made. + * + * The number of references to a #cairo_pattern_t can be get using + * cairo_pattern_get_reference_count(). + * + * Return value: the referenced #cairo_pattern_t. + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_pattern_reference (cairo_pattern_t *pattern) +{ + if (pattern == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) + return pattern; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&pattern->ref_count)); + + _cairo_reference_count_inc (&pattern->ref_count); + + return pattern; +} +slim_hidden_def (cairo_pattern_reference); + +/** + * cairo_pattern_get_type: + * @pattern: a #cairo_pattern_t + * + * This function returns the type a pattern. + * See #cairo_pattern_type_t for available types. + * + * Return value: The type of @pattern. + * + * Since: 1.2 + **/ +cairo_pattern_type_t +cairo_pattern_get_type (cairo_pattern_t *pattern) +{ + return pattern->type; +} + +/** + * cairo_pattern_status: + * @pattern: a #cairo_pattern_t + * + * Checks whether an error has previously occurred for this + * pattern. + * + * Return value: %CAIRO_STATUS_SUCCESS, %CAIRO_STATUS_NO_MEMORY, + * %CAIRO_STATUS_INVALID_MATRIX, %CAIRO_STATUS_PATTERN_TYPE_MISMATCH, + * or %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_pattern_status (cairo_pattern_t *pattern) +{ + return pattern->status; +} + +/** + * cairo_pattern_destroy: + * @pattern: a #cairo_pattern_t + * + * Decreases the reference count on @pattern by one. If the result is + * zero, then @pattern and all associated resources are freed. See + * cairo_pattern_reference(). + * + * Since: 1.0 + **/ +void +cairo_pattern_destroy (cairo_pattern_t *pattern) +{ + cairo_pattern_type_t type; + + if (pattern == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&pattern->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&pattern->ref_count)) + return; + + type = pattern->type; + _cairo_pattern_fini (pattern); + + /* maintain a small cache of freed patterns */ + if (type < ARRAY_LENGTH (freed_pattern_pool)) + _freed_pool_put (&freed_pattern_pool[type], pattern); + else + free (pattern); +} +slim_hidden_def (cairo_pattern_destroy); + +/** + * cairo_pattern_get_reference_count: + * @pattern: a #cairo_pattern_t + * + * Returns the current reference count of @pattern. + * + * Return value: the current reference count of @pattern. If the + * object is a nil object, 0 will be returned. + * + * Since: 1.4 + **/ +unsigned int +cairo_pattern_get_reference_count (cairo_pattern_t *pattern) +{ + if (pattern == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) + return 0; + + return CAIRO_REFERENCE_COUNT_GET_VALUE (&pattern->ref_count); +} + +/** + * cairo_pattern_get_user_data: + * @pattern: a #cairo_pattern_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Return user data previously attached to @pattern using the + * specified key. If no user data has been attached with the given + * key this function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + * + * Since: 1.4 + **/ +void * +cairo_pattern_get_user_data (cairo_pattern_t *pattern, + const cairo_user_data_key_t *key) +{ + return _cairo_user_data_array_get_data (&pattern->user_data, + key); +} + +/** + * cairo_pattern_set_user_data: + * @pattern: a #cairo_pattern_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach to the #cairo_pattern_t + * @destroy: a #cairo_destroy_func_t which will be called when the + * #cairo_t is destroyed or when new user data is attached using the + * same key. + * + * Attach user data to @pattern. To remove user data from a surface, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_set_user_data (cairo_pattern_t *pattern, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) + return pattern->status; + + return _cairo_user_data_array_set_data (&pattern->user_data, + key, user_data, destroy); +} + +/** + * cairo_mesh_pattern_begin_patch: + * @pattern: a #cairo_pattern_t + * + * Begin a patch in a mesh pattern. + * + * After calling this function, the patch shape should be defined with + * cairo_mesh_pattern_move_to(), cairo_mesh_pattern_line_to() and + * cairo_mesh_pattern_curve_to(). + * + * After defining the patch, cairo_mesh_pattern_end_patch() must be + * called before using @pattern as a source or mask. + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @pattern already has a + * current patch, it will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_begin_patch (cairo_pattern_t *pattern) +{ + cairo_mesh_pattern_t *mesh; + cairo_status_t status; + cairo_mesh_patch_t *current_patch; + int i; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + if (unlikely (mesh->current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + status = _cairo_array_allocate (&mesh->patches, 1, (void **) ¤t_patch); + if (unlikely (status)) { + _cairo_pattern_set_error (pattern, status); + return; + } + + mesh->current_patch = current_patch; + mesh->current_side = -2; /* no current point */ + + for (i = 0; i < 4; i++) + mesh->has_control_point[i] = FALSE; + + for (i = 0; i < 4; i++) + mesh->has_color[i] = FALSE; +} + + +static void +_calc_control_point (cairo_mesh_patch_t *patch, int control_point) +{ + /* The Coons patch is a special case of the Tensor Product patch + * where the four control points are: + * + * P11 = S(1/3, 1/3) + * P12 = S(1/3, 2/3) + * P21 = S(2/3, 1/3) + * P22 = S(2/3, 2/3) + * + * where S is the gradient surface. + * + * When one or more control points has not been specified + * calculated the Coons patch control points are substituted. If + * no control points are specified the gradient will be a Coons + * patch. + * + * The equations below are defined in the ISO32000 standard. + */ + cairo_point_double_t *p[3][3]; + int cp_i, cp_j, i, j; + + cp_i = mesh_control_point_i[control_point]; + cp_j = mesh_control_point_j[control_point]; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + p[i][j] = &patch->points[cp_i ^ i][cp_j ^ j]; + + p[0][0]->x = (- 4 * p[1][1]->x + + 6 * (p[1][0]->x + p[0][1]->x) + - 2 * (p[1][2]->x + p[2][1]->x) + + 3 * (p[2][0]->x + p[0][2]->x) + - 1 * p[2][2]->x) * (1. / 9); + + p[0][0]->y = (- 4 * p[1][1]->y + + 6 * (p[1][0]->y + p[0][1]->y) + - 2 * (p[1][2]->y + p[2][1]->y) + + 3 * (p[2][0]->y + p[0][2]->y) + - 1 * p[2][2]->y) * (1. / 9); +} + +/** + * cairo_mesh_pattern_end_patch: + * @pattern: a #cairo_pattern_t + * + * Indicates the end of the current patch in a mesh pattern. + * + * If the current patch has less than 4 sides, it is closed with a + * straight line from the current point to the first point of the + * patch as if cairo_mesh_pattern_line_to() was used. + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @pattern has no current + * patch or the current patch has no current point, @pattern will be + * put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_end_patch (cairo_pattern_t *pattern) +{ + cairo_mesh_pattern_t *mesh; + cairo_mesh_patch_t *current_patch; + int i; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + current_patch = mesh->current_patch; + if (unlikely (!current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + if (unlikely (mesh->current_side == -2)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + while (mesh->current_side < 3) { + int corner_num; + + cairo_mesh_pattern_line_to (pattern, + current_patch->points[0][0].x, + current_patch->points[0][0].y); + + corner_num = mesh->current_side + 1; + if (corner_num < 4 && ! mesh->has_color[corner_num]) { + current_patch->colors[corner_num] = current_patch->colors[0]; + mesh->has_color[corner_num] = TRUE; + } + } + + for (i = 0; i < 4; i++) { + if (! mesh->has_control_point[i]) + _calc_control_point (current_patch, i); + } + + for (i = 0; i < 4; i++) { + if (! mesh->has_color[i]) + current_patch->colors[i] = *CAIRO_COLOR_TRANSPARENT; + } + + mesh->current_patch = NULL; +} + +/** + * cairo_mesh_pattern_curve_to: + * @pattern: a #cairo_pattern_t + * @x1: the X coordinate of the first control point + * @y1: the Y coordinate of the first control point + * @x2: the X coordinate of the second control point + * @y2: the Y coordinate of the second control point + * @x3: the X coordinate of the end of the curve + * @y3: the Y coordinate of the end of the curve + * + * Adds a cubic Bézier spline to the current patch from the current + * point to position (@x3, @y3) in pattern-space coordinates, using + * (@x1, @y1) and (@x2, @y2) as the control points. + * + * If the current patch has no current point before the call to + * cairo_mesh_pattern_curve_to(), this function will behave as if + * preceded by a call to cairo_mesh_pattern_move_to(@pattern, @x1, + * @y1). + * + * After this call the current point will be (@x3, @y3). + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @pattern has no current + * patch or the current patch already has 4 sides, @pattern will be + * put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_curve_to (cairo_pattern_t *pattern, + double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + cairo_mesh_pattern_t *mesh; + int current_point, i, j; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + if (unlikely (!mesh->current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + if (unlikely (mesh->current_side == 3)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + if (mesh->current_side == -2) + cairo_mesh_pattern_move_to (pattern, x1, y1); + + assert (mesh->current_side >= -1); + assert (pattern->status == CAIRO_STATUS_SUCCESS); + + mesh->current_side++; + + current_point = 3 * mesh->current_side; + + current_point++; + i = mesh_path_point_i[current_point]; + j = mesh_path_point_j[current_point]; + mesh->current_patch->points[i][j].x = x1; + mesh->current_patch->points[i][j].y = y1; + + current_point++; + i = mesh_path_point_i[current_point]; + j = mesh_path_point_j[current_point]; + mesh->current_patch->points[i][j].x = x2; + mesh->current_patch->points[i][j].y = y2; + + current_point++; + if (current_point < 12) { + i = mesh_path_point_i[current_point]; + j = mesh_path_point_j[current_point]; + mesh->current_patch->points[i][j].x = x3; + mesh->current_patch->points[i][j].y = y3; + } +} +slim_hidden_def (cairo_mesh_pattern_curve_to); + +/** + * cairo_mesh_pattern_line_to: + * @pattern: a #cairo_pattern_t + * @x: the X coordinate of the end of the new line + * @y: the Y coordinate of the end of the new line + * + * Adds a line to the current patch from the current point to position + * (@x, @y) in pattern-space coordinates. + * + * If there is no current point before the call to + * cairo_mesh_pattern_line_to() this function will behave as + * cairo_mesh_pattern_move_to(@pattern, @x, @y). + * + * After this call the current point will be (@x, @y). + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @pattern has no current + * patch or the current patch already has 4 sides, @pattern will be + * put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_line_to (cairo_pattern_t *pattern, + double x, double y) +{ + cairo_mesh_pattern_t *mesh; + cairo_point_double_t last_point; + int last_point_idx, i, j; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + if (unlikely (!mesh->current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + if (unlikely (mesh->current_side == 3)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + if (mesh->current_side == -2) { + cairo_mesh_pattern_move_to (pattern, x, y); + return; + } + + last_point_idx = 3 * (mesh->current_side + 1); + i = mesh_path_point_i[last_point_idx]; + j = mesh_path_point_j[last_point_idx]; + + last_point = mesh->current_patch->points[i][j]; + + cairo_mesh_pattern_curve_to (pattern, + (2 * last_point.x + x) * (1. / 3), + (2 * last_point.y + y) * (1. / 3), + (last_point.x + 2 * x) * (1. / 3), + (last_point.y + 2 * y) * (1. / 3), + x, y); +} +slim_hidden_def (cairo_mesh_pattern_line_to); + +/** + * cairo_mesh_pattern_move_to: + * @pattern: a #cairo_pattern_t + * @x: the X coordinate of the new position + * @y: the Y coordinate of the new position + * + * Define the first point of the current patch in a mesh pattern. + * + * After this call the current point will be (@x, @y). + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @pattern has no current + * patch or the current patch already has at least one side, @pattern + * will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_move_to (cairo_pattern_t *pattern, + double x, double y) +{ + cairo_mesh_pattern_t *mesh; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + if (unlikely (!mesh->current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + if (unlikely (mesh->current_side >= 0)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + mesh->current_side = -1; + mesh->current_patch->points[0][0].x = x; + mesh->current_patch->points[0][0].y = y; +} +slim_hidden_def (cairo_mesh_pattern_move_to); + +/** + * cairo_mesh_pattern_set_control_point: + * @pattern: a #cairo_pattern_t + * @point_num: the control point to set the position for + * @x: the X coordinate of the control point + * @y: the Y coordinate of the control point + * + * Set an internal control point of the current patch. + * + * Valid values for @point_num are from 0 to 3 and identify the + * control points as explained in cairo_pattern_create_mesh(). + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @point_num is not valid, + * @pattern will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_INDEX. If @pattern has no current patch, + * @pattern will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_set_control_point (cairo_pattern_t *pattern, + unsigned int point_num, + double x, + double y) +{ + cairo_mesh_pattern_t *mesh; + int i, j; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + if (unlikely (point_num > 3)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_INDEX); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + if (unlikely (!mesh->current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + i = mesh_control_point_i[point_num]; + j = mesh_control_point_j[point_num]; + + mesh->current_patch->points[i][j].x = x; + mesh->current_patch->points[i][j].y = y; + mesh->has_control_point[point_num] = TRUE; +} + +/* make room for at least one more color stop */ +static cairo_status_t +_cairo_pattern_gradient_grow (cairo_gradient_pattern_t *pattern) +{ + cairo_gradient_stop_t *new_stops; + int old_size = pattern->stops_size; + int embedded_size = ARRAY_LENGTH (pattern->stops_embedded); + int new_size = 2 * MAX (old_size, 4); + + /* we have a local buffer at pattern->stops_embedded. try to fulfill the request + * from there. */ + if (old_size < embedded_size) { + pattern->stops = pattern->stops_embedded; + pattern->stops_size = embedded_size; + return CAIRO_STATUS_SUCCESS; + } + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + assert (pattern->n_stops <= pattern->stops_size); + + if (pattern->stops == pattern->stops_embedded) { + new_stops = _cairo_malloc_ab (new_size, sizeof (cairo_gradient_stop_t)); + if (new_stops) + memcpy (new_stops, pattern->stops, old_size * sizeof (cairo_gradient_stop_t)); + } else { + new_stops = _cairo_realloc_ab (pattern->stops, + new_size, + sizeof (cairo_gradient_stop_t)); + } + + if (unlikely (new_stops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pattern->stops = new_stops; + pattern->stops_size = new_size; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_mesh_pattern_set_corner_color (cairo_mesh_pattern_t *mesh, + unsigned int corner_num, + double red, double green, double blue, + double alpha) +{ + cairo_color_t *color; + + assert (mesh->current_patch); + assert (corner_num <= 3); + + color = &mesh->current_patch->colors[corner_num]; + color->red = red; + color->green = green; + color->blue = blue; + color->alpha = alpha; + + color->red_short = _cairo_color_double_to_short (red); + color->green_short = _cairo_color_double_to_short (green); + color->blue_short = _cairo_color_double_to_short (blue); + color->alpha_short = _cairo_color_double_to_short (alpha); + + mesh->has_color[corner_num] = TRUE; +} + +/** + * cairo_mesh_pattern_set_corner_color_rgb: + * @pattern: a #cairo_pattern_t + * @corner_num: the corner to set the color for + * @red: red component of color + * @green: green component of color + * @blue: blue component of color + * + * Sets the color of a corner of the current patch in a mesh pattern. + * + * The color is specified in the same way as in cairo_set_source_rgb(). + * + * Valid values for @corner_num are from 0 to 3 and identify the + * corners as explained in cairo_pattern_create_mesh(). + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @corner_num is not valid, + * @pattern will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_INDEX. If @pattern has no current patch, + * @pattern will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_set_corner_color_rgb (cairo_pattern_t *pattern, + unsigned int corner_num, + double red, double green, double blue) +{ + cairo_mesh_pattern_set_corner_color_rgba (pattern, corner_num, red, green, blue, 1.0); +} + +/** + * cairo_mesh_pattern_set_corner_color_rgba: + * @pattern: a #cairo_pattern_t + * @corner_num: the corner to set the color for + * @red: red component of color + * @green: green component of color + * @blue: blue component of color + * @alpha: alpha component of color + * + * Sets the color of a corner of the current patch in a mesh pattern. + * + * The color is specified in the same way as in cairo_set_source_rgba(). + * + * Valid values for @corner_num are from 0 to 3 and identify the + * corners as explained in cairo_pattern_create_mesh(). + * + * Note: If @pattern is not a mesh pattern then @pattern will be put + * into an error status with a status of + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. If @corner_num is not valid, + * @pattern will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_INDEX. If @pattern has no current patch, + * @pattern will be put into an error status with a status of + * %CAIRO_STATUS_INVALID_MESH_CONSTRUCTION. + * + * Since: 1.12 + **/ +void +cairo_mesh_pattern_set_corner_color_rgba (cairo_pattern_t *pattern, + unsigned int corner_num, + double red, double green, double blue, + double alpha) +{ + cairo_mesh_pattern_t *mesh; + + if (unlikely (pattern->status)) + return; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + if (unlikely (corner_num > 3)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_INDEX); + return; + } + + mesh = (cairo_mesh_pattern_t *) pattern; + if (unlikely (!mesh->current_patch)) { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_INVALID_MESH_CONSTRUCTION); + return; + } + + red = _cairo_restrict_value (red, 0.0, 1.0); + green = _cairo_restrict_value (green, 0.0, 1.0); + blue = _cairo_restrict_value (blue, 0.0, 1.0); + alpha = _cairo_restrict_value (alpha, 0.0, 1.0); + + _cairo_mesh_pattern_set_corner_color (mesh, corner_num, red, green, blue, alpha); +} +slim_hidden_def (cairo_mesh_pattern_set_corner_color_rgba); + +static void +_cairo_pattern_add_color_stop (cairo_gradient_pattern_t *pattern, + double offset, + double red, + double green, + double blue, + double alpha) +{ + cairo_gradient_stop_t *stops; + unsigned int i; + + if (pattern->n_stops >= pattern->stops_size) { + cairo_status_t status = _cairo_pattern_gradient_grow (pattern); + if (unlikely (status)) { + status = _cairo_pattern_set_error (&pattern->base, status); + return; + } + } + + stops = pattern->stops; + + for (i = 0; i < pattern->n_stops; i++) + { + if (offset < stops[i].offset) + { + memmove (&stops[i + 1], &stops[i], + sizeof (cairo_gradient_stop_t) * (pattern->n_stops - i)); + + break; + } + } + + stops[i].offset = offset; + + stops[i].color.red = red; + stops[i].color.green = green; + stops[i].color.blue = blue; + stops[i].color.alpha = alpha; + + stops[i].color.red_short = _cairo_color_double_to_short (red); + stops[i].color.green_short = _cairo_color_double_to_short (green); + stops[i].color.blue_short = _cairo_color_double_to_short (blue); + stops[i].color.alpha_short = _cairo_color_double_to_short (alpha); + + pattern->n_stops++; +} + +/** + * cairo_pattern_add_color_stop_rgb: + * @pattern: a #cairo_pattern_t + * @offset: an offset in the range [0.0 .. 1.0] + * @red: red component of color + * @green: green component of color + * @blue: blue component of color + * + * Adds an opaque color stop to a gradient pattern. The offset + * specifies the location along the gradient's control vector. For + * example, a linear gradient's control vector is from (x0,y0) to + * (x1,y1) while a radial gradient's control vector is from any point + * on the start circle to the corresponding point on the end circle. + * + * The color is specified in the same way as in cairo_set_source_rgb(). + * + * If two (or more) stops are specified with identical offset values, + * they will be sorted according to the order in which the stops are + * added, (stops added earlier will compare less than stops added + * later). This can be useful for reliably making sharp color + * transitions instead of the typical blend. + * + * + * Note: If the pattern is not a gradient pattern, (eg. a linear or + * radial pattern), then the pattern will be put into an error status + * with a status of %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. + * + * Since: 1.0 + **/ +void +cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern, + double offset, + double red, + double green, + double blue) +{ + cairo_pattern_add_color_stop_rgba (pattern, offset, red, green, blue, 1.0); +} + +/** + * cairo_pattern_add_color_stop_rgba: + * @pattern: a #cairo_pattern_t + * @offset: an offset in the range [0.0 .. 1.0] + * @red: red component of color + * @green: green component of color + * @blue: blue component of color + * @alpha: alpha component of color + * + * Adds a translucent color stop to a gradient pattern. The offset + * specifies the location along the gradient's control vector. For + * example, a linear gradient's control vector is from (x0,y0) to + * (x1,y1) while a radial gradient's control vector is from any point + * on the start circle to the corresponding point on the end circle. + * + * The color is specified in the same way as in cairo_set_source_rgba(). + * + * If two (or more) stops are specified with identical offset values, + * they will be sorted according to the order in which the stops are + * added, (stops added earlier will compare less than stops added + * later). This can be useful for reliably making sharp color + * transitions instead of the typical blend. + * + * Note: If the pattern is not a gradient pattern, (eg. a linear or + * radial pattern), then the pattern will be put into an error status + * with a status of %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. + * + * Since: 1.0 + **/ +void +cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern, + double offset, + double red, + double green, + double blue, + double alpha) +{ + if (pattern->status) + return; + + if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && + pattern->type != CAIRO_PATTERN_TYPE_RADIAL) + { + _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + return; + } + + offset = _cairo_restrict_value (offset, 0.0, 1.0); + red = _cairo_restrict_value (red, 0.0, 1.0); + green = _cairo_restrict_value (green, 0.0, 1.0); + blue = _cairo_restrict_value (blue, 0.0, 1.0); + alpha = _cairo_restrict_value (alpha, 0.0, 1.0); + + _cairo_pattern_add_color_stop ((cairo_gradient_pattern_t *) pattern, + offset, red, green, blue, alpha); +} +slim_hidden_def (cairo_pattern_add_color_stop_rgba); + +/** + * cairo_pattern_set_matrix: + * @pattern: a #cairo_pattern_t + * @matrix: a #cairo_matrix_t + * + * Sets the pattern's transformation matrix to @matrix. This matrix is + * a transformation from user space to pattern space. + * + * When a pattern is first created it always has the identity matrix + * for its transformation matrix, which means that pattern space is + * initially identical to user space. + * + * Important: Please note that the direction of this transformation + * matrix is from user space to pattern space. This means that if you + * imagine the flow from a pattern to user space (and on to device + * space), then coordinates in that flow will be transformed by the + * inverse of the pattern matrix. + * + * For example, if you want to make a pattern appear twice as large as + * it does by default the correct code to use is: + * + * + * cairo_matrix_init_scale (&matrix, 0.5, 0.5); + * cairo_pattern_set_matrix (pattern, &matrix); + * + * + * Meanwhile, using values of 2.0 rather than 0.5 in the code above + * would cause the pattern to appear at half of its default size. + * + * Also, please note the discussion of the user-space locking + * semantics of cairo_set_source(). + * + * Since: 1.0 + **/ +void +cairo_pattern_set_matrix (cairo_pattern_t *pattern, + const cairo_matrix_t *matrix) +{ + cairo_matrix_t inverse; + cairo_status_t status; + + if (pattern->status) + return; + + if (memcmp (&pattern->matrix, matrix, sizeof (cairo_matrix_t)) == 0) + return; + + pattern->matrix = *matrix; + _cairo_pattern_notify_observers (pattern, CAIRO_PATTERN_NOTIFY_MATRIX); + + inverse = *matrix; + status = cairo_matrix_invert (&inverse); + if (unlikely (status)) + status = _cairo_pattern_set_error (pattern, status); +} +slim_hidden_def (cairo_pattern_set_matrix); + +/** + * cairo_pattern_get_matrix: + * @pattern: a #cairo_pattern_t + * @matrix: return value for the matrix + * + * Stores the pattern's transformation matrix into @matrix. + * + * Since: 1.0 + **/ +void +cairo_pattern_get_matrix (cairo_pattern_t *pattern, cairo_matrix_t *matrix) +{ + *matrix = pattern->matrix; +} + +/** + * cairo_pattern_set_filter: + * @pattern: a #cairo_pattern_t + * @filter: a #cairo_filter_t describing the filter to use for resizing + * the pattern + * + * Sets the filter to be used for resizing when using this pattern. + * See #cairo_filter_t for details on each filter. + * + * * Note that you might want to control filtering even when you do not + * have an explicit #cairo_pattern_t object, (for example when using + * cairo_set_source_surface()). In these cases, it is convenient to + * use cairo_get_source() to get access to the pattern that cairo + * creates implicitly. For example: + * + * + * cairo_set_source_surface (cr, image, x, y); + * cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + * + * + * Since: 1.0 + **/ +void +cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter) +{ + if (pattern->status) + return; + + pattern->filter = filter; + _cairo_pattern_notify_observers (pattern, CAIRO_PATTERN_NOTIFY_FILTER); +} + +/** + * cairo_pattern_get_filter: + * @pattern: a #cairo_pattern_t + * + * Gets the current filter for a pattern. See #cairo_filter_t + * for details on each filter. + * + * Return value: the current filter used for resizing the pattern. + * + * Since: 1.0 + **/ +cairo_filter_t +cairo_pattern_get_filter (cairo_pattern_t *pattern) +{ + return pattern->filter; +} + +/** + * cairo_pattern_set_extend: + * @pattern: a #cairo_pattern_t + * @extend: a #cairo_extend_t describing how the area outside of the + * pattern will be drawn + * + * Sets the mode to be used for drawing outside the area of a pattern. + * See #cairo_extend_t for details on the semantics of each extend + * strategy. + * + * The default extend mode is %CAIRO_EXTEND_NONE for surface patterns + * and %CAIRO_EXTEND_PAD for gradient patterns. + * + * Since: 1.0 + **/ +void +cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend) +{ + if (pattern->status) + return; + + pattern->extend = extend; + _cairo_pattern_notify_observers (pattern, CAIRO_PATTERN_NOTIFY_EXTEND); +} + +/** + * cairo_pattern_get_extend: + * @pattern: a #cairo_pattern_t + * + * Gets the current extend mode for a pattern. See #cairo_extend_t + * for details on the semantics of each extend strategy. + * + * Return value: the current extend strategy used for drawing the + * pattern. + * + * Since: 1.0 + **/ +cairo_extend_t +cairo_pattern_get_extend (cairo_pattern_t *pattern) +{ + return pattern->extend; +} +slim_hidden_def (cairo_pattern_get_extend); + +void +_cairo_pattern_pretransform (cairo_pattern_t *pattern, + const cairo_matrix_t *ctm) +{ + if (pattern->status) + return; + + cairo_matrix_multiply (&pattern->matrix, &pattern->matrix, ctm); +} + +void +_cairo_pattern_transform (cairo_pattern_t *pattern, + const cairo_matrix_t *ctm_inverse) +{ + if (pattern->status) + return; + + cairo_matrix_multiply (&pattern->matrix, ctm_inverse, &pattern->matrix); +} + +static cairo_bool_t +_linear_pattern_is_degenerate (const cairo_linear_pattern_t *linear) +{ + return fabs (linear->pd1.x - linear->pd2.x) < DBL_EPSILON && + fabs (linear->pd1.y - linear->pd2.y) < DBL_EPSILON; +} + +static cairo_bool_t +_radial_pattern_is_degenerate (const cairo_radial_pattern_t *radial) +{ + /* A radial pattern is considered degenerate if it can be + * represented as a solid or clear pattern. This corresponds to + * one of the two cases: + * + * 1) The radii are both very small: + * |dr| < DBL_EPSILON && min (r0, r1) < DBL_EPSILON + * + * 2) The two circles have about the same radius and are very + * close to each other (approximately a cylinder gradient that + * doesn't move with the parameter): + * |dr| < DBL_EPSILON && max (|dx|, |dy|) < 2 * DBL_EPSILON + * + * These checks are consistent with the assumptions used in + * _cairo_radial_pattern_box_to_parameter (). + */ + + return fabs (radial->cd1.radius - radial->cd2.radius) < DBL_EPSILON && + (MIN (radial->cd1.radius, radial->cd2.radius) < DBL_EPSILON || + MAX (fabs (radial->cd1.center.x - radial->cd2.center.x), + fabs (radial->cd1.center.y - radial->cd2.center.y)) < 2 * DBL_EPSILON); +} + +static void +_cairo_linear_pattern_box_to_parameter (const cairo_linear_pattern_t *linear, + double x0, double y0, + double x1, double y1, + double range[2]) +{ + double t0, tdx, tdy; + double p1x, p1y, pdx, pdy, invsqnorm; + + assert (! _linear_pattern_is_degenerate (linear)); + + /* + * Linear gradients are othrogonal to the line passing through + * their extremes. Because of convexity, the parameter range can + * be computed as the convex hull (one the real line) of the + * parameter values of the 4 corners of the box. + * + * The parameter value t for a point (x,y) can be computed as: + * + * t = (p2 - p1) . (x,y) / |p2 - p1|^2 + * + * t0 is the t value for the top left corner + * tdx is the difference between left and right corners + * tdy is the difference between top and bottom corners + */ + + p1x = linear->pd1.x; + p1y = linear->pd1.y; + pdx = linear->pd2.x - p1x; + pdy = linear->pd2.y - p1y; + invsqnorm = 1.0 / (pdx * pdx + pdy * pdy); + pdx *= invsqnorm; + pdy *= invsqnorm; + + t0 = (x0 - p1x) * pdx + (y0 - p1y) * pdy; + tdx = (x1 - x0) * pdx; + tdy = (y1 - y0) * pdy; + + /* + * Because of the linearity of the t value, tdx can simply be + * added the t0 to move along the top edge. After this, range[0] + * and range[1] represent the parameter range for the top edge, so + * extending it to include the whole box simply requires adding + * tdy to the correct extreme. + */ + + range[0] = range[1] = t0; + if (tdx < 0) + range[0] += tdx; + else + range[1] += tdx; + + if (tdy < 0) + range[0] += tdy; + else + range[1] += tdy; +} + +static cairo_bool_t +_extend_range (double range[2], double value, cairo_bool_t valid) +{ + if (!valid) + range[0] = range[1] = value; + else if (value < range[0]) + range[0] = value; + else if (value > range[1]) + range[1] = value; + + return TRUE; +} + +/* + * _cairo_radial_pattern_focus_is_inside: + * + * Returns %TRUE if and only if the focus point exists and is + * contained in one of the two extreme circles. This condition is + * equivalent to one of the two extreme circles being completely + * contained in the other one. + * + * Note: if the focus is on the border of one of the two circles (in + * which case the circles are tangent in the focus point), it is not + * considered as contained in the circle, hence this function returns + * %FALSE. + * + */ +cairo_bool_t +_cairo_radial_pattern_focus_is_inside (const cairo_radial_pattern_t *radial) +{ + double cx, cy, cr, dx, dy, dr; + + cx = radial->cd1.center.x; + cy = radial->cd1.center.y; + cr = radial->cd1.radius; + dx = radial->cd2.center.x - cx; + dy = radial->cd2.center.y - cy; + dr = radial->cd2.radius - cr; + + return dx*dx + dy*dy < dr*dr; +} + +static void +_cairo_radial_pattern_box_to_parameter (const cairo_radial_pattern_t *radial, + double x0, double y0, + double x1, double y1, + double tolerance, + double range[2]) +{ + double cx, cy, cr, dx, dy, dr; + double a, x_focus, y_focus; + double mindr, minx, miny, maxx, maxy; + cairo_bool_t valid; + + assert (! _radial_pattern_is_degenerate (radial)); + assert (x0 < x1); + assert (y0 < y1); + + tolerance = MAX (tolerance, DBL_EPSILON); + + range[0] = range[1] = 0; + valid = FALSE; + + x_focus = y_focus = 0; /* silence gcc */ + + cx = radial->cd1.center.x; + cy = radial->cd1.center.y; + cr = radial->cd1.radius; + dx = radial->cd2.center.x - cx; + dy = radial->cd2.center.y - cy; + dr = radial->cd2.radius - cr; + + /* translate by -(cx, cy) to simplify computations */ + x0 -= cx; + y0 -= cy; + x1 -= cx; + y1 -= cy; + + /* enlarge boundaries slightly to avoid rounding problems in the + * parameter range computation */ + x0 -= DBL_EPSILON; + y0 -= DBL_EPSILON; + x1 += DBL_EPSILON; + y1 += DBL_EPSILON; + + /* enlarge boundaries even more to avoid rounding problems when + * testing if a point belongs to the box */ + minx = x0 - DBL_EPSILON; + miny = y0 - DBL_EPSILON; + maxx = x1 + DBL_EPSILON; + maxy = y1 + DBL_EPSILON; + + /* we dont' allow negative radiuses, so we will be checking that + * t*dr >= mindr to consider t valid */ + mindr = -(cr + DBL_EPSILON); + + /* + * After the previous transformations, the start circle is + * centered in the origin and has radius cr. A 1-unit change in + * the t parameter corresponds to dx,dy,dr changes in the x,y,r of + * the circle (center coordinates, radius). + * + * To compute the minimum range needed to correctly draw the + * pattern, we start with an empty range and extend it to include + * the circles touching the bounding box or within it. + */ + + /* + * Focus, the point where the circle has radius == 0. + * + * r = cr + t * dr = 0 + * t = -cr / dr + * + * If the radius is constant (dr == 0) there is no focus (the + * gradient represents a cylinder instead of a cone). + */ + if (fabs (dr) >= DBL_EPSILON) { + double t_focus; + + t_focus = -cr / dr; + x_focus = t_focus * dx; + y_focus = t_focus * dy; + if (minx <= x_focus && x_focus <= maxx && + miny <= y_focus && y_focus <= maxy) + { + valid = _extend_range (range, t_focus, valid); + } + } + + /* + * Circles externally tangent to box edges. + * + * All circles have center in (dx, dy) * t + * + * If the circle is tangent to the line defined by the edge of the + * box, then at least one of the following holds true: + * + * (dx*t) + (cr + dr*t) == x0 (left edge) + * (dx*t) - (cr + dr*t) == x1 (right edge) + * (dy*t) + (cr + dr*t) == y0 (top edge) + * (dy*t) - (cr + dr*t) == y1 (bottom edge) + * + * The solution is only valid if the tangent point is actually on + * the edge, i.e. if its y coordinate is in [y0,y1] for left/right + * edges and if its x coordinate is in [x0,x1] for top/bottom + * edges. + * + * For the first equation: + * + * (dx + dr) * t = x0 - cr + * t = (x0 - cr) / (dx + dr) + * y = dy * t + * + * in the code this becomes: + * + * t_edge = (num) / (den) + * v = (delta) * t_edge + * + * If the denominator in t is 0, the pattern is tangent to a line + * parallel to the edge under examination. The corner-case where + * the boundary line is the same as the edge is handled by the + * focus point case and/or by the a==0 case. + */ +#define T_EDGE(num,den,delta,lower,upper) \ + if (fabs (den) >= DBL_EPSILON) { \ + double t_edge, v; \ + \ + t_edge = (num) / (den); \ + v = t_edge * (delta); \ + if (t_edge * dr >= mindr && (lower) <= v && v <= (upper)) \ + valid = _extend_range (range, t_edge, valid); \ + } + + /* circles tangent (externally) to left/right/top/bottom edge */ + T_EDGE (x0 - cr, dx + dr, dy, miny, maxy); + T_EDGE (x1 + cr, dx - dr, dy, miny, maxy); + T_EDGE (y0 - cr, dy + dr, dx, minx, maxx); + T_EDGE (y1 + cr, dy - dr, dx, minx, maxx); + +#undef T_EDGE + + /* + * Circles passing through a corner. + * + * A circle passing through the point (x,y) satisfies: + * + * (x-t*dx)^2 + (y-t*dy)^2 == (cr + t*dr)^2 + * + * If we set: + * a = dx^2 + dy^2 - dr^2 + * b = x*dx + y*dy + cr*dr + * c = x^2 + y^2 - cr^2 + * we have: + * a*t^2 - 2*b*t + c == 0 + */ + a = dx * dx + dy * dy - dr * dr; + if (fabs (a) < DBL_EPSILON * DBL_EPSILON) { + double b, maxd2; + + /* Ensure that gradients with both a and dr small are + * considered degenerate. + * The floating point version of the degeneracy test implemented + * in _radial_pattern_is_degenerate() is: + * + * 1) The circles are practically the same size: + * |dr| < DBL_EPSILON + * AND + * 2a) The circles are both very small: + * min (r0, r1) < DBL_EPSILON + * OR + * 2b) The circles are very close to each other: + * max (|dx|, |dy|) < 2 * DBL_EPSILON + * + * Assuming that the gradient is not degenerate, we want to + * show that |a| < DBL_EPSILON^2 implies |dr| >= DBL_EPSILON. + * + * If the gradient is not degenerate yet it has |dr| < + * DBL_EPSILON, (2b) is false, thus: + * + * max (|dx|, |dy|) >= 2*DBL_EPSILON + * which implies: + * 4*DBL_EPSILON^2 <= max (|dx|, |dy|)^2 <= dx^2 + dy^2 + * + * From the definition of a, we get: + * a = dx^2 + dy^2 - dr^2 < DBL_EPSILON^2 + * dx^2 + dy^2 - DBL_EPSILON^2 < dr^2 + * 3*DBL_EPSILON^2 < dr^2 + * + * which is inconsistent with the hypotheses, thus |dr| < + * DBL_EPSILON is false or the gradient is degenerate. + */ + assert (fabs (dr) >= DBL_EPSILON); + + /* + * If a == 0, all the circles are tangent to a line in the + * focus point. If this line is within the box extents, we + * should add the circle with infinite radius, but this would + * make the range unbounded, so we add the smallest circle whose + * distance to the desired (degenerate) circle within the + * bounding box does not exceed tolerance. + * + * The equation of the line is b==0, i.e.: + * x*dx + y*dy + cr*dr == 0 + * + * We compute the intersection of the line with the box and + * keep the intersection with maximum square distance (maxd2) + * from the focus point. + * + * In the code the intersection is represented in another + * coordinate system, whose origin is the focus point and + * which has a u,v axes, which are respectively orthogonal and + * parallel to the edge being intersected. + * + * The intersection is valid only if it belongs to the box, + * otherwise it is ignored. + * + * For example: + * + * y = y0 + * x*dx + y0*dy + cr*dr == 0 + * x = -(y0*dy + cr*dr) / dx + * + * which in (u,v) is: + * u = y0 - y_focus + * v = -(y0*dy + cr*dr) / dx - x_focus + * + * In the code: + * u = (edge) - (u_origin) + * v = -((edge) * (delta) + cr*dr) / (den) - v_focus + */ +#define T_EDGE(edge,delta,den,lower,upper,u_origin,v_origin) \ + if (fabs (den) >= DBL_EPSILON) { \ + double v; \ + \ + v = -((edge) * (delta) + cr * dr) / (den); \ + if ((lower) <= v && v <= (upper)) { \ + double u, d2; \ + \ + u = (edge) - (u_origin); \ + v -= (v_origin); \ + d2 = u*u + v*v; \ + if (maxd2 < d2) \ + maxd2 = d2; \ + } \ + } + + maxd2 = 0; + + /* degenerate circles (lines) passing through each edge */ + T_EDGE (y0, dy, dx, minx, maxx, y_focus, x_focus); + T_EDGE (y1, dy, dx, minx, maxx, y_focus, x_focus); + T_EDGE (x0, dx, dy, miny, maxy, x_focus, y_focus); + T_EDGE (x1, dx, dy, miny, maxy, x_focus, y_focus); + +#undef T_EDGE + + /* + * The limit circle can be transformed rigidly to the y=0 line + * and the circles tangent to it in (0,0) are: + * + * x^2 + (y-r)^2 = r^2 <=> x^2 + y^2 - 2*y*r = 0 + * + * y is the distance from the line, in our case tolerance; + * x is the distance along the line, i.e. sqrt(maxd2), + * so: + * + * r = cr + dr * t = (maxd2 + tolerance^2) / (2*tolerance) + * t = (r - cr) / dr = + * (maxd2 + tolerance^2 - 2*tolerance*cr) / (2*tolerance*dr) + */ + if (maxd2 > 0) { + double t_limit = maxd2 + tolerance*tolerance - 2*tolerance*cr; + t_limit /= 2 * tolerance * dr; + valid = _extend_range (range, t_limit, valid); + } + + /* + * Nondegenerate, nonlimit circles passing through the corners. + * + * a == 0 && a*t^2 - 2*b*t + c == 0 + * + * t = c / (2*b) + * + * The b == 0 case has just been handled, so we only have to + * compute this if b != 0. + */ +#define T_CORNER(x,y) \ + b = (x) * dx + (y) * dy + cr * dr; \ + if (fabs (b) >= DBL_EPSILON) { \ + double t_corner; \ + double x2 = (x) * (x); \ + double y2 = (y) * (y); \ + double cr2 = (cr) * (cr); \ + double c = x2 + y2 - cr2; \ + \ + t_corner = 0.5 * c / b; \ + if (t_corner * dr >= mindr) \ + valid = _extend_range (range, t_corner, valid); \ + } + + /* circles touching each corner */ + T_CORNER (x0, y0); + T_CORNER (x0, y1); + T_CORNER (x1, y0); + T_CORNER (x1, y1); + +#undef T_CORNER + } else { + double inva, b, c, d; + + inva = 1 / a; + + /* + * Nondegenerate, nonlimit circles passing through the corners. + * + * a != 0 && a*t^2 - 2*b*t + c == 0 + * + * t = (b +- sqrt (b*b - a*c)) / a + * + * If the argument of sqrt() is negative, then no circle + * passes through the corner. + */ +#define T_CORNER(x,y) \ + b = (x) * dx + (y) * dy + cr * dr; \ + c = (x) * (x) + (y) * (y) - cr * cr; \ + d = b * b - a * c; \ + if (d >= 0) { \ + double t_corner; \ + \ + d = sqrt (d); \ + t_corner = (b + d) * inva; \ + if (t_corner * dr >= mindr) \ + valid = _extend_range (range, t_corner, valid); \ + t_corner = (b - d) * inva; \ + if (t_corner * dr >= mindr) \ + valid = _extend_range (range, t_corner, valid); \ + } + + /* circles touching each corner */ + T_CORNER (x0, y0); + T_CORNER (x0, y1); + T_CORNER (x1, y0); + T_CORNER (x1, y1); + +#undef T_CORNER + } +} + +/** + * _cairo_gradient_pattern_box_to_parameter: + * + * Compute a interpolation range sufficient to draw (within the given + * tolerance) the gradient in the given box getting the same result as + * using the (-inf, +inf) range. + * + * Assumes that the pattern is not degenerate. This can be guaranteed + * by simplifying it to a solid clear if _cairo_pattern_is_clear or to + * a solid color if _cairo_gradient_pattern_is_solid. + * + * The range isn't guaranteed to be minimal, but it tries to. + **/ +void +_cairo_gradient_pattern_box_to_parameter (const cairo_gradient_pattern_t *gradient, + double x0, double y0, + double x1, double y1, + double tolerance, + double out_range[2]) +{ + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + _cairo_linear_pattern_box_to_parameter ((cairo_linear_pattern_t *) gradient, + x0, y0, x1, y1, out_range); + } else { + _cairo_radial_pattern_box_to_parameter ((cairo_radial_pattern_t *) gradient, + x0, y0, x1, y1, tolerance, out_range); + } +} + +/** + * _cairo_gradient_pattern_interpolate: + * + * Interpolate between the start and end objects of linear or radial + * gradients. The interpolated object is stored in out_circle, with + * the radius being zero in the linear gradient case. + **/ +void +_cairo_gradient_pattern_interpolate (const cairo_gradient_pattern_t *gradient, + double t, + cairo_circle_double_t *out_circle) +{ + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + +#define lerp(a,b) (a)*(1-t) + (b)*t + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + out_circle->center.x = lerp (linear->pd1.x, linear->pd2.x); + out_circle->center.y = lerp (linear->pd1.y, linear->pd2.y); + out_circle->radius = 0; + } else { + cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) gradient; + out_circle->center.x = lerp (radial->cd1.center.x, radial->cd2.center.x); + out_circle->center.y = lerp (radial->cd1.center.y, radial->cd2.center.y); + out_circle->radius = lerp (radial->cd1.radius , radial->cd2.radius); + } + +#undef lerp +} + + +/** + * _cairo_gradient_pattern_fit_to_range: + * + * Scale the extremes of a gradient to guarantee that the coordinates + * and their deltas are within the range (-max_value, max_value). The + * new extremes are stored in out_circle. + * + * The pattern matrix is scaled to guarantee that the aspect of the + * gradient is the same and the result is stored in out_matrix. + * + **/ +void +_cairo_gradient_pattern_fit_to_range (const cairo_gradient_pattern_t *gradient, + double max_value, + cairo_matrix_t *out_matrix, + cairo_circle_double_t out_circle[2]) +{ + double dim; + + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + + out_circle[0].center = linear->pd1; + out_circle[0].radius = 0; + out_circle[1].center = linear->pd2; + out_circle[1].radius = 0; + + dim = fabs (linear->pd1.x); + dim = MAX (dim, fabs (linear->pd1.y)); + dim = MAX (dim, fabs (linear->pd2.x)); + dim = MAX (dim, fabs (linear->pd2.y)); + dim = MAX (dim, fabs (linear->pd1.x - linear->pd2.x)); + dim = MAX (dim, fabs (linear->pd1.y - linear->pd2.y)); + } else { + cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) gradient; + + out_circle[0] = radial->cd1; + out_circle[1] = radial->cd2; + + dim = fabs (radial->cd1.center.x); + dim = MAX (dim, fabs (radial->cd1.center.y)); + dim = MAX (dim, fabs (radial->cd1.radius)); + dim = MAX (dim, fabs (radial->cd2.center.x)); + dim = MAX (dim, fabs (radial->cd2.center.y)); + dim = MAX (dim, fabs (radial->cd2.radius)); + dim = MAX (dim, fabs (radial->cd1.center.x - radial->cd2.center.x)); + dim = MAX (dim, fabs (radial->cd1.center.y - radial->cd2.center.y)); + dim = MAX (dim, fabs (radial->cd1.radius - radial->cd2.radius)); + } + + if (unlikely (dim > max_value)) { + cairo_matrix_t scale; + + dim = max_value / dim; + + out_circle[0].center.x *= dim; + out_circle[0].center.y *= dim; + out_circle[0].radius *= dim; + out_circle[1].center.x *= dim; + out_circle[1].center.y *= dim; + out_circle[1].radius *= dim; + + cairo_matrix_init_scale (&scale, dim, dim); + cairo_matrix_multiply (out_matrix, &gradient->base.matrix, &scale); + } else { + *out_matrix = gradient->base.matrix; + } +} + +static cairo_bool_t +_gradient_is_clear (const cairo_gradient_pattern_t *gradient, + const cairo_rectangle_int_t *extents) +{ + unsigned int i; + + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + if (gradient->n_stops == 0 || + (gradient->base.extend == CAIRO_EXTEND_NONE && + gradient->stops[0].offset == gradient->stops[gradient->n_stops - 1].offset)) + return TRUE; + + if (gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL) { + /* degenerate radial gradients are clear */ + if (_radial_pattern_is_degenerate ((cairo_radial_pattern_t *) gradient)) + return TRUE; + } else if (gradient->base.extend == CAIRO_EXTEND_NONE) { + /* EXTEND_NONE degenerate linear gradients are clear */ + if (_linear_pattern_is_degenerate ((cairo_linear_pattern_t *) gradient)) + return TRUE; + } + + /* Check if the extents intersect the drawn part of the pattern. */ + if (extents != NULL && + (gradient->base.extend == CAIRO_EXTEND_NONE || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL)) + { + double t[2]; + + _cairo_gradient_pattern_box_to_parameter (gradient, + extents->x, + extents->y, + extents->x + extents->width, + extents->y + extents->height, + DBL_EPSILON, + t); + + if (gradient->base.extend == CAIRO_EXTEND_NONE && + (t[0] >= gradient->stops[gradient->n_stops - 1].offset || + t[1] <= gradient->stops[0].offset)) + { + return TRUE; + } + + if (t[0] == t[1]) + return TRUE; + } + + for (i = 0; i < gradient->n_stops; i++) + if (! CAIRO_COLOR_IS_CLEAR (&gradient->stops[i].color)) + return FALSE; + + return TRUE; +} + +static void +_gradient_color_average (const cairo_gradient_pattern_t *gradient, + cairo_color_t *color) +{ + double delta0, delta1; + double r, g, b, a; + unsigned int i, start = 1, end; + + assert (gradient->n_stops > 0); + assert (gradient->base.extend != CAIRO_EXTEND_NONE); + + if (gradient->n_stops == 1) { + _cairo_color_init_rgba (color, + gradient->stops[0].color.red, + gradient->stops[0].color.green, + gradient->stops[0].color.blue, + gradient->stops[0].color.alpha); + return; + } + + end = gradient->n_stops - 1; + + switch (gradient->base.extend) { + case CAIRO_EXTEND_REPEAT: + /* + * Sa, Sb and Sy, Sz are the first two and last two stops respectively. + * The weight of the first and last stop can be computed as the area of + * the following triangles (taken with height 1, since the whole [0-1] + * will have total weight 1 this way): b*h/2 + * + * + + + * / |\ / | \ + * / | \ / | \ + * / | \ / | \ + * ~~~~~+---+---+---+~~~~~~~+-------+---+---+~~~~~ + * -1+Sz 0 Sa Sb Sy Sz 1 1+Sa + * + * For the first stop: (Sb-(-1+Sz)/2 = (1+Sb-Sz)/2 + * For the last stop: ((1+Sa)-Sy)/2 = (1+Sa-Sy)/2 + * Halving the result is done after summing up all the areas. + */ + delta0 = 1.0 + gradient->stops[1].offset - gradient->stops[end].offset; + delta1 = 1.0 + gradient->stops[0].offset - gradient->stops[end-1].offset; + break; + + case CAIRO_EXTEND_REFLECT: + /* + * Sa, Sb and Sy, Sz are the first two and last two stops respectively. + * The weight of the first and last stop can be computed as the area of + * the following trapezoids (taken with height 1, since the whole [0-1] + * will have total weight 1 this way): (b+B)*h/2 + * + * +-------+ +---+ + * | |\ / | | + * | | \ / | | + * | | \ / | | + * +-------+---+~~~~~~~+-------+---+ + * 0 Sa Sb Sy Sz 1 + * + * For the first stop: (Sa+Sb)/2 + * For the last stop: ((1-Sz) + (1-Sy))/2 = (2-Sy-Sz)/2 + * Halving the result is done after summing up all the areas. + */ + delta0 = gradient->stops[0].offset + gradient->stops[1].offset; + delta1 = 2.0 - gradient->stops[end-1].offset - gradient->stops[end].offset; + break; + + case CAIRO_EXTEND_PAD: + /* PAD is computed as the average of the first and last stop: + * - take both of them with weight 1 (they will be halved + * after the whole sum has been computed). + * - avoid summing any of the inner stops. + */ + delta0 = delta1 = 1.0; + start = end; + break; + + case CAIRO_EXTEND_NONE: + default: + ASSERT_NOT_REACHED; + _cairo_color_init_rgba (color, 0, 0, 0, 0); + return; + } + + r = delta0 * gradient->stops[0].color.red; + g = delta0 * gradient->stops[0].color.green; + b = delta0 * gradient->stops[0].color.blue; + a = delta0 * gradient->stops[0].color.alpha; + + for (i = start; i < end; ++i) { + /* Inner stops weight is the same as the area of the triangle they influence + * (which goes from the stop before to the stop after), again with height 1 + * since the whole must sum up to 1: b*h/2 + * Halving is done after the whole sum has been computed. + */ + double delta = gradient->stops[i+1].offset - gradient->stops[i-1].offset; + r += delta * gradient->stops[i].color.red; + g += delta * gradient->stops[i].color.green; + b += delta * gradient->stops[i].color.blue; + a += delta * gradient->stops[i].color.alpha; + } + + r += delta1 * gradient->stops[end].color.red; + g += delta1 * gradient->stops[end].color.green; + b += delta1 * gradient->stops[end].color.blue; + a += delta1 * gradient->stops[end].color.alpha; + + _cairo_color_init_rgba (color, r * .5, g * .5, b * .5, a * .5); +} + +/** + * _cairo_pattern_alpha_range: + * + * Convenience function to determine the minimum and maximum alpha in + * the drawn part of a pattern (i.e. ignoring clear parts caused by + * extend modes and/or pattern shape). + * + * If not NULL, out_min and out_max will be set respectively to the + * minimum and maximum alpha value of the pattern. + **/ +void +_cairo_pattern_alpha_range (const cairo_pattern_t *pattern, + double *out_min, + double *out_max) +{ + double alpha_min, alpha_max; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: { + const cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; + alpha_min = alpha_max = solid->color.alpha; + break; + } + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: { + const cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; + unsigned int i; + + assert (gradient->n_stops >= 1); + + alpha_min = alpha_max = gradient->stops[0].color.alpha; + for (i = 1; i < gradient->n_stops; i++) { + if (alpha_min > gradient->stops[i].color.alpha) + alpha_min = gradient->stops[i].color.alpha; + else if (alpha_max < gradient->stops[i].color.alpha) + alpha_max = gradient->stops[i].color.alpha; + } + + break; + } + + case CAIRO_PATTERN_TYPE_MESH: { + const cairo_mesh_pattern_t *mesh = (const cairo_mesh_pattern_t *) pattern; + const cairo_mesh_patch_t *patch = _cairo_array_index_const (&mesh->patches, 0); + unsigned int i, j, n = _cairo_array_num_elements (&mesh->patches); + + assert (n >= 1); + + alpha_min = alpha_max = patch[0].colors[0].alpha; + for (i = 0; i < n; i++) { + for (j = 0; j < 4; j++) { + if (patch[i].colors[j].alpha < alpha_min) + alpha_min = patch[i].colors[j].alpha; + else if (patch[i].colors[j].alpha > alpha_max) + alpha_max = patch[i].colors[j].alpha; + } + } + + break; + } + + default: + ASSERT_NOT_REACHED; + /* fall through */ + + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + alpha_min = 0; + alpha_max = 1; + break; + } + + if (out_min) + *out_min = alpha_min; + if (out_max) + *out_max = alpha_max; +} + +/** + * _cairo_mesh_pattern_coord_box: + * + * Convenience function to determine the range of the coordinates of + * the points used to define the patches of the mesh. + * + * This is guaranteed to contain the pattern extents, but might not be + * tight, just like a Bezier curve is always inside the convex hull of + * the control points. + * + * This function cannot be used while the mesh is being constructed. + * + * The function returns TRUE and sets the output parametes to define + * the coodrinate range if the mesh pattern contains at least one + * patch, otherwise it returns FALSE. + **/ +cairo_bool_t +_cairo_mesh_pattern_coord_box (const cairo_mesh_pattern_t *mesh, + double *out_xmin, + double *out_ymin, + double *out_xmax, + double *out_ymax) +{ + const cairo_mesh_patch_t *patch; + unsigned int num_patches, i, j, k; + double x0, y0, x1, y1; + + assert (mesh->current_patch == NULL); + + num_patches = _cairo_array_num_elements (&mesh->patches); + + if (num_patches == 0) + return FALSE; + + patch = _cairo_array_index_const (&mesh->patches, 0); + x0 = x1 = patch->points[0][0].x; + y0 = y1 = patch->points[0][0].y; + + for (i = 0; i < num_patches; i++) { + for (j = 0; j < 4; j++) { + for (k = 0; k < 4; k++) { + x0 = MIN (x0, patch[i].points[j][k].x); + y0 = MIN (y0, patch[i].points[j][k].y); + x1 = MAX (x1, patch[i].points[j][k].x); + y1 = MAX (y1, patch[i].points[j][k].y); + } + } + } + + *out_xmin = x0; + *out_ymin = y0; + *out_xmax = x1; + *out_ymax = y1; + + return TRUE; +} + +/** + * _cairo_gradient_pattern_is_solid: + * + * Convenience function to determine whether a gradient pattern is + * a solid color within the given extents. In this case the color + * argument is initialized to the color the pattern represents. + * This functions doesn't handle completely transparent gradients, + * thus it should be called only after _cairo_pattern_is_clear has + * returned FALSE. + * + * Return value: %TRUE if the pattern is a solid color. + **/ +cairo_bool_t +_cairo_gradient_pattern_is_solid (const cairo_gradient_pattern_t *gradient, + const cairo_rectangle_int_t *extents, + cairo_color_t *color) +{ + unsigned int i; + + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + /* TODO: radial */ + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + if (_linear_pattern_is_degenerate (linear)) { + _gradient_color_average (gradient, color); + return TRUE; + } + + if (gradient->base.extend == CAIRO_EXTEND_NONE) { + double t[2]; + + /* We already know that the pattern is not clear, thus if some + * part of it is clear, the whole is not solid. + */ + + if (extents == NULL) + return FALSE; + + _cairo_linear_pattern_box_to_parameter (linear, + extents->x, + extents->y, + extents->x + extents->width, + extents->y + extents->height, + t); + + if (t[0] < 0.0 || t[1] > 1.0) + return FALSE; + } + } else + return FALSE; + + for (i = 1; i < gradient->n_stops; i++) + if (! _cairo_color_stop_equal (&gradient->stops[0].color, + &gradient->stops[i].color)) + return FALSE; + + _cairo_color_init_rgba (color, + gradient->stops[0].color.red, + gradient->stops[0].color.green, + gradient->stops[0].color.blue, + gradient->stops[0].color.alpha); + + return TRUE; +} + +static cairo_bool_t +_mesh_is_clear (const cairo_mesh_pattern_t *mesh) +{ + double x1, y1, x2, y2; + cairo_bool_t is_valid; + + is_valid = _cairo_mesh_pattern_coord_box (mesh, &x1, &y1, &x2, &y2); + if (!is_valid) + return TRUE; + + if (x2 - x1 < DBL_EPSILON || y2 - y1 < DBL_EPSILON) + return TRUE; + + return FALSE; +} + +/** + * _cairo_pattern_is_opaque_solid: + * + * Convenience function to determine whether a pattern is an opaque + * (alpha==1.0) solid color pattern. This is done by testing whether + * the pattern's alpha value when converted to a byte is 255, so if a + * backend actually supported deep alpha channels this function might + * not do the right thing. + * + * Return value: %TRUE if the pattern is an opaque, solid color. + **/ +cairo_bool_t +_cairo_pattern_is_opaque_solid (const cairo_pattern_t *pattern) +{ + cairo_solid_pattern_t *solid; + + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) + return FALSE; + + solid = (cairo_solid_pattern_t *) pattern; + + return CAIRO_COLOR_IS_OPAQUE (&solid->color); +} + +static cairo_bool_t +_surface_is_opaque (const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *sample) +{ + cairo_rectangle_int_t extents; + + if (pattern->surface->content & CAIRO_CONTENT_ALPHA) + return FALSE; + + if (pattern->base.extend != CAIRO_EXTEND_NONE) + return TRUE; + + if (! _cairo_surface_get_extents (pattern->surface, &extents)) + return TRUE; + + if (sample == NULL) + return FALSE; + + return _cairo_rectangle_contains_rectangle (&extents, sample); +} + +static cairo_bool_t +_raster_source_is_opaque (const cairo_raster_source_pattern_t *pattern, + const cairo_rectangle_int_t *sample) +{ + if (pattern->content & CAIRO_CONTENT_ALPHA) + return FALSE; + + if (pattern->base.extend != CAIRO_EXTEND_NONE) + return TRUE; + + if (sample == NULL) + return FALSE; + + return _cairo_rectangle_contains_rectangle (&pattern->extents, sample); +} + +static cairo_bool_t +_surface_is_clear (const cairo_surface_pattern_t *pattern) +{ + cairo_rectangle_int_t extents; + + if (_cairo_surface_get_extents (pattern->surface, &extents) && + (extents.width == 0 || extents.height == 0)) + return TRUE; + + return pattern->surface->is_clear && + pattern->surface->content & CAIRO_CONTENT_ALPHA; +} + +static cairo_bool_t +_raster_source_is_clear (const cairo_raster_source_pattern_t *pattern) +{ + return pattern->extents.width == 0 || pattern->extents.height == 0; +} + +static cairo_bool_t +_gradient_is_opaque (const cairo_gradient_pattern_t *gradient, + const cairo_rectangle_int_t *sample) +{ + unsigned int i; + + assert (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR || + gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL); + + if (gradient->n_stops == 0 || + (gradient->base.extend == CAIRO_EXTEND_NONE && + gradient->stops[0].offset == gradient->stops[gradient->n_stops - 1].offset)) + return FALSE; + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + if (gradient->base.extend == CAIRO_EXTEND_NONE) { + double t[2]; + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + + /* EXTEND_NONE degenerate radial gradients are clear */ + if (_linear_pattern_is_degenerate (linear)) + return FALSE; + + if (sample == NULL) + return FALSE; + + _cairo_linear_pattern_box_to_parameter (linear, + sample->x, + sample->y, + sample->x + sample->width, + sample->y + sample->height, + t); + + if (t[0] < 0.0 || t[1] > 1.0) + return FALSE; + } + } else + return FALSE; /* TODO: check actual intersection */ + + for (i = 0; i < gradient->n_stops; i++) + if (! CAIRO_COLOR_IS_OPAQUE (&gradient->stops[i].color)) + return FALSE; + + return TRUE; +} + +/** + * _cairo_pattern_is_opaque: + * + * Convenience function to determine whether a pattern is an opaque + * pattern (of any type). The same caveats that apply to + * _cairo_pattern_is_opaque_solid apply here as well. + * + * Return value: %TRUE if the pattern is a opaque. + **/ +cairo_bool_t +_cairo_pattern_is_opaque (const cairo_pattern_t *abstract_pattern, + const cairo_rectangle_int_t *sample) +{ + const cairo_pattern_union_t *pattern; + + if (abstract_pattern->has_component_alpha) + return FALSE; + + pattern = (cairo_pattern_union_t *) abstract_pattern; + switch (pattern->base.type) { + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_pattern_is_opaque_solid (abstract_pattern); + case CAIRO_PATTERN_TYPE_SURFACE: + return _surface_is_opaque (&pattern->surface, sample); + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _raster_source_is_opaque (&pattern->raster_source, sample); + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + return _gradient_is_opaque (&pattern->gradient.base, sample); + case CAIRO_PATTERN_TYPE_MESH: + return FALSE; + } + + ASSERT_NOT_REACHED; + return FALSE; +} + +cairo_bool_t +_cairo_pattern_is_clear (const cairo_pattern_t *abstract_pattern) +{ + const cairo_pattern_union_t *pattern; + + if (abstract_pattern->has_component_alpha) + return FALSE; + + pattern = (cairo_pattern_union_t *) abstract_pattern; + switch (abstract_pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return CAIRO_COLOR_IS_CLEAR (&pattern->solid.color); + case CAIRO_PATTERN_TYPE_SURFACE: + return _surface_is_clear (&pattern->surface); + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _raster_source_is_clear (&pattern->raster_source); + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + return _gradient_is_clear (&pattern->gradient.base, NULL); + case CAIRO_PATTERN_TYPE_MESH: + return _mesh_is_clear (&pattern->mesh); + } + + ASSERT_NOT_REACHED; + return FALSE; +} + +/* + * Will given row of back-translation matrix work with bilinear scale? + * This is true for scales larger than 1. Also it was judged acceptable + * for scales larger than .75. And if there is integer translation + * then a scale of exactly .5 works. + */ +static int +use_bilinear(double x, double y, double t) +{ + /* This is the inverse matrix! */ + double h = x*x + y*y; + if (h < 1.0 / (0.75 * 0.75)) + return TRUE; /* scale > .75 */ + if ((h > 3.99 && h < 4.01) /* scale is 1/2 */ + && !_cairo_fixed_from_double(x*y) /* parallel to an axis */ + && _cairo_fixed_is_integer (_cairo_fixed_from_double (t))) + return TRUE; + return FALSE; +} + +/** + * _cairo_pattern_analyze_filter: + * @pattern: surface pattern + * Returns: the optimized #cairo_filter_t to use with @pattern. + * + * Possibly optimize the filter to a simpler value depending on transformation + **/ +cairo_filter_t +_cairo_pattern_analyze_filter (const cairo_pattern_t *pattern) +{ + switch (pattern->filter) { + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_FAST: + /* If source pixels map 1:1 onto destination pixels, we do + * not need to filter (and do not want to filter, since it + * will cause blurriness) + */ + if (_cairo_matrix_is_pixel_exact (&pattern->matrix)) { + return CAIRO_FILTER_NEAREST; + } else { + /* Use BILINEAR for any scale greater than .75 instead + * of GOOD. For scales of 1 and larger this is identical, + * for the smaller sizes it was judged that the artifacts + * were not worse than the artifacts from a box filer. + * BILINEAR can also be used if the scale is exactly .5 + * and the translation in that direction is an integer. + */ + if (pattern->filter == CAIRO_FILTER_GOOD && + use_bilinear (pattern->matrix.xx, pattern->matrix.xy, + pattern->matrix.x0) && + use_bilinear (pattern->matrix.yx, pattern->matrix.yy, + pattern->matrix.y0)) + return CAIRO_FILTER_BILINEAR; + } + break; + + case CAIRO_FILTER_NEAREST: + case CAIRO_FILTER_GAUSSIAN: + default: + break; + } + + return pattern->filter; +} + +/** + * _cairo_hypot: + * Returns: value similar to hypot(@x,@y) + * + * May want to replace this with Manhattan distance (abs(x)+abs(y)) if + * hypot is too slow, as there is no need for accuracy here. + **/ +static inline double +_cairo_hypot(double x, double y) +{ + return hypot(x, y); +} + +/** + * _cairo_pattern_sampled_area: + * + * Return region of @pattern that will be sampled to fill @extents, + * based on the transformation and filter. + * + * This does not include pixels that are mulitiplied by values very + * close to zero by the ends of filters. This is so that transforms + * that should be the identity or 90 degree rotations do not expand + * the source unexpectedly. + * + * XXX: We don't actually have any way of querying the backend for + * the filter radius, so we just guess base on what we know that + * backends do currently (see bug #10508) + **/ +void +_cairo_pattern_sampled_area (const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + cairo_rectangle_int_t *sample) +{ + double x1, x2, y1, y2; + double padx, pady; + + /* Assume filters are interpolating, which means identity + cannot change the image */ + if (_cairo_matrix_is_identity (&pattern->matrix)) { + *sample = *extents; + return; + } + + /* Transform the centers of the corner pixels */ + x1 = extents->x + 0.5; + y1 = extents->y + 0.5; + x2 = x1 + (extents->width - 1); + y2 = y1 + (extents->height - 1); + _cairo_matrix_transform_bounding_box (&pattern->matrix, + &x1, &y1, &x2, &y2, + NULL); + + /* How far away from center will it actually sample? + * This is the distance from a transformed pixel center to the + * furthest sample of reasonable size. + */ + switch (pattern->filter) { + case CAIRO_FILTER_NEAREST: + case CAIRO_FILTER_FAST: + /* Correct value is zero, but when the sample is on an integer + * it is unknown if the backend will sample the pixel to the + * left or right. This value makes it include both possible pixels. + */ + padx = pady = 0.004; + break; + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + default: + /* Correct value is .5 */ + padx = pady = 0.495; + break; + case CAIRO_FILTER_GOOD: + /* Correct value is max(width,1)*.5 */ + padx = _cairo_hypot (pattern->matrix.xx, pattern->matrix.xy); + if (padx <= 1.0) padx = 0.495; + else if (padx >= 16.0) padx = 7.92; + else padx *= 0.495; + pady = _cairo_hypot (pattern->matrix.yx, pattern->matrix.yy); + if (pady <= 1.0) pady = 0.495; + else if (pady >= 16.0) pady = 7.92; + else pady *= 0.495; + break; + case CAIRO_FILTER_BEST: + /* Correct value is width*2 */ + padx = _cairo_hypot (pattern->matrix.xx, pattern->matrix.xy) * 1.98; + if (padx > 7.92) padx = 7.92; + pady = _cairo_hypot (pattern->matrix.yx, pattern->matrix.yy) * 1.98; + if (pady > 7.92) pady = 7.92; + break; + } + + /* round furthest samples to edge of pixels */ + x1 = floor (x1 - padx); + if (x1 < CAIRO_RECT_INT_MIN) x1 = CAIRO_RECT_INT_MIN; + sample->x = x1; + + y1 = floor (y1 - pady); + if (y1 < CAIRO_RECT_INT_MIN) y1 = CAIRO_RECT_INT_MIN; + sample->y = y1; + + x2 = floor (x2 + padx) + 1.0; + if (x2 > CAIRO_RECT_INT_MAX) x2 = CAIRO_RECT_INT_MAX; + sample->width = x2 - x1; + + y2 = floor (y2 + pady) + 1.0; + if (y2 > CAIRO_RECT_INT_MAX) y2 = CAIRO_RECT_INT_MAX; + sample->height = y2 - y1; +} + +/** + * _cairo_pattern_get_extents: + * + * Return the "target-space" extents of @pattern in @extents. + * + * For unbounded patterns, the @extents will be initialized with + * "infinite" extents, (minimum and maximum fixed-point values). + * + * XXX: Currently, bounded gradient patterns will also return + * "infinite" extents, though it would be possible to optimize these + * with a little more work. + **/ +void +_cairo_pattern_get_extents (const cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents) +{ + double x1, y1, x2, y2; + int ix1, ix2, iy1, iy2; + cairo_bool_t round_x = FALSE; + cairo_bool_t round_y = FALSE; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + goto UNBOUNDED; + + case CAIRO_PATTERN_TYPE_SURFACE: + { + cairo_rectangle_int_t surface_extents; + const cairo_surface_pattern_t *surface_pattern = + (const cairo_surface_pattern_t *) pattern; + cairo_surface_t *surface = surface_pattern->surface; + + if (! _cairo_surface_get_extents (surface, &surface_extents)) + goto UNBOUNDED; + + if (surface_extents.width == 0 || surface_extents.height == 0) + goto EMPTY; + + if (pattern->extend != CAIRO_EXTEND_NONE) + goto UNBOUNDED; + + x1 = surface_extents.x; + y1 = surface_extents.y; + x2 = surface_extents.x + (int) surface_extents.width; + y2 = surface_extents.y + (int) surface_extents.height; + + goto HANDLE_FILTER; + } + break; + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + { + const cairo_raster_source_pattern_t *raster = + (const cairo_raster_source_pattern_t *) pattern; + + if (raster->extents.width == 0 || raster->extents.height == 0) + goto EMPTY; + + if (pattern->extend != CAIRO_EXTEND_NONE) + goto UNBOUNDED; + + x1 = raster->extents.x; + y1 = raster->extents.y; + x2 = raster->extents.x + (int) raster->extents.width; + y2 = raster->extents.y + (int) raster->extents.height; + } + HANDLE_FILTER: + switch (pattern->filter) { + case CAIRO_FILTER_NEAREST: + case CAIRO_FILTER_FAST: + round_x = round_y = TRUE; + /* We don't know which way .5 will go, so fudge it slightly. */ + x1 -= 0.004; + y1 -= 0.004; + x2 += 0.004; + y2 += 0.004; + break; + case CAIRO_FILTER_BEST: + /* Assume best filter will produce nice antialiased edges */ + break; + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + case CAIRO_FILTER_GOOD: + default: + /* These filters can blur the edge out 1/2 pixel when scaling up */ + if (_cairo_hypot (pattern->matrix.xx, pattern->matrix.yx) < 1.0) { + x1 -= 0.5; + x2 += 0.5; + round_x = TRUE; + } + if (_cairo_hypot (pattern->matrix.xy, pattern->matrix.yy) < 1.0) { + y1 -= 0.5; + y2 += 0.5; + round_y = TRUE; + } + break; + } + break; + + case CAIRO_PATTERN_TYPE_RADIAL: + { + const cairo_radial_pattern_t *radial = + (const cairo_radial_pattern_t *) pattern; + double cx1, cy1; + double cx2, cy2; + double r1, r2; + + if (_radial_pattern_is_degenerate (radial)) { + /* cairo-gstate should have optimised degenerate + * patterns to solid clear patterns, so we can ignore + * them here. */ + goto EMPTY; + } + + /* TODO: in some cases (focus outside/on the circle) it is + * half-bounded. */ + if (pattern->extend != CAIRO_EXTEND_NONE) + goto UNBOUNDED; + + cx1 = radial->cd1.center.x; + cy1 = radial->cd1.center.y; + r1 = radial->cd1.radius; + + cx2 = radial->cd2.center.x; + cy2 = radial->cd2.center.y; + r2 = radial->cd2.radius; + + x1 = MIN (cx1 - r1, cx2 - r2); + y1 = MIN (cy1 - r1, cy2 - r2); + x2 = MAX (cx1 + r1, cx2 + r2); + y2 = MAX (cy1 + r1, cy2 + r2); + } + break; + + case CAIRO_PATTERN_TYPE_LINEAR: + { + const cairo_linear_pattern_t *linear = + (const cairo_linear_pattern_t *) pattern; + + if (pattern->extend != CAIRO_EXTEND_NONE) + goto UNBOUNDED; + + if (_linear_pattern_is_degenerate (linear)) { + /* cairo-gstate should have optimised degenerate + * patterns to solid ones, so we can again ignore + * them here. */ + goto EMPTY; + } + + /* TODO: to get tight extents, use the matrix to transform + * the pattern instead of transforming the extents later. */ + if (pattern->matrix.xy != 0. || pattern->matrix.yx != 0.) + goto UNBOUNDED; + + if (linear->pd1.x == linear->pd2.x) { + x1 = -HUGE_VAL; + x2 = HUGE_VAL; + y1 = MIN (linear->pd1.y, linear->pd2.y); + y2 = MAX (linear->pd1.y, linear->pd2.y); + } else if (linear->pd1.y == linear->pd2.y) { + x1 = MIN (linear->pd1.x, linear->pd2.x); + x2 = MAX (linear->pd1.x, linear->pd2.x); + y1 = -HUGE_VAL; + y2 = HUGE_VAL; + } else { + goto UNBOUNDED; + } + + /* The current linear renderer just point-samples in the middle + of the pixels, similar to the NEAREST filter: */ + round_x = round_y = TRUE; + } + break; + + case CAIRO_PATTERN_TYPE_MESH: + { + const cairo_mesh_pattern_t *mesh = + (const cairo_mesh_pattern_t *) pattern; + if (! _cairo_mesh_pattern_coord_box (mesh, &x1, &y1, &x2, &y2)) + goto EMPTY; + } + break; + + default: + ASSERT_NOT_REACHED; + } + + if (_cairo_matrix_is_translation (&pattern->matrix)) { + x1 -= pattern->matrix.x0; x2 -= pattern->matrix.x0; + y1 -= pattern->matrix.y0; y2 -= pattern->matrix.y0; + } else { + cairo_matrix_t imatrix; + cairo_status_t status; + + imatrix = pattern->matrix; + status = cairo_matrix_invert (&imatrix); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_matrix_transform_bounding_box (&imatrix, + &x1, &y1, &x2, &y2, + NULL); + } + + if (!round_x) { + x1 -= 0.5; + x2 += 0.5; + } + if (x1 < CAIRO_RECT_INT_MIN) + ix1 = CAIRO_RECT_INT_MIN; + else + ix1 = _cairo_lround (x1); + if (x2 > CAIRO_RECT_INT_MAX) + ix2 = CAIRO_RECT_INT_MAX; + else + ix2 = _cairo_lround (x2); + extents->x = ix1; extents->width = ix2 - ix1; + + if (!round_y) { + y1 -= 0.5; + y2 += 0.5; + } + if (y1 < CAIRO_RECT_INT_MIN) + iy1 = CAIRO_RECT_INT_MIN; + else + iy1 = _cairo_lround (y1); + if (y2 > CAIRO_RECT_INT_MAX) + iy2 = CAIRO_RECT_INT_MAX; + else + iy2 = _cairo_lround (y2); + extents->y = iy1; extents->height = iy2 - iy1; + + return; + + UNBOUNDED: + /* unbounded patterns -> 'infinite' extents */ + _cairo_unbounded_rectangle_init (extents); + return; + + EMPTY: + extents->x = extents->y = 0; + extents->width = extents->height = 0; + return; +} + +/** + * _cairo_pattern_get_ink_extents: + * + * Return the "target-space" inked extents of @pattern in @extents. + **/ +cairo_int_status_t +_cairo_pattern_get_ink_extents (const cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents) +{ + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE && + pattern->extend == CAIRO_EXTEND_NONE) + { + const cairo_surface_pattern_t *surface_pattern = + (const cairo_surface_pattern_t *) pattern; + cairo_surface_t *surface = surface_pattern->surface; + + surface = _cairo_surface_get_source (surface, NULL); + if (_cairo_surface_is_recording (surface)) { + cairo_matrix_t imatrix; + cairo_box_t box; + cairo_status_t status; + + imatrix = pattern->matrix; + status = cairo_matrix_invert (&imatrix); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + status = _cairo_recording_surface_get_ink_bbox ((cairo_recording_surface_t *)surface, + &box, &imatrix); + if (unlikely (status)) + return status; + + _cairo_box_round_to_rectangle (&box, extents); + return CAIRO_STATUS_SUCCESS; + } + } + + _cairo_pattern_get_extents (pattern, extents); + return CAIRO_STATUS_SUCCESS; +} + +static unsigned long +_cairo_solid_pattern_hash (unsigned long hash, + const cairo_solid_pattern_t *solid) +{ + hash = _cairo_hash_bytes (hash, &solid->color, sizeof (solid->color)); + + return hash; +} + +static unsigned long +_cairo_gradient_color_stops_hash (unsigned long hash, + const cairo_gradient_pattern_t *gradient) +{ + unsigned int n; + + hash = _cairo_hash_bytes (hash, + &gradient->n_stops, + sizeof (gradient->n_stops)); + + for (n = 0; n < gradient->n_stops; n++) { + hash = _cairo_hash_bytes (hash, + &gradient->stops[n].offset, + sizeof (double)); + hash = _cairo_hash_bytes (hash, + &gradient->stops[n].color, + sizeof (cairo_color_stop_t)); + } + + return hash; +} + +unsigned long +_cairo_linear_pattern_hash (unsigned long hash, + const cairo_linear_pattern_t *linear) +{ + hash = _cairo_hash_bytes (hash, &linear->pd1, sizeof (linear->pd1)); + hash = _cairo_hash_bytes (hash, &linear->pd2, sizeof (linear->pd2)); + + return _cairo_gradient_color_stops_hash (hash, &linear->base); +} + +unsigned long +_cairo_radial_pattern_hash (unsigned long hash, + const cairo_radial_pattern_t *radial) +{ + hash = _cairo_hash_bytes (hash, &radial->cd1.center, sizeof (radial->cd1.center)); + hash = _cairo_hash_bytes (hash, &radial->cd1.radius, sizeof (radial->cd1.radius)); + hash = _cairo_hash_bytes (hash, &radial->cd2.center, sizeof (radial->cd2.center)); + hash = _cairo_hash_bytes (hash, &radial->cd2.radius, sizeof (radial->cd2.radius)); + + return _cairo_gradient_color_stops_hash (hash, &radial->base); +} + +static unsigned long +_cairo_mesh_pattern_hash (unsigned long hash, const cairo_mesh_pattern_t *mesh) +{ + const cairo_mesh_patch_t *patch = _cairo_array_index_const (&mesh->patches, 0); + unsigned int i, n = _cairo_array_num_elements (&mesh->patches); + + for (i = 0; i < n; i++) + hash = _cairo_hash_bytes (hash, patch + i, sizeof (cairo_mesh_patch_t)); + + return hash; +} + +static unsigned long +_cairo_surface_pattern_hash (unsigned long hash, + const cairo_surface_pattern_t *surface) +{ + hash ^= surface->surface->unique_id; + + return hash; +} + +static unsigned long +_cairo_raster_source_pattern_hash (unsigned long hash, + const cairo_raster_source_pattern_t *raster) +{ + hash ^= (uintptr_t)raster->user_data; + + return hash; +} + +unsigned long +_cairo_pattern_hash (const cairo_pattern_t *pattern) +{ + unsigned long hash = _CAIRO_HASH_INIT_VALUE; + + if (pattern->status) + return 0; + + hash = _cairo_hash_bytes (hash, &pattern->type, sizeof (pattern->type)); + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) { + hash = _cairo_hash_bytes (hash, + &pattern->matrix, sizeof (pattern->matrix)); + hash = _cairo_hash_bytes (hash, + &pattern->filter, sizeof (pattern->filter)); + hash = _cairo_hash_bytes (hash, + &pattern->extend, sizeof (pattern->extend)); + hash = _cairo_hash_bytes (hash, + &pattern->has_component_alpha, + sizeof (pattern->has_component_alpha)); + } + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_solid_pattern_hash (hash, (cairo_solid_pattern_t *) pattern); + case CAIRO_PATTERN_TYPE_LINEAR: + return _cairo_linear_pattern_hash (hash, (cairo_linear_pattern_t *) pattern); + case CAIRO_PATTERN_TYPE_RADIAL: + return _cairo_radial_pattern_hash (hash, (cairo_radial_pattern_t *) pattern); + case CAIRO_PATTERN_TYPE_MESH: + return _cairo_mesh_pattern_hash (hash, (cairo_mesh_pattern_t *) pattern); + case CAIRO_PATTERN_TYPE_SURFACE: + return _cairo_surface_pattern_hash (hash, (cairo_surface_pattern_t *) pattern); + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _cairo_raster_source_pattern_hash (hash, (cairo_raster_source_pattern_t *) pattern); + default: + ASSERT_NOT_REACHED; + return FALSE; + } +} + +static cairo_bool_t +_cairo_solid_pattern_equal (const cairo_solid_pattern_t *a, + const cairo_solid_pattern_t *b) +{ + return _cairo_color_equal (&a->color, &b->color); +} + +static cairo_bool_t +_cairo_gradient_color_stops_equal (const cairo_gradient_pattern_t *a, + const cairo_gradient_pattern_t *b) +{ + unsigned int n; + + if (a->n_stops != b->n_stops) + return FALSE; + + for (n = 0; n < a->n_stops; n++) { + if (a->stops[n].offset != b->stops[n].offset) + return FALSE; + if (! _cairo_color_stop_equal (&a->stops[n].color, &b->stops[n].color)) + return FALSE; + } + + return TRUE; +} + +cairo_bool_t +_cairo_linear_pattern_equal (const cairo_linear_pattern_t *a, + const cairo_linear_pattern_t *b) +{ + if (a->pd1.x != b->pd1.x) + return FALSE; + + if (a->pd1.y != b->pd1.y) + return FALSE; + + if (a->pd2.x != b->pd2.x) + return FALSE; + + if (a->pd2.y != b->pd2.y) + return FALSE; + + return _cairo_gradient_color_stops_equal (&a->base, &b->base); +} + +cairo_bool_t +_cairo_radial_pattern_equal (const cairo_radial_pattern_t *a, + const cairo_radial_pattern_t *b) +{ + if (a->cd1.center.x != b->cd1.center.x) + return FALSE; + + if (a->cd1.center.y != b->cd1.center.y) + return FALSE; + + if (a->cd1.radius != b->cd1.radius) + return FALSE; + + if (a->cd2.center.x != b->cd2.center.x) + return FALSE; + + if (a->cd2.center.y != b->cd2.center.y) + return FALSE; + + if (a->cd2.radius != b->cd2.radius) + return FALSE; + + return _cairo_gradient_color_stops_equal (&a->base, &b->base); +} + +static cairo_bool_t +_cairo_mesh_pattern_equal (const cairo_mesh_pattern_t *a, + const cairo_mesh_pattern_t *b) +{ + const cairo_mesh_patch_t *patch_a, *patch_b; + unsigned int i, num_patches_a, num_patches_b; + + num_patches_a = _cairo_array_num_elements (&a->patches); + num_patches_b = _cairo_array_num_elements (&b->patches); + + if (num_patches_a != num_patches_b) + return FALSE; + + for (i = 0; i < num_patches_a; i++) { + patch_a = _cairo_array_index_const (&a->patches, i); + patch_b = _cairo_array_index_const (&b->patches, i); + if (memcmp (patch_a, patch_b, sizeof(cairo_mesh_patch_t)) != 0) + return FALSE; + } + + return TRUE; +} + +static cairo_bool_t +_cairo_surface_pattern_equal (const cairo_surface_pattern_t *a, + const cairo_surface_pattern_t *b) +{ + return a->surface->unique_id == b->surface->unique_id; +} + +static cairo_bool_t +_cairo_raster_source_pattern_equal (const cairo_raster_source_pattern_t *a, + const cairo_raster_source_pattern_t *b) +{ + return a->user_data == b->user_data; +} + +cairo_bool_t +_cairo_pattern_equal (const cairo_pattern_t *a, const cairo_pattern_t *b) +{ + if (a->status || b->status) + return FALSE; + + if (a == b) + return TRUE; + + if (a->type != b->type) + return FALSE; + + if (a->has_component_alpha != b->has_component_alpha) + return FALSE; + + if (a->type != CAIRO_PATTERN_TYPE_SOLID) { + if (memcmp (&a->matrix, &b->matrix, sizeof (cairo_matrix_t))) + return FALSE; + + if (a->filter != b->filter) + return FALSE; + + if (a->extend != b->extend) + return FALSE; + } + + switch (a->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_solid_pattern_equal ((cairo_solid_pattern_t *) a, + (cairo_solid_pattern_t *) b); + case CAIRO_PATTERN_TYPE_LINEAR: + return _cairo_linear_pattern_equal ((cairo_linear_pattern_t *) a, + (cairo_linear_pattern_t *) b); + case CAIRO_PATTERN_TYPE_RADIAL: + return _cairo_radial_pattern_equal ((cairo_radial_pattern_t *) a, + (cairo_radial_pattern_t *) b); + case CAIRO_PATTERN_TYPE_MESH: + return _cairo_mesh_pattern_equal ((cairo_mesh_pattern_t *) a, + (cairo_mesh_pattern_t *) b); + case CAIRO_PATTERN_TYPE_SURFACE: + return _cairo_surface_pattern_equal ((cairo_surface_pattern_t *) a, + (cairo_surface_pattern_t *) b); + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _cairo_raster_source_pattern_equal ((cairo_raster_source_pattern_t *) a, + (cairo_raster_source_pattern_t *) b); + default: + ASSERT_NOT_REACHED; + return FALSE; + } +} + +/** + * cairo_pattern_get_rgba: + * @pattern: a #cairo_pattern_t + * @red: return value for red component of color, or %NULL + * @green: return value for green component of color, or %NULL + * @blue: return value for blue component of color, or %NULL + * @alpha: return value for alpha component of color, or %NULL + * + * Gets the solid color for a solid color pattern. + * + * Return value: %CAIRO_STATUS_SUCCESS, or + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a solid + * color pattern. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_get_rgba (cairo_pattern_t *pattern, + double *red, double *green, + double *blue, double *alpha) +{ + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t*) pattern; + double r0, g0, b0, a0; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + _cairo_color_get_rgba (&solid->color, &r0, &g0, &b0, &a0); + + if (red) + *red = r0; + if (green) + *green = g0; + if (blue) + *blue = b0; + if (alpha) + *alpha = a0; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_pattern_get_surface: + * @pattern: a #cairo_pattern_t + * @surface: return value for surface of pattern, or %NULL + * + * Gets the surface of a surface pattern. The reference returned in + * @surface is owned by the pattern; the caller should call + * cairo_surface_reference() if the surface is to be retained. + * + * Return value: %CAIRO_STATUS_SUCCESS, or + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a surface + * pattern. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_get_surface (cairo_pattern_t *pattern, + cairo_surface_t **surface) +{ + cairo_surface_pattern_t *spat = (cairo_surface_pattern_t*) pattern; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (surface) + *surface = spat->surface; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_pattern_get_color_stop_rgba: + * @pattern: a #cairo_pattern_t + * @index: index of the stop to return data for + * @offset: return value for the offset of the stop, or %NULL + * @red: return value for red component of color, or %NULL + * @green: return value for green component of color, or %NULL + * @blue: return value for blue component of color, or %NULL + * @alpha: return value for alpha component of color, or %NULL + * + * Gets the color and offset information at the given @index for a + * gradient pattern. Values of @index range from 0 to n-1 + * where n is the number returned + * by cairo_pattern_get_color_stop_count(). + * + * Return value: %CAIRO_STATUS_SUCCESS, or %CAIRO_STATUS_INVALID_INDEX + * if @index is not valid for the given pattern. If the pattern is + * not a gradient pattern, %CAIRO_STATUS_PATTERN_TYPE_MISMATCH is + * returned. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern, + int index, double *offset, + double *red, double *green, + double *blue, double *alpha) +{ + cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t*) pattern; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && + pattern->type != CAIRO_PATTERN_TYPE_RADIAL) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (index < 0 || (unsigned int) index >= gradient->n_stops) + return _cairo_error (CAIRO_STATUS_INVALID_INDEX); + + if (offset) + *offset = gradient->stops[index].offset; + if (red) + *red = gradient->stops[index].color.red; + if (green) + *green = gradient->stops[index].color.green; + if (blue) + *blue = gradient->stops[index].color.blue; + if (alpha) + *alpha = gradient->stops[index].color.alpha; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_pattern_get_color_stop_count: + * @pattern: a #cairo_pattern_t + * @count: return value for the number of color stops, or %NULL + * + * Gets the number of color stops specified in the given gradient + * pattern. + * + * Return value: %CAIRO_STATUS_SUCCESS, or + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a gradient + * pattern. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern, + int *count) +{ + cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t*) pattern; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && + pattern->type != CAIRO_PATTERN_TYPE_RADIAL) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (count) + *count = gradient->n_stops; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_pattern_get_linear_points: + * @pattern: a #cairo_pattern_t + * @x0: return value for the x coordinate of the first point, or %NULL + * @y0: return value for the y coordinate of the first point, or %NULL + * @x1: return value for the x coordinate of the second point, or %NULL + * @y1: return value for the y coordinate of the second point, or %NULL + * + * Gets the gradient endpoints for a linear gradient. + * + * Return value: %CAIRO_STATUS_SUCCESS, or + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a linear + * gradient pattern. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_get_linear_points (cairo_pattern_t *pattern, + double *x0, double *y0, + double *x1, double *y1) +{ + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t*) pattern; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (x0) + *x0 = linear->pd1.x; + if (y0) + *y0 = linear->pd1.y; + if (x1) + *x1 = linear->pd2.x; + if (y1) + *y1 = linear->pd2.y; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_pattern_get_radial_circles: + * @pattern: a #cairo_pattern_t + * @x0: return value for the x coordinate of the center of the first circle, or %NULL + * @y0: return value for the y coordinate of the center of the first circle, or %NULL + * @r0: return value for the radius of the first circle, or %NULL + * @x1: return value for the x coordinate of the center of the second circle, or %NULL + * @y1: return value for the y coordinate of the center of the second circle, or %NULL + * @r1: return value for the radius of the second circle, or %NULL + * + * Gets the gradient endpoint circles for a radial gradient, each + * specified as a center coordinate and a radius. + * + * Return value: %CAIRO_STATUS_SUCCESS, or + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a radial + * gradient pattern. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_pattern_get_radial_circles (cairo_pattern_t *pattern, + double *x0, double *y0, double *r0, + double *x1, double *y1, double *r1) +{ + cairo_radial_pattern_t *radial = (cairo_radial_pattern_t*) pattern; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_RADIAL) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (x0) + *x0 = radial->cd1.center.x; + if (y0) + *y0 = radial->cd1.center.y; + if (r0) + *r0 = radial->cd1.radius; + if (x1) + *x1 = radial->cd2.center.x; + if (y1) + *y1 = radial->cd2.center.y; + if (r1) + *r1 = radial->cd2.radius; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_mesh_pattern_get_patch_count: + * @pattern: a #cairo_pattern_t + * @count: return value for the number patches, or %NULL + * + * Gets the number of patches specified in the given mesh pattern. + * + * The number only includes patches which have been finished by + * calling cairo_mesh_pattern_end_patch(). For example it will be 0 + * during the definition of the first patch. + * + * Return value: %CAIRO_STATUS_SUCCESS, or + * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a mesh + * pattern. + * + * Since: 1.12 + **/ +cairo_status_t +cairo_mesh_pattern_get_patch_count (cairo_pattern_t *pattern, + unsigned int *count) +{ + cairo_mesh_pattern_t *mesh = (cairo_mesh_pattern_t *) pattern; + + if (unlikely (pattern->status)) + return pattern->status; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (count) { + *count = _cairo_array_num_elements (&mesh->patches); + if (mesh->current_patch) + *count -= 1; + } + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_mesh_pattern_get_patch_count); + +/** + * cairo_mesh_pattern_get_path: + * @pattern: a #cairo_pattern_t + * @patch_num: the patch number to return data for + * + * Gets path defining the patch @patch_num for a mesh + * pattern. + * + * @patch_num can range from 0 to n-1 where n is the number returned by + * cairo_mesh_pattern_get_patch_count(). + * + * Return value: the path defining the patch, or a path with status + * %CAIRO_STATUS_INVALID_INDEX if @patch_num or @point_num is not + * valid for @pattern. If @pattern is not a mesh pattern, a path with + * status %CAIRO_STATUS_PATTERN_TYPE_MISMATCH is returned. + * + * Since: 1.12 + **/ +cairo_path_t * +cairo_mesh_pattern_get_path (cairo_pattern_t *pattern, + unsigned int patch_num) +{ + cairo_mesh_pattern_t *mesh = (cairo_mesh_pattern_t *) pattern; + const cairo_mesh_patch_t *patch; + cairo_path_t *path; + cairo_path_data_t *data; + unsigned int patch_count; + int l, current_point; + + if (unlikely (pattern->status)) + return _cairo_path_create_in_error (pattern->status); + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) + return _cairo_path_create_in_error (_cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH)); + + patch_count = _cairo_array_num_elements (&mesh->patches); + if (mesh->current_patch) + patch_count--; + + if (unlikely (patch_num >= patch_count)) + return _cairo_path_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_INDEX)); + + patch = _cairo_array_index_const (&mesh->patches, patch_num); + + path = malloc (sizeof (cairo_path_t)); + if (path == NULL) + return _cairo_path_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + path->num_data = 18; + path->data = _cairo_malloc_ab (path->num_data, + sizeof (cairo_path_data_t)); + if (path->data == NULL) { + free (path); + return _cairo_path_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + data = path->data; + data[0].header.type = CAIRO_PATH_MOVE_TO; + data[0].header.length = 2; + data[1].point.x = patch->points[0][0].x; + data[1].point.y = patch->points[0][0].y; + data += data[0].header.length; + + current_point = 0; + + for (l = 0; l < 4; l++) { + int i, j, k; + + data[0].header.type = CAIRO_PATH_CURVE_TO; + data[0].header.length = 4; + + for (k = 1; k < 4; k++) { + current_point = (current_point + 1) % 12; + i = mesh_path_point_i[current_point]; + j = mesh_path_point_j[current_point]; + data[k].point.x = patch->points[i][j].x; + data[k].point.y = patch->points[i][j].y; + } + + data += data[0].header.length; + } + + path->status = CAIRO_STATUS_SUCCESS; + + return path; +} +slim_hidden_def (cairo_mesh_pattern_get_path); + +/** + * cairo_mesh_pattern_get_corner_color_rgba: + * @pattern: a #cairo_pattern_t + * @patch_num: the patch number to return data for + * @corner_num: the corner number to return data for + * @red: return value for red component of color, or %NULL + * @green: return value for green component of color, or %NULL + * @blue: return value for blue component of color, or %NULL + * @alpha: return value for alpha component of color, or %NULL + * + * Gets the color information in corner @corner_num of patch + * @patch_num for a mesh pattern. + * + * @patch_num can range from 0 to n-1 where n is the number returned by + * cairo_mesh_pattern_get_patch_count(). + * + * Valid values for @corner_num are from 0 to 3 and identify the + * corners as explained in cairo_pattern_create_mesh(). + * + * Return value: %CAIRO_STATUS_SUCCESS, or %CAIRO_STATUS_INVALID_INDEX + * if @patch_num or @corner_num is not valid for @pattern. If + * @pattern is not a mesh pattern, %CAIRO_STATUS_PATTERN_TYPE_MISMATCH + * is returned. + * + * Since: 1.12 + **/ +cairo_status_t +cairo_mesh_pattern_get_corner_color_rgba (cairo_pattern_t *pattern, + unsigned int patch_num, + unsigned int corner_num, + double *red, double *green, + double *blue, double *alpha) +{ + cairo_mesh_pattern_t *mesh = (cairo_mesh_pattern_t *) pattern; + unsigned int patch_count; + const cairo_mesh_patch_t *patch; + + if (unlikely (pattern->status)) + return pattern->status; + + if (unlikely (pattern->type != CAIRO_PATTERN_TYPE_MESH)) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (unlikely (corner_num > 3)) + return _cairo_error (CAIRO_STATUS_INVALID_INDEX); + + patch_count = _cairo_array_num_elements (&mesh->patches); + if (mesh->current_patch) + patch_count--; + + if (unlikely (patch_num >= patch_count)) + return _cairo_error (CAIRO_STATUS_INVALID_INDEX); + + patch = _cairo_array_index_const (&mesh->patches, patch_num); + + if (red) + *red = patch->colors[corner_num].red; + if (green) + *green = patch->colors[corner_num].green; + if (blue) + *blue = patch->colors[corner_num].blue; + if (alpha) + *alpha = patch->colors[corner_num].alpha; + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_mesh_pattern_get_corner_color_rgba); + +/** + * cairo_mesh_pattern_get_control_point: + * @pattern: a #cairo_pattern_t + * @patch_num: the patch number to return data for + * @point_num: the control point number to return data for + * @x: return value for the x coordinate of the control point, or %NULL + * @y: return value for the y coordinate of the control point, or %NULL + * + * Gets the control point @point_num of patch @patch_num for a mesh + * pattern. + * + * @patch_num can range from 0 to n-1 where n is the number returned by + * cairo_mesh_pattern_get_patch_count(). + * + * Valid values for @point_num are from 0 to 3 and identify the + * control points as explained in cairo_pattern_create_mesh(). + * + * Return value: %CAIRO_STATUS_SUCCESS, or %CAIRO_STATUS_INVALID_INDEX + * if @patch_num or @point_num is not valid for @pattern. If @pattern + * is not a mesh pattern, %CAIRO_STATUS_PATTERN_TYPE_MISMATCH is + * returned. + * + * Since: 1.12 + **/ +cairo_status_t +cairo_mesh_pattern_get_control_point (cairo_pattern_t *pattern, + unsigned int patch_num, + unsigned int point_num, + double *x, double *y) +{ + cairo_mesh_pattern_t *mesh = (cairo_mesh_pattern_t *) pattern; + const cairo_mesh_patch_t *patch; + unsigned int patch_count; + int i, j; + + if (pattern->status) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_MESH) + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + + if (point_num > 3) + return _cairo_error (CAIRO_STATUS_INVALID_INDEX); + + patch_count = _cairo_array_num_elements (&mesh->patches); + if (mesh->current_patch) + patch_count--; + + if (unlikely (patch_num >= patch_count)) + return _cairo_error (CAIRO_STATUS_INVALID_INDEX); + + patch = _cairo_array_index_const (&mesh->patches, patch_num); + + i = mesh_control_point_i[point_num]; + j = mesh_control_point_j[point_num]; + + if (x) + *x = patch->points[i][j].x; + if (y) + *y = patch->points[i][j].y; + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_mesh_pattern_get_control_point); + +void +_cairo_pattern_reset_static_data (void) +{ + int i; + + for (i = 0; i < ARRAY_LENGTH (freed_pattern_pool); i++) + _freed_pool_reset (&freed_pattern_pool[i]); +} + +static void +_cairo_debug_print_surface_pattern (FILE *file, + const cairo_surface_pattern_t *pattern) +{ + printf (" surface type: %d\n", pattern->surface->type); +} + +static void +_cairo_debug_print_raster_source_pattern (FILE *file, + const cairo_raster_source_pattern_t *raster) +{ + printf (" content: %x, size %dx%d\n", raster->content, raster->extents.width, raster->extents.height); +} + +static void +_cairo_debug_print_linear_pattern (FILE *file, + const cairo_linear_pattern_t *pattern) +{ +} + +static void +_cairo_debug_print_radial_pattern (FILE *file, + const cairo_radial_pattern_t *pattern) +{ +} + +static void +_cairo_debug_print_mesh_pattern (FILE *file, + const cairo_mesh_pattern_t *pattern) +{ +} + +void +_cairo_debug_print_pattern (FILE *file, const cairo_pattern_t *pattern) +{ + const char *s; + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: s = "solid"; break; + case CAIRO_PATTERN_TYPE_SURFACE: s = "surface"; break; + case CAIRO_PATTERN_TYPE_LINEAR: s = "linear"; break; + case CAIRO_PATTERN_TYPE_RADIAL: s = "radial"; break; + case CAIRO_PATTERN_TYPE_MESH: s = "mesh"; break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: s = "raster"; break; + default: s = "invalid"; ASSERT_NOT_REACHED; break; + } + + fprintf (file, "pattern: %s\n", s); + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) + return; + + switch (pattern->extend) { + case CAIRO_EXTEND_NONE: s = "none"; break; + case CAIRO_EXTEND_REPEAT: s = "repeat"; break; + case CAIRO_EXTEND_REFLECT: s = "reflect"; break; + case CAIRO_EXTEND_PAD: s = "pad"; break; + default: s = "invalid"; ASSERT_NOT_REACHED; break; + } + fprintf (file, " extend: %s\n", s); + + switch (pattern->filter) { + case CAIRO_FILTER_FAST: s = "fast"; break; + case CAIRO_FILTER_GOOD: s = "good"; break; + case CAIRO_FILTER_BEST: s = "best"; break; + case CAIRO_FILTER_NEAREST: s = "nearest"; break; + case CAIRO_FILTER_BILINEAR: s = "bilinear"; break; + case CAIRO_FILTER_GAUSSIAN: s = "guassian"; break; + default: s = "invalid"; ASSERT_NOT_REACHED; break; + } + fprintf (file, " filter: %s\n", s); + fprintf (file, " matrix: [%g %g %g %g %g %g]\n", + pattern->matrix.xx, pattern->matrix.yx, + pattern->matrix.xy, pattern->matrix.yy, + pattern->matrix.x0, pattern->matrix.y0); + switch (pattern->type) { + default: + case CAIRO_PATTERN_TYPE_SOLID: + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + _cairo_debug_print_raster_source_pattern (file, (cairo_raster_source_pattern_t *)pattern); + break; + case CAIRO_PATTERN_TYPE_SURFACE: + _cairo_debug_print_surface_pattern (file, (cairo_surface_pattern_t *)pattern); + break; + case CAIRO_PATTERN_TYPE_LINEAR: + _cairo_debug_print_linear_pattern (file, (cairo_linear_pattern_t *)pattern); + break; + case CAIRO_PATTERN_TYPE_RADIAL: + _cairo_debug_print_radial_pattern (file, (cairo_radial_pattern_t *)pattern); + break; + case CAIRO_PATTERN_TYPE_MESH: + _cairo_debug_print_mesh_pattern (file, (cairo_mesh_pattern_t *)pattern); + break; + } +} diff --git a/src/cairo-pdf-operators-private.h b/src/cairo-pdf-operators-private.h new file mode 100644 index 000000000..4314a042e --- /dev/null +++ b/src/cairo-pdf-operators-private.h @@ -0,0 +1,176 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * Copyright © 2006 Red Hat, Inc + * Copyright © 2007 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Carl Worth + * Adrian Johnson + */ + +#ifndef CAIRO_PDF_OPERATORS_H +#define CAIRO_PDF_OPERATORS_H + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" +#include "cairo-types-private.h" + +/* The glyph buffer size is based on the expected maximum glyphs in a + * line so that an entire line can be emitted in as one string. If the + * glyphs in a line exceeds this size the only downside is the slight + * overhead of emitting two strings. + */ +#define PDF_GLYPH_BUFFER_SIZE 200 + +typedef cairo_int_status_t +(*cairo_pdf_operators_use_font_subset_t) (unsigned int font_id, + unsigned int subset_id, + void *closure); + +typedef struct _cairo_pdf_glyph { + unsigned int glyph_index; + double x_position; + double x_advance; +} cairo_pdf_glyph_t; + +typedef struct _cairo_pdf_operators { + cairo_output_stream_t *stream; + cairo_matrix_t cairo_to_pdf; + cairo_scaled_font_subsets_t *font_subsets; + cairo_pdf_operators_use_font_subset_t use_font_subset; + void *use_font_subset_closure; + cairo_bool_t ps_output; /* output is for PostScript */ + cairo_bool_t use_actual_text; + cairo_bool_t in_text_object; /* inside BT/ET pair */ + + /* PDF text state */ + cairo_bool_t is_new_text_object; /* text object started but matrix and font not yet selected */ + unsigned int font_id; + unsigned int subset_id; + cairo_matrix_t text_matrix; /* PDF text matrix (Tlm in the PDF reference) */ + cairo_matrix_t cairo_to_pdftext; /* translate cairo coords to PDF text space */ + cairo_matrix_t font_matrix_inverse; + double cur_x; /* Current position in PDF text space (Tm in the PDF reference) */ + double cur_y; + int hex_width; + cairo_bool_t is_latin; + int num_glyphs; + double glyph_buf_x_pos; + cairo_pdf_glyph_t glyphs[PDF_GLYPH_BUFFER_SIZE]; + + /* PDF line style */ + cairo_bool_t has_line_style; + double line_width; + cairo_line_cap_t line_cap; + cairo_line_join_t line_join; + double miter_limit; + cairo_bool_t has_dashes; +} cairo_pdf_operators_t; + +cairo_private void +_cairo_pdf_operators_init (cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream, + cairo_matrix_t *cairo_to_pdf, + cairo_scaled_font_subsets_t *font_subsets, + cairo_bool_t ps); + +cairo_private cairo_status_t +_cairo_pdf_operators_fini (cairo_pdf_operators_t *pdf_operators); + +cairo_private void +_cairo_pdf_operators_set_font_subsets_callback (cairo_pdf_operators_t *pdf_operators, + cairo_pdf_operators_use_font_subset_t use_font_subset, + void *closure); + +cairo_private void +_cairo_pdf_operators_set_stream (cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream); + + +cairo_private void +_cairo_pdf_operators_set_cairo_to_pdf_matrix (cairo_pdf_operators_t *pdf_operators, + cairo_matrix_t *cairo_to_pdf); + +cairo_private void +_cairo_pdf_operators_enable_actual_text (cairo_pdf_operators_t *pdf_operators, + cairo_bool_t enable); + +cairo_private cairo_status_t +_cairo_pdf_operators_flush (cairo_pdf_operators_t *pdf_operators); + +cairo_private void +_cairo_pdf_operators_reset (cairo_pdf_operators_t *pdf_operators); + +cairo_private cairo_int_status_t +_cairo_pdf_operators_clip (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_int_status_t +_cairo_pdf_operators_emit_stroke_style (cairo_pdf_operators_t *pdf_operators, + const cairo_stroke_style_t *style, + double scale); + +cairo_private cairo_int_status_t +_cairo_pdf_operators_stroke (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse); + +cairo_private cairo_int_status_t +_cairo_pdf_operators_fill (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_int_status_t +_cairo_pdf_operators_fill_stroke (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse); + +cairo_private cairo_int_status_t +_cairo_pdf_operators_show_text_glyphs (cairo_pdf_operators_t *pdf_operators, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font); + +#endif /* CAIRO_PDF_OPERATORS_H */ diff --git a/src/cairo-pdf-operators.c b/src/cairo-pdf-operators.c new file mode 100644 index 000000000..dcee25f0c --- /dev/null +++ b/src/cairo-pdf-operators.c @@ -0,0 +1,1560 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * Copyright © 2006 Red Hat, Inc + * Copyright © 2007, 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Carl Worth + * Adrian Johnson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_PDF_OPERATORS + +#include "cairo-error-private.h" +#include "cairo-pdf-operators-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-scaled-font-subsets-private.h" + +static cairo_status_t +_cairo_pdf_operators_end_text (cairo_pdf_operators_t *pdf_operators); + + +void +_cairo_pdf_operators_init (cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream, + cairo_matrix_t *cairo_to_pdf, + cairo_scaled_font_subsets_t *font_subsets, + cairo_bool_t ps) +{ + pdf_operators->stream = stream; + pdf_operators->cairo_to_pdf = *cairo_to_pdf; + pdf_operators->font_subsets = font_subsets; + pdf_operators->ps_output = ps; + pdf_operators->use_font_subset = NULL; + pdf_operators->use_font_subset_closure = NULL; + pdf_operators->in_text_object = FALSE; + pdf_operators->num_glyphs = 0; + pdf_operators->has_line_style = FALSE; + pdf_operators->use_actual_text = FALSE; +} + +cairo_status_t +_cairo_pdf_operators_fini (cairo_pdf_operators_t *pdf_operators) +{ + return _cairo_pdf_operators_flush (pdf_operators); +} + +void +_cairo_pdf_operators_set_font_subsets_callback (cairo_pdf_operators_t *pdf_operators, + cairo_pdf_operators_use_font_subset_t use_font_subset, + void *closure) +{ + pdf_operators->use_font_subset = use_font_subset; + pdf_operators->use_font_subset_closure = closure; +} + +/* Change the output stream to a different stream. + * _cairo_pdf_operators_flush() should always be called before calling + * this function. + */ +void +_cairo_pdf_operators_set_stream (cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream) +{ + pdf_operators->stream = stream; + pdf_operators->has_line_style = FALSE; +} + +void +_cairo_pdf_operators_set_cairo_to_pdf_matrix (cairo_pdf_operators_t *pdf_operators, + cairo_matrix_t *cairo_to_pdf) +{ + pdf_operators->cairo_to_pdf = *cairo_to_pdf; + pdf_operators->has_line_style = FALSE; +} + +cairo_private void +_cairo_pdf_operators_enable_actual_text (cairo_pdf_operators_t *pdf_operators, + cairo_bool_t enable) +{ + pdf_operators->use_actual_text = enable; +} + +/* Finish writing out any pending commands to the stream. This + * function must be called by the surface before emitting anything + * into the PDF stream. + * + * pdf_operators may leave the emitted PDF for some operations + * unfinished in case subsequent operations can be merged. This + * function will finish off any incomplete operation so the stream + * will be in a state where the surface may emit its own PDF + * operations (eg changing patterns). + * + */ +cairo_status_t +_cairo_pdf_operators_flush (cairo_pdf_operators_t *pdf_operators) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + if (pdf_operators->in_text_object) + status = _cairo_pdf_operators_end_text (pdf_operators); + + return status; +} + +/* Reset the known graphics state of the PDF consumer. ie no + * assumptions will be made about the state. The next time a + * particular graphics state is required (eg line width) the state + * operator is always emitted and then remembered for subsequent + * operatations. + * + * This should be called when starting a new stream or after emitting + * the 'Q' operator (where pdf-operators functions were called inside + * the q/Q pair). + */ +void +_cairo_pdf_operators_reset (cairo_pdf_operators_t *pdf_operators) +{ + pdf_operators->has_line_style = FALSE; +} + +/* A word wrap stream can be used as a filter to do word wrapping on + * top of an existing output stream. The word wrapping is quite + * simple, using isspace to determine characters that separate + * words. Any word that will cause the column count exceed the given + * max_column will have a '\n' character emitted before it. + * + * The stream is careful to maintain integrity for words that cross + * the boundary from one call to write to the next. + * + * Note: This stream does not guarantee that the output will never + * exceed max_column. In particular, if a single word is larger than + * max_column it will not be broken up. + */ + +typedef enum _cairo_word_wrap_state { + WRAP_STATE_DELIMITER, + WRAP_STATE_WORD, + WRAP_STATE_STRING, + WRAP_STATE_HEXSTRING +} cairo_word_wrap_state_t; + + +typedef struct _word_wrap_stream { + cairo_output_stream_t base; + cairo_output_stream_t *output; + int max_column; + cairo_bool_t ps_output; + int column; + cairo_word_wrap_state_t state; + cairo_bool_t in_escape; + int escape_digits; +} word_wrap_stream_t; + + + +/* Emit word bytes up to the next delimiter character */ +static int +_word_wrap_stream_count_word_up_to (word_wrap_stream_t *stream, + const unsigned char *data, int length) +{ + const unsigned char *s = data; + int count = 0; + + while (length--) { + if (_cairo_isspace (*s) || *s == '<' || *s == '(') { + stream->state = WRAP_STATE_DELIMITER; + break; + } + + count++; + stream->column++; + s++; + } + + if (count) + _cairo_output_stream_write (stream->output, data, count); + + return count; +} + + +/* Emit hexstring bytes up to either the end of the ASCII hexstring or the number + * of columns remaining. + */ +static int +_word_wrap_stream_count_hexstring_up_to (word_wrap_stream_t *stream, + const unsigned char *data, int length) +{ + const unsigned char *s = data; + int count = 0; + cairo_bool_t newline = FALSE; + + while (length--) { + count++; + stream->column++; + if (*s == '>') { + stream->state = WRAP_STATE_DELIMITER; + break; + } + + if (stream->column > stream->max_column) { + newline = TRUE; + break; + } + s++; + } + + if (count) + _cairo_output_stream_write (stream->output, data, count); + + if (newline) { + _cairo_output_stream_printf (stream->output, "\n"); + stream->column = 0; + } + + return count; +} + +/* Count up to either the end of the string or the number of columns + * remaining. + */ +static int +_word_wrap_stream_count_string_up_to (word_wrap_stream_t *stream, + const unsigned char *data, int length) +{ + const unsigned char *s = data; + int count = 0; + cairo_bool_t newline = FALSE; + + while (length--) { + count++; + stream->column++; + if (!stream->in_escape) { + if (*s == ')') { + stream->state = WRAP_STATE_DELIMITER; + break; + } + if (*s == '\\') { + stream->in_escape = TRUE; + stream->escape_digits = 0; + } else if (stream->ps_output && stream->column > stream->max_column) { + newline = TRUE; + break; + } + } else { + if (!_cairo_isdigit(*s) || ++stream->escape_digits == 3) + stream->in_escape = FALSE; + } + s++; + } + + if (count) + _cairo_output_stream_write (stream->output, data, count); + + if (newline) { + _cairo_output_stream_printf (stream->output, "\\\n"); + stream->column = 0; + } + + return count; +} + +static cairo_status_t +_word_wrap_stream_write (cairo_output_stream_t *base, + const unsigned char *data, + unsigned int length) +{ + word_wrap_stream_t *stream = (word_wrap_stream_t *) base; + int count; + + while (length) { + switch (stream->state) { + case WRAP_STATE_WORD: + count = _word_wrap_stream_count_word_up_to (stream, data, length); + break; + case WRAP_STATE_HEXSTRING: + count = _word_wrap_stream_count_hexstring_up_to (stream, data, length); + break; + case WRAP_STATE_STRING: + count = _word_wrap_stream_count_string_up_to (stream, data, length); + break; + case WRAP_STATE_DELIMITER: + count = 1; + stream->column++; + if (*data == '\n' || stream->column >= stream->max_column) { + _cairo_output_stream_printf (stream->output, "\n"); + stream->column = 0; + } else if (*data == '<') { + stream->state = WRAP_STATE_HEXSTRING; + } else if (*data == '(') { + stream->state = WRAP_STATE_STRING; + } else if (!_cairo_isspace (*data)) { + stream->state = WRAP_STATE_WORD; + } + if (*data != '\n') + _cairo_output_stream_write (stream->output, data, 1); + break; + + default: + ASSERT_NOT_REACHED; + count = length; + break; + } + data += count; + length -= count; + } + + return _cairo_output_stream_get_status (stream->output); +} + +static cairo_status_t +_word_wrap_stream_close (cairo_output_stream_t *base) +{ + word_wrap_stream_t *stream = (word_wrap_stream_t *) base; + + return _cairo_output_stream_get_status (stream->output); +} + +static cairo_output_stream_t * +_word_wrap_stream_create (cairo_output_stream_t *output, cairo_bool_t ps, int max_column) +{ + word_wrap_stream_t *stream; + + if (output->status) + return _cairo_output_stream_create_in_error (output->status); + + stream = malloc (sizeof (word_wrap_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + _word_wrap_stream_write, + NULL, + _word_wrap_stream_close); + stream->output = output; + stream->max_column = max_column; + stream->ps_output = ps; + stream->column = 0; + stream->state = WRAP_STATE_DELIMITER; + stream->in_escape = FALSE; + stream->escape_digits = 0; + + return &stream->base; +} + +typedef struct _pdf_path_info { + cairo_output_stream_t *output; + cairo_matrix_t *path_transform; + cairo_line_cap_t line_cap; + cairo_point_t last_move_to_point; + cairo_bool_t has_sub_path; +} pdf_path_info_t; + +static cairo_status_t +_cairo_pdf_path_move_to (void *closure, + const cairo_point_t *point) +{ + pdf_path_info_t *info = closure; + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + info->last_move_to_point = *point; + info->has_sub_path = FALSE; + cairo_matrix_transform_point (info->path_transform, &x, &y); + _cairo_output_stream_printf (info->output, + "%g %g m ", x, y); + + return _cairo_output_stream_get_status (info->output); +} + +static cairo_status_t +_cairo_pdf_path_line_to (void *closure, + const cairo_point_t *point) +{ + pdf_path_info_t *info = closure; + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (info->line_cap != CAIRO_LINE_CAP_ROUND && + ! info->has_sub_path && + point->x == info->last_move_to_point.x && + point->y == info->last_move_to_point.y) + { + return CAIRO_STATUS_SUCCESS; + } + + info->has_sub_path = TRUE; + cairo_matrix_transform_point (info->path_transform, &x, &y); + _cairo_output_stream_printf (info->output, + "%g %g l ", x, y); + + return _cairo_output_stream_get_status (info->output); +} + +static cairo_status_t +_cairo_pdf_path_curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + pdf_path_info_t *info = closure; + double bx = _cairo_fixed_to_double (b->x); + double by = _cairo_fixed_to_double (b->y); + double cx = _cairo_fixed_to_double (c->x); + double cy = _cairo_fixed_to_double (c->y); + double dx = _cairo_fixed_to_double (d->x); + double dy = _cairo_fixed_to_double (d->y); + + info->has_sub_path = TRUE; + cairo_matrix_transform_point (info->path_transform, &bx, &by); + cairo_matrix_transform_point (info->path_transform, &cx, &cy); + cairo_matrix_transform_point (info->path_transform, &dx, &dy); + _cairo_output_stream_printf (info->output, + "%g %g %g %g %g %g c ", + bx, by, cx, cy, dx, dy); + return _cairo_output_stream_get_status (info->output); +} + +static cairo_status_t +_cairo_pdf_path_close_path (void *closure) +{ + pdf_path_info_t *info = closure; + + if (info->line_cap != CAIRO_LINE_CAP_ROUND && + ! info->has_sub_path) + { + return CAIRO_STATUS_SUCCESS; + } + + _cairo_output_stream_printf (info->output, + "h\n"); + + return _cairo_output_stream_get_status (info->output); +} + +static cairo_status_t +_cairo_pdf_path_rectangle (pdf_path_info_t *info, cairo_box_t *box) +{ + double x1 = _cairo_fixed_to_double (box->p1.x); + double y1 = _cairo_fixed_to_double (box->p1.y); + double x2 = _cairo_fixed_to_double (box->p2.x); + double y2 = _cairo_fixed_to_double (box->p2.y); + + cairo_matrix_transform_point (info->path_transform, &x1, &y1); + cairo_matrix_transform_point (info->path_transform, &x2, &y2); + _cairo_output_stream_printf (info->output, + "%g %g %g %g re ", + x1, y1, x2 - x1, y2 - y1); + + return _cairo_output_stream_get_status (info->output); +} + +/* The line cap value is needed to workaround the fact that PostScript + * and PDF semantics for stroking degenerate sub-paths do not match + * cairo semantics. (PostScript draws something for any line cap + * value, while cairo draws something only for round caps). + * + * When using this function to emit a path to be filled, rather than + * stroked, simply pass %CAIRO_LINE_CAP_ROUND which will guarantee that + * the stroke workaround will not modify the path being emitted. + */ +static cairo_status_t +_cairo_pdf_operators_emit_path (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t*path, + cairo_matrix_t *path_transform, + cairo_line_cap_t line_cap) +{ + cairo_output_stream_t *word_wrap; + cairo_status_t status, status2; + pdf_path_info_t info; + cairo_box_t box; + + word_wrap = _word_wrap_stream_create (pdf_operators->stream, pdf_operators->ps_output, 72); + status = _cairo_output_stream_get_status (word_wrap); + if (unlikely (status)) + return _cairo_output_stream_destroy (word_wrap); + + info.output = word_wrap; + info.path_transform = path_transform; + info.line_cap = line_cap; + if (_cairo_path_fixed_is_rectangle (path, &box) && + ((path_transform->xx == 0 && path_transform->yy == 0) || + (path_transform->xy == 0 && path_transform->yx == 0))) { + status = _cairo_pdf_path_rectangle (&info, &box); + } else { + status = _cairo_path_fixed_interpret (path, + _cairo_pdf_path_move_to, + _cairo_pdf_path_line_to, + _cairo_pdf_path_curve_to, + _cairo_pdf_path_close_path, + &info); + } + + status2 = _cairo_output_stream_destroy (word_wrap); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + return status; +} + +cairo_int_status_t +_cairo_pdf_operators_clip (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule) +{ + const char *pdf_operator; + cairo_status_t status; + + if (pdf_operators->in_text_object) { + status = _cairo_pdf_operators_end_text (pdf_operators); + if (unlikely (status)) + return status; + } + + if (! path->has_current_point) { + /* construct an empty path */ + _cairo_output_stream_printf (pdf_operators->stream, "0 0 m "); + } else { + status = _cairo_pdf_operators_emit_path (pdf_operators, + path, + &pdf_operators->cairo_to_pdf, + CAIRO_LINE_CAP_ROUND); + if (unlikely (status)) + return status; + } + + switch (fill_rule) { + default: + ASSERT_NOT_REACHED; + case CAIRO_FILL_RULE_WINDING: + pdf_operator = "W"; + break; + case CAIRO_FILL_RULE_EVEN_ODD: + pdf_operator = "W*"; + break; + } + + _cairo_output_stream_printf (pdf_operators->stream, + "%s n\n", + pdf_operator); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +static int +_cairo_pdf_line_cap (cairo_line_cap_t cap) +{ + switch (cap) { + case CAIRO_LINE_CAP_BUTT: + return 0; + case CAIRO_LINE_CAP_ROUND: + return 1; + case CAIRO_LINE_CAP_SQUARE: + return 2; + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +static int +_cairo_pdf_line_join (cairo_line_join_t join) +{ + switch (join) { + case CAIRO_LINE_JOIN_MITER: + return 0; + case CAIRO_LINE_JOIN_ROUND: + return 1; + case CAIRO_LINE_JOIN_BEVEL: + return 2; + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +cairo_int_status_t +_cairo_pdf_operators_emit_stroke_style (cairo_pdf_operators_t *pdf_operators, + const cairo_stroke_style_t *style, + double scale) +{ + double *dash = style->dash; + int num_dashes = style->num_dashes; + double dash_offset = style->dash_offset; + double line_width = style->line_width * scale; + + /* PostScript has "special needs" when it comes to zero-length + * dash segments with butt caps. It apparently (at least + * according to ghostscript) draws hairlines for this + * case. That's not what the cairo semantics want, so we first + * touch up the array to eliminate any 0.0 values that will + * result in "on" segments. + */ + if (num_dashes && style->line_cap == CAIRO_LINE_CAP_BUTT) { + int i; + + /* If there's an odd number of dash values they will each get + * interpreted as both on and off. So we first explicitly + * expand the array to remove the duplicate usage so that we + * can modify some of the values. + */ + if (num_dashes % 2) { + dash = _cairo_malloc_abc (num_dashes, 2, sizeof (double)); + if (unlikely (dash == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (dash, style->dash, num_dashes * sizeof (double)); + memcpy (dash + num_dashes, style->dash, num_dashes * sizeof (double)); + + num_dashes *= 2; + } + + for (i = 0; i < num_dashes; i += 2) { + if (dash[i] == 0.0) { + /* Do not modify the dashes in-place, as we may need to also + * replay this stroke to an image fallback. + */ + if (dash == style->dash) { + dash = _cairo_malloc_ab (num_dashes, sizeof (double)); + if (unlikely (dash == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + memcpy (dash, style->dash, num_dashes * sizeof (double)); + } + + /* If we're at the front of the list, we first rotate + * two elements from the end of the list to the front + * of the list before folding away the 0.0. Or, if + * there are only two dash elements, then there is + * nothing at all to draw. + */ + if (i == 0) { + double last_two[2]; + + if (num_dashes == 2) { + free (dash); + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + /* The cases of num_dashes == 0, 1, or 3 elements + * cannot exist, so the rotation of 2 elements + * will always be safe */ + memcpy (last_two, dash + num_dashes - 2, sizeof (last_two)); + memmove (dash + 2, dash, (num_dashes - 2) * sizeof (double)); + memcpy (dash, last_two, sizeof (last_two)); + dash_offset += dash[0] + dash[1]; + i = 2; + } + dash[i-1] += dash[i+1]; + num_dashes -= 2; + memmove (dash + i, dash + i + 2, (num_dashes - i) * sizeof (double)); + /* If we might have just rotated, it's possible that + * we rotated a 0.0 value to the front of the list. + * Set i to -2 so it will get incremented to 0. */ + if (i == 2) + i = -2; + } + } + } + + if (!pdf_operators->has_line_style || pdf_operators->line_width != line_width) { + _cairo_output_stream_printf (pdf_operators->stream, + "%f w\n", + line_width); + pdf_operators->line_width = line_width; + } + + if (!pdf_operators->has_line_style || pdf_operators->line_cap != style->line_cap) { + _cairo_output_stream_printf (pdf_operators->stream, + "%d J\n", + _cairo_pdf_line_cap (style->line_cap)); + pdf_operators->line_cap = style->line_cap; + } + + if (!pdf_operators->has_line_style || pdf_operators->line_join != style->line_join) { + _cairo_output_stream_printf (pdf_operators->stream, + "%d j\n", + _cairo_pdf_line_join (style->line_join)); + pdf_operators->line_join = style->line_join; + } + + if (num_dashes) { + int d; + + _cairo_output_stream_printf (pdf_operators->stream, "["); + for (d = 0; d < num_dashes; d++) + _cairo_output_stream_printf (pdf_operators->stream, " %f", dash[d] * scale); + _cairo_output_stream_printf (pdf_operators->stream, "] %f d\n", + dash_offset * scale); + pdf_operators->has_dashes = TRUE; + } else if (!pdf_operators->has_line_style || pdf_operators->has_dashes) { + _cairo_output_stream_printf (pdf_operators->stream, "[] 0.0 d\n"); + pdf_operators->has_dashes = FALSE; + } + if (dash != style->dash) + free (dash); + + if (!pdf_operators->has_line_style || pdf_operators->miter_limit != style->miter_limit) { + _cairo_output_stream_printf (pdf_operators->stream, + "%f M ", + style->miter_limit < 1.0 ? 1.0 : style->miter_limit); + pdf_operators->miter_limit = style->miter_limit; + } + pdf_operators->has_line_style = TRUE; + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +/* Scale the matrix so the largest absolute value of the non + * translation components is 1.0. Return the scale required to restore + * the matrix to the original values. + * + * eg the matrix [ 100 0 0 50 20 10 ] + * + * is rescaled to [ 1 0 0 0.5 0.2 0.1 ] + * and the scale returned is 100 + */ +static void +_cairo_matrix_factor_out_scale (cairo_matrix_t *m, double *scale) +{ + double s; + + s = fabs (m->xx); + if (fabs (m->xy) > s) + s = fabs (m->xy); + if (fabs (m->yx) > s) + s = fabs (m->yx); + if (fabs (m->yy) > s) + s = fabs (m->yy); + *scale = s; + s = 1.0/s; + cairo_matrix_scale (m, s, s); +} + +static cairo_int_status_t +_cairo_pdf_operators_emit_stroke (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + const char *pdf_operator) +{ + cairo_int_status_t status; + cairo_matrix_t m, path_transform; + cairo_bool_t has_ctm = TRUE; + double scale = 1.0; + + if (pdf_operators->in_text_object) { + status = _cairo_pdf_operators_end_text (pdf_operators); + if (unlikely (status)) + return status; + } + + /* Optimize away the stroke ctm when it does not affect the + * stroke. There are other ctm cases that could be optimized + * however this is the most common. + */ + if (fabs(ctm->xx) == 1.0 && fabs(ctm->yy) == 1.0 && + fabs(ctm->xy) == 0.0 && fabs(ctm->yx) == 0.0) + { + has_ctm = FALSE; + } + + /* The PDF CTM is transformed to the user space CTM when stroking + * so the corect pen shape will be used. This also requires that + * the path be transformed to user space when emitted. The + * conversion of path coordinates to user space may cause rounding + * errors. For example the device space point (1.234, 3.142) when + * transformed to a user space CTM of [100 0 0 100 0 0] will be + * emitted as (0.012, 0.031). + * + * To avoid the rounding problem we scale the user space CTM + * matrix so that all the non translation components of the matrix + * are <= 1. The line width and and dashes are scaled by the + * inverse of the scale applied to the CTM. This maintains the + * shape of the stroke pen while keeping the user space CTM within + * the range that maximizes the precision of the emitted path. + */ + if (has_ctm) { + m = *ctm; + /* Zero out the translation since it does not affect the pen + * shape however it may cause unnecessary digits to be emitted. + */ + m.x0 = 0.0; + m.y0 = 0.0; + _cairo_matrix_factor_out_scale (&m, &scale); + path_transform = m; + status = cairo_matrix_invert (&path_transform); + if (unlikely (status)) + return status; + + cairo_matrix_multiply (&m, &m, &pdf_operators->cairo_to_pdf); + } + + status = _cairo_pdf_operators_emit_stroke_style (pdf_operators, style, scale); + if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) + return CAIRO_STATUS_SUCCESS; + if (unlikely (status)) + return status; + + if (has_ctm) { + _cairo_output_stream_printf (pdf_operators->stream, "q "); + _cairo_output_stream_print_matrix (pdf_operators->stream, &m); + _cairo_output_stream_printf (pdf_operators->stream, " cm\n"); + } else { + path_transform = pdf_operators->cairo_to_pdf; + } + + status = _cairo_pdf_operators_emit_path (pdf_operators, + path, + &path_transform, + style->line_cap); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (pdf_operators->stream, "%s", pdf_operator); + if (has_ctm) + _cairo_output_stream_printf (pdf_operators->stream, " Q"); + + _cairo_output_stream_printf (pdf_operators->stream, "\n"); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +cairo_int_status_t +_cairo_pdf_operators_stroke (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse) +{ + return _cairo_pdf_operators_emit_stroke (pdf_operators, + path, + style, + ctm, + ctm_inverse, + "S"); +} + +cairo_int_status_t +_cairo_pdf_operators_fill (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule) +{ + const char *pdf_operator; + cairo_status_t status; + + if (pdf_operators->in_text_object) { + status = _cairo_pdf_operators_end_text (pdf_operators); + if (unlikely (status)) + return status; + } + + status = _cairo_pdf_operators_emit_path (pdf_operators, + path, + &pdf_operators->cairo_to_pdf, + CAIRO_LINE_CAP_ROUND); + if (unlikely (status)) + return status; + + switch (fill_rule) { + default: + ASSERT_NOT_REACHED; + case CAIRO_FILL_RULE_WINDING: + pdf_operator = "f"; + break; + case CAIRO_FILL_RULE_EVEN_ODD: + pdf_operator = "f*"; + break; + } + + _cairo_output_stream_printf (pdf_operators->stream, + "%s\n", + pdf_operator); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +cairo_int_status_t +_cairo_pdf_operators_fill_stroke (cairo_pdf_operators_t *pdf_operators, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse) +{ + const char *operator; + + switch (fill_rule) { + default: + ASSERT_NOT_REACHED; + case CAIRO_FILL_RULE_WINDING: + operator = "B"; + break; + case CAIRO_FILL_RULE_EVEN_ODD: + operator = "B*"; + break; + } + + return _cairo_pdf_operators_emit_stroke (pdf_operators, + path, + style, + ctm, + ctm_inverse, + operator); +} + +static void +_cairo_pdf_operators_emit_glyph_index (cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream, + unsigned int glyph) +{ + if (pdf_operators->is_latin) { + if (glyph == '(' || glyph == ')' || glyph == '\\') + _cairo_output_stream_printf (stream, "\\%c", glyph); + else if (glyph >= 0x20 && glyph <= 0x7e) + _cairo_output_stream_printf (stream, "%c", glyph); + else + _cairo_output_stream_printf (stream, "\\%03o", glyph); + } else { + _cairo_output_stream_printf (stream, + "%0*x", + pdf_operators->hex_width, + glyph); + } +} + +#define GLYPH_POSITION_TOLERANCE 0.001 + +/* Emit the string of glyphs using the 'Tj' operator. This requires + * that the glyphs are positioned at their natural glyph advances. */ +static cairo_status_t +_cairo_pdf_operators_emit_glyph_string (cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream) +{ + int i; + + _cairo_output_stream_printf (stream, "%s", pdf_operators->is_latin ? "(" : "<"); + for (i = 0; i < pdf_operators->num_glyphs; i++) { + _cairo_pdf_operators_emit_glyph_index (pdf_operators, + stream, + pdf_operators->glyphs[i].glyph_index); + pdf_operators->cur_x += pdf_operators->glyphs[i].x_advance; + } + _cairo_output_stream_printf (stream, "%sTj\n", pdf_operators->is_latin ? ")" : ">"); + + return _cairo_output_stream_get_status (stream); +} + +/* Emit the string of glyphs using the 'TJ' operator. + * + * The TJ operator takes an array of strings of glyphs. Each string of + * glyphs is displayed using the glyph advances of each glyph to + * position the glyphs. A relative adjustment to the glyph advance may + * be specified by including the adjustment between two strings. The + * adjustment is in units of text space * -1000. + */ +static cairo_status_t +_cairo_pdf_operators_emit_glyph_string_with_positioning ( + cairo_pdf_operators_t *pdf_operators, + cairo_output_stream_t *stream) +{ + int i; + + _cairo_output_stream_printf (stream, "[%s", pdf_operators->is_latin ? "(" : "<"); + for (i = 0; i < pdf_operators->num_glyphs; i++) { + if (pdf_operators->glyphs[i].x_position != pdf_operators->cur_x) + { + double delta = pdf_operators->glyphs[i].x_position - pdf_operators->cur_x; + int rounded_delta; + + delta = -1000.0*delta; + /* As the delta is in 1/1000 of a unit of text space, + * rounding to an integer should still provide sufficient + * precision. We round the delta before adding to Tm_x so + * that we keep track of the accumulated rounding error in + * the PDF interpreter and compensate for it when + * calculating subsequent deltas. + */ + rounded_delta = _cairo_lround (delta); + if (abs(rounded_delta) < 3) + rounded_delta = 0; + if (rounded_delta != 0) { + if (pdf_operators->is_latin) { + _cairo_output_stream_printf (stream, + ")%d(", + rounded_delta); + } else { + _cairo_output_stream_printf (stream, + ">%d<", + rounded_delta); + } + } + + /* Convert the rounded delta back to text + * space before adding to the current text + * position. */ + delta = rounded_delta/-1000.0; + pdf_operators->cur_x += delta; + } + + _cairo_pdf_operators_emit_glyph_index (pdf_operators, + stream, + pdf_operators->glyphs[i].glyph_index); + pdf_operators->cur_x += pdf_operators->glyphs[i].x_advance; + } + _cairo_output_stream_printf (stream, "%s]TJ\n", pdf_operators->is_latin ? ")" : ">"); + + return _cairo_output_stream_get_status (stream); +} + +static cairo_status_t +_cairo_pdf_operators_flush_glyphs (cairo_pdf_operators_t *pdf_operators) +{ + cairo_output_stream_t *word_wrap_stream; + cairo_status_t status, status2; + int i; + double x; + + if (pdf_operators->num_glyphs == 0) + return CAIRO_STATUS_SUCCESS; + + word_wrap_stream = _word_wrap_stream_create (pdf_operators->stream, pdf_operators->ps_output, 72); + status = _cairo_output_stream_get_status (word_wrap_stream); + if (unlikely (status)) + return _cairo_output_stream_destroy (word_wrap_stream); + + /* Check if glyph advance used to position every glyph */ + x = pdf_operators->cur_x; + for (i = 0; i < pdf_operators->num_glyphs; i++) { + if (fabs(pdf_operators->glyphs[i].x_position - x) > GLYPH_POSITION_TOLERANCE) + break; + x += pdf_operators->glyphs[i].x_advance; + } + if (i == pdf_operators->num_glyphs) { + status = _cairo_pdf_operators_emit_glyph_string (pdf_operators, + word_wrap_stream); + } else { + status = _cairo_pdf_operators_emit_glyph_string_with_positioning ( + pdf_operators, word_wrap_stream); + } + + pdf_operators->num_glyphs = 0; + pdf_operators->glyph_buf_x_pos = pdf_operators->cur_x; + status2 = _cairo_output_stream_destroy (word_wrap_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + return status; +} + +static cairo_status_t +_cairo_pdf_operators_add_glyph (cairo_pdf_operators_t *pdf_operators, + cairo_scaled_font_subsets_glyph_t *glyph, + double x_position) +{ + double x, y; + + x = glyph->x_advance; + y = glyph->y_advance; + if (glyph->is_scaled) + cairo_matrix_transform_distance (&pdf_operators->font_matrix_inverse, &x, &y); + + pdf_operators->glyphs[pdf_operators->num_glyphs].x_position = x_position; + pdf_operators->glyphs[pdf_operators->num_glyphs].glyph_index = glyph->subset_glyph_index; + pdf_operators->glyphs[pdf_operators->num_glyphs].x_advance = x; + pdf_operators->glyph_buf_x_pos += x; + pdf_operators->num_glyphs++; + if (pdf_operators->num_glyphs == PDF_GLYPH_BUFFER_SIZE) + return _cairo_pdf_operators_flush_glyphs (pdf_operators); + + return CAIRO_STATUS_SUCCESS; +} + +/* Use 'Tm' operator to set the PDF text matrix. */ +static cairo_status_t +_cairo_pdf_operators_set_text_matrix (cairo_pdf_operators_t *pdf_operators, + cairo_matrix_t *matrix) +{ + cairo_matrix_t inverse; + cairo_status_t status; + + /* We require the matrix to be invertable. */ + inverse = *matrix; + status = cairo_matrix_invert (&inverse); + if (unlikely (status)) + return status; + + pdf_operators->text_matrix = *matrix; + pdf_operators->cur_x = 0; + pdf_operators->cur_y = 0; + pdf_operators->glyph_buf_x_pos = 0; + _cairo_output_stream_print_matrix (pdf_operators->stream, &pdf_operators->text_matrix); + _cairo_output_stream_printf (pdf_operators->stream, " Tm\n"); + + pdf_operators->cairo_to_pdftext = *matrix; + status = cairo_matrix_invert (&pdf_operators->cairo_to_pdftext); + assert (status == CAIRO_STATUS_SUCCESS); + cairo_matrix_multiply (&pdf_operators->cairo_to_pdftext, + &pdf_operators->cairo_to_pdf, + &pdf_operators->cairo_to_pdftext); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +#define TEXT_MATRIX_TOLERANCE 1e-6 + +/* Set the translation components of the PDF text matrix to x, y. The + * 'Td' operator is used to transform the text matrix. + */ +static cairo_status_t +_cairo_pdf_operators_set_text_position (cairo_pdf_operators_t *pdf_operators, + double x, + double y) +{ + cairo_matrix_t translate, inverse; + cairo_status_t status; + + /* The Td operator transforms the text_matrix with: + * + * text_matrix' = T x text_matrix + * + * where T is a translation matrix with the translation components + * set to the Td operands tx and ty. + */ + inverse = pdf_operators->text_matrix; + status = cairo_matrix_invert (&inverse); + assert (status == CAIRO_STATUS_SUCCESS); + pdf_operators->text_matrix.x0 = x; + pdf_operators->text_matrix.y0 = y; + cairo_matrix_multiply (&translate, &pdf_operators->text_matrix, &inverse); + if (fabs(translate.x0) < TEXT_MATRIX_TOLERANCE) + translate.x0 = 0.0; + if (fabs(translate.y0) < TEXT_MATRIX_TOLERANCE) + translate.y0 = 0.0; + _cairo_output_stream_printf (pdf_operators->stream, + "%f %f Td\n", + translate.x0, + translate.y0); + pdf_operators->cur_x = 0; + pdf_operators->cur_y = 0; + pdf_operators->glyph_buf_x_pos = 0; + + pdf_operators->cairo_to_pdftext = pdf_operators->text_matrix; + status = cairo_matrix_invert (&pdf_operators->cairo_to_pdftext); + assert (status == CAIRO_STATUS_SUCCESS); + cairo_matrix_multiply (&pdf_operators->cairo_to_pdftext, + &pdf_operators->cairo_to_pdf, + &pdf_operators->cairo_to_pdftext); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +/* Select the font using the 'Tf' operator. The font size is set to 1 + * as we use the 'Tm' operator to set the font scale. + */ +static cairo_status_t +_cairo_pdf_operators_set_font_subset (cairo_pdf_operators_t *pdf_operators, + cairo_scaled_font_subsets_glyph_t *subset_glyph) +{ + cairo_status_t status; + + _cairo_output_stream_printf (pdf_operators->stream, + "/f-%d-%d 1 Tf\n", + subset_glyph->font_id, + subset_glyph->subset_id); + if (pdf_operators->use_font_subset) { + status = pdf_operators->use_font_subset (subset_glyph->font_id, + subset_glyph->subset_id, + pdf_operators->use_font_subset_closure); + if (unlikely (status)) + return status; + } + pdf_operators->font_id = subset_glyph->font_id; + pdf_operators->subset_id = subset_glyph->subset_id; + pdf_operators->is_latin = subset_glyph->is_latin; + + if (subset_glyph->is_composite) + pdf_operators->hex_width = 4; + else + pdf_operators->hex_width = 2; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_pdf_operators_begin_text (cairo_pdf_operators_t *pdf_operators) +{ + _cairo_output_stream_printf (pdf_operators->stream, "BT\n"); + + pdf_operators->in_text_object = TRUE; + pdf_operators->num_glyphs = 0; + pdf_operators->glyph_buf_x_pos = 0; + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +static cairo_status_t +_cairo_pdf_operators_end_text (cairo_pdf_operators_t *pdf_operators) +{ + cairo_status_t status; + + status = _cairo_pdf_operators_flush_glyphs (pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (pdf_operators->stream, "ET\n"); + + pdf_operators->in_text_object = FALSE; + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +/* Compare the scale components of two matrices. The translation + * components are ignored. */ +static cairo_bool_t +_cairo_matrix_scale_equal (cairo_matrix_t *a, cairo_matrix_t *b) +{ + return (a->xx == b->xx && + a->xy == b->xy && + a->yx == b->yx && + a->yy == b->yy); +} + +static cairo_status_t +_cairo_pdf_operators_begin_actualtext (cairo_pdf_operators_t *pdf_operators, + const char *utf8, + int utf8_len) +{ + uint16_t *utf16; + int utf16_len; + cairo_status_t status; + int i; + + _cairo_output_stream_printf (pdf_operators->stream, "/Span << /ActualText stream, + "%04x", (int) (utf16[i])); + } + free (utf16); + } + _cairo_output_stream_printf (pdf_operators->stream, "> >> BDC\n"); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +static cairo_status_t +_cairo_pdf_operators_end_actualtext (cairo_pdf_operators_t *pdf_operators) +{ + _cairo_output_stream_printf (pdf_operators->stream, "EMC\n"); + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +static cairo_status_t +_cairo_pdf_operators_emit_glyph (cairo_pdf_operators_t *pdf_operators, + cairo_glyph_t *glyph, + cairo_scaled_font_subsets_glyph_t *subset_glyph) +{ + double x, y; + cairo_status_t status; + + if (pdf_operators->is_new_text_object || + pdf_operators->font_id != subset_glyph->font_id || + pdf_operators->subset_id != subset_glyph->subset_id) + { + status = _cairo_pdf_operators_flush_glyphs (pdf_operators); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_set_font_subset (pdf_operators, subset_glyph); + if (unlikely (status)) + return status; + + pdf_operators->is_new_text_object = FALSE; + } + + x = glyph->x; + y = glyph->y; + cairo_matrix_transform_point (&pdf_operators->cairo_to_pdftext, &x, &y); + + /* The TJ operator for displaying text strings can only set + * the horizontal position of the glyphs. If the y position + * (in text space) changes, use the Td operator to change the + * current position to the next glyph. We also use the Td + * operator to move the current position if the horizontal + * position changes by more than 10 (in text space + * units). This is becauses the horizontal glyph positioning + * in the TJ operator is intended for kerning and there may be + * PDF consumers that do not handle very large position + * adjustments in TJ. + */ + if (fabs(x - pdf_operators->glyph_buf_x_pos) > 10 || + fabs(y - pdf_operators->cur_y) > GLYPH_POSITION_TOLERANCE) + { + status = _cairo_pdf_operators_flush_glyphs (pdf_operators); + if (unlikely (status)) + return status; + + x = glyph->x; + y = glyph->y; + cairo_matrix_transform_point (&pdf_operators->cairo_to_pdf, &x, &y); + status = _cairo_pdf_operators_set_text_position (pdf_operators, x, y); + if (unlikely (status)) + return status; + + x = 0.0; + y = 0.0; + } + + status = _cairo_pdf_operators_add_glyph (pdf_operators, + subset_glyph, + x); + return status; +} + +/* A utf8_len of -1 indicates no unicode text. A utf8_len = 0 is an + * empty string. + */ +static cairo_int_status_t +_cairo_pdf_operators_emit_cluster (cairo_pdf_operators_t *pdf_operators, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font) +{ + cairo_scaled_font_subsets_glyph_t subset_glyph; + cairo_glyph_t *cur_glyph; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + int i; + + /* If the cluster maps 1 glyph to 1 or more unicode characters, we + * first try _map_glyph() with the unicode string to see if it can + * use toUnicode to map our glyph to the unicode. This will fail + * if the glyph is already mapped to a different unicode string. + * + * We also go through this path if no unicode mapping was + * supplied (utf8_len < 0). + * + * Mapping a glyph to a zero length unicode string requires the + * use of ActualText. + */ + if (num_glyphs == 1 && utf8_len != 0) { + status = _cairo_scaled_font_subsets_map_glyph (pdf_operators->font_subsets, + scaled_font, + glyphs->index, + utf8, + utf8_len, + &subset_glyph); + if (unlikely (status)) + return status; + + if (subset_glyph.utf8_is_mapped || utf8_len < 0) { + status = _cairo_pdf_operators_emit_glyph (pdf_operators, + glyphs, + &subset_glyph); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; + } + } + + if (pdf_operators->use_actual_text) { + /* Fallback to using ActualText to map zero or more glyphs to a + * unicode string. */ + status = _cairo_pdf_operators_flush_glyphs (pdf_operators); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_begin_actualtext (pdf_operators, utf8, utf8_len); + if (unlikely (status)) + return status; + } + + if (cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD) + cur_glyph = glyphs + num_glyphs - 1; + else + cur_glyph = glyphs; + + /* XXX + * If no glyphs, we should put *something* here for the text to be selectable. */ + for (i = 0; i < num_glyphs; i++) { + status = _cairo_scaled_font_subsets_map_glyph (pdf_operators->font_subsets, + scaled_font, + cur_glyph->index, + NULL, -1, + &subset_glyph); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_emit_glyph (pdf_operators, + cur_glyph, + &subset_glyph); + if (unlikely (status)) + return status; + + if ((cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD)) + cur_glyph--; + else + cur_glyph++; + } + + if (pdf_operators->use_actual_text) { + status = _cairo_pdf_operators_flush_glyphs (pdf_operators); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_end_actualtext (pdf_operators); + } + + return status; +} + +cairo_int_status_t +_cairo_pdf_operators_show_text_glyphs (cairo_pdf_operators_t *pdf_operators, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font) +{ + cairo_status_t status; + int i; + cairo_matrix_t text_matrix, invert_y_axis; + double x, y; + const char *cur_text; + cairo_glyph_t *cur_glyph; + + pdf_operators->font_matrix_inverse = scaled_font->font_matrix; + status = cairo_matrix_invert (&pdf_operators->font_matrix_inverse); + if (status == CAIRO_STATUS_INVALID_MATRIX) + return CAIRO_STATUS_SUCCESS; + assert (status == CAIRO_STATUS_SUCCESS); + + pdf_operators->is_new_text_object = FALSE; + if (pdf_operators->in_text_object == FALSE) { + status = _cairo_pdf_operators_begin_text (pdf_operators); + if (unlikely (status)) + return status; + + /* Force Tm and Tf to be emitted when starting a new text + * object.*/ + pdf_operators->is_new_text_object = TRUE; + } + + cairo_matrix_init_scale (&invert_y_axis, 1, -1); + text_matrix = scaled_font->scale; + + /* Invert y axis in font space */ + cairo_matrix_multiply (&text_matrix, &text_matrix, &invert_y_axis); + + /* Invert y axis in device space */ + cairo_matrix_multiply (&text_matrix, &invert_y_axis, &text_matrix); + + if (pdf_operators->is_new_text_object || + ! _cairo_matrix_scale_equal (&pdf_operators->text_matrix, &text_matrix)) + { + status = _cairo_pdf_operators_flush_glyphs (pdf_operators); + if (unlikely (status)) + return status; + + x = glyphs[0].x; + y = glyphs[0].y; + cairo_matrix_transform_point (&pdf_operators->cairo_to_pdf, &x, &y); + text_matrix.x0 = x; + text_matrix.y0 = y; + status = _cairo_pdf_operators_set_text_matrix (pdf_operators, &text_matrix); + if (status == CAIRO_STATUS_INVALID_MATRIX) + return CAIRO_STATUS_SUCCESS; + if (unlikely (status)) + return status; + } + + if (num_clusters > 0) { + cur_text = utf8; + if ((cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD)) + cur_glyph = glyphs + num_glyphs; + else + cur_glyph = glyphs; + for (i = 0; i < num_clusters; i++) { + if ((cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD)) + cur_glyph -= clusters[i].num_glyphs; + status = _cairo_pdf_operators_emit_cluster (pdf_operators, + cur_text, + clusters[i].num_bytes, + cur_glyph, + clusters[i].num_glyphs, + cluster_flags, + scaled_font); + if (unlikely (status)) + return status; + + cur_text += clusters[i].num_bytes; + if (!(cluster_flags & CAIRO_TEXT_CLUSTER_FLAG_BACKWARD)) + cur_glyph += clusters[i].num_glyphs; + } + } else { + for (i = 0; i < num_glyphs; i++) { + status = _cairo_pdf_operators_emit_cluster (pdf_operators, + NULL, + -1, /* no unicode string available */ + &glyphs[i], + 1, + FALSE, + scaled_font); + if (unlikely (status)) + return status; + } + } + + return _cairo_output_stream_get_status (pdf_operators->stream); +} + +#endif /* CAIRO_HAS_PDF_OPERATORS */ diff --git a/src/cairo-pdf-shading-private.h b/src/cairo-pdf-shading-private.h new file mode 100644 index 000000000..0ca8cb7d5 --- /dev/null +++ b/src/cairo-pdf-shading-private.h @@ -0,0 +1,100 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + */ + +#ifndef CAIRO_PDF_SHADING_H +#define CAIRO_PDF_SHADING_H + +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" +#include "cairo-pattern-private.h" + + +typedef struct _cairo_pdf_shading { + int shading_type; + int bits_per_coordinate; + int bits_per_component; + int bits_per_flag; + double *decode_array; + int decode_array_length; + unsigned char *data; + unsigned long data_length; +} cairo_pdf_shading_t; + + +/** + * _cairo_pdf_shading_init_color: + * @shading: a #cairo_pdf_shading_t to initialize + * @pattern: the #cairo_mesh_pattern_t to initialize from + * + * Generate the PDF shading dictionary data for the a PDF type 7 + * shading from RGB part of the specified mesh pattern. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_pdf_shading_init_color (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *pattern); + + +/** + * _cairo_pdf_shading_init_alpha: + * @shading: a #cairo_pdf_shading_t to initialize + * @pattern: the #cairo_mesh_pattern_t to initialize from + * + * Generate the PDF shading dictionary data for a PDF type 7 + * shading from alpha part of the specified mesh pattern. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_pdf_shading_init_alpha (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *pattern); + +/** + * _cairo_pdf_shading_fini: + * @shading: a #cairo_pdf_shading_t + * + * Free all resources associated with @shading. After this call, + * @shading should not be used again without a subsequent call to + * _cairo_pdf_shading_init() again first. + **/ +cairo_private void +_cairo_pdf_shading_fini (cairo_pdf_shading_t *shading); + + +#endif /* CAIRO_PDF_SHADING_H */ diff --git a/src/cairo-pdf-shading.c b/src/cairo-pdf-shading.c new file mode 100644 index 000000000..646e2cd49 --- /dev/null +++ b/src/cairo-pdf-shading.c @@ -0,0 +1,279 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_PDF_OPERATORS + +#include "cairo-pdf-shading-private.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" +#include + +static unsigned char * +encode_coordinate (unsigned char *p, double c) +{ + uint32_t f; + + f = c; + *p++ = f >> 24; + *p++ = (f >> 16) & 0xff; + *p++ = (f >> 8) & 0xff; + *p++ = f & 0xff; + + return p; +} + +static unsigned char * +encode_point (unsigned char *p, const cairo_point_double_t *point) +{ + p = encode_coordinate (p, point->x); + p = encode_coordinate (p, point->y); + + return p; +} + +static unsigned char * +encode_color_component (unsigned char *p, double color) +{ + uint16_t c; + + c = _cairo_color_double_to_short (color); + *p++ = c >> 8; + *p++ = c & 0xff; + + return p; +} + +static unsigned char * +encode_color (unsigned char *p, const cairo_color_t *color) +{ + p = encode_color_component (p, color->red); + p = encode_color_component (p, color->green); + p = encode_color_component (p, color->blue); + + return p; +} + +static unsigned char * +encode_alpha (unsigned char *p, const cairo_color_t *color) +{ + p = encode_color_component (p, color->alpha); + + return p; +} + +static cairo_status_t +_cairo_pdf_shading_generate_decode_array (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *mesh, + cairo_bool_t is_alpha) +{ + unsigned int num_color_components, i; + cairo_bool_t is_valid; + + if (is_alpha) + num_color_components = 1; + else + num_color_components = 3; + + shading->decode_array_length = 4 + num_color_components * 2; + shading->decode_array = _cairo_malloc_ab (shading->decode_array_length, + sizeof (double)); + if (unlikely (shading->decode_array == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + is_valid = _cairo_mesh_pattern_coord_box (mesh, + &shading->decode_array[0], + &shading->decode_array[2], + &shading->decode_array[1], + &shading->decode_array[3]); + + assert (is_valid); + assert (shading->decode_array[1] - shading->decode_array[0] >= DBL_EPSILON); + assert (shading->decode_array[3] - shading->decode_array[2] >= DBL_EPSILON); + + for (i = 0; i < num_color_components; i++) { + shading->decode_array[4 + 2*i] = 0; + shading->decode_array[5 + 2*i] = 1; + } + + return CAIRO_STATUS_SUCCESS; +} + +/* The ISO32000 specification mandates this order for the points which + * define the patch. */ +static const int pdf_points_order_i[16] = { + 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 2, 1, 1, 1, 2, 2 }; +static const int pdf_points_order_j[16] = { + 0, 1, 2, 3, 3, 3, 3, 2, 1, 0, 0, 0, 1, 2, 2, 1 }; + +static cairo_status_t +_cairo_pdf_shading_generate_data (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *mesh, + cairo_bool_t is_alpha) +{ + const cairo_mesh_patch_t *patch; + double x_off, y_off, x_scale, y_scale; + unsigned int num_patches; + unsigned int num_color_components; + unsigned char *p; + unsigned int i, j; + + if (is_alpha) + num_color_components = 1; + else + num_color_components = 3; + + num_patches = _cairo_array_num_elements (&mesh->patches); + patch = _cairo_array_index_const (&mesh->patches, 0); + + /* Each patch requires: + * + * 1 flag - 1 byte + * 16 points. Each point is 2 coordinates. Each coordinate is + * stored in 4 bytes. + * + * 4 colors. Each color is stored in 2 bytes * num_color_components. + */ + shading->data_length = num_patches * (1 + 16 * 2 * 4 + 4 * 2 * num_color_components); + shading->data = malloc (shading->data_length); + if (unlikely (shading->data == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + x_off = shading->decode_array[0]; + y_off = shading->decode_array[2]; + x_scale = UINT32_MAX / (shading->decode_array[1] - x_off); + y_scale = UINT32_MAX / (shading->decode_array[3] - y_off); + + p = shading->data; + for (i = 0; i < num_patches; i++) { + /* edge flag */ + *p++ = 0; + + /* 16 points */ + for (j = 0; j < 16; j++) { + cairo_point_double_t point; + int pi, pj; + + pi = pdf_points_order_i[j]; + pj = pdf_points_order_j[j]; + point = patch[i].points[pi][pj]; + + /* Transform the point as specified in the decode array */ + point.x -= x_off; + point.y -= y_off; + point.x *= x_scale; + point.y *= y_scale; + + /* Make sure that rounding errors don't cause + * wraparounds */ + point.x = _cairo_restrict_value (point.x, 0, UINT32_MAX); + point.y = _cairo_restrict_value (point.y, 0, UINT32_MAX); + + p = encode_point (p, &point); + } + + /* 4 colors */ + for (j = 0; j < 4; j++) { + if (is_alpha) + p = encode_alpha (p, &patch[i].colors[j]); + else + p = encode_color (p, &patch[i].colors[j]); + } + } + + assert (p == shading->data + shading->data_length); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_pdf_shading_init (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *mesh, + cairo_bool_t is_alpha) +{ + cairo_status_t status; + + assert (mesh->base.status == CAIRO_STATUS_SUCCESS); + assert (mesh->current_patch == NULL); + + shading->shading_type = 7; + + /* + * Coordinates from the minimum to the maximum value of the mesh + * map to the [0..UINT32_MAX] range and are represented as + * uint32_t values. + * + * Color components are represented as uint16_t (in a 0.16 fixed + * point format, as in the rest of cairo). + */ + shading->bits_per_coordinate = 32; + shading->bits_per_component = 16; + shading->bits_per_flag = 8; + + shading->decode_array = NULL; + shading->data = NULL; + + status = _cairo_pdf_shading_generate_decode_array (shading, mesh, is_alpha); + if (unlikely (status)) + return status; + + return _cairo_pdf_shading_generate_data (shading, mesh, is_alpha); +} + +cairo_status_t +_cairo_pdf_shading_init_color (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *pattern) +{ + return _cairo_pdf_shading_init (shading, pattern, FALSE); +} + +cairo_status_t +_cairo_pdf_shading_init_alpha (cairo_pdf_shading_t *shading, + const cairo_mesh_pattern_t *pattern) +{ + return _cairo_pdf_shading_init (shading, pattern, TRUE); +} + +void +_cairo_pdf_shading_fini (cairo_pdf_shading_t *shading) +{ + free (shading->data); + free (shading->decode_array); +} + +#endif /* CAIRO_HAS_PDF_OPERATORS */ diff --git a/src/cairo-pdf-surface-private.h b/src/cairo-pdf-surface-private.h new file mode 100644 index 000000000..618ca4ede --- /dev/null +++ b/src/cairo-pdf-surface-private.h @@ -0,0 +1,218 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * Copyright © 2006 Red Hat, Inc + * Copyright © 2007, 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Carl Worth + * Adrian Johnson + */ + +#ifndef CAIRO_PDF_SURFACE_PRIVATE_H +#define CAIRO_PDF_SURFACE_PRIVATE_H + +#include "cairo-pdf.h" + +#include "cairo-surface-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-pdf-operators-private.h" +#include "cairo-path-fixed-private.h" + +typedef struct _cairo_pdf_resource { + unsigned int id; +} cairo_pdf_resource_t; + +#define CAIRO_NUM_OPERATORS (CAIRO_OPERATOR_HSL_LUMINOSITY + 1) + +typedef struct _cairo_pdf_group_resources { + cairo_bool_t operators[CAIRO_NUM_OPERATORS]; + cairo_array_t alphas; + cairo_array_t smasks; + cairo_array_t patterns; + cairo_array_t shadings; + cairo_array_t xobjects; + cairo_array_t fonts; +} cairo_pdf_group_resources_t; + +typedef struct _cairo_pdf_source_surface_entry { + cairo_hash_entry_t base; + unsigned int id; + unsigned char *unique_id; + unsigned long unique_id_length; + cairo_operator_t operator; + cairo_bool_t interpolate; + cairo_bool_t stencil_mask; + cairo_bool_t smask; + cairo_pdf_resource_t surface_res; + cairo_pdf_resource_t smask_res; + int width; + int height; + cairo_rectangle_int_t extents; +} cairo_pdf_source_surface_entry_t; + +typedef struct _cairo_pdf_source_surface { + cairo_pattern_type_t type; + cairo_surface_t *surface; + cairo_pattern_t *raster_pattern; + cairo_pdf_source_surface_entry_t *hash_entry; +} cairo_pdf_source_surface_t; + +typedef struct _cairo_pdf_pattern { + double width; + double height; + cairo_rectangle_int_t extents; + cairo_pattern_t *pattern; + cairo_pdf_resource_t pattern_res; + cairo_pdf_resource_t gstate_res; + cairo_operator_t operator; + cairo_bool_t is_shading; +} cairo_pdf_pattern_t; + +typedef enum _cairo_pdf_operation { + PDF_PAINT, + PDF_MASK, + PDF_FILL, + PDF_STROKE, + PDF_SHOW_GLYPHS +} cairo_pdf_operation_t; + +typedef struct _cairo_pdf_smask_group { + double width; + double height; + cairo_rectangle_int_t extents; + cairo_pdf_resource_t group_res; + cairo_pdf_operation_t operation; + cairo_pattern_t *source; + cairo_pdf_resource_t source_res; + cairo_pattern_t *mask; + cairo_path_fixed_t path; + cairo_fill_rule_t fill_rule; + cairo_stroke_style_t style; + cairo_matrix_t ctm; + cairo_matrix_t ctm_inverse; + char *utf8; + int utf8_len; + cairo_glyph_t *glyphs; + int num_glyphs; + cairo_text_cluster_t *clusters; + int num_clusters; + cairo_bool_t cluster_flags; + cairo_scaled_font_t *scaled_font; +} cairo_pdf_smask_group_t; + +typedef struct _cairo_pdf_jbig2_global { + unsigned char *id; + unsigned long id_length; + cairo_pdf_resource_t res; + cairo_bool_t emitted; +} cairo_pdf_jbig2_global_t; + +typedef struct _cairo_pdf_surface cairo_pdf_surface_t; + +struct _cairo_pdf_surface { + cairo_surface_t base; + + /* Prefer the name "output" here to avoid confusion over the + * structure within a PDF document known as a "stream". */ + cairo_output_stream_t *output; + + double width; + double height; + cairo_matrix_t cairo_to_pdf; + + cairo_array_t objects; + cairo_array_t pages; + cairo_array_t rgb_linear_functions; + cairo_array_t alpha_linear_functions; + cairo_array_t page_patterns; + cairo_array_t page_surfaces; + cairo_hash_table_t *all_surfaces; + cairo_array_t smask_groups; + cairo_array_t knockout_group; + cairo_array_t jbig2_global; + + cairo_scaled_font_subsets_t *font_subsets; + cairo_array_t fonts; + + cairo_pdf_resource_t next_available_resource; + cairo_pdf_resource_t pages_resource; + + cairo_pdf_version_t pdf_version; + cairo_bool_t compress_content; + + cairo_pdf_resource_t content; + cairo_pdf_resource_t content_resources; + cairo_pdf_group_resources_t resources; + cairo_bool_t has_fallback_images; + cairo_bool_t header_emitted; + + struct { + cairo_bool_t active; + cairo_pdf_resource_t self; + cairo_pdf_resource_t length; + long start_offset; + cairo_bool_t compressed; + cairo_output_stream_t *old_output; + } pdf_stream; + + struct { + cairo_bool_t active; + cairo_output_stream_t *stream; + cairo_output_stream_t *mem_stream; + cairo_output_stream_t *old_output; + cairo_pdf_resource_t resource; + cairo_box_double_t bbox; + cairo_bool_t is_knockout; + } group_stream; + + cairo_surface_clipper_t clipper; + + cairo_pdf_operators_t pdf_operators; + cairo_paginated_mode_t paginated_mode; + cairo_bool_t select_pattern_gstate_saved; + + cairo_bool_t force_fallbacks; + + cairo_operator_t current_operator; + cairo_bool_t current_pattern_is_solid_color; + cairo_bool_t current_color_is_stroke; + double current_color_red; + double current_color_green; + double current_color_blue; + double current_color_alpha; + + cairo_surface_t *paginated_surface; +}; + +#endif /* CAIRO_PDF_SURFACE_PRIVATE_H */ diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c new file mode 100644 index 000000000..fd52b0d3e --- /dev/null +++ b/src/cairo-pdf-surface.c @@ -0,0 +1,7880 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * Copyright © 2006 Red Hat, Inc + * Copyright © 2007, 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Carl Worth + * Adrian Johnson + */ + +#define _BSD_SOURCE /* for snprintf() */ +#include "cairoint.h" + +#include "cairo-pdf.h" +#include "cairo-pdf-surface-private.h" +#include "cairo-pdf-operators-private.h" +#include "cairo-pdf-shading-private.h" + +#include "cairo-array-private.h" +#include "cairo-analysis-surface-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-image-info-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-paginated-private.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-type3-glyph-surface-private.h" + +#include +#include + +/* Issues: + * + * - We embed an image in the stream each time it's composited. We + * could add generation counters to surfaces and remember the stream + * ID for a particular generation for a particular surface. + * + * - Backend specific meta data. + */ + +/* + * Page Structure of the Generated PDF: + * + * Each page requiring fallbacks images contains a knockout group at + * the top level. The first operation of the knockout group paints a + * group containing all the supported drawing operations. Fallback + * images (if any) are painted in the knockout group. This ensures + * that fallback images do not composite with any content under the + * fallback images. + * + * Streams: + * + * This PDF surface has three types of streams: + * - PDF Stream + * - Content Stream + * - Group Stream + * + * Calling _cairo_output_stream_printf (surface->output, ...) will + * write to the currently open stream. + * + * PDF Stream: + * A PDF Stream may be opened and closed with the following functions: + * _cairo_pdf_surface_open stream () + * _cairo_pdf_surface_close_stream () + * + * PDF Streams are written directly to the PDF file. They are used for + * fonts, images and patterns. + * + * Content Stream: + * The Content Stream is opened and closed with the following functions: + * _cairo_pdf_surface_open_content_stream () + * _cairo_pdf_surface_close_content_stream () + * + * The Content Stream contains the text and graphics operators. + * + * Group Stream: + * A Group Stream may be opened and closed with the following functions: + * _cairo_pdf_surface_open_group () + * _cairo_pdf_surface_close_group () + * + * A Group Stream is a Form XObject. It is used for short sequences + * of operators. As the content is very short the group is stored in + * memory until it is closed. This allows some optimization such as + * including the Resource dictionary and stream length inside the + * XObject instead of using an indirect object. + */ + +/** + * SECTION:cairo-pdf + * @Title: PDF Surfaces + * @Short_Description: Rendering PDF documents + * @See_Also: #cairo_surface_t + * + * The PDF surface is used to render cairo graphics to Adobe + * PDF files and is a multi-page vector surface backend. + * + * The following mime types are supported: %CAIRO_MIME_TYPE_JPEG, + * %CAIRO_MIME_TYPE_JP2, %CAIRO_MIME_TYPE_UNIQUE_ID, + * %CAIRO_MIME_TYPE_JBIG2, %CAIRO_MIME_TYPE_JBIG2_GLOBAL, + * %CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. + * + * JBIG2 data in PDF must be in the embedded format as descibed in + * ISO/IEC 11544. Image specific JBIG2 data must be in + * %CAIRO_MIME_TYPE_JBIG2. Any global segments in the JBIG2 data + * (segments with page association field set to 0) must be in + * %CAIRO_MIME_TYPE_JBIG2_GLOBAL. The global data may be shared by + * multiple images. All images sharing the same global data must set + * %CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID to a unique identifer. At least + * one of the images must provide the global data using + * %CAIRO_MIME_TYPE_JBIG2_GLOBAL. The global data will only be + * embedded once but shared by all JBIG2 images with the same + * %CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. + **/ + +static cairo_bool_t +_cairo_pdf_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle); + +/** + * CAIRO_HAS_PDF_SURFACE: + * + * Defined if the PDF surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.2 + **/ + +static const cairo_pdf_version_t _cairo_pdf_versions[] = +{ + CAIRO_PDF_VERSION_1_4, + CAIRO_PDF_VERSION_1_5 +}; + +#define CAIRO_PDF_VERSION_LAST ARRAY_LENGTH (_cairo_pdf_versions) + +static const char * _cairo_pdf_version_strings[CAIRO_PDF_VERSION_LAST] = +{ + "PDF 1.4", + "PDF 1.5" +}; + +static const char *_cairo_pdf_supported_mime_types[] = +{ + CAIRO_MIME_TYPE_JPEG, + CAIRO_MIME_TYPE_JP2, + CAIRO_MIME_TYPE_UNIQUE_ID, + CAIRO_MIME_TYPE_JBIG2, + CAIRO_MIME_TYPE_JBIG2_GLOBAL, + CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, + NULL +}; + +typedef struct _cairo_pdf_object { + long offset; +} cairo_pdf_object_t; + +typedef struct _cairo_pdf_font { + unsigned int font_id; + unsigned int subset_id; + cairo_pdf_resource_t subset_resource; +} cairo_pdf_font_t; + +typedef struct _cairo_pdf_rgb_linear_function { + cairo_pdf_resource_t resource; + double color1[3]; + double color2[3]; +} cairo_pdf_rgb_linear_function_t; + +typedef struct _cairo_pdf_alpha_linear_function { + cairo_pdf_resource_t resource; + double alpha1; + double alpha2; +} cairo_pdf_alpha_linear_function_t; + +static cairo_pdf_resource_t +_cairo_pdf_surface_new_object (cairo_pdf_surface_t *surface); + +static void +_cairo_pdf_surface_clear (cairo_pdf_surface_t *surface); + +static void +_cairo_pdf_smask_group_destroy (cairo_pdf_smask_group_t *group); + +static cairo_int_status_t +_cairo_pdf_surface_add_font (unsigned int font_id, + unsigned int subset_id, + void *closure); + +static void +_cairo_pdf_group_resources_init (cairo_pdf_group_resources_t *res); + +static cairo_int_status_t +_cairo_pdf_surface_open_stream (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t *resource, + cairo_bool_t compressed, + const char *fmt, + ...) CAIRO_PRINTF_FORMAT(4, 5); +static cairo_int_status_t +_cairo_pdf_surface_close_stream (cairo_pdf_surface_t *surface); + +static cairo_int_status_t +_cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface); + +static void +_cairo_pdf_surface_write_pages (cairo_pdf_surface_t *surface); + +static cairo_pdf_resource_t +_cairo_pdf_surface_write_info (cairo_pdf_surface_t *surface); + +static cairo_pdf_resource_t +_cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface); + +static long +_cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface); + +static cairo_int_status_t +_cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface); + +static cairo_int_status_t +_cairo_pdf_surface_emit_font_subsets (cairo_pdf_surface_t *surface); + +static cairo_bool_t +_cairo_pdf_source_surface_equal (const void *key_a, const void *key_b); + +static const cairo_surface_backend_t cairo_pdf_surface_backend; +static const cairo_paginated_surface_backend_t cairo_pdf_surface_paginated_backend; + +static cairo_pdf_resource_t +_cairo_pdf_surface_new_object (cairo_pdf_surface_t *surface) +{ + cairo_pdf_resource_t resource; + cairo_int_status_t status; + cairo_pdf_object_t object; + + object.offset = _cairo_output_stream_get_position (surface->output); + + status = _cairo_array_append (&surface->objects, &object); + if (unlikely (status)) { + resource.id = 0; + return resource; + } + + resource = surface->next_available_resource; + surface->next_available_resource.id++; + + return resource; +} + +static void +_cairo_pdf_surface_update_object (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t resource) +{ + cairo_pdf_object_t *object; + + object = _cairo_array_index (&surface->objects, resource.id - 1); + object->offset = _cairo_output_stream_get_position (surface->output); +} + +static void +_cairo_pdf_surface_set_size_internal (cairo_pdf_surface_t *surface, + double width, + double height) +{ + surface->width = width; + surface->height = height; + cairo_matrix_init (&surface->cairo_to_pdf, 1, 0, 0, -1, 0, height); + _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, + &surface->cairo_to_pdf); +} + +static cairo_bool_t +_path_covers_bbox (cairo_pdf_surface_t *surface, + cairo_path_fixed_t *path) +{ + cairo_box_t box; + + return _cairo_path_fixed_is_box (path, &box) && + box.p1.x <= 0 && + box.p1.y <= 0 && + box.p2.x >= _cairo_fixed_from_double (surface->width) && + box.p2.y >= _cairo_fixed_from_double (surface->height); +} + +static cairo_status_t +_cairo_pdf_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_pdf_surface_t *surface = cairo_container_of (clipper, + cairo_pdf_surface_t, + clipper); + cairo_int_status_t status; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + if (path == NULL) { + _cairo_output_stream_printf (surface->output, "Q q\n"); + + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + + return CAIRO_STATUS_SUCCESS; + } + + if (_path_covers_bbox (surface, path)) + return CAIRO_STATUS_SUCCESS; + + return _cairo_pdf_operators_clip (&surface->pdf_operators, path, fill_rule); +} + +static cairo_surface_t * +_cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output, + double width, + double height) +{ + cairo_pdf_surface_t *surface; + cairo_status_t status, status_ignored; + + surface = malloc (sizeof (cairo_pdf_surface_t)); + if (unlikely (surface == NULL)) { + /* destroy stream on behalf of caller */ + status = _cairo_output_stream_destroy (output); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + _cairo_surface_init (&surface->base, + &cairo_pdf_surface_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + surface->output = output; + surface->width = width; + surface->height = height; + cairo_matrix_init (&surface->cairo_to_pdf, 1, 0, 0, -1, 0, height); + + _cairo_array_init (&surface->objects, sizeof (cairo_pdf_object_t)); + _cairo_array_init (&surface->pages, sizeof (cairo_pdf_resource_t)); + _cairo_array_init (&surface->rgb_linear_functions, sizeof (cairo_pdf_rgb_linear_function_t)); + _cairo_array_init (&surface->alpha_linear_functions, sizeof (cairo_pdf_alpha_linear_function_t)); + _cairo_array_init (&surface->fonts, sizeof (cairo_pdf_font_t)); + _cairo_array_init (&surface->smask_groups, sizeof (cairo_pdf_smask_group_t *)); + _cairo_array_init (&surface->knockout_group, sizeof (cairo_pdf_resource_t)); + + _cairo_array_init (&surface->page_patterns, sizeof (cairo_pdf_pattern_t)); + _cairo_array_init (&surface->page_surfaces, sizeof (cairo_pdf_source_surface_t)); + _cairo_array_init (&surface->jbig2_global, sizeof (cairo_pdf_jbig2_global_t)); + surface->all_surfaces = _cairo_hash_table_create (_cairo_pdf_source_surface_equal); + if (unlikely (surface->all_surfaces == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL0; + } + + _cairo_pdf_group_resources_init (&surface->resources); + + surface->font_subsets = _cairo_scaled_font_subsets_create_composite (); + if (! surface->font_subsets) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL1; + } + + _cairo_scaled_font_subsets_enable_latin_subset (surface->font_subsets, TRUE); + + surface->next_available_resource.id = 1; + surface->pages_resource = _cairo_pdf_surface_new_object (surface); + if (surface->pages_resource.id == 0) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL2; + } + + surface->pdf_version = CAIRO_PDF_VERSION_1_5; + surface->compress_content = TRUE; + surface->pdf_stream.active = FALSE; + surface->pdf_stream.old_output = NULL; + surface->group_stream.active = FALSE; + surface->group_stream.stream = NULL; + surface->group_stream.mem_stream = NULL; + + surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; + + surface->force_fallbacks = FALSE; + surface->select_pattern_gstate_saved = FALSE; + surface->current_pattern_is_solid_color = FALSE; + surface->current_operator = CAIRO_OPERATOR_OVER; + surface->header_emitted = FALSE; + + _cairo_surface_clipper_init (&surface->clipper, + _cairo_pdf_surface_clipper_intersect_clip_path); + + _cairo_pdf_operators_init (&surface->pdf_operators, + surface->output, + &surface->cairo_to_pdf, + surface->font_subsets, + FALSE); + _cairo_pdf_operators_set_font_subsets_callback (&surface->pdf_operators, + _cairo_pdf_surface_add_font, + surface); + _cairo_pdf_operators_enable_actual_text(&surface->pdf_operators, TRUE); + + surface->paginated_surface = _cairo_paginated_surface_create ( + &surface->base, + CAIRO_CONTENT_COLOR_ALPHA, + &cairo_pdf_surface_paginated_backend); + + status = surface->paginated_surface->status; + if (status == CAIRO_STATUS_SUCCESS) { + /* paginated keeps the only reference to surface now, drop ours */ + cairo_surface_destroy (&surface->base); + return surface->paginated_surface; + } + +BAIL2: + _cairo_scaled_font_subsets_destroy (surface->font_subsets); +BAIL1: + _cairo_hash_table_destroy (surface->all_surfaces); +BAIL0: + _cairo_array_fini (&surface->objects); + free (surface); + + /* destroy stream on behalf of caller */ + status_ignored = _cairo_output_stream_destroy (output); + + return _cairo_surface_create_in_error (status); +} + +/** + * cairo_pdf_surface_create_for_stream: + * @write_func: a #cairo_write_func_t to accept the output data, may be %NULL + * to indicate a no-op @write_func. With a no-op @write_func, + * the surface may be queried or used as a source without + * generating any temporary files. + * @closure: the closure argument for @write_func + * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + * + * Creates a PDF surface of the specified size in points to be written + * incrementally to the stream represented by @write_func and @closure. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points) +{ + cairo_output_stream_t *output; + + output = _cairo_output_stream_create (write_func, NULL, closure); + if (_cairo_output_stream_get_status (output)) + return _cairo_surface_create_in_error (_cairo_output_stream_destroy (output)); + + return _cairo_pdf_surface_create_for_stream_internal (output, + width_in_points, + height_in_points); +} + +/** + * cairo_pdf_surface_create: + * @filename: a filename for the PDF output (must be writable), %NULL may be + * used to specify no output. This will generate a PDF surface that + * may be queried and used as a source, without generating a + * temporary file. + * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + * + * Creates a PDF surface of the specified size in points to be written + * to @filename. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_pdf_surface_create (const char *filename, + double width_in_points, + double height_in_points) +{ + cairo_output_stream_t *output; + + output = _cairo_output_stream_create_for_filename (filename); + if (_cairo_output_stream_get_status (output)) + return _cairo_surface_create_in_error (_cairo_output_stream_destroy (output)); + + return _cairo_pdf_surface_create_for_stream_internal (output, + width_in_points, + height_in_points); +} + +static cairo_bool_t +_cairo_surface_is_pdf (cairo_surface_t *surface) +{ + return surface->backend == &cairo_pdf_surface_backend; +} + +/* If the abstract_surface is a paginated surface, and that paginated + * surface's target is a pdf_surface, then set pdf_surface to that + * target. Otherwise return FALSE. + */ +static cairo_bool_t +_extract_pdf_surface (cairo_surface_t *surface, + cairo_pdf_surface_t **pdf_surface) +{ + cairo_surface_t *target; + cairo_status_t status_ignored; + + if (surface->status) + return FALSE; + if (surface->finished) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (! _cairo_surface_is_paginated (surface)) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return FALSE; + } + + target = _cairo_paginated_surface_get_target (surface); + if (target->status) { + status_ignored = _cairo_surface_set_error (surface, + target->status); + return FALSE; + } + if (target->finished) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (! _cairo_surface_is_pdf (target)) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return FALSE; + } + + *pdf_surface = (cairo_pdf_surface_t *) target; + return TRUE; +} + +/** + * cairo_pdf_surface_restrict_to_version: + * @surface: a PDF #cairo_surface_t + * @version: PDF version + * + * Restricts the generated PDF file to @version. See cairo_pdf_get_versions() + * for a list of available version values that can be used here. + * + * This function should only be called before any drawing operations + * have been performed on the given surface. The simplest way to do + * this is to call this function immediately after creating the + * surface. + * + * Since: 1.10 + **/ +void +cairo_pdf_surface_restrict_to_version (cairo_surface_t *abstract_surface, + cairo_pdf_version_t version) +{ + cairo_pdf_surface_t *surface = NULL; /* hide compiler warning */ + + if (! _extract_pdf_surface (abstract_surface, &surface)) + return; + + if (version < CAIRO_PDF_VERSION_LAST) + surface->pdf_version = version; + + _cairo_pdf_operators_enable_actual_text(&surface->pdf_operators, + version >= CAIRO_PDF_VERSION_1_5); +} + +/** + * cairo_pdf_get_versions: + * @versions: supported version list + * @num_versions: list length + * + * Used to retrieve the list of supported versions. See + * cairo_pdf_surface_restrict_to_version(). + * + * Since: 1.10 + **/ +void +cairo_pdf_get_versions (cairo_pdf_version_t const **versions, + int *num_versions) +{ + if (versions != NULL) + *versions = _cairo_pdf_versions; + + if (num_versions != NULL) + *num_versions = CAIRO_PDF_VERSION_LAST; +} + +/** + * cairo_pdf_version_to_string: + * @version: a version id + * + * Get the string representation of the given @version id. This function + * will return %NULL if @version isn't valid. See cairo_pdf_get_versions() + * for a way to get the list of valid version ids. + * + * Return value: the string associated to given version. + * + * Since: 1.10 + **/ +const char * +cairo_pdf_version_to_string (cairo_pdf_version_t version) +{ + if (version >= CAIRO_PDF_VERSION_LAST) + return NULL; + + return _cairo_pdf_version_strings[version]; +} + +/** + * cairo_pdf_surface_set_size: + * @surface: a PDF #cairo_surface_t + * @width_in_points: new surface width, in points (1 point == 1/72.0 inch) + * @height_in_points: new surface height, in points (1 point == 1/72.0 inch) + * + * Changes the size of a PDF surface for the current (and + * subsequent) pages. + * + * This function should only be called before any drawing operations + * have been performed on the current page. The simplest way to do + * this is to call this function immediately after creating the + * surface or immediately after completing a page with either + * cairo_show_page() or cairo_copy_page(). + * + * Since: 1.2 + **/ +void +cairo_pdf_surface_set_size (cairo_surface_t *surface, + double width_in_points, + double height_in_points) +{ + cairo_pdf_surface_t *pdf_surface = NULL; /* hide compiler warning */ + cairo_status_t status; + + if (! _extract_pdf_surface (surface, &pdf_surface)) + return; + + _cairo_pdf_surface_set_size_internal (pdf_surface, + width_in_points, + height_in_points); + status = _cairo_paginated_surface_set_size (pdf_surface->paginated_surface, + width_in_points, + height_in_points); + if (status) + status = _cairo_surface_set_error (surface, status); +} + +static void +_cairo_pdf_surface_clear (cairo_pdf_surface_t *surface) +{ + int i, size; + cairo_pdf_pattern_t *pattern; + cairo_pdf_source_surface_t *src_surface; + cairo_pdf_smask_group_t *group; + + size = _cairo_array_num_elements (&surface->page_patterns); + for (i = 0; i < size; i++) { + pattern = (cairo_pdf_pattern_t *) _cairo_array_index (&surface->page_patterns, i); + cairo_pattern_destroy (pattern->pattern); + } + _cairo_array_truncate (&surface->page_patterns, 0); + + size = _cairo_array_num_elements (&surface->page_surfaces); + for (i = 0; i < size; i++) { + src_surface = (cairo_pdf_source_surface_t *) _cairo_array_index (&surface->page_surfaces, i); + cairo_surface_destroy (src_surface->surface); + } + _cairo_array_truncate (&surface->page_surfaces, 0); + + size = _cairo_array_num_elements (&surface->smask_groups); + for (i = 0; i < size; i++) { + _cairo_array_copy_element (&surface->smask_groups, i, &group); + _cairo_pdf_smask_group_destroy (group); + } + _cairo_array_truncate (&surface->smask_groups, 0); + _cairo_array_truncate (&surface->knockout_group, 0); +} + +static void +_cairo_pdf_group_resources_init (cairo_pdf_group_resources_t *res) +{ + int i; + + for (i = 0; i < CAIRO_NUM_OPERATORS; i++) + res->operators[i] = FALSE; + + _cairo_array_init (&res->alphas, sizeof (double)); + _cairo_array_init (&res->smasks, sizeof (cairo_pdf_resource_t)); + _cairo_array_init (&res->patterns, sizeof (cairo_pdf_resource_t)); + _cairo_array_init (&res->shadings, sizeof (cairo_pdf_resource_t)); + _cairo_array_init (&res->xobjects, sizeof (cairo_pdf_resource_t)); + _cairo_array_init (&res->fonts, sizeof (cairo_pdf_font_t)); +} + +static void +_cairo_pdf_group_resources_fini (cairo_pdf_group_resources_t *res) +{ + _cairo_array_fini (&res->alphas); + _cairo_array_fini (&res->smasks); + _cairo_array_fini (&res->patterns); + _cairo_array_fini (&res->shadings); + _cairo_array_fini (&res->xobjects); + _cairo_array_fini (&res->fonts); +} + +static void +_cairo_pdf_group_resources_clear (cairo_pdf_group_resources_t *res) +{ + int i; + + for (i = 0; i < CAIRO_NUM_OPERATORS; i++) + res->operators[i] = FALSE; + + _cairo_array_truncate (&res->alphas, 0); + _cairo_array_truncate (&res->smasks, 0); + _cairo_array_truncate (&res->patterns, 0); + _cairo_array_truncate (&res->shadings, 0); + _cairo_array_truncate (&res->xobjects, 0); + _cairo_array_truncate (&res->fonts, 0); +} + +static void +_cairo_pdf_surface_add_operator (cairo_pdf_surface_t *surface, + cairo_operator_t op) +{ + cairo_pdf_group_resources_t *res = &surface->resources; + + res->operators[op] = TRUE; +} + +static cairo_int_status_t +_cairo_pdf_surface_add_alpha (cairo_pdf_surface_t *surface, + double alpha, + int *index) +{ + int num_alphas, i; + double other; + cairo_int_status_t status; + cairo_pdf_group_resources_t *res = &surface->resources; + + num_alphas = _cairo_array_num_elements (&res->alphas); + for (i = 0; i < num_alphas; i++) { + _cairo_array_copy_element (&res->alphas, i, &other); + if (alpha == other) { + *index = i; + return CAIRO_STATUS_SUCCESS; + } + } + + status = _cairo_array_append (&res->alphas, &alpha); + if (unlikely (status)) + return status; + + *index = _cairo_array_num_elements (&res->alphas) - 1; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_add_smask (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t smask) +{ + return _cairo_array_append (&(surface->resources.smasks), &smask); +} + +static cairo_int_status_t +_cairo_pdf_surface_add_pattern (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t pattern) +{ + return _cairo_array_append (&(surface->resources.patterns), &pattern); +} + +static cairo_int_status_t +_cairo_pdf_surface_add_shading (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t shading) +{ + return _cairo_array_append (&(surface->resources.shadings), &shading); +} + + +static cairo_int_status_t +_cairo_pdf_surface_add_xobject (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t xobject) +{ + return _cairo_array_append (&(surface->resources.xobjects), &xobject); +} + +static cairo_int_status_t +_cairo_pdf_surface_add_font (unsigned int font_id, + unsigned int subset_id, + void *closure) +{ + cairo_pdf_surface_t *surface = closure; + cairo_pdf_font_t font; + int num_fonts, i; + cairo_int_status_t status; + cairo_pdf_group_resources_t *res = &surface->resources; + + num_fonts = _cairo_array_num_elements (&res->fonts); + for (i = 0; i < num_fonts; i++) { + _cairo_array_copy_element (&res->fonts, i, &font); + if (font.font_id == font_id && + font.subset_id == subset_id) + return CAIRO_STATUS_SUCCESS; + } + + num_fonts = _cairo_array_num_elements (&surface->fonts); + for (i = 0; i < num_fonts; i++) { + _cairo_array_copy_element (&surface->fonts, i, &font); + if (font.font_id == font_id && + font.subset_id == subset_id) + return _cairo_array_append (&res->fonts, &font); + } + + font.font_id = font_id; + font.subset_id = subset_id; + font.subset_resource = _cairo_pdf_surface_new_object (surface); + if (font.subset_resource.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_array_append (&surface->fonts, &font); + if (unlikely (status)) + return status; + + return _cairo_array_append (&res->fonts, &font); +} + +static cairo_pdf_resource_t +_cairo_pdf_surface_get_font_resource (cairo_pdf_surface_t *surface, + unsigned int font_id, + unsigned int subset_id) +{ + cairo_pdf_font_t font; + int num_fonts, i; + + num_fonts = _cairo_array_num_elements (&surface->fonts); + for (i = 0; i < num_fonts; i++) { + _cairo_array_copy_element (&surface->fonts, i, &font); + if (font.font_id == font_id && font.subset_id == subset_id) + return font.subset_resource; + } + + font.subset_resource.id = 0; + return font.subset_resource; +} + +static const char * +_cairo_operator_to_pdf_blend_mode (cairo_operator_t op) +{ + switch (op) { + /* The extend blend mode operators */ + case CAIRO_OPERATOR_MULTIPLY: return "Multiply"; + case CAIRO_OPERATOR_SCREEN: return "Screen"; + case CAIRO_OPERATOR_OVERLAY: return "Overlay"; + case CAIRO_OPERATOR_DARKEN: return "Darken"; + case CAIRO_OPERATOR_LIGHTEN: return "Lighten"; + case CAIRO_OPERATOR_COLOR_DODGE: return "ColorDodge"; + case CAIRO_OPERATOR_COLOR_BURN: return "ColorBurn"; + case CAIRO_OPERATOR_HARD_LIGHT: return "HardLight"; + case CAIRO_OPERATOR_SOFT_LIGHT: return "SoftLight"; + case CAIRO_OPERATOR_DIFFERENCE: return "Difference"; + case CAIRO_OPERATOR_EXCLUSION: return "Exclusion"; + case CAIRO_OPERATOR_HSL_HUE: return "Hue"; + case CAIRO_OPERATOR_HSL_SATURATION: return "Saturation"; + case CAIRO_OPERATOR_HSL_COLOR: return "Color"; + case CAIRO_OPERATOR_HSL_LUMINOSITY: return "Luminosity"; + + default: + /* The original Porter-Duff set */ + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_ATOP: + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_DEST_ATOP: + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + return "Normal"; + } +} + +static void +_cairo_pdf_surface_emit_group_resources (cairo_pdf_surface_t *surface, + cairo_pdf_group_resources_t *res) +{ + int num_alphas, num_smasks, num_resources, i; + double alpha; + cairo_pdf_resource_t *smask, *pattern, *shading, *xobject; + cairo_pdf_font_t *font; + + _cairo_output_stream_printf (surface->output, "<<\n"); + + num_alphas = _cairo_array_num_elements (&res->alphas); + num_smasks = _cairo_array_num_elements (&res->smasks); + if (num_alphas > 0 || num_smasks > 0) { + _cairo_output_stream_printf (surface->output, + " /ExtGState <<\n"); + + for (i = 0; i < CAIRO_NUM_OPERATORS; i++) { + if (res->operators[i]) { + _cairo_output_stream_printf (surface->output, + " /b%d << /BM /%s >>\n", + i, _cairo_operator_to_pdf_blend_mode(i)); + } + } + + for (i = 0; i < num_alphas; i++) { + _cairo_array_copy_element (&res->alphas, i, &alpha); + _cairo_output_stream_printf (surface->output, + " /a%d << /CA %f /ca %f >>\n", + i, alpha, alpha); + } + + for (i = 0; i < num_smasks; i++) { + smask = _cairo_array_index (&res->smasks, i); + _cairo_output_stream_printf (surface->output, + " /s%d %d 0 R\n", + smask->id, smask->id); + } + + _cairo_output_stream_printf (surface->output, + " >>\n"); + } + + num_resources = _cairo_array_num_elements (&res->patterns); + if (num_resources > 0) { + _cairo_output_stream_printf (surface->output, + " /Pattern <<"); + for (i = 0; i < num_resources; i++) { + pattern = _cairo_array_index (&res->patterns, i); + _cairo_output_stream_printf (surface->output, + " /p%d %d 0 R", + pattern->id, pattern->id); + } + + _cairo_output_stream_printf (surface->output, + " >>\n"); + } + + num_resources = _cairo_array_num_elements (&res->shadings); + if (num_resources > 0) { + _cairo_output_stream_printf (surface->output, + " /Shading <<"); + for (i = 0; i < num_resources; i++) { + shading = _cairo_array_index (&res->shadings, i); + _cairo_output_stream_printf (surface->output, + " /sh%d %d 0 R", + shading->id, shading->id); + } + + _cairo_output_stream_printf (surface->output, + " >>\n"); + } + + num_resources = _cairo_array_num_elements (&res->xobjects); + if (num_resources > 0) { + _cairo_output_stream_printf (surface->output, + " /XObject <<"); + + for (i = 0; i < num_resources; i++) { + xobject = _cairo_array_index (&res->xobjects, i); + _cairo_output_stream_printf (surface->output, + " /x%d %d 0 R", + xobject->id, xobject->id); + } + + _cairo_output_stream_printf (surface->output, + " >>\n"); + } + + num_resources = _cairo_array_num_elements (&res->fonts); + if (num_resources > 0) { + _cairo_output_stream_printf (surface->output," /Font <<\n"); + for (i = 0; i < num_resources; i++) { + font = _cairo_array_index (&res->fonts, i); + _cairo_output_stream_printf (surface->output, + " /f-%d-%d %d 0 R\n", + font->font_id, + font->subset_id, + font->subset_resource.id); + } + _cairo_output_stream_printf (surface->output, " >>\n"); + } + + _cairo_output_stream_printf (surface->output, + ">>\n"); +} + +static cairo_pdf_smask_group_t * +_cairo_pdf_surface_create_smask_group (cairo_pdf_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_pdf_smask_group_t *group; + + group = calloc (1, sizeof (cairo_pdf_smask_group_t)); + if (unlikely (group == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + group->group_res = _cairo_pdf_surface_new_object (surface); + if (group->group_res.id == 0) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + free (group); + return NULL; + } + group->width = surface->width; + group->height = surface->height; + if (extents != NULL) { + group->extents = *extents; + } else { + group->extents.x = 0; + group->extents.y = 0; + group->extents.width = surface->width; + group->extents.height = surface->height; + } + group->extents = *extents; + + return group; +} + +static void +_cairo_pdf_smask_group_destroy (cairo_pdf_smask_group_t *group) +{ + if (group->operation == PDF_FILL || group->operation == PDF_STROKE) + _cairo_path_fixed_fini (&group->path); + if (group->source) + cairo_pattern_destroy (group->source); + if (group->mask) + cairo_pattern_destroy (group->mask); + free (group->utf8); + free (group->glyphs); + free (group->clusters); + if (group->scaled_font) + cairo_scaled_font_destroy (group->scaled_font); + free (group); +} + +static cairo_int_status_t +_cairo_pdf_surface_add_smask_group (cairo_pdf_surface_t *surface, + cairo_pdf_smask_group_t *group) +{ + return _cairo_array_append (&surface->smask_groups, &group); +} + +static cairo_bool_t +_cairo_pdf_source_surface_equal (const void *key_a, const void *key_b) +{ + const cairo_pdf_source_surface_entry_t *a = key_a; + const cairo_pdf_source_surface_entry_t *b = key_b; + + if (a->interpolate != b->interpolate) + return FALSE; + + if (a->unique_id && b->unique_id && a->unique_id_length == b->unique_id_length) + return (memcmp (a->unique_id, b->unique_id, a->unique_id_length) == 0); + + return (a->id == b->id); +} + +static void +_cairo_pdf_source_surface_init_key (cairo_pdf_source_surface_entry_t *key) +{ + if (key->unique_id && key->unique_id_length > 0) { + key->base.hash = _cairo_hash_bytes (_CAIRO_HASH_INIT_VALUE, + key->unique_id, key->unique_id_length); + } else { + key->base.hash = key->id; + } +} + +static cairo_int_status_t +_cairo_pdf_surface_acquire_source_image_from_pattern (cairo_pdf_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_image_surface_t **image, + void **image_extra) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_pattern_t *surf_pat = (cairo_surface_pattern_t *) pattern; + return _cairo_surface_acquire_source_image (surf_pat->surface, image, image_extra); + } break; + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: { + cairo_surface_t *surf; + surf = _cairo_raster_source_pattern_acquire (pattern, &surface->base, NULL); + if (!surf) + return CAIRO_INT_STATUS_UNSUPPORTED; + assert (_cairo_surface_is_image (surf)); + *image = (cairo_image_surface_t *) surf; + } break; + + case CAIRO_PATTERN_TYPE_SOLID: + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + default: + ASSERT_NOT_REACHED; + break; + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_pdf_surface_release_source_image_from_pattern (cairo_pdf_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_image_surface_t *image, + void *image_extra) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_pattern_t *surf_pat = (cairo_surface_pattern_t *) pattern; + _cairo_surface_release_source_image (surf_pat->surface, image, image_extra); + } break; + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + _cairo_raster_source_pattern_release (pattern, &image->base); + break; + + case CAIRO_PATTERN_TYPE_SOLID: + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + default: + + ASSERT_NOT_REACHED; + break; + } +} + +static cairo_int_status_t +_get_jbig2_image_info (cairo_surface_t *source, + cairo_image_info_t *info, + const unsigned char **mime_data, + unsigned long *mime_data_length) +{ + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JBIG2, + mime_data, mime_data_length); + if (*mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return _cairo_image_info_get_jbig2_info (info, *mime_data, *mime_data_length); +} + +static cairo_int_status_t +_get_jpx_image_info (cairo_surface_t *source, + cairo_image_info_t *info, + const unsigned char **mime_data, + unsigned long *mime_data_length) +{ + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JP2, + mime_data, mime_data_length); + if (*mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return _cairo_image_info_get_jpx_info (info, *mime_data, *mime_data_length); +} + +static cairo_int_status_t +_get_jpeg_image_info (cairo_surface_t *source, + cairo_image_info_t *info, + const unsigned char **mime_data, + unsigned long *mime_data_length) +{ + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JPEG, + mime_data, mime_data_length); + if (*mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return _cairo_image_info_get_jpeg_info (info, *mime_data, *mime_data_length); +} + +static cairo_int_status_t +_get_source_surface_size (cairo_surface_t *source, + int *width, + int *height, + cairo_rectangle_int_t *extents) +{ + cairo_int_status_t status; + cairo_image_info_t info; + const unsigned char *mime_data; + unsigned long mime_data_length; + + if (source->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (source->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source; + + *extents = sub->extents; + *width = extents->width; + *height = extents->height; + } else { + cairo_surface_t *free_me = NULL; + cairo_rectangle_int_t surf_extents; + cairo_box_t box; + cairo_bool_t bounded; + + if (_cairo_surface_is_snapshot (source)) + free_me = source = _cairo_surface_snapshot_get_target (source); + + status = _cairo_recording_surface_get_ink_bbox ((cairo_recording_surface_t *)source, + &box, NULL); + if (unlikely (status)) { + cairo_surface_destroy (free_me); + return status; + } + + bounded = _cairo_surface_get_extents (source, &surf_extents); + cairo_surface_destroy (free_me); + + *width = surf_extents.width; + *height = surf_extents.height; + + _cairo_box_round_to_rectangle (&box, extents); + } + + return CAIRO_STATUS_SUCCESS; + } + + extents->x = 0; + extents->y = 0; + + status = _get_jbig2_image_info (source, &info, &mime_data, &mime_data_length); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) { + *width = info.width; + *height = info.height; + extents->width = info.width; + extents->height = info.height; + return status; + } + + status = _get_jpx_image_info (source, &info, &mime_data, &mime_data_length); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) { + *width = info.width; + *height = info.height; + extents->width = info.width; + extents->height = info.height; + return status; + } + + status = _get_jpeg_image_info (source, &info, &mime_data, &mime_data_length); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) { + *width = info.width; + *height = info.height; + extents->width = info.width; + extents->height = info.height; + return status; + } + + if (! _cairo_surface_get_extents (source, extents)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + *width = extents->width; + *height = extents->height; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_pdf_surface_add_source_surface: + * @surface: the pdf surface + * @source_surface: A #cairo_surface_t to use as the source surface + * @source_pattern: A #cairo_pattern_t of type SURFACE or RASTER_SOURCE to use as the source + * @op: the operator used to composite this source + * @filter: filter type of the source pattern + * @stencil_mask: if true, the surface will be written to the PDF as an /ImageMask + * @smask: if true, only the alpha channel will be written (images only) + * @extents: extents of the operation that is using this source + * @smask_res: if not NULL, the image written will specify this resource as the smask for the image (images only) + * @surface_res: return PDF resource number of the surface + * @width: returns width of surface + * @height: returns height of surface + * @x_offset: x offset of surface + * @t_offset: y offset of surface + * @source_extents: returns extents of source (either ink extents or extents needed to cover @extents) + * + * Add surface or raster_source pattern to list of surfaces to be + * written to the PDF file when the current page is finished. Returns + * a PDF resource to reference the image. A hash table of all images + * in the PDF files (keyed by CAIRO_MIME_TYPE_UNIQUE_ID or surface + * unique_id) to ensure surfaces with the same id are only written + * once to the PDF file. + * + * Only one of @source_pattern or @source_surface is to be + * specified. Set the other to NULL. + **/ +static cairo_int_status_t +_cairo_pdf_surface_add_source_surface (cairo_pdf_surface_t *surface, + cairo_surface_t *source_surface, + const cairo_pattern_t *source_pattern, + cairo_operator_t op, + cairo_filter_t filter, + cairo_bool_t stencil_mask, + cairo_bool_t smask, + const cairo_rectangle_int_t *extents, + cairo_pdf_resource_t *smask_res, + cairo_pdf_resource_t *surface_res, + int *width, + int *height, + double *x_offset, + double *y_offset, + cairo_rectangle_int_t *source_extents) +{ + cairo_pdf_source_surface_t src_surface; + cairo_pdf_source_surface_entry_t surface_key; + cairo_pdf_source_surface_entry_t *surface_entry; + cairo_int_status_t status; + cairo_bool_t interpolate; + unsigned char *unique_id = NULL; + unsigned long unique_id_length = 0; + cairo_image_surface_t *image; + void *image_extra; + + switch (filter) { + default: + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_BILINEAR: + interpolate = TRUE; + break; + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + case CAIRO_FILTER_GAUSSIAN: + interpolate = FALSE; + break; + } + + *x_offset = 0; + *y_offset = 0; + if (source_pattern) { + if (source_pattern->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) { + status = _cairo_pdf_surface_acquire_source_image_from_pattern (surface, source_pattern, + &image, &image_extra); + if (unlikely (status)) + return status; + source_surface = &image->base; + cairo_surface_get_device_offset (source_surface, x_offset, y_offset); + } else { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) source_pattern; + source_surface = surface_pattern->surface; + } + } + + surface_key.id = source_surface->unique_id; + surface_key.interpolate = interpolate; + cairo_surface_get_mime_data (source_surface, CAIRO_MIME_TYPE_UNIQUE_ID, + (const unsigned char **) &surface_key.unique_id, + &surface_key.unique_id_length); + _cairo_pdf_source_surface_init_key (&surface_key); + surface_entry = _cairo_hash_table_lookup (surface->all_surfaces, &surface_key.base); + if (surface_entry) { + *surface_res = surface_entry->surface_res; + *width = surface_entry->width; + *height = surface_entry->height; + *source_extents = surface_entry->extents; + status = CAIRO_STATUS_SUCCESS; + } else { + status = _get_source_surface_size (source_surface, + width, + height, + source_extents); + if (unlikely(status)) + goto release_source; + + if (surface_key.unique_id && surface_key.unique_id_length > 0) { + unique_id = _cairo_malloc (surface_key.unique_id_length); + if (unique_id == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto release_source; + } + + unique_id_length = surface_key.unique_id_length; + memcpy (unique_id, surface_key.unique_id, unique_id_length); + } else { + unique_id = NULL; + unique_id_length = 0; + } + } + +release_source: + if (source_pattern && source_pattern->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) + _cairo_pdf_surface_release_source_image_from_pattern (surface, source_pattern, image, image_extra); + + if (status || surface_entry) + return status; + + surface_entry = malloc (sizeof (cairo_pdf_source_surface_entry_t)); + if (surface_entry == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + surface_entry->id = surface_key.id; + surface_entry->operator = op; + surface_entry->interpolate = interpolate; + surface_entry->stencil_mask = stencil_mask; + surface_entry->smask = smask; + surface_entry->unique_id_length = unique_id_length; + surface_entry->unique_id = unique_id; + surface_entry->width = *width; + surface_entry->height = *height; + surface_entry->extents = *source_extents; + if (smask_res) + surface_entry->smask_res = *smask_res; + else + surface_entry->smask_res.id = 0; + _cairo_pdf_source_surface_init_key (surface_entry); + + src_surface.hash_entry = surface_entry; + if (source_pattern && source_pattern->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) { + src_surface.type = CAIRO_PATTERN_TYPE_RASTER_SOURCE; + src_surface.surface = NULL; + status = _cairo_pattern_create_copy (&src_surface.raster_pattern, source_pattern); + if (unlikely (status)) + goto fail2; + + } else { + src_surface.type = CAIRO_PATTERN_TYPE_SURFACE; + src_surface.surface = cairo_surface_reference (source_surface); + src_surface.raster_pattern = NULL; + } + + surface_entry->surface_res = _cairo_pdf_surface_new_object (surface); + if (surface_entry->surface_res.id == 0) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + + status = _cairo_array_append (&surface->page_surfaces, &src_surface); + if (unlikely (status)) + goto fail3; + + status = _cairo_hash_table_insert (surface->all_surfaces, + &surface_entry->base); + if (unlikely(status)) + goto fail3; + + *surface_res = surface_entry->surface_res; + + return status; + +fail3: + if (source_pattern && source_pattern->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) + cairo_pattern_destroy (src_surface.raster_pattern); + else + cairo_surface_destroy (src_surface.surface); + +fail2: + free (surface_entry); + +fail1: + free (unique_id); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_add_pdf_pattern_or_shading (cairo_pdf_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_operator_t op, + const cairo_rectangle_int_t *extents, + cairo_bool_t is_shading, + cairo_pdf_resource_t *pattern_res, + cairo_pdf_resource_t *gstate_res) +{ + cairo_pdf_pattern_t pdf_pattern; + cairo_int_status_t status; + + pdf_pattern.is_shading = is_shading; + pdf_pattern.operator = op; + + /* Solid colors are emitted into the content stream */ + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + pattern_res->id = 0; + gstate_res->id = 0; + return CAIRO_INT_STATUS_SUCCESS; + } + + status = _cairo_pattern_create_copy (&pdf_pattern.pattern, pattern); + if (unlikely (status)) + return status; + + pdf_pattern.pattern_res = _cairo_pdf_surface_new_object (surface); + if (pdf_pattern.pattern_res.id == 0) { + cairo_pattern_destroy (pdf_pattern.pattern); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pdf_pattern.gstate_res.id = 0; + + /* gradient patterns require an smask object to implement transparency */ + if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || + pattern->type == CAIRO_PATTERN_TYPE_RADIAL || + pattern->type == CAIRO_PATTERN_TYPE_MESH) + { + double min_alpha; + + _cairo_pattern_alpha_range (pattern, &min_alpha, NULL); + if (! CAIRO_ALPHA_IS_OPAQUE (min_alpha)) { + pdf_pattern.gstate_res = _cairo_pdf_surface_new_object (surface); + if (pdf_pattern.gstate_res.id == 0) { + cairo_pattern_destroy (pdf_pattern.pattern); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + } + + pdf_pattern.width = surface->width; + pdf_pattern.height = surface->height; + if (extents != NULL) { + pdf_pattern.extents = *extents; + } else { + pdf_pattern.extents.x = 0; + pdf_pattern.extents.y = 0; + pdf_pattern.extents.width = surface->width; + pdf_pattern.extents.height = surface->height; + } + + *pattern_res = pdf_pattern.pattern_res; + *gstate_res = pdf_pattern.gstate_res; + + status = _cairo_array_append (&surface->page_patterns, &pdf_pattern); + if (unlikely (status)) { + cairo_pattern_destroy (pdf_pattern.pattern); + return status; + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +/* Get BBox in PDF coordinates from extents in cairo coordinates */ +static void +_get_bbox_from_extents (double surface_height, + const cairo_rectangle_int_t *extents, + cairo_box_double_t *bbox) +{ + bbox->p1.x = extents->x; + bbox->p1.y = surface_height - (extents->y + extents->height); + bbox->p2.x = extents->x + extents->width; + bbox->p2.y = surface_height - extents->y; +} + +static cairo_int_status_t +_cairo_pdf_surface_add_pdf_shading (cairo_pdf_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_operator_t op, + const cairo_rectangle_int_t *extents, + cairo_pdf_resource_t *shading_res, + cairo_pdf_resource_t *gstate_res) +{ + return _cairo_pdf_surface_add_pdf_pattern_or_shading (surface, + pattern, + op, + extents, + TRUE, + shading_res, + gstate_res); +} + +static cairo_int_status_t +_cairo_pdf_surface_add_pdf_pattern (cairo_pdf_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_operator_t op, + const cairo_rectangle_int_t *extents, + cairo_pdf_resource_t *pattern_res, + cairo_pdf_resource_t *gstate_res) +{ + return _cairo_pdf_surface_add_pdf_pattern_or_shading (surface, + pattern, + op, + extents, + FALSE, + pattern_res, + gstate_res); +} + +static cairo_int_status_t +_cairo_pdf_surface_open_stream (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t *resource, + cairo_bool_t compressed, + const char *fmt, + ...) +{ + va_list ap; + cairo_pdf_resource_t self, length; + cairo_output_stream_t *output = NULL; + + if (resource) { + self = *resource; + _cairo_pdf_surface_update_object (surface, self); + } else { + self = _cairo_pdf_surface_new_object (surface); + if (self.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + length = _cairo_pdf_surface_new_object (surface); + if (length.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (compressed) { + output = _cairo_deflate_stream_create (surface->output); + if (_cairo_output_stream_get_status (output)) + return _cairo_output_stream_destroy (output); + } + + surface->pdf_stream.active = TRUE; + surface->pdf_stream.self = self; + surface->pdf_stream.length = length; + surface->pdf_stream.compressed = compressed; + surface->current_pattern_is_solid_color = FALSE; + surface->current_operator = CAIRO_OPERATOR_OVER; + _cairo_pdf_operators_reset (&surface->pdf_operators); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Length %d 0 R\n", + surface->pdf_stream.self.id, + surface->pdf_stream.length.id); + if (compressed) + _cairo_output_stream_printf (surface->output, + " /Filter /FlateDecode\n"); + + if (fmt != NULL) { + va_start (ap, fmt); + _cairo_output_stream_vprintf (surface->output, fmt, ap); + va_end (ap); + } + + _cairo_output_stream_printf (surface->output, + ">>\n" + "stream\n"); + + surface->pdf_stream.start_offset = _cairo_output_stream_get_position (surface->output); + + if (compressed) { + assert (surface->pdf_stream.old_output == NULL); + surface->pdf_stream.old_output = surface->output; + surface->output = output; + _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); + } + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +_cairo_pdf_surface_close_stream (cairo_pdf_surface_t *surface) +{ + cairo_int_status_t status; + long length; + + if (! surface->pdf_stream.active) + return CAIRO_INT_STATUS_SUCCESS; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + + if (surface->pdf_stream.compressed) { + cairo_int_status_t status2; + + status2 = _cairo_output_stream_destroy (surface->output); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = status2; + + surface->output = surface->pdf_stream.old_output; + _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); + surface->pdf_stream.old_output = NULL; + } + + length = _cairo_output_stream_get_position (surface->output) - + surface->pdf_stream.start_offset; + _cairo_output_stream_printf (surface->output, + "\n" + "endstream\n" + "endobj\n"); + + _cairo_pdf_surface_update_object (surface, + surface->pdf_stream.length); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + " %ld\n" + "endobj\n", + surface->pdf_stream.length.id, + length); + + surface->pdf_stream.active = FALSE; + + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = _cairo_output_stream_get_status (surface->output); + + return status; +} + +static void +_cairo_pdf_surface_write_memory_stream (cairo_pdf_surface_t *surface, + cairo_output_stream_t *mem_stream, + cairo_pdf_resource_t resource, + cairo_pdf_group_resources_t *resources, + cairo_bool_t is_knockout_group, + const cairo_box_double_t *bbox) +{ + _cairo_pdf_surface_update_object (surface, resource); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /XObject\n" + " /Length %d\n", + resource.id, + _cairo_memory_stream_length (mem_stream)); + + if (surface->compress_content) { + _cairo_output_stream_printf (surface->output, + " /Filter /FlateDecode\n"); + } + + _cairo_output_stream_printf (surface->output, + " /Subtype /Form\n" + " /BBox [ %f %f %f %f ]\n" + " /Group <<\n" + " /Type /Group\n" + " /S /Transparency\n" + " /I true\n" + " /CS /DeviceRGB\n", + bbox->p1.x, bbox->p1.y, bbox->p2.x, bbox->p2.y); + + if (is_knockout_group) + _cairo_output_stream_printf (surface->output, + " /K true\n"); + + _cairo_output_stream_printf (surface->output, + " >>\n" + " /Resources\n"); + _cairo_pdf_surface_emit_group_resources (surface, resources); + _cairo_output_stream_printf (surface->output, + ">>\n" + "stream\n"); + _cairo_memory_stream_copy (mem_stream, surface->output); + _cairo_output_stream_printf (surface->output, + "endstream\n" + "endobj\n"); +} + +static cairo_int_status_t +_cairo_pdf_surface_open_group (cairo_pdf_surface_t *surface, + const cairo_box_double_t *bbox, + cairo_pdf_resource_t *resource) +{ + cairo_int_status_t status; + + assert (surface->pdf_stream.active == FALSE); + assert (surface->group_stream.active == FALSE); + + surface->group_stream.active = TRUE; + surface->current_pattern_is_solid_color = FALSE; + surface->current_operator = CAIRO_OPERATOR_OVER; + _cairo_pdf_operators_reset (&surface->pdf_operators); + + surface->group_stream.mem_stream = _cairo_memory_stream_create (); + + if (surface->compress_content) { + surface->group_stream.stream = + _cairo_deflate_stream_create (surface->group_stream.mem_stream); + } else { + surface->group_stream.stream = surface->group_stream.mem_stream; + } + status = _cairo_output_stream_get_status (surface->group_stream.stream); + + surface->group_stream.old_output = surface->output; + surface->output = surface->group_stream.stream; + _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); + _cairo_pdf_group_resources_clear (&surface->resources); + + if (resource) { + surface->group_stream.resource = *resource; + } else { + surface->group_stream.resource = _cairo_pdf_surface_new_object (surface); + if (surface->group_stream.resource.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + surface->group_stream.is_knockout = FALSE; + surface->group_stream.bbox = *bbox; + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_open_knockout_group (cairo_pdf_surface_t *surface, + const cairo_box_double_t *bbox) +{ + cairo_int_status_t status; + + status = _cairo_pdf_surface_open_group (surface, bbox, NULL); + if (unlikely (status)) + return status; + + surface->group_stream.is_knockout = TRUE; + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_close_group (cairo_pdf_surface_t *surface, + cairo_pdf_resource_t *group) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS, status2; + + assert (surface->pdf_stream.active == FALSE); + assert (surface->group_stream.active == TRUE); + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + if (surface->compress_content) { + status = _cairo_output_stream_destroy (surface->group_stream.stream); + surface->group_stream.stream = NULL; + + _cairo_output_stream_printf (surface->group_stream.mem_stream, + "\n"); + } + surface->output = surface->group_stream.old_output; + _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); + surface->group_stream.active = FALSE; + _cairo_pdf_surface_write_memory_stream (surface, + surface->group_stream.mem_stream, + surface->group_stream.resource, + &surface->resources, + surface->group_stream.is_knockout, + &surface->group_stream.bbox); + if (group) + *group = surface->group_stream.resource; + + status2 = _cairo_output_stream_destroy (surface->group_stream.mem_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + + surface->group_stream.mem_stream = NULL; + surface->group_stream.stream = NULL; + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_open_content_stream (cairo_pdf_surface_t *surface, + const cairo_box_double_t *bbox, + cairo_pdf_resource_t *resource, + cairo_bool_t is_form, + cairo_bool_t is_group) +{ + cairo_int_status_t status; + + assert (surface->pdf_stream.active == FALSE); + assert (surface->group_stream.active == FALSE); + + surface->content_resources = _cairo_pdf_surface_new_object (surface); + if (surface->content_resources.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (is_form) { + assert (bbox != NULL); + + if (is_group) { + status = + _cairo_pdf_surface_open_stream (surface, + resource, + surface->compress_content, + " /Type /XObject\n" + " /Subtype /Form\n" + " /BBox [ %f %f %f %f ]\n" + " /Group <<\n" + " /Type /Group\n" + " /S /Transparency\n" + " /I true\n" + " /CS /DeviceRGB\n" + " >>\n" + " /Resources %d 0 R\n", + bbox->p1.x, + bbox->p1.y, + bbox->p2.x, + bbox->p2.y, + surface->content_resources.id); + } else { + status = + _cairo_pdf_surface_open_stream (surface, + resource, + surface->compress_content, + " /Type /XObject\n" + " /Subtype /Form\n" + " /BBox [ %f %f %f %f ]\n" + " /Resources %d 0 R\n", + bbox->p1.x, + bbox->p1.y, + bbox->p2.x, + bbox->p2.y, + surface->content_resources.id); + } + } else { + status = + _cairo_pdf_surface_open_stream (surface, + resource, + surface->compress_content, + NULL); + } + if (unlikely (status)) + return status; + + surface->content = surface->pdf_stream.self; + + _cairo_output_stream_printf (surface->output, "q\n"); + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +_cairo_pdf_surface_close_content_stream (cairo_pdf_surface_t *surface) +{ + cairo_int_status_t status; + + assert (surface->pdf_stream.active == TRUE); + assert (surface->group_stream.active == FALSE); + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "Q\n"); + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) + return status; + + _cairo_pdf_surface_update_object (surface, surface->content_resources); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n", + surface->content_resources.id); + _cairo_pdf_surface_emit_group_resources (surface, &surface->resources); + _cairo_output_stream_printf (surface->output, + "endobj\n"); + + return _cairo_output_stream_get_status (surface->output); +} + +static void +_cairo_pdf_source_surface_entry_pluck (void *entry, void *closure) +{ + cairo_pdf_source_surface_entry_t *surface_entry = entry; + cairo_hash_table_t *patterns = closure; + + _cairo_hash_table_remove (patterns, &surface_entry->base); + free (surface_entry->unique_id); + + free (surface_entry); +} + +static cairo_status_t +_cairo_pdf_surface_finish (void *abstract_surface) +{ + cairo_pdf_surface_t *surface = abstract_surface; + long offset; + cairo_pdf_resource_t info, catalog; + cairo_status_t status, status2; + int size, i; + cairo_pdf_jbig2_global_t *global; + + status = surface->base.status; + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_pdf_surface_emit_font_subsets (surface); + + _cairo_pdf_surface_write_pages (surface); + + info = _cairo_pdf_surface_write_info (surface); + if (info.id == 0 && status == CAIRO_STATUS_SUCCESS) + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + + catalog = _cairo_pdf_surface_write_catalog (surface); + if (catalog.id == 0 && status == CAIRO_STATUS_SUCCESS) + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + + offset = _cairo_pdf_surface_write_xref (surface); + + _cairo_output_stream_printf (surface->output, + "trailer\n" + "<< /Size %d\n" + " /Root %d 0 R\n" + " /Info %d 0 R\n" + ">>\n", + surface->next_available_resource.id, + catalog.id, + info.id); + + _cairo_output_stream_printf (surface->output, + "startxref\n" + "%ld\n" + "%%%%EOF\n", + offset); + + /* pdf_operators has already been flushed when the last stream was + * closed so we should never be writing anything here - however, + * the stream may itself be in an error state. */ + status2 = _cairo_pdf_operators_fini (&surface->pdf_operators); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + /* close any active streams still open due to fatal errors */ + status2 = _cairo_pdf_surface_close_stream (surface); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + if (surface->group_stream.stream != NULL) { + status2 = _cairo_output_stream_destroy (surface->group_stream.stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + } + if (surface->group_stream.mem_stream != NULL) { + status2 = _cairo_output_stream_destroy (surface->group_stream.mem_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + } + if (surface->pdf_stream.active) + surface->output = surface->pdf_stream.old_output; + if (surface->group_stream.active) + surface->output = surface->group_stream.old_output; + + /* and finish the pdf surface */ + status2 = _cairo_output_stream_destroy (surface->output); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + _cairo_pdf_surface_clear (surface); + _cairo_pdf_group_resources_fini (&surface->resources); + + _cairo_array_fini (&surface->objects); + _cairo_array_fini (&surface->pages); + _cairo_array_fini (&surface->rgb_linear_functions); + _cairo_array_fini (&surface->alpha_linear_functions); + _cairo_array_fini (&surface->page_patterns); + _cairo_array_fini (&surface->page_surfaces); + _cairo_hash_table_foreach (surface->all_surfaces, + _cairo_pdf_source_surface_entry_pluck, + surface->all_surfaces); + _cairo_hash_table_destroy (surface->all_surfaces); + _cairo_array_fini (&surface->smask_groups); + _cairo_array_fini (&surface->fonts); + _cairo_array_fini (&surface->knockout_group); + + if (surface->font_subsets) { + _cairo_scaled_font_subsets_destroy (surface->font_subsets); + surface->font_subsets = NULL; + } + + size = _cairo_array_num_elements (&surface->jbig2_global); + for (i = 0; i < size; i++) { + global = (cairo_pdf_jbig2_global_t *) _cairo_array_index (&surface->jbig2_global, i); + free(global->id); + if (!global->emitted) + return _cairo_error (CAIRO_STATUS_JBIG2_GLOBAL_MISSING); + } + _cairo_array_fini (&surface->jbig2_global); + + _cairo_array_truncate (&surface->page_surfaces, 0); + + _cairo_surface_clipper_reset (&surface->clipper); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_start_page (void *abstract_surface) +{ + cairo_pdf_surface_t *surface = abstract_surface; + + /* Document header */ + if (! surface->header_emitted) { + const char *version; + + switch (surface->pdf_version) { + case CAIRO_PDF_VERSION_1_4: + version = "1.4"; + break; + default: + case CAIRO_PDF_VERSION_1_5: + version = "1.5"; + break; + } + + _cairo_output_stream_printf (surface->output, + "%%PDF-%s\n", version); + _cairo_output_stream_printf (surface->output, + "%%%c%c%c%c\n", 181, 237, 174, 251); + surface->header_emitted = TRUE; + } + + _cairo_pdf_group_resources_clear (&surface->resources); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_has_fallback_images (void *abstract_surface, + cairo_bool_t has_fallbacks) +{ + cairo_int_status_t status; + cairo_pdf_surface_t *surface = abstract_surface; + cairo_box_double_t bbox; + + surface->has_fallback_images = has_fallbacks; + bbox.p1.x = 0; + bbox.p1.y = 0; + bbox.p2.x = surface->width; + bbox.p2.y = surface->height; + status = _cairo_pdf_surface_open_content_stream (surface, &bbox, NULL, has_fallbacks, has_fallbacks); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_pdf_surface_supports_fine_grained_fallbacks (void *abstract_surface) +{ + return TRUE; +} + +static cairo_int_status_t +_cairo_pdf_surface_add_padded_image_surface (cairo_pdf_surface_t *surface, + const cairo_pattern_t *source, + const cairo_rectangle_int_t *extents, + cairo_pdf_resource_t *surface_res, + int *width, + int *height, + double *x_offset, + double *y_offset) +{ + cairo_image_surface_t *image; + cairo_surface_t *pad_image; + void *image_extra; + cairo_int_status_t status; + int w, h; + cairo_rectangle_int_t extents2; + cairo_box_t box; + cairo_rectangle_int_t rect; + cairo_surface_pattern_t pad_pattern; + + status = _cairo_pdf_surface_acquire_source_image_from_pattern (surface, source, + &image, &image_extra); + if (unlikely (status)) + return status; + + pad_image = &image->base; + + /* get the operation extents in pattern space */ + _cairo_box_from_rectangle (&box, extents); + _cairo_matrix_transform_bounding_box_fixed (&source->matrix, &box, NULL); + _cairo_box_round_to_rectangle (&box, &rect); + + /* Check if image needs padding to fill extents */ + w = image->width; + h = image->height; + if (_cairo_fixed_integer_ceil(box.p1.x) < 0 || + _cairo_fixed_integer_ceil(box.p1.y) < 0 || + _cairo_fixed_integer_floor(box.p2.x) > w || + _cairo_fixed_integer_floor(box.p2.y) > h) + { + pad_image = _cairo_image_surface_create_with_content (image->base.content, + rect.width, + rect.height); + if (pad_image->status) { + status = pad_image->status; + goto BAIL; + } + + _cairo_pattern_init_for_surface (&pad_pattern, &image->base); + cairo_matrix_init_translate (&pad_pattern.base.matrix, rect.x, rect.y); + pad_pattern.base.extend = CAIRO_EXTEND_PAD; + status = _cairo_surface_paint (pad_image, + CAIRO_OPERATOR_SOURCE, &pad_pattern.base, + NULL); + _cairo_pattern_fini (&pad_pattern.base); + if (unlikely (status)) + goto BAIL; + } + + status = _cairo_pdf_surface_add_source_surface (surface, + pad_image, + NULL, + FALSE, + source->filter, + FALSE, + FALSE, + extents, + NULL, + surface_res, + width, + height, + x_offset, + y_offset, + &extents2); + if (unlikely (status)) + goto BAIL; + + if (pad_image != &image->base) { + /* If using a padded image, replace _add_source_surface + * x/y_offset with padded image offset. Note: + * _add_source_surface only sets a non zero x/y_offset for + * RASTER_SOURCE patterns. _add_source_surface will always set + * x/y_offset to 0 for surfaces so we can ignore the returned + * offset and replace it with the offset required for the + * padded image */ + *x_offset = rect.x; + *y_offset = rect.y; + } + +BAIL: + if (pad_image != &image->base) + cairo_surface_destroy (pad_image); + + _cairo_pdf_surface_release_source_image_from_pattern (surface, source, image, image_extra); + + return status; +} + +/* Emit alpha channel from the image into stream_res. + */ +static cairo_int_status_t +_cairo_pdf_surface_emit_smask (cairo_pdf_surface_t *surface, + cairo_image_surface_t *image, + cairo_bool_t stencil_mask, + cairo_bool_t interpolate, + cairo_pdf_resource_t *stream_res) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + char *alpha; + unsigned long alpha_size; + uint32_t *pixel32; + uint8_t *pixel8; + int i, x, y, bit, a; + cairo_image_transparency_t transparency; + + /* This is the only image format we support, which simplifies things. */ + assert (image->format == CAIRO_FORMAT_ARGB32 || + image->format == CAIRO_FORMAT_RGB24 || + image->format == CAIRO_FORMAT_A8 || + image->format == CAIRO_FORMAT_A1 ); + + transparency = _cairo_image_analyze_transparency (image); + if (stencil_mask) { + assert (transparency == CAIRO_IMAGE_IS_OPAQUE || + transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA); + } else { + assert (transparency != CAIRO_IMAGE_IS_OPAQUE); + } + + if (transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA || transparency == CAIRO_IMAGE_IS_OPAQUE) { + alpha_size = (image->width + 7) / 8 * image->height; + alpha = _cairo_malloc_ab ((image->width+7) / 8, image->height); + } else { + alpha_size = image->height * image->width; + alpha = _cairo_malloc_ab (image->height, image->width); + } + + if (unlikely (alpha == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP; + } + + i = 0; + for (y = 0; y < image->height; y++) { + if (transparency == CAIRO_IMAGE_IS_OPAQUE) { + for (x = 0; x < (image->width + 7) / 8; x++) + alpha[i++] = 0xff; + } else if (image->format == CAIRO_FORMAT_A1) { + pixel8 = (uint8_t *) (image->data + y * image->stride); + + for (x = 0; x < (image->width + 7) / 8; x++, pixel8++) { + a = *pixel8; + a = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (a); + alpha[i++] = a; + } + } else { + pixel8 = (uint8_t *) (image->data + y * image->stride); + pixel32 = (uint32_t *) (image->data + y * image->stride); + bit = 7; + for (x = 0; x < image->width; x++) { + if (image->format == CAIRO_FORMAT_ARGB32) { + a = (*pixel32 & 0xff000000) >> 24; + pixel32++; + } else { + a = *pixel8; + pixel8++; + } + + if (transparency == CAIRO_IMAGE_HAS_ALPHA) { + alpha[i++] = a; + } else { /* transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA or CAIRO_IMAGE_IS_OPAQUE */ + if (bit == 7) + alpha[i] = 0; + if (a != 0) + alpha[i] |= (1 << bit); + bit--; + if (bit < 0) { + bit = 7; + i++; + } + } + } + if (bit != 7) + i++; + } + } + + if (stencil_mask) { + status = _cairo_pdf_surface_open_stream (surface, + stream_res, + TRUE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /ImageMask true\n" + " /Width %d\n" + " /Height %d\n" + " /Interpolate %s\n" + " /BitsPerComponent 1\n" + " /Decode [1 0]\n", + image->width, image->height, + interpolate ? "true" : "false"); + } else { + status = _cairo_pdf_surface_open_stream (surface, + stream_res, + TRUE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /Width %d\n" + " /Height %d\n" + " /ColorSpace /DeviceGray\n" + " /Interpolate %s\n" + " /BitsPerComponent %d\n", + image->width, image->height, + interpolate ? "true" : "false", + transparency == CAIRO_IMAGE_HAS_ALPHA ? 8 : 1); + } + if (unlikely (status)) + goto CLEANUP_ALPHA; + + _cairo_output_stream_write (surface->output, alpha, alpha_size); + status = _cairo_pdf_surface_close_stream (surface); + + CLEANUP_ALPHA: + free (alpha); + CLEANUP: + return status; +} + +/** + * _cairo_pdf_surface_emit_image: + * @surface: the pdf surface + * @image_surf: The image to write + * @surface_entry: Contains image resource, smask resource, interpolate and stencil mask parameters. + * + * Emit an image stream using the @image_res resource and write out + * the image data from @image_surf. If @smask_res is not null, @smask_res will + * be specified as the smask for the image. Otherwise emit the an smask if + * the image is requires one. + **/ +static cairo_int_status_t +_cairo_pdf_surface_emit_image (cairo_pdf_surface_t *surface, + cairo_image_surface_t *image_surf, + cairo_pdf_source_surface_entry_t *surface_entry) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + char *data; + unsigned long data_size; + uint32_t *pixel; + int i, x, y, bit; + cairo_pdf_resource_t smask = {0}; /* squelch bogus compiler warning */ + cairo_bool_t need_smask; + cairo_image_color_t color; + cairo_image_surface_t *image; + cairo_image_transparency_t transparency; + char smask_buf[30]; + + image = image_surf; + if (image->format != CAIRO_FORMAT_RGB24 && + image->format != CAIRO_FORMAT_ARGB32 && + image->format != CAIRO_FORMAT_A8 && + image->format != CAIRO_FORMAT_A1) + { + cairo_surface_t *surf; + cairo_surface_pattern_t pattern; + + surf = _cairo_image_surface_create_with_content (image_surf->base.content, + image_surf->width, + image_surf->height); + image = (cairo_image_surface_t *) surf; + if (surf->status) { + status = surf->status; + goto CLEANUP; + } + + _cairo_pattern_init_for_surface (&pattern, &image_surf->base); + status = _cairo_surface_paint (surf, + CAIRO_OPERATOR_SOURCE, &pattern.base, + NULL); + _cairo_pattern_fini (&pattern.base); + if (unlikely (status)) + goto CLEANUP; + } + + if (surface_entry->smask || surface_entry->stencil_mask) { + return _cairo_pdf_surface_emit_smask (surface, image, + surface_entry->stencil_mask, + surface_entry->interpolate, + &surface_entry->surface_res); + } + + color = _cairo_image_analyze_color (image); + switch (color) { + default: + case CAIRO_IMAGE_UNKNOWN_COLOR: + ASSERT_NOT_REACHED; + case CAIRO_IMAGE_IS_COLOR: + data_size = image->height * image->width * 3; + data = _cairo_malloc_abc (image->width, image->height, 3); + break; + + case CAIRO_IMAGE_IS_GRAYSCALE: + data_size = image->height * image->width; + data = _cairo_malloc_ab (image->width, image->height); + break; + case CAIRO_IMAGE_IS_MONOCHROME: + data_size = (image->width + 7) / 8 * image->height; + data = _cairo_malloc_ab ((image->width+7) / 8, image->height); + break; + } + if (unlikely (data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP; + } + + i = 0; + for (y = 0; y < image->height; y++) { + pixel = (uint32_t *) (image->data + y * image->stride); + + bit = 7; + for (x = 0; x < image->width; x++, pixel++) { + int r, g, b; + + /* XXX: We're un-premultiplying alpha here. My reading of the PDF + * specification suggests that we should be able to avoid having + * to do this by filling in the SMask's Matte dictionary + * appropriately, but my attempts to do that so far have + * failed. */ + if (image->format == CAIRO_FORMAT_ARGB32) { + uint8_t a; + a = (*pixel & 0xff000000) >> 24; + if (a == 0) { + r = g = b = 0; + } else { + r = (((*pixel & 0xff0000) >> 16) * 255 + a / 2) / a; + g = (((*pixel & 0x00ff00) >> 8) * 255 + a / 2) / a; + b = (((*pixel & 0x0000ff) >> 0) * 255 + a / 2) / a; + } + } else if (image->format == CAIRO_FORMAT_RGB24) { + r = (*pixel & 0x00ff0000) >> 16; + g = (*pixel & 0x0000ff00) >> 8; + b = (*pixel & 0x000000ff) >> 0; + } else { + r = g = b = 0; + } + + switch (color) { + case CAIRO_IMAGE_IS_COLOR: + case CAIRO_IMAGE_UNKNOWN_COLOR: + data[i++] = r; + data[i++] = g; + data[i++] = b; + break; + + case CAIRO_IMAGE_IS_GRAYSCALE: + data[i++] = r; + break; + + case CAIRO_IMAGE_IS_MONOCHROME: + if (bit == 7) + data[i] = 0; + if (r != 0) + data[i] |= (1 << bit); + bit--; + if (bit < 0) { + bit = 7; + i++; + } + break; + } + } + if (bit != 7) + i++; + } + + if (surface_entry->smask_res.id != 0) { + need_smask = TRUE; + smask = surface_entry->smask_res; + } else { + need_smask = FALSE; + if (image->format == CAIRO_FORMAT_ARGB32 || + image->format == CAIRO_FORMAT_A8 || + image->format == CAIRO_FORMAT_A1) + { + transparency = _cairo_image_analyze_transparency (image); + if (transparency != CAIRO_IMAGE_IS_OPAQUE) { + need_smask = TRUE; + smask = _cairo_pdf_surface_new_object (surface); + if (smask.id == 0) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_RGB; + } + + status = _cairo_pdf_surface_emit_smask (surface, image, FALSE, surface_entry->interpolate, &smask); + if (unlikely (status)) + goto CLEANUP_RGB; + } + } + } + + if (need_smask) + snprintf(smask_buf, sizeof(smask_buf), " /SMask %d 0 R\n", smask.id); + else + smask_buf[0] = 0; + + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + TRUE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /Width %d\n" + " /Height %d\n" + " /ColorSpace %s\n" + " /Interpolate %s\n" + " /BitsPerComponent %d\n" + "%s", + image->width, + image->height, + color == CAIRO_IMAGE_IS_COLOR ? "/DeviceRGB" : "/DeviceGray", + surface_entry->interpolate ? "true" : "false", + color == CAIRO_IMAGE_IS_MONOCHROME? 1 : 8, + smask_buf); + if (unlikely (status)) + goto CLEANUP_RGB; + +#undef IMAGE_DICTIONARY + + _cairo_output_stream_write (surface->output, data, data_size); + status = _cairo_pdf_surface_close_stream (surface); + +CLEANUP_RGB: + free (data); +CLEANUP: + if (image != image_surf) + cairo_surface_destroy (&image->base); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_lookup_jbig2_global (cairo_pdf_surface_t *surface, + const unsigned char *global_id, + unsigned long global_id_length, + cairo_pdf_jbig2_global_t **entry) +{ + cairo_pdf_jbig2_global_t global; + int size, i; + cairo_int_status_t status; + + size = _cairo_array_num_elements (&surface->jbig2_global); + for (i = 0; i < size; i++) { + *entry = (cairo_pdf_jbig2_global_t *) _cairo_array_index (&surface->jbig2_global, i); + if ((*entry)->id && global_id && (*entry)->id_length == global_id_length + && memcmp((*entry)->id, global_id, global_id_length) == 0) { + return CAIRO_STATUS_SUCCESS; + } + } + + global.id = malloc(global_id_length); + if (unlikely (global.id == NULL)) { + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + memcpy (global.id, global_id, global_id_length); + global.id_length = global_id_length; + global.res = _cairo_pdf_surface_new_object (surface); + if (global.res.id == 0) { + free(global.id); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + global.emitted = FALSE; + status = _cairo_array_append (&surface->jbig2_global, &global); + if (unlikely(status)) + return status; + + size = _cairo_array_num_elements (&surface->jbig2_global); + *entry = (cairo_pdf_jbig2_global_t *) _cairo_array_index (&surface->jbig2_global, size - 1); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_jbig2_image (cairo_pdf_surface_t *surface, + cairo_surface_t *source, + cairo_pdf_source_surface_entry_t *surface_entry) +{ + cairo_int_status_t status; + const unsigned char *mime_data; + unsigned long mime_data_length; + cairo_image_info_t info; + const unsigned char *global_id; + unsigned long global_id_length; + const unsigned char *global_data; + unsigned long global_data_length; + cairo_pdf_jbig2_global_t *global_entry = NULL; /* hide compiler warning */ + char smask_buf[30]; + char decode_parms_buf[100]; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JBIG2, + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_jbig2_info (&info, mime_data, mime_data_length); + if (status) + return status; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, + &global_id, &global_id_length); + if (global_id && global_id_length > 0) { + status = _cairo_pdf_surface_lookup_jbig2_global (surface, global_id, global_id_length, &global_entry); + if (unlikely(status)) + return status; + + if (!global_entry->emitted) { + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JBIG2_GLOBAL, + &global_data, &global_data_length); + if (global_data) { + status = _cairo_pdf_surface_open_stream (surface, &global_entry->res, FALSE, NULL); + if (unlikely(status)) + return status; + + _cairo_output_stream_write (surface->output, global_data, global_data_length); + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely(status)) + return status; + + global_entry->emitted = TRUE; + } + } + + snprintf(decode_parms_buf, sizeof(decode_parms_buf), + " /DecodeParms << /JBIG2Globals %d 0 R >>\n", global_entry->res.id); + } else { + decode_parms_buf[0] = 0; + } + + if (surface_entry->smask_res.id) + snprintf(smask_buf, sizeof(smask_buf), " /SMask %d 0 R\n", surface_entry->smask_res.id); + else + smask_buf[0] = 0; + + if (surface_entry->stencil_mask) { + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + FALSE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /ImageMask true\n" + " /Width %d\n" + " /Height %d\n" + " /Interpolate %s\n" + " /BitsPerComponent 1\n" + " /Decode [1 0]\n" + " /Filter /JPXDecode\n" + "%s", + info.width, + info.height, + surface_entry->interpolate ? "true" : "false", + decode_parms_buf); + } else { + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + FALSE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /Width %d\n" + " /Height %d\n" + " /ColorSpace /DeviceGray\n" + " /BitsPerComponent 1\n" + " /Interpolate %s\n" + "%s" + " /Filter /JBIG2Decode\n" + "%s", + info.width, + info.height, + surface_entry->interpolate ? "true" : "false", + smask_buf, + decode_parms_buf); + } + if (unlikely(status)) + return status; + + _cairo_output_stream_write (surface->output, mime_data, mime_data_length); + status = _cairo_pdf_surface_close_stream (surface); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_jpx_image (cairo_pdf_surface_t *surface, + cairo_surface_t *source, + cairo_pdf_source_surface_entry_t *surface_entry) +{ + cairo_int_status_t status; + const unsigned char *mime_data; + unsigned long mime_data_length; + cairo_image_info_t info; + char smask_buf[30]; + + if (surface->pdf_version < CAIRO_PDF_VERSION_1_5) + return CAIRO_INT_STATUS_UNSUPPORTED; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JP2, + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_jpx_info (&info, mime_data, mime_data_length); + if (status) + return status; + + if ((surface_entry->smask || surface_entry->stencil_mask) && info.num_components != 1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface_entry->stencil_mask) && info.bits_per_component != 1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface_entry->smask_res.id) + snprintf(smask_buf, sizeof(smask_buf), " /SMask %d 0 R\n", surface_entry->smask_res.id); + else + smask_buf[0] = 0; + + if (surface_entry->stencil_mask) { + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + FALSE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /ImageMask true\n" + " /Width %d\n" + " /Height %d\n" + " /Interpolate %s\n" + " /BitsPerComponent 1\n" + " /Decode [1 0]\n" + " /Filter /JPXDecode\n", + info.width, + info.height, + surface_entry->interpolate ? "true" : "false"); + } else { + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + FALSE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /Width %d\n" + " /Height %d\n" + " /Interpolate %s\n" + "%s" + " /Filter /JPXDecode\n", + info.width, + info.height, + surface_entry->interpolate ? "true" : "false", + smask_buf); + } + if (status) + return status; + + _cairo_output_stream_write (surface->output, mime_data, mime_data_length); + status = _cairo_pdf_surface_close_stream (surface); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_jpeg_image (cairo_pdf_surface_t *surface, + cairo_surface_t *source, + cairo_pdf_source_surface_entry_t *surface_entry) +{ + cairo_int_status_t status; + const unsigned char *mime_data; + unsigned long mime_data_length; + cairo_image_info_t info; + const char *colorspace; + char smask_buf[30]; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JPEG, + &mime_data, &mime_data_length); + if (unlikely (source->status)) + return source->status; + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_jpeg_info (&info, mime_data, mime_data_length); + if (unlikely (status)) + return status; + + if ((surface_entry->smask || surface_entry->stencil_mask) && info.num_components != 1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface_entry->stencil_mask) && info.bits_per_component != 1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + switch (info.num_components) { + case 1: + colorspace = "/DeviceGray"; + break; + case 3: + colorspace = "/DeviceRGB"; + break; + case 4: + colorspace = "/DeviceCMYK"; + break; + default: + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (surface_entry->smask_res.id) + snprintf(smask_buf, sizeof(smask_buf), " /SMask %d 0 R\n", surface_entry->smask_res.id); + else + smask_buf[0] = 0; + + if (surface_entry->stencil_mask) { + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + FALSE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /ImageMask true\n" + " /Width %d\n" + " /Height %d\n" + " /Interpolate %s\n" + " /BitsPerComponent 1\n" + " /Decode [1 0]\n" + " /Filter /DCTDecode\n", + info.width, + info.height, + surface_entry->interpolate ? "true" : "false"); + } else { + status = _cairo_pdf_surface_open_stream (surface, + &surface_entry->surface_res, + FALSE, + " /Type /XObject\n" + " /Subtype /Image\n" + " /Width %d\n" + " /Height %d\n" + " /ColorSpace %s\n" + " /Interpolate %s\n" + " /BitsPerComponent %d\n" + "%s" + " /Filter /DCTDecode\n", + info.width, + info.height, + colorspace, + surface_entry->interpolate ? "true" : "false", + info.bits_per_component, + smask_buf); + } + if (unlikely (status)) + return status; + + _cairo_output_stream_write (surface->output, mime_data, mime_data_length); + status = _cairo_pdf_surface_close_stream (surface); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_image_surface (cairo_pdf_surface_t *surface, + cairo_pdf_source_surface_t *source) +{ + cairo_image_surface_t *image; + void *image_extra; + cairo_int_status_t status; + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { + status = _cairo_pdf_surface_emit_jbig2_image (surface, source->surface, source->hash_entry); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_pdf_surface_emit_jpx_image (surface, source->surface, source->hash_entry); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_pdf_surface_emit_jpeg_image (surface, source->surface, source->hash_entry); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { + status = _cairo_surface_acquire_source_image (source->surface, &image, &image_extra); + } else { + status = _cairo_pdf_surface_acquire_source_image_from_pattern (surface, source->raster_pattern, + &image, &image_extra); + } + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_image (surface, + image, + source->hash_entry); + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) + _cairo_surface_release_source_image (source->surface, image, image_extra); + else + _cairo_pdf_surface_release_source_image_from_pattern (surface, source->raster_pattern, + image, image_extra); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, + cairo_pdf_source_surface_t *pdf_source) +{ + double old_width, old_height; + cairo_paginated_mode_t old_paginated_mode; + cairo_surface_clipper_t old_clipper; + cairo_box_double_t bbox; + cairo_int_status_t status; + int alpha = 0; + cairo_surface_t *free_me = NULL; + cairo_surface_t *source; + const cairo_rectangle_int_t *extents; + int width; + int height; + cairo_bool_t is_subsurface; + cairo_bool_t transparency_group; + cairo_recording_surface_t *recording; + + assert (pdf_source->type == CAIRO_PATTERN_TYPE_SURFACE); + extents = &pdf_source->hash_entry->extents; + width = pdf_source->hash_entry->width; + height = pdf_source->hash_entry->height; + is_subsurface = FALSE; + source = pdf_source->surface; + if (_cairo_surface_is_snapshot (source)) { + free_me = source = _cairo_surface_snapshot_get_target (source); + } else if (source->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source; + + source = sub->target; + extents = &sub->extents; + width = extents->width; + height = extents->height; + is_subsurface = TRUE; + } + + assert (source->type == CAIRO_SURFACE_TYPE_RECORDING); + recording = (cairo_recording_surface_t *) source; + + old_width = surface->width; + old_height = surface->height; + old_paginated_mode = surface->paginated_mode; + old_clipper = surface->clipper; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_pdf_surface_clipper_intersect_clip_path); + + _cairo_pdf_surface_set_size_internal (surface, width, height); + + /* Patterns are emitted after fallback images. The paginated mode + * needs to be set to _RENDER while the recording surface is replayed + * back to this surface. + */ + surface->paginated_mode = CAIRO_PAGINATED_MODE_RENDER; + _cairo_pdf_group_resources_clear (&surface->resources); + _get_bbox_from_extents (height, extents, &bbox); + + /* We can optimize away the transparency group allowing the viewer + * to replay the group in place when all operators are OVER and the + * recording contains only opaque and/or clear alpha. + */ + transparency_group = !(pdf_source->hash_entry->operator == CAIRO_OPERATOR_OVER && + _cairo_recording_surface_has_only_bilevel_alpha (recording) && + _cairo_recording_surface_has_only_op_over (recording)); + status = _cairo_pdf_surface_open_content_stream (surface, &bbox, &pdf_source->hash_entry->surface_res, + TRUE, transparency_group); + if (unlikely (status)) + goto err; + + if (source->content == CAIRO_CONTENT_COLOR) { + status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); + if (unlikely (status)) + goto err; + + _cairo_output_stream_printf (surface->output, + "q /a%d gs 0 0 0 rg 0 0 %f %f re f Q\n", + alpha, + surface->width, + surface->height); + } + + status = _cairo_recording_surface_replay_region (source, + is_subsurface ? extents : NULL, + &surface->base, + CAIRO_RECORDING_REGION_NATIVE); + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + if (unlikely (status)) + goto err; + + status = _cairo_pdf_surface_close_content_stream (surface); + + _cairo_surface_clipper_reset (&surface->clipper); + surface->clipper = old_clipper; + _cairo_pdf_surface_set_size_internal (surface, + old_width, + old_height); + surface->paginated_mode = old_paginated_mode; + +err: + cairo_surface_destroy (free_me); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_surface (cairo_pdf_surface_t *surface, + cairo_pdf_source_surface_t *src_surface) +{ + if (src_surface->type == CAIRO_PATTERN_TYPE_SURFACE && + src_surface->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + return _cairo_pdf_surface_emit_recording_surface (surface, src_surface); + + return _cairo_pdf_surface_emit_image_surface (surface, src_surface); +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, + cairo_pdf_pattern_t *pdf_pattern) +{ + cairo_pattern_t *pattern = pdf_pattern->pattern; + cairo_int_status_t status; + cairo_pdf_resource_t pattern_resource = {0}; + cairo_matrix_t cairo_p2d, pdf_p2d; + cairo_extend_t extend = cairo_pattern_get_extend (pattern); + double xstep, ystep; + cairo_rectangle_int_t pattern_extents; + int pattern_width = 0; /* squelch bogus compiler warning */ + int pattern_height = 0; /* squelch bogus compiler warning */ + double x_offset; + double y_offset; + char draw_surface[200]; + cairo_box_double_t bbox; + + if (pattern->extend == CAIRO_EXTEND_PAD) { + status = _cairo_pdf_surface_add_padded_image_surface (surface, + pattern, + &pdf_pattern->extents, + &pattern_resource, + &pattern_width, + &pattern_height, + &x_offset, + &y_offset); + pattern_extents.x = 0; + pattern_extents.y = 0; + pattern_extents.width = pattern_width; + pattern_extents.height = pattern_height; + } else { + status = _cairo_pdf_surface_add_source_surface (surface, + NULL, + pattern, + pdf_pattern->operator, + pattern->filter, + FALSE, + FALSE, + &pdf_pattern->extents, + NULL, + &pattern_resource, + &pattern_width, + &pattern_height, + &x_offset, + &y_offset, + &pattern_extents); + } + if (unlikely (status)) + return status; + + switch (extend) { + case CAIRO_EXTEND_PAD: + case CAIRO_EXTEND_NONE: + { + /* In PS/PDF, (as far as I can tell), all patterns are + * repeating. So we support cairo's EXTEND_NONE semantics + * by setting the repeat step size to a size large enough + * to guarantee that no more than a single occurrence will + * be visible. + * + * First, map the surface extents into pattern space (since + * xstep and ystep are in pattern space). Then use an upper + * bound on the length of the diagonal of the pattern image + * and the surface as repeat size. This guarantees to never + * repeat visibly. + */ + double x1 = 0.0, y1 = 0.0; + double x2 = surface->width, y2 = surface->height; + _cairo_matrix_transform_bounding_box (&pattern->matrix, + &x1, &y1, &x2, &y2, + NULL); + + /* Rather than computing precise bounds of the union, just + * add the surface extents unconditionally. We only + * required an answer that's large enough, we don't really + * care if it's not as tight as possible.*/ + xstep = ystep = ceil ((x2 - x1) + (y2 - y1) + + pattern_width + pattern_height); + } + break; + case CAIRO_EXTEND_REPEAT: + xstep = pattern_width; + ystep = pattern_height; + break; + case CAIRO_EXTEND_REFLECT: + pattern_extents.x = 0; + pattern_extents.y = 0; + pattern_extents.width = pattern_width*2; + pattern_extents.height = pattern_height*2; + xstep = pattern_width*2; + ystep = pattern_height*2; + break; + /* All the rest (if any) should have been analyzed away, so this + * case should be unreachable. */ + default: + ASSERT_NOT_REACHED; + xstep = 0; + ystep = 0; + } + + /* At this point, (that is, within the surface backend interface), + * the pattern's matrix maps from cairo's device space to cairo's + * pattern space, (both with their origin at the upper-left, and + * cairo's pattern space of size width,height). + * + * Then, we must emit a PDF pattern object that maps from its own + * pattern space, (which has a size that we establish in the BBox + * dictionary entry), to the PDF page's *initial* space, (which + * does not benefit from the Y-axis flipping matrix that we emit + * on each page). So the PDF patterns matrix maps from a + * (width,height) pattern space to a device space with the origin + * in the lower-left corner. + * + * So to handle all of that, we start with an identity matrix for + * the PDF pattern to device matrix. We translate it up by the + * image height then flip it in the Y direction, (moving us from + * the PDF origin to cairo's origin). We then multiply in the + * inverse of the cairo pattern matrix, (since it maps from device + * to pattern, while we're setting up pattern to device). Finally, + * we translate back down by the image height and flip again to + * end up at the lower-left origin that PDF expects. + * + * Additionally, within the stream that paints the pattern itself, + * we are using a PDF image object that has a size of (1,1) so we + * have to scale it up by the image width and height to fill our + * pattern cell. + */ + cairo_p2d = pattern->matrix; + status = cairo_matrix_invert (&cairo_p2d); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + + cairo_matrix_multiply (&pdf_p2d, &cairo_p2d, &surface->cairo_to_pdf); + cairo_matrix_translate (&pdf_p2d, -x_offset, -y_offset); + cairo_matrix_translate (&pdf_p2d, 0.0, pattern_height); + cairo_matrix_scale (&pdf_p2d, 1.0, -1.0); + + _get_bbox_from_extents (pattern_height, &pattern_extents, &bbox); + _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); + status = _cairo_pdf_surface_open_stream (surface, + &pdf_pattern->pattern_res, + FALSE, + " /PatternType 1\n" + " /BBox [ %f %f %f %f ]\n" + " /XStep %f\n" + " /YStep %f\n" + " /TilingType 1\n" + " /PaintType 1\n" + " /Matrix [ %f %f %f %f %f %f ]\n" + " /Resources << /XObject << /x%d %d 0 R >> >>\n", + bbox.p1.x, bbox.p1.y, bbox.p2.x, bbox.p2.y, + xstep, ystep, + pdf_p2d.xx, pdf_p2d.yx, + pdf_p2d.xy, pdf_p2d.yy, + pdf_p2d.x0, pdf_p2d.y0, + pattern_resource.id, + pattern_resource.id); + if (unlikely (status)) + return status; + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *) pattern)->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + snprintf(draw_surface, + sizeof (draw_surface), + "/x%d Do\n", + pattern_resource.id); + } else { + snprintf(draw_surface, + sizeof (draw_surface), + "q %d 0 0 %d 0 0 cm /x%d Do Q", + pattern_width, + pattern_height, + pattern_resource.id); + } + + if (extend == CAIRO_EXTEND_REFLECT) { + _cairo_output_stream_printf (surface->output, + "q 0 0 %d %d re W n %s Q\n" + "q -1 0 0 1 %d 0 cm 0 0 %d %d re W n %s Q\n" + "q 1 0 0 -1 0 %d cm 0 0 %d %d re W n %s Q\n" + "q -1 0 0 -1 %d %d cm 0 0 %d %d re W n %s Q\n", + pattern_width, pattern_height, + draw_surface, + pattern_width*2, pattern_width, pattern_height, + draw_surface, + pattern_height*2, pattern_width, pattern_height, + draw_surface, + pattern_width*2, pattern_height*2, pattern_width, pattern_height, + draw_surface); + } else { + _cairo_output_stream_printf (surface->output, + " %s \n", + draw_surface); + } + + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) + return status; + + return _cairo_output_stream_get_status (surface->output); +} + +typedef struct _cairo_pdf_color_stop { + double offset; + double color[4]; + cairo_pdf_resource_t resource; +} cairo_pdf_color_stop_t; + +static cairo_int_status_t +cairo_pdf_surface_emit_rgb_linear_function (cairo_pdf_surface_t *surface, + cairo_pdf_color_stop_t *stop1, + cairo_pdf_color_stop_t *stop2, + cairo_pdf_resource_t *function) +{ + int num_elems, i; + cairo_pdf_rgb_linear_function_t elem; + cairo_pdf_resource_t res; + cairo_int_status_t status; + + num_elems = _cairo_array_num_elements (&surface->rgb_linear_functions); + for (i = 0; i < num_elems; i++) { + _cairo_array_copy_element (&surface->rgb_linear_functions, i, &elem); + if (memcmp (&elem.color1[0], &stop1->color[0], sizeof (double)*3) != 0) + continue; + if (memcmp (&elem.color2[0], &stop2->color[0], sizeof (double)*3) != 0) + continue; + *function = elem.resource; + return CAIRO_STATUS_SUCCESS; + } + + res = _cairo_pdf_surface_new_object (surface); + if (res.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /FunctionType 2\n" + " /Domain [ 0 1 ]\n" + " /C0 [ %f %f %f ]\n" + " /C1 [ %f %f %f ]\n" + " /N 1\n" + ">>\n" + "endobj\n", + res.id, + stop1->color[0], + stop1->color[1], + stop1->color[2], + stop2->color[0], + stop2->color[1], + stop2->color[2]); + + elem.resource = res; + memcpy (&elem.color1[0], &stop1->color[0], sizeof (double)*3); + memcpy (&elem.color2[0], &stop2->color[0], sizeof (double)*3); + + status = _cairo_array_append (&surface->rgb_linear_functions, &elem); + *function = res; + + return status; +} + +static cairo_int_status_t +cairo_pdf_surface_emit_alpha_linear_function (cairo_pdf_surface_t *surface, + cairo_pdf_color_stop_t *stop1, + cairo_pdf_color_stop_t *stop2, + cairo_pdf_resource_t *function) +{ + int num_elems, i; + cairo_pdf_alpha_linear_function_t elem; + cairo_pdf_resource_t res; + cairo_int_status_t status; + + num_elems = _cairo_array_num_elements (&surface->alpha_linear_functions); + for (i = 0; i < num_elems; i++) { + _cairo_array_copy_element (&surface->alpha_linear_functions, i, &elem); + if (elem.alpha1 != stop1->color[3]) + continue; + if (elem.alpha2 != stop2->color[3]) + continue; + *function = elem.resource; + return CAIRO_STATUS_SUCCESS; + } + + res = _cairo_pdf_surface_new_object (surface); + if (res.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /FunctionType 2\n" + " /Domain [ 0 1 ]\n" + " /C0 [ %f ]\n" + " /C1 [ %f ]\n" + " /N 1\n" + ">>\n" + "endobj\n", + res.id, + stop1->color[3], + stop2->color[3]); + + elem.resource = res; + elem.alpha1 = stop1->color[3]; + elem.alpha2 = stop2->color[3]; + + status = _cairo_array_append (&surface->alpha_linear_functions, &elem); + *function = res; + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_stitched_colorgradient (cairo_pdf_surface_t *surface, + unsigned int n_stops, + cairo_pdf_color_stop_t *stops, + cairo_bool_t is_alpha, + cairo_pdf_resource_t *function) +{ + cairo_pdf_resource_t res; + unsigned int i; + cairo_int_status_t status; + + /* emit linear gradients between pairs of subsequent stops... */ + for (i = 0; i < n_stops-1; i++) { + if (is_alpha) { + status = cairo_pdf_surface_emit_alpha_linear_function (surface, + &stops[i], + &stops[i+1], + &stops[i].resource); + if (unlikely (status)) + return status; + } else { + status = cairo_pdf_surface_emit_rgb_linear_function (surface, + &stops[i], + &stops[i+1], + &stops[i].resource); + if (unlikely (status)) + return status; + } + } + + /* ... and stitch them together */ + res = _cairo_pdf_surface_new_object (surface); + if (res.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /FunctionType 3\n" + " /Domain [ %f %f ]\n", + res.id, + stops[0].offset, + stops[n_stops - 1].offset); + + _cairo_output_stream_printf (surface->output, + " /Functions [ "); + for (i = 0; i < n_stops-1; i++) + _cairo_output_stream_printf (surface->output, + "%d 0 R ", stops[i].resource.id); + _cairo_output_stream_printf (surface->output, + "]\n"); + + _cairo_output_stream_printf (surface->output, + " /Bounds [ "); + for (i = 1; i < n_stops-1; i++) + _cairo_output_stream_printf (surface->output, + "%f ", stops[i].offset); + _cairo_output_stream_printf (surface->output, + "]\n"); + + _cairo_output_stream_printf (surface->output, + " /Encode [ "); + for (i = 1; i < n_stops; i++) + _cairo_output_stream_printf (surface->output, + "0 1 "); + _cairo_output_stream_printf (surface->output, + "]\n"); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + + *function = res; + + return _cairo_output_stream_get_status (surface->output); +} + + +static void +calc_gradient_color (cairo_pdf_color_stop_t *new_stop, + cairo_pdf_color_stop_t *stop1, + cairo_pdf_color_stop_t *stop2) +{ + int i; + double offset = stop1->offset / (stop1->offset + 1.0 - stop2->offset); + + for (i = 0; i < 4; i++) + new_stop->color[i] = stop1->color[i] + offset*(stop2->color[i] - stop1->color[i]); +} + +#define COLOR_STOP_EPSILON 1e-6 + +static cairo_int_status_t +_cairo_pdf_surface_emit_pattern_stops (cairo_pdf_surface_t *surface, + cairo_gradient_pattern_t *pattern, + cairo_pdf_resource_t *color_function, + cairo_pdf_resource_t *alpha_function) +{ + cairo_pdf_color_stop_t *allstops, *stops; + unsigned int n_stops; + unsigned int i; + cairo_bool_t emit_alpha = FALSE; + cairo_int_status_t status; + + color_function->id = 0; + alpha_function->id = 0; + + allstops = _cairo_malloc_ab ((pattern->n_stops + 2), sizeof (cairo_pdf_color_stop_t)); + if (unlikely (allstops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + stops = &allstops[1]; + n_stops = pattern->n_stops; + + for (i = 0; i < n_stops; i++) { + stops[i].color[0] = pattern->stops[i].color.red; + stops[i].color[1] = pattern->stops[i].color.green; + stops[i].color[2] = pattern->stops[i].color.blue; + stops[i].color[3] = pattern->stops[i].color.alpha; + if (!CAIRO_ALPHA_IS_OPAQUE (stops[i].color[3])) + emit_alpha = TRUE; + stops[i].offset = pattern->stops[i].offset; + } + + if (pattern->base.extend == CAIRO_EXTEND_REPEAT || + pattern->base.extend == CAIRO_EXTEND_REFLECT) { + if (stops[0].offset > COLOR_STOP_EPSILON) { + if (pattern->base.extend == CAIRO_EXTEND_REFLECT) + memcpy (allstops, stops, sizeof (cairo_pdf_color_stop_t)); + else + calc_gradient_color (&allstops[0], &stops[0], &stops[n_stops-1]); + stops = allstops; + n_stops++; + } + stops[0].offset = 0.0; + + if (stops[n_stops-1].offset < 1.0 - COLOR_STOP_EPSILON) { + if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { + memcpy (&stops[n_stops], + &stops[n_stops - 1], + sizeof (cairo_pdf_color_stop_t)); + } else { + calc_gradient_color (&stops[n_stops], &stops[0], &stops[n_stops-1]); + } + n_stops++; + } + stops[n_stops-1].offset = 1.0; + } + + if (stops[0].offset == stops[n_stops - 1].offset) { + /* + * The first and the last stops have the same offset, but we + * don't want a function with an empty domain, because that + * would provoke underdefined behaviour from rasterisers. + * This can only happen with EXTEND_PAD, because EXTEND_NONE + * is optimised into a clear pattern in cairo-gstate, and + * REFLECT/REPEAT are always transformed to have the first + * stop at t=0 and the last stop at t=1. Thus we want a step + * function going from the first color to the last one. + * + * This can be accomplished by stitching three functions: + * - a constant first color function, + * - a step from the first color to the last color (with empty domain) + * - a constant last color function + */ + cairo_pdf_color_stop_t pad_stops[4]; + + assert (pattern->base.extend == CAIRO_EXTEND_PAD); + + pad_stops[0] = pad_stops[1] = stops[0]; + pad_stops[2] = pad_stops[3] = stops[n_stops - 1]; + + pad_stops[0].offset = 0; + pad_stops[3].offset = 1; + + status = _cairo_pdf_surface_emit_stitched_colorgradient (surface, + 4, + pad_stops, + FALSE, + color_function); + if (unlikely (status)) + goto BAIL; + + if (emit_alpha) { + status = _cairo_pdf_surface_emit_stitched_colorgradient (surface, + 4, + pad_stops, + TRUE, + alpha_function); + if (unlikely (status)) + goto BAIL; + } + } else if (n_stops == 2) { + /* no need for stitched function */ + status = cairo_pdf_surface_emit_rgb_linear_function (surface, + &stops[0], + &stops[n_stops - 1], + color_function); + if (unlikely (status)) + goto BAIL; + + if (emit_alpha) { + status = cairo_pdf_surface_emit_alpha_linear_function (surface, + &stops[0], + &stops[n_stops - 1], + alpha_function); + if (unlikely (status)) + goto BAIL; + } + } else { + /* multiple stops: stitch. XXX possible optimization: regularly spaced + * stops do not require stitching. XXX */ + status = _cairo_pdf_surface_emit_stitched_colorgradient (surface, + n_stops, + stops, + FALSE, + color_function); + if (unlikely (status)) + goto BAIL; + + if (emit_alpha) { + status = _cairo_pdf_surface_emit_stitched_colorgradient (surface, + n_stops, + stops, + TRUE, + alpha_function); + if (unlikely (status)) + goto BAIL; + } + } + +BAIL: + free (allstops); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_repeating_function (cairo_pdf_surface_t *surface, + cairo_gradient_pattern_t *pattern, + cairo_pdf_resource_t *function, + int begin, + int end) +{ + cairo_pdf_resource_t res; + int i; + + res = _cairo_pdf_surface_new_object (surface); + if (res.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /FunctionType 3\n" + " /Domain [ %d %d ]\n", + res.id, + begin, + end); + + _cairo_output_stream_printf (surface->output, + " /Functions [ "); + for (i = begin; i < end; i++) + _cairo_output_stream_printf (surface->output, + "%d 0 R ", function->id); + _cairo_output_stream_printf (surface->output, + "]\n"); + + _cairo_output_stream_printf (surface->output, + " /Bounds [ "); + for (i = begin + 1; i < end; i++) + _cairo_output_stream_printf (surface->output, + "%d ", i); + _cairo_output_stream_printf (surface->output, + "]\n"); + + _cairo_output_stream_printf (surface->output, + " /Encode [ "); + for (i = begin; i < end; i++) { + if ((i % 2) && pattern->base.extend == CAIRO_EXTEND_REFLECT) { + _cairo_output_stream_printf (surface->output, + "1 0 "); + } else { + _cairo_output_stream_printf (surface->output, + "0 1 "); + } + } + _cairo_output_stream_printf (surface->output, + "]\n"); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + + *function = res; + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +cairo_pdf_surface_emit_transparency_group (cairo_pdf_surface_t *surface, + cairo_pdf_pattern_t *pdf_pattern, + cairo_pdf_resource_t gstate_resource, + cairo_pdf_resource_t gradient_mask) +{ + cairo_pdf_resource_t smask_resource; + cairo_int_status_t status; + char buf[100]; + double x1, y1, x2, y2; + + if (pdf_pattern->is_shading) { + snprintf(buf, sizeof(buf), + " /Shading\n" + " << /sh%d %d 0 R >>\n", + gradient_mask.id, + gradient_mask.id); + } else { + snprintf(buf, sizeof(buf), + " /Pattern\n" + " << /p%d %d 0 R >>\n", + gradient_mask.id, + gradient_mask.id); + } + + if (pdf_pattern->is_shading) { + cairo_box_t box; + + /* When emitting a shading operator we are in cairo pattern + * coordinates. _cairo_pdf_surface_paint_gradient has set the + * ctm to the pattern matrix (including the convertion from + * pdf to cairo coordinates) */ + _cairo_box_from_rectangle (&box, &pdf_pattern->extents); + _cairo_box_to_doubles (&box, &x1, &y1, &x2, &y2); + _cairo_matrix_transform_bounding_box (&pdf_pattern->pattern->matrix, &x1, &y1, &x2, &y2, NULL); + } else { + cairo_box_double_t box; + + /* When emitting a shading pattern we are in pdf page + * coordinates. The color and alpha shading patterns painted + * in the XObject below contain the cairo pattern to pdf page + * matrix in the /Matrix entry of the pattern. */ + _get_bbox_from_extents (pdf_pattern->height, &pdf_pattern->extents, &box); + x1 = box.p1.x; + y1 = box.p1.y; + x2 = box.p2.x; + y2 = box.p2.y; + } + status = _cairo_pdf_surface_open_stream (surface, + NULL, + surface->compress_content, + " /Type /XObject\n" + " /Subtype /Form\n" + " /FormType 1\n" + " /BBox [ %f %f %f %f ]\n" + " /Resources\n" + " << /ExtGState\n" + " << /a0 << /ca 1 /CA 1 >>" + " >>\n" + "%s" + " >>\n" + " /Group\n" + " << /Type /Group\n" + " /S /Transparency\n" + " /I true\n" + " /CS /DeviceGray\n" + " >>\n", + x1,y1,x2,y2, + buf); + if (unlikely (status)) + return status; + + if (pdf_pattern->is_shading) { + _cairo_output_stream_printf (surface->output, + "/a0 gs /sh%d sh\n", + gradient_mask.id); + } else { + _cairo_output_stream_printf (surface->output, + "q\n" + "/a0 gs\n" + "/Pattern cs /p%d scn\n" + "0 0 %f %f re\n" + "f\n" + "Q\n", + gradient_mask.id, + surface->width, + surface->height); + } + + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) + return status; + + smask_resource = _cairo_pdf_surface_new_object (surface); + if (smask_resource.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Mask\n" + " /S /Luminosity\n" + " /G %d 0 R\n" + ">>\n" + "endobj\n", + smask_resource.id, + surface->pdf_stream.self.id); + + /* Create GState which uses the transparency group as an SMask. */ + _cairo_pdf_surface_update_object (surface, gstate_resource); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /ExtGState\n" + " /SMask %d 0 R\n" + " /ca 1\n" + " /CA 1\n" + " /AIS false\n" + ">>\n" + "endobj\n", + gstate_resource.id, + smask_resource.id); + + return _cairo_output_stream_get_status (surface->output); +} + +static void +_cairo_pdf_surface_output_gradient (cairo_pdf_surface_t *surface, + const cairo_pdf_pattern_t *pdf_pattern, + cairo_pdf_resource_t pattern_resource, + const cairo_matrix_t *pat_to_pdf, + const cairo_circle_double_t*start, + const cairo_circle_double_t*end, + const double *domain, + const char *colorspace, + cairo_pdf_resource_t color_function) +{ + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n", + pattern_resource.id); + + if (!pdf_pattern->is_shading) { + _cairo_output_stream_printf (surface->output, + "<< /Type /Pattern\n" + " /PatternType 2\n" + " /Matrix [ "); + _cairo_output_stream_print_matrix (surface->output, pat_to_pdf); + _cairo_output_stream_printf (surface->output, + " ]\n" + " /Shading\n"); + } + + if (pdf_pattern->pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { + _cairo_output_stream_printf (surface->output, + " << /ShadingType 2\n" + " /ColorSpace %s\n" + " /Coords [ %f %f %f %f ]\n", + colorspace, + start->center.x, start->center.y, + end->center.x, end->center.y); + } else { + _cairo_output_stream_printf (surface->output, + " << /ShadingType 3\n" + " /ColorSpace %s\n" + " /Coords [ %f %f %f %f %f %f ]\n", + colorspace, + start->center.x, start->center.y, + MAX (start->radius, 0), + end->center.x, end->center.y, + MAX (end->radius, 0)); + } + + _cairo_output_stream_printf (surface->output, + " /Domain [ %f %f ]\n", + domain[0], domain[1]); + + if (pdf_pattern->pattern->extend != CAIRO_EXTEND_NONE) { + _cairo_output_stream_printf (surface->output, + " /Extend [ true true ]\n"); + } else { + _cairo_output_stream_printf (surface->output, + " /Extend [ false false ]\n"); + } + + _cairo_output_stream_printf (surface->output, + " /Function %d 0 R\n" + " >>\n", + color_function.id); + + if (!pdf_pattern->is_shading) { + _cairo_output_stream_printf (surface->output, + ">>\n"); + } + + _cairo_output_stream_printf (surface->output, + "endobj\n"); +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_gradient (cairo_pdf_surface_t *surface, + cairo_pdf_pattern_t *pdf_pattern) +{ + cairo_gradient_pattern_t *pattern = (cairo_gradient_pattern_t *) pdf_pattern->pattern; + cairo_pdf_resource_t color_function, alpha_function; + cairo_matrix_t pat_to_pdf; + cairo_circle_double_t start, end; + double domain[2]; + cairo_int_status_t status; + + assert (pattern->n_stops != 0); + + status = _cairo_pdf_surface_emit_pattern_stops (surface, + pattern, + &color_function, + &alpha_function); + if (unlikely (status)) + return status; + + pat_to_pdf = pattern->base.matrix; + status = cairo_matrix_invert (&pat_to_pdf); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + cairo_matrix_multiply (&pat_to_pdf, &pat_to_pdf, &surface->cairo_to_pdf); + + if (pattern->base.extend == CAIRO_EXTEND_REPEAT || + pattern->base.extend == CAIRO_EXTEND_REFLECT) + { + double bounds_x1, bounds_x2, bounds_y1, bounds_y2; + double x_scale, y_scale, tolerance; + + /* TODO: use tighter extents */ + bounds_x1 = 0; + bounds_y1 = 0; + bounds_x2 = surface->width; + bounds_y2 = surface->height; + _cairo_matrix_transform_bounding_box (&pattern->base.matrix, + &bounds_x1, &bounds_y1, + &bounds_x2, &bounds_y2, + NULL); + + x_scale = surface->base.x_resolution / surface->base.x_fallback_resolution; + y_scale = surface->base.y_resolution / surface->base.y_fallback_resolution; + + tolerance = fabs (_cairo_matrix_compute_determinant (&pattern->base.matrix)); + tolerance /= _cairo_matrix_transformed_circle_major_axis (&pattern->base.matrix, 1); + tolerance *= MIN (x_scale, y_scale); + + _cairo_gradient_pattern_box_to_parameter (pattern, + bounds_x1, bounds_y1, + bounds_x2, bounds_y2, + tolerance, domain); + } else if (pattern->stops[0].offset == pattern->stops[pattern->n_stops - 1].offset) { + /* + * If the first and the last stop offset are the same, then + * the color function is a step function. + * _cairo_ps_surface_emit_pattern_stops emits it as a stitched + * function no matter how many stops the pattern has. The + * domain of the stitched function will be [0 1] in this case. + * + * This is done to avoid emitting degenerate gradients for + * EXTEND_PAD patterns having a step color function. + */ + domain[0] = 0.0; + domain[1] = 1.0; + + assert (pattern->base.extend == CAIRO_EXTEND_PAD); + } else { + domain[0] = pattern->stops[0].offset; + domain[1] = pattern->stops[pattern->n_stops - 1].offset; + } + + /* PDF requires the first and last stop to be the same as the + * extreme coordinates. For repeating patterns this moves the + * extreme coordinates out to the begin/end of the repeating + * function. For non repeating patterns this may move the extreme + * coordinates in if there are not stops at offset 0 and 1. */ + _cairo_gradient_pattern_interpolate (pattern, domain[0], &start); + _cairo_gradient_pattern_interpolate (pattern, domain[1], &end); + + if (pattern->base.extend == CAIRO_EXTEND_REPEAT || + pattern->base.extend == CAIRO_EXTEND_REFLECT) + { + int repeat_begin, repeat_end; + + repeat_begin = floor (domain[0]); + repeat_end = ceil (domain[1]); + + status = _cairo_pdf_surface_emit_repeating_function (surface, + pattern, + &color_function, + repeat_begin, + repeat_end); + if (unlikely (status)) + return status; + + if (alpha_function.id != 0) { + status = _cairo_pdf_surface_emit_repeating_function (surface, + pattern, + &alpha_function, + repeat_begin, + repeat_end); + if (unlikely (status)) + return status; + } + } else if (pattern->n_stops <= 2) { + /* For EXTEND_NONE and EXTEND_PAD if there are only two stops a + * Type 2 function is used by itself without a stitching + * function. Type 2 functions always have the domain [0 1] */ + domain[0] = 0.0; + domain[1] = 1.0; + } + + _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); + _cairo_pdf_surface_output_gradient (surface, pdf_pattern, + pdf_pattern->pattern_res, + &pat_to_pdf, &start, &end, domain, + "/DeviceRGB", color_function); + + if (alpha_function.id != 0) { + cairo_pdf_resource_t mask_resource; + + assert (pdf_pattern->gstate_res.id != 0); + + /* Create pattern for SMask. */ + mask_resource = _cairo_pdf_surface_new_object (surface); + if (mask_resource.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_pdf_surface_output_gradient (surface, pdf_pattern, + mask_resource, + &pat_to_pdf, &start, &end, domain, + "/DeviceGray", alpha_function); + + status = cairo_pdf_surface_emit_transparency_group (surface, + pdf_pattern, + pdf_pattern->gstate_res, + mask_resource); + if (unlikely (status)) + return status; + } + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_mesh_pattern (cairo_pdf_surface_t *surface, + cairo_pdf_pattern_t *pdf_pattern) +{ + cairo_matrix_t pat_to_pdf; + cairo_int_status_t status; + cairo_pattern_t *pattern = pdf_pattern->pattern; + cairo_pdf_shading_t shading; + int i; + cairo_pdf_resource_t res; + + pat_to_pdf = pattern->matrix; + status = cairo_matrix_invert (&pat_to_pdf); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + + cairo_matrix_multiply (&pat_to_pdf, &pat_to_pdf, &surface->cairo_to_pdf); + + status = _cairo_pdf_shading_init_color (&shading, (cairo_mesh_pattern_t *) pattern); + if (unlikely (status)) + return status; + + res = _cairo_pdf_surface_new_object (surface); + if (unlikely (res.id == 0)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /ShadingType %d\n" + " /ColorSpace /DeviceRGB\n" + " /BitsPerCoordinate %d\n" + " /BitsPerComponent %d\n" + " /BitsPerFlag %d\n" + " /Decode [", + res.id, + shading.shading_type, + shading.bits_per_coordinate, + shading.bits_per_component, + shading.bits_per_flag); + + for (i = 0; i < shading.decode_array_length; i++) + _cairo_output_stream_printf (surface->output, "%f ", shading.decode_array[i]); + + _cairo_output_stream_printf (surface->output, + "]\n" + " /Length %ld\n" + ">>\n" + "stream\n", + shading.data_length); + + _cairo_output_stream_write (surface->output, shading.data, shading.data_length); + + _cairo_output_stream_printf (surface->output, + "\nendstream\n" + "endobj\n"); + + _cairo_pdf_shading_fini (&shading); + + _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Pattern\n" + " /PatternType 2\n" + " /Matrix [ ", + pdf_pattern->pattern_res.id); + _cairo_output_stream_print_matrix (surface->output, &pat_to_pdf); + _cairo_output_stream_printf (surface->output, + " ]\n" + " /Shading %d 0 R\n" + ">>\n" + "endobj\n", + res.id); + + if (pdf_pattern->gstate_res.id != 0) { + cairo_pdf_resource_t mask_resource; + + /* Create pattern for SMask. */ + res = _cairo_pdf_surface_new_object (surface); + if (unlikely (res.id == 0)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_pdf_shading_init_alpha (&shading, (cairo_mesh_pattern_t *) pattern); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /ShadingType %d\n" + " /ColorSpace /DeviceGray\n" + " /BitsPerCoordinate %d\n" + " /BitsPerComponent %d\n" + " /BitsPerFlag %d\n" + " /Decode [", + res.id, + shading.shading_type, + shading.bits_per_coordinate, + shading.bits_per_component, + shading.bits_per_flag); + + for (i = 0; i < shading.decode_array_length; i++) + _cairo_output_stream_printf (surface->output, "%f ", shading.decode_array[i]); + + _cairo_output_stream_printf (surface->output, + "]\n" + " /Length %ld\n" + ">>\n" + "stream\n", + shading.data_length); + + _cairo_output_stream_write (surface->output, shading.data, shading.data_length); + + _cairo_output_stream_printf (surface->output, + "\nendstream\n" + "endobj\n"); + _cairo_pdf_shading_fini (&shading); + + mask_resource = _cairo_pdf_surface_new_object (surface); + if (unlikely (mask_resource.id == 0)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Pattern\n" + " /PatternType 2\n" + " /Matrix [ ", + mask_resource.id); + _cairo_output_stream_print_matrix (surface->output, &pat_to_pdf); + _cairo_output_stream_printf (surface->output, + " ]\n" + " /Shading %d 0 R\n" + ">>\n" + "endobj\n", + res.id); + + status = cairo_pdf_surface_emit_transparency_group (surface, + pdf_pattern, + pdf_pattern->gstate_res, + mask_resource); + if (unlikely (status)) + return status; + } + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_pattern (cairo_pdf_surface_t *surface, cairo_pdf_pattern_t *pdf_pattern) +{ + double old_width, old_height; + cairo_int_status_t status; + + old_width = surface->width; + old_height = surface->height; + _cairo_pdf_surface_set_size_internal (surface, + pdf_pattern->width, + pdf_pattern->height); + + switch (pdf_pattern->pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + ASSERT_NOT_REACHED; + status = _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + break; + + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + status = _cairo_pdf_surface_emit_surface_pattern (surface, pdf_pattern); + break; + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + status = _cairo_pdf_surface_emit_gradient (surface, pdf_pattern); + break; + + case CAIRO_PATTERN_TYPE_MESH: + status = _cairo_pdf_surface_emit_mesh_pattern (surface, pdf_pattern); + break; + + default: + ASSERT_NOT_REACHED; + status = _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); + break; + } + + _cairo_pdf_surface_set_size_internal (surface, + old_width, + old_height); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_paint_surface_pattern (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_rectangle_int_t *extents, + cairo_pdf_resource_t *smask_res, + cairo_bool_t stencil_mask) +{ + cairo_pdf_resource_t surface_res; + int width, height; + cairo_matrix_t cairo_p2d, pdf_p2d; + cairo_int_status_t status; + int alpha; + cairo_rectangle_int_t extents2; + double x_offset; + double y_offset; + + if (source->extend == CAIRO_EXTEND_PAD && + !(source->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *)source)->surface->type == CAIRO_SURFACE_TYPE_RECORDING)) + { + status = _cairo_pdf_surface_add_padded_image_surface (surface, + source, + extents, + &surface_res, + &width, + &height, + &x_offset, + &y_offset); + } else { + status = _cairo_pdf_surface_add_source_surface (surface, + NULL, + source, + op, + source->filter, + stencil_mask, + FALSE, + extents, + smask_res, + &surface_res, + &width, + &height, + &x_offset, + &y_offset, + &extents2); + } + if (unlikely (status)) + return status; + + cairo_p2d = source->matrix; + status = cairo_matrix_invert (&cairo_p2d); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + + pdf_p2d = surface->cairo_to_pdf; + cairo_matrix_multiply (&pdf_p2d, &cairo_p2d, &pdf_p2d); + cairo_matrix_translate (&pdf_p2d, x_offset, y_offset); + cairo_matrix_translate (&pdf_p2d, 0.0, height); + cairo_matrix_scale (&pdf_p2d, 1.0, -1.0); + if (!(source->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *)source)->surface->type == CAIRO_SURFACE_TYPE_RECORDING)) + { + cairo_matrix_scale (&pdf_p2d, width, height); + } + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + if (! _cairo_matrix_is_identity (&pdf_p2d)) { + _cairo_output_stream_print_matrix (surface->output, &pdf_p2d); + _cairo_output_stream_printf (surface->output, " cm\n"); + } + + status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); + if (unlikely (status)) + return status; + + if (stencil_mask) { + _cairo_output_stream_printf (surface->output, + "/x%d Do\n", + surface_res.id); + } else { + _cairo_output_stream_printf (surface->output, + "/a%d gs /x%d Do\n", + alpha, + surface_res.id); + } + + return _cairo_pdf_surface_add_xobject (surface, surface_res); +} + +static cairo_int_status_t +_cairo_pdf_surface_paint_gradient (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_rectangle_int_t *extents) +{ + cairo_pdf_resource_t shading_res, gstate_res; + cairo_matrix_t pat_to_pdf; + cairo_int_status_t status; + int alpha; + + status = _cairo_pdf_surface_add_pdf_shading (surface, source, + op, extents, + &shading_res, &gstate_res); + if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO)) + return CAIRO_INT_STATUS_SUCCESS; + if (unlikely (status)) + return status; + + pat_to_pdf = source->matrix; + status = cairo_matrix_invert (&pat_to_pdf); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + cairo_matrix_multiply (&pat_to_pdf, &pat_to_pdf, &surface->cairo_to_pdf); + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + if (! _cairo_matrix_is_identity (&pat_to_pdf)) { + _cairo_output_stream_print_matrix (surface->output, &pat_to_pdf); + _cairo_output_stream_printf (surface->output, " cm\n"); + } + + status = _cairo_pdf_surface_add_shading (surface, shading_res); + if (unlikely (status)) + return status; + + if (gstate_res.id != 0) { + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "/s%d gs /sh%d sh\n", + gstate_res.id, + shading_res.id); + } else { + status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "/a%d gs /sh%d sh\n", + alpha, + shading_res.id); + } + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_paint_pattern (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_rectangle_int_t *extents, + cairo_bool_t mask) +{ + switch (source->type) { + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _cairo_pdf_surface_paint_surface_pattern (surface, + op, + source, + extents, + NULL, + mask); + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + return _cairo_pdf_surface_paint_gradient (surface, + op, + source, + extents); + + case CAIRO_PATTERN_TYPE_SOLID: + default: + ASSERT_NOT_REACHED; + return CAIRO_STATUS_SUCCESS; + } +} + +static cairo_bool_t +_can_paint_pattern (const cairo_pattern_t *pattern) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return FALSE; + + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return (pattern->extend == CAIRO_EXTEND_NONE || + pattern->extend == CAIRO_EXTEND_PAD); + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + return TRUE; + + case CAIRO_PATTERN_TYPE_MESH: + return FALSE; + + default: + ASSERT_NOT_REACHED; + return FALSE; + } +} + +static cairo_int_status_t +_cairo_pdf_surface_select_operator (cairo_pdf_surface_t *surface, + cairo_operator_t op) +{ + cairo_int_status_t status; + + if (op == surface->current_operator) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "/b%d gs\n", op); + surface->current_operator = op; + _cairo_pdf_surface_add_operator (surface, op); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_select_pattern (cairo_pdf_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_pdf_resource_t pattern_res, + cairo_bool_t is_stroke) +{ + cairo_int_status_t status; + int alpha; + const cairo_color_t *solid_color = NULL; + + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_solid_pattern_t *solid = (const cairo_solid_pattern_t *) pattern; + + solid_color = &solid->color; + } + + if (solid_color != NULL) { + if (surface->current_pattern_is_solid_color == FALSE || + surface->current_color_red != solid_color->red || + surface->current_color_green != solid_color->green || + surface->current_color_blue != solid_color->blue || + surface->current_color_is_stroke != is_stroke) + { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "%f %f %f ", + solid_color->red, + solid_color->green, + solid_color->blue); + + if (is_stroke) + _cairo_output_stream_printf (surface->output, "RG "); + else + _cairo_output_stream_printf (surface->output, "rg "); + + surface->current_color_red = solid_color->red; + surface->current_color_green = solid_color->green; + surface->current_color_blue = solid_color->blue; + surface->current_color_is_stroke = is_stroke; + } + + if (surface->current_pattern_is_solid_color == FALSE || + surface->current_color_alpha != solid_color->alpha) + { + status = _cairo_pdf_surface_add_alpha (surface, solid_color->alpha, &alpha); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "/a%d gs\n", + alpha); + surface->current_color_alpha = solid_color->alpha; + } + + surface->current_pattern_is_solid_color = TRUE; + } else { + status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_add_pattern (surface, pattern_res); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + /* fill-stroke calls select_pattern twice. Don't save if the + * gstate is already saved. */ + if (!surface->select_pattern_gstate_saved) + _cairo_output_stream_printf (surface->output, "q "); + + if (is_stroke) { + _cairo_output_stream_printf (surface->output, + "/Pattern CS /p%d SCN ", + pattern_res.id); + } else { + _cairo_output_stream_printf (surface->output, + "/Pattern cs /p%d scn ", + pattern_res.id); + } + _cairo_output_stream_printf (surface->output, + "/a%d gs\n", + alpha); + surface->select_pattern_gstate_saved = TRUE; + surface->current_pattern_is_solid_color = FALSE; + } + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +_cairo_pdf_surface_unselect_pattern (cairo_pdf_surface_t *surface) +{ + cairo_int_status_t status; + + if (surface->select_pattern_gstate_saved) { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "Q\n"); + _cairo_pdf_operators_reset (&surface->pdf_operators); + surface->current_pattern_is_solid_color = FALSE; + } + surface->select_pattern_gstate_saved = FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_show_page (void *abstract_surface) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + status = _cairo_pdf_surface_close_content_stream (surface); + if (unlikely (status)) + return status; + + _cairo_surface_clipper_reset (&surface->clipper); + + status = _cairo_pdf_surface_write_page (surface); + if (unlikely (status)) + return status; + + _cairo_pdf_surface_clear (surface); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_pdf_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_pdf_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + + /* XXX: The conversion to integers here is pretty bogus, (not to + * mention the arbitrary limitation of width to a short(!). We + * may need to come up with a better interface for get_size. + */ + rectangle->width = ceil (surface->width); + rectangle->height = ceil (surface->height); + + return TRUE; +} + +static void +_cairo_pdf_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_OFF); +} + +static cairo_pdf_resource_t +_cairo_pdf_surface_write_info (cairo_pdf_surface_t *surface) +{ + cairo_pdf_resource_t info; + + info = _cairo_pdf_surface_new_object (surface); + if (info.id == 0) + return info; + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Creator (cairo %s (http://cairographics.org))\n" + " /Producer (cairo %s (http://cairographics.org))\n" + ">>\n" + "endobj\n", + info.id, + cairo_version_string (), + cairo_version_string ()); + + return info; +} + +static void +_cairo_pdf_surface_write_pages (cairo_pdf_surface_t *surface) +{ + cairo_pdf_resource_t page; + int num_pages, i; + + _cairo_pdf_surface_update_object (surface, surface->pages_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Pages\n" + " /Kids [ ", + surface->pages_resource.id); + + num_pages = _cairo_array_num_elements (&surface->pages); + for (i = 0; i < num_pages; i++) { + _cairo_array_copy_element (&surface->pages, i, &page); + _cairo_output_stream_printf (surface->output, "%d 0 R ", page.id); + } + + _cairo_output_stream_printf (surface->output, "]\n"); + _cairo_output_stream_printf (surface->output, " /Count %d\n", num_pages); + + + /* TODO: Figure out which other defaults to be inherited by /Page + * objects. */ + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); +} + +static cairo_int_status_t +_utf8_to_pdf_string (const char *utf8, char **str_out) +{ + int i; + int len; + cairo_bool_t ascii; + char *str; + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + + ascii = TRUE; + len = strlen (utf8); + for (i = 0; i < len; i++) { + unsigned c = utf8[i]; + if (c < 32 || c > 126 || c == '(' || c == ')' || c == '\\') { + ascii = FALSE; + break; + } + } + + if (ascii) { + str = malloc (len + 3); + if (str == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + str[0] = '('; + for (i = 0; i < len; i++) + str[i+1] = utf8[i]; + str[i+1] = ')'; + str[i+2] = 0; + } else { + uint16_t *utf16 = NULL; + int utf16_len = 0; + + status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &utf16_len); + if (unlikely (status)) + return status; + + str = malloc (utf16_len*4 + 7); + if (str == NULL) { + free (utf16); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + strcpy (str, ""); + free (utf16); + } + *str_out = str; + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_unicode_for_glyph (cairo_pdf_surface_t *surface, + const char *utf8) +{ + uint16_t *utf16 = NULL; + int utf16_len = 0; + cairo_int_status_t status; + int i; + + if (utf8 && *utf8) { + status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &utf16_len); + if (unlikely (status)) + return status; + } + + _cairo_output_stream_printf (surface->output, "<"); + if (utf16 == NULL || utf16_len == 0) { + /* According to the "ToUnicode Mapping File Tutorial" + * http://www.adobe.com/devnet/acrobat/pdfs/5411.ToUnicode.pdf + * + * Glyphs that do not map to a Unicode code point must be + * mapped to 0xfffd "REPLACEMENT CHARACTER". + */ + _cairo_output_stream_printf (surface->output, + "fffd"); + } else { + for (i = 0; i < utf16_len; i++) + _cairo_output_stream_printf (surface->output, + "%04x", (int) (utf16[i])); + } + _cairo_output_stream_printf (surface->output, ">"); + + free (utf16); + + return CAIRO_STATUS_SUCCESS; +} + +/* Bob Jenkins hash + * + * Public domain code from: + * http://burtleburtle.net/bob/hash/doobs.html + */ + +#define HASH_MIX(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<<8); \ + c -= a; c -= b; c ^= (b>>13); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<16); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>3); \ + b -= c; b -= a; b ^= (a<<10); \ + c -= a; c -= b; c ^= (b>>15); \ +} + +static uint32_t +_hash_data (const unsigned char *data, int length, uint32_t initval) +{ + uint32_t a, b, c, len; + + len = length; + a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + c = initval; /* the previous hash value */ + + while (len >= 12) { + a += (data[0] + ((uint32_t)data[1]<<8) + ((uint32_t)data[2]<<16) + ((uint32_t)data[3]<<24)); + b += (data[4] + ((uint32_t)data[5]<<8) + ((uint32_t)data[6]<<16) + ((uint32_t)data[7]<<24)); + c += (data[8] + ((uint32_t)data[9]<<8) + ((uint32_t)data[10]<<16)+ ((uint32_t)data[11]<<24)); + HASH_MIX (a,b,c); + data += 12; + len -= 12; + } + + c += length; + switch(len) { + case 11: c+= ((uint32_t) data[10] << 24); + case 10: c+= ((uint32_t) data[9] << 16); + case 9 : c+= ((uint32_t) data[8] << 8); + case 8 : b+= ((uint32_t) data[7] << 24); + case 7 : b+= ((uint32_t) data[6] << 16); + case 6 : b+= ((uint32_t) data[5] << 8); + case 5 : b+= data[4]; + case 4 : a+= ((uint32_t) data[3] << 24); + case 3 : a+= ((uint32_t) data[2] << 16); + case 2 : a+= ((uint32_t) data[1] << 8); + case 1 : a+= data[0]; + } + HASH_MIX (a,b,c); + + return c; +} + +static void +_create_font_subset_tag (cairo_scaled_font_subset_t *font_subset, + const char *font_name, + char *tag) +{ + uint32_t hash; + int i; + long numerator; + ldiv_t d; + + hash = _hash_data ((unsigned char *) font_name, strlen(font_name), 0); + hash = _hash_data ((unsigned char *) (font_subset->glyphs), + font_subset->num_glyphs * sizeof(unsigned long), hash); + + numerator = abs (hash); + for (i = 0; i < 6; i++) { + d = ldiv (numerator, 26); + numerator = d.quot; + tag[i] = 'A' + d.rem; + } + tag[i] = 0; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset, + cairo_pdf_resource_t *stream) +{ + unsigned int i, num_bfchar; + cairo_int_status_t status; + + stream->id = 0; + + status = _cairo_pdf_surface_open_stream (surface, + NULL, + surface->compress_content, + NULL); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "/CIDInit /ProcSet findresource begin\n" + "12 dict begin\n" + "begincmap\n" + "/CIDSystemInfo\n" + "<< /Registry (Adobe)\n" + " /Ordering (UCS)\n" + " /Supplement 0\n" + ">> def\n" + "/CMapName /Adobe-Identity-UCS def\n" + "/CMapType 2 def\n" + "1 begincodespacerange\n"); + + if (font_subset->is_composite && !font_subset->is_latin) { + _cairo_output_stream_printf (surface->output, + "<0000> \n"); + } else { + _cairo_output_stream_printf (surface->output, + "<00> \n"); + } + + _cairo_output_stream_printf (surface->output, + "endcodespacerange\n"); + + if (font_subset->is_scaled) { + /* Type 3 fonts include glyph 0 in the subset */ + num_bfchar = font_subset->num_glyphs; + + /* The CMap specification has a limit of 100 characters per beginbfchar operator */ + _cairo_output_stream_printf (surface->output, + "%d beginbfchar\n", + num_bfchar > 100 ? 100 : num_bfchar); + + for (i = 0; i < num_bfchar; i++) { + if (i != 0 && i % 100 == 0) { + _cairo_output_stream_printf (surface->output, + "endbfchar\n" + "%d beginbfchar\n", + num_bfchar - i > 100 ? 100 : num_bfchar - i); + } + _cairo_output_stream_printf (surface->output, "<%02x> ", i); + status = _cairo_pdf_surface_emit_unicode_for_glyph (surface, + font_subset->utf8[i]); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "\n"); + } + } else { + /* Other fonts reserve glyph 0 for .notdef. Omit glyph 0 from the /ToUnicode map */ + num_bfchar = font_subset->num_glyphs - 1; + + /* The CMap specification has a limit of 100 characters per beginbfchar operator */ + _cairo_output_stream_printf (surface->output, + "%d beginbfchar\n", + num_bfchar > 100 ? 100 : num_bfchar); + + for (i = 0; i < num_bfchar; i++) { + if (i != 0 && i % 100 == 0) { + _cairo_output_stream_printf (surface->output, + "endbfchar\n" + "%d beginbfchar\n", + num_bfchar - i > 100 ? 100 : num_bfchar - i); + } + if (font_subset->is_latin) + _cairo_output_stream_printf (surface->output, "<%02x> ", font_subset->to_latin_char[i + 1]); + else if (font_subset->is_composite) + _cairo_output_stream_printf (surface->output, "<%04x> ", i + 1); + else + _cairo_output_stream_printf (surface->output, "<%02x> ", i + 1); + + status = _cairo_pdf_surface_emit_unicode_for_glyph (surface, + font_subset->utf8[i + 1]); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "\n"); + } + } + + _cairo_output_stream_printf (surface->output, + "endbfchar\n"); + + _cairo_output_stream_printf (surface->output, + "endcmap\n" + "CMapName currentdict /CMap defineresource pop\n" + "end\n" + "end\n"); + + *stream = surface->pdf_stream.self; + return _cairo_pdf_surface_close_stream (surface); +} + +#define PDF_UNITS_PER_EM 1000 + +static cairo_int_status_t +_cairo_pdf_surface_emit_cff_font (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset, + cairo_cff_subset_t *subset) +{ + cairo_pdf_resource_t stream, descriptor, cidfont_dict; + cairo_pdf_resource_t subset_resource, to_unicode_stream; + cairo_pdf_font_t font; + unsigned int i, last_glyph; + cairo_int_status_t status; + char tag[10]; + + _create_font_subset_tag (font_subset, subset->ps_name, tag); + + subset_resource = _cairo_pdf_surface_get_font_resource (surface, + font_subset->font_id, + font_subset->subset_id); + if (subset_resource.id == 0) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_pdf_surface_open_stream (surface, + NULL, + TRUE, + font_subset->is_latin ? + " /Subtype /Type1C\n" : + " /Subtype /CIDFontType0C\n"); + if (unlikely (status)) + return status; + + stream = surface->pdf_stream.self; + _cairo_output_stream_write (surface->output, + subset->data, subset->data_length); + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_to_unicode_stream (surface, + font_subset, + &to_unicode_stream); + if (_cairo_int_status_is_error (status)) + return status; + + descriptor = _cairo_pdf_surface_new_object (surface); + if (descriptor.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /FontDescriptor\n" + " /FontName /%s+%s\n", + descriptor.id, + tag, + subset->ps_name); + + if (subset->family_name_utf8) { + char *pdf_str; + + status = _utf8_to_pdf_string (subset->family_name_utf8, &pdf_str); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + " /FontFamily %s\n", + pdf_str); + free (pdf_str); + } + + _cairo_output_stream_printf (surface->output, + " /Flags 4\n" + " /FontBBox [ %ld %ld %ld %ld ]\n" + " /ItalicAngle 0\n" + " /Ascent %ld\n" + " /Descent %ld\n" + " /CapHeight %ld\n" + " /StemV 80\n" + " /StemH 80\n" + " /FontFile3 %u 0 R\n" + ">>\n" + "endobj\n", + (long)(subset->x_min*PDF_UNITS_PER_EM), + (long)(subset->y_min*PDF_UNITS_PER_EM), + (long)(subset->x_max*PDF_UNITS_PER_EM), + (long)(subset->y_max*PDF_UNITS_PER_EM), + (long)(subset->ascent*PDF_UNITS_PER_EM), + (long)(subset->descent*PDF_UNITS_PER_EM), + (long)(subset->y_max*PDF_UNITS_PER_EM), + stream.id); + + if (font_subset->is_latin) { + /* find last glyph used */ + for (i = 255; i >= 32; i--) + if (font_subset->latin_to_subset_glyph_index[i] > 0) + break; + + last_glyph = i; + _cairo_pdf_surface_update_object (surface, subset_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /Type1\n" + " /BaseFont /%s+%s\n" + " /FirstChar 32\n" + " /LastChar %d\n" + " /FontDescriptor %d 0 R\n" + " /Encoding /WinAnsiEncoding\n" + " /Widths [", + subset_resource.id, + tag, + subset->ps_name, + last_glyph, + descriptor.id); + + for (i = 32; i < last_glyph + 1; i++) { + int glyph = font_subset->latin_to_subset_glyph_index[i]; + if (glyph > 0) { + _cairo_output_stream_printf (surface->output, + " %ld", + (long)(subset->widths[glyph]*PDF_UNITS_PER_EM)); + } else { + _cairo_output_stream_printf (surface->output, " 0"); + } + } + + _cairo_output_stream_printf (surface->output, + " ]\n"); + + if (to_unicode_stream.id != 0) + _cairo_output_stream_printf (surface->output, + " /ToUnicode %d 0 R\n", + to_unicode_stream.id); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + } else { + cidfont_dict = _cairo_pdf_surface_new_object (surface); + if (cidfont_dict.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /CIDFontType0\n" + " /BaseFont /%s+%s\n" + " /CIDSystemInfo\n" + " << /Registry (Adobe)\n" + " /Ordering (Identity)\n" + " /Supplement 0\n" + " >>\n" + " /FontDescriptor %d 0 R\n" + " /W [0 [", + cidfont_dict.id, + tag, + subset->ps_name, + descriptor.id); + + for (i = 0; i < font_subset->num_glyphs; i++) + _cairo_output_stream_printf (surface->output, + " %ld", + (long)(subset->widths[i]*PDF_UNITS_PER_EM)); + + _cairo_output_stream_printf (surface->output, + " ]]\n" + ">>\n" + "endobj\n"); + + _cairo_pdf_surface_update_object (surface, subset_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /Type0\n" + " /BaseFont /%s+%s\n" + " /Encoding /Identity-H\n" + " /DescendantFonts [ %d 0 R]\n", + subset_resource.id, + tag, + subset->ps_name, + cidfont_dict.id); + + if (to_unicode_stream.id != 0) + _cairo_output_stream_printf (surface->output, + " /ToUnicode %d 0 R\n", + to_unicode_stream.id); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + } + + font.font_id = font_subset->font_id; + font.subset_id = font_subset->subset_id; + font.subset_resource = subset_resource; + status = _cairo_array_append (&surface->fonts, &font); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_cff_font_subset (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_int_status_t status; + cairo_cff_subset_t subset; + char name[64]; + + snprintf (name, sizeof name, "CairoFont-%d-%d", + font_subset->font_id, font_subset->subset_id); + status = _cairo_cff_subset_init (&subset, name, font_subset); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_cff_font (surface, font_subset, &subset); + + _cairo_cff_subset_fini (&subset); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_cff_fallback_font (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_int_status_t status; + cairo_cff_subset_t subset; + char name[64]; + + /* CFF fallback subsetting does not work with 8-bit glyphs unless + * they are a latin subset */ + if (!font_subset->is_composite && !font_subset->is_latin) + return CAIRO_INT_STATUS_UNSUPPORTED; + + snprintf (name, sizeof name, "CairoFont-%d-%d", + font_subset->font_id, font_subset->subset_id); + status = _cairo_cff_fallback_init (&subset, name, font_subset); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_cff_font (surface, font_subset, &subset); + + _cairo_cff_fallback_fini (&subset); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_type1_font (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset, + cairo_type1_subset_t *subset) +{ + cairo_pdf_resource_t stream, descriptor, subset_resource, to_unicode_stream; + cairo_pdf_font_t font; + cairo_int_status_t status; + unsigned long length; + unsigned int i, last_glyph; + char tag[10]; + + _create_font_subset_tag (font_subset, subset->base_font, tag); + + subset_resource = _cairo_pdf_surface_get_font_resource (surface, + font_subset->font_id, + font_subset->subset_id); + if (subset_resource.id == 0) + return CAIRO_STATUS_SUCCESS; + + length = subset->header_length + subset->data_length + subset->trailer_length; + status = _cairo_pdf_surface_open_stream (surface, + NULL, + TRUE, + " /Length1 %lu\n" + " /Length2 %lu\n" + " /Length3 %lu\n", + subset->header_length, + subset->data_length, + subset->trailer_length); + if (unlikely (status)) + return status; + + stream = surface->pdf_stream.self; + _cairo_output_stream_write (surface->output, subset->data, length); + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_to_unicode_stream (surface, + font_subset, + &to_unicode_stream); + if (_cairo_int_status_is_error (status)) + return status; + + last_glyph = font_subset->num_glyphs - 1; + if (font_subset->is_latin) { + /* find last glyph used */ + for (i = 255; i >= 32; i--) + if (font_subset->latin_to_subset_glyph_index[i] > 0) + break; + + last_glyph = i; + } + + descriptor = _cairo_pdf_surface_new_object (surface); + if (descriptor.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /FontDescriptor\n" + " /FontName /%s+%s\n" + " /Flags 4\n" + " /FontBBox [ %ld %ld %ld %ld ]\n" + " /ItalicAngle 0\n" + " /Ascent %ld\n" + " /Descent %ld\n" + " /CapHeight %ld\n" + " /StemV 80\n" + " /StemH 80\n" + " /FontFile %u 0 R\n" + ">>\n" + "endobj\n", + descriptor.id, + tag, + subset->base_font, + (long)(subset->x_min*PDF_UNITS_PER_EM), + (long)(subset->y_min*PDF_UNITS_PER_EM), + (long)(subset->x_max*PDF_UNITS_PER_EM), + (long)(subset->y_max*PDF_UNITS_PER_EM), + (long)(subset->ascent*PDF_UNITS_PER_EM), + (long)(subset->descent*PDF_UNITS_PER_EM), + (long)(subset->y_max*PDF_UNITS_PER_EM), + stream.id); + + _cairo_pdf_surface_update_object (surface, subset_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /Type1\n" + " /BaseFont /%s+%s\n" + " /FirstChar %d\n" + " /LastChar %d\n" + " /FontDescriptor %d 0 R\n", + subset_resource.id, + tag, + subset->base_font, + font_subset->is_latin ? 32 : 0, + last_glyph, + descriptor.id); + + if (font_subset->is_latin) + _cairo_output_stream_printf (surface->output, " /Encoding /WinAnsiEncoding\n"); + + _cairo_output_stream_printf (surface->output, " /Widths ["); + if (font_subset->is_latin) { + for (i = 32; i < last_glyph + 1; i++) { + int glyph = font_subset->latin_to_subset_glyph_index[i]; + if (glyph > 0) { + _cairo_output_stream_printf (surface->output, + " %ld", + (long)(subset->widths[glyph]*PDF_UNITS_PER_EM)); + } else { + _cairo_output_stream_printf (surface->output, " 0"); + } + } + } else { + for (i = 0; i < font_subset->num_glyphs; i++) + _cairo_output_stream_printf (surface->output, + " %ld", + (long)(subset->widths[i]*PDF_UNITS_PER_EM)); + } + + _cairo_output_stream_printf (surface->output, + " ]\n"); + + if (to_unicode_stream.id != 0) + _cairo_output_stream_printf (surface->output, + " /ToUnicode %d 0 R\n", + to_unicode_stream.id); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + + font.font_id = font_subset->font_id; + font.subset_id = font_subset->subset_id; + font.subset_resource = subset_resource; + return _cairo_array_append (&surface->fonts, &font); +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_type1_font_subset (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_int_status_t status; + cairo_type1_subset_t subset; + char name[64]; + + /* 16-bit glyphs not compatible with Type 1 fonts */ + if (font_subset->is_composite && !font_subset->is_latin) + return CAIRO_INT_STATUS_UNSUPPORTED; + + snprintf (name, sizeof name, "CairoFont-%d-%d", + font_subset->font_id, font_subset->subset_id); + status = _cairo_type1_subset_init (&subset, name, font_subset, FALSE); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_type1_font (surface, font_subset, &subset); + + _cairo_type1_subset_fini (&subset); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_type1_fallback_font (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_int_status_t status; + cairo_type1_subset_t subset; + char name[64]; + + /* 16-bit glyphs not compatible with Type 1 fonts */ + if (font_subset->is_composite && !font_subset->is_latin) + return CAIRO_INT_STATUS_UNSUPPORTED; + + snprintf (name, sizeof name, "CairoFont-%d-%d", + font_subset->font_id, font_subset->subset_id); + status = _cairo_type1_fallback_init_binary (&subset, name, font_subset); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_emit_type1_font (surface, font_subset, &subset); + + _cairo_type1_fallback_fini (&subset); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_truetype_font_subset (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_pdf_resource_t stream, descriptor, cidfont_dict; + cairo_pdf_resource_t subset_resource, to_unicode_stream; + cairo_int_status_t status; + cairo_pdf_font_t font; + cairo_truetype_subset_t subset; + unsigned int i, last_glyph; + char tag[10]; + + subset_resource = _cairo_pdf_surface_get_font_resource (surface, + font_subset->font_id, + font_subset->subset_id); + if (subset_resource.id == 0) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_truetype_subset_init_pdf (&subset, font_subset); + if (unlikely (status)) + return status; + + _create_font_subset_tag (font_subset, subset.ps_name, tag); + + status = _cairo_pdf_surface_open_stream (surface, + NULL, + TRUE, + " /Length1 %lu\n", + subset.data_length); + if (unlikely (status)) { + _cairo_truetype_subset_fini (&subset); + return status; + } + + stream = surface->pdf_stream.self; + _cairo_output_stream_write (surface->output, + subset.data, subset.data_length); + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) { + _cairo_truetype_subset_fini (&subset); + return status; + } + + status = _cairo_pdf_surface_emit_to_unicode_stream (surface, + font_subset, + &to_unicode_stream); + if (_cairo_int_status_is_error (status)) { + _cairo_truetype_subset_fini (&subset); + return status; + } + + descriptor = _cairo_pdf_surface_new_object (surface); + if (descriptor.id == 0) { + _cairo_truetype_subset_fini (&subset); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /FontDescriptor\n" + " /FontName /%s+%s\n", + descriptor.id, + tag, + subset.ps_name); + + if (subset.family_name_utf8) { + char *pdf_str; + + status = _utf8_to_pdf_string (subset.family_name_utf8, &pdf_str); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + " /FontFamily %s\n", + pdf_str); + free (pdf_str); + } + + _cairo_output_stream_printf (surface->output, + " /Flags %d\n" + " /FontBBox [ %ld %ld %ld %ld ]\n" + " /ItalicAngle 0\n" + " /Ascent %ld\n" + " /Descent %ld\n" + " /CapHeight %ld\n" + " /StemV 80\n" + " /StemH 80\n" + " /FontFile2 %u 0 R\n" + ">>\n" + "endobj\n", + font_subset->is_latin ? 32 : 4, + (long)(subset.x_min*PDF_UNITS_PER_EM), + (long)(subset.y_min*PDF_UNITS_PER_EM), + (long)(subset.x_max*PDF_UNITS_PER_EM), + (long)(subset.y_max*PDF_UNITS_PER_EM), + (long)(subset.ascent*PDF_UNITS_PER_EM), + (long)(subset.descent*PDF_UNITS_PER_EM), + (long)(subset.y_max*PDF_UNITS_PER_EM), + stream.id); + + if (font_subset->is_latin) { + /* find last glyph used */ + for (i = 255; i >= 32; i--) + if (font_subset->latin_to_subset_glyph_index[i] > 0) + break; + + last_glyph = i; + _cairo_pdf_surface_update_object (surface, subset_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /TrueType\n" + " /BaseFont /%s+%s\n" + " /FirstChar 32\n" + " /LastChar %d\n" + " /FontDescriptor %d 0 R\n" + " /Encoding /WinAnsiEncoding\n" + " /Widths [", + subset_resource.id, + tag, + subset.ps_name, + last_glyph, + descriptor.id); + + for (i = 32; i < last_glyph + 1; i++) { + int glyph = font_subset->latin_to_subset_glyph_index[i]; + if (glyph > 0) { + _cairo_output_stream_printf (surface->output, + " %ld", + (long)(subset.widths[glyph]*PDF_UNITS_PER_EM)); + } else { + _cairo_output_stream_printf (surface->output, " 0"); + } + } + + _cairo_output_stream_printf (surface->output, + " ]\n"); + + if (to_unicode_stream.id != 0) + _cairo_output_stream_printf (surface->output, + " /ToUnicode %d 0 R\n", + to_unicode_stream.id); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + } else { + cidfont_dict = _cairo_pdf_surface_new_object (surface); + if (cidfont_dict.id == 0) { + _cairo_truetype_subset_fini (&subset); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /CIDFontType2\n" + " /BaseFont /%s+%s\n" + " /CIDSystemInfo\n" + " << /Registry (Adobe)\n" + " /Ordering (Identity)\n" + " /Supplement 0\n" + " >>\n" + " /FontDescriptor %d 0 R\n" + " /W [0 [", + cidfont_dict.id, + tag, + subset.ps_name, + descriptor.id); + + for (i = 0; i < font_subset->num_glyphs; i++) + _cairo_output_stream_printf (surface->output, + " %ld", + (long)(subset.widths[i]*PDF_UNITS_PER_EM)); + + _cairo_output_stream_printf (surface->output, + " ]]\n" + ">>\n" + "endobj\n"); + + _cairo_pdf_surface_update_object (surface, subset_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /Type0\n" + " /BaseFont /%s+%s\n" + " /Encoding /Identity-H\n" + " /DescendantFonts [ %d 0 R]\n", + subset_resource.id, + tag, + subset.ps_name, + cidfont_dict.id); + + if (to_unicode_stream.id != 0) + _cairo_output_stream_printf (surface->output, + " /ToUnicode %d 0 R\n", + to_unicode_stream.id); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + } + + font.font_id = font_subset->font_id; + font.subset_id = font_subset->subset_id; + font.subset_resource = subset_resource; + status = _cairo_array_append (&surface->fonts, &font); + + _cairo_truetype_subset_fini (&subset); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_emit_imagemask (cairo_image_surface_t *image, + cairo_output_stream_t *stream) +{ + uint8_t *byte, output_byte; + int row, col, num_cols; + + /* The only image type supported by Type 3 fonts are 1-bit image + * masks */ + assert (image->format == CAIRO_FORMAT_A1); + + _cairo_output_stream_printf (stream, + "BI\n" + "/IM true\n" + "/W %d\n" + "/H %d\n" + "/BPC 1\n" + "/D [1 0]\n", + image->width, + image->height); + + _cairo_output_stream_printf (stream, + "ID "); + + num_cols = (image->width + 7) / 8; + for (row = 0; row < image->height; row++) { + byte = image->data + row * image->stride; + for (col = 0; col < num_cols; col++) { + output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte); + _cairo_output_stream_write (stream, &output_byte, 1); + byte++; + } + } + + _cairo_output_stream_printf (stream, + "\nEI\n"); + + return _cairo_output_stream_get_status (stream); +} + +static cairo_int_status_t +_cairo_pdf_surface_analyze_user_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_pdf_surface_t *surface = closure; + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + cairo_int_status_t status2; + unsigned int i; + cairo_surface_t *type3_surface; + cairo_output_stream_t *null_stream; + + null_stream = _cairo_null_stream_create (); + type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font, + null_stream, + _cairo_pdf_emit_imagemask, + surface->font_subsets, + FALSE); + if (unlikely (type3_surface->status)) { + status2 = _cairo_output_stream_destroy (null_stream); + return type3_surface->status; + } + + _cairo_type3_glyph_surface_set_font_subsets_callback (type3_surface, + _cairo_pdf_surface_add_font, + surface); + + for (i = 0; i < font_subset->num_glyphs; i++) { + status = _cairo_type3_glyph_surface_analyze_glyph (type3_surface, + font_subset->glyphs[i]); + if (unlikely (status)) + break; + } + + cairo_surface_destroy (type3_surface); + status2 = _cairo_output_stream_destroy (null_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_type3_font_subset (cairo_pdf_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + cairo_pdf_resource_t *glyphs, encoding, char_procs, subset_resource, to_unicode_stream; + cairo_pdf_font_t font; + double *widths; + unsigned int i; + cairo_box_t font_bbox = {{0,0},{0,0}}; + cairo_box_t bbox = {{0,0},{0,0}}; + cairo_surface_t *type3_surface; + + if (font_subset->num_glyphs == 0) + return CAIRO_STATUS_SUCCESS; + + subset_resource = _cairo_pdf_surface_get_font_resource (surface, + font_subset->font_id, + font_subset->subset_id); + if (subset_resource.id == 0) + return CAIRO_STATUS_SUCCESS; + + glyphs = _cairo_malloc_ab (font_subset->num_glyphs, sizeof (cairo_pdf_resource_t)); + if (unlikely (glyphs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + widths = _cairo_malloc_ab (font_subset->num_glyphs, sizeof (double)); + if (unlikely (widths == NULL)) { + free (glyphs); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_pdf_group_resources_clear (&surface->resources); + type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font, + NULL, + _cairo_pdf_emit_imagemask, + surface->font_subsets, + FALSE); + if (unlikely (type3_surface->status)) { + free (glyphs); + free (widths); + return type3_surface->status; + } + + _cairo_type3_glyph_surface_set_font_subsets_callback (type3_surface, + _cairo_pdf_surface_add_font, + surface); + + for (i = 0; i < font_subset->num_glyphs; i++) { + status = _cairo_pdf_surface_open_stream (surface, + NULL, + surface->compress_content, + NULL); + if (unlikely (status)) + break; + + glyphs[i] = surface->pdf_stream.self; + status = _cairo_type3_glyph_surface_emit_glyph (type3_surface, + surface->output, + font_subset->glyphs[i], + &bbox, + &widths[i]); + if (unlikely (status)) + break; + + status = _cairo_pdf_surface_close_stream (surface); + if (unlikely (status)) + break; + + if (i == 0) { + font_bbox.p1.x = bbox.p1.x; + font_bbox.p1.y = bbox.p1.y; + font_bbox.p2.x = bbox.p2.x; + font_bbox.p2.y = bbox.p2.y; + } else { + if (bbox.p1.x < font_bbox.p1.x) + font_bbox.p1.x = bbox.p1.x; + if (bbox.p1.y < font_bbox.p1.y) + font_bbox.p1.y = bbox.p1.y; + if (bbox.p2.x > font_bbox.p2.x) + font_bbox.p2.x = bbox.p2.x; + if (bbox.p2.y > font_bbox.p2.y) + font_bbox.p2.y = bbox.p2.y; + } + } + cairo_surface_destroy (type3_surface); + if (unlikely (status)) { + free (glyphs); + free (widths); + return status; + } + + encoding = _cairo_pdf_surface_new_object (surface); + if (encoding.id == 0) { + free (glyphs); + free (widths); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Encoding\n" + " /Differences [0", encoding.id); + for (i = 0; i < font_subset->num_glyphs; i++) + _cairo_output_stream_printf (surface->output, + " /%d", i); + _cairo_output_stream_printf (surface->output, + "]\n" + ">>\n" + "endobj\n"); + + char_procs = _cairo_pdf_surface_new_object (surface); + if (char_procs.id == 0) { + free (glyphs); + free (widths); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<<\n", char_procs.id); + for (i = 0; i < font_subset->num_glyphs; i++) + _cairo_output_stream_printf (surface->output, + " /%d %d 0 R\n", + i, glyphs[i].id); + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + + free (glyphs); + + status = _cairo_pdf_surface_emit_to_unicode_stream (surface, + font_subset, + &to_unicode_stream); + if (_cairo_int_status_is_error (status)) { + free (widths); + return status; + } + + _cairo_pdf_surface_update_object (surface, subset_resource); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Font\n" + " /Subtype /Type3\n" + " /FontBBox [%f %f %f %f]\n" + " /FontMatrix [ 1 0 0 1 0 0 ]\n" + " /Encoding %d 0 R\n" + " /CharProcs %d 0 R\n" + " /FirstChar 0\n" + " /LastChar %d\n", + subset_resource.id, + _cairo_fixed_to_double (font_bbox.p1.x), + - _cairo_fixed_to_double (font_bbox.p2.y), + _cairo_fixed_to_double (font_bbox.p2.x), + - _cairo_fixed_to_double (font_bbox.p1.y), + encoding.id, + char_procs.id, + font_subset->num_glyphs - 1); + + _cairo_output_stream_printf (surface->output, + " /Widths ["); + for (i = 0; i < font_subset->num_glyphs; i++) + _cairo_output_stream_printf (surface->output, " %f", widths[i]); + _cairo_output_stream_printf (surface->output, + "]\n"); + free (widths); + + _cairo_output_stream_printf (surface->output, + " /Resources\n"); + _cairo_pdf_surface_emit_group_resources (surface, &surface->resources); + + if (to_unicode_stream.id != 0) + _cairo_output_stream_printf (surface->output, + " /ToUnicode %d 0 R\n", + to_unicode_stream.id); + + _cairo_output_stream_printf (surface->output, + ">>\n" + "endobj\n"); + + font.font_id = font_subset->font_id; + font.subset_id = font_subset->subset_id; + font.subset_resource = subset_resource; + return _cairo_array_append (&surface->fonts, &font); +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_pdf_surface_t *surface = closure; + cairo_int_status_t status; + + status = _cairo_pdf_surface_emit_cff_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_pdf_surface_emit_truetype_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_pdf_surface_emit_type1_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_pdf_surface_emit_cff_fallback_font (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_pdf_surface_emit_type1_fallback_font (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_pdf_surface_t *surface = closure; + cairo_int_status_t status; + + status = _cairo_pdf_surface_emit_type3_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_emit_font_subsets (cairo_pdf_surface_t *surface) +{ + cairo_int_status_t status; + + status = _cairo_scaled_font_subsets_foreach_user (surface->font_subsets, + _cairo_pdf_surface_analyze_user_font_subset, + surface); + if (unlikely (status)) + goto BAIL; + + status = _cairo_scaled_font_subsets_foreach_unscaled (surface->font_subsets, + _cairo_pdf_surface_emit_unscaled_font_subset, + surface); + if (unlikely (status)) + goto BAIL; + + status = _cairo_scaled_font_subsets_foreach_scaled (surface->font_subsets, + _cairo_pdf_surface_emit_scaled_font_subset, + surface); + if (unlikely (status)) + goto BAIL; + + status = _cairo_scaled_font_subsets_foreach_user (surface->font_subsets, + _cairo_pdf_surface_emit_scaled_font_subset, + surface); + +BAIL: + _cairo_scaled_font_subsets_destroy (surface->font_subsets); + surface->font_subsets = NULL; + + return status; +} + +static cairo_pdf_resource_t +_cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface) +{ + cairo_pdf_resource_t catalog; + + catalog = _cairo_pdf_surface_new_object (surface); + if (catalog.id == 0) + return catalog; + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Catalog\n" + " /Pages %d 0 R\n" + ">>\n" + "endobj\n", + catalog.id, + surface->pages_resource.id); + + return catalog; +} + +static long +_cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface) +{ + cairo_pdf_object_t *object; + int num_objects, i; + long offset; + char buffer[11]; + + num_objects = _cairo_array_num_elements (&surface->objects); + + offset = _cairo_output_stream_get_position (surface->output); + _cairo_output_stream_printf (surface->output, + "xref\n" + "%d %d\n", + 0, num_objects + 1); + + _cairo_output_stream_printf (surface->output, + "0000000000 65535 f \n"); + for (i = 0; i < num_objects; i++) { + object = _cairo_array_index (&surface->objects, i); + snprintf (buffer, sizeof buffer, "%010ld", object->offset); + _cairo_output_stream_printf (surface->output, + "%s 00000 n \n", buffer); + } + + return offset; +} + +static cairo_int_status_t +_cairo_pdf_surface_write_mask_group (cairo_pdf_surface_t *surface, + cairo_pdf_smask_group_t *group) +{ + cairo_pdf_resource_t mask_group; + cairo_pdf_resource_t smask; + cairo_pdf_smask_group_t *smask_group; + cairo_pdf_resource_t pattern_res, gstate_res; + cairo_int_status_t status; + cairo_box_double_t bbox; + + /* Create mask group */ + _get_bbox_from_extents (group->height, &group->extents, &bbox); + status = _cairo_pdf_surface_open_group (surface, &bbox, NULL); + if (unlikely (status)) + return status; + + if (_can_paint_pattern (group->mask)) { + _cairo_output_stream_printf (surface->output, "q\n"); + status = _cairo_pdf_surface_paint_pattern (surface, + CAIRO_OPERATOR_OVER, + group->mask, + &group->extents, + FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "Q\n"); + } else { + pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, group->mask, + CAIRO_OPERATOR_OVER, + NULL, + &pattern_res, &gstate_res); + if (unlikely (status)) + return status; + + if (gstate_res.id != 0) { + smask_group = _cairo_pdf_surface_create_smask_group (surface, &group->extents); + if (unlikely (smask_group == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + smask_group->width = group->width; + smask_group->height = group->height; + smask_group->operation = PDF_PAINT; + smask_group->source = cairo_pattern_reference (group->mask); + smask_group->source_res = pattern_res; + status = _cairo_pdf_surface_add_smask_group (surface, smask_group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (smask_group); + return status; + } + + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + gstate_res.id, + smask_group->group_res.id); + } else { + status = _cairo_pdf_surface_select_pattern (surface, group->mask, pattern_res, FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "%f %f %f %f re f\n", + bbox.p1.x, + bbox.p1.y, + bbox.p2.x - bbox.p1.x, + bbox.p2.y - bbox.p1.y); + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + return status; + } + } + + status = _cairo_pdf_surface_close_group (surface, &mask_group); + if (unlikely (status)) + return status; + + /* Create source group */ + status = _cairo_pdf_surface_open_group (surface, &bbox, &group->source_res); + if (unlikely (status)) + return status; + + if (_can_paint_pattern (group->source)) { + _cairo_output_stream_printf (surface->output, "q\n"); + status = _cairo_pdf_surface_paint_pattern (surface, + CAIRO_OPERATOR_OVER, + group->source, + &group->extents, + FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "Q\n"); + } else { + pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, group->source, + CAIRO_OPERATOR_OVER, + NULL, + &pattern_res, &gstate_res); + if (unlikely (status)) + return status; + + if (gstate_res.id != 0) { + smask_group = _cairo_pdf_surface_create_smask_group (surface, &group->extents); + if (unlikely (smask_group == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + smask_group->operation = PDF_PAINT; + smask_group->source = cairo_pattern_reference (group->source); + smask_group->source_res = pattern_res; + status = _cairo_pdf_surface_add_smask_group (surface, smask_group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (smask_group); + return status; + } + + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + gstate_res.id, + smask_group->group_res.id); + } else { + status = _cairo_pdf_surface_select_pattern (surface, group->source, pattern_res, FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "%f %f %f %f re f\n", + bbox.p1.x, + bbox.p1.y, + bbox.p2.x - bbox.p1.x, + bbox.p2.y - bbox.p1.y); + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + return status; + } + } + + status = _cairo_pdf_surface_close_group (surface, NULL); + if (unlikely (status)) + return status; + + /* Create an smask based on the alpha component of mask_group */ + smask = _cairo_pdf_surface_new_object (surface); + if (smask.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Mask\n" + " /S /Alpha\n" + " /G %d 0 R\n" + ">>\n" + "endobj\n", + smask.id, + mask_group.id); + + /* Create a GState that uses the smask */ + _cairo_pdf_surface_update_object (surface, group->group_res); + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /ExtGState\n" + " /SMask %d 0 R\n" + " /ca 1\n" + " /CA 1\n" + " /AIS false\n" + ">>\n" + "endobj\n", + group->group_res.id, + smask.id); + + return _cairo_output_stream_get_status (surface->output); +} + +static cairo_int_status_t +_cairo_pdf_surface_write_smask_group (cairo_pdf_surface_t *surface, + cairo_pdf_smask_group_t *group) +{ + double old_width, old_height; + cairo_int_status_t status; + cairo_box_double_t bbox; + + old_width = surface->width; + old_height = surface->height; + _cairo_pdf_surface_set_size_internal (surface, + group->width, + group->height); + /* _mask is a special case that requires two groups - source + * and mask as well as a smask and gstate dictionary */ + if (group->operation == PDF_MASK) { + status = _cairo_pdf_surface_write_mask_group (surface, group); + goto RESTORE_SIZE; + } + + _get_bbox_from_extents (group->height, &group->extents, &bbox); + status = _cairo_pdf_surface_open_group (surface, &bbox, &group->group_res); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_select_pattern (surface, + group->source, + group->source_res, + group->operation == PDF_STROKE); + if (unlikely (status)) + return status; + + switch (group->operation) { + case PDF_PAINT: + _cairo_output_stream_printf (surface->output, + "0 0 %f %f re f\n", + surface->width, surface->height); + break; + case PDF_MASK: + ASSERT_NOT_REACHED; + break; + case PDF_FILL: + status = _cairo_pdf_operators_fill (&surface->pdf_operators, + &group->path, + group->fill_rule); + break; + case PDF_STROKE: + status = _cairo_pdf_operators_stroke (&surface->pdf_operators, + &group->path, + &group->style, + &group->ctm, + &group->ctm_inverse); + break; + case PDF_SHOW_GLYPHS: + status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators, + group->utf8, group->utf8_len, + group->glyphs, group->num_glyphs, + group->clusters, group->num_clusters, + group->cluster_flags, + group->scaled_font); + break; + } + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_close_group (surface, NULL); + +RESTORE_SIZE: + _cairo_pdf_surface_set_size_internal (surface, + old_width, + old_height); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_write_patterns_and_smask_groups (cairo_pdf_surface_t *surface) +{ + cairo_pdf_pattern_t pattern; + cairo_pdf_smask_group_t *group; + cairo_pdf_source_surface_t src_surface; + unsigned int pattern_index, group_index, surface_index; + cairo_int_status_t status; + + /* Writing out PDF_MASK groups will cause additional smask groups + * to be appended to surface->smask_groups. Additional patterns + * may also be appended to surface->patterns. + * + * Writing recording surface patterns will cause additional patterns + * and groups to be appended. + */ + pattern_index = 0; + group_index = 0; + surface_index = 0; + while ((pattern_index < _cairo_array_num_elements (&surface->page_patterns)) || + (group_index < _cairo_array_num_elements (&surface->smask_groups)) || + (surface_index < _cairo_array_num_elements (&surface->page_surfaces))) + { + for (; group_index < _cairo_array_num_elements (&surface->smask_groups); group_index++) { + _cairo_array_copy_element (&surface->smask_groups, group_index, &group); + status = _cairo_pdf_surface_write_smask_group (surface, group); + if (unlikely (status)) + return status; + } + + for (; pattern_index < _cairo_array_num_elements (&surface->page_patterns); pattern_index++) { + _cairo_array_copy_element (&surface->page_patterns, pattern_index, &pattern); + status = _cairo_pdf_surface_emit_pattern (surface, &pattern); + if (unlikely (status)) + return status; + } + + for (; surface_index < _cairo_array_num_elements (&surface->page_surfaces); surface_index++) { + _cairo_array_copy_element (&surface->page_surfaces, surface_index, &src_surface); + status = _cairo_pdf_surface_emit_surface (surface, &src_surface); + if (unlikely (status)) + return status; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface) +{ + cairo_pdf_resource_t page, knockout, res; + cairo_int_status_t status; + unsigned int i, len; + + _cairo_pdf_group_resources_clear (&surface->resources); + if (surface->has_fallback_images) { + cairo_rectangle_int_t extents; + cairo_box_double_t bbox; + + extents.x = 0; + extents.y = 0; + extents.width = ceil (surface->width); + extents.height = ceil (surface->height); + _get_bbox_from_extents (surface->height, &extents, &bbox); + status = _cairo_pdf_surface_open_knockout_group (surface, &bbox); + if (unlikely (status)) + return status; + + len = _cairo_array_num_elements (&surface->knockout_group); + for (i = 0; i < len; i++) { + _cairo_array_copy_element (&surface->knockout_group, i, &res); + _cairo_output_stream_printf (surface->output, + "/x%d Do\n", + res.id); + status = _cairo_pdf_surface_add_xobject (surface, res); + if (unlikely (status)) + return status; + } + _cairo_output_stream_printf (surface->output, + "/x%d Do\n", + surface->content.id); + status = _cairo_pdf_surface_add_xobject (surface, surface->content); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_close_group (surface, &knockout); + if (unlikely (status)) + return status; + + _cairo_pdf_group_resources_clear (&surface->resources); + status = _cairo_pdf_surface_open_content_stream (surface, NULL, NULL, FALSE, FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, + "/x%d Do\n", + knockout.id); + status = _cairo_pdf_surface_add_xobject (surface, knockout); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_close_content_stream (surface); + if (unlikely (status)) + return status; + } + + page = _cairo_pdf_surface_new_object (surface); + if (page.id == 0) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->output, + "%d 0 obj\n" + "<< /Type /Page\n" + " /Parent %d 0 R\n" + " /MediaBox [ 0 0 %f %f ]\n" + " /Contents %d 0 R\n" + " /Group <<\n" + " /Type /Group\n" + " /S /Transparency\n" + " /I true\n" + " /CS /DeviceRGB\n" + " >>\n" + " /Resources %d 0 R\n" + ">>\n" + "endobj\n", + page.id, + surface->pages_resource.id, + surface->width, + surface->height, + surface->content.id, + surface->content_resources.id); + + status = _cairo_array_append (&surface->pages, &page); + if (unlikely (status)) + return status; + + status = _cairo_pdf_surface_write_patterns_and_smask_groups (surface); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_pdf_surface_analyze_surface_pattern_transparency (cairo_pdf_surface_t *surface, + cairo_surface_pattern_t *pattern) +{ + cairo_image_surface_t *image; + void *image_extra; + cairo_int_status_t status; + cairo_image_transparency_t transparency; + + status = _cairo_surface_acquire_source_image (pattern->surface, + &image, + &image_extra); + if (unlikely (status)) + return status; + + if (image->base.status) + return image->base.status; + + transparency = _cairo_image_analyze_transparency (image); + if (transparency == CAIRO_IMAGE_IS_OPAQUE) + status = CAIRO_STATUS_SUCCESS; + else + status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + + _cairo_surface_release_source_image (pattern->surface, image, image_extra); + + return status; +} + +static cairo_bool_t +_surface_pattern_supported (cairo_surface_pattern_t *pattern) +{ + cairo_extend_t extend; + + if (pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + return TRUE; + + if (pattern->surface->backend->acquire_source_image == NULL) + return FALSE; + + /* Does an ALPHA-only source surface even make sense? Maybe, but I + * don't think it's worth the extra code to support it. */ + +/* XXX: Need to write this function here... + if (pattern->surface->content == CAIRO_CONTENT_ALPHA) + return FALSE; +*/ + + extend = cairo_pattern_get_extend (&pattern->base); + switch (extend) { + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_REPEAT: + case CAIRO_EXTEND_REFLECT: + /* There's no point returning FALSE for EXTEND_PAD, as the image + * surface does not currently implement it either */ + case CAIRO_EXTEND_PAD: + return TRUE; + } + + ASSERT_NOT_REACHED; + return FALSE; +} + +static cairo_bool_t +_pattern_supported (const cairo_pattern_t *pattern) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return TRUE; + + case CAIRO_PATTERN_TYPE_SURFACE: + return _surface_pattern_supported ((cairo_surface_pattern_t *) pattern); + + default: + ASSERT_NOT_REACHED; + return FALSE; + } +} + +static cairo_bool_t +_pdf_operator_supported (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return TRUE; + + default: + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_ATOP: + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_DEST_ATOP: + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + return FALSE; + } +} + +static cairo_int_status_t +_cairo_pdf_surface_analyze_operation (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + if (surface->force_fallbacks && + surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (! _pattern_supported (pattern)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (_pdf_operator_supported (op)) { + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; + + if (surface_pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (pattern->extend == CAIRO_EXTEND_PAD) { + cairo_box_t box; + cairo_rectangle_int_t rect; + cairo_rectangle_int_t rec_extents; + + /* get the operation extents in pattern space */ + _cairo_box_from_rectangle (&box, extents); + _cairo_matrix_transform_bounding_box_fixed (&pattern->matrix, &box, NULL); + _cairo_box_round_to_rectangle (&box, &rect); + + /* Check if surface needs padding to fill extents */ + if (_cairo_surface_get_extents (surface_pattern->surface, &rec_extents)) { + if (_cairo_fixed_integer_ceil(box.p1.x) < rec_extents.x || + _cairo_fixed_integer_ceil(box.p1.y) < rec_extents.y || + _cairo_fixed_integer_floor(box.p2.y) > rec_extents.x + rec_extents.width || + _cairo_fixed_integer_floor(box.p2.y) > rec_extents.y + rec_extents.height) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + } + return CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN; + } + } + + return CAIRO_STATUS_SUCCESS; + } + + + /* The SOURCE operator is supported if the pattern is opaque or if + * there is nothing painted underneath. */ + if (op == CAIRO_OPERATOR_SOURCE) { + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; + + if (surface_pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (_cairo_pattern_is_opaque (pattern, extents)) { + return CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN; + } else { + /* FIXME: The analysis surface does not yet have + * the capability to analyze a non opaque recording + * surface and mark it supported if there is + * nothing underneath. For now recording surfaces of + * type CONTENT_COLOR_ALPHA painted with + * OPERATOR_SOURCE will result in a fallback + * image. */ + + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } else { + return _cairo_pdf_surface_analyze_surface_pattern_transparency (surface, + surface_pattern); + } + } + + if (_cairo_pattern_is_opaque (pattern, extents)) + return CAIRO_STATUS_SUCCESS; + else + return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_bool_t +_cairo_pdf_surface_operation_supported (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + return _cairo_pdf_surface_analyze_operation (surface, op, pattern, extents) != CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_int_status_t +_cairo_pdf_surface_start_fallback (cairo_pdf_surface_t *surface) +{ + cairo_box_double_t bbox; + cairo_int_status_t status; + + status = _cairo_pdf_surface_close_content_stream (surface); + if (unlikely (status)) + return status; + + status = _cairo_array_append (&surface->knockout_group, &surface->content); + if (unlikely (status)) + return status; + + _cairo_pdf_group_resources_clear (&surface->resources); + bbox.p1.x = 0; + bbox.p1.y = 0; + bbox.p2.x = surface->width; + bbox.p2.y = surface->height; + return _cairo_pdf_surface_open_content_stream (surface, &bbox, NULL, TRUE, TRUE); +} + +/* If source is an opaque image and mask is an image and both images + * have the same bounding box we can emit them as a image/smask pair. + */ +static cairo_int_status_t +_cairo_pdf_surface_emit_combined_smask (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_rectangle_int_t *extents) +{ + cairo_int_status_t status; + cairo_image_surface_t *image; + void *image_extra; + cairo_image_transparency_t transparency; + cairo_pdf_resource_t smask_res; + int src_width, src_height; + int mask_width, mask_height; + double src_x_offset, src_y_offset; + double mask_x_offset, mask_y_offset; + double src_x1, src_y1, src_x2, src_y2; + double mask_x1, mask_y1, mask_x2, mask_y2; + cairo_matrix_t p2u; + double src_radius, mask_radius, e; + cairo_rectangle_int_t extents2; + cairo_bool_t need_smask; + + /* Check that source and mask are images */ + + if (!((source->type == CAIRO_PATTERN_TYPE_SURFACE || source->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) && + (mask->type == CAIRO_PATTERN_TYPE_SURFACE || mask->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *) source)->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (mask->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *) mask)->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (source->extend != CAIRO_EXTEND_NONE || mask->extend != CAIRO_EXTEND_NONE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Check that source is opaque and get image sizes */ + + status = _cairo_pdf_surface_acquire_source_image_from_pattern (surface, source, + &image, &image_extra); + if (unlikely (status)) + return status; + + if (image->base.status) + return image->base.status; + + src_width = image->width; + src_height = image->height; + if (source->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) { + cairo_surface_get_device_offset (&image->base, &src_x_offset, &src_y_offset); + } else { + src_x_offset = 0; + src_y_offset = 0; + } + + transparency = _cairo_image_analyze_transparency (image); + _cairo_pdf_surface_release_source_image_from_pattern (surface, source, image, image_extra); + + if (transparency != CAIRO_IMAGE_IS_OPAQUE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_pdf_surface_acquire_source_image_from_pattern (surface, mask, + &image, &image_extra); + if (unlikely (status)) + return status; + + if (image->base.status) + return image->base.status; + + mask_width = image->width; + mask_height = image->height; + if (mask->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) { + cairo_surface_get_device_offset (&image->base, &mask_x_offset, &mask_y_offset); + } else { + mask_x_offset = 0; + mask_y_offset = 0; + } + + transparency = _cairo_image_analyze_transparency (image); + need_smask = transparency != CAIRO_IMAGE_IS_OPAQUE; + + _cairo_pdf_surface_release_source_image_from_pattern (surface, mask, image, image_extra); + + /* Check that both images have the same extents with a tolerance + * of half the smallest source pixel. */ + + p2u = source->matrix; + status = cairo_matrix_invert (&p2u); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + src_x1 = 0; + src_y1 = 0; + src_x2 = src_width; + src_y2 = src_height; + cairo_matrix_transform_point (&p2u, &src_x1, &src_y1); + cairo_matrix_transform_point (&p2u, &src_x2, &src_y2); + src_radius = _cairo_matrix_transformed_circle_major_axis (&p2u, 0.5); + + p2u = mask->matrix; + status = cairo_matrix_invert (&p2u); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_INT_STATUS_SUCCESS); + mask_x1 = 0; + mask_y1 = 0; + mask_x2 = mask_width; + mask_y2 = mask_height; + cairo_matrix_transform_point (&p2u, &mask_x1, &mask_y1); + cairo_matrix_transform_point (&p2u, &mask_x2, &mask_y2); + mask_radius = _cairo_matrix_transformed_circle_major_axis (&p2u, 0.5); + + if (src_radius < mask_radius) + e = src_radius; + else + e = mask_radius; + + if (fabs(src_x1 - mask_x1) > e || + fabs(src_x2 - mask_x2) > e || + fabs(src_y1 - mask_y1) > e || + fabs(src_y2 - mask_y2) > e) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Check both images have same device offset */ + if (fabs(src_x_offset - mask_x_offset) > e || + fabs(src_y_offset - mask_y_offset) > e) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (need_smask) { + status = _cairo_pdf_surface_add_source_surface (surface, + NULL, + mask, + op, + source->filter, + FALSE, + TRUE, + extents, + NULL, + &smask_res, + &mask_width, + &mask_height, + &mask_x_offset, + &mask_y_offset, + &extents2); + if (unlikely (status)) + return status; + } + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "q\n"); + status = _cairo_pdf_surface_paint_surface_pattern (surface, op, source, extents, + need_smask ? &smask_res : NULL, + FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "Q\n"); + + status = _cairo_output_stream_get_status (surface->output); + + + return status; +} + +/* A PDF stencil mask is an A1 mask used with the current color */ +static cairo_int_status_t +_cairo_pdf_surface_emit_stencil_mask (cairo_pdf_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_rectangle_int_t *extents) +{ + cairo_int_status_t status; + cairo_image_surface_t *image; + void *image_extra; + cairo_image_transparency_t transparency; + cairo_pdf_resource_t pattern_res = {0}; + + if (! (source->type == CAIRO_PATTERN_TYPE_SOLID && + (mask->type == CAIRO_PATTERN_TYPE_SURFACE || mask->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (mask->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *) mask)->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = _cairo_pdf_surface_acquire_source_image_from_pattern (surface, mask, + &image, &image_extra); + if (unlikely (status)) + return status; + + if (image->base.status) + return image->base.status; + + transparency = _cairo_image_analyze_transparency (image); + if (transparency != CAIRO_IMAGE_IS_OPAQUE && + transparency != CAIRO_IMAGE_HAS_BILEVEL_ALPHA) + { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + + status = _cairo_pdf_surface_select_pattern (surface, source, + pattern_res, FALSE); + if (unlikely (status)) + return status; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "q\n"); + status = _cairo_pdf_surface_paint_surface_pattern (surface, op, mask, extents, NULL, TRUE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->output, "Q\n"); + + status = _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_pdf_surface_release_source_image_from_pattern (surface, mask, image, image_extra); + + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_set_clip (cairo_pdf_surface_t *surface, + cairo_composite_rectangles_t *composite) +{ + cairo_clip_t *clip = composite->clip; + + if (_cairo_composite_rectangles_can_reduce_clip (composite, clip)) + clip = NULL; + + if (clip == NULL) { + if (_cairo_composite_rectangles_can_reduce_clip (composite, + surface->clipper.clip)) + return CAIRO_STATUS_SUCCESS; + } + + return _cairo_surface_clipper_set_clip (&surface->clipper, clip); +} + +static cairo_int_status_t +_cairo_pdf_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_pdf_smask_group_t *group; + cairo_pdf_resource_t pattern_res, gstate_res; + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + status = _cairo_composite_rectangles_init_for_paint (&extents, + &surface->base, + op, source, clip); + if (unlikely (status)) + return status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_pdf_surface_analyze_operation (surface, op, source, &extents.bounded); + goto cleanup; + } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { + status = _cairo_pdf_surface_start_fallback (surface); + if (unlikely (status)) + goto cleanup; + } + + assert (_cairo_pdf_surface_operation_supported (surface, op, source, &extents.bounded)); + + status = _cairo_pdf_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_operator (surface, op); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + + if (_can_paint_pattern (source)) { + _cairo_output_stream_printf (surface->output, "q\n"); + status = _cairo_pdf_surface_paint_pattern (surface, + op, + source, + &extents.bounded, + FALSE); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, "Q\n"); + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + } + + pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, source, op, + &extents.bounded, + &pattern_res, &gstate_res); + if (unlikely (status)) + goto cleanup; + + if (gstate_res.id != 0) { + group = _cairo_pdf_surface_create_smask_group (surface, &extents.bounded); + if (unlikely (group == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + + group->operation = PDF_PAINT; + status = _cairo_pattern_create_copy (&group->source, source); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + group->source_res = pattern_res; + status = _cairo_pdf_surface_add_smask_group (surface, group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_add_xobject (surface, group->group_res); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + gstate_res.id, + group->group_res.id); + } else { + status = _cairo_pdf_surface_select_pattern (surface, source, + pattern_res, FALSE); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, + "0 0 %f %f re f\n", + surface->width, surface->height); + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + goto cleanup; + } + + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_pdf_smask_group_t *group; + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + cairo_rectangle_int_t r; + cairo_box_t box; + + status = _cairo_composite_rectangles_init_for_mask (&extents, + &surface->base, + op, source, mask, clip); + if (unlikely (status)) + return status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + cairo_int_status_t source_status, mask_status; + + status = _cairo_pdf_surface_analyze_operation (surface, op, source, &extents.bounded); + if (_cairo_int_status_is_error (status)) + goto cleanup; + source_status = status; + + if (mask->has_component_alpha) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + } else { + status = _cairo_pdf_surface_analyze_operation (surface, op, mask, &extents.bounded); + if (_cairo_int_status_is_error (status)) + goto cleanup; + } + mask_status = status; + + _cairo_composite_rectangles_fini (&extents); + return _cairo_analysis_surface_merge_status (source_status, + mask_status); + } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { + status = _cairo_pdf_surface_start_fallback (surface); + if (unlikely (status)) + goto cleanup; + } + + assert (_cairo_pdf_surface_operation_supported (surface, op, source, &extents.bounded)); + assert (_cairo_pdf_surface_operation_supported (surface, op, mask, &extents.bounded)); + + /* get the accurate extents */ + status = _cairo_pattern_get_ink_extents (source, &r); + if (unlikely (status)) + goto cleanup; + + /* XXX slight impedance mismatch */ + _cairo_box_from_rectangle (&box, &r); + status = _cairo_composite_rectangles_intersect_source_extents (&extents, + &box); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pattern_get_ink_extents (mask, &r); + if (unlikely (status)) + goto cleanup; + + _cairo_box_from_rectangle (&box, &r); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, + &box); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_operator (surface, op); + if (unlikely (status)) + goto cleanup; + + /* Check if we can combine source and mask into a smask image */ + status = _cairo_pdf_surface_emit_combined_smask (surface, op, source, mask, &extents.bounded); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto cleanup; + + /* Check if we can use a stencil mask */ + status = _cairo_pdf_surface_emit_stencil_mask (surface, op, source, mask, &extents.bounded); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto cleanup; + + group = _cairo_pdf_surface_create_smask_group (surface, &extents.bounded); + if (unlikely (group == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + + group->operation = PDF_MASK; + status = _cairo_pattern_create_copy (&group->source, source); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + status = _cairo_pattern_create_copy (&group->mask, mask); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + group->source_res = _cairo_pdf_surface_new_object (surface); + if (group->source_res.id == 0) { + _cairo_pdf_smask_group_destroy (group); + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + + status = _cairo_pdf_surface_add_smask_group (surface, group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + status = _cairo_pdf_surface_add_smask (surface, group->group_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_add_xobject (surface, group->source_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + group->group_res.id, + group->source_res.id); + + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_pdf_smask_group_t *group; + cairo_pdf_resource_t pattern_res, gstate_res; + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + status = _cairo_composite_rectangles_init_for_stroke (&extents, + &surface->base, + op, source, + path, style, ctm, + clip); + if (unlikely (status)) + return status; + + /* use the more accurate extents */ + if (extents.is_bounded) { + cairo_rectangle_int_t mask; + cairo_box_t box; + + status = _cairo_path_fixed_stroke_extents (path, style, + ctm, ctm_inverse, + tolerance, + &mask); + if (unlikely (status)) + goto cleanup; + + _cairo_box_from_rectangle (&box, &mask); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, + &box); + if (unlikely (status)) + goto cleanup; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_pdf_surface_analyze_operation (surface, op, source, &extents.bounded); + goto cleanup; + } + + assert (_cairo_pdf_surface_operation_supported (surface, op, source, &extents.bounded)); + + status = _cairo_pdf_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup; + + pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, source, op, + &extents.bounded, + &pattern_res, &gstate_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_operator (surface, op); + if (unlikely (status)) + goto cleanup; + + if (gstate_res.id != 0) { + group = _cairo_pdf_surface_create_smask_group (surface, &extents.bounded); + if (unlikely (group == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + + group->operation = PDF_STROKE; + status = _cairo_pattern_create_copy (&group->source, source); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + group->source_res = pattern_res; + status = _cairo_path_fixed_init_copy (&group->path, path); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + group->style = *style; + group->ctm = *ctm; + group->ctm_inverse = *ctm_inverse; + status = _cairo_pdf_surface_add_smask_group (surface, group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_add_xobject (surface, group->group_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + gstate_res.id, + group->group_res.id); + } else { + status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, TRUE); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_stroke (&surface->pdf_operators, + path, + style, + ctm, + ctm_inverse); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + goto cleanup; + } + + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_int_status_t status; + cairo_pdf_smask_group_t *group; + cairo_pdf_resource_t pattern_res, gstate_res; + cairo_composite_rectangles_t extents; + + status = _cairo_composite_rectangles_init_for_fill (&extents, + &surface->base, + op, source, path, + clip); + if (unlikely (status)) + return status; + + /* use the more accurate extents */ + if (extents.is_bounded) { + cairo_rectangle_int_t mask; + cairo_box_t box; + + _cairo_path_fixed_fill_extents (path, + fill_rule, + tolerance, + &mask); + + _cairo_box_from_rectangle (&box, &mask); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, + &box); + if (unlikely (status)) + goto cleanup; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_pdf_surface_analyze_operation (surface, op, source, &extents.bounded); + goto cleanup; + } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { + status = _cairo_pdf_surface_start_fallback (surface); + if (unlikely (status)) + goto cleanup; + } + + assert (_cairo_pdf_surface_operation_supported (surface, op, source, &extents.bounded)); + + status = _cairo_pdf_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_operator (surface, op); + if (unlikely (status)) + goto cleanup; + + if (_can_paint_pattern (source)) { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, "q\n"); + status = _cairo_pdf_operators_clip (&surface->pdf_operators, + path, + fill_rule); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_paint_pattern (surface, + op, + source, + &extents.bounded, + FALSE); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, "Q\n"); + status = _cairo_output_stream_get_status (surface->output); + goto cleanup; + } + + pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, source, op, + &extents.bounded, + &pattern_res, &gstate_res); + if (unlikely (status)) + goto cleanup; + + if (gstate_res.id != 0) { + group = _cairo_pdf_surface_create_smask_group (surface, &extents.bounded); + if (unlikely (group == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + + group->operation = PDF_FILL; + status = _cairo_pattern_create_copy (&group->source, source); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + group->source_res = pattern_res; + status = _cairo_path_fixed_init_copy (&group->path, path); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + group->fill_rule = fill_rule; + status = _cairo_pdf_surface_add_smask_group (surface, group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_add_xobject (surface, group->group_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + gstate_res.id, + group->group_res.id); + } else { + status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, FALSE); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_fill (&surface->pdf_operators, + path, + fill_rule); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + goto cleanup; + } + + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_pdf_surface_fill_stroke (void *abstract_surface, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + const cairo_path_fixed_t*path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_int_status_t status; + cairo_pdf_resource_t fill_pattern_res, stroke_pattern_res, gstate_res; + cairo_composite_rectangles_t extents; + + /* During analysis we return unsupported and let the _fill and + * _stroke functions that are on the fallback path do the analysis + * for us. During render we may still encounter unsupported + * combinations of fill/stroke patterns. However we can return + * unsupported anytime to let the _fill and _stroke functions take + * over. + */ + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* PDF rendering of fill-stroke is not the same as cairo when + * either the fill or stroke is not opaque. + */ + if ( !_cairo_pattern_is_opaque (fill_source, NULL) || + !_cairo_pattern_is_opaque (stroke_source, NULL)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (fill_op != stroke_op) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Compute the operation extents using the stroke which will naturally + * be larger than the fill extents. + */ + status = _cairo_composite_rectangles_init_for_stroke (&extents, + &surface->base, + stroke_op, stroke_source, + path, stroke_style, stroke_ctm, + clip); + if (unlikely (status)) + return status; + + /* use the more accurate extents */ + if (extents.is_bounded) { + cairo_rectangle_int_t mask; + cairo_box_t box; + + status = _cairo_path_fixed_stroke_extents (path, stroke_style, + stroke_ctm, stroke_ctm_inverse, + stroke_tolerance, + &mask); + if (unlikely (status)) + goto cleanup; + + _cairo_box_from_rectangle (&box, &mask); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, + &box); + if (unlikely (status)) + goto cleanup; + } + + status = _cairo_pdf_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_operator (surface, fill_op); + if (unlikely (status)) + goto cleanup; + + /* use the more accurate extents */ + if (extents.is_bounded) { + cairo_rectangle_int_t mask; + cairo_box_t box; + + _cairo_path_fixed_fill_extents (path, + fill_rule, + fill_tolerance, + &mask); + + _cairo_box_from_rectangle (&box, &mask); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, + &box); + if (unlikely (status)) + goto cleanup; + } + + fill_pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, fill_source, + fill_op, + &extents.bounded, + &fill_pattern_res, + &gstate_res); + if (unlikely (status)) + goto cleanup; + + assert (gstate_res.id == 0); + + stroke_pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, + stroke_source, + stroke_op, + &extents.bounded, + &stroke_pattern_res, + &gstate_res); + if (unlikely (status)) + goto cleanup; + + assert (gstate_res.id == 0); + + /* As PDF has separate graphics state for fill and stroke we can + * select both at the same time */ + status = _cairo_pdf_surface_select_pattern (surface, fill_source, + fill_pattern_res, FALSE); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_pattern (surface, stroke_source, + stroke_pattern_res, TRUE); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_fill_stroke (&surface->pdf_operators, + path, + fill_rule, + stroke_style, + stroke_ctm, + stroke_ctm_inverse); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + goto cleanup; + + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_bool_t +_cairo_pdf_surface_has_show_text_glyphs (void *abstract_surface) +{ + return TRUE; +} + +static cairo_int_status_t +_cairo_pdf_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_pdf_surface_t *surface = abstract_surface; + cairo_pdf_smask_group_t *group; + cairo_pdf_resource_t pattern_res, gstate_res; + cairo_composite_rectangles_t extents; + cairo_bool_t overlap; + cairo_int_status_t status; + + status = _cairo_composite_rectangles_init_for_glyphs (&extents, + &surface->base, + op, source, + scaled_font, + glyphs, num_glyphs, + clip, + &overlap); + if (unlikely (status)) + return status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_pdf_surface_analyze_operation (surface, op, source, &extents.bounded); + goto cleanup; + } + + assert (_cairo_pdf_surface_operation_supported (surface, op, source, &extents.bounded)); + + status = _cairo_pdf_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup; + + pattern_res.id = 0; + gstate_res.id = 0; + status = _cairo_pdf_surface_add_pdf_pattern (surface, source, op, + &extents.bounded, + &pattern_res, &gstate_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_select_operator (surface, op); + if (unlikely (status)) + goto cleanup; + + if (gstate_res.id != 0) { + group = _cairo_pdf_surface_create_smask_group (surface, &extents.bounded); + if (unlikely (group == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + + group->operation = PDF_SHOW_GLYPHS; + status = _cairo_pattern_create_copy (&group->source, source); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + group->source_res = pattern_res; + + if (utf8_len) { + group->utf8 = malloc (utf8_len); + if (unlikely (group->utf8 == NULL)) { + _cairo_pdf_smask_group_destroy (group); + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + memcpy (group->utf8, utf8, utf8_len); + } + group->utf8_len = utf8_len; + + if (num_glyphs) { + group->glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unlikely (group->glyphs == NULL)) { + _cairo_pdf_smask_group_destroy (group); + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + memcpy (group->glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); + } + group->num_glyphs = num_glyphs; + + if (num_clusters) { + group->clusters = _cairo_malloc_ab (num_clusters, sizeof (cairo_text_cluster_t)); + if (unlikely (group->clusters == NULL)) { + _cairo_pdf_smask_group_destroy (group); + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto cleanup; + } + memcpy (group->clusters, clusters, sizeof (cairo_text_cluster_t) * num_clusters); + } + group->num_clusters = num_clusters; + + group->scaled_font = cairo_scaled_font_reference (scaled_font); + status = _cairo_pdf_surface_add_smask_group (surface, group); + if (unlikely (status)) { + _cairo_pdf_smask_group_destroy (group); + goto cleanup; + } + + status = _cairo_pdf_surface_add_smask (surface, gstate_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_add_xobject (surface, group->group_res); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + + _cairo_output_stream_printf (surface->output, + "q /s%d gs /x%d Do Q\n", + gstate_res.id, + group->group_res.id); + } else { + status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, FALSE); + if (unlikely (status)) + goto cleanup; + + /* Each call to show_glyphs() with a transclucent pattern must + * be in a separate text object otherwise overlapping text + * from separate calls to show_glyphs will not composite with + * each other. */ + if (! _cairo_pattern_is_opaque (source, &extents.bounded)) { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup; + } + + status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_surface_unselect_pattern (surface); + if (unlikely (status)) + goto cleanup; + } + + _cairo_composite_rectangles_fini (&extents); + return _cairo_output_stream_get_status (surface->output); + +cleanup: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static const char ** +_cairo_pdf_surface_get_supported_mime_types (void *abstract_surface) +{ + return _cairo_pdf_supported_mime_types; +} + +static void +_cairo_pdf_surface_set_paginated_mode (void *abstract_surface, + cairo_paginated_mode_t paginated_mode) +{ + cairo_pdf_surface_t *surface = abstract_surface; + + surface->paginated_mode = paginated_mode; +} + +static const cairo_surface_backend_t cairo_pdf_surface_backend = { + CAIRO_SURFACE_TYPE_PDF, + _cairo_pdf_surface_finish, + + _cairo_default_context_create, + + NULL, /* create similar: handled by wrapper */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* _cairo_pdf_surface_copy_page */ + _cairo_pdf_surface_show_page, + + _cairo_pdf_surface_get_extents, + _cairo_pdf_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + /* Here are the drawing functions */ + _cairo_pdf_surface_paint, + _cairo_pdf_surface_mask, + _cairo_pdf_surface_stroke, + _cairo_pdf_surface_fill, + _cairo_pdf_surface_fill_stroke, + NULL, /* show_glyphs */ + _cairo_pdf_surface_has_show_text_glyphs, + _cairo_pdf_surface_show_text_glyphs, + _cairo_pdf_surface_get_supported_mime_types, +}; + +static const cairo_paginated_surface_backend_t +cairo_pdf_surface_paginated_backend = { + _cairo_pdf_surface_start_page, + _cairo_pdf_surface_set_paginated_mode, + NULL, /* set_bounding_box */ + _cairo_pdf_surface_has_fallback_images, + _cairo_pdf_surface_supports_fine_grained_fallbacks, +}; diff --git a/src/cairo-pdf.h b/src/cairo-pdf.h new file mode 100644 index 000000000..1bc8524f2 --- /dev/null +++ b/src/cairo-pdf.h @@ -0,0 +1,94 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PDF_H +#define CAIRO_PDF_H + +#include "cairo.h" + +#if CAIRO_HAS_PDF_SURFACE + +CAIRO_BEGIN_DECLS + +/** + * cairo_pdf_version_t: + * @CAIRO_PDF_VERSION_1_4: The version 1.4 of the PDF specification. (Since 1.10) + * @CAIRO_PDF_VERSION_1_5: The version 1.5 of the PDF specification. (Since 1.10) + * + * #cairo_pdf_version_t is used to describe the version number of the PDF + * specification that a generated PDF file will conform to. + * + * Since: 1.10 + **/ +typedef enum _cairo_pdf_version { + CAIRO_PDF_VERSION_1_4, + CAIRO_PDF_VERSION_1_5 +} cairo_pdf_version_t; + +cairo_public cairo_surface_t * +cairo_pdf_surface_create (const char *filename, + double width_in_points, + double height_in_points); + +cairo_public cairo_surface_t * +cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); + +cairo_public void +cairo_pdf_surface_restrict_to_version (cairo_surface_t *surface, + cairo_pdf_version_t version); + +cairo_public void +cairo_pdf_get_versions (cairo_pdf_version_t const **versions, + int *num_versions); + +cairo_public const char * +cairo_pdf_version_to_string (cairo_pdf_version_t version); + +cairo_public void +cairo_pdf_surface_set_size (cairo_surface_t *surface, + double width_in_points, + double height_in_points); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_PDF_SURFACE */ +# error Cairo was not compiled with support for the pdf backend +#endif /* CAIRO_HAS_PDF_SURFACE */ + +#endif /* CAIRO_PDF_H */ diff --git a/src/cairo-pen.c b/src/cairo-pen.c new file mode 100644 index 000000000..61be0e829 --- /dev/null +++ b/src/cairo-pen.c @@ -0,0 +1,475 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-slope-private.h" + +static void +_cairo_pen_compute_slopes (cairo_pen_t *pen); + +cairo_status_t +_cairo_pen_init (cairo_pen_t *pen, + double radius, + double tolerance, + const cairo_matrix_t *ctm) +{ + int i; + int reflect; + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + VG (VALGRIND_MAKE_MEM_UNDEFINED (pen, sizeof (cairo_pen_t))); + + pen->radius = radius; + pen->tolerance = tolerance; + + reflect = _cairo_matrix_compute_determinant (ctm) < 0.; + + pen->num_vertices = _cairo_pen_vertices_needed (tolerance, + radius, + ctm); + + if (pen->num_vertices > ARRAY_LENGTH (pen->vertices_embedded)) { + pen->vertices = _cairo_malloc_ab (pen->num_vertices, + sizeof (cairo_pen_vertex_t)); + if (unlikely (pen->vertices == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else { + pen->vertices = pen->vertices_embedded; + } + + /* + * Compute pen coordinates. To generate the right ellipse, compute points around + * a circle in user space and transform them to device space. To get a consistent + * orientation in device space, flip the pen if the transformation matrix + * is reflecting + */ + for (i=0; i < pen->num_vertices; i++) { + cairo_pen_vertex_t *v = &pen->vertices[i]; + double theta = 2 * M_PI * i / (double) pen->num_vertices, dx, dy; + if (reflect) + theta = -theta; + dx = radius * cos (theta); + dy = radius * sin (theta); + cairo_matrix_transform_distance (ctm, &dx, &dy); + v->point.x = _cairo_fixed_from_double (dx); + v->point.y = _cairo_fixed_from_double (dy); + } + + _cairo_pen_compute_slopes (pen); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_pen_fini (cairo_pen_t *pen) +{ + if (pen->vertices != pen->vertices_embedded) + free (pen->vertices); + + + VG (VALGRIND_MAKE_MEM_NOACCESS (pen, sizeof (cairo_pen_t))); +} + +cairo_status_t +_cairo_pen_init_copy (cairo_pen_t *pen, const cairo_pen_t *other) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (pen, sizeof (cairo_pen_t))); + + *pen = *other; + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pen->vertices = pen->vertices_embedded; + if (pen->num_vertices) { + if (pen->num_vertices > ARRAY_LENGTH (pen->vertices_embedded)) { + pen->vertices = _cairo_malloc_ab (pen->num_vertices, + sizeof (cairo_pen_vertex_t)); + if (unlikely (pen->vertices == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + memcpy (pen->vertices, other->vertices, + pen->num_vertices * sizeof (cairo_pen_vertex_t)); + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *point, int num_points) +{ + cairo_status_t status; + int num_vertices; + int i; + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + num_vertices = pen->num_vertices + num_points; + if (num_vertices > ARRAY_LENGTH (pen->vertices_embedded) || + pen->vertices != pen->vertices_embedded) + { + cairo_pen_vertex_t *vertices; + + if (pen->vertices == pen->vertices_embedded) { + vertices = _cairo_malloc_ab (num_vertices, + sizeof (cairo_pen_vertex_t)); + if (unlikely (vertices == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (vertices, pen->vertices, + pen->num_vertices * sizeof (cairo_pen_vertex_t)); + } else { + vertices = _cairo_realloc_ab (pen->vertices, + num_vertices, + sizeof (cairo_pen_vertex_t)); + if (unlikely (vertices == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pen->vertices = vertices; + } + + pen->num_vertices = num_vertices; + + /* initialize new vertices */ + for (i=0; i < num_points; i++) + pen->vertices[pen->num_vertices-num_points+i].point = point[i]; + + status = _cairo_hull_compute (pen->vertices, &pen->num_vertices); + if (unlikely (status)) + return status; + + _cairo_pen_compute_slopes (pen); + + return CAIRO_STATUS_SUCCESS; +} + +/* +The circular pen in user space is transformed into an ellipse in +device space. + +We construct the pen by computing points along the circumference +using equally spaced angles. + +We show that this approximation to the ellipse has maximum error at the +major axis of the ellipse. + +Set + + M = major axis length + m = minor axis length + +Align 'M' along the X axis and 'm' along the Y axis and draw +an ellipse parameterized by angle 't': + + x = M cos t y = m sin t + +Perturb t by ± d and compute two new points (x+,y+), (x-,y-). +The distance from the average of these two points to (x,y) represents +the maximum error in approximating the ellipse with a polygon formed +from vertices 2∆ radians apart. + + x+ = M cos (t+∆) y+ = m sin (t+∆) + x- = M cos (t-∆) y- = m sin (t-∆) + +Now compute the approximation error, E: + + Ex = (x - (x+ + x-) / 2) + Ex = (M cos(t) - (Mcos(t+∆) + Mcos(t-∆))/2) + = M (cos(t) - (cos(t)cos(∆) + sin(t)sin(∆) + + cos(t)cos(∆) - sin(t)sin(∆))/2) + = M(cos(t) - cos(t)cos(∆)) + = M cos(t) (1 - cos(∆)) + + Ey = y - (y+ - y-) / 2 + = m sin (t) - (m sin(t+∆) + m sin(t-∆)) / 2 + = m (sin(t) - (sin(t)cos(∆) + cos(t)sin(∆) + + sin(t)cos(∆) - cos(t)sin(∆))/2) + = m (sin(t) - sin(t)cos(∆)) + = m sin(t) (1 - cos(∆)) + + E² = Ex² + Ey² + = (M cos(t) (1 - cos (∆)))² + (m sin(t) (1-cos(∆)))² + = (1 - cos(∆))² (M² cos²(t) + m² sin²(t)) + = (1 - cos(∆))² ((m² + M² - m²) cos² (t) + m² sin²(t)) + = (1 - cos(∆))² (M² - m²) cos² (t) + (1 - cos(∆))² m² + +Find the extremum by differentiation wrt t and setting that to zero + +∂(E²)/∂(t) = (1-cos(∆))² (M² - m²) (-2 cos(t) sin(t)) + + 0 = 2 cos (t) sin (t) + 0 = sin (2t) + t = nÏ€ + +Which is to say that the maximum and minimum errors occur on the +axes of the ellipse at 0 and Ï€ radians: + + E²(0) = (1-cos(∆))² (M² - m²) + (1-cos(∆))² m² + = (1-cos(∆))² M² + E²(Ï€) = (1-cos(∆))² m² + +maximum error = M (1-cos(∆)) +minimum error = m (1-cos(∆)) + +We must make maximum error ≤ tolerance, so compute the ∆ needed: + + tolerance = M (1-cos(∆)) + tolerance / M = 1 - cos (∆) + cos(∆) = 1 - tolerance/M + ∆ = acos (1 - tolerance / M); + +Remembering that ∆ is half of our angle between vertices, +the number of vertices is then + + vertices = ceil(2Ï€/2∆). + = ceil(Ï€/∆). + +Note that this also equation works for M == m (a circle) as it +doesn't matter where on the circle the error is computed. +*/ + +int +_cairo_pen_vertices_needed (double tolerance, + double radius, + const cairo_matrix_t *matrix) +{ + /* + * the pen is a circle that gets transformed to an ellipse by matrix. + * compute major axis length for a pen with the specified radius. + * we don't need the minor axis length. + */ + double major_axis = _cairo_matrix_transformed_circle_major_axis (matrix, + radius); + int num_vertices; + + if (tolerance >= 4*major_axis) { /* XXX relaxed from 2*major for inkscape */ + num_vertices = 1; + } else if (tolerance >= major_axis) { + num_vertices = 4; + } else { + num_vertices = ceil (2*M_PI / acos (1 - tolerance / major_axis)); + + /* number of vertices must be even */ + if (num_vertices % 2) + num_vertices++; + + /* And we must always have at least 4 vertices. */ + if (num_vertices < 4) + num_vertices = 4; + } + + return num_vertices; +} + +static void +_cairo_pen_compute_slopes (cairo_pen_t *pen) +{ + int i, i_prev; + cairo_pen_vertex_t *prev, *v, *next; + + for (i=0, i_prev = pen->num_vertices - 1; + i < pen->num_vertices; + i_prev = i++) { + prev = &pen->vertices[i_prev]; + v = &pen->vertices[i]; + next = &pen->vertices[(i + 1) % pen->num_vertices]; + + _cairo_slope_init (&v->slope_cw, &prev->point, &v->point); + _cairo_slope_init (&v->slope_ccw, &v->point, &next->point); + } +} +/* + * Find active pen vertex for clockwise edge of stroke at the given slope. + * + * The strictness of the inequalities here is delicate. The issue is + * that the slope_ccw member of one pen vertex will be equivalent to + * the slope_cw member of the next pen vertex in a counterclockwise + * order. However, for this function, we care strongly about which + * vertex is returned. + * + * [I think the "care strongly" above has to do with ensuring that the + * pen's "extra points" from the spline's initial and final slopes are + * properly found when beginning the spline stroking.] + */ +int +_cairo_pen_find_active_cw_vertex_index (const cairo_pen_t *pen, + const cairo_slope_t *slope) +{ + int i; + + for (i=0; i < pen->num_vertices; i++) { + if ((_cairo_slope_compare (slope, &pen->vertices[i].slope_ccw) < 0) && + (_cairo_slope_compare (slope, &pen->vertices[i].slope_cw) >= 0)) + break; + } + + /* If the desired slope cannot be found between any of the pen + * vertices, then we must have a degenerate pen, (such as a pen + * that's been transformed to a line). In that case, we consider + * the first pen vertex as the appropriate clockwise vertex. + */ + if (i == pen->num_vertices) + i = 0; + + return i; +} + +/* Find active pen vertex for counterclockwise edge of stroke at the given slope. + * + * Note: See the comments for _cairo_pen_find_active_cw_vertex_index + * for some details about the strictness of the inequalities here. + */ +int +_cairo_pen_find_active_ccw_vertex_index (const cairo_pen_t *pen, + const cairo_slope_t *slope) +{ + cairo_slope_t slope_reverse; + int i; + + slope_reverse = *slope; + slope_reverse.dx = -slope_reverse.dx; + slope_reverse.dy = -slope_reverse.dy; + + for (i=pen->num_vertices-1; i >= 0; i--) { + if ((_cairo_slope_compare (&pen->vertices[i].slope_ccw, &slope_reverse) >= 0) && + (_cairo_slope_compare (&pen->vertices[i].slope_cw, &slope_reverse) < 0)) + break; + } + + /* If the desired slope cannot be found between any of the pen + * vertices, then we must have a degenerate pen, (such as a pen + * that's been transformed to a line). In that case, we consider + * the last pen vertex as the appropriate counterclockwise vertex. + */ + if (i < 0) + i = pen->num_vertices - 1; + + return i; +} + +void +_cairo_pen_find_active_cw_vertices (const cairo_pen_t *pen, + const cairo_slope_t *in, + const cairo_slope_t *out, + int *start, int *stop) +{ + + int lo = 0, hi = pen->num_vertices; + int i; + + i = (lo + hi) >> 1; + do { + if (_cairo_slope_compare (&pen->vertices[i].slope_cw, in) < 0) + lo = i; + else + hi = i; + i = (lo + hi) >> 1; + } while (hi - lo > 1); + if (_cairo_slope_compare (&pen->vertices[i].slope_cw, in) < 0) + if (++i == pen->num_vertices) + i = 0; + *start = i; + + if (_cairo_slope_compare (out, &pen->vertices[i].slope_ccw) >= 0) { + lo = i; + hi = i + pen->num_vertices; + i = (lo + hi) >> 1; + do { + int j = i; + if (j >= pen->num_vertices) + j -= pen->num_vertices; + if (_cairo_slope_compare (&pen->vertices[j].slope_cw, out) > 0) + hi = i; + else + lo = i; + i = (lo + hi) >> 1; + } while (hi - lo > 1); + if (i >= pen->num_vertices) + i -= pen->num_vertices; + } + *stop = i; +} + +void +_cairo_pen_find_active_ccw_vertices (const cairo_pen_t *pen, + const cairo_slope_t *in, + const cairo_slope_t *out, + int *start, int *stop) +{ + int lo = 0, hi = pen->num_vertices; + int i; + + i = (lo + hi) >> 1; + do { + if (_cairo_slope_compare (in, &pen->vertices[i].slope_ccw) < 0) + lo = i; + else + hi = i; + i = (lo + hi) >> 1; + } while (hi - lo > 1); + if (_cairo_slope_compare (in, &pen->vertices[i].slope_ccw) < 0) + if (++i == pen->num_vertices) + i = 0; + *start = i; + + if (_cairo_slope_compare (&pen->vertices[i].slope_cw, out) <= 0) { + lo = i; + hi = i + pen->num_vertices; + i = (lo + hi) >> 1; + do { + int j = i; + if (j >= pen->num_vertices) + j -= pen->num_vertices; + if (_cairo_slope_compare (out, &pen->vertices[j].slope_ccw) > 0) + hi = i; + else + lo = i; + i = (lo + hi) >> 1; + } while (hi - lo > 1); + if (i >= pen->num_vertices) + i -= pen->num_vertices; + } + *stop = i; +} diff --git a/src/cairo-pixman-private.h b/src/cairo-pixman-private.h new file mode 100644 index 000000000..d705025c8 --- /dev/null +++ b/src/cairo-pixman-private.h @@ -0,0 +1,51 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright ©2013 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_PIXMAN_PRIVATE_H +#define CAIRO_PIXMAN_PRIVATE_H + +#include "cairo-pixman-private.h" /* keep make check happy */ + +#include + +#if PIXMAN_VERSION < PIXMAN_VERSION_ENCODE(0,22,0) +#define pixman_image_composite32 pixman_image_composite +#define pixman_image_get_component_alpha(i) 0 +#define pixman_image_set_component_alpha(i, x) do { } while (0) +#endif + +#endif diff --git a/src/cairo-png.c b/src/cairo-png.c new file mode 100644 index 000000000..068617d58 --- /dev/null +++ b/src/cairo-png.c @@ -0,0 +1,819 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-output-stream-private.h" + +#include +#include +#include + +/** + * SECTION:cairo-png + * @Title: PNG Support + * @Short_Description: Reading and writing PNG images + * @See_Also: #cairo_surface_t + * + * The PNG functions allow reading PNG images into image surfaces, and writing + * any surface to a PNG file. + * + * It is a toy API. It only offers very simple support for reading and + * writing PNG files, which is sufficient for testing and + * demonstration purposes. Applications which need more control over + * the generated PNG file should access the pixel data directly, using + * cairo_image_surface_get_data() or a backend-specific access + * function, and process it with another library, e.g. gdk-pixbuf or + * libpng. + **/ + +/** + * CAIRO_HAS_PNG_FUNCTIONS: + * + * Defined if the PNG functions are available. + * This macro can be used to conditionally compile code using the cairo + * PNG functions. + * + * Since: 1.0 + **/ + +struct png_read_closure_t { + cairo_read_func_t read_func; + void *closure; + cairo_output_stream_t *png_data; +}; + + +/* Unpremultiplies data and converts native endian ARGB => RGBA bytes */ +static void +unpremultiply_data (png_structp png, png_row_infop row_info, png_bytep data) +{ + unsigned int i; + + for (i = 0; i < row_info->rowbytes; i += 4) { + uint8_t *b = &data[i]; + uint32_t pixel; + uint8_t alpha; + + memcpy (&pixel, b, sizeof (uint32_t)); + alpha = (pixel & 0xff000000) >> 24; + if (alpha == 0) { + b[0] = b[1] = b[2] = b[3] = 0; + } else { + b[0] = (((pixel & 0xff0000) >> 16) * 255 + alpha / 2) / alpha; + b[1] = (((pixel & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha; + b[2] = (((pixel & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha; + b[3] = alpha; + } + } +} + +/* Converts native endian xRGB => RGBx bytes */ +static void +convert_data_to_bytes (png_structp png, png_row_infop row_info, png_bytep data) +{ + unsigned int i; + + for (i = 0; i < row_info->rowbytes; i += 4) { + uint8_t *b = &data[i]; + uint32_t pixel; + + memcpy (&pixel, b, sizeof (uint32_t)); + + b[0] = (pixel & 0xff0000) >> 16; + b[1] = (pixel & 0x00ff00) >> 8; + b[2] = (pixel & 0x0000ff) >> 0; + b[3] = 0; + } +} + +/* Use a couple of simple error callbacks that do not print anything to + * stderr and rely on the user to check for errors via the #cairo_status_t + * return. + */ +static void +png_simple_error_callback (png_structp png, + png_const_charp error_msg) +{ + cairo_status_t *error = png_get_error_ptr (png); + + /* default to the most likely error */ + if (*error == CAIRO_STATUS_SUCCESS) + *error = _cairo_error (CAIRO_STATUS_NO_MEMORY); + +#ifdef PNG_SETJMP_SUPPORTED + longjmp (png_jmpbuf (png), 1); +#endif + + /* if we get here, then we have to choice but to abort ... */ +} + +static void +png_simple_warning_callback (png_structp png, + png_const_charp error_msg) +{ + /* png does not expect to abort and will try to tidy up and continue + * loading the image after a warning. So we also want to return the + * (incorrect?) surface. + * + * We use our own warning callback to squelch any attempts by libpng + * to write to stderr as we may not be in control of that output. + */ +} + + +/* Starting with libpng-1.2.30, we must explicitly specify an output_flush_fn. + * Otherwise, we will segfault if we are writing to a stream. */ +static void +png_simple_output_flush_fn (png_structp png_ptr) +{ +} + +static cairo_status_t +write_png (cairo_surface_t *surface, + png_rw_ptr write_func, + void *closure) +{ + int i; + cairo_int_status_t status; + cairo_image_surface_t *image; + cairo_image_surface_t * volatile clone; + void *image_extra; + png_struct *png; + png_info *info; + png_byte **volatile rows = NULL; + png_color_16 white; + int png_color_type; + int bpc; + + status = _cairo_surface_acquire_source_image (surface, + &image, + &image_extra); + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + else if (unlikely (status)) + return status; + + /* PNG complains about "Image width or height is zero in IHDR" */ + if (image->width == 0 || image->height == 0) { + status = _cairo_error (CAIRO_STATUS_WRITE_ERROR); + goto BAIL1; + } + + /* Handle the various fallback formats (e.g. low bit-depth XServers) + * by coercing them to a simpler format using pixman. + */ + clone = _cairo_image_surface_coerce (image); + status = clone->base.status; + if (unlikely (status)) + goto BAIL1; + + rows = _cairo_malloc_ab (clone->height, sizeof (png_byte*)); + if (unlikely (rows == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL2; + } + + for (i = 0; i < clone->height; i++) + rows[i] = (png_byte *) clone->data + i * clone->stride; + + png = png_create_write_struct (PNG_LIBPNG_VER_STRING, &status, + png_simple_error_callback, + png_simple_warning_callback); + if (unlikely (png == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL3; + } + + info = png_create_info_struct (png); + if (unlikely (info == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL4; + } + +#ifdef PNG_SETJMP_SUPPORTED + if (setjmp (png_jmpbuf (png))) + goto BAIL4; +#endif + + png_set_write_fn (png, closure, write_func, png_simple_output_flush_fn); + + switch (clone->format) { + case CAIRO_FORMAT_ARGB32: + bpc = 8; + if (_cairo_image_analyze_transparency (clone) == CAIRO_IMAGE_IS_OPAQUE) + png_color_type = PNG_COLOR_TYPE_RGB; + else + png_color_type = PNG_COLOR_TYPE_RGB_ALPHA; + break; + case CAIRO_FORMAT_RGB30: + bpc = 10; + png_color_type = PNG_COLOR_TYPE_RGB; + break; + case CAIRO_FORMAT_RGB24: + bpc = 8; + png_color_type = PNG_COLOR_TYPE_RGB; + break; + case CAIRO_FORMAT_A8: + bpc = 8; + png_color_type = PNG_COLOR_TYPE_GRAY; + break; + case CAIRO_FORMAT_A1: + bpc = 1; + png_color_type = PNG_COLOR_TYPE_GRAY; +#ifndef WORDS_BIGENDIAN + png_set_packswap (png); +#endif + break; + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_RGB16_565: + default: + status = _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + goto BAIL4; + } + + png_set_IHDR (png, info, + clone->width, + clone->height, bpc, + png_color_type, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + + white.gray = (1 << bpc) - 1; + white.red = white.blue = white.green = white.gray; + png_set_bKGD (png, info, &white); + + if (0) { /* XXX extract meta-data from surface (i.e. creation date) */ + png_time pt; + + png_convert_from_time_t (&pt, time (NULL)); + png_set_tIME (png, info, &pt); + } + + /* We have to call png_write_info() before setting up the write + * transformation, since it stores data internally in 'png' + * that is needed for the write transformation functions to work. + */ + png_write_info (png, info); + + if (png_color_type == PNG_COLOR_TYPE_RGB_ALPHA) { + png_set_write_user_transform_fn (png, unpremultiply_data); + } else if (png_color_type == PNG_COLOR_TYPE_RGB) { + png_set_write_user_transform_fn (png, convert_data_to_bytes); + png_set_filler (png, 0, PNG_FILLER_AFTER); + } + + png_write_image (png, rows); + png_write_end (png, info); + +BAIL4: + png_destroy_write_struct (&png, &info); +BAIL3: + free (rows); +BAIL2: + cairo_surface_destroy (&clone->base); +BAIL1: + _cairo_surface_release_source_image (surface, image, image_extra); + + return status; +} + +static void +stdio_write_func (png_structp png, png_bytep data, png_size_t size) +{ + FILE *fp; + + fp = png_get_io_ptr (png); + while (size) { + size_t ret = fwrite (data, 1, size, fp); + size -= ret; + data += ret; + if (size && ferror (fp)) { + cairo_status_t *error = png_get_error_ptr (png); + if (*error == CAIRO_STATUS_SUCCESS) + *error = _cairo_error (CAIRO_STATUS_WRITE_ERROR); + png_error (png, NULL); + } + } +} + +/** + * cairo_surface_write_to_png: + * @surface: a #cairo_surface_t with pixel contents + * @filename: the name of a file to write to + * + * Writes the contents of @surface to a new file @filename as a PNG + * image. + * + * Return value: %CAIRO_STATUS_SUCCESS if the PNG file was written + * successfully. Otherwise, %CAIRO_STATUS_NO_MEMORY if memory could not + * be allocated for the operation or + * %CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have + * pixel contents, or %CAIRO_STATUS_WRITE_ERROR if an I/O error occurs + * while attempting to write the file. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_surface_write_to_png (cairo_surface_t *surface, + const char *filename) +{ + FILE *fp; + cairo_status_t status; + + if (surface->status) + return surface->status; + + if (surface->finished) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + fp = fopen (filename, "wb"); + if (fp == NULL) { + switch (errno) { + case ENOMEM: + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + default: + return _cairo_error (CAIRO_STATUS_WRITE_ERROR); + } + } + + status = write_png (surface, stdio_write_func, fp); + + if (fclose (fp) && status == CAIRO_STATUS_SUCCESS) + status = _cairo_error (CAIRO_STATUS_WRITE_ERROR); + + return status; +} + +struct png_write_closure_t { + cairo_write_func_t write_func; + void *closure; +}; + +static void +stream_write_func (png_structp png, png_bytep data, png_size_t size) +{ + cairo_status_t status; + struct png_write_closure_t *png_closure; + + png_closure = png_get_io_ptr (png); + status = png_closure->write_func (png_closure->closure, data, size); + if (unlikely (status)) { + cairo_status_t *error = png_get_error_ptr (png); + if (*error == CAIRO_STATUS_SUCCESS) + *error = status; + png_error (png, NULL); + } +} + +/** + * cairo_surface_write_to_png_stream: + * @surface: a #cairo_surface_t with pixel contents + * @write_func: a #cairo_write_func_t + * @closure: closure data for the write function + * + * Writes the image surface to the write function. + * + * Return value: %CAIRO_STATUS_SUCCESS if the PNG file was written + * successfully. Otherwise, %CAIRO_STATUS_NO_MEMORY is returned if + * memory could not be allocated for the operation, + * %CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have + * pixel contents. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_surface_write_to_png_stream (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure) +{ + struct png_write_closure_t png_closure; + + if (surface->status) + return surface->status; + + if (surface->finished) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + png_closure.write_func = write_func; + png_closure.closure = closure; + + return write_png (surface, stream_write_func, &png_closure); +} +slim_hidden_def (cairo_surface_write_to_png_stream); + +static inline int +multiply_alpha (int alpha, int color) +{ + int temp = (alpha * color) + 0x80; + return ((temp + (temp >> 8)) >> 8); +} + +/* Premultiplies data and converts RGBA bytes => native endian */ +static void +premultiply_data (png_structp png, + png_row_infop row_info, + png_bytep data) +{ + unsigned int i; + + for (i = 0; i < row_info->rowbytes; i += 4) { + uint8_t *base = &data[i]; + uint8_t alpha = base[3]; + uint32_t p; + + if (alpha == 0) { + p = 0; + } else { + uint8_t red = base[0]; + uint8_t green = base[1]; + uint8_t blue = base[2]; + + if (alpha != 0xff) { + red = multiply_alpha (alpha, red); + green = multiply_alpha (alpha, green); + blue = multiply_alpha (alpha, blue); + } + p = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); + } + memcpy (base, &p, sizeof (uint32_t)); + } +} + +/* Converts RGBx bytes to native endian xRGB */ +static void +convert_bytes_to_data (png_structp png, png_row_infop row_info, png_bytep data) +{ + unsigned int i; + + for (i = 0; i < row_info->rowbytes; i += 4) { + uint8_t *base = &data[i]; + uint8_t red = base[0]; + uint8_t green = base[1]; + uint8_t blue = base[2]; + uint32_t pixel; + + pixel = (0xff << 24) | (red << 16) | (green << 8) | (blue << 0); + memcpy (base, &pixel, sizeof (uint32_t)); + } +} + +static cairo_status_t +stdio_read_func (void *closure, unsigned char *data, unsigned int size) +{ + FILE *file = closure; + + while (size) { + size_t ret; + + ret = fread (data, 1, size, file); + size -= ret; + data += ret; + + if (size && (feof (file) || ferror (file))) + return _cairo_error (CAIRO_STATUS_READ_ERROR); + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +stream_read_func (png_structp png, png_bytep data, png_size_t size) +{ + cairo_status_t status; + struct png_read_closure_t *png_closure; + + png_closure = png_get_io_ptr (png); + status = png_closure->read_func (png_closure->closure, data, size); + if (unlikely (status)) { + cairo_status_t *error = png_get_error_ptr (png); + if (*error == CAIRO_STATUS_SUCCESS) + *error = status; + png_error (png, NULL); + } + + _cairo_output_stream_write (png_closure->png_data, data, size); +} + +static cairo_surface_t * +read_png (struct png_read_closure_t *png_closure) +{ + cairo_surface_t *surface; + png_struct *png = NULL; + png_info *info; + png_byte *data = NULL; + png_byte **row_pointers = NULL; + png_uint_32 png_width, png_height; + int depth, color_type, interlace, stride; + unsigned int i; + cairo_format_t format; + cairo_status_t status; + unsigned char *mime_data; + unsigned long mime_data_length; + + png_closure->png_data = _cairo_memory_stream_create (); + + /* XXX: Perhaps we'll want some other error handlers? */ + png = png_create_read_struct (PNG_LIBPNG_VER_STRING, + &status, + png_simple_error_callback, + png_simple_warning_callback); + if (unlikely (png == NULL)) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + goto BAIL; + } + + info = png_create_info_struct (png); + if (unlikely (info == NULL)) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + goto BAIL; + } + + png_set_read_fn (png, png_closure, stream_read_func); + + status = CAIRO_STATUS_SUCCESS; +#ifdef PNG_SETJMP_SUPPORTED + if (setjmp (png_jmpbuf (png))) { + surface = _cairo_surface_create_in_error (status); + goto BAIL; + } +#endif + + png_read_info (png, info); + + png_get_IHDR (png, info, + &png_width, &png_height, &depth, + &color_type, &interlace, NULL, NULL); + if (unlikely (status)) { /* catch any early warnings */ + surface = _cairo_surface_create_in_error (status); + goto BAIL; + } + + /* convert palette/gray image to rgb */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb (png); + + /* expand gray bit depth if needed */ + if (color_type == PNG_COLOR_TYPE_GRAY) { +#if PNG_LIBPNG_VER >= 10209 + png_set_expand_gray_1_2_4_to_8 (png); +#else + png_set_gray_1_2_4_to_8 (png); +#endif + } + + /* transform transparency to alpha */ + if (png_get_valid (png, info, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha (png); + + if (depth == 16) + png_set_strip_16 (png); + + if (depth < 8) + png_set_packing (png); + + /* convert grayscale to RGB */ + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + png_set_gray_to_rgb (png); + } + + if (interlace != PNG_INTERLACE_NONE) + png_set_interlace_handling (png); + + png_set_filler (png, 0xff, PNG_FILLER_AFTER); + + /* recheck header after setting EXPAND options */ + png_read_update_info (png, info); + png_get_IHDR (png, info, + &png_width, &png_height, &depth, + &color_type, &interlace, NULL, NULL); + if (depth != 8 || + ! (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA)) + { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_READ_ERROR)); + goto BAIL; + } + + switch (color_type) { + default: + ASSERT_NOT_REACHED; + /* fall-through just in case ;-) */ + + case PNG_COLOR_TYPE_RGB_ALPHA: + format = CAIRO_FORMAT_ARGB32; + png_set_read_user_transform_fn (png, premultiply_data); + break; + + case PNG_COLOR_TYPE_RGB: + format = CAIRO_FORMAT_RGB24; + png_set_read_user_transform_fn (png, convert_bytes_to_data); + break; + } + + stride = cairo_format_stride_for_width (format, png_width); + if (stride < 0) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + goto BAIL; + } + + data = _cairo_malloc_ab (png_height, stride); + if (unlikely (data == NULL)) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + goto BAIL; + } + + row_pointers = _cairo_malloc_ab (png_height, sizeof (char *)); + if (unlikely (row_pointers == NULL)) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + goto BAIL; + } + + for (i = 0; i < png_height; i++) + row_pointers[i] = &data[i * stride]; + + png_read_image (png, row_pointers); + png_read_end (png, info); + + if (unlikely (status)) { /* catch any late warnings - probably hit an error already */ + surface = _cairo_surface_create_in_error (status); + goto BAIL; + } + + surface = cairo_image_surface_create_for_data (data, format, + png_width, png_height, + stride); + if (surface->status) + goto BAIL; + + _cairo_image_surface_assume_ownership_of_data ((cairo_image_surface_t*)surface); + data = NULL; + + _cairo_debug_check_image_surface_is_defined (surface); + + status = _cairo_memory_stream_destroy (png_closure->png_data, + &mime_data, + &mime_data_length); + png_closure->png_data = NULL; + if (unlikely (status)) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + goto BAIL; + } + + status = cairo_surface_set_mime_data (surface, + CAIRO_MIME_TYPE_PNG, + mime_data, + mime_data_length, + free, + mime_data); + if (unlikely (status)) { + free (mime_data); + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + goto BAIL; + } + + BAIL: + free (row_pointers); + free (data); + if (png != NULL) + png_destroy_read_struct (&png, &info, NULL); + if (png_closure->png_data != NULL) { + cairo_status_t status_ignored; + + status_ignored = _cairo_output_stream_destroy (png_closure->png_data); + } + + return surface; +} + +/** + * cairo_image_surface_create_from_png: + * @filename: name of PNG file to load + * + * Creates a new image surface and initializes the contents to the + * given PNG file. + * + * Return value: a new #cairo_surface_t initialized with the contents + * of the PNG file, or a "nil" surface if any error occurred. A nil + * surface can be checked for with cairo_surface_status(surface) which + * may return one of the following values: + * + * %CAIRO_STATUS_NO_MEMORY + * %CAIRO_STATUS_FILE_NOT_FOUND + * %CAIRO_STATUS_READ_ERROR + * + * Alternatively, you can allow errors to propagate through the drawing + * operations and check the status on the context upon completion + * using cairo_status(). + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_image_surface_create_from_png (const char *filename) +{ + struct png_read_closure_t png_closure; + cairo_surface_t *surface; + + png_closure.closure = fopen (filename, "rb"); + if (png_closure.closure == NULL) { + cairo_status_t status; + switch (errno) { + case ENOMEM: + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + break; + case ENOENT: + status = _cairo_error (CAIRO_STATUS_FILE_NOT_FOUND); + break; + default: + status = _cairo_error (CAIRO_STATUS_READ_ERROR); + break; + } + return _cairo_surface_create_in_error (status); + } + + png_closure.read_func = stdio_read_func; + + surface = read_png (&png_closure); + + fclose (png_closure.closure); + + return surface; +} + +/** + * cairo_image_surface_create_from_png_stream: + * @read_func: function called to read the data of the file + * @closure: data to pass to @read_func. + * + * Creates a new image surface from PNG data read incrementally + * via the @read_func function. + * + * Return value: a new #cairo_surface_t initialized with the contents + * of the PNG file or a "nil" surface if the data read is not a valid PNG image + * or memory could not be allocated for the operation. A nil + * surface can be checked for with cairo_surface_status(surface) which + * may return one of the following values: + * + * %CAIRO_STATUS_NO_MEMORY + * %CAIRO_STATUS_READ_ERROR + * + * Alternatively, you can allow errors to propagate through the drawing + * operations and check the status on the context upon completion + * using cairo_status(). + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, + void *closure) +{ + struct png_read_closure_t png_closure; + + png_closure.read_func = read_func; + png_closure.closure = closure; + + return read_png (&png_closure); +} diff --git a/src/cairo-polygon-intersect.c b/src/cairo-polygon-intersect.c new file mode 100644 index 000000000..2cd73d2e5 --- /dev/null +++ b/src/cairo-polygon-intersect.c @@ -0,0 +1,1532 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-combsort-inline.h" + +typedef cairo_point_t cairo_bo_point32_t; + +typedef struct _cairo_bo_intersect_ordinate { + int32_t ordinate; + enum { EXACT, INEXACT } exactness; +} cairo_bo_intersect_ordinate_t; + +typedef struct _cairo_bo_intersect_point { + cairo_bo_intersect_ordinate_t x; + cairo_bo_intersect_ordinate_t y; +} cairo_bo_intersect_point_t; + +typedef struct _cairo_bo_edge cairo_bo_edge_t; + +typedef struct _cairo_bo_deferred { + cairo_bo_edge_t *other; + int32_t top; +} cairo_bo_deferred_t; + +struct _cairo_bo_edge { + int a_or_b; + cairo_edge_t edge; + cairo_bo_edge_t *prev; + cairo_bo_edge_t *next; + cairo_bo_deferred_t deferred; +}; + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef enum { + CAIRO_BO_EVENT_TYPE_STOP, + CAIRO_BO_EVENT_TYPE_INTERSECTION, + CAIRO_BO_EVENT_TYPE_START +} cairo_bo_event_type_t; + +typedef struct _cairo_bo_event { + cairo_bo_event_type_t type; + cairo_point_t point; +} cairo_bo_event_t; + +typedef struct _cairo_bo_start_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t edge; +} cairo_bo_start_event_t; + +typedef struct _cairo_bo_queue_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t *e1; + cairo_bo_edge_t *e2; +} cairo_bo_queue_event_t; + +typedef struct _pqueue { + int size, max_size; + + cairo_bo_event_t **elements; + cairo_bo_event_t *elements_embedded[1024]; +} pqueue_t; + +typedef struct _cairo_bo_event_queue { + cairo_freepool_t pool; + pqueue_t pqueue; + cairo_bo_event_t **start_events; +} cairo_bo_event_queue_t; + +typedef struct _cairo_bo_sweep_line { + cairo_bo_edge_t *head; + int32_t current_y; + cairo_bo_edge_t *current_edge; +} cairo_bo_sweep_line_t; + +static cairo_fixed_t +_line_compute_intersection_x_for_y (const cairo_line_t *line, + cairo_fixed_t y) +{ + cairo_fixed_t x, dy; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + dy = line->p2.y - line->p1.y; + if (dy != 0) { + x += _cairo_fixed_mul_div_floor (y - line->p1.y, + line->p2.x - line->p1.x, + dy); + } + + return x; +} + +static inline int +_cairo_bo_point32_compare (cairo_bo_point32_t const *a, + cairo_bo_point32_t const *b) +{ + int cmp; + + cmp = a->y - b->y; + if (cmp) + return cmp; + + return a->x - b->x; +} + +/* Compare the slope of a to the slope of b, returning 1, 0, -1 if the + * slope a is respectively greater than, equal to, or less than the + * slope of b. + * + * For each edge, consider the direction vector formed from: + * + * top -> bottom + * + * which is: + * + * (dx, dy) = (line.p2.x - line.p1.x, line.p2.y - line.p1.y) + * + * We then define the slope of each edge as dx/dy, (which is the + * inverse of the slope typically used in math instruction). We never + * compute a slope directly as the value approaches infinity, but we + * can derive a slope comparison without division as follows, (where + * the ? represents our compare operator). + * + * 1. slope(a) ? slope(b) + * 2. adx/ady ? bdx/bdy + * 3. (adx * bdy) ? (bdx * ady) + * + * Note that from step 2 to step 3 there is no change needed in the + * sign of the result since both ady and bdy are guaranteed to be + * greater than or equal to 0. + * + * When using this slope comparison to sort edges, some care is needed + * when interpreting the results. Since the slope compare operates on + * distance vectors from top to bottom it gives a correct left to + * right sort for edges that have a common top point, (such as two + * edges with start events at the same location). On the other hand, + * the sense of the result will be exactly reversed for two edges that + * have a common stop point. + */ +static inline int +_slope_compare (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t adx = a->edge.line.p2.x - a->edge.line.p1.x; + int32_t bdx = b->edge.line.p2.x - b->edge.line.p1.x; + + /* Since the dy's are all positive by construction we can fast + * path several common cases. + */ + + /* First check for vertical lines. */ + if (adx == 0) + return -bdx; + if (bdx == 0) + return adx; + + /* Then where the two edges point in different directions wrt x. */ + if ((adx ^ bdx) < 0) + return adx; + + /* Finally we actually need to do the general comparison. */ + { + int32_t ady = a->edge.line.p2.y - a->edge.line.p1.y; + int32_t bdy = b->edge.line.p2.y - b->edge.line.p1.y; + cairo_int64_t adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + cairo_int64_t bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } +} + +/* + * We need to compare the x-coordinates of a pair of lines for a particular y, + * without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ B_x + (Y - B_y) * B_dx / B_dy, + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy and B_dy (and (Y - A_y), (Y - B_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * A_dy * B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx * A_dy + * - (Y - A_y) * A_dx * B_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 128 bit arithmetic. For certain, but common, + * input we can reduce this down to a single 32 bit compare by inspecting the + * deltas. + * + * (And put the burden of the work on developing fast 128 bit ops, which are + * required throughout the tessellator.) + * + * See the similar discussion for _slope_compare(). + */ +static int +edges_compare_x_for_y_general (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b, + int32_t y) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t dx; + int32_t adx, ady; + int32_t bdx, bdy; + enum { + HAVE_NONE = 0x0, + HAVE_DX = 0x1, + HAVE_ADX = 0x2, + HAVE_DX_ADX = HAVE_DX | HAVE_ADX, + HAVE_BDX = 0x4, + HAVE_DX_BDX = HAVE_DX | HAVE_BDX, + HAVE_ADX_BDX = HAVE_ADX | HAVE_BDX, + HAVE_ALL = HAVE_DX | HAVE_ADX | HAVE_BDX + } have_dx_adx_bdx = HAVE_ALL; + + /* don't bother solving for abscissa if the edges' bounding boxes + * can be used to order them. */ + { + int32_t amin, amax; + int32_t bmin, bmax; + if (a->edge.line.p1.x < a->edge.line.p2.x) { + amin = a->edge.line.p1.x; + amax = a->edge.line.p2.x; + } else { + amin = a->edge.line.p2.x; + amax = a->edge.line.p1.x; + } + if (b->edge.line.p1.x < b->edge.line.p2.x) { + bmin = b->edge.line.p1.x; + bmax = b->edge.line.p2.x; + } else { + bmin = b->edge.line.p2.x; + bmax = b->edge.line.p1.x; + } + if (amax < bmin) return -1; + if (amin > bmax) return +1; + } + + ady = a->edge.line.p2.y - a->edge.line.p1.y; + adx = a->edge.line.p2.x - a->edge.line.p1.x; + if (adx == 0) + have_dx_adx_bdx &= ~HAVE_ADX; + + bdy = b->edge.line.p2.y - b->edge.line.p1.y; + bdx = b->edge.line.p2.x - b->edge.line.p1.x; + if (bdx == 0) + have_dx_adx_bdx &= ~HAVE_BDX; + + dx = a->edge.line.p1.x - b->edge.line.p1.x; + if (dx == 0) + have_dx_adx_bdx &= ~HAVE_DX; + +#define L _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (ady, bdy), dx) +#define A _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (adx, bdy), y - a->edge.line.p1.y) +#define B _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (bdx, ady), y - b->edge.line.p1.y) + switch (have_dx_adx_bdx) { + default: + case HAVE_NONE: + return 0; + case HAVE_DX: + /* A_dy * B_dy * (A_x - B_x) ∘ 0 */ + return dx; /* ady * bdy is positive definite */ + case HAVE_ADX: + /* 0 ∘ - (Y - A_y) * A_dx * B_dy */ + return adx; /* bdy * (y - a->top.y) is positive definite */ + case HAVE_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy */ + return -bdx; /* ady * (y - b->top.y) is positive definite */ + case HAVE_ADX_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy - (Y - A_y) * A_dx * B_dy */ + if ((adx ^ bdx) < 0) { + return adx; + } else if (a->edge.line.p1.y == b->edge.line.p1.y) { /* common origin */ + cairo_int64_t adx_bdy, bdx_ady; + + /* ∴ A_dx * B_dy ∘ B_dx * A_dy */ + + adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } else + return _cairo_int128_cmp (A, B); + case HAVE_DX_ADX: + /* A_dy * (A_x - B_x) ∘ - (Y - A_y) * A_dx */ + if ((-adx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t ady_dx, dy_adx; + + ady_dx = _cairo_int32x32_64_mul (ady, dx); + dy_adx = _cairo_int32x32_64_mul (a->edge.line.p1.y - y, adx); + + return _cairo_int64_cmp (ady_dx, dy_adx); + } + case HAVE_DX_BDX: + /* B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx */ + if ((bdx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t bdy_dx, dy_bdx; + + bdy_dx = _cairo_int32x32_64_mul (bdy, dx); + dy_bdx = _cairo_int32x32_64_mul (y - b->edge.line.p1.y, bdx); + + return _cairo_int64_cmp (bdy_dx, dy_bdx); + } + case HAVE_ALL: + /* XXX try comparing (a->edge.line.p2.x - b->edge.line.p2.x) et al */ + return _cairo_int128_cmp (L, _cairo_int128_sub (B, A)); + } +#undef B +#undef A +#undef L +} + +/* + * We need to compare the x-coordinate of a line for a particular y wrt to a + * given x, without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ X + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy (and (Y - A_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * (Y - A_y) * A_dx ∘ (X - A_x) * A_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 64 bit arithmetic. + * + * See the similar discussion for _slope_compare() and + * edges_compare_x_for_y_general(). + */ +static int +edge_compare_for_y_against_x (const cairo_bo_edge_t *a, + int32_t y, + int32_t x) +{ + int32_t adx, ady; + int32_t dx, dy; + cairo_int64_t L, R; + + if (x < a->edge.line.p1.x && x < a->edge.line.p2.x) + return 1; + if (x > a->edge.line.p1.x && x > a->edge.line.p2.x) + return -1; + + adx = a->edge.line.p2.x - a->edge.line.p1.x; + dx = x - a->edge.line.p1.x; + + if (adx == 0) + return -dx; + if (dx == 0 || (adx ^ dx) < 0) + return adx; + + dy = y - a->edge.line.p1.y; + ady = a->edge.line.p2.y - a->edge.line.p1.y; + + L = _cairo_int32x32_64_mul (dy, adx); + R = _cairo_int32x32_64_mul (dx, ady); + + return _cairo_int64_cmp (L, R); +} + +static int +edges_compare_x_for_y (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b, + int32_t y) +{ + /* If the sweep-line is currently on an end-point of a line, + * then we know its precise x value (and considering that we often need to + * compare events at end-points, this happens frequently enough to warrant + * special casing). + */ + enum { + HAVE_NEITHER = 0x0, + HAVE_AX = 0x1, + HAVE_BX = 0x2, + HAVE_BOTH = HAVE_AX | HAVE_BX + } have_ax_bx = HAVE_BOTH; + int32_t ax, bx; + + if (y == a->edge.line.p1.y) + ax = a->edge.line.p1.x; + else if (y == a->edge.line.p2.y) + ax = a->edge.line.p2.x; + else + have_ax_bx &= ~HAVE_AX; + + if (y == b->edge.line.p1.y) + bx = b->edge.line.p1.x; + else if (y == b->edge.line.p2.y) + bx = b->edge.line.p2.x; + else + have_ax_bx &= ~HAVE_BX; + + switch (have_ax_bx) { + default: + case HAVE_NEITHER: + return edges_compare_x_for_y_general (a, b, y); + case HAVE_AX: + return -edge_compare_for_y_against_x (b, y, ax); + case HAVE_BX: + return edge_compare_for_y_against_x (a, y, bx); + case HAVE_BOTH: + return ax - bx; + } +} + +static inline int +_line_equal (const cairo_line_t *a, const cairo_line_t *b) +{ + return a->p1.x == b->p1.x && a->p1.y == b->p1.y && + a->p2.x == b->p2.x && a->p2.y == b->p2.y; +} + +static int +_cairo_bo_sweep_line_compare_edges (cairo_bo_sweep_line_t *sweep_line, + const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + int cmp; + + /* compare the edges if not identical */ + if (! _line_equal (&a->edge.line, &b->edge.line)) { + cmp = edges_compare_x_for_y (a, b, sweep_line->current_y); + if (cmp) + return cmp; + + /* The two edges intersect exactly at y, so fall back on slope + * comparison. We know that this compare_edges function will be + * called only when starting a new edge, (not when stopping an + * edge), so we don't have to worry about conditionally inverting + * the sense of _slope_compare. */ + cmp = _slope_compare (a, b); + if (cmp) + return cmp; + } + + /* We've got two collinear edges now. */ + return b->edge.bottom - a->edge.bottom; +} + +static inline cairo_int64_t +det32_64 (int32_t a, int32_t b, + int32_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int64_sub (_cairo_int32x32_64_mul (a, d), + _cairo_int32x32_64_mul (b, c)); +} + +static inline cairo_int128_t +det64x32_128 (cairo_int64_t a, int32_t b, + cairo_int64_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int128_sub (_cairo_int64x32_128_mul (a, d), + _cairo_int64x32_128_mul (c, b)); +} + +/* Compute the intersection of two lines as defined by two edges. The + * result is provided as a coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection or + * %CAIRO_BO_STATUS_PARALLEL if the two lines are exactly parallel. + */ +static cairo_bool_t +intersect_lines (cairo_bo_edge_t *a, + cairo_bo_edge_t *b, + cairo_bo_intersect_point_t *intersection) +{ + cairo_int64_t a_det, b_det; + + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm begins. + * What we're doing to mitigate this is to perform clamping in + * cairo_bo_tessellate_polygon(). + */ + int32_t dx1 = a->edge.line.p1.x - a->edge.line.p2.x; + int32_t dy1 = a->edge.line.p1.y - a->edge.line.p2.y; + + int32_t dx2 = b->edge.line.p1.x - b->edge.line.p2.x; + int32_t dy2 = b->edge.line.p1.y - b->edge.line.p2.y; + + cairo_int64_t den_det; + cairo_int64_t R; + cairo_quorem64_t qr; + + den_det = det32_64 (dx1, dy1, dx2, dy2); + + /* Q: Can we determine that the lines do not intersect (within range) + * much more cheaply than computing the intersection point i.e. by + * avoiding the division? + * + * X = ax + t * adx = bx + s * bdx; + * Y = ay + t * ady = by + s * bdy; + * ∴ t * (ady*bdx - bdy*adx) = bdx * (by - ay) + bdy * (ax - bx) + * => t * L = R + * + * Therefore we can reject any intersection (under the criteria for + * valid intersection events) if: + * L^R < 0 => t < 0, or + * L t > 1 + * + * (where top/bottom must at least extend to the line endpoints). + * + * A similar substitution can be performed for s, yielding: + * s * (ady*bdx - bdy*adx) = ady * (ax - bx) - adx * (ay - by) + */ + R = det32_64 (dx2, dy2, + b->edge.line.p1.x - a->edge.line.p1.x, + b->edge.line.p1.y - a->edge.line.p1.y); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + R = det32_64 (dy1, dx1, + a->edge.line.p1.y - b->edge.line.p1.y, + a->edge.line.p1.x - b->edge.line.p1.x); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + /* We now know that the two lines should intersect within range. */ + + a_det = det32_64 (a->edge.line.p1.x, a->edge.line.p1.y, + a->edge.line.p2.x, a->edge.line.p2.y); + b_det = det32_64 (b->edge.line.p1.x, b->edge.line.p1.y, + b->edge.line.p2.x, b->edge.line.p2.y); + + /* x = det (a_det, dx1, b_det, dx2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dx1, + b_det, dx2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->x.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->x.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->x.exactness = INEXACT; + } +#endif + intersection->x.ordinate = _cairo_int64_to_int32 (qr.quo); + + /* y = det (a_det, dy1, b_det, dy2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dy1, + b_det, dy2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->y.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->y.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->y.exactness = INEXACT; + } +#endif + intersection->y.ordinate = _cairo_int64_to_int32 (qr.quo); + + return TRUE; +} + +static int +_cairo_bo_intersect_ordinate_32_compare (cairo_bo_intersect_ordinate_t a, + int32_t b) +{ + /* First compare the quotient */ + if (a.ordinate > b) + return +1; + if (a.ordinate < b) + return -1; + /* With quotient identical, if remainder is 0 then compare equal */ + /* Otherwise, the non-zero remainder makes a > b */ + return INEXACT == a.exactness; +} + +/* Does the given edge contain the given point. The point must already + * be known to be contained within the line determined by the edge, + * (most likely the point results from an intersection of this edge + * with another). + * + * If we had exact arithmetic, then this function would simply be a + * matter of examining whether the y value of the point lies within + * the range of y values of the edge. But since intersection points + * are not exact due to being rounded to the nearest integer within + * the available precision, we must also examine the x value of the + * point. + * + * The definition of "contains" here is that the given intersection + * point will be seen by the sweep line after the start event for the + * given edge and before the stop event for the edge. See the comments + * in the implementation for more details. + */ +static cairo_bool_t +_cairo_bo_edge_contains_intersect_point (cairo_bo_edge_t *edge, + cairo_bo_intersect_point_t *point) +{ + int cmp_top, cmp_bottom; + + /* XXX: When running the actual algorithm, we don't actually need to + * compare against edge->top at all here, since any intersection above + * top is eliminated early via a slope comparison. We're leaving these + * here for now only for the sake of the quadratic-time intersection + * finder which needs them. + */ + + cmp_top = _cairo_bo_intersect_ordinate_32_compare (point->y, + edge->edge.top); + cmp_bottom = _cairo_bo_intersect_ordinate_32_compare (point->y, + edge->edge.bottom); + + if (cmp_top < 0 || cmp_bottom > 0) + { + return FALSE; + } + + if (cmp_top > 0 && cmp_bottom < 0) + { + return TRUE; + } + + /* At this stage, the point lies on the same y value as either + * edge->top or edge->bottom, so we have to examine the x value in + * order to properly determine containment. */ + + /* If the y value of the point is the same as the y value of the + * top of the edge, then the x value of the point must be greater + * to be considered as inside the edge. Similarly, if the y value + * of the point is the same as the y value of the bottom of the + * edge, then the x value of the point must be less to be + * considered as inside. */ + + if (cmp_top == 0) { + cairo_fixed_t top_x; + + top_x = _line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.top); + return _cairo_bo_intersect_ordinate_32_compare (point->x, top_x) > 0; + } else { /* cmp_bottom == 0 */ + cairo_fixed_t bot_x; + + bot_x = _line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.bottom); + return _cairo_bo_intersect_ordinate_32_compare (point->x, bot_x) < 0; + } +} + +/* Compute the intersection of two edges. The result is provided as a + * coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection + * that is within both edges, %CAIRO_BO_STATUS_NO_INTERSECTION if the + * intersection of the lines defined by the edges occurs outside of + * one or both edges, and %CAIRO_BO_STATUS_PARALLEL if the two edges + * are exactly parallel. + * + * Note that when determining if a candidate intersection is "inside" + * an edge, we consider both the infinitesimal shortening and the + * infinitesimal tilt rules described by John Hobby. Specifically, if + * the intersection is exactly the same as an edge point, it is + * effectively outside (no intersection is returned). Also, if the + * intersection point has the same + */ +static cairo_bool_t +_cairo_bo_edge_intersect (cairo_bo_edge_t *a, + cairo_bo_edge_t *b, + cairo_bo_point32_t *intersection) +{ + cairo_bo_intersect_point_t quorem; + + if (! intersect_lines (a, b, &quorem)) + return FALSE; + + if (! _cairo_bo_edge_contains_intersect_point (a, &quorem)) + return FALSE; + + if (! _cairo_bo_edge_contains_intersect_point (b, &quorem)) + return FALSE; + + /* Now that we've correctly compared the intersection point and + * determined that it lies within the edge, then we know that we + * no longer need any more bits of storage for the intersection + * than we do for our edge coordinates. We also no longer need the + * remainder from the division. */ + intersection->x = quorem.x.ordinate; + intersection->y = quorem.y.ordinate; + + return TRUE; +} + +static inline int +cairo_bo_event_compare (const cairo_bo_event_t *a, + const cairo_bo_event_t *b) +{ + int cmp; + + cmp = _cairo_bo_point32_compare (&a->point, &b->point); + if (cmp) + return cmp; + + cmp = a->type - b->type; + if (cmp) + return cmp; + + return a - b; +} + +static inline void +_pqueue_init (pqueue_t *pq) +{ + pq->max_size = ARRAY_LENGTH (pq->elements_embedded); + pq->size = 0; + + pq->elements = pq->elements_embedded; +} + +static inline void +_pqueue_fini (pqueue_t *pq) +{ + if (pq->elements != pq->elements_embedded) + free (pq->elements); +} + +static cairo_status_t +_pqueue_grow (pqueue_t *pq) +{ + cairo_bo_event_t **new_elements; + pq->max_size *= 2; + + if (pq->elements == pq->elements_embedded) { + new_elements = _cairo_malloc_ab (pq->max_size, + sizeof (cairo_bo_event_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (new_elements, pq->elements_embedded, + sizeof (pq->elements_embedded)); + } else { + new_elements = _cairo_realloc_ab (pq->elements, + pq->max_size, + sizeof (cairo_bo_event_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pq->elements = new_elements; + return CAIRO_STATUS_SUCCESS; +} + +static inline cairo_status_t +_pqueue_push (pqueue_t *pq, cairo_bo_event_t *event) +{ + cairo_bo_event_t **elements; + int i, parent; + + if (unlikely (pq->size + 1 == pq->max_size)) { + cairo_status_t status; + + status = _pqueue_grow (pq); + if (unlikely (status)) + return status; + } + + elements = pq->elements; + + for (i = ++pq->size; + i != PQ_FIRST_ENTRY && + cairo_bo_event_compare (event, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = event; + + return CAIRO_STATUS_SUCCESS; +} + +static inline void +_pqueue_pop (pqueue_t *pq) +{ + cairo_bo_event_t **elements = pq->elements; + cairo_bo_event_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + cairo_bo_event_compare (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (cairo_bo_event_compare (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline cairo_status_t +_cairo_bo_event_queue_insert (cairo_bo_event_queue_t *queue, + cairo_bo_event_type_t type, + cairo_bo_edge_t *e1, + cairo_bo_edge_t *e2, + const cairo_point_t *point) +{ + cairo_bo_queue_event_t *event; + + event = _cairo_freepool_alloc (&queue->pool); + if (unlikely (event == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event->type = type; + event->e1 = e1; + event->e2 = e2; + event->point = *point; + + return _pqueue_push (&queue->pqueue, (cairo_bo_event_t *) event); +} + +static void +_cairo_bo_event_queue_delete (cairo_bo_event_queue_t *queue, + cairo_bo_event_t *event) +{ + _cairo_freepool_free (&queue->pool, event); +} + +static cairo_bo_event_t * +_cairo_bo_event_dequeue (cairo_bo_event_queue_t *event_queue) +{ + cairo_bo_event_t *event, *cmp; + + event = event_queue->pqueue.elements[PQ_FIRST_ENTRY]; + cmp = *event_queue->start_events; + if (event == NULL || + (cmp != NULL && cairo_bo_event_compare (cmp, event) < 0)) + { + event = cmp; + event_queue->start_events++; + } + else + { + _pqueue_pop (&event_queue->pqueue); + } + + return event; +} + +CAIRO_COMBSORT_DECLARE (_cairo_bo_event_queue_sort, + cairo_bo_event_t *, + cairo_bo_event_compare) + +static void +_cairo_bo_event_queue_init (cairo_bo_event_queue_t *event_queue, + cairo_bo_event_t **start_events, + int num_events) +{ + _cairo_bo_event_queue_sort (start_events, num_events); + start_events[num_events] = NULL; + + event_queue->start_events = start_events; + + _cairo_freepool_init (&event_queue->pool, + sizeof (cairo_bo_queue_event_t)); + _pqueue_init (&event_queue->pqueue); + event_queue->pqueue.elements[PQ_FIRST_ENTRY] = NULL; +} + +static cairo_status_t +event_queue_insert_stop (cairo_bo_event_queue_t *event_queue, + cairo_bo_edge_t *edge) +{ + cairo_bo_point32_t point; + + point.y = edge->edge.bottom; + point.x = _line_compute_intersection_x_for_y (&edge->edge.line, + point.y); + return _cairo_bo_event_queue_insert (event_queue, + CAIRO_BO_EVENT_TYPE_STOP, + edge, NULL, + &point); +} + +static void +_cairo_bo_event_queue_fini (cairo_bo_event_queue_t *event_queue) +{ + _pqueue_fini (&event_queue->pqueue); + _cairo_freepool_fini (&event_queue->pool); +} + +static inline cairo_status_t +event_queue_insert_if_intersect_below_current_y (cairo_bo_event_queue_t *event_queue, + cairo_bo_edge_t *left, + cairo_bo_edge_t *right) +{ + cairo_bo_point32_t intersection; + + if (_line_equal (&left->edge.line, &right->edge.line)) + return CAIRO_STATUS_SUCCESS; + + /* The names "left" and "right" here are correct descriptions of + * the order of the two edges within the active edge list. So if a + * slope comparison also puts left less than right, then we know + * that the intersection of these two segments has already + * occurred before the current sweep line position. */ + if (_slope_compare (left, right) <= 0) + return CAIRO_STATUS_SUCCESS; + + if (! _cairo_bo_edge_intersect (left, right, &intersection)) + return CAIRO_STATUS_SUCCESS; + + return _cairo_bo_event_queue_insert (event_queue, + CAIRO_BO_EVENT_TYPE_INTERSECTION, + left, right, + &intersection); +} + +static void +_cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line) +{ + sweep_line->head = NULL; + sweep_line->current_y = INT32_MIN; + sweep_line->current_edge = NULL; +} + +static cairo_status_t +sweep_line_insert (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (sweep_line->current_edge != NULL) { + cairo_bo_edge_t *prev, *next; + int cmp; + + cmp = _cairo_bo_sweep_line_compare_edges (sweep_line, + sweep_line->current_edge, + edge); + if (cmp < 0) { + prev = sweep_line->current_edge; + next = prev->next; + while (next != NULL && + _cairo_bo_sweep_line_compare_edges (sweep_line, + next, edge) < 0) + { + prev = next, next = prev->next; + } + + prev->next = edge; + edge->prev = prev; + edge->next = next; + if (next != NULL) + next->prev = edge; + } else if (cmp > 0) { + next = sweep_line->current_edge; + prev = next->prev; + while (prev != NULL && + _cairo_bo_sweep_line_compare_edges (sweep_line, + prev, edge) > 0) + { + next = prev, prev = next->prev; + } + + next->prev = edge; + edge->next = next; + edge->prev = prev; + if (prev != NULL) + prev->next = edge; + else + sweep_line->head = edge; + } else { + prev = sweep_line->current_edge; + edge->prev = prev; + edge->next = prev->next; + if (prev->next != NULL) + prev->next->prev = edge; + prev->next = edge; + } + } else { + sweep_line->head = edge; + } + + sweep_line->current_edge = edge; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_bo_sweep_line_delete (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (edge->prev != NULL) + edge->prev->next = edge->next; + else + sweep_line->head = edge->next; + + if (edge->next != NULL) + edge->next->prev = edge->prev; + + if (sweep_line->current_edge == edge) + sweep_line->current_edge = edge->prev ? edge->prev : edge->next; +} + +static void +_cairo_bo_sweep_line_swap (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *left, + cairo_bo_edge_t *right) +{ + if (left->prev != NULL) + left->prev->next = right; + else + sweep_line->head = right; + + if (right->next != NULL) + right->next->prev = left; + + left->next = right->next; + right->next = left; + + right->prev = left->prev; + left->prev = right; +} + +static inline cairo_bool_t +edges_colinear (const cairo_bo_edge_t *a, const cairo_bo_edge_t *b) +{ + if (_line_equal (&a->edge.line, &b->edge.line)) + return TRUE; + + if (_slope_compare (a, b)) + return FALSE; + + /* The choice of y is not truly arbitrary since we must guarantee that it + * is greater than the start of either line. + */ + if (a->edge.line.p1.y == b->edge.line.p1.y) { + return a->edge.line.p1.x == b->edge.line.p1.x; + } else if (a->edge.line.p1.y < b->edge.line.p1.y) { + return edge_compare_for_y_against_x (b, + a->edge.line.p1.y, + a->edge.line.p1.x) == 0; + } else { + return edge_compare_for_y_against_x (a, + b->edge.line.p1.y, + b->edge.line.p1.x) == 0; + } +} + +static void +edges_end (cairo_bo_edge_t *left, + int32_t bot, + cairo_polygon_t *polygon) +{ + cairo_bo_deferred_t *l = &left->deferred; + cairo_bo_edge_t *right = l->other; + + assert(right->deferred.other == NULL); + if (likely (l->top < bot)) { + _cairo_polygon_add_line (polygon, &left->edge.line, l->top, bot, 1); + _cairo_polygon_add_line (polygon, &right->edge.line, l->top, bot, -1); + } + + l->other = NULL; +} + +static inline void +edges_start_or_continue (cairo_bo_edge_t *left, + cairo_bo_edge_t *right, + int top, + cairo_polygon_t *polygon) +{ + assert (right->deferred.other == NULL); + + if (left->deferred.other == right) + return; + + if (left->deferred.other != NULL) { + if (right != NULL && edges_colinear (left->deferred.other, right)) { + cairo_bo_edge_t *old = left->deferred.other; + + /* continuation on right, extend right to cover both */ + assert (old->deferred.other == NULL); + assert (old->edge.line.p2.y > old->edge.line.p1.y); + + if (old->edge.line.p1.y < right->edge.line.p1.y) + right->edge.line.p1 = old->edge.line.p1; + if (old->edge.line.p2.y > right->edge.line.p2.y) + right->edge.line.p2 = old->edge.line.p2; + left->deferred.other = right; + return; + } + + edges_end (left, top, polygon); + } + + if (right != NULL && ! edges_colinear (left, right)) { + left->deferred.top = top; + left->deferred.other = right; + } +} + +#define is_zero(w) ((w)[0] == 0 || (w)[1] == 0) + +static inline void +active_edges (cairo_bo_edge_t *left, + int32_t top, + cairo_polygon_t *polygon) +{ + cairo_bo_edge_t *right; + int winding[2] = {0, 0}; + + /* Yes, this is naive. Consider this a placeholder. */ + + while (left != NULL) { + assert (is_zero (winding)); + + do { + winding[left->a_or_b] += left->edge.dir; + if (! is_zero (winding)) + break; + + if unlikely ((left->deferred.other)) + edges_end (left, top, polygon); + + left = left->next; + if (! left) + return; + } while (1); + + right = left->next; + do { + if unlikely ((right->deferred.other)) + edges_end (right, top, polygon); + + winding[right->a_or_b] += right->edge.dir; + if (is_zero (winding)) { + if (right->next == NULL || + ! edges_colinear (right, right->next)) + break; + } + + right = right->next; + } while (1); + + edges_start_or_continue (left, right, top, polygon); + + left = right->next; + } +} + +static cairo_status_t +intersection_sweep (cairo_bo_event_t **start_events, + int num_events, + cairo_polygon_t *polygon) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; /* silence compiler */ + cairo_bo_event_queue_t event_queue; + cairo_bo_sweep_line_t sweep_line; + cairo_bo_event_t *event; + cairo_bo_edge_t *left, *right; + cairo_bo_edge_t *e1, *e2; + + _cairo_bo_event_queue_init (&event_queue, start_events, num_events); + _cairo_bo_sweep_line_init (&sweep_line); + + while ((event = _cairo_bo_event_dequeue (&event_queue))) { + if (event->point.y != sweep_line.current_y) { + active_edges (sweep_line.head, + sweep_line.current_y, + polygon); + sweep_line.current_y = event->point.y; + } + + switch (event->type) { + case CAIRO_BO_EVENT_TYPE_START: + e1 = &((cairo_bo_start_event_t *) event)->edge; + + status = sweep_line_insert (&sweep_line, e1); + if (unlikely (status)) + goto unwind; + + status = event_queue_insert_stop (&event_queue, e1); + if (unlikely (status)) + goto unwind; + + left = e1->prev; + right = e1->next; + + if (left != NULL) { + status = event_queue_insert_if_intersect_below_current_y (&event_queue, left, e1); + if (unlikely (status)) + goto unwind; + } + + if (right != NULL) { + status = event_queue_insert_if_intersect_below_current_y (&event_queue, e1, right); + if (unlikely (status)) + goto unwind; + } + + break; + + case CAIRO_BO_EVENT_TYPE_STOP: + e1 = ((cairo_bo_queue_event_t *) event)->e1; + _cairo_bo_event_queue_delete (&event_queue, event); + + if (e1->deferred.other) + edges_end (e1, sweep_line.current_y, polygon); + + left = e1->prev; + right = e1->next; + + _cairo_bo_sweep_line_delete (&sweep_line, e1); + + if (left != NULL && right != NULL) { + status = event_queue_insert_if_intersect_below_current_y (&event_queue, left, right); + if (unlikely (status)) + goto unwind; + } + + break; + + case CAIRO_BO_EVENT_TYPE_INTERSECTION: + e1 = ((cairo_bo_queue_event_t *) event)->e1; + e2 = ((cairo_bo_queue_event_t *) event)->e2; + _cairo_bo_event_queue_delete (&event_queue, event); + + /* skip this intersection if its edges are not adjacent */ + if (e2 != e1->next) + break; + + if (e1->deferred.other) + edges_end (e1, sweep_line.current_y, polygon); + if (e2->deferred.other) + edges_end (e2, sweep_line.current_y, polygon); + + left = e1->prev; + right = e2->next; + + _cairo_bo_sweep_line_swap (&sweep_line, e1, e2); + + /* after the swap e2 is left of e1 */ + + if (left != NULL) { + status = event_queue_insert_if_intersect_below_current_y (&event_queue, left, e2); + if (unlikely (status)) + goto unwind; + } + + if (right != NULL) { + status = event_queue_insert_if_intersect_below_current_y (&event_queue, e1, right); + if (unlikely (status)) + goto unwind; + } + + break; + } + } + + unwind: + _cairo_bo_event_queue_fini (&event_queue); + + return status; +} + +cairo_status_t +_cairo_polygon_intersect (cairo_polygon_t *a, int winding_a, + cairo_polygon_t *b, int winding_b) +{ + cairo_status_t status; + cairo_bo_start_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_start_event_t)]; + cairo_bo_start_event_t *events; + cairo_bo_event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1]; + cairo_bo_event_t **event_ptrs; + int num_events; + int i, j; + + /* XXX lazy */ + if (winding_a != CAIRO_FILL_RULE_WINDING) { + status = _cairo_polygon_reduce (a, winding_a); + if (unlikely (status)) + return status; + } + + if (winding_b != CAIRO_FILL_RULE_WINDING) { + status = _cairo_polygon_reduce (b, winding_b); + if (unlikely (status)) + return status; + } + + if (unlikely (0 == a->num_edges)) + return CAIRO_STATUS_SUCCESS; + + if (unlikely (0 == b->num_edges)) { + a->num_edges = 0; + return CAIRO_STATUS_SUCCESS; + } + + events = stack_events; + event_ptrs = stack_event_ptrs; + num_events = a->num_edges + b->num_edges; + if (num_events > ARRAY_LENGTH (stack_events)) { + events = _cairo_malloc_ab_plus_c (num_events, + sizeof (cairo_bo_start_event_t) + + sizeof (cairo_bo_event_t *), + sizeof (cairo_bo_event_t *)); + if (unlikely (events == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event_ptrs = (cairo_bo_event_t **) (events + num_events); + } + + j = 0; + for (i = 0; i < a->num_edges; i++) { + event_ptrs[j] = (cairo_bo_event_t *) &events[j]; + + events[j].type = CAIRO_BO_EVENT_TYPE_START; + events[j].point.y = a->edges[i].top; + events[j].point.x = + _line_compute_intersection_x_for_y (&a->edges[i].line, + events[j].point.y); + + events[j].edge.a_or_b = 0; + events[j].edge.edge = a->edges[i]; + events[j].edge.deferred.other = NULL; + events[j].edge.prev = NULL; + events[j].edge.next = NULL; + j++; + } + + for (i = 0; i < b->num_edges; i++) { + event_ptrs[j] = (cairo_bo_event_t *) &events[j]; + + events[j].type = CAIRO_BO_EVENT_TYPE_START; + events[j].point.y = b->edges[i].top; + events[j].point.x = + _line_compute_intersection_x_for_y (&b->edges[i].line, + events[j].point.y); + + events[j].edge.a_or_b = 1; + events[j].edge.edge = b->edges[i]; + events[j].edge.deferred.other = NULL; + events[j].edge.prev = NULL; + events[j].edge.next = NULL; + j++; + } + assert (j == num_events); + +#if 0 + { + FILE *file = fopen ("clip_a.txt", "w"); + _cairo_debug_print_polygon (file, a); + fclose (file); + } + { + FILE *file = fopen ("clip_b.txt", "w"); + _cairo_debug_print_polygon (file, b); + fclose (file); + } +#endif + + a->num_edges = 0; + status = intersection_sweep (event_ptrs, num_events, a); + if (events != stack_events) + free (events); + +#if 0 + { + FILE *file = fopen ("clip_result.txt", "w"); + _cairo_debug_print_polygon (file, a); + fclose (file); + } +#endif + + return status; +} + +cairo_status_t +_cairo_polygon_intersect_with_boxes (cairo_polygon_t *polygon, + cairo_fill_rule_t *winding, + cairo_box_t *boxes, + int num_boxes) +{ + cairo_polygon_t b; + cairo_status_t status; + int n; + + if (num_boxes == 0) { + polygon->num_edges = 0; + return CAIRO_STATUS_SUCCESS; + } + + for (n = 0; n < num_boxes; n++) { + if (polygon->extents.p1.x >= boxes[n].p1.x && + polygon->extents.p2.x <= boxes[n].p2.x && + polygon->extents.p1.y >= boxes[n].p1.y && + polygon->extents.p2.y <= boxes[n].p2.y) + { + return CAIRO_STATUS_SUCCESS; + } + } + + _cairo_polygon_init (&b, NULL, 0); + for (n = 0; n < num_boxes; n++) { + if (boxes[n].p2.x > polygon->extents.p1.x && + boxes[n].p1.x < polygon->extents.p2.x && + boxes[n].p2.y > polygon->extents.p1.y && + boxes[n].p1.y < polygon->extents.p2.y) + { + cairo_point_t p1, p2; + + p1.y = boxes[n].p1.y; + p2.y = boxes[n].p2.y; + + p2.x = p1.x = boxes[n].p1.x; + _cairo_polygon_add_external_edge (&b, &p1, &p2); + + p2.x = p1.x = boxes[n].p2.x; + _cairo_polygon_add_external_edge (&b, &p2, &p1); + } + } + + status = _cairo_polygon_intersect (polygon, *winding, + &b, CAIRO_FILL_RULE_WINDING); + _cairo_polygon_fini (&b); + + *winding = CAIRO_FILL_RULE_WINDING; + return status; +} diff --git a/src/cairo-polygon-reduce.c b/src/cairo-polygon-reduce.c new file mode 100644 index 000000000..ea457fe4e --- /dev/null +++ b/src/cairo-polygon-reduce.c @@ -0,0 +1,1438 @@ +/* + * Copyright © 2004 Carl Worth + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Carl Worth + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +/* Provide definitions for standalone compilation */ +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-combsort-inline.h" + +#define DEBUG_POLYGON 0 + +typedef cairo_point_t cairo_bo_point32_t; + +typedef struct _cairo_bo_intersect_ordinate { + int32_t ordinate; + enum { EXACT, INEXACT } exactness; +} cairo_bo_intersect_ordinate_t; + +typedef struct _cairo_bo_intersect_point { + cairo_bo_intersect_ordinate_t x; + cairo_bo_intersect_ordinate_t y; +} cairo_bo_intersect_point_t; + +typedef struct _cairo_bo_edge cairo_bo_edge_t; + +typedef struct _cairo_bo_deferred { + cairo_bo_edge_t *right; + int32_t top; +} cairo_bo_deferred_t; + +struct _cairo_bo_edge { + cairo_edge_t edge; + cairo_bo_edge_t *prev; + cairo_bo_edge_t *next; + cairo_bo_deferred_t deferred; +}; + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef enum { + CAIRO_BO_EVENT_TYPE_STOP, + CAIRO_BO_EVENT_TYPE_INTERSECTION, + CAIRO_BO_EVENT_TYPE_START +} cairo_bo_event_type_t; + +typedef struct _cairo_bo_event { + cairo_bo_event_type_t type; + cairo_point_t point; +} cairo_bo_event_t; + +typedef struct _cairo_bo_start_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t edge; +} cairo_bo_start_event_t; + +typedef struct _cairo_bo_queue_event { + cairo_bo_event_type_t type; + cairo_point_t point; + cairo_bo_edge_t *e1; + cairo_bo_edge_t *e2; +} cairo_bo_queue_event_t; + +typedef struct _pqueue { + int size, max_size; + + cairo_bo_event_t **elements; + cairo_bo_event_t *elements_embedded[1024]; +} pqueue_t; + +typedef struct _cairo_bo_event_queue { + cairo_freepool_t pool; + pqueue_t pqueue; + cairo_bo_event_t **start_events; +} cairo_bo_event_queue_t; + +typedef struct _cairo_bo_sweep_line { + cairo_bo_edge_t *head; + int32_t current_y; + cairo_bo_edge_t *current_edge; +} cairo_bo_sweep_line_t; + +static cairo_fixed_t +_line_compute_intersection_x_for_y (const cairo_line_t *line, + cairo_fixed_t y) +{ + cairo_fixed_t x, dy; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + dy = line->p2.y - line->p1.y; + if (dy != 0) { + x += _cairo_fixed_mul_div_floor (y - line->p1.y, + line->p2.x - line->p1.x, + dy); + } + + return x; +} + +static inline int +_cairo_bo_point32_compare (cairo_bo_point32_t const *a, + cairo_bo_point32_t const *b) +{ + int cmp; + + cmp = a->y - b->y; + if (cmp) + return cmp; + + return a->x - b->x; +} + +/* Compare the slope of a to the slope of b, returning 1, 0, -1 if the + * slope a is respectively greater than, equal to, or less than the + * slope of b. + * + * For each edge, consider the direction vector formed from: + * + * top -> bottom + * + * which is: + * + * (dx, dy) = (line.p2.x - line.p1.x, line.p2.y - line.p1.y) + * + * We then define the slope of each edge as dx/dy, (which is the + * inverse of the slope typically used in math instruction). We never + * compute a slope directly as the value approaches infinity, but we + * can derive a slope comparison without division as follows, (where + * the ? represents our compare operator). + * + * 1. slope(a) ? slope(b) + * 2. adx/ady ? bdx/bdy + * 3. (adx * bdy) ? (bdx * ady) + * + * Note that from step 2 to step 3 there is no change needed in the + * sign of the result since both ady and bdy are guaranteed to be + * greater than or equal to 0. + * + * When using this slope comparison to sort edges, some care is needed + * when interpreting the results. Since the slope compare operates on + * distance vectors from top to bottom it gives a correct left to + * right sort for edges that have a common top point, (such as two + * edges with start events at the same location). On the other hand, + * the sense of the result will be exactly reversed for two edges that + * have a common stop point. + */ +static inline int +_slope_compare (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t adx = a->edge.line.p2.x - a->edge.line.p1.x; + int32_t bdx = b->edge.line.p2.x - b->edge.line.p1.x; + + /* Since the dy's are all positive by construction we can fast + * path several common cases. + */ + + /* First check for vertical lines. */ + if (adx == 0) + return -bdx; + if (bdx == 0) + return adx; + + /* Then where the two edges point in different directions wrt x. */ + if ((adx ^ bdx) < 0) + return adx; + + /* Finally we actually need to do the general comparison. */ + { + int32_t ady = a->edge.line.p2.y - a->edge.line.p1.y; + int32_t bdy = b->edge.line.p2.y - b->edge.line.p1.y; + cairo_int64_t adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + cairo_int64_t bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } +} + +/* + * We need to compare the x-coordinates of a pair of lines for a particular y, + * without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ B_x + (Y - B_y) * B_dx / B_dy, + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy and B_dy (and (Y - A_y), (Y - B_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * A_dy * B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx * A_dy + * - (Y - A_y) * A_dx * B_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 128 bit arithmetic. For certain, but common, + * input we can reduce this down to a single 32 bit compare by inspecting the + * deltas. + * + * (And put the burden of the work on developing fast 128 bit ops, which are + * required throughout the tessellator.) + * + * See the similar discussion for _slope_compare(). + */ +static int +edges_compare_x_for_y_general (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b, + int32_t y) +{ + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm + * begins. + */ + int32_t dx; + int32_t adx, ady; + int32_t bdx, bdy; + enum { + HAVE_NONE = 0x0, + HAVE_DX = 0x1, + HAVE_ADX = 0x2, + HAVE_DX_ADX = HAVE_DX | HAVE_ADX, + HAVE_BDX = 0x4, + HAVE_DX_BDX = HAVE_DX | HAVE_BDX, + HAVE_ADX_BDX = HAVE_ADX | HAVE_BDX, + HAVE_ALL = HAVE_DX | HAVE_ADX | HAVE_BDX + } have_dx_adx_bdx = HAVE_ALL; + + /* don't bother solving for abscissa if the edges' bounding boxes + * can be used to order them. */ + { + int32_t amin, amax; + int32_t bmin, bmax; + if (a->edge.line.p1.x < a->edge.line.p2.x) { + amin = a->edge.line.p1.x; + amax = a->edge.line.p2.x; + } else { + amin = a->edge.line.p2.x; + amax = a->edge.line.p1.x; + } + if (b->edge.line.p1.x < b->edge.line.p2.x) { + bmin = b->edge.line.p1.x; + bmax = b->edge.line.p2.x; + } else { + bmin = b->edge.line.p2.x; + bmax = b->edge.line.p1.x; + } + if (amax < bmin) return -1; + if (amin > bmax) return +1; + } + + ady = a->edge.line.p2.y - a->edge.line.p1.y; + adx = a->edge.line.p2.x - a->edge.line.p1.x; + if (adx == 0) + have_dx_adx_bdx &= ~HAVE_ADX; + + bdy = b->edge.line.p2.y - b->edge.line.p1.y; + bdx = b->edge.line.p2.x - b->edge.line.p1.x; + if (bdx == 0) + have_dx_adx_bdx &= ~HAVE_BDX; + + dx = a->edge.line.p1.x - b->edge.line.p1.x; + if (dx == 0) + have_dx_adx_bdx &= ~HAVE_DX; + +#define L _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (ady, bdy), dx) +#define A _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (adx, bdy), y - a->edge.line.p1.y) +#define B _cairo_int64x32_128_mul (_cairo_int32x32_64_mul (bdx, ady), y - b->edge.line.p1.y) + switch (have_dx_adx_bdx) { + default: + case HAVE_NONE: + return 0; + case HAVE_DX: + /* A_dy * B_dy * (A_x - B_x) ∘ 0 */ + return dx; /* ady * bdy is positive definite */ + case HAVE_ADX: + /* 0 ∘ - (Y - A_y) * A_dx * B_dy */ + return adx; /* bdy * (y - a->top.y) is positive definite */ + case HAVE_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy */ + return -bdx; /* ady * (y - b->top.y) is positive definite */ + case HAVE_ADX_BDX: + /* 0 ∘ (Y - B_y) * B_dx * A_dy - (Y - A_y) * A_dx * B_dy */ + if ((adx ^ bdx) < 0) { + return adx; + } else if (a->edge.line.p1.y == b->edge.line.p1.y) { /* common origin */ + cairo_int64_t adx_bdy, bdx_ady; + + /* ∴ A_dx * B_dy ∘ B_dx * A_dy */ + + adx_bdy = _cairo_int32x32_64_mul (adx, bdy); + bdx_ady = _cairo_int32x32_64_mul (bdx, ady); + + return _cairo_int64_cmp (adx_bdy, bdx_ady); + } else + return _cairo_int128_cmp (A, B); + case HAVE_DX_ADX: + /* A_dy * (A_x - B_x) ∘ - (Y - A_y) * A_dx */ + if ((-adx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t ady_dx, dy_adx; + + ady_dx = _cairo_int32x32_64_mul (ady, dx); + dy_adx = _cairo_int32x32_64_mul (a->edge.line.p1.y - y, adx); + + return _cairo_int64_cmp (ady_dx, dy_adx); + } + case HAVE_DX_BDX: + /* B_dy * (A_x - B_x) ∘ (Y - B_y) * B_dx */ + if ((bdx ^ dx) < 0) { + return dx; + } else { + cairo_int64_t bdy_dx, dy_bdx; + + bdy_dx = _cairo_int32x32_64_mul (bdy, dx); + dy_bdx = _cairo_int32x32_64_mul (y - b->edge.line.p1.y, bdx); + + return _cairo_int64_cmp (bdy_dx, dy_bdx); + } + case HAVE_ALL: + /* XXX try comparing (a->edge.line.p2.x - b->edge.line.p2.x) et al */ + return _cairo_int128_cmp (L, _cairo_int128_sub (B, A)); + } +#undef B +#undef A +#undef L +} + +/* + * We need to compare the x-coordinate of a line for a particular y wrt to a + * given x, without loss of precision. + * + * The x-coordinate along an edge for a given y is: + * X = A_x + (Y - A_y) * A_dx / A_dy + * + * So the inequality we wish to test is: + * A_x + (Y - A_y) * A_dx / A_dy ∘ X + * where ∘ is our inequality operator. + * + * By construction, we know that A_dy (and (Y - A_y)) are + * all positive, so we can rearrange it thus without causing a sign change: + * (Y - A_y) * A_dx ∘ (X - A_x) * A_dy + * + * Given the assumption that all the deltas fit within 32 bits, we can compute + * this comparison directly using 64 bit arithmetic. + * + * See the similar discussion for _slope_compare() and + * edges_compare_x_for_y_general(). + */ +static int +edge_compare_for_y_against_x (const cairo_bo_edge_t *a, + int32_t y, + int32_t x) +{ + int32_t adx, ady; + int32_t dx, dy; + cairo_int64_t L, R; + + if (x < a->edge.line.p1.x && x < a->edge.line.p2.x) + return 1; + if (x > a->edge.line.p1.x && x > a->edge.line.p2.x) + return -1; + + adx = a->edge.line.p2.x - a->edge.line.p1.x; + dx = x - a->edge.line.p1.x; + + if (adx == 0) + return -dx; + if (dx == 0 || (adx ^ dx) < 0) + return adx; + + dy = y - a->edge.line.p1.y; + ady = a->edge.line.p2.y - a->edge.line.p1.y; + + L = _cairo_int32x32_64_mul (dy, adx); + R = _cairo_int32x32_64_mul (dx, ady); + + return _cairo_int64_cmp (L, R); +} + +static int +edges_compare_x_for_y (const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b, + int32_t y) +{ + /* If the sweep-line is currently on an end-point of a line, + * then we know its precise x value (and considering that we often need to + * compare events at end-points, this happens frequently enough to warrant + * special casing). + */ + enum { + HAVE_NEITHER = 0x0, + HAVE_AX = 0x1, + HAVE_BX = 0x2, + HAVE_BOTH = HAVE_AX | HAVE_BX + } have_ax_bx = HAVE_BOTH; + int32_t ax, bx; + + if (y == a->edge.line.p1.y) + ax = a->edge.line.p1.x; + else if (y == a->edge.line.p2.y) + ax = a->edge.line.p2.x; + else + have_ax_bx &= ~HAVE_AX; + + if (y == b->edge.line.p1.y) + bx = b->edge.line.p1.x; + else if (y == b->edge.line.p2.y) + bx = b->edge.line.p2.x; + else + have_ax_bx &= ~HAVE_BX; + + switch (have_ax_bx) { + default: + case HAVE_NEITHER: + return edges_compare_x_for_y_general (a, b, y); + case HAVE_AX: + return -edge_compare_for_y_against_x (b, y, ax); + case HAVE_BX: + return edge_compare_for_y_against_x (a, y, bx); + case HAVE_BOTH: + return ax - bx; + } +} + +static inline int +_line_equal (const cairo_line_t *a, const cairo_line_t *b) +{ + return (a->p1.x == b->p1.x && a->p1.y == b->p1.y && + a->p2.x == b->p2.x && a->p2.y == b->p2.y); +} + +static int +_cairo_bo_sweep_line_compare_edges (cairo_bo_sweep_line_t *sweep_line, + const cairo_bo_edge_t *a, + const cairo_bo_edge_t *b) +{ + int cmp; + + /* compare the edges if not identical */ + if (! _line_equal (&a->edge.line, &b->edge.line)) { + cmp = edges_compare_x_for_y (a, b, sweep_line->current_y); + if (cmp) + return cmp; + + /* The two edges intersect exactly at y, so fall back on slope + * comparison. We know that this compare_edges function will be + * called only when starting a new edge, (not when stopping an + * edge), so we don't have to worry about conditionally inverting + * the sense of _slope_compare. */ + cmp = _slope_compare (a, b); + if (cmp) + return cmp; + } + + /* We've got two collinear edges now. */ + return b->edge.bottom - a->edge.bottom; +} + +static inline cairo_int64_t +det32_64 (int32_t a, int32_t b, + int32_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int64_sub (_cairo_int32x32_64_mul (a, d), + _cairo_int32x32_64_mul (b, c)); +} + +static inline cairo_int128_t +det64x32_128 (cairo_int64_t a, int32_t b, + cairo_int64_t c, int32_t d) +{ + /* det = a * d - b * c */ + return _cairo_int128_sub (_cairo_int64x32_128_mul (a, d), + _cairo_int64x32_128_mul (c, b)); +} + +/* Compute the intersection of two lines as defined by two edges. The + * result is provided as a coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection or + * %CAIRO_BO_STATUS_PARALLEL if the two lines are exactly parallel. + */ +static cairo_bool_t +intersect_lines (cairo_bo_edge_t *a, + cairo_bo_edge_t *b, + cairo_bo_intersect_point_t *intersection) +{ + cairo_int64_t a_det, b_det; + + /* XXX: We're assuming here that dx and dy will still fit in 32 + * bits. That's not true in general as there could be overflow. We + * should prevent that before the tessellation algorithm begins. + * What we're doing to mitigate this is to perform clamping in + * cairo_bo_tessellate_polygon(). + */ + int32_t dx1 = a->edge.line.p1.x - a->edge.line.p2.x; + int32_t dy1 = a->edge.line.p1.y - a->edge.line.p2.y; + + int32_t dx2 = b->edge.line.p1.x - b->edge.line.p2.x; + int32_t dy2 = b->edge.line.p1.y - b->edge.line.p2.y; + + cairo_int64_t den_det; + cairo_int64_t R; + cairo_quorem64_t qr; + + den_det = det32_64 (dx1, dy1, dx2, dy2); + + /* Q: Can we determine that the lines do not intersect (within range) + * much more cheaply than computing the intersection point i.e. by + * avoiding the division? + * + * X = ax + t * adx = bx + s * bdx; + * Y = ay + t * ady = by + s * bdy; + * ∴ t * (ady*bdx - bdy*adx) = bdx * (by - ay) + bdy * (ax - bx) + * => t * L = R + * + * Therefore we can reject any intersection (under the criteria for + * valid intersection events) if: + * L^R < 0 => t < 0, or + * L t > 1 + * + * (where top/bottom must at least extend to the line endpoints). + * + * A similar substitution can be performed for s, yielding: + * s * (ady*bdx - bdy*adx) = ady * (ax - bx) - adx * (ay - by) + */ + R = det32_64 (dx2, dy2, + b->edge.line.p1.x - a->edge.line.p1.x, + b->edge.line.p1.y - a->edge.line.p1.y); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + R = det32_64 (dy1, dx1, + a->edge.line.p1.y - b->edge.line.p1.y, + a->edge.line.p1.x - b->edge.line.p1.x); + if (_cairo_int64_negative (den_det)) { + if (_cairo_int64_ge (den_det, R)) + return FALSE; + } else { + if (_cairo_int64_le (den_det, R)) + return FALSE; + } + + /* We now know that the two lines should intersect within range. */ + + a_det = det32_64 (a->edge.line.p1.x, a->edge.line.p1.y, + a->edge.line.p2.x, a->edge.line.p2.y); + b_det = det32_64 (b->edge.line.p1.x, b->edge.line.p1.y, + b->edge.line.p2.x, b->edge.line.p2.y); + + /* x = det (a_det, dx1, b_det, dx2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dx1, + b_det, dx2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->x.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->x.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->x.exactness = INEXACT; + } +#endif + intersection->x.ordinate = _cairo_int64_to_int32 (qr.quo); + + /* y = det (a_det, dy1, b_det, dy2) / den_det */ + qr = _cairo_int_96by64_32x64_divrem (det64x32_128 (a_det, dy1, + b_det, dy2), + den_det); + if (_cairo_int64_eq (qr.rem, den_det)) + return FALSE; +#if 0 + intersection->y.exactness = _cairo_int64_is_zero (qr.rem) ? EXACT : INEXACT; +#else + intersection->y.exactness = EXACT; + if (! _cairo_int64_is_zero (qr.rem)) { + if (_cairo_int64_negative (den_det) ^ _cairo_int64_negative (qr.rem)) + qr.rem = _cairo_int64_negate (qr.rem); + qr.rem = _cairo_int64_mul (qr.rem, _cairo_int32_to_int64 (2)); + if (_cairo_int64_ge (qr.rem, den_det)) { + qr.quo = _cairo_int64_add (qr.quo, + _cairo_int32_to_int64 (_cairo_int64_negative (qr.quo) ? -1 : 1)); + } else + intersection->y.exactness = INEXACT; + } +#endif + intersection->y.ordinate = _cairo_int64_to_int32 (qr.quo); + + return TRUE; +} + +static int +_cairo_bo_intersect_ordinate_32_compare (cairo_bo_intersect_ordinate_t a, + int32_t b) +{ + /* First compare the quotient */ + if (a.ordinate > b) + return +1; + if (a.ordinate < b) + return -1; + /* With quotient identical, if remainder is 0 then compare equal */ + /* Otherwise, the non-zero remainder makes a > b */ + return INEXACT == a.exactness; +} + +/* Does the given edge contain the given point. The point must already + * be known to be contained within the line determined by the edge, + * (most likely the point results from an intersection of this edge + * with another). + * + * If we had exact arithmetic, then this function would simply be a + * matter of examining whether the y value of the point lies within + * the range of y values of the edge. But since intersection points + * are not exact due to being rounded to the nearest integer within + * the available precision, we must also examine the x value of the + * point. + * + * The definition of "contains" here is that the given intersection + * point will be seen by the sweep line after the start event for the + * given edge and before the stop event for the edge. See the comments + * in the implementation for more details. + */ +static cairo_bool_t +_cairo_bo_edge_contains_intersect_point (cairo_bo_edge_t *edge, + cairo_bo_intersect_point_t *point) +{ + int cmp_top, cmp_bottom; + + /* XXX: When running the actual algorithm, we don't actually need to + * compare against edge->top at all here, since any intersection above + * top is eliminated early via a slope comparison. We're leaving these + * here for now only for the sake of the quadratic-time intersection + * finder which needs them. + */ + + cmp_top = _cairo_bo_intersect_ordinate_32_compare (point->y, + edge->edge.top); + cmp_bottom = _cairo_bo_intersect_ordinate_32_compare (point->y, + edge->edge.bottom); + + if (cmp_top < 0 || cmp_bottom > 0) + { + return FALSE; + } + + if (cmp_top > 0 && cmp_bottom < 0) + { + return TRUE; + } + + /* At this stage, the point lies on the same y value as either + * edge->top or edge->bottom, so we have to examine the x value in + * order to properly determine containment. */ + + /* If the y value of the point is the same as the y value of the + * top of the edge, then the x value of the point must be greater + * to be considered as inside the edge. Similarly, if the y value + * of the point is the same as the y value of the bottom of the + * edge, then the x value of the point must be less to be + * considered as inside. */ + + if (cmp_top == 0) { + cairo_fixed_t top_x; + + top_x = _line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.top); + return _cairo_bo_intersect_ordinate_32_compare (point->x, top_x) > 0; + } else { /* cmp_bottom == 0 */ + cairo_fixed_t bot_x; + + bot_x = _line_compute_intersection_x_for_y (&edge->edge.line, + edge->edge.bottom); + return _cairo_bo_intersect_ordinate_32_compare (point->x, bot_x) < 0; + } +} + +/* Compute the intersection of two edges. The result is provided as a + * coordinate pair of 128-bit integers. + * + * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection + * that is within both edges, %CAIRO_BO_STATUS_NO_INTERSECTION if the + * intersection of the lines defined by the edges occurs outside of + * one or both edges, and %CAIRO_BO_STATUS_PARALLEL if the two edges + * are exactly parallel. + * + * Note that when determining if a candidate intersection is "inside" + * an edge, we consider both the infinitesimal shortening and the + * infinitesimal tilt rules described by John Hobby. Specifically, if + * the intersection is exactly the same as an edge point, it is + * effectively outside (no intersection is returned). Also, if the + * intersection point has the same + */ +static cairo_bool_t +_cairo_bo_edge_intersect (cairo_bo_edge_t *a, + cairo_bo_edge_t *b, + cairo_bo_point32_t *intersection) +{ + cairo_bo_intersect_point_t quorem; + + if (! intersect_lines (a, b, &quorem)) + return FALSE; + + if (! _cairo_bo_edge_contains_intersect_point (a, &quorem)) + return FALSE; + + if (! _cairo_bo_edge_contains_intersect_point (b, &quorem)) + return FALSE; + + /* Now that we've correctly compared the intersection point and + * determined that it lies within the edge, then we know that we + * no longer need any more bits of storage for the intersection + * than we do for our edge coordinates. We also no longer need the + * remainder from the division. */ + intersection->x = quorem.x.ordinate; + intersection->y = quorem.y.ordinate; + + return TRUE; +} + +static inline int +cairo_bo_event_compare (const cairo_bo_event_t *a, + const cairo_bo_event_t *b) +{ + int cmp; + + cmp = _cairo_bo_point32_compare (&a->point, &b->point); + if (cmp) + return cmp; + + cmp = a->type - b->type; + if (cmp) + return cmp; + + return a - b; +} + +static inline void +_pqueue_init (pqueue_t *pq) +{ + pq->max_size = ARRAY_LENGTH (pq->elements_embedded); + pq->size = 0; + + pq->elements = pq->elements_embedded; +} + +static inline void +_pqueue_fini (pqueue_t *pq) +{ + if (pq->elements != pq->elements_embedded) + free (pq->elements); +} + +static cairo_status_t +_pqueue_grow (pqueue_t *pq) +{ + cairo_bo_event_t **new_elements; + pq->max_size *= 2; + + if (pq->elements == pq->elements_embedded) { + new_elements = _cairo_malloc_ab (pq->max_size, + sizeof (cairo_bo_event_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (new_elements, pq->elements_embedded, + sizeof (pq->elements_embedded)); + } else { + new_elements = _cairo_realloc_ab (pq->elements, + pq->max_size, + sizeof (cairo_bo_event_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pq->elements = new_elements; + return CAIRO_STATUS_SUCCESS; +} + +static inline cairo_status_t +_pqueue_push (pqueue_t *pq, cairo_bo_event_t *event) +{ + cairo_bo_event_t **elements; + int i, parent; + + if (unlikely (pq->size + 1 == pq->max_size)) { + cairo_status_t status; + + status = _pqueue_grow (pq); + if (unlikely (status)) + return status; + } + + elements = pq->elements; + + for (i = ++pq->size; + i != PQ_FIRST_ENTRY && + cairo_bo_event_compare (event, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = event; + + return CAIRO_STATUS_SUCCESS; +} + +static inline void +_pqueue_pop (pqueue_t *pq) +{ + cairo_bo_event_t **elements = pq->elements; + cairo_bo_event_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + cairo_bo_event_compare (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (cairo_bo_event_compare (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline cairo_status_t +_cairo_bo_event_queue_insert (cairo_bo_event_queue_t *queue, + cairo_bo_event_type_t type, + cairo_bo_edge_t *e1, + cairo_bo_edge_t *e2, + const cairo_point_t *point) +{ + cairo_bo_queue_event_t *event; + + event = _cairo_freepool_alloc (&queue->pool); + if (unlikely (event == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event->type = type; + event->e1 = e1; + event->e2 = e2; + event->point = *point; + + return _pqueue_push (&queue->pqueue, (cairo_bo_event_t *) event); +} + +static void +_cairo_bo_event_queue_delete (cairo_bo_event_queue_t *queue, + cairo_bo_event_t *event) +{ + _cairo_freepool_free (&queue->pool, event); +} + +static cairo_bo_event_t * +_cairo_bo_event_dequeue (cairo_bo_event_queue_t *event_queue) +{ + cairo_bo_event_t *event, *cmp; + + event = event_queue->pqueue.elements[PQ_FIRST_ENTRY]; + cmp = *event_queue->start_events; + if (event == NULL || + (cmp != NULL && cairo_bo_event_compare (cmp, event) < 0)) + { + event = cmp; + event_queue->start_events++; + } + else + { + _pqueue_pop (&event_queue->pqueue); + } + + return event; +} + +CAIRO_COMBSORT_DECLARE (_cairo_bo_event_queue_sort, + cairo_bo_event_t *, + cairo_bo_event_compare) + +static void +_cairo_bo_event_queue_init (cairo_bo_event_queue_t *event_queue, + cairo_bo_event_t **start_events, + int num_events) +{ + _cairo_bo_event_queue_sort (start_events, num_events); + start_events[num_events] = NULL; + + event_queue->start_events = start_events; + + _cairo_freepool_init (&event_queue->pool, + sizeof (cairo_bo_queue_event_t)); + _pqueue_init (&event_queue->pqueue); + event_queue->pqueue.elements[PQ_FIRST_ENTRY] = NULL; +} + +static cairo_status_t +_cairo_bo_event_queue_insert_stop (cairo_bo_event_queue_t *event_queue, + cairo_bo_edge_t *edge) +{ + cairo_bo_point32_t point; + + point.y = edge->edge.bottom; + point.x = _line_compute_intersection_x_for_y (&edge->edge.line, + point.y); + return _cairo_bo_event_queue_insert (event_queue, + CAIRO_BO_EVENT_TYPE_STOP, + edge, NULL, + &point); +} + +static void +_cairo_bo_event_queue_fini (cairo_bo_event_queue_t *event_queue) +{ + _pqueue_fini (&event_queue->pqueue); + _cairo_freepool_fini (&event_queue->pool); +} + +static inline cairo_status_t +_cairo_bo_event_queue_insert_if_intersect_below_current_y (cairo_bo_event_queue_t *event_queue, + cairo_bo_edge_t *left, + cairo_bo_edge_t *right) +{ + cairo_bo_point32_t intersection; + + if (_line_equal (&left->edge.line, &right->edge.line)) + return CAIRO_STATUS_SUCCESS; + + /* The names "left" and "right" here are correct descriptions of + * the order of the two edges within the active edge list. So if a + * slope comparison also puts left less than right, then we know + * that the intersection of these two segments has already + * occurred before the current sweep line position. */ + if (_slope_compare (left, right) <= 0) + return CAIRO_STATUS_SUCCESS; + + if (! _cairo_bo_edge_intersect (left, right, &intersection)) + return CAIRO_STATUS_SUCCESS; + + return _cairo_bo_event_queue_insert (event_queue, + CAIRO_BO_EVENT_TYPE_INTERSECTION, + left, right, + &intersection); +} + +static void +_cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line) +{ + sweep_line->head = NULL; + sweep_line->current_y = INT32_MIN; + sweep_line->current_edge = NULL; +} + +static cairo_status_t +_cairo_bo_sweep_line_insert (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (sweep_line->current_edge != NULL) { + cairo_bo_edge_t *prev, *next; + int cmp; + + cmp = _cairo_bo_sweep_line_compare_edges (sweep_line, + sweep_line->current_edge, + edge); + if (cmp < 0) { + prev = sweep_line->current_edge; + next = prev->next; + while (next != NULL && + _cairo_bo_sweep_line_compare_edges (sweep_line, + next, edge) < 0) + { + prev = next, next = prev->next; + } + + prev->next = edge; + edge->prev = prev; + edge->next = next; + if (next != NULL) + next->prev = edge; + } else if (cmp > 0) { + next = sweep_line->current_edge; + prev = next->prev; + while (prev != NULL && + _cairo_bo_sweep_line_compare_edges (sweep_line, + prev, edge) > 0) + { + next = prev, prev = next->prev; + } + + next->prev = edge; + edge->next = next; + edge->prev = prev; + if (prev != NULL) + prev->next = edge; + else + sweep_line->head = edge; + } else { + prev = sweep_line->current_edge; + edge->prev = prev; + edge->next = prev->next; + if (prev->next != NULL) + prev->next->prev = edge; + prev->next = edge; + } + } else { + sweep_line->head = edge; + } + + sweep_line->current_edge = edge; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_bo_sweep_line_delete (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *edge) +{ + if (edge->prev != NULL) + edge->prev->next = edge->next; + else + sweep_line->head = edge->next; + + if (edge->next != NULL) + edge->next->prev = edge->prev; + + if (sweep_line->current_edge == edge) + sweep_line->current_edge = edge->prev ? edge->prev : edge->next; +} + +static void +_cairo_bo_sweep_line_swap (cairo_bo_sweep_line_t *sweep_line, + cairo_bo_edge_t *left, + cairo_bo_edge_t *right) +{ + if (left->prev != NULL) + left->prev->next = right; + else + sweep_line->head = right; + + if (right->next != NULL) + right->next->prev = left; + + left->next = right->next; + right->next = left; + + right->prev = left->prev; + left->prev = right; +} + +static inline cairo_bool_t +edges_colinear (const cairo_bo_edge_t *a, const cairo_bo_edge_t *b) +{ + if (_line_equal (&a->edge.line, &b->edge.line)) + return TRUE; + + if (_slope_compare (a, b)) + return FALSE; + + /* The choice of y is not truly arbitrary since we must guarantee that it + * is greater than the start of either line. + */ + if (a->edge.line.p1.y == b->edge.line.p1.y) { + return a->edge.line.p1.x == b->edge.line.p1.x; + } else if (a->edge.line.p2.y == b->edge.line.p2.y) { + return a->edge.line.p2.x == b->edge.line.p2.x; + } else if (a->edge.line.p1.y < b->edge.line.p1.y) { + return edge_compare_for_y_against_x (b, + a->edge.line.p1.y, + a->edge.line.p1.x) == 0; + } else { + return edge_compare_for_y_against_x (a, + b->edge.line.p1.y, + b->edge.line.p1.x) == 0; + } +} + +static void +_cairo_bo_edge_end (cairo_bo_edge_t *left, + int32_t bot, + cairo_polygon_t *polygon) +{ + cairo_bo_deferred_t *d = &left->deferred; + + if (likely (d->top < bot)) { + _cairo_polygon_add_line (polygon, + &left->edge.line, + d->top, bot, + 1); + _cairo_polygon_add_line (polygon, + &d->right->edge.line, + d->top, bot, + -1); + } + + d->right = NULL; +} + + +static inline void +_cairo_bo_edge_start_or_continue (cairo_bo_edge_t *left, + cairo_bo_edge_t *right, + int top, + cairo_polygon_t *polygon) +{ + if (left->deferred.right == right) + return; + + if (left->deferred.right != NULL) { + if (right != NULL && edges_colinear (left->deferred.right, right)) + { + /* continuation on right, so just swap edges */ + left->deferred.right = right; + return; + } + + _cairo_bo_edge_end (left, top, polygon); + } + + if (right != NULL && ! edges_colinear (left, right)) { + left->deferred.top = top; + left->deferred.right = right; + } +} + +static inline void +_active_edges_to_polygon (cairo_bo_edge_t *left, + int32_t top, + cairo_fill_rule_t fill_rule, + cairo_polygon_t *polygon) +{ + cairo_bo_edge_t *right; + unsigned int mask; + + if (fill_rule == CAIRO_FILL_RULE_WINDING) + mask = ~0; + else + mask = 1; + + while (left != NULL) { + int in_out = left->edge.dir; + + right = left->next; + if (left->deferred.right == NULL) { + while (right != NULL && right->deferred.right == NULL) + right = right->next; + + if (right != NULL && edges_colinear (left, right)) { + /* continuation on left */ + left->deferred = right->deferred; + right->deferred.right = NULL; + } + } + + right = left->next; + while (right != NULL) { + if (right->deferred.right != NULL) + _cairo_bo_edge_end (right, top, polygon); + + in_out += right->edge.dir; + if ((in_out & mask) == 0) { + /* skip co-linear edges */ + if (right->next == NULL || !edges_colinear (right, right->next)) + break; + } + + right = right->next; + } + + _cairo_bo_edge_start_or_continue (left, right, top, polygon); + + left = right; + if (left != NULL) + left = left->next; + } +} + + +static cairo_status_t +_cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_event_t **start_events, + int num_events, + cairo_fill_rule_t fill_rule, + cairo_polygon_t *polygon) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; /* silence compiler */ + cairo_bo_event_queue_t event_queue; + cairo_bo_sweep_line_t sweep_line; + cairo_bo_event_t *event; + cairo_bo_edge_t *left, *right; + cairo_bo_edge_t *e1, *e2; + + _cairo_bo_event_queue_init (&event_queue, start_events, num_events); + _cairo_bo_sweep_line_init (&sweep_line); + + while ((event = _cairo_bo_event_dequeue (&event_queue))) { + if (event->point.y != sweep_line.current_y) { + _active_edges_to_polygon (sweep_line.head, + sweep_line.current_y, + fill_rule, polygon); + + sweep_line.current_y = event->point.y; + } + + switch (event->type) { + case CAIRO_BO_EVENT_TYPE_START: + e1 = &((cairo_bo_start_event_t *) event)->edge; + + status = _cairo_bo_sweep_line_insert (&sweep_line, e1); + if (unlikely (status)) + goto unwind; + + status = _cairo_bo_event_queue_insert_stop (&event_queue, e1); + if (unlikely (status)) + goto unwind; + + left = e1->prev; + right = e1->next; + + if (left != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, e1); + if (unlikely (status)) + goto unwind; + } + + if (right != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, e1, right); + if (unlikely (status)) + goto unwind; + } + + break; + + case CAIRO_BO_EVENT_TYPE_STOP: + e1 = ((cairo_bo_queue_event_t *) event)->e1; + _cairo_bo_event_queue_delete (&event_queue, event); + + left = e1->prev; + right = e1->next; + + _cairo_bo_sweep_line_delete (&sweep_line, e1); + + if (e1->deferred.right != NULL) + _cairo_bo_edge_end (e1, e1->edge.bottom, polygon); + + if (left != NULL && right != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, right); + if (unlikely (status)) + goto unwind; + } + + break; + + case CAIRO_BO_EVENT_TYPE_INTERSECTION: + e1 = ((cairo_bo_queue_event_t *) event)->e1; + e2 = ((cairo_bo_queue_event_t *) event)->e2; + _cairo_bo_event_queue_delete (&event_queue, event); + + /* skip this intersection if its edges are not adjacent */ + if (e2 != e1->next) + break; + + left = e1->prev; + right = e2->next; + + _cairo_bo_sweep_line_swap (&sweep_line, e1, e2); + + /* after the swap e2 is left of e1 */ + + if (left != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, e2); + if (unlikely (status)) + goto unwind; + } + + if (right != NULL) { + status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, e1, right); + if (unlikely (status)) + goto unwind; + } + + break; + } + } + + unwind: + _cairo_bo_event_queue_fini (&event_queue); + + return status; +} + +cairo_status_t +_cairo_polygon_reduce (cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule) +{ + cairo_status_t status; + cairo_bo_start_event_t stack_events[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_start_event_t)]; + cairo_bo_start_event_t *events; + cairo_bo_event_t *stack_event_ptrs[ARRAY_LENGTH (stack_events) + 1]; + cairo_bo_event_t **event_ptrs; + int num_limits; + int num_events; + int i; + + num_events = polygon->num_edges; + if (unlikely (0 == num_events)) + return CAIRO_STATUS_SUCCESS; + + if (DEBUG_POLYGON) { + FILE *file = fopen ("reduce_in.txt", "w"); + _cairo_debug_print_polygon (file, polygon); + fclose (file); + } + + events = stack_events; + event_ptrs = stack_event_ptrs; + if (num_events > ARRAY_LENGTH (stack_events)) { + events = _cairo_malloc_ab_plus_c (num_events, + sizeof (cairo_bo_start_event_t) + + sizeof (cairo_bo_event_t *), + sizeof (cairo_bo_event_t *)); + if (unlikely (events == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + event_ptrs = (cairo_bo_event_t **) (events + num_events); + } + + for (i = 0; i < num_events; i++) { + event_ptrs[i] = (cairo_bo_event_t *) &events[i]; + + events[i].type = CAIRO_BO_EVENT_TYPE_START; + events[i].point.y = polygon->edges[i].top; + events[i].point.x = + _line_compute_intersection_x_for_y (&polygon->edges[i].line, + events[i].point.y); + + events[i].edge.edge = polygon->edges[i]; + events[i].edge.deferred.right = NULL; + events[i].edge.prev = NULL; + events[i].edge.next = NULL; + } + + num_limits = polygon->num_limits; polygon->num_limits = 0; + polygon->num_edges = 0; + + status = _cairo_bentley_ottmann_tessellate_bo_edges (event_ptrs, + num_events, + fill_rule, + polygon); + polygon->num_limits = num_limits; + + if (events != stack_events) + free (events); + + if (DEBUG_POLYGON) { + FILE *file = fopen ("reduce_out.txt", "w"); + _cairo_debug_print_polygon (file, polygon); + fclose (file); + } + + return status; +} diff --git a/src/cairo-polygon.c b/src/cairo-polygon.c new file mode 100644 index 000000000..b0424f6e7 --- /dev/null +++ b/src/cairo-polygon.c @@ -0,0 +1,608 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-boxes-private.h" +#include "cairo-contour-private.h" +#include "cairo-error-private.h" + +#define DEBUG_POLYGON 0 + +#if DEBUG_POLYGON && !NDEBUG +static void +assert_last_edge_is_valid(cairo_polygon_t *polygon, + const cairo_box_t *limit) +{ + cairo_edge_t *edge; + cairo_fixed_t x; + + edge = &polygon->edges[polygon->num_edges-1]; + + assert (edge->bottom > edge->top); + assert (edge->top >= limit->p1.y); + assert (edge->bottom <= limit->p2.y); + + x = _cairo_edge_compute_intersection_x_for_y (&edge->line.p1, + &edge->line.p2, + edge->top); + assert (x >= limit->p1.x); + assert (x <= limit->p2.x); + + x = _cairo_edge_compute_intersection_x_for_y (&edge->line.p1, + &edge->line.p2, + edge->bottom); + assert (x >= limit->p1.x); + assert (x <= limit->p2.x); +} +#else +#define assert_last_edge_is_valid(p, l) +#endif + +static void +_cairo_polygon_add_edge (cairo_polygon_t *polygon, + const cairo_point_t *p1, + const cairo_point_t *p2, + int dir); + +void +_cairo_polygon_limit (cairo_polygon_t *polygon, + const cairo_box_t *limits, + int num_limits) +{ + int n; + + polygon->limits = limits; + polygon->num_limits = num_limits; + + if (polygon->num_limits) { + polygon->limit = limits[0]; + for (n = 1; n < num_limits; n++) { + if (limits[n].p1.x < polygon->limit.p1.x) + polygon->limit.p1.x = limits[n].p1.x; + + if (limits[n].p1.y < polygon->limit.p1.y) + polygon->limit.p1.y = limits[n].p1.y; + + if (limits[n].p2.x > polygon->limit.p2.x) + polygon->limit.p2.x = limits[n].p2.x; + + if (limits[n].p2.y > polygon->limit.p2.y) + polygon->limit.p2.y = limits[n].p2.y; + } + } +} + +void +_cairo_polygon_limit_to_clip (cairo_polygon_t *polygon, + const cairo_clip_t *clip) +{ + if (clip) + _cairo_polygon_limit (polygon, clip->boxes, clip->num_boxes); + else + _cairo_polygon_limit (polygon, 0, 0); +} + +void +_cairo_polygon_init (cairo_polygon_t *polygon, + const cairo_box_t *limits, + int num_limits) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (polygon, sizeof (cairo_polygon_t))); + + polygon->status = CAIRO_STATUS_SUCCESS; + + polygon->num_edges = 0; + + polygon->edges = polygon->edges_embedded; + polygon->edges_size = ARRAY_LENGTH (polygon->edges_embedded); + + polygon->extents.p1.x = polygon->extents.p1.y = INT32_MAX; + polygon->extents.p2.x = polygon->extents.p2.y = INT32_MIN; + + _cairo_polygon_limit (polygon, limits, num_limits); +} + +void +_cairo_polygon_init_with_clip (cairo_polygon_t *polygon, + const cairo_clip_t *clip) +{ + if (clip) + _cairo_polygon_init (polygon, clip->boxes, clip->num_boxes); + else + _cairo_polygon_init (polygon, 0, 0); +} + +cairo_status_t +_cairo_polygon_init_boxes (cairo_polygon_t *polygon, + const cairo_boxes_t *boxes) +{ + const struct _cairo_boxes_chunk *chunk; + int i; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (polygon, sizeof (cairo_polygon_t))); + + polygon->status = CAIRO_STATUS_SUCCESS; + + polygon->num_edges = 0; + + polygon->edges = polygon->edges_embedded; + polygon->edges_size = ARRAY_LENGTH (polygon->edges_embedded); + if (boxes->num_boxes > ARRAY_LENGTH (polygon->edges_embedded)/2) { + polygon->edges_size = 2 * boxes->num_boxes; + polygon->edges = _cairo_malloc_ab (polygon->edges_size, + 2*sizeof(cairo_edge_t)); + if (unlikely (polygon->edges == NULL)) + return polygon->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + polygon->extents.p1.x = polygon->extents.p1.y = INT32_MAX; + polygon->extents.p2.x = polygon->extents.p2.y = INT32_MIN; + + polygon->limits = NULL; + polygon->num_limits = 0; + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_point_t p1, p2; + + p1 = chunk->base[i].p1; + p2.x = p1.x; + p2.y = chunk->base[i].p2.y; + _cairo_polygon_add_edge (polygon, &p1, &p2, 1); + + p1 = chunk->base[i].p2; + p2.x = p1.x; + p2.y = chunk->base[i].p1.y; + _cairo_polygon_add_edge (polygon, &p1, &p2, 1); + } + } + + return polygon->status; +} + +cairo_status_t +_cairo_polygon_init_box_array (cairo_polygon_t *polygon, + cairo_box_t *boxes, + int num_boxes) +{ + int i; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (polygon, sizeof (cairo_polygon_t))); + + polygon->status = CAIRO_STATUS_SUCCESS; + + polygon->num_edges = 0; + + polygon->edges = polygon->edges_embedded; + polygon->edges_size = ARRAY_LENGTH (polygon->edges_embedded); + if (num_boxes > ARRAY_LENGTH (polygon->edges_embedded)/2) { + polygon->edges_size = 2 * num_boxes; + polygon->edges = _cairo_malloc_ab (polygon->edges_size, + 2*sizeof(cairo_edge_t)); + if (unlikely (polygon->edges == NULL)) + return polygon->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + polygon->extents.p1.x = polygon->extents.p1.y = INT32_MAX; + polygon->extents.p2.x = polygon->extents.p2.y = INT32_MIN; + + polygon->limits = NULL; + polygon->num_limits = 0; + + for (i = 0; i < num_boxes; i++) { + cairo_point_t p1, p2; + + p1 = boxes[i].p1; + p2.x = p1.x; + p2.y = boxes[i].p2.y; + _cairo_polygon_add_edge (polygon, &p1, &p2, 1); + + p1 = boxes[i].p2; + p2.x = p1.x; + p2.y = boxes[i].p1.y; + _cairo_polygon_add_edge (polygon, &p1, &p2, 1); + } + + return polygon->status; +} + + +void +_cairo_polygon_fini (cairo_polygon_t *polygon) +{ + if (polygon->edges != polygon->edges_embedded) + free (polygon->edges); + + VG (VALGRIND_MAKE_MEM_NOACCESS (polygon, sizeof (cairo_polygon_t))); +} + +/* make room for at least one more edge */ +static cairo_bool_t +_cairo_polygon_grow (cairo_polygon_t *polygon) +{ + cairo_edge_t *new_edges; + int old_size = polygon->edges_size; + int new_size = 4 * old_size; + + if (CAIRO_INJECT_FAULT ()) { + polygon->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + if (polygon->edges == polygon->edges_embedded) { + new_edges = _cairo_malloc_ab (new_size, sizeof (cairo_edge_t)); + if (new_edges != NULL) + memcpy (new_edges, polygon->edges, old_size * sizeof (cairo_edge_t)); + } else { + new_edges = _cairo_realloc_ab (polygon->edges, + new_size, sizeof (cairo_edge_t)); + } + + if (unlikely (new_edges == NULL)) { + polygon->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + polygon->edges = new_edges; + polygon->edges_size = new_size; + + return TRUE; +} + +static void +_add_edge (cairo_polygon_t *polygon, + const cairo_point_t *p1, + const cairo_point_t *p2, + int top, int bottom, + int dir) +{ + cairo_edge_t *edge; + + assert (top < bottom); + + if (unlikely (polygon->num_edges == polygon->edges_size)) { + if (! _cairo_polygon_grow (polygon)) + return; + } + + edge = &polygon->edges[polygon->num_edges++]; + edge->line.p1 = *p1; + edge->line.p2 = *p2; + edge->top = top; + edge->bottom = bottom; + edge->dir = dir; + + if (top < polygon->extents.p1.y) + polygon->extents.p1.y = top; + if (bottom > polygon->extents.p2.y) + polygon->extents.p2.y = bottom; + + if (p1->x < polygon->extents.p1.x || p1->x > polygon->extents.p2.x) { + cairo_fixed_t x = p1->x; + if (top != p1->y) + x = _cairo_edge_compute_intersection_x_for_y (p1, p2, top); + if (x < polygon->extents.p1.x) + polygon->extents.p1.x = x; + if (x > polygon->extents.p2.x) + polygon->extents.p2.x = x; + } + + if (p2->x < polygon->extents.p1.x || p2->x > polygon->extents.p2.x) { + cairo_fixed_t x = p2->x; + if (bottom != p2->y) + x = _cairo_edge_compute_intersection_x_for_y (p1, p2, bottom); + if (x < polygon->extents.p1.x) + polygon->extents.p1.x = x; + if (x > polygon->extents.p2.x) + polygon->extents.p2.x = x; + } +} + +static void +_add_clipped_edge (cairo_polygon_t *polygon, + const cairo_point_t *p1, + const cairo_point_t *p2, + const int top, const int bottom, + const int dir) +{ + cairo_point_t bot_left, top_right; + cairo_fixed_t top_y, bot_y; + int n; + + for (n = 0; n < polygon->num_limits; n++) { + const cairo_box_t *limits = &polygon->limits[n]; + cairo_fixed_t pleft, pright; + + if (top >= limits->p2.y) + continue; + if (bottom <= limits->p1.y) + continue; + + bot_left.x = limits->p1.x; + bot_left.y = limits->p2.y; + + top_right.x = limits->p2.x; + top_right.y = limits->p1.y; + + /* The useful region */ + top_y = MAX (top, limits->p1.y); + bot_y = MIN (bottom, limits->p2.y); + + /* The projection of the edge on the horizontal axis */ + pleft = MIN (p1->x, p2->x); + pright = MAX (p1->x, p2->x); + + if (limits->p1.x <= pleft && pright <= limits->p2.x) { + /* Projection of the edge completely contained in the box: + * clip vertically by restricting top and bottom */ + + _add_edge (polygon, p1, p2, top_y, bot_y, dir); + assert_last_edge_is_valid (polygon, limits); + } else if (pright <= limits->p1.x) { + /* Projection of the edge to the left of the box: + * replace with the left side of the box (clipped top/bottom) */ + + _add_edge (polygon, &limits->p1, &bot_left, top_y, bot_y, dir); + assert_last_edge_is_valid (polygon, limits); + } else if (limits->p2.x <= pleft) { + /* Projection of the edge to the right of the box: + * replace with the right side of the box (clipped top/bottom) */ + + _add_edge (polygon, &top_right, &limits->p2, top_y, bot_y, dir); + assert_last_edge_is_valid (polygon, limits); + } else { + /* The edge and the box intersect in a generic way */ + cairo_fixed_t left_y, right_y; + cairo_bool_t top_left_to_bottom_right; + + /* + * The edge intersects the lines corresponding to the left + * and right sides of the limit box at left_y and right_y, + * but we need to add edges for the range from top_y to + * bot_y. + * + * For both intersections, there are three cases: + * + * 1) It is outside the vertical range of the limit + * box. In this case we can simply further clip the + * edge we will be emitting (i.e. restrict its + * top/bottom limits to those of the limit box). + * + * 2) It is inside the vertical range of the limit + * box. In this case, we need to add the vertical edge + * connecting the correct vertex to the intersection, + * in order to preserve the winding count. + * + * 3) It is exactly on the box. In this case, do nothing. + * + * These operations restrict the active range (stored in + * top_y/bot_y) so that the p1-p2 edge is completely + * inside the box if it is clipped to this vertical range. + */ + + top_left_to_bottom_right = (p1->x <= p2->x) == (p1->y <= p2->y); + if (top_left_to_bottom_right) { + if (pleft >= limits->p1.x) { + left_y = top_y; + } else { + left_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, + limits->p1.x); + if (_cairo_edge_compute_intersection_x_for_y (p1, p2, left_y) < limits->p1.x) + left_y++; + } + + left_y = MIN (left_y, bot_y); + if (top_y < left_y) { + _add_edge (polygon, &limits->p1, &bot_left, + top_y, left_y, dir); + assert_last_edge_is_valid (polygon, limits); + top_y = left_y; + } + + if (pright <= limits->p2.x) { + right_y = bot_y; + } else { + right_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, + limits->p2.x); + if (_cairo_edge_compute_intersection_x_for_y (p1, p2, right_y) > limits->p2.x) + right_y--; + } + + right_y = MAX (right_y, top_y); + if (bot_y > right_y) { + _add_edge (polygon, &top_right, &limits->p2, + right_y, bot_y, dir); + assert_last_edge_is_valid (polygon, limits); + bot_y = right_y; + } + } else { + if (pright <= limits->p2.x) { + right_y = top_y; + } else { + right_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, + limits->p2.x); + if (_cairo_edge_compute_intersection_x_for_y (p1, p2, right_y) > limits->p2.x) + right_y++; + } + + right_y = MIN (right_y, bot_y); + if (top_y < right_y) { + _add_edge (polygon, &top_right, &limits->p2, + top_y, right_y, dir); + assert_last_edge_is_valid (polygon, limits); + top_y = right_y; + } + + if (pleft >= limits->p1.x) { + left_y = bot_y; + } else { + left_y = _cairo_edge_compute_intersection_y_for_x (p1, p2, + limits->p1.x); + if (_cairo_edge_compute_intersection_x_for_y (p1, p2, left_y) < limits->p1.x) + left_y--; + } + + left_y = MAX (left_y, top_y); + if (bot_y > left_y) { + _add_edge (polygon, &limits->p1, &bot_left, + left_y, bot_y, dir); + assert_last_edge_is_valid (polygon, limits); + bot_y = left_y; + } + } + + if (top_y != bot_y) { + _add_edge (polygon, p1, p2, top_y, bot_y, dir); + assert_last_edge_is_valid (polygon, limits); + } + } + } +} + +static void +_cairo_polygon_add_edge (cairo_polygon_t *polygon, + const cairo_point_t *p1, + const cairo_point_t *p2, + int dir) +{ + /* drop horizontal edges */ + if (p1->y == p2->y) + return; + + if (p1->y > p2->y) { + const cairo_point_t *t; + t = p1, p1 = p2, p2 = t; + dir = -dir; + } + + if (polygon->num_limits) { + if (p2->y <= polygon->limit.p1.y) + return; + + if (p1->y >= polygon->limit.p2.y) + return; + + _add_clipped_edge (polygon, p1, p2, p1->y, p2->y, dir); + } else + _add_edge (polygon, p1, p2, p1->y, p2->y, dir); +} + +cairo_status_t +_cairo_polygon_add_external_edge (void *polygon, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + _cairo_polygon_add_edge (polygon, p1, p2, 1); + return _cairo_polygon_status (polygon); +} + +cairo_status_t +_cairo_polygon_add_line (cairo_polygon_t *polygon, + const cairo_line_t *line, + int top, int bottom, + int dir) +{ + /* drop horizontal edges */ + if (line->p1.y == line->p2.y) + return CAIRO_STATUS_SUCCESS; + + if (bottom <= top) + return CAIRO_STATUS_SUCCESS; + + if (polygon->num_limits) { + if (line->p2.y <= polygon->limit.p1.y) + return CAIRO_STATUS_SUCCESS; + + if (line->p1.y >= polygon->limit.p2.y) + return CAIRO_STATUS_SUCCESS; + + _add_clipped_edge (polygon, &line->p1, &line->p2, top, bottom, dir); + } else + _add_edge (polygon, &line->p1, &line->p2, top, bottom, dir); + + return polygon->status; +} + +cairo_status_t +_cairo_polygon_add_contour (cairo_polygon_t *polygon, + const cairo_contour_t *contour) +{ + const struct _cairo_contour_chain *chain; + const cairo_point_t *prev = NULL; + int i; + + if (contour->chain.num_points <= 1) + return CAIRO_INT_STATUS_SUCCESS; + + prev = &contour->chain.points[0]; + for (chain = &contour->chain; chain; chain = chain->next) { + for (i = 0; i < chain->num_points; i++) { + _cairo_polygon_add_edge (polygon, prev, &chain->points[i], + contour->direction); + prev = &chain->points[i]; + } + } + + return polygon->status; +} + +void +_cairo_polygon_translate (cairo_polygon_t *polygon, int dx, int dy) +{ + int n; + + dx = _cairo_fixed_from_int (dx); + dy = _cairo_fixed_from_int (dy); + + polygon->extents.p1.x += dx; + polygon->extents.p2.x += dx; + polygon->extents.p1.y += dy; + polygon->extents.p2.y += dy; + + for (n = 0; n < polygon->num_edges; n++) { + cairo_edge_t *e = &polygon->edges[n]; + + e->top += dy; + e->bottom += dy; + + e->line.p1.x += dx; + e->line.p2.x += dx; + e->line.p1.y += dy; + e->line.p2.y += dy; + } +} diff --git a/src/cairo-private.h b/src/cairo-private.h new file mode 100644 index 000000000..9f4f55b7c --- /dev/null +++ b/src/cairo-private.h @@ -0,0 +1,64 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PRIVATE_H +#define CAIRO_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-reference-count-private.h" + +CAIRO_BEGIN_DECLS + +struct _cairo { + cairo_reference_count_t ref_count; + cairo_status_t status; + cairo_user_data_array_t user_data; + + const cairo_backend_t *backend; +}; + +cairo_private cairo_t * +_cairo_create_in_error (cairo_status_t status); + +cairo_private void +_cairo_init (cairo_t *cr, + const cairo_backend_t *backend); + +cairo_private void +_cairo_fini (cairo_t *cr); + +CAIRO_END_DECLS + +#endif /* CAIRO_PRIVATE_H */ diff --git a/src/cairo-ps-surface-private.h b/src/cairo-ps-surface-private.h new file mode 100644 index 000000000..1d5d27d49 --- /dev/null +++ b/src/cairo-ps-surface-private.h @@ -0,0 +1,104 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Keith Packard + */ + +#ifndef CAIRO_PS_SURFACE_PRIVATE_H +#define CAIRO_PS_SURFACE_PRIVATE_H + +#include "cairo-ps.h" + +#include "cairo-surface-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-pdf-operators-private.h" + +#include + +typedef struct cairo_ps_surface { + cairo_surface_t base; + + /* Here final_stream corresponds to the stream/file passed to + * cairo_ps_surface_create surface is built. Meanwhile stream is a + * temporary stream in which the file output is built, (so that + * the header can be built and inserted into the target stream + * before the contents of the temporary stream are copied). */ + cairo_output_stream_t *final_stream; + + FILE *tmpfile; + cairo_output_stream_t *stream; + + cairo_bool_t eps; + cairo_content_t content; + double width; + double height; + cairo_rectangle_int_t page_bbox; + int bbox_x1, bbox_y1, bbox_x2, bbox_y2; + cairo_matrix_t cairo_to_ps; + + cairo_bool_t use_string_datasource; + + cairo_bool_t current_pattern_is_solid_color; + cairo_color_t current_color; + + int num_pages; + + cairo_paginated_mode_t paginated_mode; + + cairo_bool_t force_fallbacks; + cairo_bool_t has_creation_date; + time_t creation_date; + + cairo_scaled_font_subsets_t *font_subsets; + + cairo_list_t document_media; + cairo_array_t dsc_header_comments; + cairo_array_t dsc_setup_comments; + cairo_array_t dsc_page_setup_comments; + + cairo_array_t *dsc_comment_target; + + cairo_ps_level_t ps_level; + cairo_ps_level_t ps_level_used; + + cairo_surface_clipper_t clipper; + + cairo_pdf_operators_t pdf_operators; + cairo_surface_t *paginated_surface; +} cairo_ps_surface_t; + +#endif /* CAIRO_PS_SURFACE_PRIVATE_H */ diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c new file mode 100644 index 000000000..03eba62db --- /dev/null +++ b/src/cairo-ps-surface.c @@ -0,0 +1,4694 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * Copyright © 2005 Red Hat, Inc + * Copyright © 2007,2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Keith Packard + * Adrian Johnson + */ + + +/* + * Design of the PS output: + * + * The PS output is harmonised with the PDF operations using PS procedures + * to emulate the PDF operators. + * + * This has a number of advantages: + * 1. A large chunk of code is shared between the PDF and PS backends. + * See cairo-pdf-operators. + * 2. Using gs to do PS -> PDF and PDF -> PS will always work well. + */ + +#define _BSD_SOURCE /* for ctime_r(), snprintf(), strdup() */ +#include "cairoint.h" + +#include "cairo-ps.h" +#include "cairo-ps-surface-private.h" + +#include "cairo-pdf-operators-private.h" +#include "cairo-pdf-shading-private.h" + +#include "cairo-array-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-list-inline.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-paginated-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-type3-glyph-surface-private.h" +#include "cairo-image-info-private.h" + +#include +#include +#include +#include +#include + +#define DEBUG_PS 0 + +#if DEBUG_PS +#define DEBUG_FALLBACK(s) \ + fprintf (stderr, "%s::%d -- %s\n", __FUNCTION__, __LINE__, (s)) +#else +#define DEBUG_FALLBACK(s) +#endif + +#ifndef HAVE_CTIME_R +#define ctime_r(T, BUF) ctime (T) +#endif + +/** + * SECTION:cairo-ps + * @Title: PostScript Surfaces + * @Short_Description: Rendering PostScript documents + * @See_Also: #cairo_surface_t + * + * The PostScript surface is used to render cairo graphics to Adobe + * PostScript files and is a multi-page vector surface backend. + **/ + +/** + * CAIRO_HAS_PS_SURFACE: + * + * Defined if the PostScript surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.2 + **/ + +typedef enum { + CAIRO_PS_COMPRESS_NONE, + CAIRO_PS_COMPRESS_LZW, + CAIRO_PS_COMPRESS_DEFLATE + } cairo_ps_compress_t; + +static const cairo_surface_backend_t cairo_ps_surface_backend; +static const cairo_paginated_surface_backend_t cairo_ps_surface_paginated_backend; + +static cairo_bool_t +_cairo_ps_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle); + +static const cairo_ps_level_t _cairo_ps_levels[] = +{ + CAIRO_PS_LEVEL_2, + CAIRO_PS_LEVEL_3 +}; + +#define CAIRO_PS_LEVEL_LAST ARRAY_LENGTH (_cairo_ps_levels) + +static const char * _cairo_ps_level_strings[CAIRO_PS_LEVEL_LAST] = +{ + "PS Level 2", + "PS Level 3" +}; + +static const char *_cairo_ps_supported_mime_types[] = +{ + CAIRO_MIME_TYPE_JPEG, + NULL +}; + +typedef struct _cairo_page_standard_media { + const char *name; + int width; + int height; +} cairo_page_standard_media_t; + +static const cairo_page_standard_media_t _cairo_page_standard_media[] = +{ + { "A0", 2384, 3371 }, + { "A1", 1685, 2384 }, + { "A2", 1190, 1684 }, + { "A3", 842, 1190 }, + { "A4", 595, 842 }, + { "A5", 420, 595 }, + { "B4", 729, 1032 }, + { "B5", 516, 729 }, + { "Letter", 612, 792 }, + { "Tabloid", 792, 1224 }, + { "Ledger", 1224, 792 }, + { "Legal", 612, 1008 }, + { "Statement", 396, 612 }, + { "Executive", 540, 720 }, + { "Folio", 612, 936 }, + { "Quarto", 610, 780 }, + { "10x14", 720, 1008 }, +}; + +typedef struct _cairo_page_media { + char *name; + int width; + int height; + cairo_list_t link; +} cairo_page_media_t; + +static void +_cairo_ps_surface_emit_header (cairo_ps_surface_t *surface) +{ + char ctime_buf[26]; + time_t now; + char **comments; + int i, num_comments; + int level; + const char *eps_header = ""; + cairo_bool_t has_bbox; + + if (surface->has_creation_date) + now = surface->creation_date; + else + now = time (NULL); + + if (surface->ps_level_used == CAIRO_PS_LEVEL_2) + level = 2; + else + level = 3; + + if (surface->eps) + eps_header = " EPSF-3.0"; + + _cairo_output_stream_printf (surface->final_stream, + "%%!PS-Adobe-3.0%s\n" + "%%%%Creator: cairo %s (http://cairographics.org)\n" + "%%%%CreationDate: %s" + "%%%%Pages: %d\n", + eps_header, + cairo_version_string (), + ctime_r (&now, ctime_buf), + surface->num_pages); + + _cairo_output_stream_printf (surface->final_stream, + "%%%%DocumentData: Clean7Bit\n" + "%%%%LanguageLevel: %d\n", + level); + + if (!cairo_list_is_empty (&surface->document_media)) { + cairo_page_media_t *page; + cairo_bool_t first = TRUE; + + cairo_list_foreach_entry (page, cairo_page_media_t, &surface->document_media, link) { + if (first) { + _cairo_output_stream_printf (surface->final_stream, + "%%%%DocumentMedia: "); + first = FALSE; + } else { + _cairo_output_stream_printf (surface->final_stream, + "%%%%+ "); + } + _cairo_output_stream_printf (surface->final_stream, + "%s %d %d 0 () ()\n", + page->name, + page->width, + page->height); + } + } + + has_bbox = FALSE; + num_comments = _cairo_array_num_elements (&surface->dsc_header_comments); + comments = _cairo_array_index (&surface->dsc_header_comments, 0); + for (i = 0; i < num_comments; i++) { + _cairo_output_stream_printf (surface->final_stream, + "%s\n", comments[i]); + if (strncmp (comments[i], "%%BoundingBox:", 14) == 0) + has_bbox = TRUE; + + free (comments[i]); + comments[i] = NULL; + } + + if (!has_bbox) { + _cairo_output_stream_printf (surface->final_stream, + "%%%%BoundingBox: %d %d %d %d\n", + surface->bbox_x1, + surface->bbox_y1, + surface->bbox_x2, + surface->bbox_y2); + } + + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndComments\n"); + + _cairo_output_stream_printf (surface->final_stream, + "%%%%BeginProlog\n"); + + if (surface->eps) { + _cairo_output_stream_printf (surface->final_stream, + "save\n" + "50 dict begin\n"); + } else { + _cairo_output_stream_printf (surface->final_stream, + "/languagelevel where\n" + "{ pop languagelevel } { 1 } ifelse\n" + "%d lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto\n" + " (This print job requires a PostScript Language Level %d printer.) show\n" + " showpage quit } if\n", + level, + level); + } + + _cairo_output_stream_printf (surface->final_stream, + "/q { gsave } bind def\n" + "/Q { grestore } bind def\n" + "/cm { 6 array astore concat } bind def\n" + "/w { setlinewidth } bind def\n" + "/J { setlinecap } bind def\n" + "/j { setlinejoin } bind def\n" + "/M { setmiterlimit } bind def\n" + "/d { setdash } bind def\n" + "/m { moveto } bind def\n" + "/l { lineto } bind def\n" + "/c { curveto } bind def\n" + "/h { closepath } bind def\n" + "/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto\n" + " 0 exch rlineto 0 rlineto closepath } bind def\n" + "/S { stroke } bind def\n" + "/f { fill } bind def\n" + "/f* { eofill } bind def\n" + "/n { newpath } bind def\n" + "/W { clip } bind def\n" + "/W* { eoclip } bind def\n" + "/BT { } bind def\n" + "/ET { } bind def\n" + "/pdfmark where { pop globaldict /?pdfmark /exec load put }\n" + " { globaldict begin /?pdfmark /pop load def /pdfmark\n" + " /cleartomark load def end } ifelse\n" + "/BDC { mark 3 1 roll /BDC pdfmark } bind def\n" + "/EMC { mark /EMC pdfmark } bind def\n" + "/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def\n" + "/Tj { show currentpoint cairo_store_point } bind def\n" + "/TJ {\n" + " {\n" + " dup\n" + " type /stringtype eq\n" + " { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse\n" + " } forall\n" + " currentpoint cairo_store_point\n" + "} bind def\n" + "/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore\n" + " cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def\n" + "/Tf { pop /cairo_font exch def /cairo_font_matrix where\n" + " { pop cairo_selectfont } if } bind def\n" + "/Td { matrix translate cairo_font_matrix matrix concatmatrix dup\n" + " /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point\n" + " /cairo_font where { pop cairo_selectfont } if } bind def\n" + "/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def\n" + " cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def\n" + "/g { setgray } bind def\n" + "/rg { setrgbcolor } bind def\n" + "/d1 { setcachedevice } bind def\n"); + + if (!surface->eps) { + _cairo_output_stream_printf (surface->final_stream, + "/cairo_set_page_size {\n" + " %% Change paper size, but only if different from previous paper size otherwise\n" + " %% duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size\n" + " %% so we use the same when checking if the size changes.\n" + " /setpagedevice where {\n" + " pop currentpagedevice\n" + " /PageSize known {\n" + " 2 copy\n" + " currentpagedevice /PageSize get aload pop\n" + " exch 4 1 roll\n" + " sub abs 5 gt\n" + " 3 1 roll\n" + " sub abs 5 gt\n" + " or\n" + " } {\n" + " true\n" + " } ifelse\n" + " {\n" + " 2 array astore\n" + " 2 dict begin\n" + " /PageSize exch def\n" + " /ImagingBBox null def\n" + " currentdict end\n" + " setpagedevice\n" + " } {\n" + " pop pop\n" + " } ifelse\n" + " } {\n" + " pop\n" + " } ifelse\n" + "} def\n"); + } + + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndProlog\n"); + _cairo_output_stream_printf (surface->final_stream, + "%%%%BeginSetup\n"); + + num_comments = _cairo_array_num_elements (&surface->dsc_setup_comments); + if (num_comments) { + comments = _cairo_array_index (&surface->dsc_setup_comments, 0); + for (i = 0; i < num_comments; i++) { + _cairo_output_stream_printf (surface->final_stream, + "%s\n", comments[i]); + free (comments[i]); + comments[i] = NULL; + } + } +} + +static cairo_status_t +_cairo_ps_surface_emit_type1_font_subset (cairo_ps_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) + + +{ + cairo_type1_subset_t subset; + cairo_status_t status; + int length; + char name[64]; + + snprintf (name, sizeof name, "f-%d-%d", + font_subset->font_id, font_subset->subset_id); + status = _cairo_type1_subset_init (&subset, name, font_subset, TRUE); + if (unlikely (status)) + return status; + + /* FIXME: Figure out document structure convention for fonts */ + +#if DEBUG_PS + _cairo_output_stream_printf (surface->final_stream, + "%% _cairo_ps_surface_emit_type1_font_subset\n"); +#endif + + _cairo_output_stream_printf (surface->final_stream, + "%%%%BeginResource: font %s\n", + subset.base_font); + length = subset.header_length + subset.data_length + subset.trailer_length; + _cairo_output_stream_write (surface->final_stream, subset.data, length); + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndResource\n"); + + _cairo_type1_subset_fini (&subset); + + return CAIRO_STATUS_SUCCESS; +} + + +static cairo_status_t +_cairo_ps_surface_emit_type1_font_fallback (cairo_ps_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) +{ + cairo_type1_subset_t subset; + cairo_status_t status; + int length; + char name[64]; + + snprintf (name, sizeof name, "f-%d-%d", + font_subset->font_id, font_subset->subset_id); + status = _cairo_type1_fallback_init_hex (&subset, name, font_subset); + if (unlikely (status)) + return status; + +#if DEBUG_PS + _cairo_output_stream_printf (surface->final_stream, + "%% _cairo_ps_surface_emit_type1_font_fallback\n"); +#endif + + _cairo_output_stream_printf (surface->final_stream, + "%%%%BeginResource: font %s\n", + subset.base_font); + length = subset.header_length + subset.data_length + subset.trailer_length; + _cairo_output_stream_write (surface->final_stream, subset.data, length); + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndResource\n"); + + _cairo_type1_fallback_fini (&subset); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_ps_surface_emit_truetype_font_subset (cairo_ps_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) + + +{ + cairo_truetype_subset_t subset; + cairo_status_t status; + unsigned int i, begin, end; + + status = _cairo_truetype_subset_init_ps (&subset, font_subset); + if (unlikely (status)) + return status; + + /* FIXME: Figure out document structure convention for fonts */ + +#if DEBUG_PS + _cairo_output_stream_printf (surface->final_stream, + "%% _cairo_ps_surface_emit_truetype_font_subset\n"); +#endif + + _cairo_output_stream_printf (surface->final_stream, + "%%%%BeginResource: font %s\n", + subset.ps_name); + _cairo_output_stream_printf (surface->final_stream, + "11 dict begin\n" + "/FontType 42 def\n" + "/FontName /%s def\n" + "/PaintType 0 def\n" + "/FontMatrix [ 1 0 0 1 0 0 ] def\n" + "/FontBBox [ 0 0 0 0 ] def\n" + "/Encoding 256 array def\n" + "0 1 255 { Encoding exch /.notdef put } for\n", + subset.ps_name); + + /* FIXME: Figure out how subset->x_max etc maps to the /FontBBox */ + + if (font_subset->is_latin) { + for (i = 1; i < 256; i++) { + if (font_subset->latin_to_subset_glyph_index[i] > 0) { + if (font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (surface->final_stream, + "Encoding %d /%s put\n", + i, font_subset->glyph_names[font_subset->latin_to_subset_glyph_index[i]]); + } else { + _cairo_output_stream_printf (surface->final_stream, + "Encoding %d /g%ld put\n", i, font_subset->latin_to_subset_glyph_index[i]); + } + } + } + } else { + for (i = 1; i < font_subset->num_glyphs; i++) { + if (font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (surface->final_stream, + "Encoding %d /%s put\n", + i, font_subset->glyph_names[i]); + } else { + _cairo_output_stream_printf (surface->final_stream, + "Encoding %d /g%d put\n", i, i); + } + } + } + + _cairo_output_stream_printf (surface->final_stream, + "/CharStrings %d dict dup begin\n" + "/.notdef 0 def\n", + font_subset->num_glyphs); + + for (i = 1; i < font_subset->num_glyphs; i++) { + if (font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (surface->final_stream, + "/%s %d def\n", + font_subset->glyph_names[i], i); + } else { + _cairo_output_stream_printf (surface->final_stream, + "/g%d %d def\n", i, i); + } + } + + _cairo_output_stream_printf (surface->final_stream, + "end readonly def\n"); + + _cairo_output_stream_printf (surface->final_stream, + "/sfnts [\n"); + begin = 0; + end = 0; + for (i = 0; i < subset.num_string_offsets; i++) { + end = subset.string_offsets[i]; + _cairo_output_stream_printf (surface->final_stream,"<"); + _cairo_output_stream_write_hex_string (surface->final_stream, + subset.data + begin, end - begin); + _cairo_output_stream_printf (surface->final_stream,"00>\n"); + begin = end; + } + if (subset.data_length > end) { + _cairo_output_stream_printf (surface->final_stream,"<"); + _cairo_output_stream_write_hex_string (surface->final_stream, + subset.data + end, subset.data_length - end); + _cairo_output_stream_printf (surface->final_stream,"00>\n"); + } + + _cairo_output_stream_printf (surface->final_stream, + "] def\n" + "/f-%d-%d currentdict end definefont pop\n", + font_subset->font_id, + font_subset->subset_id); + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndResource\n"); + _cairo_truetype_subset_fini (&subset); + + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_ps_emit_imagemask (cairo_image_surface_t *image, + cairo_output_stream_t *stream) +{ + uint8_t *row, *byte; + int rows, cols; + + /* The only image type supported by Type 3 fonts are 1-bit image + * masks */ + assert (image->format == CAIRO_FORMAT_A1); + + _cairo_output_stream_printf (stream, + "<<\n" + " /ImageType 1\n" + " /Width %d\n" + " /Height %d\n" + " /ImageMatrix [%d 0 0 %d 0 %d]\n" + " /Decode [1 0]\n" + " /BitsPerComponent 1\n", + image->width, + image->height, + image->width, + -image->height, + image->height); + + _cairo_output_stream_printf (stream, + " /DataSource {<\n "); + for (row = image->data, rows = image->height; rows; row += image->stride, rows--) { + for (byte = row, cols = (image->width + 7) / 8; cols; byte++, cols--) { + uint8_t output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte); + _cairo_output_stream_printf (stream, "%02x ", output_byte); + } + _cairo_output_stream_printf (stream, "\n "); + } + _cairo_output_stream_printf (stream, ">}\n>>\n"); + + _cairo_output_stream_printf (stream, + "imagemask\n"); + + return _cairo_output_stream_get_status (stream); +} + +static cairo_int_status_t +_cairo_ps_surface_analyze_user_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_ps_surface_t *surface = closure; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + unsigned int i; + cairo_surface_t *type3_surface; + + type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font, + NULL, + _cairo_ps_emit_imagemask, + surface->font_subsets, + TRUE); + + for (i = 0; i < font_subset->num_glyphs; i++) { + status = _cairo_type3_glyph_surface_analyze_glyph (type3_surface, + font_subset->glyphs[i]); + if (unlikely (status)) + break; + + } + cairo_surface_finish (type3_surface); + cairo_surface_destroy (type3_surface); + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface, + cairo_scaled_font_subset_t *font_subset) + + +{ + cairo_status_t status; + unsigned int i; + cairo_box_t font_bbox = {{0,0},{0,0}}; + cairo_box_t bbox = {{0,0},{0,0}}; + cairo_surface_t *type3_surface; + double width; + + if (font_subset->num_glyphs == 0) + return CAIRO_STATUS_SUCCESS; + +#if DEBUG_PS + _cairo_output_stream_printf (surface->final_stream, + "%% _cairo_ps_surface_emit_type3_font_subset\n"); +#endif + + _cairo_output_stream_printf (surface->final_stream, + "%%%%BeginResource: font\n"); + _cairo_output_stream_printf (surface->final_stream, + "8 dict begin\n" + "/FontType 3 def\n" + "/FontMatrix [1 0 0 1 0 0] def\n" + "/Encoding 256 array def\n" + "0 1 255 { Encoding exch /.notdef put } for\n"); + + type3_surface = _cairo_type3_glyph_surface_create (font_subset->scaled_font, + NULL, + _cairo_ps_emit_imagemask, + surface->font_subsets, + TRUE); + status = type3_surface->status; + if (unlikely (status)) + return status; + + for (i = 0; i < font_subset->num_glyphs; i++) { + if (font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (surface->final_stream, + "Encoding %d /%s put\n", + i, font_subset->glyph_names[i]); + } else { + _cairo_output_stream_printf (surface->final_stream, + "Encoding %d /g%d put\n", i, i); + } + } + + _cairo_output_stream_printf (surface->final_stream, + "/Glyphs [\n"); + + for (i = 0; i < font_subset->num_glyphs; i++) { + _cairo_output_stream_printf (surface->final_stream, + " { %% %d\n", i); + status = _cairo_type3_glyph_surface_emit_glyph (type3_surface, + surface->final_stream, + font_subset->glyphs[i], + &bbox, + &width); + if (unlikely (status)) + break; + + _cairo_output_stream_printf (surface->final_stream, + " }\n"); + if (i == 0) { + font_bbox.p1.x = bbox.p1.x; + font_bbox.p1.y = bbox.p1.y; + font_bbox.p2.x = bbox.p2.x; + font_bbox.p2.y = bbox.p2.y; + } else { + if (bbox.p1.x < font_bbox.p1.x) + font_bbox.p1.x = bbox.p1.x; + if (bbox.p1.y < font_bbox.p1.y) + font_bbox.p1.y = bbox.p1.y; + if (bbox.p2.x > font_bbox.p2.x) + font_bbox.p2.x = bbox.p2.x; + if (bbox.p2.y > font_bbox.p2.y) + font_bbox.p2.y = bbox.p2.y; + } + } + cairo_surface_finish (type3_surface); + cairo_surface_destroy (type3_surface); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->final_stream, + "] def\n" + "/FontBBox [%f %f %f %f] def\n" + "/BuildChar {\n" + " exch /Glyphs get\n" + " exch get\n" + " 10 dict begin exec end\n" + "} bind def\n" + "currentdict\n" + "end\n" + "/f-%d-%d exch definefont pop\n", + _cairo_fixed_to_double (font_bbox.p1.x), + - _cairo_fixed_to_double (font_bbox.p2.y), + _cairo_fixed_to_double (font_bbox.p2.x), + - _cairo_fixed_to_double (font_bbox.p1.y), + font_subset->font_id, + font_subset->subset_id); + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndResource\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_ps_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_ps_surface_t *surface = closure; + cairo_int_status_t status; + + status = _cairo_scaled_font_subset_create_glyph_names (font_subset); + if (_cairo_int_status_is_error (status)) + return status; + + status = _cairo_ps_surface_emit_type1_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_ps_surface_emit_truetype_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_ps_surface_emit_type1_font_fallback (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + ASSERT_NOT_REACHED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_ps_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_ps_surface_t *surface = closure; + cairo_int_status_t status; + + status = _cairo_scaled_font_subset_create_glyph_names (font_subset); + if (_cairo_int_status_is_error (status)) + return status; + + status = _cairo_ps_surface_emit_type3_font_subset (surface, font_subset); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_ps_surface_emit_font_subsets (cairo_ps_surface_t *surface) +{ + cairo_status_t status; + +#if DEBUG_PS + _cairo_output_stream_printf (surface->final_stream, + "%% _cairo_ps_surface_emit_font_subsets\n"); +#endif + + status = _cairo_scaled_font_subsets_foreach_user (surface->font_subsets, + _cairo_ps_surface_analyze_user_font_subset, + surface); + if (unlikely (status)) + return status; + + status = _cairo_scaled_font_subsets_foreach_unscaled (surface->font_subsets, + _cairo_ps_surface_emit_unscaled_font_subset, + surface); + if (unlikely (status)) + return status; + + status = _cairo_scaled_font_subsets_foreach_scaled (surface->font_subsets, + _cairo_ps_surface_emit_scaled_font_subset, + surface); + if (unlikely (status)) + return status; + + return _cairo_scaled_font_subsets_foreach_user (surface->font_subsets, + _cairo_ps_surface_emit_scaled_font_subset, + surface); +} + +static cairo_status_t +_cairo_ps_surface_emit_body (cairo_ps_surface_t *surface) +{ + char buf[4096]; + int n; + + if (ferror (surface->tmpfile) != 0) + return _cairo_error (CAIRO_STATUS_TEMP_FILE_ERROR); + + rewind (surface->tmpfile); + while ((n = fread (buf, 1, sizeof (buf), surface->tmpfile)) > 0) + _cairo_output_stream_write (surface->final_stream, buf, n); + + if (ferror (surface->tmpfile) != 0) + return _cairo_error (CAIRO_STATUS_TEMP_FILE_ERROR); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_ps_surface_emit_footer (cairo_ps_surface_t *surface) +{ + _cairo_output_stream_printf (surface->final_stream, + "%%%%Trailer\n"); + + if (surface->eps) { + _cairo_output_stream_printf (surface->final_stream, + "end restore\n"); + } + + _cairo_output_stream_printf (surface->final_stream, + "%%%%EOF\n"); +} + +static cairo_bool_t +_path_covers_bbox (cairo_ps_surface_t *surface, + cairo_path_fixed_t *path) +{ + cairo_box_t box; + + if (_cairo_path_fixed_is_box (path, &box)) { + cairo_rectangle_int_t rect; + + _cairo_box_round_to_rectangle (&box, &rect); + + /* skip trivial whole-page clips */ + if (_cairo_rectangle_intersect (&rect, &surface->page_bbox)) { + if (rect.x == surface->page_bbox.x && + rect.width == surface->page_bbox.width && + rect.y == surface->page_bbox.y && + rect.height == surface->page_bbox.height) + { + return TRUE; + } + } + } + + return FALSE; +} + +static cairo_status_t +_cairo_ps_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_ps_surface_t *surface = cairo_container_of (clipper, + cairo_ps_surface_t, + clipper); + cairo_output_stream_t *stream = surface->stream; + cairo_status_t status; + + assert (surface->paginated_mode != CAIRO_PAGINATED_MODE_ANALYZE); + +#if DEBUG_PS + _cairo_output_stream_printf (stream, + "%% _cairo_ps_surface_intersect_clip_path\n"); +#endif + + if (path == NULL) { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (stream, "Q q\n"); + + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + + return CAIRO_STATUS_SUCCESS; + } + + if (_path_covers_bbox (surface, path)) + return CAIRO_STATUS_SUCCESS; + + return _cairo_pdf_operators_clip (&surface->pdf_operators, + path, + fill_rule); +} + +/* PLRM specifies a tolerance of 5 points when matching page sizes */ +static cairo_bool_t +_ps_page_dimension_equal (int a, int b) +{ + return (abs (a - b) < 5); +} + +static const char * +_cairo_ps_surface_get_page_media (cairo_ps_surface_t *surface) +{ + int width, height, i; + char buf[50]; + cairo_page_media_t *page; + const char *page_name; + + width = _cairo_lround (surface->width); + height = _cairo_lround (surface->height); + + /* search previously used page sizes */ + cairo_list_foreach_entry (page, cairo_page_media_t, &surface->document_media, link) { + if (_ps_page_dimension_equal (width, page->width) && + _ps_page_dimension_equal (height, page->height)) + return page->name; + } + + /* search list of standard page sizes */ + page_name = NULL; + for (i = 0; i < ARRAY_LENGTH (_cairo_page_standard_media); i++) { + if (_ps_page_dimension_equal (width, _cairo_page_standard_media[i].width) && + _ps_page_dimension_equal (height, _cairo_page_standard_media[i].height)) + { + page_name = _cairo_page_standard_media[i].name; + width = _cairo_page_standard_media[i].width; + height = _cairo_page_standard_media[i].height; + break; + } + } + + page = malloc (sizeof (cairo_page_media_t)); + if (unlikely (page == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + if (page_name) { + page->name = strdup (page_name); + } else { + snprintf (buf, sizeof (buf), "%dx%dmm", + (int) _cairo_lround (surface->width * 25.4/72), + (int) _cairo_lround (surface->height * 25.4/72)); + page->name = strdup (buf); + } + + if (unlikely (page->name == NULL)) { + free (page); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + page->width = width; + page->height = height; + cairo_list_add_tail (&page->link, &surface->document_media); + + return page->name; +} + +static cairo_surface_t * +_cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream, + double width, + double height) +{ + cairo_status_t status, status_ignored; + cairo_ps_surface_t *surface; + + surface = malloc (sizeof (cairo_ps_surface_t)); + if (unlikely (surface == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP; + } + + _cairo_surface_init (&surface->base, + &cairo_ps_surface_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + surface->final_stream = stream; + + surface->tmpfile = tmpfile (); + if (surface->tmpfile == NULL) { + switch (errno) { + case ENOMEM: + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + break; + default: + status = _cairo_error (CAIRO_STATUS_TEMP_FILE_ERROR); + break; + } + goto CLEANUP_SURFACE; + } + + surface->stream = _cairo_output_stream_create_for_file (surface->tmpfile); + status = _cairo_output_stream_get_status (surface->stream); + if (unlikely (status)) + goto CLEANUP_OUTPUT_STREAM; + + surface->font_subsets = _cairo_scaled_font_subsets_create_simple (); + if (unlikely (surface->font_subsets == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_OUTPUT_STREAM; + } + + _cairo_scaled_font_subsets_enable_latin_subset (surface->font_subsets, TRUE); + surface->has_creation_date = FALSE; + surface->eps = FALSE; + surface->ps_level = CAIRO_PS_LEVEL_3; + surface->ps_level_used = CAIRO_PS_LEVEL_2; + surface->width = width; + surface->height = height; + cairo_matrix_init (&surface->cairo_to_ps, 1, 0, 0, -1, 0, height); + surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; + surface->force_fallbacks = FALSE; + surface->content = CAIRO_CONTENT_COLOR_ALPHA; + surface->use_string_datasource = FALSE; + surface->current_pattern_is_solid_color = FALSE; + + surface->page_bbox.x = 0; + surface->page_bbox.y = 0; + surface->page_bbox.width = width; + surface->page_bbox.height = height; + + _cairo_surface_clipper_init (&surface->clipper, + _cairo_ps_surface_clipper_intersect_clip_path); + + _cairo_pdf_operators_init (&surface->pdf_operators, + surface->stream, + &surface->cairo_to_ps, + surface->font_subsets, + TRUE); + surface->num_pages = 0; + + cairo_list_init (&surface->document_media); + _cairo_array_init (&surface->dsc_header_comments, sizeof (char *)); + _cairo_array_init (&surface->dsc_setup_comments, sizeof (char *)); + _cairo_array_init (&surface->dsc_page_setup_comments, sizeof (char *)); + + surface->dsc_comment_target = &surface->dsc_header_comments; + + surface->paginated_surface = _cairo_paginated_surface_create ( + &surface->base, + CAIRO_CONTENT_COLOR_ALPHA, + &cairo_ps_surface_paginated_backend); + status = surface->paginated_surface->status; + if (status == CAIRO_STATUS_SUCCESS) { + /* paginated keeps the only reference to surface now, drop ours */ + cairo_surface_destroy (&surface->base); + return surface->paginated_surface; + } + + _cairo_scaled_font_subsets_destroy (surface->font_subsets); + CLEANUP_OUTPUT_STREAM: + status_ignored = _cairo_output_stream_destroy (surface->stream); + fclose (surface->tmpfile); + CLEANUP_SURFACE: + free (surface); + CLEANUP: + /* destroy stream on behalf of caller */ + status_ignored = _cairo_output_stream_destroy (stream); + + return _cairo_surface_create_in_error (status); +} + +/** + * cairo_ps_surface_create: + * @filename: a filename for the PS output (must be writable), %NULL may be + * used to specify no output. This will generate a PS surface that + * may be queried and used as a source, without generating a + * temporary file. + * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + * + * Creates a PostScript surface of the specified size in points to be + * written to @filename. See cairo_ps_surface_create_for_stream() for + * a more flexible mechanism for handling the PostScript output than + * simply writing it to a named file. + * + * Note that the size of individual pages of the PostScript output can + * vary. See cairo_ps_surface_set_size(). + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_ps_surface_create (const char *filename, + double width_in_points, + double height_in_points) +{ + cairo_output_stream_t *stream; + + stream = _cairo_output_stream_create_for_filename (filename); + if (_cairo_output_stream_get_status (stream)) + return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); + + return _cairo_ps_surface_create_for_stream_internal (stream, + width_in_points, + height_in_points); +} + +/** + * cairo_ps_surface_create_for_stream: + * @write_func: a #cairo_write_func_t to accept the output data, may be %NULL + * to indicate a no-op @write_func. With a no-op @write_func, + * the surface may be queried or used as a source without + * generating any temporary files. + * @closure: the closure argument for @write_func + * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + * + * Creates a PostScript surface of the specified size in points to be + * written incrementally to the stream represented by @write_func and + * @closure. See cairo_ps_surface_create() for a more convenient way + * to simply direct the PostScript output to a named file. + * + * Note that the size of individual pages of the PostScript + * output can vary. See cairo_ps_surface_set_size(). + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points) +{ + cairo_output_stream_t *stream; + + stream = _cairo_output_stream_create (write_func, NULL, closure); + if (_cairo_output_stream_get_status (stream)) + return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); + + return _cairo_ps_surface_create_for_stream_internal (stream, + width_in_points, + height_in_points); +} + +static cairo_bool_t +_cairo_surface_is_ps (cairo_surface_t *surface) +{ + return surface->backend == &cairo_ps_surface_backend; +} + +/* If the abstract_surface is a paginated surface, and that paginated + * surface's target is a ps_surface, then set ps_surface to that + * target. Otherwise return FALSE. + */ +static cairo_bool_t +_extract_ps_surface (cairo_surface_t *surface, + cairo_bool_t set_error_on_failure, + cairo_ps_surface_t **ps_surface) +{ + cairo_surface_t *target; + + if (surface->status) + return FALSE; + if (surface->finished) { + if (set_error_on_failure) + _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (! _cairo_surface_is_paginated (surface)) { + if (set_error_on_failure) + _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return FALSE; + } + + target = _cairo_paginated_surface_get_target (surface); + if (target->status) { + if (set_error_on_failure) + _cairo_surface_set_error (surface, target->status); + return FALSE; + } + if (target->finished) { + if (set_error_on_failure) + _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (! _cairo_surface_is_ps (target)) { + if (set_error_on_failure) + _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return FALSE; + } + + *ps_surface = (cairo_ps_surface_t *) target; + return TRUE; +} + +/** + * cairo_ps_surface_restrict_to_level: + * @surface: a PostScript #cairo_surface_t + * @level: PostScript level + * + * Restricts the generated PostSript file to @level. See + * cairo_ps_get_levels() for a list of available level values that + * can be used here. + * + * This function should only be called before any drawing operations + * have been performed on the given surface. The simplest way to do + * this is to call this function immediately after creating the + * surface. + * + * Since: 1.6 + **/ +void +cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, + cairo_ps_level_t level) +{ + cairo_ps_surface_t *ps_surface = NULL; + + if (! _extract_ps_surface (surface, TRUE, &ps_surface)) + return; + + if (level < CAIRO_PS_LEVEL_LAST) + ps_surface->ps_level = level; +} + +/** + * cairo_ps_get_levels: + * @levels: supported level list + * @num_levels: list length + * + * Used to retrieve the list of supported levels. See + * cairo_ps_surface_restrict_to_level(). + * + * Since: 1.6 + **/ +void +cairo_ps_get_levels (cairo_ps_level_t const **levels, + int *num_levels) +{ + if (levels != NULL) + *levels = _cairo_ps_levels; + + if (num_levels != NULL) + *num_levels = CAIRO_PS_LEVEL_LAST; +} + +/** + * cairo_ps_level_to_string: + * @level: a level id + * + * Get the string representation of the given @level id. This function + * will return %NULL if @level id isn't valid. See cairo_ps_get_levels() + * for a way to get the list of valid level ids. + * + * Return value: the string associated to given level. + * + * Since: 1.6 + **/ +const char * +cairo_ps_level_to_string (cairo_ps_level_t level) +{ + if (level >= CAIRO_PS_LEVEL_LAST) + return NULL; + + return _cairo_ps_level_strings[level]; +} + +/** + * cairo_ps_surface_set_eps: + * @surface: a PostScript #cairo_surface_t + * @eps: %TRUE to output EPS format PostScript + * + * If @eps is %TRUE, the PostScript surface will output Encapsulated + * PostScript. + * + * This function should only be called before any drawing operations + * have been performed on the current page. The simplest way to do + * this is to call this function immediately after creating the + * surface. An Encapsulated PostScript file should never contain more + * than one page. + * + * Since: 1.6 + **/ +void +cairo_ps_surface_set_eps (cairo_surface_t *surface, + cairo_bool_t eps) +{ + cairo_ps_surface_t *ps_surface = NULL; + + if (! _extract_ps_surface (surface, TRUE, &ps_surface)) + return; + + ps_surface->eps = eps; +} + +/** + * cairo_ps_surface_get_eps: + * @surface: a PostScript #cairo_surface_t + * + * Check whether the PostScript surface will output Encapsulated PostScript. + * + * Return value: %TRUE if the surface will output Encapsulated PostScript. + * + * Since: 1.6 + **/ +cairo_public cairo_bool_t +cairo_ps_surface_get_eps (cairo_surface_t *surface) +{ + cairo_ps_surface_t *ps_surface = NULL; + + if (! _extract_ps_surface (surface, FALSE, &ps_surface)) + return FALSE; + + return ps_surface->eps; +} + +/** + * cairo_ps_surface_set_size: + * @surface: a PostScript #cairo_surface_t + * @width_in_points: new surface width, in points (1 point == 1/72.0 inch) + * @height_in_points: new surface height, in points (1 point == 1/72.0 inch) + * + * Changes the size of a PostScript surface for the current (and + * subsequent) pages. + * + * This function should only be called before any drawing operations + * have been performed on the current page. The simplest way to do + * this is to call this function immediately after creating the + * surface or immediately after completing a page with either + * cairo_show_page() or cairo_copy_page(). + * + * Since: 1.2 + **/ +void +cairo_ps_surface_set_size (cairo_surface_t *surface, + double width_in_points, + double height_in_points) +{ + cairo_ps_surface_t *ps_surface = NULL; + cairo_status_t status; + + if (! _extract_ps_surface (surface, TRUE, &ps_surface)) + return; + + ps_surface->width = width_in_points; + ps_surface->height = height_in_points; + cairo_matrix_init (&ps_surface->cairo_to_ps, 1, 0, 0, -1, 0, height_in_points); + _cairo_pdf_operators_set_cairo_to_pdf_matrix (&ps_surface->pdf_operators, + &ps_surface->cairo_to_ps); + status = _cairo_paginated_surface_set_size (ps_surface->paginated_surface, + width_in_points, + height_in_points); + if (status) + status = _cairo_surface_set_error (surface, status); +} + +/** + * cairo_ps_surface_dsc_comment: + * @surface: a PostScript #cairo_surface_t + * @comment: a comment string to be emitted into the PostScript output + * + * Emit a comment into the PostScript output for the given surface. + * + * The comment is expected to conform to the PostScript Language + * Document Structuring Conventions (DSC). Please see that manual for + * details on the available comments and their meanings. In + * particular, the \%\%IncludeFeature comment allows a + * device-independent means of controlling printer device features. So + * the PostScript Printer Description Files Specification will also be + * a useful reference. + * + * The comment string must begin with a percent character (\%) and the + * total length of the string (including any initial percent + * characters) must not exceed 255 characters. Violating either of + * these conditions will place @surface into an error state. But + * beyond these two conditions, this function will not enforce + * conformance of the comment with any particular specification. + * + * The comment string should not have a trailing newline. + * + * The DSC specifies different sections in which particular comments + * can appear. This function provides for comments to be emitted + * within three sections: the header, the Setup section, and the + * PageSetup section. Comments appearing in the first two sections + * apply to the entire document while comments in the BeginPageSetup + * section apply only to a single page. + * + * For comments to appear in the header section, this function should + * be called after the surface is created, but before a call to + * cairo_ps_surface_dsc_begin_setup(). + * + * For comments to appear in the Setup section, this function should + * be called after a call to cairo_ps_surface_dsc_begin_setup() but + * before a call to cairo_ps_surface_dsc_begin_page_setup(). + * + * For comments to appear in the PageSetup section, this function + * should be called after a call to + * cairo_ps_surface_dsc_begin_page_setup(). + * + * Note that it is only necessary to call + * cairo_ps_surface_dsc_begin_page_setup() for the first page of any + * surface. After a call to cairo_show_page() or cairo_copy_page() + * comments are unambiguously directed to the PageSetup section of the + * current page. But it doesn't hurt to call this function at the + * beginning of every page as that consistency may make the calling + * code simpler. + * + * As a final note, cairo automatically generates several comments on + * its own. As such, applications must not manually generate any of + * the following comments: + * + * Header section: \%!PS-Adobe-3.0, \%\%Creator, \%\%CreationDate, \%\%Pages, + * \%\%BoundingBox, \%\%DocumentData, \%\%LanguageLevel, \%\%EndComments. + * + * Setup section: \%\%BeginSetup, \%\%EndSetup + * + * PageSetup section: \%\%BeginPageSetup, \%\%PageBoundingBox, \%\%EndPageSetup. + * + * Other sections: \%\%BeginProlog, \%\%EndProlog, \%\%Page, \%\%Trailer, \%\%EOF + * + * Here is an example sequence showing how this function might be used: + * + * + * cairo_surface_t *surface = cairo_ps_surface_create (filename, width, height); + * ... + * cairo_ps_surface_dsc_comment (surface, "%%Title: My excellent document"); + * cairo_ps_surface_dsc_comment (surface, "%%Copyright: Copyright (C) 2006 Cairo Lover") + * ... + * cairo_ps_surface_dsc_begin_setup (surface); + * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor White"); + * ... + * cairo_ps_surface_dsc_begin_page_setup (surface); + * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A3"); + * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *InputSlot LargeCapacity"); + * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaType Glossy"); + * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor Blue"); + * ... draw to first page here .. + * cairo_show_page (cr); + * ... + * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A5"); + * ... + * + * + * Since: 1.2 + **/ +void +cairo_ps_surface_dsc_comment (cairo_surface_t *surface, + const char *comment) +{ + cairo_ps_surface_t *ps_surface = NULL; + cairo_status_t status; + char *comment_copy; + + if (! _extract_ps_surface (surface, TRUE, &ps_surface)) + return; + + /* A couple of sanity checks on the comment value. */ + if (comment == NULL) { + status = _cairo_surface_set_error (surface, CAIRO_STATUS_NULL_POINTER); + return; + } + + if (comment[0] != '%' || strlen (comment) > 255) { + status = _cairo_surface_set_error (surface, CAIRO_STATUS_INVALID_DSC_COMMENT); + return; + } + + /* Then, copy the comment and store it in the appropriate array. */ + comment_copy = strdup (comment); + if (unlikely (comment_copy == NULL)) { + status = _cairo_surface_set_error (surface, CAIRO_STATUS_NO_MEMORY); + return; + } + + status = _cairo_array_append (ps_surface->dsc_comment_target, &comment_copy); + if (unlikely (status)) { + free (comment_copy); + status = _cairo_surface_set_error (surface, status); + return; + } +} + +/** + * cairo_ps_surface_dsc_begin_setup: + * @surface: a PostScript #cairo_surface_t + * + * This function indicates that subsequent calls to + * cairo_ps_surface_dsc_comment() should direct comments to the Setup + * section of the PostScript output. + * + * This function should be called at most once per surface, and must + * be called before any call to cairo_ps_surface_dsc_begin_page_setup() + * and before any drawing is performed to the surface. + * + * See cairo_ps_surface_dsc_comment() for more details. + * + * Since: 1.2 + **/ +void +cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface) +{ + cairo_ps_surface_t *ps_surface = NULL; + + if (! _extract_ps_surface (surface, TRUE, &ps_surface)) + return; + + if (ps_surface->dsc_comment_target == &ps_surface->dsc_header_comments) + ps_surface->dsc_comment_target = &ps_surface->dsc_setup_comments; +} + +/** + * cairo_ps_surface_dsc_begin_page_setup: + * @surface: a PostScript #cairo_surface_t + * + * This function indicates that subsequent calls to + * cairo_ps_surface_dsc_comment() should direct comments to the + * PageSetup section of the PostScript output. + * + * This function call is only needed for the first page of a + * surface. It should be called after any call to + * cairo_ps_surface_dsc_begin_setup() and before any drawing is + * performed to the surface. + * + * See cairo_ps_surface_dsc_comment() for more details. + * + * Since: 1.2 + **/ +void +cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface) +{ + cairo_ps_surface_t *ps_surface = NULL; + + if (! _extract_ps_surface (surface, TRUE, &ps_surface)) + return; + + if (ps_surface->dsc_comment_target == &ps_surface->dsc_header_comments || + ps_surface->dsc_comment_target == &ps_surface->dsc_setup_comments) + { + ps_surface->dsc_comment_target = &ps_surface->dsc_page_setup_comments; + } +} + +static cairo_status_t +_cairo_ps_surface_finish (void *abstract_surface) +{ + cairo_status_t status, status2; + cairo_ps_surface_t *surface = abstract_surface; + int i, num_comments; + char **comments; + + status = surface->base.status; + if (unlikely (status)) + goto CLEANUP; + + _cairo_ps_surface_emit_header (surface); + + status = _cairo_ps_surface_emit_font_subsets (surface); + if (unlikely (status)) + goto CLEANUP; + + _cairo_output_stream_printf (surface->final_stream, + "%%%%EndSetup\n"); + + status = _cairo_ps_surface_emit_body (surface); + if (unlikely (status)) + goto CLEANUP; + + _cairo_ps_surface_emit_footer (surface); + +CLEANUP: + _cairo_scaled_font_subsets_destroy (surface->font_subsets); + + status2 = _cairo_output_stream_destroy (surface->stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + fclose (surface->tmpfile); + + status2 = _cairo_output_stream_destroy (surface->final_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + while (! cairo_list_is_empty (&surface->document_media)) { + cairo_page_media_t *page; + + page = cairo_list_first_entry (&surface->document_media, + cairo_page_media_t, + link); + cairo_list_del (&page->link); + free (page->name); + free (page); + } + + num_comments = _cairo_array_num_elements (&surface->dsc_header_comments); + comments = _cairo_array_index (&surface->dsc_header_comments, 0); + for (i = 0; i < num_comments; i++) + free (comments[i]); + _cairo_array_fini (&surface->dsc_header_comments); + + num_comments = _cairo_array_num_elements (&surface->dsc_setup_comments); + comments = _cairo_array_index (&surface->dsc_setup_comments, 0); + for (i = 0; i < num_comments; i++) + free (comments[i]); + _cairo_array_fini (&surface->dsc_setup_comments); + + num_comments = _cairo_array_num_elements (&surface->dsc_page_setup_comments); + comments = _cairo_array_index (&surface->dsc_page_setup_comments, 0); + for (i = 0; i < num_comments; i++) + free (comments[i]); + _cairo_array_fini (&surface->dsc_page_setup_comments); + + _cairo_surface_clipper_reset (&surface->clipper); + + return status; +} + +static cairo_int_status_t +_cairo_ps_surface_start_page (void *abstract_surface) +{ + cairo_ps_surface_t *surface = abstract_surface; + + /* Increment before print so page numbers start at 1. */ + surface->num_pages++; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_ps_surface_show_page (void *abstract_surface) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + if (surface->clipper.clip != NULL) + _cairo_surface_clipper_reset (&surface->clipper); + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->stream, + "Q Q\n" + "showpage\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +color_is_gray (double red, double green, double blue) +{ + const double epsilon = 0.00001; + + return (fabs (red - green) < epsilon && + fabs (red - blue) < epsilon); +} + +/** + * _cairo_ps_surface_acquire_source_surface_from_pattern: + * @surface: the ps surface + * @pattern: A #cairo_pattern_t of type SURFACE or RASTER_SOURCE to use as the source + * @extents: extents of the operation that is using this source + * @width: returns width of surface + * @height: returns height of surface + * @x_offset: returns x offset of surface + * @y_offset: returns y offset of surface + * @surface: returns surface of type image surface or recording surface + * @image_extra: returns image extra for image type surface + * + * Acquire source surface or raster source pattern. + **/ +static cairo_status_t +_cairo_ps_surface_acquire_source_surface_from_pattern (cairo_ps_surface_t *surface, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + int *width, + int *height, + double *x_offset, + double *y_offset, + cairo_surface_t **source_surface, + void **image_extra) +{ + cairo_status_t status; + cairo_image_surface_t *image; + + *x_offset = *y_offset = 0; + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_t *surf = ((cairo_surface_pattern_t *) pattern)->surface; + + if (surf->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (surf->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) surf; + + *width = sub->extents.width; + *height = sub->extents.height; + } else { + cairo_surface_t *free_me = NULL; + cairo_recording_surface_t *recording_surface; + cairo_box_t bbox; + cairo_rectangle_int_t extents; + + recording_surface = (cairo_recording_surface_t *) surf; + if (_cairo_surface_is_snapshot (&recording_surface->base)) { + free_me = _cairo_surface_snapshot_get_target (&recording_surface->base); + recording_surface = (cairo_recording_surface_t *) free_me; + } + + status = _cairo_recording_surface_get_bbox (recording_surface, &bbox, NULL); + cairo_surface_destroy (free_me); + if (unlikely (status)) + return status; + + _cairo_box_round_to_rectangle (&bbox, &extents); + *width = extents.width; + *height = extents.height; + } + *source_surface = surf; + + return CAIRO_STATUS_SUCCESS; + } else { + status = _cairo_surface_acquire_source_image (surf, &image, image_extra); + if (unlikely (status)) + return status; + } + } break; + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: { + cairo_surface_t *surf; + cairo_box_t box; + cairo_rectangle_int_t rect; + + /* get the operation extents in pattern space */ + _cairo_box_from_rectangle (&box, extents); + _cairo_matrix_transform_bounding_box_fixed (&pattern->matrix, &box, NULL); + _cairo_box_round_to_rectangle (&box, &rect); + surf = _cairo_raster_source_pattern_acquire (pattern, &surface->base, &rect); + if (!surf) + return CAIRO_INT_STATUS_UNSUPPORTED; + assert (_cairo_surface_is_image (surf)); + image = (cairo_image_surface_t *) surf; + } break; + + case CAIRO_PATTERN_TYPE_SOLID: + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + default: + ASSERT_NOT_REACHED; + break; + } + + *width = image->width; + *height = image->height; + *source_surface = &image->base; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_ps_surface_release_source_surface_from_pattern (cairo_ps_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_surface_t *source, + void *image_extra) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SURFACE: { + cairo_surface_pattern_t *surf_pat = (cairo_surface_pattern_t *) pattern; + if (surf_pat->surface->type != CAIRO_SURFACE_TYPE_RECORDING) { + cairo_image_surface_t *image = (cairo_image_surface_t *) source; + _cairo_surface_release_source_image (surf_pat->surface, image, image_extra); + } + } break; + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + _cairo_raster_source_pattern_release (pattern, source); + break; + + case CAIRO_PATTERN_TYPE_SOLID: + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + default: + + ASSERT_NOT_REACHED; + break; + } +} + +/** + * _cairo_ps_surface_create_padded_image_from_image: + * @surface: the ps surface + * @source: The source image + * @extents: extents of the operation that is using this source + * @width: returns width of padded image + * @height: returns height of padded image + * @x_offset: returns x offset of padded image + * @y_offset: returns y offset of padded image + * @image: returns the padded image or NULL if padding not required to fill @extents + * + * Creates a padded image if the source image does not fill the extents. + **/ +static cairo_status_t +_cairo_ps_surface_create_padded_image_from_image (cairo_ps_surface_t *surface, + cairo_image_surface_t *source, + const cairo_matrix_t *source_matrix, + const cairo_rectangle_int_t *extents, + int *width, + int *height, + double *x_offset, + double *y_offset, + cairo_image_surface_t **image) +{ + cairo_box_t box; + cairo_rectangle_int_t rect; + cairo_surface_t *pad_image; + cairo_surface_pattern_t pad_pattern; + int w, h; + cairo_int_status_t status; + + /* get the operation extents in pattern space */ + _cairo_box_from_rectangle (&box, extents); + _cairo_matrix_transform_bounding_box_fixed (source_matrix, &box, NULL); + _cairo_box_round_to_rectangle (&box, &rect); + + /* Check if image needs padding to fill extents. */ + w = source->width; + h = source->height; + if (_cairo_fixed_integer_ceil(box.p1.x) < 0 || + _cairo_fixed_integer_ceil(box.p1.y) < 0 || + _cairo_fixed_integer_floor(box.p2.y) > w || + _cairo_fixed_integer_floor(box.p2.y) > h) + { + pad_image = + _cairo_image_surface_create_with_pixman_format (NULL, + source->pixman_format, + rect.width, rect.height, + 0); + if (pad_image->status) + return pad_image->status; + + _cairo_pattern_init_for_surface (&pad_pattern, &source->base); + cairo_matrix_init_translate (&pad_pattern.base.matrix, rect.x, rect.y); + pad_pattern.base.extend = CAIRO_EXTEND_PAD; + status = _cairo_surface_paint (pad_image, + CAIRO_OPERATOR_SOURCE, + &pad_pattern.base, + NULL); + _cairo_pattern_fini (&pad_pattern.base); + *image = (cairo_image_surface_t *) pad_image; + *width = rect.width; + *height = rect.height; + *x_offset = rect.x; + *y_offset = rect.y; + } else { + *image = NULL; + status = CAIRO_STATUS_SUCCESS; + } + + return status; +} + +static cairo_int_status_t +_cairo_ps_surface_analyze_surface_pattern_transparency (cairo_ps_surface_t *surface, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + int width, height; + double x_offset, y_offset; + cairo_surface_t *source; + cairo_image_surface_t *image; + void *image_extra; + cairo_int_status_t status; + cairo_image_transparency_t transparency; + + status = _cairo_ps_surface_acquire_source_surface_from_pattern (surface, + pattern, + extents, + &width, + &height, + &x_offset, + &y_offset, + &source, + &image_extra); + if (unlikely (status)) + return status; + + image = (cairo_image_surface_t *) source; + if (image->base.status) + return image->base.status; + + transparency = _cairo_image_analyze_transparency (image); + switch (transparency) { + case CAIRO_IMAGE_IS_OPAQUE: + status = CAIRO_STATUS_SUCCESS; + break; + + case CAIRO_IMAGE_HAS_BILEVEL_ALPHA: + if (surface->ps_level == CAIRO_PS_LEVEL_2) { + status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + } else { + surface->ps_level_used = CAIRO_PS_LEVEL_3; + status = CAIRO_STATUS_SUCCESS; + } + break; + + case CAIRO_IMAGE_HAS_ALPHA: + status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + break; + + case CAIRO_IMAGE_UNKNOWN: + ASSERT_NOT_REACHED; + } + + _cairo_ps_surface_release_source_surface_from_pattern (surface, pattern, source, image_extra); + + return status; +} + +static cairo_bool_t +surface_pattern_supported (const cairo_surface_pattern_t *pattern) +{ + if (pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + return TRUE; + + if (pattern->surface->backend->acquire_source_image == NULL) + return FALSE; + + /* Does an ALPHA-only source surface even make sense? Maybe, but I + * don't think it's worth the extra code to support it. */ + +/* XXX: Need to write this function here... + content = pattern->surface->content; + if (content == CAIRO_CONTENT_ALPHA) + return FALSE; +*/ + + return TRUE; +} + +static cairo_bool_t +_gradient_pattern_supported (cairo_ps_surface_t *surface, + const cairo_pattern_t *pattern) +{ + double min_alpha, max_alpha; + + if (surface->ps_level == CAIRO_PS_LEVEL_2) + return FALSE; + + /* Alpha gradients are only supported (by flattening the alpha) + * if there is no variation in the alpha across the gradient. */ + _cairo_pattern_alpha_range (pattern, &min_alpha, &max_alpha); + if (min_alpha != max_alpha) + return FALSE; + + surface->ps_level_used = CAIRO_PS_LEVEL_3; + + return TRUE; +} + +static cairo_bool_t +pattern_supported (cairo_ps_surface_t *surface, const cairo_pattern_t *pattern) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return TRUE; + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + return _gradient_pattern_supported (surface, pattern); + + case CAIRO_PATTERN_TYPE_SURFACE: + return surface_pattern_supported ((cairo_surface_pattern_t *) pattern); + + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return TRUE; + + default: + ASSERT_NOT_REACHED; + return FALSE; + } +} + +static cairo_bool_t +mask_supported (cairo_ps_surface_t *surface, + const cairo_pattern_t *mask, + const cairo_rectangle_int_t *extents) +{ + if (surface->ps_level == CAIRO_PS_LEVEL_2) + return FALSE; + + if (mask->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) mask; + if (surface_pattern->surface->type == CAIRO_SURFACE_TYPE_IMAGE) { + /* check if mask if opaque or bilevel alpha */ + if (_cairo_ps_surface_analyze_surface_pattern_transparency (surface, mask, extents) == CAIRO_INT_STATUS_SUCCESS) { + surface->ps_level_used = CAIRO_PS_LEVEL_3; + return TRUE; + } + } + } + + return FALSE; +} + +static cairo_int_status_t +_cairo_ps_surface_analyze_operation (cairo_ps_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_pattern_t *mask, + const cairo_rectangle_int_t *extents) +{ + double min_alpha; + + if (surface->force_fallbacks && + surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (! pattern_supported (surface, pattern)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! (op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_OVER)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Mask is only supported when the mask is an image with opaque or bilevel alpha. */ + if (mask && !mask_supported (surface, mask, extents)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; + + if (surface_pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (pattern->extend == CAIRO_EXTEND_PAD) { + cairo_box_t box; + cairo_rectangle_int_t rect; + cairo_rectangle_int_t rec_extents; + + /* get the operation extents in pattern space */ + _cairo_box_from_rectangle (&box, extents); + _cairo_matrix_transform_bounding_box_fixed (&pattern->matrix, &box, NULL); + _cairo_box_round_to_rectangle (&box, &rect); + + /* Check if surface needs padding to fill extents */ + if (_cairo_surface_get_extents (surface_pattern->surface, &rec_extents)) { + if (_cairo_fixed_integer_ceil(box.p1.x) < rec_extents.x || + _cairo_fixed_integer_ceil(box.p1.y) < rec_extents.y || + _cairo_fixed_integer_floor(box.p2.y) > rec_extents.x + rec_extents.width || + _cairo_fixed_integer_floor(box.p2.y) > rec_extents.y + rec_extents.height) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + } + return CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN; + } + } + + if (op == CAIRO_OPERATOR_SOURCE) { + if (mask) + return CAIRO_INT_STATUS_UNSUPPORTED; + else + return CAIRO_STATUS_SUCCESS; + } + + /* CAIRO_OPERATOR_OVER is only supported for opaque patterns. If + * the pattern contains transparency, we return + * CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY to the analysis + * surface. If the analysis surface determines that there is + * anything drawn under this operation, a fallback image will be + * used. Otherwise the operation will be replayed during the + * render stage and we blend the transparency into the white + * background to convert the pattern to opaque. + */ + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE || pattern->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return _cairo_ps_surface_analyze_surface_pattern_transparency (surface, pattern, extents); + + /* Patterns whose drawn part is opaque are directly supported; + those whose drawn part is partially transparent can be + supported by flattening the alpha. */ + _cairo_pattern_alpha_range (pattern, &min_alpha, NULL); + if (CAIRO_ALPHA_IS_OPAQUE (min_alpha)) + return CAIRO_STATUS_SUCCESS; + + return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; +} + +static cairo_bool_t +_cairo_ps_surface_operation_supported (cairo_ps_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + const cairo_pattern_t *mask, + const cairo_rectangle_int_t *extents) +{ + return _cairo_ps_surface_analyze_operation (surface, op, pattern, mask, extents) != CAIRO_INT_STATUS_UNSUPPORTED; +} + +/* The "standard" implementation limit for PostScript string sizes is + * 65535 characters (see PostScript Language Reference, Appendix + * B). We go one short of that because we sometimes need two + * characters in a string to represent a single ASCII85 byte, (for the + * escape sequences "\\", "\(", and "\)") and we must not split these + * across two strings. So we'd be in trouble if we went right to the + * limit and one of these escape sequences just happened to land at + * the end. + */ +#define STRING_ARRAY_MAX_STRING_SIZE (65535-1) +#define STRING_ARRAY_MAX_COLUMN 72 + +typedef struct _string_array_stream { + cairo_output_stream_t base; + cairo_output_stream_t *output; + int column; + int string_size; + cairo_bool_t use_strings; +} string_array_stream_t; + +static cairo_status_t +_string_array_stream_write (cairo_output_stream_t *base, + const unsigned char *data, + unsigned int length) +{ + string_array_stream_t *stream = (string_array_stream_t *) base; + unsigned char c; + const unsigned char backslash = '\\'; + + if (length == 0) + return CAIRO_STATUS_SUCCESS; + + while (length--) { + if (stream->string_size == 0 && stream->use_strings) { + _cairo_output_stream_printf (stream->output, "("); + stream->column++; + } + + c = *data++; + if (stream->use_strings) { + switch (c) { + case '\\': + case '(': + case ')': + _cairo_output_stream_write (stream->output, &backslash, 1); + stream->column++; + stream->string_size++; + break; + } + } + /* Have to be careful to never split the final ~> sequence. */ + if (c == '~') { + _cairo_output_stream_write (stream->output, &c, 1); + stream->column++; + stream->string_size++; + + if (length-- == 0) + break; + + c = *data++; + } + _cairo_output_stream_write (stream->output, &c, 1); + stream->column++; + stream->string_size++; + + if (stream->use_strings && + stream->string_size >= STRING_ARRAY_MAX_STRING_SIZE) + { + _cairo_output_stream_printf (stream->output, ")\n"); + stream->string_size = 0; + stream->column = 0; + } + if (stream->column >= STRING_ARRAY_MAX_COLUMN) { + _cairo_output_stream_printf (stream->output, "\n "); + stream->string_size += 2; + stream->column = 1; + } + } + + return _cairo_output_stream_get_status (stream->output); +} + +static cairo_status_t +_string_array_stream_close (cairo_output_stream_t *base) +{ + cairo_status_t status; + string_array_stream_t *stream = (string_array_stream_t *) base; + + if (stream->use_strings) + _cairo_output_stream_printf (stream->output, ")\n"); + + status = _cairo_output_stream_get_status (stream->output); + + return status; +} + +/* A string_array_stream wraps an existing output stream. It takes the + * data provided to it and output one or more consecutive string + * objects, each within the standard PostScript implementation limit + * of 65k characters. + * + * The strings are each separated by a space character for easy + * inclusion within an array object, (but the array delimiters are not + * added by the string_array_stream). + * + * The string array stream is also careful to wrap the output within + * STRING_ARRAY_MAX_COLUMN columns (+/- 1). The stream also adds + * necessary escaping for special characters within a string, + * (specifically '\', '(', and ')'). + */ +static cairo_output_stream_t * +_string_array_stream_create (cairo_output_stream_t *output) +{ + string_array_stream_t *stream; + + stream = malloc (sizeof (string_array_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + _string_array_stream_write, + NULL, + _string_array_stream_close); + stream->output = output; + stream->column = 0; + stream->string_size = 0; + stream->use_strings = TRUE; + + return &stream->base; +} + +/* A base85_array_stream wraps an existing output stream. It wraps the + * output within STRING_ARRAY_MAX_COLUMN columns (+/- 1). The output + * is not enclosed in strings like string_array_stream. + */ +static cairo_output_stream_t * +_base85_array_stream_create (cairo_output_stream_t *output) +{ + string_array_stream_t *stream; + + stream = malloc (sizeof (string_array_stream_t)); + if (unlikely (stream == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_output_stream_t *) &_cairo_output_stream_nil; + } + + _cairo_output_stream_init (&stream->base, + _string_array_stream_write, + NULL, + _string_array_stream_close); + stream->output = output; + stream->column = 0; + stream->string_size = 0; + stream->use_strings = FALSE; + + return &stream->base; +} + + +/* PS Output - this section handles output of the parts of the recording + * surface we can render natively in PS. */ + +static cairo_status_t +_cairo_ps_surface_flatten_image_transparency (cairo_ps_surface_t *surface, + cairo_image_surface_t *image, + cairo_image_surface_t **opaque_image) +{ + cairo_surface_t *opaque; + cairo_surface_pattern_t pattern; + cairo_status_t status; + + opaque = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + image->width, + image->height); + if (unlikely (opaque->status)) + return opaque->status; + + if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) { + status = _cairo_surface_paint (opaque, + CAIRO_OPERATOR_SOURCE, + &_cairo_pattern_white.base, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (opaque); + return status; + } + } + + _cairo_pattern_init_for_surface (&pattern, &image->base); + pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (opaque, CAIRO_OPERATOR_OVER, &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + if (unlikely (status)) { + cairo_surface_destroy (opaque); + return status; + } + + *opaque_image = (cairo_image_surface_t *) opaque; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_ps_surface_emit_base85_string (cairo_ps_surface_t *surface, + const unsigned char *data, + unsigned long length, + cairo_ps_compress_t compress, + cairo_bool_t use_strings) +{ + cairo_output_stream_t *base85_stream, *string_array_stream, *deflate_stream; + unsigned char *data_compressed; + unsigned long data_compressed_size; + cairo_status_t status, status2; + + if (use_strings) + string_array_stream = _string_array_stream_create (surface->stream); + else + string_array_stream = _base85_array_stream_create (surface->stream); + + status = _cairo_output_stream_get_status (string_array_stream); + if (unlikely (status)) + return _cairo_output_stream_destroy (string_array_stream); + + base85_stream = _cairo_base85_stream_create (string_array_stream); + status = _cairo_output_stream_get_status (base85_stream); + if (unlikely (status)) { + status2 = _cairo_output_stream_destroy (string_array_stream); + return _cairo_output_stream_destroy (base85_stream); + } + + switch (compress) { + case CAIRO_PS_COMPRESS_NONE: + _cairo_output_stream_write (base85_stream, data, length); + break; + + case CAIRO_PS_COMPRESS_LZW: + /* XXX: Should fix cairo-lzw to provide a stream-based interface + * instead. */ + data_compressed_size = length; + data_compressed = _cairo_lzw_compress ((unsigned char*)data, &data_compressed_size); + if (unlikely (data_compressed == NULL)) { + status = _cairo_output_stream_destroy (string_array_stream); + status = _cairo_output_stream_destroy (base85_stream); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + _cairo_output_stream_write (base85_stream, data_compressed, data_compressed_size); + free (data_compressed); + break; + + case CAIRO_PS_COMPRESS_DEFLATE: + deflate_stream = _cairo_deflate_stream_create (base85_stream); + if (_cairo_output_stream_get_status (deflate_stream)) { + return _cairo_output_stream_destroy (deflate_stream); + } + _cairo_output_stream_write (deflate_stream, data, length); + status = _cairo_output_stream_destroy (deflate_stream); + if (unlikely (status)) { + status2 = _cairo_output_stream_destroy (string_array_stream); + status2 = _cairo_output_stream_destroy (base85_stream); + return _cairo_output_stream_destroy (deflate_stream); + } + break; + } + status = _cairo_output_stream_destroy (base85_stream); + + /* Mark end of base85 data */ + _cairo_output_stream_printf (string_array_stream, "~>"); + status2 = _cairo_output_stream_destroy (string_array_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_image (cairo_ps_surface_t *surface, + cairo_image_surface_t *image_surf, + cairo_operator_t op, + cairo_filter_t filter, + cairo_bool_t stencil_mask) +{ + cairo_status_t status; + unsigned char *data; + unsigned long data_size; + cairo_image_surface_t *ps_image; + int x, y, i, a; + cairo_image_transparency_t transparency; + cairo_bool_t use_mask; + uint32_t *pixel32; + uint8_t *pixel8; + int bit; + cairo_image_color_t color; + const char *interpolate; + cairo_ps_compress_t compress; + const char *compress_filter; + cairo_image_surface_t *image; + + if (image_surf->base.status) + return image_surf->base.status; + + image = image_surf; + if (image->format != CAIRO_FORMAT_RGB24 && + image->format != CAIRO_FORMAT_ARGB32 && + image->format != CAIRO_FORMAT_A8 && + image->format != CAIRO_FORMAT_A1) + { + cairo_surface_t *surf; + cairo_surface_pattern_t pattern; + + surf = _cairo_image_surface_create_with_content (image_surf->base.content, + image_surf->width, + image_surf->height); + image = (cairo_image_surface_t *) surf; + if (surf->status) { + status = surf->status; + goto bail0; + } + + _cairo_pattern_init_for_surface (&pattern, &image_surf->base); + status = _cairo_surface_paint (surf, + CAIRO_OPERATOR_SOURCE, &pattern.base, + NULL); + _cairo_pattern_fini (&pattern.base); + if (unlikely (status)) + goto bail0; + } + ps_image = image; + + switch (filter) { + default: + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_BILINEAR: + interpolate = "true"; + break; + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + case CAIRO_FILTER_GAUSSIAN: + interpolate = "false"; + break; + } + + if (stencil_mask) { + use_mask = FALSE; + color = CAIRO_IMAGE_IS_MONOCHROME; + transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; + } else { + transparency = _cairo_image_analyze_transparency (image); + + /* PostScript can not represent the alpha channel, so we blend the + current image over a white (or black for CONTENT_COLOR + surfaces) RGB surface to eliminate it. */ + + if (op == CAIRO_OPERATOR_SOURCE || + transparency == CAIRO_IMAGE_HAS_ALPHA || + (transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA && + surface->ps_level == CAIRO_PS_LEVEL_2)) + { + status = _cairo_ps_surface_flatten_image_transparency (surface, + image, + &ps_image); + if (unlikely (status)) + return status; + + use_mask = FALSE; + } else if (transparency == CAIRO_IMAGE_IS_OPAQUE) { + use_mask = FALSE; + } else { /* transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA */ + use_mask = TRUE; + } + + color = _cairo_image_analyze_color (ps_image); + } + + /* Type 2 (mask and image interleaved) has the mask and image + * samples interleaved by row. The mask row is first, one bit per + * pixel with (bit 7 first). The row is padded to byte + * boundaries. The image data is 3 bytes per pixel RGB format. */ + switch (color) { + default: + case CAIRO_IMAGE_UNKNOWN_COLOR: + ASSERT_NOT_REACHED; + case CAIRO_IMAGE_IS_COLOR: + data_size = ps_image->width * 3; + break; + case CAIRO_IMAGE_IS_GRAYSCALE: + data_size = ps_image->width; + break; + case CAIRO_IMAGE_IS_MONOCHROME: + data_size = (ps_image->width + 7)/8; + break; + } + if (use_mask) + data_size += (ps_image->width + 7)/8; + data_size *= ps_image->height; + data = malloc (data_size); + if (unlikely (data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto bail1; + } + + i = 0; + for (y = 0; y < ps_image->height; y++) { + if (stencil_mask || use_mask) { + /* mask row */ + if (ps_image->format == CAIRO_FORMAT_A1) { + pixel8 = (uint8_t *) (ps_image->data + y * ps_image->stride); + + for (x = 0; x < (ps_image->width + 7) / 8; x++, pixel8++) { + a = *pixel8; + a = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (a); + data[i++] = a; + } + } else { + pixel8 = (uint8_t *) (ps_image->data + y * ps_image->stride); + pixel32 = (uint32_t *) (ps_image->data + y * ps_image->stride); + bit = 7; + for (x = 0; x < ps_image->width; x++) { + if (ps_image->format == CAIRO_FORMAT_ARGB32) { + a = (*pixel32 & 0xff000000) >> 24; + pixel32++; + } else { + a = *pixel8; + pixel8++; + } + + if (transparency == CAIRO_IMAGE_HAS_ALPHA) { + data[i++] = a; + } else { /* transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA or CAIRO_IMAGE_IS_OPAQUE */ + if (bit == 7) + data[i] = 0; + if (a != 0) + data[i] |= (1 << bit); + bit--; + if (bit < 0) { + bit = 7; + i++; + } + } + } + if (bit != 7) + i++; + } + } + if (stencil_mask) + continue; + + /* image row*/ + pixel32 = (uint32_t *) (ps_image->data + y * ps_image->stride); + bit = 7; + for (x = 0; x < ps_image->width; x++, pixel32++) { + int r, g, b; + + if (ps_image->format == CAIRO_FORMAT_ARGB32) { + /* At this point ARGB32 images are either opaque or + * bilevel alpha so we don't need to unpremultiply. */ + if (((*pixel32 & 0xff000000) >> 24) == 0) { + r = g = b = 0; + } else { + r = (*pixel32 & 0x00ff0000) >> 16; + g = (*pixel32 & 0x0000ff00) >> 8; + b = (*pixel32 & 0x000000ff) >> 0; + } + } else if (ps_image->format == CAIRO_FORMAT_RGB24) { + r = (*pixel32 & 0x00ff0000) >> 16; + g = (*pixel32 & 0x0000ff00) >> 8; + b = (*pixel32 & 0x000000ff) >> 0; + } else { + r = g = b = 0; + } + + switch (color) { + case CAIRO_IMAGE_IS_COLOR: + case CAIRO_IMAGE_UNKNOWN_COLOR: + data[i++] = r; + data[i++] = g; + data[i++] = b; + break; + + case CAIRO_IMAGE_IS_GRAYSCALE: + data[i++] = r; + break; + + case CAIRO_IMAGE_IS_MONOCHROME: + if (bit == 7) + data[i] = 0; + if (r != 0) + data[i] |= (1 << bit); + bit--; + if (bit < 0) { + bit = 7; + i++; + } + break; + } + } + if (bit != 7) + i++; + } + + if (surface->ps_level == CAIRO_PS_LEVEL_2) { + compress = CAIRO_PS_COMPRESS_LZW; + compress_filter = "LZWDecode"; + } else { + compress = CAIRO_PS_COMPRESS_DEFLATE; + compress_filter = "FlateDecode"; + surface->ps_level_used = CAIRO_PS_LEVEL_3; + } + + if (surface->use_string_datasource) { + /* Emit the image data as a base85-encoded string which will + * be used as the data source for the image operator later. */ + _cairo_output_stream_printf (surface->stream, + "/CairoImageData [\n"); + + status = _cairo_ps_surface_emit_base85_string (surface, + data, + data_size, + compress, + TRUE); + if (unlikely (status)) + goto bail2; + + _cairo_output_stream_printf (surface->stream, + "] def\n"); + _cairo_output_stream_printf (surface->stream, + "/CairoImageDataIndex 0 def\n"); + } + + if (use_mask) { + _cairo_output_stream_printf (surface->stream, + "%s setcolorspace\n" + "5 dict dup begin\n" + " /ImageType 3 def\n" + " /InterleaveType 2 def\n" + " /DataDict 8 dict def\n" + " DataDict begin\n" + " /ImageType 1 def\n" + " /Width %d def\n" + " /Height %d def\n" + " /Interpolate %s def\n" + " /BitsPerComponent %d def\n" + " /Decode [ %s ] def\n", + color == CAIRO_IMAGE_IS_COLOR ? "/DeviceRGB" : "/DeviceGray", + ps_image->width, + ps_image->height, + interpolate, + color == CAIRO_IMAGE_IS_MONOCHROME ? 1 : 8, + color == CAIRO_IMAGE_IS_COLOR ? "0 1 0 1 0 1" : "0 1"); + + if (surface->use_string_datasource) { + _cairo_output_stream_printf (surface->stream, + " /DataSource {\n" + " CairoImageData CairoImageDataIndex get\n" + " /CairoImageDataIndex CairoImageDataIndex 1 add def\n" + " CairoImageDataIndex CairoImageData length 1 sub gt\n" + " { /CairoImageDataIndex 0 def } if\n" + " } /ASCII85Decode filter /%s filter def\n", + compress_filter); + } else { + _cairo_output_stream_printf (surface->stream, + " /DataSource currentfile /ASCII85Decode filter /%s filter def\n", + compress_filter); + } + + _cairo_output_stream_printf (surface->stream, + " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" + " end\n" + " /MaskDict 8 dict def\n" + " MaskDict begin\n" + " /ImageType 1 def\n" + " /Width %d def\n" + " /Height %d def\n" + " /Interpolate %s def\n" + " /BitsPerComponent 1 def\n" + " /Decode [ 1 0 ] def\n" + " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" + " end\n" + "end\n" + "image\n", + ps_image->height, + ps_image->width, + ps_image->height, + interpolate, + ps_image->height); + } else { + if (!stencil_mask) { + _cairo_output_stream_printf (surface->stream, + "%s setcolorspace\n", + color == CAIRO_IMAGE_IS_COLOR ? "/DeviceRGB" : "/DeviceGray"); + } + _cairo_output_stream_printf (surface->stream, + "8 dict dup begin\n" + " /ImageType 1 def\n" + " /Width %d def\n" + " /Height %d def\n" + " /Interpolate %s def\n" + " /BitsPerComponent %d def\n" + " /Decode [ %s ] def\n", + ps_image->width, + ps_image->height, + interpolate, + color == CAIRO_IMAGE_IS_MONOCHROME ? 1 : 8, + stencil_mask ? "1 0" : color == CAIRO_IMAGE_IS_COLOR ? "0 1 0 1 0 1" : "0 1"); + if (surface->use_string_datasource) { + _cairo_output_stream_printf (surface->stream, + " /DataSource {\n" + " CairoImageData CairoImageDataIndex get\n" + " /CairoImageDataIndex CairoImageDataIndex 1 add def\n" + " CairoImageDataIndex CairoImageData length 1 sub gt\n" + " { /CairoImageDataIndex 0 def } if\n" + " } /ASCII85Decode filter /%s filter def\n", + compress_filter); + } else { + _cairo_output_stream_printf (surface->stream, + " /DataSource currentfile /ASCII85Decode filter /%s filter def\n", + compress_filter); + } + + _cairo_output_stream_printf (surface->stream, + " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" + "end\n" + "%s\n", + ps_image->height, + stencil_mask ? "imagemask" : "image"); + } + + if (!surface->use_string_datasource) { + /* Emit the image data as a base85-encoded string which will + * be used as the data source for the image operator. */ + status = _cairo_ps_surface_emit_base85_string (surface, + data, + data_size, + compress, + FALSE); + _cairo_output_stream_printf (surface->stream, "\n"); + } else { + status = CAIRO_STATUS_SUCCESS; + } + +bail2: + free (data); + +bail1: + if (!use_mask && ps_image != image) + cairo_surface_destroy (&ps_image->base); + +bail0: + if (image != image_surf) + cairo_surface_destroy (&image->base); + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_jpeg_image (cairo_ps_surface_t *surface, + cairo_surface_t *source, + int width, + int height) +{ + cairo_status_t status; + const unsigned char *mime_data; + unsigned long mime_data_length; + cairo_image_info_t info; + const char *colorspace; + const char *decode; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JPEG, + &mime_data, &mime_data_length); + if (unlikely (source->status)) + return source->status; + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_jpeg_info (&info, mime_data, mime_data_length); + if (unlikely (status)) + return status; + + switch (info.num_components) { + case 1: + colorspace = "/DeviceGray"; + decode = "0 1"; + break; + case 3: + colorspace = "/DeviceRGB"; + decode = "0 1 0 1 0 1"; + break; + case 4: + colorspace = "/DeviceCMYK"; + decode = "0 1 0 1 0 1 0 1"; + break; + default: + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (surface->use_string_datasource) { + /* Emit the image data as a base85-encoded string which will + * be used as the data source for the image operator later. */ + _cairo_output_stream_printf (surface->stream, + "/CairoImageData [\n"); + + status = _cairo_ps_surface_emit_base85_string (surface, + mime_data, + mime_data_length, + CAIRO_PS_COMPRESS_NONE, + TRUE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->stream, + "] def\n"); + _cairo_output_stream_printf (surface->stream, + "/CairoImageDataIndex 0 def\n"); + } + + _cairo_output_stream_printf (surface->stream, + "%s setcolorspace\n" + "8 dict dup begin\n" + " /ImageType 1 def\n" + " /Width %d def\n" + " /Height %d def\n" + " /BitsPerComponent %d def\n" + " /Decode [ %s ] def\n", + colorspace, + info.width, + info.height, + info.bits_per_component, + decode); + + if (surface->use_string_datasource) { + _cairo_output_stream_printf (surface->stream, + " /DataSource {\n" + " CairoImageData CairoImageDataIndex get\n" + " /CairoImageDataIndex CairoImageDataIndex 1 add def\n" + " CairoImageDataIndex CairoImageData length 1 sub gt\n" + " { /CairoImageDataIndex 0 def } if\n" + " } /ASCII85Decode filter /DCTDecode filter def\n"); + } else { + _cairo_output_stream_printf (surface->stream, + " /DataSource currentfile /ASCII85Decode filter /DCTDecode filter def\n"); + } + + _cairo_output_stream_printf (surface->stream, + " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" + "end\n" + "image\n", + info.height); + + if (!surface->use_string_datasource) { + /* Emit the image data as a base85-encoded string which will + * be used as the data source for the image operator. */ + status = _cairo_ps_surface_emit_base85_string (surface, + mime_data, + mime_data_length, + CAIRO_PS_COMPRESS_NONE, + FALSE); + } + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_recording_surface (cairo_ps_surface_t *surface, + cairo_surface_t *recording_surface) +{ + double old_width, old_height; + cairo_matrix_t old_cairo_to_ps; + cairo_content_t old_content; + cairo_rectangle_int_t old_page_bbox; + cairo_surface_t *free_me = NULL; + cairo_surface_clipper_t old_clipper; + cairo_box_t bbox; + cairo_int_status_t status; + + old_content = surface->content; + old_width = surface->width; + old_height = surface->height; + old_page_bbox = surface->page_bbox; + old_cairo_to_ps = surface->cairo_to_ps; + old_clipper = surface->clipper; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_ps_surface_clipper_intersect_clip_path); + + if (_cairo_surface_is_snapshot (recording_surface)) + free_me = recording_surface = _cairo_surface_snapshot_get_target (recording_surface); + + status = + _cairo_recording_surface_get_bbox ((cairo_recording_surface_t *) recording_surface, + &bbox, + NULL); + if (unlikely (status)) + goto err; + +#if DEBUG_PS + _cairo_output_stream_printf (surface->stream, + "%% _cairo_ps_surface_emit_recording_surface (%f, %f), (%f, %f)\n", + _cairo_fixed_to_double (bbox.p1.x), + _cairo_fixed_to_double (bbox.p1.y), + _cairo_fixed_to_double (bbox.p2.x), + _cairo_fixed_to_double (bbox.p2.y)); +#endif + + surface->width = _cairo_fixed_to_double (bbox.p2.x - bbox.p1.x); + surface->height = _cairo_fixed_to_double (bbox.p2.y - bbox.p1.y); + _cairo_box_round_to_rectangle (&bbox, &surface->page_bbox); + + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + cairo_matrix_init (&surface->cairo_to_ps, 1, 0, 0, -1, 0, surface->height); + _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, + &surface->cairo_to_ps); + _cairo_output_stream_printf (surface->stream, " q\n"); + + if (recording_surface->content == CAIRO_CONTENT_COLOR) { + surface->content = CAIRO_CONTENT_COLOR; + _cairo_output_stream_printf (surface->stream, + " 0 g %d %d %d %d rectfill\n", + surface->page_bbox.x, + surface->page_bbox.y, + surface->page_bbox.width, + surface->page_bbox.height); + } + + status = _cairo_recording_surface_replay_region (recording_surface, + NULL, + &surface->base, + CAIRO_RECORDING_REGION_NATIVE); + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + if (unlikely (status)) + goto err; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto err; + + _cairo_output_stream_printf (surface->stream, " Q\n"); + + _cairo_surface_clipper_reset (&surface->clipper); + surface->clipper = old_clipper; + surface->content = old_content; + surface->width = old_width; + surface->height = old_height; + surface->page_bbox = old_page_bbox; + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + surface->cairo_to_ps = old_cairo_to_ps; + + _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, + &surface->cairo_to_ps); + +err: + cairo_surface_destroy (free_me); + return status; +} + +static cairo_int_status_t +_cairo_ps_surface_emit_recording_subsurface (cairo_ps_surface_t *surface, + cairo_surface_t *recording_surface, + const cairo_rectangle_int_t *extents) +{ + double old_width, old_height; + cairo_matrix_t old_cairo_to_ps; + cairo_content_t old_content; + cairo_rectangle_int_t old_page_bbox; + cairo_surface_clipper_t old_clipper; + cairo_surface_t *free_me = NULL; + cairo_int_status_t status; + + old_content = surface->content; + old_width = surface->width; + old_height = surface->height; + old_page_bbox = surface->page_bbox; + old_cairo_to_ps = surface->cairo_to_ps; + old_clipper = surface->clipper; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_ps_surface_clipper_intersect_clip_path); + +#if DEBUG_PS + _cairo_output_stream_printf (surface->stream, + "%% _cairo_ps_surface_emit_recording_subsurface (%d, %d), (%d, %d)\n", + extents->x, extents->y, + extents->width, extents->height); +#endif + + surface->page_bbox.x = surface->page_bbox.y = 0; + surface->page_bbox.width = surface->width = extents->width; + surface->page_bbox.height = surface->height = extents->height; + + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + cairo_matrix_init (&surface->cairo_to_ps, 1, 0, 0, -1, 0, surface->height); + _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, + &surface->cairo_to_ps); + _cairo_output_stream_printf (surface->stream, " q\n"); + + if (_cairo_surface_is_snapshot (recording_surface)) + free_me = recording_surface = _cairo_surface_snapshot_get_target (recording_surface); + + if (recording_surface->content == CAIRO_CONTENT_COLOR) { + surface->content = CAIRO_CONTENT_COLOR; + _cairo_output_stream_printf (surface->stream, + " 0 g %d %d %d %d rectfill\n", + surface->page_bbox.x, + surface->page_bbox.y, + surface->page_bbox.width, + surface->page_bbox.height); + } + + status = _cairo_recording_surface_replay_region (recording_surface, + extents, + &surface->base, + CAIRO_RECORDING_REGION_NATIVE); + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + if (unlikely (status)) + goto err; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto err; + + _cairo_output_stream_printf (surface->stream, " Q\n"); + + _cairo_surface_clipper_reset (&surface->clipper); + surface->clipper = old_clipper; + surface->content = old_content; + surface->width = old_width; + surface->height = old_height; + surface->page_bbox = old_page_bbox; + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + surface->cairo_to_ps = old_cairo_to_ps; + + _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, + &surface->cairo_to_ps); + +err: + cairo_surface_destroy (free_me); + return status; +} + +static void +_cairo_ps_surface_flatten_transparency (cairo_ps_surface_t *surface, + const cairo_color_t *color, + double *red, + double *green, + double *blue) +{ + *red = color->red; + *green = color->green; + *blue = color->blue; + + if (! CAIRO_COLOR_IS_OPAQUE (color)) { + *red *= color->alpha; + *green *= color->alpha; + *blue *= color->alpha; + if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) { + double one_minus_alpha = 1. - color->alpha; + *red += one_minus_alpha; + *green += one_minus_alpha; + *blue += one_minus_alpha; + } + } +} + +static void +_cairo_ps_surface_emit_solid_pattern (cairo_ps_surface_t *surface, + cairo_solid_pattern_t *pattern) +{ + double red, green, blue; + + _cairo_ps_surface_flatten_transparency (surface, &pattern->color, &red, &green, &blue); + + if (color_is_gray (red, green, blue)) + _cairo_output_stream_printf (surface->stream, + "%f g\n", + red); + else + _cairo_output_stream_printf (surface->stream, + "%f %f %f rg\n", + red, green, blue); +} + +static cairo_status_t +_cairo_ps_surface_emit_surface (cairo_ps_surface_t *surface, + cairo_pattern_t *source_pattern, + cairo_surface_t *source_surface, + cairo_operator_t op, + int width, + int height, + cairo_bool_t stencil_mask) +{ + cairo_int_status_t status; + + if (source_pattern->type == CAIRO_PATTERN_TYPE_SURFACE && + source_pattern->extend != CAIRO_EXTEND_PAD) + { + cairo_surface_t *surf = ((cairo_surface_pattern_t *) source_pattern)->surface; + + status = _cairo_ps_surface_emit_jpeg_image (surface, surf, width, height); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + if (source_surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + if (source_surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source_surface; + status = _cairo_ps_surface_emit_recording_subsurface (surface, sub->target, &sub->extents); + } else { + status = _cairo_ps_surface_emit_recording_surface (surface, source_surface); + } + } else { + cairo_image_surface_t *image = (cairo_image_surface_t *) source_surface; + + status = _cairo_ps_surface_emit_image (surface, image, + op, source_pattern->filter, stencil_mask); + } + + return status; +} + + +static void +_path_fixed_init_rectangle (cairo_path_fixed_t *path, + cairo_rectangle_int_t *rect) +{ + cairo_status_t status; + + _cairo_path_fixed_init (path); + + status = _cairo_path_fixed_move_to (path, + _cairo_fixed_from_int (rect->x), + _cairo_fixed_from_int (rect->y)); + assert (status == CAIRO_STATUS_SUCCESS); + status = _cairo_path_fixed_rel_line_to (path, + _cairo_fixed_from_int (rect->width), + _cairo_fixed_from_int (0)); + assert (status == CAIRO_STATUS_SUCCESS); + status = _cairo_path_fixed_rel_line_to (path, + _cairo_fixed_from_int (0), + _cairo_fixed_from_int (rect->height)); + assert (status == CAIRO_STATUS_SUCCESS); + status = _cairo_path_fixed_rel_line_to (path, + _cairo_fixed_from_int (-rect->width), + _cairo_fixed_from_int (0)); + assert (status == CAIRO_STATUS_SUCCESS); + + status = _cairo_path_fixed_close_path (path); + assert (status == CAIRO_STATUS_SUCCESS); +} + +static cairo_status_t +_cairo_ps_surface_paint_surface (cairo_ps_surface_t *surface, + cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents, + cairo_operator_t op, + cairo_bool_t stencil_mask) +{ + cairo_status_t status; + int width, height; + cairo_matrix_t cairo_p2d, ps_p2d; + cairo_path_fixed_t path; + double x_offset, y_offset; + cairo_surface_t *source; + cairo_image_surface_t *image = NULL; + void *image_extra; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + status = _cairo_ps_surface_acquire_source_surface_from_pattern (surface, + pattern, + extents, + &width, &height, + &x_offset, &y_offset, + &source, + &image_extra); + if (unlikely (status)) + return status; + + if (pattern->extend == CAIRO_EXTEND_PAD && + pattern->type == CAIRO_PATTERN_TYPE_SURFACE && + ((cairo_surface_pattern_t *)pattern)->surface->type == CAIRO_SURFACE_TYPE_IMAGE) { + cairo_image_surface_t *img; + + img = (cairo_image_surface_t *) source; + status = _cairo_ps_surface_create_padded_image_from_image (surface, + img, + &pattern->matrix, + extents, + &width, &height, + &x_offset, &y_offset, + &image); + if (unlikely (status)) + goto release_source; + } + + _path_fixed_init_rectangle (&path, extents); + status = _cairo_pdf_operators_clip (&surface->pdf_operators, + &path, + CAIRO_FILL_RULE_WINDING); + _cairo_path_fixed_fini (&path); + if (unlikely (status)) + goto release_source; + + cairo_p2d = pattern->matrix; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { + double x_scale = cairo_p2d.xx; + double y_scale = cairo_p2d.yy; + + _cairo_output_stream_printf (surface->stream, + "%% Fallback Image: x=%f y=%f w=%d h=%d ", + -cairo_p2d.x0/x_scale, + -cairo_p2d.y0/y_scale, + (int)(width/x_scale), + (int)(height/y_scale)); + if (x_scale == y_scale) { + _cairo_output_stream_printf (surface->stream, + "res=%fppi ", + x_scale*72); + } else { + _cairo_output_stream_printf (surface->stream, + "res=%fx%fppi ", + x_scale*72, + y_scale*72); + } + _cairo_output_stream_printf (surface->stream, + "size=%ld\n", + (long)width*height*3); + } else { + if (op == CAIRO_OPERATOR_SOURCE) { + _cairo_output_stream_printf (surface->stream, + "%d g 0 0 %f %f rectfill\n", + surface->content == CAIRO_CONTENT_COLOR ? 0 : 1, + surface->width, + surface->height); + } + } + + status = cairo_matrix_invert (&cairo_p2d); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + ps_p2d = surface->cairo_to_ps; + cairo_matrix_multiply (&ps_p2d, &cairo_p2d, &ps_p2d); + cairo_matrix_translate (&ps_p2d, x_offset, y_offset); + cairo_matrix_translate (&ps_p2d, 0.0, height); + cairo_matrix_scale (&ps_p2d, 1.0, -1.0); + + if (! _cairo_matrix_is_identity (&ps_p2d)) { + _cairo_output_stream_printf (surface->stream, "[ "); + _cairo_output_stream_print_matrix (surface->stream, &ps_p2d); + _cairo_output_stream_printf (surface->stream, " ] concat\n"); + } + + status = _cairo_ps_surface_emit_surface (surface, + pattern, + image ? &image->base : source, + op, + width, height, + stencil_mask); + + release_source: + if (image) + cairo_surface_destroy (&image->base); + + _cairo_ps_surface_release_source_surface_from_pattern (surface, pattern, source, image_extra); + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_surface_pattern (cairo_ps_surface_t *surface, + cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents, + cairo_operator_t op) +{ + cairo_status_t status; + int pattern_width = 0; /* squelch bogus compiler warning */ + int pattern_height = 0; /* squelch bogus compiler warning */ + double xstep, ystep; + cairo_matrix_t cairo_p2d, ps_p2d; + cairo_bool_t old_use_string_datasource; + double x_offset, y_offset; + cairo_surface_t *source; + cairo_image_surface_t *image = NULL; + void *image_extra; + + cairo_p2d = pattern->matrix; + status = cairo_matrix_invert (&cairo_p2d); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + status = _cairo_ps_surface_acquire_source_surface_from_pattern (surface, + pattern, + extents, + &pattern_width, &pattern_height, + &x_offset, &y_offset, + &source, + &image_extra); + if (unlikely (status)) + return status; + + if (pattern->extend == CAIRO_EXTEND_PAD) { + cairo_image_surface_t *img; + + assert (source->type == CAIRO_SURFACE_TYPE_IMAGE); + img = (cairo_image_surface_t *) source; + status = _cairo_ps_surface_create_padded_image_from_image (surface, + img, + &pattern->matrix, + extents, + &pattern_width, &pattern_height, + &x_offset, &y_offset, + &image); + if (unlikely (status)) + goto release_source; + } + if (unlikely (status)) + goto release_source; + + switch (pattern->extend) { + case CAIRO_EXTEND_PAD: + case CAIRO_EXTEND_NONE: + { + /* In PS/PDF, (as far as I can tell), all patterns are + * repeating. So we support cairo's EXTEND_NONE semantics + * by setting the repeat step size to a size large enough + * to guarantee that no more than a single occurrence will + * be visible. + * + * First, map the surface extents into pattern space (since + * xstep and ystep are in pattern space). Then use an upper + * bound on the length of the diagonal of the pattern image + * and the surface as repeat size. This guarantees to never + * repeat visibly. + */ + double x1 = 0.0, y1 = 0.0; + double x2 = surface->width, y2 = surface->height; + _cairo_matrix_transform_bounding_box (&pattern->matrix, + &x1, &y1, &x2, &y2, + NULL); + + /* Rather than computing precise bounds of the union, just + * add the surface extents unconditionally. We only + * required an answer that's large enough, we don't really + * care if it's not as tight as possible.*/ + xstep = ystep = ceil ((x2 - x1) + (y2 - y1) + + pattern_width + pattern_height); + break; + } + case CAIRO_EXTEND_REPEAT: + xstep = pattern_width; + ystep = pattern_height; + break; + case CAIRO_EXTEND_REFLECT: + xstep = pattern_width*2; + ystep = pattern_height*2; + break; + /* All the rest (if any) should have been analyzed away, so these + * cases should be unreachable. */ + default: + ASSERT_NOT_REACHED; + xstep = 0; + ystep = 0; + } + + _cairo_output_stream_printf (surface->stream, + "/CairoPattern {\n"); + + old_use_string_datasource = surface->use_string_datasource; + surface->use_string_datasource = TRUE; + if (op == CAIRO_OPERATOR_SOURCE) { + _cairo_output_stream_printf (surface->stream, + "%d g 0 0 %f %f rectfill\n", + surface->content == CAIRO_CONTENT_COLOR ? 0 : 1, + xstep, ystep); + } + status = _cairo_ps_surface_emit_surface (surface, + pattern, + image ? &image->base : source, + op, + pattern_width, pattern_height, FALSE); + if (unlikely (status)) + goto release_source; + + surface->use_string_datasource = old_use_string_datasource; + _cairo_output_stream_printf (surface->stream, + "} bind def\n"); + + _cairo_output_stream_printf (surface->stream, + "<< /PatternType 1\n" + " /PaintType 1\n" + " /TilingType 1\n"); + _cairo_output_stream_printf (surface->stream, + " /XStep %f /YStep %f\n", + xstep, ystep); + + if (pattern->extend == CAIRO_EXTEND_REFLECT) { + _cairo_output_stream_printf (surface->stream, + " /BBox [0 0 %d %d]\n" + " /PaintProc {\n" + " pop CairoPattern\n" + " [-1 0 0 1 %d 0] concat CairoPattern\n" + " [ 1 0 0 -1 0 %d] concat CairoPattern\n" + " [-1 0 0 1 %d 0] concat CairoPattern\n" + " CairoPattern\n" + " } bind\n", + pattern_width*2, pattern_height*2, + pattern_width*2, + pattern_height*2, + pattern_width*2); + } else { + if (op == CAIRO_OPERATOR_SOURCE) { + _cairo_output_stream_printf (surface->stream, + " /BBox [0 0 %f %f]\n", + xstep, ystep); + } else { + _cairo_output_stream_printf (surface->stream, + " /BBox [0 0 %d %d]\n", + pattern_width, pattern_height); + } + _cairo_output_stream_printf (surface->stream, + " /PaintProc { pop CairoPattern }\n"); + } + + _cairo_output_stream_printf (surface->stream, + ">>\n"); + + cairo_p2d = pattern->matrix; + status = cairo_matrix_invert (&cairo_p2d); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_init_identity (&ps_p2d); + cairo_matrix_translate (&ps_p2d, 0.0, surface->height); + cairo_matrix_scale (&ps_p2d, 1.0, -1.0); + cairo_matrix_multiply (&ps_p2d, &cairo_p2d, &ps_p2d); + cairo_matrix_translate (&ps_p2d, 0.0, pattern_height); + cairo_matrix_scale (&ps_p2d, 1.0, -1.0); + + _cairo_output_stream_printf (surface->stream, "[ "); + _cairo_output_stream_print_matrix (surface->stream, &ps_p2d); + _cairo_output_stream_printf (surface->stream, + " ]\n" + "makepattern setpattern\n"); + + release_source: + if (image) + cairo_surface_destroy (&image->base); + + _cairo_ps_surface_release_source_surface_from_pattern (surface, pattern, source, image_extra); + + return status; +} + +typedef struct _cairo_ps_color_stop { + double offset; + double color[4]; +} cairo_ps_color_stop_t; + +static void +_cairo_ps_surface_emit_linear_colorgradient (cairo_ps_surface_t *surface, + cairo_ps_color_stop_t *stop1, + cairo_ps_color_stop_t *stop2) +{ + _cairo_output_stream_printf (surface->stream, + " << /FunctionType 2\n" + " /Domain [ 0 1 ]\n" + " /C0 [ %f %f %f ]\n" + " /C1 [ %f %f %f ]\n" + " /N 1\n" + " >>\n", + stop1->color[0], + stop1->color[1], + stop1->color[2], + stop2->color[0], + stop2->color[1], + stop2->color[2]); +} + +static void +_cairo_ps_surface_emit_stitched_colorgradient (cairo_ps_surface_t *surface, + unsigned int n_stops, + cairo_ps_color_stop_t stops[]) +{ + unsigned int i; + + _cairo_output_stream_printf (surface->stream, + "<< /FunctionType 3\n" + " /Domain [ 0 1 ]\n" + " /Functions [\n"); + for (i = 0; i < n_stops - 1; i++) + _cairo_ps_surface_emit_linear_colorgradient (surface, &stops[i], &stops[i+1]); + + _cairo_output_stream_printf (surface->stream, " ]\n"); + + _cairo_output_stream_printf (surface->stream, " /Bounds [ "); + for (i = 1; i < n_stops-1; i++) + _cairo_output_stream_printf (surface->stream, "%f ", stops[i].offset); + _cairo_output_stream_printf (surface->stream, "]\n"); + + _cairo_output_stream_printf (surface->stream, " /Encode [ 1 1 %d { pop 0 1 } for ]\n", + n_stops - 1); + + _cairo_output_stream_printf (surface->stream, ">>\n"); +} + +static void +calc_gradient_color (cairo_ps_color_stop_t *new_stop, + cairo_ps_color_stop_t *stop1, + cairo_ps_color_stop_t *stop2) +{ + int i; + double offset = stop1->offset / (stop1->offset + 1.0 - stop2->offset); + + for (i = 0; i < 4; i++) + new_stop->color[i] = stop1->color[i] + offset*(stop2->color[i] - stop1->color[i]); +} + +#define COLOR_STOP_EPSILON 1e-6 + +static cairo_status_t +_cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, + cairo_gradient_pattern_t *pattern) +{ + cairo_ps_color_stop_t *allstops, *stops; + unsigned int i, n_stops; + + allstops = _cairo_malloc_ab ((pattern->n_stops + 2), sizeof (cairo_ps_color_stop_t)); + if (unlikely (allstops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + stops = &allstops[1]; + n_stops = pattern->n_stops; + + for (i = 0; i < n_stops; i++) { + cairo_gradient_stop_t *stop = &pattern->stops[i]; + + stops[i].color[0] = stop->color.red; + stops[i].color[1] = stop->color.green; + stops[i].color[2] = stop->color.blue; + stops[i].color[3] = stop->color.alpha; + stops[i].offset = pattern->stops[i].offset; + } + + if (pattern->base.extend == CAIRO_EXTEND_REPEAT || + pattern->base.extend == CAIRO_EXTEND_REFLECT) + { + if (stops[0].offset > COLOR_STOP_EPSILON) { + if (pattern->base.extend == CAIRO_EXTEND_REFLECT) + memcpy (allstops, stops, sizeof (cairo_ps_color_stop_t)); + else + calc_gradient_color (&allstops[0], &stops[0], &stops[n_stops-1]); + stops = allstops; + n_stops++; + } + stops[0].offset = 0.0; + + if (stops[n_stops-1].offset < 1.0 - COLOR_STOP_EPSILON) { + if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { + memcpy (&stops[n_stops], + &stops[n_stops - 1], + sizeof (cairo_ps_color_stop_t)); + } else { + calc_gradient_color (&stops[n_stops], &stops[0], &stops[n_stops-1]); + } + n_stops++; + } + stops[n_stops-1].offset = 1.0; + } + + for (i = 0; i < n_stops; i++) { + double red, green, blue; + cairo_color_t color; + + _cairo_color_init_rgba (&color, + stops[i].color[0], + stops[i].color[1], + stops[i].color[2], + stops[i].color[3]); + _cairo_ps_surface_flatten_transparency (surface, &color, + &red, &green, &blue); + stops[i].color[0] = red; + stops[i].color[1] = green; + stops[i].color[2] = blue; + } + + _cairo_output_stream_printf (surface->stream, + "/CairoFunction\n"); + if (stops[0].offset == stops[n_stops - 1].offset) { + /* + * The first and the last stops have the same offset, but we + * don't want a function with an empty domain, because that + * would provoke underdefined behaviour from rasterisers. + * This can only happen with EXTEND_PAD, because EXTEND_NONE + * is optimised into a clear pattern in cairo-gstate, and + * REFLECT/REPEAT are always transformed to have the first + * stop at t=0 and the last stop at t=1. Thus we want a step + * function going from the first color to the last one. + * + * This can be accomplished by stitching three functions: + * - a constant first color function, + * - a step from the first color to the last color (with empty domain) + * - a constant last color function + */ + cairo_ps_color_stop_t pad_stops[4]; + + assert (pattern->base.extend == CAIRO_EXTEND_PAD); + + pad_stops[0] = pad_stops[1] = stops[0]; + pad_stops[2] = pad_stops[3] = stops[n_stops - 1]; + + pad_stops[0].offset = 0; + pad_stops[3].offset = 1; + + _cairo_ps_surface_emit_stitched_colorgradient (surface, 4, pad_stops); + } else if (n_stops == 2) { + /* no need for stitched function */ + _cairo_ps_surface_emit_linear_colorgradient (surface, &stops[0], &stops[1]); + } else { + /* multiple stops: stitch. XXX possible optimization: regulary spaced + * stops do not require stitching. XXX */ + _cairo_ps_surface_emit_stitched_colorgradient (surface, n_stops, stops); + } + _cairo_output_stream_printf (surface->stream, + "def\n"); + + free (allstops); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_ps_surface_emit_repeating_function (cairo_ps_surface_t *surface, + cairo_gradient_pattern_t *pattern, + int begin, + int end) +{ + _cairo_output_stream_printf (surface->stream, + "/CairoFunction\n" + "<< /FunctionType 3\n" + " /Domain [ %d %d ]\n" + " /Functions [ %d {CairoFunction} repeat ]\n" + " /Bounds [ %d 1 %d {} for ]\n", + begin, + end, + end - begin, + begin + 1, + end - 1); + + if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { + _cairo_output_stream_printf (surface->stream, " /Encode [ %d 1 %d { 2 mod 0 eq {0 1} {1 0} ifelse } for ]\n", + begin, + end - 1); + } else { + _cairo_output_stream_printf (surface->stream, " /Encode [ %d 1 %d { pop 0 1 } for ]\n", + begin, + end - 1); + } + + _cairo_output_stream_printf (surface->stream, ">> def\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_ps_surface_emit_gradient (cairo_ps_surface_t *surface, + cairo_gradient_pattern_t *pattern, + cairo_bool_t is_ps_pattern) +{ + cairo_matrix_t pat_to_ps; + cairo_circle_double_t start, end; + double domain[2]; + cairo_status_t status; + + assert (pattern->n_stops != 0); + + status = _cairo_ps_surface_emit_pattern_stops (surface, pattern); + if (unlikely (status)) + return status; + + pat_to_ps = pattern->base.matrix; + status = cairo_matrix_invert (&pat_to_ps); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps); + + if (pattern->base.extend == CAIRO_EXTEND_REPEAT || + pattern->base.extend == CAIRO_EXTEND_REFLECT) + { + double bounds_x1, bounds_x2, bounds_y1, bounds_y2; + double x_scale, y_scale, tolerance; + + /* TODO: use tighter extents */ + bounds_x1 = 0; + bounds_y1 = 0; + bounds_x2 = surface->width; + bounds_y2 = surface->height; + _cairo_matrix_transform_bounding_box (&pattern->base.matrix, + &bounds_x1, &bounds_y1, + &bounds_x2, &bounds_y2, + NULL); + + x_scale = surface->base.x_resolution / surface->base.x_fallback_resolution; + y_scale = surface->base.y_resolution / surface->base.y_fallback_resolution; + + tolerance = fabs (_cairo_matrix_compute_determinant (&pattern->base.matrix)); + tolerance /= _cairo_matrix_transformed_circle_major_axis (&pattern->base.matrix, 1); + tolerance *= MIN (x_scale, y_scale); + + _cairo_gradient_pattern_box_to_parameter (pattern, + bounds_x1, bounds_y1, + bounds_x2, bounds_y2, + tolerance, domain); + } else if (pattern->stops[0].offset == pattern->stops[pattern->n_stops - 1].offset) { + /* + * If the first and the last stop offset are the same, then + * the color function is a step function. + * _cairo_ps_surface_emit_pattern_stops emits it as a stitched + * function no matter how many stops the pattern has. The + * domain of the stitched function will be [0 1] in this case. + * + * This is done to avoid emitting degenerate gradients for + * EXTEND_PAD patterns having a step color function. + */ + domain[0] = 0.0; + domain[1] = 1.0; + + assert (pattern->base.extend == CAIRO_EXTEND_PAD); + } else { + domain[0] = pattern->stops[0].offset; + domain[1] = pattern->stops[pattern->n_stops - 1].offset; + } + + /* PS requires the first and last stop to be the same as the + * extreme coordinates. For repeating patterns this moves the + * extreme coordinates out to the begin/end of the repeating + * function. For non repeating patterns this may move the extreme + * coordinates in if there are not stops at offset 0 and 1. */ + _cairo_gradient_pattern_interpolate (pattern, domain[0], &start); + _cairo_gradient_pattern_interpolate (pattern, domain[1], &end); + + if (pattern->base.extend == CAIRO_EXTEND_REPEAT || + pattern->base.extend == CAIRO_EXTEND_REFLECT) + { + int repeat_begin, repeat_end; + + repeat_begin = floor (domain[0]); + repeat_end = ceil (domain[1]); + + status = _cairo_ps_surface_emit_repeating_function (surface, + pattern, + repeat_begin, + repeat_end); + if (unlikely (status)) + return status; + } else if (pattern->n_stops <= 2) { + /* For EXTEND_NONE and EXTEND_PAD if there are only two stops a + * Type 2 function is used by itself without a stitching + * function. Type 2 functions always have the domain [0 1] */ + domain[0] = 0.0; + domain[1] = 1.0; + } + + if (is_ps_pattern) { + _cairo_output_stream_printf (surface->stream, + "<< /PatternType 2\n" + " /Shading\n"); + } + + if (pattern->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + _cairo_output_stream_printf (surface->stream, + " << /ShadingType 2\n" + " /ColorSpace /DeviceRGB\n" + " /Coords [ %f %f %f %f ]\n", + start.center.x, start.center.y, + end.center.x, end.center.y); + } else { + _cairo_output_stream_printf (surface->stream, + " << /ShadingType 3\n" + " /ColorSpace /DeviceRGB\n" + " /Coords [ %f %f %f %f %f %f ]\n", + start.center.x, start.center.y, + MAX (start.radius, 0), + end.center.x, end.center.y, + MAX (end.radius, 0)); + } + + if (pattern->base.extend != CAIRO_EXTEND_NONE) { + _cairo_output_stream_printf (surface->stream, + " /Extend [ true true ]\n"); + } else { + _cairo_output_stream_printf (surface->stream, + " /Extend [ false false ]\n"); + } + + if (domain[0] == 0.0 && domain[1] == 1.0) { + _cairo_output_stream_printf (surface->stream, + " /Function CairoFunction\n"); + } else { + _cairo_output_stream_printf (surface->stream, + " /Function <<\n" + " /FunctionType 3\n" + " /Domain [ 0 1 ]\n" + " /Bounds [ ]\n" + " /Encode [ %f %f ]\n" + " /Functions [ CairoFunction ]\n" + " >>\n", + domain[0], domain[1]); + } + + _cairo_output_stream_printf (surface->stream, + " >>\n"); + + if (is_ps_pattern) { + _cairo_output_stream_printf (surface->stream, + ">>\n" + "[ "); + _cairo_output_stream_print_matrix (surface->stream, &pat_to_ps); + _cairo_output_stream_printf (surface->stream, " ]\n" + "makepattern setpattern\n"); + } else { + _cairo_output_stream_printf (surface->stream, + "shfill\n"); + } + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_mesh_pattern (cairo_ps_surface_t *surface, + cairo_mesh_pattern_t *pattern, + cairo_bool_t is_ps_pattern) +{ + cairo_matrix_t pat_to_ps; + cairo_status_t status; + cairo_pdf_shading_t shading; + int i; + + if (_cairo_array_num_elements (&pattern->patches) == 0) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + pat_to_ps = pattern->base.matrix; + status = cairo_matrix_invert (&pat_to_ps); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps); + + status = _cairo_pdf_shading_init_color (&shading, pattern); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->stream, + "currentfile\n" + "/ASCII85Decode filter /FlateDecode filter /ReusableStreamDecode filter\n"); + + status = _cairo_ps_surface_emit_base85_string (surface, + shading.data, + shading.data_length, + CAIRO_PS_COMPRESS_DEFLATE, + FALSE); + if (status) + return status; + + _cairo_output_stream_printf (surface->stream, + "\n" + "/CairoData exch def\n"); + + if (is_ps_pattern) { + _cairo_output_stream_printf (surface->stream, + "<< /PatternType 2\n" + " /Shading\n"); + } + + _cairo_output_stream_printf (surface->stream, + " << /ShadingType %d\n" + " /ColorSpace /DeviceRGB\n" + " /DataSource CairoData\n" + " /BitsPerCoordinate %d\n" + " /BitsPerComponent %d\n" + " /BitsPerFlag %d\n" + " /Decode [", + shading.shading_type, + shading.bits_per_coordinate, + shading.bits_per_component, + shading.bits_per_flag); + + for (i = 0; i < shading.decode_array_length; i++) + _cairo_output_stream_printf (surface->stream, "%f ", shading.decode_array[i]); + + _cairo_output_stream_printf (surface->stream, + "]\n" + " >>\n"); + + if (is_ps_pattern) { + _cairo_output_stream_printf (surface->stream, + ">>\n" + "[ \n"); + _cairo_output_stream_print_matrix (surface->stream, &pat_to_ps); + _cairo_output_stream_printf (surface->stream, + " ]\n" + "makepattern\n" + "setpattern\n"); + } else { + _cairo_output_stream_printf (surface->stream, "shfill\n"); + } + + _cairo_output_stream_printf (surface->stream, + "currentdict /CairoData undef\n"); + + _cairo_pdf_shading_fini (&shading); + + return status; +} + +static cairo_status_t +_cairo_ps_surface_emit_pattern (cairo_ps_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_rectangle_int_t *extents, + cairo_operator_t op) +{ + cairo_status_t status; + + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; + + if (surface->current_pattern_is_solid_color == FALSE || + ! _cairo_color_equal (&surface->current_color, &solid->color)) + { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + _cairo_ps_surface_emit_solid_pattern (surface, (cairo_solid_pattern_t *) pattern); + + surface->current_pattern_is_solid_color = TRUE; + surface->current_color = solid->color; + } + + return CAIRO_STATUS_SUCCESS; + } + + surface->current_pattern_is_solid_color = FALSE; + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + return status; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + + _cairo_ps_surface_emit_solid_pattern (surface, (cairo_solid_pattern_t *) pattern); + break; + + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + status = _cairo_ps_surface_emit_surface_pattern (surface, + (cairo_pattern_t *)pattern, + extents, + op); + if (unlikely (status)) + return status; + break; + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + status = _cairo_ps_surface_emit_gradient (surface, + (cairo_gradient_pattern_t *) pattern, + TRUE); + if (unlikely (status)) + return status; + break; + + case CAIRO_PATTERN_TYPE_MESH: + status = _cairo_ps_surface_emit_mesh_pattern (surface, + (cairo_mesh_pattern_t *) pattern, + TRUE); + if (unlikely (status)) + return status; + break; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_ps_surface_paint_gradient (cairo_ps_surface_t *surface, + const cairo_pattern_t *source, + const cairo_rectangle_int_t *extents) +{ + cairo_matrix_t pat_to_ps; + cairo_status_t status; + + pat_to_ps = source->matrix; + status = cairo_matrix_invert (&pat_to_ps); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps); + + if (! _cairo_matrix_is_identity (&pat_to_ps)) { + _cairo_output_stream_printf (surface->stream, "["); + _cairo_output_stream_print_matrix (surface->stream, &pat_to_ps); + _cairo_output_stream_printf (surface->stream, "] concat\n"); + } + + if (source->type == CAIRO_PATTERN_TYPE_MESH) { + status = _cairo_ps_surface_emit_mesh_pattern (surface, + (cairo_mesh_pattern_t *)source, + FALSE); + if (unlikely (status)) + return status; + } else { + status = _cairo_ps_surface_emit_gradient (surface, + (cairo_gradient_pattern_t *)source, + FALSE); + if (unlikely (status)) + return status; + } + + return status; +} + +static cairo_status_t +_cairo_ps_surface_paint_pattern (cairo_ps_surface_t *surface, + const cairo_pattern_t *source, + cairo_rectangle_int_t *extents, + cairo_operator_t op, + cairo_bool_t stencil_mask) +{ + switch (source->type) { + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _cairo_ps_surface_paint_surface (surface, + (cairo_pattern_t *)source, + extents, + op, + stencil_mask); + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + return _cairo_ps_surface_paint_gradient (surface, + source, + extents); + + case CAIRO_PATTERN_TYPE_SOLID: + default: + ASSERT_NOT_REACHED; + return CAIRO_STATUS_SUCCESS; + } +} + +static cairo_bool_t +_can_paint_pattern (const cairo_pattern_t *pattern) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return FALSE; + + case CAIRO_PATTERN_TYPE_SURFACE: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return (pattern->extend == CAIRO_EXTEND_NONE || + pattern->extend == CAIRO_EXTEND_PAD); + + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + return TRUE; + + default: + ASSERT_NOT_REACHED; + return FALSE; + } +} + +static cairo_bool_t +_cairo_ps_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_ps_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + + /* XXX: The conversion to integers here is pretty bogus, (not to + * mention the aribitray limitation of width to a short(!). We + * may need to come up with a better interface for get_extents. + */ + rectangle->width = ceil (surface->width); + rectangle->height = ceil (surface->height); + + return TRUE; +} + +static void +_cairo_ps_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_OFF); +} + +static cairo_int_status_t +_cairo_ps_surface_set_clip (cairo_ps_surface_t *surface, + cairo_composite_rectangles_t *composite) +{ + cairo_clip_t *clip = composite->clip; + + if (_cairo_composite_rectangles_can_reduce_clip (composite, clip)) + clip = NULL; + + if (clip == NULL) { + if (_cairo_composite_rectangles_can_reduce_clip (composite, + surface->clipper.clip)) + return CAIRO_STATUS_SUCCESS; + } + + return _cairo_surface_clipper_set_clip (&surface->clipper, clip); +} + +static cairo_int_status_t +_cairo_ps_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_output_stream_t *stream = surface->stream; + cairo_composite_rectangles_t extents; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_paint (&extents, + &surface->base, + op, source, clip); + if (unlikely (status)) + return status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_ps_surface_analyze_operation (surface, op, source, NULL, &extents.bounded); + goto cleanup_composite; + } + + assert (_cairo_ps_surface_operation_supported (surface, op, source, NULL, &extents.bounded)); + +#if DEBUG_PS + _cairo_output_stream_printf (stream, + "%% _cairo_ps_surface_paint\n"); +#endif + + status = _cairo_ps_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup_composite; + + if (_can_paint_pattern (source)) { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_output_stream_printf (stream, "q\n"); + status = _cairo_ps_surface_paint_pattern (surface, + source, + &extents.bounded, op, FALSE); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_output_stream_printf (stream, "Q\n"); + } else { + status = _cairo_ps_surface_emit_pattern (surface, source, &extents.bounded, op); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_output_stream_printf (stream, "0 0 %f %f rectfill\n", + surface->width, surface->height); + } + +cleanup_composite: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_ps_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_output_stream_t *stream = surface->stream; + cairo_composite_rectangles_t extents; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_mask (&extents, + &surface->base, + op, source, mask, clip); + if (unlikely (status)) + return status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_ps_surface_analyze_operation (surface, op, source, mask, &extents.bounded); + goto cleanup_composite; + } + + assert (_cairo_ps_surface_operation_supported (surface, op, source, mask, &extents.bounded)); + +#if DEBUG_PS + _cairo_output_stream_printf (stream, + "%% _cairo_ps_surface_mask\n"); +#endif + + status = _cairo_ps_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_ps_surface_emit_pattern (surface, source, &extents.bounded, op); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_output_stream_printf (stream, "q\n"); + status = _cairo_ps_surface_paint_pattern (surface, + mask, + &extents.bounded, op, TRUE); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_output_stream_printf (stream, "Q\n"); + +cleanup_composite: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_ps_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + status = _cairo_composite_rectangles_init_for_stroke (&extents, + &surface->base, + op, source, + path, style, ctm, + clip); + if (unlikely (status)) + return status; + + /* use the more accurate extents */ + { + cairo_rectangle_int_t r; + cairo_box_t b; + + status = _cairo_path_fixed_stroke_extents (path, style, + ctm, ctm_inverse, + tolerance, + &r); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_box_from_rectangle (&b, &r); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, &b); + if (unlikely (status)) + goto cleanup_composite; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_ps_surface_analyze_operation (surface, op, source, NULL, &extents.bounded); + goto cleanup_composite; + } + + assert (_cairo_ps_surface_operation_supported (surface, op, source, NULL, &extents.bounded)); + +#if DEBUG_PS + _cairo_output_stream_printf (surface->stream, + "%% _cairo_ps_surface_stroke\n"); +#endif + + status = _cairo_ps_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_ps_surface_emit_pattern (surface, source, &extents.bounded, op); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_pdf_operators_stroke (&surface->pdf_operators, + path, + style, + ctm, + ctm_inverse); + +cleanup_composite: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_int_status_t +_cairo_ps_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_composite_rectangles_t extents; + cairo_int_status_t status; + + status = _cairo_composite_rectangles_init_for_fill (&extents, + &surface->base, + op, source, path, + clip); + if (unlikely (status)) + return status; + + /* use the more accurate extents */ + { + cairo_rectangle_int_t r; + cairo_box_t b; + + _cairo_path_fixed_fill_extents (path, + fill_rule, + tolerance, + &r); + + _cairo_box_from_rectangle (&b, &r); + status = _cairo_composite_rectangles_intersect_mask_extents (&extents, &b); + if (unlikely (status)) + goto cleanup_composite; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_ps_surface_analyze_operation (surface, op, source, NULL, &extents.bounded); + goto cleanup_composite; + } + + assert (_cairo_ps_surface_operation_supported (surface, op, source, NULL, &extents.bounded)); + +#if DEBUG_PS + _cairo_output_stream_printf (surface->stream, + "%% _cairo_ps_surface_fill\n"); +#endif + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_ps_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup_composite; + + if (_can_paint_pattern (source)) { + _cairo_output_stream_printf (surface->stream, "q\n"); + + status = _cairo_pdf_operators_clip (&surface->pdf_operators, + path, + fill_rule); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_ps_surface_paint_pattern (surface, + source, + &extents.bounded, op, FALSE); + if (unlikely (status)) + goto cleanup_composite; + + _cairo_output_stream_printf (surface->stream, "Q\n"); + _cairo_pdf_operators_reset (&surface->pdf_operators); + } else { + status = _cairo_ps_surface_emit_pattern (surface, source, &extents.bounded, op); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_pdf_operators_fill (&surface->pdf_operators, + path, + fill_rule); + } + +cleanup_composite: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static cairo_bool_t +_cairo_ps_surface_has_show_text_glyphs (void *abstract_surface) +{ + return TRUE; +} + +static cairo_int_status_t +_cairo_ps_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_composite_rectangles_t extents; + cairo_bool_t overlap; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_glyphs (&extents, + &surface->base, + op, source, + scaled_font, + glyphs, num_glyphs, + clip, + &overlap); + if (unlikely (status)) + return status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + status = _cairo_ps_surface_analyze_operation (surface, op, source, NULL, &extents.bounded); + goto cleanup_composite; + } + + assert (_cairo_ps_surface_operation_supported (surface, op, source, NULL, &extents.bounded)); + +#if DEBUG_PS + _cairo_output_stream_printf (surface->stream, + "%% _cairo_ps_surface_show_glyphs\n"); +#endif + + status = _cairo_ps_surface_set_clip (surface, &extents); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_ps_surface_emit_pattern (surface, source, &extents.bounded, op); + if (unlikely (status)) + goto cleanup_composite; + + status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font); + +cleanup_composite: + _cairo_composite_rectangles_fini (&extents); + return status; +} + +static const char ** +_cairo_ps_surface_get_supported_mime_types (void *abstract_surface) +{ + return _cairo_ps_supported_mime_types; +} + +static void +_cairo_ps_surface_set_paginated_mode (void *abstract_surface, + cairo_paginated_mode_t paginated_mode) +{ + cairo_ps_surface_t *surface = abstract_surface; + cairo_status_t status; + + surface->paginated_mode = paginated_mode; + + if (surface->clipper.clip != NULL) { + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + + _cairo_output_stream_printf (surface->stream, "Q q\n"); + _cairo_surface_clipper_reset (&surface->clipper); + } +} + +static cairo_int_status_t +_cairo_ps_surface_set_bounding_box (void *abstract_surface, + cairo_box_t *bbox) +{ + cairo_ps_surface_t *surface = abstract_surface; + int i, num_comments; + char **comments; + int x1, y1, x2, y2; + cairo_bool_t has_page_media, has_page_bbox; + const char *page_media; + + x1 = floor (_cairo_fixed_to_double (bbox->p1.x)); + y1 = floor (surface->height - _cairo_fixed_to_double (bbox->p2.y)); + x2 = ceil (_cairo_fixed_to_double (bbox->p2.x)); + y2 = ceil (surface->height - _cairo_fixed_to_double (bbox->p1.y)); + + surface->page_bbox.x = x1; + surface->page_bbox.y = y1; + surface->page_bbox.width = x2 - x1; + surface->page_bbox.height = y2 - y1; + + _cairo_output_stream_printf (surface->stream, + "%%%%Page: %d %d\n", + surface->num_pages, + surface->num_pages); + + _cairo_output_stream_printf (surface->stream, + "%%%%BeginPageSetup\n"); + + has_page_media = FALSE; + has_page_bbox = FALSE; + num_comments = _cairo_array_num_elements (&surface->dsc_page_setup_comments); + comments = _cairo_array_index (&surface->dsc_page_setup_comments, 0); + for (i = 0; i < num_comments; i++) { + _cairo_output_stream_printf (surface->stream, + "%s\n", comments[i]); + if (strncmp (comments[i], "%%PageMedia:", 11) == 0) + has_page_media = TRUE; + + if (strncmp (comments[i], "%%PageBoundingBox:", 18) == 0) + has_page_bbox = TRUE; + + free (comments[i]); + comments[i] = NULL; + } + _cairo_array_truncate (&surface->dsc_page_setup_comments, 0); + + if (!has_page_media && !surface->eps) { + page_media = _cairo_ps_surface_get_page_media (surface); + if (unlikely (page_media == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_output_stream_printf (surface->stream, + "%%%%PageMedia: %s\n", + page_media); + } + + if (!has_page_bbox) { + _cairo_output_stream_printf (surface->stream, + "%%%%PageBoundingBox: %d %d %d %d\n", + x1, y1, x2, y2); + } + + if (!surface->eps) { + _cairo_output_stream_printf (surface->stream, + "%f %f cairo_set_page_size\n", + ceil(surface->width), + ceil(surface->height)); + } + + _cairo_output_stream_printf (surface->stream, + "%%%%EndPageSetup\n" + "q %d %d %d %d rectclip q\n", + surface->page_bbox.x, + surface->page_bbox.y, + surface->page_bbox.width, + surface->page_bbox.height); + + if (surface->num_pages == 1) { + surface->bbox_x1 = x1; + surface->bbox_y1 = y1; + surface->bbox_x2 = x2; + surface->bbox_y2 = y2; + } else { + if (x1 < surface->bbox_x1) + surface->bbox_x1 = x1; + if (y1 < surface->bbox_y1) + surface->bbox_y1 = y1; + if (x2 > surface->bbox_x2) + surface->bbox_x2 = x2; + if (y2 > surface->bbox_y2) + surface->bbox_y2 = y2; + } + surface->current_pattern_is_solid_color = FALSE; + _cairo_pdf_operators_reset (&surface->pdf_operators); + + return _cairo_output_stream_get_status (surface->stream); +} + +static cairo_bool_t +_cairo_ps_surface_supports_fine_grained_fallbacks (void *abstract_surface) +{ + return TRUE; +} + +static const cairo_surface_backend_t cairo_ps_surface_backend = { + CAIRO_SURFACE_TYPE_PS, + _cairo_ps_surface_finish, + + _cairo_default_context_create, + + NULL, /* create similar: handled by wrapper */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* cairo_ps_surface_copy_page */ + _cairo_ps_surface_show_page, + + _cairo_ps_surface_get_extents, + _cairo_ps_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + /* Here are the drawing functions */ + + _cairo_ps_surface_paint, /* paint */ + _cairo_ps_surface_mask, + _cairo_ps_surface_stroke, + _cairo_ps_surface_fill, + NULL, /* fill-stroke */ + NULL, /* show_glyphs */ + _cairo_ps_surface_has_show_text_glyphs, + _cairo_ps_surface_show_text_glyphs, + _cairo_ps_surface_get_supported_mime_types, +}; + +static const cairo_paginated_surface_backend_t cairo_ps_surface_paginated_backend = { + _cairo_ps_surface_start_page, + _cairo_ps_surface_set_paginated_mode, + _cairo_ps_surface_set_bounding_box, + NULL, /* _cairo_ps_surface_has_fallback_images, */ + _cairo_ps_surface_supports_fine_grained_fallbacks, +}; diff --git a/src/cairo-ps.h b/src/cairo-ps.h new file mode 100644 index 000000000..33d0e0d94 --- /dev/null +++ b/src/cairo-ps.h @@ -0,0 +1,116 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_PS_H +#define CAIRO_PS_H + +#include "cairo.h" + +#if CAIRO_HAS_PS_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +/* PS-surface functions */ + +/** + * cairo_ps_level_t: + * @CAIRO_PS_LEVEL_2: The language level 2 of the PostScript specification. (Since 1.6) + * @CAIRO_PS_LEVEL_3: The language level 3 of the PostScript specification. (Since 1.6) + * + * #cairo_ps_level_t is used to describe the language level of the + * PostScript Language Reference that a generated PostScript file will + * conform to. + * + * Since: 1.6 + **/ +typedef enum _cairo_ps_level { + CAIRO_PS_LEVEL_2, + CAIRO_PS_LEVEL_3 +} cairo_ps_level_t; + +cairo_public cairo_surface_t * +cairo_ps_surface_create (const char *filename, + double width_in_points, + double height_in_points); + +cairo_public cairo_surface_t * +cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); + +cairo_public void +cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, + cairo_ps_level_t level); + +cairo_public void +cairo_ps_get_levels (cairo_ps_level_t const **levels, + int *num_levels); + +cairo_public const char * +cairo_ps_level_to_string (cairo_ps_level_t level); + +cairo_public void +cairo_ps_surface_set_eps (cairo_surface_t *surface, + cairo_bool_t eps); + +cairo_public cairo_bool_t +cairo_ps_surface_get_eps (cairo_surface_t *surface); + +cairo_public void +cairo_ps_surface_set_size (cairo_surface_t *surface, + double width_in_points, + double height_in_points); + +cairo_public void +cairo_ps_surface_dsc_comment (cairo_surface_t *surface, + const char *comment); + +cairo_public void +cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface); + +cairo_public void +cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_PS_SURFACE */ +# error Cairo was not compiled with support for the ps backend +#endif /* CAIRO_HAS_PS_SURFACE */ + +#endif /* CAIRO_PS_H */ diff --git a/src/cairo-qt-surface.cpp b/src/cairo-qt-surface.cpp new file mode 100644 index 000000000..7ddad77df --- /dev/null +++ b/src/cairo-qt-surface.cpp @@ -0,0 +1,1738 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Corporation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +/* Get INT16_MIN etc. as per C99 */ +#define __STDC_LIMIT_MACROS + +#include "cairoint.h" + +#include "cairo-clip-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-region-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-types-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-fallback-private.h" + +#include "cairo-ft.h" +#include "cairo-qt.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if ((QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)) || defined(QT_GLYPHS_API_BACKPORT)) && 0 +extern void qt_draw_glyphs(QPainter *, const quint32 *glyphs, const QPointF *positions, int count); +#endif + +#include + +/* Enable workaround slow regional Qt paths */ +#define ENABLE_FAST_FILL 0 +#define ENABLE_FAST_CLIP 0 + +#if 0 +#define D(x) x +static const char * +_opstr (cairo_operator_t op) +{ + const char *ops[] = { + "CLEAR", + "SOURCE", + "OVER", + "IN", + "OUT", + "ATOP", + "DEST", + "DEST_OVER", + "DEST_IN", + "DEST_OUT", + "DEST_ATOP", + "XOR", + "ADD", + "SATURATE" + }; + + if (op < CAIRO_OPERATOR_CLEAR || op > CAIRO_OPERATOR_SATURATE) + return "(\?\?\?)"; + + return ops[op]; +} +#else +#define D(x) do { } while(0) +#endif + +#ifndef CAIRO_INT_STATUS_SUCCESS +#define CAIRO_INT_STATUS_SUCCESS ((cairo_int_status_t) CAIRO_STATUS_SUCCESS) +#endif + +/* Qt::PenStyle optimization based on the assumption that dots are 1*w and dashes are 3*w. */ +#define DOT_LENGTH 1.0 +#define DASH_LENGTH 3.0 + +struct cairo_qt_surface_t { + cairo_surface_t base; + + cairo_bool_t supports_porter_duff; + + QPainter *p; + + /* The pixmap/image constructors will store their objects here */ + QPixmap *pixmap; + QImage *image; + + QRect window; + + cairo_surface_clipper_t clipper; + + cairo_surface_t *image_equiv; +}; + +/* Will be true if we ever try to create a QPixmap and end + * up with one without an alpha channel. + */ +static cairo_bool_t _qpixmaps_have_no_alpha = FALSE; + +/* + * Helper methods + */ + +static QPainter::CompositionMode +_qpainter_compositionmode_from_cairo_op (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_CLEAR: + return QPainter::CompositionMode_Clear; + + case CAIRO_OPERATOR_SOURCE: + return QPainter::CompositionMode_Source; + case CAIRO_OPERATOR_OVER: + return QPainter::CompositionMode_SourceOver; + case CAIRO_OPERATOR_IN: + return QPainter::CompositionMode_SourceIn; + case CAIRO_OPERATOR_OUT: + return QPainter::CompositionMode_SourceOut; + case CAIRO_OPERATOR_ATOP: + return QPainter::CompositionMode_SourceAtop; + + case CAIRO_OPERATOR_DEST: + return QPainter::CompositionMode_Destination; + case CAIRO_OPERATOR_DEST_OVER: + return QPainter::CompositionMode_DestinationOver; + case CAIRO_OPERATOR_DEST_IN: + return QPainter::CompositionMode_DestinationIn; + case CAIRO_OPERATOR_DEST_OUT: + return QPainter::CompositionMode_DestinationOut; + case CAIRO_OPERATOR_DEST_ATOP: + return QPainter::CompositionMode_DestinationAtop; + + case CAIRO_OPERATOR_XOR: + return QPainter::CompositionMode_Xor; + + default: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + ASSERT_NOT_REACHED; + } +} + +static bool +_op_is_supported (cairo_qt_surface_t *qs, cairo_operator_t op) +{ + if (qs->p == NULL) + return false; + + if (qs->supports_porter_duff) { + switch (op) { + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_ATOP: + + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_DEST_ATOP: + + case CAIRO_OPERATOR_XOR: + return TRUE; + + default: + ASSERT_NOT_REACHED; + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return FALSE; + + } + } else { + return op == CAIRO_OPERATOR_OVER; + } +} + +static cairo_format_t +_cairo_format_from_qimage_format (QImage::Format fmt) +{ + switch (fmt) { + case QImage::Format_ARGB32_Premultiplied: + return CAIRO_FORMAT_ARGB32; + case QImage::Format_RGB32: + return CAIRO_FORMAT_RGB24; + case QImage::Format_Indexed8: // XXX not quite + return CAIRO_FORMAT_A8; +#ifdef WORDS_BIGENDIAN + case QImage::Format_Mono: +#else + case QImage::Format_MonoLSB: +#endif + return CAIRO_FORMAT_A1; + + case QImage::Format_Invalid: +#ifdef WORDS_BIGENDIAN + case QImage::Format_MonoLSB: +#else + case QImage::Format_Mono: +#endif + case QImage::Format_ARGB32: + case QImage::Format_RGB16: + case QImage::Format_ARGB8565_Premultiplied: + case QImage::Format_RGB666: + case QImage::Format_ARGB6666_Premultiplied: + case QImage::Format_RGB555: + case QImage::Format_ARGB8555_Premultiplied: + case QImage::Format_RGB888: + case QImage::Format_RGB444: + case QImage::Format_ARGB4444_Premultiplied: + case QImage::NImageFormats: + default: + ASSERT_NOT_REACHED; + return (cairo_format_t) -1; + } +} + +static QImage::Format +_qimage_format_from_cairo_format (cairo_format_t fmt) +{ + switch (fmt) { + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_ARGB32: + return QImage::Format_ARGB32_Premultiplied; + case CAIRO_FORMAT_RGB24: + return QImage::Format_RGB32; + case CAIRO_FORMAT_RGB16_565: + return QImage::Format_RGB16; + case CAIRO_FORMAT_A8: + return QImage::Format_Indexed8; // XXX not quite + case CAIRO_FORMAT_A1: +#ifdef WORDS_BIGENDIAN + return QImage::Format_Mono; // XXX think we need to choose between this and LSB +#else + return QImage::Format_MonoLSB; +#endif + case CAIRO_FORMAT_RGB30: + return QImage::Format_Mono; + } + + return QImage::Format_Mono; +} + +static inline QMatrix +_qmatrix_from_cairo_matrix (const cairo_matrix_t& m) +{ + return QMatrix(m.xx, m.yx, m.xy, m.yy, m.x0, m.y0); +} + +/* Path conversion */ +typedef struct _qpainter_path_transform { + QPainterPath path; + const cairo_matrix_t *ctm_inverse; +} qpainter_path_data; + +/* cairo path -> execute in context */ +static cairo_status_t +_cairo_path_to_qpainterpath_move_to (void *closure, const cairo_point_t *point) +{ + qpainter_path_data *pdata = static_cast (closure); + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (pdata->ctm_inverse) + cairo_matrix_transform_point (pdata->ctm_inverse, &x, &y); + + pdata->path.moveTo(x, y); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_to_qpainterpath_line_to (void *closure, const cairo_point_t *point) +{ + qpainter_path_data *pdata = static_cast (closure); + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (pdata->ctm_inverse) + cairo_matrix_transform_point (pdata->ctm_inverse, &x, &y); + + pdata->path.lineTo(x, y); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_to_qpainterpath_curve_to (void *closure, const cairo_point_t *p0, const cairo_point_t *p1, const cairo_point_t *p2) +{ + qpainter_path_data *pdata = static_cast (closure); + double x0 = _cairo_fixed_to_double (p0->x); + double y0 = _cairo_fixed_to_double (p0->y); + double x1 = _cairo_fixed_to_double (p1->x); + double y1 = _cairo_fixed_to_double (p1->y); + double x2 = _cairo_fixed_to_double (p2->x); + double y2 = _cairo_fixed_to_double (p2->y); + + if (pdata->ctm_inverse) { + cairo_matrix_transform_point (pdata->ctm_inverse, &x0, &y0); + cairo_matrix_transform_point (pdata->ctm_inverse, &x1, &y1); + cairo_matrix_transform_point (pdata->ctm_inverse, &x2, &y2); + } + + pdata->path.cubicTo (x0, y0, x1, y1, x2, y2); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_to_qpainterpath_close_path (void *closure) +{ + qpainter_path_data *pdata = static_cast (closure); + + pdata->path.closeSubpath(); + + return CAIRO_STATUS_SUCCESS; +} + +static QPainterPath +path_to_qt (const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm_inverse = NULL) +{ + qpainter_path_data data; + cairo_status_t status; + + if (ctm_inverse && _cairo_matrix_is_identity (ctm_inverse)) + ctm_inverse = NULL; + data.ctm_inverse = ctm_inverse; + + status = _cairo_path_fixed_interpret (path, + _cairo_path_to_qpainterpath_move_to, + _cairo_path_to_qpainterpath_line_to, + _cairo_path_to_qpainterpath_curve_to, + _cairo_path_to_qpainterpath_close_path, + &data); + assert (status == CAIRO_STATUS_SUCCESS); + + return data.path; +} + +static inline QPainterPath +path_to_qt (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + cairo_matrix_t *ctm_inverse = NULL) +{ + QPainterPath qpath = path_to_qt (path, ctm_inverse); + + qpath.setFillRule (fill_rule == CAIRO_FILL_RULE_WINDING ? + Qt::WindingFill : + Qt::OddEvenFill); + + return qpath; +} + +/* + * Surface backend methods + */ +static cairo_surface_t * +_cairo_qt_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + bool use_pixmap; + + D(fprintf(stderr, "q[%p] create_similar: %d %d [%d] -> ", abstract_surface, width, height, content)); + + use_pixmap = qs->image == NULL; + if (use_pixmap) { + switch (content) { + case CAIRO_CONTENT_ALPHA: + use_pixmap = FALSE; + break; + case CAIRO_CONTENT_COLOR: + break; + case CAIRO_CONTENT_COLOR_ALPHA: + use_pixmap = ! _qpixmaps_have_no_alpha; + break; + } + } + + if (use_pixmap) { + cairo_surface_t *result = + cairo_qt_surface_create_with_qpixmap (content, width, height); + + /* XXX result->content is always content. ??? */ + if (result->content == content) { + D(fprintf(stderr, "qpixmap content: %d\n", content)); + return result; + } + + _qpixmaps_have_no_alpha = TRUE; + cairo_surface_destroy (result); + } + + D(fprintf (stderr, "qimage\n")); + return cairo_qt_surface_create_with_qimage + (_cairo_format_from_content (content), width, height); +} + +static cairo_status_t +_cairo_qt_surface_finish (void *abstract_surface) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] finish\n", abstract_surface)); + + /* Only delete p if we created it */ + if (qs->image || qs->pixmap) + delete qs->p; + else + qs->p->restore (); + + if (qs->image_equiv) + cairo_surface_destroy (qs->image_equiv); + + _cairo_surface_clipper_reset (&qs->clipper); + + if (qs->image) + delete qs->image; + + if (qs->pixmap) + delete qs->pixmap; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_qimg_destroy (void *closure) +{ + QImage *qimg = (QImage *) closure; + delete qimg; +} + +static cairo_status_t +_cairo_qt_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] acquire_source_image\n", abstract_surface)); + + *image_extra = NULL; + + if (qs->image_equiv) { + *image_out = (cairo_image_surface_t*) + cairo_surface_reference (qs->image_equiv); + + return CAIRO_STATUS_SUCCESS; + } + + if (qs->pixmap) { + QImage *qimg = new QImage(qs->pixmap->toImage()); + cairo_surface_t *image; + cairo_status_t status; + + image = cairo_image_surface_create_for_data (qimg->bits(), + _cairo_format_from_qimage_format (qimg->format()), + qimg->width(), qimg->height(), + qimg->bytesPerLine()); + + status = _cairo_user_data_array_set_data (&image->user_data, + (const cairo_user_data_key_t *)&_qimg_destroy, + qimg, + _qimg_destroy); + if (status) { + cairo_surface_destroy (image); + return status; + } + + *image_out = (cairo_image_surface_t *) image; + return CAIRO_STATUS_SUCCESS; + } + + return _cairo_error (CAIRO_STATUS_NO_MEMORY); +} + +static void +_cairo_qt_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + //cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] release_source_image\n", abstract_surface)); + + cairo_surface_destroy (&image->base); +} + +struct _qimage_surface { + cairo_image_surface_t image; + QImage *qimg; +}; + +static cairo_surface_t * +map_qimage_to_image (QImage *qimg, const cairo_rectangle_int_t *extents) +{ + struct _qimage_surface *surface; + pixman_image_t *pixman_image; + pixman_format_code_t pixman_format; + uint8_t *data; + + if (qimg == NULL) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + switch (qimg->format()) { + case QImage::Format_ARGB32_Premultiplied: + pixman_format = PIXMAN_a8r8g8b8; + break; + case QImage::Format_RGB32: + pixman_format = PIXMAN_x8r8g8b8; + break; + case QImage::Format_Indexed8: // XXX not quite + pixman_format = PIXMAN_a8; + break; +#ifdef WORDS_BIGENDIAN + case QImage::Format_Mono: +#else + case QImage::Format_MonoLSB: +#endif + pixman_format = PIXMAN_a1; + break; + + case QImage::Format_Invalid: +#ifdef WORDS_BIGENDIAN + case QImage::Format_MonoLSB: +#else + case QImage::Format_Mono: +#endif + case QImage::Format_ARGB32: + case QImage::Format_RGB16: + case QImage::Format_ARGB8565_Premultiplied: + case QImage::Format_RGB666: + case QImage::Format_ARGB6666_Premultiplied: + case QImage::Format_RGB555: + case QImage::Format_ARGB8555_Premultiplied: + case QImage::Format_RGB888: + case QImage::Format_RGB444: + case QImage::Format_ARGB4444_Premultiplied: + case QImage::NImageFormats: + default: + delete qimg; + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_FORMAT); + } + + data = qimg->bits(); + data += extents->y * qimg->bytesPerLine(); + data += extents->x * PIXMAN_FORMAT_BPP (pixman_format) / 8; + + pixman_image = pixman_image_create_bits (pixman_format, + extents->width, + extents->height, + (uint32_t *)data, + qimg->bytesPerLine()); + if (pixman_image == NULL) { + delete qimg; + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + surface = (struct _qimage_surface *) malloc (sizeof(*surface)); + if (unlikely (surface == NULL)) { + pixman_image_unref (pixman_image); + delete qimg; + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_image_surface_init (&surface->image, pixman_image, pixman_format); + surface->qimg = qimg; + + cairo_surface_set_device_offset (&surface->image.base, + -extents->x, -extents->y); + + return &surface->image.base; +} + +static cairo_image_surface_t * +_cairo_qt_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + QImage *qimg = NULL; + + D(fprintf(stderr, "q[%p] acquire_dest_image\n", abstract_surface)); + + if (qs->image_equiv) + return _cairo_image_surface_map_to_image (qs->image_equiv, + extents); + + QPoint offset; + + if (qs->pixmap) { + qimg = new QImage(qs->pixmap->toImage()); + } else { + // Try to figure out what kind of QPaintDevice we have, and + // how we can grab an image from it + QPaintDevice *pd = qs->p->device(); + if (!pd) + return (cairo_image_surface_t *) _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + QPaintDevice *rpd = QPainter::redirected(pd, &offset); + if (rpd) + pd = rpd; + + if (pd->devType() == QInternal::Image) { + qimg = new QImage(((QImage*) pd)->copy()); + } else if (pd->devType() == QInternal::Pixmap) { + qimg = new QImage(((QPixmap*) pd)->toImage()); + } else if (pd->devType() == QInternal::Widget) { + qimg = new QImage(QPixmap::grabWindow(((QWidget*)pd)->winId()).toImage()); + } + } + + return (cairo_image_surface_t *) map_qimage_to_image (qimg, extents); +} + +static cairo_int_status_t +_cairo_qt_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] release_dest_image\n", abstract_surface)); + + if (!qs->image_equiv) { + struct _qimage_surface *qimage = (struct _qimage_surface *)image; + + // XXX should I be using setBackgroundMode here instead of setCompositionMode? + if (qs->supports_porter_duff) + qs->p->setCompositionMode (QPainter::CompositionMode_Source); + + qs->p->drawImage ((int)qimage->image.base.device_transform.x0, + (int)qimage->image.base.device_transform.y0, + *qimage->qimg, + (int)qimage->image.base.device_transform.x0, + (int)qimage->image.base.device_transform.y0, + (int)qimage->image.width, + (int)qimage->image.height); + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (QPainter::CompositionMode_SourceOver); + + delete qimage->qimg; + } + + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_qt_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + extents->x = qs->window.x(); + extents->y = qs->window.y(); + extents->width = qs->window.width(); + extents->height = qs->window.height(); + + return TRUE; +} + +static cairo_status_t +_cairo_qt_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_qt_surface_t *qs = cairo_container_of (clipper, + cairo_qt_surface_t, + clipper); + + if (path == NULL) { + if (qs->pixmap || qs->image) { + // we own p + qs->p->setClipping (false); + } else { + qs->p->restore (); + qs->p->save (); + } + } else { + // XXX Antialiasing is ignored + qs->p->setClipPath (path_to_qt (path, fill_rule), Qt::IntersectClip); + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_qt_surface_set_clip_region (cairo_qt_surface_t *qs, + const cairo_region_t *clip_region) +{ + _cairo_surface_clipper_reset (&qs->clipper); + + if (clip_region == NULL) { + // How the clip path is reset depends on whether we own p or not + if (qs->pixmap || qs->image) { + // we own p + qs->p->setClipping (false); + } else { + qs->p->restore (); + qs->p->save (); + } + } else { + QRegion qr; + int num_rects = cairo_region_num_rectangles (clip_region); + for (int i = 0; i < num_rects; ++i) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, i, &rect); + + QRect r(rect.x, rect.y, rect.width, rect.height); + qr = qr.unite(r); + } + + qs->p->setClipRegion (qr, Qt::IntersectClip); + } +} + +static cairo_int_status_t +_cairo_qt_surface_set_clip (cairo_qt_surface_t *qs, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + D(fprintf(stderr, "q[%p] intersect_clip_path %s\n", abstract_surface, path ? "(path)" : "(clear)")); + + if (clip == NULL) { + _cairo_surface_clipper_reset (&qs->clipper); + // How the clip path is reset depends on whether we own p or not + if (qs->pixmap || qs->image) { + // we own p + qs->p->setClipping (false); + } else { + qs->p->restore (); + qs->p->save (); + } + + return CAIRO_INT_STATUS_SUCCESS; + } + +#if ENABLE_FAST_CLIP + // Qt will implicitly enable clipping, and will use ReplaceClip + // instead of IntersectClip if clipping was disabled before + + // Note: Qt is really bad at dealing with clip paths. It doesn't + // seem to usefully recognize rectangular paths, instead going down + // extremely slow paths whenever a clip path is set. So, + // we do a bunch of work here to try to get rectangles or regions + // down to Qt for clipping. + + cairo_region_t *clip_region = NULL; + + status = _cairo_clip_get_region (clip, &clip_region); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + // We weren't able to extract a region from the traps. + // Just hand the path down to QPainter. + status = (cairo_int_status_t) + _cairo_surface_clipper_set_clip (&qs->clipper, clip); + } else if (status == CAIRO_INT_STATUS_SUCCESS) { + _cairo_qt_surface_set_clip_region (qs, clip_region); + status = CAIRO_INT_STATUS_SUCCESS; + } +#else + status = (cairo_int_status_t) + _cairo_surface_clipper_set_clip (&qs->clipper, clip); +#endif + + return status; +} + +/* + * Brush conversion + */ + +struct PatternToBrushConverter { + PatternToBrushConverter (const cairo_pattern_t *pattern) + __attribute__ ((noinline)) : + mAcquiredImageParent(0), + mAcquiredImage(0), + mAcquiredImageExtra(0) + { + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t*) pattern; + QColor color; + color.setRgbF(solid->color.red, + solid->color.green, + solid->color.blue, + solid->color.alpha); + + mBrush = QBrush(color); + } else if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *spattern = (cairo_surface_pattern_t*) pattern; + cairo_surface_t *surface = spattern->surface; + + if (surface->type == CAIRO_SURFACE_TYPE_QT) { + cairo_qt_surface_t *qs = (cairo_qt_surface_t*) surface; + + if (qs->image) { + mBrush = QBrush(*qs->image); + } else if (qs->pixmap) { + mBrush = QBrush(*qs->pixmap); + } else { + // do something smart + mBrush = QBrush(0xff0000ff); + } + } else { + cairo_image_surface_t *isurf = NULL; + + if (surface->type == CAIRO_SURFACE_TYPE_IMAGE) { + isurf = (cairo_image_surface_t*) surface; + } else { + void *image_extra; + + if (_cairo_surface_acquire_source_image (surface, &isurf, &image_extra) == CAIRO_STATUS_SUCCESS) { + mAcquiredImageParent = surface; + mAcquiredImage = isurf; + mAcquiredImageExtra = image_extra; + } else { + isurf = NULL; + } + } + + if (isurf) { + mBrush = QBrush (QImage ((const uchar *) isurf->data, + isurf->width, + isurf->height, + isurf->stride, + _qimage_format_from_cairo_format (isurf->format))); + } else { + mBrush = QBrush(0x0000ffff); + } + } + } else if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || + pattern->type == CAIRO_PATTERN_TYPE_RADIAL) + { + QGradient *grad; + cairo_bool_t reverse_stops = FALSE; + cairo_bool_t emulate_reflect = FALSE; + double offset = 0.0; + + cairo_extend_t extend = pattern->extend; + + cairo_gradient_pattern_t *gpat = (cairo_gradient_pattern_t *) pattern; + + if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { + cairo_linear_pattern_t *lpat = (cairo_linear_pattern_t *) pattern; + grad = new QLinearGradient (lpat->pd1.x, lpat->pd1.y, + lpat->pd2.x, lpat->pd2.y); + } else if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { + cairo_radial_pattern_t *rpat = (cairo_radial_pattern_t *) pattern; + + /* Based on the SVG surface code */ + + cairo_circle_double_t *c0, *c1; + double x0, y0, r0, x1, y1, r1; + + if (rpat->cd1.radius < rpat->cd2.radius) { + c0 = &rpat->cd1; + c1 = &rpat->cd2; + reverse_stops = FALSE; + } else { + c0 = &rpat->cd2; + c1 = &rpat->cd1; + reverse_stops = TRUE; + } + + x0 = c0->center.x; + y0 = c0->center.y; + r0 = c0->radius; + x1 = c1->center.x; + y1 = c1->center.y; + r1 = c1->radius; + + if (r0 == r1) { + grad = new QRadialGradient (x1, y1, r1, x1, y1); + } else { + double fx = (r1 * x0 - r0 * x1) / (r1 - r0); + double fy = (r1 * y0 - r0 * y1) / (r1 - r0); + + /* QPainter doesn't support the inner circle and use instead a gradient focal. + * That means we need to emulate the cairo behaviour by processing the + * cairo gradient stops. + * The CAIRO_EXTENT_NONE and CAIRO_EXTENT_PAD modes are quite easy to handle, + * it's just a matter of stop position translation and calculation of + * the corresponding SVG radial gradient focal. + * The CAIRO_EXTENT_REFLECT and CAIRO_EXTEND_REPEAT modes require to compute a new + * radial gradient, with an new outer circle, equal to r1 - r0 in the CAIRO_EXTEND_REPEAT + * case, and 2 * (r1 - r0) in the CAIRO_EXTENT_REFLECT case, and a new gradient stop + * list that maps to the original cairo stop list. + */ + if ((extend == CAIRO_EXTEND_REFLECT || extend == CAIRO_EXTEND_REPEAT) && r0 > 0.0) { + double r_org = r1; + double r, x, y; + + if (extend == CAIRO_EXTEND_REFLECT) { + r1 = 2 * r1 - r0; + emulate_reflect = TRUE; + } + + offset = fmod (r1, r1 - r0) / (r1 - r0) - 1.0; + r = r1 - r0; + + /* New position of outer circle. */ + x = r * (x1 - fx) / r_org + fx; + y = r * (y1 - fy) / r_org + fy; + + x1 = x; + y1 = y; + r1 = r; + r0 = 0.0; + } else { + offset = r0 / r1; + } + + grad = new QRadialGradient (x1, y1, r1, fx, fy); + + if (extend == CAIRO_EXTEND_NONE && r0 != 0.0) + grad->setColorAt (r0 / r1, Qt::transparent); + } + } + + switch (extend) { + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_PAD: + grad->setSpread(QGradient::PadSpread); + + grad->setColorAt (0.0, Qt::transparent); + grad->setColorAt (1.0, Qt::transparent); + break; + + case CAIRO_EXTEND_REFLECT: + grad->setSpread(QGradient::ReflectSpread); + break; + + case CAIRO_EXTEND_REPEAT: + grad->setSpread(QGradient::RepeatSpread); + break; + } + + for (unsigned int i = 0; i < gpat->n_stops; i++) { + int index = i; + if (reverse_stops) + index = gpat->n_stops - i - 1; + + double offset = gpat->stops[i].offset; + QColor color; + color.setRgbF (gpat->stops[i].color.red, + gpat->stops[i].color.green, + gpat->stops[i].color.blue, + gpat->stops[i].color.alpha); + + if (emulate_reflect) { + offset = offset / 2.0; + grad->setColorAt (1.0 - offset, color); + } + + grad->setColorAt (offset, color); + } + + mBrush = QBrush(*grad); + + delete grad; + } + + if (mBrush.style() != Qt::NoBrush && + pattern->type != CAIRO_PATTERN_TYPE_SOLID && + ! _cairo_matrix_is_identity (&pattern->matrix)) + { + cairo_matrix_t pm = pattern->matrix; + cairo_status_t status = cairo_matrix_invert (&pm); + assert (status == CAIRO_STATUS_SUCCESS); + mBrush.setMatrix (_qmatrix_from_cairo_matrix (pm)); + } + } + + ~PatternToBrushConverter () __attribute__ ((noinline)){ + if (mAcquiredImageParent) + _cairo_surface_release_source_image (mAcquiredImageParent, mAcquiredImage, mAcquiredImageExtra); + } + + operator QBrush& () { + return mBrush; + } + + QBrush mBrush; + + private: + cairo_surface_t *mAcquiredImageParent; + cairo_image_surface_t *mAcquiredImage; + void *mAcquiredImageExtra; +}; + +struct PatternToPenConverter { + PatternToPenConverter (const cairo_pattern_t *source, + const cairo_stroke_style_t *style) : + mBrushConverter(source) + { + Qt::PenJoinStyle join = Qt::MiterJoin; + Qt::PenCapStyle cap = Qt::SquareCap; + + switch (style->line_cap) { + case CAIRO_LINE_CAP_BUTT: + cap = Qt::FlatCap; + break; + case CAIRO_LINE_CAP_ROUND: + cap = Qt::RoundCap; + break; + case CAIRO_LINE_CAP_SQUARE: + cap = Qt::SquareCap; + break; + } + + switch (style->line_join) { + case CAIRO_LINE_JOIN_MITER: + join = Qt::MiterJoin; + break; + case CAIRO_LINE_JOIN_ROUND: + join = Qt::RoundJoin; + break; + case CAIRO_LINE_JOIN_BEVEL: + join = Qt::BevelJoin; + break; + } + + mPen = QPen(mBrushConverter, style->line_width, Qt::SolidLine, cap, join); + mPen.setMiterLimit (style->miter_limit); + + if (style->dash && style->num_dashes) { + Qt::PenStyle pstyle = Qt::NoPen; + + if (style->num_dashes == 2) { + if ((style->dash[0] == style->line_width && + style->dash[1] == style->line_width && style->line_width <= 2.0) || + (style->dash[0] == 0.0 && + style->dash[1] == style->line_width * 2 && cap == Qt::RoundCap)) + { + pstyle = Qt::DotLine; + } else if (style->dash[0] == style->line_width * DASH_LENGTH && + style->dash[1] == style->line_width * DASH_LENGTH && + cap == Qt::FlatCap) + { + pstyle = Qt::DashLine; + } + } + + if (pstyle != Qt::NoPen) { + mPen.setStyle(pstyle); + return; + } + + unsigned int odd_dash = style->num_dashes % 2; + + QVector dashes (odd_dash ? style->num_dashes * 2 : style->num_dashes); + for (unsigned int i = 0; i < odd_dash+1; i++) { + for (unsigned int j = 0; j < style->num_dashes; j++) { + // In Qt, the dash lengths are given in units of line width, whereas + // in cairo, they are in user-space units. We'll always apply the CTM, + // so all we have to do here is divide cairo's dash lengths by the line + // width. + dashes.append (style->dash[j] / style->line_width); + } + } + + mPen.setDashPattern(dashes); + mPen.setDashOffset(style->dash_offset / style->line_width); + } + } + + ~PatternToPenConverter() { } + + operator QPen& () { + return mPen; + } + + QPen mPen; + PatternToBrushConverter mBrushConverter; +}; + +/* + * Core drawing operations + */ + +static bool +_cairo_qt_fast_fill (cairo_qt_surface_t *qs, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path = NULL, + cairo_fill_rule_t fill_rule = CAIRO_FILL_RULE_WINDING, + double tolerance = 0.0, + cairo_antialias_t antialias = CAIRO_ANTIALIAS_NONE) +{ +#if ENABLE_FAST_FILL + QImage *qsSrc_image = NULL; + QPixmap *qsSrc_pixmap = NULL; + std::auto_ptr qsSrc_image_d; + + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *spattern = (cairo_surface_pattern_t*) source; + if (spattern->surface->type == CAIRO_SURFACE_TYPE_QT) { + cairo_qt_surface_t *p = (cairo_qt_surface_t*) spattern->surface; + + qsSrc_image = p->image; + qsSrc_pixmap = p->pixmap; + } else if (spattern->surface->type == CAIRO_SURFACE_TYPE_IMAGE) { + cairo_image_surface_t *p = (cairo_image_surface_t*) spattern->surface; + qsSrc_image = new QImage((const uchar*) p->data, + p->width, + p->height, + p->stride, + _qimage_format_from_cairo_format(p->format)); + qsSrc_image_d.reset(qsSrc_image); + } + } + + if (!qsSrc_image && !qsSrc_pixmap) + return false; + + // We can only drawTiledPixmap; there's no drawTiledImage + if (! qsSrc_pixmap && + (source->extend == CAIRO_EXTEND_REPEAT || + source->extend == CAIRO_EXTEND_REFLECT)) + { + return false; + } + + QMatrix sourceMatrix = _qmatrix_from_cairo_matrix (source->matrix); + + // We can draw this faster by clipping and calling drawImage/drawPixmap. + // Use our own clipping function so that we can get the + // region handling to end up with the fastest possible clip. + // + // XXX Antialiasing will fail pretty hard here, since we can't clip with AA + // with QPainter. + qs->p->save(); + + if (path) { + cairo_int_status_t status; + + cairo_clip_t clip, old_clip = qs->clipper.clip; + + _cairo_clip_init_copy (&clip, &qs->clipper.clip); + status = (cairo_int_status_t) _cairo_clip_clip (&clip, + path, + fill_rule, + tolerance, + antialias); + if (unlikely (status)) { + qs->p->restore(); + return false; + } + + status = _cairo_qt_surface_set_clip (qs, &clip); + if (unlikely (status)) { + qs->p->restore(); + return false; + } + + _cairo_clip_reset (&clip); + qs->clipper.clip = old_clip; + } + + qs->p->setWorldMatrix (sourceMatrix.inverted(), true); + + switch (source->extend) { + case CAIRO_EXTEND_REPEAT: + // XXX handle reflect by tiling 4 times first + case CAIRO_EXTEND_REFLECT: { + assert (qsSrc_pixmap); + + // Render the tiling to cover the entire destination window (because + // it'll be clipped). Transform the window rect by the inverse + // of the current world transform so that the device coordinates + // end up as the right thing. + QRectF dest = qs->p->worldTransform().inverted().mapRect(QRectF(qs->window)); + QPointF origin = sourceMatrix.map(QPointF(0.0, 0.0)); + + qs->p->drawTiledPixmap (dest, *qsSrc_pixmap, origin); + } + break; + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_PAD: // XXX not exactly right, but good enough + default: + if (qsSrc_image) + qs->p->drawImage (0, 0, *qsSrc_image); + else if (qsSrc_pixmap) + qs->p->drawPixmap (0, 0, *qsSrc_pixmap); + break; + } + + qs->p->restore(); + + return true; +#else + return false; +#endif +} + +static cairo_int_status_t +_cairo_qt_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + cairo_int_status_t status; + + D(fprintf(stderr, "q[%p] paint op:%s\n", abstract_surface, _opstr(op))); + + if (! _op_is_supported (qs, op)) + return _cairo_surface_fallback_paint (abstract_surface, op, source, clip); + + status = _cairo_qt_surface_set_clip (qs, clip); + if (unlikely (status)) + return status; + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (_qpainter_compositionmode_from_cairo_op (op)); + + if (! _cairo_qt_fast_fill (qs, source)) { + PatternToBrushConverter brush (source); + qs->p->fillRect (qs->window, brush); + } + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (QPainter::CompositionMode_SourceOver); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_qt_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] fill op:%s\n", abstract_surface, _opstr(op))); + + if (! _op_is_supported (qs, op)) + return _cairo_surface_fallback_fill (abstract_surface, op, + source, path, fill_rule, + tolerance, antialias, clip); + + cairo_int_status_t status = _cairo_qt_surface_set_clip (qs, clip); + if (unlikely (status)) + return status; + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (_qpainter_compositionmode_from_cairo_op (op)); + + // XXX Qt4.3, 4.4 misrenders some complex paths if antialiasing is + // enabled + //qs->p->setRenderHint (QPainter::Antialiasing, antialias == CAIRO_ANTIALIAS_NONE ? false : true); + qs->p->setRenderHint (QPainter::SmoothPixmapTransform, source->filter != CAIRO_FILTER_FAST); + + if (! _cairo_qt_fast_fill (qs, source, + path, fill_rule, tolerance, antialias)) + { + PatternToBrushConverter brush(source); + qs->p->fillPath (path_to_qt (path, fill_rule), brush); + } + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (QPainter::CompositionMode_SourceOver); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_qt_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] stroke op:%s\n", abstract_surface, _opstr(op))); + + if (! _op_is_supported (qs, op)) + return _cairo_surface_fallback_stroke (abstract_surface, op, + source, path, style, ctm, + ctm_inverse, tolerance, + antialias, clip); + + cairo_int_status_t int_status = _cairo_qt_surface_set_clip (qs, clip); + if (unlikely (int_status)) + return int_status; + + QMatrix savedMatrix = qs->p->worldMatrix(); + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (_qpainter_compositionmode_from_cairo_op (op)); + + qs->p->setWorldMatrix (_qmatrix_from_cairo_matrix (*ctm), true); + // XXX Qt4.3, 4.4 misrenders some complex paths if antialiasing is + // enabled + //qs->p->setRenderHint (QPainter::Antialiasing, antialias == CAIRO_ANTIALIAS_NONE ? false : true); + qs->p->setRenderHint (QPainter::SmoothPixmapTransform, source->filter != CAIRO_FILTER_FAST); + + PatternToPenConverter pen(source, style); + + qs->p->setPen(pen); + qs->p->drawPath(path_to_qt (path, ctm_inverse)); + qs->p->setPen(Qt::black); + + qs->p->setWorldMatrix (savedMatrix, false); + + if (qs->supports_porter_duff) + qs->p->setCompositionMode (QPainter::CompositionMode_SourceOver); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_qt_surface_show_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ +#if ((QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)) || defined(QT_GLYPHS_API_BACKPORT)) && 0 + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + // pick out the colour to use from the cairo source + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t*) source; + cairo_scaled_glyph_t* glyph; + // documentation says you have to freeze the cache, but I don't believe it + _cairo_scaled_font_freeze_cache(scaled_font); + + QColor tempColour(solid->color.red * 255, solid->color.green * 255, solid->color.blue * 255); + QVarLengthArray positions(num_glyphs); + QVarLengthArray glyphss(num_glyphs); + FT_Face face = cairo_ft_scaled_font_lock_face (scaled_font); + const FT_Size_Metrics& ftMetrics = face->size->metrics; + QFont font(face->family_name); + font.setStyleStrategy(QFont::NoFontMerging); + font.setBold(face->style_flags & FT_STYLE_FLAG_BOLD); + font.setItalic(face->style_flags & FT_STYLE_FLAG_ITALIC); + font.setKerning(face->face_flags & FT_FACE_FLAG_KERNING); + font.setPixelSize(ftMetrics.y_ppem); + cairo_ft_scaled_font_unlock_face(scaled_font); + qs->p->setFont(font); + qs->p->setPen(tempColour); + for (int currentGlyph = 0; currentGlyph < num_glyphs; currentGlyph++) { + positions[currentGlyph].setX(glyphs[currentGlyph].x); + positions[currentGlyph].setY(glyphs[currentGlyph].y); + glyphss[currentGlyph] = glyphs[currentGlyph].index; + } + qt_draw_glyphs(qs->p, glyphss.data(), positions.data(), num_glyphs); + _cairo_scaled_font_thaw_cache(scaled_font); + return CAIRO_INT_STATUS_SUCCESS; +#else + return _cairo_surface_fallback_glyphs (abstract_surface, op, + source, glyphs, num_glyphs, + scaled_font, clip); +#endif +} + +static cairo_int_status_t +_cairo_qt_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + D(fprintf(stderr, "q[%p] mask op:%s\n", abstract_surface, _opstr(op))); + + if (qs->p && mask->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid_mask = (cairo_solid_pattern_t *) mask; + cairo_int_status_t result; + + qs->p->setOpacity (solid_mask->color.alpha); + + result = _cairo_qt_surface_paint (abstract_surface, op, source, clip); + + qs->p->setOpacity (1.0); + + return result; + } + + // otherwise skip for now + return _cairo_surface_fallback_mask (abstract_surface, op, source, mask, clip); +} + +static cairo_status_t +_cairo_qt_surface_mark_dirty (void *abstract_surface, + int x, int y, + int width, int height) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t *) abstract_surface; + + if (qs->p && !(qs->image || qs->pixmap)) + qs->p->save (); + + return CAIRO_STATUS_SUCCESS; +} + +/* + * Backend struct + */ + +static const cairo_surface_backend_t cairo_qt_surface_backend = { + CAIRO_SURFACE_TYPE_QT, + _cairo_qt_surface_finish, + + _cairo_default_context_create, /* XXX */ + + _cairo_qt_surface_create_similar, + NULL, /* similar image */ + _cairo_qt_surface_map_to_image, + _cairo_qt_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_qt_surface_acquire_source_image, + _cairo_qt_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_qt_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + _cairo_qt_surface_mark_dirty, + + _cairo_qt_surface_paint, + _cairo_qt_surface_mask, + _cairo_qt_surface_stroke, + _cairo_qt_surface_fill, + NULL, /* fill_stroke */ + _cairo_qt_surface_show_glyphs +}; + +cairo_surface_t * +cairo_qt_surface_create (QPainter *painter) +{ + cairo_qt_surface_t *qs; + + qs = (cairo_qt_surface_t *) malloc (sizeof(cairo_qt_surface_t)); + if (qs == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + memset (qs, 0, sizeof(cairo_qt_surface_t)); + + _cairo_surface_init (&qs->base, + &cairo_qt_surface_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + _cairo_surface_clipper_init (&qs->clipper, + _cairo_qt_surface_clipper_intersect_clip_path); + + qs->p = painter; + if (qs->p->paintEngine()) + qs->supports_porter_duff = qs->p->paintEngine()->hasFeature(QPaintEngine::PorterDuff); + else + qs->supports_porter_duff = FALSE; + + // Save so that we can always get back to the original state + qs->p->save(); + + qs->window = painter->window(); + + D(fprintf(stderr, "qpainter_surface_create: window: [%d %d %d %d] pd:%d\n", + qs->window.x(), qs->window.y(), qs->window.width(), qs->window.height(), + qs->supports_porter_duff)); + + return &qs->base; +} + +cairo_surface_t * +cairo_qt_surface_create_with_qimage (cairo_format_t format, + int width, + int height) +{ + cairo_qt_surface_t *qs; + + qs = (cairo_qt_surface_t *) malloc (sizeof(cairo_qt_surface_t)); + if (qs == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + memset (qs, 0, sizeof(cairo_qt_surface_t)); + + _cairo_surface_init (&qs->base, + &cairo_qt_surface_backend, + NULL, /* device */ + _cairo_content_from_format (format)); + + _cairo_surface_clipper_init (&qs->clipper, + _cairo_qt_surface_clipper_intersect_clip_path); + + + QImage *image = new QImage (width, height, + _qimage_format_from_cairo_format (format)); + + qs->image = image; + + if (!image->isNull()) { + qs->p = new QPainter(image); + qs->supports_porter_duff = qs->p->paintEngine()->hasFeature(QPaintEngine::PorterDuff); + } + + qs->image_equiv = cairo_image_surface_create_for_data (image->bits(), + format, + width, height, + image->bytesPerLine()); + + qs->window = QRect(0, 0, width, height); + + D(fprintf(stderr, "qpainter_surface_create: qimage: [%d %d %d %d] pd:%d\n", + qs->window.x(), qs->window.y(), qs->window.width(), qs->window.height(), + qs->supports_porter_duff)); + + return &qs->base; +} + +cairo_surface_t * +cairo_qt_surface_create_with_qpixmap (cairo_content_t content, + int width, + int height) +{ + cairo_qt_surface_t *qs; + + if ((content & CAIRO_CONTENT_COLOR) == 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); + + qs = (cairo_qt_surface_t *) malloc (sizeof(cairo_qt_surface_t)); + if (qs == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + memset (qs, 0, sizeof(cairo_qt_surface_t)); + + QPixmap *pixmap = new QPixmap (width, height); + if (pixmap == NULL) { + free (qs); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + // By default, a QPixmap is opaque; however, if it's filled + // with a color with a transparency component, it is converted + // to a format that preserves transparency. + if (content == CAIRO_CONTENT_COLOR_ALPHA) + pixmap->fill(Qt::transparent); + + _cairo_surface_init (&qs->base, + &cairo_qt_surface_backend, + NULL, /* device */ + content); + + _cairo_surface_clipper_init (&qs->clipper, + _cairo_qt_surface_clipper_intersect_clip_path); + + qs->pixmap = pixmap; + + if (!pixmap->isNull()) { + qs->p = new QPainter(pixmap); + qs->supports_porter_duff = qs->p->paintEngine()->hasFeature(QPaintEngine::PorterDuff); + } + + qs->window = QRect(0, 0, width, height); + + D(fprintf(stderr, "qpainter_surface_create: qpixmap: [%d %d %d %d] pd:%d\n", + qs->window.x(), qs->window.y(), qs->window.width(), qs->window.height(), + qs->supports_porter_duff)); + + return &qs->base; +} + +/** + * _cairo_surface_is_qt: + * @surface: a #cairo_surface_t + * + * Checks if a surface is a #cairo_qt_surface_t + * + * Return value: True if the surface is an qt surface + **/ +static inline cairo_bool_t +_cairo_surface_is_qt (cairo_surface_t *surface) +{ + return surface->backend == &cairo_qt_surface_backend; +} + +QPainter * +cairo_qt_surface_get_qpainter (cairo_surface_t *surface) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t*) surface; + + /* Throw an error for a non-qt surface */ + if (! _cairo_surface_is_qt (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return qs->p; +} + +QImage * +cairo_qt_surface_get_qimage (cairo_surface_t *surface) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t*) surface; + + /* Throw an error for a non-qt surface */ + if (! _cairo_surface_is_qt (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return qs->image; +} + +cairo_surface_t * +cairo_qt_surface_get_image (cairo_surface_t *surface) +{ + cairo_qt_surface_t *qs = (cairo_qt_surface_t*) surface; + + /* Throw an error for a non-qt surface */ + if (! _cairo_surface_is_qt (surface)) { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + } + + return qs->image_equiv; +} + +/* + * TODO: + * + * - Figure out why QBrush isn't working with non-repeated images + * + * - Correct repeat mode; right now, every surface source is EXTEND_REPEAT + * - implement EXTEND_NONE (?? probably need to clip to the extents of the source) + * - implement EXTEND_REFLECT (create temporary and copy 4x, then EXTEND_REPEAT that) + * + * - stroke-image failure + * + * - Implement mask() with non-solid masks (probably will need to use a temporary and use IN) + * + * - Implement gradient sources + * + * - Make create_similar smarter -- create QPixmaps in more circumstances + * (e.g. if the pixmap can have alpha) + * + * - Implement show_glyphs() in terms of Qt + * + */ diff --git a/src/cairo-qt.h b/src/cairo-qt.h new file mode 100644 index 000000000..c20bbb18d --- /dev/null +++ b/src/cairo-qt.h @@ -0,0 +1,85 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Corporation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#ifndef CAIRO_QT_H +#define CAIRO_QT_H + +#include "cairo.h" + +#if CAIRO_HAS_QT_SURFACE + +#include +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_qt_surface_create (QPainter *painter); + +cairo_public cairo_surface_t * +cairo_qt_surface_create_with_qimage (cairo_format_t format, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_qt_surface_create_with_qpixmap (cairo_content_t content, + int width, + int height); + +cairo_public QPainter * +cairo_qt_surface_get_qpainter (cairo_surface_t *surface); + +/* XXX needs hooking to generic surface layer, my vote is for +cairo_public cairo_surface_t * +cairo_surface_map_image (cairo_surface_t *surface); +cairo_public void +cairo_surface_unmap_image (cairo_surface_t *surface, cairo_surface_t *image); +*/ +cairo_public cairo_surface_t * +cairo_qt_surface_get_image (cairo_surface_t *surface); + +cairo_public QImage * +cairo_qt_surface_get_qimage (cairo_surface_t *surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_QT_SURFACE */ + +# error Cairo was not compiled with support for the Qt backend + +#endif /* CAIRO_HAS_QT_SURFACE */ + +#endif /* CAIRO_QT_H */ diff --git a/src/cairo-quartz-font.c b/src/cairo-quartz-font.c new file mode 100644 index 000000000..02f34267b --- /dev/null +++ b/src/cairo-quartz-font.c @@ -0,0 +1,859 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright � 2008 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#include "cairoint.h" + +#include + +#include "cairo-image-surface-private.h" +#include "cairo-quartz.h" +#include "cairo-quartz-private.h" + +#include "cairo-error-private.h" + +/** + * SECTION:cairo-quartz-fonts + * @Title: Quartz (CGFont) Fonts + * @Short_Description: Font support via CGFont on OS X + * @See_Also: #cairo_font_face_t + * + * The Quartz font backend is primarily used to render text on Apple + * MacOS X systems. The CGFont API is used for the internal + * implementation of the font backend methods. + **/ + +/** + * CAIRO_HAS_QUARTZ_FONT: + * + * Defined if the Quartz font backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.6 + **/ + +static CFDataRef (*CGFontCopyTableForTagPtr) (CGFontRef font, uint32_t tag) = NULL; + +/* CreateWithFontName exists in 10.5, but not in 10.4; CreateWithName isn't public in 10.4 */ +static CGFontRef (*CGFontCreateWithFontNamePtr) (CFStringRef) = NULL; +static CGFontRef (*CGFontCreateWithNamePtr) (const char *) = NULL; + +/* These aren't public before 10.5, and some have different names in 10.4 */ +static int (*CGFontGetUnitsPerEmPtr) (CGFontRef) = NULL; +static bool (*CGFontGetGlyphAdvancesPtr) (CGFontRef, const CGGlyph[], size_t, int[]) = NULL; +static bool (*CGFontGetGlyphBBoxesPtr) (CGFontRef, const CGGlyph[], size_t, CGRect[]) = NULL; +static CGRect (*CGFontGetFontBBoxPtr) (CGFontRef) = NULL; + +/* Not public, but present */ +static void (*CGFontGetGlyphsForUnicharsPtr) (CGFontRef, const UniChar[], const CGGlyph[], size_t) = NULL; +static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL; +static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL; + +/* CGFontGetHMetrics isn't public, but the other functions are public/present in 10.5 */ +typedef struct { + int ascent; + int descent; + int leading; +} quartz_CGFontMetrics; +static quartz_CGFontMetrics* (*CGFontGetHMetricsPtr) (CGFontRef fontRef) = NULL; +static int (*CGFontGetAscentPtr) (CGFontRef fontRef) = NULL; +static int (*CGFontGetDescentPtr) (CGFontRef fontRef) = NULL; +static int (*CGFontGetLeadingPtr) (CGFontRef fontRef) = NULL; + +/* Not public anymore in 64-bits nor in 10.7 */ +static ATSFontRef (*FMGetATSFontRefFromFontPtr) (FMFont iFont) = NULL; + +static cairo_bool_t _cairo_quartz_font_symbol_lookup_done = FALSE; +static cairo_bool_t _cairo_quartz_font_symbols_present = FALSE; + +static void +quartz_font_ensure_symbols(void) +{ + if (_cairo_quartz_font_symbol_lookup_done) + return; + + CGFontCopyTableForTagPtr = dlsym(RTLD_DEFAULT, "CGFontCopyTableForTag"); + + /* Look for the 10.5 versions first */ + CGFontGetGlyphBBoxesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphBBoxes"); + if (!CGFontGetGlyphBBoxesPtr) + CGFontGetGlyphBBoxesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphBoundingBoxes"); + + CGFontGetGlyphsForUnicharsPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphsForUnichars"); + if (!CGFontGetGlyphsForUnicharsPtr) + CGFontGetGlyphsForUnicharsPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphsForUnicodes"); + + CGFontGetFontBBoxPtr = dlsym(RTLD_DEFAULT, "CGFontGetFontBBox"); + + /* We just need one of these two */ + CGFontCreateWithFontNamePtr = dlsym(RTLD_DEFAULT, "CGFontCreateWithFontName"); + CGFontCreateWithNamePtr = dlsym(RTLD_DEFAULT, "CGFontCreateWithName"); + + /* These have the same name in 10.4 and 10.5 */ + CGFontGetUnitsPerEmPtr = dlsym(RTLD_DEFAULT, "CGFontGetUnitsPerEm"); + CGFontGetGlyphAdvancesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphAdvances"); + + CGFontGetHMetricsPtr = dlsym(RTLD_DEFAULT, "CGFontGetHMetrics"); + CGFontGetAscentPtr = dlsym(RTLD_DEFAULT, "CGFontGetAscent"); + CGFontGetDescentPtr = dlsym(RTLD_DEFAULT, "CGFontGetDescent"); + CGFontGetLeadingPtr = dlsym(RTLD_DEFAULT, "CGFontGetLeading"); + + CGContextGetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); + CGContextSetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); + + FMGetATSFontRefFromFontPtr = dlsym(RTLD_DEFAULT, "FMGetATSFontRefFromFont"); + + if ((CGFontCreateWithFontNamePtr || CGFontCreateWithNamePtr) && + CGFontGetGlyphBBoxesPtr && + CGFontGetGlyphsForUnicharsPtr && + CGFontGetUnitsPerEmPtr && + CGFontGetGlyphAdvancesPtr && + (CGFontGetHMetricsPtr || (CGFontGetAscentPtr && CGFontGetDescentPtr && CGFontGetLeadingPtr))) + _cairo_quartz_font_symbols_present = TRUE; + + _cairo_quartz_font_symbol_lookup_done = TRUE; +} + +typedef struct _cairo_quartz_font_face cairo_quartz_font_face_t; +typedef struct _cairo_quartz_scaled_font cairo_quartz_scaled_font_t; + +struct _cairo_quartz_scaled_font { + cairo_scaled_font_t base; +}; + +struct _cairo_quartz_font_face { + cairo_font_face_t base; + + CGFontRef cgFont; +}; + +/* + * font face backend + */ + +static cairo_status_t +_cairo_quartz_font_face_create_for_toy (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face) +{ + const char *family; + char *full_name; + CFStringRef cgFontName = NULL; + CGFontRef cgFont = NULL; + int loop; + + quartz_font_ensure_symbols(); + if (! _cairo_quartz_font_symbols_present) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + family = toy_face->family; + full_name = malloc (strlen (family) + 64); // give us a bit of room to tack on Bold, Oblique, etc. + /* handle CSS-ish faces */ + if (!strcmp(family, "serif") || !strcmp(family, "Times Roman")) + family = "Times"; + else if (!strcmp(family, "sans-serif") || !strcmp(family, "sans")) + family = "Helvetica"; + else if (!strcmp(family, "cursive")) + family = "Apple Chancery"; + else if (!strcmp(family, "fantasy")) + family = "Papyrus"; + else if (!strcmp(family, "monospace") || !strcmp(family, "mono")) + family = "Courier"; + + /* Try to build up the full name, e.g. "Helvetica Bold Oblique" first, + * then drop the bold, then drop the slant, then drop both.. finally + * just use "Helvetica". And if Helvetica doesn't exist, give up. + */ + for (loop = 0; loop < 5; loop++) { + if (loop == 4) + family = "Helvetica"; + + strcpy (full_name, family); + + if (loop < 3 && (loop & 1) == 0) { + if (toy_face->weight == CAIRO_FONT_WEIGHT_BOLD) + strcat (full_name, " Bold"); + } + + if (loop < 3 && (loop & 2) == 0) { + if (toy_face->slant == CAIRO_FONT_SLANT_ITALIC) + strcat (full_name, " Italic"); + else if (toy_face->slant == CAIRO_FONT_SLANT_OBLIQUE) + strcat (full_name, " Oblique"); + } + + if (CGFontCreateWithFontNamePtr) { + cgFontName = CFStringCreateWithCString (NULL, full_name, kCFStringEncodingASCII); + cgFont = CGFontCreateWithFontNamePtr (cgFontName); + CFRelease (cgFontName); + } else { + cgFont = CGFontCreateWithNamePtr (full_name); + } + + if (cgFont) + break; + } + + if (!cgFont) { + /* Give up */ + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + *font_face = cairo_quartz_font_face_create_for_cgfont (cgFont); + CGFontRelease (cgFont); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_quartz_font_face_destroy (void *abstract_face) +{ + cairo_quartz_font_face_t *font_face = (cairo_quartz_font_face_t*) abstract_face; + + CGFontRelease (font_face->cgFont); + return TRUE; +} + +static const cairo_scaled_font_backend_t _cairo_quartz_scaled_font_backend; + +static cairo_status_t +_cairo_quartz_font_face_scaled_font_create (void *abstract_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **font_out) +{ + cairo_quartz_font_face_t *font_face = abstract_face; + cairo_quartz_scaled_font_t *font = NULL; + cairo_status_t status; + cairo_font_extents_t fs_metrics; + double ems; + CGRect bbox; + + quartz_font_ensure_symbols(); + if (!_cairo_quartz_font_symbols_present) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font = malloc(sizeof(cairo_quartz_scaled_font_t)); + if (font == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memset (font, 0, sizeof(cairo_quartz_scaled_font_t)); + + status = _cairo_scaled_font_init (&font->base, + &font_face->base, font_matrix, ctm, options, + &_cairo_quartz_scaled_font_backend); + if (status) + goto FINISH; + + ems = CGFontGetUnitsPerEmPtr (font_face->cgFont); + + /* initialize metrics */ + if (CGFontGetFontBBoxPtr && CGFontGetAscentPtr) { + fs_metrics.ascent = (CGFontGetAscentPtr (font_face->cgFont) / ems); + fs_metrics.descent = - (CGFontGetDescentPtr (font_face->cgFont) / ems); + fs_metrics.height = fs_metrics.ascent + fs_metrics.descent + + (CGFontGetLeadingPtr (font_face->cgFont) / ems); + + bbox = CGFontGetFontBBoxPtr (font_face->cgFont); + fs_metrics.max_x_advance = CGRectGetMaxX(bbox) / ems; + fs_metrics.max_y_advance = 0.0; + } else { + CGGlyph wGlyph; + UniChar u; + + quartz_CGFontMetrics *m; + m = CGFontGetHMetricsPtr (font_face->cgFont); + + /* On OX 10.4, GetHMetricsPtr sometimes returns NULL for unknown reasons */ + if (!m) { + status = _cairo_error(CAIRO_STATUS_NULL_POINTER); + goto FINISH; + } + + fs_metrics.ascent = (m->ascent / ems); + fs_metrics.descent = - (m->descent / ems); + fs_metrics.height = fs_metrics.ascent + fs_metrics.descent + (m->leading / ems); + + /* We kind of have to guess here; W's big, right? */ + u = (UniChar) 'W'; + CGFontGetGlyphsForUnicharsPtr (font_face->cgFont, &u, &wGlyph, 1); + if (wGlyph && CGFontGetGlyphBBoxesPtr (font_face->cgFont, &wGlyph, 1, &bbox)) { + fs_metrics.max_x_advance = CGRectGetMaxX(bbox) / ems; + fs_metrics.max_y_advance = 0.0; + } else { + fs_metrics.max_x_advance = 0.0; + fs_metrics.max_y_advance = 0.0; + } + } + + status = _cairo_scaled_font_set_metrics (&font->base, &fs_metrics); + +FINISH: + if (status != CAIRO_STATUS_SUCCESS) { + free (font); + } else { + *font_out = (cairo_scaled_font_t*) font; + } + + return status; +} + +const cairo_font_face_backend_t _cairo_quartz_font_face_backend = { + CAIRO_FONT_TYPE_QUARTZ, + _cairo_quartz_font_face_create_for_toy, + _cairo_quartz_font_face_destroy, + _cairo_quartz_font_face_scaled_font_create +}; + +/** + * cairo_quartz_font_face_create_for_cgfont: + * @font: a #CGFontRef obtained through a method external to cairo. + * + * Creates a new font for the Quartz font backend based on a + * #CGFontRef. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.6 + **/ +cairo_font_face_t * +cairo_quartz_font_face_create_for_cgfont (CGFontRef font) +{ + cairo_quartz_font_face_t *font_face; + + quartz_font_ensure_symbols(); + + font_face = malloc (sizeof (cairo_quartz_font_face_t)); + if (!font_face) { + cairo_status_t ignore_status; + ignore_status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *)&_cairo_font_face_nil; + } + + font_face->cgFont = CGFontRetain (font); + + _cairo_font_face_init (&font_face->base, &_cairo_quartz_font_face_backend); + + return &font_face->base; +} + +/* + * scaled font backend + */ + +static cairo_quartz_font_face_t * +_cairo_quartz_scaled_to_face (void *abstract_font) +{ + cairo_quartz_scaled_font_t *sfont = (cairo_quartz_scaled_font_t*) abstract_font; + cairo_font_face_t *font_face = sfont->base.font_face; + assert (font_face->backend->type == CAIRO_FONT_TYPE_QUARTZ); + return (cairo_quartz_font_face_t*) font_face; +} + +static void +_cairo_quartz_scaled_font_fini(void *abstract_font) +{ +} + +#define INVALID_GLYPH 0x00 + +static inline CGGlyph +_cairo_quartz_scaled_glyph_index (cairo_scaled_glyph_t *scaled_glyph) { + unsigned long index = _cairo_scaled_glyph_index (scaled_glyph); + if (index > 0xffff) + return INVALID_GLYPH; + return (CGGlyph) index; +} + +static cairo_int_status_t +_cairo_quartz_init_glyph_metrics (cairo_quartz_scaled_font_t *font, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + + cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face(font); + cairo_text_extents_t extents = {0, 0, 0, 0, 0, 0}; + CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph); + int advance; + CGRect bbox; + double emscale = CGFontGetUnitsPerEmPtr (font_face->cgFont); + double xmin, ymin, xmax, ymax; + + if (glyph == INVALID_GLYPH) + goto FAIL; + + if (!CGFontGetGlyphAdvancesPtr (font_face->cgFont, &glyph, 1, &advance) || + !CGFontGetGlyphBBoxesPtr (font_face->cgFont, &glyph, 1, &bbox)) + goto FAIL; + + /* broken fonts like Al Bayan return incorrect bounds for some null characters, + see https://bugzilla.mozilla.org/show_bug.cgi?id=534260 */ + if (unlikely (bbox.origin.x == -32767 && + bbox.origin.y == -32767 && + bbox.size.width == 65534 && + bbox.size.height == 65534)) { + bbox.origin.x = bbox.origin.y = 0; + bbox.size.width = bbox.size.height = 0; + } + + bbox = CGRectMake (bbox.origin.x / emscale, + bbox.origin.y / emscale, + bbox.size.width / emscale, + bbox.size.height / emscale); + + /* Should we want to always integer-align glyph extents, we can do so in this way */ +#if 0 + { + CGAffineTransform textMatrix; + textMatrix = CGAffineTransformMake (font->base.scale.xx, + -font->base.scale.yx, + -font->base.scale.xy, + font->base.scale.yy, + 0.0f, 0.0f); + + bbox = CGRectApplyAffineTransform (bbox, textMatrix); + bbox = CGRectIntegral (bbox); + bbox = CGRectApplyAffineTransform (bbox, CGAffineTransformInvert (textMatrix)); + } +#endif + +#if 0 + fprintf (stderr, "[0x%04x] bbox: %f %f %f %f\n", glyph, + bbox.origin.x / emscale, bbox.origin.y / emscale, + bbox.size.width / emscale, bbox.size.height / emscale); +#endif + + xmin = CGRectGetMinX(bbox); + ymin = CGRectGetMinY(bbox); + xmax = CGRectGetMaxX(bbox); + ymax = CGRectGetMaxY(bbox); + + extents.x_bearing = xmin; + extents.y_bearing = - ymax; + extents.width = xmax - xmin; + extents.height = ymax - ymin; + + extents.x_advance = (double) advance / emscale; + extents.y_advance = 0.0; + +#if 0 + fprintf (stderr, "[0x%04x] extents: bearings: %f %f dim: %f %f adv: %f\n\n", glyph, + extents.x_bearing, extents.y_bearing, extents.width, extents.height, extents.x_advance); +#endif + + FAIL: + _cairo_scaled_glyph_set_metrics (scaled_glyph, + &font->base, + &extents); + + return status; +} + +static void +_cairo_quartz_path_apply_func (void *info, const CGPathElement *el) +{ + cairo_path_fixed_t *path = (cairo_path_fixed_t *) info; + cairo_status_t status; + + switch (el->type) { + case kCGPathElementMoveToPoint: + status = _cairo_path_fixed_move_to (path, + _cairo_fixed_from_double(el->points[0].x), + _cairo_fixed_from_double(el->points[0].y)); + assert(!status); + break; + case kCGPathElementAddLineToPoint: + status = _cairo_path_fixed_line_to (path, + _cairo_fixed_from_double(el->points[0].x), + _cairo_fixed_from_double(el->points[0].y)); + assert(!status); + break; + case kCGPathElementAddQuadCurveToPoint: { + cairo_fixed_t fx, fy; + double x, y; + if (!_cairo_path_fixed_get_current_point (path, &fx, &fy)) + fx = fy = 0; + x = _cairo_fixed_to_double (fx); + y = _cairo_fixed_to_double (fy); + + status = _cairo_path_fixed_curve_to (path, + _cairo_fixed_from_double((x + el->points[0].x * 2.0) / 3.0), + _cairo_fixed_from_double((y + el->points[0].y * 2.0) / 3.0), + _cairo_fixed_from_double((el->points[0].x * 2.0 + el->points[1].x) / 3.0), + _cairo_fixed_from_double((el->points[0].y * 2.0 + el->points[1].y) / 3.0), + _cairo_fixed_from_double(el->points[1].x), + _cairo_fixed_from_double(el->points[1].y)); + } + assert(!status); + break; + case kCGPathElementAddCurveToPoint: + status = _cairo_path_fixed_curve_to (path, + _cairo_fixed_from_double(el->points[0].x), + _cairo_fixed_from_double(el->points[0].y), + _cairo_fixed_from_double(el->points[1].x), + _cairo_fixed_from_double(el->points[1].y), + _cairo_fixed_from_double(el->points[2].x), + _cairo_fixed_from_double(el->points[2].y)); + assert(!status); + break; + case kCGPathElementCloseSubpath: + status = _cairo_path_fixed_close_path (path); + assert(!status); + break; + } +} + +static cairo_int_status_t +_cairo_quartz_init_glyph_path (cairo_quartz_scaled_font_t *font, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face(font); + CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph); + CGAffineTransform textMatrix; + CGPathRef glyphPath; + CTFontRef ctFont; + cairo_path_fixed_t *path; + + if (glyph == INVALID_GLYPH) { + _cairo_scaled_glyph_set_path (scaled_glyph, &font->base, _cairo_path_fixed_create()); + return CAIRO_STATUS_SUCCESS; + } + + /* scale(1,-1) * font->base.scale */ + textMatrix = CGAffineTransformMake (font->base.scale.xx, + font->base.scale.yx, + -font->base.scale.xy, + -font->base.scale.yy, + 0, 0); + + ctFont = CTFontCreateWithGraphicsFont (font_face->cgFont, 0.0, NULL, NULL); + glyphPath = CTFontCreatePathForGlyph (ctFont, glyph, &textMatrix); + CFRelease (ctFont); + if (!glyphPath) + return CAIRO_INT_STATUS_UNSUPPORTED; + + path = _cairo_path_fixed_create (); + if (!path) { + CGPathRelease (glyphPath); + return _cairo_error(CAIRO_STATUS_NO_MEMORY); + } + + CGPathApply (glyphPath, path, _cairo_quartz_path_apply_func); + + CGPathRelease (glyphPath); + + _cairo_scaled_glyph_set_path (scaled_glyph, &font->base, path); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_quartz_init_glyph_surface (cairo_quartz_scaled_font_t *font, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + + cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face(font); + + cairo_image_surface_t *surface = NULL; + + CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph); + + int advance; + CGRect bbox; + double width, height; + double emscale = CGFontGetUnitsPerEmPtr (font_face->cgFont); + + CGContextRef cgContext = NULL; + CGAffineTransform textMatrix; + CGRect glyphRect, glyphRectInt; + CGPoint glyphOrigin; + + //fprintf (stderr, "scaled_glyph: %p surface: %p\n", scaled_glyph, scaled_glyph->surface); + + /* Create blank 2x2 image if we don't have this character. + * Maybe we should draw a better missing-glyph slug or something, + * but this is ok for now. + */ + if (glyph == INVALID_GLYPH) { + surface = (cairo_image_surface_t*) cairo_image_surface_create (CAIRO_FORMAT_A8, 2, 2); + status = cairo_surface_status ((cairo_surface_t *) surface); + if (status) + return status; + + _cairo_scaled_glyph_set_surface (scaled_glyph, + &font->base, + surface); + return CAIRO_STATUS_SUCCESS; + } + + if (!CGFontGetGlyphAdvancesPtr (font_face->cgFont, &glyph, 1, &advance) || + !CGFontGetGlyphBBoxesPtr (font_face->cgFont, &glyph, 1, &bbox)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* scale(1,-1) * font->base.scale * scale(1,-1) */ + textMatrix = CGAffineTransformMake (font->base.scale.xx, + -font->base.scale.yx, + -font->base.scale.xy, + font->base.scale.yy, + 0, -0); + glyphRect = CGRectMake (bbox.origin.x / emscale, + bbox.origin.y / emscale, + bbox.size.width / emscale, + bbox.size.height / emscale); + + glyphRect = CGRectApplyAffineTransform (glyphRect, textMatrix); + + /* Round the rectangle outwards, so that we don't have to deal + * with non-integer-pixel origins or dimensions. + */ + glyphRectInt = CGRectIntegral (glyphRect); + +#if 0 + fprintf (stderr, "glyphRect[o]: %f %f %f %f\n", + glyphRect.origin.x, glyphRect.origin.y, glyphRect.size.width, glyphRect.size.height); + fprintf (stderr, "glyphRectInt: %f %f %f %f\n", + glyphRectInt.origin.x, glyphRectInt.origin.y, glyphRectInt.size.width, glyphRectInt.size.height); +#endif + + glyphOrigin = glyphRectInt.origin; + + //textMatrix = CGAffineTransformConcat (textMatrix, CGAffineTransformInvert (ctm)); + + width = glyphRectInt.size.width; + height = glyphRectInt.size.height; + + //fprintf (stderr, "glyphRect[n]: %f %f %f %f\n", glyphRect.origin.x, glyphRect.origin.y, glyphRect.size.width, glyphRect.size.height); + + surface = (cairo_image_surface_t*) cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + if (surface->base.status) + return surface->base.status; + + if (surface->width != 0 && surface->height != 0) { + cgContext = CGBitmapContextCreate (surface->data, + surface->width, + surface->height, + 8, + surface->stride, + NULL, + kCGImageAlphaOnly); + + if (cgContext == NULL) { + cairo_surface_destroy (&surface->base); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + CGContextSetFont (cgContext, font_face->cgFont); + CGContextSetFontSize (cgContext, 1.0); + CGContextSetTextMatrix (cgContext, textMatrix); + + switch (font->base.options.antialias) { + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_BEST: + CGContextSetShouldAntialias (cgContext, TRUE); + CGContextSetShouldSmoothFonts (cgContext, TRUE); + if (CGContextSetAllowsFontSmoothingPtr && + !CGContextGetAllowsFontSmoothingPtr (cgContext)) + CGContextSetAllowsFontSmoothingPtr (cgContext, TRUE); + break; + case CAIRO_ANTIALIAS_NONE: + CGContextSetShouldAntialias (cgContext, FALSE); + break; + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_GOOD: + case CAIRO_ANTIALIAS_FAST: + CGContextSetShouldAntialias (cgContext, TRUE); + CGContextSetShouldSmoothFonts (cgContext, FALSE); + break; + case CAIRO_ANTIALIAS_DEFAULT: + default: + /* Don't do anything */ + break; + } + + CGContextSetAlpha (cgContext, 1.0); + CGContextShowGlyphsAtPoint (cgContext, - glyphOrigin.x, - glyphOrigin.y, &glyph, 1); + + CGContextRelease (cgContext); + } + + cairo_surface_set_device_offset (&surface->base, + - glyphOrigin.x, + height + glyphOrigin.y); + + _cairo_scaled_glyph_set_surface (scaled_glyph, &font->base, surface); + + return status; +} + +static cairo_int_status_t +_cairo_quartz_scaled_glyph_init (void *abstract_font, + cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_info_t info) +{ + cairo_quartz_scaled_font_t *font = (cairo_quartz_scaled_font_t *) abstract_font; + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + + if (!status && (info & CAIRO_SCALED_GLYPH_INFO_METRICS)) + status = _cairo_quartz_init_glyph_metrics (font, scaled_glyph); + + if (!status && (info & CAIRO_SCALED_GLYPH_INFO_PATH)) + status = _cairo_quartz_init_glyph_path (font, scaled_glyph); + + if (!status && (info & CAIRO_SCALED_GLYPH_INFO_SURFACE)) + status = _cairo_quartz_init_glyph_surface (font, scaled_glyph); + + return status; +} + +static unsigned long +_cairo_quartz_ucs4_to_index (void *abstract_font, + uint32_t ucs4) +{ + cairo_quartz_scaled_font_t *font = (cairo_quartz_scaled_font_t*) abstract_font; + cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(font); + UniChar u = (UniChar) ucs4; + CGGlyph glyph; + + CGFontGetGlyphsForUnicharsPtr (ffont->cgFont, &u, &glyph, 1); + + return glyph; +} + +static cairo_int_status_t +_cairo_quartz_load_truetype_table (void *abstract_font, + unsigned long tag, + long offset, + unsigned char *buffer, + unsigned long *length) +{ + cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face (abstract_font); + CFDataRef data = NULL; + + if (likely (CGFontCopyTableForTagPtr)) + data = CGFontCopyTableForTagPtr (font_face->cgFont, tag); + + if (!data) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (buffer == NULL) { + *length = CFDataGetLength (data); + CFRelease (data); + return CAIRO_STATUS_SUCCESS; + } + + if (CFDataGetLength (data) < offset + (long) *length) { + CFRelease (data); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + CFDataGetBytes (data, CFRangeMake (offset, *length), buffer); + CFRelease (data); + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_scaled_font_backend_t _cairo_quartz_scaled_font_backend = { + CAIRO_FONT_TYPE_QUARTZ, + _cairo_quartz_scaled_font_fini, + _cairo_quartz_scaled_glyph_init, + NULL, /* text_to_glyphs */ + _cairo_quartz_ucs4_to_index, + _cairo_quartz_load_truetype_table, + NULL, /* map_glyphs_to_unicode */ +}; + +/* + * private methods that the quartz surface uses + */ + +CGFontRef +_cairo_quartz_scaled_font_get_cg_font_ref (cairo_scaled_font_t *abstract_font) +{ + cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(abstract_font); + + return ffont->cgFont; +} + +/* + * compat with old ATSUI backend + */ + +/** + * cairo_quartz_font_face_create_for_atsu_font_id: + * @font_id: an ATSUFontID for the font. + * + * Creates a new font for the Quartz font backend based on an + * #ATSUFontID. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.6 + **/ +cairo_font_face_t * +cairo_quartz_font_face_create_for_atsu_font_id (ATSUFontID font_id) +{ + quartz_font_ensure_symbols(); + + if (FMGetATSFontRefFromFontPtr != NULL) { + ATSFontRef atsFont = FMGetATSFontRefFromFontPtr (font_id); + CGFontRef cgFont = CGFontCreateWithPlatformFont (&atsFont); + cairo_font_face_t *ff; + + ff = cairo_quartz_font_face_create_for_cgfont (cgFont); + + CGFontRelease (cgFont); + + return ff; + } else { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *)&_cairo_font_face_nil; + } +} + +/* This is the old name for the above function, exported for compat purposes */ +cairo_font_face_t *cairo_atsui_font_face_create_for_atsu_font_id (ATSUFontID font_id); + +cairo_font_face_t * +cairo_atsui_font_face_create_for_atsu_font_id (ATSUFontID font_id) +{ + return cairo_quartz_font_face_create_for_atsu_font_id (font_id); +} diff --git a/src/cairo-quartz-image-surface.c b/src/cairo-quartz-image-surface.c new file mode 100644 index 000000000..498a7b064 --- /dev/null +++ b/src/cairo-quartz-image-surface.c @@ -0,0 +1,387 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright � 2008 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#include "cairoint.h" + +#include "cairo-image-surface-inline.h" +#include "cairo-quartz-image.h" +#include "cairo-quartz-private.h" +#include "cairo-surface-backend-private.h" + +#include "cairo-error-private.h" +#include "cairo-default-context-private.h" + +#define SURFACE_ERROR_NO_MEMORY (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_NO_MEMORY))) +#define SURFACE_ERROR_TYPE_MISMATCH (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_SURFACE_TYPE_MISMATCH))) +#define SURFACE_ERROR_INVALID_SIZE (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_INVALID_SIZE))) +#define SURFACE_ERROR_INVALID_FORMAT (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_INVALID_FORMAT))) + +static void +DataProviderReleaseCallback (void *info, const void *data, size_t size) +{ + cairo_surface_t *surface = (cairo_surface_t *) info; + cairo_surface_destroy (surface); +} + +static cairo_surface_t * +_cairo_quartz_image_surface_create_similar (void *asurface, + cairo_content_t content, + int width, + int height) +{ + cairo_surface_t *isurf = + _cairo_image_surface_create_with_content (content, width, height); + cairo_surface_t *result = cairo_quartz_image_surface_create (isurf); + cairo_surface_destroy (isurf); + + return result; +} + +static cairo_surface_t * +_cairo_quartz_image_surface_create_similar_image (void *asurface, + cairo_format_t format, + int width, + int height) +{ + cairo_surface_t *isurf = cairo_image_surface_create (format, width, height); + cairo_surface_t *result = cairo_quartz_image_surface_create (isurf); + cairo_surface_destroy (isurf); + + return result; +} + +static cairo_status_t +_cairo_quartz_image_surface_finish (void *asurface) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; + + /* the imageSurface will be destroyed by the data provider's release callback */ + CGImageRelease (surface->image); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_quartz_image_surface_acquire_source_image (void *asurface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; + + *image_out = surface->imageSurface; + *image_extra = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_image_surface_t * +_cairo_quartz_image_surface_map_to_image (void *asurface, + const cairo_rectangle_int_t *extents) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; + return _cairo_surface_map_to_image (&surface->imageSurface->base, extents); +} + +static cairo_int_status_t +_cairo_quartz_image_surface_unmap_image (void *asurface, + cairo_image_surface_t *image) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; + return _cairo_surface_unmap_image (&surface->imageSurface->base, image); +} + +static cairo_bool_t +_cairo_quartz_image_surface_get_extents (void *asurface, + cairo_rectangle_int_t *extents) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; + + extents->x = 0; + extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + return TRUE; +} + +/* we assume some drawing happened to the image buffer; make sure it's + * represented in the CGImage on flush() + */ + +static cairo_status_t +_cairo_quartz_image_surface_flush (void *asurface, + unsigned flags) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; + CGImageRef oldImage = surface->image; + CGImageRef newImage = NULL; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + /* XXX only flush if the image has been modified. */ + + /* To be released by the ReleaseCallback */ + cairo_surface_reference ((cairo_surface_t*) surface->imageSurface); + + newImage = CairoQuartzCreateCGImage (surface->imageSurface->format, + surface->imageSurface->width, + surface->imageSurface->height, + surface->imageSurface->stride, + surface->imageSurface->data, + TRUE, + NULL, + DataProviderReleaseCallback, + surface->imageSurface); + + surface->image = newImage; + CGImageRelease (oldImage); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_quartz_image_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_quartz_image_surface_t *surface = abstract_surface; + return _cairo_surface_paint (&surface->imageSurface->base, + op, source, clip); +} + +static cairo_int_status_t +_cairo_quartz_image_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_quartz_image_surface_t *surface = abstract_surface; + return _cairo_surface_mask (&surface->imageSurface->base, + op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_quartz_image_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_quartz_image_surface_t *surface = abstract_surface; + return _cairo_surface_stroke (&surface->imageSurface->base, + op, source, path, + style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +_cairo_quartz_image_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_quartz_image_surface_t *surface = abstract_surface; + return _cairo_surface_fill (&surface->imageSurface->base, + op, source, path, + fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_quartz_image_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_quartz_image_surface_t *surface = abstract_surface; + return _cairo_surface_show_text_glyphs (&surface->imageSurface->base, + op, source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, clip); +} + + +static const cairo_surface_backend_t cairo_quartz_image_surface_backend = { + CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, + _cairo_quartz_image_surface_finish, + + _cairo_default_context_create, + + _cairo_quartz_image_surface_create_similar, + _cairo_quartz_image_surface_create_similar_image, + _cairo_quartz_image_surface_map_to_image, + _cairo_quartz_image_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_quartz_image_surface_acquire_source_image, + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_quartz_image_surface_get_extents, + NULL, /* get_font_options */ + + _cairo_quartz_image_surface_flush, + NULL, /* mark_dirty_rectangle */ + + _cairo_quartz_image_surface_paint, + _cairo_quartz_image_surface_mask, + _cairo_quartz_image_surface_stroke, + _cairo_quartz_image_surface_fill, + NULL, /* fill-stroke */ + _cairo_quartz_image_surface_glyphs, +}; + +/** + * cairo_quartz_image_surface_create: + * @image_surface: a cairo image surface to wrap with a quartz image surface + * + * Creates a Quartz surface backed by a CGImageRef that references the + * given image surface. The resulting surface can be rendered quickly + * when used as a source when rendering to a #cairo_quartz_surface. If + * the data in the image surface is ever updated, cairo_surface_flush() + * must be called on the #cairo_quartz_image_surface to ensure that the + * CGImageRef refers to the updated data. + * + * Return value: the newly created surface. + * + * Since: 1.6 + **/ +cairo_surface_t * +cairo_quartz_image_surface_create (cairo_surface_t *surface) +{ + cairo_quartz_image_surface_t *qisurf; + + CGImageRef image; + + cairo_image_surface_t *image_surface; + int width, height, stride; + cairo_format_t format; + unsigned char *data; + + if (surface->status) + return surface; + + if (! _cairo_surface_is_image (surface)) + return SURFACE_ERROR_TYPE_MISMATCH; + + image_surface = (cairo_image_surface_t*) surface; + width = image_surface->width; + height = image_surface->height; + stride = image_surface->stride; + format = image_surface->format; + data = image_surface->data; + + if (!_cairo_quartz_verify_surface_size(width, height)) + return SURFACE_ERROR_INVALID_SIZE; + + if (width == 0 || height == 0) + return SURFACE_ERROR_INVALID_SIZE; + + if (format != CAIRO_FORMAT_ARGB32 && format != CAIRO_FORMAT_RGB24) + return SURFACE_ERROR_INVALID_FORMAT; + + qisurf = malloc(sizeof(cairo_quartz_image_surface_t)); + if (qisurf == NULL) + return SURFACE_ERROR_NO_MEMORY; + + memset (qisurf, 0, sizeof(cairo_quartz_image_surface_t)); + + /* In case the create_cgimage fails, this ref will + * be released via the callback (which will be called in + * case of failure.) + */ + cairo_surface_reference (surface); + + image = CairoQuartzCreateCGImage (format, + width, height, + stride, + data, + TRUE, + NULL, + DataProviderReleaseCallback, + image_surface); + + if (!image) { + free (qisurf); + return SURFACE_ERROR_NO_MEMORY; + } + + _cairo_surface_init (&qisurf->base, + &cairo_quartz_image_surface_backend, + NULL, /* device */ + _cairo_content_from_format (format)); + + qisurf->width = width; + qisurf->height = height; + + qisurf->image = image; + qisurf->imageSurface = image_surface; + + return &qisurf->base; +} + + +cairo_surface_t * +cairo_quartz_image_surface_get_image (cairo_surface_t *asurface) +{ + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t*) asurface; + + /* Throw an error for a non-quartz surface */ + if (! _cairo_surface_is_quartz (asurface)) { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + } + + return (cairo_surface_t*) surface->imageSurface; +} diff --git a/src/cairo-quartz-image.h b/src/cairo-quartz-image.h new file mode 100644 index 000000000..dae234dac --- /dev/null +++ b/src/cairo-quartz-image.h @@ -0,0 +1,59 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#ifndef CAIRO_QUARTZ_IMAGE_H +#define CAIRO_QUARTZ_IMAGE_H + +#include "cairo.h" + +#if CAIRO_HAS_QUARTZ_IMAGE_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_quartz_image_surface_create (cairo_surface_t *image_surface); + +cairo_public cairo_surface_t * +cairo_quartz_image_surface_get_image (cairo_surface_t *surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ +# error Cairo was not compiled with support for the quartz-image backend +#endif /* CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ + +#endif /* CAIRO_QUARTZ_IMAGE_H */ diff --git a/src/cairo-quartz-private.h b/src/cairo-quartz-private.h new file mode 100644 index 000000000..3ef14c3ae --- /dev/null +++ b/src/cairo-quartz-private.h @@ -0,0 +1,109 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Calum Robinson + * Copyright (C) 2006,2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Calum Robinson + * + * Contributor(s): + * Calum Robinson + * Vladimir Vukicevic + */ + +#ifndef CAIRO_QUARTZ_PRIVATE_H +#define CAIRO_QUARTZ_PRIVATE_H + +#include "cairoint.h" + +#if CAIRO_HAS_QUARTZ_SURFACE +#include "cairo-quartz.h" +#include "cairo-surface-clipper-private.h" + +#ifdef CGFLOAT_DEFINED +typedef CGFloat cairo_quartz_float_t; +#else +typedef float cairo_quartz_float_t; +#endif + +typedef enum { + DO_DIRECT, + DO_SHADING, + DO_IMAGE, + DO_TILED_IMAGE +} cairo_quartz_action_t; + +typedef struct cairo_quartz_surface { + cairo_surface_t base; + + CGContextRef cgContext; + CGAffineTransform cgContextBaseCTM; + + void *imageData; + cairo_surface_t *imageSurfaceEquiv; + + cairo_surface_clipper_t clipper; + cairo_rectangle_int_t extents; + cairo_rectangle_int_t virtual_extents; +} cairo_quartz_surface_t; + +typedef struct cairo_quartz_image_surface { + cairo_surface_t base; + + int width, height; + + CGImageRef image; + cairo_image_surface_t *imageSurface; +} cairo_quartz_image_surface_t; + +cairo_private cairo_bool_t +_cairo_quartz_verify_surface_size(int width, int height); + +cairo_private cairo_bool_t +_cairo_surface_is_quartz (const cairo_surface_t *surface); + +cairo_private CGImageRef +CairoQuartzCreateCGImage (cairo_format_t format, + unsigned int width, + unsigned int height, + unsigned int stride, + void *data, + cairo_bool_t interpolate, + CGColorSpaceRef colorSpaceOverride, + CGDataProviderReleaseDataCallback releaseCallback, + void *releaseInfo); + +cairo_private CGFontRef +_cairo_quartz_scaled_font_get_cg_font_ref (cairo_scaled_font_t *sfont); + +#else + +# error Cairo was not compiled with support for the quartz backend + +#endif /* CAIRO_HAS_QUARTZ_SURFACE */ + +#endif /* CAIRO_QUARTZ_PRIVATE_H */ diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c new file mode 100644 index 000000000..1116ff94c --- /dev/null +++ b/src/cairo-quartz-surface.c @@ -0,0 +1,2574 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright � 2006, 2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#define _GNU_SOURCE /* required for RTLD_DEFAULT */ +#include "cairoint.h" + +#include "cairo-quartz-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-recording-surface-private.h" + +#include + +#ifndef RTLD_DEFAULT +#define RTLD_DEFAULT ((void *) 0) +#endif + +#include + +#undef QUARTZ_DEBUG + +#ifdef QUARTZ_DEBUG +#define ND(_x) fprintf _x +#else +#define ND(_x) do {} while(0) +#endif + +#define IS_EMPTY(s) ((s)->extents.width == 0 || (s)->extents.height == 0) + +/** + * SECTION:cairo-quartz + * @Title: Quartz Surfaces + * @Short_Description: Rendering to Quartz surfaces + * @See_Also: #cairo_surface_t + * + * The Quartz surface is used to render cairo graphics targeting the + * Apple OS X Quartz rendering system. + **/ + +/** + * CAIRO_HAS_QUARTZ_SURFACE: + * + * Defined if the Quartz surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.6 + **/ + +#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1050 +/* This method is private, but it exists. Its params are are exposed + * as args to the NS* method, but not as CG. + */ +enum PrivateCGCompositeMode { + kPrivateCGCompositeClear = 0, + kPrivateCGCompositeCopy = 1, + kPrivateCGCompositeSourceOver = 2, + kPrivateCGCompositeSourceIn = 3, + kPrivateCGCompositeSourceOut = 4, + kPrivateCGCompositeSourceAtop = 5, + kPrivateCGCompositeDestinationOver = 6, + kPrivateCGCompositeDestinationIn = 7, + kPrivateCGCompositeDestinationOut = 8, + kPrivateCGCompositeDestinationAtop = 9, + kPrivateCGCompositeXOR = 10, + kPrivateCGCompositePlusDarker = 11, // (max (0, (1-d) + (1-s))) + kPrivateCGCompositePlusLighter = 12, // (min (1, s + d)) +}; +typedef enum PrivateCGCompositeMode PrivateCGCompositeMode; +CG_EXTERN void CGContextSetCompositeOperation (CGContextRef, PrivateCGCompositeMode); +#endif + +/* Some of these are present in earlier versions of the OS than where + * they are public; other are not public at all + */ +/* public since 10.5 */ +static void (*CGContextDrawTiledImagePtr) (CGContextRef, CGRect, CGImageRef) = NULL; + +/* public since 10.6 */ +static CGPathRef (*CGContextCopyPathPtr) (CGContextRef) = NULL; +static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL; + +/* not yet public */ +static unsigned int (*CGContextGetTypePtr) (CGContextRef) = NULL; +static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL; + +static cairo_bool_t _cairo_quartz_symbol_lookup_done = FALSE; + +/* + * Utility functions + */ + +#ifdef QUARTZ_DEBUG +static void quartz_surface_to_png (cairo_quartz_surface_t *nq, char *dest); +static void quartz_image_to_png (CGImageRef, char *dest); +#endif + +static cairo_quartz_surface_t * +_cairo_quartz_surface_create_internal (CGContextRef cgContext, + cairo_content_t content, + unsigned int width, + unsigned int height); + +/* Load all extra symbols */ +static void quartz_ensure_symbols (void) +{ + if (likely (_cairo_quartz_symbol_lookup_done)) + return; + + CGContextDrawTiledImagePtr = dlsym (RTLD_DEFAULT, "CGContextDrawTiledImage"); + CGContextGetTypePtr = dlsym (RTLD_DEFAULT, "CGContextGetType"); + CGContextCopyPathPtr = dlsym (RTLD_DEFAULT, "CGContextCopyPath"); + CGContextGetAllowsFontSmoothingPtr = dlsym (RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); + CGContextSetAllowsFontSmoothingPtr = dlsym (RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); + + _cairo_quartz_symbol_lookup_done = TRUE; +} + +CGImageRef +CairoQuartzCreateCGImage (cairo_format_t format, + unsigned int width, + unsigned int height, + unsigned int stride, + void *data, + cairo_bool_t interpolate, + CGColorSpaceRef colorSpaceOverride, + CGDataProviderReleaseDataCallback releaseCallback, + void *releaseInfo) +{ + CGImageRef image = NULL; + CGDataProviderRef dataProvider = NULL; + CGColorSpaceRef colorSpace = colorSpaceOverride; + CGBitmapInfo bitinfo = kCGBitmapByteOrder32Host; + int bitsPerComponent, bitsPerPixel; + + switch (format) { + case CAIRO_FORMAT_ARGB32: + if (colorSpace == NULL) + colorSpace = CGColorSpaceCreateDeviceRGB (); + bitinfo |= kCGImageAlphaPremultipliedFirst; + bitsPerComponent = 8; + bitsPerPixel = 32; + break; + + case CAIRO_FORMAT_RGB24: + if (colorSpace == NULL) + colorSpace = CGColorSpaceCreateDeviceRGB (); + bitinfo |= kCGImageAlphaNoneSkipFirst; + bitsPerComponent = 8; + bitsPerPixel = 32; + break; + + case CAIRO_FORMAT_A8: + bitsPerComponent = 8; + bitsPerPixel = 8; + break; + + case CAIRO_FORMAT_A1: +#ifdef WORDS_BIGENDIAN + bitsPerComponent = 1; + bitsPerPixel = 1; + break; +#endif + + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_INVALID: + default: + return NULL; + } + + dataProvider = CGDataProviderCreateWithData (releaseInfo, + data, + height * stride, + releaseCallback); + + if (unlikely (!dataProvider)) { + // manually release + if (releaseCallback) + releaseCallback (releaseInfo, data, height * stride); + goto FINISH; + } + + if (format == CAIRO_FORMAT_A8 || format == CAIRO_FORMAT_A1) { + cairo_quartz_float_t decode[] = {1.0, 0.0}; + image = CGImageMaskCreate (width, height, + bitsPerComponent, + bitsPerPixel, + stride, + dataProvider, + decode, + interpolate); + } else + image = CGImageCreate (width, height, + bitsPerComponent, + bitsPerPixel, + stride, + colorSpace, + bitinfo, + dataProvider, + NULL, + interpolate, + kCGRenderingIntentDefault); + +FINISH: + + CGDataProviderRelease (dataProvider); + + if (colorSpace != colorSpaceOverride) + CGColorSpaceRelease (colorSpace); + + return image; +} + +static inline cairo_bool_t +_cairo_quartz_is_cgcontext_bitmap_context (CGContextRef cgc) +{ + if (unlikely (cgc == NULL)) + return FALSE; + + if (likely (CGContextGetTypePtr)) { + /* 4 is the type value of a bitmap context */ + return CGContextGetTypePtr (cgc) == 4; + } + + /* This will cause a (harmless) warning to be printed if called on a non-bitmap context */ + return CGBitmapContextGetBitsPerPixel (cgc) != 0; +} + +/* CoreGraphics limitation with flipped CTM surfaces: height must be less than signed 16-bit max */ + +#define CG_MAX_HEIGHT SHRT_MAX +#define CG_MAX_WIDTH USHRT_MAX + +/* is the desired size of the surface within bounds? */ +cairo_bool_t +_cairo_quartz_verify_surface_size (int width, int height) +{ + /* hmmm, allow width, height == 0 ? */ + if (width < 0 || height < 0) + return FALSE; + + if (width > CG_MAX_WIDTH || height > CG_MAX_HEIGHT) + return FALSE; + + return TRUE; +} + +/* + * Cairo path -> Quartz path conversion helpers + */ + +/* cairo path -> execute in context */ +static cairo_status_t +_cairo_path_to_quartz_context_move_to (void *closure, + const cairo_point_t *point) +{ + //ND ((stderr, "moveto: %f %f\n", _cairo_fixed_to_double (point->x), _cairo_fixed_to_double (point->y))); + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + CGContextMoveToPoint (closure, x, y); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_to_quartz_context_line_to (void *closure, + const cairo_point_t *point) +{ + //ND ((stderr, "lineto: %f %f\n", _cairo_fixed_to_double (point->x), _cairo_fixed_to_double (point->y))); + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + CGContextAddLineToPoint (closure, x, y); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_to_quartz_context_curve_to (void *closure, + const cairo_point_t *p0, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + //ND ((stderr, "curveto: %f,%f %f,%f %f,%f\n", + // _cairo_fixed_to_double (p0->x), _cairo_fixed_to_double (p0->y), + // _cairo_fixed_to_double (p1->x), _cairo_fixed_to_double (p1->y), + // _cairo_fixed_to_double (p2->x), _cairo_fixed_to_double (p2->y))); + double x0 = _cairo_fixed_to_double (p0->x); + double y0 = _cairo_fixed_to_double (p0->y); + double x1 = _cairo_fixed_to_double (p1->x); + double y1 = _cairo_fixed_to_double (p1->y); + double x2 = _cairo_fixed_to_double (p2->x); + double y2 = _cairo_fixed_to_double (p2->y); + + CGContextAddCurveToPoint (closure, x0, y0, x1, y1, x2, y2); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_path_to_quartz_context_close_path (void *closure) +{ + //ND ((stderr, "closepath\n")); + CGContextClosePath (closure); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_quartz_cairo_path_to_quartz_context (const cairo_path_fixed_t *path, + CGContextRef closure) +{ + cairo_status_t status; + + CGContextBeginPath (closure); + status = _cairo_path_fixed_interpret (path, + _cairo_path_to_quartz_context_move_to, + _cairo_path_to_quartz_context_line_to, + _cairo_path_to_quartz_context_curve_to, + _cairo_path_to_quartz_context_close_path, + closure); + + assert (status == CAIRO_STATUS_SUCCESS); +} + +/* + * Misc helpers/callbacks + */ + +#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1050 +static PrivateCGCompositeMode +_cairo_quartz_cairo_operator_to_quartz_composite (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_CLEAR: + return kPrivateCGCompositeClear; + case CAIRO_OPERATOR_SOURCE: + return kPrivateCGCompositeCopy; + case CAIRO_OPERATOR_OVER: + return kPrivateCGCompositeSourceOver; + case CAIRO_OPERATOR_IN: + return kPrivateCGCompositeSourceIn; + case CAIRO_OPERATOR_OUT: + return kPrivateCGCompositeSourceOut; + case CAIRO_OPERATOR_ATOP: + return kPrivateCGCompositeSourceAtop; + case CAIRO_OPERATOR_DEST_OVER: + return kPrivateCGCompositeDestinationOver; + case CAIRO_OPERATOR_DEST_IN: + return kPrivateCGCompositeDestinationIn; + case CAIRO_OPERATOR_DEST_OUT: + return kPrivateCGCompositeDestinationOut; + case CAIRO_OPERATOR_DEST_ATOP: + return kPrivateCGCompositeDestinationAtop; + case CAIRO_OPERATOR_XOR: + return kPrivateCGCompositeXOR; + case CAIRO_OPERATOR_ADD: + return kPrivateCGCompositePlusLighter; + + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_SATURATE: + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + default: + ASSERT_NOT_REACHED; + } +} +#endif + +static CGBlendMode +_cairo_quartz_cairo_operator_to_quartz_blend (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_MULTIPLY: + return kCGBlendModeMultiply; + case CAIRO_OPERATOR_SCREEN: + return kCGBlendModeScreen; + case CAIRO_OPERATOR_OVERLAY: + return kCGBlendModeOverlay; + case CAIRO_OPERATOR_DARKEN: + return kCGBlendModeDarken; + case CAIRO_OPERATOR_LIGHTEN: + return kCGBlendModeLighten; + case CAIRO_OPERATOR_COLOR_DODGE: + return kCGBlendModeColorDodge; + case CAIRO_OPERATOR_COLOR_BURN: + return kCGBlendModeColorBurn; + case CAIRO_OPERATOR_HARD_LIGHT: + return kCGBlendModeHardLight; + case CAIRO_OPERATOR_SOFT_LIGHT: + return kCGBlendModeSoftLight; + case CAIRO_OPERATOR_DIFFERENCE: + return kCGBlendModeDifference; + case CAIRO_OPERATOR_EXCLUSION: + return kCGBlendModeExclusion; + case CAIRO_OPERATOR_HSL_HUE: + return kCGBlendModeHue; + case CAIRO_OPERATOR_HSL_SATURATION: + return kCGBlendModeSaturation; + case CAIRO_OPERATOR_HSL_COLOR: + return kCGBlendModeColor; + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return kCGBlendModeLuminosity; + +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 + case CAIRO_OPERATOR_CLEAR: + return kCGBlendModeClear; + case CAIRO_OPERATOR_SOURCE: + return kCGBlendModeCopy; + case CAIRO_OPERATOR_OVER: + return kCGBlendModeNormal; + case CAIRO_OPERATOR_IN: + return kCGBlendModeSourceIn; + case CAIRO_OPERATOR_OUT: + return kCGBlendModeSourceOut; + case CAIRO_OPERATOR_ATOP: + return kCGBlendModeSourceAtop; + case CAIRO_OPERATOR_DEST_OVER: + return kCGBlendModeDestinationOver; + case CAIRO_OPERATOR_DEST_IN: + return kCGBlendModeDestinationIn; + case CAIRO_OPERATOR_DEST_OUT: + return kCGBlendModeDestinationOut; + case CAIRO_OPERATOR_DEST_ATOP: + return kCGBlendModeDestinationAtop; + case CAIRO_OPERATOR_XOR: + return kCGBlendModeXOR; + case CAIRO_OPERATOR_ADD: + return kCGBlendModePlusLighter; +#else + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_OUT: + case CAIRO_OPERATOR_ATOP: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_DEST_ATOP: + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: +#endif + + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_SATURATE: + default: + ASSERT_NOT_REACHED; + } +} + +static cairo_int_status_t +_cairo_cgcontext_set_cairo_operator (CGContextRef context, cairo_operator_t op) +{ + CGBlendMode blendmode; + + assert (op != CAIRO_OPERATOR_DEST); + + /* Quartz doesn't support SATURATE at all. COLOR_DODGE and + * COLOR_BURN in Quartz follow the ISO32000 definition, but cairo + * uses the definition from the Adobe Supplement. + */ + if (op == CAIRO_OPERATOR_SATURATE || + op == CAIRO_OPERATOR_COLOR_DODGE || + op == CAIRO_OPERATOR_COLOR_BURN) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + +#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1050 + if (op <= CAIRO_OPERATOR_ADD) { + PrivateCGCompositeMode compmode; + + compmode = _cairo_quartz_cairo_operator_to_quartz_composite (op); + CGContextSetCompositeOperation (context, compmode); + return CAIRO_STATUS_SUCCESS; + } +#endif + + blendmode = _cairo_quartz_cairo_operator_to_quartz_blend (op); + CGContextSetBlendMode (context, blendmode); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_quartz_surface_set_cairo_operator (cairo_quartz_surface_t *surface, cairo_operator_t op) +{ + ND((stderr, "%p _cairo_quartz_surface_set_cairo_operator %d\n", surface, op)); + + /* When the destination has no color components, we can avoid some + * fallbacks, but we have to workaround operators which behave + * differently in Quartz. */ + if (surface->base.content == CAIRO_CONTENT_ALPHA) { + assert (op != CAIRO_OPERATOR_ATOP); /* filtered by surface layer */ + + if (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_IN || + op == CAIRO_OPERATOR_OUT || + op == CAIRO_OPERATOR_DEST_IN || + op == CAIRO_OPERATOR_DEST_ATOP || + op == CAIRO_OPERATOR_XOR) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (op == CAIRO_OPERATOR_DEST_OVER) + op = CAIRO_OPERATOR_OVER; + else if (op == CAIRO_OPERATOR_SATURATE) + op = CAIRO_OPERATOR_ADD; + else if (op == CAIRO_OPERATOR_COLOR_DODGE) + op = CAIRO_OPERATOR_OVER; + else if (op == CAIRO_OPERATOR_COLOR_BURN) + op = CAIRO_OPERATOR_OVER; + } + + return _cairo_cgcontext_set_cairo_operator (surface->cgContext, op); +} + +static inline CGLineCap +_cairo_quartz_cairo_line_cap_to_quartz (cairo_line_cap_t ccap) +{ + switch (ccap) { + default: + ASSERT_NOT_REACHED; + + case CAIRO_LINE_CAP_BUTT: + return kCGLineCapButt; + + case CAIRO_LINE_CAP_ROUND: + return kCGLineCapRound; + + case CAIRO_LINE_CAP_SQUARE: + return kCGLineCapSquare; + } +} + +static inline CGLineJoin +_cairo_quartz_cairo_line_join_to_quartz (cairo_line_join_t cjoin) +{ + switch (cjoin) { + default: + ASSERT_NOT_REACHED; + + case CAIRO_LINE_JOIN_MITER: + return kCGLineJoinMiter; + + case CAIRO_LINE_JOIN_ROUND: + return kCGLineJoinRound; + + case CAIRO_LINE_JOIN_BEVEL: + return kCGLineJoinBevel; + } +} + +static inline CGInterpolationQuality +_cairo_quartz_filter_to_quartz (cairo_filter_t filter) +{ + switch (filter) { + case CAIRO_FILTER_NEAREST: + case CAIRO_FILTER_FAST: + return kCGInterpolationNone; + + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + return kCGInterpolationDefault; + + default: + ASSERT_NOT_REACHED; + return kCGInterpolationDefault; + } +} + +static inline void +_cairo_quartz_cairo_matrix_to_quartz (const cairo_matrix_t *src, + CGAffineTransform *dst) +{ + dst->a = src->xx; + dst->b = src->yx; + dst->c = src->xy; + dst->d = src->yy; + dst->tx = src->x0; + dst->ty = src->y0; +} + + +/* + * Source -> Quartz setup and finish functions + */ + +static void +ComputeGradientValue (void *info, + const cairo_quartz_float_t *in, + cairo_quartz_float_t *out) +{ + double fdist = *in; + const cairo_gradient_pattern_t *grad = (cairo_gradient_pattern_t*) info; + unsigned int i; + + /* Put fdist back in the 0.0..1.0 range if we're doing + * REPEAT/REFLECT + */ + if (grad->base.extend == CAIRO_EXTEND_REPEAT) { + fdist = fdist - floor (fdist); + } else if (grad->base.extend == CAIRO_EXTEND_REFLECT) { + fdist = fmod (fabs (fdist), 2.0); + if (fdist > 1.0) + fdist = 2.0 - fdist; + } + + for (i = 0; i < grad->n_stops; i++) + if (grad->stops[i].offset > fdist) + break; + + if (i == 0 || i == grad->n_stops) { + if (i == grad->n_stops) + --i; + out[0] = grad->stops[i].color.red; + out[1] = grad->stops[i].color.green; + out[2] = grad->stops[i].color.blue; + out[3] = grad->stops[i].color.alpha; + } else { + cairo_quartz_float_t ax = grad->stops[i-1].offset; + cairo_quartz_float_t bx = grad->stops[i].offset - ax; + cairo_quartz_float_t bp = (fdist - ax)/bx; + cairo_quartz_float_t ap = 1.0 - bp; + + out[0] = + grad->stops[i-1].color.red * ap + + grad->stops[i].color.red * bp; + out[1] = + grad->stops[i-1].color.green * ap + + grad->stops[i].color.green * bp; + out[2] = + grad->stops[i-1].color.blue * ap + + grad->stops[i].color.blue * bp; + out[3] = + grad->stops[i-1].color.alpha * ap + + grad->stops[i].color.alpha * bp; + } +} + +static const cairo_quartz_float_t gradient_output_value_ranges[8] = { + 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f +}; +static const CGFunctionCallbacks gradient_callbacks = { + 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy +}; + +/* Quartz computes a small number of samples of the gradient color + * function. On MacOS X 10.5 it apparently computes only 1024 + * samples. */ +#define MAX_GRADIENT_RANGE 1024 + +static CGFunctionRef +CairoQuartzCreateGradientFunction (const cairo_gradient_pattern_t *gradient, + const cairo_rectangle_int_t *extents, + cairo_circle_double_t *start, + cairo_circle_double_t *end) +{ + cairo_pattern_t *pat; + cairo_quartz_float_t input_value_range[2]; + + if (gradient->base.extend != CAIRO_EXTEND_NONE) { + double bounds_x1, bounds_x2, bounds_y1, bounds_y2; + double t[2], tolerance; + + tolerance = fabs (_cairo_matrix_compute_determinant (&gradient->base.matrix)); + tolerance /= _cairo_matrix_transformed_circle_major_axis (&gradient->base.matrix, 1); + + bounds_x1 = extents->x; + bounds_y1 = extents->y; + bounds_x2 = extents->x + extents->width; + bounds_y2 = extents->y + extents->height; + _cairo_matrix_transform_bounding_box (&gradient->base.matrix, + &bounds_x1, &bounds_y1, + &bounds_x2, &bounds_y2, + NULL); + + _cairo_gradient_pattern_box_to_parameter (gradient, + bounds_x1, bounds_y1, + bounds_x2, bounds_y2, + tolerance, + t); + + if (gradient->base.extend == CAIRO_EXTEND_PAD) { + t[0] = MAX (t[0], -0.5); + t[1] = MIN (t[1], 1.5); + } else if (t[1] - t[0] > MAX_GRADIENT_RANGE) + return NULL; + + /* set the input range for the function -- the function knows how + to map values outside of 0.0 .. 1.0 to the correct color */ + input_value_range[0] = t[0]; + input_value_range[1] = t[1]; + } else { + input_value_range[0] = 0; + input_value_range[1] = 1; + } + + _cairo_gradient_pattern_interpolate (gradient, input_value_range[0], start); + _cairo_gradient_pattern_interpolate (gradient, input_value_range[1], end); + + if (_cairo_pattern_create_copy (&pat, &gradient->base)) + return NULL; + + return CGFunctionCreate (pat, + 1, + input_value_range, + 4, + gradient_output_value_ranges, + &gradient_callbacks); +} + +/* Obtain a CGImageRef from a #cairo_surface_t * */ + +typedef struct { + cairo_surface_t *surface; + cairo_image_surface_t *image_out; + void *image_extra; +} quartz_source_image_t; + +static void +DataProviderReleaseCallback (void *info, const void *data, size_t size) +{ + quartz_source_image_t *source_img = info; + _cairo_surface_release_source_image (source_img->surface, source_img->image_out, source_img->image_extra); + free (source_img); +} + +static cairo_status_t +_cairo_surface_to_cgimage (cairo_surface_t *source, + cairo_rectangle_int_t *extents, + cairo_format_t format, + cairo_matrix_t *matrix, + const cairo_clip_t *clip, + CGImageRef *image_out) +{ + cairo_status_t status; + quartz_source_image_t *source_img; + cairo_image_surface_t *image_surface; + + if (source->backend && source->backend->type == CAIRO_SURFACE_TYPE_QUARTZ_IMAGE) { + cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) source; + *image_out = CGImageRetain (surface->image); + return CAIRO_STATUS_SUCCESS; + } + + if (_cairo_surface_is_quartz (source)) { + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) source; + if (IS_EMPTY (surface)) { + *image_out = NULL; + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + if (_cairo_quartz_is_cgcontext_bitmap_context (surface->cgContext)) { + *image_out = CGBitmapContextCreateImage (surface->cgContext); + if (*image_out) + return CAIRO_STATUS_SUCCESS; + } + } + + source_img = malloc (sizeof (quartz_source_image_t)); + if (unlikely (source_img == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + source_img->surface = source; + + if (source->type == CAIRO_SURFACE_TYPE_RECORDING) { + image_surface = (cairo_image_surface_t *) + cairo_image_surface_create (format, extents->width, extents->height); + if (unlikely (image_surface->base.status)) { + status = image_surface->base.status; + cairo_surface_destroy (&image_surface->base); + free (source_img); + return status; + } + + status = _cairo_recording_surface_replay_with_clip (source, + matrix, + &image_surface->base, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (&image_surface->base); + free (source_img); + return status; + } + + source_img->image_out = image_surface; + source_img->image_extra = NULL; + + cairo_matrix_init_identity (matrix); + } + else { + status = _cairo_surface_acquire_source_image (source_img->surface, + &source_img->image_out, + &source_img->image_extra); + if (unlikely (status)) { + free (source_img); + return status; + } + } + + if (source_img->image_out->width == 0 || source_img->image_out->height == 0) { + *image_out = NULL; + DataProviderReleaseCallback (source_img, + source_img->image_out->data, + source_img->image_out->height * source_img->image_out->stride); + } else { + *image_out = CairoQuartzCreateCGImage (source_img->image_out->format, + source_img->image_out->width, + source_img->image_out->height, + source_img->image_out->stride, + source_img->image_out->data, + TRUE, + NULL, + DataProviderReleaseCallback, + source_img); + + /* TODO: differentiate memory error and unsupported surface type */ + if (unlikely (*image_out == NULL)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + } + + return status; +} + +/* Generic #cairo_pattern_t -> CGPattern function */ + +typedef struct { + CGImageRef image; + CGRect imageBounds; + cairo_bool_t do_reflect; +} SurfacePatternDrawInfo; + +static void +SurfacePatternDrawFunc (void *ainfo, CGContextRef context) +{ + SurfacePatternDrawInfo *info = (SurfacePatternDrawInfo*) ainfo; + + CGContextTranslateCTM (context, 0, info->imageBounds.size.height); + CGContextScaleCTM (context, 1, -1); + + CGContextDrawImage (context, info->imageBounds, info->image); + if (info->do_reflect) { + /* draw 3 more copies of the image, flipped. + * DrawImage draws the image according to the current Y-direction into the rectangle given + * (imageBounds); at the time of the first DrawImage above, the origin is at the bottom left + * of the base image position, and the Y axis is extending upwards. + */ + + /* Make the y axis extend downwards, and draw a flipped image below */ + CGContextScaleCTM (context, 1, -1); + CGContextDrawImage (context, info->imageBounds, info->image); + + /* Shift over to the right, and flip vertically (translation is 2x, + * since we'll be flipping and thus rendering the rectangle "backwards" + */ + CGContextTranslateCTM (context, 2 * info->imageBounds.size.width, 0); + CGContextScaleCTM (context, -1, 1); + CGContextDrawImage (context, info->imageBounds, info->image); + + /* Then unflip the Y-axis again, and draw the image above the point. */ + CGContextScaleCTM (context, 1, -1); + CGContextDrawImage (context, info->imageBounds, info->image); + } +} + +static void +SurfacePatternReleaseInfoFunc (void *ainfo) +{ + SurfacePatternDrawInfo *info = (SurfacePatternDrawInfo*) ainfo; + + CGImageRelease (info->image); + free (info); +} + +static cairo_int_status_t +_cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t *dest, + const cairo_pattern_t *apattern, + const cairo_clip_t *clip, + CGPatternRef *cgpat) +{ + cairo_surface_pattern_t *spattern; + cairo_surface_t *pat_surf; + cairo_rectangle_int_t extents; + cairo_format_t format = _cairo_format_from_content (dest->base.content); + + CGImageRef image; + CGRect pbounds; + CGAffineTransform ptransform, stransform; + CGPatternCallbacks cb = { 0, + SurfacePatternDrawFunc, + SurfacePatternReleaseInfoFunc }; + SurfacePatternDrawInfo *info; + cairo_quartz_float_t rw, rh; + cairo_status_t status; + cairo_bool_t is_bounded; + + cairo_matrix_t m; + + /* SURFACE is the only type we'll handle here */ + assert (apattern->type == CAIRO_PATTERN_TYPE_SURFACE); + + spattern = (cairo_surface_pattern_t *) apattern; + pat_surf = spattern->surface; + + if (pat_surf->type != CAIRO_SURFACE_TYPE_RECORDING) { + is_bounded = _cairo_surface_get_extents (pat_surf, &extents); + assert (is_bounded); + } + else + _cairo_surface_get_extents (&dest->base, &extents); + + m = spattern->base.matrix; + status = _cairo_surface_to_cgimage (pat_surf, &extents, format, + &m, clip, &image); + if (unlikely (status)) + return status; + + info = malloc (sizeof (SurfacePatternDrawInfo)); + if (unlikely (!info)) + return CAIRO_STATUS_NO_MEMORY; + + /* XXX -- if we're printing, we may need to call CGImageCreateCopy to make sure + * that the data will stick around for this image when the printer gets to it. + * Otherwise, the underlying data store may disappear from under us! + * + * _cairo_surface_to_cgimage will copy when it converts non-Quartz surfaces, + * since the Quartz surfaces have a higher chance of sticking around. If the + * source is a quartz image surface, then it's set up to retain a ref to the + * image surface that it's backed by. + */ + info->image = image; + info->imageBounds = CGRectMake (0, 0, extents.width, extents.height); + info->do_reflect = FALSE; + + pbounds.origin.x = 0; + pbounds.origin.y = 0; + + if (spattern->base.extend == CAIRO_EXTEND_REFLECT) { + pbounds.size.width = 2.0 * extents.width; + pbounds.size.height = 2.0 * extents.height; + info->do_reflect = TRUE; + } else { + pbounds.size.width = extents.width; + pbounds.size.height = extents.height; + } + rw = pbounds.size.width; + rh = pbounds.size.height; + + cairo_matrix_invert (&m); + _cairo_quartz_cairo_matrix_to_quartz (&m, &stransform); + + /* The pattern matrix is relative to the bottom left, again; the + * incoming cairo pattern matrix is relative to the upper left. + * So we take the pattern matrix and the original context matrix, + * which gives us the correct base translation/y flip. + */ + ptransform = CGAffineTransformConcat (stransform, dest->cgContextBaseCTM); + +#ifdef QUARTZ_DEBUG + ND ((stderr, " pbounds: %f %f %f %f\n", pbounds.origin.x, pbounds.origin.y, pbounds.size.width, pbounds.size.height)); + ND ((stderr, " pattern xform: t: %f %f xx: %f xy: %f yx: %f yy: %f\n", ptransform.tx, ptransform.ty, ptransform.a, ptransform.b, ptransform.c, ptransform.d)); + CGAffineTransform xform = CGContextGetCTM (dest->cgContext); + ND ((stderr, " context xform: t: %f %f xx: %f xy: %f yx: %f yy: %f\n", xform.tx, xform.ty, xform.a, xform.b, xform.c, xform.d)); +#endif + + *cgpat = CGPatternCreate (info, + pbounds, + ptransform, + rw, rh, + kCGPatternTilingConstantSpacing, /* kCGPatternTilingNoDistortion, */ + TRUE, + &cb); + + return CAIRO_STATUS_SUCCESS; +} + +/* State used during a drawing operation. */ +typedef struct { + /* The destination of the mask */ + CGContextRef cgMaskContext; + + /* The destination of the drawing of the source */ + CGContextRef cgDrawContext; + + /* The filter to be used when drawing the source */ + CGInterpolationQuality filter; + + /* Action type */ + cairo_quartz_action_t action; + + /* Destination rect */ + CGRect rect; + + /* Used with DO_SHADING, DO_IMAGE and DO_TILED_IMAGE */ + CGAffineTransform transform; + + /* Used with DO_IMAGE and DO_TILED_IMAGE */ + CGImageRef image; + + /* Used with DO_SHADING */ + CGShadingRef shading; + + /* Temporary destination for unbounded operations */ + CGLayerRef layer; + CGRect clipRect; +} cairo_quartz_drawing_state_t; + +/* +Quartz does not support repeating radients. We handle repeating gradients +by manually extending the gradient and repeating color stops. We need to +minimize the number of repetitions since Quartz seems to sample our color +function across the entire range, even if part of that range is not needed +for the visible area of the gradient, and it samples with some fixed resolution, +so if the gradient range is too large it samples with very low resolution and +the gradient is very coarse. _cairo_quartz_create_gradient_function computes +the number of repetitions needed based on the extents. +*/ +static cairo_int_status_t +_cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state, + const cairo_gradient_pattern_t *gradient, + const cairo_rectangle_int_t *extents) +{ + cairo_matrix_t mat; + cairo_circle_double_t start, end; + CGFunctionRef gradFunc; + CGColorSpaceRef rgb; + bool extend = gradient->base.extend != CAIRO_EXTEND_NONE; + + assert (gradient->n_stops > 0); + + mat = gradient->base.matrix; + cairo_matrix_invert (&mat); + _cairo_quartz_cairo_matrix_to_quartz (&mat, &state->transform); + + gradFunc = CairoQuartzCreateGradientFunction (gradient, extents, + &start, &end); + + if (unlikely (gradFunc == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + rgb = CGColorSpaceCreateDeviceRGB (); + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + state->shading = CGShadingCreateAxial (rgb, + CGPointMake (start.center.x, + start.center.y), + CGPointMake (end.center.x, + end.center.y), + gradFunc, + extend, extend); + } else { + state->shading = CGShadingCreateRadial (rgb, + CGPointMake (start.center.x, + start.center.y), + MAX (start.radius, 0), + CGPointMake (end.center.x, + end.center.y), + MAX (end.radius, 0), + gradFunc, + extend, extend); + } + + CGColorSpaceRelease (rgb); + CGFunctionRelease (gradFunc); + + state->action = DO_SHADING; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_quartz_setup_state (cairo_quartz_drawing_state_t *state, + cairo_composite_rectangles_t *composite) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + const cairo_pattern_t *source = &composite->source_pattern.base; + const cairo_clip_t *clip = composite->clip; + cairo_bool_t needs_temp; + cairo_status_t status; + cairo_format_t format = _cairo_format_from_content (composite->surface->content); + + state->layer = NULL; + state->image = NULL; + state->shading = NULL; + state->cgDrawContext = NULL; + state->cgMaskContext = NULL; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + status = _cairo_quartz_surface_set_cairo_operator (surface, op); + if (unlikely (status)) + return status; + + /* Save before we change the pattern, colorspace, etc. so that + * we can restore and make sure that quartz releases our + * pattern (which may be stack allocated) + */ + + CGContextSaveGState (surface->cgContext); + state->clipRect = CGContextGetClipBoundingBox (surface->cgContext); + state->clipRect = CGRectIntegral (state->clipRect); + state->rect = state->clipRect; + + state->cgMaskContext = surface->cgContext; + state->cgDrawContext = state->cgMaskContext; + + state->filter = _cairo_quartz_filter_to_quartz (source->filter); + + if (op == CAIRO_OPERATOR_CLEAR) { + CGContextSetRGBFillColor (state->cgDrawContext, 0, 0, 0, 1); + + state->action = DO_DIRECT; + return CAIRO_STATUS_SUCCESS; + } + + /* + * To implement mask unbounded operations Quartz needs a temporary + * surface which will be composited entirely (ignoring the mask). + * To implement source unbounded operations Quartz needs a + * temporary surface which allows extending the source to a size + * covering the whole mask, but there are some optimization + * opportunities: + * + * - CLEAR completely ignores the source, thus we can just use a + * solid color fill. + * + * - SOURCE can be implemented by drawing the source and clearing + * outside of the source as long as the two regions have no + * intersection. This happens when the source is a pixel-aligned + * rectangle. If the source is at least as big as the + * intersection between the clip rectangle and the mask + * rectangle, no clear operation is needed. + */ + needs_temp = ! _cairo_operator_bounded_by_mask (op); + + if (needs_temp) { + state->layer = CGLayerCreateWithContext (surface->cgContext, + state->clipRect.size, + NULL); + state->cgDrawContext = CGLayerGetContext (state->layer); + state->cgMaskContext = state->cgDrawContext; + CGContextTranslateCTM (state->cgDrawContext, + -state->clipRect.origin.x, + -state->clipRect.origin.y); + } + + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; + + CGContextSetRGBStrokeColor (state->cgDrawContext, + solid->color.red, + solid->color.green, + solid->color.blue, + solid->color.alpha); + CGContextSetRGBFillColor (state->cgDrawContext, + solid->color.red, + solid->color.green, + solid->color.blue, + solid->color.alpha); + + state->action = DO_DIRECT; + return CAIRO_STATUS_SUCCESS; + } + + if (source->type == CAIRO_PATTERN_TYPE_LINEAR || + source->type == CAIRO_PATTERN_TYPE_RADIAL) + { + const cairo_gradient_pattern_t *gpat = (const cairo_gradient_pattern_t *)source; + cairo_rectangle_int_t extents; + + extents = surface->virtual_extents; + extents.x -= surface->base.device_transform.x0; + extents.y -= surface->base.device_transform.y0; + _cairo_rectangle_union (&extents, &surface->extents); + + return _cairo_quartz_setup_gradient_source (state, gpat, &extents); + } + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE && + (source->extend == CAIRO_EXTEND_NONE || (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))) + { + const cairo_surface_pattern_t *spat = (const cairo_surface_pattern_t *) source; + cairo_surface_t *pat_surf = spat->surface; + CGImageRef img; + cairo_matrix_t m = spat->base.matrix; + cairo_rectangle_int_t extents; + CGAffineTransform xform; + CGRect srcRect; + cairo_fixed_t fw, fh; + cairo_bool_t is_bounded; + + _cairo_surface_get_extents (composite->surface, &extents); + status = _cairo_surface_to_cgimage (pat_surf, &extents, format, + &m, clip, &img); + if (unlikely (status)) + return status; + + state->image = img; + + if (state->filter == kCGInterpolationNone && _cairo_matrix_is_translation (&m)) { + m.x0 = -ceil (m.x0 - 0.5); + m.y0 = -ceil (m.y0 - 0.5); + } else { + cairo_matrix_invert (&m); + } + + _cairo_quartz_cairo_matrix_to_quartz (&m, &state->transform); + + if (pat_surf->type != CAIRO_SURFACE_TYPE_RECORDING) { + is_bounded = _cairo_surface_get_extents (pat_surf, &extents); + assert (is_bounded); + } + + srcRect = CGRectMake (0, 0, extents.width, extents.height); + + if (source->extend == CAIRO_EXTEND_NONE) { + int x, y; + if (op == CAIRO_OPERATOR_SOURCE && + (pat_surf->content == CAIRO_CONTENT_ALPHA || + ! _cairo_matrix_is_integer_translation (&m, &x, &y))) + { + state->layer = CGLayerCreateWithContext (surface->cgContext, + state->clipRect.size, + NULL); + state->cgDrawContext = CGLayerGetContext (state->layer); + CGContextTranslateCTM (state->cgDrawContext, + -state->clipRect.origin.x, + -state->clipRect.origin.y); + } + + CGContextSetRGBFillColor (state->cgDrawContext, 0, 0, 0, 1); + + state->rect = srcRect; + state->action = DO_IMAGE; + return CAIRO_STATUS_SUCCESS; + } + + CGContextSetRGBFillColor (state->cgDrawContext, 0, 0, 0, 1); + + /* Quartz seems to tile images at pixel-aligned regions only -- this + * leads to seams if the image doesn't end up scaling to fill the + * space exactly. The CGPattern tiling approach doesn't have this + * problem. Check if we're going to fill up the space (within some + * epsilon), and if not, fall back to the CGPattern type. + */ + + xform = CGAffineTransformConcat (CGContextGetCTM (state->cgDrawContext), + state->transform); + + srcRect = CGRectApplyAffineTransform (srcRect, xform); + + fw = _cairo_fixed_from_double (srcRect.size.width); + fh = _cairo_fixed_from_double (srcRect.size.height); + + if ((fw & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON && + (fh & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON) + { + /* We're good to use DrawTiledImage, but ensure that + * the math works out */ + + srcRect.size.width = round (srcRect.size.width); + srcRect.size.height = round (srcRect.size.height); + + xform = CGAffineTransformInvert (xform); + + srcRect = CGRectApplyAffineTransform (srcRect, xform); + + state->rect = srcRect; + state->action = DO_TILED_IMAGE; + return CAIRO_STATUS_SUCCESS; + } + + /* Fall through to generic SURFACE case */ + } + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_quartz_float_t patternAlpha = 1.0f; + CGColorSpaceRef patternSpace; + CGPatternRef pattern = NULL; + cairo_int_status_t status; + + status = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source, clip, &pattern); + if (unlikely (status)) + return status; + + patternSpace = CGColorSpaceCreatePattern (NULL); + CGContextSetFillColorSpace (state->cgDrawContext, patternSpace); + CGContextSetFillPattern (state->cgDrawContext, pattern, &patternAlpha); + CGContextSetStrokeColorSpace (state->cgDrawContext, patternSpace); + CGContextSetStrokePattern (state->cgDrawContext, pattern, &patternAlpha); + CGColorSpaceRelease (patternSpace); + + /* Quartz likes to munge the pattern phase (as yet unexplained + * why); force it to 0,0 as we've already baked in the correct + * pattern translation into the pattern matrix + */ + CGContextSetPatternPhase (state->cgDrawContext, CGSizeMake (0, 0)); + + CGPatternRelease (pattern); + + state->action = DO_DIRECT; + return CAIRO_STATUS_SUCCESS; + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static void +_cairo_quartz_teardown_state (cairo_quartz_drawing_state_t *state, + cairo_composite_rectangles_t *extents) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) extents->surface; + + if (state->layer) { + CGContextDrawLayerInRect (surface->cgContext, + state->clipRect, + state->layer); + CGLayerRelease (state->layer); + } + + if (state->cgMaskContext) + CGContextRestoreGState (surface->cgContext); + + if (state->image) + CGImageRelease (state->image); + + if (state->shading) + CGShadingRelease (state->shading); +} + +static void +_cairo_quartz_draw_source (cairo_quartz_drawing_state_t *state, + cairo_operator_t op) +{ + CGContextSetShouldAntialias (state->cgDrawContext, state->filter != kCGInterpolationNone); + CGContextSetInterpolationQuality(state->cgDrawContext, state->filter); + + if (state->action == DO_DIRECT) { + CGContextFillRect (state->cgDrawContext, state->rect); + return; + } + + CGContextConcatCTM (state->cgDrawContext, state->transform); + + if (state->action == DO_SHADING) { + CGContextDrawShading (state->cgDrawContext, state->shading); + return; + } + + CGContextTranslateCTM (state->cgDrawContext, 0, state->rect.size.height); + CGContextScaleCTM (state->cgDrawContext, 1, -1); + + if (state->action == DO_IMAGE) { + CGContextDrawImage (state->cgDrawContext, state->rect, state->image); + if (op == CAIRO_OPERATOR_SOURCE && + state->cgDrawContext == state->cgMaskContext) + { + CGContextBeginPath (state->cgDrawContext); + CGContextAddRect (state->cgDrawContext, state->rect); + + CGContextTranslateCTM (state->cgDrawContext, 0, state->rect.size.height); + CGContextScaleCTM (state->cgDrawContext, 1, -1); + CGContextConcatCTM (state->cgDrawContext, + CGAffineTransformInvert (state->transform)); + + CGContextAddRect (state->cgDrawContext, state->clipRect); + + CGContextSetRGBFillColor (state->cgDrawContext, 0, 0, 0, 0); + CGContextEOFillPath (state->cgDrawContext); + } + } else { + CGContextDrawTiledImagePtr (state->cgDrawContext, state->rect, state->image); + } +} + +static cairo_image_surface_t * +_cairo_quartz_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; + unsigned int stride, bitinfo, bpp, color_comps; + CGColorSpaceRef colorspace; + void *imageData; + cairo_format_t format; + + if (surface->imageSurfaceEquiv) + return _cairo_surface_map_to_image (surface->imageSurfaceEquiv, extents); + + if (IS_EMPTY (surface)) + return (cairo_image_surface_t *) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); + + if (! _cairo_quartz_is_cgcontext_bitmap_context (surface->cgContext)) + return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + bitinfo = CGBitmapContextGetBitmapInfo (surface->cgContext); + bpp = CGBitmapContextGetBitsPerPixel (surface->cgContext); + + // let's hope they don't add YUV under us + colorspace = CGBitmapContextGetColorSpace (surface->cgContext); + color_comps = CGColorSpaceGetNumberOfComponents (colorspace); + + /* XXX TODO: We can handle many more data formats by + * converting to pixman_format_t */ + + if (bpp == 32 && color_comps == 3 && + (bitinfo & kCGBitmapAlphaInfoMask) == kCGImageAlphaPremultipliedFirst && + (bitinfo & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Host) + { + format = CAIRO_FORMAT_ARGB32; + } + else if (bpp == 32 && color_comps == 3 && + (bitinfo & kCGBitmapAlphaInfoMask) == kCGImageAlphaNoneSkipFirst && + (bitinfo & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Host) + { + format = CAIRO_FORMAT_RGB24; + } + else if (bpp == 8 && color_comps == 1) + { + format = CAIRO_FORMAT_A1; + } + else + { + return _cairo_image_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + imageData = CGBitmapContextGetData (surface->cgContext); + stride = CGBitmapContextGetBytesPerRow (surface->cgContext); + + return (cairo_image_surface_t *) cairo_image_surface_create_for_data (imageData, + format, + extents->width, + extents->height, + stride); +} + +static cairo_int_status_t +_cairo_quartz_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; + + if (surface->imageSurfaceEquiv) + return _cairo_surface_unmap_image (surface->imageSurfaceEquiv, image); + + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return CAIRO_STATUS_SUCCESS; +} + + +/* + * Cairo surface backend implementations + */ + +static cairo_status_t +_cairo_quartz_surface_finish (void *abstract_surface) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; + + ND ((stderr, "_cairo_quartz_surface_finish[%p] cgc: %p\n", surface, surface->cgContext)); + + if (IS_EMPTY (surface)) + return CAIRO_STATUS_SUCCESS; + + /* Restore our saved gstate that we use to reset clipping */ + CGContextRestoreGState (surface->cgContext); + _cairo_surface_clipper_reset (&surface->clipper); + + CGContextRelease (surface->cgContext); + + surface->cgContext = NULL; + + if (surface->imageSurfaceEquiv) { + cairo_surface_destroy (surface->imageSurfaceEquiv); + surface->imageSurfaceEquiv = NULL; + } + + free (surface->imageData); + surface->imageData = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_quartz_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; + + //ND ((stderr, "%p _cairo_quartz_surface_acquire_source_image\n", surface)); + + *image_extra = NULL; + + *image_out = _cairo_quartz_surface_map_to_image (surface, &surface->extents); + if (unlikely (cairo_surface_status(&(*image_out)->base))) { + cairo_surface_destroy (&(*image_out)->base); + *image_out = NULL; + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_quartz_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + _cairo_quartz_surface_unmap_image (abstract_surface, image); +} + +static cairo_surface_t * +_cairo_quartz_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_quartz_surface_t *surface, *similar_quartz; + cairo_surface_t *similar; + cairo_format_t format; + + if (content == CAIRO_CONTENT_COLOR_ALPHA) + format = CAIRO_FORMAT_ARGB32; + else if (content == CAIRO_CONTENT_COLOR) + format = CAIRO_FORMAT_RGB24; + else if (content == CAIRO_CONTENT_ALPHA) + format = CAIRO_FORMAT_A8; + else + return NULL; + + // verify width and height of surface + if (!_cairo_quartz_verify_surface_size (width, height)) { + return _cairo_surface_create_in_error (_cairo_error + (CAIRO_STATUS_INVALID_SIZE)); + } + + similar = cairo_quartz_surface_create (format, width, height); + if (unlikely (similar->status)) + return similar; + + surface = (cairo_quartz_surface_t *) abstract_surface; + similar_quartz = (cairo_quartz_surface_t *) similar; + similar_quartz->virtual_extents = surface->virtual_extents; + + return similar; +} + +static cairo_bool_t +_cairo_quartz_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; + + *extents = surface->extents; + return TRUE; +} + +static cairo_int_status_t +_cairo_quartz_cg_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_quartz_drawing_state_t state; + cairo_int_status_t rv; + + ND ((stderr, "%p _cairo_quartz_surface_paint op %d source->type %d\n", + extents->surface, extents->op, extents->source_pattern.base.type)); + + rv = _cairo_quartz_setup_state (&state, extents); + if (unlikely (rv)) + goto BAIL; + + _cairo_quartz_draw_source (&state, extents->op); + +BAIL: + _cairo_quartz_teardown_state (&state, extents); + + ND ((stderr, "-- paint\n")); + return rv; +} + +static cairo_int_status_t +_cairo_quartz_cg_mask_with_surface (cairo_composite_rectangles_t *extents, + cairo_surface_t *mask_surf, + const cairo_matrix_t *mask_mat, + CGInterpolationQuality filter) +{ + CGRect rect; + CGImageRef img; + cairo_status_t status; + CGAffineTransform mask_matrix; + cairo_quartz_drawing_state_t state; + cairo_format_t format = _cairo_format_from_content (extents->surface->content); + cairo_rectangle_int_t dest_extents; + cairo_matrix_t m = *mask_mat; + + _cairo_surface_get_extents (extents->surface, &dest_extents); + status = _cairo_surface_to_cgimage (mask_surf, &dest_extents, format, + &m, extents->clip, &img); + if (unlikely (status)) + return status; + + status = _cairo_quartz_setup_state (&state, extents); + if (unlikely (status)) + goto BAIL; + + rect = CGRectMake (0.0, 0.0, CGImageGetWidth (img), CGImageGetHeight (img)); + _cairo_quartz_cairo_matrix_to_quartz (&m, &mask_matrix); + + /* ClipToMask is essentially drawing an image, so we need to flip the CTM + * to get the image to appear oriented the right way */ + CGContextConcatCTM (state.cgMaskContext, CGAffineTransformInvert (mask_matrix)); + CGContextTranslateCTM (state.cgMaskContext, 0.0, rect.size.height); + CGContextScaleCTM (state.cgMaskContext, 1.0, -1.0); + + state.filter = filter; + + CGContextSetInterpolationQuality (state.cgMaskContext, filter); + CGContextSetShouldAntialias (state.cgMaskContext, filter != kCGInterpolationNone); + + CGContextClipToMask (state.cgMaskContext, rect, img); + + CGContextScaleCTM (state.cgMaskContext, 1.0, -1.0); + CGContextTranslateCTM (state.cgMaskContext, 0.0, -rect.size.height); + CGContextConcatCTM (state.cgMaskContext, mask_matrix); + + _cairo_quartz_draw_source (&state, extents->op); + +BAIL: + _cairo_quartz_teardown_state (&state, extents); + + CGImageRelease (img); + + return status; +} + +static cairo_int_status_t +_cairo_quartz_cg_mask_with_solid (cairo_quartz_surface_t *surface, + cairo_composite_rectangles_t *extents) +{ + cairo_quartz_drawing_state_t state; + double alpha = extents->mask_pattern.solid.color.alpha; + cairo_status_t status; + + status = _cairo_quartz_setup_state (&state, extents); + if (unlikely (status)) + return status; + + CGContextSetAlpha (surface->cgContext, alpha); + _cairo_quartz_draw_source (&state, extents->op); + + _cairo_quartz_teardown_state (&state, extents); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_quartz_cg_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *)extents->surface; + const cairo_pattern_t *source = &extents->source_pattern.base; + const cairo_pattern_t *mask = &extents->mask_pattern.base; + cairo_surface_t *mask_surf; + cairo_matrix_t matrix; + cairo_status_t status; + cairo_bool_t need_temp; + CGInterpolationQuality filter; + + ND ((stderr, "%p _cairo_quartz_surface_mask op %d source->type %d mask->type %d\n", + extents->surface, extents->op, extents->source_pattern.base.type, + extents->mask_pattern.base.type)); + + if (mask->type == CAIRO_PATTERN_TYPE_SOLID) + return _cairo_quartz_cg_mask_with_solid (surface, extents); + + need_temp = (mask->type != CAIRO_PATTERN_TYPE_SURFACE || + mask->extend != CAIRO_EXTEND_NONE); + + filter = _cairo_quartz_filter_to_quartz (source->filter); + + if (! need_temp) { + mask_surf = extents->mask_pattern.surface.surface; + + /* When an opaque surface used as a mask in Quartz, its + * luminosity is used as the alpha value, so we con only use + * surfaces with alpha without creating a temporary mask. */ + need_temp = ! (mask_surf->content & CAIRO_CONTENT_ALPHA); + } + + if (! need_temp) { + CGInterpolationQuality mask_filter; + cairo_bool_t simple_transform; + + matrix = mask->matrix; + + mask_filter = _cairo_quartz_filter_to_quartz (mask->filter); + if (mask_filter == kCGInterpolationNone) { + simple_transform = _cairo_matrix_is_translation (&matrix); + if (simple_transform) { + matrix.x0 = ceil (matrix.x0 - 0.5); + matrix.y0 = ceil (matrix.y0 - 0.5); + } + } else { + simple_transform = _cairo_matrix_is_integer_translation (&matrix, + NULL, + NULL); + } + + /* Quartz only allows one interpolation to be set for mask and + * source, so we can skip the temp surface only if the source + * filtering makes the mask look correct. */ + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) + need_temp = ! (simple_transform || filter == mask_filter); + else + filter = mask_filter; + } + + if (need_temp) { + /* Render the mask to a surface */ + mask_surf = _cairo_quartz_surface_create_similar (surface, + CAIRO_CONTENT_ALPHA, + surface->extents.width, + surface->extents.height); + status = mask_surf->status; + if (unlikely (status)) + goto BAIL; + + /* mask_surf is clear, so use OVER instead of SOURCE to avoid a + * temporary layer or fallback to cairo-image. */ + status = _cairo_surface_paint (mask_surf, CAIRO_OPERATOR_OVER, mask, NULL); + if (unlikely (status)) + goto BAIL; + + cairo_matrix_init_identity (&matrix); + } + + status = _cairo_quartz_cg_mask_with_surface (extents, + mask_surf, &matrix, filter); + +BAIL: + + if (need_temp) + cairo_surface_destroy (mask_surf); + + return status; +} + +static cairo_int_status_t +_cairo_quartz_cg_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_quartz_drawing_state_t state; + cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; + + ND ((stderr, "%p _cairo_quartz_surface_fill op %d source->type %d\n", + extents->surface, extents->op, extents->source_pattern.base.type)); + + rv = _cairo_quartz_setup_state (&state, extents); + if (unlikely (rv)) + goto BAIL; + + CGContextSetShouldAntialias (state.cgMaskContext, (antialias != CAIRO_ANTIALIAS_NONE)); + + _cairo_quartz_cairo_path_to_quartz_context (path, state.cgMaskContext); + + if (state.action == DO_DIRECT) { + assert (state.cgDrawContext == state.cgMaskContext); + if (fill_rule == CAIRO_FILL_RULE_WINDING) + CGContextFillPath (state.cgMaskContext); + else + CGContextEOFillPath (state.cgMaskContext); + } else { + if (fill_rule == CAIRO_FILL_RULE_WINDING) + CGContextClip (state.cgMaskContext); + else + CGContextEOClip (state.cgMaskContext); + + _cairo_quartz_draw_source (&state, extents->op); + } + +BAIL: + _cairo_quartz_teardown_state (&state, extents); + + ND ((stderr, "-- fill\n")); + return rv; +} + +static cairo_int_status_t +_cairo_quartz_cg_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_quartz_drawing_state_t state; + cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; + CGAffineTransform strokeTransform, invStrokeTransform; + + ND ((stderr, "%p _cairo_quartz_surface_stroke op %d source->type %d\n", + extents->surface, extents->op, extents->source_pattern.base.type)); + + rv = _cairo_quartz_setup_state (&state, extents); + if (unlikely (rv)) + goto BAIL; + + // Turning antialiasing off used to cause misrendering with + // single-pixel lines (e.g. 20,10.5 -> 21,10.5 end up being rendered as 2 pixels). + // That's been since fixed in at least 10.5, and in the latest 10.4 dot releases. + CGContextSetShouldAntialias (state.cgMaskContext, (antialias != CAIRO_ANTIALIAS_NONE)); + CGContextSetLineWidth (state.cgMaskContext, style->line_width); + CGContextSetLineCap (state.cgMaskContext, _cairo_quartz_cairo_line_cap_to_quartz (style->line_cap)); + CGContextSetLineJoin (state.cgMaskContext, _cairo_quartz_cairo_line_join_to_quartz (style->line_join)); + CGContextSetMiterLimit (state.cgMaskContext, style->miter_limit); + + if (style->dash && style->num_dashes) { + cairo_quartz_float_t sdash[CAIRO_STACK_ARRAY_LENGTH (cairo_quartz_float_t)]; + cairo_quartz_float_t *fdash = sdash; + unsigned int max_dashes = style->num_dashes; + unsigned int k; + + if (style->num_dashes%2) + max_dashes *= 2; + if (max_dashes > ARRAY_LENGTH (sdash)) + fdash = _cairo_malloc_ab (max_dashes, sizeof (cairo_quartz_float_t)); + if (unlikely (fdash == NULL)) { + rv = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + + for (k = 0; k < max_dashes; k++) + fdash[k] = (cairo_quartz_float_t) style->dash[k % style->num_dashes]; + + CGContextSetLineDash (state.cgMaskContext, style->dash_offset, fdash, max_dashes); + if (fdash != sdash) + free (fdash); + } else + CGContextSetLineDash (state.cgMaskContext, 0, NULL, 0); + + _cairo_quartz_cairo_path_to_quartz_context (path, state.cgMaskContext); + + _cairo_quartz_cairo_matrix_to_quartz (ctm, &strokeTransform); + CGContextConcatCTM (state.cgMaskContext, strokeTransform); + + if (state.action == DO_DIRECT) { + assert (state.cgDrawContext == state.cgMaskContext); + CGContextStrokePath (state.cgMaskContext); + } else { + CGContextReplacePathWithStrokedPath (state.cgMaskContext); + CGContextClip (state.cgMaskContext); + + _cairo_quartz_cairo_matrix_to_quartz (ctm_inverse, &invStrokeTransform); + CGContextConcatCTM (state.cgMaskContext, invStrokeTransform); + + _cairo_quartz_draw_source (&state, extents->op); + } + +BAIL: + _cairo_quartz_teardown_state (&state, extents); + + ND ((stderr, "-- stroke\n")); + return rv; +} + +#if CAIRO_HAS_QUARTZ_FONT +static cairo_int_status_t +_cairo_quartz_cg_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + CGAffineTransform textTransform, invTextTransform; + CGGlyph glyphs_static[CAIRO_STACK_ARRAY_LENGTH (CGSize)]; + CGSize cg_advances_static[CAIRO_STACK_ARRAY_LENGTH (CGSize)]; + CGGlyph *cg_glyphs = &glyphs_static[0]; + CGSize *cg_advances = &cg_advances_static[0]; + COMPILE_TIME_ASSERT (sizeof (CGGlyph) <= sizeof (CGSize)); + + cairo_quartz_drawing_state_t state; + cairo_int_status_t rv = CAIRO_INT_STATUS_UNSUPPORTED; + cairo_quartz_float_t xprev, yprev; + int i; + CGFontRef cgfref = NULL; + + cairo_bool_t didForceFontSmoothing = FALSE; + + if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ) + return CAIRO_INT_STATUS_UNSUPPORTED; + + rv = _cairo_quartz_setup_state (&state, extents); + if (unlikely (rv)) + goto BAIL; + + if (state.action == DO_DIRECT) { + assert (state.cgDrawContext == state.cgMaskContext); + CGContextSetTextDrawingMode (state.cgMaskContext, kCGTextFill); + } else { + CGContextSetTextDrawingMode (state.cgMaskContext, kCGTextClip); + } + + /* this doesn't addref */ + cgfref = _cairo_quartz_scaled_font_get_cg_font_ref (scaled_font); + CGContextSetFont (state.cgMaskContext, cgfref); + CGContextSetFontSize (state.cgMaskContext, 1.0); + + switch (scaled_font->options.antialias) { + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_BEST: + CGContextSetShouldAntialias (state.cgMaskContext, TRUE); + CGContextSetShouldSmoothFonts (state.cgMaskContext, TRUE); + if (CGContextSetAllowsFontSmoothingPtr && + !CGContextGetAllowsFontSmoothingPtr (state.cgMaskContext)) + { + didForceFontSmoothing = TRUE; + CGContextSetAllowsFontSmoothingPtr (state.cgMaskContext, TRUE); + } + break; + case CAIRO_ANTIALIAS_NONE: + CGContextSetShouldAntialias (state.cgMaskContext, FALSE); + break; + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_GOOD: + case CAIRO_ANTIALIAS_FAST: + CGContextSetShouldAntialias (state.cgMaskContext, TRUE); + CGContextSetShouldSmoothFonts (state.cgMaskContext, FALSE); + break; + case CAIRO_ANTIALIAS_DEFAULT: + /* Don't do anything */ + break; + } + + if (num_glyphs > ARRAY_LENGTH (glyphs_static)) { + cg_glyphs = (CGGlyph*) _cairo_malloc_ab (num_glyphs, sizeof (CGGlyph) + sizeof (CGSize)); + if (unlikely (cg_glyphs == NULL)) { + rv = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + + cg_advances = (CGSize*) (cg_glyphs + num_glyphs); + } + + /* scale(1,-1) * scaled_font->scale */ + textTransform = CGAffineTransformMake (scaled_font->scale.xx, + scaled_font->scale.yx, + -scaled_font->scale.xy, + -scaled_font->scale.yy, + 0.0, 0.0); + + /* scaled_font->scale_inverse * scale(1,-1) */ + invTextTransform = CGAffineTransformMake (scaled_font->scale_inverse.xx, + -scaled_font->scale_inverse.yx, + scaled_font->scale_inverse.xy, + -scaled_font->scale_inverse.yy, + 0.0, 0.0); + + CGContextSetTextPosition (state.cgMaskContext, 0.0, 0.0); + CGContextSetTextMatrix (state.cgMaskContext, CGAffineTransformIdentity); + + /* Convert our glyph positions to glyph advances. We need n-1 advances, + * since the advance at index 0 is applied after glyph 0. */ + xprev = glyphs[0].x; + yprev = glyphs[0].y; + + cg_glyphs[0] = glyphs[0].index; + + for (i = 1; i < num_glyphs; i++) { + cairo_quartz_float_t xf = glyphs[i].x; + cairo_quartz_float_t yf = glyphs[i].y; + cg_glyphs[i] = glyphs[i].index; + cg_advances[i - 1] = CGSizeApplyAffineTransform (CGSizeMake (xf - xprev, yf - yprev), invTextTransform); + xprev = xf; + yprev = yf; + } + + /* Translate to the first glyph's position before drawing */ + CGContextTranslateCTM (state.cgMaskContext, glyphs[0].x, glyphs[0].y); + CGContextConcatCTM (state.cgMaskContext, textTransform); + + CGContextShowGlyphsWithAdvances (state.cgMaskContext, + cg_glyphs, + cg_advances, + num_glyphs); + + CGContextConcatCTM (state.cgMaskContext, invTextTransform); + CGContextTranslateCTM (state.cgMaskContext, -glyphs[0].x, -glyphs[0].y); + + if (state.action != DO_DIRECT) + _cairo_quartz_draw_source (&state, extents->op); + +BAIL: + if (didForceFontSmoothing) + CGContextSetAllowsFontSmoothingPtr (state.cgMaskContext, FALSE); + + _cairo_quartz_teardown_state (&state, extents); + + if (cg_glyphs != glyphs_static) + free (cg_glyphs); + + return rv; +} +#endif /* CAIRO_HAS_QUARTZ_FONT */ + +static const cairo_compositor_t _cairo_quartz_cg_compositor = { + &_cairo_fallback_compositor, + + _cairo_quartz_cg_paint, + _cairo_quartz_cg_mask, + _cairo_quartz_cg_stroke, + _cairo_quartz_cg_fill, +#if CAIRO_HAS_QUARTZ_FONT + _cairo_quartz_cg_glyphs, +#else + NULL, +#endif +}; + +static cairo_int_status_t +_cairo_quartz_surface_paint (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + return _cairo_compositor_paint (&_cairo_quartz_cg_compositor, + surface, op, source, clip); +} + +static cairo_int_status_t +_cairo_quartz_surface_mask (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + return _cairo_compositor_mask (&_cairo_quartz_cg_compositor, + surface, op, source, mask, + clip); +} + +static cairo_int_status_t +_cairo_quartz_surface_fill (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + return _cairo_compositor_fill (&_cairo_quartz_cg_compositor, + surface, op, source, path, + fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_quartz_surface_stroke (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + return _cairo_compositor_stroke (&_cairo_quartz_cg_compositor, + surface, op, source, path, + style, ctm,ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +_cairo_quartz_surface_glyphs (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + return _cairo_compositor_glyphs (&_cairo_quartz_cg_compositor, + surface, op, source, + glyphs, num_glyphs, scaled_font, + clip); +} + +static cairo_status_t +_cairo_quartz_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_quartz_surface_t *surface = + cairo_container_of (clipper, cairo_quartz_surface_t, clipper); + + ND ((stderr, "%p _cairo_quartz_surface_intersect_clip_path path: %p\n", surface, path)); + + if (IS_EMPTY (surface)) + return CAIRO_STATUS_SUCCESS; + + if (path == NULL) { + /* If we're being asked to reset the clip, we can only do it + * by restoring the gstate to our previous saved one, and + * saving it again. + * + * Note that this assumes that ALL quartz surface creation + * functions will do a SaveGState first; we do this in create_internal. + */ + CGContextRestoreGState (surface->cgContext); + CGContextSaveGState (surface->cgContext); + } else { + CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); + + _cairo_quartz_cairo_path_to_quartz_context (path, surface->cgContext); + + if (fill_rule == CAIRO_FILL_RULE_WINDING) + CGContextClip (surface->cgContext); + else + CGContextEOClip (surface->cgContext); + } + + ND ((stderr, "-- intersect_clip_path\n")); + + return CAIRO_STATUS_SUCCESS; +} + +// XXXtodo implement show_page; need to figure out how to handle begin/end + +static const struct _cairo_surface_backend cairo_quartz_surface_backend = { + CAIRO_SURFACE_TYPE_QUARTZ, + _cairo_quartz_surface_finish, + + _cairo_default_context_create, + + _cairo_quartz_surface_create_similar, + NULL, /* similar image */ + _cairo_quartz_surface_map_to_image, + _cairo_quartz_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_quartz_surface_acquire_source_image, + _cairo_quartz_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_quartz_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_quartz_surface_paint, + _cairo_quartz_surface_mask, + _cairo_quartz_surface_stroke, + _cairo_quartz_surface_fill, + NULL, /* fill-stroke */ + _cairo_quartz_surface_glyphs, +}; + +cairo_quartz_surface_t * +_cairo_quartz_surface_create_internal (CGContextRef cgContext, + cairo_content_t content, + unsigned int width, + unsigned int height) +{ + cairo_quartz_surface_t *surface; + + quartz_ensure_symbols (); + + /* Init the base surface */ + surface = malloc (sizeof (cairo_quartz_surface_t)); + if (unlikely (surface == NULL)) + return (cairo_quartz_surface_t*) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + memset (surface, 0, sizeof (cairo_quartz_surface_t)); + + _cairo_surface_init (&surface->base, + &cairo_quartz_surface_backend, + NULL, /* device */ + content); + + _cairo_surface_clipper_init (&surface->clipper, + _cairo_quartz_surface_clipper_intersect_clip_path); + + /* Save our extents */ + surface->extents.x = surface->extents.y = 0; + surface->extents.width = width; + surface->extents.height = height; + surface->virtual_extents = surface->extents; + + if (IS_EMPTY (surface)) { + surface->cgContext = NULL; + surface->cgContextBaseCTM = CGAffineTransformIdentity; + surface->imageData = NULL; + surface->base.is_clear = TRUE; + return surface; + } + + /* Save so we can always get back to a known-good CGContext -- this is + * required for proper behaviour of intersect_clip_path(NULL) + */ + CGContextSaveGState (cgContext); + + surface->cgContext = cgContext; + surface->cgContextBaseCTM = CGContextGetCTM (cgContext); + + surface->imageData = NULL; + surface->imageSurfaceEquiv = NULL; + + return surface; +} + +/** + * cairo_quartz_surface_create_for_cg_context: + * @cgContext: the existing CGContext for which to create the surface + * @width: width of the surface, in pixels + * @height: height of the surface, in pixels + * + * Creates a Quartz surface that wraps the given CGContext. The + * CGContext is assumed to be in the standard Cairo coordinate space + * (that is, with the origin at the upper left and the Y axis + * increasing downward). If the CGContext is in the Quartz coordinate + * space (with the origin at the bottom left), then it should be + * flipped before this function is called. The flip can be accomplished + * using a translate and a scale; for example: + * + * + * CGContextTranslateCTM (cgContext, 0.0, height); + * CGContextScaleCTM (cgContext, 1.0, -1.0); + * + * + * All Cairo operations are implemented in terms of Quartz operations, + * as long as Quartz-compatible elements are used (such as Quartz fonts). + * + * Return value: the newly created Cairo surface. + * + * Since: 1.6 + **/ + +cairo_surface_t * +cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, + unsigned int width, + unsigned int height) +{ + cairo_quartz_surface_t *surf; + + surf = _cairo_quartz_surface_create_internal (cgContext, CAIRO_CONTENT_COLOR_ALPHA, + width, height); + if (likely (!surf->base.status)) + CGContextRetain (cgContext); + + return &surf->base; +} + +/** + * cairo_quartz_surface_create: + * @format: format of pixels in the surface to create + * @width: width of the surface, in pixels + * @height: height of the surface, in pixels + * + * Creates a Quartz surface backed by a CGBitmap. The surface is + * created using the Device RGB (or Device Gray, for A8) color space. + * All Cairo operations, including those that require software + * rendering, will succeed on this surface. + * + * Return value: the newly created surface. + * + * Since: 1.6 + **/ +cairo_surface_t * +cairo_quartz_surface_create (cairo_format_t format, + unsigned int width, + unsigned int height) +{ + cairo_quartz_surface_t *surf; + CGContextRef cgc; + CGColorSpaceRef cgColorspace; + CGBitmapInfo bitinfo; + void *imageData; + int stride; + int bitsPerComponent; + + if (!_cairo_quartz_verify_surface_size (width, height)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + if (width == 0 || height == 0) { + return &_cairo_quartz_surface_create_internal (NULL, _cairo_content_from_format (format), + width, height)->base; + } + + if (format == CAIRO_FORMAT_ARGB32 || + format == CAIRO_FORMAT_RGB24) + { + cgColorspace = CGColorSpaceCreateDeviceRGB (); + bitinfo = kCGBitmapByteOrder32Host; + if (format == CAIRO_FORMAT_ARGB32) + bitinfo |= kCGImageAlphaPremultipliedFirst; + else + bitinfo |= kCGImageAlphaNoneSkipFirst; + bitsPerComponent = 8; + stride = width * 4; + } else if (format == CAIRO_FORMAT_A8) { + cgColorspace = NULL; + stride = width; + bitinfo = kCGImageAlphaOnly; + bitsPerComponent = 8; + } else if (format == CAIRO_FORMAT_A1) { + /* I don't think we can usefully support this, as defined by + * cairo_format_t -- these are 1-bit pixels stored in 32-bit + * quantities. + */ + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } else { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + /* The Apple docs say that for best performance, the stride and the data + * pointer should be 16-byte aligned. malloc already aligns to 16-bytes, + * so we don't have to anything special on allocation. + */ + stride = (stride + 15) & ~15; + + imageData = _cairo_malloc_ab (height, stride); + if (unlikely (!imageData)) { + CGColorSpaceRelease (cgColorspace); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + /* zero the memory to match the image surface behaviour */ + memset (imageData, 0, height * stride); + + cgc = CGBitmapContextCreate (imageData, + width, + height, + bitsPerComponent, + stride, + cgColorspace, + bitinfo); + CGColorSpaceRelease (cgColorspace); + + if (!cgc) { + free (imageData); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + /* flip the Y axis */ + CGContextTranslateCTM (cgc, 0.0, height); + CGContextScaleCTM (cgc, 1.0, -1.0); + + surf = _cairo_quartz_surface_create_internal (cgc, _cairo_content_from_format (format), + width, height); + if (surf->base.status) { + CGContextRelease (cgc); + free (imageData); + // create_internal will have set an error + return &surf->base; + } + + surf->base.is_clear = TRUE; + + surf->imageData = imageData; + surf->imageSurfaceEquiv = cairo_image_surface_create_for_data (imageData, format, width, height, stride); + + return &surf->base; +} + +/** + * cairo_quartz_surface_get_cg_context: + * @surface: the Cairo Quartz surface + * + * Returns the CGContextRef that the given Quartz surface is backed + * by. + * + * A call to cairo_surface_flush() is required before using the + * CGContextRef to ensure that all pending drawing operations are + * finished and to restore any temporary modification cairo has made + * to its state. A call to cairo_surface_mark_dirty() is required + * after the state or the content of the CGContextRef has been + * modified. + * + * Return value: the CGContextRef for the given surface. + * + * Since: 1.6 + **/ +CGContextRef +cairo_quartz_surface_get_cg_context (cairo_surface_t *surface) +{ + if (surface && _cairo_surface_is_quartz (surface)) { + cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t *) surface; + return quartz->cgContext; + } else + return NULL; +} + +/** + * _cairo_surface_is_quartz: + * @surface: a #cairo_surface_t + * + * Checks if a surface is a #cairo_quartz_surface_t + * + * Return value: True if the surface is an quartz surface + **/ +cairo_bool_t +_cairo_surface_is_quartz (const cairo_surface_t *surface) +{ + return surface->backend == &cairo_quartz_surface_backend; +} + +/* Debug stuff */ + +#ifdef QUARTZ_DEBUG + +#include + +void ExportCGImageToPNGFile (CGImageRef inImageRef, char* dest) +{ + Handle dataRef = NULL; + OSType dataRefType; + CFStringRef inPath = CFStringCreateWithCString (NULL, dest, kCFStringEncodingASCII); + + GraphicsExportComponent grex = 0; + unsigned long sizeWritten; + + ComponentResult result; + + // create the data reference + result = QTNewDataReferenceFromFullPathCFString (inPath, kQTNativeDefaultPathStyle, + 0, &dataRef, &dataRefType); + + if (NULL != dataRef && noErr == result) { + // get the PNG exporter + result = OpenADefaultComponent (GraphicsExporterComponentType, kQTFileTypePNG, + &grex); + + if (grex) { + // tell the exporter where to find its source image + result = GraphicsExportSetInputCGImage (grex, inImageRef); + + if (noErr == result) { + // tell the exporter where to save the exporter image + result = GraphicsExportSetOutputDataReference (grex, dataRef, + dataRefType); + + if (noErr == result) { + // write the PNG file + result = GraphicsExportDoExport (grex, &sizeWritten); + } + } + + // remember to close the component + CloseComponent (grex); + } + + // remember to dispose of the data reference handle + DisposeHandle (dataRef); + } +} + +void +quartz_image_to_png (CGImageRef imgref, char *dest) +{ + static int sctr = 0; + char sptr[] = "/Users/vladimir/Desktop/barXXXXX.png"; + + if (dest == NULL) { + fprintf (stderr, "** Writing %p to bar%d\n", imgref, sctr); + sprintf (sptr, "/Users/vladimir/Desktop/bar%d.png", sctr); + sctr++; + dest = sptr; + } + + ExportCGImageToPNGFile (imgref, dest); +} + +void +quartz_surface_to_png (cairo_quartz_surface_t *nq, char *dest) +{ + static int sctr = 0; + char sptr[] = "/Users/vladimir/Desktop/fooXXXXX.png"; + + if (nq->base.type != CAIRO_SURFACE_TYPE_QUARTZ) { + fprintf (stderr, "** quartz_surface_to_png: surface %p isn't quartz!\n", nq); + return; + } + + if (dest == NULL) { + fprintf (stderr, "** Writing %p to foo%d\n", nq, sctr); + sprintf (sptr, "/Users/vladimir/Desktop/foo%d.png", sctr); + sctr++; + dest = sptr; + } + + CGImageRef imgref = CGBitmapContextCreateImage (nq->cgContext); + if (imgref == NULL) { + fprintf (stderr, "quartz surface at %p is not a bitmap context!\n", nq); + return; + } + + ExportCGImageToPNGFile (imgref, dest); + + CGImageRelease (imgref); +} + +#endif /* QUARTZ_DEBUG */ diff --git a/src/cairo-quartz.h b/src/cairo-quartz.h new file mode 100644 index 000000000..9be5f9ae5 --- /dev/null +++ b/src/cairo-quartz.h @@ -0,0 +1,82 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006, 2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#ifndef CAIRO_QUARTZ_H +#define CAIRO_QUARTZ_H + +#include "cairo.h" + +#if CAIRO_HAS_QUARTZ_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_quartz_surface_create (cairo_format_t format, + unsigned int width, + unsigned int height); + +cairo_public cairo_surface_t * +cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, + unsigned int width, + unsigned int height); + +cairo_public CGContextRef +cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); + +#if CAIRO_HAS_QUARTZ_FONT + +/* + * Quartz font support + */ + +cairo_public cairo_font_face_t * +cairo_quartz_font_face_create_for_cgfont (CGFontRef font); + +cairo_public cairo_font_face_t * +cairo_quartz_font_face_create_for_atsu_font_id (ATSUFontID font_id); + +#endif /* CAIRO_HAS_QUARTZ_FONT */ + +CAIRO_END_DECLS + +#else + +# error Cairo was not compiled with support for the quartz backend + +#endif /* CAIRO_HAS_QUARTZ_SURFACE */ + +#endif /* CAIRO_QUARTZ_H */ diff --git a/src/cairo-raster-source-pattern.c b/src/cairo-raster-source-pattern.c new file mode 100644 index 000000000..64520feae --- /dev/null +++ b/src/cairo-raster-source-pattern.c @@ -0,0 +1,430 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-error-private.h" +#include "cairo-pattern-private.h" + +/** + * SECTION:cairo-raster-source + * @Title: Raster Sources + * @Short_Description: Supplying arbitrary image data + * @See_Also: #cairo_pattern_t + * + * The raster source provides the ability to supply arbitrary pixel data + * whilst rendering. The pixels are queried at the time of rasterisation + * by means of user callback functions, allowing for the ultimate + * flexibility. For example, in handling compressed image sources, you + * may keep a MRU cache of decompressed images and decompress sources on the + * fly and discard old ones to conserve memory. + * + * For the raster source to be effective, you must at least specify + * the acquire and release callbacks which are used to retrieve the pixel + * data for the region of interest and demark when it can be freed afterwards. + * Other callbacks are provided for when the pattern is copied temporarily + * during rasterisation, or more permanently as a snapshot in order to keep + * the pixel data available for printing. + **/ + +cairo_surface_t * +_cairo_raster_source_pattern_acquire (const cairo_pattern_t *abstract_pattern, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents) +{ + cairo_raster_source_pattern_t *pattern = + (cairo_raster_source_pattern_t *) abstract_pattern; + + if (pattern->acquire == NULL) + return NULL; + + if (extents == NULL) + extents = &pattern->extents; + + return pattern->acquire (&pattern->base, pattern->user_data, + target, extents); +} + +void +_cairo_raster_source_pattern_release (const cairo_pattern_t *abstract_pattern, + cairo_surface_t *surface) +{ + cairo_raster_source_pattern_t *pattern = + (cairo_raster_source_pattern_t *) abstract_pattern; + + if (pattern->release == NULL) + return; + + pattern->release (&pattern->base, pattern->user_data, surface); +} + +cairo_status_t +_cairo_raster_source_pattern_init_copy (cairo_pattern_t *abstract_pattern, + const cairo_pattern_t *other) +{ + cairo_raster_source_pattern_t *pattern = + (cairo_raster_source_pattern_t *) abstract_pattern; + cairo_status_t status; + + VG (VALGRIND_MAKE_MEM_UNDEFINED (pattern, sizeof (cairo_raster_source_pattern_t))); + memcpy(pattern, other, sizeof (cairo_raster_source_pattern_t)); + + status = CAIRO_STATUS_SUCCESS; + if (pattern->copy) + status = pattern->copy (&pattern->base, pattern->user_data, other); + + return status; +} + +cairo_status_t +_cairo_raster_source_pattern_snapshot (cairo_pattern_t *abstract_pattern) +{ + cairo_raster_source_pattern_t *pattern = + (cairo_raster_source_pattern_t *) abstract_pattern; + + if (pattern->snapshot == NULL) + return CAIRO_STATUS_SUCCESS; + + return pattern->snapshot (&pattern->base, pattern->user_data); +} + +void +_cairo_raster_source_pattern_finish (cairo_pattern_t *abstract_pattern) +{ + cairo_raster_source_pattern_t *pattern = + (cairo_raster_source_pattern_t *) abstract_pattern; + + if (pattern->finish == NULL) + return; + + pattern->finish (&pattern->base, pattern->user_data); +} + +/* Public interface */ + +/** + * cairo_pattern_create_raster_source: + * @user_data: the user data to be passed to all callbacks + * @content: content type for the pixel data that will be returned. Knowing + * the content type ahead of time is used for analysing the operation and + * picking the appropriate rendering path. + * @width: maximum size of the sample area + * @height: maximum size of the sample area + * + * Creates a new user pattern for providing pixel data. + * + * Use the setter functions to associate callbacks with the returned + * pattern. The only mandatory callback is acquire. + * + * Return value: a newly created #cairo_pattern_t. Free with + * cairo_pattern_destroy() when you are done using it. + * + * Since: 1.12 + **/ +cairo_pattern_t * +cairo_pattern_create_raster_source (void *user_data, + cairo_content_t content, + int width, int height) +{ + cairo_raster_source_pattern_t *pattern; + + CAIRO_MUTEX_INITIALIZE (); + + if (width < 0 || height < 0) + return _cairo_pattern_create_in_error (CAIRO_STATUS_INVALID_SIZE); + + if (! CAIRO_CONTENT_VALID (content)) + return _cairo_pattern_create_in_error (CAIRO_STATUS_INVALID_CONTENT); + + pattern = calloc (1, sizeof (*pattern)); + if (unlikely (pattern == NULL)) + return _cairo_pattern_create_in_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_pattern_init (&pattern->base, + CAIRO_PATTERN_TYPE_RASTER_SOURCE); + CAIRO_REFERENCE_COUNT_INIT (&pattern->base.ref_count, 1); + + pattern->content = content; + + pattern->extents.x = 0; + pattern->extents.y = 0; + pattern->extents.width = width; + pattern->extents.height = height; + + pattern->user_data = user_data; + + return &pattern->base; +} + +/** + * cairo_raster_source_pattern_set_callback_data: + * @pattern: the pattern to update + * @data: the user data to be passed to all callbacks + * + * Updates the user data that is provided to all callbacks. + * + * Since: 1.12 + **/ +void +cairo_raster_source_pattern_set_callback_data (cairo_pattern_t *abstract_pattern, + void *data) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + pattern->user_data = data; +} + +/** + * cairo_raster_source_pattern_get_callback_data: + * @pattern: the pattern to update + * + * Queries the current user data. + * + * Return value: the current user-data passed to each callback + * + * Since: 1.12 + **/ +void * +cairo_raster_source_pattern_get_callback_data (cairo_pattern_t *abstract_pattern) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return NULL; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + return pattern->user_data; +} + +/** + * cairo_raster_source_pattern_set_acquire: + * @pattern: the pattern to update + * @acquire: acquire callback + * @release: release callback + * + * Specifies the callbacks used to generate the image surface for a rendering + * operation (acquire) and the function used to cleanup that surface afterwards. + * + * The @acquire callback should create a surface (preferably an image + * surface created to match the target using + * cairo_surface_create_similar_image()) that defines at least the region + * of interest specified by extents. The surface is allowed to be the entire + * sample area, but if it does contain a subsection of the sample area, + * the surface extents should be provided by setting the device offset (along + * with its width and height) using cairo_surface_set_device_offset(). + * + * Since: 1.12 + **/ +void +cairo_raster_source_pattern_set_acquire (cairo_pattern_t *abstract_pattern, + cairo_raster_source_acquire_func_t acquire, + cairo_raster_source_release_func_t release) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + pattern->acquire = acquire; + pattern->release = release; +} + +/** + * cairo_raster_source_pattern_get_acquire: + * @pattern: the pattern to query + * @acquire: return value for the current acquire callback + * @release: return value for the current release callback + * + * Queries the current acquire and release callbacks. + * + * Since: 1.12 + **/ +void +cairo_raster_source_pattern_get_acquire (cairo_pattern_t *abstract_pattern, + cairo_raster_source_acquire_func_t *acquire, + cairo_raster_source_release_func_t *release) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + if (acquire) + *acquire = pattern->acquire; + if (release) + *release = pattern->release; +} + +/** + * cairo_raster_source_pattern_set_snapshot: + * @pattern: the pattern to update + * @snapshot: snapshot callback + * + * Sets the callback that will be used whenever a snapshot is taken of the + * pattern, that is whenever the current contents of the pattern should be + * preserved for later use. This is typically invoked whilst printing. + * + * Since: 1.12 + **/ +void +cairo_raster_source_pattern_set_snapshot (cairo_pattern_t *abstract_pattern, + cairo_raster_source_snapshot_func_t snapshot) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + pattern->snapshot = snapshot; +} + +/** + * cairo_raster_source_pattern_get_snapshot: + * @pattern: the pattern to query + * + * Queries the current snapshot callback. + * + * Return value: the current snapshot callback + * + * Since: 1.12 + **/ +cairo_raster_source_snapshot_func_t +cairo_raster_source_pattern_get_snapshot (cairo_pattern_t *abstract_pattern) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return NULL; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + return pattern->snapshot; +} + +/** + * cairo_raster_source_pattern_set_copy: + * @pattern: the pattern to update + * @copy: the copy callback + * + * Updates the copy callback which is used whenever a temporary copy of the + * pattern is taken. + * + * Since: 1.12 + **/ +void +cairo_raster_source_pattern_set_copy (cairo_pattern_t *abstract_pattern, + cairo_raster_source_copy_func_t copy) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + pattern->copy = copy; +} + +/** + * cairo_raster_source_pattern_get_copy: + * @pattern: the pattern to query + * + * Queries the current copy callback. + * + * Return value: the current copy callback + * + * Since: 1.12 + **/ +cairo_raster_source_copy_func_t +cairo_raster_source_pattern_get_copy (cairo_pattern_t *abstract_pattern) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return NULL; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + return pattern->copy; +} + +/** + * cairo_raster_source_pattern_set_finish: + * @pattern: the pattern to update + * @finish: the finish callback + * + * Updates the finish callback which is used whenever a pattern (or a copy + * thereof) will no longer be used. + * + * Since: 1.12 + **/ +void +cairo_raster_source_pattern_set_finish (cairo_pattern_t *abstract_pattern, + cairo_raster_source_finish_func_t finish) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + pattern->finish = finish; +} + +/** + * cairo_raster_source_pattern_get_finish: + * @pattern: the pattern to query + * + * Queries the current finish callback. + * + * Return value: the current finish callback + * + * Since: 1.12 + **/ +cairo_raster_source_finish_func_t +cairo_raster_source_pattern_get_finish (cairo_pattern_t *abstract_pattern) +{ + cairo_raster_source_pattern_t *pattern; + + if (abstract_pattern->type != CAIRO_PATTERN_TYPE_RASTER_SOURCE) + return NULL; + + pattern = (cairo_raster_source_pattern_t *) abstract_pattern; + return pattern->finish; +} diff --git a/src/cairo-recording-surface-inline.h b/src/cairo-recording-surface-inline.h new file mode 100644 index 000000000..9002ccd69 --- /dev/null +++ b/src/cairo-recording-surface-inline.h @@ -0,0 +1,68 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Adrian Johnson + */ + +#ifndef CAIRO_RECORDING_SURFACE_INLINE_H +#define CAIRO_RECORDING_SURFACE_INLINE_H + +#include "cairo-recording-surface-private.h" + +static inline cairo_bool_t +_cairo_recording_surface_get_bounds (cairo_surface_t *surface, + cairo_rectangle_t *extents) +{ + cairo_recording_surface_t *recording = (cairo_recording_surface_t *)surface; + if (recording->unbounded) + return FALSE; + + *extents = recording->extents_pixels; + return TRUE; +} + +/** + * _cairo_surface_is_recording: + * @surface: a #cairo_surface_t + * + * Checks if a surface is a #cairo_recording_surface_t + * + * Return value: %TRUE if the surface is a recording surface + **/ +static inline cairo_bool_t +_cairo_surface_is_recording (const cairo_surface_t *surface) +{ + return surface->backend->type == CAIRO_SURFACE_TYPE_RECORDING; +} + +#endif /* CAIRO_RECORDING_SURFACE_INLINE_H */ diff --git a/src/cairo-recording-surface-private.h b/src/cairo-recording-surface-private.h new file mode 100644 index 000000000..456c63389 --- /dev/null +++ b/src/cairo-recording-surface-private.h @@ -0,0 +1,195 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Adrian Johnson + */ + +#ifndef CAIRO_RECORDING_SURFACE_H +#define CAIRO_RECORDING_SURFACE_H + +#include "cairoint.h" +#include "cairo-path-fixed-private.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-backend-private.h" + +typedef enum { + /* The 5 basic drawing operations. */ + CAIRO_COMMAND_PAINT, + CAIRO_COMMAND_MASK, + CAIRO_COMMAND_STROKE, + CAIRO_COMMAND_FILL, + CAIRO_COMMAND_SHOW_TEXT_GLYPHS, +} cairo_command_type_t; + +typedef enum { + CAIRO_RECORDING_REGION_ALL, + CAIRO_RECORDING_REGION_NATIVE, + CAIRO_RECORDING_REGION_IMAGE_FALLBACK +} cairo_recording_region_type_t; + +typedef struct _cairo_command_header { + cairo_command_type_t type; + cairo_recording_region_type_t region; + cairo_operator_t op; + cairo_rectangle_int_t extents; + cairo_clip_t *clip; + + int index; + struct _cairo_command_header *chain; +} cairo_command_header_t; + +typedef struct _cairo_command_paint { + cairo_command_header_t header; + cairo_pattern_union_t source; +} cairo_command_paint_t; + +typedef struct _cairo_command_mask { + cairo_command_header_t header; + cairo_pattern_union_t source; + cairo_pattern_union_t mask; +} cairo_command_mask_t; + +typedef struct _cairo_command_stroke { + cairo_command_header_t header; + cairo_pattern_union_t source; + cairo_path_fixed_t path; + cairo_stroke_style_t style; + cairo_matrix_t ctm; + cairo_matrix_t ctm_inverse; + double tolerance; + cairo_antialias_t antialias; +} cairo_command_stroke_t; + +typedef struct _cairo_command_fill { + cairo_command_header_t header; + cairo_pattern_union_t source; + cairo_path_fixed_t path; + cairo_fill_rule_t fill_rule; + double tolerance; + cairo_antialias_t antialias; +} cairo_command_fill_t; + +typedef struct _cairo_command_show_text_glyphs { + cairo_command_header_t header; + cairo_pattern_union_t source; + char *utf8; + int utf8_len; + cairo_glyph_t *glyphs; + unsigned int num_glyphs; + cairo_text_cluster_t *clusters; + int num_clusters; + cairo_text_cluster_flags_t cluster_flags; + cairo_scaled_font_t *scaled_font; +} cairo_command_show_text_glyphs_t; + +typedef union _cairo_command { + cairo_command_header_t header; + + cairo_command_paint_t paint; + cairo_command_mask_t mask; + cairo_command_stroke_t stroke; + cairo_command_fill_t fill; + cairo_command_show_text_glyphs_t show_text_glyphs; +} cairo_command_t; + +typedef struct _cairo_recording_surface { + cairo_surface_t base; + + /* A recording-surface is logically unbounded, but when used as a + * source we need to render it to an image, so we need a size at + * which to create that image. */ + cairo_rectangle_t extents_pixels; + cairo_rectangle_int_t extents; + cairo_bool_t unbounded; + + cairo_array_t commands; + unsigned int *indices; + unsigned int num_indices; + cairo_bool_t optimize_clears; + cairo_bool_t has_bilevel_alpha; + cairo_bool_t has_only_op_over; + + struct bbtree { + cairo_box_t extents; + struct bbtree *left, *right; + cairo_command_header_t *chain; + } bbtree; +} cairo_recording_surface_t; + +slim_hidden_proto (cairo_recording_surface_create); + +cairo_private cairo_int_status_t +_cairo_recording_surface_get_path (cairo_surface_t *surface, + cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_recording_surface_replay_one (cairo_recording_surface_t *surface, + long unsigned index, + cairo_surface_t *target); + +cairo_private cairo_status_t +_cairo_recording_surface_replay (cairo_surface_t *surface, + cairo_surface_t *target); + +cairo_private cairo_status_t +_cairo_recording_surface_replay_with_clip (cairo_surface_t *surface, + const cairo_matrix_t *surface_transform, + cairo_surface_t *target, + const cairo_clip_t *target_clip); + +cairo_private cairo_status_t +_cairo_recording_surface_replay_and_create_regions (cairo_surface_t *surface, + cairo_surface_t *target); +cairo_private cairo_status_t +_cairo_recording_surface_replay_region (cairo_surface_t *surface, + const cairo_rectangle_int_t *surface_extents, + cairo_surface_t *target, + cairo_recording_region_type_t region); + +cairo_private cairo_status_t +_cairo_recording_surface_get_bbox (cairo_recording_surface_t *recording, + cairo_box_t *bbox, + const cairo_matrix_t *transform); + +cairo_private cairo_status_t +_cairo_recording_surface_get_ink_bbox (cairo_recording_surface_t *surface, + cairo_box_t *bbox, + const cairo_matrix_t *transform); + +cairo_private cairo_bool_t +_cairo_recording_surface_has_only_bilevel_alpha (cairo_recording_surface_t *surface); + +cairo_private cairo_bool_t +_cairo_recording_surface_has_only_op_over (cairo_recording_surface_t *surface); + +#endif /* CAIRO_RECORDING_SURFACE_H */ diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c new file mode 100644 index 000000000..ce29b9366 --- /dev/null +++ b/src/cairo-recording-surface.c @@ -0,0 +1,2188 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * Copyright © 2007 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Carl Worth + * Adrian Johnson + */ + +/** + * SECTION:cairo-recording + * @Title: Recording Surfaces + * @Short_Description: Records all drawing operations + * @See_Also: #cairo_surface_t + * + * A recording surface is a surface that records all drawing operations at + * the highest level of the surface backend interface, (that is, the + * level of paint, mask, stroke, fill, and show_text_glyphs). The recording + * surface can then be "replayed" against any target surface by using it + * as a source surface. + * + * If you want to replay a surface so that the results in target will be + * identical to the results that would have been obtained if the original + * operations applied to the recording surface had instead been applied to the + * target surface, you can use code like this: + * + * cairo_t *cr; + * + * cr = cairo_create (target); + * cairo_set_source_surface (cr, recording_surface, 0.0, 0.0); + * cairo_paint (cr); + * cairo_destroy (cr); + * + * + * A recording surface is logically unbounded, i.e. it has no implicit constraint + * on the size of the drawing surface. However, in practice this is rarely + * useful as you wish to replay against a particular target surface with + * known bounds. For this case, it is more efficient to specify the target + * extents to the recording surface upon creation. + * + * The recording phase of the recording surface is careful to snapshot all + * necessary objects (paths, patterns, etc.), in order to achieve + * accurate replay. The efficiency of the recording surface could be + * improved by improving the implementation of snapshot for the + * various objects. For example, it would be nice to have a + * copy-on-write implementation for _cairo_surface_snapshot. + **/ + +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-analysis-surface-private.h" +#include "cairo-clip-private.h" +#include "cairo-combsort-inline.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-wrapper-private.h" +#include "cairo-traps-private.h" + +typedef enum { + CAIRO_RECORDING_REPLAY, + CAIRO_RECORDING_CREATE_REGIONS +} cairo_recording_replay_type_t; + +static const cairo_surface_backend_t cairo_recording_surface_backend; + +/** + * CAIRO_HAS_RECORDING_SURFACE: + * + * Defined if the recording surface backend is available. + * The recording surface backend is always built in. + * This macro was added for completeness in cairo 1.10. + * + * Since: 1.10 + **/ + +/* Currently all recording surfaces do have a size which should be passed + * in as the maximum size of any target surface against which the + * recording-surface will ever be replayed. + * + * XXX: The naming of "pixels" in the size here is a misnomer. It's + * actually a size in whatever device-space units are desired (again, + * according to the intended replay target). + */ + +static int bbtree_left_or_right (struct bbtree *bbt, + const cairo_box_t *box) +{ + int left, right; + + if (bbt->left) { + cairo_box_t *e = &bbt->left->extents; + cairo_box_t b; + + b.p1.x = MIN (e->p1.x, box->p1.x); + b.p1.y = MIN (e->p1.y, box->p1.y); + b.p2.x = MAX (e->p2.x, box->p2.x); + b.p2.y = MAX (e->p2.y, box->p2.y); + + left = _cairo_fixed_integer_part (b.p2.x - b.p1.x) * _cairo_fixed_integer_part (b.p2.y - b.p1.y); + left -= _cairo_fixed_integer_part (e->p2.x - e->p1.x) * _cairo_fixed_integer_part (e->p2.y - e->p1.y); + } else + left = 0; + + if (bbt->right) { + cairo_box_t *e = &bbt->right->extents; + cairo_box_t b; + + b.p1.x = MIN (e->p1.x, box->p1.x); + b.p1.y = MIN (e->p1.y, box->p1.y); + b.p2.x = MAX (e->p2.x, box->p2.x); + b.p2.y = MAX (e->p2.y, box->p2.y); + + right = _cairo_fixed_integer_part (b.p2.x - b.p1.x) * _cairo_fixed_integer_part (b.p2.y - b.p1.y); + right -= _cairo_fixed_integer_part (e->p2.x - e->p1.x) * _cairo_fixed_integer_part (e->p2.y - e->p1.y); + } else + right = 0; + + return left <= right; +} + +#define INVALID_CHAIN ((cairo_command_header_t *)-1) + +static struct bbtree * +bbtree_new (const cairo_box_t *box, cairo_command_header_t *chain) +{ + struct bbtree *bbt = malloc (sizeof (*bbt)); + if (bbt == NULL) + return NULL; + bbt->extents = *box; + bbt->left = bbt->right = NULL; + bbt->chain = chain; + return bbt; +} + +static void +bbtree_init (struct bbtree *bbt, cairo_command_header_t *header) +{ + _cairo_box_from_rectangle (&bbt->extents, &header->extents); + bbt->chain = header; +} + +static cairo_status_t +bbtree_add (struct bbtree *bbt, + cairo_command_header_t *header, + const cairo_box_t *box) +{ + if (box->p1.x < bbt->extents.p1.x || box->p1.y < bbt->extents.p1.y || + box->p2.x > bbt->extents.p2.x || box->p2.y > bbt->extents.p2.y) + { + if (bbt->chain) { + if (bbtree_left_or_right (bbt, &bbt->extents)) { + if (bbt->left == NULL) { + bbt->left = bbtree_new (&bbt->extents, bbt->chain); + if (unlikely (bbt->left == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + bbtree_add (bbt->left, bbt->chain, &bbt->extents); + } else { + if (bbt->right == NULL) { + bbt->right = bbtree_new (&bbt->extents, bbt->chain); + if (unlikely (bbt->right == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + bbtree_add (bbt->right, bbt->chain, &bbt->extents); + } + + bbt->chain = NULL; + } + + bbt->extents.p1.x = MIN (bbt->extents.p1.x, box->p1.x); + bbt->extents.p1.y = MIN (bbt->extents.p1.y, box->p1.y); + bbt->extents.p2.x = MAX (bbt->extents.p2.x, box->p2.x); + bbt->extents.p2.y = MAX (bbt->extents.p2.y, box->p2.y); + } + + if (box->p1.x == bbt->extents.p1.x && box->p1.y == bbt->extents.p1.y && + box->p2.x == bbt->extents.p2.x && box->p2.y == bbt->extents.p2.y) + { + cairo_command_header_t *last = header; + while (last->chain) /* expected to be infrequent */ + last = last->chain; + last->chain = bbt->chain; + bbt->chain = header; + return CAIRO_STATUS_SUCCESS; + } + + if (bbtree_left_or_right (bbt, box)) { + if (bbt->left == NULL) { + bbt->left = bbtree_new (box, header); + if (unlikely (bbt->left == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + return bbtree_add (bbt->left, header, box); + } else { + if (bbt->right == NULL) { + bbt->right = bbtree_new (box, header); + if (unlikely (bbt->right == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + return bbtree_add (bbt->right, header, box); + } + + return CAIRO_STATUS_SUCCESS; +} + +static void bbtree_del (struct bbtree *bbt) +{ + if (bbt->left) + bbtree_del (bbt->left); + if (bbt->right) + bbtree_del (bbt->right); + + free (bbt); +} + +static cairo_bool_t box_outside (const cairo_box_t *a, const cairo_box_t *b) +{ + return + a->p1.x >= b->p2.x || a->p1.y >= b->p2.y || + a->p2.x <= b->p1.x || a->p2.y <= b->p1.y; +} + +static void +bbtree_foreach_mark_visible (struct bbtree *bbt, + const cairo_box_t *box, + unsigned int **indices) +{ + cairo_command_header_t *chain; + + for (chain = bbt->chain; chain; chain = chain->chain) + *(*indices)++ = chain->index; + + if (bbt->left && ! box_outside (box, &bbt->left->extents)) + bbtree_foreach_mark_visible (bbt->left, box, indices); + if (bbt->right && ! box_outside (box, &bbt->right->extents)) + bbtree_foreach_mark_visible (bbt->right, box, indices); +} + +static inline int intcmp (const unsigned int a, const unsigned int b) +{ + return a - b; +} +CAIRO_COMBSORT_DECLARE (sort_indices, unsigned int, intcmp) + +static inline int sizecmp (unsigned int a, unsigned int b, cairo_command_header_t **elements) +{ + const cairo_rectangle_int_t *r; + + r = &elements[a]->extents; + a = r->width * r->height; + + r = &elements[b]->extents; + b = r->width * r->height; + + return b - a; +} +CAIRO_COMBSORT_DECLARE_WITH_DATA (sort_commands, unsigned int, sizecmp) + +static void +_cairo_recording_surface_destroy_bbtree (cairo_recording_surface_t *surface) +{ + cairo_command_t **elements; + int i, num_elements; + + if (surface->bbtree.chain == INVALID_CHAIN) + return; + + if (surface->bbtree.left) { + bbtree_del (surface->bbtree.left); + surface->bbtree.left = NULL; + } + if (surface->bbtree.right) { + bbtree_del (surface->bbtree.right); + surface->bbtree.right = NULL; + } + + elements = _cairo_array_index (&surface->commands, 0); + num_elements = surface->commands.num_elements; + for (i = 0; i < num_elements; i++) + elements[i]->header.chain = NULL; + + surface->bbtree.chain = INVALID_CHAIN; +} + +static cairo_status_t +_cairo_recording_surface_create_bbtree (cairo_recording_surface_t *surface) +{ + cairo_command_t **elements = _cairo_array_index (&surface->commands, 0); + unsigned int *indices; + cairo_status_t status; + unsigned int i, count; + + count = surface->commands.num_elements; + if (count > surface->num_indices) { + free (surface->indices); + surface->indices = _cairo_malloc_ab (count, sizeof (int)); + if (unlikely (surface->indices == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + surface->num_indices = count; + } + + indices = surface->indices; + for (i = 0; i < count; i++) + indices[i] = i; + + sort_commands (indices, count, elements); + + bbtree_init (&surface->bbtree, &elements[indices[0]]->header); + for (i = 1; i < count; i++) { + cairo_command_header_t *header = &elements[indices[i]]->header; + cairo_box_t box; + + _cairo_box_from_rectangle (&box, &header->extents); + status = bbtree_add (&surface->bbtree, header, &box); + if (unlikely (status)) + goto cleanup; + } + + return CAIRO_STATUS_SUCCESS; + +cleanup: + bbtree_del (&surface->bbtree); + return status; +} + +/** + * cairo_recording_surface_create: + * @content: the content of the recording surface + * @extents: the extents to record in pixels, can be %NULL to record + * unbounded operations. + * + * Creates a recording-surface which can be used to record all drawing operations + * at the highest level (that is, the level of paint, mask, stroke, fill + * and show_text_glyphs). The recording surface can then be "replayed" against + * any target surface by using it as a source to drawing operations. + * + * The recording phase of the recording surface is careful to snapshot all + * necessary objects (paths, patterns, etc.), in order to achieve + * accurate replay. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * Since: 1.10 + **/ +cairo_surface_t * +cairo_recording_surface_create (cairo_content_t content, + const cairo_rectangle_t *extents) +{ + cairo_recording_surface_t *surface; + + surface = malloc (sizeof (cairo_recording_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &cairo_recording_surface_backend, + NULL, /* device */ + content); + + + surface->unbounded = TRUE; + + /* unbounded -> 'infinite' extents */ + if (extents != NULL) { + surface->extents_pixels = *extents; + + /* XXX check for overflow */ + surface->extents.x = floor (extents->x); + surface->extents.y = floor (extents->y); + surface->extents.width = ceil (extents->x + extents->width) - surface->extents.x; + surface->extents.height = ceil (extents->y + extents->height) - surface->extents.y; + + surface->unbounded = FALSE; + } + + _cairo_array_init (&surface->commands, sizeof (cairo_command_t *)); + + surface->base.is_clear = TRUE; + + surface->bbtree.left = surface->bbtree.right = NULL; + surface->bbtree.chain = INVALID_CHAIN; + + surface->indices = NULL; + surface->num_indices = 0; + surface->optimize_clears = TRUE; + surface->has_bilevel_alpha = FALSE; + surface->has_only_op_over = FALSE; + + return &surface->base; +} +slim_hidden_def (cairo_recording_surface_create); + +static cairo_surface_t * +_cairo_recording_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_rectangle_t extents; + extents.x = extents.y = 0; + extents.width = width; + extents.height = height; + return cairo_recording_surface_create (content, &extents); +} + +static cairo_status_t +_cairo_recording_surface_finish (void *abstract_surface) +{ + cairo_recording_surface_t *surface = abstract_surface; + cairo_command_t **elements; + int i, num_elements; + + num_elements = surface->commands.num_elements; + elements = _cairo_array_index (&surface->commands, 0); + for (i = 0; i < num_elements; i++) { + cairo_command_t *command = elements[i]; + + switch (command->header.type) { + case CAIRO_COMMAND_PAINT: + _cairo_pattern_fini (&command->paint.source.base); + break; + + case CAIRO_COMMAND_MASK: + _cairo_pattern_fini (&command->mask.source.base); + _cairo_pattern_fini (&command->mask.mask.base); + break; + + case CAIRO_COMMAND_STROKE: + _cairo_pattern_fini (&command->stroke.source.base); + _cairo_path_fixed_fini (&command->stroke.path); + _cairo_stroke_style_fini (&command->stroke.style); + break; + + case CAIRO_COMMAND_FILL: + _cairo_pattern_fini (&command->fill.source.base); + _cairo_path_fixed_fini (&command->fill.path); + break; + + case CAIRO_COMMAND_SHOW_TEXT_GLYPHS: + _cairo_pattern_fini (&command->show_text_glyphs.source.base); + free (command->show_text_glyphs.utf8); + free (command->show_text_glyphs.glyphs); + free (command->show_text_glyphs.clusters); + cairo_scaled_font_destroy (command->show_text_glyphs.scaled_font); + break; + + default: + ASSERT_NOT_REACHED; + } + + _cairo_clip_destroy (command->header.clip); + free (command); + } + + _cairo_array_fini (&surface->commands); + + if (surface->bbtree.left) + bbtree_del (surface->bbtree.left); + if (surface->bbtree.right) + bbtree_del (surface->bbtree.right); + + free (surface->indices); + + return CAIRO_STATUS_SUCCESS; +} + +struct proxy { + cairo_surface_t base; + cairo_surface_t *image; +}; + +static cairo_status_t +proxy_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + struct proxy *proxy = abstract_surface; + return _cairo_surface_acquire_source_image (proxy->image, image_out, image_extra); +} + +static void +proxy_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + struct proxy *proxy = abstract_surface; + _cairo_surface_release_source_image (proxy->image, image, image_extra); +} + +static cairo_status_t +proxy_finish (void *abstract_surface) +{ + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t proxy_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_NULL, + proxy_finish, + NULL, + + NULL, /* create similar */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + proxy_acquire_source_image, + proxy_release_source_image, +}; + +static cairo_surface_t * +attach_proxy (cairo_surface_t *source, + cairo_surface_t *image) +{ + struct proxy *proxy; + + proxy = malloc (sizeof (*proxy)); + if (unlikely (proxy == NULL)) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_surface_init (&proxy->base, &proxy_backend, NULL, image->content); + + proxy->image = image; + _cairo_surface_attach_snapshot (source, &proxy->base, NULL); + + return &proxy->base; +} + +static void +detach_proxy (cairo_surface_t *source, + cairo_surface_t *proxy) +{ + cairo_surface_finish (proxy); + cairo_surface_destroy (proxy); +} + +static cairo_surface_t * +get_proxy (cairo_surface_t *proxy) +{ + return ((struct proxy *)proxy)->image; +} + +static cairo_status_t +_cairo_recording_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_recording_surface_t *surface = abstract_surface; + cairo_surface_t *image, *proxy; + cairo_status_t status; + + proxy = _cairo_surface_has_snapshot (abstract_surface, &proxy_backend); + if (proxy != NULL) { + *image_out = (cairo_image_surface_t *) + cairo_surface_reference (get_proxy (proxy)); + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; + } + + assert (! surface->unbounded); + image = _cairo_image_surface_create_with_content (surface->base.content, + surface->extents.width, + surface->extents.height); + if (unlikely (image->status)) + return image->status; + + /* Handle recursion by returning future reads from the current image */ + proxy = attach_proxy (abstract_surface, image); + status = _cairo_recording_surface_replay (&surface->base, image); + detach_proxy (abstract_surface, proxy); + + if (unlikely (status)) { + cairo_surface_destroy (image); + return status; + } + + *image_out = (cairo_image_surface_t *) image; + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_recording_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_status_t +_command_init (cairo_recording_surface_t *surface, + cairo_command_header_t *command, + cairo_command_type_t type, + cairo_operator_t op, + cairo_composite_rectangles_t *composite) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + command->type = type; + command->op = op; + command->region = CAIRO_RECORDING_REGION_ALL; + + command->extents = composite->unbounded; + command->chain = NULL; + command->index = surface->commands.num_elements; + + /* steal the clip */ + command->clip = NULL; + if (! _cairo_composite_rectangles_can_reduce_clip (composite, + composite->clip)) + { + command->clip = composite->clip; + composite->clip = NULL; + } + + return status; +} + +static void +_cairo_recording_surface_break_self_copy_loop (cairo_recording_surface_t *surface) +{ + cairo_surface_flush (&surface->base); +} + +static cairo_status_t +_cairo_recording_surface_commit (cairo_recording_surface_t *surface, + cairo_command_header_t *command) +{ + _cairo_recording_surface_break_self_copy_loop (surface); + return _cairo_array_append (&surface->commands, &command); +} + +static void +_cairo_recording_surface_reset (cairo_recording_surface_t *surface) +{ + /* Reset the commands and temporaries */ + _cairo_recording_surface_finish (surface); + + surface->bbtree.left = surface->bbtree.right = NULL; + surface->bbtree.chain = INVALID_CHAIN; + + surface->indices = NULL; + surface->num_indices = 0; + + _cairo_array_init (&surface->commands, sizeof (cairo_command_t *)); +} + +static cairo_bool_t +is_identity_recording_pattern (const cairo_pattern_t *pattern) +{ + cairo_surface_t *surface; + + if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) + return FALSE; + + if (!_cairo_matrix_is_identity(&pattern->matrix)) + return FALSE; + + surface = ((cairo_surface_pattern_t *)pattern)->surface; + return surface->backend->type == CAIRO_SURFACE_TYPE_RECORDING; +} + +static cairo_int_status_t +_cairo_recording_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_recording_surface_t *surface = abstract_surface; + cairo_command_paint_t *command; + cairo_composite_rectangles_t composite; + + TRACE ((stderr, "%s: surface=%d\n", __FUNCTION__, surface->base.unique_id)); + + if (op == CAIRO_OPERATOR_CLEAR && clip == NULL) { + if (surface->optimize_clears) { + _cairo_recording_surface_reset (surface); + return CAIRO_STATUS_SUCCESS; + } + } + + if (clip == NULL && surface->optimize_clears && + (op == CAIRO_OPERATOR_SOURCE || + (op == CAIRO_OPERATOR_OVER && + (surface->base.is_clear || _cairo_pattern_is_opaque_solid (source))))) + { + _cairo_recording_surface_reset (surface); + if (is_identity_recording_pattern (source)) { + cairo_surface_t *src = ((cairo_surface_pattern_t *)source)->surface; + return _cairo_recording_surface_replay (src, &surface->base); + } + } + + status = _cairo_composite_rectangles_init_for_paint (&composite, + &surface->base, + op, source, + clip); + if (unlikely (status)) + return status; + + command = malloc (sizeof (cairo_command_paint_t)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_COMPOSITE; + } + + status = _command_init (surface, + &command->header, CAIRO_COMMAND_PAINT, op, + &composite); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_pattern_init_snapshot (&command->source.base, source); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto CLEANUP_SOURCE; + + _cairo_recording_surface_destroy_bbtree (surface); + + _cairo_composite_rectangles_fini (&composite); + return CAIRO_STATUS_SUCCESS; + + CLEANUP_SOURCE: + _cairo_pattern_fini (&command->source.base); + CLEANUP_COMMAND: + _cairo_clip_destroy (command->header.clip); + free (command); +CLEANUP_COMPOSITE: + _cairo_composite_rectangles_fini (&composite); + return status; +} + +static cairo_int_status_t +_cairo_recording_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_recording_surface_t *surface = abstract_surface; + cairo_command_mask_t *command; + cairo_composite_rectangles_t composite; + + TRACE ((stderr, "%s: surface=%d\n", __FUNCTION__, surface->base.unique_id)); + + status = _cairo_composite_rectangles_init_for_mask (&composite, + &surface->base, + op, source, mask, + clip); + if (unlikely (status)) + return status; + + command = malloc (sizeof (cairo_command_mask_t)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_COMPOSITE; + } + + status = _command_init (surface, + &command->header, CAIRO_COMMAND_MASK, op, + &composite); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_pattern_init_snapshot (&command->source.base, source); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_pattern_init_snapshot (&command->mask.base, mask); + if (unlikely (status)) + goto CLEANUP_SOURCE; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto CLEANUP_MASK; + + _cairo_recording_surface_destroy_bbtree (surface); + + _cairo_composite_rectangles_fini (&composite); + return CAIRO_STATUS_SUCCESS; + + CLEANUP_MASK: + _cairo_pattern_fini (&command->mask.base); + CLEANUP_SOURCE: + _cairo_pattern_fini (&command->source.base); + CLEANUP_COMMAND: + _cairo_clip_destroy (command->header.clip); + free (command); +CLEANUP_COMPOSITE: + _cairo_composite_rectangles_fini (&composite); + return status; +} + +static cairo_int_status_t +_cairo_recording_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_recording_surface_t *surface = abstract_surface; + cairo_command_stroke_t *command; + cairo_composite_rectangles_t composite; + + TRACE ((stderr, "%s: surface=%d\n", __FUNCTION__, surface->base.unique_id)); + + status = _cairo_composite_rectangles_init_for_stroke (&composite, + &surface->base, + op, source, + path, style, ctm, + clip); + if (unlikely (status)) + return status; + + command = malloc (sizeof (cairo_command_stroke_t)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_COMPOSITE; + } + + status = _command_init (surface, + &command->header, CAIRO_COMMAND_STROKE, op, + &composite); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_pattern_init_snapshot (&command->source.base, source); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_path_fixed_init_copy (&command->path, path); + if (unlikely (status)) + goto CLEANUP_SOURCE; + + status = _cairo_stroke_style_init_copy (&command->style, style); + if (unlikely (status)) + goto CLEANUP_PATH; + + command->ctm = *ctm; + command->ctm_inverse = *ctm_inverse; + command->tolerance = tolerance; + command->antialias = antialias; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto CLEANUP_STYLE; + + _cairo_recording_surface_destroy_bbtree (surface); + + _cairo_composite_rectangles_fini (&composite); + return CAIRO_STATUS_SUCCESS; + + CLEANUP_STYLE: + _cairo_stroke_style_fini (&command->style); + CLEANUP_PATH: + _cairo_path_fixed_fini (&command->path); + CLEANUP_SOURCE: + _cairo_pattern_fini (&command->source.base); + CLEANUP_COMMAND: + _cairo_clip_destroy (command->header.clip); + free (command); +CLEANUP_COMPOSITE: + _cairo_composite_rectangles_fini (&composite); + return status; +} + +static cairo_int_status_t +_cairo_recording_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_recording_surface_t *surface = abstract_surface; + cairo_command_fill_t *command; + cairo_composite_rectangles_t composite; + + TRACE ((stderr, "%s: surface=%d\n", __FUNCTION__, surface->base.unique_id)); + + status = _cairo_composite_rectangles_init_for_fill (&composite, + &surface->base, + op, source, path, + clip); + if (unlikely (status)) + return status; + + command = malloc (sizeof (cairo_command_fill_t)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_COMPOSITE; + } + + status =_command_init (surface, + &command->header, CAIRO_COMMAND_FILL, op, + &composite); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_pattern_init_snapshot (&command->source.base, source); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_path_fixed_init_copy (&command->path, path); + if (unlikely (status)) + goto CLEANUP_SOURCE; + + command->fill_rule = fill_rule; + command->tolerance = tolerance; + command->antialias = antialias; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto CLEANUP_PATH; + + _cairo_recording_surface_destroy_bbtree (surface); + + _cairo_composite_rectangles_fini (&composite); + return CAIRO_STATUS_SUCCESS; + + CLEANUP_PATH: + _cairo_path_fixed_fini (&command->path); + CLEANUP_SOURCE: + _cairo_pattern_fini (&command->source.base); + CLEANUP_COMMAND: + _cairo_clip_destroy (command->header.clip); + free (command); +CLEANUP_COMPOSITE: + _cairo_composite_rectangles_fini (&composite); + return status; +} + +static cairo_bool_t +_cairo_recording_surface_has_show_text_glyphs (void *abstract_surface) +{ + return TRUE; +} + +static cairo_int_status_t +_cairo_recording_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_recording_surface_t *surface = abstract_surface; + cairo_command_show_text_glyphs_t *command; + cairo_composite_rectangles_t composite; + + TRACE ((stderr, "%s: surface=%d\n", __FUNCTION__, surface->base.unique_id)); + + status = _cairo_composite_rectangles_init_for_glyphs (&composite, + &surface->base, + op, source, + scaled_font, + glyphs, num_glyphs, + clip, + NULL); + if (unlikely (status)) + return status; + + command = malloc (sizeof (cairo_command_show_text_glyphs_t)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_COMPOSITE; + } + + status = _command_init (surface, + &command->header, CAIRO_COMMAND_SHOW_TEXT_GLYPHS, + op, &composite); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + status = _cairo_pattern_init_snapshot (&command->source.base, source); + if (unlikely (status)) + goto CLEANUP_COMMAND; + + command->utf8 = NULL; + command->utf8_len = utf8_len; + command->glyphs = NULL; + command->num_glyphs = num_glyphs; + command->clusters = NULL; + command->num_clusters = num_clusters; + + if (utf8_len) { + command->utf8 = malloc (utf8_len); + if (unlikely (command->utf8 == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_ARRAYS; + } + memcpy (command->utf8, utf8, utf8_len); + } + if (num_glyphs) { + command->glyphs = _cairo_malloc_ab (num_glyphs, sizeof (glyphs[0])); + if (unlikely (command->glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_ARRAYS; + } + memcpy (command->glyphs, glyphs, sizeof (glyphs[0]) * num_glyphs); + } + if (num_clusters) { + command->clusters = _cairo_malloc_ab (num_clusters, sizeof (clusters[0])); + if (unlikely (command->clusters == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_ARRAYS; + } + memcpy (command->clusters, clusters, sizeof (clusters[0]) * num_clusters); + } + + command->cluster_flags = cluster_flags; + + command->scaled_font = cairo_scaled_font_reference (scaled_font); + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto CLEANUP_SCALED_FONT; + + _cairo_composite_rectangles_fini (&composite); + return CAIRO_STATUS_SUCCESS; + + CLEANUP_SCALED_FONT: + cairo_scaled_font_destroy (command->scaled_font); + CLEANUP_ARRAYS: + free (command->utf8); + free (command->glyphs); + free (command->clusters); + + _cairo_pattern_fini (&command->source.base); + CLEANUP_COMMAND: + _cairo_clip_destroy (command->header.clip); + free (command); +CLEANUP_COMPOSITE: + _cairo_composite_rectangles_fini (&composite); + return status; +} + +static void +_command_init_copy (cairo_recording_surface_t *surface, + cairo_command_header_t *dst, + const cairo_command_header_t *src) +{ + dst->type = src->type; + dst->op = src->op; + dst->region = CAIRO_RECORDING_REGION_ALL; + + dst->extents = src->extents; + dst->chain = NULL; + dst->index = surface->commands.num_elements; + + dst->clip = _cairo_clip_copy (src->clip); +} + +static cairo_status_t +_cairo_recording_surface_copy__paint (cairo_recording_surface_t *surface, + const cairo_command_t *src) +{ + cairo_command_paint_t *command; + cairo_status_t status; + + command = malloc (sizeof (*command)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err; + } + + _command_init_copy (surface, &command->header, &src->header); + + status = _cairo_pattern_init_copy (&command->source.base, + &src->paint.source.base); + if (unlikely (status)) + goto err_command; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto err_source; + + return CAIRO_STATUS_SUCCESS; + +err_source: + _cairo_pattern_fini (&command->source.base); +err_command: + free(command); +err: + return status; +} + +static cairo_status_t +_cairo_recording_surface_copy__mask (cairo_recording_surface_t *surface, + const cairo_command_t *src) +{ + cairo_command_mask_t *command; + cairo_status_t status; + + command = malloc (sizeof (*command)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err; + } + + _command_init_copy (surface, &command->header, &src->header); + + status = _cairo_pattern_init_copy (&command->source.base, + &src->mask.source.base); + if (unlikely (status)) + goto err_command; + + status = _cairo_pattern_init_copy (&command->mask.base, + &src->mask.source.base); + if (unlikely (status)) + goto err_source; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto err_mask; + + return CAIRO_STATUS_SUCCESS; + +err_mask: + _cairo_pattern_fini (&command->mask.base); +err_source: + _cairo_pattern_fini (&command->source.base); +err_command: + free(command); +err: + return status; +} + +static cairo_status_t +_cairo_recording_surface_copy__stroke (cairo_recording_surface_t *surface, + const cairo_command_t *src) +{ + cairo_command_stroke_t *command; + cairo_status_t status; + + command = malloc (sizeof (*command)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err; + } + + _command_init_copy (surface, &command->header, &src->header); + + status = _cairo_pattern_init_copy (&command->source.base, + &src->stroke.source.base); + if (unlikely (status)) + goto err_command; + + status = _cairo_path_fixed_init_copy (&command->path, &src->stroke.path); + if (unlikely (status)) + goto err_source; + + status = _cairo_stroke_style_init_copy (&command->style, + &src->stroke.style); + if (unlikely (status)) + goto err_path; + + command->ctm = src->stroke.ctm; + command->ctm_inverse = src->stroke.ctm_inverse; + command->tolerance = src->stroke.tolerance; + command->antialias = src->stroke.antialias; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto err_style; + + return CAIRO_STATUS_SUCCESS; + +err_style: + _cairo_stroke_style_fini (&command->style); +err_path: + _cairo_path_fixed_fini (&command->path); +err_source: + _cairo_pattern_fini (&command->source.base); +err_command: + free(command); +err: + return status; +} + +static cairo_status_t +_cairo_recording_surface_copy__fill (cairo_recording_surface_t *surface, + const cairo_command_t *src) +{ + cairo_command_fill_t *command; + cairo_status_t status; + + command = malloc (sizeof (*command)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err; + } + + _command_init_copy (surface, &command->header, &src->header); + + status = _cairo_pattern_init_copy (&command->source.base, + &src->fill.source.base); + if (unlikely (status)) + goto err_command; + + status = _cairo_path_fixed_init_copy (&command->path, &src->fill.path); + if (unlikely (status)) + goto err_source; + + command->fill_rule = src->fill.fill_rule; + command->tolerance = src->fill.tolerance; + command->antialias = src->fill.antialias; + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto err_path; + + return CAIRO_STATUS_SUCCESS; + +err_path: + _cairo_path_fixed_fini (&command->path); +err_source: + _cairo_pattern_fini (&command->source.base); +err_command: + free(command); +err: + return status; +} + +static cairo_status_t +_cairo_recording_surface_copy__glyphs (cairo_recording_surface_t *surface, + const cairo_command_t *src) +{ + cairo_command_show_text_glyphs_t *command; + cairo_status_t status; + + command = malloc (sizeof (*command)); + if (unlikely (command == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err; + } + + _command_init_copy (surface, &command->header, &src->header); + + status = _cairo_pattern_init_copy (&command->source.base, + &src->show_text_glyphs.source.base); + if (unlikely (status)) + goto err_command; + + command->utf8 = NULL; + command->utf8_len = src->show_text_glyphs.utf8_len; + command->glyphs = NULL; + command->num_glyphs = src->show_text_glyphs.num_glyphs; + command->clusters = NULL; + command->num_clusters = src->show_text_glyphs.num_clusters; + + if (command->utf8_len) { + command->utf8 = malloc (command->utf8_len); + if (unlikely (command->utf8 == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err_arrays; + } + memcpy (command->utf8, src->show_text_glyphs.utf8, command->utf8_len); + } + if (command->num_glyphs) { + command->glyphs = _cairo_malloc_ab (command->num_glyphs, + sizeof (command->glyphs[0])); + if (unlikely (command->glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err_arrays; + } + memcpy (command->glyphs, src->show_text_glyphs.glyphs, + sizeof (command->glyphs[0]) * command->num_glyphs); + } + if (command->num_clusters) { + command->clusters = _cairo_malloc_ab (command->num_clusters, + sizeof (command->clusters[0])); + if (unlikely (command->clusters == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto err_arrays; + } + memcpy (command->clusters, src->show_text_glyphs.clusters, + sizeof (command->clusters[0]) * command->num_clusters); + } + + command->cluster_flags = src->show_text_glyphs.cluster_flags; + + command->scaled_font = + cairo_scaled_font_reference (src->show_text_glyphs.scaled_font); + + status = _cairo_recording_surface_commit (surface, &command->header); + if (unlikely (status)) + goto err_arrays; + + return CAIRO_STATUS_SUCCESS; + +err_arrays: + free (command->utf8); + free (command->glyphs); + free (command->clusters); + _cairo_pattern_fini (&command->source.base); +err_command: + free(command); +err: + return status; +} + +static cairo_status_t +_cairo_recording_surface_copy (cairo_recording_surface_t *dst, + cairo_recording_surface_t *src) +{ + cairo_command_t **elements; + int i, num_elements; + cairo_status_t status; + + elements = _cairo_array_index (&src->commands, 0); + num_elements = src->commands.num_elements; + for (i = 0; i < num_elements; i++) { + const cairo_command_t *command = elements[i]; + + switch (command->header.type) { + case CAIRO_COMMAND_PAINT: + status = _cairo_recording_surface_copy__paint (dst, command); + break; + + case CAIRO_COMMAND_MASK: + status = _cairo_recording_surface_copy__mask (dst, command); + break; + + case CAIRO_COMMAND_STROKE: + status = _cairo_recording_surface_copy__stroke (dst, command); + break; + + case CAIRO_COMMAND_FILL: + status = _cairo_recording_surface_copy__fill (dst, command); + break; + + case CAIRO_COMMAND_SHOW_TEXT_GLYPHS: + status = _cairo_recording_surface_copy__glyphs (dst, command); + break; + + default: + ASSERT_NOT_REACHED; + } + + if (unlikely (status)) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_recording_surface_snapshot: + * @surface: a #cairo_surface_t which must be a recording surface + * + * Make an immutable copy of @surface. It is an error to call a + * surface-modifying function on the result of this function. + * + * The caller owns the return value and should call + * cairo_surface_destroy() when finished with it. This function will not + * return %NULL, but will return a nil surface instead. + * + * Return value: The snapshot surface. + **/ +static cairo_surface_t * +_cairo_recording_surface_snapshot (void *abstract_other) +{ + cairo_recording_surface_t *other = abstract_other; + cairo_recording_surface_t *surface; + cairo_status_t status; + + surface = malloc (sizeof (cairo_recording_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &cairo_recording_surface_backend, + NULL, /* device */ + other->base.content); + + surface->extents_pixels = other->extents_pixels; + surface->extents = other->extents; + surface->unbounded = other->unbounded; + + surface->base.is_clear = other->base.is_clear; + + surface->bbtree.left = surface->bbtree.right = NULL; + surface->bbtree.chain = INVALID_CHAIN; + + surface->indices = NULL; + surface->num_indices = 0; + surface->optimize_clears = TRUE; + + _cairo_array_init (&surface->commands, sizeof (cairo_command_t *)); + status = _cairo_recording_surface_copy (surface, other); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return _cairo_surface_create_in_error (status); + } + + return &surface->base; +} + +static cairo_bool_t +_cairo_recording_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_recording_surface_t *surface = abstract_surface; + + if (surface->unbounded) + return FALSE; + + *rectangle = surface->extents; + return TRUE; +} + +static const cairo_surface_backend_t cairo_recording_surface_backend = { + CAIRO_SURFACE_TYPE_RECORDING, + _cairo_recording_surface_finish, + + _cairo_default_context_create, + + _cairo_recording_surface_create_similar, + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + _cairo_recording_surface_acquire_source_image, + _cairo_recording_surface_release_source_image, + _cairo_recording_surface_snapshot, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_recording_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + /* Here are the 5 basic drawing operations, (which are in some + * sense the only things that cairo_recording_surface should need to + * implement). However, we implement the more generic show_text_glyphs + * instead of show_glyphs. One or the other is eough. */ + + _cairo_recording_surface_paint, + _cairo_recording_surface_mask, + _cairo_recording_surface_stroke, + _cairo_recording_surface_fill, + NULL, /* fill-stroke */ + NULL, + _cairo_recording_surface_has_show_text_glyphs, + _cairo_recording_surface_show_text_glyphs, +}; + +cairo_int_status_t +_cairo_recording_surface_get_path (cairo_surface_t *abstract_surface, + cairo_path_fixed_t *path) +{ + cairo_recording_surface_t *surface; + cairo_command_t **elements; + int i, num_elements; + cairo_int_status_t status; + + if (unlikely (abstract_surface->status)) + return abstract_surface->status; + + surface = (cairo_recording_surface_t *) abstract_surface; + status = CAIRO_STATUS_SUCCESS; + + num_elements = surface->commands.num_elements; + elements = _cairo_array_index (&surface->commands, 0); + for (i = 0; i < num_elements; i++) { + cairo_command_t *command = elements[i]; + + switch (command->header.type) { + case CAIRO_COMMAND_PAINT: + case CAIRO_COMMAND_MASK: + status = CAIRO_INT_STATUS_UNSUPPORTED; + break; + + case CAIRO_COMMAND_STROKE: + { + cairo_traps_t traps; + + _cairo_traps_init (&traps); + + /* XXX call cairo_stroke_to_path() when that is implemented */ + status = _cairo_path_fixed_stroke_polygon_to_traps (&command->stroke.path, + &command->stroke.style, + &command->stroke.ctm, + &command->stroke.ctm_inverse, + command->stroke.tolerance, + &traps); + + if (status == CAIRO_INT_STATUS_SUCCESS) + status = _cairo_traps_path (&traps, path); + + _cairo_traps_fini (&traps); + break; + } + case CAIRO_COMMAND_FILL: + { + status = _cairo_path_fixed_append (path, + &command->fill.path, + 0, 0); + break; + } + case CAIRO_COMMAND_SHOW_TEXT_GLYPHS: + { + status = _cairo_scaled_font_glyph_path (command->show_text_glyphs.scaled_font, + command->show_text_glyphs.glyphs, + command->show_text_glyphs.num_glyphs, + path); + break; + } + + default: + ASSERT_NOT_REACHED; + } + + if (unlikely (status)) + break; + } + + return status; +} + +static int +_cairo_recording_surface_get_visible_commands (cairo_recording_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + unsigned int num_visible, *indices; + cairo_box_t box; + + if (surface->commands.num_elements == 0) + return 0; + + _cairo_box_from_rectangle (&box, extents); + + if (surface->bbtree.chain == INVALID_CHAIN) + _cairo_recording_surface_create_bbtree (surface); + + indices = surface->indices; + bbtree_foreach_mark_visible (&surface->bbtree, &box, &indices); + num_visible = indices - surface->indices; + if (num_visible > 1) + sort_indices (surface->indices, num_visible); + + return num_visible; +} + +static void +_cairo_recording_surface_merge_source_attributes (cairo_recording_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source) +{ + if (op != CAIRO_OPERATOR_OVER) + surface->has_only_op_over = FALSE; + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surf_pat = (cairo_surface_pattern_t *) source; + cairo_surface_t *surf = surf_pat->surface; + cairo_surface_t *free_me = NULL; + + if (_cairo_surface_is_snapshot (surf)) + free_me = surf = _cairo_surface_snapshot_get_target (surf); + + if (surf->type == CAIRO_SURFACE_TYPE_RECORDING) { + cairo_recording_surface_t *rec_surf = (cairo_recording_surface_t *) surf; + + if (! _cairo_recording_surface_has_only_bilevel_alpha (rec_surf)) + surface->has_bilevel_alpha = FALSE; + + if (! _cairo_recording_surface_has_only_op_over (rec_surf)) + surface->has_only_op_over = FALSE; + + } else if (surf->type == CAIRO_SURFACE_TYPE_IMAGE) { + cairo_image_surface_t *img_surf = (cairo_image_surface_t *) surf; + + if (_cairo_image_analyze_transparency (img_surf) == CAIRO_IMAGE_HAS_ALPHA) + surface->has_bilevel_alpha = FALSE; + + } else { + if (!_cairo_pattern_is_clear (source) && !_cairo_pattern_is_opaque (source, NULL)) + surface->has_bilevel_alpha = FALSE; + } + + cairo_surface_destroy (free_me); + return; + + } else if (source->type == CAIRO_PATTERN_TYPE_RASTER_SOURCE) { + cairo_surface_t *image; + cairo_surface_t *raster; + + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + raster = _cairo_raster_source_pattern_acquire (source, image, NULL); + cairo_surface_destroy (image); + if (raster) { + if (raster->type == CAIRO_SURFACE_TYPE_IMAGE) { + if (_cairo_image_analyze_transparency ((cairo_image_surface_t *)raster) == CAIRO_IMAGE_HAS_ALPHA) + surface->has_bilevel_alpha = FALSE; + } + + _cairo_raster_source_pattern_release (source, raster); + if (raster->type == CAIRO_SURFACE_TYPE_IMAGE) + return; + } + } + + if (!_cairo_pattern_is_clear (source) && !_cairo_pattern_is_opaque (source, NULL)) + surface->has_bilevel_alpha = FALSE; +} + +static cairo_status_t +_cairo_recording_surface_replay_internal (cairo_recording_surface_t *surface, + const cairo_rectangle_int_t *surface_extents, + const cairo_matrix_t *surface_transform, + cairo_surface_t *target, + const cairo_clip_t *target_clip, + cairo_recording_replay_type_t type, + cairo_recording_region_type_t region) +{ + cairo_surface_wrapper_t wrapper; + cairo_command_t **elements; + cairo_bool_t replay_all = + type == CAIRO_RECORDING_REPLAY && + region == CAIRO_RECORDING_REGION_ALL; + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + cairo_rectangle_int_t extents; + cairo_bool_t use_indices = FALSE; + const cairo_rectangle_int_t *r; + unsigned int i, num_elements; + + if (unlikely (surface->base.status)) + return surface->base.status; + + if (unlikely (target->status)) + return target->status; + + if (unlikely (surface->base.finished)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + if (surface->base.is_clear) + return CAIRO_STATUS_SUCCESS; + + assert (_cairo_surface_is_recording (&surface->base)); + + _cairo_surface_wrapper_init (&wrapper, target); + if (surface_extents) + _cairo_surface_wrapper_intersect_extents (&wrapper, surface_extents); + r = &_cairo_unbounded_rectangle; + if (! surface->unbounded) { + _cairo_surface_wrapper_intersect_extents (&wrapper, &surface->extents); + r = &surface->extents; + } + _cairo_surface_wrapper_set_inverse_transform (&wrapper, surface_transform); + _cairo_surface_wrapper_set_clip (&wrapper, target_clip); + + /* Compute the extents of the target clip in recorded device space */ + if (! _cairo_surface_wrapper_get_target_extents (&wrapper, &extents)) + goto done; + + surface->has_bilevel_alpha = TRUE; + surface->has_only_op_over = TRUE; + + num_elements = surface->commands.num_elements; + elements = _cairo_array_index (&surface->commands, 0); + if (extents.width < r->width || extents.height < r->height) { + num_elements = + _cairo_recording_surface_get_visible_commands (surface, &extents); + use_indices = num_elements != surface->commands.num_elements; + } + + for (i = 0; i < num_elements; i++) { + cairo_command_t *command = elements[use_indices ? surface->indices[i] : i]; + + if (! replay_all && command->header.region != region) + continue; + + if (! _cairo_rectangle_intersects (&extents, &command->header.extents)) + continue; + + switch (command->header.type) { + case CAIRO_COMMAND_PAINT: + status = _cairo_surface_wrapper_paint (&wrapper, + command->header.op, + &command->paint.source.base, + command->header.clip); + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->paint.source.base); + } + break; + + case CAIRO_COMMAND_MASK: + status = _cairo_surface_wrapper_mask (&wrapper, + command->header.op, + &command->mask.source.base, + &command->mask.mask.base, + command->header.clip); + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->mask.source.base); + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->mask.mask.base); + } + break; + + case CAIRO_COMMAND_STROKE: + status = _cairo_surface_wrapper_stroke (&wrapper, + command->header.op, + &command->stroke.source.base, + &command->stroke.path, + &command->stroke.style, + &command->stroke.ctm, + &command->stroke.ctm_inverse, + command->stroke.tolerance, + command->stroke.antialias, + command->header.clip); + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->stroke.source.base); + } + break; + + case CAIRO_COMMAND_FILL: + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_surface_wrapper_has_fill_stroke (&wrapper)) { + cairo_command_t *stroke_command; + + stroke_command = NULL; + if (type != CAIRO_RECORDING_CREATE_REGIONS && i < num_elements - 1) + stroke_command = elements[i + 1]; + + if (stroke_command != NULL && + type == CAIRO_RECORDING_REPLAY && + region != CAIRO_RECORDING_REGION_ALL) + { + if (stroke_command->header.region != region) + stroke_command = NULL; + } + + if (stroke_command != NULL && + stroke_command->header.type == CAIRO_COMMAND_STROKE && + _cairo_path_fixed_equal (&command->fill.path, + &stroke_command->stroke.path) && + _cairo_clip_equal (command->header.clip, + stroke_command->header.clip)) + { + status = _cairo_surface_wrapper_fill_stroke (&wrapper, + command->header.op, + &command->fill.source.base, + command->fill.fill_rule, + command->fill.tolerance, + command->fill.antialias, + &command->fill.path, + stroke_command->header.op, + &stroke_command->stroke.source.base, + &stroke_command->stroke.style, + &stroke_command->stroke.ctm, + &stroke_command->stroke.ctm_inverse, + stroke_command->stroke.tolerance, + stroke_command->stroke.antialias, + command->header.clip); + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->fill.source.base); + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->stroke.source.base); + } + i++; + } + } + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_surface_wrapper_fill (&wrapper, + command->header.op, + &command->fill.source.base, + &command->fill.path, + command->fill.fill_rule, + command->fill.tolerance, + command->fill.antialias, + command->header.clip); + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->fill.source.base); + } + } + break; + + case CAIRO_COMMAND_SHOW_TEXT_GLYPHS: + status = _cairo_surface_wrapper_show_text_glyphs (&wrapper, + command->header.op, + &command->show_text_glyphs.source.base, + command->show_text_glyphs.utf8, command->show_text_glyphs.utf8_len, + command->show_text_glyphs.glyphs, command->show_text_glyphs.num_glyphs, + command->show_text_glyphs.clusters, command->show_text_glyphs.num_clusters, + command->show_text_glyphs.cluster_flags, + command->show_text_glyphs.scaled_font, + command->header.clip); + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + _cairo_recording_surface_merge_source_attributes (surface, + command->header.op, + &command->show_text_glyphs.source.base); + } + break; + + default: + ASSERT_NOT_REACHED; + } + + if (type == CAIRO_RECORDING_CREATE_REGIONS) { + if (status == CAIRO_INT_STATUS_SUCCESS) { + command->header.region = CAIRO_RECORDING_REGION_NATIVE; + } else if (status == CAIRO_INT_STATUS_IMAGE_FALLBACK) { + command->header.region = CAIRO_RECORDING_REGION_IMAGE_FALLBACK; + status = CAIRO_INT_STATUS_SUCCESS; + } else { + assert (_cairo_int_status_is_error (status)); + } + } + + if (unlikely (status)) + break; + } + +done: + _cairo_surface_wrapper_fini (&wrapper); + return _cairo_surface_set_error (&surface->base, status); +} + +cairo_status_t +_cairo_recording_surface_replay_one (cairo_recording_surface_t *surface, + long unsigned index, + cairo_surface_t *target) +{ + cairo_surface_wrapper_t wrapper; + cairo_command_t **elements, *command; + cairo_int_status_t status; + + if (unlikely (surface->base.status)) + return surface->base.status; + + if (unlikely (target->status)) + return target->status; + + if (unlikely (surface->base.finished)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + assert (_cairo_surface_is_recording (&surface->base)); + + /* XXX + * Use a surface wrapper because we may want to do transformed + * replay in the future. + */ + _cairo_surface_wrapper_init (&wrapper, target); + + if (index > surface->commands.num_elements) + return _cairo_error (CAIRO_STATUS_READ_ERROR); + + elements = _cairo_array_index (&surface->commands, 0); + command = elements[index]; + switch (command->header.type) { + case CAIRO_COMMAND_PAINT: + status = _cairo_surface_wrapper_paint (&wrapper, + command->header.op, + &command->paint.source.base, + command->header.clip); + break; + + case CAIRO_COMMAND_MASK: + status = _cairo_surface_wrapper_mask (&wrapper, + command->header.op, + &command->mask.source.base, + &command->mask.mask.base, + command->header.clip); + break; + + case CAIRO_COMMAND_STROKE: + status = _cairo_surface_wrapper_stroke (&wrapper, + command->header.op, + &command->stroke.source.base, + &command->stroke.path, + &command->stroke.style, + &command->stroke.ctm, + &command->stroke.ctm_inverse, + command->stroke.tolerance, + command->stroke.antialias, + command->header.clip); + break; + + case CAIRO_COMMAND_FILL: + status = _cairo_surface_wrapper_fill (&wrapper, + command->header.op, + &command->fill.source.base, + &command->fill.path, + command->fill.fill_rule, + command->fill.tolerance, + command->fill.antialias, + command->header.clip); + break; + + case CAIRO_COMMAND_SHOW_TEXT_GLYPHS: + status = _cairo_surface_wrapper_show_text_glyphs (&wrapper, + command->header.op, + &command->show_text_glyphs.source.base, + command->show_text_glyphs.utf8, command->show_text_glyphs.utf8_len, + command->show_text_glyphs.glyphs, command->show_text_glyphs.num_glyphs, + command->show_text_glyphs.clusters, command->show_text_glyphs.num_clusters, + command->show_text_glyphs.cluster_flags, + command->show_text_glyphs.scaled_font, + command->header.clip); + break; + + default: + ASSERT_NOT_REACHED; + } + + _cairo_surface_wrapper_fini (&wrapper); + return _cairo_surface_set_error (&surface->base, status); +} +/** + * _cairo_recording_surface_replay: + * @surface: the #cairo_recording_surface_t + * @target: a target #cairo_surface_t onto which to replay the operations + * @width_pixels: width of the surface, in pixels + * @height_pixels: height of the surface, in pixels + * + * A recording surface can be "replayed" against any target surface, + * after which the results in target will be identical to the results + * that would have been obtained if the original operations applied to + * the recording surface had instead been applied to the target surface. + **/ +cairo_status_t +_cairo_recording_surface_replay (cairo_surface_t *surface, + cairo_surface_t *target) +{ + return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, NULL, NULL, + target, NULL, + CAIRO_RECORDING_REPLAY, + CAIRO_RECORDING_REGION_ALL); +} + +cairo_status_t +_cairo_recording_surface_replay_with_clip (cairo_surface_t *surface, + const cairo_matrix_t *surface_transform, + cairo_surface_t *target, + const cairo_clip_t *target_clip) +{ + return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, NULL, surface_transform, + target, target_clip, + CAIRO_RECORDING_REPLAY, + CAIRO_RECORDING_REGION_ALL); +} + +/* Replay recording to surface. When the return status of each operation is + * one of %CAIRO_STATUS_SUCCESS, %CAIRO_INT_STATUS_UNSUPPORTED, or + * %CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY the status of each operation + * will be stored in the recording surface. Any other status will abort the + * replay and return the status. + */ +cairo_status_t +_cairo_recording_surface_replay_and_create_regions (cairo_surface_t *surface, + cairo_surface_t *target) +{ + return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, NULL, NULL, + target, NULL, + CAIRO_RECORDING_CREATE_REGIONS, + CAIRO_RECORDING_REGION_ALL); +} + +cairo_status_t +_cairo_recording_surface_replay_region (cairo_surface_t *surface, + const cairo_rectangle_int_t *surface_extents, + cairo_surface_t *target, + cairo_recording_region_type_t region) +{ + return _cairo_recording_surface_replay_internal ((cairo_recording_surface_t *) surface, + surface_extents, NULL, + target, NULL, + CAIRO_RECORDING_REPLAY, + region); +} + +static cairo_status_t +_recording_surface_get_ink_bbox (cairo_recording_surface_t *surface, + cairo_box_t *bbox, + const cairo_matrix_t *transform) +{ + cairo_surface_t *null_surface; + cairo_surface_t *analysis_surface; + cairo_status_t status; + + null_surface = _cairo_null_surface_create (surface->base.content); + analysis_surface = _cairo_analysis_surface_create (null_surface); + cairo_surface_destroy (null_surface); + + status = analysis_surface->status; + if (unlikely (status)) + return status; + + if (transform != NULL) + _cairo_analysis_surface_set_ctm (analysis_surface, transform); + + status = _cairo_recording_surface_replay (&surface->base, analysis_surface); + _cairo_analysis_surface_get_bounding_box (analysis_surface, bbox); + cairo_surface_destroy (analysis_surface); + + return status; +} + +/** + * cairo_recording_surface_ink_extents: + * @surface: a #cairo_recording_surface_t + * @x0: the x-coordinate of the top-left of the ink bounding box + * @y0: the y-coordinate of the top-left of the ink bounding box + * @width: the width of the ink bounding box + * @height: the height of the ink bounding box + * + * Measures the extents of the operations stored within the recording-surface. + * This is useful to compute the required size of an image surface (or + * equivalent) into which to replay the full sequence of drawing operations. + * + * Since: 1.10 + **/ +void +cairo_recording_surface_ink_extents (cairo_surface_t *surface, + double *x0, + double *y0, + double *width, + double *height) +{ + cairo_status_t status; + cairo_box_t bbox; + + memset (&bbox, 0, sizeof (bbox)); + + if (surface->status || ! _cairo_surface_is_recording (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + goto DONE; + } + + status = _recording_surface_get_ink_bbox ((cairo_recording_surface_t *) surface, + &bbox, + NULL); + if (unlikely (status)) + status = _cairo_surface_set_error (surface, status); + +DONE: + if (x0) + *x0 = _cairo_fixed_to_double (bbox.p1.x); + if (y0) + *y0 = _cairo_fixed_to_double (bbox.p1.y); + if (width) + *width = _cairo_fixed_to_double (bbox.p2.x - bbox.p1.x); + if (height) + *height = _cairo_fixed_to_double (bbox.p2.y - bbox.p1.y); +} + +cairo_status_t +_cairo_recording_surface_get_bbox (cairo_recording_surface_t *surface, + cairo_box_t *bbox, + const cairo_matrix_t *transform) +{ + if (! surface->unbounded) { + _cairo_box_from_rectangle (bbox, &surface->extents); + if (transform != NULL) + _cairo_matrix_transform_bounding_box_fixed (transform, bbox, NULL); + + return CAIRO_STATUS_SUCCESS; + } + + return _recording_surface_get_ink_bbox (surface, bbox, transform); +} + +cairo_status_t +_cairo_recording_surface_get_ink_bbox (cairo_recording_surface_t *surface, + cairo_box_t *bbox, + const cairo_matrix_t *transform) +{ + return _recording_surface_get_ink_bbox (surface, bbox, transform); +} + +/** + * cairo_recording_surface_get_extents: + * @surface: a #cairo_recording_surface_t + * @extents: the #cairo_rectangle_t to be assigned the extents + * + * Get the extents of the recording-surface. + * + * Return value: %TRUE if the surface is bounded, of recording type, and + * not in an error state, otherwise %FALSE + * + * Since: 1.12 + **/ +cairo_bool_t +cairo_recording_surface_get_extents (cairo_surface_t *surface, + cairo_rectangle_t *extents) +{ + cairo_recording_surface_t *record; + + if (surface->status || ! _cairo_surface_is_recording (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return FALSE; + } + + record = (cairo_recording_surface_t *)surface; + if (record->unbounded) + return FALSE; + + *extents = record->extents_pixels; + return TRUE; +} + +cairo_bool_t +_cairo_recording_surface_has_only_bilevel_alpha (cairo_recording_surface_t *surface) +{ + return surface->has_bilevel_alpha; +} + +cairo_bool_t +_cairo_recording_surface_has_only_op_over (cairo_recording_surface_t *surface) +{ + return surface->has_only_op_over; +} diff --git a/src/cairo-rectangle.c b/src/cairo-rectangle.c new file mode 100644 index 000000000..2d51d7b10 --- /dev/null +++ b/src/cairo-rectangle.c @@ -0,0 +1,299 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" + +const cairo_rectangle_int_t _cairo_empty_rectangle = { 0, 0, 0, 0 }; +const cairo_rectangle_int_t _cairo_unbounded_rectangle = { + CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN, + CAIRO_RECT_INT_MAX - CAIRO_RECT_INT_MIN, + CAIRO_RECT_INT_MAX - CAIRO_RECT_INT_MIN, +}; + +cairo_private void +_cairo_box_from_doubles (cairo_box_t *box, + double *x1, double *y1, + double *x2, double *y2) +{ + box->p1.x = _cairo_fixed_from_double (*x1); + box->p1.y = _cairo_fixed_from_double (*y1); + box->p2.x = _cairo_fixed_from_double (*x2); + box->p2.y = _cairo_fixed_from_double (*y2); +} + +cairo_private void +_cairo_box_to_doubles (const cairo_box_t *box, + double *x1, double *y1, + double *x2, double *y2) +{ + *x1 = _cairo_fixed_to_double (box->p1.x); + *y1 = _cairo_fixed_to_double (box->p1.y); + *x2 = _cairo_fixed_to_double (box->p2.x); + *y2 = _cairo_fixed_to_double (box->p2.y); +} + +void +_cairo_box_from_rectangle (cairo_box_t *box, + const cairo_rectangle_int_t *rect) +{ + box->p1.x = _cairo_fixed_from_int (rect->x); + box->p1.y = _cairo_fixed_from_int (rect->y); + box->p2.x = _cairo_fixed_from_int (rect->x + rect->width); + box->p2.y = _cairo_fixed_from_int (rect->y + rect->height); +} + +void +_cairo_boxes_get_extents (const cairo_box_t *boxes, + int num_boxes, + cairo_box_t *extents) +{ + assert (num_boxes > 0); + *extents = *boxes; + while (--num_boxes) + _cairo_box_add_box (extents, ++boxes); +} + +/* XXX We currently have a confusing mix of boxes and rectangles as + * exemplified by this function. A #cairo_box_t is a rectangular area + * represented by the coordinates of the upper left and lower right + * corners, expressed in fixed point numbers. A #cairo_rectangle_int_t is + * also a rectangular area, but represented by the upper left corner + * and the width and the height, as integer numbers. + * + * This function converts a #cairo_box_t to a #cairo_rectangle_int_t by + * increasing the area to the nearest integer coordinates. We should + * standardize on #cairo_rectangle_fixed_t and #cairo_rectangle_int_t, and + * this function could be renamed to the more reasonable + * _cairo_rectangle_fixed_round. + */ + +void +_cairo_box_round_to_rectangle (const cairo_box_t *box, + cairo_rectangle_int_t *rectangle) +{ + rectangle->x = _cairo_fixed_integer_floor (box->p1.x); + rectangle->y = _cairo_fixed_integer_floor (box->p1.y); + rectangle->width = _cairo_fixed_integer_ceil (box->p2.x) - rectangle->x; + rectangle->height = _cairo_fixed_integer_ceil (box->p2.y) - rectangle->y; +} + +cairo_bool_t +_cairo_rectangle_intersect (cairo_rectangle_int_t *dst, + const cairo_rectangle_int_t *src) +{ + int x1, y1, x2, y2; + + x1 = MAX (dst->x, src->x); + y1 = MAX (dst->y, src->y); + /* Beware the unsigned promotion, fortunately we have bits to spare + * as (CAIRO_RECT_INT_MAX - CAIRO_RECT_INT_MIN) < UINT_MAX + */ + x2 = MIN (dst->x + (int) dst->width, src->x + (int) src->width); + y2 = MIN (dst->y + (int) dst->height, src->y + (int) src->height); + + if (x1 >= x2 || y1 >= y2) { + dst->x = 0; + dst->y = 0; + dst->width = 0; + dst->height = 0; + + return FALSE; + } else { + dst->x = x1; + dst->y = y1; + dst->width = x2 - x1; + dst->height = y2 - y1; + + return TRUE; + } +} + +/* Extends the dst rectangle to also contain src. + * If one of the rectangles is empty, the result is undefined + */ +void +_cairo_rectangle_union (cairo_rectangle_int_t *dst, + const cairo_rectangle_int_t *src) +{ + int x1, y1, x2, y2; + + x1 = MIN (dst->x, src->x); + y1 = MIN (dst->y, src->y); + /* Beware the unsigned promotion, fortunately we have bits to spare + * as (CAIRO_RECT_INT_MAX - CAIRO_RECT_INT_MIN) < UINT_MAX + */ + x2 = MAX (dst->x + (int) dst->width, src->x + (int) src->width); + y2 = MAX (dst->y + (int) dst->height, src->y + (int) src->height); + + dst->x = x1; + dst->y = y1; + dst->width = x2 - x1; + dst->height = y2 - y1; +} + +#define P1x (line->p1.x) +#define P1y (line->p1.y) +#define P2x (line->p2.x) +#define P2y (line->p2.y) +#define B1x (box->p1.x) +#define B1y (box->p1.y) +#define B2x (box->p2.x) +#define B2y (box->p2.y) + +/* + * Check whether any part of line intersects box. This function essentially + * computes whether the ray starting at line->p1 in the direction of line->p2 + * intersects the box before it reaches p2. Normally, this is done + * by dividing by the lengths of the line projected onto each axis. Because + * we're in fixed point, this function does a bit more work to avoid having to + * do the division -- we don't care about the actual intersection point, so + * it's of no interest to us. + */ + +cairo_bool_t +_cairo_box_intersects_line_segment (const cairo_box_t *box, cairo_line_t *line) +{ + cairo_fixed_t t1=0, t2=0, t3=0, t4=0; + cairo_int64_t t1y, t2y, t3x, t4x; + + cairo_fixed_t xlen, ylen; + + if (_cairo_box_contains_point (box, &line->p1) || + _cairo_box_contains_point (box, &line->p2)) + return TRUE; + + xlen = P2x - P1x; + ylen = P2y - P1y; + + if (xlen) { + if (xlen > 0) { + t1 = B1x - P1x; + t2 = B2x - P1x; + } else { + t1 = P1x - B2x; + t2 = P1x - B1x; + xlen = - xlen; + } + + if ((t1 < 0 || t1 > xlen) && + (t2 < 0 || t2 > xlen)) + return FALSE; + } else { + /* Fully vertical line -- check that X is in bounds */ + if (P1x < B1x || P1x > B2x) + return FALSE; + } + + if (ylen) { + if (ylen > 0) { + t3 = B1y - P1y; + t4 = B2y - P1y; + } else { + t3 = P1y - B2y; + t4 = P1y - B1y; + ylen = - ylen; + } + + if ((t3 < 0 || t3 > ylen) && + (t4 < 0 || t4 > ylen)) + return FALSE; + } else { + /* Fully horizontal line -- check Y */ + if (P1y < B1y || P1y > B2y) + return FALSE; + } + + /* If we had a horizontal or vertical line, then it's already been checked */ + if (P1x == P2x || P1y == P2y) + return TRUE; + + /* Check overlap. Note that t1 < t2 and t3 < t4 here. */ + t1y = _cairo_int32x32_64_mul (t1, ylen); + t2y = _cairo_int32x32_64_mul (t2, ylen); + t3x = _cairo_int32x32_64_mul (t3, xlen); + t4x = _cairo_int32x32_64_mul (t4, xlen); + + if (_cairo_int64_lt(t1y, t4x) && + _cairo_int64_lt(t3x, t2y)) + return TRUE; + + return FALSE; +} + +static cairo_status_t +_cairo_box_add_spline_point (void *closure, + const cairo_point_t *point, + const cairo_slope_t *tangent) +{ + _cairo_box_add_point (closure, point); + + return CAIRO_STATUS_SUCCESS; +} + +/* assumes a has been previously added */ +void +_cairo_box_add_curve_to (cairo_box_t *extents, + const cairo_point_t *a, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + _cairo_box_add_point (extents, d); + if (!_cairo_box_contains_point (extents, b) || + !_cairo_box_contains_point (extents, c)) + { + cairo_status_t status; + + status = _cairo_spline_bound (_cairo_box_add_spline_point, + extents, a, b, c, d); + assert (status == CAIRO_STATUS_SUCCESS); + } +} + +void +_cairo_rectangle_int_from_double (cairo_rectangle_int_t *recti, + const cairo_rectangle_t *rectf) +{ + recti->x = floor (rectf->x); + recti->y = floor (rectf->y); + recti->width = ceil (rectf->x + rectf->width) - floor (rectf->x); + recti->height = ceil (rectf->y + rectf->height) - floor (rectf->y); +} diff --git a/src/cairo-rectangular-scan-converter.c b/src/cairo-rectangular-scan-converter.c new file mode 100644 index 000000000..e353b34e8 --- /dev/null +++ b/src/cairo-rectangular-scan-converter.c @@ -0,0 +1,791 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-combsort-inline.h" +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-list-private.h" +#include "cairo-spans-private.h" + +#include + +typedef struct _rectangle { + struct _rectangle *next, *prev; + cairo_fixed_t left, right; + cairo_fixed_t top, bottom; + int32_t top_y, bottom_y; + int dir; +} rectangle_t; + +#define UNROLL3(x) x x x + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +typedef struct _pqueue { + int size, max_size; + + rectangle_t **elements; + rectangle_t *elements_embedded[1024]; +} pqueue_t; + +typedef struct { + rectangle_t **start; + pqueue_t stop; + rectangle_t head, tail; + rectangle_t *insert_cursor; + int32_t current_y; + int32_t xmin, xmax; + + struct coverage { + struct cell { + struct cell *prev, *next; + int x, covered, uncovered; + } head, tail, *cursor; + unsigned int count; + cairo_freepool_t pool; + } coverage; + + cairo_half_open_span_t spans_stack[CAIRO_STACK_ARRAY_LENGTH (cairo_half_open_span_t)]; + cairo_half_open_span_t *spans; + unsigned int num_spans; + unsigned int size_spans; + + jmp_buf jmpbuf; +} sweep_line_t; + +static inline int +rectangle_compare_start (const rectangle_t *a, + const rectangle_t *b) +{ + int cmp; + + cmp = a->top_y - b->top_y; + if (cmp) + return cmp; + + return a->left - b->left; +} + +static inline int +rectangle_compare_stop (const rectangle_t *a, + const rectangle_t *b) +{ + return a->bottom_y - b->bottom_y; +} + +static inline void +pqueue_init (pqueue_t *pq) +{ + pq->max_size = ARRAY_LENGTH (pq->elements_embedded); + pq->size = 0; + + pq->elements = pq->elements_embedded; + pq->elements[PQ_FIRST_ENTRY] = NULL; +} + +static inline void +pqueue_fini (pqueue_t *pq) +{ + if (pq->elements != pq->elements_embedded) + free (pq->elements); +} + +static cairo_bool_t +pqueue_grow (pqueue_t *pq) +{ + rectangle_t **new_elements; + pq->max_size *= 2; + + if (pq->elements == pq->elements_embedded) { + new_elements = _cairo_malloc_ab (pq->max_size, + sizeof (rectangle_t *)); + if (unlikely (new_elements == NULL)) + return FALSE; + + memcpy (new_elements, pq->elements_embedded, + sizeof (pq->elements_embedded)); + } else { + new_elements = _cairo_realloc_ab (pq->elements, + pq->max_size, + sizeof (rectangle_t *)); + if (unlikely (new_elements == NULL)) + return FALSE; + } + + pq->elements = new_elements; + return TRUE; +} + +static inline void +pqueue_push (sweep_line_t *sweep, rectangle_t *rectangle) +{ + rectangle_t **elements; + int i, parent; + + if (unlikely (sweep->stop.size + 1 == sweep->stop.max_size)) { + if (unlikely (! pqueue_grow (&sweep->stop))) + longjmp (sweep->jmpbuf, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + elements = sweep->stop.elements; + for (i = ++sweep->stop.size; + i != PQ_FIRST_ENTRY && + rectangle_compare_stop (rectangle, + elements[parent = PQ_PARENT_INDEX (i)]) < 0; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = rectangle; +} + +static inline void +pqueue_pop (pqueue_t *pq) +{ + rectangle_t **elements = pq->elements; + rectangle_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + rectangle_compare_stop (elements[child+1], + elements[child]) < 0) + { + child++; + } + + if (rectangle_compare_stop (elements[child], tail) >= 0) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static inline rectangle_t * +peek_stop (sweep_line_t *sweep) +{ + return sweep->stop.elements[PQ_FIRST_ENTRY]; +} + +CAIRO_COMBSORT_DECLARE (rectangle_sort, rectangle_t *, rectangle_compare_start) + +static void +sweep_line_init (sweep_line_t *sweep) +{ + sweep->head.left = INT_MIN; + sweep->head.next = &sweep->tail; + sweep->tail.left = INT_MAX; + sweep->tail.prev = &sweep->head; + sweep->insert_cursor = &sweep->tail; + + _cairo_freepool_init (&sweep->coverage.pool, sizeof (struct cell)); + + sweep->spans = sweep->spans_stack; + sweep->size_spans = ARRAY_LENGTH (sweep->spans_stack); + + sweep->coverage.head.prev = NULL; + sweep->coverage.head.x = INT_MIN; + sweep->coverage.tail.next = NULL; + sweep->coverage.tail.x = INT_MAX; + + pqueue_init (&sweep->stop); +} + +static void +sweep_line_fini (sweep_line_t *sweep) +{ + _cairo_freepool_fini (&sweep->coverage.pool); + pqueue_fini (&sweep->stop); + + if (sweep->spans != sweep->spans_stack) + free (sweep->spans); +} + +static inline void +add_cell (sweep_line_t *sweep, int x, int covered, int uncovered) +{ + struct cell *cell; + + cell = sweep->coverage.cursor; + if (cell->x > x) { + do { + UNROLL3({ + if (cell->prev->x < x) + break; + cell = cell->prev; + }) + } while (TRUE); + } else { + if (cell->x == x) + goto found; + + do { + UNROLL3({ + cell = cell->next; + if (cell->x >= x) + break; + }) + } while (TRUE); + } + + if (x != cell->x) { + struct cell *c; + + sweep->coverage.count++; + + c = _cairo_freepool_alloc (&sweep->coverage.pool); + if (unlikely (c == NULL)) { + longjmp (sweep->jmpbuf, + _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + cell->prev->next = c; + c->prev = cell->prev; + c->next = cell; + cell->prev = c; + + c->x = x; + c->covered = 0; + c->uncovered = 0; + + cell = c; + } + +found: + cell->covered += covered; + cell->uncovered += uncovered; + sweep->coverage.cursor = cell; +} + +static inline void +_active_edges_to_spans (sweep_line_t *sweep) +{ + int32_t y = sweep->current_y; + rectangle_t *rectangle; + int coverage, prev_coverage; + int prev_x; + struct cell *cell; + + sweep->num_spans = 0; + if (sweep->head.next == &sweep->tail) + return; + + sweep->coverage.head.next = &sweep->coverage.tail; + sweep->coverage.tail.prev = &sweep->coverage.head; + sweep->coverage.cursor = &sweep->coverage.tail; + sweep->coverage.count = 0; + + /* XXX cell coverage only changes when a rectangle appears or + * disappears. Try only modifying coverage at such times. + */ + for (rectangle = sweep->head.next; + rectangle != &sweep->tail; + rectangle = rectangle->next) + { + int height; + int frac, i; + + if (y == rectangle->bottom_y) { + height = rectangle->bottom & CAIRO_FIXED_FRAC_MASK; + if (height == 0) + continue; + } else + height = CAIRO_FIXED_ONE; + if (y == rectangle->top_y) + height -= rectangle->top & CAIRO_FIXED_FRAC_MASK; + height *= rectangle->dir; + + i = _cairo_fixed_integer_part (rectangle->left), + frac = _cairo_fixed_fractional_part (rectangle->left); + add_cell (sweep, i, + (CAIRO_FIXED_ONE-frac) * height, + frac * height); + + i = _cairo_fixed_integer_part (rectangle->right), + frac = _cairo_fixed_fractional_part (rectangle->right); + add_cell (sweep, i, + -(CAIRO_FIXED_ONE-frac) * height, + -frac * height); + } + + if (2*sweep->coverage.count >= sweep->size_spans) { + unsigned size; + + size = sweep->size_spans; + while (size <= 2*sweep->coverage.count) + size <<= 1; + + if (sweep->spans != sweep->spans_stack) + free (sweep->spans); + + sweep->spans = _cairo_malloc_ab (size, sizeof (cairo_half_open_span_t)); + if (unlikely (sweep->spans == NULL)) + longjmp (sweep->jmpbuf, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + + sweep->size_spans = size; + } + + prev_coverage = coverage = 0; + prev_x = INT_MIN; + for (cell = sweep->coverage.head.next; cell != &sweep->coverage.tail; cell = cell->next) { + if (cell->x != prev_x && coverage != prev_coverage) { + int n = sweep->num_spans++; + int c = coverage >> (CAIRO_FIXED_FRAC_BITS * 2 - 8); + sweep->spans[n].x = prev_x; + sweep->spans[n].inverse = 0; + sweep->spans[n].coverage = c - (c >> 8); + prev_coverage = coverage; + } + + coverage += cell->covered; + if (coverage != prev_coverage) { + int n = sweep->num_spans++; + int c = coverage >> (CAIRO_FIXED_FRAC_BITS * 2 - 8); + sweep->spans[n].x = cell->x; + sweep->spans[n].inverse = 0; + sweep->spans[n].coverage = c - (c >> 8); + prev_coverage = coverage; + } + coverage += cell->uncovered; + prev_x = cell->x + 1; + } + _cairo_freepool_reset (&sweep->coverage.pool); + + if (sweep->num_spans) { + if (prev_x <= sweep->xmax) { + int n = sweep->num_spans++; + int c = coverage >> (CAIRO_FIXED_FRAC_BITS * 2 - 8); + sweep->spans[n].x = prev_x; + sweep->spans[n].inverse = 0; + sweep->spans[n].coverage = c - (c >> 8); + } + + if (coverage && prev_x < sweep->xmax) { + int n = sweep->num_spans++; + sweep->spans[n].x = sweep->xmax; + sweep->spans[n].inverse = 1; + sweep->spans[n].coverage = 0; + } + } +} + +static inline void +sweep_line_delete (sweep_line_t *sweep, + rectangle_t *rectangle) +{ + if (sweep->insert_cursor == rectangle) + sweep->insert_cursor = rectangle->next; + + rectangle->prev->next = rectangle->next; + rectangle->next->prev = rectangle->prev; + + pqueue_pop (&sweep->stop); +} + +static inline void +sweep_line_insert (sweep_line_t *sweep, + rectangle_t *rectangle) +{ + rectangle_t *pos; + + pos = sweep->insert_cursor; + if (pos->left != rectangle->left) { + if (pos->left > rectangle->left) { + do { + UNROLL3({ + if (pos->prev->left < rectangle->left) + break; + pos = pos->prev; + }) + } while (TRUE); + } else { + do { + UNROLL3({ + pos = pos->next; + if (pos->left >= rectangle->left) + break; + }); + } while (TRUE); + } + } + + pos->prev->next = rectangle; + rectangle->prev = pos->prev; + rectangle->next = pos; + pos->prev = rectangle; + sweep->insert_cursor = rectangle; + + pqueue_push (sweep, rectangle); +} + +static void +render_rows (sweep_line_t *sweep_line, + cairo_span_renderer_t *renderer, + int height) +{ + cairo_status_t status; + + _active_edges_to_spans (sweep_line); + + status = renderer->render_rows (renderer, + sweep_line->current_y, height, + sweep_line->spans, + sweep_line->num_spans); + if (unlikely (status)) + longjmp (sweep_line->jmpbuf, status); +} + +static cairo_status_t +generate (cairo_rectangular_scan_converter_t *self, + cairo_span_renderer_t *renderer, + rectangle_t **rectangles) +{ + sweep_line_t sweep_line; + rectangle_t *start, *stop; + cairo_status_t status; + + sweep_line_init (&sweep_line); + sweep_line.xmin = _cairo_fixed_integer_part (self->extents.p1.x); + sweep_line.xmax = _cairo_fixed_integer_part (self->extents.p2.x); + sweep_line.start = rectangles; + if ((status = setjmp (sweep_line.jmpbuf))) + goto out; + + sweep_line.current_y = _cairo_fixed_integer_part (self->extents.p1.y); + start = *sweep_line.start++; + do { + if (start->top_y != sweep_line.current_y) { + render_rows (&sweep_line, renderer, + start->top_y - sweep_line.current_y); + sweep_line.current_y = start->top_y; + } + + do { + sweep_line_insert (&sweep_line, start); + start = *sweep_line.start++; + if (start == NULL) + goto end; + if (start->top_y != sweep_line.current_y) + break; + } while (TRUE); + + render_rows (&sweep_line, renderer, 1); + + stop = peek_stop (&sweep_line); + while (stop->bottom_y == sweep_line.current_y) { + sweep_line_delete (&sweep_line, stop); + stop = peek_stop (&sweep_line); + if (stop == NULL) + break; + } + + sweep_line.current_y++; + + while (stop != NULL && stop->bottom_y < start->top_y) { + if (stop->bottom_y != sweep_line.current_y) { + render_rows (&sweep_line, renderer, + stop->bottom_y - sweep_line.current_y); + sweep_line.current_y = stop->bottom_y; + } + + render_rows (&sweep_line, renderer, 1); + + do { + sweep_line_delete (&sweep_line, stop); + stop = peek_stop (&sweep_line); + } while (stop != NULL && stop->bottom_y == sweep_line.current_y); + + sweep_line.current_y++; + } + } while (TRUE); + + end: + render_rows (&sweep_line, renderer, 1); + + stop = peek_stop (&sweep_line); + while (stop->bottom_y == sweep_line.current_y) { + sweep_line_delete (&sweep_line, stop); + stop = peek_stop (&sweep_line); + if (stop == NULL) + goto out; + } + + while (++sweep_line.current_y < _cairo_fixed_integer_part (self->extents.p2.y)) { + if (stop->bottom_y != sweep_line.current_y) { + render_rows (&sweep_line, renderer, + stop->bottom_y - sweep_line.current_y); + sweep_line.current_y = stop->bottom_y; + } + + render_rows (&sweep_line, renderer, 1); + + do { + sweep_line_delete (&sweep_line, stop); + stop = peek_stop (&sweep_line); + if (stop == NULL) + goto out; + } while (stop->bottom_y == sweep_line.current_y); + + } + + out: + sweep_line_fini (&sweep_line); + + return status; +} +static void generate_row(cairo_span_renderer_t *renderer, + const rectangle_t *r, + int y, int h, + uint16_t coverage) +{ + cairo_half_open_span_t spans[4]; + unsigned int num_spans = 0; + int x1 = _cairo_fixed_integer_part (r->left); + int x2 = _cairo_fixed_integer_part (r->right); + if (x2 > x1) { + if (! _cairo_fixed_is_integer (r->left)) { + spans[num_spans].x = x1; + spans[num_spans].coverage = + coverage * (256 - _cairo_fixed_fractional_part (r->left)) >> 8; + num_spans++; + x1++; + } + + if (x2 > x1) { + spans[num_spans].x = x1; + spans[num_spans].coverage = coverage - (coverage >> 8); + num_spans++; + } + + if (! _cairo_fixed_is_integer (r->right)) { + spans[num_spans].x = x2++; + spans[num_spans].coverage = + coverage * _cairo_fixed_fractional_part (r->right) >> 8; + num_spans++; + } + } else { + spans[num_spans].x = x2++; + spans[num_spans].coverage = coverage * (r->right - r->left) >> 8; + num_spans++; + } + + spans[num_spans].x = x2; + spans[num_spans].coverage = 0; + num_spans++; + + renderer->render_rows (renderer, y, h, spans, num_spans); +} + +static cairo_status_t +generate_box (cairo_rectangular_scan_converter_t *self, + cairo_span_renderer_t *renderer) +{ + const rectangle_t *r = self->chunks.base; + int y1 = _cairo_fixed_integer_part (r->top); + int y2 = _cairo_fixed_integer_part (r->bottom); + if (y2 > y1) { + if (! _cairo_fixed_is_integer (r->top)) { + generate_row(renderer, r, y1, 1, + 256 - _cairo_fixed_fractional_part (r->top)); + y1++; + } + + if (y2 > y1) + generate_row(renderer, r, y1, y2-y1, 256); + + if (! _cairo_fixed_is_integer (r->bottom)) + generate_row(renderer, r, y2, 1, + _cairo_fixed_fractional_part (r->bottom)); + } else + generate_row(renderer, r, y1, 1, r->bottom - r->top); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_rectangular_scan_converter_generate (void *converter, + cairo_span_renderer_t *renderer) +{ + cairo_rectangular_scan_converter_t *self = converter; + rectangle_t *rectangles_stack[CAIRO_STACK_ARRAY_LENGTH (rectangle_t *)]; + rectangle_t **rectangles; + struct _cairo_rectangular_scan_converter_chunk *chunk; + cairo_status_t status; + int i, j; + + if (unlikely (self->num_rectangles == 0)) { + return renderer->render_rows (renderer, + _cairo_fixed_integer_part (self->extents.p1.y), + _cairo_fixed_integer_part (self->extents.p2.y - self->extents.p1.y), + NULL, 0); + } + + if (self->num_rectangles == 1) + return generate_box (self, renderer); + + rectangles = rectangles_stack; + if (unlikely (self->num_rectangles >= ARRAY_LENGTH (rectangles_stack))) { + rectangles = _cairo_malloc_ab (self->num_rectangles + 1, + sizeof (rectangle_t *)); + if (unlikely (rectangles == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + j = 0; + for (chunk = &self->chunks; chunk != NULL; chunk = chunk->next) { + rectangle_t *rectangle; + + rectangle = chunk->base; + for (i = 0; i < chunk->count; i++) + rectangles[j++] = &rectangle[i]; + } + rectangle_sort (rectangles, j); + rectangles[j] = NULL; + + status = generate (self, renderer, rectangles); + + if (rectangles != rectangles_stack) + free (rectangles); + + return status; +} + +static rectangle_t * +_allocate_rectangle (cairo_rectangular_scan_converter_t *self) +{ + rectangle_t *rectangle; + struct _cairo_rectangular_scan_converter_chunk *chunk; + + chunk = self->tail; + if (chunk->count == chunk->size) { + int size; + + size = chunk->size * 2; + chunk->next = _cairo_malloc_ab_plus_c (size, + sizeof (rectangle_t), + sizeof (struct _cairo_rectangular_scan_converter_chunk)); + + if (unlikely (chunk->next == NULL)) + return NULL; + + chunk = chunk->next; + chunk->next = NULL; + chunk->count = 0; + chunk->size = size; + chunk->base = chunk + 1; + self->tail = chunk; + } + + rectangle = chunk->base; + return rectangle + chunk->count++; +} + +cairo_status_t +_cairo_rectangular_scan_converter_add_box (cairo_rectangular_scan_converter_t *self, + const cairo_box_t *box, + int dir) +{ + rectangle_t *rectangle; + + rectangle = _allocate_rectangle (self); + if (unlikely (rectangle == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + rectangle->dir = dir; + rectangle->left = MAX (box->p1.x, self->extents.p1.x); + rectangle->right = MIN (box->p2.x, self->extents.p2.x); + if (unlikely (rectangle->right <= rectangle->left)) { + self->tail->count--; + return CAIRO_STATUS_SUCCESS; + } + + rectangle->top = MAX (box->p1.y, self->extents.p1.y); + rectangle->top_y = _cairo_fixed_integer_floor (rectangle->top); + rectangle->bottom = MIN (box->p2.y, self->extents.p2.y); + rectangle->bottom_y = _cairo_fixed_integer_floor (rectangle->bottom); + if (likely (rectangle->bottom > rectangle->top)) + self->num_rectangles++; + else + self->tail->count--; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_rectangular_scan_converter_destroy (void *converter) +{ + cairo_rectangular_scan_converter_t *self = converter; + struct _cairo_rectangular_scan_converter_chunk *chunk, *next; + + for (chunk = self->chunks.next; chunk != NULL; chunk = next) { + next = chunk->next; + free (chunk); + } +} + +void +_cairo_rectangular_scan_converter_init (cairo_rectangular_scan_converter_t *self, + const cairo_rectangle_int_t *extents) +{ + self->base.destroy = _cairo_rectangular_scan_converter_destroy; + self->base.generate = _cairo_rectangular_scan_converter_generate; + + _cairo_box_from_rectangle (&self->extents, extents); + + self->chunks.base = self->buf; + self->chunks.next = NULL; + self->chunks.count = 0; + self->chunks.size = sizeof (self->buf) / sizeof (rectangle_t); + self->tail = &self->chunks; + + self->num_rectangles = 0; +} diff --git a/src/cairo-reference-count-private.h b/src/cairo-reference-count-private.h new file mode 100644 index 000000000..75fdf3538 --- /dev/null +++ b/src/cairo-reference-count-private.h @@ -0,0 +1,62 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_REFRENCE_COUNT_PRIVATE_H +#define CAIRO_REFRENCE_COUNT_PRIVATE_H + +#include "cairo-atomic-private.h" + +/* Encapsulate operations on the object's reference count */ +typedef struct { + cairo_atomic_int_t ref_count; +} cairo_reference_count_t; + +#define _cairo_reference_count_inc(RC) _cairo_atomic_int_inc (&(RC)->ref_count) +#define _cairo_reference_count_dec(RC) _cairo_atomic_int_dec (&(RC)->ref_count) +#define _cairo_reference_count_dec_and_test(RC) _cairo_atomic_int_dec_and_test (&(RC)->ref_count) + +#define CAIRO_REFERENCE_COUNT_INIT(RC, VALUE) ((RC)->ref_count = (VALUE)) + +#define CAIRO_REFERENCE_COUNT_GET_VALUE(RC) _cairo_atomic_int_get (&(RC)->ref_count) + +#define CAIRO_REFERENCE_COUNT_INVALID_VALUE ((cairo_atomic_int_t) -1) +#define CAIRO_REFERENCE_COUNT_INVALID {CAIRO_REFERENCE_COUNT_INVALID_VALUE} + +#define CAIRO_REFERENCE_COUNT_IS_INVALID(RC) (CAIRO_REFERENCE_COUNT_GET_VALUE (RC) == CAIRO_REFERENCE_COUNT_INVALID_VALUE) + +#define CAIRO_REFERENCE_COUNT_HAS_REFERENCE(RC) (CAIRO_REFERENCE_COUNT_GET_VALUE (RC) > 0) + +#endif diff --git a/src/cairo-region-private.h b/src/cairo-region-private.h new file mode 100644 index 000000000..549e50878 --- /dev/null +++ b/src/cairo-region-private.h @@ -0,0 +1,77 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Vladimir Vukicevic + * Søren Sandmann + */ + +#ifndef CAIRO_REGION_PRIVATE_H +#define CAIRO_REGION_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-reference-count-private.h" + +#include + +CAIRO_BEGIN_DECLS + +struct _cairo_region { + cairo_reference_count_t ref_count; + cairo_status_t status; + + pixman_region32_t rgn; +}; + +cairo_private cairo_region_t * +_cairo_region_create_in_error (cairo_status_t status); + +cairo_private void +_cairo_region_init (cairo_region_t *region); + +cairo_private void +_cairo_region_init_rectangle (cairo_region_t *region, + const cairo_rectangle_int_t *rectangle); + +cairo_private void +_cairo_region_fini (cairo_region_t *region); + +cairo_private cairo_region_t * +_cairo_region_create_from_boxes (const cairo_box_t *boxes, int count); + +cairo_private cairo_box_t * +_cairo_region_get_boxes (const cairo_region_t *region, int *nbox); + +CAIRO_END_DECLS + +#endif /* CAIRO_REGION_PRIVATE_H */ diff --git a/src/cairo-region.c b/src/cairo-region.c new file mode 100644 index 000000000..ccfb2200e --- /dev/null +++ b/src/cairo-region.c @@ -0,0 +1,939 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Vladimir Vukicevic + * Søren Sandmann + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-region-private.h" + +/* XXX need to update pixman headers to be const as appropriate */ +#define CONST_CAST (pixman_region32_t *) + +/** + * SECTION:cairo-region + * @Title: Regions + * @Short_Description: Representing a pixel-aligned area + * + * Regions are a simple graphical data type representing an area of + * integer-aligned rectangles. They are often used on raster surfaces + * to track areas of interest, such as change or clip areas. + **/ + +static const cairo_region_t _cairo_region_nil = { + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + CAIRO_STATUS_NO_MEMORY, /* status */ +}; + +cairo_region_t * +_cairo_region_create_in_error (cairo_status_t status) +{ + switch (status) { + case CAIRO_STATUS_NO_MEMORY: + return (cairo_region_t *) &_cairo_region_nil; + + case CAIRO_STATUS_SUCCESS: + case CAIRO_STATUS_LAST_STATUS: + ASSERT_NOT_REACHED; + /* fall-through */ + case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: + case CAIRO_STATUS_INVALID_STATUS: + case CAIRO_STATUS_INVALID_CONTENT: + case CAIRO_STATUS_INVALID_FORMAT: + case CAIRO_STATUS_INVALID_VISUAL: + case CAIRO_STATUS_READ_ERROR: + case CAIRO_STATUS_WRITE_ERROR: + case CAIRO_STATUS_FILE_NOT_FOUND: + case CAIRO_STATUS_TEMP_FILE_ERROR: + case CAIRO_STATUS_INVALID_STRIDE: + case CAIRO_STATUS_INVALID_SIZE: + case CAIRO_STATUS_DEVICE_TYPE_MISMATCH: + case CAIRO_STATUS_DEVICE_ERROR: + case CAIRO_STATUS_INVALID_RESTORE: + case CAIRO_STATUS_INVALID_POP_GROUP: + case CAIRO_STATUS_NO_CURRENT_POINT: + case CAIRO_STATUS_INVALID_MATRIX: + case CAIRO_STATUS_NULL_POINTER: + case CAIRO_STATUS_INVALID_STRING: + case CAIRO_STATUS_INVALID_PATH_DATA: + case CAIRO_STATUS_SURFACE_FINISHED: + case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: + case CAIRO_STATUS_INVALID_DASH: + case CAIRO_STATUS_INVALID_DSC_COMMENT: + case CAIRO_STATUS_INVALID_INDEX: + case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: + case CAIRO_STATUS_FONT_TYPE_MISMATCH: + case CAIRO_STATUS_USER_FONT_IMMUTABLE: + case CAIRO_STATUS_USER_FONT_ERROR: + case CAIRO_STATUS_NEGATIVE_COUNT: + case CAIRO_STATUS_INVALID_CLUSTERS: + case CAIRO_STATUS_INVALID_SLANT: + case CAIRO_STATUS_INVALID_WEIGHT: + case CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: + case CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: + case CAIRO_STATUS_DEVICE_FINISHED: + case CAIRO_STATUS_JBIG2_GLOBAL_MISSING: + default: + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_region_t *) &_cairo_region_nil; + } +} + +/** + * _cairo_region_set_error: + * @region: a region + * @status: a status value indicating an error + * + * Atomically sets region->status to @status and calls _cairo_error; + * Does nothing if status is %CAIRO_STATUS_SUCCESS or any of the internal + * status values. + * + * All assignments of an error status to region->status should happen + * through _cairo_region_set_error(). Note that due to the nature of + * the atomic operation, it is not safe to call this function on the + * nil objects. + * + * The purpose of this function is to allow the user to set a + * breakpoint in _cairo_error() to generate a stack trace for when the + * user causes cairo to detect an error. + * + * Return value: the error status. + **/ +static cairo_status_t +_cairo_region_set_error (cairo_region_t *region, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS) + return CAIRO_STATUS_SUCCESS; + + /* Don't overwrite an existing error. This preserves the first + * error, which is the most significant. */ + _cairo_status_set_error (®ion->status, status); + + return _cairo_error (status); +} + +void +_cairo_region_init (cairo_region_t *region) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (region, sizeof (cairo_region_t))); + + region->status = CAIRO_STATUS_SUCCESS; + CAIRO_REFERENCE_COUNT_INIT (®ion->ref_count, 0); + pixman_region32_init (®ion->rgn); +} + +void +_cairo_region_init_rectangle (cairo_region_t *region, + const cairo_rectangle_int_t *rectangle) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (region, sizeof (cairo_region_t))); + + region->status = CAIRO_STATUS_SUCCESS; + CAIRO_REFERENCE_COUNT_INIT (®ion->ref_count, 0); + pixman_region32_init_rect (®ion->rgn, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); +} + +void +_cairo_region_fini (cairo_region_t *region) +{ + assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (®ion->ref_count)); + pixman_region32_fini (®ion->rgn); + VG (VALGRIND_MAKE_MEM_NOACCESS (region, sizeof (cairo_region_t))); +} + +/** + * cairo_region_create: + * + * Allocates a new empty region object. + * + * Return value: A newly allocated #cairo_region_t. Free with + * cairo_region_destroy(). This function always returns a + * valid pointer; if memory cannot be allocated, then a special + * error object is returned where all operations on the object do nothing. + * You can check for this with cairo_region_status(). + * + * Since: 1.10 + **/ +cairo_region_t * +cairo_region_create (void) +{ + cairo_region_t *region; + + region = _cairo_malloc (sizeof (cairo_region_t)); + if (region == NULL) + return (cairo_region_t *) &_cairo_region_nil; + + region->status = CAIRO_STATUS_SUCCESS; + CAIRO_REFERENCE_COUNT_INIT (®ion->ref_count, 1); + + pixman_region32_init (®ion->rgn); + + return region; +} +slim_hidden_def (cairo_region_create); + +/** + * cairo_region_create_rectangles: + * @rects: an array of @count rectangles + * @count: number of rectangles + * + * Allocates a new region object containing the union of all given @rects. + * + * Return value: A newly allocated #cairo_region_t. Free with + * cairo_region_destroy(). This function always returns a + * valid pointer; if memory cannot be allocated, then a special + * error object is returned where all operations on the object do nothing. + * You can check for this with cairo_region_status(). + * + * Since: 1.10 + **/ +cairo_region_t * +cairo_region_create_rectangles (const cairo_rectangle_int_t *rects, + int count) +{ + pixman_box32_t stack_pboxes[CAIRO_STACK_ARRAY_LENGTH (pixman_box32_t)]; + pixman_box32_t *pboxes = stack_pboxes; + cairo_region_t *region; + int i; + + region = _cairo_malloc (sizeof (cairo_region_t)); + if (unlikely (region == NULL)) + return _cairo_region_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + CAIRO_REFERENCE_COUNT_INIT (®ion->ref_count, 1); + region->status = CAIRO_STATUS_SUCCESS; + + if (count == 1) { + pixman_region32_init_rect (®ion->rgn, + rects->x, rects->y, + rects->width, rects->height); + + return region; + } + + if (count > ARRAY_LENGTH (stack_pboxes)) { + pboxes = _cairo_malloc_ab (count, sizeof (pixman_box32_t)); + if (unlikely (pboxes == NULL)) { + free (region); + return _cairo_region_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + for (i = 0; i < count; i++) { + pboxes[i].x1 = rects[i].x; + pboxes[i].y1 = rects[i].y; + pboxes[i].x2 = rects[i].x + rects[i].width; + pboxes[i].y2 = rects[i].y + rects[i].height; + } + + i = pixman_region32_init_rects (®ion->rgn, pboxes, count); + + if (pboxes != stack_pboxes) + free (pboxes); + + if (unlikely (i == 0)) { + free (region); + return _cairo_region_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + return region; +} +slim_hidden_def (cairo_region_create_rectangles); + +cairo_region_t * +_cairo_region_create_from_boxes (const cairo_box_t *boxes, int count) +{ + cairo_region_t *region; + + region = _cairo_malloc (sizeof (cairo_region_t)); + if (unlikely (region == NULL)) + return _cairo_region_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + CAIRO_REFERENCE_COUNT_INIT (®ion->ref_count, 1); + region->status = CAIRO_STATUS_SUCCESS; + + if (! pixman_region32_init_rects (®ion->rgn, + (pixman_box32_t *)boxes, count)) { + free (region); + return _cairo_region_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + return region; +} + +cairo_box_t * +_cairo_region_get_boxes (const cairo_region_t *region, int *nbox) +{ + if (region->status) { + nbox = 0; + return NULL; + } + + return (cairo_box_t *) pixman_region32_rectangles (CONST_CAST ®ion->rgn, nbox); +} + +/** + * cairo_region_create_rectangle: + * @rectangle: a #cairo_rectangle_int_t + * + * Allocates a new region object containing @rectangle. + * + * Return value: A newly allocated #cairo_region_t. Free with + * cairo_region_destroy(). This function always returns a + * valid pointer; if memory cannot be allocated, then a special + * error object is returned where all operations on the object do nothing. + * You can check for this with cairo_region_status(). + * + * Since: 1.10 + **/ +cairo_region_t * +cairo_region_create_rectangle (const cairo_rectangle_int_t *rectangle) +{ + cairo_region_t *region; + + region = _cairo_malloc (sizeof (cairo_region_t)); + if (unlikely (region == NULL)) + return (cairo_region_t *) &_cairo_region_nil; + + region->status = CAIRO_STATUS_SUCCESS; + CAIRO_REFERENCE_COUNT_INIT (®ion->ref_count, 1); + + pixman_region32_init_rect (®ion->rgn, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); + + return region; +} +slim_hidden_def (cairo_region_create_rectangle); + +/** + * cairo_region_copy: + * @original: a #cairo_region_t + * + * Allocates a new region object copying the area from @original. + * + * Return value: A newly allocated #cairo_region_t. Free with + * cairo_region_destroy(). This function always returns a + * valid pointer; if memory cannot be allocated, then a special + * error object is returned where all operations on the object do nothing. + * You can check for this with cairo_region_status(). + * + * Since: 1.10 + **/ +cairo_region_t * +cairo_region_copy (const cairo_region_t *original) +{ + cairo_region_t *copy; + + if (original != NULL && original->status) + return (cairo_region_t *) &_cairo_region_nil; + + copy = cairo_region_create (); + if (unlikely (copy->status)) + return copy; + + if (original != NULL && + ! pixman_region32_copy (©->rgn, CONST_CAST &original->rgn)) + { + cairo_region_destroy (copy); + return (cairo_region_t *) &_cairo_region_nil; + } + + return copy; +} +slim_hidden_def (cairo_region_copy); + +/** + * cairo_region_reference: + * @region: a #cairo_region_t + * + * Increases the reference count on @region by one. This prevents + * @region from being destroyed until a matching call to + * cairo_region_destroy() is made. + * + * Return value: the referenced #cairo_region_t. + * + * Since: 1.10 + **/ +cairo_region_t * +cairo_region_reference (cairo_region_t *region) +{ + if (region == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (®ion->ref_count)) + return NULL; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (®ion->ref_count)); + + _cairo_reference_count_inc (®ion->ref_count); + return region; +} +slim_hidden_def (cairo_region_reference); + +/** + * cairo_region_destroy: + * @region: a #cairo_region_t + * + * Destroys a #cairo_region_t object created with + * cairo_region_create(), cairo_region_copy(), or + * or cairo_region_create_rectangle(). + * + * Since: 1.10 + **/ +void +cairo_region_destroy (cairo_region_t *region) +{ + if (region == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (®ion->ref_count)) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (®ion->ref_count)); + + if (! _cairo_reference_count_dec_and_test (®ion->ref_count)) + return; + + _cairo_region_fini (region); + free (region); +} +slim_hidden_def (cairo_region_destroy); + +/** + * cairo_region_num_rectangles: + * @region: a #cairo_region_t + * + * Returns the number of rectangles contained in @region. + * + * Return value: The number of rectangles contained in @region. + * + * Since: 1.10 + **/ +int +cairo_region_num_rectangles (const cairo_region_t *region) +{ + if (region->status) + return 0; + + return pixman_region32_n_rects (CONST_CAST ®ion->rgn); +} +slim_hidden_def (cairo_region_num_rectangles); + +/** + * cairo_region_get_rectangle: + * @region: a #cairo_region_t + * @nth: a number indicating which rectangle should be returned + * @rectangle: return location for a #cairo_rectangle_int_t + * + * Stores the @nth rectangle from the region in @rectangle. + * + * Since: 1.10 + **/ +void +cairo_region_get_rectangle (const cairo_region_t *region, + int nth, + cairo_rectangle_int_t *rectangle) +{ + pixman_box32_t *pbox; + + if (region->status) { + rectangle->x = rectangle->y = 0; + rectangle->width = rectangle->height = 0; + return; + } + + pbox = pixman_region32_rectangles (CONST_CAST ®ion->rgn, NULL) + nth; + + rectangle->x = pbox->x1; + rectangle->y = pbox->y1; + rectangle->width = pbox->x2 - pbox->x1; + rectangle->height = pbox->y2 - pbox->y1; +} +slim_hidden_def (cairo_region_get_rectangle); + +/** + * cairo_region_get_extents: + * @region: a #cairo_region_t + * @extents: rectangle into which to store the extents + * + * Gets the bounding rectangle of @region as a #cairo_rectangle_int_t + * + * Since: 1.10 + **/ +void +cairo_region_get_extents (const cairo_region_t *region, + cairo_rectangle_int_t *extents) +{ + pixman_box32_t *pextents; + + if (region->status) { + extents->x = extents->y = 0; + extents->width = extents->height = 0; + return; + } + + pextents = pixman_region32_extents (CONST_CAST ®ion->rgn); + + extents->x = pextents->x1; + extents->y = pextents->y1; + extents->width = pextents->x2 - pextents->x1; + extents->height = pextents->y2 - pextents->y1; +} +slim_hidden_def (cairo_region_get_extents); + +/** + * cairo_region_status: + * @region: a #cairo_region_t + * + * Checks whether an error has previous occurred for this + * region object. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_status (const cairo_region_t *region) +{ + return region->status; +} +slim_hidden_def (cairo_region_status); + +/** + * cairo_region_subtract: + * @dst: a #cairo_region_t + * @other: another #cairo_region_t + * + * Subtracts @other from @dst and places the result in @dst + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_subtract (cairo_region_t *dst, const cairo_region_t *other) +{ + if (dst->status) + return dst->status; + + if (other->status) + return _cairo_region_set_error (dst, other->status); + + if (! pixman_region32_subtract (&dst->rgn, + &dst->rgn, + CONST_CAST &other->rgn)) + { + return _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + } + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_region_subtract); + +/** + * cairo_region_subtract_rectangle: + * @dst: a #cairo_region_t + * @rectangle: a #cairo_rectangle_int_t + * + * Subtracts @rectangle from @dst and places the result in @dst + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_subtract_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + pixman_region32_t region; + + if (dst->status) + return dst->status; + + pixman_region32_init_rect (®ion, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); + + if (! pixman_region32_subtract (&dst->rgn, &dst->rgn, ®ion)) + status = _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (®ion); + + return status; +} +slim_hidden_def (cairo_region_subtract_rectangle); + +/** + * cairo_region_intersect: + * @dst: a #cairo_region_t + * @other: another #cairo_region_t + * + * Computes the intersection of @dst with @other and places the result in @dst + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_intersect (cairo_region_t *dst, const cairo_region_t *other) +{ + if (dst->status) + return dst->status; + + if (other->status) + return _cairo_region_set_error (dst, other->status); + + if (! pixman_region32_intersect (&dst->rgn, &dst->rgn, CONST_CAST &other->rgn)) + return _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_region_intersect); + +/** + * cairo_region_intersect_rectangle: + * @dst: a #cairo_region_t + * @rectangle: a #cairo_rectangle_int_t + * + * Computes the intersection of @dst with @rectangle and places the + * result in @dst + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_intersect_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + pixman_region32_t region; + + if (dst->status) + return dst->status; + + pixman_region32_init_rect (®ion, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); + + if (! pixman_region32_intersect (&dst->rgn, &dst->rgn, ®ion)) + status = _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (®ion); + + return status; +} +slim_hidden_def (cairo_region_intersect_rectangle); + +/** + * cairo_region_union: + * @dst: a #cairo_region_t + * @other: another #cairo_region_t + * + * Computes the union of @dst with @other and places the result in @dst + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_union (cairo_region_t *dst, + const cairo_region_t *other) +{ + if (dst->status) + return dst->status; + + if (other->status) + return _cairo_region_set_error (dst, other->status); + + if (! pixman_region32_union (&dst->rgn, &dst->rgn, CONST_CAST &other->rgn)) + return _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_region_union); + +/** + * cairo_region_union_rectangle: + * @dst: a #cairo_region_t + * @rectangle: a #cairo_rectangle_int_t + * + * Computes the union of @dst with @rectangle and places the result in @dst. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_union_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + pixman_region32_t region; + + if (dst->status) + return dst->status; + + pixman_region32_init_rect (®ion, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); + + if (! pixman_region32_union (&dst->rgn, &dst->rgn, ®ion)) + status = _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (®ion); + + return status; +} +slim_hidden_def (cairo_region_union_rectangle); + +/** + * cairo_region_xor: + * @dst: a #cairo_region_t + * @other: another #cairo_region_t + * + * Computes the exclusive difference of @dst with @other and places the + * result in @dst. That is, @dst will be set to contain all areas that + * are either in @dst or in @other, but not in both. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_xor (cairo_region_t *dst, const cairo_region_t *other) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + pixman_region32_t tmp; + + if (dst->status) + return dst->status; + + if (other->status) + return _cairo_region_set_error (dst, other->status); + + pixman_region32_init (&tmp); + + /* XXX: get an xor function into pixman */ + if (! pixman_region32_subtract (&tmp, CONST_CAST &other->rgn, &dst->rgn) || + ! pixman_region32_subtract (&dst->rgn, &dst->rgn, CONST_CAST &other->rgn) || + ! pixman_region32_union (&dst->rgn, &dst->rgn, &tmp)) + status = _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (&tmp); + + return status; +} +slim_hidden_def (cairo_region_xor); + +/** + * cairo_region_xor_rectangle: + * @dst: a #cairo_region_t + * @rectangle: a #cairo_rectangle_int_t + * + * Computes the exclusive difference of @dst with @rectangle and places the + * result in @dst. That is, @dst will be set to contain all areas that are + * either in @dst or in @rectangle, but not in both. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY + * + * Since: 1.10 + **/ +cairo_status_t +cairo_region_xor_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + pixman_region32_t region, tmp; + + if (dst->status) + return dst->status; + + pixman_region32_init_rect (®ion, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); + pixman_region32_init (&tmp); + + /* XXX: get an xor function into pixman */ + if (! pixman_region32_subtract (&tmp, ®ion, &dst->rgn) || + ! pixman_region32_subtract (&dst->rgn, &dst->rgn, ®ion) || + ! pixman_region32_union (&dst->rgn, &dst->rgn, &tmp)) + status = _cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (&tmp); + pixman_region32_fini (®ion); + + return status; +} +slim_hidden_def (cairo_region_xor_rectangle); + +/** + * cairo_region_is_empty: + * @region: a #cairo_region_t + * + * Checks whether @region is empty. + * + * Return value: %TRUE if @region is empty, %FALSE if it isn't. + * + * Since: 1.10 + **/ +cairo_bool_t +cairo_region_is_empty (const cairo_region_t *region) +{ + if (region->status) + return TRUE; + + return ! pixman_region32_not_empty (CONST_CAST ®ion->rgn); +} +slim_hidden_def (cairo_region_is_empty); + +/** + * cairo_region_translate: + * @region: a #cairo_region_t + * @dx: Amount to translate in the x direction + * @dy: Amount to translate in the y direction + * + * Translates @region by (@dx, @dy). + * + * Since: 1.10 + **/ +void +cairo_region_translate (cairo_region_t *region, + int dx, int dy) +{ + if (region->status) + return; + + pixman_region32_translate (®ion->rgn, dx, dy); +} +slim_hidden_def (cairo_region_translate); + +/** + * cairo_region_contains_rectangle: + * @region: a #cairo_region_t + * @rectangle: a #cairo_rectangle_int_t + * + * Checks whether @rectangle is inside, outside or partially contained + * in @region + * + * Return value: + * %CAIRO_REGION_OVERLAP_IN if @rectangle is entirely inside @region, + * %CAIRO_REGION_OVERLAP_OUT if @rectangle is entirely outside @region, or + * %CAIRO_REGION_OVERLAP_PART if @rectangle is partially inside and partially outside @region. + * + * Since: 1.10 + **/ +cairo_region_overlap_t +cairo_region_contains_rectangle (const cairo_region_t *region, + const cairo_rectangle_int_t *rectangle) +{ + pixman_box32_t pbox; + pixman_region_overlap_t poverlap; + + if (region->status) + return CAIRO_REGION_OVERLAP_OUT; + + pbox.x1 = rectangle->x; + pbox.y1 = rectangle->y; + pbox.x2 = rectangle->x + rectangle->width; + pbox.y2 = rectangle->y + rectangle->height; + + poverlap = pixman_region32_contains_rectangle (CONST_CAST ®ion->rgn, + &pbox); + switch (poverlap) { + default: + case PIXMAN_REGION_OUT: return CAIRO_REGION_OVERLAP_OUT; + case PIXMAN_REGION_IN: return CAIRO_REGION_OVERLAP_IN; + case PIXMAN_REGION_PART: return CAIRO_REGION_OVERLAP_PART; + } +} +slim_hidden_def (cairo_region_contains_rectangle); + +/** + * cairo_region_contains_point: + * @region: a #cairo_region_t + * @x: the x coordinate of a point + * @y: the y coordinate of a point + * + * Checks whether (@x, @y) is contained in @region. + * + * Return value: %TRUE if (@x, @y) is contained in @region, %FALSE if it is not. + * + * Since: 1.10 + **/ +cairo_bool_t +cairo_region_contains_point (const cairo_region_t *region, + int x, int y) +{ + pixman_box32_t box; + + if (region->status) + return FALSE; + + return pixman_region32_contains_point (CONST_CAST ®ion->rgn, x, y, &box); +} +slim_hidden_def (cairo_region_contains_point); + +/** + * cairo_region_equal: + * @a: a #cairo_region_t or %NULL + * @b: a #cairo_region_t or %NULL + * + * Compares whether region_a is equivalent to region_b. %NULL as an argument + * is equal to itself, but not to any non-%NULL region. + * + * Return value: %TRUE if both regions contained the same coverage, + * %FALSE if it is not or any region is in an error status. + * + * Since: 1.10 + **/ +cairo_bool_t +cairo_region_equal (const cairo_region_t *a, + const cairo_region_t *b) +{ + /* error objects are never equal */ + if ((a != NULL && a->status) || (b != NULL && b->status)) + return FALSE; + + if (a == b) + return TRUE; + + if (a == NULL || b == NULL) + return FALSE; + + return pixman_region32_equal (CONST_CAST &a->rgn, CONST_CAST &b->rgn); +} +slim_hidden_def (cairo_region_equal); diff --git a/src/cairo-rtree-private.h b/src/cairo-rtree-private.h new file mode 100644 index 000000000..27806cab6 --- /dev/null +++ b/src/cairo-rtree-private.h @@ -0,0 +1,142 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + * + */ + +#ifndef CAIRO_RTREE_PRIVATE_H +#define CAIRO_RTREE_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" +#include "cairo-types-private.h" + +#include "cairo-freelist-private.h" +#include "cairo-list-inline.h" + +enum { + CAIRO_RTREE_NODE_AVAILABLE, + CAIRO_RTREE_NODE_DIVIDED, + CAIRO_RTREE_NODE_OCCUPIED, +}; + +typedef struct _cairo_rtree_node { + struct _cairo_rtree_node *children[4], *parent; + cairo_list_t link; + uint16_t pinned; + uint16_t state; + uint16_t x, y; + uint16_t width, height; +} cairo_rtree_node_t; + +typedef struct _cairo_rtree { + cairo_rtree_node_t root; + int min_size; + cairo_list_t pinned; + cairo_list_t available; + cairo_list_t evictable; + void (*destroy) (cairo_rtree_node_t *); + cairo_freepool_t node_freepool; +} cairo_rtree_t; + +cairo_private cairo_rtree_node_t * +_cairo_rtree_node_create (cairo_rtree_t *rtree, + cairo_rtree_node_t *parent, + int x, + int y, + int width, + int height); + +cairo_private cairo_status_t +_cairo_rtree_node_insert (cairo_rtree_t *rtree, + cairo_rtree_node_t *node, + int width, + int height, + cairo_rtree_node_t **out); + +cairo_private void +_cairo_rtree_node_collapse (cairo_rtree_t *rtree, cairo_rtree_node_t *node); + +cairo_private void +_cairo_rtree_node_remove (cairo_rtree_t *rtree, cairo_rtree_node_t *node); + +cairo_private void +_cairo_rtree_node_destroy (cairo_rtree_t *rtree, cairo_rtree_node_t *node); + +cairo_private void +_cairo_rtree_init (cairo_rtree_t *rtree, + int width, + int height, + int min_size, + int node_size, + void (*destroy)(cairo_rtree_node_t *)); + +cairo_private cairo_int_status_t +_cairo_rtree_insert (cairo_rtree_t *rtree, + int width, + int height, + cairo_rtree_node_t **out); + +cairo_private cairo_int_status_t +_cairo_rtree_evict_random (cairo_rtree_t *rtree, + int width, + int height, + cairo_rtree_node_t **out); + +cairo_private void +_cairo_rtree_foreach (cairo_rtree_t *rtree, + void (*func)(cairo_rtree_node_t *, void *data), + void *data); + +static inline void * +_cairo_rtree_pin (cairo_rtree_t *rtree, cairo_rtree_node_t *node) +{ + assert (node->state == CAIRO_RTREE_NODE_OCCUPIED); + if (! node->pinned) { + cairo_list_move (&node->link, &rtree->pinned); + node->pinned = 1; + } + + return node; +} + +cairo_private void +_cairo_rtree_unpin (cairo_rtree_t *rtree); + +cairo_private void +_cairo_rtree_reset (cairo_rtree_t *rtree); + +cairo_private void +_cairo_rtree_fini (cairo_rtree_t *rtree); + +#endif /* CAIRO_RTREE_PRIVATE_H */ diff --git a/src/cairo-rtree.c b/src/cairo-rtree.c new file mode 100644 index 000000000..dbc040929 --- /dev/null +++ b/src/cairo-rtree.c @@ -0,0 +1,388 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + * + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-rtree-private.h" + +cairo_rtree_node_t * +_cairo_rtree_node_create (cairo_rtree_t *rtree, + cairo_rtree_node_t *parent, + int x, + int y, + int width, + int height) +{ + cairo_rtree_node_t *node; + + node = _cairo_freepool_alloc (&rtree->node_freepool); + if (node == NULL) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + node->children[0] = NULL; + node->parent = parent; + node->state = CAIRO_RTREE_NODE_AVAILABLE; + node->pinned = FALSE; + node->x = x; + node->y = y; + node->width = width; + node->height = height; + + cairo_list_add (&node->link, &rtree->available); + + return node; +} + +void +_cairo_rtree_node_destroy (cairo_rtree_t *rtree, cairo_rtree_node_t *node) +{ + int i; + + cairo_list_del (&node->link); + + if (node->state == CAIRO_RTREE_NODE_OCCUPIED) { + rtree->destroy (node); + } else { + for (i = 0; i < 4 && node->children[i] != NULL; i++) + _cairo_rtree_node_destroy (rtree, node->children[i]); + } + + _cairo_freepool_free (&rtree->node_freepool, node); +} + +void +_cairo_rtree_node_collapse (cairo_rtree_t *rtree, cairo_rtree_node_t *node) +{ + int i; + + do { + assert (node->state == CAIRO_RTREE_NODE_DIVIDED); + + for (i = 0; i < 4 && node->children[i] != NULL; i++) + if (node->children[i]->state != CAIRO_RTREE_NODE_AVAILABLE) + return; + + for (i = 0; i < 4 && node->children[i] != NULL; i++) + _cairo_rtree_node_destroy (rtree, node->children[i]); + + node->children[0] = NULL; + node->state = CAIRO_RTREE_NODE_AVAILABLE; + cairo_list_move (&node->link, &rtree->available); + } while ((node = node->parent) != NULL); +} + +cairo_status_t +_cairo_rtree_node_insert (cairo_rtree_t *rtree, + cairo_rtree_node_t *node, + int width, + int height, + cairo_rtree_node_t **out) +{ + int w, h, i; + + assert (node->state == CAIRO_RTREE_NODE_AVAILABLE); + assert (node->pinned == FALSE); + + if (node->width - width > rtree->min_size || + node->height - height > rtree->min_size) + { + w = node->width - width; + h = node->height - height; + + i = 0; + node->children[i] = _cairo_rtree_node_create (rtree, node, + node->x, node->y, + width, height); + if (unlikely (node->children[i] == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + i++; + + if (w > rtree->min_size) { + node->children[i] = _cairo_rtree_node_create (rtree, node, + node->x + width, + node->y, + w, height); + if (unlikely (node->children[i] == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + i++; + } + + if (h > rtree->min_size) { + node->children[i] = _cairo_rtree_node_create (rtree, node, + node->x, + node->y + height, + width, h); + if (unlikely (node->children[i] == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + i++; + + if (w > rtree->min_size) { + node->children[i] = _cairo_rtree_node_create (rtree, node, + node->x + width, + node->y + height, + w, h); + if (unlikely (node->children[i] == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + i++; + } + } + + if (i < 4) + node->children[i] = NULL; + + node->state = CAIRO_RTREE_NODE_DIVIDED; + cairo_list_move (&node->link, &rtree->evictable); + node = node->children[0]; + } + + node->state = CAIRO_RTREE_NODE_OCCUPIED; + cairo_list_move (&node->link, &rtree->evictable); + *out = node; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_rtree_node_remove (cairo_rtree_t *rtree, cairo_rtree_node_t *node) +{ + assert (node->state == CAIRO_RTREE_NODE_OCCUPIED); + assert (node->pinned == FALSE); + + rtree->destroy (node); + + node->state = CAIRO_RTREE_NODE_AVAILABLE; + cairo_list_move (&node->link, &rtree->available); + + _cairo_rtree_node_collapse (rtree, node->parent); +} + +cairo_int_status_t +_cairo_rtree_insert (cairo_rtree_t *rtree, + int width, + int height, + cairo_rtree_node_t **out) +{ + cairo_rtree_node_t *node; + + cairo_list_foreach_entry (node, cairo_rtree_node_t, + &rtree->available, link) + { + if (node->width >= width && node->height >= height) + return _cairo_rtree_node_insert (rtree, node, width, height, out); + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + static uint32_t x; + return x = (x ^ rol (x, 5) ^ rol (x, 24)) + 0x37798849; +#undef rol +} + +cairo_int_status_t +_cairo_rtree_evict_random (cairo_rtree_t *rtree, + int width, + int height, + cairo_rtree_node_t **out) +{ + cairo_int_status_t ret = CAIRO_INT_STATUS_UNSUPPORTED; + cairo_rtree_node_t *node, *next; + cairo_list_t tmp_pinned; + int i, cnt; + + cairo_list_init (&tmp_pinned); + + /* propagate pinned from children to root */ + cairo_list_foreach_entry_safe (node, next, + cairo_rtree_node_t, &rtree->pinned, link) { + node = node->parent; + while (node && ! node->pinned) { + node->pinned = 1; + cairo_list_move (&node->link, &tmp_pinned); + node = node->parent; + } + } + + cnt = 0; + cairo_list_foreach_entry (node, cairo_rtree_node_t, + &rtree->evictable, link) + { + if (node->width >= width && node->height >= height) + cnt++; + } + + if (cnt == 0) + goto out; + + cnt = hars_petruska_f54_1_random () % cnt; + cairo_list_foreach_entry (node, cairo_rtree_node_t, + &rtree->evictable, link) + { + if (node->width >= width && node->height >= height && cnt-- == 0) { + if (node->state == CAIRO_RTREE_NODE_OCCUPIED) { + rtree->destroy (node); + } else { + for (i = 0; i < 4 && node->children[i] != NULL; i++) + _cairo_rtree_node_destroy (rtree, node->children[i]); + node->children[0] = NULL; + } + + node->state = CAIRO_RTREE_NODE_AVAILABLE; + cairo_list_move (&node->link, &rtree->available); + + *out = node; + ret = CAIRO_STATUS_SUCCESS; + break; + } + } + +out: + while (! cairo_list_is_empty (&tmp_pinned)) { + node = cairo_list_first_entry (&tmp_pinned, cairo_rtree_node_t, link); + node->pinned = 0; + cairo_list_move (&node->link, &rtree->evictable); + } + return ret; +} + +void +_cairo_rtree_unpin (cairo_rtree_t *rtree) +{ + while (! cairo_list_is_empty (&rtree->pinned)) { + cairo_rtree_node_t *node = cairo_list_first_entry (&rtree->pinned, + cairo_rtree_node_t, + link); + node->pinned = 0; + cairo_list_move (&node->link, &rtree->evictable); + } +} + +void +_cairo_rtree_init (cairo_rtree_t *rtree, + int width, + int height, + int min_size, + int node_size, + void (*destroy) (cairo_rtree_node_t *)) +{ + assert (node_size >= (int) sizeof (cairo_rtree_node_t)); + _cairo_freepool_init (&rtree->node_freepool, node_size); + + cairo_list_init (&rtree->available); + cairo_list_init (&rtree->pinned); + cairo_list_init (&rtree->evictable); + + rtree->min_size = min_size; + rtree->destroy = destroy; + + memset (&rtree->root, 0, sizeof (rtree->root)); + rtree->root.width = width; + rtree->root.height = height; + rtree->root.state = CAIRO_RTREE_NODE_AVAILABLE; + cairo_list_add (&rtree->root.link, &rtree->available); +} + +void +_cairo_rtree_reset (cairo_rtree_t *rtree) +{ + int i; + + if (rtree->root.state == CAIRO_RTREE_NODE_OCCUPIED) { + rtree->destroy (&rtree->root); + } else { + for (i = 0; i < 4 && rtree->root.children[i] != NULL; i++) + _cairo_rtree_node_destroy (rtree, rtree->root.children[i]); + rtree->root.children[0] = NULL; + } + + cairo_list_init (&rtree->available); + cairo_list_init (&rtree->evictable); + cairo_list_init (&rtree->pinned); + + rtree->root.state = CAIRO_RTREE_NODE_AVAILABLE; + rtree->root.pinned = FALSE; + cairo_list_add (&rtree->root.link, &rtree->available); +} + +static void +_cairo_rtree_node_foreach (cairo_rtree_node_t *node, + void (*func)(cairo_rtree_node_t *, void *data), + void *data) +{ + int i; + + for (i = 0; i < 4 && node->children[i] != NULL; i++) + _cairo_rtree_node_foreach(node->children[i], func, data); + + func(node, data); +} + +void +_cairo_rtree_foreach (cairo_rtree_t *rtree, + void (*func)(cairo_rtree_node_t *, void *data), + void *data) +{ + int i; + + if (rtree->root.state == CAIRO_RTREE_NODE_OCCUPIED) { + func(&rtree->root, data); + } else { + for (i = 0; i < 4 && rtree->root.children[i] != NULL; i++) + _cairo_rtree_node_foreach (rtree->root.children[i], func, data); + } +} + +void +_cairo_rtree_fini (cairo_rtree_t *rtree) +{ + int i; + + if (rtree->root.state == CAIRO_RTREE_NODE_OCCUPIED) { + rtree->destroy (&rtree->root); + } else { + for (i = 0; i < 4 && rtree->root.children[i] != NULL; i++) + _cairo_rtree_node_destroy (rtree, rtree->root.children[i]); + } + + _cairo_freepool_fini (&rtree->node_freepool); +} diff --git a/src/cairo-scaled-font-private.h b/src/cairo-scaled-font-private.h new file mode 100644 index 000000000..da7b34698 --- /dev/null +++ b/src/cairo-scaled-font-private.h @@ -0,0 +1,183 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SCALED_FONT_PRIVATE_H +#define CAIRO_SCALED_FONT_PRIVATE_H + +#include "cairo.h" + +#include "cairo-types-private.h" +#include "cairo-list-private.h" +#include "cairo-mutex-type-private.h" +#include "cairo-reference-count-private.h" + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_scaled_glyph_page cairo_scaled_glyph_page_t; + +struct _cairo_scaled_font { + /* For most cairo objects, the rule for multiple threads is that + * the user is responsible for any locking if the same object is + * manipulated from multiple threads simultaneously. + * + * However, with the caching that cairo does for scaled fonts, a + * user can easily end up with the same cairo_scaled_font object + * being manipulated from multiple threads without the user ever + * being aware of this, (and in fact, unable to control it). + * + * So, as a special exception, the cairo implementation takes care + * of all locking needed for cairo_scaled_font_t. Most of what is + * in the scaled font is immutable, (which is what allows for the + * sharing in the first place). The things that are modified and + * the locks protecting them are as follows: + * + * 1. The reference count (scaled_font->ref_count) + * + * Modifications to the reference count are protected by the + * _cairo_scaled_font_map_mutex. This is because the reference + * count of a scaled font is intimately related with the font + * map itself, (and the magic holdovers array). + * + * 2. The cache of glyphs (scaled_font->glyphs) + * 3. The backend private data (scaled_font->surface_backend, + * scaled_font->surface_private) + * + * Modifications to these fields are protected with locks on + * scaled_font->mutex in the generic scaled_font code. + */ + + cairo_hash_entry_t hash_entry; + + /* useful bits for _cairo_scaled_font_nil */ + cairo_status_t status; + cairo_reference_count_t ref_count; + cairo_user_data_array_t user_data; + + cairo_font_face_t *original_font_face; /* may be NULL */ + + /* hash key members */ + cairo_font_face_t *font_face; /* may be NULL */ + cairo_matrix_t font_matrix; /* font space => user space */ + cairo_matrix_t ctm; /* user space => device space */ + cairo_font_options_t options; + + unsigned int placeholder : 1; /* protected by fontmap mutex */ + unsigned int holdover : 1; + unsigned int finished : 1; + + /* "live" scaled_font members */ + cairo_matrix_t scale; /* font space => device space */ + cairo_matrix_t scale_inverse; /* device space => font space */ + double max_scale; /* maximum x/y expansion of scale */ + cairo_font_extents_t extents; /* user space */ + cairo_font_extents_t fs_extents; /* font space */ + + /* The mutex protects modification to all subsequent fields. */ + cairo_mutex_t mutex; + + cairo_hash_table_t *glyphs; + cairo_list_t glyph_pages; + cairo_bool_t cache_frozen; + cairo_bool_t global_cache_frozen; + + cairo_list_t dev_privates; + + /* font backend managing this scaled font */ + const cairo_scaled_font_backend_t *backend; + cairo_list_t link; +}; + +struct _cairo_scaled_font_private { + cairo_list_t link; + const void *key; + void (*destroy) (cairo_scaled_font_private_t *, + cairo_scaled_font_t *); +}; + +struct _cairo_scaled_glyph { + cairo_hash_entry_t hash_entry; + + cairo_text_extents_t metrics; /* user-space metrics */ + cairo_text_extents_t fs_metrics; /* font-space metrics */ + cairo_box_t bbox; /* device-space bounds */ + int16_t x_advance; /* device-space rounded X advance */ + int16_t y_advance; /* device-space rounded Y advance */ + + unsigned int has_info; + cairo_image_surface_t *surface; /* device-space image */ + cairo_path_fixed_t *path; /* device-space outline */ + cairo_surface_t *recording_surface; /* device-space recording-surface */ + + const void *dev_private_key; + void *dev_private; + cairo_list_t dev_privates; +}; + +struct _cairo_scaled_glyph_private { + cairo_list_t link; + const void *key; + void (*destroy) (cairo_scaled_glyph_private_t *, + cairo_scaled_glyph_t *, + cairo_scaled_font_t *); +}; + +cairo_private cairo_scaled_font_private_t * +_cairo_scaled_font_find_private (cairo_scaled_font_t *scaled_font, + const void *key); + +cairo_private void +_cairo_scaled_font_attach_private (cairo_scaled_font_t *scaled_font, + cairo_scaled_font_private_t *priv, + const void *key, + void (*destroy) (cairo_scaled_font_private_t *, + cairo_scaled_font_t *)); + +cairo_private cairo_scaled_glyph_private_t * +_cairo_scaled_glyph_find_private (cairo_scaled_glyph_t *scaled_glyph, + const void *key); + +cairo_private void +_cairo_scaled_glyph_attach_private (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_private_t *priv, + const void *key, + void (*destroy) (cairo_scaled_glyph_private_t *, + cairo_scaled_glyph_t *, + cairo_scaled_font_t *)); + +CAIRO_END_DECLS + +#endif /* CAIRO_SCALED_FONT_PRIVATE_H */ diff --git a/src/cairo-scaled-font-subsets-private.h b/src/cairo-scaled-font-subsets-private.h new file mode 100644 index 000000000..866e63d7b --- /dev/null +++ b/src/cairo-scaled-font-subsets-private.h @@ -0,0 +1,735 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H +#define CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H + +#include "cairoint.h" + +#if CAIRO_HAS_FONT_SUBSET + +typedef struct _cairo_scaled_font_subsets_glyph { + unsigned int font_id; + unsigned int subset_id; + unsigned int subset_glyph_index; + cairo_bool_t is_scaled; + cairo_bool_t is_composite; + cairo_bool_t is_latin; + double x_advance; + double y_advance; + cairo_bool_t utf8_is_mapped; + uint32_t unicode; +} cairo_scaled_font_subsets_glyph_t; + +/** + * _cairo_scaled_font_subsets_create_scaled: + * + * Create a new #cairo_scaled_font_subsets_t object which can be used + * to create subsets of any number of #cairo_scaled_font_t + * objects. This allows the (arbitrarily large and sparse) glyph + * indices of a #cairo_scaled_font_t to be mapped to one or more font + * subsets with glyph indices packed into the range + * [0 .. max_glyphs_per_subset). + * + * Return value: a pointer to the newly creates font subsets. The + * caller owns this object and should call + * _cairo_scaled_font_subsets_destroy() when done with it. + **/ +cairo_private cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_scaled (void); + +/** + * _cairo_scaled_font_subsets_create_simple: + * + * Create a new #cairo_scaled_font_subsets_t object which can be used + * to create font subsets suitable for embedding as Postscript or PDF + * simple fonts. + * + * Glyphs with an outline path available will be mapped to one font + * subset for each font face. Glyphs from bitmap fonts will mapped to + * separate font subsets for each #cairo_scaled_font_t object. + * + * The maximum number of glyphs per subset is 256. Each subset + * reserves the first glyph for the .notdef glyph. + * + * Return value: a pointer to the newly creates font subsets. The + * caller owns this object and should call + * _cairo_scaled_font_subsets_destroy() when done with it. + **/ +cairo_private cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_simple (void); + +/** + * _cairo_scaled_font_subsets_create_composite: + * + * Create a new #cairo_scaled_font_subsets_t object which can be used + * to create font subsets suitable for embedding as Postscript or PDF + * composite fonts. + * + * Glyphs with an outline path available will be mapped to one font + * subset for each font face. Each unscaled subset has a maximum of + * 65536 glyphs except for Type1 fonts which have a maximum of 256 glyphs. + * + * Glyphs from bitmap fonts will mapped to separate font subsets for + * each #cairo_scaled_font_t object. Each unscaled subset has a maximum + * of 256 glyphs. + * + * Each subset reserves the first glyph for the .notdef glyph. + * + * Return value: a pointer to the newly creates font subsets. The + * caller owns this object and should call + * _cairo_scaled_font_subsets_destroy() when done with it. + **/ +cairo_private cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_composite (void); + +/** + * _cairo_scaled_font_subsets_destroy: + * @font_subsets: a #cairo_scaled_font_subsets_t object to be destroyed + * + * Destroys @font_subsets and all resources associated with it. + **/ +cairo_private void +_cairo_scaled_font_subsets_destroy (cairo_scaled_font_subsets_t *font_subsets); + +/** + * _cairo_scaled_font_subsets_enable_latin_subset: + * @font_subsets: a #cairo_scaled_font_subsets_t object to be destroyed + * @use_latin: a #cairo_bool_t indicating if a latin subset is to be used + * + * If enabled, all CP1252 characters will be placed in a separate + * 8-bit latin subset. + **/ +cairo_private void +_cairo_scaled_font_subsets_enable_latin_subset (cairo_scaled_font_subsets_t *font_subsets, + cairo_bool_t use_latin); + +/** + * _cairo_scaled_font_subsets_map_glyph: + * @font_subsets: a #cairo_scaled_font_subsets_t + * @scaled_font: the font of the glyph to be mapped + * @scaled_font_glyph_index: the index of the glyph to be mapped + * @utf8: a string of text encoded in UTF-8 + * @utf8_len: length of @utf8 in bytes + * @subset_glyph_ret: return structure containing subset font and glyph id + * + * Map a glyph from a #cairo_scaled_font to a new index within a + * subset of that font. The mapping performed is from the tuple: + * + * (scaled_font, scaled_font_glyph_index) + * + * to the tuple: + * + * (font_id, subset_id, subset_glyph_index) + * + * This mapping is 1:1. If the input tuple has previously mapped, the + * the output tuple previously returned will be returned again. + * + * Otherwise, the return tuple will be constructed as follows: + * + * 1) There is a 1:1 correspondence between the input scaled_font + * value and the output font_id value. If no mapping has been + * previously performed with the scaled_font value then the + * smallest unused font_id value will be returned. + * + * 2) Within the set of output tuples of the same font_id value the + * smallest value of subset_id will be returned such that + * subset_glyph_index does not exceed max_glyphs_per_subset (as + * passed to _cairo_scaled_font_subsets_create()) and that the + * resulting tuple is unique. + * + * 3) The smallest value of subset_glyph_index is returned such that + * the resulting tuple is unique. + * + * The net result is that any #cairo_scaled_font_t will be represented + * by one or more font subsets. Each subset is effectively a tuple of + * (scaled_font, font_id, subset_id) and within each subset there + * exists a mapping of scaled_glyph_font_index to subset_glyph_index. + * + * This final description of a font subset is the same representation + * used by #cairo_scaled_font_subset_t as provided by + * _cairo_scaled_font_subsets_foreach. + * + * @utf8 and @utf8_len specify a string of unicode characters that the + * glyph @scaled_font_glyph_index maps to. If @utf8_is_mapped in + * @subset_glyph_ret is %TRUE, the font subsetting will (where index to + * unicode mapping is supported) ensure that @scaled_font_glyph_index + * maps to @utf8. If @utf8_is_mapped is %FALSE, + * @scaled_font_glyph_index has already been mapped to a different + * unicode string. + * + * The returned values in the #cairo_scaled_font_subsets_glyph_t struct are: + * + * @font_id: The font ID of the mapped glyph + * @subset_id : The subset ID of the mapped glyph within the @font_id + * @subset_glyph_index: The index of the mapped glyph within the @subset_id subset + * @is_scaled: If true, the mapped glyph is from a bitmap font, and separate font + * subset is created for each font scale used. If false, the outline of the mapped glyph + * is available. One font subset for each font face is created. + * @x_advance, @y_advance: When @is_scaled is true, @x_advance and @y_advance contain + * the x and y advance for the mapped glyph in device space. + * When @is_scaled is false, @x_advance and @y_advance contain the x and y advance for + * the the mapped glyph from an unhinted 1 point font. + * @utf8_is_mapped: If true the utf8 string provided to _cairo_scaled_font_subsets_map_glyph() + * is (or already was) the utf8 string mapped to this glyph. If false the glyph is already + * mapped to a different utf8 string. + * @unicode: the unicode character mapped to this glyph by the font backend. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero + * value indicating an error. Possible errors include + * %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_scaled_font_subsets_map_glyph (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_t *scaled_font, + unsigned long scaled_font_glyph_index, + const char * utf8, + int utf8_len, + cairo_scaled_font_subsets_glyph_t *subset_glyph_ret); + +typedef cairo_int_status_t +(*cairo_scaled_font_subset_callback_func_t) (cairo_scaled_font_subset_t *font_subset, + void *closure); + +/** + * _cairo_scaled_font_subsets_foreach_scaled: + * @font_subsets: a #cairo_scaled_font_subsets_t + * @font_subset_callback: a function to be called for each font subset + * @closure: closure data for the callback function + * + * Iterate over each unique scaled font subset as created by calls to + * _cairo_scaled_font_subsets_map_glyph(). A subset is determined by + * unique pairs of (font_id, subset_id) as returned by + * _cairo_scaled_font_subsets_map_glyph(). + * + * For each subset, @font_subset_callback will be called and will be + * provided with both a #cairo_scaled_font_subset_t object containing + * all the glyphs in the subset as well as the value of @closure. + * + * The #cairo_scaled_font_subset_t object contains the scaled_font, + * the font_id, and the subset_id corresponding to all glyphs + * belonging to the subset. In addition, it contains an array providing + * a mapping between subset glyph indices and the original scaled font + * glyph indices. + * + * The index of the array corresponds to subset_glyph_index values + * returned by _cairo_scaled_font_subsets_map_glyph() while the + * values of the array correspond to the scaled_font_glyph_index + * values passed as input to the same function. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero + * value indicating an error. Possible errors include + * %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_scaled_font_subsets_foreach_scaled (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure); + +/** + * _cairo_scaled_font_subsets_foreach_unscaled: + * @font_subsets: a #cairo_scaled_font_subsets_t + * @font_subset_callback: a function to be called for each font subset + * @closure: closure data for the callback function + * + * Iterate over each unique unscaled font subset as created by calls to + * _cairo_scaled_font_subsets_map_glyph(). A subset is determined by + * unique pairs of (font_id, subset_id) as returned by + * _cairo_scaled_font_subsets_map_glyph(). + * + * For each subset, @font_subset_callback will be called and will be + * provided with both a #cairo_scaled_font_subset_t object containing + * all the glyphs in the subset as well as the value of @closure. + * + * The #cairo_scaled_font_subset_t object contains the scaled_font, + * the font_id, and the subset_id corresponding to all glyphs + * belonging to the subset. In addition, it contains an array providing + * a mapping between subset glyph indices and the original scaled font + * glyph indices. + * + * The index of the array corresponds to subset_glyph_index values + * returned by _cairo_scaled_font_subsets_map_glyph() while the + * values of the array correspond to the scaled_font_glyph_index + * values passed as input to the same function. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero + * value indicating an error. Possible errors include + * %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_scaled_font_subsets_foreach_unscaled (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure); + +/** + * _cairo_scaled_font_subsets_foreach_user: + * @font_subsets: a #cairo_scaled_font_subsets_t + * @font_subset_callback: a function to be called for each font subset + * @closure: closure data for the callback function + * + * Iterate over each unique scaled font subset as created by calls to + * _cairo_scaled_font_subsets_map_glyph(). A subset is determined by + * unique pairs of (font_id, subset_id) as returned by + * _cairo_scaled_font_subsets_map_glyph(). + * + * For each subset, @font_subset_callback will be called and will be + * provided with both a #cairo_scaled_font_subset_t object containing + * all the glyphs in the subset as well as the value of @closure. + * + * The #cairo_scaled_font_subset_t object contains the scaled_font, + * the font_id, and the subset_id corresponding to all glyphs + * belonging to the subset. In addition, it contains an array providing + * a mapping between subset glyph indices and the original scaled font + * glyph indices. + * + * The index of the array corresponds to subset_glyph_index values + * returned by _cairo_scaled_font_subsets_map_glyph() while the + * values of the array correspond to the scaled_font_glyph_index + * values passed as input to the same function. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero + * value indicating an error. Possible errors include + * %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_scaled_font_subsets_foreach_user (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure); + +/** + * _cairo_scaled_font_subset_create_glyph_names: + * @font_subsets: a #cairo_scaled_font_subsets_t + * + * Create an array of strings containing the glyph name for each glyph + * in @font_subsets. The array as store in font_subsets->glyph_names. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font backend does not support + * mapping the glyph indices to unicode characters. Possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_int_status_t +_cairo_scaled_font_subset_create_glyph_names (cairo_scaled_font_subset_t *subset); + +typedef struct _cairo_cff_subset { + char *family_name_utf8; + char *ps_name; + double *widths; + double x_min, y_min, x_max, y_max; + double ascent, descent; + char *data; + unsigned long data_length; +} cairo_cff_subset_t; + +/** + * _cairo_cff_subset_init: + * @cff_subset: a #cairo_cff_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a + * cff file corresponding to @font_subset and initialize + * @cff_subset with information about the subset and the cff + * data. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a + * cff file, or an non-zero value indicating an error. Possible + * errors include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_cff_subset_init (cairo_cff_subset_t *cff_subset, + const char *name, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_cff_subset_fini: + * @cff_subset: a #cairo_cff_subset_t + * + * Free all resources associated with @cff_subset. After this + * call, @cff_subset should not be used again without a + * subsequent call to _cairo_cff_subset_init() again first. + **/ +cairo_private void +_cairo_cff_subset_fini (cairo_cff_subset_t *cff_subset); + +/** + * _cairo_cff_scaled_font_is_cid_cff: + * @scaled_font: a #cairo_scaled_font_t + * + * Return %TRUE if @scaled_font is a CID CFF font, otherwise return %FALSE. + **/ +cairo_private cairo_bool_t +_cairo_cff_scaled_font_is_cid_cff (cairo_scaled_font_t *scaled_font); + +/** + * _cairo_cff_fallback_init: + * @cff_subset: a #cairo_cff_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a cff + * file corresponding to @font_subset and initialize @cff_subset + * with information about the subset and the cff data. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a + * cff file, or an non-zero value indicating an error. Possible + * errors include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_cff_fallback_init (cairo_cff_subset_t *cff_subset, + const char *name, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_cff_fallback_fini: + * @cff_subset: a #cairo_cff_subset_t + * + * Free all resources associated with @cff_subset. After this + * call, @cff_subset should not be used again without a + * subsequent call to _cairo_cff_subset_init() again first. + **/ +cairo_private void +_cairo_cff_fallback_fini (cairo_cff_subset_t *cff_subset); + +typedef struct _cairo_truetype_subset { + char *family_name_utf8; + char *ps_name; + double *widths; + double x_min, y_min, x_max, y_max; + double ascent, descent; + unsigned char *data; + unsigned long data_length; + unsigned long *string_offsets; + unsigned long num_string_offsets; +} cairo_truetype_subset_t; + +/** + * _cairo_truetype_subset_init_ps: + * @truetype_subset: a #cairo_truetype_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a + * truetype file corresponding to @font_subset and initialize + * @truetype_subset with information about the subset and the truetype + * data. The generated font will be suitable for embedding in + * PostScript. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a + * truetype file, or an non-zero value indicating an error. Possible + * errors include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_truetype_subset_init_ps (cairo_truetype_subset_t *truetype_subset, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_truetype_subset_init_pdf: + * @truetype_subset: a #cairo_truetype_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a + * truetype file corresponding to @font_subset and initialize + * @truetype_subset with information about the subset and the truetype + * data. The generated font will be suitable for embedding in + * PDF. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a + * truetype file, or an non-zero value indicating an error. Possible + * errors include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_truetype_subset_init_pdf (cairo_truetype_subset_t *truetype_subset, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_truetype_subset_fini: + * @truetype_subset: a #cairo_truetype_subset_t + * + * Free all resources associated with @truetype_subset. After this + * call, @truetype_subset should not be used again without a + * subsequent call to _cairo_truetype_subset_init() again first. + **/ +cairo_private void +_cairo_truetype_subset_fini (cairo_truetype_subset_t *truetype_subset); + +cairo_private const char * +_cairo_ps_standard_encoding_to_glyphname (int glyph); + +cairo_private int +_cairo_unicode_to_winansi (unsigned long unicode); + +cairo_private const char * +_cairo_winansi_to_glyphname (int glyph); + +typedef struct _cairo_type1_subset { + char *base_font; + double *widths; + double x_min, y_min, x_max, y_max; + double ascent, descent; + char *data; + unsigned long header_length; + unsigned long data_length; + unsigned long trailer_length; +} cairo_type1_subset_t; + + +/** + * _cairo_type1_subset_init: + * @type1_subset: a #cairo_type1_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * @hex_encode: if true the encrypted portion of the font is hex encoded + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a type1 + * file corresponding to @font_subset and initialize @type1_subset + * with information about the subset and the type1 data. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type1 + * file, or an non-zero value indicating an error. Possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_type1_subset_init (cairo_type1_subset_t *type_subset, + const char *name, + cairo_scaled_font_subset_t *font_subset, + cairo_bool_t hex_encode); + +/** + * _cairo_type1_subset_fini: + * @type1_subset: a #cairo_type1_subset_t + * + * Free all resources associated with @type1_subset. After this call, + * @type1_subset should not be used again without a subsequent call to + * _cairo_truetype_type1_init() again first. + **/ +cairo_private void +_cairo_type1_subset_fini (cairo_type1_subset_t *subset); + +/** + * _cairo_type1_scaled_font_is_type1: + * @scaled_font: a #cairo_scaled_font_t + * + * Return %TRUE if @scaled_font is a Type 1 font, otherwise return %FALSE. + **/ +cairo_private cairo_bool_t +_cairo_type1_scaled_font_is_type1 (cairo_scaled_font_t *scaled_font); + +/** + * _cairo_type1_fallback_init_binary: + * @type1_subset: a #cairo_type1_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a type1 + * file corresponding to @font_subset and initialize @type1_subset + * with information about the subset and the type1 data. The encrypted + * part of the font is binary encoded. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type1 + * file, or an non-zero value indicating an error. Possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_type1_fallback_init_binary (cairo_type1_subset_t *type_subset, + const char *name, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_type1_fallback_init_hex: + * @type1_subset: a #cairo_type1_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate a type1 + * file corresponding to @font_subset and initialize @type1_subset + * with information about the subset and the type1 data. The encrypted + * part of the font is hex encoded. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type1 + * file, or an non-zero value indicating an error. Possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_type1_fallback_init_hex (cairo_type1_subset_t *type_subset, + const char *name, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_type1_fallback_fini: + * @type1_subset: a #cairo_type1_subset_t + * + * Free all resources associated with @type1_subset. After this call, + * @type1_subset should not be used again without a subsequent call to + * _cairo_truetype_type1_init() again first. + **/ +cairo_private void +_cairo_type1_fallback_fini (cairo_type1_subset_t *subset); + +typedef struct _cairo_type2_charstrings { + int *widths; + long x_min, y_min, x_max, y_max; + long ascent, descent; + cairo_array_t charstrings; +} cairo_type2_charstrings_t; + +/** + * _cairo_type2_charstrings_init: + * @type2_subset: a #cairo_type2_subset_t to initialize + * @font_subset: the #cairo_scaled_font_subset_t to initialize from + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) generate type2 + * charstrings to @font_subset and initialize @type2_subset + * with information about the subset. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type2 + * charstrings, or an non-zero value indicating an error. Possible errors + * include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_status_t +_cairo_type2_charstrings_init (cairo_type2_charstrings_t *charstrings, + cairo_scaled_font_subset_t *font_subset); + +/** + * _cairo_type2_charstrings_fini: + * @subset: a #cairo_type2_charstrings_t + * + * Free all resources associated with @type2_charstring. After this call, + * @type2_charstring should not be used again without a subsequent call to + * _cairo_type2_charstring_init() again first. + **/ +cairo_private void +_cairo_type2_charstrings_fini (cairo_type2_charstrings_t *charstrings); + +/** + * _cairo_truetype_index_to_ucs4: + * @scaled_font: the #cairo_scaled_font_t + * @index: the glyph index + * @ucs4: return value for the unicode value of the glyph + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) assign + * the unicode character of the glyph to @ucs4. + * + * If mapping glyph indices to unicode is supported but the unicode + * value of the specified glyph is not available, @ucs4 is set to -1. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if mapping glyph indices to unicode + * is not supported. Possible errors include %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_int_status_t +_cairo_truetype_index_to_ucs4 (cairo_scaled_font_t *scaled_font, + unsigned long index, + uint32_t *ucs4); + +/** + * _cairo_truetype_read_font_name: + * @scaled_font: the #cairo_scaled_font_t + * @ps_name: returns the PostScript name of the font + * or %NULL if the name could not be found. + * @font_name: returns the font name or %NULL if the name could not be found. + * + * If possible (depending on the format of the underlying + * #cairo_scaled_font_t and the font backend in use) read the + * PostScript and Font names from a TrueType/OpenType font. + * + * The font name is the full name of the font eg "DejaVu Sans Bold". + * The PostScript name is a shortened name with spaces removed + * suitable for use as the font name in a PS or PDF file eg + * "DejaVuSans-Bold". + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font is not TrueType/OpenType + * or the name table is not present. Possible errors include + * %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_int_status_t +_cairo_truetype_read_font_name (cairo_scaled_font_t *scaled_font, + char **ps_name, + char **font_name); + +/** + * _cairo_truetype_get_style: + * @scaled_font: the #cairo_scaled_font_t + * @weight: returns the font weight from the OS/2 table + * @bold: returns true if font is bold + * @italic: returns true if font is italic + * + * If the font is a truetype/opentype font with an OS/2 table, get the + * weight, bold, and italic data from the OS/2 table. The weight + * values have the same meaning as the lfWeight field of the Windows + * LOGFONT structure. Refer to the TrueType Specification for + * definition of the weight values. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful, + * %CAIRO_INT_STATUS_UNSUPPORTED if the font is not TrueType/OpenType + * or the OS/2 table is not present. + **/ +cairo_private cairo_int_status_t +_cairo_truetype_get_style (cairo_scaled_font_t *scaled_font, + int *weight, + cairo_bool_t *bold, + cairo_bool_t *italic); + +/** + * _cairo_escape_ps_name: + * @ps_name: returns the PostScript name with all invalid characters escaped + * + * Ensure that PostSript name is a valid PDF/PostSript name object. + * In PDF names are treated as UTF8 and non ASCII bytes, ' ', + * and '#' are encoded as '#' followed by 2 hex digits that + * encode the byte. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful. Possible errors include + * %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_private cairo_int_status_t +_cairo_escape_ps_name (char **ps_name); + +#endif /* CAIRO_HAS_FONT_SUBSET */ + +#endif /* CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H */ diff --git a/src/cairo-scaled-font-subsets.c b/src/cairo-scaled-font-subsets.c new file mode 100644 index 000000000..212176183 --- /dev/null +++ b/src/cairo-scaled-font-subsets.c @@ -0,0 +1,1299 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2003 University of Southern California + * Copyright © 2005 Red Hat, Inc + * Copyright © 2006 Keith Packard + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Kristian Høgsberg + * Keith Packard + * Adrian Johnson + */ + +#define _BSD_SOURCE /* for snprintf(), strdup() */ +#include "cairoint.h" +#include "cairo-error-private.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-user-font-private.h" + +#define MAX_GLYPHS_PER_SIMPLE_FONT 256 +#define MAX_GLYPHS_PER_COMPOSITE_FONT 65536 + +typedef enum { + CAIRO_SUBSETS_SCALED, + CAIRO_SUBSETS_SIMPLE, + CAIRO_SUBSETS_COMPOSITE +} cairo_subsets_type_t; + +typedef enum { + CAIRO_SUBSETS_FOREACH_UNSCALED, + CAIRO_SUBSETS_FOREACH_SCALED, + CAIRO_SUBSETS_FOREACH_USER +} cairo_subsets_foreach_type_t; + +typedef struct _cairo_sub_font { + cairo_hash_entry_t base; + + cairo_bool_t is_scaled; + cairo_bool_t is_composite; + cairo_bool_t is_user; + cairo_bool_t use_latin_subset; + cairo_scaled_font_subsets_t *parent; + cairo_scaled_font_t *scaled_font; + unsigned int font_id; + + int current_subset; + int num_glyphs_in_current_subset; + int num_glyphs_in_latin_subset; + int max_glyphs_per_subset; + char latin_char_map[256]; + + cairo_hash_table_t *sub_font_glyphs; + struct _cairo_sub_font *next; +} cairo_sub_font_t; + +struct _cairo_scaled_font_subsets { + cairo_subsets_type_t type; + cairo_bool_t use_latin_subset; + + int max_glyphs_per_unscaled_subset_used; + cairo_hash_table_t *unscaled_sub_fonts; + cairo_sub_font_t *unscaled_sub_fonts_list; + cairo_sub_font_t *unscaled_sub_fonts_list_end; + + int max_glyphs_per_scaled_subset_used; + cairo_hash_table_t *scaled_sub_fonts; + cairo_sub_font_t *scaled_sub_fonts_list; + cairo_sub_font_t *scaled_sub_fonts_list_end; + + int num_sub_fonts; +}; + +typedef struct _cairo_sub_font_glyph { + cairo_hash_entry_t base; + + unsigned int subset_id; + unsigned int subset_glyph_index; + double x_advance; + double y_advance; + + cairo_bool_t is_latin; + int latin_character; + cairo_bool_t is_mapped; + uint32_t unicode; + char *utf8; + int utf8_len; +} cairo_sub_font_glyph_t; + +typedef struct _cairo_sub_font_collection { + unsigned long *glyphs; /* scaled_font_glyph_index */ + char **utf8; + unsigned int glyphs_size; + int *to_latin_char; + unsigned long *latin_to_subset_glyph_index; + unsigned int max_glyph; + unsigned int num_glyphs; + + unsigned int subset_id; + + cairo_status_t status; + cairo_scaled_font_subset_callback_func_t font_subset_callback; + void *font_subset_callback_closure; +} cairo_sub_font_collection_t; + +typedef struct _cairo_string_entry { + cairo_hash_entry_t base; + char *string; +} cairo_string_entry_t; + +static cairo_status_t +_cairo_sub_font_map_glyph (cairo_sub_font_t *sub_font, + unsigned long scaled_font_glyph_index, + const char * utf8, + int utf8_len, + cairo_scaled_font_subsets_glyph_t *subset_glyph); + +static void +_cairo_sub_font_glyph_init_key (cairo_sub_font_glyph_t *sub_font_glyph, + unsigned long scaled_font_glyph_index) +{ + sub_font_glyph->base.hash = scaled_font_glyph_index; +} + +static cairo_sub_font_glyph_t * +_cairo_sub_font_glyph_create (unsigned long scaled_font_glyph_index, + unsigned int subset_id, + unsigned int subset_glyph_index, + double x_advance, + double y_advance, + int latin_character, + uint32_t unicode, + char *utf8, + int utf8_len) +{ + cairo_sub_font_glyph_t *sub_font_glyph; + + sub_font_glyph = malloc (sizeof (cairo_sub_font_glyph_t)); + if (unlikely (sub_font_glyph == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + _cairo_sub_font_glyph_init_key (sub_font_glyph, scaled_font_glyph_index); + sub_font_glyph->subset_id = subset_id; + sub_font_glyph->subset_glyph_index = subset_glyph_index; + sub_font_glyph->x_advance = x_advance; + sub_font_glyph->y_advance = y_advance; + sub_font_glyph->is_latin = (latin_character >= 0); + sub_font_glyph->latin_character = latin_character; + sub_font_glyph->is_mapped = FALSE; + sub_font_glyph->unicode = unicode; + sub_font_glyph->utf8 = utf8; + sub_font_glyph->utf8_len = utf8_len; + + return sub_font_glyph; +} + +static void +_cairo_sub_font_glyph_destroy (cairo_sub_font_glyph_t *sub_font_glyph) +{ + free (sub_font_glyph->utf8); + + free (sub_font_glyph); +} + +static void +_cairo_sub_font_glyph_pluck (void *entry, void *closure) +{ + cairo_sub_font_glyph_t *sub_font_glyph = entry; + cairo_hash_table_t *sub_font_glyphs = closure; + + _cairo_hash_table_remove (sub_font_glyphs, &sub_font_glyph->base); + _cairo_sub_font_glyph_destroy (sub_font_glyph); +} + +static void +_cairo_sub_font_glyph_collect (void *entry, void *closure) +{ + cairo_sub_font_glyph_t *sub_font_glyph = entry; + cairo_sub_font_collection_t *collection = closure; + unsigned long scaled_font_glyph_index; + unsigned int subset_glyph_index; + + if (sub_font_glyph->subset_id != collection->subset_id) + return; + + scaled_font_glyph_index = sub_font_glyph->base.hash; + subset_glyph_index = sub_font_glyph->subset_glyph_index; + + /* Ensure we don't exceed the allocated bounds. */ + assert (subset_glyph_index < collection->glyphs_size); + + collection->glyphs[subset_glyph_index] = scaled_font_glyph_index; + collection->utf8[subset_glyph_index] = sub_font_glyph->utf8; + collection->to_latin_char[subset_glyph_index] = sub_font_glyph->latin_character; + if (sub_font_glyph->is_latin) + collection->latin_to_subset_glyph_index[sub_font_glyph->latin_character] = subset_glyph_index; + + if (subset_glyph_index > collection->max_glyph) + collection->max_glyph = subset_glyph_index; + + collection->num_glyphs++; +} + +static cairo_bool_t +_cairo_sub_fonts_equal (const void *key_a, const void *key_b) +{ + const cairo_sub_font_t *sub_font_a = key_a; + const cairo_sub_font_t *sub_font_b = key_b; + cairo_scaled_font_t *a = sub_font_a->scaled_font; + cairo_scaled_font_t *b = sub_font_b->scaled_font; + + if (sub_font_a->is_scaled) + return a == b; + else + return a->font_face == b->font_face || a->original_font_face == b->original_font_face; +} + +static void +_cairo_sub_font_init_key (cairo_sub_font_t *sub_font, + cairo_scaled_font_t *scaled_font) +{ + if (sub_font->is_scaled) + { + sub_font->base.hash = (unsigned long) scaled_font; + sub_font->scaled_font = scaled_font; + } + else + { + sub_font->base.hash = (unsigned long) scaled_font->font_face; + sub_font->scaled_font = scaled_font; + } +} + +static cairo_status_t +_cairo_sub_font_create (cairo_scaled_font_subsets_t *parent, + cairo_scaled_font_t *scaled_font, + unsigned int font_id, + int max_glyphs_per_subset, + cairo_bool_t is_scaled, + cairo_bool_t is_composite, + cairo_sub_font_t **sub_font_out) +{ + cairo_sub_font_t *sub_font; + int i; + + sub_font = malloc (sizeof (cairo_sub_font_t)); + if (unlikely (sub_font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + sub_font->is_scaled = is_scaled; + sub_font->is_composite = is_composite; + sub_font->is_user = _cairo_font_face_is_user (scaled_font->font_face); + _cairo_sub_font_init_key (sub_font, scaled_font); + + sub_font->parent = parent; + sub_font->scaled_font = scaled_font; + sub_font->font_id = font_id; + + sub_font->use_latin_subset = parent->use_latin_subset; + + /* latin subsets of Type 3 and CID CFF fonts are not supported */ + if (sub_font->is_user || sub_font->is_scaled || + _cairo_cff_scaled_font_is_cid_cff (scaled_font) ) + { + sub_font->use_latin_subset = FALSE; + } + + if (sub_font->use_latin_subset) + sub_font->current_subset = 1; /* reserve subset 0 for latin glyphs */ + else + sub_font->current_subset = 0; + + sub_font->num_glyphs_in_current_subset = 0; + sub_font->num_glyphs_in_latin_subset = 0; + sub_font->max_glyphs_per_subset = max_glyphs_per_subset; + for (i = 0; i < 256; i++) + sub_font->latin_char_map[i] = FALSE; + + sub_font->sub_font_glyphs = _cairo_hash_table_create (NULL); + if (unlikely (sub_font->sub_font_glyphs == NULL)) { + free (sub_font); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + sub_font->next = NULL; + *sub_font_out = sub_font; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_sub_font_destroy (cairo_sub_font_t *sub_font) +{ + _cairo_hash_table_foreach (sub_font->sub_font_glyphs, + _cairo_sub_font_glyph_pluck, + sub_font->sub_font_glyphs); + _cairo_hash_table_destroy (sub_font->sub_font_glyphs); + cairo_scaled_font_destroy (sub_font->scaled_font); + free (sub_font); +} + +static void +_cairo_sub_font_pluck (void *entry, void *closure) +{ + cairo_sub_font_t *sub_font = entry; + cairo_hash_table_t *sub_fonts = closure; + + _cairo_hash_table_remove (sub_fonts, &sub_font->base); + _cairo_sub_font_destroy (sub_font); +} + +/* Characters 0x80 to 0x9f in the winansi encoding. + * All other characters in the range 0x00 to 0xff map 1:1 to unicode */ +static unsigned int _winansi_0x80_to_0x9f[] = { + 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017d, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x017e, 0x0178 +}; + +int +_cairo_unicode_to_winansi (unsigned long uni) +{ + int i; + + /* exclude the extra "hyphen" at 0xad to avoid duplicate glyphnames */ + if ((uni >= 0x20 && uni <= 0x7e) || + (uni >= 0xa1 && uni <= 0xff && uni != 0xad) || + uni == 0) + return uni; + + for (i = 0; i < 32; i++) + if (_winansi_0x80_to_0x9f[i] == uni) + return i + 0x80; + + return -1; +} + +static cairo_status_t +_cairo_sub_font_glyph_lookup_unicode (cairo_scaled_font_t *scaled_font, + unsigned long scaled_font_glyph_index, + uint32_t *unicode_out, + char **utf8_out, + int *utf8_len_out) +{ + uint32_t unicode; + char buf[8]; + int len; + cairo_status_t status; + + /* Do a reverse lookup on the glyph index. unicode is -1 if the + * index could not be mapped to a unicode character. */ + unicode = -1; + status = _cairo_truetype_index_to_ucs4 (scaled_font, + scaled_font_glyph_index, + &unicode); + if (_cairo_status_is_error (status)) + return status; + + if (unicode == (uint32_t)-1 && scaled_font->backend->index_to_ucs4) { + status = scaled_font->backend->index_to_ucs4 (scaled_font, + scaled_font_glyph_index, + &unicode); + if (unlikely (status)) + return status; + } + + *unicode_out = unicode; + *utf8_out = NULL; + *utf8_len_out = 0; + if (unicode != (uint32_t) -1) { + len = _cairo_ucs4_to_utf8 (unicode, buf); + if (len > 0) { + *utf8_out = malloc (len + 1); + if (unlikely (*utf8_out == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (*utf8_out, buf, len); + (*utf8_out)[len] = 0; + *utf8_len_out = len; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_sub_font_glyph_map_to_unicode (cairo_sub_font_glyph_t *sub_font_glyph, + const char *utf8, + int utf8_len, + cairo_bool_t *is_mapped) +{ + *is_mapped = FALSE; + + if (utf8_len < 0) + return CAIRO_STATUS_SUCCESS; + + if (utf8 != NULL && utf8_len != 0 && utf8[utf8_len - 1] == '\0') + utf8_len--; + + if (utf8 != NULL && utf8_len != 0) { + if (sub_font_glyph->utf8 != NULL) { + if (utf8_len == sub_font_glyph->utf8_len && + memcmp (utf8, sub_font_glyph->utf8, utf8_len) == 0) + { + /* Requested utf8 mapping matches the existing mapping */ + *is_mapped = TRUE; + } + } else { + /* No existing mapping. Use the requested mapping */ + sub_font_glyph->utf8 = malloc (utf8_len + 1); + if (unlikely (sub_font_glyph->utf8 == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (sub_font_glyph->utf8, utf8, utf8_len); + sub_font_glyph->utf8[utf8_len] = 0; + sub_font_glyph->utf8_len = utf8_len; + *is_mapped = TRUE; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_sub_font_lookup_glyph (cairo_sub_font_t *sub_font, + unsigned long scaled_font_glyph_index, + const char *utf8, + int utf8_len, + cairo_scaled_font_subsets_glyph_t *subset_glyph) +{ + cairo_sub_font_glyph_t key, *sub_font_glyph; + cairo_int_status_t status; + + _cairo_sub_font_glyph_init_key (&key, scaled_font_glyph_index); + sub_font_glyph = _cairo_hash_table_lookup (sub_font->sub_font_glyphs, + &key.base); + if (sub_font_glyph != NULL) { + subset_glyph->font_id = sub_font->font_id; + subset_glyph->subset_id = sub_font_glyph->subset_id; + if (sub_font_glyph->is_latin) + subset_glyph->subset_glyph_index = sub_font_glyph->latin_character; + else + subset_glyph->subset_glyph_index = sub_font_glyph->subset_glyph_index; + + subset_glyph->is_scaled = sub_font->is_scaled; + subset_glyph->is_composite = sub_font->is_composite; + subset_glyph->is_latin = sub_font_glyph->is_latin; + subset_glyph->x_advance = sub_font_glyph->x_advance; + subset_glyph->y_advance = sub_font_glyph->y_advance; + status = _cairo_sub_font_glyph_map_to_unicode (sub_font_glyph, + utf8, utf8_len, + &subset_glyph->utf8_is_mapped); + subset_glyph->unicode = sub_font_glyph->unicode; + + return status; + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_status_t +_cairo_sub_font_add_glyph (cairo_sub_font_t *sub_font, + unsigned long scaled_font_glyph_index, + cairo_bool_t is_latin, + int latin_character, + uint32_t unicode, + char *utf8, + int utf8_len, + cairo_sub_font_glyph_t **sub_font_glyph_out) +{ + cairo_scaled_glyph_t *scaled_glyph; + cairo_sub_font_glyph_t *sub_font_glyph; + int *num_glyphs_in_subset_ptr; + double x_advance; + double y_advance; + cairo_int_status_t status; + + _cairo_scaled_font_freeze_cache (sub_font->scaled_font); + status = _cairo_scaled_glyph_lookup (sub_font->scaled_font, + scaled_font_glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + if (unlikely (status)) { + _cairo_scaled_font_thaw_cache (sub_font->scaled_font); + return status; + } + + x_advance = scaled_glyph->metrics.x_advance; + y_advance = scaled_glyph->metrics.y_advance; + _cairo_scaled_font_thaw_cache (sub_font->scaled_font); + + if (!is_latin && sub_font->num_glyphs_in_current_subset == sub_font->max_glyphs_per_subset) + { + sub_font->current_subset++; + sub_font->num_glyphs_in_current_subset = 0; + } + + if (is_latin) + num_glyphs_in_subset_ptr = &sub_font->num_glyphs_in_latin_subset; + else + num_glyphs_in_subset_ptr = &sub_font->num_glyphs_in_current_subset; + + /* Reserve first glyph in subset for the .notdef glyph except for + * Type 3 fonts */ + if (*num_glyphs_in_subset_ptr == 0 && + scaled_font_glyph_index != 0 && + ! _cairo_font_face_is_user (sub_font->scaled_font->font_face)) + { + status = _cairo_sub_font_add_glyph (sub_font, + 0, + is_latin, + 0, + 0, + NULL, + -1, + &sub_font_glyph); + if (unlikely (status)) + return status; + } + + sub_font_glyph = _cairo_sub_font_glyph_create (scaled_font_glyph_index, + is_latin ? 0 : sub_font->current_subset, + *num_glyphs_in_subset_ptr, + x_advance, + y_advance, + is_latin ? latin_character : -1, + unicode, + utf8, + utf8_len); + + if (unlikely (sub_font_glyph == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_hash_table_insert (sub_font->sub_font_glyphs, &sub_font_glyph->base); + if (unlikely (status)) { + _cairo_sub_font_glyph_destroy (sub_font_glyph); + return status; + } + + (*num_glyphs_in_subset_ptr)++; + if (sub_font->is_scaled) { + if (*num_glyphs_in_subset_ptr > sub_font->parent->max_glyphs_per_scaled_subset_used) + sub_font->parent->max_glyphs_per_scaled_subset_used = *num_glyphs_in_subset_ptr; + } else { + if (*num_glyphs_in_subset_ptr > sub_font->parent->max_glyphs_per_unscaled_subset_used) + sub_font->parent->max_glyphs_per_unscaled_subset_used = *num_glyphs_in_subset_ptr; + } + + *sub_font_glyph_out = sub_font_glyph; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_sub_font_map_glyph (cairo_sub_font_t *sub_font, + unsigned long scaled_font_glyph_index, + const char *text_utf8, + int text_utf8_len, + cairo_scaled_font_subsets_glyph_t *subset_glyph) +{ + cairo_sub_font_glyph_t key, *sub_font_glyph; + cairo_status_t status; + + _cairo_sub_font_glyph_init_key (&key, scaled_font_glyph_index); + sub_font_glyph = _cairo_hash_table_lookup (sub_font->sub_font_glyphs, + &key.base); + if (sub_font_glyph == NULL) { + uint32_t font_unicode; + char *font_utf8; + int font_utf8_len; + cairo_bool_t is_latin; + int latin_character; + + status = _cairo_sub_font_glyph_lookup_unicode (sub_font->scaled_font, + scaled_font_glyph_index, + &font_unicode, + &font_utf8, + &font_utf8_len); + if (unlikely(status)) + return status; + + /* If the supplied utf8 is a valid single character, use it + * instead of the font lookup */ + if (text_utf8 != NULL && text_utf8_len > 0) { + uint32_t *ucs4; + int ucs4_len; + + status = _cairo_utf8_to_ucs4 (text_utf8, text_utf8_len, + &ucs4, &ucs4_len); + if (status == CAIRO_STATUS_SUCCESS) { + if (ucs4_len == 1) { + font_unicode = ucs4[0]; + free (font_utf8); + font_utf8 = malloc (text_utf8_len + 1); + if (font_utf8 == NULL) { + free (ucs4); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + memcpy (font_utf8, text_utf8, text_utf8_len); + font_utf8[text_utf8_len] = 0; + font_utf8_len = text_utf8_len; + } + free (ucs4); + } + } + + /* If glyph is in the winansi encoding and font is not a user + * font, put glyph in the latin subset. If glyph is .notdef + * the latin subset is preferred but only if the latin subset + * already contains at least one glyph. We don't want to + * create a separate subset just for the .notdef glyph. + */ + is_latin = FALSE; + latin_character = -1; + if (sub_font->use_latin_subset && + (! _cairo_font_face_is_user (sub_font->scaled_font->font_face))) + { + latin_character = _cairo_unicode_to_winansi (font_unicode); + if (latin_character > 0 || + (latin_character == 0 && sub_font->num_glyphs_in_latin_subset > 0)) + { + if (!sub_font->latin_char_map[latin_character]) { + sub_font->latin_char_map[latin_character] = TRUE; + is_latin = TRUE; + } + } + } + + status = _cairo_sub_font_add_glyph (sub_font, + scaled_font_glyph_index, + is_latin, + latin_character, + font_unicode, + font_utf8, + font_utf8_len, + &sub_font_glyph); + if (unlikely(status)) + return status; + } + + subset_glyph->font_id = sub_font->font_id; + subset_glyph->subset_id = sub_font_glyph->subset_id; + if (sub_font_glyph->is_latin) + subset_glyph->subset_glyph_index = sub_font_glyph->latin_character; + else + subset_glyph->subset_glyph_index = sub_font_glyph->subset_glyph_index; + + subset_glyph->is_scaled = sub_font->is_scaled; + subset_glyph->is_composite = sub_font->is_composite; + subset_glyph->is_latin = sub_font_glyph->is_latin; + subset_glyph->x_advance = sub_font_glyph->x_advance; + subset_glyph->y_advance = sub_font_glyph->y_advance; + status = _cairo_sub_font_glyph_map_to_unicode (sub_font_glyph, + text_utf8, text_utf8_len, + &subset_glyph->utf8_is_mapped); + subset_glyph->unicode = sub_font_glyph->unicode; + + return status; +} + +static void +_cairo_sub_font_collect (void *entry, void *closure) +{ + cairo_sub_font_t *sub_font = entry; + cairo_sub_font_collection_t *collection = closure; + cairo_scaled_font_subset_t subset; + int i; + unsigned int j; + + if (collection->status) + return; + + collection->status = sub_font->scaled_font->status; + if (collection->status) + return; + + for (i = 0; i <= sub_font->current_subset; i++) { + collection->subset_id = i; + collection->num_glyphs = 0; + collection->max_glyph = 0; + memset (collection->latin_to_subset_glyph_index, 0, 256*sizeof(unsigned long)); + + _cairo_hash_table_foreach (sub_font->sub_font_glyphs, + _cairo_sub_font_glyph_collect, collection); + if (collection->status) + break; + if (collection->num_glyphs == 0) + continue; + + /* Ensure the resulting array has no uninitialized holes */ + assert (collection->num_glyphs == collection->max_glyph + 1); + + subset.scaled_font = sub_font->scaled_font; + subset.is_composite = sub_font->is_composite; + subset.is_scaled = sub_font->is_scaled; + subset.font_id = sub_font->font_id; + subset.subset_id = i; + subset.glyphs = collection->glyphs; + subset.utf8 = collection->utf8; + subset.num_glyphs = collection->num_glyphs; + subset.glyph_names = NULL; + + subset.is_latin = FALSE; + if (sub_font->use_latin_subset && i == 0) { + subset.is_latin = TRUE; + subset.to_latin_char = collection->to_latin_char; + subset.latin_to_subset_glyph_index = collection->latin_to_subset_glyph_index; + } else { + subset.to_latin_char = NULL; + subset.latin_to_subset_glyph_index = NULL; + } + + collection->status = (collection->font_subset_callback) (&subset, + collection->font_subset_callback_closure); + + if (subset.glyph_names != NULL) { + for (j = 0; j < collection->num_glyphs; j++) + free (subset.glyph_names[j]); + free (subset.glyph_names); + } + + if (collection->status) + break; + } +} + +static cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_internal (cairo_subsets_type_t type) +{ + cairo_scaled_font_subsets_t *subsets; + + subsets = malloc (sizeof (cairo_scaled_font_subsets_t)); + if (unlikely (subsets == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + subsets->type = type; + subsets->use_latin_subset = FALSE; + subsets->max_glyphs_per_unscaled_subset_used = 0; + subsets->max_glyphs_per_scaled_subset_used = 0; + subsets->num_sub_fonts = 0; + + subsets->unscaled_sub_fonts = _cairo_hash_table_create (_cairo_sub_fonts_equal); + if (! subsets->unscaled_sub_fonts) { + free (subsets); + return NULL; + } + subsets->unscaled_sub_fonts_list = NULL; + subsets->unscaled_sub_fonts_list_end = NULL; + + subsets->scaled_sub_fonts = _cairo_hash_table_create (_cairo_sub_fonts_equal); + if (! subsets->scaled_sub_fonts) { + _cairo_hash_table_destroy (subsets->unscaled_sub_fonts); + free (subsets); + return NULL; + } + subsets->scaled_sub_fonts_list = NULL; + subsets->scaled_sub_fonts_list_end = NULL; + + return subsets; +} + +cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_scaled (void) +{ + return _cairo_scaled_font_subsets_create_internal (CAIRO_SUBSETS_SCALED); +} + +cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_simple (void) +{ + return _cairo_scaled_font_subsets_create_internal (CAIRO_SUBSETS_SIMPLE); +} + +cairo_scaled_font_subsets_t * +_cairo_scaled_font_subsets_create_composite (void) +{ + return _cairo_scaled_font_subsets_create_internal (CAIRO_SUBSETS_COMPOSITE); +} + +void +_cairo_scaled_font_subsets_destroy (cairo_scaled_font_subsets_t *subsets) +{ + _cairo_hash_table_foreach (subsets->scaled_sub_fonts, _cairo_sub_font_pluck, subsets->scaled_sub_fonts); + _cairo_hash_table_destroy (subsets->scaled_sub_fonts); + + _cairo_hash_table_foreach (subsets->unscaled_sub_fonts, _cairo_sub_font_pluck, subsets->unscaled_sub_fonts); + _cairo_hash_table_destroy (subsets->unscaled_sub_fonts); + + free (subsets); +} + +void +_cairo_scaled_font_subsets_enable_latin_subset (cairo_scaled_font_subsets_t *font_subsets, + cairo_bool_t use_latin) +{ + font_subsets->use_latin_subset = use_latin; +} + +cairo_status_t +_cairo_scaled_font_subsets_map_glyph (cairo_scaled_font_subsets_t *subsets, + cairo_scaled_font_t *scaled_font, + unsigned long scaled_font_glyph_index, + const char * utf8, + int utf8_len, + cairo_scaled_font_subsets_glyph_t *subset_glyph) +{ + cairo_sub_font_t key, *sub_font; + cairo_scaled_glyph_t *scaled_glyph; + cairo_font_face_t *font_face; + cairo_matrix_t identity; + cairo_font_options_t font_options; + cairo_scaled_font_t *unscaled_font; + cairo_int_status_t status; + int max_glyphs; + cairo_bool_t type1_font; + + /* Lookup glyph in unscaled subsets */ + if (subsets->type != CAIRO_SUBSETS_SCALED) { + key.is_scaled = FALSE; + _cairo_sub_font_init_key (&key, scaled_font); + sub_font = _cairo_hash_table_lookup (subsets->unscaled_sub_fonts, + &key.base); + if (sub_font != NULL) { + status = _cairo_sub_font_lookup_glyph (sub_font, + scaled_font_glyph_index, + utf8, utf8_len, + subset_glyph); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + } + + /* Lookup glyph in scaled subsets */ + key.is_scaled = TRUE; + _cairo_sub_font_init_key (&key, scaled_font); + sub_font = _cairo_hash_table_lookup (subsets->scaled_sub_fonts, + &key.base); + if (sub_font != NULL) { + status = _cairo_sub_font_lookup_glyph (sub_font, + scaled_font_glyph_index, + utf8, utf8_len, + subset_glyph); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + /* Glyph not found. Determine whether the glyph is outline or + * bitmap and add to the appropriate subset. + * + * glyph_index 0 (the .notdef glyph) is a special case. Some fonts + * will return CAIRO_INT_STATUS_UNSUPPORTED when doing a + * _scaled_glyph_lookup(_GLYPH_INFO_PATH). Type1-fallback creates + * empty glyphs in this case so we can put the glyph in a unscaled + * subset. */ + if (scaled_font_glyph_index == 0 || + _cairo_font_face_is_user (scaled_font->font_face)) { + status = CAIRO_STATUS_SUCCESS; + } else { + _cairo_scaled_font_freeze_cache (scaled_font); + status = _cairo_scaled_glyph_lookup (scaled_font, + scaled_font_glyph_index, + CAIRO_SCALED_GLYPH_INFO_PATH, + &scaled_glyph); + _cairo_scaled_font_thaw_cache (scaled_font); + } + if (_cairo_int_status_is_error (status)) + return status; + + if (status == CAIRO_INT_STATUS_SUCCESS && + subsets->type != CAIRO_SUBSETS_SCALED && + ! _cairo_font_face_is_user (scaled_font->font_face)) + { + /* Path available. Add to unscaled subset. */ + key.is_scaled = FALSE; + _cairo_sub_font_init_key (&key, scaled_font); + sub_font = _cairo_hash_table_lookup (subsets->unscaled_sub_fonts, + &key.base); + if (sub_font == NULL) { + font_face = cairo_scaled_font_get_font_face (scaled_font); + cairo_matrix_init_identity (&identity); + _cairo_font_options_init_default (&font_options); + cairo_font_options_set_hint_style (&font_options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (&font_options, CAIRO_HINT_METRICS_OFF); + unscaled_font = cairo_scaled_font_create (font_face, + &identity, + &identity, + &font_options); + if (unlikely (unscaled_font->status)) + return unscaled_font->status; + + subset_glyph->is_scaled = FALSE; + type1_font = _cairo_type1_scaled_font_is_type1 (unscaled_font); + if (subsets->type == CAIRO_SUBSETS_COMPOSITE && !type1_font) { + max_glyphs = MAX_GLYPHS_PER_COMPOSITE_FONT; + subset_glyph->is_composite = TRUE; + } else { + max_glyphs = MAX_GLYPHS_PER_SIMPLE_FONT; + subset_glyph->is_composite = FALSE; + } + + status = _cairo_sub_font_create (subsets, + unscaled_font, + subsets->num_sub_fonts, + max_glyphs, + subset_glyph->is_scaled, + subset_glyph->is_composite, + &sub_font); + + if (unlikely (status)) { + cairo_scaled_font_destroy (unscaled_font); + return status; + } + + status = _cairo_hash_table_insert (subsets->unscaled_sub_fonts, + &sub_font->base); + + if (unlikely (status)) { + _cairo_sub_font_destroy (sub_font); + return status; + } + if (!subsets->unscaled_sub_fonts_list) + subsets->unscaled_sub_fonts_list = sub_font; + else + subsets->unscaled_sub_fonts_list_end->next = sub_font; + subsets->unscaled_sub_fonts_list_end = sub_font; + subsets->num_sub_fonts++; + } + } else { + /* No path available. Add to scaled subset. */ + key.is_scaled = TRUE; + _cairo_sub_font_init_key (&key, scaled_font); + sub_font = _cairo_hash_table_lookup (subsets->scaled_sub_fonts, + &key.base); + if (sub_font == NULL) { + subset_glyph->is_scaled = TRUE; + subset_glyph->is_composite = FALSE; + if (subsets->type == CAIRO_SUBSETS_SCALED) + max_glyphs = INT_MAX; + else + max_glyphs = MAX_GLYPHS_PER_SIMPLE_FONT; + + status = _cairo_sub_font_create (subsets, + cairo_scaled_font_reference (scaled_font), + subsets->num_sub_fonts, + max_glyphs, + subset_glyph->is_scaled, + subset_glyph->is_composite, + &sub_font); + if (unlikely (status)) { + cairo_scaled_font_destroy (scaled_font); + return status; + } + + status = _cairo_hash_table_insert (subsets->scaled_sub_fonts, + &sub_font->base); + if (unlikely (status)) { + _cairo_sub_font_destroy (sub_font); + return status; + } + if (!subsets->scaled_sub_fonts_list) + subsets->scaled_sub_fonts_list = sub_font; + else + subsets->scaled_sub_fonts_list_end->next = sub_font; + subsets->scaled_sub_fonts_list_end = sub_font; + subsets->num_sub_fonts++; + } + } + + return _cairo_sub_font_map_glyph (sub_font, + scaled_font_glyph_index, + utf8, utf8_len, + subset_glyph); +} + +static cairo_status_t +_cairo_scaled_font_subsets_foreach_internal (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure, + cairo_subsets_foreach_type_t type) +{ + cairo_sub_font_collection_t collection; + cairo_sub_font_t *sub_font; + cairo_bool_t is_scaled, is_user; + + is_scaled = FALSE; + is_user = FALSE; + + if (type == CAIRO_SUBSETS_FOREACH_USER) + is_user = TRUE; + + if (type == CAIRO_SUBSETS_FOREACH_SCALED || + type == CAIRO_SUBSETS_FOREACH_USER) + { + is_scaled = TRUE; + } + + if (is_scaled) + collection.glyphs_size = font_subsets->max_glyphs_per_scaled_subset_used; + else + collection.glyphs_size = font_subsets->max_glyphs_per_unscaled_subset_used; + + if (! collection.glyphs_size) + return CAIRO_STATUS_SUCCESS; + + collection.glyphs = _cairo_malloc_ab (collection.glyphs_size, sizeof(unsigned long)); + collection.utf8 = _cairo_malloc_ab (collection.glyphs_size, sizeof(char *)); + collection.to_latin_char = _cairo_malloc_ab (collection.glyphs_size, sizeof(int)); + collection.latin_to_subset_glyph_index = _cairo_malloc_ab (256, sizeof(unsigned long)); + if (unlikely (collection.glyphs == NULL || + collection.utf8 == NULL || + collection.to_latin_char == NULL || + collection.latin_to_subset_glyph_index == NULL)) { + free (collection.glyphs); + free (collection.utf8); + free (collection.to_latin_char); + free (collection.latin_to_subset_glyph_index); + + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + collection.font_subset_callback = font_subset_callback; + collection.font_subset_callback_closure = closure; + collection.status = CAIRO_STATUS_SUCCESS; + + if (is_scaled) + sub_font = font_subsets->scaled_sub_fonts_list; + else + sub_font = font_subsets->unscaled_sub_fonts_list; + + while (sub_font) { + if (sub_font->is_user == is_user) + _cairo_sub_font_collect (sub_font, &collection); + + sub_font = sub_font->next; + } + free (collection.utf8); + free (collection.glyphs); + free (collection.to_latin_char); + free (collection.latin_to_subset_glyph_index); + + return collection.status; +} + +cairo_status_t +_cairo_scaled_font_subsets_foreach_scaled (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure) +{ + return _cairo_scaled_font_subsets_foreach_internal (font_subsets, + font_subset_callback, + closure, + CAIRO_SUBSETS_FOREACH_SCALED); +} + +cairo_status_t +_cairo_scaled_font_subsets_foreach_unscaled (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure) +{ + return _cairo_scaled_font_subsets_foreach_internal (font_subsets, + font_subset_callback, + closure, + CAIRO_SUBSETS_FOREACH_UNSCALED); +} + +cairo_status_t +_cairo_scaled_font_subsets_foreach_user (cairo_scaled_font_subsets_t *font_subsets, + cairo_scaled_font_subset_callback_func_t font_subset_callback, + void *closure) +{ + return _cairo_scaled_font_subsets_foreach_internal (font_subsets, + font_subset_callback, + closure, + CAIRO_SUBSETS_FOREACH_USER); +} + +static cairo_bool_t +_cairo_string_equal (const void *key_a, const void *key_b) +{ + const cairo_string_entry_t *a = key_a; + const cairo_string_entry_t *b = key_b; + + if (strcmp (a->string, b->string) == 0) + return TRUE; + else + return FALSE; +} + +static void +_cairo_string_init_key (cairo_string_entry_t *key, char *s) +{ + unsigned long sum = 0; + unsigned int i; + + for (i = 0; i < strlen(s); i++) + sum += s[i]; + key->base.hash = sum; + key->string = s; +} + +static cairo_status_t +create_string_entry (char *s, cairo_string_entry_t **entry) +{ + *entry = malloc (sizeof (cairo_string_entry_t)); + if (unlikely (*entry == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_string_init_key (*entry, s); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_pluck_entry (void *entry, void *closure) +{ + _cairo_hash_table_remove (closure, entry); + free (entry); +} + +cairo_int_status_t +_cairo_scaled_font_subset_create_glyph_names (cairo_scaled_font_subset_t *subset) +{ + unsigned int i; + cairo_hash_table_t *names; + cairo_string_entry_t key, *entry; + char buf[30]; + char *utf8; + uint16_t *utf16; + int utf16_len; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + names = _cairo_hash_table_create (_cairo_string_equal); + if (unlikely (names == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + subset->glyph_names = calloc (subset->num_glyphs, sizeof (char *)); + if (unlikely (subset->glyph_names == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_HASH; + } + + i = 0; + if (! subset->is_scaled) { + subset->glyph_names[0] = strdup (".notdef"); + if (unlikely (subset->glyph_names[0] == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_HASH; + } + + status = create_string_entry (subset->glyph_names[0], &entry); + if (unlikely (status)) + goto CLEANUP_HASH; + + status = _cairo_hash_table_insert (names, &entry->base); + if (unlikely (status)) { + free (entry); + goto CLEANUP_HASH; + } + i++; + } + + for (; i < subset->num_glyphs; i++) { + utf8 = subset->utf8[i]; + utf16 = NULL; + utf16_len = 0; + if (utf8 && *utf8) { + status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &utf16_len); + if (unlikely (status)) + goto CLEANUP_HASH; + } + + if (utf16_len == 1) { + int ch = _cairo_unicode_to_winansi (utf16[0]); + if (ch > 0 && _cairo_winansi_to_glyphname (ch)) + strncpy (buf, _cairo_winansi_to_glyphname (ch), sizeof (buf)); + else + snprintf (buf, sizeof (buf), "uni%04X", (int) utf16[0]); + + _cairo_string_init_key (&key, buf); + entry = _cairo_hash_table_lookup (names, &key.base); + if (entry != NULL) + snprintf (buf, sizeof (buf), "g%d", i); + } else { + snprintf (buf, sizeof (buf), "g%d", i); + } + free (utf16); + + subset->glyph_names[i] = strdup (buf); + if (unlikely (subset->glyph_names[i] == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_HASH; + } + + status = create_string_entry (subset->glyph_names[i], &entry); + if (unlikely (status)) + goto CLEANUP_HASH; + + status = _cairo_hash_table_insert (names, &entry->base); + if (unlikely (status)) { + free (entry); + goto CLEANUP_HASH; + } + } + +CLEANUP_HASH: + _cairo_hash_table_foreach (names, _pluck_entry, names); + _cairo_hash_table_destroy (names); + + if (likely (status == CAIRO_STATUS_SUCCESS)) + return CAIRO_STATUS_SUCCESS; + + if (subset->glyph_names != NULL) { + for (i = 0; i < subset->num_glyphs; i++) { + free (subset->glyph_names[i]); + } + + free (subset->glyph_names); + subset->glyph_names = NULL; + } + + return status; +} + +cairo_int_status_t +_cairo_escape_ps_name (char **ps_name) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + /* Ensure PS name is a valid PDF/PS name object. In PDF names are + * treated as UTF8 and non ASCII bytes, ' ', and '#' are encoded + * as '#' followed by 2 hex digits that encode the byte. By also + * encoding the characters in the reserved string we ensure the + * name is also PS compatible. */ + if (*ps_name) { + static const char *reserved = "()<>[]{}/%#\\"; + char buf[128]; /* max name length is 127 bytes */ + char *src = *ps_name; + char *dst = buf; + + while (*src && dst < buf + 127) { + unsigned char c = *src; + if (c < 0x21 || c > 0x7e || strchr (reserved, c)) { + if (dst + 4 > buf + 127) + break; + + snprintf (dst, 4, "#%02X", c); + src++; + dst += 3; + } else { + *dst++ = *src++; + } + } + *dst = 0; + free (*ps_name); + *ps_name = strdup (buf); + if (*ps_name == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + return status; +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c new file mode 100644 index 000000000..ac80c97d1 --- /dev/null +++ b/src/cairo-scaled-font.c @@ -0,0 +1,3158 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2005 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith Packard + * Carl D. Worth + * Graydon Hoare + * Owen Taylor + * Behdad Esfahbod + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-pattern-private.h" +#include "cairo-scaled-font-private.h" +#include "cairo-surface-backend-private.h" + +#if _XOPEN_SOURCE >= 600 || defined (_ISOC99_SOURCE) +#define ISFINITE(x) isfinite (x) +#else +#define ISFINITE(x) ((x) * (x) >= 0.) /* check for NaNs */ +#endif + +/** + * SECTION:cairo-scaled-font + * @Title: cairo_scaled_font_t + * @Short_Description: Font face at particular size and options + * @See_Also: #cairo_font_face_t, #cairo_matrix_t, #cairo_font_options_t + * + * #cairo_scaled_font_t represents a realization of a font face at a particular + * size and transformation and a certain set of font options. + **/ + +static uint32_t +_cairo_scaled_font_compute_hash (cairo_scaled_font_t *scaled_font); + +/* Global Glyph Cache + * + * We maintain a global pool of glyphs split between all active fonts. This + * allows a heavily used individual font to cache more glyphs than we could + * manage if we used per-font glyph caches, but at the same time maintains + * fairness across all fonts and provides a cap on the maximum number of + * global glyphs. + * + * The glyphs are allocated in pages, which are capped in the global pool. + * Using pages means we can reduce the frequency at which we have to probe the + * global pool and ameliorates the memory allocation pressure. + */ + +/* XXX: This number is arbitrary---we've never done any measurement of this. */ +#define MAX_GLYPH_PAGES_CACHED 512 +static cairo_cache_t cairo_scaled_glyph_page_cache; + +#define CAIRO_SCALED_GLYPH_PAGE_SIZE 32 +struct _cairo_scaled_glyph_page { + cairo_cache_entry_t cache_entry; + + cairo_list_t link; + + unsigned int num_glyphs; + cairo_scaled_glyph_t glyphs[CAIRO_SCALED_GLYPH_PAGE_SIZE]; +}; + +/* + * Notes: + * + * To store rasterizations of glyphs, we use an image surface and the + * device offset to represent the glyph origin. + * + * A device_transform converts from device space (a conceptual space) to + * surface space. For simple cases of translation only, it's called a + * device_offset and is public API (cairo_surface_[gs]et_device_offset()). + * A possibly better name for those functions could have been + * cairo_surface_[gs]et_origin(). So, that's what they do: they set where + * the device-space origin (0,0) is in the surface. If the origin is inside + * the surface, device_offset values are positive. It may look like this: + * + * Device space: + * (-x,-y) <-- negative numbers + * +----------------+ + * | . | + * | . | + * |......(0,0) <---|-- device-space origin + * | | + * | | + * +----------------+ + * (width-x,height-y) + * + * Surface space: + * (0,0) <-- surface-space origin + * +---------------+ + * | . | + * | . | + * |......(x,y) <--|-- device_offset + * | | + * | | + * +---------------+ + * (width,height) + * + * In other words: device_offset is the coordinates of the device-space + * origin relative to the top-left of the surface. + * + * We use device offsets in a couple of places: + * + * - Public API: To let toolkits like Gtk+ give user a surface that + * only represents part of the final destination (say, the expose + * area), but has the same device space as the destination. In these + * cases device_offset is typically negative. Example: + * + * application window + * +---------------+ + * | . | + * | (x,y). | + * |......+---+ | + * | | | <--|-- expose area + * | +---+ | + * +---------------+ + * + * In this case, the user of cairo API can set the device_space on + * the expose area to (-x,-y) to move the device space origin to that + * of the application window, such that drawing in the expose area + * surface and painting it in the application window has the same + * effect as drawing in the application window directly. Gtk+ has + * been using this feature. + * + * - Glyph surfaces: In most font rendering systems, glyph surfaces + * have an origin at (0,0) and a bounding box that is typically + * represented as (x_bearing,y_bearing,width,height). Depending on + * which way y progresses in the system, y_bearing may typically be + * negative (for systems similar to cairo, with origin at top left), + * or be positive (in systems like PDF with origin at bottom left). + * No matter which is the case, it is important to note that + * (x_bearing,y_bearing) is the coordinates of top-left of the glyph + * relative to the glyph origin. That is, for example: + * + * Scaled-glyph space: + * + * (x_bearing,y_bearing) <-- negative numbers + * +----------------+ + * | . | + * | . | + * |......(0,0) <---|-- glyph origin + * | | + * | | + * +----------------+ + * (width+x_bearing,height+y_bearing) + * + * Note the similarity of the origin to the device space. That is + * exactly how we use the device_offset to represent scaled glyphs: + * to use the device-space origin as the glyph origin. + * + * Now compare the scaled-glyph space to device-space and surface-space + * and convince yourself that: + * + * (x_bearing,y_bearing) = (-x,-y) = - device_offset + * + * That's right. If you are not convinced yet, contrast the definition + * of the two: + * + * "(x_bearing,y_bearing) is the coordinates of top-left of the + * glyph relative to the glyph origin." + * + * "In other words: device_offset is the coordinates of the + * device-space origin relative to the top-left of the surface." + * + * and note that glyph origin = device-space origin. + */ + +static void +_cairo_scaled_font_fini_internal (cairo_scaled_font_t *scaled_font); + +static void +_cairo_scaled_glyph_fini (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + while (! cairo_list_is_empty (&scaled_glyph->dev_privates)) { + cairo_scaled_glyph_private_t *private = + cairo_list_first_entry (&scaled_glyph->dev_privates, + cairo_scaled_glyph_private_t, + link); + private->destroy (private, scaled_glyph, scaled_font); + } + + _cairo_image_scaled_glyph_fini (scaled_font, scaled_glyph); + + if (scaled_glyph->surface != NULL) + cairo_surface_destroy (&scaled_glyph->surface->base); + + if (scaled_glyph->path != NULL) + _cairo_path_fixed_destroy (scaled_glyph->path); + + if (scaled_glyph->recording_surface != NULL) { + cairo_surface_finish (scaled_glyph->recording_surface); + cairo_surface_destroy (scaled_glyph->recording_surface); + } +} + +#define ZOMBIE 0 +static const cairo_scaled_font_t _cairo_scaled_font_nil = { + { ZOMBIE }, /* hash_entry */ + CAIRO_STATUS_NO_MEMORY, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + NULL, /* original_font_face */ + NULL, /* font_face */ + { 1., 0., 0., 1., 0, 0}, /* font_matrix */ + { 1., 0., 0., 1., 0, 0}, /* ctm */ + { CAIRO_ANTIALIAS_DEFAULT, /* options */ + CAIRO_SUBPIXEL_ORDER_DEFAULT, + CAIRO_HINT_STYLE_DEFAULT, + CAIRO_HINT_METRICS_DEFAULT} , + FALSE, /* placeholder */ + FALSE, /* holdover */ + TRUE, /* finished */ + { 1., 0., 0., 1., 0, 0}, /* scale */ + { 1., 0., 0., 1., 0, 0}, /* scale_inverse */ + 1., /* max_scale */ + { 0., 0., 0., 0., 0. }, /* extents */ + { 0., 0., 0., 0., 0. }, /* fs_extents */ + CAIRO_MUTEX_NIL_INITIALIZER,/* mutex */ + NULL, /* glyphs */ + { NULL, NULL }, /* pages */ + FALSE, /* cache_frozen */ + FALSE, /* global_cache_frozen */ + { NULL, NULL }, /* privates */ + NULL /* backend */ +}; + +/** + * _cairo_scaled_font_set_error: + * @scaled_font: a scaled_font + * @status: a status value indicating an error + * + * Atomically sets scaled_font->status to @status and calls _cairo_error; + * Does nothing if status is %CAIRO_STATUS_SUCCESS. + * + * All assignments of an error status to scaled_font->status should happen + * through _cairo_scaled_font_set_error(). Note that due to the nature of + * the atomic operation, it is not safe to call this function on the nil + * objects. + * + * The purpose of this function is to allow the user to set a + * breakpoint in _cairo_error() to generate a stack trace for when the + * user causes cairo to detect an error. + * + * Return value: the error status. + **/ +cairo_status_t +_cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS) + return status; + + /* Don't overwrite an existing error. This preserves the first + * error, which is the most significant. */ + _cairo_status_set_error (&scaled_font->status, status); + + return _cairo_error (status); +} + +/** + * cairo_scaled_font_get_type: + * @scaled_font: a #cairo_scaled_font_t + * + * This function returns the type of the backend used to create + * a scaled font. See #cairo_font_type_t for available types. + * However, this function never returns %CAIRO_FONT_TYPE_TOY. + * + * Return value: The type of @scaled_font. + * + * Since: 1.2 + **/ +cairo_font_type_t +cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) + return CAIRO_FONT_TYPE_TOY; + + return scaled_font->backend->type; +} + +/** + * cairo_scaled_font_status: + * @scaled_font: a #cairo_scaled_font_t + * + * Checks whether an error has previously occurred for this + * scaled_font. + * + * Return value: %CAIRO_STATUS_SUCCESS or another error such as + * %CAIRO_STATUS_NO_MEMORY. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_scaled_font_status (cairo_scaled_font_t *scaled_font) +{ + return scaled_font->status; +} +slim_hidden_def (cairo_scaled_font_status); + +/* Here we keep a unique mapping from + * font_face/matrix/ctm/font_options => #cairo_scaled_font_t. + * + * Here are the things that we want to map: + * + * a) All otherwise referenced #cairo_scaled_font_t's + * b) Some number of not otherwise referenced #cairo_scaled_font_t's + * + * The implementation uses a hash table which covers (a) + * completely. Then, for (b) we have an array of otherwise + * unreferenced fonts (holdovers) which are expired in + * least-recently-used order. + * + * The cairo_scaled_font_create() code gets to treat this like a regular + * hash table. All of the magic for the little holdover cache is in + * cairo_scaled_font_reference() and cairo_scaled_font_destroy(). + */ + +/* This defines the size of the holdover array ... that is, the number + * of scaled fonts we keep around even when not otherwise referenced + */ +#define CAIRO_SCALED_FONT_MAX_HOLDOVERS 256 + +typedef struct _cairo_scaled_font_map { + cairo_scaled_font_t *mru_scaled_font; + cairo_hash_table_t *hash_table; + cairo_scaled_font_t *holdovers[CAIRO_SCALED_FONT_MAX_HOLDOVERS]; + int num_holdovers; +} cairo_scaled_font_map_t; + +static cairo_scaled_font_map_t *cairo_scaled_font_map; + +static int +_cairo_scaled_font_keys_equal (const void *abstract_key_a, const void *abstract_key_b); + +static cairo_scaled_font_map_t * +_cairo_scaled_font_map_lock (void) +{ + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); + + if (cairo_scaled_font_map == NULL) { + cairo_scaled_font_map = malloc (sizeof (cairo_scaled_font_map_t)); + if (unlikely (cairo_scaled_font_map == NULL)) + goto CLEANUP_MUTEX_LOCK; + + cairo_scaled_font_map->mru_scaled_font = NULL; + cairo_scaled_font_map->hash_table = + _cairo_hash_table_create (_cairo_scaled_font_keys_equal); + + if (unlikely (cairo_scaled_font_map->hash_table == NULL)) + goto CLEANUP_SCALED_FONT_MAP; + + cairo_scaled_font_map->num_holdovers = 0; + } + + return cairo_scaled_font_map; + + CLEANUP_SCALED_FONT_MAP: + free (cairo_scaled_font_map); + cairo_scaled_font_map = NULL; + CLEANUP_MUTEX_LOCK: + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; +} + +static void +_cairo_scaled_font_map_unlock (void) +{ + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); +} + +void +_cairo_scaled_font_map_destroy (void) +{ + cairo_scaled_font_map_t *font_map; + cairo_scaled_font_t *scaled_font; + + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); + + font_map = cairo_scaled_font_map; + if (unlikely (font_map == NULL)) { + goto CLEANUP_MUTEX_LOCK; + } + + scaled_font = font_map->mru_scaled_font; + if (scaled_font != NULL) { + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); + cairo_scaled_font_destroy (scaled_font); + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); + } + + /* remove scaled_fonts starting from the end so that font_map->holdovers + * is always in a consistent state when we release the mutex. */ + while (font_map->num_holdovers) { + scaled_font = font_map->holdovers[font_map->num_holdovers-1]; + assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)); + _cairo_hash_table_remove (font_map->hash_table, + &scaled_font->hash_entry); + + font_map->num_holdovers--; + + /* This releases the font_map lock to avoid the possibility of a + * recursive deadlock when the scaled font destroy closure gets + * called + */ + _cairo_scaled_font_fini (scaled_font); + + free (scaled_font); + } + + _cairo_hash_table_destroy (font_map->hash_table); + + free (cairo_scaled_font_map); + cairo_scaled_font_map = NULL; + + CLEANUP_MUTEX_LOCK: + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); +} + +static void +_cairo_scaled_glyph_page_destroy (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_page_t *page) +{ + unsigned int n; + + assert (!scaled_font->cache_frozen); + assert (!scaled_font->global_cache_frozen); + + for (n = 0; n < page->num_glyphs; n++) { + _cairo_hash_table_remove (scaled_font->glyphs, + &page->glyphs[n].hash_entry); + _cairo_scaled_glyph_fini (scaled_font, &page->glyphs[n]); + } + + cairo_list_del (&page->link); + free (page); +} + +static void +_cairo_scaled_glyph_page_pluck (void *closure) +{ + cairo_scaled_glyph_page_t *page = closure; + cairo_scaled_font_t *scaled_font; + + assert (! cairo_list_is_empty (&page->link)); + + scaled_font = (cairo_scaled_font_t *) page->cache_entry.hash; + + CAIRO_MUTEX_LOCK (scaled_font->mutex); + _cairo_scaled_glyph_page_destroy (scaled_font, page); + CAIRO_MUTEX_UNLOCK (scaled_font->mutex); +} + +/* If a scaled font wants to unlock the font map while still being + * created (needed for user-fonts), we need to take extra care not + * ending up with multiple identical scaled fonts being created. + * + * What we do is, we create a fake identical scaled font, and mark + * it as placeholder, lock its mutex, and insert that in the fontmap + * hash table. This makes other code trying to create an identical + * scaled font to just wait and retry. + * + * The reason we have to create a fake scaled font instead of just using + * scaled_font is for lifecycle management: we need to (or rather, + * other code needs to) reference the scaled_font in the hash table. + * We can't do that on the input scaled_font as it may be freed by + * font backend upon error. + */ + +cairo_status_t +_cairo_scaled_font_register_placeholder_and_unlock_font_map (cairo_scaled_font_t *scaled_font) +{ + cairo_status_t status; + cairo_scaled_font_t *placeholder_scaled_font; + + assert (CAIRO_MUTEX_IS_LOCKED (_cairo_scaled_font_map_mutex)); + + status = scaled_font->status; + if (unlikely (status)) + return status; + + placeholder_scaled_font = malloc (sizeof (cairo_scaled_font_t)); + if (unlikely (placeholder_scaled_font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* full initialization is wasteful, but who cares... */ + status = _cairo_scaled_font_init (placeholder_scaled_font, + scaled_font->font_face, + &scaled_font->font_matrix, + &scaled_font->ctm, + &scaled_font->options, + NULL); + if (unlikely (status)) + goto FREE_PLACEHOLDER; + + placeholder_scaled_font->placeholder = TRUE; + + placeholder_scaled_font->hash_entry.hash + = _cairo_scaled_font_compute_hash (placeholder_scaled_font); + status = _cairo_hash_table_insert (cairo_scaled_font_map->hash_table, + &placeholder_scaled_font->hash_entry); + if (unlikely (status)) + goto FINI_PLACEHOLDER; + + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); + CAIRO_MUTEX_LOCK (placeholder_scaled_font->mutex); + + return CAIRO_STATUS_SUCCESS; + + FINI_PLACEHOLDER: + _cairo_scaled_font_fini_internal (placeholder_scaled_font); + FREE_PLACEHOLDER: + free (placeholder_scaled_font); + + return _cairo_scaled_font_set_error (scaled_font, status); +} + +void +_cairo_scaled_font_unregister_placeholder_and_lock_font_map (cairo_scaled_font_t *scaled_font) +{ + cairo_scaled_font_t *placeholder_scaled_font; + + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); + + /* temporary hash value to match the placeholder */ + scaled_font->hash_entry.hash + = _cairo_scaled_font_compute_hash (scaled_font); + placeholder_scaled_font = + _cairo_hash_table_lookup (cairo_scaled_font_map->hash_table, + &scaled_font->hash_entry); + assert (placeholder_scaled_font != NULL); + assert (placeholder_scaled_font->placeholder); + assert (CAIRO_MUTEX_IS_LOCKED (placeholder_scaled_font->mutex)); + + _cairo_hash_table_remove (cairo_scaled_font_map->hash_table, + &placeholder_scaled_font->hash_entry); + + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); + + CAIRO_MUTEX_UNLOCK (placeholder_scaled_font->mutex); + cairo_scaled_font_destroy (placeholder_scaled_font); + + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); +} + +static void +_cairo_scaled_font_placeholder_wait_for_creation_to_finish (cairo_scaled_font_t *placeholder_scaled_font) +{ + /* reference the place holder so it doesn't go away */ + cairo_scaled_font_reference (placeholder_scaled_font); + + /* now unlock the fontmap mutex so creation has a chance to finish */ + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); + + /* wait on placeholder mutex until we are awaken */ + CAIRO_MUTEX_LOCK (placeholder_scaled_font->mutex); + + /* ok, creation done. just clean up and back out */ + CAIRO_MUTEX_UNLOCK (placeholder_scaled_font->mutex); + cairo_scaled_font_destroy (placeholder_scaled_font); + + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); +} + +/* Fowler / Noll / Vo (FNV) Hash (http://www.isthe.com/chongo/tech/comp/fnv/) + * + * Not necessarily better than a lot of other hashes, but should be OK, and + * well tested with binary data. + */ + +#define FNV_32_PRIME ((uint32_t)0x01000193) +#define FNV1_32_INIT ((uint32_t)0x811c9dc5) + +static uint32_t +_hash_matrix_fnv (const cairo_matrix_t *matrix, + uint32_t hval) +{ + const uint8_t *buffer = (const uint8_t *) matrix; + int len = sizeof (cairo_matrix_t); + do { + hval *= FNV_32_PRIME; + hval ^= *buffer++; + } while (--len); + + return hval; +} + +static uint32_t +_hash_mix_bits (uint32_t hash) +{ + hash += hash << 12; + hash ^= hash >> 7; + hash += hash << 3; + hash ^= hash >> 17; + hash += hash << 5; + return hash; +} + +static uint32_t +_cairo_scaled_font_compute_hash (cairo_scaled_font_t *scaled_font) +{ + uint32_t hash = FNV1_32_INIT; + + /* We do a bytewise hash on the font matrices */ + hash = _hash_matrix_fnv (&scaled_font->font_matrix, hash); + hash = _hash_matrix_fnv (&scaled_font->ctm, hash); + hash = _hash_mix_bits (hash); + + hash ^= (unsigned long) scaled_font->original_font_face; + hash ^= cairo_font_options_hash (&scaled_font->options); + + /* final mixing of bits */ + hash = _hash_mix_bits (hash); + assert (hash != ZOMBIE); + + return hash; +} + +static void +_cairo_scaled_font_init_key (cairo_scaled_font_t *scaled_font, + cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options) +{ + scaled_font->status = CAIRO_STATUS_SUCCESS; + scaled_font->placeholder = FALSE; + scaled_font->font_face = font_face; + scaled_font->original_font_face = font_face; + scaled_font->font_matrix = *font_matrix; + scaled_font->ctm = *ctm; + /* ignore translation values in the ctm */ + scaled_font->ctm.x0 = 0.; + scaled_font->ctm.y0 = 0.; + _cairo_font_options_init_copy (&scaled_font->options, options); + + scaled_font->hash_entry.hash = + _cairo_scaled_font_compute_hash (scaled_font); +} + +static cairo_bool_t +_cairo_scaled_font_keys_equal (const void *abstract_key_a, + const void *abstract_key_b) +{ + const cairo_scaled_font_t *key_a = abstract_key_a; + const cairo_scaled_font_t *key_b = abstract_key_b; + + return key_a->original_font_face == key_b->original_font_face && + memcmp ((unsigned char *)(&key_a->font_matrix.xx), + (unsigned char *)(&key_b->font_matrix.xx), + sizeof(cairo_matrix_t)) == 0 && + memcmp ((unsigned char *)(&key_a->ctm.xx), + (unsigned char *)(&key_b->ctm.xx), + sizeof(cairo_matrix_t)) == 0 && + cairo_font_options_equal (&key_a->options, &key_b->options); +} + +static cairo_bool_t +_cairo_scaled_font_matches (const cairo_scaled_font_t *scaled_font, + const cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options) +{ + return scaled_font->original_font_face == font_face && + memcmp ((unsigned char *)(&scaled_font->font_matrix.xx), + (unsigned char *)(&font_matrix->xx), + sizeof(cairo_matrix_t)) == 0 && + memcmp ((unsigned char *)(&scaled_font->ctm.xx), + (unsigned char *)(&ctm->xx), + sizeof(cairo_matrix_t)) == 0 && + cairo_font_options_equal (&scaled_font->options, options); +} + +/* + * Basic #cairo_scaled_font_t object management + */ + +cairo_status_t +_cairo_scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + const cairo_scaled_font_backend_t *backend) +{ + cairo_status_t status; + + status = cairo_font_options_status ((cairo_font_options_t *) options); + if (unlikely (status)) + return status; + + scaled_font->status = CAIRO_STATUS_SUCCESS; + scaled_font->placeholder = FALSE; + scaled_font->font_face = font_face; + scaled_font->original_font_face = font_face; + scaled_font->font_matrix = *font_matrix; + scaled_font->ctm = *ctm; + /* ignore translation values in the ctm */ + scaled_font->ctm.x0 = 0.; + scaled_font->ctm.y0 = 0.; + _cairo_font_options_init_copy (&scaled_font->options, options); + + cairo_matrix_multiply (&scaled_font->scale, + &scaled_font->font_matrix, + &scaled_font->ctm); + + scaled_font->max_scale = MAX (fabs (scaled_font->scale.xx) + fabs (scaled_font->scale.xy), + fabs (scaled_font->scale.yx) + fabs (scaled_font->scale.yy)); + scaled_font->scale_inverse = scaled_font->scale; + status = cairo_matrix_invert (&scaled_font->scale_inverse); + if (unlikely (status)) { + /* If the font scale matrix is rank 0, just using an all-zero inverse matrix + * makes everything work correctly. This make font size 0 work without + * producing an error. + * + * FIXME: If the scale is rank 1, we still go into error mode. But then + * again, that's what we do everywhere in cairo. + * + * Also, the check for == 0. below may be too harsh... + */ + if (_cairo_matrix_is_scale_0 (&scaled_font->scale)) { + cairo_matrix_init (&scaled_font->scale_inverse, + 0, 0, 0, 0, + -scaled_font->scale.x0, + -scaled_font->scale.y0); + } else + return status; + } + + scaled_font->glyphs = _cairo_hash_table_create (NULL); + if (unlikely (scaled_font->glyphs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cairo_list_init (&scaled_font->glyph_pages); + scaled_font->cache_frozen = FALSE; + scaled_font->global_cache_frozen = FALSE; + + scaled_font->holdover = FALSE; + scaled_font->finished = FALSE; + + CAIRO_REFERENCE_COUNT_INIT (&scaled_font->ref_count, 1); + + _cairo_user_data_array_init (&scaled_font->user_data); + + cairo_font_face_reference (font_face); + scaled_font->original_font_face = NULL; + + CAIRO_MUTEX_INIT (scaled_font->mutex); + + cairo_list_init (&scaled_font->dev_privates); + + scaled_font->backend = backend; + cairo_list_init (&scaled_font->link); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_scaled_font_freeze_cache (cairo_scaled_font_t *scaled_font) +{ + /* ensure we do not modify an error object */ + assert (scaled_font->status == CAIRO_STATUS_SUCCESS); + + CAIRO_MUTEX_LOCK (scaled_font->mutex); + scaled_font->cache_frozen = TRUE; +} + +void +_cairo_scaled_font_thaw_cache (cairo_scaled_font_t *scaled_font) +{ + assert (scaled_font->cache_frozen); + + if (scaled_font->global_cache_frozen) { + CAIRO_MUTEX_LOCK (_cairo_scaled_glyph_page_cache_mutex); + _cairo_cache_thaw (&cairo_scaled_glyph_page_cache); + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + scaled_font->global_cache_frozen = FALSE; + } + + scaled_font->cache_frozen = FALSE; + CAIRO_MUTEX_UNLOCK (scaled_font->mutex); +} + +void +_cairo_scaled_font_reset_cache (cairo_scaled_font_t *scaled_font) +{ + CAIRO_MUTEX_LOCK (scaled_font->mutex); + assert (! scaled_font->cache_frozen); + assert (! scaled_font->global_cache_frozen); + CAIRO_MUTEX_LOCK (_cairo_scaled_glyph_page_cache_mutex); + while (! cairo_list_is_empty (&scaled_font->glyph_pages)) { + cairo_scaled_glyph_page_t *page = + cairo_list_first_entry (&scaled_font->glyph_pages, + cairo_scaled_glyph_page_t, + link); + + cairo_scaled_glyph_page_cache.size -= page->cache_entry.size; + _cairo_hash_table_remove (cairo_scaled_glyph_page_cache.hash_table, + (cairo_hash_entry_t *) &page->cache_entry); + + _cairo_scaled_glyph_page_destroy (scaled_font, page); + } + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + CAIRO_MUTEX_UNLOCK (scaled_font->mutex); +} + +cairo_status_t +_cairo_scaled_font_set_metrics (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *fs_metrics) +{ + cairo_status_t status; + double font_scale_x, font_scale_y; + + scaled_font->fs_extents = *fs_metrics; + + status = _cairo_matrix_compute_basis_scale_factors (&scaled_font->font_matrix, + &font_scale_x, &font_scale_y, + 1); + if (unlikely (status)) + return status; + + /* + * The font responded in unscaled units, scale by the font + * matrix scale factors to get to user space + */ + + scaled_font->extents.ascent = fs_metrics->ascent * font_scale_y; + scaled_font->extents.descent = fs_metrics->descent * font_scale_y; + scaled_font->extents.height = fs_metrics->height * font_scale_y; + scaled_font->extents.max_x_advance = fs_metrics->max_x_advance * font_scale_x; + scaled_font->extents.max_y_advance = fs_metrics->max_y_advance * font_scale_y; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_scaled_font_fini_internal (cairo_scaled_font_t *scaled_font) +{ + assert (! scaled_font->cache_frozen); + assert (! scaled_font->global_cache_frozen); + scaled_font->finished = TRUE; + + _cairo_scaled_font_reset_cache (scaled_font); + _cairo_hash_table_destroy (scaled_font->glyphs); + + cairo_font_face_destroy (scaled_font->font_face); + cairo_font_face_destroy (scaled_font->original_font_face); + + CAIRO_MUTEX_FINI (scaled_font->mutex); + + while (! cairo_list_is_empty (&scaled_font->dev_privates)) { + cairo_scaled_font_private_t *private = + cairo_list_first_entry (&scaled_font->dev_privates, + cairo_scaled_font_private_t, + link); + private->destroy (private, scaled_font); + } + + if (scaled_font->backend != NULL && scaled_font->backend->fini != NULL) + scaled_font->backend->fini (scaled_font); + + _cairo_user_data_array_fini (&scaled_font->user_data); +} + +void +_cairo_scaled_font_fini (cairo_scaled_font_t *scaled_font) +{ + /* Release the lock to avoid the possibility of a recursive + * deadlock when the scaled font destroy closure gets called. */ + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); + _cairo_scaled_font_fini_internal (scaled_font); + CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); +} + +void +_cairo_scaled_font_attach_private (cairo_scaled_font_t *scaled_font, + cairo_scaled_font_private_t *private, + const void *key, + void (*destroy) (cairo_scaled_font_private_t *, + cairo_scaled_font_t *)) +{ + private->key = key; + private->destroy = destroy; + cairo_list_add (&private->link, &scaled_font->dev_privates); +} + +cairo_scaled_font_private_t * +_cairo_scaled_font_find_private (cairo_scaled_font_t *scaled_font, + const void *key) +{ + cairo_scaled_font_private_t *priv; + + cairo_list_foreach_entry (priv, cairo_scaled_font_private_t, + &scaled_font->dev_privates, link) + { + if (priv->key == key) { + if (priv->link.prev != &scaled_font->dev_privates) + cairo_list_move (&priv->link, &scaled_font->dev_privates); + return priv; + } + } + + return NULL; +} + +void +_cairo_scaled_glyph_attach_private (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_private_t *private, + const void *key, + void (*destroy) (cairo_scaled_glyph_private_t *, + cairo_scaled_glyph_t *, + cairo_scaled_font_t *)) +{ + private->key = key; + private->destroy = destroy; + cairo_list_add (&private->link, &scaled_glyph->dev_privates); +} + +cairo_scaled_glyph_private_t * +_cairo_scaled_glyph_find_private (cairo_scaled_glyph_t *scaled_glyph, + const void *key) +{ + cairo_scaled_glyph_private_t *priv; + + cairo_list_foreach_entry (priv, cairo_scaled_glyph_private_t, + &scaled_glyph->dev_privates, link) + { + if (priv->key == key) { + if (priv->link.prev != &scaled_glyph->dev_privates) + cairo_list_move (&priv->link, &scaled_glyph->dev_privates); + return priv; + } + } + + return NULL; +} + +/** + * cairo_scaled_font_create: + * @font_face: a #cairo_font_face_t + * @font_matrix: font space to user space transformation matrix for the + * font. In the simplest case of a N point font, this matrix is + * just a scale by N, but it can also be used to shear the font + * or stretch it unequally along the two axes. See + * cairo_set_font_matrix(). + * @ctm: user to device transformation matrix with which the font will + * be used. + * @options: options to use when getting metrics for the font and + * rendering with it. + * + * Creates a #cairo_scaled_font_t object from a font face and matrices that + * describe the size of the font and the environment in which it will + * be used. + * + * Return value: a newly created #cairo_scaled_font_t. Destroy with + * cairo_scaled_font_destroy() + * + * Since: 1.0 + **/ +cairo_scaled_font_t * +cairo_scaled_font_create (cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options) +{ + cairo_status_t status; + cairo_scaled_font_map_t *font_map; + cairo_font_face_t *original_font_face = font_face; + cairo_scaled_font_t key, *old = NULL, *scaled_font = NULL, *dead = NULL; + double det; + + status = font_face->status; + if (unlikely (status)) + return _cairo_scaled_font_create_in_error (status); + + det = _cairo_matrix_compute_determinant (font_matrix); + if (! ISFINITE (det)) + return _cairo_scaled_font_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_MATRIX)); + + det = _cairo_matrix_compute_determinant (ctm); + if (! ISFINITE (det)) + return _cairo_scaled_font_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_MATRIX)); + + status = cairo_font_options_status ((cairo_font_options_t *) options); + if (unlikely (status)) + return _cairo_scaled_font_create_in_error (status); + + /* Note that degenerate ctm or font_matrix *are* allowed. + * We want to support a font size of 0. */ + + font_map = _cairo_scaled_font_map_lock (); + if (unlikely (font_map == NULL)) + return _cairo_scaled_font_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + scaled_font = font_map->mru_scaled_font; + if (scaled_font != NULL && + _cairo_scaled_font_matches (scaled_font, + font_face, font_matrix, ctm, options)) + { + assert (scaled_font->hash_entry.hash != ZOMBIE); + assert (! scaled_font->placeholder); + + if (likely (scaled_font->status == CAIRO_STATUS_SUCCESS)) { + /* We increment the reference count manually here, (rather + * than calling into cairo_scaled_font_reference), since we + * must modify the reference count while our lock is still + * held. */ + _cairo_reference_count_inc (&scaled_font->ref_count); + _cairo_scaled_font_map_unlock (); + return scaled_font; + } + + /* the font has been put into an error status - abandon the cache */ + _cairo_hash_table_remove (font_map->hash_table, + &scaled_font->hash_entry); + scaled_font->hash_entry.hash = ZOMBIE; + dead = scaled_font; + font_map->mru_scaled_font = NULL; + } + + _cairo_scaled_font_init_key (&key, font_face, font_matrix, ctm, options); + + while ((scaled_font = _cairo_hash_table_lookup (font_map->hash_table, + &key.hash_entry))) + { + if (! scaled_font->placeholder) + break; + + /* If the scaled font is being created (happens for user-font), + * just wait until it's done, then retry */ + _cairo_scaled_font_placeholder_wait_for_creation_to_finish (scaled_font); + } + + if (scaled_font != NULL) { + /* If the original reference count is 0, then this font must have + * been found in font_map->holdovers, (which means this caching is + * actually working). So now we remove it from the holdovers + * array, unless we caught the font in the middle of destruction. + */ + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)) { + if (scaled_font->holdover) { + int i; + + for (i = 0; i < font_map->num_holdovers; i++) { + if (font_map->holdovers[i] == scaled_font) { + font_map->num_holdovers--; + memmove (&font_map->holdovers[i], + &font_map->holdovers[i+1], + (font_map->num_holdovers - i) * sizeof (cairo_scaled_font_t*)); + break; + } + } + + scaled_font->holdover = FALSE; + } + + /* reset any error status */ + scaled_font->status = CAIRO_STATUS_SUCCESS; + } + + if (likely (scaled_font->status == CAIRO_STATUS_SUCCESS)) { + /* We increment the reference count manually here, (rather + * than calling into cairo_scaled_font_reference), since we + * must modify the reference count while our lock is still + * held. */ + + old = font_map->mru_scaled_font; + font_map->mru_scaled_font = scaled_font; + /* increment reference count for the mru cache */ + _cairo_reference_count_inc (&scaled_font->ref_count); + /* and increment for the returned reference */ + _cairo_reference_count_inc (&scaled_font->ref_count); + _cairo_scaled_font_map_unlock (); + + cairo_scaled_font_destroy (old); + if (font_face != original_font_face) + cairo_font_face_destroy (font_face); + + return scaled_font; + } + + /* the font has been put into an error status - abandon the cache */ + _cairo_hash_table_remove (font_map->hash_table, + &scaled_font->hash_entry); + scaled_font->hash_entry.hash = ZOMBIE; + } + + + /* Otherwise create it and insert it into the hash table. */ + if (font_face->backend->get_implementation != NULL) { + font_face = font_face->backend->get_implementation (font_face, + font_matrix, + ctm, + options); + if (unlikely (font_face->status)) { + _cairo_scaled_font_map_unlock (); + return _cairo_scaled_font_create_in_error (font_face->status); + } + } + + status = font_face->backend->scaled_font_create (font_face, font_matrix, + ctm, options, &scaled_font); + /* Did we leave the backend in an error state? */ + if (unlikely (status)) { + _cairo_scaled_font_map_unlock (); + if (font_face != original_font_face) + cairo_font_face_destroy (font_face); + + if (dead != NULL) + cairo_scaled_font_destroy (dead); + + status = _cairo_font_face_set_error (font_face, status); + return _cairo_scaled_font_create_in_error (status); + } + /* Or did we encounter an error whilst constructing the scaled font? */ + if (unlikely (scaled_font->status)) { + _cairo_scaled_font_map_unlock (); + if (font_face != original_font_face) + cairo_font_face_destroy (font_face); + + if (dead != NULL) + cairo_scaled_font_destroy (dead); + + return scaled_font; + } + + /* Our caching above is defeated if the backend switches fonts on us - + * e.g. old incarnations of toy-font-face and lazily resolved + * ft-font-faces + */ + assert (scaled_font->font_face == font_face); + assert (! scaled_font->cache_frozen); + assert (! scaled_font->global_cache_frozen); + + scaled_font->original_font_face = + cairo_font_face_reference (original_font_face); + + scaled_font->hash_entry.hash = _cairo_scaled_font_compute_hash(scaled_font); + + status = _cairo_hash_table_insert (font_map->hash_table, + &scaled_font->hash_entry); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + old = font_map->mru_scaled_font; + font_map->mru_scaled_font = scaled_font; + _cairo_reference_count_inc (&scaled_font->ref_count); + } + + _cairo_scaled_font_map_unlock (); + + cairo_scaled_font_destroy (old); + if (font_face != original_font_face) + cairo_font_face_destroy (font_face); + + if (dead != NULL) + cairo_scaled_font_destroy (dead); + + if (unlikely (status)) { + /* We can't call _cairo_scaled_font_destroy here since it expects + * that the font has already been successfully inserted into the + * hash table. */ + _cairo_scaled_font_fini_internal (scaled_font); + free (scaled_font); + return _cairo_scaled_font_create_in_error (status); + } + + return scaled_font; +} +slim_hidden_def (cairo_scaled_font_create); + +static cairo_scaled_font_t *_cairo_scaled_font_nil_objects[CAIRO_STATUS_LAST_STATUS + 1]; + +/* XXX This should disappear in favour of a common pool of error objects. */ +cairo_scaled_font_t * +_cairo_scaled_font_create_in_error (cairo_status_t status) +{ + cairo_scaled_font_t *scaled_font; + + assert (status != CAIRO_STATUS_SUCCESS); + + if (status == CAIRO_STATUS_NO_MEMORY) + return (cairo_scaled_font_t *) &_cairo_scaled_font_nil; + + CAIRO_MUTEX_LOCK (_cairo_scaled_font_error_mutex); + scaled_font = _cairo_scaled_font_nil_objects[status]; + if (unlikely (scaled_font == NULL)) { + scaled_font = malloc (sizeof (cairo_scaled_font_t)); + if (unlikely (scaled_font == NULL)) { + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_error_mutex); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_scaled_font_t *) &_cairo_scaled_font_nil; + } + + *scaled_font = _cairo_scaled_font_nil; + scaled_font->status = status; + _cairo_scaled_font_nil_objects[status] = scaled_font; + } + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_error_mutex); + + return scaled_font; +} + +void +_cairo_scaled_font_reset_static_data (void) +{ + int status; + + CAIRO_MUTEX_LOCK (_cairo_scaled_font_error_mutex); + for (status = CAIRO_STATUS_SUCCESS; + status <= CAIRO_STATUS_LAST_STATUS; + status++) + { + free (_cairo_scaled_font_nil_objects[status]); + _cairo_scaled_font_nil_objects[status] = NULL; + } + CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_error_mutex); + + CAIRO_MUTEX_LOCK (_cairo_scaled_glyph_page_cache_mutex); + if (cairo_scaled_glyph_page_cache.hash_table != NULL) { + _cairo_cache_fini (&cairo_scaled_glyph_page_cache); + cairo_scaled_glyph_page_cache.hash_table = NULL; + } + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); +} + +/** + * cairo_scaled_font_reference: + * @scaled_font: a #cairo_scaled_font_t, (may be %NULL in which case + * this function does nothing) + * + * Increases the reference count on @scaled_font by one. This prevents + * @scaled_font from being destroyed until a matching call to + * cairo_scaled_font_destroy() is made. + * + * The number of references to a #cairo_scaled_font_t can be get using + * cairo_scaled_font_get_reference_count(). + * + * Returns: the referenced #cairo_scaled_font_t + * + * Since: 1.0 + **/ +cairo_scaled_font_t * +cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font) +{ + if (scaled_font == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) + return scaled_font; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)); + + _cairo_reference_count_inc (&scaled_font->ref_count); + + return scaled_font; +} +slim_hidden_def (cairo_scaled_font_reference); + +/** + * cairo_scaled_font_destroy: + * @scaled_font: a #cairo_scaled_font_t + * + * Decreases the reference count on @font by one. If the result + * is zero, then @font and all associated resources are freed. + * See cairo_scaled_font_reference(). + * + * Since: 1.0 + **/ +void +cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font) +{ + cairo_scaled_font_t *lru = NULL; + cairo_scaled_font_map_t *font_map; + + assert (CAIRO_MUTEX_IS_UNLOCKED (_cairo_scaled_font_map_mutex)); + + if (scaled_font == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&scaled_font->ref_count)) + return; + + assert (! scaled_font->cache_frozen); + assert (! scaled_font->global_cache_frozen); + + font_map = _cairo_scaled_font_map_lock (); + assert (font_map != NULL); + + /* Another thread may have resurrected the font whilst we waited */ + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)) { + if (! scaled_font->placeholder && + scaled_font->hash_entry.hash != ZOMBIE) + { + /* Another thread may have already inserted us into the holdovers */ + if (scaled_font->holdover) + goto unlock; + + /* Rather than immediately destroying this object, we put it into + * the font_map->holdovers array in case it will get used again + * soon (and is why we must hold the lock over the atomic op on + * the reference count). To make room for it, we do actually + * destroy the least-recently-used holdover. + */ + + if (font_map->num_holdovers == CAIRO_SCALED_FONT_MAX_HOLDOVERS) { + lru = font_map->holdovers[0]; + assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&lru->ref_count)); + + _cairo_hash_table_remove (font_map->hash_table, + &lru->hash_entry); + + font_map->num_holdovers--; + memmove (&font_map->holdovers[0], + &font_map->holdovers[1], + font_map->num_holdovers * sizeof (cairo_scaled_font_t*)); + } + + font_map->holdovers[font_map->num_holdovers++] = scaled_font; + scaled_font->holdover = TRUE; + } else + lru = scaled_font; + } + + unlock: + _cairo_scaled_font_map_unlock (); + + /* If we pulled an item from the holdovers array, (while the font + * map lock was held, of course), then there is no way that anyone + * else could have acquired a reference to it. So we can now + * safely call fini on it without any lock held. This is desirable + * as we never want to call into any backend function with a lock + * held. */ + if (lru != NULL) { + _cairo_scaled_font_fini_internal (lru); + free (lru); + } +} +slim_hidden_def (cairo_scaled_font_destroy); + +/** + * cairo_scaled_font_get_reference_count: + * @scaled_font: a #cairo_scaled_font_t + * + * Returns the current reference count of @scaled_font. + * + * Return value: the current reference count of @scaled_font. If the + * object is a nil object, 0 will be returned. + * + * Since: 1.4 + **/ +unsigned int +cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font) +{ + if (scaled_font == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) + return 0; + + return CAIRO_REFERENCE_COUNT_GET_VALUE (&scaled_font->ref_count); +} + +/** + * cairo_scaled_font_get_user_data: + * @scaled_font: a #cairo_scaled_font_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Return user data previously attached to @scaled_font using the + * specified key. If no user data has been attached with the given + * key this function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + * + * Since: 1.4 + **/ +void * +cairo_scaled_font_get_user_data (cairo_scaled_font_t *scaled_font, + const cairo_user_data_key_t *key) +{ + return _cairo_user_data_array_get_data (&scaled_font->user_data, + key); +} +slim_hidden_def (cairo_scaled_font_get_user_data); + +/** + * cairo_scaled_font_set_user_data: + * @scaled_font: a #cairo_scaled_font_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach to the #cairo_scaled_font_t + * @destroy: a #cairo_destroy_func_t which will be called when the + * #cairo_t is destroyed or when new user data is attached using the + * same key. + * + * Attach user data to @scaled_font. To remove user data from a surface, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_scaled_font_set_user_data (cairo_scaled_font_t *scaled_font, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) + return scaled_font->status; + + return _cairo_user_data_array_set_data (&scaled_font->user_data, + key, user_data, destroy); +} +slim_hidden_def (cairo_scaled_font_set_user_data); + +/* Public font API follows. */ + +/** + * cairo_scaled_font_extents: + * @scaled_font: a #cairo_scaled_font_t + * @extents: a #cairo_font_extents_t which to store the retrieved extents. + * + * Gets the metrics for a #cairo_scaled_font_t. + * + * Since: 1.0 + **/ +void +cairo_scaled_font_extents (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *extents) +{ + if (scaled_font->status) { + extents->ascent = 0.0; + extents->descent = 0.0; + extents->height = 0.0; + extents->max_x_advance = 0.0; + extents->max_y_advance = 0.0; + return; + } + + *extents = scaled_font->extents; +} +slim_hidden_def (cairo_scaled_font_extents); + +/** + * cairo_scaled_font_text_extents: + * @scaled_font: a #cairo_scaled_font_t + * @utf8: a NUL-terminated string of text, encoded in UTF-8 + * @extents: a #cairo_text_extents_t which to store the retrieved extents. + * + * Gets the extents for a string of text. The extents describe a + * user-space rectangle that encloses the "inked" portion of the text + * drawn at the origin (0,0) (as it would be drawn by cairo_show_text() + * if the cairo graphics state were set to the same font_face, + * font_matrix, ctm, and font_options as @scaled_font). Additionally, + * the x_advance and y_advance values indicate the amount by which the + * current point would be advanced by cairo_show_text(). + * + * Note that whitespace characters do not directly contribute to the + * size of the rectangle (extents.width and extents.height). They do + * contribute indirectly by changing the position of non-whitespace + * characters. In particular, trailing whitespace characters are + * likely to not affect the size of the rectangle, though they will + * affect the x_advance and y_advance values. + * + * Since: 1.2 + **/ +void +cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_text_extents_t *extents) +{ + cairo_status_t status; + cairo_glyph_t *glyphs = NULL; + int num_glyphs; + + if (scaled_font->status) + goto ZERO_EXTENTS; + + if (utf8 == NULL) + goto ZERO_EXTENTS; + + status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., + utf8, -1, + &glyphs, &num_glyphs, + NULL, NULL, + NULL); + if (unlikely (status)) { + status = _cairo_scaled_font_set_error (scaled_font, status); + goto ZERO_EXTENTS; + } + + cairo_scaled_font_glyph_extents (scaled_font, glyphs, num_glyphs, extents); + free (glyphs); + + return; + +ZERO_EXTENTS: + extents->x_bearing = 0.0; + extents->y_bearing = 0.0; + extents->width = 0.0; + extents->height = 0.0; + extents->x_advance = 0.0; + extents->y_advance = 0.0; +} + +/** + * cairo_scaled_font_glyph_extents: + * @scaled_font: a #cairo_scaled_font_t + * @glyphs: an array of glyph IDs with X and Y offsets. + * @num_glyphs: the number of glyphs in the @glyphs array + * @extents: a #cairo_text_extents_t which to store the retrieved extents. + * + * Gets the extents for an array of glyphs. The extents describe a + * user-space rectangle that encloses the "inked" portion of the + * glyphs, (as they would be drawn by cairo_show_glyphs() if the cairo + * graphics state were set to the same font_face, font_matrix, ctm, + * and font_options as @scaled_font). Additionally, the x_advance and + * y_advance values indicate the amount by which the current point + * would be advanced by cairo_show_glyphs(). + * + * Note that whitespace glyphs do not contribute to the size of the + * rectangle (extents.width and extents.height). + * + * Since: 1.0 + **/ +void +cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents) +{ + cairo_status_t status; + int i; + double min_x = 0.0, min_y = 0.0, max_x = 0.0, max_y = 0.0; + cairo_bool_t visible = FALSE; + cairo_scaled_glyph_t *scaled_glyph = NULL; + + extents->x_bearing = 0.0; + extents->y_bearing = 0.0; + extents->width = 0.0; + extents->height = 0.0; + extents->x_advance = 0.0; + extents->y_advance = 0.0; + + if (unlikely (scaled_font->status)) + goto ZERO_EXTENTS; + + if (num_glyphs == 0) + goto ZERO_EXTENTS; + + if (unlikely (num_glyphs < 0)) { + _cairo_error_throw (CAIRO_STATUS_NEGATIVE_COUNT); + /* XXX Can't propagate error */ + goto ZERO_EXTENTS; + } + + if (unlikely (glyphs == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NULL_POINTER); + /* XXX Can't propagate error */ + goto ZERO_EXTENTS; + } + + _cairo_scaled_font_freeze_cache (scaled_font); + + for (i = 0; i < num_glyphs; i++) { + double left, top, right, bottom; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) { + status = _cairo_scaled_font_set_error (scaled_font, status); + goto UNLOCK; + } + + /* "Ink" extents should skip "invisible" glyphs */ + if (scaled_glyph->metrics.width == 0 || scaled_glyph->metrics.height == 0) + continue; + + left = scaled_glyph->metrics.x_bearing + glyphs[i].x; + right = left + scaled_glyph->metrics.width; + top = scaled_glyph->metrics.y_bearing + glyphs[i].y; + bottom = top + scaled_glyph->metrics.height; + + if (!visible) { + visible = TRUE; + min_x = left; + max_x = right; + min_y = top; + max_y = bottom; + } else { + if (left < min_x) min_x = left; + if (right > max_x) max_x = right; + if (top < min_y) min_y = top; + if (bottom > max_y) max_y = bottom; + } + } + + if (visible) { + extents->x_bearing = min_x - glyphs[0].x; + extents->y_bearing = min_y - glyphs[0].y; + extents->width = max_x - min_x; + extents->height = max_y - min_y; + } else { + extents->x_bearing = 0.0; + extents->y_bearing = 0.0; + extents->width = 0.0; + extents->height = 0.0; + } + + if (num_glyphs) { + double x0, y0, x1, y1; + + x0 = glyphs[0].x; + y0 = glyphs[0].y; + + /* scaled_glyph contains the glyph for num_glyphs - 1 already. */ + x1 = glyphs[num_glyphs - 1].x + scaled_glyph->metrics.x_advance; + y1 = glyphs[num_glyphs - 1].y + scaled_glyph->metrics.y_advance; + + extents->x_advance = x1 - x0; + extents->y_advance = y1 - y0; + } else { + extents->x_advance = 0.0; + extents->y_advance = 0.0; + } + + UNLOCK: + _cairo_scaled_font_thaw_cache (scaled_font); + return; + +ZERO_EXTENTS: + extents->x_bearing = 0.0; + extents->y_bearing = 0.0; + extents->width = 0.0; + extents->height = 0.0; + extents->x_advance = 0.0; + extents->y_advance = 0.0; +} +slim_hidden_def (cairo_scaled_font_glyph_extents); + +#define GLYPH_LUT_SIZE 64 +static cairo_status_t +cairo_scaled_font_text_to_glyphs_internal_cached (cairo_scaled_font_t *scaled_font, + double x, + double y, + const char *utf8, + cairo_glyph_t *glyphs, + cairo_text_cluster_t **clusters, + int num_chars) +{ + struct glyph_lut_elt { + unsigned long index; + double x_advance; + double y_advance; + } glyph_lut[GLYPH_LUT_SIZE]; + uint32_t glyph_lut_unicode[GLYPH_LUT_SIZE]; + cairo_status_t status; + const char *p; + int i; + + for (i = 0; i < GLYPH_LUT_SIZE; i++) + glyph_lut_unicode[i] = ~0U; + + p = utf8; + for (i = 0; i < num_chars; i++) { + int idx, num_bytes; + uint32_t unicode; + cairo_scaled_glyph_t *scaled_glyph; + struct glyph_lut_elt *glyph_slot; + + num_bytes = _cairo_utf8_get_char_validated (p, &unicode); + p += num_bytes; + + glyphs[i].x = x; + glyphs[i].y = y; + + idx = unicode % ARRAY_LENGTH (glyph_lut); + glyph_slot = &glyph_lut[idx]; + if (glyph_lut_unicode[idx] == unicode) { + glyphs[i].index = glyph_slot->index; + x += glyph_slot->x_advance; + y += glyph_slot->y_advance; + } else { + unsigned long g; + + g = scaled_font->backend->ucs4_to_index (scaled_font, unicode); + status = _cairo_scaled_glyph_lookup (scaled_font, + g, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) + return status; + + x += scaled_glyph->metrics.x_advance; + y += scaled_glyph->metrics.y_advance; + + glyph_lut_unicode[idx] = unicode; + glyph_slot->index = g; + glyph_slot->x_advance = scaled_glyph->metrics.x_advance; + glyph_slot->y_advance = scaled_glyph->metrics.y_advance; + + glyphs[i].index = g; + } + + if (clusters) { + (*clusters)[i].num_bytes = num_bytes; + (*clusters)[i].num_glyphs = 1; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_scaled_font_text_to_glyphs_internal_uncached (cairo_scaled_font_t *scaled_font, + double x, + double y, + const char *utf8, + cairo_glyph_t *glyphs, + cairo_text_cluster_t **clusters, + int num_chars) +{ + const char *p; + int i; + + p = utf8; + for (i = 0; i < num_chars; i++) { + unsigned long g; + int num_bytes; + uint32_t unicode; + cairo_scaled_glyph_t *scaled_glyph; + cairo_status_t status; + + num_bytes = _cairo_utf8_get_char_validated (p, &unicode); + p += num_bytes; + + glyphs[i].x = x; + glyphs[i].y = y; + + g = scaled_font->backend->ucs4_to_index (scaled_font, unicode); + + /* + * No advance needed for a single character string. So, let's speed up + * one-character strings by skipping glyph lookup. + */ + if (num_chars > 1) { + status = _cairo_scaled_glyph_lookup (scaled_font, + g, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) + return status; + + x += scaled_glyph->metrics.x_advance; + y += scaled_glyph->metrics.y_advance; + } + + glyphs[i].index = g; + + if (clusters) { + (*clusters)[i].num_bytes = num_bytes; + (*clusters)[i].num_glyphs = 1; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_scaled_font_text_to_glyphs: + * @x: X position to place first glyph + * @y: Y position to place first glyph + * @scaled_font: a #cairo_scaled_font_t + * @utf8: a string of text encoded in UTF-8 + * @utf8_len: length of @utf8 in bytes, or -1 if it is NUL-terminated + * @glyphs: pointer to array of glyphs to fill + * @num_glyphs: pointer to number of glyphs + * @clusters: pointer to array of cluster mapping information to fill, or %NULL + * @num_clusters: pointer to number of clusters, or %NULL + * @cluster_flags: pointer to location to store cluster flags corresponding to the + * output @clusters, or %NULL + * + * Converts UTF-8 text to an array of glyphs, optionally with cluster + * mapping, that can be used to render later using @scaled_font. + * + * If @glyphs initially points to a non-%NULL value, that array is used + * as a glyph buffer, and @num_glyphs should point to the number of glyph + * entries available there. If the provided glyph array is too short for + * the conversion, a new glyph array is allocated using cairo_glyph_allocate() + * and placed in @glyphs. Upon return, @num_glyphs always contains the + * number of generated glyphs. If the value @glyphs points to has changed + * after the call, the user is responsible for freeing the allocated glyph + * array using cairo_glyph_free(). This may happen even if the provided + * array was large enough. + * + * If @clusters is not %NULL, @num_clusters and @cluster_flags should not be %NULL, + * and cluster mapping will be computed. + * The semantics of how cluster array allocation works is similar to the glyph + * array. That is, + * if @clusters initially points to a non-%NULL value, that array is used + * as a cluster buffer, and @num_clusters should point to the number of cluster + * entries available there. If the provided cluster array is too short for + * the conversion, a new cluster array is allocated using cairo_text_cluster_allocate() + * and placed in @clusters. Upon return, @num_clusters always contains the + * number of generated clusters. If the value @clusters points at has changed + * after the call, the user is responsible for freeing the allocated cluster + * array using cairo_text_cluster_free(). This may happen even if the provided + * array was large enough. + * + * In the simplest case, @glyphs and @clusters can point to %NULL initially + * and a suitable array will be allocated. In code: + * + * cairo_status_t status; + * + * cairo_glyph_t *glyphs = NULL; + * int num_glyphs; + * cairo_text_cluster_t *clusters = NULL; + * int num_clusters; + * cairo_text_cluster_flags_t cluster_flags; + * + * status = cairo_scaled_font_text_to_glyphs (scaled_font, + * x, y, + * utf8, utf8_len, + * &glyphs, &num_glyphs, + * &clusters, &num_clusters, &cluster_flags); + * + * if (status == CAIRO_STATUS_SUCCESS) { + * cairo_show_text_glyphs (cr, + * utf8, utf8_len, + * glyphs, num_glyphs, + * clusters, num_clusters, cluster_flags); + * + * cairo_glyph_free (glyphs); + * cairo_text_cluster_free (clusters); + * } + * + * + * If no cluster mapping is needed: + * + * cairo_status_t status; + * + * cairo_glyph_t *glyphs = NULL; + * int num_glyphs; + * + * status = cairo_scaled_font_text_to_glyphs (scaled_font, + * x, y, + * utf8, utf8_len, + * &glyphs, &num_glyphs, + * NULL, NULL, + * NULL); + * + * if (status == CAIRO_STATUS_SUCCESS) { + * cairo_show_glyphs (cr, glyphs, num_glyphs); + * cairo_glyph_free (glyphs); + * } + * + * + * If stack-based glyph and cluster arrays are to be used for small + * arrays: + * + * cairo_status_t status; + * + * cairo_glyph_t stack_glyphs[40]; + * cairo_glyph_t *glyphs = stack_glyphs; + * int num_glyphs = sizeof (stack_glyphs) / sizeof (stack_glyphs[0]); + * cairo_text_cluster_t stack_clusters[40]; + * cairo_text_cluster_t *clusters = stack_clusters; + * int num_clusters = sizeof (stack_clusters) / sizeof (stack_clusters[0]); + * cairo_text_cluster_flags_t cluster_flags; + * + * status = cairo_scaled_font_text_to_glyphs (scaled_font, + * x, y, + * utf8, utf8_len, + * &glyphs, &num_glyphs, + * &clusters, &num_clusters, &cluster_flags); + * + * if (status == CAIRO_STATUS_SUCCESS) { + * cairo_show_text_glyphs (cr, + * utf8, utf8_len, + * glyphs, num_glyphs, + * clusters, num_clusters, cluster_flags); + * + * if (glyphs != stack_glyphs) + * cairo_glyph_free (glyphs); + * if (clusters != stack_clusters) + * cairo_text_cluster_free (clusters); + * } + * + * + * For details of how @clusters, @num_clusters, and @cluster_flags map input + * UTF-8 text to the output glyphs see cairo_show_text_glyphs(). + * + * The output values can be readily passed to cairo_show_text_glyphs() + * cairo_show_glyphs(), or related functions, assuming that the exact + * same @scaled_font is used for the operation. + * + * Return value: %CAIRO_STATUS_SUCCESS upon success, or an error status + * if the input values are wrong or if conversion failed. If the input + * values are correct but the conversion failed, the error status is also + * set on @scaled_font. + * + * Since: 1.8 + **/ +#define CACHING_THRESHOLD 16 +cairo_status_t +cairo_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, + double x, + double y, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags) +{ + int num_chars = 0; + cairo_int_status_t status; + cairo_glyph_t *orig_glyphs; + cairo_text_cluster_t *orig_clusters; + + status = scaled_font->status; + if (unlikely (status)) + return status; + + /* A slew of sanity checks */ + + /* glyphs and num_glyphs can't be NULL */ + if (glyphs == NULL || + num_glyphs == NULL) { + status = _cairo_error (CAIRO_STATUS_NULL_POINTER); + goto BAIL; + } + + /* Special case for NULL and -1 */ + if (utf8 == NULL && utf8_len == -1) + utf8_len = 0; + + /* No NULLs for non-NULLs! */ + if ((utf8_len && utf8 == NULL) || + (clusters && num_clusters == NULL) || + (clusters && cluster_flags == NULL)) { + status = _cairo_error (CAIRO_STATUS_NULL_POINTER); + goto BAIL; + } + + /* A -1 for utf8_len means NUL-terminated */ + if (utf8_len == -1) + utf8_len = strlen (utf8); + + /* A NULL *glyphs means no prealloced glyphs array */ + if (glyphs && *glyphs == NULL) + *num_glyphs = 0; + + /* A NULL *clusters means no prealloced clusters array */ + if (clusters && *clusters == NULL) + *num_clusters = 0; + + if (!clusters && num_clusters) { + num_clusters = NULL; + } + + if (cluster_flags) { + *cluster_flags = FALSE; + } + + if (!clusters && cluster_flags) { + cluster_flags = NULL; + } + + /* Apart from that, no negatives */ + if (utf8_len < 0 || + *num_glyphs < 0 || + (num_clusters && *num_clusters < 0)) { + status = _cairo_error (CAIRO_STATUS_NEGATIVE_COUNT); + goto BAIL; + } + + if (utf8_len == 0) { + status = CAIRO_STATUS_SUCCESS; + goto BAIL; + } + + /* validate input so backend does not have to */ + status = _cairo_utf8_to_ucs4 (utf8, utf8_len, NULL, &num_chars); + if (unlikely (status)) + goto BAIL; + + _cairo_scaled_font_freeze_cache (scaled_font); + + orig_glyphs = *glyphs; + orig_clusters = clusters ? *clusters : NULL; + + if (scaled_font->backend->text_to_glyphs) { + status = scaled_font->backend->text_to_glyphs (scaled_font, x, y, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) { + if (status == CAIRO_INT_STATUS_SUCCESS) { + /* The checks here are crude; we only should do them in + * user-font backend, but they don't hurt here. This stuff + * can be hard to get right. */ + + if (*num_glyphs < 0) { + status = _cairo_error (CAIRO_STATUS_NEGATIVE_COUNT); + goto DONE; + } + if (num_glyphs && *glyphs == NULL) { + status = _cairo_error (CAIRO_STATUS_NULL_POINTER); + goto DONE; + } + + if (clusters) { + if (*num_clusters < 0) { + status = _cairo_error (CAIRO_STATUS_NEGATIVE_COUNT); + goto DONE; + } + if (num_clusters && *clusters == NULL) { + status = _cairo_error (CAIRO_STATUS_NULL_POINTER); + goto DONE; + } + + /* Don't trust the backend, validate clusters! */ + status = + _cairo_validate_text_clusters (utf8, utf8_len, + *glyphs, *num_glyphs, + *clusters, *num_clusters, + *cluster_flags); + } + } + + goto DONE; + } + } + + if (*num_glyphs < num_chars) { + *glyphs = cairo_glyph_allocate (num_chars); + if (unlikely (*glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto DONE; + } + } + *num_glyphs = num_chars; + + if (clusters) { + if (*num_clusters < num_chars) { + *clusters = cairo_text_cluster_allocate (num_chars); + if (unlikely (*clusters == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto DONE; + } + } + *num_clusters = num_chars; + } + + if (num_chars > CACHING_THRESHOLD) + status = cairo_scaled_font_text_to_glyphs_internal_cached (scaled_font, + x, y, + utf8, + *glyphs, + clusters, + num_chars); + else + status = cairo_scaled_font_text_to_glyphs_internal_uncached (scaled_font, + x, y, + utf8, + *glyphs, + clusters, + num_chars); + + DONE: /* error that should be logged on scaled_font happened */ + _cairo_scaled_font_thaw_cache (scaled_font); + + if (unlikely (status)) { + *num_glyphs = 0; + if (*glyphs != orig_glyphs) { + cairo_glyph_free (*glyphs); + *glyphs = orig_glyphs; + } + + if (clusters) { + *num_clusters = 0; + if (*clusters != orig_clusters) { + cairo_text_cluster_free (*clusters); + *clusters = orig_clusters; + } + } + } + + return _cairo_scaled_font_set_error (scaled_font, status); + + BAIL: /* error with input arguments */ + + if (num_glyphs) + *num_glyphs = 0; + + if (num_clusters) + *num_clusters = 0; + + return status; +} +slim_hidden_def (cairo_scaled_font_text_to_glyphs); + +static inline cairo_bool_t +_range_contains_glyph (const cairo_box_t *extents, + cairo_fixed_t left, + cairo_fixed_t top, + cairo_fixed_t right, + cairo_fixed_t bottom) +{ + if (left == right || top == bottom) + return FALSE; + + return right > extents->p1.x && + left < extents->p2.x && + bottom > extents->p1.y && + top < extents->p2.y; +} + +static cairo_status_t +_cairo_scaled_font_single_glyph_device_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyph, + cairo_rectangle_int_t *extents) +{ + cairo_scaled_glyph_t *scaled_glyph; + cairo_status_t status; + + _cairo_scaled_font_freeze_cache (scaled_font); + status = _cairo_scaled_glyph_lookup (scaled_font, + glyph->index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + cairo_bool_t round_xy = _cairo_font_options_get_round_glyph_positions (&scaled_font->options) == CAIRO_ROUND_GLYPH_POS_ON; + cairo_box_t box; + cairo_fixed_t v; + + if (round_xy) + v = _cairo_fixed_from_int (_cairo_lround (glyph->x)); + else + v = _cairo_fixed_from_double (glyph->x); + box.p1.x = v + scaled_glyph->bbox.p1.x; + box.p2.x = v + scaled_glyph->bbox.p2.x; + + if (round_xy) + v = _cairo_fixed_from_int (_cairo_lround (glyph->y)); + else + v = _cairo_fixed_from_double (glyph->y); + box.p1.y = v + scaled_glyph->bbox.p1.y; + box.p2.y = v + scaled_glyph->bbox.p2.y; + + _cairo_box_round_to_rectangle (&box, extents); + } + _cairo_scaled_font_thaw_cache (scaled_font); + return status; +} + +/* + * Compute a device-space bounding box for the glyphs. + */ +cairo_status_t +_cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_rectangle_int_t *extents, + cairo_bool_t *overlap_out) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_box_t box = { { INT_MAX, INT_MAX }, { INT_MIN, INT_MIN }}; + cairo_scaled_glyph_t *glyph_cache[64]; + cairo_bool_t overlap = overlap_out ? FALSE : TRUE; + cairo_round_glyph_positions_t round_glyph_positions = _cairo_font_options_get_round_glyph_positions (&scaled_font->options); + int i; + + if (unlikely (scaled_font->status)) + return scaled_font->status; + + if (num_glyphs == 1) { + if (overlap_out) + *overlap_out = FALSE; + return _cairo_scaled_font_single_glyph_device_extents (scaled_font, + glyphs, + extents); + } + + _cairo_scaled_font_freeze_cache (scaled_font); + + memset (glyph_cache, 0, sizeof (glyph_cache)); + + for (i = 0; i < num_glyphs; i++) { + cairo_scaled_glyph_t *scaled_glyph; + cairo_fixed_t x, y, x1, y1, x2, y2; + int cache_index = glyphs[i].index % ARRAY_LENGTH (glyph_cache); + + scaled_glyph = glyph_cache[cache_index]; + if (scaled_glyph == NULL || + _cairo_scaled_glyph_index (scaled_glyph) != glyphs[i].index) + { + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) + break; + + glyph_cache[cache_index] = scaled_glyph; + } + + if (round_glyph_positions == CAIRO_ROUND_GLYPH_POS_ON) + x = _cairo_fixed_from_int (_cairo_lround (glyphs[i].x)); + else + x = _cairo_fixed_from_double (glyphs[i].x); + x1 = x + scaled_glyph->bbox.p1.x; + x2 = x + scaled_glyph->bbox.p2.x; + + if (round_glyph_positions == CAIRO_ROUND_GLYPH_POS_ON) + y = _cairo_fixed_from_int (_cairo_lround (glyphs[i].y)); + else + y = _cairo_fixed_from_double (glyphs[i].y); + y1 = y + scaled_glyph->bbox.p1.y; + y2 = y + scaled_glyph->bbox.p2.y; + + if (overlap == FALSE) + overlap = _range_contains_glyph (&box, x1, y1, x2, y2); + + if (x1 < box.p1.x) box.p1.x = x1; + if (x2 > box.p2.x) box.p2.x = x2; + if (y1 < box.p1.y) box.p1.y = y1; + if (y2 > box.p2.y) box.p2.y = y2; + } + + _cairo_scaled_font_thaw_cache (scaled_font); + if (unlikely (status)) + return _cairo_scaled_font_set_error (scaled_font, status); + + if (box.p1.x < box.p2.x) { + _cairo_box_round_to_rectangle (&box, extents); + } else { + extents->x = extents->y = 0; + extents->width = extents->height = 0; + } + + if (overlap_out != NULL) + *overlap_out = overlap; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +_cairo_scaled_font_glyph_approximate_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_rectangle_int_t *extents) +{ + double x0, x1, y0, y1, pad; + int i; + + /* If any of the factors are suspect (i.e. the font is broken), bail */ + if (scaled_font->fs_extents.max_x_advance == 0 || + scaled_font->fs_extents.height == 0 || + scaled_font->max_scale == 0) + { + return FALSE; + } + + assert (num_glyphs); + + x0 = x1 = glyphs[0].x; + y0 = y1 = glyphs[0].y; + for (i = 1; i < num_glyphs; i++) { + double g; + + g = glyphs[i].x; + if (g < x0) x0 = g; + if (g > x1) x1 = g; + + g = glyphs[i].y; + if (g < y0) y0 = g; + if (g > y1) y1 = g; + } + + pad = MAX(scaled_font->fs_extents.max_x_advance, + scaled_font->fs_extents.height); + pad *= scaled_font->max_scale; + + extents->x = floor (x0 - pad); + extents->width = ceil (x1 + pad) - extents->x; + extents->y = floor (y0 - pad); + extents->height = ceil (y1 + pad) - extents->y; + return TRUE; +} + +#if 0 +/* XXX win32 */ +cairo_status_t +_cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_surface_t *surface, + int source_x, + int source_y, + int dest_x, + int dest_y, + unsigned int width, + unsigned int height, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_region_t *clip_region) +{ + cairo_int_status_t status; + cairo_surface_t *mask = NULL; + cairo_format_t mask_format = CAIRO_FORMAT_A1; /* shut gcc up */ + cairo_surface_pattern_t mask_pattern; + int i; + + /* These operators aren't interpreted the same way by the backends; + * they are implemented in terms of other operators in cairo-gstate.c + */ + assert (op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_CLEAR); + + if (scaled_font->status) + return scaled_font->status; + + if (!num_glyphs) + return CAIRO_STATUS_SUCCESS; + + if (scaled_font->backend->show_glyphs != NULL) { + int remaining_glyphs = num_glyphs; + status = scaled_font->backend->show_glyphs (scaled_font, + op, pattern, + surface, + source_x, source_y, + dest_x, dest_y, + width, height, + glyphs, num_glyphs, + clip_region, + &remaining_glyphs); + glyphs += num_glyphs - remaining_glyphs; + num_glyphs = remaining_glyphs; + if (remaining_glyphs == 0) + status = CAIRO_INT_STATUS_SUCCESS; + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return _cairo_scaled_font_set_error (scaled_font, status); + } + + /* Font display routine either does not exist or failed. */ + + _cairo_scaled_font_freeze_cache (scaled_font); + + for (i = 0; i < num_glyphs; i++) { + int x, y; + cairo_image_surface_t *glyph_surface; + cairo_scaled_glyph_t *scaled_glyph; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + + if (unlikely (status)) + goto CLEANUP_MASK; + + glyph_surface = scaled_glyph->surface; + + /* To start, create the mask using the format from the first + * glyph. Later we'll deal with different formats. */ + if (mask == NULL) { + mask_format = glyph_surface->format; + mask = cairo_image_surface_create (mask_format, width, height); + status = mask->status; + if (unlikely (status)) + goto CLEANUP_MASK; + } + + /* If we have glyphs of different formats, we "upgrade" the mask + * to the wider of the formats. */ + if (glyph_surface->format != mask_format && + _cairo_format_bits_per_pixel (mask_format) < + _cairo_format_bits_per_pixel (glyph_surface->format) ) + { + cairo_surface_t *new_mask; + + switch (glyph_surface->format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + mask_format = glyph_surface->format; + break; + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + mask_format = CAIRO_FORMAT_ARGB32; + break; + } + + new_mask = cairo_image_surface_create (mask_format, width, height); + status = new_mask->status; + if (unlikely (status)) { + cairo_surface_destroy (new_mask); + goto CLEANUP_MASK; + } + + _cairo_pattern_init_for_surface (&mask_pattern, mask); + /* Note that we only upgrade masks, i.e. A1 -> A8 -> ARGB32, so there is + * never any component alpha here. + */ + status = _cairo_surface_composite (CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + &mask_pattern.base, + new_mask, + 0, 0, + 0, 0, + 0, 0, + width, height, + NULL); + + _cairo_pattern_fini (&mask_pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (new_mask); + goto CLEANUP_MASK; + } + + cairo_surface_destroy (mask); + mask = new_mask; + } + + if (glyph_surface->width && glyph_surface->height) { + cairo_surface_pattern_t glyph_pattern; + + /* round glyph locations to the nearest pixel */ + /* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */ + x = _cairo_lround (glyphs[i].x - + glyph_surface->base.device_transform.x0); + y = _cairo_lround (glyphs[i].y - + glyph_surface->base.device_transform.y0); + + _cairo_pattern_init_for_surface (&glyph_pattern, + &glyph_surface->base); + if (mask_format == CAIRO_FORMAT_ARGB32) + glyph_pattern.base.has_component_alpha = TRUE; + + status = _cairo_surface_composite (CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + &glyph_pattern.base, + mask, + 0, 0, + 0, 0, + x - dest_x, y - dest_y, + glyph_surface->width, + glyph_surface->height, + NULL); + + _cairo_pattern_fini (&glyph_pattern.base); + + if (unlikely (status)) + goto CLEANUP_MASK; + } + } + + _cairo_pattern_init_for_surface (&mask_pattern, mask); + if (mask_format == CAIRO_FORMAT_ARGB32) + mask_pattern.base.has_component_alpha = TRUE; + + status = _cairo_surface_composite (op, pattern, &mask_pattern.base, + surface, + source_x, source_y, + 0, 0, + dest_x, dest_y, + width, height, + clip_region); + + _cairo_pattern_fini (&mask_pattern.base); + +CLEANUP_MASK: + _cairo_scaled_font_thaw_cache (scaled_font); + + if (mask != NULL) + cairo_surface_destroy (mask); + return _cairo_scaled_font_set_error (scaled_font, status); +} +#endif + +/* Add a single-device-unit rectangle to a path. */ +static cairo_status_t +_add_unit_rectangle_to_path (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y) +{ + cairo_status_t status; + + status = _cairo_path_fixed_move_to (path, x, y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_rel_line_to (path, + _cairo_fixed_from_int (1), + _cairo_fixed_from_int (0)); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_rel_line_to (path, + _cairo_fixed_from_int (0), + _cairo_fixed_from_int (1)); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_rel_line_to (path, + _cairo_fixed_from_int (-1), + _cairo_fixed_from_int (0)); + if (unlikely (status)) + return status; + + return _cairo_path_fixed_close_path (path); +} + +/** + * _trace_mask_to_path: + * @bitmap: An alpha mask (either %CAIRO_FORMAT_A1 or %CAIRO_FORMAT_A8) + * @path: An initialized path to hold the result + * + * Given a mask surface, (an alpha image), fill out the provided path + * so that when filled it would result in something that approximates + * the mask. + * + * Note: The current tracing code here is extremely primitive. It + * operates only on an A1 surface, (converting an A8 surface to A1 if + * necessary), and performs the tracing by drawing a little square + * around each pixel that is on in the mask. We do not pretend that + * this is a high-quality result. But we are leaving it up to someone + * who cares enough about getting a better result to implement + * something more sophisticated. + **/ +static cairo_status_t +_trace_mask_to_path (cairo_image_surface_t *mask, + cairo_path_fixed_t *path, + double tx, double ty) +{ + const uint8_t *row; + int rows, cols, bytes_per_row; + int x, y, bit; + double xoff, yoff; + cairo_fixed_t x0, y0; + cairo_fixed_t px, py; + cairo_status_t status; + + mask = _cairo_image_surface_coerce_to_format (mask, CAIRO_FORMAT_A1); + status = mask->base.status; + if (unlikely (status)) + return status; + + cairo_surface_get_device_offset (&mask->base, &xoff, &yoff); + x0 = _cairo_fixed_from_double (tx - xoff); + y0 = _cairo_fixed_from_double (ty - yoff); + + bytes_per_row = (mask->width + 7) / 8; + row = mask->data; + for (y = 0, rows = mask->height; rows--; row += mask->stride, y++) { + const uint8_t *byte_ptr = row; + x = 0; + py = _cairo_fixed_from_int (y); + for (cols = bytes_per_row; cols--; ) { + uint8_t byte = *byte_ptr++; + if (byte == 0) { + x += 8; + continue; + } + + byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (byte); + for (bit = 1 << 7; bit && x < mask->width; bit >>= 1, x++) { + if (byte & bit) { + px = _cairo_fixed_from_int (x); + status = _add_unit_rectangle_to_path (path, + px + x0, + py + y0); + if (unlikely (status)) + goto BAIL; + } + } + } + } + +BAIL: + cairo_surface_destroy (&mask->base); + + return status; +} + +cairo_status_t +_cairo_scaled_font_glyph_path (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_path_fixed_t *path) +{ + cairo_int_status_t status; + int i; + + status = scaled_font->status; + if (unlikely (status)) + return status; + + _cairo_scaled_font_freeze_cache (scaled_font); + for (i = 0; i < num_glyphs; i++) { + cairo_scaled_glyph_t *scaled_glyph; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_PATH, + &scaled_glyph); + if (status == CAIRO_INT_STATUS_SUCCESS) { + status = _cairo_path_fixed_append (path, + scaled_glyph->path, + _cairo_fixed_from_double (glyphs[i].x), + _cairo_fixed_from_double (glyphs[i].y)); + + } else if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + /* If the font is incapable of providing a path, then we'll + * have to trace our own from a surface. + */ + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + if (unlikely (status)) + goto BAIL; + + status = _trace_mask_to_path (scaled_glyph->surface, path, + glyphs[i].x, glyphs[i].y); + } + + if (unlikely (status)) + goto BAIL; + } + BAIL: + _cairo_scaled_font_thaw_cache (scaled_font); + + return _cairo_scaled_font_set_error (scaled_font, status); +} + +/** + * _cairo_scaled_glyph_set_metrics: + * @scaled_glyph: a #cairo_scaled_glyph_t + * @scaled_font: a #cairo_scaled_font_t + * @fs_metrics: a #cairo_text_extents_t in font space + * + * _cairo_scaled_glyph_set_metrics() stores user space metrics + * for the specified glyph given font space metrics. It is + * called by the font backend when initializing a glyph with + * %CAIRO_SCALED_GLYPH_INFO_METRICS. + **/ +void +_cairo_scaled_glyph_set_metrics (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_text_extents_t *fs_metrics) +{ + cairo_bool_t first = TRUE; + double hm, wm; + double min_user_x = 0.0, max_user_x = 0.0, min_user_y = 0.0, max_user_y = 0.0; + double min_device_x = 0.0, max_device_x = 0.0, min_device_y = 0.0, max_device_y = 0.0; + double device_x_advance, device_y_advance; + + scaled_glyph->fs_metrics = *fs_metrics; + + for (hm = 0.0; hm <= 1.0; hm += 1.0) + for (wm = 0.0; wm <= 1.0; wm += 1.0) { + double x, y; + + /* Transform this corner to user space */ + x = fs_metrics->x_bearing + fs_metrics->width * wm; + y = fs_metrics->y_bearing + fs_metrics->height * hm; + cairo_matrix_transform_point (&scaled_font->font_matrix, + &x, &y); + if (first) { + min_user_x = max_user_x = x; + min_user_y = max_user_y = y; + } else { + if (x < min_user_x) min_user_x = x; + if (x > max_user_x) max_user_x = x; + if (y < min_user_y) min_user_y = y; + if (y > max_user_y) max_user_y = y; + } + + /* Transform this corner to device space from glyph origin */ + x = fs_metrics->x_bearing + fs_metrics->width * wm; + y = fs_metrics->y_bearing + fs_metrics->height * hm; + cairo_matrix_transform_distance (&scaled_font->scale, + &x, &y); + + if (first) { + min_device_x = max_device_x = x; + min_device_y = max_device_y = y; + } else { + if (x < min_device_x) min_device_x = x; + if (x > max_device_x) max_device_x = x; + if (y < min_device_y) min_device_y = y; + if (y > max_device_y) max_device_y = y; + } + first = FALSE; + } + scaled_glyph->metrics.x_bearing = min_user_x; + scaled_glyph->metrics.y_bearing = min_user_y; + scaled_glyph->metrics.width = max_user_x - min_user_x; + scaled_glyph->metrics.height = max_user_y - min_user_y; + + scaled_glyph->metrics.x_advance = fs_metrics->x_advance; + scaled_glyph->metrics.y_advance = fs_metrics->y_advance; + cairo_matrix_transform_distance (&scaled_font->font_matrix, + &scaled_glyph->metrics.x_advance, + &scaled_glyph->metrics.y_advance); + + device_x_advance = fs_metrics->x_advance; + device_y_advance = fs_metrics->y_advance; + cairo_matrix_transform_distance (&scaled_font->scale, + &device_x_advance, + &device_y_advance); + + scaled_glyph->bbox.p1.x = _cairo_fixed_from_double (min_device_x); + scaled_glyph->bbox.p1.y = _cairo_fixed_from_double (min_device_y); + scaled_glyph->bbox.p2.x = _cairo_fixed_from_double (max_device_x); + scaled_glyph->bbox.p2.y = _cairo_fixed_from_double (max_device_y); + + scaled_glyph->x_advance = _cairo_lround (device_x_advance); + scaled_glyph->y_advance = _cairo_lround (device_y_advance); + + scaled_glyph->has_info |= CAIRO_SCALED_GLYPH_INFO_METRICS; +} + +void +_cairo_scaled_glyph_set_surface (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_image_surface_t *surface) +{ + if (scaled_glyph->surface != NULL) + cairo_surface_destroy (&scaled_glyph->surface->base); + + /* sanity check the backend glyph contents */ + _cairo_debug_check_image_surface_is_defined (&surface->base); + scaled_glyph->surface = surface; + + if (surface != NULL) + scaled_glyph->has_info |= CAIRO_SCALED_GLYPH_INFO_SURFACE; + else + scaled_glyph->has_info &= ~CAIRO_SCALED_GLYPH_INFO_SURFACE; +} + +void +_cairo_scaled_glyph_set_path (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_path_fixed_t *path) +{ + if (scaled_glyph->path != NULL) + _cairo_path_fixed_destroy (scaled_glyph->path); + + scaled_glyph->path = path; + + if (path != NULL) + scaled_glyph->has_info |= CAIRO_SCALED_GLYPH_INFO_PATH; + else + scaled_glyph->has_info &= ~CAIRO_SCALED_GLYPH_INFO_PATH; +} + +void +_cairo_scaled_glyph_set_recording_surface (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_surface_t *recording_surface) +{ + if (scaled_glyph->recording_surface != NULL) { + cairo_surface_finish (scaled_glyph->recording_surface); + cairo_surface_destroy (scaled_glyph->recording_surface); + } + + scaled_glyph->recording_surface = recording_surface; + + if (recording_surface != NULL) + scaled_glyph->has_info |= CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE; + else + scaled_glyph->has_info &= ~CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE; +} + +static cairo_bool_t +_cairo_scaled_glyph_page_can_remove (const void *closure) +{ + const cairo_scaled_glyph_page_t *page = closure; + const cairo_scaled_font_t *scaled_font; + + scaled_font = (cairo_scaled_font_t *) page->cache_entry.hash; + return scaled_font->cache_frozen == 0; +} + +static cairo_status_t +_cairo_scaled_font_allocate_glyph (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t **scaled_glyph) +{ + cairo_scaled_glyph_page_t *page; + cairo_status_t status; + + assert (scaled_font->cache_frozen); + + /* only the first page in the list may contain available slots */ + if (! cairo_list_is_empty (&scaled_font->glyph_pages)) { + page = cairo_list_last_entry (&scaled_font->glyph_pages, + cairo_scaled_glyph_page_t, + link); + if (page->num_glyphs < CAIRO_SCALED_GLYPH_PAGE_SIZE) { + *scaled_glyph = &page->glyphs[page->num_glyphs++]; + return CAIRO_STATUS_SUCCESS; + } + } + + page = malloc (sizeof (cairo_scaled_glyph_page_t)); + if (unlikely (page == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + page->cache_entry.hash = (unsigned long) scaled_font; + page->cache_entry.size = 1; /* XXX occupancy weighting? */ + page->num_glyphs = 0; + + CAIRO_MUTEX_LOCK (_cairo_scaled_glyph_page_cache_mutex); + if (scaled_font->global_cache_frozen == FALSE) { + if (unlikely (cairo_scaled_glyph_page_cache.hash_table == NULL)) { + status = _cairo_cache_init (&cairo_scaled_glyph_page_cache, + NULL, + _cairo_scaled_glyph_page_can_remove, + _cairo_scaled_glyph_page_pluck, + MAX_GLYPH_PAGES_CACHED); + if (unlikely (status)) { + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + free (page); + return status; + } + } + + _cairo_cache_freeze (&cairo_scaled_glyph_page_cache); + scaled_font->global_cache_frozen = TRUE; + } + + status = _cairo_cache_insert (&cairo_scaled_glyph_page_cache, + &page->cache_entry); + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + if (unlikely (status)) { + free (page); + return status; + } + + cairo_list_add_tail (&page->link, &scaled_font->glyph_pages); + + *scaled_glyph = &page->glyphs[page->num_glyphs++]; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_scaled_font_free_last_glyph (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_scaled_glyph_page_t *page; + + assert (! cairo_list_is_empty (&scaled_font->glyph_pages)); + page = cairo_list_last_entry (&scaled_font->glyph_pages, + cairo_scaled_glyph_page_t, + link); + assert (scaled_glyph == &page->glyphs[page->num_glyphs-1]); + + _cairo_scaled_glyph_fini (scaled_font, scaled_glyph); + + if (--page->num_glyphs == 0) { + CAIRO_MUTEX_LOCK (_cairo_scaled_glyph_page_cache_mutex); + /* Temporarily disconnect callback to avoid recursive locking */ + cairo_scaled_glyph_page_cache.entry_destroy = NULL; + _cairo_cache_remove (&cairo_scaled_glyph_page_cache, + &page->cache_entry); + _cairo_scaled_glyph_page_destroy (scaled_font, page); + cairo_scaled_glyph_page_cache.entry_destroy = _cairo_scaled_glyph_page_pluck; + CAIRO_MUTEX_UNLOCK (_cairo_scaled_glyph_page_cache_mutex); + } +} + +/** + * _cairo_scaled_glyph_lookup: + * @scaled_font: a #cairo_scaled_font_t + * @index: the glyph to create + * @info: a #cairo_scaled_glyph_info_t marking which portions of + * the glyph should be filled in. + * @scaled_glyph_ret: a #cairo_scaled_glyph_t where the glyph + * is returned. + * + * If the desired info is not available, (for example, when trying to + * get INFO_PATH with a bitmapped font), this function will return + * %CAIRO_INT_STATUS_UNSUPPORTED. + * + * Note: This function must be called with the scaled font frozen, and it must + * remain frozen for as long as the @scaled_glyph_ret is alive. (If the scaled + * font was not frozen, then there is no guarantee that the glyph would not be + * evicted before you tried to access it.) See + * _cairo_scaled_font_freeze_cache() and _cairo_scaled_font_thaw_cache(). + * + * Returns: a glyph with the requested portions filled in. Glyph + * lookup is cached and glyph will be automatically freed along + * with the scaled_font so no explicit free is required. + * @info can be one or more of: + * %CAIRO_SCALED_GLYPH_INFO_METRICS - glyph metrics and bounding box + * %CAIRO_SCALED_GLYPH_INFO_SURFACE - surface holding glyph image + * %CAIRO_SCALED_GLYPH_INFO_PATH - path holding glyph outline in device space + **/ +cairo_int_status_t +_cairo_scaled_glyph_lookup (cairo_scaled_font_t *scaled_font, + unsigned long index, + cairo_scaled_glyph_info_t info, + cairo_scaled_glyph_t **scaled_glyph_ret) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + cairo_scaled_glyph_t *scaled_glyph; + cairo_scaled_glyph_info_t need_info; + + *scaled_glyph_ret = NULL; + + if (unlikely (scaled_font->status)) + return scaled_font->status; + + assert (CAIRO_MUTEX_IS_LOCKED(scaled_font->mutex)); + assert (scaled_font->cache_frozen); + + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* + * Check cache for glyph + */ + scaled_glyph = _cairo_hash_table_lookup (scaled_font->glyphs, + (cairo_hash_entry_t *) &index); + if (scaled_glyph == NULL) { + status = _cairo_scaled_font_allocate_glyph (scaled_font, &scaled_glyph); + if (unlikely (status)) + goto err; + + memset (scaled_glyph, 0, sizeof (cairo_scaled_glyph_t)); + _cairo_scaled_glyph_set_index (scaled_glyph, index); + cairo_list_init (&scaled_glyph->dev_privates); + + /* ask backend to initialize metrics and shape fields */ + status = + scaled_font->backend->scaled_glyph_init (scaled_font, + scaled_glyph, + info | CAIRO_SCALED_GLYPH_INFO_METRICS); + if (unlikely (status)) { + _cairo_scaled_font_free_last_glyph (scaled_font, scaled_glyph); + goto err; + } + + status = _cairo_hash_table_insert (scaled_font->glyphs, + &scaled_glyph->hash_entry); + if (unlikely (status)) { + _cairo_scaled_font_free_last_glyph (scaled_font, scaled_glyph); + goto err; + } + } + + /* + * Check and see if the glyph, as provided, + * already has the requested data and amend it if not + */ + need_info = info & ~scaled_glyph->has_info; + if (need_info) { + status = scaled_font->backend->scaled_glyph_init (scaled_font, + scaled_glyph, + need_info); + if (unlikely (status)) + goto err; + + /* Don't trust the scaled_glyph_init() return value, the font + * backend may not even know about some of the info. For example, + * no backend other than the user-fonts knows about recording-surface + * glyph info. */ + if (info & ~scaled_glyph->has_info) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + *scaled_glyph_ret = scaled_glyph; + return CAIRO_STATUS_SUCCESS; + +err: + /* It's not an error for the backend to not support the info we want. */ + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + status = _cairo_scaled_font_set_error (scaled_font, status); + return status; +} + +double +_cairo_scaled_font_get_max_scale (cairo_scaled_font_t *scaled_font) +{ + return scaled_font->max_scale; +} + + +/** + * cairo_scaled_font_get_font_face: + * @scaled_font: a #cairo_scaled_font_t + * + * Gets the font face that this scaled font uses. This might be the + * font face passed to cairo_scaled_font_create(), but this does not + * hold true for all possible cases. + * + * Return value: The #cairo_font_face_t with which @scaled_font was + * created. This object is owned by cairo. To keep a reference to it, + * you must call cairo_scaled_font_reference(). + * + * Since: 1.2 + **/ +cairo_font_face_t * +cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font) +{ + if (scaled_font->status) + return (cairo_font_face_t*) &_cairo_font_face_nil; + + if (scaled_font->original_font_face != NULL) + return scaled_font->original_font_face; + + return scaled_font->font_face; +} +slim_hidden_def (cairo_scaled_font_get_font_face); + +/** + * cairo_scaled_font_get_font_matrix: + * @scaled_font: a #cairo_scaled_font_t + * @font_matrix: return value for the matrix + * + * Stores the font matrix with which @scaled_font was created into + * @matrix. + * + * Since: 1.2 + **/ +void +cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *font_matrix) +{ + if (scaled_font->status) { + cairo_matrix_init_identity (font_matrix); + return; + } + + *font_matrix = scaled_font->font_matrix; +} +slim_hidden_def (cairo_scaled_font_get_font_matrix); + +/** + * cairo_scaled_font_get_ctm: + * @scaled_font: a #cairo_scaled_font_t + * @ctm: return value for the CTM + * + * Stores the CTM with which @scaled_font was created into @ctm. + * Note that the translation offsets (x0, y0) of the CTM are ignored + * by cairo_scaled_font_create(). So, the matrix this + * function returns always has 0,0 as x0,y0. + * + * Since: 1.2 + **/ +void +cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *ctm) +{ + if (scaled_font->status) { + cairo_matrix_init_identity (ctm); + return; + } + + *ctm = scaled_font->ctm; +} +slim_hidden_def (cairo_scaled_font_get_ctm); + +/** + * cairo_scaled_font_get_scale_matrix: + * @scaled_font: a #cairo_scaled_font_t + * @scale_matrix: return value for the matrix + * + * Stores the scale matrix of @scaled_font into @matrix. + * The scale matrix is product of the font matrix and the ctm + * associated with the scaled font, and hence is the matrix mapping from + * font space to device space. + * + * Since: 1.8 + **/ +void +cairo_scaled_font_get_scale_matrix (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *scale_matrix) +{ + if (scaled_font->status) { + cairo_matrix_init_identity (scale_matrix); + return; + } + + *scale_matrix = scaled_font->scale; +} + +/** + * cairo_scaled_font_get_font_options: + * @scaled_font: a #cairo_scaled_font_t + * @options: return value for the font options + * + * Stores the font options with which @scaled_font was created into + * @options. + * + * Since: 1.2 + **/ +void +cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font, + cairo_font_options_t *options) +{ + if (cairo_font_options_status (options)) + return; + + if (scaled_font->status) { + _cairo_font_options_init_default (options); + return; + } + + _cairo_font_options_init_copy (options, &scaled_font->options); +} +slim_hidden_def (cairo_scaled_font_get_font_options); diff --git a/src/cairo-script-private.h b/src/cairo-script-private.h new file mode 100644 index 000000000..5b506f500 --- /dev/null +++ b/src/cairo-script-private.h @@ -0,0 +1,59 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SCRIPT_PRIVATE_H +#define CAIRO_SCRIPT_PRIVATE_H + +#include "cairo.h" +#include "cairo-script.h" + +#include "cairo-compiler-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-types-private.h" + +CAIRO_BEGIN_DECLS + +cairo_private cairo_device_t * +_cairo_script_context_create_internal (cairo_output_stream_t *stream); + +cairo_private void +_cairo_script_context_attach_snapshots (cairo_device_t *device, + cairo_bool_t enable); + +slim_hidden_proto (cairo_script_surface_create); + +CAIRO_END_DECLS + +#endif /* CAIRO_SCRIPT_PRIVATE_H */ diff --git a/src/cairo-script-surface.c b/src/cairo-script-surface.c new file mode 100644 index 000000000..b84aed976 --- /dev/null +++ b/src/cairo-script-surface.c @@ -0,0 +1,3999 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +/* The script surface is one that records all operations performed on + * it in the form of a procedural script, similar in fashion to + * PostScript but using Cairo's imaging model. In essence, this is + * equivalent to the recording-surface, but as there is no impedance mismatch + * between Cairo and CairoScript, we can generate output immediately + * without having to copy and hold the data in memory. + */ + +/** + * SECTION:cairo-script + * @Title: Script Surfaces + * @Short_Description: Rendering to replayable scripts + * @See_Also: #cairo_surface_t + * + * The script surface provides the ability to render to a native + * script that matches the cairo drawing model. The scripts can + * be replayed using tools under the util/cairo-script directoriy, + * or with cairo-perf-trace. + **/ + +/** + * CAIRO_HAS_SCRIPT_SURFACE: + * + * Defined if the script surface backend is available. + * The script surface backend is always built in since 1.12. + * + * Since: 1.12 + **/ + + +#include "cairoint.h" + +#include "cairo-script.h" +#include "cairo-script-private.h" + +#include "cairo-analysis-surface-private.h" +#include "cairo-default-context-private.h" +#include "cairo-device-private.h" +#include "cairo-error-private.h" +#include "cairo-list-inline.h" +#include "cairo-image-surface-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-pattern-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-scaled-font-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-surface-wrapper-private.h" + +#if CAIRO_HAS_FT_FONT +#include "cairo-ft-private.h" +#endif + +#include + +#ifdef WORDS_BIGENDIAN +#define to_be32(x) x +#else +#define to_be32(x) bswap_32(x) +#endif + +#define _cairo_output_stream_puts(S, STR) \ + _cairo_output_stream_write ((S), (STR), strlen (STR)) + +#define static cairo_warn static + +typedef struct _cairo_script_context cairo_script_context_t; +typedef struct _cairo_script_surface cairo_script_surface_t; +typedef struct _cairo_script_implicit_context cairo_script_implicit_context_t; +typedef struct _cairo_script_font cairo_script_font_t; + +typedef struct _operand { + enum { + SURFACE, + DEFERRED, + } type; + cairo_list_t link; +} operand_t; + + +struct deferred_finish { + cairo_list_t link; + operand_t operand; +}; + +struct _cairo_script_context { + cairo_device_t base; + + int active; + int attach_snapshots; + + cairo_bool_t owns_stream; + cairo_output_stream_t *stream; + cairo_script_mode_t mode; + + struct _bitmap { + unsigned long min; + unsigned long count; + unsigned int map[64]; + struct _bitmap *next; + } surface_id, font_id; + + cairo_list_t operands; + cairo_list_t deferred; + + cairo_list_t fonts; + cairo_list_t defines; +}; + +struct _cairo_script_font { + cairo_scaled_font_private_t base; + + cairo_bool_t has_sfnt; + unsigned long id; + unsigned long subset_glyph_index; + cairo_list_t link; + cairo_scaled_font_t *parent; +}; + +struct _cairo_script_implicit_context { + cairo_operator_t current_operator; + cairo_fill_rule_t current_fill_rule; + double current_tolerance; + cairo_antialias_t current_antialias; + cairo_stroke_style_t current_style; + cairo_pattern_union_t current_source; + cairo_matrix_t current_ctm; + cairo_matrix_t current_stroke_matrix; + cairo_matrix_t current_font_matrix; + cairo_font_options_t current_font_options; + cairo_scaled_font_t *current_scaled_font; + cairo_path_fixed_t current_path; + cairo_bool_t has_clip; +}; + +struct _cairo_script_surface { + cairo_surface_t base; + + cairo_surface_wrapper_t wrapper; + + cairo_surface_clipper_t clipper; + + operand_t operand; + cairo_bool_t emitted; + cairo_bool_t defined; + cairo_bool_t active; + + double width, height; + + /* implicit flattened context */ + cairo_script_implicit_context_t cr; +}; + +static const cairo_surface_backend_t _cairo_script_surface_backend; + +static cairo_script_surface_t * +_cairo_script_surface_create_internal (cairo_script_context_t *ctx, + cairo_content_t content, + cairo_rectangle_t *extents, + cairo_surface_t *passthrough); + +static void +_cairo_script_scaled_font_fini (cairo_scaled_font_private_t *abstract_private, + cairo_scaled_font_t *scaled_font); + +static void +_cairo_script_implicit_context_init (cairo_script_implicit_context_t *cr); + +static void +_cairo_script_implicit_context_reset (cairo_script_implicit_context_t *cr); + +static void +_bitmap_release_id (struct _bitmap *b, unsigned long token) +{ + struct _bitmap **prev = NULL; + + do { + if (token < b->min + sizeof (b->map) * CHAR_BIT) { + unsigned int bit, elem; + + token -= b->min; + elem = token / (sizeof (b->map[0]) * CHAR_BIT); + bit = token % (sizeof (b->map[0]) * CHAR_BIT); + b->map[elem] &= ~(1 << bit); + if (! --b->count && prev) { + *prev = b->next; + free (b); + } + return; + } + prev = &b->next; + b = b->next; + } while (b != NULL); +} + +static cairo_status_t +_bitmap_next_id (struct _bitmap *b, + unsigned long *id) +{ + struct _bitmap *bb, **prev = NULL; + unsigned long min = 0; + + do { + if (b->min != min) + break; + + if (b->count < sizeof (b->map) * CHAR_BIT) { + unsigned int n, m, bit; + for (n = 0; n < ARRAY_LENGTH (b->map); n++) { + if (b->map[n] == (unsigned int) -1) + continue; + + for (m=0, bit=1; mmap[0])*CHAR_BIT; m++, bit<<=1) { + if ((b->map[n] & bit) == 0) { + b->map[n] |= bit; + b->count++; + *id = n * sizeof (b->map[0])*CHAR_BIT + m + b->min; + return CAIRO_STATUS_SUCCESS; + } + } + } + } + min += sizeof (b->map) * CHAR_BIT; + + prev = &b->next; + b = b->next; + } while (b != NULL); + + bb = malloc (sizeof (struct _bitmap)); + if (unlikely (bb == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + *prev = bb; + bb->next = b; + bb->min = min; + bb->count = 1; + bb->map[0] = 0x1; + memset (bb->map + 1, 0, sizeof (bb->map) - sizeof (bb->map[0])); + *id = min; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_bitmap_fini (struct _bitmap *b) +{ + while (b != NULL) { + struct _bitmap *next = b->next; + free (b); + b = next; + } +} + +static const char * +_direction_to_string (cairo_bool_t backward) +{ + static const char *names[] = { + "FORWARD", + "BACKWARD" + }; + assert (backward < ARRAY_LENGTH (names)); + return names[backward]; +} + +static const char * +_operator_to_string (cairo_operator_t op) +{ + static const char *names[] = { + "CLEAR", /* CAIRO_OPERATOR_CLEAR */ + + "SOURCE", /* CAIRO_OPERATOR_SOURCE */ + "OVER", /* CAIRO_OPERATOR_OVER */ + "IN", /* CAIRO_OPERATOR_IN */ + "OUT", /* CAIRO_OPERATOR_OUT */ + "ATOP", /* CAIRO_OPERATOR_ATOP */ + + "DEST", /* CAIRO_OPERATOR_DEST */ + "DEST_OVER", /* CAIRO_OPERATOR_DEST_OVER */ + "DEST_IN", /* CAIRO_OPERATOR_DEST_IN */ + "DEST_OUT", /* CAIRO_OPERATOR_DEST_OUT */ + "DEST_ATOP", /* CAIRO_OPERATOR_DEST_ATOP */ + + "XOR", /* CAIRO_OPERATOR_XOR */ + "ADD", /* CAIRO_OPERATOR_ADD */ + "SATURATE", /* CAIRO_OPERATOR_SATURATE */ + + "MULTIPLY", /* CAIRO_OPERATOR_MULTIPLY */ + "SCREEN", /* CAIRO_OPERATOR_SCREEN */ + "OVERLAY", /* CAIRO_OPERATOR_OVERLAY */ + "DARKEN", /* CAIRO_OPERATOR_DARKEN */ + "LIGHTEN", /* CAIRO_OPERATOR_LIGHTEN */ + "DODGE", /* CAIRO_OPERATOR_COLOR_DODGE */ + "BURN", /* CAIRO_OPERATOR_COLOR_BURN */ + "HARD_LIGHT", /* CAIRO_OPERATOR_HARD_LIGHT */ + "SOFT_LIGHT", /* CAIRO_OPERATOR_SOFT_LIGHT */ + "DIFFERENCE", /* CAIRO_OPERATOR_DIFFERENCE */ + "EXCLUSION", /* CAIRO_OPERATOR_EXCLUSION */ + "HSL_HUE", /* CAIRO_OPERATOR_HSL_HUE */ + "HSL_SATURATION", /* CAIRO_OPERATOR_HSL_SATURATION */ + "HSL_COLOR", /* CAIRO_OPERATOR_HSL_COLOR */ + "HSL_LUMINOSITY" /* CAIRO_OPERATOR_HSL_LUMINOSITY */ + }; + assert (op < ARRAY_LENGTH (names)); + return names[op]; +} + +static const char * +_extend_to_string (cairo_extend_t extend) +{ + static const char *names[] = { + "EXTEND_NONE", /* CAIRO_EXTEND_NONE */ + "EXTEND_REPEAT", /* CAIRO_EXTEND_REPEAT */ + "EXTEND_REFLECT", /* CAIRO_EXTEND_REFLECT */ + "EXTEND_PAD" /* CAIRO_EXTEND_PAD */ + }; + assert (extend < ARRAY_LENGTH (names)); + return names[extend]; +} + +static const char * +_filter_to_string (cairo_filter_t filter) +{ + static const char *names[] = { + "FILTER_FAST", /* CAIRO_FILTER_FAST */ + "FILTER_GOOD", /* CAIRO_FILTER_GOOD */ + "FILTER_BEST", /* CAIRO_FILTER_BEST */ + "FILTER_NEAREST", /* CAIRO_FILTER_NEAREST */ + "FILTER_BILINEAR", /* CAIRO_FILTER_BILINEAR */ + "FILTER_GAUSSIAN", /* CAIRO_FILTER_GAUSSIAN */ + }; + assert (filter < ARRAY_LENGTH (names)); + return names[filter]; +} + +static const char * +_fill_rule_to_string (cairo_fill_rule_t rule) +{ + static const char *names[] = { + "WINDING", /* CAIRO_FILL_RULE_WINDING */ + "EVEN_ODD" /* CAIRO_FILL_RILE_EVEN_ODD */ + }; + assert (rule < ARRAY_LENGTH (names)); + return names[rule]; +} + +static const char * +_antialias_to_string (cairo_antialias_t antialias) +{ + static const char *names[] = { + "ANTIALIAS_DEFAULT", /* CAIRO_ANTIALIAS_DEFAULT */ + "ANTIALIAS_NONE", /* CAIRO_ANTIALIAS_NONE */ + "ANTIALIAS_GRAY", /* CAIRO_ANTIALIAS_GRAY */ + "ANTIALIAS_SUBPIXEL", /* CAIRO_ANTIALIAS_SUBPIXEL */ + "ANTIALIAS_FAST", /* CAIRO_ANTIALIAS_FAST */ + "ANTIALIAS_GOOD", /* CAIRO_ANTIALIAS_GOOD */ + "ANTIALIAS_BEST" /* CAIRO_ANTIALIAS_BEST */ + }; + assert (antialias < ARRAY_LENGTH (names)); + return names[antialias]; +} + +static const char * +_line_cap_to_string (cairo_line_cap_t line_cap) +{ + static const char *names[] = { + "LINE_CAP_BUTT", /* CAIRO_LINE_CAP_BUTT */ + "LINE_CAP_ROUND", /* CAIRO_LINE_CAP_ROUND */ + "LINE_CAP_SQUARE" /* CAIRO_LINE_CAP_SQUARE */ + }; + assert (line_cap < ARRAY_LENGTH (names)); + return names[line_cap]; +} + +static const char * +_line_join_to_string (cairo_line_join_t line_join) +{ + static const char *names[] = { + "LINE_JOIN_MITER", /* CAIRO_LINE_JOIN_MITER */ + "LINE_JOIN_ROUND", /* CAIRO_LINE_JOIN_ROUND */ + "LINE_JOIN_BEVEL", /* CAIRO_LINE_JOIN_BEVEL */ + }; + assert (line_join < ARRAY_LENGTH (names)); + return names[line_join]; +} + +static inline cairo_script_context_t * +to_context (cairo_script_surface_t *surface) +{ + return (cairo_script_context_t *) surface->base.device; +} + +static cairo_bool_t +target_is_active (cairo_script_surface_t *surface) +{ + return cairo_list_is_first (&surface->operand.link, + &to_context (surface)->operands); +} + +static void +target_push (cairo_script_surface_t *surface) +{ + cairo_list_move (&surface->operand.link, &to_context (surface)->operands); +} + +static int +target_depth (cairo_script_surface_t *surface) +{ + cairo_list_t *link; + int depth = 0; + + cairo_list_foreach (link, &to_context (surface)->operands) { + if (link == &surface->operand.link) + break; + depth++; + } + + return depth; +} + +static void +_get_target (cairo_script_surface_t *surface) +{ + cairo_script_context_t *ctx = to_context (surface); + + if (target_is_active (surface)) { + _cairo_output_stream_puts (ctx->stream, "dup "); + return; + } + + if (surface->defined) { + _cairo_output_stream_printf (ctx->stream, "s%u ", + surface->base.unique_id); + } else { + int depth = target_depth (surface); + + assert (! cairo_list_is_empty (&surface->operand.link)); + assert (! target_is_active (surface)); + + if (ctx->active) { + _cairo_output_stream_printf (ctx->stream, "%d index ", depth); + _cairo_output_stream_puts (ctx->stream, "/target get exch pop "); + } else { + if (depth == 1) { + _cairo_output_stream_puts (ctx->stream, "exch "); + } else { + _cairo_output_stream_printf (ctx->stream, + "%d -1 roll ", depth); + } + target_push (surface); + _cairo_output_stream_puts (ctx->stream, "dup "); + } + } +} + +static const char * +_content_to_string (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: return "ALPHA"; + case CAIRO_CONTENT_COLOR: return "COLOR"; + default: + case CAIRO_CONTENT_COLOR_ALPHA: return "COLOR_ALPHA"; + } +} + +static cairo_status_t +_emit_surface (cairo_script_surface_t *surface) +{ + cairo_script_context_t *ctx = to_context (surface); + + _cairo_output_stream_printf (ctx->stream, + "<< /content //%s", + _content_to_string (surface->base.content)); + if (surface->width != -1 && surface->height != -1) { + _cairo_output_stream_printf (ctx->stream, + " /width %f /height %f", + surface->width, + surface->height); + } + + if (surface->base.x_fallback_resolution != + CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT || + surface->base.y_fallback_resolution != + CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT) + { + _cairo_output_stream_printf (ctx->stream, + " /fallback-resolution [%f %f]", + surface->base.x_fallback_resolution, + surface->base.y_fallback_resolution); + } + + if (surface->base.device_transform.x0 != 0. || + surface->base.device_transform.y0 != 0.) + { + /* XXX device offset is encoded into the pattern matrices etc. */ + if (0) { + _cairo_output_stream_printf (ctx->stream, + " /device-offset [%f %f]", + surface->base.device_transform.x0, + surface->base.device_transform.y0); + } + } + + _cairo_output_stream_puts (ctx->stream, " >> surface context\n"); + surface->emitted = TRUE; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_context (cairo_script_surface_t *surface) +{ + cairo_script_context_t *ctx = to_context (surface); + + if (target_is_active (surface)) + return CAIRO_STATUS_SUCCESS; + + while (! cairo_list_is_empty (&ctx->operands)) { + operand_t *op; + cairo_script_surface_t *old; + + op = cairo_list_first_entry (&ctx->operands, + operand_t, + link); + if (op->type == DEFERRED) + break; + + old = cairo_container_of (op, cairo_script_surface_t, operand); + if (old == surface) + break; + if (old->active) + break; + + if (! old->defined) { + assert (old->emitted); + _cairo_output_stream_printf (ctx->stream, + "/target get /s%u exch def pop\n", + old->base.unique_id); + old->defined = TRUE; + } else { + _cairo_output_stream_puts (ctx->stream, "pop\n"); + } + + cairo_list_del (&old->operand.link); + } + + if (target_is_active (surface)) + return CAIRO_STATUS_SUCCESS; + + if (! surface->emitted) { + cairo_status_t status; + + status = _emit_surface (surface); + if (unlikely (status)) + return status; + } else if (cairo_list_is_empty (&surface->operand.link)) { + assert (surface->defined); + _cairo_output_stream_printf (ctx->stream, + "s%u context\n", + surface->base.unique_id); + _cairo_script_implicit_context_reset (&surface->cr); + _cairo_surface_clipper_reset (&surface->clipper); + } else { + int depth = target_depth (surface); + if (depth == 1) { + _cairo_output_stream_puts (ctx->stream, "exch\n"); + } else { + _cairo_output_stream_printf (ctx->stream, + "%d -1 roll\n", + depth); + } + } + target_push (surface); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_operator (cairo_script_surface_t *surface, + cairo_operator_t op) +{ + assert (target_is_active (surface)); + + if (surface->cr.current_operator == op) + return CAIRO_STATUS_SUCCESS; + + surface->cr.current_operator = op; + + _cairo_output_stream_printf (to_context (surface)->stream, + "//%s set-operator\n", + _operator_to_string (op)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_fill_rule (cairo_script_surface_t *surface, + cairo_fill_rule_t fill_rule) +{ + assert (target_is_active (surface)); + + if (surface->cr.current_fill_rule == fill_rule) + return CAIRO_STATUS_SUCCESS; + + surface->cr.current_fill_rule = fill_rule; + + _cairo_output_stream_printf (to_context (surface)->stream, + "//%s set-fill-rule\n", + _fill_rule_to_string (fill_rule)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_tolerance (cairo_script_surface_t *surface, + double tolerance, + cairo_bool_t force) +{ + assert (target_is_active (surface)); + + if ((! force || + fabs (tolerance - CAIRO_GSTATE_TOLERANCE_DEFAULT) < 1e-5) && + surface->cr.current_tolerance == tolerance) + { + return CAIRO_STATUS_SUCCESS; + } + + surface->cr.current_tolerance = tolerance; + + _cairo_output_stream_printf (to_context (surface)->stream, + "%f set-tolerance\n", + tolerance); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_antialias (cairo_script_surface_t *surface, + cairo_antialias_t antialias) +{ + assert (target_is_active (surface)); + + if (surface->cr.current_antialias == antialias) + return CAIRO_STATUS_SUCCESS; + + surface->cr.current_antialias = antialias; + + _cairo_output_stream_printf (to_context (surface)->stream, + "//%s set-antialias\n", + _antialias_to_string (antialias)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_line_width (cairo_script_surface_t *surface, + double line_width, + cairo_bool_t force) +{ + assert (target_is_active (surface)); + + if ((! force || + fabs (line_width - CAIRO_GSTATE_LINE_WIDTH_DEFAULT) < 1e-5) && + surface->cr.current_style.line_width == line_width) + { + return CAIRO_STATUS_SUCCESS; + } + + surface->cr.current_style.line_width = line_width; + + _cairo_output_stream_printf (to_context (surface)->stream, + "%f set-line-width\n", + line_width); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_line_cap (cairo_script_surface_t *surface, + cairo_line_cap_t line_cap) +{ + assert (target_is_active (surface)); + + if (surface->cr.current_style.line_cap == line_cap) + return CAIRO_STATUS_SUCCESS; + + surface->cr.current_style.line_cap = line_cap; + + _cairo_output_stream_printf (to_context (surface)->stream, + "//%s set-line-cap\n", + _line_cap_to_string (line_cap)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_line_join (cairo_script_surface_t *surface, + cairo_line_join_t line_join) +{ + assert (target_is_active (surface)); + + if (surface->cr.current_style.line_join == line_join) + return CAIRO_STATUS_SUCCESS; + + surface->cr.current_style.line_join = line_join; + + _cairo_output_stream_printf (to_context (surface)->stream, + "//%s set-line-join\n", + _line_join_to_string (line_join)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_miter_limit (cairo_script_surface_t *surface, + double miter_limit, + cairo_bool_t force) +{ + assert (target_is_active (surface)); + + if ((! force || + fabs (miter_limit - CAIRO_GSTATE_MITER_LIMIT_DEFAULT) < 1e-5) && + surface->cr.current_style.miter_limit == miter_limit) + { + return CAIRO_STATUS_SUCCESS; + } + + surface->cr.current_style.miter_limit = miter_limit; + + _cairo_output_stream_printf (to_context (surface)->stream, + "%f set-miter-limit\n", + miter_limit); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_dashes_equal (const double *a, const double *b, int num_dashes) +{ + while (num_dashes--) { + if (fabs (*a - *b) > 1e-5) + return FALSE; + a++, b++; + } + + return TRUE; +} + +static cairo_status_t +_emit_dash (cairo_script_surface_t *surface, + const double *dash, + unsigned int num_dashes, + double offset, + cairo_bool_t force) +{ + unsigned int n; + + assert (target_is_active (surface)); + + if (force && + num_dashes == 0 && + surface->cr.current_style.num_dashes == 0) + { + return CAIRO_STATUS_SUCCESS; + } + + if (! force && + (surface->cr.current_style.num_dashes == num_dashes && + (num_dashes == 0 || + (fabs (surface->cr.current_style.dash_offset - offset) < 1e-5 && + _dashes_equal (surface->cr.current_style.dash, dash, num_dashes))))) + { + return CAIRO_STATUS_SUCCESS; + } + + + if (num_dashes) { + surface->cr.current_style.dash = _cairo_realloc_ab + (surface->cr.current_style.dash, num_dashes, sizeof (double)); + if (unlikely (surface->cr.current_style.dash == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (surface->cr.current_style.dash, dash, + sizeof (double) * num_dashes); + } else { + free (surface->cr.current_style.dash); + surface->cr.current_style.dash = NULL; + } + + surface->cr.current_style.num_dashes = num_dashes; + surface->cr.current_style.dash_offset = offset; + + _cairo_output_stream_puts (to_context (surface)->stream, "["); + for (n = 0; n < num_dashes; n++) { + _cairo_output_stream_printf (to_context (surface)->stream, "%f", dash[n]); + if (n < num_dashes-1) + _cairo_output_stream_puts (to_context (surface)->stream, " "); + } + _cairo_output_stream_printf (to_context (surface)->stream, + "] %f set-dash\n", + offset); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_stroke_style (cairo_script_surface_t *surface, + const cairo_stroke_style_t *style, + cairo_bool_t force) +{ + cairo_status_t status; + + assert (target_is_active (surface)); + + status = _emit_line_width (surface, style->line_width, force); + if (unlikely (status)) + return status; + + status = _emit_line_cap (surface, style->line_cap); + if (unlikely (status)) + return status; + + status = _emit_line_join (surface, style->line_join); + if (unlikely (status)) + return status; + + status = _emit_miter_limit (surface, style->miter_limit, force); + if (unlikely (status)) + return status; + + status = _emit_dash (surface, + style->dash, style->num_dashes, style->dash_offset, + force); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static const char * +_format_to_string (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: return "ARGB32"; + case CAIRO_FORMAT_RGB30: return "RGB30"; + case CAIRO_FORMAT_RGB24: return "RGB24"; + case CAIRO_FORMAT_RGB16_565: return "RGB16_565"; + case CAIRO_FORMAT_A8: return "A8"; + case CAIRO_FORMAT_A1: return "A1"; + case CAIRO_FORMAT_INVALID: return "INVALID"; + } + ASSERT_NOT_REACHED; + return "INVALID"; +} + +static cairo_status_t +_emit_solid_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; + cairo_script_context_t *ctx = to_context (surface); + + if (! CAIRO_COLOR_IS_OPAQUE (&solid->color)) + { + if (! (surface->base.content & CAIRO_CONTENT_COLOR) || + ((solid->color.red_short == 0 || solid->color.red_short == 0xffff) && + (solid->color.green_short == 0 || solid->color.green_short == 0xffff) && + (solid->color.blue_short == 0 || solid->color.blue_short == 0xffff) )) + { + _cairo_output_stream_printf (ctx->stream, + "%f a", + solid->color.alpha); + } + else + { + _cairo_output_stream_printf (ctx->stream, + "%f %f %f %f rgba", + solid->color.red, + solid->color.green, + solid->color.blue, + solid->color.alpha); + } + } + else + { + if (solid->color.red_short == solid->color.green_short && + solid->color.red_short == solid->color.blue_short) + { + _cairo_output_stream_printf (ctx->stream, + "%f g", + solid->color.red); + } + else + { + _cairo_output_stream_printf (ctx->stream, + "%f %f %f rgb", + solid->color.red, + solid->color.green, + solid->color.blue); + } + } + + return CAIRO_STATUS_SUCCESS; +} + + +static cairo_status_t +_emit_gradient_color_stops (cairo_gradient_pattern_t *gradient, + cairo_output_stream_t *output) +{ + unsigned int n; + + for (n = 0; n < gradient->n_stops; n++) { + _cairo_output_stream_printf (output, + "\n %f %f %f %f %f add-color-stop", + gradient->stops[n].offset, + gradient->stops[n].color.red, + gradient->stops[n].color.green, + gradient->stops[n].color.blue, + gradient->stops[n].color.alpha); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_linear_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_linear_pattern_t *linear; + + linear = (cairo_linear_pattern_t *) pattern; + + _cairo_output_stream_printf (ctx->stream, + "%f %f %f %f linear", + linear->pd1.x, linear->pd1.y, + linear->pd2.x, linear->pd2.y); + return _emit_gradient_color_stops (&linear->base, ctx->stream); +} + +static cairo_status_t +_emit_radial_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_radial_pattern_t *radial; + + radial = (cairo_radial_pattern_t *) pattern; + + _cairo_output_stream_printf (ctx->stream, + "%f %f %f %f %f %f radial", + radial->cd1.center.x, + radial->cd1.center.y, + radial->cd1.radius, + radial->cd2.center.x, + radial->cd2.center.y, + radial->cd2.radius); + return _emit_gradient_color_stops (&radial->base, ctx->stream); +} + +static cairo_status_t +_emit_mesh_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_pattern_t *mesh; + cairo_status_t status; + unsigned int i, n; + + mesh = (cairo_pattern_t *) pattern; + status = cairo_mesh_pattern_get_patch_count (mesh, &n); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (ctx->stream, "mesh"); + for (i = 0; i < n; i++) { + cairo_path_t *path; + cairo_path_data_t *data; + int j; + + _cairo_output_stream_printf (ctx->stream, "\n begin-patch"); + + path = cairo_mesh_pattern_get_path (mesh, i); + if (unlikely (path->status)) + return path->status; + + for (j = 0; j < path->num_data; j+=data[0].header.length) { + data = &path->data[j]; + switch (data->header.type) { + case CAIRO_PATH_MOVE_TO: + _cairo_output_stream_printf (ctx->stream, + "\n %f %f m", + data[1].point.x, data[1].point.y); + break; + case CAIRO_PATH_LINE_TO: + _cairo_output_stream_printf (ctx->stream, + "\n %f %f l", + data[1].point.x, data[1].point.y); + break; + case CAIRO_PATH_CURVE_TO: + _cairo_output_stream_printf (ctx->stream, + "\n %f %f %f %f %f %f c", + data[1].point.x, data[1].point.y, + data[2].point.x, data[2].point.y, + data[3].point.x, data[3].point.y); + break; + case CAIRO_PATH_CLOSE_PATH: + break; + } + } + cairo_path_destroy (path); + + for (j = 0; j < 4; j++) { + double x, y; + + status = cairo_mesh_pattern_get_control_point (mesh, i, j, &x, &y); + if (unlikely (status)) + return status; + _cairo_output_stream_printf (ctx->stream, + "\n %d %f %f set-control-point", + j, x, y); + } + + for (j = 0; j < 4; j++) { + double r, g, b, a; + + status = cairo_mesh_pattern_get_corner_color_rgba (mesh, i, j, &r, &g, &b, &a); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (ctx->stream, + "\n %d %f %f %f %f set-corner-color", + j, r, g, b, a); + } + + _cairo_output_stream_printf (ctx->stream, "\n end-patch"); + } + + return CAIRO_STATUS_SUCCESS; +} + +struct script_snapshot { + cairo_surface_t base; +}; + +static cairo_status_t +script_snapshot_finish (void *abstract_surface) +{ + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t script_snapshot_backend = { + CAIRO_SURFACE_TYPE_SCRIPT, + script_snapshot_finish, +}; + +static void +detach_snapshot (cairo_surface_t *abstract_surface) +{ + cairo_script_surface_t *surface = (cairo_script_surface_t *)abstract_surface; + cairo_script_context_t *ctx = to_context (surface); + + _cairo_output_stream_printf (ctx->stream, + "/s%d undef\n", + surface->base.unique_id); +} + +static void +attach_snapshot (cairo_script_context_t *ctx, + cairo_surface_t *source) +{ + struct script_snapshot *surface; + + if (! ctx->attach_snapshots) + return; + + surface = malloc (sizeof (*surface)); + if (unlikely (surface == NULL)) + return; + + _cairo_surface_init (&surface->base, + &script_snapshot_backend, + &ctx->base, + source->content); + + _cairo_output_stream_printf (ctx->stream, + "dup /s%d exch def ", + surface->base.unique_id); + + _cairo_surface_attach_snapshot (source, &surface->base, detach_snapshot); + cairo_surface_destroy (&surface->base); +} + +static cairo_status_t +_emit_recording_surface_pattern (cairo_script_surface_t *surface, + cairo_recording_surface_t *source) +{ + cairo_script_implicit_context_t old_cr; + cairo_script_context_t *ctx = to_context (surface); + cairo_script_surface_t *similar; + cairo_surface_t *snapshot; + cairo_rectangle_t r, *extents; + cairo_status_t status; + + snapshot = _cairo_surface_has_snapshot (&source->base, &script_snapshot_backend); + if (snapshot) { + _cairo_output_stream_printf (ctx->stream, "s%d", snapshot->unique_id); + return CAIRO_INT_STATUS_SUCCESS; + } + + extents = NULL; + if (_cairo_recording_surface_get_bounds (&source->base, &r)) + extents = &r; + + similar = _cairo_script_surface_create_internal (ctx, + source->base.content, + extents, + NULL); + if (unlikely (similar->base.status)) + return similar->base.status; + + similar->base.is_clear = TRUE; + + _cairo_output_stream_printf (ctx->stream, "//%s ", + _content_to_string (source->base.content)); + if (extents) { + _cairo_output_stream_printf (ctx->stream, "[%f %f %f %f]", + extents->x, extents->y, + extents->width, extents->height); + } else + _cairo_output_stream_puts (ctx->stream, "[]"); + _cairo_output_stream_puts (ctx->stream, " record\n"); + + attach_snapshot (ctx, &source->base); + + _cairo_output_stream_puts (ctx->stream, "dup context\n"); + + target_push (similar); + similar->emitted = TRUE; + + + old_cr = surface->cr; + _cairo_script_implicit_context_init (&surface->cr); + status = _cairo_recording_surface_replay (&source->base, &similar->base); + surface->cr = old_cr; + + if (unlikely (status)) { + cairo_surface_destroy (&similar->base); + return status; + } + + cairo_list_del (&similar->operand.link); + assert (target_is_active (surface)); + + _cairo_output_stream_puts (ctx->stream, "pop "); + cairo_surface_destroy (&similar->base); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_script_surface_pattern (cairo_script_surface_t *surface, + cairo_script_surface_t *source) +{ + _get_target (source); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_write_image_surface (cairo_output_stream_t *output, + const cairo_image_surface_t *image) +{ + int stride, row, width; + uint8_t row_stack[CAIRO_STACK_BUFFER_SIZE]; + uint8_t *rowdata; + uint8_t *data; + + stride = image->stride; + width = image->width; + data = image->data; +#if WORDS_BIGENDIAN + switch (image->format) { + case CAIRO_FORMAT_A1: + for (row = image->height; row--; ) { + _cairo_output_stream_write (output, data, (width+7)/8); + data += stride; + } + break; + case CAIRO_FORMAT_A8: + for (row = image->height; row--; ) { + _cairo_output_stream_write (output, data, width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB16_565: + for (row = image->height; row--; ) { + _cairo_output_stream_write (output, data, 2*width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB24: + for (row = image->height; row--; ) { + int col; + rowdata = data; + for (col = width; col--; ) { + _cairo_output_stream_write (output, rowdata, 3); + rowdata+=4; + } + data += stride; + } + break; + case CAIRO_FORMAT_ARGB32: + for (row = image->height; row--; ) { + _cairo_output_stream_write (output, data, 4*width); + data += stride; + } + break; + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + break; + } +#else + if (stride > ARRAY_LENGTH (row_stack)) { + rowdata = malloc (stride); + if (unlikely (rowdata == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + rowdata = row_stack; + + switch (image->format) { + case CAIRO_FORMAT_A1: + for (row = image->height; row--; ) { + int col; + for (col = 0; col < (width + 7)/8; col++) + rowdata[col] = CAIRO_BITSWAP8 (data[col]); + _cairo_output_stream_write (output, rowdata, (width+7)/8); + data += stride; + } + break; + case CAIRO_FORMAT_A8: + for (row = image->height; row--; ) { + _cairo_output_stream_write (output, data, width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB16_565: + for (row = image->height; row--; ) { + uint16_t *src = (uint16_t *) data; + uint16_t *dst = (uint16_t *) rowdata; + int col; + for (col = 0; col < width; col++) + dst[col] = bswap_16 (src[col]); + _cairo_output_stream_write (output, rowdata, 2*width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB24: + for (row = image->height; row--; ) { + uint8_t *src = data; + int col; + for (col = 0; col < width; col++) { + rowdata[3*col+2] = *src++; + rowdata[3*col+1] = *src++; + rowdata[3*col+0] = *src++; + src++; + } + _cairo_output_stream_write (output, rowdata, 3*width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: + for (row = image->height; row--; ) { + uint32_t *src = (uint32_t *) data; + uint32_t *dst = (uint32_t *) rowdata; + int col; + for (col = 0; col < width; col++) + dst[col] = bswap_32 (src[col]); + _cairo_output_stream_write (output, rowdata, 4*width); + data += stride; + } + break; + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + break; + } + if (rowdata != row_stack) + free (rowdata); +#endif + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_png_surface (cairo_script_surface_t *surface, + cairo_image_surface_t *image) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_output_stream_t *base85_stream; + cairo_status_t status; + const uint8_t *mime_data; + unsigned long mime_data_length; + + cairo_surface_get_mime_data (&image->base, CAIRO_MIME_TYPE_PNG, + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_output_stream_printf (ctx->stream, + "<< " + "/width %d " + "/height %d " + "/format //%s " + "/mime-type (image/png) " + "/source <~", + image->width, image->height, + _format_to_string (image->format)); + + base85_stream = _cairo_base85_stream_create (ctx->stream); + _cairo_output_stream_write (base85_stream, mime_data, mime_data_length); + status = _cairo_output_stream_destroy (base85_stream); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (ctx->stream, "~> >> image "); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_image_surface (cairo_script_surface_t *surface, + cairo_image_surface_t *image) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_output_stream_t *base85_stream; + cairo_output_stream_t *zlib_stream; + cairo_int_status_t status, status2; + cairo_surface_t *snapshot; + const uint8_t *mime_data; + unsigned long mime_data_length; + + snapshot = _cairo_surface_has_snapshot (&image->base, + &script_snapshot_backend); + if (snapshot) { + _cairo_output_stream_printf (ctx->stream, "s%u ", snapshot->unique_id); + return CAIRO_INT_STATUS_SUCCESS; + } + + status = _emit_png_surface (surface, image); + if (_cairo_int_status_is_error (status)) { + return status; + } else if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_image_surface_t *clone; + uint32_t len; + + if (image->format == CAIRO_FORMAT_INVALID) { + clone = _cairo_image_surface_coerce (image); + } else { + clone = (cairo_image_surface_t *) + cairo_surface_reference (&image->base); + } + + _cairo_output_stream_printf (ctx->stream, + "<< " + "/width %d " + "/height %d " + "/format //%s " + "/source ", + clone->width, clone->height, + _format_to_string (clone->format)); + + switch (clone->format) { + case CAIRO_FORMAT_A1: + len = (clone->width + 7)/8; + break; + case CAIRO_FORMAT_A8: + len = clone->width; + break; + case CAIRO_FORMAT_RGB16_565: + len = clone->width * 2; + break; + case CAIRO_FORMAT_RGB24: + len = clone->width * 3; + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: + len = clone->width * 4; + break; + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + len = 0; + break; + } + len *= clone->height; + + if (len > 24) { + _cairo_output_stream_puts (ctx->stream, "<|"); + + base85_stream = _cairo_base85_stream_create (ctx->stream); + + len = to_be32 (len); + _cairo_output_stream_write (base85_stream, &len, sizeof (len)); + + zlib_stream = _cairo_deflate_stream_create (base85_stream); + status = _write_image_surface (zlib_stream, clone); + + status2 = _cairo_output_stream_destroy (zlib_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + status2 = _cairo_output_stream_destroy (base85_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + if (unlikely (status)) + return status; + } else { + _cairo_output_stream_puts (ctx->stream, "<~"); + + base85_stream = _cairo_base85_stream_create (ctx->stream); + status = _write_image_surface (base85_stream, clone); + status2 = _cairo_output_stream_destroy (base85_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + if (unlikely (status)) + return status; + } + _cairo_output_stream_puts (ctx->stream, "~> >> image "); + + cairo_surface_destroy (&clone->base); + } + + cairo_surface_get_mime_data (&image->base, CAIRO_MIME_TYPE_JPEG, + &mime_data, &mime_data_length); + if (mime_data != NULL) { + _cairo_output_stream_printf (ctx->stream, + "\n (%s) <~", + CAIRO_MIME_TYPE_JPEG); + + base85_stream = _cairo_base85_stream_create (ctx->stream); + _cairo_output_stream_write (base85_stream, mime_data, mime_data_length); + status = _cairo_output_stream_destroy (base85_stream); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (ctx->stream, "~> set-mime-data\n"); + } + + cairo_surface_get_mime_data (&image->base, CAIRO_MIME_TYPE_JP2, + &mime_data, &mime_data_length); + if (mime_data != NULL) { + _cairo_output_stream_printf (ctx->stream, + "\n (%s) <~", + CAIRO_MIME_TYPE_JP2); + + base85_stream = _cairo_base85_stream_create (ctx->stream); + _cairo_output_stream_write (base85_stream, mime_data, mime_data_length); + status = _cairo_output_stream_destroy (base85_stream); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (ctx->stream, "~> set-mime-data\n"); + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_image_surface_pattern (cairo_script_surface_t *surface, + cairo_surface_t *source) +{ + cairo_image_surface_t *image; + cairo_status_t status; + void *extra; + + status = _cairo_surface_acquire_source_image (source, &image, &extra); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _emit_image_surface (surface, image); + _cairo_surface_release_source_image (source, image, extra); + } + + return status; +} + +static cairo_int_status_t +_emit_subsurface_pattern (cairo_script_surface_t *surface, + cairo_surface_subsurface_t *sub) +{ + cairo_surface_t *source = sub->target; + cairo_int_status_t status; + + switch ((int) source->backend->type) { + case CAIRO_SURFACE_TYPE_RECORDING: + status = _emit_recording_surface_pattern (surface, (cairo_recording_surface_t *) source); + break; + case CAIRO_SURFACE_TYPE_SCRIPT: + status = _emit_script_surface_pattern (surface, (cairo_script_surface_t *) source); + break; + default: + status = _emit_image_surface_pattern (surface, source); + break; + } + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (to_context (surface)->stream, + "%d %d %d %d subsurface ", + sub->extents.x, + sub->extents.y, + sub->extents.width, + sub->extents.height); + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_surface_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_surface_pattern_t *surface_pattern; + cairo_surface_t *source, *snapshot, *free_me = NULL; + cairo_surface_t *take_snapshot = NULL; + cairo_int_status_t status; + + surface_pattern = (cairo_surface_pattern_t *) pattern; + source = surface_pattern->surface; + + if (_cairo_surface_is_snapshot (source)) { + snapshot = _cairo_surface_has_snapshot (source, &script_snapshot_backend); + if (snapshot) { + _cairo_output_stream_printf (ctx->stream, + "s%d pattern ", + snapshot->unique_id); + return CAIRO_INT_STATUS_SUCCESS; + } + + if (_cairo_surface_snapshot_is_reused (source)) + take_snapshot = source; + + free_me = source = _cairo_surface_snapshot_get_target (source); + } + + switch ((int) source->backend->type) { + case CAIRO_SURFACE_TYPE_RECORDING: + status = _emit_recording_surface_pattern (surface, (cairo_recording_surface_t *) source); + break; + case CAIRO_SURFACE_TYPE_SCRIPT: + status = _emit_script_surface_pattern (surface, (cairo_script_surface_t *) source); + break; + case CAIRO_SURFACE_TYPE_SUBSURFACE: + status = _emit_subsurface_pattern (surface, (cairo_surface_subsurface_t *) source); + break; + default: + status = _emit_image_surface_pattern (surface, source); + break; + } + cairo_surface_destroy (free_me); + if (unlikely (status)) + return status; + + if (take_snapshot) + attach_snapshot (ctx, take_snapshot); + + _cairo_output_stream_puts (ctx->stream, "pattern"); + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_raster_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_surface_t *source; + cairo_int_status_t status; + + source = _cairo_raster_source_pattern_acquire (pattern, &surface->base, NULL); + if (unlikely (source == NULL)) { + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + if (unlikely (source->status)) + return source->status; + + status = _emit_image_surface_pattern (surface, source); + _cairo_raster_source_pattern_release (pattern, source); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (to_context(surface)->stream, "pattern"); + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_pattern (cairo_script_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_int_status_t status; + cairo_bool_t is_default_extend; + cairo_bool_t need_newline = TRUE; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + /* solid colors do not need filter/extend/matrix */ + return _emit_solid_pattern (surface, pattern); + + case CAIRO_PATTERN_TYPE_LINEAR: + status = _emit_linear_pattern (surface, pattern); + is_default_extend = pattern->extend == CAIRO_EXTEND_GRADIENT_DEFAULT; + break; + case CAIRO_PATTERN_TYPE_RADIAL: + status = _emit_radial_pattern (surface, pattern); + is_default_extend = pattern->extend == CAIRO_EXTEND_GRADIENT_DEFAULT; + break; + case CAIRO_PATTERN_TYPE_MESH: + status = _emit_mesh_pattern (surface, pattern); + is_default_extend = TRUE; + break; + case CAIRO_PATTERN_TYPE_SURFACE: + status = _emit_surface_pattern (surface, pattern); + is_default_extend = pattern->extend == CAIRO_EXTEND_SURFACE_DEFAULT; + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + status = _emit_raster_pattern (surface, pattern); + is_default_extend = pattern->extend == CAIRO_EXTEND_SURFACE_DEFAULT; + break; + + default: + ASSERT_NOT_REACHED; + status = CAIRO_INT_STATUS_UNSUPPORTED; + } + if (unlikely (status)) + return status; + + if (! _cairo_matrix_is_identity (&pattern->matrix)) { + if (need_newline) { + _cairo_output_stream_puts (ctx->stream, "\n "); + need_newline = FALSE; + } + + _cairo_output_stream_printf (ctx->stream, + " [%f %f %f %f %f %f] set-matrix\n ", + pattern->matrix.xx, pattern->matrix.yx, + pattern->matrix.xy, pattern->matrix.yy, + pattern->matrix.x0, pattern->matrix.y0); + } + + /* XXX need to discriminate the user explicitly setting the default */ + if (pattern->filter != CAIRO_FILTER_DEFAULT) { + if (need_newline) { + _cairo_output_stream_puts (ctx->stream, "\n "); + need_newline = FALSE; + } + + _cairo_output_stream_printf (ctx->stream, + " //%s set-filter\n ", + _filter_to_string (pattern->filter)); + } + if (! is_default_extend ){ + if (need_newline) { + _cairo_output_stream_puts (ctx->stream, "\n "); + need_newline = FALSE; + } + + _cairo_output_stream_printf (ctx->stream, + " //%s set-extend\n ", + _extend_to_string (pattern->extend)); + } + + if (need_newline) + _cairo_output_stream_puts (ctx->stream, "\n "); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_identity (cairo_script_surface_t *surface, + cairo_bool_t *matrix_updated) +{ + assert (target_is_active (surface)); + + if (_cairo_matrix_is_identity (&surface->cr.current_ctm)) + return CAIRO_INT_STATUS_SUCCESS; + + _cairo_output_stream_puts (to_context (surface)->stream, + "identity set-matrix\n"); + + *matrix_updated = TRUE; + cairo_matrix_init_identity (&surface->cr.current_ctm); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_emit_source (cairo_script_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source) +{ + cairo_bool_t matrix_updated = FALSE; + cairo_int_status_t status; + + assert (target_is_active (surface)); + + if (op == CAIRO_OPERATOR_CLEAR) { + /* the source is ignored, so don't change it */ + return CAIRO_INT_STATUS_SUCCESS; + } + + if (_cairo_pattern_equal (&surface->cr.current_source.base, source)) + return CAIRO_INT_STATUS_SUCCESS; + + _cairo_pattern_fini (&surface->cr.current_source.base); + status = _cairo_pattern_init_copy (&surface->cr.current_source.base, + source); + if (unlikely (status)) + return status; + + status = _emit_identity (surface, &matrix_updated); + if (unlikely (status)) + return status; + + status = _emit_pattern (surface, source); + if (unlikely (status)) + return status; + + assert (target_is_active (surface)); + _cairo_output_stream_puts (to_context (surface)->stream, + " set-source\n"); + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_status_t +_path_move_to (void *closure, + const cairo_point_t *point) +{ + _cairo_output_stream_printf (closure, + " %f %f m", + _cairo_fixed_to_double (point->x), + _cairo_fixed_to_double (point->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_path_line_to (void *closure, + const cairo_point_t *point) +{ + _cairo_output_stream_printf (closure, + " %f %f l", + _cairo_fixed_to_double (point->x), + _cairo_fixed_to_double (point->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_path_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + _cairo_output_stream_printf (closure, + " %f %f %f %f %f %f c", + _cairo_fixed_to_double (p1->x), + _cairo_fixed_to_double (p1->y), + _cairo_fixed_to_double (p2->x), + _cairo_fixed_to_double (p2->y), + _cairo_fixed_to_double (p3->x), + _cairo_fixed_to_double (p3->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_path_close (void *closure) +{ + _cairo_output_stream_printf (closure, + " h"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_path_boxes (cairo_script_surface_t *surface, + const cairo_path_fixed_t *path) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_path_fixed_iter_t iter; + cairo_status_t status; + struct _cairo_boxes_chunk *chunk; + cairo_boxes_t boxes; + cairo_box_t box; + int i; + + _cairo_boxes_init (&boxes); + _cairo_path_fixed_iter_init (&iter, path); + while (_cairo_path_fixed_iter_is_fill_box (&iter, &box)) { + if (box.p1.y == box.p2.y || box.p1.x == box.p2.x) + continue; + + status = _cairo_boxes_add (&boxes, CAIRO_ANTIALIAS_DEFAULT, &box); + if (unlikely (status)) { + _cairo_boxes_fini (&boxes); + return status; + } + } + + if (! _cairo_path_fixed_iter_at_end (&iter)) { + _cairo_boxes_fini (&boxes); + return FALSE; + } + + for (chunk = &boxes.chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + const cairo_box_t *b = &chunk->base[i]; + double x1 = _cairo_fixed_to_double (b->p1.x); + double y1 = _cairo_fixed_to_double (b->p1.y); + double x2 = _cairo_fixed_to_double (b->p2.x); + double y2 = _cairo_fixed_to_double (b->p2.y); + + _cairo_output_stream_printf (ctx->stream, + "\n %f %f %f %f rectangle", + x1, y1, x2 - x1, y2 - y1); + } + } + + _cairo_boxes_fini (&boxes); + return status; +} + +static cairo_status_t +_emit_path (cairo_script_surface_t *surface, + const cairo_path_fixed_t *path, + cairo_bool_t is_fill) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_box_t box; + cairo_int_status_t status; + + assert (target_is_active (surface)); + assert (_cairo_matrix_is_identity (&surface->cr.current_ctm)); + + if (_cairo_path_fixed_equal (&surface->cr.current_path, path)) + return CAIRO_STATUS_SUCCESS; + + _cairo_path_fixed_fini (&surface->cr.current_path); + + _cairo_output_stream_puts (ctx->stream, "n"); + + if (path == NULL) { + _cairo_path_fixed_init (&surface->cr.current_path); + _cairo_output_stream_puts (ctx->stream, "\n"); + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_path_fixed_init_copy (&surface->cr.current_path, path); + if (unlikely (status)) + return status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_is_rectangle (path, &box)) { + double x1 = _cairo_fixed_to_double (box.p1.x); + double y1 = _cairo_fixed_to_double (box.p1.y); + double x2 = _cairo_fixed_to_double (box.p2.x); + double y2 = _cairo_fixed_to_double (box.p2.y); + + assert (x1 > -9999); + + _cairo_output_stream_printf (ctx->stream, + " %f %f %f %f rectangle", + x1, y1, x2 - x1, y2 - y1); + status = CAIRO_INT_STATUS_SUCCESS; + } else if (is_fill && _cairo_path_fixed_fill_is_rectilinear (path)) { + status = _emit_path_boxes (surface, path); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_path_fixed_interpret (path, + _path_move_to, + _path_line_to, + _path_curve_to, + _path_close, + ctx->stream); + } + + _cairo_output_stream_puts (ctx->stream, "\n"); + + return status; +} +static cairo_bool_t +_scaling_matrix_equal (const cairo_matrix_t *a, + const cairo_matrix_t *b) +{ + return fabs (a->xx - b->xx) < 1e-5 && + fabs (a->xy - b->xy) < 1e-5 && + fabs (a->yx - b->yx) < 1e-5 && + fabs (a->yy - b->yy) < 1e-5; +} + +static cairo_status_t +_emit_scaling_matrix (cairo_script_surface_t *surface, + const cairo_matrix_t *ctm, + cairo_bool_t *matrix_updated) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_bool_t was_identity; + assert (target_is_active (surface)); + + if (_scaling_matrix_equal (&surface->cr.current_ctm, ctm)) + return CAIRO_STATUS_SUCCESS; + + was_identity = _cairo_matrix_is_identity (&surface->cr.current_ctm); + + *matrix_updated = TRUE; + surface->cr.current_ctm = *ctm; + surface->cr.current_ctm.x0 = 0.; + surface->cr.current_ctm.y0 = 0.; + + if (_cairo_matrix_is_identity (&surface->cr.current_ctm)) { + _cairo_output_stream_puts (ctx->stream, + "identity set-matrix\n"); + } else if (was_identity && fabs (ctm->yx) < 1e-5 && fabs (ctm->xy) < 1e-5) { + _cairo_output_stream_printf (ctx->stream, + "%f %f scale\n", + ctm->xx, ctm->yy); + } else { + _cairo_output_stream_printf (ctx->stream, + "[%f %f %f %f 0 0] set-matrix\n", + ctm->xx, ctm->yx, + ctm->xy, ctm->yy); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_font_matrix (cairo_script_surface_t *surface, + const cairo_matrix_t *font_matrix) +{ + cairo_script_context_t *ctx = to_context (surface); + assert (target_is_active (surface)); + + if (memcmp (&surface->cr.current_font_matrix, + font_matrix, + sizeof (cairo_matrix_t)) == 0) + { + return CAIRO_STATUS_SUCCESS; + } + + surface->cr.current_font_matrix = *font_matrix; + + if (_cairo_matrix_is_identity (font_matrix)) { + _cairo_output_stream_puts (ctx->stream, + "identity set-font-matrix\n"); + } else { + _cairo_output_stream_printf (ctx->stream, + "[%f %f %f %f %f %f] set-font-matrix\n", + font_matrix->xx, font_matrix->yx, + font_matrix->xy, font_matrix->yy, + font_matrix->x0, font_matrix->y0); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_script_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_script_surface_t *surface, *other = abstract_surface; + cairo_surface_t *passthrough = NULL; + cairo_script_context_t *ctx; + cairo_rectangle_t extents; + cairo_status_t status; + + ctx = to_context (other); + + status = cairo_device_acquire (&ctx->base); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (! other->emitted) { + status = _emit_surface (other); + if (unlikely (status)) { + cairo_device_release (&ctx->base); + return _cairo_surface_create_in_error (status); + } + + target_push (other); + } + + if (_cairo_surface_wrapper_is_active (&other->wrapper)) { + passthrough = + _cairo_surface_wrapper_create_similar (&other->wrapper, + content, width, height); + if (unlikely (passthrough->status)) { + cairo_device_release (&ctx->base); + return passthrough; + } + } + + extents.x = extents.y = 0; + extents.width = width; + extents.height = height; + surface = _cairo_script_surface_create_internal (ctx, content, + &extents, passthrough); + cairo_surface_destroy (passthrough); + + if (unlikely (surface->base.status)) { + cairo_device_release (&ctx->base); + return &surface->base; + } + + _get_target (other); + _cairo_output_stream_printf (ctx->stream, + "%u %u //%s similar dup /s%u exch def context\n", + width, height, + _content_to_string (content), + surface->base.unique_id); + + surface->emitted = TRUE; + surface->defined = TRUE; + surface->base.is_clear = TRUE; + target_push (surface); + + cairo_device_release (&ctx->base); + return &surface->base; +} + +static cairo_status_t +_device_flush (void *abstract_device) +{ + cairo_script_context_t *ctx = abstract_device; + + return _cairo_output_stream_flush (ctx->stream); +} + +static void +_device_destroy (void *abstract_device) +{ + cairo_script_context_t *ctx = abstract_device; + cairo_status_t status; + + while (! cairo_list_is_empty (&ctx->fonts)) { + cairo_script_font_t *font; + + font = cairo_list_first_entry (&ctx->fonts, cairo_script_font_t, link); + cairo_list_del (&font->base.link); + cairo_list_del (&font->link); + free (font); + } + + _bitmap_fini (ctx->surface_id.next); + _bitmap_fini (ctx->font_id.next); + + if (ctx->owns_stream) + status = _cairo_output_stream_destroy (ctx->stream); + + free (ctx); +} + +static cairo_surface_t * +_cairo_script_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_script_surface_t *surface = abstract_surface; + + if (extents) { + extents->x = extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + } + + return &surface->base; +} + +static cairo_status_t +_cairo_script_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_script_surface_t *surface = abstract_surface; + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) { + return _cairo_surface_wrapper_acquire_source_image (&surface->wrapper, + image_out, + image_extra); + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static void +_cairo_script_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_script_surface_t *surface = abstract_surface; + + assert (_cairo_surface_wrapper_is_active (&surface->wrapper)); + _cairo_surface_wrapper_release_source_image (&surface->wrapper, + image, + image_extra); +} + +static cairo_status_t +_cairo_script_surface_finish (void *abstract_surface) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_script_context_t *ctx = to_context (surface); + cairo_status_t status = CAIRO_STATUS_SUCCESS, status2; + + _cairo_surface_wrapper_fini (&surface->wrapper); + + free (surface->cr.current_style.dash); + surface->cr.current_style.dash = NULL; + + _cairo_pattern_fini (&surface->cr.current_source.base); + _cairo_path_fixed_fini (&surface->cr.current_path); + _cairo_surface_clipper_reset (&surface->clipper); + + status = cairo_device_acquire (&ctx->base); + if (unlikely (status)) + return status; + + if (surface->emitted) { + assert (! surface->active); + + if (! cairo_list_is_empty (&surface->operand.link)) { + if (! ctx->active) { + if (target_is_active (surface)) { + _cairo_output_stream_printf (ctx->stream, + "pop\n"); + } else { + int depth = target_depth (surface); + if (depth == 1) { + _cairo_output_stream_printf (ctx->stream, + "exch pop\n"); + } else { + _cairo_output_stream_printf (ctx->stream, + "%d -1 roll pop\n", + depth); + } + } + cairo_list_del (&surface->operand.link); + } else { + struct deferred_finish *link = malloc (sizeof (*link)); + if (link == NULL) { + status2 = _cairo_error (CAIRO_STATUS_NO_MEMORY); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + cairo_list_del (&surface->operand.link); + } else { + link->operand.type = DEFERRED; + cairo_list_swap (&link->operand.link, + &surface->operand.link); + cairo_list_add (&link->link, &ctx->deferred); + } + } + } + + if (surface->defined) { + _cairo_output_stream_printf (ctx->stream, + "/s%u undef\n", + surface->base.unique_id); + } + } + + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_output_stream_flush (to_context (surface)->stream); + + cairo_device_release (&ctx->base); + + return status; +} + +static cairo_int_status_t +_cairo_script_surface_copy_page (void *abstract_surface) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_status_t status; + + status = cairo_device_acquire (surface->base.device); + if (unlikely (status)) + return status; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + _cairo_output_stream_puts (to_context (surface)->stream, "copy-page\n"); + +BAIL: + cairo_device_release (surface->base.device); + return status; +} + +static cairo_int_status_t +_cairo_script_surface_show_page (void *abstract_surface) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_status_t status; + + status = cairo_device_acquire (surface->base.device); + if (unlikely (status)) + return status; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + _cairo_output_stream_puts (to_context (surface)->stream, "show-page\n"); + +BAIL: + cairo_device_release (surface->base.device); + return status; +} + +static cairo_status_t +_cairo_script_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_script_surface_t *surface = cairo_container_of (clipper, + cairo_script_surface_t, + clipper); + cairo_script_context_t *ctx = to_context (surface); + cairo_bool_t matrix_updated = FALSE; + cairo_status_t status; + cairo_box_t box; + + status = _emit_context (surface); + if (unlikely (status)) + return status; + + if (path == NULL) { + if (surface->cr.has_clip) { + _cairo_output_stream_puts (ctx->stream, "reset-clip\n"); + surface->cr.has_clip = FALSE; + } + return CAIRO_STATUS_SUCCESS; + } + + /* skip the trivial clip covering the surface extents */ + if (surface->width >= 0 && surface->height >= 0 && + _cairo_path_fixed_is_box (path, &box)) + { + if (box.p1.x <= 0 && box.p1.y <= 0 && + box.p2.x >= _cairo_fixed_from_double (surface->width) && + box.p2.y >= _cairo_fixed_from_double (surface->height)) + { + return CAIRO_STATUS_SUCCESS; + } + } + + status = _emit_identity (surface, &matrix_updated); + if (unlikely (status)) + return status; + + status = _emit_fill_rule (surface, fill_rule); + if (unlikely (status)) + return status; + + if (path->has_curve_to) { + status = _emit_tolerance (surface, tolerance, matrix_updated); + if (unlikely (status)) + return status; + } + + if (! _cairo_path_fixed_fill_maybe_region (path)) { + status = _emit_antialias (surface, antialias); + if (unlikely (status)) + return status; + } + + status = _emit_path (surface, path, TRUE); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (ctx->stream, "clip+\n"); + surface->cr.has_clip = TRUE; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +active (cairo_script_surface_t *surface) +{ + cairo_status_t status; + + status = cairo_device_acquire (surface->base.device); + if (unlikely (status)) + return status; + + if (surface->active++ == 0) + to_context (surface)->active++; + + return CAIRO_STATUS_SUCCESS; +} + +static void +inactive (cairo_script_surface_t *surface) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_list_t sorted; + + assert (surface->active > 0); + if (--surface->active) + goto DONE; + + assert (ctx->active > 0); + if (--ctx->active) + goto DONE; + + cairo_list_init (&sorted); + while (! cairo_list_is_empty (&ctx->deferred)) { + struct deferred_finish *df; + cairo_list_t *operand; + int depth; + + df = cairo_list_first_entry (&ctx->deferred, + struct deferred_finish, + link); + + depth = 0; + cairo_list_foreach (operand, &ctx->operands) { + if (operand == &df->operand.link) + break; + depth++; + } + + df->operand.type = depth; + + if (cairo_list_is_empty (&sorted)) { + cairo_list_move (&df->link, &sorted); + } else { + struct deferred_finish *pos; + + cairo_list_foreach_entry (pos, struct deferred_finish, + &sorted, + link) + { + if (df->operand.type < pos->operand.type) + break; + } + cairo_list_move_tail (&df->link, &pos->link); + } + } + + while (! cairo_list_is_empty (&sorted)) { + struct deferred_finish *df; + cairo_list_t *operand; + int depth; + + df = cairo_list_first_entry (&sorted, + struct deferred_finish, + link); + + depth = 0; + cairo_list_foreach (operand, &ctx->operands) { + if (operand == &df->operand.link) + break; + depth++; + } + + if (depth == 0) { + _cairo_output_stream_printf (ctx->stream, + "pop\n"); + } else if (depth == 1) { + _cairo_output_stream_printf (ctx->stream, + "exch pop\n"); + } else { + _cairo_output_stream_printf (ctx->stream, + "%d -1 roll pop\n", + depth); + } + + cairo_list_del (&df->operand.link); + cairo_list_del (&df->link); + free (df); + } + +DONE: + cairo_device_release (surface->base.device); +} + +static cairo_int_status_t +_cairo_script_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_status_t status; + + status = active (surface); + if (unlikely (status)) + return status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + goto BAIL; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + status = _emit_source (surface, op, source); + if (unlikely (status)) + goto BAIL; + + status = _emit_operator (surface, op); + if (unlikely (status)) + goto BAIL; + + _cairo_output_stream_puts (to_context (surface)->stream, + "paint\n"); + + inactive (surface); + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) { + return _cairo_surface_wrapper_paint (&surface->wrapper, + op, source, clip); + } + + return CAIRO_STATUS_SUCCESS; + +BAIL: + inactive (surface); + return status; +} + +static cairo_int_status_t +_cairo_script_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_status_t status; + + status = active (surface); + if (unlikely (status)) + return status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + goto BAIL; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + status = _emit_source (surface, op, source); + if (unlikely (status)) + goto BAIL; + + status = _emit_operator (surface, op); + if (unlikely (status)) + goto BAIL; + + if (_cairo_pattern_equal (source, mask)) { + _cairo_output_stream_puts (to_context (surface)->stream, "/source get"); + } else { + status = _emit_pattern (surface, mask); + if (unlikely (status)) + goto BAIL; + } + + assert (surface->cr.current_operator == op); + + _cairo_output_stream_puts (to_context (surface)->stream, + " mask\n"); + + inactive (surface); + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) { + return _cairo_surface_wrapper_mask (&surface->wrapper, + op, source, mask, clip); + } + + return CAIRO_STATUS_SUCCESS; + +BAIL: + inactive (surface); + return status; +} + +static cairo_int_status_t +_cairo_script_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_bool_t matrix_updated = FALSE; + cairo_status_t status; + + status = active (surface); + if (unlikely (status)) + return status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + goto BAIL; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + status = _emit_identity (surface, &matrix_updated); + if (unlikely (status)) + goto BAIL; + + status = _emit_path (surface, path, FALSE); + if (unlikely (status)) + goto BAIL; + + status = _emit_source (surface, op, source); + if (unlikely (status)) + goto BAIL; + + status = _emit_scaling_matrix (surface, ctm, &matrix_updated); + if (unlikely (status)) + goto BAIL; + + status = _emit_operator (surface, op); + if (unlikely (status)) + goto BAIL; + + if (_scaling_matrix_equal (&surface->cr.current_ctm, + &surface->cr.current_stroke_matrix)) + { + matrix_updated = FALSE; + } + else + { + matrix_updated = TRUE; + surface->cr.current_stroke_matrix = surface->cr.current_ctm; + } + + status = _emit_stroke_style (surface, style, matrix_updated); + if (unlikely (status)) + goto BAIL; + + status = _emit_tolerance (surface, tolerance, matrix_updated); + if (unlikely (status)) + goto BAIL; + + status = _emit_antialias (surface, antialias); + if (unlikely (status)) + goto BAIL; + + _cairo_output_stream_puts (to_context (surface)->stream, "stroke+\n"); + + inactive (surface); + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) { + return _cairo_surface_wrapper_stroke (&surface->wrapper, + op, source, path, + style, + ctm, ctm_inverse, + tolerance, antialias, + clip); + } + + return CAIRO_STATUS_SUCCESS; + +BAIL: + inactive (surface); + return status; +} + +static cairo_int_status_t +_cairo_script_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_bool_t matrix_updated = FALSE; + cairo_status_t status; + cairo_box_t box; + + status = active (surface); + if (unlikely (status)) + return status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + goto BAIL; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + status = _emit_identity (surface, &matrix_updated); + if (unlikely (status)) + goto BAIL; + + status = _emit_source (surface, op, source); + if (unlikely (status)) + goto BAIL; + + if (! _cairo_path_fixed_is_box (path, &box)) { + status = _emit_fill_rule (surface, fill_rule); + if (unlikely (status)) + goto BAIL; + } + + if (path->has_curve_to) { + status = _emit_tolerance (surface, tolerance, matrix_updated); + if (unlikely (status)) + goto BAIL; + } + + if (! _cairo_path_fixed_fill_maybe_region (path)) { + status = _emit_antialias (surface, antialias); + if (unlikely (status)) + goto BAIL; + } + + status = _emit_path (surface, path, TRUE); + if (unlikely (status)) + goto BAIL; + + status = _emit_operator (surface, op); + if (unlikely (status)) + goto BAIL; + + _cairo_output_stream_puts (to_context (surface)->stream, "fill+\n"); + + inactive (surface); + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) { + return _cairo_surface_wrapper_fill (&surface->wrapper, + op, source, path, + fill_rule, + tolerance, + antialias, + clip); + } + + return CAIRO_STATUS_SUCCESS; + +BAIL: + inactive (surface); + return status; +} + +static cairo_surface_t * +_cairo_script_surface_snapshot (void *abstract_surface) +{ + cairo_script_surface_t *surface = abstract_surface; + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) + return _cairo_surface_wrapper_snapshot (&surface->wrapper); + + return NULL; +} + +static cairo_bool_t +_cairo_script_surface_has_show_text_glyphs (void *abstract_surface) +{ + return TRUE; +} + +static const char * +_subpixel_order_to_string (cairo_subpixel_order_t subpixel_order) +{ + static const char *names[] = { + "SUBPIXEL_ORDER_DEFAULT", /* CAIRO_SUBPIXEL_ORDER_DEFAULT */ + "SUBPIXEL_ORDER_RGB", /* CAIRO_SUBPIXEL_ORDER_RGB */ + "SUBPIXEL_ORDER_BGR", /* CAIRO_SUBPIXEL_ORDER_BGR */ + "SUBPIXEL_ORDER_VRGB", /* CAIRO_SUBPIXEL_ORDER_VRGB */ + "SUBPIXEL_ORDER_VBGR" /* CAIRO_SUBPIXEL_ORDER_VBGR */ + }; + return names[subpixel_order]; +} +static const char * +_hint_style_to_string (cairo_hint_style_t hint_style) +{ + static const char *names[] = { + "HINT_STYLE_DEFAULT", /* CAIRO_HINT_STYLE_DEFAULT */ + "HINT_STYLE_NONE", /* CAIRO_HINT_STYLE_NONE */ + "HINT_STYLE_SLIGHT", /* CAIRO_HINT_STYLE_SLIGHT */ + "HINT_STYLE_MEDIUM", /* CAIRO_HINT_STYLE_MEDIUM */ + "HINT_STYLE_FULL" /* CAIRO_HINT_STYLE_FULL */ + }; + return names[hint_style]; +} +static const char * +_hint_metrics_to_string (cairo_hint_metrics_t hint_metrics) +{ + static const char *names[] = { + "HINT_METRICS_DEFAULT", /* CAIRO_HINT_METRICS_DEFAULT */ + "HINT_METRICS_OFF", /* CAIRO_HINT_METRICS_OFF */ + "HINT_METRICS_ON" /* CAIRO_HINT_METRICS_ON */ + }; + return names[hint_metrics]; +} + +static cairo_status_t +_emit_font_options (cairo_script_surface_t *surface, + cairo_font_options_t *font_options) +{ + cairo_script_context_t *ctx = to_context (surface); + + if (cairo_font_options_equal (&surface->cr.current_font_options, + font_options)) + { + return CAIRO_STATUS_SUCCESS; + } + + _cairo_output_stream_printf (ctx->stream, "<<"); + + if (font_options->antialias != surface->cr.current_font_options.antialias) { + _cairo_output_stream_printf (ctx->stream, + " /antialias //%s", + _antialias_to_string (font_options->antialias)); + } + + if (font_options->subpixel_order != + surface->cr.current_font_options.subpixel_order) + { + _cairo_output_stream_printf (ctx->stream, + " /subpixel-order //%s", + _subpixel_order_to_string (font_options->subpixel_order)); + } + + if (font_options->hint_style != + surface->cr.current_font_options.hint_style) + { + _cairo_output_stream_printf (ctx->stream, + " /hint-style //%s", + _hint_style_to_string (font_options->hint_style)); + } + + if (font_options->hint_metrics != + surface->cr.current_font_options.hint_metrics) + { + _cairo_output_stream_printf (ctx->stream, + " /hint-metrics //%s", + _hint_metrics_to_string (font_options->hint_metrics)); + } + + _cairo_output_stream_printf (ctx->stream, + " >> set-font-options\n"); + + surface->cr.current_font_options = *font_options; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_script_scaled_font_fini (cairo_scaled_font_private_t *abstract_private, + cairo_scaled_font_t *scaled_font) +{ + cairo_script_font_t *priv = (cairo_script_font_t *)abstract_private; + cairo_script_context_t *ctx = (cairo_script_context_t *)abstract_private->key; + cairo_status_t status; + + status = cairo_device_acquire (&ctx->base); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + _cairo_output_stream_printf (ctx->stream, + "/f%lu undef /sf%lu undef\n", + priv->id, + priv->id); + + _bitmap_release_id (&ctx->font_id, priv->id); + cairo_device_release (&ctx->base); + } + + cairo_list_del (&priv->link); + cairo_list_del (&priv->base.link); + free (priv); +} + +static cairo_script_font_t * +_cairo_script_font_get (cairo_script_context_t *ctx, cairo_scaled_font_t *font) +{ + return (cairo_script_font_t *) _cairo_scaled_font_find_private (font, ctx); +} + +static long unsigned +_cairo_script_font_id (cairo_script_context_t *ctx, cairo_scaled_font_t *font) +{ + return _cairo_script_font_get (ctx, font)->id; +} + +static cairo_status_t +_emit_type42_font (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font) +{ + cairo_script_context_t *ctx = to_context (surface); + const cairo_scaled_font_backend_t *backend; + cairo_output_stream_t *base85_stream; + cairo_output_stream_t *zlib_stream; + cairo_status_t status, status2; + unsigned long size; + unsigned int load_flags; + uint32_t len; + uint8_t *buf; + + backend = scaled_font->backend; + if (backend->load_truetype_table == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = 0; + status = backend->load_truetype_table (scaled_font, 0, 0, NULL, &size); + if (unlikely (status)) + return status; + + buf = malloc (size); + if (unlikely (buf == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = backend->load_truetype_table (scaled_font, 0, 0, buf, &size); + if (unlikely (status)) { + free (buf); + return status; + } + +#if CAIRO_HAS_FT_FONT + load_flags = _cairo_ft_scaled_font_get_load_flags (scaled_font); +#else + load_flags = 0; +#endif + _cairo_output_stream_printf (ctx->stream, + "<< " + "/type 42 " + "/index 0 " + "/flags %d " + "/source <|", + load_flags); + + base85_stream = _cairo_base85_stream_create (ctx->stream); + len = to_be32 (size); + _cairo_output_stream_write (base85_stream, &len, sizeof (len)); + + zlib_stream = _cairo_deflate_stream_create (base85_stream); + + _cairo_output_stream_write (zlib_stream, buf, size); + free (buf); + + status2 = _cairo_output_stream_destroy (zlib_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + status2 = _cairo_output_stream_destroy (base85_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + _cairo_output_stream_printf (ctx->stream, + "~> >> font dup /f%lu exch def set-font-face", + _cairo_script_font_id (ctx, scaled_font)); + + return status; +} + +static cairo_status_t +_emit_scaled_font_init (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font, + cairo_script_font_t **font_out) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_script_font_t *font_private; + cairo_int_status_t status; + + font_private = malloc (sizeof (cairo_script_font_t)); + if (unlikely (font_private == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_scaled_font_attach_private (scaled_font, &font_private->base, ctx, + _cairo_script_scaled_font_fini); + + font_private->parent = scaled_font; + font_private->subset_glyph_index = 0; + font_private->has_sfnt = TRUE; + + cairo_list_add (&font_private->link, &ctx->fonts); + + status = _bitmap_next_id (&ctx->font_id, + &font_private->id); + if (unlikely (status)) { + free (font_private); + return status; + } + + status = _emit_context (surface); + if (unlikely (status)) { + free (font_private); + return status; + } + + status = _emit_type42_font (surface, scaled_font); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) { + *font_out = font_private; + return status; + } + + font_private->has_sfnt = FALSE; + _cairo_output_stream_printf (ctx->stream, + "dict\n" + " /type 3 set\n" + " /metrics [%f %f %f %f %f] set\n" + " /glyphs array set\n" + " font dup /f%lu exch def set-font-face", + scaled_font->fs_extents.ascent, + scaled_font->fs_extents.descent, + scaled_font->fs_extents.height, + scaled_font->fs_extents.max_x_advance, + scaled_font->fs_extents.max_y_advance, + font_private->id); + + *font_out = font_private; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_scaled_font (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_matrix_t matrix; + cairo_font_options_t options; + cairo_bool_t matrix_updated = FALSE; + cairo_status_t status; + cairo_script_font_t *font_private; + + cairo_scaled_font_get_ctm (scaled_font, &matrix); + status = _emit_scaling_matrix (surface, &matrix, &matrix_updated); + if (unlikely (status)) + return status; + + if (! matrix_updated && surface->cr.current_scaled_font == scaled_font) + return CAIRO_STATUS_SUCCESS; + + surface->cr.current_scaled_font = scaled_font; + + font_private = _cairo_script_font_get (ctx, scaled_font); + if (font_private == NULL) { + cairo_scaled_font_get_font_matrix (scaled_font, &matrix); + status = _emit_font_matrix (surface, &matrix); + if (unlikely (status)) + return status; + + cairo_scaled_font_get_font_options (scaled_font, &options); + status = _emit_font_options (surface, &options); + if (unlikely (status)) + return status; + + status = _emit_scaled_font_init (surface, scaled_font, &font_private); + if (unlikely (status)) + return status; + + assert (target_is_active (surface)); + _cairo_output_stream_printf (ctx->stream, + " /scaled-font get /sf%lu exch def\n", + font_private->id); + } else { + _cairo_output_stream_printf (ctx->stream, + "sf%lu set-scaled-font\n", + font_private->id); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_scaled_glyph_vector (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font, + cairo_script_font_t *font_private, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_script_implicit_context_t old_cr; + cairo_status_t status; + unsigned long index; + + index = ++font_private->subset_glyph_index; + scaled_glyph->dev_private_key = ctx; + scaled_glyph->dev_private = (void *) index; + + _cairo_output_stream_printf (ctx->stream, + "%lu <<\n" + " /metrics [%f %f %f %f %f %f]\n" + " /render {\n", + index, + scaled_glyph->fs_metrics.x_bearing, + scaled_glyph->fs_metrics.y_bearing, + scaled_glyph->fs_metrics.width, + scaled_glyph->fs_metrics.height, + scaled_glyph->fs_metrics.x_advance, + scaled_glyph->fs_metrics.y_advance); + + if (! _cairo_matrix_is_identity (&scaled_font->scale_inverse)) { + _cairo_output_stream_printf (ctx->stream, + "[%f %f %f %f %f %f] transform\n", + scaled_font->scale_inverse.xx, + scaled_font->scale_inverse.yx, + scaled_font->scale_inverse.xy, + scaled_font->scale_inverse.yy, + scaled_font->scale_inverse.x0, + scaled_font->scale_inverse.y0); + } + + old_cr = surface->cr; + _cairo_script_implicit_context_init (&surface->cr); + status = _cairo_recording_surface_replay (scaled_glyph->recording_surface, + &surface->base); + surface->cr = old_cr; + + _cairo_output_stream_puts (ctx->stream, "} >> set\n"); + + return status; +} + +static cairo_status_t +_emit_scaled_glyph_bitmap (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font, + cairo_script_font_t *font_private, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_status_t status; + unsigned long index; + + index = ++font_private->subset_glyph_index; + scaled_glyph->dev_private_key = ctx; + scaled_glyph->dev_private = (void *) index; + + _cairo_output_stream_printf (ctx->stream, + "%lu <<\n" + " /metrics [%f %f %f %f %f %f]\n" + " /render {\n" + "%f %f translate\n", + index, + scaled_glyph->fs_metrics.x_bearing, + scaled_glyph->fs_metrics.y_bearing, + scaled_glyph->fs_metrics.width, + scaled_glyph->fs_metrics.height, + scaled_glyph->fs_metrics.x_advance, + scaled_glyph->fs_metrics.y_advance, + scaled_glyph->fs_metrics.x_bearing, + scaled_glyph->fs_metrics.y_bearing); + + status = _emit_image_surface (surface, scaled_glyph->surface); + if (unlikely (status)) + return status; + + _cairo_output_stream_puts (ctx->stream, "pattern "); + + if (! _cairo_matrix_is_identity (&scaled_font->font_matrix)) { + _cairo_output_stream_printf (ctx->stream, + "\n [%f %f %f %f %f %f] set-matrix\n", + scaled_font->font_matrix.xx, + scaled_font->font_matrix.yx, + scaled_font->font_matrix.xy, + scaled_font->font_matrix.yy, + scaled_font->font_matrix.x0, + scaled_font->font_matrix.y0); + } + _cairo_output_stream_puts (ctx->stream, + "mask\n} >> set\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_scaled_glyph_prologue (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font) +{ + cairo_script_context_t *ctx = to_context (surface); + + _cairo_output_stream_printf (ctx->stream, "f%lu /glyphs get\n", + _cairo_script_font_id (ctx, scaled_font)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_emit_scaled_glyphs (cairo_script_surface_t *surface, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + unsigned int num_glyphs) +{ + cairo_script_context_t *ctx = to_context (surface); + cairo_script_font_t *font_private; + cairo_status_t status; + unsigned int n; + cairo_bool_t have_glyph_prologue = FALSE; + + if (num_glyphs == 0) + return CAIRO_STATUS_SUCCESS; + + font_private = _cairo_script_font_get (ctx, scaled_font); + if (font_private->has_sfnt) + return CAIRO_STATUS_SUCCESS; + + _cairo_scaled_font_freeze_cache (scaled_font); + for (n = 0; n < num_glyphs; n++) { + cairo_scaled_glyph_t *scaled_glyph; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[n].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) + break; + + if (scaled_glyph->dev_private_key == ctx) + continue; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[n].index, + CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE, + &scaled_glyph); + if (_cairo_status_is_error (status)) + break; + + if (status == CAIRO_STATUS_SUCCESS) { + if (! have_glyph_prologue) { + status = _emit_scaled_glyph_prologue (surface, scaled_font); + if (unlikely (status)) + break; + + have_glyph_prologue = TRUE; + } + + status = _emit_scaled_glyph_vector (surface, + scaled_font, font_private, + scaled_glyph); + if (unlikely (status)) + break; + + continue; + } + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[n].index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + if (_cairo_status_is_error (status)) + break; + + if (status == CAIRO_STATUS_SUCCESS) { + if (! have_glyph_prologue) { + status = _emit_scaled_glyph_prologue (surface, scaled_font); + if (unlikely (status)) + break; + + have_glyph_prologue = TRUE; + } + + status = _emit_scaled_glyph_bitmap (surface, + scaled_font, + font_private, + scaled_glyph); + if (unlikely (status)) + break; + + continue; + } + } + _cairo_scaled_font_thaw_cache (scaled_font); + + if (have_glyph_prologue) { + _cairo_output_stream_puts (to_context (surface)->stream, "pop pop\n"); + } + + return status; +} + +static void +to_octal (int value, char *buf, size_t size) +{ + do { + buf[--size] = '0' + (value & 7); + value >>= 3; + } while (size); +} + +static void +_emit_string_literal (cairo_script_surface_t *surface, + const char *utf8, int len) +{ + cairo_script_context_t *ctx = to_context (surface); + char c; + const char *end; + + _cairo_output_stream_puts (ctx->stream, "("); + + if (utf8 == NULL) { + end = utf8; + } else { + if (len < 0) + len = strlen (utf8); + end = utf8 + len; + } + + while (utf8 < end) { + switch ((c = *utf8++)) { + case '\n': + c = 'n'; + goto ESCAPED_CHAR; + case '\r': + c = 'r'; + goto ESCAPED_CHAR; + case '\t': + c = 't'; + goto ESCAPED_CHAR; + case '\b': + c = 'b'; + goto ESCAPED_CHAR; + case '\f': + c = 'f'; + goto ESCAPED_CHAR; + case '\\': + case '(': + case ')': +ESCAPED_CHAR: + _cairo_output_stream_printf (ctx->stream, "\\%c", c); + break; + default: + if (isprint (c) || isspace (c)) { + _cairo_output_stream_printf (ctx->stream, "%c", c); + } else { + char buf[4] = { '\\' }; + + to_octal (c, buf+1, 3); + _cairo_output_stream_write (ctx->stream, buf, 4); + } + break; + } + } + _cairo_output_stream_puts (ctx->stream, ")"); +} + +static cairo_int_status_t +_cairo_script_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t backward, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_script_surface_t *surface = abstract_surface; + cairo_script_context_t *ctx = to_context (surface); + cairo_script_font_t *font_private; + cairo_scaled_glyph_t *scaled_glyph; + cairo_matrix_t matrix; + cairo_status_t status; + double x, y, ix, iy; + int n; + cairo_output_stream_t *base85_stream = NULL; + + status = active (surface); + if (unlikely (status)) + return status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + goto BAIL; + + status = _emit_context (surface); + if (unlikely (status)) + goto BAIL; + + status = _emit_source (surface, op, source); + if (unlikely (status)) + goto BAIL; + + status = _emit_scaled_font (surface, scaled_font); + if (unlikely (status)) + goto BAIL; + + status = _emit_operator (surface, op); + if (unlikely (status)) + goto BAIL; + + status = _emit_scaled_glyphs (surface, scaled_font, glyphs, num_glyphs); + if (unlikely (status)) + goto BAIL; + + /* (utf8) [cx cy [glyphs]] [clusters] backward show_text_glyphs */ + /* [cx cy [glyphs]] show_glyphs */ + + if (utf8 != NULL && clusters != NULL) { + _emit_string_literal (surface, utf8, utf8_len); + _cairo_output_stream_puts (ctx->stream, " "); + } + + matrix = surface->cr.current_ctm; + status = cairo_matrix_invert (&matrix); + assert (status == CAIRO_STATUS_SUCCESS); + + ix = x = glyphs[0].x; + iy = y = glyphs[0].y; + cairo_matrix_transform_point (&matrix, &ix, &iy); + ix -= scaled_font->font_matrix.x0; + iy -= scaled_font->font_matrix.y0; + + _cairo_scaled_font_freeze_cache (scaled_font); + font_private = _cairo_script_font_get (ctx, scaled_font); + + _cairo_output_stream_printf (ctx->stream, + "[%f %f ", + ix, iy); + + for (n = 0; n < num_glyphs; n++) { + if (font_private->has_sfnt) { + if (glyphs[n].index > 256) + break; + } else { + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[n].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) { + _cairo_scaled_font_thaw_cache (scaled_font); + goto BAIL; + } + + if ((long unsigned) scaled_glyph->dev_private > 256) + break; + } + } + + if (n == num_glyphs) { + _cairo_output_stream_puts (ctx->stream, "<~"); + base85_stream = _cairo_base85_stream_create (ctx->stream); + } else + _cairo_output_stream_puts (ctx->stream, "["); + + for (n = 0; n < num_glyphs; n++) { + double dx, dy; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[n].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) { + _cairo_scaled_font_thaw_cache (scaled_font); + goto BAIL; + } + + if (fabs (glyphs[n].x - x) > 1e-5 || fabs (glyphs[n].y - y) > 1e-5) { + if (fabs (glyphs[n].y - y) < 1e-5) { + if (base85_stream != NULL) { + status = _cairo_output_stream_destroy (base85_stream); + if (unlikely (status)) { + base85_stream = NULL; + break; + } + + _cairo_output_stream_printf (ctx->stream, + "~> %f <~", glyphs[n].x - x); + base85_stream = _cairo_base85_stream_create (ctx->stream); + } else { + _cairo_output_stream_printf (ctx->stream, + " ] %f [ ", glyphs[n].x - x); + } + + x = glyphs[n].x; + } else { + ix = x = glyphs[n].x; + iy = y = glyphs[n].y; + cairo_matrix_transform_point (&matrix, &ix, &iy); + ix -= scaled_font->font_matrix.x0; + iy -= scaled_font->font_matrix.y0; + if (base85_stream != NULL) { + status = _cairo_output_stream_destroy (base85_stream); + if (unlikely (status)) { + base85_stream = NULL; + break; + } + + _cairo_output_stream_printf (ctx->stream, + "~> %f %f <~", + ix, iy); + base85_stream = _cairo_base85_stream_create (ctx->stream); + } else { + _cairo_output_stream_printf (ctx->stream, + " ] %f %f [ ", + ix, iy); + } + } + } + if (base85_stream != NULL) { + uint8_t c; + + if (font_private->has_sfnt) + c = glyphs[n].index; + else + c = (uint8_t) (long unsigned) scaled_glyph->dev_private; + + _cairo_output_stream_write (base85_stream, &c, 1); + } else { + if (font_private->has_sfnt) + _cairo_output_stream_printf (ctx->stream, " %lu", + glyphs[n].index); + else + _cairo_output_stream_printf (ctx->stream, " %lu", + (long unsigned) scaled_glyph->dev_private); + } + + dx = scaled_glyph->metrics.x_advance; + dy = scaled_glyph->metrics.y_advance; + cairo_matrix_transform_distance (&scaled_font->ctm, &dx, &dy); + x += dx; + y += dy; + } + _cairo_scaled_font_thaw_cache (scaled_font); + + if (base85_stream != NULL) { + cairo_status_t status2; + + status2 = _cairo_output_stream_destroy (base85_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + _cairo_output_stream_printf (ctx->stream, "~>"); + } else { + _cairo_output_stream_puts (ctx->stream, " ]"); + } + if (unlikely (status)) + return status; + + if (utf8 != NULL && clusters != NULL) { + for (n = 0; n < num_clusters; n++) { + if (clusters[n].num_bytes > UCHAR_MAX || + clusters[n].num_glyphs > UCHAR_MAX) + { + break; + } + } + + if (n < num_clusters) { + _cairo_output_stream_puts (ctx->stream, "] [ "); + for (n = 0; n < num_clusters; n++) { + _cairo_output_stream_printf (ctx->stream, + "%d %d ", + clusters[n].num_bytes, + clusters[n].num_glyphs); + } + _cairo_output_stream_puts (ctx->stream, "]"); + } + else + { + _cairo_output_stream_puts (ctx->stream, "] <~"); + base85_stream = _cairo_base85_stream_create (ctx->stream); + for (n = 0; n < num_clusters; n++) { + uint8_t c[2]; + c[0] = clusters[n].num_bytes; + c[1] = clusters[n].num_glyphs; + _cairo_output_stream_write (base85_stream, c, 2); + } + status = _cairo_output_stream_destroy (base85_stream); + if (unlikely (status)) + goto BAIL; + + _cairo_output_stream_puts (ctx->stream, "~>"); + } + + _cairo_output_stream_printf (ctx->stream, + " //%s show-text-glyphs\n", + _direction_to_string (backward)); + } else { + _cairo_output_stream_puts (ctx->stream, + "] show-glyphs\n"); + } + + inactive (surface); + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)){ + return _cairo_surface_wrapper_show_text_glyphs (&surface->wrapper, + op, source, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + backward, + scaled_font, + clip); + } + + return CAIRO_STATUS_SUCCESS; + +BAIL: + inactive (surface); + return status; +} + +static cairo_bool_t +_cairo_script_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_script_surface_t *surface = abstract_surface; + + if (_cairo_surface_wrapper_is_active (&surface->wrapper)) { + return _cairo_surface_wrapper_get_extents (&surface->wrapper, + rectangle); + } + + if (surface->width < 0 || surface->height < 0) + return FALSE; + + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = surface->width; + rectangle->height = surface->height; + + return TRUE; +} + +static const cairo_surface_backend_t +_cairo_script_surface_backend = { + CAIRO_SURFACE_TYPE_SCRIPT, + _cairo_script_surface_finish, + + _cairo_default_context_create, + + _cairo_script_surface_create_similar, + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_script_surface_source, + _cairo_script_surface_acquire_source_image, + _cairo_script_surface_release_source_image, + _cairo_script_surface_snapshot, + + _cairo_script_surface_copy_page, + _cairo_script_surface_show_page, + + _cairo_script_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_script_surface_paint, + _cairo_script_surface_mask, + _cairo_script_surface_stroke, + _cairo_script_surface_fill, + NULL, /* fill/stroke */ + NULL, /* glyphs */ + _cairo_script_surface_has_show_text_glyphs, + _cairo_script_surface_show_text_glyphs +}; + +static void +_cairo_script_implicit_context_init (cairo_script_implicit_context_t *cr) +{ + cr->current_operator = CAIRO_GSTATE_OPERATOR_DEFAULT; + cr->current_fill_rule = CAIRO_GSTATE_FILL_RULE_DEFAULT; + cr->current_tolerance = CAIRO_GSTATE_TOLERANCE_DEFAULT; + cr->current_antialias = CAIRO_ANTIALIAS_DEFAULT; + _cairo_stroke_style_init (&cr->current_style); + _cairo_pattern_init_solid (&cr->current_source.solid, + CAIRO_COLOR_BLACK); + _cairo_path_fixed_init (&cr->current_path); + cairo_matrix_init_identity (&cr->current_ctm); + cairo_matrix_init_identity (&cr->current_stroke_matrix); + cairo_matrix_init_identity (&cr->current_font_matrix); + _cairo_font_options_init_default (&cr->current_font_options); + cr->current_scaled_font = NULL; + cr->has_clip = FALSE; +} + +static void +_cairo_script_implicit_context_reset (cairo_script_implicit_context_t *cr) +{ + free (cr->current_style.dash); + cr->current_style.dash = NULL; + + _cairo_pattern_fini (&cr->current_source.base); + _cairo_path_fixed_fini (&cr->current_path); + + _cairo_script_implicit_context_init (cr); +} + +static cairo_script_surface_t * +_cairo_script_surface_create_internal (cairo_script_context_t *ctx, + cairo_content_t content, + cairo_rectangle_t *extents, + cairo_surface_t *passthrough) +{ + cairo_script_surface_t *surface; + + if (unlikely (ctx == NULL)) + return (cairo_script_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NULL_POINTER)); + + surface = malloc (sizeof (cairo_script_surface_t)); + if (unlikely (surface == NULL)) + return (cairo_script_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_script_surface_backend, + &ctx->base, + content); + + _cairo_surface_wrapper_init (&surface->wrapper, passthrough); + + _cairo_surface_clipper_init (&surface->clipper, + _cairo_script_surface_clipper_intersect_clip_path); + + surface->width = surface->height = -1; + if (extents) { + surface->width = extents->width; + surface->height = extents->height; + cairo_surface_set_device_offset (&surface->base, + -extents->x, -extents->y); + } + + surface->emitted = FALSE; + surface->defined = FALSE; + surface->active = FALSE; + surface->operand.type = SURFACE; + cairo_list_init (&surface->operand.link); + + _cairo_script_implicit_context_init (&surface->cr); + + return surface; +} + +static const cairo_device_backend_t _cairo_script_device_backend = { + CAIRO_DEVICE_TYPE_SCRIPT, + + NULL, NULL, /* lock, unlock */ + + _device_flush, /* flush */ + NULL, /* finish */ + _device_destroy +}; + +cairo_device_t * +_cairo_script_context_create_internal (cairo_output_stream_t *stream) +{ + cairo_script_context_t *ctx; + + ctx = malloc (sizeof (cairo_script_context_t)); + if (unlikely (ctx == NULL)) + return _cairo_device_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + memset (ctx, 0, sizeof (cairo_script_context_t)); + + _cairo_device_init (&ctx->base, &_cairo_script_device_backend); + + cairo_list_init (&ctx->operands); + cairo_list_init (&ctx->deferred); + ctx->stream = stream; + ctx->mode = CAIRO_SCRIPT_MODE_ASCII; + + cairo_list_init (&ctx->fonts); + cairo_list_init (&ctx->defines); + + ctx->attach_snapshots = TRUE; + + return &ctx->base; +} + +void +_cairo_script_context_attach_snapshots (cairo_device_t *device, + cairo_bool_t enable) +{ + cairo_script_context_t *ctx; + + ctx = (cairo_script_context_t *) device; + ctx->attach_snapshots = enable; +} + +static cairo_device_t * +_cairo_script_context_create (cairo_output_stream_t *stream) +{ + cairo_script_context_t *ctx; + + ctx = (cairo_script_context_t *) + _cairo_script_context_create_internal (stream); + if (unlikely (ctx->base.status)) + return &ctx->base; + + ctx->owns_stream = TRUE; + _cairo_output_stream_puts (ctx->stream, "%!CairoScript\n"); + return &ctx->base; +} + +/** + * cairo_script_create: + * @filename: the name (path) of the file to write the script to + * + * Creates a output device for emitting the script, used when + * creating the individual surfaces. + * + * Return value: a pointer to the newly created device. The caller + * owns the surface and should call cairo_device_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" device if an error such as out of memory + * occurs. You can use cairo_device_status() to check for this. + * + * Since: 1.12 + **/ +cairo_device_t * +cairo_script_create (const char *filename) +{ + cairo_output_stream_t *stream; + cairo_status_t status; + + stream = _cairo_output_stream_create_for_filename (filename); + if ((status = _cairo_output_stream_get_status (stream))) + return _cairo_device_create_in_error (status); + + return _cairo_script_context_create (stream); +} + +/** + * cairo_script_create_for_stream: + * @write_func: callback function passed the bytes written to the script + * @closure: user data to be passed to the callback + * + * Creates a output device for emitting the script, used when + * creating the individual surfaces. + * + * Return value: a pointer to the newly created device. The caller + * owns the surface and should call cairo_device_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" device if an error such as out of memory + * occurs. You can use cairo_device_status() to check for this. + * + * Since: 1.12 + **/ +cairo_device_t * +cairo_script_create_for_stream (cairo_write_func_t write_func, + void *closure) +{ + cairo_output_stream_t *stream; + cairo_status_t status; + + stream = _cairo_output_stream_create (write_func, NULL, closure); + if ((status = _cairo_output_stream_get_status (stream))) + return _cairo_device_create_in_error (status); + + return _cairo_script_context_create (stream); +} + +/** + * cairo_script_write_comment: + * @script: the script (output device) + * @comment: the string to emit + * @len:the length of the sting to write, or -1 to use strlen() + * + * Emit a string verbatim into the script. + * + * Since: 1.12 + **/ +void +cairo_script_write_comment (cairo_device_t *script, + const char *comment, + int len) +{ + cairo_script_context_t *context = (cairo_script_context_t *) script; + + if (len < 0) + len = strlen (comment); + + _cairo_output_stream_puts (context->stream, "% "); + _cairo_output_stream_write (context->stream, comment, len); + _cairo_output_stream_puts (context->stream, "\n"); +} + +/** + * cairo_script_set_mode: + * @script: The script (output device) + * @mode: the new mode + * + * Change the output mode of the script + * + * Since: 1.12 + **/ +void +cairo_script_set_mode (cairo_device_t *script, + cairo_script_mode_t mode) +{ + cairo_script_context_t *context = (cairo_script_context_t *) script; + + context->mode = mode; +} + +/** + * cairo_script_get_mode: + * @script: The script (output device) to query + * + * Queries the script for its current output mode. + * + * Return value: the current output mode of the script + * + * Since: 1.12 + **/ +cairo_script_mode_t +cairo_script_get_mode (cairo_device_t *script) +{ + cairo_script_context_t *context = (cairo_script_context_t *) script; + + return context->mode; +} + +/** + * cairo_script_surface_create: + * @script: the script (output device) + * @content: the content of the surface + * @width: width in pixels + * @height: height in pixels + * + * Create a new surface that will emit its rendering through @script + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_script_surface_create (cairo_device_t *script, + cairo_content_t content, + double width, + double height) +{ + cairo_rectangle_t *extents, r; + + if (unlikely (script->backend->type != CAIRO_DEVICE_TYPE_SCRIPT)) + return _cairo_surface_create_in_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + + if (unlikely (script->status)) + return _cairo_surface_create_in_error (script->status); + + extents = NULL; + if (width > 0 && height > 0) { + r.x = r.y = 0; + r.width = width; + r.height = height; + extents = &r; + } + return &_cairo_script_surface_create_internal ((cairo_script_context_t *) script, + content, extents, + NULL)->base; +} +slim_hidden_def (cairo_script_surface_create); + +/** + * cairo_script_surface_create_for_target: + * @script: the script (output device) + * @target: a target surface to wrap + * + * Create a pxoy surface that will render to @target and record + * the operations to @device. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_script_surface_create_for_target (cairo_device_t *script, + cairo_surface_t *target) +{ + cairo_rectangle_int_t extents; + cairo_rectangle_t rect, *r; + + if (unlikely (script->backend->type != CAIRO_DEVICE_TYPE_SCRIPT)) + return _cairo_surface_create_in_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + + if (unlikely (script->status)) + return _cairo_surface_create_in_error (script->status); + + if (unlikely (target->status)) + return _cairo_surface_create_in_error (target->status); + + r = NULL; + if (_cairo_surface_get_extents (target, &extents)) { + rect.x = rect.y = 0; + rect.width = extents.width; + rect.height = extents.height; + r= ▭ + } + return &_cairo_script_surface_create_internal ((cairo_script_context_t *) script, + target->content, r, + target)->base; +} + +/** + * cairo_script_from_recording_surface: + * @script: the script (output device) + * @recording_surface: the recording surface to replay + * + * Converts the record operations in @recording_surface into a script. + * + * Return value: #CAIRO_STATUS_SUCCESS on successful completion or an error code. + * + * Since: 1.12 + **/ +cairo_status_t +cairo_script_from_recording_surface (cairo_device_t *script, + cairo_surface_t *recording_surface) +{ + cairo_rectangle_t r, *extents; + cairo_surface_t *surface; + cairo_status_t status; + + if (unlikely (script->backend->type != CAIRO_DEVICE_TYPE_SCRIPT)) + return _cairo_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + + if (unlikely (script->status)) + return _cairo_error (script->status); + + if (unlikely (recording_surface->status)) + return recording_surface->status; + + if (unlikely (! _cairo_surface_is_recording (recording_surface))) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + extents = NULL; + if (_cairo_recording_surface_get_bounds (recording_surface, &r)) + extents = &r; + + surface = &_cairo_script_surface_create_internal ((cairo_script_context_t *) script, + recording_surface->content, + extents, + NULL)->base; + if (unlikely (surface->status)) + return surface->status; + + status = _cairo_recording_surface_replay (recording_surface, surface); + cairo_surface_destroy (surface); + + return status; +} diff --git a/src/cairo-script.h b/src/cairo-script.h new file mode 100644 index 000000000..b5a8cf32d --- /dev/null +++ b/src/cairo-script.h @@ -0,0 +1,98 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SCRIPT_H +#define CAIRO_SCRIPT_H + +#include "cairo.h" + +#if CAIRO_HAS_SCRIPT_SURFACE + +CAIRO_BEGIN_DECLS + +/** + * cairo_script_mode_t: + * @CAIRO_SCRIPT_MODE_ASCII: the output will be in readable text (default). (Since 1.12) + * @CAIRO_SCRIPT_MODE_BINARY: the output will use byte codes. (Since 1.12) + * + * A set of script output variants. + * + * Since: 1.12 + **/ +typedef enum { + CAIRO_SCRIPT_MODE_ASCII, + CAIRO_SCRIPT_MODE_BINARY +} cairo_script_mode_t; + +cairo_public cairo_device_t * +cairo_script_create (const char *filename); + +cairo_public cairo_device_t * +cairo_script_create_for_stream (cairo_write_func_t write_func, + void *closure); + +cairo_public void +cairo_script_write_comment (cairo_device_t *script, + const char *comment, + int len); + +cairo_public void +cairo_script_set_mode (cairo_device_t *script, + cairo_script_mode_t mode); + +cairo_public cairo_script_mode_t +cairo_script_get_mode (cairo_device_t *script); + +cairo_public cairo_surface_t * +cairo_script_surface_create (cairo_device_t *script, + cairo_content_t content, + double width, + double height); + +cairo_public cairo_surface_t * +cairo_script_surface_create_for_target (cairo_device_t *script, + cairo_surface_t *target); + +cairo_public cairo_status_t +cairo_script_from_recording_surface (cairo_device_t *script, + cairo_surface_t *recording_surface); + +CAIRO_END_DECLS + +#else /*CAIRO_HAS_SCRIPT_SURFACE*/ +# error Cairo was not compiled with support for the CairoScript backend +#endif /*CAIRO_HAS_SCRIPT_SURFACE*/ + +#endif /*CAIRO_SCRIPT_H*/ diff --git a/src/cairo-shape-mask-compositor.c b/src/cairo-shape-mask-compositor.c new file mode 100644 index 000000000..3117267cc --- /dev/null +++ b/src/cairo-shape-mask-compositor.c @@ -0,0 +1,340 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-compositor-private.h" +#include "cairo-clip-private.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-private.h" +#include "cairo-surface-offset-private.h" + +static cairo_int_status_t +_cairo_shape_mask_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_surface_t *mask; + cairo_surface_pattern_t pattern; + cairo_int_status_t status; + cairo_clip_t *clip; + + if (! extents->is_bounded) + return CAIRO_INT_STATUS_UNSUPPORTED; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + mask = _cairo_surface_create_scratch (extents->surface, + CAIRO_CONTENT_ALPHA, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (mask->status)) + return mask->status; + + clip = extents->clip; + if (! _cairo_clip_is_region (clip)) + clip = _cairo_clip_copy_region (clip); + + if (! mask->is_clear) { + status = _cairo_surface_offset_paint (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + clip); + if (unlikely (status)) + goto error; + } + + status = _cairo_surface_offset_stroke (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + path, style, ctm, ctm_inverse, + tolerance, antialias, + clip); + if (unlikely (status)) + goto error; + + if (clip != extents->clip) { + status = _cairo_clip_combine_with_surface (extents->clip, mask, + extents->bounded.x, + extents->bounded.y); + if (unlikely (status)) + goto error; + } + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + if (extents->op == CAIRO_OPERATOR_SOURCE) { + status = _cairo_surface_mask (extents->surface, + CAIRO_OPERATOR_DEST_OUT, + &_cairo_pattern_white.base, + &pattern.base, + clip); + if ((status == CAIRO_INT_STATUS_SUCCESS)) { + status = _cairo_surface_mask (extents->surface, + CAIRO_OPERATOR_ADD, + &extents->source_pattern.base, + &pattern.base, + clip); + } + } else { + status = _cairo_surface_mask (extents->surface, + extents->op, + &extents->source_pattern.base, + &pattern.base, + clip); + } + _cairo_pattern_fini (&pattern.base); + +error: + cairo_surface_destroy (mask); + if (clip != extents->clip) + _cairo_clip_destroy (clip); + return status; +} + +static cairo_int_status_t +_cairo_shape_mask_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_surface_t *mask; + cairo_surface_pattern_t pattern; + cairo_int_status_t status; + cairo_clip_t *clip; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (! extents->is_bounded) + return CAIRO_INT_STATUS_UNSUPPORTED; + + mask = _cairo_surface_create_scratch (extents->surface, + CAIRO_CONTENT_ALPHA, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (mask->status)) + return mask->status; + + clip = extents->clip; + if (! _cairo_clip_is_region (clip)) + clip = _cairo_clip_copy_region (clip); + + if (! mask->is_clear) { + status = _cairo_surface_offset_paint (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + clip); + if (unlikely (status)) + goto error; + } + + status = _cairo_surface_offset_fill (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + path, fill_rule, tolerance, antialias, + clip); + if (unlikely (status)) + goto error; + + if (clip != extents->clip) { + status = _cairo_clip_combine_with_surface (extents->clip, mask, + extents->bounded.x, + extents->bounded.y); + if (unlikely (status)) + goto error; + } + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + if (extents->op == CAIRO_OPERATOR_SOURCE) { + status = _cairo_surface_mask (extents->surface, + CAIRO_OPERATOR_DEST_OUT, + &_cairo_pattern_white.base, + &pattern.base, + clip); + if ((status == CAIRO_INT_STATUS_SUCCESS)) { + status = _cairo_surface_mask (extents->surface, + CAIRO_OPERATOR_ADD, + &extents->source_pattern.base, + &pattern.base, + clip); + } + } else { + status = _cairo_surface_mask (extents->surface, + extents->op, + &extents->source_pattern.base, + &pattern.base, + clip); + } + _cairo_pattern_fini (&pattern.base); + +error: + if (clip != extents->clip) + _cairo_clip_destroy (clip); + cairo_surface_destroy (mask); + return status; +} + +static cairo_int_status_t +_cairo_shape_mask_compositor_glyphs (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_surface_t *mask; + cairo_surface_pattern_t pattern; + cairo_int_status_t status; + cairo_clip_t *clip; + + if (! extents->is_bounded) + return CAIRO_INT_STATUS_UNSUPPORTED; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + mask = _cairo_surface_create_scratch (extents->surface, + CAIRO_CONTENT_ALPHA, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (mask->status)) + return mask->status; + + clip = extents->clip; + if (! _cairo_clip_is_region (clip)) + clip = _cairo_clip_copy_region (clip); + + if (! mask->is_clear) { + status = _cairo_surface_offset_paint (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + clip); + if (unlikely (status)) + goto error; + } + + status = _cairo_surface_offset_glyphs (mask, + extents->bounded.x, + extents->bounded.y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + scaled_font, glyphs, num_glyphs, + clip); + if (unlikely (status)) + goto error; + + if (clip != extents->clip) { + status = _cairo_clip_combine_with_surface (extents->clip, mask, + extents->bounded.x, + extents->bounded.y); + if (unlikely (status)) + goto error; + } + + _cairo_pattern_init_for_surface (&pattern, mask); + cairo_matrix_init_translate (&pattern.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + pattern.base.extend = CAIRO_EXTEND_NONE; + if (extents->op == CAIRO_OPERATOR_SOURCE) { + status = _cairo_surface_mask (extents->surface, + CAIRO_OPERATOR_DEST_OUT, + &_cairo_pattern_white.base, + &pattern.base, + clip); + if ((status == CAIRO_INT_STATUS_SUCCESS)) { + status = _cairo_surface_mask (extents->surface, + CAIRO_OPERATOR_ADD, + &extents->source_pattern.base, + &pattern.base, + clip); + } + } else { + status = _cairo_surface_mask (extents->surface, + extents->op, + &extents->source_pattern.base, + &pattern.base, + clip); + } + _cairo_pattern_fini (&pattern.base); + +error: + if (clip != extents->clip) + _cairo_clip_destroy (clip); + cairo_surface_destroy (mask); + return status; +} + +void +_cairo_shape_mask_compositor_init (cairo_compositor_t *compositor, + const cairo_compositor_t *delegate) +{ + compositor->delegate = delegate; + + compositor->paint = NULL; + compositor->mask = NULL; + compositor->fill = _cairo_shape_mask_compositor_fill; + compositor->stroke = _cairo_shape_mask_compositor_stroke; + compositor->glyphs = _cairo_shape_mask_compositor_glyphs; +} diff --git a/src/cairo-skia.h b/src/cairo-skia.h new file mode 100644 index 000000000..99b928656 --- /dev/null +++ b/src/cairo-skia.h @@ -0,0 +1,66 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SKIA_H +#define CAIRO_SKIA_H + +#include "cairo.h" + +#if CAIRO_HAS_SKIA_SURFACE + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_skia_surface_create (cairo_format_t format, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_skia_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride); + +CAIRO_END_DECLS + +#else + +# error Cairo was not compiled with support for the Skia backend + +#endif + +#endif diff --git a/src/cairo-slope-private.h b/src/cairo-slope-private.h new file mode 100644 index 000000000..6a58c9f45 --- /dev/null +++ b/src/cairo-slope-private.h @@ -0,0 +1,72 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef _CAIRO_SLOPE_PRIVATE_H +#define _CAIRO_SLOPE_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-fixed-private.h" + +static inline void +_cairo_slope_init (cairo_slope_t *slope, + const cairo_point_t *a, + const cairo_point_t *b) +{ + slope->dx = b->x - a->x; + slope->dy = b->y - a->y; +} + +static inline cairo_bool_t +_cairo_slope_equal (const cairo_slope_t *a, const cairo_slope_t *b) +{ + return _cairo_int64_eq (_cairo_int32x32_64_mul (a->dy, b->dx), + _cairo_int32x32_64_mul (b->dy, a->dx)); +} + +static inline cairo_bool_t +_cairo_slope_backwards (const cairo_slope_t *a, const cairo_slope_t *b) +{ + return _cairo_int64_negative (_cairo_int64_add (_cairo_int32x32_64_mul (a->dx, b->dx), + _cairo_int32x32_64_mul (a->dy, b->dy))); +} + +cairo_private int +_cairo_slope_compare (const cairo_slope_t *a, + const cairo_slope_t *b) cairo_pure; + + +#endif /* _CAIRO_SLOPE_PRIVATE_H */ diff --git a/src/cairo-slope.c b/src/cairo-slope.c new file mode 100644 index 000000000..cc5f30cb0 --- /dev/null +++ b/src/cairo-slope.c @@ -0,0 +1,99 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-slope-private.h" + +/* Compare two slopes. Slope angles begin at 0 in the direction of the + positive X axis and increase in the direction of the positive Y + axis. + + This function always compares the slope vectors based on the + smaller angular difference between them, (that is based on an + angular difference that is strictly less than pi). To break ties + when comparing slope vectors with an angular difference of exactly + pi, the vector with a positive dx (or positive dy if dx's are zero) + is considered to be more positive than the other. + + Also, all slope vectors with both dx==0 and dy==0 are considered + equal and more positive than any non-zero vector. + + < 0 => a less positive than b + == 0 => a equal to b + > 0 => a more positive than b +*/ +int +_cairo_slope_compare (const cairo_slope_t *a, const cairo_slope_t *b) +{ + cairo_int64_t ady_bdx = _cairo_int32x32_64_mul (a->dy, b->dx); + cairo_int64_t bdy_adx = _cairo_int32x32_64_mul (b->dy, a->dx); + int cmp; + + cmp = _cairo_int64_cmp (ady_bdx, bdy_adx); + if (cmp) + return cmp; + + /* special-case zero vectors. the intended logic here is: + * zero vectors all compare equal, and more positive than any + * non-zero vector. + */ + if (a->dx == 0 && a->dy == 0 && b->dx == 0 && b->dy ==0) + return 0; + if (a->dx == 0 && a->dy == 0) + return 1; + if (b->dx == 0 && b->dy ==0) + return -1; + + /* Finally, we're looking at two vectors that are either equal or + * that differ by exactly pi. We can identify the "differ by pi" + * case by looking for a change in sign in either dx or dy between + * a and b. + * + * And in these cases, we eliminate the ambiguity by reducing the angle + * of b by an infinitesimally small amount, (that is, 'a' will + * always be considered less than 'b'). + */ + if ((a->dx ^ b->dx) < 0 || (a->dy ^ b->dy) < 0) { + if (a->dx > 0 || (a->dx == 0 && a->dy > 0)) + return -1; + else + return +1; + } + + /* Finally, for identical slopes, we obviously return 0. */ + return 0; +} diff --git a/src/cairo-spans-compositor-private.h b/src/cairo-spans-compositor-private.h new file mode 100644 index 000000000..0babebd26 --- /dev/null +++ b/src/cairo-spans-compositor-private.h @@ -0,0 +1,111 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SPANS_COMPOSITOR_PRIVATE_H +#define CAIRO_SPANS_COMPOSITOR_PRIVATE_H + +#include "cairo-compositor-private.h" +#include "cairo-types-private.h" +#include "cairo-spans-private.h" + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_abstract_span_renderer { + cairo_span_renderer_t base; + char data[4096]; +} cairo_abstract_span_renderer_t; + +struct cairo_spans_compositor { + cairo_compositor_t base; + + unsigned int flags; +#define CAIRO_SPANS_COMPOSITOR_HAS_LERP 0x1 + + /* pixel-aligned fast paths */ + cairo_int_status_t (*fill_boxes) (void *surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes); + + cairo_int_status_t (*draw_image_boxes) (void *surface, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy); + + cairo_int_status_t (*copy_boxes) (void *surface, + cairo_surface_t *src, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents, + int dx, int dy); + + cairo_surface_t * (*pattern_to_surface) (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y); + + cairo_int_status_t (*composite_boxes) (void *surface, + cairo_operator_t op, + cairo_surface_t *source, + cairo_surface_t *mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents); + + /* general shape masks using a span renderer */ + cairo_int_status_t (*renderer_init) (cairo_abstract_span_renderer_t *renderer, + const cairo_composite_rectangles_t *extents, + cairo_antialias_t antialias, + cairo_bool_t needs_clip); + + void (*renderer_fini) (cairo_abstract_span_renderer_t *renderer, + cairo_int_status_t status); +}; + +cairo_private void +_cairo_spans_compositor_init (cairo_spans_compositor_t *compositor, + const cairo_compositor_t *delegate); + +CAIRO_END_DECLS + +#endif /* CAIRO_SPANS_COMPOSITOR_PRIVATE_H */ diff --git a/src/cairo-spans-compositor.c b/src/cairo-spans-compositor.c new file mode 100644 index 000000000..efbae254b --- /dev/null +++ b/src/cairo-spans-compositor.c @@ -0,0 +1,1201 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-compositor-private.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-paginated-private.h" +#include "cairo-pattern-inline.h" +#include "cairo-region-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-spans-compositor-private.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-surface-snapshot-private.h" +#include "cairo-surface-observer-private.h" + +typedef struct { + cairo_polygon_t *polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; +} composite_spans_info_t; + +static cairo_int_status_t +composite_polygon (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias); + +static cairo_int_status_t +composite_boxes (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes); + +static cairo_int_status_t +clip_and_composite_polygon (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias); +static cairo_surface_t * +get_clip_surface (const cairo_spans_compositor_t *compositor, + cairo_surface_t *dst, + const cairo_clip_t *clip, + const cairo_rectangle_int_t *extents) +{ + cairo_composite_rectangles_t composite; + cairo_surface_t *surface; + cairo_box_t box; + cairo_polygon_t polygon; + const cairo_clip_path_t *clip_path; + cairo_antialias_t antialias; + cairo_fill_rule_t fill_rule; + cairo_int_status_t status; + + assert (clip->path); + + surface = _cairo_surface_create_scratch (dst, + CAIRO_CONTENT_ALPHA, + extents->width, + extents->height, + CAIRO_COLOR_TRANSPARENT); + + _cairo_box_from_rectangle (&box, extents); + _cairo_polygon_init (&polygon, &box, 1); + + clip_path = clip->path; + status = _cairo_path_fixed_fill_to_polygon (&clip_path->path, + clip_path->tolerance, + &polygon); + if (unlikely (status)) + goto cleanup_polygon; + + polygon.num_limits = 0; + + antialias = clip_path->antialias; + fill_rule = clip_path->fill_rule; + + if (clip->boxes) { + cairo_polygon_t intersect; + cairo_boxes_t tmp; + + _cairo_boxes_init_for_array (&tmp, clip->boxes, clip->num_boxes); + status= _cairo_polygon_init_boxes (&intersect, &tmp); + if (unlikely (status)) + goto cleanup_polygon; + + status = _cairo_polygon_intersect (&polygon, fill_rule, + &intersect, CAIRO_FILL_RULE_WINDING); + _cairo_polygon_fini (&intersect); + + if (unlikely (status)) + goto cleanup_polygon; + + fill_rule = CAIRO_FILL_RULE_WINDING; + } + + polygon.limits = NULL; + polygon.num_limits = 0; + + clip_path = clip_path->prev; + while (clip_path) { + if (clip_path->antialias == antialias) { + cairo_polygon_t next; + + _cairo_polygon_init (&next, NULL, 0); + status = _cairo_path_fixed_fill_to_polygon (&clip_path->path, + clip_path->tolerance, + &next); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = _cairo_polygon_intersect (&polygon, fill_rule, + &next, clip_path->fill_rule); + _cairo_polygon_fini (&next); + if (unlikely (status)) + goto cleanup_polygon; + + fill_rule = CAIRO_FILL_RULE_WINDING; + } + + clip_path = clip_path->prev; + } + + _cairo_polygon_translate (&polygon, -extents->x, -extents->y); + status = _cairo_composite_rectangles_init_for_polygon (&composite, surface, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + &polygon, + NULL); + if (unlikely (status)) + goto cleanup_polygon; + + status = composite_polygon (compositor, &composite, + &polygon, fill_rule, antialias); + _cairo_composite_rectangles_fini (&composite); + _cairo_polygon_fini (&polygon); + if (unlikely (status)) + goto error; + + _cairo_polygon_init (&polygon, &box, 1); + + clip_path = clip->path; + antialias = clip_path->antialias == CAIRO_ANTIALIAS_DEFAULT ? CAIRO_ANTIALIAS_NONE : CAIRO_ANTIALIAS_DEFAULT; + clip_path = clip_path->prev; + while (clip_path) { + if (clip_path->antialias == antialias) { + if (polygon.num_edges == 0) { + status = _cairo_path_fixed_fill_to_polygon (&clip_path->path, + clip_path->tolerance, + &polygon); + + fill_rule = clip_path->fill_rule; + polygon.limits = NULL; + polygon.num_limits = 0; + } else { + cairo_polygon_t next; + + _cairo_polygon_init (&next, NULL, 0); + status = _cairo_path_fixed_fill_to_polygon (&clip_path->path, + clip_path->tolerance, + &next); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = _cairo_polygon_intersect (&polygon, fill_rule, + &next, clip_path->fill_rule); + _cairo_polygon_fini (&next); + fill_rule = CAIRO_FILL_RULE_WINDING; + } + if (unlikely (status)) + goto error; + } + + clip_path = clip_path->prev; + } + + if (polygon.num_edges) { + _cairo_polygon_translate (&polygon, -extents->x, -extents->y); + status = _cairo_composite_rectangles_init_for_polygon (&composite, surface, + CAIRO_OPERATOR_IN, + &_cairo_pattern_white.base, + &polygon, + NULL); + if (unlikely (status)) + goto cleanup_polygon; + + status = composite_polygon (compositor, &composite, + &polygon, fill_rule, antialias); + _cairo_composite_rectangles_fini (&composite); + _cairo_polygon_fini (&polygon); + if (unlikely (status)) + goto error; + } + + return surface; + +cleanup_polygon: + _cairo_polygon_fini (&polygon); +error: + cairo_surface_destroy (surface); + return _cairo_int_surface_create_in_error (status); +} + +static cairo_int_status_t +fixup_unbounded_mask (const cairo_spans_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_composite_rectangles_t composite; + cairo_surface_t *clip; + cairo_int_status_t status; + + TRACE((stderr, "%s\n", __FUNCTION__)); + + clip = get_clip_surface (compositor, extents->surface, extents->clip, + &extents->unbounded); + if (unlikely (clip->status)) { + if ((cairo_int_status_t)clip->status == CAIRO_INT_STATUS_NOTHING_TO_DO) + return CAIRO_STATUS_SUCCESS; + + return clip->status; + } + + status = _cairo_composite_rectangles_init_for_boxes (&composite, + extents->surface, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + boxes, + NULL); + if (unlikely (status)) + goto cleanup_clip; + + _cairo_pattern_init_for_surface (&composite.mask_pattern.surface, clip); + composite.mask_pattern.base.filter = CAIRO_FILTER_NEAREST; + composite.mask_pattern.base.extend = CAIRO_EXTEND_NONE; + + status = composite_boxes (compositor, &composite, boxes); + + _cairo_pattern_fini (&composite.mask_pattern.base); + _cairo_composite_rectangles_fini (&composite); + +cleanup_clip: + cairo_surface_destroy (clip); + return status; +} + +static cairo_int_status_t +fixup_unbounded_polygon (const cairo_spans_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_polygon_t polygon, intersect; + cairo_composite_rectangles_t composite; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + cairo_int_status_t status; + + TRACE((stderr, "%s\n", __FUNCTION__)); + + /* Can we treat the clip as a regular clear-polygon and use it to fill? */ + status = _cairo_clip_get_polygon (extents->clip, &polygon, + &fill_rule, &antialias); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status= _cairo_polygon_init_boxes (&intersect, boxes); + if (unlikely (status)) + goto cleanup_polygon; + + status = _cairo_polygon_intersect (&polygon, fill_rule, + &intersect, CAIRO_FILL_RULE_WINDING); + _cairo_polygon_fini (&intersect); + + if (unlikely (status)) + goto cleanup_polygon; + + status = _cairo_composite_rectangles_init_for_polygon (&composite, + extents->surface, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + &polygon, + NULL); + if (unlikely (status)) + goto cleanup_polygon; + + status = composite_polygon (compositor, &composite, + &polygon, fill_rule, antialias); + + _cairo_composite_rectangles_fini (&composite); +cleanup_polygon: + _cairo_polygon_fini (&polygon); + + return status; +} + +static cairo_int_status_t +fixup_unbounded_boxes (const cairo_spans_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_boxes_t tmp, clear; + cairo_box_t box; + cairo_int_status_t status; + + assert (boxes->is_pixel_aligned); + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (extents->bounded.width == extents->unbounded.width && + extents->bounded.height == extents->unbounded.height) + { + return CAIRO_STATUS_SUCCESS; + } + + /* subtract the drawn boxes from the unbounded area */ + _cairo_boxes_init (&clear); + + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); + + if (boxes->num_boxes) { + _cairo_boxes_init (&tmp); + + status = _cairo_boxes_add (&tmp, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + tmp.chunks.next = &boxes->chunks; + tmp.num_boxes += boxes->num_boxes; + + status = _cairo_bentley_ottmann_tessellate_boxes (&tmp, + CAIRO_FILL_RULE_WINDING, + &clear); + tmp.chunks.next = NULL; + if (unlikely (status)) + goto error; + } else { + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + + status = _cairo_boxes_add (&clear, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + /* If we have a clip polygon, we need to intersect with that as well */ + if (extents->clip->path) { + status = fixup_unbounded_polygon (compositor, extents, &clear); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + status = fixup_unbounded_mask (compositor, extents, &clear); + } else { + /* Otherwise just intersect with the clip boxes */ + if (extents->clip->num_boxes) { + _cairo_boxes_init_for_array (&tmp, + extents->clip->boxes, + extents->clip->num_boxes); + status = _cairo_boxes_intersect (&clear, &tmp, &clear); + if (unlikely (status)) + goto error; + } + + if (clear.is_pixel_aligned) { + status = compositor->fill_boxes (extents->surface, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + } else { + cairo_composite_rectangles_t composite; + + status = _cairo_composite_rectangles_init_for_boxes (&composite, + extents->surface, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + &clear, + NULL); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + status = composite_boxes (compositor, &composite, &clear); + _cairo_composite_rectangles_fini (&composite); + } + } + } + +error: + _cairo_boxes_fini (&clear); + return status; +} + +static cairo_surface_t * +unwrap_source (const cairo_pattern_t *pattern) +{ + cairo_rectangle_int_t limit; + + return _cairo_pattern_get_source ((cairo_surface_pattern_t *)pattern, + &limit); +} + +static cairo_bool_t +is_recording_pattern (const cairo_pattern_t *pattern) +{ + cairo_surface_t *surface; + + if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) + return FALSE; + + surface = ((const cairo_surface_pattern_t *) pattern)->surface; + return _cairo_surface_is_recording (surface); +} + +static cairo_bool_t +recording_pattern_contains_sample (const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *sample) +{ + cairo_recording_surface_t *surface; + + if (! is_recording_pattern (pattern)) + return FALSE; + + if (pattern->extend == CAIRO_EXTEND_NONE) + return TRUE; + + surface = (cairo_recording_surface_t *) unwrap_source (pattern); + if (surface->unbounded) + return TRUE; + + return _cairo_rectangle_contains_rectangle (&surface->extents, sample); +} + +static cairo_bool_t +op_reduces_to_source (const cairo_composite_rectangles_t *extents, + cairo_bool_t no_mask) +{ + if (extents->op == CAIRO_OPERATOR_SOURCE) + return TRUE; + + if (extents->surface->is_clear) + return extents->op == CAIRO_OPERATOR_OVER || extents->op == CAIRO_OPERATOR_ADD; + + if (no_mask && extents->op == CAIRO_OPERATOR_OVER) + return _cairo_pattern_is_opaque (&extents->source_pattern.base, + &extents->source_sample_area); + + return FALSE; +} + +static cairo_status_t +upload_boxes (const cairo_spans_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + const cairo_surface_pattern_t *source = &extents->source_pattern.surface; + cairo_surface_t *src; + cairo_rectangle_int_t limit; + cairo_int_status_t status; + int tx, ty; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + src = _cairo_pattern_get_source(source, &limit); + if (!(src->type == CAIRO_SURFACE_TYPE_IMAGE || src->type == dst->type)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->base.matrix, &tx, &ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Check that the data is entirely within the image */ + if (extents->bounded.x + tx < limit.x || extents->bounded.y + ty < limit.y) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (extents->bounded.x + extents->bounded.width + tx > limit.x + limit.width || + extents->bounded.y + extents->bounded.height + ty > limit.y + limit.height) + return CAIRO_INT_STATUS_UNSUPPORTED; + + tx += limit.x; + ty += limit.y; + + if (src->type == CAIRO_SURFACE_TYPE_IMAGE) + status = compositor->draw_image_boxes (dst, + (cairo_image_surface_t *)src, + boxes, tx, ty); + else + status = compositor->copy_boxes (dst, src, boxes, &extents->bounded, + tx, ty); + + return status; +} + +static cairo_bool_t +_clip_is_region (const cairo_clip_t *clip) +{ + int i; + + if (clip->is_region) + return TRUE; + + if (clip->path) + return FALSE; + + for (i = 0; i < clip->num_boxes; i++) { + const cairo_box_t *b = &clip->boxes[i]; + if (!_cairo_fixed_is_integer (b->p1.x | b->p1.y | b->p2.x | b->p2.y)) + return FALSE; + } + + return TRUE; +} + +static cairo_int_status_t +composite_aligned_boxes (const cairo_spans_compositor_t *compositor, + const cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + cairo_operator_t op = extents->op; + const cairo_pattern_t *source = &extents->source_pattern.base; + cairo_int_status_t status; + cairo_bool_t need_clip_mask = ! _clip_is_region (extents->clip); + cairo_bool_t op_is_source; + cairo_bool_t no_mask; + cairo_bool_t inplace; + + TRACE ((stderr, "%s: need_clip_mask=%d, is-bounded=%d\n", + __FUNCTION__, need_clip_mask, extents->is_bounded)); + if (need_clip_mask && ! extents->is_bounded) { + TRACE ((stderr, "%s: unsupported clip\n", __FUNCTION__)); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + no_mask = extents->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID && + CAIRO_COLOR_IS_OPAQUE (&extents->mask_pattern.solid.color); + op_is_source = op_reduces_to_source (extents, no_mask); + inplace = ! need_clip_mask && op_is_source && no_mask; + + TRACE ((stderr, "%s: op-is-source=%d [op=%d], no-mask=%d, inplace=%d\n", + __FUNCTION__, op_is_source, op, no_mask, inplace)); + + if (op == CAIRO_OPERATOR_SOURCE && (need_clip_mask || ! no_mask)) { + /* SOURCE with a mask is actually a LERP in cairo semantics */ + if ((compositor->flags & CAIRO_SPANS_COMPOSITOR_HAS_LERP) == 0) { + TRACE ((stderr, "%s: unsupported lerp\n", __FUNCTION__)); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + + /* Are we just copying a recording surface? */ + if (inplace && + recording_pattern_contains_sample (&extents->source_pattern.base, + &extents->source_sample_area)) + { + cairo_clip_t *recording_clip; + const cairo_pattern_t *source = &extents->source_pattern.base; + const cairo_matrix_t *m; + cairo_matrix_t matrix; + + /* XXX could also do tiling repeat modes... */ + + /* first clear the area about to be overwritten */ + if (! dst->is_clear) { + status = compositor->fill_boxes (dst, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + boxes); + if (unlikely (status)) + return status; + + dst->is_clear = TRUE; + } + + m = &source->matrix; + if (_cairo_surface_has_device_transform (dst)) { + cairo_matrix_multiply (&matrix, + &source->matrix, + &dst->device_transform); + m = &matrix; + } + + recording_clip = _cairo_clip_from_boxes (boxes); + status = _cairo_recording_surface_replay_with_clip (unwrap_source (source), + m, dst, recording_clip); + _cairo_clip_destroy (recording_clip); + + return status; + } + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (! need_clip_mask && no_mask && source->type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_color_t *color; + + color = &((cairo_solid_pattern_t *) source)->color; + if (op_is_source) + op = CAIRO_OPERATOR_SOURCE; + status = compositor->fill_boxes (dst, op, color, boxes); + } else if (inplace && source->type == CAIRO_PATTERN_TYPE_SURFACE) { + status = upload_boxes (compositor, extents, boxes); + } + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_surface_t *src; + cairo_surface_t *mask = NULL; + int src_x, src_y; + int mask_x = 0, mask_y = 0; + + /* All typical cases will have been resolved before now... */ + if (need_clip_mask) { + mask = get_clip_surface (compositor, dst, extents->clip, + &extents->bounded); + if (unlikely (mask->status)) + return mask->status; + + mask_x = -extents->bounded.x; + mask_y = -extents->bounded.y; + } + + /* XXX but this is still ugly */ + if (! no_mask) { + src = compositor->pattern_to_surface (dst, + &extents->mask_pattern.base, + TRUE, + &extents->bounded, + &extents->mask_sample_area, + &src_x, &src_y); + if (unlikely (src->status)) { + cairo_surface_destroy (mask); + return src->status; + } + + if (mask != NULL) { + status = compositor->composite_boxes (mask, CAIRO_OPERATOR_IN, + src, NULL, + src_x, src_y, + 0, 0, + mask_x, mask_y, + boxes, &extents->bounded); + + cairo_surface_destroy (src); + } else { + mask = src; + mask_x = src_x; + mask_y = src_y; + } + } + + src = compositor->pattern_to_surface (dst, source, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (likely (src->status == CAIRO_STATUS_SUCCESS)) { + status = compositor->composite_boxes (dst, op, src, mask, + src_x, src_y, + mask_x, mask_y, + 0, 0, + boxes, &extents->bounded); + cairo_surface_destroy (src); + } else + status = src->status; + + cairo_surface_destroy (mask); + } + + if (status == CAIRO_INT_STATUS_SUCCESS && ! extents->is_bounded) + status = fixup_unbounded_boxes (compositor, extents, boxes); + + return status; +} + +static cairo_bool_t +composite_needs_clip (const cairo_composite_rectangles_t *composite, + const cairo_box_t *extents) +{ + return !_cairo_clip_contains_box (composite->clip, extents); +} + +static cairo_int_status_t +composite_boxes (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_abstract_span_renderer_t renderer; + cairo_rectangular_scan_converter_t converter; + const struct _cairo_boxes_chunk *chunk; + cairo_int_status_t status; + cairo_box_t box; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_box_from_rectangle (&box, &extents->unbounded); + if (composite_needs_clip (extents, &box)) { + TRACE ((stderr, "%s: unsupported clip\n", __FUNCTION__)); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + _cairo_rectangular_scan_converter_init (&converter, &extents->unbounded); + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + int i; + + for (i = 0; i < chunk->count; i++) { + status = _cairo_rectangular_scan_converter_add_box (&converter, &box[i], 1); + if (unlikely (status)) + goto cleanup_converter; + } + } + + status = compositor->renderer_init (&renderer, extents, + CAIRO_ANTIALIAS_DEFAULT, FALSE); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = converter.base.generate (&converter.base, &renderer.base); + compositor->renderer_fini (&renderer, status); + +cleanup_converter: + converter.base.destroy (&converter.base); + return status; +} + +static cairo_int_status_t +composite_polygon (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias) +{ + cairo_abstract_span_renderer_t renderer; + cairo_scan_converter_t *converter; + cairo_bool_t needs_clip; + cairo_int_status_t status; + + if (extents->is_bounded) + needs_clip = extents->clip->path != NULL; + else + needs_clip = !_clip_is_region (extents->clip) || extents->clip->num_boxes > 1; + TRACE ((stderr, "%s - needs_clip=%d\n", __FUNCTION__, needs_clip)); + if (needs_clip) { + TRACE ((stderr, "%s: unsupported clip\n", __FUNCTION__)); + return CAIRO_INT_STATUS_UNSUPPORTED; + converter = _cairo_clip_tor_scan_converter_create (extents->clip, + polygon, + fill_rule, antialias); + } else { + const cairo_rectangle_int_t *r = &extents->unbounded; + + if (antialias == CAIRO_ANTIALIAS_FAST) { + converter = _cairo_tor22_scan_converter_create (r->x, r->y, + r->x + r->width, + r->y + r->height, + fill_rule, antialias); + status = _cairo_tor22_scan_converter_add_polygon (converter, polygon); + } else if (antialias == CAIRO_ANTIALIAS_NONE) { + converter = _cairo_mono_scan_converter_create (r->x, r->y, + r->x + r->width, + r->y + r->height, + fill_rule); + status = _cairo_mono_scan_converter_add_polygon (converter, polygon); + } else { + converter = _cairo_tor_scan_converter_create (r->x, r->y, + r->x + r->width, + r->y + r->height, + fill_rule, antialias); + status = _cairo_tor_scan_converter_add_polygon (converter, polygon); + } + } + if (unlikely (status)) + goto cleanup_converter; + + status = compositor->renderer_init (&renderer, extents, + antialias, needs_clip); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = converter->generate (converter, &renderer.base); + compositor->renderer_fini (&renderer, status); + +cleanup_converter: + converter->destroy (converter); + return status; +} + +static cairo_int_status_t +trim_extents_to_boxes (cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_box_t box; + + _cairo_boxes_extents (boxes, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_int_status_t +trim_extents_to_polygon (cairo_composite_rectangles_t *extents, + cairo_polygon_t *polygon) +{ + return _cairo_composite_rectangles_intersect_mask_extents (extents, + &polygon->extents); +} + +static cairo_int_status_t +clip_and_composite_boxes (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_int_status_t status; + cairo_polygon_t polygon; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = trim_extents_to_boxes (extents, boxes); + if (unlikely (status)) + return status; + + if (boxes->num_boxes == 0) { + if (extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + return fixup_unbounded_boxes (compositor, extents, boxes); + } + + /* Can we reduce drawing through a clip-mask to simply drawing the clip? */ + if (extents->clip->path != NULL && extents->is_bounded) { + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + cairo_clip_t *clip; + + clip = _cairo_clip_copy (extents->clip); + clip = _cairo_clip_intersect_boxes (clip, boxes); + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + status = _cairo_clip_get_polygon (clip, &polygon, + &fill_rule, &antialias); + _cairo_clip_path_destroy (clip->path); + clip->path = NULL; + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t *saved_clip = extents->clip; + extents->clip = clip; + + status = clip_and_composite_polygon (compositor, extents, &polygon, + fill_rule, antialias); + + clip = extents->clip; + extents->clip = saved_clip; + + _cairo_polygon_fini (&polygon); + } + _cairo_clip_destroy (clip); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + if (boxes->is_pixel_aligned) { + status = composite_aligned_boxes (compositor, extents, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + status = composite_boxes (compositor, extents, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_polygon_init_boxes (&polygon, boxes); + if (unlikely (status)) + return status; + + status = composite_polygon (compositor, extents, &polygon, + CAIRO_FILL_RULE_WINDING, + CAIRO_ANTIALIAS_DEFAULT); + _cairo_polygon_fini (&polygon); + + return status; +} + +static cairo_int_status_t +clip_and_composite_polygon (const cairo_spans_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + /* XXX simply uses polygon limits.point extemities, tessellation? */ + status = trim_extents_to_polygon (extents, polygon); + if (unlikely (status)) + return status; + + if (_cairo_polygon_is_empty (polygon)) { + cairo_boxes_t boxes; + + if (extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + _cairo_boxes_init (&boxes); + extents->bounded.width = extents->bounded.height = 0; + return fixup_unbounded_boxes (compositor, extents, &boxes); + } + + if (extents->is_bounded && extents->clip->path) { + cairo_polygon_t clipper; + cairo_antialias_t clip_antialias; + cairo_fill_rule_t clip_fill_rule; + + TRACE((stderr, "%s - combining shape with clip polygon\n", + __FUNCTION__)); + + status = _cairo_clip_get_polygon (extents->clip, + &clipper, + &clip_fill_rule, + &clip_antialias); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t *old_clip; + + if (clip_antialias == antialias) { + status = _cairo_polygon_intersect (polygon, fill_rule, + &clipper, clip_fill_rule); + _cairo_polygon_fini (&clipper); + if (unlikely (status)) + return status; + + old_clip = extents->clip; + extents->clip = _cairo_clip_copy_region (extents->clip); + _cairo_clip_destroy (old_clip); + + status = trim_extents_to_polygon (extents, polygon); + if (unlikely (status)) + return status; + + fill_rule = CAIRO_FILL_RULE_WINDING; + } else { + _cairo_polygon_fini (&clipper); + } + } + } + + return composite_polygon (compositor, extents, + polygon, fill_rule, antialias); +} + +/* high-level compositor interface */ + +static cairo_int_status_t +_cairo_spans_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + const cairo_spans_compositor_t *compositor = (cairo_spans_compositor_t*)_compositor; + cairo_boxes_t boxes; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_clip_steal_boxes (extents->clip, &boxes); + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_clip_unsteal_boxes (extents->clip, &boxes); + + return status; +} + +static cairo_int_status_t +_cairo_spans_compositor_mask (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + const cairo_spans_compositor_t *compositor = (cairo_spans_compositor_t*)_compositor; + cairo_int_status_t status; + cairo_boxes_t boxes; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_clip_steal_boxes (extents->clip, &boxes); + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_clip_unsteal_boxes (extents->clip, &boxes); + + return status; +} + +static cairo_int_status_t +_cairo_spans_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + const cairo_spans_compositor_t *compositor = (cairo_spans_compositor_t*)_compositor; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + TRACE_ (_cairo_debug_print_path (stderr, path)); + TRACE_ (_cairo_debug_print_clip (stderr, extents->clip)); + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + if (! _cairo_clip_contains_rectangle (extents->clip, &extents->mask)) + _cairo_boxes_limit (&boxes, + extents->clip->boxes, + extents->clip->num_boxes); + + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + style, + ctm, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule = CAIRO_FILL_RULE_WINDING; + + if (! _cairo_rectangle_contains_rectangle (&extents->unbounded, + &extents->mask)) + { + if (extents->clip->num_boxes == 1) { + _cairo_polygon_init (&polygon, extents->clip->boxes, 1); + } else { + cairo_box_t limits; + _cairo_box_from_rectangle (&limits, &extents->unbounded); + _cairo_polygon_init (&polygon, &limits, 1); + } + } + else + { + _cairo_polygon_init (&polygon, NULL, 0); + } + status = _cairo_path_fixed_stroke_to_polygon (path, + style, + ctm, ctm_inverse, + tolerance, + &polygon); + TRACE_ (_cairo_debug_print_polygon (stderr, &polygon)); + polygon.num_limits = 0; + + if (status == CAIRO_INT_STATUS_SUCCESS && extents->clip->num_boxes > 1) { + status = _cairo_polygon_intersect_with_boxes (&polygon, &fill_rule, + extents->clip->boxes, + extents->clip->num_boxes); + } + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t *saved_clip = extents->clip; + + if (extents->is_bounded) { + extents->clip = _cairo_clip_copy_path (extents->clip); + extents->clip = _cairo_clip_intersect_box(extents->clip, + &polygon.extents); + } + + status = clip_and_composite_polygon (compositor, extents, &polygon, + fill_rule, antialias); + + if (extents->is_bounded) { + _cairo_clip_destroy (extents->clip); + extents->clip = saved_clip; + } + } + _cairo_polygon_fini (&polygon); + } + + return status; +} + +static cairo_int_status_t +_cairo_spans_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + const cairo_spans_compositor_t *compositor = (cairo_spans_compositor_t*)_compositor; + cairo_int_status_t status; + + TRACE((stderr, "%s op=%d, antialias=%d\n", __FUNCTION__, extents->op, antialias)); + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + TRACE((stderr, "%s - rectilinear\n", __FUNCTION__)); + + _cairo_boxes_init (&boxes); + if (! _cairo_clip_contains_rectangle (extents->clip, &extents->mask)) + _cairo_boxes_limit (&boxes, + extents->clip->boxes, + extents->clip->num_boxes); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_boxes_fini (&boxes); + } + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_polygon_t polygon; + + TRACE((stderr, "%s - polygon\n", __FUNCTION__)); + + if (! _cairo_rectangle_contains_rectangle (&extents->unbounded, + &extents->mask)) + { + TRACE((stderr, "%s - clipping to bounds\n", __FUNCTION__)); + if (extents->clip->num_boxes == 1) { + _cairo_polygon_init (&polygon, extents->clip->boxes, 1); + } else { + cairo_box_t limits; + _cairo_box_from_rectangle (&limits, &extents->unbounded); + _cairo_polygon_init (&polygon, &limits, 1); + } + } + else + { + _cairo_polygon_init (&polygon, NULL, 0); + } + + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &polygon); + TRACE_ (_cairo_debug_print_polygon (stderr, &polygon)); + polygon.num_limits = 0; + + if (status == CAIRO_INT_STATUS_SUCCESS && extents->clip->num_boxes > 1) { + TRACE((stderr, "%s - polygon intersect with %d clip boxes\n", + __FUNCTION__, extents->clip->num_boxes)); + status = _cairo_polygon_intersect_with_boxes (&polygon, &fill_rule, + extents->clip->boxes, + extents->clip->num_boxes); + } + TRACE_ (_cairo_debug_print_polygon (stderr, &polygon)); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t *saved_clip = extents->clip; + + if (extents->is_bounded) { + TRACE((stderr, "%s - polygon discard clip boxes\n", + __FUNCTION__)); + extents->clip = _cairo_clip_copy_path (extents->clip); + extents->clip = _cairo_clip_intersect_box(extents->clip, + &polygon.extents); + } + + status = clip_and_composite_polygon (compositor, extents, &polygon, + fill_rule, antialias); + + if (extents->is_bounded) { + _cairo_clip_destroy (extents->clip); + extents->clip = saved_clip; + } + } + _cairo_polygon_fini (&polygon); + + TRACE((stderr, "%s - polygon status=%d\n", __FUNCTION__, status)); + } + + return status; +} + +void +_cairo_spans_compositor_init (cairo_spans_compositor_t *compositor, + const cairo_compositor_t *delegate) +{ + compositor->base.delegate = delegate; + + compositor->base.paint = _cairo_spans_compositor_paint; + compositor->base.mask = _cairo_spans_compositor_mask; + compositor->base.fill = _cairo_spans_compositor_fill; + compositor->base.stroke = _cairo_spans_compositor_stroke; + compositor->base.glyphs = NULL; +} diff --git a/src/cairo-spans-private.h b/src/cairo-spans-private.h new file mode 100644 index 000000000..b158f4d36 --- /dev/null +++ b/src/cairo-spans-private.h @@ -0,0 +1,206 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2008 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef CAIRO_SPANS_PRIVATE_H +#define CAIRO_SPANS_PRIVATE_H +#include "cairo-types-private.h" +#include "cairo-compiler-private.h" + +/* Number of bits of precision used for alpha. */ +#define CAIRO_SPANS_UNIT_COVERAGE_BITS 8 +#define CAIRO_SPANS_UNIT_COVERAGE ((1 << CAIRO_SPANS_UNIT_COVERAGE_BITS)-1) + +/* A structure representing an open-ended horizontal span of constant + * pixel coverage. */ +typedef struct _cairo_half_open_span { + int32_t x; /* The inclusive x-coordinate of the start of the span. */ + uint8_t coverage; /* The pixel coverage for the pixels to the right. */ + uint8_t inverse; /* between regular mask and clip */ +} cairo_half_open_span_t; + +/* Span renderer interface. Instances of renderers are provided by + * surfaces if they want to composite spans instead of trapezoids. */ +typedef struct _cairo_span_renderer cairo_span_renderer_t; +struct _cairo_span_renderer { + /* Private status variable. */ + cairo_status_t status; + + /* Called to destroy the renderer. */ + cairo_destroy_func_t destroy; + + /* Render the spans on row y of the destination by whatever compositing + * method is required. */ + cairo_status_t + (*render_rows) (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *coverages, + unsigned num_coverages); + + /* Called after all rows have been rendered to perform whatever + * final rendering step is required. This function is called just + * once before the renderer is destroyed. */ + cairo_status_t (*finish) (void *abstract_renderer); +}; + +/* Scan converter interface. */ +typedef struct _cairo_scan_converter cairo_scan_converter_t; +struct _cairo_scan_converter { + /* Destroy this scan converter. */ + cairo_destroy_func_t destroy; + + /* Generates coverage spans for rows for the added edges and calls + * the renderer function for each row. After generating spans the + * only valid thing to do with the converter is to destroy it. */ + cairo_status_t (*generate) (void *abstract_converter, + cairo_span_renderer_t *renderer); + + /* Private status. Read with _cairo_scan_converter_status(). */ + cairo_status_t status; +}; + +/* Scan converter constructors. */ + +cairo_private cairo_scan_converter_t * +_cairo_tor_scan_converter_create (int xmin, + int ymin, + int xmax, + int ymax, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias); +cairo_private cairo_status_t +_cairo_tor_scan_converter_add_polygon (void *converter, + const cairo_polygon_t *polygon); + +cairo_private cairo_scan_converter_t * +_cairo_tor22_scan_converter_create (int xmin, + int ymin, + int xmax, + int ymax, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias); +cairo_private cairo_status_t +_cairo_tor22_scan_converter_add_polygon (void *converter, + const cairo_polygon_t *polygon); + +cairo_private cairo_scan_converter_t * +_cairo_mono_scan_converter_create (int xmin, + int ymin, + int xmax, + int ymax, + cairo_fill_rule_t fill_rule); +cairo_private cairo_status_t +_cairo_mono_scan_converter_add_polygon (void *converter, + const cairo_polygon_t *polygon); + +cairo_private cairo_scan_converter_t * +_cairo_clip_tor_scan_converter_create (cairo_clip_t *clip, + cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias); + +typedef struct _cairo_rectangular_scan_converter { + cairo_scan_converter_t base; + + cairo_box_t extents; + + struct _cairo_rectangular_scan_converter_chunk { + struct _cairo_rectangular_scan_converter_chunk *next; + void *base; + int count; + int size; + } chunks, *tail; + char buf[CAIRO_STACK_BUFFER_SIZE]; + int num_rectangles; +} cairo_rectangular_scan_converter_t; + +cairo_private void +_cairo_rectangular_scan_converter_init (cairo_rectangular_scan_converter_t *self, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_rectangular_scan_converter_add_box (cairo_rectangular_scan_converter_t *self, + const cairo_box_t *box, + int dir); + +typedef struct _cairo_botor_scan_converter { + cairo_scan_converter_t base; + + cairo_box_t extents; + cairo_fill_rule_t fill_rule; + + int xmin, xmax; + + struct _cairo_botor_scan_converter_chunk { + struct _cairo_botor_scan_converter_chunk *next; + void *base; + int count; + int size; + } chunks, *tail; + char buf[CAIRO_STACK_BUFFER_SIZE]; + int num_edges; +} cairo_botor_scan_converter_t; + +cairo_private void +_cairo_botor_scan_converter_init (cairo_botor_scan_converter_t *self, + const cairo_box_t *extents, + cairo_fill_rule_t fill_rule); + +/* cairo-spans.c: */ + +cairo_private cairo_scan_converter_t * +_cairo_scan_converter_create_in_error (cairo_status_t error); + +cairo_private cairo_status_t +_cairo_scan_converter_status (void *abstract_converter); + +cairo_private cairo_status_t +_cairo_scan_converter_set_error (void *abstract_converter, + cairo_status_t error); + +cairo_private cairo_span_renderer_t * +_cairo_span_renderer_create_in_error (cairo_status_t error); + +cairo_private cairo_status_t +_cairo_span_renderer_status (void *abstract_renderer); + +/* Set the renderer into an error state. This sets all the method + * pointers except ->destroy() of the renderer to no-op + * implementations that just return the error status. */ +cairo_private cairo_status_t +_cairo_span_renderer_set_error (void *abstract_renderer, + cairo_status_t error); + +cairo_private cairo_status_t +_cairo_surface_composite_polygon (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias, + const cairo_composite_rectangles_t *rects, + cairo_polygon_t *polygon, + cairo_region_t *clip_region); + +#endif /* CAIRO_SPANS_PRIVATE_H */ diff --git a/src/cairo-spans.c b/src/cairo-spans.c new file mode 100644 index 000000000..182390c20 --- /dev/null +++ b/src/cairo-spans.c @@ -0,0 +1,250 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2008 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "cairoint.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-clip-private.h" +#include "cairo-error-private.h" +#include "cairo-fixed-private.h" +#include "cairo-types-private.h" + +static void +_cairo_nil_destroy (void *abstract) +{ + (void) abstract; +} + +static cairo_status_t +_cairo_nil_scan_converter_generate (void *abstract_converter, + cairo_span_renderer_t *renderer) +{ + (void) abstract_converter; + (void) renderer; + return _cairo_scan_converter_status (abstract_converter); +} + +cairo_status_t +_cairo_scan_converter_status (void *abstract_converter) +{ + cairo_scan_converter_t *converter = abstract_converter; + return converter->status; +} + +cairo_status_t +_cairo_scan_converter_set_error (void *abstract_converter, + cairo_status_t error) +{ + cairo_scan_converter_t *converter = abstract_converter; + if (error == CAIRO_STATUS_SUCCESS) + ASSERT_NOT_REACHED; + if (converter->status == CAIRO_STATUS_SUCCESS) { + converter->generate = _cairo_nil_scan_converter_generate; + converter->status = error; + } + return converter->status; +} + +static void +_cairo_nil_scan_converter_init (cairo_scan_converter_t *converter, + cairo_status_t status) +{ + converter->destroy = _cairo_nil_destroy; + converter->status = CAIRO_STATUS_SUCCESS; + status = _cairo_scan_converter_set_error (converter, status); +} + +cairo_scan_converter_t * +_cairo_scan_converter_create_in_error (cairo_status_t status) +{ +#define RETURN_NIL {\ + static cairo_scan_converter_t nil;\ + _cairo_nil_scan_converter_init (&nil, status);\ + return &nil;\ + } + switch (status) { + case CAIRO_STATUS_SUCCESS: + case CAIRO_STATUS_LAST_STATUS: + ASSERT_NOT_REACHED; + break; + case CAIRO_STATUS_INVALID_RESTORE: RETURN_NIL; + case CAIRO_STATUS_INVALID_POP_GROUP: RETURN_NIL; + case CAIRO_STATUS_NO_CURRENT_POINT: RETURN_NIL; + case CAIRO_STATUS_INVALID_MATRIX: RETURN_NIL; + case CAIRO_STATUS_INVALID_STATUS: RETURN_NIL; + case CAIRO_STATUS_NULL_POINTER: RETURN_NIL; + case CAIRO_STATUS_INVALID_STRING: RETURN_NIL; + case CAIRO_STATUS_INVALID_PATH_DATA: RETURN_NIL; + case CAIRO_STATUS_READ_ERROR: RETURN_NIL; + case CAIRO_STATUS_WRITE_ERROR: RETURN_NIL; + case CAIRO_STATUS_SURFACE_FINISHED: RETURN_NIL; + case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_INVALID_CONTENT: RETURN_NIL; + case CAIRO_STATUS_INVALID_FORMAT: RETURN_NIL; + case CAIRO_STATUS_INVALID_VISUAL: RETURN_NIL; + case CAIRO_STATUS_FILE_NOT_FOUND: RETURN_NIL; + case CAIRO_STATUS_INVALID_DASH: RETURN_NIL; + case CAIRO_STATUS_INVALID_DSC_COMMENT: RETURN_NIL; + case CAIRO_STATUS_INVALID_INDEX: RETURN_NIL; + case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: RETURN_NIL; + case CAIRO_STATUS_TEMP_FILE_ERROR: RETURN_NIL; + case CAIRO_STATUS_INVALID_STRIDE: RETURN_NIL; + case CAIRO_STATUS_FONT_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_USER_FONT_IMMUTABLE: RETURN_NIL; + case CAIRO_STATUS_USER_FONT_ERROR: RETURN_NIL; + case CAIRO_STATUS_NEGATIVE_COUNT: RETURN_NIL; + case CAIRO_STATUS_INVALID_CLUSTERS: RETURN_NIL; + case CAIRO_STATUS_INVALID_SLANT: RETURN_NIL; + case CAIRO_STATUS_INVALID_WEIGHT: RETURN_NIL; + case CAIRO_STATUS_NO_MEMORY: RETURN_NIL; + case CAIRO_STATUS_INVALID_SIZE: RETURN_NIL; + case CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: RETURN_NIL; + case CAIRO_STATUS_DEVICE_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_DEVICE_ERROR: RETURN_NIL; + case CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: RETURN_NIL; + case CAIRO_STATUS_DEVICE_FINISHED: RETURN_NIL; + case CAIRO_STATUS_JBIG2_GLOBAL_MISSING: + default: + break; + } + status = CAIRO_STATUS_NO_MEMORY; + RETURN_NIL; +#undef RETURN_NIL +} + +static cairo_status_t +_cairo_nil_span_renderer_render_rows ( + void *abstract_renderer, + int y, + int height, + const cairo_half_open_span_t *coverages, + unsigned num_coverages) +{ + (void) y; + (void) height; + (void) coverages; + (void) num_coverages; + return _cairo_span_renderer_status (abstract_renderer); +} + +static cairo_status_t +_cairo_nil_span_renderer_finish (void *abstract_renderer) +{ + return _cairo_span_renderer_status (abstract_renderer); +} + +cairo_status_t +_cairo_span_renderer_status (void *abstract_renderer) +{ + cairo_span_renderer_t *renderer = abstract_renderer; + return renderer->status; +} + +cairo_status_t +_cairo_span_renderer_set_error ( + void *abstract_renderer, + cairo_status_t error) +{ + cairo_span_renderer_t *renderer = abstract_renderer; + if (error == CAIRO_STATUS_SUCCESS) { + ASSERT_NOT_REACHED; + } + if (renderer->status == CAIRO_STATUS_SUCCESS) { + renderer->render_rows = _cairo_nil_span_renderer_render_rows; + renderer->finish = _cairo_nil_span_renderer_finish; + renderer->status = error; + } + return renderer->status; +} + +static void +_cairo_nil_span_renderer_init (cairo_span_renderer_t *renderer, + cairo_status_t status) +{ + renderer->destroy = _cairo_nil_destroy; + renderer->status = CAIRO_STATUS_SUCCESS; + status = _cairo_span_renderer_set_error (renderer, status); +} + +cairo_span_renderer_t * +_cairo_span_renderer_create_in_error (cairo_status_t status) +{ +#define RETURN_NIL {\ + static cairo_span_renderer_t nil;\ + _cairo_nil_span_renderer_init (&nil, status);\ + return &nil;\ + } + switch (status) { + case CAIRO_STATUS_SUCCESS: + case CAIRO_STATUS_LAST_STATUS: + ASSERT_NOT_REACHED; + break; + case CAIRO_STATUS_INVALID_RESTORE: RETURN_NIL; + case CAIRO_STATUS_INVALID_POP_GROUP: RETURN_NIL; + case CAIRO_STATUS_NO_CURRENT_POINT: RETURN_NIL; + case CAIRO_STATUS_INVALID_MATRIX: RETURN_NIL; + case CAIRO_STATUS_INVALID_STATUS: RETURN_NIL; + case CAIRO_STATUS_NULL_POINTER: RETURN_NIL; + case CAIRO_STATUS_INVALID_STRING: RETURN_NIL; + case CAIRO_STATUS_INVALID_PATH_DATA: RETURN_NIL; + case CAIRO_STATUS_READ_ERROR: RETURN_NIL; + case CAIRO_STATUS_WRITE_ERROR: RETURN_NIL; + case CAIRO_STATUS_SURFACE_FINISHED: RETURN_NIL; + case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_INVALID_CONTENT: RETURN_NIL; + case CAIRO_STATUS_INVALID_FORMAT: RETURN_NIL; + case CAIRO_STATUS_INVALID_VISUAL: RETURN_NIL; + case CAIRO_STATUS_FILE_NOT_FOUND: RETURN_NIL; + case CAIRO_STATUS_INVALID_DASH: RETURN_NIL; + case CAIRO_STATUS_INVALID_DSC_COMMENT: RETURN_NIL; + case CAIRO_STATUS_INVALID_INDEX: RETURN_NIL; + case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: RETURN_NIL; + case CAIRO_STATUS_TEMP_FILE_ERROR: RETURN_NIL; + case CAIRO_STATUS_INVALID_STRIDE: RETURN_NIL; + case CAIRO_STATUS_FONT_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_USER_FONT_IMMUTABLE: RETURN_NIL; + case CAIRO_STATUS_USER_FONT_ERROR: RETURN_NIL; + case CAIRO_STATUS_NEGATIVE_COUNT: RETURN_NIL; + case CAIRO_STATUS_INVALID_CLUSTERS: RETURN_NIL; + case CAIRO_STATUS_INVALID_SLANT: RETURN_NIL; + case CAIRO_STATUS_INVALID_WEIGHT: RETURN_NIL; + case CAIRO_STATUS_NO_MEMORY: RETURN_NIL; + case CAIRO_STATUS_INVALID_SIZE: RETURN_NIL; + case CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: RETURN_NIL; + case CAIRO_STATUS_DEVICE_TYPE_MISMATCH: RETURN_NIL; + case CAIRO_STATUS_DEVICE_ERROR: RETURN_NIL; + case CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: RETURN_NIL; + case CAIRO_STATUS_DEVICE_FINISHED: RETURN_NIL; + case CAIRO_STATUS_JBIG2_GLOBAL_MISSING: RETURN_NIL; + default: + break; + } + status = CAIRO_STATUS_NO_MEMORY; + RETURN_NIL; +#undef RETURN_NIL +} diff --git a/src/cairo-spline.c b/src/cairo-spline.c new file mode 100644 index 000000000..44634faec --- /dev/null +++ b/src/cairo-spline.c @@ -0,0 +1,424 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-slope-private.h" + +cairo_bool_t +_cairo_spline_intersects (const cairo_point_t *a, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d, + const cairo_box_t *box) +{ + cairo_box_t bounds; + + if (_cairo_box_contains_point (box, a) || + _cairo_box_contains_point (box, b) || + _cairo_box_contains_point (box, c) || + _cairo_box_contains_point (box, d)) + { + return TRUE; + } + + bounds.p2 = bounds.p1 = *a; + _cairo_box_add_point (&bounds, b); + _cairo_box_add_point (&bounds, c); + _cairo_box_add_point (&bounds, d); + + if (bounds.p2.x <= box->p1.x || bounds.p1.x >= box->p2.x || + bounds.p2.y <= box->p1.y || bounds.p1.y >= box->p2.y) + { + return FALSE; + } + +#if 0 /* worth refining? */ + bounds.p2 = bounds.p1 = *a; + _cairo_box_add_curve_to (&bounds, b, c, d); + if (bounds.p2.x <= box->p1.x || bounds.p1.x >= box->p2.x || + bounds.p2.y <= box->p1.y || bounds.p1.y >= box->p2.y) + { + return FALSE; + } +#endif + + return TRUE; +} + +cairo_bool_t +_cairo_spline_init (cairo_spline_t *spline, + cairo_spline_add_point_func_t add_point_func, + void *closure, + const cairo_point_t *a, const cairo_point_t *b, + const cairo_point_t *c, const cairo_point_t *d) +{ + /* If both tangents are zero, this is just a straight line */ + if (a->x == b->x && a->y == b->y && c->x == d->x && c->y == d->y) + return FALSE; + + spline->add_point_func = add_point_func; + spline->closure = closure; + + spline->knots.a = *a; + spline->knots.b = *b; + spline->knots.c = *c; + spline->knots.d = *d; + + if (a->x != b->x || a->y != b->y) + _cairo_slope_init (&spline->initial_slope, &spline->knots.a, &spline->knots.b); + else if (a->x != c->x || a->y != c->y) + _cairo_slope_init (&spline->initial_slope, &spline->knots.a, &spline->knots.c); + else if (a->x != d->x || a->y != d->y) + _cairo_slope_init (&spline->initial_slope, &spline->knots.a, &spline->knots.d); + else + return FALSE; + + if (c->x != d->x || c->y != d->y) + _cairo_slope_init (&spline->final_slope, &spline->knots.c, &spline->knots.d); + else if (b->x != d->x || b->y != d->y) + _cairo_slope_init (&spline->final_slope, &spline->knots.b, &spline->knots.d); + else + return FALSE; /* just treat this as a straight-line from a -> d */ + + /* XXX if the initial, final and vector are all equal, this is just a line */ + + return TRUE; +} + +static cairo_status_t +_cairo_spline_add_point (cairo_spline_t *spline, + const cairo_point_t *point, + const cairo_point_t *knot) +{ + cairo_point_t *prev; + cairo_slope_t slope; + + prev = &spline->last_point; + if (prev->x == point->x && prev->y == point->y) + return CAIRO_STATUS_SUCCESS; + + _cairo_slope_init (&slope, point, knot); + + spline->last_point = *point; + return spline->add_point_func (spline->closure, point, &slope); +} + +static void +_lerp_half (const cairo_point_t *a, const cairo_point_t *b, cairo_point_t *result) +{ + result->x = a->x + ((b->x - a->x) >> 1); + result->y = a->y + ((b->y - a->y) >> 1); +} + +static void +_de_casteljau (cairo_spline_knots_t *s1, cairo_spline_knots_t *s2) +{ + cairo_point_t ab, bc, cd; + cairo_point_t abbc, bccd; + cairo_point_t final; + + _lerp_half (&s1->a, &s1->b, &ab); + _lerp_half (&s1->b, &s1->c, &bc); + _lerp_half (&s1->c, &s1->d, &cd); + _lerp_half (&ab, &bc, &abbc); + _lerp_half (&bc, &cd, &bccd); + _lerp_half (&abbc, &bccd, &final); + + s2->a = final; + s2->b = bccd; + s2->c = cd; + s2->d = s1->d; + + s1->b = ab; + s1->c = abbc; + s1->d = final; +} + +/* Return an upper bound on the error (squared) that could result from + * approximating a spline as a line segment connecting the two endpoints. */ +static double +_cairo_spline_error_squared (const cairo_spline_knots_t *knots) +{ + double bdx, bdy, berr; + double cdx, cdy, cerr; + + /* We are going to compute the distance (squared) between each of the the b + * and c control points and the segment a-b. The maximum of these two + * distances will be our approximation error. */ + + bdx = _cairo_fixed_to_double (knots->b.x - knots->a.x); + bdy = _cairo_fixed_to_double (knots->b.y - knots->a.y); + + cdx = _cairo_fixed_to_double (knots->c.x - knots->a.x); + cdy = _cairo_fixed_to_double (knots->c.y - knots->a.y); + + if (knots->a.x != knots->d.x || knots->a.y != knots->d.y) { + /* Intersection point (px): + * px = p1 + u(p2 - p1) + * (p - px) ∙ (p2 - p1) = 0 + * Thus: + * u = ((p - p1) ∙ (p2 - p1)) / ∥p2 - p1∥²; + */ + + double dx, dy, u, v; + + dx = _cairo_fixed_to_double (knots->d.x - knots->a.x); + dy = _cairo_fixed_to_double (knots->d.y - knots->a.y); + v = dx * dx + dy * dy; + + u = bdx * dx + bdy * dy; + if (u <= 0) { + /* bdx -= 0; + * bdy -= 0; + */ + } else if (u >= v) { + bdx -= dx; + bdy -= dy; + } else { + bdx -= u/v * dx; + bdy -= u/v * dy; + } + + u = cdx * dx + cdy * dy; + if (u <= 0) { + /* cdx -= 0; + * cdy -= 0; + */ + } else if (u >= v) { + cdx -= dx; + cdy -= dy; + } else { + cdx -= u/v * dx; + cdy -= u/v * dy; + } + } + + berr = bdx * bdx + bdy * bdy; + cerr = cdx * cdx + cdy * cdy; + if (berr > cerr) + return berr; + else + return cerr; +} + +static cairo_status_t +_cairo_spline_decompose_into (cairo_spline_knots_t *s1, + double tolerance_squared, + cairo_spline_t *result) +{ + cairo_spline_knots_t s2; + cairo_status_t status; + + if (_cairo_spline_error_squared (s1) < tolerance_squared) + return _cairo_spline_add_point (result, &s1->a, &s1->b); + + _de_casteljau (s1, &s2); + + status = _cairo_spline_decompose_into (s1, tolerance_squared, result); + if (unlikely (status)) + return status; + + return _cairo_spline_decompose_into (&s2, tolerance_squared, result); +} + +cairo_status_t +_cairo_spline_decompose (cairo_spline_t *spline, double tolerance) +{ + cairo_spline_knots_t s1; + cairo_status_t status; + + s1 = spline->knots; + spline->last_point = s1.a; + status = _cairo_spline_decompose_into (&s1, tolerance * tolerance, spline); + if (unlikely (status)) + return status; + + return spline->add_point_func (spline->closure, + &spline->knots.d, &spline->final_slope); +} + +/* Note: this function is only good for computing bounds in device space. */ +cairo_status_t +_cairo_spline_bound (cairo_spline_add_point_func_t add_point_func, + void *closure, + const cairo_point_t *p0, const cairo_point_t *p1, + const cairo_point_t *p2, const cairo_point_t *p3) +{ + double x0, x1, x2, x3; + double y0, y1, y2, y3; + double a, b, c; + double t[4]; + int t_num = 0, i; + cairo_status_t status; + + x0 = _cairo_fixed_to_double (p0->x); + y0 = _cairo_fixed_to_double (p0->y); + x1 = _cairo_fixed_to_double (p1->x); + y1 = _cairo_fixed_to_double (p1->y); + x2 = _cairo_fixed_to_double (p2->x); + y2 = _cairo_fixed_to_double (p2->y); + x3 = _cairo_fixed_to_double (p3->x); + y3 = _cairo_fixed_to_double (p3->y); + + /* The spline can be written as a polynomial of the four points: + * + * (1-t)³p0 + 3t(1-t)²p1 + 3t²(1-t)p2 + t³p3 + * + * for 0≤t≤1. Now, the X and Y components of the spline follow the + * same polynomial but with x and y replaced for p. To find the + * bounds of the spline, we just need to find the X and Y bounds. + * To find the bound, we take the derivative and equal it to zero, + * and solve to find the t's that give the extreme points. + * + * Here is the derivative of the curve, sorted on t: + * + * 3t²(-p0+3p1-3p2+p3) + 2t(3p0-6p1+3p2) -3p0+3p1 + * + * Let: + * + * a = -p0+3p1-3p2+p3 + * b = p0-2p1+p2 + * c = -p0+p1 + * + * Gives: + * + * a.t² + 2b.t + c = 0 + * + * With: + * + * delta = b*b - a*c + * + * the extreme points are at -c/2b if a is zero, at (-b±√delta)/a if + * delta is positive, and at -b/a if delta is zero. + */ + +#define ADD(t0) \ + { \ + double _t0 = (t0); \ + if (0 < _t0 && _t0 < 1) \ + t[t_num++] = _t0; \ + } + +#define FIND_EXTREMES(a,b,c) \ + { \ + if (a == 0) { \ + if (b != 0) \ + ADD (-c / (2*b)); \ + } else { \ + double b2 = b * b; \ + double delta = b2 - a * c; \ + if (delta > 0) { \ + cairo_bool_t feasible; \ + double _2ab = 2 * a * b; \ + /* We are only interested in solutions t that satisfy 0= 0) \ + feasible = delta > b2 && delta < a*a + b2 + _2ab; \ + else if (-b / a >= 1) \ + feasible = delta < b2 && delta > a*a + b2 + _2ab; \ + else \ + feasible = delta < b2 || delta < a*a + b2 + _2ab; \ + \ + if (unlikely (feasible)) { \ + double sqrt_delta = sqrt (delta); \ + ADD ((-b - sqrt_delta) / a); \ + ADD ((-b + sqrt_delta) / a); \ + } \ + } else if (delta == 0) { \ + ADD (-b / a); \ + } \ + } \ + } + + /* Find X extremes */ + a = -x0 + 3*x1 - 3*x2 + x3; + b = x0 - 2*x1 + x2; + c = -x0 + x1; + FIND_EXTREMES (a, b, c); + + /* Find Y extremes */ + a = -y0 + 3*y1 - 3*y2 + y3; + b = y0 - 2*y1 + y2; + c = -y0 + y1; + FIND_EXTREMES (a, b, c); + + status = add_point_func (closure, p0, NULL); + if (unlikely (status)) + return status; + + for (i = 0; i < t_num; i++) { + cairo_point_t p; + double x, y; + double t_1_0, t_0_1; + double t_2_0, t_0_2; + double t_3_0, t_2_1_3, t_1_2_3, t_0_3; + + t_1_0 = t[i]; /* t */ + t_0_1 = 1 - t_1_0; /* (1 - t) */ + + t_2_0 = t_1_0 * t_1_0; /* t * t */ + t_0_2 = t_0_1 * t_0_1; /* (1 - t) * (1 - t) */ + + t_3_0 = t_2_0 * t_1_0; /* t * t * t */ + t_2_1_3 = t_2_0 * t_0_1 * 3; /* t * t * (1 - t) * 3 */ + t_1_2_3 = t_1_0 * t_0_2 * 3; /* t * (1 - t) * (1 - t) * 3 */ + t_0_3 = t_0_1 * t_0_2; /* (1 - t) * (1 - t) * (1 - t) */ + + /* Bezier polynomial */ + x = x0 * t_0_3 + + x1 * t_1_2_3 + + x2 * t_2_1_3 + + x3 * t_3_0; + y = y0 * t_0_3 + + y1 * t_1_2_3 + + y2 * t_2_1_3 + + y3 * t_3_0; + + p.x = _cairo_fixed_from_double (x); + p.y = _cairo_fixed_from_double (y); + status = add_point_func (closure, &p, NULL); + if (unlikely (status)) + return status; + } + + return add_point_func (closure, p3, NULL); +} diff --git a/src/cairo-stroke-dash-private.h b/src/cairo-stroke-dash-private.h new file mode 100644 index 000000000..75c000cd7 --- /dev/null +++ b/src/cairo-stroke-dash-private.h @@ -0,0 +1,70 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#ifndef CAIRO_STROKE_DASH_PRIVATE_H +#define CAIRO_STROKE_DASH_PRIVATE_H + +#include "cairoint.h" + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_stroker_dash { + cairo_bool_t dashed; + unsigned int dash_index; + cairo_bool_t dash_on; + cairo_bool_t dash_starts_on; + double dash_remain; + + double dash_offset; + const double *dashes; + unsigned int num_dashes; +} cairo_stroker_dash_t; + +cairo_private void +_cairo_stroker_dash_init (cairo_stroker_dash_t *dash, + const cairo_stroke_style_t *style); + +cairo_private void +_cairo_stroker_dash_start (cairo_stroker_dash_t *dash); + +cairo_private void +_cairo_stroker_dash_step (cairo_stroker_dash_t *dash, double step); + +CAIRO_END_DECLS + +#endif /* CAIRO_STROKE_DASH_PRIVATE_H */ diff --git a/src/cairo-stroke-dash.c b/src/cairo-stroke-dash.c new file mode 100644 index 000000000..9494010f5 --- /dev/null +++ b/src/cairo-stroke-dash.c @@ -0,0 +1,96 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-stroke-dash-private.h" + +void +_cairo_stroker_dash_start (cairo_stroker_dash_t *dash) +{ + double offset; + cairo_bool_t on = TRUE; + unsigned int i = 0; + + if (! dash->dashed) + return; + + offset = dash->dash_offset; + + /* We stop searching for a starting point as soon as the + offset reaches zero. Otherwise when an initial dash + segment shrinks to zero it will be skipped over. */ + while (offset > 0.0 && offset >= dash->dashes[i]) { + offset -= dash->dashes[i]; + on = !on; + if (++i == dash->num_dashes) + i = 0; + } + + dash->dash_index = i; + dash->dash_on = dash->dash_starts_on = on; + dash->dash_remain = dash->dashes[i] - offset; +} + +void +_cairo_stroker_dash_step (cairo_stroker_dash_t *dash, double step) +{ + dash->dash_remain -= step; + if (dash->dash_remain < CAIRO_FIXED_ERROR_DOUBLE) { + if (++dash->dash_index == dash->num_dashes) + dash->dash_index = 0; + + dash->dash_on = ! dash->dash_on; + dash->dash_remain += dash->dashes[dash->dash_index]; + } +} + +void +_cairo_stroker_dash_init (cairo_stroker_dash_t *dash, + const cairo_stroke_style_t *style) +{ + dash->dashed = style->dash != NULL; + if (! dash->dashed) + return; + + dash->dashes = style->dash; + dash->num_dashes = style->num_dashes; + dash->dash_offset = style->dash_offset; + + _cairo_stroker_dash_start (dash); +} diff --git a/src/cairo-stroke-style.c b/src/cairo-stroke-style.c new file mode 100644 index 000000000..51c9414c0 --- /dev/null +++ b/src/cairo-stroke-style.c @@ -0,0 +1,354 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +void +_cairo_stroke_style_init (cairo_stroke_style_t *style) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (style, sizeof (cairo_stroke_style_t))); + + style->line_width = CAIRO_GSTATE_LINE_WIDTH_DEFAULT; + style->line_cap = CAIRO_GSTATE_LINE_CAP_DEFAULT; + style->line_join = CAIRO_GSTATE_LINE_JOIN_DEFAULT; + style->miter_limit = CAIRO_GSTATE_MITER_LIMIT_DEFAULT; + + style->dash = NULL; + style->num_dashes = 0; + style->dash_offset = 0.0; +} + +cairo_status_t +_cairo_stroke_style_init_copy (cairo_stroke_style_t *style, + const cairo_stroke_style_t *other) +{ + if (CAIRO_INJECT_FAULT ()) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + VG (VALGRIND_MAKE_MEM_UNDEFINED (style, sizeof (cairo_stroke_style_t))); + + style->line_width = other->line_width; + style->line_cap = other->line_cap; + style->line_join = other->line_join; + style->miter_limit = other->miter_limit; + + style->num_dashes = other->num_dashes; + + if (other->dash == NULL) { + style->dash = NULL; + } else { + style->dash = _cairo_malloc_ab (style->num_dashes, sizeof (double)); + if (unlikely (style->dash == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (style->dash, other->dash, + style->num_dashes * sizeof (double)); + } + + style->dash_offset = other->dash_offset; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_stroke_style_fini (cairo_stroke_style_t *style) +{ + free (style->dash); + style->dash = NULL; + + style->num_dashes = 0; + + VG (VALGRIND_MAKE_MEM_NOACCESS (style, sizeof (cairo_stroke_style_t))); +} + +/* + * For a stroke in the given style, compute the maximum distance + * from the path that vertices could be generated. In the case + * of rotation in the ctm, the distance will not be exact. + */ +void +_cairo_stroke_style_max_distance_from_path (const cairo_stroke_style_t *style, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm, + double *dx, double *dy) +{ + double style_expansion = 0.5; + + if (style->line_cap == CAIRO_LINE_CAP_SQUARE) + style_expansion = M_SQRT1_2; + + if (style->line_join == CAIRO_LINE_JOIN_MITER && + ! path->stroke_is_rectilinear && + style_expansion < M_SQRT2 * style->miter_limit) + { + style_expansion = M_SQRT2 * style->miter_limit; + } + + style_expansion *= style->line_width; + + if (_cairo_matrix_has_unity_scale (ctm)) { + *dx = *dy = style_expansion; + } else { + *dx = style_expansion * hypot (ctm->xx, ctm->xy); + *dy = style_expansion * hypot (ctm->yy, ctm->yx); + } +} + +void +_cairo_stroke_style_max_line_distance_from_path (const cairo_stroke_style_t *style, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm, + double *dx, double *dy) +{ + double style_expansion = 0.5 * style->line_width; + if (_cairo_matrix_has_unity_scale (ctm)) { + *dx = *dy = style_expansion; + } else { + *dx = style_expansion * hypot (ctm->xx, ctm->xy); + *dy = style_expansion * hypot (ctm->yy, ctm->yx); + } +} + +void +_cairo_stroke_style_max_join_distance_from_path (const cairo_stroke_style_t *style, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm, + double *dx, double *dy) +{ + double style_expansion = 0.5; + + if (style->line_join == CAIRO_LINE_JOIN_MITER && + ! path->stroke_is_rectilinear && + style_expansion < M_SQRT2 * style->miter_limit) + { + style_expansion = M_SQRT2 * style->miter_limit; + } + + style_expansion *= style->line_width; + + if (_cairo_matrix_has_unity_scale (ctm)) { + *dx = *dy = style_expansion; + } else { + *dx = style_expansion * hypot (ctm->xx, ctm->xy); + *dy = style_expansion * hypot (ctm->yy, ctm->yx); + } +} +/* + * Computes the period of a dashed stroke style. + * Returns 0 for non-dashed styles. + */ +double +_cairo_stroke_style_dash_period (const cairo_stroke_style_t *style) +{ + double period; + unsigned int i; + + period = 0.0; + for (i = 0; i < style->num_dashes; i++) + period += style->dash[i]; + + if (style->num_dashes & 1) + period *= 2.0; + + return period; +} + +/* + * Coefficient of the linear approximation (minimizing square difference) + * of the surface covered by round caps + * + * This can be computed in the following way: + * the area inside the circle with radius w/2 and the region -d/2 <= x <= d/2 is: + * f(w,d) = 2 * integrate (sqrt (w*w/4 - x*x), x, -d/2, d/2) + * The square difference to a generic linear approximation (c*d) in the range (0,w) would be: + * integrate ((f(w,d) - c*d)^2, d, 0, w) + * To minimize this difference it is sufficient to find a solution of the differential with + * respect to c: + * solve ( diff (integrate ((f(w,d) - c*d)^2, d, 0, w), c), c) + * Which leads to c = 9/32*pi*w + * Since we're not interested in the true area, but just in a coverage extimate, + * we always divide the real area by the line width (w). + * The same computation for square caps would be + * f(w,d) = 2 * integrate(w/2, x, -d/2, d/2) + * c = 1*w + * but in this case it would not be an approximation, since f is already linear in d. + */ +#define ROUND_MINSQ_APPROXIMATION (9*M_PI/32) + +/* + * Computes the length of the "on" part of a dashed stroke style, + * taking into account also line caps. + * Returns 0 for non-dashed styles. + */ +double +_cairo_stroke_style_dash_stroked (const cairo_stroke_style_t *style) +{ + double stroked, cap_scale; + unsigned int i; + + switch (style->line_cap) { + default: ASSERT_NOT_REACHED; + case CAIRO_LINE_CAP_BUTT: cap_scale = 0.0; break; + case CAIRO_LINE_CAP_ROUND: cap_scale = ROUND_MINSQ_APPROXIMATION; break; + case CAIRO_LINE_CAP_SQUARE: cap_scale = 1.0; break; + } + + stroked = 0.0; + if (style->num_dashes & 1) { + /* Each dash element is used both as on and as off. The order in which they are summed is + * irrelevant, so sum the coverage of one dash element, taken both on and off at each iteration */ + for (i = 0; i < style->num_dashes; i++) + stroked += style->dash[i] + cap_scale * MIN (style->dash[i], style->line_width); + } else { + /* Even (0, 2, ...) dashes are on and simply counted for the coverage, odd dashes are off, thus + * their coverage is approximated based on the area covered by the caps of adjacent on dases. */ + for (i = 0; i + 1 < style->num_dashes; i += 2) + stroked += style->dash[i] + cap_scale * MIN (style->dash[i+1], style->line_width); + } + + return stroked; +} + +/* + * Verifies if _cairo_stroke_style_dash_approximate should be used to generate + * an approximation of the dash pattern in the specified style, when used for + * stroking a path with the given CTM and tolerance. + * Always %FALSE for non-dashed styles. + */ +cairo_bool_t +_cairo_stroke_style_dash_can_approximate (const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + double tolerance) +{ + double period; + + if (! style->num_dashes) + return FALSE; + + period = _cairo_stroke_style_dash_period (style); + return _cairo_matrix_transformed_circle_major_axis (ctm, period) < tolerance; +} + +/* + * Create a 2-dashes approximation of a dashed style, by making the "on" and "off" + * parts respect the original ratio. + */ +void +_cairo_stroke_style_dash_approximate (const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + double tolerance, + double *dash_offset, + double *dashes, + unsigned int *num_dashes) +{ + double coverage, scale, offset; + cairo_bool_t on = TRUE; + unsigned int i = 0; + + coverage = _cairo_stroke_style_dash_stroked (style) / _cairo_stroke_style_dash_period (style); + coverage = MIN (coverage, 1.0); + scale = tolerance / _cairo_matrix_transformed_circle_major_axis (ctm, 1.0); + + /* We stop searching for a starting point as soon as the + * offset reaches zero. Otherwise when an initial dash + * segment shrinks to zero it will be skipped over. */ + offset = style->dash_offset; + while (offset > 0.0 && offset >= style->dash[i]) { + offset -= style->dash[i]; + on = !on; + if (++i == style->num_dashes) + i = 0; + } + + *num_dashes = 2; + + /* + * We want to create a new dash pattern with the same relative coverage, + * but composed of just 2 elements with total length equal to scale. + * Based on the formula in _cairo_stroke_style_dash_stroked: + * scale * coverage = dashes[0] + cap_scale * MIN (dashes[1], line_width) + * = MIN (dashes[0] + cap_scale * (scale - dashes[0]), + * dashes[0] + cap_scale * line_width) = + * = MIN (dashes[0] * (1 - cap_scale) + cap_scale * scale, + * dashes[0] + cap_scale * line_width) + * + * Solving both cases we get: + * dashes[0] = scale * (coverage - cap_scale) / (1 - cap_scale) + * when scale - dashes[0] <= line_width + * dashes[0] = scale * coverage - cap_scale * line_width + * when scale - dashes[0] > line_width. + * + * Comparing the two cases we get: + * second > first + * second > scale * (coverage - cap_scale) / (1 - cap_scale) + * second - cap_scale * second - scale * coverage + scale * cap_scale > 0 + * (scale * coverage - cap_scale * line_width) - cap_scale * second - scale * coverage + scale * cap_scale > 0 + * - line_width - second + scale > 0 + * scale - second > line_width + * which is the condition for the second solution to be the valid one. + * So when second > first, the second solution is the correct one (i.e. + * the solution is always MAX (first, second). + */ + switch (style->line_cap) { + default: + ASSERT_NOT_REACHED; + dashes[0] = 0.0; + break; + + case CAIRO_LINE_CAP_BUTT: + /* Simplified formula (substituting 0 for cap_scale): */ + dashes[0] = scale * coverage; + break; + + case CAIRO_LINE_CAP_ROUND: + dashes[0] = MAX(scale * (coverage - ROUND_MINSQ_APPROXIMATION) / (1.0 - ROUND_MINSQ_APPROXIMATION), + scale * coverage - ROUND_MINSQ_APPROXIMATION * style->line_width); + break; + + case CAIRO_LINE_CAP_SQUARE: + /* + * Special attention is needed to handle the case cap_scale == 1 (since the first solution + * is either indeterminate or -inf in this case). Since dash lengths are always >=0, using + * 0 as first solution always leads to the correct solution. + */ + dashes[0] = MAX(0.0, scale * coverage - style->line_width); + break; + } + + dashes[1] = scale - dashes[0]; + + *dash_offset = on ? 0.0 : dashes[0]; +} diff --git a/src/cairo-surface-backend-private.h b/src/cairo-surface-backend-private.h new file mode 100644 index 000000000..955a79ff5 --- /dev/null +++ b/src/cairo-surface-backend-private.h @@ -0,0 +1,221 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SURFACE_BACKEND_PRIVATE_H +#define CAIRO_SURFACE_BACKEND_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" + +CAIRO_BEGIN_DECLS + +struct _cairo_surface_backend { + cairo_surface_type_t type; + + cairo_warn cairo_status_t + (*finish) (void *surface); + + cairo_t * + (*create_context) (void *surface); + + cairo_surface_t * + (*create_similar) (void *surface, + cairo_content_t content, + int width, + int height); + cairo_surface_t * + (*create_similar_image) (void *surface, + cairo_format_t format, + int width, + int height); + + cairo_image_surface_t * + (*map_to_image) (void *surface, + const cairo_rectangle_int_t *extents); + cairo_int_status_t + (*unmap_image) (void *surface, + cairo_image_surface_t *image); + + cairo_surface_t * + (*source) (void *abstract_surface, + cairo_rectangle_int_t *extents); + + cairo_warn cairo_status_t + (*acquire_source_image) (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra); + + cairo_warn void + (*release_source_image) (void *abstract_surface, + cairo_image_surface_t *image_out, + void *image_extra); + + cairo_surface_t * + (*snapshot) (void *surface); + + cairo_warn cairo_int_status_t + (*copy_page) (void *surface); + + cairo_warn cairo_int_status_t + (*show_page) (void *surface); + + /* Get the extents of the current surface. For many surface types + * this will be as simple as { x=0, y=0, width=surface->width, + * height=surface->height}. + * + * If this function is not implemented, or if it returns + * FALSE the surface is considered to be + * boundless and infinite bounds are used for it. + */ + cairo_bool_t + (*get_extents) (void *surface, + cairo_rectangle_int_t *extents); + + void + (*get_font_options) (void *surface, + cairo_font_options_t *options); + + cairo_warn cairo_status_t + (*flush) (void *surface, + unsigned flags); + + cairo_warn cairo_status_t + (*mark_dirty_rectangle) (void *surface, + int x, + int y, + int width, + int height); + + cairo_warn cairo_int_status_t + (*paint) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + + cairo_warn cairo_int_status_t + (*mask) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + + cairo_warn cairo_int_status_t + (*stroke) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + + cairo_warn cairo_int_status_t + (*fill) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + + cairo_warn cairo_int_status_t + (*fill_stroke) (void *surface, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + const cairo_path_fixed_t*path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip); + + cairo_warn cairo_int_status_t + (*show_glyphs) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + + cairo_bool_t + (*has_show_text_glyphs) (void *surface); + + cairo_warn cairo_int_status_t + (*show_text_glyphs) (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + + const char ** + (*get_supported_mime_types) (void *surface); +}; + +cairo_private cairo_status_t +_cairo_surface_default_acquire_source_image (void *surface, + cairo_image_surface_t **image_out, + void **image_extra); + +cairo_private void +_cairo_surface_default_release_source_image (void *surface, + cairo_image_surface_t *image, + void *image_extra); + +cairo_private cairo_surface_t * +_cairo_surface_default_source (void *surface, + cairo_rectangle_int_t *extents); + +CAIRO_END_DECLS + +#endif /* CAIRO_SURFACE_BACKEND_PRIVATE_H */ diff --git a/src/cairo-surface-clipper-private.h b/src/cairo-surface-clipper-private.h new file mode 100644 index 000000000..e5b00af7c --- /dev/null +++ b/src/cairo-surface-clipper-private.h @@ -0,0 +1,71 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_CLIPPER_PRIVATE_H +#define CAIRO_SURFACE_CLIPPER_PRIVATE_H + +#include "cairo-types-private.h" +#include "cairo-clip-private.h" + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_surface_clipper cairo_surface_clipper_t; + +typedef cairo_status_t +(*cairo_surface_clipper_intersect_clip_path_func_t) (cairo_surface_clipper_t *, + cairo_path_fixed_t *, + cairo_fill_rule_t, + double, + cairo_antialias_t); +struct _cairo_surface_clipper { + cairo_clip_t *clip; + cairo_surface_clipper_intersect_clip_path_func_t intersect_clip_path; +}; + +cairo_private cairo_status_t +_cairo_surface_clipper_set_clip (cairo_surface_clipper_t *clipper, + const cairo_clip_t *clip); + +cairo_private void +_cairo_surface_clipper_init (cairo_surface_clipper_t *clipper, + cairo_surface_clipper_intersect_clip_path_func_t intersect); + +cairo_private void +_cairo_surface_clipper_reset (cairo_surface_clipper_t *clipper); + +CAIRO_END_DECLS + +#endif /* CAIRO_SURFACE_CLIPPER_PRIVATE_H */ diff --git a/src/cairo-surface-clipper.c b/src/cairo-surface-clipper.c new file mode 100644 index 000000000..5309362c6 --- /dev/null +++ b/src/cairo-surface-clipper.c @@ -0,0 +1,196 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-surface-clipper-private.h" + +/* A collection of routines to facilitate vector surface clipping */ + +/* XXX Eliminate repeated paths and nested clips */ + +static cairo_status_t +_cairo_path_fixed_add_box (cairo_path_fixed_t *path, + const cairo_box_t *box) +{ + cairo_status_t status; + + status = _cairo_path_fixed_move_to (path, box->p1.x, box->p1.y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x, box->p1.y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p2.x, box->p2.y); + if (unlikely (status)) + return status; + + status = _cairo_path_fixed_line_to (path, box->p1.x, box->p2.y); + if (unlikely (status)) + return status; + + return _cairo_path_fixed_close_path (path); +} + +static cairo_status_t +_cairo_surface_clipper_intersect_clip_boxes (cairo_surface_clipper_t *clipper, + const cairo_clip_t *clip) +{ + cairo_path_fixed_t path; + cairo_status_t status; + int i; + + if (clip->num_boxes == 0) + return CAIRO_STATUS_SUCCESS; + + /* Reconstruct the path for the clip boxes. + * XXX maybe a new clipper callback? + */ + + _cairo_path_fixed_init (&path); + for (i = 0; i < clip->num_boxes; i++) { + status = _cairo_path_fixed_add_box (&path, &clip->boxes[i]); + if (unlikely (status)) { + _cairo_path_fixed_fini (&path); + return status; + } + } + + status = clipper->intersect_clip_path (clipper, &path, + CAIRO_FILL_RULE_WINDING, + 0., + CAIRO_ANTIALIAS_DEFAULT); + _cairo_path_fixed_fini (&path); + + return status; +} + +static cairo_status_t +_cairo_surface_clipper_intersect_clip_path_recursive (cairo_surface_clipper_t *clipper, + cairo_clip_path_t *clip_path, + cairo_clip_path_t *end) +{ + cairo_status_t status; + + if (clip_path->prev != end) { + status = + _cairo_surface_clipper_intersect_clip_path_recursive (clipper, + clip_path->prev, + end); + if (unlikely (status)) + return status; + } + + return clipper->intersect_clip_path (clipper, + &clip_path->path, + clip_path->fill_rule, + clip_path->tolerance, + clip_path->antialias); +} + +cairo_status_t +_cairo_surface_clipper_set_clip (cairo_surface_clipper_t *clipper, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_bool_t incremental = FALSE; + + if (_cairo_clip_equal (clip, clipper->clip)) + return CAIRO_STATUS_SUCCESS; + + /* all clipped out state should never propagate this far */ + assert (!_cairo_clip_is_all_clipped (clip)); + + /* XXX Is this an incremental clip? */ + if (clipper->clip && clip && + clip->num_boxes == clipper->clip->num_boxes && + memcmp (clip->boxes, clipper->clip->boxes, + sizeof (cairo_box_t) * clip->num_boxes) == 0) + { + cairo_clip_path_t *clip_path = clip->path; + while (clip_path != NULL && clip_path != clipper->clip->path) + clip_path = clip_path->prev; + + if (clip_path) { + incremental = TRUE; + status = _cairo_surface_clipper_intersect_clip_path_recursive (clipper, + clip->path, + clipper->clip->path); + } + } + + _cairo_clip_destroy (clipper->clip); + clipper->clip = _cairo_clip_copy (clip); + + if (incremental) + return status; + + status = clipper->intersect_clip_path (clipper, NULL, 0, 0, 0); + if (unlikely (status)) + return status; + + if (clip == NULL) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_clipper_intersect_clip_boxes (clipper, clip); + if (unlikely (status)) + return status; + + if (clip->path != NULL) { + status = _cairo_surface_clipper_intersect_clip_path_recursive (clipper, + clip->path, + NULL); + } + + return status; +} + +void +_cairo_surface_clipper_init (cairo_surface_clipper_t *clipper, + cairo_surface_clipper_intersect_clip_path_func_t func) +{ + clipper->clip = NULL; + clipper->intersect_clip_path = func; +} + +void +_cairo_surface_clipper_reset (cairo_surface_clipper_t *clipper) +{ + _cairo_clip_destroy (clipper->clip); + clipper->clip = NULL; +} diff --git a/src/cairo-surface-fallback-private.h b/src/cairo-surface-fallback-private.h new file mode 100644 index 000000000..ecf7b0edf --- /dev/null +++ b/src/cairo-surface-fallback-private.h @@ -0,0 +1,95 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_FALLBACK_PRIVATE_H +#define CAIRO_SURFACE_FALLBACK_PRIVATE_H + +#include "cairoint.h" + +CAIRO_BEGIN_DECLS + +cairo_private cairo_int_status_t +_cairo_surface_fallback_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_surface_fallback_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_surface_fallback_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t*style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_surface_fallback_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_int_status_t +_cairo_surface_fallback_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + +CAIRO_END_DECLS + +#endif /* CAIRO_SURFACE_FALLBACK_PRIVATE_H */ diff --git a/src/cairo-surface-fallback.c b/src/cairo-surface-fallback.c new file mode 100644 index 000000000..a0af15969 --- /dev/null +++ b/src/cairo-surface-fallback.c @@ -0,0 +1,115 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-compositor-private.h" +#include "cairo-surface-fallback-private.h" + +cairo_int_status_t +_cairo_surface_fallback_paint (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + return _cairo_compositor_paint (&_cairo_fallback_compositor, + surface, op, source, clip); +} + +cairo_int_status_t +_cairo_surface_fallback_mask (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + return _cairo_compositor_mask (&_cairo_fallback_compositor, + surface, op, source, mask, clip); +} + +cairo_int_status_t +_cairo_surface_fallback_stroke (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + const cairo_stroke_style_t*style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + return _cairo_compositor_stroke (&_cairo_fallback_compositor, + surface, op, source, path, + style, ctm,ctm_inverse, + tolerance, antialias, clip); +} + +cairo_int_status_t +_cairo_surface_fallback_fill (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + return _cairo_compositor_fill (&_cairo_fallback_compositor, + surface, op, source, path, + fill_rule, tolerance, antialias, + clip); +} + +cairo_int_status_t +_cairo_surface_fallback_glyphs (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + return _cairo_compositor_glyphs (&_cairo_fallback_compositor, + surface, op, source, + glyphs, num_glyphs, scaled_font, + clip); +} diff --git a/src/cairo-surface-inline.h b/src/cairo-surface-inline.h new file mode 100644 index 000000000..85fbc9192 --- /dev/null +++ b/src/cairo-surface-inline.h @@ -0,0 +1,60 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SURFACE_INLINE_H +#define CAIRO_SURFACE_INLINE_H + +#include "cairo-surface-private.h" + +static inline cairo_status_t +__cairo_surface_flush (cairo_surface_t *surface, unsigned flags) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + if (surface->backend->flush) + status = surface->backend->flush (surface, flags); + return status; +} + +static inline cairo_surface_t * +_cairo_surface_reference (cairo_surface_t *surface) +{ + if (!CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + _cairo_reference_count_inc (&surface->ref_count); + return surface; +} + +#endif /* CAIRO_SURFACE_INLINE_H */ diff --git a/src/cairo-surface-observer-inline.h b/src/cairo-surface-observer-inline.h new file mode 100644 index 000000000..07b94770d --- /dev/null +++ b/src/cairo-surface-observer-inline.h @@ -0,0 +1,59 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_OBSERVER_INLINE_H +#define CAIRO_SURFACE_OBSERVER_INLINE_H + +#include "cairo-surface-observer-private.h" + +static inline cairo_surface_t * +_cairo_surface_observer_get_target (cairo_surface_t *surface) +{ + return ((cairo_surface_observer_t *) surface)->target; +} + +static inline cairo_bool_t +_cairo_surface_is_observer (cairo_surface_t *surface) +{ + return surface->backend->type == (cairo_surface_type_t)CAIRO_INTERNAL_SURFACE_TYPE_OBSERVER; +} + +static inline cairo_bool_t +_cairo_device_is_observer (cairo_device_t *device) +{ + return device->backend->type == (cairo_device_type_t)CAIRO_INTERNAL_DEVICE_TYPE_OBSERVER; +} + +#endif /* CAIRO_SURFACE_OBSERVER_INLINE_H */ diff --git a/src/cairo-surface-observer-private.h b/src/cairo-surface-observer-private.h new file mode 100644 index 000000000..70c87db82 --- /dev/null +++ b/src/cairo-surface-observer-private.h @@ -0,0 +1,208 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_OBSERVER_PRIVATE_H +#define CAIRO_SURFACE_OBSERVER_PRIVATE_H + +#include "cairoint.h" + +#include "cairo-device-private.h" +#include "cairo-list-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-time-private.h" + +struct stat { + double min, max, sum, sum_sq; + unsigned count; +}; + +#define NUM_OPERATORS (CAIRO_OPERATOR_HSL_LUMINOSITY+1) +#define NUM_CAPS (CAIRO_LINE_CAP_SQUARE+1) +#define NUM_JOINS (CAIRO_LINE_JOIN_BEVEL+1) +#define NUM_ANTIALIAS (CAIRO_ANTIALIAS_BEST+1) +#define NUM_FILL_RULE (CAIRO_FILL_RULE_EVEN_ODD+1) + +struct extents { + struct stat area; + unsigned int bounded, unbounded; +}; + +struct pattern { + unsigned int type[7]; /* native/record/other surface/gradients */ +}; + +struct path { + unsigned int type[5]; /* empty/pixel/rectilinear/straight/curved */ +}; + +struct clip { + unsigned int type[6]; /* none, region, boxes, single path, polygon, general */ +}; + +typedef struct _cairo_observation cairo_observation_t; +typedef struct _cairo_observation_record cairo_observation_record_t; +typedef struct _cairo_device_observer cairo_device_observer_t; + +struct _cairo_observation_record { + cairo_content_t target_content; + int target_width; + int target_height; + + int index; + cairo_operator_t op; + int source; + int mask; + int num_glyphs; + int path; + int fill_rule; + double tolerance; + int antialias; + int clip; + cairo_time_t elapsed; +}; + +struct _cairo_observation { + int num_surfaces; + int num_contexts; + int num_sources_acquired; + + /* XXX put interesting stats here! */ + + struct paint { + cairo_time_t elapsed; + unsigned int count; + struct extents extents; + unsigned int operators[NUM_OPERATORS]; + struct pattern source; + struct clip clip; + unsigned int noop; + + cairo_observation_record_t slowest; + } paint; + + struct mask { + cairo_time_t elapsed; + unsigned int count; + struct extents extents; + unsigned int operators[NUM_OPERATORS]; + struct pattern source; + struct pattern mask; + struct clip clip; + unsigned int noop; + + cairo_observation_record_t slowest; + } mask; + + struct fill { + cairo_time_t elapsed; + unsigned int count; + struct extents extents; + unsigned int operators[NUM_OPERATORS]; + struct pattern source; + struct path path; + unsigned int antialias[NUM_ANTIALIAS]; + unsigned int fill_rule[NUM_FILL_RULE]; + struct clip clip; + unsigned int noop; + + cairo_observation_record_t slowest; + } fill; + + struct stroke { + cairo_time_t elapsed; + unsigned int count; + struct extents extents; + unsigned int operators[NUM_OPERATORS]; + unsigned int caps[NUM_CAPS]; + unsigned int joins[NUM_CAPS]; + unsigned int antialias[NUM_ANTIALIAS]; + struct pattern source; + struct path path; + struct stat line_width; + struct clip clip; + unsigned int noop; + + cairo_observation_record_t slowest; + } stroke; + + struct glyphs { + cairo_time_t elapsed; + unsigned int count; + struct extents extents; + unsigned int operators[NUM_OPERATORS]; + struct pattern source; + struct clip clip; + unsigned int noop; + + cairo_observation_record_t slowest; + } glyphs; + + cairo_array_t timings; + cairo_recording_surface_t *record; +}; + +struct _cairo_device_observer { + cairo_device_t base; + cairo_device_t *target; + + cairo_observation_t log; +}; + +struct callback_list { + cairo_list_t link; + + cairo_surface_observer_callback_t func; + void *data; +}; + +struct _cairo_surface_observer { + cairo_surface_t base; + cairo_surface_t *target; + + cairo_observation_t log; + + cairo_list_t paint_callbacks; + cairo_list_t mask_callbacks; + cairo_list_t fill_callbacks; + cairo_list_t stroke_callbacks; + cairo_list_t glyphs_callbacks; + + cairo_list_t flush_callbacks; + cairo_list_t finish_callbacks; +}; + +#endif /* CAIRO_SURFACE_OBSERVER_PRIVATE_H */ diff --git a/src/cairo-surface-observer.c b/src/cairo-surface-observer.c new file mode 100644 index 000000000..52b013644 --- /dev/null +++ b/src/cairo-surface-observer.c @@ -0,0 +1,2106 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-surface-observer-private.h" +#include "cairo-surface-observer-inline.h" + +#include "cairo-array-private.h" +#include "cairo-combsort-inline.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-pattern-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-subsurface-inline.h" +#include "cairo-reference-count-private.h" + +#if CAIRO_HAS_SCRIPT_SURFACE +#include "cairo-script-private.h" +#endif + +static const cairo_surface_backend_t _cairo_surface_observer_backend; + +/* observation/stats */ + +static void init_stats (struct stat *s) +{ + s->min = HUGE_VAL; + s->max = -HUGE_VAL; +} + +static void init_extents (struct extents *e) +{ + init_stats (&e->area); +} + +static void init_pattern (struct pattern *p) +{ +} + +static void init_path (struct path *p) +{ +} + +static void init_clip (struct clip *c) +{ +} + +static void init_paint (struct paint *p) +{ + init_extents (&p->extents); + init_pattern (&p->source); + init_clip (&p->clip); +} + +static void init_mask (struct mask *m) +{ + init_extents (&m->extents); + init_pattern (&m->source); + init_pattern (&m->mask); + init_clip (&m->clip); +} + +static void init_fill (struct fill *f) +{ + init_extents (&f->extents); + init_pattern (&f->source); + init_path (&f->path); + init_clip (&f->clip); +} + +static void init_stroke (struct stroke *s) +{ + init_extents (&s->extents); + init_pattern (&s->source); + init_path (&s->path); + init_clip (&s->clip); +} + +static void init_glyphs (struct glyphs *g) +{ + init_extents (&g->extents); + init_pattern (&g->source); + init_clip (&g->clip); +} + +static cairo_status_t +log_init (cairo_observation_t *log, + cairo_bool_t record) +{ + memset (log, 0, sizeof(*log)); + + init_paint (&log->paint); + init_mask (&log->mask); + init_fill (&log->fill); + init_stroke (&log->stroke); + init_glyphs (&log->glyphs); + + _cairo_array_init (&log->timings, sizeof (cairo_observation_record_t)); + + if (record) { + log->record = (cairo_recording_surface_t *) + cairo_recording_surface_create (CAIRO_CONTENT_COLOR_ALPHA, NULL); + if (unlikely (log->record->base.status)) + return log->record->base.status; + + log->record->optimize_clears = FALSE; + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +log_fini (cairo_observation_t *log) +{ + _cairo_array_fini (&log->timings); + cairo_surface_destroy (&log->record->base); +} + +static cairo_surface_t* +get_pattern_surface (const cairo_pattern_t *pattern) +{ + return ((cairo_surface_pattern_t *)pattern)->surface; +} + +static int +classify_pattern (const cairo_pattern_t *pattern, + const cairo_surface_t *target) +{ + int classify; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SURFACE: + if (get_pattern_surface (pattern)->type == target->type) + classify = 0; + else if (get_pattern_surface (pattern)->type == CAIRO_SURFACE_TYPE_RECORDING) + classify = 1; + else + classify = 2; + break; + default: + case CAIRO_PATTERN_TYPE_SOLID: + classify = 3; + break; + case CAIRO_PATTERN_TYPE_LINEAR: + classify = 4; + break; + case CAIRO_PATTERN_TYPE_RADIAL: + classify = 5; + break; + case CAIRO_PATTERN_TYPE_MESH: + classify = 6; + break; + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + classify = 7; + break; + } + return classify; +} + +static void +add_pattern (struct pattern *stats, + const cairo_pattern_t *pattern, + const cairo_surface_t *target) +{ + stats->type[classify_pattern(pattern, target)]++; +} + +static int +classify_path (const cairo_path_fixed_t *path, + cairo_bool_t is_fill) +{ + int classify; + + /* XXX improve for stroke */ + classify = -1; + if (is_fill) { + if (path->fill_is_empty) + classify = 0; + else if (_cairo_path_fixed_fill_is_rectilinear (path)) + classify = path->fill_maybe_region ? 1 : 2; + } else { + if (_cairo_path_fixed_stroke_is_rectilinear (path)) + classify = 2; + } + if (classify == -1) + classify = 3 + (path->has_curve_to != 0); + + return classify; +} + +static void +add_path (struct path *stats, + const cairo_path_fixed_t *path, + cairo_bool_t is_fill) +{ + stats->type[classify_path(path, is_fill)]++; +} + +static int +classify_clip (const cairo_clip_t *clip) +{ + int classify; + + if (clip == NULL) + classify = 0; + else if (_cairo_clip_is_region (clip)) + classify = 1; + else if (clip->path == NULL) + classify = 2; + else if (clip->path->prev == NULL) + classify = 3; + else if (_cairo_clip_is_polygon (clip)) + classify = 4; + else + classify = 5; + + return classify; +} + +static void +add_clip (struct clip *stats, + const cairo_clip_t *clip) +{ + stats->type[classify_clip (clip)]++; +} + +static void +stats_add (struct stat *s, double v) +{ + if (v < s->min) + s->min = v; + if (v > s->max) + s->max = v; + s->sum += v; + s->sum_sq += v*v; + s->count++; +} + +static void +add_extents (struct extents *stats, + const cairo_composite_rectangles_t *extents) +{ + const cairo_rectangle_int_t *r = extents->is_bounded ? &extents->bounded :&extents->unbounded; + stats_add (&stats->area, r->width * r->height); + stats->bounded += extents->is_bounded != 0; + stats->unbounded += extents->is_bounded == 0; +} + +/* device interface */ + +static void +_cairo_device_observer_lock (void *_device) +{ + cairo_device_observer_t *device = (cairo_device_observer_t *) _device; + cairo_status_t ignored; + + /* cairo_device_acquire() can fail for nil and finished + * devices. We don't care about observing them. */ + ignored = cairo_device_acquire (device->target); +} + +static void +_cairo_device_observer_unlock (void *_device) +{ + cairo_device_observer_t *device = (cairo_device_observer_t *) _device; + cairo_device_release (device->target); +} + +static cairo_status_t +_cairo_device_observer_flush (void *_device) +{ + cairo_device_observer_t *device = (cairo_device_observer_t *) _device; + + if (device->target == NULL) + return CAIRO_STATUS_SUCCESS; + + cairo_device_flush (device->target); + return device->target->status; +} + +static void +_cairo_device_observer_finish (void *_device) +{ + cairo_device_observer_t *device = (cairo_device_observer_t *) _device; + log_fini (&device->log); + cairo_device_finish (device->target); +} + +static void +_cairo_device_observer_destroy (void *_device) +{ + cairo_device_observer_t *device = (cairo_device_observer_t *) _device; + cairo_device_destroy (device->target); + free (device); +} + +static const cairo_device_backend_t _cairo_device_observer_backend = { + CAIRO_INTERNAL_DEVICE_TYPE_OBSERVER, + + _cairo_device_observer_lock, + _cairo_device_observer_unlock, + + _cairo_device_observer_flush, + _cairo_device_observer_finish, + _cairo_device_observer_destroy, +}; + +static cairo_device_t * +_cairo_device_create_observer_internal (cairo_device_t *target, + cairo_bool_t record) +{ + cairo_device_observer_t *device; + cairo_status_t status; + + device = malloc (sizeof (cairo_device_observer_t)); + if (unlikely (device == NULL)) + return _cairo_device_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_device_init (&device->base, &_cairo_device_observer_backend); + status = log_init (&device->log, record); + if (unlikely (status)) { + free (device); + return _cairo_device_create_in_error (status); + } + + device->target = cairo_device_reference (target); + + return &device->base; +} + +/* surface interface */ + +static cairo_device_observer_t * +to_device (cairo_surface_observer_t *suface) +{ + return (cairo_device_observer_t *)suface->base.device; +} + +static cairo_surface_t * +_cairo_surface_create_observer_internal (cairo_device_t *device, + cairo_surface_t *target) +{ + cairo_surface_observer_t *surface; + cairo_status_t status; + + surface = malloc (sizeof (cairo_surface_observer_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_surface_observer_backend, device, + target->content); + + status = log_init (&surface->log, + ((cairo_device_observer_t *)device)->log.record != NULL); + if (unlikely (status)) { + free (surface); + return _cairo_surface_create_in_error (status); + } + + surface->target = cairo_surface_reference (target); + surface->base.type = surface->target->type; + surface->base.is_clear = surface->target->is_clear; + + cairo_list_init (&surface->paint_callbacks); + cairo_list_init (&surface->mask_callbacks); + cairo_list_init (&surface->fill_callbacks); + cairo_list_init (&surface->stroke_callbacks); + cairo_list_init (&surface->glyphs_callbacks); + + cairo_list_init (&surface->flush_callbacks); + cairo_list_init (&surface->finish_callbacks); + + surface->log.num_surfaces++; + to_device (surface)->log.num_surfaces++; + + return &surface->base; +} + +static inline void +do_callbacks (cairo_surface_observer_t *surface, cairo_list_t *head) +{ + struct callback_list *cb; + + cairo_list_foreach_entry (cb, struct callback_list, head, link) + cb->func (&surface->base, surface->target, cb->data); +} + + +static cairo_status_t +_cairo_surface_observer_finish (void *abstract_surface) +{ + cairo_surface_observer_t *surface = abstract_surface; + + do_callbacks (surface, &surface->finish_callbacks); + + cairo_surface_destroy (surface->target); + log_fini (&surface->log); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_surface_observer_create_similar (void *abstract_other, + cairo_content_t content, + int width, int height) +{ + cairo_surface_observer_t *other = abstract_other; + cairo_surface_t *target, *surface; + + target = NULL; + if (other->target->backend->create_similar) + target = other->target->backend->create_similar (other->target, content, + width, height); + if (target == NULL) + target = _cairo_image_surface_create_with_content (content, + width, height); + + surface = _cairo_surface_create_observer_internal (other->base.device, + target); + cairo_surface_destroy (target); + + return surface; +} + +static cairo_surface_t * +_cairo_surface_observer_create_similar_image (void *other, + cairo_format_t format, + int width, int height) +{ + cairo_surface_observer_t *surface = other; + + if (surface->target->backend->create_similar_image) + return surface->target->backend->create_similar_image (surface->target, + format, + width, height); + + return NULL; +} + +static cairo_image_surface_t * +_cairo_surface_observer_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_observer_t *surface = abstract_surface; + return _cairo_surface_map_to_image (surface->target, extents); +} + +static cairo_int_status_t +_cairo_surface_observer_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_surface_observer_t *surface = abstract_surface; + return _cairo_surface_unmap_image (surface->target, image); +} + +static void +record_target (cairo_observation_record_t *r, + cairo_surface_t *target) +{ + cairo_rectangle_int_t extents; + + r->target_content = target->content; + if (_cairo_surface_get_extents (target, &extents)) { + r->target_width = extents.width; + r->target_height = extents.height; + } else { + r->target_width = -1; + r->target_height = -1; + } +} + +static cairo_observation_record_t * +record_paint (cairo_observation_record_t *r, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + record_target (r, target); + + r->op = op; + r->source = classify_pattern (source, target); + r->mask = -1; + r->num_glyphs = -1; + r->path = -1; + r->fill_rule = -1; + r->tolerance = -1; + r->antialias = -1; + r->clip = classify_clip (clip); + r->elapsed = elapsed; + + return r; +} + +static cairo_observation_record_t * +record_mask (cairo_observation_record_t *r, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + record_target (r, target); + + r->op = op; + r->source = classify_pattern (source, target); + r->mask = classify_pattern (mask, target); + r->num_glyphs = -1; + r->path = -1; + r->fill_rule = -1; + r->tolerance = -1; + r->antialias = -1; + r->clip = classify_clip (clip); + r->elapsed = elapsed; + + return r; +} + +static cairo_observation_record_t * +record_fill (cairo_observation_record_t *r, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + record_target (r, target); + + r->op = op; + r->source = classify_pattern (source, target); + r->mask = -1; + r->num_glyphs = -1; + r->path = classify_path (path, TRUE); + r->fill_rule = fill_rule; + r->tolerance = tolerance; + r->antialias = antialias; + r->clip = classify_clip (clip); + r->elapsed = elapsed; + + return r; +} + +static cairo_observation_record_t * +record_stroke (cairo_observation_record_t *r, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + record_target (r, target); + + r->op = op; + r->source = classify_pattern (source, target); + r->mask = -1; + r->num_glyphs = -1; + r->path = classify_path (path, FALSE); + r->fill_rule = -1; + r->tolerance = tolerance; + r->antialias = antialias; + r->clip = classify_clip (clip); + r->elapsed = elapsed; + + return r; +} + +static cairo_observation_record_t * +record_glyphs (cairo_observation_record_t *r, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + record_target (r, target); + + r->op = op; + r->source = classify_pattern (source, target); + r->mask = -1; + r->path = -1; + r->num_glyphs = num_glyphs; + r->fill_rule = -1; + r->tolerance = -1; + r->antialias = -1; + r->clip = classify_clip (clip); + r->elapsed = elapsed; + + return r; +} + +static void +add_record (cairo_observation_t *log, + cairo_observation_record_t *r) +{ + cairo_int_status_t status; + + r->index = log->record ? log->record->commands.num_elements : 0; + + status = _cairo_array_append (&log->timings, r); + assert (status == CAIRO_INT_STATUS_SUCCESS); +} + +static void +_cairo_surface_sync (cairo_surface_t *target, int x, int y) +{ + cairo_rectangle_int_t extents; + + extents.x = x; + extents.y = y; + extents.width = 1; + extents.height = 1; + + _cairo_surface_unmap_image (target, + _cairo_surface_map_to_image (target, + &extents)); +} + +static void +midpt (const cairo_composite_rectangles_t *extents, int *x, int *y) +{ + *x = extents->bounded.x + extents->bounded.width / 2; + *y = extents->bounded.y + extents->bounded.height / 2; +} + +static void +add_record_paint (cairo_observation_t *log, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + cairo_observation_record_t record; + cairo_int_status_t status; + + add_record (log, + record_paint (&record, target, op, source, clip, elapsed)); + + /* We have to bypass the high-level surface layer in case it tries to be + * too smart and discard operations; we need to record exactly what just + * happened on the target. + */ + if (log->record) { + status = log->record->base.backend->paint (&log->record->base, + op, source, clip); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + if (_cairo_time_gt (elapsed, log->paint.slowest.elapsed)) + log->paint.slowest = record; + log->paint.elapsed = _cairo_time_add (log->paint.elapsed, elapsed); +} + +static cairo_int_status_t +_cairo_surface_observer_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_device_observer_t *device = to_device (surface); + cairo_composite_rectangles_t composite; + cairo_int_status_t status; + cairo_time_t t; + int x, y; + + /* XXX device locking */ + + surface->log.paint.count++; + surface->log.paint.operators[op]++; + add_pattern (&surface->log.paint.source, source, surface->target); + add_clip (&surface->log.paint.clip, clip); + + device->log.paint.count++; + device->log.paint.operators[op]++; + add_pattern (&device->log.paint.source, source, surface->target); + add_clip (&device->log.paint.clip, clip); + + status = _cairo_composite_rectangles_init_for_paint (&composite, + surface->target, + op, source, + clip); + if (unlikely (status)) { + surface->log.paint.noop++; + device->log.paint.noop++; + return status; + } + + midpt (&composite, &x, &y); + + add_extents (&surface->log.paint.extents, &composite); + add_extents (&device->log.paint.extents, &composite); + _cairo_composite_rectangles_fini (&composite); + + t = _cairo_time_get (); + status = _cairo_surface_paint (surface->target, + op, source, + clip); + if (unlikely (status)) + return status; + + _cairo_surface_sync (surface->target, x, y); + t = _cairo_time_get_delta (t); + + add_record_paint (&surface->log, surface->target, op, source, clip, t); + add_record_paint (&device->log, surface->target, op, source, clip, t); + + do_callbacks (surface, &surface->paint_callbacks); + + return CAIRO_STATUS_SUCCESS; +} + +static void +add_record_mask (cairo_observation_t *log, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + cairo_observation_record_t record; + cairo_int_status_t status; + + add_record (log, + record_mask (&record, target, op, source, mask, clip, elapsed)); + + if (log->record) { + status = log->record->base.backend->mask (&log->record->base, + op, source, mask, clip); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + if (_cairo_time_gt (elapsed, log->mask.slowest.elapsed)) + log->mask.slowest = record; + log->mask.elapsed = _cairo_time_add (log->mask.elapsed, elapsed); +} + +static cairo_int_status_t +_cairo_surface_observer_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_device_observer_t *device = to_device (surface); + cairo_composite_rectangles_t composite; + cairo_int_status_t status; + cairo_time_t t; + int x, y; + + surface->log.mask.count++; + surface->log.mask.operators[op]++; + add_pattern (&surface->log.mask.source, source, surface->target); + add_pattern (&surface->log.mask.mask, mask, surface->target); + add_clip (&surface->log.mask.clip, clip); + + device->log.mask.count++; + device->log.mask.operators[op]++; + add_pattern (&device->log.mask.source, source, surface->target); + add_pattern (&device->log.mask.mask, mask, surface->target); + add_clip (&device->log.mask.clip, clip); + + status = _cairo_composite_rectangles_init_for_mask (&composite, + surface->target, + op, source, mask, + clip); + if (unlikely (status)) { + surface->log.mask.noop++; + device->log.mask.noop++; + return status; + } + + midpt (&composite, &x, &y); + + add_extents (&surface->log.mask.extents, &composite); + add_extents (&device->log.mask.extents, &composite); + _cairo_composite_rectangles_fini (&composite); + + t = _cairo_time_get (); + status = _cairo_surface_mask (surface->target, + op, source, mask, + clip); + if (unlikely (status)) + return status; + + _cairo_surface_sync (surface->target, x, y); + t = _cairo_time_get_delta (t); + + add_record_mask (&surface->log, + surface->target, op, source, mask, clip, + t); + add_record_mask (&device->log, + surface->target, op, source, mask, clip, + t); + + do_callbacks (surface, &surface->mask_callbacks); + + return CAIRO_STATUS_SUCCESS; +} + +static void +add_record_fill (cairo_observation_t *log, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + cairo_observation_record_t record; + cairo_int_status_t status; + + add_record (log, + record_fill (&record, + target, op, source, + path, fill_rule, tolerance, antialias, + clip, elapsed)); + + if (log->record) { + status = log->record->base.backend->fill (&log->record->base, + op, source, + path, fill_rule, + tolerance, antialias, + clip); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + if (_cairo_time_gt (elapsed, log->fill.slowest.elapsed)) + log->fill.slowest = record; + log->fill.elapsed = _cairo_time_add (log->fill.elapsed, elapsed); +} + +static cairo_int_status_t +_cairo_surface_observer_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_device_observer_t *device = to_device (surface); + cairo_composite_rectangles_t composite; + cairo_int_status_t status; + cairo_time_t t; + int x, y; + + surface->log.fill.count++; + surface->log.fill.operators[op]++; + surface->log.fill.fill_rule[fill_rule]++; + surface->log.fill.antialias[antialias]++; + add_pattern (&surface->log.fill.source, source, surface->target); + add_path (&surface->log.fill.path, path, TRUE); + add_clip (&surface->log.fill.clip, clip); + + device->log.fill.count++; + device->log.fill.operators[op]++; + device->log.fill.fill_rule[fill_rule]++; + device->log.fill.antialias[antialias]++; + add_pattern (&device->log.fill.source, source, surface->target); + add_path (&device->log.fill.path, path, TRUE); + add_clip (&device->log.fill.clip, clip); + + status = _cairo_composite_rectangles_init_for_fill (&composite, + surface->target, + op, source, path, + clip); + if (unlikely (status)) { + surface->log.fill.noop++; + device->log.fill.noop++; + return status; + } + + midpt (&composite, &x, &y); + + add_extents (&surface->log.fill.extents, &composite); + add_extents (&device->log.fill.extents, &composite); + _cairo_composite_rectangles_fini (&composite); + + t = _cairo_time_get (); + status = _cairo_surface_fill (surface->target, + op, source, path, + fill_rule, tolerance, antialias, + clip); + if (unlikely (status)) + return status; + + _cairo_surface_sync (surface->target, x, y); + t = _cairo_time_get_delta (t); + + add_record_fill (&surface->log, + surface->target, op, source, path, + fill_rule, tolerance, antialias, + clip, t); + + add_record_fill (&device->log, + surface->target, op, source, path, + fill_rule, tolerance, antialias, + clip, t); + + do_callbacks (surface, &surface->fill_callbacks); + + return CAIRO_STATUS_SUCCESS; +} + +static void +add_record_stroke (cairo_observation_t *log, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + cairo_observation_record_t record; + cairo_int_status_t status; + + add_record (log, + record_stroke (&record, + target, op, source, + path, style, ctm,ctm_inverse, + tolerance, antialias, + clip, elapsed)); + + if (log->record) { + status = log->record->base.backend->stroke (&log->record->base, + op, source, + path, style, ctm,ctm_inverse, + tolerance, antialias, + clip); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + if (_cairo_time_gt (elapsed, log->stroke.slowest.elapsed)) + log->stroke.slowest = record; + log->stroke.elapsed = _cairo_time_add (log->stroke.elapsed, elapsed); +} + +static cairo_int_status_t +_cairo_surface_observer_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_device_observer_t *device = to_device (surface); + cairo_composite_rectangles_t composite; + cairo_int_status_t status; + cairo_time_t t; + int x, y; + + surface->log.stroke.count++; + surface->log.stroke.operators[op]++; + surface->log.stroke.antialias[antialias]++; + surface->log.stroke.caps[style->line_cap]++; + surface->log.stroke.joins[style->line_join]++; + add_pattern (&surface->log.stroke.source, source, surface->target); + add_path (&surface->log.stroke.path, path, FALSE); + add_clip (&surface->log.stroke.clip, clip); + + device->log.stroke.count++; + device->log.stroke.operators[op]++; + device->log.stroke.antialias[antialias]++; + device->log.stroke.caps[style->line_cap]++; + device->log.stroke.joins[style->line_join]++; + add_pattern (&device->log.stroke.source, source, surface->target); + add_path (&device->log.stroke.path, path, FALSE); + add_clip (&device->log.stroke.clip, clip); + + status = _cairo_composite_rectangles_init_for_stroke (&composite, + surface->target, + op, source, + path, style, ctm, + clip); + if (unlikely (status)) { + surface->log.stroke.noop++; + device->log.stroke.noop++; + return status; + } + + midpt (&composite, &x, &y); + + add_extents (&surface->log.stroke.extents, &composite); + add_extents (&device->log.stroke.extents, &composite); + _cairo_composite_rectangles_fini (&composite); + + t = _cairo_time_get (); + status = _cairo_surface_stroke (surface->target, + op, source, path, + style, ctm, ctm_inverse, + tolerance, antialias, + clip); + if (unlikely (status)) + return status; + + _cairo_surface_sync (surface->target, x, y); + t = _cairo_time_get_delta (t); + + add_record_stroke (&surface->log, + surface->target, op, source, path, + style, ctm,ctm_inverse, + tolerance, antialias, + clip, t); + + add_record_stroke (&device->log, + surface->target, op, source, path, + style, ctm,ctm_inverse, + tolerance, antialias, + clip, t); + + do_callbacks (surface, &surface->stroke_callbacks); + + return CAIRO_STATUS_SUCCESS; +} + +static void +add_record_glyphs (cairo_observation_t *log, + cairo_surface_t *target, + cairo_operator_t op, + const cairo_pattern_t*source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip, + cairo_time_t elapsed) +{ + cairo_observation_record_t record; + cairo_int_status_t status; + + add_record (log, + record_glyphs (&record, + target, op, source, + glyphs, num_glyphs, scaled_font, + clip, elapsed)); + + if (log->record) { + status = log->record->base.backend->show_text_glyphs (&log->record->base, + op, source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, + clip); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + if (_cairo_time_gt (elapsed, log->glyphs.slowest.elapsed)) + log->glyphs.slowest = record; + log->glyphs.elapsed = _cairo_time_add (log->glyphs.elapsed, elapsed); +} + +static cairo_int_status_t +_cairo_surface_observer_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_device_observer_t *device = to_device (surface); + cairo_composite_rectangles_t composite; + cairo_int_status_t status; + cairo_glyph_t *dev_glyphs; + cairo_time_t t; + int x, y; + + surface->log.glyphs.count++; + surface->log.glyphs.operators[op]++; + add_pattern (&surface->log.glyphs.source, source, surface->target); + add_clip (&surface->log.glyphs.clip, clip); + + device->log.glyphs.count++; + device->log.glyphs.operators[op]++; + add_pattern (&device->log.glyphs.source, source, surface->target); + add_clip (&device->log.glyphs.clip, clip); + + status = _cairo_composite_rectangles_init_for_glyphs (&composite, + surface->target, + op, source, + scaled_font, + glyphs, num_glyphs, + clip, + NULL); + if (unlikely (status)) { + surface->log.glyphs.noop++; + device->log.glyphs.noop++; + return status; + } + + midpt (&composite, &x, &y); + + add_extents (&surface->log.glyphs.extents, &composite); + add_extents (&device->log.glyphs.extents, &composite); + _cairo_composite_rectangles_fini (&composite); + + /* XXX We have to copy the glyphs, because the backend is allowed to + * modify! */ + dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unlikely (dev_glyphs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + memcpy (dev_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t)); + + t = _cairo_time_get (); + status = _cairo_surface_show_text_glyphs (surface->target, op, source, + NULL, 0, + dev_glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, + clip); + free (dev_glyphs); + if (unlikely (status)) + return status; + + _cairo_surface_sync (surface->target, x, y); + t = _cairo_time_get_delta (t); + + add_record_glyphs (&surface->log, + surface->target, op, source, + glyphs, num_glyphs, scaled_font, + clip, t); + + add_record_glyphs (&device->log, + surface->target, op, source, + glyphs, num_glyphs, scaled_font, + clip, t); + + do_callbacks (surface, &surface->glyphs_callbacks); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_surface_observer_flush (void *abstract_surface, unsigned flags) +{ + cairo_surface_observer_t *surface = abstract_surface; + + do_callbacks (surface, &surface->flush_callbacks); + return _cairo_surface_flush (surface->target, flags); +} + +static cairo_status_t +_cairo_surface_observer_mark_dirty (void *abstract_surface, + int x, int y, + int width, int height) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_status_t status; + + printf ("mark-dirty (%d, %d) x (%d, %d)\n", x, y, width, height); + + status = CAIRO_STATUS_SUCCESS; + if (surface->target->backend->mark_dirty_rectangle) + status = surface->target->backend->mark_dirty_rectangle (surface->target, + x,y, width,height); + + return status; +} + +static cairo_int_status_t +_cairo_surface_observer_copy_page (void *abstract_surface) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_status_t status; + + status = CAIRO_STATUS_SUCCESS; + if (surface->target->backend->copy_page) + status = surface->target->backend->copy_page (surface->target); + + return status; +} + +static cairo_int_status_t +_cairo_surface_observer_show_page (void *abstract_surface) +{ + cairo_surface_observer_t *surface = abstract_surface; + cairo_status_t status; + + status = CAIRO_STATUS_SUCCESS; + if (surface->target->backend->show_page) + status = surface->target->backend->show_page (surface->target); + + return status; +} + +static cairo_bool_t +_cairo_surface_observer_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_surface_observer_t *surface = abstract_surface; + return _cairo_surface_get_extents (surface->target, extents); +} + +static void +_cairo_surface_observer_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_surface_observer_t *surface = abstract_surface; + + if (surface->target->backend->get_font_options != NULL) + surface->target->backend->get_font_options (surface->target, options); +} + +static cairo_surface_t * +_cairo_surface_observer_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_surface_observer_t *surface = abstract_surface; + return _cairo_surface_get_source (surface->target, extents); +} + +static cairo_status_t +_cairo_surface_observer_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_surface_observer_t *surface = abstract_surface; + + surface->log.num_sources_acquired++; + to_device (surface)->log.num_sources_acquired++; + + return _cairo_surface_acquire_source_image (surface->target, + image_out, image_extra); +} + +static void +_cairo_surface_observer_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_observer_t *surface = abstract_surface; + + _cairo_surface_release_source_image (surface->target, image, image_extra); +} + +static cairo_surface_t * +_cairo_surface_observer_snapshot (void *abstract_surface) +{ + cairo_surface_observer_t *surface = abstract_surface; + + /* XXX hook onto the snapshot so that we measure number of reads */ + + if (surface->target->backend->snapshot) + return surface->target->backend->snapshot (surface->target); + + return NULL; +} + +static cairo_t * +_cairo_surface_observer_create_context(void *target) +{ + cairo_surface_observer_t *surface = target; + + if (_cairo_surface_is_subsurface (&surface->base)) + surface = (cairo_surface_observer_t *) + _cairo_surface_subsurface_get_target (&surface->base); + + surface->log.num_contexts++; + to_device (surface)->log.num_contexts++; + + return surface->target->backend->create_context (target); +} + +static const cairo_surface_backend_t _cairo_surface_observer_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_OBSERVER, + _cairo_surface_observer_finish, + + _cairo_surface_observer_create_context, + + _cairo_surface_observer_create_similar, + _cairo_surface_observer_create_similar_image, + _cairo_surface_observer_map_to_image, + _cairo_surface_observer_unmap_image, + + _cairo_surface_observer_source, + _cairo_surface_observer_acquire_source_image, + _cairo_surface_observer_release_source_image, + _cairo_surface_observer_snapshot, + + _cairo_surface_observer_copy_page, + _cairo_surface_observer_show_page, + + _cairo_surface_observer_get_extents, + _cairo_surface_observer_get_font_options, + + _cairo_surface_observer_flush, + _cairo_surface_observer_mark_dirty, + + _cairo_surface_observer_paint, + _cairo_surface_observer_mask, + _cairo_surface_observer_stroke, + _cairo_surface_observer_fill, + NULL, /* fill-stroke */ + _cairo_surface_observer_glyphs, +}; + +/** + * cairo_surface_create_observer: + * @target: an existing surface for which the observer will watch + * @mode: sets the mode of operation (normal vs. record) + * + * Create a new surface that exists solely to watch another is doing. In + * the process it will log operations and times, which are fast, which are + * slow, which are frequent, etc. + * + * The @mode parameter can be set to either CAIRO_SURFACE_OBSERVER_NORMAL + * or CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS, to control whether or not + * the internal observer should record operations. + * + * Return value: a pointer to the newly allocated surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if @other is already in an error state + * or any other error occurs. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_surface_create_observer (cairo_surface_t *target, + cairo_surface_observer_mode_t mode) +{ + cairo_device_t *device; + cairo_surface_t *surface; + cairo_bool_t record; + + if (unlikely (target->status)) + return _cairo_surface_create_in_error (target->status); + if (unlikely (target->finished)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + record = mode & CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS; + device = _cairo_device_create_observer_internal (target->device, record); + if (unlikely (device->status)) + return _cairo_surface_create_in_error (device->status); + + surface = _cairo_surface_create_observer_internal (device, target); + cairo_device_destroy (device); + + return surface; +} + +static cairo_status_t +_cairo_surface_observer_add_callback (cairo_list_t *head, + cairo_surface_observer_callback_t func, + void *data) +{ + struct callback_list *cb; + + cb = malloc (sizeof (*cb)); + if (unlikely (cb == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cairo_list_add (&cb->link, head); + cb->func = func; + cb->data = data; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +cairo_surface_observer_add_paint_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->paint_callbacks, + func, data); +} + +cairo_status_t +cairo_surface_observer_add_mask_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->mask_callbacks, + func, data); +} + +cairo_status_t +cairo_surface_observer_add_fill_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->fill_callbacks, + func, data); +} + +cairo_status_t +cairo_surface_observer_add_stroke_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->stroke_callbacks, + func, data); +} + +cairo_status_t +cairo_surface_observer_add_glyphs_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->glyphs_callbacks, + func, data); +} + +cairo_status_t +cairo_surface_observer_add_flush_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->flush_callbacks, + func, data); +} + +cairo_status_t +cairo_surface_observer_add_finish_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return abstract_surface->status; + + if (! _cairo_surface_is_observer (abstract_surface)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *)abstract_surface; + return _cairo_surface_observer_add_callback (&surface->finish_callbacks, + func, data); +} + +static void +print_extents (cairo_output_stream_t *stream, const struct extents *e) +{ + _cairo_output_stream_printf (stream, + " extents: total %g, avg %g [unbounded %d]\n", + e->area.sum, + e->area.sum / e->area.count, + e->unbounded); +} + +static inline int ordercmp (int a, int b, const unsigned int *array) +{ + /* high to low */ + return array[b] - array[a]; +} +CAIRO_COMBSORT_DECLARE_WITH_DATA (sort_order, int, ordercmp) + +static void +print_array (cairo_output_stream_t *stream, + const unsigned int *array, + const char **names, + int count) +{ + int order[64]; + int i, j; + + assert (count < ARRAY_LENGTH (order)); + for (i = j = 0; i < count; i++) { + if (array[i] != 0) + order[j++] = i; + } + + sort_order (order, j, (void *)array); + for (i = 0; i < j; i++) + _cairo_output_stream_printf (stream, " %d %s%s", + array[order[i]], names[order[i]], + i < j -1 ? "," : ""); +} + +static const char *operator_names[] = { + "CLEAR", /* CAIRO_OPERATOR_CLEAR */ + + "SOURCE", /* CAIRO_OPERATOR_SOURCE */ + "OVER", /* CAIRO_OPERATOR_OVER */ + "IN", /* CAIRO_OPERATOR_IN */ + "OUT", /* CAIRO_OPERATOR_OUT */ + "ATOP", /* CAIRO_OPERATOR_ATOP */ + + "DEST", /* CAIRO_OPERATOR_DEST */ + "DEST_OVER", /* CAIRO_OPERATOR_DEST_OVER */ + "DEST_IN", /* CAIRO_OPERATOR_DEST_IN */ + "DEST_OUT", /* CAIRO_OPERATOR_DEST_OUT */ + "DEST_ATOP", /* CAIRO_OPERATOR_DEST_ATOP */ + + "XOR", /* CAIRO_OPERATOR_XOR */ + "ADD", /* CAIRO_OPERATOR_ADD */ + "SATURATE", /* CAIRO_OPERATOR_SATURATE */ + + "MULTIPLY", /* CAIRO_OPERATOR_MULTIPLY */ + "SCREEN", /* CAIRO_OPERATOR_SCREEN */ + "OVERLAY", /* CAIRO_OPERATOR_OVERLAY */ + "DARKEN", /* CAIRO_OPERATOR_DARKEN */ + "LIGHTEN", /* CAIRO_OPERATOR_LIGHTEN */ + "DODGE", /* CAIRO_OPERATOR_COLOR_DODGE */ + "BURN", /* CAIRO_OPERATOR_COLOR_BURN */ + "HARD_LIGHT", /* CAIRO_OPERATOR_HARD_LIGHT */ + "SOFT_LIGHT", /* CAIRO_OPERATOR_SOFT_LIGHT */ + "DIFFERENCE", /* CAIRO_OPERATOR_DIFFERENCE */ + "EXCLUSION", /* CAIRO_OPERATOR_EXCLUSION */ + "HSL_HUE", /* CAIRO_OPERATOR_HSL_HUE */ + "HSL_SATURATION", /* CAIRO_OPERATOR_HSL_SATURATION */ + "HSL_COLOR", /* CAIRO_OPERATOR_HSL_COLOR */ + "HSL_LUMINOSITY" /* CAIRO_OPERATOR_HSL_LUMINOSITY */ +}; +static void +print_operators (cairo_output_stream_t *stream, unsigned int *array) +{ + _cairo_output_stream_printf (stream, " op:"); + print_array (stream, array, operator_names, NUM_OPERATORS); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *fill_rule_names[] = { + "non-zero", + "even-odd", +}; +static void +print_fill_rule (cairo_output_stream_t *stream, unsigned int *array) +{ + _cairo_output_stream_printf (stream, " fill rule:"); + print_array (stream, array, fill_rule_names, ARRAY_LENGTH(fill_rule_names)); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *cap_names[] = { + "butt", /* CAIRO_LINE_CAP_BUTT */ + "round", /* CAIRO_LINE_CAP_ROUND */ + "square" /* CAIRO_LINE_CAP_SQUARE */ +}; +static void +print_line_caps (cairo_output_stream_t *stream, unsigned int *array) +{ + _cairo_output_stream_printf (stream, " caps:"); + print_array (stream, array, cap_names, NUM_CAPS); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *join_names[] = { + "miter", /* CAIRO_LINE_JOIN_MITER */ + "round", /* CAIRO_LINE_JOIN_ROUND */ + "bevel", /* CAIRO_LINE_JOIN_BEVEL */ +}; +static void +print_line_joins (cairo_output_stream_t *stream, unsigned int *array) +{ + _cairo_output_stream_printf (stream, " joins:"); + print_array (stream, array, join_names, NUM_JOINS); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *antialias_names[] = { + "default", + "none", + "gray", + "subpixel", + "fast", + "good", + "best" +}; +static void +print_antialias (cairo_output_stream_t *stream, unsigned int *array) +{ + _cairo_output_stream_printf (stream, " antialias:"); + print_array (stream, array, antialias_names, NUM_ANTIALIAS); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *pattern_names[] = { + "native", + "record", + "other surface", + "solid", + "linear", + "radial", + "mesh", + "raster" +}; +static void +print_pattern (cairo_output_stream_t *stream, + const char *name, + const struct pattern *p) +{ + _cairo_output_stream_printf (stream, " %s:", name); + print_array (stream, p->type, pattern_names, ARRAY_LENGTH (pattern_names)); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *path_names[] = { + "empty", + "pixel-aligned", + "rectliinear", + "straight", + "curved", +}; +static void +print_path (cairo_output_stream_t *stream, + const struct path *p) +{ + _cairo_output_stream_printf (stream, " path:"); + print_array (stream, p->type, path_names, ARRAY_LENGTH (path_names)); + _cairo_output_stream_printf (stream, "\n"); +} + +static const char *clip_names[] = { + "none", + "region", + "boxes", + "single path", + "polygon", + "general", +}; +static void +print_clip (cairo_output_stream_t *stream, const struct clip *c) +{ + _cairo_output_stream_printf (stream, " clip:"); + print_array (stream, c->type, clip_names, ARRAY_LENGTH (clip_names)); + _cairo_output_stream_printf (stream, "\n"); +} + +static void +print_record (cairo_output_stream_t *stream, + cairo_observation_record_t *r) +{ + _cairo_output_stream_printf (stream, " op: %s\n", operator_names[r->op]); + _cairo_output_stream_printf (stream, " source: %s\n", + pattern_names[r->source]); + if (r->mask != -1) + _cairo_output_stream_printf (stream, " mask: %s\n", + pattern_names[r->mask]); + if (r->num_glyphs != -1) + _cairo_output_stream_printf (stream, " num_glyphs: %d\n", + r->num_glyphs); + if (r->path != -1) + _cairo_output_stream_printf (stream, " path: %s\n", + path_names[r->path]); + if (r->fill_rule != -1) + _cairo_output_stream_printf (stream, " fill rule: %s\n", + fill_rule_names[r->fill_rule]); + if (r->antialias != -1) + _cairo_output_stream_printf (stream, " antialias: %s\n", + antialias_names[r->antialias]); + _cairo_output_stream_printf (stream, " clip: %s\n", clip_names[r->clip]); + _cairo_output_stream_printf (stream, " elapsed: %f ns\n", + _cairo_time_to_ns (r->elapsed)); +} + +static double percent (cairo_time_t a, cairo_time_t b) +{ + /* Fake %.1f */ + return _cairo_round (_cairo_time_to_s (a) * 1000 / + _cairo_time_to_s (b)) / 10; +} + +static cairo_bool_t +replay_record (cairo_observation_t *log, + cairo_observation_record_t *r, + cairo_device_t *script) +{ +#if CAIRO_HAS_SCRIPT_SURFACE + cairo_surface_t *surface; + cairo_int_status_t status; + + if (log->record == NULL || script == NULL) + return FALSE; + + surface = cairo_script_surface_create (script, + r->target_content, + r->target_width, + r->target_height); + status = + _cairo_recording_surface_replay_one (log->record, r->index, surface); + cairo_surface_destroy (surface); + + assert (status == CAIRO_INT_STATUS_SUCCESS); + + return TRUE; +#else + return FALSE; +#endif +} + +static cairo_time_t +_cairo_observation_total_elapsed (cairo_observation_t *log) +{ + cairo_time_t total; + + total = log->paint.elapsed; + total = _cairo_time_add (total, log->mask.elapsed); + total = _cairo_time_add (total, log->fill.elapsed); + total = _cairo_time_add (total, log->stroke.elapsed); + total = _cairo_time_add (total, log->glyphs.elapsed); + + return total; +} + +static void +_cairo_observation_print (cairo_output_stream_t *stream, + cairo_observation_t *log) +{ + cairo_device_t *script; + cairo_time_t total; + +#if CAIRO_HAS_SCRIPT_SURFACE + script = _cairo_script_context_create_internal (stream); + _cairo_script_context_attach_snapshots (script, FALSE); +#else + script = NULL; +#endif + + total = _cairo_observation_total_elapsed (log); + + _cairo_output_stream_printf (stream, "elapsed: %f\n", + _cairo_time_to_ns (total)); + _cairo_output_stream_printf (stream, "surfaces: %d\n", + log->num_surfaces); + _cairo_output_stream_printf (stream, "contexts: %d\n", + log->num_contexts); + _cairo_output_stream_printf (stream, "sources acquired: %d\n", + log->num_sources_acquired); + + + _cairo_output_stream_printf (stream, "paint: count %d [no-op %d], elapsed %f [%f%%]\n", + log->paint.count, log->paint.noop, + _cairo_time_to_ns (log->paint.elapsed), + percent (log->paint.elapsed, total)); + if (log->paint.count) { + print_extents (stream, &log->paint.extents); + print_operators (stream, log->paint.operators); + print_pattern (stream, "source", &log->paint.source); + print_clip (stream, &log->paint.clip); + + _cairo_output_stream_printf (stream, "slowest paint: %f%%\n", + percent (log->paint.slowest.elapsed, + log->paint.elapsed)); + print_record (stream, &log->paint.slowest); + + _cairo_output_stream_printf (stream, "\n"); + if (replay_record (log, &log->paint.slowest, script)) + _cairo_output_stream_printf (stream, "\n\n"); + } + + _cairo_output_stream_printf (stream, "mask: count %d [no-op %d], elapsed %f [%f%%]\n", + log->mask.count, log->mask.noop, + _cairo_time_to_ns (log->mask.elapsed), + percent (log->mask.elapsed, total)); + if (log->mask.count) { + print_extents (stream, &log->mask.extents); + print_operators (stream, log->mask.operators); + print_pattern (stream, "source", &log->mask.source); + print_pattern (stream, "mask", &log->mask.mask); + print_clip (stream, &log->mask.clip); + + _cairo_output_stream_printf (stream, "slowest mask: %f%%\n", + percent (log->mask.slowest.elapsed, + log->mask.elapsed)); + print_record (stream, &log->mask.slowest); + + _cairo_output_stream_printf (stream, "\n"); + if (replay_record (log, &log->mask.slowest, script)) + _cairo_output_stream_printf (stream, "\n\n"); + } + + _cairo_output_stream_printf (stream, "fill: count %d [no-op %d], elaspsed %f [%f%%]\n", + log->fill.count, log->fill.noop, + _cairo_time_to_ns (log->fill.elapsed), + percent (log->fill.elapsed, total)); + if (log->fill.count) { + print_extents (stream, &log->fill.extents); + print_operators (stream, log->fill.operators); + print_pattern (stream, "source", &log->fill.source); + print_path (stream, &log->fill.path); + print_fill_rule (stream, log->fill.fill_rule); + print_antialias (stream, log->fill.antialias); + print_clip (stream, &log->fill.clip); + + _cairo_output_stream_printf (stream, "slowest fill: %f%%\n", + percent (log->fill.slowest.elapsed, + log->fill.elapsed)); + print_record (stream, &log->fill.slowest); + + _cairo_output_stream_printf (stream, "\n"); + if (replay_record (log, &log->fill.slowest, script)) + _cairo_output_stream_printf (stream, "\n\n"); + } + + _cairo_output_stream_printf (stream, "stroke: count %d [no-op %d], elapsed %f [%f%%]\n", + log->stroke.count, log->stroke.noop, + _cairo_time_to_ns (log->stroke.elapsed), + percent (log->stroke.elapsed, total)); + if (log->stroke.count) { + print_extents (stream, &log->stroke.extents); + print_operators (stream, log->stroke.operators); + print_pattern (stream, "source", &log->stroke.source); + print_path (stream, &log->stroke.path); + print_antialias (stream, log->stroke.antialias); + print_line_caps (stream, log->stroke.caps); + print_line_joins (stream, log->stroke.joins); + print_clip (stream, &log->stroke.clip); + + _cairo_output_stream_printf (stream, "slowest stroke: %f%%\n", + percent (log->stroke.slowest.elapsed, + log->stroke.elapsed)); + print_record (stream, &log->stroke.slowest); + + _cairo_output_stream_printf (stream, "\n"); + if (replay_record (log, &log->stroke.slowest, script)) + _cairo_output_stream_printf (stream, "\n\n"); + } + + _cairo_output_stream_printf (stream, "glyphs: count %d [no-op %d], elasped %f [%f%%]\n", + log->glyphs.count, log->glyphs.noop, + _cairo_time_to_ns (log->glyphs.elapsed), + percent (log->glyphs.elapsed, total)); + if (log->glyphs.count) { + print_extents (stream, &log->glyphs.extents); + print_operators (stream, log->glyphs.operators); + print_pattern (stream, "source", &log->glyphs.source); + print_clip (stream, &log->glyphs.clip); + + _cairo_output_stream_printf (stream, "slowest glyphs: %f%%\n", + percent (log->glyphs.slowest.elapsed, + log->glyphs.elapsed)); + print_record (stream, &log->glyphs.slowest); + + _cairo_output_stream_printf (stream, "\n"); + if (replay_record (log, &log->glyphs.slowest, script)) + _cairo_output_stream_printf (stream, "\n\n"); + } + + cairo_device_destroy (script); +} + +cairo_status_t +cairo_surface_observer_print (cairo_surface_t *abstract_surface, + cairo_write_func_t write_func, + void *closure) +{ + cairo_output_stream_t *stream; + cairo_surface_observer_t *surface; + + if (unlikely (abstract_surface->status)) + return abstract_surface->status; + + if (unlikely (! _cairo_surface_is_observer (abstract_surface))) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + surface = (cairo_surface_observer_t *) abstract_surface; + + stream = _cairo_output_stream_create (write_func, NULL, closure); + _cairo_observation_print (stream, &surface->log); + return _cairo_output_stream_destroy (stream); +} + +double +cairo_surface_observer_elapsed (cairo_surface_t *abstract_surface) +{ + cairo_surface_observer_t *surface; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_surface->ref_count))) + return -1; + + if (! _cairo_surface_is_observer (abstract_surface)) + return -1; + + surface = (cairo_surface_observer_t *) abstract_surface; + return _cairo_time_to_ns (_cairo_observation_total_elapsed (&surface->log)); +} + +cairo_status_t +cairo_device_observer_print (cairo_device_t *abstract_device, + cairo_write_func_t write_func, + void *closure) +{ + cairo_output_stream_t *stream; + cairo_device_observer_t *device; + + if (unlikely (abstract_device->status)) + return abstract_device->status; + + if (unlikely (! _cairo_device_is_observer (abstract_device))) + return _cairo_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + + device = (cairo_device_observer_t *) abstract_device; + + stream = _cairo_output_stream_create (write_func, NULL, closure); + _cairo_observation_print (stream, &device->log); + return _cairo_output_stream_destroy (stream); +} + +double +cairo_device_observer_elapsed (cairo_device_t *abstract_device) +{ + cairo_device_observer_t *device; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_device->ref_count))) + return -1; + + if (! _cairo_device_is_observer (abstract_device)) + return -1; + + device = (cairo_device_observer_t *) abstract_device; + return _cairo_time_to_ns (_cairo_observation_total_elapsed (&device->log)); +} + +double +cairo_device_observer_paint_elapsed (cairo_device_t *abstract_device) +{ + cairo_device_observer_t *device; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_device->ref_count))) + return -1; + + if (! _cairo_device_is_observer (abstract_device)) + return -1; + + device = (cairo_device_observer_t *) abstract_device; + return _cairo_time_to_ns (device->log.paint.elapsed); +} + +double +cairo_device_observer_mask_elapsed (cairo_device_t *abstract_device) +{ + cairo_device_observer_t *device; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_device->ref_count))) + return -1; + + if (! _cairo_device_is_observer (abstract_device)) + return -1; + + device = (cairo_device_observer_t *) abstract_device; + return _cairo_time_to_ns (device->log.mask.elapsed); +} + +double +cairo_device_observer_fill_elapsed (cairo_device_t *abstract_device) +{ + cairo_device_observer_t *device; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_device->ref_count))) + return -1; + + if (! _cairo_device_is_observer (abstract_device)) + return -1; + + device = (cairo_device_observer_t *) abstract_device; + return _cairo_time_to_ns (device->log.fill.elapsed); +} + +double +cairo_device_observer_stroke_elapsed (cairo_device_t *abstract_device) +{ + cairo_device_observer_t *device; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_device->ref_count))) + return -1; + + if (! _cairo_device_is_observer (abstract_device)) + return -1; + + device = (cairo_device_observer_t *) abstract_device; + return _cairo_time_to_ns (device->log.stroke.elapsed); +} + +double +cairo_device_observer_glyphs_elapsed (cairo_device_t *abstract_device) +{ + cairo_device_observer_t *device; + + if (unlikely (CAIRO_REFERENCE_COUNT_IS_INVALID (&abstract_device->ref_count))) + return -1; + + if (! _cairo_device_is_observer (abstract_device)) + return -1; + + device = (cairo_device_observer_t *) abstract_device; + return _cairo_time_to_ns (device->log.glyphs.elapsed); +} diff --git a/src/cairo-surface-offset-private.h b/src/cairo-surface-offset-private.h new file mode 100644 index 000000000..310ba5691 --- /dev/null +++ b/src/cairo-surface-offset-private.h @@ -0,0 +1,95 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_OFFSET_PRIVATE_H +#define CAIRO_SURFACE_OFFSET_PRIVATE_H + +#include "cairo-types-private.h" + +CAIRO_BEGIN_DECLS + +cairo_private cairo_status_t +_cairo_surface_offset_paint (cairo_surface_t *target, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_offset_mask (cairo_surface_t *target, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_offset_stroke (cairo_surface_t *surface, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_offset_fill (cairo_surface_t *surface, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t*source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_offset_glyphs (cairo_surface_t *surface, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_clip_t *clip); + +#endif /* CAIRO_SURFACE_OFFSET_PRIVATE_H */ diff --git a/src/cairo-surface-offset.c b/src/cairo-surface-offset.c new file mode 100644 index 000000000..98f57f298 --- /dev/null +++ b/src/cairo-surface-offset.c @@ -0,0 +1,308 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * Copyright © 2007 Adrian Johnson + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-error-private.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-offset-private.h" + +/* A collection of routines to facilitate drawing to an alternate surface. */ + +static void +_copy_transformed_pattern (cairo_pattern_t *pattern, + const cairo_pattern_t *original, + const cairo_matrix_t *ctm_inverse) +{ + _cairo_pattern_init_static_copy (pattern, original); + + if (! _cairo_matrix_is_identity (ctm_inverse)) + _cairo_pattern_transform (pattern, ctm_inverse); +} + +cairo_status_t +_cairo_surface_offset_paint (cairo_surface_t *target, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; + cairo_pattern_union_t source_copy; + + if (unlikely (target->status)) + return target->status; + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + if (x | y) { + cairo_matrix_t m; + + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + + cairo_matrix_init_translate (&m, x, y); + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + } + + status = _cairo_surface_paint (target, op, source, dev_clip); + + if (dev_clip != clip) + _cairo_clip_destroy (dev_clip); + + return status; +} + +cairo_status_t +_cairo_surface_offset_mask (cairo_surface_t *target, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; + cairo_pattern_union_t source_copy; + cairo_pattern_union_t mask_copy; + + if (unlikely (target->status)) + return target->status; + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + if (x | y) { + cairo_matrix_t m; + + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + + cairo_matrix_init_translate (&m, x, y); + _copy_transformed_pattern (&source_copy.base, source, &m); + _copy_transformed_pattern (&mask_copy.base, mask, &m); + source = &source_copy.base; + mask = &mask_copy.base; + } + + status = _cairo_surface_mask (target, op, + source, mask, + dev_clip); + + if (dev_clip != clip) + _cairo_clip_destroy (dev_clip); + + return status; +} + +cairo_status_t +_cairo_surface_offset_stroke (cairo_surface_t *surface, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t*stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; + cairo_matrix_t dev_ctm = *ctm; + cairo_matrix_t dev_ctm_inverse = *ctm_inverse; + cairo_pattern_union_t source_copy; + cairo_status_t status; + + if (unlikely (surface->status)) + return surface->status; + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + if (x | y) { + cairo_matrix_t m; + + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); + if (unlikely (status)) + goto FINISH; + + _cairo_path_fixed_translate (&path_copy, + _cairo_fixed_from_int (-x), + _cairo_fixed_from_int (-y)); + dev_path = &path_copy; + + cairo_matrix_init_translate (&m, -x, -y); + cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m); + + cairo_matrix_init_translate (&m, x, y); + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + cairo_matrix_multiply (&dev_ctm_inverse, &m, &dev_ctm_inverse); + } + + status = _cairo_surface_stroke (surface, op, source, + dev_path, stroke_style, + &dev_ctm, &dev_ctm_inverse, + tolerance, antialias, + dev_clip); + +FINISH: + if (dev_path != path) + _cairo_path_fixed_fini (dev_path); + if (dev_clip != clip) + _cairo_clip_destroy (dev_clip); + + return status; +} + +cairo_status_t +_cairo_surface_offset_fill (cairo_surface_t *surface, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t*source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; + cairo_pattern_union_t source_copy; + + if (unlikely (surface->status)) + return surface->status; + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + if (x | y) { + cairo_matrix_t m; + + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); + if (unlikely (status)) + goto FINISH; + + _cairo_path_fixed_translate (&path_copy, + _cairo_fixed_from_int (-x), + _cairo_fixed_from_int (-y)); + dev_path = &path_copy; + + cairo_matrix_init_translate (&m, x, y); + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + } + + status = _cairo_surface_fill (surface, op, source, + dev_path, fill_rule, + tolerance, antialias, + dev_clip); + +FINISH: + if (dev_path != path) + _cairo_path_fixed_fini (dev_path); + if (dev_clip != clip) + _cairo_clip_destroy (dev_clip); + + return status; +} + +cairo_status_t +_cairo_surface_offset_glyphs (cairo_surface_t *surface, + int x, int y, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_clip_t *dev_clip = (cairo_clip_t *) clip; + cairo_pattern_union_t source_copy; + cairo_glyph_t *dev_glyphs; + int i; + + if (unlikely (surface->status)) + return surface->status; + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (dev_glyphs == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (dev_glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); + + if (x | y) { + cairo_matrix_t m; + + dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); + + cairo_matrix_init_translate (&m, x, y); + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + + for (i = 0; i < num_glyphs; i++) { + dev_glyphs[i].x -= x; + dev_glyphs[i].y -= y; + } + } + + status = _cairo_surface_show_text_glyphs (surface, op, source, + NULL, 0, + dev_glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, + dev_clip); + + if (dev_clip != clip) + _cairo_clip_destroy (dev_clip); + free (dev_glyphs); + + return status; +} diff --git a/src/cairo-surface-private.h b/src/cairo-surface-private.h new file mode 100644 index 000000000..f20ab0739 --- /dev/null +++ b/src/cairo-surface-private.h @@ -0,0 +1,121 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SURFACE_PRIVATE_H +#define CAIRO_SURFACE_PRIVATE_H + +#include "cairo.h" + +#include "cairo-types-private.h" +#include "cairo-list-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-clip-private.h" +#include "cairo-surface-backend-private.h" + +typedef void (*cairo_surface_func_t) (cairo_surface_t *); + +struct _cairo_surface { + const cairo_surface_backend_t *backend; + cairo_device_t *device; + + /* We allow surfaces to override the backend->type by shoving something + * else into surface->type. This is for "wrapper" surfaces that want to + * hide their internal type from the user-level API. */ + cairo_surface_type_t type; + + cairo_content_t content; + + cairo_reference_count_t ref_count; + cairo_status_t status; + unsigned int unique_id; + unsigned int serial; + cairo_damage_t *damage; + + unsigned _finishing : 1; + unsigned finished : 1; + unsigned is_clear : 1; + unsigned has_font_options : 1; + unsigned owns_device : 1; + + cairo_user_data_array_t user_data; + cairo_user_data_array_t mime_data; + + cairo_matrix_t device_transform; + cairo_matrix_t device_transform_inverse; + cairo_list_t device_transform_observers; + + /* The actual resolution of the device, in dots per inch. */ + double x_resolution; + double y_resolution; + + /* The resolution that should be used when generating image-based + * fallback; generally only used by the analysis/paginated + * surfaces + */ + double x_fallback_resolution; + double y_fallback_resolution; + + /* A "snapshot" surface is immutable. See _cairo_surface_snapshot. */ + cairo_surface_t *snapshot_of; + cairo_surface_func_t snapshot_detach; + /* current snapshots of this surface*/ + cairo_list_t snapshots; + /* place upon snapshot list */ + cairo_list_t snapshot; + + /* + * Surface font options, falling back to backend's default options, + * and set using _cairo_surface_set_font_options(), and propagated by + * cairo_surface_create_similar(). + */ + cairo_font_options_t font_options; +}; + +cairo_private cairo_surface_t * +_cairo_surface_create_in_error (cairo_status_t status); + +cairo_private cairo_surface_t * +_cairo_int_surface_create_in_error (cairo_int_status_t status); + +cairo_private cairo_surface_t * +_cairo_surface_get_source (cairo_surface_t *surface, + cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_surface_flush (cairo_surface_t *surface, unsigned flags); + +#endif /* CAIRO_SURFACE_PRIVATE_H */ diff --git a/src/cairo-surface-snapshot-inline.h b/src/cairo-surface-snapshot-inline.h new file mode 100644 index 000000000..bf89c772b --- /dev/null +++ b/src/cairo-surface-snapshot-inline.h @@ -0,0 +1,67 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_SNAPSHOT_INLINE_H +#define CAIRO_SURFACE_SNAPSHOT_INLINE_H + +#include "cairo-surface-snapshot-private.h" +#include "cairo-surface-inline.h" + +static inline cairo_bool_t +_cairo_surface_snapshot_is_reused (cairo_surface_t *surface) +{ + return CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count) > 2; +} + +static inline cairo_surface_t * +_cairo_surface_snapshot_get_target (cairo_surface_t *surface) +{ + cairo_surface_snapshot_t *snapshot = (cairo_surface_snapshot_t *) surface; + cairo_surface_t *target; + + CAIRO_MUTEX_LOCK (snapshot->mutex); + target = _cairo_surface_reference (snapshot->target); + CAIRO_MUTEX_UNLOCK (snapshot->mutex); + + return target; +} + +static inline cairo_bool_t +_cairo_surface_is_snapshot (cairo_surface_t *surface) +{ + return surface->backend->type == (cairo_surface_type_t)CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT; +} + +#endif /* CAIRO_SURFACE_SNAPSHOT_INLINE_H */ diff --git a/src/cairo-surface-snapshot-private.h b/src/cairo-surface-snapshot-private.h new file mode 100644 index 000000000..58bee7b49 --- /dev/null +++ b/src/cairo-surface-snapshot-private.h @@ -0,0 +1,51 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_SNAPSHOT_PRIVATE_H +#define CAIRO_SURFACE_SNAPSHOT_PRIVATE_H + +#include "cairo-mutex-private.h" +#include "cairo-surface-private.h" +#include "cairo-surface-backend-private.h" + +struct _cairo_surface_snapshot { + cairo_surface_t base; + + cairo_mutex_t mutex; + cairo_surface_t *target; + cairo_surface_t *clone; +}; + +#endif /* CAIRO_SURFACE_SNAPSHOT_PRIVATE_H */ diff --git a/src/cairo-surface-snapshot.c b/src/cairo-surface-snapshot.c new file mode 100644 index 000000000..68bf9054e --- /dev/null +++ b/src/cairo-surface-snapshot.c @@ -0,0 +1,289 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-snapshot-inline.h" + +static cairo_status_t +_cairo_surface_snapshot_finish (void *abstract_surface) +{ + cairo_surface_snapshot_t *surface = abstract_surface; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (surface->clone != NULL) { + cairo_surface_finish (surface->clone); + status = surface->clone->status; + + cairo_surface_destroy (surface->clone); + } + + CAIRO_MUTEX_FINI (surface->mutex); + + return status; +} + +static cairo_status_t +_cairo_surface_snapshot_flush (void *abstract_surface, unsigned flags) +{ + cairo_surface_snapshot_t *surface = abstract_surface; + cairo_surface_t *target; + cairo_status_t status; + + target = _cairo_surface_snapshot_get_target (&surface->base); + status = _cairo_surface_flush (target, flags); + cairo_surface_destroy (target); + + return status; +} + +static cairo_surface_t * +_cairo_surface_snapshot_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_surface_snapshot_t *surface = abstract_surface; + return _cairo_surface_get_source (surface->target, extents); /* XXX racy */ +} + +struct snapshot_extra { + cairo_surface_t *target; + void *extra; +}; + +static cairo_status_t +_cairo_surface_snapshot_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **extra_out) +{ + cairo_surface_snapshot_t *surface = abstract_surface; + struct snapshot_extra *extra; + cairo_status_t status; + + extra = malloc (sizeof (*extra)); + if (unlikely (extra == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + extra->target = _cairo_surface_snapshot_get_target (&surface->base); + status = _cairo_surface_acquire_source_image (extra->target, image_out, &extra->extra); + if (unlikely (status)) { + cairo_surface_destroy (extra->target); + free (extra); + } + + *extra_out = extra; + return status; +} + +static void +_cairo_surface_snapshot_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *_extra) +{ + struct snapshot_extra *extra = _extra; + + _cairo_surface_release_source_image (extra->target, image, extra->extra); + cairo_surface_destroy (extra->target); + free (extra); +} + +static cairo_bool_t +_cairo_surface_snapshot_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_surface_snapshot_t *surface = abstract_surface; + cairo_surface_t *target; + cairo_bool_t bounded; + + target = _cairo_surface_snapshot_get_target (&surface->base); + bounded = _cairo_surface_get_extents (target, extents); + cairo_surface_destroy (target); + + return bounded; +} + +static const cairo_surface_backend_t _cairo_surface_snapshot_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT, + _cairo_surface_snapshot_finish, + NULL, + + NULL, /* create similar */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_snapshot_source, + _cairo_surface_snapshot_acquire_source_image, + _cairo_surface_snapshot_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_surface_snapshot_get_extents, + NULL, /* get-font-options */ + + _cairo_surface_snapshot_flush, +}; + +static void +_cairo_surface_snapshot_copy_on_write (cairo_surface_t *surface) +{ + cairo_surface_snapshot_t *snapshot = (cairo_surface_snapshot_t *) surface; + cairo_image_surface_t *image; + cairo_surface_t *clone; + void *extra; + cairo_status_t status; + + TRACE ((stderr, "%s: target=%d\n", + __FUNCTION__, snapshot->target->unique_id)); + + /* We need to make an image copy of the original surface since the + * snapshot may exceed the lifetime of the original device, i.e. + * when we later need to use the snapshot the data may have already + * been lost. + */ + + CAIRO_MUTEX_LOCK (snapshot->mutex); + + if (snapshot->target->backend->snapshot != NULL) { + clone = snapshot->target->backend->snapshot (snapshot->target); + if (clone != NULL) { + assert (clone->status || ! _cairo_surface_is_snapshot (clone)); + goto done; + } + } + + /* XXX copy to a similar surface, leave acquisition till later? + * We should probably leave such decisions to the backend in case we + * rely upon devices/connections like Xlib. + */ + status = _cairo_surface_acquire_source_image (snapshot->target, &image, &extra); + if (unlikely (status)) { + snapshot->target = _cairo_surface_create_in_error (status); + status = _cairo_surface_set_error (surface, status); + goto unlock; + } + clone = image->base.backend->snapshot (&image->base); + _cairo_surface_release_source_image (snapshot->target, image, extra); + +done: + status = _cairo_surface_set_error (surface, clone->status); + snapshot->target = snapshot->clone = clone; + snapshot->base.type = clone->type; +unlock: + CAIRO_MUTEX_UNLOCK (snapshot->mutex); +} + +/** + * _cairo_surface_snapshot: + * @surface: a #cairo_surface_t + * + * Make an immutable reference to @surface. It is an error to call a + * surface-modifying function on the result of this function. The + * resulting 'snapshot' is a lazily copied-on-write surface i.e. it + * remains a reference to the original surface until that surface is + * written to again, at which time a copy is made of the original surface + * and the snapshot then points to that instead. Multiple snapshots of the + * same unmodified surface point to the same copy. + * + * The caller owns the return value and should call + * cairo_surface_destroy() when finished with it. This function will not + * return %NULL, but will return a nil surface instead. + * + * Return value: The snapshot surface. Note that the return surface + * may not necessarily be of the same type as @surface. + **/ +cairo_surface_t * +_cairo_surface_snapshot (cairo_surface_t *surface) +{ + cairo_surface_snapshot_t *snapshot; + cairo_status_t status; + + TRACE ((stderr, "%s: target=%d\n", __FUNCTION__, surface->unique_id)); + + if (unlikely (surface->status)) + return _cairo_surface_create_in_error (surface->status); + + if (unlikely (surface->finished)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (surface->snapshot_of != NULL) + return cairo_surface_reference (surface); + + if (_cairo_surface_is_snapshot (surface)) + return cairo_surface_reference (surface); + + snapshot = (cairo_surface_snapshot_t *) + _cairo_surface_has_snapshot (surface, &_cairo_surface_snapshot_backend); + if (snapshot != NULL) + return cairo_surface_reference (&snapshot->base); + + snapshot = malloc (sizeof (cairo_surface_snapshot_t)); + if (unlikely (snapshot == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + _cairo_surface_init (&snapshot->base, + &_cairo_surface_snapshot_backend, + NULL, /* device */ + surface->content); + snapshot->base.type = surface->type; + + CAIRO_MUTEX_INIT (snapshot->mutex); + snapshot->target = surface; + snapshot->clone = NULL; + + status = _cairo_surface_copy_mime_data (&snapshot->base, surface); + if (unlikely (status)) { + cairo_surface_destroy (&snapshot->base); + return _cairo_surface_create_in_error (status); + } + + snapshot->base.device_transform = surface->device_transform; + snapshot->base.device_transform_inverse = surface->device_transform_inverse; + + _cairo_surface_attach_snapshot (surface, + &snapshot->base, + _cairo_surface_snapshot_copy_on_write); + + return &snapshot->base; +} diff --git a/src/cairo-surface-subsurface-inline.h b/src/cairo-surface-subsurface-inline.h new file mode 100644 index 000000000..0cd09e63e --- /dev/null +++ b/src/cairo-surface-subsurface-inline.h @@ -0,0 +1,72 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_SUBSURFACE_INLINE_H +#define CAIRO_SURFACE_SUBSURFACE_INLINE_H + +#include "cairo-surface-subsurface-private.h" + +static inline cairo_surface_t * +_cairo_surface_subsurface_get_target (cairo_surface_t *surface) +{ + return ((cairo_surface_subsurface_t *) surface)->target; +} + +static inline void +_cairo_surface_subsurface_offset (cairo_surface_t *surface, + int *x, int *y) +{ + cairo_surface_subsurface_t *ss = (cairo_surface_subsurface_t *) surface; + *x += ss->extents.x; + *y += ss->extents.y; +} + +static inline cairo_surface_t * +_cairo_surface_subsurface_get_target_with_offset (cairo_surface_t *surface, + int *x, int *y) +{ + cairo_surface_subsurface_t *ss = (cairo_surface_subsurface_t *) surface; + *x += ss->extents.x; + *y += ss->extents.y; + return ss->target; +} + +static inline cairo_bool_t +_cairo_surface_is_subsurface (cairo_surface_t *surface) +{ + return surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE; +} + +#endif /* CAIRO_SURFACE_SUBSURFACE_INLINE_H */ diff --git a/src/cairo-surface-subsurface-private.h b/src/cairo-surface-subsurface-private.h new file mode 100644 index 000000000..89c5cc01b --- /dev/null +++ b/src/cairo-surface-subsurface-private.h @@ -0,0 +1,55 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_SUBSURFACE_PRIVATE_H +#define CAIRO_SURFACE_SUBSURFACE_PRIVATE_H + +#include "cairo-surface-private.h" +#include "cairo-surface-backend-private.h" + +struct _cairo_surface_subsurface { + cairo_surface_t base; + + cairo_rectangle_int_t extents; + + cairo_surface_t *target; + cairo_surface_t *snapshot; +}; + +cairo_private void +_cairo_surface_subsurface_set_snapshot (cairo_surface_t *surface, + cairo_surface_t *snapshot); + +#endif /* CAIRO_SURFACE_SUBSURFACE_PRIVATE_H */ diff --git a/src/cairo-surface-subsurface.c b/src/cairo-surface-subsurface.c new file mode 100644 index 000000000..b7dfd9d9e --- /dev/null +++ b/src/cairo-surface-subsurface.c @@ -0,0 +1,587 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-offset-private.h" +#include "cairo-surface-snapshot-private.h" +#include "cairo-surface-subsurface-private.h" + +static const cairo_surface_backend_t _cairo_surface_subsurface_backend; + +static cairo_status_t +_cairo_surface_subsurface_finish (void *abstract_surface) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + + cairo_surface_destroy (surface->target); + cairo_surface_destroy (surface->snapshot); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_surface_subsurface_create_similar (void *other, + cairo_content_t content, + int width, int height) +{ + cairo_surface_subsurface_t *surface = other; + + if (surface->target->backend->create_similar == NULL) + return NULL; + + return surface->target->backend->create_similar (surface->target, content, width, height); +} + +static cairo_surface_t * +_cairo_surface_subsurface_create_similar_image (void *other, + cairo_format_t format, + int width, int height) +{ + cairo_surface_subsurface_t *surface = other; + + if (surface->target->backend->create_similar_image == NULL) + return NULL; + + return surface->target->backend->create_similar_image (surface->target, + format, + width, height); +} + +static cairo_image_surface_t * +_cairo_surface_subsurface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_rectangle_int_t target_extents; + + target_extents.x = extents->x + surface->extents.x; + target_extents.y = extents->y + surface->extents.y; + target_extents.width = extents->width; + target_extents.height = extents->height; + + return _cairo_surface_map_to_image (surface->target, &target_extents); +} + +static cairo_int_status_t +_cairo_surface_subsurface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + return _cairo_surface_unmap_image (surface->target, image); +} + +static cairo_int_status_t +_cairo_surface_subsurface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_rectangle_int_t rect = { 0, 0, surface->extents.width, surface->extents.height }; + cairo_status_t status; + cairo_clip_t *target_clip; + + target_clip = _cairo_clip_copy_intersect_rectangle (clip, &rect); + status = _cairo_surface_offset_paint (surface->target, + -surface->extents.x, -surface->extents.y, + op, source, target_clip); + _cairo_clip_destroy (target_clip); + return status; +} + +static cairo_int_status_t +_cairo_surface_subsurface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_rectangle_int_t rect = { 0, 0, surface->extents.width, surface->extents.height }; + cairo_status_t status; + cairo_clip_t *target_clip; + + target_clip = _cairo_clip_copy_intersect_rectangle (clip, &rect); + status = _cairo_surface_offset_mask (surface->target, + -surface->extents.x, -surface->extents.y, + op, source, mask, target_clip); + _cairo_clip_destroy (target_clip); + return status; +} + +static cairo_int_status_t +_cairo_surface_subsurface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_rectangle_int_t rect = { 0, 0, surface->extents.width, surface->extents.height }; + cairo_status_t status; + cairo_clip_t *target_clip; + + target_clip = _cairo_clip_copy_intersect_rectangle (clip, &rect); + status = _cairo_surface_offset_fill (surface->target, + -surface->extents.x, -surface->extents.y, + op, source, path, fill_rule, tolerance, antialias, + target_clip); + _cairo_clip_destroy (target_clip); + return status; +} + +static cairo_int_status_t +_cairo_surface_subsurface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_rectangle_int_t rect = { 0, 0, surface->extents.width, surface->extents.height }; + cairo_status_t status; + cairo_clip_t *target_clip; + + target_clip = _cairo_clip_copy_intersect_rectangle (clip, &rect); + status = _cairo_surface_offset_stroke (surface->target, + -surface->extents.x, -surface->extents.y, + op, source, path, stroke_style, ctm, ctm_inverse, + tolerance, antialias, + target_clip); + _cairo_clip_destroy (target_clip); + return status; +} + +static cairo_int_status_t +_cairo_surface_subsurface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_rectangle_int_t rect = { 0, 0, surface->extents.width, surface->extents.height }; + cairo_status_t status; + cairo_clip_t *target_clip; + + target_clip = _cairo_clip_copy_intersect_rectangle (clip, &rect); + status = _cairo_surface_offset_glyphs (surface->target, + -surface->extents.x, -surface->extents.y, + op, source, + scaled_font, glyphs, num_glyphs, + target_clip); + _cairo_clip_destroy (target_clip); + return status; +} + +static cairo_status_t +_cairo_surface_subsurface_flush (void *abstract_surface, unsigned flags) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + return _cairo_surface_flush (surface->target, flags); +} + +static cairo_status_t +_cairo_surface_subsurface_mark_dirty (void *abstract_surface, + int x, int y, + int width, int height) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_status_t status; + + status = CAIRO_STATUS_SUCCESS; + if (surface->target->backend->mark_dirty_rectangle != NULL) { + cairo_rectangle_int_t rect, extents; + + rect.x = x; + rect.y = y; + rect.width = width; + rect.height = height; + + extents.x = extents.y = 0; + extents.width = surface->extents.width; + extents.height = surface->extents.height; + + if (_cairo_rectangle_intersect (&rect, &extents)) { + status = surface->target->backend->mark_dirty_rectangle (surface->target, + rect.x + surface->extents.x, + rect.y + surface->extents.y, + rect.width, rect.height); + } + } + + return status; +} + +static cairo_bool_t +_cairo_surface_subsurface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + + extents->x = 0; + extents->y = 0; + extents->width = surface->extents.width; + extents->height = surface->extents.height; + + return TRUE; +} + +static void +_cairo_surface_subsurface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + + if (surface->target->backend->get_font_options != NULL) + surface->target->backend->get_font_options (surface->target, options); +} + +static cairo_surface_t * +_cairo_surface_subsurface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_surface_t *source; + + source = _cairo_surface_get_source (surface->target, extents); + if (extents) + *extents = surface->extents; + + return source; +} + +static cairo_status_t +_cairo_surface_subsurface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **extra_out) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_surface_pattern_t pattern; + cairo_surface_t *image; + cairo_status_t status; + + image = _cairo_image_surface_create_with_content (surface->base.content, + surface->extents.width, + surface->extents.height); + if (unlikely (image->status)) + return image->status; + + _cairo_pattern_init_for_surface (&pattern, surface->target); + cairo_matrix_init_translate (&pattern.base.matrix, + surface->extents.x, + surface->extents.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (image, + CAIRO_OPERATOR_SOURCE, + &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + if (unlikely (status)) { + cairo_surface_destroy (image); + return status; + } + + *image_out = (cairo_image_surface_t *)image; + *extra_out = NULL; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_surface_subsurface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *abstract_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_surface_t * +_cairo_surface_subsurface_snapshot (void *abstract_surface) +{ + cairo_surface_subsurface_t *surface = abstract_surface; + cairo_surface_pattern_t pattern; + cairo_surface_t *clone; + cairo_status_t status; + + TRACE ((stderr, "%s: target=%d\n", __FUNCTION__, surface->target->unique_id)); + + clone = _cairo_surface_create_scratch (surface->target, + surface->target->content, + surface->extents.width, + surface->extents.height, + NULL); + if (unlikely (clone->status)) + return clone; + + _cairo_pattern_init_for_surface (&pattern, surface->target); + cairo_matrix_init_translate (&pattern.base.matrix, + surface->extents.x, surface->extents.y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (clone, + CAIRO_OPERATOR_SOURCE, + &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (clone); + clone = _cairo_surface_create_in_error (status); + } + + return clone; +} + +static cairo_t * +_cairo_surface_subsurface_create_context(void *target) +{ + cairo_surface_subsurface_t *surface = target; + return surface->target->backend->create_context (&surface->base); +} + +static const cairo_surface_backend_t _cairo_surface_subsurface_backend = { + CAIRO_SURFACE_TYPE_SUBSURFACE, + _cairo_surface_subsurface_finish, + + _cairo_surface_subsurface_create_context, + + _cairo_surface_subsurface_create_similar, + _cairo_surface_subsurface_create_similar_image, + _cairo_surface_subsurface_map_to_image, + _cairo_surface_subsurface_unmap_image, + + _cairo_surface_subsurface_source, + _cairo_surface_subsurface_acquire_source_image, + _cairo_surface_subsurface_release_source_image, + _cairo_surface_subsurface_snapshot, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_surface_subsurface_get_extents, + _cairo_surface_subsurface_get_font_options, + + _cairo_surface_subsurface_flush, + _cairo_surface_subsurface_mark_dirty, + + _cairo_surface_subsurface_paint, + _cairo_surface_subsurface_mask, + _cairo_surface_subsurface_stroke, + _cairo_surface_subsurface_fill, + NULL, /* fill/stroke */ + _cairo_surface_subsurface_glyphs, +}; + +/** + * cairo_surface_create_for_rectangle: + * @target: an existing surface for which the sub-surface will point to + * @x: the x-origin of the sub-surface from the top-left of the target surface (in device-space units) + * @y: the y-origin of the sub-surface from the top-left of the target surface (in device-space units) + * @width: width of the sub-surface (in device-space units) + * @height: height of the sub-surface (in device-space units) + * + * Create a new surface that is a rectangle within the target surface. + * All operations drawn to this surface are then clipped and translated + * onto the target surface. Nothing drawn via this sub-surface outside of + * its bounds is drawn onto the target surface, making this a useful method + * for passing constrained child surfaces to library routines that draw + * directly onto the parent surface, i.e. with no further backend allocations, + * double buffering or copies. + * + * The semantics of subsurfaces have not been finalized yet + * unless the rectangle is in full device units, is contained within + * the extents of the target surface, and the target or subsurface's + * device transforms are not changed. + * + * Return value: a pointer to the newly allocated surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if @other is already in an error state + * or any other error occurs. + * + * Since: 1.10 + **/ +cairo_surface_t * +cairo_surface_create_for_rectangle (cairo_surface_t *target, + double x, double y, + double width, double height) +{ + cairo_surface_subsurface_t *surface; + + if (unlikely (width < 0 || height < 0)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + if (unlikely (target->status)) + return _cairo_surface_create_in_error (target->status); + if (unlikely (target->finished)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + surface = malloc (sizeof (cairo_surface_subsurface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + x *= target->device_transform.xx; + y *= target->device_transform.yy; + + width *= target->device_transform.xx; + height *= target->device_transform.yy; + + x += target->device_transform.x0; + y += target->device_transform.y0; + + _cairo_surface_init (&surface->base, + &_cairo_surface_subsurface_backend, + NULL, /* device */ + target->content); + + /* XXX forced integer alignment */ + surface->extents.x = ceil (x); + surface->extents.y = ceil (y); + surface->extents.width = floor (x + width) - surface->extents.x; + surface->extents.height = floor (y + height) - surface->extents.y; + if ((surface->extents.width | surface->extents.height) < 0) + surface->extents.width = surface->extents.height = 0; + + if (target->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + /* Maintain subsurfaces as 1-depth */ + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) target; + surface->extents.x += sub->extents.x; + surface->extents.y += sub->extents.y; + target = sub->target; + } + + surface->target = cairo_surface_reference (target); + surface->base.type = surface->target->type; + + surface->snapshot = NULL; + + cairo_surface_set_device_scale (&surface->base, + target->device_transform.xx, + target->device_transform.yy); + + return &surface->base; +} + +cairo_surface_t * +_cairo_surface_create_for_rectangle_int (cairo_surface_t *target, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_subsurface_t *surface; + + if (unlikely (target->status)) + return _cairo_surface_create_in_error (target->status); + if (unlikely (target->finished)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + assert (target->backend->type != CAIRO_SURFACE_TYPE_SUBSURFACE); + + surface = malloc (sizeof (cairo_surface_subsurface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_surface_subsurface_backend, + NULL, /* device */ + target->content); + + surface->extents = *extents; + surface->extents.x *= target->device_transform.xx; + surface->extents.y *= target->device_transform.yy; + surface->extents.width *= target->device_transform.xx; + surface->extents.height *= target->device_transform.yy; + surface->extents.x += target->device_transform.x0; + surface->extents.y += target->device_transform.y0; + + surface->target = cairo_surface_reference (target); + surface->base.type = surface->target->type; + + surface->snapshot = NULL; + + cairo_surface_set_device_scale (&surface->base, + target->device_transform.xx, + target->device_transform.yy); + + return &surface->base; +} +/* XXX observe mark-dirty */ + +static void +_cairo_surface_subsurface_detach_snapshot (cairo_surface_t *surface) +{ + cairo_surface_subsurface_t *ss = (cairo_surface_subsurface_t *) surface; + + TRACE ((stderr, "%s: target=%d\n", __FUNCTION__, ss->target->unique_id)); + + cairo_surface_destroy (ss->snapshot); + ss->snapshot = NULL; +} + +void +_cairo_surface_subsurface_set_snapshot (cairo_surface_t *surface, + cairo_surface_t *snapshot) +{ + cairo_surface_subsurface_t *ss = (cairo_surface_subsurface_t *) surface; + + TRACE ((stderr, "%s: target=%d, snapshot=%d\n", __FUNCTION__, + ss->target->unique_id, snapshot->unique_id)); + + /* FIXME: attaching the subsurface as a snapshot to its target creates + * a reference cycle. Let's make this call as a no-op until that bug + * is fixed. + */ + return; + + if (ss->snapshot) + _cairo_surface_detach_snapshot (ss->snapshot); + + ss->snapshot = cairo_surface_reference (snapshot); + + _cairo_surface_attach_snapshot (ss->target, &ss->base, + _cairo_surface_subsurface_detach_snapshot); +} diff --git a/src/cairo-surface-wrapper-private.h b/src/cairo-surface-wrapper-private.h new file mode 100644 index 000000000..6529ebc11 --- /dev/null +++ b/src/cairo-surface-wrapper-private.h @@ -0,0 +1,193 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SURFACE_WRAPPER_PRIVATE_H +#define CAIRO_SURFACE_WRAPPER_PRIVATE_H + +#include "cairoint.h" +#include "cairo-types-private.h" +#include "cairo-surface-backend-private.h" + +CAIRO_BEGIN_DECLS + +struct _cairo_surface_wrapper { + cairo_surface_t *target; + + cairo_matrix_t transform; + + cairo_bool_t has_extents; + cairo_rectangle_int_t extents; + const cairo_clip_t *clip; + + cairo_bool_t needs_transform; +}; + +cairo_private void +_cairo_surface_wrapper_init (cairo_surface_wrapper_t *wrapper, + cairo_surface_t *target); + +cairo_private void +_cairo_surface_wrapper_intersect_extents (cairo_surface_wrapper_t *wrapper, + const cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_surface_wrapper_set_inverse_transform (cairo_surface_wrapper_t *wrapper, + const cairo_matrix_t *transform); + +cairo_private void +_cairo_surface_wrapper_set_clip (cairo_surface_wrapper_t *wrapper, + const cairo_clip_t *clip); + +cairo_private void +_cairo_surface_wrapper_fini (cairo_surface_wrapper_t *wrapper); + +static inline cairo_bool_t +_cairo_surface_wrapper_has_fill_stroke (cairo_surface_wrapper_t *wrapper) +{ + return wrapper->target->backend->fill_stroke != NULL; +} + +cairo_private cairo_status_t +_cairo_surface_wrapper_acquire_source_image (cairo_surface_wrapper_t *wrapper, + cairo_image_surface_t **image_out, + void **image_extra); + +cairo_private void +_cairo_surface_wrapper_release_source_image (cairo_surface_wrapper_t *wrapper, + cairo_image_surface_t *image, + void *image_extra); + + +cairo_private cairo_status_t +_cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + const cairo_path_fixed_t*path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + +cairo_private cairo_surface_t * +_cairo_surface_wrapper_create_similar (cairo_surface_wrapper_t *wrapper, + cairo_content_t content, + int width, + int height); +cairo_private cairo_bool_t +_cairo_surface_wrapper_get_extents (cairo_surface_wrapper_t *wrapper, + cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_surface_wrapper_get_font_options (cairo_surface_wrapper_t *wrapper, + cairo_font_options_t *options); + +cairo_private cairo_surface_t * +_cairo_surface_wrapper_snapshot (cairo_surface_wrapper_t *wrapper); + +cairo_private cairo_bool_t +_cairo_surface_wrapper_has_show_text_glyphs (cairo_surface_wrapper_t *wrapper); + +static inline cairo_bool_t +_cairo_surface_wrapper_is_active (cairo_surface_wrapper_t *wrapper) +{ + return wrapper->target != (cairo_surface_t *) 0; +} + +cairo_private cairo_bool_t +_cairo_surface_wrapper_get_target_extents (cairo_surface_wrapper_t *wrapper, + cairo_rectangle_int_t *extents); + +CAIRO_END_DECLS + +#endif /* CAIRO_SURFACE_WRAPPER_PRIVATE_H */ diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c new file mode 100644 index 000000000..9236c8bf4 --- /dev/null +++ b/src/cairo-surface-wrapper.c @@ -0,0 +1,685 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * Copyright © 2007 Adrian Johnson + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-clip-inline.h" +#include "cairo-error-private.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-wrapper-private.h" + +/* A collection of routines to facilitate surface wrapping */ + +static void +_copy_transformed_pattern (cairo_pattern_t *pattern, + const cairo_pattern_t *original, + const cairo_matrix_t *ctm_inverse) +{ + _cairo_pattern_init_static_copy (pattern, original); + + if (! _cairo_matrix_is_identity (ctm_inverse)) + _cairo_pattern_transform (pattern, ctm_inverse); +} + +cairo_status_t +_cairo_surface_wrapper_acquire_source_image (cairo_surface_wrapper_t *wrapper, + cairo_image_surface_t **image_out, + void **image_extra) +{ + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + return _cairo_surface_acquire_source_image (wrapper->target, + image_out, image_extra); +} + +void +_cairo_surface_wrapper_release_source_image (cairo_surface_wrapper_t *wrapper, + cairo_image_surface_t *image, + void *image_extra) +{ + _cairo_surface_release_source_image (wrapper->target, image, image_extra); +} + +static void +_cairo_surface_wrapper_get_transform (cairo_surface_wrapper_t *wrapper, + cairo_matrix_t *m) +{ + cairo_matrix_init_identity (m); + + if (wrapper->has_extents && (wrapper->extents.x || wrapper->extents.y)) + cairo_matrix_translate (m, -wrapper->extents.x, -wrapper->extents.y); + + if (! _cairo_matrix_is_identity (&wrapper->transform)) + cairo_matrix_multiply (m, &wrapper->transform, m); + + if (! _cairo_matrix_is_identity (&wrapper->target->device_transform)) + cairo_matrix_multiply (m, &wrapper->target->device_transform, m); +} + +static void +_cairo_surface_wrapper_get_inverse_transform (cairo_surface_wrapper_t *wrapper, + cairo_matrix_t *m) +{ + cairo_matrix_init_identity (m); + + if (! _cairo_matrix_is_identity (&wrapper->target->device_transform_inverse)) + cairo_matrix_multiply (m, &wrapper->target->device_transform_inverse, m); + + if (! _cairo_matrix_is_identity (&wrapper->transform)) { + cairo_matrix_t inv; + cairo_status_t status; + + inv = wrapper->transform; + status = cairo_matrix_invert (&inv); + assert (status == CAIRO_STATUS_SUCCESS); + cairo_matrix_multiply (m, &inv, m); + } + + if (wrapper->has_extents && (wrapper->extents.x || wrapper->extents.y)) + cairo_matrix_translate (m, wrapper->extents.x, wrapper->extents.y); +} + +static cairo_clip_t * +_cairo_surface_wrapper_get_clip (cairo_surface_wrapper_t *wrapper, + const cairo_clip_t *clip) +{ + cairo_clip_t *copy; + + copy = _cairo_clip_copy (clip); + if (wrapper->has_extents) { + copy = _cairo_clip_intersect_rectangle (copy, &wrapper->extents); + } + copy = _cairo_clip_transform (copy, &wrapper->transform); + if (! _cairo_matrix_is_identity (&wrapper->target->device_transform)) + copy = _cairo_clip_transform (copy, &wrapper->target->device_transform); + if (wrapper->clip) + copy = _cairo_clip_intersect_clip (copy, wrapper->clip); + + return copy; +} + +cairo_status_t +_cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_clip_t *dev_clip; + cairo_pattern_union_t source_copy; + + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip); + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (wrapper->needs_transform) { + cairo_matrix_t m; + + _cairo_surface_wrapper_get_transform (wrapper, &m); + + status = cairo_matrix_invert (&m); + assert (status == CAIRO_STATUS_SUCCESS); + + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + } + + status = _cairo_surface_paint (wrapper->target, op, source, dev_clip); + + _cairo_clip_destroy (dev_clip); + return status; +} + + +cairo_status_t +_cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_clip_t *dev_clip; + cairo_pattern_union_t source_copy; + cairo_pattern_union_t mask_copy; + + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip); + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (wrapper->needs_transform) { + cairo_matrix_t m; + + _cairo_surface_wrapper_get_transform (wrapper, &m); + + status = cairo_matrix_invert (&m); + assert (status == CAIRO_STATUS_SUCCESS); + + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + + _copy_transformed_pattern (&mask_copy.base, mask, &m); + mask = &mask_copy.base; + } + + status = _cairo_surface_mask (wrapper->target, op, source, mask, dev_clip); + + _cairo_clip_destroy (dev_clip); + return status; +} + +cairo_status_t +_cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; + cairo_clip_t *dev_clip; + cairo_matrix_t dev_ctm = *ctm; + cairo_matrix_t dev_ctm_inverse = *ctm_inverse; + cairo_pattern_union_t source_copy; + + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip); + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (wrapper->needs_transform) { + cairo_matrix_t m; + + _cairo_surface_wrapper_get_transform (wrapper, &m); + + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); + if (unlikely (status)) + goto FINISH; + + _cairo_path_fixed_transform (&path_copy, &m); + dev_path = &path_copy; + + cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m); + + status = cairo_matrix_invert (&m); + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_multiply (&dev_ctm_inverse, &m, &dev_ctm_inverse); + + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + } + + status = _cairo_surface_stroke (wrapper->target, op, source, + dev_path, stroke_style, + &dev_ctm, &dev_ctm_inverse, + tolerance, antialias, + dev_clip); + + FINISH: + if (dev_path != path) + _cairo_path_fixed_fini (dev_path); + _cairo_clip_destroy (dev_clip); + return status; +} + +cairo_status_t +_cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + const cairo_path_fixed_t*path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *)path; + cairo_matrix_t dev_ctm = *stroke_ctm; + cairo_matrix_t dev_ctm_inverse = *stroke_ctm_inverse; + cairo_clip_t *dev_clip; + cairo_pattern_union_t stroke_source_copy; + cairo_pattern_union_t fill_source_copy; + + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip); + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (wrapper->needs_transform) { + cairo_matrix_t m; + + _cairo_surface_wrapper_get_transform (wrapper, &m); + + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); + if (unlikely (status)) + goto FINISH; + + _cairo_path_fixed_transform (&path_copy, &m); + dev_path = &path_copy; + + cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m); + + status = cairo_matrix_invert (&m); + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_multiply (&dev_ctm_inverse, &m, &dev_ctm_inverse); + + _copy_transformed_pattern (&stroke_source_copy.base, stroke_source, &m); + stroke_source = &stroke_source_copy.base; + + _copy_transformed_pattern (&fill_source_copy.base, fill_source, &m); + fill_source = &fill_source_copy.base; + } + + status = _cairo_surface_fill_stroke (wrapper->target, + fill_op, fill_source, fill_rule, + fill_tolerance, fill_antialias, + dev_path, + stroke_op, stroke_source, + stroke_style, + &dev_ctm, &dev_ctm_inverse, + stroke_tolerance, stroke_antialias, + dev_clip); + + FINISH: + if (dev_path != path) + _cairo_path_fixed_fini (dev_path); + _cairo_clip_destroy (dev_clip); + return status; +} + +cairo_status_t +_cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; + cairo_pattern_union_t source_copy; + cairo_clip_t *dev_clip; + + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip); + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + if (wrapper->needs_transform) { + cairo_matrix_t m; + + _cairo_surface_wrapper_get_transform (wrapper, &m); + + status = _cairo_path_fixed_init_copy (&path_copy, dev_path); + if (unlikely (status)) + goto FINISH; + + _cairo_path_fixed_transform (&path_copy, &m); + dev_path = &path_copy; + + status = cairo_matrix_invert (&m); + assert (status == CAIRO_STATUS_SUCCESS); + + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + } + + status = _cairo_surface_fill (wrapper->target, op, source, + dev_path, fill_rule, + tolerance, antialias, + dev_clip); + + FINISH: + if (dev_path != path) + _cairo_path_fixed_fini (dev_path); + _cairo_clip_destroy (dev_clip); + return status; +} + +cairo_status_t +_cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_clip_t *dev_clip; + cairo_glyph_t stack_glyphs [CAIRO_STACK_ARRAY_LENGTH(cairo_glyph_t)]; + cairo_glyph_t *dev_glyphs = stack_glyphs; + cairo_scaled_font_t *dev_scaled_font = scaled_font; + cairo_pattern_union_t source_copy; + cairo_font_options_t options; + + if (unlikely (wrapper->target->status)) + return wrapper->target->status; + + dev_clip = _cairo_surface_wrapper_get_clip (wrapper, clip); + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + cairo_surface_get_font_options (wrapper->target, &options); + cairo_font_options_merge (&options, &scaled_font->options); + + if (wrapper->needs_transform) { + cairo_matrix_t m; + int i; + + _cairo_surface_wrapper_get_transform (wrapper, &m); + + if (! _cairo_matrix_is_translation (&m)) { + cairo_matrix_t ctm; + + _cairo_matrix_multiply (&ctm, + &m, + &scaled_font->ctm); + dev_scaled_font = cairo_scaled_font_create (scaled_font->font_face, + &scaled_font->font_matrix, + &ctm, &options); + } + + if (num_glyphs > ARRAY_LENGTH (stack_glyphs)) { + dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unlikely (dev_glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FINISH; + } + } + + for (i = 0; i < num_glyphs; i++) { + dev_glyphs[i] = glyphs[i]; + cairo_matrix_transform_point (&m, + &dev_glyphs[i].x, + &dev_glyphs[i].y); + } + + status = cairo_matrix_invert (&m); + assert (status == CAIRO_STATUS_SUCCESS); + + _copy_transformed_pattern (&source_copy.base, source, &m); + source = &source_copy.base; + } else { + if (! cairo_font_options_equal (&options, &scaled_font->options)) { + dev_scaled_font = cairo_scaled_font_create (scaled_font->font_face, + &scaled_font->font_matrix, + &scaled_font->ctm, + &options); + } + + /* show_text_glyphs is special because _cairo_surface_show_text_glyphs is allowed + * to modify the glyph array that's passed in. We must always + * copy the array before handing it to the backend. + */ + if (num_glyphs > ARRAY_LENGTH (stack_glyphs)) { + dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unlikely (dev_glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FINISH; + } + } + + memcpy (dev_glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); + } + + status = _cairo_surface_show_text_glyphs (wrapper->target, op, source, + utf8, utf8_len, + dev_glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags, + dev_scaled_font, + dev_clip); + FINISH: + _cairo_clip_destroy (dev_clip); + if (dev_glyphs != stack_glyphs) + free (dev_glyphs); + if (dev_scaled_font != scaled_font) + cairo_scaled_font_destroy (dev_scaled_font); + return status; +} + +cairo_surface_t * +_cairo_surface_wrapper_create_similar (cairo_surface_wrapper_t *wrapper, + cairo_content_t content, + int width, + int height) +{ + return _cairo_surface_create_scratch (wrapper->target, + content, width, height, NULL); +} + +cairo_bool_t +_cairo_surface_wrapper_get_extents (cairo_surface_wrapper_t *wrapper, + cairo_rectangle_int_t *extents) +{ + if (wrapper->has_extents) { + if (_cairo_surface_get_extents (wrapper->target, extents)) + _cairo_rectangle_intersect (extents, &wrapper->extents); + else + *extents = wrapper->extents; + + return TRUE; + } else { + return _cairo_surface_get_extents (wrapper->target, extents); + } +} + +static cairo_bool_t +_cairo_surface_wrapper_needs_device_transform (cairo_surface_wrapper_t *wrapper) +{ + return + (wrapper->has_extents && (wrapper->extents.x | wrapper->extents.y)) || + ! _cairo_matrix_is_identity (&wrapper->transform) || + ! _cairo_matrix_is_identity (&wrapper->target->device_transform); +} + +void +_cairo_surface_wrapper_intersect_extents (cairo_surface_wrapper_t *wrapper, + const cairo_rectangle_int_t *extents) +{ + if (! wrapper->has_extents) { + wrapper->extents = *extents; + wrapper->has_extents = TRUE; + } else + _cairo_rectangle_intersect (&wrapper->extents, extents); + + wrapper->needs_transform = + _cairo_surface_wrapper_needs_device_transform (wrapper); +} + +void +_cairo_surface_wrapper_set_inverse_transform (cairo_surface_wrapper_t *wrapper, + const cairo_matrix_t *transform) +{ + cairo_status_t status; + + if (transform == NULL || _cairo_matrix_is_identity (transform)) { + cairo_matrix_init_identity (&wrapper->transform); + + wrapper->needs_transform = + _cairo_surface_wrapper_needs_device_transform (wrapper); + } else { + wrapper->transform = *transform; + status = cairo_matrix_invert (&wrapper->transform); + /* should always be invertible unless given pathological input */ + assert (status == CAIRO_STATUS_SUCCESS); + + wrapper->needs_transform = TRUE; + } +} + +void +_cairo_surface_wrapper_set_clip (cairo_surface_wrapper_t *wrapper, + const cairo_clip_t *clip) +{ + wrapper->clip = clip; +} + +void +_cairo_surface_wrapper_get_font_options (cairo_surface_wrapper_t *wrapper, + cairo_font_options_t *options) +{ + cairo_surface_get_font_options (wrapper->target, options); +} + +cairo_surface_t * +_cairo_surface_wrapper_snapshot (cairo_surface_wrapper_t *wrapper) +{ + if (wrapper->target->backend->snapshot) + return wrapper->target->backend->snapshot (wrapper->target); + + return NULL; +} + +cairo_bool_t +_cairo_surface_wrapper_has_show_text_glyphs (cairo_surface_wrapper_t *wrapper) +{ + return cairo_surface_has_show_text_glyphs (wrapper->target); +} + +void +_cairo_surface_wrapper_init (cairo_surface_wrapper_t *wrapper, + cairo_surface_t *target) +{ + wrapper->target = cairo_surface_reference (target); + cairo_matrix_init_identity (&wrapper->transform); + wrapper->has_extents = FALSE; + wrapper->extents.x = wrapper->extents.y = 0; + wrapper->clip = NULL; + + wrapper->needs_transform = FALSE; + if (target) { + wrapper->needs_transform = + ! _cairo_matrix_is_identity (&target->device_transform); + } +} + +void +_cairo_surface_wrapper_fini (cairo_surface_wrapper_t *wrapper) +{ + cairo_surface_destroy (wrapper->target); +} + +cairo_bool_t +_cairo_surface_wrapper_get_target_extents (cairo_surface_wrapper_t *wrapper, + cairo_rectangle_int_t *extents) +{ + cairo_rectangle_int_t clip; + cairo_bool_t has_clip; + + has_clip = _cairo_surface_get_extents (wrapper->target, &clip); + if (wrapper->clip) { + if (has_clip) { + if (! _cairo_rectangle_intersect (&clip, + _cairo_clip_get_extents (wrapper->clip))) + return FALSE; + } else { + has_clip = TRUE; + clip = *_cairo_clip_get_extents (wrapper->clip); + } + } + + if (has_clip && wrapper->needs_transform) { + cairo_matrix_t m; + double x1, y1, x2, y2; + + _cairo_surface_wrapper_get_inverse_transform (wrapper, &m); + + x1 = clip.x; + y1 = clip.y; + x2 = clip.x + clip.width; + y2 = clip.y + clip.height; + + _cairo_matrix_transform_bounding_box (&m, &x1, &y1, &x2, &y2, NULL); + + clip.x = floor (x1); + clip.y = floor (y1); + clip.width = ceil (x2) - clip.x; + clip.height = ceil (y2) - clip.y; + } + + if (has_clip) { + if (wrapper->has_extents) { + *extents = wrapper->extents; + return _cairo_rectangle_intersect (extents, &clip); + } else { + *extents = clip; + return TRUE; + } + } else if (wrapper->has_extents) { + *extents = wrapper->extents; + return TRUE; + } else { + _cairo_unbounded_rectangle_init (extents); + return TRUE; + } +} diff --git a/src/cairo-surface.c b/src/cairo-surface.c new file mode 100644 index 000000000..89345f593 --- /dev/null +++ b/src/cairo-surface.c @@ -0,0 +1,2749 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-damage-private.h" +#include "cairo-device-private.h" +#include "cairo-error-private.h" +#include "cairo-list-inline.h" +#include "cairo-image-surface-inline.h" +#include "cairo-recording-surface-private.h" +#include "cairo-region-private.h" +#include "cairo-surface-inline.h" +#include "cairo-tee-surface-private.h" + +/** + * SECTION:cairo-surface + * @Title: cairo_surface_t + * @Short_Description: Base class for surfaces + * @See_Also: #cairo_t, #cairo_pattern_t + * + * #cairo_surface_t is the abstract type representing all different drawing + * targets that cairo can render to. The actual drawings are + * performed using a cairo context. + * + * A cairo surface is created by using backend-specific + * constructors, typically of the form + * cairo_backend_surface_create(). + * + * Most surface types allow accessing the surface without using Cairo + * functions. If you do this, keep in mind that it is mandatory that you call + * cairo_surface_flush() before reading from or writing to the surface and that + * you must use cairo_surface_mark_dirty() after modifying it. + * + * Directly modifying an image surface + * + * void + * modify_image_surface (cairo_surface_t *surface) + * { + * unsigned char *data; + * int width, height, stride; + * + * // flush to ensure all writing to the image was done + * cairo_surface_flush (surface); + * + * // modify the image + * data = cairo_image_surface_get_data (surface); + * width = cairo_image_surface_get_width (surface); + * height = cairo_image_surface_get_height (surface); + * stride = cairo_image_surface_get_stride (surface); + * modify_image_data (data, width, height, stride); + * + * // mark the image dirty so Cairo clears its caches. + * cairo_surface_mark_dirty (surface); + * } + * + * + * Note that for other surface types it might be necessary to acquire the + * surface's device first. See cairo_device_acquire() for a discussion of + * devices. + **/ + +#define DEFINE_NIL_SURFACE(status, name) \ +const cairo_surface_t name = { \ + NULL, /* backend */ \ + NULL, /* device */ \ + CAIRO_SURFACE_TYPE_IMAGE, /* type */ \ + CAIRO_CONTENT_COLOR, /* content */ \ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \ + status, /* status */ \ + 0, /* unique id */ \ + 0, /* serial */ \ + NULL, /* damage */ \ + FALSE, /* _finishing */ \ + FALSE, /* finished */ \ + TRUE, /* is_clear */ \ + FALSE, /* has_font_options */ \ + FALSE, /* owns_device */ \ + { 0, 0, 0, NULL, }, /* user_data */ \ + { 0, 0, 0, NULL, }, /* mime_data */ \ + { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform */ \ + { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform_inverse */ \ + { NULL, NULL }, /* device_transform_observers */ \ + 0.0, /* x_resolution */ \ + 0.0, /* y_resolution */ \ + 0.0, /* x_fallback_resolution */ \ + 0.0, /* y_fallback_resolution */ \ + NULL, /* snapshot_of */ \ + NULL, /* snapshot_detach */ \ + { NULL, NULL }, /* snapshots */ \ + { NULL, NULL }, /* snapshot */ \ + { CAIRO_ANTIALIAS_DEFAULT, /* antialias */ \ + CAIRO_SUBPIXEL_ORDER_DEFAULT, /* subpixel_order */ \ + CAIRO_LCD_FILTER_DEFAULT, /* lcd_filter */ \ + CAIRO_HINT_STYLE_DEFAULT, /* hint_style */ \ + CAIRO_HINT_METRICS_DEFAULT, /* hint_metrics */ \ + CAIRO_ROUND_GLYPH_POS_DEFAULT /* round_glyph_positions */ \ + } /* font_options */ \ +} + +/* XXX error object! */ + +static DEFINE_NIL_SURFACE(CAIRO_STATUS_NO_MEMORY, _cairo_surface_nil); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_SURFACE_TYPE_MISMATCH, _cairo_surface_nil_surface_type_mismatch); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_STATUS, _cairo_surface_nil_invalid_status); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_CONTENT, _cairo_surface_nil_invalid_content); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_FORMAT, _cairo_surface_nil_invalid_format); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_VISUAL, _cairo_surface_nil_invalid_visual); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_FILE_NOT_FOUND, _cairo_surface_nil_file_not_found); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_TEMP_FILE_ERROR, _cairo_surface_nil_temp_file_error); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_READ_ERROR, _cairo_surface_nil_read_error); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_WRITE_ERROR, _cairo_surface_nil_write_error); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_STRIDE, _cairo_surface_nil_invalid_stride); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_SIZE, _cairo_surface_nil_invalid_size); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_DEVICE_TYPE_MISMATCH, _cairo_surface_nil_device_type_mismatch); +static DEFINE_NIL_SURFACE(CAIRO_STATUS_DEVICE_ERROR, _cairo_surface_nil_device_error); + +static DEFINE_NIL_SURFACE(CAIRO_INT_STATUS_UNSUPPORTED, _cairo_surface_nil_unsupported); +static DEFINE_NIL_SURFACE(CAIRO_INT_STATUS_NOTHING_TO_DO, _cairo_surface_nil_nothing_to_do); + +static void _cairo_surface_finish_snapshots (cairo_surface_t *surface); +static void _cairo_surface_finish (cairo_surface_t *surface); + +/** + * _cairo_surface_set_error: + * @surface: a surface + * @status: a status value indicating an error + * + * Atomically sets surface->status to @status and calls _cairo_error; + * Does nothing if status is %CAIRO_STATUS_SUCCESS or any of the internal + * status values. + * + * All assignments of an error status to surface->status should happen + * through _cairo_surface_set_error(). Note that due to the nature of + * the atomic operation, it is not safe to call this function on the + * nil objects. + * + * The purpose of this function is to allow the user to set a + * breakpoint in _cairo_error() to generate a stack trace for when the + * user causes cairo to detect an error. + * + * Return value: the error status. + **/ +cairo_int_status_t +_cairo_surface_set_error (cairo_surface_t *surface, + cairo_int_status_t status) +{ + /* NOTHING_TO_DO is magic. We use it to break out of the inner-most + * surface function, but anything higher just sees "success". + */ + if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) + status = CAIRO_INT_STATUS_SUCCESS; + + if (status == CAIRO_INT_STATUS_SUCCESS || + status >= (int)CAIRO_INT_STATUS_LAST_STATUS) + return status; + + /* Don't overwrite an existing error. This preserves the first + * error, which is the most significant. */ + _cairo_status_set_error (&surface->status, (cairo_status_t)status); + + return _cairo_error (status); +} + +/** + * cairo_surface_get_type: + * @surface: a #cairo_surface_t + * + * This function returns the type of the backend used to create + * a surface. See #cairo_surface_type_t for available types. + * + * Return value: The type of @surface. + * + * Since: 1.2 + **/ +cairo_surface_type_t +cairo_surface_get_type (cairo_surface_t *surface) +{ + /* We don't use surface->backend->type here so that some of the + * special "wrapper" surfaces such as cairo_paginated_surface_t + * can override surface->type with the type of the "child" + * surface. */ + return surface->type; +} + +/** + * cairo_surface_get_content: + * @surface: a #cairo_surface_t + * + * This function returns the content type of @surface which indicates + * whether the surface contains color and/or alpha information. See + * #cairo_content_t. + * + * Return value: The content type of @surface. + * + * Since: 1.2 + **/ +cairo_content_t +cairo_surface_get_content (cairo_surface_t *surface) +{ + return surface->content; +} + +/** + * cairo_surface_status: + * @surface: a #cairo_surface_t + * + * Checks whether an error has previously occurred for this + * surface. + * + * Return value: %CAIRO_STATUS_SUCCESS, %CAIRO_STATUS_NULL_POINTER, + * %CAIRO_STATUS_NO_MEMORY, %CAIRO_STATUS_READ_ERROR, + * %CAIRO_STATUS_INVALID_CONTENT, %CAIRO_STATUS_INVALID_FORMAT, or + * %CAIRO_STATUS_INVALID_VISUAL. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_surface_status (cairo_surface_t *surface) +{ + return surface->status; +} +slim_hidden_def (cairo_surface_status); + +static unsigned int +_cairo_surface_allocate_unique_id (void) +{ + static cairo_atomic_int_t unique_id; + +#if CAIRO_NO_MUTEX + if (++unique_id == 0) + unique_id = 1; + return unique_id; +#else + cairo_atomic_int_t old, id; + + do { + old = _cairo_atomic_uint_get (&unique_id); + id = old + 1; + if (id == 0) + id = 1; + } while (! _cairo_atomic_uint_cmpxchg (&unique_id, old, id)); + + return id; +#endif +} + +/** + * cairo_surface_get_device: + * @surface: a #cairo_surface_t + * + * This function returns the device for a @surface. + * See #cairo_device_t. + * + * Return value: The device for @surface or %NULL if the surface does + * not have an associated device. + * + * Since: 1.10 + **/ +cairo_device_t * +cairo_surface_get_device (cairo_surface_t *surface) +{ + if (unlikely (surface->status)) + return _cairo_device_create_in_error (surface->status); + + return surface->device; +} + +static cairo_bool_t +_cairo_surface_has_snapshots (cairo_surface_t *surface) +{ + return ! cairo_list_is_empty (&surface->snapshots); +} + +static cairo_bool_t +_cairo_surface_has_mime_data (cairo_surface_t *surface) +{ + return surface->mime_data.num_elements != 0; +} + +static void +_cairo_surface_detach_mime_data (cairo_surface_t *surface) +{ + if (! _cairo_surface_has_mime_data (surface)) + return; + + _cairo_user_data_array_fini (&surface->mime_data); + _cairo_user_data_array_init (&surface->mime_data); +} + +static void +_cairo_surface_detach_snapshots (cairo_surface_t *surface) +{ + while (_cairo_surface_has_snapshots (surface)) { + _cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots, + cairo_surface_t, + snapshot)); + } +} + +void +_cairo_surface_detach_snapshot (cairo_surface_t *snapshot) +{ + assert (snapshot->snapshot_of != NULL); + + snapshot->snapshot_of = NULL; + cairo_list_del (&snapshot->snapshot); + + if (snapshot->snapshot_detach != NULL) + snapshot->snapshot_detach (snapshot); + + cairo_surface_destroy (snapshot); +} + +void +_cairo_surface_attach_snapshot (cairo_surface_t *surface, + cairo_surface_t *snapshot, + cairo_surface_func_t detach_func) +{ + assert (surface != snapshot); + assert (snapshot->snapshot_of != surface); + + cairo_surface_reference (snapshot); + + if (snapshot->snapshot_of != NULL) + _cairo_surface_detach_snapshot (snapshot); + + snapshot->snapshot_of = surface; + snapshot->snapshot_detach = detach_func; + + cairo_list_add (&snapshot->snapshot, &surface->snapshots); + + assert (_cairo_surface_has_snapshot (surface, snapshot->backend) == snapshot); +} + +cairo_surface_t * +_cairo_surface_has_snapshot (cairo_surface_t *surface, + const cairo_surface_backend_t *backend) +{ + cairo_surface_t *snapshot; + + cairo_list_foreach_entry (snapshot, cairo_surface_t, + &surface->snapshots, snapshot) + { + if (snapshot->backend == backend) + return snapshot; + } + + return NULL; +} + +cairo_status_t +_cairo_surface_begin_modification (cairo_surface_t *surface) +{ + assert (surface->status == CAIRO_STATUS_SUCCESS); + assert (! surface->finished); + + return _cairo_surface_flush (surface, 1); +} + +void +_cairo_surface_init (cairo_surface_t *surface, + const cairo_surface_backend_t *backend, + cairo_device_t *device, + cairo_content_t content) +{ + CAIRO_MUTEX_INITIALIZE (); + + surface->backend = backend; + surface->device = cairo_device_reference (device); + surface->content = content; + surface->type = backend->type; + + CAIRO_REFERENCE_COUNT_INIT (&surface->ref_count, 1); + surface->status = CAIRO_STATUS_SUCCESS; + surface->unique_id = _cairo_surface_allocate_unique_id (); + surface->finished = FALSE; + surface->_finishing = FALSE; + surface->is_clear = FALSE; + surface->serial = 0; + surface->damage = NULL; + surface->owns_device = (device != NULL); + + _cairo_user_data_array_init (&surface->user_data); + _cairo_user_data_array_init (&surface->mime_data); + + cairo_matrix_init_identity (&surface->device_transform); + cairo_matrix_init_identity (&surface->device_transform_inverse); + cairo_list_init (&surface->device_transform_observers); + + surface->x_resolution = CAIRO_SURFACE_RESOLUTION_DEFAULT; + surface->y_resolution = CAIRO_SURFACE_RESOLUTION_DEFAULT; + + surface->x_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; + surface->y_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; + + cairo_list_init (&surface->snapshots); + surface->snapshot_of = NULL; + + surface->has_font_options = FALSE; +} + +static void +_cairo_surface_copy_similar_properties (cairo_surface_t *surface, + cairo_surface_t *other) +{ + if (other->has_font_options || other->backend != surface->backend) { + cairo_font_options_t options; + + cairo_surface_get_font_options (other, &options); + _cairo_surface_set_font_options (surface, &options); + } + + cairo_surface_set_fallback_resolution (surface, + other->x_fallback_resolution, + other->y_fallback_resolution); +} + +/** + * cairo_surface_create_similar: + * @other: an existing surface used to select the backend of the new surface + * @content: the content for the new surface + * @width: width of the new surface, (in device-space units) + * @height: height of the new surface (in device-space units) + * + * Create a new surface that is as compatible as possible with an + * existing surface. For example the new surface will have the same + * fallback resolution and font options as @other. Generally, the new + * surface will also use the same backend as @other, unless that is + * not possible for some reason. The type of the returned surface may + * be examined with cairo_surface_get_type(). + * + * Initially the surface contents are all 0 (transparent if contents + * have transparency, black otherwise.) + * + * Use cairo_surface_create_similar_image() if you need an image surface + * which can be painted quickly to the target surface. + * + * Return value: a pointer to the newly allocated surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if @other is already in an error state + * or any other error occurs. + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_surface_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, + int height) +{ + cairo_surface_t *surface; + cairo_status_t status; + cairo_solid_pattern_t pattern; + + if (unlikely (other->status)) + return _cairo_surface_create_in_error (other->status); + if (unlikely (other->finished)) + return _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + if (unlikely (width < 0 || height < 0)) + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); + + if (unlikely (! CAIRO_CONTENT_VALID (content))) + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_CONTENT); + + if (unlikely (other->status)) + return _cairo_surface_create_in_error (other->status); + + /* We inherit the device scale, so create a larger surface */ + width = width * other->device_transform.xx; + height = height * other->device_transform.yy; + + surface = NULL; + if (other->backend->create_similar) + surface = other->backend->create_similar (other, content, width, height); + if (surface == NULL) + surface = cairo_surface_create_similar_image (other, + _cairo_format_from_content (content), + width, height); + + if (unlikely (surface->status)) + return surface; + + _cairo_surface_copy_similar_properties (surface, other); + cairo_surface_set_device_scale (surface, + other->device_transform.xx, + other->device_transform.yy); + + if (unlikely (surface->status)) + return surface; + + _cairo_pattern_init_solid (&pattern, CAIRO_COLOR_TRANSPARENT); + status = _cairo_surface_paint (surface, + CAIRO_OPERATOR_CLEAR, + &pattern.base, NULL); + if (unlikely (status)) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + + assert (surface->is_clear); + + return surface; +} + +/** + * cairo_surface_create_similar_image: + * @other: an existing surface used to select the preference of the new surface + * @format: the format for the new surface + * @width: width of the new surface, (in device-space units) + * @height: height of the new surface (in device-space units) + * + * Create a new image surface that is as compatible as possible for uploading + * to and the use in conjunction with an existing surface. However, this surface + * can still be used like any normal image surface. + * + * Initially the surface contents are all 0 (transparent if contents + * have transparency, black otherwise.) + * + * Use cairo_surface_create_similar() if you don't need an image surface. + * + * Return value: a pointer to the newly allocated image surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if @other is already in an error state + * or any other error occurs. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_surface_create_similar_image (cairo_surface_t *other, + cairo_format_t format, + int width, + int height) +{ + cairo_surface_t *image; + + if (unlikely (other->status)) + return _cairo_surface_create_in_error (other->status); + if (unlikely (other->finished)) + return _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + + if (unlikely (width < 0 || height < 0)) + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); + if (unlikely (! CAIRO_FORMAT_VALID (format))) + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_FORMAT); + + image = NULL; + if (other->backend->create_similar_image) + image = other->backend->create_similar_image (other, + format, width, height); + if (image == NULL) + image = cairo_image_surface_create (format, width, height); + + assert (image->is_clear); + + return image; +} +slim_hidden_def (cairo_surface_create_similar_image); + +/** + * _cairo_surface_map_to_image: + * @surface: an existing surface used to extract the image from + * @extents: limit the extraction to an rectangular region + * + * Returns an image surface that is the most efficient mechanism for + * modifying the backing store of the target surface. The region + * retrieved is limited to @extents. + * + * Note, the use of the original surface as a target or source whilst + * it is mapped is undefined. The result of mapping the surface + * multiple times is undefined. Calling cairo_surface_destroy() or + * cairo_surface_finish() on the resulting image surface results in + * undefined behavior. Changing the device transform of the image + * surface or of @surface before the image surface is unmapped results + * in undefined behavior. + * + * Assumes that @surface is valid (CAIRO_STATUS_SUCCESS, + * non-finished). + * + * Return value: a pointer to the newly allocated image surface. The + * caller must use _cairo_surface_unmap_image() to destroy this image + * surface. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if @other is already in an error state + * or any other error occurs. + * + * The returned image might have a %CAIRO_FORMAT_INVALID format. + **/ +cairo_image_surface_t * +_cairo_surface_map_to_image (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_image_surface_t *image = NULL; + + assert (extents != NULL); + + /* TODO: require map_to_image != NULL */ + if (surface->backend->map_to_image) + image = surface->backend->map_to_image (surface, extents); + + if (image == NULL) + image = _cairo_image_surface_clone_subimage (surface, extents); + + return image; +} + +/** + * _cairo_surface_unmap_image: + * @surface: the surface passed to _cairo_surface_map_to_image(). + * @image: the currently mapped image + * + * Unmaps the image surface as returned from + * _cairo_surface_map_to_image(). + * + * The content of the image will be uploaded to the target surface. + * Afterwards, the image is destroyed. + * + * Using an image surface which wasn't returned by + * _cairo_surface_map_to_image() results in undefined behavior. + * + * An image surface in error status can be passed to + * _cairo_surface_unmap_image(). + * + * Return value: the unmap status. + * + * Even if the unmap status is not successful, @image is destroyed. + **/ +cairo_int_status_t +_cairo_surface_unmap_image (cairo_surface_t *surface, + cairo_image_surface_t *image) +{ + cairo_surface_pattern_t pattern; + cairo_rectangle_int_t extents; + cairo_clip_t *clip; + cairo_int_status_t status; + + /* map_to_image can return error surfaces */ + if (unlikely (image->base.status)) { + status = image->base.status; + goto destroy; + } + + /* If the image is untouched just skip the update */ + if (image->base.serial == 0) { + status = CAIRO_STATUS_SUCCESS; + goto destroy; + } + + /* TODO: require unmap_image != NULL */ + if (surface->backend->unmap_image && + ! _cairo_image_surface_is_clone (image)) + { + status = surface->backend->unmap_image (surface, image); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + _cairo_pattern_init_for_surface (&pattern, &image->base); + pattern.base.filter = CAIRO_FILTER_NEAREST; + + /* We have to apply the translate from map_to_image's extents.x and .y */ + cairo_matrix_init_translate (&pattern.base.matrix, + image->base.device_transform.x0, + image->base.device_transform.y0); + + /* And we also have to clip the operation to the image's extents */ + extents.x = image->base.device_transform_inverse.x0; + extents.y = image->base.device_transform_inverse.y0; + extents.width = image->width; + extents.height = image->height; + clip = _cairo_clip_intersect_rectangle (NULL, &extents); + + status = _cairo_surface_paint (surface, + CAIRO_OPERATOR_SOURCE, + &pattern.base, + clip); + + _cairo_pattern_fini (&pattern.base); + _cairo_clip_destroy (clip); + +destroy: + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return status; +} + +/** + * cairo_surface_map_to_image: + * @surface: an existing surface used to extract the image from + * @extents: limit the extraction to an rectangular region + * + * Returns an image surface that is the most efficient mechanism for + * modifying the backing store of the target surface. The region retrieved + * may be limited to the @extents or %NULL for the whole surface + * + * Note, the use of the original surface as a target or source whilst + * it is mapped is undefined. The result of mapping the surface + * multiple times is undefined. Calling cairo_surface_destroy() or + * cairo_surface_finish() on the resulting image surface results in + * undefined behavior. Changing the device transform of the image + * surface or of @surface before the image surface is unmapped results + * in undefined behavior. + * + * Return value: a pointer to the newly allocated image surface. The caller + * must use cairo_surface_unmap_image() to destroy this image surface. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if @other is already in an error state + * or any other error occurs. If the returned pointer does not have an + * error status, it is guaranteed to be an image surface whose format + * is not %CAIRO_FORMAT_INVALID. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_surface_map_to_image (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_rectangle_int_t rect; + cairo_image_surface_t *image; + cairo_status_t status; + + if (unlikely (surface->status)) + return _cairo_surface_create_in_error (surface->status); + if (unlikely (surface->finished)) + return _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + + if (extents == NULL) { + if (unlikely (! surface->backend->get_extents (surface, &rect))) + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); + + extents = ▭ + } else { + cairo_rectangle_int_t surface_extents; + + /* If this surface is bounded, we can't map parts + * that are outside of it. */ + if (likely (surface->backend->get_extents (surface, &surface_extents))) { + if (unlikely (! _cairo_rectangle_contains_rectangle (&surface_extents, extents))) + return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); + } + } + + image = _cairo_surface_map_to_image (surface, extents); + + status = image->base.status; + if (unlikely (status)) { + cairo_surface_destroy (&image->base); + return _cairo_surface_create_in_error (status); + } + + if (image->format == CAIRO_FORMAT_INVALID) { + cairo_surface_destroy (&image->base); + image = _cairo_image_surface_clone_subimage (surface, extents); + } + + return &image->base; +} + +/** + * cairo_surface_unmap_image: + * @surface: the surface passed to cairo_surface_map_to_image(). + * @image: the currently mapped image + * + * Unmaps the image surface as returned from #cairo_surface_map_to_image(). + * + * The content of the image will be uploaded to the target surface. + * Afterwards, the image is destroyed. + * + * Using an image surface which wasn't returned by cairo_surface_map_to_image() + * results in undefined behavior. + * + * Since: 1.12 + **/ +void +cairo_surface_unmap_image (cairo_surface_t *surface, + cairo_surface_t *image) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + + if (unlikely (surface->status)) { + status = surface->status; + goto error; + } + if (unlikely (surface->finished)) { + status = _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + goto error; + } + if (unlikely (image->status)) { + status = image->status; + goto error; + } + if (unlikely (image->finished)) { + status = _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + goto error; + } + if (unlikely (! _cairo_surface_is_image (image))) { + status = _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + goto error; + } + + status = _cairo_surface_unmap_image (surface, + (cairo_image_surface_t *) image); + if (unlikely (status)) + _cairo_surface_set_error (surface, status); + + return; + +error: + _cairo_surface_set_error (surface, status); + cairo_surface_finish (image); + cairo_surface_destroy (image); +} + +cairo_surface_t * +_cairo_surface_create_scratch (cairo_surface_t *other, + cairo_content_t content, + int width, + int height, + const cairo_color_t *color) +{ + cairo_surface_t *surface; + cairo_status_t status; + cairo_solid_pattern_t pattern; + + if (unlikely (other->status)) + return _cairo_surface_create_in_error (other->status); + + surface = NULL; + if (other->backend->create_similar) + surface = other->backend->create_similar (other, content, width, height); + if (surface == NULL) + surface = cairo_surface_create_similar_image (other, + _cairo_format_from_content (content), + width, height); + + if (unlikely (surface->status)) + return surface; + + _cairo_surface_copy_similar_properties (surface, other); + + if (unlikely (surface->status)) + return surface; + + if (color) { + _cairo_pattern_init_solid (&pattern, color); + status = _cairo_surface_paint (surface, + color == CAIRO_COLOR_TRANSPARENT ? + CAIRO_OPERATOR_CLEAR : CAIRO_OPERATOR_SOURCE, + &pattern.base, NULL); + if (unlikely (status)) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + } + + return surface; +} + +/** + * cairo_surface_reference: + * @surface: a #cairo_surface_t + * + * Increases the reference count on @surface by one. This prevents + * @surface from being destroyed until a matching call to + * cairo_surface_destroy() is made. + * + * The number of references to a #cairo_surface_t can be get using + * cairo_surface_get_reference_count(). + * + * Return value: the referenced #cairo_surface_t. + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_surface_reference (cairo_surface_t *surface) +{ + if (surface == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + return surface; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); + + _cairo_reference_count_inc (&surface->ref_count); + + return surface; +} +slim_hidden_def (cairo_surface_reference); + +/** + * cairo_surface_destroy: + * @surface: a #cairo_surface_t + * + * Decreases the reference count on @surface by one. If the result is + * zero, then @surface and all associated resources are freed. See + * cairo_surface_reference(). + * + * Since: 1.0 + **/ +void +cairo_surface_destroy (cairo_surface_t *surface) +{ + if (surface == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&surface->ref_count)) + return; + + assert (surface->snapshot_of == NULL); + + if (! surface->finished) { + _cairo_surface_finish_snapshots (surface); + /* We may have been referenced by a snapshot prior to have + * detaching it with the copy-on-write. + */ + if (CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count)) + return; + + _cairo_surface_finish (surface); + } + + if (surface->damage) + _cairo_damage_destroy (surface->damage); + + _cairo_user_data_array_fini (&surface->user_data); + _cairo_user_data_array_fini (&surface->mime_data); + + if (surface->owns_device) + cairo_device_destroy (surface->device); + + assert (surface->snapshot_of == NULL); + assert (! _cairo_surface_has_snapshots (surface)); + /* paranoid check that nobody took a reference whilst finishing */ + assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); + + free (surface); +} +slim_hidden_def(cairo_surface_destroy); + +/** + * cairo_surface_get_reference_count: + * @surface: a #cairo_surface_t + * + * Returns the current reference count of @surface. + * + * Return value: the current reference count of @surface. If the + * object is a nil object, 0 will be returned. + * + * Since: 1.4 + **/ +unsigned int +cairo_surface_get_reference_count (cairo_surface_t *surface) +{ + if (surface == NULL || + CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + return 0; + + return CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count); +} + +static void +_cairo_surface_finish_snapshots (cairo_surface_t *surface) +{ + cairo_status_t status; + + /* update the snapshots *before* we declare the surface as finished */ + surface->_finishing = TRUE; + status = _cairo_surface_flush (surface, 0); + (void) status; +} + +static void +_cairo_surface_finish (cairo_surface_t *surface) +{ + cairo_status_t status; + + surface->finished = TRUE; + + /* call finish even if in error mode */ + if (surface->backend->finish) { + status = surface->backend->finish (surface); + if (unlikely (status)) + _cairo_surface_set_error (surface, status); + } + + assert (surface->snapshot_of == NULL); + assert (!_cairo_surface_has_snapshots (surface)); +} + +/** + * cairo_surface_finish: + * @surface: the #cairo_surface_t to finish + * + * This function finishes the surface and drops all references to + * external resources. For example, for the Xlib backend it means + * that cairo will no longer access the drawable, which can be freed. + * After calling cairo_surface_finish() the only valid operations on a + * surface are getting and setting user, referencing and + * destroying, and flushing and finishing it. + * Further drawing to the surface will not affect the + * surface but will instead trigger a %CAIRO_STATUS_SURFACE_FINISHED + * error. + * + * When the last call to cairo_surface_destroy() decreases the + * reference count to zero, cairo will call cairo_surface_finish() if + * it hasn't been called already, before freeing the resources + * associated with the surface. + * + * Since: 1.0 + **/ +void +cairo_surface_finish (cairo_surface_t *surface) +{ + if (surface == NULL) + return; + + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + return; + + if (surface->finished) + return; + + /* We have to be careful when decoupling potential reference cycles */ + cairo_surface_reference (surface); + + _cairo_surface_finish_snapshots (surface); + /* XXX need to block and wait for snapshot references */ + _cairo_surface_finish (surface); + + cairo_surface_destroy (surface); +} +slim_hidden_def (cairo_surface_finish); + +/** + * _cairo_surface_release_device_reference: + * @surface: a #cairo_surface_t + * + * This function makes @surface release the reference to its device. The + * function is intended to be used for avoiding cycling references for + * surfaces that are owned by their device, for example cache surfaces. + * Note that the @surface will still assume that the device is available. + * So it is the caller's responsibility to ensure the device stays around + * until the @surface is destroyed. Just calling cairo_surface_finish() is + * not enough. + **/ +void +_cairo_surface_release_device_reference (cairo_surface_t *surface) +{ + assert (surface->owns_device); + + cairo_device_destroy (surface->device); + surface->owns_device = FALSE; +} + +/** + * cairo_surface_get_user_data: + * @surface: a #cairo_surface_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Return user data previously attached to @surface using the specified + * key. If no user data has been attached with the given key this + * function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + * + * Since: 1.0 + **/ +void * +cairo_surface_get_user_data (cairo_surface_t *surface, + const cairo_user_data_key_t *key) +{ + /* Prevent reads of the array during teardown */ + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) + return NULL; + + return _cairo_user_data_array_get_data (&surface->user_data, key); +} + +/** + * cairo_surface_set_user_data: + * @surface: a #cairo_surface_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach to the surface + * @destroy: a #cairo_destroy_func_t which will be called when the + * surface is destroyed or when new user data is attached using the + * same key. + * + * Attach user data to @surface. To remove user data from a surface, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_surface_set_user_data (cairo_surface_t *surface, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + return surface->status; + + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + return _cairo_user_data_array_set_data (&surface->user_data, + key, user_data, destroy); +} + +/** + * cairo_surface_get_mime_data: + * @surface: a #cairo_surface_t + * @mime_type: the mime type of the image data + * @data: the image data to attached to the surface + * @length: the length of the image data + * + * Return mime data previously attached to @surface using the + * specified mime type. If no data has been attached with the given + * mime type, @data is set %NULL. + * + * Since: 1.10 + **/ +void +cairo_surface_get_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char **data, + unsigned long *length) +{ + cairo_user_data_slot_t *slots; + int i, num_slots; + + *data = NULL; + *length = 0; + + /* Prevent reads of the array during teardown */ + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) + return; + + /* The number of mime-types attached to a surface is usually small, + * typically zero. Therefore it is quicker to do a strcmp() against + * each key than it is to intern the string (i.e. compute a hash, + * search the hash table, and do a final strcmp). + */ + num_slots = surface->mime_data.num_elements; + slots = _cairo_array_index (&surface->mime_data, 0); + for (i = 0; i < num_slots; i++) { + if (slots[i].key != NULL && strcmp ((char *) slots[i].key, mime_type) == 0) { + cairo_mime_data_t *mime_data = slots[i].user_data; + + *data = mime_data->data; + *length = mime_data->length; + return; + } + } +} +slim_hidden_def (cairo_surface_get_mime_data); + +static void +_cairo_mime_data_destroy (void *ptr) +{ + cairo_mime_data_t *mime_data = ptr; + + if (! _cairo_reference_count_dec_and_test (&mime_data->ref_count)) + return; + + if (mime_data->destroy && mime_data->closure) + mime_data->destroy (mime_data->closure); + + free (mime_data); +} + +/** + * CAIRO_MIME_TYPE_JBIG2: + * + * Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544). + * + * Since: 1.14 + **/ + +/** + * CAIRO_MIME_TYPE_JBIG2_GLOBAL: + * + * Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544) global segment. + * + * Since: 1.14 + **/ + +/** + * CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID: + * + * An unique identifier shared by a JBIG2 global segment and all JBIG2 images + * that depend on the global segment. + * + * Since: 1.14 + **/ + +/** + * CAIRO_MIME_TYPE_JP2: + * + * The Joint Photographic Experts Group (JPEG) 2000 image coding standard (ISO/IEC 15444-1). + * + * Since: 1.10 + **/ + +/** + * CAIRO_MIME_TYPE_JPEG: + * + * The Joint Photographic Experts Group (JPEG) image coding standard (ISO/IEC 10918-1). + * + * Since: 1.10 + **/ + +/** + * CAIRO_MIME_TYPE_PNG: + * + * The Portable Network Graphics image file format (ISO/IEC 15948). + * + * Since: 1.10 + **/ + +/** + * CAIRO_MIME_TYPE_URI: + * + * URI for an image file (unofficial MIME type). + * + * Since: 1.10 + **/ + +/** + * CAIRO_MIME_TYPE_UNIQUE_ID: + * + * Unique identifier for a surface (cairo specific MIME type). All surfaces with + * the same unique identifier will only be embedded once. + * + * Since: 1.12 + **/ + +/** + * cairo_surface_set_mime_data: + * @surface: a #cairo_surface_t + * @mime_type: the MIME type of the image data + * @data: the image data to attach to the surface + * @length: the length of the image data + * @destroy: a #cairo_destroy_func_t which will be called when the + * surface is destroyed or when new image data is attached using the + * same mime type. + * @closure: the data to be passed to the @destroy notifier + * + * Attach an image in the format @mime_type to @surface. To remove + * the data from a surface, call this function with same mime type + * and %NULL for @data. + * + * The attached image (or filename) data can later be used by backends + * which support it (currently: PDF, PS, SVG and Win32 Printing + * surfaces) to emit this data instead of making a snapshot of the + * @surface. This approach tends to be faster and requires less + * memory and disk space. + * + * The recognized MIME types are the following: %CAIRO_MIME_TYPE_JPEG, + * %CAIRO_MIME_TYPE_PNG, %CAIRO_MIME_TYPE_JP2, %CAIRO_MIME_TYPE_URI, + * %CAIRO_MIME_TYPE_UNIQUE_ID, %CAIRO_MIME_TYPE_JBIG2, + * %CAIRO_MIME_TYPE_JBIG2_GLOBAL, %CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID. + * + * See corresponding backend surface docs for details about which MIME + * types it can handle. Caution: the associated MIME data will be + * discarded if you draw on the surface afterwards. Use this function + * with care. + * + * Even if a backend supports a MIME type, that does not mean cairo + * will always be able to use the attached MIME data. For example, if + * the backend does not natively support the compositing operation used + * to apply the MIME data to the backend. In that case, the MIME data + * will be ignored. Therefore, to apply an image in all cases, it is best + * to create an image surface which contains the decoded image data and + * then attach the MIME data to that. This ensures the image will always + * be used while still allowing the MIME data to be used whenever + * possible. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.10 + **/ +cairo_status_t +cairo_surface_set_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char *data, + unsigned long length, + cairo_destroy_func_t destroy, + void *closure) +{ + cairo_status_t status; + cairo_mime_data_t *mime_data; + + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + return surface->status; + + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + status = _cairo_intern_string (&mime_type, -1); + if (unlikely (status)) + return _cairo_surface_set_error (surface, status); + + if (data != NULL) { + mime_data = malloc (sizeof (cairo_mime_data_t)); + if (unlikely (mime_data == NULL)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + + CAIRO_REFERENCE_COUNT_INIT (&mime_data->ref_count, 1); + + mime_data->data = (unsigned char *) data; + mime_data->length = length; + mime_data->destroy = destroy; + mime_data->closure = closure; + } else + mime_data = NULL; + + status = _cairo_user_data_array_set_data (&surface->mime_data, + (cairo_user_data_key_t *) mime_type, + mime_data, + _cairo_mime_data_destroy); + if (unlikely (status)) { + free (mime_data); + + return _cairo_surface_set_error (surface, status); + } + + return CAIRO_STATUS_SUCCESS; +} +slim_hidden_def (cairo_surface_set_mime_data); + +/** + * cairo_surface_supports_mime_type: + * @surface: a #cairo_surface_t + * @mime_type: the mime type + * + * Return whether @surface supports @mime_type. + * + * Return value: %TRUE if @surface supports + * @mime_type, %FALSE otherwise + * + * Since: 1.12 + **/ +cairo_bool_t +cairo_surface_supports_mime_type (cairo_surface_t *surface, + const char *mime_type) +{ + const char **types; + + if (unlikely (surface->status)) + return FALSE; + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (surface->backend->get_supported_mime_types) { + types = surface->backend->get_supported_mime_types (surface); + if (types) { + while (*types) { + if (strcmp (*types, mime_type) == 0) + return TRUE; + types++; + } + } + } + + return FALSE; +} +slim_hidden_def (cairo_surface_supports_mime_type); + +static void +_cairo_mime_data_reference (const void *key, void *elt, void *closure) +{ + cairo_mime_data_t *mime_data = elt; + + _cairo_reference_count_inc (&mime_data->ref_count); +} + +cairo_status_t +_cairo_surface_copy_mime_data (cairo_surface_t *dst, + cairo_surface_t *src) +{ + cairo_status_t status; + + if (dst->status) + return dst->status; + + if (src->status) + return _cairo_surface_set_error (dst, src->status); + + /* first copy the mime-data, discarding any already set on dst */ + status = _cairo_user_data_array_copy (&dst->mime_data, &src->mime_data); + if (unlikely (status)) + return _cairo_surface_set_error (dst, status); + + /* now increment the reference counters for the copies */ + _cairo_user_data_array_foreach (&dst->mime_data, + _cairo_mime_data_reference, + NULL); + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_surface_set_font_options: + * @surface: a #cairo_surface_t + * @options: a #cairo_font_options_t object that contains the + * options to use for this surface instead of backend's default + * font options. + * + * Sets the default font rendering options for the surface. + * This is useful to correctly propagate default font options when + * falling back to an image surface in a backend implementation. + * This affects the options returned in cairo_surface_get_font_options(). + * + * If @options is %NULL the surface options are reset to those of + * the backend default. + **/ +void +_cairo_surface_set_font_options (cairo_surface_t *surface, + cairo_font_options_t *options) +{ + if (surface->status) + return; + + assert (surface->snapshot_of == NULL); + + if (surface->finished) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (options) { + surface->has_font_options = TRUE; + _cairo_font_options_init_copy (&surface->font_options, options); + } else { + surface->has_font_options = FALSE; + } +} + +/** + * cairo_surface_get_font_options: + * @surface: a #cairo_surface_t + * @options: a #cairo_font_options_t object into which to store + * the retrieved options. All existing values are overwritten + * + * Retrieves the default font rendering options for the surface. + * This allows display surfaces to report the correct subpixel order + * for rendering on them, print surfaces to disable hinting of + * metrics and so forth. The result can then be used with + * cairo_scaled_font_create(). + * + * Since: 1.0 + **/ +void +cairo_surface_get_font_options (cairo_surface_t *surface, + cairo_font_options_t *options) +{ + if (cairo_font_options_status (options)) + return; + + if (surface->status) { + _cairo_font_options_init_default (options); + return; + } + + if (! surface->has_font_options) { + surface->has_font_options = TRUE; + + _cairo_font_options_init_default (&surface->font_options); + + if (!surface->finished && surface->backend->get_font_options) { + surface->backend->get_font_options (surface, &surface->font_options); + } + } + + _cairo_font_options_init_copy (options, &surface->font_options); +} +slim_hidden_def (cairo_surface_get_font_options); + +cairo_status_t +_cairo_surface_flush (cairo_surface_t *surface, unsigned flags) +{ + /* update the current snapshots *before* the user updates the surface */ + _cairo_surface_detach_snapshots (surface); + if (surface->snapshot_of != NULL) + _cairo_surface_detach_snapshot (surface); + _cairo_surface_detach_mime_data (surface); + + return __cairo_surface_flush (surface, flags); +} + +/** + * cairo_surface_flush: + * @surface: a #cairo_surface_t + * + * Do any pending drawing for the surface and also restore any + * temporary modifications cairo has made to the surface's + * state. This function must be called before switching from + * drawing on the surface with cairo to drawing on it directly + * with native APIs. If the surface doesn't support direct access, + * then this function does nothing. + * + * Since: 1.0 + **/ +void +cairo_surface_flush (cairo_surface_t *surface) +{ + cairo_status_t status; + + if (surface->status) + return; + + if (surface->finished) + return; + + status = _cairo_surface_flush (surface, 0); + if (unlikely (status)) + _cairo_surface_set_error (surface, status); +} +slim_hidden_def (cairo_surface_flush); + +/** + * cairo_surface_mark_dirty: + * @surface: a #cairo_surface_t + * + * Tells cairo that drawing has been done to surface using means other + * than cairo, and that cairo should reread any cached areas. Note + * that you must call cairo_surface_flush() before doing such drawing. + * + * Since: 1.0 + **/ +void +cairo_surface_mark_dirty (cairo_surface_t *surface) +{ + cairo_rectangle_int_t extents; + + if (unlikely (surface->status)) + return; + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + _cairo_surface_get_extents (surface, &extents); + cairo_surface_mark_dirty_rectangle (surface, + extents.x, extents.y, + extents.width, extents.height); +} +slim_hidden_def (cairo_surface_mark_dirty); + +/** + * cairo_surface_mark_dirty_rectangle: + * @surface: a #cairo_surface_t + * @x: X coordinate of dirty rectangle + * @y: Y coordinate of dirty rectangle + * @width: width of dirty rectangle + * @height: height of dirty rectangle + * + * Like cairo_surface_mark_dirty(), but drawing has been done only to + * the specified rectangle, so that cairo can retain cached contents + * for other parts of the surface. + * + * Any cached clip set on the surface will be reset by this function, + * to make sure that future cairo calls have the clip set that they + * expect. + * + * Since: 1.0 + **/ +void +cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface, + int x, + int y, + int width, + int height) +{ + cairo_status_t status; + + if (unlikely (surface->status)) + return; + + assert (surface->snapshot_of == NULL); + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + /* The application *should* have called cairo_surface_flush() before + * modifying the surface independently of cairo (and thus having to + * call mark_dirty()). */ + assert (! _cairo_surface_has_snapshots (surface)); + assert (! _cairo_surface_has_mime_data (surface)); + + surface->is_clear = FALSE; + surface->serial++; + + if (surface->damage) { + cairo_box_t box; + + box.p1.x = x; + box.p1.y = y; + box.p2.x = x + width; + box.p2.y = y + height; + + surface->damage = _cairo_damage_add_box (surface->damage, &box); + } + + if (surface->backend->mark_dirty_rectangle != NULL) { + /* XXX: FRAGILE: We're ignoring the scaling component of + * device_transform here. I don't know what the right thing to + * do would actually be if there were some scaling here, but + * we avoid this since device_transfom scaling is not exported + * publicly and mark_dirty is not used internally. */ + status = surface->backend->mark_dirty_rectangle (surface, + x + surface->device_transform.x0, + y + surface->device_transform.y0, + width, height); + + if (unlikely (status)) + _cairo_surface_set_error (surface, status); + } +} +slim_hidden_def (cairo_surface_mark_dirty_rectangle); + +/** + * cairo_surface_set_device_scale: + * @surface: a #cairo_surface_t + * @x_scale: a scale factor in the X direction + * @y_scale: a scale factor in the Y direction + * + * Sets a scale that is multiplied to the device coordinates determined + * by the CTM when drawing to @surface. One common use for this is to + * render to very high resolution display devices at a scale factor, so + * that code that assumes 1 pixel will be a certain size will still work. + * Setting a transformation via cairo_translate() isn't + * sufficient to do this, since functions like + * cairo_device_to_user() will expose the hidden scale. + * + * Note that the scale affects drawing to the surface as well as + * using the surface in a source pattern. + * + * Since: 1.14 + **/ +void +cairo_surface_set_device_scale (cairo_surface_t *surface, + double x_scale, + double y_scale) +{ + cairo_status_t status; + + if (unlikely (surface->status)) + return; + + assert (surface->snapshot_of == NULL); + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) { + _cairo_surface_set_error (surface, status); + return; + } + + surface->device_transform.xx = x_scale; + surface->device_transform.yy = y_scale; + surface->device_transform.xy = 0.0; + surface->device_transform.yx = 0.0; + + surface->device_transform_inverse = surface->device_transform; + status = cairo_matrix_invert (&surface->device_transform_inverse); + /* should always be invertible unless given pathological input */ + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_observers_notify (&surface->device_transform_observers, surface); +} +slim_hidden_def (cairo_surface_set_device_scale); + +/** + * cairo_surface_get_device_scale: + * @surface: a #cairo_surface_t + * @x_scale: the scale in the X direction, in device units + * @y_scale: the scale in the Y direction, in device units + * + * This function returns the previous device offset set by + * cairo_surface_set_device_scale(). + * + * Since: 1.14 + **/ +void +cairo_surface_get_device_scale (cairo_surface_t *surface, + double *x_scale, + double *y_scale) +{ + if (x_scale) + *x_scale = surface->device_transform.xx; + if (y_scale) + *y_scale = surface->device_transform.yy; +} +slim_hidden_def (cairo_surface_get_device_scale); + +/** + * cairo_surface_set_device_offset: + * @surface: a #cairo_surface_t + * @x_offset: the offset in the X direction, in device units + * @y_offset: the offset in the Y direction, in device units + * + * Sets an offset that is added to the device coordinates determined + * by the CTM when drawing to @surface. One use case for this function + * is when we want to create a #cairo_surface_t that redirects drawing + * for a portion of an onscreen surface to an offscreen surface in a + * way that is completely invisible to the user of the cairo + * API. Setting a transformation via cairo_translate() isn't + * sufficient to do this, since functions like + * cairo_device_to_user() will expose the hidden offset. + * + * Note that the offset affects drawing to the surface as well as + * using the surface in a source pattern. + * + * Since: 1.0 + **/ +void +cairo_surface_set_device_offset (cairo_surface_t *surface, + double x_offset, + double y_offset) +{ + cairo_status_t status; + + if (unlikely (surface->status)) + return; + + assert (surface->snapshot_of == NULL); + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) { + _cairo_surface_set_error (surface, status); + return; + } + + surface->device_transform.x0 = x_offset; + surface->device_transform.y0 = y_offset; + + surface->device_transform_inverse = surface->device_transform; + status = cairo_matrix_invert (&surface->device_transform_inverse); + /* should always be invertible unless given pathological input */ + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_observers_notify (&surface->device_transform_observers, surface); +} +slim_hidden_def (cairo_surface_set_device_offset); + +/** + * cairo_surface_get_device_offset: + * @surface: a #cairo_surface_t + * @x_offset: the offset in the X direction, in device units + * @y_offset: the offset in the Y direction, in device units + * + * This function returns the previous device offset set by + * cairo_surface_set_device_offset(). + * + * Since: 1.2 + **/ +void +cairo_surface_get_device_offset (cairo_surface_t *surface, + double *x_offset, + double *y_offset) +{ + if (x_offset) + *x_offset = surface->device_transform.x0; + if (y_offset) + *y_offset = surface->device_transform.y0; +} +slim_hidden_def (cairo_surface_get_device_offset); + +/** + * cairo_surface_set_fallback_resolution: + * @surface: a #cairo_surface_t + * @x_pixels_per_inch: horizontal setting for pixels per inch + * @y_pixels_per_inch: vertical setting for pixels per inch + * + * Set the horizontal and vertical resolution for image fallbacks. + * + * When certain operations aren't supported natively by a backend, + * cairo will fallback by rendering operations to an image and then + * overlaying that image onto the output. For backends that are + * natively vector-oriented, this function can be used to set the + * resolution used for these image fallbacks, (larger values will + * result in more detailed images, but also larger file sizes). + * + * Some examples of natively vector-oriented backends are the ps, pdf, + * and svg backends. + * + * For backends that are natively raster-oriented, image fallbacks are + * still possible, but they are always performed at the native + * device resolution. So this function has no effect on those + * backends. + * + * Note: The fallback resolution only takes effect at the time of + * completing a page (with cairo_show_page() or cairo_copy_page()) so + * there is currently no way to have more than one fallback resolution + * in effect on a single page. + * + * The default fallback resoultion is 300 pixels per inch in both + * dimensions. + * + * Since: 1.2 + **/ +void +cairo_surface_set_fallback_resolution (cairo_surface_t *surface, + double x_pixels_per_inch, + double y_pixels_per_inch) +{ + cairo_status_t status; + + if (unlikely (surface->status)) + return; + + assert (surface->snapshot_of == NULL); + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (x_pixels_per_inch <= 0 || y_pixels_per_inch <= 0) { + /* XXX Could delay raising the error until we fallback, but throwing + * the error here means that we can catch the real culprit. + */ + _cairo_surface_set_error (surface, CAIRO_STATUS_INVALID_MATRIX); + return; + } + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) { + _cairo_surface_set_error (surface, status); + return; + } + + surface->x_fallback_resolution = x_pixels_per_inch; + surface->y_fallback_resolution = y_pixels_per_inch; +} +slim_hidden_def (cairo_surface_set_fallback_resolution); + +/** + * cairo_surface_get_fallback_resolution: + * @surface: a #cairo_surface_t + * @x_pixels_per_inch: horizontal pixels per inch + * @y_pixels_per_inch: vertical pixels per inch + * + * This function returns the previous fallback resolution set by + * cairo_surface_set_fallback_resolution(), or default fallback + * resolution if never set. + * + * Since: 1.8 + **/ +void +cairo_surface_get_fallback_resolution (cairo_surface_t *surface, + double *x_pixels_per_inch, + double *y_pixels_per_inch) +{ + if (x_pixels_per_inch) + *x_pixels_per_inch = surface->x_fallback_resolution; + if (y_pixels_per_inch) + *y_pixels_per_inch = surface->y_fallback_resolution; +} + +cairo_bool_t +_cairo_surface_has_device_transform (cairo_surface_t *surface) +{ + return ! _cairo_matrix_is_identity (&surface->device_transform); +} + +/** + * _cairo_surface_acquire_source_image: + * @surface: a #cairo_surface_t + * @image_out: location to store a pointer to an image surface that + * has identical contents to @surface. This surface could be @surface + * itself, a surface held internal to @surface, or it could be a new + * surface with a copy of the relevant portion of @surface. + * @image_extra: location to store image specific backend data + * + * Gets an image surface to use when drawing as a fallback when drawing with + * @surface as a source. _cairo_surface_release_source_image() must be called + * when finished. + * + * Return value: %CAIRO_STATUS_SUCCESS if an image was stored in @image_out. + * %CAIRO_INT_STATUS_UNSUPPORTED if an image cannot be retrieved for the specified + * surface. Or %CAIRO_STATUS_NO_MEMORY. + **/ +cairo_status_t +_cairo_surface_acquire_source_image (cairo_surface_t *surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_status_t status; + + if (unlikely (surface->status)) + return surface->status; + + assert (!surface->finished); + + if (surface->backend->acquire_source_image == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = surface->backend->acquire_source_image (surface, + image_out, image_extra); + if (unlikely (status)) + return _cairo_surface_set_error (surface, status); + + _cairo_debug_check_image_surface_is_defined (&(*image_out)->base); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_surface_default_acquire_source_image (void *_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_surface_t *surface = _surface; + cairo_rectangle_int_t extents; + + if (unlikely (! surface->backend->get_extents (surface, &extents))) + return _cairo_error (CAIRO_STATUS_INVALID_SIZE); + + *image_out = _cairo_surface_map_to_image (surface, &extents); + *image_extra = NULL; + return (*image_out)->base.status; +} + +/** + * _cairo_surface_release_source_image: + * @surface: a #cairo_surface_t + * @image_extra: same as return from the matching _cairo_surface_acquire_source_image() + * + * Releases any resources obtained with _cairo_surface_acquire_source_image() + **/ +void +_cairo_surface_release_source_image (cairo_surface_t *surface, + cairo_image_surface_t *image, + void *image_extra) +{ + assert (!surface->finished); + + if (surface->backend->release_source_image) + surface->backend->release_source_image (surface, image, image_extra); +} + +void +_cairo_surface_default_release_source_image (void *surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_status_t ignored; + + ignored = _cairo_surface_unmap_image (surface, image); + (void)ignored; +} + + +cairo_surface_t * +_cairo_surface_get_source (cairo_surface_t *surface, + cairo_rectangle_int_t *extents) +{ + assert (surface->backend->source); + return surface->backend->source (surface, extents); +} + +cairo_surface_t * +_cairo_surface_default_source (void *surface, + cairo_rectangle_int_t *extents) +{ + if (extents) + _cairo_surface_get_extents(surface, extents); + return surface; +} + +static cairo_status_t +_pattern_has_error (const cairo_pattern_t *pattern) +{ + const cairo_surface_pattern_t *spattern; + + if (unlikely (pattern->status)) + return pattern->status; + + if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_STATUS_SUCCESS; + + spattern = (const cairo_surface_pattern_t *) pattern; + if (unlikely (spattern->surface->status)) + return spattern->surface->status; + + if (unlikely (spattern->surface->finished)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +nothing_to_do (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source) +{ + if (_cairo_pattern_is_clear (source)) { + if (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD) + return TRUE; + + if (op == CAIRO_OPERATOR_SOURCE) + op = CAIRO_OPERATOR_CLEAR; + } + + if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear) + return TRUE; + + if (op == CAIRO_OPERATOR_ATOP && (surface->content & CAIRO_CONTENT_COLOR) ==0) + return TRUE; + + return FALSE; +} + +cairo_status_t +_cairo_surface_paint (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + status = _pattern_has_error (source); + if (unlikely (status)) + return status; + + if (nothing_to_do (surface, op, source)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) + return status; + + status = surface->backend->paint (surface, op, source, clip); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + surface->is_clear = op == CAIRO_OPERATOR_CLEAR && clip == NULL; + surface->serial++; + } + + return _cairo_surface_set_error (surface, status); +} + +cairo_status_t +_cairo_surface_mask (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + /* If the mask is blank, this is just an expensive no-op */ + if (_cairo_pattern_is_clear (mask) && + _cairo_operator_bounded_by_mask (op)) + { + return CAIRO_STATUS_SUCCESS; + } + + status = _pattern_has_error (source); + if (unlikely (status)) + return status; + + status = _pattern_has_error (mask); + if (unlikely (status)) + return status; + + if (nothing_to_do (surface, op, source)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) + return status; + + status = surface->backend->mask (surface, op, source, mask, clip); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + surface->is_clear = FALSE; + surface->serial++; + } + + return _cairo_surface_set_error (surface, status); +} + +cairo_status_t +_cairo_surface_fill_stroke (cairo_surface_t *surface, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + cairo_path_fixed_t *path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + if (surface->is_clear && + fill_op == CAIRO_OPERATOR_CLEAR && + stroke_op == CAIRO_OPERATOR_CLEAR) + { + return CAIRO_STATUS_SUCCESS; + } + + status = _pattern_has_error (fill_source); + if (unlikely (status)) + return status; + + status = _pattern_has_error (stroke_source); + if (unlikely (status)) + return status; + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) + return status; + + if (surface->backend->fill_stroke) { + cairo_matrix_t dev_ctm = *stroke_ctm; + cairo_matrix_t dev_ctm_inverse = *stroke_ctm_inverse; + + status = surface->backend->fill_stroke (surface, + fill_op, fill_source, fill_rule, + fill_tolerance, fill_antialias, + path, + stroke_op, stroke_source, + stroke_style, + &dev_ctm, &dev_ctm_inverse, + stroke_tolerance, stroke_antialias, + clip); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto FINISH; + } + + status = _cairo_surface_fill (surface, fill_op, fill_source, path, + fill_rule, fill_tolerance, fill_antialias, + clip); + if (unlikely (status)) + goto FINISH; + + status = _cairo_surface_stroke (surface, stroke_op, stroke_source, path, + stroke_style, stroke_ctm, stroke_ctm_inverse, + stroke_tolerance, stroke_antialias, + clip); + if (unlikely (status)) + goto FINISH; + + FINISH: + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + surface->is_clear = FALSE; + surface->serial++; + } + + return _cairo_surface_set_error (surface, status); +} + +cairo_status_t +_cairo_surface_stroke (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + status = _pattern_has_error (source); + if (unlikely (status)) + return status; + + if (nothing_to_do (surface, op, source)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) + return status; + + status = surface->backend->stroke (surface, op, source, + path, stroke_style, + ctm, ctm_inverse, + tolerance, antialias, + clip); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + surface->is_clear = FALSE; + surface->serial++; + } + + return _cairo_surface_set_error (surface, status); +} + +cairo_status_t +_cairo_surface_fill (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + status = _pattern_has_error (source); + if (unlikely (status)) + return status; + + if (nothing_to_do (surface, op, source)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) + return status; + + status = surface->backend->fill (surface, op, source, + path, fill_rule, + tolerance, antialias, + clip); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + surface->is_clear = FALSE; + surface->serial++; + } + + return _cairo_surface_set_error (surface, status); +} + +/** + * cairo_surface_copy_page: + * @surface: a #cairo_surface_t + * + * Emits the current page for backends that support multiple pages, + * but doesn't clear it, so that the contents of the current page will + * be retained for the next page. Use cairo_surface_show_page() if you + * want to get an empty page after the emission. + * + * There is a convenience function for this that takes a #cairo_t, + * namely cairo_copy_page(). + * + * Since: 1.6 + **/ +void +cairo_surface_copy_page (cairo_surface_t *surface) +{ + if (unlikely (surface->status)) + return; + + assert (surface->snapshot_of == NULL); + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); + return; + } + + /* It's fine if some backends don't implement copy_page */ + if (surface->backend->copy_page == NULL) + return; + + _cairo_surface_set_error (surface, surface->backend->copy_page (surface)); +} +slim_hidden_def (cairo_surface_copy_page); + +/** + * cairo_surface_show_page: + * @surface: a #cairo_Surface_t + * + * Emits and clears the current page for backends that support multiple + * pages. Use cairo_surface_copy_page() if you don't want to clear the page. + * + * There is a convenience function for this that takes a #cairo_t, + * namely cairo_show_page(). + * + * Since: 1.6 + **/ +void +cairo_surface_show_page (cairo_surface_t *surface) +{ + cairo_status_t status; + + if (unlikely (surface->status)) + return; + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); + return; + } + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) { + _cairo_surface_set_error (surface, status); + return; + } + + /* It's fine if some backends don't implement show_page */ + if (surface->backend->show_page == NULL) + return; + + _cairo_surface_set_error (surface, surface->backend->show_page (surface)); +} +slim_hidden_def (cairo_surface_show_page); + +/** + * _cairo_surface_get_extents: + * @surface: the #cairo_surface_t to fetch extents for + * + * This function returns a bounding box for the surface. The surface + * bounds are defined as a region beyond which no rendering will + * possibly be recorded, in other words, it is the maximum extent of + * potentially usable coordinates. + * + * For vector surfaces, (PDF, PS, SVG and recording-surfaces), the surface + * might be conceived as unbounded, but we force the user to provide a + * maximum size at the time of surface_create. So get_extents uses + * that size. + * + * Note: The coordinates returned are in "backend" space rather than + * "surface" space. That is, they are relative to the true (0,0) + * origin rather than the device_transform origin. This might seem a + * bit inconsistent with other #cairo_surface_t interfaces, but all + * current callers are within the surface layer where backend space is + * desired. + * + * This behavior would have to be changed is we ever exported a public + * variant of this function. + **/ +cairo_bool_t +_cairo_surface_get_extents (cairo_surface_t *surface, + cairo_rectangle_int_t *extents) +{ + cairo_bool_t bounded; + + if (unlikely (surface->status)) + goto zero_extents; + if (unlikely (surface->finished)) { + _cairo_surface_set_error(surface, CAIRO_STATUS_SURFACE_FINISHED); + goto zero_extents; + } + + bounded = FALSE; + if (surface->backend->get_extents != NULL) + bounded = surface->backend->get_extents (surface, extents); + + if (! bounded) + _cairo_unbounded_rectangle_init (extents); + + return bounded; + +zero_extents: + extents->x = extents->y = 0; + extents->width = extents->height = 0; + return TRUE; +} + +/** + * cairo_surface_has_show_text_glyphs: + * @surface: a #cairo_surface_t + * + * Returns whether the surface supports + * sophisticated cairo_show_text_glyphs() operations. That is, + * whether it actually uses the provided text and cluster data + * to a cairo_show_text_glyphs() call. + * + * Note: Even if this function returns %FALSE, a + * cairo_show_text_glyphs() operation targeted at @surface will + * still succeed. It just will + * act like a cairo_show_glyphs() operation. Users can use this + * function to avoid computing UTF-8 text and cluster mapping if the + * target surface does not use it. + * + * Return value: %TRUE if @surface supports + * cairo_show_text_glyphs(), %FALSE otherwise + * + * Since: 1.8 + **/ +cairo_bool_t +cairo_surface_has_show_text_glyphs (cairo_surface_t *surface) +{ + if (unlikely (surface->status)) + return FALSE; + + if (unlikely (surface->finished)) { + _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); + return FALSE; + } + + if (surface->backend->has_show_text_glyphs) + return surface->backend->has_show_text_glyphs (surface); + else + return surface->backend->show_text_glyphs != NULL; +} +slim_hidden_def (cairo_surface_has_show_text_glyphs); + +/* Note: the backends may modify the contents of the glyph array as long as + * they do not return %CAIRO_INT_STATUS_UNSUPPORTED. This makes it possible to + * avoid copying the array again and again, and edit it in-place. + * Backends are in fact free to use the array as a generic buffer as they + * see fit. + * + * For show_glyphs backend method, and NOT for show_text_glyphs method, + * when they do return UNSUPPORTED, they may adjust remaining_glyphs to notify + * that they have successfully rendered some of the glyphs (from the beginning + * of the array), but not all. If they don't touch remaining_glyphs, it + * defaults to all glyphs. + * + * See commits 5a9642c5746fd677aed35ce620ce90b1029b1a0c and + * 1781e6018c17909311295a9cc74b70500c6b4d0a for the rationale. + */ +cairo_status_t +_cairo_surface_show_text_glyphs (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (unlikely (surface->status)) + return surface->status; + if (unlikely (surface->finished)) + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (num_glyphs == 0 && utf8_len == 0) + return CAIRO_STATUS_SUCCESS; + + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_STATUS_SUCCESS; + + status = _pattern_has_error (source); + if (unlikely (status)) + return status; + + if (nothing_to_do (surface, op, source)) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_begin_modification (surface); + if (unlikely (status)) + return status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + + /* The logic here is duplicated in _cairo_analysis_surface show_glyphs and + * show_text_glyphs. Keep in synch. */ + if (clusters) { + /* A real show_text_glyphs call. Try show_text_glyphs backend + * method first */ + if (surface->backend->show_text_glyphs != NULL) { + status = surface->backend->show_text_glyphs (surface, op, + source, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags, + scaled_font, + clip); + } + if (status == CAIRO_INT_STATUS_UNSUPPORTED && + surface->backend->show_glyphs) + { + status = surface->backend->show_glyphs (surface, op, + source, + glyphs, num_glyphs, + scaled_font, + clip); + } + } else { + /* A mere show_glyphs call. Try show_glyphs backend method first */ + if (surface->backend->show_glyphs != NULL) { + status = surface->backend->show_glyphs (surface, op, + source, + glyphs, num_glyphs, + scaled_font, + clip); + } else if (surface->backend->show_text_glyphs != NULL) { + /* Intentionally only try show_text_glyphs method for show_glyphs + * calls if backend does not have show_glyphs. If backend has + * both methods implemented, we don't fallback from show_glyphs to + * show_text_glyphs, and hence the backend can assume in its + * show_text_glyphs call that clusters is not NULL (which also + * implies that UTF-8 is not NULL, unless the text is + * zero-length). + */ + status = surface->backend->show_text_glyphs (surface, op, + source, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags, + scaled_font, + clip); + } + } + + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + surface->is_clear = FALSE; + surface->serial++; + } + + return _cairo_surface_set_error (surface, status); +} + +/** + * _cairo_surface_set_resolution: + * @surface: the surface + * @x_res: x resolution, in dpi + * @y_res: y resolution, in dpi + * + * Set the actual surface resolution of @surface to the given x and y DPI. + * Mainly used for correctly computing the scale factor when fallback + * rendering needs to take place in the paginated surface. + **/ +void +_cairo_surface_set_resolution (cairo_surface_t *surface, + double x_res, + double y_res) +{ + if (surface->status) + return; + + surface->x_resolution = x_res; + surface->y_resolution = y_res; +} + +/** + * _cairo_surface_create_in_error: + * @status: the error status + * + * Return an appropriate static error surface for the error status. + * On error, surface creation functions should always return a surface + * created with _cairo_surface_create_in_error() instead of a new surface + * in an error state. This simplifies internal code as no refcounting has + * to be done. + **/ +cairo_surface_t * +_cairo_surface_create_in_error (cairo_status_t status) +{ + assert (status < CAIRO_STATUS_LAST_STATUS); + switch (status) { + case CAIRO_STATUS_NO_MEMORY: + return (cairo_surface_t *) &_cairo_surface_nil; + case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: + return (cairo_surface_t *) &_cairo_surface_nil_surface_type_mismatch; + case CAIRO_STATUS_INVALID_STATUS: + return (cairo_surface_t *) &_cairo_surface_nil_invalid_status; + case CAIRO_STATUS_INVALID_CONTENT: + return (cairo_surface_t *) &_cairo_surface_nil_invalid_content; + case CAIRO_STATUS_INVALID_FORMAT: + return (cairo_surface_t *) &_cairo_surface_nil_invalid_format; + case CAIRO_STATUS_INVALID_VISUAL: + return (cairo_surface_t *) &_cairo_surface_nil_invalid_visual; + case CAIRO_STATUS_READ_ERROR: + return (cairo_surface_t *) &_cairo_surface_nil_read_error; + case CAIRO_STATUS_WRITE_ERROR: + return (cairo_surface_t *) &_cairo_surface_nil_write_error; + case CAIRO_STATUS_FILE_NOT_FOUND: + return (cairo_surface_t *) &_cairo_surface_nil_file_not_found; + case CAIRO_STATUS_TEMP_FILE_ERROR: + return (cairo_surface_t *) &_cairo_surface_nil_temp_file_error; + case CAIRO_STATUS_INVALID_STRIDE: + return (cairo_surface_t *) &_cairo_surface_nil_invalid_stride; + case CAIRO_STATUS_INVALID_SIZE: + return (cairo_surface_t *) &_cairo_surface_nil_invalid_size; + case CAIRO_STATUS_DEVICE_TYPE_MISMATCH: + return (cairo_surface_t *) &_cairo_surface_nil_device_type_mismatch; + case CAIRO_STATUS_DEVICE_ERROR: + return (cairo_surface_t *) &_cairo_surface_nil_device_error; + case CAIRO_STATUS_SUCCESS: + case CAIRO_STATUS_LAST_STATUS: + ASSERT_NOT_REACHED; + /* fall-through */ + case CAIRO_STATUS_INVALID_RESTORE: + case CAIRO_STATUS_INVALID_POP_GROUP: + case CAIRO_STATUS_NO_CURRENT_POINT: + case CAIRO_STATUS_INVALID_MATRIX: + case CAIRO_STATUS_NULL_POINTER: + case CAIRO_STATUS_INVALID_STRING: + case CAIRO_STATUS_INVALID_PATH_DATA: + case CAIRO_STATUS_SURFACE_FINISHED: + case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: + case CAIRO_STATUS_INVALID_DASH: + case CAIRO_STATUS_INVALID_DSC_COMMENT: + case CAIRO_STATUS_INVALID_INDEX: + case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: + case CAIRO_STATUS_FONT_TYPE_MISMATCH: + case CAIRO_STATUS_USER_FONT_IMMUTABLE: + case CAIRO_STATUS_USER_FONT_ERROR: + case CAIRO_STATUS_NEGATIVE_COUNT: + case CAIRO_STATUS_INVALID_CLUSTERS: + case CAIRO_STATUS_INVALID_SLANT: + case CAIRO_STATUS_INVALID_WEIGHT: + case CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: + case CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: + case CAIRO_STATUS_DEVICE_FINISHED: + case CAIRO_STATUS_JBIG2_GLOBAL_MISSING: + default: + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_surface_t *) &_cairo_surface_nil; + } +} + +cairo_surface_t * +_cairo_int_surface_create_in_error (cairo_int_status_t status) +{ + if (status < CAIRO_INT_STATUS_LAST_STATUS) + return _cairo_surface_create_in_error (status); + + switch ((int)status) { + case CAIRO_INT_STATUS_UNSUPPORTED: + return (cairo_surface_t *) &_cairo_surface_nil_unsupported; + case CAIRO_INT_STATUS_NOTHING_TO_DO: + return (cairo_surface_t *) &_cairo_surface_nil_nothing_to_do; + default: + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_surface_t *) &_cairo_surface_nil; + } +} + +/* LocalWords: rasterized + */ diff --git a/src/cairo-svg-surface-private.h b/src/cairo-svg-surface-private.h new file mode 100644 index 000000000..ddbf464b1 --- /dev/null +++ b/src/cairo-svg-surface-private.h @@ -0,0 +1,74 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * Copyright © 2005-2006 Emmanuel Pacaud + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Emmanuel Pacaud + * Carl Worth + */ + +#ifndef CAIRO_SVG_SURFACE_PRIVATE_H +#define CAIRO_SVG_SURFACE_PRIVATE_H + +#include "cairo-svg.h" + +#include "cairo-surface-private.h" +#include "cairo-surface-clipper-private.h" + +typedef struct cairo_svg_document cairo_svg_document_t; + +typedef struct cairo_svg_surface { + cairo_surface_t base; + + cairo_content_t content; + + double width; + double height; + + cairo_svg_document_t *document; + + cairo_output_stream_t *xml_node; + cairo_array_t page_set; + + cairo_surface_clipper_t clipper; + unsigned int clip_level; + unsigned int base_clip; + cairo_bool_t is_base_clip_emitted; + + cairo_paginated_mode_t paginated_mode; + + cairo_bool_t force_fallbacks; +} cairo_svg_surface_t; + +#endif /* CAIRO_SVG_SURFACE_PRIVATE_H */ diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c new file mode 100644 index 000000000..372ef45b8 --- /dev/null +++ b/src/cairo-svg-surface.c @@ -0,0 +1,2884 @@ +/* vim: set sw=4 sts=4: -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * Copyright © 2005-2007 Emmanuel Pacaud + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Kristian Høgsberg + * Emmanuel Pacaud + * Carl Worth + */ + +#define _BSD_SOURCE /* for snprintf() */ +#include "cairoint.h" + +#include "cairo-svg.h" + +#include "cairo-array-private.h" +#include "cairo-analysis-surface-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-info-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-output-stream-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-paginated-private.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-svg-surface-private.h" + +/** + * SECTION:cairo-svg + * @Title: SVG Surfaces + * @Short_Description: Rendering SVG documents + * @See_Also: #cairo_surface_t + * + * The SVG surface is used to render cairo graphics to + * SVG files and is a multi-page vector surface backend. + **/ + +/** + * CAIRO_HAS_SVG_SURFACE: + * + * Defined if the SVG surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.2 + **/ + +typedef struct cairo_svg_page cairo_svg_page_t; + +static const int invalid_pattern_id = -1; + +static const cairo_svg_version_t _cairo_svg_versions[] = +{ + CAIRO_SVG_VERSION_1_1, + CAIRO_SVG_VERSION_1_2 +}; + +#define CAIRO_SVG_VERSION_LAST ARRAY_LENGTH (_cairo_svg_versions) + +static const char *_cairo_svg_supported_mime_types[] = +{ + CAIRO_MIME_TYPE_JPEG, + CAIRO_MIME_TYPE_PNG, + CAIRO_MIME_TYPE_URI, + NULL +}; + +static void +_cairo_svg_surface_emit_path (cairo_output_stream_t *output, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm_inverse); + +static cairo_bool_t +_cairo_svg_version_has_page_set_support (cairo_svg_version_t version) +{ + return version > CAIRO_SVG_VERSION_1_1; +} + +static const char * _cairo_svg_version_strings[CAIRO_SVG_VERSION_LAST] = +{ + "SVG 1.1", + "SVG 1.2" +}; + +static const char * _cairo_svg_internal_version_strings[CAIRO_SVG_VERSION_LAST] = +{ + "1.1", + "1.2" +}; + +struct cairo_svg_page { + unsigned int surface_id; + unsigned int clip_level; + cairo_output_stream_t *xml_node; +}; + +struct cairo_svg_document { + cairo_output_stream_t *output_stream; + unsigned long refcount; + cairo_surface_t *owner; + cairo_bool_t finished; + + double width; + double height; + + cairo_output_stream_t *xml_node_defs; + cairo_output_stream_t *xml_node_glyphs; + + unsigned int linear_pattern_id; + unsigned int radial_pattern_id; + unsigned int pattern_id; + unsigned int filter_id; + unsigned int clip_id; + unsigned int mask_id; + + cairo_bool_t alpha_filter; + + cairo_svg_version_t svg_version; + + cairo_scaled_font_subsets_t *font_subsets; +}; + +static cairo_status_t +_cairo_svg_document_create (cairo_output_stream_t *stream, + double width, + double height, + cairo_svg_version_t version, + cairo_svg_document_t **document_out); + +static cairo_status_t +_cairo_svg_document_destroy (cairo_svg_document_t *document); + +static cairo_status_t +_cairo_svg_document_finish (cairo_svg_document_t *document); + +static cairo_svg_document_t * +_cairo_svg_document_reference (cairo_svg_document_t *document); + +static unsigned int +_cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document); + +static cairo_surface_t * +_cairo_svg_surface_create_for_document (cairo_svg_document_t *document, + cairo_content_t content, + double width, + double height); +static cairo_surface_t * +_cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, + double width, + double height, + cairo_svg_version_t version); + +static const cairo_surface_backend_t cairo_svg_surface_backend; +static const cairo_paginated_surface_backend_t cairo_svg_surface_paginated_backend; + +/** + * cairo_svg_surface_create_for_stream: + * @write_func: a #cairo_write_func_t to accept the output data, may be %NULL + * to indicate a no-op @write_func. With a no-op @write_func, + * the surface may be queried or used as a source without + * generating any temporary files. + * @closure: the closure argument for @write_func + * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + * + * Creates a SVG surface of the specified size in points to be written + * incrementally to the stream represented by @write_func and @closure. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width, + double height) +{ + cairo_output_stream_t *stream; + + stream = _cairo_output_stream_create (write_func, NULL, closure); + if (_cairo_output_stream_get_status (stream)) + return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); + + return _cairo_svg_surface_create_for_stream_internal (stream, width, height, CAIRO_SVG_VERSION_1_1); +} + +/** + * cairo_svg_surface_create: + * @filename: a filename for the SVG output (must be writable), %NULL may be + * used to specify no output. This will generate a SVG surface that + * may be queried and used as a source, without generating a + * temporary file. + * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + * + * Creates a SVG surface of the specified size in points to be written + * to @filename. + * + * The SVG surface backend recognizes the following MIME types for the + * data attached to a surface (see cairo_surface_set_mime_data()) when + * it is used as a source pattern for drawing on this surface: + * %CAIRO_MIME_TYPE_JPEG, %CAIRO_MIME_TYPE_PNG, + * %CAIRO_MIME_TYPE_URI. If any of them is specified, the SVG backend + * emits a href with the content of MIME data instead of a surface + * snapshot (PNG, Base64-encoded) in the corresponding image tag. + * + * The unofficial MIME type %CAIRO_MIME_TYPE_URI is examined + * first. If present, the URI is emitted as is: assuring the + * correctness of URI is left to the client code. + * + * If %CAIRO_MIME_TYPE_URI is not present, but %CAIRO_MIME_TYPE_JPEG + * or %CAIRO_MIME_TYPE_PNG is specified, the corresponding data is + * Base64-encoded and emitted. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_svg_surface_create (const char *filename, + double width, + double height) +{ + cairo_output_stream_t *stream; + + stream = _cairo_output_stream_create_for_filename (filename); + if (_cairo_output_stream_get_status (stream)) + return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); + + return _cairo_svg_surface_create_for_stream_internal (stream, width, height, CAIRO_SVG_VERSION_1_1); +} + +static cairo_bool_t +_cairo_surface_is_svg (cairo_surface_t *surface) +{ + return surface->backend == &cairo_svg_surface_backend; +} + +/* If the abstract_surface is a paginated surface, and that paginated + * surface's target is a svg_surface, then set svg_surface to that + * target. Otherwise return FALSE. + */ +static cairo_bool_t +_extract_svg_surface (cairo_surface_t *surface, + cairo_svg_surface_t **svg_surface) +{ + cairo_surface_t *target; + cairo_status_t status_ignored; + + if (surface->status) + return FALSE; + if (surface->finished) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (! _cairo_surface_is_paginated (surface)) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return FALSE; + } + + target = _cairo_paginated_surface_get_target (surface); + if (target->status) { + status_ignored = _cairo_surface_set_error (surface, + target->status); + return FALSE; + } + if (target->finished) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return FALSE; + } + + if (! _cairo_surface_is_svg (target)) { + status_ignored = _cairo_surface_set_error (surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return FALSE; + } + + *svg_surface = (cairo_svg_surface_t *) target; + return TRUE; +} + +/** + * cairo_svg_surface_restrict_to_version: + * @surface: a SVG #cairo_surface_t + * @version: SVG version + * + * Restricts the generated SVG file to @version. See cairo_svg_get_versions() + * for a list of available version values that can be used here. + * + * This function should only be called before any drawing operations + * have been performed on the given surface. The simplest way to do + * this is to call this function immediately after creating the + * surface. + * + * Since: 1.2 + **/ +void +cairo_svg_surface_restrict_to_version (cairo_surface_t *abstract_surface, + cairo_svg_version_t version) +{ + cairo_svg_surface_t *surface = NULL; /* hide compiler warning */ + + if (! _extract_svg_surface (abstract_surface, &surface)) + return; + + if (version < CAIRO_SVG_VERSION_LAST) + surface->document->svg_version = version; +} + +/** + * cairo_svg_get_versions: + * @versions: supported version list + * @num_versions: list length + * + * Used to retrieve the list of supported versions. See + * cairo_svg_surface_restrict_to_version(). + * + * Since: 1.2 + **/ +void +cairo_svg_get_versions (cairo_svg_version_t const **versions, + int *num_versions) +{ + if (versions != NULL) + *versions = _cairo_svg_versions; + + if (num_versions != NULL) + *num_versions = CAIRO_SVG_VERSION_LAST; +} + +/** + * cairo_svg_version_to_string: + * @version: a version id + * + * Get the string representation of the given @version id. This function + * will return %NULL if @version isn't valid. See cairo_svg_get_versions() + * for a way to get the list of valid version ids. + * + * Return value: the string associated to given version. + * + * Since: 1.2 + **/ +const char * +cairo_svg_version_to_string (cairo_svg_version_t version) +{ + if (version >= CAIRO_SVG_VERSION_LAST) + return NULL; + + return _cairo_svg_version_strings[version]; +} + +static cairo_bool_t +_cliprect_covers_surface (cairo_svg_surface_t *surface, + cairo_path_fixed_t *path) +{ + cairo_box_t box; + + if (_cairo_path_fixed_is_box (path, &box)) { + if (box.p1.x <= 0 && + box.p1.y <= 0 && + _cairo_fixed_to_double (box.p2.x) >= surface->width && + _cairo_fixed_to_double (box.p2.y) >= surface->height) + { + return TRUE; + } + } + + return FALSE; +} + +static cairo_status_t +_cairo_svg_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_svg_surface_t *surface = cairo_container_of (clipper, + cairo_svg_surface_t, + clipper); + cairo_svg_document_t *document = surface->document; + unsigned int i; + + if (path == NULL) { + for (i = 0; i < surface->clip_level; i++) + _cairo_output_stream_printf (surface->xml_node, "\n"); + + surface->clip_level = 0; + return CAIRO_STATUS_SUCCESS; + } + + /* skip trivial whole-page clips */ + if (_cliprect_covers_surface (surface, path)) + return CAIRO_STATUS_SUCCESS; + + _cairo_output_stream_printf (document->xml_node_defs, + "\n" + " clip_id); + _cairo_svg_surface_emit_path (document->xml_node_defs, path, NULL); + + _cairo_output_stream_printf (document->xml_node_defs, + "/>\n" + "\n"); + + _cairo_output_stream_printf (surface->xml_node, + "\n", + document->clip_id, + fill_rule == CAIRO_FILL_RULE_EVEN_ODD ? + "evenodd" : "nonzero"); + + document->clip_id++; + surface->clip_level++; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_svg_surface_create_for_document (cairo_svg_document_t *document, + cairo_content_t content, + double width, + double height) +{ + cairo_svg_surface_t *surface; + cairo_surface_t *paginated; + cairo_status_t status, status_ignored; + + surface = malloc (sizeof (cairo_svg_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &cairo_svg_surface_backend, + NULL, /* device */ + content); + + surface->width = width; + surface->height = height; + + surface->document = _cairo_svg_document_reference (document); + + surface->clip_level = 0; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_svg_surface_clipper_intersect_clip_path); + + surface->base_clip = document->clip_id++; + surface->is_base_clip_emitted = FALSE; + + surface->xml_node = _cairo_memory_stream_create (); + status = _cairo_output_stream_get_status (surface->xml_node); + if (unlikely (status)) + goto CLEANUP; + + _cairo_array_init (&surface->page_set, sizeof (cairo_svg_page_t)); + + if (content == CAIRO_CONTENT_COLOR) { + _cairo_output_stream_printf (surface->xml_node, + "\n", + width, height); + status = _cairo_output_stream_get_status (surface->xml_node); + if (unlikely (status)) + goto CLEANUP; + } + + surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; + surface->force_fallbacks = FALSE; + surface->content = content; + + paginated = _cairo_paginated_surface_create (&surface->base, + surface->content, + &cairo_svg_surface_paginated_backend); + status = paginated->status; + if (status == CAIRO_STATUS_SUCCESS) { + /* paginated keeps the only reference to surface now, drop ours */ + cairo_surface_destroy (&surface->base); + return paginated; + } + + /* ignore status as we are on the error path */ +CLEANUP: + status_ignored = _cairo_output_stream_destroy (surface->xml_node); + status_ignored = _cairo_svg_document_destroy (document); + + free (surface); + + return _cairo_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, + double width, + double height, + cairo_svg_version_t version) +{ + cairo_svg_document_t *document = NULL; /* silence compiler */ + cairo_surface_t *surface; + cairo_status_t status; + + status = _cairo_svg_document_create (stream, + width, height, version, + &document); + if (unlikely (status)) { + surface = _cairo_surface_create_in_error (status); + /* consume the output stream on behalf of caller */ + status = _cairo_output_stream_destroy (stream); + return surface; + } + + surface = _cairo_svg_surface_create_for_document (document, CAIRO_CONTENT_COLOR_ALPHA, + width, height); + if (surface->status) { + status = _cairo_svg_document_destroy (document); + return surface; + } + + document->owner = surface; + status = _cairo_svg_document_destroy (document); + /* the ref count should be 2 at this point */ + assert (status == CAIRO_STATUS_SUCCESS); + + return surface; +} + +static cairo_svg_page_t * +_cairo_svg_surface_store_page (cairo_svg_surface_t *surface) +{ + cairo_svg_page_t page; + cairo_output_stream_t *stream; + cairo_int_status_t status; + unsigned int i; + + stream = _cairo_memory_stream_create (); + if (_cairo_output_stream_get_status (stream)) { + status = _cairo_output_stream_destroy (stream); + return NULL; + } + + page.surface_id = surface->base.unique_id; + page.clip_level = surface->clip_level; + page.xml_node = surface->xml_node; + + if (_cairo_array_append (&surface->page_set, &page)) { + status = _cairo_output_stream_destroy (stream); + return NULL; + } + + surface->xml_node = stream; + surface->clip_level = 0; + for (i = 0; i < page.clip_level; i++) + _cairo_output_stream_printf (page.xml_node, "\n"); + + _cairo_surface_clipper_reset (&surface->clipper); + + return _cairo_array_index (&surface->page_set, + surface->page_set.num_elements - 1); +} + +static cairo_int_status_t +_cairo_svg_surface_copy_page (void *abstract_surface) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_page_t *page; + + page = _cairo_svg_surface_store_page (surface); + if (unlikely (page == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_memory_stream_copy (page->xml_node, surface->xml_node); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_show_page (void *abstract_surface) +{ + cairo_svg_surface_t *surface = abstract_surface; + + if (unlikely (_cairo_svg_surface_store_page (surface) == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_svg_surface_emit_transform (cairo_output_stream_t *output, + char const *attribute_str, + const cairo_matrix_t *object_matrix, + const cairo_matrix_t *parent_matrix) +{ + cairo_matrix_t matrix = *object_matrix; + + if (parent_matrix != NULL) + cairo_matrix_multiply (&matrix, &matrix, parent_matrix); + + if (!_cairo_matrix_is_identity (&matrix)) + _cairo_output_stream_printf (output, + "%s=\"matrix(%f,%f,%f,%f,%f,%f)\"", + attribute_str, + matrix.xx, matrix.yx, + matrix.xy, matrix.yy, + matrix.x0, matrix.y0); +} + +typedef struct { + cairo_output_stream_t *output; + const cairo_matrix_t *ctm_inverse; +} svg_path_info_t; + +static cairo_status_t +_cairo_svg_path_move_to (void *closure, + const cairo_point_t *point) +{ + svg_path_info_t *info = closure; + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (info->ctm_inverse) + cairo_matrix_transform_point (info->ctm_inverse, &x, &y); + + _cairo_output_stream_printf (info->output, "M %f %f ", x, y); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_path_line_to (void *closure, + const cairo_point_t *point) +{ + svg_path_info_t *info = closure; + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (info->ctm_inverse) + cairo_matrix_transform_point (info->ctm_inverse, &x, &y); + + _cairo_output_stream_printf (info->output, "L %f %f ", x, y); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_path_curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + svg_path_info_t *info = closure; + double bx = _cairo_fixed_to_double (b->x); + double by = _cairo_fixed_to_double (b->y); + double cx = _cairo_fixed_to_double (c->x); + double cy = _cairo_fixed_to_double (c->y); + double dx = _cairo_fixed_to_double (d->x); + double dy = _cairo_fixed_to_double (d->y); + + if (info->ctm_inverse) { + cairo_matrix_transform_point (info->ctm_inverse, &bx, &by); + cairo_matrix_transform_point (info->ctm_inverse, &cx, &cy); + cairo_matrix_transform_point (info->ctm_inverse, &dx, &dy); + } + + _cairo_output_stream_printf (info->output, + "C %f %f %f %f %f %f ", + bx, by, cx, cy, dx, dy); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_path_close_path (void *closure) +{ + svg_path_info_t *info = closure; + + _cairo_output_stream_printf (info->output, "Z "); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_svg_surface_emit_path (cairo_output_stream_t *output, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm_inverse) +{ + cairo_status_t status; + svg_path_info_t info; + + _cairo_output_stream_printf (output, "d=\""); + + info.output = output; + info.ctm_inverse = ctm_inverse; + status = _cairo_path_fixed_interpret (path, + _cairo_svg_path_move_to, + _cairo_svg_path_line_to, + _cairo_svg_path_curve_to, + _cairo_svg_path_close_path, + &info); + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_output_stream_printf (output, "\""); +} + +static cairo_int_status_t +_cairo_svg_document_emit_outline_glyph_data (cairo_svg_document_t *document, + cairo_scaled_font_t *scaled_font, + unsigned long glyph_index) +{ + cairo_scaled_glyph_t *scaled_glyph; + cairo_int_status_t status; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS| + CAIRO_SCALED_GLYPH_INFO_PATH, + &scaled_glyph); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (document->xml_node_glyphs, + "xml_node_glyphs, + scaled_glyph->path, NULL); + + _cairo_output_stream_printf (document->xml_node_glyphs, + "/>\n"); + + return status; +} + +static cairo_int_status_t +_cairo_svg_document_emit_bitmap_glyph_data (cairo_svg_document_t *document, + cairo_scaled_font_t *scaled_font, + unsigned long glyph_index) +{ + cairo_scaled_glyph_t *scaled_glyph; + cairo_image_surface_t *image; + cairo_status_t status; + uint8_t *row, *byte; + int rows, cols; + int x, y, bit; + + status = _cairo_scaled_glyph_lookup (scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS | + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + if (unlikely (status)) + return status; + + image = _cairo_image_surface_coerce_to_format (scaled_glyph->surface, + CAIRO_FORMAT_A1); + status = image->base.status; + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (document->xml_node_glyphs, "xml_node_glyphs, " transform", + &image->base.device_transform_inverse, NULL); + _cairo_output_stream_printf (document->xml_node_glyphs, ">\n"); + + for (y = 0, row = image->data, rows = image->height; rows; row += image->stride, rows--, y++) { + for (x = 0, byte = row, cols = (image->width + 7) / 8; cols; byte++, cols--) { + uint8_t output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte); + for (bit = 7; bit >= 0 && x < image->width; bit--, x++) { + if (output_byte & (1 << bit)) { + _cairo_output_stream_printf (document->xml_node_glyphs, + "\n", + x, y); + } + } + } + } + _cairo_output_stream_printf (document->xml_node_glyphs, "\n"); + + cairo_surface_destroy (&image->base); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_document_emit_glyph (cairo_svg_document_t *document, + cairo_scaled_font_t *scaled_font, + unsigned long scaled_font_glyph_index, + unsigned int font_id, + unsigned int subset_glyph_index) +{ + cairo_int_status_t status; + + _cairo_output_stream_printf (document->xml_node_glyphs, + "\n", + font_id, + subset_glyph_index); + + status = _cairo_svg_document_emit_outline_glyph_data (document, + scaled_font, + scaled_font_glyph_index); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + status = _cairo_svg_document_emit_bitmap_glyph_data (document, + scaled_font, + scaled_font_glyph_index); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (document->xml_node_glyphs, "\n"); + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_document_emit_font_subset (cairo_scaled_font_subset_t *font_subset, + void *closure) +{ + cairo_svg_document_t *document = closure; + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + unsigned int i; + + _cairo_scaled_font_freeze_cache (font_subset->scaled_font); + for (i = 0; i < font_subset->num_glyphs; i++) { + status = _cairo_svg_document_emit_glyph (document, + font_subset->scaled_font, + font_subset->glyphs[i], + font_subset->font_id, i); + if (unlikely (status)) + break; + } + _cairo_scaled_font_thaw_cache (font_subset->scaled_font); + + return status; +} + +static cairo_status_t +_cairo_svg_document_emit_font_subsets (cairo_svg_document_t *document) +{ + cairo_status_t status; + + status = _cairo_scaled_font_subsets_foreach_scaled (document->font_subsets, + _cairo_svg_document_emit_font_subset, + document); + if (unlikely (status)) + goto FAIL; + + status = _cairo_scaled_font_subsets_foreach_user (document->font_subsets, + _cairo_svg_document_emit_font_subset, + document); + + FAIL: + _cairo_scaled_font_subsets_destroy (document->font_subsets); + document->font_subsets = NULL; + + return status; +} + +static char const * +_cairo_svg_surface_operators[] = { + "clear", + + "src", "src-over", "src-in", + "src-out", "src-atop", + + "dst", "dst-over", "dst-in", + "dst-out", "dst-atop", + + "xor", "plus", + "color-dodge", /* FIXME: saturate ? */ + + "multiply", "screen", "overlay", + "darken", "lighten", + "color-dodge", "color-burn", + "hard-light", "soft-light", + "difference", "exclusion" +}; + +static cairo_bool_t +_cairo_svg_surface_analyze_operator (cairo_svg_surface_t *surface, + cairo_operator_t op) +{ + /* guard against newly added operators */ + if (op >= ARRAY_LENGTH (_cairo_svg_surface_operators)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* allow operators being NULL if they are unsupported */ + if (_cairo_svg_surface_operators[op] == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_analyze_operation (cairo_svg_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern) +{ + cairo_svg_document_t *document = surface->document; + + if (surface->force_fallbacks && + surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (pattern->type == CAIRO_PATTERN_TYPE_MESH) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* SVG doesn't support extend reflect for image pattern */ + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE && + pattern->extend == CAIRO_EXTEND_REFLECT) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (document->svg_version >= CAIRO_SVG_VERSION_1_2) + return _cairo_svg_surface_analyze_operator (surface, op); + + if (op == CAIRO_OPERATOR_OVER) + return CAIRO_STATUS_SUCCESS; + + /* The SOURCE operator is only supported if there is nothing + * painted underneath. */ + if (op == CAIRO_OPERATOR_SOURCE) + return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_int_status_t +_cairo_svg_surface_operation_supported (cairo_svg_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern) +{ + return _cairo_svg_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_status_t +_cairo_svg_surface_finish (void *abstract_surface) +{ + cairo_status_t status, status2; + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_document_t *document = surface->document; + cairo_svg_page_t *page; + unsigned int i; + + if (_cairo_paginated_surface_get_target (document->owner) == &surface->base) + status = _cairo_svg_document_finish (document); + else + status = CAIRO_STATUS_SUCCESS; + + if (surface->xml_node != NULL) { + status2 = _cairo_output_stream_destroy (surface->xml_node); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + } + + for (i = 0; i < surface->page_set.num_elements; i++) { + page = _cairo_array_index (&surface->page_set, i); + status2 = _cairo_output_stream_destroy (page->xml_node); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + } + _cairo_array_fini (&surface->page_set); + + _cairo_surface_clipper_reset (&surface->clipper); + + status2 = _cairo_svg_document_destroy (document); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + return status; +} + + +static void +_cairo_svg_surface_emit_alpha_filter (cairo_svg_document_t *document) +{ + if (document->alpha_filter) + return; + + _cairo_output_stream_printf (document->xml_node_defs, + "\n" + " \n" + "\n"); + + document->alpha_filter = TRUE; +} + +typedef struct { + cairo_output_stream_t *output; + unsigned int in_mem; + unsigned int trailing; + unsigned char src[3]; +} base64_write_closure_t; + +static char const base64_table[64] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static cairo_status_t +base64_write_func (void *closure, + const unsigned char *data, + unsigned int length) +{ + base64_write_closure_t *info = (base64_write_closure_t *) closure; + unsigned int i; + unsigned char *src; + + src = info->src; + + if (info->in_mem + length < 3) { + for (i = 0; i < length; i++) { + src[i + info->in_mem] = *data++; + } + info->in_mem += length; + return CAIRO_STATUS_SUCCESS; + } + + do { + unsigned char dst[4]; + + for (i = info->in_mem; i < 3; i++) { + src[i] = *data++; + length--; + } + info->in_mem = 0; + + dst[0] = base64_table[src[0] >> 2]; + dst[1] = base64_table[(src[0] & 0x03) << 4 | src[1] >> 4]; + dst[2] = base64_table[(src[1] & 0x0f) << 2 | src[2] >> 6]; + dst[3] = base64_table[src[2] & 0xfc >> 2]; + /* Special case for the last missing bits */ + switch (info->trailing) { + case 2: + dst[2] = '='; + case 1: + dst[3] = '='; + default: + break; + } + _cairo_output_stream_write (info->output, dst, 4); + } while (length >= 3); + + for (i = 0; i < length; i++) { + src[i] = *data++; + } + info->in_mem = length; + + return _cairo_output_stream_get_status (info->output); +} + +static cairo_int_status_t +_cairo_surface_base64_encode_jpeg (cairo_surface_t *surface, + cairo_output_stream_t *output) +{ + const unsigned char *mime_data; + unsigned long mime_data_length; + cairo_image_info_t image_info; + base64_write_closure_t info; + cairo_status_t status; + + cairo_surface_get_mime_data (surface, CAIRO_MIME_TYPE_JPEG, + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_jpeg_info (&image_info, mime_data, mime_data_length); + if (unlikely (status)) + return status; + + if (image_info.num_components == 4) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_output_stream_printf (output, "data:image/jpeg;base64,"); + + info.output = output; + info.in_mem = 0; + info.trailing = 0; + + status = base64_write_func (&info, mime_data, mime_data_length); + if (unlikely (status)) + return status; + + if (info.in_mem > 0) { + memset (info.src + info.in_mem, 0, 3 - info.in_mem); + info.trailing = 3 - info.in_mem; + info.in_mem = 3; + status = base64_write_func (&info, NULL, 0); + } + + return status; +} + +static cairo_int_status_t +_cairo_surface_base64_encode_png (cairo_surface_t *surface, + cairo_output_stream_t *output) +{ + const unsigned char *mime_data; + unsigned long mime_data_length; + base64_write_closure_t info; + cairo_status_t status; + + cairo_surface_get_mime_data (surface, CAIRO_MIME_TYPE_PNG, + &mime_data, &mime_data_length); + if (unlikely (surface->status)) + return surface->status; + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_output_stream_printf (output, "data:image/png;base64,"); + + info.output = output; + info.in_mem = 0; + info.trailing = 0; + + status = base64_write_func (&info, mime_data, mime_data_length); + if (unlikely (status)) + return status; + + if (info.in_mem > 0) { + memset (info.src + info.in_mem, 0, 3 - info.in_mem); + info.trailing = 3 - info.in_mem; + info.in_mem = 3; + status = base64_write_func (&info, NULL, 0); + } + + return status; +} + +static cairo_int_status_t +_cairo_surface_base64_encode (cairo_surface_t *surface, + cairo_output_stream_t *output) +{ + cairo_int_status_t status; + base64_write_closure_t info; + + status = _cairo_surface_base64_encode_jpeg (surface, output); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + status = _cairo_surface_base64_encode_png (surface, output); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + info.output = output; + info.in_mem = 0; + info.trailing = 0; + + _cairo_output_stream_printf (info.output, "data:image/png;base64,"); + + status = cairo_surface_write_to_png_stream (surface, base64_write_func, + (void *) &info); + + if (unlikely (status)) + return status; + + if (info.in_mem > 0) { + memset (info.src + info.in_mem, 0, 3 - info.in_mem); + info.trailing = 3 - info.in_mem; + info.in_mem = 3; + status = base64_write_func (&info, NULL, 0); + } + + return status; +} + +static void +_cairo_svg_surface_emit_operator (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op) +{ + if (surface->document->svg_version >= CAIRO_SVG_VERSION_1_2 && + op != CAIRO_OPERATOR_OVER) { + _cairo_output_stream_printf (output, " comp-op=\"%s\"", _cairo_svg_surface_operators[op]); + if (!_cairo_operator_bounded_by_source (op)) + _cairo_output_stream_printf (output, " clip-to-self=\"true\""); + } +} + +static void +_cairo_svg_surface_emit_operator_for_style (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op) +{ + if (surface->document->svg_version >= CAIRO_SVG_VERSION_1_2 && + op != CAIRO_OPERATOR_OVER) { + _cairo_output_stream_printf (output, "comp-op:%s;", _cairo_svg_surface_operators[op]); + if (!_cairo_operator_bounded_by_source (op)) + _cairo_output_stream_printf (output, "clip-to-self:true;"); + } +} + +/** + * _cairo_svg_surface_emit_attr_value: + * + * Write the value to output the stream as a sequence of characters, + * while escaping those which have special meaning in the XML + * attribute's value context: & and ". + **/ +static void +_cairo_svg_surface_emit_attr_value (cairo_output_stream_t *stream, + const unsigned char *value, + unsigned int length) +{ + const unsigned char *p; + const unsigned char *q; + unsigned int i; + + /* we'll accumulate non-special chars in [q, p) range */ + p = value; + q = p; + for (i = 0; i < length; i++, p++) { + if (*p == '&' || *p == '"') { + /* flush what's left before special char */ + if (p != q) { + _cairo_output_stream_write (stream, q, p - q); + q = p + 1; + } + + if (*p == '&') + _cairo_output_stream_printf (stream, "&"); + else // p == '"' + _cairo_output_stream_printf (stream, """); + } + } + + /* flush the trailing chars if any */ + if (p != q) + _cairo_output_stream_write (stream, q, p - q); +} + +static cairo_status_t +_cairo_svg_surface_emit_surface (cairo_svg_document_t *document, + cairo_surface_t *surface) +{ + cairo_rectangle_int_t extents; + cairo_bool_t is_bounded; + cairo_status_t status; + const unsigned char *uri; + unsigned long uri_len; + + if (_cairo_user_data_array_get_data (&surface->user_data, + (cairo_user_data_key_t *) document)) + { + return CAIRO_STATUS_SUCCESS; + } + + is_bounded = _cairo_surface_get_extents (surface, &extents); + assert (is_bounded); + + _cairo_output_stream_printf (document->xml_node_defs, + "unique_id, + extents.width, extents.height); + + _cairo_output_stream_printf (document->xml_node_defs, " xlink:href=\""); + + cairo_surface_get_mime_data (surface, CAIRO_MIME_TYPE_URI, + &uri, &uri_len); + if (uri != NULL) { + _cairo_svg_surface_emit_attr_value (document->xml_node_defs, + uri, uri_len); + } else { + status = _cairo_surface_base64_encode (surface, + document->xml_node_defs); + if (unlikely (status)) + return status; + } + + _cairo_output_stream_printf (document->xml_node_defs, "\"/>\n"); + + /* and tag it */ + return _cairo_user_data_array_set_data (&surface->user_data, + (cairo_user_data_key_t *) document, + document, NULL); +} + +static cairo_status_t +_cairo_svg_surface_emit_composite_surface_pattern (cairo_output_stream_t *output, + cairo_svg_surface_t *svg_surface, + cairo_operator_t op, + cairo_surface_pattern_t *pattern, + int pattern_id, + const cairo_matrix_t *parent_matrix, + const char *extra_attributes) +{ + cairo_status_t status; + cairo_matrix_t p2u; + + p2u = pattern->base.matrix; + status = cairo_matrix_invert (&p2u); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + status = _cairo_svg_surface_emit_surface (svg_surface->document, + pattern->surface); + if (unlikely (status)) + return status; + + if (pattern_id != invalid_pattern_id) { + cairo_rectangle_int_t extents; + cairo_bool_t is_bounded; + + is_bounded = _cairo_surface_get_extents (pattern->surface, &extents); + assert (is_bounded); + + _cairo_output_stream_printf (output, + "\n "); + } + + _cairo_output_stream_printf (output, + "surface->unique_id); + if (extra_attributes) + _cairo_output_stream_printf (output, " %s", extra_attributes); + + if (pattern_id == invalid_pattern_id) { + _cairo_svg_surface_emit_operator (output, svg_surface, op); + _cairo_svg_surface_emit_transform (output, + " transform", + &p2u, parent_matrix); + } + _cairo_output_stream_printf (output, "/>\n"); + + + if (pattern_id != invalid_pattern_id) + _cairo_output_stream_printf (output, "\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_surface_emit_recording_surface (cairo_svg_document_t *document, + cairo_recording_surface_t *source) +{ + cairo_status_t status; + cairo_surface_t *paginated_surface; + cairo_svg_surface_t *svg_surface; + cairo_array_t *page_set; + + cairo_output_stream_t *contents; + + if (_cairo_user_data_array_get_data (&source->base.user_data, + (cairo_user_data_key_t *) document)) + { + return CAIRO_STATUS_SUCCESS; + } + + paginated_surface = _cairo_svg_surface_create_for_document (document, + source->base.content, + source->extents_pixels.width, + source->extents_pixels.height); + if (unlikely (paginated_surface->status)) + return paginated_surface->status; + + svg_surface = (cairo_svg_surface_t *) + _cairo_paginated_surface_get_target (paginated_surface); + cairo_surface_set_fallback_resolution (paginated_surface, + document->owner->x_fallback_resolution, + document->owner->y_fallback_resolution); + cairo_surface_set_device_offset (&svg_surface->base, + -source->extents_pixels.x, + -source->extents_pixels.y); + + status = _cairo_recording_surface_replay (&source->base, paginated_surface); + if (unlikely (status)) { + cairo_surface_destroy (paginated_surface); + return status; + } + + cairo_surface_show_page (paginated_surface); + status = cairo_surface_status (paginated_surface); + if (unlikely (status)) { + cairo_surface_destroy (paginated_surface); + return status; + } + + if (! svg_surface->is_base_clip_emitted) { + svg_surface->is_base_clip_emitted = TRUE; + _cairo_output_stream_printf (document->xml_node_defs, + "\n" + " \n" + "\n", + svg_surface->base_clip, + svg_surface->width, + svg_surface->height); + } + + if (source->base.content == CAIRO_CONTENT_ALPHA) { + _cairo_svg_surface_emit_alpha_filter (document); + _cairo_output_stream_printf (document->xml_node_defs, + "\n", + source->base.unique_id, + svg_surface->base_clip); + } else { + _cairo_output_stream_printf (document->xml_node_defs, + "\n", + source->base.unique_id, + svg_surface->base_clip); + } + + contents = svg_surface->xml_node; + page_set = &svg_surface->page_set; + + if (_cairo_memory_stream_length (contents) > 0) { + if (unlikely (_cairo_svg_surface_store_page (svg_surface) == NULL)) { + cairo_surface_destroy (paginated_surface); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + if (page_set->num_elements > 0) { + cairo_svg_page_t *page; + + page = _cairo_array_index (page_set, page_set->num_elements - 1); + _cairo_memory_stream_copy (page->xml_node, document->xml_node_defs); + } + + _cairo_output_stream_printf (document->xml_node_defs, "\n"); + + status = cairo_surface_status (paginated_surface); + cairo_surface_destroy (paginated_surface); + + if (unlikely (status)) + return status; + + /* and tag it */ + return _cairo_user_data_array_set_data (&source->base.user_data, + (cairo_user_data_key_t *) document, + document, NULL); +} + +static cairo_recording_surface_t * +to_recording_surface (const cairo_surface_pattern_t *pattern) +{ + cairo_surface_t *surface = pattern->surface; + if (_cairo_surface_is_paginated (surface)) + surface = _cairo_paginated_surface_get_recording (surface); + if (_cairo_surface_is_snapshot (surface)) + surface = _cairo_surface_snapshot_get_target (surface); + return (cairo_recording_surface_t *) surface; +} + +static cairo_status_t +_cairo_svg_surface_emit_composite_recording_pattern (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op, + cairo_surface_pattern_t *pattern, + int pattern_id, + const cairo_matrix_t *parent_matrix, + const char *extra_attributes) +{ + cairo_svg_document_t *document = surface->document; + cairo_recording_surface_t *recording_surface; + cairo_matrix_t p2u; + cairo_status_t status; + + p2u = pattern->base.matrix; + status = cairo_matrix_invert (&p2u); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + recording_surface = to_recording_surface (pattern); + status = _cairo_svg_surface_emit_recording_surface (document, recording_surface); + if (unlikely (status)) + return status; + + if (pattern_id != invalid_pattern_id) { + _cairo_output_stream_printf (output, + "extents.width, + recording_surface->extents.height); + _cairo_svg_surface_emit_transform (output, " patternTransform", &p2u, parent_matrix); + _cairo_output_stream_printf (output, ">\n"); + } + + _cairo_output_stream_printf (output, + "base.unique_id); + + if (pattern_id == invalid_pattern_id) { + _cairo_svg_surface_emit_operator (output, surface, op); + _cairo_svg_surface_emit_transform (output, " transform", &p2u, parent_matrix); + } + + if (extra_attributes) + _cairo_output_stream_printf (output, " %s", extra_attributes); + + _cairo_output_stream_printf (output, "/>\n"); + + if (pattern_id != invalid_pattern_id) + _cairo_output_stream_printf (output, "\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_surface_emit_composite_pattern (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op, + cairo_surface_pattern_t *pattern, + int pattern_id, + const cairo_matrix_t *parent_matrix, + const char *extra_attributes) +{ + + if (pattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) { + return _cairo_svg_surface_emit_composite_recording_pattern (output, surface, + op, pattern, + pattern_id, + parent_matrix, + extra_attributes); + } + + return _cairo_svg_surface_emit_composite_surface_pattern (output, surface, + op, pattern, + pattern_id, + parent_matrix, + extra_attributes); +} + +static cairo_status_t +_cairo_svg_surface_emit_solid_pattern (cairo_svg_surface_t *surface, + cairo_solid_pattern_t *pattern, + cairo_output_stream_t *style, + cairo_bool_t is_stroke) +{ + _cairo_output_stream_printf (style, is_stroke ? + "stroke:rgb(%f%%,%f%%,%f%%);stroke-opacity:%f;": + "fill:rgb(%f%%,%f%%,%f%%);fill-opacity:%f;", + pattern->color.red * 100.0, + pattern->color.green * 100.0, + pattern->color.blue * 100.0, + pattern->color.alpha); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_surface_emit_surface_pattern (cairo_svg_surface_t *surface, + cairo_surface_pattern_t *pattern, + cairo_output_stream_t *style, + cairo_bool_t is_stroke, + const cairo_matrix_t *parent_matrix) +{ + cairo_svg_document_t *document = surface->document; + cairo_status_t status; + int pattern_id; + + pattern_id = document->pattern_id++; + status = _cairo_svg_surface_emit_composite_pattern (document->xml_node_defs, + surface, CAIRO_OPERATOR_SOURCE, pattern, + pattern_id, parent_matrix, NULL); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (style, + "%s:url(#pattern%d);", + is_stroke ? "stroke" : "fill", + pattern_id); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, + cairo_gradient_pattern_t const *pattern, + double start_offset, + cairo_bool_t reverse_stops, + cairo_bool_t emulate_reflect) +{ + cairo_gradient_stop_t *stops; + double offset; + unsigned int n_stops; + unsigned int i; + + if (pattern->n_stops < 1) + return CAIRO_STATUS_SUCCESS; + + if (pattern->n_stops == 1) { + _cairo_output_stream_printf (output, + "\n", + pattern->stops[0].offset, + pattern->stops[0].color.red * 100.0, + pattern->stops[0].color.green * 100.0, + pattern->stops[0].color.blue * 100.0, + pattern->stops[0].color.alpha); + return CAIRO_STATUS_SUCCESS; + } + + if (emulate_reflect || reverse_stops) { + n_stops = emulate_reflect ? pattern->n_stops * 2 - 2: pattern->n_stops; + stops = _cairo_malloc_ab (n_stops, sizeof (cairo_gradient_stop_t)); + if (unlikely (stops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + for (i = 0; i < pattern->n_stops; i++) { + if (reverse_stops) { + stops[i] = pattern->stops[pattern->n_stops - i - 1]; + stops[i].offset = 1.0 - stops[i].offset; + } else + stops[i] = pattern->stops[i]; + if (emulate_reflect) { + stops[i].offset /= 2; + if (i > 0 && i < (pattern->n_stops - 1)) { + if (reverse_stops) { + stops[i + pattern->n_stops - 1] = pattern->stops[i]; + stops[i + pattern->n_stops - 1].offset = + 0.5 + 0.5 * stops[i + pattern->n_stops - 1].offset; + } else { + stops[i + pattern->n_stops - 1] = pattern->stops[pattern->n_stops - i - 1]; + stops[i + pattern->n_stops - 1].offset = + 1 - 0.5 * stops[i + pattern->n_stops - 1].offset; + } + } + } + } + } else { + n_stops = pattern->n_stops; + stops = pattern->stops; + } + + if (start_offset >= 0.0) + for (i = 0; i < n_stops; i++) { + offset = start_offset + (1 - start_offset ) * stops[i].offset; + _cairo_output_stream_printf (output, + "\n", + offset, + stops[i].color.red * 100.0, + stops[i].color.green * 100.0, + stops[i].color.blue * 100.0, + stops[i].color.alpha); + } + else { + cairo_bool_t found = FALSE; + unsigned int offset_index; + cairo_color_stop_t offset_color_start, offset_color_stop; + + for (i = 0; i < n_stops; i++) { + if (stops[i].offset >= -start_offset) { + if (i > 0) { + if (stops[i].offset != stops[i-1].offset) { + double x0, x1; + cairo_color_stop_t *color0, *color1; + + x0 = stops[i-1].offset; + x1 = stops[i].offset; + color0 = &stops[i-1].color; + color1 = &stops[i].color; + offset_color_start.red = color0->red + (color1->red - color0->red) + * (-start_offset - x0) / (x1 - x0); + offset_color_start.green = color0->green + (color1->green - color0->green) + * (-start_offset - x0) / (x1 - x0); + offset_color_start.blue = color0->blue + (color1->blue - color0->blue) + * (-start_offset - x0) / (x1 - x0); + offset_color_start.alpha = color0->alpha + (color1->alpha - color0->alpha) + * (-start_offset - x0) / (x1 - x0); + offset_color_stop = offset_color_start; + } else { + offset_color_stop = stops[i-1].color; + offset_color_start = stops[i].color; + } + } else + offset_color_stop = offset_color_start = stops[i].color; + offset_index = i; + found = TRUE; + break; + } + } + + if (!found) { + offset_index = n_stops - 1; + offset_color_stop = offset_color_start = stops[offset_index].color; + } + + _cairo_output_stream_printf (output, + "\n", + offset_color_start.red * 100.0, + offset_color_start.green * 100.0, + offset_color_start.blue * 100.0, + offset_color_start.alpha); + for (i = offset_index; i < n_stops; i++) { + _cairo_output_stream_printf (output, + "\n", + stops[i].offset + start_offset, + stops[i].color.red * 100.0, + stops[i].color.green * 100.0, + stops[i].color.blue * 100.0, + stops[i].color.alpha); + } + for (i = 0; i < offset_index; i++) { + _cairo_output_stream_printf (output, + "\n", + 1.0 + stops[i].offset + start_offset, + stops[i].color.red * 100.0, + stops[i].color.green * 100.0, + stops[i].color.blue * 100.0, + stops[i].color.alpha); + } + + _cairo_output_stream_printf (output, + "\n", + offset_color_stop.red * 100.0, + offset_color_stop.green * 100.0, + offset_color_stop.blue * 100.0, + offset_color_stop.alpha); + + } + + if (reverse_stops || emulate_reflect) + free (stops); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_svg_surface_emit_pattern_extend (cairo_output_stream_t *output, + cairo_pattern_t *pattern) +{ + switch (pattern->extend) { + case CAIRO_EXTEND_REPEAT: + _cairo_output_stream_printf (output, "spreadMethod=\"repeat\" "); + break; + case CAIRO_EXTEND_REFLECT: + _cairo_output_stream_printf (output, "spreadMethod=\"reflect\" "); + break; + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_PAD: + break; + } +} + +static cairo_status_t +_cairo_svg_surface_emit_linear_pattern (cairo_svg_surface_t *surface, + cairo_linear_pattern_t *pattern, + cairo_output_stream_t *style, + cairo_bool_t is_stroke, + const cairo_matrix_t *parent_matrix) +{ + cairo_svg_document_t *document = surface->document; + cairo_matrix_t p2u; + cairo_status_t status; + + p2u = pattern->base.base.matrix; + status = cairo_matrix_invert (&p2u); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_output_stream_printf (document->xml_node_defs, + "linear_pattern_id, + pattern->pd1.x, pattern->pd1.y, + pattern->pd2.x, pattern->pd2.y); + + _cairo_svg_surface_emit_pattern_extend (document->xml_node_defs, &pattern->base.base), + _cairo_svg_surface_emit_transform (document->xml_node_defs, "gradientTransform", &p2u, parent_matrix); + _cairo_output_stream_printf (document->xml_node_defs, ">\n"); + + status = _cairo_svg_surface_emit_pattern_stops (document->xml_node_defs, + &pattern->base, 0.0, + FALSE, FALSE); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (document->xml_node_defs, + "\n"); + + _cairo_output_stream_printf (style, + "%s:url(#linear%d);", + is_stroke ? "stroke" : "fill", + document->linear_pattern_id); + + document->linear_pattern_id++; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_surface_emit_radial_pattern (cairo_svg_surface_t *surface, + cairo_radial_pattern_t *pattern, + cairo_output_stream_t *style, + cairo_bool_t is_stroke, + const cairo_matrix_t *parent_matrix) +{ + cairo_svg_document_t *document = surface->document; + cairo_matrix_t p2u; + cairo_extend_t extend; + double x0, y0, x1, y1, r0, r1; + double fx, fy; + cairo_bool_t reverse_stops; + cairo_status_t status; + cairo_circle_double_t *c0, *c1; + + extend = pattern->base.base.extend; + + if (pattern->cd1.radius < pattern->cd2.radius) { + c0 = &pattern->cd1; + c1 = &pattern->cd2; + reverse_stops = FALSE; + } else { + c0 = &pattern->cd2; + c1 = &pattern->cd1; + reverse_stops = TRUE; + } + + x0 = c0->center.x; + y0 = c0->center.y; + r0 = c0->radius; + x1 = c1->center.x; + y1 = c1->center.y; + r1 = c1->radius; + + p2u = pattern->base.base.matrix; + status = cairo_matrix_invert (&p2u); + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + if (r0 == r1) { + unsigned int n_stops = pattern->base.n_stops; + + _cairo_output_stream_printf (document->xml_node_defs, + "radial_pattern_id, + x1, y1, + x1, y1, r1); + _cairo_svg_surface_emit_transform (document->xml_node_defs, + "gradientTransform", + &p2u, parent_matrix); + _cairo_output_stream_printf (document->xml_node_defs, ">\n"); + + if (extend == CAIRO_EXTEND_NONE || n_stops < 1) + _cairo_output_stream_printf (document->xml_node_defs, + "\n"); + else { + _cairo_output_stream_printf (document->xml_node_defs, + "\n", + pattern->base.stops[0].color.red * 100.0, + pattern->base.stops[0].color.green * 100.0, + pattern->base.stops[0].color.blue * 100.0, + pattern->base.stops[0].color.alpha); + if (n_stops > 1) + _cairo_output_stream_printf (document->xml_node_defs, + "\n", + pattern->base.stops[n_stops - 1].color.red * 100.0, + pattern->base.stops[n_stops - 1].color.green * 100.0, + pattern->base.stops[n_stops - 1].color.blue * 100.0, + pattern->base.stops[n_stops - 1].color.alpha); + } + + } else { + double offset, r, x, y; + cairo_bool_t emulate_reflect = FALSE; + + fx = (r1 * x0 - r0 * x1) / (r1 - r0); + fy = (r1 * y0 - r0 * y1) / (r1 - r0); + + /* SVG doesn't support the inner circle and use instead a gradient focal. + * That means we need to emulate the cairo behaviour by processing the + * cairo gradient stops. + * The CAIRO_EXTENT_NONE and CAIRO_EXTENT_PAD modes are quite easy to handle, + * it's just a matter of stop position translation and calculation of + * the corresponding SVG radial gradient focal. + * The CAIRO_EXTENT_REFLECT and CAIRO_EXTEND_REPEAT modes require to compute a new + * radial gradient, with an new outer circle, equal to r1 - r0 in the CAIRO_EXTEND_REPEAT + * case, and 2 * (r1 - r0) in the CAIRO_EXTENT_REFLECT case, and a new gradient stop + * list that maps to the original cairo stop list. + */ + if ((extend == CAIRO_EXTEND_REFLECT + || extend == CAIRO_EXTEND_REPEAT) + && r0 > 0.0) { + double r_org = r1; + + if (extend == CAIRO_EXTEND_REFLECT) { + r1 = 2 * r1 - r0; + emulate_reflect = TRUE; + } + + offset = fmod (r1, r1 - r0) / (r1 - r0) - 1.0; + r = r1 - r0; + + /* New position of outer circle. */ + x = r * (x1 - fx) / r_org + fx; + y = r * (y1 - fy) / r_org + fy; + + x1 = x; + y1 = y; + r1 = r; + r0 = 0.0; + } else { + offset = r0 / r1; + } + + _cairo_output_stream_printf (document->xml_node_defs, + "radial_pattern_id, + x1, y1, + fx, fy, r1); + + if (emulate_reflect) + _cairo_output_stream_printf (document->xml_node_defs, "spreadMethod=\"repeat\" "); + else + _cairo_svg_surface_emit_pattern_extend (document->xml_node_defs, &pattern->base.base); + _cairo_svg_surface_emit_transform (document->xml_node_defs, "gradientTransform", &p2u, parent_matrix); + _cairo_output_stream_printf (document->xml_node_defs, ">\n"); + + /* To support cairo's EXTEND_NONE, (for which SVG has no similar + * notion), we add transparent color stops on either end of the + * user-provided stops. */ + if (extend == CAIRO_EXTEND_NONE) { + _cairo_output_stream_printf (document->xml_node_defs, + "\n"); + if (r0 != 0.0) + _cairo_output_stream_printf (document->xml_node_defs, + "\n", + r0 / r1); + } + status = _cairo_svg_surface_emit_pattern_stops (document->xml_node_defs, + &pattern->base, offset, + reverse_stops, + emulate_reflect); + if (unlikely (status)) + return status; + + if (pattern->base.base.extend == CAIRO_EXTEND_NONE) + _cairo_output_stream_printf (document->xml_node_defs, + "\n"); + } + + _cairo_output_stream_printf (document->xml_node_defs, + "\n"); + + _cairo_output_stream_printf (style, + "%s:url(#radial%d);", + is_stroke ? "stroke" : "fill", + document->radial_pattern_id); + + document->radial_pattern_id++; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_svg_surface_emit_pattern (cairo_svg_surface_t *surface, + const cairo_pattern_t *pattern, + cairo_output_stream_t *output, + cairo_bool_t is_stroke, + const cairo_matrix_t *parent_matrix) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_svg_surface_emit_solid_pattern (surface, (cairo_solid_pattern_t *) pattern, + output, is_stroke); + + case CAIRO_PATTERN_TYPE_SURFACE: + return _cairo_svg_surface_emit_surface_pattern (surface, (cairo_surface_pattern_t *) pattern, + output, is_stroke, parent_matrix); + + case CAIRO_PATTERN_TYPE_LINEAR: + return _cairo_svg_surface_emit_linear_pattern (surface, (cairo_linear_pattern_t *) pattern, + output, is_stroke, parent_matrix); + + case CAIRO_PATTERN_TYPE_RADIAL: + return _cairo_svg_surface_emit_radial_pattern (surface, (cairo_radial_pattern_t *) pattern, + output, is_stroke, parent_matrix); + + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + ASSERT_NOT_REACHED; + } + return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); +} + +static cairo_status_t +_cairo_svg_surface_emit_fill_style (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_fill_rule_t fill_rule, + const cairo_matrix_t *parent_matrix) +{ + _cairo_output_stream_printf (output, + "fill-rule:%s;", + fill_rule == CAIRO_FILL_RULE_EVEN_ODD ? + "evenodd" : "nonzero"); + _cairo_svg_surface_emit_operator_for_style (output, surface, op); + return _cairo_svg_surface_emit_pattern (surface, source, output, FALSE, parent_matrix); +} + +static cairo_status_t +_cairo_svg_surface_emit_stroke_style (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *parent_matrix) +{ + cairo_status_t status; + const char *line_cap, *line_join; + unsigned int i; + + switch (stroke_style->line_cap) { + case CAIRO_LINE_CAP_BUTT: + line_cap = "butt"; + break; + case CAIRO_LINE_CAP_ROUND: + line_cap = "round"; + break; + case CAIRO_LINE_CAP_SQUARE: + line_cap = "square"; + break; + default: + ASSERT_NOT_REACHED; + } + + switch (stroke_style->line_join) { + case CAIRO_LINE_JOIN_MITER: + line_join = "miter"; + break; + case CAIRO_LINE_JOIN_ROUND: + line_join = "round"; + break; + case CAIRO_LINE_JOIN_BEVEL: + line_join = "bevel"; + break; + default: + ASSERT_NOT_REACHED; + } + + _cairo_output_stream_printf (output, + "stroke-width:%f;" + "stroke-linecap:%s;" + "stroke-linejoin:%s;", + stroke_style->line_width, + line_cap, + line_join); + + status = _cairo_svg_surface_emit_pattern (surface, source, output, TRUE, parent_matrix); + if (unlikely (status)) + return status; + + _cairo_svg_surface_emit_operator_for_style (output, surface, op); + + if (stroke_style->num_dashes > 0) { + _cairo_output_stream_printf (output, "stroke-dasharray:"); + for (i = 0; i < stroke_style->num_dashes; i++) { + _cairo_output_stream_printf (output, "%f", + stroke_style->dash[i]); + if (i + 1 < stroke_style->num_dashes) + _cairo_output_stream_printf (output, ","); + else + _cairo_output_stream_printf (output, ";"); + } + if (stroke_style->dash_offset != 0.0) { + _cairo_output_stream_printf (output, + "stroke-dashoffset:%f;", + stroke_style->dash_offset); + } + } + + _cairo_output_stream_printf (output, + "stroke-miterlimit:%f;", + stroke_style->miter_limit); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_fill_stroke (void *abstract_surface, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + const cairo_path_fixed_t*path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_status_t status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, "xml_node, surface, fill_op, + fill_source, fill_rule, stroke_ctm_inverse); + if (unlikely (status)) + return status; + + status = _cairo_svg_surface_emit_stroke_style (surface->xml_node, surface, stroke_op, + stroke_source, stroke_style, stroke_ctm_inverse); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, "\" "); + + _cairo_svg_surface_emit_path (surface->xml_node, path, stroke_ctm_inverse); + + _cairo_svg_surface_emit_transform (surface->xml_node, " transform", stroke_ctm, NULL); + _cairo_output_stream_printf (surface->xml_node, "/>\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return _cairo_svg_surface_analyze_operation (surface, op, source); + + assert (_cairo_svg_surface_operation_supported (surface, op, source)); + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, "xml_node, surface, op, source, fill_rule, NULL); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, "\" "); + + _cairo_svg_surface_emit_path (surface->xml_node, path, NULL); + + _cairo_output_stream_printf (surface->xml_node, "/>\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_svg_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_svg_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + + /* XXX: The conversion to integers here is pretty bogus, (not to + * mention the arbitrary limitation of width to a short(!). We + * may need to come up with a better interface for get_size. + */ + rectangle->width = ceil (surface->width); + rectangle->height = ceil (surface->height); + + return TRUE; +} + +static cairo_status_t +_cairo_svg_surface_emit_paint (cairo_output_stream_t *output, + cairo_svg_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask_source, + const char *extra_attributes) +{ + cairo_status_t status; + + if (source->type == CAIRO_PATTERN_TYPE_SURFACE && + source->extend == CAIRO_EXTEND_NONE) + return _cairo_svg_surface_emit_composite_pattern (output, + surface, + op, + (cairo_surface_pattern_t *) source, + invalid_pattern_id, + mask_source ? &mask_source->matrix :NULL, + extra_attributes); + + _cairo_output_stream_printf (output, + "width, surface->height); + _cairo_svg_surface_emit_operator_for_style (output, surface, op); + status = _cairo_svg_surface_emit_pattern (surface, source, output, FALSE, NULL); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (output, "stroke:none;\""); + + if (extra_attributes) + _cairo_output_stream_printf (output, " %s", extra_attributes); + + _cairo_output_stream_printf (output, "/>\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_svg_surface_t *surface = abstract_surface; + + /* Emulation of clear and source operators, when no clipping region + * is defined. We just delete existing content of surface root node, + * and exit early if operator is clear. + */ + if ((op == CAIRO_OPERATOR_CLEAR || op == CAIRO_OPERATOR_SOURCE) && + clip == NULL) + { + switch (surface->paginated_mode) { + case CAIRO_PAGINATED_MODE_FALLBACK: + ASSERT_NOT_REACHED; + case CAIRO_PAGINATED_MODE_ANALYZE: + return CAIRO_STATUS_SUCCESS; + + case CAIRO_PAGINATED_MODE_RENDER: + status = _cairo_output_stream_destroy (surface->xml_node); + if (unlikely (status)) { + surface->xml_node = NULL; + return status; + } + + surface->xml_node = _cairo_memory_stream_create (); + if (_cairo_output_stream_get_status (surface->xml_node)) { + status = _cairo_output_stream_destroy (surface->xml_node); + surface->xml_node = NULL; + return status; + } + + if (op == CAIRO_OPERATOR_CLEAR) { + if (surface->content == CAIRO_CONTENT_COLOR) { + _cairo_output_stream_printf (surface->xml_node, + "\n", + surface->width, surface->height); + } + return CAIRO_STATUS_SUCCESS; + } + break; + } + } else { + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return _cairo_svg_surface_analyze_operation (surface, op, source); + + assert (_cairo_svg_surface_operation_supported (surface, op, source)); + } + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + return _cairo_svg_surface_emit_paint (surface->xml_node, + surface, op, source, 0, NULL); +} + +static cairo_int_status_t +_cairo_svg_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_status_t status; + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_document_t *document = surface->document; + cairo_output_stream_t *mask_stream; + char buffer[64]; + cairo_bool_t discard_filter = FALSE; + unsigned int mask_id; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + cairo_status_t source_status, mask_status; + + source_status = _cairo_svg_surface_analyze_operation (surface, op, source); + if (_cairo_status_is_error (source_status)) + return source_status; + + if (mask->has_component_alpha) { + mask_status = CAIRO_INT_STATUS_UNSUPPORTED; + } else { + mask_status = _cairo_svg_surface_analyze_operation (surface, op, mask); + if (_cairo_status_is_error (mask_status)) + return mask_status; + } + + return _cairo_analysis_surface_merge_status (source_status, + mask_status); + } + + assert (_cairo_svg_surface_operation_supported (surface, op, source)); + assert (_cairo_svg_surface_operation_supported (surface, CAIRO_OPERATOR_OVER, mask)); + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + if (mask->type == CAIRO_PATTERN_TYPE_SURFACE) { + const cairo_surface_pattern_t *surface_pattern = (const cairo_surface_pattern_t*) mask; + cairo_content_t content = surface_pattern->surface->content; + if (content == CAIRO_CONTENT_ALPHA) + discard_filter = TRUE; + } + + if (!discard_filter) + _cairo_svg_surface_emit_alpha_filter (document); + + /* _cairo_svg_surface_emit_paint() will output a pattern definition to + * document->xml_node_defs so we need to write the mask element to + * a temporary stream and then copy that to xml_node_defs. */ + mask_stream = _cairo_memory_stream_create (); + if (_cairo_output_stream_get_status (mask_stream)) + return _cairo_output_stream_destroy (mask_stream); + + mask_id = _cairo_svg_document_allocate_mask_id (document); + + _cairo_output_stream_printf (mask_stream, + "\n" + "%s", + mask_id, + discard_filter ? "" : " \n"); + status = _cairo_svg_surface_emit_paint (mask_stream, surface, CAIRO_OPERATOR_OVER, mask, source, NULL); + if (unlikely (status)) { + cairo_status_t ignore = _cairo_output_stream_destroy (mask_stream); + return status; + (void) ignore; + } + + _cairo_output_stream_printf (mask_stream, + "%s" + "\n", + discard_filter ? "" : " \n"); + _cairo_memory_stream_copy (mask_stream, document->xml_node_defs); + + status = _cairo_output_stream_destroy (mask_stream); + if (unlikely (status)) + return status; + + snprintf (buffer, sizeof buffer, "mask=\"url(#mask%d)\"", + mask_id); + status = _cairo_svg_surface_emit_paint (surface->xml_node, surface, op, source, 0, buffer); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_stroke (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_svg_surface_t *surface = abstract_dst; + cairo_status_t status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return _cairo_svg_surface_analyze_operation (surface, op, source); + + assert (_cairo_svg_surface_operation_supported (surface, op, source)); + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, "xml_node, surface, op, + source, stroke_style, ctm_inverse); + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, "\" "); + + _cairo_svg_surface_emit_path (surface->xml_node, path, ctm_inverse); + + _cairo_svg_surface_emit_transform (surface->xml_node, " transform", ctm, NULL); + _cairo_output_stream_printf (surface->xml_node, "/>\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_show_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_document_t *document = surface->document; + cairo_path_fixed_t path; + cairo_int_status_t status; + cairo_scaled_font_subsets_glyph_t subset_glyph; + int i; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return _cairo_svg_surface_analyze_operation (surface, op, pattern); + + assert (_cairo_svg_surface_operation_supported (surface, op, pattern)); + + if (num_glyphs <= 0) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + /* FIXME it's probably possible to apply a pattern of a gradient to + * a group of symbols, but I don't know how yet. Gradients or patterns + * are translated by x and y properties of use element. */ + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) + goto FALLBACK; + + _cairo_output_stream_printf (surface->xml_node, "xml_node, FALSE, NULL); + if (unlikely (status)) + return status; + + _cairo_svg_surface_emit_operator_for_style (surface->xml_node, surface, op); + + _cairo_output_stream_printf (surface->xml_node, "\">\n"); + + for (i = 0; i < num_glyphs; i++) { + status = _cairo_scaled_font_subsets_map_glyph (document->font_subsets, + scaled_font, glyphs[i].index, + NULL, 0, + &subset_glyph); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + _cairo_output_stream_printf (surface->xml_node, "\n"); + + glyphs += i; + num_glyphs -= i; + goto FALLBACK; + } + + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->xml_node, + " \n", + subset_glyph.font_id, + subset_glyph.subset_glyph_index, + glyphs[i].x, glyphs[i].y); + } + + _cairo_output_stream_printf (surface->xml_node, "\n"); + + return CAIRO_STATUS_SUCCESS; + +FALLBACK: + _cairo_path_fixed_init (&path); + + status = _cairo_scaled_font_glyph_path (scaled_font, + (cairo_glyph_t *) glyphs, + num_glyphs, &path); + + if (unlikely (status)) { + _cairo_path_fixed_fini (&path); + return status; + } + + status = _cairo_svg_surface_fill (abstract_surface, op, pattern, + &path, CAIRO_FILL_RULE_WINDING, + 0.0, CAIRO_ANTIALIAS_SUBPIXEL, + clip); + + _cairo_path_fixed_fini (&path); + + return status; +} + +static void +_cairo_svg_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_OFF); +} + + +static const char ** +_cairo_svg_surface_get_supported_mime_types (void *abstract_surface) +{ + return _cairo_svg_supported_mime_types; +} + +static const cairo_surface_backend_t cairo_svg_surface_backend = { + CAIRO_SURFACE_TYPE_SVG, + _cairo_svg_surface_finish, + + _cairo_default_context_create, + + NULL, /* create_similar: handled by wrapper */ + NULL, /* create_similar_image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + _cairo_svg_surface_copy_page, + _cairo_svg_surface_show_page, + + _cairo_svg_surface_get_extents, + _cairo_svg_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark dirty rectangle */ + + _cairo_svg_surface_paint, + _cairo_svg_surface_mask, + _cairo_svg_surface_stroke, + _cairo_svg_surface_fill, + _cairo_svg_surface_fill_stroke, + _cairo_svg_surface_show_glyphs, + NULL, /* has_show_text_glyphs */ + NULL, /* show_text_glyphs */ + _cairo_svg_surface_get_supported_mime_types, +}; + +static cairo_status_t +_cairo_svg_document_create (cairo_output_stream_t *output_stream, + double width, + double height, + cairo_svg_version_t version, + cairo_svg_document_t **document_out) +{ + cairo_svg_document_t *document; + cairo_status_t status, status_ignored; + + if (output_stream->status) + return output_stream->status; + + document = malloc (sizeof (cairo_svg_document_t)); + if (unlikely (document == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* The use of defs for font glyphs imposes no per-subset limit. */ + document->font_subsets = _cairo_scaled_font_subsets_create_scaled (); + if (unlikely (document->font_subsets == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_DOCUMENT; + } + + document->output_stream = output_stream; + document->refcount = 1; + document->owner = NULL; + document->finished = FALSE; + document->width = width; + document->height = height; + + document->linear_pattern_id = 0; + document->radial_pattern_id = 0; + document->pattern_id = 0; + document->filter_id = 0; + document->clip_id = 0; + document->mask_id = 0; + + document->xml_node_defs = _cairo_memory_stream_create (); + status = _cairo_output_stream_get_status (document->xml_node_defs); + if (unlikely (status)) + goto CLEANUP_NODE_DEFS; + + document->xml_node_glyphs = _cairo_memory_stream_create (); + status = _cairo_output_stream_get_status (document->xml_node_glyphs); + if (unlikely (status)) + goto CLEANUP_NODE_GLYPHS; + + document->alpha_filter = FALSE; + + document->svg_version = version; + + *document_out = document; + return CAIRO_STATUS_SUCCESS; + + CLEANUP_NODE_GLYPHS: + status_ignored = _cairo_output_stream_destroy (document->xml_node_glyphs); + CLEANUP_NODE_DEFS: + status_ignored = _cairo_output_stream_destroy (document->xml_node_defs); + _cairo_scaled_font_subsets_destroy (document->font_subsets); + CLEANUP_DOCUMENT: + free (document); + return status; +} + +static cairo_svg_document_t * +_cairo_svg_document_reference (cairo_svg_document_t *document) +{ + document->refcount++; + + return document; +} + +static unsigned int +_cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document) +{ + return document->mask_id++; +} + +static cairo_status_t +_cairo_svg_document_destroy (cairo_svg_document_t *document) +{ + cairo_status_t status; + + document->refcount--; + if (document->refcount > 0) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_svg_document_finish (document); + + free (document); + + return status; +} + +static cairo_status_t +_cairo_svg_document_finish (cairo_svg_document_t *document) +{ + cairo_status_t status, status2; + cairo_output_stream_t *output = document->output_stream; + cairo_svg_page_t *page; + unsigned int i; + + if (document->finished) + return CAIRO_STATUS_SUCCESS; + + /* + * Should we add DOCTYPE? + * + * Google says no. + * + * http://tech.groups.yahoo.com/group/svg-developers/message/48562: + * There's a bunch of issues, but just to pick a few: + * - they'll give false positives. + * - they'll give false negatives. + * - they're namespace-unaware. + * - they don't wildcard. + * So when they say OK they really haven't checked anything, when + * they say NOT OK they might be on crack, and like all + * namespace-unaware things they're a dead branch of the XML tree. + * + * http://jwatt.org/svg/authoring/: + * Unfortunately the SVG DTDs are a source of so many issues that the + * SVG WG has decided not to write one for the upcoming SVG 1.2 + * standard. In fact SVG WG members are even telling people not to use + * a DOCTYPE declaration in SVG 1.0 and 1.1 documents. + */ + + _cairo_output_stream_printf (output, + "\n" + "\n", + document->width, document->height, + document->width, document->height, + _cairo_svg_internal_version_strings [document->svg_version]); + + status = _cairo_svg_document_emit_font_subsets (document); + + if (_cairo_memory_stream_length (document->xml_node_glyphs) > 0 || + _cairo_memory_stream_length (document->xml_node_defs) > 0) { + _cairo_output_stream_printf (output, "\n"); + if (_cairo_memory_stream_length (document->xml_node_glyphs) > 0) { + _cairo_output_stream_printf (output, "\n"); + _cairo_memory_stream_copy (document->xml_node_glyphs, output); + _cairo_output_stream_printf (output, "\n"); + } + _cairo_memory_stream_copy (document->xml_node_defs, output); + _cairo_output_stream_printf (output, "\n"); + } + + if (document->owner != NULL) { + cairo_svg_surface_t *surface; + + surface = (cairo_svg_surface_t *) _cairo_paginated_surface_get_target (document->owner); + if (surface->xml_node != NULL && + _cairo_memory_stream_length (surface->xml_node) > 0) { + if (unlikely (_cairo_svg_surface_store_page (surface) == NULL)) { + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + if (surface->page_set.num_elements > 1 && + _cairo_svg_version_has_page_set_support (document->svg_version)) { + _cairo_output_stream_printf (output, "\n"); + for (i = 0; i < surface->page_set.num_elements; i++) { + page = _cairo_array_index (&surface->page_set, i); + _cairo_output_stream_printf (output, "\n"); + _cairo_output_stream_printf (output, + "\n", + page->surface_id); + _cairo_memory_stream_copy (page->xml_node, output); + _cairo_output_stream_printf (output, "\n\n"); + } + _cairo_output_stream_printf (output, "\n"); + } else if (surface->page_set.num_elements > 0) { + page = _cairo_array_index (&surface->page_set, surface->page_set.num_elements - 1); + _cairo_output_stream_printf (output, + "\n", + page->surface_id); + _cairo_memory_stream_copy (page->xml_node, output); + _cairo_output_stream_printf (output, "\n"); + } + } + + _cairo_output_stream_printf (output, "\n"); + + status2 = _cairo_output_stream_destroy (document->xml_node_glyphs); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + status2 = _cairo_output_stream_destroy (document->xml_node_defs); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + status2 = _cairo_output_stream_destroy (output); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + document->finished = TRUE; + + return status; +} + +static void +_cairo_svg_surface_set_paginated_mode (void *abstract_surface, + cairo_paginated_mode_t paginated_mode) +{ + cairo_svg_surface_t *surface = abstract_surface; + + surface->paginated_mode = paginated_mode; +} + +static cairo_bool_t +_cairo_svg_surface_supports_fine_grained_fallbacks (void *abstract_surface) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface->document->svg_version >= CAIRO_SVG_VERSION_1_2) { + status = _cairo_svg_surface_analyze_operator (surface, + CAIRO_OPERATOR_SOURCE); + } + + return status == CAIRO_INT_STATUS_SUCCESS; +} + +static const cairo_paginated_surface_backend_t cairo_svg_surface_paginated_backend = { + NULL /*_cairo_svg_surface_start_page*/, + _cairo_svg_surface_set_paginated_mode, + NULL, /* _cairo_svg_surface_set_bounding_box */ + NULL, /* _cairo_svg_surface_set_fallback_images_required */ + _cairo_svg_surface_supports_fine_grained_fallbacks, + +}; diff --git a/src/cairo-svg.h b/src/cairo-svg.h new file mode 100644 index 000000000..592c645f6 --- /dev/null +++ b/src/cairo-svg.h @@ -0,0 +1,84 @@ +/* cairo - a vector graphics library with display and print output + * + * cairo-svg.h + * + * Copyright © 2005 Emmanuel Pacaud + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#ifndef CAIRO_SVG_H +#define CAIRO_SVG_H + +#include "cairo.h" + +#if CAIRO_HAS_SVG_SURFACE + +CAIRO_BEGIN_DECLS + +/** + * cairo_svg_version_t: + * @CAIRO_SVG_VERSION_1_1: The version 1.1 of the SVG specification. (Since 1.2) + * @CAIRO_SVG_VERSION_1_2: The version 1.2 of the SVG specification. (Since 1.2) + * + * #cairo_svg_version_t is used to describe the version number of the SVG + * specification that a generated SVG file will conform to. + * + * Since: 1.2 + **/ +typedef enum _cairo_svg_version { + CAIRO_SVG_VERSION_1_1, + CAIRO_SVG_VERSION_1_2 +} cairo_svg_version_t; + +cairo_public cairo_surface_t * +cairo_svg_surface_create (const char *filename, + double width_in_points, + double height_in_points); + +cairo_public cairo_surface_t * +cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); + +cairo_public void +cairo_svg_surface_restrict_to_version (cairo_surface_t *surface, + cairo_svg_version_t version); + +cairo_public void +cairo_svg_get_versions (cairo_svg_version_t const **versions, + int *num_versions); + +cairo_public const char * +cairo_svg_version_to_string (cairo_svg_version_t version); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_SVG_SURFACE */ +# error Cairo was not compiled with support for the svg backend +#endif /* CAIRO_HAS_SVG_SURFACE */ + +#endif /* CAIRO_SVG_H */ diff --git a/src/cairo-tee-surface-private.h b/src/cairo-tee-surface-private.h new file mode 100644 index 000000000..a83cfc959 --- /dev/null +++ b/src/cairo-tee-surface-private.h @@ -0,0 +1,47 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_TEE_SURFACE_PRIVATE_H +#define CAIRO_TEE_SURFACE_PRIVATE_H + +#include "cairoint.h" + +cairo_private cairo_surface_t * +_cairo_tee_surface_find_match (void *abstract_surface, + const cairo_surface_backend_t *backend, + cairo_content_t content); + +#endif /* CAIRO_TEE_SURFACE_PRIVATE_H */ diff --git a/src/cairo-tee-surface.c b/src/cairo-tee-surface.c new file mode 100644 index 000000000..294e5f162 --- /dev/null +++ b/src/cairo-tee-surface.c @@ -0,0 +1,602 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + * Chris Wilson + */ + +/* This surface supports redirecting all its input to multiple surfaces. + */ + +#include "cairoint.h" + +#include "cairo-tee.h" + +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-tee-surface-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-surface-wrapper-private.h" +#include "cairo-array-private.h" +#include "cairo-image-surface-inline.h" + +typedef struct _cairo_tee_surface { + cairo_surface_t base; + + cairo_surface_wrapper_t master; + cairo_array_t slaves; +} cairo_tee_surface_t; + +slim_hidden_proto (cairo_tee_surface_create); +slim_hidden_proto (cairo_tee_surface_add); + +static cairo_surface_t * +_cairo_tee_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + + cairo_tee_surface_t *other = abstract_surface; + cairo_surface_t *similar; + cairo_surface_t *surface; + cairo_surface_wrapper_t *slaves; + int n, num_slaves; + + similar = _cairo_surface_wrapper_create_similar (&other->master, + content, width, height); + surface = cairo_tee_surface_create (similar); + cairo_surface_destroy (similar); + if (unlikely (surface->status)) + return surface; + + num_slaves = _cairo_array_num_elements (&other->slaves); + slaves = _cairo_array_index (&other->slaves, 0); + for (n = 0; n < num_slaves; n++) { + + similar = _cairo_surface_wrapper_create_similar (&slaves[n], + content, + width, height); + cairo_tee_surface_add (surface, similar); + cairo_surface_destroy (similar); + } + + if (unlikely (surface->status)) { + cairo_status_t status = surface->status; + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + + return surface; +} + +static cairo_status_t +_cairo_tee_surface_finish (void *abstract_surface) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + int n, num_slaves; + + _cairo_surface_wrapper_fini (&surface->master); + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) + _cairo_surface_wrapper_fini (&slaves[n]); + + _cairo_array_fini (&surface->slaves); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_tee_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_tee_surface_t *surface = abstract_surface; + return _cairo_surface_get_source (surface->master.target, extents); +} + +static cairo_status_t +_cairo_tee_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + int num_slaves, n; + + /* we prefer to use a real image surface if available */ + if (_cairo_surface_is_image (surface->master.target)) { + return _cairo_surface_wrapper_acquire_source_image (&surface->master, + image_out, image_extra); + } + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + if (_cairo_surface_is_image (slaves[n].target)) { + return _cairo_surface_wrapper_acquire_source_image (&slaves[n], + image_out, + image_extra); + } + } + + return _cairo_surface_wrapper_acquire_source_image (&surface->master, + image_out, image_extra); +} + +static void +_cairo_tee_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_tee_surface_t *surface = abstract_surface; + + _cairo_surface_wrapper_release_source_image (&surface->master, + image, image_extra); +} + +static cairo_surface_t * +_cairo_tee_surface_snapshot (void *abstract_surface) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + int num_slaves, n; + + /* we prefer to use a recording surface for our snapshots */ + if (_cairo_surface_is_recording (surface->master.target)) + return _cairo_surface_wrapper_snapshot (&surface->master); + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + if (_cairo_surface_is_recording (slaves[n].target)) + return _cairo_surface_wrapper_snapshot (&slaves[n]); + } + + return _cairo_surface_wrapper_snapshot (&surface->master); +} + +static cairo_bool_t +_cairo_tee_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_tee_surface_t *surface = abstract_surface; + + return _cairo_surface_wrapper_get_extents (&surface->master, rectangle); +} + +static void +_cairo_tee_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_tee_surface_t *surface = abstract_surface; + + _cairo_surface_wrapper_get_font_options (&surface->master, options); +} + +static cairo_int_status_t +_cairo_tee_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + int n, num_slaves; + cairo_int_status_t status; + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + status = _cairo_surface_wrapper_paint (&slaves[n], op, source, clip); + if (unlikely (status)) + return status; + } + + return _cairo_surface_wrapper_paint (&surface->master, op, source, clip); +} + +static cairo_int_status_t +_cairo_tee_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + cairo_int_status_t status; + int n, num_slaves; + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + status = _cairo_surface_wrapper_mask (&slaves[n], + op, source, mask, clip); + if (unlikely (status)) + return status; + } + + return _cairo_surface_wrapper_mask (&surface->master, + op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_tee_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + cairo_int_status_t status; + int n, num_slaves; + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + status = _cairo_surface_wrapper_stroke (&slaves[n], + op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + clip); + if (unlikely (status)) + return status; + } + + return _cairo_surface_wrapper_stroke (&surface->master, + op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_tee_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + cairo_int_status_t status; + int n, num_slaves; + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + status = _cairo_surface_wrapper_fill (&slaves[n], + op, source, + path, fill_rule, + tolerance, antialias, + clip); + if (unlikely (status)) + return status; + } + + return _cairo_surface_wrapper_fill (&surface->master, + op, source, + path, fill_rule, + tolerance, antialias, + clip); +} + +static cairo_bool_t +_cairo_tee_surface_has_show_text_glyphs (void *abstract_surface) +{ + return TRUE; +} + +static cairo_int_status_t +_cairo_tee_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + cairo_int_status_t status; + int n, num_slaves; + cairo_glyph_t *glyphs_copy; + + /* XXX: This copying is ugly. */ + glyphs_copy = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unlikely (glyphs_copy == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs); + status = _cairo_surface_wrapper_show_text_glyphs (&slaves[n], op, + source, + utf8, utf8_len, + glyphs_copy, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font, + clip); + if (unlikely (status)) + goto CLEANUP; + } + + memcpy (glyphs_copy, glyphs, sizeof (cairo_glyph_t) * num_glyphs); + status = _cairo_surface_wrapper_show_text_glyphs (&surface->master, op, + source, + utf8, utf8_len, + glyphs_copy, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font, + clip); +CLEANUP: + free (glyphs_copy); + return status; +} + +static const cairo_surface_backend_t cairo_tee_surface_backend = { + CAIRO_SURFACE_TYPE_TEE, + _cairo_tee_surface_finish, + + _cairo_default_context_create, /* XXX */ + + _cairo_tee_surface_create_similar, + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_tee_surface_source, + _cairo_tee_surface_acquire_source_image, + _cairo_tee_surface_release_source_image, + _cairo_tee_surface_snapshot, + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_tee_surface_get_extents, + _cairo_tee_surface_get_font_options, + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_tee_surface_paint, + _cairo_tee_surface_mask, + _cairo_tee_surface_stroke, + _cairo_tee_surface_fill, + NULL, /* fill_stroke */ + + NULL, /* show_glyphs */ + + _cairo_tee_surface_has_show_text_glyphs, + _cairo_tee_surface_show_text_glyphs +}; + +cairo_surface_t * +cairo_tee_surface_create (cairo_surface_t *master) +{ + cairo_tee_surface_t *surface; + + if (unlikely (master->status)) + return _cairo_surface_create_in_error (master->status); + + surface = malloc (sizeof (cairo_tee_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &cairo_tee_surface_backend, + master->device, + master->content); + + _cairo_surface_wrapper_init (&surface->master, master); + + _cairo_array_init (&surface->slaves, sizeof (cairo_surface_wrapper_t)); + + return &surface->base; +} +slim_hidden_def (cairo_tee_surface_create); + +void +cairo_tee_surface_add (cairo_surface_t *abstract_surface, + cairo_surface_t *target) +{ + cairo_tee_surface_t *surface; + cairo_surface_wrapper_t slave; + cairo_status_t status; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (abstract_surface->backend != &cairo_tee_surface_backend) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + if (unlikely (target->status)) { + status = _cairo_surface_set_error (abstract_surface, target->status); + return; + } + + surface = (cairo_tee_surface_t *) abstract_surface; + + _cairo_surface_wrapper_init (&slave, target); + status = _cairo_array_append (&surface->slaves, &slave); + if (unlikely (status)) { + _cairo_surface_wrapper_fini (&slave); + status = _cairo_surface_set_error (&surface->base, status); + } +} +slim_hidden_def (cairo_tee_surface_add); + +void +cairo_tee_surface_remove (cairo_surface_t *abstract_surface, + cairo_surface_t *target) +{ + cairo_tee_surface_t *surface; + cairo_surface_wrapper_t *slaves; + int n, num_slaves; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (abstract_surface->backend != &cairo_tee_surface_backend) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + surface = (cairo_tee_surface_t *) abstract_surface; + if (target == surface->master.target) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_INDEX)); + return; + } + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + if (slaves[n].target == target) + break; + } + + if (n == num_slaves) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_INDEX)); + return; + } + + _cairo_surface_wrapper_fini (&slaves[n]); + for (n++; n < num_slaves; n++) + slaves[n-1] = slaves[n]; + surface->slaves.num_elements--; /* XXX: cairo_array_remove()? */ +} + +cairo_surface_t * +cairo_tee_surface_index (cairo_surface_t *abstract_surface, + unsigned int index) +{ + cairo_tee_surface_t *surface; + + if (unlikely (abstract_surface->status)) + return _cairo_surface_create_in_error (abstract_surface->status); + if (unlikely (abstract_surface->finished)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (abstract_surface->backend != &cairo_tee_surface_backend) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + + surface = (cairo_tee_surface_t *) abstract_surface; + if (index == 0) { + return surface->master.target; + } else { + cairo_surface_wrapper_t *slave; + + index--; + + if (index >= _cairo_array_num_elements (&surface->slaves)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_INDEX)); + + slave = _cairo_array_index (&surface->slaves, index); + return slave->target; + } +} + +cairo_surface_t * +_cairo_tee_surface_find_match (void *abstract_surface, + const cairo_surface_backend_t *backend, + cairo_content_t content) +{ + cairo_tee_surface_t *surface = abstract_surface; + cairo_surface_wrapper_t *slaves; + int num_slaves, n; + + /* exact match first */ + if (surface->master.target->backend == backend && + surface->master.target->content == content) + { + return surface->master.target; + } + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + if (slaves[n].target->backend == backend && + slaves[n].target->content == content) + { + return slaves[n].target; + } + } + + /* matching backend? */ + if (surface->master.target->backend == backend) + return surface->master.target; + + num_slaves = _cairo_array_num_elements (&surface->slaves); + slaves = _cairo_array_index (&surface->slaves, 0); + for (n = 0; n < num_slaves; n++) { + if (slaves[n].target->backend == backend) + return slaves[n].target; + } + + return NULL; +} diff --git a/src/cairo-tee.h b/src/cairo-tee.h new file mode 100644 index 000000000..9125a3a4a --- /dev/null +++ b/src/cairo-tee.h @@ -0,0 +1,66 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_TEE_H +#define CAIRO_TEE_H + +#include "cairo.h" + +#if CAIRO_HAS_TEE_SURFACE + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_tee_surface_create (cairo_surface_t *master); + +cairo_public void +cairo_tee_surface_add (cairo_surface_t *surface, + cairo_surface_t *target); + +cairo_public void +cairo_tee_surface_remove (cairo_surface_t *surface, + cairo_surface_t *target); + +cairo_public cairo_surface_t * +cairo_tee_surface_index (cairo_surface_t *surface, + unsigned int index); + +CAIRO_END_DECLS + +#else /*CAIRO_HAS_TEE_SURFACE*/ +# error Cairo was not compiled with support for the TEE backend +#endif /*CAIRO_HAS_TEE_SURFACE*/ + +#endif /*CAIRO_TEE_H*/ diff --git a/src/cairo-time-private.h b/src/cairo-time-private.h new file mode 100644 index 000000000..06dc912b4 --- /dev/null +++ b/src/cairo-time-private.h @@ -0,0 +1,94 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright (C) 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Andrea Canciani + * + */ + +#ifndef CAIRO_TIME_PRIVATE_H +#define CAIRO_TIME_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-wideint-private.h" + +/* Make the base type signed for easier arithmetic */ +typedef cairo_int64_t cairo_time_t; + +#define _cairo_time_add _cairo_int64_add +#define _cairo_time_sub _cairo_int64_sub +#define _cairo_time_gt _cairo_int64_gt +#define _cairo_time_lt _cairo_int64_lt + +#define _cairo_time_to_double _cairo_int64_to_double +#define _cairo_time_from_double _cairo_double_to_int64 + +cairo_private int +_cairo_time_cmp (const void *a, + const void *b); + +cairo_private double +_cairo_time_to_s (cairo_time_t t); + +cairo_private cairo_time_t +_cairo_time_from_s (double t); + +cairo_private cairo_time_t +_cairo_time_get (void); + +static cairo_always_inline cairo_time_t +_cairo_time_get_delta (cairo_time_t t) +{ + cairo_time_t now; + + now = _cairo_time_get (); + + return _cairo_time_sub (now, t); +} + +static cairo_always_inline double +_cairo_time_to_ns (cairo_time_t t) +{ + return 1.e9 * _cairo_time_to_s (t); +} + +static cairo_always_inline cairo_time_t +_cairo_time_max (cairo_time_t a, cairo_time_t b) +{ + if (_cairo_int64_gt (a, b)) + return a; + else + return b; +} + +static cairo_always_inline cairo_time_t +_cairo_time_min (cairo_time_t a, cairo_time_t b) +{ + if (_cairo_int64_lt (a, b)) + return a; + else + return b; +} + +#endif diff --git a/src/cairo-time.c b/src/cairo-time.c new file mode 100644 index 000000000..a0003fbfc --- /dev/null +++ b/src/cairo-time.c @@ -0,0 +1,225 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright (c) 2007 Netlabs + * Copyright (c) 2006 Mozilla Corporation + * Copyright (c) 2006 Red Hat, Inc. + * Copyright (c) 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Peter Weilbacher + * Vladimir Vukicevic + * Carl Worth + * Andrea Canciani + */ + +#include "cairoint.h" + +#include "cairo-time-private.h" + +#if HAVE_CLOCK_GETTIME +#if defined(CLOCK_MONOTONIC_RAW) +#define CAIRO_CLOCK CLOCK_MONOTONIC_RAW +#elif defined(CLOCK_MONOTONIC) +#define CAIRO_CLOCK CLOCK_MONOTONIC +#endif +#endif + +#if defined(__APPLE__) +#include + +static cairo_always_inline double +_cairo_time_1s (void) +{ + mach_timebase_info_data_t freq; + + mach_timebase_info (&freq); + + return 1000000000. * freq.denom / freq.numer; +} + +cairo_time_t +_cairo_time_get (void) +{ + return mach_absolute_time (); +} + +#elif defined(__OS2__) +#define INCL_BASE +#include + +static cairo_always_inline double +_cairo_time_1s (void) +{ + ULONG freq; + + DosTmrQueryFreq (&freq); + + return freq; +} + +cairo_time_t +_cairo_time_get (void) +{ + QWORD t; + cairo_int64_t r; + + DosTmrQueryTime (&t); + + r = _cairo_int64_lsl (_cairo_int32_to_int64 (t.ulHi), 32); + r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.ulLo)); + + return r; +} + +#elif _WIN32 +#define WIN32_LEAN_AND_MEAN +#include + +static cairo_always_inline double +_cairo_time_1s (void) +{ + LARGE_INTEGER freq; + + QueryPerformanceFrequency (&freq); + + return freq.QuadPart; +} + +#ifndef HAVE_UINT64_T +static cairo_always_inline cairo_time_t +_cairo_time_from_large_integer (LARGE_INTEGER t) +{ + cairo_int64_t r; + + r = _cairo_int64_lsl (_cairo_int32_to_int64 (t.HighPart), 32); + r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.LowPart)); + + return r; +} +#else +static cairo_always_inline cairo_time_t +_cairo_time_from_large_integer (LARGE_INTEGER t) +{ + return t.QuadPart; +} +#endif + +cairo_time_t +_cairo_time_get (void) +{ + LARGE_INTEGER t; + + QueryPerformanceCounter (&t); + + return _cairo_time_from_large_integer(t); +} + +#elif defined(CAIRO_CLOCK) +#include + +static cairo_always_inline double +_cairo_time_1s (void) +{ + return 1000000000; +} + +cairo_time_t +_cairo_time_get (void) +{ + struct timespec t; + cairo_time_t r; + + clock_gettime (CAIRO_CLOCK, &t); + + r = _cairo_double_to_int64 (_cairo_time_1s ()); + r = _cairo_int64_mul (r, _cairo_int32_to_int64 (t.tv_sec)); + r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.tv_nsec)); + + return r; +} + +#else +#include + +static cairo_always_inline double +_cairo_time_1s (void) +{ + return 1000000; +} + +cairo_time_t +_cairo_time_get (void) +{ + struct timeval t; + cairo_time_t r; + + gettimeofday (&t, NULL); + + r = _cairo_double_to_int64 (_cairo_time_1s ()); + r = _cairo_int64_mul (r, _cairo_int32_to_int64 (t.tv_sec)); + r = _cairo_int64_add (r, _cairo_int32_to_int64 (t.tv_usec)); + + return r; +} + +#endif + +int +_cairo_time_cmp (const void *a, + const void *b) +{ + const cairo_time_t *ta = a, *tb = b; + return _cairo_int64_cmp (*ta, *tb); +} + +static double +_cairo_time_ticks_per_sec (void) +{ + static double ticks = 0; + + if (unlikely (ticks == 0)) + ticks = _cairo_time_1s (); + + return ticks; +} + +static double +_cairo_time_s_per_tick (void) +{ + static double s = 0; + + if (unlikely (s == 0)) + s = 1. / _cairo_time_ticks_per_sec (); + + return s; +} + +double +_cairo_time_to_s (cairo_time_t t) +{ + return _cairo_int64_to_double (t) * _cairo_time_s_per_tick (); +} + +cairo_time_t +_cairo_time_from_s (double t) +{ + return _cairo_double_to_int64 (t * _cairo_time_ticks_per_sec ()); +} diff --git a/src/cairo-tor-scan-converter.c b/src/cairo-tor-scan-converter.c new file mode 100644 index 000000000..b1b51872b --- /dev/null +++ b/src/cairo-tor-scan-converter.c @@ -0,0 +1,1899 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* glitter-paths - polygon scan converter + * + * Copyright (c) 2008 M Joonas Pihlaja + * Copyright (c) 2007 David Turner + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +/* This is the Glitter paths scan converter incorporated into cairo. + * The source is from commit 734c53237a867a773640bd5b64816249fa1730f8 + * of + * + * http://gitweb.freedesktop.org/?p=users/joonas/glitter-paths + */ +/* Glitter-paths is a stand alone polygon rasteriser derived from + * David Turner's reimplementation of Tor Anderssons's 15x17 + * supersampling rasteriser from the Apparition graphics library. The + * main new feature here is cheaply choosing per-scan line between + * doing fully analytical coverage computation for an entire row at a + * time vs. using a supersampling approach. + * + * David Turner's code can be found at + * + * http://david.freetype.org/rasterizer-shootout/raster-comparison-20070813.tar.bz2 + * + * In particular this file incorporates large parts of ftgrays_tor10.h + * from raster-comparison-20070813.tar.bz2 + */ +/* Overview + * + * A scan converter's basic purpose to take polygon edges and convert + * them into an RLE compressed A8 mask. This one works in two phases: + * gathering edges and generating spans. + * + * 1) As the user feeds the scan converter edges they are vertically + * clipped and bucketted into a _polygon_ data structure. The edges + * are also snapped from the user's coordinates to the subpixel grid + * coordinates used during scan conversion. + * + * user + * | + * | edges + * V + * polygon buckets + * + * 2) Generating spans works by performing a vertical sweep of pixel + * rows from top to bottom and maintaining an _active_list_ of edges + * that intersect the row. From the active list the fill rule + * determines which edges are the left and right edges of the start of + * each span, and their contribution is then accumulated into a pixel + * coverage list (_cell_list_) as coverage deltas. Once the coverage + * deltas of all edges are known we can form spans of constant pixel + * coverage by summing the deltas during a traversal of the cell list. + * At the end of a pixel row the cell list is sent to a coverage + * blitter for rendering to some target surface. + * + * The pixel coverages are computed by either supersampling the row + * and box filtering a mono rasterisation, or by computing the exact + * coverages of edges in the active list. The supersampling method is + * used whenever some edge starts or stops within the row or there are + * edge intersections in the row. + * + * polygon bucket for \ + * current pixel row | + * | | + * | activate new edges | Repeat GRID_Y times if we + * V \ are supersampling this row, + * active list / or just once if we're computing + * | | analytical coverage. + * | coverage deltas | + * V | + * pixel coverage list / + * | + * V + * coverage blitter + */ +#include "cairoint.h" +#include "cairo-spans-private.h" +#include "cairo-error-private.h" + +#include +#include +#include +#include + +/*------------------------------------------------------------------------- + * cairo specific config + */ +#define I static + +/* Prefer cairo's status type. */ +#define GLITTER_HAVE_STATUS_T 1 +#define GLITTER_STATUS_SUCCESS CAIRO_STATUS_SUCCESS +#define GLITTER_STATUS_NO_MEMORY CAIRO_STATUS_NO_MEMORY +typedef cairo_status_t glitter_status_t; + +/* The input coordinate scale and the rasterisation grid scales. */ +#define GLITTER_INPUT_BITS CAIRO_FIXED_FRAC_BITS +#define GRID_X_BITS CAIRO_FIXED_FRAC_BITS +#define GRID_Y 15 + +/* Set glitter up to use a cairo span renderer to do the coverage + * blitting. */ +struct pool; +struct cell_list; + +/*------------------------------------------------------------------------- + * glitter-paths.h + */ + +/* "Input scaled" numbers are fixed precision reals with multiplier + * 2**GLITTER_INPUT_BITS. Input coordinates are given to glitter as + * pixel scaled numbers. These get converted to the internal grid + * scaled numbers as soon as possible. Internal overflow is possible + * if GRID_X/Y inside glitter-paths.c is larger than + * 1< +#include +#include + +/* All polygon coordinates are snapped onto a subsample grid. "Grid + * scaled" numbers are fixed precision reals with multiplier GRID_X or + * GRID_Y. */ +typedef int grid_scaled_t; +typedef int grid_scaled_x_t; +typedef int grid_scaled_y_t; + +/* Default x/y scale factors. + * You can either define GRID_X/Y_BITS to get a power-of-two scale + * or define GRID_X/Y separately. */ +#if !defined(GRID_X) && !defined(GRID_X_BITS) +# define GRID_X_BITS 8 +#endif +#if !defined(GRID_Y) && !defined(GRID_Y_BITS) +# define GRID_Y 15 +#endif + +/* Use GRID_X/Y_BITS to define GRID_X/Y if they're available. */ +#ifdef GRID_X_BITS +# define GRID_X (1 << GRID_X_BITS) +#endif +#ifdef GRID_Y_BITS +# define GRID_Y (1 << GRID_Y_BITS) +#endif + +/* The GRID_X_TO_INT_FRAC macro splits a grid scaled coordinate into + * integer and fractional parts. The integer part is floored. */ +#if defined(GRID_X_TO_INT_FRAC) + /* do nothing */ +#elif defined(GRID_X_BITS) +# define GRID_X_TO_INT_FRAC(x, i, f) \ + _GRID_TO_INT_FRAC_shift(x, i, f, GRID_X_BITS) +#else +# define GRID_X_TO_INT_FRAC(x, i, f) \ + _GRID_TO_INT_FRAC_general(x, i, f, GRID_X) +#endif + +#define _GRID_TO_INT_FRAC_general(t, i, f, m) do { \ + (i) = (t) / (m); \ + (f) = (t) % (m); \ + if ((f) < 0) { \ + --(i); \ + (f) += (m); \ + } \ +} while (0) + +#define _GRID_TO_INT_FRAC_shift(t, i, f, b) do { \ + (f) = (t) & ((1 << (b)) - 1); \ + (i) = (t) >> (b); \ +} while (0) + +/* A grid area is a real in [0,1] scaled by 2*GRID_X*GRID_Y. We want + * to be able to represent exactly areas of subpixel trapezoids whose + * vertices are given in grid scaled coordinates. The scale factor + * comes from needing to accurately represent the area 0.5*dx*dy of a + * triangle with base dx and height dy in grid scaled numbers. */ +#define GRID_XY (2*GRID_X*GRID_Y) /* Unit area on the grid. */ + +/* GRID_AREA_TO_ALPHA(area): map [0,GRID_XY] to [0,255]. */ +#if GRID_XY == 510 +# define GRID_AREA_TO_ALPHA(c) (((c)+1) >> 1) +#elif GRID_XY == 255 +# define GRID_AREA_TO_ALPHA(c) (c) +#elif GRID_XY == 64 +# define GRID_AREA_TO_ALPHA(c) (((c) << 2) | -(((c) & 0x40) >> 6)) +#elif GRID_XY == 128 +# define GRID_AREA_TO_ALPHA(c) ((((c) << 1) | -((c) >> 7)) & 255) +#elif GRID_XY == 256 +# define GRID_AREA_TO_ALPHA(c) (((c) | -((c) >> 8)) & 255) +#elif GRID_XY == 15 +# define GRID_AREA_TO_ALPHA(c) (((c) << 4) + (c)) +#elif GRID_XY == 2*256*15 +# define GRID_AREA_TO_ALPHA(c) (((c) + ((c)<<4) + 256) >> 9) +#else +# define GRID_AREA_TO_ALPHA(c) (((c)*255 + GRID_XY/2) / GRID_XY) +#endif + +#define UNROLL3(x) x x x + +struct quorem { + int32_t quo; + int64_t rem; +}; + +/* Header for a chunk of memory in a memory pool. */ +struct _pool_chunk { + /* # bytes used in this chunk. */ + size_t size; + + /* # bytes total in this chunk */ + size_t capacity; + + /* Pointer to the previous chunk or %NULL if this is the sentinel + * chunk in the pool header. */ + struct _pool_chunk *prev_chunk; + + /* Actual data starts here. Well aligned even for 64 bit types. */ + int64_t data; +}; + +/* The int64_t data member of _pool_chunk just exists to enforce alignment, + * it shouldn't be included in the allocated size for the struct. */ +#define SIZEOF_POOL_CHUNK (sizeof(struct _pool_chunk) - sizeof(int64_t)) + +/* A memory pool. This is supposed to be embedded on the stack or + * within some other structure. It may optionally be followed by an + * embedded array from which requests are fulfilled until + * malloc needs to be called to allocate a first real chunk. */ +struct pool { + /* Chunk we're allocating from. */ + struct _pool_chunk *current; + + jmp_buf *jmp; + + /* Free list of previously allocated chunks. All have >= default + * capacity. */ + struct _pool_chunk *first_free; + + /* The default capacity of a chunk. */ + size_t default_capacity; + + /* Header for the sentinel chunk. Directly following the pool + * struct should be some space for embedded elements from which + * the sentinel chunk allocates from. This is expressed as a char + * array so that the 'int64_t data' member of _pool_chunk isn't + * included. This way embedding struct pool in other structs works + * without wasting space. */ + char sentinel[SIZEOF_POOL_CHUNK]; +}; + +/* A polygon edge. */ +struct edge { + /* Next in y-bucket or active list. */ + struct edge *next, *prev; + + /* The clipped y of the top of the edge. */ + grid_scaled_y_t ytop; + + /* Number of subsample rows remaining to scan convert of this + * edge. */ + grid_scaled_y_t height_left; + + /* Original sign of the edge: +1 for downwards, -1 for upwards + * edges. */ + int dir; + int cell; + + /* Current x coordinate while the edge is on the active + * list. Initialised to the x coordinate of the top of the + * edge. The quotient is in grid_scaled_x_t units and the + * remainder is mod dy in grid_scaled_y_t units.*/ + struct quorem x; + + /* Advance of the current x when moving down a subsample line. */ + struct quorem dxdy; + + /* Advance of the current x when moving down a full pixel + * row. Only initialised when the height of the edge is large + * enough that there's a chance the edge could be stepped by a + * full row's worth of subsample rows at a time. */ + struct quorem dxdy_full; + + /* y2-y1 after orienting the edge downwards. */ + int64_t dy; +}; + +#define EDGE_Y_BUCKET_INDEX(y, ymin) (((y) - (ymin))/GRID_Y) + +/* A collection of sorted and vertically clipped edges of the polygon. + * Edges are moved from the polygon to an active list while scan + * converting. */ +struct polygon { + /* The vertical clip extents. */ + grid_scaled_y_t ymin, ymax; + + /* Array of edges all starting in the same bucket. An edge is put + * into bucket EDGE_BUCKET_INDEX(edge->ytop, polygon->ymin) when + * it is added to the polygon. */ + struct edge **y_buckets; + struct edge *y_buckets_embedded[64]; + + struct { + struct pool base[1]; + struct edge embedded[32]; + } edge_pool; +}; + +/* A cell records the effect on pixel coverage of polygon edges + * passing through a pixel. It contains two accumulators of pixel + * coverage. + * + * Consider the effects of a polygon edge on the coverage of a pixel + * it intersects and that of the following one. The coverage of the + * following pixel is the height of the edge multiplied by the width + * of the pixel, and the coverage of the pixel itself is the area of + * the trapezoid formed by the edge and the right side of the pixel. + * + * +-----------------------+-----------------------+ + * | | | + * | | | + * |_______________________|_______________________| + * | \...................|.......................|\ + * | \..................|.......................| | + * | \.................|.......................| | + * | \....covered.....|.......................| | + * | \....area.......|.......................| } covered height + * | \..............|.......................| | + * |uncovered\.............|.......................| | + * | area \............|.......................| | + * |___________\...........|.......................|/ + * | | | + * | | | + * | | | + * +-----------------------+-----------------------+ + * + * Since the coverage of the following pixel will always be a multiple + * of the width of the pixel, we can store the height of the covered + * area instead. The coverage of the pixel itself is the total + * coverage minus the area of the uncovered area to the left of the + * edge. As it's faster to compute the uncovered area we only store + * that and subtract it from the total coverage later when forming + * spans to blit. + * + * The heights and areas are signed, with left edges of the polygon + * having positive sign and right edges having negative sign. When + * two edges intersect they swap their left/rightness so their + * contribution above and below the intersection point must be + * computed separately. */ +struct cell { + struct cell *next; + int x; + int16_t uncovered_area; + int16_t covered_height; +}; + +/* A cell list represents the scan line sparsely as cells ordered by + * ascending x. It is geared towards scanning the cells in order + * using an internal cursor. */ +struct cell_list { + /* Sentinel nodes */ + struct cell head, tail; + + /* Cursor state for iterating through the cell list. */ + struct cell *cursor, *rewind; + + /* Cells in the cell list are owned by the cell list and are + * allocated from this pool. */ + struct { + struct pool base[1]; + struct cell embedded[32]; + } cell_pool; +}; + +struct cell_pair { + struct cell *cell1; + struct cell *cell2; +}; + +/* The active list contains edges in the current scan line ordered by + * the x-coordinate of the intercept of the edge and the scan line. */ +struct active_list { + /* Leftmost edge on the current scan line. */ + struct edge head, tail; + + /* A lower bound on the height of the active edges is used to + * estimate how soon some active edge ends. We can't advance the + * scan conversion by a full pixel row if an edge ends somewhere + * within it. */ + grid_scaled_y_t min_height; + int is_vertical; +}; + +struct glitter_scan_converter { + struct polygon polygon[1]; + struct active_list active[1]; + struct cell_list coverages[1]; + + cairo_half_open_span_t *spans; + cairo_half_open_span_t spans_embedded[64]; + + /* Clip box. */ + grid_scaled_x_t xmin, xmax; + grid_scaled_y_t ymin, ymax; +}; + +static struct _pool_chunk * +_pool_chunk_init( + struct _pool_chunk *p, + struct _pool_chunk *prev_chunk, + size_t capacity) +{ + p->prev_chunk = prev_chunk; + p->size = 0; + p->capacity = capacity; + return p; +} + +static struct _pool_chunk * +_pool_chunk_create(struct pool *pool, size_t size) +{ + struct _pool_chunk *p; + + p = malloc(SIZEOF_POOL_CHUNK + size); + if (unlikely (NULL == p)) + longjmp (*pool->jmp, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + + return _pool_chunk_init(p, pool->current, size); +} + +static void +pool_init(struct pool *pool, + jmp_buf *jmp, + size_t default_capacity, + size_t embedded_capacity) +{ + pool->jmp = jmp; + pool->current = (void*) pool->sentinel; + pool->first_free = NULL; + pool->default_capacity = default_capacity; + _pool_chunk_init(pool->current, NULL, embedded_capacity); +} + +static void +pool_fini(struct pool *pool) +{ + struct _pool_chunk *p = pool->current; + do { + while (NULL != p) { + struct _pool_chunk *prev = p->prev_chunk; + if (p != (void *) pool->sentinel) + free(p); + p = prev; + } + p = pool->first_free; + pool->first_free = NULL; + } while (NULL != p); +} + +/* Satisfy an allocation by first allocating a new large enough chunk + * and adding it to the head of the pool's chunk list. This function + * is called as a fallback if pool_alloc() couldn't do a quick + * allocation from the current chunk in the pool. */ +static void * +_pool_alloc_from_new_chunk( + struct pool *pool, + size_t size) +{ + struct _pool_chunk *chunk; + void *obj; + size_t capacity; + + /* If the allocation is smaller than the default chunk size then + * try getting a chunk off the free list. Force alloc of a new + * chunk for large requests. */ + capacity = size; + chunk = NULL; + if (size < pool->default_capacity) { + capacity = pool->default_capacity; + chunk = pool->first_free; + if (chunk) { + pool->first_free = chunk->prev_chunk; + _pool_chunk_init(chunk, pool->current, chunk->capacity); + } + } + + if (NULL == chunk) + chunk = _pool_chunk_create (pool, capacity); + pool->current = chunk; + + obj = ((unsigned char*)&chunk->data + chunk->size); + chunk->size += size; + return obj; +} + +/* Allocate size bytes from the pool. The first allocated address + * returned from a pool is aligned to 8 bytes. Subsequent + * addresses will maintain alignment as long as multiples of 8 are + * allocated. Returns the address of a new memory area or %NULL on + * allocation failures. The pool retains ownership of the returned + * memory. */ +inline static void * +pool_alloc (struct pool *pool, size_t size) +{ + struct _pool_chunk *chunk = pool->current; + + if (size <= chunk->capacity - chunk->size) { + void *obj = ((unsigned char*)&chunk->data + chunk->size); + chunk->size += size; + return obj; + } else { + return _pool_alloc_from_new_chunk(pool, size); + } +} + +/* Relinquish all pool_alloced memory back to the pool. */ +static void +pool_reset (struct pool *pool) +{ + /* Transfer all used chunks to the chunk free list. */ + struct _pool_chunk *chunk = pool->current; + if (chunk != (void *) pool->sentinel) { + while (chunk->prev_chunk != (void *) pool->sentinel) { + chunk = chunk->prev_chunk; + } + chunk->prev_chunk = pool->first_free; + pool->first_free = pool->current; + } + /* Reset the sentinel as the current chunk. */ + pool->current = (void *) pool->sentinel; + pool->current->size = 0; +} + +/* Rewinds the cell list's cursor to the beginning. After rewinding + * we're good to cell_list_find() the cell any x coordinate. */ +inline static void +cell_list_rewind (struct cell_list *cells) +{ + cells->cursor = &cells->head; +} + +inline static void +cell_list_maybe_rewind (struct cell_list *cells, int x) +{ + if (x < cells->cursor->x) { + cells->cursor = cells->rewind; + if (x < cells->cursor->x) + cells->cursor = &cells->head; + } +} + +inline static void +cell_list_set_rewind (struct cell_list *cells) +{ + cells->rewind = cells->cursor; +} + +static void +cell_list_init(struct cell_list *cells, jmp_buf *jmp) +{ + pool_init(cells->cell_pool.base, jmp, + 256*sizeof(struct cell), + sizeof(cells->cell_pool.embedded)); + cells->tail.next = NULL; + cells->tail.x = INT_MAX; + cells->head.x = INT_MIN; + cells->head.next = &cells->tail; + cell_list_rewind (cells); +} + +static void +cell_list_fini(struct cell_list *cells) +{ + pool_fini (cells->cell_pool.base); +} + +/* Empty the cell list. This is called at the start of every pixel + * row. */ +inline static void +cell_list_reset (struct cell_list *cells) +{ + cell_list_rewind (cells); + cells->head.next = &cells->tail; + pool_reset (cells->cell_pool.base); +} + +inline static struct cell * +cell_list_alloc (struct cell_list *cells, + struct cell *tail, + int x) +{ + struct cell *cell; + + cell = pool_alloc (cells->cell_pool.base, sizeof (struct cell)); + cell->next = tail->next; + tail->next = cell; + cell->x = x; + *(uint32_t *)&cell->uncovered_area = 0; + + return cell; +} + +/* Find a cell at the given x-coordinate. Returns %NULL if a new cell + * needed to be allocated but couldn't be. Cells must be found with + * non-decreasing x-coordinate until the cell list is rewound using + * cell_list_rewind(). Ownership of the returned cell is retained by + * the cell list. */ +inline static struct cell * +cell_list_find (struct cell_list *cells, int x) +{ + struct cell *tail = cells->cursor; + + if (tail->x == x) + return tail; + + while (1) { + UNROLL3({ + if (tail->next->x > x) + break; + tail = tail->next; + }); + } + + if (tail->x != x) + tail = cell_list_alloc (cells, tail, x); + return cells->cursor = tail; + +} + +/* Find two cells at x1 and x2. This is exactly equivalent + * to + * + * pair.cell1 = cell_list_find(cells, x1); + * pair.cell2 = cell_list_find(cells, x2); + * + * except with less function call overhead. */ +inline static struct cell_pair +cell_list_find_pair(struct cell_list *cells, int x1, int x2) +{ + struct cell_pair pair; + + pair.cell1 = cells->cursor; + while (1) { + UNROLL3({ + if (pair.cell1->next->x > x1) + break; + pair.cell1 = pair.cell1->next; + }); + } + if (pair.cell1->x != x1) + pair.cell1 = cell_list_alloc (cells, pair.cell1, x1); + + pair.cell2 = pair.cell1; + while (1) { + UNROLL3({ + if (pair.cell2->next->x > x2) + break; + pair.cell2 = pair.cell2->next; + }); + } + if (pair.cell2->x != x2) + pair.cell2 = cell_list_alloc (cells, pair.cell2, x2); + + cells->cursor = pair.cell2; + return pair; +} + +/* Add a subpixel span covering [x1, x2) to the coverage cells. */ +inline static void +cell_list_add_subspan(struct cell_list *cells, + grid_scaled_x_t x1, + grid_scaled_x_t x2) +{ + int ix1, fx1; + int ix2, fx2; + + if (x1 == x2) + return; + + GRID_X_TO_INT_FRAC(x1, ix1, fx1); + GRID_X_TO_INT_FRAC(x2, ix2, fx2); + + if (ix1 != ix2) { + struct cell_pair p; + p = cell_list_find_pair(cells, ix1, ix2); + p.cell1->uncovered_area += 2*fx1; + ++p.cell1->covered_height; + p.cell2->uncovered_area -= 2*fx2; + --p.cell2->covered_height; + } else { + struct cell *cell = cell_list_find(cells, ix1); + cell->uncovered_area += 2*(fx1-fx2); + } +} + +inline static void full_step (struct edge *e) +{ + if (e->dy == 0) + return; + + e->x.quo += e->dxdy_full.quo; + e->x.rem += e->dxdy_full.rem; + if (e->x.rem < 0) { + e->x.quo--; + e->x.rem += e->dy; + } else if (e->x.rem >= e->dy) { + ++e->x.quo; + e->x.rem -= e->dy; + } + + e->cell = e->x.quo + (e->x.rem >= e->dy/2); +} + + +/* Adds the analytical coverage of an edge crossing the current pixel + * row to the coverage cells and advances the edge's x position to the + * following row. + * + * This function is only called when we know that during this pixel row: + * + * 1) The relative order of all edges on the active list doesn't + * change. In particular, no edges intersect within this row to pixel + * precision. + * + * 2) No new edges start in this row. + * + * 3) No existing edges end mid-row. + * + * This function depends on being called with all edges from the + * active list in the order they appear on the list (i.e. with + * non-decreasing x-coordinate.) */ +static void +cell_list_render_edge(struct cell_list *cells, + struct edge *edge, + int sign) +{ + struct quorem x1, x2; + grid_scaled_x_t fx1, fx2; + int ix1, ix2; + + x1 = edge->x; + full_step (edge); + x2 = edge->x; + + /* Step back from the sample location (half-subrow) to the pixel origin */ + if (edge->dy) { + x1.quo -= edge->dxdy.quo / 2; + x1.rem -= edge->dxdy.rem / 2; + if (x1.rem < 0) { + --x1.quo; + x1.rem += edge->dy; + } else if (x1.rem >= edge->dy) { + ++x1.quo; + x1.rem -= edge->dy; + } + + x2.quo -= edge->dxdy.quo / 2; + x2.rem -= edge->dxdy.rem / 2; + if (x2.rem < 0) { + --x2.quo; + x2.rem += edge->dy; + } else if (x2.rem >= edge->dy) { + ++x2.quo; + x2.rem -= edge->dy; + } + } + + GRID_X_TO_INT_FRAC(x1.quo, ix1, fx1); + GRID_X_TO_INT_FRAC(x2.quo, ix2, fx2); + + cell_list_maybe_rewind(cells, MIN(ix1, ix2)); + + /* Edge is entirely within a column? */ + if (ix1 == ix2) { + /* We always know that ix1 is >= the cell list cursor in this + * case due to the no-intersections precondition. */ + struct cell *cell = cell_list_find(cells, ix1); + cell->covered_height += sign*GRID_Y; + cell->uncovered_area += sign*(fx1 + fx2)*GRID_Y; + return; + } + + /* Orient the edge left-to-right. */ + if (ix2 < ix1) { + struct quorem tx; + int t; + + t = ix1; + ix1 = ix2; + ix2 = t; + + t = fx1; + fx1 = fx2; + fx2 = t; + + tx = x1; + x1 = x2; + x2 = tx; + } + + /* Add coverage for all pixels [ix1,ix2] on this row crossed + * by the edge. */ + { + struct cell_pair pair; + struct quorem y; + int64_t tmp, dx; + int y_last; + + dx = (x2.quo - x1.quo) * edge->dy + (x2.rem - x1.rem); + + tmp = (ix1 + 1) * GRID_X * edge->dy; + tmp -= x1.quo * edge->dy + x1.rem; + tmp *= GRID_Y; + + y.quo = tmp / dx; + y.rem = tmp % dx; + + /* When rendering a previous edge on the active list we may + * advance the cell list cursor past the leftmost pixel of the + * current edge even though the two edges don't intersect. + * e.g. consider two edges going down and rightwards: + * + * --\_+---\_+-----+-----+---- + * \_ \_ | | + * | \_ | \_ | | + * | \_| \_| | + * | \_ \_ | + * ----+-----+-\---+-\---+---- + * + * The left edge touches cells past the starting cell of the + * right edge. Fortunately such cases are rare. + */ + + pair = cell_list_find_pair(cells, ix1, ix1+1); + pair.cell1->uncovered_area += sign*y.quo*(GRID_X + fx1); + pair.cell1->covered_height += sign*y.quo; + y_last = y.quo; + + if (ix1+1 < ix2) { + struct cell *cell = pair.cell2; + struct quorem dydx_full; + + dydx_full.quo = GRID_Y * GRID_X * edge->dy / dx; + dydx_full.rem = GRID_Y * GRID_X * edge->dy % dx; + + ++ix1; + do { + y.quo += dydx_full.quo; + y.rem += dydx_full.rem; + if (y.rem >= dx) { + y.quo++; + y.rem -= dx; + } + + cell->uncovered_area += sign*(y.quo - y_last)*GRID_X; + cell->covered_height += sign*(y.quo - y_last); + y_last = y.quo; + + ++ix1; + cell = cell_list_find(cells, ix1); + } while (ix1 != ix2); + + pair.cell2 = cell; + } + pair.cell2->uncovered_area += sign*(GRID_Y - y_last)*fx2; + pair.cell2->covered_height += sign*(GRID_Y - y_last); + } +} + +static void +polygon_init (struct polygon *polygon, jmp_buf *jmp) +{ + polygon->ymin = polygon->ymax = 0; + polygon->y_buckets = polygon->y_buckets_embedded; + pool_init (polygon->edge_pool.base, jmp, + 8192 - sizeof (struct _pool_chunk), + sizeof (polygon->edge_pool.embedded)); +} + +static void +polygon_fini (struct polygon *polygon) +{ + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + pool_fini (polygon->edge_pool.base); +} + +/* Empties the polygon of all edges. The polygon is then prepared to + * receive new edges and clip them to the vertical range + * [ymin,ymax). */ +static glitter_status_t +polygon_reset (struct polygon *polygon, + grid_scaled_y_t ymin, + grid_scaled_y_t ymax) +{ + unsigned h = ymax - ymin; + unsigned num_buckets = EDGE_Y_BUCKET_INDEX(ymax + GRID_Y-1, ymin); + + pool_reset(polygon->edge_pool.base); + + if (unlikely (h > 0x7FFFFFFFU - GRID_Y)) + goto bail_no_mem; /* even if you could, you wouldn't want to. */ + + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + polygon->y_buckets = polygon->y_buckets_embedded; + if (num_buckets > ARRAY_LENGTH (polygon->y_buckets_embedded)) { + polygon->y_buckets = _cairo_malloc_ab (num_buckets, + sizeof (struct edge *)); + if (unlikely (NULL == polygon->y_buckets)) + goto bail_no_mem; + } + memset (polygon->y_buckets, 0, num_buckets * sizeof (struct edge *)); + + polygon->ymin = ymin; + polygon->ymax = ymax; + return GLITTER_STATUS_SUCCESS; + +bail_no_mem: + polygon->ymin = 0; + polygon->ymax = 0; + return GLITTER_STATUS_NO_MEMORY; +} + +static void +_polygon_insert_edge_into_its_y_bucket(struct polygon *polygon, + struct edge *e) +{ + unsigned ix = EDGE_Y_BUCKET_INDEX(e->ytop, polygon->ymin); + struct edge **ptail = &polygon->y_buckets[ix]; + e->next = *ptail; + *ptail = e; +} + +static void +active_list_reset (struct active_list *active) +{ + active->head.height_left = INT_MAX; + active->head.dy = 0; + active->head.cell = INT_MIN; + active->head.prev = NULL; + active->head.next = &active->tail; + active->tail.prev = &active->head; + active->tail.next = NULL; + active->tail.cell = INT_MAX; + active->tail.height_left = INT_MAX; + active->tail.dy = 0; + active->min_height = 0; + active->is_vertical = 1; +} + +static void +active_list_init(struct active_list *active) +{ + active_list_reset(active); +} + +/* + * Merge two sorted edge lists. + * Input: + * - head_a: The head of the first list. + * - head_b: The head of the second list; head_b cannot be NULL. + * Output: + * Returns the head of the merged list. + * + * Implementation notes: + * To make it fast (in particular, to reduce to an insertion sort whenever + * one of the two input lists only has a single element) we iterate through + * a list until its head becomes greater than the head of the other list, + * then we switch their roles. As soon as one of the two lists is empty, we + * just attach the other one to the current list and exit. + * Writes to memory are only needed to "switch" lists (as it also requires + * attaching to the output list the list which we will be iterating next) and + * to attach the last non-empty list. + */ +static struct edge * +merge_sorted_edges (struct edge *head_a, struct edge *head_b) +{ + struct edge *head, **next, *prev; + int32_t x; + + prev = head_a->prev; + next = &head; + if (head_a->cell <= head_b->cell) { + head = head_a; + } else { + head = head_b; + head_b->prev = prev; + goto start_with_b; + } + + do { + x = head_b->cell; + while (head_a != NULL && head_a->cell <= x) { + prev = head_a; + next = &head_a->next; + head_a = head_a->next; + } + + head_b->prev = prev; + *next = head_b; + if (head_a == NULL) + return head; + +start_with_b: + x = head_a->cell; + while (head_b != NULL && head_b->cell <= x) { + prev = head_b; + next = &head_b->next; + head_b = head_b->next; + } + + head_a->prev = prev; + *next = head_a; + if (head_b == NULL) + return head; + } while (1); +} + +/* + * Sort (part of) a list. + * Input: + * - list: The list to be sorted; list cannot be NULL. + * - limit: Recursion limit. + * Output: + * - head_out: The head of the sorted list containing the first 2^(level+1) elements of the + * input list; if the input list has fewer elements, head_out be a sorted list + * containing all the elements of the input list. + * Returns the head of the list of unprocessed elements (NULL if the sorted list contains + * all the elements of the input list). + * + * Implementation notes: + * Special case single element list, unroll/inline the sorting of the first two elements. + * Some tail recursion is used since we iterate on the bottom-up solution of the problem + * (we start with a small sorted list and keep merging other lists of the same size to it). + */ +static struct edge * +sort_edges (struct edge *list, + unsigned int level, + struct edge **head_out) +{ + struct edge *head_other, *remaining; + unsigned int i; + + head_other = list->next; + + if (head_other == NULL) { + *head_out = list; + return NULL; + } + + remaining = head_other->next; + if (list->cell <= head_other->cell) { + *head_out = list; + head_other->next = NULL; + } else { + *head_out = head_other; + head_other->prev = list->prev; + head_other->next = list; + list->prev = head_other; + list->next = NULL; + } + + for (i = 0; i < level && remaining; i++) { + remaining = sort_edges (remaining, i, &head_other); + *head_out = merge_sorted_edges (*head_out, head_other); + } + + return remaining; +} + + static struct edge * +merge_unsorted_edges (struct edge *head, struct edge *unsorted) +{ + sort_edges (unsorted, UINT_MAX, &unsorted); + return merge_sorted_edges (head, unsorted); +} + +/* Test if the edges on the active list can be safely advanced by a + * full row without intersections or any edges ending. */ +inline static int +can_do_full_row (struct active_list *active) +{ + const struct edge *e; + int prev_x = INT_MIN; + + /* Recomputes the minimum height of all edges on the active + * list if we have been dropping edges. */ + if (active->min_height <= 0) { + int min_height = INT_MAX; + int is_vertical = 1; + + e = active->head.next; + while (NULL != e) { + if (e->height_left < min_height) + min_height = e->height_left; + is_vertical &= e->dy == 0; + e = e->next; + } + + active->is_vertical = is_vertical; + active->min_height = min_height; + } + + if (active->min_height < GRID_Y) + return 0; + + /* Check for intersections as no edges end during the next row. */ + for (e = active->head.next; e != &active->tail; e = e->next) { + int cell; + + if (e->dy) { + struct quorem x = e->x; + x.quo += e->dxdy_full.quo; + x.rem += e->dxdy_full.rem; + if (x.rem < 0) { + x.quo--; + x.rem += e->dy; + } else if (x.rem >= e->dy) { + x.quo++; + x.rem -= e->dy; + } + cell = x.quo + (x.rem >= e->dy/2); + } else + cell = e->cell; + + if (cell < prev_x) + return 0; + + prev_x = cell; + } + + return 1; +} + +/* Merges edges on the given subpixel row from the polygon to the + * active_list. */ +inline static void +active_list_merge_edges_from_bucket(struct active_list *active, + struct edge *edges) +{ + active->head.next = merge_unsorted_edges (active->head.next, edges); +} + +inline static int +polygon_fill_buckets (struct active_list *active, + struct edge *edge, + int y, + struct edge **buckets) +{ + grid_scaled_y_t min_height = active->min_height; + int is_vertical = active->is_vertical; + int max_suby = 0; + + while (edge) { + struct edge *next = edge->next; + int suby = edge->ytop - y; + if (buckets[suby]) + buckets[suby]->prev = edge; + edge->next = buckets[suby]; + edge->prev = NULL; + buckets[suby] = edge; + if (edge->height_left < min_height) + min_height = edge->height_left; + is_vertical &= edge->dy == 0; + edge = next; + if (suby > max_suby) + max_suby = suby; + } + + active->is_vertical = is_vertical; + active->min_height = min_height; + + return max_suby; +} + +static void step (struct edge *edge) +{ + if (edge->dy == 0) + return; + + edge->x.quo += edge->dxdy.quo; + edge->x.rem += edge->dxdy.rem; + if (edge->x.rem < 0) { + --edge->x.quo; + edge->x.rem += edge->dy; + } else if (edge->x.rem >= edge->dy) { + ++edge->x.quo; + edge->x.rem -= edge->dy; + } + + edge->cell = edge->x.quo + (edge->x.rem >= edge->dy/2); +} + +inline static void +sub_row (struct active_list *active, + struct cell_list *coverages, + unsigned int mask) +{ + struct edge *edge = active->head.next; + int xstart = INT_MIN, prev_x = INT_MIN; + int winding = 0; + + cell_list_rewind (coverages); + + while (&active->tail != edge) { + struct edge *next = edge->next; + int xend = edge->cell; + + if (--edge->height_left) { + step (edge); + + if (edge->cell < prev_x) { + struct edge *pos = edge->prev; + pos->next = next; + next->prev = pos; + do { + pos = pos->prev; + } while (edge->cell < pos->cell); + pos->next->prev = edge; + edge->next = pos->next; + edge->prev = pos; + pos->next = edge; + } else + prev_x = edge->cell; + active->min_height = -1; + } else { + edge->prev->next = next; + next->prev = edge->prev; + } + + winding += edge->dir; + if ((winding & mask) == 0) { + if (next->cell != xend) { + cell_list_add_subspan (coverages, xstart, xend); + xstart = INT_MIN; + } + } else if (xstart == INT_MIN) + xstart = xend; + + edge = next; + } +} + +inline static void dec (struct active_list *a, struct edge *e, int h) +{ + e->height_left -= h; + if (e->height_left == 0) { + e->prev->next = e->next; + e->next->prev = e->prev; + a->min_height = -1; + } +} + +static void +full_row (struct active_list *active, + struct cell_list *coverages, + unsigned int mask) +{ + struct edge *left = active->head.next; + + while (&active->tail != left) { + struct edge *right; + int winding; + + dec (active, left, GRID_Y); + + winding = left->dir; + right = left->next; + do { + dec (active, right, GRID_Y); + + winding += right->dir; + if ((winding & mask) == 0 && right->next->cell != right->cell) + break; + + full_step (right); + + right = right->next; + } while (1); + + cell_list_set_rewind (coverages); + cell_list_render_edge (coverages, left, +1); + cell_list_render_edge (coverages, right, -1); + + left = right->next; + } +} + +static void +_glitter_scan_converter_init(glitter_scan_converter_t *converter, jmp_buf *jmp) +{ + polygon_init(converter->polygon, jmp); + active_list_init(converter->active); + cell_list_init(converter->coverages, jmp); + converter->xmin=0; + converter->ymin=0; + converter->xmax=0; + converter->ymax=0; +} + +static void +_glitter_scan_converter_fini(glitter_scan_converter_t *self) +{ + if (self->spans != self->spans_embedded) + free (self->spans); + + polygon_fini(self->polygon); + cell_list_fini(self->coverages); + + self->xmin=0; + self->ymin=0; + self->xmax=0; + self->ymax=0; +} + +static grid_scaled_t +int_to_grid_scaled(int i, int scale) +{ + /* Clamp to max/min representable scaled number. */ + if (i >= 0) { + if (i >= INT_MAX/scale) + i = INT_MAX/scale; + } + else { + if (i <= INT_MIN/scale) + i = INT_MIN/scale; + } + return i*scale; +} + +#define int_to_grid_scaled_x(x) int_to_grid_scaled((x), GRID_X) +#define int_to_grid_scaled_y(x) int_to_grid_scaled((x), GRID_Y) + +I glitter_status_t +glitter_scan_converter_reset( + glitter_scan_converter_t *converter, + int xmin, int ymin, + int xmax, int ymax) +{ + glitter_status_t status; + int max_num_spans; + + converter->xmin = 0; converter->xmax = 0; + converter->ymin = 0; converter->ymax = 0; + + max_num_spans = xmax - xmin + 1; + + if (max_num_spans > ARRAY_LENGTH(converter->spans_embedded)) { + converter->spans = _cairo_malloc_ab (max_num_spans, + sizeof (cairo_half_open_span_t)); + if (unlikely (converter->spans == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + converter->spans = converter->spans_embedded; + + xmin = int_to_grid_scaled_x(xmin); + ymin = int_to_grid_scaled_y(ymin); + xmax = int_to_grid_scaled_x(xmax); + ymax = int_to_grid_scaled_y(ymax); + + active_list_reset(converter->active); + cell_list_reset(converter->coverages); + status = polygon_reset(converter->polygon, ymin, ymax); + if (status) + return status; + + converter->xmin = xmin; + converter->xmax = xmax; + converter->ymin = ymin; + converter->ymax = ymax; + return GLITTER_STATUS_SUCCESS; +} + +/* INPUT_TO_GRID_X/Y (in_coord, out_grid_scaled, grid_scale) + * These macros convert an input coordinate in the client's + * device space to the rasterisation grid. + */ +/* Gah.. this bit of ugly defines INPUT_TO_GRID_X/Y so as to use + * shifts if possible, and something saneish if not. + */ +#if !defined(INPUT_TO_GRID_Y) && defined(GRID_Y_BITS) && GRID_Y_BITS <= GLITTER_INPUT_BITS +# define INPUT_TO_GRID_Y(in, out) (out) = (in) >> (GLITTER_INPUT_BITS - GRID_Y_BITS) +#else +# define INPUT_TO_GRID_Y(in, out) INPUT_TO_GRID_general(in, out, GRID_Y) +#endif + +#if !defined(INPUT_TO_GRID_X) && defined(GRID_X_BITS) && GRID_X_BITS <= GLITTER_INPUT_BITS +# define INPUT_TO_GRID_X(in, out) (out) = (in) >> (GLITTER_INPUT_BITS - GRID_X_BITS) +#else +# define INPUT_TO_GRID_X(in, out) INPUT_TO_GRID_general(in, out, GRID_X) +#endif + +#define INPUT_TO_GRID_general(in, out, grid_scale) do { \ + long long tmp__ = (long long)(grid_scale) * (in); \ + tmp__ += 1 << (GLITTER_INPUT_BITS-1); \ + tmp__ >>= GLITTER_INPUT_BITS; \ + (out) = tmp__; \ +} while (0) + +inline static void +polygon_add_edge (struct polygon *polygon, + const cairo_edge_t *edge) +{ + struct edge *e; + grid_scaled_y_t ytop, ybot; + const cairo_point_t *p1, *p2; + + INPUT_TO_GRID_Y (edge->top, ytop); + if (ytop < polygon->ymin) + ytop = polygon->ymin; + + INPUT_TO_GRID_Y (edge->bottom, ybot); + if (ybot > polygon->ymax) + ybot = polygon->ymax; + + if (ybot <= ytop) + return; + + e = pool_alloc (polygon->edge_pool.base, sizeof (struct edge)); + + e->ytop = ytop; + e->height_left = ybot - ytop; + if (edge->line.p2.y > edge->line.p1.y) { + e->dir = edge->dir; + p1 = &edge->line.p1; + p2 = &edge->line.p2; + } else { + e->dir = -edge->dir; + p1 = &edge->line.p2; + p2 = &edge->line.p1; + } + + if (p2->x == p1->x) { + e->cell = p1->x; + e->x.quo = p1->x; + e->x.rem = 0; + e->dxdy.quo = e->dxdy.rem = 0; + e->dxdy_full.quo = e->dxdy_full.rem = 0; + e->dy = 0; + } else { + int64_t Ex, Ey, tmp; + + Ex = (int64_t)(p2->x - p1->x) * GRID_X; + Ey = (int64_t)(p2->y - p1->y) * GRID_Y * (2 << GLITTER_INPUT_BITS); + + e->dxdy.quo = Ex * (2 << GLITTER_INPUT_BITS) / Ey; + e->dxdy.rem = Ex * (2 << GLITTER_INPUT_BITS) % Ey; + + tmp = (int64_t)(2*ytop + 1) << GLITTER_INPUT_BITS; + tmp -= (int64_t)p1->y * GRID_Y * 2; + tmp *= Ex; + e->x.quo = tmp / Ey; + e->x.rem = tmp % Ey; + +#if GRID_X_BITS == GLITTER_INPUT_BITS + e->x.quo += p1->x; +#else + tmp = (int64_t)p1->x * GRID_X; + e->x.quo += tmp >> GLITTER_INPUT_BITS; + e->x.rem += ((tmp & ((1 << GLITTER_INPUT_BITS) - 1)) * Ey) / (1 << GLITTER_INPUT_BITS); +#endif + + if (e->x.rem < 0) { + e->x.quo--; + e->x.rem += Ey; + } else if (e->x.rem >= Ey) { + e->x.quo++; + e->x.rem -= Ey; + } + + if (e->height_left >= GRID_Y) { + tmp = Ex * (2 * GRID_Y << GLITTER_INPUT_BITS); + e->dxdy_full.quo = tmp / Ey; + e->dxdy_full.rem = tmp % Ey; + } else + e->dxdy_full.quo = e->dxdy_full.rem = 0; + + e->cell = e->x.quo + (e->x.rem >= Ey/2); + e->dy = Ey; + } + + _polygon_insert_edge_into_its_y_bucket (polygon, e); +} + +/* Add a new polygon edge from pixel (x1,y1) to (x2,y2) to the scan + * converter. The coordinates represent pixel positions scaled by + * 2**GLITTER_PIXEL_BITS. If this function fails then the scan + * converter should be reset or destroyed. Dir must be +1 or -1, + * with the latter reversing the orientation of the edge. */ +I void +glitter_scan_converter_add_edge (glitter_scan_converter_t *converter, + const cairo_edge_t *edge) +{ + polygon_add_edge (converter->polygon, edge); +} + +static void +step_edges (struct active_list *active, int count) +{ + struct edge *edge; + + count *= GRID_Y; + for (edge = active->head.next; edge != &active->tail; edge = edge->next) { + edge->height_left -= count; + if (! edge->height_left) { + edge->prev->next = edge->next; + edge->next->prev = edge->prev; + active->min_height = -1; + } + } +} + +static glitter_status_t +blit_a8 (struct cell_list *cells, + cairo_span_renderer_t *renderer, + cairo_half_open_span_t *spans, + int y, int height, + int xmin, int xmax) +{ + struct cell *cell = cells->head.next; + int prev_x = xmin, last_x = -1; + int16_t cover = 0, last_cover = 0; + unsigned num_spans; + + if (cell == &cells->tail) + return CAIRO_STATUS_SUCCESS; + + /* Skip cells to the left of the clip region. */ + while (cell->x < xmin) { + cover += cell->covered_height; + cell = cell->next; + } + cover *= GRID_X*2; + + /* Form the spans from the coverages and areas. */ + num_spans = 0; + for (; cell->x < xmax; cell = cell->next) { + int x = cell->x; + int16_t area; + + if (x > prev_x && cover != last_cover) { + spans[num_spans].x = prev_x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (cover); + last_cover = cover; + last_x = prev_x; + ++num_spans; + } + + cover += cell->covered_height*GRID_X*2; + area = cover - cell->uncovered_area; + + if (area != last_cover) { + spans[num_spans].x = x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (area); + last_cover = area; + last_x = x; + ++num_spans; + } + + prev_x = x+1; + } + + if (prev_x <= xmax && cover != last_cover) { + spans[num_spans].x = prev_x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (cover); + last_cover = cover; + last_x = prev_x; + ++num_spans; + } + + if (last_x < xmax && last_cover) { + spans[num_spans].x = xmax; + spans[num_spans].coverage = 0; + ++num_spans; + } + + /* Dump them into the renderer. */ + return renderer->render_rows (renderer, y, height, spans, num_spans); +} + +#define GRID_AREA_TO_A1(A) ((GRID_AREA_TO_ALPHA (A) > 127) ? 255 : 0) +static glitter_status_t +blit_a1 (struct cell_list *cells, + cairo_span_renderer_t *renderer, + cairo_half_open_span_t *spans, + int y, int height, + int xmin, int xmax) +{ + struct cell *cell = cells->head.next; + int prev_x = xmin, last_x = -1; + int16_t cover = 0; + uint8_t coverage, last_cover = 0; + unsigned num_spans; + + if (cell == &cells->tail) + return CAIRO_STATUS_SUCCESS; + + /* Skip cells to the left of the clip region. */ + while (cell->x < xmin) { + cover += cell->covered_height; + cell = cell->next; + } + cover *= GRID_X*2; + + /* Form the spans from the coverages and areas. */ + num_spans = 0; + for (; cell->x < xmax; cell = cell->next) { + int x = cell->x; + int16_t area; + + coverage = GRID_AREA_TO_A1 (cover); + if (x > prev_x && coverage != last_cover) { + last_x = spans[num_spans].x = prev_x; + last_cover = spans[num_spans].coverage = coverage; + ++num_spans; + } + + cover += cell->covered_height*GRID_X*2; + area = cover - cell->uncovered_area; + + coverage = GRID_AREA_TO_A1 (area); + if (coverage != last_cover) { + last_x = spans[num_spans].x = x; + last_cover = spans[num_spans].coverage = coverage; + ++num_spans; + } + + prev_x = x+1; + } + + coverage = GRID_AREA_TO_A1 (cover); + if (prev_x <= xmax && coverage != last_cover) { + last_x = spans[num_spans].x = prev_x; + last_cover = spans[num_spans].coverage = coverage; + ++num_spans; + } + + if (last_x < xmax && last_cover) { + spans[num_spans].x = xmax; + spans[num_spans].coverage = 0; + ++num_spans; + } + if (num_spans == 1) + return CAIRO_STATUS_SUCCESS; + + /* Dump them into the renderer. */ + return renderer->render_rows (renderer, y, height, spans, num_spans); +} + + +I void +glitter_scan_converter_render(glitter_scan_converter_t *converter, + unsigned int winding_mask, + int antialias, + cairo_span_renderer_t *renderer) +{ + int i, j; + int ymax_i = converter->ymax / GRID_Y; + int ymin_i = converter->ymin / GRID_Y; + int xmin_i, xmax_i; + int h = ymax_i - ymin_i; + struct polygon *polygon = converter->polygon; + struct cell_list *coverages = converter->coverages; + struct active_list *active = converter->active; + struct edge *buckets[GRID_Y] = { 0 }; + + xmin_i = converter->xmin / GRID_X; + xmax_i = converter->xmax / GRID_X; + if (xmin_i >= xmax_i) + return; + + /* Render each pixel row. */ + for (i = 0; i < h; i = j) { + int do_full_row = 0; + + j = i + 1; + + /* Determine if we can ignore this row or use the full pixel + * stepper. */ + if (polygon_fill_buckets (active, + polygon->y_buckets[i], + (i+ymin_i)*GRID_Y, + buckets) == 0) { + if (buckets[0]) { + active_list_merge_edges_from_bucket (active, buckets[0]); + buckets[0] = NULL; + } + + if (active->head.next == &active->tail) { + active->min_height = INT_MAX; + active->is_vertical = 1; + for (; j < h && ! polygon->y_buckets[j]; j++) + ; + continue; + } + + do_full_row = can_do_full_row (active); + } + + if (do_full_row) { + /* Step by a full pixel row's worth. */ + full_row (active, coverages, winding_mask); + + if (active->is_vertical) { + while (j < h && + polygon->y_buckets[j] == NULL && + active->min_height >= 2*GRID_Y) + { + active->min_height -= GRID_Y; + j++; + } + if (j != i + 1) + step_edges (active, j - (i + 1)); + } + } else { + int sub; + + /* Subsample this row. */ + for (sub = 0; sub < GRID_Y; sub++) { + if (buckets[sub]) { + active_list_merge_edges_from_bucket (active, buckets[sub]); + buckets[sub] = NULL; + } + sub_row (active, coverages, winding_mask); + } + } + + if (antialias) + blit_a8 (coverages, renderer, converter->spans, + i+ymin_i, j-i, xmin_i, xmax_i); + else + blit_a1 (coverages, renderer, converter->spans, + i+ymin_i, j-i, xmin_i, xmax_i); + cell_list_reset (coverages); + + active->min_height -= GRID_Y; + } +} + +struct _cairo_tor_scan_converter { + cairo_scan_converter_t base; + + glitter_scan_converter_t converter[1]; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + + jmp_buf jmp; +}; + +typedef struct _cairo_tor_scan_converter cairo_tor_scan_converter_t; + +static void +_cairo_tor_scan_converter_destroy (void *converter) +{ + cairo_tor_scan_converter_t *self = converter; + if (self == NULL) { + return; + } + _glitter_scan_converter_fini (self->converter); + free(self); +} + +cairo_status_t +_cairo_tor_scan_converter_add_polygon (void *converter, + const cairo_polygon_t *polygon) +{ + cairo_tor_scan_converter_t *self = converter; + int i; + +#if 0 + FILE *file = fopen ("polygon.txt", "w"); + _cairo_debug_print_polygon (file, polygon); + fclose (file); +#endif + + for (i = 0; i < polygon->num_edges; i++) + glitter_scan_converter_add_edge (self->converter, &polygon->edges[i]); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_tor_scan_converter_generate (void *converter, + cairo_span_renderer_t *renderer) +{ + cairo_tor_scan_converter_t *self = converter; + cairo_status_t status; + + if ((status = setjmp (self->jmp))) + return _cairo_scan_converter_set_error (self, _cairo_error (status)); + + glitter_scan_converter_render (self->converter, + self->fill_rule == CAIRO_FILL_RULE_WINDING ? ~0 : 1, + self->antialias != CAIRO_ANTIALIAS_NONE, + renderer); + return CAIRO_STATUS_SUCCESS; +} + +cairo_scan_converter_t * +_cairo_tor_scan_converter_create (int xmin, + int ymin, + int xmax, + int ymax, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias) +{ + cairo_tor_scan_converter_t *self; + cairo_status_t status; + + self = malloc (sizeof(struct _cairo_tor_scan_converter)); + if (unlikely (self == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto bail_nomem; + } + + self->base.destroy = _cairo_tor_scan_converter_destroy; + self->base.generate = _cairo_tor_scan_converter_generate; + + _glitter_scan_converter_init (self->converter, &self->jmp); + status = glitter_scan_converter_reset (self->converter, + xmin, ymin, xmax, ymax); + if (unlikely (status)) + goto bail; + + self->fill_rule = fill_rule; + self->antialias = antialias; + + return &self->base; + + bail: + self->base.destroy(&self->base); + bail_nomem: + return _cairo_scan_converter_create_in_error (status); +} diff --git a/src/cairo-tor22-scan-converter.c b/src/cairo-tor22-scan-converter.c new file mode 100644 index 000000000..4cec5ee4f --- /dev/null +++ b/src/cairo-tor22-scan-converter.c @@ -0,0 +1,1709 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* glitter-paths - polygon scan converter + * + * Copyright (c) 2008 M Joonas Pihlaja + * Copyright (c) 2007 David Turner + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +/* This is the Glitter paths scan converter incorporated into cairo. + * The source is from commit 734c53237a867a773640bd5b64816249fa1730f8 + * of + * + * http://gitweb.freedesktop.org/?p=users/joonas/glitter-paths + */ +/* Glitter-paths is a stand alone polygon rasteriser derived from + * David Turner's reimplementation of Tor Anderssons's 15x17 + * supersampling rasteriser from the Apparition graphics library. The + * main new feature here is cheaply choosing per-scan line between + * doing fully analytical coverage computation for an entire row at a + * time vs. using a supersampling approach. + * + * David Turner's code can be found at + * + * http://david.freetype.org/rasterizer-shootout/raster-comparison-20070813.tar.bz2 + * + * In particular this file incorporates large parts of ftgrays_tor10.h + * from raster-comparison-20070813.tar.bz2 + */ +/* Overview + * + * A scan converter's basic purpose to take polygon edges and convert + * them into an RLE compressed A8 mask. This one works in two phases: + * gathering edges and generating spans. + * + * 1) As the user feeds the scan converter edges they are vertically + * clipped and bucketted into a _polygon_ data structure. The edges + * are also snapped from the user's coordinates to the subpixel grid + * coordinates used during scan conversion. + * + * user + * | + * | edges + * V + * polygon buckets + * + * 2) Generating spans works by performing a vertical sweep of pixel + * rows from top to bottom and maintaining an _active_list_ of edges + * that intersect the row. From the active list the fill rule + * determines which edges are the left and right edges of the start of + * each span, and their contribution is then accumulated into a pixel + * coverage list (_cell_list_) as coverage deltas. Once the coverage + * deltas of all edges are known we can form spans of constant pixel + * coverage by summing the deltas during a traversal of the cell list. + * At the end of a pixel row the cell list is sent to a coverage + * blitter for rendering to some target surface. + * + * The pixel coverages are computed by either supersampling the row + * and box filtering a mono rasterisation, or by computing the exact + * coverages of edges in the active list. The supersampling method is + * used whenever some edge starts or stops within the row or there are + * edge intersections in the row. + * + * polygon bucket for \ + * current pixel row | + * | | + * | activate new edges | Repeat GRID_Y times if we + * V \ are supersampling this row, + * active list / or just once if we're computing + * | | analytical coverage. + * | coverage deltas | + * V | + * pixel coverage list / + * | + * V + * coverage blitter + */ +#include "cairoint.h" +#include "cairo-spans-private.h" +#include "cairo-error-private.h" + +#include +#include +#include +#include + +/*------------------------------------------------------------------------- + * cairo specific config + */ +#define I static + +/* Prefer cairo's status type. */ +#define GLITTER_HAVE_STATUS_T 1 +#define GLITTER_STATUS_SUCCESS CAIRO_STATUS_SUCCESS +#define GLITTER_STATUS_NO_MEMORY CAIRO_STATUS_NO_MEMORY +typedef cairo_status_t glitter_status_t; + +/* The input coordinate scale and the rasterisation grid scales. */ +#define GLITTER_INPUT_BITS CAIRO_FIXED_FRAC_BITS +//#define GRID_X_BITS CAIRO_FIXED_FRAC_BITS +//#define GRID_Y 15 +#define GRID_X_BITS 2 +#define GRID_Y_BITS 2 + +/* Set glitter up to use a cairo span renderer to do the coverage + * blitting. */ +struct pool; +struct cell_list; + +/*------------------------------------------------------------------------- + * glitter-paths.h + */ + +/* "Input scaled" numbers are fixed precision reals with multiplier + * 2**GLITTER_INPUT_BITS. Input coordinates are given to glitter as + * pixel scaled numbers. These get converted to the internal grid + * scaled numbers as soon as possible. Internal overflow is possible + * if GRID_X/Y inside glitter-paths.c is larger than + * 1< +#include +#include + +/* All polygon coordinates are snapped onto a subsample grid. "Grid + * scaled" numbers are fixed precision reals with multiplier GRID_X or + * GRID_Y. */ +typedef int grid_scaled_t; +typedef int grid_scaled_x_t; +typedef int grid_scaled_y_t; + +/* Default x/y scale factors. + * You can either define GRID_X/Y_BITS to get a power-of-two scale + * or define GRID_X/Y separately. */ +#if !defined(GRID_X) && !defined(GRID_X_BITS) +# define GRID_X_BITS 8 +#endif +#if !defined(GRID_Y) && !defined(GRID_Y_BITS) +# define GRID_Y 15 +#endif + +/* Use GRID_X/Y_BITS to define GRID_X/Y if they're available. */ +#ifdef GRID_X_BITS +# define GRID_X (1 << GRID_X_BITS) +#endif +#ifdef GRID_Y_BITS +# define GRID_Y (1 << GRID_Y_BITS) +#endif + +/* The GRID_X_TO_INT_FRAC macro splits a grid scaled coordinate into + * integer and fractional parts. The integer part is floored. */ +#if defined(GRID_X_TO_INT_FRAC) + /* do nothing */ +#elif defined(GRID_X_BITS) +# define GRID_X_TO_INT_FRAC(x, i, f) \ + _GRID_TO_INT_FRAC_shift(x, i, f, GRID_X_BITS) +#else +# define GRID_X_TO_INT_FRAC(x, i, f) \ + _GRID_TO_INT_FRAC_general(x, i, f, GRID_X) +#endif + +#define _GRID_TO_INT_FRAC_general(t, i, f, m) do { \ + (i) = (t) / (m); \ + (f) = (t) % (m); \ + if ((f) < 0) { \ + --(i); \ + (f) += (m); \ + } \ +} while (0) + +#define _GRID_TO_INT_FRAC_shift(t, i, f, b) do { \ + (f) = (t) & ((1 << (b)) - 1); \ + (i) = (t) >> (b); \ +} while (0) + +/* A grid area is a real in [0,1] scaled by 2*GRID_X*GRID_Y. We want + * to be able to represent exactly areas of subpixel trapezoids whose + * vertices are given in grid scaled coordinates. The scale factor + * comes from needing to accurately represent the area 0.5*dx*dy of a + * triangle with base dx and height dy in grid scaled numbers. */ +#define GRID_XY (2*GRID_X*GRID_Y) /* Unit area on the grid. */ + +/* GRID_AREA_TO_ALPHA(area): map [0,GRID_XY] to [0,255]. */ +#if GRID_XY == 510 +# define GRID_AREA_TO_ALPHA(c) (((c)+1) >> 1) +#elif GRID_XY == 255 +# define GRID_AREA_TO_ALPHA(c) (c) +#elif GRID_XY == 64 +# define GRID_AREA_TO_ALPHA(c) (((c) << 2) | -(((c) & 0x40) >> 6)) +#elif GRID_XY == 32 +# define GRID_AREA_TO_ALPHA(c) (((c) << 3) | -(((c) & 0x20) >> 5)) +#elif GRID_XY == 128 +# define GRID_AREA_TO_ALPHA(c) ((((c) << 1) | -((c) >> 7)) & 255) +#elif GRID_XY == 256 +# define GRID_AREA_TO_ALPHA(c) (((c) | -((c) >> 8)) & 255) +#elif GRID_XY == 15 +# define GRID_AREA_TO_ALPHA(c) (((c) << 4) + (c)) +#elif GRID_XY == 2*256*15 +# define GRID_AREA_TO_ALPHA(c) (((c) + ((c)<<4) + 256) >> 9) +#else +# define GRID_AREA_TO_ALPHA(c) (((c)*255 + GRID_XY/2) / GRID_XY) +#endif + +#define UNROLL3(x) x x x + +struct quorem { + int32_t quo; + int32_t rem; +}; + +/* Header for a chunk of memory in a memory pool. */ +struct _pool_chunk { + /* # bytes used in this chunk. */ + size_t size; + + /* # bytes total in this chunk */ + size_t capacity; + + /* Pointer to the previous chunk or %NULL if this is the sentinel + * chunk in the pool header. */ + struct _pool_chunk *prev_chunk; + + /* Actual data starts here. Well aligned for pointers. */ +}; + +/* A memory pool. This is supposed to be embedded on the stack or + * within some other structure. It may optionally be followed by an + * embedded array from which requests are fulfilled until + * malloc needs to be called to allocate a first real chunk. */ +struct pool { + /* Chunk we're allocating from. */ + struct _pool_chunk *current; + + jmp_buf *jmp; + + /* Free list of previously allocated chunks. All have >= default + * capacity. */ + struct _pool_chunk *first_free; + + /* The default capacity of a chunk. */ + size_t default_capacity; + + /* Header for the sentinel chunk. Directly following the pool + * struct should be some space for embedded elements from which + * the sentinel chunk allocates from. */ + struct _pool_chunk sentinel[1]; +}; + +/* A polygon edge. */ +struct edge { + /* Next in y-bucket or active list. */ + struct edge *next, *prev; + + /* Number of subsample rows remaining to scan convert of this + * edge. */ + grid_scaled_y_t height_left; + + /* Original sign of the edge: +1 for downwards, -1 for upwards + * edges. */ + int dir; + int vertical; + + /* Current x coordinate while the edge is on the active + * list. Initialised to the x coordinate of the top of the + * edge. The quotient is in grid_scaled_x_t units and the + * remainder is mod dy in grid_scaled_y_t units.*/ + struct quorem x; + + /* Advance of the current x when moving down a subsample line. */ + struct quorem dxdy; + + /* The clipped y of the top of the edge. */ + grid_scaled_y_t ytop; + + /* y2-y1 after orienting the edge downwards. */ + grid_scaled_y_t dy; +}; + +#define EDGE_Y_BUCKET_INDEX(y, ymin) (((y) - (ymin))/GRID_Y) + +/* A collection of sorted and vertically clipped edges of the polygon. + * Edges are moved from the polygon to an active list while scan + * converting. */ +struct polygon { + /* The vertical clip extents. */ + grid_scaled_y_t ymin, ymax; + + /* Array of edges all starting in the same bucket. An edge is put + * into bucket EDGE_BUCKET_INDEX(edge->ytop, polygon->ymin) when + * it is added to the polygon. */ + struct edge **y_buckets; + struct edge *y_buckets_embedded[64]; + + struct { + struct pool base[1]; + struct edge embedded[32]; + } edge_pool; +}; + +/* A cell records the effect on pixel coverage of polygon edges + * passing through a pixel. It contains two accumulators of pixel + * coverage. + * + * Consider the effects of a polygon edge on the coverage of a pixel + * it intersects and that of the following one. The coverage of the + * following pixel is the height of the edge multiplied by the width + * of the pixel, and the coverage of the pixel itself is the area of + * the trapezoid formed by the edge and the right side of the pixel. + * + * +-----------------------+-----------------------+ + * | | | + * | | | + * |_______________________|_______________________| + * | \...................|.......................|\ + * | \..................|.......................| | + * | \.................|.......................| | + * | \....covered.....|.......................| | + * | \....area.......|.......................| } covered height + * | \..............|.......................| | + * |uncovered\.............|.......................| | + * | area \............|.......................| | + * |___________\...........|.......................|/ + * | | | + * | | | + * | | | + * +-----------------------+-----------------------+ + * + * Since the coverage of the following pixel will always be a multiple + * of the width of the pixel, we can store the height of the covered + * area instead. The coverage of the pixel itself is the total + * coverage minus the area of the uncovered area to the left of the + * edge. As it's faster to compute the uncovered area we only store + * that and subtract it from the total coverage later when forming + * spans to blit. + * + * The heights and areas are signed, with left edges of the polygon + * having positive sign and right edges having negative sign. When + * two edges intersect they swap their left/rightness so their + * contribution above and below the intersection point must be + * computed separately. */ +struct cell { + struct cell *next; + int x; + int16_t uncovered_area; + int16_t covered_height; +}; + +/* A cell list represents the scan line sparsely as cells ordered by + * ascending x. It is geared towards scanning the cells in order + * using an internal cursor. */ +struct cell_list { + /* Sentinel nodes */ + struct cell head, tail; + + /* Cursor state for iterating through the cell list. */ + struct cell *cursor, *rewind; + + /* Cells in the cell list are owned by the cell list and are + * allocated from this pool. */ + struct { + struct pool base[1]; + struct cell embedded[32]; + } cell_pool; +}; + +struct cell_pair { + struct cell *cell1; + struct cell *cell2; +}; + +/* The active list contains edges in the current scan line ordered by + * the x-coordinate of the intercept of the edge and the scan line. */ +struct active_list { + /* Leftmost edge on the current scan line. */ + struct edge head, tail; + + /* A lower bound on the height of the active edges is used to + * estimate how soon some active edge ends. We can't advance the + * scan conversion by a full pixel row if an edge ends somewhere + * within it. */ + grid_scaled_y_t min_height; + int is_vertical; +}; + +struct glitter_scan_converter { + struct polygon polygon[1]; + struct active_list active[1]; + struct cell_list coverages[1]; + + cairo_half_open_span_t *spans; + cairo_half_open_span_t spans_embedded[64]; + + /* Clip box. */ + grid_scaled_x_t xmin, xmax; + grid_scaled_y_t ymin, ymax; +}; + +/* Compute the floored division a/b. Assumes / and % perform symmetric + * division. */ +inline static struct quorem +floored_divrem(int a, int b) +{ + struct quorem qr; + qr.quo = a/b; + qr.rem = a%b; + if ((a^b)<0 && qr.rem) { + qr.quo -= 1; + qr.rem += b; + } + return qr; +} + +/* Compute the floored division (x*a)/b. Assumes / and % perform symmetric + * division. */ +static struct quorem +floored_muldivrem(int x, int a, int b) +{ + struct quorem qr; + long long xa = (long long)x*a; + qr.quo = xa/b; + qr.rem = xa%b; + if ((xa>=0) != (b>=0) && qr.rem) { + qr.quo -= 1; + qr.rem += b; + } + return qr; +} + +static struct _pool_chunk * +_pool_chunk_init( + struct _pool_chunk *p, + struct _pool_chunk *prev_chunk, + size_t capacity) +{ + p->prev_chunk = prev_chunk; + p->size = 0; + p->capacity = capacity; + return p; +} + +static struct _pool_chunk * +_pool_chunk_create(struct pool *pool, size_t size) +{ + struct _pool_chunk *p; + + p = malloc(size + sizeof(struct _pool_chunk)); + if (unlikely (NULL == p)) + longjmp (*pool->jmp, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + + return _pool_chunk_init(p, pool->current, size); +} + +static void +pool_init(struct pool *pool, + jmp_buf *jmp, + size_t default_capacity, + size_t embedded_capacity) +{ + pool->jmp = jmp; + pool->current = pool->sentinel; + pool->first_free = NULL; + pool->default_capacity = default_capacity; + _pool_chunk_init(pool->sentinel, NULL, embedded_capacity); +} + +static void +pool_fini(struct pool *pool) +{ + struct _pool_chunk *p = pool->current; + do { + while (NULL != p) { + struct _pool_chunk *prev = p->prev_chunk; + if (p != pool->sentinel) + free(p); + p = prev; + } + p = pool->first_free; + pool->first_free = NULL; + } while (NULL != p); +} + +/* Satisfy an allocation by first allocating a new large enough chunk + * and adding it to the head of the pool's chunk list. This function + * is called as a fallback if pool_alloc() couldn't do a quick + * allocation from the current chunk in the pool. */ +static void * +_pool_alloc_from_new_chunk( + struct pool *pool, + size_t size) +{ + struct _pool_chunk *chunk; + void *obj; + size_t capacity; + + /* If the allocation is smaller than the default chunk size then + * try getting a chunk off the free list. Force alloc of a new + * chunk for large requests. */ + capacity = size; + chunk = NULL; + if (size < pool->default_capacity) { + capacity = pool->default_capacity; + chunk = pool->first_free; + if (chunk) { + pool->first_free = chunk->prev_chunk; + _pool_chunk_init(chunk, pool->current, chunk->capacity); + } + } + + if (NULL == chunk) + chunk = _pool_chunk_create (pool, capacity); + pool->current = chunk; + + obj = ((unsigned char*)chunk + sizeof(*chunk) + chunk->size); + chunk->size += size; + return obj; +} + +/* Allocate size bytes from the pool. The first allocated address + * returned from a pool is aligned to sizeof(void*). Subsequent + * addresses will maintain alignment as long as multiples of void* are + * allocated. Returns the address of a new memory area or %NULL on + * allocation failures. The pool retains ownership of the returned + * memory. */ +inline static void * +pool_alloc (struct pool *pool, size_t size) +{ + struct _pool_chunk *chunk = pool->current; + + if (size <= chunk->capacity - chunk->size) { + void *obj = ((unsigned char*)chunk + sizeof(*chunk) + chunk->size); + chunk->size += size; + return obj; + } else { + return _pool_alloc_from_new_chunk(pool, size); + } +} + +/* Relinquish all pool_alloced memory back to the pool. */ +static void +pool_reset (struct pool *pool) +{ + /* Transfer all used chunks to the chunk free list. */ + struct _pool_chunk *chunk = pool->current; + if (chunk != pool->sentinel) { + while (chunk->prev_chunk != pool->sentinel) { + chunk = chunk->prev_chunk; + } + chunk->prev_chunk = pool->first_free; + pool->first_free = pool->current; + } + /* Reset the sentinel as the current chunk. */ + pool->current = pool->sentinel; + pool->sentinel->size = 0; +} + +/* Rewinds the cell list's cursor to the beginning. After rewinding + * we're good to cell_list_find() the cell any x coordinate. */ +inline static void +cell_list_rewind (struct cell_list *cells) +{ + cells->cursor = &cells->head; +} + +inline static void +cell_list_maybe_rewind (struct cell_list *cells, int x) +{ + if (x < cells->cursor->x) { + cells->cursor = cells->rewind; + if (x < cells->cursor->x) + cells->cursor = &cells->head; + } +} + +inline static void +cell_list_set_rewind (struct cell_list *cells) +{ + cells->rewind = cells->cursor; +} + +static void +cell_list_init(struct cell_list *cells, jmp_buf *jmp) +{ + pool_init(cells->cell_pool.base, jmp, + 256*sizeof(struct cell), + sizeof(cells->cell_pool.embedded)); + cells->tail.next = NULL; + cells->tail.x = INT_MAX; + cells->head.x = INT_MIN; + cells->head.next = &cells->tail; + cell_list_rewind (cells); +} + +static void +cell_list_fini(struct cell_list *cells) +{ + pool_fini (cells->cell_pool.base); +} + +/* Empty the cell list. This is called at the start of every pixel + * row. */ +inline static void +cell_list_reset (struct cell_list *cells) +{ + cell_list_rewind (cells); + cells->head.next = &cells->tail; + pool_reset (cells->cell_pool.base); +} + +inline static struct cell * +cell_list_alloc (struct cell_list *cells, + struct cell *tail, + int x) +{ + struct cell *cell; + + cell = pool_alloc (cells->cell_pool.base, sizeof (struct cell)); + cell->next = tail->next; + tail->next = cell; + cell->x = x; + *(uint32_t *)&cell->uncovered_area = 0; + + return cell; +} + +/* Find a cell at the given x-coordinate. Returns %NULL if a new cell + * needed to be allocated but couldn't be. Cells must be found with + * non-decreasing x-coordinate until the cell list is rewound using + * cell_list_rewind(). Ownership of the returned cell is retained by + * the cell list. */ +inline static struct cell * +cell_list_find (struct cell_list *cells, int x) +{ + struct cell *tail = cells->cursor; + + if (tail->x == x) + return tail; + + while (1) { + UNROLL3({ + if (tail->next->x > x) + break; + tail = tail->next; + }); + } + + if (tail->x != x) + tail = cell_list_alloc (cells, tail, x); + return cells->cursor = tail; + +} + +/* Find two cells at x1 and x2. This is exactly equivalent + * to + * + * pair.cell1 = cell_list_find(cells, x1); + * pair.cell2 = cell_list_find(cells, x2); + * + * except with less function call overhead. */ +inline static struct cell_pair +cell_list_find_pair(struct cell_list *cells, int x1, int x2) +{ + struct cell_pair pair; + + pair.cell1 = cells->cursor; + while (1) { + UNROLL3({ + if (pair.cell1->next->x > x1) + break; + pair.cell1 = pair.cell1->next; + }); + } + if (pair.cell1->x != x1) + pair.cell1 = cell_list_alloc (cells, pair.cell1, x1); + + pair.cell2 = pair.cell1; + while (1) { + UNROLL3({ + if (pair.cell2->next->x > x2) + break; + pair.cell2 = pair.cell2->next; + }); + } + if (pair.cell2->x != x2) + pair.cell2 = cell_list_alloc (cells, pair.cell2, x2); + + cells->cursor = pair.cell2; + return pair; +} + +/* Add a subpixel span covering [x1, x2) to the coverage cells. */ +inline static void +cell_list_add_subspan(struct cell_list *cells, + grid_scaled_x_t x1, + grid_scaled_x_t x2) +{ + int ix1, fx1; + int ix2, fx2; + + if (x1 == x2) + return; + + GRID_X_TO_INT_FRAC(x1, ix1, fx1); + GRID_X_TO_INT_FRAC(x2, ix2, fx2); + + if (ix1 != ix2) { + struct cell_pair p; + p = cell_list_find_pair(cells, ix1, ix2); + p.cell1->uncovered_area += 2*fx1; + ++p.cell1->covered_height; + p.cell2->uncovered_area -= 2*fx2; + --p.cell2->covered_height; + } else { + struct cell *cell = cell_list_find(cells, ix1); + cell->uncovered_area += 2*(fx1-fx2); + } +} + +/* Adds the analytical coverage of an edge crossing the current pixel + * row to the coverage cells and advances the edge's x position to the + * following row. + * + * This function is only called when we know that during this pixel row: + * + * 1) The relative order of all edges on the active list doesn't + * change. In particular, no edges intersect within this row to pixel + * precision. + * + * 2) No new edges start in this row. + * + * 3) No existing edges end mid-row. + * + * This function depends on being called with all edges from the + * active list in the order they appear on the list (i.e. with + * non-decreasing x-coordinate.) */ +static void +cell_list_render_edge(struct cell_list *cells, + struct edge *edge, + int sign) +{ + grid_scaled_x_t fx; + struct cell *cell; + int ix; + + GRID_X_TO_INT_FRAC(edge->x.quo, ix, fx); + + /* We always know that ix1 is >= the cell list cursor in this + * case due to the no-intersections precondition. */ + cell = cell_list_find(cells, ix); + cell->covered_height += sign*GRID_Y; + cell->uncovered_area += sign*2*fx*GRID_Y; +} + +static void +polygon_init (struct polygon *polygon, jmp_buf *jmp) +{ + polygon->ymin = polygon->ymax = 0; + polygon->y_buckets = polygon->y_buckets_embedded; + pool_init (polygon->edge_pool.base, jmp, + 8192 - sizeof (struct _pool_chunk), + sizeof (polygon->edge_pool.embedded)); +} + +static void +polygon_fini (struct polygon *polygon) +{ + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + pool_fini (polygon->edge_pool.base); +} + +/* Empties the polygon of all edges. The polygon is then prepared to + * receive new edges and clip them to the vertical range + * [ymin,ymax). */ +static glitter_status_t +polygon_reset (struct polygon *polygon, + grid_scaled_y_t ymin, + grid_scaled_y_t ymax) +{ + unsigned h = ymax - ymin; + unsigned num_buckets = EDGE_Y_BUCKET_INDEX(ymax + GRID_Y-1, ymin); + + pool_reset(polygon->edge_pool.base); + + if (unlikely (h > 0x7FFFFFFFU - GRID_Y)) + goto bail_no_mem; /* even if you could, you wouldn't want to. */ + + if (polygon->y_buckets != polygon->y_buckets_embedded) + free (polygon->y_buckets); + + polygon->y_buckets = polygon->y_buckets_embedded; + if (num_buckets > ARRAY_LENGTH (polygon->y_buckets_embedded)) { + polygon->y_buckets = _cairo_malloc_ab (num_buckets, + sizeof (struct edge *)); + if (unlikely (NULL == polygon->y_buckets)) + goto bail_no_mem; + } + memset (polygon->y_buckets, 0, num_buckets * sizeof (struct edge *)); + + polygon->ymin = ymin; + polygon->ymax = ymax; + return GLITTER_STATUS_SUCCESS; + +bail_no_mem: + polygon->ymin = 0; + polygon->ymax = 0; + return GLITTER_STATUS_NO_MEMORY; +} + +static void +_polygon_insert_edge_into_its_y_bucket(struct polygon *polygon, + struct edge *e) +{ + unsigned ix = EDGE_Y_BUCKET_INDEX(e->ytop, polygon->ymin); + struct edge **ptail = &polygon->y_buckets[ix]; + e->next = *ptail; + *ptail = e; +} + +inline static void +polygon_add_edge (struct polygon *polygon, + const cairo_edge_t *edge) +{ + struct edge *e; + grid_scaled_x_t dx; + grid_scaled_y_t dy; + grid_scaled_y_t ytop, ybot; + grid_scaled_y_t ymin = polygon->ymin; + grid_scaled_y_t ymax = polygon->ymax; + + if (unlikely (edge->top >= ymax || edge->bottom <= ymin)) + return; + + e = pool_alloc (polygon->edge_pool.base, sizeof (struct edge)); + + dx = edge->line.p2.x - edge->line.p1.x; + dy = edge->line.p2.y - edge->line.p1.y; + e->dy = dy; + e->dir = edge->dir; + + ytop = edge->top >= ymin ? edge->top : ymin; + ybot = edge->bottom <= ymax ? edge->bottom : ymax; + e->ytop = ytop; + e->height_left = ybot - ytop; + + if (dx == 0) { + e->vertical = TRUE; + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + e->dxdy.quo = 0; + e->dxdy.rem = 0; + } else { + e->vertical = FALSE; + e->dxdy = floored_divrem (dx, dy); + if (ytop == edge->line.p1.y) { + e->x.quo = edge->line.p1.x; + e->x.rem = 0; + } else { + e->x = floored_muldivrem (ytop - edge->line.p1.y, dx, dy); + e->x.quo += edge->line.p1.x; + } + } + + _polygon_insert_edge_into_its_y_bucket (polygon, e); + + e->x.rem -= dy; /* Bias the remainder for faster + * edge advancement. */ +} + +static void +active_list_reset (struct active_list *active) +{ + active->head.vertical = 1; + active->head.height_left = INT_MAX; + active->head.x.quo = INT_MIN; + active->head.prev = NULL; + active->head.next = &active->tail; + active->tail.prev = &active->head; + active->tail.next = NULL; + active->tail.x.quo = INT_MAX; + active->tail.height_left = INT_MAX; + active->tail.vertical = 1; + active->min_height = 0; + active->is_vertical = 1; +} + +static void +active_list_init(struct active_list *active) +{ + active_list_reset(active); +} + +/* + * Merge two sorted edge lists. + * Input: + * - head_a: The head of the first list. + * - head_b: The head of the second list; head_b cannot be NULL. + * Output: + * Returns the head of the merged list. + * + * Implementation notes: + * To make it fast (in particular, to reduce to an insertion sort whenever + * one of the two input lists only has a single element) we iterate through + * a list until its head becomes greater than the head of the other list, + * then we switch their roles. As soon as one of the two lists is empty, we + * just attach the other one to the current list and exit. + * Writes to memory are only needed to "switch" lists (as it also requires + * attaching to the output list the list which we will be iterating next) and + * to attach the last non-empty list. + */ +static struct edge * +merge_sorted_edges (struct edge *head_a, struct edge *head_b) +{ + struct edge *head, **next, *prev; + int32_t x; + + prev = head_a->prev; + next = &head; + if (head_a->x.quo <= head_b->x.quo) { + head = head_a; + } else { + head = head_b; + head_b->prev = prev; + goto start_with_b; + } + + do { + x = head_b->x.quo; + while (head_a != NULL && head_a->x.quo <= x) { + prev = head_a; + next = &head_a->next; + head_a = head_a->next; + } + + head_b->prev = prev; + *next = head_b; + if (head_a == NULL) + return head; + +start_with_b: + x = head_a->x.quo; + while (head_b != NULL && head_b->x.quo <= x) { + prev = head_b; + next = &head_b->next; + head_b = head_b->next; + } + + head_a->prev = prev; + *next = head_a; + if (head_b == NULL) + return head; + } while (1); +} + +/* + * Sort (part of) a list. + * Input: + * - list: The list to be sorted; list cannot be NULL. + * - limit: Recursion limit. + * Output: + * - head_out: The head of the sorted list containing the first 2^(level+1) elements of the + * input list; if the input list has fewer elements, head_out be a sorted list + * containing all the elements of the input list. + * Returns the head of the list of unprocessed elements (NULL if the sorted list contains + * all the elements of the input list). + * + * Implementation notes: + * Special case single element list, unroll/inline the sorting of the first two elements. + * Some tail recursion is used since we iterate on the bottom-up solution of the problem + * (we start with a small sorted list and keep merging other lists of the same size to it). + */ +static struct edge * +sort_edges (struct edge *list, + unsigned int level, + struct edge **head_out) +{ + struct edge *head_other, *remaining; + unsigned int i; + + head_other = list->next; + + if (head_other == NULL) { + *head_out = list; + return NULL; + } + + remaining = head_other->next; + if (list->x.quo <= head_other->x.quo) { + *head_out = list; + head_other->next = NULL; + } else { + *head_out = head_other; + head_other->prev = list->prev; + head_other->next = list; + list->prev = head_other; + list->next = NULL; + } + + for (i = 0; i < level && remaining; i++) { + remaining = sort_edges (remaining, i, &head_other); + *head_out = merge_sorted_edges (*head_out, head_other); + } + + return remaining; +} + +static struct edge * +merge_unsorted_edges (struct edge *head, struct edge *unsorted) +{ + sort_edges (unsorted, UINT_MAX, &unsorted); + return merge_sorted_edges (head, unsorted); +} + +/* Test if the edges on the active list can be safely advanced by a + * full row without intersections or any edges ending. */ +inline static int +can_do_full_row (struct active_list *active) +{ + const struct edge *e; + + /* Recomputes the minimum height of all edges on the active + * list if we have been dropping edges. */ + if (active->min_height <= 0) { + int min_height = INT_MAX; + int is_vertical = 1; + + e = active->head.next; + while (NULL != e) { + if (e->height_left < min_height) + min_height = e->height_left; + is_vertical &= e->vertical; + e = e->next; + } + + active->is_vertical = is_vertical; + active->min_height = min_height; + } + + if (active->min_height < GRID_Y) + return 0; + + return active->is_vertical; +} + +/* Merges edges on the given subpixel row from the polygon to the + * active_list. */ +inline static void +active_list_merge_edges_from_bucket(struct active_list *active, + struct edge *edges) +{ + active->head.next = merge_unsorted_edges (active->head.next, edges); +} + +inline static void +polygon_fill_buckets (struct active_list *active, + struct edge *edge, + int y, + struct edge **buckets) +{ + grid_scaled_y_t min_height = active->min_height; + int is_vertical = active->is_vertical; + + while (edge) { + struct edge *next = edge->next; + int suby = edge->ytop - y; + if (buckets[suby]) + buckets[suby]->prev = edge; + edge->next = buckets[suby]; + edge->prev = NULL; + buckets[suby] = edge; + if (edge->height_left < min_height) + min_height = edge->height_left; + is_vertical &= edge->vertical; + edge = next; + } + + active->is_vertical = is_vertical; + active->min_height = min_height; +} + +inline static void +sub_row (struct active_list *active, + struct cell_list *coverages, + unsigned int mask) +{ + struct edge *edge = active->head.next; + int xstart = INT_MIN, prev_x = INT_MIN; + int winding = 0; + + cell_list_rewind (coverages); + + while (&active->tail != edge) { + struct edge *next = edge->next; + int xend = edge->x.quo; + + if (--edge->height_left) { + edge->x.quo += edge->dxdy.quo; + edge->x.rem += edge->dxdy.rem; + if (edge->x.rem >= 0) { + ++edge->x.quo; + edge->x.rem -= edge->dy; + } + + if (edge->x.quo < prev_x) { + struct edge *pos = edge->prev; + pos->next = next; + next->prev = pos; + do { + pos = pos->prev; + } while (edge->x.quo < pos->x.quo); + pos->next->prev = edge; + edge->next = pos->next; + edge->prev = pos; + pos->next = edge; + } else + prev_x = edge->x.quo; + } else { + edge->prev->next = next; + next->prev = edge->prev; + } + + winding += edge->dir; + if ((winding & mask) == 0) { + if (next->x.quo != xend) { + cell_list_add_subspan (coverages, xstart, xend); + xstart = INT_MIN; + } + } else if (xstart == INT_MIN) + xstart = xend; + + edge = next; + } +} + +inline static void dec (struct edge *e, int h) +{ + e->height_left -= h; + if (e->height_left == 0) { + e->prev->next = e->next; + e->next->prev = e->prev; + } +} + +static void +full_row (struct active_list *active, + struct cell_list *coverages, + unsigned int mask) +{ + struct edge *left = active->head.next; + + while (&active->tail != left) { + struct edge *right; + int winding; + + dec (left, GRID_Y); + + winding = left->dir; + right = left->next; + do { + dec (right, GRID_Y); + + winding += right->dir; + if ((winding & mask) == 0 && right->next->x.quo != right->x.quo) + break; + + right = right->next; + } while (1); + + cell_list_set_rewind (coverages); + cell_list_render_edge (coverages, left, +1); + cell_list_render_edge (coverages, right, -1); + + left = right->next; + } +} + +static void +_glitter_scan_converter_init(glitter_scan_converter_t *converter, jmp_buf *jmp) +{ + polygon_init(converter->polygon, jmp); + active_list_init(converter->active); + cell_list_init(converter->coverages, jmp); + converter->xmin=0; + converter->ymin=0; + converter->xmax=0; + converter->ymax=0; +} + +static void +_glitter_scan_converter_fini(glitter_scan_converter_t *self) +{ + if (self->spans != self->spans_embedded) + free (self->spans); + + polygon_fini(self->polygon); + cell_list_fini(self->coverages); + + self->xmin=0; + self->ymin=0; + self->xmax=0; + self->ymax=0; +} + +static grid_scaled_t +int_to_grid_scaled(int i, int scale) +{ + /* Clamp to max/min representable scaled number. */ + if (i >= 0) { + if (i >= INT_MAX/scale) + i = INT_MAX/scale; + } + else { + if (i <= INT_MIN/scale) + i = INT_MIN/scale; + } + return i*scale; +} + +#define int_to_grid_scaled_x(x) int_to_grid_scaled((x), GRID_X) +#define int_to_grid_scaled_y(x) int_to_grid_scaled((x), GRID_Y) + +I glitter_status_t +glitter_scan_converter_reset( + glitter_scan_converter_t *converter, + int xmin, int ymin, + int xmax, int ymax) +{ + glitter_status_t status; + + converter->xmin = 0; converter->xmax = 0; + converter->ymin = 0; converter->ymax = 0; + + if (xmax - xmin > ARRAY_LENGTH(converter->spans_embedded)) { + converter->spans = _cairo_malloc_ab (xmax - xmin, + sizeof (cairo_half_open_span_t)); + if (unlikely (converter->spans == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else + converter->spans = converter->spans_embedded; + + xmin = int_to_grid_scaled_x(xmin); + ymin = int_to_grid_scaled_y(ymin); + xmax = int_to_grid_scaled_x(xmax); + ymax = int_to_grid_scaled_y(ymax); + + active_list_reset(converter->active); + cell_list_reset(converter->coverages); + status = polygon_reset(converter->polygon, ymin, ymax); + if (status) + return status; + + converter->xmin = xmin; + converter->xmax = xmax; + converter->ymin = ymin; + converter->ymax = ymax; + return GLITTER_STATUS_SUCCESS; +} + +/* INPUT_TO_GRID_X/Y (in_coord, out_grid_scaled, grid_scale) + * These macros convert an input coordinate in the client's + * device space to the rasterisation grid. + */ +/* Gah.. this bit of ugly defines INPUT_TO_GRID_X/Y so as to use + * shifts if possible, and something saneish if not. + */ +#if !defined(INPUT_TO_GRID_Y) && defined(GRID_Y_BITS) && GRID_Y_BITS <= GLITTER_INPUT_BITS +# define INPUT_TO_GRID_Y(in, out) (out) = (in) >> (GLITTER_INPUT_BITS - GRID_Y_BITS) +#else +# define INPUT_TO_GRID_Y(in, out) INPUT_TO_GRID_general(in, out, GRID_Y) +#endif + +#if !defined(INPUT_TO_GRID_X) && defined(GRID_X_BITS) && GRID_X_BITS <= GLITTER_INPUT_BITS +# define INPUT_TO_GRID_X(in, out) (out) = (in) >> (GLITTER_INPUT_BITS - GRID_X_BITS) +#else +# define INPUT_TO_GRID_X(in, out) INPUT_TO_GRID_general(in, out, GRID_X) +#endif + +#define INPUT_TO_GRID_general(in, out, grid_scale) do { \ + long long tmp__ = (long long)(grid_scale) * (in); \ + tmp__ >>= GLITTER_INPUT_BITS; \ + (out) = tmp__; \ +} while (0) + +/* Add a new polygon edge from pixel (x1,y1) to (x2,y2) to the scan + * converter. The coordinates represent pixel positions scaled by + * 2**GLITTER_PIXEL_BITS. If this function fails then the scan + * converter should be reset or destroyed. Dir must be +1 or -1, + * with the latter reversing the orientation of the edge. */ +I void +glitter_scan_converter_add_edge (glitter_scan_converter_t *converter, + const cairo_edge_t *edge) +{ + cairo_edge_t e; + + INPUT_TO_GRID_Y (edge->top, e.top); + INPUT_TO_GRID_Y (edge->bottom, e.bottom); + if (e.top >= e.bottom) + return; + + /* XXX: possible overflows if GRID_X/Y > 2**GLITTER_INPUT_BITS */ + INPUT_TO_GRID_Y (edge->line.p1.y, e.line.p1.y); + INPUT_TO_GRID_Y (edge->line.p2.y, e.line.p2.y); + if (e.line.p1.y == e.line.p2.y) + e.line.p2.y++; /* Fudge to prevent div-by-zero */ + + INPUT_TO_GRID_X (edge->line.p1.x, e.line.p1.x); + INPUT_TO_GRID_X (edge->line.p2.x, e.line.p2.x); + + e.dir = edge->dir; + + polygon_add_edge (converter->polygon, &e); +} + +static void +step_edges (struct active_list *active, int count) +{ + struct edge *edge; + + count *= GRID_Y; + for (edge = active->head.next; edge != &active->tail; edge = edge->next) { + edge->height_left -= count; + if (! edge->height_left) { + edge->prev->next = edge->next; + edge->next->prev = edge->prev; + } + } +} + +static glitter_status_t +blit_a8 (struct cell_list *cells, + cairo_span_renderer_t *renderer, + cairo_half_open_span_t *spans, + int y, int height, + int xmin, int xmax) +{ + struct cell *cell = cells->head.next; + int prev_x = xmin, last_x = -1; + int16_t cover = 0, last_cover = 0; + unsigned num_spans; + + if (cell == &cells->tail) + return CAIRO_STATUS_SUCCESS; + + /* Skip cells to the left of the clip region. */ + while (cell->x < xmin) { + cover += cell->covered_height; + cell = cell->next; + } + cover *= GRID_X*2; + + /* Form the spans from the coverages and areas. */ + num_spans = 0; + for (; cell->x < xmax; cell = cell->next) { + int x = cell->x; + int16_t area; + + if (x > prev_x && cover != last_cover) { + spans[num_spans].x = prev_x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (cover); + last_cover = cover; + last_x = prev_x; + ++num_spans; + } + + cover += cell->covered_height*GRID_X*2; + area = cover - cell->uncovered_area; + + if (area != last_cover) { + spans[num_spans].x = x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (area); + last_cover = area; + last_x = x; + ++num_spans; + } + + prev_x = x+1; + } + + if (prev_x <= xmax && cover != last_cover) { + spans[num_spans].x = prev_x; + spans[num_spans].coverage = GRID_AREA_TO_ALPHA (cover); + last_cover = cover; + last_x = prev_x; + ++num_spans; + } + + if (last_x < xmax && last_cover) { + spans[num_spans].x = xmax; + spans[num_spans].coverage = 0; + ++num_spans; + } + + /* Dump them into the renderer. */ + return renderer->render_rows (renderer, y, height, spans, num_spans); +} + +#define GRID_AREA_TO_A1(A) ((GRID_AREA_TO_ALPHA (A) > 127) ? 255 : 0) +static glitter_status_t +blit_a1 (struct cell_list *cells, + cairo_span_renderer_t *renderer, + cairo_half_open_span_t *spans, + int y, int height, + int xmin, int xmax) +{ + struct cell *cell = cells->head.next; + int prev_x = xmin, last_x = -1; + int16_t cover = 0; + uint8_t coverage, last_cover = 0; + unsigned num_spans; + + if (cell == &cells->tail) + return CAIRO_STATUS_SUCCESS; + + /* Skip cells to the left of the clip region. */ + while (cell->x < xmin) { + cover += cell->covered_height; + cell = cell->next; + } + cover *= GRID_X*2; + + /* Form the spans from the coverages and areas. */ + num_spans = 0; + for (; cell->x < xmax; cell = cell->next) { + int x = cell->x; + int16_t area; + + coverage = GRID_AREA_TO_A1 (cover); + if (x > prev_x && coverage != last_cover) { + last_x = spans[num_spans].x = prev_x; + last_cover = spans[num_spans].coverage = coverage; + ++num_spans; + } + + cover += cell->covered_height*GRID_X*2; + area = cover - cell->uncovered_area; + + coverage = GRID_AREA_TO_A1 (area); + if (coverage != last_cover) { + last_x = spans[num_spans].x = x; + last_cover = spans[num_spans].coverage = coverage; + ++num_spans; + } + + prev_x = x+1; + } + + coverage = GRID_AREA_TO_A1 (cover); + if (prev_x <= xmax && coverage != last_cover) { + last_x = spans[num_spans].x = prev_x; + last_cover = spans[num_spans].coverage = coverage; + ++num_spans; + } + + if (last_x < xmax && last_cover) { + spans[num_spans].x = xmax; + spans[num_spans].coverage = 0; + ++num_spans; + } + if (num_spans == 1) + return CAIRO_STATUS_SUCCESS; + + /* Dump them into the renderer. */ + return renderer->render_rows (renderer, y, height, spans, num_spans); +} + + +I void +glitter_scan_converter_render(glitter_scan_converter_t *converter, + unsigned int winding_mask, + int antialias, + cairo_span_renderer_t *renderer) +{ + int i, j; + int ymax_i = converter->ymax / GRID_Y; + int ymin_i = converter->ymin / GRID_Y; + int xmin_i, xmax_i; + int h = ymax_i - ymin_i; + struct polygon *polygon = converter->polygon; + struct cell_list *coverages = converter->coverages; + struct active_list *active = converter->active; + struct edge *buckets[GRID_Y] = { 0 }; + + xmin_i = converter->xmin / GRID_X; + xmax_i = converter->xmax / GRID_X; + if (xmin_i >= xmax_i) + return; + + /* Render each pixel row. */ + for (i = 0; i < h; i = j) { + int do_full_row = 0; + + j = i + 1; + + /* Determine if we can ignore this row or use the full pixel + * stepper. */ + if (! polygon->y_buckets[i]) { + if (active->head.next == &active->tail) { + active->min_height = INT_MAX; + active->is_vertical = 1; + for (; j < h && ! polygon->y_buckets[j]; j++) + ; + continue; + } + + do_full_row = can_do_full_row (active); + } + + if (do_full_row) { + /* Step by a full pixel row's worth. */ + full_row (active, coverages, winding_mask); + + if (active->is_vertical) { + while (j < h && + polygon->y_buckets[j] == NULL && + active->min_height >= 2*GRID_Y) + { + active->min_height -= GRID_Y; + j++; + } + if (j != i + 1) + step_edges (active, j - (i + 1)); + } + } else { + int sub; + + polygon_fill_buckets (active, + polygon->y_buckets[i], + (i+ymin_i)*GRID_Y, + buckets); + + /* Subsample this row. */ + for (sub = 0; sub < GRID_Y; sub++) { + if (buckets[sub]) { + active_list_merge_edges_from_bucket (active, buckets[sub]); + buckets[sub] = NULL; + } + + sub_row (active, coverages, winding_mask); + } + } + + if (antialias) + blit_a8 (coverages, renderer, converter->spans, + i+ymin_i, j-i, xmin_i, xmax_i); + else + blit_a1 (coverages, renderer, converter->spans, + i+ymin_i, j-i, xmin_i, xmax_i); + cell_list_reset (coverages); + + active->min_height -= GRID_Y; + } +} + +struct _cairo_tor22_scan_converter { + cairo_scan_converter_t base; + + glitter_scan_converter_t converter[1]; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + + jmp_buf jmp; +}; + +typedef struct _cairo_tor22_scan_converter cairo_tor22_scan_converter_t; + +static void +_cairo_tor22_scan_converter_destroy (void *converter) +{ + cairo_tor22_scan_converter_t *self = converter; + if (self == NULL) { + return; + } + _glitter_scan_converter_fini (self->converter); + free(self); +} + +cairo_status_t +_cairo_tor22_scan_converter_add_polygon (void *converter, + const cairo_polygon_t *polygon) +{ + cairo_tor22_scan_converter_t *self = converter; + int i; + +#if 0 + FILE *file = fopen ("polygon.txt", "w"); + _cairo_debug_print_polygon (file, polygon); + fclose (file); +#endif + + for (i = 0; i < polygon->num_edges; i++) + glitter_scan_converter_add_edge (self->converter, &polygon->edges[i]); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_tor22_scan_converter_generate (void *converter, + cairo_span_renderer_t *renderer) +{ + cairo_tor22_scan_converter_t *self = converter; + cairo_status_t status; + + if ((status = setjmp (self->jmp))) + return _cairo_scan_converter_set_error (self, _cairo_error (status)); + + glitter_scan_converter_render (self->converter, + self->fill_rule == CAIRO_FILL_RULE_WINDING ? ~0 : 1, + self->antialias != CAIRO_ANTIALIAS_NONE, + renderer); + return CAIRO_STATUS_SUCCESS; +} + +cairo_scan_converter_t * +_cairo_tor22_scan_converter_create (int xmin, + int ymin, + int xmax, + int ymax, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias) +{ + cairo_tor22_scan_converter_t *self; + cairo_status_t status; + + self = malloc (sizeof(struct _cairo_tor22_scan_converter)); + if (unlikely (self == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto bail_nomem; + } + + self->base.destroy = _cairo_tor22_scan_converter_destroy; + self->base.generate = _cairo_tor22_scan_converter_generate; + + _glitter_scan_converter_init (self->converter, &self->jmp); + status = glitter_scan_converter_reset (self->converter, + xmin, ymin, xmax, ymax); + if (unlikely (status)) + goto bail; + + self->fill_rule = fill_rule; + self->antialias = antialias; + + return &self->base; + + bail: + self->base.destroy(&self->base); + bail_nomem: + return _cairo_scan_converter_create_in_error (status); +} diff --git a/src/cairo-toy-font-face.c b/src/cairo-toy-font-face.c new file mode 100644 index 000000000..4fe94ab09 --- /dev/null +++ b/src/cairo-toy-font-face.c @@ -0,0 +1,524 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005,2008 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Graydon Hoare + * Owen Taylor + * Behdad Esfahbod + */ + +#define _BSD_SOURCE /* for strdup() */ +#include "cairoint.h" +#include "cairo-error-private.h" + + +static const cairo_font_face_t _cairo_font_face_null_pointer = { + { 0 }, /* hash_entry */ + CAIRO_STATUS_NULL_POINTER, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + NULL +}; + +static const cairo_font_face_t _cairo_font_face_invalid_string = { + { 0 }, /* hash_entry */ + CAIRO_STATUS_INVALID_STRING, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + NULL +}; + +static const cairo_font_face_t _cairo_font_face_invalid_slant = { + { 0 }, /* hash_entry */ + CAIRO_STATUS_INVALID_SLANT, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + NULL +}; + +static const cairo_font_face_t _cairo_font_face_invalid_weight = { + { 0 }, /* hash_entry */ + CAIRO_STATUS_INVALID_WEIGHT, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + NULL +}; + + +static const cairo_font_face_backend_t _cairo_toy_font_face_backend; + +static int +_cairo_toy_font_face_keys_equal (const void *key_a, + const void *key_b); + +/* We maintain a hash table from family/weight/slant => + * #cairo_font_face_t for #cairo_toy_font_t. The primary purpose of + * this mapping is to provide unique #cairo_font_face_t values so that + * our cache and mapping from #cairo_font_face_t => #cairo_scaled_font_t + * works. Once the corresponding #cairo_font_face_t objects fall out of + * downstream caches, we don't need them in this hash table anymore. + * + * Modifications to this hash table are protected by + * _cairo_toy_font_face_mutex. + */ +static cairo_hash_table_t *cairo_toy_font_face_hash_table = NULL; + +static cairo_hash_table_t * +_cairo_toy_font_face_hash_table_lock (void) +{ + CAIRO_MUTEX_LOCK (_cairo_toy_font_face_mutex); + + if (cairo_toy_font_face_hash_table == NULL) + { + cairo_toy_font_face_hash_table = + _cairo_hash_table_create (_cairo_toy_font_face_keys_equal); + + if (cairo_toy_font_face_hash_table == NULL) { + CAIRO_MUTEX_UNLOCK (_cairo_toy_font_face_mutex); + return NULL; + } + } + + return cairo_toy_font_face_hash_table; +} + +static void +_cairo_toy_font_face_hash_table_unlock (void) +{ + CAIRO_MUTEX_UNLOCK (_cairo_toy_font_face_mutex); +} + +/** + * _cairo_toy_font_face_init_key: + * + * Initialize those portions of #cairo_toy_font_face_t needed to use + * it as a hash table key, including the hash code buried away in + * font_face->base.hash_entry. No memory allocation is performed here + * so that no fini call is needed. We do this to make it easier to use + * an automatic #cairo_toy_font_face_t variable as a key. + **/ +static void +_cairo_toy_font_face_init_key (cairo_toy_font_face_t *key, + const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight) +{ + unsigned long hash; + + key->family = family; + key->owns_family = FALSE; + + key->slant = slant; + key->weight = weight; + + /* 1607 and 1451 are just a couple of arbitrary primes. */ + hash = _cairo_hash_string (family); + hash += ((unsigned long) slant) * 1607; + hash += ((unsigned long) weight) * 1451; + + key->base.hash_entry.hash = hash; +} + +static cairo_status_t +_cairo_toy_font_face_create_impl_face (cairo_toy_font_face_t *font_face, + cairo_font_face_t **impl_font_face) +{ + const cairo_font_face_backend_t * backend = CAIRO_FONT_FACE_BACKEND_DEFAULT; + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + if (unlikely (font_face->base.status)) + return font_face->base.status; + + if (backend->create_for_toy != NULL && + 0 != strncmp (font_face->family, CAIRO_USER_FONT_FAMILY_DEFAULT, + strlen (CAIRO_USER_FONT_FAMILY_DEFAULT))) + { + status = backend->create_for_toy (font_face, impl_font_face); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + backend = &_cairo_user_font_face_backend; + status = backend->create_for_toy (font_face, impl_font_face); + } + + return status; +} + +static cairo_status_t +_cairo_toy_font_face_init (cairo_toy_font_face_t *font_face, + const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight) +{ + char *family_copy; + cairo_status_t status; + + family_copy = strdup (family); + if (unlikely (family_copy == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_toy_font_face_init_key (font_face, family_copy, slant, weight); + font_face->owns_family = TRUE; + + _cairo_font_face_init (&font_face->base, &_cairo_toy_font_face_backend); + + status = _cairo_toy_font_face_create_impl_face (font_face, + &font_face->impl_face); + if (unlikely (status)) { + free (family_copy); + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_toy_font_face_fini (cairo_toy_font_face_t *font_face) +{ + /* We assert here that we own font_face->family before casting + * away the const qualifer. */ + assert (font_face->owns_family); + free ((char*) font_face->family); + + if (font_face->impl_face) + cairo_font_face_destroy (font_face->impl_face); +} + +static int +_cairo_toy_font_face_keys_equal (const void *key_a, + const void *key_b) +{ + const cairo_toy_font_face_t *face_a = key_a; + const cairo_toy_font_face_t *face_b = key_b; + + return (strcmp (face_a->family, face_b->family) == 0 && + face_a->slant == face_b->slant && + face_a->weight == face_b->weight); +} + +/** + * cairo_toy_font_face_create: + * @family: a font family name, encoded in UTF-8 + * @slant: the slant for the font + * @weight: the weight for the font + * + * Creates a font face from a triplet of family, slant, and weight. + * These font faces are used in implementation of the the #cairo_t "toy" + * font API. + * + * If @family is the zero-length string "", the platform-specific default + * family is assumed. The default family then can be queried using + * cairo_toy_font_face_get_family(). + * + * The cairo_select_font_face() function uses this to create font faces. + * See that function for limitations and other details of toy font faces. + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.8 + **/ +cairo_font_face_t * +cairo_toy_font_face_create (const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight) +{ + cairo_status_t status; + cairo_toy_font_face_t key, *font_face; + cairo_hash_table_t *hash_table; + + if (family == NULL) + return (cairo_font_face_t*) &_cairo_font_face_null_pointer; + + /* Make sure we've got valid UTF-8 for the family */ + status = _cairo_utf8_to_ucs4 (family, -1, NULL, NULL); + if (unlikely (status)) { + if (status == CAIRO_STATUS_INVALID_STRING) + return (cairo_font_face_t*) &_cairo_font_face_invalid_string; + + return (cairo_font_face_t*) &_cairo_font_face_nil; + } + + switch (slant) { + case CAIRO_FONT_SLANT_NORMAL: + case CAIRO_FONT_SLANT_ITALIC: + case CAIRO_FONT_SLANT_OBLIQUE: + break; + default: + return (cairo_font_face_t*) &_cairo_font_face_invalid_slant; + } + + switch (weight) { + case CAIRO_FONT_WEIGHT_NORMAL: + case CAIRO_FONT_WEIGHT_BOLD: + break; + default: + return (cairo_font_face_t*) &_cairo_font_face_invalid_weight; + } + + if (*family == '\0') + family = CAIRO_FONT_FAMILY_DEFAULT; + + hash_table = _cairo_toy_font_face_hash_table_lock (); + if (unlikely (hash_table == NULL)) + goto UNWIND; + + _cairo_toy_font_face_init_key (&key, family, slant, weight); + + /* Return existing font_face if it exists in the hash table. */ + font_face = _cairo_hash_table_lookup (hash_table, + &key.base.hash_entry); + if (font_face != NULL) { + if (font_face->base.status == CAIRO_STATUS_SUCCESS) { + cairo_font_face_reference (&font_face->base); + _cairo_toy_font_face_hash_table_unlock (); + return &font_face->base; + } + + /* remove the bad font from the hash table */ + _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); + } + + /* Otherwise create it and insert into hash table. */ + font_face = malloc (sizeof (cairo_toy_font_face_t)); + if (unlikely (font_face == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto UNWIND_HASH_TABLE_LOCK; + } + + status = _cairo_toy_font_face_init (font_face, family, slant, weight); + if (unlikely (status)) + goto UNWIND_FONT_FACE_MALLOC; + + assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); + status = _cairo_hash_table_insert (hash_table, &font_face->base.hash_entry); + if (unlikely (status)) + goto UNWIND_FONT_FACE_INIT; + + _cairo_toy_font_face_hash_table_unlock (); + + return &font_face->base; + + UNWIND_FONT_FACE_INIT: + _cairo_toy_font_face_fini (font_face); + UNWIND_FONT_FACE_MALLOC: + free (font_face); + UNWIND_HASH_TABLE_LOCK: + _cairo_toy_font_face_hash_table_unlock (); + UNWIND: + return (cairo_font_face_t*) &_cairo_font_face_nil; +} +slim_hidden_def (cairo_toy_font_face_create); + +static cairo_bool_t +_cairo_toy_font_face_destroy (void *abstract_face) +{ + cairo_toy_font_face_t *font_face = abstract_face; + cairo_hash_table_t *hash_table; + + hash_table = _cairo_toy_font_face_hash_table_lock (); + /* All created objects must have been mapped in the hash table. */ + assert (hash_table != NULL); + + if (! _cairo_reference_count_dec_and_test (&font_face->base.ref_count)) { + /* somebody recreated the font whilst we waited for the lock */ + _cairo_toy_font_face_hash_table_unlock (); + return FALSE; + } + + /* Font faces in SUCCESS status are guaranteed to be in the + * hashtable. Font faces in an error status are removed from the + * hashtable if they are found during a lookup, thus they should + * only be removed if they are in the hashtable. */ + if (likely (font_face->base.status == CAIRO_STATUS_SUCCESS) || + _cairo_hash_table_lookup (hash_table, &font_face->base.hash_entry) == font_face) + _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); + + _cairo_toy_font_face_hash_table_unlock (); + + _cairo_toy_font_face_fini (font_face); + return TRUE; +} + +static cairo_status_t +_cairo_toy_font_face_scaled_font_create (void *abstract_font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **scaled_font) +{ + cairo_toy_font_face_t *font_face = (cairo_toy_font_face_t *) abstract_font_face; + + ASSERT_NOT_REACHED; + + return _cairo_font_face_set_error (&font_face->base, CAIRO_STATUS_FONT_TYPE_MISMATCH); +} + +static cairo_font_face_t * +_cairo_toy_font_face_get_implementation (void *abstract_font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options) +{ + cairo_toy_font_face_t *font_face = abstract_font_face; + + if (font_face->impl_face) { + cairo_font_face_t *impl = font_face->impl_face; + + if (impl->backend->get_implementation != NULL) { + return impl->backend->get_implementation (impl, + font_matrix, + ctm, + options); + } + + return cairo_font_face_reference (impl); + } + + return abstract_font_face; +} + +static cairo_bool_t +_cairo_font_face_is_toy (cairo_font_face_t *font_face) +{ + return font_face->backend == &_cairo_toy_font_face_backend; +} + +/** + * cairo_toy_font_face_get_family: + * @font_face: A toy font face + * + * Gets the familly name of a toy font. + * + * Return value: The family name. This string is owned by the font face + * and remains valid as long as the font face is alive (referenced). + * + * Since: 1.8 + **/ +const char * +cairo_toy_font_face_get_family (cairo_font_face_t *font_face) +{ + cairo_toy_font_face_t *toy_font_face; + + if (font_face->status) + return CAIRO_FONT_FAMILY_DEFAULT; + + toy_font_face = (cairo_toy_font_face_t *) font_face; + if (! _cairo_font_face_is_toy (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return CAIRO_FONT_FAMILY_DEFAULT; + } + assert (toy_font_face->owns_family); + return toy_font_face->family; +} + +/** + * cairo_toy_font_face_get_slant: + * @font_face: A toy font face + * + * Gets the slant a toy font. + * + * Return value: The slant value + * + * Since: 1.8 + **/ +cairo_font_slant_t +cairo_toy_font_face_get_slant (cairo_font_face_t *font_face) +{ + cairo_toy_font_face_t *toy_font_face; + + if (font_face->status) + return CAIRO_FONT_SLANT_DEFAULT; + + toy_font_face = (cairo_toy_font_face_t *) font_face; + if (! _cairo_font_face_is_toy (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return CAIRO_FONT_SLANT_DEFAULT; + } + return toy_font_face->slant; +} +slim_hidden_def (cairo_toy_font_face_get_slant); + +/** + * cairo_toy_font_face_get_weight: + * @font_face: A toy font face + * + * Gets the weight a toy font. + * + * Return value: The weight value + * + * Since: 1.8 + **/ +cairo_font_weight_t +cairo_toy_font_face_get_weight (cairo_font_face_t *font_face) +{ + cairo_toy_font_face_t *toy_font_face; + + if (font_face->status) + return CAIRO_FONT_WEIGHT_DEFAULT; + + toy_font_face = (cairo_toy_font_face_t *) font_face; + if (! _cairo_font_face_is_toy (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return CAIRO_FONT_WEIGHT_DEFAULT; + } + return toy_font_face->weight; +} +slim_hidden_def (cairo_toy_font_face_get_weight); + +static const cairo_font_face_backend_t _cairo_toy_font_face_backend = { + CAIRO_FONT_TYPE_TOY, + NULL, /* create_for_toy */ + _cairo_toy_font_face_destroy, + _cairo_toy_font_face_scaled_font_create, + _cairo_toy_font_face_get_implementation +}; + +void +_cairo_toy_font_face_reset_static_data (void) +{ + cairo_hash_table_t *hash_table; + + /* We manually acquire the lock rather than calling + * cairo_toy_font_face_hash_table_lock simply to avoid + * creating the table only to destroy it again. */ + CAIRO_MUTEX_LOCK (_cairo_toy_font_face_mutex); + hash_table = cairo_toy_font_face_hash_table; + cairo_toy_font_face_hash_table = NULL; + CAIRO_MUTEX_UNLOCK (_cairo_toy_font_face_mutex); + + if (hash_table != NULL) + _cairo_hash_table_destroy (hash_table); +} diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c new file mode 100644 index 000000000..3414fc268 --- /dev/null +++ b/src/cairo-traps-compositor.c @@ -0,0 +1,2351 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-pattern-inline.h" +#include "cairo-paginated-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-observer-private.h" +#include "cairo-region-private.h" +#include "cairo-spans-private.h" +#include "cairo-traps-private.h" +#include "cairo-tristrip-private.h" + +typedef cairo_int_status_t +(*draw_func_t) (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip); + +static void do_unaligned_row(void (*blt)(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage), + void *closure, + const cairo_box_t *b, + int tx, int y, int h, + uint16_t coverage) +{ + int x1 = _cairo_fixed_integer_part (b->p1.x) - tx; + int x2 = _cairo_fixed_integer_part (b->p2.x) - tx; + if (x2 > x1) { + if (! _cairo_fixed_is_integer (b->p1.x)) { + blt(closure, x1, y, 1, h, + coverage * (256 - _cairo_fixed_fractional_part (b->p1.x))); + x1++; + } + + if (x2 > x1) + blt(closure, x1, y, x2-x1, h, (coverage << 8) - (coverage >> 8)); + + if (! _cairo_fixed_is_integer (b->p2.x)) + blt(closure, x2, y, 1, h, + coverage * _cairo_fixed_fractional_part (b->p2.x)); + } else + blt(closure, x1, y, 1, h, + coverage * (b->p2.x - b->p1.x)); +} + +static void do_unaligned_box(void (*blt)(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage), + void *closure, + const cairo_box_t *b, int tx, int ty) +{ + int y1 = _cairo_fixed_integer_part (b->p1.y) - ty; + int y2 = _cairo_fixed_integer_part (b->p2.y) - ty; + if (y2 > y1) { + if (! _cairo_fixed_is_integer (b->p1.y)) { + do_unaligned_row(blt, closure, b, tx, y1, 1, + 256 - _cairo_fixed_fractional_part (b->p1.y)); + y1++; + } + + if (y2 > y1) + do_unaligned_row(blt, closure, b, tx, y1, y2-y1, 256); + + if (! _cairo_fixed_is_integer (b->p2.y)) + do_unaligned_row(blt, closure, b, tx, y2, 1, + _cairo_fixed_fractional_part (b->p2.y)); + } else + do_unaligned_row(blt, closure, b, tx, y1, 1, + b->p2.y - b->p1.y); +} + +struct blt_in { + const cairo_traps_compositor_t *compositor; + cairo_surface_t *dst; + cairo_boxes_t boxes; +}; + +static void blt_in(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct blt_in *info = closure; + cairo_color_t color; + + if (CAIRO_ALPHA_SHORT_IS_OPAQUE (coverage)) + return; + + _cairo_box_from_integers (&info->boxes.chunks.base[0], x, y, w, h); + + _cairo_color_init_rgba (&color, 0, 0, 0, coverage / (double) 0xffff); + info->compositor->fill_boxes (info->dst, + CAIRO_OPERATOR_IN, &color, + &info->boxes); +} + +static void +add_rect_with_offset (cairo_boxes_t *boxes, int x1, int y1, int x2, int y2, int dx, int dy) +{ + cairo_box_t box; + cairo_int_status_t status; + + box.p1.x = _cairo_fixed_from_int (x1 - dx); + box.p1.y = _cairo_fixed_from_int (y1 - dy); + box.p2.x = _cairo_fixed_from_int (x2 - dx); + box.p2.y = _cairo_fixed_from_int (y2 - dy); + + status = _cairo_boxes_add (boxes, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_INT_STATUS_SUCCESS); +} + +static cairo_int_status_t +combine_clip_as_traps (const cairo_traps_compositor_t *compositor, + cairo_surface_t *mask, + const cairo_clip_t *clip, + const cairo_rectangle_int_t *extents) +{ + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + cairo_traps_t traps; + cairo_surface_t *src; + cairo_box_t box; + cairo_rectangle_int_t fixup; + int src_x, src_y; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = _cairo_clip_get_polygon (clip, &polygon, + &fill_rule, &antialias); + if (status) + return status; + + _cairo_traps_init (&traps); + status = _cairo_bentley_ottmann_tessellate_polygon (&traps, + &polygon, + fill_rule); + _cairo_polygon_fini (&polygon); + if (unlikely (status)) + return status; + + src = compositor->pattern_to_surface (mask, NULL, FALSE, + extents, NULL, + &src_x, &src_y); + if (unlikely (src->status)) { + _cairo_traps_fini (&traps); + return src->status; + } + + status = compositor->composite_traps (mask, CAIRO_OPERATOR_IN, src, + src_x, src_y, + extents->x, extents->y, + extents, + antialias, &traps); + + _cairo_traps_extents (&traps, &box); + _cairo_box_round_to_rectangle (&box, &fixup); + _cairo_traps_fini (&traps); + cairo_surface_destroy (src); + + if (unlikely (status)) + return status; + + if (! _cairo_rectangle_intersect (&fixup, extents)) + return CAIRO_STATUS_SUCCESS; + + if (fixup.width < extents->width || fixup.height < extents->height) { + cairo_boxes_t clear; + + _cairo_boxes_init (&clear); + + /* top */ + if (fixup.y != extents->y) { + add_rect_with_offset (&clear, + extents->x, extents->y, + extents->x + extents->width, + fixup.y, + extents->x, extents->y); + } + /* left */ + if (fixup.x != extents->x) { + add_rect_with_offset (&clear, + extents->x, fixup.y, + fixup.x, + fixup.y + fixup.height, + extents->x, extents->y); + } + /* right */ + if (fixup.x + fixup.width != extents->x + extents->width) { + add_rect_with_offset (&clear, + fixup.x + fixup.width, + fixup.y, + extents->x + extents->width, + fixup.y + fixup.height, + extents->x, extents->y); + } + /* bottom */ + if (fixup.y + fixup.height != extents->y + extents->height) { + add_rect_with_offset (&clear, + extents->x, + fixup.y + fixup.height, + extents->x + extents->width, + extents->y + extents->height, + extents->x, extents->y); + } + + status = compositor->fill_boxes (mask, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + + _cairo_boxes_fini (&clear); + } + + return status; +} + +static cairo_status_t +__clip_to_surface (const cairo_traps_compositor_t *compositor, + const cairo_composite_rectangles_t *composite, + const cairo_rectangle_int_t *extents, + cairo_surface_t **surface) +{ + cairo_surface_t *mask; + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + cairo_traps_t traps; + cairo_boxes_t clear; + cairo_surface_t *src; + int src_x, src_y; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = _cairo_clip_get_polygon (composite->clip, &polygon, + &fill_rule, &antialias); + if (status) + return status; + + _cairo_traps_init (&traps); + status = _cairo_bentley_ottmann_tessellate_polygon (&traps, + &polygon, + fill_rule); + _cairo_polygon_fini (&polygon); + if (unlikely (status)) + return status; + + mask = _cairo_surface_create_scratch (composite->surface, + CAIRO_CONTENT_ALPHA, + extents->width, + extents->height, + NULL); + if (unlikely (mask->status)) { + _cairo_traps_fini (&traps); + return status; + } + + src = compositor->pattern_to_surface (mask, NULL, FALSE, + extents, NULL, + &src_x, &src_y); + if (unlikely (status = src->status)) + goto error; + + status = compositor->acquire (mask); + if (unlikely (status)) + goto error; + + _cairo_boxes_init_from_rectangle (&clear, + 0, 0, + extents->width, + extents->height); + status = compositor->fill_boxes (mask, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + if (unlikely (status)) + goto error_release; + + status = compositor->composite_traps (mask, CAIRO_OPERATOR_ADD, src, + src_x, src_y, + extents->x, extents->y, + extents, + antialias, &traps); + if (unlikely (status)) + goto error_release; + + compositor->release (mask); + *surface = mask; +out: + cairo_surface_destroy (src); + _cairo_traps_fini (&traps); + return status; + +error_release: + compositor->release (mask); +error: + cairo_surface_destroy (mask); + goto out; +} + +static cairo_surface_t * +traps_get_clip_surface (const cairo_traps_compositor_t *compositor, + const cairo_composite_rectangles_t *composite, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *surface = NULL; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = __clip_to_surface (compositor, composite, extents, &surface); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + surface = _cairo_surface_create_scratch (composite->surface, + CAIRO_CONTENT_ALPHA, + extents->width, + extents->height, + CAIRO_COLOR_WHITE); + if (unlikely (surface->status)) + return surface; + + status = _cairo_clip_combine_with_surface (composite->clip, surface, + extents->x, extents->y); + } + if (unlikely (status)) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + + return surface; +} + +static void blt_unaligned_boxes(const cairo_traps_compositor_t *compositor, + cairo_surface_t *surface, + int dx, int dy, + cairo_box_t *boxes, + int num_boxes) +{ + struct blt_in info; + int i; + + info.compositor = compositor; + info.dst = surface; + _cairo_boxes_init (&info.boxes); + info.boxes.num_boxes = 1; + for (i = 0; i < num_boxes; i++) { + cairo_box_t *b = &boxes[i]; + + if (! _cairo_fixed_is_integer (b->p1.x) || + ! _cairo_fixed_is_integer (b->p1.y) || + ! _cairo_fixed_is_integer (b->p2.x) || + ! _cairo_fixed_is_integer (b->p2.y)) + { + do_unaligned_box(blt_in, &info, b, dx, dy); + } + } +} + +static cairo_surface_t * +create_composite_mask (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *draw_closure, + draw_func_t draw_func, + draw_func_t mask_func, + const cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *surface, *src; + cairo_int_status_t status; + int src_x, src_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + surface = _cairo_surface_create_scratch (dst, CAIRO_CONTENT_ALPHA, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (surface->status)) + return surface; + + src = compositor->pattern_to_surface (surface, + &_cairo_pattern_white.base, + FALSE, + &extents->bounded, + &extents->bounded, + &src_x, &src_y); + if (unlikely (src->status)) { + cairo_surface_destroy (surface); + return src; + } + + status = compositor->acquire (surface); + if (unlikely (status)) { + cairo_surface_destroy (src); + cairo_surface_destroy (surface); + return _cairo_surface_create_in_error (status); + } + + if (!surface->is_clear) { + cairo_boxes_t clear; + + _cairo_boxes_init_from_rectangle (&clear, + 0, 0, + extents->bounded.width, + extents->bounded.height); + status = compositor->fill_boxes (surface, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + if (unlikely (status)) + goto error; + + surface->is_clear = TRUE; + } + + if (mask_func) { + status = mask_func (compositor, surface, draw_closure, + CAIRO_OPERATOR_SOURCE, src, src_x, src_y, + extents->bounded.x, extents->bounded.y, + &extents->bounded, extents->clip); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + surface->is_clear = FALSE; + goto out; + } + if (unlikely (status != CAIRO_INT_STATUS_UNSUPPORTED)) + goto error; + } + + /* Is it worth setting the clip region here? */ + status = draw_func (compositor, surface, draw_closure, + CAIRO_OPERATOR_ADD, src, src_x, src_y, + extents->bounded.x, extents->bounded.y, + &extents->bounded, NULL); + if (unlikely (status)) + goto error; + + surface->is_clear = FALSE; + if (extents->clip->path != NULL) { + status = combine_clip_as_traps (compositor, surface, + extents->clip, &extents->bounded); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_clip_combine_with_surface (extents->clip, surface, + extents->bounded.x, + extents->bounded.y); + } + if (unlikely (status)) + goto error; + } else if (extents->clip->boxes) { + blt_unaligned_boxes(compositor, surface, + extents->bounded.x, extents->bounded.y, + extents->clip->boxes, extents->clip->num_boxes); + + } + +out: + compositor->release (surface); + cairo_surface_destroy (src); + return surface; + +error: + compositor->release (surface); + if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + cairo_surface_destroy (src); + return surface; +} + +/* Handles compositing with a clip surface when the operator allows + * us to combine the clip with the mask + */ +static cairo_status_t +clip_and_composite_with_mask (const cairo_traps_compositor_t *compositor, + const cairo_composite_rectangles_t*extents, + draw_func_t draw_func, + draw_func_t mask_func, + void *draw_closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, int src_y) +{ + cairo_surface_t *dst = extents->surface; + cairo_surface_t *mask; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + mask = create_composite_mask (compositor, dst, draw_closure, + draw_func, mask_func, + extents); + if (unlikely (mask->status)) + return mask->status; + + if (mask->is_clear) + goto skip; + + if (src != NULL || dst->content != CAIRO_CONTENT_ALPHA) { + compositor->composite (dst, op, src, mask, + extents->bounded.x + src_x, + extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } else { + compositor->composite (dst, op, mask, NULL, + 0, 0, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } + +skip: + cairo_surface_destroy (mask); + return CAIRO_STATUS_SUCCESS; +} + +/* Handles compositing with a clip surface when we have to do the operation + * in two pieces and combine them together. + */ +static cairo_status_t +clip_and_composite_combine (const cairo_traps_compositor_t *compositor, + const cairo_composite_rectangles_t*extents, + draw_func_t draw_func, + void *draw_closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, int src_y) +{ + cairo_surface_t *dst = extents->surface; + cairo_surface_t *tmp, *clip; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + tmp = _cairo_surface_create_scratch (dst, dst->content, + extents->bounded.width, + extents->bounded.height, + NULL); + if (unlikely (tmp->status)) + return tmp->status; + + status = compositor->acquire (tmp); + if (unlikely (status)) { + cairo_surface_destroy (tmp); + return status; + } + + compositor->composite (tmp, + dst->is_clear ? CAIRO_OPERATOR_CLEAR : CAIRO_OPERATOR_SOURCE, + dst, NULL, + extents->bounded.x, extents->bounded.y, + 0, 0, + 0, 0, + extents->bounded.width, extents->bounded.height); + + status = draw_func (compositor, tmp, draw_closure, op, + src, src_x, src_y, + extents->bounded.x, extents->bounded.y, + &extents->bounded, NULL); + + if (unlikely (status)) + goto cleanup; + + clip = traps_get_clip_surface (compositor, extents, &extents->bounded); + if (unlikely ((status = clip->status))) + goto cleanup; + + if (dst->is_clear) { + compositor->composite (dst, CAIRO_OPERATOR_SOURCE, tmp, clip, + 0, 0, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } else { + compositor->lerp (dst, tmp, clip, + 0, 0, + 0,0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } + cairo_surface_destroy (clip); + +cleanup: + compositor->release (tmp); + cairo_surface_destroy (tmp); + + return status; +} + +/* Handles compositing for %CAIRO_OPERATOR_SOURCE, which is special; it's + * defined as (src IN mask IN clip) ADD (dst OUT (mask IN clip)) + */ +static cairo_status_t +clip_and_composite_source (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + draw_func_t draw_func, + draw_func_t mask_func, + void *draw_closure, + cairo_surface_t *src, + int src_x, + int src_y, + const cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *mask; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + /* Create a surface that is mask IN clip */ + mask = create_composite_mask (compositor, dst, draw_closure, + draw_func, mask_func, + extents); + if (unlikely (mask->status)) + return mask->status; + + if (mask->is_clear) + goto skip; + + if (dst->is_clear) { + compositor->composite (dst, CAIRO_OPERATOR_SOURCE, src, mask, + extents->bounded.x + src_x, extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } else { + compositor->lerp (dst, src, mask, + extents->bounded.x + src_x, extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + } + +skip: + cairo_surface_destroy (mask); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +can_reduce_alpha_op (cairo_operator_t op) +{ + int iop = op; + switch (iop) { + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_ADD: + return TRUE; + default: + return FALSE; + } +} + +static cairo_bool_t +reduce_alpha_op (cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *dst = extents->surface; + cairo_operator_t op = extents->op; + const cairo_pattern_t *pattern = &extents->source_pattern.base; + return dst->is_clear && + dst->content == CAIRO_CONTENT_ALPHA && + _cairo_pattern_is_opaque_solid (pattern) && + can_reduce_alpha_op (op); +} + +static cairo_status_t +fixup_unbounded_with_mask (const cairo_traps_compositor_t *compositor, + const cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *dst = extents->surface; + cairo_surface_t *mask; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + /* XXX can we avoid querying the clip surface again? */ + mask = traps_get_clip_surface (compositor, extents, &extents->unbounded); + if (unlikely (mask->status)) + return mask->status; + + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + int x = extents->unbounded.x; + int y = extents->unbounded.y; + int width = extents->unbounded.width; + int height = extents->bounded.y - y; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + 0, 0, + 0, 0, + x, y, + width, height); + } + + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + int x = extents->unbounded.x; + int y = extents->bounded.y; + int width = extents->bounded.x - x; + int height = extents->bounded.height; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + 0, y - extents->unbounded.y, + 0, 0, + x, y, + width, height); + } + + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + int x = extents->bounded.x + extents->bounded.width; + int y = extents->bounded.y; + int width = extents->unbounded.x + extents->unbounded.width - x; + int height = extents->bounded.height; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + x - extents->unbounded.x, y - extents->unbounded.y, + 0, 0, + x, y, + width, height); + } + + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + int x = extents->unbounded.x; + int y = extents->bounded.y + extents->bounded.height; + int width = extents->unbounded.width; + int height = extents->unbounded.y + extents->unbounded.height - y; + + compositor->composite (dst, CAIRO_OPERATOR_DEST_OUT, mask, NULL, + 0, y - extents->unbounded.y, + 0, 0, + x, y, + width, height); + } + + cairo_surface_destroy (mask); + + return CAIRO_STATUS_SUCCESS; +} + +static void +add_rect (cairo_boxes_t *boxes, int x1, int y1, int x2, int y2) +{ + cairo_box_t box; + cairo_int_status_t status; + + box.p1.x = _cairo_fixed_from_int (x1); + box.p1.y = _cairo_fixed_from_int (y1); + box.p2.x = _cairo_fixed_from_int (x2); + box.p2.y = _cairo_fixed_from_int (y2); + + status = _cairo_boxes_add (boxes, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_INT_STATUS_SUCCESS); +} + +static cairo_status_t +fixup_unbounded (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + cairo_boxes_t clear, tmp; + cairo_box_t box; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (extents->bounded.width == extents->unbounded.width && + extents->bounded.height == extents->unbounded.height) + { + return CAIRO_STATUS_SUCCESS; + } + + assert (extents->clip->path == NULL); + + /* subtract the drawn boxes from the unbounded area */ + _cairo_boxes_init (&clear); + + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); + + if (boxes == NULL) { + if (extents->bounded.width == 0 || extents->bounded.height == 0) { + goto empty; + } else { + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + add_rect (&clear, + extents->unbounded.x, extents->unbounded.y, + extents->unbounded.x + extents->unbounded.width, + extents->bounded.y); + } + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + add_rect (&clear, + extents->unbounded.x, extents->bounded.y, + extents->bounded.x, + extents->bounded.y + extents->bounded.height); + } + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + add_rect (&clear, + extents->bounded.x + extents->bounded.width, + extents->bounded.y, + extents->unbounded.x + extents->unbounded.width, + extents->bounded.y + extents->bounded.height); + } + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + add_rect (&clear, + extents->unbounded.x, + extents->bounded.y + extents->bounded.height, + extents->unbounded.x + extents->unbounded.width, + extents->unbounded.y + extents->unbounded.height); + } + } + } else if (boxes->num_boxes) { + _cairo_boxes_init (&tmp); + + assert (boxes->is_pixel_aligned); + + status = _cairo_boxes_add (&tmp, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_INT_STATUS_SUCCESS); + + tmp.chunks.next = &boxes->chunks; + tmp.num_boxes += boxes->num_boxes; + + status = _cairo_bentley_ottmann_tessellate_boxes (&tmp, + CAIRO_FILL_RULE_WINDING, + &clear); + tmp.chunks.next = NULL; + if (unlikely (status)) + goto error; + } else { +empty: + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + + status = _cairo_boxes_add (&clear, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_INT_STATUS_SUCCESS); + } + + /* Now intersect with the clip boxes */ + if (extents->clip->num_boxes) { + _cairo_boxes_init_for_array (&tmp, + extents->clip->boxes, + extents->clip->num_boxes); + status = _cairo_boxes_intersect (&clear, &tmp, &clear); + if (unlikely (status)) + goto error; + } + + status = compositor->fill_boxes (dst, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + +error: + _cairo_boxes_fini (&clear); + return status; +} + +enum { + NEED_CLIP_REGION = 0x1, + NEED_CLIP_SURFACE = 0x2, + FORCE_CLIP_REGION = 0x4, +}; + +static cairo_bool_t +need_bounded_clip (cairo_composite_rectangles_t *extents) +{ + unsigned int flags = 0; + + if (extents->clip->num_boxes > 1 || + extents->mask.width > extents->unbounded.width || + extents->mask.height > extents->unbounded.height) + { + flags |= NEED_CLIP_REGION; + } + + if (extents->clip->num_boxes > 1 || + extents->mask.width > extents->bounded.width || + extents->mask.height > extents->bounded.height) + { + flags |= FORCE_CLIP_REGION; + } + + if (! _cairo_clip_is_region (extents->clip)) + flags |= NEED_CLIP_SURFACE; + + return flags; +} + +static cairo_bool_t +need_unbounded_clip (cairo_composite_rectangles_t *extents) +{ + unsigned int flags = 0; + if (! extents->is_bounded) { + flags |= NEED_CLIP_REGION; + if (! _cairo_clip_is_region (extents->clip)) + flags |= NEED_CLIP_SURFACE; + } + if (extents->clip->path != NULL) + flags |= NEED_CLIP_SURFACE; + return flags; +} + +static cairo_status_t +clip_and_composite (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + draw_func_t draw_func, + draw_func_t mask_func, + void *draw_closure, + unsigned int need_clip) +{ + cairo_surface_t *dst = extents->surface; + cairo_operator_t op = extents->op; + cairo_pattern_t *source = &extents->source_pattern.base; + cairo_surface_t *src; + int src_x, src_y; + cairo_region_t *clip_region = NULL; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (reduce_alpha_op (extents)) { + op = CAIRO_OPERATOR_ADD; + source = NULL; + } + + if (op == CAIRO_OPERATOR_CLEAR) { + op = CAIRO_OPERATOR_DEST_OUT; + source = NULL; + } + + compositor->acquire (dst); + + if (need_clip & NEED_CLIP_REGION) { + const cairo_rectangle_int_t *limit; + + if ((need_clip & FORCE_CLIP_REGION) == 0) + limit = &extents->unbounded; + else + limit = &extents->destination; + + clip_region = _cairo_clip_get_region (extents->clip); + if (clip_region != NULL && + cairo_region_contains_rectangle (clip_region, + limit) == CAIRO_REGION_OVERLAP_IN) + clip_region = NULL; + + if (clip_region != NULL) { + status = compositor->set_clip_region (dst, clip_region); + if (unlikely (status)) { + compositor->release (dst); + return status; + } + } + } + + if (extents->bounded.width == 0 || extents->bounded.height == 0) + goto skip; + + src = compositor->pattern_to_surface (dst, source, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (unlikely (status = src->status)) + goto error; + + if (op == CAIRO_OPERATOR_SOURCE) { + status = clip_and_composite_source (compositor, dst, + draw_func, mask_func, draw_closure, + src, src_x, src_y, + extents); + } else { + if (need_clip & NEED_CLIP_SURFACE) { + if (extents->is_bounded) { + status = clip_and_composite_with_mask (compositor, extents, + draw_func, mask_func, + draw_closure, + op, src, src_x, src_y); + } else { + status = clip_and_composite_combine (compositor, extents, + draw_func, draw_closure, + op, src, src_x, src_y); + } + } else { + status = draw_func (compositor, + dst, draw_closure, + op, src, src_x, src_y, + 0, 0, + &extents->bounded, + extents->clip); + } + } + cairo_surface_destroy (src); + +skip: + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) { + if (need_clip & NEED_CLIP_SURFACE) + status = fixup_unbounded_with_mask (compositor, extents); + else + status = fixup_unbounded (compositor, extents, NULL); + } + +error: + if (clip_region) + compositor->set_clip_region (dst, NULL); + + compositor->release (dst); + + return status; +} + +/* meta-ops */ + +typedef struct { + cairo_traps_t traps; + cairo_antialias_t antialias; +} composite_traps_info_t; + +static cairo_int_status_t +composite_traps (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, int src_y, + int dst_x, int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + composite_traps_info_t *info = closure; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + return compositor->composite_traps (dst, op, src, + src_x - dst_x, src_y - dst_y, + dst_x, dst_y, + extents, + info->antialias, &info->traps); +} + +typedef struct { + cairo_tristrip_t strip; + cairo_antialias_t antialias; +} composite_tristrip_info_t; + +static cairo_int_status_t +composite_tristrip (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, int src_y, + int dst_x, int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + composite_tristrip_info_t *info = closure; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + return compositor->composite_tristrip (dst, op, src, + src_x - dst_x, src_y - dst_y, + dst_x, dst_y, + extents, + info->antialias, &info->strip); +} + +static cairo_bool_t +is_recording_pattern (const cairo_pattern_t *pattern) +{ + cairo_surface_t *surface; + + if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) + return FALSE; + + surface = ((const cairo_surface_pattern_t *) pattern)->surface; + surface = _cairo_surface_get_source (surface, NULL); + return _cairo_surface_is_recording (surface); +} + +static cairo_surface_t * +recording_pattern_get_surface (const cairo_pattern_t *pattern) +{ + cairo_surface_t *surface; + + surface = ((const cairo_surface_pattern_t *) pattern)->surface; + return _cairo_surface_get_source (surface, NULL); +} + +static cairo_bool_t +recording_pattern_contains_sample (const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *sample) +{ + cairo_recording_surface_t *surface; + + if (! is_recording_pattern (pattern)) + return FALSE; + + if (pattern->extend == CAIRO_EXTEND_NONE) + return TRUE; + + surface = (cairo_recording_surface_t *) recording_pattern_get_surface (pattern); + if (surface->unbounded) + return TRUE; + + return _cairo_rectangle_contains_rectangle (&surface->extents, sample); +} + +static cairo_bool_t +op_reduces_to_source (cairo_composite_rectangles_t *extents) +{ + if (extents->op == CAIRO_OPERATOR_SOURCE) + return TRUE; + + if (extents->surface->is_clear) + return extents->op == CAIRO_OPERATOR_OVER || extents->op == CAIRO_OPERATOR_ADD; + + return FALSE; +} + +static cairo_status_t +composite_aligned_boxes (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + cairo_operator_t op = extents->op; + cairo_bool_t need_clip_mask = ! _cairo_clip_is_region (extents->clip); + cairo_bool_t op_is_source; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (need_clip_mask && + (! extents->is_bounded || extents->op == CAIRO_OPERATOR_SOURCE)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + op_is_source = op_reduces_to_source (extents); + + /* Are we just copying a recording surface? */ + if (! need_clip_mask && op_is_source && + recording_pattern_contains_sample (&extents->source_pattern.base, + &extents->source_sample_area)) + { + cairo_clip_t *recording_clip; + const cairo_pattern_t *source = &extents->source_pattern.base; + const cairo_matrix_t *m; + cairo_matrix_t matrix; + + /* XXX could also do tiling repeat modes... */ + + /* first clear the area about to be overwritten */ + if (! dst->is_clear) { + status = compositor->acquire (dst); + if (unlikely (status)) + return status; + + status = compositor->fill_boxes (dst, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + boxes); + compositor->release (dst); + if (unlikely (status)) + return status; + } + + m = &source->matrix; + if (_cairo_surface_has_device_transform (dst)) { + cairo_matrix_multiply (&matrix, + &source->matrix, + &dst->device_transform); + m = &matrix; + } + + recording_clip = _cairo_clip_from_boxes (boxes); + status = _cairo_recording_surface_replay_with_clip (recording_pattern_get_surface (source), + m, dst, recording_clip); + _cairo_clip_destroy (recording_clip); + + return status; + } + + status = compositor->acquire (dst); + if (unlikely (status)) + return status; + + if (! need_clip_mask && + (op == CAIRO_OPERATOR_CLEAR || + extents->source_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID)) + { + const cairo_color_t *color; + + if (op == CAIRO_OPERATOR_CLEAR) { + color = CAIRO_COLOR_TRANSPARENT; + } else { + color = &((cairo_solid_pattern_t *) &extents->source_pattern)->color; + if (op_is_source) + op = CAIRO_OPERATOR_SOURCE; + } + + status = compositor->fill_boxes (dst, op, color, boxes); + } + else + { + cairo_surface_t *src, *mask = NULL; + cairo_pattern_t *source = &extents->source_pattern.base; + int src_x, src_y; + int mask_x = 0, mask_y = 0; + + if (need_clip_mask) { + mask = traps_get_clip_surface (compositor, + extents, &extents->bounded); + if (unlikely (mask->status)) + return mask->status; + + mask_x = -extents->bounded.x; + mask_y = -extents->bounded.y; + + if (op == CAIRO_OPERATOR_CLEAR) { + source = NULL; + op = CAIRO_OPERATOR_DEST_OUT; + } + } else if (op_is_source) + op = CAIRO_OPERATOR_SOURCE; + + src = compositor->pattern_to_surface (dst, source, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (likely (src->status == CAIRO_STATUS_SUCCESS)) { + status = compositor->composite_boxes (dst, op, src, mask, + src_x, src_y, + mask_x, mask_y, + 0, 0, + boxes, &extents->bounded); + cairo_surface_destroy (src); + } else + status = src->status; + + cairo_surface_destroy (mask); + } + + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) + status = fixup_unbounded (compositor, extents, boxes); + + compositor->release (dst); + + return status; +} + +static cairo_status_t +upload_boxes (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_surface_t *dst = extents->surface; + const cairo_pattern_t *source = &extents->source_pattern.base; + cairo_surface_t *src; + cairo_rectangle_int_t limit; + cairo_int_status_t status; + int tx, ty; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + src = _cairo_pattern_get_source((cairo_surface_pattern_t *)source, + &limit); + if (!(src->type == CAIRO_SURFACE_TYPE_IMAGE || src->type == dst->type)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, &tx, &ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Check that the data is entirely within the image */ + if (extents->bounded.x + tx < limit.x || extents->bounded.y + ty < limit.y) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (extents->bounded.x + extents->bounded.width + tx > limit.x + limit.width || + extents->bounded.y + extents->bounded.height + ty > limit.y + limit.height) + return CAIRO_INT_STATUS_UNSUPPORTED; + + tx += limit.x; + ty += limit.y; + + if (src->type == CAIRO_SURFACE_TYPE_IMAGE) + status = compositor->draw_image_boxes (dst, + (cairo_image_surface_t *)src, + boxes, tx, ty); + else + status = compositor->copy_boxes (dst, src, boxes, &extents->bounded, + tx, ty); + + return status; +} + +static cairo_int_status_t +trim_extents_to_traps (cairo_composite_rectangles_t *extents, + cairo_traps_t *traps) +{ + cairo_box_t box; + + _cairo_traps_extents (traps, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_int_status_t +trim_extents_to_tristrip (cairo_composite_rectangles_t *extents, + cairo_tristrip_t *strip) +{ + cairo_box_t box; + + _cairo_tristrip_extents (strip, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_int_status_t +trim_extents_to_boxes (cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_box_t box; + + _cairo_boxes_extents (boxes, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_int_status_t +boxes_for_traps (cairo_boxes_t *boxes, + cairo_traps_t *traps, + cairo_antialias_t antialias) +{ + int i, j; + + /* first check that the traps are rectilinear */ + if (antialias == CAIRO_ANTIALIAS_NONE) { + for (i = 0; i < traps->num_traps; i++) { + const cairo_trapezoid_t *t = &traps->traps[i]; + if (_cairo_fixed_integer_round_down (t->left.p1.x) != + _cairo_fixed_integer_round_down (t->left.p2.x) || + _cairo_fixed_integer_round_down (t->right.p1.x) != + _cairo_fixed_integer_round_down (t->right.p2.x)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + } else { + for (i = 0; i < traps->num_traps; i++) { + const cairo_trapezoid_t *t = &traps->traps[i]; + if (t->left.p1.x != t->left.p2.x || t->right.p1.x != t->right.p2.x) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + + _cairo_boxes_init (boxes); + + boxes->chunks.base = (cairo_box_t *) traps->traps; + boxes->chunks.size = traps->num_traps; + + if (antialias != CAIRO_ANTIALIAS_NONE) { + for (i = j = 0; i < traps->num_traps; i++) { + /* Note the traps and boxes alias so we need to take the local copies first. */ + cairo_fixed_t x1 = traps->traps[i].left.p1.x; + cairo_fixed_t x2 = traps->traps[i].right.p1.x; + cairo_fixed_t y1 = traps->traps[i].top; + cairo_fixed_t y2 = traps->traps[i].bottom; + + if (x1 == x2 || y1 == y2) + continue; + + boxes->chunks.base[j].p1.x = x1; + boxes->chunks.base[j].p1.y = y1; + boxes->chunks.base[j].p2.x = x2; + boxes->chunks.base[j].p2.y = y2; + j++; + + if (boxes->is_pixel_aligned) { + boxes->is_pixel_aligned = + _cairo_fixed_is_integer (x1) && _cairo_fixed_is_integer (y1) && + _cairo_fixed_is_integer (x2) && _cairo_fixed_is_integer (y2); + } + } + } else { + boxes->is_pixel_aligned = TRUE; + + for (i = j = 0; i < traps->num_traps; i++) { + /* Note the traps and boxes alias so we need to take the local copies first. */ + cairo_fixed_t x1 = traps->traps[i].left.p1.x; + cairo_fixed_t x2 = traps->traps[i].right.p1.x; + cairo_fixed_t y1 = traps->traps[i].top; + cairo_fixed_t y2 = traps->traps[i].bottom; + + /* round down here to match Pixman's behavior when using traps. */ + boxes->chunks.base[j].p1.x = _cairo_fixed_round_down (x1); + boxes->chunks.base[j].p1.y = _cairo_fixed_round_down (y1); + boxes->chunks.base[j].p2.x = _cairo_fixed_round_down (x2); + boxes->chunks.base[j].p2.y = _cairo_fixed_round_down (y2); + j += (boxes->chunks.base[j].p1.x != boxes->chunks.base[j].p2.x && + boxes->chunks.base[j].p1.y != boxes->chunks.base[j].p2.y); + } + } + boxes->chunks.count = j; + boxes->num_boxes = j; + + return CAIRO_INT_STATUS_SUCCESS; +} + +static cairo_status_t +clip_and_composite_boxes (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes); + +static cairo_status_t +clip_and_composite_polygon (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_polygon_t *polygon, + cairo_antialias_t antialias, + cairo_fill_rule_t fill_rule, + cairo_bool_t curvy) +{ + composite_traps_info_t traps; + cairo_surface_t *dst = extents->surface; + cairo_bool_t clip_surface = ! _cairo_clip_is_region (extents->clip); + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (polygon->num_edges == 0) { + status = CAIRO_INT_STATUS_SUCCESS; + + if (! extents->is_bounded) { + cairo_region_t *clip_region = _cairo_clip_get_region (extents->clip); + + if (clip_region && + cairo_region_contains_rectangle (clip_region, + &extents->unbounded) == CAIRO_REGION_OVERLAP_IN) + clip_region = NULL; + + if (clip_region != NULL) { + status = compositor->set_clip_region (dst, clip_region); + if (unlikely (status)) + return status; + } + + if (clip_surface) + status = fixup_unbounded_with_mask (compositor, extents); + else + status = fixup_unbounded (compositor, extents, NULL); + + if (clip_region != NULL) + compositor->set_clip_region (dst, NULL); + } + + return status; + } + + if (extents->clip->path != NULL && extents->is_bounded) { + cairo_polygon_t clipper; + cairo_fill_rule_t clipper_fill_rule; + cairo_antialias_t clipper_antialias; + + status = _cairo_clip_get_polygon (extents->clip, + &clipper, + &clipper_fill_rule, + &clipper_antialias); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + if (clipper_antialias == antialias) { + status = _cairo_polygon_intersect (polygon, fill_rule, + &clipper, clipper_fill_rule); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t * clip = _cairo_clip_copy_region (extents->clip); + _cairo_clip_destroy (extents->clip); + extents->clip = clip; + + fill_rule = CAIRO_FILL_RULE_WINDING; + } + _cairo_polygon_fini (&clipper); + } + } + } + + if (antialias == CAIRO_ANTIALIAS_NONE && curvy) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + status = _cairo_rasterise_polygon_to_boxes (polygon, fill_rule, &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + assert (boxes.is_pixel_aligned); + status = clip_and_composite_boxes (compositor, extents, &boxes); + } + _cairo_boxes_fini (&boxes); + if ((status != CAIRO_INT_STATUS_UNSUPPORTED)) + return status; + } + + _cairo_traps_init (&traps.traps); + + if (antialias == CAIRO_ANTIALIAS_NONE && curvy) { + status = _cairo_rasterise_polygon_to_traps (polygon, fill_rule, antialias, &traps.traps); + } else { + status = _cairo_bentley_ottmann_tessellate_polygon (&traps.traps, polygon, fill_rule); + } + if (unlikely (status)) + goto CLEANUP_TRAPS; + + status = trim_extents_to_traps (extents, &traps.traps); + if (unlikely (status)) + goto CLEANUP_TRAPS; + + /* Use a fast path if the trapezoids consist of a set of boxes. */ + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (1) { + cairo_boxes_t boxes; + + status = boxes_for_traps (&boxes, &traps.traps, antialias); + if (status == CAIRO_INT_STATUS_SUCCESS) { + status = clip_and_composite_boxes (compositor, extents, &boxes); + /* XXX need to reconstruct the traps! */ + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + } + } + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + /* Otherwise render the trapezoids to a mask and composite in the usual + * fashion. + */ + unsigned int flags = 0; + + /* For unbounded operations, the X11 server will estimate the + * affected rectangle and apply the operation to that. However, + * there are cases where this is an overestimate (e.g. the + * clip-fill-{eo,nz}-unbounded test). + * + * The clip will trim that overestimate to our expectations. + */ + if (! extents->is_bounded) + flags |= FORCE_CLIP_REGION; + + traps.antialias = antialias; + status = clip_and_composite (compositor, extents, + composite_traps, NULL, &traps, + need_unbounded_clip (extents) | flags); + } + +CLEANUP_TRAPS: + _cairo_traps_fini (&traps.traps); + + return status; +} + +struct composite_opacity_info { + const cairo_traps_compositor_t *compositor; + uint8_t op; + cairo_surface_t *dst; + cairo_surface_t *src; + int src_x, src_y; + double opacity; +}; + +static void composite_opacity(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct composite_opacity_info *info = closure; + const cairo_traps_compositor_t *compositor = info->compositor; + cairo_surface_t *mask; + int mask_x, mask_y; + cairo_color_t color; + cairo_solid_pattern_t solid; + + _cairo_color_init_rgba (&color, 0, 0, 0, info->opacity * coverage); + _cairo_pattern_init_solid (&solid, &color); + mask = compositor->pattern_to_surface (info->dst, &solid.base, TRUE, + &_cairo_unbounded_rectangle, + &_cairo_unbounded_rectangle, + &mask_x, &mask_y); + if (likely (mask->status == CAIRO_STATUS_SUCCESS)) { + if (info->src) { + compositor->composite (info->dst, info->op, info->src, mask, + x + info->src_x, y + info->src_y, + mask_x, mask_y, + x, y, + w, h); + } else { + compositor->composite (info->dst, info->op, mask, NULL, + mask_x, mask_y, + 0, 0, + x, y, + w, h); + } + } + + cairo_surface_destroy (mask); +} + + +static cairo_int_status_t +composite_opacity_boxes (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + const cairo_solid_pattern_t *mask = closure; + struct composite_opacity_info info; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + info.compositor = compositor; + info.op = op; + info.dst = dst; + + info.src = src; + info.src_x = src_x; + info.src_y = src_y; + + info.opacity = mask->color.alpha / (double) 0xffff; + + /* XXX for lots of boxes create a clip region for the fully opaque areas */ + for (i = 0; i < clip->num_boxes; i++) + do_unaligned_box(composite_opacity, &info, + &clip->boxes[i], dst_x, dst_y); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_boxes (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + cairo_traps_t traps; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = _cairo_traps_init_boxes (&traps, closure); + if (unlikely (status)) + return status; + + status = compositor->composite_traps (dst, op, src, + src_x - dst_x, src_y - dst_y, + dst_x, dst_y, + extents, + CAIRO_ANTIALIAS_DEFAULT, &traps); + _cairo_traps_fini (&traps); + + return status; +} + +static cairo_status_t +clip_and_composite_boxes (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (boxes->num_boxes == 0 && extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + status = trim_extents_to_boxes (extents, boxes); + if (unlikely (status)) + return status; + + if (boxes->is_pixel_aligned && extents->clip->path == NULL && + extents->source_pattern.base.type == CAIRO_PATTERN_TYPE_SURFACE && + (op_reduces_to_source (extents) || + (extents->op == CAIRO_OPERATOR_OVER && + (extents->source_pattern.surface.surface->content & CAIRO_CONTENT_ALPHA) == 0))) + { + status = upload_boxes (compositor, extents, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + /* Can we reduce drawing through a clip-mask to simply drawing the clip? */ + if (extents->clip->path != NULL && extents->is_bounded) { + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + cairo_clip_t *clip; + + clip = _cairo_clip_copy (extents->clip); + clip = _cairo_clip_intersect_boxes (clip, boxes); + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + status = _cairo_clip_get_polygon (clip, &polygon, + &fill_rule, &antialias); + _cairo_clip_path_destroy (clip->path); + clip->path = NULL; + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t *saved_clip = extents->clip; + extents->clip = clip; + + status = clip_and_composite_polygon (compositor, extents, &polygon, + antialias, fill_rule, FALSE); + + clip = extents->clip; + extents->clip = saved_clip; + + _cairo_polygon_fini (&polygon); + } + _cairo_clip_destroy (clip); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + /* Use a fast path if the boxes are pixel aligned (or nearly aligned!) */ + if (boxes->is_pixel_aligned) { + status = composite_aligned_boxes (compositor, extents, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + return clip_and_composite (compositor, extents, + composite_boxes, NULL, boxes, + need_unbounded_clip (extents)); +} + +static cairo_int_status_t +composite_traps_as_boxes (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + composite_traps_info_t *info) +{ + cairo_boxes_t boxes; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (! _cairo_traps_to_boxes (&info->traps, info->antialias, &boxes)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return clip_and_composite_boxes (compositor, extents, &boxes); +} + +static cairo_int_status_t +clip_and_composite_traps (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + composite_traps_info_t *info, + unsigned flags) +{ + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = trim_extents_to_traps (extents, &info->traps); + if (unlikely (status != CAIRO_INT_STATUS_SUCCESS)) + return status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if ((flags & FORCE_CLIP_REGION) == 0) + status = composite_traps_as_boxes (compositor, extents, info); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + /* For unbounded operations, the X11 server will estimate the + * affected rectangle and apply the operation to that. However, + * there are cases where this is an overestimate (e.g. the + * clip-fill-{eo,nz}-unbounded test). + * + * The clip will trim that overestimate to our expectations. + */ + if (! extents->is_bounded) + flags |= FORCE_CLIP_REGION; + + status = clip_and_composite (compositor, extents, + composite_traps, NULL, info, + need_unbounded_clip (extents) | flags); + } + + return status; +} + +static cairo_int_status_t +clip_and_composite_tristrip (const cairo_traps_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + composite_tristrip_info_t *info) +{ + cairo_int_status_t status; + unsigned int flags = 0; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = trim_extents_to_tristrip (extents, &info->strip); + if (unlikely (status != CAIRO_INT_STATUS_SUCCESS)) + return status; + + if (! extents->is_bounded) + flags |= FORCE_CLIP_REGION; + + status = clip_and_composite (compositor, extents, + composite_tristrip, NULL, info, + need_unbounded_clip (extents) | flags); + + return status; +} + +struct composite_mask { + cairo_surface_t *mask; + int mask_x, mask_y; +}; + +static cairo_int_status_t +composite_mask (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + struct composite_mask *data = closure; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (src != NULL) { + compositor->composite (dst, op, src, data->mask, + extents->x + src_x, extents->y + src_y, + extents->x + data->mask_x, extents->y + data->mask_y, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + } else { + compositor->composite (dst, op, data->mask, NULL, + extents->x + data->mask_x, extents->y + data->mask_y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + } + + return CAIRO_STATUS_SUCCESS; +} + +struct composite_box_info { + const cairo_traps_compositor_t *compositor; + cairo_surface_t *dst; + cairo_surface_t *src; + int src_x, src_y; + uint8_t op; +}; + +static void composite_box(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct composite_box_info *info = closure; + const cairo_traps_compositor_t *compositor = info->compositor; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (! CAIRO_ALPHA_SHORT_IS_OPAQUE (coverage)) { + cairo_surface_t *mask; + cairo_color_t color; + cairo_solid_pattern_t solid; + int mask_x, mask_y; + + _cairo_color_init_rgba (&color, 0, 0, 0, coverage / (double)0xffff); + _cairo_pattern_init_solid (&solid, &color); + + mask = compositor->pattern_to_surface (info->dst, &solid.base, FALSE, + &_cairo_unbounded_rectangle, + &_cairo_unbounded_rectangle, + &mask_x, &mask_y); + + if (likely (mask->status == CAIRO_STATUS_SUCCESS)) { + compositor->composite (info->dst, info->op, info->src, mask, + x + info->src_x, y + info->src_y, + mask_x, mask_y, + x, y, + w, h); + } + + cairo_surface_destroy (mask); + } else { + compositor->composite (info->dst, info->op, info->src, NULL, + x + info->src_x, y + info->src_y, + 0, 0, + x, y, + w, h); + } +} + +static cairo_int_status_t +composite_mask_clip_boxes (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + struct composite_mask *data = closure; + struct composite_box_info info; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + info.compositor = compositor; + info.op = CAIRO_OPERATOR_SOURCE; + info.dst = dst; + info.src = data->mask; + info.src_x = data->mask_x; + info.src_y = data->mask_y; + + info.src_x += dst_x; + info.src_y += dst_y; + + for (i = 0; i < clip->num_boxes; i++) + do_unaligned_box(composite_box, &info, &clip->boxes[i], dst_x, dst_y); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_mask_clip (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + struct composite_mask *data = closure; + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + composite_traps_info_t info; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = _cairo_clip_get_polygon (clip, &polygon, + &fill_rule, &info.antialias); + if (unlikely (status)) + return status; + + _cairo_traps_init (&info.traps); + status = _cairo_bentley_ottmann_tessellate_polygon (&info.traps, + &polygon, + fill_rule); + _cairo_polygon_fini (&polygon); + if (unlikely (status)) + return status; + + status = composite_traps (compositor, dst, &info, + CAIRO_OPERATOR_SOURCE, + data->mask, + data->mask_x + dst_x, data->mask_y + dst_y, + dst_x, dst_y, + extents, NULL); + _cairo_traps_fini (&info.traps); + + return status; +} + +/* high-level compositor interface */ + +static cairo_int_status_t +_cairo_traps_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_traps_compositor_t *compositor = (cairo_traps_compositor_t*)_compositor; + cairo_boxes_t boxes; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + _cairo_clip_steal_boxes (extents->clip, &boxes); + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_clip_unsteal_boxes (extents->clip, &boxes); + + return status; +} + +static cairo_int_status_t +_cairo_traps_compositor_mask (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + const cairo_traps_compositor_t *compositor = (cairo_traps_compositor_t*)_compositor; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + if (extents->mask_pattern.base.type == CAIRO_PATTERN_TYPE_SOLID && + extents->clip->path == NULL) { + status = clip_and_composite (compositor, extents, + composite_opacity_boxes, + composite_opacity_boxes, + &extents->mask_pattern, + need_unbounded_clip (extents)); + } else { + struct composite_mask data; + + data.mask = compositor->pattern_to_surface (extents->surface, + &extents->mask_pattern.base, + TRUE, + &extents->bounded, + &extents->mask_sample_area, + &data.mask_x, + &data.mask_y); + if (unlikely (data.mask->status)) + return data.mask->status; + + status = clip_and_composite (compositor, extents, + composite_mask, + extents->clip->path ? composite_mask_clip : composite_mask_clip_boxes, + &data, need_bounded_clip (extents)); + + cairo_surface_destroy (data.mask); + } + + return status; +} + +static cairo_int_status_t +_cairo_traps_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + const cairo_traps_compositor_t *compositor = (cairo_traps_compositor_t *)_compositor; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, extents->clip); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + style, + ctm, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED && 0 && + _cairo_clip_is_region (extents->clip)) /* XXX */ + { + composite_tristrip_info_t info; + + info.antialias = antialias; + _cairo_tristrip_init_with_clip (&info.strip, extents->clip); + status = _cairo_path_fixed_stroke_to_tristrip (path, style, + ctm, ctm_inverse, + tolerance, + &info.strip); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_tristrip (compositor, extents, &info); + _cairo_tristrip_fini (&info.strip); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED && + path->has_curve_to && antialias == CAIRO_ANTIALIAS_NONE) { + cairo_polygon_t polygon; + + _cairo_polygon_init_with_clip (&polygon, extents->clip); + status = _cairo_path_fixed_stroke_to_polygon (path, style, + ctm, ctm_inverse, + tolerance, + &polygon); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_polygon (compositor, + extents, &polygon, + CAIRO_ANTIALIAS_NONE, + CAIRO_FILL_RULE_WINDING, + TRUE); + _cairo_polygon_fini (&polygon); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_int_status_t (*func) (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_traps_t *traps); + composite_traps_info_t info; + unsigned flags; + + if (antialias == CAIRO_ANTIALIAS_BEST || antialias == CAIRO_ANTIALIAS_GOOD) { + func = _cairo_path_fixed_stroke_polygon_to_traps; + flags = 0; + } else { + func = _cairo_path_fixed_stroke_to_traps; + flags = need_bounded_clip (extents) & ~NEED_CLIP_SURFACE; + } + + info.antialias = antialias; + _cairo_traps_init_with_clip (&info.traps, extents->clip); + status = func (path, style, ctm, ctm_inverse, tolerance, &info.traps); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_traps (compositor, extents, &info, flags); + _cairo_traps_fini (&info.traps); + } + + return status; +} + +static cairo_int_status_t +_cairo_traps_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + const cairo_traps_compositor_t *compositor = (cairo_traps_compositor_t *)_compositor; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, extents->clip); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite_boxes (compositor, extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + cairo_polygon_t polygon; + +#if 0 + if (extents->mask.width > extents->unbounded.width || + extents->mask.height > extents->unbounded.height) + { + cairo_box_t limits; + _cairo_box_from_rectangle (&limits, &extents->unbounded); + _cairo_polygon_init (&polygon, &limits, 1); + } + else + { + _cairo_polygon_init (&polygon, NULL, 0); + } + + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &polygon); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + status = _cairo_polygon_intersect_with_boxes (&polygon, &fill_rule, + extents->clip->boxes, + extents->clip->num_boxes); + } +#else + _cairo_polygon_init_with_clip (&polygon, extents->clip); + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &polygon); +#endif + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + status = clip_and_composite_polygon (compositor, extents, &polygon, + antialias, fill_rule, path->has_curve_to); + } + _cairo_polygon_fini (&polygon); + } + + return status; +} + +static cairo_int_status_t +composite_glyphs (const cairo_traps_compositor_t *compositor, + cairo_surface_t *dst, + void *closure, + cairo_operator_t op, + cairo_surface_t *src, + int src_x, int src_y, + int dst_x, int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + cairo_composite_glyphs_info_t *info = closure; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (op == CAIRO_OPERATOR_ADD && (dst->content & CAIRO_CONTENT_COLOR) == 0) + info->use_mask = 0; + + return compositor->composite_glyphs (dst, op, src, + src_x, src_y, + dst_x, dst_y, + info); +} + +static cairo_int_status_t +_cairo_traps_compositor_glyphs (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + const cairo_traps_compositor_t *compositor = (cairo_traps_compositor_t *)_compositor; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + status = compositor->check_composite (extents); + if (unlikely (status)) + return status; + + _cairo_scaled_font_freeze_cache (scaled_font); + status = compositor->check_composite_glyphs (extents, + scaled_font, glyphs, + &num_glyphs); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_composite_glyphs_info_t info; + + info.font = scaled_font; + info.glyphs = glyphs; + info.num_glyphs = num_glyphs; + info.use_mask = overlap || ! extents->is_bounded; + info.extents = extents->bounded; + + status = clip_and_composite (compositor, extents, + composite_glyphs, NULL, &info, + need_bounded_clip (extents) | FORCE_CLIP_REGION); + } + _cairo_scaled_font_thaw_cache (scaled_font); + + return status; +} + +void +_cairo_traps_compositor_init (cairo_traps_compositor_t *compositor, + const cairo_compositor_t *delegate) +{ + compositor->base.delegate = delegate; + + compositor->base.paint = _cairo_traps_compositor_paint; + compositor->base.mask = _cairo_traps_compositor_mask; + compositor->base.fill = _cairo_traps_compositor_fill; + compositor->base.stroke = _cairo_traps_compositor_stroke; + compositor->base.glyphs = _cairo_traps_compositor_glyphs; +} diff --git a/src/cairo-traps-private.h b/src/cairo-traps-private.h new file mode 100644 index 000000000..dcaf40d18 --- /dev/null +++ b/src/cairo-traps-private.h @@ -0,0 +1,143 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_TRAPS_PRIVATE_H +#define CAIRO_TRAPS_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" +#include "cairo-types-private.h" + +CAIRO_BEGIN_DECLS + +struct _cairo_traps { + cairo_status_t status; + + cairo_box_t bounds; + const cairo_box_t *limits; + int num_limits; + + unsigned int maybe_region : 1; /* hint: 0 implies that it cannot be */ + unsigned int has_intersections : 1; + unsigned int is_rectilinear : 1; + unsigned int is_rectangular : 1; + + int num_traps; + int traps_size; + cairo_trapezoid_t *traps; + cairo_trapezoid_t traps_embedded[16]; +}; + +/* cairo-traps.c */ +cairo_private void +_cairo_traps_init (cairo_traps_t *traps); + +cairo_private void +_cairo_traps_init_with_clip (cairo_traps_t *traps, + const cairo_clip_t *clip); + +cairo_private void +_cairo_traps_limit (cairo_traps_t *traps, + const cairo_box_t *boxes, + int num_boxes); + +cairo_private cairo_status_t +_cairo_traps_init_boxes (cairo_traps_t *traps, + const cairo_boxes_t *boxes); + +cairo_private void +_cairo_traps_clear (cairo_traps_t *traps); + +cairo_private void +_cairo_traps_fini (cairo_traps_t *traps); + +#define _cairo_traps_status(T) (T)->status + +cairo_private void +_cairo_traps_translate (cairo_traps_t *traps, int x, int y); + +cairo_private void +_cairo_traps_tessellate_triangle_with_edges (cairo_traps_t *traps, + const cairo_point_t t[3], + const cairo_point_t edges[4]); + +cairo_private void +_cairo_traps_tessellate_convex_quad (cairo_traps_t *traps, + const cairo_point_t q[4]); + +cairo_private cairo_status_t +_cairo_traps_tessellate_rectangle (cairo_traps_t *traps, + const cairo_point_t *top_left, + const cairo_point_t *bottom_right); + +cairo_private void +_cairo_traps_add_trap (cairo_traps_t *traps, + cairo_fixed_t top, cairo_fixed_t bottom, + const cairo_line_t *left, + const cairo_line_t *right); + +cairo_private int +_cairo_traps_contain (const cairo_traps_t *traps, + double x, double y); + +cairo_private void +_cairo_traps_extents (const cairo_traps_t *traps, + cairo_box_t *extents); + +cairo_private cairo_int_status_t +_cairo_traps_extract_region (cairo_traps_t *traps, + cairo_antialias_t antialias, + cairo_region_t **region); + +cairo_private cairo_bool_t +_cairo_traps_to_boxes (cairo_traps_t *traps, + cairo_antialias_t antialias, + cairo_boxes_t *boxes); + +cairo_private cairo_status_t +_cairo_traps_path (const cairo_traps_t *traps, + cairo_path_fixed_t *path); + +cairo_private cairo_int_status_t +_cairo_rasterise_polygon_to_traps (cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias, + cairo_traps_t *traps); + +CAIRO_END_DECLS + +#endif /* CAIRO_TRAPS_PRIVATE_H */ diff --git a/src/cairo-traps.c b/src/cairo-traps.c new file mode 100644 index 000000000..3aa0052f9 --- /dev/null +++ b/src/cairo-traps.c @@ -0,0 +1,1123 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* + * Copyright © 2002 Keith Packard + * Copyright © 2007 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith R. Packard + * Carl D. Worth + * + * 2002-07-15: Converted from XRenderCompositeDoublePoly to #cairo_trap_t. Carl D. Worth + */ + +#include "cairoint.h" + +#include "cairo-box-inline.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-line-private.h" +#include "cairo-region-private.h" +#include "cairo-slope-private.h" +#include "cairo-traps-private.h" +#include "cairo-spans-private.h" + +/* private functions */ + +void +_cairo_traps_init (cairo_traps_t *traps) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (traps, sizeof (cairo_traps_t))); + + traps->status = CAIRO_STATUS_SUCCESS; + + traps->maybe_region = 1; + traps->is_rectilinear = 0; + traps->is_rectangular = 0; + + traps->num_traps = 0; + + traps->traps_size = ARRAY_LENGTH (traps->traps_embedded); + traps->traps = traps->traps_embedded; + + traps->num_limits = 0; + traps->has_intersections = FALSE; +} + +void +_cairo_traps_limit (cairo_traps_t *traps, + const cairo_box_t *limits, + int num_limits) +{ + int i; + + traps->limits = limits; + traps->num_limits = num_limits; + + traps->bounds = limits[0]; + for (i = 1; i < num_limits; i++) + _cairo_box_add_box (&traps->bounds, &limits[i]); +} + +void +_cairo_traps_init_with_clip (cairo_traps_t *traps, + const cairo_clip_t *clip) +{ + _cairo_traps_init (traps); + if (clip) + _cairo_traps_limit (traps, clip->boxes, clip->num_boxes); +} + +void +_cairo_traps_clear (cairo_traps_t *traps) +{ + traps->status = CAIRO_STATUS_SUCCESS; + + traps->maybe_region = 1; + traps->is_rectilinear = 0; + traps->is_rectangular = 0; + + traps->num_traps = 0; + traps->has_intersections = FALSE; +} + +void +_cairo_traps_fini (cairo_traps_t *traps) +{ + if (traps->traps != traps->traps_embedded) + free (traps->traps); + + VG (VALGRIND_MAKE_MEM_NOACCESS (traps, sizeof (cairo_traps_t))); +} + +/* make room for at least one more trap */ +static cairo_bool_t +_cairo_traps_grow (cairo_traps_t *traps) +{ + cairo_trapezoid_t *new_traps; + int new_size = 4 * traps->traps_size; + + if (CAIRO_INJECT_FAULT ()) { + traps->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + if (traps->traps == traps->traps_embedded) { + new_traps = _cairo_malloc_ab (new_size, sizeof (cairo_trapezoid_t)); + if (new_traps != NULL) + memcpy (new_traps, traps->traps, sizeof (traps->traps_embedded)); + } else { + new_traps = _cairo_realloc_ab (traps->traps, + new_size, sizeof (cairo_trapezoid_t)); + } + + if (unlikely (new_traps == NULL)) { + traps->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + traps->traps = new_traps; + traps->traps_size = new_size; + return TRUE; +} + +void +_cairo_traps_add_trap (cairo_traps_t *traps, + cairo_fixed_t top, cairo_fixed_t bottom, + const cairo_line_t *left, + const cairo_line_t *right) +{ + cairo_trapezoid_t *trap; + + assert (left->p1.y != left->p2.y); + assert (right->p1.y != right->p2.y); + assert (bottom > top); + + if (unlikely (traps->num_traps == traps->traps_size)) { + if (unlikely (! _cairo_traps_grow (traps))) + return; + } + + trap = &traps->traps[traps->num_traps++]; + trap->top = top; + trap->bottom = bottom; + trap->left = *left; + trap->right = *right; +} + +static void +_cairo_traps_add_clipped_trap (cairo_traps_t *traps, + cairo_fixed_t _top, cairo_fixed_t _bottom, + const cairo_line_t *_left, + const cairo_line_t *_right) +{ + /* Note: With the goofy trapezoid specification, (where an + * arbitrary two points on the lines can specified for the left + * and right edges), these limit checks would not work in + * general. For example, one can imagine a trapezoid entirely + * within the limits, but with two points used to specify the left + * edge entirely to the right of the limits. Fortunately, for our + * purposes, cairo will never generate such a crazy + * trapezoid. Instead, cairo always uses for its points the + * extreme positions of the edge that are visible on at least some + * trapezoid. With this constraint, it's impossible for both + * points to be outside the limits while the relevant edge is + * entirely inside the limits. + */ + if (traps->num_limits) { + const cairo_box_t *b = &traps->bounds; + cairo_fixed_t top = _top, bottom = _bottom; + cairo_line_t left = *_left, right = *_right; + + /* Trivially reject if trapezoid is entirely to the right or + * to the left of the limits. */ + if (left.p1.x >= b->p2.x && left.p2.x >= b->p2.x) + return; + + if (right.p1.x <= b->p1.x && right.p2.x <= b->p1.x) + return; + + /* And reject if the trapezoid is entirely above or below */ + if (top >= b->p2.y || bottom <= b->p1.y) + return; + + /* Otherwise, clip the trapezoid to the limits. We only clip + * where an edge is entirely outside the limits. If we wanted + * to be more clever, we could handle cases where a trapezoid + * edge intersects the edge of the limits, but that would + * require slicing this trapezoid into multiple trapezoids, + * and I'm not sure the effort would be worth it. */ + if (top < b->p1.y) + top = b->p1.y; + + if (bottom > b->p2.y) + bottom = b->p2.y; + + if (left.p1.x <= b->p1.x && left.p2.x <= b->p1.x) + left.p1.x = left.p2.x = b->p1.x; + + if (right.p1.x >= b->p2.x && right.p2.x >= b->p2.x) + right.p1.x = right.p2.x = b->p2.x; + + /* Trivial discards for empty trapezoids that are likely to + * be produced by our tessellators (most notably convex_quad + * when given a simple rectangle). + */ + if (top >= bottom) + return; + + /* cheap colinearity check */ + if (right.p1.x <= left.p1.x && right.p1.y == left.p1.y && + right.p2.x <= left.p2.x && right.p2.y == left.p2.y) + return; + + _cairo_traps_add_trap (traps, top, bottom, &left, &right); + } else + _cairo_traps_add_trap (traps, _top, _bottom, _left, _right); +} + +static int +_compare_point_fixed_by_y (const void *av, const void *bv) +{ + const cairo_point_t *a = av, *b = bv; + int ret = a->y - b->y; + if (ret == 0) + ret = a->x - b->x; + return ret; +} + +void +_cairo_traps_tessellate_convex_quad (cairo_traps_t *traps, + const cairo_point_t q[4]) +{ + int a, b, c, d; + int i; + cairo_slope_t ab, ad; + cairo_bool_t b_left_of_d; + cairo_line_t left; + cairo_line_t right; + + /* Choose a as a point with minimal y */ + a = 0; + for (i = 1; i < 4; i++) + if (_compare_point_fixed_by_y (&q[i], &q[a]) < 0) + a = i; + + /* b and d are adjacent to a, while c is opposite */ + b = (a + 1) % 4; + c = (a + 2) % 4; + d = (a + 3) % 4; + + /* Choose between b and d so that b.y is less than d.y */ + if (_compare_point_fixed_by_y (&q[d], &q[b]) < 0) { + b = (a + 3) % 4; + d = (a + 1) % 4; + } + + /* Without freedom left to choose anything else, we have four + * cases to tessellate. + * + * First, we have to determine the Y-axis sort of the four + * vertices, (either abcd or abdc). After that we need to detemine + * which edges will be "left" and which will be "right" in the + * resulting trapezoids. This can be determined by computing a + * slope comparison of ab and ad to determine if b is left of d or + * not. + * + * Note that "left of" here is in the sense of which edges should + * be the left vs. right edges of the trapezoid. In particular, b + * left of d does *not* mean that b.x is less than d.x. + * + * This should hopefully be made clear in the lame ASCII art + * below. Since the same slope comparison is used in all cases, we + * compute it before testing for the Y-value sort. */ + + /* Note: If a == b then the ab slope doesn't give us any + * information. In that case, we can replace it with the ac (or + * equivalenly the bc) slope which gives us exactly the same + * information we need. At worst the names of the identifiers ab + * and b_left_of_d are inaccurate in this case, (would be ac, and + * c_left_of_d). */ + if (q[a].x == q[b].x && q[a].y == q[b].y) + _cairo_slope_init (&ab, &q[a], &q[c]); + else + _cairo_slope_init (&ab, &q[a], &q[b]); + + _cairo_slope_init (&ad, &q[a], &q[d]); + + b_left_of_d = _cairo_slope_compare (&ab, &ad) > 0; + + if (q[c].y <= q[d].y) { + if (b_left_of_d) { + /* Y-sort is abcd and b is left of d, (slope(ab) > slope (ad)) + * + * top bot left right + * _a a a + * / / /| |\ a.y b.y ab ad + * b / b | b \ + * / / | | \ \ b.y c.y bc ad + * c / c | c \ + * | / \| \ \ c.y d.y cd ad + * d d d + */ + left.p1 = q[a]; left.p2 = q[b]; + right.p1 = q[a]; right.p2 = q[d]; + _cairo_traps_add_clipped_trap (traps, q[a].y, q[b].y, &left, &right); + left.p1 = q[b]; left.p2 = q[c]; + _cairo_traps_add_clipped_trap (traps, q[b].y, q[c].y, &left, &right); + left.p1 = q[c]; left.p2 = q[d]; + _cairo_traps_add_clipped_trap (traps, q[c].y, q[d].y, &left, &right); + } else { + /* Y-sort is abcd and b is right of d, (slope(ab) <= slope (ad)) + * + * a a a_ + * /| |\ \ \ a.y b.y ad ab + * / b | b \ b + * / / | | \ \ b.y c.y ad bc + * / c | c \ c + * / / |/ \ | c.y d.y ad cd + * d d d + */ + left.p1 = q[a]; left.p2 = q[d]; + right.p1 = q[a]; right.p2 = q[b]; + _cairo_traps_add_clipped_trap (traps, q[a].y, q[b].y, &left, &right); + right.p1 = q[b]; right.p2 = q[c]; + _cairo_traps_add_clipped_trap (traps, q[b].y, q[c].y, &left, &right); + right.p1 = q[c]; right.p2 = q[d]; + _cairo_traps_add_clipped_trap (traps, q[c].y, q[d].y, &left, &right); + } + } else { + if (b_left_of_d) { + /* Y-sort is abdc and b is left of d, (slope (ab) > slope (ad)) + * + * a a a + * // / \ |\ a.y b.y ab ad + * /b/ b \ b \ + * / / \ \ \ \ b.y d.y bc ad + * /d/ \ d \ d + * // \ / \| d.y c.y bc dc + * c c c + */ + left.p1 = q[a]; left.p2 = q[b]; + right.p1 = q[a]; right.p2 = q[d]; + _cairo_traps_add_clipped_trap (traps, q[a].y, q[b].y, &left, &right); + left.p1 = q[b]; left.p2 = q[c]; + _cairo_traps_add_clipped_trap (traps, q[b].y, q[d].y, &left, &right); + right.p1 = q[d]; right.p2 = q[c]; + _cairo_traps_add_clipped_trap (traps, q[d].y, q[c].y, &left, &right); + } else { + /* Y-sort is abdc and b is right of d, (slope (ab) <= slope (ad)) + * + * a a a + * /| / \ \\ a.y b.y ad ab + * / b / b \b\ + * / / / / \ \ b.y d.y ad bc + * d / d / \d\ + * |/ \ / \\ d.y c.y dc bc + * c c c + */ + left.p1 = q[a]; left.p2 = q[d]; + right.p1 = q[a]; right.p2 = q[b]; + _cairo_traps_add_clipped_trap (traps, q[a].y, q[b].y, &left, &right); + right.p1 = q[b]; right.p2 = q[c]; + _cairo_traps_add_clipped_trap (traps, q[b].y, q[d].y, &left, &right); + left.p1 = q[d]; left.p2 = q[c]; + _cairo_traps_add_clipped_trap (traps, q[d].y, q[c].y, &left, &right); + } + } +} + +static void add_tri (cairo_traps_t *traps, + int y1, int y2, + const cairo_line_t *left, + const cairo_line_t *right) +{ + if (y2 < y1) { + int tmp = y1; + y1 = y2; + y2 = tmp; + } + + if (cairo_lines_compare_at_y (left, right, y1) > 0) { + const cairo_line_t *tmp = left; + left = right; + right = tmp; + } + + _cairo_traps_add_clipped_trap (traps, y1, y2, left, right); +} + +void +_cairo_traps_tessellate_triangle_with_edges (cairo_traps_t *traps, + const cairo_point_t t[3], + const cairo_point_t edges[4]) +{ + cairo_line_t lines[3]; + + if (edges[0].y <= edges[1].y) { + lines[0].p1 = edges[0]; + lines[0].p2 = edges[1]; + } else { + lines[0].p1 = edges[1]; + lines[0].p2 = edges[0]; + } + + if (edges[2].y <= edges[3].y) { + lines[1].p1 = edges[2]; + lines[1].p2 = edges[3]; + } else { + lines[1].p1 = edges[3]; + lines[1].p2 = edges[2]; + } + + if (t[1].y == t[2].y) { + add_tri (traps, t[0].y, t[1].y, &lines[0], &lines[1]); + return; + } + + if (t[1].y <= t[2].y) { + lines[2].p1 = t[1]; + lines[2].p2 = t[2]; + } else { + lines[2].p1 = t[2]; + lines[2].p2 = t[1]; + } + + if (((t[1].y - t[0].y) < 0) ^ ((t[2].y - t[0].y) < 0)) { + add_tri (traps, t[0].y, t[1].y, &lines[0], &lines[2]); + add_tri (traps, t[0].y, t[2].y, &lines[1], &lines[2]); + } else if (abs(t[1].y - t[0].y) < abs(t[2].y - t[0].y)) { + add_tri (traps, t[0].y, t[1].y, &lines[0], &lines[1]); + add_tri (traps, t[1].y, t[2].y, &lines[2], &lines[1]); + } else { + add_tri (traps, t[0].y, t[2].y, &lines[1], &lines[0]); + add_tri (traps, t[1].y, t[2].y, &lines[2], &lines[0]); + } +} + +/** + * _cairo_traps_init_boxes: + * @traps: a #cairo_traps_t + * @box: an array box that will each be converted to a single trapezoid + * to store in @traps. + * + * Initializes a #cairo_traps_t to contain an array of rectangular + * trapezoids. + **/ +cairo_status_t +_cairo_traps_init_boxes (cairo_traps_t *traps, + const cairo_boxes_t *boxes) +{ + cairo_trapezoid_t *trap; + const struct _cairo_boxes_chunk *chunk; + + _cairo_traps_init (traps); + + while (traps->traps_size < boxes->num_boxes) { + if (unlikely (! _cairo_traps_grow (traps))) { + _cairo_traps_fini (traps); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + traps->num_traps = boxes->num_boxes; + traps->is_rectilinear = TRUE; + traps->is_rectangular = TRUE; + traps->maybe_region = boxes->is_pixel_aligned; + + trap = &traps->traps[0]; + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box; + int i; + + box = chunk->base; + for (i = 0; i < chunk->count; i++) { + trap->top = box->p1.y; + trap->bottom = box->p2.y; + + trap->left.p1 = box->p1; + trap->left.p2.x = box->p1.x; + trap->left.p2.y = box->p2.y; + + trap->right.p1.x = box->p2.x; + trap->right.p1.y = box->p1.y; + trap->right.p2 = box->p2; + + box++, trap++; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_traps_tessellate_rectangle (cairo_traps_t *traps, + const cairo_point_t *top_left, + const cairo_point_t *bottom_right) +{ + cairo_line_t left; + cairo_line_t right; + cairo_fixed_t top, bottom; + + if (top_left->y == bottom_right->y) + return CAIRO_STATUS_SUCCESS; + + if (top_left->x == bottom_right->x) + return CAIRO_STATUS_SUCCESS; + + left.p1.x = left.p2.x = top_left->x; + left.p1.y = right.p1.y = top_left->y; + right.p1.x = right.p2.x = bottom_right->x; + left.p2.y = right.p2.y = bottom_right->y; + + top = top_left->y; + bottom = bottom_right->y; + + if (traps->num_limits) { + cairo_bool_t reversed; + int n; + + if (top >= traps->bounds.p2.y || bottom <= traps->bounds.p1.y) + return CAIRO_STATUS_SUCCESS; + + /* support counter-clockwise winding for rectangular tessellation */ + reversed = top_left->x > bottom_right->x; + if (reversed) { + right.p1.x = right.p2.x = top_left->x; + left.p1.x = left.p2.x = bottom_right->x; + } + + if (left.p1.x >= traps->bounds.p2.x || right.p1.x <= traps->bounds.p1.x) + return CAIRO_STATUS_SUCCESS; + + for (n = 0; n < traps->num_limits; n++) { + const cairo_box_t *limits = &traps->limits[n]; + cairo_line_t _left, _right; + cairo_fixed_t _top, _bottom; + + if (top >= limits->p2.y) + continue; + if (bottom <= limits->p1.y) + continue; + + /* Trivially reject if trapezoid is entirely to the right or + * to the left of the limits. */ + if (left.p1.x >= limits->p2.x) + continue; + if (right.p1.x <= limits->p1.x) + continue; + + /* Otherwise, clip the trapezoid to the limits. */ + _top = top; + if (_top < limits->p1.y) + _top = limits->p1.y; + + _bottom = bottom; + if (_bottom > limits->p2.y) + _bottom = limits->p2.y; + + if (_bottom <= _top) + continue; + + _left = left; + if (_left.p1.x < limits->p1.x) { + _left.p1.x = limits->p1.x; + _left.p1.y = limits->p1.y; + _left.p2.x = limits->p1.x; + _left.p2.y = limits->p2.y; + } + + _right = right; + if (_right.p1.x > limits->p2.x) { + _right.p1.x = limits->p2.x; + _right.p1.y = limits->p1.y; + _right.p2.x = limits->p2.x; + _right.p2.y = limits->p2.y; + } + + if (left.p1.x >= right.p1.x) + continue; + + if (reversed) + _cairo_traps_add_trap (traps, _top, _bottom, &_right, &_left); + else + _cairo_traps_add_trap (traps, _top, _bottom, &_left, &_right); + } + } else { + _cairo_traps_add_trap (traps, top, bottom, &left, &right); + } + + return traps->status; +} + +void +_cairo_traps_translate (cairo_traps_t *traps, int x, int y) +{ + cairo_fixed_t xoff, yoff; + cairo_trapezoid_t *t; + int i; + + /* Ugh. The cairo_composite/(Render) interface doesn't allow + an offset for the trapezoids. Need to manually shift all + the coordinates to align with the offset origin of the + intermediate surface. */ + + xoff = _cairo_fixed_from_int (x); + yoff = _cairo_fixed_from_int (y); + + for (i = 0, t = traps->traps; i < traps->num_traps; i++, t++) { + t->top += yoff; + t->bottom += yoff; + t->left.p1.x += xoff; + t->left.p1.y += yoff; + t->left.p2.x += xoff; + t->left.p2.y += yoff; + t->right.p1.x += xoff; + t->right.p1.y += yoff; + t->right.p2.x += xoff; + t->right.p2.y += yoff; + } +} + +void +_cairo_trapezoid_array_translate_and_scale (cairo_trapezoid_t *offset_traps, + cairo_trapezoid_t *src_traps, + int num_traps, + double tx, double ty, + double sx, double sy) +{ + int i; + cairo_fixed_t xoff = _cairo_fixed_from_double (tx); + cairo_fixed_t yoff = _cairo_fixed_from_double (ty); + + if (sx == 1.0 && sy == 1.0) { + for (i = 0; i < num_traps; i++) { + offset_traps[i].top = src_traps[i].top + yoff; + offset_traps[i].bottom = src_traps[i].bottom + yoff; + offset_traps[i].left.p1.x = src_traps[i].left.p1.x + xoff; + offset_traps[i].left.p1.y = src_traps[i].left.p1.y + yoff; + offset_traps[i].left.p2.x = src_traps[i].left.p2.x + xoff; + offset_traps[i].left.p2.y = src_traps[i].left.p2.y + yoff; + offset_traps[i].right.p1.x = src_traps[i].right.p1.x + xoff; + offset_traps[i].right.p1.y = src_traps[i].right.p1.y + yoff; + offset_traps[i].right.p2.x = src_traps[i].right.p2.x + xoff; + offset_traps[i].right.p2.y = src_traps[i].right.p2.y + yoff; + } + } else { + cairo_fixed_t xsc = _cairo_fixed_from_double (sx); + cairo_fixed_t ysc = _cairo_fixed_from_double (sy); + + for (i = 0; i < num_traps; i++) { + offset_traps[i].top = _cairo_fixed_mul (src_traps[i].top + yoff, ysc); + offset_traps[i].bottom = _cairo_fixed_mul (src_traps[i].bottom + yoff, ysc); + offset_traps[i].left.p1.x = _cairo_fixed_mul (src_traps[i].left.p1.x + xoff, xsc); + offset_traps[i].left.p1.y = _cairo_fixed_mul (src_traps[i].left.p1.y + yoff, ysc); + offset_traps[i].left.p2.x = _cairo_fixed_mul (src_traps[i].left.p2.x + xoff, xsc); + offset_traps[i].left.p2.y = _cairo_fixed_mul (src_traps[i].left.p2.y + yoff, ysc); + offset_traps[i].right.p1.x = _cairo_fixed_mul (src_traps[i].right.p1.x + xoff, xsc); + offset_traps[i].right.p1.y = _cairo_fixed_mul (src_traps[i].right.p1.y + yoff, ysc); + offset_traps[i].right.p2.x = _cairo_fixed_mul (src_traps[i].right.p2.x + xoff, xsc); + offset_traps[i].right.p2.y = _cairo_fixed_mul (src_traps[i].right.p2.y + yoff, ysc); + } + } +} + +static cairo_bool_t +_cairo_trap_contains (cairo_trapezoid_t *t, cairo_point_t *pt) +{ + cairo_slope_t slope_left, slope_pt, slope_right; + + if (t->top > pt->y) + return FALSE; + if (t->bottom < pt->y) + return FALSE; + + _cairo_slope_init (&slope_left, &t->left.p1, &t->left.p2); + _cairo_slope_init (&slope_pt, &t->left.p1, pt); + + if (_cairo_slope_compare (&slope_left, &slope_pt) < 0) + return FALSE; + + _cairo_slope_init (&slope_right, &t->right.p1, &t->right.p2); + _cairo_slope_init (&slope_pt, &t->right.p1, pt); + + if (_cairo_slope_compare (&slope_pt, &slope_right) < 0) + return FALSE; + + return TRUE; +} + +cairo_bool_t +_cairo_traps_contain (const cairo_traps_t *traps, + double x, double y) +{ + int i; + cairo_point_t point; + + point.x = _cairo_fixed_from_double (x); + point.y = _cairo_fixed_from_double (y); + + for (i = 0; i < traps->num_traps; i++) { + if (_cairo_trap_contains (&traps->traps[i], &point)) + return TRUE; + } + + return FALSE; +} + +static cairo_fixed_t +_line_compute_intersection_x_for_y (const cairo_line_t *line, + cairo_fixed_t y) +{ + return _cairo_edge_compute_intersection_x_for_y (&line->p1, &line->p2, y); +} + +void +_cairo_traps_extents (const cairo_traps_t *traps, + cairo_box_t *extents) +{ + int i; + + if (traps->num_traps == 0) { + extents->p1.x = extents->p1.y = 0; + extents->p2.x = extents->p2.y = 0; + return; + } + + extents->p1.x = extents->p1.y = INT32_MAX; + extents->p2.x = extents->p2.y = INT32_MIN; + + for (i = 0; i < traps->num_traps; i++) { + const cairo_trapezoid_t *trap = &traps->traps[i]; + + if (trap->top < extents->p1.y) + extents->p1.y = trap->top; + if (trap->bottom > extents->p2.y) + extents->p2.y = trap->bottom; + + if (trap->left.p1.x < extents->p1.x) { + cairo_fixed_t x = trap->left.p1.x; + if (trap->top != trap->left.p1.y) { + x = _line_compute_intersection_x_for_y (&trap->left, + trap->top); + if (x < extents->p1.x) + extents->p1.x = x; + } else + extents->p1.x = x; + } + if (trap->left.p2.x < extents->p1.x) { + cairo_fixed_t x = trap->left.p2.x; + if (trap->bottom != trap->left.p2.y) { + x = _line_compute_intersection_x_for_y (&trap->left, + trap->bottom); + if (x < extents->p1.x) + extents->p1.x = x; + } else + extents->p1.x = x; + } + + if (trap->right.p1.x > extents->p2.x) { + cairo_fixed_t x = trap->right.p1.x; + if (trap->top != trap->right.p1.y) { + x = _line_compute_intersection_x_for_y (&trap->right, + trap->top); + if (x > extents->p2.x) + extents->p2.x = x; + } else + extents->p2.x = x; + } + if (trap->right.p2.x > extents->p2.x) { + cairo_fixed_t x = trap->right.p2.x; + if (trap->bottom != trap->right.p2.y) { + x = _line_compute_intersection_x_for_y (&trap->right, + trap->bottom); + if (x > extents->p2.x) + extents->p2.x = x; + } else + extents->p2.x = x; + } + } +} + +static cairo_bool_t +_mono_edge_is_vertical (const cairo_line_t *line) +{ + return _cairo_fixed_integer_round_down (line->p1.x) == _cairo_fixed_integer_round_down (line->p2.x); +} + +static cairo_bool_t +_traps_are_pixel_aligned (cairo_traps_t *traps, + cairo_antialias_t antialias) +{ + int i; + + if (antialias == CAIRO_ANTIALIAS_NONE) { + for (i = 0; i < traps->num_traps; i++) { + if (! _mono_edge_is_vertical (&traps->traps[i].left) || + ! _mono_edge_is_vertical (&traps->traps[i].right)) + { + traps->maybe_region = FALSE; + return FALSE; + } + } + } else { + for (i = 0; i < traps->num_traps; i++) { + if (traps->traps[i].left.p1.x != traps->traps[i].left.p2.x || + traps->traps[i].right.p1.x != traps->traps[i].right.p2.x || + ! _cairo_fixed_is_integer (traps->traps[i].top) || + ! _cairo_fixed_is_integer (traps->traps[i].bottom) || + ! _cairo_fixed_is_integer (traps->traps[i].left.p1.x) || + ! _cairo_fixed_is_integer (traps->traps[i].right.p1.x)) + { + traps->maybe_region = FALSE; + return FALSE; + } + } + } + + return TRUE; +} + +/** + * _cairo_traps_extract_region: + * @traps: a #cairo_traps_t + * @region: a #cairo_region_t + * + * Determines if a set of trapezoids are exactly representable as a + * cairo region. If so, the passed-in region is initialized to + * the area representing the given traps. It should be finalized + * with cairo_region_fini(). If not, %CAIRO_INT_STATUS_UNSUPPORTED + * is returned. + * + * Return value: %CAIRO_STATUS_SUCCESS, %CAIRO_INT_STATUS_UNSUPPORTED + * or %CAIRO_STATUS_NO_MEMORY + **/ +cairo_int_status_t +_cairo_traps_extract_region (cairo_traps_t *traps, + cairo_antialias_t antialias, + cairo_region_t **region) +{ + cairo_rectangle_int_t stack_rects[CAIRO_STACK_ARRAY_LENGTH (cairo_rectangle_int_t)]; + cairo_rectangle_int_t *rects = stack_rects; + cairo_int_status_t status; + int i, rect_count; + + /* we only treat this a hint... */ + if (antialias != CAIRO_ANTIALIAS_NONE && ! traps->maybe_region) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _traps_are_pixel_aligned (traps, antialias)) { + traps->maybe_region = FALSE; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (traps->num_traps > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (traps->num_traps, sizeof (cairo_rectangle_int_t)); + + if (unlikely (rects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + rect_count = 0; + for (i = 0; i < traps->num_traps; i++) { + int x1, y1, x2, y2; + + if (antialias == CAIRO_ANTIALIAS_NONE) { + x1 = _cairo_fixed_integer_round_down (traps->traps[i].left.p1.x); + y1 = _cairo_fixed_integer_round_down (traps->traps[i].top); + x2 = _cairo_fixed_integer_round_down (traps->traps[i].right.p1.x); + y2 = _cairo_fixed_integer_round_down (traps->traps[i].bottom); + } else { + x1 = _cairo_fixed_integer_part (traps->traps[i].left.p1.x); + y1 = _cairo_fixed_integer_part (traps->traps[i].top); + x2 = _cairo_fixed_integer_part (traps->traps[i].right.p1.x); + y2 = _cairo_fixed_integer_part (traps->traps[i].bottom); + } + + if (x2 > x1 && y2 > y1) { + rects[rect_count].x = x1; + rects[rect_count].y = y1; + rects[rect_count].width = x2 - x1; + rects[rect_count].height = y2 - y1; + rect_count++; + } + } + + + *region = cairo_region_create_rectangles (rects, rect_count); + status = (*region)->status; + + if (rects != stack_rects) + free (rects); + + return status; +} + +cairo_bool_t +_cairo_traps_to_boxes (cairo_traps_t *traps, + cairo_antialias_t antialias, + cairo_boxes_t *boxes) +{ + int i; + + for (i = 0; i < traps->num_traps; i++) { + if (traps->traps[i].left.p1.x != traps->traps[i].left.p2.x || + traps->traps[i].right.p1.x != traps->traps[i].right.p2.x) + return FALSE; + } + + _cairo_boxes_init (boxes); + + boxes->num_boxes = traps->num_traps; + boxes->chunks.base = (cairo_box_t *) traps->traps; + boxes->chunks.count = traps->num_traps; + boxes->chunks.size = traps->num_traps; + + if (antialias != CAIRO_ANTIALIAS_NONE) { + for (i = 0; i < traps->num_traps; i++) { + /* Note the traps and boxes alias so we need to take the local copies first. */ + cairo_fixed_t x1 = traps->traps[i].left.p1.x; + cairo_fixed_t x2 = traps->traps[i].right.p1.x; + cairo_fixed_t y1 = traps->traps[i].top; + cairo_fixed_t y2 = traps->traps[i].bottom; + + boxes->chunks.base[i].p1.x = x1; + boxes->chunks.base[i].p1.y = y1; + boxes->chunks.base[i].p2.x = x2; + boxes->chunks.base[i].p2.y = y2; + + if (boxes->is_pixel_aligned) { + boxes->is_pixel_aligned = + _cairo_fixed_is_integer (x1) && _cairo_fixed_is_integer (y1) && + _cairo_fixed_is_integer (x2) && _cairo_fixed_is_integer (y2); + } + } + } else { + boxes->is_pixel_aligned = TRUE; + + for (i = 0; i < traps->num_traps; i++) { + /* Note the traps and boxes alias so we need to take the local copies first. */ + cairo_fixed_t x1 = traps->traps[i].left.p1.x; + cairo_fixed_t x2 = traps->traps[i].right.p1.x; + cairo_fixed_t y1 = traps->traps[i].top; + cairo_fixed_t y2 = traps->traps[i].bottom; + + /* round down here to match Pixman's behavior when using traps. */ + boxes->chunks.base[i].p1.x = _cairo_fixed_round_down (x1); + boxes->chunks.base[i].p1.y = _cairo_fixed_round_down (y1); + boxes->chunks.base[i].p2.x = _cairo_fixed_round_down (x2); + boxes->chunks.base[i].p2.y = _cairo_fixed_round_down (y2); + } + } + + return TRUE; +} + +/* moves trap points such that they become the actual corners of the trapezoid */ +static void +_sanitize_trap (cairo_trapezoid_t *t) +{ + cairo_trapezoid_t s = *t; + +#define FIX(lr, tb, p) \ + if (t->lr.p.y != t->tb) { \ + t->lr.p.x = s.lr.p2.x + _cairo_fixed_mul_div_floor (s.lr.p1.x - s.lr.p2.x, s.tb - s.lr.p2.y, s.lr.p1.y - s.lr.p2.y); \ + t->lr.p.y = s.tb; \ + } + FIX (left, top, p1); + FIX (left, bottom, p2); + FIX (right, top, p1); + FIX (right, bottom, p2); +} + +cairo_private cairo_status_t +_cairo_traps_path (const cairo_traps_t *traps, + cairo_path_fixed_t *path) +{ + int i; + + for (i = 0; i < traps->num_traps; i++) { + cairo_status_t status; + cairo_trapezoid_t trap = traps->traps[i]; + + if (trap.top == trap.bottom) + continue; + + _sanitize_trap (&trap); + + status = _cairo_path_fixed_move_to (path, trap.left.p1.x, trap.top); + if (unlikely (status)) return status; + status = _cairo_path_fixed_line_to (path, trap.right.p1.x, trap.top); + if (unlikely (status)) return status; + status = _cairo_path_fixed_line_to (path, trap.right.p2.x, trap.bottom); + if (unlikely (status)) return status; + status = _cairo_path_fixed_line_to (path, trap.left.p2.x, trap.bottom); + if (unlikely (status)) return status; + status = _cairo_path_fixed_close_path (path); + if (unlikely (status)) return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_debug_print_traps (FILE *file, const cairo_traps_t *traps) +{ + cairo_box_t extents; + int n; + +#if 0 + if (traps->has_limits) { + printf ("%s: limits=(%d, %d, %d, %d)\n", + filename, + traps->limits.p1.x, traps->limits.p1.y, + traps->limits.p2.x, traps->limits.p2.y); + } +#endif + + _cairo_traps_extents (traps, &extents); + fprintf (file, "extents=(%d, %d, %d, %d)\n", + extents.p1.x, extents.p1.y, + extents.p2.x, extents.p2.y); + + for (n = 0; n < traps->num_traps; n++) { + fprintf (file, "%d %d L:(%d, %d), (%d, %d) R:(%d, %d), (%d, %d)\n", + traps->traps[n].top, + traps->traps[n].bottom, + traps->traps[n].left.p1.x, + traps->traps[n].left.p1.y, + traps->traps[n].left.p2.x, + traps->traps[n].left.p2.y, + traps->traps[n].right.p1.x, + traps->traps[n].right.p1.y, + traps->traps[n].right.p2.x, + traps->traps[n].right.p2.y); + } +} + +struct cairo_trap_renderer { + cairo_span_renderer_t base; + cairo_traps_t *traps; +}; + +static cairo_status_t +span_to_traps (void *abstract_renderer, int y, int h, + const cairo_half_open_span_t *spans, unsigned num_spans) +{ + struct cairo_trap_renderer *r = abstract_renderer; + cairo_fixed_t top, bot; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + top = _cairo_fixed_from_int (y); + bot = _cairo_fixed_from_int (y + h); + do { + if (spans[0].coverage) { + cairo_fixed_t x0 = _cairo_fixed_from_int(spans[0].x); + cairo_fixed_t x1 = _cairo_fixed_from_int(spans[1].x); + cairo_line_t left = { { x0, top }, { x0, bot } }, + right = { { x1, top }, { x1, bot } }; + _cairo_traps_add_trap (r->traps, top, bot, &left, &right); + } + spans++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_rasterise_polygon_to_traps (cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias, + cairo_traps_t *traps) +{ + struct cairo_trap_renderer renderer; + cairo_scan_converter_t *converter; + cairo_int_status_t status; + cairo_rectangle_int_t r; + + TRACE ((stderr, "%s: fill_rule=%d, antialias=%d\n", + __FUNCTION__, fill_rule, antialias)); + assert(antialias == CAIRO_ANTIALIAS_NONE); + + renderer.traps = traps; + renderer.base.render_rows = span_to_traps; + + _cairo_box_round_to_rectangle (&polygon->extents, &r); + converter = _cairo_mono_scan_converter_create (r.x, r.y, + r.x + r.width, + r.y + r.height, + fill_rule); + status = _cairo_mono_scan_converter_add_polygon (converter, polygon); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = converter->generate (converter, &renderer.base); + converter->destroy (converter); + return status; +} diff --git a/src/cairo-tristrip-private.h b/src/cairo-tristrip-private.h new file mode 100644 index 000000000..ccd28799e --- /dev/null +++ b/src/cairo-tristrip-private.h @@ -0,0 +1,94 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_TRISTRIP_PRIVATE_H +#define CAIRO_TRISTRIP_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" +#include "cairo-types-private.h" + +CAIRO_BEGIN_DECLS + +struct _cairo_tristrip { + cairo_status_t status; + + /* XXX clipping */ + + const cairo_box_t *limits; + int num_limits; + + int num_points; + int size_points; + cairo_point_t *points; + cairo_point_t points_embedded[64]; +}; + +cairo_private void +_cairo_tristrip_init (cairo_tristrip_t *strip); + +cairo_private void +_cairo_tristrip_limit (cairo_tristrip_t *strip, + const cairo_box_t *limits, + int num_limits); + +cairo_private void +_cairo_tristrip_init_with_clip (cairo_tristrip_t *strip, + const cairo_clip_t *clip); + +cairo_private void +_cairo_tristrip_translate (cairo_tristrip_t *strip, int x, int y); + +cairo_private void +_cairo_tristrip_move_to (cairo_tristrip_t *strip, + const cairo_point_t *point); + +cairo_private void +_cairo_tristrip_add_point (cairo_tristrip_t *strip, + const cairo_point_t *point); + +cairo_private void +_cairo_tristrip_extents (const cairo_tristrip_t *strip, + cairo_box_t *extents); + +cairo_private void +_cairo_tristrip_fini (cairo_tristrip_t *strip); + +#define _cairo_tristrip_status(T) ((T)->status) + +CAIRO_END_DECLS + +#endif /* CAIRO_TRISTRIP_PRIVATE_H */ diff --git a/src/cairo-tristrip.c b/src/cairo-tristrip.c new file mode 100644 index 000000000..bb4972f50 --- /dev/null +++ b/src/cairo-tristrip.c @@ -0,0 +1,185 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-tristrip-private.h" + +void +_cairo_tristrip_init (cairo_tristrip_t *strip) +{ + VG (VALGRIND_MAKE_MEM_UNDEFINED (strip, sizeof (cairo_tristrip_t))); + + strip->status = CAIRO_STATUS_SUCCESS; + + strip->num_limits = 0; + strip->num_points = 0; + + strip->size_points = ARRAY_LENGTH (strip->points_embedded); + strip->points = strip->points_embedded; +} + +void +_cairo_tristrip_fini (cairo_tristrip_t *strip) +{ + if (strip->points != strip->points_embedded) + free (strip->points); + + VG (VALGRIND_MAKE_MEM_NOACCESS (strip, sizeof (cairo_tristrip_t))); +} + + +void +_cairo_tristrip_limit (cairo_tristrip_t *strip, + const cairo_box_t *limits, + int num_limits) +{ + strip->limits = limits; + strip->num_limits = num_limits; +} + +void +_cairo_tristrip_init_with_clip (cairo_tristrip_t *strip, + const cairo_clip_t *clip) +{ + _cairo_tristrip_init (strip); + if (clip) + _cairo_tristrip_limit (strip, clip->boxes, clip->num_boxes); +} + +/* make room for at least one more trap */ +static cairo_bool_t +_cairo_tristrip_grow (cairo_tristrip_t *strip) +{ + cairo_point_t *points; + int new_size = 4 * strip->size_points; + + if (CAIRO_INJECT_FAULT ()) { + strip->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + if (strip->points == strip->points_embedded) { + points = _cairo_malloc_ab (new_size, sizeof (cairo_point_t)); + if (points != NULL) + memcpy (points, strip->points, sizeof (strip->points_embedded)); + } else { + points = _cairo_realloc_ab (strip->points, + new_size, sizeof (cairo_trapezoid_t)); + } + + if (unlikely (points == NULL)) { + strip->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + return FALSE; + } + + strip->points = points; + strip->size_points = new_size; + return TRUE; +} + +void +_cairo_tristrip_add_point (cairo_tristrip_t *strip, + const cairo_point_t *p) +{ + if (unlikely (strip->num_points == strip->size_points)) { + if (unlikely (! _cairo_tristrip_grow (strip))) + return; + } + + strip->points[strip->num_points++] = *p; +} + +/* Insert degenerate triangles to advance to the given point. The + * next point inserted must also be @p. */ +void +_cairo_tristrip_move_to (cairo_tristrip_t *strip, + const cairo_point_t *p) +{ + if (strip->num_points == 0) + return; + + _cairo_tristrip_add_point (strip, &strip->points[strip->num_points-1]); + _cairo_tristrip_add_point (strip, p); +#if 0 + /* and one more for luck! (to preserve cw/ccw ordering) */ + _cairo_tristrip_add_point (strip, p); +#endif +} + +void +_cairo_tristrip_translate (cairo_tristrip_t *strip, int x, int y) +{ + cairo_fixed_t xoff, yoff; + cairo_point_t *p; + int i; + + xoff = _cairo_fixed_from_int (x); + yoff = _cairo_fixed_from_int (y); + + for (i = 0, p = strip->points; i < strip->num_points; i++, p++) { + p->x += xoff; + p->y += yoff; + } +} + +void +_cairo_tristrip_extents (const cairo_tristrip_t *strip, + cairo_box_t *extents) +{ + int i; + + if (strip->num_points == 0) { + extents->p1.x = extents->p1.y = 0; + extents->p2.x = extents->p2.y = 0; + return; + } + + extents->p2 = extents->p1 = strip->points[0]; + for (i = 1; i < strip->num_points; i++) { + const cairo_point_t *p = &strip->points[i]; + + if (p->x < extents->p1.x) + extents->p1.x = p->x; + else if (p->x > extents->p2.x) + extents->p2.x = p->x; + + if (p->y < extents->p1.y) + extents->p1.y = p->y; + else if (p->y > extents->p2.y) + extents->p2.y = p->y; + } +} diff --git a/src/cairo-truetype-subset-private.h b/src/cairo-truetype-subset-private.h new file mode 100644 index 000000000..dc9573216 --- /dev/null +++ b/src/cairo-truetype-subset-private.h @@ -0,0 +1,212 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Adrian Johnson + */ + +#ifndef CAIRO_TRUETYPE_SUBSET_PRIVATE_H +#define CAIRO_TRUETYPE_SUBSET_PRIVATE_H + +#include "cairoint.h" + +#if CAIRO_HAS_FONT_SUBSET + +/* The structs defined here should strictly follow the TrueType + * specification and not be padded. We use only 16-bit integer + * in their definition to guarantee that. The fields of type + * "FIXED" in the TT spec are broken into two *_1 and *_2 16-bit + * parts, and 64-bit members are broken into four. + * + * The test truetype-tables in the test suite makes sure that + * these tables have the right size. Please update that test + * if you add new tables/structs that should be packed. + */ + +#define MAKE_TT_TAG(a, b, c, d) (a<<24 | b<<16 | c<<8 | d) +#define TT_TAG_CFF MAKE_TT_TAG('C','F','F',' ') +#define TT_TAG_cmap MAKE_TT_TAG('c','m','a','p') +#define TT_TAG_cvt MAKE_TT_TAG('c','v','t',' ') +#define TT_TAG_fpgm MAKE_TT_TAG('f','p','g','m') +#define TT_TAG_glyf MAKE_TT_TAG('g','l','y','f') +#define TT_TAG_head MAKE_TT_TAG('h','e','a','d') +#define TT_TAG_hhea MAKE_TT_TAG('h','h','e','a') +#define TT_TAG_hmtx MAKE_TT_TAG('h','m','t','x') +#define TT_TAG_loca MAKE_TT_TAG('l','o','c','a') +#define TT_TAG_maxp MAKE_TT_TAG('m','a','x','p') +#define TT_TAG_name MAKE_TT_TAG('n','a','m','e') +#define TT_TAG_OS2 MAKE_TT_TAG('O','S','/','2') +#define TT_TAG_post MAKE_TT_TAG('p','o','s','t') +#define TT_TAG_prep MAKE_TT_TAG('p','r','e','p') + +/* All tt_* structs are big-endian */ +typedef struct _tt_cmap_index { + uint16_t platform; + uint16_t encoding; + uint32_t offset; +} tt_cmap_index_t; + +typedef struct _tt_cmap { + uint16_t version; + uint16_t num_tables; + tt_cmap_index_t index[1]; +} tt_cmap_t; + +typedef struct _segment_map { + uint16_t format; + uint16_t length; + uint16_t version; + uint16_t segCountX2; + uint16_t searchRange; + uint16_t entrySelector; + uint16_t rangeShift; + uint16_t endCount[1]; +} tt_segment_map_t; + +typedef struct _tt_head { + int16_t version_1; + int16_t version_2; + int16_t revision_1; + int16_t revision_2; + uint16_t checksum_1; + uint16_t checksum_2; + uint16_t magic_1; + uint16_t magic_2; + uint16_t flags; + uint16_t units_per_em; + int16_t created_1; + int16_t created_2; + int16_t created_3; + int16_t created_4; + int16_t modified_1; + int16_t modified_2; + int16_t modified_3; + int16_t modified_4; + int16_t x_min; /* FWORD */ + int16_t y_min; /* FWORD */ + int16_t x_max; /* FWORD */ + int16_t y_max; /* FWORD */ + uint16_t mac_style; + uint16_t lowest_rec_pppem; + int16_t font_direction_hint; + int16_t index_to_loc_format; + int16_t glyph_data_format; +} tt_head_t; + +typedef struct _tt_hhea { + int16_t version_1; + int16_t version_2; + int16_t ascender; /* FWORD */ + int16_t descender; /* FWORD */ + int16_t line_gap; /* FWORD */ + uint16_t advance_max_width; /* UFWORD */ + int16_t min_left_side_bearing; /* FWORD */ + int16_t min_right_side_bearing; /* FWORD */ + int16_t x_max_extent; /* FWORD */ + int16_t caret_slope_rise; + int16_t caret_slope_run; + int16_t reserved[5]; + int16_t metric_data_format; + uint16_t num_hmetrics; +} tt_hhea_t; + +typedef struct _tt_maxp { + int16_t version_1; + int16_t version_2; + uint16_t num_glyphs; + uint16_t max_points; + uint16_t max_contours; + uint16_t max_composite_points; + uint16_t max_composite_contours; + uint16_t max_zones; + uint16_t max_twilight_points; + uint16_t max_storage; + uint16_t max_function_defs; + uint16_t max_instruction_defs; + uint16_t max_stack_elements; + uint16_t max_size_of_instructions; + uint16_t max_component_elements; + uint16_t max_component_depth; +} tt_maxp_t; + +typedef struct _tt_name_record { + uint16_t platform; + uint16_t encoding; + uint16_t language; + uint16_t name; + uint16_t length; + uint16_t offset; +} tt_name_record_t; + +typedef struct _tt_name { + uint16_t format; + uint16_t num_records; + uint16_t strings_offset; + tt_name_record_t records[1]; +} tt_name_t; + + +/* bitmask for fsSelection field */ +#define TT_FS_SELECTION_ITALIC 1 +#define TT_FS_SELECTION_BOLD 32 + +/* _unused fields are defined in TT spec but not used by cairo */ +typedef struct _tt_os2 { + uint16_t _unused1[2]; + uint16_t usWeightClass; + uint16_t _unused2[28]; + uint16_t fsSelection; + uint16_t _unused3[11]; +} tt_os2_t; + +/* composite_glyph_t flags */ +#define TT_ARG_1_AND_2_ARE_WORDS 0x0001 +#define TT_WE_HAVE_A_SCALE 0x0008 +#define TT_MORE_COMPONENTS 0x0020 +#define TT_WE_HAVE_AN_X_AND_Y_SCALE 0x0040 +#define TT_WE_HAVE_A_TWO_BY_TWO 0x0080 + +typedef struct _tt_composite_glyph { + uint16_t flags; + uint16_t index; + uint16_t args[6]; /* 1 to 6 arguments depending on value of flags */ +} tt_composite_glyph_t; + +typedef struct _tt_glyph_data { + int16_t num_contours; + int8_t data[8]; + tt_composite_glyph_t glyph; +} tt_glyph_data_t; + +#endif /* CAIRO_HAS_FONT_SUBSET */ + +#endif /* CAIRO_TRUETYPE_SUBSET_PRIVATE_H */ diff --git a/src/cairo-truetype-subset.c b/src/cairo-truetype-subset.c new file mode 100644 index 000000000..645a89abf --- /dev/null +++ b/src/cairo-truetype-subset.c @@ -0,0 +1,1631 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Adrian Johnson + */ + +/* + * Useful links: + * http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html + * http://www.microsoft.com/typography/specs/default.htm + */ + +#define _BSD_SOURCE /* for snprintf(), strdup() */ +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-truetype-subset-private.h" + + +typedef struct subset_glyph subset_glyph_t; +struct subset_glyph { + int parent_index; + unsigned long location; +}; + +typedef struct _cairo_truetype_font cairo_truetype_font_t; + +typedef struct table table_t; +struct table { + unsigned long tag; + cairo_status_t (*write) (cairo_truetype_font_t *font, unsigned long tag); + int pos; /* position in the font directory */ +}; + +struct _cairo_truetype_font { + + cairo_scaled_font_subset_t *scaled_font_subset; + + table_t truetype_tables[10]; + int num_tables; + + struct { + char *font_name; + char *ps_name; + unsigned int num_glyphs; + int *widths; + long x_min, y_min, x_max, y_max; + long ascent, descent; + int units_per_em; + } base; + + subset_glyph_t *glyphs; + const cairo_scaled_font_backend_t *backend; + int num_glyphs_in_face; + int checksum_index; + cairo_array_t output; + cairo_array_t string_offsets; + unsigned long last_offset; + unsigned long last_boundary; + int *parent_to_subset; + cairo_status_t status; + cairo_bool_t is_pdf; +}; + +/* + * Test that the structs we define for TrueType tables have the + * correct size, ie. they are not padded. + */ +#define check(T, S) COMPILE_TIME_ASSERT (sizeof (T) == (S)) +check (tt_head_t, 54); +check (tt_hhea_t, 36); +check (tt_maxp_t, 32); +check (tt_name_record_t, 12); +check (tt_name_t, 18); +check (tt_name_t, 18); +check (tt_composite_glyph_t, 16); +check (tt_glyph_data_t, 26); +#undef check + +static cairo_status_t +cairo_truetype_font_use_glyph (cairo_truetype_font_t *font, + unsigned short glyph, + unsigned short *out); + +#define SFNT_VERSION 0x00010000 +#define SFNT_STRING_MAX_LENGTH 65535 + +static cairo_status_t +_cairo_truetype_font_set_error (cairo_truetype_font_t *font, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS || + status == (int)CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + _cairo_status_set_error (&font->status, status); + + return _cairo_error (status); +} + +static cairo_status_t +_cairo_truetype_font_create (cairo_scaled_font_subset_t *scaled_font_subset, + cairo_bool_t is_pdf, + cairo_truetype_font_t **font_return) +{ + cairo_status_t status; + cairo_truetype_font_t *font; + const cairo_scaled_font_backend_t *backend; + tt_head_t head; + tt_hhea_t hhea; + tt_maxp_t maxp; + unsigned long size; + + backend = scaled_font_subset->scaled_font->backend; + if (!backend->load_truetype_table) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* FIXME: We should either support subsetting vertical fonts, or fail on + * vertical. Currently font_options_t doesn't have vertical flag, but + * it should be added in the future. For now, the freetype backend + * returns UNSUPPORTED in load_truetype_table if the font is vertical. + * + * if (cairo_font_options_get_vertical_layout (scaled_font_subset->scaled_font)) + * return CAIRO_INT_STATUS_UNSUPPORTED; + */ + + /* We need to use a fallback font generated from the synthesized outlines. */ + if (backend->is_synthetic && backend->is_synthetic (scaled_font_subset->scaled_font)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = sizeof (tt_head_t); + status = backend->load_truetype_table (scaled_font_subset->scaled_font, + TT_TAG_head, 0, + (unsigned char *) &head, + &size); + if (unlikely (status)) + return status; + + size = sizeof (tt_maxp_t); + status = backend->load_truetype_table (scaled_font_subset->scaled_font, + TT_TAG_maxp, 0, + (unsigned char *) &maxp, + &size); + if (unlikely (status)) + return status; + + size = sizeof (tt_hhea_t); + status = backend->load_truetype_table (scaled_font_subset->scaled_font, + TT_TAG_hhea, 0, + (unsigned char *) &hhea, + &size); + if (unlikely (status)) + return status; + + font = malloc (sizeof (cairo_truetype_font_t)); + if (unlikely (font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->backend = backend; + font->num_glyphs_in_face = be16_to_cpu (maxp.num_glyphs); + font->scaled_font_subset = scaled_font_subset; + + font->last_offset = 0; + font->last_boundary = 0; + _cairo_array_init (&font->output, sizeof (char)); + status = _cairo_array_grow_by (&font->output, 4096); + if (unlikely (status)) + goto fail1; + + font->glyphs = calloc (font->num_glyphs_in_face + 1, sizeof (subset_glyph_t)); + if (unlikely (font->glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + font->parent_to_subset = calloc (font->num_glyphs_in_face, sizeof (int)); + if (unlikely (font->parent_to_subset == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + + font->is_pdf = is_pdf; + font->base.num_glyphs = 0; + font->base.x_min = (int16_t) be16_to_cpu (head.x_min); + font->base.y_min = (int16_t) be16_to_cpu (head.y_min); + font->base.x_max = (int16_t) be16_to_cpu (head.x_max); + font->base.y_max = (int16_t) be16_to_cpu (head.y_max); + font->base.ascent = (int16_t) be16_to_cpu (hhea.ascender); + font->base.descent = (int16_t) be16_to_cpu (hhea.descender); + font->base.units_per_em = (int16_t) be16_to_cpu (head.units_per_em); + if (font->base.units_per_em == 0) + font->base.units_per_em = 2048; + + font->base.ps_name = NULL; + font->base.font_name = NULL; + status = _cairo_truetype_read_font_name (scaled_font_subset->scaled_font, + &font->base.ps_name, + &font->base.font_name); + if (_cairo_status_is_error (status)) + goto fail3; + + /* If the PS name is not found, create a CairoFont-x-y name. */ + if (font->base.ps_name == NULL) { + font->base.ps_name = malloc (30); + if (unlikely (font->base.ps_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + + snprintf(font->base.ps_name, 30, "CairoFont-%u-%u", + scaled_font_subset->font_id, + scaled_font_subset->subset_id); + } + + font->base.widths = calloc (font->num_glyphs_in_face, sizeof (int)); + if (unlikely (font->base.widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail4; + } + + _cairo_array_init (&font->string_offsets, sizeof (unsigned long)); + status = _cairo_array_grow_by (&font->string_offsets, 10); + if (unlikely (status)) + goto fail5; + + font->status = CAIRO_STATUS_SUCCESS; + + *font_return = font; + + return CAIRO_STATUS_SUCCESS; + + fail5: + _cairo_array_fini (&font->string_offsets); + free (font->base.widths); + fail4: + free (font->base.ps_name); + fail3: + free (font->parent_to_subset); + free (font->base.font_name); + fail2: + free (font->glyphs); + fail1: + _cairo_array_fini (&font->output); + free (font); + + return status; +} + +static void +cairo_truetype_font_destroy (cairo_truetype_font_t *font) +{ + _cairo_array_fini (&font->string_offsets); + free (font->base.widths); + free (font->base.ps_name); + free (font->base.font_name); + free (font->parent_to_subset); + free (font->glyphs); + _cairo_array_fini (&font->output); + free (font); +} + +static cairo_status_t +cairo_truetype_font_allocate_write_buffer (cairo_truetype_font_t *font, + size_t length, + unsigned char **buffer) +{ + cairo_status_t status; + + if (font->status) + return font->status; + + status = _cairo_array_allocate (&font->output, length, (void **) buffer); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + return CAIRO_STATUS_SUCCESS; +} + +static void +cairo_truetype_font_write (cairo_truetype_font_t *font, + const void *data, + size_t length) +{ + cairo_status_t status; + + if (font->status) + return; + + status = _cairo_array_append_multiple (&font->output, data, length); + if (unlikely (status)) + status = _cairo_truetype_font_set_error (font, status); +} + +static void +cairo_truetype_font_write_be16 (cairo_truetype_font_t *font, + uint16_t value) +{ + uint16_t be16_value; + + if (font->status) + return; + + be16_value = cpu_to_be16 (value); + cairo_truetype_font_write (font, &be16_value, sizeof be16_value); +} + +static void +cairo_truetype_font_write_be32 (cairo_truetype_font_t *font, + uint32_t value) +{ + uint32_t be32_value; + + if (font->status) + return; + + be32_value = cpu_to_be32 (value); + cairo_truetype_font_write (font, &be32_value, sizeof be32_value); +} + +static cairo_status_t +cairo_truetype_font_align_output (cairo_truetype_font_t *font, + unsigned long *aligned) +{ + int length, pad; + unsigned char *padding; + + length = _cairo_array_num_elements (&font->output); + *aligned = (length + 3) & ~3; + pad = *aligned - length; + + if (pad) { + cairo_status_t status; + + status = cairo_truetype_font_allocate_write_buffer (font, pad, + &padding); + if (unlikely (status)) + return status; + + memset (padding, 0, pad); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_check_boundary (cairo_truetype_font_t *font, + unsigned long boundary) +{ + cairo_status_t status; + + if (font->status) + return font->status; + + if (boundary - font->last_offset > SFNT_STRING_MAX_LENGTH) + { + status = _cairo_array_append (&font->string_offsets, + &font->last_boundary); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + font->last_offset = font->last_boundary; + } + font->last_boundary = boundary; + + return CAIRO_STATUS_SUCCESS; +} + +typedef struct _cmap_unicode_range { + unsigned int start; + unsigned int end; +} cmap_unicode_range_t; + +static cmap_unicode_range_t winansi_unicode_ranges[] = { + { 0x0020, 0x007f }, + { 0x00a0, 0x00ff }, + { 0x0152, 0x0153 }, + { 0x0160, 0x0161 }, + { 0x0178, 0x0178 }, + { 0x017d, 0x017e }, + { 0x0192, 0x0192 }, + { 0x02c6, 0x02c6 }, + { 0x02dc, 0x02dc }, + { 0x2013, 0x2026 }, + { 0x2030, 0x2030 }, + { 0x2039, 0x203a }, + { 0x20ac, 0x20ac }, + { 0x2122, 0x2122 }, +}; + +static cairo_status_t +cairo_truetype_font_write_cmap_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + int i; + unsigned int j; + int range_offset; + int num_ranges; + int entry_selector; + int length; + + num_ranges = ARRAY_LENGTH (winansi_unicode_ranges); + + length = 16 + (num_ranges + 1)*8; + for (i = 0; i < num_ranges; i++) + length += (winansi_unicode_ranges[i].end - winansi_unicode_ranges[i].start + 1)*2; + + entry_selector = 0; + while ((1 << entry_selector) <= (num_ranges + 1)) + entry_selector++; + + entry_selector--; + + cairo_truetype_font_write_be16 (font, 0); /* Table version */ + cairo_truetype_font_write_be16 (font, 1); /* Num tables */ + + cairo_truetype_font_write_be16 (font, 3); /* Platform */ + cairo_truetype_font_write_be16 (font, 1); /* Encoding */ + cairo_truetype_font_write_be32 (font, 12); /* Offset to start of table */ + + /* Output a format 4 encoding table for the winansi encoding */ + + cairo_truetype_font_write_be16 (font, 4); /* Format */ + cairo_truetype_font_write_be16 (font, length); /* Length */ + cairo_truetype_font_write_be16 (font, 0); /* Version */ + cairo_truetype_font_write_be16 (font, num_ranges*2 + 2); /* 2*segcount */ + cairo_truetype_font_write_be16 (font, (1 << (entry_selector + 1))); /* searchrange */ + cairo_truetype_font_write_be16 (font, entry_selector); /* entry selector */ + cairo_truetype_font_write_be16 (font, num_ranges*2 + 2 - (1 << (entry_selector + 1))); /* rangeshift */ + for (i = 0; i < num_ranges; i++) + cairo_truetype_font_write_be16 (font, winansi_unicode_ranges[i].end); /* end count[] */ + cairo_truetype_font_write_be16 (font, 0xffff); /* end count[] */ + + cairo_truetype_font_write_be16 (font, 0); /* reserved */ + + for (i = 0; i < num_ranges; i++) + cairo_truetype_font_write_be16 (font, winansi_unicode_ranges[i].start); /* startCode[] */ + cairo_truetype_font_write_be16 (font, 0xffff); /* startCode[] */ + + for (i = 0; i < num_ranges; i++) + cairo_truetype_font_write_be16 (font, 0x0000); /* delta[] */ + cairo_truetype_font_write_be16 (font, 1); /* delta[] */ + + range_offset = num_ranges*2 + 2; + for (i = 0; i < num_ranges; i++) { + cairo_truetype_font_write_be16 (font, range_offset); /* rangeOffset[] */ + range_offset += (winansi_unicode_ranges[i].end - winansi_unicode_ranges[i].start + 1)*2 - 2; + } + cairo_truetype_font_write_be16 (font, 0); /* rangeOffset[] */ + + for (i = 0; i < num_ranges; i++) { + for (j = winansi_unicode_ranges[i].start; j < winansi_unicode_ranges[i].end + 1; j++) { + int ch = _cairo_unicode_to_winansi (j); + int glyph; + + if (ch > 0) + glyph = font->scaled_font_subset->latin_to_subset_glyph_index[ch]; + else + glyph = 0; + cairo_truetype_font_write_be16 (font, glyph); + } + } + + return font->status; +} + +static cairo_status_t +cairo_truetype_font_write_generic_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + cairo_status_t status; + unsigned char *buffer; + unsigned long size; + + if (font->status) + return font->status; + + size = 0; + status = font->backend->load_truetype_table(font->scaled_font_subset->scaled_font, + tag, 0, NULL, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + status = cairo_truetype_font_allocate_write_buffer (font, size, &buffer); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + tag, 0, buffer, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_remap_composite_glyph (cairo_truetype_font_t *font, + unsigned char *buffer, + unsigned long size) +{ + tt_glyph_data_t *glyph_data; + tt_composite_glyph_t *composite_glyph; + int num_args; + int has_more_components; + unsigned short flags; + unsigned short index; + cairo_status_t status; + unsigned char *end = buffer + size; + + if (font->status) + return font->status; + + glyph_data = (tt_glyph_data_t *) buffer; + if ((unsigned char *)(&glyph_data->data) >= end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((int16_t)be16_to_cpu (glyph_data->num_contours) >= 0) + return CAIRO_STATUS_SUCCESS; + + composite_glyph = &glyph_data->glyph; + do { + if ((unsigned char *)(&composite_glyph->args[1]) > end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + flags = be16_to_cpu (composite_glyph->flags); + has_more_components = flags & TT_MORE_COMPONENTS; + status = cairo_truetype_font_use_glyph (font, be16_to_cpu (composite_glyph->index), &index); + if (unlikely (status)) + return status; + + composite_glyph->index = cpu_to_be16 (index); + num_args = 1; + if (flags & TT_ARG_1_AND_2_ARE_WORDS) + num_args += 1; + + if (flags & TT_WE_HAVE_A_SCALE) + num_args += 1; + else if (flags & TT_WE_HAVE_AN_X_AND_Y_SCALE) + num_args += 2; + else if (flags & TT_WE_HAVE_A_TWO_BY_TWO) + num_args += 4; + + composite_glyph = (tt_composite_glyph_t *) &(composite_glyph->args[num_args]); + } while (has_more_components); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_write_glyf_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + unsigned long start_offset, index, size, next; + tt_head_t header; + unsigned long begin, end; + unsigned char *buffer; + unsigned int i; + union { + unsigned char *bytes; + uint16_t *short_offsets; + uint32_t *long_offsets; + } u; + cairo_status_t status; + + if (font->status) + return font->status; + + size = sizeof (tt_head_t); + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_head, 0, + (unsigned char*) &header, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + if (be16_to_cpu (header.index_to_loc_format) == 0) + size = sizeof (int16_t) * (font->num_glyphs_in_face + 1); + else + size = sizeof (int32_t) * (font->num_glyphs_in_face + 1); + + u.bytes = malloc (size); + if (unlikely (u.bytes == NULL)) + return _cairo_truetype_font_set_error (font, CAIRO_STATUS_NO_MEMORY); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_loca, 0, u.bytes, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + start_offset = _cairo_array_num_elements (&font->output); + for (i = 0; i < font->base.num_glyphs; i++) { + index = font->glyphs[i].parent_index; + if (be16_to_cpu (header.index_to_loc_format) == 0) { + begin = be16_to_cpu (u.short_offsets[index]) * 2; + end = be16_to_cpu (u.short_offsets[index + 1]) * 2; + } + else { + begin = be32_to_cpu (u.long_offsets[index]); + end = be32_to_cpu (u.long_offsets[index + 1]); + } + + /* quick sanity check... */ + if (end < begin) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto FAIL; + } + + size = end - begin; + status = cairo_truetype_font_align_output (font, &next); + if (unlikely (status)) + goto FAIL; + + status = cairo_truetype_font_check_boundary (font, next); + if (unlikely (status)) + goto FAIL; + + font->glyphs[i].location = next - start_offset; + + status = cairo_truetype_font_allocate_write_buffer (font, size, &buffer); + if (unlikely (status)) + goto FAIL; + + if (size != 0) { + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_glyf, begin, buffer, &size); + if (unlikely (status)) + goto FAIL; + + status = cairo_truetype_font_remap_composite_glyph (font, buffer, size); + if (unlikely (status)) + goto FAIL; + } + } + + status = cairo_truetype_font_align_output (font, &next); + if (unlikely (status)) + goto FAIL; + + font->glyphs[i].location = next - start_offset; + + status = font->status; +FAIL: + free (u.bytes); + + return _cairo_truetype_font_set_error (font, status); +} + +static cairo_status_t +cairo_truetype_font_write_head_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + unsigned char *buffer; + unsigned long size; + cairo_status_t status; + + if (font->status) + return font->status; + + size = 0; + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + tag, 0, NULL, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + font->checksum_index = _cairo_array_num_elements (&font->output) + 8; + status = cairo_truetype_font_allocate_write_buffer (font, size, &buffer); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + tag, 0, buffer, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + /* set checkSumAdjustment to 0 for table checksum calculation */ + *(uint32_t *)(buffer + 8) = 0; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_write_hhea_table (cairo_truetype_font_t *font, unsigned long tag) +{ + tt_hhea_t *hhea; + unsigned long size; + cairo_status_t status; + + if (font->status) + return font->status; + + size = sizeof (tt_hhea_t); + status = cairo_truetype_font_allocate_write_buffer (font, size, (unsigned char **) &hhea); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + tag, 0, (unsigned char *) hhea, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + hhea->num_hmetrics = cpu_to_be16 ((uint16_t)(font->base.num_glyphs)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_write_hmtx_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + unsigned long size; + unsigned long long_entry_size; + unsigned long short_entry_size; + short *p; + unsigned int i; + tt_hhea_t hhea; + int num_hmetrics; + cairo_status_t status; + + if (font->status) + return font->status; + + size = sizeof (tt_hhea_t); + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hhea, 0, + (unsigned char*) &hhea, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + num_hmetrics = be16_to_cpu(hhea.num_hmetrics); + + for (i = 0; i < font->base.num_glyphs; i++) { + long_entry_size = 2 * sizeof (int16_t); + short_entry_size = sizeof (int16_t); + status = cairo_truetype_font_allocate_write_buffer (font, + long_entry_size, + (unsigned char **) &p); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + if (font->glyphs[i].parent_index < num_hmetrics) { + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hmtx, + font->glyphs[i].parent_index * long_entry_size, + (unsigned char *) p, &long_entry_size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + } + else + { + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hmtx, + (num_hmetrics - 1) * long_entry_size, + (unsigned char *) p, &short_entry_size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_hmtx, + num_hmetrics * long_entry_size + + (font->glyphs[i].parent_index - num_hmetrics) * short_entry_size, + (unsigned char *) (p + 1), &short_entry_size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + } + font->base.widths[i] = be16_to_cpu (p[0]); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_write_loca_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + unsigned int i; + tt_head_t header; + unsigned long size; + cairo_status_t status; + + if (font->status) + return font->status; + + size = sizeof(tt_head_t); + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_head, 0, + (unsigned char*) &header, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + if (be16_to_cpu (header.index_to_loc_format) == 0) + { + for (i = 0; i < font->base.num_glyphs + 1; i++) + cairo_truetype_font_write_be16 (font, font->glyphs[i].location / 2); + } else { + for (i = 0; i < font->base.num_glyphs + 1; i++) + cairo_truetype_font_write_be32 (font, font->glyphs[i].location); + } + + return font->status; +} + +static cairo_status_t +cairo_truetype_font_write_maxp_table (cairo_truetype_font_t *font, + unsigned long tag) +{ + tt_maxp_t *maxp; + unsigned long size; + cairo_status_t status; + + if (font->status) + return font->status; + + size = sizeof (tt_maxp_t); + status = cairo_truetype_font_allocate_write_buffer (font, size, (unsigned char **) &maxp); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + tag, 0, (unsigned char *) maxp, &size); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + maxp->num_glyphs = cpu_to_be16 (font->base.num_glyphs); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_truetype_font_write_offset_table (cairo_truetype_font_t *font) +{ + cairo_status_t status; + unsigned char *table_buffer; + size_t table_buffer_length; + unsigned short search_range, entry_selector, range_shift; + + if (font->status) + return font->status; + + search_range = 1; + entry_selector = 0; + while (search_range * 2 <= font->num_tables) { + search_range *= 2; + entry_selector++; + } + search_range *= 16; + range_shift = font->num_tables * 16 - search_range; + + cairo_truetype_font_write_be32 (font, SFNT_VERSION); + cairo_truetype_font_write_be16 (font, font->num_tables); + cairo_truetype_font_write_be16 (font, search_range); + cairo_truetype_font_write_be16 (font, entry_selector); + cairo_truetype_font_write_be16 (font, range_shift); + + /* Allocate space for the table directory. Each directory entry + * will be filled in by cairo_truetype_font_update_entry() after + * the table is written. */ + table_buffer_length = font->num_tables * 16; + status = cairo_truetype_font_allocate_write_buffer (font, table_buffer_length, + &table_buffer); + if (unlikely (status)) + return _cairo_truetype_font_set_error (font, status); + + return CAIRO_STATUS_SUCCESS; +} + +static uint32_t +cairo_truetype_font_calculate_checksum (cairo_truetype_font_t *font, + unsigned long start, + unsigned long end) +{ + uint32_t *padded_end; + uint32_t *p; + uint32_t checksum; + char *data; + + checksum = 0; + data = _cairo_array_index (&font->output, 0); + p = (uint32_t *) (data + start); + padded_end = (uint32_t *) (data + ((end + 3) & ~3)); + while (p < padded_end) + checksum += be32_to_cpu(*p++); + + return checksum; +} + +static void +cairo_truetype_font_update_entry (cairo_truetype_font_t *font, + int index, + unsigned long tag, + unsigned long start, + unsigned long end) +{ + uint32_t *entry; + + entry = _cairo_array_index (&font->output, 12 + 16 * index); + entry[0] = cpu_to_be32 ((uint32_t)tag); + entry[1] = cpu_to_be32 (cairo_truetype_font_calculate_checksum (font, start, end)); + entry[2] = cpu_to_be32 ((uint32_t)start); + entry[3] = cpu_to_be32 ((uint32_t)(end - start)); +} + +static cairo_status_t +cairo_truetype_font_generate (cairo_truetype_font_t *font, + const char **data, + unsigned long *length, + const unsigned long **string_offsets, + unsigned long *num_strings) +{ + cairo_status_t status; + unsigned long start, end, next; + uint32_t checksum, *checksum_location; + int i; + + if (font->status) + return font->status; + + status = cairo_truetype_font_write_offset_table (font); + if (unlikely (status)) + goto FAIL; + + status = cairo_truetype_font_align_output (font, &start); + if (unlikely (status)) + goto FAIL; + + end = 0; + for (i = 0; i < font->num_tables; i++) { + status = font->truetype_tables[i].write (font, font->truetype_tables[i].tag); + if (unlikely (status)) + goto FAIL; + + end = _cairo_array_num_elements (&font->output); + status = cairo_truetype_font_align_output (font, &next); + if (unlikely (status)) + goto FAIL; + + cairo_truetype_font_update_entry (font, font->truetype_tables[i].pos, + font->truetype_tables[i].tag, start, end); + status = cairo_truetype_font_check_boundary (font, next); + if (unlikely (status)) + goto FAIL; + + start = next; + } + + checksum = + 0xb1b0afba - cairo_truetype_font_calculate_checksum (font, 0, end); + checksum_location = _cairo_array_index (&font->output, font->checksum_index); + *checksum_location = cpu_to_be32 (checksum); + + *data = _cairo_array_index (&font->output, 0); + *length = _cairo_array_num_elements (&font->output); + *num_strings = _cairo_array_num_elements (&font->string_offsets); + if (*num_strings != 0) + *string_offsets = _cairo_array_index (&font->string_offsets, 0); + else + *string_offsets = NULL; + + FAIL: + return _cairo_truetype_font_set_error (font, status); +} + +static cairo_status_t +cairo_truetype_font_use_glyph (cairo_truetype_font_t *font, + unsigned short glyph, + unsigned short *out) +{ + if (glyph >= font->num_glyphs_in_face) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (font->parent_to_subset[glyph] == 0) { + font->parent_to_subset[glyph] = font->base.num_glyphs; + font->glyphs[font->base.num_glyphs].parent_index = glyph; + font->base.num_glyphs++; + } + + *out = font->parent_to_subset[glyph]; + return CAIRO_STATUS_SUCCESS; +} + +static void +cairo_truetype_font_add_truetype_table (cairo_truetype_font_t *font, + unsigned long tag, + cairo_status_t (*write) (cairo_truetype_font_t *font, unsigned long tag), + int pos) +{ + font->truetype_tables[font->num_tables].tag = tag; + font->truetype_tables[font->num_tables].write = write; + font->truetype_tables[font->num_tables].pos = pos; + font->num_tables++; +} + +/* cairo_truetype_font_create_truetype_table_list() builds the list of + * truetype tables to be embedded in the subsetted font. Each call to + * cairo_truetype_font_add_truetype_table() adds a table, the callback + * for generating the table, and the position in the table directory + * to the truetype_tables array. + * + * As we write out the glyf table we remap composite glyphs. + * Remapping composite glyphs will reference the sub glyphs the + * composite glyph is made up of. The "glyf" table callback needs to + * be called first so we have all the glyphs in the subset before + * going further. + * + * The order in which tables are added to the truetype_table array + * using cairo_truetype_font_add_truetype_table() specifies the order + * in which the callback functions will be called. + * + * The tables in the table directory must be listed in alphabetical + * order. The "cvt", "fpgm", and "prep" are optional tables. They + * will only be embedded in the subset if they exist in the source + * font. "cmap" is only embedded for latin fonts. The pos parameter of + * cairo_truetype_font_add_truetype_table() specifies the position of + * the table in the table directory. + */ +static void +cairo_truetype_font_create_truetype_table_list (cairo_truetype_font_t *font) +{ + cairo_bool_t has_cvt = FALSE; + cairo_bool_t has_fpgm = FALSE; + cairo_bool_t has_prep = FALSE; + unsigned long size; + int pos; + + size = 0; + if (font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_cvt, 0, NULL, + &size) == CAIRO_INT_STATUS_SUCCESS) + has_cvt = TRUE; + + size = 0; + if (font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_fpgm, 0, NULL, + &size) == CAIRO_INT_STATUS_SUCCESS) + has_fpgm = TRUE; + + size = 0; + if (font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, + TT_TAG_prep, 0, NULL, + &size) == CAIRO_INT_STATUS_SUCCESS) + has_prep = TRUE; + + font->num_tables = 0; + pos = 0; + if (font->is_pdf && font->scaled_font_subset->is_latin) + pos++; + if (has_cvt) + pos++; + if (has_fpgm) + pos++; + cairo_truetype_font_add_truetype_table (font, TT_TAG_glyf, cairo_truetype_font_write_glyf_table, pos); + + pos = 0; + if (font->is_pdf && font->scaled_font_subset->is_latin) + cairo_truetype_font_add_truetype_table (font, TT_TAG_cmap, cairo_truetype_font_write_cmap_table, pos++); + if (has_cvt) + cairo_truetype_font_add_truetype_table (font, TT_TAG_cvt, cairo_truetype_font_write_generic_table, pos++); + if (has_fpgm) + cairo_truetype_font_add_truetype_table (font, TT_TAG_fpgm, cairo_truetype_font_write_generic_table, pos++); + pos++; + cairo_truetype_font_add_truetype_table (font, TT_TAG_head, cairo_truetype_font_write_head_table, pos++); + cairo_truetype_font_add_truetype_table (font, TT_TAG_hhea, cairo_truetype_font_write_hhea_table, pos++); + cairo_truetype_font_add_truetype_table (font, TT_TAG_hmtx, cairo_truetype_font_write_hmtx_table, pos++); + cairo_truetype_font_add_truetype_table (font, TT_TAG_loca, cairo_truetype_font_write_loca_table, pos++); + cairo_truetype_font_add_truetype_table (font, TT_TAG_maxp, cairo_truetype_font_write_maxp_table, pos++); + if (has_prep) + cairo_truetype_font_add_truetype_table (font, TT_TAG_prep, cairo_truetype_font_write_generic_table, pos); +} + +static cairo_status_t +cairo_truetype_subset_init_internal (cairo_truetype_subset_t *truetype_subset, + cairo_scaled_font_subset_t *font_subset, + cairo_bool_t is_pdf) +{ + cairo_truetype_font_t *font = NULL; + cairo_status_t status; + const char *data = NULL; /* squelch bogus compiler warning */ + unsigned long length = 0; /* squelch bogus compiler warning */ + unsigned long offsets_length; + unsigned int i; + const unsigned long *string_offsets = NULL; + unsigned long num_strings = 0; + + status = _cairo_truetype_font_create (font_subset, is_pdf, &font); + if (unlikely (status)) + return status; + + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + unsigned short parent_glyph = font->scaled_font_subset->glyphs[i]; + status = cairo_truetype_font_use_glyph (font, parent_glyph, &parent_glyph); + if (unlikely (status)) + goto fail1; + } + + cairo_truetype_font_create_truetype_table_list (font); + status = cairo_truetype_font_generate (font, &data, &length, + &string_offsets, &num_strings); + if (unlikely (status)) + goto fail1; + + truetype_subset->ps_name = strdup (font->base.ps_name); + if (unlikely (truetype_subset->ps_name == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + if (font->base.font_name != NULL) { + truetype_subset->family_name_utf8 = strdup (font->base.font_name); + if (unlikely (truetype_subset->family_name_utf8 == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + } else { + truetype_subset->family_name_utf8 = NULL; + } + + /* The widths array returned must contain only widths for the + * glyphs in font_subset. Any subglyphs appended after + * font_subset->num_glyphs are omitted. */ + truetype_subset->widths = calloc (sizeof (double), + font->scaled_font_subset->num_glyphs); + if (unlikely (truetype_subset->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) + truetype_subset->widths[i] = (double)font->base.widths[i]/font->base.units_per_em; + + truetype_subset->x_min = (double)font->base.x_min/font->base.units_per_em; + truetype_subset->y_min = (double)font->base.y_min/font->base.units_per_em; + truetype_subset->x_max = (double)font->base.x_max/font->base.units_per_em; + truetype_subset->y_max = (double)font->base.y_max/font->base.units_per_em; + truetype_subset->ascent = (double)font->base.ascent/font->base.units_per_em; + truetype_subset->descent = (double)font->base.descent/font->base.units_per_em; + + if (length) { + truetype_subset->data = malloc (length); + if (unlikely (truetype_subset->data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail4; + } + + memcpy (truetype_subset->data, data, length); + } else + truetype_subset->data = NULL; + truetype_subset->data_length = length; + + if (num_strings) { + offsets_length = num_strings * sizeof (unsigned long); + truetype_subset->string_offsets = malloc (offsets_length); + if (unlikely (truetype_subset->string_offsets == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail5; + } + + memcpy (truetype_subset->string_offsets, string_offsets, offsets_length); + truetype_subset->num_string_offsets = num_strings; + } else { + truetype_subset->string_offsets = NULL; + truetype_subset->num_string_offsets = 0; + } + + cairo_truetype_font_destroy (font); + + return CAIRO_STATUS_SUCCESS; + + fail5: + free (truetype_subset->data); + fail4: + free (truetype_subset->widths); + fail3: + free (truetype_subset->family_name_utf8); + fail2: + free (truetype_subset->ps_name); + fail1: + cairo_truetype_font_destroy (font); + + return status; +} + +cairo_status_t +_cairo_truetype_subset_init_ps (cairo_truetype_subset_t *truetype_subset, + cairo_scaled_font_subset_t *font_subset) +{ + return cairo_truetype_subset_init_internal (truetype_subset, font_subset, FALSE); +} + +cairo_status_t +_cairo_truetype_subset_init_pdf (cairo_truetype_subset_t *truetype_subset, + cairo_scaled_font_subset_t *font_subset) +{ + return cairo_truetype_subset_init_internal (truetype_subset, font_subset, TRUE); +} + +void +_cairo_truetype_subset_fini (cairo_truetype_subset_t *subset) +{ + free (subset->ps_name); + free (subset->family_name_utf8); + free (subset->widths); + free (subset->data); + free (subset->string_offsets); +} + +static cairo_int_status_t +_cairo_truetype_reverse_cmap (cairo_scaled_font_t *scaled_font, + unsigned long table_offset, + unsigned long index, + uint32_t *ucs4) +{ + cairo_status_t status; + const cairo_scaled_font_backend_t *backend; + tt_segment_map_t *map; + char buf[4]; + unsigned int num_segments, i; + unsigned long size; + uint16_t *start_code; + uint16_t *end_code; + uint16_t *delta; + uint16_t *range_offset; + uint16_t c; + + backend = scaled_font->backend; + size = 4; + status = backend->load_truetype_table (scaled_font, + TT_TAG_cmap, table_offset, + (unsigned char *) &buf, + &size); + if (unlikely (status)) + return status; + + /* All table formats have the same first two words */ + map = (tt_segment_map_t *) buf; + if (be16_to_cpu (map->format) != 4) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = be16_to_cpu (map->length); + map = malloc (size); + if (unlikely (map == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = backend->load_truetype_table (scaled_font, + TT_TAG_cmap, table_offset, + (unsigned char *) map, + &size); + if (unlikely (status)) + goto fail; + + num_segments = be16_to_cpu (map->segCountX2)/2; + + /* A Format 4 cmap contains 8 uint16_t numbers and 4 arrays of + * uint16_t each num_segments long. */ + if (size < (8 + 4*num_segments)*sizeof(uint16_t)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + end_code = map->endCount; + start_code = &(end_code[num_segments + 1]); + delta = &(start_code[num_segments]); + range_offset = &(delta[num_segments]); + + /* search for glyph in segments with rangeOffset=0 */ + for (i = 0; i < num_segments; i++) { + c = index - be16_to_cpu (delta[i]); + if (range_offset[i] == 0 && + c >= be16_to_cpu (start_code[i]) && + c <= be16_to_cpu (end_code[i])) + { + *ucs4 = c; + goto found; + } + } + + /* search for glyph in segments with rangeOffset=1 */ + for (i = 0; i < num_segments; i++) { + if (range_offset[i] != 0) { + uint16_t *glyph_ids = &range_offset[i] + be16_to_cpu (range_offset[i])/2; + int range_size = be16_to_cpu (end_code[i]) - be16_to_cpu (start_code[i]) + 1; + uint16_t g_id_be = cpu_to_be16 (index); + int j; + + if (range_size > 0) { + if ((char*)glyph_ids + 2*range_size > (char*)map + size) + return CAIRO_INT_STATUS_UNSUPPORTED; + + for (j = 0; j < range_size; j++) { + if (glyph_ids[j] == g_id_be) { + *ucs4 = be16_to_cpu (start_code[i]) + j; + goto found; + } + } + } + } + } + + /* glyph not found */ + *ucs4 = -1; + +found: + status = CAIRO_STATUS_SUCCESS; + +fail: + free (map); + + return status; +} + +cairo_int_status_t +_cairo_truetype_index_to_ucs4 (cairo_scaled_font_t *scaled_font, + unsigned long index, + uint32_t *ucs4) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + const cairo_scaled_font_backend_t *backend; + tt_cmap_t *cmap; + char buf[4]; + int num_tables, i; + unsigned long size; + + backend = scaled_font->backend; + if (!backend->load_truetype_table) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = 4; + status = backend->load_truetype_table (scaled_font, + TT_TAG_cmap, 0, + (unsigned char *) &buf, + &size); + if (unlikely (status)) + return status; + + cmap = (tt_cmap_t *) buf; + num_tables = be16_to_cpu (cmap->num_tables); + size = 4 + num_tables*sizeof(tt_cmap_index_t); + cmap = _cairo_malloc_ab_plus_c (num_tables, sizeof (tt_cmap_index_t), 4); + if (unlikely (cmap == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = backend->load_truetype_table (scaled_font, + TT_TAG_cmap, 0, + (unsigned char *) cmap, + &size); + if (unlikely (status)) + goto cleanup; + + /* Find a table with Unicode mapping */ + for (i = 0; i < num_tables; i++) { + if (be16_to_cpu (cmap->index[i].platform) == 3 && + be16_to_cpu (cmap->index[i].encoding) == 1) { + status = _cairo_truetype_reverse_cmap (scaled_font, + be32_to_cpu (cmap->index[i].offset), + index, + ucs4); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + break; + } + } + +cleanup: + free (cmap); + + return status; +} + +static cairo_status_t +find_name (tt_name_t *name, int name_id, int platform, int encoding, int language, char **str_out) +{ + tt_name_record_t *record; + int i, len; + char *str; + char *p; + cairo_bool_t has_tag; + cairo_status_t status; + + str = NULL; + for (i = 0; i < be16_to_cpu (name->num_records); i++) { + record = &(name->records[i]); + if (be16_to_cpu (record->name) == name_id && + be16_to_cpu (record->platform) == platform && + be16_to_cpu (record->encoding) == encoding && + (language == -1 || be16_to_cpu (record->language) == language)) { + + str = malloc (be16_to_cpu (record->length) + 1); + if (str == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + len = be16_to_cpu (record->length); + memcpy (str, + ((char*)name) + be16_to_cpu (name->strings_offset) + be16_to_cpu (record->offset), + len); + str[be16_to_cpu (record->length)] = 0; + break; + } + } + if (str == NULL) { + *str_out = NULL; + return CAIRO_STATUS_SUCCESS; + } + + if (platform == 3) { /* Win platform, unicode encoding */ + /* convert to utf8 */ + int size = 0; + char *utf8; + uint16_t *u = (uint16_t *) str; + int u_len = len/2; + + for (i = 0; i < u_len; i++) + size += _cairo_ucs4_to_utf8 (be16_to_cpu(u[i]), NULL); + + utf8 = malloc (size + 1); + if (utf8 == NULL) { + status =_cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + p = utf8; + for (i = 0; i < u_len; i++) + p += _cairo_ucs4_to_utf8 (be16_to_cpu(u[i]), p); + *p = 0; + free (str); + str = utf8; + } else if (platform == 1) { /* Mac platform, Mac Roman encoding */ + /* Replace characters above 127 with underscores. We could use + * a lookup table to convert to unicode but since most fonts + * include a unicode name this is just a rarely used fallback. */ + for (i = 0; i < len; i++) { + if ((unsigned char)str[i] > 127) + str[i] = '_'; + } + } + + /* If font name is prefixed with a PDF subset tag, strip it off. */ + p = str; + len = strlen (str); + has_tag = FALSE; + if (len > 7 && p[6] == '+') { + has_tag = TRUE; + for (i = 0; i < 6; i++) { + if (p[i] < 'A' || p[i] > 'Z') { + has_tag = FALSE; + break; + } + } + } + if (has_tag) { + p = malloc (len - 6); + if (unlikely (p == NULL)) { + status =_cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail; + } + memcpy (p, str + 7, len - 7); + p[len-7] = 0; + free (str); + str = p; + } + + *str_out = str; + + return CAIRO_STATUS_SUCCESS; + + fail: + free (str); + + return status; +} + +cairo_int_status_t +_cairo_truetype_read_font_name (cairo_scaled_font_t *scaled_font, + char **ps_name_out, + char **font_name_out) +{ + cairo_status_t status; + const cairo_scaled_font_backend_t *backend; + tt_name_t *name; + unsigned long size; + char *ps_name = NULL; + char *family_name = NULL; + + backend = scaled_font->backend; + if (!backend->load_truetype_table) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = 0; + status = backend->load_truetype_table (scaled_font, + TT_TAG_name, 0, + NULL, + &size); + if (status) + return status; + + name = malloc (size); + if (name == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = backend->load_truetype_table (scaled_font, + TT_TAG_name, 0, + (unsigned char *) name, + &size); + if (status) + goto fail; + + /* Find PS Name (name_id = 6). OT spec says PS name must be one of + * the following two encodings */ + status = find_name (name, 6, 3, 1, 0x409, &ps_name); /* win, unicode, english-us */ + if (unlikely(status)) + goto fail; + + if (!ps_name) { + status = find_name (name, 6, 1, 0, 0, &ps_name); /* mac, roman, english */ + if (unlikely(status)) + goto fail; + } + + /* Find Family name (name_id = 1) */ + status = find_name (name, 1, 3, 1, 0x409, &family_name); /* win, unicode, english-us */ + if (unlikely(status)) + goto fail; + + if (!family_name) { + status = find_name (name, 1, 3, 0, 0x409, &family_name); /* win, symbol, english-us */ + if (unlikely(status)) + goto fail; + } + + if (!family_name) { + status = find_name (name, 1, 1, 0, 0, &family_name); /* mac, roman, english */ + if (unlikely(status)) + goto fail; + } + + if (!family_name) { + status = find_name (name, 1, 3, 1, -1, &family_name); /* win, unicode, any language */ + if (unlikely(status)) + goto fail; + } + + status = _cairo_escape_ps_name (&ps_name); + if (unlikely(status)) + goto fail; + + free (name); + + *ps_name_out = ps_name; + *font_name_out = family_name; + + return CAIRO_STATUS_SUCCESS; + +fail: + free (name); + free (ps_name); + free (family_name); + *ps_name_out = NULL; + *font_name_out = NULL; + + return status; +} + +cairo_int_status_t +_cairo_truetype_get_style (cairo_scaled_font_t *scaled_font, + int *weight, + cairo_bool_t *bold, + cairo_bool_t *italic) +{ + cairo_status_t status; + const cairo_scaled_font_backend_t *backend; + tt_os2_t os2; + unsigned long size; + uint16_t selection; + + backend = scaled_font->backend; + if (!backend->load_truetype_table) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = 0; + status = backend->load_truetype_table (scaled_font, + TT_TAG_OS2, 0, + NULL, + &size); + if (status) + return status; + + if (size < sizeof(os2)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = sizeof (os2); + status = backend->load_truetype_table (scaled_font, + TT_TAG_OS2, 0, + (unsigned char *) &os2, + &size); + if (status) + return status; + + *weight = be16_to_cpu (os2.usWeightClass); + selection = be16_to_cpu (os2.fsSelection); + *bold = (selection & TT_FS_SELECTION_BOLD) ? TRUE : FALSE; + *italic = (selection & TT_FS_SELECTION_ITALIC) ? TRUE : FALSE; + + return CAIRO_STATUS_SUCCESS; +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-type1-fallback.c b/src/cairo-type1-fallback.c new file mode 100644 index 000000000..4a657413e --- /dev/null +++ b/src/cairo-type1-fallback.c @@ -0,0 +1,903 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Adrian Johnson + */ + +#define _BSD_SOURCE /* for snprintf(), strdup() */ +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-type1-private.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-output-stream-private.h" + +typedef enum { + CAIRO_CHARSTRING_TYPE1, + CAIRO_CHARSTRING_TYPE2 +} cairo_charstring_type_t; + +typedef struct _cairo_type1_font { + int *widths; + + cairo_scaled_font_subset_t *scaled_font_subset; + cairo_scaled_font_t *type1_scaled_font; + + cairo_array_t contents; + + double x_min, y_min, x_max, y_max; + + const char *data; + unsigned long header_size; + unsigned long data_size; + unsigned long trailer_size; + int bbox_position; + int bbox_max_chars; + + cairo_output_stream_t *output; + + unsigned short eexec_key; + cairo_bool_t hex_encode; + int hex_column; +} cairo_type1_font_t; + +static cairo_status_t +cairo_type1_font_create (cairo_scaled_font_subset_t *scaled_font_subset, + cairo_type1_font_t **subset_return, + cairo_bool_t hex_encode) +{ + cairo_type1_font_t *font; + cairo_font_face_t *font_face; + cairo_matrix_t font_matrix; + cairo_matrix_t ctm; + cairo_font_options_t font_options; + cairo_status_t status; + + font = calloc (1, sizeof (cairo_type1_font_t)); + if (unlikely (font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + font->widths = calloc (scaled_font_subset->num_glyphs, sizeof (int)); + if (unlikely (font->widths == NULL)) { + free (font); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + font->scaled_font_subset = scaled_font_subset; + font->hex_encode = hex_encode; + + font_face = cairo_scaled_font_get_font_face (scaled_font_subset->scaled_font); + + cairo_matrix_init_scale (&font_matrix, 1000, -1000); + cairo_matrix_init_identity (&ctm); + + _cairo_font_options_init_default (&font_options); + cairo_font_options_set_hint_style (&font_options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (&font_options, CAIRO_HINT_METRICS_OFF); + + font->type1_scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + &font_options); + status = font->type1_scaled_font->status; + if (unlikely (status)) + goto fail; + + _cairo_array_init (&font->contents, sizeof (unsigned char)); + font->output = NULL; + + *subset_return = font; + + return CAIRO_STATUS_SUCCESS; + +fail: + free (font->widths); + free (font); + + return status; +} + +/* Charstring commands. If the high byte is 0 the command is encoded + * with a single byte. */ +#define CHARSTRING_sbw 0x0c07 +#define CHARSTRING_rmoveto 0x0015 +#define CHARSTRING_rlineto 0x0005 +#define CHARSTRING_rcurveto 0x0008 +#define CHARSTRING_closepath 0x0009 +#define CHARSTRING_endchar 0x000e + +/* Before calling this function, the caller must allocate sufficient + * space in data (see _cairo_array_grow_by). The maximum number of + * bytes that will be used is 2. + */ +static void +charstring_encode_command (cairo_array_t *data, int command) +{ + cairo_status_t status; + unsigned int orig_size; + unsigned char buf[5]; + unsigned char *p = buf; + + if (command & 0xff00) + *p++ = command >> 8; + *p++ = command & 0x00ff; + + /* Ensure the array doesn't grow, which allows this function to + * have no possibility of failure. */ + orig_size = _cairo_array_size (data); + status = _cairo_array_append_multiple (data, buf, p - buf); + + assert (status == CAIRO_STATUS_SUCCESS); + assert (_cairo_array_size (data) == orig_size); +} + +/* Before calling this function, the caller must allocate sufficient + * space in data (see _cairo_array_grow_by). The maximum number of + * bytes that will be used is 5. + */ +static void +charstring_encode_integer (cairo_array_t *data, + int i, + cairo_charstring_type_t type) +{ + cairo_status_t status; + unsigned int orig_size; + unsigned char buf[10]; + unsigned char *p = buf; + + if (i >= -107 && i <= 107) { + *p++ = i + 139; + } else if (i >= 108 && i <= 1131) { + i -= 108; + *p++ = (i >> 8)+ 247; + *p++ = i & 0xff; + } else if (i >= -1131 && i <= -108) { + i = -i - 108; + *p++ = (i >> 8)+ 251; + *p++ = i & 0xff; + } else { + if (type == CAIRO_CHARSTRING_TYPE1) { + *p++ = 0xff; + *p++ = i >> 24; + *p++ = (i >> 16) & 0xff; + *p++ = (i >> 8) & 0xff; + *p++ = i & 0xff; + } else { + *p++ = 0xff; + *p++ = (i >> 8) & 0xff; + *p++ = i & 0xff; + *p++ = 0; + *p++ = 0; + } + } + + /* Ensure the array doesn't grow, which allows this function to + * have no possibility of failure. */ + orig_size = _cairo_array_size (data); + status = _cairo_array_append_multiple (data, buf, p - buf); + + assert (status == CAIRO_STATUS_SUCCESS); + assert (_cairo_array_size (data) == orig_size); +} + +typedef struct _ps_path_info { + cairo_array_t *data; + int current_x, current_y; + cairo_charstring_type_t type; +} t1_path_info_t; + +static cairo_status_t +_charstring_move_to (void *closure, + const cairo_point_t *point) +{ + t1_path_info_t *path_info = (t1_path_info_t *) closure; + int dx, dy; + cairo_status_t status; + + status = _cairo_array_grow_by (path_info->data, 12); + if (unlikely (status)) + return status; + + dx = _cairo_fixed_integer_part (point->x) - path_info->current_x; + dy = _cairo_fixed_integer_part (point->y) - path_info->current_y; + charstring_encode_integer (path_info->data, dx, path_info->type); + charstring_encode_integer (path_info->data, dy, path_info->type); + path_info->current_x += dx; + path_info->current_y += dy; + + charstring_encode_command (path_info->data, CHARSTRING_rmoveto); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_charstring_line_to (void *closure, + const cairo_point_t *point) +{ + t1_path_info_t *path_info = (t1_path_info_t *) closure; + int dx, dy; + cairo_status_t status; + + status = _cairo_array_grow_by (path_info->data, 12); + if (unlikely (status)) + return status; + + dx = _cairo_fixed_integer_part (point->x) - path_info->current_x; + dy = _cairo_fixed_integer_part (point->y) - path_info->current_y; + charstring_encode_integer (path_info->data, dx, path_info->type); + charstring_encode_integer (path_info->data, dy, path_info->type); + path_info->current_x += dx; + path_info->current_y += dy; + + charstring_encode_command (path_info->data, CHARSTRING_rlineto); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_charstring_curve_to (void *closure, + const cairo_point_t *point1, + const cairo_point_t *point2, + const cairo_point_t *point3) +{ + t1_path_info_t *path_info = (t1_path_info_t *) closure; + int dx1, dy1, dx2, dy2, dx3, dy3; + cairo_status_t status; + + status = _cairo_array_grow_by (path_info->data, 32); + if (unlikely (status)) + return status; + + dx1 = _cairo_fixed_integer_part (point1->x) - path_info->current_x; + dy1 = _cairo_fixed_integer_part (point1->y) - path_info->current_y; + dx2 = _cairo_fixed_integer_part (point2->x) - path_info->current_x - dx1; + dy2 = _cairo_fixed_integer_part (point2->y) - path_info->current_y - dy1; + dx3 = _cairo_fixed_integer_part (point3->x) - path_info->current_x - dx1 - dx2; + dy3 = _cairo_fixed_integer_part (point3->y) - path_info->current_y - dy1 - dy2; + charstring_encode_integer (path_info->data, dx1, path_info->type); + charstring_encode_integer (path_info->data, dy1, path_info->type); + charstring_encode_integer (path_info->data, dx2, path_info->type); + charstring_encode_integer (path_info->data, dy2, path_info->type); + charstring_encode_integer (path_info->data, dx3, path_info->type); + charstring_encode_integer (path_info->data, dy3, path_info->type); + path_info->current_x += dx1 + dx2 + dx3; + path_info->current_y += dy1 + dy2 + dy3; + charstring_encode_command (path_info->data, CHARSTRING_rcurveto); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_charstring_close_path (void *closure) +{ + cairo_status_t status; + t1_path_info_t *path_info = (t1_path_info_t *) closure; + + if (path_info->type == CAIRO_CHARSTRING_TYPE2) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_array_grow_by (path_info->data, 2); + if (unlikely (status)) + return status; + + charstring_encode_command (path_info->data, CHARSTRING_closepath); + + return CAIRO_STATUS_SUCCESS; +} + +static void +charstring_encrypt (cairo_array_t *data) +{ + unsigned char *d, *end; + uint16_t c, p, r; + + r = CAIRO_TYPE1_CHARSTRING_KEY; + d = (unsigned char *) _cairo_array_index (data, 0); + end = d + _cairo_array_num_elements (data); + while (d < end) { + p = *d; + c = p ^ (r >> 8); + r = (c + r) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; + *d++ = c; + } +} + +static cairo_int_status_t +cairo_type1_font_create_charstring (cairo_type1_font_t *font, + int subset_index, + int glyph_index, + cairo_charstring_type_t type, + cairo_array_t *data) +{ + cairo_int_status_t status; + cairo_scaled_glyph_t *scaled_glyph; + t1_path_info_t path_info; + cairo_text_extents_t *metrics; + cairo_bool_t emit_path = TRUE; + + /* This call may return CAIRO_INT_STATUS_UNSUPPORTED for bitmap fonts. */ + status = _cairo_scaled_glyph_lookup (font->type1_scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS| + CAIRO_SCALED_GLYPH_INFO_PATH, + &scaled_glyph); + + /* It is ok for the .notdef glyph to not have a path available. We + * just need the metrics to emit an empty glyph. */ + if (glyph_index == 0 && status == CAIRO_INT_STATUS_UNSUPPORTED) { + emit_path = FALSE; + status = _cairo_scaled_glyph_lookup (font->type1_scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + } + if (unlikely (status)) + return status; + + metrics = &scaled_glyph->metrics; + if (subset_index == 0) { + font->x_min = metrics->x_bearing; + font->y_min = metrics->y_bearing; + font->x_max = metrics->x_bearing + metrics->width; + font->y_max = metrics->y_bearing + metrics->height; + } else { + if (metrics->x_bearing < font->x_min) + font->x_min = metrics->x_bearing; + if (metrics->y_bearing < font->y_min) + font->y_min = metrics->y_bearing; + if (metrics->x_bearing + metrics->width > font->x_max) + font->x_max = metrics->x_bearing + metrics->width; + if (metrics->y_bearing + metrics->height > font->y_max) + font->y_max = metrics->y_bearing + metrics->height; + } + font->widths[subset_index] = metrics->x_advance; + + status = _cairo_array_grow_by (data, 30); + if (unlikely (status)) + return status; + + if (type == CAIRO_CHARSTRING_TYPE1) { + charstring_encode_integer (data, (int) scaled_glyph->metrics.x_bearing, type); + charstring_encode_integer (data, (int) scaled_glyph->metrics.y_bearing, type); + charstring_encode_integer (data, (int) scaled_glyph->metrics.x_advance, type); + charstring_encode_integer (data, (int) scaled_glyph->metrics.y_advance, type); + charstring_encode_command (data, CHARSTRING_sbw); + + path_info.current_x = (int) scaled_glyph->metrics.x_bearing; + path_info.current_y = (int) scaled_glyph->metrics.y_bearing; + } else { + charstring_encode_integer (data, (int) scaled_glyph->metrics.x_advance, type); + + path_info.current_x = 0; + path_info.current_y = 0; + } + path_info.data = data; + path_info.type = type; + if (emit_path) { + status = _cairo_path_fixed_interpret (scaled_glyph->path, + _charstring_move_to, + _charstring_line_to, + _charstring_curve_to, + _charstring_close_path, + &path_info); + if (unlikely (status)) + return status; + } + + status = _cairo_array_grow_by (data, 1); + if (unlikely (status)) + return status; + charstring_encode_command (path_info.data, CHARSTRING_endchar); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_type1_font_write_charstrings (cairo_type1_font_t *font, + cairo_output_stream_t *encrypted_output) +{ + cairo_status_t status; + unsigned char zeros[] = { 0, 0, 0, 0 }; + cairo_array_t data; + unsigned int i; + int length; + + _cairo_array_init (&data, sizeof (unsigned char)); + status = _cairo_array_grow_by (&data, 1024); + if (unlikely (status)) + goto fail; + + _cairo_output_stream_printf (encrypted_output, + "2 index /CharStrings %d dict dup begin\n", + font->scaled_font_subset->num_glyphs + 1); + + _cairo_scaled_font_freeze_cache (font->type1_scaled_font); + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + _cairo_array_truncate (&data, 0); + /* four "random" bytes required by encryption algorithm */ + status = _cairo_array_append_multiple (&data, zeros, 4); + if (unlikely (status)) + break; + + status = cairo_type1_font_create_charstring (font, i, + font->scaled_font_subset->glyphs[i], + CAIRO_CHARSTRING_TYPE1, + &data); + if (unlikely (status)) + break; + + charstring_encrypt (&data); + length = _cairo_array_num_elements (&data); + if (font->scaled_font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (encrypted_output, "/%s %d RD ", + font->scaled_font_subset->glyph_names[i], + length); + } else if (i == 0) { + _cairo_output_stream_printf (encrypted_output, "/.notdef %d RD ", length); + } else { + _cairo_output_stream_printf (encrypted_output, "/g%d %d RD ", i, length); + } + _cairo_output_stream_write (encrypted_output, + _cairo_array_index (&data, 0), + length); + _cairo_output_stream_printf (encrypted_output, " ND\n"); + } + _cairo_scaled_font_thaw_cache (font->type1_scaled_font); + +fail: + _cairo_array_fini (&data); + return status; +} + +static void +cairo_type1_font_write_header (cairo_type1_font_t *font, + const char *name) +{ + unsigned int i; + const char spaces[50] = " "; + + _cairo_output_stream_printf (font->output, + "%%!FontType1-1.1 %s 1.0\n" + "11 dict begin\n" + "/FontName /%s def\n" + "/PaintType 0 def\n" + "/FontType 1 def\n" + "/FontMatrix [0.001 0 0 0.001 0 0] readonly def\n", + name, + name); + + /* We don't know the bbox values until after the charstrings have + * been generated. Reserve some space and fill in the bbox + * later. */ + + /* Worst case for four signed ints with spaces between each number */ + font->bbox_max_chars = 50; + + _cairo_output_stream_printf (font->output, "/FontBBox {"); + font->bbox_position = _cairo_output_stream_get_position (font->output); + _cairo_output_stream_write (font->output, spaces, font->bbox_max_chars); + + _cairo_output_stream_printf (font->output, + "} readonly def\n" + "/Encoding 256 array\n" + "0 1 255 {1 index exch /.notdef put} for\n"); + if (font->scaled_font_subset->is_latin) { + for (i = 1; i < 256; i++) { + int subset_glyph = font->scaled_font_subset->latin_to_subset_glyph_index[i]; + + if (subset_glyph > 0) { + if (font->scaled_font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (font->output, "dup %d /%s put\n", + i, font->scaled_font_subset->glyph_names[subset_glyph]); + } else { + _cairo_output_stream_printf (font->output, "dup %d /g%d put\n", i, subset_glyph); + } + } + } + } else { + for (i = 1; i < font->scaled_font_subset->num_glyphs; i++) { + if (font->scaled_font_subset->glyph_names != NULL) { + _cairo_output_stream_printf (font->output, "dup %d /%s put\n", + i, font->scaled_font_subset->glyph_names[i]); + } else { + _cairo_output_stream_printf (font->output, "dup %d /g%d put\n", i, i); + } + } + } + _cairo_output_stream_printf (font->output, + "readonly def\n" + "currentdict end\n" + "currentfile eexec\n"); +} + +static cairo_status_t +cairo_type1_write_stream_encrypted (void *closure, + const unsigned char *data, + unsigned int length) +{ + const unsigned char *in, *end; + uint16_t c, p; + static const char hex_digits[16] = "0123456789abcdef"; + char digits[3]; + cairo_type1_font_t *font = closure; + + in = (const unsigned char *) data; + end = (const unsigned char *) data + length; + while (in < end) { + p = *in++; + c = p ^ (font->eexec_key >> 8); + font->eexec_key = (c + font->eexec_key) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; + + if (font->hex_encode) { + digits[0] = hex_digits[c >> 4]; + digits[1] = hex_digits[c & 0x0f]; + digits[2] = '\n'; + font->hex_column += 2; + + if (font->hex_column == 78) { + _cairo_output_stream_write (font->output, digits, 3); + font->hex_column = 0; + } else { + _cairo_output_stream_write (font->output, digits, 2); + } + } else { + digits[0] = c; + _cairo_output_stream_write (font->output, digits, 1); + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_type1_font_write_private_dict (cairo_type1_font_t *font, + const char *name) +{ + cairo_int_status_t status; + cairo_status_t status2; + cairo_output_stream_t *encrypted_output; + + font->eexec_key = CAIRO_TYPE1_PRIVATE_DICT_KEY; + font->hex_column = 0; + encrypted_output = _cairo_output_stream_create ( + cairo_type1_write_stream_encrypted, + NULL, + font); + if (_cairo_output_stream_get_status (encrypted_output)) + return _cairo_output_stream_destroy (encrypted_output); + + /* Note: the first four spaces at the start of this private dict + * are the four "random" bytes of plaintext required by the + * encryption algorithm */ + _cairo_output_stream_printf (encrypted_output, + " dup /Private 9 dict dup begin\n" + "/RD {string currentfile exch readstring pop}" + " bind executeonly def\n" + "/ND {noaccess def} executeonly def\n" + "/NP {noaccess put} executeonly def\n" + "/BlueValues [] def\n" + "/MinFeature {16 16} def\n" + "/lenIV 4 def\n" + "/password 5839 def\n"); + + status = cairo_type1_font_write_charstrings (font, encrypted_output); + if (unlikely (status)) + goto fail; + + _cairo_output_stream_printf (encrypted_output, + "end\n" + "end\n" + "readonly put\n" + "noaccess put\n" + "dup /FontName get exch definefont pop\n" + "mark currentfile closefile\n"); + + fail: + status2 = _cairo_output_stream_destroy (encrypted_output); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + + return status; +} + +static void +cairo_type1_font_write_trailer(cairo_type1_font_t *font) +{ + int i; + static const char zeros[65] = + "0000000000000000000000000000000000000000000000000000000000000000\n"; + + for (i = 0; i < 8; i++) + _cairo_output_stream_write (font->output, zeros, sizeof zeros); + + _cairo_output_stream_printf (font->output, "cleartomark\n"); +} + +static cairo_status_t +cairo_type1_write_stream (void *closure, + const unsigned char *data, + unsigned int length) +{ + cairo_type1_font_t *font = closure; + + return _cairo_array_append_multiple (&font->contents, data, length); +} + +static cairo_int_status_t +cairo_type1_font_write (cairo_type1_font_t *font, + const char *name) +{ + cairo_int_status_t status; + + cairo_type1_font_write_header (font, name); + font->header_size = _cairo_output_stream_get_position (font->output); + + status = cairo_type1_font_write_private_dict (font, name); + if (unlikely (status)) + return status; + + font->data_size = _cairo_output_stream_get_position (font->output) - + font->header_size; + + cairo_type1_font_write_trailer (font); + font->trailer_size = + _cairo_output_stream_get_position (font->output) - + font->header_size - font->data_size; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +cairo_type1_font_generate (cairo_type1_font_t *font, const char *name) +{ + cairo_int_status_t status; + + status = _cairo_array_grow_by (&font->contents, 4096); + if (unlikely (status)) + return status; + + font->output = _cairo_output_stream_create (cairo_type1_write_stream, NULL, font); + if (_cairo_output_stream_get_status (font->output)) + return _cairo_output_stream_destroy (font->output); + + status = cairo_type1_font_write (font, name); + if (unlikely (status)) + return status; + + font->data = _cairo_array_index (&font->contents, 0); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_type1_font_destroy (cairo_type1_font_t *font) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + free (font->widths); + cairo_scaled_font_destroy (font->type1_scaled_font); + _cairo_array_fini (&font->contents); + if (font->output) + status = _cairo_output_stream_destroy (font->output); + free (font); + + return status; +} + +static cairo_status_t +_cairo_type1_fallback_init_internal (cairo_type1_subset_t *type1_subset, + const char *name, + cairo_scaled_font_subset_t *scaled_font_subset, + cairo_bool_t hex_encode) +{ + cairo_type1_font_t *font; + cairo_status_t status; + unsigned long length; + unsigned int i, len; + + status = cairo_type1_font_create (scaled_font_subset, &font, hex_encode); + if (unlikely (status)) + return status; + + status = cairo_type1_font_generate (font, name); + if (unlikely (status)) + goto fail1; + + type1_subset->base_font = strdup (name); + if (unlikely (type1_subset->base_font == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + type1_subset->widths = calloc (sizeof (double), font->scaled_font_subset->num_glyphs); + if (unlikely (type1_subset->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail2; + } + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) + type1_subset->widths[i] = (double)font->widths[i]/1000; + + type1_subset->x_min = (double)font->x_min/1000; + type1_subset->y_min = (double)font->y_min/1000; + type1_subset->x_max = (double)font->x_max/1000; + type1_subset->y_max = (double)font->y_max/1000; + type1_subset->ascent = (double)font->y_max/1000; + type1_subset->descent = (double)font->y_min/1000; + + length = font->header_size + font->data_size + + font->trailer_size; + type1_subset->data = malloc (length); + if (unlikely (type1_subset->data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail3; + } + memcpy (type1_subset->data, + _cairo_array_index (&font->contents, 0), length); + + len = snprintf(type1_subset->data + font->bbox_position, + font->bbox_max_chars, + "%d %d %d %d", + (int)font->x_min, + (int)font->y_min, + (int)font->x_max, + (int)font->y_max); + type1_subset->data[font->bbox_position + len] = ' '; + + type1_subset->header_length = font->header_size; + type1_subset->data_length = font->data_size; + type1_subset->trailer_length = font->trailer_size; + + return cairo_type1_font_destroy (font); + + fail3: + free (type1_subset->widths); + fail2: + free (type1_subset->base_font); + fail1: + /* status is already set, ignore further errors */ + cairo_type1_font_destroy (font); + + return status; +} + +cairo_status_t +_cairo_type1_fallback_init_binary (cairo_type1_subset_t *type1_subset, + const char *name, + cairo_scaled_font_subset_t *scaled_font_subset) +{ + return _cairo_type1_fallback_init_internal (type1_subset, + name, + scaled_font_subset, FALSE); +} + +cairo_status_t +_cairo_type1_fallback_init_hex (cairo_type1_subset_t *type1_subset, + const char *name, + cairo_scaled_font_subset_t *scaled_font_subset) +{ + return _cairo_type1_fallback_init_internal (type1_subset, + name, + scaled_font_subset, TRUE); +} + +void +_cairo_type1_fallback_fini (cairo_type1_subset_t *subset) +{ + free (subset->base_font); + free (subset->widths); + free (subset->data); +} + +cairo_status_t +_cairo_type2_charstrings_init (cairo_type2_charstrings_t *type2_subset, + cairo_scaled_font_subset_t *scaled_font_subset) +{ + cairo_type1_font_t *font; + cairo_status_t status; + unsigned int i; + cairo_array_t charstring; + + status = cairo_type1_font_create (scaled_font_subset, &font, FALSE); + if (unlikely (status)) + return status; + + _cairo_array_init (&type2_subset->charstrings, sizeof (cairo_array_t)); + + type2_subset->widths = calloc (sizeof (int), font->scaled_font_subset->num_glyphs); + if (unlikely (type2_subset->widths == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto fail1; + } + + _cairo_scaled_font_freeze_cache (font->type1_scaled_font); + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + _cairo_array_init (&charstring, sizeof (unsigned char)); + status = _cairo_array_grow_by (&charstring, 32); + if (unlikely (status)) + goto fail2; + + status = cairo_type1_font_create_charstring (font, i, + font->scaled_font_subset->glyphs[i], + CAIRO_CHARSTRING_TYPE2, + &charstring); + if (unlikely (status)) + goto fail2; + + status = _cairo_array_append (&type2_subset->charstrings, &charstring); + if (unlikely (status)) + goto fail2; + } + _cairo_scaled_font_thaw_cache (font->type1_scaled_font); + + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) + type2_subset->widths[i] = font->widths[i]; + + type2_subset->x_min = (int) font->x_min; + type2_subset->y_min = (int) font->y_min; + type2_subset->x_max = (int) font->x_max; + type2_subset->y_max = (int) font->y_max; + type2_subset->ascent = (int) font->y_max; + type2_subset->descent = (int) font->y_min; + + return cairo_type1_font_destroy (font); + +fail2: + _cairo_scaled_font_thaw_cache (font->type1_scaled_font); + _cairo_array_fini (&charstring); + _cairo_type2_charstrings_fini (type2_subset); +fail1: + cairo_type1_font_destroy (font); + return status; +} + +void +_cairo_type2_charstrings_fini (cairo_type2_charstrings_t *type2_subset) +{ + unsigned int i, num_charstrings; + cairo_array_t *charstring; + + num_charstrings = _cairo_array_num_elements (&type2_subset->charstrings); + for (i = 0; i < num_charstrings; i++) { + charstring = _cairo_array_index (&type2_subset->charstrings, i); + _cairo_array_fini (charstring); + } + _cairo_array_fini (&type2_subset->charstrings); + + free (type2_subset->widths); +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-type1-glyph-names.c b/src/cairo-type1-glyph-names.c new file mode 100644 index 000000000..80ccb9626 --- /dev/null +++ b/src/cairo-type1-glyph-names.c @@ -0,0 +1,410 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + */ + +#include "cairoint.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-type1-private.h" +#include "cairo-scaled-font-subsets-private.h" + +#if 0 +/* + * The three tables that follow are generated using this perl code: + */ + +@ps_standard_encoding = ( + # 0 + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 16 + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 32 + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quoteright", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + # 48 + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + # 64 + "at", "A", "B", "C", + "D", "E", "F", "G", + "H", "I", "J", "K", + "L", "M", "N", "O", + # 80 + "P", "Q", "R", "S", + "T", "U", "V", "W", + "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + # 96 + "quoteleft", "a", "b", "c", + "d", "e", "f", "g", + "h", "i", "j", "k", + "l", "m", "n", "o", + # 112 + "p", "q", "r", "s", + "t", "u", "v", "w", + "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", NULL, + # 128 + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 144 + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 160 + NULL, "exclamdown", "cent", "sterling", + "fraction", "yen", "florin", "section", + "currency", "quotesingle", "quotedblleft", "guillemotleft", + "guilsinglleft","guilsinglright","fi", "fl", + # 176 + NULL, "endash", "dagger", "daggerdbl", + "periodcentered",NULL, "paragraph", "bullet", + "quotesinglbase","quotedblbase","quotedblright","guillemotright", + "ellipsis", "perthousand", NULL, "questiondown", + # 192 + NULL, "grave", "acute", "circumflex", + "tilde", "macron", "breve", "dotaccent", + "dieresis", NULL, "ring", "cedilla", + NULL, "hungarumlaut", "ogonek", "caron", + # 208 + "emdash", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 224 + NULL, "AE", NULL, "ordfeminine", + NULL, NULL, NULL, NULL, + "Lslash", "Oslash", "OE", "ordmasculine", + NULL, NULL, NULL, NULL, + # 240 + NULL, "ae", NULL, NULL, + NULL, "dotlessi", NULL, NULL, + "lslash", "oslash", "oe", "germandbls", + NULL, NULL, NULL, NULL + ); + +@winansi_encoding = ( + # 0 + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 16 + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + # 32 + "space", "exclam", "quotedbl", "numbersign", + "dollar", "percent", "ampersand", "quotesingle", + "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", + # 48 + "zero", "one", "two", "three", + "four", "five", "six", "seven", + "eight", "nine", "colon", "semicolon", + "less", "equal", "greater", "question", + # 64 + "at", "A", "B", "C", + "D", "E", "F", "G", + "H", "I", "J", "K", + "L", "M", "N", "O", + # 80 + "P", "Q", "R", "S", + "T", "U", "V", "W", + "X", "Y", "Z", "bracketleft", + "backslash", "bracketright", "asciicircum", "underscore", + # 96 + "grave", "a", "b", "c", + "d", "e", "f", "g", + "h", "i", "j", "k", + "l", "m", "n", "o", + # 112 + "p", "q", "r", "s", + "t", "u", "v", "w", + "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", NULL, + # 128 + "Euro", NULL, "quotesinglbase","florin", + "quotedblbase", "ellipsis", "dagger", "daggerdbl", + "circumflex", "perthousand", "Scaron", "guilsinglleft", + "OE", NULL, "Zcaron", NULL, + # 144 + NULL, "quoteleft", "quoteright", "quotedblleft", + "quotedblright","bullet", "endash", "emdash", + "tilde", "trademark", "scaron", "guilsinglright", + "oe", NULL, "zcaron", "Ydieresis", + # 160 + NULL, "exclamdown", "cent", "sterling", + "currency", "yen", "brokenbar", "section", + "dieresis", "copyright", "ordfeminine", "guillemotleft", + # 173 is also "hyphen" but we leave this NULL to avoid duplicate names + "logicalnot", NULL, "registered", "macron", + # 176 + "degree", "plusminus", "twosuperior", "threesuperior", + "acute", "mu", "paragraph", "periodcentered", + "cedilla", "onesuperior", "ordmasculine", "guillemotright", + "onequarter", "onehalf", "threequarters","questiondown", + # 192 + "Agrave", "Aacute", "Acircumflex", "Atilde", + "Adieresis", "Aring", "AE", "Ccedilla", + "Egrave", "Eacute", "Ecircumflex", "Edieresis", + "Igrave", "Iacute", "Icircumflex", "Idieresis", + # 208 + "Eth", "Ntilde", "Ograve", "Oacute", + "Ocircumflex", "Otilde", "Odieresis", "multiply", + "Oslash", "Ugrave", "Uacute", "Ucircumflex", + "Udieresis", "Yacute", "Thorn", "germandbls", + # 224 + "agrave", "aacute", "acircumflex", "atilde", + "adieresis", "aring", "ae", "ccedilla", + "egrave", "eacute", "ecircumflex", "edieresis", + "igrave", "iacute", "icircumflex", "idieresis", + # 240 + "eth", "ntilde", "ograve", "oacute", + "ocircumflex", "otilde", "odieresis", "divide", + "oslash", "ugrave", "uacute", "ucircumflex", + "udieresis", "yacute", "thorn", "ydieresis" +); + +sub print_offsets { + $s = qq(); + for $sym (@_) { + if (! ($sym eq NULL)) { + $ss = qq( $hash{$sym}/*$sym*/,); + } else { + $ss = qq( 0,); + } + if (length($s) + length($ss) > 78) { + print qq( $s\n); + $s = ""; + } + $s .= $ss; + } + print qq( $s\n); +} + +@combined = (@ps_standard_encoding, @winansi_encoding); +print "static const char glyph_name_symbol[] = {\n"; +%hash = (); +$s = qq( "\\0"); +$offset = 1; +for $sym (@combined) { + if (! ($sym eq NULL)) { + if (! exists $hash{$sym}) { + $hash{$sym} = $offset; + $offset += length($sym) + 1; + $ss = qq( "$sym\\0"); + if (length($s) + length($ss) > 78) { + print qq( $s\n); + $s = ""; + } + $s .= $ss; + } + } +} +print qq( $s\n); +print "};\n\n"; + +print "static const int16_t ps_standard_encoding_offset[256] = {\n"; +print_offsets(@ps_standard_encoding); +print "};\n"; + +print "static const int16_t winansi_encoding_offset[256] = {\n"; +print_offsets(@winansi_encoding); +print "};\n"; + +exit; +#endif + +static const char glyph_name_symbol[] = { + "\0" "space\0" "exclam\0" "quotedbl\0" "numbersign\0" "dollar\0" "percent\0" + "ampersand\0" "quoteright\0" "parenleft\0" "parenright\0" "asterisk\0" + "plus\0" "comma\0" "hyphen\0" "period\0" "slash\0" "zero\0" "one\0" "two\0" + "three\0" "four\0" "five\0" "six\0" "seven\0" "eight\0" "nine\0" "colon\0" + "semicolon\0" "less\0" "equal\0" "greater\0" "question\0" "at\0" "A\0" "B\0" + "C\0" "D\0" "E\0" "F\0" "G\0" "H\0" "I\0" "J\0" "K\0" "L\0" "M\0" "N\0" "O\0" + "P\0" "Q\0" "R\0" "S\0" "T\0" "U\0" "V\0" "W\0" "X\0" "Y\0" "Z\0" + "bracketleft\0" "backslash\0" "bracketright\0" "asciicircum\0" "underscore\0" + "quoteleft\0" "a\0" "b\0" "c\0" "d\0" "e\0" "f\0" "g\0" "h\0" "i\0" "j\0" + "k\0" "l\0" "m\0" "n\0" "o\0" "p\0" "q\0" "r\0" "s\0" "t\0" "u\0" "v\0" "w\0" + "x\0" "y\0" "z\0" "braceleft\0" "bar\0" "braceright\0" "asciitilde\0" + "exclamdown\0" "cent\0" "sterling\0" "fraction\0" "yen\0" "florin\0" + "section\0" "currency\0" "quotesingle\0" "quotedblleft\0" "guillemotleft\0" + "guilsinglleft\0" "guilsinglright\0" "fi\0" "fl\0" "endash\0" "dagger\0" + "daggerdbl\0" "periodcentered\0" "paragraph\0" "bullet\0" "quotesinglbase\0" + "quotedblbase\0" "quotedblright\0" "guillemotright\0" "ellipsis\0" + "perthousand\0" "questiondown\0" "grave\0" "acute\0" "circumflex\0" "tilde\0" + "macron\0" "breve\0" "dotaccent\0" "dieresis\0" "ring\0" "cedilla\0" + "hungarumlaut\0" "ogonek\0" "caron\0" "emdash\0" "AE\0" "ordfeminine\0" + "Lslash\0" "Oslash\0" "OE\0" "ordmasculine\0" "ae\0" "dotlessi\0" "lslash\0" + "oslash\0" "oe\0" "germandbls\0" "Euro\0" "Scaron\0" "Zcaron\0" "trademark\0" + "scaron\0" "zcaron\0" "Ydieresis\0" "brokenbar\0" "copyright\0" + "logicalnot\0" "registered\0" "degree\0" "plusminus\0" "twosuperior\0" + "threesuperior\0" "mu\0" "onesuperior\0" "onequarter\0" "onehalf\0" + "threequarters\0" "Agrave\0" "Aacute\0" "Acircumflex\0" "Atilde\0" + "Adieresis\0" "Aring\0" "Ccedilla\0" "Egrave\0" "Eacute\0" "Ecircumflex\0" + "Edieresis\0" "Igrave\0" "Iacute\0" "Icircumflex\0" "Idieresis\0" "Eth\0" + "Ntilde\0" "Ograve\0" "Oacute\0" "Ocircumflex\0" "Otilde\0" "Odieresis\0" + "multiply\0" "Ugrave\0" "Uacute\0" "Ucircumflex\0" "Udieresis\0" "Yacute\0" + "Thorn\0" "agrave\0" "aacute\0" "acircumflex\0" "atilde\0" "adieresis\0" + "aring\0" "ccedilla\0" "egrave\0" "eacute\0" "ecircumflex\0" "edieresis\0" + "igrave\0" "iacute\0" "icircumflex\0" "idieresis\0" "eth\0" "ntilde\0" + "ograve\0" "oacute\0" "ocircumflex\0" "otilde\0" "odieresis\0" "divide\0" + "ugrave\0" "uacute\0" "ucircumflex\0" "udieresis\0" "yacute\0" "thorn\0" + "ydieresis\0" +}; + +static const int16_t ps_standard_encoding_offset[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1/*space*/, 7/*exclam*/, 14/*quotedbl*/, 23/*numbersign*/, + 34/*dollar*/, 41/*percent*/, 49/*ampersand*/, 59/*quoteright*/, + 70/*parenleft*/, 80/*parenright*/, 91/*asterisk*/, 100/*plus*/, 105/*comma*/, + 111/*hyphen*/, 118/*period*/, 125/*slash*/, 131/*zero*/, 136/*one*/, + 140/*two*/, 144/*three*/, 150/*four*/, 155/*five*/, 160/*six*/, 164/*seven*/, + 170/*eight*/, 176/*nine*/, 181/*colon*/, 187/*semicolon*/, 197/*less*/, + 202/*equal*/, 208/*greater*/, 216/*question*/, 225/*at*/, 228/*A*/, 230/*B*/, + 232/*C*/, 234/*D*/, 236/*E*/, 238/*F*/, 240/*G*/, 242/*H*/, 244/*I*/, + 246/*J*/, 248/*K*/, 250/*L*/, 252/*M*/, 254/*N*/, 256/*O*/, 258/*P*/, + 260/*Q*/, 262/*R*/, 264/*S*/, 266/*T*/, 268/*U*/, 270/*V*/, 272/*W*/, + 274/*X*/, 276/*Y*/, 278/*Z*/, 280/*bracketleft*/, 292/*backslash*/, + 302/*bracketright*/, 315/*asciicircum*/, 327/*underscore*/, 338/*quoteleft*/, + 348/*a*/, 350/*b*/, 352/*c*/, 354/*d*/, 356/*e*/, 358/*f*/, 360/*g*/, + 362/*h*/, 364/*i*/, 366/*j*/, 368/*k*/, 370/*l*/, 372/*m*/, 374/*n*/, + 376/*o*/, 378/*p*/, 380/*q*/, 382/*r*/, 384/*s*/, 386/*t*/, 388/*u*/, + 390/*v*/, 392/*w*/, 394/*x*/, 396/*y*/, 398/*z*/, 400/*braceleft*/, + 410/*bar*/, 414/*braceright*/, 425/*asciitilde*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 436/*exclamdown*/, 447/*cent*/, 452/*sterling*/, 461/*fraction*/, 470/*yen*/, + 474/*florin*/, 481/*section*/, 489/*currency*/, 498/*quotesingle*/, + 510/*quotedblleft*/, 523/*guillemotleft*/, 537/*guilsinglleft*/, + 551/*guilsinglright*/, 566/*fi*/, 569/*fl*/, 0, 572/*endash*/, 579/*dagger*/, + 586/*daggerdbl*/, 596/*periodcentered*/, 0, 611/*paragraph*/, 621/*bullet*/, + 628/*quotesinglbase*/, 643/*quotedblbase*/, 656/*quotedblright*/, + 670/*guillemotright*/, 685/*ellipsis*/, 694/*perthousand*/, 0, + 706/*questiondown*/, 0, 719/*grave*/, 725/*acute*/, 731/*circumflex*/, + 742/*tilde*/, 748/*macron*/, 755/*breve*/, 761/*dotaccent*/, 771/*dieresis*/, + 0, 780/*ring*/, 785/*cedilla*/, 0, 793/*hungarumlaut*/, 806/*ogonek*/, + 813/*caron*/, 819/*emdash*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 826/*AE*/, 0, 829/*ordfeminine*/, 0, 0, 0, 0, 841/*Lslash*/, 848/*Oslash*/, + 855/*OE*/, 858/*ordmasculine*/, 0, 0, 0, 0, 0, 871/*ae*/, 0, 0, 0, + 874/*dotlessi*/, 0, 0, 883/*lslash*/, 890/*oslash*/, 897/*oe*/, + 900/*germandbls*/, 0, 0, 0, 0, +}; + +static const int16_t winansi_encoding_offset[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1/*space*/, 7/*exclam*/, 14/*quotedbl*/, 23/*numbersign*/, + 34/*dollar*/, 41/*percent*/, 49/*ampersand*/, 498/*quotesingle*/, + 70/*parenleft*/, 80/*parenright*/, 91/*asterisk*/, 100/*plus*/, 105/*comma*/, + 111/*hyphen*/, 118/*period*/, 125/*slash*/, 131/*zero*/, 136/*one*/, + 140/*two*/, 144/*three*/, 150/*four*/, 155/*five*/, 160/*six*/, 164/*seven*/, + 170/*eight*/, 176/*nine*/, 181/*colon*/, 187/*semicolon*/, 197/*less*/, + 202/*equal*/, 208/*greater*/, 216/*question*/, 225/*at*/, 228/*A*/, 230/*B*/, + 232/*C*/, 234/*D*/, 236/*E*/, 238/*F*/, 240/*G*/, 242/*H*/, 244/*I*/, + 246/*J*/, 248/*K*/, 250/*L*/, 252/*M*/, 254/*N*/, 256/*O*/, 258/*P*/, + 260/*Q*/, 262/*R*/, 264/*S*/, 266/*T*/, 268/*U*/, 270/*V*/, 272/*W*/, + 274/*X*/, 276/*Y*/, 278/*Z*/, 280/*bracketleft*/, 292/*backslash*/, + 302/*bracketright*/, 315/*asciicircum*/, 327/*underscore*/, 719/*grave*/, + 348/*a*/, 350/*b*/, 352/*c*/, 354/*d*/, 356/*e*/, 358/*f*/, 360/*g*/, + 362/*h*/, 364/*i*/, 366/*j*/, 368/*k*/, 370/*l*/, 372/*m*/, 374/*n*/, + 376/*o*/, 378/*p*/, 380/*q*/, 382/*r*/, 384/*s*/, 386/*t*/, 388/*u*/, + 390/*v*/, 392/*w*/, 394/*x*/, 396/*y*/, 398/*z*/, 400/*braceleft*/, + 410/*bar*/, 414/*braceright*/, 425/*asciitilde*/, 0, 911/*Euro*/, 0, + 628/*quotesinglbase*/, 474/*florin*/, 643/*quotedblbase*/, 685/*ellipsis*/, + 579/*dagger*/, 586/*daggerdbl*/, 731/*circumflex*/, 694/*perthousand*/, + 916/*Scaron*/, 537/*guilsinglleft*/, 855/*OE*/, 0, 923/*Zcaron*/, 0, 0, + 338/*quoteleft*/, 59/*quoteright*/, 510/*quotedblleft*/, + 656/*quotedblright*/, 621/*bullet*/, 572/*endash*/, 819/*emdash*/, + 742/*tilde*/, 930/*trademark*/, 940/*scaron*/, 551/*guilsinglright*/, + 897/*oe*/, 0, 947/*zcaron*/, 954/*Ydieresis*/, 0, 436/*exclamdown*/, + 447/*cent*/, 452/*sterling*/, 489/*currency*/, 470/*yen*/, 964/*brokenbar*/, + 481/*section*/, 771/*dieresis*/, 974/*copyright*/, 829/*ordfeminine*/, + 523/*guillemotleft*/, 984/*logicalnot*/, 0, 995/*registered*/, 748/*macron*/, + 1006/*degree*/, 1013/*plusminus*/, 1023/*twosuperior*/, + 1035/*threesuperior*/, 725/*acute*/, 1049/*mu*/, 611/*paragraph*/, + 596/*periodcentered*/, 785/*cedilla*/, 1052/*onesuperior*/, + 858/*ordmasculine*/, 670/*guillemotright*/, 1064/*onequarter*/, + 1075/*onehalf*/, 1083/*threequarters*/, 706/*questiondown*/, 1097/*Agrave*/, + 1104/*Aacute*/, 1111/*Acircumflex*/, 1123/*Atilde*/, 1130/*Adieresis*/, + 1140/*Aring*/, 826/*AE*/, 1146/*Ccedilla*/, 1155/*Egrave*/, 1162/*Eacute*/, + 1169/*Ecircumflex*/, 1181/*Edieresis*/, 1191/*Igrave*/, 1198/*Iacute*/, + 1205/*Icircumflex*/, 1217/*Idieresis*/, 1227/*Eth*/, 1231/*Ntilde*/, + 1238/*Ograve*/, 1245/*Oacute*/, 1252/*Ocircumflex*/, 1264/*Otilde*/, + 1271/*Odieresis*/, 1281/*multiply*/, 848/*Oslash*/, 1290/*Ugrave*/, + 1297/*Uacute*/, 1304/*Ucircumflex*/, 1316/*Udieresis*/, 1326/*Yacute*/, + 1333/*Thorn*/, 900/*germandbls*/, 1339/*agrave*/, 1346/*aacute*/, + 1353/*acircumflex*/, 1365/*atilde*/, 1372/*adieresis*/, 1382/*aring*/, + 871/*ae*/, 1388/*ccedilla*/, 1397/*egrave*/, 1404/*eacute*/, + 1411/*ecircumflex*/, 1423/*edieresis*/, 1433/*igrave*/, 1440/*iacute*/, + 1447/*icircumflex*/, 1459/*idieresis*/, 1469/*eth*/, 1473/*ntilde*/, + 1480/*ograve*/, 1487/*oacute*/, 1494/*ocircumflex*/, 1506/*otilde*/, + 1513/*odieresis*/, 1523/*divide*/, 890/*oslash*/, 1530/*ugrave*/, + 1537/*uacute*/, 1544/*ucircumflex*/, 1556/*udieresis*/, 1566/*yacute*/, + 1573/*thorn*/, 1579/*ydieresis*/, +}; + +const char * +_cairo_ps_standard_encoding_to_glyphname (int glyph) +{ + if (ps_standard_encoding_offset[glyph]) + return glyph_name_symbol + ps_standard_encoding_offset[glyph]; + else + return NULL; +} + +const char * +_cairo_winansi_to_glyphname (int glyph) +{ + if (winansi_encoding_offset[glyph]) + return glyph_name_symbol + winansi_encoding_offset[glyph]; + else + return NULL; +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-type1-private.h b/src/cairo-type1-private.h new file mode 100644 index 000000000..1630397bc --- /dev/null +++ b/src/cairo-type1-private.h @@ -0,0 +1,51 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Adrian Johnson + */ + +#ifndef CAIRO_TYPE1_PRIVATE_H +#define CAIRO_TYPE1_PRIVATE_H + +#include "cairoint.h" + +#if CAIRO_HAS_FONT_SUBSET + +/* Magic constants for the type1 eexec encryption */ +#define CAIRO_TYPE1_ENCRYPT_C1 ((unsigned short) 52845) +#define CAIRO_TYPE1_ENCRYPT_C2 ((unsigned short) 22719) +#define CAIRO_TYPE1_PRIVATE_DICT_KEY ((unsigned short) 55665) +#define CAIRO_TYPE1_CHARSTRING_KEY ((unsigned short) 4330) + +#endif /* CAIRO_HAS_FONT_SUBSET */ + +#endif /* CAIRO_TYPE1_PRIVATE_H */ diff --git a/src/cairo-type1-subset.c b/src/cairo-type1-subset.c new file mode 100644 index 000000000..b15663509 --- /dev/null +++ b/src/cairo-type1-subset.c @@ -0,0 +1,1821 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + */ + +/* + * Useful links: + * http://partners.adobe.com/public/developer/en/font/T1_SPEC.PDF + */ + + +#define _BSD_SOURCE /* for snprintf(), strdup() */ +#include "cairoint.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-type1-private.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-output-stream-private.h" + +#include + +#define TYPE1_STACKSIZE 24 /* Defined in Type 1 Font Format */ + + +typedef struct { + int subset_index; + double width; + const char *encrypted_charstring; + int encrypted_charstring_length; +} glyph_data_t; + +typedef struct _cairo_type1_font_subset { + cairo_scaled_font_subset_t *scaled_font_subset; + + struct { + unsigned int font_id; + char *base_font; + unsigned int num_glyphs; + double x_min, y_min, x_max, y_max; + double ascent, descent; + double units_per_em; + + const char *data; + unsigned long header_size; + unsigned long data_size; + unsigned long trailer_size; + } base; + + int num_glyphs; + + /* The glyphs and glyph_names arrays are indexed by the order of + * the Charstrings in the font. This is not necessarily the same + * order as the glyph index. The index_to_glyph_name() font backend + * function is used to map the glyph index to the glyph order in + * the Charstrings. */ + + glyph_data_t *glyphs; + char **glyph_names; + cairo_array_t glyphs_array; + cairo_array_t glyph_names_array; + + int num_subrs; + cairo_bool_t subset_subrs; + struct { + const char *subr_string; + int subr_length; + const char *np; + int np_length; + cairo_bool_t used; + } *subrs; + + /* Indexed by subset_index this maps to the glyph order in the + * glyph_names and glyphs arrays. Has font->num_golyphs + * elements. */ + int *subset_index_to_glyphs; + + cairo_output_stream_t *output; + cairo_array_t contents; + + const char *rd, *nd, *np; + + int lenIV; + + char *type1_data; + unsigned int type1_length; + char *type1_end; + + char *header_segment; + int header_segment_size; + char *eexec_segment; + int eexec_segment_size; + cairo_bool_t eexec_segment_is_ascii; + + char *cleartext; + char *cleartext_end; + + int header_size; + + unsigned short eexec_key; + cairo_bool_t hex_encode; + int hex_column; + + struct { + double stack[TYPE1_STACKSIZE]; + int sp; + } build_stack; + + struct { + int stack[TYPE1_STACKSIZE]; + int sp; + } ps_stack; + + +} cairo_type1_font_subset_t; + + +static cairo_status_t +_cairo_type1_font_subset_init (cairo_type1_font_subset_t *font, + cairo_scaled_font_subset_t *scaled_font_subset, + cairo_bool_t hex_encode) +{ + memset (font, 0, sizeof (*font)); + font->scaled_font_subset = scaled_font_subset; + + _cairo_array_init (&font->glyphs_array, sizeof (glyph_data_t)); + _cairo_array_init (&font->glyph_names_array, sizeof (char *)); + font->subset_index_to_glyphs = NULL; + font->base.num_glyphs = 0; + font->num_subrs = 0; + font->subset_subrs = TRUE; + font->subrs = NULL; + + font->hex_encode = hex_encode; + font->num_glyphs = 0; + + _cairo_array_init (&font->contents, sizeof (char)); + + return CAIRO_STATUS_SUCCESS; +} + +static void +cairo_type1_font_subset_use_glyph (cairo_type1_font_subset_t *font, int glyph) +{ + if (font->glyphs[glyph].subset_index >= 0) + return; + + font->glyphs[glyph].subset_index = font->num_glyphs; + font->subset_index_to_glyphs[font->num_glyphs] = glyph; + font->num_glyphs++; +} + +static cairo_bool_t +is_ps_delimiter(int c) +{ + static const char delimiters[] = "()[]{}<>/% \t\r\n"; + + return strchr (delimiters, c) != NULL; +} + +static const char * +find_token (const char *buffer, const char *end, const char *token) +{ + int i, length; + /* FIXME: find substring really must be find_token */ + + if (buffer == NULL) + return NULL; + + length = strlen (token); + for (i = 0; buffer + i < end - length + 1; i++) + if (memcmp (buffer + i, token, length) == 0) + if ((i == 0 || token[0] == '/' || is_ps_delimiter(buffer[i - 1])) && + (buffer + i == end - length || is_ps_delimiter(buffer[i + length]))) + return buffer + i; + + return NULL; +} + +static cairo_status_t +cairo_type1_font_subset_find_segments (cairo_type1_font_subset_t *font) +{ + unsigned char *p; + const char *eexec_token; + int size, i; + + p = (unsigned char *) font->type1_data; + font->type1_end = font->type1_data + font->type1_length; + if (p[0] == 0x80 && p[1] == 0x01) { + font->header_segment_size = + p[2] | (p[3] << 8) | (p[4] << 16) | (p[5] << 24); + font->header_segment = (char *) p + 6; + + p += 6 + font->header_segment_size; + font->eexec_segment_size = + p[2] | (p[3] << 8) | (p[4] << 16) | (p[5] << 24); + font->eexec_segment = (char *) p + 6; + font->eexec_segment_is_ascii = (p[1] == 1); + + p += 6 + font->eexec_segment_size; + while (p < (unsigned char *) (font->type1_end) && p[1] != 0x03) { + size = p[2] | (p[3] << 8) | (p[4] << 16) | (p[5] << 24); + p += 6 + size; + } + font->type1_end = (char *) p; + } else { + eexec_token = find_token ((char *) p, font->type1_end, "eexec"); + if (eexec_token == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + font->header_segment_size = eexec_token - (char *) p + strlen ("eexec\n"); + font->header_segment = (char *) p; + font->eexec_segment_size = font->type1_length - font->header_segment_size; + font->eexec_segment = (char *) p + font->header_segment_size; + font->eexec_segment_is_ascii = TRUE; + for (i = 0; i < 4; i++) { + if (!isxdigit(font->eexec_segment[i])) + font->eexec_segment_is_ascii = FALSE; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +/* Search for the definition of key and erase it by overwriting with spaces. + * This function is looks for definitions of the form: + * + * /key1 1234 def + * /key2 [12 34 56] def + * + * ie a key defined as an integer or array of integers. + * + */ +static void +cairo_type1_font_erase_dict_key (cairo_type1_font_subset_t *font, + const char *key) +{ + const char *start, *p, *segment_end; + + segment_end = font->header_segment + font->header_segment_size; + + start = font->header_segment; + do { + start = find_token (start, segment_end, key); + if (start) { + p = start + strlen(key); + /* skip integers or array of integers */ + while (p < segment_end && + (_cairo_isspace(*p) || + _cairo_isdigit(*p) || + *p == '[' || + *p == ']')) + { + p++; + } + + if (p + 3 < segment_end && memcmp(p, "def", 3) == 0) { + /* erase definition of the key */ + memset((char *) start, ' ', p + 3 - start); + } + start += strlen(key); + } + } while (start); +} + +static cairo_status_t +cairo_type1_font_subset_get_matrix (cairo_type1_font_subset_t *font, + const char *name, + double *a, + double *b, + double *c, + double *d) +{ + const char *start, *end, *segment_end; + int ret, s_max, i, j; + char *s; + const char *decimal_point; + int decimal_point_len; + + decimal_point = cairo_get_locale_decimal_point (); + decimal_point_len = strlen (decimal_point); + + assert (decimal_point_len != 0); + + segment_end = font->header_segment + font->header_segment_size; + start = find_token (font->header_segment, segment_end, name); + if (start == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + end = find_token (start, segment_end, "def"); + if (end == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + s_max = end - start + 5*decimal_point_len + 1; + s = malloc (s_max); + if (unlikely (s == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + i = 0; + j = 0; + while (i < end - start && j < s_max - decimal_point_len) { + if (start[i] == '.') { + strncpy(s + j, decimal_point, decimal_point_len); + i++; + j += decimal_point_len; + } else { + s[j++] = start[i++]; + } + } + s[j] = 0; + + start = strpbrk (s, "{["); + if (!start) { + free (s); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + start++; + ret = 0; + if (*start) + ret = sscanf(start, "%lf %lf %lf %lf", a, b, c, d); + + free (s); + + if (ret != 4) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_type1_font_subset_get_bbox (cairo_type1_font_subset_t *font) +{ + cairo_status_t status; + double x_min, y_min, x_max, y_max; + double xx, yx, xy, yy; + + status = cairo_type1_font_subset_get_matrix (font, "/FontBBox", + &x_min, + &y_min, + &x_max, + &y_max); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_get_matrix (font, "/FontMatrix", + &xx, &yx, &xy, &yy); + if (unlikely (status)) + return status; + + if (yy == 0.0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Freetype uses 1/yy to get units per EM */ + font->base.units_per_em = 1.0/yy; + + font->base.x_min = x_min / font->base.units_per_em; + font->base.y_min = y_min / font->base.units_per_em; + font->base.x_max = x_max / font->base.units_per_em; + font->base.y_max = y_max / font->base.units_per_em; + font->base.ascent = font->base.y_max; + font->base.descent = font->base.y_min; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_type1_font_subset_get_fontname (cairo_type1_font_subset_t *font) +{ + const char *start, *end, *segment_end; + char *s; + int i; + cairo_status_t status; + + segment_end = font->header_segment + font->header_segment_size; + start = find_token (font->header_segment, segment_end, "/FontName"); + if (start == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + start += strlen ("/FontName"); + + end = find_token (start, segment_end, "def"); + if (end == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + while (end > start && _cairo_isspace(end[-1])) + end--; + + s = malloc (end - start + 1); + if (unlikely (s == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + strncpy (s, start, end - start); + s[end - start] = 0; + + start = strchr (s, '/'); + if (!start++ || !start) { + free (s); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* If font name is prefixed with a subset tag, strip it off. */ + if (strlen(start) > 7 && start[6] == '+') { + for (i = 0; i < 6; i++) { + if (start[i] < 'A' || start[i] > 'Z') + break; + } + if (i == 6) + start += 7; + } + + font->base.base_font = strdup (start); + free (s); + if (unlikely (font->base.base_font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_escape_ps_name (&font->base.base_font); + + return status; +} + +static cairo_status_t +cairo_type1_font_subset_write_header (cairo_type1_font_subset_t *font, + const char *name) +{ + const char *start, *end, *segment_end; + unsigned int i; + + /* FIXME: + * This function assumes that /FontName always appears + * before /Encoding. This appears to always be the case with Type1 + * fonts. + * + * The more recently added code for removing the UniqueID and XUID + * keys can not make any assumptions about the position of the + * keys in the dictionary so it is implemented by overwriting the + * key definition with spaces before we start copying the font to + * the output. + * + * This code should be rewritten to not make any assumptions about + * the order of dictionary keys. This will allow UniqueID to be + * stripped out instead of leaving a bunch of spaces in the + * output. + */ + cairo_type1_font_erase_dict_key (font, "/UniqueID"); + cairo_type1_font_erase_dict_key (font, "/XUID"); + + segment_end = font->header_segment + font->header_segment_size; + + /* Type 1 fonts created by Fontforge have some PostScript code at + * the start of the font that skips the font if the printer has a + * cached copy of the font with the same unique id. This breaks + * our subsetted font so we disable it by searching for the + * PostScript operator "known" when used to check for the + * "/UniqueID" dictionary key. We append " pop false " after it to + * pop the result of this check off the stack and replace it with + * "false" to make the PostScript code think "/UniqueID" does not + * exist. + */ + end = font->header_segment; + start = find_token (font->header_segment, segment_end, "/UniqueID"); + if (start) { + start += 9; + while (start < segment_end && _cairo_isspace (*start)) + start++; + if (start + 5 < segment_end && memcmp(start, "known", 5) == 0) { + _cairo_output_stream_write (font->output, font->header_segment, + start + 5 - font->header_segment); + _cairo_output_stream_printf (font->output, " pop false "); + end = start + 5; + } + } + + start = find_token (end, segment_end, "/FontName"); + if (start == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_output_stream_write (font->output, end, + start - end); + + _cairo_output_stream_printf (font->output, "/FontName /%s def", name); + + end = find_token (start, segment_end, "def"); + if (end == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + end += 3; + + start = find_token (end, segment_end, "/Encoding"); + if (start == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + _cairo_output_stream_write (font->output, end, start - end); + + _cairo_output_stream_printf (font->output, + "/Encoding 256 array\n" + "0 1 255 {1 index exch /.notdef put} for\n"); + if (font->scaled_font_subset->is_latin) { + for (i = 1; i < 256; i++) { + int subset_glyph = font->scaled_font_subset->latin_to_subset_glyph_index[i]; + + if (subset_glyph > 0) { + _cairo_output_stream_printf (font->output, + "dup %d /%s put\n", + i, + _cairo_winansi_to_glyphname (i)); + } + } + } else { + for (i = 0; i < font->base.num_glyphs; i++) { + if (font->glyphs[i].subset_index <= 0) + continue; + _cairo_output_stream_printf (font->output, + "dup %d /%s put\n", + font->glyphs[i].subset_index, + font->glyph_names[i]); + } + } + _cairo_output_stream_printf (font->output, "readonly def"); + + end = find_token (start, segment_end, "def"); + if (end == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + end += 3; + + /* There are some buggy fonts that contain more than one /Encoding */ + if (find_token (end, segment_end, "/Encoding")) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_output_stream_write (font->output, end, segment_end - end); + + return font->output->status; +} + +static int +hex_to_int (int ch) +{ + if (ch <= '9') + return ch - '0'; + else if (ch <= 'F') + return ch - 'A' + 10; + else + return ch - 'a' + 10; +} + +static cairo_status_t +cairo_type1_font_subset_write_encrypted (cairo_type1_font_subset_t *font, + const char *data, unsigned int length) +{ + const unsigned char *in, *end; + int c, p; + static const char hex_digits[16] = "0123456789abcdef"; + char digits[3]; + + in = (const unsigned char *) data; + end = (const unsigned char *) data + length; + while (in < end) { + p = *in++; + c = p ^ (font->eexec_key >> 8); + font->eexec_key = (c + font->eexec_key) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; + + if (font->hex_encode) { + digits[0] = hex_digits[c >> 4]; + digits[1] = hex_digits[c & 0x0f]; + digits[2] = '\n'; + font->hex_column += 2; + + if (font->hex_column == 78) { + _cairo_output_stream_write (font->output, digits, 3); + font->hex_column = 0; + } else { + _cairo_output_stream_write (font->output, digits, 2); + } + } else { + digits[0] = c; + _cairo_output_stream_write (font->output, digits, 1); + } + } + + return font->output->status; +} + +static cairo_status_t +cairo_type1_font_subset_decrypt_eexec_segment (cairo_type1_font_subset_t *font) +{ + unsigned short r = CAIRO_TYPE1_PRIVATE_DICT_KEY; + unsigned char *in, *end; + char *out; + int c, p; + int i; + + in = (unsigned char *) font->eexec_segment; + end = (unsigned char *) in + font->eexec_segment_size; + + font->cleartext = malloc (font->eexec_segment_size + 1); + if (unlikely (font->cleartext == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + out = font->cleartext; + while (in < end) { + if (font->eexec_segment_is_ascii) { + c = *in++; + if (_cairo_isspace (c)) + continue; + c = (hex_to_int (c) << 4) | hex_to_int (*in++); + } else { + c = *in++; + } + p = c ^ (r >> 8); + r = (c + r) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; + + *out++ = p; + } + font->cleartext_end = out; + + /* Overwrite random bytes with spaces. + * + * The first 4 bytes of the cleartext are the random bytes + * required by the encryption algorithm. When encrypting the + * cleartext, the first ciphertext byte must not be a white space + * character and the first 4 bytes must not be an ASCII Hex + * character. Some fonts do not check that their randomly chosen + * bytes results in ciphertext that complies with this + * restriction. This may cause problems for some PDF consumers. By + * replacing the random bytes with spaces, the first four bytes of + * ciphertext will always be 0xf9, 0x83, 0xef, 0x00 which complies + * with this restriction. Using spaces also means we don't have to + * skip over the random bytes when parsing the cleartext. + */ + for (i = 0; i < 4 && i < font->eexec_segment_size; i++) + font->cleartext[i] = ' '; + + /* Ensure strtol() can not scan past the end of the cleartext */ + font->cleartext[font->eexec_segment_size] = 0; + + return CAIRO_STATUS_SUCCESS; +} + +static const char * +skip_token (const char *p, const char *end) +{ + while (p < end && _cairo_isspace(*p)) + p++; + + while (p < end && !_cairo_isspace(*p)) + p++; + + if (p == end) + return NULL; + + return p; +} + +static void +cairo_type1_font_subset_decrypt_charstring (const unsigned char *in, int size, unsigned char *out) +{ + unsigned short r = CAIRO_TYPE1_CHARSTRING_KEY; + int c, p, i; + + for (i = 0; i < size; i++) { + c = *in++; + p = c ^ (r >> 8); + r = (c + r) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; + *out++ = p; + } +} + +static const unsigned char * +cairo_type1_font_subset_decode_integer (const unsigned char *p, int *integer) +{ + if (*p <= 246) { + *integer = *p++ - 139; + } else if (*p <= 250) { + *integer = (p[0] - 247) * 256 + p[1] + 108; + p += 2; + } else if (*p <= 254) { + *integer = -(p[0] - 251) * 256 - p[1] - 108; + p += 2; + } else { + *integer = (p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4]; + p += 5; + } + + return p; +} + +static cairo_status_t +use_standard_encoding_glyph (cairo_type1_font_subset_t *font, int index) +{ + const char *glyph_name; + unsigned int i; + + if (index < 0 || index > 255) + return CAIRO_STATUS_SUCCESS; + + glyph_name = _cairo_ps_standard_encoding_to_glyphname (index); + if (glyph_name == NULL) + return CAIRO_STATUS_SUCCESS; + + for (i = 0; i < font->base.num_glyphs; i++) { + if (font->glyph_names[i] && strcmp (font->glyph_names[i], glyph_name) == 0) { + cairo_type1_font_subset_use_glyph (font, i); + + return CAIRO_STATUS_SUCCESS; + } + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + + +#define TYPE1_CHARSTRING_COMMAND_HSTEM 0x01 +#define TYPE1_CHARSTRING_COMMAND_VSTEM 0x03 +#define TYPE1_CHARSTRING_COMMAND_VMOVETO 0x04 +#define TYPE1_CHARSTRING_COMMAND_RLINETO 0x05 +#define TYPE1_CHARSTRING_COMMAND_HLINETO 0x06 +#define TYPE1_CHARSTRING_COMMAND_VLINETO 0x07 +#define TYPE1_CHARSTRING_COMMAND_RRCURVETO 0x08 +#define TYPE1_CHARSTRING_COMMAND_CLOSEPATH 0x09 +#define TYPE1_CHARSTRING_COMMAND_CALLSUBR 0x0a +#define TYPE1_CHARSTRING_COMMAND_RETURN 0x0b +#define TYPE1_CHARSTRING_COMMAND_ESCAPE 0x0c +#define TYPE1_CHARSTRING_COMMAND_HSBW 0x0d +#define TYPE1_CHARSTRING_COMMAND_ENDCHAR 0x0e +#define TYPE1_CHARSTRING_COMMAND_RMOVETO 0x15 +#define TYPE1_CHARSTRING_COMMAND_HMOVETO 0x16 +#define TYPE1_CHARSTRING_COMMAND_VHCURVETO 0x1e +#define TYPE1_CHARSTRING_COMMAND_HVCURVETO 0x1f +#define TYPE1_CHARSTRING_COMMAND_DOTSECTION 0x0c00 +#define TYPE1_CHARSTRING_COMMAND_VSTEM3 0x0c01 +#define TYPE1_CHARSTRING_COMMAND_HSTEM3 0x0c02 +#define TYPE1_CHARSTRING_COMMAND_SEAC 0x0c06 +#define TYPE1_CHARSTRING_COMMAND_SBW 0x0c07 +#define TYPE1_CHARSTRING_COMMAND_DIV 0x0c0c +#define TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR 0x0c10 +#define TYPE1_CHARSTRING_COMMAND_POP 0x0c11 +#define TYPE1_CHARSTRING_COMMAND_SETCURRENTPOINT 0x0c21 + +/* Parse the charstring, including recursing into subroutines. Find + * the glyph width, subroutines called, and glyphs required by the + * SEAC operator. */ +static cairo_status_t +cairo_type1_font_subset_parse_charstring (cairo_type1_font_subset_t *font, + int glyph, + const char *encrypted_charstring, + int encrypted_charstring_length) +{ + cairo_status_t status; + unsigned char *charstring; + const unsigned char *end; + const unsigned char *p; + int command; + + charstring = malloc (encrypted_charstring_length); + if (unlikely (charstring == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cairo_type1_font_subset_decrypt_charstring ((const unsigned char *) + encrypted_charstring, + encrypted_charstring_length, + charstring); + end = charstring + encrypted_charstring_length; + p = charstring + font->lenIV; + status = CAIRO_STATUS_SUCCESS; + while (p < end) { + if (*p < 32) { + command = *p++; + switch (command) { + case TYPE1_CHARSTRING_COMMAND_HSTEM: + case TYPE1_CHARSTRING_COMMAND_VSTEM: + case TYPE1_CHARSTRING_COMMAND_VMOVETO: + case TYPE1_CHARSTRING_COMMAND_RLINETO: + case TYPE1_CHARSTRING_COMMAND_HLINETO: + case TYPE1_CHARSTRING_COMMAND_VLINETO: + case TYPE1_CHARSTRING_COMMAND_RRCURVETO: + case TYPE1_CHARSTRING_COMMAND_CLOSEPATH: + case TYPE1_CHARSTRING_COMMAND_RMOVETO: + case TYPE1_CHARSTRING_COMMAND_HMOVETO: + case TYPE1_CHARSTRING_COMMAND_VHCURVETO: + case TYPE1_CHARSTRING_COMMAND_HVCURVETO: + case TYPE1_CHARSTRING_COMMAND_RETURN: + case TYPE1_CHARSTRING_COMMAND_ENDCHAR: + default: + /* stack clearing operator */ + font->build_stack.sp = 0; + break; + + case TYPE1_CHARSTRING_COMMAND_CALLSUBR: + if (font->subset_subrs && font->build_stack.sp > 0) { + double int_val; + if (modf(font->build_stack.stack[--font->build_stack.sp], &int_val) == 0.0) { + int subr_num = int_val; + if (subr_num >= 0 && subr_num < font->num_subrs) { + font->subrs[subr_num].used = TRUE; + status = cairo_type1_font_subset_parse_charstring ( + font, + glyph, + font->subrs[subr_num].subr_string, + font->subrs[subr_num].subr_length); + break; + } + } + } + font->subset_subrs = FALSE; + break; + + case TYPE1_CHARSTRING_COMMAND_HSBW: + if (font->build_stack.sp < 2) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + + font->glyphs[glyph].width = font->build_stack.stack[1]/font->base.units_per_em; + font->build_stack.sp = 0; + break; + + case TYPE1_CHARSTRING_COMMAND_ESCAPE: + command = command << 8 | *p++; + switch (command) { + case TYPE1_CHARSTRING_COMMAND_DOTSECTION: + case TYPE1_CHARSTRING_COMMAND_VSTEM3: + case TYPE1_CHARSTRING_COMMAND_HSTEM3: + case TYPE1_CHARSTRING_COMMAND_SETCURRENTPOINT: + default: + /* stack clearing operator */ + font->build_stack.sp = 0; + break; + + case TYPE1_CHARSTRING_COMMAND_SEAC: + /* The seac command takes five integer arguments. The + * last two are glyph indices into the PS standard + * encoding give the names of the glyphs that this + * glyph is composed from. All we need to do is to + * make sure those glyphs are present in the subset + * under their standard names. */ + if (font->build_stack.sp < 5) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + + status = use_standard_encoding_glyph (font, font->build_stack.stack[3]); + if (unlikely (status)) + goto cleanup; + + status = use_standard_encoding_glyph (font, font->build_stack.stack[4]); + if (unlikely (status)) + goto cleanup; + + font->build_stack.sp = 0; + break; + + case TYPE1_CHARSTRING_COMMAND_SBW: + if (font->build_stack.sp < 4) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + + font->glyphs[glyph].width = font->build_stack.stack[2]/font->base.units_per_em; + font->build_stack.sp = 0; + break; + + case TYPE1_CHARSTRING_COMMAND_DIV: + if (font->build_stack.sp < 2) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } else { + double num1 = font->build_stack.stack[font->build_stack.sp - 2]; + double num2 = font->build_stack.stack[font->build_stack.sp - 1]; + font->build_stack.sp--; + if (num2 == 0.0) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + font->build_stack.stack[font->build_stack.sp - 1] = num1/num2; + } + break; + + case TYPE1_CHARSTRING_COMMAND_CALLOTHERSUBR: + if (font->build_stack.sp < 1) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + + font->build_stack.sp--; + font->ps_stack.sp = 0; + while (font->build_stack.sp) + font->ps_stack.stack[font->ps_stack.sp++] = font->build_stack.stack[--font->build_stack.sp]; + + break; + + case TYPE1_CHARSTRING_COMMAND_POP: + if (font->ps_stack.sp < 1) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + + /* T1 spec states that if the interpreter does not + * support executing the callothersub, the results + * must be taken from the callothersub arguments. */ + font->build_stack.stack[font->build_stack.sp++] = font->ps_stack.stack[--font->ps_stack.sp]; + break; + } + break; + } + } else { + /* integer argument */ + if (font->build_stack.sp < TYPE1_STACKSIZE) { + int val; + p = cairo_type1_font_subset_decode_integer (p, &val); + font->build_stack.stack[font->build_stack.sp++] = val; + } else { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto cleanup; + } + } + } + +cleanup: + free (charstring); + + return status; +} + +static cairo_status_t +cairo_type1_font_subset_build_subr_list (cairo_type1_font_subset_t *font, + int subr_number, + const char *encrypted_charstring, int encrypted_charstring_length, + const char *np, int np_length) +{ + + font->subrs[subr_number].subr_string = encrypted_charstring; + font->subrs[subr_number].subr_length = encrypted_charstring_length; + font->subrs[subr_number].np = np; + font->subrs[subr_number].np_length = np_length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +write_used_subrs (cairo_type1_font_subset_t *font, + int subr_number, + const char *subr_string, int subr_string_length, + const char *np, int np_length) +{ + cairo_status_t status; + char buffer[256]; + int length; + + if (!font->subrs[subr_number].used) + return CAIRO_STATUS_SUCCESS; + + length = snprintf (buffer, sizeof buffer, + "dup %d %d %s ", + subr_number, subr_string_length, font->rd); + status = cairo_type1_font_subset_write_encrypted (font, buffer, length); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_write_encrypted (font, + subr_string, + subr_string_length); + if (unlikely (status)) + return status; + + if (np) { + status = cairo_type1_font_subset_write_encrypted (font, np, np_length); + } else { + length = snprintf (buffer, sizeof buffer, "%s\n", font->np); + status = cairo_type1_font_subset_write_encrypted (font, buffer, length); + } + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +typedef cairo_status_t (*subr_func_t) (cairo_type1_font_subset_t *font, + int subr_number, + const char *subr_string, int subr_string_length, + const char *np, int np_length); + +static cairo_status_t +cairo_type1_font_for_each_subr (cairo_type1_font_subset_t *font, + const char *array_start, + const char *cleartext_end, + subr_func_t func, + const char **array_end) +{ + const char *p, *subr_string; + char *end; + int subr_num, subr_length; + const char *np; + int np_length; + cairo_status_t status; + + /* We're looking at "dup" at the start of the first subroutine. The subroutines + * definitions are on the form: + * + * dup 5 23 RD <23 binary bytes> NP + * + * or alternatively using -| and |- instead of RD and ND. + * The first number is the subroutine number. + */ + + p = array_start; + while (p + 3 < cleartext_end && strncmp (p, "dup", 3) == 0) { + p = skip_token (p, cleartext_end); + + /* get subr number */ + subr_num = strtol (p, &end, 10); + if (p == end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (subr_num < 0 || subr_num >= font->num_subrs) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* get subr length */ + p = end; + subr_length = strtol (p, &end, 10); + if (p == end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Skip past -| or RD to binary data. There is exactly one space + * between the -| or RD token and the encrypted data, thus '+ 1'. */ + subr_string = skip_token (end, cleartext_end) + 1; + + np = NULL; + np_length = 0; + + /* Skip binary data and | or NP token. */ + p = skip_token (subr_string + subr_length, cleartext_end); + while (p < cleartext_end && _cairo_isspace(*p)) + p++; + + /* Some fonts have "noaccess put" instead of "NP" */ + if (p + 3 < cleartext_end && strncmp (p, "put", 3) == 0) { + p = skip_token (p, cleartext_end); + while (p < cleartext_end && _cairo_isspace(*p)) + p++; + + np = subr_string + subr_length; + np_length = p - np; + } + + status = func (font, subr_num, + subr_string, subr_length, np, np_length); + if (unlikely (status)) + return status; + + } + + *array_end = (char *) p; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_type1_font_subset_build_glyph_list (cairo_type1_font_subset_t *font, + int glyph_number, + const char *name, int name_length, + const char *encrypted_charstring, int encrypted_charstring_length) +{ + char *s; + glyph_data_t glyph; + cairo_status_t status; + + s = malloc (name_length + 1); + if (unlikely (s == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + strncpy (s, name, name_length); + s[name_length] = 0; + + status = _cairo_array_append (&font->glyph_names_array, &s); + if (unlikely (status)) + return status; + + glyph.subset_index = -1; + glyph.width = 0; + glyph.encrypted_charstring = encrypted_charstring; + glyph.encrypted_charstring_length = encrypted_charstring_length; + status = _cairo_array_append (&font->glyphs_array, &glyph); + + return status; +} + +static cairo_status_t +write_used_glyphs (cairo_type1_font_subset_t *font, + int glyph_number, + const char *name, int name_length, + const char *charstring, int charstring_length) +{ + cairo_status_t status; + char buffer[256]; + int length; + unsigned int subset_id; + int ch; + const char *wa_name; + + if (font->glyphs[glyph_number].subset_index < 0) + return CAIRO_STATUS_SUCCESS; + + if (font->scaled_font_subset->is_latin) { + /* When using the WinAnsi encoding in PDF, the /Encoding array + * is ignored and instead glyphs are keyed by glyph names. To + * ensure correct rendering we replace the glyph name in the + * font with the standard name. + **/ + subset_id = font->glyphs[glyph_number].subset_index; + /* Any additional glyph included for use by the seac operator + * will either have subset_id >= font->scaled_font_subset->num_glyphs + * or will not map to a winansi name (wa_name = NULL). In this + * case the original name is used. + */ + if (subset_id > 0 && subset_id < font->scaled_font_subset->num_glyphs) { + ch = font->scaled_font_subset->to_latin_char[subset_id]; + wa_name = _cairo_winansi_to_glyphname (ch); + if (wa_name) { + name = wa_name; + name_length = strlen(name); + } + } + } + + length = snprintf (buffer, sizeof buffer, + "/%.*s %d %s ", + name_length, name, charstring_length, font->rd); + status = cairo_type1_font_subset_write_encrypted (font, buffer, length); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_write_encrypted (font, + charstring, + charstring_length); + if (unlikely (status)) + return status; + + length = snprintf (buffer, sizeof buffer, "%s\n", font->nd); + status = cairo_type1_font_subset_write_encrypted (font, buffer, length); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +typedef cairo_status_t (*glyph_func_t) (cairo_type1_font_subset_t *font, + int glyph_number, + const char *name, int name_length, + const char *charstring, int charstring_length); + +static cairo_status_t +cairo_type1_font_subset_for_each_glyph (cairo_type1_font_subset_t *font, + const char *dict_start, + const char *dict_end, + glyph_func_t func, + const char **dict_out) +{ + int charstring_length, name_length; + const char *p, *charstring, *name; + char *end; + cairo_status_t status; + int glyph_count; + + /* We're looking at '/' in the name of the first glyph. The glyph + * definitions are on the form: + * + * /name 23 RD <23 binary bytes> ND + * + * or alternatively using -| and |- instead of RD and ND. + * + * We parse the glyph name and see if it is in the subset. If it + * is, we call the specified callback with the glyph name and + * glyph data, otherwise we just skip it. We need to parse + * through a glyph definition; we can't just find the next '/', + * since the binary data could contain a '/'. + */ + + p = dict_start; + glyph_count = 0; + while (*p == '/') { + name = p + 1; + p = skip_token (p, dict_end); + name_length = p - name; + + charstring_length = strtol (p, &end, 10); + if (p == end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Skip past -| or RD to binary data. There is exactly one space + * between the -| or RD token and the encrypted data, thus '+ 1'. */ + charstring = skip_token (end, dict_end) + 1; + + /* Skip binary data and |- or ND token. */ + p = skip_token (charstring + charstring_length, dict_end); + while (p < dict_end && _cairo_isspace(*p)) + p++; + + /* In case any of the skip_token() calls above reached EOF, p will + * be equal to dict_end. */ + if (p == dict_end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = func (font, glyph_count++, + name, name_length, + charstring, charstring_length); + if (unlikely (status)) + return status; + } + + *dict_out = p; + + return CAIRO_STATUS_SUCCESS; +} + + +static cairo_status_t +cairo_type1_font_subset_write_private_dict (cairo_type1_font_subset_t *font, + const char *name) +{ + cairo_status_t status; + const char *p, *subrs, *charstrings, *array_start, *array_end, *dict_start, *dict_end; + const char *lenIV_start, *lenIV_end, *closefile_token; + char buffer[32], *lenIV_str, *subr_count_end, *glyph_count_end; + int ret, lenIV, length; + const cairo_scaled_font_backend_t *backend; + unsigned int i; + int glyph, j; + + /* The private dict holds hint information, common subroutines and + * the actual glyph definitions (charstrings). + * + * What we do here is scan directly to the /Subrs token, which + * marks the beginning of the subroutines. We read in all the + * subroutines, then move on to the /CharString token, which marks + * the beginning of the glyph definitions, and read in the charstrings. + * + * The charstrings are parsed to extract glyph widths, work out + * which subroutines are called, and to see if any extra glyphs + * need to be included due to the use of the seac glyph combining + * operator. + * + * Finally, the private dict is copied to the subset font minus the + * subroutines and charstrings not required. + */ + + /* Determine lenIV, the number of random characters at the start of + each encrypted charstring. The default is 4, but this can be + overridden in the private dict. */ + font->lenIV = 4; + if ((lenIV_start = find_token (font->cleartext, font->cleartext_end, "/lenIV")) != NULL) { + lenIV_start += 6; + lenIV_end = find_token (lenIV_start, font->cleartext_end, "def"); + if (lenIV_end == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + lenIV_str = malloc (lenIV_end - lenIV_start + 1); + if (unlikely (lenIV_str == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + strncpy (lenIV_str, lenIV_start, lenIV_end - lenIV_start); + lenIV_str[lenIV_end - lenIV_start] = 0; + + ret = sscanf(lenIV_str, "%d", &lenIV); + free(lenIV_str); + + if (unlikely (ret <= 0)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Apparently some fonts signal unencrypted charstrings with a negative lenIV, + though this is not part of the Type 1 Font Format specification. See, e.g. + http://lists.gnu.org/archive/html/freetype-devel/2000-06/msg00064.html. */ + if (unlikely (lenIV < 0)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + font->lenIV = lenIV; + } + + /* Find start of Subrs */ + subrs = find_token (font->cleartext, font->cleartext_end, "/Subrs"); + if (subrs == NULL) { + font->subset_subrs = FALSE; + p = font->cleartext; + array_start = NULL; + goto skip_subrs; + } + + /* Scan past /Subrs and get the array size. */ + p = subrs + strlen ("/Subrs"); + font->num_subrs = strtol (p, &subr_count_end, 10); + if (subr_count_end == p) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (font->num_subrs <= 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + font->subrs = calloc (font->num_subrs, sizeof (font->subrs[0])); + if (unlikely (font->subrs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* look for "dup" which marks the beginning of the first subr */ + array_start = find_token (subr_count_end, font->cleartext_end, "dup"); + if (subrs == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Read in the subroutines */ + status = cairo_type1_font_for_each_subr (font, + array_start, + font->cleartext_end, + cairo_type1_font_subset_build_subr_list, + &array_end); + if (unlikely(status)) + return status; + + p = array_end; +skip_subrs: + + /* Find start of CharStrings */ + charstrings = find_token (p, font->cleartext_end, "/CharStrings"); + if (charstrings == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Scan past /CharStrings and the integer following it. */ + p = charstrings + strlen ("/CharStrings"); + strtol (p, &glyph_count_end, 10); + if (p == glyph_count_end) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Look for a '/' which marks the beginning of the first glyph + * definition. */ + for (p = glyph_count_end; p < font->cleartext_end; p++) + if (*p == '/') + break; + if (p == font->cleartext_end) + return CAIRO_INT_STATUS_UNSUPPORTED; + dict_start = p; + + /* Now that we have the private dictionary broken down in + * sections, do the first pass through the glyph definitions to + * build a list of glyph names and charstrings. */ + status = cairo_type1_font_subset_for_each_glyph (font, + dict_start, + font->cleartext_end, + cairo_type1_font_subset_build_glyph_list, + &dict_end); + if (unlikely(status)) + return status; + + font->glyphs = _cairo_array_index (&font->glyphs_array, 0); + font->glyph_names = _cairo_array_index (&font->glyph_names_array, 0); + font->base.num_glyphs = _cairo_array_num_elements (&font->glyphs_array); + font->subset_index_to_glyphs = calloc (font->base.num_glyphs, sizeof font->subset_index_to_glyphs[0]); + if (unlikely (font->subset_index_to_glyphs == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + backend = font->scaled_font_subset->scaled_font->backend; + if (!backend->index_to_glyph_name) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Find the glyph number corresponding to each glyph in the subset + * and mark it as in use */ + + for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { + unsigned long index; + + status = backend->index_to_glyph_name (font->scaled_font_subset->scaled_font, + font->glyph_names, + font->base.num_glyphs, + font->scaled_font_subset->glyphs[i], + &index); + if (unlikely(status)) + return status; + + cairo_type1_font_subset_use_glyph (font, index); + } + + /* Go through the charstring of each glyph in use, get the glyph + * width and figure out which extra glyphs may be required by the + * seac operator (which may cause font->num_glyphs to increase + * while this loop is executing). Also subset the Subrs. */ + for (j = 0; j < font->num_glyphs; j++) { + glyph = font->subset_index_to_glyphs[j]; + font->build_stack.sp = 0; + font->ps_stack.sp = 0; + status = cairo_type1_font_subset_parse_charstring (font, + glyph, + font->glyphs[glyph].encrypted_charstring, + font->glyphs[glyph].encrypted_charstring_length); + if (unlikely (status)) + return status; + } + + /* Always include the first five subroutines in case the Flex/hint mechanism is + * being used. */ + for (j = 0; j < MIN (font->num_subrs, 5); j++) { + font->subrs[j].used = TRUE; + } + + closefile_token = find_token (dict_end, font->cleartext_end, "closefile"); + if (closefile_token == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* We're ready to start outputting. First write the header, + * i.e. the public part of the font dict.*/ + status = cairo_type1_font_subset_write_header (font, name); + if (unlikely (status)) + return status; + + font->base.header_size = _cairo_output_stream_get_position (font->output); + + /* Start outputting the private dict */ + if (font->subset_subrs) { + /* First output everything up to the start of the Subrs array. */ + status = cairo_type1_font_subset_write_encrypted (font, font->cleartext, + array_start - font->cleartext); + if (unlikely (status)) + return status; + + /* Write out the subr definitions for each of the glyphs in + * the subset. */ + status = cairo_type1_font_for_each_subr (font, + array_start, + font->cleartext_end, + write_used_subrs, + &p); + if (unlikely (status)) + return status; + } else { + p = font->cleartext; + } + + /* If subr subsetting, output everything from end of subrs to + * start of /CharStrings token. If not subr subsetting, output + * everything start of private dict to start of /CharStrings + * token. */ + status = cairo_type1_font_subset_write_encrypted (font, p, charstrings - p); + if (unlikely (status)) + return status; + + /* Write out new charstring count */ + length = snprintf (buffer, sizeof buffer, + "/CharStrings %d", font->num_glyphs); + status = cairo_type1_font_subset_write_encrypted (font, buffer, length); + if (unlikely (status)) + return status; + + /* Write out text between the charstring count and the first + * charstring definition */ + status = cairo_type1_font_subset_write_encrypted (font, glyph_count_end, + dict_start - glyph_count_end); + if (unlikely (status)) + return status; + + /* Write out the charstring definitions for each of the glyphs in + * the subset. */ + status = cairo_type1_font_subset_for_each_glyph (font, + dict_start, + font->cleartext_end, + write_used_glyphs, + &p); + if (unlikely (status)) + return status; + + /* Output what's left between the end of the glyph definitions and + * the end of the private dict to the output. */ + status = cairo_type1_font_subset_write_encrypted (font, p, + closefile_token - p + strlen ("closefile") + 1); + if (unlikely (status)) + return status; + + if (font->hex_encode) + _cairo_output_stream_write (font->output, "\n", 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +cairo_type1_font_subset_write_trailer(cairo_type1_font_subset_t *font) +{ + const char *cleartomark_token; + int i; + static const char zeros[65] = + "0000000000000000000000000000000000000000000000000000000000000000\n"; + + + for (i = 0; i < 8; i++) + _cairo_output_stream_write (font->output, zeros, sizeof zeros); + + cleartomark_token = find_token (font->type1_data, font->type1_end, "cleartomark"); + if (cleartomark_token) { + /* Some fonts have conditional save/restore around the entire + * font dict, so we need to retain whatever postscript code + * that may come after 'cleartomark'. */ + + _cairo_output_stream_write (font->output, cleartomark_token, + font->type1_end - cleartomark_token); + if (*(font->type1_end - 1) != '\n') + _cairo_output_stream_printf (font->output, "\n"); + + } else if (!font->eexec_segment_is_ascii) { + /* Fonts embedded in PDF may omit the fixed-content portion + * that includes the 'cleartomark' operator. Type 1 in PDF is + * always binary. */ + + _cairo_output_stream_printf (font->output, "cleartomark\n"); + } else { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* some fonts do not have a newline at the end of the last line */ + _cairo_output_stream_printf (font->output, "\n"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +type1_font_write (void *closure, const unsigned char *data, unsigned int length) +{ + cairo_type1_font_subset_t *font = closure; + + return _cairo_array_append_multiple (&font->contents, data, length); +} + +static cairo_status_t +cairo_type1_font_subset_write (cairo_type1_font_subset_t *font, + const char *name) +{ + cairo_status_t status; + + status = cairo_type1_font_subset_find_segments (font); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_decrypt_eexec_segment (font); + if (unlikely (status)) + return status; + + /* Determine which glyph definition delimiters to use. */ + if (find_token (font->cleartext, font->cleartext_end, "/-|") != NULL) { + font->rd = "-|"; + font->nd = "|-"; + font->np = "|"; + } else if (find_token (font->cleartext, font->cleartext_end, "/RD") != NULL) { + font->rd = "RD"; + font->nd = "ND"; + font->np = "NP"; + } else { + /* Don't know *what* kind of font this is... */ + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + font->eexec_key = CAIRO_TYPE1_PRIVATE_DICT_KEY; + font->hex_column = 0; + + status = cairo_type1_font_subset_get_bbox (font); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_get_fontname (font); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_write_private_dict (font, name); + if (unlikely (status)) + return status; + + font->base.data_size = _cairo_output_stream_get_position (font->output) - + font->base.header_size; + + status = cairo_type1_font_subset_write_trailer (font); + if (unlikely (status)) + return status; + + font->base.trailer_size = + _cairo_output_stream_get_position (font->output) - + font->base.header_size - font->base.data_size; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +check_fontdata_is_type1 (const unsigned char *data, long length) +{ + /* Test for Type 1 Binary (PFB) */ + if (length > 2 && data[0] == 0x80 && data[1] == 0x01) + return TRUE; + + /* Test for Type 1 1 ASCII (PFA) */ + if (length > 2 && data[0] == '%' && data[1] == '!') + return TRUE; + + return FALSE; +} + +static cairo_status_t +cairo_type1_font_subset_generate (void *abstract_font, + const char *name) + +{ + cairo_type1_font_subset_t *font = abstract_font; + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + unsigned long data_length; + + scaled_font = font->scaled_font_subset->scaled_font; + if (!scaled_font->backend->load_type1_data) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = scaled_font->backend->load_type1_data (scaled_font, 0, NULL, &data_length); + if (status) + return CAIRO_INT_STATUS_UNSUPPORTED; + + font->type1_length = data_length; + font->type1_data = malloc (font->type1_length); + if (unlikely (font->type1_data == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = scaled_font->backend->load_type1_data (scaled_font, 0, + (unsigned char *) font->type1_data, + &data_length); + if (unlikely (status)) + return status; + + if (!check_fontdata_is_type1 ((unsigned char *)font->type1_data, data_length)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_array_grow_by (&font->contents, 4096); + if (unlikely (status)) + return status; + + font->output = _cairo_output_stream_create (type1_font_write, NULL, font); + if (unlikely ((status = font->output->status))) + return status; + + status = cairo_type1_font_subset_write (font, name); + if (unlikely (status)) + return status; + + font->base.data = _cairo_array_index (&font->contents, 0); + + return status; +} + +static cairo_status_t +_cairo_type1_font_subset_fini (cairo_type1_font_subset_t *font) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + unsigned int i; + + /* If the subset generation failed, some of the pointers below may + * be NULL depending on at which point the error occurred. */ + + _cairo_array_fini (&font->contents); + + free (font->type1_data); + for (i = 0; i < _cairo_array_num_elements (&font->glyph_names_array); i++) { + char **s; + + s = _cairo_array_index (&font->glyph_names_array, i); + free (*s); + } + _cairo_array_fini (&font->glyph_names_array); + _cairo_array_fini (&font->glyphs_array); + + free (font->subrs); + + if (font->output != NULL) + status = _cairo_output_stream_destroy (font->output); + + free (font->base.base_font); + + free (font->subset_index_to_glyphs); + + free (font->cleartext); + + return status; +} + +cairo_status_t +_cairo_type1_subset_init (cairo_type1_subset_t *type1_subset, + const char *name, + cairo_scaled_font_subset_t *scaled_font_subset, + cairo_bool_t hex_encode) +{ + cairo_type1_font_subset_t font; + cairo_status_t status; + unsigned long length; + unsigned int i; + char buf[30]; + + /* We need to use a fallback font generated from the synthesized outlines. */ + if (scaled_font_subset->scaled_font->backend->is_synthetic && + scaled_font_subset->scaled_font->backend->is_synthetic (scaled_font_subset->scaled_font)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_type1_font_subset_init (&font, scaled_font_subset, hex_encode); + if (unlikely (status)) + return status; + + status = cairo_type1_font_subset_generate (&font, name); + if (unlikely (status)) + goto fail1; + + if (font.base.base_font) { + type1_subset->base_font = strdup (font.base.base_font); + } else { + snprintf(buf, sizeof (buf), "CairoFont-%u-%u", + scaled_font_subset->font_id, scaled_font_subset->subset_id); + type1_subset->base_font = strdup (buf); + } + if (unlikely (type1_subset->base_font == NULL)) + goto fail1; + + type1_subset->widths = calloc (sizeof (double), font.num_glyphs); + if (unlikely (type1_subset->widths == NULL)) + goto fail2; + for (i = 0; i < font.base.num_glyphs; i++) { + if (font.glyphs[i].subset_index < 0) + continue; + type1_subset->widths[font.glyphs[i].subset_index] = + font.glyphs[i].width; + } + + type1_subset->x_min = font.base.x_min; + type1_subset->y_min = font.base.y_min; + type1_subset->x_max = font.base.x_max; + type1_subset->y_max = font.base.y_max; + type1_subset->ascent = font.base.ascent; + type1_subset->descent = font.base.descent; + + length = font.base.header_size + + font.base.data_size + + font.base.trailer_size; + type1_subset->data = malloc (length); + if (unlikely (type1_subset->data == NULL)) + goto fail3; + + memcpy (type1_subset->data, + _cairo_array_index (&font.contents, 0), length); + + type1_subset->header_length = font.base.header_size; + type1_subset->data_length = font.base.data_size; + type1_subset->trailer_length = font.base.trailer_size; + + return _cairo_type1_font_subset_fini (&font); + + fail3: + free (type1_subset->widths); + fail2: + free (type1_subset->base_font); + fail1: + _cairo_type1_font_subset_fini (&font); + + return status; +} + +void +_cairo_type1_subset_fini (cairo_type1_subset_t *subset) +{ + free (subset->base_font); + free (subset->widths); + free (subset->data); +} + +cairo_bool_t +_cairo_type1_scaled_font_is_type1 (cairo_scaled_font_t *scaled_font) +{ + cairo_status_t status; + unsigned long length; + unsigned char buf[64]; + + if (!scaled_font->backend->load_type1_data) + return FALSE; + + status = scaled_font->backend->load_type1_data (scaled_font, 0, NULL, &length); + if (status) + return FALSE; + + /* We only need a few bytes to test for Type 1 */ + if (length > sizeof (buf)) + length = sizeof (buf); + + status = scaled_font->backend->load_type1_data (scaled_font, 0, buf, &length); + if (status) + return FALSE; + + return check_fontdata_is_type1 (buf, length); +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-type3-glyph-surface-private.h b/src/cairo-type3-glyph-surface-private.h new file mode 100644 index 000000000..6f40f1c25 --- /dev/null +++ b/src/cairo-type3-glyph-surface-private.h @@ -0,0 +1,89 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + */ + +#ifndef CAIRO_TYPE3_GLYPH_SURFACE_PRIVATE_H +#define CAIRO_TYPE3_GLYPH_SURFACE_PRIVATE_H + +#include "cairoint.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-surface-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-pdf-operators-private.h" + +typedef cairo_int_status_t +(*cairo_type3_glyph_surface_emit_image_t) (cairo_image_surface_t *image, + cairo_output_stream_t *stream); + +typedef struct cairo_type3_glyph_surface { + cairo_surface_t base; + + cairo_scaled_font_t *scaled_font; + cairo_output_stream_t *stream; + cairo_pdf_operators_t pdf_operators; + cairo_matrix_t cairo_to_pdf; + cairo_type3_glyph_surface_emit_image_t emit_image; + + cairo_surface_clipper_t clipper; +} cairo_type3_glyph_surface_t; + +cairo_private cairo_surface_t * +_cairo_type3_glyph_surface_create (cairo_scaled_font_t *scaled_font, + cairo_output_stream_t *stream, + cairo_type3_glyph_surface_emit_image_t emit_image, + cairo_scaled_font_subsets_t *font_subsets, + cairo_bool_t ps_output); + +cairo_private void +_cairo_type3_glyph_surface_set_font_subsets_callback (void *abstract_surface, + cairo_pdf_operators_use_font_subset_t use_font_subset, + void *closure); + +cairo_private cairo_status_t +_cairo_type3_glyph_surface_analyze_glyph (void *abstract_surface, + unsigned long glyph_index); + +cairo_private cairo_status_t +_cairo_type3_glyph_surface_emit_glyph (void *abstract_surface, + cairo_output_stream_t *stream, + unsigned long glyph_index, + cairo_box_t *bbox, + double *width); + +#endif /* CAIRO_HAS_FONT_SUBSET */ + +#endif /* CAIRO_TYPE3_GLYPH_SURFACE_PRIVATE_H */ diff --git a/src/cairo-type3-glyph-surface.c b/src/cairo-type3-glyph-surface.c new file mode 100644 index 000000000..c99d46106 --- /dev/null +++ b/src/cairo-type3-glyph-surface.c @@ -0,0 +1,568 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_FONT_SUBSET + +#include "cairo-type3-glyph-surface-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-analysis-surface-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-clipper-private.h" + +static const cairo_surface_backend_t cairo_type3_glyph_surface_backend; + +static cairo_status_t +_cairo_type3_glyph_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_type3_glyph_surface_t *surface = cairo_container_of (clipper, + cairo_type3_glyph_surface_t, + clipper); + + if (path == NULL) { + _cairo_output_stream_printf (surface->stream, "Q q\n"); + return CAIRO_STATUS_SUCCESS; + } + + return _cairo_pdf_operators_clip (&surface->pdf_operators, + path, + fill_rule); +} + +cairo_surface_t * +_cairo_type3_glyph_surface_create (cairo_scaled_font_t *scaled_font, + cairo_output_stream_t *stream, + cairo_type3_glyph_surface_emit_image_t emit_image, + cairo_scaled_font_subsets_t *font_subsets, + cairo_bool_t ps) +{ + cairo_type3_glyph_surface_t *surface; + cairo_matrix_t invert_y_axis; + + if (unlikely (stream != NULL && stream->status)) + return _cairo_surface_create_in_error (stream->status); + + surface = malloc (sizeof (cairo_type3_glyph_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &cairo_type3_glyph_surface_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + surface->scaled_font = scaled_font; + surface->stream = stream; + surface->emit_image = emit_image; + + /* Setup the transform from the user-font device space to Type 3 + * font space. The Type 3 font space is defined by the FontMatrix + * entry in the Type 3 dictionary. In the PDF backend this is an + * identity matrix. */ + surface->cairo_to_pdf = scaled_font->scale_inverse; + cairo_matrix_init_scale (&invert_y_axis, 1, -1); + cairo_matrix_multiply (&surface->cairo_to_pdf, &surface->cairo_to_pdf, &invert_y_axis); + + _cairo_pdf_operators_init (&surface->pdf_operators, + surface->stream, + &surface->cairo_to_pdf, + font_subsets, + ps); + + _cairo_surface_clipper_init (&surface->clipper, + _cairo_type3_glyph_surface_clipper_intersect_clip_path); + + return &surface->base; +} + +static cairo_status_t +_cairo_type3_glyph_surface_emit_image (cairo_type3_glyph_surface_t *surface, + cairo_image_surface_t *image, + cairo_matrix_t *image_matrix) +{ + cairo_status_t status; + + /* The only image type supported by Type 3 fonts are 1-bit masks */ + image = _cairo_image_surface_coerce_to_format (image, CAIRO_FORMAT_A1); + status = image->base.status; + if (unlikely (status)) + return status; + + _cairo_output_stream_printf (surface->stream, + "q %f %f %f %f %f %f cm\n", + image_matrix->xx, + image_matrix->xy, + image_matrix->yx, + image_matrix->yy, + image_matrix->x0, + image_matrix->y0); + + status = surface->emit_image (image, surface->stream); + cairo_surface_destroy (&image->base); + + _cairo_output_stream_printf (surface->stream, + "Q\n"); + + return status; +} + +static cairo_status_t +_cairo_type3_glyph_surface_emit_image_pattern (cairo_type3_glyph_surface_t *surface, + cairo_image_surface_t *image, + const cairo_matrix_t *pattern_matrix) +{ + cairo_matrix_t mat, upside_down; + cairo_status_t status; + + if (image->width == 0 || image->height == 0) + return CAIRO_STATUS_SUCCESS; + + mat = *pattern_matrix; + + /* Get the pattern space to user space matrix */ + status = cairo_matrix_invert (&mat); + + /* cairo_pattern_set_matrix ensures the matrix is invertible */ + assert (status == CAIRO_STATUS_SUCCESS); + + /* Make this a pattern space to Type 3 font space matrix */ + cairo_matrix_multiply (&mat, &mat, &surface->cairo_to_pdf); + + /* PDF images are in a 1 unit by 1 unit image space. Turn the 1 by + * 1 image upside down to convert to flip the Y-axis going from + * cairo to PDF. Then scale the image up to the required size. */ + cairo_matrix_scale (&mat, image->width, image->height); + cairo_matrix_init (&upside_down, 1, 0, 0, -1, 0, 1); + cairo_matrix_multiply (&mat, &upside_down, &mat); + + return _cairo_type3_glyph_surface_emit_image (surface, image, &mat); +} + +static cairo_status_t +_cairo_type3_glyph_surface_finish (void *abstract_surface) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + + return _cairo_pdf_operators_fini (&surface->pdf_operators); +} + +static cairo_int_status_t +_cairo_type3_glyph_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + const cairo_surface_pattern_t *pattern; + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + + if (source->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_INT_STATUS_IMAGE_FALLBACK; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + pattern = (const cairo_surface_pattern_t *) source; + status = _cairo_surface_acquire_source_image (pattern->surface, + &image, &image_extra); + if (unlikely (status)) + goto fail; + + status = _cairo_type3_glyph_surface_emit_image_pattern (surface, + image, + &pattern->base.matrix); + +fail: + _cairo_surface_release_source_image (pattern->surface, image, image_extra); + + return status; +} + +static cairo_int_status_t +_cairo_type3_glyph_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + return _cairo_type3_glyph_surface_paint (abstract_surface, + op, mask, + clip); +} + +static cairo_int_status_t +_cairo_type3_glyph_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + return _cairo_pdf_operators_stroke (&surface->pdf_operators, + path, + style, + ctm, + ctm_inverse); +} + +static cairo_int_status_t +_cairo_type3_glyph_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + return _cairo_pdf_operators_fill (&surface->pdf_operators, + path, + fill_rule); +} + +static cairo_int_status_t +_cairo_type3_glyph_surface_show_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + cairo_int_status_t status; + cairo_scaled_font_t *font; + cairo_matrix_t new_ctm, invert_y_axis; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) + return status; + + cairo_matrix_init_scale (&invert_y_axis, 1, -1); + cairo_matrix_multiply (&new_ctm, &invert_y_axis, &scaled_font->ctm); + cairo_matrix_multiply (&new_ctm, &surface->cairo_to_pdf, &new_ctm); + font = cairo_scaled_font_create (scaled_font->font_face, + &scaled_font->font_matrix, + &new_ctm, + &scaled_font->options); + if (unlikely (font->status)) + return font->status; + + status = _cairo_pdf_operators_show_text_glyphs (&surface->pdf_operators, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, + FALSE, + font); + + cairo_scaled_font_destroy (font); + + return status; +} + +static const cairo_surface_backend_t cairo_type3_glyph_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_TYPE3_GLYPH, + _cairo_type3_glyph_surface_finish, + + _cairo_default_context_create, /* XXX usable through a context? */ + + NULL, /* create similar */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + NULL, /* source */ + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* copy page */ + NULL, /* show page */ + + NULL, /* _cairo_type3_glyph_surface_get_extents */ + NULL, /* _cairo_type3_glyph_surface_get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_type3_glyph_surface_paint, + _cairo_type3_glyph_surface_mask, + _cairo_type3_glyph_surface_stroke, + _cairo_type3_glyph_surface_fill, + NULL, /* fill-stroke */ + _cairo_type3_glyph_surface_show_glyphs, +}; + +static void +_cairo_type3_glyph_surface_set_stream (cairo_type3_glyph_surface_t *surface, + cairo_output_stream_t *stream) +{ + surface->stream = stream; + _cairo_pdf_operators_set_stream (&surface->pdf_operators, stream); +} + +static cairo_status_t +_cairo_type3_glyph_surface_emit_fallback_image (cairo_type3_glyph_surface_t *surface, + unsigned long glyph_index) +{ + cairo_scaled_glyph_t *scaled_glyph; + cairo_status_t status; + cairo_image_surface_t *image; + cairo_matrix_t mat; + double x, y; + + status = _cairo_scaled_glyph_lookup (surface->scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS | + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + if (unlikely (status)) + return status; + + image = scaled_glyph->surface; + if (image->width == 0 || image->height == 0) + return CAIRO_STATUS_SUCCESS; + + x = _cairo_fixed_to_double (scaled_glyph->bbox.p1.x); + y = _cairo_fixed_to_double (scaled_glyph->bbox.p2.y); + mat.xx = image->width; + mat.xy = 0; + mat.yx = 0; + mat.yy = image->height; + mat.x0 = x; + mat.y0 = y; + cairo_matrix_multiply (&mat, &mat, &surface->scaled_font->scale_inverse); + mat.y0 *= -1; + + return _cairo_type3_glyph_surface_emit_image (surface, image, &mat); +} + +void +_cairo_type3_glyph_surface_set_font_subsets_callback (void *abstract_surface, + cairo_pdf_operators_use_font_subset_t use_font_subset, + void *closure) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + + if (unlikely (surface->base.status)) + return; + + _cairo_pdf_operators_set_font_subsets_callback (&surface->pdf_operators, + use_font_subset, + closure); +} + +cairo_status_t +_cairo_type3_glyph_surface_analyze_glyph (void *abstract_surface, + unsigned long glyph_index) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + cairo_scaled_glyph_t *scaled_glyph; + cairo_int_status_t status, status2; + cairo_output_stream_t *null_stream; + + if (unlikely (surface->base.status)) + return surface->base.status; + + null_stream = _cairo_null_stream_create (); + if (unlikely (null_stream->status)) + return null_stream->status; + + _cairo_type3_glyph_surface_set_stream (surface, null_stream); + + _cairo_scaled_font_freeze_cache (surface->scaled_font); + status = _cairo_scaled_glyph_lookup (surface->scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE, + &scaled_glyph); + + if (_cairo_int_status_is_error (status)) + goto cleanup; + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = CAIRO_INT_STATUS_SUCCESS; + goto cleanup; + } + + status = _cairo_recording_surface_replay (scaled_glyph->recording_surface, + &surface->base); + if (unlikely (status)) + goto cleanup; + + status = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (status == CAIRO_INT_STATUS_IMAGE_FALLBACK) + status = CAIRO_INT_STATUS_SUCCESS; + +cleanup: + _cairo_scaled_font_thaw_cache (surface->scaled_font); + + status2 = _cairo_output_stream_destroy (null_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + + return status; +} + +cairo_status_t +_cairo_type3_glyph_surface_emit_glyph (void *abstract_surface, + cairo_output_stream_t *stream, + unsigned long glyph_index, + cairo_box_t *bbox, + double *width) +{ + cairo_type3_glyph_surface_t *surface = abstract_surface; + cairo_scaled_glyph_t *scaled_glyph; + cairo_int_status_t status, status2; + double x_advance, y_advance; + cairo_matrix_t font_matrix_inverse; + + if (unlikely (surface->base.status)) + return surface->base.status; + + _cairo_type3_glyph_surface_set_stream (surface, stream); + + _cairo_scaled_font_freeze_cache (surface->scaled_font); + status = _cairo_scaled_glyph_lookup (surface->scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS | + CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE, + &scaled_glyph); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_scaled_glyph_lookup (surface->scaled_font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = CAIRO_INT_STATUS_IMAGE_FALLBACK; + } + if (_cairo_int_status_is_error (status)) { + _cairo_scaled_font_thaw_cache (surface->scaled_font); + return status; + } + + x_advance = scaled_glyph->metrics.x_advance; + y_advance = scaled_glyph->metrics.y_advance; + font_matrix_inverse = surface->scaled_font->font_matrix; + status2 = cairo_matrix_invert (&font_matrix_inverse); + + /* The invertability of font_matrix is tested in + * pdf_operators_show_glyphs before any glyphs are mapped to the + * subset. */ + assert (status2 == CAIRO_INT_STATUS_SUCCESS); + + cairo_matrix_transform_distance (&font_matrix_inverse, &x_advance, &y_advance); + *width = x_advance; + + *bbox = scaled_glyph->bbox; + _cairo_matrix_transform_bounding_box_fixed (&surface->scaled_font->scale_inverse, + bbox, NULL); + + _cairo_output_stream_printf (surface->stream, + "%f 0 %f %f %f %f d1\n", + x_advance, + _cairo_fixed_to_double (bbox->p1.x), + - _cairo_fixed_to_double (bbox->p2.y), + _cairo_fixed_to_double (bbox->p2.x), + - _cairo_fixed_to_double (bbox->p1.y)); + + if (status == CAIRO_INT_STATUS_SUCCESS) { + cairo_output_stream_t *mem_stream; + + mem_stream = _cairo_memory_stream_create (); + status = mem_stream->status; + if (unlikely (status)) + goto FAIL; + + _cairo_type3_glyph_surface_set_stream (surface, mem_stream); + + _cairo_output_stream_printf (surface->stream, "q\n"); + status = _cairo_recording_surface_replay (scaled_glyph->recording_surface, + &surface->base); + + status2 = _cairo_pdf_operators_flush (&surface->pdf_operators); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + + _cairo_output_stream_printf (surface->stream, "Q\n"); + + _cairo_type3_glyph_surface_set_stream (surface, stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + _cairo_memory_stream_copy (mem_stream, stream); + + status2 = _cairo_output_stream_destroy (mem_stream); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = status2; + } + + if (status == CAIRO_INT_STATUS_IMAGE_FALLBACK) + status = _cairo_type3_glyph_surface_emit_fallback_image (surface, glyph_index); + + FAIL: + _cairo_scaled_font_thaw_cache (surface->scaled_font); + + return status; +} + +#endif /* CAIRO_HAS_FONT_SUBSET */ diff --git a/src/cairo-types-private.h b/src/cairo-types-private.h new file mode 100644 index 000000000..3d15d968e --- /dev/null +++ b/src/cairo-types-private.h @@ -0,0 +1,429 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_TYPES_PRIVATE_H +#define CAIRO_TYPES_PRIVATE_H + +#include "cairo.h" +#include "cairo-fixed-type-private.h" +#include "cairo-list-private.h" +#include "cairo-reference-count-private.h" + +CAIRO_BEGIN_DECLS + +/** + * SECTION:cairo-types + * @Title: Types + * @Short_Description: Generic data types + * + * This section lists generic data types used in the cairo API. + **/ + +typedef struct _cairo_array cairo_array_t; +typedef struct _cairo_backend cairo_backend_t; +typedef struct _cairo_boxes_t cairo_boxes_t; +typedef struct _cairo_cache cairo_cache_t; +typedef struct _cairo_composite_rectangles cairo_composite_rectangles_t; +typedef struct _cairo_clip cairo_clip_t; +typedef struct _cairo_clip_path cairo_clip_path_t; +typedef struct _cairo_color cairo_color_t; +typedef struct _cairo_color_stop cairo_color_stop_t; +typedef struct _cairo_contour cairo_contour_t; +typedef struct _cairo_contour_chain cairo_contour_chain_t; +typedef struct _cairo_contour_iter cairo_contour_iter_t; +typedef struct _cairo_damage cairo_damage_t; +typedef struct _cairo_device_backend cairo_device_backend_t; +typedef struct _cairo_font_face_backend cairo_font_face_backend_t; +typedef struct _cairo_gstate cairo_gstate_t; +typedef struct _cairo_gstate_backend cairo_gstate_backend_t; +typedef struct _cairo_glyph_text_info cairo_glyph_text_info_t; +typedef struct _cairo_hash_entry cairo_hash_entry_t; +typedef struct _cairo_hash_table cairo_hash_table_t; +typedef struct _cairo_image_surface cairo_image_surface_t; +typedef struct _cairo_mime_data cairo_mime_data_t; +typedef struct _cairo_observer cairo_observer_t; +typedef struct _cairo_output_stream cairo_output_stream_t; +typedef struct _cairo_paginated_surface_backend cairo_paginated_surface_backend_t; +typedef struct _cairo_path_fixed cairo_path_fixed_t; +typedef struct _cairo_rectangle_int16 cairo_glyph_size_t; +typedef struct _cairo_scaled_font_subsets cairo_scaled_font_subsets_t; +typedef struct _cairo_solid_pattern cairo_solid_pattern_t; +typedef struct _cairo_surface_attributes cairo_surface_attributes_t; +typedef struct _cairo_surface_backend cairo_surface_backend_t; +typedef struct _cairo_surface_observer cairo_surface_observer_t; +typedef struct _cairo_surface_snapshot cairo_surface_snapshot_t; +typedef struct _cairo_surface_subsurface cairo_surface_subsurface_t; +typedef struct _cairo_surface_wrapper cairo_surface_wrapper_t; +typedef struct _cairo_traps cairo_traps_t; +typedef struct _cairo_tristrip cairo_tristrip_t; +typedef struct _cairo_unscaled_font_backend cairo_unscaled_font_backend_t; +typedef struct _cairo_xlib_screen_info cairo_xlib_screen_info_t; + +typedef cairo_array_t cairo_user_data_array_t; + +typedef struct _cairo_scaled_font_private cairo_scaled_font_private_t; +typedef struct _cairo_scaled_font_backend cairo_scaled_font_backend_t; +typedef struct _cairo_scaled_glyph cairo_scaled_glyph_t; +typedef struct _cairo_scaled_glyph_private cairo_scaled_glyph_private_t; + +typedef struct cairo_compositor cairo_compositor_t; +typedef struct cairo_fallback_compositor cairo_fallback_compositor_t; +typedef struct cairo_mask_compositor cairo_mask_compositor_t; +typedef struct cairo_traps_compositor cairo_traps_compositor_t; +typedef struct cairo_spans_compositor cairo_spans_compositor_t; + +struct _cairo_observer { + cairo_list_t link; + void (*callback) (cairo_observer_t *self, void *arg); +}; + +/** + * _cairo_hash_entry: + * + * A #cairo_hash_entry_t contains both a key and a value for + * #cairo_hash_table_t. User-derived types for #cairo_hash_entry_t must + * be type-compatible with this structure (eg. they must have an + * unsigned long as the first parameter. The easiest way to get this + * is to use: + * + * typedef _my_entry { + * cairo_hash_entry_t base; + * ... Remainder of key and value fields here .. + * } my_entry_t; + * + * which then allows a pointer to my_entry_t to be passed to any of + * the #cairo_hash_table_t functions as follows without requiring a cast: + * + * _cairo_hash_table_insert (hash_table, &my_entry->base); + * + * IMPORTANT: The caller is responsible for initializing + * my_entry->base.hash with a hash code derived from the key. The + * essential property of the hash code is that keys_equal must never + * return %TRUE for two keys that have different hashes. The best hash + * code will reduce the frequency of two keys with the same code for + * which keys_equal returns %FALSE. + * + * Which parts of the entry make up the "key" and which part make up + * the value are entirely up to the caller, (as determined by the + * computation going into base.hash as well as the keys_equal + * function). A few of the #cairo_hash_table_t functions accept an entry + * which will be used exclusively as a "key", (indicated by a + * parameter name of key). In these cases, the value-related fields of + * the entry need not be initialized if so desired. + **/ +struct _cairo_hash_entry { + unsigned long hash; +}; + +struct _cairo_array { + unsigned int size; + unsigned int num_elements; + unsigned int element_size; + char *elements; +}; + +/** + * _cairo_lcd_filter: + * @CAIRO_LCD_FILTER_DEFAULT: Use the default LCD filter for + * font backend and target device + * @CAIRO_LCD_FILTER_NONE: Do not perform LCD filtering + * @CAIRO_LCD_FILTER_INTRA_PIXEL: Intra-pixel filter + * @CAIRO_LCD_FILTER_FIR3: FIR filter with a 3x3 kernel + * @CAIRO_LCD_FILTER_FIR5: FIR filter with a 5x5 kernel + * + * The LCD filter specifies the low-pass filter applied to LCD-optimized + * bitmaps generated with an antialiasing mode of %CAIRO_ANTIALIAS_SUBPIXEL. + * + * Note: This API was temporarily made available in the public + * interface during the 1.7.x development series, but was made private + * before 1.8. + **/ +typedef enum _cairo_lcd_filter { + CAIRO_LCD_FILTER_DEFAULT, + CAIRO_LCD_FILTER_NONE, + CAIRO_LCD_FILTER_INTRA_PIXEL, + CAIRO_LCD_FILTER_FIR3, + CAIRO_LCD_FILTER_FIR5 +} cairo_lcd_filter_t; + +typedef enum _cairo_round_glyph_positions { + CAIRO_ROUND_GLYPH_POS_DEFAULT, + CAIRO_ROUND_GLYPH_POS_ON, + CAIRO_ROUND_GLYPH_POS_OFF +} cairo_round_glyph_positions_t; + +struct _cairo_font_options { + cairo_antialias_t antialias; + cairo_subpixel_order_t subpixel_order; + cairo_lcd_filter_t lcd_filter; + cairo_hint_style_t hint_style; + cairo_hint_metrics_t hint_metrics; + cairo_round_glyph_positions_t round_glyph_positions; +}; + +struct _cairo_glyph_text_info { + const char *utf8; + int utf8_len; + + const cairo_text_cluster_t *clusters; + int num_clusters; + cairo_text_cluster_flags_t cluster_flags; +}; + + +/* XXX: Right now, the _cairo_color structure puts unpremultiplied + color in the doubles and premultiplied color in the shorts. Yes, + this is crazy insane, (but at least we don't export this + madness). I'm still working on a cleaner API, but in the meantime, + at least this does prevent precision loss in color when changing + alpha. */ +struct _cairo_color { + double red; + double green; + double blue; + double alpha; + + unsigned short red_short; + unsigned short green_short; + unsigned short blue_short; + unsigned short alpha_short; +}; + +struct _cairo_color_stop { + /* unpremultiplied */ + double red; + double green; + double blue; + double alpha; + + /* unpremultipled, for convenience */ + uint16_t red_short; + uint16_t green_short; + uint16_t blue_short; + uint16_t alpha_short; +}; + +typedef enum _cairo_paginated_mode { + CAIRO_PAGINATED_MODE_ANALYZE, /* analyze page regions */ + CAIRO_PAGINATED_MODE_RENDER, /* render page contents */ + CAIRO_PAGINATED_MODE_FALLBACK /* paint fallback images */ +} cairo_paginated_mode_t; + +typedef enum _cairo_internal_surface_type { + CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT = 0x1000, + CAIRO_INTERNAL_SURFACE_TYPE_PAGINATED, + CAIRO_INTERNAL_SURFACE_TYPE_ANALYSIS, + CAIRO_INTERNAL_SURFACE_TYPE_OBSERVER, + CAIRO_INTERNAL_SURFACE_TYPE_TEST_FALLBACK, + CAIRO_INTERNAL_SURFACE_TYPE_TEST_PAGINATED, + CAIRO_INTERNAL_SURFACE_TYPE_TEST_WRAPPING, + CAIRO_INTERNAL_SURFACE_TYPE_NULL, + CAIRO_INTERNAL_SURFACE_TYPE_TYPE3_GLYPH +} cairo_internal_surface_type_t; + +typedef enum _cairo_internal_device_type { + CAIRO_INTERNAL_DEVICE_TYPE_OBSERVER = 0x1000, +} cairo_device_surface_type_t; + +#define CAIRO_HAS_TEST_PAGINATED_SURFACE 1 + +typedef struct _cairo_slope { + cairo_fixed_t dx; + cairo_fixed_t dy; +} cairo_slope_t, cairo_distance_t; + +typedef struct _cairo_point_double { + double x; + double y; +} cairo_point_double_t; + +typedef struct _cairo_circle_double { + cairo_point_double_t center; + double radius; +} cairo_circle_double_t; + +typedef struct _cairo_distance_double { + double dx; + double dy; +} cairo_distance_double_t; + +typedef struct _cairo_box_double { + cairo_point_double_t p1; + cairo_point_double_t p2; +} cairo_box_double_t; + +typedef struct _cairo_line { + cairo_point_t p1; + cairo_point_t p2; +} cairo_line_t, cairo_box_t; + +typedef struct _cairo_trapezoid { + cairo_fixed_t top, bottom; + cairo_line_t left, right; +} cairo_trapezoid_t; + +typedef struct _cairo_point_int { + int x, y; +} cairo_point_int_t; + +#define CAIRO_RECT_INT_MIN (INT_MIN >> CAIRO_FIXED_FRAC_BITS) +#define CAIRO_RECT_INT_MAX (INT_MAX >> CAIRO_FIXED_FRAC_BITS) + +typedef enum _cairo_direction { + CAIRO_DIRECTION_FORWARD, + CAIRO_DIRECTION_REVERSE +} cairo_direction_t; + +typedef struct _cairo_edge { + cairo_line_t line; + int top, bottom; + int dir; +} cairo_edge_t; + +typedef struct _cairo_polygon { + cairo_status_t status; + + cairo_box_t extents; + cairo_box_t limit; + const cairo_box_t *limits; + int num_limits; + + int num_edges; + int edges_size; + cairo_edge_t *edges; + cairo_edge_t edges_embedded[32]; +} cairo_polygon_t; + +typedef cairo_warn cairo_status_t +(*cairo_spline_add_point_func_t) (void *closure, + const cairo_point_t *point, + const cairo_slope_t *tangent); + +typedef struct _cairo_spline_knots { + cairo_point_t a, b, c, d; +} cairo_spline_knots_t; + +typedef struct _cairo_spline { + cairo_spline_add_point_func_t add_point_func; + void *closure; + + cairo_spline_knots_t knots; + + cairo_slope_t initial_slope; + cairo_slope_t final_slope; + + cairo_bool_t has_point; + cairo_point_t last_point; +} cairo_spline_t; + +typedef struct _cairo_pen_vertex { + cairo_point_t point; + + cairo_slope_t slope_ccw; + cairo_slope_t slope_cw; +} cairo_pen_vertex_t; + +typedef struct _cairo_pen { + double radius; + double tolerance; + + int num_vertices; + cairo_pen_vertex_t *vertices; + cairo_pen_vertex_t vertices_embedded[32]; +} cairo_pen_t; + +typedef struct _cairo_stroke_style { + double line_width; + cairo_line_cap_t line_cap; + cairo_line_join_t line_join; + double miter_limit; + double *dash; + unsigned int num_dashes; + double dash_offset; +} cairo_stroke_style_t; + +typedef struct _cairo_format_masks { + int bpp; + unsigned long alpha_mask; + unsigned long red_mask; + unsigned long green_mask; + unsigned long blue_mask; +} cairo_format_masks_t; + +typedef enum { + CAIRO_STOCK_WHITE, + CAIRO_STOCK_BLACK, + CAIRO_STOCK_TRANSPARENT, + CAIRO_STOCK_NUM_COLORS, +} cairo_stock_t; + +typedef enum _cairo_image_transparency { + CAIRO_IMAGE_IS_OPAQUE, + CAIRO_IMAGE_HAS_BILEVEL_ALPHA, + CAIRO_IMAGE_HAS_ALPHA, + CAIRO_IMAGE_UNKNOWN +} cairo_image_transparency_t; + +typedef enum _cairo_image_color { + CAIRO_IMAGE_IS_COLOR, + CAIRO_IMAGE_IS_GRAYSCALE, + CAIRO_IMAGE_IS_MONOCHROME, + CAIRO_IMAGE_UNKNOWN_COLOR +} cairo_image_color_t; + + +struct _cairo_mime_data { + cairo_reference_count_t ref_count; + unsigned char *data; + unsigned long length; + cairo_destroy_func_t destroy; + void *closure; +}; + +/* + * A #cairo_unscaled_font_t is just an opaque handle we use in the + * glyph cache. + */ +typedef struct _cairo_unscaled_font { + cairo_hash_entry_t hash_entry; + cairo_reference_count_t ref_count; + const cairo_unscaled_font_backend_t *backend; +} cairo_unscaled_font_t; +CAIRO_END_DECLS + +#endif /* CAIRO_TYPES_PRIVATE_H */ diff --git a/src/cairo-unicode.c b/src/cairo-unicode.c new file mode 100644 index 000000000..88de39516 --- /dev/null +++ b/src/cairo-unicode.c @@ -0,0 +1,422 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * The code in this file is derived from GLib's gutf8.c and + * ultimately from libunicode. It is relicensed under the + * dual LGPL/MPL with permission of the original authors. + * + * Copyright © 1999 Tom Tromey + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Tom Tromey. + * and Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + */ + +#include "cairoint.h" +#include "cairo-error-private.h" + +#define UTF8_COMPUTE(Char, Mask, Len) \ + if (Char < 128) \ + { \ + Len = 1; \ + Mask = 0x7f; \ + } \ + else if ((Char & 0xe0) == 0xc0) \ + { \ + Len = 2; \ + Mask = 0x1f; \ + } \ + else if ((Char & 0xf0) == 0xe0) \ + { \ + Len = 3; \ + Mask = 0x0f; \ + } \ + else if ((Char & 0xf8) == 0xf0) \ + { \ + Len = 4; \ + Mask = 0x07; \ + } \ + else if ((Char & 0xfc) == 0xf8) \ + { \ + Len = 5; \ + Mask = 0x03; \ + } \ + else if ((Char & 0xfe) == 0xfc) \ + { \ + Len = 6; \ + Mask = 0x01; \ + } \ + else \ + Len = -1; + +#define UTF8_LENGTH(Char) \ + ((Char) < 0x80 ? 1 : \ + ((Char) < 0x800 ? 2 : \ + ((Char) < 0x10000 ? 3 : \ + ((Char) < 0x200000 ? 4 : \ + ((Char) < 0x4000000 ? 5 : 6))))) + +#define UTF8_GET(Result, Chars, Count, Mask, Len) \ + (Result) = (Chars)[0] & (Mask); \ + for ((Count) = 1; (Count) < (Len); ++(Count)) \ + { \ + if (((Chars)[(Count)] & 0xc0) != 0x80) \ + { \ + (Result) = -1; \ + break; \ + } \ + (Result) <<= 6; \ + (Result) |= ((Chars)[(Count)] & 0x3f); \ + } + +#define UNICODE_VALID(Char) \ + ((Char) < 0x110000 && \ + (((Char) & 0xFFFFF800) != 0xD800) && \ + ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ + ((Char) & 0xFFFE) != 0xFFFE) + +static const char utf8_skip_data[256] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 +}; + +#define UTF8_NEXT_CHAR(p) ((p) + utf8_skip_data[*(unsigned char *)(p)]) + +/* Converts a sequence of bytes encoded as UTF-8 to a Unicode character. + * If @p does not point to a valid UTF-8 encoded character, results are + * undefined. + **/ +static uint32_t +_utf8_get_char (const unsigned char *p) +{ + int i, mask = 0, len; + uint32_t result; + unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len); + if (len == -1) + return (uint32_t)-1; + UTF8_GET (result, p, i, mask, len); + + return result; +} + +/* Like _utf8_get_char, but take a maximum length + * and return (uint32_t)-2 on incomplete trailing character + */ +static uint32_t +_utf8_get_char_extended (const unsigned char *p, + long max_len) +{ + int i, len; + uint32_t wc = (unsigned char) *p; + + if (wc < 0x80) { + return wc; + } else if (wc < 0xc0) { + return (uint32_t)-1; + } else if (wc < 0xe0) { + len = 2; + wc &= 0x1f; + } else if (wc < 0xf0) { + len = 3; + wc &= 0x0f; + } else if (wc < 0xf8) { + len = 4; + wc &= 0x07; + } else if (wc < 0xfc) { + len = 5; + wc &= 0x03; + } else if (wc < 0xfe) { + len = 6; + wc &= 0x01; + } else { + return (uint32_t)-1; + } + + if (max_len >= 0 && len > max_len) { + for (i = 1; i < max_len; i++) { + if ((((unsigned char *)p)[i] & 0xc0) != 0x80) + return (uint32_t)-1; + } + return (uint32_t)-2; + } + + for (i = 1; i < len; ++i) { + uint32_t ch = ((unsigned char *)p)[i]; + + if ((ch & 0xc0) != 0x80) { + if (ch) + return (uint32_t)-1; + else + return (uint32_t)-2; + } + + wc <<= 6; + wc |= (ch & 0x3f); + } + + if (UTF8_LENGTH(wc) != len) + return (uint32_t)-1; + + return wc; +} + +/** + * _cairo_utf8_get_char_validated: + * @p: a UTF-8 string + * @unicode: location to store one Unicode character + * + * Decodes the first character of a valid UTF-8 string, and returns + * the number of bytes consumed. + * + * Note that the string should be valid. Do not use this without + * validating the string first. + * + * Returns: the number of bytes forming the character returned. + **/ +int +_cairo_utf8_get_char_validated (const char *p, + uint32_t *unicode) +{ + int i, mask = 0, len; + uint32_t result; + unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len); + if (len == -1) { + if (unicode) + *unicode = (uint32_t)-1; + return 1; + } + UTF8_GET (result, p, i, mask, len); + + if (unicode) + *unicode = result; + return len; +} + +/** + * _cairo_utf8_to_ucs4: + * @str: an UTF-8 string + * @len: length of @str in bytes, or -1 if it is nul-terminated. + * If @len is supplied and the string has an embedded nul + * byte, only the portion before the nul byte is converted. + * @result: location to store a pointer to a newly allocated UTF-32 + * string (always native endian), or %NULL. Free with free(). A 0 + * word will be written after the last character. + * @items_written: location to store number of 32-bit words + * written. (Not including the trailing 0) + * + * Converts a UTF-8 string to UCS-4. UCS-4 is an encoding of Unicode + * with 1 32-bit word per character. The string is validated to + * consist entirely of valid Unicode characters. + * + * Return value: %CAIRO_STATUS_SUCCESS if the entire string was + * successfully converted. %CAIRO_STATUS_INVALID_STRING if an + * invalid sequence was found. + **/ +cairo_status_t +_cairo_utf8_to_ucs4 (const char *str, + int len, + uint32_t **result, + int *items_written) +{ + uint32_t *str32 = NULL; + int n_chars, i; + const unsigned char *in; + const unsigned char * const ustr = (const unsigned char *) str; + + in = ustr; + n_chars = 0; + while ((len < 0 || ustr + len - in > 0) && *in) + { + uint32_t wc = _utf8_get_char_extended (in, ustr + len - in); + if (wc & 0x80000000 || !UNICODE_VALID (wc)) + return _cairo_error (CAIRO_STATUS_INVALID_STRING); + + n_chars++; + if (n_chars == INT_MAX) + return _cairo_error (CAIRO_STATUS_INVALID_STRING); + + in = UTF8_NEXT_CHAR (in); + } + + if (result) { + str32 = _cairo_malloc_ab (n_chars + 1, sizeof (uint32_t)); + if (!str32) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + in = ustr; + for (i=0; i < n_chars; i++) { + str32[i] = _utf8_get_char (in); + in = UTF8_NEXT_CHAR (in); + } + str32[i] = 0; + + *result = str32; + } + + if (items_written) + *items_written = n_chars; + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _cairo_ucs4_to_utf8: + * @unicode: a UCS-4 character + * @utf8: buffer to write utf8 string into. Must have at least 4 bytes + * space available. Or %NULL. + * + * This space left intentionally blank. + * + * Return value: Number of bytes in the utf8 string or 0 if an invalid + * unicode character + **/ +int +_cairo_ucs4_to_utf8 (uint32_t unicode, + char *utf8) +{ + int bytes; + char *p; + + if (unicode < 0x80) { + if (utf8) + *utf8 = unicode; + return 1; + } else if (unicode < 0x800) { + bytes = 2; + } else if (unicode < 0x10000) { + bytes = 3; + } else if (unicode < 0x200000) { + bytes = 4; + } else { + return 0; + } + + if (!utf8) + return bytes; + + p = utf8 + bytes; + while (p > utf8) { + *--p = 0x80 | (unicode & 0x3f); + unicode >>= 6; + } + *p |= 0xf0 << (4 - bytes); + + return bytes; +} + +#if CAIRO_HAS_UTF8_TO_UTF16 +/** + * _cairo_utf8_to_utf16: + * @str: an UTF-8 string + * @len: length of @str in bytes, or -1 if it is nul-terminated. + * If @len is supplied and the string has an embedded nul + * byte, only the portion before the nul byte is converted. + * @result: location to store a pointer to a newly allocated UTF-16 + * string (always native endian). Free with free(). A 0 + * word will be written after the last character. + * @items_written: location to store number of 16-bit words + * written. (Not including the trailing 0) + * + * Converts a UTF-8 string to UTF-16. UTF-16 is an encoding of Unicode + * where characters are represented either as a single 16-bit word, or + * as a pair of 16-bit "surrogates". The string is validated to + * consist entirely of valid Unicode characters. + * + * Return value: %CAIRO_STATUS_SUCCESS if the entire string was + * successfully converted. %CAIRO_STATUS_INVALID_STRING if an + * an invalid sequence was found. + **/ +cairo_status_t +_cairo_utf8_to_utf16 (const char *str, + int len, + uint16_t **result, + int *items_written) +{ + uint16_t *str16 = NULL; + int n16, i; + const unsigned char *in; + const unsigned char * const ustr = (const unsigned char *) str; + + in = ustr; + n16 = 0; + while ((len < 0 || ustr + len - in > 0) && *in) { + uint32_t wc = _utf8_get_char_extended (in, ustr + len - in); + if (wc & 0x80000000 || !UNICODE_VALID (wc)) + return _cairo_error (CAIRO_STATUS_INVALID_STRING); + + if (wc < 0x10000) + n16 += 1; + else + n16 += 2; + + if (n16 == INT_MAX - 1 || n16 == INT_MAX) + return _cairo_error (CAIRO_STATUS_INVALID_STRING); + + in = UTF8_NEXT_CHAR (in); + } + + str16 = _cairo_malloc_ab (n16 + 1, sizeof (uint16_t)); + if (!str16) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + in = ustr; + for (i = 0; i < n16;) { + uint32_t wc = _utf8_get_char (in); + + if (wc < 0x10000) { + str16[i++] = wc; + } else { + str16[i++] = (wc - 0x10000) / 0x400 + 0xd800; + str16[i++] = (wc - 0x10000) % 0x400 + 0xdc00; + } + + in = UTF8_NEXT_CHAR (in); + } + + str16[i] = 0; + + *result = str16; + if (items_written) + *items_written = n16; + + return CAIRO_STATUS_SUCCESS; +} +#endif diff --git a/src/cairo-uninstalled.pc.in b/src/cairo-uninstalled.pc.in new file mode 100644 index 000000000..9dc3231ae --- /dev/null +++ b/src/cairo-uninstalled.pc.in @@ -0,0 +1,8 @@ +Name: cairo +Description: Multi-platform 2D graphics library +Version: @VERSION@ + +@PKGCONFIG_REQUIRES@: @CAIRO_REQUIRES@ +Libs: ${pc_top_builddir}/${pcfiledir}/src/libcairo.la +Libs.private: @CAIRO_NONPKGCONFIG_LIBS@ +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@/src diff --git a/src/cairo-user-font-private.h b/src/cairo-user-font-private.h new file mode 100644 index 000000000..d54ef78b4 --- /dev/null +++ b/src/cairo-user-font-private.h @@ -0,0 +1,46 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006, 2008 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Behdad Esfahbod + */ + +#ifndef CAIRO_USER_FONT_PRIVATE_H +#define CAIRO_USER_FONT_PRIVATE_H + +#include "cairo.h" +#include "cairo-compiler-private.h" + +cairo_private cairo_bool_t +_cairo_font_face_is_user (cairo_font_face_t *font_face); + +#endif /* CAIRO_USER_FONT_PRIVATE_H */ diff --git a/src/cairo-user-font.c b/src/cairo-user-font.c new file mode 100644 index 000000000..6d2de2097 --- /dev/null +++ b/src/cairo-user-font.c @@ -0,0 +1,831 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006, 2008 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Kristian Høgsberg + * Behdad Esfahbod + */ + +#include "cairoint.h" +#include "cairo-user-font-private.h" +#include "cairo-recording-surface-private.h" +#include "cairo-analysis-surface-private.h" +#include "cairo-error-private.h" + +/** + * SECTION:cairo-user-fonts + * @Title:User Fonts + * @Short_Description: Font support with font data provided by the user + * + * The user-font feature allows the cairo user to provide drawings for glyphs + * in a font. This is most useful in implementing fonts in non-standard + * formats, like SVG fonts and Flash fonts, but can also be used by games and + * other application to draw "funky" fonts. + **/ + +/** + * CAIRO_HAS_USER_FONT: + * + * Defined if the user font backend is available. + * This macro can be used to conditionally compile backend-specific code. + * The user font backend is always built in versions of cairo that support + * this feature (1.8 and later). + * + * Since: 1.8 + **/ + +typedef struct _cairo_user_scaled_font_methods { + cairo_user_scaled_font_init_func_t init; + cairo_user_scaled_font_render_glyph_func_t render_glyph; + cairo_user_scaled_font_unicode_to_glyph_func_t unicode_to_glyph; + cairo_user_scaled_font_text_to_glyphs_func_t text_to_glyphs; +} cairo_user_scaled_font_methods_t; + +typedef struct _cairo_user_font_face { + cairo_font_face_t base; + + /* Set to true after first scaled font is created. At that point, + * the scaled_font_methods cannot change anymore. */ + cairo_bool_t immutable; + + cairo_user_scaled_font_methods_t scaled_font_methods; +} cairo_user_font_face_t; + +typedef struct _cairo_user_scaled_font { + cairo_scaled_font_t base; + + cairo_text_extents_t default_glyph_extents; + + /* space to compute extents in, and factors to convert back to user space */ + cairo_matrix_t extent_scale; + double extent_x_scale; + double extent_y_scale; + + /* multiplier for metrics hinting */ + double snap_x_scale; + double snap_y_scale; + +} cairo_user_scaled_font_t; + +/* #cairo_user_scaled_font_t */ + +static cairo_surface_t * +_cairo_user_scaled_font_create_recording_surface (const cairo_user_scaled_font_t *scaled_font) +{ + cairo_content_t content; + + content = scaled_font->base.options.antialias == CAIRO_ANTIALIAS_SUBPIXEL ? + CAIRO_CONTENT_COLOR_ALPHA : + CAIRO_CONTENT_ALPHA; + + return cairo_recording_surface_create (content, NULL); +} + + +static cairo_t * +_cairo_user_scaled_font_create_recording_context (const cairo_user_scaled_font_t *scaled_font, + cairo_surface_t *recording_surface) +{ + cairo_t *cr; + + cr = cairo_create (recording_surface); + + if (!_cairo_matrix_is_scale_0 (&scaled_font->base.scale)) { + cairo_matrix_t scale; + scale = scaled_font->base.scale; + scale.x0 = scale.y0 = 0.; + cairo_set_matrix (cr, &scale); + } + + cairo_set_font_size (cr, 1.0); + cairo_set_font_options (cr, &scaled_font->base.options); + cairo_set_source_rgb (cr, 1., 1., 1.); + + return cr; +} + +static cairo_int_status_t +_cairo_user_scaled_glyph_init (void *abstract_font, + cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_info_t info) +{ + cairo_int_status_t status = CAIRO_STATUS_SUCCESS; + cairo_user_scaled_font_t *scaled_font = abstract_font; + cairo_surface_t *recording_surface = scaled_glyph->recording_surface; + + if (!scaled_glyph->recording_surface) { + cairo_user_font_face_t *face = + (cairo_user_font_face_t *) scaled_font->base.font_face; + cairo_text_extents_t extents = scaled_font->default_glyph_extents; + cairo_t *cr; + + if (!face->scaled_font_methods.render_glyph) + return CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED; + + recording_surface = _cairo_user_scaled_font_create_recording_surface (scaled_font); + + /* special case for 0 rank matrix (as in _cairo_scaled_font_init): empty surface */ + if (!_cairo_matrix_is_scale_0 (&scaled_font->base.scale)) { + cr = _cairo_user_scaled_font_create_recording_context (scaled_font, recording_surface); + status = face->scaled_font_methods.render_glyph ((cairo_scaled_font_t *)scaled_font, + _cairo_scaled_glyph_index(scaled_glyph), + cr, &extents); + if (status == CAIRO_INT_STATUS_SUCCESS) + status = cairo_status (cr); + + cairo_destroy (cr); + + if (unlikely (status)) { + cairo_surface_destroy (recording_surface); + return status; + } + } + + _cairo_scaled_glyph_set_recording_surface (scaled_glyph, + &scaled_font->base, + recording_surface); + + + /* set metrics */ + + if (extents.width == 0.) { + cairo_box_t bbox; + double x1, y1, x2, y2; + double x_scale, y_scale; + + /* Compute extents.x/y/width/height from recording_surface, + * in font space. + */ + status = _cairo_recording_surface_get_bbox ((cairo_recording_surface_t *) recording_surface, + &bbox, + &scaled_font->extent_scale); + if (unlikely (status)) + return status; + + _cairo_box_to_doubles (&bbox, &x1, &y1, &x2, &y2); + + x_scale = scaled_font->extent_x_scale; + y_scale = scaled_font->extent_y_scale; + extents.x_bearing = x1 * x_scale; + extents.y_bearing = y1 * y_scale; + extents.width = (x2 - x1) * x_scale; + extents.height = (y2 - y1) * y_scale; + } + + if (scaled_font->base.options.hint_metrics != CAIRO_HINT_METRICS_OFF) { + extents.x_advance = _cairo_lround (extents.x_advance / scaled_font->snap_x_scale) * scaled_font->snap_x_scale; + extents.y_advance = _cairo_lround (extents.y_advance / scaled_font->snap_y_scale) * scaled_font->snap_y_scale; + } + + _cairo_scaled_glyph_set_metrics (scaled_glyph, + &scaled_font->base, + &extents); + } + + if (info & CAIRO_SCALED_GLYPH_INFO_SURFACE) { + cairo_surface_t *surface; + cairo_format_t format; + int width, height; + + /* TODO + * extend the glyph cache to support argb glyphs. + * need to figure out the semantics and interaction with subpixel + * rendering first. + */ + + width = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.x) - + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x); + height = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y) - + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); + + switch (scaled_font->base.options.antialias) { + default: + case CAIRO_ANTIALIAS_DEFAULT: + case CAIRO_ANTIALIAS_FAST: + case CAIRO_ANTIALIAS_GOOD: + case CAIRO_ANTIALIAS_GRAY: format = CAIRO_FORMAT_A8; break; + case CAIRO_ANTIALIAS_NONE: format = CAIRO_FORMAT_A1; break; + case CAIRO_ANTIALIAS_BEST: + case CAIRO_ANTIALIAS_SUBPIXEL: format = CAIRO_FORMAT_ARGB32; break; + } + surface = cairo_image_surface_create (format, width, height); + + cairo_surface_set_device_offset (surface, + - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x), + - _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y)); + status = _cairo_recording_surface_replay (recording_surface, surface); + + if (unlikely (status)) { + cairo_surface_destroy(surface); + return status; + } + + _cairo_scaled_glyph_set_surface (scaled_glyph, + &scaled_font->base, + (cairo_image_surface_t *) surface); + } + + if (info & CAIRO_SCALED_GLYPH_INFO_PATH) { + cairo_path_fixed_t *path = _cairo_path_fixed_create (); + if (!path) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_recording_surface_get_path (recording_surface, path); + if (unlikely (status)) { + _cairo_path_fixed_destroy (path); + return status; + } + + _cairo_scaled_glyph_set_path (scaled_glyph, + &scaled_font->base, + path); + } + + return status; +} + +static unsigned long +_cairo_user_ucs4_to_index (void *abstract_font, + uint32_t ucs4) +{ + cairo_user_scaled_font_t *scaled_font = abstract_font; + cairo_user_font_face_t *face = + (cairo_user_font_face_t *) scaled_font->base.font_face; + unsigned long glyph = 0; + + if (face->scaled_font_methods.unicode_to_glyph) { + cairo_status_t status; + + status = face->scaled_font_methods.unicode_to_glyph (&scaled_font->base, + ucs4, &glyph); + + if (status == CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED) + goto not_implemented; + + if (status != CAIRO_STATUS_SUCCESS) { + status = _cairo_scaled_font_set_error (&scaled_font->base, status); + glyph = 0; + } + + } else { +not_implemented: + glyph = ucs4; + } + + return glyph; +} + +static cairo_int_status_t +_cairo_user_text_to_glyphs (void *abstract_font, + double x, + double y, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + cairo_user_scaled_font_t *scaled_font = abstract_font; + cairo_user_font_face_t *face = + (cairo_user_font_face_t *) scaled_font->base.font_face; + + if (face->scaled_font_methods.text_to_glyphs) { + int i; + cairo_glyph_t *orig_glyphs = *glyphs; + int orig_num_glyphs = *num_glyphs; + + status = face->scaled_font_methods.text_to_glyphs (&scaled_font->base, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags); + + if (status != CAIRO_INT_STATUS_SUCCESS && + status != CAIRO_INT_STATUS_USER_FONT_NOT_IMPLEMENTED) + return status; + + if (status == CAIRO_INT_STATUS_USER_FONT_NOT_IMPLEMENTED || + *num_glyphs < 0) { + if (orig_glyphs != *glyphs) { + cairo_glyph_free (*glyphs); + *glyphs = orig_glyphs; + } + *num_glyphs = orig_num_glyphs; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* Convert from font space to user space and add x,y */ + for (i = 0; i < *num_glyphs; i++) { + double gx = (*glyphs)[i].x; + double gy = (*glyphs)[i].y; + + cairo_matrix_transform_point (&scaled_font->base.font_matrix, + &gx, &gy); + + (*glyphs)[i].x = gx + x; + (*glyphs)[i].y = gy + y; + } + } + + return status; +} + +static cairo_status_t +_cairo_user_font_face_scaled_font_create (void *abstract_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **scaled_font); + +static cairo_status_t +_cairo_user_font_face_create_for_toy (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face) +{ + return _cairo_font_face_twin_create_for_toy (toy_face, font_face); +} + +static const cairo_scaled_font_backend_t _cairo_user_scaled_font_backend = { + CAIRO_FONT_TYPE_USER, + NULL, /* scaled_font_fini */ + _cairo_user_scaled_glyph_init, + _cairo_user_text_to_glyphs, + _cairo_user_ucs4_to_index, + NULL, /* show_glyphs */ + NULL, /* load_truetype_table */ + NULL /* index_to_ucs4 */ +}; + +/* #cairo_user_font_face_t */ + +static cairo_status_t +_cairo_user_font_face_scaled_font_create (void *abstract_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **scaled_font) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_user_font_face_t *font_face = abstract_face; + cairo_user_scaled_font_t *user_scaled_font = NULL; + cairo_font_extents_t font_extents = {1., 0., 1., 1., 0.}; + + font_face->immutable = TRUE; + + user_scaled_font = malloc (sizeof (cairo_user_scaled_font_t)); + if (unlikely (user_scaled_font == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = _cairo_scaled_font_init (&user_scaled_font->base, + &font_face->base, + font_matrix, ctm, options, + &_cairo_user_scaled_font_backend); + + if (unlikely (status)) { + free (user_scaled_font); + return status; + } + + /* XXX metrics hinting? */ + + /* compute a normalized version of font scale matrix to compute + * extents in. This is to minimize error caused by the cairo_fixed_t + * representation. */ + { + double fixed_scale, x_scale, y_scale; + + user_scaled_font->extent_scale = user_scaled_font->base.scale_inverse; + status = _cairo_matrix_compute_basis_scale_factors (&user_scaled_font->extent_scale, + &x_scale, &y_scale, + 1); + if (status == CAIRO_STATUS_SUCCESS) { + + if (x_scale == 0) x_scale = 1.; + if (y_scale == 0) y_scale = 1.; + + user_scaled_font->snap_x_scale = x_scale; + user_scaled_font->snap_y_scale = y_scale; + + /* since glyphs are pretty much 1.0x1.0, we can reduce error by + * scaling to a larger square. say, 1024.x1024. */ + fixed_scale = 1024.; + x_scale /= fixed_scale; + y_scale /= fixed_scale; + + cairo_matrix_scale (&user_scaled_font->extent_scale, 1. / x_scale, 1. / y_scale); + + user_scaled_font->extent_x_scale = x_scale; + user_scaled_font->extent_y_scale = y_scale; + } + } + + if (status == CAIRO_STATUS_SUCCESS && + font_face->scaled_font_methods.init != NULL) + { + /* Lock the scaled_font mutex such that user doesn't accidentally try + * to use it just yet. */ + CAIRO_MUTEX_LOCK (user_scaled_font->base.mutex); + + /* Give away fontmap lock such that user-font can use other fonts */ + status = _cairo_scaled_font_register_placeholder_and_unlock_font_map (&user_scaled_font->base); + if (status == CAIRO_STATUS_SUCCESS) { + cairo_surface_t *recording_surface; + cairo_t *cr; + + recording_surface = _cairo_user_scaled_font_create_recording_surface (user_scaled_font); + cr = _cairo_user_scaled_font_create_recording_context (user_scaled_font, recording_surface); + cairo_surface_destroy (recording_surface); + + status = font_face->scaled_font_methods.init (&user_scaled_font->base, + cr, + &font_extents); + + if (status == CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED) + status = CAIRO_STATUS_SUCCESS; + + if (status == CAIRO_STATUS_SUCCESS) + status = cairo_status (cr); + + cairo_destroy (cr); + + _cairo_scaled_font_unregister_placeholder_and_lock_font_map (&user_scaled_font->base); + } + + CAIRO_MUTEX_UNLOCK (user_scaled_font->base.mutex); + } + + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_scaled_font_set_metrics (&user_scaled_font->base, &font_extents); + + if (status != CAIRO_STATUS_SUCCESS) { + _cairo_scaled_font_fini (&user_scaled_font->base); + free (user_scaled_font); + } else { + user_scaled_font->default_glyph_extents.x_bearing = 0.; + user_scaled_font->default_glyph_extents.y_bearing = -font_extents.ascent; + user_scaled_font->default_glyph_extents.width = 0.; + user_scaled_font->default_glyph_extents.height = font_extents.ascent + font_extents.descent; + user_scaled_font->default_glyph_extents.x_advance = font_extents.max_x_advance; + user_scaled_font->default_glyph_extents.y_advance = 0.; + + *scaled_font = &user_scaled_font->base; + } + + return status; +} + +const cairo_font_face_backend_t _cairo_user_font_face_backend = { + CAIRO_FONT_TYPE_USER, + _cairo_user_font_face_create_for_toy, + _cairo_font_face_destroy, + _cairo_user_font_face_scaled_font_create +}; + + +cairo_bool_t +_cairo_font_face_is_user (cairo_font_face_t *font_face) +{ + return font_face->backend == &_cairo_user_font_face_backend; +} + +/* Implement the public interface */ + +/** + * cairo_user_font_face_create: + * + * Creates a new user font-face. + * + * Use the setter functions to associate callbacks with the returned + * user font. The only mandatory callback is render_glyph. + * + * After the font-face is created, the user can attach arbitrary data + * (the actual font data) to it using cairo_font_face_set_user_data() + * and access it from the user-font callbacks by using + * cairo_scaled_font_get_font_face() followed by + * cairo_font_face_get_user_data(). + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.8 + **/ +cairo_font_face_t * +cairo_user_font_face_create (void) +{ + cairo_user_font_face_t *font_face; + + font_face = malloc (sizeof (cairo_user_font_face_t)); + if (!font_face) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *)&_cairo_font_face_nil; + } + + _cairo_font_face_init (&font_face->base, &_cairo_user_font_face_backend); + + font_face->immutable = FALSE; + memset (&font_face->scaled_font_methods, 0, sizeof (font_face->scaled_font_methods)); + + return &font_face->base; +} +slim_hidden_def(cairo_user_font_face_create); + +/* User-font method setters */ + + +/** + * cairo_user_font_face_set_init_func: + * @font_face: A user font face + * @init_func: The init callback, or %NULL + * + * Sets the scaled-font initialization function of a user-font. + * See #cairo_user_scaled_font_init_func_t for details of how the callback + * works. + * + * The font-face should not be immutable or a %CAIRO_STATUS_USER_FONT_IMMUTABLE + * error will occur. A user font-face is immutable as soon as a scaled-font + * is created from it. + * + * Since: 1.8 + **/ +void +cairo_user_font_face_set_init_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_init_func_t init_func) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + if (user_font_face->immutable) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_USER_FONT_IMMUTABLE)) + return; + } + user_font_face->scaled_font_methods.init = init_func; +} +slim_hidden_def(cairo_user_font_face_set_init_func); + +/** + * cairo_user_font_face_set_render_glyph_func: + * @font_face: A user font face + * @render_glyph_func: The render_glyph callback, or %NULL + * + * Sets the glyph rendering function of a user-font. + * See #cairo_user_scaled_font_render_glyph_func_t for details of how the callback + * works. + * + * The font-face should not be immutable or a %CAIRO_STATUS_USER_FONT_IMMUTABLE + * error will occur. A user font-face is immutable as soon as a scaled-font + * is created from it. + * + * The render_glyph callback is the only mandatory callback of a user-font. + * If the callback is %NULL and a glyph is tried to be rendered using + * @font_face, a %CAIRO_STATUS_USER_FONT_ERROR will occur. + * + * Since: 1.8 + **/ +void +cairo_user_font_face_set_render_glyph_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_render_glyph_func_t render_glyph_func) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + if (user_font_face->immutable) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_USER_FONT_IMMUTABLE)) + return; + } + user_font_face->scaled_font_methods.render_glyph = render_glyph_func; +} +slim_hidden_def(cairo_user_font_face_set_render_glyph_func); + +/** + * cairo_user_font_face_set_text_to_glyphs_func: + * @font_face: A user font face + * @text_to_glyphs_func: The text_to_glyphs callback, or %NULL + * + * Sets th text-to-glyphs conversion function of a user-font. + * See #cairo_user_scaled_font_text_to_glyphs_func_t for details of how the callback + * works. + * + * The font-face should not be immutable or a %CAIRO_STATUS_USER_FONT_IMMUTABLE + * error will occur. A user font-face is immutable as soon as a scaled-font + * is created from it. + * + * Since: 1.8 + **/ +void +cairo_user_font_face_set_text_to_glyphs_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_text_to_glyphs_func_t text_to_glyphs_func) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + if (user_font_face->immutable) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_USER_FONT_IMMUTABLE)) + return; + } + user_font_face->scaled_font_methods.text_to_glyphs = text_to_glyphs_func; +} + +/** + * cairo_user_font_face_set_unicode_to_glyph_func: + * @font_face: A user font face + * @unicode_to_glyph_func: The unicode_to_glyph callback, or %NULL + * + * Sets the unicode-to-glyph conversion function of a user-font. + * See #cairo_user_scaled_font_unicode_to_glyph_func_t for details of how the callback + * works. + * + * The font-face should not be immutable or a %CAIRO_STATUS_USER_FONT_IMMUTABLE + * error will occur. A user font-face is immutable as soon as a scaled-font + * is created from it. + * + * Since: 1.8 + **/ +void +cairo_user_font_face_set_unicode_to_glyph_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_unicode_to_glyph_func_t unicode_to_glyph_func) +{ + cairo_user_font_face_t *user_font_face; + if (font_face->status) + return; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + if (user_font_face->immutable) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_USER_FONT_IMMUTABLE)) + return; + } + user_font_face->scaled_font_methods.unicode_to_glyph = unicode_to_glyph_func; +} +slim_hidden_def(cairo_user_font_face_set_unicode_to_glyph_func); + +/* User-font method getters */ + +/** + * cairo_user_font_face_get_init_func: + * @font_face: A user font face + * + * Gets the scaled-font initialization function of a user-font. + * + * Return value: The init callback of @font_face + * or %NULL if none set or an error has occurred. + * + * Since: 1.8 + **/ +cairo_user_scaled_font_init_func_t +cairo_user_font_face_get_init_func (cairo_font_face_t *font_face) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return NULL; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return NULL; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + return user_font_face->scaled_font_methods.init; +} + +/** + * cairo_user_font_face_get_render_glyph_func: + * @font_face: A user font face + * + * Gets the glyph rendering function of a user-font. + * + * Return value: The render_glyph callback of @font_face + * or %NULL if none set or an error has occurred. + * + * Since: 1.8 + **/ +cairo_user_scaled_font_render_glyph_func_t +cairo_user_font_face_get_render_glyph_func (cairo_font_face_t *font_face) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return NULL; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return NULL; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + return user_font_face->scaled_font_methods.render_glyph; +} + +/** + * cairo_user_font_face_get_text_to_glyphs_func: + * @font_face: A user font face + * + * Gets the text-to-glyphs conversion function of a user-font. + * + * Return value: The text_to_glyphs callback of @font_face + * or %NULL if none set or an error occurred. + * + * Since: 1.8 + **/ +cairo_user_scaled_font_text_to_glyphs_func_t +cairo_user_font_face_get_text_to_glyphs_func (cairo_font_face_t *font_face) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return NULL; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return NULL; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + return user_font_face->scaled_font_methods.text_to_glyphs; +} + +/** + * cairo_user_font_face_get_unicode_to_glyph_func: + * @font_face: A user font face + * + * Gets the unicode-to-glyph conversion function of a user-font. + * + * Return value: The unicode_to_glyph callback of @font_face + * or %NULL if none set or an error occurred. + * + * Since: 1.8 + **/ +cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_user_font_face_get_unicode_to_glyph_func (cairo_font_face_t *font_face) +{ + cairo_user_font_face_t *user_font_face; + + if (font_face->status) + return NULL; + + if (! _cairo_font_face_is_user (font_face)) { + if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) + return NULL; + } + + user_font_face = (cairo_user_font_face_t *) font_face; + return user_font_face->scaled_font_methods.unicode_to_glyph; +} diff --git a/src/cairo-version.c b/src/cairo-version.c new file mode 100644 index 000000000..a94cef681 --- /dev/null +++ b/src/cairo-version.c @@ -0,0 +1,261 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#define CAIRO_VERSION_H 1 + +#include "cairoint.h" + +/* get the "real" version info instead of dummy cairo-version.h */ +#undef CAIRO_VERSION_H +#include "../cairo-version.h" + +/** + * SECTION:cairo-version + * @Title: Version Information + * @Short_Description: Compile-time and run-time version checks. + * + * Cairo has a three-part version number scheme. In this scheme, we use + * even vs. odd numbers to distinguish fixed points in the software + * vs. in-progress development, (such as from git instead of a tar file, + * or as a "snapshot" tar file as opposed to a "release" tar file). + * + * + * _____ Major. Always 1, until we invent a new scheme. + * / ___ Minor. Even/Odd = Release/Snapshot (tar files) or Branch/Head (git) + * | / _ Micro. Even/Odd = Tar-file/git + * | | / + * 1.0.0 + * + * + * Here are a few examples of versions that one might see. + * + * Releases + * -------- + * 1.0.0 - A major release + * 1.0.2 - A subsequent maintenance release + * 1.2.0 - Another major release + *   + * Snapshots + * --------- + * 1.1.2 - A snapshot (working toward the 1.2.0 release) + *   + * In-progress development (eg. from git) + * -------------------------------------- + * 1.0.1 - Development on a maintenance branch (toward 1.0.2 release) + * 1.1.1 - Development on head (toward 1.1.2 snapshot and 1.2.0 release) + * + * + * + * Compatibility + * + * The API/ABI compatibility guarantees for various versions are as + * follows. First, let's assume some cairo-using application code that is + * successfully using the API/ABI "from" one version of cairo. Then let's + * ask the question whether this same code can be moved "to" the API/ABI + * of another version of cairo. + * + * Moving from a release to any later version (release, snapshot, + * development) is always guaranteed to provide compatibility. + * + * Moving from a snapshot to any later version is not guaranteed to + * provide compatibility, since snapshots may introduce new API that ends + * up being removed before the next release. + * + * Moving from an in-development version (odd micro component) to any + * later version is not guaranteed to provide compatibility. In fact, + * there's not even a guarantee that the code will even continue to work + * with the same in-development version number. This is because these + * numbers don't correspond to any fixed state of the software, but + * rather the many states between snapshots and releases. + * + * + * + * Examining the version + * + * Cairo provides the ability to examine the version at either + * compile-time or run-time and in both a human-readable form as well as + * an encoded form suitable for direct comparison. Cairo also provides the + * macro CAIRO_VERSION_ENCODE() to perform the encoding. + * + * + * Compile-time + * ------------ + * CAIRO_VERSION_STRING Human-readable + * CAIRO_VERSION Encoded, suitable for comparison + *   + * Run-time + * -------- + * cairo_version_string() Human-readable + * cairo_version() Encoded, suitable for comparison + * + * + * For example, checking that the cairo version is greater than or equal + * to 1.0.0 could be achieved at compile-time or run-time as follows: + * + * + * ##if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 0, 0) + * printf ("Compiling with suitable cairo version: %s\n", %CAIRO_VERSION_STRING); + * ##endif + * + * if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 0, 0)) + * printf ("Running with suitable cairo version: %s\n", cairo_version_string ()); + * + * + * + * + **/ + +/** + * CAIRO_VERSION: + * + * The version of cairo available at compile-time, encoded using + * CAIRO_VERSION_ENCODE(). + * + * Since: 1.0 + **/ + +/** + * CAIRO_VERSION_MAJOR: + * + * The major component of the version of cairo available at compile-time. + * + * Since: 1.0 + **/ + +/** + * CAIRO_VERSION_MINOR: + * + * The minor component of the version of cairo available at compile-time. + * + * Since: 1.0 + **/ + +/** + * CAIRO_VERSION_MICRO: + * + * The micro component of the version of cairo available at compile-time. + * + * Since: 1.0 + **/ + +/** + * CAIRO_VERSION_STRING: + * + * A human-readable string literal containing the version of cairo available + * at compile-time, in the form of "X.Y.Z". + * + * Since: 1.8 + **/ + +/** + * CAIRO_VERSION_ENCODE: + * @major: the major component of the version number + * @minor: the minor component of the version number + * @micro: the micro component of the version number + * + * This macro encodes the given cairo version into an integer. The numbers + * returned by %CAIRO_VERSION and cairo_version() are encoded using this macro. + * Two encoded version numbers can be compared as integers. The encoding ensures + * that later versions compare greater than earlier versions. + * + * Returns: the encoded version. + * + * Since: 1.0 + **/ + +/** + * CAIRO_VERSION_STRINGIZE: + * @major: the major component of the version number + * @minor: the minor component of the version number + * @micro: the micro component of the version number + * + * This macro encodes the given cairo version into an string. The numbers + * returned by %CAIRO_VERSION_STRING and cairo_version_string() are encoded using this macro. + * The parameters to this macro must expand to numerical literals. + * + * Returns: a string literal containing the version. + * + * Since: 1.8 + **/ + +/** + * cairo_version: + * + * Returns the version of the cairo library encoded in a single + * integer as per %CAIRO_VERSION_ENCODE. The encoding ensures that + * later versions compare greater than earlier versions. + * + * A run-time comparison to check that cairo's version is greater than + * or equal to version X.Y.Z could be performed as follows: + * + * + * if (cairo_version() >= CAIRO_VERSION_ENCODE(X,Y,Z)) {...} + * + * + * See also cairo_version_string() as well as the compile-time + * equivalents %CAIRO_VERSION and %CAIRO_VERSION_STRING. + * + * Return value: the encoded version. + * + * Since: 1.0 + **/ +int +cairo_version (void) +{ + return CAIRO_VERSION; +} + +/** + * cairo_version_string: + * + * Returns the version of the cairo library as a human-readable string + * of the form "X.Y.Z". + * + * See also cairo_version() as well as the compile-time equivalents + * %CAIRO_VERSION_STRING and %CAIRO_VERSION. + * + * Return value: a string containing the version. + * + * Since: 1.0 + **/ +const char* +cairo_version_string (void) +{ + return CAIRO_VERSION_STRING; +} +slim_hidden_def (cairo_version_string); diff --git a/src/cairo-version.h b/src/cairo-version.h new file mode 100644 index 000000000..51008003f --- /dev/null +++ b/src/cairo-version.h @@ -0,0 +1,14 @@ +/* This is a dummy file. + * The actual version info is in toplevel cairo-version.h. + * The purpose of this file is to make most of the source files NOT depend + * on the real cairo-version.h, and as a result, changing library version + * would not cause a complete rebuild of all object files (just a relink). + * This is useful when bisecting. */ +#ifndef CAIRO_VERSION_H +#define CAIRO_VERSION_H + +#define CAIRO_VERSION_MAJOR USE_cairo_version_OR_cairo_version_string_INSTEAD +#define CAIRO_VERSION_MINOR USE_cairo_version_OR_cairo_version_string_INSTEAD +#define CAIRO_VERSION_MICRO USE_cairo_version_OR_cairo_version_string_INSTEAD + +#endif diff --git a/src/cairo-vg-surface.c b/src/cairo-vg-surface.c new file mode 100644 index 000000000..6e0d9a0ed --- /dev/null +++ b/src/cairo-vg-surface.c @@ -0,0 +1,1853 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Opened Hand Ltd. + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.og/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Pierre Tardy + * Øyvind KolÃ¥s + * Vladimi Vukicevic (stubbed out base backend) + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-vg.h" + +#include "cairo-cache-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-surface-clipper-private.h" + +#include +#include + +//#define OPENVG_DEBUG + +/* + * Work that needs to be done: + * - Glyph cache / proper font support + * + * - First-class paths + * Paths are expensive for OpenVG, reuse paths whenever possible. + * So add a path cache, and first class paths! + */ + +typedef struct _cairo_vg_surface cairo_vg_surface_t; + +/* XXX need GL specific context control. :( */ +struct _cairo_vg_context { + cairo_status_t status; + cairo_reference_count_t ref_count; + + unsigned long target_id; + + VGPaint paint; + cairo_vg_surface_t *source; + double alpha; + + cairo_cache_t snapshot_cache; + + void *display; + void *context; + + cairo_status_t (*create_target) (cairo_vg_context_t *, + cairo_vg_surface_t *); + cairo_status_t (*set_target) (cairo_vg_context_t *, + cairo_vg_surface_t *); + void (*destroy_target) (cairo_vg_context_t *, cairo_vg_surface_t *); +}; + +struct _cairo_vg_surface { + cairo_surface_t base; + + cairo_vg_context_t *context; + + VGImage image; + VGImageFormat format; + int width; + int height; + cairo_bool_t own_image; + + cairo_cache_entry_t snapshot_cache_entry; + + cairo_surface_clipper_t clipper; + + unsigned long target_id; +}; + +static const cairo_surface_backend_t cairo_vg_surface_backend; + +slim_hidden_proto (cairo_vg_surface_create); + +static cairo_surface_t * +_vg_surface_create_internal (cairo_vg_context_t *context, + VGImage image, + VGImageFormat format, + int width, int height); + +static cairo_vg_context_t * +_vg_context_reference (cairo_vg_context_t *context) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&context->ref_count)); + + _cairo_reference_count_inc (&context->ref_count); + + return context; +} + +static cairo_vg_context_t * +_vg_context_lock (cairo_vg_context_t *context) +{ + /* XXX if we need to add locking, then it has to be recursive */ + return context; +} + +static cairo_int_status_t +_vg_context_set_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ + cairo_status_t status; + + if (surface->target_id == 0) { + status = context->create_target (context, surface); + if (unlikely (status)) + return status; + } + + if (context->target_id == surface->target_id) + return CAIRO_STATUS_SUCCESS; + + context->target_id = surface->target_id; + + return context->set_target (context, surface); +} + +static void +_vg_context_destroy_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ + if (surface->target_id == 0) + return; + + if (context->target_id == surface->target_id) + context->set_target (context, NULL); + + context->destroy_target (context, surface); +} + +static cairo_bool_t +_vg_snapshot_cache_can_remove (const void *entry) +{ + return TRUE; +} + +static void +_vg_snapshot_cache_remove (void *cache_entry) +{ + cairo_vg_surface_t *surface = cairo_container_of (cache_entry, + cairo_vg_surface_t, + snapshot_cache_entry); + surface->snapshot_cache_entry.hash = 0; + cairo_surface_destroy (&surface->base); +} + +static cairo_status_t +_vg_context_init (cairo_vg_context_t *context) +{ + cairo_status_t status; + + context->status = CAIRO_STATUS_SUCCESS; + CAIRO_REFERENCE_COUNT_INIT (&context->ref_count, 1); + + status = _cairo_cache_init (&context->snapshot_cache, + NULL, + _vg_snapshot_cache_can_remove, + _vg_snapshot_cache_remove, + 16*1024*1024); + if (unlikely (status)) + return status; + + context->target_id = 0; + context->source = NULL; + context->alpha = 1.0; + + context->paint = vgCreatePaint (); + vgLoadIdentity (); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_vg_context_destroy (cairo_vg_context_t *context) +{ + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&context->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&context->ref_count)) + return; + + if (context->paint != VG_INVALID_HANDLE) + vgDestroyPaint (context->paint); + + _cairo_cache_fini (&context->snapshot_cache); + free (context); +} + +static void +_vg_context_unlock (cairo_vg_context_t *context) +{ +} + +#ifdef OPENVG_DEBUG +static void check_vg_errors(const char*function,int line) +{ + int err = vgGetError(); + if (err != VG_NO_ERROR){ + printf("%s+%d:vgError detected: 0x%08x.\n",function, line,err); + assert(err == VG_NO_ERROR); + } + +} +#define CHECK_VG_ERRORS() check_vg_errors(__FILE__,__LINE__) +#else +#define CHECK_VG_ERRORS() do{}while(0) +#endif //OPENVG_DEBUG + +static pixman_format_code_t +_vg_format_to_pixman (VGImageFormat format, + cairo_bool_t *needs_premult_fixup) +{ + *needs_premult_fixup = FALSE; + switch (format) { + /* RGB{A,X} channel ordering */ + case VG_sRGBX_8888: return PIXMAN_r8g8b8x8; + case VG_sRGBA_8888: *needs_premult_fixup = TRUE; return PIXMAN_r8g8b8a8; + case VG_sRGBA_8888_PRE: return PIXMAN_r8g8b8a8; + case VG_sRGB_565: return PIXMAN_r5g6b5; + case VG_sRGBA_5551: return 0; + case VG_sRGBA_4444: return 0; + case VG_sL_8: return PIXMAN_g8; + case VG_lRGBX_8888: return 0; + case VG_lRGBA_8888: return 0; + case VG_lRGBA_8888_PRE: return 0; + case VG_lL_8: return 0; + case VG_A_8: return PIXMAN_a8; + case VG_BW_1: return PIXMAN_a1; + case VG_A_1: return PIXMAN_a1; + case VG_A_4: return PIXMAN_a4; + + /* {A,X}RGB channel ordering */ + case VG_sXRGB_8888: return PIXMAN_x8r8g8b8; + case VG_sARGB_8888: *needs_premult_fixup = TRUE; return PIXMAN_a8r8g8b8; + case VG_sARGB_8888_PRE: return PIXMAN_a8r8g8b8; + case VG_sARGB_1555: return 0; + case VG_sARGB_4444: return 0; + case VG_lXRGB_8888: return 0; + case VG_lARGB_8888: return 0; + case VG_lARGB_8888_PRE: return 0; + + /* BGR{A,X} channel ordering */ + case VG_sBGRX_8888: return PIXMAN_b8g8r8x8; + case VG_sBGRA_8888: *needs_premult_fixup = TRUE; return PIXMAN_b8g8r8a8; + case VG_sBGRA_8888_PRE: return PIXMAN_b8g8r8a8; + case VG_sBGR_565: return PIXMAN_b5g6r5; + case VG_sBGRA_5551: return 0; + case VG_sBGRA_4444: return 0; + case VG_lBGRX_8888: return 0; + case VG_lBGRA_8888: return 0; + case VG_lBGRA_8888_PRE: return 0; + + /* {A,X}BGR channel ordering */ + case VG_sXBGR_8888: return PIXMAN_x8b8g8r8; + case VG_sABGR_8888: *needs_premult_fixup = TRUE; return PIXMAN_a8b8g8r8; + case VG_sABGR_8888_PRE: return PIXMAN_a8b8g8r8; + case VG_sABGR_1555: return 0; + case VG_sABGR_4444: return 0; + case VG_lXBGR_8888: return 0; + case VG_lABGR_8888: return 0; + case VG_lABGR_8888_PRE: return 0; + default: return 0; + } +} + +static pixman_format_code_t +_vg_format_to_content (VGImageFormat format) +{ + /* XXX could use more simple bit tests */ + switch (format) { + /* RGB{A,X} channel ordering */ + case VG_sRGBX_8888: return CAIRO_CONTENT_COLOR; + case VG_sRGBA_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sRGBA_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sRGB_565: return CAIRO_CONTENT_COLOR; + case VG_sRGBA_5551: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sRGBA_4444: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sL_8: return CAIRO_CONTENT_ALPHA; + case VG_lRGBX_8888: return CAIRO_CONTENT_COLOR; + case VG_lRGBA_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lRGBA_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lL_8: return CAIRO_CONTENT_ALPHA; + case VG_A_8: return CAIRO_CONTENT_ALPHA; + case VG_A_4: return CAIRO_CONTENT_ALPHA; + case VG_A_1: return CAIRO_CONTENT_ALPHA; + case VG_BW_1: return CAIRO_CONTENT_ALPHA; + + /* {A,X}RGB channel ordering */ + case VG_sXRGB_8888: return CAIRO_CONTENT_COLOR; + case VG_sARGB_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sARGB_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sARGB_1555: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sARGB_4444: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lXRGB_8888: return CAIRO_CONTENT_COLOR; + case VG_lARGB_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lARGB_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + + /* BGR{A,X} channel ordering */ + case VG_sBGRX_8888: return CAIRO_CONTENT_COLOR; + case VG_sBGRA_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sBGRA_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sBGR_565: return CAIRO_CONTENT_COLOR; + case VG_sBGRA_5551: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sBGRA_4444: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lBGRX_8888: return CAIRO_CONTENT_COLOR; + case VG_lBGRA_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lBGRA_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + + /* {A,X}BGR channel ordering */ + case VG_sXBGR_8888: return CAIRO_CONTENT_COLOR; + case VG_sABGR_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sABGR_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sABGR_1555: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_sABGR_4444: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lXBGR_8888: return CAIRO_CONTENT_COLOR; + case VG_lABGR_8888: return CAIRO_CONTENT_COLOR_ALPHA; + case VG_lABGR_8888_PRE: return CAIRO_CONTENT_COLOR_ALPHA; + default: return 0; + } +} + +static VGImageFormat +_vg_format_from_pixman (pixman_format_code_t format) +{ + /* XXX _PRE needs fixup */ + switch ((int) format) { + case PIXMAN_r5g6b5: return VG_sRGB_565; + case PIXMAN_g8: return VG_sL_8; + case PIXMAN_a8: return VG_A_8; + case PIXMAN_a1: return VG_BW_1; + case PIXMAN_x8r8g8b8: return VG_sXRGB_8888; + case PIXMAN_a8r8g8b8: return VG_sARGB_8888; // _PRE + case PIXMAN_b8g8r8x8: return VG_sBGRX_8888; + case PIXMAN_b8g8r8a8: return VG_sBGRA_8888; // _PRE + case PIXMAN_b5g6r5: return VG_sBGR_565; + case PIXMAN_x8b8g8r8: return VG_sXBGR_8888; + case PIXMAN_a8b8g8r8: return VG_sABGR_8888; // _PRE + default: return 0; + } +} + +static VGImageFormat +_vg_format_for_content (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: return VG_A_8; + case CAIRO_CONTENT_COLOR: return VG_sXRGB_8888; + default: ASSERT_NOT_REACHED; + case CAIRO_CONTENT_COLOR_ALPHA: return VG_sARGB_8888; // _PRE + } +} + +static cairo_surface_t * +_vg_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_vg_surface_t *surface = abstract_surface; + + if (width > vgGeti (VG_MAX_IMAGE_WIDTH) || + height > vgGeti (VG_MAX_IMAGE_HEIGHT)) + { + return NULL; + } + + return cairo_vg_surface_create (surface->context, content, width, height); +} + +static cairo_status_t +_vg_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_vg_surface_t *surface = cairo_container_of (clipper, + cairo_vg_surface_t, + clipper); + cairo_vg_surface_t *mask; + cairo_status_t status; + + if (path == NULL) { + vgMask (VG_INVALID_HANDLE, + VG_FILL_MASK, 0, 0, surface->width, surface->height); + vgSeti (VG_MASKING, VG_FALSE); + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; + } + + mask = (cairo_vg_surface_t *) + _vg_surface_create_similar (surface, CAIRO_CONTENT_ALPHA, + surface->width, surface->height); + if (unlikely (mask == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + if (unlikely (mask->base.status)) + return mask->base.status; + + status = _cairo_surface_fill (&mask->base, + CAIRO_OPERATOR_SOURCE, + &_cairo_pattern_white.base, + path, fill_rule, tolerance, antialias, + NULL); + if (status) { + cairo_surface_destroy (&mask->base); + return status; + } + + vgSeti (VG_MASKING, VG_TRUE); + vgMask (mask->image, VG_INTERSECT_MASK, 0, 0, mask->width, mask->height); + + cairo_surface_destroy (&mask->base); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_vg_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_vg_surface_t *surface = abstract_surface; + + extents->x = 0; + extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + + return TRUE; +} + +#define MAX_SEG 16 /* max number of knots to upload in a batch */ + +typedef struct _vg_path { + VGPath path; + const cairo_matrix_t *ctm_inverse; + + VGubyte gseg[MAX_SEG]; + VGfloat gdata[MAX_SEG*3*2]; + int dcount; + int scount; +} vg_path_t; + +static cairo_status_t +_vg_move_to (void *closure, + const cairo_point_t *point) +{ + vg_path_t *path = closure; + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (path->ctm_inverse) + cairo_matrix_transform_point (path->ctm_inverse, &x, &y); + + path->gseg[path->scount++] = VG_MOVE_TO; + path->gdata[path->dcount++] = x; + path->gdata[path->dcount++] = y; + + if (path->scount >= MAX_SEG-1) { + vgAppendPathData (path->path, path->scount, path->gseg, path->gdata); + path->scount = 0; + path->dcount = 0; + } + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_vg_line_to (void *closure, + const cairo_point_t *point) +{ + vg_path_t *path = closure; + double x = _cairo_fixed_to_double (point->x); + double y = _cairo_fixed_to_double (point->y); + + if (path->ctm_inverse) + cairo_matrix_transform_point (path->ctm_inverse, &x, &y); + + path->gseg[path->scount++] = VG_LINE_TO; + path->gdata[path->dcount++] = x; + path->gdata[path->dcount++] = y; + + if (path->scount >= MAX_SEG-1) { + vgAppendPathData (path->path, path->scount, path->gseg, path->gdata); + path->scount = 0; + path->dcount = 0; + } + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_vg_curve_to (void *closure, + const cairo_point_t *p0, + const cairo_point_t *p1, + const cairo_point_t *p2) +{ + vg_path_t *path = closure; + double x0 = _cairo_fixed_to_double (p0->x); + double y0 = _cairo_fixed_to_double (p0->y); + double x1 = _cairo_fixed_to_double (p1->x); + double y1 = _cairo_fixed_to_double (p1->y); + double x2 = _cairo_fixed_to_double (p2->x); + double y2 = _cairo_fixed_to_double (p2->y); + + if (path->ctm_inverse) { + cairo_matrix_transform_point (path->ctm_inverse, &x0, &y0); + cairo_matrix_transform_point (path->ctm_inverse, &x1, &y1); + cairo_matrix_transform_point (path->ctm_inverse, &x2, &y2); + } + + path->gseg[path->scount++] = VG_CUBIC_TO; + path->gdata[path->dcount++] = x0; + path->gdata[path->dcount++] = y0; + path->gdata[path->dcount++] = x1; + path->gdata[path->dcount++] = y1; + path->gdata[path->dcount++] = x2; + path->gdata[path->dcount++] = y2; + + if (path->scount >= MAX_SEG-1) { + vgAppendPathData(path->path, path->scount, path->gseg, path->gdata); + path->scount = 0; + path->dcount = 0; + } + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_vg_close_path (void *closure) +{ + vg_path_t *path = closure; + + path->gseg[path->scount++] = VG_CLOSE_PATH; + + if (path->scount >= MAX_SEG-1) { + vgAppendPathData (path->path, path->scount, path->gseg, path->gdata); + path->scount = 0; + path->dcount = 0; + } + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static void +_vg_path_from_cairo (vg_path_t *vg_path, + const cairo_path_fixed_t *path) +{ + cairo_status_t status; + + vg_path->scount = 0; + vg_path->dcount = 0; + + status = _cairo_path_fixed_interpret (path, + _vg_move_to, + _vg_line_to, + _vg_curve_to, + _vg_close_path, + vg_path); + assert (status == CAIRO_STATUS_SUCCESS); + + vgAppendPathData (vg_path->path, + vg_path->scount, vg_path->gseg, vg_path->gdata); + CHECK_VG_ERRORS(); +} + +static cairo_bool_t +_vg_is_supported_operator (cairo_operator_t op) +{ + switch ((int) op) { + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_IN: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_ADD: + return TRUE; + + default: + return FALSE; + } +} + +static VGBlendMode +_vg_operator (cairo_operator_t op) +{ + switch ((int) op) { + case CAIRO_OPERATOR_SOURCE: + return VG_BLEND_SRC; + case CAIRO_OPERATOR_OVER: + return VG_BLEND_SRC_OVER; + case CAIRO_OPERATOR_IN: + return VG_BLEND_SRC_IN; + case CAIRO_OPERATOR_DEST_OVER: + return VG_BLEND_DST_OVER; + case CAIRO_OPERATOR_DEST_IN: + return VG_BLEND_DST_IN; + case CAIRO_OPERATOR_ADD: + return VG_BLEND_ADDITIVE; + default: + ASSERT_NOT_REACHED; + return VG_BLEND_SRC_OVER; + } +} + +static VGFillRule +_vg_fill_rule_from_cairo (cairo_fill_rule_t rule) +{ + switch (rule) { + case CAIRO_FILL_RULE_EVEN_ODD: return VG_EVEN_ODD; + case CAIRO_FILL_RULE_WINDING: return VG_NON_ZERO; + } + + ASSERT_NOT_REACHED; + return VG_NON_ZERO; +} + +static VGRenderingQuality +_vg_rendering_quality_from_cairo (cairo_antialias_t aa) +{ + switch (aa) { + case CAIRO_ANTIALIAS_DEFAULT: + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_GOOD: + case CAIRO_ANTIALIAS_BEST: + return VG_RENDERING_QUALITY_BETTER; + + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_FAST: + return VG_RENDERING_QUALITY_FASTER; + + case CAIRO_ANTIALIAS_NONE: + return VG_RENDERING_QUALITY_NONANTIALIASED; + } + + ASSERT_NOT_REACHED; + return VG_RENDERING_QUALITY_BETTER; +} + +static VGCapStyle +_vg_line_cap_from_cairo (cairo_line_cap_t cap) +{ + switch (cap) { + case CAIRO_LINE_CAP_BUTT: return VG_CAP_BUTT; + case CAIRO_LINE_CAP_ROUND: return VG_CAP_ROUND; + case CAIRO_LINE_CAP_SQUARE: return VG_CAP_SQUARE; + } + + ASSERT_NOT_REACHED; + return VG_CAP_BUTT; +} + +static VGJoinStyle +_vg_line_join_from_cairo (cairo_line_join_t join) +{ + switch (join) { + case CAIRO_LINE_JOIN_MITER: return VG_JOIN_MITER; + case CAIRO_LINE_JOIN_ROUND: return VG_JOIN_ROUND; + case CAIRO_LINE_JOIN_BEVEL: return VG_JOIN_BEVEL; + } + + ASSERT_NOT_REACHED; + return VG_JOIN_MITER; +} + +static void +_vg_matrix_from_cairo (VGfloat *dst, const cairo_matrix_t *src) +{ + dst[0] = /* sx */ src->xx; + dst[1] = /* shy */ src->yx; + dst[2] = /* w0 */ 0; + dst[3] = /* shx */ src->xy; + dst[4] = /* sy */ src->yy; + dst[5] = /* w1 */ 0; + dst[6] = /* tx */ src->x0; + dst[7] = /* ty */ src->y0; + dst[8] = /* w2 */ 0; +} + +static cairo_status_t +_vg_setup_gradient_stops (cairo_vg_context_t *context, + const cairo_gradient_pattern_t *pattern) +{ + VGint numstops = pattern->n_stops; + VGfloat *stops, stack_stops[CAIRO_STACK_ARRAY_LENGTH (VGfloat)]; + int i; + + if (numstops*5 < ARRAY_LENGTH (stack_stops)) { + stops = stack_stops; + } else { + stops = _cairo_malloc_ab (numstops, 5*sizeof (VGfloat)); + if (unlikely (stops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + for (i = 0; i < numstops; i++) { + stops[i*5 + 0] = pattern->stops[i].offset; + stops[i*5 + 1] = pattern->stops[i].color.red; + stops[i*5 + 2] = pattern->stops[i].color.green; + stops[i*5 + 3] = pattern->stops[i].color.blue; + stops[i*5 + 4] = pattern->stops[i].color.alpha * context->alpha; + } + + vgSetParameterfv (context->paint, + VG_PAINT_COLOR_RAMP_STOPS, numstops * 5, stops); + + if (stops != stack_stops) + free (stops); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static void +_vg_set_source_matrix (const cairo_pattern_t *pat) +{ + cairo_matrix_t mat; + cairo_status_t status; + VGfloat vmat[9]; + + mat = pat->matrix; + status = cairo_matrix_invert (&mat); + assert (status == CAIRO_STATUS_SUCCESS); + + _vg_matrix_from_cairo (vmat, &mat); + + vgSeti (VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER); + vgLoadMatrix (vmat); + vgSeti (VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER); + vgLoadMatrix (vmat); + vgSeti (VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); + + CHECK_VG_ERRORS(); +} + +static cairo_status_t +_vg_setup_linear_source (cairo_vg_context_t *context, + const cairo_linear_pattern_t *lpat) +{ + VGfloat linear[4]; + + linear[0] = lpat->pd1.x; + linear[1] = lpat->pd1.y; + linear[2] = lpat->pd2.x; + linear[3] = lpat->pd2.y; + + vgSetParameteri (context->paint, + VG_PAINT_COLOR_RAMP_SPREAD_MODE, + VG_COLOR_RAMP_SPREAD_PAD); + vgSetParameteri (context->paint, + VG_PAINT_TYPE, + VG_PAINT_TYPE_LINEAR_GRADIENT); + vgSetParameterfv (context->paint, + VG_PAINT_LINEAR_GRADIENT, 4, linear); + + _vg_set_source_matrix (&lpat->base.base); + + CHECK_VG_ERRORS(); + return _vg_setup_gradient_stops (context, &lpat->base); + +} + +static cairo_status_t +_vg_setup_radial_source (cairo_vg_context_t *context, + const cairo_radial_pattern_t *rpat) +{ + VGfloat radial[5]; + + radial[0] = rpat->cd1.center.x; + radial[1] = rpat->cd1.center.y; + radial[2] = rpat->cd2.center.x; + radial[3] = rpat->cd2.center.y; + radial[4] = rpat->cd2.radius; + + vgSetParameteri (context->paint, + VG_PAINT_COLOR_RAMP_SPREAD_MODE, VG_COLOR_RAMP_SPREAD_PAD); + vgSetParameteri (context->paint, + VG_PAINT_TYPE, VG_PAINT_TYPE_RADIAL_GRADIENT); + vgSetParameterfv (context->paint, + VG_PAINT_RADIAL_GRADIENT, 5, radial); + + _vg_set_source_matrix (&rpat->base.base); + + /* FIXME: copy/adapt fixes from SVG backend to add inner radius */ + + CHECK_VG_ERRORS(); + return _vg_setup_gradient_stops (context, &rpat->base); +} + +static cairo_status_t +_vg_setup_solid_source (cairo_vg_context_t *context, + const cairo_solid_pattern_t *spat) +{ + VGfloat color[] = { + spat->color.red, + spat->color.green, + spat->color.blue, + spat->color.alpha * context->alpha + }; + + vgSetParameteri (context->paint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR); + vgSetParameterfv (context->paint, VG_PAINT_COLOR, 4, color); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_vg_surface_t * +_vg_clone_recording_surface (cairo_vg_context_t *context, + cairo_surface_t *surface) +{ + VGImage vg_image; + VGImageFormat format; + cairo_status_t status; + cairo_rectangle_int_t extents; + cairo_vg_surface_t *clone; + + status = _cairo_surface_get_extents (surface, &extents); + if (status) + return NULL; + + if (extents.width > vgGeti (VG_MAX_IMAGE_WIDTH) || + extents.height > vgGeti (VG_MAX_IMAGE_HEIGHT)) + { + return NULL; + } + + format = _vg_format_for_content (surface->content); + + /* NONALIASED, FASTER, BETTER */ + vg_image = vgCreateImage (format, + extents.width, extents.height, + VG_IMAGE_QUALITY_FASTER); + clone = (cairo_vg_surface_t *) + _vg_surface_create_internal (context, vg_image, format, + extents.width, extents.height); + cairo_surface_set_device_offset (&clone->base, -extents.x, -extents.y); + + status = _cairo_recording_surface_replay (surface, &clone->base); + if (unlikely (status)) { + cairo_surface_destroy (&clone->base); + return (cairo_vg_surface_t *) _cairo_surface_create_in_error (status); + } + + return clone; +} + +static cairo_vg_surface_t * +_vg_clone_image_surface (cairo_vg_context_t *context, + cairo_surface_t *surface) +{ + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + VGImage vg_image; + VGImageFormat format; + cairo_rectangle_int_t extents; + cairo_vg_surface_t *clone; + + if (surface->backend->acquire_source_image == NULL) + return NULL; + + status = _cairo_surface_get_extents (surface, &extents); + if (status) + return NULL; + + if (extents.width > vgGeti (VG_MAX_IMAGE_WIDTH) || + extents.height > vgGeti (VG_MAX_IMAGE_HEIGHT)) + { + return NULL; + } + + status = _cairo_surface_acquire_source_image (surface, + &image, &image_extra); + if (unlikely (status)) + return (cairo_vg_surface_t *) _cairo_surface_create_in_error (status); + + format = _vg_format_from_pixman (image->pixman_format); + if (format == 0) + format = _vg_format_for_content (image->base.content); + + /* NONALIASED, FASTER, BETTER */ + vg_image = vgCreateImage (format, + image->width, image->height, + VG_IMAGE_QUALITY_FASTER); + clone = (cairo_vg_surface_t *) + _vg_surface_create_internal (context, vg_image, format, + image->width, image->height); + if (unlikely (clone->base.status)) + return clone; + + vgImageSubData (clone->image, + image->data, image->stride, + format, 0, 0, image->width, image->height); + + _cairo_surface_release_source_image (surface, image, image_extra); + + return clone; +} + +static void +_vg_surface_remove_from_cache (cairo_surface_t *abstract_surface) +{ + cairo_vg_surface_t *surface = (cairo_vg_surface_t *) abstract_surface; + + if (surface->snapshot_cache_entry.hash) { + cairo_vg_context_t *context; + + context = _vg_context_lock (surface->context); + _cairo_cache_remove (&context->snapshot_cache, + &surface->snapshot_cache_entry); + _vg_context_unlock (context); + + surface->snapshot_cache_entry.hash = 0; + } +} + +static cairo_status_t +_vg_setup_surface_source (cairo_vg_context_t *context, + const cairo_surface_pattern_t *spat) +{ + cairo_surface_t *snapshot; + cairo_vg_surface_t *clone; + cairo_status_t status; + + snapshot = _cairo_surface_has_snapshot (spat->surface, + &cairo_vg_surface_backend); + if (snapshot != NULL) { + clone = (cairo_vg_surface_t *) cairo_surface_reference (snapshot); + goto DONE; + } + + if (_cairo_surface_is_recording (spat->surface)) + clone = _vg_clone_recording_surface (context, spat->surface); + else + clone = _vg_clone_image_surface (context, spat->surface); + if (clone == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + if (unlikely (clone->base.status)) + return clone->base.status; + + clone->snapshot_cache_entry.hash = clone->base.unique_id; + status = _cairo_cache_insert (&context->snapshot_cache, + &clone->snapshot_cache_entry); + if (unlikely (status)) { + clone->snapshot_cache_entry.hash = 0; + cairo_surface_destroy (&clone->base); + return status; + } + + _cairo_surface_attach_snapshot (spat->surface, &clone->base, + _vg_surface_remove_from_cache); + +DONE: + cairo_surface_destroy (&context->source->base); + context->source = clone; + + vgSetParameteri (context->paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN); + + switch (spat->base.extend) { + case CAIRO_EXTEND_PAD: + vgSetParameteri (context->paint, + VG_PAINT_PATTERN_TILING_MODE, + VG_TILE_PAD); + break; + + case CAIRO_EXTEND_NONE: + vgSetParameteri (context->paint, + VG_PAINT_PATTERN_TILING_MODE, + VG_TILE_FILL); + { + VGfloat color[] = {0,0,0,0}; + vgSetfv (VG_TILE_FILL_COLOR, 4, color); + } + break; + + case CAIRO_EXTEND_REPEAT: + vgSetParameteri (context->paint, + VG_PAINT_PATTERN_TILING_MODE, + VG_TILE_REPEAT); + break; + + default: + ASSERT_NOT_REACHED; + case CAIRO_EXTEND_REFLECT: + vgSetParameteri (context->paint, + VG_PAINT_PATTERN_TILING_MODE, + VG_TILE_REFLECT); + break; + } + vgPaintPattern (context->paint, context->source->image); + + _vg_set_source_matrix (&spat->base); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +setup_source (cairo_vg_context_t *context, + const cairo_pattern_t *source) +{ + switch (source->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return _vg_setup_solid_source (context, + (cairo_solid_pattern_t *) source); + case CAIRO_PATTERN_TYPE_LINEAR: + return _vg_setup_linear_source (context, + (cairo_linear_pattern_t *) source); + case CAIRO_PATTERN_TYPE_RADIAL: + return _vg_setup_radial_source (context, + (cairo_radial_pattern_t *) source); + case CAIRO_PATTERN_TYPE_SURFACE: + return _vg_setup_surface_source (context, + (cairo_surface_pattern_t *) source); + default: + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } +} + +static cairo_int_status_t +_vg_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_vg_surface_t *surface = abstract_surface; + cairo_vg_context_t *context; + cairo_status_t status; + VGfloat state[9]; + VGfloat strokeTransform[9]; + vg_path_t vg_path; + + if (! _vg_is_supported_operator (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + context = _vg_context_lock (surface->context); + status = _vg_context_set_target (context, surface); + if (status) { + _vg_context_unlock (context); + return status; + } + + status = setup_source (context, source); + if (status) { + _vg_context_unlock (context); + return status; + } + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) { + _vg_context_unlock (context); + return status; + } + + vg_path.path = vgCreatePath (VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1, 0, 0, 0, + VG_PATH_CAPABILITY_ALL); + + vgGetMatrix (state); + _vg_matrix_from_cairo (strokeTransform, ctm); + vgMultMatrix (strokeTransform); + + vg_path.ctm_inverse = ctm_inverse; + + _vg_path_from_cairo (&vg_path, path); + + /* XXX DASH_PATTERN, DASH_PHASE */ + vgSetf (VG_STROKE_LINE_WIDTH, style->line_width); + vgSetf (VG_STROKE_MITER_LIMIT, style->miter_limit); + vgSetf (VG_STROKE_JOIN_STYLE, _vg_line_join_from_cairo (style->line_join)); + vgSetf (VG_STROKE_CAP_STYLE, _vg_line_cap_from_cairo (style->line_cap)); + + vgSeti (VG_BLEND_MODE, _vg_operator (op)); + + vgSetPaint (context->paint, VG_STROKE_PATH); + + vgDrawPath (vg_path.path, VG_STROKE_PATH); + + vgDestroyPath (vg_path.path); + + vgLoadMatrix (state); + + CHECK_VG_ERRORS(); + _vg_context_unlock (context); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_vg_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_vg_surface_t *surface = abstract_surface; + cairo_vg_context_t *context; + cairo_status_t status; + vg_path_t vg_path; + + if (op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (! _vg_is_supported_operator (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + context = _vg_context_lock (surface->context); + status = _vg_context_set_target (context, surface); + if (status) { + _vg_context_unlock (context); + return status; + } + + status = setup_source (context, source); + if (status) { + _vg_context_unlock (context); + return status; + } + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) { + _vg_context_unlock (context); + return status; + } + + vg_path.path = vgCreatePath (VG_PATH_FORMAT_STANDARD, + VG_PATH_DATATYPE_F, + 1, 0, + 0, 0, + VG_PATH_CAPABILITY_ALL); + vg_path.ctm_inverse = NULL; + + _vg_path_from_cairo (&vg_path, path); + + /* XXX tolerance */ + + vgSeti (VG_BLEND_MODE, _vg_operator (op)); + vgSetf (VG_FILL_RULE, _vg_fill_rule_from_cairo (fill_rule)); + vgSetf (VG_RENDERING_QUALITY, _vg_rendering_quality_from_cairo (antialias)); + + vgSetPaint (context->paint, VG_FILL_PATH); + + vgDrawPath (vg_path.path, VG_FILL_PATH); + + vgDestroyPath (vg_path.path); + + _vg_context_unlock (context); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_vg_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_vg_surface_t *surface = abstract_surface; + cairo_vg_context_t *context; + cairo_status_t status; + + if (op == CAIRO_OPERATOR_DEST) + return CAIRO_STATUS_SUCCESS; + + if (! _vg_is_supported_operator (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + context = _vg_context_lock (surface->context); + status = _vg_context_set_target (context, surface); + if (status) { + _vg_context_unlock (context); + return status; + } + + status = setup_source (context, source); + if (status) { + _vg_context_unlock (context); + return status; + } + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (unlikely (status)) { + _vg_context_unlock (context); + return status; + } + + vgSeti (VG_BLEND_MODE, _vg_operator (op)); + vgSetPaint (context->paint, VG_FILL_PATH); + + { /* creating a rectangular path that should cover the extent */ + VGubyte segs[] = { + VG_MOVE_TO_ABS, VG_LINE_TO_ABS, + VG_LINE_TO_ABS, VG_LINE_TO_ABS, + VG_CLOSE_PATH + }; + VGfloat data[] = { + 0, 0, + surface->width, 0, + surface->width, surface->height, + 0, surface->height + }; + VGPath fullext; + + fullext = vgCreatePath (VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, + 1,0,0,0, VG_PATH_CAPABILITY_ALL); + vgAppendPathData (fullext, sizeof(segs), segs, data); + + vgDrawPath (fullext, VG_FILL_PATH); + + vgDestroyPath (fullext); + } + + _vg_context_unlock (context); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_vg_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_vg_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (! _vg_is_supported_operator (op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Handle paint-with-alpha to do fades cheaply */ + if (mask->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) mask; + cairo_vg_context_t *context = _vg_context_lock (surface->context); + double alpha = context->alpha; + + context->alpha = solid->color.alpha; + status = _vg_surface_paint (abstract_surface, op, source, clip); + context->alpha = alpha; + + _vg_context_unlock (context); + + return status; + } + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static void +_vg_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_OFF); +} + +static cairo_int_status_t +_vg_surface_show_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_path_fixed_t path; + + if (num_glyphs <= 0) + return CAIRO_STATUS_SUCCESS; + + _cairo_path_fixed_init (&path); + + /* XXX Glyph cache! OpenVG font support in 1.1? */ + + status = _cairo_scaled_font_glyph_path (scaled_font, + glyphs, num_glyphs, + &path); + if (unlikely (status)) + goto BAIL; + + status = _vg_surface_fill (abstract_surface, + op, source, &path, + CAIRO_FILL_RULE_WINDING, + CAIRO_GSTATE_TOLERANCE_DEFAULT, + CAIRO_ANTIALIAS_DEFAULT, + clip); +BAIL: + _cairo_path_fixed_fini (&path); + return status; +} + +static inline int +multiply_alpha (int alpha, int color) +{ + int temp = alpha * color + 0x80; + return (temp + (temp >> 8)) >> 8; +} + +static void +premultiply_argb (uint8_t *data, + int width, + int height, + int stride) +{ + int i; + + while (height --) { + uint32_t *row = (uint32_t *) data; + + for (i = 0; i < width; i++) { + uint32_t p = row[i]; + uint8_t alpha; + + alpha = p >> 24; + if (alpha == 0) { + row[i] = 0; + } else if (alpha != 0xff) { + uint8_t r = multiply_alpha (alpha, (p >> 16) & 0xff); + uint8_t g = multiply_alpha (alpha, (p >> 8) & 0xff); + uint8_t b = multiply_alpha (alpha, (p >> 0) & 0xff); + row[i] = (alpha << 24) | (r << 16) | (g << 8) | (b << 0); + } + } + + data += stride; + } +} + +static cairo_int_status_t +_vg_get_image (cairo_vg_surface_t *surface, + int x, int y, + int width, int height, + cairo_image_surface_t **image_out) +{ + cairo_image_surface_t *image; + pixman_image_t *pixman_image; + pixman_format_code_t pixman_format; + cairo_bool_t needs_premultiply; + + pixman_format = _vg_format_to_pixman (surface->format, + &needs_premultiply); + if (pixman_format == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + pixman_image = pixman_image_create_bits (pixman_format, + width, height, + NULL, 0); + if (unlikely (pixman_image == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + vgFinish (); + CHECK_VG_ERRORS(); + + vgGetImageSubData (surface->image, + pixman_image_get_data (pixman_image), + pixman_image_get_stride (pixman_image), + surface->format, + x, y, width, height); + + image = (cairo_image_surface_t *) + _cairo_image_surface_create_for_pixman_image (pixman_image, + pixman_format); + if (unlikely (image->base.status)) { + pixman_image_unref (pixman_image); + return image->base.status; + } + + if (needs_premultiply) + premultiply_argb (image->data, width, height, image->stride); + + *image_out = image; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_vg_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_vg_surface_t *surface = abstract_surface; + + CHECK_VG_ERRORS(); + *image_extra = NULL; + return _vg_get_image (surface, + 0, 0, surface->width, surface->height, + image_out); +} + +static void +_vg_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_status_t +_vg_surface_finish (void *abstract_surface) +{ + cairo_vg_surface_t *surface = abstract_surface; + cairo_vg_context_t *context = _vg_context_lock (surface->context); + + if (surface->snapshot_cache_entry.hash) { + _cairo_cache_remove (&context->snapshot_cache, + &surface->snapshot_cache_entry); + + surface->snapshot_cache_entry.hash = 0; + } + + _cairo_surface_clipper_reset (&surface->clipper); + + if (surface->own_image) + vgDestroyImage (surface->image); + + _vg_context_destroy_target (context, surface); + + _vg_context_unlock (context); + _vg_context_destroy (context); + + CHECK_VG_ERRORS(); + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t cairo_vg_surface_backend = { + CAIRO_SURFACE_TYPE_VG, + _vg_surface_finish, + + _cairo_default_context_create, /* XXX */ + + _vg_surface_create_similar, + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + _vg_surface_acquire_source_image, + _vg_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _vg_surface_get_extents, + _vg_surface_get_font_options, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark dirty */ + + _vg_surface_paint, + _vg_surface_mask, + _vg_surface_stroke, + _vg_surface_fill, + NULL, /* fill-stroke */ + _vg_surface_show_glyphs, +}; + +static cairo_surface_t * +_vg_surface_create_internal (cairo_vg_context_t *context, + VGImage image, + VGImageFormat format, + int width, int height) +{ + cairo_vg_surface_t *surface; + + surface = malloc (sizeof (cairo_vg_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface->context = _vg_context_reference (context); + + surface->image = image; + surface->format = format; + + _cairo_surface_init (&surface->base, + &cairo_vg_surface_backend, + NULL, /* device */ + _vg_format_to_content (format)); + + surface->width = width; + surface->height = height; + + _cairo_surface_clipper_init (&surface->clipper, + _vg_surface_clipper_intersect_clip_path); + + surface->snapshot_cache_entry.hash = 0; + + surface->target_id = 0; + + CHECK_VG_ERRORS(); + return &surface->base; +} + +cairo_surface_t * +cairo_vg_surface_create_for_image (cairo_vg_context_t *context, + VGImage image, + VGImageFormat format, + int width, int height) +{ + cairo_bool_t premult; + + if (context->status) + return _cairo_surface_create_in_error (context->status); + + if (image == VG_INVALID_HANDLE) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + if (_vg_format_to_pixman (format, &premult) == 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + return _vg_surface_create_internal (context, image, format, width, height); +} + +cairo_surface_t * +cairo_vg_surface_create (cairo_vg_context_t *context, + cairo_content_t content, + int width, + int height) +{ + VGImage image; + VGImageFormat format; + cairo_surface_t *surface; + + if (context->status) + return _cairo_surface_create_in_error (context->status); + + if (! CAIRO_CONTENT_VALID (content)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); + + if (width > vgGeti (VG_MAX_IMAGE_WIDTH) || + height > vgGeti (VG_MAX_IMAGE_HEIGHT)) + { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + + format = _vg_format_for_content (content); + image = vgCreateImage (format, width, height, VG_IMAGE_QUALITY_BETTER); + if (image == VG_INVALID_HANDLE) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface = _vg_surface_create_internal (context, + image, format, width, height); + if (unlikely (surface->status)) + return surface; + + ((cairo_vg_surface_t *) surface)->own_image = TRUE; + return surface; +} +slim_hidden_def (cairo_vg_surface_create); + +VGImage +cairo_vg_surface_get_image (cairo_surface_t *abstract_surface) +{ + cairo_vg_surface_t *surface; + + if (abstract_surface->backend != &cairo_vg_surface_backend) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return VG_INVALID_HANDLE; + } + + surface = (cairo_vg_surface_t *) abstract_surface; + return surface->image; +} + +int +cairo_vg_surface_get_width (cairo_surface_t *abstract_surface) +{ + cairo_vg_surface_t *surface; + + if (abstract_surface->backend != &cairo_vg_surface_backend) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + surface = (cairo_vg_surface_t *) abstract_surface; + return surface->width; +} + +int +cairo_vg_surface_get_height (cairo_surface_t *abstract_surface) +{ + cairo_vg_surface_t *surface; + + if (abstract_surface->backend != &cairo_vg_surface_backend) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + surface = (cairo_vg_surface_t *) abstract_surface; + return surface->height; +} + +VGImageFormat +cairo_vg_surface_get_format (cairo_surface_t *abstract_surface) +{ + cairo_vg_surface_t *surface; + + if (abstract_surface->backend != &cairo_vg_surface_backend) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + surface = (cairo_vg_surface_t *) abstract_surface; + return surface->format; +} + +/* GL specific context support :-( + * + * OpenVG like cairo defers creation of surface (and the necessary + * paraphernalia to the application. + */ + +static const cairo_vg_context_t _vg_context_nil = { + CAIRO_STATUS_NO_MEMORY, + CAIRO_REFERENCE_COUNT_INVALID +}; + +static const cairo_vg_context_t _vg_context_nil_invalid_visual = { + CAIRO_STATUS_INVALID_VISUAL, + CAIRO_REFERENCE_COUNT_INVALID +}; + +#if CAIRO_HAS_GLX_FUNCTIONS +#include + +static cairo_status_t +glx_create_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ + /* XXX hmm, magic required for creating an FBO points to VGImage! */ + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_status_t +glx_set_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ +#if 0 + glXMakeContextCurrent (context->display, + (GLXDrawable) surface->target_id, + (GLXDrawable) surface->target_id, + context->context); +#else + return CAIRO_INT_STATUS_UNSUPPORTED; +#endif +} + +static void +glx_destroy_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ +} + +cairo_vg_context_t * +cairo_vg_context_create_for_glx (Display *dpy, GLXContext ctx) +{ + cairo_vg_context_t *context; + cairo_status_t status; + + context = malloc (sizeof (*context)); + if (unlikely (context == NULL)) + return (cairo_vg_context_t *) &_vg_context_nil; + + context->display = dpy; + context->context = ctx; + + context->create_target = glx_create_target; + context->set_target = glx_set_target; + context->destroy_target = glx_destroy_target; + + status = _vg_context_init (context); + if (unlikely (status)) { + free (context); + return (cairo_vg_context_t *) &_vg_context_nil; + } + + return context; +} +#endif + +#if CAIRO_HAS_EGL_FUNCTIONS +static cairo_status_t +egl_create_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ + EGLSurface *egl_surface; +#define RED 1 +#define GREEN 3 +#define BLUE 5 +#define ALPHA 7 + int attribs[] = { + EGL_RED_SIZE, 0, + EGL_GREEN_SIZE, 0, + EGL_BLUE_SIZE, 0, + EGL_ALPHA_SIZE, 0, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT, + EGL_NONE + }; + pixman_format_code_t pixman_format; + EGLConfig config; + int num_configs = 0; + cairo_bool_t needs_premultiply; + + pixman_format = _vg_format_to_pixman (surface->format, &needs_premultiply); + if (pixman_format == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* XXX no control over pixel ordering! */ + attribs[RED] = PIXMAN_FORMAT_R (pixman_format); + attribs[GREEN] = PIXMAN_FORMAT_G (pixman_format); + attribs[BLUE] = PIXMAN_FORMAT_B (pixman_format); + attribs[ALPHA] = PIXMAN_FORMAT_A (pixman_format); + + if (! eglChooseConfig (context->display, + attribs, + &config, 1, &num_configs) || + num_configs != 1) + { + fprintf(stderr, "Error: eglChooseConfig() failed.\n"); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + egl_surface = + eglCreatePbufferFromClientBuffer (context->display, + EGL_OPENVG_IMAGE, + (EGLClientBuffer) surface->image, + config, + NULL); + surface->target_id = (unsigned long) egl_surface; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +egl_set_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ + if (! eglMakeCurrent (context->display, + (EGLSurface *) surface->target_id, + (EGLSurface *) surface->target_id, + context->context)) + { + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + return CAIRO_STATUS_SUCCESS; +} + +static void +egl_destroy_target (cairo_vg_context_t *context, + cairo_vg_surface_t *surface) +{ + eglDestroySurface (context->display, + (EGLSurface *) surface->target_id); +} + +cairo_vg_context_t * +cairo_vg_context_create_for_egl (EGLDisplay egl_display, + EGLContext egl_context) +{ + cairo_vg_context_t *context; + cairo_status_t status; + + context = malloc (sizeof (*context)); + if (unlikely (context == NULL)) + return (cairo_vg_context_t *) &_vg_context_nil; + + status = _vg_context_init (context); + if (unlikely (status)) { + free (context); + return (cairo_vg_context_t *) &_vg_context_nil; + } + + context->display = egl_display; + context->context = egl_context; + + context->create_target = egl_create_target; + context->set_target = egl_set_target; + context->destroy_target = egl_destroy_target; + + return context; +} +#endif + +cairo_status_t +cairo_vg_context_status (cairo_vg_context_t *context) +{ + return context->status; +} + +void +cairo_vg_context_destroy (cairo_vg_context_t *context) +{ + if (context == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&context->ref_count)) + return; + + _vg_context_destroy (context); +} diff --git a/src/cairo-vg.h b/src/cairo-vg.h new file mode 100644 index 000000000..f9a62e51c --- /dev/null +++ b/src/cairo-vg.h @@ -0,0 +1,103 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 * Mozilla Corporation + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Corporation. + * + * Contributor(s): + * Vladimir Vukicevic + * Chris Wilson + */ + +#ifndef CAIRO_VG_H +#define CAIRO_VG_H + +#include "cairo.h" + +#if CAIRO_HAS_VG_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_vg_context cairo_vg_context_t; + +#if CAIRO_HAS_GLX_FUNCTIONS +typedef struct __GLXcontextRec *GLXContext; +typedef struct _XDisplay Display; + +cairo_public cairo_vg_context_t * +cairo_vg_context_create_for_glx (Display *dpy, + GLXContext ctx); +#endif + +#if CAIRO_HAS_EGL_FUNCTIONS +#include + +cairo_public cairo_vg_context_t * +cairo_vg_context_create_for_egl (EGLDisplay egl_display, + EGLContext egl_context); +#endif + +cairo_public cairo_status_t +cairo_vg_context_status (cairo_vg_context_t *context); + +cairo_public void +cairo_vg_context_destroy (cairo_vg_context_t *context); + +cairo_public cairo_surface_t * +cairo_vg_surface_create (cairo_vg_context_t *context, + cairo_content_t content, int width, int height); + +cairo_public cairo_surface_t * +cairo_vg_surface_create_for_image (cairo_vg_context_t *context, + VGImage image, + VGImageFormat format, + int width, int height); + +cairo_public VGImage +cairo_vg_surface_get_image (cairo_surface_t *abstract_surface); + +cairo_public VGImageFormat +cairo_vg_surface_get_format (cairo_surface_t *abstract_surface); + +cairo_public int +cairo_vg_surface_get_height (cairo_surface_t *abstract_surface); + +cairo_public int +cairo_vg_surface_get_width (cairo_surface_t *abstract_surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_VG_SURFACE*/ +# error Cairo was not compiled with support for the OpenVG backend +#endif /* CAIRO_HAS_VG_SURFACE*/ + +#endif /* CAIRO_VG_H */ diff --git a/src/cairo-wgl-context.c b/src/cairo-wgl-context.c new file mode 100644 index 000000000..487237446 --- /dev/null +++ b/src/cairo-wgl-context.c @@ -0,0 +1,261 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + * Chris Wilson + * Zoxc + */ + +#include "cairoint.h" + +#include "cairo-gl-private.h" + +#include "cairo-error-private.h" + +#define WIN32_LEAN_AND_MEAN +#include + +typedef struct _cairo_wgl_context { + cairo_gl_context_t base; + + HDC dummy_dc; + HWND dummy_wnd; + HGLRC rc; + + HDC prev_dc; + HGLRC prev_rc; +} cairo_wgl_context_t; + +typedef struct _cairo_wgl_surface { + cairo_gl_surface_t base; + + HDC dc; +} cairo_wgl_surface_t; + +static void +_wgl_acquire (void *abstract_ctx) +{ + cairo_wgl_context_t *ctx = abstract_ctx; + + HDC current_dc; + + ctx->prev_dc = wglGetCurrentDC (); + ctx->prev_rc = wglGetCurrentContext (); + + if (ctx->base.current_target == NULL || + _cairo_gl_surface_is_texture (ctx->base.current_target)) + { + current_dc = ctx->dummy_dc; + } + else + { + cairo_wgl_surface_t *surface = (cairo_wgl_surface_t *) ctx->base.current_target; + current_dc = surface->dc; + } + + if (ctx->prev_dc != current_dc || + (ctx->prev_rc != ctx->rc && + current_dc != ctx->dummy_dc)) + { + wglMakeCurrent (current_dc, ctx->rc); + } +} + +static void +_wgl_make_current (void *abstract_ctx, cairo_gl_surface_t *abstract_surface) +{ + cairo_wgl_context_t *ctx = abstract_ctx; + cairo_wgl_surface_t *surface = (cairo_wgl_surface_t *) abstract_surface; + + /* Set the window as the target of our context. */ + wglMakeCurrent (surface->dc, ctx->rc); +} + +static void +_wgl_release (void *abstract_ctx) +{ + cairo_wgl_context_t *ctx = abstract_ctx; + + if (ctx->prev_dc != wglGetCurrentDC () || + ctx->prev_rc != wglGetCurrentContext ()) + { + wglMakeCurrent (ctx->prev_dc, + ctx->prev_rc); + } +} + +static void +_wgl_swap_buffers (void *abstract_ctx, + cairo_gl_surface_t *abstract_surface) +{ + cairo_wgl_surface_t *surface = (cairo_wgl_surface_t *) abstract_surface; + + SwapBuffers (surface->dc); +} + +static void +_wgl_destroy (void *abstract_ctx) +{ + cairo_wgl_context_t *ctx = abstract_ctx; + + if (ctx->dummy_dc != 0) { + wglMakeCurrent (ctx->dummy_dc, 0); + ReleaseDC (ctx->dummy_wnd, ctx->dummy_dc); + DestroyWindow (ctx->dummy_wnd); + } +} + +static cairo_status_t +_wgl_dummy_ctx (cairo_wgl_context_t *ctx) +{ + WNDCLASSEXA wincl; + PIXELFORMATDESCRIPTOR pfd; + int format; + HDC dc; + + ZeroMemory (&wincl, sizeof (WNDCLASSEXA)); + wincl.cbSize = sizeof (WNDCLASSEXA); + wincl.hInstance = GetModuleHandle (0); + wincl.lpszClassName = "cairo_wgl_context_dummy"; + wincl.lpfnWndProc = DefWindowProcA; + wincl.style = CS_OWNDC; + + RegisterClassExA (&wincl); + + ctx->dummy_wnd = CreateWindowA ("cairo_wgl_context_dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ctx->dummy_dc = GetDC (ctx->dummy_wnd); + + ZeroMemory (&pfd, sizeof (PIXELFORMATDESCRIPTOR)); + pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 16; + pfd.iLayerType = PFD_MAIN_PLANE; + + format = ChoosePixelFormat (ctx->dummy_dc, &pfd); + SetPixelFormat (ctx->dummy_dc, format, &pfd); + + wglMakeCurrent(ctx->dummy_dc, ctx->rc); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_device_t * +cairo_wgl_device_create (HGLRC rc) +{ + cairo_wgl_context_t *ctx; + cairo_status_t status; + + ctx = calloc (1, sizeof (cairo_wgl_context_t)); + if (unlikely (ctx == NULL)) + return _cairo_gl_context_create_in_error (CAIRO_STATUS_NO_MEMORY); + + ctx->rc = rc; + ctx->prev_dc = 0; + ctx->prev_rc = 0; + + status = _wgl_dummy_ctx (ctx); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + ctx->base.acquire = _wgl_acquire; + ctx->base.release = _wgl_release; + ctx->base.make_current = _wgl_make_current; + ctx->base.swap_buffers = _wgl_swap_buffers; + ctx->base.destroy = _wgl_destroy; + + status = _cairo_gl_dispatch_init (&ctx->base.dispatch, + (cairo_gl_get_proc_addr_func_t) wglGetProcAddress); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + status = _cairo_gl_context_init (&ctx->base); + if (unlikely (status)) { + free (ctx); + return _cairo_gl_context_create_in_error (status); + } + + ctx->base.release (ctx); + + return &ctx->base.base; +} + +HGLRC +cairo_wgl_device_get_context (cairo_device_t *device) +{ + cairo_wgl_context_t *ctx; + + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + return NULL; + } + + ctx = (cairo_wgl_context_t *) device; + + return ctx->rc; +} + +cairo_surface_t * +cairo_gl_surface_create_for_dc (cairo_device_t *device, + HDC dc, + int width, + int height) +{ + cairo_wgl_surface_t *surface; + + if (unlikely (device->status)) + return _cairo_surface_create_in_error (device->status); + + if (device->backend->type != CAIRO_DEVICE_TYPE_GL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + + if (width <= 0 || height <= 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + surface = calloc (1, sizeof (cairo_wgl_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_gl_surface_init (device, &surface->base, + CAIRO_CONTENT_COLOR_ALPHA, width, height); + surface->dc = dc; + + return &surface->base.base; +} diff --git a/src/cairo-wideint-private.h b/src/cairo-wideint-private.h new file mode 100644 index 000000000..3f5491bb1 --- /dev/null +++ b/src/cairo-wideint-private.h @@ -0,0 +1,338 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith R. Packard + * + */ + +#ifndef CAIRO_WIDEINT_H +#define CAIRO_WIDEINT_H + +#include "cairo-wideint-type-private.h" + +#include "cairo-compiler-private.h" + +/* + * 64-bit datatypes. Two separate implementations, one using + * built-in 64-bit signed/unsigned types another implemented + * as a pair of 32-bit ints + */ + +#define I cairo_private cairo_const + +#if !HAVE_UINT64_T + +cairo_uquorem64_t I +_cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den); + +cairo_uint64_t I _cairo_double_to_uint64 (double i); +double I _cairo_uint64_to_double (cairo_uint64_t i); +cairo_int64_t I _cairo_double_to_int64 (double i); +double I _cairo_int64_to_double (cairo_uint64_t i); + +cairo_uint64_t I _cairo_uint32_to_uint64 (uint32_t i); +#define _cairo_uint64_to_uint32(a) ((a).lo) +cairo_uint64_t I _cairo_uint64_add (cairo_uint64_t a, cairo_uint64_t b); +cairo_uint64_t I _cairo_uint64_sub (cairo_uint64_t a, cairo_uint64_t b); +cairo_uint64_t I _cairo_uint64_mul (cairo_uint64_t a, cairo_uint64_t b); +cairo_uint64_t I _cairo_uint32x32_64_mul (uint32_t a, uint32_t b); +cairo_uint64_t I _cairo_uint64_lsl (cairo_uint64_t a, int shift); +cairo_uint64_t I _cairo_uint64_rsl (cairo_uint64_t a, int shift); +cairo_uint64_t I _cairo_uint64_rsa (cairo_uint64_t a, int shift); +int I _cairo_uint64_lt (cairo_uint64_t a, cairo_uint64_t b); +int I _cairo_uint64_cmp (cairo_uint64_t a, cairo_uint64_t b); +int I _cairo_uint64_eq (cairo_uint64_t a, cairo_uint64_t b); +cairo_uint64_t I _cairo_uint64_negate (cairo_uint64_t a); +#define _cairo_uint64_is_zero(a) ((a).hi == 0 && (a).lo == 0) +#define _cairo_uint64_negative(a) (((int32_t) ((a).hi)) < 0) +cairo_uint64_t I _cairo_uint64_not (cairo_uint64_t a); + +#define _cairo_uint64_to_int64(i) (i) +#define _cairo_int64_to_uint64(i) (i) + +cairo_int64_t I _cairo_int32_to_int64(int32_t i); +#define _cairo_int64_to_int32(a) ((int32_t) _cairo_uint64_to_uint32(a)) +#define _cairo_int64_add(a,b) _cairo_uint64_add (a,b) +#define _cairo_int64_sub(a,b) _cairo_uint64_sub (a,b) +#define _cairo_int64_mul(a,b) _cairo_uint64_mul (a,b) +cairo_int64_t I _cairo_int32x32_64_mul (int32_t a, int32_t b); +int I _cairo_int64_lt (cairo_int64_t a, cairo_int64_t b); +int I _cairo_int64_cmp (cairo_int64_t a, cairo_int64_t b); +#define _cairo_int64_is_zero(a) _cairo_uint64_is_zero (a) +#define _cairo_int64_eq(a,b) _cairo_uint64_eq (a,b) +#define _cairo_int64_lsl(a,b) _cairo_uint64_lsl (a,b) +#define _cairo_int64_rsl(a,b) _cairo_uint64_rsl (a,b) +#define _cairo_int64_rsa(a,b) _cairo_uint64_rsa (a,b) +#define _cairo_int64_negate(a) _cairo_uint64_negate(a) +#define _cairo_int64_negative(a) (((int32_t) ((a).hi)) < 0) +#define _cairo_int64_not(a) _cairo_uint64_not(a) + +#else + +static inline cairo_uquorem64_t +_cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den) +{ + cairo_uquorem64_t qr; + + qr.quo = num / den; + qr.rem = num % den; + return qr; +} + +/* + * These need to be functions or gcc will complain when used on the + * result of a function: + * + * warning: cast from function call of type ‘#cairo_uint64_t’ to + * non-matching type ‘double’ + */ +static cairo_always_inline cairo_const cairo_uint64_t _cairo_double_to_uint64 (double i) { return i; } +static cairo_always_inline cairo_const double _cairo_uint64_to_double (cairo_uint64_t i) { return i; } + +static cairo_always_inline cairo_int64_t I _cairo_double_to_int64 (double i) { return i; } +static cairo_always_inline double I _cairo_int64_to_double (cairo_int64_t i) { return i; } + +#define _cairo_uint32_to_uint64(i) ((uint64_t) (i)) +#define _cairo_uint64_to_uint32(i) ((uint32_t) (i)) +#define _cairo_uint64_add(a,b) ((a) + (b)) +#define _cairo_uint64_sub(a,b) ((a) - (b)) +#define _cairo_uint64_mul(a,b) ((a) * (b)) +#define _cairo_uint32x32_64_mul(a,b) ((uint64_t) (a) * (b)) +#define _cairo_uint64_lsl(a,b) ((a) << (b)) +#define _cairo_uint64_rsl(a,b) ((uint64_t) (a) >> (b)) +#define _cairo_uint64_rsa(a,b) ((uint64_t) ((int64_t) (a) >> (b))) +#define _cairo_uint64_lt(a,b) ((a) < (b)) +#define _cairo_uint64_cmp(a,b) ((a) == (b) ? 0 : (a) < (b) ? -1 : 1) +#define _cairo_uint64_is_zero(a) ((a) == 0) +#define _cairo_uint64_eq(a,b) ((a) == (b)) +#define _cairo_uint64_negate(a) ((uint64_t) -((int64_t) (a))) +#define _cairo_uint64_negative(a) ((int64_t) (a) < 0) +#define _cairo_uint64_not(a) (~(a)) + +#define _cairo_uint64_to_int64(i) ((int64_t) (i)) +#define _cairo_int64_to_uint64(i) ((uint64_t) (i)) + +#define _cairo_int32_to_int64(i) ((int64_t) (i)) +#define _cairo_int64_to_int32(i) ((int32_t) (i)) +#define _cairo_int64_add(a,b) ((a) + (b)) +#define _cairo_int64_sub(a,b) ((a) - (b)) +#define _cairo_int64_mul(a,b) ((a) * (b)) +#define _cairo_int32x32_64_mul(a,b) ((int64_t) (a) * (b)) +#define _cairo_int64_lt(a,b) ((a) < (b)) +#define _cairo_int64_cmp(a,b) ((a) == (b) ? 0 : (a) < (b) ? -1 : 1) +#define _cairo_int64_is_zero(a) ((a) == 0) +#define _cairo_int64_eq(a,b) ((a) == (b)) +#define _cairo_int64_lsl(a,b) ((a) << (b)) +#define _cairo_int64_rsl(a,b) ((int64_t) ((uint64_t) (a) >> (b))) +#define _cairo_int64_rsa(a,b) ((int64_t) (a) >> (b)) +#define _cairo_int64_negate(a) (-(a)) +#define _cairo_int64_negative(a) ((a) < 0) +#define _cairo_int64_not(a) (~(a)) + +#endif + +/* + * 64-bit comparisons derived from lt or eq + */ +#define _cairo_uint64_le(a,b) (!_cairo_uint64_gt(a,b)) +#define _cairo_uint64_ne(a,b) (!_cairo_uint64_eq(a,b)) +#define _cairo_uint64_ge(a,b) (!_cairo_uint64_lt(a,b)) +#define _cairo_uint64_gt(a,b) _cairo_uint64_lt(b,a) + +#define _cairo_int64_le(a,b) (!_cairo_int64_gt(a,b)) +#define _cairo_int64_ne(a,b) (!_cairo_int64_eq(a,b)) +#define _cairo_int64_ge(a,b) (!_cairo_int64_lt(a,b)) +#define _cairo_int64_gt(a,b) _cairo_int64_lt(b,a) + +/* + * As the C implementation always computes both, create + * a function which returns both for the 'native' type as well + */ + +static inline cairo_quorem64_t +_cairo_int64_divrem (cairo_int64_t num, cairo_int64_t den) +{ + int num_neg = _cairo_int64_negative (num); + int den_neg = _cairo_int64_negative (den); + cairo_uquorem64_t uqr; + cairo_quorem64_t qr; + + if (num_neg) + num = _cairo_int64_negate (num); + if (den_neg) + den = _cairo_int64_negate (den); + uqr = _cairo_uint64_divrem (num, den); + if (num_neg) + qr.rem = _cairo_int64_negate (uqr.rem); + else + qr.rem = uqr.rem; + if (num_neg != den_neg) + qr.quo = (cairo_int64_t) _cairo_int64_negate (uqr.quo); + else + qr.quo = (cairo_int64_t) uqr.quo; + return qr; +} + +static inline int32_t +_cairo_int64_32_div (cairo_int64_t num, int32_t den) +{ +#if !HAVE_UINT64_T + return _cairo_int64_to_int32 + (_cairo_int64_divrem (num, _cairo_int32_to_int64 (den)).quo); +#else + return num / den; +#endif +} + +/* + * 128-bit datatypes. Again, provide two implementations in + * case the machine has a native 128-bit datatype. GCC supports int128_t + * on ia64 + */ + +#if !HAVE_UINT128_T + +cairo_uint128_t I _cairo_uint32_to_uint128 (uint32_t i); +cairo_uint128_t I _cairo_uint64_to_uint128 (cairo_uint64_t i); +#define _cairo_uint128_to_uint64(a) ((a).lo) +#define _cairo_uint128_to_uint32(a) _cairo_uint64_to_uint32(_cairo_uint128_to_uint64(a)) +cairo_uint128_t I _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b); +cairo_uint128_t I _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b); +cairo_uint128_t I _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b); +cairo_uint128_t I _cairo_uint64x64_128_mul (cairo_uint64_t a, cairo_uint64_t b); +cairo_uint128_t I _cairo_uint128_lsl (cairo_uint128_t a, int shift); +cairo_uint128_t I _cairo_uint128_rsl (cairo_uint128_t a, int shift); +cairo_uint128_t I _cairo_uint128_rsa (cairo_uint128_t a, int shift); +int I _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b); +int I _cairo_uint128_cmp (cairo_uint128_t a, cairo_uint128_t b); +int I _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b); +#define _cairo_uint128_is_zero(a) (_cairo_uint64_is_zero ((a).hi) && _cairo_uint64_is_zero ((a).lo)) +cairo_uint128_t I _cairo_uint128_negate (cairo_uint128_t a); +#define _cairo_uint128_negative(a) (_cairo_uint64_negative(a.hi)) +cairo_uint128_t I _cairo_uint128_not (cairo_uint128_t a); + +#define _cairo_uint128_to_int128(i) (i) +#define _cairo_int128_to_uint128(i) (i) + +cairo_int128_t I _cairo_int32_to_int128 (int32_t i); +cairo_int128_t I _cairo_int64_to_int128 (cairo_int64_t i); +#define _cairo_int128_to_int64(a) ((cairo_int64_t) (a).lo) +#define _cairo_int128_to_int32(a) _cairo_int64_to_int32(_cairo_int128_to_int64(a)) +#define _cairo_int128_add(a,b) _cairo_uint128_add(a,b) +#define _cairo_int128_sub(a,b) _cairo_uint128_sub(a,b) +#define _cairo_int128_mul(a,b) _cairo_uint128_mul(a,b) +cairo_int128_t I _cairo_int64x64_128_mul (cairo_int64_t a, cairo_int64_t b); +#define _cairo_int64x32_128_mul(a, b) _cairo_int64x64_128_mul(a, _cairo_int32_to_int64(b)) +#define _cairo_int128_lsl(a,b) _cairo_uint128_lsl(a,b) +#define _cairo_int128_rsl(a,b) _cairo_uint128_rsl(a,b) +#define _cairo_int128_rsa(a,b) _cairo_uint128_rsa(a,b) +int I _cairo_int128_lt (cairo_int128_t a, cairo_int128_t b); +int I _cairo_int128_cmp (cairo_int128_t a, cairo_int128_t b); +#define _cairo_int128_is_zero(a) _cairo_uint128_is_zero (a) +#define _cairo_int128_eq(a,b) _cairo_uint128_eq (a,b) +#define _cairo_int128_negate(a) _cairo_uint128_negate(a) +#define _cairo_int128_negative(a) (_cairo_uint128_negative(a)) +#define _cairo_int128_not(a) _cairo_uint128_not(a) + +#else /* !HAVE_UINT128_T */ + +#define _cairo_uint32_to_uint128(i) ((uint128_t) (i)) +#define _cairo_uint64_to_uint128(i) ((uint128_t) (i)) +#define _cairo_uint128_to_uint64(i) ((uint64_t) (i)) +#define _cairo_uint128_to_uint32(i) ((uint32_t) (i)) +#define _cairo_uint128_add(a,b) ((a) + (b)) +#define _cairo_uint128_sub(a,b) ((a) - (b)) +#define _cairo_uint128_mul(a,b) ((a) * (b)) +#define _cairo_uint64x64_128_mul(a,b) ((uint128_t) (a) * (b)) +#define _cairo_uint128_lsl(a,b) ((a) << (b)) +#define _cairo_uint128_rsl(a,b) ((uint128_t) (a) >> (b)) +#define _cairo_uint128_rsa(a,b) ((uint128_t) ((int128_t) (a) >> (b))) +#define _cairo_uint128_lt(a,b) ((a) < (b)) +#define _cairo_uint128_cmp(a,b) ((a) == (b) ? 0 : (a) < (b) ? -1 : 1) +#define _cairo_uint128_is_zero(a) ((a) == 0) +#define _cairo_uint128_eq(a,b) ((a) == (b)) +#define _cairo_uint128_negate(a) ((uint128_t) -((int128_t) (a))) +#define _cairo_uint128_negative(a) ((int128_t) (a) < 0) +#define _cairo_uint128_not(a) (~(a)) + +#define _cairo_uint128_to_int128(i) ((int128_t) (i)) +#define _cairo_int128_to_uint128(i) ((uint128_t) (i)) + +#define _cairo_int32_to_int128(i) ((int128_t) (i)) +#define _cairo_int64_to_int128(i) ((int128_t) (i)) +#define _cairo_int128_to_int64(i) ((int64_t) (i)) +#define _cairo_int128_to_int32(i) ((int32_t) (i)) +#define _cairo_int128_add(a,b) ((a) + (b)) +#define _cairo_int128_sub(a,b) ((a) - (b)) +#define _cairo_int128_mul(a,b) ((a) * (b)) +#define _cairo_int64x64_128_mul(a,b) ((int128_t) (a) * (b)) +#define _cairo_int64x32_128_mul(a, b) _cairo_int64x64_128_mul(a, _cairo_int32_to_int64(b)) +#define _cairo_int128_lt(a,b) ((a) < (b)) +#define _cairo_int128_cmp(a,b) ((a) == (b) ? 0 : (a) < (b) ? -1 : 1) +#define _cairo_int128_is_zero(a) ((a) == 0) +#define _cairo_int128_eq(a,b) ((a) == (b)) +#define _cairo_int128_lsl(a,b) ((a) << (b)) +#define _cairo_int128_rsl(a,b) ((int128_t) ((uint128_t) (a) >> (b))) +#define _cairo_int128_rsa(a,b) ((int128_t) (a) >> (b)) +#define _cairo_int128_negate(a) (-(a)) +#define _cairo_int128_negative(a) ((a) < 0) +#define _cairo_int128_not(a) (~(a)) + +#endif /* HAVE_UINT128_T */ + +cairo_uquorem128_t I +_cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den); + +cairo_quorem128_t I +_cairo_int128_divrem (cairo_int128_t num, cairo_int128_t den); + +cairo_uquorem64_t I +_cairo_uint_96by64_32x64_divrem (cairo_uint128_t num, + cairo_uint64_t den); + +cairo_quorem64_t I +_cairo_int_96by64_32x64_divrem (cairo_int128_t num, + cairo_int64_t den); + +#define _cairo_uint128_le(a,b) (!_cairo_uint128_gt(a,b)) +#define _cairo_uint128_ne(a,b) (!_cairo_uint128_eq(a,b)) +#define _cairo_uint128_ge(a,b) (!_cairo_uint128_lt(a,b)) +#define _cairo_uint128_gt(a,b) _cairo_uint128_lt(b,a) + +#define _cairo_int128_le(a,b) (!_cairo_int128_gt(a,b)) +#define _cairo_int128_ne(a,b) (!_cairo_int128_eq(a,b)) +#define _cairo_int128_ge(a,b) (!_cairo_int128_lt(a,b)) +#define _cairo_int128_gt(a,b) _cairo_int128_lt(b,a) + +#undef I + +#endif /* CAIRO_WIDEINT_H */ diff --git a/src/cairo-wideint-type-private.h b/src/cairo-wideint-type-private.h new file mode 100644 index 000000000..84a3cbab0 --- /dev/null +++ b/src/cairo-wideint-type-private.h @@ -0,0 +1,158 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith R. Packard + * + */ + +#ifndef CAIRO_WIDEINT_TYPE_H +#define CAIRO_WIDEINT_TYPE_H + +#include "cairo.h" + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#if HAVE_STDINT_H +# include +#elif HAVE_INTTYPES_H +# include +#elif HAVE_SYS_INT_TYPES_H +# include +#elif defined(_MSC_VER) + typedef __int8 int8_t; + typedef unsigned __int8 uint8_t; + typedef __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef __int32 int32_t; + typedef unsigned __int32 uint32_t; + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +# ifndef HAVE_UINT64_T +# define HAVE_UINT64_T 1 +# endif +#else +#error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.) +#endif + +#ifndef INT16_MIN +# define INT16_MIN (-32767-1) +#endif +#ifndef INT16_MAX +# define INT16_MAX (32767) +#endif +#ifndef UINT16_MAX +# define UINT16_MAX (65535) +#endif +#ifndef INT32_MIN +# define INT32_MIN (-2147483647-1) +#endif +#ifndef INT32_MAX +# define INT32_MAX (2147483647) +#endif +#ifndef UINT32_MAX +# define UINT32_MAX (4294967295U) +#endif + +#if HAVE_BYTESWAP_H +# include +#endif +#ifndef bswap_16 +# define bswap_16(p) \ + (((((uint16_t)(p)) & 0x00ff) << 8) | \ + (((uint16_t)(p)) >> 8)); +#endif +#ifndef bswap_32 +# define bswap_32(p) \ + (((((uint32_t)(p)) & 0x000000ff) << 24) | \ + ((((uint32_t)(p)) & 0x0000ff00) << 8) | \ + ((((uint32_t)(p)) & 0x00ff0000) >> 8) | \ + ((((uint32_t)(p))) >> 24)); +#endif + + +#if !HAVE_UINT64_T + +typedef struct _cairo_uint64 { + uint32_t lo, hi; +} cairo_uint64_t, cairo_int64_t; + +#else + +typedef uint64_t cairo_uint64_t; +typedef int64_t cairo_int64_t; + +#endif + +typedef struct _cairo_uquorem64 { + cairo_uint64_t quo; + cairo_uint64_t rem; +} cairo_uquorem64_t; + +typedef struct _cairo_quorem64 { + cairo_int64_t quo; + cairo_int64_t rem; +} cairo_quorem64_t; + +/* gcc has a non-standard name. */ +#if HAVE___UINT128_T && !HAVE_UINT128_T +typedef __uint128_t uint128_t; +typedef __int128_t int128_t; +#define HAVE_UINT128_T 1 +#endif + +#if !HAVE_UINT128_T + +typedef struct cairo_uint128 { + cairo_uint64_t lo, hi; +} cairo_uint128_t, cairo_int128_t; + +#else + +typedef uint128_t cairo_uint128_t; +typedef int128_t cairo_int128_t; + +#endif + +typedef struct _cairo_uquorem128 { + cairo_uint128_t quo; + cairo_uint128_t rem; +} cairo_uquorem128_t; + +typedef struct _cairo_quorem128 { + cairo_int128_t quo; + cairo_int128_t rem; +} cairo_quorem128_t; + + +#endif /* CAIRO_WIDEINT_H */ diff --git a/src/cairo-wideint.c b/src/cairo-wideint.c new file mode 100644 index 000000000..2e056fa36 --- /dev/null +++ b/src/cairo-wideint.c @@ -0,0 +1,852 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith R. Packard + */ + +#include "cairoint.h" + +#if HAVE_UINT64_T + +#define uint64_lo32(i) ((i) & 0xffffffff) +#define uint64_hi32(i) ((i) >> 32) +#define uint64_lo(i) ((i) & 0xffffffff) +#define uint64_hi(i) ((i) >> 32) +#define uint64_shift32(i) ((i) << 32) +#define uint64_carry32 (((uint64_t) 1) << 32) + +#define _cairo_uint32s_to_uint64(h,l) ((uint64_t) (h) << 32 | (l)) + +#else + +#define uint64_lo32(i) ((i).lo) +#define uint64_hi32(i) ((i).hi) + +static cairo_uint64_t +uint64_lo (cairo_uint64_t i) +{ + cairo_uint64_t s; + + s.lo = i.lo; + s.hi = 0; + return s; +} + +static cairo_uint64_t +uint64_hi (cairo_uint64_t i) +{ + cairo_uint64_t s; + + s.lo = i.hi; + s.hi = 0; + return s; +} + +static cairo_uint64_t +uint64_shift32 (cairo_uint64_t i) +{ + cairo_uint64_t s; + + s.lo = 0; + s.hi = i.lo; + return s; +} + +static const cairo_uint64_t uint64_carry32 = { 0, 1 }; + +cairo_uint64_t +_cairo_double_to_uint64 (double i) +{ + cairo_uint64_t q; + + q.hi = i * (1. / 4294967296.); + q.lo = i - q.hi * 4294967296.; + return q; +} + +double +_cairo_uint64_to_double (cairo_uint64_t i) +{ + return i.hi * 4294967296. + i.lo; +} + +cairo_int64_t +_cairo_double_to_int64 (double i) +{ + cairo_uint64_t q; + + q.hi = i * (1. / INT32_MAX); + q.lo = i - q.hi * (double)INT32_MAX; + return q; +} + +double +_cairo_int64_to_double (cairo_int64_t i) +{ + return i.hi * INT32_MAX + i.lo; +} + +cairo_uint64_t +_cairo_uint32_to_uint64 (uint32_t i) +{ + cairo_uint64_t q; + + q.lo = i; + q.hi = 0; + return q; +} + +cairo_int64_t +_cairo_int32_to_int64 (int32_t i) +{ + cairo_uint64_t q; + + q.lo = i; + q.hi = i < 0 ? -1 : 0; + return q; +} + +static cairo_uint64_t +_cairo_uint32s_to_uint64 (uint32_t h, uint32_t l) +{ + cairo_uint64_t q; + + q.lo = l; + q.hi = h; + return q; +} + +cairo_uint64_t +_cairo_uint64_add (cairo_uint64_t a, cairo_uint64_t b) +{ + cairo_uint64_t s; + + s.hi = a.hi + b.hi; + s.lo = a.lo + b.lo; + if (s.lo < a.lo) + s.hi++; + return s; +} + +cairo_uint64_t +_cairo_uint64_sub (cairo_uint64_t a, cairo_uint64_t b) +{ + cairo_uint64_t s; + + s.hi = a.hi - b.hi; + s.lo = a.lo - b.lo; + if (s.lo > a.lo) + s.hi--; + return s; +} + +#define uint32_lo(i) ((i) & 0xffff) +#define uint32_hi(i) ((i) >> 16) +#define uint32_carry16 ((1) << 16) + +cairo_uint64_t +_cairo_uint32x32_64_mul (uint32_t a, uint32_t b) +{ + cairo_uint64_t s; + + uint16_t ah, al, bh, bl; + uint32_t r0, r1, r2, r3; + + al = uint32_lo (a); + ah = uint32_hi (a); + bl = uint32_lo (b); + bh = uint32_hi (b); + + r0 = (uint32_t) al * bl; + r1 = (uint32_t) al * bh; + r2 = (uint32_t) ah * bl; + r3 = (uint32_t) ah * bh; + + r1 += uint32_hi(r0); /* no carry possible */ + r1 += r2; /* but this can carry */ + if (r1 < r2) /* check */ + r3 += uint32_carry16; + + s.hi = r3 + uint32_hi(r1); + s.lo = (uint32_lo (r1) << 16) + uint32_lo (r0); + return s; +} + +cairo_int64_t +_cairo_int32x32_64_mul (int32_t a, int32_t b) +{ + cairo_int64_t s; + s = _cairo_uint32x32_64_mul ((uint32_t) a, (uint32_t) b); + if (a < 0) + s.hi -= b; + if (b < 0) + s.hi -= a; + return s; +} + +cairo_uint64_t +_cairo_uint64_mul (cairo_uint64_t a, cairo_uint64_t b) +{ + cairo_uint64_t s; + + s = _cairo_uint32x32_64_mul (a.lo, b.lo); + s.hi += a.lo * b.hi + a.hi * b.lo; + return s; +} + +cairo_uint64_t +_cairo_uint64_lsl (cairo_uint64_t a, int shift) +{ + if (shift >= 32) + { + a.hi = a.lo; + a.lo = 0; + shift -= 32; + } + if (shift) + { + a.hi = a.hi << shift | a.lo >> (32 - shift); + a.lo = a.lo << shift; + } + return a; +} + +cairo_uint64_t +_cairo_uint64_rsl (cairo_uint64_t a, int shift) +{ + if (shift >= 32) + { + a.lo = a.hi; + a.hi = 0; + shift -= 32; + } + if (shift) + { + a.lo = a.lo >> shift | a.hi << (32 - shift); + a.hi = a.hi >> shift; + } + return a; +} + +#define _cairo_uint32_rsa(a,n) ((uint32_t) (((int32_t) (a)) >> (n))) + +cairo_int64_t +_cairo_uint64_rsa (cairo_int64_t a, int shift) +{ + if (shift >= 32) + { + a.lo = a.hi; + a.hi = _cairo_uint32_rsa (a.hi, 31); + shift -= 32; + } + if (shift) + { + a.lo = a.lo >> shift | a.hi << (32 - shift); + a.hi = _cairo_uint32_rsa (a.hi, shift); + } + return a; +} + +int +_cairo_uint64_lt (cairo_uint64_t a, cairo_uint64_t b) +{ + return (a.hi < b.hi || + (a.hi == b.hi && a.lo < b.lo)); +} + +int +_cairo_uint64_eq (cairo_uint64_t a, cairo_uint64_t b) +{ + return a.hi == b.hi && a.lo == b.lo; +} + +int +_cairo_int64_lt (cairo_int64_t a, cairo_int64_t b) +{ + if (_cairo_int64_negative (a) && !_cairo_int64_negative (b)) + return 1; + if (!_cairo_int64_negative (a) && _cairo_int64_negative (b)) + return 0; + return _cairo_uint64_lt (a, b); +} + +int +_cairo_uint64_cmp (cairo_uint64_t a, cairo_uint64_t b) +{ + if (a.hi < b.hi) + return -1; + else if (a.hi > b.hi) + return 1; + else if (a.lo < b.lo) + return -1; + else if (a.lo > b.lo) + return 1; + else + return 0; +} + +int +_cairo_int64_cmp (cairo_int64_t a, cairo_int64_t b) +{ + if (_cairo_int64_negative (a) && !_cairo_int64_negative (b)) + return -1; + if (!_cairo_int64_negative (a) && _cairo_int64_negative (b)) + return 1; + + return _cairo_uint64_cmp (a, b); +} + +cairo_uint64_t +_cairo_uint64_not (cairo_uint64_t a) +{ + a.lo = ~a.lo; + a.hi = ~a.hi; + return a; +} + +cairo_uint64_t +_cairo_uint64_negate (cairo_uint64_t a) +{ + a.lo = ~a.lo; + a.hi = ~a.hi; + if (++a.lo == 0) + ++a.hi; + return a; +} + +/* + * Simple bit-at-a-time divide. + */ +cairo_uquorem64_t +_cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den) +{ + cairo_uquorem64_t qr; + cairo_uint64_t bit; + cairo_uint64_t quo; + + bit = _cairo_uint32_to_uint64 (1); + + /* normalize to make den >= num, but not overflow */ + while (_cairo_uint64_lt (den, num) && (den.hi & 0x80000000) == 0) + { + bit = _cairo_uint64_lsl (bit, 1); + den = _cairo_uint64_lsl (den, 1); + } + quo = _cairo_uint32_to_uint64 (0); + + /* generate quotient, one bit at a time */ + while (bit.hi | bit.lo) + { + if (_cairo_uint64_le (den, num)) + { + num = _cairo_uint64_sub (num, den); + quo = _cairo_uint64_add (quo, bit); + } + bit = _cairo_uint64_rsl (bit, 1); + den = _cairo_uint64_rsl (den, 1); + } + qr.quo = quo; + qr.rem = num; + return qr; +} + +#endif /* !HAVE_UINT64_T */ + +#if HAVE_UINT128_T +cairo_uquorem128_t +_cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den) +{ + cairo_uquorem128_t qr; + + qr.quo = num / den; + qr.rem = num % den; + return qr; +} + +#else + +cairo_uint128_t +_cairo_uint32_to_uint128 (uint32_t i) +{ + cairo_uint128_t q; + + q.lo = _cairo_uint32_to_uint64 (i); + q.hi = _cairo_uint32_to_uint64 (0); + return q; +} + +cairo_int128_t +_cairo_int32_to_int128 (int32_t i) +{ + cairo_int128_t q; + + q.lo = _cairo_int32_to_int64 (i); + q.hi = _cairo_int32_to_int64 (i < 0 ? -1 : 0); + return q; +} + +cairo_uint128_t +_cairo_uint64_to_uint128 (cairo_uint64_t i) +{ + cairo_uint128_t q; + + q.lo = i; + q.hi = _cairo_uint32_to_uint64 (0); + return q; +} + +cairo_int128_t +_cairo_int64_to_int128 (cairo_int64_t i) +{ + cairo_int128_t q; + + q.lo = i; + q.hi = _cairo_int32_to_int64 (_cairo_int64_negative(i) ? -1 : 0); + return q; +} + +cairo_uint128_t +_cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b) +{ + cairo_uint128_t s; + + s.hi = _cairo_uint64_add (a.hi, b.hi); + s.lo = _cairo_uint64_add (a.lo, b.lo); + if (_cairo_uint64_lt (s.lo, a.lo)) + s.hi = _cairo_uint64_add (s.hi, _cairo_uint32_to_uint64 (1)); + return s; +} + +cairo_uint128_t +_cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b) +{ + cairo_uint128_t s; + + s.hi = _cairo_uint64_sub (a.hi, b.hi); + s.lo = _cairo_uint64_sub (a.lo, b.lo); + if (_cairo_uint64_gt (s.lo, a.lo)) + s.hi = _cairo_uint64_sub (s.hi, _cairo_uint32_to_uint64(1)); + return s; +} + +cairo_uint128_t +_cairo_uint64x64_128_mul (cairo_uint64_t a, cairo_uint64_t b) +{ + cairo_uint128_t s; + uint32_t ah, al, bh, bl; + cairo_uint64_t r0, r1, r2, r3; + + al = uint64_lo32 (a); + ah = uint64_hi32 (a); + bl = uint64_lo32 (b); + bh = uint64_hi32 (b); + + r0 = _cairo_uint32x32_64_mul (al, bl); + r1 = _cairo_uint32x32_64_mul (al, bh); + r2 = _cairo_uint32x32_64_mul (ah, bl); + r3 = _cairo_uint32x32_64_mul (ah, bh); + + r1 = _cairo_uint64_add (r1, uint64_hi (r0)); /* no carry possible */ + r1 = _cairo_uint64_add (r1, r2); /* but this can carry */ + if (_cairo_uint64_lt (r1, r2)) /* check */ + r3 = _cairo_uint64_add (r3, uint64_carry32); + + s.hi = _cairo_uint64_add (r3, uint64_hi(r1)); + s.lo = _cairo_uint64_add (uint64_shift32 (r1), + uint64_lo (r0)); + return s; +} + +cairo_int128_t +_cairo_int64x64_128_mul (cairo_int64_t a, cairo_int64_t b) +{ + cairo_int128_t s; + s = _cairo_uint64x64_128_mul (_cairo_int64_to_uint64(a), + _cairo_int64_to_uint64(b)); + if (_cairo_int64_negative (a)) + s.hi = _cairo_uint64_sub (s.hi, + _cairo_int64_to_uint64 (b)); + if (_cairo_int64_negative (b)) + s.hi = _cairo_uint64_sub (s.hi, + _cairo_int64_to_uint64 (a)); + return s; +} + +cairo_uint128_t +_cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b) +{ + cairo_uint128_t s; + + s = _cairo_uint64x64_128_mul (a.lo, b.lo); + s.hi = _cairo_uint64_add (s.hi, + _cairo_uint64_mul (a.lo, b.hi)); + s.hi = _cairo_uint64_add (s.hi, + _cairo_uint64_mul (a.hi, b.lo)); + return s; +} + +cairo_uint128_t +_cairo_uint128_lsl (cairo_uint128_t a, int shift) +{ + if (shift >= 64) + { + a.hi = a.lo; + a.lo = _cairo_uint32_to_uint64 (0); + shift -= 64; + } + if (shift) + { + a.hi = _cairo_uint64_add (_cairo_uint64_lsl (a.hi, shift), + _cairo_uint64_rsl (a.lo, (64 - shift))); + a.lo = _cairo_uint64_lsl (a.lo, shift); + } + return a; +} + +cairo_uint128_t +_cairo_uint128_rsl (cairo_uint128_t a, int shift) +{ + if (shift >= 64) + { + a.lo = a.hi; + a.hi = _cairo_uint32_to_uint64 (0); + shift -= 64; + } + if (shift) + { + a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift), + _cairo_uint64_lsl (a.hi, (64 - shift))); + a.hi = _cairo_uint64_rsl (a.hi, shift); + } + return a; +} + +cairo_uint128_t +_cairo_uint128_rsa (cairo_int128_t a, int shift) +{ + if (shift >= 64) + { + a.lo = a.hi; + a.hi = _cairo_uint64_rsa (a.hi, 64-1); + shift -= 64; + } + if (shift) + { + a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift), + _cairo_uint64_lsl (a.hi, (64 - shift))); + a.hi = _cairo_uint64_rsa (a.hi, shift); + } + return a; +} + +int +_cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b) +{ + return (_cairo_uint64_lt (a.hi, b.hi) || + (_cairo_uint64_eq (a.hi, b.hi) && + _cairo_uint64_lt (a.lo, b.lo))); +} + +int +_cairo_int128_lt (cairo_int128_t a, cairo_int128_t b) +{ + if (_cairo_int128_negative (a) && !_cairo_int128_negative (b)) + return 1; + if (!_cairo_int128_negative (a) && _cairo_int128_negative (b)) + return 0; + return _cairo_uint128_lt (a, b); +} + +int +_cairo_uint128_cmp (cairo_uint128_t a, cairo_uint128_t b) +{ + int cmp; + + cmp = _cairo_uint64_cmp (a.hi, b.hi); + if (cmp) + return cmp; + return _cairo_uint64_cmp (a.lo, b.lo); +} + +int +_cairo_int128_cmp (cairo_int128_t a, cairo_int128_t b) +{ + if (_cairo_int128_negative (a) && !_cairo_int128_negative (b)) + return -1; + if (!_cairo_int128_negative (a) && _cairo_int128_negative (b)) + return 1; + + return _cairo_uint128_cmp (a, b); +} + +int +_cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b) +{ + return (_cairo_uint64_eq (a.hi, b.hi) && + _cairo_uint64_eq (a.lo, b.lo)); +} + +#if HAVE_UINT64_T +#define _cairo_msbset64(q) (q & ((uint64_t) 1 << 63)) +#else +#define _cairo_msbset64(q) (q.hi & ((uint32_t) 1 << 31)) +#endif + +cairo_uquorem128_t +_cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den) +{ + cairo_uquorem128_t qr; + cairo_uint128_t bit; + cairo_uint128_t quo; + + bit = _cairo_uint32_to_uint128 (1); + + /* normalize to make den >= num, but not overflow */ + while (_cairo_uint128_lt (den, num) && !_cairo_msbset64(den.hi)) + { + bit = _cairo_uint128_lsl (bit, 1); + den = _cairo_uint128_lsl (den, 1); + } + quo = _cairo_uint32_to_uint128 (0); + + /* generate quotient, one bit at a time */ + while (_cairo_uint128_ne (bit, _cairo_uint32_to_uint128(0))) + { + if (_cairo_uint128_le (den, num)) + { + num = _cairo_uint128_sub (num, den); + quo = _cairo_uint128_add (quo, bit); + } + bit = _cairo_uint128_rsl (bit, 1); + den = _cairo_uint128_rsl (den, 1); + } + qr.quo = quo; + qr.rem = num; + return qr; +} + +cairo_uint128_t +_cairo_uint128_negate (cairo_uint128_t a) +{ + a.lo = _cairo_uint64_not (a.lo); + a.hi = _cairo_uint64_not (a.hi); + return _cairo_uint128_add (a, _cairo_uint32_to_uint128 (1)); +} + +cairo_uint128_t +_cairo_uint128_not (cairo_uint128_t a) +{ + a.lo = _cairo_uint64_not (a.lo); + a.hi = _cairo_uint64_not (a.hi); + return a; +} + +#endif /* !HAVE_UINT128_T */ + +cairo_quorem128_t +_cairo_int128_divrem (cairo_int128_t num, cairo_int128_t den) +{ + int num_neg = _cairo_int128_negative (num); + int den_neg = _cairo_int128_negative (den); + cairo_uquorem128_t uqr; + cairo_quorem128_t qr; + + if (num_neg) + num = _cairo_int128_negate (num); + if (den_neg) + den = _cairo_int128_negate (den); + uqr = _cairo_uint128_divrem (num, den); + if (num_neg) + qr.rem = _cairo_int128_negate (uqr.rem); + else + qr.rem = uqr.rem; + if (num_neg != den_neg) + qr.quo = _cairo_int128_negate (uqr.quo); + else + qr.quo = uqr.quo; + return qr; +} + +/** + * _cairo_uint_96by64_32x64_divrem: + * + * Compute a 32 bit quotient and 64 bit remainder of a 96 bit unsigned + * dividend and 64 bit divisor. If the quotient doesn't fit into 32 + * bits then the returned remainder is equal to the divisor, and the + * quotient is the largest representable 64 bit integer. It is an + * error to call this function with the high 32 bits of @num being + * non-zero. + **/ +cairo_uquorem64_t +_cairo_uint_96by64_32x64_divrem (cairo_uint128_t num, + cairo_uint64_t den) +{ + cairo_uquorem64_t result; + cairo_uint64_t B = _cairo_uint32s_to_uint64 (1, 0); + + /* These are the high 64 bits of the *96* bit numerator. We're + * going to represent the numerator as xB + y, where x is a 64, + * and y is a 32 bit number. */ + cairo_uint64_t x = _cairo_uint128_to_uint64 (_cairo_uint128_rsl(num, 32)); + + /* Initialise the result to indicate overflow. */ + result.quo = _cairo_uint32s_to_uint64 (-1U, -1U); + result.rem = den; + + /* Don't bother if the quotient is going to overflow. */ + if (_cairo_uint64_ge (x, den)) { + return /* overflow */ result; + } + + if (_cairo_uint64_lt (x, B)) { + /* When the final quotient is known to fit in 32 bits, then + * num < 2^64 if and only if den < 2^32. */ + return _cairo_uint64_divrem (_cairo_uint128_to_uint64 (num), den); + } + else { + /* Denominator is >= 2^32. the numerator is >= 2^64, and the + * division won't overflow: need two divrems. Write the + * numerator and denominator as + * + * num = xB + y x : 64 bits, y : 32 bits + * den = uB + v u, v : 32 bits + */ + uint32_t y = _cairo_uint128_to_uint32 (num); + uint32_t u = uint64_hi32 (den); + uint32_t v = _cairo_uint64_to_uint32 (den); + + /* Compute a lower bound approximate quotient of num/den + * from x/(u+1). Then we have + * + * x = q(u+1) + r ; q : 32 bits, r <= u : 32 bits. + * + * xB + y = q(u+1)B + (rB+y) + * = q(uB + B + v - v) + (rB+y) + * = q(uB + v) + qB - qv + (rB+y) + * = q(uB + v) + q(B-v) + (rB+y) + * + * The true quotient of num/den then is q plus the + * contribution of q(B-v) + (rB+y). The main contribution + * comes from the term q(B-v), with the term (rB+y) only + * contributing at most one part. + * + * The term q(B-v) must fit into 64 bits, since q fits into 32 + * bits on account of being a lower bound to the true + * quotient, and as B-v <= 2^32, we may safely use a single + * 64/64 bit division to find its contribution. */ + + cairo_uquorem64_t quorem; + cairo_uint64_t remainder; /* will contain final remainder */ + uint32_t quotient; /* will contain final quotient. */ + uint32_t q; + uint32_t r; + + /* Approximate quotient by dividing the high 64 bits of num by + * u+1. Watch out for overflow of u+1. */ + if (u+1) { + quorem = _cairo_uint64_divrem (x, _cairo_uint32_to_uint64 (u+1)); + q = _cairo_uint64_to_uint32 (quorem.quo); + r = _cairo_uint64_to_uint32 (quorem.rem); + } + else { + q = uint64_hi32 (x); + r = _cairo_uint64_to_uint32 (x); + } + quotient = q; + + /* Add the main term's contribution to quotient. Note B-v = + * -v as an uint32 (unless v = 0) */ + if (v) + quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -v), den); + else + quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den); + quotient += _cairo_uint64_to_uint32 (quorem.quo); + + /* Add the contribution of the subterm and start computing the + * true remainder. */ + remainder = _cairo_uint32s_to_uint64 (r, y); + if (_cairo_uint64_ge (remainder, den)) { + remainder = _cairo_uint64_sub (remainder, den); + quotient++; + } + + /* Add the contribution of the main term's remainder. The + * funky test here checks that remainder + main_rem >= den, + * taking into account overflow of the addition. */ + remainder = _cairo_uint64_add (remainder, quorem.rem); + if (_cairo_uint64_ge (remainder, den) || + _cairo_uint64_lt (remainder, quorem.rem)) + { + remainder = _cairo_uint64_sub (remainder, den); + quotient++; + } + + result.quo = _cairo_uint32_to_uint64 (quotient); + result.rem = remainder; + } + return result; +} + +cairo_quorem64_t +_cairo_int_96by64_32x64_divrem (cairo_int128_t num, cairo_int64_t den) +{ + int num_neg = _cairo_int128_negative (num); + int den_neg = _cairo_int64_negative (den); + cairo_uint64_t nonneg_den; + cairo_uquorem64_t uqr; + cairo_quorem64_t qr; + + if (num_neg) + num = _cairo_int128_negate (num); + if (den_neg) + nonneg_den = _cairo_int64_negate (den); + else + nonneg_den = den; + + uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den); + if (_cairo_uint64_eq (uqr.rem, nonneg_den)) { + /* bail on overflow. */ + qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, -1U); + qr.rem = den; + return qr; + } + + if (num_neg) + qr.rem = _cairo_int64_negate (uqr.rem); + else + qr.rem = uqr.rem; + if (num_neg != den_neg) + qr.quo = _cairo_int64_negate (uqr.quo); + else + qr.quo = uqr.quo; + return qr; +} diff --git a/src/cairo-win32.h b/src/cairo-win32.h new file mode 100644 index 000000000..3d2e1c601 --- /dev/null +++ b/src/cairo-win32.h @@ -0,0 +1,112 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + */ + +#ifndef _CAIRO_WIN32_H_ +#define _CAIRO_WIN32_H_ + +#include "cairo.h" + +#if CAIRO_HAS_WIN32_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_win32_surface_create (HDC hdc); + +cairo_public cairo_surface_t * +cairo_win32_printing_surface_create (HDC hdc); + +cairo_public cairo_surface_t * +cairo_win32_surface_create_with_ddb (HDC hdc, + cairo_format_t format, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_win32_surface_create_with_dib (cairo_format_t format, + int width, + int height); + +cairo_public HDC +cairo_win32_surface_get_dc (cairo_surface_t *surface); + +cairo_public cairo_surface_t * +cairo_win32_surface_get_image (cairo_surface_t *surface); + +#if CAIRO_HAS_WIN32_FONT + +/* + * Win32 font support + */ + +cairo_public cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw (LOGFONTW *logfont); + +cairo_public cairo_font_face_t * +cairo_win32_font_face_create_for_hfont (HFONT font); + +cairo_public cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font); + +cairo_public cairo_status_t +cairo_win32_scaled_font_select_font (cairo_scaled_font_t *scaled_font, + HDC hdc); + +cairo_public void +cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font); + +cairo_public double +cairo_win32_scaled_font_get_metrics_factor (cairo_scaled_font_t *scaled_font); + +cairo_public void +cairo_win32_scaled_font_get_logical_to_device (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *logical_to_device); + +cairo_public void +cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *device_to_logical); + +#endif /* CAIRO_HAS_WIN32_FONT */ + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_WIN32_SURFACE */ +# error Cairo was not compiled with support for the win32 backend +#endif /* CAIRO_HAS_WIN32_SURFACE */ + +#endif /* _CAIRO_WIN32_H_ */ diff --git a/src/cairo-xcb-connection-core.c b/src/cairo-xcb-connection-core.c new file mode 100644 index 000000000..e01dc1a83 --- /dev/null +++ b/src/cairo-xcb-connection-core.c @@ -0,0 +1,300 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-xcb-private.h" + +#include + +xcb_pixmap_t +_cairo_xcb_connection_create_pixmap (cairo_xcb_connection_t *connection, + uint8_t depth, + xcb_drawable_t drawable, + uint16_t width, + uint16_t height) +{ + xcb_pixmap_t pixmap = _cairo_xcb_connection_get_xid (connection); + + assert (width > 0); + assert (height > 0); + xcb_create_pixmap (connection->xcb_connection, + depth, pixmap, drawable, + width, height); + return pixmap; +} + +void +_cairo_xcb_connection_free_pixmap (cairo_xcb_connection_t *connection, + xcb_pixmap_t pixmap) +{ + xcb_free_pixmap (connection->xcb_connection, pixmap); + _cairo_xcb_connection_put_xid (connection, pixmap); +} + +xcb_gcontext_t +_cairo_xcb_connection_create_gc (cairo_xcb_connection_t *connection, + xcb_drawable_t drawable, + uint32_t value_mask, + uint32_t *values) +{ + xcb_gcontext_t gc = _cairo_xcb_connection_get_xid (connection); + xcb_create_gc (connection->xcb_connection, gc, drawable, + value_mask, values); + return gc; +} + +void +_cairo_xcb_connection_free_gc (cairo_xcb_connection_t *connection, + xcb_gcontext_t gc) +{ + xcb_free_gc (connection->xcb_connection, gc); + _cairo_xcb_connection_put_xid (connection, gc); +} + +void +_cairo_xcb_connection_change_gc (cairo_xcb_connection_t *connection, + xcb_gcontext_t gc, + uint32_t value_mask, + uint32_t *values) +{ + xcb_change_gc (connection->xcb_connection, gc, + value_mask, values); +} + +void +_cairo_xcb_connection_copy_area (cairo_xcb_connection_t *connection, + xcb_drawable_t src, + xcb_drawable_t dst, + xcb_gcontext_t gc, + int16_t src_x, + int16_t src_y, + int16_t dst_x, + int16_t dst_y, + uint16_t width, + uint16_t height) +{ + xcb_copy_area (connection->xcb_connection, src, dst, gc, + src_x, src_y, dst_x, dst_y, width, height); +} + +void +_cairo_xcb_connection_poly_fill_rectangle (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint32_t num_rectangles, + xcb_rectangle_t *rectangles) +{ + xcb_poly_fill_rectangle (connection->xcb_connection, dst, gc, + num_rectangles, rectangles); +} + +void +_cairo_xcb_connection_put_image (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint16_t width, + uint16_t height, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + uint32_t stride, + void *data) +{ + const uint32_t req_size = 18; + uint32_t length = height * stride; + uint32_t len = (req_size + length) >> 2; + + if (len < connection->maximum_request_length) { + xcb_put_image (connection->xcb_connection, XCB_IMAGE_FORMAT_Z_PIXMAP, + dst, gc, width, height, dst_x, dst_y, 0, depth, + length, data); + } else { + int rows = (connection->maximum_request_length - req_size - 4) / stride; + if (rows > 0) { + do { + if (rows > height) + rows = height; + + length = rows * stride; + + xcb_put_image (connection->xcb_connection, XCB_IMAGE_FORMAT_Z_PIXMAP, + dst, gc, width, rows, dst_x, dst_y, 0, depth, length, data); + + height -= rows; + dst_y += rows; + data = (char *) data + length; + } while (height); + } else { + ASSERT_NOT_REACHED; + } + } +} + +static void +_cairo_xcb_connection_do_put_subimage (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + uint16_t cpp, + int stride, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + void *_data) +{ + xcb_protocol_request_t xcb_req = { + 0 /* count */, + 0 /* ext */, + XCB_PUT_IMAGE /* opcode */, + 1 /* isvoid (doesn't cause a reply) */ + }; + xcb_put_image_request_t req; + struct iovec vec_stack[CAIRO_STACK_ARRAY_LENGTH (struct iovec)]; + struct iovec *vec = vec_stack; + uint32_t len = 0; + uint8_t *data = _data; + int n = 3; + /* Two extra entries are needed for xcb, two for us */ + int entries_needed = height + 2 + 2; + + req.format = XCB_IMAGE_FORMAT_Z_PIXMAP; + req.drawable = dst; + req.gc = gc; + req.width = width; + req.height = height; + req.dst_x = dst_x; + req.dst_y = dst_y; + req.left_pad = 0; + req.depth = depth; + req.pad0[0] = 0; + req.pad0[1] = 0; + + if (entries_needed > ARRAY_LENGTH (vec_stack)) { + vec = _cairo_malloc_ab (entries_needed, sizeof (struct iovec)); + if (unlikely (vec == NULL)) { + /* XXX loop over ARRAY_LENGTH (vec_stack) */ + return; + } + } + + data += src_y * stride + src_x * cpp; + /* vec[1] will be used in XCB if it has to use BigRequests or insert a sync, + * vec[0] is used if the internal queue needs to be flushed. */ + vec[2].iov_base = (char *) &req; + vec[2].iov_len = sizeof (req); + + /* Now comes the actual data */ + while (height--) { + vec[n].iov_base = data; + vec[n].iov_len = cpp * width; + len += cpp * width; + data += stride; + n++; + } + + /* And again some padding */ + vec[n].iov_base = 0; + vec[n].iov_len = -len & 3; + n++; + + /* For efficiency reasons, this functions writes the request "directly" to + * the xcb connection to avoid having to copy the data around. */ + assert (n == entries_needed); + xcb_req.count = n - 2; + xcb_send_request (connection->xcb_connection, 0, &vec[2], &xcb_req); + + if (vec != vec_stack) + free (vec); +} + +void +_cairo_xcb_connection_put_subimage (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + uint16_t cpp, + int stride, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + void *_data) +{ + const uint32_t req_size = sizeof(xcb_put_image_request_t); + uint32_t length = height * cpp * width; + uint32_t len = (req_size + length) >> 2; + + if (len < connection->maximum_request_length) { + _cairo_xcb_connection_do_put_subimage (connection, dst, gc, src_x, src_y, + width, height, cpp, stride, dst_x, dst_y, depth, _data); + } else { + int rows = (connection->maximum_request_length - req_size - 4) / (cpp * width); + if (rows > 0) { + do { + if (rows > height) + rows = height; + + _cairo_xcb_connection_do_put_subimage (connection, dst, gc, src_x, src_y, + width, rows, cpp, stride, dst_x, dst_y, depth, _data); + + height -= rows; + dst_y += rows; + _data = (char *) _data + stride * rows; + } while (height); + } else { + ASSERT_NOT_REACHED; + } + } +} + +xcb_get_image_reply_t * +_cairo_xcb_connection_get_image (cairo_xcb_connection_t *connection, + xcb_drawable_t src, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height) +{ + return xcb_get_image_reply (connection->xcb_connection, + xcb_get_image (connection->xcb_connection, + XCB_IMAGE_FORMAT_Z_PIXMAP, + src, + src_x, src_y, + width, height, + (uint32_t) -1), + NULL); +} diff --git a/src/cairo-xcb-connection-render.c b/src/cairo-xcb-connection-render.c new file mode 100644 index 000000000..61119653e --- /dev/null +++ b/src/cairo-xcb-connection-render.c @@ -0,0 +1,299 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-xcb-private.h" + +#include + +void +_cairo_xcb_connection_render_create_picture (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_drawable_t drawable, + xcb_render_pictformat_t format, + uint32_t value_mask, + uint32_t *value_list) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_create_picture (connection->xcb_connection, picture, drawable, + format, value_mask, value_list); +} + +void +_cairo_xcb_connection_render_change_picture (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + uint32_t value_mask, + uint32_t *value_list) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_change_picture (connection->xcb_connection, picture, + value_mask, value_list); +} + +void +_cairo_xcb_connection_render_set_picture_clip_rectangles (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + int16_t clip_x_origin, + int16_t clip_y_origin, + uint32_t rectangles_len, + xcb_rectangle_t *rectangles) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_set_picture_clip_rectangles (connection->xcb_connection, picture, + clip_x_origin, clip_y_origin, + rectangles_len, rectangles); +} + +void +_cairo_xcb_connection_render_free_picture (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_free_picture (connection->xcb_connection, picture); + _cairo_xcb_connection_put_xid (connection, picture); +} + +void +_cairo_xcb_connection_render_composite (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t mask, + xcb_render_picture_t dst, + int16_t src_x, + int16_t src_y, + int16_t mask_x, + int16_t mask_y, + int16_t dst_x, + int16_t dst_y, + uint16_t width, + uint16_t height) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE); + xcb_render_composite (connection->xcb_connection, op, src, mask, dst, + src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); +} + +void +_cairo_xcb_connection_render_trapezoids (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + int16_t src_x, + int16_t src_y, + uint32_t traps_len, + xcb_render_trapezoid_t *traps) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS); + xcb_render_trapezoids (connection->xcb_connection, op, src, dst, + mask_format, src_x, src_y, traps_len, traps); +} + +void +_cairo_xcb_connection_render_create_glyph_set (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t id, + xcb_render_pictformat_t format) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_create_glyph_set (connection->xcb_connection, id, format); +} + +void +_cairo_xcb_connection_render_free_glyph_set (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t glyphset) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_free_glyph_set (connection->xcb_connection, glyphset); + _cairo_xcb_connection_put_xid (connection, glyphset); +} + +void +_cairo_xcb_connection_render_add_glyphs (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t glyphset, + uint32_t num_glyphs, + uint32_t *glyphs_id, + xcb_render_glyphinfo_t *glyphs, + uint32_t data_len, + uint8_t *data) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_add_glyphs (connection->xcb_connection, glyphset, num_glyphs, + glyphs_id, glyphs, data_len, data); +} + +void +_cairo_xcb_connection_render_free_glyphs (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t glyphset, + uint32_t num_glyphs, + xcb_render_glyph_t *glyphs) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_free_glyphs (connection->xcb_connection, glyphset, num_glyphs, glyphs); +} + +void +_cairo_xcb_connection_render_composite_glyphs_8 (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t glyphcmds_len, + uint8_t *glyphcmds) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_composite_glyphs_8 (connection->xcb_connection, op, src, dst, mask_format, + glyphset, src_x, src_y, glyphcmds_len, glyphcmds); +} + +void +_cairo_xcb_connection_render_composite_glyphs_16 (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t glyphcmds_len, + uint8_t *glyphcmds) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_composite_glyphs_16 (connection->xcb_connection, op, src, dst, mask_format, + glyphset, src_x, src_y, glyphcmds_len, glyphcmds); +} + +void +_cairo_xcb_connection_render_composite_glyphs_32 (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t glyphcmds_len, + uint8_t *glyphcmds) +{ + assert (connection->flags & CAIRO_XCB_HAS_RENDER); + xcb_render_composite_glyphs_32 (connection->xcb_connection, op, src, dst, mask_format, + glyphset, src_x, src_y, glyphcmds_len, glyphcmds); +} + +void +_cairo_xcb_connection_render_fill_rectangles (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t dst, + xcb_render_color_t color, + uint32_t num_rects, + xcb_rectangle_t *rects) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES); + xcb_render_fill_rectangles (connection->xcb_connection, op, dst, color, + num_rects, rects); +} + +void +_cairo_xcb_connection_render_set_picture_transform (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_transform_t *transform) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM); + xcb_render_set_picture_transform (connection->xcb_connection, picture, *transform); +} + +void +_cairo_xcb_connection_render_set_picture_filter (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + uint16_t filter_len, + char *filter) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_FILTERS); + xcb_render_set_picture_filter (connection->xcb_connection, picture, + filter_len, filter, 0, NULL); +} + +void +_cairo_xcb_connection_render_create_solid_fill (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_color_t color) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_GRADIENTS); + xcb_render_create_solid_fill (connection->xcb_connection, picture, color); +} + +void +_cairo_xcb_connection_render_create_linear_gradient (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_pointfix_t p1, + xcb_render_pointfix_t p2, + uint32_t num_stops, + xcb_render_fixed_t *stops, + xcb_render_color_t *colors) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_GRADIENTS); + xcb_render_create_linear_gradient (connection->xcb_connection, picture, + p1, p2, num_stops, stops, colors); +} + +void +_cairo_xcb_connection_render_create_radial_gradient (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_pointfix_t inner, + xcb_render_pointfix_t outer, + xcb_render_fixed_t inner_radius, + xcb_render_fixed_t outer_radius, + uint32_t num_stops, + xcb_render_fixed_t *stops, + xcb_render_color_t *colors) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_GRADIENTS); + xcb_render_create_radial_gradient (connection->xcb_connection, picture, + inner, outer, inner_radius, outer_radius, + num_stops, stops, colors); +} + +void +_cairo_xcb_connection_render_create_conical_gradient (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_pointfix_t center, + xcb_render_fixed_t angle, + uint32_t num_stops, + xcb_render_fixed_t *stops, + xcb_render_color_t *colors) +{ + assert (connection->flags & CAIRO_XCB_RENDER_HAS_GRADIENTS); + xcb_render_create_conical_gradient (connection->xcb_connection, picture, + center, angle, num_stops, stops, colors); +} diff --git a/src/cairo-xcb-connection-shm.c b/src/cairo-xcb-connection-shm.c new file mode 100644 index 000000000..7720bbbd2 --- /dev/null +++ b/src/cairo-xcb-connection-shm.c @@ -0,0 +1,115 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + +#include "cairo-xcb-private.h" + +#include +#include + +uint32_t +_cairo_xcb_connection_shm_attach (cairo_xcb_connection_t *connection, + uint32_t id, + cairo_bool_t readonly) +{ + uint32_t segment = _cairo_xcb_connection_get_xid (connection); + assert (connection->flags & CAIRO_XCB_HAS_SHM); + xcb_shm_attach (connection->xcb_connection, segment, id, readonly); + return segment; +} + +void +_cairo_xcb_connection_shm_put_image (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint16_t total_width, + uint16_t total_height, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + uint32_t shm, + uint32_t offset) +{ + assert (connection->flags & CAIRO_XCB_HAS_SHM); + xcb_shm_put_image (connection->xcb_connection, dst, gc, total_width, total_height, + src_x, src_y, width, height, dst_x, dst_y, depth, + XCB_IMAGE_FORMAT_Z_PIXMAP, 0, shm, offset); +} + +cairo_status_t +_cairo_xcb_connection_shm_get_image (cairo_xcb_connection_t *connection, + xcb_drawable_t src, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + uint32_t shmseg, + uint32_t offset) +{ + xcb_shm_get_image_reply_t *reply; + + assert (connection->flags & CAIRO_XCB_HAS_SHM); + reply = xcb_shm_get_image_reply (connection->xcb_connection, + xcb_shm_get_image (connection->xcb_connection, + src, + src_x, src_y, + width, height, + (uint32_t) -1, + XCB_IMAGE_FORMAT_Z_PIXMAP, + shmseg, offset), + NULL); + free (reply); + + if (!reply) { + /* an error here should be impossible */ + return _cairo_error (CAIRO_STATUS_READ_ERROR); + } + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_xcb_connection_shm_detach (cairo_xcb_connection_t *connection, + uint32_t segment) +{ + assert (connection->flags & CAIRO_XCB_HAS_SHM); + xcb_shm_detach (connection->xcb_connection, segment); + _cairo_xcb_connection_put_xid (connection, segment); +} + +#endif /* CAIRO_HAS_XCB_SHM_FUNCTIONS */ diff --git a/src/cairo-xcb-connection.c b/src/cairo-xcb-connection.c new file mode 100644 index 000000000..67897fa4e --- /dev/null +++ b/src/cairo-xcb-connection.c @@ -0,0 +1,1006 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Authors: + * Chris Wilson + */ + + +#include "cairoint.h" + +#include "cairo-xcb-private.h" +#include "cairo-hash-private.h" +#include "cairo-freelist-private.h" +#include "cairo-list-inline.h" + +#include +#include +#include + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS +#include +#include +#include +#endif + +typedef struct _cairo_xcb_xrender_format { + cairo_hash_entry_t key; + xcb_render_pictformat_t xrender_format; +} cairo_xcb_xrender_format_t; + +typedef struct _cairo_xcb_xid { + cairo_list_t link; + uint32_t xid; +} cairo_xcb_xid_t; + +#define XCB_RENDER_AT_LEAST(V, major, minor) \ + (((V)->major_version > major) || \ + (((V)->major_version == major) && ((V)->minor_version >= minor))) + +#define XCB_RENDER_HAS_CREATE_PICTURE(surface) XCB_RENDER_AT_LEAST((surface), 0, 0) +#define XCB_RENDER_HAS_COMPOSITE(surface) XCB_RENDER_AT_LEAST((surface), 0, 0) +#define XCB_RENDER_HAS_COMPOSITE_TEXT(surface) XCB_RENDER_AT_LEAST((surface), 0, 0) + +#define XCB_RENDER_HAS_FILL_RECTANGLES(surface) XCB_RENDER_AT_LEAST((surface), 0, 1) + +#define XCB_RENDER_HAS_DISJOINT(surface) XCB_RENDER_AT_LEAST((surface), 0, 2) +#define XCB_RENDER_HAS_CONJOINT(surface) XCB_RENDER_AT_LEAST((surface), 0, 2) + +#define XCB_RENDER_HAS_TRAPEZOIDS(surface) XCB_RENDER_AT_LEAST((surface), 0, 4) +#define XCB_RENDER_HAS_TRIANGLES(surface) XCB_RENDER_AT_LEAST((surface), 0, 4) +#define XCB_RENDER_HAS_TRISTRIP(surface) XCB_RENDER_AT_LEAST((surface), 0, 4) +#define XCB_RENDER_HAS_TRIFAN(surface) XCB_RENDER_AT_LEAST((surface), 0, 4) + +#define XCB_RENDER_HAS_PICTURE_TRANSFORM(surface) XCB_RENDER_AT_LEAST((surface), 0, 6) +#define XCB_RENDER_HAS_FILTERS(surface) XCB_RENDER_AT_LEAST((surface), 0, 6) +#define XCB_RENDER_HAS_FILTER_GOOD(surface) FALSE +#define XCB_RENDER_HAS_FILTER_BEST(surface) FALSE +#define XCB_RENDER_HAS_SUBPIXEL_ORDER(surface) XCB_RENDER_AT_LEAST((surface), 0, 6) + +#define XCB_RENDER_HAS_EXTENDED_REPEAT(surface) XCB_RENDER_AT_LEAST((surface), 0, 10) +#define XCB_RENDER_HAS_GRADIENTS(surface) XCB_RENDER_AT_LEAST((surface), 0, 10) + +#define XCB_RENDER_HAS_PDF_OPERATORS(surface) XCB_RENDER_AT_LEAST((surface), 0, 11) + +static cairo_list_t connections; + +static cairo_status_t +_cairo_xcb_connection_find_visual_formats (cairo_xcb_connection_t *connection, + const xcb_render_query_pict_formats_reply_t *formats) +{ + xcb_render_pictscreen_iterator_t screens; + xcb_render_pictdepth_iterator_t depths; + xcb_render_pictvisual_iterator_t visuals; + + for (screens = xcb_render_query_pict_formats_screens_iterator (formats); + screens.rem; + xcb_render_pictscreen_next (&screens)) + { + for (depths = xcb_render_pictscreen_depths_iterator (screens.data); + depths.rem; + xcb_render_pictdepth_next (&depths)) + { + for (visuals = xcb_render_pictdepth_visuals_iterator (depths.data); + visuals.rem; + xcb_render_pictvisual_next (&visuals)) + { + cairo_xcb_xrender_format_t *f; + cairo_status_t status; + + f = malloc (sizeof (cairo_xcb_xrender_format_t)); + if (unlikely (f == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + f->key.hash = visuals.data->visual; + f->xrender_format = visuals.data->format; + status = _cairo_hash_table_insert (connection->visual_to_xrender_format, + &f->key); + if (unlikely (status)) + return status; + } + } + } + + return CAIRO_STATUS_SUCCESS; +} + +#if 0 +static xcb_format_t * +find_format_for_depth (const xcb_setup_t *setup, uint8_t depth) +{ + xcb_format_t *fmt = xcb_setup_pixmap_formats (setup); + xcb_format_t *fmtend = fmt + xcb_setup_pixmap_formats_length (setup); + + for (; fmt != fmtend; ++fmt) + if (fmt->depth == depth) + return fmt; + + return 0; +} +#endif + +static cairo_status_t +_cairo_xcb_connection_parse_xrender_formats (cairo_xcb_connection_t *connection, + const xcb_render_query_pict_formats_reply_t *formats) +{ + xcb_render_pictforminfo_iterator_t i; + cairo_status_t status; + + for (i = xcb_render_query_pict_formats_formats_iterator (formats); + i.rem; + xcb_render_pictforminfo_next (&i)) + { + cairo_format_masks_t masks; + pixman_format_code_t pixman_format; + + if (i.data->type != XCB_RENDER_PICT_TYPE_DIRECT) + continue; + + masks.alpha_mask = + (unsigned long) i.data->direct.alpha_mask << i.data->direct.alpha_shift; + masks.red_mask = + (unsigned long) i.data->direct.red_mask << i.data->direct.red_shift; + masks.green_mask = + (unsigned long) i.data->direct.green_mask << i.data->direct.green_shift; + masks.blue_mask = + (unsigned long) i.data->direct.blue_mask << i.data->direct.blue_shift; + masks.bpp = i.data->depth; + + if (_pixman_format_from_masks (&masks, &pixman_format)) { + cairo_hash_entry_t key; + + key.hash = pixman_format; + if (! _cairo_hash_table_lookup (connection->xrender_formats, &key)) { + cairo_xcb_xrender_format_t *f; + + f = malloc (sizeof (cairo_xcb_xrender_format_t)); + if (unlikely (f == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + f->key.hash = pixman_format; + f->xrender_format = i.data->id; + status = _cairo_hash_table_insert (connection->xrender_formats, + &f->key); + if (unlikely (status)) + return status; + +#if 0 + printf ("xrender %x -> (%lx, %lx, %lx, %lx, %d) %x [%d, %d]\n", + i.data->id, + masks.alpha_mask, + masks.red_mask, + masks.green_mask, + masks.blue_mask, + masks.bpp, + pixman_format, + PIXMAN_FORMAT_DEPTH(pixman_format), + PIXMAN_FORMAT_BPP(pixman_format)); +#endif + } + } + } + + status = _cairo_xcb_connection_find_visual_formats (connection, formats); + if (unlikely (status)) + return status; + + connection->standard_formats[CAIRO_FORMAT_A1] = + _cairo_xcb_connection_get_xrender_format (connection, PIXMAN_a1); + + connection->standard_formats[CAIRO_FORMAT_A8] = + _cairo_xcb_connection_get_xrender_format (connection, PIXMAN_a8); + + connection->standard_formats[CAIRO_FORMAT_RGB24] = + _cairo_xcb_connection_get_xrender_format (connection, + PIXMAN_FORMAT (24, + PIXMAN_TYPE_ARGB, + 0, 8, 8, 8)); + if (connection->standard_formats[CAIRO_FORMAT_RGB24] == XCB_NONE) { + connection->standard_formats[CAIRO_FORMAT_RGB24] = + _cairo_xcb_connection_get_xrender_format (connection, + PIXMAN_FORMAT (24, PIXMAN_TYPE_ABGR, + 0, 8, 8, 8)); + } + + connection->standard_formats[CAIRO_FORMAT_ARGB32] = + _cairo_xcb_connection_get_xrender_format (connection, PIXMAN_a8r8g8b8); + if (connection->standard_formats[CAIRO_FORMAT_ARGB32] == XCB_NONE) { + connection->standard_formats[CAIRO_FORMAT_ARGB32] = + _cairo_xcb_connection_get_xrender_format (connection, PIXMAN_a8b8g8r8); + } + + return CAIRO_STATUS_SUCCESS; +} + +/* + * We require support for depth 1, 8, 24 and 32 pixmaps + */ +#define DEPTH_MASK(d) (1 << ((d) - 1)) +#define REQUIRED_DEPTHS (DEPTH_MASK(1) | \ + DEPTH_MASK(8) | \ + DEPTH_MASK(24) | \ + DEPTH_MASK(32)) +static cairo_bool_t +pixmap_depths_usable (cairo_xcb_connection_t *connection, + uint32_t missing, + xcb_drawable_t root) +{ + xcb_connection_t *c = connection->xcb_connection; + xcb_void_cookie_t create_cookie[32]; + xcb_pixmap_t pixmap; + cairo_bool_t success = TRUE; + int depth, i, j; + + pixmap = _cairo_xcb_connection_get_xid (connection); + + for (depth = 1, i = 0; depth <= 32; depth++) { + if (missing & DEPTH_MASK(depth)) { + create_cookie[i] = xcb_create_pixmap_checked (c, depth, pixmap, root, 1, 1); + xcb_free_pixmap (c, pixmap); + if (!create_cookie[i].sequence) { + success = FALSE; + break; + } + i++; + } + } + + for (j = 0; j < i; j++) { + xcb_generic_error_t *create_error = xcb_request_check (c, create_cookie[j]); + success &= create_error == NULL; + free (create_error); + } + + _cairo_xcb_connection_put_xid (connection, pixmap); + + return success; +} + +static cairo_bool_t +has_required_depths (cairo_xcb_connection_t *connection) +{ + xcb_screen_iterator_t screens; + + for (screens = xcb_setup_roots_iterator (connection->root); + screens.rem; + xcb_screen_next (&screens)) + { + xcb_depth_iterator_t depths; + uint32_t missing = REQUIRED_DEPTHS; + + for (depths = xcb_screen_allowed_depths_iterator (screens.data); + depths.rem; + xcb_depth_next (&depths)) + { + missing &= ~DEPTH_MASK (depths.data->depth); + } + if (missing == 0) + continue; + + /* + * Ok, this is ugly. It should be sufficient at this + * point to just return false, but Xinerama is broken at + * this point and only advertises depths which have an + * associated visual. Of course, the other depths still + * work, but the only way to find out is to try them. + */ + if (! pixmap_depths_usable (connection, missing, screens.data->root)) + return FALSE; + } + + return TRUE; +} + +static xcb_render_query_version_reply_t * +_render_restrict_env(xcb_render_query_version_reply_t *version) +{ + const char *env; + + if (version == NULL) + return NULL; + + env = getenv ("CAIRO_DEBUG"); + if (env != NULL) + env = strstr (env, "xrender-version="); + if (env != NULL) { + int max_render_major, max_render_minor; + + env += sizeof ("xrender-version=") - 1; + if (sscanf (env, "%d.%d", &max_render_major, &max_render_minor) != 2) + max_render_major = max_render_minor = -1; + + if (max_render_major < 0 || max_render_minor < 0) { + free (version); + return NULL; + } + + if (max_render_major < (int) version->major_version || + (max_render_major == (int) version->major_version && + max_render_minor < (int) version->minor_version)) + { + version->major_version = max_render_major; + version->minor_version = max_render_minor; + } + } + + return version; +} + +static cairo_status_t +_cairo_xcb_connection_query_render (cairo_xcb_connection_t *connection) +{ + xcb_connection_t *c = connection->xcb_connection; + xcb_render_query_version_cookie_t version_cookie; + xcb_render_query_pict_formats_cookie_t formats_cookie; + xcb_render_query_version_reply_t *version; + xcb_render_query_pict_formats_reply_t *formats; + cairo_status_t status; + cairo_bool_t present; + + version_cookie = xcb_render_query_version (c, XCB_RENDER_MAJOR_VERSION, XCB_RENDER_MINOR_VERSION); + formats_cookie = xcb_render_query_pict_formats (c); + + present = has_required_depths (connection); + version = xcb_render_query_version_reply (c, version_cookie, 0); + formats = xcb_render_query_pict_formats_reply (c, formats_cookie, 0); + + version = _render_restrict_env (version); + + if (! present || version == NULL || formats == NULL) { + free (version); + free (formats); + return CAIRO_STATUS_SUCCESS; + } + + /* always true if the extension is present (i.e. >= 0.0) */ + connection->flags |= CAIRO_XCB_HAS_RENDER; + connection->flags |= CAIRO_XCB_RENDER_HAS_COMPOSITE; + connection->flags |= CAIRO_XCB_RENDER_HAS_COMPOSITE_GLYPHS; + + if (XCB_RENDER_HAS_FILL_RECTANGLES (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES; + + if (XCB_RENDER_HAS_TRAPEZOIDS (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS; + + if (XCB_RENDER_HAS_PICTURE_TRANSFORM (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM; + + if (XCB_RENDER_HAS_FILTERS (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_FILTERS; + + if (XCB_RENDER_HAS_FILTER_GOOD (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_FILTER_GOOD; + + if (XCB_RENDER_HAS_FILTER_BEST (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_FILTER_BEST; + + if (XCB_RENDER_HAS_PDF_OPERATORS (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_PDF_OPERATORS; + + if (XCB_RENDER_HAS_EXTENDED_REPEAT (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_EXTENDED_REPEAT; + + if (XCB_RENDER_HAS_GRADIENTS (version)) + connection->flags |= CAIRO_XCB_RENDER_HAS_GRADIENTS; + + if (XCB_RENDER_HAS_SUBPIXEL_ORDER (version)) { + uint32_t screen; + uint32_t *subpixel = xcb_render_query_pict_formats_subpixels(formats); + + /* The spec explicitly allows to have too few entries in the reply... */ + for (screen = 0; screen < formats->num_subpixel && screen < connection->root->roots_len; screen++) + connection->subpixel_orders[screen] = subpixel[screen]; + } + + free (version); + + status = _cairo_xcb_connection_parse_xrender_formats (connection, formats); + free (formats); + + return status; +} + +#if 0 +static void +_cairo_xcb_connection_query_cairo (cairo_xcb_connection_t *connection) +{ + xcb_connection_t *c = connection->xcb_connection; + xcb_cairo_query_version_reply_t *version; + + version = xcb_cairo_query_version_reply (c, + xcb_cairo_query_version (c, 0, 0), + 0); + + free (version); +} +#endif + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS +static cairo_bool_t +can_use_shm (cairo_xcb_connection_t *connection) +{ + cairo_bool_t success = TRUE; + xcb_connection_t *c = connection->xcb_connection; + xcb_void_cookie_t cookie[2]; + xcb_generic_error_t *error; + int shmid; + uint32_t shmseg; + void *ptr; + + shmid = shmget (IPC_PRIVATE, 0x1000, IPC_CREAT | 0600); + if (shmid == -1) + return FALSE; + + ptr = shmat (shmid, NULL, 0); + if (ptr == (char *) -1) { + shmctl (shmid, IPC_RMID, NULL); + return FALSE; + } + + shmseg = _cairo_xcb_connection_get_xid (connection); + cookie[0] = xcb_shm_attach_checked (c, shmseg, shmid, FALSE); + cookie[1] = xcb_shm_detach_checked (c, shmseg); + _cairo_xcb_connection_put_xid (connection, shmseg); + + error = xcb_request_check (c, cookie[0]); + if (error != NULL) + success = FALSE; + + error = xcb_request_check (c, cookie[1]); + if (error != NULL) + success = FALSE; + + shmctl (shmid, IPC_RMID, NULL); + shmdt (ptr); + + return success; +} + +static void +_cairo_xcb_connection_query_shm (cairo_xcb_connection_t *connection) +{ + xcb_connection_t *c = connection->xcb_connection; + xcb_shm_query_version_reply_t *version; + + version = xcb_shm_query_version_reply (c, xcb_shm_query_version (c), 0); + if (version == NULL) + return; + + free (version); + + if (can_use_shm (connection)) + connection->flags |= CAIRO_XCB_HAS_SHM; +} +#endif + +static cairo_status_t +_device_flush (void *device) +{ + cairo_xcb_connection_t *connection = device; + cairo_status_t status; + + status = cairo_device_acquire (&connection->device); + if (unlikely (status)) + return status; + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + _cairo_xcb_connection_shm_mem_pools_flush (connection); +#endif + + xcb_flush (connection->xcb_connection); + + cairo_device_release (&connection->device); + return CAIRO_STATUS_SUCCESS; +} + +static void +_pluck_xrender_format (void *entry, + void *closure) +{ + _cairo_hash_table_remove (closure, entry); + free (entry); +} + +static void +_device_finish (void *device) +{ + cairo_xcb_connection_t *connection = device; + cairo_bool_t was_cached = FALSE; + + if (! cairo_list_is_empty (&connection->link)) { + CAIRO_MUTEX_LOCK (_cairo_xcb_connections_mutex); + cairo_list_del (&connection->link); + CAIRO_MUTEX_UNLOCK (_cairo_xcb_connections_mutex); + was_cached = TRUE; + } + + while (! cairo_list_is_empty (&connection->fonts)) { + cairo_xcb_font_t *font; + + font = cairo_list_first_entry (&connection->fonts, + cairo_xcb_font_t, + link); + _cairo_xcb_font_close (font); + } + + while (! cairo_list_is_empty (&connection->screens)) { + cairo_xcb_screen_t *screen; + + screen = cairo_list_first_entry (&connection->screens, + cairo_xcb_screen_t, + link); + _cairo_xcb_screen_finish (screen); + } + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + /* _cairo_xcb_screen_finish finishes surfaces. If any of those surfaces had + * a fallback image, we might have done a SHM PutImage. */ + _cairo_xcb_connection_shm_mem_pools_flush (connection); +#endif + + if (was_cached) + cairo_device_destroy (device); +} + +static void +_device_destroy (void *device) +{ + cairo_xcb_connection_t *connection = device; + + _cairo_hash_table_foreach (connection->xrender_formats, + _pluck_xrender_format, connection->xrender_formats); + _cairo_hash_table_destroy (connection->xrender_formats); + + _cairo_hash_table_foreach (connection->visual_to_xrender_format, + _pluck_xrender_format, + connection->visual_to_xrender_format); + _cairo_hash_table_destroy (connection->visual_to_xrender_format); + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + _cairo_xcb_connection_shm_mem_pools_fini (connection); +#endif + _cairo_freepool_fini (&connection->shm_info_freelist); + + _cairo_freepool_fini (&connection->xid_pool); + + CAIRO_MUTEX_FINI (connection->shm_mutex); + CAIRO_MUTEX_FINI (connection->screens_mutex); + + free (connection->subpixel_orders); + free (connection); +} + +static const cairo_device_backend_t _cairo_xcb_device_backend = { + CAIRO_DEVICE_TYPE_XCB, + + NULL, NULL, /* lock, unlock */ + + _device_flush, + _device_finish, + _device_destroy, +}; + +cairo_xcb_connection_t * +_cairo_xcb_connection_get (xcb_connection_t *xcb_connection) +{ + cairo_xcb_connection_t *connection; + const xcb_query_extension_reply_t *ext; + cairo_status_t status; + + CAIRO_MUTEX_INITIALIZE (); + + CAIRO_MUTEX_LOCK (_cairo_xcb_connections_mutex); + if (connections.next == NULL) { + /* XXX _cairo_init () */ + cairo_list_init (&connections); + } + + cairo_list_foreach_entry (connection, + cairo_xcb_connection_t, + &connections, + link) + { + if (connection->xcb_connection == xcb_connection) { + /* Maintain MRU order. */ + if (connections.next != &connection->link) + cairo_list_move (&connection->link, &connections); + + goto unlock; + } + } + + connection = malloc (sizeof (cairo_xcb_connection_t)); + if (unlikely (connection == NULL)) + goto unlock; + + _cairo_device_init (&connection->device, &_cairo_xcb_device_backend); + + connection->xcb_connection = xcb_connection; + + cairo_list_init (&connection->fonts); + cairo_list_init (&connection->screens); + cairo_list_init (&connection->link); + connection->xrender_formats = _cairo_hash_table_create (NULL); + if (connection->xrender_formats == NULL) { + CAIRO_MUTEX_FINI (connection->device.mutex); + free (connection); + connection = NULL; + goto unlock; + } + + connection->visual_to_xrender_format = _cairo_hash_table_create (NULL); + if (connection->visual_to_xrender_format == NULL) { + _cairo_hash_table_destroy (connection->xrender_formats); + CAIRO_MUTEX_FINI (connection->device.mutex); + free (connection); + connection = NULL; + goto unlock; + } + + cairo_list_init (&connection->free_xids); + _cairo_freepool_init (&connection->xid_pool, + sizeof (cairo_xcb_xid_t)); + + cairo_list_init (&connection->shm_pools); + cairo_list_init (&connection->shm_pending); + _cairo_freepool_init (&connection->shm_info_freelist, + sizeof (cairo_xcb_shm_info_t)); + + connection->maximum_request_length = + xcb_get_maximum_request_length (xcb_connection); + + CAIRO_MUTEX_INIT (connection->shm_mutex); + CAIRO_MUTEX_INIT (connection->screens_mutex); + + CAIRO_MUTEX_LOCK (connection->device.mutex); + + connection->flags = 0; + connection->force_precision = -1; + + xcb_prefetch_extension_data (xcb_connection, &xcb_big_requests_id); + xcb_prefetch_extension_data (xcb_connection, &xcb_render_id); +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + xcb_prefetch_extension_data (xcb_connection, &xcb_shm_id); +#endif +#if 0 + xcb_prefetch_extension_data (xcb_connection, &xcb_cairo_id); +#endif + + xcb_prefetch_maximum_request_length (xcb_connection); + + connection->root = xcb_get_setup (xcb_connection); + connection->render = NULL; + connection->subpixel_orders = calloc (connection->root->roots_len, sizeof(*connection->subpixel_orders)); + if (unlikely (connection->subpixel_orders == NULL)) { + CAIRO_MUTEX_UNLOCK (connection->device.mutex); + _cairo_xcb_connection_destroy (connection); + connection = NULL; + goto unlock; + } + + ext = xcb_get_extension_data (xcb_connection, &xcb_render_id); + if (ext != NULL && ext->present) { + status = _cairo_xcb_connection_query_render (connection); + if (unlikely (status)) { + CAIRO_MUTEX_UNLOCK (connection->device.mutex); + _cairo_xcb_connection_destroy (connection); + connection = NULL; + goto unlock; + } + + connection->render = ext; + } + +#if 0 + ext = xcb_get_extension_data (connection, &xcb_cairo_id); + if (ext != NULL && ext->present) + _cairo_xcb_connection_query_cairo (connection); +#endif + + connection->shm = NULL; +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + ext = xcb_get_extension_data (xcb_connection, &xcb_shm_id); + if (ext != NULL && ext->present) { + _cairo_xcb_connection_query_shm (connection); + connection->shm = ext; + } +#endif + + connection->original_flags = connection->flags; + + CAIRO_MUTEX_UNLOCK (connection->device.mutex); + + cairo_list_add (&connection->link, &connections); +unlock: + CAIRO_MUTEX_UNLOCK (_cairo_xcb_connections_mutex); + + return connection; +} + +xcb_render_pictformat_t +_cairo_xcb_connection_get_xrender_format (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format) +{ + cairo_hash_entry_t key; + cairo_xcb_xrender_format_t *format; + + key.hash = pixman_format; + format = _cairo_hash_table_lookup (connection->xrender_formats, &key); + return format ? format->xrender_format : XCB_NONE; +} + +xcb_render_pictformat_t +_cairo_xcb_connection_get_xrender_format_for_visual (cairo_xcb_connection_t *connection, + const xcb_visualid_t visual) +{ + cairo_hash_entry_t key; + cairo_xcb_xrender_format_t *format; + + key.hash = visual; + format = _cairo_hash_table_lookup (connection->visual_to_xrender_format, &key); + return format ? format->xrender_format : XCB_NONE; +} + +void +_cairo_xcb_connection_put_xid (cairo_xcb_connection_t *connection, + uint32_t xid) +{ + cairo_xcb_xid_t *cache; + + assert (CAIRO_MUTEX_IS_LOCKED (connection->device.mutex)); + cache = _cairo_freepool_alloc (&connection->xid_pool); + if (likely (cache != NULL)) { + cache->xid = xid; + cairo_list_add (&cache->link, &connection->free_xids); + } +} + +uint32_t +_cairo_xcb_connection_get_xid (cairo_xcb_connection_t *connection) +{ + uint32_t xid; + + assert (CAIRO_MUTEX_IS_LOCKED (connection->device.mutex)); + if (! cairo_list_is_empty (&connection->free_xids)) { + cairo_xcb_xid_t *cache; + + cache = cairo_list_first_entry (&connection->free_xids, + cairo_xcb_xid_t, + link); + xid = cache->xid; + + cairo_list_del (&cache->link); + _cairo_freepool_free (&connection->xid_pool, cache); + } else { + xid = xcb_generate_id (connection->xcb_connection); + } + + return xid; +} + +/** + * cairo_xcb_device_get_connection: + * @device: a #cairo_device_t for the XCB backend + * + * Get the connection for the XCB device. + * + * Returns: the #xcb_connection_t for the connection + * + * Since: 1.12 + **/ +xcb_connection_t * +cairo_xcb_device_get_connection (cairo_device_t *device) +{ + if (device->backend->type != CAIRO_DEVICE_TYPE_XCB) + return NULL; + + return ((cairo_xcb_connection_t *)device)->xcb_connection; +} + +/* public (debug) interface */ + +/** + * cairo_xcb_device_debug_cap_xshm_version: + * @device: a #cairo_device_t for the XCB backend + * @major_version: major version to restrict to + * @minor_version: minor version to restrict to + * + * Restricts all future XCB surfaces for this devices to the specified version + * of the SHM extension. This function exists solely for debugging purpose. + * It let's you find out how cairo would behave with an older version of + * the SHM extension. + * + * Use the special values -1 and -1 for disabling the SHM extension. + * + * Since: 1.12 + **/ +void +cairo_xcb_device_debug_cap_xshm_version (cairo_device_t *device, + int major_version, + int minor_version) +{ + cairo_xcb_connection_t *connection = (cairo_xcb_connection_t *) device; + + if (device->backend->type != CAIRO_DEVICE_TYPE_XCB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return; + } + + /* First reset all the SHM flags to their original value. This works + * because we only ever clear bits after the connection was created. + */ + connection->flags |= (connection->original_flags & CAIRO_XCB_SHM_MASK); + + /* clear any flags that are inappropriate for the desired version */ + if (major_version < 0 && minor_version < 0) { + connection->flags &= ~(CAIRO_XCB_HAS_SHM); + } +} + +/** + * cairo_xcb_device_debug_cap_xrender_version: + * @device: a #cairo_device_t for the XCB backend + * @major_version: major version to restrict to + * @minor_version: minor version to restrict to + * + * Restricts all future XCB surfaces for this devices to the specified version + * of the RENDER extension. This function exists solely for debugging purpose. + * It let's you find out how cairo would behave with an older version of + * the RENDER extension. + * + * Use the special values -1 and -1 for disabling the RENDER extension. + * + * Since: 1.12 + **/ +void +cairo_xcb_device_debug_cap_xrender_version (cairo_device_t *device, + int major_version, + int minor_version) +{ + cairo_xcb_connection_t *connection = (cairo_xcb_connection_t *) device; + + if (device->backend->type != CAIRO_DEVICE_TYPE_XCB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return; + } + + /* First reset all the RENDER flags to their original value. This works + * because we only ever clear bits after the connection was created. + */ + connection->flags |= (connection->original_flags & CAIRO_XCB_RENDER_MASK); + + /* clear any flags that are inappropriate for the desired version */ + if (major_version < 0 && minor_version < 0) { + connection->flags &= ~(CAIRO_XCB_HAS_RENDER | + CAIRO_XCB_RENDER_HAS_COMPOSITE | + CAIRO_XCB_RENDER_HAS_COMPOSITE_GLYPHS | + CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES | + CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS | + CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM | + CAIRO_XCB_RENDER_HAS_FILTERS | + CAIRO_XCB_RENDER_HAS_FILTER_GOOD | + CAIRO_XCB_RENDER_HAS_FILTER_BEST | + CAIRO_XCB_RENDER_HAS_PDF_OPERATORS | + CAIRO_XCB_RENDER_HAS_EXTENDED_REPEAT | + CAIRO_XCB_RENDER_HAS_GRADIENTS); + } else { + xcb_render_query_version_reply_t version; + + version.major_version = major_version; + version.minor_version = minor_version; + + if (! XCB_RENDER_HAS_FILL_RECTANGLES (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES; + + if (! XCB_RENDER_HAS_TRAPEZOIDS (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS; + + if (! XCB_RENDER_HAS_PICTURE_TRANSFORM (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM; + + if (! XCB_RENDER_HAS_FILTERS (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_FILTERS; + + if (! XCB_RENDER_HAS_PDF_OPERATORS (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_PDF_OPERATORS; + + if (! XCB_RENDER_HAS_EXTENDED_REPEAT (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_EXTENDED_REPEAT; + + if (! XCB_RENDER_HAS_GRADIENTS (&version)) + connection->flags &= ~CAIRO_XCB_RENDER_HAS_GRADIENTS; + } +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_device_debug_cap_xrender_version); +#endif + +/** + * cairo_xcb_device_debug_set_precision: + * @device: a #cairo_device_t for the XCB backend + * @precision: the precision to use + * + * Render supports two modes of precision when rendering trapezoids. Set + * the precision to the desired mode. + * + * Since: 1.12 + **/ +void +cairo_xcb_device_debug_set_precision (cairo_device_t *device, + int precision) +{ + if (device == NULL || device->status) + return; + if (device->backend->type != CAIRO_DEVICE_TYPE_XCB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return; + } + + ((cairo_xcb_connection_t *) device)->force_precision = precision; +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_device_debug_set_precision); +#endif + +/** + * cairo_xcb_device_debug_get_precision: + * @device: a #cairo_device_t for the XCB backend + * + * Get the Xrender precision mode. + * + * Returns: the render precision mode + * + * Since: 1.12 + **/ +int +cairo_xcb_device_debug_get_precision (cairo_device_t *device) +{ + if (device == NULL || device->status) + return -1; + if (device->backend->type != CAIRO_DEVICE_TYPE_XCB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return -1; + } + + return ((cairo_xcb_connection_t *) device)->force_precision; +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_device_debug_get_precision); +#endif diff --git a/src/cairo-xcb-private.h b/src/cairo-xcb-private.h new file mode 100644 index 000000000..f5d5a4c81 --- /dev/null +++ b/src/cairo-xcb-private.h @@ -0,0 +1,801 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributors(s): + * Chris Wilson + */ + +#ifndef CAIRO_XCB_PRIVATE_H +#define CAIRO_XCB_PRIVATE_H + +#include "cairoint.h" + +#include "cairo-xcb.h" + +#include "cairo-cache-private.h" +#include "cairo-compiler-private.h" +#include "cairo-device-private.h" +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-list-private.h" +#include "cairo-mutex-private.h" +#include "cairo-pattern-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-scaled-font-private.h" +#include "cairo-spans-private.h" +#include "cairo-surface-private.h" + +#include +#include +#include +#include + +#define XLIB_COORD_MAX 32767 + +/* maximum number of cached GC's */ +#define GC_CACHE_SIZE 4 + +#define CAIRO_XCB_RENDER_AT_LEAST(major, minor) \ + ((XCB_RENDER_MAJOR_VERSION > major) || \ + ((XCB_RENDER_MAJOR_VERSION == major) && (XCB_RENDER_MINOR_VERSION >= minor))) + +typedef struct _cairo_xcb_connection cairo_xcb_connection_t; +typedef struct _cairo_xcb_font cairo_xcb_font_t; +typedef struct _cairo_xcb_screen cairo_xcb_screen_t; +typedef struct _cairo_xcb_surface cairo_xcb_surface_t; +typedef struct _cairo_xcb_picture cairo_xcb_picture_t; +typedef struct _cairo_xcb_shm_mem_pool cairo_xcb_shm_mem_pool_t; +typedef struct _cairo_xcb_shm_info cairo_xcb_shm_info_t; +typedef struct _cairo_xcb_resources cairo_xcb_resources_t; + +struct _cairo_xcb_shm_info { + cairo_xcb_connection_t *connection; + uint32_t shm; + uint32_t offset; + size_t size; + void *mem; + cairo_xcb_shm_mem_pool_t *pool; + xcb_get_input_focus_cookie_t sync; + cairo_list_t pending; +}; + +struct _cairo_xcb_surface { + cairo_surface_t base; + cairo_image_surface_t *fallback; + cairo_boxes_t fallback_damage; + + cairo_xcb_connection_t *connection; + cairo_xcb_screen_t *screen; + + xcb_drawable_t drawable; + cairo_bool_t owns_pixmap; + + cairo_bool_t deferred_clear; + cairo_color_t deferred_clear_color; + + int width; + int height; + int depth; + + xcb_render_picture_t picture; + xcb_render_pictformat_t xrender_format; + pixman_format_code_t pixman_format; + uint32_t precision; + + cairo_list_t link; +}; + +struct _cairo_xcb_picture { + cairo_surface_t base; + + cairo_xcb_screen_t *screen; + xcb_render_picture_t picture; + xcb_render_pictformat_t xrender_format; + pixman_format_code_t pixman_format; + + int width, height; + + cairo_extend_t extend; + cairo_filter_t filter; + cairo_bool_t has_component_alpha; + xcb_render_transform_t transform; + + int x0, y0; + int x, y; + + cairo_list_t link; +}; + +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +typedef struct _cairo_xlib_xcb_surface { + cairo_surface_t base; + + cairo_xcb_surface_t *xcb; + + /* original settings for query */ + void *display; + void *screen; + void *visual; + void *format; +} cairo_xlib_xcb_surface_t; +#endif + + +enum { + GLYPHSET_INDEX_ARGB32, + GLYPHSET_INDEX_A8, + GLYPHSET_INDEX_A1, + NUM_GLYPHSETS +}; + +typedef struct _cairo_xcb_font_glyphset_free_glyphs { + xcb_render_glyphset_t glyphset; + int glyph_count; + xcb_render_glyph_t glyph_indices[128]; +} cairo_xcb_font_glyphset_free_glyphs_t; + +typedef struct _cairo_xcb_font_glyphset_info { + xcb_render_glyphset_t glyphset; + cairo_format_t format; + xcb_render_pictformat_t xrender_format; + cairo_xcb_font_glyphset_free_glyphs_t *pending_free_glyphs; +} cairo_xcb_font_glyphset_info_t; + +struct _cairo_xcb_font { + cairo_scaled_font_private_t base; + cairo_scaled_font_t *scaled_font; + cairo_xcb_connection_t *connection; + cairo_xcb_font_glyphset_info_t glyphset_info[NUM_GLYPHSETS]; + cairo_list_t link; +}; + +struct _cairo_xcb_screen { + cairo_xcb_connection_t *connection; + + xcb_screen_t *xcb_screen; + xcb_render_sub_pixel_t subpixel_order; + + xcb_gcontext_t gc[GC_CACHE_SIZE]; + uint8_t gc_depths[GC_CACHE_SIZE]; + + cairo_surface_t *stock_colors[CAIRO_STOCK_NUM_COLORS]; + struct { + cairo_surface_t *picture; + cairo_color_t color; + } solid_cache[16]; + int solid_cache_size; + + cairo_cache_t linear_pattern_cache; + cairo_cache_t radial_pattern_cache; + cairo_freelist_t pattern_cache_entry_freelist; + + cairo_list_t link; + cairo_list_t surfaces; + cairo_list_t pictures; + + cairo_bool_t has_font_options; + cairo_font_options_t font_options; +}; + +struct _cairo_xcb_connection { + cairo_device_t device; + + xcb_connection_t *xcb_connection; + + xcb_render_pictformat_t standard_formats[5]; + cairo_hash_table_t *xrender_formats; + cairo_hash_table_t *visual_to_xrender_format; + + unsigned int maximum_request_length; + unsigned int flags; + unsigned int original_flags; + + int force_precision; + + const xcb_setup_t *root; + const xcb_query_extension_reply_t *render; + const xcb_query_extension_reply_t *shm; + xcb_render_sub_pixel_t *subpixel_orders; + + cairo_list_t free_xids; + cairo_freepool_t xid_pool; + + cairo_mutex_t shm_mutex; + cairo_list_t shm_pools; + cairo_list_t shm_pending; + cairo_freepool_t shm_info_freelist; + + cairo_mutex_t screens_mutex; + cairo_list_t screens; + + cairo_list_t fonts; + + cairo_list_t link; +}; + +struct _cairo_xcb_resources { + cairo_bool_t xft_antialias; + int xft_lcdfilter; + cairo_bool_t xft_hinting; + int xft_hintstyle; + int xft_rgba; +}; + +enum { + CAIRO_XCB_HAS_RENDER = 0x0001, + CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES = 0x0002, + CAIRO_XCB_RENDER_HAS_COMPOSITE = 0x0004, + CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS = 0x0008, + CAIRO_XCB_RENDER_HAS_COMPOSITE_GLYPHS = 0x0010, + CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM = 0x0020, + CAIRO_XCB_RENDER_HAS_FILTERS = 0x0040, + CAIRO_XCB_RENDER_HAS_PDF_OPERATORS = 0x0080, + CAIRO_XCB_RENDER_HAS_EXTENDED_REPEAT = 0x0100, + CAIRO_XCB_RENDER_HAS_GRADIENTS = 0x0200, + CAIRO_XCB_RENDER_HAS_FILTER_GOOD = 0x0400, + CAIRO_XCB_RENDER_HAS_FILTER_BEST = 0x0800, + + CAIRO_XCB_HAS_SHM = 0x80000000, + + CAIRO_XCB_RENDER_MASK = CAIRO_XCB_HAS_RENDER | + CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES | + CAIRO_XCB_RENDER_HAS_COMPOSITE | + CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS | + CAIRO_XCB_RENDER_HAS_COMPOSITE_GLYPHS | + CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM | + CAIRO_XCB_RENDER_HAS_FILTERS | + CAIRO_XCB_RENDER_HAS_PDF_OPERATORS | + CAIRO_XCB_RENDER_HAS_EXTENDED_REPEAT | + CAIRO_XCB_RENDER_HAS_GRADIENTS | + CAIRO_XCB_RENDER_HAS_FILTER_GOOD | + CAIRO_XCB_RENDER_HAS_FILTER_BEST, + CAIRO_XCB_SHM_MASK = CAIRO_XCB_HAS_SHM +}; + +#define CAIRO_XCB_SHM_SMALL_IMAGE 8192 + +cairo_private extern const cairo_surface_backend_t _cairo_xcb_surface_backend; + +/** + * _cairo_surface_is_xcb: + * @surface: a #cairo_surface_t + * + * Checks if a surface is an #cairo_xcb_surface_t + * + * Return value: %TRUE if the surface is an xcb surface + **/ +static inline cairo_bool_t +_cairo_surface_is_xcb (const cairo_surface_t *surface) +{ + /* _cairo_surface_nil sets a NULL backend so be safe */ + return surface->backend && surface->backend->type == CAIRO_SURFACE_TYPE_XCB; +} + +cairo_private cairo_xcb_connection_t * +_cairo_xcb_connection_get (xcb_connection_t *connection); + +static inline cairo_xcb_connection_t * +_cairo_xcb_connection_reference (cairo_xcb_connection_t *connection) +{ + return (cairo_xcb_connection_t *) cairo_device_reference (&connection->device); +} + +cairo_private xcb_render_pictformat_t +_cairo_xcb_connection_get_xrender_format (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format); + +cairo_private xcb_render_pictformat_t +_cairo_xcb_connection_get_xrender_format_for_visual (cairo_xcb_connection_t *connection, + const xcb_visualid_t visual); + +static inline cairo_status_t cairo_warn +_cairo_xcb_connection_acquire (cairo_xcb_connection_t *connection) +{ + return cairo_device_acquire (&connection->device); +} + +cairo_private uint32_t +_cairo_xcb_connection_get_xid (cairo_xcb_connection_t *connection); + +cairo_private void +_cairo_xcb_connection_put_xid (cairo_xcb_connection_t *connection, + uint32_t xid); + +static inline void +_cairo_xcb_connection_release (cairo_xcb_connection_t *connection) +{ + cairo_device_release (&connection->device); +} + +static inline void +_cairo_xcb_connection_destroy (cairo_xcb_connection_t *connection) +{ + cairo_device_destroy (&connection->device); +} + +cairo_private cairo_int_status_t +_cairo_xcb_connection_allocate_shm_info (cairo_xcb_connection_t *display, + size_t size, + cairo_bool_t might_reuse, + cairo_xcb_shm_info_t **shm_info_out); + +cairo_private void +_cairo_xcb_shm_info_destroy (cairo_xcb_shm_info_t *shm_info); + +cairo_private void +_cairo_xcb_connection_shm_mem_pools_flush (cairo_xcb_connection_t *connection); + +cairo_private void +_cairo_xcb_connection_shm_mem_pools_fini (cairo_xcb_connection_t *connection); + +cairo_private void +_cairo_xcb_font_close (cairo_xcb_font_t *font); + +cairo_private cairo_xcb_screen_t * +_cairo_xcb_screen_get (xcb_connection_t *connection, + xcb_screen_t *screen); + +cairo_private void +_cairo_xcb_screen_finish (cairo_xcb_screen_t *screen); + +cairo_private xcb_gcontext_t +_cairo_xcb_screen_get_gc (cairo_xcb_screen_t *screen, + xcb_drawable_t drawable, + int depth); + +cairo_private void +_cairo_xcb_screen_put_gc (cairo_xcb_screen_t *screen, int depth, xcb_gcontext_t gc); + +cairo_private cairo_font_options_t * +_cairo_xcb_screen_get_font_options (cairo_xcb_screen_t *screen); + +cairo_private cairo_status_t +_cairo_xcb_screen_store_linear_picture (cairo_xcb_screen_t *screen, + const cairo_linear_pattern_t *linear, + cairo_surface_t *picture); + +cairo_private cairo_surface_t * +_cairo_xcb_screen_lookup_linear_picture (cairo_xcb_screen_t *screen, + const cairo_linear_pattern_t *linear); + +cairo_private cairo_status_t +_cairo_xcb_screen_store_radial_picture (cairo_xcb_screen_t *screen, + const cairo_radial_pattern_t *radial, + cairo_surface_t *picture); + +cairo_private cairo_surface_t * +_cairo_xcb_screen_lookup_radial_picture (cairo_xcb_screen_t *screen, + const cairo_radial_pattern_t *radial); + +cairo_private cairo_surface_t * +_cairo_xcb_surface_create_similar_image (void *abstrct_other, + cairo_format_t format, + int width, + int height); + +cairo_private cairo_surface_t * +_cairo_xcb_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, + int height); + +cairo_private cairo_surface_t * +_cairo_xcb_surface_create_internal (cairo_xcb_screen_t *screen, + xcb_drawable_t drawable, + cairo_bool_t owns_pixmap, + pixman_format_code_t pixman_format, + xcb_render_pictformat_t xrender_format, + int width, + int height); + +cairo_private_no_warn cairo_bool_t +_cairo_xcb_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents); + +cairo_private cairo_int_status_t +_cairo_xcb_render_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents); + +cairo_private cairo_int_status_t +_cairo_xcb_render_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents); + +cairo_private cairo_int_status_t +_cairo_xcb_render_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias); + +cairo_private cairo_int_status_t +_cairo_xcb_render_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias); + +cairo_private cairo_int_status_t +_cairo_xcb_render_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap); +cairo_private void +_cairo_xcb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font); + +cairo_private void +_cairo_xcb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font); + +cairo_private cairo_status_t +_cairo_xcb_surface_clear (cairo_xcb_surface_t *dst); + +cairo_private cairo_status_t +_cairo_xcb_surface_core_copy_boxes (cairo_xcb_surface_t *dst, + const cairo_pattern_t *src_pattern, + const cairo_rectangle_int_t *extents, + const cairo_boxes_t *boxes); + +cairo_private cairo_status_t +_cairo_xcb_surface_core_fill_boxes (cairo_xcb_surface_t *dst, + const cairo_color_t *color, + cairo_boxes_t *boxes); + +cairo_private xcb_pixmap_t +_cairo_xcb_connection_create_pixmap (cairo_xcb_connection_t *connection, + uint8_t depth, + xcb_drawable_t drawable, + uint16_t width, + uint16_t height); + +cairo_private void +_cairo_xcb_connection_free_pixmap (cairo_xcb_connection_t *connection, + xcb_pixmap_t pixmap); + +cairo_private xcb_gcontext_t +_cairo_xcb_connection_create_gc (cairo_xcb_connection_t *connection, + xcb_drawable_t drawable, + uint32_t value_mask, + uint32_t *values); + +cairo_private void +_cairo_xcb_connection_free_gc (cairo_xcb_connection_t *connection, + xcb_gcontext_t gc); + +cairo_private void +_cairo_xcb_connection_change_gc (cairo_xcb_connection_t *connection, + xcb_gcontext_t gc, + uint32_t value_mask, + uint32_t *values); + +cairo_private void +_cairo_xcb_connection_copy_area (cairo_xcb_connection_t *connection, + xcb_drawable_t src, + xcb_drawable_t dst, + xcb_gcontext_t gc, + int16_t src_x, + int16_t src_y, + int16_t dst_x, + int16_t dst_y, + uint16_t width, + uint16_t height); + +cairo_private void +_cairo_xcb_connection_put_image (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint16_t width, + uint16_t height, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + uint32_t length, + void *data); + +cairo_private void +_cairo_xcb_connection_put_subimage (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + uint16_t cpp, + int stride, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + void *data); + +cairo_private xcb_get_image_reply_t * +_cairo_xcb_connection_get_image (cairo_xcb_connection_t *connection, + xcb_drawable_t src, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height); + +cairo_private void +_cairo_xcb_connection_poly_fill_rectangle (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint32_t num_rectangles, + xcb_rectangle_t *rectangles); + +cairo_private cairo_status_t +_cairo_xcb_shm_image_create (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format, + int width, int height, + cairo_image_surface_t **image_out, + cairo_xcb_shm_info_t **shm_info_out); + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS +cairo_private uint32_t +_cairo_xcb_connection_shm_attach (cairo_xcb_connection_t *connection, + uint32_t id, + cairo_bool_t readonly); + +cairo_private void +_cairo_xcb_connection_shm_put_image (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint16_t total_width, + uint16_t total_height, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + uint32_t shm, + uint32_t offset); + +cairo_private cairo_status_t +_cairo_xcb_connection_shm_get_image (cairo_xcb_connection_t *connection, + xcb_drawable_t src, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + uint32_t shmseg, + uint32_t offset); + +cairo_private void +_cairo_xcb_connection_shm_detach (cairo_xcb_connection_t *connection, + uint32_t segment); +#else +static inline void +_cairo_xcb_connection_shm_put_image (cairo_xcb_connection_t *connection, + xcb_drawable_t dst, + xcb_gcontext_t gc, + uint16_t total_width, + uint16_t total_height, + int16_t src_x, + int16_t src_y, + uint16_t width, + uint16_t height, + int16_t dst_x, + int16_t dst_y, + uint8_t depth, + uint32_t shm, + uint32_t offset) +{ + ASSERT_NOT_REACHED; +} +#endif + +cairo_private void +_cairo_xcb_connection_render_create_picture (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_drawable_t drawable, + xcb_render_pictformat_t format, + uint32_t value_mask, + uint32_t *value_list); + +cairo_private void +_cairo_xcb_connection_render_change_picture (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + uint32_t value_mask, + uint32_t *value_list); + +cairo_private void +_cairo_xcb_connection_render_set_picture_clip_rectangles (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + int16_t clip_x_origin, + int16_t clip_y_origin, + uint32_t rectangles_len, + xcb_rectangle_t *rectangles); + +cairo_private void +_cairo_xcb_connection_render_free_picture (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture); + +cairo_private void +_cairo_xcb_connection_render_composite (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t mask, + xcb_render_picture_t dst, + int16_t src_x, + int16_t src_y, + int16_t mask_x, + int16_t mask_y, + int16_t dst_x, + int16_t dst_y, + uint16_t width, + uint16_t height); + +cairo_private void +_cairo_xcb_connection_render_trapezoids (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + int16_t src_x, + int16_t src_y, + uint32_t traps_len, + xcb_render_trapezoid_t *traps); + +cairo_private void +_cairo_xcb_connection_render_create_glyph_set (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t id, + xcb_render_pictformat_t format); + +cairo_private void +_cairo_xcb_connection_render_free_glyph_set (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t glyphset); + +cairo_private void +_cairo_xcb_connection_render_add_glyphs (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t glyphset, + uint32_t num_glyphs, + uint32_t *glyphs_id, + xcb_render_glyphinfo_t *glyphs, + uint32_t data_len, + uint8_t *data); + +cairo_private void +_cairo_xcb_connection_render_free_glyphs (cairo_xcb_connection_t *connection, + xcb_render_glyphset_t glyphset, + uint32_t num_glyphs, + xcb_render_glyph_t *glyphs); + +cairo_private void +_cairo_xcb_connection_render_composite_glyphs_8 (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t glyphcmds_len, + uint8_t *glyphcmds); + +cairo_private void +_cairo_xcb_connection_render_composite_glyphs_16 (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t glyphcmds_len, + uint8_t *glyphcmds); + +cairo_private void +_cairo_xcb_connection_render_composite_glyphs_32 (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t glyphcmds_len, + uint8_t *glyphcmds); + +cairo_private void +_cairo_xcb_connection_render_fill_rectangles (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t dst, + xcb_render_color_t color, + uint32_t num_rects, + xcb_rectangle_t *rects); + +cairo_private void +_cairo_xcb_connection_render_set_picture_transform (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_transform_t *transform); + +cairo_private void +_cairo_xcb_connection_render_set_picture_filter (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + uint16_t filter_len, + char *filter); + +cairo_private void +_cairo_xcb_connection_render_create_solid_fill (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_color_t color); + +cairo_private void +_cairo_xcb_connection_render_create_linear_gradient (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_pointfix_t p1, + xcb_render_pointfix_t p2, + uint32_t num_stops, + xcb_render_fixed_t *stops, + xcb_render_color_t *colors); + +cairo_private void +_cairo_xcb_connection_render_create_radial_gradient (cairo_xcb_connection_t *connection, + xcb_render_picture_t picture, + xcb_render_pointfix_t inner, + xcb_render_pointfix_t outer, + xcb_render_fixed_t inner_radius, + xcb_render_fixed_t outer_radius, + uint32_t num_stops, + xcb_render_fixed_t *stops, + xcb_render_color_t *colors); + +cairo_private void +_cairo_xcb_connection_render_create_conical_gradient (cairo_xcb_connection_t *c, + xcb_render_picture_t picture, + xcb_render_pointfix_t center, + xcb_render_fixed_t angle, + uint32_t num_stops, + xcb_render_fixed_t *stops, + xcb_render_color_t *colors); +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_proto (cairo_xcb_surface_create); +slim_hidden_proto (cairo_xcb_surface_create_for_bitmap); +slim_hidden_proto (cairo_xcb_surface_create_with_xrender_format); +slim_hidden_proto (cairo_xcb_surface_set_size); +slim_hidden_proto (cairo_xcb_surface_set_drawable); +slim_hidden_proto (cairo_xcb_device_debug_get_precision); +slim_hidden_proto_no_warn (cairo_xcb_device_debug_set_precision); +slim_hidden_proto_no_warn (cairo_xcb_device_debug_cap_xrender_version); +#endif + +cairo_private void +_cairo_xcb_resources_get (cairo_xcb_screen_t *screen, + cairo_xcb_resources_t *resources); + +#endif /* CAIRO_XCB_PRIVATE_H */ diff --git a/src/cairo-xcb-resources.c b/src/cairo-xcb-resources.c new file mode 100644 index 000000000..1877758c2 --- /dev/null +++ b/src/cairo-xcb-resources.c @@ -0,0 +1,281 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2014 Lukas Lalinsky + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Authors: + * Lukas Lalinsky + * + * Partially on code from xftdpy.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "cairoint.h" + +#include "cairo-xcb-private.h" + +#include "cairo-fontconfig-private.h" + +static void +parse_boolean (const char *v, cairo_bool_t *out) +{ + char c0, c1; + + c0 = *v; + if (c0 == 't' || c0 == 'T' || c0 == 'y' || c0 == 'Y' || c0 == '1') + *out = TRUE; + if (c0 == 'f' || c0 == 'F' || c0 == 'n' || c0 == 'N' || c0 == '0') + *out = FALSE; + if (c0 == 'o') { + c1 = v[1]; + if (c1 == 'n' || c1 == 'N') + *out = TRUE; + if (c1 == 'f' || c1 == 'F') + *out = FALSE; + } +} + +static void +parse_integer (const char *v, int *out) +{ + char *e; + int value; + +#if CAIRO_HAS_FC_FONT + if (FcNameConstant ((FcChar8 *) v, out)) + return; +#endif + + value = strtol (v, &e, 0); + if (e != v) + *out = value; +} + +static char * +skip_spaces(char *str) +{ + while (*str == ' ' || *str == '\t' || *str == '\n') + str++; + return str; +} + +struct resource_parser { + int buffer_size; + int bytes_in_buffer; + char* buffer; + cairo_xcb_resources_t *resources; +}; + +static cairo_bool_t +resource_parse_line (char *name, cairo_xcb_resources_t *resources) +{ + char *value; + + value = strchr (name, ':'); + if (value == NULL) + return FALSE; + + *value++ = 0; + + name = skip_spaces (name); + value = skip_spaces (value); + + if (strcmp (name, "Xft.antialias") == 0) + parse_boolean (value, &(resources->xft_antialias)); + else if (strcmp (name, "Xft.lcdfilter") == 0) + parse_integer (value, &(resources->xft_lcdfilter)); + else if (strcmp (name, "Xft.rgba") == 0) + parse_integer (value, &(resources->xft_rgba)); + else if (strcmp (name, "Xft.hinting") == 0) + parse_boolean (value, &(resources->xft_hinting)); + else if (strcmp (name, "Xft.hintstyle") == 0) + parse_integer (value, &(resources->xft_hintstyle)); + + return TRUE; +} + +static int +resource_parse_lines (struct resource_parser *parser) +{ + char *line, *newline; + + line = parser->buffer; + while (1) { + newline = strchr (line, '\n'); + if (newline == NULL) + break; + + *newline++ = 0; + + if (! resource_parse_line (line, parser->resources)) + break; + + line = newline; + } + + return line - parser->buffer; +} + +static void +resource_parser_init (struct resource_parser *parser, cairo_xcb_resources_t *resources) +{ + parser->buffer_size = 0; + parser->bytes_in_buffer = 0; + parser->buffer = NULL; + parser->resources = resources; +} + +static cairo_bool_t +resource_parser_update (struct resource_parser *parser, const char *data, int length) +{ + int bytes_parsed; + + if (parser->bytes_in_buffer + length + 1 > parser->buffer_size) { + parser->buffer_size = parser->bytes_in_buffer + length + 1; + parser->buffer = realloc(parser->buffer, parser->buffer_size); + if (! parser->buffer) { + parser->buffer_size = 0; + parser->bytes_in_buffer = 0; + return FALSE; + } + } + + memmove (parser->buffer + parser->bytes_in_buffer, data, length); + parser->bytes_in_buffer += length; + parser->buffer[parser->bytes_in_buffer] = 0; + + bytes_parsed = resource_parse_lines (parser); + + if (parser->bytes_in_buffer > bytes_parsed) { + memmove (parser->buffer, parser->buffer + bytes_parsed, parser->bytes_in_buffer - bytes_parsed); + parser->bytes_in_buffer -= bytes_parsed; + } else { + parser->bytes_in_buffer = 0; + } + + return TRUE; +} + +static void +resource_parser_done (struct resource_parser *parser) +{ + if (parser->bytes_in_buffer > 0) { + parser->buffer[parser->bytes_in_buffer] = 0; + resource_parse_line (parser->buffer, parser->resources); + } + + free (parser->buffer); +} + +static void +get_resources(xcb_connection_t *connection, xcb_screen_t *screen, cairo_xcb_resources_t *resources) +{ + xcb_get_property_cookie_t cookie; + xcb_get_property_reply_t *reply; + struct resource_parser parser; + int offset; + cairo_bool_t has_more_data; + + resources->xft_antialias = TRUE; + resources->xft_lcdfilter = -1; + resources->xft_hinting = TRUE; + resources->xft_hintstyle = FC_HINT_FULL; + resources->xft_rgba = FC_RGBA_UNKNOWN; + + resource_parser_init (&parser, resources); + + offset = 0; + has_more_data = FALSE; + do { + cookie = xcb_get_property (connection, 0, screen->root, XCB_ATOM_RESOURCE_MANAGER, XCB_ATOM_STRING, offset, 1024); + reply = xcb_get_property_reply (connection, cookie, NULL); + + if (reply) { + if (reply->format == 8 && reply->type == XCB_ATOM_STRING) { + char *value = (char *) xcb_get_property_value (reply); + int length = xcb_get_property_value_length (reply); + + offset += length / 4; /* X needs the offset in 'long' units */ + has_more_data = reply->bytes_after > 0; + + if (! resource_parser_update (&parser, value, length)) + has_more_data = FALSE; /* early exit on error */ + } + + free (reply); + } + } while (has_more_data); + + resource_parser_done (&parser); +} + +void +_cairo_xcb_resources_get (cairo_xcb_screen_t *screen, cairo_xcb_resources_t *resources) +{ + get_resources (screen->connection->xcb_connection, screen->xcb_screen, resources); + + if (resources->xft_rgba == FC_RGBA_UNKNOWN) { + switch (screen->subpixel_order) { + case XCB_RENDER_SUB_PIXEL_UNKNOWN: + resources->xft_rgba = FC_RGBA_UNKNOWN; + break; + case XCB_RENDER_SUB_PIXEL_HORIZONTAL_RGB: + resources->xft_rgba = FC_RGBA_RGB; + break; + case XCB_RENDER_SUB_PIXEL_HORIZONTAL_BGR: + resources->xft_rgba = FC_RGBA_BGR; + break; + case XCB_RENDER_SUB_PIXEL_VERTICAL_RGB: + resources->xft_rgba = FC_RGBA_VRGB; + break; + case XCB_RENDER_SUB_PIXEL_VERTICAL_BGR: + resources->xft_rgba = FC_RGBA_VBGR; + break; + case XCB_RENDER_SUB_PIXEL_NONE: + resources->xft_rgba = FC_RGBA_NONE; + break; + } + } +} diff --git a/src/cairo-xcb-screen.c b/src/cairo-xcb-screen.c new file mode 100644 index 000000000..d0019f9cd --- /dev/null +++ b/src/cairo-xcb-screen.c @@ -0,0 +1,494 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Authors: + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-xcb-private.h" +#include "cairo-list-inline.h" + +#include "cairo-fontconfig-private.h" + +static void +_cairo_xcb_init_screen_font_options (cairo_xcb_screen_t *screen) +{ + cairo_xcb_resources_t res; + cairo_antialias_t antialias; + cairo_subpixel_order_t subpixel_order; + cairo_lcd_filter_t lcd_filter; + cairo_hint_style_t hint_style; + + _cairo_xcb_resources_get (screen, &res); + + /* the rest of the code in this function is copied from + _cairo_xlib_init_screen_font_options in cairo-xlib-screen.c */ + + if (res.xft_hinting) { + switch (res.xft_hintstyle) { + case FC_HINT_NONE: + hint_style = CAIRO_HINT_STYLE_NONE; + break; + case FC_HINT_SLIGHT: + hint_style = CAIRO_HINT_STYLE_SLIGHT; + break; + case FC_HINT_MEDIUM: + hint_style = CAIRO_HINT_STYLE_MEDIUM; + break; + case FC_HINT_FULL: + hint_style = CAIRO_HINT_STYLE_FULL; + break; + default: + hint_style = CAIRO_HINT_STYLE_DEFAULT; + } + } else { + hint_style = CAIRO_HINT_STYLE_NONE; + } + + switch (res.xft_rgba) { + case FC_RGBA_RGB: + subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB; + break; + case FC_RGBA_BGR: + subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR; + break; + case FC_RGBA_VRGB: + subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB; + break; + case FC_RGBA_VBGR: + subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR; + break; + case FC_RGBA_UNKNOWN: + case FC_RGBA_NONE: + default: + subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; + } + + switch (res.xft_lcdfilter) { + case FC_LCD_NONE: + lcd_filter = CAIRO_LCD_FILTER_NONE; + break; + case FC_LCD_DEFAULT: + lcd_filter = CAIRO_LCD_FILTER_FIR5; + break; + case FC_LCD_LIGHT: + lcd_filter = CAIRO_LCD_FILTER_FIR3; + break; + case FC_LCD_LEGACY: + lcd_filter = CAIRO_LCD_FILTER_INTRA_PIXEL; + break; + default: + lcd_filter = CAIRO_LCD_FILTER_DEFAULT; + break; + } + + if (res.xft_antialias) { + if (subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT) + antialias = CAIRO_ANTIALIAS_GRAY; + else + antialias = CAIRO_ANTIALIAS_SUBPIXEL; + } else { + antialias = CAIRO_ANTIALIAS_NONE; + } + + cairo_font_options_set_hint_style (&screen->font_options, hint_style); + cairo_font_options_set_antialias (&screen->font_options, antialias); + cairo_font_options_set_subpixel_order (&screen->font_options, subpixel_order); + _cairo_font_options_set_lcd_filter (&screen->font_options, lcd_filter); + cairo_font_options_set_hint_metrics (&screen->font_options, CAIRO_HINT_METRICS_ON); +} + +struct pattern_cache_entry { + cairo_cache_entry_t key; + cairo_xcb_screen_t *screen; + cairo_pattern_union_t pattern; + cairo_surface_t *picture; +}; + +void +_cairo_xcb_screen_finish (cairo_xcb_screen_t *screen) +{ + int i; + + CAIRO_MUTEX_LOCK (screen->connection->screens_mutex); + cairo_list_del (&screen->link); + CAIRO_MUTEX_UNLOCK (screen->connection->screens_mutex); + + while (! cairo_list_is_empty (&screen->surfaces)) { + cairo_surface_t *surface; + + surface = &cairo_list_first_entry (&screen->surfaces, + cairo_xcb_surface_t, + link)->base; + + cairo_surface_finish (surface); + } + + while (! cairo_list_is_empty (&screen->pictures)) { + cairo_surface_t *surface; + + surface = &cairo_list_first_entry (&screen->pictures, + cairo_xcb_picture_t, + link)->base; + + cairo_surface_finish (surface); + } + + for (i = 0; i < screen->solid_cache_size; i++) + cairo_surface_destroy (screen->solid_cache[i].picture); + + for (i = 0; i < ARRAY_LENGTH (screen->stock_colors); i++) + cairo_surface_destroy (screen->stock_colors[i]); + + for (i = 0; i < ARRAY_LENGTH (screen->gc); i++) { + if (screen->gc_depths[i] != 0) + _cairo_xcb_connection_free_gc (screen->connection, screen->gc[i]); + } + + _cairo_cache_fini (&screen->linear_pattern_cache); + _cairo_cache_fini (&screen->radial_pattern_cache); + _cairo_freelist_fini (&screen->pattern_cache_entry_freelist); + + free (screen); +} + +static cairo_bool_t +_linear_pattern_cache_entry_equal (const void *A, const void *B) +{ + const struct pattern_cache_entry *a = A, *b = B; + + return _cairo_linear_pattern_equal (&a->pattern.gradient.linear, + &b->pattern.gradient.linear); +} + +static cairo_bool_t +_radial_pattern_cache_entry_equal (const void *A, const void *B) +{ + const struct pattern_cache_entry *a = A, *b = B; + + return _cairo_radial_pattern_equal (&a->pattern.gradient.radial, + &b->pattern.gradient.radial); +} + +static void +_pattern_cache_entry_destroy (void *closure) +{ + struct pattern_cache_entry *entry = closure; + + _cairo_pattern_fini (&entry->pattern.base); + cairo_surface_destroy (entry->picture); + _cairo_freelist_free (&entry->screen->pattern_cache_entry_freelist, entry); +} + +static int _get_screen_index(cairo_xcb_connection_t *xcb_connection, + xcb_screen_t *xcb_screen) +{ + int idx = 0; + xcb_screen_iterator_t iter = xcb_setup_roots_iterator(xcb_connection->root); + for (; iter.rem; xcb_screen_next(&iter), idx++) + if (iter.data->root == xcb_screen->root) + return idx; + + ASSERT_NOT_REACHED; +} + +cairo_xcb_screen_t * +_cairo_xcb_screen_get (xcb_connection_t *xcb_connection, + xcb_screen_t *xcb_screen) +{ + cairo_xcb_connection_t *connection; + cairo_xcb_screen_t *screen; + cairo_status_t status; + int screen_idx; + int i; + + connection = _cairo_xcb_connection_get (xcb_connection); + if (unlikely (connection == NULL)) + return NULL; + + CAIRO_MUTEX_LOCK (connection->screens_mutex); + + cairo_list_foreach_entry (screen, + cairo_xcb_screen_t, + &connection->screens, + link) + { + if (screen->xcb_screen == xcb_screen) { + /* Maintain list in MRU order */ + if (&screen->link != connection->screens.next) + cairo_list_move (&screen->link, &connection->screens); + + goto unlock; + } + } + + screen = malloc (sizeof (cairo_xcb_screen_t)); + if (unlikely (screen == NULL)) + goto unlock; + + screen_idx = _get_screen_index(connection, xcb_screen); + + screen->connection = connection; + screen->xcb_screen = xcb_screen; + screen->has_font_options = FALSE; + screen->subpixel_order = connection->subpixel_orders[screen_idx]; + + _cairo_freelist_init (&screen->pattern_cache_entry_freelist, + sizeof (struct pattern_cache_entry)); + cairo_list_init (&screen->link); + cairo_list_init (&screen->surfaces); + cairo_list_init (&screen->pictures); + + memset (screen->gc_depths, 0, sizeof (screen->gc_depths)); + memset (screen->gc, 0, sizeof (screen->gc)); + + screen->solid_cache_size = 0; + for (i = 0; i < ARRAY_LENGTH (screen->stock_colors); i++) + screen->stock_colors[i] = NULL; + + status = _cairo_cache_init (&screen->linear_pattern_cache, + _linear_pattern_cache_entry_equal, + NULL, + _pattern_cache_entry_destroy, + 16); + if (unlikely (status)) + goto error_screen; + + status = _cairo_cache_init (&screen->radial_pattern_cache, + _radial_pattern_cache_entry_equal, + NULL, + _pattern_cache_entry_destroy, + 4); + if (unlikely (status)) + goto error_linear; + + cairo_list_add (&screen->link, &connection->screens); + +unlock: + CAIRO_MUTEX_UNLOCK (connection->screens_mutex); + + return screen; + +error_linear: + _cairo_cache_fini (&screen->linear_pattern_cache); +error_screen: + CAIRO_MUTEX_UNLOCK (connection->screens_mutex); + free (screen); + + return NULL; +} + +static xcb_gcontext_t +_create_gc (cairo_xcb_screen_t *screen, + xcb_drawable_t drawable) +{ + uint32_t values[] = { 0 }; + + return _cairo_xcb_connection_create_gc (screen->connection, drawable, + XCB_GC_GRAPHICS_EXPOSURES, + values); +} + +xcb_gcontext_t +_cairo_xcb_screen_get_gc (cairo_xcb_screen_t *screen, + xcb_drawable_t drawable, + int depth) +{ + int i; + + assert (CAIRO_MUTEX_IS_LOCKED (screen->connection->device.mutex)); + + for (i = 0; i < ARRAY_LENGTH (screen->gc); i++) { + if (screen->gc_depths[i] == depth) { + screen->gc_depths[i] = 0; + return screen->gc[i]; + } + } + + return _create_gc (screen, drawable); +} + +void +_cairo_xcb_screen_put_gc (cairo_xcb_screen_t *screen, int depth, xcb_gcontext_t gc) +{ + int i; + + assert (CAIRO_MUTEX_IS_LOCKED (screen->connection->device.mutex)); + + for (i = 0; i < ARRAY_LENGTH (screen->gc); i++) { + if (screen->gc_depths[i] == 0) + break; + } + + if (i == ARRAY_LENGTH (screen->gc)) { + /* perform random substitution to ensure fair caching over depths */ + i = rand () % ARRAY_LENGTH (screen->gc); + _cairo_xcb_connection_free_gc (screen->connection, screen->gc[i]); + } + + screen->gc[i] = gc; + screen->gc_depths[i] = depth; +} + +cairo_status_t +_cairo_xcb_screen_store_linear_picture (cairo_xcb_screen_t *screen, + const cairo_linear_pattern_t *linear, + cairo_surface_t *picture) +{ + struct pattern_cache_entry *entry; + cairo_status_t status; + + assert (CAIRO_MUTEX_IS_LOCKED (screen->connection->device.mutex)); + + entry = _cairo_freelist_alloc (&screen->pattern_cache_entry_freelist); + if (unlikely (entry == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + entry->key.hash = _cairo_linear_pattern_hash (_CAIRO_HASH_INIT_VALUE, linear); + entry->key.size = 1; + + status = _cairo_pattern_init_copy (&entry->pattern.base, &linear->base.base); + if (unlikely (status)) { + _cairo_freelist_free (&screen->pattern_cache_entry_freelist, entry); + return status; + } + + entry->picture = cairo_surface_reference (picture); + entry->screen = screen; + + status = _cairo_cache_insert (&screen->linear_pattern_cache, + &entry->key); + if (unlikely (status)) { + cairo_surface_destroy (picture); + _cairo_freelist_free (&screen->pattern_cache_entry_freelist, entry); + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_surface_t * +_cairo_xcb_screen_lookup_linear_picture (cairo_xcb_screen_t *screen, + const cairo_linear_pattern_t *linear) +{ + cairo_surface_t *picture = NULL; + struct pattern_cache_entry tmpl; + struct pattern_cache_entry *entry; + + assert (CAIRO_MUTEX_IS_LOCKED (screen->connection->device.mutex)); + + tmpl.key.hash = _cairo_linear_pattern_hash (_CAIRO_HASH_INIT_VALUE, linear); + _cairo_pattern_init_static_copy (&tmpl.pattern.base, &linear->base.base); + + entry = _cairo_cache_lookup (&screen->linear_pattern_cache, &tmpl.key); + if (entry != NULL) + picture = cairo_surface_reference (entry->picture); + + return picture; +} + +cairo_status_t +_cairo_xcb_screen_store_radial_picture (cairo_xcb_screen_t *screen, + const cairo_radial_pattern_t *radial, + cairo_surface_t *picture) +{ + struct pattern_cache_entry *entry; + cairo_status_t status; + + assert (CAIRO_MUTEX_IS_LOCKED (screen->connection->device.mutex)); + + entry = _cairo_freelist_alloc (&screen->pattern_cache_entry_freelist); + if (unlikely (entry == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + entry->key.hash = _cairo_radial_pattern_hash (_CAIRO_HASH_INIT_VALUE, radial); + entry->key.size = 1; + + status = _cairo_pattern_init_copy (&entry->pattern.base, &radial->base.base); + if (unlikely (status)) { + _cairo_freelist_free (&screen->pattern_cache_entry_freelist, entry); + return status; + } + + entry->picture = cairo_surface_reference (picture); + entry->screen = screen; + + status = _cairo_cache_insert (&screen->radial_pattern_cache, &entry->key); + if (unlikely (status)) { + cairo_surface_destroy (picture); + _cairo_freelist_free (&screen->pattern_cache_entry_freelist, entry); + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_surface_t * +_cairo_xcb_screen_lookup_radial_picture (cairo_xcb_screen_t *screen, + const cairo_radial_pattern_t *radial) +{ + cairo_surface_t *picture = NULL; + struct pattern_cache_entry tmpl; + struct pattern_cache_entry *entry; + + assert (CAIRO_MUTEX_IS_LOCKED (screen->connection->device.mutex)); + + tmpl.key.hash = _cairo_radial_pattern_hash (_CAIRO_HASH_INIT_VALUE, radial); + _cairo_pattern_init_static_copy (&tmpl.pattern.base, &radial->base.base); + + entry = _cairo_cache_lookup (&screen->radial_pattern_cache, &tmpl.key); + if (entry != NULL) + picture = cairo_surface_reference (entry->picture); + + return picture; +} + +cairo_font_options_t * +_cairo_xcb_screen_get_font_options (cairo_xcb_screen_t *screen) +{ + if (! screen->has_font_options) { + _cairo_font_options_init_default (&screen->font_options); + _cairo_font_options_set_round_glyph_positions (&screen->font_options, CAIRO_ROUND_GLYPH_POS_ON); + + /* XXX: This is disabled because something seems to be merging + font options incorrectly for xcb. This effectively reverts + the changes brought in git e691d242, and restores ~150 tests + to resume passing. See mailing list archives for Sep 17, + 2014 for more discussion. */ + if (0 && ! _cairo_xcb_connection_acquire (screen->connection)) { + _cairo_xcb_init_screen_font_options (screen); + _cairo_xcb_connection_release (screen->connection); + } + + screen->has_font_options = TRUE; + } + + return &screen->font_options; +} diff --git a/src/cairo-xcb-shm.c b/src/cairo-xcb-shm.c new file mode 100644 index 000000000..2be2dac5b --- /dev/null +++ b/src/cairo-xcb-shm.c @@ -0,0 +1,337 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributors(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + +#include "cairo-xcb-private.h" +#include "cairo-list-inline.h" +#include "cairo-mempool-private.h" + +#include +#include +#include +#include + +#define CAIRO_MAX_SHM_MEMORY (16*1024*1024) + +/* a simple buddy allocator for memory pools + * XXX fragmentation? use Doug Lea's malloc? + */ + +typedef struct _cairo_xcb_shm_mem_block cairo_xcb_shm_mem_block_t; + +typedef enum { + PENDING_WAIT, + PENDING_POLL +} shm_wait_type_t; + +struct _cairo_xcb_shm_mem_pool { + int shmid; + uint32_t shmseg; + void *shm; + + cairo_mempool_t mem; + + cairo_list_t link; +}; + +static void +_cairo_xcb_shm_mem_pool_destroy (cairo_xcb_shm_mem_pool_t *pool) +{ + cairo_list_del (&pool->link); + + shmdt (pool->shm); + _cairo_mempool_fini (&pool->mem); + + free (pool); +} + +static void +_cairo_xcb_shm_info_finalize (cairo_xcb_shm_info_t *shm_info) +{ + cairo_xcb_connection_t *connection = shm_info->connection; + + assert (CAIRO_MUTEX_IS_LOCKED (connection->shm_mutex)); + + _cairo_mempool_free (&shm_info->pool->mem, shm_info->mem); + _cairo_freepool_free (&connection->shm_info_freelist, shm_info); + + /* scan for old, unused pools - hold at least one in reserve */ + if (! cairo_list_is_singular (&connection->shm_pools)) + { + cairo_xcb_shm_mem_pool_t *pool, *next; + cairo_list_t head; + + cairo_list_init (&head); + cairo_list_move (connection->shm_pools.next, &head); + + cairo_list_foreach_entry_safe (pool, next, cairo_xcb_shm_mem_pool_t, + &connection->shm_pools, link) + { + if (pool->mem.free_bytes == pool->mem.max_bytes) { + _cairo_xcb_connection_shm_detach (connection, pool->shmseg); + _cairo_xcb_shm_mem_pool_destroy (pool); + } + } + + cairo_list_move (head.next, &connection->shm_pools); + } +} + +static void +_cairo_xcb_shm_process_pending (cairo_xcb_connection_t *connection, shm_wait_type_t wait) +{ + cairo_xcb_shm_info_t *info, *next; + xcb_get_input_focus_reply_t *reply; + + assert (CAIRO_MUTEX_IS_LOCKED (connection->shm_mutex)); + cairo_list_foreach_entry_safe (info, next, cairo_xcb_shm_info_t, + &connection->shm_pending, pending) + { + switch (wait) { + case PENDING_WAIT: + reply = xcb_wait_for_reply (connection->xcb_connection, + info->sync.sequence, NULL); + break; + case PENDING_POLL: + if (! xcb_poll_for_reply (connection->xcb_connection, + info->sync.sequence, + (void **) &reply, NULL)) + /* We cannot be sure the server finished with this image yet, so + * try again later. All other shm info are guaranteed to have a + * larger sequence number and thus don't have to be checked. */ + return; + break; + default: + /* silence Clang static analyzer warning */ + ASSERT_NOT_REACHED; + reply = NULL; + } + + free (reply); + cairo_list_del (&info->pending); + _cairo_xcb_shm_info_finalize (info); + } +} + +cairo_int_status_t +_cairo_xcb_connection_allocate_shm_info (cairo_xcb_connection_t *connection, + size_t size, + cairo_bool_t might_reuse, + cairo_xcb_shm_info_t **shm_info_out) +{ + cairo_xcb_shm_info_t *shm_info; + cairo_xcb_shm_mem_pool_t *pool, *next; + size_t bytes, maxbits = 16, minbits = 8; + size_t shm_allocated = 0; + void *mem = NULL; + cairo_status_t status; + + assert (connection->flags & CAIRO_XCB_HAS_SHM); + + CAIRO_MUTEX_LOCK (connection->shm_mutex); + _cairo_xcb_shm_process_pending (connection, PENDING_POLL); + + if (might_reuse) { + cairo_list_foreach_entry (shm_info, cairo_xcb_shm_info_t, + &connection->shm_pending, pending) { + if (shm_info->size >= size) { + cairo_list_del (&shm_info->pending); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + + xcb_discard_reply (connection->xcb_connection, shm_info->sync.sequence); + shm_info->sync.sequence = XCB_NONE; + + *shm_info_out = shm_info; + return CAIRO_STATUS_SUCCESS; + } + } + } + + cairo_list_foreach_entry_safe (pool, next, cairo_xcb_shm_mem_pool_t, + &connection->shm_pools, link) + { + if (pool->mem.free_bytes > size) { + mem = _cairo_mempool_alloc (&pool->mem, size); + if (mem != NULL) { + /* keep the active pools towards the front */ + cairo_list_move (&pool->link, &connection->shm_pools); + goto allocate_shm_info; + } + } + /* scan for old, unused pools */ + if (pool->mem.free_bytes == pool->mem.max_bytes) { + _cairo_xcb_connection_shm_detach (connection, + pool->shmseg); + _cairo_xcb_shm_mem_pool_destroy (pool); + } else { + shm_allocated += pool->mem.max_bytes; + } + } + + if (unlikely (shm_allocated >= CAIRO_MAX_SHM_MEMORY)) { + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pool = malloc (sizeof (cairo_xcb_shm_mem_pool_t)); + if (unlikely (pool == NULL)) { + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + bytes = 1 << maxbits; + while (bytes <= size) + bytes <<= 1, maxbits++; + bytes <<= 3; + + do { + pool->shmid = shmget (IPC_PRIVATE, bytes, IPC_CREAT | 0600); + if (pool->shmid != -1) + break; + + /* If the allocation failed because we asked for too much memory, we try + * again with a smaller request, as long as our allocation still fits. */ + bytes >>= 1; + if (errno != EINVAL || bytes < size) + break; + } while (TRUE); + if (pool->shmid == -1) { + int err = errno; + if (! (err == EINVAL || err == ENOMEM)) + connection->flags &= ~CAIRO_XCB_HAS_SHM; + free (pool); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + pool->shm = shmat (pool->shmid, NULL, 0); + if (unlikely (pool->shm == (char *) -1)) { + shmctl (pool->shmid, IPC_RMID, NULL); + free (pool); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + status = _cairo_mempool_init (&pool->mem, pool->shm, bytes, + minbits, maxbits - minbits + 1); + if (unlikely (status)) { + shmdt (pool->shm); + free (pool); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + return status; + } + + pool->shmseg = _cairo_xcb_connection_shm_attach (connection, pool->shmid, FALSE); + shmctl (pool->shmid, IPC_RMID, NULL); + + cairo_list_add (&pool->link, &connection->shm_pools); + mem = _cairo_mempool_alloc (&pool->mem, size); + + allocate_shm_info: + shm_info = _cairo_freepool_alloc (&connection->shm_info_freelist); + if (unlikely (shm_info == NULL)) { + _cairo_mempool_free (&pool->mem, mem); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + shm_info->connection = connection; + shm_info->pool = pool; + shm_info->shm = pool->shmseg; + shm_info->size = size; + shm_info->offset = (char *) mem - (char *) pool->shm; + shm_info->mem = mem; + shm_info->sync.sequence = XCB_NONE; + + /* scan for old, unused pools */ + cairo_list_foreach_entry_safe (pool, next, cairo_xcb_shm_mem_pool_t, + &connection->shm_pools, link) + { + if (pool->mem.free_bytes == pool->mem.max_bytes) { + _cairo_xcb_connection_shm_detach (connection, + pool->shmseg); + _cairo_xcb_shm_mem_pool_destroy (pool); + } + } + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); + + *shm_info_out = shm_info; + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_xcb_shm_info_destroy (cairo_xcb_shm_info_t *shm_info) +{ + cairo_xcb_connection_t *connection = shm_info->connection; + + /* We can only return shm_info->mem to the allocator when we can be sure + * that the X server no longer reads from it. Since the X server processes + * requests in order, we send a GetInputFocus here. + * _cairo_xcb_shm_process_pending () will later check if the reply for that + * request was received and then actually mark this memory area as free. */ + + CAIRO_MUTEX_LOCK (connection->shm_mutex); + assert (shm_info->sync.sequence == XCB_NONE); + shm_info->sync = xcb_get_input_focus (connection->xcb_connection); + + cairo_list_init (&shm_info->pending); + cairo_list_add_tail (&shm_info->pending, &connection->shm_pending); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); +} + +void +_cairo_xcb_connection_shm_mem_pools_flush (cairo_xcb_connection_t *connection) +{ + CAIRO_MUTEX_LOCK (connection->shm_mutex); + _cairo_xcb_shm_process_pending (connection, PENDING_WAIT); + CAIRO_MUTEX_UNLOCK (connection->shm_mutex); +} + +void +_cairo_xcb_connection_shm_mem_pools_fini (cairo_xcb_connection_t *connection) +{ + assert (cairo_list_is_empty (&connection->shm_pending)); + while (! cairo_list_is_empty (&connection->shm_pools)) { + _cairo_xcb_shm_mem_pool_destroy (cairo_list_first_entry (&connection->shm_pools, + cairo_xcb_shm_mem_pool_t, + link)); + } +} + +#endif /* CAIRO_HAS_XCB_SHM_FUNCTIONS */ diff --git a/src/cairo-xcb-surface-core.c b/src/cairo-xcb-surface-core.c new file mode 100644 index 000000000..9c0c0a095 --- /dev/null +++ b/src/cairo-xcb-surface-core.c @@ -0,0 +1,639 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-boxes-private.h" +#include "cairo-xcb-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-backend-private.h" + +/* XXX dithering */ + +typedef struct _cairo_xcb_pixmap { + cairo_surface_t base; + + cairo_xcb_connection_t *connection; + cairo_xcb_screen_t *screen; + + cairo_surface_t *owner; + xcb_pixmap_t pixmap; + int width; + int height; + int depth; + int x0, y0; + cairo_bool_t repeat; +} cairo_xcb_pixmap_t; + +static cairo_status_t +_cairo_xcb_pixmap_finish (void *abstract_surface) +{ + cairo_xcb_pixmap_t *surface = abstract_surface; + cairo_status_t status; + + if (surface->owner != NULL) { + cairo_surface_destroy (surface->owner); + } else { + status = _cairo_xcb_connection_acquire (surface->connection); + if (unlikely (status)) + return status; + + _cairo_xcb_connection_free_pixmap (surface->connection, + surface->pixmap); + _cairo_xcb_connection_release (surface->connection); + } + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t _cairo_xcb_pixmap_backend = { + CAIRO_SURFACE_TYPE_XCB, + _cairo_xcb_pixmap_finish, +}; + +static cairo_xcb_pixmap_t * +_cairo_xcb_pixmap_create (cairo_xcb_surface_t *target, + int width, int height) +{ + cairo_xcb_pixmap_t *surface; + + surface = malloc (sizeof (cairo_xcb_pixmap_t)); + if (unlikely (surface == NULL)) + return (cairo_xcb_pixmap_t *) + _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_xcb_pixmap_backend, + NULL, + target->base.content); + + surface->connection = target->connection; + surface->screen = target->screen; + surface->owner = NULL; + surface->width = width; + surface->height = height; + surface->depth = target->depth; + surface->x0 = surface->y0 = 0; + surface->repeat = FALSE; + + surface->pixmap = + _cairo_xcb_connection_create_pixmap (surface->connection, + surface->depth, + target->drawable, + width, height); + + return surface; +} + +static cairo_xcb_pixmap_t * +_cairo_xcb_pixmap_copy (cairo_xcb_surface_t *target) +{ + cairo_xcb_pixmap_t *surface; + + surface = malloc (sizeof (cairo_xcb_pixmap_t)); + if (unlikely (surface == NULL)) + return (cairo_xcb_pixmap_t *) + _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_xcb_pixmap_backend, + NULL, + target->base.content); + + surface->connection = target->connection; + surface->screen = target->screen; + surface->pixmap = target->drawable; + surface->owner = cairo_surface_reference (&target->base); + surface->width = target->width; + surface->height = target->height; + surface->depth = target->depth; + surface->x0 = surface->y0 = 0; + surface->repeat = FALSE; + + return surface; +} + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS +static cairo_status_t +_cairo_xcb_shm_image_create_shm (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format, + int width, int height, + cairo_image_surface_t **image_out, + cairo_xcb_shm_info_t **shm_info_out) +{ + cairo_surface_t *image = NULL; + cairo_xcb_shm_info_t *shm_info = NULL; + cairo_status_t status; + size_t size, stride; + + if (! (connection->flags & CAIRO_XCB_HAS_SHM)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (unlikely (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + stride = CAIRO_STRIDE_FOR_WIDTH_BPP (width, PIXMAN_FORMAT_BPP (pixman_format)); + size = stride * height; + if (size <= CAIRO_XCB_SHM_SMALL_IMAGE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_xcb_connection_allocate_shm_info (connection, size, + FALSE, &shm_info); + if (unlikely (status)) + return status; + + image = _cairo_image_surface_create_with_pixman_format (shm_info->mem, + pixman_format, + width, height, + stride); + status = image->status; + if (unlikely (status)) { + _cairo_xcb_shm_info_destroy (shm_info); + return status; + } + + status = _cairo_user_data_array_set_data (&image->user_data, + (const cairo_user_data_key_t *) connection, + shm_info, + (cairo_destroy_func_t) _cairo_xcb_shm_info_destroy); + + if (unlikely (status)) { + cairo_surface_destroy (image); + _cairo_xcb_shm_info_destroy (shm_info); + return status; + } + + *image_out = (cairo_image_surface_t *) image; + *shm_info_out = shm_info; + return CAIRO_STATUS_SUCCESS; +} +#else +static cairo_status_t +_cairo_xcb_shm_image_create_shm (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format, + int width, int height, + cairo_image_surface_t **image_out, + cairo_xcb_shm_info_t **shm_info_out) +{ + return CAIRO_INT_STATUS_UNSUPPORTED; +} +#endif + +cairo_status_t +_cairo_xcb_shm_image_create (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format, + int width, int height, + cairo_image_surface_t **image_out, + cairo_xcb_shm_info_t **shm_info_out) +{ + cairo_surface_t *image = NULL; + cairo_xcb_shm_info_t *shm_info = NULL; + cairo_status_t status; + + status = _cairo_xcb_shm_image_create_shm (connection, + pixman_format, + width, + height, + image_out, + shm_info_out); + + if (status != CAIRO_STATUS_SUCCESS) { + image = _cairo_image_surface_create_with_pixman_format (NULL, + pixman_format, + width, height, + 0); + status = image->status; + if (unlikely (status)) + return status; + + *image_out = (cairo_image_surface_t *) image; + *shm_info_out = shm_info; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_xcb_pixmap_t * +_pixmap_from_image (cairo_xcb_surface_t *target, + xcb_render_pictformat_t format, + cairo_image_surface_t *image, + cairo_xcb_shm_info_t *shm_info) +{ + xcb_gcontext_t gc; + cairo_xcb_pixmap_t *pixmap; + + pixmap = _cairo_xcb_pixmap_create (target, + image->width, + image->height); + if (unlikely (pixmap->base.status)) + return pixmap; + + gc = _cairo_xcb_screen_get_gc (target->screen, pixmap->pixmap, image->depth); + + if (shm_info != NULL) { + _cairo_xcb_connection_shm_put_image (target->connection, + pixmap->pixmap, gc, + image->width, image->height, + 0, 0, + image->width, image->height, + 0, 0, + image->depth, + shm_info->shm, + shm_info->offset); + } else { + int len; + + /* Do we need to trim the image? */ + len = CAIRO_STRIDE_FOR_WIDTH_BPP (image->width, + PIXMAN_FORMAT_BPP (image->pixman_format)); + if (len == image->stride) { + _cairo_xcb_connection_put_image (target->connection, + pixmap->pixmap, gc, + image->width, image->height, + 0, 0, + image->depth, + image->stride, + image->data); + } else { + _cairo_xcb_connection_put_subimage (target->connection, + pixmap->pixmap, gc, + 0, 0, + image->width, image->height, + PIXMAN_FORMAT_BPP (image->pixman_format) / 8, + image->stride, + 0, 0, + image->depth, + image->data); + + } + } + + _cairo_xcb_screen_put_gc (target->screen, image->depth, gc); + + return pixmap; +} + +static cairo_xcb_pixmap_t * +_render_to_pixmap (cairo_xcb_surface_t *target, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + cairo_image_surface_t *image; + cairo_xcb_shm_info_t *shm_info; + cairo_pattern_union_t copy; + cairo_status_t status; + cairo_xcb_pixmap_t *pixmap; + + status = _cairo_xcb_shm_image_create (target->screen->connection, + target->pixman_format, + extents->width, extents->height, + &image, &shm_info); + if (unlikely (status)) + return (cairo_xcb_pixmap_t *) _cairo_surface_create_in_error (status); + + _cairo_pattern_init_static_copy (©.base, pattern); + cairo_matrix_translate (©.base.matrix, -extents->x, -extents->y); + status = _cairo_surface_paint (&image->base, + CAIRO_OPERATOR_SOURCE, + ©.base, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (&image->base); + return (cairo_xcb_pixmap_t *) _cairo_surface_create_in_error (status); + } + + pixmap = _pixmap_from_image (target, target->xrender_format, image, shm_info); + cairo_surface_destroy (&image->base); + + if (unlikely (pixmap->base.status)) + return pixmap; + + pixmap->x0 = -extents->x; + pixmap->y0 = -extents->y; + return pixmap; +} + +static cairo_xcb_pixmap_t * +_copy_to_pixmap (cairo_xcb_surface_t *source) +{ + cairo_xcb_pixmap_t *pixmap; + + /* If the source may be a window, we need to copy it and its children + * via a temporary pixmap so that we can IncludeInferiors on the source + * and use ClipByChildren on the destination. + */ + if (source->owns_pixmap) { + pixmap = _cairo_xcb_pixmap_copy (source); + if (unlikely (pixmap->base.status)) + return pixmap; + } else { + uint32_t values[1]; + xcb_gcontext_t gc; + + pixmap = _cairo_xcb_pixmap_create (source, + source->width, + source->height); + if (unlikely (pixmap->base.status)) + return pixmap; + + gc = _cairo_xcb_screen_get_gc (source->screen, + pixmap->pixmap, + pixmap->depth); + + values[0] = TRUE; + _cairo_xcb_connection_change_gc (pixmap->connection, gc, + XCB_GC_SUBWINDOW_MODE, values); + + _cairo_xcb_connection_copy_area (pixmap->connection, + source->drawable, + pixmap->pixmap, gc, + 0, 0, + 0, 0, + source->width, + source->height); + + values[0] = FALSE; + _cairo_xcb_connection_change_gc (pixmap->connection, gc, + XCB_GC_SUBWINDOW_MODE, values); + + _cairo_xcb_screen_put_gc (source->screen, + pixmap->depth, + gc); + } + + return pixmap; +} +static cairo_xcb_pixmap_t * +_cairo_xcb_surface_pixmap (cairo_xcb_surface_t *target, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + int tx, int ty) +{ + cairo_surface_t *source; + cairo_xcb_pixmap_t *pixmap; + + source = pattern->surface; + pixmap = (cairo_xcb_pixmap_t *) + _cairo_surface_has_snapshot (source, &_cairo_xcb_pixmap_backend); + if (pixmap != NULL && pixmap->screen == target->screen) + return (cairo_xcb_pixmap_t *) cairo_surface_reference (&pixmap->base); + + if (_cairo_surface_is_xcb(source) && + ((cairo_xcb_surface_t *) source)->screen == target->screen) + { + cairo_xcb_surface_t *xcb_source = (cairo_xcb_surface_t *) source; + + if (xcb_source->depth == target->depth) + pixmap = _copy_to_pixmap (xcb_source); + } +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS + else if (source->type == CAIRO_SURFACE_TYPE_XLIB && + ((cairo_xlib_xcb_surface_t *) source)->xcb->screen == target->screen) + { + cairo_xcb_surface_t *xcb_source = ((cairo_xlib_xcb_surface_t *) source)->xcb; + + if (xcb_source->depth == target->depth) + pixmap = _copy_to_pixmap (xcb_source); + } +#endif + + if (pixmap == NULL) { + cairo_rectangle_int_t rect; + + if (! _cairo_surface_get_extents (source, &rect)) { + rect.x = rect.y = 0; + rect.width = target->width; + rect.height = target->height; + } + + pixmap = _render_to_pixmap (target, &pattern->base, &rect); + } + + if (unlikely (pixmap->base.status)) + return pixmap; + + _cairo_surface_attach_snapshot (source, &pixmap->base, NULL); + + if (pattern->base.extend != CAIRO_EXTEND_NONE) { + if (extents->x < 0 || extents->y < 0 || + extents->x + extents->width > pixmap->width || + extents->y + extents->height > pixmap->height) + { + pixmap->repeat = TRUE; + } + } + + pixmap->x0 += tx; + pixmap->y0 += ty; + + return pixmap; +} + +static cairo_xcb_pixmap_t * +_cairo_xcb_pixmap_for_pattern (cairo_xcb_surface_t *target, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + int tx, ty; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SURFACE: + /* Core can only perform a native, unscaled blit, but can handle tiles */ + if (_cairo_matrix_is_integer_translation (&pattern->matrix, &tx, &ty)) { + switch (pattern->extend) { + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_REPEAT: + return _cairo_xcb_surface_pixmap (target, + (cairo_surface_pattern_t *) pattern, + extents, tx, ty); + + default: + case CAIRO_EXTEND_PAD: + case CAIRO_EXTEND_REFLECT: + break; + } + } + /* fallthrough */ + case CAIRO_PATTERN_TYPE_LINEAR: + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _render_to_pixmap (target, pattern, extents); + + default: + case CAIRO_PATTERN_TYPE_SOLID: + ASSERT_NOT_REACHED; + return NULL; + } +} + +cairo_status_t +_cairo_xcb_surface_core_copy_boxes (cairo_xcb_surface_t *dst, + const cairo_pattern_t *src_pattern, + const cairo_rectangle_int_t *extents, + const cairo_boxes_t *boxes) +{ + cairo_xcb_pixmap_t *src; + const struct _cairo_boxes_chunk *chunk; + xcb_gcontext_t gc; + cairo_status_t status; + + status = _cairo_xcb_connection_acquire (dst->connection); + if (unlikely (status)) + return status; + + src = _cairo_xcb_pixmap_for_pattern (dst, src_pattern, extents); + status = src->base.status; + if (unlikely (status)) + goto CLEANUP_CONNECTION; + + assert (src->depth == dst->depth); + + gc = _cairo_xcb_screen_get_gc (dst->screen, src->pixmap, src->depth); + + if (src->repeat) { + uint32_t mask = + XCB_GC_FILL_STYLE | + XCB_GC_TILE | + XCB_GC_TILE_STIPPLE_ORIGIN_X | + XCB_GC_TILE_STIPPLE_ORIGIN_Y; + uint32_t values[] = { + XCB_FILL_STYLE_TILED, + src->pixmap, + - src->x0, - src->y0, + }; + xcb_rectangle_t *xcb_rects; + + _cairo_xcb_connection_change_gc (dst->connection, gc, mask, values); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + int i; + + xcb_rects = (xcb_rectangle_t *) chunk->base; + + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (chunk->base[i].p1.x); + int x2 = _cairo_fixed_integer_round (chunk->base[i].p2.x); + int y1 = _cairo_fixed_integer_round (chunk->base[i].p1.y); + int y2 = _cairo_fixed_integer_round (chunk->base[i].p2.y); + + xcb_rects[i].x = x1; + xcb_rects[i].y = y1; + xcb_rects[i].width = x2 - x1; + xcb_rects[i].height = y2 - y1; + } + _cairo_xcb_connection_poly_fill_rectangle (dst->connection, + dst->drawable, + gc, chunk->count, xcb_rects); + } + + values[0] = 0; + _cairo_xcb_connection_change_gc (dst->connection, gc, XCB_GC_FILL_STYLE, values); + } else { + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + int i; + + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (chunk->base[i].p1.x); + int x2 = _cairo_fixed_integer_round (chunk->base[i].p2.x); + int y1 = _cairo_fixed_integer_round (chunk->base[i].p1.y); + int y2 = _cairo_fixed_integer_round (chunk->base[i].p2.y); + + _cairo_xcb_connection_copy_area (dst->connection, + src->pixmap, + dst->drawable, gc, + src->x0 + x1, + src->y0 + y1, + x1, y1, + x2 - x1, y2 - y1); + } + } + } + + _cairo_xcb_screen_put_gc (dst->screen, src->depth, gc); + cairo_surface_destroy (&src->base); + + CLEANUP_CONNECTION: + _cairo_xcb_connection_release (dst->connection); + + return status; +} + +cairo_status_t +_cairo_xcb_surface_core_fill_boxes (cairo_xcb_surface_t *dst, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + struct _cairo_boxes_chunk *chunk; + xcb_gcontext_t gc; + cairo_status_t status; + + status = _cairo_xcb_connection_acquire (dst->connection); + if (unlikely (status)) + return status; + + gc = _cairo_xcb_screen_get_gc (dst->screen, dst->drawable, dst->depth); + +#if 0 + xcb_pixmap_t source; + + source = _dither_source (dst, color); + XSetTSOrigin (surface->dpy, gc, 0, 0); + XSetTile (surface->dpy, gc, source); +#endif + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + xcb_rectangle_t *xcb_rects; + int i; + + xcb_rects = (xcb_rectangle_t *) chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (chunk->base[i].p1.x); + int x2 = _cairo_fixed_integer_round (chunk->base[i].p2.x); + int y1 = _cairo_fixed_integer_round (chunk->base[i].p1.y); + int y2 = _cairo_fixed_integer_round (chunk->base[i].p2.y); + + xcb_rects[i].x = x1; + xcb_rects[i].y = y1; + xcb_rects[i].width = x2 - x1; + xcb_rects[i].height = y2 - y1; + } + + _cairo_xcb_connection_poly_fill_rectangle (dst->connection, + dst->drawable, gc, + chunk->count, xcb_rects); + } + + _cairo_xcb_screen_put_gc (dst->screen, dst->depth, gc); + _cairo_xcb_connection_release (dst->connection); + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c new file mode 100644 index 000000000..1a086a24f --- /dev/null +++ b/src/cairo-xcb-surface-render.c @@ -0,0 +1,4878 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-xcb-private.h" + +#include "cairo-boxes-private.h" +#include "cairo-clip-inline.h" +#include "cairo-clip-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-region-private.h" +#include "cairo-surface-offset-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-traps-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-paginated-private.h" +#include "cairo-pattern-inline.h" + +#define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */ + +static cairo_status_t +_clip_and_composite_boxes (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + cairo_boxes_t *boxes, + cairo_composite_rectangles_t *extents); + +static inline cairo_xcb_connection_t * +_picture_to_connection (cairo_xcb_picture_t *picture) +{ + return (cairo_xcb_connection_t *) picture->base.device; +} + +static void +_cairo_xcb_surface_ensure_picture (cairo_xcb_surface_t *surface); + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + static uint32_t x; + return x = (x ^ rol (x, 5) ^ rol (x, 24)) + 0x37798849; +#undef rol +} + +static cairo_status_t +_cairo_xcb_picture_finish (void *abstract_surface) +{ + cairo_xcb_picture_t *surface = abstract_surface; + cairo_xcb_connection_t *connection = _picture_to_connection (surface); + cairo_status_t status; + + status = _cairo_xcb_connection_acquire (connection); + cairo_list_del (&surface->link); + if (unlikely (status)) + return status; + + _cairo_xcb_connection_render_free_picture (connection, surface->picture); + + _cairo_xcb_connection_release (connection); + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t _cairo_xcb_picture_backend = { + CAIRO_SURFACE_TYPE_XCB, + _cairo_xcb_picture_finish, +}; + +static const struct xcb_render_transform_t identity_transform = { + 1 << 16, 0, 0, + 0, 1 << 16, 0, + 0, 0, 1 << 16, +}; + +static cairo_xcb_picture_t * +_cairo_xcb_picture_create (cairo_xcb_screen_t *screen, + pixman_format_code_t pixman_format, + xcb_render_pictformat_t xrender_format, + int width, int height) +{ + cairo_xcb_picture_t *surface; + + surface = malloc (sizeof (cairo_xcb_picture_t)); + if (unlikely (surface == NULL)) + return (cairo_xcb_picture_t *) + _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_xcb_picture_backend, + &screen->connection->device, + _cairo_content_from_pixman_format (pixman_format)); + + cairo_list_add (&surface->link, &screen->pictures); + + surface->screen = screen; + surface->picture = _cairo_xcb_connection_get_xid (screen->connection); + surface->pixman_format = pixman_format; + surface->xrender_format = xrender_format; + + surface->x0 = surface->y0 = 0; + surface->x = surface->y = 0; + surface->width = width; + surface->height = height; + + surface->transform = identity_transform; + surface->extend = CAIRO_EXTEND_NONE; + surface->filter = CAIRO_FILTER_NEAREST; + surface->has_component_alpha = FALSE; + + return surface; +} + +static inline cairo_bool_t +_operator_is_supported (uint32_t flags, cairo_operator_t op) +{ + if (op <= CAIRO_OPERATOR_SATURATE) + return TRUE; + + /* Can we use PDF operators? */ +#if CAIRO_XCB_RENDER_AT_LEAST(0, 11) + if (op <= CAIRO_OPERATOR_HSL_LUMINOSITY) + return flags & CAIRO_XCB_RENDER_HAS_PDF_OPERATORS; +#endif + + return FALSE; +} + +static int +_render_operator (cairo_operator_t op) +{ +#define C(x,y) case CAIRO_OPERATOR_##x: return XCB_RENDER_PICT_OP_##y + switch (op) { + C(CLEAR, CLEAR); + C(SOURCE, SRC); + + C(OVER, OVER); + C(IN, IN); + C(OUT, OUT); + C(ATOP, ATOP); + + C(DEST, DST); + C(DEST_OVER, OVER_REVERSE); + C(DEST_IN, IN_REVERSE); + C(DEST_OUT, OUT_REVERSE); + C(DEST_ATOP, ATOP_REVERSE); + + C(XOR, XOR); + C(ADD, ADD); + C(SATURATE, SATURATE); + + /* PDF operators were added in RENDER 0.11, check if the xcb headers have + * the defines, else fall through to the default case. */ +#if CAIRO_XCB_RENDER_AT_LEAST(0, 11) +#define BLEND(x,y) C(x,y) +#else +#define BLEND(x,y) case CAIRO_OPERATOR_##x: +#endif + BLEND(MULTIPLY, MULTIPLY); + BLEND(SCREEN, SCREEN); + BLEND(OVERLAY, OVERLAY); + BLEND(DARKEN, DARKEN); + BLEND(LIGHTEN, LIGHTEN); + BLEND(COLOR_DODGE, COLOR_DODGE); + BLEND(COLOR_BURN, COLOR_BURN); + BLEND(HARD_LIGHT, HARD_LIGHT); + BLEND(SOFT_LIGHT, SOFT_LIGHT); + BLEND(DIFFERENCE, DIFFERENCE); + BLEND(EXCLUSION, EXCLUSION); + BLEND(HSL_HUE, HSL_HUE); + BLEND(HSL_SATURATION, HSL_SATURATION); + BLEND(HSL_COLOR, HSL_COLOR); + BLEND(HSL_LUMINOSITY, HSL_LUMINOSITY); + + default: + ASSERT_NOT_REACHED; + return XCB_RENDER_PICT_OP_OVER; + } +} + +static cairo_status_t +_cairo_xcb_surface_set_clip_region (cairo_xcb_surface_t *surface, + cairo_region_t *region) +{ + xcb_rectangle_t stack_rects[CAIRO_STACK_ARRAY_LENGTH (xcb_rectangle_t)]; + xcb_rectangle_t *rects = stack_rects; + int i, num_rects; + + num_rects = cairo_region_num_rectangles (region); + + if (num_rects > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (num_rects, sizeof (xcb_rectangle_t)); + if (unlikely (rects == NULL)) { + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + } + + for (i = 0; i < num_rects; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (region, i, &rect); + + rects[i].x = rect.x; + rects[i].y = rect.y; + rects[i].width = rect.width; + rects[i].height = rect.height; + } + + _cairo_xcb_connection_render_set_picture_clip_rectangles (surface->connection, + surface->picture, + 0, 0, + num_rects, rects); + + if (rects != stack_rects) + free (rects); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_xcb_surface_clear_clip_region (cairo_xcb_surface_t *surface) +{ + uint32_t values[] = { XCB_NONE }; + _cairo_xcb_connection_render_change_picture (surface->connection, + surface->picture, + XCB_RENDER_CP_CLIP_MASK, + values); +} + +static void +_cairo_xcb_surface_set_precision (cairo_xcb_surface_t *surface, + cairo_antialias_t antialias) +{ + cairo_xcb_connection_t *connection = surface->connection; + uint32_t precision; + + if (connection->force_precision != -1) + precision = connection->force_precision; + else switch (antialias) { + default: + case CAIRO_ANTIALIAS_DEFAULT: + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_NONE: + case CAIRO_ANTIALIAS_FAST: + case CAIRO_ANTIALIAS_GOOD: + precision = XCB_RENDER_POLY_MODE_IMPRECISE; + break; + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_BEST: + precision = XCB_RENDER_POLY_MODE_PRECISE; + break; + } + + if (surface->precision != precision) { + _cairo_xcb_connection_render_change_picture (connection, + surface->picture, + XCB_RENDER_CP_POLY_MODE, + &precision); + surface->precision = precision; + } +} + + +static void +_cairo_xcb_surface_ensure_picture (cairo_xcb_surface_t *surface) +{ + assert (surface->fallback == NULL); + if (surface->picture == XCB_NONE) { + uint32_t values[1]; + uint32_t flags = 0; + + if (surface->precision != XCB_RENDER_POLY_MODE_PRECISE) { + flags |= XCB_RENDER_CP_POLY_MODE; + values[0] = surface->precision; + } + + surface->picture = _cairo_xcb_connection_get_xid (surface->connection); + _cairo_xcb_connection_render_create_picture (surface->connection, + surface->picture, + surface->drawable, + surface->xrender_format, + flags, values); + } +} + +static cairo_xcb_picture_t * +_picture_from_image (cairo_xcb_surface_t *target, + xcb_render_pictformat_t format, + cairo_image_surface_t *image, + cairo_xcb_shm_info_t *shm_info) +{ + xcb_pixmap_t pixmap; + xcb_gcontext_t gc; + cairo_xcb_picture_t *picture; + + pixmap = _cairo_xcb_connection_create_pixmap (target->connection, + image->depth, + target->drawable, + image->width, image->height); + + gc = _cairo_xcb_screen_get_gc (target->screen, pixmap, image->depth); + + if (shm_info != NULL) { + _cairo_xcb_connection_shm_put_image (target->connection, + pixmap, gc, + image->width, image->height, + 0, 0, + image->width, image->height, + 0, 0, + image->depth, + shm_info->shm, + shm_info->offset); + } else { + int len; + + /* Do we need to trim the image? */ + len = CAIRO_STRIDE_FOR_WIDTH_BPP (image->width, PIXMAN_FORMAT_BPP (image->pixman_format)); + if (len == image->stride) { + _cairo_xcb_connection_put_image (target->connection, + pixmap, gc, + image->width, image->height, + 0, 0, + image->depth, + image->stride, + image->data); + } else { + _cairo_xcb_connection_put_subimage (target->connection, + pixmap, gc, + 0, 0, + image->width, image->height, + PIXMAN_FORMAT_BPP (image->pixman_format) / 8, + image->stride, + 0, 0, + image->depth, + image->data); + + } + } + + _cairo_xcb_screen_put_gc (target->screen, image->depth, gc); + + picture = _cairo_xcb_picture_create (target->screen, + image->pixman_format, format, + image->width, image->height); + if (likely (picture->base.status == CAIRO_STATUS_SUCCESS)) { + _cairo_xcb_connection_render_create_picture (target->connection, + picture->picture, pixmap, format, + 0, 0); + } + + _cairo_xcb_connection_free_pixmap (target->connection, pixmap); + + return picture; +} + +static cairo_bool_t +_pattern_is_supported (uint32_t flags, + const cairo_pattern_t *pattern) + +{ + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) + return TRUE; + + switch (pattern->extend) { + default: + ASSERT_NOT_REACHED; + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_REPEAT: + break; + case CAIRO_EXTEND_PAD: + case CAIRO_EXTEND_REFLECT: + if ((flags & CAIRO_XCB_RENDER_HAS_EXTENDED_REPEAT) == 0) + return FALSE; + } + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + switch (pattern->filter) { + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + return (flags & CAIRO_XCB_RENDER_HAS_PICTURE_TRANSFORM) || + _cairo_matrix_is_integer_translation (&pattern->matrix, NULL, NULL); + case CAIRO_FILTER_GOOD: + return flags & CAIRO_XCB_RENDER_HAS_FILTER_GOOD; + case CAIRO_FILTER_BEST: + return flags & CAIRO_XCB_RENDER_HAS_FILTER_BEST; + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + default: + return flags & CAIRO_XCB_RENDER_HAS_FILTERS; + } + } else if (pattern->type == CAIRO_PATTERN_TYPE_MESH) { + return FALSE; + } else { /* gradient */ + if ((flags & CAIRO_XCB_RENDER_HAS_GRADIENTS) == 0) + return FALSE; + + /* The RENDER specification says that the inner circle has to be + * completely contained inside the outer one. */ + if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL && + ! _cairo_radial_pattern_focus_is_inside ((cairo_radial_pattern_t *) pattern)) + { + return FALSE; + } + return TRUE; + } +} + +static void +_cairo_xcb_picture_set_matrix (cairo_xcb_picture_t *picture, + const cairo_matrix_t *matrix, + cairo_filter_t filter, + double xc, double yc) +{ + xcb_render_transform_t transform; + pixman_transform_t *pixman_transform; + cairo_int_status_t ignored; + + /* Casting between pixman_transform_t and xcb_render_transform_t is safe + * because they happen to be the exact same type. + */ + pixman_transform = (pixman_transform_t *) &transform; + + picture->x = picture->x0; + picture->y = picture->y0; + ignored = _cairo_matrix_to_pixman_matrix_offset (matrix, filter, xc, yc, + pixman_transform, + &picture->x, &picture->y); + (void) ignored; + + if (memcmp (&picture->transform, &transform, sizeof (xcb_render_transform_t))) { + _cairo_xcb_connection_render_set_picture_transform (_picture_to_connection (picture), + picture->picture, + &transform); + + picture->transform = transform; + } +} + +static void +_cairo_xcb_picture_set_filter (cairo_xcb_picture_t *picture, + cairo_filter_t filter) +{ + const char *render_filter; + int len; + + if (picture->filter == filter) + return; + + switch (filter) { + case CAIRO_FILTER_FAST: + render_filter = "fast"; + len = strlen ("fast"); + break; + + case CAIRO_FILTER_GOOD: + render_filter = "good"; + len = strlen ("good"); + break; + + case CAIRO_FILTER_BEST: + render_filter = "best"; + len = strlen ("best"); + break; + + case CAIRO_FILTER_NEAREST: + render_filter = "nearest"; + len = strlen ("nearest"); + break; + + case CAIRO_FILTER_BILINEAR: + render_filter = "bilinear"; + len = strlen ("bilinear"); + break; + + default: + ASSERT_NOT_REACHED; + case CAIRO_FILTER_GAUSSIAN: + render_filter = "best"; + len = strlen ("best"); + break; + } + + _cairo_xcb_connection_render_set_picture_filter (_picture_to_connection (picture), + picture->picture, + len, (char *) render_filter); + picture->filter = filter; +} + +static void +_cairo_xcb_picture_set_extend (cairo_xcb_picture_t *picture, + cairo_extend_t extend) +{ + uint32_t pa[1]; + + if (picture->extend == extend) + return; + + switch (extend) { + default: + ASSERT_NOT_REACHED; + case CAIRO_EXTEND_NONE: + pa[0] = XCB_RENDER_REPEAT_NONE; + break; + + case CAIRO_EXTEND_REPEAT: + pa[0] = XCB_RENDER_REPEAT_NORMAL; + break; + + case CAIRO_EXTEND_REFLECT: + pa[0] = XCB_RENDER_REPEAT_REFLECT; + break; + + case CAIRO_EXTEND_PAD: + pa[0] = XCB_RENDER_REPEAT_PAD; + break; + } + + _cairo_xcb_connection_render_change_picture (_picture_to_connection (picture), + picture->picture, + XCB_RENDER_CP_REPEAT, pa); + picture->extend = extend; +} + +static void +_cairo_xcb_picture_set_component_alpha (cairo_xcb_picture_t *picture, + cairo_bool_t ca) +{ + uint32_t pa[1]; + + if (picture->has_component_alpha == ca) + return; + + pa[0] = ca; + + _cairo_xcb_connection_render_change_picture (_picture_to_connection (picture), + picture->picture, + XCB_RENDER_CP_COMPONENT_ALPHA, + pa); + picture->has_component_alpha = ca; +} + +static cairo_xcb_picture_t * +_solid_picture (cairo_xcb_surface_t *target, + const cairo_color_t *color) +{ + xcb_render_color_t xcb_color; + xcb_render_pictformat_t xrender_format; + cairo_xcb_picture_t *picture; + + xcb_color.red = color->red_short; + xcb_color.green = color->green_short; + xcb_color.blue = color->blue_short; + xcb_color.alpha = color->alpha_short; + + xrender_format = target->screen->connection->standard_formats[CAIRO_FORMAT_ARGB32]; + picture = _cairo_xcb_picture_create (target->screen, + PIXMAN_a8r8g8b8, + xrender_format, + -1, -1); + if (unlikely (picture->base.status)) + return picture; + + if (target->connection->flags & CAIRO_XCB_RENDER_HAS_GRADIENTS) { + _cairo_xcb_connection_render_create_solid_fill (target->connection, + picture->picture, + xcb_color); + } else { + xcb_pixmap_t pixmap; + uint32_t values[] = { XCB_RENDER_REPEAT_NORMAL }; + + pixmap = _cairo_xcb_connection_create_pixmap (target->connection, + 32, target->drawable, 1, 1); + _cairo_xcb_connection_render_create_picture (target->connection, + picture->picture, + pixmap, + xrender_format, + XCB_RENDER_CP_REPEAT, + values); + if (target->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES) { + xcb_rectangle_t rect; + + rect.x = rect.y = 0; + rect.width = rect.height = 1; + + _cairo_xcb_connection_render_fill_rectangles (_picture_to_connection (picture), + XCB_RENDER_PICT_OP_SRC, + picture->picture, + xcb_color, 1, &rect); + } else { + xcb_gcontext_t gc; + uint32_t pixel; + + gc = _cairo_xcb_screen_get_gc (target->screen, pixmap, 32); + + /* XXX byte ordering? */ + pixel = ((color->alpha_short >> 8) << 24) | + ((color->red_short >> 8) << 16) | + ((color->green_short >> 8) << 8) | + ((color->blue_short >> 8) << 0); + + _cairo_xcb_connection_put_image (target->connection, + pixmap, gc, + 1, 1, 0, 0, + 32, 4, &pixel); + + _cairo_xcb_screen_put_gc (target->screen, 32, gc); + } + + _cairo_xcb_connection_free_pixmap (target->connection, pixmap); + } + + return picture; +} + +static cairo_xcb_picture_t * +_cairo_xcb_transparent_picture (cairo_xcb_surface_t *target) +{ + cairo_xcb_picture_t *picture; + + picture = (cairo_xcb_picture_t *) target->screen->stock_colors[CAIRO_STOCK_TRANSPARENT]; + if (picture == NULL) { + picture = _solid_picture (target, CAIRO_COLOR_TRANSPARENT); + target->screen->stock_colors[CAIRO_STOCK_TRANSPARENT] = &picture->base; + } + + return (cairo_xcb_picture_t *) cairo_surface_reference (&picture->base); +} + +static cairo_xcb_picture_t * +_cairo_xcb_black_picture (cairo_xcb_surface_t *target) +{ + cairo_xcb_picture_t *picture; + + picture = (cairo_xcb_picture_t *) target->screen->stock_colors[CAIRO_STOCK_BLACK]; + if (picture == NULL) { + picture = _solid_picture (target, CAIRO_COLOR_BLACK); + target->screen->stock_colors[CAIRO_STOCK_BLACK] = &picture->base; + } + + return (cairo_xcb_picture_t *) cairo_surface_reference (&picture->base); +} + +static cairo_xcb_picture_t * +_cairo_xcb_white_picture (cairo_xcb_surface_t *target) +{ + cairo_xcb_picture_t *picture; + + picture = (cairo_xcb_picture_t *) target->screen->stock_colors[CAIRO_STOCK_WHITE]; + if (picture == NULL) { + picture = _solid_picture (target, CAIRO_COLOR_WHITE); + target->screen->stock_colors[CAIRO_STOCK_WHITE] = &picture->base; + } + + return (cairo_xcb_picture_t *) cairo_surface_reference (&picture->base); +} + +static cairo_xcb_picture_t * +_cairo_xcb_solid_picture (cairo_xcb_surface_t *target, + const cairo_solid_pattern_t *pattern) +{ + cairo_xcb_picture_t *picture; + cairo_xcb_screen_t *screen; + int i, n_cached; + + if (pattern->color.alpha_short <= 0x00ff) + return _cairo_xcb_transparent_picture (target); + + if (pattern->color.alpha_short >= 0xff00) { + if (pattern->color.red_short <= 0x00ff && + pattern->color.green_short <= 0x00ff && + pattern->color.blue_short <= 0x00ff) + { + return _cairo_xcb_black_picture (target); + } + + if (pattern->color.red_short >= 0xff00 && + pattern->color.green_short >= 0xff00 && + pattern->color.blue_short >= 0xff00) + { + return _cairo_xcb_white_picture (target); + } + } + + screen = target->screen; + n_cached = screen->solid_cache_size; + for (i = 0; i < n_cached; i++) { + if (_cairo_color_equal (&screen->solid_cache[i].color, &pattern->color)) { + return (cairo_xcb_picture_t *) cairo_surface_reference (screen->solid_cache[i].picture); + } + } + + picture = _solid_picture (target, &pattern->color); + if (unlikely (picture->base.status)) + return picture; + + if (screen->solid_cache_size < ARRAY_LENGTH (screen->solid_cache)) { + i = screen->solid_cache_size++; + } else { + i = hars_petruska_f54_1_random () % ARRAY_LENGTH (screen->solid_cache); + cairo_surface_destroy (screen->solid_cache[i].picture); + } + screen->solid_cache[i].picture = cairo_surface_reference (&picture->base); + screen->solid_cache[i].color = pattern->color; + + return picture; +} + +static cairo_xcb_picture_t * +_render_to_picture (cairo_xcb_surface_t *target, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + cairo_image_surface_t *image; + cairo_xcb_shm_info_t *shm_info; + cairo_pattern_union_t copy; + cairo_status_t status; + cairo_xcb_picture_t *picture; + pixman_format_code_t pixman_format; + xcb_render_pictformat_t xrender_format; + + /* XXX handle extend modes via tiling? */ + /* XXX alpha-only masks? */ + + pixman_format = PIXMAN_a8r8g8b8; + xrender_format = target->screen->connection->standard_formats[CAIRO_FORMAT_ARGB32]; + + status = _cairo_xcb_shm_image_create (target->screen->connection, + pixman_format, + extents->width, extents->height, + &image, &shm_info); + if (unlikely (status)) + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + + _cairo_pattern_init_static_copy (©.base, pattern); + cairo_matrix_translate (©.base.matrix, extents->x, extents->y); + status = _cairo_surface_paint (&image->base, + CAIRO_OPERATOR_SOURCE, + ©.base, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (&image->base); + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + } + + picture = _picture_from_image (target, xrender_format, image, shm_info); + cairo_surface_destroy (&image->base); + + if (unlikely (picture->base.status)) + return picture; + + _cairo_xcb_picture_set_component_alpha (picture, pattern->has_component_alpha); + picture->x = -extents->x; + picture->y = -extents->y; + + return picture; +} + +static xcb_render_fixed_t * +_gradient_to_xcb (const cairo_gradient_pattern_t *gradient, + unsigned int *n_stops, + char *buf, unsigned int buflen) +{ + xcb_render_fixed_t *stops; + xcb_render_color_t *colors; + unsigned int i; + + assert (gradient->n_stops > 0); + *n_stops = MAX (gradient->n_stops, 2); + + if (*n_stops * (sizeof (xcb_render_fixed_t) + sizeof (xcb_render_color_t)) < buflen) + { + stops = (xcb_render_fixed_t *) buf; + } + else + { + stops = + _cairo_malloc_ab (*n_stops, + sizeof (xcb_render_fixed_t) + sizeof (xcb_render_color_t)); + if (unlikely (stops == NULL)) + return NULL; + } + + colors = (xcb_render_color_t *) (stops + *n_stops); + for (i = 0; i < gradient->n_stops; i++) { + stops[i] = + _cairo_fixed_16_16_from_double (gradient->stops[i].offset); + + colors[i].red = gradient->stops[i].color.red_short; + colors[i].green = gradient->stops[i].color.green_short; + colors[i].blue = gradient->stops[i].color.blue_short; + colors[i].alpha = gradient->stops[i].color.alpha_short; + } + + /* RENDER does not support gradients with less than 2 stops. If a + * gradient has only a single stop, duplicate it to make RENDER + * happy. */ + if (gradient->n_stops == 1) { + stops[1] = _cairo_fixed_16_16_from_double (gradient->stops[0].offset); + + colors[1].red = gradient->stops[0].color.red_short; + colors[1].green = gradient->stops[0].color.green_short; + colors[1].blue = gradient->stops[0].color.blue_short; + colors[1].alpha = gradient->stops[0].color.alpha_short; + } + + return stops; +} + +static cairo_xcb_picture_t * +_cairo_xcb_linear_picture (cairo_xcb_surface_t *target, + const cairo_linear_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + char buf[CAIRO_STACK_BUFFER_SIZE]; + xcb_render_fixed_t *stops; + xcb_render_color_t *colors; + xcb_render_pointfix_t p1, p2; + cairo_matrix_t matrix; + cairo_circle_double_t extremes[2]; + cairo_xcb_picture_t *picture; + cairo_status_t status; + unsigned int n_stops; + + _cairo_gradient_pattern_fit_to_range (&pattern->base, PIXMAN_MAX_INT >> 1, &matrix, extremes); + + picture = (cairo_xcb_picture_t *) + _cairo_xcb_screen_lookup_linear_picture (target->screen, pattern); + if (picture != NULL) + goto setup_picture; + + stops = _gradient_to_xcb (&pattern->base, &n_stops, buf, sizeof (buf)); + if (unlikely (stops == NULL)) + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + picture = _cairo_xcb_picture_create (target->screen, + target->screen->connection->standard_formats[CAIRO_FORMAT_ARGB32], + PIXMAN_a8r8g8b8, + -1, -1); + if (unlikely (picture->base.status)) { + if (stops != (xcb_render_fixed_t *) buf) + free (stops); + return picture; + } + picture->filter = CAIRO_FILTER_DEFAULT; + + colors = (xcb_render_color_t *) (stops + n_stops); + + p1.x = _cairo_fixed_16_16_from_double (extremes[0].center.x); + p1.y = _cairo_fixed_16_16_from_double (extremes[0].center.y); + p2.x = _cairo_fixed_16_16_from_double (extremes[1].center.x); + p2.y = _cairo_fixed_16_16_from_double (extremes[1].center.y); + + _cairo_xcb_connection_render_create_linear_gradient (target->connection, + picture->picture, + p1, p2, + n_stops, + stops, colors); + + if (stops != (xcb_render_fixed_t *) buf) + free (stops); + + status = _cairo_xcb_screen_store_linear_picture (target->screen, + pattern, + &picture->base); + if (unlikely (status)) { + cairo_surface_destroy (&picture->base); + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + } + +setup_picture: + _cairo_xcb_picture_set_matrix (picture, &matrix, + pattern->base.base.filter, + extents->x + extents->width/2., + extents->y + extents->height/2.); + _cairo_xcb_picture_set_filter (picture, pattern->base.base.filter); + _cairo_xcb_picture_set_extend (picture, pattern->base.base.extend); + _cairo_xcb_picture_set_component_alpha (picture, + pattern->base.base.has_component_alpha); + + return picture; +} + +static cairo_xcb_picture_t * +_cairo_xcb_radial_picture (cairo_xcb_surface_t *target, + const cairo_radial_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + char buf[CAIRO_STACK_BUFFER_SIZE]; + xcb_render_fixed_t *stops; + xcb_render_color_t *colors; + xcb_render_pointfix_t p1, p2; + xcb_render_fixed_t r1, r2; + cairo_matrix_t matrix; + cairo_circle_double_t extremes[2]; + cairo_xcb_picture_t *picture; + cairo_status_t status; + unsigned int n_stops; + + _cairo_gradient_pattern_fit_to_range (&pattern->base, PIXMAN_MAX_INT >> 1, &matrix, extremes); + + picture = (cairo_xcb_picture_t *) + _cairo_xcb_screen_lookup_radial_picture (target->screen, pattern); + if (picture != NULL) + goto setup_picture; + + stops = _gradient_to_xcb (&pattern->base, &n_stops, buf, sizeof (buf)); + if (unlikely (stops == NULL)) + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + picture = _cairo_xcb_picture_create (target->screen, + target->screen->connection->standard_formats[CAIRO_FORMAT_ARGB32], + PIXMAN_a8r8g8b8, + -1, -1); + if (unlikely (picture->base.status)) { + if (stops != (xcb_render_fixed_t *) buf) + free (stops); + return picture; + } + picture->filter = CAIRO_FILTER_DEFAULT; + + colors = (xcb_render_color_t *) (stops + n_stops); + + p1.x = _cairo_fixed_16_16_from_double (extremes[0].center.x); + p1.y = _cairo_fixed_16_16_from_double (extremes[0].center.y); + p2.x = _cairo_fixed_16_16_from_double (extremes[1].center.x); + p2.y = _cairo_fixed_16_16_from_double (extremes[1].center.y); + + r1 = _cairo_fixed_16_16_from_double (extremes[0].radius); + r2 = _cairo_fixed_16_16_from_double (extremes[1].radius); + + _cairo_xcb_connection_render_create_radial_gradient (target->connection, + picture->picture, + p1, p2, r1, r2, + n_stops, + stops, colors); + + if (stops != (xcb_render_fixed_t *) buf) + free (stops); + + status = _cairo_xcb_screen_store_radial_picture (target->screen, + pattern, + &picture->base); + if (unlikely (status)) { + cairo_surface_destroy (&picture->base); + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + } + +setup_picture: + _cairo_xcb_picture_set_matrix (picture, &matrix, + pattern->base.base.filter, + extents->x + extents->width/2., + extents->y + extents->height/2.); + _cairo_xcb_picture_set_filter (picture, pattern->base.base.filter); + _cairo_xcb_picture_set_extend (picture, pattern->base.base.extend); + _cairo_xcb_picture_set_component_alpha (picture, + pattern->base.base.has_component_alpha); + + return picture; +} + +static cairo_xcb_picture_t * +_copy_to_picture (cairo_xcb_surface_t *source) +{ + cairo_xcb_picture_t *picture; + uint32_t values[] = { 0, 1 }; + + if (source->deferred_clear) { + cairo_status_t status = _cairo_xcb_surface_clear (source); + if (unlikely (status)) + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + } + + picture = _cairo_xcb_picture_create (source->screen, + source->xrender_format, + source->pixman_format, + source->width, + source->height); + if (unlikely (picture->base.status)) + return picture; + + _cairo_xcb_connection_render_create_picture (source->connection, + picture->picture, + source->drawable, + source->xrender_format, + XCB_RENDER_CP_GRAPHICS_EXPOSURE | + XCB_RENDER_CP_SUBWINDOW_MODE, + values); + + return picture; +} + +static void +_cairo_xcb_surface_setup_surface_picture(cairo_xcb_picture_t *picture, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + cairo_filter_t filter; + + filter = pattern->base.filter; + if (filter != CAIRO_FILTER_NEAREST && + _cairo_matrix_is_pixel_exact (&pattern->base.matrix)) + { + filter = CAIRO_FILTER_NEAREST; + } + _cairo_xcb_picture_set_filter (picture, filter); + + _cairo_xcb_picture_set_matrix (picture, + &pattern->base.matrix, filter, + extents->x + extents->width/2., + extents->y + extents->height/2.); + + + _cairo_xcb_picture_set_extend (picture, pattern->base.extend); + _cairo_xcb_picture_set_component_alpha (picture, pattern->base.has_component_alpha); +} + +static cairo_xcb_picture_t * +record_to_picture (cairo_surface_t *target, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_pattern_t tmp_pattern; + cairo_xcb_picture_t *picture; + cairo_status_t status; + cairo_matrix_t matrix; + cairo_surface_t *tmp; + cairo_surface_t *source; + cairo_rectangle_int_t limit; + cairo_extend_t extend; + + /* XXX: The following was once more or less copied from cairo-xlibs-ource.c, + * record_source() and recording_pattern_get_surface(), can we share a + * single version? + */ + + /* First get the 'real' recording surface and figure out the size for tmp */ + source = _cairo_pattern_get_source (pattern, &limit); + assert (_cairo_surface_is_recording (source)); + + if (! _cairo_matrix_is_identity (&pattern->base.matrix)) { + double x1, y1, x2, y2; + + matrix = pattern->base.matrix; + status = cairo_matrix_invert (&matrix); + assert (status == CAIRO_STATUS_SUCCESS); + + x1 = limit.x; + y1 = limit.y; + x2 = limit.x + limit.width; + y2 = limit.y + limit.height; + + _cairo_matrix_transform_bounding_box (&matrix, + &x1, &y1, &x2, &y2, NULL); + + limit.x = floor (x1); + limit.y = floor (y1); + limit.width = ceil (x2) - limit.x; + limit.height = ceil (y2) - limit.y; + } + extend = pattern->base.extend; + if (_cairo_rectangle_contains_rectangle (&limit, extents)) + extend = CAIRO_EXTEND_NONE; + if (extend == CAIRO_EXTEND_NONE && ! _cairo_rectangle_intersect (&limit, extents)) + return _cairo_xcb_transparent_picture ((cairo_xcb_surface_t *) target); + + /* Now draw the recording surface to an xcb surface */ + tmp = _cairo_surface_create_scratch (target, + source->content, + limit.width, + limit.height, + CAIRO_COLOR_TRANSPARENT); + if (tmp->status != CAIRO_STATUS_SUCCESS) { + return (cairo_xcb_picture_t *) tmp; + } + + cairo_matrix_init_translate (&matrix, limit.x, limit.y); + cairo_matrix_multiply (&matrix, &matrix, &pattern->base.matrix); + + status = _cairo_recording_surface_replay_with_clip (source, + &matrix, tmp, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (tmp); + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + } + + /* Now that we have drawn this to an xcb surface, try again with that */ + _cairo_pattern_init_static_copy (&tmp_pattern.base, &pattern->base); + tmp_pattern.surface = tmp; + cairo_matrix_init_translate (&tmp_pattern.base.matrix, -limit.x, -limit.y); + + picture = _copy_to_picture ((cairo_xcb_surface_t *) tmp); + if (picture->base.status == CAIRO_STATUS_SUCCESS) + _cairo_xcb_surface_setup_surface_picture (picture, &tmp_pattern, extents); + cairo_surface_destroy (tmp); + return picture; +} + +static cairo_xcb_picture_t * +_cairo_xcb_surface_picture (cairo_xcb_surface_t *target, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *source = pattern->surface; + cairo_xcb_picture_t *picture; + + picture = (cairo_xcb_picture_t *) + _cairo_surface_has_snapshot (source, &_cairo_xcb_picture_backend); + if (picture != NULL) { + if (picture->screen == target->screen) { + picture = (cairo_xcb_picture_t *) cairo_surface_reference (&picture->base); + _cairo_xcb_surface_setup_surface_picture (picture, pattern, extents); + return picture; + } + picture = NULL; + } + + if (source->type == CAIRO_SURFACE_TYPE_XCB) + { + if (_cairo_surface_is_xcb(source)) { + cairo_xcb_surface_t *xcb = (cairo_xcb_surface_t *) source; + if (xcb->screen == target->screen && xcb->fallback == NULL) { + picture = _copy_to_picture ((cairo_xcb_surface_t *) source); + if (unlikely (picture->base.status)) + return picture; + } + } else if (source->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source; + cairo_xcb_surface_t *xcb = (cairo_xcb_surface_t *) sub->target; + + /* XXX repeat interval with source clipping? */ + if (FALSE && xcb->screen == target->screen && xcb->fallback == NULL) { + xcb_rectangle_t rect; + + picture = _copy_to_picture (xcb); + if (unlikely (picture->base.status)) + return picture; + + rect.x = sub->extents.x; + rect.y = sub->extents.y; + rect.width = sub->extents.width; + rect.height = sub->extents.height; + + _cairo_xcb_connection_render_set_picture_clip_rectangles (xcb->connection, + picture->picture, + 0, 0, + 1, &rect); + picture->x0 = rect.x; + picture->y0 = rect.y; + picture->width = rect.width; + picture->height = rect.height; + } + } else if (_cairo_surface_is_snapshot (source)) { + cairo_surface_snapshot_t *snap = (cairo_surface_snapshot_t *) source; + cairo_xcb_surface_t *xcb = (cairo_xcb_surface_t *) snap->target; + + if (xcb->screen == target->screen && xcb->fallback == NULL) { + picture = _copy_to_picture (xcb); + if (unlikely (picture->base.status)) + return picture; + } + } + } +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS + else if (source->type == CAIRO_SURFACE_TYPE_XLIB) + { + if (source->backend->type == CAIRO_SURFACE_TYPE_XLIB) { + cairo_xcb_surface_t *xcb = ((cairo_xlib_xcb_surface_t *) source)->xcb; + if (xcb->screen == target->screen && xcb->fallback == NULL) { + picture = _copy_to_picture (xcb); + if (unlikely (picture->base.status)) + return picture; + } + } else if (source->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) source; + cairo_xcb_surface_t *xcb = ((cairo_xlib_xcb_surface_t *) sub->target)->xcb; + + if (FALSE && xcb->screen == target->screen && xcb->fallback == NULL) { + xcb_rectangle_t rect; + + picture = _copy_to_picture (xcb); + if (unlikely (picture->base.status)) + return picture; + + rect.x = sub->extents.x; + rect.y = sub->extents.y; + rect.width = sub->extents.width; + rect.height = sub->extents.height; + + _cairo_xcb_connection_render_set_picture_clip_rectangles (xcb->connection, + picture->picture, + 0, 0, + 1, &rect); + picture->x0 = rect.x; + picture->y0 = rect.y; + picture->width = rect.width; + picture->height = rect.height; + } + } else if (_cairo_surface_is_snapshot (source)) { + cairo_surface_snapshot_t *snap = (cairo_surface_snapshot_t *) source; + cairo_xcb_surface_t *xcb = ((cairo_xlib_xcb_surface_t *) snap->target)->xcb; + + if (xcb->screen == target->screen && xcb->fallback == NULL) { + picture = _copy_to_picture (xcb); + if (unlikely (picture->base.status)) + return picture; + } + } + } +#endif +#if CAIRO_HAS_GL_FUNCTIONS + else if (source->type == CAIRO_SURFACE_TYPE_GL) + { + /* pixmap from texture */ + } +#endif + else if (source->type == CAIRO_SURFACE_TYPE_RECORDING) + { + /* We have to skip the call to attach_snapshot() because we possibly + * only drew part of the recording surface. + * TODO: When can we safely attach a snapshot? + */ + return record_to_picture(&target->base, pattern, extents); + } + + if (picture == NULL) { + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + + status = _cairo_surface_acquire_source_image (source, &image, &image_extra); + if (unlikely (status)) + return (cairo_xcb_picture_t *) _cairo_surface_create_in_error (status); + + if (image->format != CAIRO_FORMAT_INVALID) { + xcb_render_pictformat_t format; + + format = target->screen->connection->standard_formats[image->format]; + + picture = _picture_from_image (target, format, image, NULL); + _cairo_surface_release_source_image (source, image, image_extra); + } else { + cairo_image_surface_t *conv; + xcb_render_pictformat_t render_format; + + /* XXX XRenderPutImage! */ + + conv = _cairo_image_surface_coerce (image); + _cairo_surface_release_source_image (source, image, image_extra); + if (unlikely (conv->base.status)) + return (cairo_xcb_picture_t *) conv; + + render_format = target->screen->connection->standard_formats[conv->format]; + picture = _picture_from_image (target, render_format, conv, NULL); + cairo_surface_destroy (&conv->base); + } + + if (unlikely (picture->base.status)) + return picture; + } + + _cairo_surface_attach_snapshot (source, + &picture->base, + NULL); + + _cairo_xcb_surface_setup_surface_picture (picture, pattern, extents); + return picture; +} + +static cairo_xcb_picture_t * +_cairo_xcb_picture_for_pattern (cairo_xcb_surface_t *target, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + if (pattern == NULL) + return _cairo_xcb_white_picture (target); + + if (! _pattern_is_supported (target->connection->flags, pattern)) + return _render_to_picture (target, pattern, extents); + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_xcb_solid_picture (target, (cairo_solid_pattern_t *) pattern); + + case CAIRO_PATTERN_TYPE_LINEAR: + return _cairo_xcb_linear_picture (target, + (cairo_linear_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_RADIAL: + return _cairo_xcb_radial_picture (target, + (cairo_radial_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_SURFACE: + return _cairo_xcb_surface_picture (target, + (cairo_surface_pattern_t *) pattern, + extents); + default: + ASSERT_NOT_REACHED; + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return _render_to_picture (target, pattern, extents); + } +} + +COMPILE_TIME_ASSERT (sizeof (xcb_rectangle_t) <= sizeof (cairo_box_t)); + +static cairo_status_t +_render_fill_boxes (void *abstract_dst, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + cairo_xcb_surface_t *dst = abstract_dst; + xcb_rectangle_t stack_xrects[CAIRO_STACK_ARRAY_LENGTH (xcb_rectangle_t)]; + xcb_rectangle_t *xrects = stack_xrects; + xcb_render_color_t render_color; + int render_op = _render_operator (op); + struct _cairo_boxes_chunk *chunk; + int max_count; + + render_color.red = color->red_short; + render_color.green = color->green_short; + render_color.blue = color->blue_short; + render_color.alpha = color->alpha_short; + + max_count = 0; + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + if (chunk->count > max_count) + max_count = chunk->count; + } + if (max_count > ARRAY_LENGTH (stack_xrects)) { + xrects = _cairo_malloc_ab (max_count, sizeof (xcb_rectangle_t)); + if (unlikely (xrects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + int i, j; + + for (i = j = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round_down (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_round_down (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_round_down (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_round_down (chunk->base[i].p2.y); + + if (x2 > x1 && y2 > y1) { + xrects[j].x = x1; + xrects[j].y = y1; + xrects[j].width = x2 - x1; + xrects[j].height = y2 - y1; + j++; + } + } + + if (j) { + _cairo_xcb_connection_render_fill_rectangles + (dst->connection, + render_op, dst->picture, + render_color, j, xrects); + } + } + + if (xrects != stack_xrects) + free (xrects); + + return CAIRO_STATUS_SUCCESS; +} + +/* pixel aligned, non-overlapping boxes */ +static cairo_int_status_t +_render_composite_boxes (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + const cairo_pattern_t *mask_pattern, + const cairo_rectangle_int_t *extents, + const cairo_boxes_t *boxes) +{ + cairo_xcb_picture_t *src, *mask; + const struct _cairo_boxes_chunk *chunk; + xcb_rectangle_t stack_boxes[CAIRO_STACK_ARRAY_LENGTH (xcb_rectangle_t)]; + xcb_rectangle_t *clip_boxes; + cairo_rectangle_int_t stack_extents; + cairo_status_t status; + int num_boxes; + int render_op; + + render_op = _render_operator (op); + + if (src_pattern == NULL) { + src_pattern = mask_pattern; + mask_pattern = NULL; + } + + /* amalgamate into a single Composite call by setting a clip region */ + clip_boxes = stack_boxes; + if (boxes->num_boxes > ARRAY_LENGTH (stack_boxes)) { + clip_boxes = _cairo_malloc_ab (boxes->num_boxes, sizeof (xcb_rectangle_t)); + if (unlikely (clip_boxes == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + src = _cairo_xcb_picture_for_pattern (dst, src_pattern, extents); + status = src->base.status; + if (unlikely (status)) + goto cleanup_boxes; + + num_boxes = 0; + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + int i; + + for (i = 0; i < chunk->count; i++) { + int x = _cairo_fixed_integer_round_down (box[i].p1.x); + int y = _cairo_fixed_integer_round_down (box[i].p1.y); + int width = _cairo_fixed_integer_round_down (box[i].p2.x) - x; + int height = _cairo_fixed_integer_round_down (box[i].p2.y) - y; + + if (width && height) { + clip_boxes[num_boxes].x = x; + clip_boxes[num_boxes].y = y; + clip_boxes[num_boxes].width = width; + clip_boxes[num_boxes].height = height; + num_boxes++; + } + } + } + + if (num_boxes) { + if (num_boxes > 1) { + _cairo_xcb_connection_render_set_picture_clip_rectangles (dst->connection, + dst->picture, + 0, 0, + num_boxes, + clip_boxes); + } else { + stack_extents.x = clip_boxes[0].x; + stack_extents.y = clip_boxes[0].y; + stack_extents.width = clip_boxes[0].width; + stack_extents.height = clip_boxes[0].height; + extents = &stack_extents; + } + + if (mask_pattern != NULL) { + mask = _cairo_xcb_picture_for_pattern (dst, mask_pattern, extents); + status = mask->base.status; + if (unlikely (status)) + goto cleanup_clip; + + _cairo_xcb_connection_render_composite (dst->connection, + render_op, + src->picture, + mask->picture, + dst->picture, + src->x + extents->x, src->y + extents->y, + mask->x + extents->x, mask->y + extents->y, + extents->x, extents->y, + extents->width, extents->height); + + cairo_surface_destroy (&mask->base); + } else { + _cairo_xcb_connection_render_composite (dst->connection, + render_op, + src->picture, + XCB_NONE, + dst->picture, + src->x + extents->x, src->y + extents->y, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + } + +cleanup_clip: + + if (num_boxes > 1) + _cairo_xcb_surface_clear_clip_region (dst); + } + + cairo_surface_destroy (&src->base); + +cleanup_boxes: + + if (clip_boxes != stack_boxes) + free (clip_boxes); + + return status; +} + + +#define CAIRO_FIXED_16_16_MIN _cairo_fixed_from_int (-32768) +#define CAIRO_FIXED_16_16_MAX _cairo_fixed_from_int (32767) + +static cairo_bool_t +_line_exceeds_16_16 (const cairo_line_t *line) +{ + return + line->p1.x <= CAIRO_FIXED_16_16_MIN || + line->p1.x >= CAIRO_FIXED_16_16_MAX || + + line->p2.x <= CAIRO_FIXED_16_16_MIN || + line->p2.x >= CAIRO_FIXED_16_16_MAX || + + line->p1.y <= CAIRO_FIXED_16_16_MIN || + line->p1.y >= CAIRO_FIXED_16_16_MAX || + + line->p2.y <= CAIRO_FIXED_16_16_MIN || + line->p2.y >= CAIRO_FIXED_16_16_MAX; +} + +static void +_project_line_x_onto_16_16 (const cairo_line_t *line, + cairo_fixed_t top, + cairo_fixed_t bottom, + xcb_render_linefix_t *out) +{ + cairo_point_double_t p1, p2; + double m; + + p1.x = _cairo_fixed_to_double (line->p1.x); + p1.y = _cairo_fixed_to_double (line->p1.y); + + p2.x = _cairo_fixed_to_double (line->p2.x); + p2.y = _cairo_fixed_to_double (line->p2.y); + + m = (p2.x - p1.x) / (p2.y - p1.y); + out->p1.x = _cairo_fixed_16_16_from_double (p1.x + m * _cairo_fixed_to_double (top - line->p1.y)); + out->p2.x = _cairo_fixed_16_16_from_double (p1.x + m * _cairo_fixed_to_double (bottom - line->p1.y)); +} + +typedef struct { + cairo_traps_t traps; + cairo_antialias_t antialias; +} composite_traps_info_t; + +COMPILE_TIME_ASSERT (sizeof (xcb_render_trapezoid_t) <= sizeof (cairo_trapezoid_t)); + +static cairo_int_status_t +_composite_traps (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + composite_traps_info_t *info = closure; + const cairo_traps_t *traps = &info->traps; + cairo_xcb_picture_t *src; + cairo_format_t format; + xcb_render_pictformat_t xrender_format; + xcb_render_trapezoid_t *xtraps; + int render_reference_x, render_reference_y; + cairo_status_t status; + int i; + + if (dst->deferred_clear) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) + return status; + } + + src = _cairo_xcb_picture_for_pattern (dst, pattern, extents); + if (unlikely (src->base.status)) + return src->base.status; + + if (info->antialias == CAIRO_ANTIALIAS_NONE) + format = CAIRO_FORMAT_A1; + else + format = CAIRO_FORMAT_A8; + xrender_format = dst->screen->connection->standard_formats[format]; + + xtraps = (xcb_render_trapezoid_t *) traps->traps; + for (i = 0; i < traps->num_traps; i++) { + cairo_trapezoid_t t = traps->traps[i]; + + /* top/bottom will be clamped to surface bounds */ + xtraps[i].top = _cairo_fixed_to_16_16 (t.top); + xtraps[i].top -= dst_y << 16; + xtraps[i].bottom = _cairo_fixed_to_16_16 (t.bottom); + xtraps[i].bottom -= dst_y << 16; + + /* However, all the other coordinates will have been left untouched so + * as not to introduce numerical error. Recompute them if they + * exceed the 16.16 limits. + */ + if (unlikely (_line_exceeds_16_16 (&t.left))) { + _project_line_x_onto_16_16 (&t.left, + t.top, + t.bottom, + &xtraps[i].left); + xtraps[i].left.p1.y = xtraps[i].top; + xtraps[i].left.p2.y = xtraps[i].bottom; + } else { + xtraps[i].left.p1.x = _cairo_fixed_to_16_16 (t.left.p1.x); + xtraps[i].left.p1.y = _cairo_fixed_to_16_16 (t.left.p1.y); + xtraps[i].left.p2.x = _cairo_fixed_to_16_16 (t.left.p2.x); + xtraps[i].left.p2.y = _cairo_fixed_to_16_16 (t.left.p2.y); + } + xtraps[i].left.p1.x -= dst_x << 16; + xtraps[i].left.p1.y -= dst_y << 16; + xtraps[i].left.p2.x -= dst_x << 16; + xtraps[i].left.p2.y -= dst_y << 16; + + if (unlikely (_line_exceeds_16_16 (&t.right))) { + _project_line_x_onto_16_16 (&t.right, + t.top, + t.bottom, + &xtraps[i].right); + xtraps[i].right.p1.y = xtraps[i].top; + xtraps[i].right.p2.y = xtraps[i].bottom; + } else { + xtraps[i].right.p1.x = _cairo_fixed_to_16_16 (t.right.p1.x); + xtraps[i].right.p1.y = _cairo_fixed_to_16_16 (t.right.p1.y); + xtraps[i].right.p2.x = _cairo_fixed_to_16_16 (t.right.p2.x); + xtraps[i].right.p2.y = _cairo_fixed_to_16_16 (t.right.p2.y); + } + xtraps[i].right.p1.x -= dst_x << 16; + xtraps[i].right.p1.y -= dst_y << 16; + xtraps[i].right.p2.x -= dst_x << 16; + xtraps[i].right.p2.y -= dst_y << 16; + } + + if (xtraps[0].left.p1.y < xtraps[0].left.p2.y) { + render_reference_x = xtraps[0].left.p1.x >> 16; + render_reference_y = xtraps[0].left.p1.y >> 16; + } else { + render_reference_x = xtraps[0].left.p2.x >> 16; + render_reference_y = xtraps[0].left.p2.y >> 16; + } + render_reference_x += src->x + dst_x; + render_reference_y += src->y + dst_y; + + _cairo_xcb_surface_set_precision (dst, info->antialias); + _cairo_xcb_connection_render_trapezoids (dst->connection, + _render_operator (op), + src->picture, + dst->picture, + xrender_format, + render_reference_x, + render_reference_y, + traps->num_traps, xtraps); + + cairo_surface_destroy (&src->base); + + return CAIRO_STATUS_SUCCESS; +} + +/* low-level composite driver */ + +static cairo_xcb_surface_t * +get_clip_surface (const cairo_clip_t *clip, + cairo_xcb_surface_t *target, + int *tx, int *ty) +{ + cairo_surface_t *surface; + cairo_status_t status; + + surface = _cairo_surface_create_scratch (&target->base, + CAIRO_CONTENT_ALPHA, + clip->extents.width, + clip->extents.height, + CAIRO_COLOR_WHITE); + if (unlikely (surface->status)) + return (cairo_xcb_surface_t *) surface; + + assert (surface->backend == &_cairo_xcb_surface_backend); + status = _cairo_clip_combine_with_surface (clip, surface, + clip->extents.x, clip->extents.y); + if (unlikely (status)) { + cairo_surface_destroy (surface); + surface = _cairo_surface_create_in_error (status); + } + + *tx = clip->extents.x; + *ty = clip->extents.y; + + return (cairo_xcb_surface_t *) surface; +} + +typedef cairo_int_status_t +(*xcb_draw_func_t) (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip); + +static void do_unaligned_row(void (*blt)(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage), + void *closure, + const cairo_box_t *b, + int tx, int y, int h, + uint16_t coverage) +{ + int x1 = _cairo_fixed_integer_part (b->p1.x) - tx; + int x2 = _cairo_fixed_integer_part (b->p2.x) - tx; + if (x2 > x1) { + if (! _cairo_fixed_is_integer (b->p1.x)) { + blt(closure, x1, y, 1, h, + coverage * (256 - _cairo_fixed_fractional_part (b->p1.x))); + x1++; + } + + if (x2 > x1) + blt(closure, x1, y, x2-x1, h, (coverage << 8) - (coverage >> 8)); + + if (! _cairo_fixed_is_integer (b->p2.x)) + blt(closure, x2, y, 1, h, + coverage * _cairo_fixed_fractional_part (b->p2.x)); + } else + blt(closure, x1, y, 1, h, + coverage * (b->p2.x - b->p1.x)); +} + +static void do_unaligned_box(void (*blt)(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage), + void *closure, + const cairo_box_t *b, int tx, int ty) +{ + int y1 = _cairo_fixed_integer_part (b->p1.y) - ty; + int y2 = _cairo_fixed_integer_part (b->p2.y) - ty; + if (y2 > y1) { + if (! _cairo_fixed_is_integer (b->p1.y)) { + do_unaligned_row(blt, closure, b, tx, y1, 1, + 256 - _cairo_fixed_fractional_part (b->p1.y)); + y1++; + } + + if (y2 > y1) + do_unaligned_row(blt, closure, b, tx, y1, y2-y1, 256); + + if (! _cairo_fixed_is_integer (b->p2.y)) + do_unaligned_row(blt, closure, b, tx, y2, 1, + _cairo_fixed_fractional_part (b->p2.y)); + } else + do_unaligned_row(blt, closure, b, tx, y1, 1, + b->p2.y - b->p1.y); +} + + +static void blt_in(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + cairo_xcb_surface_t *mask = closure; + xcb_render_color_t color; + xcb_rectangle_t rect; + + if (coverage == 0xffff) + return; + + color.red = color.green = color.blue = 0; + color.alpha = coverage; + + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + + _cairo_xcb_connection_render_fill_rectangles (mask->connection, + XCB_RENDER_PICT_OP_IN, + mask->picture, + color, 1, &rect); +} + +static cairo_xcb_surface_t * +_create_composite_mask (cairo_clip_t *clip, + xcb_draw_func_t draw_func, + xcb_draw_func_t mask_func, + void *draw_closure, + cairo_xcb_surface_t *dst, + const cairo_rectangle_int_t*extents) +{ + cairo_xcb_surface_t *surface; + cairo_bool_t need_clip_combine; + cairo_int_status_t status; + + surface = (cairo_xcb_surface_t *) + _cairo_xcb_surface_create_similar (dst, CAIRO_CONTENT_ALPHA, + extents->width, extents->height); + if (unlikely (surface->base.status)) + return surface; + + _cairo_xcb_surface_ensure_picture (surface); + + surface->deferred_clear_color = *CAIRO_COLOR_TRANSPARENT; + surface->deferred_clear = TRUE; + surface->base.is_clear = TRUE; + + if (mask_func) { + status = mask_func (draw_closure, surface, + CAIRO_OPERATOR_ADD, NULL, + extents->x, extents->y, + extents, clip); + if (likely (status != CAIRO_INT_STATUS_UNSUPPORTED)) + return surface; + } + + /* Is it worth setting the clip region here? */ + status = draw_func (draw_closure, surface, + CAIRO_OPERATOR_ADD, NULL, + extents->x, extents->y, + extents, NULL); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return (cairo_xcb_surface_t *) _cairo_surface_create_in_error (status); + } + + if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES) { + int i; + + for (i = 0; i < clip->num_boxes; i++) { + cairo_box_t *b = &clip->boxes[i]; + + if (! _cairo_fixed_is_integer (b->p1.x) || + ! _cairo_fixed_is_integer (b->p1.y) || + ! _cairo_fixed_is_integer (b->p2.x) || + ! _cairo_fixed_is_integer (b->p2.y)) + { + do_unaligned_box(blt_in, surface, b, extents->x, extents->y); + } + } + + need_clip_combine = clip->path != NULL; + } else + need_clip_combine = ! _cairo_clip_is_region (clip); + + if (need_clip_combine) { + status = _cairo_clip_combine_with_surface (clip, &surface->base, + extents->x, extents->y); + if (unlikely (status)) { + cairo_surface_destroy (&surface->base); + return (cairo_xcb_surface_t *) _cairo_surface_create_in_error (status); + } + } + + return surface; +} + +/* Handles compositing with a clip surface when the operator allows + * us to combine the clip with the mask + */ +static cairo_status_t +_clip_and_composite_with_mask (cairo_clip_t *clip, + cairo_operator_t op, + const cairo_pattern_t *pattern, + xcb_draw_func_t draw_func, + xcb_draw_func_t mask_func, + void *draw_closure, + cairo_xcb_surface_t *dst, + const cairo_rectangle_int_t*extents) +{ + cairo_xcb_surface_t *mask; + cairo_xcb_picture_t *src; + + mask = _create_composite_mask (clip, + draw_func, mask_func, draw_closure, + dst, extents); + if (unlikely (mask->base.status)) + return mask->base.status; + + if (pattern != NULL || dst->base.content != CAIRO_CONTENT_ALPHA) { + src = _cairo_xcb_picture_for_pattern (dst, pattern, extents); + if (unlikely (src->base.status)) { + cairo_surface_destroy (&mask->base); + return src->base.status; + } + + _cairo_xcb_connection_render_composite (dst->connection, + _render_operator (op), + src->picture, + mask->picture, + dst->picture, + extents->x + src->x, extents->y + src->y, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + + cairo_surface_destroy (&src->base); + } else { + _cairo_xcb_connection_render_composite (dst->connection, + _render_operator (op), + mask->picture, + XCB_NONE, + dst->picture, + 0, 0, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + } + cairo_surface_destroy (&mask->base); + + return CAIRO_STATUS_SUCCESS; +} + +/* Handles compositing with a clip surface when we have to do the operation + * in two pieces and combine them together. + */ +static cairo_status_t +_clip_and_composite_combine (cairo_clip_t *clip, + cairo_operator_t op, + const cairo_pattern_t *pattern, + xcb_draw_func_t draw_func, + void *draw_closure, + cairo_xcb_surface_t *dst, + const cairo_rectangle_int_t*extents) +{ + cairo_xcb_surface_t *tmp; + cairo_xcb_surface_t *clip_surface; + int clip_x = 0, clip_y = 0; + xcb_render_picture_t clip_picture; + cairo_status_t status; + + tmp = (cairo_xcb_surface_t *) + _cairo_xcb_surface_create_similar (dst, dst->base.content, + extents->width, extents->height); + if (unlikely (tmp->base.status)) + return tmp->base.status; + + /* create_similar() could have done a fallback to an image surface */ + assert (tmp->base.backend == &_cairo_xcb_surface_backend); + + _cairo_xcb_surface_ensure_picture (tmp); + + if (pattern == NULL) { + status = (*draw_func) (draw_closure, tmp, + CAIRO_OPERATOR_ADD, NULL, + extents->x, extents->y, + extents, NULL); + } else { + /* Initialize the temporary surface from the destination surface */ + if (! dst->base.is_clear || + (dst->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES) == 0) + { + /* XCopyArea may actually be quicker here. + * A good driver should translate if appropriate. + */ + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_SRC, + dst->picture, + XCB_NONE, + tmp->picture, + extents->x, extents->y, + 0, 0, + 0, 0, + extents->width, extents->height); + } + else + { + xcb_render_color_t clear; + xcb_rectangle_t xrect; + + clear.red = clear.green = clear.blue = clear.alpha = 0; + + xrect.x = xrect.y = 0; + xrect.width = extents->width; + xrect.height = extents->height; + + _cairo_xcb_connection_render_fill_rectangles (dst->connection, + XCB_RENDER_PICT_OP_CLEAR, + dst->picture, + clear, 1, &xrect); + } + + status = (*draw_func) (draw_closure, tmp, op, pattern, + extents->x, extents->y, + extents, NULL); + } + if (unlikely (status)) + goto CLEANUP_SURFACE; + + clip_surface = get_clip_surface (clip, dst, &clip_x, &clip_y); + status = clip_surface->base.status; + if (unlikely (status)) + goto CLEANUP_SURFACE; + + assert (clip_surface->base.backend == &_cairo_xcb_surface_backend); + clip_picture = clip_surface->picture; + assert (clip_picture != XCB_NONE); + + if (dst->base.is_clear) { + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_SRC, + tmp->picture, clip_picture, dst->picture, + 0, 0, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + } else { + /* Punch the clip out of the destination */ + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_OUT_REVERSE, + clip_picture, XCB_NONE, dst->picture, + extents->x - clip_x, + extents->y - clip_y, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + + /* Now add the two results together */ + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_ADD, + tmp->picture, clip_picture, dst->picture, + 0, 0, + extents->x - clip_x, + extents->y - clip_y, + extents->x, extents->y, + extents->width, extents->height); + } + cairo_surface_destroy (&clip_surface->base); + + CLEANUP_SURFACE: + cairo_surface_destroy (&tmp->base); + + return status; +} + +/* Handles compositing for %CAIRO_OPERATOR_SOURCE, which is special; it's + * defined as (src IN mask IN clip) ADD (dst OUT (mask IN clip)) + */ +static cairo_status_t +_clip_and_composite_source (cairo_clip_t *clip, + const cairo_pattern_t *pattern, + xcb_draw_func_t draw_func, + xcb_draw_func_t mask_func, + void *draw_closure, + cairo_xcb_surface_t *dst, + const cairo_rectangle_int_t *extents) +{ + cairo_xcb_surface_t *mask; + cairo_xcb_picture_t *src; + + /* Create a surface that is mask IN clip */ + mask = _create_composite_mask (clip, + draw_func, mask_func, draw_closure, + dst, extents); + if (unlikely (mask->base.status)) + return mask->base.status; + + src = _cairo_xcb_picture_for_pattern (dst, pattern, extents); + if (unlikely (src->base.status)) { + cairo_surface_destroy (&mask->base); + return src->base.status; + } + + if (dst->base.is_clear) { + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_SRC, + src->picture, + mask->picture, + dst->picture, + extents->x + src->x, extents->y + src->y, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + } else { + /* Compute dest' = dest OUT (mask IN clip) */ + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_OUT_REVERSE, + mask->picture, + XCB_NONE, + dst->picture, + 0, 0, 0, 0, + extents->x, extents->y, + extents->width, extents->height); + + /* Now compute (src IN (mask IN clip)) ADD dest' */ + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_ADD, + src->picture, + mask->picture, + dst->picture, + extents->x + src->x, extents->y + src->y, + 0, 0, + extents->x, extents->y, + extents->width, extents->height); + } + + cairo_surface_destroy (&src->base); + cairo_surface_destroy (&mask->base); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +can_reduce_alpha_op (cairo_operator_t op) +{ + int iop = op; + switch (iop) { + case CAIRO_OPERATOR_OVER: + case CAIRO_OPERATOR_SOURCE: + case CAIRO_OPERATOR_ADD: + return TRUE; + default: + return FALSE; + } +} + +static cairo_bool_t +reduce_alpha_op (cairo_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern) +{ + return dst->is_clear && + dst->content == CAIRO_CONTENT_ALPHA && + _cairo_pattern_is_opaque_solid (pattern) && + can_reduce_alpha_op (op); +} + +static cairo_status_t +_cairo_xcb_surface_fixup_unbounded (cairo_xcb_surface_t *dst, + const cairo_composite_rectangles_t *rects) +{ + xcb_rectangle_t xrects[4]; + int n; + + if (rects->bounded.width == rects->unbounded.width && + rects->bounded.height == rects->unbounded.height) + { + return CAIRO_STATUS_SUCCESS; + } + + n = 0; + if (rects->bounded.width == 0 || rects->bounded.height == 0) { + xrects[n].x = rects->unbounded.x; + xrects[n].width = rects->unbounded.width; + xrects[n].y = rects->unbounded.y; + xrects[n].height = rects->unbounded.height; + n++; + } else { + /* top */ + if (rects->bounded.y != rects->unbounded.y) { + xrects[n].x = rects->unbounded.x; + xrects[n].width = rects->unbounded.width; + xrects[n].y = rects->unbounded.y; + xrects[n].height = rects->bounded.y - rects->unbounded.y; + n++; + } + /* left */ + if (rects->bounded.x != rects->unbounded.x) { + xrects[n].x = rects->unbounded.x; + xrects[n].width = rects->bounded.x - rects->unbounded.x; + xrects[n].y = rects->bounded.y; + xrects[n].height = rects->bounded.height; + n++; + } + /* right */ + if (rects->bounded.x + rects->bounded.width != rects->unbounded.x + rects->unbounded.width) { + xrects[n].x = rects->bounded.x + rects->bounded.width; + xrects[n].width = rects->unbounded.x + rects->unbounded.width - xrects[n].x; + xrects[n].y = rects->bounded.y; + xrects[n].height = rects->bounded.height; + n++; + } + /* bottom */ + if (rects->bounded.y + rects->bounded.height != rects->unbounded.y + rects->unbounded.height) { + xrects[n].x = rects->unbounded.x; + xrects[n].width = rects->unbounded.width; + xrects[n].y = rects->bounded.y + rects->bounded.height; + xrects[n].height = rects->unbounded.y + rects->unbounded.height - xrects[n].y; + n++; + } + } + + if (dst->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES) { + xcb_render_color_t color; + + color.red = 0; + color.green = 0; + color.blue = 0; + color.alpha = 0; + + _cairo_xcb_connection_render_fill_rectangles (dst->connection, + XCB_RENDER_PICT_OP_CLEAR, + dst->picture, + color, n, xrects); + } else { + int i; + cairo_xcb_picture_t *src; + + src = _cairo_xcb_transparent_picture (dst); + if (unlikely (src->base.status)) + return src->base.status; + + for (i = 0; i < n; i++) { + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_CLEAR, + src->picture, XCB_NONE, dst->picture, + 0, 0, + 0, 0, + xrects[i].x, xrects[i].y, + xrects[i].width, xrects[i].height); + } + cairo_surface_destroy (&src->base); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xcb_surface_fixup_unbounded_with_mask (cairo_xcb_surface_t *dst, + const cairo_composite_rectangles_t *rects, + cairo_clip_t *clip) +{ + cairo_xcb_surface_t *mask; + int mask_x = 0, mask_y = 0; + + mask = get_clip_surface (clip, dst, &mask_x, &mask_y); + if (unlikely (mask->base.status)) + return mask->base.status; + + /* top */ + if (rects->bounded.y != rects->unbounded.y) { + int x = rects->unbounded.x; + int y = rects->unbounded.y; + int width = rects->unbounded.width; + int height = rects->bounded.y - y; + + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_OUT_REVERSE, + mask->picture, XCB_NONE, dst->picture, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + /* left */ + if (rects->bounded.x != rects->unbounded.x) { + int x = rects->unbounded.x; + int y = rects->bounded.y; + int width = rects->bounded.x - x; + int height = rects->bounded.height; + + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_OUT_REVERSE, + mask->picture, XCB_NONE, dst->picture, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + /* right */ + if (rects->bounded.x + rects->bounded.width != rects->unbounded.x + rects->unbounded.width) { + int x = rects->bounded.x + rects->bounded.width; + int y = rects->bounded.y; + int width = rects->unbounded.x + rects->unbounded.width - x; + int height = rects->bounded.height; + + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_OUT_REVERSE, + mask->picture, XCB_NONE, dst->picture, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + /* bottom */ + if (rects->bounded.y + rects->bounded.height != rects->unbounded.y + rects->unbounded.height) { + int x = rects->unbounded.x; + int y = rects->bounded.y + rects->bounded.height; + int width = rects->unbounded.width; + int height = rects->unbounded.y + rects->unbounded.height - y; + + _cairo_xcb_connection_render_composite (dst->connection, + XCB_RENDER_PICT_OP_OUT_REVERSE, + mask->picture, XCB_NONE, dst->picture, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + cairo_surface_destroy (&mask->base); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xcb_surface_fixup_unbounded_boxes (cairo_xcb_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip, + cairo_boxes_t *boxes) +{ + cairo_boxes_t clear; + cairo_box_t box; + cairo_status_t status; + struct _cairo_boxes_chunk *chunk; + int i; + + if (boxes->num_boxes <= 1 && clip == NULL) + return _cairo_xcb_surface_fixup_unbounded (dst, extents); + + _cairo_boxes_init (&clear); + + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); + + if (clip == NULL) { + cairo_boxes_t tmp; + + _cairo_boxes_init (&tmp); + + status = _cairo_boxes_add (&tmp, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + tmp.chunks.next = &boxes->chunks; + tmp.num_boxes += boxes->num_boxes; + + status = _cairo_bentley_ottmann_tessellate_boxes (&tmp, + CAIRO_FILL_RULE_WINDING, + &clear); + + tmp.chunks.next = NULL; + } else { + _cairo_boxes_init_with_clip (&clear, clip); + + status = _cairo_boxes_add (&clear, CAIRO_ANTIALIAS_DEFAULT, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + status = _cairo_boxes_add (&clear, + CAIRO_ANTIALIAS_DEFAULT, + &chunk->base[i]); + if (unlikely (status)) { + _cairo_boxes_fini (&clear); + return status; + } + } + } + + status = _cairo_bentley_ottmann_tessellate_boxes (&clear, + CAIRO_FILL_RULE_WINDING, + &clear); + } + + if (likely (status == CAIRO_STATUS_SUCCESS)) { + if (dst->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES) + status = _render_fill_boxes (dst, + CAIRO_OPERATOR_CLEAR, + CAIRO_COLOR_TRANSPARENT, + &clear); + else + status = _cairo_xcb_surface_core_fill_boxes (dst, + CAIRO_COLOR_TRANSPARENT, + &clear); + } + + _cairo_boxes_fini (&clear); + + return status; +} + +cairo_status_t +_cairo_xcb_surface_clear (cairo_xcb_surface_t *dst) +{ + xcb_gcontext_t gc; + xcb_rectangle_t rect; + cairo_status_t status; + + status = _cairo_xcb_connection_acquire (dst->connection); + if (unlikely (status)) + return status; + + rect.x = rect.y = 0; + rect.width = dst->width; + rect.height = dst->height; + + if (dst->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES) { + xcb_render_color_t color; + uint8_t op; + + color.red = dst->deferred_clear_color.red_short; + color.green = dst->deferred_clear_color.green_short; + color.blue = dst->deferred_clear_color.blue_short; + color.alpha = dst->deferred_clear_color.alpha_short; + + if (color.alpha == 0) + op = XCB_RENDER_PICT_OP_CLEAR; + else + op = XCB_RENDER_PICT_OP_SRC; + + _cairo_xcb_surface_ensure_picture (dst); + _cairo_xcb_connection_render_fill_rectangles (dst->connection, + op, dst->picture, color, + 1, &rect); + } else { + gc = _cairo_xcb_screen_get_gc (dst->screen, dst->drawable, dst->depth); + + /* XXX color */ + _cairo_xcb_connection_poly_fill_rectangle (dst->connection, + dst->drawable, gc, + 1, &rect); + + _cairo_xcb_screen_put_gc (dst->screen, dst->depth, gc); + } + + _cairo_xcb_connection_release (dst->connection); + + dst->deferred_clear = FALSE; + return CAIRO_STATUS_SUCCESS; +} + +enum { + NEED_CLIP_REGION = 0x1, + NEED_CLIP_SURFACE = 0x2, + FORCE_CLIP_REGION = 0x4, +}; + +static cairo_bool_t +need_bounded_clip (cairo_composite_rectangles_t *extents) +{ + unsigned int flags = NEED_CLIP_REGION; + if (! _cairo_clip_is_region (extents->clip)) + flags |= NEED_CLIP_SURFACE; + return flags; +} + +static cairo_bool_t +need_unbounded_clip (cairo_composite_rectangles_t *extents) +{ + unsigned int flags = 0; + if (! extents->is_bounded) { + flags |= NEED_CLIP_REGION; + if (! _cairo_clip_is_region (extents->clip)) + flags |= NEED_CLIP_SURFACE; + } + if (extents->clip->path != NULL) + flags |= NEED_CLIP_SURFACE; + return flags; +} + +static cairo_status_t +_clip_and_composite (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + xcb_draw_func_t draw_func, + xcb_draw_func_t mask_func, + void *draw_closure, + cairo_composite_rectangles_t*extents, + unsigned int need_clip) +{ + cairo_region_t *clip_region = NULL; + cairo_status_t status; + + status = _cairo_xcb_connection_acquire (dst->connection); + if (unlikely (status)) + return status; + + if (dst->deferred_clear) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) { + _cairo_xcb_connection_release (dst->connection); + return status; + } + } + + _cairo_xcb_surface_ensure_picture (dst); + + if (need_clip & NEED_CLIP_REGION) { + clip_region = _cairo_clip_get_region (extents->clip); + if ((need_clip & FORCE_CLIP_REGION) == 0 && clip_region != NULL && + cairo_region_contains_rectangle (clip_region, + &extents->unbounded) == CAIRO_REGION_OVERLAP_IN) + clip_region = NULL; + if (clip_region != NULL) { + status = _cairo_xcb_surface_set_clip_region (dst, clip_region); + if (unlikely (status)) { + _cairo_xcb_connection_release (dst->connection); + return status; + } + } + } + + if (reduce_alpha_op (&dst->base, op, src)) { + op = CAIRO_OPERATOR_ADD; + src = NULL; + } + + if (extents->bounded.width != 0 && extents->bounded.height != 0) { + if (op == CAIRO_OPERATOR_SOURCE) { + status = _clip_and_composite_source (extents->clip, src, + draw_func, mask_func, draw_closure, + dst, &extents->bounded); + } else { + if (op == CAIRO_OPERATOR_CLEAR) { + op = CAIRO_OPERATOR_DEST_OUT; + src = NULL; + } + + if (need_clip & NEED_CLIP_SURFACE) { + if (extents->is_bounded) { + status = _clip_and_composite_with_mask (extents->clip, op, src, + draw_func, + mask_func, + draw_closure, + dst, &extents->bounded); + } else { + status = _clip_and_composite_combine (extents->clip, op, src, + draw_func, draw_closure, + dst, &extents->bounded); + } + } else { + status = draw_func (draw_closure, + dst, op, src, + 0, 0, + &extents->bounded, + extents->clip); + } + } + } + + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) { + if (need_clip & NEED_CLIP_SURFACE) + status = _cairo_xcb_surface_fixup_unbounded_with_mask (dst, extents, extents->clip); + else + status = _cairo_xcb_surface_fixup_unbounded (dst, extents); + } + + if (clip_region) + _cairo_xcb_surface_clear_clip_region (dst); + + _cairo_xcb_connection_release (dst->connection); + + return status; +} + +static cairo_status_t +_core_boxes (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + cairo_boxes_t *boxes, + const cairo_composite_rectangles_t *extents) +{ + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_clip_is_region (extents->clip)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (op == CAIRO_OPERATOR_CLEAR) + return _cairo_xcb_surface_core_fill_boxes (dst, CAIRO_COLOR_TRANSPARENT, boxes); + + if (op == CAIRO_OPERATOR_OVER) { + if (dst->base.is_clear || _cairo_pattern_is_opaque (src, &extents->bounded)) + op = CAIRO_OPERATOR_SOURCE; + } + if (op != CAIRO_OPERATOR_SOURCE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (src->type == CAIRO_PATTERN_TYPE_SOLID) { + return _cairo_xcb_surface_core_fill_boxes (dst, + &((cairo_solid_pattern_t *) src)->color, + boxes); + } + + return _cairo_xcb_surface_core_copy_boxes (dst, src, &extents->bounded, boxes); +} + +static cairo_status_t +_composite_boxes (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + cairo_boxes_t *boxes, + const cairo_composite_rectangles_t *extents) +{ + cairo_clip_t *clip = extents->clip; + cairo_bool_t need_clip_mask = ! _cairo_clip_is_region (clip); + cairo_status_t status; + + /* If the boxes are not pixel-aligned, we will need to compute a real mask */ + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (need_clip_mask && + (! extents->is_bounded || op == CAIRO_OPERATOR_SOURCE)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = _cairo_xcb_connection_acquire (dst->connection); + if (unlikely (status)) + return status; + + _cairo_xcb_surface_ensure_picture (dst); + if (dst->connection->flags & CAIRO_XCB_RENDER_HAS_FILL_RECTANGLES && ! need_clip_mask && + (op == CAIRO_OPERATOR_CLEAR || src->type == CAIRO_PATTERN_TYPE_SOLID)) + { + const cairo_color_t *color; + + if (op == CAIRO_OPERATOR_CLEAR) + color = CAIRO_COLOR_TRANSPARENT; + else + color = &((cairo_solid_pattern_t *) src)->color; + + status = _render_fill_boxes (dst, op, color, boxes); + } + else + { + cairo_surface_pattern_t mask; + + if (need_clip_mask) { + cairo_xcb_surface_t *clip_surface; + int clip_x = 0, clip_y = 0; + + clip_surface = get_clip_surface (extents->clip, dst, + &clip_x, &clip_y); + if (unlikely (clip_surface->base.status)) + return clip_surface->base.status; + + _cairo_pattern_init_for_surface (&mask, &clip_surface->base); + mask.base.filter = CAIRO_FILTER_NEAREST; + cairo_matrix_init_translate (&mask.base.matrix, + -clip_x, + -clip_y); + cairo_surface_destroy (&clip_surface->base); + + if (op == CAIRO_OPERATOR_CLEAR) { + src = NULL; + op = CAIRO_OPERATOR_DEST_OUT; + } + } + + status = _render_composite_boxes (dst, op, src, + need_clip_mask ? &mask.base : NULL, + &extents->bounded, boxes); + + if (need_clip_mask) + _cairo_pattern_fini (&mask.base); + } + + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) { + status = + _cairo_xcb_surface_fixup_unbounded_boxes (dst, extents, + clip, boxes); + } + + _cairo_xcb_connection_release (dst->connection); + + return status; +} + +static cairo_bool_t +cairo_boxes_for_each_box (cairo_boxes_t *boxes, + cairo_bool_t (*func) (cairo_box_t *box, + void *data), + void *data) +{ + struct _cairo_boxes_chunk *chunk; + int i; + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) + if (! func (&chunk->base[i], data)) + return FALSE; + } + + return TRUE; +} + +struct _image_contains_box { + int width, height; + int tx, ty; +}; + +static cairo_bool_t image_contains_box (cairo_box_t *box, void *closure) +{ + struct _image_contains_box *data = closure; + + /* The box is pixel-aligned so the truncation is safe. */ + return + _cairo_fixed_integer_part (box->p1.x) + data->tx >= 0 && + _cairo_fixed_integer_part (box->p1.y) + data->ty >= 0 && + _cairo_fixed_integer_part (box->p2.x) + data->tx <= data->width && + _cairo_fixed_integer_part (box->p2.y) + data->ty <= data->height; +} + +struct _image_upload_box { + cairo_xcb_surface_t *surface; + cairo_image_surface_t *image; + xcb_gcontext_t gc; + int tx, ty; +}; + +static cairo_bool_t image_upload_box (cairo_box_t *box, void *closure) +{ + const struct _image_upload_box *iub = closure; + /* The box is pixel-aligned so the truncation is safe. */ + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + int bpp = PIXMAN_FORMAT_BPP (iub->image->pixman_format); + int len = CAIRO_STRIDE_FOR_WIDTH_BPP (width, bpp); + if (len == iub->image->stride) { + _cairo_xcb_connection_put_image (iub->surface->connection, + iub->surface->drawable, + iub->gc, + width, height, + x, y, + iub->image->depth, + iub->image->stride, + iub->image->data + + (y + iub->ty) * iub->image->stride + + (x + iub->tx) * bpp/8); + } else { + _cairo_xcb_connection_put_subimage (iub->surface->connection, + iub->surface->drawable, + iub->gc, + x + iub->tx, + y + iub->ty, + width, height, + bpp / 8, + iub->image->stride, + x, y, + iub->image->depth, + iub->image->data); + } + + return TRUE; +} + +static cairo_status_t +_upload_image_inplace (cairo_xcb_surface_t *surface, + const cairo_pattern_t *source, + cairo_boxes_t *boxes) +{ + const cairo_surface_pattern_t *pattern; + struct _image_contains_box icb; + struct _image_upload_box iub; + cairo_image_surface_t *image; + cairo_status_t status; + int tx, ty; + + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (source->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + pattern = (const cairo_surface_pattern_t *) source; + if (! _cairo_surface_is_image (pattern->surface)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Have we already upload this image to a pixmap? */ + { + cairo_xcb_picture_t *snapshot; + + snapshot = (cairo_xcb_picture_t *) + _cairo_surface_has_snapshot (pattern->surface, &_cairo_xcb_picture_backend); + if (snapshot != NULL) { + if (snapshot->screen == surface->screen) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + } + + image = (cairo_image_surface_t *) pattern->surface; + if (image->format == CAIRO_FORMAT_INVALID) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (image->depth != surface->depth) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, &tx, &ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Check that the data is entirely within the image */ + icb.width = image->width; + icb.height = image->height; + icb.tx = tx; + icb.ty = ty; + if (! cairo_boxes_for_each_box (boxes, image_contains_box, &icb)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface->deferred_clear) { + status = _cairo_xcb_surface_clear (surface); + if (unlikely (status)) + return status; + } + + status = _cairo_xcb_connection_acquire (surface->connection); + if (unlikely (status)) + return status; + + iub.surface = surface; + iub.image = image; + iub.gc = _cairo_xcb_screen_get_gc (surface->screen, + surface->drawable, + image->depth); + iub.tx = tx; + iub.ty = ty; + cairo_boxes_for_each_box (boxes, image_upload_box, &iub); + + _cairo_xcb_screen_put_gc (surface->screen, image->depth, iub.gc); + _cairo_xcb_connection_release (surface->connection); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +trim_extents_to_traps (cairo_composite_rectangles_t *extents, + cairo_traps_t *traps) +{ + cairo_box_t box; + + /* X trims the affected area to the extents of the trapezoids, so + * we need to compensate when fixing up the unbounded area. + */ + _cairo_traps_extents (traps, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_bool_t +_mono_edge_is_vertical (const cairo_line_t *line) +{ + return _cairo_fixed_integer_round_down (line->p1.x) == _cairo_fixed_integer_round_down (line->p2.x); +} + +static cairo_bool_t +_traps_are_pixel_aligned (cairo_traps_t *traps, + cairo_antialias_t antialias) +{ + int i; + + if (antialias == CAIRO_ANTIALIAS_NONE) { + for (i = 0; i < traps->num_traps; i++) { + if (! _mono_edge_is_vertical (&traps->traps[i].left) || + ! _mono_edge_is_vertical (&traps->traps[i].right)) + { + traps->maybe_region = FALSE; + return FALSE; + } + } + } else { + for (i = 0; i < traps->num_traps; i++) { + if (traps->traps[i].left.p1.x != traps->traps[i].left.p2.x || + traps->traps[i].right.p1.x != traps->traps[i].right.p2.x || + ! _cairo_fixed_is_integer (traps->traps[i].top) || + ! _cairo_fixed_is_integer (traps->traps[i].bottom) || + ! _cairo_fixed_is_integer (traps->traps[i].left.p1.x) || + ! _cairo_fixed_is_integer (traps->traps[i].right.p1.x)) + { + traps->maybe_region = FALSE; + return FALSE; + } + } + } + + return TRUE; +} + +static void +_boxes_for_traps (cairo_boxes_t *boxes, + cairo_traps_t *traps, + cairo_antialias_t antialias) +{ + int i, j; + + _cairo_boxes_init (boxes); + + boxes->chunks.base = (cairo_box_t *) traps->traps; + boxes->chunks.size = traps->num_traps; + + if (antialias != CAIRO_ANTIALIAS_NONE) { + for (i = j = 0; i < traps->num_traps; i++) { + /* Note the traps and boxes alias so we need to take the local copies first. */ + cairo_fixed_t x1 = traps->traps[i].left.p1.x; + cairo_fixed_t x2 = traps->traps[i].right.p1.x; + cairo_fixed_t y1 = traps->traps[i].top; + cairo_fixed_t y2 = traps->traps[i].bottom; + + if (x1 == x2 || y1 == y2) + continue; + + boxes->chunks.base[j].p1.x = x1; + boxes->chunks.base[j].p1.y = y1; + boxes->chunks.base[j].p2.x = x2; + boxes->chunks.base[j].p2.y = y2; + j++; + + if (boxes->is_pixel_aligned) { + boxes->is_pixel_aligned = + _cairo_fixed_is_integer (x1) && _cairo_fixed_is_integer (y1) && + _cairo_fixed_is_integer (x2) && _cairo_fixed_is_integer (y2); + } + } + } else { + boxes->is_pixel_aligned = TRUE; + + for (i = j = 0; i < traps->num_traps; i++) { + /* Note the traps and boxes alias so we need to take the local copies first. */ + cairo_fixed_t x1 = traps->traps[i].left.p1.x; + cairo_fixed_t x2 = traps->traps[i].right.p1.x; + cairo_fixed_t y1 = traps->traps[i].top; + cairo_fixed_t y2 = traps->traps[i].bottom; + + /* round down here to match Pixman's behavior when using traps. */ + boxes->chunks.base[j].p1.x = _cairo_fixed_round_down (x1); + boxes->chunks.base[j].p1.y = _cairo_fixed_round_down (y1); + boxes->chunks.base[j].p2.x = _cairo_fixed_round_down (x2); + boxes->chunks.base[j].p2.y = _cairo_fixed_round_down (y2); + + j += (boxes->chunks.base[j].p1.x != boxes->chunks.base[j].p2.x && + boxes->chunks.base[j].p1.y != boxes->chunks.base[j].p2.y); + } + } + + boxes->num_boxes = j; + boxes->chunks.count = j; +} + +static cairo_status_t +_composite_polygon (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_polygon_t *polygon, + cairo_antialias_t antialias, + cairo_fill_rule_t fill_rule, + cairo_composite_rectangles_t *extents) +{ + composite_traps_info_t traps; + cairo_bool_t clip_surface = ! _cairo_clip_is_region (extents->clip); + cairo_region_t *clip_region = _cairo_clip_get_region (extents->clip); + cairo_status_t status; + + if (polygon->num_edges == 0) { + status = CAIRO_STATUS_SUCCESS; + + if (! extents->is_bounded) { + if (cairo_region_contains_rectangle (clip_region, &extents->unbounded) == CAIRO_REGION_OVERLAP_IN) + clip_region = NULL; + + if (clip_surface == FALSE) { + if (clip_region != NULL) { + status = _cairo_xcb_surface_set_clip_region (dst, clip_region); + if (unlikely (status)) + return status; + } + + status = _cairo_xcb_surface_fixup_unbounded (dst, extents); + + if (clip_region != NULL) + _cairo_xcb_surface_clear_clip_region (dst); + } else { + status = _cairo_xcb_surface_fixup_unbounded_with_mask (dst, + extents, + extents->clip); + } + } + + return status; + } + + if (extents->clip->path != NULL && extents->is_bounded) { + cairo_polygon_t clipper; + cairo_fill_rule_t clipper_fill_rule; + cairo_antialias_t clipper_antialias; + + status = _cairo_clip_get_polygon (extents->clip, + &clipper, + &clipper_fill_rule, + &clipper_antialias); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + if (clipper_antialias == antialias) { + status = _cairo_polygon_intersect (polygon, fill_rule, + &clipper, clipper_fill_rule); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + cairo_clip_t * clip = _cairo_clip_copy_region (extents->clip); + _cairo_clip_destroy (extents->clip); + extents->clip = clip; + + fill_rule = CAIRO_FILL_RULE_WINDING; + } + _cairo_polygon_fini (&clipper); + } + } + } + + _cairo_traps_init (&traps.traps); + + status = _cairo_bentley_ottmann_tessellate_polygon (&traps.traps, polygon, fill_rule); + if (unlikely (status)) + goto CLEANUP_TRAPS; + + if (traps.traps.has_intersections) { + if (traps.traps.is_rectangular) + status = _cairo_bentley_ottmann_tessellate_rectangular_traps (&traps.traps, CAIRO_FILL_RULE_WINDING); + else if (traps.traps.is_rectilinear) + status = _cairo_bentley_ottmann_tessellate_rectilinear_traps (&traps.traps, CAIRO_FILL_RULE_WINDING); + else + status = _cairo_bentley_ottmann_tessellate_traps (&traps.traps, CAIRO_FILL_RULE_WINDING); + if (unlikely (status)) + goto CLEANUP_TRAPS; + } + + /* Use a fast path if the trapezoids consist of a simple region, + * but we can only do this if we do not have a clip surface, or can + * substitute the mask with the clip. + */ + if (traps.traps.maybe_region && + _traps_are_pixel_aligned (&traps.traps, antialias) && + (! clip_surface || + (extents->is_bounded && op != CAIRO_OPERATOR_SOURCE))) + { + cairo_boxes_t boxes; + + _boxes_for_traps (&boxes, &traps.traps, antialias); + status = _clip_and_composite_boxes (dst, op, source, &boxes, extents); + } + else + { + /* Otherwise render the trapezoids to a mask and composite in the usual + * fashion. + */ + traps.antialias = antialias; + status = trim_extents_to_traps (extents, &traps.traps); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + unsigned int flags = 0; + + /* For unbounded operations, the X11 server will estimate the + * affected rectangle and apply the operation to that. However, + * there are cases where this is an overestimate (e.g. the + * clip-fill-{eo,nz}-unbounded test). + * + * The clip will trim that overestimate to our expectations. + */ + if (! extents->is_bounded) + flags |= FORCE_CLIP_REGION; + + status = _clip_and_composite (dst, op, source, _composite_traps, + NULL, &traps, extents, + need_unbounded_clip (extents) | flags); + } + } + +CLEANUP_TRAPS: + _cairo_traps_fini (&traps.traps); + + return status; +} + +static cairo_status_t +_clip_and_composite_boxes (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + cairo_boxes_t *boxes, + cairo_composite_rectangles_t *extents) +{ + composite_traps_info_t info; + cairo_int_status_t status; + + if (boxes->num_boxes == 0 && extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + if (boxes->is_pixel_aligned && _cairo_clip_is_region (extents->clip) && + (op == CAIRO_OPERATOR_SOURCE || + (dst->base.is_clear && (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD)))) + { + if (boxes->num_boxes == 1 && + extents->bounded.width == dst->width && + extents->bounded.height == dst->height) + { + op = CAIRO_OPERATOR_SOURCE; + dst->deferred_clear = FALSE; + } + + status = _upload_image_inplace (dst, src, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + /* Can we reduce drawing through a clip-mask to simply drawing the clip? */ + if (dst->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS && + extents->clip->path != NULL && extents->is_bounded) { + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; + cairo_clip_t *clip; + + clip = _cairo_clip_copy (extents->clip); + clip = _cairo_clip_intersect_boxes (clip, boxes); + if (_cairo_clip_is_all_clipped (clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + + status = _cairo_clip_get_polygon (clip, &polygon, + &fill_rule, &antialias); + _cairo_clip_path_destroy (clip->path); + clip->path = NULL; + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + cairo_clip_t *saved_clip = extents->clip; + extents->clip = clip; + status = _composite_polygon (dst, op, src, + &polygon, + antialias, + fill_rule, + extents); + if (extents->clip != clip) + clip = NULL; + extents->clip = saved_clip; + _cairo_polygon_fini (&polygon); + } + if (clip) + _cairo_clip_destroy (clip); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + if (dst->deferred_clear) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) + return status; + } + + if (boxes->is_pixel_aligned && + _cairo_clip_is_region (extents->clip) && + op == CAIRO_OPERATOR_SOURCE) { + status = _upload_image_inplace (dst, src, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + if ((dst->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE) == 0) + return _core_boxes (dst, op, src, boxes, extents); + + /* Use a fast path if the boxes are pixel aligned */ + status = _composite_boxes (dst, op, src, boxes, extents); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + if ((dst->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS) == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Otherwise render via a mask and composite in the usual fashion. */ + status = _cairo_traps_init_boxes (&info.traps, boxes); + if (unlikely (status)) + return status; + + info.antialias = CAIRO_ANTIALIAS_DEFAULT; + status = trim_extents_to_traps (extents, &info.traps); + if (status == CAIRO_INT_STATUS_SUCCESS) { + status = _clip_and_composite (dst, op, src, + _composite_traps, NULL, &info, + extents, need_unbounded_clip (extents)); + } + + _cairo_traps_fini (&info.traps); + return status; +} + +static cairo_int_status_t +_composite_mask (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + const cairo_pattern_t *mask_pattern = closure; + cairo_xcb_picture_t *src, *mask = NULL; + cairo_status_t status; + + if (dst->base.is_clear) { + if (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD) + op = CAIRO_OPERATOR_SOURCE; + } + + if (op == CAIRO_OPERATOR_SOURCE && clip == NULL) + dst->deferred_clear = FALSE; + + if (dst->deferred_clear) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) + return status; + } + + if (src_pattern != NULL) { + src = _cairo_xcb_picture_for_pattern (dst, src_pattern, extents); + if (unlikely (src->base.status)) + return src->base.status; + + mask = _cairo_xcb_picture_for_pattern (dst, mask_pattern, extents); + if (unlikely (mask->base.status)) { + cairo_surface_destroy (&src->base); + return mask->base.status; + } + + _cairo_xcb_connection_render_composite (dst->connection, + _render_operator (op), + src->picture, + mask->picture, + dst->picture, + extents->x + src->x, extents->y + src->y, + extents->x + mask->x, extents->y + mask->y, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + cairo_surface_destroy (&mask->base); + cairo_surface_destroy (&src->base); + } else { + src = _cairo_xcb_picture_for_pattern (dst, mask_pattern, extents); + if (unlikely (src->base.status)) + return src->base.status; + + _cairo_xcb_connection_render_composite (dst->connection, + _render_operator (op), + src->picture, + XCB_NONE, + dst->picture, + extents->x + src->x, extents->y + src->y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + cairo_surface_destroy (&src->base); + } + + return CAIRO_STATUS_SUCCESS; +} + +struct composite_box_info { + cairo_xcb_surface_t *dst; + cairo_xcb_picture_t *src; + uint8_t op; +}; + +static void composite_box(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct composite_box_info *info = closure; + + if (coverage < 0xff00) { + cairo_xcb_picture_t *mask; + cairo_color_t color; + + color.red_short = color.green_short = color.blue_short = 0; + color.alpha_short = coverage; + + mask = _solid_picture (info->dst, &color); + if (likely (mask->base.status == CAIRO_STATUS_SUCCESS)) { + _cairo_xcb_connection_render_composite (info->dst->connection, + info->op, + info->src->picture, + mask->picture, + info->dst->picture, + x + info->src->x, y + info->src->y, + 0, 0, + x, y, + w, h); + } + cairo_surface_destroy (&mask->base); + } else { + _cairo_xcb_connection_render_composite (info->dst->connection, + info->op, + info->src->picture, + XCB_NONE, + info->dst->picture, + x + info->src->x, y + info->src->y, + 0, 0, + x, y, + w, h); + } +} + +static cairo_int_status_t +_composite_mask_clip_boxes (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + struct composite_box_info info; + cairo_status_t status; + int i; + + assert (src_pattern == NULL); + assert (op == CAIRO_OPERATOR_ADD); + assert (dst->base.is_clear); + + if (clip->num_boxes > 1) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) + return status; + } + + info.op = XCB_RENDER_PICT_OP_SRC; + info.dst = dst; + info.src = _cairo_xcb_picture_for_pattern (dst, closure, extents); + if (unlikely (info.src->base.status)) + return info.src->base.status; + + info.src->x += dst_x; + info.src->y += dst_y; + + for (i = 0; i < clip->num_boxes; i++) + do_unaligned_box(composite_box, &info, &clip->boxes[i], dst_x, dst_y); + cairo_surface_destroy (&info.src->base); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_composite_mask_clip (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + const cairo_pattern_t *mask_pattern = closure; + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + composite_traps_info_t info; + cairo_status_t status; + + assert (src_pattern == NULL); + assert (op == CAIRO_OPERATOR_ADD); + assert (dst->base.is_clear); + + status = _cairo_clip_get_polygon (clip, &polygon, + &fill_rule, &info.antialias); + if (unlikely (status)) + return status; + + _cairo_traps_init (&info.traps); + status = _cairo_bentley_ottmann_tessellate_polygon (&info.traps, + &polygon, + fill_rule); + _cairo_polygon_fini (&polygon); + if (unlikely (status)) + return status; + + if (info.traps.has_intersections) { + if (info.traps.is_rectangular) + status = _cairo_bentley_ottmann_tessellate_rectangular_traps (&info.traps, CAIRO_FILL_RULE_WINDING); + else if (info.traps.is_rectilinear) + status = _cairo_bentley_ottmann_tessellate_rectilinear_traps (&info.traps, CAIRO_FILL_RULE_WINDING); + else + status = _cairo_bentley_ottmann_tessellate_traps (&info.traps, CAIRO_FILL_RULE_WINDING); + if (unlikely (status)) { + _cairo_traps_fini (&info.traps); + return status; + } + } + + dst->deferred_clear = FALSE; /* assert(trap extents == extents); */ + + status = _composite_traps (&info, + dst, CAIRO_OPERATOR_SOURCE, mask_pattern, + dst_x, dst_y, + extents, NULL); + _cairo_traps_fini (&info.traps); + + return status; +} + +struct composite_opacity_info { + uint8_t op; + cairo_xcb_surface_t *dst; + cairo_xcb_picture_t *src; + double opacity; +}; + +static void composite_opacity(void *closure, + int16_t x, int16_t y, + int16_t w, int16_t h, + uint16_t coverage) +{ + struct composite_opacity_info *info = closure; + cairo_xcb_picture_t *mask; + cairo_color_t color; + + color.red_short = color.green_short = color.blue_short = 0; + color.alpha_short = info->opacity * coverage; + + mask = _solid_picture (info->dst, &color); + if (likely (mask->base.status == CAIRO_STATUS_SUCCESS)) { + if (info->src) { + _cairo_xcb_connection_render_composite (info->dst->connection, + info->op, + info->src->picture, + mask->picture, + info->dst->picture, + x + info->src->x, y + info->src->y, + 0, 0, + x, y, + w, h); + } else { + _cairo_xcb_connection_render_composite (info->dst->connection, + info->op, + mask->picture, + XCB_NONE, + info->dst->picture, + 0, 0, + 0, 0, + x, y, + w, h); + } + } + + cairo_surface_destroy (&mask->base); +} + +static cairo_int_status_t +_composite_opacity_boxes (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src_pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + const cairo_solid_pattern_t *mask_pattern = closure; + struct composite_opacity_info info; + cairo_status_t status; + int i; + + if (dst->base.is_clear) { + if (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD) + op = CAIRO_OPERATOR_SOURCE; + } + + if (op == CAIRO_OPERATOR_SOURCE && + (clip == NULL || + (clip->extents.width >= extents->width && + clip->extents.height >= extents->height))) + dst->deferred_clear = FALSE; + + if (dst->deferred_clear) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) + return status; + } + + info.op = _render_operator (op); + info.dst = dst; + + if (src_pattern != NULL) { + info.src = _cairo_xcb_picture_for_pattern (dst, src_pattern, extents); + if (unlikely (info.src->base.status)) + return info.src->base.status; + } else + info.src = NULL; + + info.opacity = mask_pattern->color.alpha; + + /* XXX for lots of boxes create a clip region for the fully opaque areas */ + if (clip) { + for (i = 0; i < clip->num_boxes; i++) + do_unaligned_box(composite_opacity, &info, + &clip->boxes[i], dst_x, dst_y); + } else { + composite_opacity(&info, + extents->x - dst_x, + extents->y - dst_y, + extents->width, + extents->height, + 0xffff); + } + cairo_surface_destroy (&info.src->base); + + return CAIRO_STATUS_SUCCESS; +} + +/* high level rasteriser -> compositor */ + +cairo_int_status_t +_cairo_xcb_render_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; + cairo_boxes_t boxes; + cairo_status_t status; + + if (unlikely (! _operator_is_supported (surface->connection->flags, op))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface->connection->flags & (CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS | + CAIRO_XCB_RENDER_HAS_COMPOSITE)) == 0) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (composite->clip == NULL && + source->type == CAIRO_PATTERN_TYPE_SOLID && + (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_CLEAR || + (surface->base.is_clear && + (op == CAIRO_OPERATOR_ADD || op == CAIRO_OPERATOR_OVER)))) + { + surface->deferred_clear = TRUE; + surface->deferred_clear_color = composite->source_pattern.solid.color; + return CAIRO_STATUS_SUCCESS; + } + + _cairo_clip_steal_boxes(composite->clip, &boxes); + status = _clip_and_composite_boxes (surface, op, source, &boxes, composite); + _cairo_clip_unsteal_boxes (composite->clip, &boxes); + + return status; +} + +cairo_int_status_t +_cairo_xcb_render_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; + cairo_pattern_t *mask = &composite->mask_pattern.base; + cairo_status_t status; + + if (unlikely (! _operator_is_supported (surface->connection->flags, op))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE) == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (mask->type == CAIRO_PATTERN_TYPE_SOLID && + composite->clip->path == NULL && + ! _cairo_clip_is_region (composite->clip)) { + status = _clip_and_composite (surface, op, source, + _composite_opacity_boxes, + _composite_opacity_boxes, + (void *) mask, + composite, need_unbounded_clip (composite)); + } else { + xcb_draw_func_t mask_func = NULL; + if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS) + mask_func = composite->clip->path ? _composite_mask_clip : _composite_mask_clip_boxes; + status = _clip_and_composite (surface, op, source, + _composite_mask, mask_func, + (void *) mask, + composite, need_bounded_clip (composite)); + } + + return status; +} + +static cairo_int_status_t +_cairo_xcb_surface_render_stroke_as_polygon (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_composite_rectangles_t *extents) +{ + cairo_polygon_t polygon; + cairo_status_t status; + + _cairo_polygon_init_with_clip (&polygon, extents->clip); + status = _cairo_path_fixed_stroke_to_polygon (path, + stroke_style, + ctm, ctm_inverse, + tolerance, + &polygon); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _composite_polygon (dst, op, source, + &polygon, antialias, + CAIRO_FILL_RULE_WINDING, + extents); + } + _cairo_polygon_fini (&polygon); + + return status; +} + +static cairo_status_t +_cairo_xcb_surface_render_stroke_via_mask (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *image; + cairo_status_t status; + cairo_clip_t *clip; + int x, y; + + x = extents->bounded.x; + y = extents->bounded.y; + image = _cairo_xcb_surface_create_similar_image (dst, CAIRO_FORMAT_A8, + extents->bounded.width, + extents->bounded.height); + if (unlikely (image->status)) + return image->status; + + clip = _cairo_clip_copy_region (extents->clip); + status = _cairo_surface_offset_stroke (image, x, y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + path, stroke_style, + ctm, ctm_inverse, + tolerance, antialias, + clip); + _cairo_clip_destroy (clip); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + cairo_surface_pattern_t mask; + + _cairo_pattern_init_for_surface (&mask, image); + mask.base.filter = CAIRO_FILTER_NEAREST; + + cairo_matrix_init_translate (&mask.base.matrix, -x, -y); + status = _clip_and_composite (dst, op, source, + _composite_mask, NULL, &mask.base, + extents, need_bounded_clip (extents)); + _cairo_pattern_fini (&mask.base); + } + + cairo_surface_finish (image); + cairo_surface_destroy (image); + + return status; +} + +cairo_int_status_t +_cairo_xcb_render_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; + cairo_int_status_t status; + + if (unlikely (! _operator_is_supported (surface->connection->flags, op))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface->connection->flags & (CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS | + CAIRO_XCB_RENDER_HAS_COMPOSITE)) == 0) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, composite->clip); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + style, + ctm, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + status = _clip_and_composite_boxes (surface, op, source, + &boxes, composite); + } + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS) { + status = _cairo_xcb_surface_render_stroke_as_polygon (surface, op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + composite); + } else if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE) { + status = _cairo_xcb_surface_render_stroke_via_mask (surface, op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + composite); + } else { + ASSERT_NOT_REACHED; + } + } + + return status; +} + +static cairo_status_t +_cairo_xcb_surface_render_fill_as_polygon (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t*source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_composite_rectangles_t *extents) +{ + cairo_polygon_t polygon; + cairo_status_t status; + + _cairo_polygon_init_with_clip (&polygon, extents->clip); + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &polygon); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _composite_polygon (dst, op, source, + &polygon, + antialias, + fill_rule, + extents); + } + _cairo_polygon_fini (&polygon); + + return status; +} + +static cairo_status_t +_cairo_xcb_surface_render_fill_via_mask (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *image; + cairo_status_t status; + cairo_clip_t *clip; + int x, y; + + x = extents->bounded.x; + y = extents->bounded.y; + image = _cairo_xcb_surface_create_similar_image (dst, CAIRO_FORMAT_A8, + extents->bounded.width, + extents->bounded.height); + if (unlikely (image->status)) + return image->status; + + clip = _cairo_clip_copy_region (extents->clip); + status = _cairo_surface_offset_fill (image, x, y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + path, fill_rule, tolerance, antialias, + clip); + _cairo_clip_destroy (clip); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + cairo_surface_pattern_t mask; + + _cairo_pattern_init_for_surface (&mask, image); + mask.base.filter = CAIRO_FILTER_NEAREST; + + cairo_matrix_init_translate (&mask.base.matrix, -x, -y); + status = _clip_and_composite (dst, op, source, + _composite_mask, NULL, &mask.base, + extents, need_bounded_clip (extents)); + + _cairo_pattern_fini (&mask.base); + } + + cairo_surface_finish (image); + cairo_surface_destroy (image); + + return status; +} + +cairo_int_status_t +_cairo_xcb_render_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; + cairo_int_status_t status; + + if (unlikely (! _operator_is_supported (surface->connection->flags, op))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface->connection->flags & (CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS | + CAIRO_XCB_RENDER_HAS_COMPOSITE)) == 0) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, composite->clip); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + status = _clip_and_composite_boxes (surface, op, source, + &boxes, composite); + } + _cairo_boxes_fini (&boxes); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_TRAPEZOIDS) { + status = _cairo_xcb_surface_render_fill_as_polygon (surface, op, source, path, + fill_rule, tolerance, antialias, + composite); + } else if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE) { + status = _cairo_xcb_surface_render_fill_via_mask (surface, op, source, path, + fill_rule, tolerance, antialias, + composite); + } else { + ASSERT_NOT_REACHED; + } + } + + return status; +} + +static cairo_status_t +_cairo_xcb_surface_render_glyphs_via_mask (cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_composite_rectangles_t *extents) +{ + cairo_surface_t *image; + cairo_content_t content; + cairo_status_t status; + cairo_clip_t *clip; + int x, y; + + content = CAIRO_CONTENT_ALPHA; + if (scaled_font->options.antialias == CAIRO_ANTIALIAS_SUBPIXEL) + content = CAIRO_CONTENT_COLOR_ALPHA; + + x = extents->bounded.x; + y = extents->bounded.y; + image = _cairo_xcb_surface_create_similar_image (dst, + _cairo_format_from_content (content), + extents->bounded.width, + extents->bounded.height); + if (unlikely (image->status)) + return image->status; + + clip = _cairo_clip_copy_region (extents->clip); + status = _cairo_surface_offset_glyphs (image, x, y, + CAIRO_OPERATOR_ADD, + &_cairo_pattern_white.base, + scaled_font, glyphs, num_glyphs, + clip); + _cairo_clip_destroy (clip); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + cairo_surface_pattern_t mask; + + _cairo_pattern_init_for_surface (&mask, image); + mask.base.filter = CAIRO_FILTER_NEAREST; + if (content & CAIRO_CONTENT_COLOR) + mask.base.has_component_alpha = TRUE; + + cairo_matrix_init_translate (&mask.base.matrix, -x, -y); + status = _clip_and_composite (dst, op, source, + _composite_mask, NULL, &mask.base, + extents, need_bounded_clip (extents)); + + _cairo_pattern_fini (&mask.base); + } + + cairo_surface_finish (image); + cairo_surface_destroy (image); + + return status; +} + +/* Build a struct of the same size of #cairo_glyph_t that can be used both as + * an input glyph with double coordinates, and as "working" glyph with + * integer from-current-point offsets. */ +typedef union { + cairo_glyph_t d; + unsigned long index; + struct { + unsigned long index; + int x; + int y; + } i; +} cairo_xcb_glyph_t; + +/* compile-time assert that #cairo_xcb_glyph_t is the same size as #cairo_glyph_t */ +COMPILE_TIME_ASSERT (sizeof (cairo_xcb_glyph_t) == sizeof (cairo_glyph_t)); + +typedef struct { + cairo_scaled_font_t *font; + cairo_xcb_glyph_t *glyphs; + int num_glyphs; + cairo_bool_t use_mask; +} composite_glyphs_info_t; + +static cairo_status_t +_can_composite_glyphs (cairo_xcb_surface_t *dst, + cairo_rectangle_int_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs) +{ +#define GLYPH_CACHE_SIZE 64 + cairo_box_t bbox_cache[GLYPH_CACHE_SIZE]; + unsigned long glyph_cache[GLYPH_CACHE_SIZE]; +#undef GLYPH_CACHE_SIZE + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_glyph_t *glyphs_end, *valid_glyphs; + const int max_glyph_size = dst->connection->maximum_request_length - 64; + + /* We must initialize the cache with values that cannot match the + * "hash" to guarantee that when compared for the first time they + * will result in a mismatch. The hash function is simply modulus, + * so we cannot use 0 in glyph_cache[0], but we can use it in all + * other array cells. + */ + memset (glyph_cache, 0, sizeof (glyph_cache)); + glyph_cache[0] = 1; + + /* Scan for oversized glyphs or glyphs outside the representable + * range and fallback in that case, discard glyphs outside of the + * image. + */ + valid_glyphs = glyphs; + for (glyphs_end = glyphs + *num_glyphs; glyphs != glyphs_end; glyphs++) { + double x1, y1, x2, y2; + cairo_scaled_glyph_t *glyph; + cairo_box_t *bbox; + int width, height, len; + int g; + + g = glyphs->index % ARRAY_LENGTH (glyph_cache); + if (glyph_cache[g] != glyphs->index) { + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs->index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &glyph); + if (unlikely (status)) + break; + + glyph_cache[g] = glyphs->index; + bbox_cache[g] = glyph->bbox; + } + bbox = &bbox_cache[g]; + + /* Drop glyphs outside the clipping */ + x1 = _cairo_fixed_to_double (bbox->p1.x); + y1 = _cairo_fixed_to_double (bbox->p1.y); + y2 = _cairo_fixed_to_double (bbox->p2.y); + x2 = _cairo_fixed_to_double (bbox->p2.x); + if (unlikely (glyphs->x + x2 <= extents->x || + glyphs->y + y2 <= extents->y || + glyphs->x + x1 >= extents->x + extents->width || + glyphs->y + y1 >= extents->y + extents->height)) + { + (*num_glyphs)--; + continue; + } + + /* XRenderAddGlyph does not handle a glyph surface larger than + * the extended maximum XRequest size. + */ + width = _cairo_fixed_integer_ceil (bbox->p2.x - bbox->p1.x); + height = _cairo_fixed_integer_ceil (bbox->p2.y - bbox->p1.y); + len = CAIRO_STRIDE_FOR_WIDTH_BPP (width, 32) * height; + if (unlikely (len >= max_glyph_size)) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + break; + } + + /* The glyph coordinates must be representable in an int16_t. + * When possible, they will be expressed as an offset from the + * previous glyph, otherwise they will be an offset from the + * operation extents or from the surface origin. If the last + * two options are not valid, fallback. + */ + if (unlikely (glyphs->x > INT16_MAX || + glyphs->y > INT16_MAX || + glyphs->x - extents->x < INT16_MIN || + glyphs->y - extents->y < INT16_MIN)) + { + status = CAIRO_INT_STATUS_UNSUPPORTED; + break; + } + + + if (unlikely (valid_glyphs != glyphs)) + *valid_glyphs = *glyphs; + valid_glyphs++; + } + + if (unlikely (valid_glyphs != glyphs)) { + for (; glyphs != glyphs_end; glyphs++) { + *valid_glyphs = *glyphs; + valid_glyphs++; + } + } + + return status; +} + +/* Start a new element for the first glyph, + * or for any glyph that has unexpected position, + * or if current element has too many glyphs + * (Xrender limits each element to 252 glyphs, we limit them to 128) + * + * These same conditions need to be mirrored between + * _cairo_xcb_surface_emit_glyphs and _emit_glyph_chunks + */ +#define _start_new_glyph_elt(count, glyph) \ + (((count) & 127) == 0 || (glyph)->i.x || (glyph)->i.y) + +/* sz_xGlyphtElt required alignment to a 32-bit boundary, so ensure we have + * enough room for padding */ +typedef struct { + uint8_t len; + uint8_t pad1; + uint16_t pad2; + int16_t deltax; + int16_t deltay; +} x_glyph_elt_t; +#define _cairo_sz_x_glyph_elt_t (sizeof (x_glyph_elt_t) + 4) + +static void +_cairo_xcb_font_destroy (cairo_xcb_font_t *font) +{ + int i; + + for (i = 0; i < NUM_GLYPHSETS; i++) { + cairo_xcb_font_glyphset_info_t *info; + + info = &font->glyphset_info[i]; + free (info->pending_free_glyphs); + } + + cairo_list_del (&font->base.link); + cairo_list_del (&font->link); + + _cairo_xcb_connection_destroy (font->connection); + + free (font); +} + +static void +_cairo_xcb_font_fini (cairo_scaled_font_private_t *abstract_private, + cairo_scaled_font_t *scaled_font) +{ + cairo_xcb_font_t *font_private = (cairo_xcb_font_t *)abstract_private; + cairo_xcb_connection_t *connection; + cairo_bool_t have_connection; + cairo_status_t status; + int i; + + connection = font_private->connection; + + status = _cairo_xcb_connection_acquire (connection); + have_connection = status == CAIRO_STATUS_SUCCESS; + + for (i = 0; i < NUM_GLYPHSETS; i++) { + cairo_xcb_font_glyphset_info_t *info; + + info = &font_private->glyphset_info[i]; + if (info->glyphset && status == CAIRO_STATUS_SUCCESS) { + _cairo_xcb_connection_render_free_glyph_set (connection, + info->glyphset); + } + } + + if (have_connection) + _cairo_xcb_connection_release (connection); + + _cairo_xcb_font_destroy (font_private); +} + + +static cairo_xcb_font_t * +_cairo_xcb_font_create (cairo_xcb_connection_t *connection, + cairo_scaled_font_t *font) +{ + cairo_xcb_font_t *priv; + int i; + + priv = malloc (sizeof (cairo_xcb_font_t)); + if (unlikely (priv == NULL)) + return NULL; + + _cairo_scaled_font_attach_private (font, &priv->base, connection, + _cairo_xcb_font_fini); + + priv->scaled_font = font; + priv->connection = _cairo_xcb_connection_reference (connection); + cairo_list_add (&priv->link, &connection->fonts); + + for (i = 0; i < NUM_GLYPHSETS; i++) { + cairo_xcb_font_glyphset_info_t *info = &priv->glyphset_info[i]; + switch (i) { + case GLYPHSET_INDEX_ARGB32: info->format = CAIRO_FORMAT_ARGB32; break; + case GLYPHSET_INDEX_A8: info->format = CAIRO_FORMAT_A8; break; + case GLYPHSET_INDEX_A1: info->format = CAIRO_FORMAT_A1; break; + default: ASSERT_NOT_REACHED; break; + } + info->xrender_format = 0; + info->glyphset = XCB_NONE; + info->pending_free_glyphs = NULL; + } + + return priv; +} + +void +_cairo_xcb_font_close (cairo_xcb_font_t *font) +{ + cairo_scaled_font_t *scaled_font; + + scaled_font = font->scaled_font; + + //scaled_font->surface_private = NULL; + _cairo_scaled_font_reset_cache (scaled_font); + + _cairo_xcb_font_destroy (font); +} + +static void +_cairo_xcb_render_free_glyphs (cairo_xcb_connection_t *connection, + cairo_xcb_font_glyphset_free_glyphs_t *to_free) +{ + _cairo_xcb_connection_render_free_glyphs (connection, + to_free->glyphset, + to_free->glyph_count, + to_free->glyph_indices); +} + +static int +_cairo_xcb_get_glyphset_index_for_format (cairo_format_t format) +{ + if (format == CAIRO_FORMAT_A8) + return GLYPHSET_INDEX_A8; + if (format == CAIRO_FORMAT_A1) + return GLYPHSET_INDEX_A1; + + assert (format == CAIRO_FORMAT_ARGB32); + return GLYPHSET_INDEX_ARGB32; +} + + + +static inline cairo_xcb_font_t * +_cairo_xcb_font_get (const cairo_xcb_connection_t *c, + cairo_scaled_font_t *font) +{ + return (cairo_xcb_font_t *)_cairo_scaled_font_find_private (font, c); +} + + +static cairo_xcb_font_glyphset_info_t * +_cairo_xcb_scaled_font_get_glyphset_info_for_format (cairo_xcb_connection_t *c, + cairo_scaled_font_t *font, + cairo_format_t format) +{ + cairo_xcb_font_t *priv; + cairo_xcb_font_glyphset_info_t *info; + int glyphset_index; + + glyphset_index = _cairo_xcb_get_glyphset_index_for_format (format); + + priv = _cairo_xcb_font_get (c, font); + if (priv == NULL) { + priv = _cairo_xcb_font_create (c, font); + if (priv == NULL) + return NULL; + } + + info = &priv->glyphset_info[glyphset_index]; + if (info->glyphset == XCB_NONE) { + info->glyphset = _cairo_xcb_connection_get_xid (c); + info->xrender_format = c->standard_formats[info->format]; + + _cairo_xcb_connection_render_create_glyph_set (c, + info->glyphset, + info->xrender_format); + } + + return info; +} + +static cairo_bool_t +_cairo_xcb_glyphset_info_has_pending_free_glyph ( + cairo_xcb_font_glyphset_info_t *info, + unsigned long glyph_index) +{ + if (info->pending_free_glyphs != NULL) { + cairo_xcb_font_glyphset_free_glyphs_t *to_free; + int i; + + to_free = info->pending_free_glyphs; + for (i = 0; i < to_free->glyph_count; i++) { + if (to_free->glyph_indices[i] == glyph_index) { + to_free->glyph_count--; + memmove (&to_free->glyph_indices[i], + &to_free->glyph_indices[i+1], + (to_free->glyph_count - i) * sizeof (to_free->glyph_indices[0])); + return TRUE; + } + } + } + + return FALSE; +} + +typedef struct { + cairo_scaled_glyph_private_t base; + + cairo_xcb_font_glyphset_info_t *glyphset; +} cairo_xcb_glyph_private_t; + +static cairo_xcb_font_glyphset_info_t * +_cairo_xcb_scaled_font_get_glyphset_info_for_pending_free_glyph (cairo_xcb_connection_t *c, + cairo_scaled_font_t *font, + unsigned long glyph_index, + cairo_image_surface_t *surface) +{ + cairo_xcb_font_t *priv; + int i; + + priv = _cairo_xcb_font_get (c, font); + if (priv == NULL) + return NULL; + + if (surface != NULL) { + i = _cairo_xcb_get_glyphset_index_for_format (surface->format); + + if (_cairo_xcb_glyphset_info_has_pending_free_glyph ( + &priv->glyphset_info[i], + glyph_index)) + { + return &priv->glyphset_info[i]; + } + } else { + for (i = 0; i < NUM_GLYPHSETS; i++) { + if (_cairo_xcb_glyphset_info_has_pending_free_glyph ( + &priv->glyphset_info[i], + glyph_index)) + { + return &priv->glyphset_info[i]; + } + } + } + + return NULL; +} + +static void +_cairo_xcb_glyph_fini (cairo_scaled_glyph_private_t *glyph_private, + cairo_scaled_glyph_t *glyph, + cairo_scaled_font_t *font) +{ + cairo_xcb_glyph_private_t *priv = (cairo_xcb_glyph_private_t *)glyph_private; + + if (! font->finished) { + cairo_xcb_font_glyphset_info_t *info = priv->glyphset; + cairo_xcb_font_glyphset_free_glyphs_t *to_free; + cairo_xcb_font_t *font_private; + + font_private = _cairo_xcb_font_get (glyph_private->key, font); + assert (font_private); + + to_free = info->pending_free_glyphs; + if (to_free != NULL && + to_free->glyph_count == ARRAY_LENGTH (to_free->glyph_indices)) + { + _cairo_xcb_render_free_glyphs (font_private->connection, to_free); + to_free = info->pending_free_glyphs = NULL; + } + + if (to_free == NULL) { + to_free = malloc (sizeof (cairo_xcb_font_glyphset_free_glyphs_t)); + if (unlikely (to_free == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return; /* XXX cannot propagate failure */ + } + + to_free->glyphset = info->glyphset; + to_free->glyph_count = 0; + info->pending_free_glyphs = to_free; + } + + to_free->glyph_indices[to_free->glyph_count++] = + _cairo_scaled_glyph_index (glyph); + } + + cairo_list_del (&glyph_private->link); + free (glyph_private); +} + + +static cairo_status_t +_cairo_xcb_glyph_attach (cairo_xcb_connection_t *c, + cairo_scaled_glyph_t *glyph, + cairo_xcb_font_glyphset_info_t *info) +{ + cairo_xcb_glyph_private_t *priv; + + priv = malloc (sizeof (*priv)); + if (unlikely (priv == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_scaled_glyph_attach_private (glyph, &priv->base, c, + _cairo_xcb_glyph_fini); + priv->glyphset = info; + + glyph->dev_private = info; + glyph->dev_private_key = c; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xcb_surface_add_glyph (cairo_xcb_connection_t *connection, + cairo_scaled_font_t *font, + cairo_scaled_glyph_t **scaled_glyph_out) +{ + xcb_render_glyphinfo_t glyph_info; + uint32_t glyph_index; + uint8_t *data; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_scaled_glyph_t *scaled_glyph = *scaled_glyph_out; + cairo_image_surface_t *glyph_surface = scaled_glyph->surface; + cairo_bool_t already_had_glyph_surface; + cairo_xcb_font_glyphset_info_t *info; + + glyph_index = _cairo_scaled_glyph_index (scaled_glyph); + + /* check to see if we have a pending XRenderFreeGlyph for this glyph */ + info = _cairo_xcb_scaled_font_get_glyphset_info_for_pending_free_glyph (connection, font, glyph_index, glyph_surface); + if (info != NULL) + return _cairo_xcb_glyph_attach (connection, scaled_glyph, info); + + if (glyph_surface == NULL) { + status = _cairo_scaled_glyph_lookup (font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS | + CAIRO_SCALED_GLYPH_INFO_SURFACE, + scaled_glyph_out); + if (unlikely (status)) + return status; + + scaled_glyph = *scaled_glyph_out; + glyph_surface = scaled_glyph->surface; + already_had_glyph_surface = FALSE; + } else { + already_had_glyph_surface = TRUE; + } + + info = _cairo_xcb_scaled_font_get_glyphset_info_for_format (connection, + font, + glyph_surface->format); + if (unlikely (info == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + +#if 0 + /* If the glyph surface has zero height or width, we create + * a clear 1x1 surface, to avoid various X server bugs. + */ + if (glyph_surface->width == 0 || glyph_surface->height == 0) { + cairo_surface_t *tmp_surface; + + tmp_surface = cairo_image_surface_create (info->format, 1, 1); + status = tmp_surface->status; + if (unlikely (status)) + goto BAIL; + + tmp_surface->device_transform = glyph_surface->base.device_transform; + tmp_surface->device_transform_inverse = glyph_surface->base.device_transform_inverse; + + glyph_surface = (cairo_image_surface_t *) tmp_surface; + } +#endif + + /* If the glyph format does not match the font format, then we + * create a temporary surface for the glyph image with the font's + * format. + */ + if (glyph_surface->format != info->format) { + glyph_surface = _cairo_image_surface_coerce_to_format (glyph_surface, + info->format); + status = glyph_surface->base.status; + if (unlikely (status)) + goto BAIL; + } + + /* XXX: FRAGILE: We're ignore device_transform scaling here. A bug? */ + glyph_info.x = _cairo_lround (glyph_surface->base.device_transform.x0); + glyph_info.y = _cairo_lround (glyph_surface->base.device_transform.y0); + glyph_info.width = glyph_surface->width; + glyph_info.height = glyph_surface->height; + glyph_info.x_off = scaled_glyph->x_advance; + glyph_info.y_off = scaled_glyph->y_advance; + + data = glyph_surface->data; + + /* flip formats around */ + switch (_cairo_xcb_get_glyphset_index_for_format (scaled_glyph->surface->format)) { + case GLYPHSET_INDEX_A1: + /* local bitmaps are always stored with bit == byte */ + if (_cairo_is_little_endian() != (connection->root->bitmap_format_bit_order == XCB_IMAGE_ORDER_LSB_FIRST)) { + int c = glyph_surface->stride * glyph_surface->height; + const uint8_t *d; + uint8_t *new, *n; + + if (c == 0) + break; + + new = malloc (c); + if (unlikely (new == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + + n = new; + d = data; + do { + uint8_t b = *d++; + b = ((b << 1) & 0xaa) | ((b >> 1) & 0x55); + b = ((b << 2) & 0xcc) | ((b >> 2) & 0x33); + b = ((b << 4) & 0xf0) | ((b >> 4) & 0x0f); + *n++ = b; + } while (--c); + data = new; + } + break; + + case GLYPHSET_INDEX_A8: + break; + + case GLYPHSET_INDEX_ARGB32: + if (_cairo_is_little_endian() != (connection->root->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST)) { + unsigned int c = glyph_surface->stride * glyph_surface->height / 4; + const uint32_t *d; + uint32_t *new, *n; + + if (c == 0) + break; + + new = malloc (4 * c); + if (unlikely (new == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + + n = new; + d = (uint32_t *) data; + do { + *n++ = bswap_32 (*d); + d++; + } while (--c); + data = (uint8_t *) new; + } + break; + + default: + ASSERT_NOT_REACHED; + break; + } + /* XXX assume X server wants pixman padding. Xft assumes this as well */ + + _cairo_xcb_connection_render_add_glyphs (connection, + info->glyphset, + 1, &glyph_index, &glyph_info, + glyph_surface->stride * glyph_surface->height, + data); + + if (data != glyph_surface->data) + free (data); + + status = _cairo_xcb_glyph_attach (connection, scaled_glyph, info); + + BAIL: + if (glyph_surface != scaled_glyph->surface) + cairo_surface_destroy (&glyph_surface->base); + + /* If the scaled glyph didn't already have a surface attached + * to it, release the created surface now that we have it + * uploaded to the X server. If the surface has already been + * there (e.g. because image backend requested it), leave it in + * the cache + */ + if (! already_had_glyph_surface) + _cairo_scaled_glyph_set_surface (scaled_glyph, font, NULL); + + return status; +} + +typedef void (*cairo_xcb_render_composite_text_func_t) + (cairo_xcb_connection_t *connection, + uint8_t op, + xcb_render_picture_t src, + xcb_render_picture_t dst, + xcb_render_pictformat_t mask_format, + xcb_render_glyphset_t glyphset, + int16_t src_x, + int16_t src_y, + uint32_t len, + uint8_t *cmd); + + +static cairo_status_t +_emit_glyphs_chunk (cairo_xcb_surface_t *dst, + cairo_operator_t op, + cairo_xcb_picture_t *src, + /* info for this chunk */ + cairo_xcb_glyph_t *glyphs, + int num_glyphs, + int width, + int estimated_req_size, + cairo_xcb_font_glyphset_info_t *info, + xcb_render_pictformat_t mask_format) +{ + cairo_xcb_render_composite_text_func_t composite_text_func; + uint8_t stack_buf[CAIRO_STACK_BUFFER_SIZE]; + uint8_t *buf = stack_buf; + x_glyph_elt_t *elt = NULL; /* silence compiler */ + uint32_t len; + int i; + + if (estimated_req_size > ARRAY_LENGTH (stack_buf)) { + buf = malloc (estimated_req_size); + if (unlikely (buf == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + len = 0; + for (i = 0; i < num_glyphs; i++) { + if (_start_new_glyph_elt (i, &glyphs[i])) { + if (len & 3) + len += 4 - (len & 3); + + elt = (x_glyph_elt_t *) (buf + len); + elt->len = 0; + elt->deltax = glyphs[i].i.x; + elt->deltay = glyphs[i].i.y; + len += sizeof (x_glyph_elt_t); + } + + switch (width) { + case 1: *(uint8_t *) (buf + len) = glyphs[i].index; break; + case 2: *(uint16_t *) (buf + len) = glyphs[i].index; break; + default: + case 4: *(uint32_t *) (buf + len) = glyphs[i].index; break; + } + len += width; + elt->len++; + } + if (len & 3) + len += 4 - (len & 3); + + switch (width) { + case 1: + composite_text_func = _cairo_xcb_connection_render_composite_glyphs_8; + break; + case 2: + composite_text_func = _cairo_xcb_connection_render_composite_glyphs_16; + break; + default: + case 4: + composite_text_func = _cairo_xcb_connection_render_composite_glyphs_32; + break; + } + composite_text_func (dst->connection, + _render_operator (op), + src->picture, + dst->picture, + mask_format, + info->glyphset, + src->x + glyphs[0].i.x, + src->y + glyphs[0].i.y, + len, buf); + + if (buf != stack_buf) + free (buf); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_composite_glyphs (void *closure, + cairo_xcb_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_clip_t *clip) +{ + composite_glyphs_info_t *info = closure; + cairo_scaled_glyph_t *glyph_cache[64]; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_fixed_t x = 0, y = 0; + cairo_xcb_font_glyphset_info_t *glyphset_info = NULL, *this_glyphset_info; + const unsigned int max_request_size = dst->connection->maximum_request_length - 64; + cairo_xcb_picture_t *src; + + unsigned long max_index = 0; + int width = 1; + + unsigned int request_size = 0; + int i; + + if (dst->deferred_clear) { + status = _cairo_xcb_surface_clear (dst); + if (unlikely (status)) + return status; + } + + src = _cairo_xcb_picture_for_pattern (dst, pattern, extents); + if (unlikely (src->base.status)) + return src->base.status; + + memset (glyph_cache, 0, sizeof (glyph_cache)); + + for (i = 0; i < info->num_glyphs; i++) { + cairo_scaled_glyph_t *glyph; + unsigned long glyph_index = info->glyphs[i].index; + int cache_index = glyph_index % ARRAY_LENGTH (glyph_cache); + int old_width = width; + int this_x, this_y; + + glyph = glyph_cache[cache_index]; + if (glyph == NULL || + _cairo_scaled_glyph_index (glyph) != glyph_index) + { + status = _cairo_scaled_glyph_lookup (info->font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &glyph); + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return status; + } + + /* Send unseen glyphs to the server */ + if (glyph->dev_private_key != dst->connection) { + status = _cairo_xcb_surface_add_glyph (dst->connection, + info->font, + &glyph); + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return status; + } + } + + glyph_cache[cache_index] = glyph; + } + + this_x = _cairo_lround (info->glyphs[i].d.x) - dst_x; + this_y = _cairo_lround (info->glyphs[i].d.y) - dst_y; + + this_glyphset_info = glyph->dev_private; + if (glyphset_info == NULL) + glyphset_info = this_glyphset_info; + + /* Update max glyph index */ + if (glyph_index > max_index) { + max_index = glyph_index; + if (max_index >= 65536) + width = 4; + else if (max_index >= 256) + width = 2; + if (width != old_width) + request_size += (width - old_width) * i; + } + + /* If we will pass the max request size by adding this glyph, + * flush current glyphs. Note that we account for a + * possible element being added below. + * + * Also flush if changing glyphsets, as Xrender limits one mask + * format per request, so we can either break up, or use a + * wide-enough mask format. We do the former. One reason to + * prefer the latter is the fact that Xserver ADDs all glyphs + * to the mask first, and then composes that to final surface, + * though it's not a big deal. + * + * If the glyph has a coordinate which cannot be represented + * as a 16-bit offset from the previous glyph, flush the + * current chunk. The current glyph will be the first one in + * the next chunk, thus its coordinates will be an offset from + * the destination origin. This offset is guaranteed to be + * representable as 16-bit offset in _can_composite_glyphs(). + */ + if (request_size + width > max_request_size - _cairo_sz_x_glyph_elt_t || + this_x - x > INT16_MAX || this_x - x < INT16_MIN || + this_y - y > INT16_MAX || this_y - y < INT16_MIN || + this_glyphset_info != glyphset_info) + { + status = _emit_glyphs_chunk (dst, op, src, + info->glyphs, i, + old_width, request_size, + glyphset_info, + info->use_mask ? glyphset_info->xrender_format : 0); + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return status; + } + + info->glyphs += i; + info->num_glyphs -= i; + i = 0; + + max_index = info->glyphs[0].index; + width = max_index < 256 ? 1 : max_index < 65536 ? 2 : 4; + + request_size = 0; + + x = y = 0; + glyphset_info = this_glyphset_info; + } + + /* Convert absolute glyph position to relative-to-current-point + * position */ + info->glyphs[i].i.x = this_x - x; + info->glyphs[i].i.y = this_y - y; + + /* Start a new element for the first glyph, + * or for any glyph that has unexpected position, + * or if current element has too many glyphs. + * + * These same conditions are mirrored in _emit_glyphs_chunk(). + */ + if (_start_new_glyph_elt (i, &info->glyphs[i])) + request_size += _cairo_sz_x_glyph_elt_t; + + /* adjust current-position */ + x = this_x + glyph->x_advance; + y = this_y + glyph->y_advance; + + request_size += width; + } + + if (i) { + status = _emit_glyphs_chunk (dst, op, src, + info->glyphs, i, + width, request_size, + glyphset_info, + info->use_mask ? glyphset_info->xrender_format : 0); + } + + cairo_surface_destroy (&src->base); + + return status; +} + +cairo_int_status_t +_cairo_xcb_render_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; + cairo_int_status_t status; + + if (unlikely (! _operator_is_supported (surface->connection->flags, op))) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if ((surface->connection->flags & (CAIRO_XCB_RENDER_HAS_COMPOSITE_GLYPHS | CAIRO_XCB_RENDER_HAS_COMPOSITE)) == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE_GLYPHS) { + _cairo_scaled_font_freeze_cache (scaled_font); + + status = _can_composite_glyphs (surface, &composite->bounded, + scaled_font, glyphs, &num_glyphs); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) { + composite_glyphs_info_t info; + unsigned flags = 0; + + info.font = scaled_font; + info.glyphs = (cairo_xcb_glyph_t *) glyphs; + info.num_glyphs = num_glyphs; + info.use_mask = + overlap || + ! composite->is_bounded || + ! _cairo_clip_is_region(composite->clip); + + if (composite->mask.width > composite->unbounded.width || + composite->mask.height > composite->unbounded.height) + { + /* Glyphs are tricky since we do not directly control the + * geometry and their inked extents depend on the + * individual glyph-surface size. We must set a clip region + * so that the X server can trim the glyphs appropriately. + */ + flags |= FORCE_CLIP_REGION; + } + status = _clip_and_composite (surface, op, source, + _composite_glyphs, NULL, + &info, composite, + need_bounded_clip (composite) | + flags); + } + + _cairo_scaled_font_thaw_cache (scaled_font); + } + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + assert (surface->connection->flags & CAIRO_XCB_RENDER_HAS_COMPOSITE); + status = + _cairo_xcb_surface_render_glyphs_via_mask (surface, op, source, + scaled_font, glyphs, num_glyphs, + composite); + } + + return status; +} diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c new file mode 100644 index 000000000..d7e0d734e --- /dev/null +++ b/src/cairo-xcb-surface.c @@ -0,0 +1,1530 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Behdad Esfahbod + * Carl D. Worth + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +#include "cairoint.h" + +#include "cairo-xcb.h" +#include "cairo-xcb-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-default-context-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-list-inline.h" +#include "cairo-surface-backend-private.h" +#include "cairo-compositor-private.h" + +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_proto (cairo_xcb_surface_create); +slim_hidden_proto (cairo_xcb_surface_create_for_bitmap); +slim_hidden_proto (cairo_xcb_surface_create_with_xrender_format); +#endif + +/** + * SECTION:cairo-xcb + * @Title: XCB Surfaces + * @Short_Description: X Window System rendering using the XCB library + * @See_Also: #cairo_surface_t + * + * The XCB surface is used to render cairo graphics to X Window System + * windows and pixmaps using the XCB library. + * + * Note that the XCB surface automatically takes advantage of the X render + * extension if it is available. + **/ + +/** + * CAIRO_HAS_XCB_SURFACE: + * + * Defined if the xcb surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.12 + **/ + +cairo_surface_t * +_cairo_xcb_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, + int height) +{ + cairo_xcb_surface_t *other = abstract_other; + cairo_xcb_surface_t *surface; + cairo_xcb_connection_t *connection; + xcb_pixmap_t pixmap; + cairo_status_t status; + + if (unlikely(width > XLIB_COORD_MAX || + height > XLIB_COORD_MAX || + width <= 0 || + height <= 0)) + return cairo_image_surface_create (_cairo_format_from_content (content), + width, height); + + if ((other->connection->flags & CAIRO_XCB_HAS_RENDER) == 0) + return _cairo_xcb_surface_create_similar_image (other, + _cairo_format_from_content (content), + width, height); + + connection = other->connection; + status = _cairo_xcb_connection_acquire (connection); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (content == other->base.content) { + pixmap = _cairo_xcb_connection_create_pixmap (connection, + other->depth, + other->drawable, + width, height); + + surface = (cairo_xcb_surface_t *) + _cairo_xcb_surface_create_internal (other->screen, + pixmap, TRUE, + other->pixman_format, + other->xrender_format, + width, height); + } else { + cairo_format_t format; + pixman_format_code_t pixman_format; + + /* XXX find a compatible xrender format */ + switch (content) { + case CAIRO_CONTENT_ALPHA: + pixman_format = PIXMAN_a8; + format = CAIRO_FORMAT_A8; + break; + case CAIRO_CONTENT_COLOR: + pixman_format = PIXMAN_x8r8g8b8; + format = CAIRO_FORMAT_RGB24; + break; + default: + ASSERT_NOT_REACHED; + case CAIRO_CONTENT_COLOR_ALPHA: + pixman_format = PIXMAN_a8r8g8b8; + format = CAIRO_FORMAT_ARGB32; + break; + } + + pixmap = _cairo_xcb_connection_create_pixmap (connection, + PIXMAN_FORMAT_DEPTH (pixman_format), + other->drawable, + width, height); + + surface = (cairo_xcb_surface_t *) + _cairo_xcb_surface_create_internal (other->screen, + pixmap, TRUE, + pixman_format, + connection->standard_formats[format], + width, height); + } + + if (unlikely (surface->base.status)) + _cairo_xcb_connection_free_pixmap (connection, pixmap); + + _cairo_xcb_connection_release (connection); + + return &surface->base; +} + +cairo_surface_t * +_cairo_xcb_surface_create_similar_image (void *abstract_other, + cairo_format_t format, + int width, + int height) +{ + cairo_xcb_surface_t *other = abstract_other; + cairo_xcb_connection_t *connection = other->connection; + + cairo_xcb_shm_info_t *shm_info; + cairo_image_surface_t *image; + cairo_status_t status; + pixman_format_code_t pixman_format; + + if (unlikely(width > XLIB_COORD_MAX || + height > XLIB_COORD_MAX || + width <= 0 || + height <= 0)) + return NULL; + + pixman_format = _cairo_format_to_pixman_format_code (format); + + status = _cairo_xcb_shm_image_create (connection, pixman_format, + width, height, &image, + &shm_info); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (! image->base.is_clear) { + memset (image->data, 0, image->stride * image->height); + image->base.is_clear = TRUE; + } + + return &image->base; +} + +static cairo_status_t +_cairo_xcb_surface_finish (void *abstract_surface) +{ + cairo_xcb_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (surface->fallback != NULL) { + cairo_surface_finish (&surface->fallback->base); + cairo_surface_destroy (&surface->fallback->base); + } + _cairo_boxes_fini (&surface->fallback_damage); + + cairo_list_del (&surface->link); + + status = _cairo_xcb_connection_acquire (surface->connection); + if (status == CAIRO_STATUS_SUCCESS) { + if (surface->picture != XCB_NONE) { + _cairo_xcb_connection_render_free_picture (surface->connection, + surface->picture); + } + + if (surface->owns_pixmap) + _cairo_xcb_connection_free_pixmap (surface->connection, surface->drawable); + _cairo_xcb_connection_release (surface->connection); + } + + _cairo_xcb_connection_destroy (surface->connection); + + return status; +} + +static void +_destroy_image (pixman_image_t *image, void *data) +{ + free (data); +} + +#if CAIRO_HAS_XCB_SHM_FUNCTIONS +static cairo_surface_t * +_cairo_xcb_surface_create_shm_image (cairo_xcb_connection_t *connection, + pixman_format_code_t pixman_format, + int width, int height, + cairo_bool_t might_reuse, + cairo_xcb_shm_info_t **shm_info_out) +{ + cairo_surface_t *image; + cairo_xcb_shm_info_t *shm_info; + cairo_int_status_t status; + size_t stride; + + *shm_info_out = NULL; + + stride = CAIRO_STRIDE_FOR_WIDTH_BPP (width, + PIXMAN_FORMAT_BPP (pixman_format)); + status = _cairo_xcb_connection_allocate_shm_info (connection, + stride * height, + might_reuse, + &shm_info); + if (unlikely (status)) { + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + return NULL; + + return _cairo_surface_create_in_error (status); + } + + image = _cairo_image_surface_create_with_pixman_format (shm_info->mem, + pixman_format, + width, height, + stride); + if (unlikely (image->status)) { + _cairo_xcb_shm_info_destroy (shm_info); + return image; + } + + status = _cairo_user_data_array_set_data (&image->user_data, + (const cairo_user_data_key_t *) connection, + shm_info, + (cairo_destroy_func_t) _cairo_xcb_shm_info_destroy); + if (unlikely (status)) { + cairo_surface_destroy (image); + _cairo_xcb_shm_info_destroy (shm_info); + return _cairo_surface_create_in_error (status); + } + + *shm_info_out = shm_info; + return image; +} +#endif + +static cairo_surface_t * +_get_shm_image (cairo_xcb_surface_t *surface, + int x, int y, + int width, int height) +{ +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + cairo_xcb_shm_info_t *shm_info; + cairo_surface_t *image; + cairo_status_t status; + + if ((surface->connection->flags & CAIRO_XCB_HAS_SHM) == 0) + return NULL; + + image = _cairo_xcb_surface_create_shm_image (surface->connection, + surface->pixman_format, + width, height, + TRUE, + &shm_info); + if (unlikely (image == NULL || image->status)) + goto done; + + status = _cairo_xcb_connection_shm_get_image (surface->connection, + surface->drawable, + x, y, + width, height, + shm_info->shm, + shm_info->offset); + if (unlikely (status)) { + cairo_surface_destroy (image); + image = _cairo_surface_create_in_error (status); + } + +done: + return image; +#else + return NULL; +#endif +} + +static cairo_surface_t * +_get_image (cairo_xcb_surface_t *surface, + cairo_bool_t use_shm, + int x, int y, + int width, int height) +{ + cairo_surface_t *image; + cairo_xcb_connection_t *connection; + xcb_get_image_reply_t *reply; + cairo_int_status_t status; + + assert (surface->fallback == NULL); + assert (x >= 0); + assert (y >= 0); + assert (x + width <= surface->width); + assert (y + height <= surface->height); + + if (surface->deferred_clear) { + image = + _cairo_image_surface_create_with_pixman_format (NULL, + surface->pixman_format, + width, height, + 0); + if (surface->deferred_clear_color.alpha_short > 0x00ff) { + cairo_solid_pattern_t solid; + + _cairo_pattern_init_solid (&solid, &surface->deferred_clear_color); + status = _cairo_surface_paint (image, + CAIRO_OPERATOR_SOURCE, + &solid.base, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (image); + image = _cairo_surface_create_in_error (status); + } + } + return image; + } + + connection = surface->connection; + + status = _cairo_xcb_connection_acquire (connection); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (use_shm) { + image = _get_shm_image (surface, x, y, width, height); + if (image) { + if (image->status == CAIRO_STATUS_SUCCESS) { + _cairo_xcb_connection_release (connection); + return image; + } + cairo_surface_destroy (image); + } + } + + reply =_cairo_xcb_connection_get_image (connection, + surface->drawable, + x, y, + width, height); + + if (reply == NULL && ! surface->owns_pixmap) { + /* xcb_get_image_t from a window is dangerous because it can + * produce errors if the window is unmapped or partially + * outside the screen. We could check for errors and + * retry, but to keep things simple, we just create a + * temporary pixmap + * + * If we hit this fallback too often, we should remember so and + * skip the round-trip from the above GetImage request, + * similar to what cairo-xlib does. + */ + xcb_pixmap_t pixmap; + xcb_gcontext_t gc; + + gc = _cairo_xcb_screen_get_gc (surface->screen, + surface->drawable, + surface->depth); + pixmap = _cairo_xcb_connection_create_pixmap (connection, + surface->depth, + surface->drawable, + width, height); + + /* XXX IncludeInferiors? */ + _cairo_xcb_connection_copy_area (connection, + surface->drawable, + pixmap, gc, + x, y, + 0, 0, + width, height); + + _cairo_xcb_screen_put_gc (surface->screen, surface->depth, gc); + + reply = _cairo_xcb_connection_get_image (connection, + pixmap, + 0, 0, + width, height); + _cairo_xcb_connection_free_pixmap (connection, pixmap); + } + + if (unlikely (reply == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL; + } + + /* XXX byte swap */ + /* XXX format conversion */ + assert (reply->depth == surface->depth); + + image = _cairo_image_surface_create_with_pixman_format + (xcb_get_image_data (reply), + surface->pixman_format, + width, height, + CAIRO_STRIDE_FOR_WIDTH_BPP (width, + PIXMAN_FORMAT_BPP (surface->pixman_format))); + status = image->status; + if (unlikely (status)) { + free (reply); + goto FAIL; + } + + /* XXX */ + pixman_image_set_destroy_function (((cairo_image_surface_t *)image)->pixman_image, _destroy_image, reply); + + _cairo_xcb_connection_release (connection); + + return image; + +FAIL: + _cairo_xcb_connection_release (connection); + return _cairo_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_xcb_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_xcb_surface_t *surface = abstract_surface; + + if (extents) { + extents->x = extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + } + + return &surface->base; +} + +static cairo_status_t +_cairo_xcb_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_xcb_surface_t *surface = abstract_surface; + cairo_surface_t *image; + + if (surface->fallback != NULL) { + image = cairo_surface_reference (&surface->fallback->base); + goto DONE; + } + + image = _cairo_surface_has_snapshot (&surface->base, + &_cairo_image_surface_backend); + if (image != NULL) { + image = cairo_surface_reference (image); + goto DONE; + } + + image = _get_image (surface, FALSE, 0, 0, surface->width, surface->height); + if (unlikely (image->status)) + return image->status; + + _cairo_surface_attach_snapshot (&surface->base, image, NULL); + +DONE: + *image_out = (cairo_image_surface_t *) image; + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_xcb_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +cairo_bool_t +_cairo_xcb_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_xcb_surface_t *surface = abstract_surface; + + extents->x = extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + return TRUE; +} + +static void +_cairo_xcb_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_xcb_surface_t *surface = abstract_surface; + + *options = *_cairo_xcb_screen_get_font_options (surface->screen); +} + +static cairo_status_t +_put_shm_image (cairo_xcb_surface_t *surface, + xcb_gcontext_t gc, + cairo_image_surface_t *image) +{ +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + cairo_xcb_shm_info_t *shm_info; + + shm_info = _cairo_user_data_array_get_data (&image->base.user_data, + (const cairo_user_data_key_t *) surface->connection); + if (shm_info == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_xcb_connection_shm_put_image (surface->connection, + surface->drawable, + gc, + surface->width, surface->height, + 0, 0, + image->width, image->height, + image->base.device_transform_inverse.x0, + image->base.device_transform_inverse.y0, + image->depth, + shm_info->shm, + shm_info->offset); + + return CAIRO_STATUS_SUCCESS; +#else + return CAIRO_INT_STATUS_UNSUPPORTED; +#endif +} + +static cairo_status_t +_put_image (cairo_xcb_surface_t *surface, + cairo_image_surface_t *image) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + + /* XXX track damaged region? */ + + status = _cairo_xcb_connection_acquire (surface->connection); + if (unlikely (status)) + return status; + + if (image->pixman_format == surface->pixman_format) { + xcb_gcontext_t gc; + + assert (image->depth == surface->depth); + assert (image->stride == (int) CAIRO_STRIDE_FOR_WIDTH_BPP (image->width, PIXMAN_FORMAT_BPP (image->pixman_format))); + + gc = _cairo_xcb_screen_get_gc (surface->screen, + surface->drawable, + surface->depth); + + status = _put_shm_image (surface, gc, image); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + _cairo_xcb_connection_put_image (surface->connection, + surface->drawable, gc, + image->width, image->height, + image->base.device_transform_inverse.x0, + image->base.device_transform_inverse.y0, + image->depth, + image->stride, + image->data); + status = CAIRO_STATUS_SUCCESS; + } + + _cairo_xcb_screen_put_gc (surface->screen, surface->depth, gc); + } else { + ASSERT_NOT_REACHED; + } + + _cairo_xcb_connection_release (surface->connection); + return status; +} + +static cairo_int_status_t +_put_shm_image_boxes (cairo_xcb_surface_t *surface, + cairo_image_surface_t *image, + xcb_gcontext_t gc, + cairo_boxes_t *boxes) +{ +#if CAIRO_HAS_XCB_SHM_FUNCTIONS + cairo_xcb_shm_info_t *shm_info; + + shm_info = _cairo_user_data_array_get_data (&image->base.user_data, + (const cairo_user_data_key_t *) surface->connection); + if (shm_info != NULL) { + struct _cairo_boxes_chunk *chunk; + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + int i; + + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + int x = _cairo_fixed_integer_part (b->p1.x); + int y = _cairo_fixed_integer_part (b->p1.y); + int width = _cairo_fixed_integer_part (b->p2.x - b->p1.x); + int height = _cairo_fixed_integer_part (b->p2.y - b->p1.y); + + _cairo_xcb_connection_shm_put_image (surface->connection, + surface->drawable, + gc, + surface->width, surface->height, + x, y, + width, height, + x, y, + image->depth, + shm_info->shm, + shm_info->offset); + } + } + } + + return CAIRO_INT_STATUS_SUCCESS; +#endif + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_status_t +_put_image_boxes (cairo_xcb_surface_t *surface, + cairo_image_surface_t *image, + cairo_boxes_t *boxes) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + xcb_gcontext_t gc; + + if (boxes->num_boxes == 0) + return CAIRO_STATUS_SUCCESS; + + /* XXX track damaged region? */ + + status = _cairo_xcb_connection_acquire (surface->connection); + if (unlikely (status)) + return status; + + assert (image->pixman_format == surface->pixman_format); + assert (image->depth == surface->depth); + assert (image->stride == (int) CAIRO_STRIDE_FOR_WIDTH_BPP (image->width, PIXMAN_FORMAT_BPP (image->pixman_format))); + + gc = _cairo_xcb_screen_get_gc (surface->screen, + surface->drawable, + surface->depth); + + status = _put_shm_image_boxes (surface, image, gc, boxes); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + struct _cairo_boxes_chunk *chunk; + + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + int i; + + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + int x = _cairo_fixed_integer_part (b->p1.x); + int y = _cairo_fixed_integer_part (b->p1.y); + int width = _cairo_fixed_integer_part (b->p2.x - b->p1.x); + int height = _cairo_fixed_integer_part (b->p2.y - b->p1.y); + _cairo_xcb_connection_put_image (surface->connection, + surface->drawable, gc, + width, height, + x, y, + image->depth, + image->stride, + image->data + + x * PIXMAN_FORMAT_BPP (image->pixman_format) / 8 + + y * image->stride); + + } + } + status = CAIRO_STATUS_SUCCESS; + } + + _cairo_xcb_screen_put_gc (surface->screen, surface->depth, gc); + _cairo_xcb_connection_release (surface->connection); + return status; +} + +static cairo_status_t +_cairo_xcb_surface_flush (void *abstract_surface, + unsigned flags) +{ + cairo_xcb_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (likely (surface->fallback == NULL)) { + status = CAIRO_STATUS_SUCCESS; + if (! surface->base.finished && surface->deferred_clear) + status = _cairo_xcb_surface_clear (surface); + + return status; + } + + status = surface->base.status; + if (status == CAIRO_STATUS_SUCCESS && + (! surface->base._finishing || ! surface->owns_pixmap)) { + status = cairo_surface_status (&surface->fallback->base); + + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_bentley_ottmann_tessellate_boxes (&surface->fallback_damage, + CAIRO_FILL_RULE_WINDING, + &surface->fallback_damage); + + if (status == CAIRO_STATUS_SUCCESS) + status = _put_image_boxes (surface, + surface->fallback, + &surface->fallback_damage); + + if (status == CAIRO_STATUS_SUCCESS && ! surface->base._finishing) { + _cairo_surface_attach_snapshot (&surface->base, + &surface->fallback->base, + cairo_surface_finish); + } + } + + _cairo_boxes_clear (&surface->fallback_damage); + cairo_surface_destroy (&surface->fallback->base); + surface->fallback = NULL; + + return status; +} + +static cairo_image_surface_t * +_cairo_xcb_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_xcb_surface_t *surface = abstract_surface; + cairo_surface_t *image; + cairo_status_t status; + + if (surface->fallback) + return _cairo_surface_map_to_image (&surface->fallback->base, extents); + + image = _get_image (surface, TRUE, + extents->x, extents->y, + extents->width, extents->height); + status = cairo_surface_status (image); + if (unlikely (status)) { + cairo_surface_destroy(image); + return _cairo_image_surface_create_in_error (status); + } + + /* Do we have a deferred clear and this image surface does NOT cover the + * whole xcb surface? Have to apply the clear in that case, else + * uploading the image will handle the problem for us. + */ + if (surface->deferred_clear && + ! (extents->width == surface->width && + extents->height == surface->height)) { + status = _cairo_xcb_surface_clear (surface); + if (unlikely (status)) { + cairo_surface_destroy(image); + return _cairo_image_surface_create_in_error (status); + } + } + surface->deferred_clear = FALSE; + + cairo_surface_set_device_offset (image, -extents->x, -extents->y); + return (cairo_image_surface_t *) image; +} + +static cairo_int_status_t +_cairo_xcb_surface_unmap (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_xcb_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + if (surface->fallback) + return _cairo_surface_unmap_image (&surface->fallback->base, image); + + status = _put_image (abstract_surface, image); + + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return status; +} + +static cairo_surface_t * +_cairo_xcb_surface_fallback (cairo_xcb_surface_t *surface, + cairo_composite_rectangles_t *composite) +{ + cairo_image_surface_t *image; + cairo_status_t status; + + status = _cairo_composite_rectangles_add_to_damage (composite, + &surface->fallback_damage); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (surface->fallback) + return &surface->fallback->base; + + image = (cairo_image_surface_t *) + _get_image (surface, TRUE, 0, 0, surface->width, surface->height); + + /* If there was a deferred clear, _get_image applied it */ + if (image->base.status == CAIRO_STATUS_SUCCESS) { + surface->deferred_clear = FALSE; + + surface->fallback = image; + } + + return &surface->fallback->base; +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_paint (fallback, extents->op, + &extents->source_pattern.base, + extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_mask (fallback, extents->op, + &extents->source_pattern.base, + &extents->mask_pattern.base, + extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_stroke (fallback, extents->op, + &extents->source_pattern.base, + path, style, ctm, ctm_inverse, + tolerance, antialias, + extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_fill (fallback, extents->op, + &extents->source_pattern.base, + path, fill_rule, tolerance, + antialias, extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_show_text_glyphs (fallback, extents->op, + &extents->source_pattern.base, + NULL, 0, glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, extents->clip); +} + +static const cairo_compositor_t _cairo_xcb_fallback_compositor = { + &__cairo_no_compositor, + + _cairo_xcb_fallback_compositor_paint, + _cairo_xcb_fallback_compositor_mask, + _cairo_xcb_fallback_compositor_stroke, + _cairo_xcb_fallback_compositor_fill, + _cairo_xcb_fallback_compositor_glyphs, +}; + +static const cairo_compositor_t _cairo_xcb_render_compositor = { + &_cairo_xcb_fallback_compositor, + + _cairo_xcb_render_compositor_paint, + _cairo_xcb_render_compositor_mask, + _cairo_xcb_render_compositor_stroke, + _cairo_xcb_render_compositor_fill, + _cairo_xcb_render_compositor_glyphs, +}; + +static inline const cairo_compositor_t * +get_compositor (cairo_surface_t **s) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t * )*s; + if (surface->fallback) { + *s = &surface->fallback->base; + return ((cairo_image_surface_t *) *s)->compositor; + } + + return &_cairo_xcb_render_compositor; +} + +static cairo_int_status_t +_cairo_xcb_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_paint (compositor, surface, op, source, clip); +} + +static cairo_int_status_t +_cairo_xcb_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_mask (compositor, surface, op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_xcb_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_stroke (compositor, surface, op, source, + path, style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +_cairo_xcb_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_fill (compositor, surface, op, + source, path, fill_rule, + tolerance, antialias, clip); +} + +static cairo_int_status_t +_cairo_xcb_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_glyphs (compositor, surface, op, + source, glyphs, num_glyphs, + scaled_font, clip); +} + +const cairo_surface_backend_t _cairo_xcb_surface_backend = { + CAIRO_SURFACE_TYPE_XCB, + _cairo_xcb_surface_finish, + _cairo_default_context_create, + + _cairo_xcb_surface_create_similar, + _cairo_xcb_surface_create_similar_image, + _cairo_xcb_surface_map_to_image, + _cairo_xcb_surface_unmap, + + _cairo_xcb_surface_source, + _cairo_xcb_surface_acquire_source_image, + _cairo_xcb_surface_release_source_image, + NULL, /* snapshot */ + + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_xcb_surface_get_extents, + _cairo_xcb_surface_get_font_options, + + _cairo_xcb_surface_flush, + NULL, + + _cairo_xcb_surface_paint, + _cairo_xcb_surface_mask, + _cairo_xcb_surface_stroke, + _cairo_xcb_surface_fill, + NULL, /* fill-stroke */ + _cairo_xcb_surface_glyphs, +}; + +cairo_surface_t * +_cairo_xcb_surface_create_internal (cairo_xcb_screen_t *screen, + xcb_drawable_t drawable, + cairo_bool_t owns_pixmap, + pixman_format_code_t pixman_format, + xcb_render_pictformat_t xrender_format, + int width, + int height) +{ + cairo_xcb_surface_t *surface; + + surface = malloc (sizeof (cairo_xcb_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_xcb_surface_backend, + &screen->connection->device, + _cairo_content_from_pixman_format (pixman_format)); + + surface->connection = _cairo_xcb_connection_reference (screen->connection); + surface->screen = screen; + cairo_list_add (&surface->link, &screen->surfaces); + + surface->drawable = drawable; + surface->owns_pixmap = owns_pixmap; + + surface->deferred_clear = FALSE; + surface->deferred_clear_color = *CAIRO_COLOR_TRANSPARENT; + + surface->width = width; + surface->height = height; + surface->depth = PIXMAN_FORMAT_DEPTH (pixman_format); + + surface->picture = XCB_NONE; + if (screen->connection->force_precision != -1) + surface->precision = screen->connection->force_precision; + else + surface->precision = XCB_RENDER_POLY_MODE_IMPRECISE; + + surface->pixman_format = pixman_format; + surface->xrender_format = xrender_format; + + surface->fallback = NULL; + _cairo_boxes_init (&surface->fallback_damage); + + return &surface->base; +} + +static xcb_screen_t * +_cairo_xcb_screen_from_visual (xcb_connection_t *connection, + xcb_visualtype_t *visual, + int *depth) +{ + xcb_depth_iterator_t d; + xcb_screen_iterator_t s; + + s = xcb_setup_roots_iterator (xcb_get_setup (connection)); + for (; s.rem; xcb_screen_next (&s)) { + if (s.data->root_visual == visual->visual_id) { + *depth = s.data->root_depth; + return s.data; + } + + d = xcb_screen_allowed_depths_iterator(s.data); + for (; d.rem; xcb_depth_next (&d)) { + xcb_visualtype_iterator_t v = xcb_depth_visuals_iterator (d.data); + + for (; v.rem; xcb_visualtype_next (&v)) { + if (v.data->visual_id == visual->visual_id) { + *depth = d.data->depth; + return s.data; + } + } + } + } + + return NULL; +} + +/** + * cairo_xcb_surface_create: + * @connection: an XCB connection + * @drawable: an XCB drawable + * @visual: the visual to use for drawing to @drawable. The depth + * of the visual must match the depth of the drawable. + * Currently, only TrueColor visuals are fully supported. + * @width: the current width of @drawable + * @height: the current height of @drawable + * + * Creates an XCB surface that draws to the given drawable. + * The way that colors are represented in the drawable is specified + * by the provided visual. + * + * Note: If @drawable is a Window, then the function + * cairo_xcb_surface_set_size() must be called whenever the size of the + * window changes. + * + * When @drawable is a Window containing child windows then drawing to + * the created surface will be clipped by those child windows. When + * the created surface is used as a source, the contents of the + * children will be included. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_xcb_surface_create (xcb_connection_t *connection, + xcb_drawable_t drawable, + xcb_visualtype_t *visual, + int width, + int height) +{ + cairo_xcb_screen_t *screen; + xcb_screen_t *xcb_screen; + cairo_format_masks_t image_masks; + pixman_format_code_t pixman_format; + xcb_render_pictformat_t xrender_format; + int depth; + + if (xcb_connection_has_error (connection)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_WRITE_ERROR)); + + if (unlikely (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + if (unlikely (width <= 0 || height <= 0)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + xcb_screen = _cairo_xcb_screen_from_visual (connection, visual, &depth); + if (unlikely (xcb_screen == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL)); + + image_masks.alpha_mask = 0; + image_masks.red_mask = visual->red_mask; + image_masks.green_mask = visual->green_mask; + image_masks.blue_mask = visual->blue_mask; + if (depth == 32) /* XXX visuals have no alpha! */ + image_masks.alpha_mask = + 0xffffffff & ~(visual->red_mask | visual->green_mask | visual->blue_mask); + if (depth > 16) + image_masks.bpp = 32; + else if (depth > 8) + image_masks.bpp = 16; + else if (depth > 1) + image_masks.bpp = 8; + else + image_masks.bpp = 1; + + if (! _pixman_format_from_masks (&image_masks, &pixman_format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + screen = _cairo_xcb_screen_get (connection, xcb_screen); + if (unlikely (screen == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + xrender_format = + _cairo_xcb_connection_get_xrender_format_for_visual (screen->connection, + visual->visual_id); + + return _cairo_xcb_surface_create_internal (screen, drawable, FALSE, + pixman_format, + xrender_format, + width, height); +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_surface_create); +#endif + +/** + * cairo_xcb_surface_create_for_bitmap: + * @connection: an XCB connection + * @screen: the XCB screen associated with @bitmap + * @bitmap: an XCB drawable (a Pixmap with depth 1) + * @width: the current width of @bitmap + * @height: the current height of @bitmap + * + * Creates an XCB surface that draws to the given bitmap. + * This will be drawn to as a %CAIRO_FORMAT_A1 object. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_xcb_surface_create_for_bitmap (xcb_connection_t *connection, + xcb_screen_t *screen, + xcb_pixmap_t bitmap, + int width, + int height) +{ + cairo_xcb_screen_t *cairo_xcb_screen; + + if (xcb_connection_has_error (connection)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_WRITE_ERROR)); + + if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + if (unlikely (width <= 0 || height <= 0)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + cairo_xcb_screen = _cairo_xcb_screen_get (connection, screen); + if (unlikely (cairo_xcb_screen == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + return _cairo_xcb_surface_create_internal (cairo_xcb_screen, bitmap, FALSE, + PIXMAN_a1, + cairo_xcb_screen->connection->standard_formats[CAIRO_FORMAT_A1], + width, height); +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_surface_create_for_bitmap); +#endif + +/** + * cairo_xcb_surface_create_with_xrender_format: + * @connection: an XCB connection + * @drawable: an XCB drawable + * @screen: the XCB screen associated with @drawable + * @format: the picture format to use for drawing to @drawable. The + * depth of @format mush match the depth of the drawable. + * @width: the current width of @drawable + * @height: the current height of @drawable + * + * Creates an XCB surface that draws to the given drawable. + * The way that colors are represented in the drawable is specified + * by the provided picture format. + * + * Note: If @drawable is a Window, then the function + * cairo_xcb_surface_set_size() must be called whenever the size of the + * window changes. + * + * When @drawable is a Window containing child windows then drawing to + * the created surface will be clipped by those child windows. When + * the created surface is used as a source, the contents of the + * children will be included. + * + * Return value: a pointer to the newly created surface. The caller + * owns the surface and should call cairo_surface_destroy() when done + * with it. + * + * This function always returns a valid pointer, but it will return a + * pointer to a "nil" surface if an error such as out of memory + * occurs. You can use cairo_surface_status() to check for this. + * + * Since: 1.12 + **/ +cairo_surface_t * +cairo_xcb_surface_create_with_xrender_format (xcb_connection_t *connection, + xcb_screen_t *screen, + xcb_drawable_t drawable, + xcb_render_pictforminfo_t *format, + int width, + int height) +{ + cairo_xcb_screen_t *cairo_xcb_screen; + cairo_format_masks_t image_masks; + pixman_format_code_t pixman_format; + + if (xcb_connection_has_error (connection)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_WRITE_ERROR)); + + if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + if (unlikely (width <= 0 || height <= 0)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + image_masks.alpha_mask = + (unsigned long) format->direct.alpha_mask << format->direct.alpha_shift; + image_masks.red_mask = + (unsigned long) format->direct.red_mask << format->direct.red_shift; + image_masks.green_mask = + (unsigned long) format->direct.green_mask << format->direct.green_shift; + image_masks.blue_mask = + (unsigned long) format->direct.blue_mask << format->direct.blue_shift; +#if 0 + image_masks.bpp = format->depth; +#else + if (format->depth > 16) + image_masks.bpp = 32; + else if (format->depth > 8) + image_masks.bpp = 16; + else if (format->depth > 1) + image_masks.bpp = 8; + else + image_masks.bpp = 1; +#endif + + if (! _pixman_format_from_masks (&image_masks, &pixman_format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + cairo_xcb_screen = _cairo_xcb_screen_get (connection, screen); + if (unlikely (cairo_xcb_screen == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + return _cairo_xcb_surface_create_internal (cairo_xcb_screen, + drawable, + FALSE, + pixman_format, + format->id, + width, height); +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_surface_create_with_xrender_format); +#endif + +/* This does the necessary fixup when a surface's drawable or size changed. */ +static void +_drawable_changed (cairo_xcb_surface_t *surface) +{ + _cairo_surface_set_error (&surface->base, + _cairo_surface_begin_modification (&surface->base)); + _cairo_boxes_clear (&surface->fallback_damage); + cairo_surface_destroy (&surface->fallback->base); + + surface->deferred_clear = FALSE; + surface->fallback = NULL; +} + +/** + * cairo_xcb_surface_set_size: + * @surface: a #cairo_surface_t for the XCB backend + * @width: the new width of the surface + * @height: the new height of the surface + * + * Informs cairo of the new size of the XCB drawable underlying the + * surface. For a surface created for a window (rather than a pixmap), + * this function must be called each time the size of the window + * changes. (For a subwindow, you are normally resizing the window + * yourself, but for a toplevel window, it is necessary to listen for + * ConfigureNotify events.) + * + * A pixmap can never change size, so it is never necessary to call + * this function on a surface created for a pixmap. + * + * If cairo_surface_flush() wasn't called, some pending operations + * might be discarded. + * + * Since: 1.12 + **/ +void +cairo_xcb_surface_set_size (cairo_surface_t *abstract_surface, + int width, + int height) +{ + cairo_xcb_surface_t *surface; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + + if ( !_cairo_surface_is_xcb(abstract_surface)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX || width <= 0 || height <= 0) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_SIZE)); + return; + } + + surface = (cairo_xcb_surface_t *) abstract_surface; + + _drawable_changed(surface); + surface->width = width; + surface->height = height; +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_surface_set_size); +#endif + +/** + * cairo_xcb_surface_set_drawable: + * @surface: a #cairo_surface_t for the XCB backend + * @drawable: the new drawable of the surface + * @width: the new width of the surface + * @height: the new height of the surface + * + * Informs cairo of the new drawable and size of the XCB drawable underlying the + * surface. + * + * If cairo_surface_flush() wasn't called, some pending operations + * might be discarded. + * + * Since: 1.12 + **/ +void +cairo_xcb_surface_set_drawable (cairo_surface_t *abstract_surface, + xcb_drawable_t drawable, + int width, + int height) +{ + cairo_xcb_surface_t *surface; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + + if ( !_cairo_surface_is_xcb(abstract_surface)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX || width <= 0 || height <= 0) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_SIZE)); + return; + } + + surface = (cairo_xcb_surface_t *) abstract_surface; + + /* XXX: and what about this case? */ + if (surface->owns_pixmap) + return; + + _drawable_changed (surface); + + if (surface->drawable != drawable) { + cairo_status_t status; + status = _cairo_xcb_connection_acquire (surface->connection); + if (unlikely (status)) + return; + + if (surface->picture != XCB_NONE) { + _cairo_xcb_connection_render_free_picture (surface->connection, + surface->picture); + surface->picture = XCB_NONE; + } + + _cairo_xcb_connection_release (surface->connection); + + surface->drawable = drawable; + } + surface->width = width; + surface->height = height; +} +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS +slim_hidden_def (cairo_xcb_surface_set_drawable); +#endif diff --git a/src/cairo-xcb.h b/src/cairo-xcb.h new file mode 100644 index 000000000..e321d8482 --- /dev/null +++ b/src/cairo-xcb.h @@ -0,0 +1,116 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#ifndef CAIRO_XCB_H +#define CAIRO_XCB_H + +#include "cairo.h" + +#if CAIRO_HAS_XCB_SURFACE + +#include +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_xcb_surface_create (xcb_connection_t *connection, + xcb_drawable_t drawable, + xcb_visualtype_t *visual, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_xcb_surface_create_for_bitmap (xcb_connection_t *connection, + xcb_screen_t *screen, + xcb_pixmap_t bitmap, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_xcb_surface_create_with_xrender_format (xcb_connection_t *connection, + xcb_screen_t *screen, + xcb_drawable_t drawable, + xcb_render_pictforminfo_t *format, + int width, + int height); + +cairo_public void +cairo_xcb_surface_set_size (cairo_surface_t *surface, + int width, + int height); + +cairo_public void +cairo_xcb_surface_set_drawable (cairo_surface_t *surface, + xcb_drawable_t drawable, + int width, + int height); + +cairo_public xcb_connection_t * +cairo_xcb_device_get_connection (cairo_device_t *device); + +/* debug interface */ + +cairo_public void +cairo_xcb_device_debug_cap_xshm_version (cairo_device_t *device, + int major_version, + int minor_version); + +cairo_public void +cairo_xcb_device_debug_cap_xrender_version (cairo_device_t *device, + int major_version, + int minor_version); + +/* + * @precision: -1 implies automatically choose based on antialiasing mode, + * any other value overrides and sets the corresponding PolyMode. + */ +cairo_public void +cairo_xcb_device_debug_set_precision (cairo_device_t *device, + int precision); + +cairo_public int +cairo_xcb_device_debug_get_precision (cairo_device_t *device); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_XCB_SURFACE */ +# error Cairo was not compiled with support for the xcb backend +#endif /* CAIRO_HAS_XCB_SURFACE */ + +#endif /* CAIRO_XCB_H */ diff --git a/src/cairo-xlib-core-compositor.c b/src/cairo-xlib-core-compositor.c new file mode 100644 index 000000000..5babcc81b --- /dev/null +++ b/src/cairo-xlib-core-compositor.c @@ -0,0 +1,650 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Behdad Esfahbod + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +/* The original X drawing API was very restrictive in what it could handle, + * pixel-aligned fill/blits are all that map into Cairo's drawing model. + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" +#include "cairo-xlib-surface-private.h" + +#include "cairo-boxes-private.h" +#include "cairo-clip-inline.h" +#include "cairo-compositor-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-pattern-private.h" +#include "cairo-region-private.h" +#include "cairo-surface-offset-private.h" + +/* the low-level interface */ + +static cairo_int_status_t +acquire (void *abstract_dst) +{ + cairo_xlib_surface_t *dst = abstract_dst; + return _cairo_xlib_display_acquire (dst->base.device, &dst->display); +} + +static cairo_int_status_t +release (void *abstract_dst) +{ + cairo_xlib_surface_t *dst = abstract_dst; + + cairo_device_release (&dst->display->base); + dst->display = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +struct _fill_box { + Display *dpy; + Drawable drawable; + GC gc; + //cairo_surface_t *dither = NULL; +}; + +static cairo_bool_t fill_box (cairo_box_t *box, void *closure) +{ + struct _fill_box *data = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + + XFillRectangle (data->dpy, data->drawable, data->gc, x, y, width, height); + return TRUE; +} + +static void +_characterize_field (uint32_t mask, int *width, int *shift) +{ + *width = _cairo_popcount (mask); + /* The final '& 31' is to force a 0 mask to result in 0 shift. */ + *shift = _cairo_popcount ((mask - 1) & ~mask) & 31; +} + +static uint32_t +color_to_pixel (cairo_xlib_surface_t *dst, + const cairo_color_t *color) +{ + uint32_t rgba = 0; + int width, shift; + + _characterize_field (dst->a_mask, &width, &shift); + rgba |= color->alpha_short >> (16 - width) << shift; + + _characterize_field (dst->r_mask, &width, &shift); + rgba |= color->red_short >> (16 - width) << shift; + + _characterize_field (dst->g_mask, &width, &shift); + rgba |= color->green_short >> (16 - width) << shift; + + _characterize_field (dst->b_mask, &width, &shift); + rgba |= color->blue_short >> (16 - width) << shift; + + return rgba; +} + +static cairo_int_status_t +_fill_box_init (struct _fill_box *fb, + cairo_xlib_surface_t *dst, + const cairo_color_t *color) +{ + cairo_int_status_t status; + + status = _cairo_xlib_surface_get_gc (dst->display, dst, &fb->gc); + if (unlikely (status)) + return status; + + fb->dpy = dst->display->display; + fb->drawable = dst->drawable; + + if (dst->visual && dst->visual->class != TrueColor && 0) { +#if 0 + cairo_solid_pattern_t solid; + cairo_surface_attributes_t attrs; + + _cairo_pattern_init_solid (&solid, color); + status = _cairo_pattern_acquire_surface (&solid.base, &dst->base, + 0, 0, + ARRAY_LENGTH (dither_pattern[0]), + ARRAY_LENGTH (dither_pattern), + CAIRO_PATTERN_ACQUIRE_NONE, + &dither, + &attrs); + if (unlikely (status)) { + _cairo_xlib_surface_put_gc (dst->display, dst, fb.gc); + return status; + } + + XSetTSOrigin (fb->dpy, fb->gc, + - (dst->base.device_transform.x0 + attrs.x_offset), + - (dst->base.device_transform.y0 + attrs.y_offset)); + XSetTile (fb->dpy, fb->gc, ((cairo_xlib_surface_t *) dither)->drawable); +#endif + } else { + XGCValues gcv; + + gcv.foreground = color_to_pixel (dst, color); + gcv.fill_style = FillSolid; + + XChangeGC (fb->dpy, fb->gc, GCFillStyle | GCForeground, &gcv); + } + + return CAIRO_INT_STATUS_SUCCESS; +} + +static void +_fill_box_fini (struct _fill_box *fb, + cairo_xlib_surface_t *dst) +{ + _cairo_xlib_surface_put_gc (dst->display, dst, fb->gc); + //cairo_surface_destroy (fb->dither); +} + +cairo_int_status_t +_cairo_xlib_core_fill_boxes (cairo_xlib_surface_t *dst, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + cairo_int_status_t status; + struct _fill_box fb; + + status = _fill_box_init (&fb, dst, color); + if (unlikely (status)) + return status; + + _cairo_boxes_for_each_box (boxes, fill_box, &fb); + + _fill_box_fini (&fb, dst); + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +_cairo_xlib_core_fill_rectangles (cairo_xlib_surface_t *dst, + const cairo_color_t *color, + int num_rects, + cairo_rectangle_int_t *rects) +{ + cairo_int_status_t status; + struct _fill_box fb; + int i; + + status = _fill_box_init (&fb, dst, color); + if (unlikely (status)) + return status; + + for (i = 0; i < num_rects; i++) + XFillRectangle (fb.dpy, fb.drawable, fb.gc, + rects[i].x, rects[i].y, + rects[i].width, rects[i].height); + + _fill_box_fini (&fb, dst); + return CAIRO_STATUS_SUCCESS; +} + +struct _fallback_box { + cairo_xlib_surface_t *dst; + cairo_format_t format; + const cairo_pattern_t *pattern; +}; + +static cairo_bool_t fallback_box (cairo_box_t *box, void *closure) +{ + struct _fallback_box *data = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + cairo_surface_t *image; + cairo_status_t status; + + /* XXX for EXTEND_NONE and if the box is wholly outside we can just fill */ + + image = cairo_surface_create_similar_image (&data->dst->base, data->format, + width, height); + status = _cairo_surface_offset_paint (image, x, y, + CAIRO_OPERATOR_SOURCE, + data->pattern, NULL); + if (status == CAIRO_STATUS_SUCCESS) { + status = _cairo_xlib_surface_draw_image (data->dst, + (cairo_image_surface_t *)image, + 0, 0, + width, height, + x, y); + } + cairo_surface_destroy (image); + + return status == CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +fallback_boxes (cairo_xlib_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_boxes_t *boxes) +{ + struct _fallback_box fb; + + /* XXX create_similar_image using pixman_format? */ + switch (dst->depth) { + case 8: fb.format = CAIRO_FORMAT_A8; break; + case 16: fb.format = CAIRO_FORMAT_RGB16_565; break; + case 24: fb.format = CAIRO_FORMAT_RGB24; break; + case 30: fb.format = CAIRO_FORMAT_RGB30; break; + case 32: fb.format = CAIRO_FORMAT_ARGB32; break; + default: return CAIRO_INT_STATUS_UNSUPPORTED; + } + + fb.dst = dst; + fb.pattern = pattern; + + if (! _cairo_boxes_for_each_box (boxes, fallback_box, &fb)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +render_boxes (cairo_xlib_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_boxes_t *boxes) +{ + if (pattern->filter != CAIRO_FILTER_NEAREST) + return fallback_boxes (dst, pattern, boxes); + + switch (pattern->extend) { + default: + case CAIRO_EXTEND_NONE: + case CAIRO_EXTEND_REFLECT: + case CAIRO_EXTEND_PAD: + return fallback_boxes (dst, pattern, boxes); + + case CAIRO_EXTEND_REPEAT: /* XXX Use tiling */ + return fallback_boxes (dst, pattern, boxes); + } +} + +/* the mid-level: converts boxes into drawing operations */ + +struct _box_data { + Display *dpy; + cairo_xlib_surface_t *dst; + cairo_surface_t *src; + GC gc; + int tx, ty; + int width, height; +}; + +static cairo_bool_t source_contains_box (cairo_box_t *box, void *closure) +{ + struct _box_data *data = closure; + + /* The box is pixel-aligned so the truncation is safe. */ + return + _cairo_fixed_integer_part (box->p1.x) + data->tx >= 0 && + _cairo_fixed_integer_part (box->p1.y) + data->ty >= 0 && + _cairo_fixed_integer_part (box->p2.x) + data->tx <= data->width && + _cairo_fixed_integer_part (box->p2.y) + data->ty <= data->height; +} + +static cairo_bool_t image_upload_box (cairo_box_t *box, void *closure) +{ + const struct _box_data *iub = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + + return _cairo_xlib_surface_draw_image (iub->dst, + (cairo_image_surface_t *)iub->src, + x + iub->tx, y + iub->ty, + width, height, + x, y) == CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +surface_matches_image_format (cairo_xlib_surface_t *surface, + cairo_image_surface_t *image) +{ + cairo_format_masks_t format; + + return (_pixman_format_to_masks (image->pixman_format, &format) && + (format.alpha_mask == surface->a_mask || surface->a_mask == 0) && + (format.red_mask == surface->r_mask || surface->r_mask == 0) && + (format.green_mask == surface->g_mask || surface->g_mask == 0) && + (format.blue_mask == surface->b_mask || surface->b_mask == 0)); +} + +static cairo_status_t +upload_image_inplace (cairo_xlib_surface_t *dst, + const cairo_pattern_t *source, + cairo_boxes_t *boxes) +{ + const cairo_surface_pattern_t *pattern; + struct _box_data iub; + cairo_image_surface_t *image; + + if (source->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + pattern = (const cairo_surface_pattern_t *) source; + if (pattern->surface->type != CAIRO_SURFACE_TYPE_IMAGE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + image = (cairo_image_surface_t *) pattern->surface; + if (image->format == CAIRO_FORMAT_INVALID) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (image->depth != dst->depth) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! surface_matches_image_format (dst, image)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* XXX subsurface */ + + if (! _cairo_matrix_is_integer_translation (&source->matrix, + &iub.tx, &iub.ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + iub.dst = dst; + iub.src = &image->base; + iub.width = image->width; + iub.height = image->height; + + /* First check that the data is entirely within the image */ + if (! _cairo_boxes_for_each_box (boxes, source_contains_box, &iub)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_boxes_for_each_box (boxes, image_upload_box, &iub)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t copy_box (cairo_box_t *box, void *closure) +{ + const struct _box_data *cb = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + + XCopyArea (cb->dpy, + ((cairo_xlib_surface_t *)cb->src)->drawable, + cb->dst->drawable, + cb->gc, + x + cb->tx, y + cb->ty, + width, height, + x, y); + return TRUE; +} + +static cairo_status_t +copy_boxes (cairo_xlib_surface_t *dst, + const cairo_pattern_t *source, + cairo_boxes_t *boxes) +{ + const cairo_surface_pattern_t *pattern; + struct _box_data cb; + cairo_xlib_surface_t *src; + cairo_status_t status; + + if (source->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* XXX subsurface */ + + pattern = (const cairo_surface_pattern_t *) source; + if (pattern->surface->backend->type != CAIRO_SURFACE_TYPE_XLIB) + return CAIRO_INT_STATUS_UNSUPPORTED; + + src = (cairo_xlib_surface_t *) pattern->surface; + if (src->depth != dst->depth) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* We can only have a single control for subwindow_mode on the + * GC. If we have a Window destination, we need to set ClipByChildren, + * but if we have a Window source, we need IncludeInferiors. If we have + * both a Window destination and source, we must fallback. There is + * no convenient way to detect if a drawable is a Pixmap or Window, + * therefore we can only rely on those surfaces that we created + * ourselves to be Pixmaps, and treat everything else as a potential + * Window. + */ + if (! src->owns_pixmap && ! dst->owns_pixmap) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_xlib_surface_same_screen (dst, src)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, + &cb.tx, &cb.ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + cb.dpy = dst->display->display; + cb.dst = dst; + cb.src = &src->base; + cb.width = src->width; + cb.height = src->height; + + /* First check that the data is entirely within the image */ + if (! _cairo_boxes_for_each_box (boxes, source_contains_box, &cb)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_xlib_surface_get_gc (dst->display, dst, &cb.gc); + if (unlikely (status)) + return status; + + if (! src->owns_pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = IncludeInferiors; + XChangeGC (dst->display->display, cb.gc, GCSubwindowMode, &gcv); + } + + status = CAIRO_STATUS_SUCCESS; + if (! _cairo_boxes_for_each_box (boxes, copy_box, &cb)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + + if (! src->owns_pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = ClipByChildren; + XChangeGC (dst->display->display, cb.gc, GCSubwindowMode, &gcv); + } + + _cairo_xlib_surface_put_gc (dst->display, dst, cb.gc); + + return status; +} + +static cairo_status_t +draw_boxes (cairo_composite_rectangles_t *extents, + cairo_boxes_t *boxes) +{ + cairo_xlib_surface_t *dst = (cairo_xlib_surface_t *)extents->surface; + cairo_operator_t op = extents->op; + const cairo_pattern_t *src = &extents->source_pattern.base; + cairo_int_status_t status; + + if (boxes->num_boxes == 0 && extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (op == CAIRO_OPERATOR_CLEAR) + op = CAIRO_OPERATOR_SOURCE; + + if (op == CAIRO_OPERATOR_OVER && + _cairo_pattern_is_opaque (src, &extents->bounded)) + op = CAIRO_OPERATOR_SOURCE; + + if (dst->base.is_clear && op == CAIRO_OPERATOR_OVER) + op = CAIRO_OPERATOR_SOURCE; + + if (op != CAIRO_OPERATOR_SOURCE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = acquire (dst); + if (unlikely (status)) + return status; + + if (src->type == CAIRO_PATTERN_TYPE_SOLID) { + status = _cairo_xlib_core_fill_boxes + (dst, &((cairo_solid_pattern_t *) src)->color, boxes); + } else { + status = upload_image_inplace (dst, src, boxes); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + status = copy_boxes (dst, src, boxes); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + status = render_boxes (dst, src, boxes); + } + + release (dst); + + return status; +} + +/* high-level compositor interface */ + +static cairo_int_status_t +_cairo_xlib_core_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (_cairo_clip_is_region (extents->clip)) { + cairo_boxes_t boxes; + + _cairo_clip_steal_boxes (extents->clip, &boxes); + status = draw_boxes (extents, &boxes); + _cairo_clip_unsteal_boxes (extents->clip, &boxes); + } + + return status; +} + +static cairo_int_status_t +_cairo_xlib_core_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (extents->clip->path == NULL && + _cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, extents->clip); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + style, + ctm, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = draw_boxes (extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + return status; +} + +static cairo_int_status_t +_cairo_xlib_core_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (extents->clip->path == NULL && + _cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init_with_clip (&boxes, extents->clip); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = draw_boxes (extents, &boxes); + _cairo_boxes_fini (&boxes); + } + + return status; +} + +const cairo_compositor_t * +_cairo_xlib_core_compositor_get (void) +{ + static cairo_compositor_t compositor; + + if (compositor.delegate == NULL) { + compositor.delegate = _cairo_xlib_fallback_compositor_get (); + + compositor.paint = _cairo_xlib_core_compositor_paint; + compositor.mask = NULL; + compositor.fill = _cairo_xlib_core_compositor_fill; + compositor.stroke = _cairo_xlib_core_compositor_stroke; + compositor.glyphs = NULL; /* XXX PolyGlyph? */ + } + + return &compositor; +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c new file mode 100644 index 000000000..a2a3bc792 --- /dev/null +++ b/src/cairo-xlib-display.c @@ -0,0 +1,655 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Karl Tomlinson , Mozilla Corporation + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" +#include "cairo-xlib-xrender-private.h" +#include "cairo-freelist-private.h" +#include "cairo-error-private.h" +#include "cairo-list-inline.h" + +#include /* For XESetCloseDisplay */ + +typedef int (*cairo_xlib_error_func_t) (Display *display, + XErrorEvent *event); + +static cairo_xlib_display_t *_cairo_xlib_display_list; + +static int +_noop_error_handler (Display *display, + XErrorEvent *event) +{ + return False; /* return value is ignored */ +} + +static void +_cairo_xlib_display_finish (void *abstract_display) +{ + cairo_xlib_display_t *display = abstract_display; + Display *dpy = display->display; + + _cairo_xlib_display_fini_shm (display); + + if (! cairo_device_acquire (&display->base)) { + cairo_xlib_error_func_t old_handler; + + /* protect the notifies from triggering XErrors */ + XSync (dpy, False); + old_handler = XSetErrorHandler (_noop_error_handler); + + while (! cairo_list_is_empty (&display->fonts)) { + _cairo_xlib_font_close (cairo_list_first_entry (&display->fonts, + cairo_xlib_font_t, + link)); + } + + while (! cairo_list_is_empty (&display->screens)) { + _cairo_xlib_screen_destroy (display, + cairo_list_first_entry (&display->screens, + cairo_xlib_screen_t, + link)); + } + + XSync (dpy, False); + XSetErrorHandler (old_handler); + + cairo_device_release (&display->base); + } +} + +static void +_cairo_xlib_display_destroy (void *abstract_display) +{ + cairo_xlib_display_t *display = abstract_display; + + free (display); +} + +static int +_cairo_xlib_close_display (Display *dpy, XExtCodes *codes) +{ + cairo_xlib_display_t *display, **prev, *next; + + CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); + for (display = _cairo_xlib_display_list; display; display = display->next) + if (display->display == dpy) + break; + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + if (display == NULL) + return 0; + + cairo_device_finish (&display->base); + + /* + * Unhook from the global list + */ + CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); + prev = &_cairo_xlib_display_list; + for (display = _cairo_xlib_display_list; display; display = next) { + next = display->next; + if (display->display == dpy) { + *prev = next; + break; + } else + prev = &display->next; + } + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + + display->display = NULL; /* catch any later invalid access */ + cairo_device_destroy (&display->base); + + /* Return value in accordance with requirements of + * XESetCloseDisplay */ + return 0; +} + +static const cairo_device_backend_t _cairo_xlib_device_backend = { + CAIRO_DEVICE_TYPE_XLIB, + + NULL, + NULL, + + NULL, /* flush */ + _cairo_xlib_display_finish, + _cairo_xlib_display_destroy, +}; + +static void _cairo_xlib_display_select_compositor (cairo_xlib_display_t *display) +{ +#if 1 + if (display->render_major > 0 || display->render_minor >= 4) + display->compositor = _cairo_xlib_traps_compositor_get (); + else if (display->render_major > 0 || display->render_minor >= 0) + display->compositor = _cairo_xlib_mask_compositor_get (); + else + display->compositor = _cairo_xlib_core_compositor_get (); +#else + display->compositor = _cairo_xlib_fallback_compositor_get (); +#endif +} + +/** + * _cairo_xlib_device_create: + * @dpy: the display to create the device for + * + * Gets the device belonging to @dpy, or creates it if it doesn't exist yet. + * + * Returns: the device belonging to @dpy + **/ +cairo_device_t * +_cairo_xlib_device_create (Display *dpy) +{ + cairo_xlib_display_t *display; + cairo_xlib_display_t **prev; + cairo_device_t *device; + XExtCodes *codes; + const char *env; + + CAIRO_MUTEX_INITIALIZE (); + + /* There is an apparent deadlock between this mutex and the + * mutex for the display, but it's actually safe. For the + * app to call XCloseDisplay() while any other thread is + * inside this function would be an error in the logic + * app, and the CloseDisplay hook is the only other place we + * acquire this mutex. + */ + CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); + + for (prev = &_cairo_xlib_display_list; (display = *prev); prev = &(*prev)->next) + { + if (display->display == dpy) { + /* + * MRU the list + */ + if (prev != &_cairo_xlib_display_list) { + *prev = display->next; + display->next = _cairo_xlib_display_list; + _cairo_xlib_display_list = display; + } + device = cairo_device_reference (&display->base); + goto UNLOCK; + } + } + + display = malloc (sizeof (cairo_xlib_display_t)); + if (unlikely (display == NULL)) { + device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + goto UNLOCK; + } + + _cairo_device_init (&display->base, &_cairo_xlib_device_backend); + + display->display = dpy; + cairo_list_init (&display->screens); + cairo_list_init (&display->fonts); + display->closed = FALSE; + + /* Xlib calls out to the extension close_display hooks in LIFO + * order. So we have to ensure that all extensions that we depend + * on in our close_display hook are properly initialized before we + * add our hook. For now, that means Render, so we call into its + * QueryVersion function to ensure it gets initialized. + */ + display->render_major = display->render_minor = -1; + XRenderQueryVersion (dpy, &display->render_major, &display->render_minor); + env = getenv ("CAIRO_DEBUG"); + if (env != NULL && (env = strstr (env, "xrender-version=")) != NULL) { + int max_render_major, max_render_minor; + + env += sizeof ("xrender-version=") - 1; + if (sscanf (env, "%d.%d", &max_render_major, &max_render_minor) != 2) + max_render_major = max_render_minor = -1; + + if (max_render_major < display->render_major || + (max_render_major == display->render_major && + max_render_minor < display->render_minor)) + { + display->render_major = max_render_major; + display->render_minor = max_render_minor; + } + } + + _cairo_xlib_display_select_compositor (display); + + display->white = NULL; + memset (display->alpha, 0, sizeof (display->alpha)); + memset (display->solid, 0, sizeof (display->solid)); + memset (display->solid_cache, 0, sizeof (display->solid_cache)); + memset (display->last_solid_cache, 0, sizeof (display->last_solid_cache)); + + memset (display->cached_xrender_formats, 0, + sizeof (display->cached_xrender_formats)); + + display->force_precision = -1; + + _cairo_xlib_display_init_shm (display); + + /* Prior to Render 0.10, there is no protocol support for gradients and + * we call function stubs instead, which would silently consume the drawing. + */ +#if RENDER_MAJOR == 0 && RENDER_MINOR < 10 + display->buggy_gradients = TRUE; +#else + display->buggy_gradients = FALSE; +#endif + display->buggy_pad_reflect = FALSE; + display->buggy_repeat = FALSE; + + /* This buggy_repeat condition is very complicated because there + * are multiple X server code bases (with multiple versioning + * schemes within a code base), and multiple bugs. + * + * The X servers: + * + * 1. The Vendor=="XFree86" code base with release numbers such + * as 4.7.0 (VendorRelease==40700000). + * + * 2. The Vendor=="X.Org" code base (a descendant of the + * XFree86 code base). It originally had things like + * VendorRelease==60700000 for release 6.7.0 but then changed + * its versioning scheme so that, for example, + * VendorRelease==10400000 for the 1.4.0 X server within the + * X.Org 7.3 release. + * + * The bugs: + * + * 1. The original bug that led to the buggy_repeat + * workaround. This was a bug that Owen Taylor investigated, + * understood well, and characterized against various X + * servers. Confirmed X servers with this bug include: + * + * "XFree86" <= 40500000 + * "X.Org" <= 60802000 (only with old numbering >= 60700000) + * + * 2. A separate bug resulting in a crash of the X server when + * using cairo's extend-reflect test case, (which, surprisingly + * enough was not passing RepeatReflect to the X server, but + * instead using RepeatNormal in a workaround). Nobody to date + * has understood the bug well, but it appears to be gone as of + * the X.Org 1.4.0 server. This bug is coincidentally avoided + * by using the same buggy_repeat workaround. Confirmed X + * servers with this bug include: + * + * "X.org" == 60900000 (old versioning scheme) + * "X.org" < 10400000 (new numbering scheme) + * + * For the old-versioning-scheme X servers we don't know + * exactly when second the bug started, but since bug 1 is + * present through 6.8.2 and bug 2 is present in 6.9.0 it seems + * safest to just blacklist all old-versioning-scheme X servers, + * (just using VendorRelease < 70000000), as buggy_repeat=TRUE. + */ + if (_cairo_xlib_vendor_is_xorg (dpy)) { + if (VendorRelease (dpy) >= 60700000) { + if (VendorRelease (dpy) < 70000000) + display->buggy_repeat = TRUE; + + /* We know that gradients simply do not work in early Xorg servers */ + if (VendorRelease (dpy) < 70200000) + display->buggy_gradients = TRUE; + + /* And the extended repeat modes were not fixed until much later */ + display->buggy_pad_reflect = TRUE; + } else { + if (VendorRelease (dpy) < 10400000) + display->buggy_repeat = TRUE; + + /* Too many bugs in the early drivers */ + if (VendorRelease (dpy) < 10699000) + display->buggy_pad_reflect = TRUE; + } + } else if (strstr (ServerVendor (dpy), "XFree86") != NULL) { + if (VendorRelease (dpy) <= 40500000) + display->buggy_repeat = TRUE; + + display->buggy_gradients = TRUE; + display->buggy_pad_reflect = TRUE; + } + + codes = XAddExtension (dpy); + if (unlikely (codes == NULL)) { + device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + free (display); + goto UNLOCK; + } + + XESetCloseDisplay (dpy, codes->extension, _cairo_xlib_close_display); + cairo_device_reference (&display->base); /* add one for the CloseDisplay */ + + display->next = _cairo_xlib_display_list; + _cairo_xlib_display_list = display; + + device = &display->base; + +UNLOCK: + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + return device; +} + +cairo_status_t +_cairo_xlib_display_acquire (cairo_device_t *device, cairo_xlib_display_t **display) +{ + cairo_status_t status; + + status = cairo_device_acquire (device); + if (status) + return status; + + *display = (cairo_xlib_display_t *) device; + return CAIRO_STATUS_SUCCESS; +} + +XRenderPictFormat * +_cairo_xlib_display_get_xrender_format_for_pixman(cairo_xlib_display_t *display, + pixman_format_code_t format) +{ + Display *dpy = display->display; + XRenderPictFormat tmpl; + int mask; + +#define MASK(x) ((1<<(x))-1) + + tmpl.depth = PIXMAN_FORMAT_DEPTH(format); + mask = PictFormatType | PictFormatDepth; + + switch (PIXMAN_FORMAT_TYPE(format)) { + case PIXMAN_TYPE_ARGB: + tmpl.type = PictTypeDirect; + + tmpl.direct.alphaMask = MASK(PIXMAN_FORMAT_A(format)); + if (PIXMAN_FORMAT_A(format)) + tmpl.direct.alpha = (PIXMAN_FORMAT_R(format) + + PIXMAN_FORMAT_G(format) + + PIXMAN_FORMAT_B(format)); + + tmpl.direct.redMask = MASK(PIXMAN_FORMAT_R(format)); + tmpl.direct.red = (PIXMAN_FORMAT_G(format) + + PIXMAN_FORMAT_B(format)); + + tmpl.direct.greenMask = MASK(PIXMAN_FORMAT_G(format)); + tmpl.direct.green = PIXMAN_FORMAT_B(format); + + tmpl.direct.blueMask = MASK(PIXMAN_FORMAT_B(format)); + tmpl.direct.blue = 0; + + mask |= PictFormatRed | PictFormatRedMask; + mask |= PictFormatGreen | PictFormatGreenMask; + mask |= PictFormatBlue | PictFormatBlueMask; + mask |= PictFormatAlpha | PictFormatAlphaMask; + break; + + case PIXMAN_TYPE_ABGR: + tmpl.type = PictTypeDirect; + + tmpl.direct.alphaMask = MASK(PIXMAN_FORMAT_A(format)); + if (tmpl.direct.alphaMask) + tmpl.direct.alpha = (PIXMAN_FORMAT_B(format) + + PIXMAN_FORMAT_G(format) + + PIXMAN_FORMAT_R(format)); + + tmpl.direct.blueMask = MASK(PIXMAN_FORMAT_B(format)); + tmpl.direct.blue = (PIXMAN_FORMAT_G(format) + + PIXMAN_FORMAT_R(format)); + + tmpl.direct.greenMask = MASK(PIXMAN_FORMAT_G(format)); + tmpl.direct.green = PIXMAN_FORMAT_R(format); + + tmpl.direct.redMask = MASK(PIXMAN_FORMAT_R(format)); + tmpl.direct.red = 0; + + mask |= PictFormatRed | PictFormatRedMask; + mask |= PictFormatGreen | PictFormatGreenMask; + mask |= PictFormatBlue | PictFormatBlueMask; + mask |= PictFormatAlpha | PictFormatAlphaMask; + break; + + case PIXMAN_TYPE_BGRA: + tmpl.type = PictTypeDirect; + + tmpl.direct.blueMask = MASK(PIXMAN_FORMAT_B(format)); + tmpl.direct.blue = (PIXMAN_FORMAT_BPP(format) - PIXMAN_FORMAT_B(format)); + + tmpl.direct.greenMask = MASK(PIXMAN_FORMAT_G(format)); + tmpl.direct.green = (PIXMAN_FORMAT_BPP(format) - PIXMAN_FORMAT_B(format) - + PIXMAN_FORMAT_G(format)); + + tmpl.direct.redMask = MASK(PIXMAN_FORMAT_R(format)); + tmpl.direct.red = (PIXMAN_FORMAT_BPP(format) - PIXMAN_FORMAT_B(format) - + PIXMAN_FORMAT_G(format) - PIXMAN_FORMAT_R(format)); + + tmpl.direct.alphaMask = MASK(PIXMAN_FORMAT_A(format)); + tmpl.direct.alpha = 0; + + mask |= PictFormatRed | PictFormatRedMask; + mask |= PictFormatGreen | PictFormatGreenMask; + mask |= PictFormatBlue | PictFormatBlueMask; + mask |= PictFormatAlpha | PictFormatAlphaMask; + break; + + case PIXMAN_TYPE_A: + tmpl.type = PictTypeDirect; + + tmpl.direct.alpha = 0; + tmpl.direct.alphaMask = MASK(PIXMAN_FORMAT_A(format)); + + mask |= PictFormatAlpha | PictFormatAlphaMask; + break; + + case PIXMAN_TYPE_COLOR: + case PIXMAN_TYPE_GRAY: + /* XXX Find matching visual/colormap */ + tmpl.type = PictTypeIndexed; + //tmpl.colormap = screen->visuals[PIXMAN_FORMAT_VIS(format)].vid; + //mask |= PictFormatColormap; + return NULL; + } +#undef MASK + + /* XXX caching? */ + return XRenderFindFormat(dpy, mask, &tmpl, 0); +} + +XRenderPictFormat * +_cairo_xlib_display_get_xrender_format (cairo_xlib_display_t *display, + cairo_format_t format) +{ + XRenderPictFormat *xrender_format; + + xrender_format = display->cached_xrender_formats[format]; + if (xrender_format == NULL) { + int pict_format = PictStandardNUM; + + switch (format) { + case CAIRO_FORMAT_A1: + pict_format = PictStandardA1; break; + case CAIRO_FORMAT_A8: + pict_format = PictStandardA8; break; + case CAIRO_FORMAT_RGB24: + pict_format = PictStandardRGB24; break; + case CAIRO_FORMAT_RGB16_565: + xrender_format = _cairo_xlib_display_get_xrender_format_for_pixman(display, + PIXMAN_r5g6b5); + break; + case CAIRO_FORMAT_RGB30: + xrender_format = _cairo_xlib_display_get_xrender_format_for_pixman(display, + PIXMAN_x2r10g10b10); + break; + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_ARGB32: + pict_format = PictStandardARGB32; break; + } + if (pict_format != PictStandardNUM) + xrender_format = + XRenderFindStandardFormat (display->display, pict_format); + display->cached_xrender_formats[format] = xrender_format; + } + + return xrender_format; +} + +cairo_xlib_screen_t * +_cairo_xlib_display_get_screen (cairo_xlib_display_t *display, + Screen *screen) +{ + cairo_xlib_screen_t *info; + + cairo_list_foreach_entry (info, cairo_xlib_screen_t, &display->screens, link) { + if (info->screen == screen) { + if (display->screens.next != &info->link) + cairo_list_move (&info->link, &display->screens); + return info; + } + } + + return NULL; +} + +cairo_bool_t +_cairo_xlib_display_has_repeat (cairo_device_t *device) +{ + return ! ((cairo_xlib_display_t *) device)->buggy_repeat; +} + +cairo_bool_t +_cairo_xlib_display_has_reflect (cairo_device_t *device) +{ + return ! ((cairo_xlib_display_t *) device)->buggy_pad_reflect; +} + +cairo_bool_t +_cairo_xlib_display_has_gradients (cairo_device_t *device) +{ + return ! ((cairo_xlib_display_t *) device)->buggy_gradients; +} + +/** + * cairo_xlib_device_debug_cap_xrender_version: + * @device: a #cairo_device_t for the Xlib backend + * @major_version: major version to restrict to + * @minor_version: minor version to restrict to + * + * Restricts all future Xlib surfaces for this devices to the specified version + * of the RENDER extension. This function exists solely for debugging purpose. + * It lets you find out how cairo would behave with an older version of + * the RENDER extension. + * + * Use the special values -1 and -1 for disabling the RENDER extension. + * + * Since: 1.12 + **/ +void +cairo_xlib_device_debug_cap_xrender_version (cairo_device_t *device, + int major_version, + int minor_version) +{ + cairo_xlib_display_t *display = (cairo_xlib_display_t *) device; + + if (device == NULL || device->status) + return; + + if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB) + return; + + if (major_version < display->render_major || + (major_version == display->render_major && + minor_version < display->render_minor)) + { + display->render_major = major_version; + display->render_minor = minor_version; + } + + _cairo_xlib_display_select_compositor (display); +} + +/** + * cairo_xlib_device_debug_set_precision: + * @device: a #cairo_device_t for the Xlib backend + * @precision: the precision to use + * + * Render supports two modes of precision when rendering trapezoids. Set + * the precision to the desired mode. + * + * Since: 1.12 + **/ +void +cairo_xlib_device_debug_set_precision (cairo_device_t *device, + int precision) +{ + if (device == NULL || device->status) + return; + if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return; + } + + ((cairo_xlib_display_t *) device)->force_precision = precision; +} + +/** + * cairo_xlib_device_debug_get_precision: + * @device: a #cairo_device_t for the Xlib backend + * + * Get the Xrender precision mode. + * + * Returns: the render precision mode + * + * Since: 1.12 + **/ +int +cairo_xlib_device_debug_get_precision (cairo_device_t *device) +{ + if (device == NULL || device->status) + return -1; + if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return -1; + } + + return ((cairo_xlib_display_t *) device)->force_precision; +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-fallback-compositor.c b/src/cairo-xlib-fallback-compositor.c new file mode 100644 index 000000000..ed2845db5 --- /dev/null +++ b/src/cairo-xlib-fallback-compositor.c @@ -0,0 +1,248 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Behdad Esfahbod + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-offset-private.h" + +static const cairo_compositor_t * +_get_compositor (cairo_surface_t *surface) +{ + return ((cairo_image_surface_t *)surface)->compositor; +} + +static cairo_bool_t +unclipped (cairo_xlib_surface_t *xlib, cairo_clip_t *clip) +{ + cairo_rectangle_int_t r; + + r.x = r.y = 0; + r.width = xlib->width; + r.height = xlib->height; + return _cairo_clip_contains_rectangle (clip, &r); +} + +static cairo_int_status_t +_cairo_xlib_shm_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_xlib_surface_t *xlib = (cairo_xlib_surface_t *)extents->surface; + cairo_int_status_t status; + cairo_surface_t *shm; + cairo_bool_t overwrite; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + overwrite = + extents->op <= CAIRO_OPERATOR_SOURCE && unclipped (xlib, extents->clip); + + shm = _cairo_xlib_surface_get_shm (xlib, overwrite); + if (shm == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_paint (_get_compositor (shm), shm, + extents->op, + &extents->source_pattern.base, + extents->clip); + if (unlikely (status)) + return status; + + xlib->base.is_clear = + extents->op == CAIRO_OPERATOR_CLEAR && unclipped (xlib, extents->clip); + xlib->base.serial++; + xlib->fallback++; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_xlib_shm_compositor_mask (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_xlib_surface_t *xlib = (cairo_xlib_surface_t *)extents->surface; + cairo_int_status_t status; + cairo_surface_t *shm; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + shm = _cairo_xlib_surface_get_shm (xlib, FALSE); + if (shm == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_mask (_get_compositor (shm), shm, + extents->op, + &extents->source_pattern.base, + &extents->mask_pattern.base, + extents->clip); + if (unlikely (status)) + return status; + + xlib->base.is_clear = FALSE; + xlib->base.serial++; + xlib->fallback++; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_xlib_shm_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xlib_surface_t *xlib = (cairo_xlib_surface_t *)extents->surface; + cairo_int_status_t status; + cairo_surface_t *shm; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + shm = _cairo_xlib_surface_get_shm (xlib, FALSE); + if (shm == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_stroke (_get_compositor (shm), shm, + extents->op, + &extents->source_pattern.base, + path, style, + ctm, ctm_inverse, + tolerance, + antialias, + extents->clip); + if (unlikely (status)) + return status; + + xlib->base.is_clear = FALSE; + xlib->base.serial++; + xlib->fallback++; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_xlib_shm_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xlib_surface_t *xlib = (cairo_xlib_surface_t *)extents->surface; + cairo_int_status_t status; + cairo_surface_t *shm; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + shm = _cairo_xlib_surface_get_shm (xlib, FALSE); + if (shm == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_fill (_get_compositor (shm), shm, + extents->op, + &extents->source_pattern.base, + path, + fill_rule, tolerance, antialias, + extents->clip); + if (unlikely (status)) + return status; + + xlib->base.is_clear = FALSE; + xlib->base.serial++; + xlib->fallback++; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static cairo_int_status_t +_cairo_xlib_shm_compositor_glyphs (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_xlib_surface_t *xlib = (cairo_xlib_surface_t *)extents->surface; + cairo_int_status_t status; + cairo_surface_t *shm; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + shm = _cairo_xlib_surface_get_shm (xlib, FALSE); + if (shm == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_compositor_glyphs (_get_compositor (shm), shm, + extents->op, + &extents->source_pattern.base, + glyphs, num_glyphs, scaled_font, + extents->clip); + if (unlikely (status)) + return status; + + xlib->base.is_clear = FALSE; + xlib->base.serial++; + xlib->fallback++; + return CAIRO_INT_STATUS_NOTHING_TO_DO; +} + +static const cairo_compositor_t _cairo_xlib_shm_compositor = { + &_cairo_fallback_compositor, + + _cairo_xlib_shm_compositor_paint, + _cairo_xlib_shm_compositor_mask, + _cairo_xlib_shm_compositor_stroke, + _cairo_xlib_shm_compositor_fill, + _cairo_xlib_shm_compositor_glyphs, +}; + +const cairo_compositor_t * +_cairo_xlib_fallback_compositor_get (void) +{ + return &_cairo_xlib_shm_compositor; +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-private.h b/src/cairo-xlib-private.h new file mode 100644 index 000000000..0f2f2e1fa --- /dev/null +++ b/src/cairo-xlib-private.h @@ -0,0 +1,470 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributors(s): + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +#ifndef CAIRO_XLIB_PRIVATE_H +#define CAIRO_XLIB_PRIVATE_H + +#include "cairo-xlib-xrender-private.h" +#include "cairo-xlib.h" + +#include "cairo-compiler-private.h" +#include "cairo-device-private.h" +#include "cairo-freelist-type-private.h" +#include "cairo-list-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-types-private.h" +#include "cairo-scaled-font-private.h" +#include "cairo-surface-private.h" + +#include +#include + +typedef struct _cairo_xlib_display cairo_xlib_display_t; +typedef struct _cairo_xlib_shm_display cairo_xlib_shm_display_t; +typedef struct _cairo_xlib_screen cairo_xlib_screen_t; +typedef struct _cairo_xlib_source cairo_xlib_source_t; +typedef struct _cairo_xlib_proxy cairo_xlib_proxy_t; +typedef struct _cairo_xlib_surface cairo_xlib_surface_t; + +/* size of color cube */ +#define CUBE_SIZE 6 +/* size of gray ramp */ +#define RAMP_SIZE 16 +/* maximum number of cached GC's */ +#define GC_CACHE_SIZE 4 + +struct _cairo_xlib_display { + cairo_device_t base; + + cairo_xlib_display_t *next; + + Display *display; + cairo_list_t screens; + cairo_list_t fonts; + + cairo_xlib_shm_display_t *shm; + + const cairo_compositor_t *compositor; + + int render_major; + int render_minor; + XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_RGB30 + 1]; + + int force_precision; + + cairo_surface_t *white; + cairo_surface_t *alpha[256]; + cairo_surface_t *solid[32]; + uint32_t solid_cache[32]; /* low 16 are opaque, high 16 transparent */ + struct { + uint32_t color; + int index; + } last_solid_cache[2]; + + /* TRUE if the server has a bug with repeating pictures + * + * https://bugs.freedesktop.org/show_bug.cgi?id=3566 + * + * We can't test for this because it depends on whether the + * picture is in video memory or not. + * + * We also use this variable as a guard against a second + * independent bug with transformed repeating pictures: + * + * http://lists.freedesktop.org/archives/cairo/2004-September/001839.html + * + * Both are fixed in xorg >= 6.9 and hopefully in > 6.8.2, so + * we can reuse the test for now. + */ + unsigned int buggy_gradients : 1; + unsigned int buggy_pad_reflect : 1; + unsigned int buggy_repeat : 1; + unsigned int closed :1; +}; + +typedef struct _cairo_xlib_visual_info { + cairo_list_t link; + VisualID visualid; + struct { uint8_t a, r, g, b; } colors[256]; + uint8_t cube_to_pseudocolor[CUBE_SIZE][CUBE_SIZE][CUBE_SIZE]; + uint8_t field8_to_cube[256]; + int8_t dither8_to_cube[256]; + uint8_t gray8_to_pseudocolor[256]; +} cairo_xlib_visual_info_t; + +struct _cairo_xlib_screen { + cairo_list_t link; + + cairo_device_t *device; + Screen *screen; + + cairo_list_t surfaces; + + cairo_bool_t has_font_options; + cairo_font_options_t font_options; + + GC gc[GC_CACHE_SIZE]; + uint8_t gc_depths[GC_CACHE_SIZE]; + + cairo_list_t visuals; +}; + +enum { + GLYPHSET_INDEX_ARGB32, + GLYPHSET_INDEX_A8, + GLYPHSET_INDEX_A1, + NUM_GLYPHSETS +}; + +typedef struct _cairo_xlib_font_glyphset { + GlyphSet glyphset; + cairo_format_t format; + XRenderPictFormat *xrender_format; + struct _cairo_xlib_font_glyphset_free_glyphs { + int count; + unsigned long indices[128]; + } to_free; +} cairo_xlib_font_glyphset_t; + +typedef struct _cairo_xlib_font { + cairo_scaled_font_private_t base; + cairo_scaled_font_t *font; + cairo_device_t *device; + cairo_list_t link; + cairo_xlib_font_glyphset_t glyphset[NUM_GLYPHSETS]; +} cairo_xlib_font_t; + +struct _cairo_xlib_surface { + cairo_surface_t base; + + Picture picture; + Drawable drawable; + + const cairo_compositor_t *compositor; + cairo_surface_t *shm; + int fallback; + + cairo_xlib_display_t *display; + cairo_xlib_screen_t *screen; + cairo_list_t link; + + Display *dpy; /* only valid between acquire/release */ + cairo_bool_t owns_pixmap; + Visual *visual; + + int use_pixmap; + + int width; + int height; + int depth; + + int precision; + XRenderPictFormat *xrender_format; + /* XXX pixman_format instead of masks? */ + uint32_t a_mask; + uint32_t r_mask; + uint32_t g_mask; + uint32_t b_mask; + + struct _cairo_xlib_source { + cairo_surface_t base; + + Picture picture; + Pixmap pixmap; + Display *dpy; + + unsigned int filter:3; + unsigned int extend:3; + unsigned int has_matrix:1; + unsigned int has_component_alpha:1; + } embedded_source; +}; + +struct _cairo_xlib_proxy { + struct _cairo_xlib_source source; + cairo_surface_t *owner; +}; + +inline static cairo_bool_t +_cairo_xlib_vendor_is_xorg (Display *dpy) +{ + const char *const vendor = ServerVendor (dpy); + return strstr (vendor, "X.Org") || strstr (vendor, "Xorg"); +} + +cairo_private cairo_status_t +_cairo_xlib_surface_get_gc (cairo_xlib_display_t *display, + cairo_xlib_surface_t *surface, + GC *gc); + +cairo_private cairo_device_t * +_cairo_xlib_device_create (Display *display); + +cairo_private void +_cairo_xlib_display_init_shm (cairo_xlib_display_t *display); + +cairo_private void +_cairo_xlib_display_fini_shm (cairo_xlib_display_t *display); + +cairo_private cairo_xlib_screen_t * +_cairo_xlib_display_get_screen (cairo_xlib_display_t *display, + Screen *screen); + +cairo_private cairo_status_t +_cairo_xlib_display_acquire (cairo_device_t *device, + cairo_xlib_display_t **display); + +cairo_private cairo_bool_t +_cairo_xlib_display_has_repeat (cairo_device_t *device); + +cairo_private cairo_bool_t +_cairo_xlib_display_has_reflect (cairo_device_t *device); + +cairo_private cairo_bool_t +_cairo_xlib_display_has_gradients (cairo_device_t *device); + +cairo_private void +_cairo_xlib_display_set_precision(cairo_device_t *device, + int precision); + +cairo_private XRenderPictFormat * +_cairo_xlib_display_get_xrender_format (cairo_xlib_display_t *display, + cairo_format_t format); + +cairo_private XRenderPictFormat * +_cairo_xlib_display_get_xrender_format_for_pixman (cairo_xlib_display_t *display, + pixman_format_code_t format); + +cairo_private cairo_status_t +_cairo_xlib_screen_get (Display *dpy, + Screen *screen, + cairo_xlib_screen_t **out); + +cairo_private void +_cairo_xlib_screen_destroy (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info); + +cairo_private GC +_cairo_xlib_screen_get_gc (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info, + int depth, + Drawable drawable); +cairo_private void +_cairo_xlib_screen_put_gc (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info, + int depth, + GC gc); + +cairo_private cairo_font_options_t * +_cairo_xlib_screen_get_font_options (cairo_xlib_screen_t *info); + +cairo_private cairo_status_t +_cairo_xlib_screen_get_visual_info (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info, + Visual *visual, + cairo_xlib_visual_info_t **out); + +cairo_private cairo_status_t +_cairo_xlib_visual_info_create (Display *dpy, + int screen, + VisualID visualid, + cairo_xlib_visual_info_t **out); + +cairo_private void +_cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info); + +cairo_private const cairo_compositor_t * +_cairo_xlib_core_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_xlib_fallback_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_xlib_mask_compositor_get (void); + +cairo_private const cairo_compositor_t * +_cairo_xlib_traps_compositor_get (void); + +cairo_private void +_cairo_xlib_surface_ensure_picture (cairo_xlib_surface_t *surface); + +cairo_private void +_cairo_xlib_surface_set_precision (cairo_xlib_surface_t *surface, + cairo_antialias_t antialias); + +cairo_private cairo_int_status_t +_cairo_xlib_surface_set_attributes (cairo_xlib_display_t *display, + cairo_xlib_surface_t *surface, + cairo_surface_attributes_t *attributes, + double xc, + double yc); + +cairo_private cairo_status_t +_cairo_xlib_surface_draw_image (cairo_xlib_surface_t *surface, + cairo_image_surface_t *image, + int src_x, + int src_y, + int width, + int height, + int dst_x, + int dst_y); + +cairo_private cairo_surface_t * +_cairo_xlib_source_create_for_pattern (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y); + +cairo_private void +_cairo_xlib_font_close (cairo_xlib_font_t *font); + +#define CAIRO_RENDER_AT_LEAST(surface, major, minor) \ + (((surface)->render_major > major) || \ + (((surface)->render_major == major) && ((surface)->render_minor >= minor))) + +#define CAIRO_RENDER_HAS_CREATE_PICTURE(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 0) +#define CAIRO_RENDER_HAS_COMPOSITE(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 0) +#define CAIRO_RENDER_HAS_COMPOSITE_TEXT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 0) + +#define CAIRO_RENDER_HAS_FILL_RECTANGLES(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 1) + +#define CAIRO_RENDER_HAS_DISJOINT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 2) +#define CAIRO_RENDER_HAS_CONJOINT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 2) + +#define CAIRO_RENDER_HAS_TRAPEZOIDS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4) +#define CAIRO_RENDER_HAS_TRIANGLES(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4) +#define CAIRO_RENDER_HAS_TRISTRIP(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4) +#define CAIRO_RENDER_HAS_TRIFAN(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4) + +#define CAIRO_RENDER_HAS_PICTURE_TRANSFORM(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 6) +#define CAIRO_RENDER_HAS_FILTERS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 6) +#define CAIRO_RENDER_HAS_FILTER_GOOD(surface) FALSE +#define CAIRO_RENDER_HAS_FILTER_BEST(surface) FALSE + +#define CAIRO_RENDER_HAS_EXTENDED_REPEAT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 10) +#define CAIRO_RENDER_HAS_GRADIENTS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 10) + +#define CAIRO_RENDER_HAS_PDF_OPERATORS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 11) + +#define CAIRO_RENDER_SUPPORTS_OPERATOR(surface, op) \ + ((op) <= CAIRO_OPERATOR_SATURATE || \ + (CAIRO_RENDER_HAS_PDF_OPERATORS(surface) && \ + (op) <= CAIRO_OPERATOR_HSL_LUMINOSITY)) + +/* + * Return whether two xlib surfaces share the same + * screen. Both core and Render drawing require this + * when using multiple drawables in an operation. + */ +static inline cairo_bool_t +_cairo_xlib_surface_same_screen (cairo_xlib_surface_t *dst, + cairo_xlib_surface_t *src) +{ + return dst->screen == src->screen; +} + +cairo_private cairo_int_status_t +_cairo_xlib_core_fill_boxes (cairo_xlib_surface_t *dst, + const cairo_color_t *color, + cairo_boxes_t *boxes); + +cairo_private cairo_int_status_t +_cairo_xlib_core_fill_rectangles (cairo_xlib_surface_t *dst, + const cairo_color_t *color, + int num_rects, + cairo_rectangle_int_t *rects); + +static inline void +_cairo_xlib_surface_put_gc (cairo_xlib_display_t *display, + cairo_xlib_surface_t *surface, + GC gc) +{ + _cairo_xlib_screen_put_gc (display, + surface->screen, + surface->depth, + gc); +} + +cairo_private cairo_surface_t * +_cairo_xlib_surface_create_similar_shm (void *surface, + cairo_format_t format, + int width, int height); + +cairo_private cairo_surface_t * +_cairo_xlib_surface_get_shm (cairo_xlib_surface_t *surface, + cairo_bool_t overwrite); + +cairo_private cairo_int_status_t +_cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface); + +cairo_private cairo_surface_t * +_cairo_xlib_surface_create_shm (cairo_xlib_surface_t *other, + pixman_format_code_t format, + int width, int height); + +cairo_private cairo_surface_t * +_cairo_xlib_surface_create_shm__image (cairo_xlib_surface_t *surface, + pixman_format_code_t format, + int width, int height); + +cairo_private void +_cairo_xlib_shm_surface_get_ximage (cairo_surface_t *surface, + XImage *ximage); + +cairo_private void * +_cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface); + +cairo_private void +_cairo_xlib_shm_surface_mark_active (cairo_surface_t *shm); + +cairo_private cairo_bool_t +_cairo_xlib_shm_surface_is_active (cairo_surface_t *surface); + +cairo_private cairo_bool_t +_cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface); + +cairo_private Pixmap +_cairo_xlib_shm_surface_get_pixmap (cairo_surface_t *surface); + +cairo_private XRenderPictFormat * +_cairo_xlib_shm_surface_get_xrender_format (cairo_surface_t *surface); + +cairo_private pixman_format_code_t +_pixman_format_for_xlib_surface (cairo_xlib_surface_t *surface); + +#endif /* CAIRO_XLIB_PRIVATE_H */ diff --git a/src/cairo-xlib-render-compositor.c b/src/cairo-xlib-render-compositor.c new file mode 100644 index 000000000..8a1ec7bd7 --- /dev/null +++ b/src/cairo-xlib-render-compositor.c @@ -0,0 +1,2005 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Behdad Esfahbod + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-damage-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-pattern-private.h" +#include "cairo-pixman-private.h" +#include "cairo-traps-private.h" +#include "cairo-tristrip-private.h" + +static cairo_int_status_t +check_composite (const cairo_composite_rectangles_t *extents) +{ + cairo_xlib_display_t *display = ((cairo_xlib_surface_t *)extents->surface)->display; + + if (! CAIRO_RENDER_SUPPORTS_OPERATOR (display, extents->op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +acquire (void *abstract_dst) +{ + cairo_xlib_surface_t *dst = abstract_dst; + cairo_int_status_t status; + + status = _cairo_xlib_display_acquire (dst->base.device, &dst->display); + if (unlikely (status)) + return status; + + dst->dpy = dst->display->display; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +release (void *abstract_dst) +{ + cairo_xlib_surface_t *dst = abstract_dst; + + cairo_device_release (&dst->display->base); + dst->dpy = NULL; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +set_clip_region (void *_surface, + cairo_region_t *region) +{ + cairo_xlib_surface_t *surface = _surface; + + _cairo_xlib_surface_ensure_picture (surface); + + if (region != NULL) { + XRectangle stack_rects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *rects = stack_rects; + int n_rects, i; + + n_rects = cairo_region_num_rectangles (region); + if (n_rects > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (n_rects, sizeof (XRectangle)); + if (unlikely (rects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + for (i = 0; i < n_rects; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (region, i, &rect); + + rects[i].x = rect.x; + rects[i].y = rect.y; + rects[i].width = rect.width; + rects[i].height = rect.height; + } + XRenderSetPictureClipRectangles (surface->dpy, + surface->picture, + 0, 0, + rects, n_rects); + if (rects != stack_rects) + free (rects); + } else { + XRenderPictureAttributes pa; + pa.clip_mask = None; + XRenderChangePicture (surface->dpy, + surface->picture, + CPClipMask, &pa); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +copy_image_boxes (void *_dst, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy) +{ + cairo_xlib_surface_t *dst = _dst; + struct _cairo_boxes_chunk *chunk; + cairo_int_status_t status; + Pixmap src; + GC gc; + int i, j; + + assert (image->depth == dst->depth); + + status = acquire (dst); + if (unlikely (status)) + return status; + + status = _cairo_xlib_surface_get_gc (dst->display, dst, &gc); + if (unlikely (status)) { + release (dst); + return status; + } + + src = _cairo_xlib_shm_surface_get_pixmap (&image->base); + if (boxes->num_boxes == 1) { + int x1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.x); + int y1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.y); + int x2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.x); + int y2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.y); + + _cairo_xlib_shm_surface_mark_active (&image->base); + XCopyArea (dst->dpy, src, dst->drawable, gc, + x1 + dx, y1 + dy, + x2 - x1, y2 - y1, + x1, y1); + } else { + XRectangle stack_rects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *rects = stack_rects; + + if (boxes->num_boxes > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (boxes->num_boxes, sizeof (XRectangle)); + if (unlikely (rects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + j = 0; + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + if (x2 > x1 && y2 > y1) { + rects[j].x = x1; + rects[j].y = y1; + rects[j].width = x2 - x1; + rects[j].height = y2 - y1; + j++; + } + } + } + + XSetClipRectangles (dst->dpy, gc, 0, 0, rects, j, Unsorted); + _cairo_xlib_shm_surface_mark_active (&image->base); + XCopyArea (dst->dpy, src, dst->drawable, gc, + 0, 0, image->width, image->height, -dx, -dy); + XSetClipMask (dst->dpy, gc, None); + + if (rects != stack_rects) + free (rects); + } + + _cairo_xlib_surface_put_gc (dst->display, dst, gc); + release (dst); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +boxes_cover_surface (cairo_boxes_t *boxes, + cairo_xlib_surface_t *surface) +{ + cairo_box_t *b; + + if (boxes->num_boxes != 1) + return FALSE; + + b = &boxes->chunks.base[0]; + + if (_cairo_fixed_integer_part (b->p1.x) > 0 || + _cairo_fixed_integer_part (b->p1.y) > 0) + return FALSE; + + if (_cairo_fixed_integer_part (b->p2.x) < surface->width || + _cairo_fixed_integer_part (b->p2.y) < surface->height) + return FALSE; + + return TRUE; +} + +static cairo_int_status_t +draw_image_boxes (void *_dst, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy) +{ + cairo_xlib_surface_t *dst = _dst; + struct _cairo_boxes_chunk *chunk; + cairo_image_surface_t *shm = NULL; + cairo_int_status_t status; + int i; + + if (image->base.device == dst->base.device) { + if (image->depth != dst->depth) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (_cairo_xlib_shm_surface_get_pixmap (&image->base)) + return copy_image_boxes (dst, image, boxes, dx, dy); + + goto draw_image_boxes; + } + + if (boxes_cover_surface (boxes, dst)) + shm = (cairo_image_surface_t *) _cairo_xlib_surface_get_shm (dst, TRUE); + if (shm) { + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + cairo_rectangle_int_t r; + + r.x = _cairo_fixed_integer_part (b->p1.x); + r.y = _cairo_fixed_integer_part (b->p1.y); + r.width = _cairo_fixed_integer_part (b->p2.x) - r.x; + r.height = _cairo_fixed_integer_part (b->p2.y) - r.y; + + if (shm->pixman_format != image->pixman_format || + ! pixman_blt ((uint32_t *)image->data, (uint32_t *)shm->data, + image->stride / sizeof (uint32_t), + shm->stride / sizeof (uint32_t), + PIXMAN_FORMAT_BPP (image->pixman_format), + PIXMAN_FORMAT_BPP (shm->pixman_format), + r.x + dx, r.y + dy, + r.x, r.y, + r.width, r.height)) + { + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, NULL, shm->pixman_image, + r.x + dx, r.y + dy, + 0, 0, + r.x, r.y, + r.width, r.height); + } + + shm->base.damage = + _cairo_damage_add_rectangle (shm->base.damage, &r); + } + } + dst->base.is_clear = FALSE; + dst->fallback++; + dst->base.serial++; + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + if (image->depth == dst->depth && + ((cairo_xlib_display_t *)dst->display)->shm) { + cairo_box_t extents; + cairo_rectangle_int_t r; + + _cairo_boxes_extents (boxes, &extents); + _cairo_box_round_to_rectangle (&extents, &r); + + shm = (cairo_image_surface_t *) + _cairo_xlib_surface_create_shm (dst, image->pixman_format, + r.width, r.height); + if (shm) { + int tx = -r.x, ty = -r.y; + + assert (shm->pixman_format == image->pixman_format); + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + + r.x = _cairo_fixed_integer_part (b->p1.x); + r.y = _cairo_fixed_integer_part (b->p1.y); + r.width = _cairo_fixed_integer_part (b->p2.x) - r.x; + r.height = _cairo_fixed_integer_part (b->p2.y) - r.y; + + if (! pixman_blt ((uint32_t *)image->data, (uint32_t *)shm->data, + image->stride / sizeof (uint32_t), + shm->stride / sizeof (uint32_t), + PIXMAN_FORMAT_BPP (image->pixman_format), + PIXMAN_FORMAT_BPP (shm->pixman_format), + r.x + dx, r.y + dy, + r.x + tx, r.y + ty, + r.width, r.height)) + { + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, NULL, shm->pixman_image, + r.x + dx, r.y + dy, + 0, 0, + r.x + tx, r.y + ty, + r.width, r.height); + } + } + } + + dx = tx; + dy = ty; + image = shm; + + if (_cairo_xlib_shm_surface_get_pixmap (&image->base)) { + status = copy_image_boxes (dst, image, boxes, dx, dy); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto out; + } + } + } + +draw_image_boxes: + status = CAIRO_STATUS_SUCCESS; + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + cairo_box_t *b = &chunk->base[i]; + int x1 = _cairo_fixed_integer_part (b->p1.x); + int y1 = _cairo_fixed_integer_part (b->p1.y); + int x2 = _cairo_fixed_integer_part (b->p2.x); + int y2 = _cairo_fixed_integer_part (b->p2.y); + if (_cairo_xlib_surface_draw_image (dst, image, + x1 + dx, y1 + dy, + x2 - x1, y2 - y1, + x1, y1)) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + goto out; + } + } + } + +out: + cairo_surface_destroy (&shm->base); + return status; +} + +static cairo_int_status_t +copy_boxes (void *_dst, + cairo_surface_t *_src, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents, + int dx, int dy) +{ + cairo_xlib_surface_t *dst = _dst; + cairo_xlib_surface_t *src = (cairo_xlib_surface_t *)_src; + struct _cairo_boxes_chunk *chunk; + cairo_int_status_t status; + GC gc; + Drawable d; + int i, j; + + if (! _cairo_xlib_surface_same_screen (dst, src)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (dst->depth != src->depth) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = acquire (dst); + if (unlikely (status)) + return status; + + status = _cairo_xlib_surface_get_gc (dst->display, dst, &gc); + if (unlikely (status)) { + release (dst); + return status; + } + + if (src->fallback && src->shm->damage->dirty) { + assert (src != dst); + d = _cairo_xlib_shm_surface_get_pixmap (src->shm); + assert (d != 0); + } else { + if (! src->owns_pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = IncludeInferiors; + XChangeGC (dst->display->display, gc, GCSubwindowMode, &gcv); + } + d = src->drawable; + } + + if (boxes->num_boxes == 1) { + int x1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.x); + int y1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.y); + int x2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.x); + int y2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.y); + + XCopyArea (dst->dpy, d, dst->drawable, gc, + x1 + dx, y1 + dy, + x2 - x1, y2 - y1, + x1, y1); + } else { + /* We can only have a single control for subwindow_mode on the + * GC. If we have a Window destination, we need to set ClipByChildren, + * but if we have a Window source, we need IncludeInferiors. If we have + * both a Window destination and source, we must fallback. There is + * no convenient way to detect if a drawable is a Pixmap or Window, + * therefore we can only rely on those surfaces that we created + * ourselves to be Pixmaps, and treat everything else as a potential + * Window. + */ + if (src == dst || (!src->owns_pixmap && !dst->owns_pixmap)) { + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + XCopyArea (dst->dpy, d, dst->drawable, gc, + x1 + dx, y1 + dy, + x2 - x1, y2 - y1, + x1, y1); + } + } + } else { + XRectangle stack_rects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *rects = stack_rects; + + if (boxes->num_boxes > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (boxes->num_boxes, sizeof (XRectangle)); + if (unlikely (rects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + j = 0; + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + rects[j].x = x1; + rects[j].y = y1; + rects[j].width = x2 - x1; + rects[j].height = y2 - y1; + j++; + } + } + assert (j == boxes->num_boxes); + + XSetClipRectangles (dst->dpy, gc, 0, 0, rects, j, Unsorted); + + XCopyArea (dst->dpy, d, dst->drawable, gc, + extents->x + dx, extents->y + dy, + extents->width, extents->height, + extents->x, extents->y); + + XSetClipMask (dst->dpy, gc, None); + + if (rects != stack_rects) + free (rects); + } + } + + if (src->fallback && src->shm->damage->dirty) { + _cairo_xlib_shm_surface_mark_active (src->shm); + } else if (! src->owns_pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = ClipByChildren; + XChangeGC (dst->display->display, gc, GCSubwindowMode, &gcv); + } + + _cairo_xlib_surface_put_gc (dst->display, dst, gc); + release (dst); + return CAIRO_STATUS_SUCCESS; +} + +static int +_render_operator (cairo_operator_t op) +{ + switch (op) { + case CAIRO_OPERATOR_CLEAR: + return PictOpClear; + + case CAIRO_OPERATOR_SOURCE: + return PictOpSrc; + case CAIRO_OPERATOR_OVER: + return PictOpOver; + case CAIRO_OPERATOR_IN: + return PictOpIn; + case CAIRO_OPERATOR_OUT: + return PictOpOut; + case CAIRO_OPERATOR_ATOP: + return PictOpAtop; + + case CAIRO_OPERATOR_DEST: + return PictOpDst; + case CAIRO_OPERATOR_DEST_OVER: + return PictOpOverReverse; + case CAIRO_OPERATOR_DEST_IN: + return PictOpInReverse; + case CAIRO_OPERATOR_DEST_OUT: + return PictOpOutReverse; + case CAIRO_OPERATOR_DEST_ATOP: + return PictOpAtopReverse; + + case CAIRO_OPERATOR_XOR: + return PictOpXor; + case CAIRO_OPERATOR_ADD: + return PictOpAdd; + case CAIRO_OPERATOR_SATURATE: + return PictOpSaturate; + + case CAIRO_OPERATOR_MULTIPLY: + return PictOpMultiply; + case CAIRO_OPERATOR_SCREEN: + return PictOpScreen; + case CAIRO_OPERATOR_OVERLAY: + return PictOpOverlay; + case CAIRO_OPERATOR_DARKEN: + return PictOpDarken; + case CAIRO_OPERATOR_LIGHTEN: + return PictOpLighten; + case CAIRO_OPERATOR_COLOR_DODGE: + return PictOpColorDodge; + case CAIRO_OPERATOR_COLOR_BURN: + return PictOpColorBurn; + case CAIRO_OPERATOR_HARD_LIGHT: + return PictOpHardLight; + case CAIRO_OPERATOR_SOFT_LIGHT: + return PictOpSoftLight; + case CAIRO_OPERATOR_DIFFERENCE: + return PictOpDifference; + case CAIRO_OPERATOR_EXCLUSION: + return PictOpExclusion; + case CAIRO_OPERATOR_HSL_HUE: + return PictOpHSLHue; + case CAIRO_OPERATOR_HSL_SATURATION: + return PictOpHSLSaturation; + case CAIRO_OPERATOR_HSL_COLOR: + return PictOpHSLColor; + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return PictOpHSLLuminosity; + + default: + ASSERT_NOT_REACHED; + return PictOpOver; + } +} + +static cairo_bool_t +fill_reduces_to_source (cairo_operator_t op, + const cairo_color_t *color, + cairo_xlib_surface_t *dst) +{ + if (dst->base.is_clear || CAIRO_COLOR_IS_OPAQUE (color)) { + if (op == CAIRO_OPERATOR_OVER) + return TRUE; + if (op == CAIRO_OPERATOR_ADD) + return (dst->base.content & CAIRO_CONTENT_COLOR) == 0; + } + + return FALSE; +} + +static cairo_int_status_t +fill_rectangles (void *abstract_surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_rectangle_int_t *rects, + int num_rects) +{ + cairo_xlib_surface_t *dst = abstract_surface; + XRenderColor render_color; + int i; + + //X_DEBUG ((display->display, "fill_rectangles (dst=%x)", (unsigned int) surface->drawable)); + + if (fill_reduces_to_source (op, color, dst)) + op = CAIRO_OPERATOR_SOURCE; + + if (!CAIRO_RENDER_HAS_FILL_RECTANGLES(dst->display)) { + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (op == CAIRO_OPERATOR_SOURCE) + status = _cairo_xlib_core_fill_rectangles (dst, color, num_rects, rects); + return status; + } + + render_color.red = color->red_short; + render_color.green = color->green_short; + render_color.blue = color->blue_short; + render_color.alpha = color->alpha_short; + + _cairo_xlib_surface_ensure_picture (dst); + if (num_rects == 1) { + /* Take advantage of the protocol compaction that libXrender performs + * to amalgamate sequences of XRenderFillRectangle(). + */ + XRenderFillRectangle (dst->dpy, + _render_operator (op), + dst->picture, + &render_color, + rects->x, rects->y, + rects->width, rects->height); + } else { + XRectangle stack_xrects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *xrects = stack_xrects; + + if (num_rects > ARRAY_LENGTH (stack_xrects)) { + xrects = _cairo_malloc_ab (num_rects, sizeof (XRectangle)); + if (unlikely (xrects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + for (i = 0; i < num_rects; i++) { + xrects[i].x = rects[i].x; + xrects[i].y = rects[i].y; + xrects[i].width = rects[i].width; + xrects[i].height = rects[i].height; + } + + XRenderFillRectangles (dst->dpy, + _render_operator (op), + dst->picture, + &render_color, xrects, num_rects); + + if (xrects != stack_xrects) + free (xrects); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +fill_boxes (void *abstract_surface, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + cairo_xlib_surface_t *dst = abstract_surface; + XRenderColor render_color; + + if (fill_reduces_to_source (op, color, dst)) + op = CAIRO_OPERATOR_SOURCE; + + if (!CAIRO_RENDER_HAS_FILL_RECTANGLES(dst->display)) { + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (op == CAIRO_OPERATOR_SOURCE) + status = _cairo_xlib_core_fill_boxes (dst, color, boxes); + return status; + } + + render_color.red = color->red_short; + render_color.green = color->green_short; + render_color.blue = color->blue_short; + render_color.alpha = color->alpha_short; + + _cairo_xlib_surface_ensure_picture (dst); + if (boxes->num_boxes == 1) { + int x1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.x); + int y1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.y); + int x2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.x); + int y2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.y); + + /* Take advantage of the protocol compaction that libXrender performs + * to amalgamate sequences of XRenderFillRectangle(). + */ + XRenderFillRectangle (dst->dpy, + _render_operator (op), + dst->picture, + &render_color, + x1, y1, + x2 - x1, y2 - y1); + } else { + XRectangle stack_xrects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *xrects = stack_xrects; + struct _cairo_boxes_chunk *chunk; + int i, j; + + if (boxes->num_boxes > ARRAY_LENGTH (stack_xrects)) { + xrects = _cairo_malloc_ab (boxes->num_boxes, sizeof (XRectangle)); + if (unlikely (xrects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + j = 0; + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + xrects[j].x = x1; + xrects[j].y = y1; + xrects[j].width = x2 - x1; + xrects[j].height = y2 - y1; + j++; + } + } + + XRenderFillRectangles (dst->dpy, + _render_operator (op), + dst->picture, + &render_color, xrects, j); + + if (xrects != stack_xrects) + free (xrects); + } + + return CAIRO_STATUS_SUCCESS; +} + +#if 0 +check_composite () + operation = _categorize_composite_operation (dst, op, src_pattern, + mask_pattern != NULL); + if (operation == DO_UNSUPPORTED) + return UNSUPPORTED ("unsupported operation"); + + //X_DEBUG ((display->display, "composite (dst=%x)", (unsigned int) dst->drawable)); + + operation = _recategorize_composite_operation (dst, op, src, &src_attr, + mask_pattern != NULL); + if (operation == DO_UNSUPPORTED) { + status = UNSUPPORTED ("unsupported operation"); + goto BAIL; + } +#endif + +static cairo_int_status_t +composite (void *abstract_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + cairo_xlib_surface_t *dst = abstract_dst; + cairo_xlib_source_t *src = (cairo_xlib_source_t *)abstract_src; + + op = _render_operator (op); + + _cairo_xlib_surface_ensure_picture (dst); + if (abstract_mask) { + cairo_xlib_source_t *mask = (cairo_xlib_source_t *)abstract_mask; + + XRenderComposite (dst->dpy, op, + src->picture, mask->picture, dst->picture, + src_x, src_y, + mask_x, mask_y, + dst_x, dst_y, + width, height); + } else { + XRenderComposite (dst->dpy, op, + src->picture, 0, dst->picture, + src_x, src_y, + 0, 0, + dst_x, dst_y, + width, height); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +lerp (void *abstract_dst, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + cairo_xlib_surface_t *dst = abstract_dst; + cairo_xlib_source_t *src = (cairo_xlib_source_t *)abstract_src; + cairo_xlib_source_t *mask = (cairo_xlib_source_t *)abstract_mask; + + _cairo_xlib_surface_ensure_picture (dst); + XRenderComposite (dst->dpy, PictOpOutReverse, + mask->picture, None, dst->picture, + mask_x, mask_y, + 0, 0, + dst_x, dst_y, + width, height); + XRenderComposite (dst->dpy, PictOpAdd, + src->picture, mask->picture, dst->picture, + src_x, src_y, + mask_x, mask_y, + dst_x, dst_y, + width, height); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_boxes (void *abstract_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents) +{ + cairo_xlib_surface_t *dst = abstract_dst; + Picture src = ((cairo_xlib_source_t *)abstract_src)->picture; + Picture mask = abstract_mask ? ((cairo_xlib_source_t *)abstract_mask)->picture : 0; + XRectangle stack_rects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *rects = stack_rects; + struct _cairo_boxes_chunk *chunk; + int i, j; + + op = _render_operator (op); + _cairo_xlib_surface_ensure_picture (dst); + if (boxes->num_boxes == 1) { + int x1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.x); + int y1 = _cairo_fixed_integer_part (boxes->chunks.base[0].p1.y); + int x2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.x); + int y2 = _cairo_fixed_integer_part (boxes->chunks.base[0].p2.y); + + XRenderComposite (dst->dpy, op, + src, mask, dst->picture, + x1 + src_x, y1 + src_y, + x1 + mask_x, y1 + mask_y, + x1 - dst_x, y1 - dst_y, + x2 - x1, y2 - y1); + return CAIRO_STATUS_SUCCESS; + } + + if (boxes->num_boxes > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (boxes->num_boxes, sizeof (XRectangle)); + if (unlikely (rects == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + j = 0; + for (chunk = &boxes->chunks; chunk; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + rects[j].x = x1 - dst_x; + rects[j].y = y1 - dst_y; + rects[j].width = x2 - x1; + rects[j].height = y2 - y1; + j++; + } + } + assert (j == boxes->num_boxes); + + XRenderSetPictureClipRectangles (dst->dpy, + dst->picture, + 0, 0, + rects, j); + if (rects != stack_rects) + free (rects); + + XRenderComposite (dst->dpy, op, + src, mask, dst->picture, + extents->x + src_x, extents->y + src_y, + extents->x + mask_x, extents->y + mask_y, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + set_clip_region (dst, NULL); + + return CAIRO_STATUS_SUCCESS; +} + +/* font rendering */ + +void +_cairo_xlib_font_close (cairo_xlib_font_t *priv) +{ + cairo_xlib_display_t *display = (cairo_xlib_display_t *)priv->base.key; + int i; + + /* XXX All I really want is to do is zap my glyphs... */ + _cairo_scaled_font_reset_cache (priv->font); + + for (i = 0; i < NUM_GLYPHSETS; i++) { + cairo_xlib_font_glyphset_t *info; + + info = &priv->glyphset[i]; + if (info->glyphset) + XRenderFreeGlyphSet (display->display, info->glyphset); + } + + /* XXX locking */ + cairo_list_del (&priv->link); + cairo_list_del (&priv->base.link); + free (priv); +} + +static void +_cairo_xlib_font_fini (cairo_scaled_font_private_t *abstract_private, + cairo_scaled_font_t *font) +{ + cairo_xlib_font_t *priv = (cairo_xlib_font_t *) abstract_private; + cairo_status_t status; + cairo_xlib_display_t *display; + int i; + + cairo_list_del (&priv->base.link); + cairo_list_del (&priv->link); + + status = _cairo_xlib_display_acquire (priv->device, &display); + if (status) + goto BAIL; + + for (i = 0; i < NUM_GLYPHSETS; i++) { + cairo_xlib_font_glyphset_t *info; + + info = &priv->glyphset[i]; + if (info->glyphset) + XRenderFreeGlyphSet (display->display, info->glyphset); + } + + cairo_device_release (&display->base); +BAIL: + cairo_device_destroy (&display->base); + free (priv); +} + +static cairo_xlib_font_t * +_cairo_xlib_font_create (cairo_xlib_display_t *display, + cairo_scaled_font_t *font) +{ + cairo_xlib_font_t *priv; + int i; + + priv = malloc (sizeof (cairo_xlib_font_t)); + if (unlikely (priv == NULL)) + return NULL; + + _cairo_scaled_font_attach_private (font, &priv->base, display, + _cairo_xlib_font_fini); + + priv->device = cairo_device_reference (&display->base); + priv->font = font; + cairo_list_add (&priv->link, &display->fonts); + + for (i = 0; i < NUM_GLYPHSETS; i++) { + cairo_xlib_font_glyphset_t *info = &priv->glyphset[i]; + switch (i) { + case GLYPHSET_INDEX_ARGB32: info->format = CAIRO_FORMAT_ARGB32; break; + case GLYPHSET_INDEX_A8: info->format = CAIRO_FORMAT_A8; break; + case GLYPHSET_INDEX_A1: info->format = CAIRO_FORMAT_A1; break; + default: ASSERT_NOT_REACHED; break; + } + info->xrender_format = NULL; + info->glyphset = None; + info->to_free.count = 0; + } + + return priv; +} + +static int +_cairo_xlib_get_glyphset_index_for_format (cairo_format_t format) +{ + if (format == CAIRO_FORMAT_A8) + return GLYPHSET_INDEX_A8; + if (format == CAIRO_FORMAT_A1) + return GLYPHSET_INDEX_A1; + + assert (format == CAIRO_FORMAT_ARGB32); + return GLYPHSET_INDEX_ARGB32; +} + +static inline cairo_xlib_font_t * +_cairo_xlib_font_get (const cairo_xlib_display_t *display, + cairo_scaled_font_t *font) +{ + return (cairo_xlib_font_t *)_cairo_scaled_font_find_private (font, display); +} + +typedef struct { + cairo_scaled_glyph_private_t base; + + + cairo_xlib_font_glyphset_t *glyphset; +} cairo_xlib_glyph_private_t; + +static void +_cairo_xlib_glyph_fini (cairo_scaled_glyph_private_t *glyph_private, + cairo_scaled_glyph_t *glyph, + cairo_scaled_font_t *font) +{ + cairo_xlib_glyph_private_t *priv = (cairo_xlib_glyph_private_t *)glyph_private; + + if (! font->finished) { + cairo_xlib_font_t *font_private; + struct _cairo_xlib_font_glyphset_free_glyphs *to_free; + cairo_xlib_font_glyphset_t *info; + + font_private = _cairo_xlib_font_get (glyph_private->key, font); + assert (font_private); + + info = priv->glyphset; + to_free = &info->to_free; + if (to_free->count == ARRAY_LENGTH (to_free->indices)) { + cairo_xlib_display_t *display; + + if (_cairo_xlib_display_acquire (font_private->device, + &display) == CAIRO_STATUS_SUCCESS) { + XRenderFreeGlyphs (display->display, + info->glyphset, + to_free->indices, + to_free->count); + cairo_device_release (&display->base); + } + + to_free->count = 0; + } + + to_free->indices[to_free->count++] = + _cairo_scaled_glyph_index (glyph); + } + + cairo_list_del (&glyph_private->link); + free (glyph_private); +} + +static cairo_status_t +_cairo_xlib_glyph_attach (cairo_xlib_display_t *display, + cairo_scaled_glyph_t *glyph, + cairo_xlib_font_glyphset_t *info) +{ + cairo_xlib_glyph_private_t *priv; + + priv = malloc (sizeof (*priv)); + if (unlikely (priv == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_scaled_glyph_attach_private (glyph, &priv->base, display, + _cairo_xlib_glyph_fini); + priv->glyphset = info; + + glyph->dev_private = info; + glyph->dev_private_key = display; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_xlib_font_glyphset_t * +_cairo_xlib_font_get_glyphset_info_for_format (cairo_xlib_display_t *display, + cairo_scaled_font_t *font, + cairo_format_t format) +{ + cairo_xlib_font_t *priv; + cairo_xlib_font_glyphset_t *info; + int glyphset_index; + + glyphset_index = _cairo_xlib_get_glyphset_index_for_format (format); + + priv = _cairo_xlib_font_get (display, font); + if (priv == NULL) { + priv = _cairo_xlib_font_create (display, font); + if (priv == NULL) + return NULL; + } + + info = &priv->glyphset[glyphset_index]; + if (info->glyphset == None) { + info->xrender_format = + _cairo_xlib_display_get_xrender_format (display, info->format); + info->glyphset = XRenderCreateGlyphSet (display->display, + info->xrender_format); + } + + return info; +} + +static cairo_bool_t +has_pending_free_glyph (cairo_xlib_font_glyphset_t *info, + unsigned long glyph_index) +{ + struct _cairo_xlib_font_glyphset_free_glyphs *to_free; + int i; + + to_free = &info->to_free; + for (i = 0; i < to_free->count; i++) { + if (to_free->indices[i] == glyph_index) { + to_free->count--; + memmove (&to_free->indices[i], + &to_free->indices[i+1], + (to_free->count - i) * sizeof (to_free->indices[0])); + return TRUE; + } + } + + return FALSE; +} + +static cairo_xlib_font_glyphset_t * +find_pending_free_glyph (cairo_xlib_display_t *display, + cairo_scaled_font_t *font, + unsigned long glyph_index, + cairo_image_surface_t *surface) +{ + cairo_xlib_font_t *priv; + int i; + + priv = _cairo_xlib_font_get (display, font); + if (priv == NULL) + return NULL; + + if (surface != NULL) { + i = _cairo_xlib_get_glyphset_index_for_format (surface->format); + if (has_pending_free_glyph (&priv->glyphset[i], glyph_index)) + return &priv->glyphset[i]; + } else { + for (i = 0; i < NUM_GLYPHSETS; i++) { + if (has_pending_free_glyph (&priv->glyphset[i], glyph_index)) + return &priv->glyphset[i]; + } + } + + return NULL; +} + +static cairo_status_t +_cairo_xlib_surface_add_glyph (cairo_xlib_display_t *display, + cairo_scaled_font_t *font, + cairo_scaled_glyph_t **pscaled_glyph) +{ + XGlyphInfo glyph_info; + unsigned long glyph_index; + unsigned char *data; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_scaled_glyph_t *glyph = *pscaled_glyph; + cairo_image_surface_t *glyph_surface = glyph->surface; + cairo_bool_t already_had_glyph_surface; + cairo_xlib_font_glyphset_t *info; + + glyph_index = _cairo_scaled_glyph_index (glyph); + + /* check to see if we have a pending XRenderFreeGlyph for this glyph */ + info = find_pending_free_glyph (display, font, glyph_index, glyph_surface); + if (info != NULL) + return _cairo_xlib_glyph_attach (display, glyph, info); + + if (glyph_surface == NULL) { + status = _cairo_scaled_glyph_lookup (font, + glyph_index, + CAIRO_SCALED_GLYPH_INFO_METRICS | + CAIRO_SCALED_GLYPH_INFO_SURFACE, + pscaled_glyph); + if (unlikely (status)) + return status; + + glyph = *pscaled_glyph; + glyph_surface = glyph->surface; + already_had_glyph_surface = FALSE; + } else { + already_had_glyph_surface = TRUE; + } + + info = _cairo_xlib_font_get_glyphset_info_for_format (display, font, + glyph_surface->format); + +#if 0 + /* If the glyph surface has zero height or width, we create + * a clear 1x1 surface, to avoid various X server bugs. + */ + if (glyph_surface->width == 0 || glyph_surface->height == 0) { + cairo_surface_t *tmp_surface; + + tmp_surface = cairo_image_surface_create (info->format, 1, 1); + status = tmp_surface->status; + if (unlikely (status)) + goto BAIL; + + tmp_surface->device_transform = glyph_surface->base.device_transform; + tmp_surface->device_transform_inverse = glyph_surface->base.device_transform_inverse; + + glyph_surface = (cairo_image_surface_t *) tmp_surface; + } +#endif + + /* If the glyph format does not match the font format, then we + * create a temporary surface for the glyph image with the font's + * format. + */ + if (glyph_surface->format != info->format) { + cairo_surface_pattern_t pattern; + cairo_surface_t *tmp_surface; + + tmp_surface = cairo_image_surface_create (info->format, + glyph_surface->width, + glyph_surface->height); + status = tmp_surface->status; + if (unlikely (status)) + goto BAIL; + + tmp_surface->device_transform = glyph_surface->base.device_transform; + tmp_surface->device_transform_inverse = glyph_surface->base.device_transform_inverse; + + _cairo_pattern_init_for_surface (&pattern, &glyph_surface->base); + status = _cairo_surface_paint (tmp_surface, + CAIRO_OPERATOR_SOURCE, &pattern.base, + NULL); + _cairo_pattern_fini (&pattern.base); + + glyph_surface = (cairo_image_surface_t *) tmp_surface; + + if (unlikely (status)) + goto BAIL; + } + + /* XXX: FRAGILE: We're ignore device_transform scaling here. A bug? */ + glyph_info.x = _cairo_lround (glyph_surface->base.device_transform.x0); + glyph_info.y = _cairo_lround (glyph_surface->base.device_transform.y0); + glyph_info.width = glyph_surface->width; + glyph_info.height = glyph_surface->height; + glyph_info.xOff = glyph->x_advance; + glyph_info.yOff = glyph->y_advance; + + data = glyph_surface->data; + + /* flip formats around */ + switch (_cairo_xlib_get_glyphset_index_for_format (glyph->surface->format)) { + case GLYPHSET_INDEX_A1: + /* local bitmaps are always stored with bit == byte */ + if (_cairo_is_little_endian() != (BitmapBitOrder (display->display) == LSBFirst)) { + int c = glyph_surface->stride * glyph_surface->height; + unsigned char *d; + unsigned char *new, *n; + + if (c == 0) + break; + + new = malloc (c); + if (!new) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + n = new; + d = data; + do { + char b = *d++; + b = ((b << 1) & 0xaa) | ((b >> 1) & 0x55); + b = ((b << 2) & 0xcc) | ((b >> 2) & 0x33); + b = ((b << 4) & 0xf0) | ((b >> 4) & 0x0f); + *n++ = b; + } while (--c); + data = new; + } + break; + case GLYPHSET_INDEX_A8: + break; + case GLYPHSET_INDEX_ARGB32: + if (_cairo_is_little_endian() != (ImageByteOrder (display->display) == LSBFirst)) { + unsigned int c = glyph_surface->stride * glyph_surface->height / 4; + const uint32_t *d; + uint32_t *new, *n; + + if (c == 0) + break; + + new = malloc (4 * c); + if (unlikely (new == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + n = new; + d = (uint32_t *) data; + do { + *n++ = bswap_32 (*d); + d++; + } while (--c); + data = (uint8_t *) new; + } + break; + default: + ASSERT_NOT_REACHED; + break; + } + /* XXX assume X server wants pixman padding. Xft assumes this as well */ + + XRenderAddGlyphs (display->display, info->glyphset, + &glyph_index, &glyph_info, 1, + (char *) data, + glyph_surface->stride * glyph_surface->height); + + if (data != glyph_surface->data) + free (data); + + status = _cairo_xlib_glyph_attach (display, glyph, info); + + BAIL: + if (glyph_surface != glyph->surface) + cairo_surface_destroy (&glyph_surface->base); + + /* if the scaled glyph didn't already have a surface attached + * to it, release the created surface now that we have it + * uploaded to the X server. If the surface has already been + * there (eg. because image backend requested it), leave it in + * the cache + */ + if (!already_had_glyph_surface) + _cairo_scaled_glyph_set_surface (glyph, font, NULL); + + return status; +} + +typedef void (*cairo_xrender_composite_text_func_t) + (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt8 *elts, + int nelt); + +/* Build a struct of the same size of #cairo_glyph_t that can be used both as + * an input glyph with double coordinates, and as "working" glyph with + * integer from-current-point offsets. */ +typedef union { + cairo_glyph_t d; + unsigned long index; + struct { + unsigned long index; + int x; + int y; + } i; +} cairo_xlib_glyph_t; + +/* compile-time assert that #cairo_xlib_glyph_t is the same size as #cairo_glyph_t */ +COMPILE_TIME_ASSERT (sizeof (cairo_xlib_glyph_t) == sizeof (cairo_glyph_t)); + +/* Start a new element for the first glyph, + * or for any glyph that has unexpected position, + * or if current element has too many glyphs + * (Xrender limits each element to 252 glyphs, we limit them to 128) + * + * These same conditions need to be mirrored between + * _cairo_xlib_surface_emit_glyphs and _emit_glyph_chunks + */ +#define _start_new_glyph_elt(count, glyph) \ + (((count) & 127) == 0 || (glyph)->i.x || (glyph)->i.y) + +static cairo_status_t +_emit_glyphs_chunk (cairo_xlib_display_t *display, + cairo_xlib_surface_t *dst, + int dst_x, int dst_y, + cairo_xlib_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *font, + cairo_bool_t use_mask, + cairo_operator_t op, + cairo_xlib_source_t *src, + int src_x, int src_y, + /* info for this chunk */ + int num_elts, + int width, + cairo_xlib_font_glyphset_t *info) +{ + /* Which XRenderCompositeText function to use */ + cairo_xrender_composite_text_func_t composite_text_func; + int size; + + /* Element buffer stuff */ + XGlyphElt8 *elts; + XGlyphElt8 stack_elts[CAIRO_STACK_ARRAY_LENGTH (XGlyphElt8)]; + + /* Reuse the input glyph array for output char generation */ + char *char8 = (char *) glyphs; + unsigned short *char16 = (unsigned short *) glyphs; + unsigned int *char32 = (unsigned int *) glyphs; + + int i; + int nelt; /* Element index */ + int n; /* Num output glyphs in current element */ + int j; /* Num output glyphs so far */ + + switch (width) { + case 1: + /* don't cast the 8-variant, to catch possible mismatches */ + composite_text_func = XRenderCompositeText8; + size = sizeof (char); + break; + case 2: + composite_text_func = (cairo_xrender_composite_text_func_t) XRenderCompositeText16; + size = sizeof (unsigned short); + break; + default: + case 4: + composite_text_func = (cairo_xrender_composite_text_func_t) XRenderCompositeText32; + size = sizeof (unsigned int); + } + + /* Allocate element array */ + if (num_elts <= ARRAY_LENGTH (stack_elts)) { + elts = stack_elts; + } else { + elts = _cairo_malloc_ab (num_elts, sizeof (XGlyphElt8)); + if (unlikely (elts == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* Fill them in */ + nelt = 0; + n = 0; + j = 0; + for (i = 0; i < num_glyphs; i++) { + /* Start a new element for first output glyph, + * or for any glyph that has unexpected position, + * or if current element has too many glyphs. + * + * These same conditions are mirrored in _cairo_xlib_surface_emit_glyphs() + */ + if (_start_new_glyph_elt (j, &glyphs[i])) { + if (j) { + elts[nelt].nchars = n; + nelt++; + n = 0; + } + elts[nelt].chars = char8 + size * j; + elts[nelt].glyphset = info->glyphset; + elts[nelt].xOff = glyphs[i].i.x; + elts[nelt].yOff = glyphs[i].i.y; + } + + switch (width) { + case 1: char8 [j] = (char) glyphs[i].index; break; + case 2: char16[j] = (unsigned short) glyphs[i].index; break; + default: + case 4: char32[j] = (unsigned int) glyphs[i].index; break; + } + + n++; + j++; + } + + if (n) { + elts[nelt].nchars = n; + nelt++; + } + + /* Check that we agree with _cairo_xlib_surface_emit_glyphs() on the + * expected number of xGlyphElts. */ + assert (nelt == num_elts); + + composite_text_func (display->display, op, + src->picture, + dst->picture, + use_mask ? info->xrender_format : NULL, + src_x + elts[0].xOff + dst_x, + src_y + elts[0].yOff + dst_y, + elts[0].xOff, elts[0].yOff, + (XGlyphElt8 *) elts, nelt); + + if (elts != stack_elts) + free (elts); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +check_composite_glyphs (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *font, + cairo_glyph_t *glyphs, + int *num_glyphs) +{ + cairo_xlib_surface_t *dst = (cairo_xlib_surface_t *)extents->surface; + cairo_xlib_display_t *display = dst->display; + int max_request_size, size; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (! CAIRO_RENDER_SUPPORTS_OPERATOR (display, extents->op)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* The glyph coordinates must be representable in an int16_t. + * When possible, they will be expressed as an offset from the + * previous glyph, otherwise they will be an offset from the + * surface origin. If we can't guarantee this to be possible, + * fallback. + */ + if (extents->bounded.x + extents->bounded.width > INT16_MAX || + extents->bounded.y + extents->bounded.height> INT16_MAX || + extents->bounded.x < INT16_MIN || + extents->bounded.y < INT16_MIN) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* Approximate the size of the largest glyph and fallback if we can not + * upload it to the xserver. + */ + size = ceil (font->max_scale); + size = 4 * size * size; + max_request_size = (XExtendedMaxRequestSize (display->display) ? XExtendedMaxRequestSize (display->display) + : XMaxRequestSize (display->display)) * 4 - + sz_xRenderAddGlyphsReq - + sz_xGlyphInfo - + 8; + if (size >= max_request_size) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +/* sz_xGlyphtElt required alignment to a 32-bit boundary, so ensure we have + * enough room for padding */ +#define _cairo_sz_xGlyphElt (sz_xGlyphElt + 4) + +static cairo_int_status_t +composite_glyphs (void *surface, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + cairo_xlib_surface_t *dst = surface; + cairo_xlib_glyph_t *glyphs = (cairo_xlib_glyph_t *)info->glyphs; + cairo_xlib_source_t *src = (cairo_xlib_source_t *)_src; + cairo_xlib_display_t *display = dst->display; + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + cairo_scaled_glyph_t *glyph; + cairo_fixed_t x = dst_x, y = dst_y; + cairo_xlib_font_glyphset_t *glyphset = NULL, *this_glyphset_info; + + unsigned long max_index = 0; + int width = 1; + int num_elts = 0; + int num_out_glyphs = 0; + int num_glyphs = info->num_glyphs; + + int max_request_size = XMaxRequestSize (display->display) * 4 + - MAX (sz_xRenderCompositeGlyphs8Req, + MAX(sz_xRenderCompositeGlyphs16Req, + sz_xRenderCompositeGlyphs32Req)); + int request_size = 0; + int i; + + op = _render_operator (op), + _cairo_xlib_surface_ensure_picture (dst); + for (i = 0; i < num_glyphs; i++) { + int this_x, this_y; + int old_width; + + status = _cairo_scaled_glyph_lookup (info->font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &glyph); + if (unlikely (status)) + return status; + + this_x = _cairo_lround (glyphs[i].d.x); + this_y = _cairo_lround (glyphs[i].d.y); + + /* Send unsent glyphs to the server */ + if (glyph->dev_private_key != display) { + status = _cairo_xlib_surface_add_glyph (display, info->font, &glyph); + if (unlikely (status)) + return status; + } + + this_glyphset_info = glyph->dev_private; + if (!glyphset) + glyphset = this_glyphset_info; + + /* The invariant here is that we can always flush the glyphs + * accumulated before this one, using old_width, and they + * would fit in the request. + */ + old_width = width; + + /* Update max glyph index */ + if (glyphs[i].index > max_index) { + max_index = glyphs[i].index; + if (max_index >= 65536) + width = 4; + else if (max_index >= 256) + width = 2; + if (width != old_width) + request_size += (width - old_width) * num_out_glyphs; + } + + /* If we will pass the max request size by adding this glyph, + * flush current glyphs. Note that we account for a + * possible element being added below. + * + * Also flush if changing glyphsets, as Xrender limits one mask + * format per request, so we can either break up, or use a + * wide-enough mask format. We do the former. One reason to + * prefer the latter is the fact that Xserver ADDs all glyphs + * to the mask first, and then composes that to final surface, + * though it's not a big deal. + * + * If the glyph has a coordinate which cannot be represented + * as a 16-bit offset from the previous glyph, flush the + * current chunk. The current glyph will be the first one in + * the next chunk, thus its coordinates will be an offset from + * the destination origin. This offset is guaranteed to be + * representable as 16-bit offset (otherwise we would have + * fallen back). + */ + if (request_size + width > max_request_size - _cairo_sz_xGlyphElt || + this_x - x > INT16_MAX || this_x - x < INT16_MIN || + this_y - y > INT16_MAX || this_y - y < INT16_MIN || + (this_glyphset_info != glyphset)) { + status = _emit_glyphs_chunk (display, dst, dst_x, dst_y, + glyphs, i, info->font, info->use_mask, + op, src, src_x, src_y, + num_elts, old_width, glyphset); + if (unlikely (status)) + return status; + + glyphs += i; + num_glyphs -= i; + i = 0; + max_index = glyphs[i].index; + width = max_index < 256 ? 1 : max_index < 65536 ? 2 : 4; + request_size = 0; + num_elts = 0; + num_out_glyphs = 0; + x = y = 0; + glyphset = this_glyphset_info; + } + + /* Convert absolute glyph position to relative-to-current-point + * position */ + glyphs[i].i.x = this_x - x; + glyphs[i].i.y = this_y - y; + + /* Start a new element for the first glyph, + * or for any glyph that has unexpected position, + * or if current element has too many glyphs. + * + * These same conditions are mirrored in _emit_glyphs_chunk(). + */ + if (_start_new_glyph_elt (num_out_glyphs, &glyphs[i])) { + num_elts++; + request_size += _cairo_sz_xGlyphElt; + } + + /* adjust current-position */ + x = this_x + glyph->x_advance; + y = this_y + glyph->y_advance; + + num_out_glyphs++; + request_size += width; + } + + if (num_elts) { + status = _emit_glyphs_chunk (display, dst, dst_x, dst_y, + glyphs, i, info->font, info->use_mask, + op, src, src_x, src_y, + num_elts, width, glyphset); + } + + return status; +} + +const cairo_compositor_t * +_cairo_xlib_mask_compositor_get (void) +{ + static cairo_mask_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_mask_compositor_init (&compositor, + _cairo_xlib_fallback_compositor_get ()); + + compositor.acquire = acquire; + compositor.release = release; + compositor.set_clip_region = set_clip_region; + compositor.pattern_to_surface = _cairo_xlib_source_create_for_pattern; + compositor.draw_image_boxes = draw_image_boxes; + compositor.fill_rectangles = fill_rectangles; + compositor.fill_boxes = fill_boxes; + compositor.copy_boxes = copy_boxes; + compositor.check_composite = check_composite; + compositor.composite = composite; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + compositor.check_composite_glyphs = check_composite_glyphs; + compositor.composite_glyphs = composite_glyphs; + } + + return &compositor.base; +} + +#define CAIRO_FIXED_16_16_MIN -32768 +#define CAIRO_FIXED_16_16_MAX 32767 + +static cairo_bool_t +line_exceeds_16_16 (const cairo_line_t *line) +{ + return + line->p1.x < _cairo_fixed_from_int (CAIRO_FIXED_16_16_MIN) || + line->p1.x > _cairo_fixed_from_int (CAIRO_FIXED_16_16_MAX) || + line->p2.x < _cairo_fixed_from_int (CAIRO_FIXED_16_16_MIN) || + line->p2.x > _cairo_fixed_from_int (CAIRO_FIXED_16_16_MAX) || + line->p1.y < _cairo_fixed_from_int (CAIRO_FIXED_16_16_MIN) || + line->p1.y > _cairo_fixed_from_int (CAIRO_FIXED_16_16_MAX) || + line->p2.y < _cairo_fixed_from_int (CAIRO_FIXED_16_16_MIN) || + line->p2.y > _cairo_fixed_from_int (CAIRO_FIXED_16_16_MAX); +} + +static void +project_line_x_onto_16_16 (const cairo_line_t *line, + cairo_fixed_t top, + cairo_fixed_t bottom, + XLineFixed *out) +{ + cairo_point_double_t p1, p2; + double m; + + p1.x = _cairo_fixed_to_double (line->p1.x); + p1.y = _cairo_fixed_to_double (line->p1.y); + + p2.x = _cairo_fixed_to_double (line->p2.x); + p2.y = _cairo_fixed_to_double (line->p2.y); + + m = (p2.x - p1.x) / (p2.y - p1.y); + out->p1.x = _cairo_fixed_16_16_from_double (p1.x + m * _cairo_fixed_to_double (top - line->p1.y)); + out->p2.x = _cairo_fixed_16_16_from_double (p1.x + m * _cairo_fixed_to_double (bottom - line->p1.y)); +} +#if 0 +static cairo_int_status_T +check_composite_trapezoids () +{ + operation = _categorize_composite_operation (dst, op, pattern, TRUE); + if (operation == DO_UNSUPPORTED) + return UNSUPPORTED ("unsupported operation"); + + operation = _recategorize_composite_operation (dst, op, src, + &attributes, TRUE); + if (operation == DO_UNSUPPORTED) { + status = UNSUPPORTED ("unsupported operation"); + goto BAIL; + } + +} +#endif + +static cairo_int_status_t +composite_traps (void *abstract_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_traps_t *traps) +{ + cairo_xlib_surface_t *dst = abstract_dst; + cairo_xlib_display_t *display = dst->display; + cairo_xlib_source_t *src = (cairo_xlib_source_t *)abstract_src; + XRenderPictFormat *pict_format; + XTrapezoid xtraps_stack[CAIRO_STACK_ARRAY_LENGTH (XTrapezoid)]; + XTrapezoid *xtraps = xtraps_stack; + int dx, dy; + int i; + + //X_DEBUG ((display->display, "composite_trapezoids (dst=%x)", (unsigned int) dst->drawable)); + + if (dst->base.is_clear && + (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD)) + { + op = CAIRO_OPERATOR_SOURCE; + } + + pict_format = + _cairo_xlib_display_get_xrender_format (display, + antialias == CAIRO_ANTIALIAS_NONE ? CAIRO_FORMAT_A1 : CAIRO_FORMAT_A8); + + if (traps->num_traps > ARRAY_LENGTH (xtraps_stack)) { + xtraps = _cairo_malloc_ab (traps->num_traps, sizeof (XTrapezoid)); + if (unlikely (xtraps == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + dx = -dst_x << 16; + dy = -dst_y << 16; + for (i = 0; i < traps->num_traps; i++) { + cairo_trapezoid_t *t = &traps->traps[i]; + + /* top/bottom will be clamped to surface bounds */ + xtraps[i].top = _cairo_fixed_to_16_16(t->top) + dy; + xtraps[i].bottom = _cairo_fixed_to_16_16(t->bottom) + dy; + + /* However, all the other coordinates will have been left untouched so + * as not to introduce numerical error. Recompute them if they + * exceed the 16.16 limits. + */ + if (unlikely (line_exceeds_16_16 (&t->left))) { + project_line_x_onto_16_16 (&t->left, t->top, t->bottom, + &xtraps[i].left); + xtraps[i].left.p1.x += dx; + xtraps[i].left.p2.x += dx; + xtraps[i].left.p1.y = xtraps[i].top; + xtraps[i].left.p2.y = xtraps[i].bottom; + } else { + xtraps[i].left.p1.x = _cairo_fixed_to_16_16(t->left.p1.x) + dx; + xtraps[i].left.p1.y = _cairo_fixed_to_16_16(t->left.p1.y) + dy; + xtraps[i].left.p2.x = _cairo_fixed_to_16_16(t->left.p2.x) + dx; + xtraps[i].left.p2.y = _cairo_fixed_to_16_16(t->left.p2.y) + dy; + } + + if (unlikely (line_exceeds_16_16 (&t->right))) { + project_line_x_onto_16_16 (&t->right, t->top, t->bottom, + &xtraps[i].right); + xtraps[i].right.p1.x += dx; + xtraps[i].right.p2.x += dx; + xtraps[i].right.p1.y = xtraps[i].top; + xtraps[i].right.p2.y = xtraps[i].bottom; + } else { + xtraps[i].right.p1.x = _cairo_fixed_to_16_16(t->right.p1.x) + dx; + xtraps[i].right.p1.y = _cairo_fixed_to_16_16(t->right.p1.y) + dy; + xtraps[i].right.p2.x = _cairo_fixed_to_16_16(t->right.p2.x) + dx; + xtraps[i].right.p2.y = _cairo_fixed_to_16_16(t->right.p2.y) + dy; + } + } + + if (xtraps[0].left.p1.y < xtraps[0].left.p2.y) { + src_x += _cairo_fixed_16_16_floor (xtraps[0].left.p1.x); + src_y += _cairo_fixed_16_16_floor (xtraps[0].left.p1.y); + } else { + src_x += _cairo_fixed_16_16_floor (xtraps[0].left.p2.x); + src_y += _cairo_fixed_16_16_floor (xtraps[0].left.p2.y); + } + src_x += dst_x; + src_y += dst_y; + + _cairo_xlib_surface_ensure_picture (dst); + _cairo_xlib_surface_set_precision (dst, antialias); + XRenderCompositeTrapezoids (dst->dpy, + _render_operator (op), + src->picture, dst->picture, + pict_format, + src_x, src_y, + xtraps, traps->num_traps); + + if (xtraps != xtraps_stack) + free (xtraps); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_tristrip (void *abstract_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_tristrip_t *strip) +{ + cairo_xlib_surface_t *dst = abstract_dst; + cairo_xlib_display_t *display = dst->display; + cairo_xlib_source_t *src = (cairo_xlib_source_t *)abstract_src; + XRenderPictFormat *pict_format; + XPointFixed points_stack[CAIRO_STACK_ARRAY_LENGTH (XPointFixed)]; + XPointFixed *points = points_stack; + int dx, dy; + int i; + + //X_DEBUG ((display->display, "composite_trapezoids (dst=%x)", (unsigned int) dst->drawable)); + + pict_format = + _cairo_xlib_display_get_xrender_format (display, + antialias == CAIRO_ANTIALIAS_NONE ? CAIRO_FORMAT_A1 : CAIRO_FORMAT_A8); + + if (strip->num_points > ARRAY_LENGTH (points_stack)) { + points = _cairo_malloc_ab (strip->num_points, sizeof (XPointFixed)); + if (unlikely (points == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + dx = -dst_x << 16; + dy = -dst_y << 16; + for (i = 0; i < strip->num_points; i++) { + cairo_point_t *p = &strip->points[i]; + + points[i].x = _cairo_fixed_to_16_16(p->x) + dx; + points[i].y = _cairo_fixed_to_16_16(p->y) + dy; + } + + src_x += _cairo_fixed_16_16_floor (points[0].x) + dst_x; + src_y += _cairo_fixed_16_16_floor (points[0].y) + dst_y; + + _cairo_xlib_surface_ensure_picture (dst); + _cairo_xlib_surface_set_precision (dst, antialias); + XRenderCompositeTriStrip (dst->dpy, + _render_operator (op), + src->picture, dst->picture, + pict_format, + src_x, src_y, + points, strip->num_points); + + if (points != points_stack) + free (points); + + return CAIRO_STATUS_SUCCESS; +} + +const cairo_compositor_t * +_cairo_xlib_traps_compositor_get (void) +{ + static cairo_traps_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_traps_compositor_init (&compositor, + _cairo_xlib_mask_compositor_get ()); + + compositor.acquire = acquire; + compositor.release = release; + compositor.set_clip_region = set_clip_region; + compositor.pattern_to_surface = _cairo_xlib_source_create_for_pattern; + compositor.draw_image_boxes = draw_image_boxes; + compositor.copy_boxes = copy_boxes; + compositor.fill_boxes = fill_boxes; + compositor.check_composite = check_composite; + compositor.composite = composite; + compositor.lerp = lerp; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + //compositor.check_composite_traps = check_composite_traps; + compositor.composite_traps = composite_traps; + //compositor.check_composite_tristrip = check_composite_tristrip; + compositor.composite_tristrip = composite_tristrip; + compositor.check_composite_glyphs = check_composite_glyphs; + compositor.composite_glyphs = composite_glyphs; + } + + return &compositor.base; +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-screen.c b/src/cairo-xlib-screen.c new file mode 100644 index 000000000..57beeaab4 --- /dev/null +++ b/src/cairo-xlib-screen.c @@ -0,0 +1,467 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Partially on code from xftdpy.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" +#include "cairo-xlib-xrender-private.h" + +#include "cairo-xlib-surface-private.h" +#include "cairo-error-private.h" +#include "cairo-list-inline.h" + +#include "cairo-fontconfig-private.h" + +static int +parse_boolean (const char *v) +{ + char c0, c1; + + c0 = *v; + if (c0 == 't' || c0 == 'T' || c0 == 'y' || c0 == 'Y' || c0 == '1') + return 1; + if (c0 == 'f' || c0 == 'F' || c0 == 'n' || c0 == 'N' || c0 == '0') + return 0; + if (c0 == 'o') + { + c1 = v[1]; + if (c1 == 'n' || c1 == 'N') + return 1; + if (c1 == 'f' || c1 == 'F') + return 0; + } + + return -1; +} + +static cairo_bool_t +get_boolean_default (Display *dpy, + const char *option, + cairo_bool_t *value) +{ + char *v; + int i; + + v = XGetDefault (dpy, "Xft", option); + if (v) { + i = parse_boolean (v); + if (i >= 0) { + *value = i; + return TRUE; + } + } + + return FALSE; +} + +static cairo_bool_t +get_integer_default (Display *dpy, + const char *option, + int *value) +{ + char *v, *e; + + v = XGetDefault (dpy, "Xft", option); + if (v) { +#if CAIRO_HAS_FC_FONT + if (FcNameConstant ((FcChar8 *) v, value)) + return TRUE; +#endif + + *value = strtol (v, &e, 0); + if (e != v) + return TRUE; + } + + return FALSE; +} + +static void +_cairo_xlib_init_screen_font_options (Display *dpy, + cairo_xlib_screen_t *info) +{ + cairo_bool_t xft_hinting; + cairo_bool_t xft_antialias; + int xft_hintstyle; + int xft_rgba; + int xft_lcdfilter; + cairo_antialias_t antialias; + cairo_subpixel_order_t subpixel_order; + cairo_lcd_filter_t lcd_filter; + cairo_hint_style_t hint_style; + + if (!get_boolean_default (dpy, "antialias", &xft_antialias)) + xft_antialias = TRUE; + + if (!get_integer_default (dpy, "lcdfilter", &xft_lcdfilter)) { + /* -1 is an non-existant Fontconfig constant used to differentiate + * the case when no lcdfilter property is available. + */ + xft_lcdfilter = -1; + } + + if (!get_boolean_default (dpy, "hinting", &xft_hinting)) + xft_hinting = TRUE; + + if (!get_integer_default (dpy, "hintstyle", &xft_hintstyle)) + xft_hintstyle = FC_HINT_FULL; + + if (!get_integer_default (dpy, "rgba", &xft_rgba)) + { + cairo_xlib_display_t *display = (cairo_xlib_display_t *) info->device; + + xft_rgba = FC_RGBA_UNKNOWN; + +#if RENDER_MAJOR > 0 || RENDER_MINOR >= 6 + if (display->render_major > 0 || display->render_minor >= 6) { + int render_order = XRenderQuerySubpixelOrder (dpy, + XScreenNumberOfScreen (info->screen)); + + switch (render_order) { + default: + case SubPixelUnknown: + xft_rgba = FC_RGBA_UNKNOWN; + break; + case SubPixelHorizontalRGB: + xft_rgba = FC_RGBA_RGB; + break; + case SubPixelHorizontalBGR: + xft_rgba = FC_RGBA_BGR; + break; + case SubPixelVerticalRGB: + xft_rgba = FC_RGBA_VRGB; + break; + case SubPixelVerticalBGR: + xft_rgba = FC_RGBA_VBGR; + break; + case SubPixelNone: + xft_rgba = FC_RGBA_NONE; + break; + } + } +#endif + } + + if (xft_hinting) { + switch (xft_hintstyle) { + case FC_HINT_NONE: + hint_style = CAIRO_HINT_STYLE_NONE; + break; + case FC_HINT_SLIGHT: + hint_style = CAIRO_HINT_STYLE_SLIGHT; + break; + case FC_HINT_MEDIUM: + hint_style = CAIRO_HINT_STYLE_MEDIUM; + break; + case FC_HINT_FULL: + hint_style = CAIRO_HINT_STYLE_FULL; + break; + default: + hint_style = CAIRO_HINT_STYLE_DEFAULT; + } + } else { + hint_style = CAIRO_HINT_STYLE_NONE; + } + + switch (xft_rgba) { + case FC_RGBA_RGB: + subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB; + break; + case FC_RGBA_BGR: + subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR; + break; + case FC_RGBA_VRGB: + subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB; + break; + case FC_RGBA_VBGR: + subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR; + break; + case FC_RGBA_UNKNOWN: + case FC_RGBA_NONE: + default: + subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; + } + + switch (xft_lcdfilter) { + case FC_LCD_NONE: + lcd_filter = CAIRO_LCD_FILTER_NONE; + break; + case FC_LCD_DEFAULT: + lcd_filter = CAIRO_LCD_FILTER_FIR5; + break; + case FC_LCD_LIGHT: + lcd_filter = CAIRO_LCD_FILTER_FIR3; + break; + case FC_LCD_LEGACY: + lcd_filter = CAIRO_LCD_FILTER_INTRA_PIXEL; + break; + default: + lcd_filter = CAIRO_LCD_FILTER_DEFAULT; + break; + } + + if (xft_antialias) { + if (subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT) + antialias = CAIRO_ANTIALIAS_GRAY; + else + antialias = CAIRO_ANTIALIAS_SUBPIXEL; + } else { + antialias = CAIRO_ANTIALIAS_NONE; + } + + cairo_font_options_set_hint_style (&info->font_options, hint_style); + cairo_font_options_set_antialias (&info->font_options, antialias); + cairo_font_options_set_subpixel_order (&info->font_options, subpixel_order); + _cairo_font_options_set_lcd_filter (&info->font_options, lcd_filter); + cairo_font_options_set_hint_metrics (&info->font_options, CAIRO_HINT_METRICS_ON); +} + +void +_cairo_xlib_screen_destroy (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info) +{ + Display *dpy; + int i; + + dpy = display->display; + + while (! cairo_list_is_empty (&info->surfaces)) { + cairo_xlib_surface_t *surface; + + surface = cairo_list_first_entry (&info->surfaces, + cairo_xlib_surface_t, + link); + cairo_surface_finish (&surface->base); + } + + for (i = 0; i < ARRAY_LENGTH (info->gc); i++) { + if (info->gc_depths[i] != 0) { + XFreeGC (dpy, info->gc[i]); + info->gc_depths[i] = 0; + } + } + + while (! cairo_list_is_empty (&info->visuals)) { + _cairo_xlib_visual_info_destroy (cairo_list_first_entry (&info->visuals, + cairo_xlib_visual_info_t, + link)); + } + + cairo_list_del (&info->link); + + free (info); +} + +cairo_status_t +_cairo_xlib_screen_get (Display *dpy, + Screen *screen, + cairo_xlib_screen_t **out) +{ + cairo_xlib_display_t *display; + cairo_device_t *device; + cairo_xlib_screen_t *info; + cairo_status_t status; + + device = _cairo_xlib_device_create (dpy); + status = device->status; + if (unlikely (status)) + goto CLEANUP_DEVICE; + + status = _cairo_xlib_display_acquire (device, &display); + if (unlikely (status)) + goto CLEANUP_DEVICE; + + info = _cairo_xlib_display_get_screen (display, screen); + if (info != NULL) { + *out = info; + goto CLEANUP_DISPLAY; + } + + info = malloc (sizeof (cairo_xlib_screen_t)); + if (unlikely (info == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_DISPLAY; + } + + info->device = device; + info->screen = screen; + info->has_font_options = FALSE; + memset (info->gc_depths, 0, sizeof (info->gc_depths)); + memset (info->gc, 0, sizeof (info->gc)); + + cairo_list_init (&info->surfaces); + cairo_list_init (&info->visuals); + cairo_list_add (&info->link, &display->screens); + + *out = info; + + CLEANUP_DISPLAY: + cairo_device_release (&display->base); + + CLEANUP_DEVICE: + cairo_device_destroy (device); + return status; +} + +GC +_cairo_xlib_screen_get_gc (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info, + int depth, + Drawable drawable) +{ + GC gc = NULL; + int i; + + for (i = 0; i < ARRAY_LENGTH (info->gc); i++) { + if (info->gc_depths[i] == depth) { + info->gc_depths[i] = 0; + gc = info->gc[i]; + break; + } + } + + if (gc == NULL) { + XGCValues gcv; + + gcv.graphics_exposures = False; + gcv.fill_style = FillTiled; + gc = XCreateGC (display->display, + drawable, + GCGraphicsExposures | GCFillStyle, &gcv); + } + + return gc; +} + +void +_cairo_xlib_screen_put_gc (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info, + int depth, + GC gc) +{ + int i; + + for (i = 0; i < ARRAY_LENGTH (info->gc); i++) { + if (info->gc_depths[i] == 0) + break; + } + + if (i == ARRAY_LENGTH (info->gc)) { + /* perform random substitution to ensure fair caching over depths */ + i = rand () % ARRAY_LENGTH (info->gc); + XFreeGC(display->display, info->gc[i]); + } + + info->gc[i] = gc; + info->gc_depths[i] = depth; +} + +cairo_status_t +_cairo_xlib_screen_get_visual_info (cairo_xlib_display_t *display, + cairo_xlib_screen_t *info, + Visual *v, + cairo_xlib_visual_info_t **out) +{ + cairo_xlib_visual_info_t *visual; + cairo_status_t status; + + cairo_list_foreach_entry (visual, + cairo_xlib_visual_info_t, + &info->visuals, + link) + { + if (visual->visualid == v->visualid) { + *out = visual; + return CAIRO_STATUS_SUCCESS; + } + } + + status = _cairo_xlib_visual_info_create (display->display, + XScreenNumberOfScreen (info->screen), + v->visualid, + &visual); + if (unlikely (status)) + return status; + + cairo_list_add (&visual->link, &info->visuals); + *out = visual; + return CAIRO_STATUS_SUCCESS; +} + +cairo_font_options_t * +_cairo_xlib_screen_get_font_options (cairo_xlib_screen_t *info) +{ + if (! info->has_font_options) { + _cairo_font_options_init_default (&info->font_options); + _cairo_font_options_set_round_glyph_positions (&info->font_options, CAIRO_ROUND_GLYPH_POS_ON); + + if (info->screen != NULL) { + cairo_xlib_display_t *display; + + if (! _cairo_xlib_display_acquire (info->device, &display)) { + _cairo_xlib_init_screen_font_options (display->display, + info); + cairo_device_release (&display->base); + } + } + + info->has_font_options = TRUE; + } + + return &info->font_options; +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-source.c b/src/cairo-xlib-source.c new file mode 100644 index 000000000..1591f5874 --- /dev/null +++ b/src/cairo-xlib-source.c @@ -0,0 +1,1168 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Behdad Esfahbod + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" +#include "cairo-xlib-surface-private.h" + +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-paginated-private.h" +#include "cairo-pattern-inline.h" +#include "cairo-recording-surface-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-offset-private.h" +#include "cairo-surface-observer-private.h" +#include "cairo-surface-snapshot-inline.h" +#include "cairo-surface-subsurface-inline.h" + +#define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */ + +static cairo_xlib_surface_t * +unwrap_source (const cairo_surface_pattern_t *pattern) +{ + cairo_rectangle_int_t limits; + return (cairo_xlib_surface_t *)_cairo_pattern_get_source (pattern, &limits); +} + +static cairo_status_t +_cairo_xlib_source_finish (void *abstract_surface) +{ + cairo_xlib_source_t *source = abstract_surface; + + XRenderFreePicture (source->dpy, source->picture); + if (source->pixmap) + XFreePixmap (source->dpy, source->pixmap); + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t cairo_xlib_source_backend = { + CAIRO_SURFACE_TYPE_XLIB, + _cairo_xlib_source_finish, + NULL, /* read-only wrapper */ +}; + +static cairo_status_t +_cairo_xlib_proxy_finish (void *abstract_surface) +{ + cairo_xlib_proxy_t *proxy = abstract_surface; + + _cairo_xlib_shm_surface_mark_active (proxy->owner); + XRenderFreePicture (proxy->source.dpy, proxy->source.picture); + if (proxy->source.pixmap) + XFreePixmap (proxy->source.dpy, proxy->source.pixmap); + cairo_surface_destroy (proxy->owner); + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t cairo_xlib_proxy_backend = { + CAIRO_SURFACE_TYPE_XLIB, + _cairo_xlib_proxy_finish, + NULL, /* read-only wrapper */ +}; + +static cairo_surface_t * +source (cairo_xlib_surface_t *dst, Picture picture, Pixmap pixmap) +{ + cairo_xlib_source_t *source; + + if (picture == None) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + source = malloc (sizeof (*source)); + if (unlikely (source == NULL)) { + XRenderFreePicture (dst->display->display, picture); + if (pixmap) + XFreePixmap (dst->display->display, pixmap); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + _cairo_surface_init (&source->base, + &cairo_xlib_source_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + /* The source exists only within an operation */ + source->picture = picture; + source->pixmap = pixmap; + source->dpy = dst->display->display; + + return &source->base; +} + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + static uint32_t x; + return x = (x ^ rol (x, 5) ^ rol (x, 24)) + 0x37798849; +#undef rol +} + +static const XTransform identity = { + { + { 1 << 16, 0x00000, 0x00000 }, + { 0x00000, 1 << 16, 0x00000 }, + { 0x00000, 0x00000, 1 << 16 }, + } +}; + +static cairo_bool_t +picture_set_matrix (cairo_xlib_display_t *display, + Picture picture, + const cairo_matrix_t *matrix, + cairo_filter_t filter, + double xc, + double yc, + int *x_offset, + int *y_offset) +{ + XTransform xtransform; + pixman_transform_t *pixman_transform; + cairo_int_status_t status; + + /* Casting between pixman_transform_t and XTransform is safe because + * they happen to be the exact same type. + */ + pixman_transform = (pixman_transform_t *) &xtransform; + status = _cairo_matrix_to_pixman_matrix_offset (matrix, filter, xc, yc, + pixman_transform, + x_offset, y_offset); + if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) + return TRUE; + if (unlikely (status != CAIRO_INT_STATUS_SUCCESS)) + return FALSE; + + if (memcmp (&xtransform, &identity, sizeof (XTransform)) == 0) + return TRUE; + + /* a late check in case we perturb the matrix too far */ + if (! CAIRO_RENDER_HAS_PICTURE_TRANSFORM (display)) + return FALSE; + + XRenderSetPictureTransform (display->display, picture, &xtransform); + return TRUE; +} + +static cairo_status_t +picture_set_filter (Display *dpy, + Picture picture, + cairo_filter_t filter) +{ + const char *render_filter; + + switch (filter) { + case CAIRO_FILTER_FAST: + render_filter = FilterFast; + break; + case CAIRO_FILTER_GOOD: + render_filter = FilterGood; + break; + case CAIRO_FILTER_BEST: + render_filter = FilterBest; + break; + case CAIRO_FILTER_NEAREST: + render_filter = FilterNearest; + break; + case CAIRO_FILTER_BILINEAR: + render_filter = FilterBilinear; + break; + case CAIRO_FILTER_GAUSSIAN: + /* XXX: The GAUSSIAN value has no implementation in cairo + * whatsoever, so it was really a mistake to have it in the + * API. We could fix this by officially deprecating it, or + * else inventing semantics and providing an actual + * implementation for it. */ + default: + render_filter = FilterBest; + break; + } + + XRenderSetPictureFilter (dpy, picture, (char *) render_filter, NULL, 0); + return CAIRO_STATUS_SUCCESS; +} + +static int +extend_to_repeat (cairo_extend_t extend) +{ + switch (extend) { + default: + ASSERT_NOT_REACHED; + case CAIRO_EXTEND_NONE: + return RepeatNone; + case CAIRO_EXTEND_REPEAT: + return RepeatNormal; + case CAIRO_EXTEND_REFLECT: + return RepeatReflect; + case CAIRO_EXTEND_PAD: + return RepeatPad; + } +} + +static cairo_bool_t +picture_set_properties (cairo_xlib_display_t *display, + Picture picture, + const cairo_pattern_t *pattern, + const cairo_matrix_t *matrix, + const cairo_rectangle_int_t *extents, + int *x_off, int *y_off) +{ + XRenderPictureAttributes pa; + int mask = 0; + + if (! picture_set_matrix (display, picture, matrix, pattern->filter, + extents->x + extents->width / 2, + extents->y + extents->height / 2, + x_off, y_off)) + return FALSE; + + picture_set_filter (display->display, picture, pattern->filter); + + if (pattern->has_component_alpha) { + pa.component_alpha = 1; + mask |= CPComponentAlpha; + } + + if (pattern->extend != CAIRO_EXTEND_NONE) { + pa.repeat = extend_to_repeat (pattern->extend); + mask |= CPRepeat; + } + + if (mask) + XRenderChangePicture (display->display, picture, mask, &pa); + + return TRUE; +} + +static cairo_surface_t * +render_pattern (cairo_xlib_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + int *src_x, int *src_y) +{ + Display *dpy = dst->display->display; + cairo_xlib_surface_t *src; + cairo_image_surface_t *image; + cairo_status_t status; + cairo_rectangle_int_t map_extents; + + src = (cairo_xlib_surface_t *) + _cairo_surface_create_scratch (&dst->base, + is_mask ? CAIRO_CONTENT_ALPHA : CAIRO_CONTENT_COLOR_ALPHA, + extents->width, + extents->height, + NULL); + if (src->base.type != CAIRO_SURFACE_TYPE_XLIB) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + map_extents = *extents; + map_extents.x = map_extents.y = 0; + + image = _cairo_surface_map_to_image (&src->base, &map_extents); + status = _cairo_surface_offset_paint (&image->base, extents->x, extents->y, + CAIRO_OPERATOR_SOURCE, pattern, + NULL); + status = _cairo_surface_unmap_image (&src->base, image); + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (status); + } + + status = _cairo_xlib_surface_put_shm (src); + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (status); + } + + src->picture = XRenderCreatePicture (dpy, + src->drawable, src->xrender_format, + 0, NULL); + + *src_x = -extents->x; + *src_y = -extents->y; + return &src->base; +} + +static cairo_surface_t * +gradient_source (cairo_xlib_surface_t *dst, + const cairo_gradient_pattern_t *gradient, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + int *src_x, int *src_y) +{ + cairo_xlib_display_t *display = dst->display; + cairo_matrix_t matrix = gradient->base.matrix; + char buf[CAIRO_STACK_BUFFER_SIZE]; + cairo_circle_double_t extremes[2]; + XFixed *stops; + XRenderColor *colors; + Picture picture; + unsigned int i, n_stops; + + /* The RENDER specification says that the inner circle has + * to be completely contained inside the outer one. */ + if (gradient->base.type == CAIRO_PATTERN_TYPE_RADIAL && + ! _cairo_radial_pattern_focus_is_inside ((cairo_radial_pattern_t *) gradient)) + return render_pattern (dst, &gradient->base, is_mask, extents, src_x, src_y); + + assert (gradient->n_stops > 0); + n_stops = MAX (gradient->n_stops, 2); + + if (n_stops < sizeof (buf) / (sizeof (XFixed) + sizeof (XRenderColor))) + { + stops = (XFixed *) buf; + } + else + { + stops = + _cairo_malloc_ab (n_stops, + sizeof (XFixed) + sizeof (XRenderColor)); + if (unlikely (stops == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + colors = (XRenderColor *) (stops + n_stops); + for (i = 0; i < gradient->n_stops; i++) { + stops[i] = + _cairo_fixed_16_16_from_double (gradient->stops[i].offset); + + colors[i].red = gradient->stops[i].color.red_short; + colors[i].green = gradient->stops[i].color.green_short; + colors[i].blue = gradient->stops[i].color.blue_short; + colors[i].alpha = gradient->stops[i].color.alpha_short; + } + + /* RENDER does not support gradients with less than 2 + * stops. If a gradient has only a single stop, duplicate + * it to make RENDER happy. */ + if (gradient->n_stops == 1) { + stops[1] = + _cairo_fixed_16_16_from_double (gradient->stops[0].offset); + + colors[1].red = gradient->stops[0].color.red_short; + colors[1].green = gradient->stops[0].color.green_short; + colors[1].blue = gradient->stops[0].color.blue_short; + colors[1].alpha = gradient->stops[0].color.alpha_short; + } + +#if 0 + /* For some weird reason the X server is sometimes getting + * CreateGradient requests with bad length. So far I've only seen + * XRenderCreateLinearGradient request with 4 stops sometime end up + * with length field matching 0 stops at the server side. I've + * looked at the libXrender code and I can't see anything that + * could cause this behavior. However, for some reason having a + * XSync call here seems to avoid the issue so I'll keep it here + * until it's solved. + */ + XSync (display->display, False); +#endif + + _cairo_gradient_pattern_fit_to_range (gradient, PIXMAN_MAX_INT >> 1, &matrix, extremes); + + if (gradient->base.type == CAIRO_PATTERN_TYPE_LINEAR) { + XLinearGradient grad; + + grad.p1.x = _cairo_fixed_16_16_from_double (extremes[0].center.x); + grad.p1.y = _cairo_fixed_16_16_from_double (extremes[0].center.y); + grad.p2.x = _cairo_fixed_16_16_from_double (extremes[1].center.x); + grad.p2.y = _cairo_fixed_16_16_from_double (extremes[1].center.y); + + picture = XRenderCreateLinearGradient (display->display, &grad, + stops, colors, + n_stops); + } else { + XRadialGradient grad; + + grad.inner.x = _cairo_fixed_16_16_from_double (extremes[0].center.x); + grad.inner.y = _cairo_fixed_16_16_from_double (extremes[0].center.y); + grad.inner.radius = _cairo_fixed_16_16_from_double (extremes[0].radius); + grad.outer.x = _cairo_fixed_16_16_from_double (extremes[1].center.x); + grad.outer.y = _cairo_fixed_16_16_from_double (extremes[1].center.y); + grad.outer.radius = _cairo_fixed_16_16_from_double (extremes[1].radius); + + picture = XRenderCreateRadialGradient (display->display, &grad, + stops, colors, + n_stops); + } + + if (stops != (XFixed *) buf) + free (stops); + + *src_x = *src_y = 0; + if (! picture_set_properties (display, picture, + &gradient->base, &gradient->base.matrix, + extents, + src_x, src_y)) { + XRenderFreePicture (display->display, picture); + return render_pattern (dst, &gradient->base, is_mask, extents, src_x, src_y); + } + + return source (dst, picture, None); +} + +static cairo_surface_t * +color_source (cairo_xlib_surface_t *dst, const cairo_color_t *color) +{ + Display *dpy = dst->display->display; + XRenderColor xcolor; + Picture picture; + Pixmap pixmap = None; + + xcolor.red = color->red_short; + xcolor.green = color->green_short; + xcolor.blue = color->blue_short; + xcolor.alpha = color->alpha_short; + + if (CAIRO_RENDER_HAS_GRADIENTS(dst->display)) { + picture = XRenderCreateSolidFill (dpy, &xcolor); + } else { + XRenderPictureAttributes pa; + int mask = 0; + + pa.repeat = RepeatNormal; + mask |= CPRepeat; + + pixmap = XCreatePixmap (dpy, dst->drawable, 1, 1, 32); + picture = XRenderCreatePicture (dpy, pixmap, + _cairo_xlib_display_get_xrender_format (dst->display, CAIRO_FORMAT_ARGB32), + mask, &pa); + + if (CAIRO_RENDER_HAS_FILL_RECTANGLES(dst->display)) { + XRectangle r = { 0, 0, 1, 1}; + XRenderFillRectangles (dpy, PictOpSrc, picture, &xcolor, &r, 1); + } else { + XGCValues gcv; + GC gc; + + gc = _cairo_xlib_screen_get_gc (dst->display, dst->screen, + 32, pixmap); + if (unlikely (gc == NULL)) { + XFreePixmap (dpy, pixmap); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + gcv.foreground = 0; + gcv.foreground |= color->alpha_short >> 8 << 24; + gcv.foreground |= color->red_short >> 8 << 16; + gcv.foreground |= color->green_short >> 8 << 8; + gcv.foreground |= color->blue_short >> 8 << 0; + gcv.fill_style = FillSolid; + + XChangeGC (dpy, gc, GCFillStyle | GCForeground, &gcv); + XFillRectangle (dpy, pixmap, gc, 0, 0, 1, 1); + + _cairo_xlib_screen_put_gc (dst->display, dst->screen, 32, gc); + } + } + + return source (dst, picture, pixmap); +} + +static cairo_surface_t * +alpha_source (cairo_xlib_surface_t *dst, uint8_t alpha) +{ + cairo_xlib_display_t *display = dst->display; + + if (display->alpha[alpha] == NULL) { + cairo_color_t color; + + color.red_short = color.green_short = color.blue_short = 0; + color.alpha_short = alpha << 8 | alpha; + + display->alpha[alpha] = color_source (dst, &color); + } + + return cairo_surface_reference (display->alpha[alpha]); +} + +static cairo_surface_t * +white_source (cairo_xlib_surface_t *dst) +{ + cairo_xlib_display_t *display = dst->display; + + if (display->white == NULL) + display->white = color_source (dst, CAIRO_COLOR_WHITE); + + return cairo_surface_reference (display->white); +} + +static cairo_surface_t * +opaque_source (cairo_xlib_surface_t *dst, const cairo_color_t *color) +{ + cairo_xlib_display_t *display = dst->display; + uint32_t pixel = + 0xff000000 | + color->red_short >> 8 << 16 | + color->green_short >> 8 << 8 | + color->blue_short >> 8 << 0; + int i; + + if (display->last_solid_cache[0].color == pixel) + return cairo_surface_reference (display->solid[display->last_solid_cache[0].index]); + + for (i = 0; i < 16; i++) { + if (display->solid_cache[i] == pixel) + goto done; + } + + i = hars_petruska_f54_1_random () % 16; + cairo_surface_destroy (display->solid[i]); + + display->solid[i] = color_source (dst, color); + display->solid_cache[i] = pixel; + +done: + display->last_solid_cache[0].color = pixel; + display->last_solid_cache[0].index = i; + return cairo_surface_reference (display->solid[i]); +} + +static cairo_surface_t * +transparent_source (cairo_xlib_surface_t *dst, const cairo_color_t *color) +{ + cairo_xlib_display_t *display = dst->display; + uint32_t pixel = + color->alpha_short >> 8 << 24 | + color->red_short >> 8 << 16 | + color->green_short >> 8 << 8 | + color->blue_short >> 8 << 0; + int i; + + if (display->last_solid_cache[1].color == pixel) { + assert (display->solid[display->last_solid_cache[1].index]); + return cairo_surface_reference (display->solid[display->last_solid_cache[1].index]); + } + + for (i = 16; i < 32; i++) { + if (display->solid_cache[i] == pixel) + goto done; + } + + i = 16 + (hars_petruska_f54_1_random () % 16); + cairo_surface_destroy (display->solid[i]); + + display->solid[i] = color_source (dst, color); + display->solid_cache[i] = pixel; + +done: + display->last_solid_cache[1].color = pixel; + display->last_solid_cache[1].index = i; + assert (display->solid[i]); + return cairo_surface_reference (display->solid[i]); +} + +static cairo_surface_t * +solid_source (cairo_xlib_surface_t *dst, + const cairo_color_t *color) +{ + if ((color->red_short | color->green_short | color->blue_short) <= 0xff) + return alpha_source (dst, color->alpha_short >> 8); + + if (CAIRO_ALPHA_SHORT_IS_OPAQUE (color->alpha_short)) { + if (color->red_short >= 0xff00 && color->green_short >= 0xff00 && color->blue_short >= 0xff00) + return white_source (dst); + + return opaque_source (dst, color); + } else + return transparent_source (dst, color); +} + +static cairo_xlib_source_t *init_source (cairo_xlib_surface_t *dst, + cairo_xlib_surface_t *src) +{ + Display *dpy = dst->display->display; + cairo_xlib_source_t *source = &src->embedded_source; + + /* As these are frequent and meant to be fast, we track pictures for + * native surface and minimise update requests. + */ + if (source->picture == None) { + XRenderPictureAttributes pa; + + _cairo_surface_init (&source->base, + &cairo_xlib_source_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + pa.subwindow_mode = IncludeInferiors; + source->picture = XRenderCreatePicture (dpy, + src->drawable, + src->xrender_format, + CPSubwindowMode, &pa); + + source->has_component_alpha = 0; + source->has_matrix = 0; + source->filter = CAIRO_FILTER_NEAREST; + source->extend = CAIRO_EXTEND_NONE; + } + + return (cairo_xlib_source_t *) cairo_surface_reference (&source->base); +} + +static cairo_surface_t * +embedded_source (cairo_xlib_surface_t *dst, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + int *src_x, int *src_y, + cairo_xlib_source_t *source) +{ + Display *dpy = dst->display->display; + cairo_int_status_t status; + XTransform xtransform; + XRenderPictureAttributes pa; + unsigned mask = 0; + + status = _cairo_matrix_to_pixman_matrix_offset (&pattern->base.matrix, + pattern->base.filter, + extents->x + extents->width / 2, + extents->y + extents->height / 2, + (pixman_transform_t *)&xtransform, + src_x, src_y); + + if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { + if (source->has_matrix) { + source->has_matrix = 0; + memcpy (&xtransform, &identity, sizeof (identity)); + status = CAIRO_INT_STATUS_SUCCESS; + } + } else + source->has_matrix = 1; + if (status == CAIRO_INT_STATUS_SUCCESS) + XRenderSetPictureTransform (dpy, source->picture, &xtransform); + + if (source->filter != pattern->base.filter) { + picture_set_filter (dpy, source->picture, pattern->base.filter); + source->filter = pattern->base.filter; + } + + if (source->has_component_alpha != pattern->base.has_component_alpha) { + pa.component_alpha = pattern->base.has_component_alpha; + mask |= CPComponentAlpha; + source->has_component_alpha = pattern->base.has_component_alpha; + } + + if (source->extend != pattern->base.extend) { + pa.repeat = extend_to_repeat (pattern->base.extend); + mask |= CPRepeat; + source->extend = pattern->base.extend; + } + + if (mask) + XRenderChangePicture (dpy, source->picture, mask, &pa); + + return &source->base; +} + +static cairo_surface_t * +subsurface_source (cairo_xlib_surface_t *dst, + const cairo_surface_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_surface_subsurface_t *sub; + cairo_xlib_surface_t *src; + cairo_xlib_source_t *source; + Display *dpy = dst->display->display; + cairo_int_status_t status; + cairo_surface_pattern_t local_pattern; + XTransform xtransform; + XRenderPictureAttributes pa; + unsigned mask = 0; + + sub = (cairo_surface_subsurface_t *) pattern->surface; + + if (sample->x >= 0 && sample->y >= 0 && + sample->x + sample->width <= sub->extents.width && + sample->y + sample->height <= sub->extents.height) + { + src = (cairo_xlib_surface_t *) sub->target; + status = _cairo_surface_flush (&src->base, 0); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (pattern->base.filter == CAIRO_FILTER_NEAREST && + _cairo_matrix_is_translation (&pattern->base.matrix)) + { + *src_x += pattern->base.matrix.x0 + sub->extents.x; + *src_y += pattern->base.matrix.y0 + sub->extents.y; + + _cairo_xlib_surface_ensure_picture (src); + return cairo_surface_reference (&src->base); + } + else + { + cairo_surface_pattern_t local_pattern = *pattern; + local_pattern.base.matrix.x0 += sub->extents.x; + local_pattern.base.matrix.y0 += sub->extents.y; + local_pattern.base.extend = CAIRO_EXTEND_NONE; + return embedded_source (dst, &local_pattern, extents, + src_x, src_y, init_source (dst, src)); + } + } + + if (sub->snapshot && sub->snapshot->type == CAIRO_SURFACE_TYPE_XLIB) { + src = (cairo_xlib_surface_t *) cairo_surface_reference (sub->snapshot); + source = &src->embedded_source; + } else { + src = (cairo_xlib_surface_t *) + _cairo_surface_create_scratch (&dst->base, + sub->base.content, + sub->extents.width, + sub->extents.height, + NULL); + if (src->base.type != CAIRO_SURFACE_TYPE_XLIB) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_pattern_init_for_surface (&local_pattern, sub->target); + cairo_matrix_init_translate (&local_pattern.base.matrix, + sub->extents.x, sub->extents.y); + local_pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (&src->base, + CAIRO_OPERATOR_SOURCE, + &local_pattern.base, + NULL); + _cairo_pattern_fini (&local_pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (status); + } + + _cairo_xlib_surface_ensure_picture (src); + _cairo_surface_subsurface_set_snapshot (&sub->base, &src->base); + + source = &src->embedded_source; + source->has_component_alpha = 0; + source->has_matrix = 0; + source->filter = CAIRO_FILTER_NEAREST; + source->extend = CAIRO_EXTEND_NONE; + } + + status = _cairo_matrix_to_pixman_matrix_offset (&pattern->base.matrix, + pattern->base.filter, + extents->x + extents->width / 2, + extents->y + extents->height / 2, + (pixman_transform_t *)&xtransform, + src_x, src_y); + if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) { + if (source->has_matrix) { + source->has_matrix = 0; + memcpy (&xtransform, &identity, sizeof (identity)); + status = CAIRO_INT_STATUS_SUCCESS; + } + } else + source->has_matrix = 1; + if (status == CAIRO_INT_STATUS_SUCCESS) + XRenderSetPictureTransform (dpy, src->picture, &xtransform); + + if (source->filter != pattern->base.filter) { + picture_set_filter (dpy, src->picture, pattern->base.filter); + source->filter = pattern->base.filter; + } + + if (source->has_component_alpha != pattern->base.has_component_alpha) { + pa.component_alpha = pattern->base.has_component_alpha; + mask |= CPComponentAlpha; + source->has_component_alpha = pattern->base.has_component_alpha; + } + + if (source->extend != pattern->base.extend) { + pa.repeat = extend_to_repeat (pattern->base.extend); + mask |= CPRepeat; + source->extend = pattern->base.extend; + } + + if (mask) + XRenderChangePicture (dpy, src->picture, mask, &pa); + + return &src->base; +} + +static cairo_surface_t * +native_source (cairo_xlib_surface_t *dst, + const cairo_surface_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_xlib_surface_t *src; + cairo_int_status_t status; + + if (_cairo_surface_is_subsurface (pattern->surface)) + return subsurface_source (dst, pattern, is_mask, + extents, sample, + src_x, src_y); + + src = unwrap_source (pattern); + status = _cairo_surface_flush (&src->base, 0); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (pattern->base.filter == CAIRO_FILTER_NEAREST && + sample->x >= 0 && sample->y >= 0 && + sample->x + sample->width <= src->width && + sample->y + sample->height <= src->height && + _cairo_matrix_is_translation (&pattern->base.matrix)) + { + *src_x += pattern->base.matrix.x0; + *src_y += pattern->base.matrix.y0; + _cairo_xlib_surface_ensure_picture (src); + return cairo_surface_reference (&src->base); + } + + return embedded_source (dst, pattern, extents, src_x, src_y, + init_source (dst, src)); +} + +static cairo_surface_t * +recording_pattern_get_surface (const cairo_pattern_t *pattern) +{ + cairo_surface_t *surface; + + surface = ((const cairo_surface_pattern_t *) pattern)->surface; + + if (_cairo_surface_is_paginated (surface)) + return cairo_surface_reference (_cairo_paginated_surface_get_recording (surface)); + + if (_cairo_surface_is_snapshot (surface)) + return _cairo_surface_snapshot_get_target (surface); + + return cairo_surface_reference (surface); +} + +static cairo_surface_t * +record_source (cairo_xlib_surface_t *dst, + const cairo_surface_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_xlib_surface_t *src; + cairo_surface_t *recording; + cairo_matrix_t matrix, m; + cairo_status_t status; + cairo_rectangle_int_t upload, limit; + + upload = *sample; + if (_cairo_surface_get_extents (pattern->surface, &limit) && + ! _cairo_rectangle_intersect (&upload, &limit)) + { + if (pattern->base.extend == CAIRO_EXTEND_NONE) + return alpha_source (dst, 0); + + upload = limit; + } + + src = (cairo_xlib_surface_t *) + _cairo_surface_create_scratch (&dst->base, + pattern->surface->content, + upload.width, + upload.height, + NULL); + if (src->base.type != CAIRO_SURFACE_TYPE_XLIB) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + cairo_matrix_init_translate (&matrix, upload.x, upload.y); + recording = recording_pattern_get_surface (&pattern->base), + status = _cairo_recording_surface_replay_with_clip (recording, + &matrix, &src->base, + NULL); + cairo_surface_destroy (recording); + if (unlikely (status)) { + cairo_surface_destroy (&src->base); + return _cairo_surface_create_in_error (status); + } + + matrix = pattern->base.matrix; + if (upload.x | upload.y) { + cairo_matrix_init_translate (&m, -upload.x, -upload.y); + cairo_matrix_multiply (&matrix, &matrix, &m); + } + + _cairo_xlib_surface_ensure_picture (src); + if (! picture_set_properties (src->display, src->picture, + &pattern->base, &matrix, extents, + src_x, src_y)) + { + cairo_surface_destroy (&src->base); + return render_pattern (dst, &pattern->base, is_mask, + extents, src_x, src_y); + } + + return &src->base; +} + +static cairo_surface_t * +surface_source (cairo_xlib_surface_t *dst, + const cairo_surface_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_surface_t *src; + cairo_xlib_surface_t *xsrc; + cairo_surface_pattern_t local_pattern; + cairo_status_t status; + cairo_rectangle_int_t upload, limit; + + src = pattern->surface; + if (src->type == CAIRO_SURFACE_TYPE_IMAGE && + src->device == dst->base.device && + _cairo_xlib_shm_surface_get_pixmap (src)) { + cairo_xlib_proxy_t *proxy; + + proxy = malloc (sizeof(*proxy)); + if (unlikely (proxy == NULL)) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_surface_init (&proxy->source.base, + &cairo_xlib_proxy_backend, + dst->base.device, + src->content); + + proxy->source.dpy = dst->display->display; + proxy->source.picture = XRenderCreatePicture (proxy->source.dpy, + _cairo_xlib_shm_surface_get_pixmap (src), + _cairo_xlib_shm_surface_get_xrender_format (src), + 0, NULL); + proxy->source.pixmap = None; + + proxy->source.has_component_alpha = 0; + proxy->source.has_matrix = 0; + proxy->source.filter = CAIRO_FILTER_NEAREST; + proxy->source.extend = CAIRO_EXTEND_NONE; + proxy->owner = cairo_surface_reference (src); + + return embedded_source (dst, pattern, extents, src_x, src_y, + &proxy->source); + } + + upload = *sample; + if (_cairo_surface_get_extents (pattern->surface, &limit)) { + if (pattern->base.extend == CAIRO_EXTEND_NONE) { + if (! _cairo_rectangle_intersect (&upload, &limit)) + return alpha_source (dst, 0); + } else if (pattern->base.extend == CAIRO_EXTEND_PAD) { + if (! _cairo_rectangle_intersect (&upload, &limit)) + upload = limit; + } else { + if (upload.x < limit.x || + upload.x + upload.width > limit.x + limit.width || + upload.y < limit.y || + upload.y + upload.height > limit.y + limit.height) + { + upload = limit; + } + } + } + + xsrc = (cairo_xlib_surface_t *) + _cairo_surface_create_scratch (&dst->base, + src->content, + upload.width, + upload.height, + NULL); + if (xsrc->base.type != CAIRO_SURFACE_TYPE_XLIB) { + cairo_surface_destroy (src); + cairo_surface_destroy (&xsrc->base); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + if (_cairo_surface_is_image (src)) { + status = _cairo_xlib_surface_draw_image (xsrc, (cairo_image_surface_t *)src, + upload.x, upload.y, + upload.width, upload.height, + 0, 0); + } else { + cairo_image_surface_t *image; + cairo_rectangle_int_t map_extents = { 0,0, upload.width,upload.height }; + + image = _cairo_surface_map_to_image (&xsrc->base, &map_extents); + + _cairo_pattern_init_for_surface (&local_pattern, pattern->surface); + cairo_matrix_init_translate (&local_pattern.base.matrix, + upload.x, upload.y); + + status = _cairo_surface_paint (&image->base, + CAIRO_OPERATOR_SOURCE, + &local_pattern.base, + NULL); + _cairo_pattern_fini (&local_pattern.base); + + status = _cairo_surface_unmap_image (&xsrc->base, image); + if (unlikely (status)) { + cairo_surface_destroy (&xsrc->base); + return _cairo_surface_create_in_error (status); + } + + status = _cairo_xlib_surface_put_shm (xsrc); + if (unlikely (status)) { + cairo_surface_destroy (&xsrc->base); + return _cairo_surface_create_in_error (status); + } + } + + _cairo_pattern_init_static_copy (&local_pattern.base, &pattern->base); + if (upload.x | upload.y) { + cairo_matrix_t m; + cairo_matrix_init_translate (&m, -upload.x, -upload.y); + cairo_matrix_multiply (&local_pattern.base.matrix, + &local_pattern.base.matrix, + &m); + } + + *src_x = *src_y = 0; + _cairo_xlib_surface_ensure_picture (xsrc); + if (! picture_set_properties (xsrc->display, + xsrc->picture, + &local_pattern.base, + &local_pattern.base.matrix, + extents, + src_x, src_y)) + { + cairo_surface_destroy (&xsrc->base); + return render_pattern (dst, &pattern->base, + is_mask, extents, + src_x, src_y); + } + + return &xsrc->base; +} + +static cairo_bool_t +pattern_is_supported (cairo_xlib_display_t *display, + const cairo_pattern_t *pattern) +{ + if (pattern->type == CAIRO_PATTERN_TYPE_MESH) + return FALSE; + + if (display->buggy_pad_reflect) { + if (pattern->extend == CAIRO_EXTEND_REPEAT || pattern->extend == CAIRO_EXTEND_PAD) + return FALSE; + } + + if (display->buggy_gradients) { + if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || pattern->type == CAIRO_PATTERN_TYPE_RADIAL) + return FALSE; + } + + switch (pattern->filter) { + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + return CAIRO_RENDER_HAS_PICTURE_TRANSFORM (display) || + _cairo_matrix_is_integer_translation (&pattern->matrix, NULL, NULL); + case CAIRO_FILTER_GOOD: + return CAIRO_RENDER_HAS_FILTER_GOOD (display); + case CAIRO_FILTER_BEST: + return CAIRO_RENDER_HAS_FILTER_BEST (display); + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + default: + return CAIRO_RENDER_HAS_FILTERS (display); + } +} + +cairo_surface_t * +_cairo_xlib_source_create_for_pattern (cairo_surface_t *_dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + cairo_xlib_surface_t *dst = (cairo_xlib_surface_t *)_dst; + + *src_x = *src_y = 0; + + if (pattern == NULL || pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + if (pattern == NULL) + pattern = &_cairo_pattern_white.base; + + return solid_source (dst, &((cairo_solid_pattern_t *)pattern)->color); + } + + if (pattern_is_supported (dst->display, pattern)) { + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *spattern = (cairo_surface_pattern_t *)pattern; + if (spattern->surface->type == CAIRO_SURFACE_TYPE_XLIB && + _cairo_xlib_surface_same_screen (dst, + unwrap_source (spattern))) + return native_source (dst, spattern, is_mask, + extents, sample, + src_x, src_y); + + if (spattern->surface->type == CAIRO_SURFACE_TYPE_RECORDING) + return record_source (dst, spattern, is_mask, + extents, sample, + src_x, src_y); + + return surface_source (dst, spattern, is_mask, + extents, sample, + src_x, src_y); + } + + if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || + pattern->type == CAIRO_PATTERN_TYPE_RADIAL) + { + cairo_gradient_pattern_t *gpattern = (cairo_gradient_pattern_t *)pattern; + return gradient_source (dst, gpattern, is_mask, extents, src_x, src_y); + } + } + + return render_pattern (dst, pattern, is_mask, extents, src_x, src_y); +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-surface-private.h b/src/cairo-xlib-surface-private.h new file mode 100644 index 000000000..83d9b63cc --- /dev/null +++ b/src/cairo-xlib-surface-private.h @@ -0,0 +1,44 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + */ + +#ifndef CAIRO_XLIB_SURFACE_PRIVATE_H +#define CAIRO_XLIB_SURFACE_PRIVATE_H + +#include "cairo-xlib-xrender-private.h" +#include "cairo-xlib.h" +#include "cairo-xlib-private.h" + +#include "cairo-surface-private.h" +#include "cairo-surface-backend-private.h" + + +#endif /* CAIRO_XLIB_SURFACE_PRIVATE_H */ diff --git a/src/cairo-xlib-surface-shm.c b/src/cairo-xlib-surface-shm.c new file mode 100644 index 000000000..fb40699dc --- /dev/null +++ b/src/cairo-xlib-surface-shm.c @@ -0,0 +1,1459 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" +#include "cairo-xlib-surface-private.h" + +#if !HAVE_X11_EXTENSIONS_XSHM_H || !(HAVE_X11_EXTENSIONS_SHMPROTO_H || HAVE_X11_EXTENSIONS_SHMSTR_H) +void _cairo_xlib_display_init_shm (cairo_xlib_display_t *display) {} + +cairo_surface_t * +_cairo_xlib_surface_get_shm (cairo_xlib_surface_t *surface, + cairo_bool_t overwrite) +{ + return NULL; +} + +cairo_int_status_t +_cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) +{ + assert (!surface->fallback); + return CAIRO_INT_STATUS_SUCCESS; +} + +cairo_surface_t * +_cairo_xlib_surface_create_shm (cairo_xlib_surface_t *other, + pixman_format_code_t format, + int width, int height) +{ + return NULL; +} + +cairo_surface_t * +_cairo_xlib_surface_create_shm__image (cairo_xlib_surface_t *surface, + pixman_format_code_t format, + int width, int height) +{ + return NULL; +} + +cairo_surface_t * +_cairo_xlib_surface_create_similar_shm (void *other, + cairo_format_t format, + int width, int height) +{ + return cairo_image_surface_create (format, width, height); +} + +void +_cairo_xlib_shm_surface_mark_active (cairo_surface_t *_shm) +{ + ASSERT_NOT_REACHED; +} + +void +_cairo_xlib_shm_surface_get_ximage (cairo_surface_t *surface, + XImage *ximage) +{ + ASSERT_NOT_REACHED; +} + +void * +_cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface) +{ + ASSERT_NOT_REACHED; + return NULL; +} + +Pixmap +_cairo_xlib_shm_surface_get_pixmap (cairo_surface_t *surface) +{ + ASSERT_NOT_REACHED; + return 0; +} + +XRenderPictFormat * +_cairo_xlib_shm_surface_get_xrender_format (cairo_surface_t *surface) +{ + ASSERT_NOT_REACHED; + return NULL; +} + +cairo_bool_t +_cairo_xlib_shm_surface_is_active (cairo_surface_t *surface) +{ + ASSERT_NOT_REACHED; + return FALSE; +} + +cairo_bool_t +_cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface) +{ + ASSERT_NOT_REACHED; + return TRUE; +} + +void _cairo_xlib_display_fini_shm (cairo_xlib_display_t *display) {} + +#else + +#include "cairo-damage-private.h" +#include "cairo-default-context-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-mempool-private.h" + +#include +#include +#include +#if HAVE_X11_EXTENSIONS_SHMPROTO_H +#include +#elif HAVE_X11_EXTENSIONS_SHMSTR_H +#include +#endif +#include +#include + +#define MIN_PIXMAP_SIZE 4096 + +#define MIN_BITS 8 +#define MIN_SIZE (1<<(MIN_BITS-1)) + +typedef struct _cairo_xlib_shm cairo_xlib_shm_t; +typedef struct _cairo_xlib_shm_info cairo_xlib_shm_info_t; +typedef struct _cairo_xlib_shm_surface cairo_xlib_shm_surface_t; + +struct _cairo_xlib_shm { + cairo_mempool_t mem; + + XShmSegmentInfo shm; + unsigned long attached; + cairo_list_t link; +}; + +struct _cairo_xlib_shm_info { + unsigned long last_request; + void *mem; + size_t size; + cairo_xlib_shm_t *pool; +}; + +struct _cairo_xlib_shm_surface { + cairo_image_surface_t image; + + cairo_list_t link; + cairo_xlib_shm_info_t *info; + Pixmap pixmap; + unsigned long active; + int idle; +}; + +/* the parent is always given by index/2 */ +#define PQ_PARENT_INDEX(i) ((i) >> 1) +#define PQ_FIRST_ENTRY 1 + +/* left and right children are index * 2 and (index * 2) +1 respectively */ +#define PQ_LEFT_CHILD_INDEX(i) ((i) << 1) + +#define PQ_TOP(pq) ((pq)->elements[PQ_FIRST_ENTRY]) + +struct pqueue { + int size, max_size; + cairo_xlib_shm_info_t **elements; +}; + +struct _cairo_xlib_shm_display { + int has_pixmaps; + int opcode; + int event; + + Window window; + unsigned long last_request; + unsigned long last_event; + + cairo_list_t surfaces; + + cairo_list_t pool; + struct pqueue info; +}; + +static inline cairo_bool_t +seqno_passed (unsigned long a, unsigned long b) +{ + return (long)(b - a) >= 0; +} + +static inline cairo_bool_t +seqno_before (unsigned long a, unsigned long b) +{ + return (long)(b - a) > 0; +} + +static inline cairo_bool_t +seqno_after (unsigned long a, unsigned long b) +{ + return (long)(a - b) > 0; +} + +static inline cairo_status_t +_pqueue_init (struct pqueue *pq) +{ + pq->max_size = 32; + pq->size = 0; + + pq->elements = _cairo_malloc_ab (pq->max_size, + sizeof (cairo_xlib_shm_info_t *)); + if (unlikely (pq->elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + PQ_TOP(pq) = NULL; + return CAIRO_STATUS_SUCCESS; +} + +static inline void +_pqueue_fini (struct pqueue *pq) +{ + free (pq->elements); +} + +static cairo_status_t +_pqueue_grow (struct pqueue *pq) +{ + cairo_xlib_shm_info_t **new_elements; + + new_elements = _cairo_realloc_ab (pq->elements, + 2 * pq->max_size, + sizeof (cairo_xlib_shm_info_t *)); + if (unlikely (new_elements == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pq->elements = new_elements; + pq->max_size *= 2; + return CAIRO_STATUS_SUCCESS; +} + +static void +_pqueue_shrink (struct pqueue *pq, int min_size) +{ + cairo_xlib_shm_info_t **new_elements; + + if (min_size > pq->max_size) + return; + + new_elements = _cairo_realloc_ab (pq->elements, + min_size, + sizeof (cairo_xlib_shm_info_t *)); + if (unlikely (new_elements == NULL)) + return; + + pq->elements = new_elements; + pq->max_size = min_size; +} + +static inline cairo_status_t +_pqueue_push (struct pqueue *pq, cairo_xlib_shm_info_t *info) +{ + cairo_xlib_shm_info_t **elements; + int i, parent; + + if (unlikely (pq->size + 1 == pq->max_size)) { + cairo_status_t status; + + status = _pqueue_grow (pq); + if (unlikely (status)) + return status; + } + + elements = pq->elements; + + for (i = ++pq->size; + i != PQ_FIRST_ENTRY && + info->last_request < elements[parent = PQ_PARENT_INDEX (i)]->last_request; + i = parent) + { + elements[i] = elements[parent]; + } + + elements[i] = info; + + return CAIRO_STATUS_SUCCESS; +} + +static inline void +_pqueue_pop (struct pqueue *pq) +{ + cairo_xlib_shm_info_t **elements = pq->elements; + cairo_xlib_shm_info_t *tail; + int child, i; + + tail = elements[pq->size--]; + if (pq->size == 0) { + elements[PQ_FIRST_ENTRY] = NULL; + _pqueue_shrink (pq, 32); + return; + } + + for (i = PQ_FIRST_ENTRY; + (child = PQ_LEFT_CHILD_INDEX (i)) <= pq->size; + i = child) + { + if (child != pq->size && + elements[child+1]->last_request < elements[child]->last_request) + { + child++; + } + + if (elements[child]->last_request >= tail->last_request) + break; + + elements[i] = elements[child]; + } + elements[i] = tail; +} + +static cairo_bool_t _x_error_occurred; + +static int +_check_error_handler (Display *display, + XErrorEvent *event) +{ + _x_error_occurred = TRUE; + return False; /* ignored */ +} + +static cairo_bool_t +can_use_shm (Display *dpy, int *has_pixmap) +{ + XShmSegmentInfo shm; + int (*old_handler) (Display *display, XErrorEvent *event); + Status success; + int major, minor; + + if (! XShmQueryExtension (dpy)) + return FALSE; + + XShmQueryVersion (dpy, &major, &minor, has_pixmap); + + shm.shmid = shmget (IPC_PRIVATE, 0x1000, IPC_CREAT | 0600); + if (shm.shmid == -1) + return FALSE; + + shm.readOnly = FALSE; + shm.shmaddr = shmat (shm.shmid, NULL, 0); + if (shm.shmaddr == (char *) -1) { + shmctl (shm.shmid, IPC_RMID, NULL); + return FALSE; + } + + assert (CAIRO_MUTEX_IS_LOCKED (_cairo_xlib_display_mutex)); + _x_error_occurred = FALSE; + + XLockDisplay (dpy); + XSync (dpy, False); + old_handler = XSetErrorHandler (_check_error_handler); + + success = XShmAttach (dpy, &shm); + if (success) + XShmDetach (dpy, &shm); + + XSync (dpy, False); + XSetErrorHandler (old_handler); + XUnlockDisplay (dpy); + + shmctl (shm.shmid, IPC_RMID, NULL); + shmdt (shm.shmaddr); + + return success && ! _x_error_occurred; +} + +static inline Display * +peek_display (cairo_device_t *device) +{ + return ((cairo_xlib_display_t *)device)->display; +} + +static inline unsigned long +peek_processed (cairo_device_t *device) +{ + return LastKnownRequestProcessed (peek_display(device)); +} + +static void +_cairo_xlib_display_shm_pool_destroy (cairo_xlib_display_t *display, + cairo_xlib_shm_t *pool) +{ + shmdt (pool->shm.shmaddr); + if (display->display) /* may be called after CloseDisplay */ + XShmDetach (display->display, &pool->shm); + + _cairo_mempool_fini (&pool->mem); + + cairo_list_del (&pool->link); + free (pool); +} + +static void send_event(cairo_xlib_display_t *display, + cairo_xlib_shm_info_t *info, + unsigned long seqno) +{ + XShmCompletionEvent ev; + + if (! seqno_after (seqno, display->shm->last_event)) + return; + + ev.type = display->shm->event; + ev.send_event = 1; /* XXX or lie? */ + ev.serial = NextRequest (display->display); + ev.drawable = display->shm->window; + ev.major_code = display->shm->opcode; + ev.minor_code = X_ShmPutImage; + ev.shmseg = info->pool->shm.shmid; + ev.offset = (char *)info->mem - (char *)info->pool->shm.shmaddr; + + XSendEvent (display->display, ev.drawable, False, 0, (XEvent *)&ev); + + display->shm->last_event = ev.serial; +} + +static void _cairo_xlib_display_sync (cairo_xlib_display_t *display) +{ + cairo_xlib_shm_info_t *info; + struct pqueue *pq = &display->shm->info; + + XSync (display->display, False); + + while ((info = PQ_TOP(pq))) { + _cairo_mempool_free (&info->pool->mem, info->mem); + _pqueue_pop (&display->shm->info); + free (info); + } +} + +static void +_cairo_xlib_shm_info_cleanup (cairo_xlib_display_t *display) +{ + cairo_xlib_shm_info_t *info; + Display *dpy = display->display; + struct pqueue *pq = &display->shm->info; + unsigned long processed; + + if (PQ_TOP(pq) == NULL) + return; + + XEventsQueued (dpy, QueuedAfterReading); + processed = LastKnownRequestProcessed (dpy); + + info = PQ_TOP(pq); + do { + if (! seqno_passed (info->last_request, processed)) { + send_event (display, info, display->shm->last_request); + return; + } + + _cairo_mempool_free (&info->pool->mem, info->mem); + _pqueue_pop (&display->shm->info); + free (info); + } while ((info = PQ_TOP(pq))); +} + +static cairo_xlib_shm_t * +_cairo_xlib_shm_info_find (cairo_xlib_display_t *display, size_t size, + void **ptr, unsigned long *last_request) +{ + cairo_xlib_shm_info_t *info; + struct pqueue *pq = &display->shm->info; + + if (PQ_TOP(pq) == NULL) + return NULL; + + info = PQ_TOP(pq); + do { + cairo_xlib_shm_t *pool = info->pool; + + *last_request = info->last_request; + + _pqueue_pop (&display->shm->info); + _cairo_mempool_free (&pool->mem, info->mem); + free (info); + + if (pool->mem.free_bytes >= size) { + void *mem = _cairo_mempool_alloc (&pool->mem, size); + if (mem != NULL) { + *ptr = mem; + return pool; + } + } + } while ((info = PQ_TOP(pq))); + + return NULL; +} + +static cairo_xlib_shm_t * +_cairo_xlib_shm_pool_find (cairo_xlib_display_t *display, + size_t size, + void **ptr) +{ + cairo_xlib_shm_t *pool; + + cairo_list_foreach_entry (pool, cairo_xlib_shm_t, &display->shm->pool, link) { + if (pool->mem.free_bytes >= size) { + void *mem = _cairo_mempool_alloc (&pool->mem, size); + if (mem != NULL) { + *ptr = mem; + return pool; + } + } + } + + return NULL; +} + +static void +_cairo_xlib_shm_pool_cleanup (cairo_xlib_display_t *display) +{ + cairo_xlib_shm_t *pool, *next; + unsigned long processed; + + processed = LastKnownRequestProcessed (display->display); + + cairo_list_foreach_entry_safe (pool, next, cairo_xlib_shm_t, + &display->shm->pool, link) { + if (! seqno_passed (pool->attached, processed)) + break; + + if (pool->mem.free_bytes == pool->mem.max_bytes) + _cairo_xlib_display_shm_pool_destroy (display, pool); + } +} + +static cairo_xlib_shm_t * +_cairo_xlib_shm_pool_create(cairo_xlib_display_t *display, + size_t size, void **ptr) +{ + Display *dpy = display->display; + cairo_xlib_shm_t *pool; + size_t bytes, maxbits = 16, minbits = MIN_BITS; + Status success; + + pool = malloc (sizeof (cairo_xlib_shm_t)); + if (pool == NULL) + return NULL; + + bytes = 1 << maxbits; + while (bytes <= size) + bytes <<= 1, maxbits++; + bytes <<= 3; + + minbits += (maxbits - 16) / 2; + + pool->shm.shmid = shmget (IPC_PRIVATE, bytes, IPC_CREAT | 0600); + while (pool->shm.shmid == -1 && bytes >= 2*size) { + bytes >>= 1; + pool->shm.shmid = shmget (IPC_PRIVATE, bytes, IPC_CREAT | 0600); + } + if (pool->shm.shmid == -1) + goto cleanup; + + pool->shm.readOnly = FALSE; + pool->shm.shmaddr = shmat (pool->shm.shmid, NULL, 0); + if (pool->shm.shmaddr == (char *) -1) { + shmctl (pool->shm.shmid, IPC_RMID, NULL); + goto cleanup; + } + + pool->attached = NextRequest (dpy); + success = XShmAttach (dpy, &pool->shm); +#if !IPC_RMID_DEFERRED_RELEASE + XSync (dpy, FALSE); +#endif + shmctl (pool->shm.shmid, IPC_RMID, NULL); + + if (! success) + goto cleanup_shm; + + if (_cairo_mempool_init (&pool->mem, pool->shm.shmaddr, bytes, + minbits, maxbits - minbits + 1)) + goto cleanup_detach; + + cairo_list_add (&pool->link, &display->shm->pool); + + *ptr = _cairo_mempool_alloc (&pool->mem, size); + assert (*ptr != NULL); + return pool; + +cleanup_detach: + XShmDetach (dpy, &pool->shm); +cleanup_shm: + shmdt (pool->shm.shmaddr); +cleanup: + free (pool); + return NULL; +} + +static cairo_xlib_shm_info_t * +_cairo_xlib_shm_info_create (cairo_xlib_display_t *display, + size_t size, cairo_bool_t will_sync) +{ + cairo_xlib_shm_info_t *info; + cairo_xlib_shm_t *pool; + unsigned long last_request = 0; + void *mem = NULL; + + _cairo_xlib_shm_info_cleanup (display); + pool = _cairo_xlib_shm_pool_find (display, size, &mem); + _cairo_xlib_shm_pool_cleanup (display); + + if (pool == NULL && will_sync) + pool = _cairo_xlib_shm_info_find (display, size, &mem, &last_request); + if (pool == NULL) + pool = _cairo_xlib_shm_pool_create (display, size, &mem); + if (pool == NULL) + return NULL; + + assert (mem != NULL); + + info = malloc (sizeof (*info)); + if (info == NULL) { + _cairo_mempool_free (&pool->mem, mem); + return NULL; + } + + info->pool = pool; + info->mem = mem; + info->size = size; + info->last_request = last_request; + + return info; +} + +static cairo_status_t +_cairo_xlib_shm_surface_flush (void *abstract_surface, unsigned flags) +{ + cairo_xlib_shm_surface_t *shm = abstract_surface; + cairo_xlib_display_t *display; + Display *dpy; + cairo_status_t status; + + if (shm->active == 0) + return CAIRO_STATUS_SUCCESS; + + if (shm->image.base._finishing) + return CAIRO_STATUS_SUCCESS; + + if (seqno_passed (shm->active, peek_processed (shm->image.base.device))) { + shm->active = 0; + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_xlib_display_acquire (shm->image.base.device, &display); + if (unlikely (status)) + return status; + + send_event (display, shm->info, shm->active); + + dpy = display->display; + XEventsQueued (dpy, QueuedAfterReading); + while (! seqno_passed (shm->active, LastKnownRequestProcessed (dpy))) { + LockDisplay(dpy); + _XReadEvents(dpy); + UnlockDisplay(dpy); + } + + cairo_device_release (&display->base); + shm->active = 0; + + return CAIRO_STATUS_SUCCESS; +} + +static inline cairo_bool_t +active (cairo_xlib_shm_surface_t *shm, Display *dpy) +{ + return (shm->active && + ! seqno_passed (shm->active, LastKnownRequestProcessed (dpy))); +} + +static cairo_status_t +_cairo_xlib_shm_surface_finish (void *abstract_surface) +{ + cairo_xlib_shm_surface_t *shm = abstract_surface; + cairo_xlib_display_t *display; + cairo_status_t status; + + if (shm->image.base.damage) { + _cairo_damage_destroy (shm->image.base.damage); + shm->image.base.damage = _cairo_damage_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + } + + status = _cairo_xlib_display_acquire (shm->image.base.device, &display); + if (unlikely (status)) + return status; + + if (shm->pixmap) + XFreePixmap (display->display, shm->pixmap); + + if (active (shm, display->display)) { + shm->info->last_request = shm->active; + _pqueue_push (&display->shm->info, shm->info); + if (seqno_before (display->shm->last_request, shm->active)) + display->shm->last_request = shm->active; + } else { + _cairo_mempool_free (&shm->info->pool->mem, shm->info->mem); + free (shm->info); + + _cairo_xlib_shm_pool_cleanup (display); + } + + cairo_list_del (&shm->link); + + cairo_device_release (&display->base); + return _cairo_image_surface_finish (abstract_surface); +} + +static const cairo_surface_backend_t cairo_xlib_shm_surface_backend = { + CAIRO_SURFACE_TYPE_IMAGE, + _cairo_xlib_shm_surface_finish, + + _cairo_default_context_create, + + _cairo_image_surface_create_similar, + NULL, /* create similar image */ + _cairo_image_surface_map_to_image, + _cairo_image_surface_unmap_image, + + _cairo_image_surface_source, + _cairo_image_surface_acquire_source_image, + _cairo_image_surface_release_source_image, + _cairo_image_surface_snapshot, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_image_surface_get_extents, + _cairo_image_surface_get_font_options, + + _cairo_xlib_shm_surface_flush, + NULL, + + _cairo_image_surface_paint, + _cairo_image_surface_mask, + _cairo_image_surface_stroke, + _cairo_image_surface_fill, + NULL, /* fill-stroke */ + _cairo_image_surface_glyphs, +}; + +static cairo_bool_t +has_shm (cairo_xlib_surface_t *surface) +{ + cairo_xlib_display_t *display = (cairo_xlib_display_t *)surface->base.device; + return display->shm != NULL; +} + +static int +has_shm_pixmaps (cairo_xlib_surface_t *surface) +{ + cairo_xlib_display_t *display = (cairo_xlib_display_t *)surface->base.device; + if (!display->shm) + return 0; + + return display->shm->has_pixmaps; +} + +static cairo_xlib_shm_surface_t * +_cairo_xlib_shm_surface_create (cairo_xlib_surface_t *other, + pixman_format_code_t format, + int width, int height, + cairo_bool_t will_sync, + int create_pixmap) +{ + cairo_xlib_shm_surface_t *shm; + cairo_xlib_display_t *display; + pixman_image_t *image; + int stride, size; + + stride = CAIRO_STRIDE_FOR_WIDTH_BPP (width, PIXMAN_FORMAT_BPP(format)); + size = stride * height; + if (size < MIN_SIZE) + return NULL; + + shm = malloc (sizeof (*shm)); + if (unlikely (shm == NULL)) + return (cairo_xlib_shm_surface_t *)_cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_surface_init (&shm->image.base, + &cairo_xlib_shm_surface_backend, + other->base.device, + _cairo_content_from_pixman_format (format)); + + if (_cairo_xlib_display_acquire (other->base.device, &display)) + goto cleanup_shm; + + shm->info = _cairo_xlib_shm_info_create (display, size, will_sync); + if (shm->info == NULL) + goto cleanup_display; + + image = pixman_image_create_bits (format, width, height, + (uint32_t *) shm->info->mem, stride); + if (image == NULL) + goto cleanup_info; + + _cairo_image_surface_init (&shm->image, image, format); + + shm->pixmap = 0; + if (create_pixmap && size >= create_pixmap) { + shm->pixmap = XShmCreatePixmap (display->display, + other->drawable, + shm->info->mem, + &shm->info->pool->shm, + shm->image.width, + shm->image.height, + shm->image.depth); + } + shm->active = shm->info->last_request; + shm->idle = -5; + + assert (shm->active == 0 || will_sync); + + cairo_list_add (&shm->link, &display->shm->surfaces); + + cairo_device_release (&display->base); + + return shm; + +cleanup_info: + _cairo_mempool_free (&shm->info->pool->mem, shm->info->mem); + free(shm->info); +cleanup_display: + cairo_device_release (&display->base); +cleanup_shm: + free (shm); + return NULL; +} + +static void +_cairo_xlib_surface_update_shm (cairo_xlib_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *)surface->shm; + cairo_xlib_display_t *display; + cairo_damage_t *damage; + GC gc; + + damage = _cairo_damage_reduce (surface->base.damage); + surface->base.damage = _cairo_damage_create(); + + if (_cairo_xlib_display_acquire (surface->base.device, &display)) + goto cleanup_damage; + + if (_cairo_xlib_surface_get_gc (display, surface, &gc)) + goto cleanup_display; + + if (! surface->owns_pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = IncludeInferiors; + XChangeGC (display->display, gc, GCSubwindowMode, &gcv); + } + + if (damage->region) { + XRectangle stack_rects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *rects = stack_rects; + cairo_rectangle_int_t r; + int n_rects, i; + + n_rects = cairo_region_num_rectangles (damage->region); + if (n_rects == 0) { + } else if (n_rects == 1) { + cairo_region_get_rectangle (damage->region, 0, &r); + XCopyArea (display->display, + surface->drawable, shm->pixmap, gc, + r.x, r.y, + r.width, r.height, + r.x, r.y); + } else { + if (n_rects > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (n_rects, sizeof (XRectangle)); + if (unlikely (rects == NULL)) { + rects = stack_rects; + n_rects = ARRAY_LENGTH (stack_rects); + } + } + for (i = 0; i < n_rects; i++) { + cairo_region_get_rectangle (damage->region, i, &r); + + rects[i].x = r.x; + rects[i].y = r.y; + rects[i].width = r.width; + rects[i].height = r.height; + } + XSetClipRectangles (display->display, gc, 0, 0, rects, i, YXBanded); + + XCopyArea (display->display, + surface->drawable, shm->pixmap, gc, + 0, 0, + shm->image.width, shm->image.height, + 0, 0); + + if (damage->status == CAIRO_STATUS_SUCCESS && damage->region) + XSetClipMask (display->display, gc, None); + } + } else { + XCopyArea (display->display, + surface->drawable, shm->pixmap, gc, + 0, 0, + shm->image.width, shm->image.height, + 0, 0); + } + + if (! surface->owns_pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = ClipByChildren; + XChangeGC (display->display, gc, GCSubwindowMode, &gcv); + } + + _cairo_xlib_display_sync (display); + shm->active = 0; + shm->idle--; + + _cairo_xlib_surface_put_gc (display, surface, gc); +cleanup_display: + cairo_device_release (&display->base); +cleanup_damage: + _cairo_damage_destroy (damage); +} + +static void +_cairo_xlib_surface_clear_shm (cairo_xlib_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *)surface->shm; + + assert (shm->active == 0); + + _cairo_damage_destroy (surface->base.damage); + surface->base.damage = _cairo_damage_create(); + + memset (shm->image.data, 0, shm->image.stride * shm->image.height); + shm->image.base.is_clear = TRUE; +} + +static void inc_idle (cairo_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *)surface; + shm->idle++; +} + +static void dec_idle (cairo_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *)surface; + shm->idle--; +} + +cairo_surface_t * +_cairo_xlib_surface_get_shm (cairo_xlib_surface_t *surface, + cairo_bool_t overwrite) +{ + if (surface->fallback) { + assert (surface->base.damage); + assert (surface->shm); + assert (surface->shm->damage); + goto done; + } + + if (surface->shm == NULL) { + pixman_format_code_t pixman_format; + cairo_bool_t will_sync; + + if (! has_shm_pixmaps (surface)) + return NULL; + + if ((surface->width | surface->height) < 32) + return NULL; + + pixman_format = _pixman_format_for_xlib_surface (surface); + if (pixman_format == 0) + return NULL; + + will_sync = !surface->base.is_clear && !overwrite; + + surface->shm = + &_cairo_xlib_shm_surface_create (surface, pixman_format, + surface->width, surface->height, + will_sync, 1)->image.base; + if (surface->shm == NULL) + return NULL; + + assert (surface->base.damage == NULL); + if (surface->base.serial || !surface->owns_pixmap) { + cairo_rectangle_int_t rect; + + rect.x = rect.y = 0; + rect.width = surface->width; + rect.height = surface->height; + + surface->base.damage = + _cairo_damage_add_rectangle (NULL, &rect); + } else + surface->base.damage = _cairo_damage_create (); + + surface->shm->damage = _cairo_damage_create (); + } + + if (overwrite) { + _cairo_damage_destroy (surface->base.damage); + surface->base.damage = _cairo_damage_create (); + } + + if (!surface->base.is_clear && surface->base.damage->dirty) + _cairo_xlib_surface_update_shm (surface); + + _cairo_xlib_shm_surface_flush (surface->shm, 1); + + if (surface->base.is_clear && surface->base.damage->dirty) + _cairo_xlib_surface_clear_shm (surface); + +done: + dec_idle(surface->shm); + return surface->shm; +} + +cairo_int_status_t +_cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS; + + if (!surface->fallback) { + if (surface->shm) + inc_idle (surface->shm); + return CAIRO_INT_STATUS_SUCCESS; + } + + if (surface->shm->damage->dirty) { + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) surface->shm; + cairo_xlib_display_t *display; + cairo_damage_t *damage; + GC gc; + + status = _cairo_xlib_display_acquire (surface->base.device, &display); + if (unlikely (status)) + return status; + + damage = _cairo_damage_reduce (shm->image.base.damage); + shm->image.base.damage = _cairo_damage_create (); + + TRACE ((stderr, "%s: flushing damage x %d\n", __FUNCTION__, + damage->region ? cairo_region_num_rectangles (damage->region) : 0)); + if (damage->status == CAIRO_STATUS_SUCCESS && damage->region) { + XRectangle stack_rects[CAIRO_STACK_ARRAY_LENGTH (XRectangle)]; + XRectangle *rects = stack_rects; + cairo_rectangle_int_t r; + int n_rects, i; + + n_rects = cairo_region_num_rectangles (damage->region); + if (n_rects == 0) + goto out; + + status = _cairo_xlib_surface_get_gc (display, surface, &gc); + if (unlikely (status)) + goto out; + + if (n_rects == 1) { + cairo_region_get_rectangle (damage->region, 0, &r); + _cairo_xlib_shm_surface_mark_active (surface->shm); + XCopyArea (display->display, + shm->pixmap, surface->drawable, gc, + r.x, r.y, + r.width, r.height, + r.x, r.y); + } else { + if (n_rects > ARRAY_LENGTH (stack_rects)) { + rects = _cairo_malloc_ab (n_rects, sizeof (XRectangle)); + if (unlikely (rects == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + _cairo_xlib_surface_put_gc (display, surface, gc); + goto out; + } + } + for (i = 0; i < n_rects; i++) { + cairo_region_get_rectangle (damage->region, i, &r); + + rects[i].x = r.x; + rects[i].y = r.y; + rects[i].width = r.width; + rects[i].height = r.height; + } + XSetClipRectangles (display->display, gc, 0, 0, rects, i, YXBanded); + + _cairo_xlib_shm_surface_mark_active (surface->shm); + XCopyArea (display->display, + shm->pixmap, surface->drawable, gc, + 0, 0, + shm->image.width, shm->image.height, + 0, 0); + + if (damage->status == CAIRO_STATUS_SUCCESS && damage->region) + XSetClipMask (display->display, gc, None); + } + + _cairo_xlib_surface_put_gc (display, surface, gc); + } + +out: + _cairo_damage_destroy (damage); + cairo_device_release (&display->base); + } + + return status; +} + +cairo_surface_t * +_cairo_xlib_surface_create_shm (cairo_xlib_surface_t *other, + pixman_format_code_t format, + int width, int height) +{ + cairo_surface_t *surface; + + surface = NULL; + if (has_shm (other)) + surface = &_cairo_xlib_shm_surface_create (other, format, width, height, + FALSE, has_shm_pixmaps (other))->image.base; + + return surface; +} + +cairo_surface_t * +_cairo_xlib_surface_create_shm__image (cairo_xlib_surface_t *surface, + pixman_format_code_t format, + int width, int height) +{ + if (! has_shm(surface)) + return NULL; + + return &_cairo_xlib_shm_surface_create (surface, format, width, height, + FALSE, 0)->image.base; +} + +cairo_surface_t * +_cairo_xlib_surface_create_similar_shm (void *other, + cairo_format_t format, + int width, int height) +{ + cairo_surface_t *surface; + + surface = _cairo_xlib_surface_create_shm (other, + _cairo_format_to_pixman_format_code (format), + width, height); + if (surface) { + if (! surface->is_clear) { + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) surface; + assert (shm->active == 0); + memset (shm->image.data, 0, shm->image.stride * shm->image.height); + shm->image.base.is_clear = TRUE; + } + } else + surface = cairo_image_surface_create (format, width, height); + + return surface; +} + +void +_cairo_xlib_shm_surface_mark_active (cairo_surface_t *_shm) +{ + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) _shm; + cairo_xlib_display_t *display = (cairo_xlib_display_t *) _shm->device; + + shm->active = NextRequest (display->display); +} + +void +_cairo_xlib_shm_surface_get_ximage (cairo_surface_t *surface, + XImage *ximage) +{ + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) surface; + int native_byte_order = _cairo_is_little_endian () ? LSBFirst : MSBFirst; + cairo_format_masks_t image_masks; + int ret; + + ret = _pixman_format_to_masks (shm->image.pixman_format, &image_masks); + assert (ret); + + ximage->width = shm->image.width; + ximage->height = shm->image.height; + ximage->format = ZPixmap; + ximage->data = (char *) shm->image.data; + ximage->obdata = (char *)&shm->info->pool->shm; + ximage->byte_order = native_byte_order; + ximage->bitmap_unit = 32; /* always for libpixman */ + ximage->bitmap_bit_order = native_byte_order; + ximage->bitmap_pad = 32; /* always for libpixman */ + ximage->depth = shm->image.depth; + ximage->bytes_per_line = shm->image.stride; + ximage->bits_per_pixel = image_masks.bpp; + ximage->red_mask = image_masks.red_mask; + ximage->green_mask = image_masks.green_mask; + ximage->blue_mask = image_masks.blue_mask; + ximage->xoffset = 0; + + ret = XInitImage (ximage); + assert (ret != 0); +} + +void * +_cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface) +{ + cairo_xlib_display_t *display = (cairo_xlib_display_t *) surface->device; + cairo_xlib_shm_surface_t *shm = (cairo_xlib_shm_surface_t *) surface; + + display->shm->last_event = shm->active = NextRequest (display->display); + return &shm->info->pool->shm; +} + +Pixmap +_cairo_xlib_shm_surface_get_pixmap (cairo_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm; + + shm = (cairo_xlib_shm_surface_t *) surface; + return shm->pixmap; +} + +XRenderPictFormat * +_cairo_xlib_shm_surface_get_xrender_format (cairo_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm; + + shm = (cairo_xlib_shm_surface_t *) surface; + if (shm->image.format != CAIRO_FORMAT_INVALID) + return _cairo_xlib_display_get_xrender_format ((cairo_xlib_display_t *)surface->device, + shm->image.format); + + return _cairo_xlib_display_get_xrender_format_for_pixman((cairo_xlib_display_t *)surface->device, + shm->image.pixman_format); +} + +cairo_bool_t +_cairo_xlib_shm_surface_is_active (cairo_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm; + + shm = (cairo_xlib_shm_surface_t *) surface; + if (shm->active == 0) + return FALSE; + + if (seqno_passed (shm->active, peek_processed (shm->image.base.device))) { + shm->active = 0; + return FALSE; + } + + return TRUE; +} + +cairo_bool_t +_cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface) +{ + cairo_xlib_shm_surface_t *shm; + + shm = (cairo_xlib_shm_surface_t *) surface; + return shm->idle > 0; +} + +#define XORG_VERSION_ENCODE(major,minor,patch,snap) \ + (((major) * 10000000) + ((minor) * 100000) + ((patch) * 1000) + snap) + +static cairo_bool_t +has_broken_send_shm_event (cairo_xlib_display_t *display, + cairo_xlib_shm_display_t *shm) +{ + Display *dpy = display->display; + int (*old_handler) (Display *display, XErrorEvent *event); + XShmCompletionEvent ev; + XShmSegmentInfo info; + + info.shmid = shmget (IPC_PRIVATE, 0x1000, IPC_CREAT | 0600); + if (info.shmid == -1) + return TRUE; + + info.readOnly = FALSE; + info.shmaddr = shmat (info.shmid, NULL, 0); + if (info.shmaddr == (char *) -1) { + shmctl (info.shmid, IPC_RMID, NULL); + return TRUE; + } + + ev.type = shm->event; + ev.send_event = 1; + ev.serial = 1; + ev.drawable = shm->window; + ev.major_code = shm->opcode; + ev.minor_code = X_ShmPutImage; + + ev.shmseg = info.shmid; + ev.offset = 0; + + assert (CAIRO_MUTEX_IS_LOCKED (_cairo_xlib_display_mutex)); + _x_error_occurred = FALSE; + + XLockDisplay (dpy); + XSync (dpy, False); + old_handler = XSetErrorHandler (_check_error_handler); + + XShmAttach (dpy, &info); + XSendEvent (dpy, ev.drawable, False, 0, (XEvent *)&ev); + XShmDetach (dpy, &info); + + XSync (dpy, False); + XSetErrorHandler (old_handler); + XUnlockDisplay (dpy); + + shmctl (info.shmid, IPC_RMID, NULL); + shmdt (info.shmaddr); + + return _x_error_occurred; +} + +static cairo_bool_t +xorg_has_buggy_send_shm_completion_event(cairo_xlib_display_t *display, + cairo_xlib_shm_display_t *shm) +{ + Display *dpy = display->display; + + /* As libXext sets the SEND_EVENT bit in the ShmCompletionEvent, + * the Xserver may crash if it does not take care when processing + * the event type. For instance versions of Xorg prior to 1.11.1 + * exhibited this bug, and was fixed by: + * + * commit 2d2dce558d24eeea0eb011ec9ebaa6c5c2273c39 + * Author: Sam Spilsbury + * Date: Wed Sep 14 09:58:34 2011 +0800 + * + * Remove the SendEvent bit (0x80) before doing range checks on event type. + */ + if (_cairo_xlib_vendor_is_xorg (dpy) && + VendorRelease (dpy) < XORG_VERSION_ENCODE(1,11,0,1)) + return TRUE; + + /* For everyone else check that no error is generated */ + return has_broken_send_shm_event (display, shm); +} + +void +_cairo_xlib_display_init_shm (cairo_xlib_display_t *display) +{ + cairo_xlib_shm_display_t *shm; + XSetWindowAttributes attr; + XExtCodes *codes; + int has_pixmap, scr; + + display->shm = NULL; + + if (!can_use_shm (display->display, &has_pixmap)) + return; + + shm = malloc (sizeof (*shm)); + if (unlikely (shm == NULL)) + return; + + codes = XInitExtension (display->display, SHMNAME); + if (codes == NULL) { + free (shm); + return; + } + + shm->opcode = codes ->major_opcode; + shm->event = codes->first_event; + + if (unlikely (_pqueue_init (&shm->info))) { + free (shm); + return; + } + + scr = DefaultScreen (display->display); + attr.override_redirect = 1; + shm->window = XCreateWindow (display->display, + DefaultRootWindow (display->display), -1, -1, + 1, 1, 0, + DefaultDepth (display->display, scr), + InputOutput, + DefaultVisual (display->display, scr), + CWOverrideRedirect, &attr); + shm->last_event = 0; + shm->last_request = 0; + + if (xorg_has_buggy_send_shm_completion_event(display, shm)) + has_pixmap = 0; + + shm->has_pixmaps = has_pixmap ? MIN_PIXMAP_SIZE : 0; + cairo_list_init (&shm->pool); + + cairo_list_init (&shm->surfaces); + + display->shm = shm; +} + +void +_cairo_xlib_display_fini_shm (cairo_xlib_display_t *display) +{ + cairo_xlib_shm_display_t *shm = display->shm; + + if (shm == NULL) + return; + + while (!cairo_list_is_empty (&shm->surfaces)) + cairo_surface_finish (&cairo_list_first_entry (&shm->surfaces, + cairo_xlib_shm_surface_t, + link)->image.base); + + _pqueue_fini (&shm->info); + + while (!cairo_list_is_empty (&shm->pool)) { + cairo_xlib_shm_t *pool; + + pool = cairo_list_first_entry (&shm->pool, cairo_xlib_shm_t, link); + _cairo_xlib_display_shm_pool_destroy (display, pool); + } + + if (display->display) + XDestroyWindow (display->display, shm->window); + + free (shm); + display->shm = NULL; +} +#endif +#endif diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c new file mode 100644 index 000000000..029a542b9 --- /dev/null +++ b/src/cairo-xlib-surface.c @@ -0,0 +1,2383 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Behdad Esfahbod + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +/* Heed well the words of Owen Taylor: + * "Any patch that works around a render bug, or claims to, without a + * specific reference to the bug filed in bugzilla.freedesktop.org will + * never pass approval." + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" +#include "cairo-xlib-surface-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-clip-private.h" +#include "cairo-damage-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-list-inline.h" +#include "cairo-pattern-private.h" +#include "cairo-pixman-private.h" +#include "cairo-region-private.h" +#include "cairo-scaled-font-private.h" +#include "cairo-surface-snapshot-private.h" +#include "cairo-surface-subsurface-private.h" + +#include /* for XDestroyImage */ + +#include +#include +#include + +#define XLIB_COORD_MAX 32767 + +#define DEBUG 0 + +#if DEBUG +#define UNSUPPORTED(reason) \ + fprintf (stderr, \ + "cairo-xlib: hit unsupported operation %s(), line %d: %s\n", \ + __FUNCTION__, __LINE__, reason), \ + CAIRO_INT_STATUS_UNSUPPORTED +#else +#define UNSUPPORTED(reason) CAIRO_INT_STATUS_UNSUPPORTED +#endif + +#if DEBUG +#include +static void CAIRO_PRINTF_FORMAT (2, 3) +_x_bread_crumb (Display *dpy, + const char *fmt, + ...) +{ + xReq *req; + char buf[2048]; + unsigned int len, len_dwords; + va_list ap; + + va_start (ap, fmt); + len = vsnprintf (buf, sizeof (buf), fmt, ap); + va_end (ap); + + buf[len++] = '\0'; + while (len & 3) + buf[len++] = '\0'; + + LockDisplay (dpy); + GetEmptyReq (NoOperation, req); + + len_dwords = len >> 2; + SetReqLen (req, len_dwords, len_dwords); + Data (dpy, buf, len); + + UnlockDisplay (dpy); + SyncHandle (); +} +#define X_DEBUG(x) _x_bread_crumb x +#else +#define X_DEBUG(x) +#endif + +/** + * SECTION:cairo-xlib + * @Title: XLib Surfaces + * @Short_Description: X Window System rendering using XLib + * @See_Also: #cairo_surface_t + * + * The XLib surface is used to render cairo graphics to X Window System + * windows and pixmaps using the XLib library. + * + * Note that the XLib surface automatically takes advantage of X render extension + * if it is available. + **/ + +/** + * CAIRO_HAS_XLIB_SURFACE: + * + * Defined if the Xlib surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.0 + **/ + +/** + * SECTION:cairo-xlib-xrender + * @Title: XLib-XRender Backend + * @Short_Description: X Window System rendering using XLib and the X Render extension + * @See_Also: #cairo_surface_t + * + * The XLib surface is used to render cairo graphics to X Window System + * windows and pixmaps using the XLib and Xrender libraries. + * + * Note that the XLib surface automatically takes advantage of X Render extension + * if it is available. + **/ + +/** + * CAIRO_HAS_XLIB_XRENDER_SURFACE: + * + * Defined if the XLib/XRender surface functions are available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.6 + **/ + +/* Xlib doesn't define a typedef, so define one ourselves */ +typedef int (*cairo_xlib_error_func_t) (Display *display, + XErrorEvent *event); + +static cairo_surface_t * +_cairo_xlib_surface_create_internal (cairo_xlib_screen_t *screen, + Drawable drawable, + Visual *visual, + XRenderPictFormat *xrender_format, + int width, + int height, + int depth); + +static cairo_bool_t +_cairo_surface_is_xlib (cairo_surface_t *surface); + +/* + * Instead of taking two round trips for each blending request, + * assume that if a particular drawable fails GetImage that it will + * fail for a "while"; use temporary pixmaps to avoid the errors + */ + +#define CAIRO_ASSUME_PIXMAP 20 + +static const XTransform identity = { { + { 1 << 16, 0x00000, 0x00000 }, + { 0x00000, 1 << 16, 0x00000 }, + { 0x00000, 0x00000, 1 << 16 }, +} }; + +static Visual * +_visual_for_xrender_format(Screen *screen, + XRenderPictFormat *xrender_format) +{ + int d, v; + + /* XXX Consider searching through the list of known cairo_visual_t for + * the reverse mapping. + */ + + for (d = 0; d < screen->ndepths; d++) { + Depth *d_info = &screen->depths[d]; + + if (d_info->depth != xrender_format->depth) + continue; + + for (v = 0; v < d_info->nvisuals; v++) { + Visual *visual = &d_info->visuals[v]; + + switch (visual->class) { + case TrueColor: + if (xrender_format->type != PictTypeDirect) + continue; + break; + + case DirectColor: + /* Prefer TrueColor to DirectColor. + * (XRenderFindVisualFormat considers both TrueColor and DirectColor + * Visuals to match the same PictFormat.) + */ + continue; + + case StaticGray: + case GrayScale: + case StaticColor: + case PseudoColor: + if (xrender_format->type != PictTypeIndexed) + continue; + break; + } + + if (xrender_format == + XRenderFindVisualFormat (DisplayOfScreen(screen), visual)) + return visual; + } + } + + return NULL; +} + +static cairo_content_t +_xrender_format_to_content (XRenderPictFormat *xrender_format) +{ + cairo_content_t content; + + /* This only happens when using a non-Render server. Let's punt + * and say there's no alpha here. */ + if (xrender_format == NULL) + return CAIRO_CONTENT_COLOR; + + content = 0; + if (xrender_format->direct.alphaMask) + content |= CAIRO_CONTENT_ALPHA; + if (xrender_format->direct.redMask | + xrender_format->direct.greenMask | + xrender_format->direct.blueMask) + content |= CAIRO_CONTENT_COLOR; + + return content; +} + +static cairo_surface_t * +_cairo_xlib_surface_create_similar (void *abstract_src, + cairo_content_t content, + int width, + int height) +{ + cairo_xlib_surface_t *src = abstract_src; + XRenderPictFormat *xrender_format; + cairo_xlib_surface_t *surface; + cairo_xlib_display_t *display; + Pixmap pix; + + if (width > XLIB_COORD_MAX || height > XLIB_COORD_MAX) + return NULL; + + if (width == 0 || height == 0) + return NULL; + + if (_cairo_xlib_display_acquire (src->base.device, &display)) + return NULL; + + /* If we never found an XRenderFormat or if it isn't compatible + * with the content being requested, then we fallback to just + * constructing a cairo_format_t instead, (which will fairly + * arbitrarily pick a visual/depth for the similar surface. + */ + xrender_format = NULL; + if (src->xrender_format && + _xrender_format_to_content (src->xrender_format) == content) + { + xrender_format = src->xrender_format; + } + if (xrender_format == NULL) { + xrender_format = + _cairo_xlib_display_get_xrender_format (display, + _cairo_format_from_content (content)); + } + if (xrender_format) { + Visual *visual; + + /* We've got a compatible XRenderFormat now, which means the + * similar surface will match the existing surface as closely in + * visual/depth etc. as possible. */ + pix = XCreatePixmap (display->display, src->drawable, + width, height, xrender_format->depth); + + if (xrender_format == src->xrender_format) + visual = src->visual; + else + visual = _visual_for_xrender_format(src->screen->screen, + xrender_format); + + surface = (cairo_xlib_surface_t *) + _cairo_xlib_surface_create_internal (src->screen, pix, visual, + xrender_format, + width, height, + xrender_format->depth); + } + else + { + Screen *screen = src->screen->screen; + int depth; + + /* No compatible XRenderFormat, see if we can make an ordinary pixmap, + * so that we can still accelerate blits with XCopyArea(). */ + if (content != CAIRO_CONTENT_COLOR) { + cairo_device_release (&display->base); + return NULL; + } + + depth = DefaultDepthOfScreen (screen); + + pix = XCreatePixmap (display->display, RootWindowOfScreen (screen), + width <= 0 ? 1 : width, height <= 0 ? 1 : height, + depth); + + surface = (cairo_xlib_surface_t *) + _cairo_xlib_surface_create_internal (src->screen, pix, + DefaultVisualOfScreen (screen), + NULL, + width, height, depth); + } + + if (likely (surface->base.status == CAIRO_STATUS_SUCCESS)) + surface->owns_pixmap = TRUE; + else + XFreePixmap (display->display, pix); + + cairo_device_release (&display->base); + + return &surface->base; +} + +static void +_cairo_xlib_surface_discard_shm (cairo_xlib_surface_t *surface) +{ + if (surface->shm == NULL) + return; + + /* Force the flush for an external surface */ + if (!surface->owns_pixmap) + cairo_surface_flush (surface->shm); + + cairo_surface_finish (surface->shm); + cairo_surface_destroy (surface->shm); + surface->shm = NULL; + + _cairo_damage_destroy (surface->base.damage); + surface->base.damage = NULL; + + surface->fallback = 0; +} + +static cairo_status_t +_cairo_xlib_surface_finish (void *abstract_surface) +{ + cairo_xlib_surface_t *surface = abstract_surface; + cairo_status_t status; + cairo_xlib_display_t *display; + + cairo_list_del (&surface->link); + + status = _cairo_xlib_display_acquire (surface->base.device, &display); + if (unlikely (status)) + return status; + + X_DEBUG ((display->display, "finish (drawable=%x)", (unsigned int) surface->drawable)); + + if (surface->embedded_source.picture) + XRenderFreePicture (display->display, surface->embedded_source.picture); + if (surface->picture) + XRenderFreePicture (display->display, surface->picture); + + _cairo_xlib_surface_discard_shm (surface); + + if (surface->owns_pixmap) + XFreePixmap (display->display, surface->drawable); + + cairo_device_release (&display->base); + + return status; +} + +cairo_status_t +_cairo_xlib_surface_get_gc (cairo_xlib_display_t *display, + cairo_xlib_surface_t *surface, + GC *gc) +{ + *gc = _cairo_xlib_screen_get_gc (display, + surface->screen, + surface->depth, + surface->drawable); + if (unlikely (*gc == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} + +static int +_noop_error_handler (Display *display, + XErrorEvent *event) +{ + return False; /* return value is ignored */ +} + +static void +_swap_ximage_2bytes (XImage *ximage) +{ + int i, j; + char *line = ximage->data; + + for (j = ximage->height; j; j--) { + uint16_t *p = (uint16_t *) line; + for (i = ximage->width; i; i--) { + *p = bswap_16 (*p); + p++; + } + + line += ximage->bytes_per_line; + } +} + +static void +_swap_ximage_3bytes (XImage *ximage) +{ + int i, j; + char *line = ximage->data; + + for (j = ximage->height; j; j--) { + uint8_t *p = (uint8_t *) line; + for (i = ximage->width; i; i--) { + uint8_t tmp; + tmp = p[2]; + p[2] = p[0]; + p[0] = tmp; + p += 3; + } + + line += ximage->bytes_per_line; + } +} + +static void +_swap_ximage_4bytes (XImage *ximage) +{ + int i, j; + char *line = ximage->data; + + for (j = ximage->height; j; j--) { + uint32_t *p = (uint32_t *) line; + for (i = ximage->width; i; i--) { + *p = bswap_32 (*p); + p++; + } + + line += ximage->bytes_per_line; + } +} + +static void +_swap_ximage_nibbles (XImage *ximage) +{ + int i, j; + char *line = ximage->data; + + for (j = ximage->height; j; j--) { + uint8_t *p = (uint8_t *) line; + for (i = (ximage->width + 1) / 2; i; i--) { + *p = ((*p >> 4) & 0xf) | ((*p << 4) & ~0xf); + p++; + } + + line += ximage->bytes_per_line; + } +} + +static void +_swap_ximage_bits (XImage *ximage) +{ + int i, j; + char *line = ximage->data; + int unit = ximage->bitmap_unit; + int line_bytes = ((ximage->width + unit - 1) & ~(unit - 1)) / 8; + + for (j = ximage->height; j; j--) { + char *p = line; + + for (i = line_bytes; i; i--) { + char b = *p; + b = ((b << 1) & 0xaa) | ((b >> 1) & 0x55); + b = ((b << 2) & 0xcc) | ((b >> 2) & 0x33); + b = ((b << 4) & 0xf0) | ((b >> 4) & 0x0f); + *p = b; + + p++; + } + + line += ximage->bytes_per_line; + } +} + +static void +_swap_ximage_to_native (XImage *ximage) +{ + int unit_bytes = 0; + int native_byte_order = _cairo_is_little_endian () ? LSBFirst : MSBFirst; + + if (ximage->bits_per_pixel == 1 && + ximage->bitmap_bit_order != native_byte_order) + { + _swap_ximage_bits (ximage); + if (ximage->bitmap_bit_order == ximage->byte_order) + return; + } + + if (ximage->byte_order == native_byte_order) + return; + + switch (ximage->bits_per_pixel) { + case 1: + unit_bytes = ximage->bitmap_unit / 8; + break; + case 4: + _swap_ximage_nibbles (ximage); + /* fall-through */ + case 8: + case 16: + case 20: + case 24: + case 28: + case 30: + case 32: + unit_bytes = (ximage->bits_per_pixel + 7) / 8; + break; + default: + /* This could be hit on some rare but possible cases. */ + ASSERT_NOT_REACHED; + } + + switch (unit_bytes) { + case 1: + break; + case 2: + _swap_ximage_2bytes (ximage); + break; + case 3: + _swap_ximage_3bytes (ximage); + break; + case 4: + _swap_ximage_4bytes (ximage); + break; + default: + ASSERT_NOT_REACHED; + } +} + + +/* Given a mask, (with a single sequence of contiguous 1 bits), return + * the number of 1 bits in 'width' and the number of 0 bits to its + * right in 'shift'. */ +static void +_characterize_field (uint32_t mask, int *width, int *shift) +{ + *width = _cairo_popcount (mask); + /* The final '& 31' is to force a 0 mask to result in 0 shift. */ + *shift = _cairo_popcount ((mask - 1) & ~mask) & 31; +} + +/* Convert a field of 'width' bits to 'new_width' bits with correct + * rounding. */ +static inline uint32_t +_resize_field (uint32_t field, int width, int new_width) +{ + if (width == 0) + return 0; + + if (width >= new_width) { + return field >> (width - new_width); + } else { + uint32_t result = field << (new_width - width); + + while (width < new_width) { + result |= result >> width; + width <<= 1; + } + return result; + } +} + +static inline uint32_t +_adjust_field (uint32_t field, int adjustment) +{ + return MIN (255, MAX(0, (int)field + adjustment)); +} + +/* Given a shifted field value, (described by 'width' and 'shift), + * resize it 8-bits and return that value. + * + * Note that the original field value must not have any non-field bits + * set. + */ +static inline uint32_t +_field_to_8 (uint32_t field, int width, int shift) +{ + return _resize_field (field >> shift, width, 8); +} + +static inline uint32_t +_field_to_8_undither (uint32_t field, int width, int shift, + int dither_adjustment) +{ + return _adjust_field (_field_to_8 (field, width, shift), - dither_adjustment>>width); +} + +/* Given an 8-bit value, convert it to a field of 'width', shift it up + * to 'shift, and return it. */ +static inline uint32_t +_field_from_8 (uint32_t field, int width, int shift) +{ + return _resize_field (field, 8, width) << shift; +} + +static inline uint32_t +_field_from_8_dither (uint32_t field, int width, int shift, + int8_t dither_adjustment) +{ + return _field_from_8 (_adjust_field (field, dither_adjustment>>width), width, shift); +} + +static inline uint32_t +_pseudocolor_from_rgb888_dither (cairo_xlib_visual_info_t *visual_info, + uint32_t r, uint32_t g, uint32_t b, + int8_t dither_adjustment) +{ + if (r == g && g == b) { + dither_adjustment /= RAMP_SIZE; + return visual_info->gray8_to_pseudocolor[_adjust_field (r, dither_adjustment)]; + } else { + dither_adjustment = visual_info->dither8_to_cube[dither_adjustment+128]; + return visual_info->cube_to_pseudocolor[visual_info->field8_to_cube[_adjust_field (r, dither_adjustment)]] + [visual_info->field8_to_cube[_adjust_field (g, dither_adjustment)]] + [visual_info->field8_to_cube[_adjust_field (b, dither_adjustment)]]; + } +} + +static inline uint32_t +_pseudocolor_to_rgb888 (cairo_xlib_visual_info_t *visual_info, + uint32_t pixel) +{ + uint32_t r, g, b; + pixel &= 0xff; + r = visual_info->colors[pixel].r; + g = visual_info->colors[pixel].g; + b = visual_info->colors[pixel].b; + return (r << 16) | + (g << 8) | + (b ); +} + +/* should range from -128 to 127 */ +#define X 16 +static const int8_t dither_pattern[4][4] = { + {-8*X, +0*X, -6*X, +2*X}, + {+4*X, -4*X, +6*X, -2*X}, + {-5*X, +4*X, -7*X, +1*X}, + {+7*X, -1*X, +5*X, -3*X} +}; +#undef X + +static int bits_per_pixel(cairo_xlib_surface_t *surface) +{ + if (surface->depth > 16) + return 32; + else if (surface->depth > 8) + return 16; + else if (surface->depth > 1) + return 8; + else + return 1; +} + +pixman_format_code_t +_pixman_format_for_xlib_surface (cairo_xlib_surface_t *surface) +{ + cairo_format_masks_t masks; + pixman_format_code_t format; + + masks.bpp = bits_per_pixel (surface); + masks.alpha_mask = surface->a_mask; + masks.red_mask = surface->r_mask; + masks.green_mask = surface->g_mask; + masks.blue_mask = surface->b_mask; + if (! _pixman_format_from_masks (&masks, &format)) + return 0; + + return format; +} + +static cairo_surface_t * +_get_image_surface (cairo_xlib_surface_t *surface, + const cairo_rectangle_int_t *extents, + int try_shm) +{ + cairo_int_status_t status; + cairo_image_surface_t *image = NULL; + XImage *ximage; + pixman_format_code_t pixman_format; + cairo_xlib_display_t *display; + + assert (extents->x >= 0); + assert (extents->y >= 0); + assert (extents->x + extents->width <= surface->width); + assert (extents->y + extents->height <= surface->height); + + if (surface->base.is_clear || + (surface->base.serial == 0 && surface->owns_pixmap)) + { + pixman_format = _pixman_format_for_xlib_surface (surface); + if (pixman_format) + { + return _cairo_image_surface_create_with_pixman_format (NULL, + pixman_format, + extents->width, + extents->height, + 0); + } + } + + if (surface->shm) { + cairo_image_surface_t *src = (cairo_image_surface_t *) surface->shm; + cairo_surface_t *dst; + cairo_surface_pattern_t pattern; + + dst = cairo_image_surface_create (src->format, + extents->width, extents->height); + if (unlikely (dst->status)) + return dst; + + _cairo_pattern_init_for_surface (&pattern, &src->base); + cairo_matrix_init_translate (&pattern.base.matrix, + extents->x, extents->y); + status = _cairo_surface_paint (dst, CAIRO_OPERATOR_SOURCE, &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + if (unlikely (status)) { + cairo_surface_destroy (dst); + dst = _cairo_surface_create_in_error (status); + } + + return dst; + } + + status = _cairo_xlib_display_acquire (surface->base.device, &display); + if (status) + return _cairo_surface_create_in_error (status); + + pixman_format = _pixman_format_for_xlib_surface (surface); + if (try_shm && pixman_format) { + image = (cairo_image_surface_t *) + _cairo_xlib_surface_create_shm__image (surface, pixman_format, + extents->width, extents->height); + if (image && image->base.status == CAIRO_STATUS_SUCCESS) { + cairo_xlib_error_func_t old_handler; + XImage shm_image; + Bool success; + + _cairo_xlib_shm_surface_get_ximage (&image->base, &shm_image); + + old_handler = XSetErrorHandler (_noop_error_handler); + success = XShmGetImage (display->display, + surface->drawable, + &shm_image, + extents->x, extents->y, + AllPlanes); + XSetErrorHandler (old_handler); + + if (success) { + cairo_device_release (&display->base); + return &image->base; + } + + cairo_surface_destroy (&image->base); + } + } + + if (surface->use_pixmap == 0) { + cairo_xlib_error_func_t old_handler; + + old_handler = XSetErrorHandler (_noop_error_handler); + + ximage = XGetImage (display->display, + surface->drawable, + extents->x, extents->y, + extents->width, extents->height, + AllPlanes, ZPixmap); + + XSetErrorHandler (old_handler); + + /* If we get an error, the surface must have been a window, + * so retry with the safe code path. + */ + if (!ximage) + surface->use_pixmap = CAIRO_ASSUME_PIXMAP; + } else { + surface->use_pixmap--; + ximage = NULL; + } + + if (ximage == NULL) { + /* XGetImage from a window is dangerous because it can + * produce errors if the window is unmapped or partially + * outside the screen. We could check for errors and + * retry, but to keep things simple, we just create a + * temporary pixmap + */ + Pixmap pixmap; + GC gc; + + status = _cairo_xlib_surface_get_gc (display, surface, &gc); + if (unlikely (status)) + goto BAIL; + + pixmap = XCreatePixmap (display->display, + surface->drawable, + extents->width, extents->height, + surface->depth); + if (pixmap) { + XGCValues gcv; + + gcv.subwindow_mode = IncludeInferiors; + XChangeGC (display->display, gc, GCSubwindowMode, &gcv); + + XCopyArea (display->display, surface->drawable, pixmap, gc, + extents->x, extents->y, + extents->width, extents->height, + 0, 0); + + gcv.subwindow_mode = ClipByChildren; + XChangeGC (display->display, gc, GCSubwindowMode, &gcv); + + ximage = XGetImage (display->display, + pixmap, + 0, 0, + extents->width, extents->height, + AllPlanes, ZPixmap); + + XFreePixmap (display->display, pixmap); + } + + _cairo_xlib_surface_put_gc (display, surface, gc); + + if (ximage == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + } + + _swap_ximage_to_native (ximage); + + /* We can't use pixman to simply write to image if: + * (a) the pixels are not appropriately aligned, + * (b) pixman does not the pixel format, or + * (c) if the image is palettized and we need to convert. + */ + if (pixman_format && + ximage->bitmap_unit == 32 && ximage->bitmap_pad == 32 && + (surface->visual == NULL || surface->visual->class == TrueColor)) + { + image = (cairo_image_surface_t*) + _cairo_image_surface_create_with_pixman_format ((unsigned char *) ximage->data, + pixman_format, + ximage->width, + ximage->height, + ximage->bytes_per_line); + status = image->base.status; + if (unlikely (status)) + goto BAIL; + + /* Let the surface take ownership of the data */ + _cairo_image_surface_assume_ownership_of_data (image); + ximage->data = NULL; + } else { + /* The visual we are dealing with is not supported by the + * standard pixman formats. So we must first convert the data + * to a supported format. */ + + cairo_format_t format; + unsigned char *data; + uint32_t *row; + uint32_t in_pixel, out_pixel; + unsigned int rowstride; + uint32_t a_mask=0, r_mask=0, g_mask=0, b_mask=0; + int a_width=0, r_width=0, g_width=0, b_width=0; + int a_shift=0, r_shift=0, g_shift=0, b_shift=0; + int x, y, x0, y0, x_off, y_off; + cairo_xlib_visual_info_t *visual_info = NULL; + + if (surface->visual == NULL || surface->visual->class == TrueColor) { + cairo_bool_t has_alpha; + cairo_bool_t has_color; + + has_alpha = surface->a_mask; + has_color = (surface->r_mask || + surface->g_mask || + surface->b_mask); + + if (has_color) { + if (has_alpha) { + format = CAIRO_FORMAT_ARGB32; + } else { + format = CAIRO_FORMAT_RGB24; + } + } else { + /* XXX: Using CAIRO_FORMAT_A8 here would be more + * efficient, but would require slightly different code in + * the image conversion to put the alpha channel values + * into the right place. */ + format = CAIRO_FORMAT_ARGB32; + } + + a_mask = surface->a_mask; + r_mask = surface->r_mask; + g_mask = surface->g_mask; + b_mask = surface->b_mask; + + _characterize_field (a_mask, &a_width, &a_shift); + _characterize_field (r_mask, &r_width, &r_shift); + _characterize_field (g_mask, &g_width, &g_shift); + _characterize_field (b_mask, &b_width, &b_shift); + + } else { + format = CAIRO_FORMAT_RGB24; + + status = _cairo_xlib_screen_get_visual_info (display, + surface->screen, + surface->visual, + &visual_info); + if (unlikely (status)) + goto BAIL; + } + + image = (cairo_image_surface_t *) cairo_image_surface_create + (format, ximage->width, ximage->height); + status = image->base.status; + if (unlikely (status)) + goto BAIL; + + data = cairo_image_surface_get_data (&image->base); + rowstride = cairo_image_surface_get_stride (&image->base) >> 2; + row = (uint32_t *) data; + x0 = extents->x + surface->base.device_transform.x0; + y0 = extents->y + surface->base.device_transform.y0; + for (y = 0, y_off = y0 % ARRAY_LENGTH (dither_pattern); + y < ximage->height; + y++, y_off = (y_off+1) % ARRAY_LENGTH (dither_pattern)) { + const int8_t *dither_row = dither_pattern[y_off]; + for (x = 0, x_off = x0 % ARRAY_LENGTH (dither_pattern[0]); + x < ximage->width; + x++, x_off = (x_off+1) % ARRAY_LENGTH (dither_pattern[0])) { + int dither_adjustment = dither_row[x_off]; + + in_pixel = XGetPixel (ximage, x, y); + if (visual_info == NULL) { + out_pixel = ( + _field_to_8 (in_pixel & a_mask, a_width, a_shift) << 24 | + _field_to_8_undither (in_pixel & r_mask, r_width, r_shift, dither_adjustment) << 16 | + _field_to_8_undither (in_pixel & g_mask, g_width, g_shift, dither_adjustment) << 8 | + _field_to_8_undither (in_pixel & b_mask, b_width, b_shift, dither_adjustment)); + } else { + /* Undithering pseudocolor does not look better */ + out_pixel = _pseudocolor_to_rgb888 (visual_info, in_pixel); + } + row[x] = out_pixel; + } + row += rowstride; + } + cairo_surface_mark_dirty (&image->base); + } + + BAIL: + if (ximage) + XDestroyImage (ximage); + + cairo_device_release (&display->base); + + if (unlikely (status)) { + cairo_surface_destroy (&image->base); + return _cairo_surface_create_in_error (status); + } + + return &image->base; +} + +void +_cairo_xlib_surface_set_precision (cairo_xlib_surface_t *surface, + cairo_antialias_t antialias) +{ + cairo_xlib_display_t *display = surface->display; + int precision; + + if (display->force_precision != -1) + precision = display->force_precision; + else switch (antialias) { + default: + case CAIRO_ANTIALIAS_DEFAULT: + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_NONE: + case CAIRO_ANTIALIAS_FAST: + case CAIRO_ANTIALIAS_GOOD: + precision = PolyModeImprecise; + break; + case CAIRO_ANTIALIAS_BEST: + case CAIRO_ANTIALIAS_SUBPIXEL: + precision = PolyModePrecise; + break; + } + + if (surface->precision != precision) { + XRenderPictureAttributes pa; + + pa.poly_mode = precision; + XRenderChangePicture (display->display, surface->picture, + CPPolyMode, &pa); + + surface->precision = precision; + } +} + +void +_cairo_xlib_surface_ensure_picture (cairo_xlib_surface_t *surface) +{ + cairo_xlib_display_t *display = surface->display; + XRenderPictureAttributes pa; + int mask = 0; + + if (surface->picture) + return; + + if (display->force_precision != -1) + pa.poly_mode = display->force_precision; + else + pa.poly_mode = PolyModeImprecise; + if (pa.poly_mode) + mask |= CPPolyMode; + + surface->precision = pa.poly_mode; + surface->picture = XRenderCreatePicture (display->display, + surface->drawable, + surface->xrender_format, + mask, &pa); +} + +cairo_status_t +_cairo_xlib_surface_draw_image (cairo_xlib_surface_t *surface, + cairo_image_surface_t *image, + int src_x, + int src_y, + int width, + int height, + int dst_x, + int dst_y) +{ + cairo_xlib_display_t *display; + XImage ximage; + cairo_format_masks_t image_masks; + int native_byte_order = _cairo_is_little_endian () ? LSBFirst : MSBFirst; + cairo_surface_t *shm_image = NULL; + pixman_image_t *pixman_image = NULL; + cairo_status_t status; + cairo_bool_t own_data = FALSE; + cairo_bool_t is_rgb_image; + GC gc; + + ximage.width = image->width; + ximage.height = image->height; + ximage.format = ZPixmap; + ximage.byte_order = native_byte_order; + ximage.bitmap_unit = 32; /* always for libpixman */ + ximage.bitmap_bit_order = native_byte_order; + ximage.bitmap_pad = 32; /* always for libpixman */ + ximage.depth = surface->depth; + ximage.red_mask = surface->r_mask; + ximage.green_mask = surface->g_mask; + ximage.blue_mask = surface->b_mask; + ximage.xoffset = 0; + ximage.obdata = NULL; + + status = _cairo_xlib_display_acquire (surface->base.device, &display); + if (unlikely (status)) + return status; + + is_rgb_image = _pixman_format_to_masks (image->pixman_format, &image_masks); + + if (is_rgb_image && + (image_masks.alpha_mask == surface->a_mask || surface->a_mask == 0) && + (image_masks.red_mask == surface->r_mask || surface->r_mask == 0) && + (image_masks.green_mask == surface->g_mask || surface->g_mask == 0) && + (image_masks.blue_mask == surface->b_mask || surface->b_mask == 0)) + { + int ret; + + ximage.bits_per_pixel = image_masks.bpp; + ximage.bytes_per_line = image->stride; + ximage.data = (char *)image->data; + if (image->base.device != surface->base.device) { + /* If PutImage will break the image up into chunks, prefer to + * send it all in one pass with ShmPutImage. For larger images, + * it is further advantageous to reduce the number of copies, + * albeit at the expense of more SHM bookkeeping. + */ + int max_request_size = XExtendedMaxRequestSize (display->display); + if (max_request_size == 0) + max_request_size = XMaxRequestSize (display->display); + if (max_request_size > 8192) + max_request_size = 8192; + if (width * height * 4 > max_request_size) { + shm_image = _cairo_xlib_surface_create_shm__image (surface, + image->pixman_format, + width, height); + if (shm_image && shm_image->status == CAIRO_STATUS_SUCCESS) { + cairo_image_surface_t *clone = (cairo_image_surface_t *) shm_image; + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, NULL, clone->pixman_image, + src_x, src_y, + 0, 0, + 0, 0, + width, height); + ximage.obdata = _cairo_xlib_shm_surface_get_obdata (shm_image); + ximage.data = (char *)clone->data; + ximage.bytes_per_line = clone->stride; + ximage.width = width; + ximage.height = height; + src_x = src_y = 0; + } + } + } else + ximage.obdata = _cairo_xlib_shm_surface_get_obdata (&image->base); + + ret = XInitImage (&ximage); + assert (ret != 0); + } + else if (surface->visual == NULL || surface->visual->class == TrueColor) + { + pixman_format_code_t intermediate_format; + int ret; + + image_masks.alpha_mask = surface->a_mask; + image_masks.red_mask = surface->r_mask; + image_masks.green_mask = surface->g_mask; + image_masks.blue_mask = surface->b_mask; + image_masks.bpp = bits_per_pixel (surface); + ret = _pixman_format_from_masks (&image_masks, &intermediate_format); + assert (ret); + + shm_image = _cairo_xlib_surface_create_shm__image (surface, + intermediate_format, + width, height); + if (shm_image && shm_image->status == CAIRO_STATUS_SUCCESS) { + cairo_image_surface_t *clone = (cairo_image_surface_t *) shm_image; + + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, + NULL, + clone->pixman_image, + src_x, src_y, + 0, 0, + 0, 0, + width, height); + + ximage.data = (char *) clone->data; + ximage.obdata = _cairo_xlib_shm_surface_get_obdata (&clone->base); + ximage.bytes_per_line = clone->stride; + } else { + pixman_image = pixman_image_create_bits (intermediate_format, + width, height, NULL, 0); + if (pixman_image == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, + NULL, + pixman_image, + src_x, src_y, + 0, 0, + 0, 0, + width, height); + + ximage.data = (char *) pixman_image_get_data (pixman_image); + ximage.bytes_per_line = pixman_image_get_stride (pixman_image); + } + + ximage.width = width; + ximage.height = height; + ximage.bits_per_pixel = image_masks.bpp; + + ret = XInitImage (&ximage); + assert (ret != 0); + + src_x = src_y = 0; + } + else + { + unsigned int stride, rowstride; + int x, y, x0, y0, x_off, y_off; + uint32_t in_pixel, out_pixel, *row; + int i_a_width=0, i_r_width=0, i_g_width=0, i_b_width=0; + int i_a_shift=0, i_r_shift=0, i_g_shift=0, i_b_shift=0; + int o_a_width=0, o_r_width=0, o_g_width=0, o_b_width=0; + int o_a_shift=0, o_r_shift=0, o_g_shift=0, o_b_shift=0; + cairo_xlib_visual_info_t *visual_info = NULL; + cairo_bool_t true_color; + int ret; + + ximage.bits_per_pixel = bits_per_pixel(surface); + stride = CAIRO_STRIDE_FOR_WIDTH_BPP (ximage.width, + ximage.bits_per_pixel); + ximage.bytes_per_line = stride; + ximage.data = _cairo_malloc_ab (stride, ximage.height); + if (unlikely (ximage.data == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto BAIL; + } + + own_data = TRUE; + + ret = XInitImage (&ximage); + assert (ret != 0); + + _characterize_field (image_masks.alpha_mask, &i_a_width, &i_a_shift); + _characterize_field (image_masks.red_mask , &i_r_width, &i_r_shift); + _characterize_field (image_masks.green_mask, &i_g_width, &i_g_shift); + _characterize_field (image_masks.blue_mask , &i_b_width, &i_b_shift); + + true_color = surface->visual == NULL || + surface->visual->class == TrueColor; + if (true_color) { + _characterize_field (surface->a_mask, &o_a_width, &o_a_shift); + _characterize_field (surface->r_mask, &o_r_width, &o_r_shift); + _characterize_field (surface->g_mask, &o_g_width, &o_g_shift); + _characterize_field (surface->b_mask, &o_b_width, &o_b_shift); + } else { + status = _cairo_xlib_screen_get_visual_info (display, + surface->screen, + surface->visual, + &visual_info); + if (unlikely (status)) + goto BAIL; + } + + rowstride = image->stride >> 2; + row = (uint32_t *) image->data; + x0 = dst_x + surface->base.device_transform.x0; + y0 = dst_y + surface->base.device_transform.y0; + for (y = 0, y_off = y0 % ARRAY_LENGTH (dither_pattern); + y < ximage.height; + y++, y_off = (y_off+1) % ARRAY_LENGTH (dither_pattern)) + { + const int8_t *dither_row = dither_pattern[y_off]; + + for (x = 0, x_off = x0 % ARRAY_LENGTH (dither_pattern[0]); + x < ximage.width; + x++, x_off = (x_off+1) % ARRAY_LENGTH (dither_pattern[0])) + { + int dither_adjustment = dither_row[x_off]; + int a, r, g, b; + + if (image_masks.bpp == 1) + in_pixel = !! (((uint8_t*)row)[x/8] & (1 << (x & 7))); + else if (image_masks.bpp <= 8) + in_pixel = ((uint8_t*)row)[x]; + else if (image_masks.bpp <= 16) + in_pixel = ((uint16_t*)row)[x]; + else if (image_masks.bpp <= 24) +#ifdef WORDS_BIGENDIAN + in_pixel = ((uint8_t*)row)[3 * x] << 16 | + ((uint8_t*)row)[3 * x + 1] << 8 | + ((uint8_t*)row)[3 * x + 2]; +#else + in_pixel = ((uint8_t*)row)[3 * x] | + ((uint8_t*)row)[3 * x + 1] << 8 | + ((uint8_t*)row)[3 * x + 2] << 16; +#endif + else + in_pixel = row[x]; + + /* If the incoming image has no alpha channel, then the input + * is opaque and the output should have the maximum alpha value. + * For all other channels, their absence implies 0. + */ + if (image_masks.alpha_mask == 0x0) + a = 0xff; + else + a = _field_to_8 (in_pixel & image_masks.alpha_mask, i_a_width, i_a_shift); + r = _field_to_8 (in_pixel & image_masks.red_mask , i_r_width, i_r_shift); + g = _field_to_8 (in_pixel & image_masks.green_mask, i_g_width, i_g_shift); + b = _field_to_8 (in_pixel & image_masks.blue_mask , i_b_width, i_b_shift); + + if (true_color) { + out_pixel = _field_from_8 (a, o_a_width, o_a_shift) | + _field_from_8_dither (r, o_r_width, o_r_shift, dither_adjustment) | + _field_from_8_dither (g, o_g_width, o_g_shift, dither_adjustment) | + _field_from_8_dither (b, o_b_width, o_b_shift, dither_adjustment); + } else { + out_pixel = _pseudocolor_from_rgb888_dither (visual_info, r, g, b, dither_adjustment); + } + + XPutPixel (&ximage, x, y, out_pixel); + } + + row += rowstride; + } + } + + status = _cairo_xlib_surface_get_gc (display, surface, &gc); + if (unlikely (status)) + goto BAIL; + + if (ximage.obdata) + XShmPutImage (display->display, surface->drawable, gc, &ximage, + src_x, src_y, dst_x, dst_y, width, height, True); + else + XPutImage (display->display, surface->drawable, gc, &ximage, + src_x, src_y, dst_x, dst_y, width, height); + + _cairo_xlib_surface_put_gc (display, surface, gc); + + BAIL: + cairo_device_release (&display->base); + + if (own_data) + free (ximage.data); + if (shm_image) + cairo_surface_destroy (shm_image); + if (pixman_image) + pixman_image_unref (pixman_image); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_xlib_surface_source(void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_xlib_surface_t *surface = abstract_surface; + + if (extents) { + extents->x = extents->y = 0; + extents->width = surface->width; + extents->height = surface->height; + } + + return &surface->base; +} + +static cairo_status_t +_cairo_xlib_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_xlib_surface_t *surface = abstract_surface; + cairo_rectangle_int_t extents; + + *image_extra = NULL; + *image_out = (cairo_image_surface_t *) + _cairo_xlib_surface_get_shm (abstract_surface, FALSE); + if (*image_out) + return (*image_out)->base.status; + + extents.x = extents.y = 0; + extents.width = surface->width; + extents.height = surface->height; + + *image_out = (cairo_image_surface_t*) + _get_image_surface (surface, &extents, TRUE); + return (*image_out)->base.status; +} + +static cairo_surface_t * +_cairo_xlib_surface_snapshot (void *abstract_surface) +{ + cairo_xlib_surface_t *surface = abstract_surface; + cairo_rectangle_int_t extents; + + extents.x = extents.y = 0; + extents.width = surface->width; + extents.height = surface->height; + + return _get_image_surface (surface, &extents, FALSE); +} + +static void +_cairo_xlib_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_xlib_surface_t *surface = abstract_surface; + + if (&image->base == surface->shm) + return; + + cairo_surface_destroy (&image->base); +} + +static cairo_image_surface_t * +_cairo_xlib_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_xlib_surface_t *surface = abstract_surface; + cairo_surface_t *image; + + image = _cairo_xlib_surface_get_shm (abstract_surface, FALSE); + if (image) { + assert (surface->base.damage); + surface->fallback++; + return _cairo_image_surface_map_to_image (image, extents); + } + + image = _get_image_surface (abstract_surface, extents, TRUE); + cairo_surface_set_device_offset (image, -extents->x, -extents->y); + + return (cairo_image_surface_t *) image; +} + +static cairo_int_status_t +_cairo_xlib_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_xlib_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + if (surface->shm) { + cairo_rectangle_int_t r; + + assert (surface->fallback); + assert (surface->base.damage); + + r.x = image->base.device_transform_inverse.x0; + r.y = image->base.device_transform_inverse.y0; + r.width = image->width; + r.height = image->height; + + TRACE ((stderr, "%s: adding damage (%d,%d)x(%d,%d)\n", + __FUNCTION__, r.x, r.y, r.width, r.height)); + surface->shm->damage = + _cairo_damage_add_rectangle (surface->shm->damage, &r); + + return _cairo_image_surface_unmap_image (surface->shm, image); + } + + status = _cairo_xlib_surface_draw_image (abstract_surface, image, + 0, 0, + image->width, image->height, + image->base.device_transform_inverse.x0, + image->base.device_transform_inverse.y0); + + cairo_surface_finish (&image->base); + cairo_surface_destroy (&image->base); + + return status; +} + +static cairo_status_t +_cairo_xlib_surface_flush (void *abstract_surface, + unsigned flags) +{ + cairo_xlib_surface_t *surface = abstract_surface; + cairo_int_status_t status; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_xlib_surface_put_shm (surface); + if (unlikely (status)) + return status; + + surface->fallback >>= 1; + if (surface->shm && _cairo_xlib_shm_surface_is_idle (surface->shm)) + _cairo_xlib_surface_discard_shm (surface); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_cairo_xlib_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_xlib_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + + rectangle->width = surface->width; + rectangle->height = surface->height; + + return TRUE; +} + +static void +_cairo_xlib_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_xlib_surface_t *surface = abstract_surface; + + *options = *_cairo_xlib_screen_get_font_options (surface->screen); +} + +static inline cairo_int_status_t +get_compositor (cairo_xlib_surface_t **surface, + const cairo_compositor_t **compositor) +{ + cairo_xlib_surface_t *s = *surface; + cairo_int_status_t status = CAIRO_INT_STATUS_SUCCESS;; + + if (s->fallback) { + assert (s->base.damage != NULL); + assert (s->shm != NULL); + assert (s->shm->damage != NULL); + if (! _cairo_xlib_shm_surface_is_active (s->shm)) { + *surface = (cairo_xlib_surface_t *) s->shm; + *compositor = ((cairo_image_surface_t *) s->shm)->compositor; + s->fallback++; + } else { + status = _cairo_xlib_surface_put_shm (s); + s->fallback = 0; + *compositor = s->compositor; + } + } else + *compositor = s->compositor; + + return status; +} + +static cairo_int_status_t +_cairo_xlib_surface_paint (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_xlib_surface_t *surface = _surface; + const cairo_compositor_t *compositor; + cairo_int_status_t status; + + status = get_compositor (&surface, &compositor); + if (unlikely (status)) + return status; + + return _cairo_compositor_paint (compositor, &surface->base, + op, source, + clip); +} + +static cairo_int_status_t +_cairo_xlib_surface_mask (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_xlib_surface_t *surface = _surface; + const cairo_compositor_t *compositor; + cairo_int_status_t status; + + status = get_compositor (&surface, &compositor); + if (unlikely (status)) + return status; + + return _cairo_compositor_mask (compositor, &surface->base, + op, source, mask, + clip); +} + +static cairo_int_status_t +_cairo_xlib_surface_stroke (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_xlib_surface_t *surface = _surface; + const cairo_compositor_t *compositor; + cairo_int_status_t status; + + status = get_compositor (&surface, &compositor); + if (unlikely (status)) + return status; + + return _cairo_compositor_stroke (compositor, &surface->base, + op, source, + path, style, ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_xlib_surface_fill (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_xlib_surface_t *surface = _surface; + const cairo_compositor_t *compositor; + cairo_int_status_t status; + + status = get_compositor (&surface, &compositor); + if (unlikely (status)) + return status; + + return _cairo_compositor_fill (compositor, &surface->base, + op, source, + path, fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_xlib_surface_glyphs (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_xlib_surface_t *surface = _surface; + const cairo_compositor_t *compositor; + cairo_int_status_t status; + + status = get_compositor (&surface, &compositor); + if (unlikely (status)) + return status; + + return _cairo_compositor_glyphs (compositor, &surface->base, + op, source, + glyphs, num_glyphs, scaled_font, + clip); +} + +static const cairo_surface_backend_t cairo_xlib_surface_backend = { + CAIRO_SURFACE_TYPE_XLIB, + _cairo_xlib_surface_finish, + + _cairo_default_context_create, + + _cairo_xlib_surface_create_similar, + _cairo_xlib_surface_create_similar_shm, + _cairo_xlib_surface_map_to_image, + _cairo_xlib_surface_unmap_image, + + _cairo_xlib_surface_source, + _cairo_xlib_surface_acquire_source_image, + _cairo_xlib_surface_release_source_image, + _cairo_xlib_surface_snapshot, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_xlib_surface_get_extents, + _cairo_xlib_surface_get_font_options, + + _cairo_xlib_surface_flush, + NULL, /* mark_dirty_rectangle */ + + _cairo_xlib_surface_paint, + _cairo_xlib_surface_mask, + _cairo_xlib_surface_stroke, + _cairo_xlib_surface_fill, + NULL, /* fill-stroke */ + _cairo_xlib_surface_glyphs, +}; + +/** + * _cairo_surface_is_xlib: + * @surface: a #cairo_surface_t + * + * Checks if a surface is a #cairo_xlib_surface_t + * + * Return value: True if the surface is an xlib surface + **/ +static cairo_bool_t +_cairo_surface_is_xlib (cairo_surface_t *surface) +{ + return surface->backend == &cairo_xlib_surface_backend; +} + +static cairo_surface_t * +_cairo_xlib_surface_create_internal (cairo_xlib_screen_t *screen, + Drawable drawable, + Visual *visual, + XRenderPictFormat *xrender_format, + int width, + int height, + int depth) +{ + cairo_xlib_surface_t *surface; + cairo_xlib_display_t *display; + cairo_status_t status; + + if (depth == 0) { + if (xrender_format) { + depth = xrender_format->depth; + + /* XXX find matching visual for core/dithering fallbacks? */ + } else if (visual) { + Screen *scr = screen->screen; + + if (visual == DefaultVisualOfScreen (scr)) { + depth = DefaultDepthOfScreen (scr); + } else { + int j, k; + + /* This is ugly, but we have to walk over all visuals + * for the display to find the correct depth. + */ + depth = 0; + for (j = 0; j < scr->ndepths; j++) { + Depth *d = &scr->depths[j]; + for (k = 0; k < d->nvisuals; k++) { + if (&d->visuals[k] == visual) { + depth = d->depth; + goto found; + } + } + } + } + } + + if (depth == 0) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL)); + +found: + ; + } + + surface = malloc (sizeof (cairo_xlib_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + status = _cairo_xlib_display_acquire (screen->device, &display); + if (unlikely (status)) { + free (surface); + return _cairo_surface_create_in_error (_cairo_error (status)); + } + + surface->display = display; + if (CAIRO_RENDER_HAS_CREATE_PICTURE (display)) { + if (!xrender_format) { + if (visual) { + xrender_format = XRenderFindVisualFormat (display->display, visual); + } else if (depth == 1) { + xrender_format = + _cairo_xlib_display_get_xrender_format (display, + CAIRO_FORMAT_A1); + } + } + } + + cairo_device_release (&display->base); + + _cairo_surface_init (&surface->base, + &cairo_xlib_surface_backend, + screen->device, + _xrender_format_to_content (xrender_format)); + + surface->screen = screen; + surface->compositor = display->compositor; + surface->shm = NULL; + surface->fallback = 0; + + surface->drawable = drawable; + surface->owns_pixmap = FALSE; + surface->use_pixmap = 0; + surface->width = width; + surface->height = height; + + surface->picture = None; + surface->precision = PolyModePrecise; + + surface->embedded_source.picture = None; + + surface->visual = visual; + surface->xrender_format = xrender_format; + surface->depth = depth; + + /* + * Compute the pixel format masks from either a XrenderFormat or + * else from a visual; failing that we assume the drawable is an + * alpha-only pixmap as it could only have been created that way + * through the cairo_xlib_surface_create_for_bitmap function. + */ + if (xrender_format) { + surface->a_mask = (unsigned long) + surface->xrender_format->direct.alphaMask + << surface->xrender_format->direct.alpha; + surface->r_mask = (unsigned long) + surface->xrender_format->direct.redMask + << surface->xrender_format->direct.red; + surface->g_mask = (unsigned long) + surface->xrender_format->direct.greenMask + << surface->xrender_format->direct.green; + surface->b_mask = (unsigned long) + surface->xrender_format->direct.blueMask + << surface->xrender_format->direct.blue; + } else if (visual) { + surface->a_mask = 0; + surface->r_mask = visual->red_mask; + surface->g_mask = visual->green_mask; + surface->b_mask = visual->blue_mask; + } else { + if (depth < 32) + surface->a_mask = (1 << depth) - 1; + else + surface->a_mask = 0xffffffff; + surface->r_mask = 0; + surface->g_mask = 0; + surface->b_mask = 0; + } + + cairo_list_add (&surface->link, &screen->surfaces); + + return &surface->base; +} + +static Screen * +_cairo_xlib_screen_from_visual (Display *dpy, Visual *visual) +{ + int s, d, v; + + for (s = 0; s < ScreenCount (dpy); s++) { + Screen *screen; + + screen = ScreenOfDisplay (dpy, s); + if (visual == DefaultVisualOfScreen (screen)) + return screen; + + for (d = 0; d < screen->ndepths; d++) { + Depth *depth; + + depth = &screen->depths[d]; + for (v = 0; v < depth->nvisuals; v++) + if (visual == &depth->visuals[v]) + return screen; + } + } + + return NULL; +} + +static cairo_bool_t valid_size (int width, int height) +{ + /* Note: the minimum surface size allowed in the X protocol is 1x1. + * However, as we historically did not check the minimum size we + * allowed applications to lie and set the correct size later (one hopes). + * To preserve compatability we must allow applications to use + * 0x0 surfaces. + */ + return (width >= 0 && width <= XLIB_COORD_MAX && + height >= 0 && height <= XLIB_COORD_MAX); +} + +/** + * cairo_xlib_surface_create: + * @dpy: an X Display + * @drawable: an X Drawable, (a Pixmap or a Window) + * @visual: the visual to use for drawing to @drawable. The depth + * of the visual must match the depth of the drawable. + * Currently, only TrueColor visuals are fully supported. + * @width: the current width of @drawable. + * @height: the current height of @drawable. + * + * Creates an Xlib surface that draws to the given drawable. + * The way that colors are represented in the drawable is specified + * by the provided visual. + * + * Note: If @drawable is a Window, then the function + * cairo_xlib_surface_set_size() must be called whenever the size of the + * window changes. + * + * When @drawable is a Window containing child windows then drawing to + * the created surface will be clipped by those child windows. When + * the created surface is used as a source, the contents of the + * children will be included. + * + * Return value: the newly created surface + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_xlib_surface_create (Display *dpy, + Drawable drawable, + Visual *visual, + int width, + int height) +{ + Screen *scr; + cairo_xlib_screen_t *screen; + cairo_status_t status; + + if (! valid_size (width, height)) { + /* you're lying, and you know it! */ + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + scr = _cairo_xlib_screen_from_visual (dpy, visual); + if (scr == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL)); + + status = _cairo_xlib_screen_get (dpy, scr, &screen); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + X_DEBUG ((dpy, "create (drawable=%x)", (unsigned int) drawable)); + + return _cairo_xlib_surface_create_internal (screen, drawable, + visual, NULL, + width, height, 0); +} + +/** + * cairo_xlib_surface_create_for_bitmap: + * @dpy: an X Display + * @bitmap: an X Drawable, (a depth-1 Pixmap) + * @screen: the X Screen associated with @bitmap + * @width: the current width of @bitmap. + * @height: the current height of @bitmap. + * + * Creates an Xlib surface that draws to the given bitmap. + * This will be drawn to as a %CAIRO_FORMAT_A1 object. + * + * Return value: the newly created surface + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_xlib_surface_create_for_bitmap (Display *dpy, + Pixmap bitmap, + Screen *scr, + int width, + int height) +{ + cairo_xlib_screen_t *screen; + cairo_status_t status; + + if (! valid_size (width, height)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + status = _cairo_xlib_screen_get (dpy, scr, &screen); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + X_DEBUG ((dpy, "create_for_bitmap (drawable=%x)", (unsigned int) bitmap)); + + return _cairo_xlib_surface_create_internal (screen, bitmap, + NULL, NULL, + width, height, 1); +} + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +/** + * cairo_xlib_surface_create_with_xrender_format: + * @dpy: an X Display + * @drawable: an X Drawable, (a Pixmap or a Window) + * @screen: the X Screen associated with @drawable + * @format: the picture format to use for drawing to @drawable. The depth + * of @format must match the depth of the drawable. + * @width: the current width of @drawable. + * @height: the current height of @drawable. + * + * Creates an Xlib surface that draws to the given drawable. + * The way that colors are represented in the drawable is specified + * by the provided picture format. + * + * Note: If @drawable is a Window, then the function + * cairo_xlib_surface_set_size() must be called whenever the size of the + * window changes. + * + * Return value: the newly created surface + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_xlib_surface_create_with_xrender_format (Display *dpy, + Drawable drawable, + Screen *scr, + XRenderPictFormat *format, + int width, + int height) +{ + cairo_xlib_screen_t *screen; + cairo_status_t status; + + if (! valid_size (width, height)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + status = _cairo_xlib_screen_get (dpy, scr, &screen); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + X_DEBUG ((dpy, "create_with_xrender_format (drawable=%x)", (unsigned int) drawable)); + + return _cairo_xlib_surface_create_internal (screen, drawable, + _visual_for_xrender_format (scr, format), + format, width, height, 0); +} + +/** + * cairo_xlib_surface_get_xrender_format: + * @surface: an xlib surface + * + * Gets the X Render picture format that @surface uses for rendering with the + * X Render extension. If the surface was created by + * cairo_xlib_surface_create_with_xrender_format() originally, the return + * value is the format passed to that constructor. + * + * Return value: the XRenderPictFormat* associated with @surface, + * or %NULL if the surface is not an xlib surface + * or if the X Render extension is not available. + * + * Since: 1.6 + **/ +XRenderPictFormat * +cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface) +{ + cairo_xlib_surface_t *xlib_surface = (cairo_xlib_surface_t *) surface; + + /* Throw an error for a non-xlib surface */ + if (! _cairo_surface_is_xlib (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return xlib_surface->xrender_format; +} +#endif + +/** + * cairo_xlib_surface_set_size: + * @surface: a #cairo_surface_t for the XLib backend + * @width: the new width of the surface + * @height: the new height of the surface + * + * Informs cairo of the new size of the X Drawable underlying the + * surface. For a surface created for a Window (rather than a Pixmap), + * this function must be called each time the size of the window + * changes. (For a subwindow, you are normally resizing the window + * yourself, but for a toplevel window, it is necessary to listen for + * ConfigureNotify events.) + * + * A Pixmap can never change size, so it is never necessary to call + * this function on a surface created for a Pixmap. + * + * Since: 1.0 + **/ +void +cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface, + int width, + int height) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + cairo_status_t status; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + if (surface->width == width && surface->height == height) + return; + + if (! valid_size (width, height)) { + _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_SIZE)); + return; + } + + status = _cairo_surface_flush (abstract_surface, 0); + if (unlikely (status)) { + _cairo_surface_set_error (abstract_surface, status); + return; + } + + _cairo_xlib_surface_discard_shm (surface); + + surface->width = width; + surface->height = height; +} + +/** + * cairo_xlib_surface_set_drawable: + * @surface: a #cairo_surface_t for the XLib backend + * @drawable: the new drawable for the surface + * @width: the width of the new drawable + * @height: the height of the new drawable + * + * Informs cairo of a new X Drawable underlying the + * surface. The drawable must match the display, screen + * and format of the existing drawable or the application + * will get X protocol errors and will probably terminate. + * No checks are done by this function to ensure this + * compatibility. + * + * Since: 1.0 + **/ +void +cairo_xlib_surface_set_drawable (cairo_surface_t *abstract_surface, + Drawable drawable, + int width, + int height) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *)abstract_surface; + cairo_status_t status; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (! _cairo_surface_is_xlib (abstract_surface)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + return; + } + + if (! valid_size (width, height)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_INVALID_SIZE)); + return; + } + + /* XXX: and what about this case? */ + if (surface->owns_pixmap) + return; + + status = _cairo_surface_flush (abstract_surface, 0); + if (unlikely (status)) { + _cairo_surface_set_error (abstract_surface, status); + return; + } + + if (surface->drawable != drawable) { + cairo_xlib_display_t *display; + + status = _cairo_xlib_display_acquire (surface->base.device, &display); + if (unlikely (status)) + return; + + X_DEBUG ((display->display, "set_drawable (drawable=%x)", (unsigned int) drawable)); + + if (surface->picture != None) { + XRenderFreePicture (display->display, surface->picture); + if (unlikely (status)) { + status = _cairo_surface_set_error (&surface->base, status); + return; + } + + surface->picture = None; + } + + cairo_device_release (&display->base); + + surface->drawable = drawable; + } + + if (surface->width != width || surface->height != height) { + _cairo_xlib_surface_discard_shm (surface); + + surface->width = width; + surface->height = height; + } +} + +/** + * cairo_xlib_surface_get_display: + * @surface: a #cairo_xlib_surface_t + * + * Get the X Display for the underlying X Drawable. + * + * Return value: the display. + * + * Since: 1.2 + **/ +Display * +cairo_xlib_surface_get_display (cairo_surface_t *abstract_surface) +{ + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return ((cairo_xlib_display_t *) abstract_surface->device)->display; +} + +/** + * cairo_xlib_surface_get_drawable: + * @surface: a #cairo_xlib_surface_t + * + * Get the underlying X Drawable used for the surface. + * + * Return value: the drawable. + * + * Since: 1.2 + **/ +Drawable +cairo_xlib_surface_get_drawable (cairo_surface_t *abstract_surface) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->drawable; +} + +/** + * cairo_xlib_surface_get_screen: + * @surface: a #cairo_xlib_surface_t + * + * Get the X Screen for the underlying X Drawable. + * + * Return value: the screen. + * + * Since: 1.2 + **/ +Screen * +cairo_xlib_surface_get_screen (cairo_surface_t *abstract_surface) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return surface->screen->screen; +} + +/** + * cairo_xlib_surface_get_visual: + * @surface: a #cairo_xlib_surface_t + * + * Gets the X Visual associated with @surface, suitable for use with the + * underlying X Drawable. If @surface was created by + * cairo_xlib_surface_create(), the return value is the Visual passed to that + * constructor. + * + * Return value: the Visual or %NULL if there is no appropriate Visual for + * @surface. + * + * Since: 1.2 + **/ +Visual * +cairo_xlib_surface_get_visual (cairo_surface_t *surface) +{ + cairo_xlib_surface_t *xlib_surface = (cairo_xlib_surface_t *) surface; + + if (! _cairo_surface_is_xlib (surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return xlib_surface->visual; +} + +/** + * cairo_xlib_surface_get_depth: + * @surface: a #cairo_xlib_surface_t + * + * Get the number of bits used to represent each pixel value. + * + * Return value: the depth of the surface in bits. + * + * Since: 1.2 + **/ +int +cairo_xlib_surface_get_depth (cairo_surface_t *abstract_surface) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->depth; +} + +/** + * cairo_xlib_surface_get_width: + * @surface: a #cairo_xlib_surface_t + * + * Get the width of the X Drawable underlying the surface in pixels. + * + * Return value: the width of the surface in pixels. + * + * Since: 1.2 + **/ +int +cairo_xlib_surface_get_width (cairo_surface_t *abstract_surface) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->width; +} + +/** + * cairo_xlib_surface_get_height: + * @surface: a #cairo_xlib_surface_t + * + * Get the height of the X Drawable underlying the surface in pixels. + * + * Return value: the height of the surface in pixels. + * + * Since: 1.2 + **/ +int +cairo_xlib_surface_get_height (cairo_surface_t *abstract_surface) +{ + cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; + + if (! _cairo_surface_is_xlib (abstract_surface)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->height; +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-visual.c b/src/cairo-xlib-visual.c new file mode 100644 index 000000000..863822eeb --- /dev/null +++ b/src/cairo-xlib-visual.c @@ -0,0 +1,194 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#include "cairoint.h" + +#if !CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib-private.h" + +#include "cairo-error-private.h" +#include "cairo-list-inline.h" + +/* A perceptual distance metric between two colors. No sqrt needed + * since the square of the distance is still a valid metric. */ + +/* XXX: This is currently using linear distance in RGB space which is + * decidedly not perceptually linear. If someone cared a lot about the + * quality, they might choose something else here. Then again, they + * might also choose not to use a PseudoColor visual... */ +static inline int +_color_distance (unsigned short r1, unsigned short g1, unsigned short b1, + unsigned short r2, unsigned short g2, unsigned short b2) +{ + r1 >>= 8; g1 >>= 8; b1 >>= 8; + r2 >>= 8; g2 >>= 8; b2 >>= 8; + + return ((r2 - r1) * (r2 - r1) + + (g2 - g1) * (g2 - g1) + + (b2 - b1) * (b2 - b1)); +} + +cairo_status_t +_cairo_xlib_visual_info_create (Display *dpy, + int screen, + VisualID visualid, + cairo_xlib_visual_info_t **out) +{ + cairo_xlib_visual_info_t *info; + Colormap colormap = DefaultColormap (dpy, screen); + XColor color; + int gray, red, green, blue; + int i, j, distance, min_distance = 0; + XColor colors[256]; + unsigned short cube_index_to_short[CUBE_SIZE]; + unsigned short ramp_index_to_short[RAMP_SIZE]; + unsigned char gray_to_pseudocolor[RAMP_SIZE]; + + for (i = 0; i < CUBE_SIZE; i++) + cube_index_to_short[i] = (0xffff * i + ((CUBE_SIZE-1)>>1)) / (CUBE_SIZE-1); + for (i = 0; i < RAMP_SIZE; i++) + ramp_index_to_short[i] = (0xffff * i + ((RAMP_SIZE-1)>>1)) / (RAMP_SIZE-1); + + info = malloc (sizeof (cairo_xlib_visual_info_t)); + if (unlikely (info == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cairo_list_init (&info->link); + info->visualid = visualid; + + /* Allocate a gray ramp and a color cube. + * Give up as soon as failures start. */ + + for (gray = 0; gray < RAMP_SIZE; gray++) { + color.red = color.green = color.blue = ramp_index_to_short[gray]; + if (! XAllocColor (dpy, colormap, &color)) + goto DONE_ALLOCATE; + } + + /* XXX: Could do this in a more clever order to have the best + * possible results from early failure. Could also choose a cube + * uniformly distributed in a better space than RGB. */ + for (red = 0; red < CUBE_SIZE; red++) { + for (green = 0; green < CUBE_SIZE; green++) { + for (blue = 0; blue < CUBE_SIZE; blue++) { + color.red = cube_index_to_short[red]; + color.green = cube_index_to_short[green]; + color.blue = cube_index_to_short[blue]; + color.pixel = 0; + color.flags = 0; + color.pad = 0; + if (! XAllocColor (dpy, colormap, &color)) + goto DONE_ALLOCATE; + } + } + } + DONE_ALLOCATE: + + for (i = 0; i < ARRAY_LENGTH (colors); i++) + colors[i].pixel = i; + XQueryColors (dpy, colormap, colors, ARRAY_LENGTH (colors)); + + /* Search for nearest colors within allocated colormap. */ + for (gray = 0; gray < RAMP_SIZE; gray++) { + for (i = 0; i < 256; i++) { + distance = _color_distance (ramp_index_to_short[gray], + ramp_index_to_short[gray], + ramp_index_to_short[gray], + colors[i].red, + colors[i].green, + colors[i].blue); + if (i == 0 || distance < min_distance) { + gray_to_pseudocolor[gray] = colors[i].pixel; + min_distance = distance; + if (!min_distance) + break; + } + } + } + for (red = 0; red < CUBE_SIZE; red++) { + for (green = 0; green < CUBE_SIZE; green++) { + for (blue = 0; blue < CUBE_SIZE; blue++) { + for (i = 0; i < 256; i++) { + distance = _color_distance (cube_index_to_short[red], + cube_index_to_short[green], + cube_index_to_short[blue], + colors[i].red, + colors[i].green, + colors[i].blue); + if (i == 0 || distance < min_distance) { + info->cube_to_pseudocolor[red][green][blue] = colors[i].pixel; + min_distance = distance; + if (!min_distance) + break; + } + } + } + } + } + + for (i = 0, j = 0; i < 256; i++) { + if (j < CUBE_SIZE - 1 && (((i<<8)+i) - (int)cube_index_to_short[j]) > ((int)cube_index_to_short[j+1] - ((i<<8)+i))) + j++; + info->field8_to_cube[i] = j; + + info->dither8_to_cube[i] = ((int)i - 128) / (CUBE_SIZE - 1); + } + for (i = 0, j = 0; i < 256; i++) { + if (j < RAMP_SIZE - 1 && (((i<<8)+i) - (int)ramp_index_to_short[j]) > ((int)ramp_index_to_short[j+1] - ((i<<8)+i))) + j++; + info->gray8_to_pseudocolor[i] = gray_to_pseudocolor[j]; + } + + for (i = 0; i < 256; i++) { + info->colors[i].a = 0xff; + info->colors[i].r = colors[i].red >> 8; + info->colors[i].g = colors[i].green >> 8; + info->colors[i].b = colors[i].blue >> 8; + } + + *out = info; + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info) +{ + /* No need for XFreeColors() whilst using DefaultColormap */ + _cairo_list_del (&info->link); + free (info); +} + +#endif /* !CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-xcb-surface.c b/src/cairo-xlib-xcb-surface.c new file mode 100644 index 000000000..af3e15578 --- /dev/null +++ b/src/cairo-xlib-xcb-surface.c @@ -0,0 +1,847 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#if CAIRO_HAS_XLIB_XCB_FUNCTIONS + +#include "cairo-xlib.h" +#include "cairo-xcb.h" + +#include "cairo-xcb-private.h" +#include "cairo-xlib-xrender-private.h" + +#include "cairo-default-context-private.h" +#include "cairo-list-inline.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-backend-private.h" + +#include +#include /* For XESetCloseDisplay */ + +struct cairo_xlib_xcb_display_t { + cairo_device_t base; + + Display *dpy; + cairo_device_t *xcb_device; + XExtCodes *codes; + + cairo_list_t link; +}; +typedef struct cairo_xlib_xcb_display_t cairo_xlib_xcb_display_t; + +/* List of all #cairo_xlib_xcb_display_t alive, + * protected by _cairo_xlib_display_mutex */ +static cairo_list_t displays; + +static cairo_surface_t * +_cairo_xlib_xcb_surface_create (void *dpy, + void *scr, + void *visual, + void *format, + cairo_surface_t *xcb); + +static cairo_surface_t * +_cairo_xlib_xcb_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, + int height) +{ + cairo_xlib_xcb_surface_t *other = abstract_other; + cairo_surface_t *xcb; + + xcb = other->xcb->base.backend->create_similar (other->xcb, content, width, height); + if (unlikely (xcb == NULL || xcb->status)) + return xcb; + + return _cairo_xlib_xcb_surface_create (other->display, other->screen, NULL, NULL, xcb); +} + +static cairo_status_t +_cairo_xlib_xcb_surface_finish (void *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + cairo_status_t status; + + cairo_surface_finish (&surface->xcb->base); + status = surface->xcb->base.status; + cairo_surface_destroy (&surface->xcb->base); + surface->xcb = NULL; + + return status; +} + +static cairo_surface_t * +_cairo_xlib_xcb_surface_create_similar_image (void *abstract_other, + cairo_format_t format, + int width, + int height) +{ + cairo_xlib_xcb_surface_t *surface = abstract_other; + return cairo_surface_create_similar_image (&surface->xcb->base, format, width, height); +} + +static cairo_image_surface_t * +_cairo_xlib_xcb_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_map_to_image (&surface->xcb->base, extents); +} + +static cairo_int_status_t +_cairo_xlib_xcb_surface_unmap (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_unmap_image (&surface->xcb->base, image); +} + +static cairo_surface_t * +_cairo_xlib_xcb_surface_source (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_get_source (&surface->xcb->base, extents); +} + +static cairo_status_t +_cairo_xlib_xcb_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_acquire_source_image (&surface->xcb->base, + image_out, image_extra); +} + +static void +_cairo_xlib_xcb_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image_out, + void *image_extra) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + _cairo_surface_release_source_image (&surface->xcb->base, image_out, image_extra); +} + +static cairo_bool_t +_cairo_xlib_xcb_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *extents) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_get_extents (&surface->xcb->base, extents); +} + +static void +_cairo_xlib_xcb_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + cairo_surface_get_font_options (&surface->xcb->base, options); +} + +static cairo_int_status_t +_cairo_xlib_xcb_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_paint (&surface->xcb->base, op, source, clip); +} + +static cairo_int_status_t +_cairo_xlib_xcb_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_mask (&surface->xcb->base, op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_xlib_xcb_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_stroke (&surface->xcb->base, + op, source, path, style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +_cairo_xlib_xcb_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_fill (&surface->xcb->base, + op, source, path, + fill_rule, tolerance, + antialias, clip); +} + +static cairo_int_status_t +_cairo_xlib_xcb_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + return _cairo_surface_show_text_glyphs (&surface->xcb->base, op, source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, clip); +} + +static cairo_status_t +_cairo_xlib_xcb_surface_flush (void *abstract_surface, unsigned flags) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + /* We have to call cairo_surface_flush() to make sure snapshots are detached */ + return _cairo_surface_flush (&surface->xcb->base, flags); +} + +static cairo_status_t +_cairo_xlib_xcb_surface_mark_dirty (void *abstract_surface, + int x, int y, + int width, int height) +{ + cairo_xlib_xcb_surface_t *surface = abstract_surface; + cairo_surface_mark_dirty_rectangle (&surface->xcb->base, x, y, width, height); + return cairo_surface_status (&surface->xcb->base); +} + +static const cairo_surface_backend_t _cairo_xlib_xcb_surface_backend = { + CAIRO_SURFACE_TYPE_XLIB, + _cairo_xlib_xcb_surface_finish, + + _cairo_default_context_create, /* XXX */ + + _cairo_xlib_xcb_surface_create_similar, + _cairo_xlib_xcb_surface_create_similar_image, + _cairo_xlib_xcb_surface_map_to_image, + _cairo_xlib_xcb_surface_unmap, + + _cairo_xlib_xcb_surface_source, + _cairo_xlib_xcb_surface_acquire_source_image, + _cairo_xlib_xcb_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_xlib_xcb_surface_get_extents, + _cairo_xlib_xcb_surface_get_font_options, + + _cairo_xlib_xcb_surface_flush, + _cairo_xlib_xcb_surface_mark_dirty, + + _cairo_xlib_xcb_surface_paint, + _cairo_xlib_xcb_surface_mask, + _cairo_xlib_xcb_surface_stroke, + _cairo_xlib_xcb_surface_fill, + NULL, /* fill_stroke */ + _cairo_xlib_xcb_surface_glyphs, +}; + +static void +_cairo_xlib_xcb_display_finish (void *abstract_display) +{ + cairo_xlib_xcb_display_t *display = (cairo_xlib_xcb_display_t *) abstract_display; + + CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); + cairo_list_del (&display->link); + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + + cairo_device_destroy (display->xcb_device); + display->xcb_device = NULL; + + XESetCloseDisplay (display->dpy, display->codes->extension, NULL); + /* Drop the reference from _cairo_xlib_xcb_device_create */ + cairo_device_destroy (&display->base); +} + +static int +_cairo_xlib_xcb_close_display(Display *dpy, XExtCodes *codes) +{ + cairo_xlib_xcb_display_t *display; + + CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); + cairo_list_foreach_entry (display, + cairo_xlib_xcb_display_t, + &displays, + link) + { + if (display->dpy == dpy) + { + /* _cairo_xlib_xcb_display_finish will lock the mutex again + * -> deadlock (This mutex isn't recursive) */ + cairo_device_reference (&display->base); + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + + /* Make sure the xcb and xlib-xcb devices are finished */ + cairo_device_finish (display->xcb_device); + cairo_device_finish (&display->base); + + cairo_device_destroy (&display->base); + return 0; + } + } + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + + return 0; +} + +static const cairo_device_backend_t _cairo_xlib_xcb_device_backend = { + CAIRO_DEVICE_TYPE_XLIB, + + NULL, + NULL, + + NULL, /* flush */ + _cairo_xlib_xcb_display_finish, + free, /* destroy */ +}; + +static cairo_device_t * +_cairo_xlib_xcb_device_create (Display *dpy, cairo_device_t *xcb_device) +{ + cairo_xlib_xcb_display_t *display = NULL; + cairo_device_t *device; + + if (xcb_device == NULL) + return NULL; + + CAIRO_MUTEX_INITIALIZE (); + + CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); + if (displays.next == NULL) { + cairo_list_init (&displays); + } + + cairo_list_foreach_entry (display, + cairo_xlib_xcb_display_t, + &displays, + link) + { + if (display->dpy == dpy) { + /* Maintain MRU order. */ + if (displays.next != &display->link) + cairo_list_move (&display->link, &displays); + + /* Grab a reference for our caller */ + device = cairo_device_reference (&display->base); + assert (display->xcb_device == xcb_device); + goto unlock; + } + } + + display = malloc (sizeof (cairo_xlib_xcb_display_t)); + if (unlikely (display == NULL)) { + device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + goto unlock; + } + + display->codes = XAddExtension (dpy); + if (unlikely (display->codes == NULL)) { + device = _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + free (display); + goto unlock; + } + + _cairo_device_init (&display->base, &_cairo_xlib_xcb_device_backend); + + XESetCloseDisplay (dpy, display->codes->extension, _cairo_xlib_xcb_close_display); + /* Add a reference for _cairo_xlib_xcb_display_finish. This basically means + * that the device's reference count never drops to zero + * as long as our Display* is alive. We need this because there is no + * "XDelExtension" to undo XAddExtension and having lots of registered + * extensions slows down libX11. */ + cairo_device_reference (&display->base); + + display->dpy = dpy; + display->xcb_device = cairo_device_reference(xcb_device); + + cairo_list_add (&display->link, &displays); + device = &display->base; + +unlock: + CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); + + return device; +} + +static cairo_surface_t * +_cairo_xlib_xcb_surface_create (void *dpy, + void *scr, + void *visual, + void *format, + cairo_surface_t *xcb) +{ + cairo_xlib_xcb_surface_t *surface; + + if (unlikely (xcb->status)) + return xcb; + + surface = malloc (sizeof (*surface)); + if (unlikely (surface == NULL)) { + cairo_surface_destroy (xcb); + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + _cairo_surface_init (&surface->base, + &_cairo_xlib_xcb_surface_backend, + _cairo_xlib_xcb_device_create (dpy, xcb->device), + xcb->content); + + /* _cairo_surface_init() got another reference to the device, drop ours */ + cairo_device_destroy (surface->base.device); + + surface->display = dpy; + surface->screen = scr; + surface->visual = visual; + surface->format = format; + surface->xcb = (cairo_xcb_surface_t *) xcb; + + return &surface->base; +} + +static Screen * +_cairo_xlib_screen_from_visual (Display *dpy, Visual *visual) +{ + int s, d, v; + + for (s = 0; s < ScreenCount (dpy); s++) { + Screen *screen; + + screen = ScreenOfDisplay (dpy, s); + if (visual == DefaultVisualOfScreen (screen)) + return screen; + + for (d = 0; d < screen->ndepths; d++) { + Depth *depth; + + depth = &screen->depths[d]; + for (v = 0; v < depth->nvisuals; v++) + if (visual == &depth->visuals[v]) + return screen; + } + } + + return NULL; +} + +cairo_surface_t * +cairo_xlib_surface_create (Display *dpy, + Drawable drawable, + Visual *visual, + int width, + int height) +{ + Screen *scr; + xcb_visualtype_t xcb_visual; + + scr = _cairo_xlib_screen_from_visual (dpy, visual); + if (scr == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL)); + + xcb_visual.visual_id = visual->visualid; +#if defined(__cplusplus) || defined(c_plusplus) + xcb_visual._class = visual->c_class; +#else + xcb_visual._class = visual->class; +#endif + xcb_visual.bits_per_rgb_value = visual->bits_per_rgb; + xcb_visual.colormap_entries = visual->map_entries; + xcb_visual.red_mask = visual->red_mask; + xcb_visual.green_mask = visual->green_mask; + xcb_visual.blue_mask = visual->blue_mask; + + return _cairo_xlib_xcb_surface_create (dpy, scr, visual, NULL, + cairo_xcb_surface_create (XGetXCBConnection (dpy), + drawable, + &xcb_visual, + width, height)); +} + +static xcb_screen_t * +_cairo_xcb_screen_from_root (xcb_connection_t *connection, + xcb_window_t id) +{ + xcb_screen_iterator_t s; + + s = xcb_setup_roots_iterator (xcb_get_setup (connection)); + for (; s.rem; xcb_screen_next (&s)) { + if (s.data->root == id) + return s.data; + } + + return NULL; +} + +cairo_surface_t * +cairo_xlib_surface_create_for_bitmap (Display *dpy, + Pixmap bitmap, + Screen *scr, + int width, + int height) +{ + xcb_connection_t *connection = XGetXCBConnection (dpy); + xcb_screen_t *screen = _cairo_xcb_screen_from_root (connection, (xcb_window_t) scr->root); + return _cairo_xlib_xcb_surface_create (dpy, scr, NULL, NULL, + cairo_xcb_surface_create_for_bitmap (connection, + screen, + bitmap, + width, height)); +} + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +cairo_surface_t * +cairo_xlib_surface_create_with_xrender_format (Display *dpy, + Drawable drawable, + Screen *scr, + XRenderPictFormat *format, + int width, + int height) +{ + xcb_render_pictforminfo_t xcb_format; + xcb_connection_t *connection; + xcb_screen_t *screen; + + xcb_format.id = format->id; + xcb_format.type = format->type; + xcb_format.depth = format->depth; + xcb_format.direct.red_shift = format->direct.red; + xcb_format.direct.red_mask = format->direct.redMask; + xcb_format.direct.green_shift = format->direct.green; + xcb_format.direct.green_mask = format->direct.greenMask; + xcb_format.direct.blue_shift = format->direct.blue; + xcb_format.direct.blue_mask = format->direct.blueMask; + xcb_format.direct.alpha_shift = format->direct.alpha; + xcb_format.direct.alpha_mask = format->direct.alphaMask; + xcb_format.colormap = format->colormap; + + connection = XGetXCBConnection (dpy); + screen = _cairo_xcb_screen_from_root (connection, (xcb_window_t) scr->root); + + return _cairo_xlib_xcb_surface_create (dpy, scr, NULL, format, + cairo_xcb_surface_create_with_xrender_format (connection, screen, + drawable, + &xcb_format, + width, height)); +} + +XRenderPictFormat * +cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface) +{ + cairo_xlib_xcb_surface_t *xlib_surface = (cairo_xlib_xcb_surface_t *) surface; + + /* Throw an error for a non-xlib surface */ + if (surface->type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return xlib_surface->format; +} +#endif + +void +cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface, + int width, + int height) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + cairo_status_t status; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + status = _cairo_surface_set_error (abstract_surface, + CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return; + } + + cairo_xcb_surface_set_size (&surface->xcb->base, width, height); + if (unlikely (surface->xcb->base.status)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (surface->xcb->base.status)); + } +} + +void +cairo_xlib_surface_set_drawable (cairo_surface_t *abstract_surface, + Drawable drawable, + int width, + int height) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *)abstract_surface; + cairo_status_t status; + + if (unlikely (abstract_surface->status)) + return; + if (unlikely (abstract_surface->finished)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + return; + } + + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + status = _cairo_surface_set_error (abstract_surface, + CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return; + } + + cairo_xcb_surface_set_drawable (&surface->xcb->base, drawable, width, height); + if (unlikely (surface->xcb->base.status)) { + status = _cairo_surface_set_error (abstract_surface, + _cairo_error (surface->xcb->base.status)); + } +} + +Display * +cairo_xlib_surface_get_display (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return surface->display; +} + +Drawable +cairo_xlib_surface_get_drawable (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (unlikely (abstract_surface->finished)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_FINISHED); + return 0; + } + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + /* This can happen when e.g. create_similar falls back to an image surface + * because we don't have the RENDER extension. */ + if (surface->xcb->base.type != CAIRO_SURFACE_TYPE_XCB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->xcb->drawable; +} + +Screen * +cairo_xlib_surface_get_screen (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return surface->screen; +} + +Visual * +cairo_xlib_surface_get_visual (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return NULL; + } + + return surface->visual; +} + +int +cairo_xlib_surface_get_depth (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (unlikely (abstract_surface->finished)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_FINISHED); + return 0; + } + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + /* This can happen when e.g. create_similar falls back to an image surface + * because we don't have the RENDER extension. */ + if (surface->xcb->base.type != CAIRO_SURFACE_TYPE_XCB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->xcb->depth; +} + +int +cairo_xlib_surface_get_width (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (unlikely (abstract_surface->finished)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_FINISHED); + return 0; + } + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + /* This can happen when e.g. create_similar falls back to an image surface + * because we don't have the RENDER extension. */ + if (surface->xcb->base.type != CAIRO_SURFACE_TYPE_XCB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->xcb->width; +} + +int +cairo_xlib_surface_get_height (cairo_surface_t *abstract_surface) +{ + cairo_xlib_xcb_surface_t *surface = (cairo_xlib_xcb_surface_t *) abstract_surface; + + if (unlikely (abstract_surface->finished)) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_FINISHED); + return 0; + } + if (surface->base.type != CAIRO_SURFACE_TYPE_XLIB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + /* This can happen when e.g. create_similar falls back to an image surface + * because we don't have the RENDER extension. */ + if (surface->xcb->base.type != CAIRO_SURFACE_TYPE_XCB) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->xcb->height; +} + +void +cairo_xlib_device_debug_cap_xrender_version (cairo_device_t *device, + int major, int minor) +{ + cairo_xlib_xcb_display_t *display = (cairo_xlib_xcb_display_t *) device; + + if (device == NULL || device->status) + return; + + if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB) + return; + + cairo_xcb_device_debug_cap_xrender_version (display->xcb_device, + major, minor); +} + +void +cairo_xlib_device_debug_set_precision (cairo_device_t *device, + int precision) +{ + cairo_xlib_xcb_display_t *display = (cairo_xlib_xcb_display_t *) device; + + if (device == NULL || device->status) + return; + if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return; + } + + cairo_xcb_device_debug_set_precision (display->xcb_device, precision); +} + +int +cairo_xlib_device_debug_get_precision (cairo_device_t *device) +{ + cairo_xlib_xcb_display_t *display = (cairo_xlib_xcb_display_t *) device; + + if (device == NULL || device->status) + return -1; + if (device->backend->type != CAIRO_DEVICE_TYPE_XLIB) { + cairo_status_t status; + + status = _cairo_device_set_error (device, CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + (void) status; + return -1; + } + + return cairo_xcb_device_debug_get_precision (display->xcb_device); +} + +#endif /* CAIRO_HAS_XLIB_XCB_FUNCTIONS */ diff --git a/src/cairo-xlib-xrender-private.h b/src/cairo-xlib-xrender-private.h new file mode 100644 index 000000000..90769467b --- /dev/null +++ b/src/cairo-xlib-xrender-private.h @@ -0,0 +1,1173 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + */ + +#ifndef CAIRO_XLIB_XRENDER_PRIVATE_H +#define CAIRO_XLIB_XRENDER_PRIVATE_H + +#include "cairo-features.h" +#include "cairo-compiler-private.h" + +#include + +/* These prototypes are used when defining interfaces missing from the + * render headers. As it happens, it is the case that all libxrender + * functions take a pointer as first argument. */ + +__attribute__((__unused__)) static void _void_consume (void *p, ...) { } +__attribute__((__unused__)) static void * _voidp_consume (void *p, ...) { return (void *)0; } +__attribute__((__unused__)) static int _int_consume (void *p, ...) { return 0; } +__attribute__((__unused__)) static void _void_consume_free (Display *p, XID n) { } + + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE + +#include "cairo-xlib-xrender.h" + +#include +#include + +/* We require Render >= 0.6. The following defines were only added in + * 0.10. Make sure they are defined. + */ + +/* Filters included in 0.10 */ +#ifndef FilterConvolution +#define FilterConvolution "convolution" +#endif + +/* Extended repeat attributes included in 0.10 */ +#ifndef RepeatNone +#define RepeatNone 0 +#define RepeatNormal 1 +#define RepeatPad 2 +#define RepeatReflect 3 +#endif + + +#ifndef PictOptBlendMinimum +/* + * Operators only available in version 0.11 + */ +#define PictOpBlendMinimum 0x30 +#define PictOpMultiply 0x30 +#define PictOpScreen 0x31 +#define PictOpOverlay 0x32 +#define PictOpDarken 0x33 +#define PictOpLighten 0x34 +#define PictOpColorDodge 0x35 +#define PictOpColorBurn 0x36 +#define PictOpHardLight 0x37 +#define PictOpSoftLight 0x38 +#define PictOpDifference 0x39 +#define PictOpExclusion 0x3a +#define PictOpHSLHue 0x3b +#define PictOpHSLSaturation 0x3c +#define PictOpHSLColor 0x3d +#define PictOpHSLLuminosity 0x3e +#define PictOpBlendMaximum 0x3e +#endif + +#if !HAVE_XRENDERCREATESOLIDFILL +#define XRenderCreateSolidFill _int_consume +#endif + +#if !HAVE_XRENDERCREATELINEARGRADIENT +#define XRenderCreateLinearGradient _int_consume + +typedef struct _XLinearGradient { + XPointFixed p1; + XPointFixed p2; +} XLinearGradient; +#endif + +#if !HAVE_XRENDERCREATERADIALGRADIENT +#define XRenderCreateRadialGradient _int_consume + +typedef struct _XCircle { + XFixed x; + XFixed y; + XFixed radius; +} XCircle; +typedef struct _XRadialGradient { + XCircle inner; + XCircle outer; +} XRadialGradient; +#endif + +#if !HAVE_XRENDERCREATECONICALGRADIENT +#define XRenderCreateConicalGradient _int_consume + +typedef struct _XConicalGradient { + XPointFixed center; + XFixed angle; /* in degrees */ +} XConicalGradient; +#endif + + +#else /* !CAIRO_HAS_XLIB_XRENDER_SURFACE */ + +/* Provide dummy symbols and macros to get it compile and take the fallback + * route, just like as if Xrender is not available in the server at run-time. */ + + +/* Functions */ + +#define XRenderQueryExtension _int_consume +#define XRenderQueryVersion _int_consume +#define XRenderQueryFormats _int_consume +#define XRenderQuerySubpixelOrder _int_consume +#define XRenderSetSubpixelOrder _int_consume +#define XRenderFindVisualFormat _voidp_consume +#define XRenderFindFormat _voidp_consume +#define XRenderFindStandardFormat _voidp_consume +#define XRenderQueryPictIndexValues _voidp_consume +#define XRenderCreatePicture _int_consume +#define XRenderChangePicture _void_consume +#define XRenderSetPictureClipRectangles _void_consume +#define XRenderSetPictureClipRegion _void_consume +#define XRenderSetPictureTransform _void_consume +#define XRenderFreePicture _void_consume_free +#define XRenderComposite _void_consume +#define XRenderCreateGlyphSet _int_consume +#define XRenderReferenceGlyphSet _int_consume +#define XRenderFreeGlyphSet _void_consume_free +#define XRenderAddGlyphs _void_consume +#define XRenderFreeGlyphs _void_consume +#define XRenderCompositeString8 _void_consume +#define XRenderCompositeString16 _void_consume +#define XRenderCompositeString32 _void_consume +#define XRenderCompositeText8 (cairo_xrender_composite_text_func_t) _void_consume +#define XRenderCompositeText16 _void_consume +#define XRenderCompositeText32 _void_consume +#define XRenderFillRectangle _void_consume +#define XRenderFillRectangles _void_consume +#define XRenderCompositeTrapezoids _void_consume +#define XRenderCompositeTriangles _void_consume +#define XRenderCompositeTriStrip _void_consume +#define XRenderCompositeTriFan _void_consume +#define XRenderCompositeDoublePoly _void_consume +#define XRenderParseColor _int_consume +#define XRenderCreateCursor _int_consume +#define XRenderQueryFilters _voidp_consume +#define XRenderSetPictureFilter _void_consume +#define XRenderCreateAnimCursor _int_consume +#define XRenderAddTraps _void_consume +#define XRenderCreateSolidFill _int_consume +#define XRenderCreateLinearGradient _int_consume +#define XRenderCreateRadialGradient _int_consume +#define XRenderCreateConicalGradient _int_consume + +#define cairo_xlib_surface_create_with_xrender_format _voidp_consume + + + +/* The rest of this file is copied from various Xrender header files, with + * the following copyright/license information: + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + + +/* Copied from X11/extensions/render.h */ + +typedef unsigned long Glyph; +typedef unsigned long GlyphSet; +typedef unsigned long Picture; +typedef unsigned long PictFormat; + +#define BadPictFormat 0 +#define BadPicture 1 +#define BadPictOp 2 +#define BadGlyphSet 3 +#define BadGlyph 4 +#define RenderNumberErrors (BadGlyph+1) + +#define PictTypeIndexed 0 +#define PictTypeDirect 1 + +#define PictOpMinimum 0 +#define PictOpClear 0 +#define PictOpSrc 1 +#define PictOpDst 2 +#define PictOpOver 3 +#define PictOpOverReverse 4 +#define PictOpIn 5 +#define PictOpInReverse 6 +#define PictOpOut 7 +#define PictOpOutReverse 8 +#define PictOpAtop 9 +#define PictOpAtopReverse 10 +#define PictOpXor 11 +#define PictOpAdd 12 +#define PictOpSaturate 13 +#define PictOpMaximum 13 + +/* + * Operators only available in version 0.2 + */ +#define PictOpDisjointMinimum 0x10 +#define PictOpDisjointClear 0x10 +#define PictOpDisjointSrc 0x11 +#define PictOpDisjointDst 0x12 +#define PictOpDisjointOver 0x13 +#define PictOpDisjointOverReverse 0x14 +#define PictOpDisjointIn 0x15 +#define PictOpDisjointInReverse 0x16 +#define PictOpDisjointOut 0x17 +#define PictOpDisjointOutReverse 0x18 +#define PictOpDisjointAtop 0x19 +#define PictOpDisjointAtopReverse 0x1a +#define PictOpDisjointXor 0x1b +#define PictOpDisjointMaximum 0x1b + +#define PictOpConjointMinimum 0x20 +#define PictOpConjointClear 0x20 +#define PictOpConjointSrc 0x21 +#define PictOpConjointDst 0x22 +#define PictOpConjointOver 0x23 +#define PictOpConjointOverReverse 0x24 +#define PictOpConjointIn 0x25 +#define PictOpConjointInReverse 0x26 +#define PictOpConjointOut 0x27 +#define PictOpConjointOutReverse 0x28 +#define PictOpConjointAtop 0x29 +#define PictOpConjointAtopReverse 0x2a +#define PictOpConjointXor 0x2b +#define PictOpConjointMaximum 0x2b + +/* + * Operators only available in version 0.11 + */ +#define PictOpBlendMinimum 0x30 +#define PictOpMultiply 0x30 +#define PictOpScreen 0x31 +#define PictOpOverlay 0x32 +#define PictOpDarken 0x33 +#define PictOpLighten 0x34 +#define PictOpColorDodge 0x35 +#define PictOpColorBurn 0x36 +#define PictOpHardLight 0x37 +#define PictOpSoftLight 0x38 +#define PictOpDifference 0x39 +#define PictOpExclusion 0x3a +#define PictOpHSLHue 0x3b +#define PictOpHSLSaturation 0x3c +#define PictOpHSLColor 0x3d +#define PictOpHSLLuminosity 0x3e +#define PictOpBlendMaximum 0x3e + +#define PolyEdgeSharp 0 +#define PolyEdgeSmooth 1 + +#define PolyModePrecise 0 +#define PolyModeImprecise 1 + +#define CPRepeat (1 << 0) +#define CPAlphaMap (1 << 1) +#define CPAlphaXOrigin (1 << 2) +#define CPAlphaYOrigin (1 << 3) +#define CPClipXOrigin (1 << 4) +#define CPClipYOrigin (1 << 5) +#define CPClipMask (1 << 6) +#define CPGraphicsExposure (1 << 7) +#define CPSubwindowMode (1 << 8) +#define CPPolyEdge (1 << 9) +#define CPPolyMode (1 << 10) +#define CPDither (1 << 11) +#define CPComponentAlpha (1 << 12) +#define CPLastBit 12 + +/* Filters included in 0.6 */ +#define FilterNearest "nearest" +#define FilterBilinear "bilinear" +/* Filters included in 0.10 */ +#define FilterConvolution "convolution" + +#define FilterFast "fast" +#define FilterGood "good" +#define FilterBest "best" + +#define FilterAliasNone -1 + +/* Subpixel orders included in 0.6 */ +#define SubPixelUnknown 0 +#define SubPixelHorizontalRGB 1 +#define SubPixelHorizontalBGR 2 +#define SubPixelVerticalRGB 3 +#define SubPixelVerticalBGR 4 +#define SubPixelNone 5 + +/* Extended repeat attributes included in 0.10 */ +#define RepeatNone 0 +#define RepeatNormal 1 +#define RepeatPad 2 +#define RepeatReflect 3 + + + +/* Copied from X11/extensions/Xrender.h */ + +typedef struct { + short red; + short redMask; + short green; + short greenMask; + short blue; + short blueMask; + short alpha; + short alphaMask; +} XRenderDirectFormat; + +typedef struct { + PictFormat id; + int type; + int depth; + XRenderDirectFormat direct; + Colormap colormap; +} XRenderPictFormat; + +#define PictFormatID (1 << 0) +#define PictFormatType (1 << 1) +#define PictFormatDepth (1 << 2) +#define PictFormatRed (1 << 3) +#define PictFormatRedMask (1 << 4) +#define PictFormatGreen (1 << 5) +#define PictFormatGreenMask (1 << 6) +#define PictFormatBlue (1 << 7) +#define PictFormatBlueMask (1 << 8) +#define PictFormatAlpha (1 << 9) +#define PictFormatAlphaMask (1 << 10) +#define PictFormatColormap (1 << 11) + +typedef struct _XRenderPictureAttributes { + int repeat; + Picture alpha_map; + int alpha_x_origin; + int alpha_y_origin; + int clip_x_origin; + int clip_y_origin; + Pixmap clip_mask; + Bool graphics_exposures; + int subwindow_mode; + int poly_edge; + int poly_mode; + Atom dither; + Bool component_alpha; +} XRenderPictureAttributes; + +typedef struct { + unsigned short red; + unsigned short green; + unsigned short blue; + unsigned short alpha; +} XRenderColor; + +typedef struct _XGlyphInfo { + unsigned short width; + unsigned short height; + short x; + short y; + short xOff; + short yOff; +} XGlyphInfo; + +typedef struct _XGlyphElt8 { + GlyphSet glyphset; + _Xconst char *chars; + int nchars; + int xOff; + int yOff; +} XGlyphElt8; + +typedef struct _XGlyphElt16 { + GlyphSet glyphset; + _Xconst unsigned short *chars; + int nchars; + int xOff; + int yOff; +} XGlyphElt16; + +typedef struct _XGlyphElt32 { + GlyphSet glyphset; + _Xconst unsigned int *chars; + int nchars; + int xOff; + int yOff; +} XGlyphElt32; + +typedef double XDouble; + +typedef struct _XPointDouble { + XDouble x, y; +} XPointDouble; + +#define XDoubleToFixed(f) ((XFixed) ((f) * 65536)) +#define XFixedToDouble(f) (((XDouble) (f)) / 65536) + +typedef int XFixed; + +typedef struct _XPointFixed { + XFixed x, y; +} XPointFixed; + +typedef struct _XLineFixed { + XPointFixed p1, p2; +} XLineFixed; + +typedef struct _XTriangle { + XPointFixed p1, p2, p3; +} XTriangle; + +typedef struct _XCircle { + XFixed x; + XFixed y; + XFixed radius; +} XCircle; + +typedef struct _XTrapezoid { + XFixed top, bottom; + XLineFixed left, right; +} XTrapezoid; + +typedef struct _XTransform { + XFixed matrix[3][3]; +} XTransform; + +typedef struct _XFilters { + int nfilter; + char **filter; + int nalias; + short *alias; +} XFilters; + +typedef struct _XIndexValue { + unsigned long pixel; + unsigned short red, green, blue, alpha; +} XIndexValue; + +typedef struct _XAnimCursor { + Cursor cursor; + unsigned long delay; +} XAnimCursor; + +typedef struct _XSpanFix { + XFixed left, right, y; +} XSpanFix; + +typedef struct _XTrap { + XSpanFix top, bottom; +} XTrap; + +typedef struct _XLinearGradient { + XPointFixed p1; + XPointFixed p2; +} XLinearGradient; + +typedef struct _XRadialGradient { + XCircle inner; + XCircle outer; +} XRadialGradient; + +typedef struct _XConicalGradient { + XPointFixed center; + XFixed angle; /* in degrees */ +} XConicalGradient; + +#define PictStandardARGB32 0 +#define PictStandardRGB24 1 +#define PictStandardA8 2 +#define PictStandardA4 3 +#define PictStandardA1 4 +#define PictStandardNUM 5 + + + +/* Copied from X11/extensions/renderproto.h */ + +#include + +#define Window CARD32 +#define Drawable CARD32 +#define Font CARD32 +#define Pixmap CARD32 +#define Cursor CARD32 +#define Colormap CARD32 +#define GContext CARD32 +#define Atom CARD32 +#define VisualID CARD32 +#define Time CARD32 +#define KeyCode CARD8 +#define KeySym CARD32 + +#define Picture CARD32 +#define PictFormat CARD32 +#define Fixed INT32 +#define Glyphset CARD32 +#define Glyph CARD32 + +/* + * data structures + */ + +typedef struct { + CARD16 red B16; + CARD16 redMask B16; + CARD16 green B16; + CARD16 greenMask B16; + CARD16 blue B16; + CARD16 blueMask B16; + CARD16 alpha B16; + CARD16 alphaMask B16; +} xDirectFormat; + +#define sz_xDirectFormat 16 + +typedef struct { + PictFormat id B32; + CARD8 type; + CARD8 depth; + CARD16 pad1 B16; + xDirectFormat direct; + Colormap colormap; +} xPictFormInfo; + +#define sz_xPictFormInfo 28 + +typedef struct { + VisualID visual; + PictFormat format; +} xPictVisual; + +#define sz_xPictVisual 8 + +typedef struct { + CARD8 depth; + CARD8 pad1; + CARD16 nPictVisuals B16; + CARD32 pad2 B32; +} xPictDepth; + +#define sz_xPictDepth 8 + +typedef struct { + CARD32 nDepth B32; + PictFormat fallback B32; +} xPictScreen; + +#define sz_xPictScreen 8 + +typedef struct { + CARD32 pixel B32; + CARD16 red B16; + CARD16 green B16; + CARD16 blue B16; + CARD16 alpha B16; +} xIndexValue; + +#define sz_xIndexValue 12 + +typedef struct { + CARD16 red B16; + CARD16 green B16; + CARD16 blue B16; + CARD16 alpha B16; +} xRenderColor; + +#define sz_xRenderColor 8 + +typedef struct { + Fixed x B32; + Fixed y B32; +} xPointFixed; + +#define sz_xPointFixed 8 + +typedef struct { + xPointFixed p1; + xPointFixed p2; +} xLineFixed; + +#define sz_xLineFixed 16 + +typedef struct { + xPointFixed p1, p2, p3; +} xTriangle; + +#define sz_xTriangle 24 + +typedef struct { + Fixed top B32; + Fixed bottom B32; + xLineFixed left; + xLineFixed right; +} xTrapezoid; + +#define sz_xTrapezoid 40 + +typedef struct { + CARD16 width B16; + CARD16 height B16; + INT16 x B16; + INT16 y B16; + INT16 xOff B16; + INT16 yOff B16; +} xGlyphInfo; + +#define sz_xGlyphInfo 12 + +typedef struct { + CARD8 len; + CARD8 pad1; + CARD16 pad2; + INT16 deltax; + INT16 deltay; +} xGlyphElt; + +#define sz_xGlyphElt 8 + +typedef struct { + Fixed l, r, y; +} xSpanFix; + +#define sz_xSpanFix 12 + +typedef struct { + xSpanFix top, bot; +} xTrap; + +#define sz_xTrap 24 + +/* + * requests and replies + */ +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD32 majorVersion B32; + CARD32 minorVersion B32; +} xRenderQueryVersionReq; + +#define sz_xRenderQueryVersionReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 majorVersion B32; + CARD32 minorVersion B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xRenderQueryVersionReply; + +#define sz_xRenderQueryVersionReply 32 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; +} xRenderQueryPictFormatsReq; + +#define sz_xRenderQueryPictFormatsReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 numFormats B32; + CARD32 numScreens B32; + CARD32 numDepths B32; + CARD32 numVisuals B32; + CARD32 numSubpixel B32; /* Version 0.6 */ + CARD32 pad5 B32; +} xRenderQueryPictFormatsReply; + +#define sz_xRenderQueryPictFormatsReply 32 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + PictFormat format B32; +} xRenderQueryPictIndexValuesReq; + +#define sz_xRenderQueryPictIndexValuesReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 numIndexValues; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xRenderQueryPictIndexValuesReply; + +#define sz_xRenderQueryPictIndexValuesReply 32 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture pid B32; + Drawable drawable B32; + PictFormat format B32; + CARD32 mask B32; +} xRenderCreatePictureReq; + +#define sz_xRenderCreatePictureReq 20 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture picture B32; + CARD32 mask B32; +} xRenderChangePictureReq; + +#define sz_xRenderChangePictureReq 12 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture picture B32; + INT16 xOrigin B16; + INT16 yOrigin B16; +} xRenderSetPictureClipRectanglesReq; + +#define sz_xRenderSetPictureClipRectanglesReq 12 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture picture B32; +} xRenderFreePictureReq; + +#define sz_xRenderFreePictureReq 8 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture src B32; + Picture mask B32; + Picture dst B32; + INT16 xSrc B16; + INT16 ySrc B16; + INT16 xMask B16; + INT16 yMask B16; + INT16 xDst B16; + INT16 yDst B16; + CARD16 width B16; + CARD16 height B16; +} xRenderCompositeReq; + +#define sz_xRenderCompositeReq 36 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture src B32; + Picture dst B32; + CARD32 colorScale B32; + CARD32 alphaScale B32; + INT16 xSrc B16; + INT16 ySrc B16; + INT16 xDst B16; + INT16 yDst B16; + CARD16 width B16; + CARD16 height B16; +} xRenderScaleReq; + +#define sz_xRenderScaleReq 32 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture src B32; + Picture dst B32; + PictFormat maskFormat B32; + INT16 xSrc B16; + INT16 ySrc B16; +} xRenderTrapezoidsReq; + +#define sz_xRenderTrapezoidsReq 24 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture src B32; + Picture dst B32; + PictFormat maskFormat B32; + INT16 xSrc B16; + INT16 ySrc B16; +} xRenderTrianglesReq; + +#define sz_xRenderTrianglesReq 24 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture src B32; + Picture dst B32; + PictFormat maskFormat B32; + INT16 xSrc B16; + INT16 ySrc B16; +} xRenderTriStripReq; + +#define sz_xRenderTriStripReq 24 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture src B32; + Picture dst B32; + PictFormat maskFormat B32; + INT16 xSrc B16; + INT16 ySrc B16; +} xRenderTriFanReq; + +#define sz_xRenderTriFanReq 24 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Glyphset gsid B32; + PictFormat format B32; +} xRenderCreateGlyphSetReq; + +#define sz_xRenderCreateGlyphSetReq 12 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Glyphset gsid B32; + Glyphset existing B32; +} xRenderReferenceGlyphSetReq; + +#define sz_xRenderReferenceGlyphSetReq 24 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Glyphset glyphset B32; +} xRenderFreeGlyphSetReq; + +#define sz_xRenderFreeGlyphSetReq 8 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Glyphset glyphset B32; + CARD32 nglyphs; +} xRenderAddGlyphsReq; + +#define sz_xRenderAddGlyphsReq 12 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Glyphset glyphset B32; +} xRenderFreeGlyphsReq; + +#define sz_xRenderFreeGlyphsReq 8 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture src B32; + Picture dst B32; + PictFormat maskFormat B32; + Glyphset glyphset B32; + INT16 xSrc B16; + INT16 ySrc B16; +} xRenderCompositeGlyphsReq, xRenderCompositeGlyphs8Req, +xRenderCompositeGlyphs16Req, xRenderCompositeGlyphs32Req; + +#define sz_xRenderCompositeGlyphs8Req 28 +#define sz_xRenderCompositeGlyphs16Req 28 +#define sz_xRenderCompositeGlyphs32Req 28 + +/* 0.1 and higher */ + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + CARD8 op; + CARD8 pad1; + CARD16 pad2 B16; + Picture dst B32; + xRenderColor color; +} xRenderFillRectanglesReq; + +#define sz_xRenderFillRectanglesReq 20 + +/* 0.5 and higher */ + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Cursor cid B32; + Picture src B32; + CARD16 x B16; + CARD16 y B16; +} xRenderCreateCursorReq; + +#define sz_xRenderCreateCursorReq 16 + +/* 0.6 and higher */ + +/* + * This can't use an array because 32-bit values may be in bitfields + */ +typedef struct { + Fixed matrix11 B32; + Fixed matrix12 B32; + Fixed matrix13 B32; + Fixed matrix21 B32; + Fixed matrix22 B32; + Fixed matrix23 B32; + Fixed matrix31 B32; + Fixed matrix32 B32; + Fixed matrix33 B32; +} xRenderTransform; + +#define sz_xRenderTransform 36 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture picture B32; + xRenderTransform transform; +} xRenderSetPictureTransformReq; + +#define sz_xRenderSetPictureTransformReq 44 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Drawable drawable B32; +} xRenderQueryFiltersReq; + +#define sz_xRenderQueryFiltersReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 numAliases B32; /* LISTofCARD16 */ + CARD32 numFilters B32; /* LISTofSTRING8 */ + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xRenderQueryFiltersReply; + +#define sz_xRenderQueryFiltersReply 32 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture picture B32; + CARD16 nbytes B16; /* number of bytes in name */ + CARD16 pad B16; +} xRenderSetPictureFilterReq; + +#define sz_xRenderSetPictureFilterReq 12 + +/* 0.8 and higher */ + +typedef struct { + Cursor cursor B32; + CARD32 delay B32; +} xAnimCursorElt; + +#define sz_xAnimCursorElt 8 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Cursor cid B32; +} xRenderCreateAnimCursorReq; + +#define sz_xRenderCreateAnimCursorReq 8 + +/* 0.9 and higher */ + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture picture; + INT16 xOff B16; + INT16 yOff B16; +} xRenderAddTrapsReq; + +#define sz_xRenderAddTrapsReq 12 + +/* 0.10 and higher */ + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture pid B32; + xRenderColor color; +} xRenderCreateSolidFillReq; + +#define sz_xRenderCreateSolidFillReq 16 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture pid B32; + xPointFixed p1; + xPointFixed p2; + CARD32 nStops; +} xRenderCreateLinearGradientReq; + +#define sz_xRenderCreateLinearGradientReq 28 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture pid B32; + xPointFixed inner; + xPointFixed outer; + Fixed inner_radius; + Fixed outer_radius; + CARD32 nStops; +} xRenderCreateRadialGradientReq; + +#define sz_xRenderCreateRadialGradientReq 36 + +typedef struct { + CARD8 reqType; + CARD8 renderReqType; + CARD16 length B16; + Picture pid B32; + xPointFixed center; + Fixed angle; /* in degrees */ + CARD32 nStops; +} xRenderCreateConicalGradientReq; + +#define sz_xRenderCreateConicalGradientReq 24 + +#undef Window +#undef Drawable +#undef Font +#undef Pixmap +#undef Cursor +#undef Colormap +#undef GContext +#undef Atom +#undef VisualID +#undef Time +#undef KeyCode +#undef KeySym + +#undef Picture +#undef PictFormat +#undef Fixed +#undef Glyphset +#undef Glyph + + +#endif /* CAIRO_HAS_XLIB_XRENDER_SURFACE */ + +#endif /* CAIRO_XLIB_XRENDER_PRIVATE_H */ diff --git a/src/cairo-xlib-xrender.h b/src/cairo-xlib-xrender.h new file mode 100644 index 000000000..b34b057de --- /dev/null +++ b/src/cairo-xlib-xrender.h @@ -0,0 +1,66 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_XLIB_XRENDER_H +#define CAIRO_XLIB_XRENDER_H + +#include "cairo.h" + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE + +#include +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_xlib_surface_create_with_xrender_format (Display *dpy, + Drawable drawable, + Screen *screen, + XRenderPictFormat *format, + int width, + int height); + +cairo_public XRenderPictFormat * +cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_XLIB_XRENDER_SURFACE */ +# error Cairo was not compiled with support for the xlib XRender backend +#endif /* CAIRO_HAS_XLIB_XRENDER_SURFACE */ + +#endif /* CAIRO_XLIB_XRENDER_H */ diff --git a/src/cairo-xlib.h b/src/cairo-xlib.h new file mode 100644 index 000000000..ecf8d6c86 --- /dev/null +++ b/src/cairo-xlib.h @@ -0,0 +1,118 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_XLIB_H +#define CAIRO_XLIB_H + +#include "cairo.h" + +#if CAIRO_HAS_XLIB_SURFACE + +#include + +CAIRO_BEGIN_DECLS + +cairo_public cairo_surface_t * +cairo_xlib_surface_create (Display *dpy, + Drawable drawable, + Visual *visual, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_xlib_surface_create_for_bitmap (Display *dpy, + Pixmap bitmap, + Screen *screen, + int width, + int height); + +cairo_public void +cairo_xlib_surface_set_size (cairo_surface_t *surface, + int width, + int height); + +cairo_public void +cairo_xlib_surface_set_drawable (cairo_surface_t *surface, + Drawable drawable, + int width, + int height); + +cairo_public Display * +cairo_xlib_surface_get_display (cairo_surface_t *surface); + +cairo_public Drawable +cairo_xlib_surface_get_drawable (cairo_surface_t *surface); + +cairo_public Screen * +cairo_xlib_surface_get_screen (cairo_surface_t *surface); + +cairo_public Visual * +cairo_xlib_surface_get_visual (cairo_surface_t *surface); + +cairo_public int +cairo_xlib_surface_get_depth (cairo_surface_t *surface); + +cairo_public int +cairo_xlib_surface_get_width (cairo_surface_t *surface); + +cairo_public int +cairo_xlib_surface_get_height (cairo_surface_t *surface); + +/* debug interface */ + +cairo_public void +cairo_xlib_device_debug_cap_xrender_version (cairo_device_t *device, + int major_version, + int minor_version); + +/* + * @precision: -1 implies automatically choose based on antialiasing mode, + * any other value overrides and sets the corresponding PolyMode. + */ +cairo_public void +cairo_xlib_device_debug_set_precision (cairo_device_t *device, + int precision); + +cairo_public int +cairo_xlib_device_debug_get_precision (cairo_device_t *device); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_XLIB_SURFACE */ +# error Cairo was not compiled with support for the xlib backend +#endif /* CAIRO_HAS_XLIB_SURFACE */ + +#endif /* CAIRO_XLIB_H */ diff --git a/src/cairo-xml-surface.c b/src/cairo-xml-surface.c new file mode 100644 index 000000000..6dbafdba2 --- /dev/null +++ b/src/cairo-xml-surface.c @@ -0,0 +1,1209 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +/* This surface is intended to produce a verbose, hierarchical, DAG XML file + * representing a single surface. It is intended to be used by debuggers, + * such as cairo-sphinx, or by application test-suites that what a log of + * operations. + */ + +#include "cairoint.h" + +#include "cairo-xml.h" + +#include "cairo-clip-private.h" +#include "cairo-device-private.h" +#include "cairo-default-context-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-error-private.h" +#include "cairo-output-stream-private.h" +#include "cairo-recording-surface-inline.h" + +#define static cairo_warn static + +typedef struct _cairo_xml_surface cairo_xml_surface_t; + +typedef struct _cairo_xml { + cairo_device_t base; + + cairo_output_stream_t *stream; + int indent; +} cairo_xml_t; + +struct _cairo_xml_surface { + cairo_surface_t base; + + double width, height; +}; + +slim_hidden_proto (cairo_xml_for_recording_surface); + +static const cairo_surface_backend_t _cairo_xml_surface_backend; + +static const char * +_operator_to_string (cairo_operator_t op) +{ + static const char *names[] = { + "CLEAR", /* CAIRO_OPERATOR_CLEAR */ + + "SOURCE", /* CAIRO_OPERATOR_SOURCE */ + "OVER", /* CAIRO_OPERATOR_OVER */ + "IN", /* CAIRO_OPERATOR_IN */ + "OUT", /* CAIRO_OPERATOR_OUT */ + "ATOP", /* CAIRO_OPERATOR_ATOP */ + + "DEST", /* CAIRO_OPERATOR_DEST */ + "DEST_OVER", /* CAIRO_OPERATOR_DEST_OVER */ + "DEST_IN", /* CAIRO_OPERATOR_DEST_IN */ + "DEST_OUT", /* CAIRO_OPERATOR_DEST_OUT */ + "DEST_ATOP", /* CAIRO_OPERATOR_DEST_ATOP */ + + "XOR", /* CAIRO_OPERATOR_XOR */ + "ADD", /* CAIRO_OPERATOR_ADD */ + "SATURATE", /* CAIRO_OPERATOR_SATURATE */ + + "MULTIPLY", /* CAIRO_OPERATOR_MULTIPLY */ + "SCREEN", /* CAIRO_OPERATOR_SCREEN */ + "OVERLAY", /* CAIRO_OPERATOR_OVERLAY */ + "DARKEN", /* CAIRO_OPERATOR_DARKEN */ + "LIGHTEN", /* CAIRO_OPERATOR_LIGHTEN */ + "DODGE", /* CAIRO_OPERATOR_COLOR_DODGE */ + "BURN", /* CAIRO_OPERATOR_COLOR_BURN */ + "HARD_LIGHT", /* CAIRO_OPERATOR_HARD_LIGHT */ + "SOFT_LIGHT", /* CAIRO_OPERATOR_SOFT_LIGHT */ + "DIFFERENCE", /* CAIRO_OPERATOR_DIFFERENCE */ + "EXCLUSION", /* CAIRO_OPERATOR_EXCLUSION */ + "HSL_HUE", /* CAIRO_OPERATOR_HSL_HUE */ + "HSL_SATURATION", /* CAIRO_OPERATOR_HSL_SATURATION */ + "HSL_COLOR", /* CAIRO_OPERATOR_HSL_COLOR */ + "HSL_LUMINOSITY" /* CAIRO_OPERATOR_HSL_LUMINOSITY */ + }; + assert (op < ARRAY_LENGTH (names)); + return names[op]; +} + +static const char * +_extend_to_string (cairo_extend_t extend) +{ + static const char *names[] = { + "EXTEND_NONE", /* CAIRO_EXTEND_NONE */ + "EXTEND_REPEAT", /* CAIRO_EXTEND_REPEAT */ + "EXTEND_REFLECT", /* CAIRO_EXTEND_REFLECT */ + "EXTEND_PAD" /* CAIRO_EXTEND_PAD */ + }; + assert (extend < ARRAY_LENGTH (names)); + return names[extend]; +} + +static const char * +_filter_to_string (cairo_filter_t filter) +{ + static const char *names[] = { + "FILTER_FAST", /* CAIRO_FILTER_FAST */ + "FILTER_GOOD", /* CAIRO_FILTER_GOOD */ + "FILTER_BEST", /* CAIRO_FILTER_BEST */ + "FILTER_NEAREST", /* CAIRO_FILTER_NEAREST */ + "FILTER_BILINEAR", /* CAIRO_FILTER_BILINEAR */ + "FILTER_GAUSSIAN", /* CAIRO_FILTER_GAUSSIAN */ + }; + assert (filter < ARRAY_LENGTH (names)); + return names[filter]; +} + +static const char * +_fill_rule_to_string (cairo_fill_rule_t rule) +{ + static const char *names[] = { + "WINDING", /* CAIRO_FILL_RULE_WINDING */ + "EVEN_ODD" /* CAIRO_FILL_RILE_EVEN_ODD */ + }; + assert (rule < ARRAY_LENGTH (names)); + return names[rule]; +} + +static const char * +_antialias_to_string (cairo_antialias_t antialias) +{ + static const char *names[] = { + "DEFAULT", /* CAIRO_ANTIALIAS_DEFAULT */ + "NONE", /* CAIRO_ANTIALIAS_NONE */ + "GRAY", /* CAIRO_ANTIALIAS_GRAY */ + "SUBPIXEL", /* CAIRO_ANTIALIAS_SUBPIXEL */ + "FAST", /* CAIRO_ANTIALIAS_FAST */ + "GOOD", /* CAIRO_ANTIALIAS_GOOD */ + "BEST", /* CAIRO_ANTIALIAS_BEST */ + }; + assert (antialias < ARRAY_LENGTH (names)); + return names[antialias]; +} + +static const char * +_line_cap_to_string (cairo_line_cap_t line_cap) +{ + static const char *names[] = { + "LINE_CAP_BUTT", /* CAIRO_LINE_CAP_BUTT */ + "LINE_CAP_ROUND", /* CAIRO_LINE_CAP_ROUND */ + "LINE_CAP_SQUARE" /* CAIRO_LINE_CAP_SQUARE */ + }; + assert (line_cap < ARRAY_LENGTH (names)); + return names[line_cap]; +} + +static const char * +_line_join_to_string (cairo_line_join_t line_join) +{ + static const char *names[] = { + "LINE_JOIN_MITER", /* CAIRO_LINE_JOIN_MITER */ + "LINE_JOIN_ROUND", /* CAIRO_LINE_JOIN_ROUND */ + "LINE_JOIN_BEVEL", /* CAIRO_LINE_JOIN_BEVEL */ + }; + assert (line_join < ARRAY_LENGTH (names)); + return names[line_join]; +} + +static const char * +_content_to_string (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: return "ALPHA"; + case CAIRO_CONTENT_COLOR: return "COLOR"; + default: + case CAIRO_CONTENT_COLOR_ALPHA: return "COLOR_ALPHA"; + } +} + +static const char * +_format_to_string (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: return "ARGB32"; + case CAIRO_FORMAT_RGB30: return "RGB30"; + case CAIRO_FORMAT_RGB24: return "RGB24"; + case CAIRO_FORMAT_RGB16_565: return "RGB16_565"; + case CAIRO_FORMAT_A8: return "A8"; + case CAIRO_FORMAT_A1: return "A1"; + case CAIRO_FORMAT_INVALID: return "INVALID"; + } + ASSERT_NOT_REACHED; + return "INVALID"; +} + +static cairo_status_t +_device_flush (void *abstract_device) +{ + cairo_xml_t *xml = abstract_device; + cairo_status_t status; + + status = _cairo_output_stream_flush (xml->stream); + + return status; +} + +static void +_device_destroy (void *abstract_device) +{ + cairo_xml_t *xml = abstract_device; + cairo_status_t status; + + status = _cairo_output_stream_destroy (xml->stream); + + free (xml); +} + +static const cairo_device_backend_t _cairo_xml_device_backend = { + CAIRO_DEVICE_TYPE_XML, + + NULL, NULL, /* lock, unlock */ + + _device_flush, + NULL, /* finish */ + _device_destroy +}; + +static cairo_device_t * +_cairo_xml_create_internal (cairo_output_stream_t *stream) +{ + cairo_xml_t *xml; + + xml = malloc (sizeof (cairo_xml_t)); + if (unlikely (xml == NULL)) + return _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + + memset (xml, 0, sizeof (cairo_xml_t)); + + _cairo_device_init (&xml->base, &_cairo_xml_device_backend); + + xml->indent = 0; + xml->stream = stream; + + return &xml->base; +} + +static void +_cairo_xml_indent (cairo_xml_t *xml, int indent) +{ + xml->indent += indent; + assert (xml->indent >= 0); +} + +static void CAIRO_PRINTF_FORMAT (2, 3) +_cairo_xml_printf (cairo_xml_t *xml, const char *fmt, ...) +{ + va_list ap; + char indent[80]; + int len; + + len = MIN (xml->indent, ARRAY_LENGTH (indent)); + memset (indent, ' ', len); + _cairo_output_stream_write (xml->stream, indent, len); + + va_start (ap, fmt); + _cairo_output_stream_vprintf (xml->stream, fmt, ap); + va_end (ap); + + _cairo_output_stream_write (xml->stream, "\n", 1); +} + +static void CAIRO_PRINTF_FORMAT (2, 3) +_cairo_xml_printf_start (cairo_xml_t *xml, const char *fmt, ...) +{ + char indent[80]; + int len; + + len = MIN (xml->indent, ARRAY_LENGTH (indent)); + memset (indent, ' ', len); + _cairo_output_stream_write (xml->stream, indent, len); + + if (fmt != NULL) { + va_list ap; + + va_start (ap, fmt); + _cairo_output_stream_vprintf (xml->stream, fmt, ap); + va_end (ap); + } +} + +static void CAIRO_PRINTF_FORMAT (2, 3) +_cairo_xml_printf_continue (cairo_xml_t *xml, const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + _cairo_output_stream_vprintf (xml->stream, fmt, ap); + va_end (ap); +} + +static void CAIRO_PRINTF_FORMAT (2, 3) +_cairo_xml_printf_end (cairo_xml_t *xml, const char *fmt, ...) +{ + if (fmt != NULL) { + va_list ap; + + va_start (ap, fmt); + _cairo_output_stream_vprintf (xml->stream, fmt, ap); + va_end (ap); + } + + _cairo_output_stream_write (xml->stream, "\n", 1); +} + +static cairo_surface_t * +_cairo_xml_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_rectangle_t extents; + + extents.x = extents.y = 0; + extents.width = width; + extents.height = height; + + return cairo_recording_surface_create (content, &extents); +} + +static cairo_bool_t +_cairo_xml_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_xml_surface_t *surface = abstract_surface; + + if (surface->width < 0 || surface->height < 0) + return FALSE; + + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = surface->width; + rectangle->height = surface->height; + + return TRUE; +} + +static cairo_status_t +_cairo_xml_move_to (void *closure, + const cairo_point_t *p1) +{ + _cairo_xml_printf_continue (closure, " %f %f m", + _cairo_fixed_to_double (p1->x), + _cairo_fixed_to_double (p1->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_line_to (void *closure, + const cairo_point_t *p1) +{ + _cairo_xml_printf_continue (closure, " %f %f l", + _cairo_fixed_to_double (p1->x), + _cairo_fixed_to_double (p1->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_curve_to (void *closure, + const cairo_point_t *p1, + const cairo_point_t *p2, + const cairo_point_t *p3) +{ + _cairo_xml_printf_continue (closure, " %f %f %f %f %f %f c", + _cairo_fixed_to_double (p1->x), + _cairo_fixed_to_double (p1->y), + _cairo_fixed_to_double (p2->x), + _cairo_fixed_to_double (p2->y), + _cairo_fixed_to_double (p3->x), + _cairo_fixed_to_double (p3->y)); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_close_path (void *closure) +{ + _cairo_xml_printf_continue (closure, " h"); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_xml_emit_path (cairo_xml_t *xml, + const cairo_path_fixed_t *path) +{ + cairo_status_t status; + + _cairo_xml_printf_start (xml, ""); + status = _cairo_path_fixed_interpret (path, + _cairo_xml_move_to, + _cairo_xml_line_to, + _cairo_xml_curve_to, + _cairo_xml_close_path, + xml); + assert (status == CAIRO_STATUS_SUCCESS); + _cairo_xml_printf_end (xml, ""); +} + +static void +_cairo_xml_emit_string (cairo_xml_t *xml, + const char *node, + const char *data) +{ + _cairo_xml_printf (xml, "<%s>%s", node, data, node); +} + +static void +_cairo_xml_emit_double (cairo_xml_t *xml, + const char *node, + double data) +{ + _cairo_xml_printf (xml, "<%s>%f", node, data, node); +} + +static cairo_xml_t * +to_xml (cairo_xml_surface_t *surface) +{ + return (cairo_xml_t *) surface->base.device; +} + +static cairo_status_t +_cairo_xml_surface_emit_clip_boxes (cairo_xml_surface_t *surface, + const cairo_clip_t *clip) +{ + cairo_box_t *box; + cairo_xml_t *xml; + int n; + + if (clip->num_boxes == 0) + return CAIRO_STATUS_SUCCESS; + + /* skip the trivial clip covering the surface extents */ + if (surface->width >= 0 && surface->height >= 0 && clip->num_boxes == 1) { + box = &clip->boxes[0]; + if (box->p1.x <= 0 && box->p1.y <= 0 && + box->p2.x - box->p1.x >= _cairo_fixed_from_double (surface->width) && + box->p2.y - box->p1.y >= _cairo_fixed_from_double (surface->height)) + { + return CAIRO_STATUS_SUCCESS; + } + } + + xml = to_xml (surface); + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + for (n = 0; n < clip->num_boxes; n++) { + box = &clip->boxes[n]; + + _cairo_xml_printf_start (xml, "%f %f m", + _cairo_fixed_to_double (box->p1.x), + _cairo_fixed_to_double (box->p1.y)); + _cairo_xml_printf_continue (xml, " %f %f l", + _cairo_fixed_to_double (box->p2.x), + _cairo_fixed_to_double (box->p1.y)); + _cairo_xml_printf_continue (xml, " %f %f l", + _cairo_fixed_to_double (box->p2.x), + _cairo_fixed_to_double (box->p2.y)); + _cairo_xml_printf_continue (xml, " %f %f l", + _cairo_fixed_to_double (box->p1.x), + _cairo_fixed_to_double (box->p2.y)); + _cairo_xml_printf_end (xml, " h"); + } + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + _cairo_xml_emit_double (xml, "tolerance", 1.0); + _cairo_xml_emit_string (xml, "antialias", + _antialias_to_string (CAIRO_ANTIALIAS_NONE)); + _cairo_xml_emit_string (xml, "fill-rule", + _fill_rule_to_string (CAIRO_FILL_RULE_WINDING)); + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_surface_emit_clip_path (cairo_xml_surface_t *surface, + const cairo_clip_path_t *clip_path) +{ + cairo_box_t box; + cairo_status_t status; + cairo_xml_t *xml; + + if (clip_path == NULL) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_xml_surface_emit_clip_path (surface, clip_path->prev); + if (unlikely (status)) + return status; + + /* skip the trivial clip covering the surface extents */ + if (surface->width >= 0 && surface->height >= 0 && + _cairo_path_fixed_is_box (&clip_path->path, &box)) + { + if (box.p1.x <= 0 && box.p1.y <= 0 && + box.p2.x - box.p1.x >= _cairo_fixed_from_double (surface->width) && + box.p2.y - box.p1.y >= _cairo_fixed_from_double (surface->height)) + { + return CAIRO_STATUS_SUCCESS; + } + } + + xml = to_xml (surface); + + _cairo_xml_printf_start (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_emit_path (xml, &clip_path->path); + _cairo_xml_emit_double (xml, "tolerance", clip_path->tolerance); + _cairo_xml_emit_string (xml, "antialias", + _antialias_to_string (clip_path->antialias)); + _cairo_xml_emit_string (xml, "fill-rule", + _fill_rule_to_string (clip_path->fill_rule)); + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf_end (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_surface_emit_clip (cairo_xml_surface_t *surface, + const cairo_clip_t *clip) +{ + cairo_status_t status; + + if (clip == NULL) + return CAIRO_STATUS_SUCCESS; + + status = _cairo_xml_surface_emit_clip_boxes (surface, clip); + if (unlikely (status)) + return status; + + return _cairo_xml_surface_emit_clip_path (surface, clip->path); +} + +static cairo_status_t +_cairo_xml_emit_solid (cairo_xml_t *xml, + const cairo_solid_pattern_t *solid) +{ + _cairo_xml_printf (xml, "%f %f %f %f", + solid->color.red, + solid->color.green, + solid->color.blue, + solid->color.alpha); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_xml_emit_matrix (cairo_xml_t *xml, + const cairo_matrix_t *matrix) +{ + if (! _cairo_matrix_is_identity (matrix)) { + _cairo_xml_printf (xml, "%f %f %f %f %f %f", + matrix->xx, matrix->yx, + matrix->xy, matrix->yy, + matrix->x0, matrix->y0); + } +} + +static void +_cairo_xml_emit_gradient (cairo_xml_t *xml, + const cairo_gradient_pattern_t *gradient) +{ + unsigned int i; + + for (i = 0; i < gradient->n_stops; i++) { + _cairo_xml_printf (xml, + "%f %f %f %f %f", + gradient->stops[i].offset, + gradient->stops[i].color.red, + gradient->stops[i].color.green, + gradient->stops[i].color.blue, + gradient->stops[i].color.alpha); + } +} + +static cairo_status_t +_cairo_xml_emit_linear (cairo_xml_t *xml, + const cairo_linear_pattern_t *linear) +{ + _cairo_xml_printf (xml, + "", + linear->pd1.x, linear->pd1.y, + linear->pd2.x, linear->pd2.y); + _cairo_xml_indent (xml, 2); + _cairo_xml_emit_gradient (xml, &linear->base); + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_emit_radial (cairo_xml_t *xml, + const cairo_radial_pattern_t *radial) +{ + _cairo_xml_printf (xml, + "", + radial->cd1.center.x, radial->cd1.center.y, radial->cd1.radius, + radial->cd2.center.x, radial->cd2.center.y, radial->cd2.radius); + _cairo_xml_indent (xml, 2); + _cairo_xml_emit_gradient (xml, &radial->base); + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_write_func (void *closure, const unsigned char *data, unsigned len) +{ + _cairo_output_stream_write (closure, data, len); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_emit_image (cairo_xml_t *xml, + cairo_image_surface_t *image) +{ + cairo_output_stream_t *stream; + cairo_status_t status; + + _cairo_xml_printf_start (xml, + "", + image->width, image->height, + _format_to_string (image->format)); + + stream = _cairo_base64_stream_create (xml->stream); + status = cairo_surface_write_to_png_stream (&image->base, + _write_func, stream); + assert (status == CAIRO_STATUS_SUCCESS); + status = _cairo_output_stream_destroy (stream); + if (unlikely (status)) + return status; + + _cairo_xml_printf_end (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_emit_surface (cairo_xml_t *xml, + const cairo_surface_pattern_t *pattern) +{ + cairo_surface_t *source = pattern->surface; + cairo_status_t status; + + if (_cairo_surface_is_recording (source)) { + status = cairo_xml_for_recording_surface (&xml->base, source); + } else { + cairo_image_surface_t *image; + void *image_extra; + + status = _cairo_surface_acquire_source_image (source, + &image, &image_extra); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_image (xml, image); + + _cairo_surface_release_source_image (source, image, image_extra); + } + + return status; +} + +static cairo_status_t +_cairo_xml_emit_pattern (cairo_xml_t *xml, + const char *source_or_mask, + const cairo_pattern_t *pattern) +{ + cairo_status_t status; + + _cairo_xml_printf (xml, "<%s-pattern>", source_or_mask); + _cairo_xml_indent (xml, 2); + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + status = _cairo_xml_emit_solid (xml, (cairo_solid_pattern_t *) pattern); + break; + case CAIRO_PATTERN_TYPE_LINEAR: + status = _cairo_xml_emit_linear (xml, (cairo_linear_pattern_t *) pattern); + break; + case CAIRO_PATTERN_TYPE_RADIAL: + status = _cairo_xml_emit_radial (xml, (cairo_radial_pattern_t *) pattern); + break; + case CAIRO_PATTERN_TYPE_SURFACE: + status = _cairo_xml_emit_surface (xml, (cairo_surface_pattern_t *) pattern); + break; + default: + ASSERT_NOT_REACHED; + status = CAIRO_INT_STATUS_UNSUPPORTED; + break; + } + + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) { + _cairo_xml_emit_matrix (xml, &pattern->matrix); + _cairo_xml_printf (xml, + "%s", + _extend_to_string (pattern->extend)); + _cairo_xml_printf (xml, + "%s", + _filter_to_string (pattern->filter)); + } + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, "", source_or_mask); + + return status; +} + +static cairo_int_status_t +_cairo_xml_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_xml_surface_t *surface = abstract_surface; + cairo_xml_t *xml = to_xml (surface); + cairo_status_t status; + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); + + status = _cairo_xml_surface_emit_clip (surface, clip); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_pattern (xml, "source", source); + if (unlikely (status)) + return status; + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_xml_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_xml_surface_t *surface = abstract_surface; + cairo_xml_t *xml = to_xml (surface); + cairo_status_t status; + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); + + status = _cairo_xml_surface_emit_clip (surface, clip); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_pattern (xml, "source", source); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_pattern (xml, "mask", mask); + if (unlikely (status)) + return status; + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_xml_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_xml_surface_t *surface = abstract_surface; + cairo_xml_t *xml = to_xml (surface); + cairo_status_t status; + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); + _cairo_xml_emit_double (xml, "line-width", style->line_width); + _cairo_xml_emit_double (xml, "miter-limit", style->miter_limit); + _cairo_xml_emit_string (xml, "line-cap", _line_cap_to_string (style->line_cap)); + _cairo_xml_emit_string (xml, "line-join", _line_join_to_string (style->line_join)); + + status = _cairo_xml_surface_emit_clip (surface, clip); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_pattern (xml, "source", source); + if (unlikely (status)) + return status; + + if (style->num_dashes) { + unsigned int i; + + _cairo_xml_printf_start (xml, "", + style->dash_offset); + for (i = 0; i < style->num_dashes; i++) + _cairo_xml_printf_continue (xml, "%f ", style->dash[i]); + + _cairo_xml_printf_end (xml, ""); + } + + _cairo_xml_emit_path (xml, path); + _cairo_xml_emit_double (xml, "tolerance", tolerance); + _cairo_xml_emit_string (xml, "antialias", _antialias_to_string (antialias)); + + _cairo_xml_emit_matrix (xml, ctm); + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_xml_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t*path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_xml_surface_t *surface = abstract_surface; + cairo_xml_t *xml = to_xml (surface); + cairo_status_t status; + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); + + status = _cairo_xml_surface_emit_clip (surface, clip); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_pattern (xml, "source", source); + if (unlikely (status)) + return status; + + _cairo_xml_emit_path (xml, path); + _cairo_xml_emit_double (xml, "tolerance", tolerance); + _cairo_xml_emit_string (xml, "antialias", _antialias_to_string (antialias)); + _cairo_xml_emit_string (xml, "fill-rule", _fill_rule_to_string (fill_rule)); + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +#if CAIRO_HAS_FT_FONT +#include "cairo-ft-private.h" +static cairo_status_t +_cairo_xml_emit_type42_font (cairo_xml_t *xml, + cairo_scaled_font_t *scaled_font) +{ + const cairo_scaled_font_backend_t *backend; + cairo_output_stream_t *base64_stream; + cairo_output_stream_t *zlib_stream; + cairo_status_t status, status2; + unsigned long size; + uint32_t len; + uint8_t *buf; + + backend = scaled_font->backend; + if (backend->load_truetype_table == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + size = 0; + status = backend->load_truetype_table (scaled_font, 0, 0, NULL, &size); + if (unlikely (status)) + return status; + + buf = malloc (size); + if (unlikely (buf == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = backend->load_truetype_table (scaled_font, 0, 0, buf, &size); + if (unlikely (status)) { + free (buf); + return status; + } + + _cairo_xml_printf_start (xml, "", + _cairo_ft_scaled_font_get_load_flags (scaled_font)); + + + base64_stream = _cairo_base64_stream_create (xml->stream); + len = size; + _cairo_output_stream_write (base64_stream, &len, sizeof (len)); + + zlib_stream = _cairo_deflate_stream_create (base64_stream); + + _cairo_output_stream_write (zlib_stream, buf, size); + free (buf); + + status2 = _cairo_output_stream_destroy (zlib_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + status2 = _cairo_output_stream_destroy (base64_stream); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + _cairo_xml_printf_end (xml, ""); + + return status; +} +#else +static cairo_status_t +_cairo_xml_emit_type42_font (cairo_xml_t *xml, + cairo_scaled_font_t *scaled_font) +{ + return CAIRO_INT_STATUS_UNSUPPORTED; +} +#endif + +static cairo_status_t +_cairo_xml_emit_type3_font (cairo_xml_t *xml, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs) +{ + _cairo_xml_printf_start (xml, ""); + _cairo_xml_printf_end (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_xml_emit_scaled_font (cairo_xml_t *xml, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs) +{ + cairo_int_status_t status; + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + status = _cairo_xml_emit_type42_font (xml, scaled_font); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_xml_emit_type3_font (xml, scaled_font, + glyphs, num_glyphs); + } + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return status; +} + +static cairo_int_status_t +_cairo_xml_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_xml_surface_t *surface = abstract_surface; + cairo_xml_t *xml = to_xml (surface); + cairo_status_t status; + int i; + + _cairo_xml_printf (xml, ""); + _cairo_xml_indent (xml, 2); + + _cairo_xml_emit_string (xml, "operator", _operator_to_string (op)); + + status = _cairo_xml_surface_emit_clip (surface, clip); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_pattern (xml, "source", source); + if (unlikely (status)) + return status; + + status = _cairo_xml_emit_scaled_font (xml, scaled_font, glyphs, num_glyphs); + if (unlikely (status)) + return status; + + for (i = 0; i < num_glyphs; i++) { + _cairo_xml_printf (xml, "%f %f", + glyphs[i].index, + glyphs[i].x, + glyphs[i].y); + } + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t +_cairo_xml_surface_backend = { + CAIRO_SURFACE_TYPE_XML, + NULL, + + _cairo_default_context_create, + + _cairo_xml_surface_create_similar, + NULL, /* create_similar_image */ + NULL, /* map_to_image */ + NULL, /* unmap_image */ + + _cairo_surface_default_source, + NULL, /* acquire source image */ + NULL, /* release source image */ + NULL, /* snapshot */ + + NULL, /* copy page */ + NULL, /* show page */ + + _cairo_xml_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_xml_surface_paint, + _cairo_xml_surface_mask, + _cairo_xml_surface_stroke, + _cairo_xml_surface_fill, + NULL, /* fill_stroke */ + _cairo_xml_surface_glyphs, +}; + +static cairo_surface_t * +_cairo_xml_surface_create_internal (cairo_device_t *device, + cairo_content_t content, + double width, + double height) +{ + cairo_xml_surface_t *surface; + + surface = malloc (sizeof (cairo_xml_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &_cairo_xml_surface_backend, + device, + content); + + surface->width = width; + surface->height = height; + + return &surface->base; +} + +cairo_device_t * +cairo_xml_create (const char *filename) +{ + cairo_output_stream_t *stream; + cairo_status_t status; + + stream = _cairo_output_stream_create_for_filename (filename); + if ((status = _cairo_output_stream_get_status (stream))) + return _cairo_device_create_in_error (status); + + return _cairo_xml_create_internal (stream); +} + +cairo_device_t * +cairo_xml_create_for_stream (cairo_write_func_t write_func, + void *closure) +{ + cairo_output_stream_t *stream; + cairo_status_t status; + + stream = _cairo_output_stream_create (write_func, NULL, closure); + if ((status = _cairo_output_stream_get_status (stream))) + return _cairo_device_create_in_error (status); + + return _cairo_xml_create_internal (stream); +} + +cairo_surface_t * +cairo_xml_surface_create (cairo_device_t *device, + cairo_content_t content, + double width, double height) +{ + if (unlikely (device->backend->type != CAIRO_DEVICE_TYPE_XML)) + return _cairo_surface_create_in_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + + if (unlikely (device->status)) + return _cairo_surface_create_in_error (device->status); + + return _cairo_xml_surface_create_internal (device, content, width, height); +} + +cairo_status_t +cairo_xml_for_recording_surface (cairo_device_t *device, + cairo_surface_t *recording_surface) +{ + cairo_box_t bbox; + cairo_rectangle_int_t extents; + cairo_surface_t *surface; + cairo_xml_t *xml; + cairo_status_t status; + + if (unlikely (device->status)) + return device->status; + + if (unlikely (recording_surface->status)) + return recording_surface->status; + + if (unlikely (device->backend->type != CAIRO_DEVICE_TYPE_XML)) + return _cairo_error (CAIRO_STATUS_DEVICE_TYPE_MISMATCH); + + if (unlikely (! _cairo_surface_is_recording (recording_surface))) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + + status = _cairo_recording_surface_get_bbox ((cairo_recording_surface_t *) recording_surface, + &bbox, NULL); + if (unlikely (status)) + return status; + + _cairo_box_round_to_rectangle (&bbox, &extents); + surface = _cairo_xml_surface_create_internal (device, + recording_surface->content, + extents.width, + extents.height); + if (unlikely (surface->status)) + return surface->status; + + xml = (cairo_xml_t *) device; + + _cairo_xml_printf (xml, + "", + _content_to_string (recording_surface->content), + extents.width, extents.height); + _cairo_xml_indent (xml, 2); + + cairo_surface_set_device_offset (surface, -extents.x, -extents.y); + status = _cairo_recording_surface_replay (recording_surface, surface); + cairo_surface_destroy (surface); + + _cairo_xml_indent (xml, -2); + _cairo_xml_printf (xml, ""); + + return status; +} +slim_hidden_def (cairo_xml_for_recording_surface); diff --git a/src/cairo-xml.h b/src/cairo-xml.h new file mode 100644 index 000000000..9ae76e90a --- /dev/null +++ b/src/cairo-xml.h @@ -0,0 +1,67 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_XML_H +#define CAIRO_XML_H + +#include "cairo.h" + +#if CAIRO_HAS_XML_SURFACE + +CAIRO_BEGIN_DECLS + +cairo_public cairo_device_t * +cairo_xml_create (const char *filename); + +cairo_public cairo_device_t * +cairo_xml_create_for_stream (cairo_write_func_t write_func, + void *closure); + +cairo_public cairo_surface_t * +cairo_xml_surface_create (cairo_device_t *xml, + cairo_content_t content, + double width, double height); + +cairo_public cairo_status_t +cairo_xml_for_recording_surface (cairo_device_t *xml, + cairo_surface_t *surface); + +CAIRO_END_DECLS + +#else /*CAIRO_HAS_XML_SURFACE*/ +# error Cairo was not compiled with support for the XML backend +#endif /*CAIRO_HAS_XML_SURFACE*/ + +#endif /*CAIRO_XML_H*/ diff --git a/src/cairo.c b/src/cairo.c new file mode 100644 index 000000000..e3acf4d46 --- /dev/null +++ b/src/cairo.c @@ -0,0 +1,4031 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" +#include "cairo-private.h" + +#include "cairo-backend-private.h" +#include "cairo-error-private.h" +#include "cairo-path-private.h" +#include "cairo-pattern-private.h" +#include "cairo-surface-private.h" +#include "cairo-surface-backend-private.h" + +#include + +/** + * SECTION:cairo + * @Title: cairo_t + * @Short_Description: The cairo drawing context + * @See_Also: #cairo_surface_t + * + * #cairo_t is the main object used when drawing with cairo. To + * draw with cairo, you create a #cairo_t, set the target surface, + * and drawing options for the #cairo_t, create shapes with + * functions like cairo_move_to() and cairo_line_to(), and then + * draw shapes with cairo_stroke() or cairo_fill(). + * + * #cairo_t's can be pushed to a stack via cairo_save(). + * They may then safely be changed, without losing the current state. + * Use cairo_restore() to restore to the saved state. + **/ + +/** + * SECTION:cairo-text + * @Title: text + * @Short_Description: Rendering text and glyphs + * @See_Also: #cairo_font_face_t, #cairo_scaled_font_t, cairo_text_path(), + * cairo_glyph_path() + * + * The functions with text in their name form cairo's + * toy text API. The toy API takes UTF-8 encoded + * text and is limited in its functionality to rendering simple + * left-to-right text with no advanced features. That means for example + * that most complex scripts like Hebrew, Arabic, and Indic scripts are + * out of question. No kerning or correct positioning of diacritical marks + * either. The font selection is pretty limited too and doesn't handle the + * case that the selected font does not cover the characters in the text. + * This set of functions are really that, a toy text API, for testing and + * demonstration purposes. Any serious application should avoid them. + * + * The functions with glyphs in their name form cairo's + * low-level text API. The low-level API relies on + * the user to convert text to a set of glyph indexes and positions. This + * is a very hard problem and is best handled by external libraries, like + * the pangocairo that is part of the Pango text layout and rendering library. + * Pango is available from http://www.pango.org/. + **/ + +/** + * SECTION:cairo-transforms + * @Title: Transformations + * @Short_Description: Manipulating the current transformation matrix + * @See_Also: #cairo_matrix_t + * + * The current transformation matrix, ctm, is a + * two-dimensional affine transformation that maps all coordinates and other + * drawing instruments from the user space into the + * surface's canonical coordinate system, also known as the device + * space. + **/ + +#define DEFINE_NIL_CONTEXT(status) \ + { \ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \ + status, /* status */ \ + { 0, 0, 0, NULL }, /* user_data */ \ + NULL \ + } + +static const cairo_t _cairo_nil[] = { + DEFINE_NIL_CONTEXT (CAIRO_STATUS_NO_MEMORY), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_RESTORE), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_POP_GROUP), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_NO_CURRENT_POINT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_MATRIX), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STATUS), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_NULL_POINTER), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STRING), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_PATH_DATA), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_READ_ERROR), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_WRITE_ERROR), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_SURFACE_FINISHED), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_SURFACE_TYPE_MISMATCH), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_PATTERN_TYPE_MISMATCH), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_CONTENT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_FORMAT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_VISUAL), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_FILE_NOT_FOUND), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_DASH), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_DSC_COMMENT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_INDEX), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_TEMP_FILE_ERROR), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_STRIDE), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_FONT_TYPE_MISMATCH), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_IMMUTABLE), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_ERROR), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_NEGATIVE_COUNT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_CLUSTERS), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_SLANT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_WEIGHT), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_SIZE), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_TYPE_MISMATCH), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_ERROR), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_INVALID_MESH_CONSTRUCTION), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_DEVICE_FINISHED), + DEFINE_NIL_CONTEXT (CAIRO_STATUS_JBIG2_GLOBAL_MISSING) + +}; +COMPILE_TIME_ASSERT (ARRAY_LENGTH (_cairo_nil) == CAIRO_STATUS_LAST_STATUS - 1); + +/** + * _cairo_set_error: + * @cr: a cairo context + * @status: a status value indicating an error + * + * Atomically sets cr->status to @status and calls _cairo_error; + * Does nothing if status is %CAIRO_STATUS_SUCCESS. + * + * All assignments of an error status to cr->status should happen + * through _cairo_set_error(). Note that due to the nature of the atomic + * operation, it is not safe to call this function on the nil objects. + * + * The purpose of this function is to allow the user to set a + * breakpoint in _cairo_error() to generate a stack trace for when the + * user causes cairo to detect an error. + **/ +static void +_cairo_set_error (cairo_t *cr, cairo_status_t status) +{ + /* Don't overwrite an existing error. This preserves the first + * error, which is the most significant. */ + _cairo_status_set_error (&cr->status, _cairo_error (status)); +} + +cairo_t * +_cairo_create_in_error (cairo_status_t status) +{ + cairo_t *cr; + + assert (status != CAIRO_STATUS_SUCCESS); + + cr = (cairo_t *) &_cairo_nil[status - CAIRO_STATUS_NO_MEMORY]; + assert (status == cr->status); + + return cr; +} + +/** + * cairo_create: + * @target: target surface for the context + * + * Creates a new #cairo_t with all graphics state parameters set to + * default values and with @target as a target surface. The target + * surface should be constructed with a backend-specific function such + * as cairo_image_surface_create() (or any other + * cairo_backend_surface_create() + * variant). + * + * This function references @target, so you can immediately + * call cairo_surface_destroy() on it if you don't need to + * maintain a separate reference to it. + * + * Return value: a newly allocated #cairo_t with a reference + * count of 1. The initial reference count should be released + * with cairo_destroy() when you are done using the #cairo_t. + * This function never returns %NULL. If memory cannot be + * allocated, a special #cairo_t object will be returned on + * which cairo_status() returns %CAIRO_STATUS_NO_MEMORY. If + * you attempt to target a surface which does not support + * writing (such as #cairo_mime_surface_t) then a + * %CAIRO_STATUS_WRITE_ERROR will be raised. You can use this + * object normally, but no drawing will be done. + * + * Since: 1.0 + **/ +cairo_t * +cairo_create (cairo_surface_t *target) +{ + if (unlikely (target == NULL)) + return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_NULL_POINTER)); + if (unlikely (target->status)) + return _cairo_create_in_error (target->status); + if (unlikely (target->finished)) + return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + + if (target->backend->create_context == NULL) + return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_WRITE_ERROR)); + + return target->backend->create_context (target); + +} +slim_hidden_def (cairo_create); + +void +_cairo_init (cairo_t *cr, + const cairo_backend_t *backend) +{ + CAIRO_REFERENCE_COUNT_INIT (&cr->ref_count, 1); + cr->status = CAIRO_STATUS_SUCCESS; + _cairo_user_data_array_init (&cr->user_data); + + cr->backend = backend; +} + +/** + * cairo_reference: + * @cr: a #cairo_t + * + * Increases the reference count on @cr by one. This prevents + * @cr from being destroyed until a matching call to cairo_destroy() + * is made. + * + * The number of references to a #cairo_t can be get using + * cairo_get_reference_count(). + * + * Return value: the referenced #cairo_t. + * + * Since: 1.0 + **/ +cairo_t * +cairo_reference (cairo_t *cr) +{ + if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) + return cr; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&cr->ref_count)); + + _cairo_reference_count_inc (&cr->ref_count); + + return cr; +} + +void +_cairo_fini (cairo_t *cr) +{ + _cairo_user_data_array_fini (&cr->user_data); +} + +/** + * cairo_destroy: + * @cr: a #cairo_t + * + * Decreases the reference count on @cr by one. If the result + * is zero, then @cr and all associated resources are freed. + * See cairo_reference(). + * + * Since: 1.0 + **/ +void +cairo_destroy (cairo_t *cr) +{ + if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) + return; + + assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&cr->ref_count)); + + if (! _cairo_reference_count_dec_and_test (&cr->ref_count)) + return; + + cr->backend->destroy (cr); +} +slim_hidden_def (cairo_destroy); + +/** + * cairo_get_user_data: + * @cr: a #cairo_t + * @key: the address of the #cairo_user_data_key_t the user data was + * attached to + * + * Return user data previously attached to @cr using the specified + * key. If no user data has been attached with the given key this + * function returns %NULL. + * + * Return value: the user data previously attached or %NULL. + * + * Since: 1.4 + **/ +void * +cairo_get_user_data (cairo_t *cr, + const cairo_user_data_key_t *key) +{ + return _cairo_user_data_array_get_data (&cr->user_data, key); +} + +/** + * cairo_set_user_data: + * @cr: a #cairo_t + * @key: the address of a #cairo_user_data_key_t to attach the user data to + * @user_data: the user data to attach to the #cairo_t + * @destroy: a #cairo_destroy_func_t which will be called when the + * #cairo_t is destroyed or when new user data is attached using the + * same key. + * + * Attach user data to @cr. To remove user data from a surface, + * call this function with the key that was used to set it and %NULL + * for @data. + * + * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a + * slot could not be allocated for the user data. + * + * Since: 1.4 + **/ +cairo_status_t +cairo_set_user_data (cairo_t *cr, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy) +{ + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) + return cr->status; + + return _cairo_user_data_array_set_data (&cr->user_data, + key, user_data, destroy); +} + +/** + * cairo_get_reference_count: + * @cr: a #cairo_t + * + * Returns the current reference count of @cr. + * + * Return value: the current reference count of @cr. If the + * object is a nil object, 0 will be returned. + * + * Since: 1.4 + **/ +unsigned int +cairo_get_reference_count (cairo_t *cr) +{ + if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) + return 0; + + return CAIRO_REFERENCE_COUNT_GET_VALUE (&cr->ref_count); +} + +/** + * cairo_save: + * @cr: a #cairo_t + * + * Makes a copy of the current state of @cr and saves it + * on an internal stack of saved states for @cr. When + * cairo_restore() is called, @cr will be restored to + * the saved state. Multiple calls to cairo_save() and + * cairo_restore() can be nested; each call to cairo_restore() + * restores the state from the matching paired cairo_save(). + * + * It isn't necessary to clear all saved states before + * a #cairo_t is freed. If the reference count of a #cairo_t + * drops to zero in response to a call to cairo_destroy(), + * any saved states will be freed along with the #cairo_t. + * + * Since: 1.0 + **/ +void +cairo_save (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->save (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_save); + +/** + * cairo_restore: + * @cr: a #cairo_t + * + * Restores @cr to the state saved by a preceding call to + * cairo_save() and removes that state from the stack of + * saved states. + * + * Since: 1.0 + **/ +void +cairo_restore (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->restore (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_restore); + +/** + * cairo_push_group: + * @cr: a cairo context + * + * Temporarily redirects drawing to an intermediate surface known as a + * group. The redirection lasts until the group is completed by a call + * to cairo_pop_group() or cairo_pop_group_to_source(). These calls + * provide the result of any drawing to the group as a pattern, + * (either as an explicit object, or set as the source pattern). + * + * This group functionality can be convenient for performing + * intermediate compositing. One common use of a group is to render + * objects as opaque within the group, (so that they occlude each + * other), and then blend the result with translucence onto the + * destination. + * + * Groups can be nested arbitrarily deep by making balanced calls to + * cairo_push_group()/cairo_pop_group(). Each call pushes/pops the new + * target group onto/from a stack. + * + * The cairo_push_group() function calls cairo_save() so that any + * changes to the graphics state will not be visible outside the + * group, (the pop_group functions call cairo_restore()). + * + * By default the intermediate group will have a content type of + * %CAIRO_CONTENT_COLOR_ALPHA. Other content types can be chosen for + * the group by using cairo_push_group_with_content() instead. + * + * As an example, here is how one might fill and stroke a path with + * translucence, but without any portion of the fill being visible + * under the stroke: + * + * + * cairo_push_group (cr); + * cairo_set_source (cr, fill_pattern); + * cairo_fill_preserve (cr); + * cairo_set_source (cr, stroke_pattern); + * cairo_stroke (cr); + * cairo_pop_group_to_source (cr); + * cairo_paint_with_alpha (cr, alpha); + * + * + * Since: 1.2 + **/ +void +cairo_push_group (cairo_t *cr) +{ + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA); +} + +/** + * cairo_push_group_with_content: + * @cr: a cairo context + * @content: a #cairo_content_t indicating the type of group that + * will be created + * + * Temporarily redirects drawing to an intermediate surface known as a + * group. The redirection lasts until the group is completed by a call + * to cairo_pop_group() or cairo_pop_group_to_source(). These calls + * provide the result of any drawing to the group as a pattern, + * (either as an explicit object, or set as the source pattern). + * + * The group will have a content type of @content. The ability to + * control this content type is the only distinction between this + * function and cairo_push_group() which you should see for a more + * detailed description of group rendering. + * + * Since: 1.2 + **/ +void +cairo_push_group_with_content (cairo_t *cr, cairo_content_t content) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->push_group (cr, content); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_push_group_with_content); + +/** + * cairo_pop_group: + * @cr: a cairo context + * + * Terminates the redirection begun by a call to cairo_push_group() or + * cairo_push_group_with_content() and returns a new pattern + * containing the results of all drawing operations performed to the + * group. + * + * The cairo_pop_group() function calls cairo_restore(), (balancing a + * call to cairo_save() by the push_group function), so that any + * changes to the graphics state will not be visible outside the + * group. + * + * Return value: a newly created (surface) pattern containing the + * results of all drawing operations performed to the group. The + * caller owns the returned object and should call + * cairo_pattern_destroy() when finished with it. + * + * Since: 1.2 + **/ +cairo_pattern_t * +cairo_pop_group (cairo_t *cr) +{ + cairo_pattern_t *group_pattern; + + if (unlikely (cr->status)) + return _cairo_pattern_create_in_error (cr->status); + + group_pattern = cr->backend->pop_group (cr); + if (unlikely (group_pattern->status)) + _cairo_set_error (cr, group_pattern->status); + + return group_pattern; +} +slim_hidden_def(cairo_pop_group); + +/** + * cairo_pop_group_to_source: + * @cr: a cairo context + * + * Terminates the redirection begun by a call to cairo_push_group() or + * cairo_push_group_with_content() and installs the resulting pattern + * as the source pattern in the given cairo context. + * + * The behavior of this function is equivalent to the sequence of + * operations: + * + * + * cairo_pattern_t *group = cairo_pop_group (cr); + * cairo_set_source (cr, group); + * cairo_pattern_destroy (group); + * + * + * but is more convenient as their is no need for a variable to store + * the short-lived pointer to the pattern. + * + * The cairo_pop_group() function calls cairo_restore(), (balancing a + * call to cairo_save() by the push_group function), so that any + * changes to the graphics state will not be visible outside the + * group. + * + * Since: 1.2 + **/ +void +cairo_pop_group_to_source (cairo_t *cr) +{ + cairo_pattern_t *group_pattern; + + group_pattern = cairo_pop_group (cr); + cairo_set_source (cr, group_pattern); + cairo_pattern_destroy (group_pattern); +} + +/** + * cairo_set_operator: + * @cr: a #cairo_t + * @op: a compositing operator, specified as a #cairo_operator_t + * + * Sets the compositing operator to be used for all drawing + * operations. See #cairo_operator_t for details on the semantics of + * each available compositing operator. + * + * The default operator is %CAIRO_OPERATOR_OVER. + * + * Since: 1.0 + **/ +void +cairo_set_operator (cairo_t *cr, cairo_operator_t op) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_operator (cr, op); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_operator); + + +#if 0 +/** + * cairo_set_opacity: + * @cr: a #cairo_t + * @opacity: the level of opacity to use when compositing + * + * Sets the compositing opacity to be used for all drawing + * operations. The effect is to fade out the operations + * using the alpha value. + * + * The default opacity is 1. + * + * Since: TBD + **/ +void +cairo_set_opacity (cairo_t *cr, double opacity) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_opacity (cr, opacity); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +#endif + +/** + * cairo_set_source_rgb: + * @cr: a cairo context + * @red: red component of color + * @green: green component of color + * @blue: blue component of color + * + * Sets the source pattern within @cr to an opaque color. This opaque + * color will then be used for any subsequent drawing operation until + * a new source pattern is set. + * + * The color components are floating point numbers in the range 0 to + * 1. If the values passed in are outside that range, they will be + * clamped. + * + * The default source pattern is opaque black, (that is, it is + * equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, 0.0)). + * + * Since: 1.0 + **/ +void +cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_source_rgba (cr, red, green, blue, 1.); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_source_rgb); + +/** + * cairo_set_source_rgba: + * @cr: a cairo context + * @red: red component of color + * @green: green component of color + * @blue: blue component of color + * @alpha: alpha component of color + * + * Sets the source pattern within @cr to a translucent color. This + * color will then be used for any subsequent drawing operation until + * a new source pattern is set. + * + * The color and alpha components are floating point numbers in the + * range 0 to 1. If the values passed in are outside that range, they + * will be clamped. + * + * The default source pattern is opaque black, (that is, it is + * equivalent to cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0)). + * + * Since: 1.0 + **/ +void +cairo_set_source_rgba (cairo_t *cr, + double red, double green, double blue, + double alpha) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_source_rgba (cr, red, green, blue, alpha); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_set_source_surface: + * @cr: a cairo context + * @surface: a surface to be used to set the source pattern + * @x: User-space X coordinate for surface origin + * @y: User-space Y coordinate for surface origin + * + * This is a convenience function for creating a pattern from @surface + * and setting it as the source in @cr with cairo_set_source(). + * + * The @x and @y parameters give the user-space coordinate at which + * the surface origin should appear. (The surface origin is its + * upper-left corner before any transformation has been applied.) The + * @x and @y parameters are negated and then set as translation values + * in the pattern matrix. + * + * Other than the initial translation pattern matrix, as described + * above, all other pattern attributes, (such as its extend mode), are + * set to the default values as in cairo_pattern_create_for_surface(). + * The resulting pattern can be queried with cairo_get_source() so + * that these attributes can be modified if desired, (eg. to create a + * repeating pattern with cairo_pattern_set_extend()). + * + * Since: 1.0 + **/ +void +cairo_set_source_surface (cairo_t *cr, + cairo_surface_t *surface, + double x, + double y) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (unlikely (surface == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + status = cr->backend->set_source_surface (cr, surface, x, y); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_source_surface); + +/** + * cairo_set_source: + * @cr: a cairo context + * @source: a #cairo_pattern_t to be used as the source for + * subsequent drawing operations. + * + * Sets the source pattern within @cr to @source. This pattern + * will then be used for any subsequent drawing operation until a new + * source pattern is set. + * + * Note: The pattern's transformation matrix will be locked to the + * user space in effect at the time of cairo_set_source(). This means + * that further modifications of the current transformation matrix + * will not affect the source pattern. See cairo_pattern_set_matrix(). + * + * The default source pattern is a solid pattern that is opaque black, + * (that is, it is equivalent to cairo_set_source_rgb(cr, 0.0, 0.0, + * 0.0)). + * + * Since: 1.0 + **/ +void +cairo_set_source (cairo_t *cr, cairo_pattern_t *source) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (unlikely (source == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + if (unlikely (source->status)) { + _cairo_set_error (cr, source->status); + return; + } + + status = cr->backend->set_source (cr, source); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_source); + +/** + * cairo_get_source: + * @cr: a cairo context + * + * Gets the current source pattern for @cr. + * + * Return value: the current source pattern. This object is owned by + * cairo. To keep a reference to it, you must call + * cairo_pattern_reference(). + * + * Since: 1.0 + **/ +cairo_pattern_t * +cairo_get_source (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_pattern_create_in_error (cr->status); + + return cr->backend->get_source (cr); +} + +/** + * cairo_set_tolerance: + * @cr: a #cairo_t + * @tolerance: the tolerance, in device units (typically pixels) + * + * Sets the tolerance used when converting paths into trapezoids. + * Curved segments of the path will be subdivided until the maximum + * deviation between the original path and the polygonal approximation + * is less than @tolerance. The default value is 0.1. A larger + * value will give better performance, a smaller value, better + * appearance. (Reducing the value from the default value of 0.1 + * is unlikely to improve appearance significantly.) The accuracy of paths + * within Cairo is limited by the precision of its internal arithmetic, and + * the prescribed @tolerance is restricted to the smallest + * representable internal value. + * + * Since: 1.0 + **/ +void +cairo_set_tolerance (cairo_t *cr, double tolerance) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_tolerance (cr, tolerance); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_tolerance); + +/** + * cairo_set_antialias: + * @cr: a #cairo_t + * @antialias: the new antialiasing mode + * + * Set the antialiasing mode of the rasterizer used for drawing shapes. + * This value is a hint, and a particular backend may or may not support + * a particular value. At the current time, no backend supports + * %CAIRO_ANTIALIAS_SUBPIXEL when drawing shapes. + * + * Note that this option does not affect text rendering, instead see + * cairo_font_options_set_antialias(). + * + * Since: 1.0 + **/ +void +cairo_set_antialias (cairo_t *cr, cairo_antialias_t antialias) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_antialias (cr, antialias); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_set_fill_rule: + * @cr: a #cairo_t + * @fill_rule: a fill rule, specified as a #cairo_fill_rule_t + * + * Set the current fill rule within the cairo context. The fill rule + * is used to determine which regions are inside or outside a complex + * (potentially self-intersecting) path. The current fill rule affects + * both cairo_fill() and cairo_clip(). See #cairo_fill_rule_t for details + * on the semantics of each available fill rule. + * + * The default fill rule is %CAIRO_FILL_RULE_WINDING. + * + * Since: 1.0 + **/ +void +cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_fill_rule (cr, fill_rule); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_set_line_width: + * @cr: a #cairo_t + * @width: a line width + * + * Sets the current line width within the cairo context. The line + * width value specifies the diameter of a pen that is circular in + * user space, (though device-space pen may be an ellipse in general + * due to scaling/shear/rotation of the CTM). + * + * Note: When the description above refers to user space and CTM it + * refers to the user space and CTM in effect at the time of the + * stroking operation, not the user space and CTM in effect at the + * time of the call to cairo_set_line_width(). The simplest usage + * makes both of these spaces identical. That is, if there is no + * change to the CTM between a call to cairo_set_line_width() and the + * stroking operation, then one can just pass user-space values to + * cairo_set_line_width() and ignore this note. + * + * As with the other stroke parameters, the current line width is + * examined by cairo_stroke(), cairo_stroke_extents(), and + * cairo_stroke_to_path(), but does not have any effect during path + * construction. + * + * The default line width value is 2.0. + * + * Since: 1.0 + **/ +void +cairo_set_line_width (cairo_t *cr, double width) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (width < 0.) + width = 0.; + + status = cr->backend->set_line_width (cr, width); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_line_width); + +/** + * cairo_set_line_cap: + * @cr: a cairo context + * @line_cap: a line cap style + * + * Sets the current line cap style within the cairo context. See + * #cairo_line_cap_t for details about how the available line cap + * styles are drawn. + * + * As with the other stroke parameters, the current line cap style is + * examined by cairo_stroke(), cairo_stroke_extents(), and + * cairo_stroke_to_path(), but does not have any effect during path + * construction. + * + * The default line cap style is %CAIRO_LINE_CAP_BUTT. + * + * Since: 1.0 + **/ +void +cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_line_cap (cr, line_cap); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_line_cap); + +/** + * cairo_set_line_join: + * @cr: a cairo context + * @line_join: a line join style + * + * Sets the current line join style within the cairo context. See + * #cairo_line_join_t for details about how the available line join + * styles are drawn. + * + * As with the other stroke parameters, the current line join style is + * examined by cairo_stroke(), cairo_stroke_extents(), and + * cairo_stroke_to_path(), but does not have any effect during path + * construction. + * + * The default line join style is %CAIRO_LINE_JOIN_MITER. + * + * Since: 1.0 + **/ +void +cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_line_join (cr, line_join); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_line_join); + +/** + * cairo_set_dash: + * @cr: a cairo context + * @dashes: an array specifying alternate lengths of on and off stroke portions + * @num_dashes: the length of the dashes array + * @offset: an offset into the dash pattern at which the stroke should start + * + * Sets the dash pattern to be used by cairo_stroke(). A dash pattern + * is specified by @dashes, an array of positive values. Each value + * provides the length of alternate "on" and "off" portions of the + * stroke. The @offset specifies an offset into the pattern at which + * the stroke begins. + * + * Each "on" segment will have caps applied as if the segment were a + * separate sub-path. In particular, it is valid to use an "on" length + * of 0.0 with %CAIRO_LINE_CAP_ROUND or %CAIRO_LINE_CAP_SQUARE in order + * to distributed dots or squares along a path. + * + * Note: The length values are in user-space units as evaluated at the + * time of stroking. This is not necessarily the same as the user + * space at the time of cairo_set_dash(). + * + * If @num_dashes is 0 dashing is disabled. + * + * If @num_dashes is 1 a symmetric pattern is assumed with alternating + * on and off portions of the size specified by the single value in + * @dashes. + * + * If any value in @dashes is negative, or if all values are 0, then + * @cr will be put into an error state with a status of + * %CAIRO_STATUS_INVALID_DASH. + * + * Since: 1.0 + **/ +void +cairo_set_dash (cairo_t *cr, + const double *dashes, + int num_dashes, + double offset) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_dash (cr, dashes, num_dashes, offset); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_get_dash_count: + * @cr: a #cairo_t + * + * This function returns the length of the dash array in @cr (0 if dashing + * is not currently in effect). + * + * See also cairo_set_dash() and cairo_get_dash(). + * + * Return value: the length of the dash array, or 0 if no dash array set. + * + * Since: 1.4 + **/ +int +cairo_get_dash_count (cairo_t *cr) +{ + int num_dashes; + + if (unlikely (cr->status)) + return 0; + + cr->backend->get_dash (cr, NULL, &num_dashes, NULL); + + return num_dashes; +} + +/** + * cairo_get_dash: + * @cr: a #cairo_t + * @dashes: return value for the dash array, or %NULL + * @offset: return value for the current dash offset, or %NULL + * + * Gets the current dash array. If not %NULL, @dashes should be big + * enough to hold at least the number of values returned by + * cairo_get_dash_count(). + * + * Since: 1.4 + **/ +void +cairo_get_dash (cairo_t *cr, + double *dashes, + double *offset) +{ + if (unlikely (cr->status)) + return; + + cr->backend->get_dash (cr, dashes, NULL, offset); +} + +/** + * cairo_set_miter_limit: + * @cr: a cairo context + * @limit: miter limit to set + * + * Sets the current miter limit within the cairo context. + * + * If the current line join style is set to %CAIRO_LINE_JOIN_MITER + * (see cairo_set_line_join()), the miter limit is used to determine + * whether the lines should be joined with a bevel instead of a miter. + * Cairo divides the length of the miter by the line width. + * If the result is greater than the miter limit, the style is + * converted to a bevel. + * + * As with the other stroke parameters, the current line miter limit is + * examined by cairo_stroke(), cairo_stroke_extents(), and + * cairo_stroke_to_path(), but does not have any effect during path + * construction. + * + * The default miter limit value is 10.0, which will convert joins + * with interior angles less than 11 degrees to bevels instead of + * miters. For reference, a miter limit of 2.0 makes the miter cutoff + * at 60 degrees, and a miter limit of 1.414 makes the cutoff at 90 + * degrees. + * + * A miter limit for a desired angle can be computed as: miter limit = + * 1/sin(angle/2) + * + * Since: 1.0 + **/ +void +cairo_set_miter_limit (cairo_t *cr, double limit) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_miter_limit (cr, limit); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_translate: + * @cr: a cairo context + * @tx: amount to translate in the X direction + * @ty: amount to translate in the Y direction + * + * Modifies the current transformation matrix (CTM) by translating the + * user-space origin by (@tx, @ty). This offset is interpreted as a + * user-space coordinate according to the CTM in place before the new + * call to cairo_translate(). In other words, the translation of the + * user-space origin takes place after any existing transformation. + * + * Since: 1.0 + **/ +void +cairo_translate (cairo_t *cr, double tx, double ty) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->translate (cr, tx, ty); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_translate); + +/** + * cairo_scale: + * @cr: a cairo context + * @sx: scale factor for the X dimension + * @sy: scale factor for the Y dimension + * + * Modifies the current transformation matrix (CTM) by scaling the X + * and Y user-space axes by @sx and @sy respectively. The scaling of + * the axes takes place after any existing transformation of user + * space. + * + * Since: 1.0 + **/ +void +cairo_scale (cairo_t *cr, double sx, double sy) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->scale (cr, sx, sy); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_scale); + +/** + * cairo_rotate: + * @cr: a cairo context + * @angle: angle (in radians) by which the user-space axes will be + * rotated + * + * Modifies the current transformation matrix (CTM) by rotating the + * user-space axes by @angle radians. The rotation of the axes takes + * places after any existing transformation of user space. The + * rotation direction for positive angles is from the positive X axis + * toward the positive Y axis. + * + * Since: 1.0 + **/ +void +cairo_rotate (cairo_t *cr, double angle) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->rotate (cr, angle); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_transform: + * @cr: a cairo context + * @matrix: a transformation to be applied to the user-space axes + * + * Modifies the current transformation matrix (CTM) by applying + * @matrix as an additional transformation. The new transformation of + * user space takes place after any existing transformation. + * + * Since: 1.0 + **/ +void +cairo_transform (cairo_t *cr, + const cairo_matrix_t *matrix) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->transform (cr, matrix); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_transform); + +/** + * cairo_set_matrix: + * @cr: a cairo context + * @matrix: a transformation matrix from user space to device space + * + * Modifies the current transformation matrix (CTM) by setting it + * equal to @matrix. + * + * Since: 1.0 + **/ +void +cairo_set_matrix (cairo_t *cr, + const cairo_matrix_t *matrix) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_matrix (cr, matrix); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_matrix); + +/** + * cairo_identity_matrix: + * @cr: a cairo context + * + * Resets the current transformation matrix (CTM) by setting it equal + * to the identity matrix. That is, the user-space and device-space + * axes will be aligned and one user-space unit will transform to one + * device-space unit. + * + * Since: 1.0 + **/ +void +cairo_identity_matrix (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_identity_matrix (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_user_to_device: + * @cr: a cairo context + * @x: X value of coordinate (in/out parameter) + * @y: Y value of coordinate (in/out parameter) + * + * Transform a coordinate from user space to device space by + * multiplying the given point by the current transformation matrix + * (CTM). + * + * Since: 1.0 + **/ +void +cairo_user_to_device (cairo_t *cr, double *x, double *y) +{ + if (unlikely (cr->status)) + return; + + cr->backend->user_to_device (cr, x, y); +} +slim_hidden_def (cairo_user_to_device); + +/** + * cairo_user_to_device_distance: + * @cr: a cairo context + * @dx: X component of a distance vector (in/out parameter) + * @dy: Y component of a distance vector (in/out parameter) + * + * Transform a distance vector from user space to device space. This + * function is similar to cairo_user_to_device() except that the + * translation components of the CTM will be ignored when transforming + * (@dx,@dy). + * + * Since: 1.0 + **/ +void +cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy) +{ + if (unlikely (cr->status)) + return; + + cr->backend->user_to_device_distance (cr, dx, dy); +} +slim_hidden_def (cairo_user_to_device_distance); + +/** + * cairo_device_to_user: + * @cr: a cairo + * @x: X value of coordinate (in/out parameter) + * @y: Y value of coordinate (in/out parameter) + * + * Transform a coordinate from device space to user space by + * multiplying the given point by the inverse of the current + * transformation matrix (CTM). + * + * Since: 1.0 + **/ +void +cairo_device_to_user (cairo_t *cr, double *x, double *y) +{ + if (unlikely (cr->status)) + return; + + cr->backend->device_to_user (cr, x, y); +} +slim_hidden_def (cairo_device_to_user); + +/** + * cairo_device_to_user_distance: + * @cr: a cairo context + * @dx: X component of a distance vector (in/out parameter) + * @dy: Y component of a distance vector (in/out parameter) + * + * Transform a distance vector from device space to user space. This + * function is similar to cairo_device_to_user() except that the + * translation components of the inverse CTM will be ignored when + * transforming (@dx,@dy). + * + * Since: 1.0 + **/ +void +cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy) +{ + if (unlikely (cr->status)) + return; + + cr->backend->device_to_user_distance (cr, dx, dy); +} + +/** + * cairo_new_path: + * @cr: a cairo context + * + * Clears the current path. After this call there will be no path and + * no current point. + * + * Since: 1.0 + **/ +void +cairo_new_path (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->new_path (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_new_path); + +/** + * cairo_new_sub_path: + * @cr: a cairo context + * + * Begin a new sub-path. Note that the existing path is not + * affected. After this call there will be no current point. + * + * In many cases, this call is not needed since new sub-paths are + * frequently started with cairo_move_to(). + * + * A call to cairo_new_sub_path() is particularly useful when + * beginning a new sub-path with one of the cairo_arc() calls. This + * makes things easier as it is no longer necessary to manually + * compute the arc's initial coordinates for a call to + * cairo_move_to(). + * + * Since: 1.2 + **/ +void +cairo_new_sub_path (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->new_sub_path (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_move_to: + * @cr: a cairo context + * @x: the X coordinate of the new position + * @y: the Y coordinate of the new position + * + * Begin a new sub-path. After this call the current point will be (@x, + * @y). + * + * Since: 1.0 + **/ +void +cairo_move_to (cairo_t *cr, double x, double y) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->move_to (cr, x, y); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_move_to); + + +/** + * cairo_line_to: + * @cr: a cairo context + * @x: the X coordinate of the end of the new line + * @y: the Y coordinate of the end of the new line + * + * Adds a line to the path from the current point to position (@x, @y) + * in user-space coordinates. After this call the current point + * will be (@x, @y). + * + * If there is no current point before the call to cairo_line_to() + * this function will behave as cairo_move_to(@cr, @x, @y). + * + * Since: 1.0 + **/ +void +cairo_line_to (cairo_t *cr, double x, double y) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->line_to (cr, x, y); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_line_to); + +/** + * cairo_curve_to: + * @cr: a cairo context + * @x1: the X coordinate of the first control point + * @y1: the Y coordinate of the first control point + * @x2: the X coordinate of the second control point + * @y2: the Y coordinate of the second control point + * @x3: the X coordinate of the end of the curve + * @y3: the Y coordinate of the end of the curve + * + * Adds a cubic Bézier spline to the path from the current point to + * position (@x3, @y3) in user-space coordinates, using (@x1, @y1) and + * (@x2, @y2) as the control points. After this call the current point + * will be (@x3, @y3). + * + * If there is no current point before the call to cairo_curve_to() + * this function will behave as if preceded by a call to + * cairo_move_to(@cr, @x1, @y1). + * + * Since: 1.0 + **/ +void +cairo_curve_to (cairo_t *cr, + double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->curve_to (cr, + x1, y1, + x2, y2, + x3, y3); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_curve_to); + +/** + * cairo_arc: + * @cr: a cairo context + * @xc: X position of the center of the arc + * @yc: Y position of the center of the arc + * @radius: the radius of the arc + * @angle1: the start angle, in radians + * @angle2: the end angle, in radians + * + * Adds a circular arc of the given @radius to the current path. The + * arc is centered at (@xc, @yc), begins at @angle1 and proceeds in + * the direction of increasing angles to end at @angle2. If @angle2 is + * less than @angle1 it will be progressively increased by + * 2*M_PI until it is greater than @angle1. + * + * If there is a current point, an initial line segment will be added + * to the path to connect the current point to the beginning of the + * arc. If this initial line is undesired, it can be avoided by + * calling cairo_new_sub_path() before calling cairo_arc(). + * + * Angles are measured in radians. An angle of 0.0 is in the direction + * of the positive X axis (in user space). An angle of + * M_PI/2.0 radians (90 degrees) is in the + * direction of the positive Y axis (in user space). Angles increase + * in the direction from the positive X axis toward the positive Y + * axis. So with the default transformation matrix, angles increase in + * a clockwise direction. + * + * (To convert from degrees to radians, use degrees * (M_PI / + * 180.).) + * + * This function gives the arc in the direction of increasing angles; + * see cairo_arc_negative() to get the arc in the direction of + * decreasing angles. + * + * The arc is circular in user space. To achieve an elliptical arc, + * you can scale the current transformation matrix by different + * amounts in the X and Y directions. For example, to draw an ellipse + * in the box given by @x, @y, @width, @height: + * + * + * cairo_save (cr); + * cairo_translate (cr, x + width / 2., y + height / 2.); + * cairo_scale (cr, width / 2., height / 2.); + * cairo_arc (cr, 0., 0., 1., 0., 2 * M_PI); + * cairo_restore (cr); + * + * + * Since: 1.0 + **/ +void +cairo_arc (cairo_t *cr, + double xc, double yc, + double radius, + double angle1, double angle2) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (angle2 < angle1) { + /* increase angle2 by multiples of full circle until it + * satisfies angle2 >= angle1 */ + angle2 = fmod (angle2 - angle1, 2 * M_PI); + if (angle2 < 0) + angle2 += 2 * M_PI; + angle2 += angle1; + } + + status = cr->backend->arc (cr, xc, yc, radius, angle1, angle2, TRUE); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_arc_negative: + * @cr: a cairo context + * @xc: X position of the center of the arc + * @yc: Y position of the center of the arc + * @radius: the radius of the arc + * @angle1: the start angle, in radians + * @angle2: the end angle, in radians + * + * Adds a circular arc of the given @radius to the current path. The + * arc is centered at (@xc, @yc), begins at @angle1 and proceeds in + * the direction of decreasing angles to end at @angle2. If @angle2 is + * greater than @angle1 it will be progressively decreased by + * 2*M_PI until it is less than @angle1. + * + * See cairo_arc() for more details. This function differs only in the + * direction of the arc between the two angles. + * + * Since: 1.0 + **/ +void +cairo_arc_negative (cairo_t *cr, + double xc, double yc, + double radius, + double angle1, double angle2) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (angle2 > angle1) { + /* decrease angle2 by multiples of full circle until it + * satisfies angle2 <= angle1 */ + angle2 = fmod (angle2 - angle1, 2 * M_PI); + if (angle2 > 0) + angle2 -= 2 * M_PI; + angle2 += angle1; + } + + status = cr->backend->arc (cr, xc, yc, radius, angle1, angle2, FALSE); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/* XXX: NYI +void +cairo_arc_to (cairo_t *cr, + double x1, double y1, + double x2, double y2, + double radius) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->arc_to (cr, x1, y1, x2, y2, radius); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +void +cairo_rel_arc_to (cairo_t *cr, + double dx1, double dy1, + double dx2, double dy2, + double radius) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->rel_arc_to (cr, dx1, dy1, dx2, dy2, radius); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +*/ + +/** + * cairo_rel_move_to: + * @cr: a cairo context + * @dx: the X offset + * @dy: the Y offset + * + * Begin a new sub-path. After this call the current point will offset + * by (@x, @y). + * + * Given a current point of (x, y), cairo_rel_move_to(@cr, @dx, @dy) + * is logically equivalent to cairo_move_to(@cr, x + @dx, y + @dy). + * + * It is an error to call this function with no current point. Doing + * so will cause @cr to shutdown with a status of + * %CAIRO_STATUS_NO_CURRENT_POINT. + * + * Since: 1.0 + **/ +void +cairo_rel_move_to (cairo_t *cr, double dx, double dy) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->rel_move_to (cr, dx, dy); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_rel_line_to: + * @cr: a cairo context + * @dx: the X offset to the end of the new line + * @dy: the Y offset to the end of the new line + * + * Relative-coordinate version of cairo_line_to(). Adds a line to the + * path from the current point to a point that is offset from the + * current point by (@dx, @dy) in user space. After this call the + * current point will be offset by (@dx, @dy). + * + * Given a current point of (x, y), cairo_rel_line_to(@cr, @dx, @dy) + * is logically equivalent to cairo_line_to(@cr, x + @dx, y + @dy). + * + * It is an error to call this function with no current point. Doing + * so will cause @cr to shutdown with a status of + * %CAIRO_STATUS_NO_CURRENT_POINT. + * + * Since: 1.0 + **/ +void +cairo_rel_line_to (cairo_t *cr, double dx, double dy) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->rel_line_to (cr, dx, dy); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_rel_line_to); + +/** + * cairo_rel_curve_to: + * @cr: a cairo context + * @dx1: the X offset to the first control point + * @dy1: the Y offset to the first control point + * @dx2: the X offset to the second control point + * @dy2: the Y offset to the second control point + * @dx3: the X offset to the end of the curve + * @dy3: the Y offset to the end of the curve + * + * Relative-coordinate version of cairo_curve_to(). All offsets are + * relative to the current point. Adds a cubic Bézier spline to the + * path from the current point to a point offset from the current + * point by (@dx3, @dy3), using points offset by (@dx1, @dy1) and + * (@dx2, @dy2) as the control points. After this call the current + * point will be offset by (@dx3, @dy3). + * + * Given a current point of (x, y), cairo_rel_curve_to(@cr, @dx1, + * @dy1, @dx2, @dy2, @dx3, @dy3) is logically equivalent to + * cairo_curve_to(@cr, x+@dx1, y+@dy1, x+@dx2, y+@dy2, x+@dx3, y+@dy3). + * + * It is an error to call this function with no current point. Doing + * so will cause @cr to shutdown with a status of + * %CAIRO_STATUS_NO_CURRENT_POINT. + * + * Since: 1.0 + **/ +void +cairo_rel_curve_to (cairo_t *cr, + double dx1, double dy1, + double dx2, double dy2, + double dx3, double dy3) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->rel_curve_to (cr, + dx1, dy1, + dx2, dy2, + dx3, dy3); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_rectangle: + * @cr: a cairo context + * @x: the X coordinate of the top left corner of the rectangle + * @y: the Y coordinate to the top left corner of the rectangle + * @width: the width of the rectangle + * @height: the height of the rectangle + * + * Adds a closed sub-path rectangle of the given size to the current + * path at position (@x, @y) in user-space coordinates. + * + * This function is logically equivalent to: + * + * cairo_move_to (cr, x, y); + * cairo_rel_line_to (cr, width, 0); + * cairo_rel_line_to (cr, 0, height); + * cairo_rel_line_to (cr, -width, 0); + * cairo_close_path (cr); + * + * + * Since: 1.0 + **/ +void +cairo_rectangle (cairo_t *cr, + double x, double y, + double width, double height) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->rectangle (cr, x, y, width, height); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +#if 0 +/* XXX: NYI */ +void +cairo_stroke_to_path (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + /* The code in _cairo_recording_surface_get_path has a poorman's stroke_to_path */ + + status = _cairo_gstate_stroke_path (cr->gstate); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +#endif + +/** + * cairo_close_path: + * @cr: a cairo context + * + * Adds a line segment to the path from the current point to the + * beginning of the current sub-path, (the most recent point passed to + * cairo_move_to()), and closes this sub-path. After this call the + * current point will be at the joined endpoint of the sub-path. + * + * The behavior of cairo_close_path() is distinct from simply calling + * cairo_line_to() with the equivalent coordinate in the case of + * stroking. When a closed sub-path is stroked, there are no caps on + * the ends of the sub-path. Instead, there is a line join connecting + * the final and initial segments of the sub-path. + * + * If there is no current point before the call to cairo_close_path(), + * this function will have no effect. + * + * Note: As of cairo version 1.2.4 any call to cairo_close_path() will + * place an explicit MOVE_TO element into the path immediately after + * the CLOSE_PATH element, (which can be seen in cairo_copy_path() for + * example). This can simplify path processing in some cases as it may + * not be necessary to save the "last move_to point" during processing + * as the MOVE_TO immediately after the CLOSE_PATH will provide that + * point. + * + * Since: 1.0 + **/ +void +cairo_close_path (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->close_path (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_close_path); + +/** + * cairo_path_extents: + * @cr: a cairo context + * @x1: left of the resulting extents + * @y1: top of the resulting extents + * @x2: right of the resulting extents + * @y2: bottom of the resulting extents + * + * Computes a bounding box in user-space coordinates covering the + * points on the current path. If the current path is empty, returns + * an empty rectangle ((0,0), (0,0)). Stroke parameters, fill rule, + * surface dimensions and clipping are not taken into account. + * + * Contrast with cairo_fill_extents() and cairo_stroke_extents() which + * return the extents of only the area that would be "inked" by + * the corresponding drawing operations. + * + * The result of cairo_path_extents() is defined as equivalent to the + * limit of cairo_stroke_extents() with %CAIRO_LINE_CAP_ROUND as the + * line width approaches 0.0, (but never reaching the empty-rectangle + * returned by cairo_stroke_extents() for a line width of 0.0). + * + * Specifically, this means that zero-area sub-paths such as + * cairo_move_to();cairo_line_to() segments, (even degenerate cases + * where the coordinates to both calls are identical), will be + * considered as contributing to the extents. However, a lone + * cairo_move_to() will not contribute to the results of + * cairo_path_extents(). + * + * Since: 1.6 + **/ +void +cairo_path_extents (cairo_t *cr, + double *x1, double *y1, double *x2, double *y2) +{ + if (unlikely (cr->status)) { + if (x1) + *x1 = 0.0; + if (y1) + *y1 = 0.0; + if (x2) + *x2 = 0.0; + if (y2) + *y2 = 0.0; + + return; + } + + cr->backend->path_extents (cr, x1, y1, x2, y2); +} + +/** + * cairo_paint: + * @cr: a cairo context + * + * A drawing operator that paints the current source everywhere within + * the current clip region. + * + * Since: 1.0 + **/ +void +cairo_paint (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->paint (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_paint); + +/** + * cairo_paint_with_alpha: + * @cr: a cairo context + * @alpha: alpha value, between 0 (transparent) and 1 (opaque) + * + * A drawing operator that paints the current source everywhere within + * the current clip region using a mask of constant alpha value + * @alpha. The effect is similar to cairo_paint(), but the drawing + * is faded out using the alpha value. + * + * Since: 1.0 + **/ +void +cairo_paint_with_alpha (cairo_t *cr, + double alpha) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->paint_with_alpha (cr, alpha); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_mask: + * @cr: a cairo context + * @pattern: a #cairo_pattern_t + * + * A drawing operator that paints the current source + * using the alpha channel of @pattern as a mask. (Opaque + * areas of @pattern are painted with the source, transparent + * areas are not painted.) + * + * Since: 1.0 + **/ +void +cairo_mask (cairo_t *cr, + cairo_pattern_t *pattern) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (unlikely (pattern == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + if (unlikely (pattern->status)) { + _cairo_set_error (cr, pattern->status); + return; + } + + status = cr->backend->mask (cr, pattern); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_mask); + +/** + * cairo_mask_surface: + * @cr: a cairo context + * @surface: a #cairo_surface_t + * @surface_x: X coordinate at which to place the origin of @surface + * @surface_y: Y coordinate at which to place the origin of @surface + * + * A drawing operator that paints the current source + * using the alpha channel of @surface as a mask. (Opaque + * areas of @surface are painted with the source, transparent + * areas are not painted.) + * + * Since: 1.0 + **/ +void +cairo_mask_surface (cairo_t *cr, + cairo_surface_t *surface, + double surface_x, + double surface_y) +{ + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + + if (unlikely (cr->status)) + return; + + pattern = cairo_pattern_create_for_surface (surface); + + cairo_matrix_init_translate (&matrix, - surface_x, - surface_y); + cairo_pattern_set_matrix (pattern, &matrix); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + +/** + * cairo_stroke: + * @cr: a cairo context + * + * A drawing operator that strokes the current path according to the + * current line width, line join, line cap, and dash settings. After + * cairo_stroke(), the current path will be cleared from the cairo + * context. See cairo_set_line_width(), cairo_set_line_join(), + * cairo_set_line_cap(), cairo_set_dash(), and + * cairo_stroke_preserve(). + * + * Note: Degenerate segments and sub-paths are treated specially and + * provide a useful result. These can result in two different + * situations: + * + * 1. Zero-length "on" segments set in cairo_set_dash(). If the cap + * style is %CAIRO_LINE_CAP_ROUND or %CAIRO_LINE_CAP_SQUARE then these + * segments will be drawn as circular dots or squares respectively. In + * the case of %CAIRO_LINE_CAP_SQUARE, the orientation of the squares + * is determined by the direction of the underlying path. + * + * 2. A sub-path created by cairo_move_to() followed by either a + * cairo_close_path() or one or more calls to cairo_line_to() to the + * same coordinate as the cairo_move_to(). If the cap style is + * %CAIRO_LINE_CAP_ROUND then these sub-paths will be drawn as circular + * dots. Note that in the case of %CAIRO_LINE_CAP_SQUARE a degenerate + * sub-path will not be drawn at all, (since the correct orientation + * is indeterminate). + * + * In no case will a cap style of %CAIRO_LINE_CAP_BUTT cause anything + * to be drawn in the case of either degenerate segments or sub-paths. + * + * Since: 1.0 + **/ +void +cairo_stroke (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->stroke (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_stroke); + +/** + * cairo_stroke_preserve: + * @cr: a cairo context + * + * A drawing operator that strokes the current path according to the + * current line width, line join, line cap, and dash settings. Unlike + * cairo_stroke(), cairo_stroke_preserve() preserves the path within the + * cairo context. + * + * See cairo_set_line_width(), cairo_set_line_join(), + * cairo_set_line_cap(), cairo_set_dash(), and + * cairo_stroke_preserve(). + * + * Since: 1.0 + **/ +void +cairo_stroke_preserve (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->stroke_preserve (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_stroke_preserve); + +/** + * cairo_fill: + * @cr: a cairo context + * + * A drawing operator that fills the current path according to the + * current fill rule, (each sub-path is implicitly closed before being + * filled). After cairo_fill(), the current path will be cleared from + * the cairo context. See cairo_set_fill_rule() and + * cairo_fill_preserve(). + * + * Since: 1.0 + **/ +void +cairo_fill (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->fill (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_fill_preserve: + * @cr: a cairo context + * + * A drawing operator that fills the current path according to the + * current fill rule, (each sub-path is implicitly closed before being + * filled). Unlike cairo_fill(), cairo_fill_preserve() preserves the + * path within the cairo context. + * + * See cairo_set_fill_rule() and cairo_fill(). + * + * Since: 1.0 + **/ +void +cairo_fill_preserve (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->fill_preserve (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_fill_preserve); + +/** + * cairo_copy_page: + * @cr: a cairo context + * + * Emits the current page for backends that support multiple pages, but + * doesn't clear it, so, the contents of the current page will be retained + * for the next page too. Use cairo_show_page() if you want to get an + * empty page after the emission. + * + * This is a convenience function that simply calls + * cairo_surface_copy_page() on @cr's target. + * + * Since: 1.0 + **/ +void +cairo_copy_page (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->copy_page (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_show_page: + * @cr: a cairo context + * + * Emits and clears the current page for backends that support multiple + * pages. Use cairo_copy_page() if you don't want to clear the page. + * + * This is a convenience function that simply calls + * cairo_surface_show_page() on @cr's target. + * + * Since: 1.0 + **/ +void +cairo_show_page (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->show_page (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_in_stroke: + * @cr: a cairo context + * @x: X coordinate of the point to test + * @y: Y coordinate of the point to test + * + * Tests whether the given point is inside the area that would be + * affected by a cairo_stroke() operation given the current path and + * stroking parameters. Surface dimensions and clipping are not taken + * into account. + * + * See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), + * cairo_set_line_cap(), cairo_set_dash(), and + * cairo_stroke_preserve(). + * + * Return value: A non-zero value if the point is inside, or zero if + * outside. + * + * Since: 1.0 + **/ +cairo_bool_t +cairo_in_stroke (cairo_t *cr, double x, double y) +{ + cairo_status_t status; + cairo_bool_t inside = FALSE; + + if (unlikely (cr->status)) + return FALSE; + + status = cr->backend->in_stroke (cr, x, y, &inside); + if (unlikely (status)) + _cairo_set_error (cr, status); + + return inside; +} + +/** + * cairo_in_fill: + * @cr: a cairo context + * @x: X coordinate of the point to test + * @y: Y coordinate of the point to test + * + * Tests whether the given point is inside the area that would be + * affected by a cairo_fill() operation given the current path and + * filling parameters. Surface dimensions and clipping are not taken + * into account. + * + * See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve(). + * + * Return value: A non-zero value if the point is inside, or zero if + * outside. + * + * Since: 1.0 + **/ +cairo_bool_t +cairo_in_fill (cairo_t *cr, double x, double y) +{ + cairo_status_t status; + cairo_bool_t inside = FALSE; + + if (unlikely (cr->status)) + return FALSE; + + status = cr->backend->in_fill (cr, x, y, &inside); + if (unlikely (status)) + _cairo_set_error (cr, status); + + return inside; +} + +/** + * cairo_stroke_extents: + * @cr: a cairo context + * @x1: left of the resulting extents + * @y1: top of the resulting extents + * @x2: right of the resulting extents + * @y2: bottom of the resulting extents + * + * Computes a bounding box in user coordinates covering the area that + * would be affected, (the "inked" area), by a cairo_stroke() + * operation given the current path and stroke parameters. + * If the current path is empty, returns an empty rectangle ((0,0), (0,0)). + * Surface dimensions and clipping are not taken into account. + * + * Note that if the line width is set to exactly zero, then + * cairo_stroke_extents() will return an empty rectangle. Contrast with + * cairo_path_extents() which can be used to compute the non-empty + * bounds as the line width approaches zero. + * + * Note that cairo_stroke_extents() must necessarily do more work to + * compute the precise inked areas in light of the stroke parameters, + * so cairo_path_extents() may be more desirable for sake of + * performance if non-inked path extents are desired. + * + * See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), + * cairo_set_line_cap(), cairo_set_dash(), and + * cairo_stroke_preserve(). + * + * Since: 1.0 + **/ +void +cairo_stroke_extents (cairo_t *cr, + double *x1, double *y1, double *x2, double *y2) +{ + cairo_status_t status; + + if (unlikely (cr->status)) { + if (x1) + *x1 = 0.0; + if (y1) + *y1 = 0.0; + if (x2) + *x2 = 0.0; + if (y2) + *y2 = 0.0; + + return; + } + + status = cr->backend->stroke_extents (cr, x1, y1, x2, y2); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_fill_extents: + * @cr: a cairo context + * @x1: left of the resulting extents + * @y1: top of the resulting extents + * @x2: right of the resulting extents + * @y2: bottom of the resulting extents + * + * Computes a bounding box in user coordinates covering the area that + * would be affected, (the "inked" area), by a cairo_fill() operation + * given the current path and fill parameters. If the current path is + * empty, returns an empty rectangle ((0,0), (0,0)). Surface + * dimensions and clipping are not taken into account. + * + * Contrast with cairo_path_extents(), which is similar, but returns + * non-zero extents for some paths with no inked area, (such as a + * simple line segment). + * + * Note that cairo_fill_extents() must necessarily do more work to + * compute the precise inked areas in light of the fill rule, so + * cairo_path_extents() may be more desirable for sake of performance + * if the non-inked path extents are desired. + * + * See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve(). + * + * Since: 1.0 + **/ +void +cairo_fill_extents (cairo_t *cr, + double *x1, double *y1, double *x2, double *y2) +{ + cairo_status_t status; + + if (unlikely (cr->status)) { + if (x1) + *x1 = 0.0; + if (y1) + *y1 = 0.0; + if (x2) + *x2 = 0.0; + if (y2) + *y2 = 0.0; + + return; + } + + status = cr->backend->fill_extents (cr, x1, y1, x2, y2); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_clip: + * @cr: a cairo context + * + * Establishes a new clip region by intersecting the current clip + * region with the current path as it would be filled by cairo_fill() + * and according to the current fill rule (see cairo_set_fill_rule()). + * + * After cairo_clip(), the current path will be cleared from the cairo + * context. + * + * The current clip region affects all drawing operations by + * effectively masking out any changes to the surface that are outside + * the current clip region. + * + * Calling cairo_clip() can only make the clip region smaller, never + * larger. But the current clip is part of the graphics state, so a + * temporary restriction of the clip region can be achieved by + * calling cairo_clip() within a cairo_save()/cairo_restore() + * pair. The only other means of increasing the size of the clip + * region is cairo_reset_clip(). + * + * Since: 1.0 + **/ +void +cairo_clip (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->clip (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_clip_preserve: + * @cr: a cairo context + * + * Establishes a new clip region by intersecting the current clip + * region with the current path as it would be filled by cairo_fill() + * and according to the current fill rule (see cairo_set_fill_rule()). + * + * Unlike cairo_clip(), cairo_clip_preserve() preserves the path within + * the cairo context. + * + * The current clip region affects all drawing operations by + * effectively masking out any changes to the surface that are outside + * the current clip region. + * + * Calling cairo_clip_preserve() can only make the clip region smaller, never + * larger. But the current clip is part of the graphics state, so a + * temporary restriction of the clip region can be achieved by + * calling cairo_clip_preserve() within a cairo_save()/cairo_restore() + * pair. The only other means of increasing the size of the clip + * region is cairo_reset_clip(). + * + * Since: 1.0 + **/ +void +cairo_clip_preserve (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->clip_preserve (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def(cairo_clip_preserve); + +/** + * cairo_reset_clip: + * @cr: a cairo context + * + * Reset the current clip region to its original, unrestricted + * state. That is, set the clip region to an infinitely large shape + * containing the target surface. Equivalently, if infinity is too + * hard to grasp, one can imagine the clip region being reset to the + * exact bounds of the target surface. + * + * Note that code meant to be reusable should not call + * cairo_reset_clip() as it will cause results unexpected by + * higher-level code which calls cairo_clip(). Consider using + * cairo_save() and cairo_restore() around cairo_clip() as a more + * robust means of temporarily restricting the clip region. + * + * Since: 1.0 + **/ +void +cairo_reset_clip (cairo_t *cr) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->reset_clip (cr); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_clip_extents: + * @cr: a cairo context + * @x1: left of the resulting extents + * @y1: top of the resulting extents + * @x2: right of the resulting extents + * @y2: bottom of the resulting extents + * + * Computes a bounding box in user coordinates covering the area inside the + * current clip. + * + * Since: 1.4 + **/ +void +cairo_clip_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2) +{ + cairo_status_t status; + + if (x1) + *x1 = 0.0; + if (y1) + *y1 = 0.0; + if (x2) + *x2 = 0.0; + if (y2) + *y2 = 0.0; + + if (unlikely (cr->status)) + return; + + status = cr->backend->clip_extents (cr, x1, y1, x2, y2); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_in_clip: + * @cr: a cairo context + * @x: X coordinate of the point to test + * @y: Y coordinate of the point to test + * + * Tests whether the given point is inside the area that would be + * visible through the current clip, i.e. the area that would be filled by + * a cairo_paint() operation. + * + * See cairo_clip(), and cairo_clip_preserve(). + * + * Return value: A non-zero value if the point is inside, or zero if + * outside. + * + * Since: 1.10 + **/ +cairo_bool_t +cairo_in_clip (cairo_t *cr, double x, double y) +{ + cairo_status_t status; + cairo_bool_t inside = FALSE; + + if (unlikely (cr->status)) + return FALSE; + + status = cr->backend->in_clip (cr, x, y, &inside); + if (unlikely (status)) + _cairo_set_error (cr, status); + + return inside; +} + +/** + * cairo_copy_clip_rectangle_list: + * @cr: a cairo context + * + * Gets the current clip region as a list of rectangles in user coordinates. + * Never returns %NULL. + * + * The status in the list may be %CAIRO_STATUS_CLIP_NOT_REPRESENTABLE to + * indicate that the clip region cannot be represented as a list of + * user-space rectangles. The status may have other values to indicate + * other errors. + * + * Returns: the current clip region as a list of rectangles in user coordinates, + * which should be destroyed using cairo_rectangle_list_destroy(). + * + * Since: 1.4 + **/ +cairo_rectangle_list_t * +cairo_copy_clip_rectangle_list (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_rectangle_list_create_in_error (cr->status); + + return cr->backend->clip_copy_rectangle_list (cr); +} + +/** + * cairo_select_font_face: + * @cr: a #cairo_t + * @family: a font family name, encoded in UTF-8 + * @slant: the slant for the font + * @weight: the weight for the font + * + * Note: The cairo_select_font_face() function call is part of what + * the cairo designers call the "toy" text API. It is convenient for + * short demos and simple programs, but it is not expected to be + * adequate for serious text-using applications. + * + * Selects a family and style of font from a simplified description as + * a family name, slant and weight. Cairo provides no operation to + * list available family names on the system (this is a "toy", + * remember), but the standard CSS2 generic family names, ("serif", + * "sans-serif", "cursive", "fantasy", "monospace"), are likely to + * work as expected. + * + * If @family starts with the string "@cairo:", or if no native font + * backends are compiled in, cairo will use an internal font family. + * The internal font family recognizes many modifiers in the @family + * string, most notably, it recognizes the string "monospace". That is, + * the family name "@cairo:monospace" will use the monospace version of + * the internal font family. + * + * For "real" font selection, see the font-backend-specific + * font_face_create functions for the font backend you are using. (For + * example, if you are using the freetype-based cairo-ft font backend, + * see cairo_ft_font_face_create_for_ft_face() or + * cairo_ft_font_face_create_for_pattern().) The resulting font face + * could then be used with cairo_scaled_font_create() and + * cairo_set_scaled_font(). + * + * Similarly, when using the "real" font support, you can call + * directly into the underlying font system, (such as fontconfig or + * freetype), for operations such as listing available fonts, etc. + * + * It is expected that most applications will need to use a more + * comprehensive font handling and text layout library, (for example, + * pango), in conjunction with cairo. + * + * If text is drawn without a call to cairo_select_font_face(), (nor + * cairo_set_font_face() nor cairo_set_scaled_font()), the default + * family is platform-specific, but is essentially "sans-serif". + * Default slant is %CAIRO_FONT_SLANT_NORMAL, and default weight is + * %CAIRO_FONT_WEIGHT_NORMAL. + * + * This function is equivalent to a call to cairo_toy_font_face_create() + * followed by cairo_set_font_face(). + * + * Since: 1.0 + **/ +void +cairo_select_font_face (cairo_t *cr, + const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight) +{ + cairo_font_face_t *font_face; + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + font_face = cairo_toy_font_face_create (family, slant, weight); + if (unlikely (font_face->status)) { + _cairo_set_error (cr, font_face->status); + return; + } + + status = cr->backend->set_font_face (cr, font_face); + cairo_font_face_destroy (font_face); + + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_font_extents: + * @cr: a #cairo_t + * @extents: a #cairo_font_extents_t object into which the results + * will be stored. + * + * Gets the font extents for the currently selected font. + * + * Since: 1.0 + **/ +void +cairo_font_extents (cairo_t *cr, + cairo_font_extents_t *extents) +{ + cairo_status_t status; + + extents->ascent = 0.0; + extents->descent = 0.0; + extents->height = 0.0; + extents->max_x_advance = 0.0; + extents->max_y_advance = 0.0; + + if (unlikely (cr->status)) + return; + + status = cr->backend->font_extents (cr, extents); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_set_font_face: + * @cr: a #cairo_t + * @font_face: a #cairo_font_face_t, or %NULL to restore to the default font + * + * Replaces the current #cairo_font_face_t object in the #cairo_t with + * @font_face. The replaced font face in the #cairo_t will be + * destroyed if there are no other references to it. + * + * Since: 1.0 + **/ +void +cairo_set_font_face (cairo_t *cr, + cairo_font_face_t *font_face) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_font_face (cr, font_face); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_get_font_face: + * @cr: a #cairo_t + * + * Gets the current font face for a #cairo_t. + * + * Return value: the current font face. This object is owned by + * cairo. To keep a reference to it, you must call + * cairo_font_face_reference(). + * + * This function never returns %NULL. If memory cannot be allocated, a + * special "nil" #cairo_font_face_t object will be returned on which + * cairo_font_face_status() returns %CAIRO_STATUS_NO_MEMORY. Using + * this nil object will cause its error state to propagate to other + * objects it is passed to, (for example, calling + * cairo_set_font_face() with a nil font will trigger an error that + * will shutdown the #cairo_t object). + * + * Since: 1.0 + **/ +cairo_font_face_t * +cairo_get_font_face (cairo_t *cr) +{ + if (unlikely (cr->status)) + return (cairo_font_face_t*) &_cairo_font_face_nil; + + return cr->backend->get_font_face (cr); +} + +/** + * cairo_set_font_size: + * @cr: a #cairo_t + * @size: the new font size, in user space units + * + * Sets the current font matrix to a scale by a factor of @size, replacing + * any font matrix previously set with cairo_set_font_size() or + * cairo_set_font_matrix(). This results in a font size of @size user space + * units. (More precisely, this matrix will result in the font's + * em-square being a @size by @size square in user space.) + * + * If text is drawn without a call to cairo_set_font_size(), (nor + * cairo_set_font_matrix() nor cairo_set_scaled_font()), the default + * font size is 10.0. + * + * Since: 1.0 + **/ +void +cairo_set_font_size (cairo_t *cr, double size) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_font_size (cr, size); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_font_size); + +/** + * cairo_set_font_matrix: + * @cr: a #cairo_t + * @matrix: a #cairo_matrix_t describing a transform to be applied to + * the current font. + * + * Sets the current font matrix to @matrix. The font matrix gives a + * transformation from the design space of the font (in this space, + * the em-square is 1 unit by 1 unit) to user space. Normally, a + * simple scale is used (see cairo_set_font_size()), but a more + * complex font matrix can be used to shear the font + * or stretch it unequally along the two axes + * + * Since: 1.0 + **/ +void +cairo_set_font_matrix (cairo_t *cr, + const cairo_matrix_t *matrix) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cr->backend->set_font_matrix (cr, matrix); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_font_matrix); + +/** + * cairo_get_font_matrix: + * @cr: a #cairo_t + * @matrix: return value for the matrix + * + * Stores the current font matrix into @matrix. See + * cairo_set_font_matrix(). + * + * Since: 1.0 + **/ +void +cairo_get_font_matrix (cairo_t *cr, cairo_matrix_t *matrix) +{ + if (unlikely (cr->status)) { + cairo_matrix_init_identity (matrix); + return; + } + + cr->backend->get_font_matrix (cr, matrix); +} + +/** + * cairo_set_font_options: + * @cr: a #cairo_t + * @options: font options to use + * + * Sets a set of custom font rendering options for the #cairo_t. + * Rendering options are derived by merging these options with the + * options derived from underlying surface; if the value in @options + * has a default value (like %CAIRO_ANTIALIAS_DEFAULT), then the value + * from the surface is used. + * + * Since: 1.0 + **/ +void +cairo_set_font_options (cairo_t *cr, + const cairo_font_options_t *options) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + status = cairo_font_options_status ((cairo_font_options_t *) options); + if (unlikely (status)) { + _cairo_set_error (cr, status); + return; + } + + status = cr->backend->set_font_options (cr, options); + if (unlikely (status)) + _cairo_set_error (cr, status); +} +slim_hidden_def (cairo_set_font_options); + +/** + * cairo_get_font_options: + * @cr: a #cairo_t + * @options: a #cairo_font_options_t object into which to store + * the retrieved options. All existing values are overwritten + * + * Retrieves font rendering options set via #cairo_set_font_options. + * Note that the returned options do not include any options derived + * from the underlying surface; they are literally the options + * passed to cairo_set_font_options(). + * + * Since: 1.0 + **/ +void +cairo_get_font_options (cairo_t *cr, + cairo_font_options_t *options) +{ + /* check that we aren't trying to overwrite the nil object */ + if (cairo_font_options_status (options)) + return; + + if (unlikely (cr->status)) { + _cairo_font_options_init_default (options); + return; + } + + cr->backend->get_font_options (cr, options); +} + +/** + * cairo_set_scaled_font: + * @cr: a #cairo_t + * @scaled_font: a #cairo_scaled_font_t + * + * Replaces the current font face, font matrix, and font options in + * the #cairo_t with those of the #cairo_scaled_font_t. Except for + * some translation, the current CTM of the #cairo_t should be the + * same as that of the #cairo_scaled_font_t, which can be accessed + * using cairo_scaled_font_get_ctm(). + * + * Since: 1.2 + **/ +void +cairo_set_scaled_font (cairo_t *cr, + const cairo_scaled_font_t *scaled_font) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if ((scaled_font == NULL)) { + _cairo_set_error (cr, _cairo_error (CAIRO_STATUS_NULL_POINTER)); + return; + } + + status = scaled_font->status; + if (unlikely (status)) { + _cairo_set_error (cr, status); + return; + } + + status = cr->backend->set_scaled_font (cr, (cairo_scaled_font_t *) scaled_font); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_get_scaled_font: + * @cr: a #cairo_t + * + * Gets the current scaled font for a #cairo_t. + * + * Return value: the current scaled font. This object is owned by + * cairo. To keep a reference to it, you must call + * cairo_scaled_font_reference(). + * + * This function never returns %NULL. If memory cannot be allocated, a + * special "nil" #cairo_scaled_font_t object will be returned on which + * cairo_scaled_font_status() returns %CAIRO_STATUS_NO_MEMORY. Using + * this nil object will cause its error state to propagate to other + * objects it is passed to, (for example, calling + * cairo_set_scaled_font() with a nil font will trigger an error that + * will shutdown the #cairo_t object). + * + * Since: 1.4 + **/ +cairo_scaled_font_t * +cairo_get_scaled_font (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_scaled_font_create_in_error (cr->status); + + return cr->backend->get_scaled_font (cr); +} +slim_hidden_def (cairo_get_scaled_font); + +/** + * cairo_text_extents: + * @cr: a #cairo_t + * @utf8: a NUL-terminated string of text encoded in UTF-8, or %NULL + * @extents: a #cairo_text_extents_t object into which the results + * will be stored + * + * Gets the extents for a string of text. The extents describe a + * user-space rectangle that encloses the "inked" portion of the text, + * (as it would be drawn by cairo_show_text()). Additionally, the + * x_advance and y_advance values indicate the amount by which the + * current point would be advanced by cairo_show_text(). + * + * Note that whitespace characters do not directly contribute to the + * size of the rectangle (extents.width and extents.height). They do + * contribute indirectly by changing the position of non-whitespace + * characters. In particular, trailing whitespace characters are + * likely to not affect the size of the rectangle, though they will + * affect the x_advance and y_advance values. + * + * Since: 1.0 + **/ +void +cairo_text_extents (cairo_t *cr, + const char *utf8, + cairo_text_extents_t *extents) +{ + cairo_status_t status; + cairo_scaled_font_t *scaled_font; + cairo_glyph_t *glyphs = NULL; + int num_glyphs = 0; + double x, y; + + extents->x_bearing = 0.0; + extents->y_bearing = 0.0; + extents->width = 0.0; + extents->height = 0.0; + extents->x_advance = 0.0; + extents->y_advance = 0.0; + + if (unlikely (cr->status)) + return; + + if (utf8 == NULL) + return; + + scaled_font = cairo_get_scaled_font (cr); + if (unlikely (scaled_font->status)) { + _cairo_set_error (cr, scaled_font->status); + return; + } + + cairo_get_current_point (cr, &x, &y); + status = cairo_scaled_font_text_to_glyphs (scaled_font, + x, y, + utf8, -1, + &glyphs, &num_glyphs, + NULL, NULL, NULL); + + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = cr->backend->glyph_extents (cr, + glyphs, num_glyphs, + extents); + } + cairo_glyph_free (glyphs); + + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_glyph_extents: + * @cr: a #cairo_t + * @glyphs: an array of #cairo_glyph_t objects + * @num_glyphs: the number of elements in @glyphs + * @extents: a #cairo_text_extents_t object into which the results + * will be stored + * + * Gets the extents for an array of glyphs. The extents describe a + * user-space rectangle that encloses the "inked" portion of the + * glyphs, (as they would be drawn by cairo_show_glyphs()). + * Additionally, the x_advance and y_advance values indicate the + * amount by which the current point would be advanced by + * cairo_show_glyphs(). + * + * Note that whitespace glyphs do not contribute to the size of the + * rectangle (extents.width and extents.height). + * + * Since: 1.0 + **/ +void +cairo_glyph_extents (cairo_t *cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents) +{ + cairo_status_t status; + + extents->x_bearing = 0.0; + extents->y_bearing = 0.0; + extents->width = 0.0; + extents->height = 0.0; + extents->x_advance = 0.0; + extents->y_advance = 0.0; + + if (unlikely (cr->status)) + return; + + if (num_glyphs == 0) + return; + + if (unlikely (num_glyphs < 0)) { + _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT); + return; + } + + if (unlikely (glyphs == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + status = cr->backend->glyph_extents (cr, glyphs, num_glyphs, extents); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_show_text: + * @cr: a cairo context + * @utf8: a NUL-terminated string of text encoded in UTF-8, or %NULL + * + * A drawing operator that generates the shape from a string of UTF-8 + * characters, rendered according to the current font_face, font_size + * (font_matrix), and font_options. + * + * This function first computes a set of glyphs for the string of + * text. The first glyph is placed so that its origin is at the + * current point. The origin of each subsequent glyph is offset from + * that of the previous glyph by the advance values of the previous + * glyph. + * + * After this call the current point is moved to the origin of where + * the next glyph would be placed in this same progression. That is, + * the current point will be at the origin of the final glyph offset + * by its advance values. This allows for easy display of a single + * logical string with multiple calls to cairo_show_text(). + * + * Note: The cairo_show_text() function call is part of what the cairo + * designers call the "toy" text API. It is convenient for short demos + * and simple programs, but it is not expected to be adequate for + * serious text-using applications. See cairo_show_glyphs() for the + * "real" text display API in cairo. + * + * Since: 1.0 + **/ +void +cairo_show_text (cairo_t *cr, const char *utf8) +{ + cairo_text_extents_t extents; + cairo_status_t status; + cairo_glyph_t *glyphs, *last_glyph; + cairo_text_cluster_t *clusters; + int utf8_len, num_glyphs, num_clusters; + cairo_text_cluster_flags_t cluster_flags; + double x, y; + cairo_bool_t has_show_text_glyphs; + cairo_glyph_t stack_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)]; + cairo_text_cluster_t stack_clusters[CAIRO_STACK_ARRAY_LENGTH (cairo_text_cluster_t)]; + cairo_scaled_font_t *scaled_font; + cairo_glyph_text_info_t info, *i; + + if (unlikely (cr->status)) + return; + + if (utf8 == NULL) + return; + + scaled_font = cairo_get_scaled_font (cr); + if (unlikely (scaled_font->status)) { + _cairo_set_error (cr, scaled_font->status); + return; + } + + utf8_len = strlen (utf8); + + has_show_text_glyphs = + cairo_surface_has_show_text_glyphs (cairo_get_target (cr)); + + glyphs = stack_glyphs; + num_glyphs = ARRAY_LENGTH (stack_glyphs); + + if (has_show_text_glyphs) { + clusters = stack_clusters; + num_clusters = ARRAY_LENGTH (stack_clusters); + } else { + clusters = NULL; + num_clusters = 0; + } + + cairo_get_current_point (cr, &x, &y); + status = cairo_scaled_font_text_to_glyphs (scaled_font, + x, y, + utf8, utf8_len, + &glyphs, &num_glyphs, + has_show_text_glyphs ? &clusters : NULL, &num_clusters, + &cluster_flags); + if (unlikely (status)) + goto BAIL; + + if (num_glyphs == 0) + return; + + i = NULL; + if (has_show_text_glyphs) { + info.utf8 = utf8; + info.utf8_len = utf8_len; + info.clusters = clusters; + info.num_clusters = num_clusters; + info.cluster_flags = cluster_flags; + i = &info; + } + + status = cr->backend->glyphs (cr, glyphs, num_glyphs, i); + if (unlikely (status)) + goto BAIL; + + last_glyph = &glyphs[num_glyphs - 1]; + status = cr->backend->glyph_extents (cr, last_glyph, 1, &extents); + if (unlikely (status)) + goto BAIL; + + x = last_glyph->x + extents.x_advance; + y = last_glyph->y + extents.y_advance; + cr->backend->move_to (cr, x, y); + + BAIL: + if (glyphs != stack_glyphs) + cairo_glyph_free (glyphs); + if (clusters != stack_clusters) + cairo_text_cluster_free (clusters); + + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_show_glyphs: + * @cr: a cairo context + * @glyphs: array of glyphs to show + * @num_glyphs: number of glyphs to show + * + * A drawing operator that generates the shape from an array of glyphs, + * rendered according to the current font face, font size + * (font matrix), and font options. + * + * Since: 1.0 + **/ +void +cairo_show_glyphs (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (num_glyphs == 0) + return; + + if (num_glyphs < 0) { + _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT); + return; + } + + if (glyphs == NULL) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + status = cr->backend->glyphs (cr, glyphs, num_glyphs, NULL); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_show_text_glyphs: + * @cr: a cairo context + * @utf8: a string of text encoded in UTF-8 + * @utf8_len: length of @utf8 in bytes, or -1 if it is NUL-terminated + * @glyphs: array of glyphs to show + * @num_glyphs: number of glyphs to show + * @clusters: array of cluster mapping information + * @num_clusters: number of clusters in the mapping + * @cluster_flags: cluster mapping flags + * + * This operation has rendering effects similar to cairo_show_glyphs() + * but, if the target surface supports it, uses the provided text and + * cluster mapping to embed the text for the glyphs shown in the output. + * If the target does not support the extended attributes, this function + * acts like the basic cairo_show_glyphs() as if it had been passed + * @glyphs and @num_glyphs. + * + * The mapping between @utf8 and @glyphs is provided by an array of + * clusters. Each cluster covers a number of + * text bytes and glyphs, and neighboring clusters cover neighboring + * areas of @utf8 and @glyphs. The clusters should collectively cover @utf8 + * and @glyphs in entirety. + * + * The first cluster always covers bytes from the beginning of @utf8. + * If @cluster_flags do not have the %CAIRO_TEXT_CLUSTER_FLAG_BACKWARD + * set, the first cluster also covers the beginning + * of @glyphs, otherwise it covers the end of the @glyphs array and + * following clusters move backward. + * + * See #cairo_text_cluster_t for constraints on valid clusters. + * + * Since: 1.8 + **/ +void +cairo_show_text_glyphs (cairo_t *cr, + const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + /* A slew of sanity checks */ + + /* Special case for NULL and -1 */ + if (utf8 == NULL && utf8_len == -1) + utf8_len = 0; + + /* No NULLs for non-zeros */ + if ((num_glyphs && glyphs == NULL) || + (utf8_len && utf8 == NULL) || + (num_clusters && clusters == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + /* A -1 for utf8_len means NUL-terminated */ + if (utf8_len == -1) + utf8_len = strlen (utf8); + + /* Apart from that, no negatives */ + if (num_glyphs < 0 || utf8_len < 0 || num_clusters < 0) { + _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT); + return; + } + + if (num_glyphs == 0 && utf8_len == 0) + return; + + if (utf8) { + /* Make sure clusters cover the entire glyphs and utf8 arrays, + * and that cluster boundaries are UTF-8 boundaries. */ + status = _cairo_validate_text_clusters (utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags); + if (status == CAIRO_STATUS_INVALID_CLUSTERS) { + /* Either got invalid UTF-8 text, or cluster mapping is bad. + * Differentiate those. */ + + cairo_status_t status2; + + status2 = _cairo_utf8_to_ucs4 (utf8, utf8_len, NULL, NULL); + if (status2) + status = status2; + } else { + cairo_glyph_text_info_t info; + + info.utf8 = utf8; + info.utf8_len = utf8_len; + info.clusters = clusters; + info.num_clusters = num_clusters; + info.cluster_flags = cluster_flags; + + status = cr->backend->glyphs (cr, glyphs, num_glyphs, &info); + } + } else { + status = cr->backend->glyphs (cr, glyphs, num_glyphs, NULL); + } + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_text_path: + * @cr: a cairo context + * @utf8: a NUL-terminated string of text encoded in UTF-8, or %NULL + * + * Adds closed paths for text to the current path. The generated + * path if filled, achieves an effect similar to that of + * cairo_show_text(). + * + * Text conversion and positioning is done similar to cairo_show_text(). + * + * Like cairo_show_text(), After this call the current point is + * moved to the origin of where the next glyph would be placed in + * this same progression. That is, the current point will be at + * the origin of the final glyph offset by its advance values. + * This allows for chaining multiple calls to to cairo_text_path() + * without having to set current point in between. + * + * Note: The cairo_text_path() function call is part of what the cairo + * designers call the "toy" text API. It is convenient for short demos + * and simple programs, but it is not expected to be adequate for + * serious text-using applications. See cairo_glyph_path() for the + * "real" text path API in cairo. + * + * Since: 1.0 + **/ +void +cairo_text_path (cairo_t *cr, const char *utf8) +{ + cairo_status_t status; + cairo_text_extents_t extents; + cairo_glyph_t stack_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)]; + cairo_glyph_t *glyphs, *last_glyph; + cairo_scaled_font_t *scaled_font; + int num_glyphs; + double x, y; + + if (unlikely (cr->status)) + return; + + if (utf8 == NULL) + return; + + + glyphs = stack_glyphs; + num_glyphs = ARRAY_LENGTH (stack_glyphs); + + scaled_font = cairo_get_scaled_font (cr); + if (unlikely (scaled_font->status)) { + _cairo_set_error (cr, scaled_font->status); + return; + } + + cairo_get_current_point (cr, &x, &y); + status = cairo_scaled_font_text_to_glyphs (scaled_font, + x, y, + utf8, -1, + &glyphs, &num_glyphs, + NULL, NULL, NULL); + + if (num_glyphs == 0) + return; + + status = cr->backend->glyph_path (cr, glyphs, num_glyphs); + + if (unlikely (status)) + goto BAIL; + + last_glyph = &glyphs[num_glyphs - 1]; + status = cr->backend->glyph_extents (cr, last_glyph, 1, &extents); + + if (unlikely (status)) + goto BAIL; + + x = last_glyph->x + extents.x_advance; + y = last_glyph->y + extents.y_advance; + cr->backend->move_to (cr, x, y); + + BAIL: + if (glyphs != stack_glyphs) + cairo_glyph_free (glyphs); + + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_glyph_path: + * @cr: a cairo context + * @glyphs: array of glyphs to show + * @num_glyphs: number of glyphs to show + * + * Adds closed paths for the glyphs to the current path. The generated + * path if filled, achieves an effect similar to that of + * cairo_show_glyphs(). + * + * Since: 1.0 + **/ +void +cairo_glyph_path (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (num_glyphs == 0) + return; + + if (unlikely (num_glyphs < 0)) { + _cairo_set_error (cr, CAIRO_STATUS_NEGATIVE_COUNT); + return; + } + + if (unlikely (glyphs == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + status = cr->backend->glyph_path (cr, glyphs, num_glyphs); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_get_operator: + * @cr: a cairo context + * + * Gets the current compositing operator for a cairo context. + * + * Return value: the current compositing operator. + * + * Since: 1.0 + **/ +cairo_operator_t +cairo_get_operator (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_OPERATOR_DEFAULT; + + return cr->backend->get_operator (cr); +} + +#if 0 +/** + * cairo_get_opacity: + * @cr: a cairo context + * + * Gets the current compositing opacity for a cairo context. + * + * Return value: the current compositing opacity. + * + * Since: TBD + **/ +double +cairo_get_opacity (cairo_t *cr) +{ + if (unlikely (cr->status)) + return 1.; + + return cr->backend->get_opacity (cr); +} +#endif + +/** + * cairo_get_tolerance: + * @cr: a cairo context + * + * Gets the current tolerance value, as set by cairo_set_tolerance(). + * + * Return value: the current tolerance value. + * + * Since: 1.0 + **/ +double +cairo_get_tolerance (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_TOLERANCE_DEFAULT; + + return cr->backend->get_tolerance (cr); +} +slim_hidden_def (cairo_get_tolerance); + +/** + * cairo_get_antialias: + * @cr: a cairo context + * + * Gets the current shape antialiasing mode, as set by + * cairo_set_antialias(). + * + * Return value: the current shape antialiasing mode. + * + * Since: 1.0 + **/ +cairo_antialias_t +cairo_get_antialias (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_ANTIALIAS_DEFAULT; + + return cr->backend->get_antialias (cr); +} + +/** + * cairo_has_current_point: + * @cr: a cairo context + * + * Returns whether a current point is defined on the current path. + * See cairo_get_current_point() for details on the current point. + * + * Return value: whether a current point is defined. + * + * Since: 1.6 + **/ +cairo_bool_t +cairo_has_current_point (cairo_t *cr) +{ + if (unlikely (cr->status)) + return FALSE; + + return cr->backend->has_current_point (cr); +} + +/** + * cairo_get_current_point: + * @cr: a cairo context + * @x: return value for X coordinate of the current point + * @y: return value for Y coordinate of the current point + * + * Gets the current point of the current path, which is + * conceptually the final point reached by the path so far. + * + * The current point is returned in the user-space coordinate + * system. If there is no defined current point or if @cr is in an + * error status, @x and @y will both be set to 0.0. It is possible to + * check this in advance with cairo_has_current_point(). + * + * Most path construction functions alter the current point. See the + * following for details on how they affect the current point: + * cairo_new_path(), cairo_new_sub_path(), + * cairo_append_path(), cairo_close_path(), + * cairo_move_to(), cairo_line_to(), cairo_curve_to(), + * cairo_rel_move_to(), cairo_rel_line_to(), cairo_rel_curve_to(), + * cairo_arc(), cairo_arc_negative(), cairo_rectangle(), + * cairo_text_path(), cairo_glyph_path(), cairo_stroke_to_path(). + * + * Some functions use and alter the current point but do not + * otherwise change current path: + * cairo_show_text(). + * + * Some functions unset the current path and as a result, current point: + * cairo_fill(), cairo_stroke(). + * + * Since: 1.0 + **/ +void +cairo_get_current_point (cairo_t *cr, double *x_ret, double *y_ret) +{ + double x, y; + + x = y = 0; + if (cr->status == CAIRO_STATUS_SUCCESS && + cr->backend->has_current_point (cr)) + { + cr->backend->get_current_point (cr, &x, &y); + } + + if (x_ret) + *x_ret = x; + if (y_ret) + *y_ret = y; +} +slim_hidden_def(cairo_get_current_point); + +/** + * cairo_get_fill_rule: + * @cr: a cairo context + * + * Gets the current fill rule, as set by cairo_set_fill_rule(). + * + * Return value: the current fill rule. + * + * Since: 1.0 + **/ +cairo_fill_rule_t +cairo_get_fill_rule (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_FILL_RULE_DEFAULT; + + return cr->backend->get_fill_rule (cr); +} + +/** + * cairo_get_line_width: + * @cr: a cairo context + * + * This function returns the current line width value exactly as set by + * cairo_set_line_width(). Note that the value is unchanged even if + * the CTM has changed between the calls to cairo_set_line_width() and + * cairo_get_line_width(). + * + * Return value: the current line width. + * + * Since: 1.0 + **/ +double +cairo_get_line_width (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_LINE_WIDTH_DEFAULT; + + return cr->backend->get_line_width (cr); +} +slim_hidden_def (cairo_get_line_width); + +/** + * cairo_get_line_cap: + * @cr: a cairo context + * + * Gets the current line cap style, as set by cairo_set_line_cap(). + * + * Return value: the current line cap style. + * + * Since: 1.0 + **/ +cairo_line_cap_t +cairo_get_line_cap (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_LINE_CAP_DEFAULT; + + return cr->backend->get_line_cap (cr); +} + +/** + * cairo_get_line_join: + * @cr: a cairo context + * + * Gets the current line join style, as set by cairo_set_line_join(). + * + * Return value: the current line join style. + * + * Since: 1.0 + **/ +cairo_line_join_t +cairo_get_line_join (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_LINE_JOIN_DEFAULT; + + return cr->backend->get_line_join (cr); +} + +/** + * cairo_get_miter_limit: + * @cr: a cairo context + * + * Gets the current miter limit, as set by cairo_set_miter_limit(). + * + * Return value: the current miter limit. + * + * Since: 1.0 + **/ +double +cairo_get_miter_limit (cairo_t *cr) +{ + if (unlikely (cr->status)) + return CAIRO_GSTATE_MITER_LIMIT_DEFAULT; + + return cr->backend->get_miter_limit (cr); +} + +/** + * cairo_get_matrix: + * @cr: a cairo context + * @matrix: return value for the matrix + * + * Stores the current transformation matrix (CTM) into @matrix. + * + * Since: 1.0 + **/ +void +cairo_get_matrix (cairo_t *cr, cairo_matrix_t *matrix) +{ + if (unlikely (cr->status)) { + cairo_matrix_init_identity (matrix); + return; + } + + cr->backend->get_matrix (cr, matrix); +} +slim_hidden_def (cairo_get_matrix); + +/** + * cairo_get_target: + * @cr: a cairo context + * + * Gets the target surface for the cairo context as passed to + * cairo_create(). + * + * This function will always return a valid pointer, but the result + * can be a "nil" surface if @cr is already in an error state, + * (ie. cairo_status() != %CAIRO_STATUS_SUCCESS). + * A nil surface is indicated by cairo_surface_status() + * != %CAIRO_STATUS_SUCCESS. + * + * Return value: the target surface. This object is owned by cairo. To + * keep a reference to it, you must call cairo_surface_reference(). + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_get_target (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_surface_create_in_error (cr->status); + + return cr->backend->get_original_target (cr); +} +slim_hidden_def (cairo_get_target); + +/** + * cairo_get_group_target: + * @cr: a cairo context + * + * Gets the current destination surface for the context. This is either + * the original target surface as passed to cairo_create() or the target + * surface for the current group as started by the most recent call to + * cairo_push_group() or cairo_push_group_with_content(). + * + * This function will always return a valid pointer, but the result + * can be a "nil" surface if @cr is already in an error state, + * (ie. cairo_status() != %CAIRO_STATUS_SUCCESS). + * A nil surface is indicated by cairo_surface_status() + * != %CAIRO_STATUS_SUCCESS. + * + * Return value: the target surface. This object is owned by cairo. To + * keep a reference to it, you must call cairo_surface_reference(). + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_get_group_target (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_surface_create_in_error (cr->status); + + return cr->backend->get_current_target (cr); +} + +/** + * cairo_copy_path: + * @cr: a cairo context + * + * Creates a copy of the current path and returns it to the user as a + * #cairo_path_t. See #cairo_path_data_t for hints on how to iterate + * over the returned data structure. + * + * This function will always return a valid pointer, but the result + * will have no data (data==%NULL and + * num_data==0), if either of the following + * conditions hold: + * + * + * If there is insufficient memory to copy the path. In this + * case path->status will be set to + * %CAIRO_STATUS_NO_MEMORY. + * If @cr is already in an error state. In this case + * path->status will contain the same status that + * would be returned by cairo_status(). + * + * + * Return value: the copy of the current path. The caller owns the + * returned object and should call cairo_path_destroy() when finished + * with it. + * + * Since: 1.0 + **/ +cairo_path_t * +cairo_copy_path (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_path_create_in_error (cr->status); + + return cr->backend->copy_path (cr); +} + +/** + * cairo_copy_path_flat: + * @cr: a cairo context + * + * Gets a flattened copy of the current path and returns it to the + * user as a #cairo_path_t. See #cairo_path_data_t for hints on + * how to iterate over the returned data structure. + * + * This function is like cairo_copy_path() except that any curves + * in the path will be approximated with piecewise-linear + * approximations, (accurate to within the current tolerance + * value). That is, the result is guaranteed to not have any elements + * of type %CAIRO_PATH_CURVE_TO which will instead be replaced by a + * series of %CAIRO_PATH_LINE_TO elements. + * + * This function will always return a valid pointer, but the result + * will have no data (data==%NULL and + * num_data==0), if either of the following + * conditions hold: + * + * + * If there is insufficient memory to copy the path. In this + * case path->status will be set to + * %CAIRO_STATUS_NO_MEMORY. + * If @cr is already in an error state. In this case + * path->status will contain the same status that + * would be returned by cairo_status(). + * + * + * Return value: the copy of the current path. The caller owns the + * returned object and should call cairo_path_destroy() when finished + * with it. + * + * Since: 1.0 + **/ +cairo_path_t * +cairo_copy_path_flat (cairo_t *cr) +{ + if (unlikely (cr->status)) + return _cairo_path_create_in_error (cr->status); + + return cr->backend->copy_path_flat (cr); +} + +/** + * cairo_append_path: + * @cr: a cairo context + * @path: path to be appended + * + * Append the @path onto the current path. The @path may be either the + * return value from one of cairo_copy_path() or + * cairo_copy_path_flat() or it may be constructed manually. See + * #cairo_path_t for details on how the path data structure should be + * initialized, and note that path->status must be + * initialized to %CAIRO_STATUS_SUCCESS. + * + * Since: 1.0 + **/ +void +cairo_append_path (cairo_t *cr, + const cairo_path_t *path) +{ + cairo_status_t status; + + if (unlikely (cr->status)) + return; + + if (unlikely (path == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + if (unlikely (path->status)) { + if (path->status > CAIRO_STATUS_SUCCESS && + path->status <= CAIRO_STATUS_LAST_STATUS) + _cairo_set_error (cr, path->status); + else + _cairo_set_error (cr, CAIRO_STATUS_INVALID_STATUS); + return; + } + + if (path->num_data == 0) + return; + + if (unlikely (path->data == NULL)) { + _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); + return; + } + + status = cr->backend->append_path (cr, path); + if (unlikely (status)) + _cairo_set_error (cr, status); +} + +/** + * cairo_status: + * @cr: a cairo context + * + * Checks whether an error has previously occurred for this context. + * + * Returns: the current status of this context, see #cairo_status_t + * + * Since: 1.0 + **/ +cairo_status_t +cairo_status (cairo_t *cr) +{ + return cr->status; +} +slim_hidden_def (cairo_status); diff --git a/src/cairo.h b/src/cairo.h new file mode 100644 index 000000000..3104d47e4 --- /dev/null +++ b/src/cairo.h @@ -0,0 +1,3153 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_H +#define CAIRO_H + +#include "cairo-version.h" +#include "cairo-features.h" +#include "cairo-deprecated.h" + +#ifdef __cplusplus +# define CAIRO_BEGIN_DECLS extern "C" { +# define CAIRO_END_DECLS } +#else +# define CAIRO_BEGIN_DECLS +# define CAIRO_END_DECLS +#endif + +#ifndef cairo_public +# if defined (_MSC_VER) && ! defined (CAIRO_WIN32_STATIC_BUILD) +# define cairo_public __declspec(dllimport) +# else +# define cairo_public +# endif +#endif + +CAIRO_BEGIN_DECLS + +#define CAIRO_VERSION_ENCODE(major, minor, micro) ( \ + ((major) * 10000) \ + + ((minor) * 100) \ + + ((micro) * 1)) + +#define CAIRO_VERSION CAIRO_VERSION_ENCODE( \ + CAIRO_VERSION_MAJOR, \ + CAIRO_VERSION_MINOR, \ + CAIRO_VERSION_MICRO) + + +#define CAIRO_VERSION_STRINGIZE_(major, minor, micro) \ + #major"."#minor"."#micro +#define CAIRO_VERSION_STRINGIZE(major, minor, micro) \ + CAIRO_VERSION_STRINGIZE_(major, minor, micro) + +#define CAIRO_VERSION_STRING CAIRO_VERSION_STRINGIZE( \ + CAIRO_VERSION_MAJOR, \ + CAIRO_VERSION_MINOR, \ + CAIRO_VERSION_MICRO) + + +cairo_public int +cairo_version (void); + +cairo_public const char* +cairo_version_string (void); + +/** + * cairo_bool_t: + * + * #cairo_bool_t is used for boolean values. Returns of type + * #cairo_bool_t will always be either 0 or 1, but testing against + * these values explicitly is not encouraged; just use the + * value as a boolean condition. + * + * + * if (cairo_in_stroke (cr, x, y)) { + * /* do something */ + * } + * + * + * Since: 1.0 + **/ +typedef int cairo_bool_t; + +/** + * cairo_t: + * + * A #cairo_t contains the current state of the rendering device, + * including coordinates of yet to be drawn shapes. + * + * Cairo contexts, as #cairo_t objects are named, are central to + * cairo and all drawing with cairo is always done to a #cairo_t + * object. + * + * Memory management of #cairo_t is done with + * cairo_reference() and cairo_destroy(). + * + * Since: 1.0 + **/ +typedef struct _cairo cairo_t; + +/** + * cairo_surface_t: + * + * A #cairo_surface_t represents an image, either as the destination + * of a drawing operation or as source when drawing onto another + * surface. To draw to a #cairo_surface_t, create a cairo context + * with the surface as the target, using cairo_create(). + * + * There are different subtypes of #cairo_surface_t for + * different drawing backends; for example, cairo_image_surface_create() + * creates a bitmap image in memory. + * The type of a surface can be queried with cairo_surface_get_type(). + * + * The initial contents of a surface after creation depend upon the manner + * of its creation. If cairo creates the surface and backing storage for + * the user, it will be initially cleared; for example, + * cairo_image_surface_create() and cairo_surface_create_similar(). + * Alternatively, if the user passes in a reference to some backing storage + * and asks cairo to wrap that in a #cairo_surface_t, then the contents are + * not modified; for example, cairo_image_surface_create_for_data() and + * cairo_xlib_surface_create(). + * + * Memory management of #cairo_surface_t is done with + * cairo_surface_reference() and cairo_surface_destroy(). + * + * Since: 1.0 + **/ +typedef struct _cairo_surface cairo_surface_t; + +/** + * cairo_device_t: + * + * A #cairo_device_t represents the driver interface for drawing + * operations to a #cairo_surface_t. There are different subtypes of + * #cairo_device_t for different drawing backends; for example, + * cairo_egl_device_create() creates a device that wraps an EGL display and + * context. + * + * The type of a device can be queried with cairo_device_get_type(). + * + * Memory management of #cairo_device_t is done with + * cairo_device_reference() and cairo_device_destroy(). + * + * Since: 1.10 + **/ +typedef struct _cairo_device cairo_device_t; + +/** + * cairo_matrix_t: + * @xx: xx component of the affine transformation + * @yx: yx component of the affine transformation + * @xy: xy component of the affine transformation + * @yy: yy component of the affine transformation + * @x0: X translation component of the affine transformation + * @y0: Y translation component of the affine transformation + * + * A #cairo_matrix_t holds an affine transformation, such as a scale, + * rotation, shear, or a combination of those. The transformation of + * a point (x, y) is given by: + * + * x_new = xx * x + xy * y + x0; + * y_new = yx * x + yy * y + y0; + * + * + * Since: 1.0 + **/ +typedef struct _cairo_matrix { + double xx; double yx; + double xy; double yy; + double x0; double y0; +} cairo_matrix_t; + +/** + * cairo_pattern_t: + * + * A #cairo_pattern_t represents a source when drawing onto a + * surface. There are different subtypes of #cairo_pattern_t, + * for different types of sources; for example, + * cairo_pattern_create_rgb() creates a pattern for a solid + * opaque color. + * + * Other than various + * cairo_pattern_create_type() + * functions, some of the pattern types can be implicitly created using various + * cairo_set_source_type() functions; + * for example cairo_set_source_rgb(). + * + * The type of a pattern can be queried with cairo_pattern_get_type(). + * + * Memory management of #cairo_pattern_t is done with + * cairo_pattern_reference() and cairo_pattern_destroy(). + * + * Since: 1.0 + **/ +typedef struct _cairo_pattern cairo_pattern_t; + +/** + * cairo_destroy_func_t: + * @data: The data element being destroyed. + * + * #cairo_destroy_func_t the type of function which is called when a + * data element is destroyed. It is passed the pointer to the data + * element and should free any memory and resources allocated for it. + * + * Since: 1.0 + **/ +typedef void (*cairo_destroy_func_t) (void *data); + +/** + * cairo_user_data_key_t: + * @unused: not used; ignore. + * + * #cairo_user_data_key_t is used for attaching user data to cairo + * data structures. The actual contents of the struct is never used, + * and there is no need to initialize the object; only the unique + * address of a #cairo_data_key_t object is used. Typically, you + * would just use the address of a static #cairo_data_key_t object. + * + * Since: 1.0 + **/ +typedef struct _cairo_user_data_key { + int unused; +} cairo_user_data_key_t; + +/** + * cairo_status_t: + * @CAIRO_STATUS_SUCCESS: no error has occurred (Since 1.0) + * @CAIRO_STATUS_NO_MEMORY: out of memory (Since 1.0) + * @CAIRO_STATUS_INVALID_RESTORE: cairo_restore() called without matching cairo_save() (Since 1.0) + * @CAIRO_STATUS_INVALID_POP_GROUP: no saved group to pop, i.e. cairo_pop_group() without matching cairo_push_group() (Since 1.0) + * @CAIRO_STATUS_NO_CURRENT_POINT: no current point defined (Since 1.0) + * @CAIRO_STATUS_INVALID_MATRIX: invalid matrix (not invertible) (Since 1.0) + * @CAIRO_STATUS_INVALID_STATUS: invalid value for an input #cairo_status_t (Since 1.0) + * @CAIRO_STATUS_NULL_POINTER: %NULL pointer (Since 1.0) + * @CAIRO_STATUS_INVALID_STRING: input string not valid UTF-8 (Since 1.0) + * @CAIRO_STATUS_INVALID_PATH_DATA: input path data not valid (Since 1.0) + * @CAIRO_STATUS_READ_ERROR: error while reading from input stream (Since 1.0) + * @CAIRO_STATUS_WRITE_ERROR: error while writing to output stream (Since 1.0) + * @CAIRO_STATUS_SURFACE_FINISHED: target surface has been finished (Since 1.0) + * @CAIRO_STATUS_SURFACE_TYPE_MISMATCH: the surface type is not appropriate for the operation (Since 1.0) + * @CAIRO_STATUS_PATTERN_TYPE_MISMATCH: the pattern type is not appropriate for the operation (Since 1.0) + * @CAIRO_STATUS_INVALID_CONTENT: invalid value for an input #cairo_content_t (Since 1.0) + * @CAIRO_STATUS_INVALID_FORMAT: invalid value for an input #cairo_format_t (Since 1.0) + * @CAIRO_STATUS_INVALID_VISUAL: invalid value for an input Visual* (Since 1.0) + * @CAIRO_STATUS_FILE_NOT_FOUND: file not found (Since 1.0) + * @CAIRO_STATUS_INVALID_DASH: invalid value for a dash setting (Since 1.0) + * @CAIRO_STATUS_INVALID_DSC_COMMENT: invalid value for a DSC comment (Since 1.2) + * @CAIRO_STATUS_INVALID_INDEX: invalid index passed to getter (Since 1.4) + * @CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: clip region not representable in desired format (Since 1.4) + * @CAIRO_STATUS_TEMP_FILE_ERROR: error creating or writing to a temporary file (Since 1.6) + * @CAIRO_STATUS_INVALID_STRIDE: invalid value for stride (Since 1.6) + * @CAIRO_STATUS_FONT_TYPE_MISMATCH: the font type is not appropriate for the operation (Since 1.8) + * @CAIRO_STATUS_USER_FONT_IMMUTABLE: the user-font is immutable (Since 1.8) + * @CAIRO_STATUS_USER_FONT_ERROR: error occurred in a user-font callback function (Since 1.8) + * @CAIRO_STATUS_NEGATIVE_COUNT: negative number used where it is not allowed (Since 1.8) + * @CAIRO_STATUS_INVALID_CLUSTERS: input clusters do not represent the accompanying text and glyph array (Since 1.8) + * @CAIRO_STATUS_INVALID_SLANT: invalid value for an input #cairo_font_slant_t (Since 1.8) + * @CAIRO_STATUS_INVALID_WEIGHT: invalid value for an input #cairo_font_weight_t (Since 1.8) + * @CAIRO_STATUS_INVALID_SIZE: invalid value (typically too big) for the size of the input (surface, pattern, etc.) (Since 1.10) + * @CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED: user-font method not implemented (Since 1.10) + * @CAIRO_STATUS_DEVICE_TYPE_MISMATCH: the device type is not appropriate for the operation (Since 1.10) + * @CAIRO_STATUS_DEVICE_ERROR: an operation to the device caused an unspecified error (Since 1.10) + * @CAIRO_STATUS_INVALID_MESH_CONSTRUCTION: a mesh pattern + * construction operation was used outside of a + * cairo_mesh_pattern_begin_patch()/cairo_mesh_pattern_end_patch() + * pair (Since 1.12) + * @CAIRO_STATUS_DEVICE_FINISHED: target device has been finished (Since 1.12) + * @CAIRO_STATUS_JBIG2_GLOBAL_MISSING: %CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID has been used on at least one image + * but no image provided %CAIRO_MIME_TYPE_JBIG2_GLOBAL (Since 1.14) + * @CAIRO_STATUS_LAST_STATUS: this is a special value indicating the number of + * status values defined in this enumeration. When using this value, note + * that the version of cairo at run-time may have additional status values + * defined than the value of this symbol at compile-time. (Since 1.10) + * + * #cairo_status_t is used to indicate errors that can occur when + * using Cairo. In some cases it is returned directly by functions. + * but when using #cairo_t, the last error, if any, is stored in + * the context and can be retrieved with cairo_status(). + * + * New entries may be added in future versions. Use cairo_status_to_string() + * to get a human-readable representation of an error message. + * + * Since: 1.0 + **/ +typedef enum _cairo_status { + CAIRO_STATUS_SUCCESS = 0, + + CAIRO_STATUS_NO_MEMORY, + CAIRO_STATUS_INVALID_RESTORE, + CAIRO_STATUS_INVALID_POP_GROUP, + CAIRO_STATUS_NO_CURRENT_POINT, + CAIRO_STATUS_INVALID_MATRIX, + CAIRO_STATUS_INVALID_STATUS, + CAIRO_STATUS_NULL_POINTER, + CAIRO_STATUS_INVALID_STRING, + CAIRO_STATUS_INVALID_PATH_DATA, + CAIRO_STATUS_READ_ERROR, + CAIRO_STATUS_WRITE_ERROR, + CAIRO_STATUS_SURFACE_FINISHED, + CAIRO_STATUS_SURFACE_TYPE_MISMATCH, + CAIRO_STATUS_PATTERN_TYPE_MISMATCH, + CAIRO_STATUS_INVALID_CONTENT, + CAIRO_STATUS_INVALID_FORMAT, + CAIRO_STATUS_INVALID_VISUAL, + CAIRO_STATUS_FILE_NOT_FOUND, + CAIRO_STATUS_INVALID_DASH, + CAIRO_STATUS_INVALID_DSC_COMMENT, + CAIRO_STATUS_INVALID_INDEX, + CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, + CAIRO_STATUS_TEMP_FILE_ERROR, + CAIRO_STATUS_INVALID_STRIDE, + CAIRO_STATUS_FONT_TYPE_MISMATCH, + CAIRO_STATUS_USER_FONT_IMMUTABLE, + CAIRO_STATUS_USER_FONT_ERROR, + CAIRO_STATUS_NEGATIVE_COUNT, + CAIRO_STATUS_INVALID_CLUSTERS, + CAIRO_STATUS_INVALID_SLANT, + CAIRO_STATUS_INVALID_WEIGHT, + CAIRO_STATUS_INVALID_SIZE, + CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, + CAIRO_STATUS_DEVICE_TYPE_MISMATCH, + CAIRO_STATUS_DEVICE_ERROR, + CAIRO_STATUS_INVALID_MESH_CONSTRUCTION, + CAIRO_STATUS_DEVICE_FINISHED, + CAIRO_STATUS_JBIG2_GLOBAL_MISSING, + + CAIRO_STATUS_LAST_STATUS +} cairo_status_t; + +/** + * cairo_content_t: + * @CAIRO_CONTENT_COLOR: The surface will hold color content only. (Since 1.0) + * @CAIRO_CONTENT_ALPHA: The surface will hold alpha content only. (Since 1.0) + * @CAIRO_CONTENT_COLOR_ALPHA: The surface will hold color and alpha content. (Since 1.0) + * + * #cairo_content_t is used to describe the content that a surface will + * contain, whether color information, alpha information (translucence + * vs. opacity), or both. + * + * Note: The large values here are designed to keep #cairo_content_t + * values distinct from #cairo_format_t values so that the + * implementation can detect the error if users confuse the two types. + * + * Since: 1.0 + **/ +typedef enum _cairo_content { + CAIRO_CONTENT_COLOR = 0x1000, + CAIRO_CONTENT_ALPHA = 0x2000, + CAIRO_CONTENT_COLOR_ALPHA = 0x3000 +} cairo_content_t; + +/** + * cairo_format_t: + * @CAIRO_FORMAT_INVALID: no such format exists or is supported. + * @CAIRO_FORMAT_ARGB32: each pixel is a 32-bit quantity, with + * alpha in the upper 8 bits, then red, then green, then blue. + * The 32-bit quantities are stored native-endian. Pre-multiplied + * alpha is used. (That is, 50% transparent red is 0x80800000, + * not 0x80ff0000.) (Since 1.0) + * @CAIRO_FORMAT_RGB24: each pixel is a 32-bit quantity, with + * the upper 8 bits unused. Red, Green, and Blue are stored + * in the remaining 24 bits in that order. (Since 1.0) + * @CAIRO_FORMAT_A8: each pixel is a 8-bit quantity holding + * an alpha value. (Since 1.0) + * @CAIRO_FORMAT_A1: each pixel is a 1-bit quantity holding + * an alpha value. Pixels are packed together into 32-bit + * quantities. The ordering of the bits matches the + * endianess of the platform. On a big-endian machine, the + * first pixel is in the uppermost bit, on a little-endian + * machine the first pixel is in the least-significant bit. (Since 1.0) + * @CAIRO_FORMAT_RGB16_565: each pixel is a 16-bit quantity + * with red in the upper 5 bits, then green in the middle + * 6 bits, and blue in the lower 5 bits. (Since 1.2) + * @CAIRO_FORMAT_RGB30: like RGB24 but with 10bpc. (Since 1.12) + * + * #cairo_format_t is used to identify the memory format of + * image data. + * + * New entries may be added in future versions. + * + * Since: 1.0 + **/ +typedef enum _cairo_format { + CAIRO_FORMAT_INVALID = -1, + CAIRO_FORMAT_ARGB32 = 0, + CAIRO_FORMAT_RGB24 = 1, + CAIRO_FORMAT_A8 = 2, + CAIRO_FORMAT_A1 = 3, + CAIRO_FORMAT_RGB16_565 = 4, + CAIRO_FORMAT_RGB30 = 5 +} cairo_format_t; + + +/** + * cairo_write_func_t: + * @closure: the output closure + * @data: the buffer containing the data to write + * @length: the amount of data to write + * + * #cairo_write_func_t is the type of function which is called when a + * backend needs to write data to an output stream. It is passed the + * closure which was specified by the user at the time the write + * function was registered, the data to write and the length of the + * data in bytes. The write function should return + * %CAIRO_STATUS_SUCCESS if all the data was successfully written, + * %CAIRO_STATUS_WRITE_ERROR otherwise. + * + * Returns: the status code of the write operation + * + * Since: 1.0 + **/ +typedef cairo_status_t (*cairo_write_func_t) (void *closure, + const unsigned char *data, + unsigned int length); + +/** + * cairo_read_func_t: + * @closure: the input closure + * @data: the buffer into which to read the data + * @length: the amount of data to read + * + * #cairo_read_func_t is the type of function which is called when a + * backend needs to read data from an input stream. It is passed the + * closure which was specified by the user at the time the read + * function was registered, the buffer to read the data into and the + * length of the data in bytes. The read function should return + * %CAIRO_STATUS_SUCCESS if all the data was successfully read, + * %CAIRO_STATUS_READ_ERROR otherwise. + * + * Returns: the status code of the read operation + * + * Since: 1.0 + **/ +typedef cairo_status_t (*cairo_read_func_t) (void *closure, + unsigned char *data, + unsigned int length); + +/** + * cairo_rectangle_int_t: + * @x: X coordinate of the left side of the rectangle + * @y: Y coordinate of the the top side of the rectangle + * @width: width of the rectangle + * @height: height of the rectangle + * + * A data structure for holding a rectangle with integer coordinates. + * + * Since: 1.10 + **/ + +typedef struct _cairo_rectangle_int { + int x, y; + int width, height; +} cairo_rectangle_int_t; + + +/* Functions for manipulating state objects */ +cairo_public cairo_t * +cairo_create (cairo_surface_t *target); + +cairo_public cairo_t * +cairo_reference (cairo_t *cr); + +cairo_public void +cairo_destroy (cairo_t *cr); + +cairo_public unsigned int +cairo_get_reference_count (cairo_t *cr); + +cairo_public void * +cairo_get_user_data (cairo_t *cr, + const cairo_user_data_key_t *key); + +cairo_public cairo_status_t +cairo_set_user_data (cairo_t *cr, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + +cairo_public void +cairo_save (cairo_t *cr); + +cairo_public void +cairo_restore (cairo_t *cr); + +cairo_public void +cairo_push_group (cairo_t *cr); + +cairo_public void +cairo_push_group_with_content (cairo_t *cr, cairo_content_t content); + +cairo_public cairo_pattern_t * +cairo_pop_group (cairo_t *cr); + +cairo_public void +cairo_pop_group_to_source (cairo_t *cr); + +/* Modify state */ + +/** + * cairo_operator_t: + * @CAIRO_OPERATOR_CLEAR: clear destination layer (bounded) (Since 1.0) + * @CAIRO_OPERATOR_SOURCE: replace destination layer (bounded) (Since 1.0) + * @CAIRO_OPERATOR_OVER: draw source layer on top of destination layer + * (bounded) (Since 1.0) + * @CAIRO_OPERATOR_IN: draw source where there was destination content + * (unbounded) (Since 1.0) + * @CAIRO_OPERATOR_OUT: draw source where there was no destination + * content (unbounded) (Since 1.0) + * @CAIRO_OPERATOR_ATOP: draw source on top of destination content and + * only there (Since 1.0) + * @CAIRO_OPERATOR_DEST: ignore the source (Since 1.0) + * @CAIRO_OPERATOR_DEST_OVER: draw destination on top of source (Since 1.0) + * @CAIRO_OPERATOR_DEST_IN: leave destination only where there was + * source content (unbounded) (Since 1.0) + * @CAIRO_OPERATOR_DEST_OUT: leave destination only where there was no + * source content (Since 1.0) + * @CAIRO_OPERATOR_DEST_ATOP: leave destination on top of source content + * and only there (unbounded) (Since 1.0) + * @CAIRO_OPERATOR_XOR: source and destination are shown where there is only + * one of them (Since 1.0) + * @CAIRO_OPERATOR_ADD: source and destination layers are accumulated (Since 1.0) + * @CAIRO_OPERATOR_SATURATE: like over, but assuming source and dest are + * disjoint geometries (Since 1.0) + * @CAIRO_OPERATOR_MULTIPLY: source and destination layers are multiplied. + * This causes the result to be at least as dark as the darker inputs. (Since 1.10) + * @CAIRO_OPERATOR_SCREEN: source and destination are complemented and + * multiplied. This causes the result to be at least as light as the lighter + * inputs. (Since 1.10) + * @CAIRO_OPERATOR_OVERLAY: multiplies or screens, depending on the + * lightness of the destination color. (Since 1.10) + * @CAIRO_OPERATOR_DARKEN: replaces the destination with the source if it + * is darker, otherwise keeps the source. (Since 1.10) + * @CAIRO_OPERATOR_LIGHTEN: replaces the destination with the source if it + * is lighter, otherwise keeps the source. (Since 1.10) + * @CAIRO_OPERATOR_COLOR_DODGE: brightens the destination color to reflect + * the source color. (Since 1.10) + * @CAIRO_OPERATOR_COLOR_BURN: darkens the destination color to reflect + * the source color. (Since 1.10) + * @CAIRO_OPERATOR_HARD_LIGHT: Multiplies or screens, dependent on source + * color. (Since 1.10) + * @CAIRO_OPERATOR_SOFT_LIGHT: Darkens or lightens, dependent on source + * color. (Since 1.10) + * @CAIRO_OPERATOR_DIFFERENCE: Takes the difference of the source and + * destination color. (Since 1.10) + * @CAIRO_OPERATOR_EXCLUSION: Produces an effect similar to difference, but + * with lower contrast. (Since 1.10) + * @CAIRO_OPERATOR_HSL_HUE: Creates a color with the hue of the source + * and the saturation and luminosity of the target. (Since 1.10) + * @CAIRO_OPERATOR_HSL_SATURATION: Creates a color with the saturation + * of the source and the hue and luminosity of the target. Painting with + * this mode onto a gray area produces no change. (Since 1.10) + * @CAIRO_OPERATOR_HSL_COLOR: Creates a color with the hue and saturation + * of the source and the luminosity of the target. This preserves the gray + * levels of the target and is useful for coloring monochrome images or + * tinting color images. (Since 1.10) + * @CAIRO_OPERATOR_HSL_LUMINOSITY: Creates a color with the luminosity of + * the source and the hue and saturation of the target. This produces an + * inverse effect to @CAIRO_OPERATOR_HSL_COLOR. (Since 1.10) + * + * #cairo_operator_t is used to set the compositing operator for all cairo + * drawing operations. + * + * The default operator is %CAIRO_OPERATOR_OVER. + * + * The operators marked as unbounded modify their + * destination even outside of the mask layer (that is, their effect is not + * bound by the mask layer). However, their effect can still be limited by + * way of clipping. + * + * To keep things simple, the operator descriptions here + * document the behavior for when both source and destination are either fully + * transparent or fully opaque. The actual implementation works for + * translucent layers too. + * For a more detailed explanation of the effects of each operator, including + * the mathematical definitions, see + * http://cairographics.org/operators/. + * + * Since: 1.0 + **/ +typedef enum _cairo_operator { + CAIRO_OPERATOR_CLEAR, + + CAIRO_OPERATOR_SOURCE, + CAIRO_OPERATOR_OVER, + CAIRO_OPERATOR_IN, + CAIRO_OPERATOR_OUT, + CAIRO_OPERATOR_ATOP, + + CAIRO_OPERATOR_DEST, + CAIRO_OPERATOR_DEST_OVER, + CAIRO_OPERATOR_DEST_IN, + CAIRO_OPERATOR_DEST_OUT, + CAIRO_OPERATOR_DEST_ATOP, + + CAIRO_OPERATOR_XOR, + CAIRO_OPERATOR_ADD, + CAIRO_OPERATOR_SATURATE, + + CAIRO_OPERATOR_MULTIPLY, + CAIRO_OPERATOR_SCREEN, + CAIRO_OPERATOR_OVERLAY, + CAIRO_OPERATOR_DARKEN, + CAIRO_OPERATOR_LIGHTEN, + CAIRO_OPERATOR_COLOR_DODGE, + CAIRO_OPERATOR_COLOR_BURN, + CAIRO_OPERATOR_HARD_LIGHT, + CAIRO_OPERATOR_SOFT_LIGHT, + CAIRO_OPERATOR_DIFFERENCE, + CAIRO_OPERATOR_EXCLUSION, + CAIRO_OPERATOR_HSL_HUE, + CAIRO_OPERATOR_HSL_SATURATION, + CAIRO_OPERATOR_HSL_COLOR, + CAIRO_OPERATOR_HSL_LUMINOSITY +} cairo_operator_t; + +cairo_public void +cairo_set_operator (cairo_t *cr, cairo_operator_t op); + +cairo_public void +cairo_set_source (cairo_t *cr, cairo_pattern_t *source); + +cairo_public void +cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue); + +cairo_public void +cairo_set_source_rgba (cairo_t *cr, + double red, double green, double blue, + double alpha); + +cairo_public void +cairo_set_source_surface (cairo_t *cr, + cairo_surface_t *surface, + double x, + double y); + +cairo_public void +cairo_set_tolerance (cairo_t *cr, double tolerance); + +/** + * cairo_antialias_t: + * @CAIRO_ANTIALIAS_DEFAULT: Use the default antialiasing for + * the subsystem and target device, since 1.0 + * @CAIRO_ANTIALIAS_NONE: Use a bilevel alpha mask, since 1.0 + * @CAIRO_ANTIALIAS_GRAY: Perform single-color antialiasing (using + * shades of gray for black text on a white background, for example), since 1.0 + * @CAIRO_ANTIALIAS_SUBPIXEL: Perform antialiasing by taking + * advantage of the order of subpixel elements on devices + * such as LCD panels, since 1.0 + * @CAIRO_ANTIALIAS_FAST: Hint that the backend should perform some + * antialiasing but prefer speed over quality, since 1.12 + * @CAIRO_ANTIALIAS_GOOD: The backend should balance quality against + * performance, since 1.12 + * @CAIRO_ANTIALIAS_BEST: Hint that the backend should render at the highest + * quality, sacrificing speed if necessary, since 1.12 + * + * Specifies the type of antialiasing to do when rendering text or shapes. + * + * As it is not necessarily clear from the above what advantages a particular + * antialias method provides, since 1.12, there is also a set of hints: + * @CAIRO_ANTIALIAS_FAST: Allow the backend to degrade raster quality for speed + * @CAIRO_ANTIALIAS_GOOD: A balance between speed and quality + * @CAIRO_ANTIALIAS_BEST: A high-fidelity, but potentially slow, raster mode + * + * These make no guarantee on how the backend will perform its rasterisation + * (if it even rasterises!), nor that they have any differing effect other + * than to enable some form of antialiasing. In the case of glyph rendering, + * @CAIRO_ANTIALIAS_FAST and @CAIRO_ANTIALIAS_GOOD will be mapped to + * @CAIRO_ANTIALIAS_GRAY, with @CAIRO_ANTALIAS_BEST being equivalent to + * @CAIRO_ANTIALIAS_SUBPIXEL. + * + * The interpretation of @CAIRO_ANTIALIAS_DEFAULT is left entirely up to + * the backend, typically this will be similar to @CAIRO_ANTIALIAS_GOOD. + * + * Since: 1.0 + **/ +typedef enum _cairo_antialias { + CAIRO_ANTIALIAS_DEFAULT, + + /* method */ + CAIRO_ANTIALIAS_NONE, + CAIRO_ANTIALIAS_GRAY, + CAIRO_ANTIALIAS_SUBPIXEL, + + /* hints */ + CAIRO_ANTIALIAS_FAST, + CAIRO_ANTIALIAS_GOOD, + CAIRO_ANTIALIAS_BEST +} cairo_antialias_t; + +cairo_public void +cairo_set_antialias (cairo_t *cr, cairo_antialias_t antialias); + +/** + * cairo_fill_rule_t: + * @CAIRO_FILL_RULE_WINDING: If the path crosses the ray from + * left-to-right, counts +1. If the path crosses the ray + * from right to left, counts -1. (Left and right are determined + * from the perspective of looking along the ray from the starting + * point.) If the total count is non-zero, the point will be filled. (Since 1.0) + * @CAIRO_FILL_RULE_EVEN_ODD: Counts the total number of + * intersections, without regard to the orientation of the contour. If + * the total number of intersections is odd, the point will be + * filled. (Since 1.0) + * + * #cairo_fill_rule_t is used to select how paths are filled. For both + * fill rules, whether or not a point is included in the fill is + * determined by taking a ray from that point to infinity and looking + * at intersections with the path. The ray can be in any direction, + * as long as it doesn't pass through the end point of a segment + * or have a tricky intersection such as intersecting tangent to the path. + * (Note that filling is not actually implemented in this way. This + * is just a description of the rule that is applied.) + * + * The default fill rule is %CAIRO_FILL_RULE_WINDING. + * + * New entries may be added in future versions. + * + * Since: 1.0 + **/ +typedef enum _cairo_fill_rule { + CAIRO_FILL_RULE_WINDING, + CAIRO_FILL_RULE_EVEN_ODD +} cairo_fill_rule_t; + +cairo_public void +cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule); + +cairo_public void +cairo_set_line_width (cairo_t *cr, double width); + +/** + * cairo_line_cap_t: + * @CAIRO_LINE_CAP_BUTT: start(stop) the line exactly at the start(end) point (Since 1.0) + * @CAIRO_LINE_CAP_ROUND: use a round ending, the center of the circle is the end point (Since 1.0) + * @CAIRO_LINE_CAP_SQUARE: use squared ending, the center of the square is the end point (Since 1.0) + * + * Specifies how to render the endpoints of the path when stroking. + * + * The default line cap style is %CAIRO_LINE_CAP_BUTT. + * + * Since: 1.0 + **/ +typedef enum _cairo_line_cap { + CAIRO_LINE_CAP_BUTT, + CAIRO_LINE_CAP_ROUND, + CAIRO_LINE_CAP_SQUARE +} cairo_line_cap_t; + +cairo_public void +cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap); + +/** + * cairo_line_join_t: + * @CAIRO_LINE_JOIN_MITER: use a sharp (angled) corner, see + * cairo_set_miter_limit() (Since 1.0) + * @CAIRO_LINE_JOIN_ROUND: use a rounded join, the center of the circle is the + * joint point (Since 1.0) + * @CAIRO_LINE_JOIN_BEVEL: use a cut-off join, the join is cut off at half + * the line width from the joint point (Since 1.0) + * + * Specifies how to render the junction of two lines when stroking. + * + * The default line join style is %CAIRO_LINE_JOIN_MITER. + * + * Since: 1.0 + **/ +typedef enum _cairo_line_join { + CAIRO_LINE_JOIN_MITER, + CAIRO_LINE_JOIN_ROUND, + CAIRO_LINE_JOIN_BEVEL +} cairo_line_join_t; + +cairo_public void +cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join); + +cairo_public void +cairo_set_dash (cairo_t *cr, + const double *dashes, + int num_dashes, + double offset); + +cairo_public void +cairo_set_miter_limit (cairo_t *cr, double limit); + +cairo_public void +cairo_translate (cairo_t *cr, double tx, double ty); + +cairo_public void +cairo_scale (cairo_t *cr, double sx, double sy); + +cairo_public void +cairo_rotate (cairo_t *cr, double angle); + +cairo_public void +cairo_transform (cairo_t *cr, + const cairo_matrix_t *matrix); + +cairo_public void +cairo_set_matrix (cairo_t *cr, + const cairo_matrix_t *matrix); + +cairo_public void +cairo_identity_matrix (cairo_t *cr); + +cairo_public void +cairo_user_to_device (cairo_t *cr, double *x, double *y); + +cairo_public void +cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy); + +cairo_public void +cairo_device_to_user (cairo_t *cr, double *x, double *y); + +cairo_public void +cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy); + +/* Path creation functions */ +cairo_public void +cairo_new_path (cairo_t *cr); + +cairo_public void +cairo_move_to (cairo_t *cr, double x, double y); + +cairo_public void +cairo_new_sub_path (cairo_t *cr); + +cairo_public void +cairo_line_to (cairo_t *cr, double x, double y); + +cairo_public void +cairo_curve_to (cairo_t *cr, + double x1, double y1, + double x2, double y2, + double x3, double y3); + +cairo_public void +cairo_arc (cairo_t *cr, + double xc, double yc, + double radius, + double angle1, double angle2); + +cairo_public void +cairo_arc_negative (cairo_t *cr, + double xc, double yc, + double radius, + double angle1, double angle2); + +/* XXX: NYI +cairo_public void +cairo_arc_to (cairo_t *cr, + double x1, double y1, + double x2, double y2, + double radius); +*/ + +cairo_public void +cairo_rel_move_to (cairo_t *cr, double dx, double dy); + +cairo_public void +cairo_rel_line_to (cairo_t *cr, double dx, double dy); + +cairo_public void +cairo_rel_curve_to (cairo_t *cr, + double dx1, double dy1, + double dx2, double dy2, + double dx3, double dy3); + +cairo_public void +cairo_rectangle (cairo_t *cr, + double x, double y, + double width, double height); + +/* XXX: NYI +cairo_public void +cairo_stroke_to_path (cairo_t *cr); +*/ + +cairo_public void +cairo_close_path (cairo_t *cr); + +cairo_public void +cairo_path_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +/* Painting functions */ +cairo_public void +cairo_paint (cairo_t *cr); + +cairo_public void +cairo_paint_with_alpha (cairo_t *cr, + double alpha); + +cairo_public void +cairo_mask (cairo_t *cr, + cairo_pattern_t *pattern); + +cairo_public void +cairo_mask_surface (cairo_t *cr, + cairo_surface_t *surface, + double surface_x, + double surface_y); + +cairo_public void +cairo_stroke (cairo_t *cr); + +cairo_public void +cairo_stroke_preserve (cairo_t *cr); + +cairo_public void +cairo_fill (cairo_t *cr); + +cairo_public void +cairo_fill_preserve (cairo_t *cr); + +cairo_public void +cairo_copy_page (cairo_t *cr); + +cairo_public void +cairo_show_page (cairo_t *cr); + +/* Insideness testing */ +cairo_public cairo_bool_t +cairo_in_stroke (cairo_t *cr, double x, double y); + +cairo_public cairo_bool_t +cairo_in_fill (cairo_t *cr, double x, double y); + +cairo_public cairo_bool_t +cairo_in_clip (cairo_t *cr, double x, double y); + +/* Rectangular extents */ +cairo_public void +cairo_stroke_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +cairo_public void +cairo_fill_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +/* Clipping */ +cairo_public void +cairo_reset_clip (cairo_t *cr); + +cairo_public void +cairo_clip (cairo_t *cr); + +cairo_public void +cairo_clip_preserve (cairo_t *cr); + +cairo_public void +cairo_clip_extents (cairo_t *cr, + double *x1, double *y1, + double *x2, double *y2); + +/** + * cairo_rectangle_t: + * @x: X coordinate of the left side of the rectangle + * @y: Y coordinate of the the top side of the rectangle + * @width: width of the rectangle + * @height: height of the rectangle + * + * A data structure for holding a rectangle. + * + * Since: 1.4 + **/ +typedef struct _cairo_rectangle { + double x, y, width, height; +} cairo_rectangle_t; + +/** + * cairo_rectangle_list_t: + * @status: Error status of the rectangle list + * @rectangles: Array containing the rectangles + * @num_rectangles: Number of rectangles in this list + * + * A data structure for holding a dynamically allocated + * array of rectangles. + * + * Since: 1.4 + **/ +typedef struct _cairo_rectangle_list { + cairo_status_t status; + cairo_rectangle_t *rectangles; + int num_rectangles; +} cairo_rectangle_list_t; + +cairo_public cairo_rectangle_list_t * +cairo_copy_clip_rectangle_list (cairo_t *cr); + +cairo_public void +cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list); + +/* Font/Text functions */ + +/** + * cairo_scaled_font_t: + * + * A #cairo_scaled_font_t is a font scaled to a particular size and device + * resolution. A #cairo_scaled_font_t is most useful for low-level font + * usage where a library or application wants to cache a reference + * to a scaled font to speed up the computation of metrics. + * + * There are various types of scaled fonts, depending on the + * font backend they use. The type of a + * scaled font can be queried using cairo_scaled_font_get_type(). + * + * Memory management of #cairo_scaled_font_t is done with + * cairo_scaled_font_reference() and cairo_scaled_font_destroy(). + * + * Since: 1.0 + **/ +typedef struct _cairo_scaled_font cairo_scaled_font_t; + +/** + * cairo_font_face_t: + * + * A #cairo_font_face_t specifies all aspects of a font other + * than the size or font matrix (a font matrix is used to distort + * a font by sheering it or scaling it unequally in the two + * directions) . A font face can be set on a #cairo_t by using + * cairo_set_font_face(); the size and font matrix are set with + * cairo_set_font_size() and cairo_set_font_matrix(). + * + * There are various types of font faces, depending on the + * font backend they use. The type of a + * font face can be queried using cairo_font_face_get_type(). + * + * Memory management of #cairo_font_face_t is done with + * cairo_font_face_reference() and cairo_font_face_destroy(). + * + * Since: 1.0 + **/ +typedef struct _cairo_font_face cairo_font_face_t; + +/** + * cairo_glyph_t: + * @index: glyph index in the font. The exact interpretation of the + * glyph index depends on the font technology being used. + * @x: the offset in the X direction between the origin used for + * drawing or measuring the string and the origin of this glyph. + * @y: the offset in the Y direction between the origin used for + * drawing or measuring the string and the origin of this glyph. + * + * The #cairo_glyph_t structure holds information about a single glyph + * when drawing or measuring text. A font is (in simple terms) a + * collection of shapes used to draw text. A glyph is one of these + * shapes. There can be multiple glyphs for a single character + * (alternates to be used in different contexts, for example), or a + * glyph can be a ligature of multiple + * characters. Cairo doesn't expose any way of converting input text + * into glyphs, so in order to use the Cairo interfaces that take + * arrays of glyphs, you must directly access the appropriate + * underlying font system. + * + * Note that the offsets given by @x and @y are not cumulative. When + * drawing or measuring text, each glyph is individually positioned + * with respect to the overall origin + * + * Since: 1.0 + **/ +typedef struct { + unsigned long index; + double x; + double y; +} cairo_glyph_t; + +cairo_public cairo_glyph_t * +cairo_glyph_allocate (int num_glyphs); + +cairo_public void +cairo_glyph_free (cairo_glyph_t *glyphs); + +/** + * cairo_text_cluster_t: + * @num_bytes: the number of bytes of UTF-8 text covered by cluster + * @num_glyphs: the number of glyphs covered by cluster + * + * The #cairo_text_cluster_t structure holds information about a single + * text cluster. A text cluster is a minimal + * mapping of some glyphs corresponding to some UTF-8 text. + * + * For a cluster to be valid, both @num_bytes and @num_glyphs should + * be non-negative, and at least one should be non-zero. + * Note that clusters with zero glyphs are not as well supported as + * normal clusters. For example, PDF rendering applications typically + * ignore those clusters when PDF text is being selected. + * + * See cairo_show_text_glyphs() for how clusters are used in advanced + * text operations. + * + * Since: 1.8 + **/ +typedef struct { + int num_bytes; + int num_glyphs; +} cairo_text_cluster_t; + +cairo_public cairo_text_cluster_t * +cairo_text_cluster_allocate (int num_clusters); + +cairo_public void +cairo_text_cluster_free (cairo_text_cluster_t *clusters); + +/** + * cairo_text_cluster_flags_t: + * @CAIRO_TEXT_CLUSTER_FLAG_BACKWARD: The clusters in the cluster array + * map to glyphs in the glyph array from end to start. (Since 1.8) + * + * Specifies properties of a text cluster mapping. + * + * Since: 1.8 + **/ +typedef enum _cairo_text_cluster_flags { + CAIRO_TEXT_CLUSTER_FLAG_BACKWARD = 0x00000001 +} cairo_text_cluster_flags_t; + +/** + * cairo_text_extents_t: + * @x_bearing: the horizontal distance from the origin to the + * leftmost part of the glyphs as drawn. Positive if the + * glyphs lie entirely to the right of the origin. + * @y_bearing: the vertical distance from the origin to the + * topmost part of the glyphs as drawn. Positive only if the + * glyphs lie completely below the origin; will usually be + * negative. + * @width: width of the glyphs as drawn + * @height: height of the glyphs as drawn + * @x_advance:distance to advance in the X direction + * after drawing these glyphs + * @y_advance: distance to advance in the Y direction + * after drawing these glyphs. Will typically be zero except + * for vertical text layout as found in East-Asian languages. + * + * The #cairo_text_extents_t structure stores the extents of a single + * glyph or a string of glyphs in user-space coordinates. Because text + * extents are in user-space coordinates, they are mostly, but not + * entirely, independent of the current transformation matrix. If you call + * cairo_scale(cr, 2.0, 2.0), text will + * be drawn twice as big, but the reported text extents will not be + * doubled. They will change slightly due to hinting (so you can't + * assume that metrics are independent of the transformation matrix), + * but otherwise will remain unchanged. + * + * Since: 1.0 + **/ +typedef struct { + double x_bearing; + double y_bearing; + double width; + double height; + double x_advance; + double y_advance; +} cairo_text_extents_t; + +/** + * cairo_font_extents_t: + * @ascent: the distance that the font extends above the baseline. + * Note that this is not always exactly equal to the maximum + * of the extents of all the glyphs in the font, but rather + * is picked to express the font designer's intent as to + * how the font should align with elements above it. + * @descent: the distance that the font extends below the baseline. + * This value is positive for typical fonts that include + * portions below the baseline. Note that this is not always + * exactly equal to the maximum of the extents of all the + * glyphs in the font, but rather is picked to express the + * font designer's intent as to how the font should + * align with elements below it. + * @height: the recommended vertical distance between baselines when + * setting consecutive lines of text with the font. This + * is greater than @ascent+@descent by a + * quantity known as the line spacing + * or external leading. When space + * is at a premium, most fonts can be set with only + * a distance of @ascent+@descent between lines. + * @max_x_advance: the maximum distance in the X direction that + * the origin is advanced for any glyph in the font. + * @max_y_advance: the maximum distance in the Y direction that + * the origin is advanced for any glyph in the font. + * This will be zero for normal fonts used for horizontal + * writing. (The scripts of East Asia are sometimes written + * vertically.) + * + * The #cairo_font_extents_t structure stores metric information for + * a font. Values are given in the current user-space coordinate + * system. + * + * Because font metrics are in user-space coordinates, they are + * mostly, but not entirely, independent of the current transformation + * matrix. If you call cairo_scale(cr, 2.0, 2.0), + * text will be drawn twice as big, but the reported text extents will + * not be doubled. They will change slightly due to hinting (so you + * can't assume that metrics are independent of the transformation + * matrix), but otherwise will remain unchanged. + * + * Since: 1.0 + **/ +typedef struct { + double ascent; + double descent; + double height; + double max_x_advance; + double max_y_advance; +} cairo_font_extents_t; + +/** + * cairo_font_slant_t: + * @CAIRO_FONT_SLANT_NORMAL: Upright font style, since 1.0 + * @CAIRO_FONT_SLANT_ITALIC: Italic font style, since 1.0 + * @CAIRO_FONT_SLANT_OBLIQUE: Oblique font style, since 1.0 + * + * Specifies variants of a font face based on their slant. + * + * Since: 1.0 + **/ +typedef enum _cairo_font_slant { + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_SLANT_ITALIC, + CAIRO_FONT_SLANT_OBLIQUE +} cairo_font_slant_t; + +/** + * cairo_font_weight_t: + * @CAIRO_FONT_WEIGHT_NORMAL: Normal font weight, since 1.0 + * @CAIRO_FONT_WEIGHT_BOLD: Bold font weight, since 1.0 + * + * Specifies variants of a font face based on their weight. + * + * Since: 1.0 + **/ +typedef enum _cairo_font_weight { + CAIRO_FONT_WEIGHT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD +} cairo_font_weight_t; + +/** + * cairo_subpixel_order_t: + * @CAIRO_SUBPIXEL_ORDER_DEFAULT: Use the default subpixel order for + * for the target device, since 1.0 + * @CAIRO_SUBPIXEL_ORDER_RGB: Subpixel elements are arranged horizontally + * with red at the left, since 1.0 + * @CAIRO_SUBPIXEL_ORDER_BGR: Subpixel elements are arranged horizontally + * with blue at the left, since 1.0 + * @CAIRO_SUBPIXEL_ORDER_VRGB: Subpixel elements are arranged vertically + * with red at the top, since 1.0 + * @CAIRO_SUBPIXEL_ORDER_VBGR: Subpixel elements are arranged vertically + * with blue at the top, since 1.0 + * + * The subpixel order specifies the order of color elements within + * each pixel on the display device when rendering with an + * antialiasing mode of %CAIRO_ANTIALIAS_SUBPIXEL. + * + * Since: 1.0 + **/ +typedef enum _cairo_subpixel_order { + CAIRO_SUBPIXEL_ORDER_DEFAULT, + CAIRO_SUBPIXEL_ORDER_RGB, + CAIRO_SUBPIXEL_ORDER_BGR, + CAIRO_SUBPIXEL_ORDER_VRGB, + CAIRO_SUBPIXEL_ORDER_VBGR +} cairo_subpixel_order_t; + +/** + * cairo_hint_style_t: + * @CAIRO_HINT_STYLE_DEFAULT: Use the default hint style for + * font backend and target device, since 1.0 + * @CAIRO_HINT_STYLE_NONE: Do not hint outlines, since 1.0 + * @CAIRO_HINT_STYLE_SLIGHT: Hint outlines slightly to improve + * contrast while retaining good fidelity to the original + * shapes, since 1.0 + * @CAIRO_HINT_STYLE_MEDIUM: Hint outlines with medium strength + * giving a compromise between fidelity to the original shapes + * and contrast, since 1.0 + * @CAIRO_HINT_STYLE_FULL: Hint outlines to maximize contrast, since 1.0 + * + * Specifies the type of hinting to do on font outlines. Hinting + * is the process of fitting outlines to the pixel grid in order + * to improve the appearance of the result. Since hinting outlines + * involves distorting them, it also reduces the faithfulness + * to the original outline shapes. Not all of the outline hinting + * styles are supported by all font backends. + * + * New entries may be added in future versions. + * + * Since: 1.0 + **/ +typedef enum _cairo_hint_style { + CAIRO_HINT_STYLE_DEFAULT, + CAIRO_HINT_STYLE_NONE, + CAIRO_HINT_STYLE_SLIGHT, + CAIRO_HINT_STYLE_MEDIUM, + CAIRO_HINT_STYLE_FULL +} cairo_hint_style_t; + +/** + * cairo_hint_metrics_t: + * @CAIRO_HINT_METRICS_DEFAULT: Hint metrics in the default + * manner for the font backend and target device, since 1.0 + * @CAIRO_HINT_METRICS_OFF: Do not hint font metrics, since 1.0 + * @CAIRO_HINT_METRICS_ON: Hint font metrics, since 1.0 + * + * Specifies whether to hint font metrics; hinting font metrics + * means quantizing them so that they are integer values in + * device space. Doing this improves the consistency of + * letter and line spacing, however it also means that text + * will be laid out differently at different zoom factors. + * + * Since: 1.0 + **/ +typedef enum _cairo_hint_metrics { + CAIRO_HINT_METRICS_DEFAULT, + CAIRO_HINT_METRICS_OFF, + CAIRO_HINT_METRICS_ON +} cairo_hint_metrics_t; + +/** + * cairo_font_options_t: + * + * An opaque structure holding all options that are used when + * rendering fonts. + * + * Individual features of a #cairo_font_options_t can be set or + * accessed using functions named + * cairo_font_options_set_feature_name() and + * cairo_font_options_get_feature_name(), like + * cairo_font_options_set_antialias() and + * cairo_font_options_get_antialias(). + * + * New features may be added to a #cairo_font_options_t in the + * future. For this reason, cairo_font_options_copy(), + * cairo_font_options_equal(), cairo_font_options_merge(), and + * cairo_font_options_hash() should be used to copy, check + * for equality, merge, or compute a hash value of + * #cairo_font_options_t objects. + * + * Since: 1.0 + **/ +typedef struct _cairo_font_options cairo_font_options_t; + +cairo_public cairo_font_options_t * +cairo_font_options_create (void); + +cairo_public cairo_font_options_t * +cairo_font_options_copy (const cairo_font_options_t *original); + +cairo_public void +cairo_font_options_destroy (cairo_font_options_t *options); + +cairo_public cairo_status_t +cairo_font_options_status (cairo_font_options_t *options); + +cairo_public void +cairo_font_options_merge (cairo_font_options_t *options, + const cairo_font_options_t *other); +cairo_public cairo_bool_t +cairo_font_options_equal (const cairo_font_options_t *options, + const cairo_font_options_t *other); + +cairo_public unsigned long +cairo_font_options_hash (const cairo_font_options_t *options); + +cairo_public void +cairo_font_options_set_antialias (cairo_font_options_t *options, + cairo_antialias_t antialias); +cairo_public cairo_antialias_t +cairo_font_options_get_antialias (const cairo_font_options_t *options); + +cairo_public void +cairo_font_options_set_subpixel_order (cairo_font_options_t *options, + cairo_subpixel_order_t subpixel_order); +cairo_public cairo_subpixel_order_t +cairo_font_options_get_subpixel_order (const cairo_font_options_t *options); + +cairo_public void +cairo_font_options_set_hint_style (cairo_font_options_t *options, + cairo_hint_style_t hint_style); +cairo_public cairo_hint_style_t +cairo_font_options_get_hint_style (const cairo_font_options_t *options); + +cairo_public void +cairo_font_options_set_hint_metrics (cairo_font_options_t *options, + cairo_hint_metrics_t hint_metrics); +cairo_public cairo_hint_metrics_t +cairo_font_options_get_hint_metrics (const cairo_font_options_t *options); + +/* This interface is for dealing with text as text, not caring about the + font object inside the the cairo_t. */ + +cairo_public void +cairo_select_font_face (cairo_t *cr, + const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight); + +cairo_public void +cairo_set_font_size (cairo_t *cr, double size); + +cairo_public void +cairo_set_font_matrix (cairo_t *cr, + const cairo_matrix_t *matrix); + +cairo_public void +cairo_get_font_matrix (cairo_t *cr, + cairo_matrix_t *matrix); + +cairo_public void +cairo_set_font_options (cairo_t *cr, + const cairo_font_options_t *options); + +cairo_public void +cairo_get_font_options (cairo_t *cr, + cairo_font_options_t *options); + +cairo_public void +cairo_set_font_face (cairo_t *cr, cairo_font_face_t *font_face); + +cairo_public cairo_font_face_t * +cairo_get_font_face (cairo_t *cr); + +cairo_public void +cairo_set_scaled_font (cairo_t *cr, + const cairo_scaled_font_t *scaled_font); + +cairo_public cairo_scaled_font_t * +cairo_get_scaled_font (cairo_t *cr); + +cairo_public void +cairo_show_text (cairo_t *cr, const char *utf8); + +cairo_public void +cairo_show_glyphs (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs); + +cairo_public void +cairo_show_text_glyphs (cairo_t *cr, + const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags); + +cairo_public void +cairo_text_path (cairo_t *cr, const char *utf8); + +cairo_public void +cairo_glyph_path (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs); + +cairo_public void +cairo_text_extents (cairo_t *cr, + const char *utf8, + cairo_text_extents_t *extents); + +cairo_public void +cairo_glyph_extents (cairo_t *cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents); + +cairo_public void +cairo_font_extents (cairo_t *cr, + cairo_font_extents_t *extents); + +/* Generic identifier for a font style */ + +cairo_public cairo_font_face_t * +cairo_font_face_reference (cairo_font_face_t *font_face); + +cairo_public void +cairo_font_face_destroy (cairo_font_face_t *font_face); + +cairo_public unsigned int +cairo_font_face_get_reference_count (cairo_font_face_t *font_face); + +cairo_public cairo_status_t +cairo_font_face_status (cairo_font_face_t *font_face); + + +/** + * cairo_font_type_t: + * @CAIRO_FONT_TYPE_TOY: The font was created using cairo's toy font api (Since: 1.2) + * @CAIRO_FONT_TYPE_FT: The font is of type FreeType (Since: 1.2) + * @CAIRO_FONT_TYPE_WIN32: The font is of type Win32 (Since: 1.2) + * @CAIRO_FONT_TYPE_QUARTZ: The font is of type Quartz (Since: 1.6, in 1.2 and + * 1.4 it was named CAIRO_FONT_TYPE_ATSUI) + * @CAIRO_FONT_TYPE_USER: The font was create using cairo's user font api (Since: 1.8) + * + * #cairo_font_type_t is used to describe the type of a given font + * face or scaled font. The font types are also known as "font + * backends" within cairo. + * + * The type of a font face is determined by the function used to + * create it, which will generally be of the form + * cairo_type_font_face_create(). + * The font face type can be queried with cairo_font_face_get_type() + * + * The various #cairo_font_face_t functions can be used with a font face + * of any type. + * + * The type of a scaled font is determined by the type of the font + * face passed to cairo_scaled_font_create(). The scaled font type can + * be queried with cairo_scaled_font_get_type() + * + * The various #cairo_scaled_font_t functions can be used with scaled + * fonts of any type, but some font backends also provide + * type-specific functions that must only be called with a scaled font + * of the appropriate type. These functions have names that begin with + * cairo_type_scaled_font() + * such as cairo_ft_scaled_font_lock_face(). + * + * The behavior of calling a type-specific function with a scaled font + * of the wrong type is undefined. + * + * New entries may be added in future versions. + * + * Since: 1.2 + **/ +typedef enum _cairo_font_type { + CAIRO_FONT_TYPE_TOY, + CAIRO_FONT_TYPE_FT, + CAIRO_FONT_TYPE_WIN32, + CAIRO_FONT_TYPE_QUARTZ, + CAIRO_FONT_TYPE_USER +} cairo_font_type_t; + +cairo_public cairo_font_type_t +cairo_font_face_get_type (cairo_font_face_t *font_face); + +cairo_public void * +cairo_font_face_get_user_data (cairo_font_face_t *font_face, + const cairo_user_data_key_t *key); + +cairo_public cairo_status_t +cairo_font_face_set_user_data (cairo_font_face_t *font_face, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + +/* Portable interface to general font features. */ + +cairo_public cairo_scaled_font_t * +cairo_scaled_font_create (cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options); + +cairo_public cairo_scaled_font_t * +cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font); + +cairo_public void +cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font); + +cairo_public unsigned int +cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font); + +cairo_public cairo_status_t +cairo_scaled_font_status (cairo_scaled_font_t *scaled_font); + +cairo_public cairo_font_type_t +cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font); + +cairo_public void * +cairo_scaled_font_get_user_data (cairo_scaled_font_t *scaled_font, + const cairo_user_data_key_t *key); + +cairo_public cairo_status_t +cairo_scaled_font_set_user_data (cairo_scaled_font_t *scaled_font, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + +cairo_public void +cairo_scaled_font_extents (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *extents); + +cairo_public void +cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_text_extents_t *extents); + +cairo_public void +cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents); + +cairo_public cairo_status_t +cairo_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, + double x, + double y, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags); + +cairo_public cairo_font_face_t * +cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font); + +cairo_public void +cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *font_matrix); + +cairo_public void +cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *ctm); + +cairo_public void +cairo_scaled_font_get_scale_matrix (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *scale_matrix); + +cairo_public void +cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font, + cairo_font_options_t *options); + + +/* Toy fonts */ + +cairo_public cairo_font_face_t * +cairo_toy_font_face_create (const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight); + +cairo_public const char * +cairo_toy_font_face_get_family (cairo_font_face_t *font_face); + +cairo_public cairo_font_slant_t +cairo_toy_font_face_get_slant (cairo_font_face_t *font_face); + +cairo_public cairo_font_weight_t +cairo_toy_font_face_get_weight (cairo_font_face_t *font_face); + + +/* User fonts */ + +cairo_public cairo_font_face_t * +cairo_user_font_face_create (void); + +/* User-font method signatures */ + +/** + * cairo_user_scaled_font_init_func_t: + * @scaled_font: the scaled-font being created + * @cr: a cairo context, in font space + * @extents: font extents to fill in, in font space + * + * #cairo_user_scaled_font_init_func_t is the type of function which is + * called when a scaled-font needs to be created for a user font-face. + * + * The cairo context @cr is not used by the caller, but is prepared in font + * space, similar to what the cairo contexts passed to the render_glyph + * method will look like. The callback can use this context for extents + * computation for example. After the callback is called, @cr is checked + * for any error status. + * + * The @extents argument is where the user font sets the font extents for + * @scaled_font. It is in font space, which means that for most cases its + * ascent and descent members should add to 1.0. @extents is preset to + * hold a value of 1.0 for ascent, height, and max_x_advance, and 0.0 for + * descent and max_y_advance members. + * + * The callback is optional. If not set, default font extents as described + * in the previous paragraph will be used. + * + * Note that @scaled_font is not fully initialized at this + * point and trying to use it for text operations in the callback will result + * in deadlock. + * + * Returns: %CAIRO_STATUS_SUCCESS upon success, or an error status on error. + * + * Since: 1.8 + **/ +typedef cairo_status_t (*cairo_user_scaled_font_init_func_t) (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *extents); + +/** + * cairo_user_scaled_font_render_glyph_func_t: + * @scaled_font: user scaled-font + * @glyph: glyph code to render + * @cr: cairo context to draw to, in font space + * @extents: glyph extents to fill in, in font space + * + * #cairo_user_scaled_font_render_glyph_func_t is the type of function which + * is called when a user scaled-font needs to render a glyph. + * + * The callback is mandatory, and expected to draw the glyph with code @glyph to + * the cairo context @cr. @cr is prepared such that the glyph drawing is done in + * font space. That is, the matrix set on @cr is the scale matrix of @scaled_font, + * The @extents argument is where the user font sets the font extents for + * @scaled_font. However, if user prefers to draw in user space, they can + * achieve that by changing the matrix on @cr. All cairo rendering operations + * to @cr are permitted, however, the result is undefined if any source other + * than the default source on @cr is used. That means, glyph bitmaps should + * be rendered using cairo_mask() instead of cairo_paint(). + * + * Other non-default settings on @cr include a font size of 1.0 (given that + * it is set up to be in font space), and font options corresponding to + * @scaled_font. + * + * The @extents argument is preset to have x_bearing, + * width, and y_advance of zero, + * y_bearing set to -font_extents.ascent, + * height to font_extents.ascent+font_extents.descent, + * and x_advance to font_extents.max_x_advance. + * The only field user needs to set in majority of cases is + * x_advance. + * If the width field is zero upon the callback returning + * (which is its preset value), the glyph extents are automatically computed + * based on the drawings done to @cr. This is in most cases exactly what the + * desired behavior is. However, if for any reason the callback sets the + * extents, it must be ink extents, and include the extents of all drawing + * done to @cr in the callback. + * + * Returns: %CAIRO_STATUS_SUCCESS upon success, or + * %CAIRO_STATUS_USER_FONT_ERROR or any other error status on error. + * + * Since: 1.8 + **/ +typedef cairo_status_t (*cairo_user_scaled_font_render_glyph_func_t) (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *extents); + +/** + * cairo_user_scaled_font_text_to_glyphs_func_t: + * @scaled_font: the scaled-font being created + * @utf8: a string of text encoded in UTF-8 + * @utf8_len: length of @utf8 in bytes + * @glyphs: pointer to array of glyphs to fill, in font space + * @num_glyphs: pointer to number of glyphs + * @clusters: pointer to array of cluster mapping information to fill, or %NULL + * @num_clusters: pointer to number of clusters + * @cluster_flags: pointer to location to store cluster flags corresponding to the + * output @clusters + * + * #cairo_user_scaled_font_text_to_glyphs_func_t is the type of function which + * is called to convert input text to an array of glyphs. This is used by the + * cairo_show_text() operation. + * + * Using this callback the user-font has full control on glyphs and their + * positions. That means, it allows for features like ligatures and kerning, + * as well as complex shaping required for scripts like + * Arabic and Indic. + * + * The @num_glyphs argument is preset to the number of glyph entries available + * in the @glyphs buffer. If the @glyphs buffer is %NULL, the value of + * @num_glyphs will be zero. If the provided glyph array is too short for + * the conversion (or for convenience), a new glyph array may be allocated + * using cairo_glyph_allocate() and placed in @glyphs. Upon return, + * @num_glyphs should contain the number of generated glyphs. If the value + * @glyphs points at has changed after the call, the caller will free the + * allocated glyph array using cairo_glyph_free(). The caller will also free + * the original value of @glyphs, so the callback shouldn't do so. + * The callback should populate the glyph indices and positions (in font space) + * assuming that the text is to be shown at the origin. + * + * If @clusters is not %NULL, @num_clusters and @cluster_flags are also + * non-%NULL, and cluster mapping should be computed. The semantics of how + * cluster array allocation works is similar to the glyph array. That is, + * if @clusters initially points to a non-%NULL value, that array may be used + * as a cluster buffer, and @num_clusters points to the number of cluster + * entries available there. If the provided cluster array is too short for + * the conversion (or for convenience), a new cluster array may be allocated + * using cairo_text_cluster_allocate() and placed in @clusters. In this case, + * the original value of @clusters will still be freed by the caller. Upon + * return, @num_clusters should contain the number of generated clusters. + * If the value @clusters points at has changed after the call, the caller + * will free the allocated cluster array using cairo_text_cluster_free(). + * + * The callback is optional. If @num_glyphs is negative upon + * the callback returning or if the return value + * is %CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, the unicode_to_glyph callback + * is tried. See #cairo_user_scaled_font_unicode_to_glyph_func_t. + * + * Note: While cairo does not impose any limitation on glyph indices, + * some applications may assume that a glyph index fits in a 16-bit + * unsigned integer. As such, it is advised that user-fonts keep their + * glyphs in the 0 to 65535 range. Furthermore, some applications may + * assume that glyph 0 is a special glyph-not-found glyph. User-fonts + * are advised to use glyph 0 for such purposes and do not use that + * glyph value for other purposes. + * + * Returns: %CAIRO_STATUS_SUCCESS upon success, + * %CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED if fallback options should be tried, + * or %CAIRO_STATUS_USER_FONT_ERROR or any other error status on error. + * + * Since: 1.8 + **/ +typedef cairo_status_t (*cairo_user_scaled_font_text_to_glyphs_func_t) (cairo_scaled_font_t *scaled_font, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags); + +/** + * cairo_user_scaled_font_unicode_to_glyph_func_t: + * @scaled_font: the scaled-font being created + * @unicode: input unicode character code-point + * @glyph_index: output glyph index + * + * #cairo_user_scaled_font_unicode_to_glyph_func_t is the type of function which + * is called to convert an input Unicode character to a single glyph. + * This is used by the cairo_show_text() operation. + * + * This callback is used to provide the same functionality as the + * text_to_glyphs callback does (see #cairo_user_scaled_font_text_to_glyphs_func_t) + * but has much less control on the output, + * in exchange for increased ease of use. The inherent assumption to using + * this callback is that each character maps to one glyph, and that the + * mapping is context independent. It also assumes that glyphs are positioned + * according to their advance width. These mean no ligatures, kerning, or + * complex scripts can be implemented using this callback. + * + * The callback is optional, and only used if text_to_glyphs callback is not + * set or fails to return glyphs. If this callback is not set or if it returns + * %CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, an identity mapping from Unicode + * code-points to glyph indices is assumed. + * + * Note: While cairo does not impose any limitation on glyph indices, + * some applications may assume that a glyph index fits in a 16-bit + * unsigned integer. As such, it is advised that user-fonts keep their + * glyphs in the 0 to 65535 range. Furthermore, some applications may + * assume that glyph 0 is a special glyph-not-found glyph. User-fonts + * are advised to use glyph 0 for such purposes and do not use that + * glyph value for other purposes. + * + * Returns: %CAIRO_STATUS_SUCCESS upon success, + * %CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED if fallback options should be tried, + * or %CAIRO_STATUS_USER_FONT_ERROR or any other error status on error. + * + * Since: 1.8 + **/ +typedef cairo_status_t (*cairo_user_scaled_font_unicode_to_glyph_func_t) (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph_index); + +/* User-font method setters */ + +cairo_public void +cairo_user_font_face_set_init_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_init_func_t init_func); + +cairo_public void +cairo_user_font_face_set_render_glyph_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_render_glyph_func_t render_glyph_func); + +cairo_public void +cairo_user_font_face_set_text_to_glyphs_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_text_to_glyphs_func_t text_to_glyphs_func); + +cairo_public void +cairo_user_font_face_set_unicode_to_glyph_func (cairo_font_face_t *font_face, + cairo_user_scaled_font_unicode_to_glyph_func_t unicode_to_glyph_func); + +/* User-font method getters */ + +cairo_public cairo_user_scaled_font_init_func_t +cairo_user_font_face_get_init_func (cairo_font_face_t *font_face); + +cairo_public cairo_user_scaled_font_render_glyph_func_t +cairo_user_font_face_get_render_glyph_func (cairo_font_face_t *font_face); + +cairo_public cairo_user_scaled_font_text_to_glyphs_func_t +cairo_user_font_face_get_text_to_glyphs_func (cairo_font_face_t *font_face); + +cairo_public cairo_user_scaled_font_unicode_to_glyph_func_t +cairo_user_font_face_get_unicode_to_glyph_func (cairo_font_face_t *font_face); + + +/* Query functions */ + +cairo_public cairo_operator_t +cairo_get_operator (cairo_t *cr); + +cairo_public cairo_pattern_t * +cairo_get_source (cairo_t *cr); + +cairo_public double +cairo_get_tolerance (cairo_t *cr); + +cairo_public cairo_antialias_t +cairo_get_antialias (cairo_t *cr); + +cairo_public cairo_bool_t +cairo_has_current_point (cairo_t *cr); + +cairo_public void +cairo_get_current_point (cairo_t *cr, double *x, double *y); + +cairo_public cairo_fill_rule_t +cairo_get_fill_rule (cairo_t *cr); + +cairo_public double +cairo_get_line_width (cairo_t *cr); + +cairo_public cairo_line_cap_t +cairo_get_line_cap (cairo_t *cr); + +cairo_public cairo_line_join_t +cairo_get_line_join (cairo_t *cr); + +cairo_public double +cairo_get_miter_limit (cairo_t *cr); + +cairo_public int +cairo_get_dash_count (cairo_t *cr); + +cairo_public void +cairo_get_dash (cairo_t *cr, double *dashes, double *offset); + +cairo_public void +cairo_get_matrix (cairo_t *cr, cairo_matrix_t *matrix); + +cairo_public cairo_surface_t * +cairo_get_target (cairo_t *cr); + +cairo_public cairo_surface_t * +cairo_get_group_target (cairo_t *cr); + +/** + * cairo_path_data_type_t: + * @CAIRO_PATH_MOVE_TO: A move-to operation, since 1.0 + * @CAIRO_PATH_LINE_TO: A line-to operation, since 1.0 + * @CAIRO_PATH_CURVE_TO: A curve-to operation, since 1.0 + * @CAIRO_PATH_CLOSE_PATH: A close-path operation, since 1.0 + * + * #cairo_path_data_t is used to describe the type of one portion + * of a path when represented as a #cairo_path_t. + * See #cairo_path_data_t for details. + * + * Since: 1.0 + **/ +typedef enum _cairo_path_data_type { + CAIRO_PATH_MOVE_TO, + CAIRO_PATH_LINE_TO, + CAIRO_PATH_CURVE_TO, + CAIRO_PATH_CLOSE_PATH +} cairo_path_data_type_t; + +/** + * cairo_path_data_t: + * + * #cairo_path_data_t is used to represent the path data inside a + * #cairo_path_t. + * + * The data structure is designed to try to balance the demands of + * efficiency and ease-of-use. A path is represented as an array of + * #cairo_path_data_t, which is a union of headers and points. + * + * Each portion of the path is represented by one or more elements in + * the array, (one header followed by 0 or more points). The length + * value of the header is the number of array elements for the current + * portion including the header, (ie. length == 1 + # of points), and + * where the number of points for each element type is as follows: + * + * + * %CAIRO_PATH_MOVE_TO: 1 point + * %CAIRO_PATH_LINE_TO: 1 point + * %CAIRO_PATH_CURVE_TO: 3 points + * %CAIRO_PATH_CLOSE_PATH: 0 points + * + * + * The semantics and ordering of the coordinate values are consistent + * with cairo_move_to(), cairo_line_to(), cairo_curve_to(), and + * cairo_close_path(). + * + * Here is sample code for iterating through a #cairo_path_t: + * + * + * int i; + * cairo_path_t *path; + * cairo_path_data_t *data; + *   + * path = cairo_copy_path (cr); + *   + * for (i=0; i < path->num_data; i += path->data[i].header.length) { + * data = &path->data[i]; + * switch (data->header.type) { + * case CAIRO_PATH_MOVE_TO: + * do_move_to_things (data[1].point.x, data[1].point.y); + * break; + * case CAIRO_PATH_LINE_TO: + * do_line_to_things (data[1].point.x, data[1].point.y); + * break; + * case CAIRO_PATH_CURVE_TO: + * do_curve_to_things (data[1].point.x, data[1].point.y, + * data[2].point.x, data[2].point.y, + * data[3].point.x, data[3].point.y); + * break; + * case CAIRO_PATH_CLOSE_PATH: + * do_close_path_things (); + * break; + * } + * } + * cairo_path_destroy (path); + * + * + * As of cairo 1.4, cairo does not mind if there are more elements in + * a portion of the path than needed. Such elements can be used by + * users of the cairo API to hold extra values in the path data + * structure. For this reason, it is recommended that applications + * always use data->header.length to + * iterate over the path data, instead of hardcoding the number of + * elements for each element type. + * + * Since: 1.0 + **/ +typedef union _cairo_path_data_t cairo_path_data_t; +union _cairo_path_data_t { + struct { + cairo_path_data_type_t type; + int length; + } header; + struct { + double x, y; + } point; +}; + +/** + * cairo_path_t: + * @status: the current error status + * @data: the elements in the path + * @num_data: the number of elements in the data array + * + * A data structure for holding a path. This data structure serves as + * the return value for cairo_copy_path() and + * cairo_copy_path_flat() as well the input value for + * cairo_append_path(). + * + * See #cairo_path_data_t for hints on how to iterate over the + * actual data within the path. + * + * The num_data member gives the number of elements in the data + * array. This number is larger than the number of independent path + * portions (defined in #cairo_path_data_type_t), since the data + * includes both headers and coordinates for each portion. + * + * Since: 1.0 + **/ +typedef struct cairo_path { + cairo_status_t status; + cairo_path_data_t *data; + int num_data; +} cairo_path_t; + +cairo_public cairo_path_t * +cairo_copy_path (cairo_t *cr); + +cairo_public cairo_path_t * +cairo_copy_path_flat (cairo_t *cr); + +cairo_public void +cairo_append_path (cairo_t *cr, + const cairo_path_t *path); + +cairo_public void +cairo_path_destroy (cairo_path_t *path); + +/* Error status queries */ + +cairo_public cairo_status_t +cairo_status (cairo_t *cr); + +cairo_public const char * +cairo_status_to_string (cairo_status_t status); + +/* Backend device manipulation */ + +cairo_public cairo_device_t * +cairo_device_reference (cairo_device_t *device); + +/** + * cairo_device_type_t: + * @CAIRO_DEVICE_TYPE_DRM: The device is of type Direct Render Manager, since 1.10 + * @CAIRO_DEVICE_TYPE_GL: The device is of type OpenGL, since 1.10 + * @CAIRO_DEVICE_TYPE_SCRIPT: The device is of type script, since 1.10 + * @CAIRO_DEVICE_TYPE_XCB: The device is of type xcb, since 1.10 + * @CAIRO_DEVICE_TYPE_XLIB: The device is of type xlib, since 1.10 + * @CAIRO_DEVICE_TYPE_XML: The device is of type XML, since 1.10 + * @CAIRO_DEVICE_TYPE_COGL: The device is of type cogl, since 1.12 + * @CAIRO_DEVICE_TYPE_WIN32: The device is of type win32, since 1.12 + * @CAIRO_DEVICE_TYPE_INVALID: The device is invalid, since 1.10 + * + * #cairo_device_type_t is used to describe the type of a given + * device. The devices types are also known as "backends" within cairo. + * + * The device type can be queried with cairo_device_get_type() + * + * The various #cairo_device_t functions can be used with devices of + * any type, but some backends also provide type-specific functions + * that must only be called with a device of the appropriate + * type. These functions have names that begin with + * cairo_type_device such as + * cairo_xcb_device_debug_cap_xrender_version(). + * + * The behavior of calling a type-specific function with a device of + * the wrong type is undefined. + * + * New entries may be added in future versions. + * + * Since: 1.10 + **/ +typedef enum _cairo_device_type { + CAIRO_DEVICE_TYPE_DRM, + CAIRO_DEVICE_TYPE_GL, + CAIRO_DEVICE_TYPE_SCRIPT, + CAIRO_DEVICE_TYPE_XCB, + CAIRO_DEVICE_TYPE_XLIB, + CAIRO_DEVICE_TYPE_XML, + CAIRO_DEVICE_TYPE_COGL, + CAIRO_DEVICE_TYPE_WIN32, + + CAIRO_DEVICE_TYPE_INVALID = -1 +} cairo_device_type_t; + +cairo_public cairo_device_type_t +cairo_device_get_type (cairo_device_t *device); + +cairo_public cairo_status_t +cairo_device_status (cairo_device_t *device); + +cairo_public cairo_status_t +cairo_device_acquire (cairo_device_t *device); + +cairo_public void +cairo_device_release (cairo_device_t *device); + +cairo_public void +cairo_device_flush (cairo_device_t *device); + +cairo_public void +cairo_device_finish (cairo_device_t *device); + +cairo_public void +cairo_device_destroy (cairo_device_t *device); + +cairo_public unsigned int +cairo_device_get_reference_count (cairo_device_t *device); + +cairo_public void * +cairo_device_get_user_data (cairo_device_t *device, + const cairo_user_data_key_t *key); + +cairo_public cairo_status_t +cairo_device_set_user_data (cairo_device_t *device, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + + +/* Surface manipulation */ + +cairo_public cairo_surface_t * +cairo_surface_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_surface_create_similar_image (cairo_surface_t *other, + cairo_format_t format, + int width, + int height); + +cairo_public cairo_surface_t * +cairo_surface_map_to_image (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents); + +cairo_public void +cairo_surface_unmap_image (cairo_surface_t *surface, + cairo_surface_t *image); + +cairo_public cairo_surface_t * +cairo_surface_create_for_rectangle (cairo_surface_t *target, + double x, + double y, + double width, + double height); + +/** + * cairo_surface_observer_mode_t: + * @CAIRO_SURFACE_OBSERVER_NORMAL: no recording is done + * @CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS: operations are recorded + * + * Whether operations should be recorded. + * + * Since: 1.12 + **/ +typedef enum { + CAIRO_SURFACE_OBSERVER_NORMAL = 0, + CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS = 0x1 +} cairo_surface_observer_mode_t; + +cairo_public cairo_surface_t * +cairo_surface_create_observer (cairo_surface_t *target, + cairo_surface_observer_mode_t mode); + +typedef void (*cairo_surface_observer_callback_t) (cairo_surface_t *observer, + cairo_surface_t *target, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_paint_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_mask_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_fill_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_stroke_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_glyphs_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_flush_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_add_finish_callback (cairo_surface_t *abstract_surface, + cairo_surface_observer_callback_t func, + void *data); + +cairo_public cairo_status_t +cairo_surface_observer_print (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure); +cairo_public double +cairo_surface_observer_elapsed (cairo_surface_t *surface); + +cairo_public cairo_status_t +cairo_device_observer_print (cairo_device_t *device, + cairo_write_func_t write_func, + void *closure); + +cairo_public double +cairo_device_observer_elapsed (cairo_device_t *device); + +cairo_public double +cairo_device_observer_paint_elapsed (cairo_device_t *device); + +cairo_public double +cairo_device_observer_mask_elapsed (cairo_device_t *device); + +cairo_public double +cairo_device_observer_fill_elapsed (cairo_device_t *device); + +cairo_public double +cairo_device_observer_stroke_elapsed (cairo_device_t *device); + +cairo_public double +cairo_device_observer_glyphs_elapsed (cairo_device_t *device); + +cairo_public cairo_surface_t * +cairo_surface_reference (cairo_surface_t *surface); + +cairo_public void +cairo_surface_finish (cairo_surface_t *surface); + +cairo_public void +cairo_surface_destroy (cairo_surface_t *surface); + +cairo_public cairo_device_t * +cairo_surface_get_device (cairo_surface_t *surface); + +cairo_public unsigned int +cairo_surface_get_reference_count (cairo_surface_t *surface); + +cairo_public cairo_status_t +cairo_surface_status (cairo_surface_t *surface); + +/** + * cairo_surface_type_t: + * @CAIRO_SURFACE_TYPE_IMAGE: The surface is of type image, since 1.2 + * @CAIRO_SURFACE_TYPE_PDF: The surface is of type pdf, since 1.2 + * @CAIRO_SURFACE_TYPE_PS: The surface is of type ps, since 1.2 + * @CAIRO_SURFACE_TYPE_XLIB: The surface is of type xlib, since 1.2 + * @CAIRO_SURFACE_TYPE_XCB: The surface is of type xcb, since 1.2 + * @CAIRO_SURFACE_TYPE_GLITZ: The surface is of type glitz, since 1.2 + * @CAIRO_SURFACE_TYPE_QUARTZ: The surface is of type quartz, since 1.2 + * @CAIRO_SURFACE_TYPE_WIN32: The surface is of type win32, since 1.2 + * @CAIRO_SURFACE_TYPE_BEOS: The surface is of type beos, since 1.2 + * @CAIRO_SURFACE_TYPE_DIRECTFB: The surface is of type directfb, since 1.2 + * @CAIRO_SURFACE_TYPE_SVG: The surface is of type svg, since 1.2 + * @CAIRO_SURFACE_TYPE_OS2: The surface is of type os2, since 1.4 + * @CAIRO_SURFACE_TYPE_WIN32_PRINTING: The surface is a win32 printing surface, since 1.6 + * @CAIRO_SURFACE_TYPE_QUARTZ_IMAGE: The surface is of type quartz_image, since 1.6 + * @CAIRO_SURFACE_TYPE_SCRIPT: The surface is of type script, since 1.10 + * @CAIRO_SURFACE_TYPE_QT: The surface is of type Qt, since 1.10 + * @CAIRO_SURFACE_TYPE_RECORDING: The surface is of type recording, since 1.10 + * @CAIRO_SURFACE_TYPE_VG: The surface is a OpenVG surface, since 1.10 + * @CAIRO_SURFACE_TYPE_GL: The surface is of type OpenGL, since 1.10 + * @CAIRO_SURFACE_TYPE_DRM: The surface is of type Direct Render Manager, since 1.10 + * @CAIRO_SURFACE_TYPE_TEE: The surface is of type 'tee' (a multiplexing surface), since 1.10 + * @CAIRO_SURFACE_TYPE_XML: The surface is of type XML (for debugging), since 1.10 + * @CAIRO_SURFACE_TYPE_SKIA: The surface is of type Skia, since 1.10 + * @CAIRO_SURFACE_TYPE_SUBSURFACE: The surface is a subsurface created with + * cairo_surface_create_for_rectangle(), since 1.10 + * @CAIRO_SURFACE_TYPE_COGL: This surface is of type Cogl, since 1.12 + * + * #cairo_surface_type_t is used to describe the type of a given + * surface. The surface types are also known as "backends" or "surface + * backends" within cairo. + * + * The type of a surface is determined by the function used to create + * it, which will generally be of the form + * cairo_type_surface_create(), + * (though see cairo_surface_create_similar() as well). + * + * The surface type can be queried with cairo_surface_get_type() + * + * The various #cairo_surface_t functions can be used with surfaces of + * any type, but some backends also provide type-specific functions + * that must only be called with a surface of the appropriate + * type. These functions have names that begin with + * cairo_type_surface such as cairo_image_surface_get_width(). + * + * The behavior of calling a type-specific function with a surface of + * the wrong type is undefined. + * + * New entries may be added in future versions. + * + * Since: 1.2 + **/ +typedef enum _cairo_surface_type { + CAIRO_SURFACE_TYPE_IMAGE, + CAIRO_SURFACE_TYPE_PDF, + CAIRO_SURFACE_TYPE_PS, + CAIRO_SURFACE_TYPE_XLIB, + CAIRO_SURFACE_TYPE_XCB, + CAIRO_SURFACE_TYPE_GLITZ, + CAIRO_SURFACE_TYPE_QUARTZ, + CAIRO_SURFACE_TYPE_WIN32, + CAIRO_SURFACE_TYPE_BEOS, + CAIRO_SURFACE_TYPE_DIRECTFB, + CAIRO_SURFACE_TYPE_SVG, + CAIRO_SURFACE_TYPE_OS2, + CAIRO_SURFACE_TYPE_WIN32_PRINTING, + CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, + CAIRO_SURFACE_TYPE_SCRIPT, + CAIRO_SURFACE_TYPE_QT, + CAIRO_SURFACE_TYPE_RECORDING, + CAIRO_SURFACE_TYPE_VG, + CAIRO_SURFACE_TYPE_GL, + CAIRO_SURFACE_TYPE_DRM, + CAIRO_SURFACE_TYPE_TEE, + CAIRO_SURFACE_TYPE_XML, + CAIRO_SURFACE_TYPE_SKIA, + CAIRO_SURFACE_TYPE_SUBSURFACE, + CAIRO_SURFACE_TYPE_COGL +} cairo_surface_type_t; + +cairo_public cairo_surface_type_t +cairo_surface_get_type (cairo_surface_t *surface); + +cairo_public cairo_content_t +cairo_surface_get_content (cairo_surface_t *surface); + +#if CAIRO_HAS_PNG_FUNCTIONS + +cairo_public cairo_status_t +cairo_surface_write_to_png (cairo_surface_t *surface, + const char *filename); + +cairo_public cairo_status_t +cairo_surface_write_to_png_stream (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *closure); + +#endif + +cairo_public void * +cairo_surface_get_user_data (cairo_surface_t *surface, + const cairo_user_data_key_t *key); + +cairo_public cairo_status_t +cairo_surface_set_user_data (cairo_surface_t *surface, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + +#define CAIRO_MIME_TYPE_JPEG "image/jpeg" +#define CAIRO_MIME_TYPE_PNG "image/png" +#define CAIRO_MIME_TYPE_JP2 "image/jp2" +#define CAIRO_MIME_TYPE_URI "text/x-uri" +#define CAIRO_MIME_TYPE_UNIQUE_ID "application/x-cairo.uuid" +#define CAIRO_MIME_TYPE_JBIG2 "application/x-cairo.jbig2" +#define CAIRO_MIME_TYPE_JBIG2_GLOBAL "application/x-cairo.jbig2-global" +#define CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID "application/x-cairo.jbig2-global-id" + +cairo_public void +cairo_surface_get_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char **data, + unsigned long *length); + +cairo_public cairo_status_t +cairo_surface_set_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char *data, + unsigned long length, + cairo_destroy_func_t destroy, + void *closure); + +cairo_public cairo_bool_t +cairo_surface_supports_mime_type (cairo_surface_t *surface, + const char *mime_type); + +cairo_public void +cairo_surface_get_font_options (cairo_surface_t *surface, + cairo_font_options_t *options); + +cairo_public void +cairo_surface_flush (cairo_surface_t *surface); + +cairo_public void +cairo_surface_mark_dirty (cairo_surface_t *surface); + +cairo_public void +cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface, + int x, + int y, + int width, + int height); + +cairo_public void +cairo_surface_set_device_scale (cairo_surface_t *surface, + double x_scale, + double y_scale); + +cairo_public void +cairo_surface_get_device_scale (cairo_surface_t *surface, + double *x_scale, + double *y_scale); + +cairo_public void +cairo_surface_set_device_offset (cairo_surface_t *surface, + double x_offset, + double y_offset); + +cairo_public void +cairo_surface_get_device_offset (cairo_surface_t *surface, + double *x_offset, + double *y_offset); + +cairo_public void +cairo_surface_set_fallback_resolution (cairo_surface_t *surface, + double x_pixels_per_inch, + double y_pixels_per_inch); + +cairo_public void +cairo_surface_get_fallback_resolution (cairo_surface_t *surface, + double *x_pixels_per_inch, + double *y_pixels_per_inch); + +cairo_public void +cairo_surface_copy_page (cairo_surface_t *surface); + +cairo_public void +cairo_surface_show_page (cairo_surface_t *surface); + +cairo_public cairo_bool_t +cairo_surface_has_show_text_glyphs (cairo_surface_t *surface); + +/* Image-surface functions */ + +cairo_public cairo_surface_t * +cairo_image_surface_create (cairo_format_t format, + int width, + int height); + +cairo_public int +cairo_format_stride_for_width (cairo_format_t format, + int width); + +cairo_public cairo_surface_t * +cairo_image_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride); + +cairo_public unsigned char * +cairo_image_surface_get_data (cairo_surface_t *surface); + +cairo_public cairo_format_t +cairo_image_surface_get_format (cairo_surface_t *surface); + +cairo_public int +cairo_image_surface_get_width (cairo_surface_t *surface); + +cairo_public int +cairo_image_surface_get_height (cairo_surface_t *surface); + +cairo_public int +cairo_image_surface_get_stride (cairo_surface_t *surface); + +#if CAIRO_HAS_PNG_FUNCTIONS + +cairo_public cairo_surface_t * +cairo_image_surface_create_from_png (const char *filename); + +cairo_public cairo_surface_t * +cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, + void *closure); + +#endif + +/* Recording-surface functions */ + +cairo_public cairo_surface_t * +cairo_recording_surface_create (cairo_content_t content, + const cairo_rectangle_t *extents); + +cairo_public void +cairo_recording_surface_ink_extents (cairo_surface_t *surface, + double *x0, + double *y0, + double *width, + double *height); + +cairo_public cairo_bool_t +cairo_recording_surface_get_extents (cairo_surface_t *surface, + cairo_rectangle_t *extents); + +/* raster-source pattern (callback) functions */ + +/** + * cairo_raster_source_acquire_func_t: + * @pattern: the pattern being rendered from + * @callback_data: the user data supplied during creation + * @target: the rendering target surface + * @extents: rectangular region of interest in pixels in sample space + * + * #cairo_raster_source_acquire_func_t is the type of function which is + * called when a pattern is being rendered from. It should create a surface + * that provides the pixel data for the region of interest as defined by + * extents, though the surface itself does not have to be limited to that + * area. For convenience the surface should probably be of image type, + * created with cairo_surface_create_similar_image() for the target (which + * enables the number of copies to be reduced during transfer to the + * device). Another option, might be to return a similar surface to the + * target for explicit handling by the application of a set of cached sources + * on the device. The region of sample data provided should be defined using + * cairo_surface_set_device_offset() to specify the top-left corner of the + * sample data (along with width and height of the surface). + * + * Returns: a #cairo_surface_t + * + * Since: 1.12 + **/ +typedef cairo_surface_t * +(*cairo_raster_source_acquire_func_t) (cairo_pattern_t *pattern, + void *callback_data, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents); + +/** + * cairo_raster_source_release_func_t: + * @pattern: the pattern being rendered from + * @callback_data: the user data supplied during creation + * @surface: the surface created during acquire + * + * #cairo_raster_source_release_func_t is the type of function which is + * called when the pixel data is no longer being access by the pattern + * for the rendering operation. Typically this function will simply + * destroy the surface created during acquire. + * + * Since: 1.12 + **/ +typedef void +(*cairo_raster_source_release_func_t) (cairo_pattern_t *pattern, + void *callback_data, + cairo_surface_t *surface); + +/** + * cairo_raster_source_snapshot_func_t: + * @pattern: the pattern being rendered from + * @callback_data: the user data supplied during creation + * + * #cairo_raster_source_snapshot_func_t is the type of function which is + * called when the pixel data needs to be preserved for later use + * during printing. This pattern will be accessed again later, and it + * is expected to provide the pixel data that was current at the time + * of snapshotting. + * + * Return value: CAIRO_STATUS_SUCCESS on success, or one of the + * #cairo_status_t error codes for failure. + * + * Since: 1.12 + **/ +typedef cairo_status_t +(*cairo_raster_source_snapshot_func_t) (cairo_pattern_t *pattern, + void *callback_data); + +/** + * cairo_raster_source_copy_func_t: + * @pattern: the #cairo_pattern_t that was copied to + * @callback_data: the user data supplied during creation + * @other: the #cairo_pattern_t being used as the source for the copy + * + * #cairo_raster_source_copy_func_t is the type of function which is + * called when the pattern gets copied as a normal part of rendering. + * + * Return value: CAIRO_STATUS_SUCCESS on success, or one of the + * #cairo_status_t error codes for failure. + * + * Since: 1.12 + **/ +typedef cairo_status_t +(*cairo_raster_source_copy_func_t) (cairo_pattern_t *pattern, + void *callback_data, + const cairo_pattern_t *other); + +/** + * cairo_raster_source_finish_func_t: + * @pattern: the pattern being rendered from + * @callback_data: the user data supplied during creation + * + * #cairo_raster_source_finish_func_t is the type of function which is + * called when the pattern (or a copy thereof) is no longer required. + * + * Since: 1.12 + **/ +typedef void +(*cairo_raster_source_finish_func_t) (cairo_pattern_t *pattern, + void *callback_data); + +cairo_public cairo_pattern_t * +cairo_pattern_create_raster_source (void *user_data, + cairo_content_t content, + int width, int height); + +cairo_public void +cairo_raster_source_pattern_set_callback_data (cairo_pattern_t *pattern, + void *data); + +cairo_public void * +cairo_raster_source_pattern_get_callback_data (cairo_pattern_t *pattern); + +cairo_public void +cairo_raster_source_pattern_set_acquire (cairo_pattern_t *pattern, + cairo_raster_source_acquire_func_t acquire, + cairo_raster_source_release_func_t release); + +cairo_public void +cairo_raster_source_pattern_get_acquire (cairo_pattern_t *pattern, + cairo_raster_source_acquire_func_t *acquire, + cairo_raster_source_release_func_t *release); +cairo_public void +cairo_raster_source_pattern_set_snapshot (cairo_pattern_t *pattern, + cairo_raster_source_snapshot_func_t snapshot); + +cairo_public cairo_raster_source_snapshot_func_t +cairo_raster_source_pattern_get_snapshot (cairo_pattern_t *pattern); + +cairo_public void +cairo_raster_source_pattern_set_copy (cairo_pattern_t *pattern, + cairo_raster_source_copy_func_t copy); + +cairo_public cairo_raster_source_copy_func_t +cairo_raster_source_pattern_get_copy (cairo_pattern_t *pattern); + +cairo_public void +cairo_raster_source_pattern_set_finish (cairo_pattern_t *pattern, + cairo_raster_source_finish_func_t finish); + +cairo_public cairo_raster_source_finish_func_t +cairo_raster_source_pattern_get_finish (cairo_pattern_t *pattern); + +/* Pattern creation functions */ + +cairo_public cairo_pattern_t * +cairo_pattern_create_rgb (double red, double green, double blue); + +cairo_public cairo_pattern_t * +cairo_pattern_create_rgba (double red, double green, double blue, + double alpha); + +cairo_public cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface); + +cairo_public cairo_pattern_t * +cairo_pattern_create_linear (double x0, double y0, + double x1, double y1); + +cairo_public cairo_pattern_t * +cairo_pattern_create_radial (double cx0, double cy0, double radius0, + double cx1, double cy1, double radius1); + +cairo_public cairo_pattern_t * +cairo_pattern_create_mesh (void); + +cairo_public cairo_pattern_t * +cairo_pattern_reference (cairo_pattern_t *pattern); + +cairo_public void +cairo_pattern_destroy (cairo_pattern_t *pattern); + +cairo_public unsigned int +cairo_pattern_get_reference_count (cairo_pattern_t *pattern); + +cairo_public cairo_status_t +cairo_pattern_status (cairo_pattern_t *pattern); + +cairo_public void * +cairo_pattern_get_user_data (cairo_pattern_t *pattern, + const cairo_user_data_key_t *key); + +cairo_public cairo_status_t +cairo_pattern_set_user_data (cairo_pattern_t *pattern, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + +/** + * cairo_pattern_type_t: + * @CAIRO_PATTERN_TYPE_SOLID: The pattern is a solid (uniform) + * color. It may be opaque or translucent, since 1.2. + * @CAIRO_PATTERN_TYPE_SURFACE: The pattern is a based on a surface (an image), since 1.2. + * @CAIRO_PATTERN_TYPE_LINEAR: The pattern is a linear gradient, since 1.2. + * @CAIRO_PATTERN_TYPE_RADIAL: The pattern is a radial gradient, since 1.2. + * @CAIRO_PATTERN_TYPE_MESH: The pattern is a mesh, since 1.12. + * @CAIRO_PATTERN_TYPE_RASTER_SOURCE: The pattern is a user pattern providing raster data, since 1.12. + * + * #cairo_pattern_type_t is used to describe the type of a given pattern. + * + * The type of a pattern is determined by the function used to create + * it. The cairo_pattern_create_rgb() and cairo_pattern_create_rgba() + * functions create SOLID patterns. The remaining + * cairo_pattern_create functions map to pattern types in obvious + * ways. + * + * The pattern type can be queried with cairo_pattern_get_type() + * + * Most #cairo_pattern_t functions can be called with a pattern of any + * type, (though trying to change the extend or filter for a solid + * pattern will have no effect). A notable exception is + * cairo_pattern_add_color_stop_rgb() and + * cairo_pattern_add_color_stop_rgba() which must only be called with + * gradient patterns (either LINEAR or RADIAL). Otherwise the pattern + * will be shutdown and put into an error state. + * + * New entries may be added in future versions. + * + * Since: 1.2 + **/ +typedef enum _cairo_pattern_type { + CAIRO_PATTERN_TYPE_SOLID, + CAIRO_PATTERN_TYPE_SURFACE, + CAIRO_PATTERN_TYPE_LINEAR, + CAIRO_PATTERN_TYPE_RADIAL, + CAIRO_PATTERN_TYPE_MESH, + CAIRO_PATTERN_TYPE_RASTER_SOURCE +} cairo_pattern_type_t; + +cairo_public cairo_pattern_type_t +cairo_pattern_get_type (cairo_pattern_t *pattern); + +cairo_public void +cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern, + double offset, + double red, double green, double blue); + +cairo_public void +cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern, + double offset, + double red, double green, double blue, + double alpha); + +cairo_public void +cairo_mesh_pattern_begin_patch (cairo_pattern_t *pattern); + +cairo_public void +cairo_mesh_pattern_end_patch (cairo_pattern_t *pattern); + +cairo_public void +cairo_mesh_pattern_curve_to (cairo_pattern_t *pattern, + double x1, double y1, + double x2, double y2, + double x3, double y3); + +cairo_public void +cairo_mesh_pattern_line_to (cairo_pattern_t *pattern, + double x, double y); + +cairo_public void +cairo_mesh_pattern_move_to (cairo_pattern_t *pattern, + double x, double y); + +cairo_public void +cairo_mesh_pattern_set_control_point (cairo_pattern_t *pattern, + unsigned int point_num, + double x, double y); + +cairo_public void +cairo_mesh_pattern_set_corner_color_rgb (cairo_pattern_t *pattern, + unsigned int corner_num, + double red, double green, double blue); + +cairo_public void +cairo_mesh_pattern_set_corner_color_rgba (cairo_pattern_t *pattern, + unsigned int corner_num, + double red, double green, double blue, + double alpha); + +cairo_public void +cairo_pattern_set_matrix (cairo_pattern_t *pattern, + const cairo_matrix_t *matrix); + +cairo_public void +cairo_pattern_get_matrix (cairo_pattern_t *pattern, + cairo_matrix_t *matrix); + +/** + * cairo_extend_t: + * @CAIRO_EXTEND_NONE: pixels outside of the source pattern + * are fully transparent (Since 1.0) + * @CAIRO_EXTEND_REPEAT: the pattern is tiled by repeating (Since 1.0) + * @CAIRO_EXTEND_REFLECT: the pattern is tiled by reflecting + * at the edges (Since 1.0; but only implemented for surface patterns since 1.6) + * @CAIRO_EXTEND_PAD: pixels outside of the pattern copy + * the closest pixel from the source (Since 1.2; but only + * implemented for surface patterns since 1.6) + * + * #cairo_extend_t is used to describe how pattern color/alpha will be + * determined for areas "outside" the pattern's natural area, (for + * example, outside the surface bounds or outside the gradient + * geometry). + * + * Mesh patterns are not affected by the extend mode. + * + * The default extend mode is %CAIRO_EXTEND_NONE for surface patterns + * and %CAIRO_EXTEND_PAD for gradient patterns. + * + * New entries may be added in future versions. + * + * Since: 1.0 + **/ +typedef enum _cairo_extend { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD +} cairo_extend_t; + +cairo_public void +cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend); + +cairo_public cairo_extend_t +cairo_pattern_get_extend (cairo_pattern_t *pattern); + +/** + * cairo_filter_t: + * @CAIRO_FILTER_FAST: A high-performance filter, with quality similar + * to %CAIRO_FILTER_NEAREST (Since 1.0) + * @CAIRO_FILTER_GOOD: A reasonable-performance filter, with quality + * similar to %CAIRO_FILTER_BILINEAR (Since 1.0) + * @CAIRO_FILTER_BEST: The highest-quality available, performance may + * not be suitable for interactive use. (Since 1.0) + * @CAIRO_FILTER_NEAREST: Nearest-neighbor filtering (Since 1.0) + * @CAIRO_FILTER_BILINEAR: Linear interpolation in two dimensions (Since 1.0) + * @CAIRO_FILTER_GAUSSIAN: This filter value is currently + * unimplemented, and should not be used in current code. (Since 1.0) + * + * #cairo_filter_t is used to indicate what filtering should be + * applied when reading pixel values from patterns. See + * cairo_pattern_set_filter() for indicating the desired filter to be + * used with a particular pattern. + * + * Since: 1.0 + **/ +typedef enum _cairo_filter { + CAIRO_FILTER_FAST, + CAIRO_FILTER_GOOD, + CAIRO_FILTER_BEST, + CAIRO_FILTER_NEAREST, + CAIRO_FILTER_BILINEAR, + CAIRO_FILTER_GAUSSIAN +} cairo_filter_t; + +cairo_public void +cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter); + +cairo_public cairo_filter_t +cairo_pattern_get_filter (cairo_pattern_t *pattern); + +cairo_public cairo_status_t +cairo_pattern_get_rgba (cairo_pattern_t *pattern, + double *red, double *green, + double *blue, double *alpha); + +cairo_public cairo_status_t +cairo_pattern_get_surface (cairo_pattern_t *pattern, + cairo_surface_t **surface); + + +cairo_public cairo_status_t +cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern, + int index, double *offset, + double *red, double *green, + double *blue, double *alpha); + +cairo_public cairo_status_t +cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern, + int *count); + +cairo_public cairo_status_t +cairo_pattern_get_linear_points (cairo_pattern_t *pattern, + double *x0, double *y0, + double *x1, double *y1); + +cairo_public cairo_status_t +cairo_pattern_get_radial_circles (cairo_pattern_t *pattern, + double *x0, double *y0, double *r0, + double *x1, double *y1, double *r1); + +cairo_public cairo_status_t +cairo_mesh_pattern_get_patch_count (cairo_pattern_t *pattern, + unsigned int *count); + +cairo_public cairo_path_t * +cairo_mesh_pattern_get_path (cairo_pattern_t *pattern, + unsigned int patch_num); + +cairo_public cairo_status_t +cairo_mesh_pattern_get_corner_color_rgba (cairo_pattern_t *pattern, + unsigned int patch_num, + unsigned int corner_num, + double *red, double *green, + double *blue, double *alpha); + +cairo_public cairo_status_t +cairo_mesh_pattern_get_control_point (cairo_pattern_t *pattern, + unsigned int patch_num, + unsigned int point_num, + double *x, double *y); + +/* Matrix functions */ + +cairo_public void +cairo_matrix_init (cairo_matrix_t *matrix, + double xx, double yx, + double xy, double yy, + double x0, double y0); + +cairo_public void +cairo_matrix_init_identity (cairo_matrix_t *matrix); + +cairo_public void +cairo_matrix_init_translate (cairo_matrix_t *matrix, + double tx, double ty); + +cairo_public void +cairo_matrix_init_scale (cairo_matrix_t *matrix, + double sx, double sy); + +cairo_public void +cairo_matrix_init_rotate (cairo_matrix_t *matrix, + double radians); + +cairo_public void +cairo_matrix_translate (cairo_matrix_t *matrix, double tx, double ty); + +cairo_public void +cairo_matrix_scale (cairo_matrix_t *matrix, double sx, double sy); + +cairo_public void +cairo_matrix_rotate (cairo_matrix_t *matrix, double radians); + +cairo_public cairo_status_t +cairo_matrix_invert (cairo_matrix_t *matrix); + +cairo_public void +cairo_matrix_multiply (cairo_matrix_t *result, + const cairo_matrix_t *a, + const cairo_matrix_t *b); + +cairo_public void +cairo_matrix_transform_distance (const cairo_matrix_t *matrix, + double *dx, double *dy); + +cairo_public void +cairo_matrix_transform_point (const cairo_matrix_t *matrix, + double *x, double *y); + +/* Region functions */ + +/** + * cairo_region_t: + * + * A #cairo_region_t represents a set of integer-aligned rectangles. + * + * It allows set-theoretical operations like cairo_region_union() and + * cairo_region_intersect() to be performed on them. + * + * Memory management of #cairo_region_t is done with + * cairo_region_reference() and cairo_region_destroy(). + * + * Since: 1.10 + **/ +typedef struct _cairo_region cairo_region_t; + +/** + * cairo_region_overlap_t: + * @CAIRO_REGION_OVERLAP_IN: The contents are entirely inside the region. (Since 1.10) + * @CAIRO_REGION_OVERLAP_OUT: The contents are entirely outside the region. (Since 1.10) + * @CAIRO_REGION_OVERLAP_PART: The contents are partially inside and + * partially outside the region. (Since 1.10) + * + * Used as the return value for cairo_region_contains_rectangle(). + * + * Since: 1.10 + **/ +typedef enum _cairo_region_overlap { + CAIRO_REGION_OVERLAP_IN, /* completely inside region */ + CAIRO_REGION_OVERLAP_OUT, /* completely outside region */ + CAIRO_REGION_OVERLAP_PART /* partly inside region */ +} cairo_region_overlap_t; + +cairo_public cairo_region_t * +cairo_region_create (void); + +cairo_public cairo_region_t * +cairo_region_create_rectangle (const cairo_rectangle_int_t *rectangle); + +cairo_public cairo_region_t * +cairo_region_create_rectangles (const cairo_rectangle_int_t *rects, + int count); + +cairo_public cairo_region_t * +cairo_region_copy (const cairo_region_t *original); + +cairo_public cairo_region_t * +cairo_region_reference (cairo_region_t *region); + +cairo_public void +cairo_region_destroy (cairo_region_t *region); + +cairo_public cairo_bool_t +cairo_region_equal (const cairo_region_t *a, const cairo_region_t *b); + +cairo_public cairo_status_t +cairo_region_status (const cairo_region_t *region); + +cairo_public void +cairo_region_get_extents (const cairo_region_t *region, + cairo_rectangle_int_t *extents); + +cairo_public int +cairo_region_num_rectangles (const cairo_region_t *region); + +cairo_public void +cairo_region_get_rectangle (const cairo_region_t *region, + int nth, + cairo_rectangle_int_t *rectangle); + +cairo_public cairo_bool_t +cairo_region_is_empty (const cairo_region_t *region); + +cairo_public cairo_region_overlap_t +cairo_region_contains_rectangle (const cairo_region_t *region, + const cairo_rectangle_int_t *rectangle); + +cairo_public cairo_bool_t +cairo_region_contains_point (const cairo_region_t *region, int x, int y); + +cairo_public void +cairo_region_translate (cairo_region_t *region, int dx, int dy); + +cairo_public cairo_status_t +cairo_region_subtract (cairo_region_t *dst, const cairo_region_t *other); + +cairo_public cairo_status_t +cairo_region_subtract_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); + +cairo_public cairo_status_t +cairo_region_intersect (cairo_region_t *dst, const cairo_region_t *other); + +cairo_public cairo_status_t +cairo_region_intersect_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); + +cairo_public cairo_status_t +cairo_region_union (cairo_region_t *dst, const cairo_region_t *other); + +cairo_public cairo_status_t +cairo_region_union_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); + +cairo_public cairo_status_t +cairo_region_xor (cairo_region_t *dst, const cairo_region_t *other); + +cairo_public cairo_status_t +cairo_region_xor_rectangle (cairo_region_t *dst, + const cairo_rectangle_int_t *rectangle); + +/* Functions to be used while debugging (not intended for use in production code) */ +cairo_public void +cairo_debug_reset_static_data (void); + + +CAIRO_END_DECLS + +#endif /* CAIRO_H */ diff --git a/src/cairo.pc.in b/src/cairo.pc.in new file mode 100644 index 000000000..b361edf18 --- /dev/null +++ b/src/cairo.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: cairo +Description: Multi-platform 2D graphics library +Version: @VERSION@ + +@PKGCONFIG_REQUIRES@: @CAIRO_REQUIRES@ +Libs: -L${libdir} -lcairo +Libs.private: @CAIRO_NONPKGCONFIG_LIBS@ +Cflags: -I${includedir}/cairo diff --git a/src/cairoint.h b/src/cairoint.h new file mode 100644 index 000000000..5bca00389 --- /dev/null +++ b/src/cairoint.h @@ -0,0 +1,2081 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + */ + +/* + * These definitions are solely for use by the implementation of cairo + * and constitute no kind of standard. If you need any of these + * functions, please drop me a note. Either the library needs new + * functionality, or there's a way to do what you need using the + * existing published interfaces. cworth@cworth.org + */ + +#ifndef _CAIROINT_H_ +#define _CAIROINT_H_ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef _MSC_VER +#define cairo_public __declspec(dllexport) +#endif + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#define _USE_MATH_DEFINES +#endif +#include +#include +#include + +#include "cairo.h" +#include + +#include "cairo-compiler-private.h" +#include "cairo-error-private.h" + +#if CAIRO_HAS_PDF_SURFACE || \ + CAIRO_HAS_PS_SURFACE || \ + CAIRO_HAS_SCRIPT_SURFACE || \ + CAIRO_HAS_XML_SURFACE +#define CAIRO_HAS_DEFLATE_STREAM 1 +#endif + +#if CAIRO_HAS_PS_SURFACE || \ + CAIRO_HAS_PDF_SURFACE || \ + CAIRO_HAS_SVG_SURFACE || \ + CAIRO_HAS_WIN32_SURFACE +#define CAIRO_HAS_FONT_SUBSET 1 +#endif + +#if CAIRO_HAS_PS_SURFACE || \ + CAIRO_HAS_PDF_SURFACE || \ + CAIRO_HAS_FONT_SUBSET +#define CAIRO_HAS_PDF_OPERATORS 1 +#endif + +CAIRO_BEGIN_DECLS + +#if _WIN32 && !_WIN32_WCE /* Permissions on WinCE? No worries! */ +cairo_private FILE * +_cairo_win32_tmpfile (void); +#define tmpfile() _cairo_win32_tmpfile() +#endif + +#undef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +#undef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_SQRT2 +#define M_SQRT2 1.41421356237309504880 +#endif + +#ifndef M_SQRT1_2 +#define M_SQRT1_2 0.707106781186547524400844362104849039 +#endif + +#undef ARRAY_LENGTH +#define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) + +#undef STRINGIFY +#undef STRINGIFY_ARG +#define STRINGIFY(macro_or_string) STRINGIFY_ARG (macro_or_string) +#define STRINGIFY_ARG(contents) #contents + +#if defined (__GNUC__) +#define cairo_container_of(ptr, type, member) ({ \ + const __typeof__ (((type *) 0)->member) *mptr__ = (ptr); \ + (type *) ((char *) mptr__ - offsetof (type, member)); \ +}) +#else +#define cairo_container_of(ptr, type, member) \ + ((type *)((char *) (ptr) - (char *) &((type *)0)->member)) +#endif + + +#define ASSERT_NOT_REACHED \ +do { \ + assert (!"reached"); \ +} while (0) +#define COMPILE_TIME_ASSERT1(condition, line) \ + typedef int compile_time_assertion_at_line_##line##_failed [(condition)?1:-1] +#define COMPILE_TIME_ASSERT0(condition, line) COMPILE_TIME_ASSERT1(condition, line) +#define COMPILE_TIME_ASSERT(condition) COMPILE_TIME_ASSERT0(condition, __LINE__) + +#define CAIRO_ALPHA_IS_CLEAR(alpha) ((alpha) <= ((double)0x00ff / (double)0xffff)) +#define CAIRO_ALPHA_SHORT_IS_CLEAR(alpha) ((alpha) <= 0x00ff) + +#define CAIRO_ALPHA_IS_OPAQUE(alpha) ((alpha) >= ((double)0xff00 / (double)0xffff)) +#define CAIRO_ALPHA_SHORT_IS_OPAQUE(alpha) ((alpha) >= 0xff00) +#define CAIRO_ALPHA_IS_ZERO(alpha) ((alpha) <= 0.0) + +#define CAIRO_COLOR_IS_CLEAR(color) CAIRO_ALPHA_SHORT_IS_CLEAR ((color)->alpha_short) +#define CAIRO_COLOR_IS_OPAQUE(color) CAIRO_ALPHA_SHORT_IS_OPAQUE ((color)->alpha_short) + +/* Reverse the bits in a byte with 7 operations (no 64-bit): + * Devised by Sean Anderson, July 13, 2001. + * Source: http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits + */ +#define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16) + +/* Return the number of 1 bits in mask. + * + * GCC 3.4 supports a "population count" builtin, which on many targets is + * implemented with a single instruction. There is a fallback definition + * in libgcc in case a target does not have one, which should be just as + * good as the open-coded solution below, (which is "HACKMEM 169"). + */ +static inline int cairo_const +_cairo_popcount (uint32_t mask) +{ +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + return __builtin_popcount (mask); +#else + register int y; + + y = (mask >> 1) &033333333333; + y = mask - y - ((y >>1) & 033333333333); + return (((y + (y >> 3)) & 030707070707) % 077); +#endif +} + +static cairo_always_inline cairo_bool_t +_cairo_is_little_endian (void) +{ + static const int i = 1; + return *((char *) &i) == 0x01; +} + +#ifdef WORDS_BIGENDIAN +#define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) (c) +#else +#define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) CAIRO_BITSWAP8(c) +#endif + +#ifdef WORDS_BIGENDIAN + +#define cpu_to_be16(v) (v) +#define be16_to_cpu(v) (v) +#define cpu_to_be32(v) (v) +#define be32_to_cpu(v) (v) + +#else + +static inline uint16_t cairo_const +cpu_to_be16(uint16_t v) +{ + return (v << 8) | (v >> 8); +} + +static inline uint16_t cairo_const +be16_to_cpu(uint16_t v) +{ + return cpu_to_be16 (v); +} + +static inline uint32_t cairo_const +cpu_to_be32(uint32_t v) +{ + return (v >> 24) | ((v >> 8) & 0xff00) | ((v << 8) & 0xff0000) | (v << 24); +} + +static inline uint32_t cairo_const +be32_to_cpu(uint32_t v) +{ + return cpu_to_be32 (v); +} + +#endif + +/* Unaligned big endian access + */ + +static inline uint16_t get_unaligned_be16 (const unsigned char *p) +{ + return p[0] << 8 | p[1]; +} + +static inline uint32_t get_unaligned_be32 (const unsigned char *p) +{ + return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; +} + +static inline void put_unaligned_be16 (uint16_t v, unsigned char *p) +{ + p[0] = (v >> 8) & 0xff; + p[1] = v & 0xff; +} + +static inline void put_unaligned_be32 (uint32_t v, unsigned char *p) +{ + p[0] = (v >> 24) & 0xff; + p[1] = (v >> 16) & 0xff; + p[2] = (v >> 8) & 0xff; + p[3] = v & 0xff; +} + +/* The glibc versions of ispace() and isdigit() are slow in UTF-8 locales. + */ + +static inline int cairo_const +_cairo_isspace (int c) +{ + return (c == 0x20 || (c >= 0x09 && c <= 0x0d)); +} + +static inline int cairo_const +_cairo_isdigit (int c) +{ + return (c >= '0' && c <= '9'); +} + +#include "cairo-types-private.h" +#include "cairo-cache-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-spans-private.h" +#include "cairo-surface-private.h" + +cairo_private void +_cairo_box_from_doubles (cairo_box_t *box, + double *x1, double *y1, + double *x2, double *y2); + +cairo_private void +_cairo_box_to_doubles (const cairo_box_t *box, + double *x1, double *y1, + double *x2, double *y2); + +cairo_private void +_cairo_box_from_rectangle (cairo_box_t *box, + const cairo_rectangle_int_t *rectangle); + +cairo_private void +_cairo_box_round_to_rectangle (const cairo_box_t *box, + cairo_rectangle_int_t *rectangle); + +cairo_private void +_cairo_box_add_curve_to (cairo_box_t *extents, + const cairo_point_t *a, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d); + +cairo_private void +_cairo_boxes_get_extents (const cairo_box_t *boxes, + int num_boxes, + cairo_box_t *extents); + +cairo_private extern const cairo_rectangle_int_t _cairo_empty_rectangle; +cairo_private extern const cairo_rectangle_int_t _cairo_unbounded_rectangle; + +static inline void +_cairo_unbounded_rectangle_init (cairo_rectangle_int_t *rect) +{ + *rect = _cairo_unbounded_rectangle; +} + +cairo_private_no_warn cairo_bool_t +_cairo_rectangle_intersect (cairo_rectangle_int_t *dst, + const cairo_rectangle_int_t *src); + +static inline cairo_bool_t +_cairo_rectangle_intersects (const cairo_rectangle_int_t *dst, + const cairo_rectangle_int_t *src) +{ + return !(src->x >= dst->x + (int) dst->width || + src->x + (int) src->width <= dst->x || + src->y >= dst->y + (int) dst->height || + src->y + (int) src->height <= dst->y); +} + +static inline cairo_bool_t +_cairo_rectangle_contains_rectangle (const cairo_rectangle_int_t *a, + const cairo_rectangle_int_t *b) +{ + return (a->x <= b->x && + a->x + (int) a->width >= b->x + (int) b->width && + a->y <= b->y && + a->y + (int) a->height >= b->y + (int) b->height); +} + +cairo_private void +_cairo_rectangle_int_from_double (cairo_rectangle_int_t *recti, + const cairo_rectangle_t *rectf); + +/* Extends the dst rectangle to also contain src. + * If one of the rectangles is empty, the result is undefined + */ +cairo_private void +_cairo_rectangle_union (cairo_rectangle_int_t *dst, + const cairo_rectangle_int_t *src); + +cairo_private cairo_bool_t +_cairo_box_intersects_line_segment (const cairo_box_t *box, + cairo_line_t *line) cairo_pure; + +cairo_private cairo_bool_t +_cairo_spline_intersects (const cairo_point_t *a, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d, + const cairo_box_t *box) cairo_pure; + +typedef struct { + const cairo_user_data_key_t *key; + void *user_data; + cairo_destroy_func_t destroy; +} cairo_user_data_slot_t; + +cairo_private void +_cairo_user_data_array_init (cairo_user_data_array_t *array); + +cairo_private void +_cairo_user_data_array_fini (cairo_user_data_array_t *array); + +cairo_private void * +_cairo_user_data_array_get_data (cairo_user_data_array_t *array, + const cairo_user_data_key_t *key); + +cairo_private cairo_status_t +_cairo_user_data_array_set_data (cairo_user_data_array_t *array, + const cairo_user_data_key_t *key, + void *user_data, + cairo_destroy_func_t destroy); + +cairo_private cairo_status_t +_cairo_user_data_array_copy (cairo_user_data_array_t *dst, + const cairo_user_data_array_t *src); + +cairo_private void +_cairo_user_data_array_foreach (cairo_user_data_array_t *array, + void (*func) (const void *key, + void *elt, + void *closure), + void *closure); + +#define _CAIRO_HASH_INIT_VALUE 5381 + +cairo_private unsigned long +_cairo_hash_string (const char *c); + +cairo_private unsigned long +_cairo_hash_bytes (unsigned long hash, + const void *bytes, + unsigned int length); + +#define _cairo_scaled_glyph_index(g) ((g)->hash_entry.hash) +#define _cairo_scaled_glyph_set_index(g, i) ((g)->hash_entry.hash = (i)) + +#include "cairo-scaled-font-private.h" + +struct _cairo_font_face { + /* hash_entry must be first */ + cairo_hash_entry_t hash_entry; + cairo_status_t status; + cairo_reference_count_t ref_count; + cairo_user_data_array_t user_data; + const cairo_font_face_backend_t *backend; +}; + +cairo_private void +_cairo_default_context_reset_static_data (void); + +cairo_private void +_cairo_toy_font_face_reset_static_data (void); + +cairo_private void +_cairo_ft_font_reset_static_data (void); + +cairo_private void +_cairo_win32_font_reset_static_data (void); + +#if CAIRO_HAS_COGL_SURFACE +void +_cairo_cogl_context_reset_static_data (void); +#endif + +/* the font backend interface */ + +struct _cairo_unscaled_font_backend { + cairo_bool_t (*destroy) (void *unscaled_font); +}; + +/* #cairo_toy_font_face_t - simple family/slant/weight font faces used for + * the built-in font API + */ + +typedef struct _cairo_toy_font_face { + cairo_font_face_t base; + const char *family; + cairo_bool_t owns_family; + cairo_font_slant_t slant; + cairo_font_weight_t weight; + + cairo_font_face_t *impl_face; /* The non-toy font face this actually uses */ +} cairo_toy_font_face_t; + +typedef enum _cairo_scaled_glyph_info { + CAIRO_SCALED_GLYPH_INFO_METRICS = (1 << 0), + CAIRO_SCALED_GLYPH_INFO_SURFACE = (1 << 1), + CAIRO_SCALED_GLYPH_INFO_PATH = (1 << 2), + CAIRO_SCALED_GLYPH_INFO_RECORDING_SURFACE = (1 << 3) +} cairo_scaled_glyph_info_t; + +typedef struct _cairo_scaled_font_subset { + cairo_scaled_font_t *scaled_font; + unsigned int font_id; + unsigned int subset_id; + + /* Index of glyphs array is subset_glyph_index. + * Value of glyphs array is scaled_font_glyph_index. + */ + unsigned long *glyphs; + char **utf8; + char **glyph_names; + int *to_latin_char; + unsigned long *latin_to_subset_glyph_index; + unsigned int num_glyphs; + cairo_bool_t is_composite; + cairo_bool_t is_scaled; + cairo_bool_t is_latin; +} cairo_scaled_font_subset_t; + +struct _cairo_scaled_font_backend { + cairo_font_type_t type; + + void + (*fini) (void *scaled_font); + + cairo_warn cairo_int_status_t + (*scaled_glyph_init) (void *scaled_font, + cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_info_t info); + + /* A backend only needs to implement this or ucs4_to_index(), not + * both. This allows the backend to do something more sophisticated + * then just converting characters one by one. + */ + cairo_warn cairo_int_status_t + (*text_to_glyphs) (void *scaled_font, + double x, + double y, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags); + + unsigned long + (*ucs4_to_index) (void *scaled_font, + uint32_t ucs4); + + /* Read data from a sfnt font table. + * @scaled_font: font + * @tag: 4 byte table name specifying the table to read. + * @offset: offset into the table + * @buffer: buffer to write data into. Caller must ensure there is sufficient space. + * If NULL, return the size of the table in @length. + * @length: If @buffer is NULL, the size of the table will be returned in @length. + * If @buffer is not null, @length specifies the number of bytes to read. + * + * If less than @length bytes are available to read this function + * returns CAIRO_INT_STATUS_UNSUPPORTED. Note that requesting more + * bytes than are available in the table may continue reading data + * from the following table and return success. If this is + * undesirable the caller should first query the table size. If an + * error occurs the output value of @length is undefined. + * + * Returns CAIRO_INT_STATUS_UNSUPPORTED if not a sfnt style font or table not found. + */ + cairo_warn cairo_int_status_t + (*load_truetype_table)(void *scaled_font, + unsigned long tag, + long offset, + unsigned char *buffer, + unsigned long *length); + + /* ucs4 is set to -1 if the unicode character could not be found + * for the glyph */ + cairo_warn cairo_int_status_t + (*index_to_ucs4)(void *scaled_font, + unsigned long index, + uint32_t *ucs4); + + cairo_warn cairo_bool_t + (*is_synthetic)(void *scaled_font); + + /* For type 1 fonts, return the glyph name for a given glyph index. + * A glyph index and list of glyph names in the Type 1 fonts is provided. + * The function returns the index of the glyph in the list of glyph names. + * @scaled_font: font + * @glyph_names: the names of each glyph in the Type 1 font in the + * order they appear in the CharStrings array + * @num_glyph_names: the number of names in the glyph_names array + * @glyph_index: the given glyph index + * @glyph_array_index: (index into glyph_names) the glyph name corresponding + * to the glyph_index + */ + + cairo_warn cairo_int_status_t + (*index_to_glyph_name)(void *scaled_font, + char **glyph_names, + int num_glyph_names, + unsigned long glyph_index, + unsigned long *glyph_array_index); + + /* Read data from a PostScript font. + * @scaled_font: font + * @offset: offset into the table + * @buffer: buffer to write data into. Caller must ensure there is sufficient space. + * If NULL, return the size of the table in @length. + * @length: If @buffer is NULL, the size of the table will be returned in @length. + * If @buffer is not null, @length specifies the number of bytes to read. + * + * If less than @length bytes are available to read this function + * returns CAIRO_INT_STATUS_UNSUPPORTED. If an error occurs the + * output value of @length is undefined. + * + * Returns CAIRO_INT_STATUS_UNSUPPORTED if not a Type 1 font. + */ + cairo_warn cairo_int_status_t + (*load_type1_data) (void *scaled_font, + long offset, + unsigned char *buffer, + unsigned long *length); +}; + +struct _cairo_font_face_backend { + cairo_font_type_t type; + + cairo_warn cairo_status_t + (*create_for_toy) (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face); + + /* The destroy() function is allowed to resurrect the font face + * by re-referencing. This is needed for the FreeType backend. + */ + cairo_bool_t + (*destroy) (void *font_face); + + cairo_warn cairo_status_t + (*scaled_font_create) (void *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **scaled_font); + + cairo_font_face_t * + (*get_implementation) (void *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options); +}; + +extern const cairo_private struct _cairo_font_face_backend _cairo_user_font_face_backend; + +/* concrete font backends */ +#if CAIRO_HAS_FT_FONT + +extern const cairo_private struct _cairo_font_face_backend _cairo_ft_font_face_backend; + +#endif + +#if CAIRO_HAS_WIN32_FONT + +extern const cairo_private struct _cairo_font_face_backend _cairo_win32_font_face_backend; + +#endif + +#if CAIRO_HAS_QUARTZ_FONT + +extern const cairo_private struct _cairo_font_face_backend _cairo_quartz_font_face_backend; + +#endif + +#define CAIRO_EXTEND_SURFACE_DEFAULT CAIRO_EXTEND_NONE +#define CAIRO_EXTEND_GRADIENT_DEFAULT CAIRO_EXTEND_PAD +#define CAIRO_FILTER_DEFAULT CAIRO_FILTER_GOOD + +extern const cairo_private cairo_solid_pattern_t _cairo_pattern_clear; +extern const cairo_private cairo_solid_pattern_t _cairo_pattern_black; +extern const cairo_private cairo_solid_pattern_t _cairo_pattern_white; + +struct _cairo_surface_attributes { + cairo_matrix_t matrix; + cairo_extend_t extend; + cairo_filter_t filter; + cairo_bool_t has_component_alpha; + int x_offset; + int y_offset; + void *extra; +}; + +#define CAIRO_FONT_SLANT_DEFAULT CAIRO_FONT_SLANT_NORMAL +#define CAIRO_FONT_WEIGHT_DEFAULT CAIRO_FONT_WEIGHT_NORMAL + +#define CAIRO_WIN32_FONT_FAMILY_DEFAULT "Arial" +#define CAIRO_QUARTZ_FONT_FAMILY_DEFAULT "Helvetica" +#define CAIRO_FT_FONT_FAMILY_DEFAULT "" +#define CAIRO_USER_FONT_FAMILY_DEFAULT "@cairo:" + +#if CAIRO_HAS_WIN32_FONT + +#define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT +#define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_win32_font_face_backend + +#elif CAIRO_HAS_QUARTZ_FONT + +#define CAIRO_FONT_FAMILY_DEFAULT CAIRO_QUARTZ_FONT_FAMILY_DEFAULT +#define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_quartz_font_face_backend + +#elif CAIRO_HAS_FT_FONT + +#define CAIRO_FONT_FAMILY_DEFAULT CAIRO_FT_FONT_FAMILY_DEFAULT +#define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_ft_font_face_backend + +#else + +#define CAIRO_FONT_FAMILY_DEFAULT CAIRO_FT_FONT_FAMILY_DEFAULT +#define CAIRO_FONT_FACE_BACKEND_DEFAULT &_cairo_user_font_face_backend + +#endif + +#define CAIRO_GSTATE_OPERATOR_DEFAULT CAIRO_OPERATOR_OVER +#define CAIRO_GSTATE_TOLERANCE_DEFAULT 0.1 +#define CAIRO_GSTATE_FILL_RULE_DEFAULT CAIRO_FILL_RULE_WINDING +#define CAIRO_GSTATE_LINE_WIDTH_DEFAULT 2.0 +#define CAIRO_GSTATE_LINE_CAP_DEFAULT CAIRO_LINE_CAP_BUTT +#define CAIRO_GSTATE_LINE_JOIN_DEFAULT CAIRO_LINE_JOIN_MITER +#define CAIRO_GSTATE_MITER_LIMIT_DEFAULT 10.0 +#define CAIRO_GSTATE_DEFAULT_FONT_SIZE 10.0 + +#define CAIRO_SURFACE_RESOLUTION_DEFAULT 72.0 +#define CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT 300.0 + +typedef struct _cairo_stroke_face { + cairo_point_t ccw; + cairo_point_t point; + cairo_point_t cw; + cairo_slope_t dev_vector; + cairo_point_double_t dev_slope; + cairo_point_double_t usr_vector; + double length; +} cairo_stroke_face_t; + +/* cairo.c */ + +static inline double cairo_const +_cairo_restrict_value (double value, double min, double max) +{ + if (value < min) + return min; + else if (value > max) + return max; + else + return value; +} + +/* C99 round() rounds to the nearest integral value with halfway cases rounded + * away from 0. _cairo_round rounds halfway cases toward positive infinity. + * This matches the rounding behaviour of _cairo_lround. */ +static inline double cairo_const +_cairo_round (double r) +{ + return floor (r + .5); +} + +#if DISABLE_SOME_FLOATING_POINT +cairo_private int +_cairo_lround (double d) cairo_const; +#else +static inline int cairo_const +_cairo_lround (double r) +{ + return _cairo_round (r); +} +#endif + +cairo_private uint16_t +_cairo_half_from_float (float f) cairo_const; + +cairo_private cairo_bool_t +_cairo_operator_bounded_by_mask (cairo_operator_t op) cairo_const; + +cairo_private cairo_bool_t +_cairo_operator_bounded_by_source (cairo_operator_t op) cairo_const; + +enum { + CAIRO_OPERATOR_BOUND_BY_MASK = 1 << 1, + CAIRO_OPERATOR_BOUND_BY_SOURCE = 1 << 2, +}; + +cairo_private uint32_t +_cairo_operator_bounded_by_either (cairo_operator_t op) cairo_const; +/* cairo-color.c */ +cairo_private const cairo_color_t * +_cairo_stock_color (cairo_stock_t stock) cairo_pure; + +#define CAIRO_COLOR_WHITE _cairo_stock_color (CAIRO_STOCK_WHITE) +#define CAIRO_COLOR_BLACK _cairo_stock_color (CAIRO_STOCK_BLACK) +#define CAIRO_COLOR_TRANSPARENT _cairo_stock_color (CAIRO_STOCK_TRANSPARENT) + +cairo_private uint16_t +_cairo_color_double_to_short (double d) cairo_const; + +cairo_private void +_cairo_color_init_rgba (cairo_color_t *color, + double red, double green, double blue, + double alpha); + +cairo_private void +_cairo_color_multiply_alpha (cairo_color_t *color, + double alpha); + +cairo_private void +_cairo_color_get_rgba (cairo_color_t *color, + double *red, + double *green, + double *blue, + double *alpha); + +cairo_private void +_cairo_color_get_rgba_premultiplied (cairo_color_t *color, + double *red, + double *green, + double *blue, + double *alpha); + +cairo_private cairo_bool_t +_cairo_color_equal (const cairo_color_t *color_a, + const cairo_color_t *color_b) cairo_pure; + +cairo_private cairo_bool_t +_cairo_color_stop_equal (const cairo_color_stop_t *color_a, + const cairo_color_stop_t *color_b) cairo_pure; + +cairo_private cairo_content_t +_cairo_color_get_content (const cairo_color_t *color) cairo_pure; + +/* cairo-font-face.c */ + +extern const cairo_private cairo_font_face_t _cairo_font_face_nil; + +cairo_private void +_cairo_font_face_init (cairo_font_face_t *font_face, + const cairo_font_face_backend_t *backend); + +cairo_private cairo_bool_t +_cairo_font_face_destroy (void *abstract_face); + +cairo_private cairo_status_t +_cairo_font_face_set_error (cairo_font_face_t *font_face, + cairo_status_t status); + +cairo_private void +_cairo_unscaled_font_init (cairo_unscaled_font_t *font, + const cairo_unscaled_font_backend_t *backend); + +cairo_private_no_warn cairo_unscaled_font_t * +_cairo_unscaled_font_reference (cairo_unscaled_font_t *font); + +cairo_private void +_cairo_unscaled_font_destroy (cairo_unscaled_font_t *font); + +/* cairo-font-face-twin.c */ + +cairo_private cairo_font_face_t * +_cairo_font_face_twin_create_fallback (void); + +cairo_private cairo_status_t +_cairo_font_face_twin_create_for_toy (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face); + +/* cairo-font-face-twin-data.c */ + +extern const cairo_private int8_t _cairo_twin_outlines[]; +extern const cairo_private uint16_t _cairo_twin_charmap[128]; + +/* cairo-font-options.c */ + +cairo_private void +_cairo_font_options_init_default (cairo_font_options_t *options); + +cairo_private void +_cairo_font_options_init_copy (cairo_font_options_t *options, + const cairo_font_options_t *other); + +cairo_private void +_cairo_font_options_set_lcd_filter (cairo_font_options_t *options, + cairo_lcd_filter_t lcd_filter); + +cairo_private cairo_lcd_filter_t +_cairo_font_options_get_lcd_filter (const cairo_font_options_t *options); + +cairo_private void +_cairo_font_options_set_round_glyph_positions (cairo_font_options_t *options, + cairo_round_glyph_positions_t round); + +cairo_private cairo_round_glyph_positions_t +_cairo_font_options_get_round_glyph_positions (const cairo_font_options_t *options); + +/* cairo-hull.c */ +cairo_private cairo_status_t +_cairo_hull_compute (cairo_pen_vertex_t *vertices, int *num_vertices); + +/* cairo-lzw.c */ +cairo_private unsigned char * +_cairo_lzw_compress (unsigned char *data, unsigned long *size_in_out); + +/* cairo-misc.c */ +cairo_private cairo_status_t +_cairo_validate_text_clusters (const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags); + +cairo_private cairo_status_t +_cairo_intern_string (const char **str_inout, int len); + +cairo_private void +_cairo_intern_string_reset_static_data (void); + +cairo_private const char * +cairo_get_locale_decimal_point (void); + +/* cairo-path-fixed.c */ +cairo_private cairo_path_fixed_t * +_cairo_path_fixed_create (void); + +cairo_private void +_cairo_path_fixed_init (cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_path_fixed_init_copy (cairo_path_fixed_t *path, + const cairo_path_fixed_t *other); + +cairo_private void +_cairo_path_fixed_fini (cairo_path_fixed_t *path); + +cairo_private void +_cairo_path_fixed_destroy (cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_path_fixed_move_to (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y); + +cairo_private void +_cairo_path_fixed_new_sub_path (cairo_path_fixed_t *path); + +cairo_private cairo_status_t +_cairo_path_fixed_rel_move_to (cairo_path_fixed_t *path, + cairo_fixed_t dx, + cairo_fixed_t dy); + +cairo_private cairo_status_t +_cairo_path_fixed_line_to (cairo_path_fixed_t *path, + cairo_fixed_t x, + cairo_fixed_t y); + +cairo_private cairo_status_t +_cairo_path_fixed_rel_line_to (cairo_path_fixed_t *path, + cairo_fixed_t dx, + cairo_fixed_t dy); + +cairo_private cairo_status_t +_cairo_path_fixed_curve_to (cairo_path_fixed_t *path, + cairo_fixed_t x0, cairo_fixed_t y0, + cairo_fixed_t x1, cairo_fixed_t y1, + cairo_fixed_t x2, cairo_fixed_t y2); + +cairo_private cairo_status_t +_cairo_path_fixed_rel_curve_to (cairo_path_fixed_t *path, + cairo_fixed_t dx0, cairo_fixed_t dy0, + cairo_fixed_t dx1, cairo_fixed_t dy1, + cairo_fixed_t dx2, cairo_fixed_t dy2); + +cairo_private cairo_status_t +_cairo_path_fixed_close_path (cairo_path_fixed_t *path); + +cairo_private cairo_bool_t +_cairo_path_fixed_get_current_point (cairo_path_fixed_t *path, + cairo_fixed_t *x, + cairo_fixed_t *y); + +typedef cairo_status_t +(cairo_path_fixed_move_to_func_t) (void *closure, + const cairo_point_t *point); + +typedef cairo_status_t +(cairo_path_fixed_line_to_func_t) (void *closure, + const cairo_point_t *point); + +typedef cairo_status_t +(cairo_path_fixed_curve_to_func_t) (void *closure, + const cairo_point_t *p0, + const cairo_point_t *p1, + const cairo_point_t *p2); + +typedef cairo_status_t +(cairo_path_fixed_close_path_func_t) (void *closure); + +cairo_private cairo_status_t +_cairo_path_fixed_interpret (const cairo_path_fixed_t *path, + cairo_path_fixed_move_to_func_t *move_to, + cairo_path_fixed_line_to_func_t *line_to, + cairo_path_fixed_curve_to_func_t *curve_to, + cairo_path_fixed_close_path_func_t *close_path, + void *closure); + +cairo_private cairo_status_t +_cairo_path_fixed_interpret_flat (const cairo_path_fixed_t *path, + cairo_path_fixed_move_to_func_t *move_to, + cairo_path_fixed_line_to_func_t *line_to, + cairo_path_fixed_close_path_func_t *close_path, + void *closure, + double tolerance); + + +cairo_private cairo_bool_t +_cairo_path_bounder_extents (const cairo_path_fixed_t *path, + cairo_box_t *box); + +cairo_private cairo_bool_t +_cairo_path_fixed_extents (const cairo_path_fixed_t *path, + cairo_box_t *box); + +cairo_private void +_cairo_path_fixed_approximate_clip_extents (const cairo_path_fixed_t *path, + cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_path_fixed_approximate_fill_extents (const cairo_path_fixed_t *path, + cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_path_fixed_fill_extents (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_path_fixed_approximate_stroke_extents (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_path_fixed_stroke_extents (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_rectangle_int_t *extents); + +cairo_private void +_cairo_path_fixed_transform (cairo_path_fixed_t *path, + const cairo_matrix_t *matrix); + +cairo_private cairo_bool_t +_cairo_path_fixed_is_box (const cairo_path_fixed_t *path, + cairo_box_t *box); + +cairo_private cairo_bool_t +_cairo_path_fixed_is_rectangle (const cairo_path_fixed_t *path, + cairo_box_t *box); + +/* cairo-path-in-fill.c */ +cairo_private cairo_bool_t +_cairo_path_fixed_in_fill (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + double x, + double y); + +/* cairo-path-fill.c */ +cairo_private cairo_status_t +_cairo_path_fixed_fill_to_polygon (const cairo_path_fixed_t *path, + double tolerance, + cairo_polygon_t *polygon); + +cairo_private cairo_status_t +_cairo_path_fixed_fill_rectilinear_to_polygon (const cairo_path_fixed_t *path, + cairo_antialias_t antialias, + cairo_polygon_t *polygon); + +cairo_private cairo_status_t +_cairo_path_fixed_fill_rectilinear_to_boxes (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + cairo_antialias_t antialias, + cairo_boxes_t *boxes); + +cairo_private cairo_region_t * +_cairo_path_fixed_fill_rectilinear_to_region (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_path_fixed_fill_to_traps (const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_traps_t *traps); + +/* cairo-path-stroke.c */ +cairo_private cairo_status_t +_cairo_path_fixed_stroke_to_polygon (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_polygon_t *polygon); + +cairo_private cairo_int_status_t +_cairo_path_fixed_stroke_to_tristrip (const cairo_path_fixed_t *path, + const cairo_stroke_style_t*style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_tristrip_t *strip); + +cairo_private cairo_status_t +_cairo_path_fixed_stroke_dashed_to_polygon (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_polygon_t *polygon); + +cairo_private cairo_int_status_t +_cairo_path_fixed_stroke_rectilinear_to_boxes (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + cairo_antialias_t antialias, + cairo_boxes_t *boxes); + +cairo_private cairo_int_status_t +_cairo_path_fixed_stroke_to_traps (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_traps_t *traps); + +cairo_private cairo_int_status_t +_cairo_path_fixed_stroke_polygon_to_traps (const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_traps_t *traps); + +cairo_private cairo_status_t +_cairo_path_fixed_stroke_to_shaper (cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_status_t (*add_triangle) (void *closure, + const cairo_point_t triangle[3]), + cairo_status_t (*add_triangle_fan) (void *closure, + const cairo_point_t *midpt, + const cairo_point_t *points, + int npoints), + cairo_status_t (*add_quad) (void *closure, + const cairo_point_t quad[4]), + void *closure); + +/* cairo-scaled-font.c */ + +cairo_private void +_cairo_scaled_font_freeze_cache (cairo_scaled_font_t *scaled_font); + +cairo_private void +_cairo_scaled_font_thaw_cache (cairo_scaled_font_t *scaled_font); + +cairo_private void +_cairo_scaled_font_reset_cache (cairo_scaled_font_t *scaled_font); + +cairo_private cairo_status_t +_cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font, + cairo_status_t status); + +cairo_private cairo_scaled_font_t * +_cairo_scaled_font_create_in_error (cairo_status_t status); + +cairo_private void +_cairo_scaled_font_reset_static_data (void); + +cairo_private cairo_status_t +_cairo_scaled_font_register_placeholder_and_unlock_font_map (cairo_scaled_font_t *scaled_font); + +cairo_private void +_cairo_scaled_font_unregister_placeholder_and_lock_font_map (cairo_scaled_font_t *scaled_font); + +cairo_private cairo_status_t +_cairo_scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + const cairo_scaled_font_backend_t *backend); + +cairo_private cairo_status_t +_cairo_scaled_font_set_metrics (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *fs_metrics); + +/* This should only be called on an error path by a scaled_font constructor */ +cairo_private void +_cairo_scaled_font_fini (cairo_scaled_font_t *scaled_font); + +cairo_private cairo_status_t +_cairo_scaled_font_font_extents (cairo_scaled_font_t *scaled_font, + cairo_font_extents_t *extents); + +cairo_private cairo_status_t +_cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_rectangle_int_t *extents, + cairo_bool_t *overlap); + +cairo_private cairo_bool_t +_cairo_scaled_font_glyph_approximate_extents (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +_cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_surface_t *surface, + int source_x, + int source_y, + int dest_x, + int dest_y, + unsigned int width, + unsigned int height, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_region_t *clip_region); + +cairo_private cairo_status_t +_cairo_scaled_font_glyph_path (cairo_scaled_font_t *scaled_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_path_fixed_t *path); + +cairo_private void +_cairo_scaled_glyph_set_metrics (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_text_extents_t *fs_metrics); + +cairo_private void +_cairo_scaled_glyph_set_surface (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_image_surface_t *surface); + +cairo_private void +_cairo_scaled_glyph_set_path (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_path_fixed_t *path); + +cairo_private void +_cairo_scaled_glyph_set_recording_surface (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font, + cairo_surface_t *recording_surface); + +cairo_private cairo_int_status_t +_cairo_scaled_glyph_lookup (cairo_scaled_font_t *scaled_font, + unsigned long index, + cairo_scaled_glyph_info_t info, + cairo_scaled_glyph_t **scaled_glyph_ret); + +cairo_private double +_cairo_scaled_font_get_max_scale (cairo_scaled_font_t *scaled_font); + +cairo_private void +_cairo_scaled_font_map_destroy (void); + +/* cairo-stroke-style.c */ + +cairo_private void +_cairo_stroke_style_init (cairo_stroke_style_t *style); + +cairo_private cairo_status_t +_cairo_stroke_style_init_copy (cairo_stroke_style_t *style, + const cairo_stroke_style_t *other); + +cairo_private void +_cairo_stroke_style_fini (cairo_stroke_style_t *style); + +cairo_private void +_cairo_stroke_style_max_distance_from_path (const cairo_stroke_style_t *style, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm, + double *dx, double *dy); +cairo_private void +_cairo_stroke_style_max_line_distance_from_path (const cairo_stroke_style_t *style, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm, + double *dx, double *dy); + +cairo_private void +_cairo_stroke_style_max_join_distance_from_path (const cairo_stroke_style_t *style, + const cairo_path_fixed_t *path, + const cairo_matrix_t *ctm, + double *dx, double *dy); + +cairo_private double +_cairo_stroke_style_dash_period (const cairo_stroke_style_t *style); + +cairo_private double +_cairo_stroke_style_dash_stroked (const cairo_stroke_style_t *style); + +cairo_private cairo_bool_t +_cairo_stroke_style_dash_can_approximate (const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + double tolerance); + +cairo_private void +_cairo_stroke_style_dash_approximate (const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + double tolerance, + double *dash_offset, + double *dashes, + unsigned int *num_dashes); + + +/* cairo-surface.c */ + +cairo_private cairo_status_t +_cairo_surface_copy_mime_data (cairo_surface_t *dst, + cairo_surface_t *src); + +cairo_private_no_warn cairo_int_status_t +_cairo_surface_set_error (cairo_surface_t *surface, + cairo_int_status_t status); + +cairo_private void +_cairo_surface_set_resolution (cairo_surface_t *surface, + double x_res, + double y_res); + +cairo_private cairo_surface_t * +_cairo_surface_create_for_rectangle_int (cairo_surface_t *target, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_surface_t * +_cairo_surface_create_scratch (cairo_surface_t *other, + cairo_content_t content, + int width, + int height, + const cairo_color_t *color); + +cairo_private void +_cairo_surface_init (cairo_surface_t *surface, + const cairo_surface_backend_t *backend, + cairo_device_t *device, + cairo_content_t content); + +cairo_private void +_cairo_surface_set_font_options (cairo_surface_t *surface, + cairo_font_options_t *options); + +cairo_private cairo_status_t +_cairo_surface_paint (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip); + +cairo_private cairo_image_surface_t * +_cairo_surface_map_to_image (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents); + +cairo_private_no_warn cairo_int_status_t +_cairo_surface_unmap_image (cairo_surface_t *surface, + cairo_image_surface_t *image); + +cairo_private cairo_status_t +_cairo_surface_mask (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_fill_stroke (cairo_surface_t *surface, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + cairo_path_fixed_t *path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_stroke (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_fill (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_show_text_glyphs (cairo_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_surface_acquire_source_image (cairo_surface_t *surface, + cairo_image_surface_t **image_out, + void **image_extra); + +cairo_private void +_cairo_surface_release_source_image (cairo_surface_t *surface, + cairo_image_surface_t *image, + void *image_extra); + +cairo_private cairo_surface_t * +_cairo_surface_snapshot (cairo_surface_t *surface); + +cairo_private void +_cairo_surface_attach_snapshot (cairo_surface_t *surface, + cairo_surface_t *snapshot, + cairo_surface_func_t detach_func); + +cairo_private cairo_surface_t * +_cairo_surface_has_snapshot (cairo_surface_t *surface, + const cairo_surface_backend_t *backend); + +cairo_private void +_cairo_surface_detach_snapshot (cairo_surface_t *snapshot); + +cairo_private cairo_status_t +_cairo_surface_begin_modification (cairo_surface_t *surface); + +cairo_private_no_warn cairo_bool_t +_cairo_surface_get_extents (cairo_surface_t *surface, + cairo_rectangle_int_t *extents); + +cairo_private cairo_bool_t +_cairo_surface_has_device_transform (cairo_surface_t *surface) cairo_pure; + +cairo_private void +_cairo_surface_release_device_reference (cairo_surface_t *surface); + +/* cairo-image-surface.c */ + +/* XXX: In cairo 1.2.0 we added a new %CAIRO_FORMAT_RGB16_565 but + * neglected to adjust this macro. The net effect is that it's + * impossible to externally create an image surface with this + * format. This is perhaps a good thing since we also neglected to fix + * up things like cairo_surface_write_to_png() for the new format + * (-Wswitch-enum will tell you where). Is it obvious that format was + * added in haste? + * + * The reason for the new format was to allow the xlib backend to be + * used on X servers with a 565 visual. So the new format did its job + * for that, even without being considered "valid" for the sake of + * things like cairo_image_surface_create(). + * + * Since 1.2.0 we ran into the same situtation with X servers with BGR + * visuals. This time we invented #cairo_internal_format_t instead, + * (see it for more discussion). + * + * The punchline is that %CAIRO_FORMAT_VALID must not conside any + * internal format to be valid. Also we need to decide if the + * RGB16_565 should be moved to instead be an internal format. If so, + * this macro need not change for it. (We probably will need to leave + * an RGB16_565 value in the header files for the sake of code that + * might have that value in it.) + * + * If we do decide to start fully supporting RGB16_565 as an external + * format, then %CAIRO_FORMAT_VALID needs to be adjusted to include + * it. But that should not happen before all necessary code is fixed + * to support it (at least cairo_surface_write_to_png() and a few spots + * in cairo-xlib-surface.c--again see -Wswitch-enum). + */ +#define CAIRO_FORMAT_VALID(format) ((format) >= CAIRO_FORMAT_ARGB32 && \ + (format) <= CAIRO_FORMAT_RGB30) + +/* pixman-required stride alignment in bytes. */ +#define CAIRO_STRIDE_ALIGNMENT (sizeof (uint32_t)) +#define CAIRO_STRIDE_FOR_WIDTH_BPP(w,bpp) \ + ((((bpp)*(w)+7)/8 + CAIRO_STRIDE_ALIGNMENT-1) & -CAIRO_STRIDE_ALIGNMENT) + +#define CAIRO_CONTENT_VALID(content) ((content) && \ + (((content) & ~(CAIRO_CONTENT_COLOR | \ + CAIRO_CONTENT_ALPHA | \ + CAIRO_CONTENT_COLOR_ALPHA))\ + == 0)) + +cairo_private int +_cairo_format_bits_per_pixel (cairo_format_t format) cairo_const; + +cairo_private cairo_format_t +_cairo_format_from_content (cairo_content_t content) cairo_const; + +cairo_private cairo_format_t +_cairo_format_from_pixman_format (pixman_format_code_t pixman_format); + +cairo_private cairo_content_t +_cairo_content_from_format (cairo_format_t format) cairo_const; + +cairo_private cairo_content_t +_cairo_content_from_pixman_format (pixman_format_code_t pixman_format); + +cairo_private cairo_surface_t * +_cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, + pixman_format_code_t pixman_format); + +cairo_private pixman_format_code_t +_cairo_format_to_pixman_format_code (cairo_format_t format); + +cairo_private cairo_bool_t +_pixman_format_from_masks (cairo_format_masks_t *masks, + pixman_format_code_t *format_ret); + +cairo_private cairo_bool_t +_pixman_format_to_masks (pixman_format_code_t pixman_format, + cairo_format_masks_t *masks); + +cairo_private void +_cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph); + +cairo_private void +_cairo_image_reset_static_data (void); + +cairo_private cairo_surface_t * +_cairo_image_surface_create_with_pixman_format (unsigned char *data, + pixman_format_code_t pixman_format, + int width, + int height, + int stride); + +cairo_private cairo_surface_t * +_cairo_image_surface_create_with_content (cairo_content_t content, + int width, + int height); + +cairo_private void +_cairo_image_surface_assume_ownership_of_data (cairo_image_surface_t *surface); + +cairo_private cairo_image_surface_t * +_cairo_image_surface_coerce (cairo_image_surface_t *surface); + +cairo_private cairo_image_surface_t * +_cairo_image_surface_coerce_to_format (cairo_image_surface_t *surface, + cairo_format_t format); + +cairo_private cairo_image_transparency_t +_cairo_image_analyze_transparency (cairo_image_surface_t *image); + +cairo_private cairo_image_color_t +_cairo_image_analyze_color (cairo_image_surface_t *image); + +/* cairo-pen.c */ +cairo_private int +_cairo_pen_vertices_needed (double tolerance, + double radius, + const cairo_matrix_t *matrix); + +cairo_private cairo_status_t +_cairo_pen_init (cairo_pen_t *pen, + double radius, + double tolerance, + const cairo_matrix_t *ctm); + +cairo_private void +_cairo_pen_init_empty (cairo_pen_t *pen); + +cairo_private cairo_status_t +_cairo_pen_init_copy (cairo_pen_t *pen, const cairo_pen_t *other); + +cairo_private void +_cairo_pen_fini (cairo_pen_t *pen); + +cairo_private cairo_status_t +_cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *point, int num_points); + +cairo_private int +_cairo_pen_find_active_cw_vertex_index (const cairo_pen_t *pen, + const cairo_slope_t *slope); + +cairo_private int +_cairo_pen_find_active_ccw_vertex_index (const cairo_pen_t *pen, + const cairo_slope_t *slope); + +cairo_private void +_cairo_pen_find_active_cw_vertices (const cairo_pen_t *pen, + const cairo_slope_t *in, + const cairo_slope_t *out, + int *start, int *stop); + +cairo_private void +_cairo_pen_find_active_ccw_vertices (const cairo_pen_t *pen, + const cairo_slope_t *in, + const cairo_slope_t *out, + int *start, int *stop); + +/* cairo-polygon.c */ +cairo_private void +_cairo_polygon_init (cairo_polygon_t *polygon, + const cairo_box_t *boxes, + int num_boxes); + +cairo_private void +_cairo_polygon_init_with_clip (cairo_polygon_t *polygon, + const cairo_clip_t *clip); + +cairo_private cairo_status_t +_cairo_polygon_init_boxes (cairo_polygon_t *polygon, + const cairo_boxes_t *boxes); + +cairo_private cairo_status_t +_cairo_polygon_init_box_array (cairo_polygon_t *polygon, + cairo_box_t *boxes, + int num_boxes); + +cairo_private void +_cairo_polygon_limit (cairo_polygon_t *polygon, + const cairo_box_t *limits, + int num_limits); + +cairo_private void +_cairo_polygon_limit_to_clip (cairo_polygon_t *polygon, + const cairo_clip_t *clip); + +cairo_private void +_cairo_polygon_fini (cairo_polygon_t *polygon); + +cairo_private_no_warn cairo_status_t +_cairo_polygon_add_line (cairo_polygon_t *polygon, + const cairo_line_t *line, + int top, int bottom, + int dir); + +cairo_private_no_warn cairo_status_t +_cairo_polygon_add_external_edge (void *polygon, + const cairo_point_t *p1, + const cairo_point_t *p2); + +cairo_private_no_warn cairo_status_t +_cairo_polygon_add_contour (cairo_polygon_t *polygon, + const cairo_contour_t *contour); + +cairo_private void +_cairo_polygon_translate (cairo_polygon_t *polygon, int dx, int dy); + +cairo_private cairo_status_t +_cairo_polygon_reduce (cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_status_t +_cairo_polygon_intersect (cairo_polygon_t *a, int winding_a, + cairo_polygon_t *b, int winding_b); + +cairo_private cairo_status_t +_cairo_polygon_intersect_with_boxes (cairo_polygon_t *polygon, + cairo_fill_rule_t *winding, + cairo_box_t *boxes, + int num_boxes); + +static inline cairo_bool_t +_cairo_polygon_is_empty (const cairo_polygon_t *polygon) +{ + return + polygon->num_edges == 0 || + polygon->extents.p2.x <= polygon->extents.p1.x; +} + +#define _cairo_polygon_status(P) ((cairo_polygon_t *) (P))->status + +/* cairo-spline.c */ +cairo_private cairo_bool_t +_cairo_spline_init (cairo_spline_t *spline, + cairo_spline_add_point_func_t add_point_func, + void *closure, + const cairo_point_t *a, const cairo_point_t *b, + const cairo_point_t *c, const cairo_point_t *d); + +cairo_private cairo_status_t +_cairo_spline_decompose (cairo_spline_t *spline, double tolerance); + +cairo_private cairo_status_t +_cairo_spline_bound (cairo_spline_add_point_func_t add_point_func, + void *closure, + const cairo_point_t *p0, const cairo_point_t *p1, + const cairo_point_t *p2, const cairo_point_t *p3); + +/* cairo-matrix.c */ +cairo_private void +_cairo_matrix_get_affine (const cairo_matrix_t *matrix, + double *xx, double *yx, + double *xy, double *yy, + double *x0, double *y0); + +cairo_private void +_cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix, + double *x1, double *y1, + double *x2, double *y2, + cairo_bool_t *is_tight); + +cairo_private void +_cairo_matrix_transform_bounding_box_fixed (const cairo_matrix_t *matrix, + cairo_box_t *bbox, + cairo_bool_t *is_tight); + +cairo_private cairo_bool_t +_cairo_matrix_is_invertible (const cairo_matrix_t *matrix) cairo_pure; + +cairo_private cairo_bool_t +_cairo_matrix_is_scale_0 (const cairo_matrix_t *matrix) cairo_pure; + +cairo_private double +_cairo_matrix_compute_determinant (const cairo_matrix_t *matrix) cairo_pure; + +cairo_private cairo_status_t +_cairo_matrix_compute_basis_scale_factors (const cairo_matrix_t *matrix, + double *sx, double *sy, int x_major); + +static inline cairo_bool_t +_cairo_matrix_is_identity (const cairo_matrix_t *matrix) +{ + return (matrix->xx == 1.0 && matrix->yx == 0.0 && + matrix->xy == 0.0 && matrix->yy == 1.0 && + matrix->x0 == 0.0 && matrix->y0 == 0.0); +} + +static inline cairo_bool_t +_cairo_matrix_is_translation (const cairo_matrix_t *matrix) +{ + return (matrix->xx == 1.0 && matrix->yx == 0.0 && + matrix->xy == 0.0 && matrix->yy == 1.0); +} + +static inline cairo_bool_t +_cairo_matrix_is_scale (const cairo_matrix_t *matrix) +{ + return matrix->yx == 0.0 && matrix->xy == 0.0; +} + +cairo_private cairo_bool_t +_cairo_matrix_is_integer_translation(const cairo_matrix_t *matrix, + int *itx, int *ity); + +cairo_private cairo_bool_t +_cairo_matrix_has_unity_scale (const cairo_matrix_t *matrix); + +cairo_private cairo_bool_t +_cairo_matrix_is_pixel_exact (const cairo_matrix_t *matrix) cairo_pure; + +cairo_private double +_cairo_matrix_transformed_circle_major_axis (const cairo_matrix_t *matrix, + double radius) cairo_pure; + +cairo_private cairo_bool_t +_cairo_matrix_is_pixman_translation (const cairo_matrix_t *matrix, + cairo_filter_t filter, + int *out_x_offset, + int *out_y_offset); + +cairo_private cairo_status_t +_cairo_matrix_to_pixman_matrix_offset (const cairo_matrix_t *matrix, + cairo_filter_t filter, + double xc, + double yc, + pixman_transform_t *out_transform, + int *out_x_offset, + int *out_y_offset); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_rectilinear_polygon (cairo_traps_t *traps, + const cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps, + const cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_traps (cairo_traps_t *traps, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_rectangular_traps (cairo_traps_t *traps, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_boxes (const cairo_boxes_t *in, + cairo_fill_rule_t fill_rule, + cairo_boxes_t *out); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_rectilinear_traps (cairo_traps_t *traps, + cairo_fill_rule_t fill_rule); + +cairo_private cairo_status_t +_cairo_bentley_ottmann_tessellate_rectilinear_polygon_to_boxes (const cairo_polygon_t *polygon, + cairo_fill_rule_t fill_rule, + cairo_boxes_t *boxes); + +cairo_private void +_cairo_trapezoid_array_translate_and_scale (cairo_trapezoid_t *offset_traps, + cairo_trapezoid_t *src_traps, + int num_traps, + double tx, double ty, + double sx, double sy); + +#if CAIRO_HAS_DRM_SURFACE + +cairo_private void +_cairo_drm_device_reset_static_data (void); + +#endif + +cairo_private void +_cairo_clip_reset_static_data (void); + +cairo_private void +_cairo_pattern_reset_static_data (void); + +/* cairo-unicode.c */ + +cairo_private int +_cairo_utf8_get_char_validated (const char *p, + uint32_t *unicode); + +cairo_private cairo_status_t +_cairo_utf8_to_ucs4 (const char *str, + int len, + uint32_t **result, + int *items_written); + +cairo_private int +_cairo_ucs4_to_utf8 (uint32_t unicode, + char *utf8); + +#if CAIRO_HAS_WIN32_FONT || CAIRO_HAS_QUARTZ_FONT || CAIRO_HAS_PDF_OPERATORS +# define CAIRO_HAS_UTF8_TO_UTF16 1 +#endif +#if CAIRO_HAS_UTF8_TO_UTF16 +cairo_private cairo_status_t +_cairo_utf8_to_utf16 (const char *str, + int len, + uint16_t **result, + int *items_written); +#endif + +cairo_private void +_cairo_matrix_multiply (cairo_matrix_t *r, + const cairo_matrix_t *a, + const cairo_matrix_t *b); + +/* cairo-observer.c */ + +cairo_private void +_cairo_observers_notify (cairo_list_t *observers, void *arg); + +/* Avoid unnecessary PLT entries. */ +slim_hidden_proto (cairo_clip_preserve); +slim_hidden_proto (cairo_close_path); +slim_hidden_proto (cairo_create); +slim_hidden_proto (cairo_curve_to); +slim_hidden_proto (cairo_destroy); +slim_hidden_proto (cairo_fill_preserve); +slim_hidden_proto (cairo_font_face_destroy); +slim_hidden_proto (cairo_font_face_get_user_data); +slim_hidden_proto_no_warn (cairo_font_face_reference); +slim_hidden_proto (cairo_font_face_set_user_data); +slim_hidden_proto (cairo_font_options_equal); +slim_hidden_proto (cairo_font_options_hash); +slim_hidden_proto (cairo_font_options_merge); +slim_hidden_proto (cairo_font_options_set_antialias); +slim_hidden_proto (cairo_font_options_set_hint_metrics); +slim_hidden_proto (cairo_font_options_set_hint_style); +slim_hidden_proto (cairo_font_options_set_subpixel_order); +slim_hidden_proto (cairo_font_options_status); +slim_hidden_proto (cairo_format_stride_for_width); +slim_hidden_proto (cairo_get_current_point); +slim_hidden_proto (cairo_get_line_width); +slim_hidden_proto (cairo_get_matrix); +slim_hidden_proto (cairo_get_scaled_font); +slim_hidden_proto (cairo_get_target); +slim_hidden_proto (cairo_get_tolerance); +slim_hidden_proto (cairo_glyph_allocate); +slim_hidden_proto (cairo_glyph_free); +slim_hidden_proto (cairo_image_surface_create); +slim_hidden_proto (cairo_image_surface_create_for_data); +slim_hidden_proto (cairo_image_surface_get_data); +slim_hidden_proto (cairo_image_surface_get_format); +slim_hidden_proto (cairo_image_surface_get_height); +slim_hidden_proto (cairo_image_surface_get_stride); +slim_hidden_proto (cairo_image_surface_get_width); +slim_hidden_proto (cairo_line_to); +slim_hidden_proto (cairo_mask); +slim_hidden_proto (cairo_matrix_init); +slim_hidden_proto (cairo_matrix_init_identity); +slim_hidden_proto (cairo_matrix_init_rotate); +slim_hidden_proto (cairo_matrix_init_scale); +slim_hidden_proto (cairo_matrix_init_translate); +slim_hidden_proto (cairo_matrix_invert); +slim_hidden_proto (cairo_matrix_multiply); +slim_hidden_proto (cairo_matrix_scale); +slim_hidden_proto (cairo_matrix_transform_distance); +slim_hidden_proto (cairo_matrix_transform_point); +slim_hidden_proto (cairo_matrix_translate); +slim_hidden_proto (cairo_move_to); +slim_hidden_proto (cairo_new_path); +slim_hidden_proto (cairo_paint); +slim_hidden_proto (cairo_pattern_add_color_stop_rgba); +slim_hidden_proto (cairo_pattern_create_for_surface); +slim_hidden_proto (cairo_pattern_create_rgb); +slim_hidden_proto (cairo_pattern_create_rgba); +slim_hidden_proto (cairo_pattern_destroy); +slim_hidden_proto (cairo_pattern_get_extend); +slim_hidden_proto (cairo_mesh_pattern_curve_to); +slim_hidden_proto (cairo_mesh_pattern_get_control_point); +slim_hidden_proto (cairo_mesh_pattern_get_corner_color_rgba); +slim_hidden_proto (cairo_mesh_pattern_get_patch_count); +slim_hidden_proto (cairo_mesh_pattern_get_path); +slim_hidden_proto (cairo_mesh_pattern_line_to); +slim_hidden_proto (cairo_mesh_pattern_move_to); +slim_hidden_proto (cairo_mesh_pattern_set_corner_color_rgba); +slim_hidden_proto_no_warn (cairo_pattern_reference); +slim_hidden_proto (cairo_pattern_set_matrix); +slim_hidden_proto (cairo_pop_group); +slim_hidden_proto (cairo_push_group_with_content); +slim_hidden_proto_no_warn (cairo_path_destroy); +slim_hidden_proto (cairo_recording_surface_create); +slim_hidden_proto (cairo_rel_line_to); +slim_hidden_proto (cairo_restore); +slim_hidden_proto (cairo_save); +slim_hidden_proto (cairo_scale); +slim_hidden_proto (cairo_scaled_font_create); +slim_hidden_proto (cairo_scaled_font_destroy); +slim_hidden_proto (cairo_scaled_font_extents); +slim_hidden_proto (cairo_scaled_font_get_ctm); +slim_hidden_proto (cairo_scaled_font_get_font_face); +slim_hidden_proto (cairo_scaled_font_get_font_matrix); +slim_hidden_proto (cairo_scaled_font_get_font_options); +slim_hidden_proto (cairo_scaled_font_glyph_extents); +slim_hidden_proto_no_warn (cairo_scaled_font_reference); +slim_hidden_proto (cairo_scaled_font_status); +slim_hidden_proto (cairo_scaled_font_get_user_data); +slim_hidden_proto (cairo_scaled_font_set_user_data); +slim_hidden_proto (cairo_scaled_font_text_to_glyphs); +slim_hidden_proto (cairo_set_font_matrix); +slim_hidden_proto (cairo_set_font_options); +slim_hidden_proto (cairo_set_font_size); +slim_hidden_proto (cairo_set_line_cap); +slim_hidden_proto (cairo_set_line_join); +slim_hidden_proto (cairo_set_line_width); +slim_hidden_proto (cairo_set_matrix); +slim_hidden_proto (cairo_set_operator); +slim_hidden_proto (cairo_set_source); +slim_hidden_proto (cairo_set_source_rgb); +slim_hidden_proto (cairo_set_source_surface); +slim_hidden_proto (cairo_set_tolerance); +slim_hidden_proto (cairo_status); +slim_hidden_proto (cairo_stroke); +slim_hidden_proto (cairo_stroke_preserve); +slim_hidden_proto (cairo_surface_copy_page); +slim_hidden_proto (cairo_surface_create_similar_image); +slim_hidden_proto (cairo_surface_destroy); +slim_hidden_proto (cairo_surface_finish); +slim_hidden_proto (cairo_surface_flush); +slim_hidden_proto (cairo_surface_get_device_offset); +slim_hidden_proto (cairo_surface_get_device_scale); +slim_hidden_proto (cairo_surface_get_font_options); +slim_hidden_proto (cairo_surface_get_mime_data); +slim_hidden_proto (cairo_surface_has_show_text_glyphs); +slim_hidden_proto (cairo_surface_mark_dirty); +slim_hidden_proto (cairo_surface_mark_dirty_rectangle); +slim_hidden_proto_no_warn (cairo_surface_reference); +slim_hidden_proto (cairo_surface_set_device_offset); +slim_hidden_proto (cairo_surface_set_device_scale); +slim_hidden_proto (cairo_surface_set_fallback_resolution); +slim_hidden_proto (cairo_surface_set_mime_data); +slim_hidden_proto (cairo_surface_show_page); +slim_hidden_proto (cairo_surface_status); +slim_hidden_proto (cairo_surface_supports_mime_type); +slim_hidden_proto (cairo_text_cluster_allocate); +slim_hidden_proto (cairo_text_cluster_free); +slim_hidden_proto (cairo_toy_font_face_create); +slim_hidden_proto (cairo_toy_font_face_get_slant); +slim_hidden_proto (cairo_toy_font_face_get_weight); +slim_hidden_proto (cairo_translate); +slim_hidden_proto (cairo_transform); +slim_hidden_proto (cairo_user_font_face_create); +slim_hidden_proto (cairo_user_font_face_set_init_func); +slim_hidden_proto (cairo_user_font_face_set_render_glyph_func); +slim_hidden_proto (cairo_user_font_face_set_unicode_to_glyph_func); +slim_hidden_proto (cairo_device_to_user); +slim_hidden_proto (cairo_user_to_device); +slim_hidden_proto (cairo_user_to_device_distance); +slim_hidden_proto (cairo_version_string); +slim_hidden_proto (cairo_region_create); +slim_hidden_proto (cairo_region_create_rectangle); +slim_hidden_proto (cairo_region_create_rectangles); +slim_hidden_proto (cairo_region_copy); +slim_hidden_proto (cairo_region_reference); +slim_hidden_proto (cairo_region_destroy); +slim_hidden_proto (cairo_region_equal); +slim_hidden_proto (cairo_region_status); +slim_hidden_proto (cairo_region_get_extents); +slim_hidden_proto (cairo_region_num_rectangles); +slim_hidden_proto (cairo_region_get_rectangle); +slim_hidden_proto (cairo_region_is_empty); +slim_hidden_proto (cairo_region_contains_rectangle); +slim_hidden_proto (cairo_region_contains_point); +slim_hidden_proto (cairo_region_translate); +slim_hidden_proto (cairo_region_subtract); +slim_hidden_proto (cairo_region_subtract_rectangle); +slim_hidden_proto (cairo_region_intersect); +slim_hidden_proto (cairo_region_intersect_rectangle); +slim_hidden_proto (cairo_region_union); +slim_hidden_proto (cairo_region_union_rectangle); +slim_hidden_proto (cairo_region_xor); +slim_hidden_proto (cairo_region_xor_rectangle); + +#if CAIRO_HAS_PNG_FUNCTIONS + +slim_hidden_proto (cairo_surface_write_to_png_stream); + +#endif + +CAIRO_END_DECLS + +#include "cairo-mutex-private.h" +#include "cairo-fixed-private.h" +#include "cairo-wideint-private.h" +#include "cairo-malloc-private.h" +#include "cairo-hash-private.h" + +#if HAVE_VALGRIND +#include + +#define VG(x) x + +cairo_private void +_cairo_debug_check_image_surface_is_defined (const cairo_surface_t *surface); + +#else + +#define VG(x) +#define _cairo_debug_check_image_surface_is_defined(X) + +#endif + +cairo_private void +_cairo_debug_print_path (FILE *stream, cairo_path_fixed_t *path); + +cairo_private void +_cairo_debug_print_polygon (FILE *stream, cairo_polygon_t *polygon); + +cairo_private void +_cairo_debug_print_traps (FILE *file, const cairo_traps_t *traps); + +cairo_private void +_cairo_debug_print_clip (FILE *stream, const cairo_clip_t *clip); + +#if 0 +#define TRACE(x) fprintf (stderr, "%s: ", __FILE__), fprintf x +#define TRACE_(x) x +#else +#define TRACE(x) +#define TRACE_(x) +#endif + +#endif diff --git a/src/check-def.sh b/src/check-def.sh new file mode 100755 index 000000000..beefb46a3 --- /dev/null +++ b/src/check-def.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +if which nm 2>/dev/null >/dev/null; then + : +else + echo "'nm' not found; skipping test" + exit 0 +fi + +test -z "$srcdir" && srcdir=. +test -z "$MAKE" && MAKE=make +stat=0 + +$MAKE check-has-hidden-symbols.i > /dev/null || exit 1 +if tail -1 check-has-hidden-symbols.i | grep CAIRO_HAS_HIDDEN_SYMBOLS >/dev/null; then + echo "Compiler doesn't support symbol visibility; skipping test" + exit 0 +fi + +if [ "`uname -s`" = "Linux" ]; then + get_cairo_syms='( objdump -t "$so" | grep "^[^ ]* [^l.*]*[.]"; objdump -t "$so" | grep "[.]hidden.*\\ /dev/null +for def in $defs; do + lib=`echo "$def" | sed 's/[.]def$//'` + lib=`echo "$lib" | sed 's@.*/@@'` + so=.libs/lib${lib}.so + + test -f "$so" || continue + + echo Checking that $so has the same symbol list as $def + + { + echo EXPORTS + eval $get_cairo_syms | c++filt --no-params | grep -v '^_cairo_test_\|^_fini\|^_init\|^_save[fg]pr\|^_rest[fg]pr\|^_Z\|^__gnu\|^__bss\|^_edata\|^_end' | sort -u + # cheat: copy the last line from the def file! + tail -n1 "$def" + } | diff "$def" - >&2 || stat=1 +done + +exit $stat diff --git a/src/check-doc-syntax.awk b/src/check-doc-syntax.awk new file mode 100644 index 000000000..1fa8b8d22 --- /dev/null +++ b/src/check-doc-syntax.awk @@ -0,0 +1,106 @@ +BEGIN { + name_found = 1 + SECTION_DOC = 0 + PUBLIC_DOC = 1 + PRIVATE_DOC = 2 +} + +function log_msg(severity, msg) +{ + printf "%s (%d): %s: %s %s\n", FILENAME, FNR, severity, doc_name, msg +} + +function log_error(msg) +{ + log_msg("ERROR", msg) +} + +function log_warning(msg) +{ + log_msg("WARNING", msg) +} + +/^\/\*\*$/ { + in_doc = 1 + doc_line = 0 +} + +/^(\/\*\*$| \*[ \t]| \*$| \*\*\/$)/ { + valid_doc = 1 +} + +in_doc { + if (!valid_doc) + log_error("bad line: '" $0 "'") + valid_doc = 0 + + doc_line++ + if (doc_line == 2) { + # new doc name. Did we find the previous one? + # (macros are not expected to be found in the same place as + # their documentation) + if (!name_found && doc_name !~ /CAIRO_/) + log_warning("not found") + doc_name = $2 + if (doc_name ~ /^SECTION:.*$/) { + doc_type = SECTION_DOC + name_found = 1 + } else if (tolower(doc_name) ~ /^cairo_[a-z0-9_]*:$/) { + doc_type = PUBLIC_DOC + name_found = 0 + real_name = substr(doc_name, 1, length(doc_name) - 1) + } else if (tolower(doc_name) ~ /^_[a-z0-9_]*:$/) { + doc_type = PRIVATE_DOC + name_found = 0 + real_name = substr(doc_name, 1, length(doc_name) - 1) + } else { + log_error("invalid doc id (should be 'cairo_...:')") + name_found = 1 + } + } +} + +!in_doc { + regex = "(^|[ \\t\\*])" real_name "([ ;()]|$)" + if ($0 ~ regex) + name_found = 1 +} + +/^ \* Since: ([0-9]*.[0-9]*|TBD)$/ { + if (doc_has_since != 0) { + log_error("Duplicate 'Since' field") + } + doc_has_since = doc_line +} + +/^ \*\*\// { + if (doc_type == PUBLIC_DOC) { + if (!doc_has_since) { + # private types can start with cairo_ + if (doc_name ~ /^cairo_.*_t:$/) + log_warning("missing 'Since' field (is it a private type?)") + else + log_error("missing 'Since' field") + } else if (doc_has_since != doc_line - 1) + log_warning("misplaced 'Since' field (should be right before the end of the comment)") + } else { + if (doc_has_since) + log_warning("'Since' field in non-public element") + } + + in_doc = 0 + doc_has_since = 0 + doc_type = 0 +} + +/\*\// { + if (in_doc) { + in_doc = 0 + log_error("documentation comment not closed with **/") + } +} + +END { + if (!name_found) + log_warning("not found") +} diff --git a/src/check-doc-syntax.sh b/src/check-doc-syntax.sh new file mode 100755 index 000000000..762a48429 --- /dev/null +++ b/src/check-doc-syntax.sh @@ -0,0 +1,82 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +if grep --version 2>/dev/null | grep GNU >/dev/null; then + : +else + echo "GNU grep not found; skipping test" + exit 0 +fi + +test -z "$srcdir" && srcdir=. +stat=0 + +echo Checking documentation for incorrect syntax + +cd "$srcdir" + +if test "x$SGML_DOCS" = x; then + FILES=$all_cairo_files + if test "x$FILES" = x; then + FILES=`find . -name 'cairo*.h' -or -name 'cairo*.c' -or -name 'cairo*.cpp'` + fi +fi + +enum_regexp="\([^%@']\|^\)\<\(FALSE\|TRUE\|NULL\|CAIRO_[0-9A-Z_]*\)\($\|[^(A-Za-z0-9_]\)" +if test "x$SGML_DOCS" = x; then + enum_regexp='^[^:]*:[/ ][*]\(\|[ \t].*\)'$enum_regexp\($\|[^:]\) +fi +if echo $FILES | xargs grep . /dev/null | sed -e '//,/<\/programlisting>/d' | grep "$enum_regexp" | grep -v '#####'; then + stat=1 + echo Error: some macros in the docs are not prefixed by percent sign. + echo Fix this by searching for the following regexp in the above files: + echo " '$enum_regexp'" +fi >&2 + +type_regexp="\( .*[^#']\| \|^\)\\($\|[^:]$\|[^:].\)" +if test "x$SGML_DOCS" = x; then + type_regexp='^[^:]*:[/ ][*]'$type_regexp +else + type_regexp='\(.'$type_regexp'\)\|\('$type_regexp'.\)' +fi + +if echo $FILES | xargs grep . /dev/null | sed -e '//,/<\/programlisting>/d' | grep -v "@Title" | grep "$type_regexp" | grep -v '#####'; then + stat=1 + echo Error: some type names in the docs are not prefixed by hash sign, + echo neither are the only token in the doc line followed by colon. + echo Fix this by searching for the following regexp in the above files: + echo " '$type_regexp'" +fi >&2 + +func_regexp="\([^#']\|^\)\<\(cairo_[][<>/0-9a-z_]*\>[^][<>(]\)" +if test "x$SGML_DOCS" = x; then + func_regexp='^[^:]*:[/ ][*]\(\|[ \t].*\)'$func_regexp +fi + +# We need to filter out gtk-doc markup errors for program listings. +if echo $FILES | xargs grep . /dev/null | sed -e '//,/<\/programlisting>/d' | grep "$func_regexp" | grep -v '^[^:]*: [*] [a-z_0-9]*:$' | grep -v '#####'; then + stat=1 + echo Error: some function names in the docs are not followed by parentheses. + echo Fix this by searching for the following regexp in the above files: + echo " '$func_regexp'" +fi >&2 + +note_regexp='\' +if echo $FILES | xargs grep "$note_regexp" /dev/null; then + stat=1 + echo Error: some source files contain the string 'NOTE'. + echo Be civil and replace it by 'Note' please. +fi >&2 + +# Only run the syntax checker on the source files (not doc/) +if test -e ./check-doc-syntax.awk; then + if echo $FILES | xargs awk -f ./check-doc-syntax.awk ; then + : + else + stat=1 + fi >&2 +fi + +exit $stat diff --git a/src/check-has-hidden-symbols.c b/src/check-has-hidden-symbols.c new file mode 100644 index 000000000..120412776 --- /dev/null +++ b/src/check-has-hidden-symbols.c @@ -0,0 +1,3 @@ +#include "cairoint.h" + +CAIRO_HAS_HIDDEN_SYMBOLS diff --git a/src/check-headers.sh b/src/check-headers.sh new file mode 100755 index 000000000..61232954b --- /dev/null +++ b/src/check-headers.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +test -z "$srcdir" && srcdir=. +stat=0 + +echo Checking public headers for missing cairo_public decorators + +cd "$srcdir" +FILES=$all_cairo_headers +if test "x$FILES" = x; then + FILES=`find . -name 'cairo*.h' ! -name '*-private.h' ! -name 'cairoint.h'` +fi + +grep -B 1 '^cairo_.*[ ]\+(' /dev/null $FILES | +awk ' +/^--$/ { context=""; public=0; next; } +/:cairo_.*[ ]+\(/ { if (!public) {print context; print; print "--";} next; } +/-cairo_public.*[ ]/ {public=1;} +{ context=$0; } +' | +sed 's/[.]h-/.h:/' | +grep . >&2 && stat=1 + +exit $stat diff --git a/src/check-link.c b/src/check-link.c new file mode 100644 index 000000000..66ca1b241 --- /dev/null +++ b/src/check-link.c @@ -0,0 +1,24 @@ +#define CAIRO_VERSION_H 1 + +#include + +/* get the "real" version info instead of dummy cairo-version.h */ +#undef CAIRO_VERSION_H +#include "../cairo-version.h" + +#include + +int +main (void) +{ + printf ("Check linking to the just built cairo library\n"); + if (cairo_version () == CAIRO_VERSION) { + return 0; + } else { + fprintf (stderr, + "Error: linked to cairo version %s instead of %s\n", + cairo_version_string (), + CAIRO_VERSION_STRING); + return 1; + } +} diff --git a/src/check-plt.sh b/src/check-plt.sh new file mode 100755 index 000000000..5a9dae126 --- /dev/null +++ b/src/check-plt.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +if which readelf 2>/dev/null >/dev/null; then + : +else + echo "'readelf' not found; skipping test" + exit 0 +fi + +test -z "$srcdir" && srcdir=. +test -z "$MAKE" && MAKE=make +stat=0 + +$MAKE check-has-hidden-symbols.i > /dev/null || exit 1 +if tail -1 check-has-hidden-symbols.i | grep CAIRO_HAS_HIDDEN_SYMBOLS >/dev/null; then + echo "Compiler doesn't support symbol visibility; skipping test" + exit 0 +fi + +for so in .libs/lib*.so; do + echo Checking "$so" for local PLT entries + readelf -W -r "$so" | grep 'JU\?MP_SLO' | grep 'cairo' >&2 && stat=1 +done + +exit $stat diff --git a/src/check-preprocessor-syntax.sh b/src/check-preprocessor-syntax.sh new file mode 100755 index 000000000..b718f604e --- /dev/null +++ b/src/check-preprocessor-syntax.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +test -z "$srcdir" && srcdir=. +cd "$srcdir" +stat=0 + + +HEADERS=$all_cairo_headers +test "x$HEADERS" = x && HEADERS=`find . -name 'cairo*.h' ! -name 'cairo*-private.h' ! -name 'cairo*-inline.h' ! -name 'cairoint.h'` + +PRIVATE=$all_cairo_private +test "x$PRIVATE" = x && PRIVATE=`find . -name 'cairo*-private.h' -or -name 'cairo*-inline.h' -or -name 'cairoint.h'` + +SOURCES=$all_cairo_sources +test "x$SOURCES" = x && SOURCES=`find . -name 'cairo*.c' -or -name 'cairo*.cpp'` + +ALL="/dev/null $HEADERS $PRIVATE $SOURCES" + +echo 'Checking that public header files #include "cairo.h" first (or none)' + +for x in $HEADERS; do + grep '#.*\' "$x" /dev/null | head -n 1 +done | +grep -v '"cairo[.]h"' | +grep -v 'cairo[.]h:' | +grep . >&2 && stat=1 + + +echo 'Checking that private header files #include "some cairo header" first (or none)' + +for x in $PRIVATE; do + grep '#.*\' "$x" /dev/null | head -n 1 +done | +grep -v '"cairo.*[.]h"' | +grep -v 'cairoint[.]h:' | +grep . >&2 && stat=1 + + +echo 'Checking that source files #include "cairoint.h" first (or none)' + +for x in $SOURCES; do + grep '#.*\' "$x" /dev/null | head -n 1 +done | +grep -v '"cairoint[.]h"' | +grep . >&2 && stat=1 + + +echo 'Checking that there is no #include ' +grep '#.*\.*<.*cairo' $ALL >&2 && stat=1 + + +echo 'Checking that feature conditionals are used with #if only (not #ifdef)' +grep '#ifdef CAIRO_HAS_' $ALL && stat=1 +grep '#if.*defined[ ]*(CAIRO_HAS_' $ALL && stat=1 + +exit $stat diff --git a/src/drm/cairo-drm-bo.c b/src/drm/cairo-drm-bo.c new file mode 100644 index 000000000..a5b59f2c9 --- /dev/null +++ b/src/drm/cairo-drm-bo.c @@ -0,0 +1,130 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-ioctl-private.h" + +#include "cairo-error-private.h" + +#include +#include + +#define ERR_DEBUG(x) x + +struct drm_gem_close { + /** Handle of the object to be closed. */ + uint32_t handle; + uint32_t pad; +}; + +struct drm_gem_flink { + /** Handle for the object being named */ + uint32_t handle; + + /** Returned global name */ + uint32_t name; +}; + +struct drm_gem_open { + /** Name of object being opened */ + uint32_t name; + + /** Returned handle for the object */ + uint32_t handle; + + /** Returned size of the object */ + uint64_t size; +}; + +#define DRM_IOCTL_GEM_CLOSE DRM_IOW (0x09, struct drm_gem_close) +#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink) +#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open) + +cairo_status_t +_cairo_drm_bo_open_for_name (const cairo_drm_device_t *dev, + cairo_drm_bo_t *bo, + uint32_t name) +{ + struct drm_gem_open open; + int ret; + + open.name = name; + open.handle = 0; + open.size = 0; + do { + ret = ioctl (dev->fd, DRM_IOCTL_GEM_OPEN, &open); + } while (ret == -1 && errno == EINTR); + if (ret == -1) { + ERR_DEBUG((fprintf (stderr, "Failed to open bo for name %d: %s\n", + name, strerror (errno)))); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + bo->name = name; + bo->size = open.size; + bo->handle = open.handle; + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_drm_bo_flink (const cairo_drm_device_t *dev, + cairo_drm_bo_t *bo) +{ + struct drm_gem_flink flink; + int ret; + + memset (&flink, 0, sizeof (flink)); + flink.handle = bo->handle; + ret = ioctl (dev->fd, DRM_IOCTL_GEM_FLINK, &flink); + if (ret == -1) { + ERR_DEBUG((fprintf (stderr, "Failed to flink bo: %s\n", + strerror (errno)))); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + bo->name = flink.name; + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_drm_bo_close (const cairo_drm_device_t *dev, + cairo_drm_bo_t *bo) +{ + struct drm_gem_close close; + int ret; + + close.handle = bo->handle; + do { + ret = ioctl (dev->fd, DRM_IOCTL_GEM_CLOSE, &close); + } while (ret == -1 && errno == EINTR); +} diff --git a/src/drm/cairo-drm-gallium-surface.c b/src/drm/cairo-drm-gallium-surface.c new file mode 100644 index 000000000..164ab03ce --- /dev/null +++ b/src/drm/cairo-drm-gallium-surface.c @@ -0,0 +1,826 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * Copyright © 2009 Eric Anholt + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" + +#include + +#include +#include +#include +#include +#include + +#include + +typedef struct _gallium_surface gallium_surface_t; +typedef struct _gallium_device gallium_device_t; + +struct _gallium_device { + cairo_drm_device_t drm; + + void *dlhandle; + struct drm_api *api; + + struct pipe_screen *screen; + struct pipe_context *pipe; + + int max_size; +}; + +struct _gallium_surface { + cairo_drm_surface_t drm; + + enum pipe_format pipe_format; + + struct pipe_resource *texture; + struct pipe_transfer *map_transfer; + + cairo_surface_t *fallback; +}; + +static cairo_surface_t * +gallium_surface_create_internal (gallium_device_t *device, + enum pipe_format format, + int width, int height); + +static inline gallium_device_t * +gallium_device (gallium_surface_t *surface) +{ + return (gallium_device_t *) surface->drm.base.device; +} + +static cairo_format_t +_cairo_format_from_pipe_format (enum pipe_format format) +{ + switch ((int) format) { + case PIPE_FORMAT_A8_UNORM: + return CAIRO_FORMAT_A8; + case PIPE_FORMAT_A8R8G8B8_UNORM: + return CAIRO_FORMAT_ARGB32; + default: + return CAIRO_FORMAT_INVALID; + } +} + +static enum pipe_format +pipe_format_from_format (cairo_format_t format) +{ + switch ((int) format) { + case CAIRO_FORMAT_A8: + return PIPE_FORMAT_A8_UNORM; + case CAIRO_FORMAT_ARGB32: + return PIPE_FORMAT_A8R8G8B8_UNORM; + default: + return (enum pipe_format) -1; + } +} + +static enum pipe_format +pipe_format_from_content (cairo_content_t content) +{ + if (content == CAIRO_CONTENT_ALPHA) + return PIPE_FORMAT_A8_UNORM; + else + return PIPE_FORMAT_A8R8G8B8_UNORM; +} + +static cairo_bool_t +format_is_supported_destination (gallium_device_t *device, + enum pipe_format format) +{ + if (format == (enum pipe_format) -1) + return FALSE; + + return device->screen->is_format_supported (device->screen, + format, + 0, + PIPE_BIND_RENDER_TARGET, + 0); +} + +#if 0 +static cairo_bool_t +format_is_supported_source (gallium_device_t *device, + enum pipe_format format) +{ + return device->screen->is_format_supported (device->screen, + format, + 0, + PIPE_BIND_SAMPLER_VIEW, + 0); +} +#endif + +static cairo_surface_t * +gallium_surface_create_similar (void *abstract_src, + cairo_content_t content, + int width, + int height) +{ + gallium_surface_t *other = abstract_src; + gallium_device_t *device = gallium_device (other); + enum pipe_format pipe_format; + cairo_surface_t *surface = NULL; + cairo_status_t status; + + status = cairo_device_acquire (&device->drm.base); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + if (MAX (width, height) > device->max_size) + goto RELEASE; + + if (content == other->drm.base.content) + pipe_format = other->pipe_format; + else + pipe_format = pipe_format_from_content (content); + + if (! format_is_supported_destination (device, pipe_format)) + goto RELEASE; + + surface = gallium_surface_create_internal (device, + pipe_format, + width, height); + +RELEASE: + cairo_device_release (&device->drm.base); + + return surface; +} + +static cairo_status_t +gallium_surface_finish (void *abstract_surface) +{ + gallium_surface_t *surface = abstract_surface; + gallium_device_t *device = gallium_device (surface); + cairo_status_t status; + + status = cairo_device_acquire (&device->drm.base); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + pipe_resource_reference (&surface->texture, NULL); + cairo_device_release (&device->drm.base); + } + + return _cairo_drm_surface_finish (&surface->drm); +} + +static cairo_surface_t * +gallium_surface_map_to_image (gallium_surface_t *surface) +{ + gallium_device_t *device = gallium_device (surface); + cairo_status_t status; + void *ptr = NULL; + + status = cairo_device_acquire (&device->drm.base); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + surface->map_transfer = + pipe_get_transfer (device->pipe, + surface->texture, 0, 0, 0, + PIPE_TRANSFER_MAP_DIRECTLY | + PIPE_TRANSFER_READ_WRITE, + 0, 0, + surface->drm.width, + surface->drm.height); + if (likely (surface->map_transfer != NULL)) + ptr = device->pipe->transfer_map (device->pipe, surface->map_transfer); + + cairo_device_release (&device->drm.base); + + if (unlikely (ptr == NULL)) { + if (surface->map_transfer != NULL) { + device->pipe->transfer_destroy (device->pipe, + surface->map_transfer); + surface->map_transfer = NULL; + } + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + return cairo_image_surface_create_for_data (ptr, + surface->drm.format, + surface->drm.width, + surface->drm.height, + surface->map_transfer->stride); +} + +static cairo_status_t +gallium_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + gallium_surface_t *surface = abstract_surface; + gallium_device_t *device = gallium_device (surface); + cairo_format_t format; + cairo_surface_t *image; + cairo_status_t status; + struct pipe_transfer *transfer; + void *ptr; + + if (surface->fallback != NULL) { + *image_out = (cairo_image_surface_t *) + cairo_surface_reference (surface->fallback); + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; + } + + if (unlikely (surface->drm.width == 0 || surface->drm.height == 0)) { + image = cairo_image_surface_create (surface->drm.format, 0, 0); + if (unlikely (image->status)) + return image->status; + + *image_out = (cairo_image_surface_t *) image; + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; + } + + format = _cairo_format_from_pipe_format (surface->pipe_format); + if (format == CAIRO_FORMAT_INVALID) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = cairo_device_acquire (&device->drm.base); + if (unlikely (status)) + return status; + + transfer = pipe_get_transfer (device->pipe, + surface->texture, 0, 0, 0, + PIPE_TRANSFER_READ, + 0, 0, + surface->drm.width, + surface->drm.height); + ptr = device->pipe->transfer_map (device->pipe, transfer); + cairo_device_release (&device->drm.base); + + image = cairo_image_surface_create_for_data (ptr, format, + surface->drm.width, + surface->drm.height, + surface->drm.stride); + if (unlikely (image->status)) + return image->status; + + *image_out = (cairo_image_surface_t *) image; + *image_extra = transfer; + return CAIRO_STATUS_SUCCESS; +} + +static void +gallium_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); + + if (image_extra != NULL) { + gallium_device_t *device = gallium_device (abstract_surface); + + device->pipe->transfer_unmap (device->pipe, image_extra); + device->pipe->transfer_destroy (device->pipe, image_extra); + } +} + +static cairo_status_t +gallium_surface_flush (void *abstract_surface, + unsigned flags) +{ + gallium_surface_t *surface = abstract_surface; + gallium_device_t *device = gallium_device (surface); + cairo_status_t status; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (surface->fallback == NULL) { + device->pipe->flush (device->pipe, + PIPE_FLUSH_RENDER_CACHE, + NULL); + return CAIRO_STATUS_SUCCESS; + } + + /* kill any outstanding maps */ + cairo_surface_finish (surface->fallback); + + status = cairo_device_acquire (&device->drm.base); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + device->pipe->transfer_unmap (device->pipe, + surface->map_transfer); + device->pipe->transfer_destroy (device->pipe, + surface->map_transfer); + surface->map_transfer = NULL; + cairo_device_release (&device->drm.base); + } + + status = cairo_surface_status (surface->fallback); + cairo_surface_destroy (surface->fallback); + surface->fallback = NULL; + + return status; +} + +static cairo_int_status_t +gallium_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_clip_t *clip) +{ + gallium_surface_t *surface = abstract_surface; + + if (surface->fallback == NULL) { + /* XXX insert magic */ + surface->fallback = gallium_surface_map_to_image (surface); + } + + return _cairo_surface_paint (surface->fallback, op, source, clip); +} + +static cairo_int_status_t +gallium_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + cairo_clip_t *clip) +{ + gallium_surface_t *surface = abstract_surface; + + if (surface->fallback == NULL) { + /* XXX insert magic */ + surface->fallback = gallium_surface_map_to_image (surface); + } + + return _cairo_surface_mask (surface->fallback, + op, source, mask, + clip); +} + +static cairo_int_status_t +gallium_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + gallium_surface_t *surface = abstract_surface; + + if (surface->fallback == NULL) { + /* XXX insert magic */ + surface->fallback = gallium_surface_map_to_image (surface); + } + + return _cairo_surface_stroke (surface->fallback, + op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +gallium_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + gallium_surface_t *surface = abstract_surface; + + if (surface->fallback == NULL) { + /* XXX insert magic */ + surface->fallback = gallium_surface_map_to_image (surface); + } + + return _cairo_surface_fill (surface->fallback, + op, source, + path, fill_rule, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +gallium_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining) +{ + gallium_surface_t *surface = abstract_surface; + + *num_remaining = 0; + + if (surface->fallback == NULL) { + /* XXX insert magic */ + surface->fallback = gallium_surface_map_to_image (surface); + } + + return _cairo_surface_show_text_glyphs (surface->fallback, + op, source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, + clip); +} + +static const cairo_surface_backend_t gallium_surface_backend = { + CAIRO_SURFACE_TYPE_DRM, + _cairo_default_context_create, + + gallium_surface_create_similar, + gallium_surface_finish, + + NULL, + gallium_surface_acquire_source_image, + gallium_surface_release_source_image, + + NULL, //gallium_surface_acquire_dest_image, + NULL, //gallium_surface_release_dest_image, + NULL, //gallium_surface_clone_similar, + NULL, //gallium_surface_composite, + NULL, //gallium_surface_fill_rectangles, + NULL, //gallium_surface_composite_trapezoids, + NULL, //gallium_surface_create_span_renderer, + NULL, //gallium_surface_check_span_renderer, + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_drm_surface_get_extents, + NULL, /* old_show_glyphs */ + _cairo_drm_surface_get_font_options, + gallium_surface_flush, + NULL, /* mark_dirty_rectangle */ + NULL, //gallium_surface_scaled_font_fini, + NULL, //gallium_surface_scaled_glyph_fini, + + gallium_surface_paint, + gallium_surface_mask, + gallium_surface_stroke, + gallium_surface_fill, + gallium_surface_glyphs, + + NULL, /* snapshot */ + + NULL, /* is_similar */ + + NULL, /* reset */ +}; + +static int +gallium_format_stride_for_width (enum pipe_format format, int width) +{ + int stride; + + stride = 1024; /* XXX fugly */ + while (stride < width) + stride *= 2; + + if (format == PIPE_FORMAT_A8R8G8B8_UNORM) + stride *= 4; + + return stride; +} + +static cairo_drm_bo_t * +_gallium_fake_bo_create (uint32_t size, uint32_t name) +{ + cairo_drm_bo_t *bo; + + /* XXX integrate with winsys handle */ + + bo = malloc (sizeof (cairo_drm_bo_t)); + + CAIRO_REFERENCE_COUNT_INIT (&bo->ref_count, 1); + bo->name = name; + bo->handle = 0; + bo->size = size; + + return bo; +} + +static void +_gallium_fake_bo_release (void *dev, void *bo) +{ + free (bo); +} + +static cairo_surface_t * +gallium_surface_create_internal (gallium_device_t *device, + enum pipe_format pipe_format, + int width, int height) +{ + gallium_surface_t *surface; + struct pipe_resource template; + cairo_status_t status; + cairo_format_t format; + int stride, size; + + surface = malloc (sizeof (gallium_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + format = _cairo_format_from_pipe_format (pipe_format); + _cairo_surface_init (&surface->drm.base, + &gallium_surface_backend, + &device->drm.base, + _cairo_content_from_format (format)); + _cairo_drm_surface_init (&surface->drm, format, width, height); + + stride = gallium_format_stride_for_width (pipe_format, width); + size = stride * height; + + surface->drm.stride = stride; + surface->drm.bo = _gallium_fake_bo_create (size, 0); + + memset(&template, 0, sizeof(template)); + template.target = PIPE_TEXTURE_2D; + template.format = pipe_format; + template.width0 = width; + template.height0 = height; + template.depth0 = 1; + template.last_level = 0; + template.bind = PIPE_BIND_RENDER_TARGET; + surface->texture = device->screen->resource_create (device->screen, + &template); + + if (unlikely (surface->texture == NULL)) { + status = _cairo_drm_surface_finish (&surface->drm); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + surface->pipe_format = pipe_format; + surface->texture = NULL; + + return &surface->drm.base; +} + +static cairo_surface_t * +gallium_surface_create (cairo_drm_device_t *base_dev, + cairo_format_t format, + int width, int height) +{ + gallium_device_t *device = (gallium_device_t *) base_dev; + cairo_surface_t *surface; + enum pipe_format pipe_format; + cairo_status_t status; + + status = cairo_device_acquire (&device->drm.base); + + if (MAX (width, height) > device->max_size) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + goto RELEASE; + } + + pipe_format = pipe_format_from_format (format); + if (! format_is_supported_destination (device, pipe_format)) { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + goto RELEASE; + } + + surface = gallium_surface_create_internal (device, + pipe_format, + width, height); + +RELEASE: + cairo_device_release (&device->drm.base); + + return surface; +} + +#if 0 +static cairo_surface_t * +gallium_surface_create_for_name (cairo_drm_device_t *base_dev, + unsigned int name, + cairo_format_t format, + int width, int height, int stride) +{ + gallium_device_t *device; + gallium_surface_t *surface; + cairo_status_t status; + cairo_content_t content; + + surface = malloc (sizeof (gallium_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + case CAIRO_FORMAT_A8: + surface->pipe_format = PIPE_FORMAT_A8_UNORM; + break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_ARGB32: + surface->pipe_format = PIPE_FORMAT_A8R8G8B8_UNORM; + break; + } + + status = cairo_device_acquire (&device->drm.base); + + if (MAX (width, height) > device->max_size) { + cairo_device_release (&device->drm.base); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + if (! format_is_supported_destination (device, surface->pipe_format)) { + cairo_device_release (&device->drm.base); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + content = _cairo_content_from_format (format); + _cairo_surface_init (&surface->drm.base, + &gallium_surface_backend, + content); + _cairo_drm_surface_init (&surface->drm, base_dev); + + surface->drm.bo = _gallium_fake_bo_create (height * stride, name); + + surface->drm.width = width; + surface->drm.height = height; + surface->drm.stride = stride; + +#if 0 + /* XXX screen->create_from_handle */ + surface->buffer = device->api->buffer_from_handle (device->api, + device->screen, + "cairo-gallium alien", + name); + if (unlikely (surface->buffer == NULL)) { + status = _cairo_drm_surface_finish (&surface->drm); + cairo_device_release (&device->drm.base); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } +#endif + + surface->texture = NULL; + + surface->fallback = NULL; + + cairo_device_release (&device->drm.base); + + return &surface->drm.base; +} + +static cairo_int_status_t +gallium_surface_flink (void *abstract_surface) +{ + gallium_surface_t *surface = abstract_surface; + gallium_device_t *device; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + status = cairo_device_acquire (&device->drm.base); + if (! device->api->global_handle_from_buffer (device->api, + device->screen, + surface->buffer, + &surface->drm.bo->name)) + { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + cairo_device_release (&device->drm.base); + + return status; +} +#endif + +static void +gallium_device_destroy (void *abstract_device) +{ + gallium_device_t *device = abstract_device; + + device->pipe->destroy (device->pipe); + device->screen->destroy (device->screen); + device->api->destroy (device->api); + + dlclose (device->dlhandle); + free (device); +} + +cairo_drm_device_t * +_cairo_drm_gallium_device_create (int fd, dev_t dev, int vendor_id, int chip_id) +{ + gallium_device_t *device; + cairo_status_t status; + void *handle; + const char *libdir; + char buf[4096]; + struct drm_api *(*ctor) (void); + + /* XXX need search path + probe */ + libdir = getenv ("CAIRO_GALLIUM_LIBDIR"); + if (libdir == NULL) + libdir = "/usr/lib/dri"; + buf[snprintf (buf, sizeof (buf)-1, "%s/i915_dri.so", libdir)] = '\0'; + + handle = dlopen (buf, RTLD_LAZY); + if (handle == NULL) + return NULL; + + ctor = dlsym (handle, "drm_api_create"); + if (ctor == NULL) { + dlclose (handle); + return NULL; + } + + device = malloc (sizeof (gallium_device_t)); + if (device == NULL) { + dlclose (handle); + return _cairo_drm_device_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + device->dlhandle = handle; + + device->drm.surface.create = gallium_surface_create; + device->drm.surface.create_for_name = NULL; + //device->drm.surface.create_for_name = gallium_surface_create_for_name; + device->drm.surface.enable_scan_out = NULL; + //device->drm.surface.flink = gallium_surface_flink; + device->drm.surface.flink = NULL; + + device->drm.device.flush = NULL; + device->drm.device.throttle = NULL; + device->drm.device.destroy = gallium_device_destroy; + + device->drm.bo.release = _gallium_fake_bo_release; + + device->api = ctor (); + if (device->api == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP; + } + + device->screen = device->api->create_screen (device->api, fd, NULL); + if (device->screen == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_API; + } + + device->max_size = 1 << device->screen->get_param (device->screen, + PIPE_CAP_MAX_TEXTURE_2D_LEVELS); + + device->pipe = device->screen->context_create (device->screen, device); + if (device->pipe == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_SCREEN; + } + + return _cairo_drm_device_init (&device->drm, + fd, dev, + 0, 0, + device->max_size); + +CLEANUP_SCREEN: + device->screen->destroy (device->screen); +CLEANUP_API: + device->api->destroy (device->api); +CLEANUP: + free (device); + dlclose (handle); + return _cairo_drm_device_create_in_error (status); +} diff --git a/src/drm/cairo-drm-i915-glyphs.c b/src/drm/cairo-drm-i915-glyphs.c new file mode 100644 index 000000000..9944f15a4 --- /dev/null +++ b/src/drm/cairo-drm-i915-glyphs.c @@ -0,0 +1,563 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-drm-i915-private.h" +#include "cairo-error-private.h" +#include "cairo-rtree-private.h" + +static void +i915_emit_glyph_rectangle_zero (i915_device_t *device, + i915_shader_t *shader, + int x1, int y1, + int x2, int y2, + intel_glyph_t *glyph) +{ + float *v; + + /* Each vertex is: + * 2 vertex coordinates + */ + + v = i915_add_rectangle (device); + *v++ = x2; *v++ = y2; + *v++ = x1; *v++ = y2; + *v++ = x1; *v++ = y1; +} + +static void +i915_emit_glyph_rectangle_constant (i915_device_t *device, + i915_shader_t *shader, + int x1, int y1, + int x2, int y2, + intel_glyph_t *glyph) +{ + float *v; + + /* Each vertex is: + * 2 vertex coordinates + * 2 glyph texture coordinates + */ + + v = i915_add_rectangle (device); + + /* bottom right */ + *v++ = x2; *v++ = y2; + *v++ = glyph->texcoord[0]; + + /* bottom left */ + *v++ = x1; *v++ = y2; + *v++ = glyph->texcoord[1]; + + /* top left */ + *v++ = x1; *v++ = y1; + *v++ = glyph->texcoord[2]; +} + +static void +i915_emit_glyph_rectangle_general (i915_device_t *device, + i915_shader_t *shader, + int x1, int y1, + int x2, int y2, + intel_glyph_t *glyph) +{ + double s, t; + float *v; + + /* Each vertex is: + * 2 vertex coordinates + * [0-2] source texture coordinates + * 2 glyph texture coordinates + */ + + v = i915_add_rectangle (device); + + /* bottom right */ + *v++ = x2; *v++ = y2; + s = x2, t = y2; + switch (shader->source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *v++ = i915_shader_linear_texcoord (&shader->source.linear, s, t); + break; + case VS_TEXTURE: + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = s; *v++ = t; + break; + case VS_TEXTURE_16: + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = texcoord_2d_16 (s, t); + break; + } + *v++ = glyph->texcoord[0]; + + /* bottom left */ + *v++ = x1; *v++ = y2; + s = x1, t = y2; + switch (shader->source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *v++ = i915_shader_linear_texcoord (&shader->source.linear, s, t); + break; + case VS_TEXTURE: + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = s; *v++ = t; + break; + case VS_TEXTURE_16: + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = texcoord_2d_16 (s, t); + break; + } + *v++ = glyph->texcoord[1]; + + /* top left */ + *v++ = x1; *v++ = y1; + s = x1, t = y2; + switch (shader->source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *v++ = i915_shader_linear_texcoord (&shader->source.linear, s, t); + break; + case VS_TEXTURE: + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = s; *v++ = t; + break; + case VS_TEXTURE_16: + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = texcoord_2d_16 (s, t); + break; + } + *v++ = glyph->texcoord[2]; +} + +typedef void +(*i915_emit_glyph_rectangle_func_t) (i915_device_t *device, + i915_shader_t *shader, + int x1, int y1, + int x2, int y2, + intel_glyph_t *glyph); + +static cairo_status_t +i915_surface_mask_internal (i915_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + i915_surface_t *mask, + cairo_clip_t *clip, + const cairo_composite_rectangles_t *extents) +{ + i915_device_t *device; + i915_shader_t shader; + cairo_region_t *clip_region = NULL; + cairo_status_t status; + + i915_shader_init (&shader, dst, op, 1.); + + status = i915_shader_acquire_pattern (&shader, &shader.source, + source, &extents->bounded); + if (unlikely (status)) + return status; + + shader.mask.type.vertex = VS_TEXTURE_16; + shader.mask.type.pattern = PATTERN_TEXTURE; + shader.mask.type.fragment = FS_TEXTURE; + shader.mask.base.content = mask->intel.drm.base.content; + shader.mask.base.texfmt = TEXCOORDFMT_2D_16; + shader.mask.base.n_samplers = 1; + shader.mask.base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (CAIRO_FILTER_NEAREST); + shader.mask.base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (CAIRO_EXTEND_NONE); + + cairo_matrix_init_translate (&shader.mask.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + cairo_matrix_scale (&shader.mask.base.matrix, + 1. / mask->intel.drm.width, + 1. / mask->intel.drm.height); + + shader.mask.base.bo = intel_bo_reference (to_intel_bo (mask->intel.drm.bo)); + shader.mask.base.offset[0] = 0; + shader.mask.base.map[0] = mask->map0; + shader.mask.base.map[1] = mask->map1; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + + if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1) + clip_region = NULL; + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i915_shader_set_clip (&shader, clip); + } + + status = cairo_device_acquire (dst->intel.drm.base.device); + if (unlikely (status)) + goto CLEANUP_SHADER; + + device = i915_device (dst); + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto CLEANUP_DEVICE; + + if (clip_region != NULL) { + unsigned int n, num_rectangles; + + num_rectangles = cairo_region_num_rectangles (clip_region); + for (n = 0; n < num_rectangles; n++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, n, &rect); + + shader.add_rectangle (&shader, + rect.x, rect.y, + rect.x + rect.width, rect.y + rect.height); + } + } else { + shader.add_rectangle (&shader, + extents->bounded.x, extents->bounded.y, + extents->bounded.x + extents->bounded.width, + extents->bounded.y + extents->bounded.height); + } + + if (! extents->is_bounded) + status = i915_fixup_unbounded (dst, extents, clip); + +CLEANUP_DEVICE: + cairo_device_release (&device->intel.base.base); +CLEANUP_SHADER: + i915_shader_fini (&shader); + return status; +} + +cairo_int_status_t +i915_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining) +{ + i915_surface_t *surface = abstract_surface; + i915_surface_t *mask = NULL; + i915_device_t *device; + i915_shader_t shader; + cairo_composite_rectangles_t extents; + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + cairo_bool_t overlap; + cairo_region_t *clip_region = NULL; + intel_bo_t *last_bo = NULL; + i915_emit_glyph_rectangle_func_t emit_func; + cairo_scaled_glyph_t *glyph_cache[64]; + cairo_status_t status; + int mask_x = 0, mask_y = 0; + int i = 0; + + *num_remaining = 0; + status = _cairo_composite_rectangles_init_for_glyphs (&extents, + surface->intel.drm.width, + surface->intel.drm.height, + op, source, + scaled_font, + glyphs, num_glyphs, + clip, + &overlap); + if (unlikely (status)) + return status; + + if (_cairo_clip_contains_rectangle (clip, &extents.mask)) + clip = NULL; + + if (clip != NULL && extents.is_bounded) { + clip = _cairo_clip_init_copy (&local_clip, clip); + status = _cairo_clip_rectangle (clip, &extents.bounded); + if (unlikely (status)) + return status; + + have_clip = TRUE; + } + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + if (unlikely (_cairo_status_is_error (status) || + status == CAIRO_INT_STATUS_NOTHING_TO_DO)) + { + if (have_clip) + _cairo_clip_fini (&local_clip); + return status; + } + } + + if (i915_surface_needs_tiling (surface)) { + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (overlap || ! extents.is_bounded) { + cairo_format_t format; + + format = CAIRO_FORMAT_A8; + if (scaled_font->options.antialias == CAIRO_ANTIALIAS_SUBPIXEL) + format = CAIRO_FORMAT_ARGB32; + + mask = (i915_surface_t *) + i915_surface_create_internal (&i915_device (surface)->intel.base, + format, + extents.bounded.width, + extents.bounded.height, + I915_TILING_DEFAULT, + TRUE); + if (unlikely (mask->intel.drm.base.status)) + return mask->intel.drm.base.status; + + status = i915_surface_clear (mask); + if (unlikely (status)) { + cairo_surface_destroy (&mask->intel.drm.base); + return status; + } + + i915_shader_init (&shader, mask, CAIRO_OPERATOR_ADD, 1.); + + status = i915_shader_acquire_pattern (&shader, &shader.source, + &_cairo_pattern_white.base, + &extents.bounded); + if (unlikely (status)) { + cairo_surface_destroy (&mask->intel.drm.base); + return status; + } + + mask_x = -extents.bounded.x; + mask_y = -extents.bounded.y; + } else { + i915_shader_init (&shader, surface, op, 1.); + + status = i915_shader_acquire_pattern (&shader, &shader.source, + source, &extents.bounded); + if (unlikely (status)) + return status; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + + if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1) + clip_region = NULL; + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i915_shader_set_clip (&shader, clip); + } + } + + shader.mask.type.fragment = FS_TEXTURE; + shader.mask.base.content = CAIRO_CONTENT_ALPHA; /* XXX */ + shader.mask.base.texfmt = TEXCOORDFMT_2D_16; + shader.mask.base.n_samplers = 1; + shader.mask.base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (CAIRO_FILTER_NEAREST); + shader.mask.base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (CAIRO_EXTEND_NONE); + + switch (shader.source.type.vertex) { + case VS_ZERO: + emit_func = i915_emit_glyph_rectangle_zero; + break; + case VS_CONSTANT: + emit_func = i915_emit_glyph_rectangle_constant; + break; + default: + case VS_LINEAR: + case VS_TEXTURE: + case VS_TEXTURE_16: + emit_func = i915_emit_glyph_rectangle_general; + break; + } + + status = cairo_device_acquire (surface->intel.drm.base.device); + if (unlikely (status)) + goto CLEANUP_SHADER; + + device = i915_device (surface); + + _cairo_scaled_font_freeze_cache (scaled_font); + if (scaled_font->surface_private == NULL) { + scaled_font->surface_private = device; + scaled_font->surface_backend = surface->intel.drm.base.backend; + cairo_list_add (&scaled_font->link, &device->intel.fonts); + } + + memset (glyph_cache, 0, sizeof (glyph_cache)); + + for (i = 0; i < num_glyphs; i++) { + cairo_scaled_glyph_t *scaled_glyph; + int x, y, x1, x2, y1, y2; + int cache_index = glyphs[i].index % ARRAY_LENGTH (glyph_cache); + intel_glyph_t *glyph; + + scaled_glyph = glyph_cache[cache_index]; + if (scaled_glyph == NULL || + _cairo_scaled_glyph_index (scaled_glyph) != glyphs[i].index) + { + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) + goto FINISH; + + glyph_cache[cache_index] = scaled_glyph; + } + + if (unlikely (scaled_glyph->metrics.width == 0 || + scaled_glyph->metrics.height == 0)) + { + continue; + } + + /* XXX glyph images are snapped to pixel locations */ + x = _cairo_lround (glyphs[i].x); + y = _cairo_lround (glyphs[i].y); + + x1 = x + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x); + y1 = y + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); + x2 = x + _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.x); + y2 = y + _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y); + + if (x2 < extents.bounded.x || + y2 < extents.bounded.y || + x1 > extents.bounded.x + extents.bounded.width || + y1 > extents.bounded.y + extents.bounded.height) + { + continue; + } + + if (scaled_glyph->surface_private == NULL) { + status = intel_get_glyph (&device->intel, scaled_font, scaled_glyph); + if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO)) { + status = CAIRO_STATUS_SUCCESS; + continue; + } + if (unlikely (status)) + goto FINISH; + } + + glyph = intel_glyph_pin (scaled_glyph->surface_private); + if (glyph->cache->buffer.bo != last_bo) { + intel_buffer_cache_t *cache = glyph->cache; + + shader.mask.base.bo = cache->buffer.bo; + shader.mask.base.offset[0] = cache->buffer.offset; + shader.mask.base.map[0] = cache->buffer.map0; + shader.mask.base.map[1] = cache->buffer.map1; + shader.mask.base.content = CAIRO_CONTENT_ALPHA; /* XXX */ + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto FINISH; + + last_bo = cache->buffer.bo; + } + + x2 = x1 + glyph->width; + y2 = y1 + glyph->height; + + if (mask_x) + x1 += mask_x, x2 += mask_x; + if (mask_y) + y1 += mask_y, y2 += mask_y; + + /* XXX clip glyph */ + emit_func (device, &shader, x1, y1, x2, y2, glyph); + } + + status = CAIRO_STATUS_SUCCESS; + FINISH: + _cairo_scaled_font_thaw_cache (scaled_font); + cairo_device_release (surface->intel.drm.base.device); + CLEANUP_SHADER: + i915_shader_fini (&shader); + + if (unlikely (status == CAIRO_INT_STATUS_UNSUPPORTED)) { + cairo_path_fixed_t path; + + _cairo_path_fixed_init (&path); + status = _cairo_scaled_font_glyph_path (scaled_font, + glyphs + i, num_glyphs - i, + &path); + if (mask_x | mask_y) { + _cairo_path_fixed_translate (&path, + _cairo_fixed_from_int (mask_x), + _cairo_fixed_from_int (mask_y)); + } + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = surface->intel.drm.base.backend->fill (shader.target, + shader.op, + mask != NULL ? &_cairo_pattern_white.base : source, + &path, + CAIRO_FILL_RULE_WINDING, + 0, + scaled_font->options.antialias, + clip); + } + _cairo_path_fixed_fini (&path); + } + + if (mask != NULL) { + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = i915_surface_mask_internal (surface, op, source, mask, + clip, &extents); + } + cairo_surface_finish (&mask->intel.drm.base); + cairo_surface_destroy (&mask->intel.drm.base); + } + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} diff --git a/src/drm/cairo-drm-i915-private.h b/src/drm/cairo-drm-i915-private.h new file mode 100644 index 000000000..c750cf4cf --- /dev/null +++ b/src/drm/cairo-drm-i915-private.h @@ -0,0 +1,1270 @@ +/* + * Copyright © 2006, 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Eric Anholt + * Chris Wilson + */ + +#ifndef CAIRO_DRM_I915_PRIVATE_H +#define CAIRO_DRM_I915_PRIVATE_H + +#include "cairo-types-private.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-intel-private.h" +#include "cairo-drm-intel-command-private.h" +#include "cairo-drm-intel-ioctl-private.h" +#include "cairo-freelist-private.h" + +#include + +#define I915_VERBOSE 1 + +#define I915_MAX_TEX_INDIRECT 4 +#define I915_MAX_TEX_INSN 32 +#define I915_MAX_ALU_INSN 64 +#define I915_MAX_DECL_INSN 27 +#define I915_MAX_TEMPORARY 16 + +/* Each instruction is 3 dwords long, though most don't require all + * this space. Maximum of 123 instructions. Smaller maxes per insn + * type. + */ +#define _3DSTATE_PIXEL_SHADER_PROGRAM (CMD_3D|(0x1d<<24)|(0x5<<16)) + +#define REG_TYPE_R 0 /* temporary regs, no need to + * dcl, must be written before + * read -- Preserved between + * phases. + */ +#define REG_TYPE_T 1 /* Interpolated values, must be + * dcl'ed before use. + * + * 0..7: texture coord, + * 8: diffuse spec, + * 9: specular color, + * 10: fog parameter in w. + */ +#define REG_TYPE_CONST 2 /* Restriction: only one const + * can be referenced per + * instruction, though it may be + * selected for multiple inputs. + * Constants not initialized + * default to zero. + */ +#define REG_TYPE_S 3 /* sampler */ +#define REG_TYPE_OC 4 /* output color (rgba) */ +#define REG_TYPE_OD 5 /* output depth (w), xyz are + * temporaries. If not written, + * interpolated depth is used? + */ +#define REG_TYPE_U 6 /* unpreserved temporaries */ +#define REG_TYPE_MASK 0x7 +#define REG_TYPE_SHIFT 4 +#define REG_NR_MASK 0xf + +/* REG_TYPE_T: + */ +#define T_TEX0 0 +#define T_TEX1 1 +#define T_TEX2 2 +#define T_TEX3 3 +#define T_TEX4 4 +#define T_TEX5 5 +#define T_TEX6 6 +#define T_TEX7 7 +#define T_DIFFUSE 8 +#define T_SPECULAR 9 +#define T_FOG_W 10 /* interpolated fog is in W coord */ + +/* Arithmetic instructions */ + +/* .replicate_swizzle == selection and replication of a particular + * scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww + */ +#define A0_NOP (0x0<<24) /* no operation */ +#define A0_ADD (0x1<<24) /* dst = src0 + src1 */ +#define A0_MOV (0x2<<24) /* dst = src0 */ +#define A0_MUL (0x3<<24) /* dst = src0 * src1 */ +#define A0_MAD (0x4<<24) /* dst = src0 * src1 + src2 */ +#define A0_DP2ADD (0x5<<24) /* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */ +#define A0_DP3 (0x6<<24) /* dst.xyzw = src0.xyz dot src1.xyz */ +#define A0_DP4 (0x7<<24) /* dst.xyzw = src0.xyzw dot src1.xyzw */ +#define A0_FRC (0x8<<24) /* dst = src0 - floor(src0) */ +#define A0_RCP (0x9<<24) /* dst.xyzw = 1/(src0.replicate_swizzle) */ +#define A0_RSQ (0xa<<24) /* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */ +#define A0_EXP (0xb<<24) /* dst.xyzw = exp2(src0.replicate_swizzle) */ +#define A0_LOG (0xc<<24) /* dst.xyzw = log2(abs(src0.replicate_swizzle)) */ +#define A0_CMP (0xd<<24) /* dst = (src0 >= 0.0) ? src1 : src2 */ +#define A0_MIN (0xe<<24) /* dst = (src0 < src1) ? src0 : src1 */ +#define A0_MAX (0xf<<24) /* dst = (src0 >= src1) ? src0 : src1 */ +#define A0_FLR (0x10<<24) /* dst = floor(src0) */ +#define A0_MOD (0x11<<24) /* dst = src0 fmod 1.0 */ +#define A0_TRC (0x12<<24) /* dst = int(src0) */ +#define A0_SGE (0x13<<24) /* dst = src0 >= src1 ? 1.0 : 0.0 */ +#define A0_SLT (0x14<<24) /* dst = src0 < src1 ? 1.0 : 0.0 */ +#define A0_DEST_SATURATE (1<<22) +#define A0_DEST_TYPE_SHIFT 19 +/* Allow: R, OC, OD, U */ +#define A0_DEST_NR_SHIFT 14 +/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */ +#define A0_DEST_CHANNEL_X (1<<10) +#define A0_DEST_CHANNEL_Y (2<<10) +#define A0_DEST_CHANNEL_Z (4<<10) +#define A0_DEST_CHANNEL_W (8<<10) +#define A0_DEST_CHANNEL_ALL (0xf<<10) +#define A0_DEST_CHANNEL_SHIFT 10 +#define A0_SRC0_TYPE_SHIFT 7 +#define A0_SRC0_NR_SHIFT 2 + +#define A0_DEST_CHANNEL_XY (A0_DEST_CHANNEL_X|A0_DEST_CHANNEL_Y) +#define A0_DEST_CHANNEL_XYZ (A0_DEST_CHANNEL_XY|A0_DEST_CHANNEL_Z) + +#define SRC_X 0 +#define SRC_Y 1 +#define SRC_Z 2 +#define SRC_W 3 +#define SRC_ZERO 4 +#define SRC_ONE 5 + +#define A1_SRC0_CHANNEL_X_NEGATE (1<<31) +#define A1_SRC0_CHANNEL_X_SHIFT 28 +#define A1_SRC0_CHANNEL_Y_NEGATE (1<<27) +#define A1_SRC0_CHANNEL_Y_SHIFT 24 +#define A1_SRC0_CHANNEL_Z_NEGATE (1<<23) +#define A1_SRC0_CHANNEL_Z_SHIFT 20 +#define A1_SRC0_CHANNEL_W_NEGATE (1<<19) +#define A1_SRC0_CHANNEL_W_SHIFT 16 +#define A1_SRC1_TYPE_SHIFT 13 +#define A1_SRC1_NR_SHIFT 8 +#define A1_SRC1_CHANNEL_X_NEGATE (1<<7) +#define A1_SRC1_CHANNEL_X_SHIFT 4 +#define A1_SRC1_CHANNEL_Y_NEGATE (1<<3) +#define A1_SRC1_CHANNEL_Y_SHIFT 0 + +#define A2_SRC1_CHANNEL_Z_NEGATE (1<<31) +#define A2_SRC1_CHANNEL_Z_SHIFT 28 +#define A2_SRC1_CHANNEL_W_NEGATE (1<<27) +#define A2_SRC1_CHANNEL_W_SHIFT 24 +#define A2_SRC2_TYPE_SHIFT 21 +#define A2_SRC2_NR_SHIFT 16 +#define A2_SRC2_CHANNEL_X_NEGATE (1<<15) +#define A2_SRC2_CHANNEL_X_SHIFT 12 +#define A2_SRC2_CHANNEL_Y_NEGATE (1<<11) +#define A2_SRC2_CHANNEL_Y_SHIFT 8 +#define A2_SRC2_CHANNEL_Z_NEGATE (1<<7) +#define A2_SRC2_CHANNEL_Z_SHIFT 4 +#define A2_SRC2_CHANNEL_W_NEGATE (1<<3) +#define A2_SRC2_CHANNEL_W_SHIFT 0 + +/* Texture instructions */ +#define T0_TEXLD (0x15<<24) /* Sample texture using predeclared + * sampler and address, and output + * filtered texel data to destination + * register */ +#define T0_TEXLDP (0x16<<24) /* Same as texld but performs a + * perspective divide of the texture + * coordinate .xyz values by .w before + * sampling. */ +#define T0_TEXLDB (0x17<<24) /* Same as texld but biases the + * computed LOD by w. Only S4.6 two's + * comp is used. This implies that a + * float to fixed conversion is + * done. */ +#define T0_TEXKILL (0x18<<24) /* Does not perform a sampling + * operation. Simply kills the pixel + * if any channel of the address + * register is < 0.0. */ +#define T0_DEST_TYPE_SHIFT 19 +/* Allow: R, OC, OD, U */ +/* Note: U (unpreserved) regs do not retain their values between + * phases (cannot be used for feedback) + * + * Note: oC and OD registers can only be used as the destination of a + * texture instruction once per phase (this is an implementation + * restriction). + */ +#define T0_DEST_NR_SHIFT 14 +/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */ +#define T0_SAMPLER_NR_SHIFT 0 /* This field ignored for TEXKILL */ +#define T0_SAMPLER_NR_MASK (0xf<<0) + +#define T1_ADDRESS_REG_TYPE_SHIFT 24 /* Reg to use as texture coord */ +/* Allow R, T, OC, OD -- R, OC, OD are 'dependent' reads, new program phase */ +#define T1_ADDRESS_REG_NR_SHIFT 17 +#define T2_MBZ 0 + +/* Declaration instructions */ +#define D0_DCL (0x19<<24) /* Declare a t (interpolated attrib) + * register or an s (sampler) + * register. */ +#define D0_SAMPLE_TYPE_SHIFT 22 +#define D0_SAMPLE_TYPE_2D (0x0<<22) +#define D0_SAMPLE_TYPE_CUBE (0x1<<22) +#define D0_SAMPLE_TYPE_VOLUME (0x2<<22) +#define D0_SAMPLE_TYPE_MASK (0x3<<22) + +#define D0_TYPE_SHIFT 19 +/* Allow: T, S */ +#define D0_NR_SHIFT 14 +/* Allow T: 0..10, S: 0..15 */ +#define D0_CHANNEL_X (1<<10) +#define D0_CHANNEL_Y (2<<10) +#define D0_CHANNEL_Z (4<<10) +#define D0_CHANNEL_W (8<<10) +#define D0_CHANNEL_ALL (0xf<<10) +#define D0_CHANNEL_NONE (0<<10) + +#define D0_CHANNEL_XY (D0_CHANNEL_X|D0_CHANNEL_Y) +#define D0_CHANNEL_XYZ (D0_CHANNEL_XY|D0_CHANNEL_Z) + +/* I915 Errata: Do not allow (xz), (xw), (xzw) combinations for diffuse + * or specular declarations. + * + * For T dcls, only allow: (x), (xy), (xyz), (w), (xyzw) + * + * Must be zero for S (sampler) dcls + */ +#define D1_MBZ 0 +#define D2_MBZ 0 + + +/* MASK_* are the unshifted bitmasks of the destination mask in arithmetic + * operations + */ +#define MASK_X 0x1 +#define MASK_Y 0x2 +#define MASK_Z 0x4 +#define MASK_W 0x8 +#define MASK_XYZ (MASK_X | MASK_Y | MASK_Z) +#define MASK_XYZW (MASK_XYZ | MASK_W) +#define MASK_SATURATE 0x10 + +/* Temporary, undeclared regs. Preserved between phases */ +#define FS_R0 ((REG_TYPE_R << REG_TYPE_SHIFT) | 0) +#define FS_R1 ((REG_TYPE_R << REG_TYPE_SHIFT) | 1) +#define FS_R2 ((REG_TYPE_R << REG_TYPE_SHIFT) | 2) +#define FS_R3 ((REG_TYPE_R << REG_TYPE_SHIFT) | 3) + +/* Texture coordinate regs. Must be declared. */ +#define FS_T0 ((REG_TYPE_T << REG_TYPE_SHIFT) | 0) +#define FS_T1 ((REG_TYPE_T << REG_TYPE_SHIFT) | 1) +#define FS_T2 ((REG_TYPE_T << REG_TYPE_SHIFT) | 2) +#define FS_T3 ((REG_TYPE_T << REG_TYPE_SHIFT) | 3) +#define FS_T4 ((REG_TYPE_T << REG_TYPE_SHIFT) | 4) +#define FS_T5 ((REG_TYPE_T << REG_TYPE_SHIFT) | 5) +#define FS_T6 ((REG_TYPE_T << REG_TYPE_SHIFT) | 6) +#define FS_T7 ((REG_TYPE_T << REG_TYPE_SHIFT) | 7) +#define FS_T8 ((REG_TYPE_T << REG_TYPE_SHIFT) | 8) +#define FS_T9 ((REG_TYPE_T << REG_TYPE_SHIFT) | 9) +#define FS_T10 ((REG_TYPE_T << REG_TYPE_SHIFT) | 10) + +/* Constant values */ +#define FS_C0 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 0) +#define FS_C1 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 1) +#define FS_C2 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 2) +#define FS_C3 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 3) +#define FS_C4 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 4) +#define FS_C5 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 5) +#define FS_C6 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 6) +#define FS_C7 ((REG_TYPE_CONST << REG_TYPE_SHIFT) | 7) + +/* Sampler regs */ +#define FS_S0 ((REG_TYPE_S << REG_TYPE_SHIFT) | 0) +#define FS_S1 ((REG_TYPE_S << REG_TYPE_SHIFT) | 1) +#define FS_S2 ((REG_TYPE_S << REG_TYPE_SHIFT) | 2) +#define FS_S3 ((REG_TYPE_S << REG_TYPE_SHIFT) | 3) + +/* Output color */ +#define FS_OC ((REG_TYPE_OC << REG_TYPE_SHIFT) | 0) + +/* Output depth */ +#define FS_OD ((REG_TYPE_OD << REG_TYPE_SHIFT) | 0) + +/* Unpreserved temporary regs */ +#define FS_U0 ((REG_TYPE_U << REG_TYPE_SHIFT) | 0) +#define FS_U1 ((REG_TYPE_U << REG_TYPE_SHIFT) | 1) +#define FS_U2 ((REG_TYPE_U << REG_TYPE_SHIFT) | 2) +#define FS_U3 ((REG_TYPE_U << REG_TYPE_SHIFT) | 3) + +#define X_CHANNEL_SHIFT (REG_TYPE_SHIFT + 3) +#define Y_CHANNEL_SHIFT (X_CHANNEL_SHIFT + 4) +#define Z_CHANNEL_SHIFT (Y_CHANNEL_SHIFT + 4) +#define W_CHANNEL_SHIFT (Z_CHANNEL_SHIFT + 4) + +#define REG_CHANNEL_MASK 0xf + +#define REG_NR(reg) ((reg) & REG_NR_MASK) +#define REG_TYPE(reg) (((reg) >> REG_TYPE_SHIFT) & REG_TYPE_MASK) +#define REG_X(reg) (((reg) >> X_CHANNEL_SHIFT) & REG_CHANNEL_MASK) +#define REG_Y(reg) (((reg) >> Y_CHANNEL_SHIFT) & REG_CHANNEL_MASK) +#define REG_Z(reg) (((reg) >> Z_CHANNEL_SHIFT) & REG_CHANNEL_MASK) +#define REG_W(reg) (((reg) >> W_CHANNEL_SHIFT) & REG_CHANNEL_MASK) + +enum i915_fs_channel { + X_CHANNEL_VAL = 0, + Y_CHANNEL_VAL, + Z_CHANNEL_VAL, + W_CHANNEL_VAL, + ZERO_CHANNEL_VAL, + ONE_CHANNEL_VAL, + + NEG_X_CHANNEL_VAL = X_CHANNEL_VAL | 0x8, + NEG_Y_CHANNEL_VAL = Y_CHANNEL_VAL | 0x8, + NEG_Z_CHANNEL_VAL = Z_CHANNEL_VAL | 0x8, + NEG_W_CHANNEL_VAL = W_CHANNEL_VAL | 0x8, + NEG_ONE_CHANNEL_VAL = ONE_CHANNEL_VAL | 0x8 +}; + +#define i915_fs_operand(reg, x, y, z, w) \ + (reg) | \ + (x##_CHANNEL_VAL << X_CHANNEL_SHIFT) | \ + (y##_CHANNEL_VAL << Y_CHANNEL_SHIFT) | \ + (z##_CHANNEL_VAL << Z_CHANNEL_SHIFT) | \ + (w##_CHANNEL_VAL << W_CHANNEL_SHIFT) + +/* + * Construct an operand description for using a register with no swizzling + */ +#define i915_fs_operand_reg(reg) \ + i915_fs_operand(reg, X, Y, Z, W) + +#define i915_fs_operand_reg_negate(reg) \ + i915_fs_operand(reg, NEG_X, NEG_Y, NEG_Z, NEG_W) + +/* + * Returns an operand containing (0.0, 0.0, 0.0, 0.0). + */ +#define i915_fs_operand_zero() i915_fs_operand(FS_R0, ZERO, ZERO, ZERO, ZERO) + +/* + * Returns an unused operand + */ +#define i915_fs_operand_none() i915_fs_operand_zero() + +/* + * Returns an operand containing (1.0, 1.0, 1.0, 1.0). + */ +#define i915_fs_operand_one() i915_fs_operand(FS_R0, ONE, ONE, ONE, ONE) + +#define i915_get_hardware_channel_val(val, shift, negate) \ + (((val & 0x7) << shift) | ((val & 0x8) ? negate : 0)) + +/* + * Outputs a fragment shader command to declare a sampler or texture register. + */ +#define i915_fs_dcl(reg) \ +do { \ + OUT_DWORD (D0_DCL | \ + (REG_TYPE(reg) << D0_TYPE_SHIFT) | \ + (REG_NR(reg) << D0_NR_SHIFT) | \ + ((REG_TYPE(reg) != REG_TYPE_S) ? D0_CHANNEL_ALL : 0)); \ + OUT_DWORD (0); \ + OUT_DWORD (0); \ +} while (0) + +#define i915_fs_texld(dest_reg, sampler_reg, address_reg) \ +do { \ + OUT_DWORD (T0_TEXLD | \ + (REG_TYPE(dest_reg) << T0_DEST_TYPE_SHIFT) | \ + (REG_NR(dest_reg) << T0_DEST_NR_SHIFT) | \ + (REG_NR(sampler_reg) << T0_SAMPLER_NR_SHIFT)); \ + OUT_DWORD((REG_TYPE(address_reg) << T1_ADDRESS_REG_TYPE_SHIFT) | \ + (REG_NR(address_reg) << T1_ADDRESS_REG_NR_SHIFT)); \ + OUT_DWORD (0); \ +} while (0) + +#define i915_fs_arith_masked(op, dest_reg, dest_mask, operand0, operand1, operand2) \ + _i915_fs_arith_masked(A0_##op, dest_reg, dest_mask, operand0, operand1, operand2) + +#define i915_fs_arith(op, dest_reg, operand0, operand1, operand2) \ + _i915_fs_arith(A0_##op, dest_reg, operand0, operand1, operand2) + +#define _i915_fs_arith_masked(cmd, dest_reg, dest_mask, operand0, operand1, operand2) \ +do { \ + /* Set up destination register and write mask */ \ + OUT_DWORD (cmd | \ + (REG_TYPE(dest_reg) << A0_DEST_TYPE_SHIFT) | \ + (REG_NR(dest_reg) << A0_DEST_NR_SHIFT) | \ + (((dest_mask) & ~MASK_SATURATE) << A0_DEST_CHANNEL_SHIFT) | \ + (((dest_mask) & MASK_SATURATE) ? A0_DEST_SATURATE : 0) | \ + /* Set up operand 0 */ \ + (REG_TYPE(operand0) << A0_SRC0_TYPE_SHIFT) | \ + (REG_NR(operand0) << A0_SRC0_NR_SHIFT)); \ + OUT_DWORD (i915_get_hardware_channel_val(REG_X(operand0), \ + A1_SRC0_CHANNEL_X_SHIFT, \ + A1_SRC0_CHANNEL_X_NEGATE) | \ + i915_get_hardware_channel_val(REG_Y(operand0), \ + A1_SRC0_CHANNEL_Y_SHIFT, \ + A1_SRC0_CHANNEL_Y_NEGATE) | \ + i915_get_hardware_channel_val(REG_Z(operand0), \ + A1_SRC0_CHANNEL_Z_SHIFT, \ + A1_SRC0_CHANNEL_Z_NEGATE) | \ + i915_get_hardware_channel_val(REG_W(operand0), \ + A1_SRC0_CHANNEL_W_SHIFT, \ + A1_SRC0_CHANNEL_W_NEGATE) | \ + /* Set up operand 1 */ \ + (REG_TYPE(operand1) << A1_SRC1_TYPE_SHIFT) | \ + (REG_NR(operand1) << A1_SRC1_NR_SHIFT) | \ + i915_get_hardware_channel_val(REG_X(operand1), \ + A1_SRC1_CHANNEL_X_SHIFT, \ + A1_SRC1_CHANNEL_X_NEGATE) | \ + i915_get_hardware_channel_val(REG_Y(operand1), \ + A1_SRC1_CHANNEL_Y_SHIFT, \ + A1_SRC1_CHANNEL_Y_NEGATE)); \ + OUT_DWORD (i915_get_hardware_channel_val(REG_Z(operand1), \ + A2_SRC1_CHANNEL_Z_SHIFT, \ + A2_SRC1_CHANNEL_Z_NEGATE) | \ + i915_get_hardware_channel_val(REG_W(operand1), \ + A2_SRC1_CHANNEL_W_SHIFT, \ + A2_SRC1_CHANNEL_W_NEGATE) | \ + /* Set up operand 2 */ \ + (REG_TYPE(operand2) << A2_SRC2_TYPE_SHIFT) | \ + (REG_NR(operand2) << A2_SRC2_NR_SHIFT) | \ + i915_get_hardware_channel_val(REG_X(operand2), \ + A2_SRC2_CHANNEL_X_SHIFT, \ + A2_SRC2_CHANNEL_X_NEGATE) | \ + i915_get_hardware_channel_val(REG_Y(operand2), \ + A2_SRC2_CHANNEL_Y_SHIFT, \ + A2_SRC2_CHANNEL_Y_NEGATE) | \ + i915_get_hardware_channel_val(REG_Z(operand2), \ + A2_SRC2_CHANNEL_Z_SHIFT, \ + A2_SRC2_CHANNEL_Z_NEGATE) | \ + i915_get_hardware_channel_val(REG_W(operand2), \ + A2_SRC2_CHANNEL_W_SHIFT, \ + A2_SRC2_CHANNEL_W_NEGATE)); \ +} while (0) + +#define _i915_fs_arith(cmd, dest_reg, operand0, operand1, operand2) do {\ + /* Set up destination register and write mask */ \ + OUT_DWORD (cmd | \ + (REG_TYPE(dest_reg) << A0_DEST_TYPE_SHIFT) | \ + (REG_NR(dest_reg) << A0_DEST_NR_SHIFT) | \ + (A0_DEST_CHANNEL_ALL) | \ + /* Set up operand 0 */ \ + (REG_TYPE(operand0) << A0_SRC0_TYPE_SHIFT) | \ + (REG_NR(operand0) << A0_SRC0_NR_SHIFT)); \ + OUT_DWORD (i915_get_hardware_channel_val(REG_X(operand0), \ + A1_SRC0_CHANNEL_X_SHIFT, \ + A1_SRC0_CHANNEL_X_NEGATE) | \ + i915_get_hardware_channel_val(REG_Y(operand0), \ + A1_SRC0_CHANNEL_Y_SHIFT, \ + A1_SRC0_CHANNEL_Y_NEGATE) | \ + i915_get_hardware_channel_val(REG_Z(operand0), \ + A1_SRC0_CHANNEL_Z_SHIFT, \ + A1_SRC0_CHANNEL_Z_NEGATE) | \ + i915_get_hardware_channel_val(REG_W(operand0), \ + A1_SRC0_CHANNEL_W_SHIFT, \ + A1_SRC0_CHANNEL_W_NEGATE) | \ + /* Set up operand 1 */ \ + (REG_TYPE(operand1) << A1_SRC1_TYPE_SHIFT) | \ + (REG_NR(operand1) << A1_SRC1_NR_SHIFT) | \ + i915_get_hardware_channel_val(REG_X(operand1), \ + A1_SRC1_CHANNEL_X_SHIFT, \ + A1_SRC1_CHANNEL_X_NEGATE) | \ + i915_get_hardware_channel_val(REG_Y(operand1), \ + A1_SRC1_CHANNEL_Y_SHIFT, \ + A1_SRC1_CHANNEL_Y_NEGATE)); \ + OUT_DWORD (i915_get_hardware_channel_val(REG_Z(operand1), \ + A2_SRC1_CHANNEL_Z_SHIFT, \ + A2_SRC1_CHANNEL_Z_NEGATE) | \ + i915_get_hardware_channel_val(REG_W(operand1), \ + A2_SRC1_CHANNEL_W_SHIFT, \ + A2_SRC1_CHANNEL_W_NEGATE) | \ + /* Set up operand 2 */ \ + (REG_TYPE(operand2) << A2_SRC2_TYPE_SHIFT) | \ + (REG_NR(operand2) << A2_SRC2_NR_SHIFT) | \ + i915_get_hardware_channel_val(REG_X(operand2), \ + A2_SRC2_CHANNEL_X_SHIFT, \ + A2_SRC2_CHANNEL_X_NEGATE) | \ + i915_get_hardware_channel_val(REG_Y(operand2), \ + A2_SRC2_CHANNEL_Y_SHIFT, \ + A2_SRC2_CHANNEL_Y_NEGATE) | \ + i915_get_hardware_channel_val(REG_Z(operand2), \ + A2_SRC2_CHANNEL_Z_SHIFT, \ + A2_SRC2_CHANNEL_Z_NEGATE) | \ + i915_get_hardware_channel_val(REG_W(operand2), \ + A2_SRC2_CHANNEL_W_SHIFT, \ + A2_SRC2_CHANNEL_W_NEGATE)); \ +} while (0) + +#define i915_fs_mov(dest_reg, operand0) \ + i915_fs_arith(MOV, dest_reg, \ + operand0, \ + i915_fs_operand_none(), \ + i915_fs_operand_none()) + +#define i915_fs_mov_masked(dest_reg, dest_mask, operand0) \ + i915_fs_arith_masked (MOV, dest_reg, dest_mask, \ + operand0, \ + i915_fs_operand_none(), \ + i915_fs_operand_none()) + + +#define i915_fs_frc(dest_reg, operand0) \ + i915_fs_arith (FRC, dest_reg, \ + operand0, \ + i915_fs_operand_none(), \ + i915_fs_operand_none()) + +/* Add operand0 and operand1 and put the result in dest_reg */ +#define i915_fs_add(dest_reg, operand0, operand1) \ + i915_fs_arith (ADD, dest_reg, \ + operand0, operand1, \ + i915_fs_operand_none()) + +/* Multiply operand0 and operand1 and put the result in dest_reg */ +#define i915_fs_mul(dest_reg, operand0, operand1) \ + i915_fs_arith (MUL, dest_reg, \ + operand0, operand1, \ + i915_fs_operand_none()) + +/* Computes 1/sqrt(operand0.replicate_swizzle) puts the result in dest_reg */ +#define i915_fs_rsq(dest_reg, dest_mask, operand0) \ +do { \ + if (dest_mask) { \ + i915_fs_arith_masked (RSQ, dest_reg, dest_mask, \ + operand0, \ + i915_fs_operand_none (), \ + i915_fs_operand_none ()); \ + } else { \ + i915_fs_arith (RSQ, dest_reg, \ + operand0, \ + i915_fs_operand_none (), \ + i915_fs_operand_none ()); \ + } \ +} while (0) + +/* Puts the minimum of operand0 and operand1 in dest_reg */ +#define i915_fs_min(dest_reg, operand0, operand1) \ + i915_fs_arith (MIN, dest_reg, \ + operand0, operand1, \ + i915_fs_operand_none()) + +/* Puts the maximum of operand0 and operand1 in dest_reg */ +#define i915_fs_max(dest_reg, operand0, operand1) \ + i915_fs_arith (MAX, dest_reg, \ + operand0, operand1, \ + i915_fs_operand_none()) + +#define i915_fs_cmp(dest_reg, operand0, operand1, operand2) \ + i915_fs_arith (CMP, dest_reg, operand0, operand1, operand2) + +/* Perform operand0 * operand1 + operand2 and put the result in dest_reg */ +#define i915_fs_mad(dest_reg, dest_mask, op0, op1, op2) \ +do { \ + if (dest_mask) { \ + i915_fs_arith_masked (MAD, dest_reg, dest_mask, op0, op1, op2); \ + } else { \ + i915_fs_arith (MAD, dest_reg, op0, op1, op2); \ + } \ +} while (0) + +#define i915_fs_dp2add(dest_reg, dest_mask, op0, op1, op2) \ +do { \ + if (dest_mask) { \ + i915_fs_arith_masked (DP2ADD, dest_reg, dest_mask, op0, op1, op2); \ + } else { \ + i915_fs_arith (DP2ADD, dest_reg, op0, op1, op2); \ + } \ +} while (0) + +/* + * Perform a 3-component dot-product of operand0 and operand1 and put the + * resulting scalar in the channels of dest_reg specified by the dest_mask. + */ +#define i915_fs_dp3(dest_reg, dest_mask, op0, op1) \ +do { \ + if (dest_mask) { \ + i915_fs_arith_masked (DP3, dest_reg, dest_mask, \ + op0, op1,\ + i915_fs_operand_none()); \ + } else { \ + i915_fs_arith (DP3, dest_reg, op0, op1,\ + i915_fs_operand_none()); \ + } \ +} while (0) + +static inline uint32_t cairo_const +i915_fs_operand_pure_alpha (int pure) +{ + if (pure & (1 << 3)) + return i915_fs_operand_one (); + else + return i915_fs_operand_zero (); +} + +#define I915_TILING_DEFAULT I915_TILING_Y +#define I915_BO_CACHE_BUCKETS 13 /* cache surfaces up to 16 MiB */ + +typedef struct i915_surface i915_surface_t; +typedef struct i915_device i915_device_t; +typedef struct i915_shader i915_shader_t; + +typedef void (*i915_add_rectangle_func_t) (const i915_shader_t *shader, + int x, int y, + int w, int h); + +#define IMAGE_CACHE_WIDTH 1024 +#define IMAGE_CACHE_HEIGHT 1024 + +typedef struct i915_image_private { + cairo_rtree_node_t node; + intel_buffer_cache_t *container; +} i915_image_private_t; + +#define I915_BATCH_SIZE (128*1024) +#define I915_VBO_SIZE (512*1024) +#define I915_MAX_RELOCS 2048 + +enum { + I915_DEBUG_EXEC = 0x1, + I915_DEBUG_SYNC = 0x2, + I915_DEBUG_BATCH = 0x4, + I915_DEBUG_BUFFER = 0x8, + I915_DEBUG_BUFFER_CACHE = 0x10, + I915_DEBUG_BUFFER_ALLOC = 0x20, + I915_DEBUG_GLYPHS = 0x40, + I915_DEBUG_MAP = 0x80, + I915_DEBUG_THROTTLE = 0x100, +}; + +struct i915_device { + intel_device_t intel; + + cairo_bool_t debug; + + i915_shader_t *shader; /* note: only valid during geometry emission */ + + struct i915_batch { + intel_bo_t *target_bo[I915_MAX_RELOCS]; + size_t gtt_avail_size; + size_t est_gtt_size; + size_t total_gtt_size; + + uint16_t fences; + uint16_t fences_avail; + uint16_t reloc_count; + uint16_t exec_count; + uint16_t used; + + struct drm_i915_gem_exec_object2 exec[I915_MAX_RELOCS]; + struct drm_i915_gem_relocation_entry reloc[I915_MAX_RELOCS]; + } batch; + + uint32_t vbo; + uint32_t vbo_offset; + uint32_t vbo_used; + uint32_t vbo_max_index; + uint32_t vertex_index; + uint32_t vertex_count; + uint32_t floats_per_vertex; + uint32_t rectangle_size; + intel_bo_t *last_vbo; + uint32_t last_vbo_offset; + uint32_t last_vbo_space; + + i915_surface_t *current_target; + uint32_t current_size; + uint32_t current_diffuse; + uint32_t current_colorbuf; + uint32_t *current_source; + uint32_t *current_mask; + uint32_t *current_clip; + uint32_t current_program; + uint32_t current_texcoords; + uint32_t current_blend; + uint32_t current_constants[8*4]; + uint32_t current_n_constants; + uint32_t current_samplers[2*4]; + uint32_t current_maps[4*4]; + uint32_t current_n_samplers; + uint32_t current_n_maps; + uint32_t last_source_fragment; + uint32_t clear_alpha; + + cairo_list_t image_caches[2]; + + uint32_t batch_header[13]; + uint32_t batch_base[I915_BATCH_SIZE / sizeof (uint32_t)]; + uint8_t vbo_base[I915_VBO_SIZE]; +}; + +enum { + CURRENT_SOURCE = 0x1, + CURRENT_MASK = 0x2, + CURRENT_CLIP = 0x4 +}; + +typedef enum { + VS_ZERO, + VS_CONSTANT, + VS_LINEAR, + VS_TEXTURE, + VS_TEXTURE_16, +} i915_vertex_shader_t; + +typedef enum { + FS_ZERO, + FS_ONE, + FS_PURE, + FS_CONSTANT, + FS_DIFFUSE, + FS_LINEAR, + FS_RADIAL, + FS_TEXTURE, + FS_YUV, + FS_SPANS, +} i915_fragment_shader_t; + +#define FS_DETAILS_SHIFT 4 + +typedef enum { + PATTERN_BASE, + PATTERN_CONSTANT, + PATTERN_LINEAR, + PATTERN_RADIAL, + PATTERN_TEXTURE, +} i915_shader_channel_t; + +struct i915_surface { + intel_surface_t intel; + + uint32_t map0, map1; + uint32_t colorbuf; + + cairo_bool_t deferred_clear; + uint32_t offset; + uint32_t is_current_texture; + + i915_image_private_t *cache; + + intel_bo_t *stencil; + uint32_t stencil_stride; + uint32_t stencil_offset; +}; + +typedef enum { + NONE = 0, + YUV_I420, + /* XXX */ + YUV_YV12, + YUV_YUY2, + YUV_UYVY, +} i915_packed_pixel_t; + +/* read-only container */ +#define I915_PACKED_PIXEL_SURFACE_TYPE 0x1000 +typedef struct i915_packed_pixel_surface { + cairo_surface_t base; + + i915_packed_pixel_t pixel; + + i915_device_t *device; + intel_bo_t *bo; + uint32_t is_current_texture; + + uint32_t offset[4]; + uint32_t stride[4]; + uint32_t width[4]; + uint32_t height[4]; + uint32_t map0[4], map1[4]; +} i915_packed_pixel_surface_t; + +struct i915_shader { + i915_device_t *device; + i915_surface_t *target; + + cairo_operator_t op; + uint32_t blend; + float opacity; + cairo_content_t content; + + cairo_bool_t committed; + cairo_bool_t need_combine; + + i915_add_rectangle_func_t add_rectangle; + + union i915_shader_channel { + struct { + i915_vertex_shader_t vertex; + i915_fragment_shader_t fragment; + i915_shader_channel_t pattern; + } type; + struct i915_shader_base { + i915_vertex_shader_t vertex; + i915_fragment_shader_t fragment; + i915_shader_channel_t pattern; + uint32_t texfmt; + cairo_content_t content; + uint32_t mode; + intel_bo_t *bo; + uint32_t n_samplers; + uint32_t offset[4]; + uint32_t map[2*4]; + uint32_t sampler[2]; + cairo_matrix_t matrix; + } base; + struct i915_shader_solid { + struct i915_shader_base base; + cairo_color_t color; + int pure; + } solid; + struct i915_shader_linear { + struct i915_shader_base base; + struct { + float red, green, blue, alpha; + } color0, color1; + float dx, dy, offset; + } linear; + struct i915_shader_radial { + struct i915_shader_base base; + float constants[8]; + } radial; + struct i915_shader_surface { + struct i915_shader_base base; + i915_packed_pixel_t pixel; + } surface; + } source, mask, clip, dst; + + jmp_buf unwind; +}; + +enum i915_shader_linear_mode { + /* XXX REFLECT */ + LINEAR_TEXTURE, + LINEAR_NONE, + LINEAR_REPEAT, + LINEAR_PAD, +}; + +enum i915_shader_radial_mode { + RADIAL_ONE, + RADIAL_TWO +}; + +typedef cairo_status_t +(*i915_spans_func_t) (void *closure, + cairo_span_renderer_t *renderer, + const cairo_rectangle_int_t *extents); + +cairo_private cairo_status_t +i915_clip_and_composite_spans (i915_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_antialias_t antialias, + i915_spans_func_t draw_func, + void *draw_closure, + const cairo_composite_rectangles_t*extents, + cairo_clip_t *clip, + double opacity); + +cairo_private cairo_surface_t * +i915_surface_create_internal (cairo_drm_device_t *base_dev, + cairo_format_t format, + int width, int height, + uint32_t tiling, + cairo_bool_t gpu_target); + +cairo_private i915_surface_t * +i915_surface_create_from_cacheable_image_internal (i915_device_t *device, + cairo_image_surface_t *image); + +cairo_private void +i915_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font); + +cairo_private cairo_int_status_t +i915_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining); + +static inline int cairo_const +i915_tiling_height (uint32_t tiling, int height) +{ + switch (tiling) { + default: + case I915_TILING_NONE: return (height + 1) & -2; + case I915_TILING_X: return (height + 7) & -8; + case I915_TILING_Y: return (height + 31) & -32; + } +} + +static inline uint32_t cairo_const +i915_tiling_stride (int format, uint32_t stride) +{ + uint32_t tile_width; + + /* use 64B alignment so that the buffer may be used as a scanout */ + if (format == I915_TILING_NONE) + return (stride + 63) & -64; + + tile_width = 512; + /* XXX Currently the kernel enforces a tile_width of 512 for TILING_Y. + + the docs are a bit confused on that front + once we enable it on 915 we'll find out what the tile width size should be in the fence setup + it could be that 915 has y tiling but that the minimum width is 512 or something + yeah it's probably 128 on 915 also + it's just that we haven't tested + but I wasn't thinking that the tile widths were the same + only that in order to fence y tiles on 915 you needed pitch to be a multiple of 4 y tiles (or something like that) + + tile_width = format == I915_TILING_Y ? 128 : 512; + */ + + /* needs a pot tile width */ + while (tile_width < stride) + tile_width <<= 1; + + return tile_width; +} + +static inline uint32_t cairo_const +i915_tiling_size (uint32_t tiling, uint32_t size) +{ + uint32_t fence; + + if (tiling == I915_TILING_NONE) + return (size + 4095) & -4096; + + fence = 1024 * 1024; /* 1 MiB */ + while (fence < size) + fence <<= 1; + + return fence; +} + +static inline cairo_bool_t cairo_const +i915_texture_filter_is_nearest (cairo_filter_t filter) +{ + switch (filter) { + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + return FALSE; + default: + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + return TRUE; + } +} + +static inline uint32_t cairo_const +i915_texture_filter (cairo_filter_t filter) +{ + switch (filter) { + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + return + (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) | + (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT); + default: + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + return + (FILTER_NEAREST << SS2_MAG_FILTER_SHIFT) | + (FILTER_NEAREST << SS2_MIN_FILTER_SHIFT); + } +} + +static inline uint32_t cairo_const +i915_texture_extend (cairo_extend_t extend) +{ + switch (extend) { + default: + case CAIRO_EXTEND_NONE: + return + (TEXCOORDMODE_CLAMP_BORDER << SS3_TCX_ADDR_MODE_SHIFT) | + (TEXCOORDMODE_CLAMP_BORDER << SS3_TCY_ADDR_MODE_SHIFT); + case CAIRO_EXTEND_REPEAT: + return + (TEXCOORDMODE_WRAP << SS3_TCX_ADDR_MODE_SHIFT) | + (TEXCOORDMODE_WRAP << SS3_TCY_ADDR_MODE_SHIFT); + case CAIRO_EXTEND_PAD: + return + (TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) | + (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT); + case CAIRO_EXTEND_REFLECT: + return + (TEXCOORDMODE_MIRROR << SS3_TCX_ADDR_MODE_SHIFT) | + (TEXCOORDMODE_MIRROR << SS3_TCY_ADDR_MODE_SHIFT); + } +} + +static inline uint32_t cairo_const +BUF_tiling (uint32_t tiling) +{ + switch (tiling) { + default: + case I915_TILING_NONE: return 0; + case I915_TILING_X: return BUF_3D_TILED_SURFACE | BUF_3D_TILE_WALK_X; + case I915_TILING_Y: return BUF_3D_TILED_SURFACE | BUF_3D_TILE_WALK_Y; + } +} + +#define OUT_DWORD(dword) i915_batch_emit_dword (device, dword) +#define OUT_RELOC(surface, read, write) i915_batch_emit_reloc (device, to_intel_bo (surface->intel.drm.bo), surface->offset, read, write, FALSE) +#define OUT_RELOC_FENCED(surface, read, write) i915_batch_emit_reloc (device, to_intel_bo (surface->intel.drm.bo), surface->offset, read, write, TRUE) + +#define FS_LOCALS \ + uint32_t *_shader_start + +#define FS_BEGIN() \ +do { \ + _shader_start = BATCH_PTR (device); \ + OUT_DWORD (_3DSTATE_PIXEL_SHADER_PROGRAM); \ +} while (0) + +#define FS_END() \ +do { \ + *_shader_start |= BATCH_PTR (device) - _shader_start - 2; \ +} while (0); + +static inline int32_t +i915_batch_space (i915_device_t *device) +{ + /* leave room for RECTLIST(4) + MI_BUFFER_END + MI_NOOP */ + return sizeof (device->batch_base) - (device->batch.used << 2) - 32; +} + +static inline cairo_bool_t +i915_check_aperture_size (const i915_device_t *device, int relocs, size_t est_size, size_t size) +{ + return device->batch.reloc_count + relocs < I915_MAX_RELOCS - 2 && + device->batch.est_gtt_size + est_size <= device->batch.gtt_avail_size && + device->batch.total_gtt_size + size <= device->intel.gtt_avail_size; +} + +static inline cairo_bool_t +i915_check_aperture (const i915_device_t *device, intel_bo_t **bo_array, int count) +{ + uint32_t relocs = 0, est_size = 0, size = 0; + + while (count--) { + const intel_bo_t *bo = *bo_array++; + if (bo->exec == NULL) { + relocs++; + size += bo->base.size; + if (!bo->busy) + est_size += bo->base.size; + } + } + + return i915_check_aperture_size (device, relocs, est_size, size); +} + +static inline cairo_bool_t +i915_check_aperture_and_fences (const i915_device_t *device, intel_bo_t **bo_array, int count) +{ + uint32_t relocs = 0, est_size = 0, size = 0; + uint32_t fences = 0; + + while (count--) { + const intel_bo_t *bo = *bo_array++; + if (bo->exec == NULL) { + relocs++; + size += bo->base.size; + if (!bo->busy) + est_size += bo->base.size; + if (bo->tiling != I915_TILING_NONE) + fences++; + } else if (bo->tiling != I915_TILING_NONE) { + if ((bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) + fences++; + } + } + + return i915_check_aperture_size (device, relocs, est_size, size) && + device->batch.fences + fences <= device->batch.fences_avail; +} + +#define BATCH_PTR(device) &(device)->batch_base[(device)->batch.used] +static inline void +i915_batch_emit_dword (i915_device_t *device, uint32_t dword) +{ + device->batch_base[device->batch.used++] = dword; +} + +cairo_private void +i915_batch_add_reloc (i915_device_t *device, uint32_t pos, + intel_bo_t *bo, + uint32_t offset, + uint32_t read_domains, + uint32_t write_domain, + cairo_bool_t needs_fence); + +static inline void +i915_batch_fill_reloc (i915_device_t *device, uint32_t pos, + intel_bo_t *bo, + uint32_t offset, + uint32_t read_domains, + uint32_t write_domain) +{ + i915_batch_add_reloc (device, pos, + bo, offset, + read_domains, write_domain, + FALSE); + device->batch_base[pos] = bo->offset + offset; +} + +static inline void +i915_batch_emit_reloc (i915_device_t *device, + intel_bo_t *bo, + uint32_t offset, + uint32_t read_domains, + uint32_t write_domain, + cairo_bool_t needs_fence) +{ + i915_batch_add_reloc (device, device->batch.used, + bo, offset, + read_domains, write_domain, + needs_fence); + i915_batch_emit_dword (device, bo->offset + offset); +} + +cairo_private void +i915_vbo_flush (i915_device_t *device); + +cairo_private void +i915_vbo_finish (i915_device_t *device); + +cairo_private cairo_status_t +i915_batch_flush (i915_device_t *device); + +static inline float * +i915_add_rectangle (i915_device_t *device) +{ + float *vertices; + uint32_t size; + + assert (device->floats_per_vertex); + assert (device->rectangle_size == 3*device->floats_per_vertex*sizeof(float)); + + size = device->rectangle_size; + if (unlikely (device->vbo_offset + size > I915_VBO_SIZE)) + i915_vbo_finish (device); + + vertices = (float *) (device->vbo_base + device->vbo_offset); + device->vbo_used = device->vbo_offset += size; + device->vertex_count += 3; + return vertices; +} + +static inline i915_device_t * +i915_device (i915_surface_t *surface) +{ + return (i915_device_t *) surface->intel.drm.base.device; +} + +cairo_private cairo_status_t +i915_surface_clear (i915_surface_t *dst); + +cairo_private void +i915_set_dst (i915_device_t *device, i915_surface_t *dst); + +cairo_private void +i915_shader_init (i915_shader_t *shader, + i915_surface_t *dst, + cairo_operator_t op, + double opacity); + +cairo_private cairo_status_t +i915_shader_acquire_pattern (i915_shader_t *shader, + union i915_shader_channel *src, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents); + +cairo_private void +i915_shader_set_clip (i915_shader_t *shader, + cairo_clip_t *clip); + +cairo_private int +i915_shader_num_texcoords (const i915_shader_t *shader); + +static inline double cairo_const +i915_shader_linear_texcoord (const struct i915_shader_linear *l, + double src_x, double src_y) +{ + return l->dx * src_x + l->dy * src_y + l->offset; +} + +cairo_private cairo_status_t +i915_shader_commit (i915_shader_t *shader, + i915_device_t *device); + +cairo_private void +i915_shader_fini (i915_shader_t *shader); + +cairo_private cairo_status_t +i915_fixup_unbounded (i915_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip); + +static inline cairo_bool_t +i915_surface_needs_tiling (i915_surface_t *dst) +{ + return dst->intel.drm.width > 2048 || dst->intel.drm.height > 2048; +} + +cairo_private cairo_status_t +i915_surface_copy_subimage (i915_device_t *device, + i915_surface_t *src, + const cairo_rectangle_int_t *extents, + cairo_bool_t flush, + i915_surface_t **clone_out); + +static inline uint32_t +pack_float (float f) +{ + union { + float f; + uint32_t ui; + } t; + t.f = f; + return t.ui; +} + +static inline cairo_status_t +i915_surface_fallback_flush (i915_surface_t *surface) +{ + cairo_status_t status; + + if (unlikely (surface->intel.drm.fallback != NULL)) + return intel_surface_flush (&surface->intel, 0); + + status = CAIRO_STATUS_SUCCESS; + if (unlikely (surface->deferred_clear)) + status = i915_surface_clear (surface); + + return status; +} + +#endif /* CAIRO_DRM_I915_PRIVATE_H */ diff --git a/src/drm/cairo-drm-i915-shader.c b/src/drm/cairo-drm-i915-shader.c new file mode 100644 index 000000000..85aa98433 --- /dev/null +++ b/src/drm/cairo-drm-i915-shader.c @@ -0,0 +1,2858 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-drm-i915-private.h" +#include "cairo-surface-offset-private.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-surface-snapshot-private.h" + +#if 0 +static cairo_status_t +i915_packed_pixel_surface_finish (void *abstract_surface) +{ + i915_packed_pixel_surface_t *surface = abstract_surface; + i915_device_t *device; + + device = i915_device_acquire (&surface->device->intel.base); + + intel_bo_destroy (&device->intel, surface->bo); + + if (surface->is_current_texture) { + if (surface->is_current_texture & CURRENT_SOURCE) + device->current_source = NULL; + if (surface->is_current_texture & CURRENT_MASK) + device->current_mask = NULL; + device->current_n_samplers = 0; + } + + i915_device_release (device); + + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_surface_backend_t i915_packed_pixel_surface_backend = { + I915_PACKED_PIXEL_SURFACE_TYPE, + i915_packed_pixel_surface_finish, +}; + +static cairo_surface_t * +i915_packed_pixel_surface_create (i915_device_t *device, + i915_packed_pixel_t pixel, + const uint8_t *data, + uint32_t length, + uint32_t width, uint32_t height) +{ + i915_packed_pixel_surface_t *surface; + cairo_content_t content; + uint32_t tiling, size; + uint32_t stride, half_stride; + uint32_t i; + + if (width > 2048 || height > 2048) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + + surface = malloc (sizeof (i915_packed_pixel_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + tiling = I915_TILING_NONE; /* XXX */ + half_stride = stride = i915_tiling_stride (tiling, width/2); + if (stride < width) + stride *= 2 ; + height = i915_tiling_height (tiling, height); + + switch (surface->pixel = pixel) { + case YUV_I420: + content = CAIRO_CONTENT_COLOR; + + surface->offset[0] = 0; + surface->width[0] = width; + surface->height[0] = height; + surface->stride[0] = stride; + surface->map0[0] = MAPSURF_8BIT | MT_8BIT_I8 | MS3_tiling (tiling); + surface->map0[0] |= ((height - 1) << MS3_HEIGHT_SHIFT) | + ((width - 1) << MS3_WIDTH_SHIFT); + surface->map1[0] = (stride / 4 - 1) << MS4_PITCH_SHIFT; + + surface->offset[1] = stride * height; + surface->width[1] = width / 2; + surface->height[1] = height / 2; + surface->stride[1] = half_stride; + surface->map0[1] = MAPSURF_8BIT | MT_8BIT_I8 | MS3_tiling (tiling); + surface->map0[1] |= ((height/2 - 1) << MS3_HEIGHT_SHIFT) | + ((width/2 - 1) << MS3_WIDTH_SHIFT); + surface->map1[1] = (half_stride / 4 - 1) << MS4_PITCH_SHIFT; + + if (width < half_stride) { + surface->offset[2] = stride * height + half_stride / 2; + size = stride * height + half_stride * height / 2; + } else { + surface->offset[2] = stride * height + half_stride * height / 2; + size = stride * height + half_stride * height; + } + surface->width[2] = width / 2; + surface->height[2] = height / 2; + surface->stride[2] = half_stride; + surface->map0[2] = MAPSURF_8BIT | MT_8BIT_I8 | MS3_tiling (tiling); + surface->map0[2] |= ((height/2 - 1) << MS3_HEIGHT_SHIFT) | + ((width/2 - 1) << MS3_WIDTH_SHIFT); + surface->map1[2] = (half_stride / 4 - 1) << MS4_PITCH_SHIFT; + break; + + case NONE: + case YUV_YV12: + case YUV_YUY2: + case YUV_UYVY: + ASSERT_NOT_REACHED; + break; + } + + _cairo_surface_init (&surface->base, + &i915_packed_pixel_surface_backend, + content); + + surface->bo = intel_bo_create (&device->intel, size, FALSE); + assert (surface->bo->tiling == I915_TILING_NONE); + if (unlikely (surface->bo == NULL)) { + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + if (tiling == I915_TILING_NONE) { + intel_bo_t *bo = surface->bo; + uint32_t dst; + int uv; + + dst = surface->offset[0]; + if (width == stride) { + size = stride * height; + intel_bo_write (&device->intel, bo, dst, size, data); + data += size; + } else { + for (i = 0; i < height; i++) { + intel_bo_write (&device->intel, bo, dst, width, data); + dst += stride; + data += width; + } + } + + for (uv = 1; uv <= 2; uv++) { + dst = surface->offset[uv]; + if (width / 2 == half_stride) { + size = half_stride * height / 2; + intel_bo_write (&device->intel, bo, dst, size, data); + data += size; + } else { + size = width / 2; + for (i = 0; i < height / 2; i++) { + intel_bo_write (&device->intel, bo, dst, size, data); + dst += half_stride; + data += size; + } + } + } + } else { + uint8_t *dst, *base; + + base = intel_bo_map (&device->intel, surface->bo); + + dst = base + surface->offset[0]; + if (width == stride) { + size = stride * height; + memcpy (dst, data, size); + data += size; + } else { + for (i = 0; i < height; i++) { + memcpy (dst, data, width); + dst += stride; + data += width; + } + } + + dst = base + surface->offset[1]; + if (width / 2 == half_stride) { + size = half_stride * height / 2; + memcpy (dst, data, size); + data += size; + } else { + size = width / 2; + for (i = 0; i < height / 2; i++) { + memcpy (dst, data, size); + dst += half_stride; + data += size; + } + } + + dst = base + surface->offset[2]; + if (width / 2 == half_stride) { + size = half_stride * height / 2; + memcpy (dst, data, size); + data += size; + } else { + size = width / 2; + for (i = 0; i < height / 2; i++) { + memcpy (dst, data, size); + dst += half_stride; + data += size; + } + } + } + + surface->device = device; + surface->is_current_texture = 0; + + return &surface->base; +} + +static cairo_int_status_t +i915_clone_yuv (i915_surface_t *surface, + cairo_surface_t *source, + int width, int height, + cairo_surface_t **clone_out) +{ + const uint8_t *mime_data = NULL; + unsigned int mime_data_length; + cairo_surface_t *clone; + + cairo_surface_get_mime_data (source, "video/x-raw-yuv/i420", + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + clone = + i915_packed_pixel_surface_create ((i915_device_t *) surface->base.device, + YUV_I420, + mime_data, mime_data_length, + width, height); + if (clone == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + if (unlikely (clone->status)) + return clone->status; + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} +#endif + +/* Max instruction count: 4 */ +static void +i915_shader_linear_color (i915_device_t *device, + enum i915_shader_linear_mode mode, + int in, int c0, int c1, int out) +{ + int tmp = FS_U0; + + switch (mode) { + case LINEAR_TEXTURE: + ASSERT_NOT_REACHED; + case LINEAR_NONE: + tmp = in; + break; + + case LINEAR_REPEAT: + i915_fs_frc (tmp, i915_fs_operand (in, X, X, X, X)); + break; +#if 0 + case LINEAR_REFLECT: + /* XXX needs an extra constant: C2 [0.5, 2.0, x, x] */ + i915_fs_mul (tmp, in, 0.5); + i915_fs_frc (tmp, i915_fs_operand_reg (tmp)); + i915_fs_mul (tmp, tmp, 2.0); + i915_fs_add (tmp, i915_fs_operand_one (), + i915_fs_operand_reg_negate (tmp)); + i915_fs_cmp (tmp, + i915_fs_operand_reg (tmp), + i915_fs_operand_reg (tmp), + i915_fs_operand_reg_negate (tmp)); + i915_fs_add (tmp, i915_fs_operand_one (), + i915_fs_operand_reg_negate (tmp)); +#endif + case LINEAR_PAD: + i915_fs_max (tmp, + i915_fs_operand_zero (), + i915_fs_operand (in, X, X, X, X)); + i915_fs_min (tmp, + i915_fs_operand_one (), + i915_fs_operand_reg (tmp)); + break; + } + + /* interpolate */ + i915_fs_mad (out, 0, + i915_fs_operand (tmp, NEG_X, NEG_X, NEG_X, NEG_X), + i915_fs_operand_reg (c0), + i915_fs_operand_reg (c0)); + i915_fs_mad (out, 0, + i915_fs_operand (tmp, X, X, X, X), + i915_fs_operand_reg (c1), + i915_fs_operand_reg (out)); +} + +static void +i915_shader_radial_init (struct i915_shader_radial *r, + const cairo_radial_pattern_t *radial) +{ + double dx, dy, dr, r1; + + dx = radial->cd2.center.x - radial->cd1.center.x; + dy = radial->cd2.center.y - radial->cd1.center.y; + dr = radial->cd2.radius - radial->cd1.radius; + + r1 = radial->cd1.radius; + + if (radial->cd2.center.x == radial->cd1.center.x && + radial->cd2.center.y == radial->cd1.center.y) + { + /* XXX dr == 0, meaningless with anything other than PAD */ + r->constants[0] = radial->cd1.center.x / dr; + r->constants[1] = radial->cd1.center.y / dr; + r->constants[2] = 1. / dr; + r->constants[3] = -r1 / dr; + + r->constants[4] = 0; + r->constants[5] = 0; + r->constants[6] = 0; + r->constants[7] = 0; + + r->base.mode = RADIAL_ONE; + } else { + r->constants[0] = -radial->cd1.center.x; + r->constants[1] = -radial->cd1.center.y; + r->constants[2] = r1; + r->constants[3] = -4 * (dx*dx + dy*dy - dr*dr); + + r->constants[4] = -2 * dx; + r->constants[5] = -2 * dy; + r->constants[6] = -2 * r1 * dr; + r->constants[7] = 1 / (2 * (dx*dx + dy*dy - dr*dr)); + + r->base.mode = RADIAL_TWO; + } + + r->base.matrix = radial->base.base.matrix; +} + +/* Max instruction count: 10 */ +static void +i915_shader_radial_coord (i915_device_t *device, + enum i915_shader_radial_mode mode, + int in, int g0, int g1, int out) +{ + switch (mode) { + case RADIAL_ONE: + /* + pdx = (x - c1x) / dr, pdy = (y - c1y) / dr; + r² = pdx*pdx + pdy*pdy + t = r²/sqrt(r²) - r1/dr; + */ + i915_fs_mad (FS_U0, MASK_X | MASK_Y, + i915_fs_operand (in, X, Y, ZERO, ZERO), + i915_fs_operand (g0, Z, Z, ZERO, ZERO), + i915_fs_operand (g0, NEG_X, NEG_Y, ZERO, ZERO)); + i915_fs_dp2add (FS_U0, MASK_X, + i915_fs_operand (FS_U0, X, Y, ZERO, ZERO), + i915_fs_operand (FS_U0, X, Y, ZERO, ZERO), + i915_fs_operand_zero ()); + i915_fs_rsq (out, MASK_X, i915_fs_operand (FS_U0, X, X, X, X)); + i915_fs_mad (out, MASK_X, + i915_fs_operand (FS_U0, X, ZERO, ZERO, ZERO), + i915_fs_operand (out, X, ZERO, ZERO, ZERO), + i915_fs_operand (g0, W, ZERO, ZERO, ZERO)); + break; + + case RADIAL_TWO: + /* + pdx = x - c1x, pdy = y - c1y; + A = dx² + dy² - dr² + B = -2*(pdx*dx + pdy*dy + r1*dr); + C = pdx² + pdy² - r1²; + det = B*B - 4*A*C; + t = (-B + sqrt (det)) / (2 * A) + */ + + /* u0.x = pdx, u0.y = pdy, u[0].z = r1; */ + i915_fs_add (FS_U0, + i915_fs_operand (in, X, Y, ZERO, ZERO), + i915_fs_operand (g0, X, Y, Z, ZERO)); + /* u0.x = pdx, u0.y = pdy, u[0].z = r1, u[0].w = B; */ + i915_fs_dp3 (FS_U0, MASK_W, + i915_fs_operand (FS_U0, X, Y, ONE, ZERO), + i915_fs_operand (g1, X, Y, Z, ZERO)); + /* u1.x = pdx² + pdy² - r1²; [C] */ + i915_fs_dp3 (FS_U1, MASK_X, + i915_fs_operand (FS_U0, X, Y, Z, ZERO), + i915_fs_operand (FS_U0, X, Y, NEG_Z, ZERO)); + /* u1.x = C, u1.y = B, u1.z=-4*A; */ + i915_fs_mov_masked (FS_U1, MASK_Y, i915_fs_operand (FS_U0, W, W, W, W)); + i915_fs_mov_masked (FS_U1, MASK_Z, i915_fs_operand (g0, W, W, W, W)); + /* u1.x = B² - 4*A*C */ + i915_fs_dp2add (FS_U1, MASK_X, + i915_fs_operand (FS_U1, X, Y, ZERO, ZERO), + i915_fs_operand (FS_U1, Z, Y, ZERO, ZERO), + i915_fs_operand_zero ()); + /* out.x = -B + sqrt (B² - 4*A*C), + * out.y = -B - sqrt (B² - 4*A*C), + */ + i915_fs_rsq (out, MASK_X, i915_fs_operand (FS_U1, X, X, X, X)); + i915_fs_mad (out, MASK_X | MASK_Y, + i915_fs_operand (out, X, X, ZERO, ZERO), + i915_fs_operand (FS_U1, X, NEG_X, ZERO, ZERO), + i915_fs_operand (FS_U0, NEG_W, NEG_W, ZERO, ZERO)); + /* out.x = (-B + sqrt (B² - 4*A*C)) / (2 * A), + * out.y = (-B - sqrt (B² - 4*A*C)) / (2 * A) + */ + i915_fs_mul (out, + i915_fs_operand (out, X, Y, ZERO, ZERO), + i915_fs_operand (g1, W, W, ZERO, ZERO)); + /* if (A > 0) + * out = (-B + sqrt (B² - 4*A*C)) / (2 * A), + * else + * out = (-B - sqrt (B² - 4*A*C)) / (2 * A) + */ + i915_fs_cmp (out, + i915_fs_operand (g1, W, ZERO, ZERO, ZERO), + i915_fs_operand (out, X, ZERO, ZERO, ZERO), + i915_fs_operand (out, Y, ZERO, ZERO, ZERO)); + break; + } +} + +/* Max instruction count: 7 */ +static inline void +i915_shader_yuv_color (i915_device_t *device, + int y, int u, int v, + int c0, int c1, int c2, + int out) +{ + i915_fs_mov_masked (FS_U0, MASK_X, i915_fs_operand_reg (y)); + i915_fs_mov_masked (FS_U0, MASK_Y, i915_fs_operand_reg (u)); + i915_fs_mov_masked (FS_U0, MASK_Z, i915_fs_operand_reg (v)); + + i915_fs_add (FS_U0, + i915_fs_operand_reg (FS_U0), + i915_fs_operand_reg (c0)); + i915_fs_dp3 (out, MASK_X, + i915_fs_operand_reg (FS_U0), + i915_fs_operand (c1, X, ZERO, Y, ZERO)); + i915_fs_dp3 (out, MASK_Z, + i915_fs_operand_reg (FS_U0), + i915_fs_operand (c1, Z, W, ZERO, ZERO)); + i915_fs_dp3 (out, MASK_Y, + i915_fs_operand_reg (FS_U0), + i915_fs_operand_reg (c2)); +} + +static inline uint32_t +i915_shader_channel_key (const union i915_shader_channel *channel) +{ + return (channel->type.fragment & 0x0f) | (channel->base.mode << FS_DETAILS_SHIFT); +} + +static uint32_t +i915_shader_channel_get_num_tex_coords (const union i915_shader_channel *channel) +{ + switch (channel->type.fragment) { + default: + case FS_ZERO: + case FS_ONE: + case FS_CONSTANT: + case FS_PURE: + case FS_DIFFUSE: + return 0; + + case FS_LINEAR: + case FS_RADIAL: + case FS_TEXTURE: + case FS_SPANS: + case FS_YUV: + return 1; + } +} + +static uint32_t +i915_shader_get_num_tex_coords (const i915_shader_t *shader) +{ + uint32_t num_tex_coords; + + num_tex_coords = 0; + + num_tex_coords += i915_shader_channel_get_num_tex_coords (&shader->source); + num_tex_coords += i915_shader_channel_get_num_tex_coords (&shader->mask); + num_tex_coords += i915_shader_channel_get_num_tex_coords (&shader->clip); + num_tex_coords += i915_shader_channel_get_num_tex_coords (&shader->dst); + + return num_tex_coords; +} + +#define i915_fs_operand_impure(reg, channel, pure) \ + (reg | \ + (((pure & (1 << 0)) ? channel##_CHANNEL_VAL : ZERO_CHANNEL_VAL) << X_CHANNEL_SHIFT) | \ + (((pure & (1 << 1)) ? channel##_CHANNEL_VAL : ZERO_CHANNEL_VAL) << Y_CHANNEL_SHIFT) | \ + (((pure & (1 << 2)) ? channel##_CHANNEL_VAL : ZERO_CHANNEL_VAL) << Z_CHANNEL_SHIFT) | \ + (((pure & (1 << 3)) ? channel##_CHANNEL_VAL : ZERO_CHANNEL_VAL) << W_CHANNEL_SHIFT)) + +#define i915_fs_operand_pure(pure) \ + (FS_R0 | \ + (((pure & (1 << 0)) ? ONE_CHANNEL_VAL : ZERO_CHANNEL_VAL) << X_CHANNEL_SHIFT) | \ + (((pure & (1 << 1)) ? ONE_CHANNEL_VAL : ZERO_CHANNEL_VAL) << Y_CHANNEL_SHIFT) | \ + (((pure & (1 << 2)) ? ONE_CHANNEL_VAL : ZERO_CHANNEL_VAL) << Z_CHANNEL_SHIFT) | \ + (((pure & (1 << 3)) ? ONE_CHANNEL_VAL : ZERO_CHANNEL_VAL) << W_CHANNEL_SHIFT)) + +static void +i915_set_shader_program (i915_device_t *device, + const i915_shader_t *shader) +{ + uint32_t num_tex_coords; + uint32_t num_samplers; + uint32_t n; + uint32_t texture_offset = 0; + uint32_t constant_offset = 0; + uint32_t sampler_offset = 0; + uint32_t source_reg; + uint32_t source_pure; + uint32_t mask_reg; + uint32_t out_reg; + uint32_t dest_reg; + FS_LOCALS; + + n = (i915_shader_channel_key (&shader->source) << 0) | + (i915_shader_channel_key (&shader->mask) << 8) | + (i915_shader_channel_key (&shader->clip) << 16) | + (shader->op << 24) | + ((shader->opacity < 1.) << 30) | + (((shader->content & CAIRO_CONTENT_ALPHA) == CAIRO_CONTENT_ALPHA) << 31); + if (n == device->current_program) + return; + device->current_program = n; + + FS_BEGIN (); + + if (shader->source.type.fragment == FS_ZERO) { + if (shader->clip.type.fragment == FS_TEXTURE) { + /* XXX need_combine */ + assert (shader->mask.type.fragment == (i915_fragment_shader_t) -1); + i915_fs_dcl (FS_T0); + i915_fs_texld (FS_U0, FS_S0, FS_T0); + if ((shader->content & CAIRO_CONTENT_COLOR) == 0) + i915_fs_mov (FS_OC, i915_fs_operand (FS_U0, W, W, W, W)); + else + i915_fs_mov (FS_OC, i915_fs_operand (FS_U0, ZERO, ZERO, ZERO, W)); + } else { + i915_fs_mov (FS_OC, i915_fs_operand_zero ()); + } + + FS_END (); + return; + } + + num_tex_coords = i915_shader_get_num_tex_coords (shader); + for (n = 0; n < num_tex_coords; n++) + i915_fs_dcl (FS_T0 + n); + + num_samplers = + shader->source.base.n_samplers + + shader->mask.base.n_samplers + + shader->clip.base.n_samplers + + shader->dst.base.n_samplers; + for (n = 0; n < num_samplers; n++) + i915_fs_dcl (FS_S0 + n); + + source_reg = ~0; + source_pure = 0; + out_reg = FS_R0; + if (! shader->need_combine && + shader->mask.type.fragment == (i915_fragment_shader_t) -1 && + shader->clip.type.fragment != FS_TEXTURE && + shader->content != CAIRO_CONTENT_ALPHA) + { + out_reg = FS_OC; + } + + switch (shader->source.type.fragment) { + default: + case FS_ZERO: + case FS_SPANS: + ASSERT_NOT_REACHED; + + case FS_PURE: + source_pure = shader->source.solid.pure; + case FS_ONE: + break; + + case FS_CONSTANT: + source_reg = FS_C0; + constant_offset += 1; + break; + + case FS_DIFFUSE: + i915_fs_dcl (FS_T8); + source_reg = FS_T8; + break; + + case FS_LINEAR: + i915_shader_linear_color (device, shader->source.base.mode, + FS_T0, /* input */ + FS_C0, FS_C1, /* colour ramp */ + FS_U3); /* unpremultiplied output */ + /* XXX can we defer premultiplication? */ + i915_fs_mul (out_reg, + i915_fs_operand_reg (FS_U3), + i915_fs_operand (FS_U3, W, W, W, ONE)); + + constant_offset += 2; + texture_offset += 1; + source_reg = out_reg; + break; + + case FS_RADIAL: + i915_shader_radial_coord (device, shader->source.base.mode, + FS_T0, /* input */ + FS_C0, FS_C1, /* gradient constants */ + FS_R0); /* coordinate */ + + i915_fs_texld (out_reg, FS_S0, FS_R0); + constant_offset += 2; + texture_offset += 1; + sampler_offset += 1; + source_reg = out_reg; + break; + + case FS_TEXTURE: + i915_fs_texld (out_reg, FS_S0, FS_T0); + texture_offset += 1; + sampler_offset += 1; + source_reg = out_reg; + break; + + case FS_YUV: + /* Load samplers to temporaries. */ + i915_fs_texld (FS_R0, FS_S0, FS_T0); + i915_fs_texld (FS_R1, FS_S1, FS_T0); + i915_fs_texld (FS_R2, FS_S2, FS_T0); + + i915_shader_yuv_color (device, + FS_R0, FS_R1, FS_R2, /* y, u, v */ + FS_C0, FS_C1, FS_C2, /* coefficients */ + out_reg); + + constant_offset += 3; + texture_offset += 1; + sampler_offset += 3; + source_reg = out_reg; + break; + } + + mask_reg = ~0; + switch (shader->mask.type.fragment) { + case FS_PURE: + case FS_ZERO: + case FS_YUV: + case FS_DIFFUSE: + ASSERT_NOT_REACHED; + case FS_ONE: + default: + break; + + case FS_SPANS: + mask_reg = FS_T0 + texture_offset; + texture_offset += 1; + break; + + case FS_CONSTANT: + mask_reg = FS_C0 + constant_offset; + constant_offset += 1; + break; + + case FS_LINEAR: + i915_shader_linear_color (device, shader->mask.base.mode, + FS_T0 + texture_offset, /* input */ + FS_C0 + constant_offset, + FS_C0 + constant_offset + 1, /* colour ramp */ + FS_R1); /* unpremultiplied output */ + constant_offset += 2; + texture_offset += 1; + mask_reg = FS_R1; + break; + + case FS_RADIAL: + i915_shader_radial_coord (device, shader->mask.base.mode, + FS_T0 + texture_offset, /* input */ + FS_C0 + constant_offset, + FS_C0 + constant_offset + 1, /* gradient constants */ + FS_R1); /* coordinate */ + + i915_fs_texld (FS_R1, FS_S0 + sampler_offset, FS_R1); + constant_offset += 2; + texture_offset += 1; + sampler_offset += 1; + mask_reg = FS_R1; + break; + + case FS_TEXTURE: + i915_fs_texld (FS_R1, FS_S0 + sampler_offset, FS_T0 + texture_offset); + texture_offset += 1; + sampler_offset += 1; + mask_reg = FS_R1; + break; + } + + if (mask_reg != ~0U) { + if (! shader->need_combine && + shader->clip.type.fragment != FS_TEXTURE && + (shader->content != CAIRO_CONTENT_ALPHA || source_reg == ~0U)) + { + out_reg = FS_OC; + } + if (source_reg == ~0U) { + if (source_pure) { + if (shader->mask.type.fragment == FS_SPANS) { + if (out_reg == FS_OC && shader->content == CAIRO_CONTENT_ALPHA) { + if (source_pure & (1 << 3)) + i915_fs_mov (out_reg, i915_fs_operand (mask_reg, X, X, X, X)); + else + i915_fs_mov (out_reg, i915_fs_operand_zero ()); + } else { + i915_fs_mov (out_reg, + i915_fs_operand_impure (mask_reg, X, source_pure)); + } + } else { + /* XXX ComponentAlpha + i915_fs_mov (out_reg, + i915_fs_operand_pure (mask_reg, + shader->source.solid.pure)); + */ + if (out_reg == FS_OC && shader->content == CAIRO_CONTENT_ALPHA) { + if (source_pure & (1 << 3)) + i915_fs_mov (out_reg, i915_fs_operand (mask_reg, W, W, W, W)); + else + i915_fs_mov (out_reg, i915_fs_operand_zero ()); + } else { + i915_fs_mov (out_reg, + i915_fs_operand_impure (mask_reg, W, source_pure)); + } + } + source_reg = out_reg; + } else if (shader->mask.type.fragment == FS_SPANS) { + i915_fs_mov (out_reg, + i915_fs_operand (mask_reg, X, X, X, X)); + source_reg = out_reg; + } else { + source_reg = mask_reg; + } + } else { + if (shader->mask.type.fragment == FS_SPANS) { + if (out_reg == FS_OC && shader->content == CAIRO_CONTENT_ALPHA) { + i915_fs_mul (out_reg, + i915_fs_operand (source_reg, W, W, W, W), + i915_fs_operand (mask_reg, X, X, X, X)); + } else { + i915_fs_mul (out_reg, + i915_fs_operand_reg (source_reg), + i915_fs_operand (mask_reg, X, X, X, X)); + } + } else { + /* XXX ComponentAlpha + i915_fs_mul (FS_R0, + i915_fs_operand_reg (source_reg), + i915_fs_operand_reg (mask_reg)); + */ + if (out_reg == FS_OC && shader->content == CAIRO_CONTENT_ALPHA) { + i915_fs_mul (out_reg, + i915_fs_operand (source_reg, W, W, W, W), + i915_fs_operand (mask_reg, W, W, W, W)); + } else { + i915_fs_mul (out_reg, + i915_fs_operand_reg (source_reg), + i915_fs_operand (mask_reg, W, W, W, W)); + } + } + + source_reg = out_reg; + } + } + + if (shader->opacity < 1.) { + i915_fs_mul (source_reg, + i915_fs_operand_reg (source_reg), + i915_fs_operand_reg (FS_C0 + constant_offset)); + constant_offset++; + } + + /* need to preserve order of src, mask, clip, dst */ + mask_reg = ~0; + if (shader->clip.type.fragment == FS_TEXTURE) { + i915_fs_texld (FS_R1, FS_S0 + sampler_offset, FS_T0 + texture_offset); + texture_offset += 1; + sampler_offset += 1; + mask_reg = FS_R1; + } + + if (shader->need_combine) { + assert (shader->dst.type.fragment == FS_TEXTURE); + + i915_fs_texld (FS_R2, FS_S0 + sampler_offset, FS_T0 + texture_offset); + texture_offset += 1; + sampler_offset += 1; + dest_reg = FS_R2; + + switch (shader->op) { + case CAIRO_OPERATOR_CLEAR: + case CAIRO_OPERATOR_SOURCE: + ASSERT_NOT_REACHED; + + case CAIRO_OPERATOR_OVER: + if (source_reg == ~0U) { + /* XXX shader->source.type.fragment == FS_PURE */ + dest_reg = FS_OC; + } else { + i915_fs_add (FS_U0, + i915_fs_operand (source_reg, NEG_W, NEG_W, NEG_W, NEG_W), + i915_fs_operand_one ()); + i915_fs_mul (FS_U0, + i915_fs_operand_reg (FS_U0), + dest_reg); + i915_fs_add (FS_R3, + i915_fs_operand_reg (source_reg), + i915_fs_operand_reg (FS_U0)); + source_reg = FS_R3; + } + break; + + case CAIRO_OPERATOR_IN: + if (source_reg == ~0U) { + /* XXX shader->source.type.fragment == FS_PURE */ + source_reg = dest_reg; + } else { + i915_fs_mul (FS_R3, + i915_fs_operand_reg (source_reg), + dest_reg); + source_reg = FS_R3; + } + break; + + case CAIRO_OPERATOR_OUT: + if (source_reg == ~0U) { + /* XXX shader->source.type.fragment == FS_PURE */ + i915_fs_mov (FS_R3, i915_fs_operand_zero ()); + source_reg = FS_R3; + } else { + i915_fs_add (FS_U0, + i915_fs_operand (source_reg, NEG_W, NEG_W, NEG_W, NEG_W), + i915_fs_operand_one ()); + i915_fs_mul (FS_R3, + i915_fs_operand_reg (FS_U0), + dest_reg); + source_reg = FS_R3; + } + break; + + case CAIRO_OPERATOR_ATOP: + + case CAIRO_OPERATOR_DEST: + case CAIRO_OPERATOR_DEST_OVER: + case CAIRO_OPERATOR_DEST_IN: + case CAIRO_OPERATOR_DEST_OUT: + case CAIRO_OPERATOR_DEST_ATOP: + + case CAIRO_OPERATOR_XOR: + case CAIRO_OPERATOR_ADD: + case CAIRO_OPERATOR_SATURATE: + + case CAIRO_OPERATOR_MULTIPLY: + case CAIRO_OPERATOR_SCREEN: + case CAIRO_OPERATOR_OVERLAY: + case CAIRO_OPERATOR_DARKEN: + case CAIRO_OPERATOR_LIGHTEN: + case CAIRO_OPERATOR_COLOR_DODGE: + case CAIRO_OPERATOR_COLOR_BURN: + case CAIRO_OPERATOR_HARD_LIGHT: + case CAIRO_OPERATOR_SOFT_LIGHT: + case CAIRO_OPERATOR_DIFFERENCE: + case CAIRO_OPERATOR_EXCLUSION: + case CAIRO_OPERATOR_HSL_HUE: + case CAIRO_OPERATOR_HSL_SATURATION: + case CAIRO_OPERATOR_HSL_COLOR: + case CAIRO_OPERATOR_HSL_LUMINOSITY: + ASSERT_NOT_REACHED; + break; + } + } + + if (shader->clip.type.fragment == FS_TEXTURE) { + assert (mask_reg != ~0U); + + if (! shader->need_combine) { + /* (source IN clip) */ + if (source_reg == ~0U) { + if (source_pure == 0) { + source_reg = mask_reg; + } else { + out_reg = FS_OC; + if ((shader->content & CAIRO_CONTENT_COLOR) == 0) { + if (source_pure & (1 << 3)) + i915_fs_mov (out_reg, i915_fs_operand (mask_reg, W, W, W, W)); + else + i915_fs_mov (out_reg, i915_fs_operand_zero ()); + } else { + i915_fs_mov (out_reg, + i915_fs_operand_impure (mask_reg, W, source_pure)); + } + source_reg = out_reg; + } + } else if (mask_reg) { + out_reg = FS_OC; + if ((shader->content & CAIRO_CONTENT_COLOR) == 0) { + i915_fs_mul (out_reg, + i915_fs_operand (source_reg, W, W, W, W), + i915_fs_operand (mask_reg, W, W, W, W)); + } else { + i915_fs_mul (out_reg, + i915_fs_operand_reg (source_reg), + i915_fs_operand (mask_reg, W, W, W, W)); + } + + source_reg = out_reg; + } + } else { + /* (source OP dest) LERP_clip dest */ + if (source_reg == ~0U) { + if (source_pure == 0) { + i915_fs_mov (FS_R3, + i915_fs_operand (mask_reg, W, W, W, W)); + } else { + i915_fs_mov (FS_R3, + i915_fs_operand_impure (mask_reg, W, source_pure)); + } + } else { + i915_fs_mul (FS_R3, + i915_fs_operand_reg (source_reg), + i915_fs_operand (mask_reg, W, W, W, W)); + } + + i915_fs_add (mask_reg, + i915_fs_operand_one (), + i915_fs_operand (mask_reg, NEG_W, NEG_W, NEG_W, NEG_W)); + + if (dest_reg != FS_OC) { + if (dest_reg == ~0U) { + assert (shader->dst.type.fragment == FS_TEXTURE); + + i915_fs_texld (FS_R2, FS_S0 + sampler_offset, FS_T0 + texture_offset); + texture_offset += 1; + sampler_offset += 1; + dest_reg = FS_R2; + } + + i915_fs_mul (FS_U1, + i915_fs_operand_reg (dest_reg), + i915_fs_operand_reg (mask_reg)); + mask_reg = FS_U1; + } + + source_reg = FS_OC; + if ((shader->content & CAIRO_CONTENT_COLOR) == 0) { + i915_fs_add (source_reg, + i915_fs_operand (FS_R3, W, W, W, W), + i915_fs_operand (mask_reg, W, W, W, W)); + } else { + i915_fs_add (source_reg, + i915_fs_operand_reg (FS_R3), + i915_fs_operand_reg (mask_reg)); + } + } + } + + if (source_reg != FS_OC) { + if (source_reg == ~0U) { + if (source_pure) { + if ((shader->content & CAIRO_CONTENT_COLOR) == 0) { + if (source_pure & (1 << 3)) + i915_fs_mov (FS_OC, i915_fs_operand_one ()); + else + i915_fs_mov (FS_OC, i915_fs_operand_zero ()); + } else + i915_fs_mov (FS_OC, i915_fs_operand_pure (source_pure)); + } else { + i915_fs_mov (FS_OC, i915_fs_operand_one ()); + } + } else if ((shader->content & CAIRO_CONTENT_COLOR) == 0) { + i915_fs_mov (FS_OC, i915_fs_operand (source_reg, W, W, W, W)); + } else { + i915_fs_mov (FS_OC, i915_fs_operand_reg (source_reg)); + } + } + + FS_END (); +} + +static cairo_bool_t +i915_shader_linear_init (struct i915_shader_linear *l, + const cairo_linear_pattern_t *linear) +{ + double x0, y0, sf; + double dx, dy, offset; + + dx = linear->pd2.x - linear->pd1.x; + dy = linear->pd2.y - linear->pd1.y; + sf = dx * dx + dy * dy; + if (sf <= 1e-5) + return FALSE; + + dx /= sf; + dy /= sf; + + x0 = linear->pd1.x; + y0 = linear->pd1.y; + offset = dx*x0 + dy*y0; + + if (_cairo_matrix_is_identity (&linear->base.base.matrix)) { + l->dx = dx; + l->dy = dy; + l->offset = -offset; + } else { + cairo_matrix_t m; + + cairo_matrix_init (&m, dx, 0, dy, 0, -offset, 0); + cairo_matrix_multiply (&m, &linear->base.base.matrix, &m); + l->dx = m.xx; + l->dy = m.xy; + l->offset = m.x0; + } + + return TRUE; +} + +static cairo_bool_t +i915_shader_linear_contains_rectangle (struct i915_shader_linear *l, + const cairo_rectangle_int_t *extents) +{ + double v; + + v = i915_shader_linear_texcoord (l, + extents->x, + extents->y); + if (v < 0.) + return FALSE; + if (v > 1.) + return FALSE; + + v = i915_shader_linear_texcoord (l, + extents->x + extents->width, + extents->y); + if (v < 0.) + return FALSE; + if (v > 1.) + return FALSE; + + v = i915_shader_linear_texcoord (l, + extents->x, + extents->y + extents->height); + if (v < 0.) + return FALSE; + if (v > 1.) + return FALSE; + + v = i915_shader_linear_texcoord (l, + extents->x + extents->width, + extents->y + extents->height); + if (v < 0.) + return FALSE; + if (v > 1.) + return FALSE; + + return TRUE; +} + +#define is_pure(C,mask) (((mask) == 0) || (C) <= 0x00ff || (C) >= 0xff00) +#define is_one(C,mask) (((mask) != 0) && (C) >= 0xff00) +#define is_zero(C,mask) (((mask) != 0) && (C) <= 0x00ff) + +static cairo_status_t +i915_shader_acquire_solid (i915_shader_t *shader, + union i915_shader_channel *src, + const cairo_solid_pattern_t *solid, + const cairo_rectangle_int_t *extents) +{ + cairo_content_t content; + + content = CAIRO_CONTENT_COLOR_ALPHA; + src->solid.color = solid->color; + if (content == 0 || solid->color.alpha_short <= 0x00ff) + { + src->base.content = CAIRO_CONTENT_ALPHA; + src->type.fragment = FS_ZERO; + } + else if ((((content & CAIRO_CONTENT_COLOR) == 0) || + (solid->color.red_short >= 0xff00 && + solid->color.green_short >= 0xff00 && + solid->color.blue_short >= 0xff00)) && + ((content & CAIRO_CONTENT_ALPHA) == 0 || + solid->color.alpha_short >= 0xff00)) + { + src->base.content = CAIRO_CONTENT_ALPHA; + src->type.fragment = FS_ONE; + } + else if (is_pure (solid->color.red_short, content & CAIRO_CONTENT_COLOR) && + is_pure (solid->color.green_short, content & CAIRO_CONTENT_COLOR) && + is_pure (solid->color.blue_short, content & CAIRO_CONTENT_COLOR) && + is_pure (solid->color.alpha_short, content & CAIRO_CONTENT_ALPHA)) + { + src->solid.pure = 0; + src->solid.pure |= is_one (solid->color.red_short, content & CAIRO_CONTENT_COLOR) << 0; + src->solid.pure |= is_one (solid->color.green_short, content & CAIRO_CONTENT_COLOR) << 1; + src->solid.pure |= is_one (solid->color.blue_short, content & CAIRO_CONTENT_COLOR) << 2; + src->solid.pure |= (! is_zero (solid->color.alpha_short, content & CAIRO_CONTENT_ALPHA)) << 3; + + if (src->solid.pure == 0) { + src->base.content = CAIRO_CONTENT_ALPHA; + src->type.fragment = FS_ZERO; + } else if (src->solid.pure == 0x7) { + src->base.content = CAIRO_CONTENT_ALPHA; + src->type.fragment = FS_ONE; + } else { + src->base.content = content; + src->type.fragment = FS_PURE; + src->base.mode = src->solid.pure; + } + } + else + { + src->base.content = content; + src->type.fragment = src == &shader->source ? FS_DIFFUSE : FS_CONSTANT; + } + src->type.vertex = src->type.fragment == FS_ZERO ? VS_ZERO : VS_CONSTANT; + src->type.pattern = PATTERN_CONSTANT; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_shader_acquire_linear (i915_shader_t *shader, + union i915_shader_channel *src, + const cairo_linear_pattern_t *linear, + const cairo_rectangle_int_t *extents) +{ + cairo_bool_t mode = LINEAR_TEXTURE; + cairo_status_t status; + + if (i915_shader_linear_init (&src->linear, linear) && + linear->base.n_stops == 2 && + linear->base.stops[0].offset == 0.0 && + linear->base.stops[1].offset == 1.0) + { + if (i915_shader_linear_contains_rectangle (&src->linear, + extents)) + { + /* XXX can also lerp if contained within offset range */ + mode = LINEAR_NONE; + } + else switch (linear->base.base.extend) { + case CAIRO_EXTEND_REPEAT: + mode = LINEAR_REPEAT; + break; + case CAIRO_EXTEND_PAD: + mode = LINEAR_PAD; + break; + case CAIRO_EXTEND_NONE: + break; + case CAIRO_EXTEND_REFLECT: + break; + default: + ASSERT_NOT_REACHED; + break; + } + } + + src->type.vertex = VS_LINEAR; + src->type.pattern = PATTERN_LINEAR; + src->base.texfmt = TEXCOORDFMT_1D; + src->base.content = CAIRO_CONTENT_COLOR_ALPHA; + src->base.mode = mode; + if (mode == LINEAR_TEXTURE) { + intel_buffer_t buffer; + + status = intel_gradient_render ((intel_device_t *) shader->target->intel.drm.base.device, + &linear->base, &buffer); + if (unlikely (status)) + return status; + + src->type.fragment = FS_TEXTURE; + src->base.bo = intel_bo_reference (buffer.bo); + src->base.n_samplers = 1; + src->base.offset[0] = buffer.offset; + src->base.map[0] = buffer.map0; + src->base.map[1] = buffer.map1; + src->base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (CAIRO_FILTER_BILINEAR); + src->base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (linear->base.base.extend); + } else { + src->type.fragment = FS_LINEAR; + src->linear.color0.red = linear->base.stops[0].color.red; + src->linear.color0.green = linear->base.stops[0].color.green; + src->linear.color0.blue = linear->base.stops[0].color.blue; + src->linear.color0.alpha = linear->base.stops[0].color.alpha; + + src->linear.color1.red = linear->base.stops[1].color.red; + src->linear.color1.green = linear->base.stops[1].color.green; + src->linear.color1.blue = linear->base.stops[1].color.blue; + src->linear.color1.alpha = linear->base.stops[1].color.alpha; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_shader_acquire_radial (i915_shader_t *shader, + union i915_shader_channel *src, + const cairo_radial_pattern_t *radial, + const cairo_rectangle_int_t *extents) +{ + intel_buffer_t buffer; + cairo_status_t status; + + status = intel_gradient_render ((intel_device_t *) shader->target->intel.drm.base.device, + &radial->base, &buffer); + if (unlikely (status)) + return status; + + i915_shader_radial_init (&src->radial, radial); + + src->type.vertex = VS_TEXTURE; + src->type.fragment = FS_RADIAL; + src->type.pattern = PATTERN_RADIAL; + src->base.texfmt = TEXCOORDFMT_2D; + + src->base.content = CAIRO_CONTENT_COLOR_ALPHA; + src->base.bo = intel_bo_reference (buffer.bo); + src->base.n_samplers = 1; + src->base.offset[0] = buffer.offset; + src->base.map[0] = buffer.map0; + src->base.map[1] = buffer.map1; + src->base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (CAIRO_FILTER_BILINEAR); + src->base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (radial->base.base.extend); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_surface_clone (i915_device_t *device, + cairo_image_surface_t *image, + i915_surface_t **clone_out) +{ + i915_surface_t *clone; + cairo_status_t status; + +#if 0 + clone = + i915_surface_create_from_cacheable_image_internal (device, image); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; +#else + cairo_format_t format; + + format = image->format; + if (format == CAIRO_FORMAT_A1) + format = CAIRO_FORMAT_A8; + + clone = (i915_surface_t *) + i915_surface_create_internal (&device->intel.base, + format, + image->width, + image->height, + I915_TILING_DEFAULT, + FALSE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + status = intel_bo_put_image (&device->intel, + to_intel_bo (clone->intel.drm.bo), + image, + 0, 0, + image->width, image->height, + 0, 0); + + if (unlikely (status)) + return status; +#endif + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_surface_clone_subimage (i915_device_t *device, + cairo_image_surface_t *image, + const cairo_rectangle_int_t *extents, + i915_surface_t **clone_out) +{ + i915_surface_t *clone; + cairo_status_t status; + cairo_format_t format; + + format = image->format; + if (format == CAIRO_FORMAT_A1) + format = CAIRO_FORMAT_A8; + + clone = (i915_surface_t *) + i915_surface_create_internal (&device->intel.base, + format, + extents->width, + extents->height, + I915_TILING_NONE, + FALSE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + status = intel_bo_put_image (&device->intel, + to_intel_bo (clone->intel.drm.bo), + image, + extents->x, extents->y, + extents->width, extents->height, + 0, 0); + + if (unlikely (status)) + return status; + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_surface_render_pattern (i915_device_t *device, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + i915_surface_t **clone_out) +{ + i915_surface_t *clone; + cairo_surface_t *image; + cairo_status_t status; + void *ptr; + + clone = (i915_surface_t *) + i915_surface_create_internal (&device->intel.base, + _cairo_format_from_content (pattern->surface->content), + extents->width, + extents->height, + I915_TILING_NONE, + FALSE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + ptr = intel_bo_map (&device->intel, + to_intel_bo (clone->intel.drm.bo)); + if (unlikely (ptr == NULL)) { + cairo_surface_destroy (&clone->intel.drm.base); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + image = cairo_image_surface_create_for_data (ptr, + clone->intel.drm.format, + clone->intel.drm.width, + clone->intel.drm.height, + clone->intel.drm.stride); + if (unlikely (image->status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return image->status; + } + + status = _cairo_surface_offset_paint (image, + extents->x, extents->y, + CAIRO_OPERATOR_SOURCE, + &pattern->base, + NULL); + cairo_surface_destroy (image); + + if (unlikely (status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return status; + } + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_shader_acquire_solid_surface (i915_shader_t *shader, + union i915_shader_channel *src, + cairo_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_pattern_t pattern; + cairo_surface_t *pixel; + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + uint32_t argb; + + status = _cairo_surface_acquire_source_image (surface, &image, &image_extra); + if (unlikely (status)) + return status; + + /* extract the pixel as argb32 */ + pixel = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + _cairo_pattern_init_for_surface (&pattern, &image->base); + cairo_matrix_init_translate (&pattern.base.matrix, extents->x, extents->y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (pixel, CAIRO_OPERATOR_SOURCE, &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + + _cairo_surface_release_source_image (surface, image, image_extra); + + if (unlikely (status)) { + cairo_surface_destroy (pixel); + return status; + } + + image = (cairo_image_surface_t *) pixel; + argb = *(uint32_t *) image->data; + cairo_surface_destroy (pixel); + + if (argb >> 24 == 0) { + _cairo_color_init_rgba (&src->solid.color, 0, 0, 0, 0); + } else { + uint8_t alpha = argb >> 24; + + _cairo_color_init_rgba (&src->solid.color, + ((((argb >> 16) & 0xff) * 255 + alpha / 2) / alpha) / 255., + ((((argb >> 8) & 0xff) * 255 + alpha / 2) / alpha) / 255., + ((((argb >> 0) & 0xff) * 255 + alpha / 2) / alpha) / 255., + alpha / 255.); + } + + src->base.content = CAIRO_CONTENT_COLOR_ALPHA; + src->type.fragment = FS_CONSTANT; + src->type.vertex = VS_CONSTANT; + src->type.pattern = PATTERN_CONSTANT; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_shader_acquire_surface (i915_shader_t *shader, + union i915_shader_channel *src, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + int surface_width, surface_height; + cairo_surface_t *surface, *drm; + cairo_extend_t extend; + cairo_filter_t filter; + cairo_matrix_t m; + int src_x = 0, src_y = 0; + cairo_surface_t *free_me = NULL; + cairo_status_t status; + cairo_rectangle_int_t sample; + + assert (src->type.fragment == (i915_fragment_shader_t) -1); + drm = surface = pattern->surface; + + extend = pattern->base.extend; + src->base.matrix = pattern->base.matrix; + filter = pattern->base.filter; + _cairo_pattern_sampled_area(&pattern->base, extents, sample); + + if (surface->type == CAIRO_SURFACE_TYPE_DRM) { + if (surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + drm = ((cairo_surface_subsurface_t *) surface)->target; + } else if (surface->backend->type == CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT) { + drm = ((cairo_surface_snapshot_t *) surface)->target; + } + } + + if (drm->type == CAIRO_SURFACE_TYPE_DRM) { + i915_surface_t *s = (i915_surface_t *) drm; + + if (surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + if (s->intel.drm.base.device == shader->target->intel.drm.base.device && + s != shader->target) + { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) surface; + int x; + + status = i915_surface_fallback_flush (s); + if (unlikely (status)) + return status; + + /* XXX blt subimage and cache snapshot */ + + if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) { + /* XXX pipelined flush of RENDER/TEXTURE cache */ + } + + src->type.fragment = FS_TEXTURE; + src->surface.pixel = NONE; + surface_width = sub->extents.width; + surface_height = sub->extents.height; + + src->base.bo = intel_bo_reference (to_intel_bo (s->intel.drm.bo)); + src->base.n_samplers = 1; + + x = sub->extents.x; + if (s->intel.drm.format != CAIRO_FORMAT_A8) + x *= 4; + + /* XXX tiling restrictions upon offset? */ + src->base.offset[0] = s->offset + sub->extents.y * s->intel.drm.stride + x; + src->base.map[0] = s->map0; + src->base.map[0] &= ~((2047 << MS3_HEIGHT_SHIFT) | (2047 << MS3_WIDTH_SHIFT)); + src->base.map[0] |= + ((sub->extents.height - 1) << MS3_HEIGHT_SHIFT) | + ((sub->extents.width - 1) << MS3_WIDTH_SHIFT); + src->base.map[1] = (s->intel.drm.stride / 4 - 1) << MS4_PITCH_SHIFT; + } + } else { + /* XXX if s == shader->dst allow if FILTER_NEAREST, EXTEND_NONE? */ + if (s->intel.drm.base.device == shader->target->intel.drm.base.device) { + status = i915_surface_fallback_flush (s); + if (unlikely (status)) + return status; + + if (s == shader->target || i915_surface_needs_tiling (s)) { + status = i915_surface_copy_subimage (i915_device (shader->target), + s, &sample, TRUE, &s); + if (unlikely (status)) + return status; + + free_me = drm = &s->intel.drm.base; + } + + src->type.fragment = FS_TEXTURE; + src->surface.pixel = NONE; + + surface_width = s->intel.drm.width; + surface_height = s->intel.drm.height; + + src->base.bo = intel_bo_reference (to_intel_bo (s->intel.drm.bo)); + src->base.n_samplers = 1; + src->base.offset[0] = s->offset; + src->base.map[0] = s->map0; + src->base.map[1] = s->map1; + } + } + } + + if (src->type.fragment == (i915_fragment_shader_t) -1) { + i915_surface_t *s; + + if (extents->width == 1 && extents->height == 1) { + return i915_shader_acquire_solid_surface (shader, src, + surface, extents); + } + + s = (i915_surface_t *) + _cairo_surface_has_snapshot (surface, + shader->target->intel.drm.base.backend); + if (s == NULL) { + cairo_status_t status; + +#if 0 + /* XXX hackity hack hack */ + status = i915_clone_yuv (surface, src, + image->width, image->height, + clone_out); +#endif + + if (sample.width > 2048 || sample.height > 2048) { + status = i915_surface_render_pattern (i915_device (shader->target), + pattern, extents, + &s); + if (unlikely (status)) + return status; + + extend = CAIRO_EXTEND_NONE; + filter = CAIRO_FILTER_NEAREST; + cairo_matrix_init_translate (&src->base.matrix, + -extents->x, -extents->y); + } else { + cairo_image_surface_t *image; + void *image_extra; + + status = _cairo_surface_acquire_source_image (surface, &image, &image_extra); + if (unlikely (status)) + return status; + + if (image->width < 2048 && + image->height < 2048 && + sample.width >= image->width / 4 && + sample.height >= image->height /4) + { + + status = i915_surface_clone (i915_device (shader->target), + image, &s); + + if (likely (status == CAIRO_STATUS_SUCCESS)) { + _cairo_surface_attach_snapshot (surface, + &s->intel.drm.base, + intel_surface_detach_snapshot); + + status = intel_snapshot_cache_insert (&i915_device (shader->target)->intel, + &s->intel); + if (unlikely (status)) { + cairo_surface_finish (&s->intel.drm.base); + cairo_surface_destroy (&s->intel.drm.base); + } + } + } + else + { + status = i915_surface_clone_subimage (i915_device (shader->target), + image, &sample, &s); + src_x = -extents->x; + src_y = -extents->y; + } + + _cairo_surface_release_source_image (surface, image, image_extra); + if (unlikely (status)) + return status; + } + + free_me = &s->intel.drm.base; + } + + src->type.fragment = FS_TEXTURE; + src->surface.pixel = NONE; + + src->base.bo = intel_bo_reference (to_intel_bo (s->intel.drm.bo)); + src->base.n_samplers = 1; + src->base.offset[0] = s->offset; + src->base.map[0] = s->map0; + src->base.map[1] = s->map1; + + drm = &s->intel.drm.base; + + surface_width = s->intel.drm.width; + surface_height = s->intel.drm.height; + } + + /* XXX transform nx1 or 1xn surfaces to 1D */ + + src->type.pattern = PATTERN_TEXTURE; + if (extend != CAIRO_EXTEND_NONE && + sample.x >= 0 && sample.y >= 0 && + sample.x + sample.width <= surface_width && + sample.y + sample.height <= surface_height) + { + extend = CAIRO_EXTEND_NONE; + } + if (extend == CAIRO_EXTEND_NONE) { + src->type.vertex = VS_TEXTURE_16; + src->base.texfmt = TEXCOORDFMT_2D_16; + } else { + src->type.vertex = VS_TEXTURE; + src->base.texfmt = TEXCOORDFMT_2D; + } + src->base.content = drm->content; + + src->base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (filter); + src->base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (extend); + + /* tweak the src matrix to map from dst to texture coordinates */ + if (src_x | src_y) + cairo_matrix_translate (&src->base.matrix, src_x, src_x); + cairo_matrix_init_scale (&m, 1. / surface_width, 1. / surface_height); + cairo_matrix_multiply (&src->base.matrix, &src->base.matrix, &m); + + if (free_me != NULL) + cairo_surface_destroy (free_me); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +i915_shader_acquire_pattern (i915_shader_t *shader, + union i915_shader_channel *src, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return i915_shader_acquire_solid (shader, src, + (cairo_solid_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_LINEAR: + return i915_shader_acquire_linear (shader, src, + (cairo_linear_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_RADIAL: + return i915_shader_acquire_radial (shader, src, + (cairo_radial_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_SURFACE: + return i915_shader_acquire_surface (shader, src, + (cairo_surface_pattern_t *) pattern, + extents); + + default: + ASSERT_NOT_REACHED; + return CAIRO_STATUS_SUCCESS; + } +} + +static uint32_t +i915_get_blend (cairo_operator_t op, + i915_surface_t *dst) +{ +#define SBLEND(X) ((BLENDFACT_##X) << S6_CBUF_SRC_BLEND_FACT_SHIFT) +#define DBLEND(X) ((BLENDFACT_##X) << S6_CBUF_DST_BLEND_FACT_SHIFT) + static const struct blendinfo { + cairo_bool_t dst_alpha; + uint32_t src_blend; + uint32_t dst_blend; + enum { + BOUNDED, + SIMPLE, + XRENDER, + } kind; + } i915_blend_op[] = { + {0, SBLEND (ZERO), DBLEND (ZERO), BOUNDED}, /* Clear */ + {0, SBLEND (ONE), DBLEND (ZERO), BOUNDED}, /* Src */ + + {0, SBLEND (ONE), DBLEND (INV_SRC_ALPHA), SIMPLE}, /* Over */ + {1, SBLEND (DST_ALPHA), DBLEND (ZERO), XRENDER}, /* In */ + {1, SBLEND (INV_DST_ALPHA), DBLEND (ZERO), XRENDER}, /* Out */ + {1, SBLEND (DST_ALPHA), DBLEND (INV_SRC_ALPHA), SIMPLE}, /* Atop */ + + {0, SBLEND (ZERO), DBLEND (ONE), SIMPLE}, /* Dst */ + {1, SBLEND (INV_DST_ALPHA), DBLEND (ONE), SIMPLE}, /* OverReverse */ + {0, SBLEND (ZERO), DBLEND (SRC_ALPHA), XRENDER}, /* InReverse */ + {0, SBLEND (ZERO), DBLEND (INV_SRC_ALPHA), SIMPLE}, /* OutReverse */ + {1, SBLEND (INV_DST_ALPHA), DBLEND (SRC_ALPHA), XRENDER}, /* AtopReverse */ + + {1, SBLEND (INV_DST_ALPHA), DBLEND (INV_SRC_ALPHA), SIMPLE}, /* Xor */ + {0, SBLEND (ONE), DBLEND (ONE), SIMPLE}, /* Add */ + //{0, 0, SBLEND (SRC_ALPHA_SATURATE), DBLEND (ONE), SIMPLE}, /* XXX Saturate */ + }; + uint32_t sblend, dblend; + + if (op >= ARRAY_LENGTH (i915_blend_op)) + return 0; + + if (i915_blend_op[op].kind == BOUNDED) + return 0; + + sblend = i915_blend_op[op].src_blend; + dblend = i915_blend_op[op].dst_blend; + + /* If there's no dst alpha channel, adjust the blend op so that we'll treat + * it as always 1. + */ + if ((dst->intel.drm.base.content & CAIRO_CONTENT_ALPHA) == 0 && + i915_blend_op[op].dst_alpha) + { + if (sblend == SBLEND (DST_ALPHA)) + sblend = SBLEND (ONE); + else if (sblend == SBLEND (INV_DST_ALPHA)) + sblend = SBLEND (ZERO); + } + + /* i915 engine reads 8bit color buffer into green channel in cases + like color buffer blending etc., and also writes back green channel. + So with dst_alpha blend we should use color factor. See spec on + "8-bit rendering" */ + if (dst->intel.drm.format == CAIRO_FORMAT_A8 && i915_blend_op[op].dst_alpha) { + if (sblend == SBLEND (DST_ALPHA)) + sblend = SBLEND (DST_COLR); + else if (sblend == SBLEND (INV_DST_ALPHA)) + sblend = SBLEND (INV_DST_COLR); + } + + return sblend | dblend; +#undef SBLEND +#undef DBLEND +} + +static void +i915_shader_channel_init (union i915_shader_channel *channel) +{ + channel->type.vertex = (i915_vertex_shader_t) -1; + channel->type.fragment = (i915_fragment_shader_t) -1; + channel->type.pattern = (i915_shader_channel_t) -1; + channel->base.texfmt = TEXCOORDFMT_NOT_PRESENT; + channel->base.bo = NULL; + channel->base.n_samplers = 0; + channel->base.mode = 0; +} + +static void +i915_shader_channel_fini (i915_device_t *device, + union i915_shader_channel *channel) +{ + switch (channel->type.pattern) { + case PATTERN_TEXTURE: + case PATTERN_BASE: + case PATTERN_LINEAR: + case PATTERN_RADIAL: + if (channel->base.bo != NULL) + intel_bo_destroy (&device->intel, channel->base.bo); + break; + + default: + case PATTERN_CONSTANT: + break; + } +} + +static void +i915_shader_channel_reset (i915_device_t *device, + union i915_shader_channel *channel) +{ + i915_shader_channel_fini (device, channel); + i915_shader_channel_init (channel); +} + +void +i915_shader_init (i915_shader_t *shader, + i915_surface_t *dst, + cairo_operator_t op, + double opacity) +{ + shader->committed = FALSE; + shader->device = i915_device (dst); + shader->target = dst; + shader->op = op; + shader->opacity = opacity; + + shader->blend = i915_get_blend (op, dst); + shader->need_combine = FALSE; + + shader->content = dst->intel.drm.base.content; + + i915_shader_channel_init (&shader->source); + i915_shader_channel_init (&shader->mask); + i915_shader_channel_init (&shader->clip); + i915_shader_channel_init (&shader->dst); +} + +static void +i915_set_shader_samplers (i915_device_t *device, + const i915_shader_t *shader) +{ + uint32_t n_samplers, n_maps, n; + uint32_t samplers[2*4]; + uint32_t maps[4*4]; + uint32_t mask, s, m; + + n_maps = + shader->source.base.n_samplers + + shader->mask.base.n_samplers + + shader->clip.base.n_samplers + + shader->dst.base.n_samplers; + assert (n_maps <= 4); + + if (n_maps == 0) + return; + + n_samplers = + !! shader->source.base.bo + + !! shader->mask.base.bo + + !! shader->clip.base.bo + + !! shader->dst.base.bo; + + mask = (1 << n_maps) - 1; + + /* We check for repeated setting of sample state mainly to catch + * continuation of text strings across multiple show-glyphs. + */ + s = m = 0; + if (shader->source.base.bo != NULL) { + samplers[s++] = shader->source.base.sampler[0]; + samplers[s++] = shader->source.base.sampler[1]; + maps[m++] = shader->source.base.bo->base.handle; + for (n = 0; n < shader->source.base.n_samplers; n++) { + maps[m++] = shader->source.base.offset[n]; + maps[m++] = shader->source.base.map[2*n+0]; + maps[m++] = shader->source.base.map[2*n+1]; + } + } + if (shader->mask.base.bo != NULL) { + samplers[s++] = shader->mask.base.sampler[0]; + samplers[s++] = shader->mask.base.sampler[1]; + maps[m++] = shader->mask.base.bo->base.handle; + for (n = 0; n < shader->mask.base.n_samplers; n++) { + maps[m++] = shader->mask.base.offset[n]; + maps[m++] = shader->mask.base.map[2*n+0]; + maps[m++] = shader->mask.base.map[2*n+1]; + } + } + if (shader->clip.base.bo != NULL) { + samplers[s++] = shader->clip.base.sampler[0]; + samplers[s++] = shader->clip.base.sampler[1]; + maps[m++] = shader->clip.base.bo->base.handle; + for (n = 0; n < shader->clip.base.n_samplers; n++) { + maps[m++] = shader->clip.base.offset[n]; + maps[m++] = shader->clip.base.map[2*n+0]; + maps[m++] = shader->clip.base.map[2*n+1]; + } + } + if (shader->dst.base.bo != NULL) { + samplers[s++] = shader->dst.base.sampler[0]; + samplers[s++] = shader->dst.base.sampler[1]; + maps[m++] = shader->dst.base.bo->base.handle; + for (n = 0; n < shader->dst.base.n_samplers; n++) { + maps[m++] = shader->dst.base.offset[n]; + maps[m++] = shader->dst.base.map[2*n+0]; + maps[m++] = shader->dst.base.map[2*n+1]; + } + } + + if (n_maps > device->current_n_maps || + memcmp (device->current_maps, + maps, + m * sizeof (uint32_t))) + { + memcpy (device->current_maps, maps, m * sizeof (uint32_t)); + device->current_n_maps = n_maps; + + if (device->current_source != NULL) + *device->current_source = 0; + if (device->current_mask != NULL) + *device->current_mask = 0; + if (device->current_clip != NULL) + *device->current_clip = 0; + +#if 0 + if (shader->source.type.pattern == PATTERN_TEXTURE) { + switch ((int) shader->source.surface.surface->type) { + case CAIRO_SURFACE_TYPE_DRM: + { + i915_surface_t *surface = + (i915_surface_t *) shader->source.surface.surface; + device->current_source = &surface->is_current_texture; + surface->is_current_texture |= CURRENT_SOURCE; + break; + } + + case I915_PACKED_PIXEL_SURFACE_TYPE: + { + i915_packed_pixel_surface_t *surface = + (i915_packed_pixel_surface_t *) shader->source.surface.surface; + device->current_source = &surface->is_current_texture; + surface->is_current_texture |= CURRENT_SOURCE; + break; + } + + default: + device->current_source = NULL; + break; + } + } else + device->current_source = NULL; + + if (shader->mask.type.pattern == PATTERN_TEXTURE) { + switch ((int) shader->mask.surface.surface->type) { + case CAIRO_SURFACE_TYPE_DRM: + { + i915_surface_t *surface = + (i915_surface_t *) shader->mask.surface.surface; + device->current_mask = &surface->is_current_texture; + surface->is_current_texture |= CURRENT_MASK; + break; + } + + case I915_PACKED_PIXEL_SURFACE_TYPE: + { + i915_packed_pixel_surface_t *surface = + (i915_packed_pixel_surface_t *) shader->mask.surface.surface; + device->current_mask = &surface->is_current_texture; + surface->is_current_texture |= CURRENT_MASK; + break; + } + + default: + device->current_mask = NULL; + break; + } + } else + device->current_mask = NULL; +#endif + + OUT_DWORD (_3DSTATE_MAP_STATE | (3 * n_maps)); + OUT_DWORD (mask); + for (n = 0; n < shader->source.base.n_samplers; n++) { + i915_batch_emit_reloc (device, shader->source.base.bo, + shader->source.base.offset[n], + I915_GEM_DOMAIN_SAMPLER, 0, + FALSE); + OUT_DWORD (shader->source.base.map[2*n+0]); + OUT_DWORD (shader->source.base.map[2*n+1]); + } + for (n = 0; n < shader->mask.base.n_samplers; n++) { + i915_batch_emit_reloc (device, shader->mask.base.bo, + shader->mask.base.offset[n], + I915_GEM_DOMAIN_SAMPLER, 0, + FALSE); + OUT_DWORD (shader->mask.base.map[2*n+0]); + OUT_DWORD (shader->mask.base.map[2*n+1]); + } + for (n = 0; n < shader->clip.base.n_samplers; n++) { + i915_batch_emit_reloc (device, shader->clip.base.bo, + shader->clip.base.offset[n], + I915_GEM_DOMAIN_SAMPLER, 0, + FALSE); + OUT_DWORD (shader->clip.base.map[2*n+0]); + OUT_DWORD (shader->clip.base.map[2*n+1]); + } + for (n = 0; n < shader->dst.base.n_samplers; n++) { + i915_batch_emit_reloc (device, shader->dst.base.bo, + shader->dst.base.offset[n], + I915_GEM_DOMAIN_SAMPLER, 0, + FALSE); + OUT_DWORD (shader->dst.base.map[2*n+0]); + OUT_DWORD (shader->dst.base.map[2*n+1]); + } + } + + if (n_samplers > device->current_n_samplers || + memcmp (device->current_samplers, + samplers, + s * sizeof (uint32_t))) + { + device->current_n_samplers = s; + memcpy (device->current_samplers, samplers, s * sizeof (uint32_t)); + + OUT_DWORD (_3DSTATE_SAMPLER_STATE | (3 * n_maps)); + OUT_DWORD (mask); + s = 0; + for (n = 0; n < shader->source.base.n_samplers; n++) { + OUT_DWORD (shader->source.base.sampler[0]); + OUT_DWORD (shader->source.base.sampler[1] | + (s << SS3_TEXTUREMAP_INDEX_SHIFT)); + OUT_DWORD (0x0); + s++; + } + for (n = 0; n < shader->mask.base.n_samplers; n++) { + OUT_DWORD (shader->mask.base.sampler[0]); + OUT_DWORD (shader->mask.base.sampler[1] | + (s << SS3_TEXTUREMAP_INDEX_SHIFT)); + OUT_DWORD (0x0); + s++; + } + for (n = 0; n < shader->clip.base.n_samplers; n++) { + OUT_DWORD (shader->clip.base.sampler[0]); + OUT_DWORD (shader->clip.base.sampler[1] | + (s << SS3_TEXTUREMAP_INDEX_SHIFT)); + OUT_DWORD (0x0); + s++; + } + for (n = 0; n < shader->dst.base.n_samplers; n++) { + OUT_DWORD (shader->dst.base.sampler[0]); + OUT_DWORD (shader->dst.base.sampler[1] | + (s << SS3_TEXTUREMAP_INDEX_SHIFT)); + OUT_DWORD (0x0); + s++; + } + } +} + +static uint32_t +i915_shader_get_texcoords (const i915_shader_t *shader) +{ + uint32_t texcoords; + uint32_t tu; + + texcoords = S2_TEXCOORD_NONE; + tu = 0; + if (shader->source.base.texfmt != TEXCOORDFMT_NOT_PRESENT) { + texcoords &= ~S2_TEXCOORD_FMT (tu, S2_TEXCOORD_FMT0_MASK); + texcoords |= S2_TEXCOORD_FMT (tu, shader->source.base.texfmt); + tu++; + } + if (shader->mask.base.texfmt != TEXCOORDFMT_NOT_PRESENT) { + texcoords &= ~S2_TEXCOORD_FMT (tu, S2_TEXCOORD_FMT0_MASK); + texcoords |= S2_TEXCOORD_FMT (tu, shader->mask.base.texfmt); + tu++; + } + if (shader->clip.base.texfmt != TEXCOORDFMT_NOT_PRESENT) { + texcoords &= ~S2_TEXCOORD_FMT (tu, S2_TEXCOORD_FMT0_MASK); + texcoords |= S2_TEXCOORD_FMT (tu, shader->clip.base.texfmt); + tu++; + } + if (shader->dst.base.texfmt != TEXCOORDFMT_NOT_PRESENT) { + texcoords &= ~S2_TEXCOORD_FMT (tu, S2_TEXCOORD_FMT0_MASK); + texcoords |= S2_TEXCOORD_FMT (tu, shader->dst.base.texfmt); + tu++; + } + + return texcoords; +} + +static void +i915_set_shader_mode (i915_device_t *device, + const i915_shader_t *shader) +{ + uint32_t texcoords; + uint32_t mask, cnt; + + texcoords = i915_shader_get_texcoords (shader); + + mask = cnt = 0; + + if (device->current_texcoords != texcoords) + mask |= I1_LOAD_S (2), cnt++; + + if (device->current_blend != shader->blend) + mask |= I1_LOAD_S (6), cnt++; + + if (cnt == 0) + return; + + OUT_DWORD (_3DSTATE_LOAD_STATE_IMMEDIATE_1 | mask | (cnt-1)); + + if (device->current_texcoords != texcoords) { + OUT_DWORD (texcoords); + device->current_texcoords = texcoords; + } + + if (device->current_blend != shader->blend) { + if (shader->blend) { + OUT_DWORD (S6_CBUF_BLEND_ENABLE | S6_COLOR_WRITE_ENABLE | + (BLENDFUNC_ADD << S6_CBUF_BLEND_FUNC_SHIFT) | + shader->blend); + } else { + OUT_DWORD (S6_COLOR_WRITE_ENABLE); + } + + device->current_blend = shader->blend; + } +} + +static void +i915_set_constants (i915_device_t *device, + const uint32_t *constants, + uint32_t n_constants) +{ + uint32_t n; + + OUT_DWORD (_3DSTATE_PIXEL_SHADER_CONSTANTS | n_constants); + OUT_DWORD ((1 << (n_constants >> 2)) - 1); + + for (n = 0; n < n_constants; n++) + OUT_DWORD (constants[n]); + + device->current_n_constants = n_constants; + memcpy (device->current_constants, constants, n_constants*4); +} + +static uint32_t +pack_constants (const union i915_shader_channel *channel, + uint32_t *constants) +{ + uint32_t count = 0, n; + + switch (channel->type.fragment) { + case FS_ZERO: + case FS_ONE: + case FS_PURE: + case FS_DIFFUSE: + break; + + case FS_CONSTANT: + constants[count++] = pack_float (channel->solid.color.red); + constants[count++] = pack_float (channel->solid.color.green); + constants[count++] = pack_float (channel->solid.color.blue); + constants[count++] = pack_float (channel->solid.color.alpha); + break; + + case FS_LINEAR: + constants[count++] = pack_float (channel->linear.color0.red); + constants[count++] = pack_float (channel->linear.color0.green); + constants[count++] = pack_float (channel->linear.color0.blue); + constants[count++] = pack_float (channel->linear.color0.alpha); + + constants[count++] = pack_float (channel->linear.color1.red); + constants[count++] = pack_float (channel->linear.color1.green); + constants[count++] = pack_float (channel->linear.color1.blue); + constants[count++] = pack_float (channel->linear.color1.alpha); + break; + + case FS_RADIAL: + for (n = 0; n < ARRAY_LENGTH (channel->radial.constants); n++) + constants[count++] = pack_float (channel->radial.constants[n]); + break; + + case FS_TEXTURE: + case FS_YUV: + case FS_SPANS: + break; + } + + return count; +} + +static void +i915_set_shader_constants (i915_device_t *device, + const i915_shader_t *shader) +{ + uint32_t constants[4*4*3+4]; + unsigned n_constants; + + n_constants = 0; + if (shader->source.type.fragment == FS_DIFFUSE) { + uint32_t diffuse; + + diffuse = + ((shader->source.solid.color.alpha_short >> 8) << 24) | + ((shader->source.solid.color.red_short >> 8) << 16) | + ((shader->source.solid.color.green_short >> 8) << 8) | + ((shader->source.solid.color.blue_short >> 8) << 0); + + if (diffuse != device->current_diffuse) { + OUT_DWORD (_3DSTATE_DFLT_DIFFUSE_CMD); + OUT_DWORD (diffuse); + device->current_diffuse = diffuse; + } + } else { + n_constants += pack_constants (&shader->source, constants + n_constants); + } + n_constants += pack_constants (&shader->mask, constants + n_constants); + + if (shader->opacity < 1.) { + constants[n_constants+0] = + constants[n_constants+1] = + constants[n_constants+2] = + constants[n_constants+3] = pack_float (shader->opacity); + n_constants += 4; + } + + if (n_constants != 0 && + (device->current_n_constants != n_constants || + memcmp (device->current_constants, constants, n_constants*4))) + { + i915_set_constants (device, constants, n_constants); + } +} + +static cairo_bool_t +i915_shader_needs_update (const i915_shader_t *shader, + const i915_device_t *device) +{ + uint32_t count, n; + uint32_t buf[64]; + + if (device->current_target != shader->target) + return TRUE; + + count = + !! shader->source.base.bo + + !! shader->mask.base.bo + + !! shader->clip.base.bo + + !! shader->dst.base.bo; + if (count > device->current_n_samplers) + return TRUE; + + count = + shader->source.base.n_samplers + + shader->mask.base.n_samplers + + shader->clip.base.n_samplers + + shader->dst.base.n_samplers; + if (count > device->current_n_maps) + return TRUE; + + if (count) { + count = 0; + if (shader->source.base.bo != NULL) { + buf[count++] = shader->source.base.sampler[0]; + buf[count++] = shader->source.base.sampler[1]; + } + if (shader->mask.base.bo != NULL) { + buf[count++] = shader->mask.base.sampler[0]; + buf[count++] = shader->mask.base.sampler[1]; + } + if (shader->clip.base.bo != NULL) { + buf[count++] = shader->clip.base.sampler[0]; + buf[count++] = shader->clip.base.sampler[1]; + } + if (shader->dst.base.bo != NULL) { + buf[count++] = shader->dst.base.sampler[0]; + buf[count++] = shader->dst.base.sampler[1]; + } + if (memcmp (device->current_samplers, buf, count * sizeof (uint32_t))) + return TRUE; + + count = 0; + if (shader->source.base.bo != NULL) { + buf[count++] = shader->source.base.bo->base.handle; + for (n = 0; n < shader->source.base.n_samplers; n++) { + buf[count++] = shader->source.base.offset[n]; + buf[count++] = shader->source.base.map[2*n+0]; + buf[count++] = shader->source.base.map[2*n+1]; + } + } + if (shader->mask.base.bo != NULL) { + buf[count++] = shader->mask.base.bo->base.handle; + for (n = 0; n < shader->mask.base.n_samplers; n++) { + buf[count++] = shader->mask.base.offset[n]; + buf[count++] = shader->mask.base.map[2*n+0]; + buf[count++] = shader->mask.base.map[2*n+1]; + } + } + if (shader->clip.base.bo != NULL) { + buf[count++] = shader->clip.base.bo->base.handle; + for (n = 0; n < shader->clip.base.n_samplers; n++) { + buf[count++] = shader->clip.base.offset[n]; + buf[count++] = shader->clip.base.map[2*n+0]; + buf[count++] = shader->clip.base.map[2*n+1]; + } + } + if (shader->dst.base.bo != NULL) { + buf[count++] = shader->dst.base.bo->base.handle; + for (n = 0; n < shader->dst.base.n_samplers; n++) { + buf[count++] = shader->dst.base.offset[n]; + buf[count++] = shader->dst.base.map[2*n+0]; + buf[count++] = shader->dst.base.map[2*n+1]; + } + } + if (memcmp (device->current_maps, buf, count * sizeof (uint32_t))) + return TRUE; + } + + if (i915_shader_get_texcoords (shader) != device->current_texcoords) + return TRUE; + if (device->current_blend != shader->blend) + return TRUE; + + count = 0; + if (shader->source.type.fragment == FS_DIFFUSE) { + uint32_t diffuse; + + diffuse = + ((shader->source.solid.color.alpha_short >> 8) << 24) | + ((shader->source.solid.color.red_short >> 8) << 16) | + ((shader->source.solid.color.green_short >> 8) << 8) | + ((shader->source.solid.color.blue_short >> 8) << 0); + + if (diffuse != device->current_diffuse) + return TRUE; + } else { + count += pack_constants (&shader->source, buf + count); + } + count += pack_constants (&shader->mask, buf + count); + + if (count && + (device->current_n_constants != count || + memcmp (device->current_constants, buf, count*4))) + { + return TRUE; + } + + n = (i915_shader_channel_key (&shader->source) << 0) | + (i915_shader_channel_key (&shader->mask) << 8) | + (i915_shader_channel_key (&shader->clip) << 16) | + (shader->op << 24) | + ((shader->opacity < 1.) << 30) | + (((shader->content & CAIRO_CONTENT_ALPHA) == CAIRO_CONTENT_ALPHA) << 31); + return n != device->current_program; +} + +void +i915_set_dst (i915_device_t *device, i915_surface_t *dst) +{ + uint32_t size; + + if (device->current_target != dst) { + intel_bo_t *bo; + + bo = to_intel_bo (dst->intel.drm.bo); + assert (bo != NULL); + + OUT_DWORD (_3DSTATE_BUF_INFO_CMD); + OUT_DWORD (BUF_3D_ID_COLOR_BACK | + BUF_tiling (bo->tiling) | + BUF_3D_PITCH (dst->intel.drm.stride)); + OUT_RELOC (dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER); + + device->current_target = dst; + } + + if (dst->colorbuf != device->current_colorbuf) { + OUT_DWORD (_3DSTATE_DST_BUF_VARS_CMD); + OUT_DWORD (dst->colorbuf); + device->current_colorbuf = dst->colorbuf; + } + + size = DRAW_YMAX (dst->intel.drm.height) | DRAW_XMAX (dst->intel.drm.width); + if (size != device->current_size) { + OUT_DWORD (_3DSTATE_DRAW_RECT_CMD); + OUT_DWORD (0); /* dither */ + OUT_DWORD (0); /* top-left */ + OUT_DWORD (size); + OUT_DWORD (0); /* origin */ + device->current_size = size; + } +} + +static void +i915_set_shader_target (i915_device_t *device, + const i915_shader_t *shader) +{ + i915_set_dst (device, shader->target); +} + +int +i915_shader_num_texcoords (const i915_shader_t *shader) +{ + int cnt = 0; + + switch (shader->source.base.texfmt) { + default: + ASSERT_NOT_REACHED; + case TEXCOORDFMT_NOT_PRESENT: break; + case TEXCOORDFMT_2D: cnt += 2; break; + case TEXCOORDFMT_3D: cnt += 3; break; + case TEXCOORDFMT_4D: cnt += 4; break; + case TEXCOORDFMT_1D: cnt += 1; break; + case TEXCOORDFMT_2D_16: cnt += 1; break; + } + + switch (shader->mask.base.texfmt) { + default: + ASSERT_NOT_REACHED; + case TEXCOORDFMT_NOT_PRESENT: break; + case TEXCOORDFMT_2D: cnt += 2; break; + case TEXCOORDFMT_3D: cnt += 3; break; + case TEXCOORDFMT_4D: cnt += 4; break; + case TEXCOORDFMT_1D: cnt += 1; break; + case TEXCOORDFMT_2D_16: cnt += 1; break; + } + + switch (shader->clip.base.texfmt) { + default: + ASSERT_NOT_REACHED; + case TEXCOORDFMT_NOT_PRESENT: break; + case TEXCOORDFMT_2D: cnt += 2; break; + case TEXCOORDFMT_3D: cnt += 3; break; + case TEXCOORDFMT_4D: cnt += 4; break; + case TEXCOORDFMT_1D: cnt += 1; break; + case TEXCOORDFMT_2D_16: cnt += 1; break; + } + + switch (shader->dst.base.texfmt) { + default: + ASSERT_NOT_REACHED; + case TEXCOORDFMT_NOT_PRESENT: break; + case TEXCOORDFMT_2D: cnt += 2; break; + case TEXCOORDFMT_3D: cnt += 3; break; + case TEXCOORDFMT_4D: cnt += 4; break; + case TEXCOORDFMT_1D: cnt += 1; break; + case TEXCOORDFMT_2D_16: cnt += 1; break; + } + + return cnt; +} + +void +i915_shader_fini (i915_shader_t *shader) +{ + i915_device_t *device = i915_device (shader->target); + + i915_shader_channel_fini (device, &shader->source); + i915_shader_channel_fini (device, &shader->mask); + i915_shader_channel_fini (device, &shader->clip); +} + +void +i915_shader_set_clip (i915_shader_t *shader, + cairo_clip_t *clip) +{ + cairo_surface_t *clip_surface; + int clip_x, clip_y; + union i915_shader_channel *channel; + i915_surface_t *s; + + clip_surface = _cairo_clip_get_surface (clip, &shader->target->intel.drm.base, &clip_x, &clip_y); + assert (clip_surface->status == CAIRO_STATUS_SUCCESS); + assert (clip_surface->type == CAIRO_SURFACE_TYPE_DRM); + + channel = &shader->clip; + channel->type.vertex = VS_TEXTURE_16; + channel->base.texfmt = TEXCOORDFMT_2D_16; + channel->base.content = CAIRO_CONTENT_ALPHA; + + channel->type.fragment = FS_TEXTURE; + channel->surface.pixel = NONE; + + s = (i915_surface_t *) clip_surface; + channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.n_samplers = 1; + channel->base.offset[0] = s->offset; + channel->base.map[0] = s->map0; + channel->base.map[1] = s->map1; + + channel->base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (CAIRO_FILTER_NEAREST); + channel->base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (CAIRO_EXTEND_NONE); + + cairo_matrix_init_scale (&shader->clip.base.matrix, + 1. / s->intel.drm.width, + 1. / s->intel.drm.height); + cairo_matrix_translate (&shader->clip.base.matrix, + -clip_x, -clip_y); +} + +static cairo_status_t +i915_shader_check_aperture (i915_shader_t *shader, + i915_device_t *device) +{ + cairo_status_t status; + intel_bo_t *bo_array[4]; + uint32_t n = 0; + + if (shader->target != device->current_target) + bo_array[n++] = to_intel_bo (shader->target->intel.drm.bo); + + if (shader->source.base.bo != NULL) + bo_array[n++] = shader->source.base.bo; + + if (shader->mask.base.bo != NULL) + bo_array[n++] = shader->mask.base.bo; + + if (shader->clip.base.bo != NULL) + bo_array[n++] = shader->clip.base.bo; + + if (n == 0 || i915_check_aperture (device, bo_array, n)) + return CAIRO_STATUS_SUCCESS; + + status = i915_batch_flush (device); + if (unlikely (status)) + return status; + + assert (i915_check_aperture (device, bo_array, n)); + return CAIRO_STATUS_SUCCESS; +} + +static void +i915_shader_combine_mask (i915_shader_t *shader, i915_device_t *device) +{ + if (shader->mask.type.fragment == (i915_fragment_shader_t) -1 || + shader->mask.type.fragment == FS_CONSTANT) + { + return; + } + + if (shader->mask.type.fragment == FS_PURE) { + if (shader->mask.solid.pure & (1<<3)) { + shader->mask.type.fragment = FS_ONE; + } else { + shader->mask.type.fragment = FS_ZERO; + } + } + + if (shader->mask.type.fragment == FS_ONE || + (shader->mask.base.content & CAIRO_CONTENT_ALPHA) == 0) + { + i915_shader_channel_reset (device, &shader->mask); + } + + if (shader->mask.type.fragment == FS_ZERO) { + i915_shader_channel_fini (device, &shader->source); + + shader->source.type.fragment = FS_ZERO; + shader->source.type.vertex = VS_ZERO; + shader->source.base.texfmt = TEXCOORDFMT_NOT_PRESENT; + shader->source.base.mode = 0; + shader->source.base.n_samplers = 0; + } + + if (shader->source.type.fragment == FS_ZERO) { + i915_shader_channel_reset (device, &shader->mask); + i915_shader_channel_reset (device, &shader->clip); + } +} + +static void +i915_shader_setup_dst (i915_shader_t *shader) +{ + union i915_shader_channel *channel; + i915_surface_t *s; + + /* We need to manual blending if we have a clip surface and an unbounded op, + * or an extended blend mode. + */ + if (shader->need_combine || + (shader->op < CAIRO_OPERATOR_SATURATE && + (shader->clip.type.fragment == (i915_fragment_shader_t) -1 || + _cairo_operator_bounded_by_mask (shader->op)))) + { + return; + } + + shader->need_combine = TRUE; + + channel = &shader->dst; + channel->type.vertex = VS_TEXTURE_16; + channel->base.texfmt = TEXCOORDFMT_2D_16; + channel->base.content = shader->content; + + channel->type.fragment = FS_TEXTURE; + channel->surface.pixel = NONE; + + s = shader->target; + channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.n_samplers = 1; + channel->base.offset[0] = s->offset; + channel->base.map[0] = s->map0; + channel->base.map[1] = s->map1; + + channel->base.sampler[0] = + (MIPFILTER_NONE << SS2_MIP_FILTER_SHIFT) | + i915_texture_filter (CAIRO_FILTER_NEAREST); + channel->base.sampler[1] = + SS3_NORMALIZED_COORDS | + i915_texture_extend (CAIRO_EXTEND_NONE); + + cairo_matrix_init_scale (&shader->dst.base.matrix, + 1. / s->intel.drm.width, + 1. / s->intel.drm.height); +} + +static void +i915_shader_combine_source (i915_shader_t *shader, + i915_device_t *device) +{ + if (device->last_source_fragment == shader->source.type.fragment) + return; + + if (device->last_source_fragment == FS_DIFFUSE) { + switch (shader->source.type.fragment) { + case FS_ONE: + case FS_PURE: + case FS_CONSTANT: + case FS_DIFFUSE: + shader->source.type.fragment = FS_DIFFUSE; + shader->source.base.mode = 0; + break; + case FS_ZERO: + case FS_LINEAR: + case FS_RADIAL: + case FS_TEXTURE: + case FS_YUV: + case FS_SPANS: + default: + break; + } + } + + device->last_source_fragment = shader->source.type.fragment; +} + +static inline float * +i915_composite_vertex (float *v, + const i915_shader_t *shader, + double x, double y) +{ + double s, t; + + /* Each vertex is: + * 2 vertex coordinates + * [0-2] source texture coordinates + * [0-2] mask texture coordinates + */ + + *v++ = x; *v++ = y; + switch (shader->source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *v++ = i915_shader_linear_texcoord (&shader->source.linear, x, y); + break; + case VS_TEXTURE: + s = x, t = y; + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = s; *v++ = t; + break; + case VS_TEXTURE_16: + s = x, t = y; + cairo_matrix_transform_point (&shader->source.base.matrix, &s, &t); + *v++ = texcoord_2d_16 (s, t); + break; + } + switch (shader->mask.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *v++ = i915_shader_linear_texcoord (&shader->mask.linear, x, y); + break; + case VS_TEXTURE: + s = x, t = y; + cairo_matrix_transform_point (&shader->mask.base.matrix, &s, &t); + *v++ = s; *v++ = t; + break; + case VS_TEXTURE_16: + s = x, t = y; + cairo_matrix_transform_point (&shader->mask.base.matrix, &s, &t); + *v++ = texcoord_2d_16 (s, t); + break; + } + + return v; +} + +static inline void +i915_shader_add_rectangle_general (const i915_shader_t *shader, + int x, int y, + int w, int h) +{ + float *vertices; + + vertices = i915_add_rectangle (shader->device); + vertices = i915_composite_vertex (vertices, shader, x + w, y + h); + vertices = i915_composite_vertex (vertices, shader, x, y + h); + vertices = i915_composite_vertex (vertices, shader, x, y); + /* XXX overflow! */ +} + +void +i915_vbo_flush (i915_device_t *device) +{ + assert (device->floats_per_vertex); + assert (device->vertex_count); + + if (device->vbo == 0) { + OUT_DWORD (_3DSTATE_LOAD_STATE_IMMEDIATE_1 | + I1_LOAD_S (0) | + I1_LOAD_S (1) | + 1); + device->vbo = device->batch.used++; + device->vbo_max_index = device->batch.used; + OUT_DWORD ((device->floats_per_vertex << S1_VERTEX_WIDTH_SHIFT) | + (device->floats_per_vertex << S1_VERTEX_PITCH_SHIFT)); + } + + OUT_DWORD (PRIM3D_RECTLIST | + PRIM3D_INDIRECT_SEQUENTIAL | + device->vertex_count); + OUT_DWORD (device->vertex_index); + + device->vertex_index += device->vertex_count; + device->vertex_count = 0; +} + +cairo_status_t +i915_shader_commit (i915_shader_t *shader, + i915_device_t *device) +{ + unsigned floats_per_vertex; + cairo_status_t status; + + assert (CAIRO_MUTEX_IS_LOCKED (device->intel.base.base.mutex)); + + if (! shader->committed) { + device->shader = shader; + + i915_shader_combine_mask (shader, device); + i915_shader_combine_source (shader, device); + i915_shader_setup_dst (shader); + + shader->add_rectangle = i915_shader_add_rectangle_general; + + if ((status = setjmp (shader->unwind))) + return status; + + shader->committed = TRUE; + } + + if (i915_shader_needs_update (shader, device)) { + if (i915_batch_space (device) < 256) { + status = i915_batch_flush (device); + if (unlikely (status)) + return status; + } + + if (device->vertex_count) + i915_vbo_flush (device); + + status = i915_shader_check_aperture (shader, device); + if (unlikely (status)) + return status; + + update_shader: + i915_set_shader_target (device, shader); + i915_set_shader_mode (device, shader); + i915_set_shader_samplers (device, shader); + i915_set_shader_constants (device, shader); + i915_set_shader_program (device, shader); + } + + floats_per_vertex = 2 + i915_shader_num_texcoords (shader); + if (device->floats_per_vertex == floats_per_vertex) + return CAIRO_STATUS_SUCCESS; + + if (i915_batch_space (device) < 8) { + status = i915_batch_flush (device); + if (unlikely (status)) + return status; + + goto update_shader; + } + + if (device->vertex_count) + i915_vbo_flush (device); + + if (device->vbo) { + device->batch_base[device->vbo_max_index] |= device->vertex_index; + OUT_DWORD (_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S (1) | 0); + device->vbo_max_index = device->batch.used; + OUT_DWORD ((floats_per_vertex << S1_VERTEX_WIDTH_SHIFT) | + (floats_per_vertex << S1_VERTEX_PITCH_SHIFT)); + } + + device->floats_per_vertex = floats_per_vertex; + device->rectangle_size = floats_per_vertex * 3 * sizeof (float); + device->vertex_index = + (device->vbo_used + 4*floats_per_vertex - 1) / (4 * floats_per_vertex); + device->vbo_offset = 4 * device->vertex_index * floats_per_vertex; + + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/drm/cairo-drm-i915-spans.c b/src/drm/cairo-drm-i915-spans.c new file mode 100644 index 000000000..b3f4e0afd --- /dev/null +++ b/src/drm/cairo-drm-i915-spans.c @@ -0,0 +1,799 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-drm-i915-private.h" + +/* Operates in either immediate or retained mode. + * When given a clip region we record the sequence of vbo and then + * replay them for each clip rectangle, otherwise we simply emit + * the vbo straight into the command stream. + */ + +typedef struct _i915_spans i915_spans_t; + +typedef float * +(*i915_get_rectangle_func_t) (i915_spans_t *spans); + +typedef void +(*i915_span_func_t) (i915_spans_t *spans, + int x0, int x1, int y0, int y1, + int alpha); + +struct _i915_spans { + cairo_span_renderer_t renderer; + + i915_device_t *device; + + int xmin, xmax; + cairo_bool_t is_bounded; + const cairo_rectangle_int_t *extents; + + i915_get_rectangle_func_t get_rectangle; + i915_span_func_t span; + i915_shader_t shader; + + cairo_region_t *clip_region; + cairo_bool_t need_clip_surface; + + struct vbo { + struct vbo *next; + intel_bo_t *bo; + unsigned int count; + } head, *tail; + + unsigned int vbo_offset; + float *vbo_base; +}; + +static float * +i915_emit_rectangle (i915_spans_t *spans) +{ + return i915_add_rectangle (spans->device); +} + +static float * +i915_accumulate_rectangle (i915_spans_t *spans) +{ + float *vertices; + uint32_t size; + + size = spans->device->rectangle_size; + if (unlikely (spans->vbo_offset + size > I915_VBO_SIZE)) { + struct vbo *vbo; + + vbo = malloc (sizeof (struct vbo)); + if (unlikely (vbo == NULL)) { + /* throw error! */ + } + + spans->tail->next = vbo; + spans->tail = vbo; + + vbo->next = NULL; + vbo->bo = intel_bo_create (&spans->device->intel, + I915_VBO_SIZE, I915_VBO_SIZE, + FALSE, I915_TILING_NONE, 0); + vbo->count = 0; + + spans->vbo_offset = 0; + spans->vbo_base = intel_bo_map (&spans->device->intel, vbo->bo); + } + + vertices = spans->vbo_base + spans->vbo_offset; + spans->vbo_offset += size; + spans->tail->count += 3; + + return vertices; +} + +static void +i915_span_zero (i915_spans_t *spans, + int x0, int x1, int y0, int y1, + int alpha) +{ + float *vertices; + + vertices = spans->get_rectangle (spans); + + *vertices++ = x1; + *vertices++ = y1; + + *vertices++ = x0; + *vertices++ = y1; + + *vertices++ = x0; + *vertices++ = y0; +} + +static void +i915_span_constant (i915_spans_t *spans, + int x0, int x1, int y0, int y1, + int alpha) +{ + float *vertices; + float a = alpha / 255.; + + vertices = spans->get_rectangle (spans); + + *vertices++ = x1; + *vertices++ = y1; + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y1; + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y0; + *vertices++ = a; +} + +static void +i915_span_linear (i915_spans_t *spans, + int x0, int x1, int y0, int y1, + int alpha) +{ + float *vertices; + float a = alpha / 255.; + double s, t; + + vertices = spans->get_rectangle (spans); + + *vertices++ = x1; + *vertices++ = y1; + s = x0, t = y0; + *vertices++ = i915_shader_linear_texcoord (&spans->shader.source.linear, s, t); + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y1; + s = x1, t = y0; + *vertices++ = i915_shader_linear_texcoord (&spans->shader.source.linear, s, t); + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y0; + s = x1, t = y1; + *vertices++ = i915_shader_linear_texcoord (&spans->shader.source.linear, s, t); + *vertices++ = a; +} + +static void +i915_span_texture (i915_spans_t *spans, + int x0, int x1, int y0, int y1, + int alpha) +{ + float *vertices; + float a = alpha / 255.; + double s, t; + + vertices = spans->get_rectangle (spans); + + *vertices++ = x1; + *vertices++ = y1; + s = x0, t = y0; + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = s; *vertices++ = t; + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y1; + s = x1, t = y0; + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = s; *vertices++ = t; + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y0; + s = x1, t = y1; + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = s; *vertices++ = t; + *vertices++ = a; +} + +static void +i915_span_texture16 (i915_spans_t *spans, + int x0, int x1, int y0, int y1, int alpha) +{ + float *vertices; + float a = alpha / 255.; + double s, t; + + vertices = spans->get_rectangle (spans); + + *vertices++ = x1; + *vertices++ = y1; + s = x0, t = y0; + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y1; + s = x1, t = y0; + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y0; + s = x1, t = y1; + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + *vertices++ = a; +} + +static void +i915_span_generic (i915_spans_t *spans, + int x0, int x1, int y0, int y1, int alpha) +{ + double s, t; + float *vertices; + float a = alpha / 255.; + + /* Each vertex is: + * 2 vertex coordinates + * [0-2] source texture coordinates + * 1 alpha value. + * [0,2] clip mask coordinates + */ + + vertices = spans->get_rectangle (spans); + + /* bottom right */ + *vertices++ = x1; *vertices++ = y1; + s = x1, t = y1; + switch (spans->shader.source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *vertices++ = i915_shader_linear_texcoord (&spans->shader.source.linear, s, t); + break; + case VS_TEXTURE: + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = s; *vertices++ = t; + break; + case VS_TEXTURE_16: + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + break; + } + *vertices++ = a; + if (spans->need_clip_surface) { + s = x1, t = y1; + cairo_matrix_transform_point (&spans->shader.clip.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + if (spans->shader.need_combine) { + s = x1, t = y1; + cairo_matrix_transform_point (&spans->shader.dst.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + + /* bottom left */ + *vertices++ = x0; *vertices++ = y1; + s = x0, t = y1; + switch (spans->shader.source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *vertices++ = i915_shader_linear_texcoord (&spans->shader.source.linear, s, t); + break; + case VS_TEXTURE: + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = s; *vertices++ = t; + break; + case VS_TEXTURE_16: + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + break; + } + *vertices++ = a; + if (spans->need_clip_surface) { + s = x0, t = y1; + cairo_matrix_transform_point (&spans->shader.clip.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + if (spans->shader.need_combine) { + s = x0, t = y1; + cairo_matrix_transform_point (&spans->shader.dst.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + + /* top left */ + *vertices++ = x0; *vertices++ = y0; + s = x0, t = y0; + switch (spans->shader.source.type.vertex) { + case VS_ZERO: + case VS_CONSTANT: + break; + case VS_LINEAR: + *vertices++ = i915_shader_linear_texcoord (&spans->shader.source.linear, s, t); + break; + case VS_TEXTURE: + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = s; *vertices++ = t; + break; + case VS_TEXTURE_16: + cairo_matrix_transform_point (&spans->shader.source.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + break; + } + *vertices++ = a; + if (spans->need_clip_surface) { + s = x0, t = y0; + cairo_matrix_transform_point (&spans->shader.clip.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } + if (spans->shader.need_combine) { + s = x0, t = y0; + cairo_matrix_transform_point (&spans->shader.dst.base.matrix, &s, &t); + *vertices++ = texcoord_2d_16 (s, t); + } +} + +static cairo_status_t +i915_zero_spans_mono (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i915_spans_t *spans = abstract_renderer; + int x0, x1; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + while (num_spans && half[0].coverage < 128) + half++, num_spans--; + if (num_spans == 0) + break; + + x0 = x1 = half[0].x; + while (num_spans--) { + half++; + + x1 = half[0].x; + if (half[0].coverage < 128) + break; + } + + i915_span_zero (spans, + x0, x1, + y, y + height, + 0); + } while (num_spans); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_zero_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i915_spans_t *spans = abstract_renderer; + int x0, x1; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + while (num_spans && half[0].coverage == 0) + half++, num_spans--; + if (num_spans == 0) + break; + + x0 = x1 = half[0].x; + while (num_spans--) { + half++; + + x1 = half[0].x; + if (half[0].coverage == 0) + break; + } + + i915_span_zero (spans, + x0, x1, + y, y + height, + 0); + } while (num_spans); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_bounded_spans_mono (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i915_spans_t *spans = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (half[0].coverage >= 128) { + spans->span (spans, + half[0].x, half[1].x, + y, y + height, + 255); + } + half++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_bounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i915_spans_t *spans = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (half[0].coverage) { + spans->span (spans, + half[0].x, half[1].x, + y, y + height, + half[0].coverage); + } + half++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_unbounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i915_spans_t *spans = abstract_renderer; + + if (num_spans == 0) { + spans->span (spans, + spans->xmin, spans->xmax, + y, y + height, + 0); + return CAIRO_STATUS_SUCCESS; + } + + if (half[0].x != spans->xmin) { + spans->span (spans, + spans->xmin, half[0].x, + y, y + height, + 0); + } + + do { + spans->span (spans, + half[0].x, half[1].x, + y, y + height, + half[0].coverage); + half++; + } while (--num_spans > 1); + + if (half[0].x != spans->xmax) { + spans->span (spans, + half[0].x, spans->xmax, + y, y + height, + 0); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_unbounded_spans_mono (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i915_spans_t *spans = abstract_renderer; + + if (num_spans == 0) { + spans->span (spans, + spans->xmin, spans->xmax, + y, y + height, + 0); + return CAIRO_STATUS_SUCCESS; + } + + if (half[0].x != spans->xmin) { + spans->span (spans, + spans->xmin, half[0].x, + y, y + height, + 0); + } + + do { + int alpha = 0; + if (half[0].coverage >= 128) + alpha = 255; + spans->span (spans, + half[0].x, half[1].x, + y, y + height, + alpha); + half++; + } while (--num_spans > 1); + + if (half[0].x != spans->xmax) { + spans->span (spans, + half[0].x, spans->xmax, + y, y + height, + 0); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_spans_init (i915_spans_t *spans, + i915_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_antialias_t antialias, + cairo_clip_t *clip, + double opacity, + const cairo_composite_rectangles_t *extents) +{ + cairo_status_t status; + + spans->device = (i915_device_t *) dst->intel.drm.base.device; + + spans->is_bounded = extents->is_bounded; + if (extents->is_bounded) { + if (antialias == CAIRO_ANTIALIAS_NONE) + spans->renderer.render_rows = i915_bounded_spans_mono; + else + spans->renderer.render_rows = i915_bounded_spans; + + spans->extents = &extents->bounded; + } else { + if (antialias == CAIRO_ANTIALIAS_NONE) + spans->renderer.render_rows = i915_unbounded_spans_mono; + else + spans->renderer.render_rows = i915_unbounded_spans; + + spans->extents = &extents->unbounded; + } + spans->xmin = spans->extents->x; + spans->xmax = spans->extents->x + spans->extents->width; + + spans->clip_region = NULL; + spans->need_clip_surface = FALSE; + if (clip != NULL) { + cairo_region_t *clip_region = NULL; + + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1) + clip_region = NULL; + + spans->clip_region = clip_region; + spans->need_clip_surface = status == CAIRO_INT_STATUS_UNSUPPORTED; + } + + spans->head.next = NULL; + spans->head.bo = NULL; + spans->head.count = 0; + spans->tail = &spans->head; + + if (spans->clip_region == NULL) { + spans->get_rectangle = i915_emit_rectangle; + } else { + assert (! extents->is_bounded); + spans->get_rectangle = i915_accumulate_rectangle; + spans->head.bo = intel_bo_create (&spans->device->intel, + I915_VBO_SIZE, I915_VBO_SIZE, + FALSE, I915_TILING_NONE, 0); + if (unlikely (spans->head.bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + spans->vbo_base = intel_bo_map (&spans->device->intel, spans->head.bo); + } + spans->vbo_offset = 0; + + i915_shader_init (&spans->shader, dst, op, opacity); + if (spans->need_clip_surface) + i915_shader_set_clip (&spans->shader, clip); + + status = i915_shader_acquire_pattern (&spans->shader, &spans->shader.source, + pattern, &extents->bounded); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static void +i915_spans_fini (i915_spans_t *spans) +{ + i915_shader_fini (&spans->shader); + + if (spans->head.bo != NULL) { + struct vbo *vbo, *next; + + intel_bo_destroy (&spans->device->intel, spans->head.bo); + for (vbo = spans->head.next; vbo != NULL; vbo = next) { + next = vbo->next; + intel_bo_destroy (&spans->device->intel, vbo->bo); + free (vbo); + } + } +} + +cairo_status_t +i915_clip_and_composite_spans (i915_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_antialias_t antialias, + i915_spans_func_t draw_func, + void *draw_closure, + const cairo_composite_rectangles_t*extents, + cairo_clip_t *clip, + double opacity) +{ + i915_spans_t spans; + i915_device_t *device; + cairo_status_t status; + struct vbo *vbo; + + if (i915_surface_needs_tiling (dst)) { + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (op == CAIRO_OPERATOR_CLEAR) { + pattern = &_cairo_pattern_white.base; + op = CAIRO_OPERATOR_DEST_OUT; + } + + status = i915_spans_init (&spans, dst, op, pattern, antialias, clip, opacity, extents); + if (unlikely (status)) + return status; + + spans.shader.mask.base.texfmt = TEXCOORDFMT_1D; + spans.shader.mask.base.content = CAIRO_CONTENT_ALPHA; + spans.shader.mask.type.fragment = FS_SPANS; + + status = cairo_device_acquire (dst->intel.drm.base.device); + if (unlikely (status)) + goto CLEANUP_SPANS; + + if (dst->deferred_clear) { + status = i915_surface_clear (dst); + if (unlikely (status)) + goto CLEANUP_SPANS; + } + + device = i915_device (dst); + status = i915_shader_commit (&spans.shader, device); + if (unlikely (status)) + goto CLEANUP_DEVICE; + + if (! spans.shader.need_combine && ! spans.need_clip_surface) { + switch (spans.shader.source.type.vertex) { + case VS_ZERO: + spans.span = i915_span_zero; + if (extents->is_bounded) { + if (antialias == CAIRO_ANTIALIAS_NONE) + spans.renderer.render_rows = i915_zero_spans_mono; + else + spans.renderer.render_rows = i915_zero_spans; + } + break; + case VS_CONSTANT: + spans.span = i915_span_constant; + break; + case VS_LINEAR: + spans.span = i915_span_linear; + break; + case VS_TEXTURE: + spans.span = i915_span_texture; + break; + case VS_TEXTURE_16: + spans.span = i915_span_texture16; + break; + default: + spans.span = i915_span_generic; + break; + } + } else { + spans.span = i915_span_generic; + } + + status = draw_func (draw_closure, &spans.renderer, spans.extents); + if (spans.clip_region != NULL && status == CAIRO_STATUS_SUCCESS) { + i915_vbo_finish (device); + + OUT_DWORD (_3DSTATE_SCISSOR_ENABLE_CMD | ENABLE_SCISSOR_RECT); + for (vbo = &spans.head; vbo != NULL; vbo = vbo->next) { + int i, num_rectangles; + + /* XXX require_space & batch_flush */ + + OUT_DWORD (_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S (0) | I1_LOAD_S (1) | 1); + i915_batch_emit_reloc (device, vbo->bo, 0, + I915_GEM_DOMAIN_VERTEX, 0, + FALSE); + OUT_DWORD ((device->floats_per_vertex << S1_VERTEX_WIDTH_SHIFT) | + (device->floats_per_vertex << S1_VERTEX_PITCH_SHIFT) | + vbo->count); + + num_rectangles = cairo_region_num_rectangles (spans.clip_region); + for (i = 0; i < num_rectangles; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (spans.clip_region, i, &rect); + + OUT_DWORD (_3DSTATE_SCISSOR_RECT_0_CMD); + OUT_DWORD (SCISSOR_RECT_0_XMIN (rect.x) | + SCISSOR_RECT_0_YMIN (rect.y)); + OUT_DWORD (SCISSOR_RECT_0_XMAX (rect.x + rect.width) | + SCISSOR_RECT_0_YMAX (rect.y + rect.height)); + + OUT_DWORD (PRIM3D_RECTLIST | PRIM3D_INDIRECT_SEQUENTIAL | vbo->count); + OUT_DWORD (0); + } + } + OUT_DWORD (_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT); + } + +CLEANUP_DEVICE: + cairo_device_release (dst->intel.drm.base.device); +CLEANUP_SPANS: + i915_spans_fini (&spans); + + return status; +} diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c new file mode 100644 index 000000000..c1a04529f --- /dev/null +++ b/src/drm/cairo-drm-i915-surface.c @@ -0,0 +1,2942 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * ************************************************************************** + * This work was initially based upon xf86-video-intel/src/i915_render.c: + * Copyright © 2006 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Wang Zhenyu + * Eric Anholt + * + * ************************************************************************** + * and also upon libdrm/intel/intel_bufmgr_gem.c: + * Copyright © 2007 Red Hat Inc. + * Copyright © 2007 Intel Corporation + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * Authors: Thomas Hellström + * Keith Whitwell + * Eric Anholt + * Dave Airlie + */ + +/* XXX + * + * - Per thread context? Would it actually avoid many locks? + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-ioctl-private.h" +#include "cairo-drm-intel-private.h" +#include "cairo-drm-intel-command-private.h" +#include "cairo-drm-intel-ioctl-private.h" +#include "cairo-drm-i915-private.h" + +#include "cairo-boxes-private.h" +#include "cairo-cache-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" +#include "cairo-list-private.h" +#include "cairo-path-fixed-private.h" +#include "cairo-region-private.h" +#include "cairo-surface-offset-private.h" + +#include +#include +#include + +static const uint32_t i915_batch_setup[] = { + /* Disable line anti-aliasing */ + _3DSTATE_AA_CMD, + + /* Disable independent alpha blend */ + _3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD | + IAB_MODIFY_ENABLE | + IAB_MODIFY_FUNC | (BLENDFUNC_ADD << IAB_FUNC_SHIFT) | + IAB_MODIFY_SRC_FACTOR | (BLENDFACT_ONE << IAB_SRC_FACTOR_SHIFT) | + IAB_MODIFY_DST_FACTOR | (BLENDFACT_ZERO << IAB_DST_FACTOR_SHIFT), + + /* Disable texture crossbar */ + _3DSTATE_COORD_SET_BINDINGS | + CSB_TCB (0, 0) | + CSB_TCB (1, 1) | + CSB_TCB (2, 2) | + CSB_TCB (3, 3) | + CSB_TCB (4, 4) | + CSB_TCB (5, 5) | + CSB_TCB (6, 6) | + CSB_TCB (7, 7), + + _3DSTATE_MODES_4_CMD | ENABLE_LOGIC_OP_FUNC | LOGIC_OP_FUNC (LOGICOP_COPY), + + _3DSTATE_LOAD_STATE_IMMEDIATE_1 | + I1_LOAD_S (2) | + I1_LOAD_S (3) | + I1_LOAD_S (4) | + I1_LOAD_S (5) | + I1_LOAD_S (6) | + 4, + S2_TEXCOORD_NONE, + 0, /* Disable texture coordinate wrap-shortest */ + (1 << S4_POINT_WIDTH_SHIFT) | + S4_LINE_WIDTH_ONE | + S4_FLATSHADE_ALPHA | + S4_FLATSHADE_FOG | + S4_FLATSHADE_SPECULAR | + S4_FLATSHADE_COLOR | + S4_CULLMODE_NONE | + S4_VFMT_XY, + 0, /* Disable stencil buffer */ + S6_COLOR_WRITE_ENABLE, + + _3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT, + + /* disable indirect state */ + _3DSTATE_LOAD_INDIRECT, + 0, +}; + +static const cairo_surface_backend_t i915_surface_backend; + +static cairo_surface_t * +i915_surface_create_from_cacheable_image (cairo_drm_device_t *base_dev, + cairo_surface_t *source); + +static cairo_status_t +i915_bo_exec (i915_device_t *device, intel_bo_t *bo, uint32_t offset) +{ + struct drm_i915_gem_execbuffer2 execbuf; + int ret, cnt, i; + + /* Add the batch buffer to the validation list. */ + cnt = device->batch.exec_count; + if (cnt > 0 && bo->base.handle == device->batch.exec[cnt-1].handle) + i = cnt - 1; + else + i = device->batch.exec_count++; + device->batch.exec[i].handle = bo->base.handle; + device->batch.exec[i].relocation_count = device->batch.reloc_count; + device->batch.exec[i].relocs_ptr = (uintptr_t) device->batch.reloc; + device->batch.exec[i].alignment = 0; + device->batch.exec[i].offset = 0; + device->batch.exec[i].flags = 0; + device->batch.exec[i].rsvd1 = 0; + device->batch.exec[i].rsvd2 = 0; + + execbuf.buffers_ptr = (uintptr_t) device->batch.exec; + execbuf.buffer_count = device->batch.exec_count; + execbuf.batch_start_offset = offset; + execbuf.batch_len = (device->batch.used << 2) + sizeof (device->batch_header); + execbuf.DR1 = 0; + execbuf.DR4 = 0; + execbuf.num_cliprects = 0; + execbuf.cliprects_ptr = 0; + execbuf.flags = 0; + execbuf.rsvd1 = 0; + execbuf.rsvd2 = 0; + + do { + ret = ioctl (device->intel.base.fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); + } while (ret != 0 && errno == EINTR); + + if (device->debug & I915_DEBUG_SYNC && ret == 0) + ret = ! intel_bo_wait (&device->intel, bo); + + if (0 && ret) { + int n, m; + + fprintf (stderr, "Batch submission failed: %d\n", errno); + fprintf (stderr, " relocation entries: %d/%d\n", + device->batch.reloc_count, I915_MAX_RELOCS); + fprintf (stderr, " gtt size: (%zd/%zd), (%zd/%zd)\n", + device->batch.est_gtt_size, device->batch.gtt_avail_size, + device->batch.total_gtt_size, device->intel.gtt_avail_size); + + fprintf (stderr, " buffers:\n"); + for (n = 0; n < device->batch.exec_count; n++) { + fprintf (stderr, " exec[%d] = %d, %d/%d bytes, gtt = %qx\n", + n, + device->batch.exec[n].handle, + n == device->batch.exec_count - 1 ? bo->base.size : device->batch.target_bo[n]->base.size, + n == device->batch.exec_count - 1 ? bo->full_size : device->batch.target_bo[n]->full_size, + device->batch.exec[n].offset); + } + for (n = 0; n < device->batch.reloc_count; n++) { + for (m = 0; m < device->batch.exec_count; m++) + if (device->batch.exec[m].handle == device->batch.reloc[n].target_handle) + break; + + fprintf (stderr, " reloc[%d] = %d @ %qx -> %qx + %qx\n", n, + device->batch.reloc[n].target_handle, + device->batch.reloc[n].offset, + (unsigned long long) device->batch.exec[m].offset, + (unsigned long long) device->batch.reloc[n].delta); + + device->batch_base[(device->batch.reloc[n].offset - sizeof (device->batch_header)) / 4] = + device->batch.exec[m].offset + device->batch.reloc[n].delta; + } + + intel_dump_batchbuffer (device->batch_header, + execbuf.batch_len, + device->intel.base.chip_id); + } + assert (ret == 0); + + VG (VALGRIND_MAKE_MEM_DEFINED (device->batch.exec, sizeof (device->batch.exec[0]) * i)); + + bo->offset = device->batch.exec[i].offset; + bo->busy = TRUE; + if (bo->virtual) + intel_bo_unmap (bo); + bo->cpu = FALSE; + + while (cnt--) { + intel_bo_t *bo = device->batch.target_bo[cnt]; + + bo->offset = device->batch.exec[cnt].offset; + bo->exec = NULL; + bo->busy = TRUE; + bo->batch_read_domains = 0; + bo->batch_write_domain = 0; + cairo_list_del (&bo->cache_list); + + if (bo->virtual) + intel_bo_unmap (bo); + bo->cpu = FALSE; + + intel_bo_destroy (&device->intel, bo); + } + assert (cairo_list_is_empty (&device->intel.bo_in_flight)); + + device->batch.exec_count = 0; + device->batch.reloc_count = 0; + device->batch.fences = 0; + + device->batch.est_gtt_size = I915_BATCH_SIZE; + device->batch.total_gtt_size = I915_BATCH_SIZE; + + return ret == 0 ? CAIRO_STATUS_SUCCESS : _cairo_error (CAIRO_STATUS_NO_MEMORY); +} + +void +i915_batch_add_reloc (i915_device_t *device, + uint32_t pos, + intel_bo_t *bo, + uint32_t offset, + uint32_t read_domains, + uint32_t write_domain, + cairo_bool_t needs_fence) +{ + int index; + + assert (offset < bo->base.size); + + if (bo->exec == NULL) { + device->batch.total_gtt_size += bo->base.size; + + if (! bo->busy) + device->batch.est_gtt_size += bo->base.size; + + assert (device->batch.exec_count < ARRAY_LENGTH (device->batch.exec)); + + index = device->batch.exec_count++; + device->batch.exec[index].handle = bo->base.handle; + device->batch.exec[index].relocation_count = 0; + device->batch.exec[index].relocs_ptr = 0; + device->batch.exec[index].alignment = 0; + device->batch.exec[index].offset = 0; + device->batch.exec[index].flags = 0; + device->batch.exec[index].rsvd1 = 0; + device->batch.exec[index].rsvd2 = 0; + + device->batch.target_bo[index] = intel_bo_reference (bo); + + bo->exec = &device->batch.exec[index]; + } + + if (bo->tiling != I915_TILING_NONE) { + uint32_t alignment; + +#if 0 + /* We presume that we will want to use a fence with X tiled objects... */ + if (needs_fence || bo->tiling == I915_TILING_X) + alignment = bo->full_size; + else + alignment = 2*((bo->stride + 4095) & -4096); +#else + alignment = bo->full_size; +#endif + if (bo->exec->alignment < alignment) + bo->exec->alignment = alignment; + + if (needs_fence && (bo->exec->flags & EXEC_OBJECT_NEEDS_FENCE) == 0) { + bo->exec->flags |= EXEC_OBJECT_NEEDS_FENCE; + device->batch.fences++; + + intel_bo_set_tiling (&device->intel, bo); + } + } + + assert (device->batch.reloc_count < ARRAY_LENGTH (device->batch.reloc)); + + index = device->batch.reloc_count++; + device->batch.reloc[index].offset = (pos << 2) + sizeof (device->batch_header); + device->batch.reloc[index].delta = offset; + device->batch.reloc[index].target_handle = bo->base.handle; + device->batch.reloc[index].read_domains = read_domains; + device->batch.reloc[index].write_domain = write_domain; + device->batch.reloc[index].presumed_offset = bo->offset; + + assert (write_domain == 0 || bo->batch_write_domain == 0 || bo->batch_write_domain == write_domain); + bo->batch_read_domains |= read_domains; + bo->batch_write_domain |= write_domain; +} + +void +i915_vbo_finish (i915_device_t *device) +{ + intel_bo_t *vbo; + + assert (CAIRO_MUTEX_IS_LOCKED (device->intel.base.base.mutex)); + assert (device->vbo_used); + + if (device->vertex_count) { + if (device->vbo == 0) { + OUT_DWORD (_3DSTATE_LOAD_STATE_IMMEDIATE_1 | + I1_LOAD_S (0) | + I1_LOAD_S (1) | + 1); + device->vbo = device->batch.used++; + device->vbo_max_index = device->batch.used; + OUT_DWORD ((device->floats_per_vertex << S1_VERTEX_WIDTH_SHIFT) | + (device->floats_per_vertex << S1_VERTEX_PITCH_SHIFT)); + } + + OUT_DWORD (PRIM3D_RECTLIST | + PRIM3D_INDIRECT_SEQUENTIAL | + device->vertex_count); + OUT_DWORD (device->vertex_index); + } + + if (device->last_vbo != NULL) { + intel_bo_in_flight_add (&device->intel, device->last_vbo); + intel_bo_destroy (&device->intel, device->last_vbo); + } + + device->batch_base[device->vbo_max_index] |= device->vertex_index + device->vertex_count; + + /* will include a few bytes of inter-array padding */ + vbo = intel_bo_create (&device->intel, + device->vbo_used, device->vbo_used, + FALSE, I915_TILING_NONE, 0); + i915_batch_fill_reloc (device, device->vbo, vbo, 0, + I915_GEM_DOMAIN_VERTEX, 0); + intel_bo_write (&device->intel, vbo, 0, device->vbo_used, device->vbo_base); + device->last_vbo = vbo; + device->last_vbo_offset = (device->vbo_used+7)&-8; + device->last_vbo_space = vbo->base.size - device->last_vbo_offset; + + device->vbo = 0; + + device->vbo_used = device->vbo_offset = 0; + device->vertex_index = device->vertex_count = 0; + + if (! i915_check_aperture_size (device, 1, I915_VBO_SIZE, I915_VBO_SIZE)) { + cairo_status_t status; + + status = i915_batch_flush (device); + if (unlikely (status)) + longjmp (device->shader->unwind, status); + + status = i915_shader_commit (device->shader, device); + if (unlikely (status)) + longjmp (device->shader->unwind, status); + } +} + +/* XXX improve state tracker/difference and flush state on vertex emission */ +static void +i915_device_reset (i915_device_t *device) +{ + if (device->current_source != NULL) + *device->current_source = 0; + if (device->current_mask != NULL) + *device->current_mask = 0; + if (device->current_clip != NULL) + *device->current_clip = 0; + + device->current_target = NULL; + device->current_size = 0; + device->current_source = NULL; + device->current_mask = NULL; + device->current_clip = NULL; + device->current_texcoords = ~0; + device->current_blend = 0; + device->current_n_constants = 0; + device->current_n_samplers = 0; + device->current_n_maps = 0; + device->current_colorbuf = 0; + device->current_diffuse = 0; + device->current_program = ~0; + device->clear_alpha = ~0; + + device->last_source_fragment = ~0; +} + +static void +i915_batch_cleanup (i915_device_t *device) +{ + int i; + + for (i = 0; i < device->batch.exec_count; i++) { + intel_bo_t *bo = device->batch.target_bo[i]; + + bo->exec = NULL; + bo->batch_read_domains = 0; + bo->batch_write_domain = 0; + cairo_list_del (&bo->cache_list); + + intel_bo_destroy (&device->intel, bo); + } + + device->batch.exec_count = 0; + device->batch.reloc_count = 0; +} + +static void +i915_batch_vbo_finish (i915_device_t *device) +{ + assert (CAIRO_MUTEX_IS_LOCKED (device->intel.base.base.mutex)); + + if (device->vbo || i915_batch_space (device) < (int32_t) device->vbo_used) { + intel_bo_t *vbo; + + if (device->vertex_count) { + if (device->vbo == 0) { + OUT_DWORD (_3DSTATE_LOAD_STATE_IMMEDIATE_1 | + I1_LOAD_S (0) | + I1_LOAD_S (1) | + 1); + device->vbo = device->batch.used++; + device->vbo_max_index = device->batch.used; + OUT_DWORD ((device->floats_per_vertex << S1_VERTEX_WIDTH_SHIFT) | + (device->floats_per_vertex << S1_VERTEX_PITCH_SHIFT)); + } + + OUT_DWORD (PRIM3D_RECTLIST | + PRIM3D_INDIRECT_SEQUENTIAL | + device->vertex_count); + OUT_DWORD (device->vertex_index); + } + + if (device->last_vbo != NULL) + intel_bo_destroy (&device->intel, device->last_vbo); + + device->batch_base[device->vbo_max_index] |= device->vertex_index + device->vertex_count; + + /* will include a few bytes of inter-array padding */ + vbo = intel_bo_create (&device->intel, + device->vbo_used, device->vbo_used, + FALSE, I915_TILING_NONE, 0); + i915_batch_fill_reloc (device, device->vbo, + vbo, 0, + I915_GEM_DOMAIN_VERTEX, 0); + intel_bo_write (&device->intel, vbo, 0, device->vbo_used, device->vbo_base); + device->last_vbo = vbo; + device->last_vbo_offset = (device->vbo_used+7)&-8; + device->last_vbo_space = vbo->base.size - device->last_vbo_offset; + + device->vbo = 0; + } + else + { + /* Only a single rectlist in this batch, and no active vertex buffer. */ + OUT_DWORD (PRIM3D_RECTLIST | (device->vbo_used / 4 - 1)); + + memcpy (BATCH_PTR (device), device->vbo_base, device->vbo_used); + device->batch.used += device->vbo_used >> 2; + } + + device->vbo_used = device->vbo_offset = 0; + device->vertex_index = device->vertex_count = 0; +} + +cairo_status_t +i915_batch_flush (i915_device_t *device) +{ + intel_bo_t *batch; + cairo_status_t status; + uint32_t length, offset; + int n; + + assert (CAIRO_MUTEX_IS_LOCKED (device->intel.base.base.mutex)); + + if (device->vbo_used) + i915_batch_vbo_finish (device); + + if (device->batch.used == 0) + return CAIRO_STATUS_SUCCESS; + + i915_batch_emit_dword (device, MI_BATCH_BUFFER_END); + if ((device->batch.used & 1) != ((sizeof (device->batch_header)>>2) & 1)) + i915_batch_emit_dword (device, MI_NOOP); + + length = (device->batch.used << 2) + sizeof (device->batch_header); + + /* NB: it is faster to copy the data then map/unmap the batch, + * presumably because we frequently only use a small part of the buffer. + */ + batch = NULL; + if (device->last_vbo) { + if (length <= device->last_vbo_space) { + batch = device->last_vbo; + offset = device->last_vbo_offset; + + /* fixup the relocations */ + for (n = 0; n < device->batch.reloc_count; n++) + device->batch.reloc[n].offset += offset; + } else + intel_bo_destroy (&device->intel, device->last_vbo); + device->last_vbo = NULL; + } + if (batch == NULL) { + batch = intel_bo_create (&device->intel, + length, length, + FALSE, I915_TILING_NONE, 0); + if (unlikely (batch == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + i915_batch_cleanup (device); + goto BAIL; + } + + offset = 0; + } + intel_bo_write (&device->intel, batch, offset, length, device->batch_header); + status = i915_bo_exec (device, batch, offset); + intel_bo_destroy (&device->intel, batch); + +BAIL: + device->batch.used = 0; + + intel_glyph_cache_unpin (&device->intel); + intel_snapshot_cache_thaw (&device->intel); + + i915_device_reset (device); + + return status; +} + +#if 0 +static float * +i915_add_rectangles (i915_device_t *device, int num_rects, int *count) +{ + float *vertices; + uint32_t size; + int cnt; + + assert (device->floats_per_vertex); + + size = device->rectangle_size; + if (unlikely (device->vbo_offset + size > I915_VBO_SIZE)) + i915_vbo_finish (device); + + vertices = (float *) (device->vbo_base + device->vbo_offset); + cnt = (I915_VBO_SIZE - device->vbo_offset) / size; + if (cnt > num_rects) + cnt = num_rects; + device->vbo_used = device->vbo_offset += size * cnt; + device->vertex_count += 3 * cnt; + *count = cnt; + return vertices; +} +#endif + +static cairo_surface_t * +i915_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, int height) +{ + i915_surface_t *other; + cairo_format_t format; + uint32_t tiling = I915_TILING_DEFAULT; + + other = abstract_other; + if (content == other->intel.drm.base.content) + format = other->intel.drm.format; + else + format = _cairo_format_from_content (content); + + if (width * _cairo_format_bits_per_pixel (format) > 8 * 32*1024 || height > 64*1024) + return NULL; + + /* we presume that a similar surface will be used for blitting */ + if (i915_surface_needs_tiling (other)) + tiling = I915_TILING_X; + + return i915_surface_create_internal ((cairo_drm_device_t *) other->intel.drm.base.device, + format, + width, height, + tiling, TRUE); +} + +static cairo_status_t +i915_surface_finish (void *abstract_surface) +{ + i915_surface_t *surface = abstract_surface; + i915_device_t *device = i915_device (surface); + + if (surface->stencil != NULL) { + intel_bo_in_flight_add (&device->intel, surface->stencil); + intel_bo_destroy (&device->intel, surface->stencil); + } + + if (surface->is_current_texture) { + if (surface->is_current_texture & CURRENT_SOURCE) + device->current_source = NULL; + if (surface->is_current_texture & CURRENT_MASK) + device->current_mask = NULL; + if (surface->is_current_texture & CURRENT_CLIP) + device->current_clip = NULL; + device->current_n_samplers = 0; + } + + if (surface == device->current_target) + device->current_target = NULL; + + if (surface->cache != NULL) { + i915_image_private_t *node = surface->cache; + intel_buffer_cache_t *cache = node->container; + + if (--cache->ref_count == 0) { + intel_bo_in_flight_add (&device->intel, cache->buffer.bo); + intel_bo_destroy (&device->intel, cache->buffer.bo); + _cairo_rtree_fini (&cache->rtree); + cairo_list_del (&cache->link); + free (cache); + } else { + node->node.state = CAIRO_RTREE_NODE_AVAILABLE; + cairo_list_move (&node->node.link, &cache->rtree.available); + _cairo_rtree_node_collapse (&cache->rtree, node->node.parent); + } + } + + return intel_surface_finish (&surface->intel); +} + +static cairo_status_t +i915_surface_batch_flush (i915_surface_t *surface) +{ + cairo_status_t status; + intel_bo_t *bo; + + assert (surface->intel.drm.fallback == NULL); + + bo = to_intel_bo (surface->intel.drm.bo); + if (bo == NULL || bo->batch_write_domain == 0) + return CAIRO_STATUS_SUCCESS; + + status = cairo_device_acquire (surface->intel.drm.base.device); + if (unlikely (status)) + return status; + + status = i915_batch_flush (i915_device (surface)); + cairo_device_release (surface->intel.drm.base.device); + + return status; +} + +static cairo_status_t +i915_surface_flush (void *abstract_surface, + unsigned flags) +{ + i915_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (surface->intel.drm.fallback == NULL) { + if (surface->intel.drm.base.finished) { + /* Forgo flushing on finish as the user cannot access the surface directly. */ + return CAIRO_STATUS_SUCCESS; + } + + if (surface->deferred_clear) { + status = i915_surface_clear (surface); + if (unlikely (status)) + return status; + } + + return i915_surface_batch_flush (surface); + } + + return intel_surface_flush (abstract_surface, flags); +} + +/* rasterisation */ + +static cairo_status_t +_composite_boxes_spans (void *closure, + cairo_span_renderer_t *renderer, + const cairo_rectangle_int_t *extents) +{ + cairo_boxes_t *boxes = closure; + cairo_rectangular_scan_converter_t converter; + struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + int i; + + _cairo_rectangular_scan_converter_init (&converter, extents); + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + status = _cairo_rectangular_scan_converter_add_box (&converter, &box[i], 1); + if (unlikely (status)) + goto CLEANUP; + } + } + + status = converter.base.generate (&converter.base, renderer); + +CLEANUP: + converter.base.destroy (&converter.base); + return status; +} + +cairo_status_t +i915_fixup_unbounded (i915_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip) +{ + i915_shader_t shader; + i915_device_t *device; + cairo_status_t status; + + if (clip != NULL) { + cairo_region_t *clip_region = NULL; + + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + assert (clip_region == NULL); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + clip = NULL; + } else { + if (extents->bounded.width == extents->unbounded.width && + extents->bounded.height == extents->unbounded.height) + { + return CAIRO_STATUS_SUCCESS; + } + } + + if (clip != NULL) { + i915_shader_init (&shader, dst, CAIRO_OPERATOR_DEST_OVER, 1.); + i915_shader_set_clip (&shader, clip); + status = i915_shader_acquire_pattern (&shader, + &shader.source, + &_cairo_pattern_white.base, + &extents->unbounded); + assert (status == CAIRO_STATUS_SUCCESS); + } else { + i915_shader_init (&shader, dst, CAIRO_OPERATOR_CLEAR, 1.); + status = i915_shader_acquire_pattern (&shader, + &shader.source, + &_cairo_pattern_clear.base, + &extents->unbounded); + assert (status == CAIRO_STATUS_SUCCESS); + } + + device = i915_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + return status; + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto BAIL; + + if (extents->bounded.width == 0 || extents->bounded.height == 0) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->unbounded.y, + extents->unbounded.width, + extents->unbounded.height); + } else { + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->unbounded.y, + extents->unbounded.width, + extents->bounded.y - extents->unbounded.y); + } + + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->bounded.y, + extents->bounded.x - extents->unbounded.x, + extents->bounded.height); + } + + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + shader.add_rectangle (&shader, + extents->bounded.x + extents->bounded.width, + extents->bounded.y, + extents->unbounded.x + extents->unbounded.width - (extents->bounded.x + extents->bounded.width), + extents->bounded.height); + } + + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->bounded.y + extents->bounded.height, + extents->unbounded.width, + extents->unbounded.y + extents->unbounded.height - (extents->bounded.y + extents->bounded.height)); + } + } + + i915_shader_fini (&shader); + BAIL: + cairo_device_release (&device->intel.base.base); + return status; +} + +static cairo_status_t +i915_fixup_unbounded_boxes (i915_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip, + cairo_boxes_t *boxes) +{ + cairo_boxes_t clear; + cairo_box_t box; + cairo_region_t *clip_region = NULL; + cairo_status_t status; + struct _cairo_boxes_chunk *chunk; + int i; + + if (boxes->num_boxes <= 1) + return i915_fixup_unbounded (dst, extents, clip); + + _cairo_boxes_init (&clear); + + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + clip = NULL; + } + + if (clip_region == NULL) { + cairo_boxes_t tmp; + + _cairo_boxes_init (&tmp); + + status = _cairo_boxes_add (&tmp, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + tmp.chunks.next = &boxes->chunks; + tmp.num_boxes += boxes->num_boxes; + + status = _cairo_bentley_ottmann_tessellate_boxes (&tmp, + CAIRO_FILL_RULE_WINDING, + &clear); + + tmp.chunks.next = NULL; + } else { + pixman_box32_t *pbox; + + pbox = pixman_region32_rectangles (&clip_region->rgn, &i); + _cairo_boxes_limit (&clear, (cairo_box_t *) pbox, i); + + status = _cairo_boxes_add (&clear, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + status = _cairo_boxes_add (&clear, &chunk->base[i]); + if (unlikely (status)) { + _cairo_boxes_fini (&clear); + return status; + } + } + } + + status = _cairo_bentley_ottmann_tessellate_boxes (&clear, + CAIRO_FILL_RULE_WINDING, + &clear); + } + + if (likely (status == CAIRO_STATUS_SUCCESS && clear.num_boxes)) { + i915_shader_t shader; + i915_device_t *device; + + if (clip != NULL) { + i915_shader_init (&shader, dst, CAIRO_OPERATOR_DEST_OVER, 1.); + i915_shader_set_clip (&shader, clip); + status = i915_shader_acquire_pattern (&shader, + &shader.source, + &_cairo_pattern_white.base, + &extents->unbounded); + assert (status == CAIRO_STATUS_SUCCESS); + } else { + i915_shader_init (&shader, dst, CAIRO_OPERATOR_CLEAR, 1.); + status = i915_shader_acquire_pattern (&shader, + &shader.source, + &_cairo_pattern_clear.base, + &extents->unbounded); + assert (status == CAIRO_STATUS_SUCCESS); + } + + device = i915_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto err_device; + + for (chunk = &clear.chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + shader.add_rectangle (&shader, x1, y1, x2 - x1, y2 - y1); + } + } +err_device: + cairo_device_release (&device->intel.base.base); +err_shader: + i915_shader_fini (&shader); + } + + _cairo_boxes_fini (&clear); + + return status; +} + +static cairo_bool_t +i915_can_blt (i915_surface_t *dst, + const cairo_pattern_t *pattern) +{ + const cairo_surface_pattern_t *spattern; + i915_surface_t *src; + + spattern = (const cairo_surface_pattern_t *) pattern; + src = (i915_surface_t *) spattern->surface; + + if (src->intel.drm.base.device != dst->intel.drm.base.device) + return FALSE; + + if (! i915_surface_needs_tiling (dst)) + return FALSE; + + if (! _cairo_matrix_is_translation (&pattern->matrix)) + return FALSE; + + if (! (pattern->filter == CAIRO_FILTER_NEAREST || + pattern->filter == CAIRO_FILTER_FAST)) + { + if (! _cairo_fixed_is_integer (_cairo_fixed_from_double (pattern->matrix.x0)) || + ! _cairo_fixed_is_integer (_cairo_fixed_from_double (pattern->matrix.y0))) + { + return FALSE; + } + } + + return _cairo_format_bits_per_pixel (src->intel.drm.format) == + _cairo_format_bits_per_pixel (dst->intel.drm.format); +} + +static cairo_status_t +i915_blt (i915_surface_t *src, + i915_surface_t *dst, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y, + cairo_bool_t flush) +{ + i915_device_t *device; + intel_bo_t *bo_array[2]; + cairo_status_t status; + int br13, cmd; + + bo_array[0] = to_intel_bo (dst->intel.drm.bo); + bo_array[1] = to_intel_bo (src->intel.drm.bo); + + status = i915_surface_fallback_flush (src); + if (unlikely (status)) + return status; + + device = i915_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + return status; + + if (! i915_check_aperture_and_fences (device, bo_array, 2) || + i915_batch_space (device) < 9) + { + status = i915_batch_flush (device); + if (unlikely (status)) + goto CLEANUP; + } + + cmd = XY_SRC_COPY_BLT_CMD; + br13 = (0xCC << 16) | dst->intel.drm.stride; + switch (dst->intel.drm.format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_RGB16_565: + br13 |= BR13_565; + break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_ARGB32: + br13 |= BR13_8888; + cmd |= XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB; + break; + } + + OUT_DWORD (cmd); + OUT_DWORD (br13); + OUT_DWORD ((dst_y << 16) | dst_x); + OUT_DWORD (((dst_y + height - 1) << 16) | (dst_x + width - 1)); + OUT_RELOC_FENCED (dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER); + OUT_DWORD ((src_y << 16) | src_x); + OUT_DWORD (src->intel.drm.stride); + OUT_RELOC_FENCED (src, I915_GEM_DOMAIN_RENDER, 0); + /* require explicit RenderCache flush for 2D -> 3D sampler? */ + if (flush) + OUT_DWORD (MI_FLUSH); + +CLEANUP: + cairo_device_release (&device->intel.base.base); + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +i915_surface_copy_subimage (i915_device_t *device, + i915_surface_t *src, + const cairo_rectangle_int_t *extents, + cairo_bool_t flush, + i915_surface_t **clone_out) +{ + i915_surface_t *clone; + cairo_status_t status; + + clone = (i915_surface_t *) + i915_surface_create_internal (&device->intel.base, + src->intel.drm.format, + extents->width, + extents->height, + I915_TILING_X, TRUE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + status = i915_blt (src, clone, + extents->x, extents->y, + extents->width, extents->height, + 0, 0, + flush); + + if (unlikely (status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return status; + } + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i915_clear_boxes (i915_surface_t *dst, + const cairo_boxes_t *boxes) +{ + i915_device_t *device = i915_device (dst); + const struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + intel_bo_t *bo_array[1] = { to_intel_bo (dst->intel.drm.bo) }; + int cmd, br13, clear = 0, i; + + cmd = XY_COLOR_BLT_CMD; + br13 = (0xCC << 16) | dst->intel.drm.stride; + switch (dst->intel.drm.format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_RGB16_565: + br13 |= BR13_565; + break; + case CAIRO_FORMAT_RGB24: + clear = 0xff000000; + case CAIRO_FORMAT_ARGB32: + br13 |= BR13_8888; + cmd |= XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB; + break; + } + + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + return status; + + if (! i915_check_aperture_and_fences (device, bo_array, 1) || + i915_batch_space (device) < 6 * boxes->num_boxes) + { + status = i915_batch_flush (device); + if (unlikely (status)) + goto RELEASE; + } + + if (device->vertex_count) + i915_vbo_flush (device); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (box[i].p1.x); + int x2 = _cairo_fixed_integer_round (box[i].p2.x); + int y1 = _cairo_fixed_integer_round (box[i].p1.y); + int y2 = _cairo_fixed_integer_round (box[i].p2.y); + + if (x2 <= x1 || y2 <= y1) + continue; + + OUT_DWORD (cmd); + OUT_DWORD (br13); + OUT_DWORD ((y1 << 16) | x1); + OUT_DWORD (((y2 - 1) << 16) | (x2 - 1)); + OUT_RELOC_FENCED (dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER); + OUT_DWORD (clear); + } + } + +RELEASE: + cairo_device_release (&device->intel.base.base); + return status; +} + +static cairo_status_t +i915_surface_extract_X_from_Y (i915_device_t *device, + i915_surface_t *src, + const cairo_rectangle_int_t *extents, + i915_surface_t **clone_out) +{ + i915_surface_t *clone; + i915_shader_t shader; + cairo_surface_pattern_t pattern; + cairo_rectangle_int_t rect; + cairo_status_t status; + + status = i915_surface_fallback_flush (src); + if (unlikely (status)) + return status; + + clone = (i915_surface_t *) + i915_surface_create_internal (&device->intel.base, + src->intel.drm.format, + extents->width, + extents->height, + I915_TILING_X, TRUE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + i915_shader_init (&shader, clone, CAIRO_OPERATOR_SOURCE, 1.); + + _cairo_pattern_init_for_surface (&pattern, &src->intel.drm.base); + pattern.base.filter = CAIRO_FILTER_NEAREST; + cairo_matrix_init_translate (&pattern.base.matrix, extents->x, extents->y); + + rect.x = rect.y = 0; + rect.width = extents->width; + rect.height = extents->height; + status = i915_shader_acquire_pattern (&shader, &shader.source, &pattern.base, &rect); + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) + goto err_shader; + + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto err_device; + + shader.add_rectangle (&shader, 0, 0, extents->width, extents->height); + + cairo_device_release (&device->intel.base.base); + i915_shader_fini (&shader); + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; + +err_device: + cairo_device_release (&device->intel.base.base); +err_shader: + i915_shader_fini (&shader); + cairo_surface_destroy (&clone->intel.drm.base); + return status; +} + +static cairo_status_t +i915_blt_boxes (i915_surface_t *dst, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents, + const cairo_boxes_t *boxes) +{ + const cairo_surface_pattern_t *spattern; + i915_device_t *device; + i915_surface_t *src; + cairo_surface_t *free_me = NULL; + const struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + int br13, cmd, tx, ty; + intel_bo_t *bo_array[2]; + int i; + + if (! i915_can_blt (dst, pattern)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + spattern = (const cairo_surface_pattern_t *) pattern; + src = (i915_surface_t *) spattern->surface; + + if (src->intel.drm.base.is_clear) + return i915_clear_boxes (dst, boxes); + + if (pattern->extend != CAIRO_EXTEND_NONE && + (extents->x + tx < 0 || + extents->y + ty < 0 || + extents->x + tx + extents->width > src->intel.drm.width || + extents->y + ty + extents->height > src->intel.drm.height)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = i915_surface_fallback_flush (src); + if (unlikely (status)) + return status; + + tx = _cairo_lround (pattern->matrix.x0); + ty = _cairo_lround (pattern->matrix.y0); + + device = i915_device (dst); + if (to_intel_bo (src->intel.drm.bo)->tiling == I915_TILING_Y) { + cairo_rectangle_int_t extents; + + _cairo_boxes_extents (boxes, &extents); + extents.x += tx; + extents.y += ty; + + status = i915_surface_extract_X_from_Y (device, src, &extents, &src); + if (unlikely (status)) + return status; + + free_me = &src->intel.drm.base; + tx = -extents.x; + ty = -extents.y; + } + + bo_array[0] = to_intel_bo (dst->intel.drm.bo); + bo_array[1] = to_intel_bo (src->intel.drm.bo); + + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto CLEANUP_SURFACE; + + if (! i915_check_aperture_and_fences (device, bo_array, 2) || + i915_batch_space (device) < 8 * boxes->num_boxes) + { + status = i915_batch_flush (device); + if (unlikely (status)) + goto CLEANUP_DEVICE; + } + + cmd = XY_SRC_COPY_BLT_CMD; + br13 = (0xCC << 16) | dst->intel.drm.stride; + switch (dst->intel.drm.format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_RGB16_565: + br13 |= BR13_565; + break; + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_ARGB32: + br13 |= BR13_8888; + cmd |= XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB; + break; + } + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + const cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (box[i].p1.x); + int x2 = _cairo_fixed_integer_round (box[i].p2.x); + int y1 = _cairo_fixed_integer_round (box[i].p1.y); + int y2 = _cairo_fixed_integer_round (box[i].p2.y); + + if (x1 + tx < 0) + x1 = -tx; + if (x2 + tx > src->intel.drm.width) + x2 = src->intel.drm.width - tx; + + if (y1 + ty < 0) + y1 = -ty; + if (y2 + ty > src->intel.drm.height) + y2 = src->intel.drm.height - ty; + + if (x2 <= x1 || y2 <= y1) + continue; + if (x2 < 0 || y2 < 0) + continue; + if (x1 >= dst->intel.drm.width || y2 >= dst->intel.drm.height) + continue; + + OUT_DWORD (cmd); + OUT_DWORD (br13); + OUT_DWORD ((y1 << 16) | x1); + OUT_DWORD (((y2 - 1) << 16) | (x2 - 1)); + OUT_RELOC_FENCED (dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER); + OUT_DWORD (((y1 + ty) << 16) | (x1 + tx)); + OUT_DWORD (src->intel.drm.stride); + OUT_RELOC_FENCED (src, I915_GEM_DOMAIN_RENDER, 0); + } + } + + /* XXX fixup blank portions */ + +CLEANUP_DEVICE: + cairo_device_release (&device->intel.base.base); +CLEANUP_SURFACE: + cairo_surface_destroy (free_me); + return status; +} + +static cairo_status_t +_upload_image_inplace (i915_surface_t *surface, + const cairo_pattern_t *source, + const cairo_rectangle_int_t *extents, + const cairo_boxes_t *boxes) +{ + i915_device_t *device; + const cairo_surface_pattern_t *pattern; + cairo_image_surface_t *image; + const struct _cairo_boxes_chunk *chunk; + intel_bo_t *bo; + int tx, ty, i; + + if (source->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + pattern = (const cairo_surface_pattern_t *) source; + if (pattern->surface->type != CAIRO_SURFACE_TYPE_IMAGE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, &tx, &ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + image = (cairo_image_surface_t *) pattern->surface; + if (source->extend != CAIRO_EXTEND_NONE && + (extents->x + tx < 0 || + extents->y + ty < 0 || + extents->x + tx + extents->width > image->width || + extents->y + ty + extents->height > image->height)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + device = i915_device (surface); + bo = to_intel_bo (surface->intel.drm.bo); + if (bo->exec != NULL || ! intel_bo_is_inactive (&device->intel, bo)) { + intel_bo_t *new_bo; + cairo_bool_t need_clear = FALSE; + + if (boxes->num_boxes != 1 || + extents->width < surface->intel.drm.width || + extents->height < surface->intel.drm.height) + { + if (! surface->intel.drm.base.is_clear) + return CAIRO_INT_STATUS_UNSUPPORTED; + + need_clear = TRUE; + } + + new_bo = intel_bo_create (&device->intel, + bo->full_size, bo->base.size, + FALSE, bo->tiling, bo->stride); + if (unlikely (new_bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + intel_bo_in_flight_add (&device->intel, bo); + intel_bo_destroy (&device->intel, bo); + + bo = new_bo; + surface->intel.drm.bo = &bo->base; + + if (need_clear) { + memset (intel_bo_map (&device->intel, bo), 0, + bo->stride * surface->intel.drm.height); + } + } + + if (image->format == surface->intel.drm.format) { + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (box[i].p1.x); + int x2 = _cairo_fixed_integer_round (box[i].p2.x); + int y1 = _cairo_fixed_integer_round (box[i].p1.y); + int y2 = _cairo_fixed_integer_round (box[i].p2.y); + cairo_status_t status; + + if (x1 + tx < 0) + x1 = -tx; + if (x2 + tx > image->width) + x2 = image->width - tx; + + if (y1 + ty < 0) + y1 = -ty; + if (y2 + ty > image->height) + y2 = image->height - ty; + + if (x2 <= x1 || y2 <= y1) + continue; + if (x2 < 0 || y2 < 0) + continue; + if (x1 >= surface->intel.drm.width || y2 >= surface->intel.drm.height) + continue; + + status = intel_bo_put_image (&device->intel, + bo, + image, + x1 + tx, y1 + ty, + x2 - x1, y2 - y1, + x1, y1); + if (unlikely (status)) + return status; + } + } + } else { + pixman_image_t *dst; + void *ptr; + + ptr = intel_bo_map (&device->intel, bo); + if (unlikely (ptr == NULL)) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + dst = pixman_image_create_bits (_cairo_format_to_pixman_format_code (surface->intel.drm.format), + surface->intel.drm.width, + surface->intel.drm.height, + ptr, + surface->intel.drm.stride); + if (unlikely (dst == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (box[i].p1.x); + int x2 = _cairo_fixed_integer_round (box[i].p2.x); + int y1 = _cairo_fixed_integer_round (box[i].p1.y); + int y2 = _cairo_fixed_integer_round (box[i].p2.y); + + if (x1 + tx < 0) + x1 = -tx; + if (x2 + tx > image->width) + x2 = image->width - tx; + + if (y1 + ty < 0) + y1 = -ty; + if (y2 + ty > image->height) + y2 = image->height - ty; + + if (x2 <= x1 || y2 <= y1) + continue; + if (x2 < 0 || y2 < 0) + continue; + if (x1 >= surface->intel.drm.width || y2 >= surface->intel.drm.height) + continue; + + pixman_image_composite32 (PIXMAN_OP_SRC, + image->pixman_image, NULL, dst, + x1 + tx, y1 + ty, + 0, 0, + x1, y1, + x2 - x1, y2 - y1); + } + } + + pixman_image_unref (dst); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_composite_boxes (i915_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_boxes_t *boxes, + cairo_antialias_t antialias, + cairo_clip_t *clip, + double opacity, + const cairo_composite_rectangles_t *extents) +{ + cairo_bool_t need_clip_surface = FALSE; + cairo_region_t *clip_region = NULL; + const struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + i915_shader_t shader; + i915_device_t *device; + int i; + + /* If the boxes are not pixel-aligned, we will need to compute a real mask */ + if (antialias != CAIRO_ANTIALIAS_NONE) { + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + if (clip == NULL && op == CAIRO_OPERATOR_SOURCE && opacity == 1.) { + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + status = i915_blt_boxes (dst, pattern, &extents->bounded, boxes); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _upload_image_inplace (dst, pattern, + &extents->bounded, boxes); + } + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + } + + if (i915_surface_needs_tiling (dst)) { + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + i915_shader_init (&shader, dst, op, opacity); + + status = i915_shader_acquire_pattern (&shader, + &shader.source, + pattern, + &extents->bounded); + if (unlikely (status)) + return status; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + need_clip_surface = status == CAIRO_INT_STATUS_UNSUPPORTED; + if (need_clip_surface) + i915_shader_set_clip (&shader, clip); + } + + device = i915_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto err_device; + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (box[i].p1.x); + int y1 = _cairo_fixed_integer_round (box[i].p1.y); + int x2 = _cairo_fixed_integer_round (box[i].p2.x); + int y2 = _cairo_fixed_integer_round (box[i].p2.y); + + if (x2 > x1 && y2 > y1) + shader.add_rectangle (&shader, x1, y1, x2 - x1, y2 - y1); + } + } + + if (! extents->is_bounded) + status = i915_fixup_unbounded_boxes (dst, extents, clip, boxes); + + err_device: + cairo_device_release (&device->intel.base.base); + err_shader: + i915_shader_fini (&shader); + + return status; +} + +cairo_status_t +i915_surface_clear (i915_surface_t *dst) +{ + i915_device_t *device; + cairo_status_t status; + intel_bo_t *bo_array[1] = { to_intel_bo (dst->intel.drm.bo) }; + + device = i915_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + return status; + + if (i915_surface_needs_tiling (dst)) { + int cmd, br13, clear = 0; + + if (! i915_check_aperture_and_fences (device, bo_array, 1) || + i915_batch_space (device) < 6) + { + status = i915_batch_flush (device); + if (unlikely (status)) { + cairo_device_release (&device->intel.base.base); + return status; + } + } + + if (device->vertex_count) + i915_vbo_flush (device); + + cmd = XY_COLOR_BLT_CMD; + br13 = (0xCC << 16) | dst->intel.drm.stride; + switch (dst->intel.drm.format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_RGB16_565: + br13 |= BR13_565; + break; + case CAIRO_FORMAT_RGB24: + clear = 0xff000000; + case CAIRO_FORMAT_ARGB32: + br13 |= BR13_8888; + cmd |= XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB; + break; + } + + OUT_DWORD (cmd); + OUT_DWORD (br13); + OUT_DWORD (0); + OUT_DWORD (((dst->intel.drm.height - 1) << 16) | + (dst->intel.drm.width - 1)); + OUT_RELOC_FENCED (dst, + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER); + OUT_DWORD (clear); + } else { + if (! i915_check_aperture (device, bo_array, 1) || + i915_batch_space (device) < 24) + { + status = i915_batch_flush (device); + if (unlikely (status)) { + cairo_device_release (&device->intel.base.base); + return status; + } + } + + if (device->vertex_count) + i915_vbo_flush (device); + + i915_set_dst (device, dst); + + /* set clear parameters */ + if (device->clear_alpha != (dst->intel.drm.base.content & CAIRO_CONTENT_ALPHA)) { + device->clear_alpha = dst->intel.drm.base.content & CAIRO_CONTENT_ALPHA; + OUT_DWORD (_3DSTATE_CLEAR_PARAMETERS); + OUT_DWORD (CLEARPARAM_CLEAR_RECT | CLEARPARAM_WRITE_COLOR); + /* ZONE_INIT color */ + if (device->clear_alpha) /* XXX depends on pixel format, 16bit needs replication, 8bit? */ + OUT_DWORD (0x00000000); + else + OUT_DWORD (0xff000000); + OUT_DWORD (0); /* ZONE_INIT depth */ + /* CLEAR_RECT color */ + if (device->clear_alpha) + OUT_DWORD (0x00000000); + else + OUT_DWORD (0xff000000); + OUT_DWORD (0); /* CLEAR_RECT depth */ + OUT_DWORD (0); /* CLEAR_RECT stencil */ + } + + OUT_DWORD (PRIM3D_CLEAR_RECT | 5); + OUT_DWORD (pack_float (dst->intel.drm.width)); + OUT_DWORD (pack_float (dst->intel.drm.height)); + OUT_DWORD (0); + OUT_DWORD (pack_float (dst->intel.drm.height)); + OUT_DWORD (0); + OUT_DWORD (0); + } + + cairo_device_release (&device->intel.base.base); + + dst->deferred_clear = FALSE; + return status; +} + +static cairo_status_t +_clip_and_composite_boxes (i915_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + cairo_boxes_t *boxes, + cairo_antialias_t antialias, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip, + double opacity) +{ + cairo_status_t status; + + if (boxes->num_boxes == 0) { + if (extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + return i915_fixup_unbounded (dst, extents, clip); + } + + if (clip == NULL && + (op == CAIRO_OPERATOR_SOURCE || (op == CAIRO_OPERATOR_OVER && dst->intel.drm.base.is_clear)) && + opacity == 1. && + boxes->num_boxes == 1 && + extents->bounded.width == dst->intel.drm.width && + extents->bounded.height == dst->intel.drm.height) + { + op = CAIRO_OPERATOR_SOURCE; + dst->deferred_clear = FALSE; + + status = _upload_image_inplace (dst, src, + &extents->bounded, boxes); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + } + + if (dst->deferred_clear) { + status = i915_surface_clear (dst); + if (unlikely (status)) + return status; + } + + /* Use a fast path if the boxes are pixel aligned */ + status = _composite_boxes (dst, op, src, boxes, antialias, clip, opacity, extents); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + /* Otherwise render the boxes via an implicit mask and composite in the usual + * fashion. + */ + return i915_clip_and_composite_spans (dst, op, src, antialias, + _composite_boxes_spans, boxes, + extents, clip, opacity); +} + +static cairo_clip_path_t * +_clip_get_solitary_path (cairo_clip_t *clip) +{ + cairo_clip_path_t *iter = clip->path; + cairo_clip_path_t *path = NULL; + + do { + if ((iter->flags & CAIRO_CLIP_PATH_IS_BOX) == 0) { + if (path != NULL) + return FALSE; + + path = iter; + } + iter = iter->prev; + } while (iter != NULL); + + return path; +} + +typedef struct { + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; +} composite_polygon_info_t; + +static cairo_status_t +_composite_polygon_spans (void *closure, + cairo_span_renderer_t *renderer, + const cairo_rectangle_int_t *extents) +{ + composite_polygon_info_t *info = closure; + cairo_botor_scan_converter_t converter; + cairo_status_t status; + cairo_box_t box; + + box.p1.x = _cairo_fixed_from_int (extents->x); + box.p1.y = _cairo_fixed_from_int (extents->y); + box.p2.x = _cairo_fixed_from_int (extents->x + extents->width); + box.p2.y = _cairo_fixed_from_int (extents->y + extents->height); + + _cairo_botor_scan_converter_init (&converter, &box, info->fill_rule); + + status = converter.base.add_polygon (&converter.base, &info->polygon); + if (likely (status == CAIRO_STATUS_SUCCESS)) + status = converter.base.generate (&converter.base, renderer); + + converter.base.destroy (&converter.base); + + return status; +} + +static cairo_int_status_t +i915_surface_fill_with_alpha (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip, + double opacity) +{ + i915_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + composite_polygon_info_t info; + cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack; + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + int num_boxes = ARRAY_LENGTH (boxes_stack); + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_fill (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, path, + clip); + if (unlikely (status)) + return status; + + if (_cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (extents.is_bounded && clip != NULL) { + cairo_clip_path_t *clip_path; + + if (((clip_path = _clip_get_solitary_path (clip)) != NULL) && + _cairo_path_fixed_equal (&clip_path->path, path)) + { + clip = NULL; + } + } + + if (clip != NULL) { + clip = _cairo_clip_init_copy (&local_clip, clip); + have_clip = TRUE; + } + + status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes); + if (unlikely (status)) { + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; + } + + assert (! _cairo_path_fixed_fill_is_empty (path)); + + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + _cairo_boxes_limit (&boxes, clip_boxes, num_boxes); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + &boxes); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _clip_and_composite_boxes (dst, op, source, + &boxes, antialias, + &extents, clip, + opacity); + } + + _cairo_boxes_fini (&boxes); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto CLEANUP_BOXES; + } + + _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes); + + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &info.polygon); + if (unlikely (status)) + goto CLEANUP_POLYGON; + + if (extents.is_bounded) { + cairo_rectangle_int_t rect; + + _cairo_box_round_to_rectangle (&info.polygon.extents, &rect); + if (! _cairo_rectangle_intersect (&extents.bounded, &rect)) + goto CLEANUP_POLYGON; + } + + if (info.polygon.num_edges == 0) { + if (! extents.is_bounded) + status = i915_fixup_unbounded (dst, &extents, clip); + + goto CLEANUP_POLYGON; + } + + info.fill_rule = fill_rule; + info.antialias = antialias; + status = i915_clip_and_composite_spans (dst, op, source, antialias, + _composite_polygon_spans, &info, + &extents, clip, opacity); + +CLEANUP_POLYGON: + _cairo_polygon_fini (&info.polygon); + +CLEANUP_BOXES: + if (clip_boxes != boxes_stack) + free (clip_boxes); + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static cairo_int_status_t +i915_surface_paint_with_alpha (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_clip_t *clip, + double opacity) +{ + i915_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + cairo_clip_path_t *clip_path; + cairo_boxes_t boxes; + int num_boxes = ARRAY_LENGTH (boxes.boxes_embedded); + cairo_box_t *clip_boxes = boxes.boxes_embedded; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_paint (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, + clip); + if (unlikely (status)) + return status; + + if (_cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL) { + clip = _cairo_clip_init_copy (&local_clip, clip); + have_clip = TRUE; + } + + status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes); + if (unlikely (status)) { + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; + } + + /* If the clip cannot be reduced to a set of boxes, we will need to + * use a clipmask. Paint is special as it is the only operation that + * does not implicitly use a mask, so we may be able to reduce this + * operation to a fill... + */ + if (clip != NULL && + extents.is_bounded && + (clip_path = _clip_get_solitary_path (clip)) != NULL) + { + status = i915_surface_fill_with_alpha (dst, op, source, + &clip_path->path, + clip_path->fill_rule, + clip_path->tolerance, + clip_path->antialias, + NULL, opacity); + } + else + { + _cairo_boxes_init_for_array (&boxes, clip_boxes, num_boxes); + status = _clip_and_composite_boxes (dst, op, source, + &boxes, CAIRO_ANTIALIAS_DEFAULT, + &extents, clip, opacity); + } + if (clip_boxes != boxes.boxes_embedded) + free (clip_boxes); + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static cairo_int_status_t +i915_surface_paint (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_clip_t *clip) +{ + i915_surface_t *dst = abstract_dst; + + /* XXX unsupported operators? use pixel shader blending, eventually */ + + if (op == CAIRO_OPERATOR_CLEAR && clip == NULL) { + dst->deferred_clear = TRUE; + return CAIRO_STATUS_SUCCESS; + } + + return i915_surface_paint_with_alpha (dst, op, source, clip, 1.); +} + +static cairo_int_status_t +i915_surface_mask (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + cairo_clip_t *clip) +{ + i915_surface_t *dst = abstract_dst; + i915_device_t *device; + cairo_composite_rectangles_t extents; + i915_shader_t shader; + cairo_clip_t local_clip; + cairo_region_t *clip_region = NULL; + cairo_bool_t need_clip_surface = FALSE; + cairo_bool_t have_clip = FALSE; + cairo_status_t status; + + if (mask->type == CAIRO_PATTERN_TYPE_SOLID) { + const cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) mask; + return i915_surface_paint_with_alpha (dst, op, source, clip, solid->color.alpha); + } + + status = _cairo_composite_rectangles_init_for_mask (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, mask, clip); + if (unlikely (status)) + return status; + + if (_cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL && extents.is_bounded) { + clip = _cairo_clip_init_copy (&local_clip, clip); + status = _cairo_clip_rectangle (clip, &extents.bounded); + if (unlikely (status)) { + _cairo_clip_fini (&local_clip); + return status; + } + + have_clip = TRUE; + } + + i915_shader_init (&shader, dst, op, 1.); + + status = i915_shader_acquire_pattern (&shader, + &shader.source, + source, + &extents.bounded); + if (unlikely (status)) + goto err_shader; + + status = i915_shader_acquire_pattern (&shader, + &shader.mask, + mask, + &extents.bounded); + if (unlikely (status)) + goto err_shader; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + if (unlikely (_cairo_status_is_error (status) || + status == CAIRO_INT_STATUS_NOTHING_TO_DO)) + { + goto err_shader; + } + + need_clip_surface = status == CAIRO_INT_STATUS_UNSUPPORTED; + if (need_clip_surface) + i915_shader_set_clip (&shader, clip); + + if (clip_region != NULL) { + cairo_rectangle_int_t rect; + cairo_bool_t is_empty; + + status = CAIRO_STATUS_SUCCESS; + cairo_region_get_extents (clip_region, &rect); + is_empty = ! _cairo_rectangle_intersect (&extents.unbounded, &rect); + if (unlikely (is_empty)) + goto err_shader; + + is_empty = ! _cairo_rectangle_intersect (&extents.bounded, &rect); + if (unlikely (is_empty && extents.is_bounded)) + goto err_shader; + + if (cairo_region_num_rectangles (clip_region) == 1) + clip_region = NULL; + } + } + + if (i915_surface_needs_tiling (dst)) { + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + device = i915_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + if (dst->deferred_clear) { + status = i915_surface_clear (dst); + if (unlikely (status)) + goto err_shader; + } + + status = i915_shader_commit (&shader, device); + if (unlikely (status)) + goto err_device; + + if (clip_region != NULL) { + unsigned int n, num_rectangles; + + num_rectangles = cairo_region_num_rectangles (clip_region); + for (n = 0; n < num_rectangles; n++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, n, &rect); + + shader.add_rectangle (&shader, + rect.x, rect.y, + rect.x + rect.width, rect.y + rect.height); + } + } else { + shader.add_rectangle (&shader, + extents.bounded.x, extents.bounded.y, + extents.bounded.x + extents.bounded.width, + extents.bounded.y + extents.bounded.height); + } + + if (! extents.is_bounded) + status = i915_fixup_unbounded (dst, &extents, clip); + + err_device: + cairo_device_release (&device->intel.base.base); + err_shader: + i915_shader_fini (&shader); + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static cairo_int_status_t +i915_surface_stroke (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + i915_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + composite_polygon_info_t info; + cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack; + int num_boxes = ARRAY_LENGTH (boxes_stack); + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_stroke (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, + path, stroke_style, ctm, + clip); + if (unlikely (status)) + return status; + + if (_cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL) { + clip = _cairo_clip_init_copy (&local_clip, clip); + have_clip = TRUE; + } + + status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes); + if (unlikely (status)) { + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; + } + + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + _cairo_boxes_limit (&boxes, clip_boxes, num_boxes); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + stroke_style, + ctm, + &boxes); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _clip_and_composite_boxes (dst, op, source, + &boxes, antialias, + &extents, clip, 1.); + } + + _cairo_boxes_fini (&boxes); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto CLEANUP_BOXES; + } + + _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes); + + status = _cairo_path_fixed_stroke_to_polygon (path, + stroke_style, + ctm, ctm_inverse, + tolerance, + &info.polygon); + if (unlikely (status)) + goto CLEANUP_POLYGON; + + if (extents.is_bounded) { + cairo_rectangle_int_t rect; + + _cairo_box_round_to_rectangle (&info.polygon.extents, &rect); + if (! _cairo_rectangle_intersect (&extents.bounded, &rect)) + goto CLEANUP_POLYGON; + } + + if (info.polygon.num_edges == 0) { + if (! extents.is_bounded) + status = i915_fixup_unbounded (dst, &extents, clip); + + goto CLEANUP_POLYGON; + } + + info.fill_rule = CAIRO_FILL_RULE_WINDING; + info.antialias = antialias; + status = i915_clip_and_composite_spans (dst, op, source, antialias, + _composite_polygon_spans, &info, + &extents, clip, 1.); + +CLEANUP_POLYGON: + _cairo_polygon_fini (&info.polygon); + +CLEANUP_BOXES: + if (clip_boxes != boxes_stack) + free (clip_boxes); + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static cairo_int_status_t +i915_surface_fill (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t*source, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + return i915_surface_fill_with_alpha (abstract_dst, op, source, path, fill_rule, tolerance, antialias, clip, 1.); +} + +static const cairo_surface_backend_t i915_surface_backend = { + CAIRO_SURFACE_TYPE_DRM, + _cairo_default_context_create, + + i915_surface_create_similar, + i915_surface_finish, + + NULL, + intel_surface_acquire_source_image, + intel_surface_release_source_image, + + NULL, NULL, NULL, + NULL, /* composite */ + NULL, /* fill */ + NULL, /* trapezoids */ + NULL, /* span */ + NULL, /* check-span */ + + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_drm_surface_get_extents, + NULL, /* old-glyphs */ + _cairo_drm_surface_get_font_options, + + i915_surface_flush, + NULL, /* mark_dirty */ + intel_scaled_font_fini, + intel_scaled_glyph_fini, + + i915_surface_paint, + i915_surface_mask, + i915_surface_stroke, + i915_surface_fill, + i915_surface_glyphs, +}; + +static void +i915_surface_init (i915_surface_t *surface, + cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + intel_surface_init (&surface->intel, &i915_surface_backend, device, + format, width, height); + + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_ARGB32: + surface->map0 = MAPSURF_32BIT | MT_32BIT_ARGB8888; + surface->colorbuf = COLR_BUF_ARGB8888 | DEPTH_FRMT_24_FIXED_8_OTHER; + break; + case CAIRO_FORMAT_RGB24: + surface->map0 = MAPSURF_32BIT | MT_32BIT_XRGB8888; + surface->colorbuf = COLR_BUF_ARGB8888 | DEPTH_FRMT_24_FIXED_8_OTHER; + break; + case CAIRO_FORMAT_RGB16_565: + surface->map0 = MAPSURF_16BIT | MT_16BIT_RGB565; + surface->colorbuf = COLR_BUF_RGB565; + break; + case CAIRO_FORMAT_A8: + surface->map0 = MAPSURF_8BIT | MT_8BIT_A8; + surface->colorbuf = COLR_BUF_8BIT | DEPTH_FRMT_24_FIXED_8_OTHER; + break; + } + surface->colorbuf |= DSTORG_HORT_BIAS (0x8) | DSTORG_VERT_BIAS (0x8); + surface->map0 |= ((height - 1) << MS3_HEIGHT_SHIFT) | + ((width - 1) << MS3_WIDTH_SHIFT); + surface->map1 = 0; + + surface->is_current_texture = 0; + surface->deferred_clear = FALSE; + + surface->offset = 0; + + surface->stencil = NULL; + surface->cache = NULL; +} + +cairo_surface_t * +i915_surface_create_internal (cairo_drm_device_t *base_dev, + cairo_format_t format, + int width, int height, + uint32_t tiling, + cairo_bool_t gpu_target) +{ + i915_surface_t *surface; + cairo_status_t status_ignored; + + surface = malloc (sizeof (i915_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + i915_surface_init (surface, base_dev, format, width, height); + + if (width && height) { + uint32_t size, stride; + intel_bo_t *bo; + + width = (width + 3) & -4; + stride = cairo_format_stride_for_width (surface->intel.drm.format, width); + /* check for tiny surfaces for which tiling is irrelevant */ + if (height * stride <= 4096) + tiling = I915_TILING_NONE; + if (tiling != I915_TILING_NONE && stride <= 512) + tiling = I915_TILING_NONE; + if (tiling != I915_TILING_NONE) { + if (height <= 8) + tiling = I915_TILING_NONE; + else if (height <= 16) + tiling = I915_TILING_X; + } + /* large surfaces we need to blt, so force TILING_X */ + if (height > 2048) + tiling = I915_TILING_X; + /* but there is a maximum limit to the tiling pitch */ + if (tiling != I915_TILING_NONE && stride > 8192) + tiling = I915_TILING_NONE; + + stride = i915_tiling_stride (tiling, stride); + assert (stride >= (uint32_t) cairo_format_stride_for_width (surface->intel.drm.format, width)); + assert (tiling == I915_TILING_NONE || stride <= 8192); + height = i915_tiling_height (tiling, height); + if (height > 64*1024) { + free (surface); + cairo_device_destroy (&base_dev->base); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + + size = stride * height; + bo = intel_bo_create (to_intel_device (&base_dev->base), + i915_tiling_size (tiling, size), size, + gpu_target, tiling, stride); + if (bo == NULL) { + status_ignored = _cairo_drm_surface_finish (&surface->intel.drm); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + assert (bo->base.size >= size); + + surface->intel.drm.bo = &bo->base; + surface->intel.drm.stride = stride; + + surface->map0 |= MS3_tiling (tiling); + surface->map1 = (stride/4 - 1) << MS4_PITCH_SHIFT; + } + + return &surface->intel.drm.base; +} + +static cairo_surface_t * +i915_surface_create (cairo_drm_device_t *base_dev, + cairo_format_t format, + int width, int height) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_INVALID: + default: + case CAIRO_FORMAT_A1: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + return i915_surface_create_internal (base_dev, format, width, height, + I915_TILING_DEFAULT, TRUE); +} + +static cairo_surface_t * +i915_surface_create_for_name (cairo_drm_device_t *base_dev, + unsigned int name, + cairo_format_t format, + int width, int height, int stride) +{ + i915_surface_t *surface; + + /* Vol I, p134: size restrictions for textures */ + /* Vol I, p129: destination surface stride must be a multiple of 32 bytes */ + if (stride < cairo_format_stride_for_width (format, (width + 3) & -4) || + stride & 31) + { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + } + + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + } + + surface = malloc (sizeof (i915_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + i915_surface_init (surface, base_dev, format, width, height); + + if (width && height) { + surface->intel.drm.stride = stride; + surface->map1 = (surface->intel.drm.stride/4 - 1) << MS4_PITCH_SHIFT; + + surface->intel.drm.bo = + &intel_bo_create_for_name (to_intel_device (&base_dev->base), + name)->base; + if (unlikely (surface->intel.drm.bo == NULL)) { + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + to_intel_bo (surface->intel.drm.bo)->stride = stride; + + surface->map0 |= MS3_tiling (to_intel_bo (surface->intel.drm.bo)->tiling); + } + + return &surface->intel.drm.base; +} + +static cairo_status_t +i915_buffer_cache_init (intel_buffer_cache_t *cache, + i915_device_t *device, + cairo_format_t format, + int width, int height) +{ + const uint32_t tiling = I915_TILING_DEFAULT; + uint32_t stride, size; + + assert ((width & 3) == 0); + assert ((height & 1) == 0); + cache->buffer.width = width; + cache->buffer.height = height; + + switch (format) { + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB16_565: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_ARGB32: + cache->buffer.map0 = MAPSURF_32BIT | MT_32BIT_ARGB8888; + stride = width * 4; + break; + case CAIRO_FORMAT_A8: + cache->buffer.map0 = MAPSURF_8BIT | MT_8BIT_I8; + stride = width; + break; + } + assert ((stride & 7) == 0); + assert (i915_tiling_stride (tiling, stride) == stride); + assert (i915_tiling_height (tiling, height) == height); + + size = height * stride; + assert (i915_tiling_size (tiling, size) == size); + cache->buffer.bo = intel_bo_create (&device->intel, size, size, FALSE, tiling, stride); + if (unlikely (cache->buffer.bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cache->buffer.stride = cache->buffer.bo->stride; + + cache->buffer.map0 |= ((height - 1) << MS3_HEIGHT_SHIFT) | + ((width - 1) << MS3_WIDTH_SHIFT); + cache->buffer.map0 |= MS3_tiling (tiling); + cache->buffer.map1 = ((stride / 4) - 1) << MS4_PITCH_SHIFT; + + cache->ref_count = 0; + cairo_list_init (&cache->link); + + return CAIRO_STATUS_SUCCESS; +} + +i915_surface_t * +i915_surface_create_from_cacheable_image_internal (i915_device_t *device, + cairo_image_surface_t *image) +{ + i915_surface_t *surface; + cairo_status_t status; + cairo_list_t *caches; + intel_buffer_cache_t *cache; + cairo_rtree_node_t *node; + cairo_format_t format; + int width, height, bpp; + + format = image->format; + if (format == CAIRO_FORMAT_A1) + format = CAIRO_FORMAT_A8; + + width = image->width; + height = image->height; + if (width > IMAGE_CACHE_WIDTH/2 || height > IMAGE_CACHE_HEIGHT/2) { + surface = (i915_surface_t *) + i915_surface_create_internal (&device->intel.base, + format, + width, height, + I915_TILING_NONE, FALSE); + if (unlikely (surface->intel.drm.base.status)) + return surface; + + status = intel_bo_put_image (&device->intel, + to_intel_bo (surface->intel.drm.bo), + image, + 0, 0, + width, height, + 0, 0); + + if (unlikely (status)) { + cairo_surface_destroy (&surface->intel.drm.base); + return (i915_surface_t *) _cairo_surface_create_in_error (status); + } + + return surface; + } + + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + return (i915_surface_t *) _cairo_surface_create_in_error (status); + + switch (image->format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB16_565: + caches = &device->image_caches[0]; + format = CAIRO_FORMAT_ARGB32; + bpp = 4; + break; + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + caches = &device->image_caches[1]; + format = CAIRO_FORMAT_A8; + bpp = 1; + break; + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + status = _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + goto CLEANUP_DEVICE; + } + + node = NULL; + cairo_list_foreach_entry (cache, intel_buffer_cache_t, caches, link) { + if (! intel_bo_is_inactive (&device->intel, cache->buffer.bo)) + continue; + + status = _cairo_rtree_insert (&cache->rtree, width, height, &node); + if (unlikely (_cairo_status_is_error (status))) + goto CLEANUP_DEVICE; + if (status == CAIRO_STATUS_SUCCESS) + break; + } + if (node == NULL) { + cache = malloc (sizeof (intel_buffer_cache_t)); + if (unlikely (cache == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_DEVICE; + } + + status = i915_buffer_cache_init (cache, device, format, + IMAGE_CACHE_WIDTH, + IMAGE_CACHE_HEIGHT); + if (unlikely (status)) { + free (cache); + goto CLEANUP_DEVICE; + } + + _cairo_rtree_init (&cache->rtree, + IMAGE_CACHE_WIDTH, + IMAGE_CACHE_HEIGHT, + 4, + sizeof (i915_image_private_t)); + + status = _cairo_rtree_insert (&cache->rtree, width, height, &node); + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_list_init (&cache->link); + } + cairo_list_move (&cache->link, caches); + ((i915_image_private_t *) node)->container = cache; + + status = intel_bo_put_image (&device->intel, + cache->buffer.bo, + image, + 0, 0, + width, height, + node->x, node->y); + if (unlikely (status)) + goto CLEANUP_CACHE; + + surface = malloc (sizeof (i915_surface_t)); + if (unlikely (surface == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_CACHE; + } + + i915_surface_init (surface, &device->intel.base, + format, width, height); + + surface->intel.drm.stride = cache->buffer.stride; + + surface->map0 |= MS3_tiling (cache->buffer.bo->tiling); + surface->map1 = (surface->intel.drm.stride/4 - 1) << MS4_PITCH_SHIFT; + + surface->intel.drm.bo = &intel_bo_reference (cache->buffer.bo)->base; + surface->offset = node->y * cache->buffer.stride + bpp * node->x; + + surface->cache = (i915_image_private_t *) node; + cache->ref_count++; + + cairo_device_release (&device->intel.base.base); + + return surface; + +CLEANUP_CACHE: + _cairo_rtree_node_destroy (&cache->rtree, node); + if (cache->ref_count == 0) { + intel_bo_destroy (&device->intel, cache->buffer.bo); + _cairo_rtree_fini (&cache->rtree); + cairo_list_del (&cache->link); + free (cache); + } +CLEANUP_DEVICE: + cairo_device_release (&device->intel.base.base); + return (i915_surface_t *) _cairo_surface_create_in_error (status); +} + +static cairo_surface_t * +i915_surface_create_from_cacheable_image (cairo_drm_device_t *device, + cairo_surface_t *source) +{ + i915_surface_t *surface; + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + + status = _cairo_surface_acquire_source_image (source, &image, &image_extra); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + surface = i915_surface_create_from_cacheable_image_internal ((i915_device_t *) device, image); + + _cairo_surface_release_source_image (source, image, image_extra); + + return &surface->intel.drm.base; +} + +static cairo_status_t +i915_surface_enable_scan_out (void *abstract_surface) +{ + i915_surface_t *surface = abstract_surface; + intel_bo_t *bo; + cairo_status_t status; + + if (unlikely (surface->intel.drm.bo == NULL)) + return _cairo_error (CAIRO_STATUS_INVALID_SIZE); + + bo = to_intel_bo (surface->intel.drm.bo); + if (bo->tiling == I915_TILING_Y) { + status = i915_surface_batch_flush (surface); + if (unlikely (status)) + return status; + + bo->tiling = I915_TILING_X; + surface->map0 &= ~MS3_tiling (I915_TILING_Y); + surface->map0 |= MS3_tiling (I915_TILING_X); + } + + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +i915_device_flush (cairo_drm_device_t *device) +{ + cairo_status_t status; + + if (unlikely (device->base.finished)) + return CAIRO_STATUS_SUCCESS; + + status = cairo_device_acquire (&device->base); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = i915_batch_flush ((i915_device_t *) device); + cairo_device_release (&device->base); + } + + return status; +} + +static cairo_int_status_t +i915_device_throttle (cairo_drm_device_t *device) +{ + cairo_status_t status; + + status = cairo_device_acquire (&device->base); + if (unlikely (status)) + return status; + + status = i915_batch_flush ((i915_device_t *) device); + intel_throttle ((intel_device_t *) device); + + cairo_device_release (&device->base); + + return status; +} + +static void +i915_device_destroy (void *data) +{ + i915_device_t *device = data; + + if (device->last_vbo) + intel_bo_destroy (&device->intel, device->last_vbo); + + i915_batch_cleanup (device); + + intel_device_fini (&device->intel); + free (device); +} + +COMPILE_TIME_ASSERT (sizeof (i915_batch_setup) == sizeof (((i915_device_t *)0)->batch_header)); +COMPILE_TIME_ASSERT (offsetof (i915_device_t, batch_base) == offsetof (i915_device_t, batch_header) + sizeof (i915_batch_setup)); + +cairo_drm_device_t * +_cairo_drm_i915_device_create (int fd, dev_t dev_id, int vendor_id, int chip_id) +{ + i915_device_t *device; + cairo_status_t status; + uint64_t gtt_size; + int n; + + if (! intel_info (fd, >t_size)) + return NULL; + + device = malloc (sizeof (i915_device_t)); + if (device == NULL) + return (cairo_drm_device_t *) _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + + status = intel_device_init (&device->intel, fd); + if (unlikely (status)) { + free (device); + return (cairo_drm_device_t *) _cairo_device_create_in_error (status); + } + + device->debug = 0; + if (getenv ("CAIRO_DEBUG_DRM") != NULL) + device->debug = I915_DEBUG_SYNC; + + n = intel_get (fd, I915_PARAM_NUM_FENCES_AVAIL); + if (n == 0) + n = 8; + device->batch.fences_avail = n - 2; /* conservative */ + + device->batch.gtt_avail_size = device->intel.gtt_avail_size / 4; + device->batch.est_gtt_size = I915_BATCH_SIZE; + device->batch.total_gtt_size = I915_BATCH_SIZE; + device->batch.exec_count = 0; + device->batch.reloc_count = 0; + device->batch.used = 0; + device->batch.fences = 0; + + memcpy (device->batch_header, i915_batch_setup, sizeof (i915_batch_setup)); + device->vbo = 0; + device->vbo_offset = 0; + device->vbo_used = 0; + device->vertex_index = 0; + device->vertex_count = 0; + device->last_vbo = NULL; + + for (n = 0; n < ARRAY_LENGTH (device->image_caches); n++) + cairo_list_init (&device->image_caches[n]); + + device->intel.base.surface.create = i915_surface_create; + device->intel.base.surface.create_for_name = i915_surface_create_for_name; + device->intel.base.surface.create_from_cacheable_image = i915_surface_create_from_cacheable_image; + + device->intel.base.surface.flink = _cairo_drm_surface_flink; + device->intel.base.surface.enable_scan_out = i915_surface_enable_scan_out; + device->intel.base.surface.map_to_image = intel_surface_map_to_image; + + device->intel.base.device.flush = i915_device_flush; + device->intel.base.device.throttle = i915_device_throttle; + device->intel.base.device.destroy = i915_device_destroy; + + device->floats_per_vertex = 0; + device->current_source = NULL; + device->current_mask = NULL; + device->current_clip = NULL; + + i915_device_reset (device); + + return _cairo_drm_device_init (&device->intel.base, + fd, dev_id, vendor_id, chip_id, + 16*1024); +} diff --git a/src/drm/cairo-drm-i965-glyphs.c b/src/drm/cairo-drm-i965-glyphs.c new file mode 100644 index 000000000..c66a63d73 --- /dev/null +++ b/src/drm/cairo-drm-i965-glyphs.c @@ -0,0 +1,504 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-drm-i965-private.h" +#include "cairo-error-private.h" +#include "cairo-rtree-private.h" + +typedef struct _i965_glyphs i965_glyphs_t; + +typedef float * +(*i965_get_rectangle_func_t) (i965_glyphs_t *glyphs); + +struct _i965_glyphs { + i965_get_rectangle_func_t get_rectangle; + i965_shader_t shader; + + struct i965_vbo head, *tail; + + unsigned int vbo_offset; + float *vbo_base; +}; + +static float * +i965_glyphs_emit_rectangle (i965_glyphs_t *glyphs) +{ + return i965_add_rectangle (glyphs->shader.device); +} + +static float * +i965_glyphs_accumulate_rectangle (i965_glyphs_t *glyphs) +{ + float *vertices; + uint32_t size; + + size = glyphs->shader.device->rectangle_size; + if (unlikely (glyphs->vbo_offset + size > I965_VERTEX_SIZE)) { + struct i965_vbo *vbo; + + vbo = malloc (sizeof (struct i965_vbo)); + if (unlikely (vbo == NULL)) { + /* throw error! */ + } + + glyphs->tail->next = vbo; + glyphs->tail = vbo; + + vbo->next = NULL; + vbo->bo = intel_bo_create (&glyphs->shader.device->intel, + I965_VERTEX_SIZE, I965_VERTEX_SIZE, + FALSE, I915_TILING_NONE, 0); + vbo->count = 0; + + glyphs->vbo_offset = 0; + glyphs->vbo_base = intel_bo_map (&glyphs->shader.device->intel, vbo->bo); + } + + vertices = glyphs->vbo_base + glyphs->vbo_offset; + glyphs->vbo_offset += size; + glyphs->tail->count += 3; + + return vertices; +} + +static void +i965_add_glyph_rectangle (i965_glyphs_t *glyphs, + int x1, int y1, + int x2, int y2, + intel_glyph_t *glyph) +{ + float *v; + + /* Each vertex is: + * 2 vertex coordinates + * 1 glyph texture coordinate + */ + + v = glyphs->get_rectangle (glyphs); + + /* bottom right */ + *v++ = x2; *v++ = y2; + *v++ = glyph->texcoord[0]; + + /* bottom left */ + *v++ = x1; *v++ = y2; + *v++ = glyph->texcoord[1]; + + /* top left */ + *v++ = x1; *v++ = y1; + *v++ = glyph->texcoord[2]; +} + +static cairo_status_t +i965_surface_mask_internal (i965_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *source, + i965_surface_t *mask, + cairo_clip_t *clip, + const cairo_composite_rectangles_t *extents) +{ + i965_device_t *device; + i965_shader_t shader; + cairo_region_t *clip_region = NULL; + cairo_status_t status; + + i965_shader_init (&shader, dst, op); + + status = i965_shader_acquire_pattern (&shader, &shader.source, + source, &extents->bounded); + if (unlikely (status)) + return status; + + shader.mask.type.vertex = VS_NONE; + shader.mask.type.fragment = FS_SURFACE; + shader.mask.base.content = mask->intel.drm.base.content; + shader.mask.base.filter = i965_filter (CAIRO_FILTER_NEAREST); + shader.mask.base.extend = i965_extend (CAIRO_EXTEND_NONE); + + cairo_matrix_init_translate (&shader.mask.base.matrix, + -extents->bounded.x, + -extents->bounded.y); + cairo_matrix_scale (&shader.mask.base.matrix, + 1. / mask->intel.drm.width, + 1. / mask->intel.drm.height); + + shader.mask.base.bo = to_intel_bo (mask->intel.drm.bo); + shader.mask.base.format = mask->intel.drm.format; + shader.mask.base.width = mask->intel.drm.width; + shader.mask.base.height = mask->intel.drm.height; + shader.mask.base.stride = mask->intel.drm.stride; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1) + clip_region = NULL; + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i965_shader_set_clip (&shader, clip); + } + + status = cairo_device_acquire (dst->intel.drm.base.device); + if (unlikely (status)) + goto CLEANUP_SHADER; + + device = i965_device (dst); + + status = i965_shader_commit (&shader, device); + if (unlikely (status)) + goto CLEANUP_DEVICE; + + if (clip_region != NULL) { + unsigned int n, num_rectangles; + + num_rectangles = cairo_region_num_rectangles (clip_region); + for (n = 0; n < num_rectangles; n++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, n, &rect); + + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } + } else { + i965_shader_add_rectangle (&shader, + extents->bounded.x, + extents->bounded.y, + extents->bounded.width, + extents->bounded.height); + } + + if (! extents->is_bounded) + status = i965_fixup_unbounded (dst, extents, clip); + + CLEANUP_DEVICE: + cairo_device_release (&device->intel.base.base); + CLEANUP_SHADER: + i965_shader_fini (&shader); + return status; +} + +cairo_int_status_t +i965_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *g, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining) +{ + i965_surface_t *surface = abstract_surface; + i965_surface_t *mask = NULL; + i965_device_t *device; + i965_glyphs_t glyphs; + cairo_composite_rectangles_t extents; + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + cairo_bool_t overlap; + cairo_region_t *clip_region = NULL; + intel_bo_t *last_bo = NULL; + cairo_scaled_glyph_t *glyph_cache[64]; + cairo_status_t status; + int mask_x = 0, mask_y = 0; + int i = 0; + + *num_remaining = 0; + status = _cairo_composite_rectangles_init_for_glyphs (&extents, + surface->intel.drm.width, + surface->intel.drm.height, + op, source, + scaled_font, + g, num_glyphs, + clip, + &overlap); + if (unlikely (status)) + return status; + + if (clip != NULL && _cairo_clip_contains_rectangle (clip, &extents.mask)) + clip = NULL; + + if (clip != NULL && extents.is_bounded) { + clip = _cairo_clip_init_copy (&local_clip, clip); + status = _cairo_clip_rectangle (clip, &extents.bounded); + if (unlikely (status)) + return status; + + have_clip = TRUE; + } + + if (overlap || ! extents.is_bounded) { + cairo_format_t format; + + format = CAIRO_FORMAT_A8; + if (scaled_font->options.antialias == CAIRO_ANTIALIAS_SUBPIXEL) + format = CAIRO_FORMAT_ARGB32; + + mask = (i965_surface_t *) + i965_surface_create_internal (&i965_device (surface)->intel.base, + format, + extents.bounded.width, + extents.bounded.height, + I965_TILING_DEFAULT, + TRUE); + if (unlikely (mask->intel.drm.base.status)) + return mask->intel.drm.base.status; + + status = _cairo_surface_paint (&mask->intel.drm.base, + CAIRO_OPERATOR_CLEAR, + &_cairo_pattern_clear.base, + NULL); + if (unlikely (status)) { + cairo_surface_destroy (&mask->intel.drm.base); + return status; + } + + i965_shader_init (&glyphs.shader, mask, CAIRO_OPERATOR_ADD); + + status = i965_shader_acquire_pattern (&glyphs.shader, &glyphs.shader.source, + &_cairo_pattern_white.base, + &extents.bounded); + if (unlikely (status)) { + cairo_surface_destroy (&mask->intel.drm.base); + return status; + } + + mask_x = -extents.bounded.x; + mask_y = -extents.bounded.y; + } else { + i965_shader_init (&glyphs.shader, surface, op); + + status = i965_shader_acquire_pattern (&glyphs.shader, &glyphs.shader.source, + source, &extents.bounded); + if (unlikely (status)) + return status; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i965_shader_set_clip (&glyphs.shader, clip); + } + } + + glyphs.head.next = NULL; + glyphs.head.bo = NULL; + glyphs.head.count = 0; + glyphs.tail = &glyphs.head; + + device = i965_device (surface); + if (mask != NULL || clip_region == NULL) { + glyphs.get_rectangle = i965_glyphs_emit_rectangle; + } else { + glyphs.get_rectangle = i965_glyphs_accumulate_rectangle; + glyphs.head.bo = intel_bo_create (&device->intel, + I965_VERTEX_SIZE, I965_VERTEX_SIZE, + FALSE, I915_TILING_NONE, 0); + if (unlikely (glyphs.head.bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + glyphs.vbo_base = intel_bo_map (&device->intel, glyphs.head.bo); + } + glyphs.vbo_offset = 0; + + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto CLEANUP_GLYPHS; + + _cairo_scaled_font_freeze_cache (scaled_font); + //private = _cairo_scaled_font_get_device (scaled_font, device); + if (scaled_font->surface_private == NULL) { + scaled_font->surface_private = device; + scaled_font->surface_backend = surface->intel.drm.base.backend; + cairo_list_add (&scaled_font->link, &device->intel.fonts); + } + + memset (glyph_cache, 0, sizeof (glyph_cache)); + + for (i = 0; i < num_glyphs; i++) { + cairo_scaled_glyph_t *scaled_glyph; + int x, y, x1, x2, y1, y2; + int cache_index = g[i].index % ARRAY_LENGTH (glyph_cache); + intel_glyph_t *glyph; + + scaled_glyph = glyph_cache[cache_index]; + if (scaled_glyph == NULL || + _cairo_scaled_glyph_index (scaled_glyph) != g[i].index) + { + status = _cairo_scaled_glyph_lookup (scaled_font, + g[i].index, + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (unlikely (status)) + goto FINISH; + + glyph_cache[cache_index] = scaled_glyph; + } + + if (unlikely (scaled_glyph->metrics.width == 0 || + scaled_glyph->metrics.height == 0)) + { + continue; + } + + /* XXX glyph images are snapped to pixel locations */ + x = _cairo_lround (g[i].x); + y = _cairo_lround (g[i].y); + + x1 = x + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x); + y1 = y + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); + x2 = x + _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.x); + y2 = y + _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y); + + if (x2 < extents.bounded.x || + y2 < extents.bounded.y || + x1 > extents.bounded.x + extents.bounded.width || + y1 > extents.bounded.y + extents.bounded.height) + { + continue; + } + + if (scaled_glyph->surface_private == NULL) { + status = intel_get_glyph (&device->intel, scaled_font, scaled_glyph); + if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO)) { + status = CAIRO_STATUS_SUCCESS; + continue; + } + if (unlikely (status)) + goto FINISH; + } + glyph = intel_glyph_pin (scaled_glyph->surface_private); + + if (glyph->cache->buffer.bo != last_bo) { + intel_buffer_cache_t *cache = glyph->cache; + + glyphs.shader.mask.type.vertex = VS_GLYPHS; + glyphs.shader.mask.type.fragment = FS_GLYPHS; + glyphs.shader.mask.type.pattern = PATTERN_BASE; + + glyphs.shader.mask.base.bo = cache->buffer.bo; + glyphs.shader.mask.base.format = cache->buffer.format; + glyphs.shader.mask.base.width = cache->buffer.width; + glyphs.shader.mask.base.height = cache->buffer.height; + glyphs.shader.mask.base.stride = cache->buffer.stride; + glyphs.shader.mask.base.filter = i965_filter (CAIRO_FILTER_NEAREST); + glyphs.shader.mask.base.extend = i965_extend (CAIRO_EXTEND_NONE); + glyphs.shader.mask.base.content = CAIRO_CONTENT_ALPHA; /* XXX */ + + glyphs.shader.committed = FALSE; + status = i965_shader_commit (&glyphs.shader, device); + if (unlikely (status)) + goto FINISH; + + last_bo = cache->buffer.bo; + } + + x2 = x1 + glyph->width; + y2 = y1 + glyph->height; + + if (mask_x) + x1 += mask_x, x2 += mask_x; + if (mask_y) + y1 += mask_y, y2 += mask_y; + + i965_add_glyph_rectangle (&glyphs, x1, y1, x2, y2, glyph); + } + + if (mask != NULL && clip_region != NULL) + i965_clipped_vertices (device, &glyphs.head, clip_region); + + status = CAIRO_STATUS_SUCCESS; + FINISH: + _cairo_scaled_font_thaw_cache (scaled_font); + cairo_device_release (surface->intel.drm.base.device); + CLEANUP_GLYPHS: + i965_shader_fini (&glyphs.shader); + + if (glyphs.head.bo != NULL) { + struct i965_vbo *vbo, *next; + + intel_bo_destroy (&device->intel, glyphs.head.bo); + for (vbo = glyphs.head.next; vbo != NULL; vbo = next) { + next = vbo->next; + intel_bo_destroy (&device->intel, vbo->bo); + free (vbo); + } + } + + if (unlikely (status == CAIRO_INT_STATUS_UNSUPPORTED)) { + cairo_path_fixed_t path; + + _cairo_path_fixed_init (&path); + status = _cairo_scaled_font_glyph_path (scaled_font, + g + i, num_glyphs - i, + &path); + if (mask_x | mask_y) { + _cairo_path_fixed_translate (&path, + _cairo_fixed_from_int (mask_x), + _cairo_fixed_from_int (mask_y)); + } + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = surface->intel.drm.base.backend->fill (glyphs.shader.target, + glyphs.shader.op, + mask != NULL ? &_cairo_pattern_white.base : source, + &path, + CAIRO_FILL_RULE_WINDING, + 0, + scaled_font->options.antialias, + clip); + } + _cairo_path_fixed_fini (&path); + } + + if (mask != NULL) { + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = i965_surface_mask_internal (surface, op, source, mask, + clip, &extents); + } + cairo_surface_finish (&mask->intel.drm.base); + cairo_surface_destroy (&mask->intel.drm.base); + } + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} diff --git a/src/drm/cairo-drm-i965-private.h b/src/drm/cairo-drm-i965-private.h new file mode 100644 index 000000000..79568a63d --- /dev/null +++ b/src/drm/cairo-drm-i965-private.h @@ -0,0 +1,737 @@ +#ifndef CAIRO_DRM_I965_PRIVATE_H +#define CAIRO_DRM_I965_PRIVATE_H + +#include "cairo-drm-intel-private.h" + +#include "cairo-hash-private.h" +#include "cairo-freelist-private.h" + +#include "cairo-drm-intel-brw-defines.h" + +#include + +#define BRW_MI_GLOBAL_SNAPSHOT_RESET (1 << 3) + +/* + * New regs for broadwater -- we need to split this file up sensibly somehow. + */ +#define BRW_3D(Pipeline,Opcode,Subopcode) ((3 << 29) | \ + ((Pipeline) << 27) | \ + ((Opcode) << 24) | \ + ((Subopcode) << 16)) + +#define BRW_URB_FENCE BRW_3D(0, 0, 0) +#define BRW_CS_URB_STATE BRW_3D(0, 0, 1) +#define BRW_CONSTANT_BUFFER BRW_3D(0, 0, 2) +#define BRW_STATE_PREFETCH BRW_3D(0, 0, 3) + +#define BRW_STATE_BASE_ADDRESS BRW_3D(0, 1, 1) +#define BRW_STATE_SIP BRW_3D(0, 1, 2) +#define BRW_PIPELINE_SELECT BRW_3D(0, 1, 4) + +#define NEW_PIPELINE_SELECT BRW_3D(1, 1, 4) + +#define BRW_MEDIA_STATE_POINTERS BRW_3D(2, 0, 0) +#define BRW_MEDIA_OBJECT BRW_3D(2, 1, 0) + +#define BRW_3DSTATE_PIPELINED_POINTERS BRW_3D(3, 0, 0) +#define BRW_3DSTATE_BINDING_TABLE_POINTERS BRW_3D(3, 0, 1) +#define BRW_3DSTATE_VERTEX_BUFFERS BRW_3D(3, 0, 8) +#define BRW_3DSTATE_VERTEX_ELEMENTS BRW_3D(3, 0, 9) +#define BRW_3DSTATE_INDEX_BUFFER BRW_3D(3, 0, 0xa) +#define BRW_3DSTATE_VF_STATISTICS BRW_3D(3, 0, 0xb) + +#define BRW_3DSTATE_DRAWING_RECTANGLE BRW_3D(3, 1, 0) +#define BRW_3DSTATE_CONSTANT_COLOR BRW_3D(3, 1, 1) +#define BRW_3DSTATE_SAMPLER_PALETTE_LOAD BRW_3D(3, 1, 2) +#define BRW_3DSTATE_CHROMA_KEY BRW_3D(3, 1, 4) +#define BRW_3DSTATE_DEPTH_BUFFER BRW_3D(3, 1, 5) +#define BRW_3DSTATE_POLY_STIPPLE_OFFSET BRW_3D(3, 1, 6) +#define BRW_3DSTATE_POLY_STIPPLE_PATTERN BRW_3D(3, 1, 7) +#define BRW_3DSTATE_LINE_STIPPLE BRW_3D(3, 1, 8) +#define BRW_3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP BRW_3D(3, 1, 9) +/* These two are BLC and CTG only, not BW or CL */ +#define BRW_3DSTATE_AA_LINE_PARAMS BRW_3D(3, 1, 0xa) +#define BRW_3DSTATE_GS_SVB_INDEX BRW_3D(3, 1, 0xb) + +#define BRW_PIPE_CONTROL BRW_3D(3, 2, 0) + +#define BRW_3DPRIMITIVE BRW_3D(3, 3, 0) + +#define PIPELINE_SELECT_3D 0 +#define PIPELINE_SELECT_MEDIA 1 + +#define UF0_CS_REALLOC (1 << 13) +#define UF0_VFE_REALLOC (1 << 12) +#define UF0_SF_REALLOC (1 << 11) +#define UF0_CLIP_REALLOC (1 << 10) +#define UF0_GS_REALLOC (1 << 9) +#define UF0_VS_REALLOC (1 << 8) +#define UF1_CLIP_FENCE_SHIFT 20 +#define UF1_GS_FENCE_SHIFT 10 +#define UF1_VS_FENCE_SHIFT 0 +#define UF2_CS_FENCE_SHIFT 20 +#define UF2_VFE_FENCE_SHIFT 10 +#define UF2_SF_FENCE_SHIFT 0 + +/* for BRW_STATE_BASE_ADDRESS */ +#define BASE_ADDRESS_MODIFY (1 << 0) + +/* for BRW_3DSTATE_PIPELINED_POINTERS */ +#define BRW_GS_DISABLE 0 +#define BRW_GS_ENABLE 1 +#define BRW_CLIP_DISABLE 0 +#define BRW_CLIP_ENABLE 1 + +/* for BRW_PIPE_CONTROL */ +#define BRW_PIPE_CONTROL_NOWRITE (0 << 14) +#define BRW_PIPE_CONTROL_WRITE_QWORD (1 << 14) +#define BRW_PIPE_CONTROL_WRITE_DEPTH (2 << 14) +#define BRW_PIPE_CONTROL_WRITE_TIME (3 << 14) +#define BRW_PIPE_CONTROL_DEPTH_STALL (1 << 13) +#define BRW_PIPE_CONTROL_WC_FLUSH (1 << 12) +#define BRW_PIPE_CONTROL_IS_FLUSH (1 << 11) +#define BRW_PIPE_CONTROL_NOTIFY_ENABLE (1 << 8) +#define BRW_PIPE_CONTROL_GLOBAL_GTT (1 << 2) +#define BRW_PIPE_CONTROL_LOCAL_PGTT (0 << 2) + +/* VERTEX_BUFFER_STATE Structure */ +#define VB0_BUFFER_INDEX_SHIFT 27 +#define VB0_VERTEXDATA (0 << 26) +#define VB0_INSTANCEDATA (1 << 26) +#define VB0_BUFFER_PITCH_SHIFT 0 + +/* VERTEX_ELEMENT_STATE Structure */ +#define VE0_VERTEX_BUFFER_INDEX_SHIFT 27 +#define VE0_VALID (1 << 26) +#define VE0_FORMAT_SHIFT 16 +#define VE0_OFFSET_SHIFT 0 +#define VE1_VFCOMPONENT_0_SHIFT 28 +#define VE1_VFCOMPONENT_1_SHIFT 24 +#define VE1_VFCOMPONENT_2_SHIFT 20 +#define VE1_VFCOMPONENT_3_SHIFT 16 +#define VE1_DESTINATION_ELEMENT_OFFSET_SHIFT 0 + +/* 3DPRIMITIVE bits */ +#define BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL (0 << 15) +#define BRW_3DPRIMITIVE_VERTEX_RANDOM (1 << 15) +/* Primitive types are in brw_defines.h */ +#define BRW_3DPRIMITIVE_TOPOLOGY_SHIFT 10 + +#define BRW_SVG_CTL 0x7400 + +#define BRW_SVG_CTL_GS_BA (0 << 8) +#define BRW_SVG_CTL_SS_BA (1 << 8) +#define BRW_SVG_CTL_IO_BA (2 << 8) +#define BRW_SVG_CTL_GS_AUB (3 << 8) +#define BRW_SVG_CTL_IO_AUB (4 << 8) +#define BRW_SVG_CTL_SIP (5 << 8) + +#define BRW_SVG_RDATA 0x7404 +#define BRW_SVG_WORK_CTL 0x7408 + +#define BRW_VF_CTL 0x7500 + +#define BRW_VF_CTL_SNAPSHOT_COMPLETE (1 << 31) +#define BRW_VF_CTL_SNAPSHOT_MUX_SELECT_THREADID (0 << 8) +#define BRW_VF_CTL_SNAPSHOT_MUX_SELECT_VF_DEBUG (1 << 8) +#define BRW_VF_CTL_SNAPSHOT_TYPE_VERTEX_SEQUENCE (0 << 4) +#define BRW_VF_CTL_SNAPSHOT_TYPE_VERTEX_INDEX (1 << 4) +#define BRW_VF_CTL_SKIP_INITIAL_PRIMITIVES (1 << 3) +#define BRW_VF_CTL_MAX_PRIMITIVES_LIMIT_ENABLE (1 << 2) +#define BRW_VF_CTL_VERTEX_RANGE_LIMIT_ENABLE (1 << 1) +#define BRW_VF_CTL_SNAPSHOT_ENABLE (1 << 0) + +#define BRW_VF_STRG_VAL 0x7504 +#define BRW_VF_STR_VL_OVR 0x7508 +#define BRW_VF_VC_OVR 0x750c +#define BRW_VF_STR_PSKIP 0x7510 +#define BRW_VF_MAX_PRIM 0x7514 +#define BRW_VF_RDATA 0x7518 + +#define BRW_VS_CTL 0x7600 +#define BRW_VS_CTL_SNAPSHOT_COMPLETE (1 << 31) +#define BRW_VS_CTL_SNAPSHOT_MUX_VERTEX_0 (0 << 8) +#define BRW_VS_CTL_SNAPSHOT_MUX_VERTEX_1 (1 << 8) +#define BRW_VS_CTL_SNAPSHOT_MUX_VALID_COUNT (2 << 8) +#define BRW_VS_CTL_SNAPSHOT_MUX_VS_KERNEL_POINTER (3 << 8) +#define BRW_VS_CTL_SNAPSHOT_ALL_THREADS (1 << 2) +#define BRW_VS_CTL_THREAD_SNAPSHOT_ENABLE (1 << 1) +#define BRW_VS_CTL_SNAPSHOT_ENABLE (1 << 0) + +#define BRW_VS_STRG_VAL 0x7604 +#define BRW_VS_RDATA 0x7608 + +#define BRW_SF_CTL 0x7b00 +#define BRW_SF_CTL_SNAPSHOT_COMPLETE (1 << 31) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_0_FF_ID (0 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_0_REL_COUNT (1 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_1_FF_ID (2 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_1_REL_COUNT (3 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_2_FF_ID (4 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_2_REL_COUNT (5 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_VERTEX_COUNT (6 << 8) +#define BRW_SF_CTL_SNAPSHOT_MUX_SF_KERNEL_POINTER (7 << 8) +#define BRW_SF_CTL_MIN_MAX_PRIMITIVE_RANGE_ENABLE (1 << 4) +#define BRW_SF_CTL_DEBUG_CLIP_RECTANGLE_ENABLE (1 << 3) +#define BRW_SF_CTL_SNAPSHOT_ALL_THREADS (1 << 2) +#define BRW_SF_CTL_THREAD_SNAPSHOT_ENABLE (1 << 1) +#define BRW_SF_CTL_SNAPSHOT_ENABLE (1 << 0) + +#define BRW_SF_STRG_VAL 0x7b04 +#define BRW_SF_RDATA 0x7b18 + +#define BRW_WIZ_CTL 0x7c00 +#define BRW_WIZ_CTL_SNAPSHOT_COMPLETE (1 << 31) +#define BRW_WIZ_CTL_SUBSPAN_INSTANCE_SHIFT 16 +#define BRW_WIZ_CTL_SNAPSHOT_MUX_WIZ_KERNEL_POINTER (0 << 8) +#define BRW_WIZ_CTL_SNAPSHOT_MUX_SUBSPAN_INSTANCE (1 << 8) +#define BRW_WIZ_CTL_SNAPSHOT_MUX_PRIMITIVE_SEQUENCE (2 << 8) +#define BRW_WIZ_CTL_SINGLE_SUBSPAN_DISPATCH (1 << 6) +#define BRW_WIZ_CTL_IGNORE_COLOR_SCOREBOARD_STALLS (1 << 5) +#define BRW_WIZ_CTL_ENABLE_SUBSPAN_INSTANCE_COMPARE (1 << 4) +#define BRW_WIZ_CTL_USE_UPSTREAM_SNAPSHOT_FLAG (1 << 3) +#define BRW_WIZ_CTL_SNAPSHOT_ALL_THREADS (1 << 2) +#define BRW_WIZ_CTL_THREAD_SNAPSHOT_ENABLE (1 << 1) +#define BRW_WIZ_CTL_SNAPSHOT_ENABLE (1 << 0) + +#define BRW_WIZ_STRG_VAL 0x7c04 +#define BRW_WIZ_RDATA 0x7c18 + +#define BRW_TS_CTL 0x7e00 +#define BRW_TS_CTL_SNAPSHOT_COMPLETE (1 << 31) +#define BRW_TS_CTL_SNAPSHOT_MESSAGE_ERROR (0 << 8) +#define BRW_TS_CTL_SNAPSHOT_INTERFACE_DESCRIPTOR (3 << 8) +#define BRW_TS_CTL_SNAPSHOT_ALL_CHILD_THREADS (1 << 2) +#define BRW_TS_CTL_SNAPSHOT_ALL_ROOT_THREADS (1 << 1) +#define BRW_TS_CTL_SNAPSHOT_ENABLE (1 << 0) + +#define BRW_TS_STRG_VAL 0x7e04 +#define BRW_TS_RDATA 0x7e08 + +#define BRW_TD_CTL 0x8000 +#define BRW_TD_CTL_MUX_SHIFT 8 +#define BRW_TD_CTL_EXTERNAL_HALT_R0_DEBUG_MATCH (1 << 7) +#define BRW_TD_CTL_FORCE_EXTERNAL_HALT (1 << 6) +#define BRW_TD_CTL_EXCEPTION_MASK_OVERRIDE (1 << 5) +#define BRW_TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE (1 << 4) +#define BRW_TD_CTL_BREAKPOINT_ENABLE (1 << 2) +#define BRW_TD_CTL2 0x8004 +#define BRW_TD_CTL2_ILLEGAL_OPCODE_EXCEPTION_OVERRIDE (1 << 28) +#define BRW_TD_CTL2_MASKSTACK_EXCEPTION_OVERRIDE (1 << 26) +#define BRW_TD_CTL2_SOFTWARE_EXCEPTION_OVERRIDE (1 << 25) +#define BRW_TD_CTL2_ACTIVE_THREAD_LIMIT_SHIFT 16 +#define BRW_TD_CTL2_ACTIVE_THREAD_LIMIT_ENABLE (1 << 8) +#define BRW_TD_CTL2_THREAD_SPAWNER_EXECUTION_MASK_ENABLE (1 << 7) +#define BRW_TD_CTL2_WIZ_EXECUTION_MASK_ENABLE (1 << 6) +#define BRW_TD_CTL2_SF_EXECUTION_MASK_ENABLE (1 << 5) +#define BRW_TD_CTL2_CLIPPER_EXECUTION_MASK_ENABLE (1 << 4) +#define BRW_TD_CTL2_GS_EXECUTION_MASK_ENABLE (1 << 3) +#define BRW_TD_CTL2_VS_EXECUTION_MASK_ENABLE (1 << 0) +#define BRW_TD_VF_VS_EMSK 0x8008 +#define BRW_TD_GS_EMSK 0x800c +#define BRW_TD_CLIP_EMSK 0x8010 +#define BRW_TD_SF_EMSK 0x8014 +#define BRW_TD_WIZ_EMSK 0x8018 +#define BRW_TD_0_6_EHTRG_VAL 0x801c +#define BRW_TD_0_7_EHTRG_VAL 0x8020 +#define BRW_TD_0_6_EHTRG_MSK 0x8024 +#define BRW_TD_0_7_EHTRG_MSK 0x8028 +#define BRW_TD_RDATA 0x802c +#define BRW_TD_TS_EMSK 0x8030 + +#define BRW_EU_CTL 0x8800 +#define BRW_EU_CTL_SELECT_SHIFT 16 +#define BRW_EU_CTL_DATA_MUX_SHIFT 8 +#define BRW_EU_ATT_0 0x8810 +#define BRW_EU_ATT_1 0x8814 +#define BRW_EU_ATT_DATA_0 0x8820 +#define BRW_EU_ATT_DATA_1 0x8824 +#define BRW_EU_ATT_CLR_0 0x8830 +#define BRW_EU_ATT_CLR_1 0x8834 +#define BRW_EU_RDATA 0x8840 + +typedef struct i965_device i965_device_t; +typedef struct i965_surface i965_surface_t; +typedef struct i965_shader i965_shader_t; +typedef struct i965_stream i965_stream_t; + +struct i965_sf_state { + cairo_hash_entry_t entry; + uint32_t offset; +}; + +cairo_private cairo_bool_t +i965_sf_state_equal (const void *, const void *); + +struct i965_cc_state { + cairo_hash_entry_t entry; + uint32_t offset; +}; + +cairo_private cairo_bool_t +i965_cc_state_equal (const void *, const void *); + +struct i965_wm_kernel { + cairo_hash_entry_t entry; + uint32_t offset; +}; + +struct i965_wm_state { + cairo_hash_entry_t entry; + uint32_t kernel; + uint32_t sampler; + uint32_t offset; +}; + +cairo_private cairo_bool_t +i965_wm_state_equal (const void *, const void *); + +struct i965_wm_binding { + cairo_hash_entry_t entry; + uint32_t table[4]; + int size; + uint32_t offset; +}; + +cairo_private cairo_bool_t +i965_wm_binding_equal (const void *, const void *); + +struct i965_sampler { + cairo_hash_entry_t entry; + uint32_t offset; +}; + +struct i965_vbo { + struct i965_vbo *next; + intel_bo_t *bo; + unsigned int count; +}; + +struct i965_surface { + intel_surface_t intel; + + uint32_t stream; + uint32_t offset; +}; + +struct i965_pending_relocation { + uint32_t offset; + uint32_t read_domains; + uint32_t write_domain; + uint32_t delta; +}; + +struct i965_stream { + uint32_t used; + uint32_t committed; + uint32_t size; + uint8_t *data; + uint32_t serial; + + int num_pending_relocations; + int max_pending_relocations; + struct i965_pending_relocation *pending_relocations; + + int num_relocations; + int max_relocations; + struct drm_i915_gem_relocation_entry *relocations; +}; + +#define I965_BATCH_SIZE (16 * 4096) +#define I965_GENERAL_SIZE (16 * 4096) +#define I965_SURFACE_SIZE (32 * 4096) +#define I965_VERTEX_SIZE (128 * 4096) + +#define I965_TILING_DEFAULT I915_TILING_Y + + +struct i965_device { + intel_device_t intel; + + cairo_bool_t is_g4x; + + i965_shader_t *shader; /* note: only valid during geometry emission */ + + /* track state changes */ + struct i965_sf_state sf_state; + struct i965_cc_state cc_state; + struct i965_wm_state wm_state; + struct i965_wm_binding wm_binding; + + i965_surface_t *target; + uint32_t target_offset; + + intel_bo_t *source; + uint32_t source_offset; + + intel_bo_t *mask; + uint32_t mask_offset; + + intel_bo_t *clip; + uint32_t clip_offset; + + uint32_t draw_rectangle; + + uint32_t vs_offset; + uint32_t border_color_offset; + cairo_hash_table_t *sf_states; + cairo_hash_table_t *cc_states; + cairo_hash_table_t *wm_kernels; + cairo_hash_table_t *wm_states; + cairo_hash_table_t *wm_bindings; + cairo_hash_table_t *samplers; + intel_bo_t *general_state; + + cairo_freelist_t sf_freelist; + cairo_freelist_t cc_freelist; + cairo_freelist_t wm_kernel_freelist; + cairo_freelist_t wm_state_freelist; + cairo_freelist_t wm_binding_freelist; + cairo_freelist_t sampler_freelist; + + uint32_t vertex_type; + uint32_t vertex_size; + uint32_t rectangle_size; + uint32_t last_vertex_size; + + float *constants; /* 4 x matrix + 2 x source */ + unsigned constants_size; + cairo_bool_t have_urb_fences; + + i965_stream_t batch; + uint8_t batch_base[I965_BATCH_SIZE]; + struct drm_i915_gem_relocation_entry batch_relocations[2048]; + + i965_stream_t surface; + uint8_t surface_base[I965_SURFACE_SIZE]; + struct i965_pending_relocation surface_pending_relocations[1]; + struct drm_i915_gem_relocation_entry surface_relocations[1024]; + + i965_stream_t general; + uint8_t general_base[I965_GENERAL_SIZE]; + struct i965_pending_relocation general_pending_relocations[1]; + + i965_stream_t vertex; + uint8_t vertex_base[I965_VERTEX_SIZE]; + struct i965_pending_relocation vertex_pending_relocations[512]; + + struct { + size_t gtt_size; + + intel_bo_t *bo[1024]; + int count; + + struct drm_i915_gem_exec_object2 exec[1024]; + } exec; + cairo_list_t flush; +}; + +typedef enum { + VS_NONE = 0, + VS_GLYPHS, + VS_SPANS, +} i965_vertex_shader_t; + +typedef enum { + FS_NONE = 0, + FS_CONSTANT, + FS_LINEAR, + FS_RADIAL, + FS_SURFACE, + FS_GLYPHS, + FS_SPANS, +} i965_fragment_shader_t; + +typedef enum { + PATTERN_BASE, + PATTERN_SOLID, + PATTERN_LINEAR, + PATTERN_RADIAL, + PATTERN_SURFACE, +} i965_shader_channel_t; +#define PATTERN_NONE (i965_shader_channel_t)-1 + +struct i965_shader { + i965_device_t *device; + i965_surface_t *target; + + cairo_operator_t op; + + cairo_bool_t committed; + cairo_bool_t need_combine; + + float constants[4*8 + 2*8]; /* 4 x matrix + 2 x source */ + unsigned constants_size; + + union i965_shader_channel { + struct { + i965_vertex_shader_t vertex; + i965_fragment_shader_t fragment; + i965_shader_channel_t pattern; + } type; + struct i965_shader_base { + i965_vertex_shader_t vertex; + i965_fragment_shader_t fragment; + i965_shader_channel_t pattern; + + uint32_t mode; + + float constants[8]; + unsigned constants_size; + + intel_bo_t *bo; + cairo_format_t format; + cairo_content_t content; + int width, height, stride; + int filter, extend; + cairo_matrix_t matrix; + cairo_bool_t has_component_alpha; + } base; + struct i965_shader_solid { + struct i965_shader_base base; + } solid; + struct i965_shader_linear { + struct i965_shader_base base; + } linear; + struct i965_shader_radial { + struct i965_shader_base base; + } radial; + struct i965_shader_surface { + struct i965_shader_base base; + cairo_surface_t *surface; + } surface; + } source, mask, clip, dst; + + jmp_buf unwind; +}; + +enum i965_shader_linear_mode { + /* XXX REFLECT */ + LINEAR_TEXTURE, + LINEAR_NONE, + LINEAR_REPEAT, + LINEAR_PAD, +}; + +enum i965_shader_radial_mode { + RADIAL_ONE, + RADIAL_TWO +}; + +typedef cairo_status_t +(*i965_spans_func_t) (void *closure, + cairo_span_renderer_t *renderer, + const cairo_rectangle_int_t *extents); + +static inline i965_device_t * +i965_device (i965_surface_t *surface) +{ + return (i965_device_t *) surface->intel.drm.base.device; +} + +cairo_private void +i965_emit_relocation (i965_device_t *device, + i965_stream_t *stream, + intel_bo_t *target, + uint32_t target_offset, + uint32_t read_domains, + uint32_t write_domain, + uint32_t offset); + +static cairo_always_inline uint32_t +i965_stream_emit (i965_stream_t *stream, const void *data, size_t size) +{ + uint32_t offset; + + offset = stream->used; + assert (offset + size <= stream->size); + memcpy (stream->data + offset, data, size); + stream->used += size; + + return offset; +} + +static cairo_always_inline void +i965_stream_align (i965_stream_t *stream, uint32_t size) +{ + stream->used = (stream->used + size - 1) & -size; +} + +static cairo_always_inline void * +i965_stream_alloc (i965_stream_t *stream, uint32_t align, uint32_t size) +{ + void *ptr; + + if (align) + i965_stream_align (stream, align); + + assert (stream->used + size <= stream->size); + ptr = stream->data + stream->used; + stream->used += size; + + return ptr; +} + +static cairo_always_inline uint32_t +i965_stream_offsetof (i965_stream_t *stream, const void *ptr) +{ + return (char *) ptr - (char *) stream->data; +} + +cairo_private void +i965_stream_commit (i965_device_t *device, + i965_stream_t *stream); + +cairo_private void +i965_general_state_reset (i965_device_t *device); + +static inline void +i965_batch_emit_dword (i965_device_t *device, uint32_t dword) +{ + *(uint32_t *) (device->batch.data + device->batch.used) = dword; + device->batch.used += 4; +} + +#define OUT_BATCH(dword) i965_batch_emit_dword(device, dword) + +cairo_private void +i965_clipped_vertices (i965_device_t *device, + struct i965_vbo *vbo, + cairo_region_t *clip_region); + +cairo_private void +i965_flush_vertices (i965_device_t *device); + +cairo_private void +i965_finish_vertices (i965_device_t *device); + +static inline float * +i965_add_rectangle (i965_device_t *device) +{ + float *vertices; + uint32_t size; + + size = device->rectangle_size; + if (unlikely (device->vertex.used + size > device->vertex.size)) + i965_finish_vertices (device); + + vertices = (float *) (device->vertex.data + device->vertex.used); + device->vertex.used += size; + + return vertices; +} + +static inline void +i965_shader_add_rectangle (const i965_shader_t *shader, + int x, int y, + int w, int h) +{ + float *v; + + v= i965_add_rectangle (shader->device); + + /* bottom-right */ + *v++ = x + w; + *v++ = y + h; + + /* bottom-left */ + *v++ = x; + *v++ = y + h; + + /* top-left */ + *v++ = x; + *v++ = y; +} + +cairo_private cairo_surface_t * +i965_surface_create_internal (cairo_drm_device_t *base_dev, + cairo_format_t format, + int width, int height, + uint32_t tiling, + cairo_bool_t gpu_target); + +cairo_private cairo_status_t +i965_clip_and_composite_spans (i965_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_antialias_t antialias, + i965_spans_func_t draw_func, + void *draw_closure, + const cairo_composite_rectangles_t*extents, + cairo_clip_t *clip); + +cairo_private cairo_int_status_t +i965_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining); + +cairo_private void +i965_shader_init (i965_shader_t *shader, + i965_surface_t *dst, + cairo_operator_t op); + +cairo_private cairo_status_t +i965_shader_acquire_pattern (i965_shader_t *shader, + union i965_shader_channel *src, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents); + +cairo_private void +i965_shader_set_clip (i965_shader_t *shader, + cairo_clip_t *clip); + +cairo_private cairo_status_t +i965_shader_commit (i965_shader_t *shader, + i965_device_t *device); + +cairo_private void +i965_shader_fini (i965_shader_t *shader); + +cairo_private cairo_status_t +i965_device_flush (i965_device_t *device); + +cairo_private cairo_status_t +i965_fixup_unbounded (i965_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip); + +static inline int +i965_filter (cairo_filter_t filter) +{ + switch (filter) { + default: + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + return BRW_MAPFILTER_NEAREST; + + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + return BRW_MAPFILTER_LINEAR; + } +} + +static inline int +i965_extend (cairo_extend_t extend) +{ + switch (extend) { + default: + case CAIRO_EXTEND_NONE: + return BRW_TEXCOORDMODE_CLAMP_BORDER; + case CAIRO_EXTEND_REPEAT: + return BRW_TEXCOORDMODE_WRAP; + case CAIRO_EXTEND_PAD: + return BRW_TEXCOORDMODE_CLAMP; + case CAIRO_EXTEND_REFLECT: + return BRW_TEXCOORDMODE_MIRROR; + } +} + +#endif /* CAIRO_DRM_I965_PRIVATE_H */ diff --git a/src/drm/cairo-drm-i965-shader.c b/src/drm/cairo-drm-i965-shader.c new file mode 100644 index 000000000..eed5f5f09 --- /dev/null +++ b/src/drm/cairo-drm-i965-shader.c @@ -0,0 +1,2825 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Kristian Høgsberg + * Copyright © 2009 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * Contributor(s): + * Chris Wilson + * Kristian Høgsberg + */ + +#include "cairoint.h" + +#include "cairo-error-private.h" +#include "cairo-drm-i965-private.h" +#include "cairo-surface-subsurface-private.h" +#include "cairo-surface-snapshot-private.h" + +#include "cairo-drm-intel-brw-eu.h" + +/* Theory of shaders: + * + * 3 types of rectangular inputs: + * (a) standard composite: x,y, use source, mask matrices to compute texcoords + * (b) spans: x,y, alpha, use source matrix + * (c) glyphs: x,y, s,t, use source matrix + * + * 5 types of pixel shaders: + * (a) Solid colour + * (b) Linear gradient (via 1D texture, with precomputed tex) + * (c) Radial gradient (per-pixel s computation, 1D texture) + * (d) Spans (mask only): apply opacity + * (e) Texture (includes glyphs). + * + * Clip masks are limited to 2D textures only. + */ + +/* XXX dual source blending for LERP + ComponentAlpha!!! */ + +#define BRW_GRF_BLOCKS(nreg) ((nreg + 15) / 16 - 1) + +#define SF_KERNEL_NUM_GRF 1 +#define SF_MAX_THREADS 24 + +#define PS_MAX_THREADS_CTG 50 +#define PS_MAX_THREADS_BRW 32 + +#define URB_CS_ENTRY_SIZE 3 /* We need 4 matrices + 2 sources */ +#define URB_CS_ENTRIES 4 /* 4x sets of CONSTANT_BUFFER */ + +#define URB_VS_ENTRY_SIZE 1 +#define URB_VS_ENTRIES 8 + +#define URB_GS_ENTRY_SIZE 0 +#define URB_GS_ENTRIES 0 + +#define URB_CLIP_ENTRY_SIZE 0 +#define URB_CLIP_ENTRIES 0 + +#define URB_SF_ENTRY_SIZE 1 +#define URB_SF_ENTRIES (SF_MAX_THREADS + 1) + +static void +i965_pipelined_flush (i965_device_t *device) +{ + intel_bo_t *bo, *next; + + if (device->batch.used == 0) + return; + + OUT_BATCH (BRW_PIPE_CONTROL | + BRW_PIPE_CONTROL_NOWRITE | + BRW_PIPE_CONTROL_WC_FLUSH | + 2); + OUT_BATCH(0); /* Destination address */ + OUT_BATCH(0); /* Immediate data low DW */ + OUT_BATCH(0); /* Immediate data high DW */ + + cairo_list_foreach_entry_safe (bo, next, intel_bo_t, &device->flush, link) { + bo->batch_write_domain = 0; + cairo_list_init (&bo->link); + } + cairo_list_init (&device->flush); +} + +static cairo_status_t +i965_shader_acquire_solid (i965_shader_t *shader, + union i965_shader_channel *src, + const cairo_solid_pattern_t *solid, + const cairo_rectangle_int_t *extents) +{ + src->type.fragment = FS_CONSTANT; + src->type.vertex = VS_NONE; + src->type.pattern = PATTERN_SOLID; + + src->base.content = _cairo_color_get_content (&solid->color); + src->base.constants[0] = solid->color.red * solid->color.alpha; + src->base.constants[1] = solid->color.green * solid->color.alpha; + src->base.constants[2] = solid->color.blue * solid->color.alpha; + src->base.constants[3] = solid->color.alpha; + src->base.constants_size = 4; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_shader_acquire_linear (i965_shader_t *shader, + union i965_shader_channel *src, + const cairo_linear_pattern_t *linear, + const cairo_rectangle_int_t *extents) +{ + intel_buffer_t buffer; + cairo_status_t status; + double x0, y0, sf; + double dx, dy, offset; + + status = intel_gradient_render (&i965_device (shader->target)->intel, + &linear->base, &buffer); + if (unlikely (status)) + return status; + + src->type.vertex = VS_NONE; + src->type.pattern = PATTERN_LINEAR; + src->type.fragment = FS_LINEAR; + src->base.bo = buffer.bo; + src->base.content = CAIRO_CONTENT_COLOR_ALPHA; + src->base.format = buffer.format; + src->base.width = buffer.width; + src->base.height = buffer.height; + src->base.stride = buffer.stride; + src->base.filter = i965_filter (CAIRO_FILTER_BILINEAR); + src->base.extend = i965_extend (linear->base.base.extend); + + dx = linear->pd2.x - linear->pd1.x; + dy = linear->pd2.y - linear->pd1.y; + sf = 1. / (dx * dx + dy * dy); + dx *= sf; + dy *= sf; + + x0 = linear->pd1.x; + y0 = linear->pd1.y; + offset = dx*x0 + dy*y0; + + if (_cairo_matrix_is_identity (&linear->base.base.matrix)) { + src->base.matrix.xx = dx; + src->base.matrix.xy = dy; + src->base.matrix.x0 = -offset; + } else { + cairo_matrix_t m; + + cairo_matrix_init (&m, dx, 0, dy, 0, -offset, 0); + cairo_matrix_multiply (&src->base.matrix, &linear->base.base.matrix, &m); + } + src->base.matrix.yx = 0.; + src->base.matrix.yy = 1.; + src->base.matrix.y0 = 0.; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_shader_acquire_radial (i965_shader_t *shader, + union i965_shader_channel *src, + const cairo_radial_pattern_t *radial, + const cairo_rectangle_int_t *extents) +{ + intel_buffer_t buffer; + cairo_status_t status; + double dx, dy, dr, r1; + + status = intel_gradient_render (&i965_device (shader->target)->intel, + &radial->base, &buffer); + if (unlikely (status)) + return status; + + src->type.vertex = VS_NONE; + src->type.pattern = PATTERN_RADIAL; + src->type.fragment = FS_RADIAL; + src->base.bo = buffer.bo; + src->base.content = CAIRO_CONTENT_COLOR_ALPHA; + src->base.format = buffer.format; + src->base.width = buffer.width; + src->base.height = buffer.height; + src->base.stride = buffer.stride; + src->base.filter = i965_filter (CAIRO_FILTER_BILINEAR); + src->base.extend = i965_extend (radial->base.base.extend); + + dx = radial->cd2.center.x - radial->cd1.center.x; + dy = radial->cd2.center.y - radial->cd1.center.y; + dr = radial->cd2.radius - radial->cd1.radius; + + r1 = radial->cd1.radius; + + if (FALSE && (radial->cd2.center.x == radial->cd1.center.x && + radial->cd2.center.y == radial->cd1.center.y)) + { + /* XXX dr == 0, meaningless with anything other than PAD */ + src->base.constants[0] = radial->cd1.center.x / dr; + src->base.constants[1] = radial->cd1.center.y / dr; + src->base.constants[2] = 1. / dr; + src->base.constants[3] = -r1 / dr; + + src->base.constants_size = 4; + src->base.mode = RADIAL_ONE; + } else { + src->base.constants[0] = -radial->cd1.center.x; + src->base.constants[1] = -radial->cd1.center.y; + src->base.constants[2] = r1; + src->base.constants[3] = -4 * (dx*dx + dy*dy - dr*dr); + + src->base.constants[4] = -2 * dx; + src->base.constants[5] = -2 * dy; + src->base.constants[6] = -2 * r1 * dr; + src->base.constants[7] = 1 / (2 * (dx*dx + dy*dy - dr*dr)); + + src->base.constants_size = 8; + src->base.mode = RADIAL_TWO; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_surface_clone (i965_device_t *device, + cairo_image_surface_t *image, + i965_surface_t **clone_out) +{ + i965_surface_t *clone; + cairo_status_t status; + + clone = (i965_surface_t *) + i965_surface_create_internal (&device->intel.base, + image->base.content, + image->width, + image->height, + I965_TILING_DEFAULT, + FALSE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + status = intel_bo_put_image (&device->intel, + to_intel_bo (clone->intel.drm.bo), + image, + 0, 0, + image->width, image->height, + 0, 0); + + if (unlikely (status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return status; + } + + status = intel_snapshot_cache_insert (&device->intel, &clone->intel); + if (unlikely (status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return status; + } + + _cairo_surface_attach_snapshot (&image->base, + &clone->intel.drm.base, + intel_surface_detach_snapshot); + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_surface_clone_subimage (i965_device_t *device, + cairo_image_surface_t *image, + const cairo_rectangle_int_t *extents, + i965_surface_t **clone_out) +{ + i965_surface_t *clone; + cairo_status_t status; + + clone = (i965_surface_t *) + i965_surface_create_internal (&device->intel.base, + image->base.content, + extents->width, + extents->height, + I965_TILING_DEFAULT, + FALSE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + status = intel_bo_put_image (to_intel_device (clone->intel.drm.base.device), + to_intel_bo (clone->intel.drm.bo), + image, + extents->x, extents->y, + extents->width, extents->height, + 0, 0); + if (unlikely (status)) + return status; + + *clone_out = clone; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_shader_acquire_solid_surface (i965_shader_t *shader, + union i965_shader_channel *src, + cairo_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + uint32_t argb; + + status = _cairo_surface_acquire_source_image (surface, &image, &image_extra); + if (unlikely (status)) + return status; + + if (image->format != CAIRO_FORMAT_ARGB32) { + cairo_surface_t *pixel; + cairo_surface_pattern_t pattern; + + /* extract the pixel as argb32 */ + pixel = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + _cairo_pattern_init_for_surface (&pattern, &image->base); + cairo_matrix_init_translate (&pattern.base.matrix, extents->x, extents->y); + pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (pixel, CAIRO_OPERATOR_SOURCE, &pattern.base, NULL); + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) { + _cairo_surface_release_source_image (surface, image, image_extra); + cairo_surface_destroy (pixel); + return status; + } + + argb = *(uint32_t *) ((cairo_image_surface_t *) pixel)->data; + cairo_surface_destroy (pixel); + } else { + argb = ((uint32_t *) (image->data + extents->y * image->stride))[extents->x]; + } + + _cairo_surface_release_source_image (surface, image, image_extra); + + if (argb >> 24 == 0) + argb = 0; + + src->base.constants[0] = ((argb >> 16) & 0xff) / 255.; + src->base.constants[1] = ((argb >> 8) & 0xff) / 255.; + src->base.constants[2] = ((argb >> 0) & 0xff) / 255.; + src->base.constants[3] = ((argb >> 24) & 0xff) / 255.; + src->base.constants_size = 4; + + src->base.content = CAIRO_CONTENT_COLOR_ALPHA; + if (CAIRO_ALPHA_IS_OPAQUE(src->base.constants[3])) + src->base.content &= ~CAIRO_CONTENT_ALPHA; + src->type.fragment = FS_CONSTANT; + src->type.vertex = VS_NONE; + src->type.pattern = PATTERN_SOLID; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_shader_acquire_surface (i965_shader_t *shader, + union i965_shader_channel *src, + const cairo_surface_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *surface, *drm; + cairo_matrix_t m; + cairo_status_t status; + int src_x = 0, src_y = 0; + + assert (src->type.fragment == FS_NONE); + drm = surface = pattern->surface; + + if (surface->type == CAIRO_SURFACE_TYPE_DRM) { + if (surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + drm = ((cairo_surface_subsurface_t *) surface)->target; + } else if (surface->backend->type == CAIRO_INTERNAL_SURFACE_TYPE_SNAPSHOT) { + drm = ((cairo_surface_snapshot_t *) surface)->target; + } + } + + src->type.pattern = PATTERN_SURFACE; + src->surface.surface = NULL; + if (drm->type == CAIRO_SURFACE_TYPE_DRM) { + i965_surface_t *s = (i965_surface_t *) drm; + + if (surface->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) { + if (s->intel.drm.base.device == shader->target->intel.drm.base.device) { + cairo_surface_subsurface_t *sub = (cairo_surface_subsurface_t *) surface; + if (s != shader->target) { + int x; + + if (s->intel.drm.fallback != NULL) { + status = intel_surface_flush (s, 0); + if (unlikely (status)) + return status; + } + + if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + i965_pipelined_flush (i965_device (s)); + + src->type.fragment = FS_SURFACE; + + src->base.bo = to_intel_bo (s->intel.drm.bo); + src->base.format = s->intel.drm.format; + src->base.content = s->intel.drm.base.content; + src->base.width = sub->extents.width; + src->base.height = sub->extents.height; + src->base.stride = s->intel.drm.stride; + + x = sub->extents.x; + if (s->intel.drm.format != CAIRO_FORMAT_A8) + x *= 4; + + /* XXX tiling restrictions upon offset? */ + //src->base.offset[0] = s->offset + sub->extents.y * s->intel.drm.stride + x; + } else { + i965_surface_t *clone; + cairo_surface_pattern_t pattern; + + clone = (i965_surface_t *) + i965_surface_create_internal ((cairo_drm_device_t *) s->intel.drm.base.device, + s->intel.drm.base.content, + sub->extents.width, + sub->extents.height, + I965_TILING_DEFAULT, + TRUE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + _cairo_pattern_init_for_surface (&pattern, &s->intel.drm.base); + pattern.base.filter = CAIRO_FILTER_NEAREST; + cairo_matrix_init_translate (&pattern.base.matrix, + sub->extents.x, sub->extents.y); + + status = _cairo_surface_paint (&clone->intel.drm.base, + CAIRO_OPERATOR_SOURCE, + &pattern.base, + NULL); + + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return status; + } + + i965_pipelined_flush (i965_device (s)); + src->type.fragment = FS_SURFACE; + + src->base.bo = to_intel_bo (clone->intel.drm.bo); + src->base.format = clone->intel.drm.format; + src->base.content = clone->intel.drm.base.content; + src->base.width = clone->intel.drm.width; + src->base.height = clone->intel.drm.height; + src->base.stride = clone->intel.drm.stride; + + src->surface.surface = &clone->intel.drm.base; + } + + src_x = sub->extents.x; + src_y = sub->extents.y; + } + } else { + if (s->intel.drm.base.device == shader->target->intel.drm.base.device) { + if (s != shader->target) { + if (s->intel.drm.fallback != NULL) { + status = intel_surface_flush (s, 0); + if (unlikely (status)) + return status; + } + + if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + i965_pipelined_flush (i965_device (s)); + + src->type.fragment = FS_SURFACE; + + src->base.bo = to_intel_bo (s->intel.drm.bo); + src->base.format = s->intel.drm.format; + src->base.content = s->intel.drm.base.content; + src->base.width = s->intel.drm.width; + src->base.height = s->intel.drm.height; + src->base.stride = s->intel.drm.stride; + } else { + i965_surface_t *clone; + cairo_surface_pattern_t pattern; + + clone = (i965_surface_t *) + i965_surface_create_internal ((cairo_drm_device_t *) s->intel.drm.base.device, + s->intel.drm.base.content, + s->intel.drm.width, + s->intel.drm.height, + I965_TILING_DEFAULT, + TRUE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + _cairo_pattern_init_for_surface (&pattern, &s->intel.drm.base); + pattern.base.filter = CAIRO_FILTER_NEAREST; + status = _cairo_surface_paint (&clone->intel.drm.base, + CAIRO_OPERATOR_SOURCE, + &pattern.base, + NULL); + + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (&clone->intel.drm.base); + return status; + } + + i965_pipelined_flush (i965_device (s)); + src->type.fragment = FS_SURFACE; + + src->base.bo = to_intel_bo (clone->intel.drm.bo); + src->base.format = clone->intel.drm.format; + src->base.content = clone->intel.drm.base.content; + src->base.width = clone->intel.drm.width; + src->base.height = clone->intel.drm.height; + src->base.stride = clone->intel.drm.stride; + + src->surface.surface = &clone->intel.drm.base; + } + } + } + } + + if (src->type.fragment == FS_NONE) { + i965_surface_t *s; + + if (extents->width == 1 && extents->height == 1) { + return i965_shader_acquire_solid_surface (shader, src, + surface, extents); + } + + s = (i965_surface_t *) + _cairo_surface_has_snapshot (surface, + shader->target->intel.drm.base.backend); + if (s != NULL) { + i965_device_t *device = i965_device (shader->target); + intel_bo_t *bo = to_intel_bo (s->intel.drm.bo); + + if (bo->purgeable && + ! intel_bo_madvise (&device->intel, bo, I915_MADV_WILLNEED)) + { + _cairo_surface_detach_snapshot (&s->intel.drm.base); + s = NULL; + } + + if (s != NULL) + cairo_surface_reference (&s->intel.drm.base); + } + + if (s == NULL) { + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + + status = _cairo_surface_acquire_source_image (surface, &image, &image_extra); + if (unlikely (status)) + return status; + + if (image->width < 8192 && image->height < 8192) { + status = i965_surface_clone (i965_device (shader->target), image, &s); + } else { + status = i965_surface_clone_subimage (i965_device (shader->target), + image, extents, &s); + src_x = -extents->x; + src_y = -extents->y; + } + + _cairo_surface_release_source_image (surface, image, image_extra); + + if (unlikely (status)) + return status; + + /* XXX? */ + //intel_bo_mark_purgeable (to_intel_bo (s->intel.drm.bo), TRUE); + } + + src->type.fragment = FS_SURFACE; + + src->base.bo = to_intel_bo (s->intel.drm.bo); + src->base.content = s->intel.drm.base.content; + src->base.format = s->intel.drm.format; + src->base.width = s->intel.drm.width; + src->base.height = s->intel.drm.height; + src->base.stride = s->intel.drm.stride; + + src->surface.surface = &s->intel.drm.base; + + drm = &s->intel.drm.base; + } + + /* XXX transform nx1 or 1xn surfaces to 1D? */ + + src->type.vertex = VS_NONE; + + src->base.extend = i965_extend (pattern->base.extend); + if (pattern->base.extend == CAIRO_EXTEND_NONE && + extents->x >= 0 && extents->y >= 0 && + extents->x + extents->width <= src->base.width && + extents->y + extents->height <= src->base.height) + { + /* Convert a wholly contained NONE to a REFLECT as the contiguous sampler + * cannot not handle CLAMP_BORDER textures. + */ + src->base.extend = i965_extend (CAIRO_EXTEND_REFLECT); + /* XXX also need to check |u,v| < 3 */ + } + + src->base.filter = i965_filter (pattern->base.filter); + if (_cairo_matrix_is_pixel_exact (&pattern->base.matrix)) + src->base.filter = i965_filter (CAIRO_FILTER_NEAREST); + + /* tweak the src matrix to map from dst to texture coordinates */ + src->base.matrix = pattern->base.matrix; + if (src_x | src_y) + cairo_matrix_translate (&src->base.matrix, src_x, src_x); + cairo_matrix_init_scale (&m, 1. / src->base.width, 1. / src->base.height); + cairo_matrix_multiply (&src->base.matrix, &src->base.matrix, &m); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +i965_shader_acquire_pattern (i965_shader_t *shader, + union i965_shader_channel *src, + const cairo_pattern_t *pattern, + const cairo_rectangle_int_t *extents) +{ + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + return i965_shader_acquire_solid (shader, src, + (cairo_solid_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_LINEAR: + return i965_shader_acquire_linear (shader, src, + (cairo_linear_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_RADIAL: + return i965_shader_acquire_radial (shader, src, + (cairo_radial_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_SURFACE: + return i965_shader_acquire_surface (shader, src, + (cairo_surface_pattern_t *) pattern, + extents); + + default: + ASSERT_NOT_REACHED; + return CAIRO_STATUS_SUCCESS; + } +} + +static void +i965_shader_channel_init (union i965_shader_channel *channel) +{ + channel->type.vertex = VS_NONE; + channel->type.fragment = FS_NONE; + channel->type.pattern = PATTERN_NONE; + + channel->base.mode = 0; + channel->base.bo = NULL; + channel->base.filter = i965_extend (CAIRO_FILTER_NEAREST); + channel->base.extend = i965_extend (CAIRO_EXTEND_NONE); + channel->base.has_component_alpha = 0; + channel->base.constants_size = 0; +} + +void +i965_shader_init (i965_shader_t *shader, + i965_surface_t *dst, + cairo_operator_t op) +{ + shader->committed = FALSE; + shader->device = i965_device (dst); + shader->target = dst; + shader->op = op; + shader->constants_size = 0; + + shader->need_combine = FALSE; + + i965_shader_channel_init (&shader->source); + i965_shader_channel_init (&shader->mask); + i965_shader_channel_init (&shader->clip); + i965_shader_channel_init (&shader->dst); +} + +void +i965_shader_fini (i965_shader_t *shader) +{ + if (shader->source.type.pattern == PATTERN_SURFACE) + cairo_surface_destroy (shader->source.surface.surface); + if (shader->mask.type.pattern == PATTERN_SURFACE) + cairo_surface_destroy (shader->mask.surface.surface); + if (shader->clip.type.pattern == PATTERN_SURFACE) + cairo_surface_destroy (shader->clip.surface.surface); + if (shader->dst.type.pattern == PATTERN_SURFACE) + cairo_surface_destroy (shader->dst.surface.surface); +} + +void +i965_shader_set_clip (i965_shader_t *shader, + cairo_clip_t *clip) +{ + cairo_surface_t *clip_surface; + int clip_x, clip_y; + union i965_shader_channel *channel; + i965_surface_t *s; + + clip_surface = _cairo_clip_get_surface (clip, &shader->target->intel.drm.base, &clip_x, &clip_y); + assert (clip_surface->status == CAIRO_STATUS_SUCCESS); + assert (clip_surface->type == CAIRO_SURFACE_TYPE_DRM); + s = (i965_surface_t *) clip_surface; + + if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + i965_pipelined_flush (i965_device (s)); + + channel = &shader->clip; + channel->type.pattern = PATTERN_BASE; + channel->type.vertex = VS_NONE; + channel->type.fragment = FS_SURFACE; + + channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.content = CAIRO_CONTENT_ALPHA; + channel->base.format = CAIRO_FORMAT_A8; + channel->base.width = s->intel.drm.width; + channel->base.height = s->intel.drm.height; + channel->base.stride = s->intel.drm.stride; + + channel->base.extend = i965_extend (CAIRO_EXTEND_NONE); + channel->base.filter = i965_filter (CAIRO_FILTER_NEAREST); + + cairo_matrix_init_scale (&shader->clip.base.matrix, + 1. / s->intel.drm.width, + 1. / s->intel.drm.height); + + cairo_matrix_translate (&shader->clip.base.matrix, + -clip_x, -clip_y); +} + +static cairo_bool_t +i965_shader_check_aperture (i965_shader_t *shader, + i965_device_t *device) +{ + uint32_t size = device->exec.gtt_size; + + if (shader->target != device->target) { + const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + if (bo->exec == NULL) + size += bo->base.size; + } + + if (shader->source.base.bo != NULL && shader->source.base.bo != device->source) { + const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + if (bo->exec == NULL) + size += bo->base.size; + } + + if (shader->mask.base.bo != NULL && shader->mask.base.bo != device->mask) { + const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + if (bo->exec == NULL) + size += bo->base.size; + } + + if (shader->clip.base.bo != NULL && shader->clip.base.bo != device->clip) { + const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + if (bo->exec == NULL) + size += bo->base.size; + } + + return size <= device->intel.gtt_avail_size; +} + +static cairo_status_t +i965_shader_setup_dst (i965_shader_t *shader) +{ + union i965_shader_channel *channel; + i965_surface_t *s, *clone; + + /* We need to manual blending if we have a clip surface and an unbounded op, + * or an extended blend mode. + */ + if (shader->need_combine || + (shader->op < CAIRO_OPERATOR_SATURATE && + (shader->clip.type.fragment == FS_NONE || + _cairo_operator_bounded_by_mask (shader->op)))) + { + return CAIRO_STATUS_SUCCESS; + } + + shader->need_combine = TRUE; + + s = shader->target; + + /* we need to allocate a new render target and use the original as a source */ + clone = (i965_surface_t *) + i965_surface_create_internal ((cairo_drm_device_t *) s->intel.drm.base.device, + s->intel.drm.base.content, + s->intel.drm.width, + s->intel.drm.height, + I965_TILING_DEFAULT, + TRUE); + if (unlikely (clone->intel.drm.base.status)) + return clone->intel.drm.base.status; + + if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + i965_pipelined_flush (i965_device (s)); + + channel = &shader->dst; + + channel->type.vertex = VS_NONE; + channel->type.fragment = FS_SURFACE; + channel->type.pattern = PATTERN_SURFACE; + + /* swap buffer objects */ + channel->base.bo = to_intel_bo (s->intel.drm.bo); + s->intel.drm.bo = ((cairo_drm_surface_t *) clone)->bo; + ((cairo_drm_surface_t *) clone)->bo = &channel->base.bo->base; + + channel->base.content = s->intel.drm.base.content; + channel->base.format = s->intel.drm.format; + channel->base.width = s->intel.drm.width; + channel->base.height = s->intel.drm.height; + channel->base.stride = s->intel.drm.stride; + + channel->base.filter = i965_filter (CAIRO_FILTER_NEAREST); + channel->base.extend = i965_extend (CAIRO_EXTEND_NONE); + + cairo_matrix_init_scale (&channel->base.matrix, + 1. / s->intel.drm.width, + 1. / s->intel.drm.height); + + channel->surface.surface = &clone->intel.drm.base; + + s->intel.drm.base.content = clone->intel.drm.base.content; + s->intel.drm.format = clone->intel.drm.format; + assert (s->intel.drm.width == clone->intel.drm.width); + assert (s->intel.drm.height == clone->intel.drm.height); + s->intel.drm.stride = clone->intel.drm.stride; + + return CAIRO_STATUS_SUCCESS; +} + +static inline void +constant_add_float (i965_shader_t *shader, float v) +{ + shader->constants[shader->constants_size++] = v; +} + +static inline void +i965_shader_copy_channel_constants (i965_shader_t *shader, + const union i965_shader_channel *channel) +{ + if (channel->base.constants_size) { + assert (shader->constants_size + channel->base.constants_size < ARRAY_LENGTH (shader->constants)); + + memcpy (shader->constants + shader->constants_size, + channel->base.constants, + sizeof (float) * channel->base.constants_size); + shader->constants_size += channel->base.constants_size; + } +} + +static void +i965_shader_setup_channel_constants (i965_shader_t *shader, + const union i965_shader_channel *channel) +{ + switch (channel->type.fragment) { + case FS_NONE: + case FS_CONSTANT: + /* no plane equations */ + break; + + case FS_LINEAR: + constant_add_float (shader, channel->base.matrix.xx); + constant_add_float (shader, channel->base.matrix.xy); + constant_add_float (shader, 0); + constant_add_float (shader, channel->base.matrix.x0); + break; + + case FS_RADIAL: + case FS_SURFACE: + constant_add_float (shader, channel->base.matrix.xx); + constant_add_float (shader, channel->base.matrix.xy); + constant_add_float (shader, 0); + constant_add_float (shader, channel->base.matrix.x0); + + constant_add_float (shader, channel->base.matrix.yx); + constant_add_float (shader, channel->base.matrix.yy); + constant_add_float (shader, 0); + constant_add_float (shader, channel->base.matrix.y0); + break; + + case FS_SPANS: + case FS_GLYPHS: + /* use pue from SF */ + break; + } + + i965_shader_copy_channel_constants (shader, channel); +} + +static void +i965_shader_setup_constants (i965_shader_t *shader) +{ + i965_shader_setup_channel_constants (shader, &shader->source); + i965_shader_setup_channel_constants (shader, &shader->mask); + i965_shader_setup_channel_constants (shader, &shader->clip); + i965_shader_setup_channel_constants (shader, &shader->dst); + assert (shader->constants_size < ARRAY_LENGTH (shader->constants)); +} + +/* + * Highest-valued BLENDFACTOR used in i965_blend_op. + * + * This leaves out BRW_BLENDFACTOR_INV_DST_COLOR, + * BRW_BLENDFACTOR_INV_CONST_{COLOR,ALPHA}, + * BRW_BLENDFACTOR_INV_SRC1_{COLOR,ALPHA} + */ +#define BRW_BLENDFACTOR_COUNT (BRW_BLENDFACTOR_INV_DST_ALPHA + 1) + +static void +i965_shader_get_blend_cntl (const i965_shader_t *shader, + uint32_t *sblend, uint32_t *dblend) +{ + static const struct blendinfo { + cairo_bool_t dst_alpha; + cairo_bool_t src_alpha; + uint32_t src_blend; + uint32_t dst_blend; + } i965_blend_op[] = { + /* CAIRO_OPERATOR_CLEAR treat as SOURCE with transparent */ + {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ZERO}, + /* CAIRO_OPERATOR_SOURCE */ + {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ZERO}, + /* CAIRO_OPERATOR_OVER */ + {0, 1, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_INV_SRC_ALPHA}, + /* CAIRO_OPERATOR_IN */ + {1, 0, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_ZERO}, + /* CAIRO_OPERATOR_OUT */ + {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ZERO}, + /* CAIRO_OPERATOR_ATOP */ + {1, 1, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA}, + + /* CAIRO_OPERATOR_DEST */ + {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ONE}, + /* CAIRO_OPERATOR_DEST_OVER */ + {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ONE}, + /* CAIRO_OPERATOR_DEST_IN */ + {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_SRC_ALPHA}, + /* CAIRO_OPERATOR_DEST_OUT */ + {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_INV_SRC_ALPHA}, + /* CAIRO_OPERATOR_DEST_ATOP */ + {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_SRC_ALPHA}, + /* CAIRO_OPERATOR_XOR */ + {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA}, + /* CAIRO_OPERATOR_ADD */ + {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ONE}, + }; + const struct blendinfo *op = &i965_blend_op[shader->op]; + + *sblend = op->src_blend; + *dblend = op->dst_blend; + + /* If there's no dst alpha channel, adjust the blend op so that we'll treat + * it as always 1. + */ + if (shader->target->intel.drm.base.content == CAIRO_CONTENT_COLOR && + op->dst_alpha) + { + if (*sblend == BRW_BLENDFACTOR_DST_ALPHA) + *sblend = BRW_BLENDFACTOR_ONE; + else if (*sblend == BRW_BLENDFACTOR_INV_DST_ALPHA) + *sblend = BRW_BLENDFACTOR_ZERO; + } +} + +static void +emit_wm_subpans_to_pixels (struct brw_compile *compile, + int tmp) +{ + /* Inputs: + * R1.5 x/y of upper-left pixel of subspan 3 + * R1.4 x/y of upper-left pixel of subspan 2 + * R1.3 x/y of upper-left pixel of subspan 1 + * R1.2 x/y of upper-left pixel of subspan 0 + * + * Outputs: + * M1,2: u + * M3,4: v + * + * upper left, upper right, lower left, lower right. + */ + + /* compute pixel locations for each subspan */ + brw_set_compression_control (compile, BRW_COMPRESSION_NONE); + brw_ADD (compile, + brw_vec8_grf (tmp), + brw_reg (BRW_GENERAL_REGISTER_FILE, 1, 4, + BRW_REGISTER_TYPE_UW, + BRW_VERTICAL_STRIDE_2, + BRW_WIDTH_4, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_NOOP, + WRITEMASK_XYZW), + brw_imm_vf4 (VF_ZERO, VF_ONE, VF_ZERO, VF_ONE)); + brw_ADD (compile, + brw_vec8_grf (tmp+1), + brw_reg (BRW_GENERAL_REGISTER_FILE, 1, 8, + BRW_REGISTER_TYPE_UW, + BRW_VERTICAL_STRIDE_2, + BRW_WIDTH_4, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_NOOP, + WRITEMASK_XYZW), + brw_imm_vf4 (VF_ZERO, VF_ONE, VF_ZERO, VF_ONE)); + brw_ADD (compile, + brw_vec8_grf (tmp+2), + brw_reg (BRW_GENERAL_REGISTER_FILE, 1, 5, + BRW_REGISTER_TYPE_UW, + BRW_VERTICAL_STRIDE_2, + BRW_WIDTH_4, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_NOOP, + WRITEMASK_XYZW), + brw_imm_vf4 (VF_ZERO, VF_ZERO, VF_ONE, VF_ONE)); + brw_ADD (compile, + brw_vec8_grf (tmp+3), + brw_reg (BRW_GENERAL_REGISTER_FILE, 1, 9, + BRW_REGISTER_TYPE_UW, + BRW_VERTICAL_STRIDE_2, + BRW_WIDTH_4, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_NOOP, + WRITEMASK_XYZW), + brw_imm_vf4 (VF_ZERO, VF_ZERO, VF_ONE, VF_ONE)); + brw_set_compression_control (compile, BRW_COMPRESSION_COMPRESSED); +} + +static void +emit_wm_affine (struct brw_compile *compile, + int tmp, int reg, int msg) +{ + emit_wm_subpans_to_pixels (compile, tmp); + + brw_LINE (compile, + brw_null_reg (), + brw_vec1_grf (reg, 0), + brw_vec8_grf (tmp)); + brw_MAC (compile, + brw_message_reg (msg + 1), + brw_vec1_grf (reg, 1), + brw_vec8_grf (tmp+2)); + + brw_LINE (compile, + brw_null_reg (), + brw_vec1_grf (reg, 4), + brw_vec8_grf (tmp)); + brw_MAC (compile, + brw_message_reg (msg + 3), + brw_vec1_grf (reg, 5), + brw_vec8_grf (tmp+2)); +} + +static void +emit_wm_glyph (struct brw_compile *compile, + int tmp, int vue, int msg) +{ + emit_wm_subpans_to_pixels (compile, tmp); + + brw_MUL (compile, + brw_null_reg (), + brw_vec8_grf (tmp), + brw_imm_f (1./1024)); + brw_ADD (compile, + brw_message_reg (msg + 1), + brw_acc_reg (), + brw_vec1_grf (vue, 0)); + + brw_MUL (compile, + brw_null_reg (), + brw_vec8_grf (tmp + 2), + brw_imm_f (1./1024)); + brw_ADD (compile, + brw_message_reg (msg + 3), + brw_acc_reg (), + brw_vec1_grf (vue, 1)); +} + +static void +emit_wm_load_constant (struct brw_compile *compile, + int reg, + struct brw_reg *result) +{ + int n; + + for (n = 0; n < 4; n++) { + result[n] = result[n+4] = brw_reg (BRW_GENERAL_REGISTER_FILE, reg, n, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_0, + BRW_WIDTH_1, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_XXXX, + WRITEMASK_XYZW); + } +} + +static void +emit_wm_load_opacity (struct brw_compile *compile, + int reg, + struct brw_reg *result) +{ + result[0] = result[1] = result[2] = result[3] = + result[4] = result[5] = result[6] = result[7] = + brw_reg (BRW_GENERAL_REGISTER_FILE, reg, 0, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_0, + BRW_WIDTH_1, + BRW_HORIZONTAL_STRIDE_1, + BRW_SWIZZLE_XXXX, + WRITEMASK_XYZW); +} + +static void +emit_wm_load_linear (struct brw_compile *compile, + int tmp, int reg, int msg) +{ + emit_wm_subpans_to_pixels (compile, tmp); + + brw_LINE (compile, + brw_null_reg(), + brw_vec1_grf (reg, 0), + brw_vec8_grf (tmp)); + brw_MAC (compile, + brw_message_reg(msg + 1), + brw_vec1_grf (reg, 1), + brw_vec8_grf (tmp + 2)); +} + +static void +emit_wm_load_radial (struct brw_compile *compile, + int reg, int msg) + +{ + struct brw_reg c1x = brw_vec1_grf (reg, 0); + struct brw_reg c1y = brw_vec1_grf (reg, 1); + struct brw_reg minus_r_sq = brw_vec1_grf (reg, 3); + struct brw_reg cdx = brw_vec1_grf (reg, 4); + struct brw_reg cdy = brw_vec1_grf (reg, 5); + struct brw_reg neg_4a = brw_vec1_grf (reg + 1, 0); + struct brw_reg inv_2a = brw_vec1_grf (reg + 1, 1); + + struct brw_reg tmp_x = brw_uw16_grf (30, 0); + struct brw_reg tmp_y = brw_uw16_grf (28, 0); + struct brw_reg det = brw_vec8_grf (22); + struct brw_reg b = brw_vec8_grf (20); + struct brw_reg c = brw_vec8_grf (18); + struct brw_reg pdx = brw_vec8_grf (16); + struct brw_reg pdy = brw_vec8_grf (14); + struct brw_reg t = brw_message_reg (msg + 1); + + /* cdx = (câ‚‚x - câ‚x) + * cdy = (câ‚‚y - câ‚y) + * dr = râ‚‚-râ‚ + * pdx = px - câ‚x + * pdy = py - câ‚y + * + * A = cdx² + cdy² - dr² + * B = -2·(pdx·cdx + pdy·cdy + râ‚·dr) + * C = pdx² + pdy² - r₲ + * + * t = (-2·B ± ⎷(B² - 4·A·C)) / 2·A + */ + + brw_ADD (compile, pdx, vec8 (tmp_x), negate (c1x)); + brw_ADD (compile, pdy, vec8 (tmp_y), negate (c1y)); + + brw_LINE (compile, brw_null_reg (), cdx, pdx); + brw_MAC (compile, b, cdy, pdy); + + brw_MUL (compile, brw_null_reg (), pdx, pdx); + brw_MAC (compile, c, pdy, pdy); + brw_ADD (compile, c, c, minus_r_sq); + + brw_MUL (compile, brw_null_reg (), b, b); + brw_MAC (compile, det, neg_4a, c); + + /* XXX use rsqrt like i915?, it's faster and we need to mac anyway */ + brw_math (compile, + det, + BRW_MATH_FUNCTION_SQRT, + BRW_MATH_SATURATE_NONE, + 2, + det, + BRW_MATH_DATA_VECTOR, + BRW_MATH_PRECISION_FULL); + + /* XXX cmp, +- */ + + brw_ADD (compile, det, negate (det), negate (b)); + brw_ADD (compile, det, det, negate (b)); + brw_MUL (compile, t, det, inv_2a); +} + +static int +emit_wm_sample (struct brw_compile *compile, + union i965_shader_channel *channel, + int sampler, + int msg_base, int msg_len, + int dst, + struct brw_reg *result) +{ + int response_len, mask; + + if (channel->base.content == CAIRO_CONTENT_ALPHA) { + mask = 0x7000; + response_len = 2; + result[0] = result[1] = result[2] = result[3] = brw_vec8_grf (dst); + result[4] = result[5] = result[6] = result[7] = brw_vec8_grf (dst + 1); + } else { + mask = 0; + response_len = 8; + result[0] = brw_vec8_grf (dst + 0); + result[1] = brw_vec8_grf (dst + 2); + result[2] = brw_vec8_grf (dst + 4); + result[3] = brw_vec8_grf (dst + 6); + result[4] = brw_vec8_grf (dst + 1); + result[5] = brw_vec8_grf (dst + 3); + result[6] = brw_vec8_grf (dst + 5); + result[7] = brw_vec8_grf (dst + 7); + } + + brw_set_compression_control (compile, BRW_COMPRESSION_NONE); + + brw_set_mask_control (compile, BRW_MASK_DISABLE); + brw_MOV (compile, + get_element_ud (brw_vec8_grf (0), 2), + brw_imm_ud (mask)); + brw_set_mask_control (compile, BRW_MASK_ENABLE); + + brw_SAMPLE (compile, + brw_uw16_grf (dst, 0), + msg_base, + brw_uw8_grf (0, 0), + sampler + 1, /* binding table */ + sampler, + WRITEMASK_XYZW, + BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE, + response_len, + msg_len, + 0 /* eot */); + + brw_set_compression_control (compile, BRW_COMPRESSION_COMPRESSED); + + return response_len; +} + +#define MAX_MSG_REGISTER 16 + +static void +emit_wm_load_channel (struct brw_compile *compile, + union i965_shader_channel *channel, + int *vue, + int *cue, + int *msg, + int *sampler, + int *grf, + struct brw_reg *result) +{ + switch (channel->type.fragment) { + case FS_NONE: + break; + + case FS_CONSTANT: + emit_wm_load_constant (compile, *cue, result); + *cue += 1; + break; + + case FS_RADIAL: + emit_wm_load_radial (compile, *cue, *msg); + *cue += 2; + + if (*msg + 3 > MAX_MSG_REGISTER) + *msg = 1; + + *grf += emit_wm_sample (compile, channel, *sampler, *msg, 3, *grf, result); + *sampler += 1; + *msg += 3; + break; + + case FS_LINEAR: + emit_wm_load_linear (compile, *grf, *cue, *msg); + *cue += 1; + + if (*msg + 3 > MAX_MSG_REGISTER) + *msg = 1; + + *grf += emit_wm_sample (compile, channel, *sampler, *msg, 3, *grf, result); + *sampler += 1; + *msg += 3; + break; + + case FS_SURFACE: + emit_wm_affine (compile, *grf, *cue, *msg); + *cue += 2; + + if (*msg + 5 > MAX_MSG_REGISTER) + *msg = 1; + + *grf += emit_wm_sample (compile, channel, *sampler, *msg, 5, *grf, result); + *sampler += 1; + *msg += 5; + break; + + case FS_SPANS: + emit_wm_load_opacity (compile, *vue, result); + *vue += 1; + break; + + case FS_GLYPHS: + emit_wm_glyph (compile, *grf, *vue, *msg); + *vue += 1; + + if (*msg + 5 > MAX_MSG_REGISTER) + *msg = 1; + + *grf += emit_wm_sample (compile, channel, *sampler, *msg, 5, *grf, result); + *sampler += 1; + *msg += 5; + break; + } +} + +static unsigned long +i965_wm_kernel_hash (const i965_shader_t *shader) +{ + unsigned long hash; + + hash = + (shader->source.type.fragment & 0xff) | + (shader->mask.type.fragment & 0xff) << 8 | + (shader->clip.type.fragment & 0xff) << 16; + if (shader->need_combine) + hash |= (1 + shader->op) << 24; + + return hash; +} + +static void +i965_wm_kernel_init (struct i965_wm_kernel *key, + const i965_shader_t *shader) +{ + key->entry.hash = i965_wm_kernel_hash (shader); +} + +static uint32_t +i965_shader_const_urb_length (i965_shader_t *shader) +{ + const int lengths[] = { 0, 1, 1, 4, 2, 0, 0 }; + int count = 0; /* 128-bit/16-byte increments */ + + count += lengths[shader->source.type.fragment]; + count += lengths[shader->mask.type.fragment]; + count += lengths[shader->clip.type.fragment]; + count += lengths[shader->dst.type.fragment]; + + return (count + 1) / 2; /* 256-bit/32-byte increments */ +} + +static uint32_t +i965_shader_pue_length (i965_shader_t *shader) +{ + return 1 + (shader->mask.type.vertex != VS_NONE); +} + +static uint32_t +create_wm_kernel (i965_device_t *device, + i965_shader_t *shader, + int *num_reg) +{ + struct brw_compile compile; + struct brw_reg source[8], mask[8], clip[8], dst[8]; + const uint32_t *program; + uint32_t size; + int msg, cue, vue, grf, sampler; + int i; + + struct i965_wm_kernel key, *cache; + cairo_status_t status; + uint32_t offset; + + i965_wm_kernel_init (&key, shader); + cache = _cairo_hash_table_lookup (device->wm_kernels, &key.entry); + if (cache != NULL) + return cache->offset; + + brw_compile_init (&compile, device->is_g4x); + + if (key.entry.hash == FS_CONSTANT && + to_intel_bo (shader->target->intel.drm.bo)->tiling) + { + struct brw_instruction *insn; + + assert (i965_shader_const_urb_length (shader) == 1); + brw_MOV (&compile, brw_message4_reg (2), brw_vec4_grf (2, 0)); + grf = 3; + + brw_push_insn_state (&compile); + brw_set_mask_control (&compile, BRW_MASK_DISABLE); /* ? */ + brw_MOV (&compile, + retype (brw_message_reg (1), BRW_REGISTER_TYPE_UD), + retype (brw_vec8_grf (1), BRW_REGISTER_TYPE_UD)); + brw_pop_insn_state (&compile); + + insn = brw_next_instruction (&compile, BRW_OPCODE_SEND); + insn->header.predicate_control = 0; + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.destreg__conditonalmod = 0; + + brw_instruction_set_destination (insn, + retype (vec16 (brw_acc_reg ()), + BRW_REGISTER_TYPE_UW)); + + brw_instruction_set_source0 (insn, + retype (brw_vec8_grf (0), + BRW_REGISTER_TYPE_UW)); + + brw_instruction_set_dp_write_message (insn, + 0, + BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED, /* msg_control */ + BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE, /* msg_type */ + 3, + 1, /* pixel scoreboard */ + 0, + TRUE); + } + else + { + msg = 1; + cue = 2; + vue = cue + i965_shader_const_urb_length (shader); + grf = vue + i965_shader_pue_length (shader); + sampler = 0; + + brw_set_compression_control (&compile, BRW_COMPRESSION_COMPRESSED); + emit_wm_load_channel (&compile, &shader->source, + &vue, &cue, &msg, &sampler, &grf, + source); + emit_wm_load_channel (&compile, &shader->mask, + &vue, &cue, &msg, &sampler, &grf, + mask); + emit_wm_load_channel (&compile, &shader->clip, + &vue, &cue, &msg, &sampler, &grf, + clip); + emit_wm_load_channel (&compile, &shader->dst, + &vue, &cue, &msg, &sampler, &grf, + dst); + brw_set_compression_control (&compile, BRW_COMPRESSION_NONE); + + if (shader->need_combine) { + if (shader->mask.type.fragment != FS_NONE && + shader->clip.type.fragment != FS_NONE) + { + for (i = 0; i < 8; i++) + brw_MUL (&compile, mask[i], mask[i], clip[i]); + } + + /* XXX LERP ! */ + for (i = 0; i < 8; i++) + brw_MOV (&compile, brw_message_reg (2 + i), source[i]); + } else { + if (shader->mask.type.fragment != FS_NONE) { + if (shader->clip.type.fragment != FS_NONE) { + for (i = 0; i < 8; i++) + brw_MUL (&compile, mask[i], mask[i], clip[i]); + } + + for (i = 0; i < 8; i++) + brw_MUL (&compile, brw_message_reg (2 + i), source[i], mask[i]); + } else { + if (shader->clip.type.fragment != FS_NONE) { + for (i = 0; i < 8; i++) + brw_MUL (&compile, brw_message_reg (2 + i), source[i], clip[i]); + } else { + for (i = 0; i < 8; i++) + brw_MOV (&compile, brw_message_reg (2 + i), source[i]); + } + } + } + + brw_push_insn_state (&compile); + brw_set_mask_control (&compile, BRW_MASK_DISABLE); /* ? */ + brw_MOV (&compile, + retype (brw_message_reg (1), BRW_REGISTER_TYPE_UD), + retype (brw_vec8_grf (1), BRW_REGISTER_TYPE_UD)); + brw_pop_insn_state (&compile); + + brw_fb_WRITE (&compile, + retype (vec16 (brw_acc_reg ()), BRW_REGISTER_TYPE_UW), + 0, /* base reg */ + retype (brw_vec8_grf (0), BRW_REGISTER_TYPE_UW), + 0, /* binding table index */ + 2 + 8, /* msg length */ + 0, /* response length */ + TRUE); /* EOT */ + } + + program = brw_get_program (&compile, &size); + *num_reg = grf; + + i965_stream_align (&device->general, 64); + offset = i965_stream_emit (&device->general, program, size); + + cache = _cairo_freelist_alloc (&device->wm_kernel_freelist); + if (likely (cache != NULL)) { + i965_wm_kernel_init (cache, shader); + cache->offset = offset; + status = _cairo_hash_table_insert (device->wm_kernels, &cache->entry); + if (unlikely (status)) + _cairo_freelist_free (&device->wm_kernel_freelist, cache); + } + + return offset; +} + +static uint32_t +create_sf_kernel (i965_device_t *device, + i965_shader_t *shader) +{ + struct brw_compile compile; + const uint32_t *program; + uint32_t size; + int msg_len; + + brw_compile_init (&compile, device->is_g4x); + + switch (shader->mask.type.vertex) { + default: + case VS_NONE: + /* use curb plane eq in WM */ + msg_len = 1; + break; + + case VS_SPANS: + /* just a constant opacity */ + brw_MOV (&compile, + brw_message4_reg (1), + brw_vec4_grf (3, 0)); + msg_len = 2; + break; + + case VS_GLYPHS: + /* an offset+sf into the glyph cache */ + brw_MOV (&compile, + brw_acc_reg (), + brw_vec2_grf (3, 0)); + brw_MAC (&compile, + brw_message4_reg (1), + negate (brw_vec2_grf (1, 4)), + brw_imm_f (1./1024)); + msg_len = 2; + break; + } + + brw_urb_WRITE (&compile, + brw_null_reg (), + 0, + brw_vec8_grf (0), /* r0, will be copied to m0 */ + 0, /* allocate */ + 1, /* used */ + msg_len, + 0, /* response len */ + 1, /* eot */ + 1, /* writes complete */ + 0, /* offset */ + BRW_URB_SWIZZLE_NONE); + + program = brw_get_program (&compile, &size); + + i965_stream_align (&device->general, 64); + return i965_stream_emit (&device->general, program, size); +} + +static uint32_t +i965_sf_kernel (const i965_shader_t *shader) +{ + return shader->mask.type.vertex; +} + +static void +i965_sf_state_init (struct i965_sf_state *key, + const i965_shader_t *shader) +{ + key->entry.hash = i965_sf_kernel (shader); +} + +cairo_bool_t +i965_sf_state_equal (const void *A, const void *B) +{ + const cairo_hash_entry_t *a = A, *b = B; + return a->hash == b->hash; +} + +/* + * Sets up the SF state pointing at an SF kernel. + * + * The SF kernel does coord interp: for each attribute, + * calculate dA/dx and dA/dy. Hand these interpolation coefficients + * back to SF which then hands pixels off to WM. + */ +static uint32_t +gen4_create_sf_state (i965_device_t *device, + i965_shader_t *shader) +{ + struct brw_sf_unit_state *state; + struct i965_sf_state key, *cache; + cairo_status_t status; + uint32_t offset; + + i965_sf_state_init (&key, shader); + if (i965_sf_state_equal (&key, &device->sf_state)) + return device->sf_state.offset; + + cache = _cairo_hash_table_lookup (device->sf_states, &key.entry); + if (cache != NULL) { + offset = cache->offset; + goto DONE; + } + + offset = create_sf_kernel (device, shader); + + state = i965_stream_alloc (&device->general, 32, sizeof (*state)); + memset (state, 0, sizeof (*state)); + + state->thread0.grf_reg_count = BRW_GRF_BLOCKS (3); + assert ((offset & 63) == 0); + state->thread0.kernel_start_pointer = offset >> 6; + state->sf1.single_program_flow = 1; + state->thread3.urb_entry_read_length = 1; /* 1 URB per vertex */ + state->thread3.urb_entry_read_offset = 1; + state->thread3.dispatch_grf_start_reg = 3; + state->thread4.max_threads = SF_MAX_THREADS - 1; + state->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1; + state->thread4.nr_urb_entries = URB_SF_ENTRIES; + state->sf6.dest_org_vbias = 0x8; + state->sf6.dest_org_hbias = 0x8; + + offset = i965_stream_offsetof (&device->general, state); + + cache = _cairo_freelist_alloc (&device->sf_freelist); + if (likely (cache != NULL)) { + i965_sf_state_init (cache, shader); + cache->offset = offset; + status = _cairo_hash_table_insert (device->sf_states, &cache->entry); + if (unlikely (status)) + _cairo_freelist_free (&device->sf_freelist, cache); + } + + DONE: + i965_sf_state_init (&device->sf_state, shader); + device->sf_state.offset = offset; + + return offset; +} + +static unsigned long +i965_shader_sampler_hash (const i965_shader_t *shader) +{ + unsigned long hash = 0; + unsigned int offset = 0; + + if (shader->source.base.bo != NULL) { + hash |= (shader->source.base.filter << offset) | + (shader->source.base.extend << (offset + 4)); + offset += 8; + } + + if (shader->mask.base.bo != NULL) { + hash |= (shader->mask.base.filter << offset) | + (shader->mask.base.extend << (offset + 4)); + offset += 8; + } + + if (shader->clip.base.bo != NULL) { + hash |= (shader->clip.base.filter << offset) | + (shader->clip.base.extend << (offset + 4)); + offset += 8; + } + + if (shader->dst.base.bo != NULL) { + hash |= (shader->dst.base.filter << offset) | + (shader->dst.base.extend << (offset + 4)); + offset += 8; + } + + return hash; +} + +static void +i965_sampler_init (struct i965_sampler *key, + const i965_shader_t *shader) +{ + key->entry.hash = i965_shader_sampler_hash (shader); +} + +static void +emit_sampler_channel (i965_device_t *device, + const union i965_shader_channel *channel, + uint32_t border_color) +{ + struct brw_sampler_state *state; + + state = i965_stream_alloc (&device->general, 0, sizeof (*state)); + memset (state, 0, sizeof (*state)); + + state->ss0.lod_preclamp = 1; /* GL mode */ + + state->ss0.border_color_mode = BRW_BORDER_COLOR_MODE_LEGACY; + + state->ss0.min_filter = channel->base.filter; + state->ss0.mag_filter = channel->base.filter; + + state->ss1.r_wrap_mode = channel->base.extend; + state->ss1.s_wrap_mode = channel->base.extend; + state->ss1.t_wrap_mode = channel->base.extend; + + assert ((border_color & 31) == 0); + state->ss2.border_color_pointer = border_color >> 5; +} + +static uint32_t +emit_sampler_state_table (i965_device_t *device, + i965_shader_t *shader) +{ + struct i965_sampler key, *cache; + cairo_status_t status; + uint32_t offset; + + if (device->border_color_offset == (uint32_t) -1) { + struct brw_sampler_legacy_border_color *border_color; + + border_color = i965_stream_alloc (&device->general, 32, + sizeof (*border_color)); + border_color->color[0] = 0; /* R */ + border_color->color[1] = 0; /* G */ + border_color->color[2] = 0; /* B */ + border_color->color[3] = 0; /* A */ + + device->border_color_offset = i965_stream_offsetof (&device->general, + border_color); + } else { + i965_sampler_init (&key, shader); + cache = _cairo_hash_table_lookup (device->samplers, &key.entry); + if (cache != NULL) + return cache->offset; + } + + i965_stream_align (&device->general, 32); + offset = device->general.used; + if (shader->source.base.bo != NULL) { + emit_sampler_channel (device, + &shader->source, + device->border_color_offset); + } + if (shader->mask.base.bo != NULL) { + emit_sampler_channel (device, + &shader->mask, + device->border_color_offset); + } + if (shader->clip.base.bo != NULL) { + emit_sampler_channel (device, + &shader->clip, + device->border_color_offset); + } + if (shader->dst.base.bo != NULL) { + emit_sampler_channel (device, + &shader->dst, + device->border_color_offset); + } + + cache = _cairo_freelist_alloc (&device->sampler_freelist); + if (likely (cache != NULL)) { + i965_sampler_init (cache, shader); + cache->offset = offset; + status = _cairo_hash_table_insert (device->samplers, &cache->entry); + if (unlikely (status)) + _cairo_freelist_free (&device->sampler_freelist, cache); + } + + return offset; +} + +static void +i965_cc_state_init (struct i965_cc_state *key, + const i965_shader_t *shader) +{ + uint32_t src_blend, dst_blend; + + if (shader->need_combine) + src_blend = dst_blend = 0; + else + i965_shader_get_blend_cntl (shader, &src_blend, &dst_blend); + + key->entry.hash = src_blend | ((dst_blend & 0xffff) << 16); +} + +cairo_bool_t +i965_cc_state_equal (const void *A, const void *B) +{ + const cairo_hash_entry_t *a = A, *b = B; + return a->hash == b->hash; +} + +static uint32_t +cc_state_emit (i965_device_t *device, i965_shader_t *shader) +{ + struct brw_cc_unit_state *state; + struct i965_cc_state key, *cache; + cairo_status_t status; + uint32_t src_blend, dst_blend; + uint32_t offset; + + i965_cc_state_init (&key, shader); + if (i965_cc_state_equal (&key, &device->cc_state)) + return device->cc_state.offset; + + cache = _cairo_hash_table_lookup (device->cc_states, &key.entry); + if (cache != NULL) { + offset = cache->offset; + goto DONE; + } + + if (shader->need_combine) + src_blend = dst_blend = 0; + else + i965_shader_get_blend_cntl (shader, &src_blend, &dst_blend); + + state = i965_stream_alloc (&device->general, 64, sizeof (*state)); + memset (state, 0, sizeof (*state)); + + /* XXX Note errata, need to flush render cache when blend_enable 0 -> 1 */ + /* XXX 2 source blend */ + state->cc3.blend_enable = ! shader->need_combine; + state->cc5.ia_blend_function = BRW_BLENDFUNCTION_ADD; + state->cc5.ia_src_blend_factor = src_blend; + state->cc5.ia_dest_blend_factor = dst_blend; + state->cc6.blend_function = BRW_BLENDFUNCTION_ADD; + state->cc6.clamp_post_alpha_blend = 1; + state->cc6.clamp_pre_alpha_blend = 1; + state->cc6.src_blend_factor = src_blend; + state->cc6.dest_blend_factor = dst_blend; + + offset = i965_stream_offsetof (&device->general, state); + + cache = _cairo_freelist_alloc (&device->cc_freelist); + if (likely (cache != NULL)) { + i965_cc_state_init (cache, shader); + cache->offset = offset; + status = _cairo_hash_table_insert (device->cc_states, &cache->entry); + if (unlikely (status)) + _cairo_freelist_free (&device->cc_freelist, cache); + } + + DONE: + i965_cc_state_init (&device->cc_state, shader); + device->cc_state.offset = offset; + + return offset; +} + +static void +i965_wm_state_init (struct i965_wm_state *key, + const i965_shader_t *shader) +{ + key->kernel = i965_wm_kernel_hash (shader); + key->sampler = i965_shader_sampler_hash (shader); + + key->entry.hash = key->kernel ^ ((key->sampler) << 16 | (key->sampler >> 16)); +} + +cairo_bool_t +i965_wm_state_equal (const void *A, const void *B) +{ + const struct i965_wm_state *a = A, *b = B; + + if (a->entry.hash != b->entry.hash) + return FALSE; + + return a->kernel == b->kernel && a->sampler == b->sampler; +} + +static int +i965_shader_binding_table_count (i965_shader_t *shader) +{ + int count; + + count = 1; + if (shader->source.type.fragment != FS_CONSTANT) + count++; + switch (shader->mask.type.fragment) { + case FS_NONE: + case FS_CONSTANT: + case FS_SPANS: + break; + case FS_LINEAR: + case FS_RADIAL: + case FS_SURFACE: + case FS_GLYPHS: + count++; + } + if (shader->clip.type.fragment == FS_SURFACE) + count++; + if (shader->dst.type.fragment == FS_SURFACE) + count++; + + return count; +} + +static uint32_t +gen4_create_wm_state (i965_device_t *device, + i965_shader_t *shader) +{ + struct brw_wm_unit_state *state; + uint32_t sampler; + uint32_t kernel; + + struct i965_wm_state key, *cache; + cairo_status_t status; + int num_reg; + + i965_wm_state_init (&key, shader); + if (i965_wm_state_equal (&key, &device->wm_state)) + return device->wm_state.offset; + + cache = _cairo_hash_table_lookup (device->wm_states, &key.entry); + if (cache != NULL) { + device->wm_state = *cache; + return cache->offset; + } + + kernel = create_wm_kernel (device, shader, &num_reg); + sampler = emit_sampler_state_table (device, shader); + + state = i965_stream_alloc (&device->general, 32, sizeof (*state)); + memset (state, 0, sizeof (*state)); + state->thread0.grf_reg_count = BRW_GRF_BLOCKS (num_reg); + assert ((kernel & 63) == 0); + state->thread0.kernel_start_pointer = kernel >> 6; + + state->thread3.dispatch_grf_start_reg = 2; + + state->wm4.sampler_count = 1; /* 1-4 samplers used */ + assert ((sampler & 31) == 0); + state->wm4.sampler_state_pointer = sampler >> 5; + if (device->is_g4x) + state->wm5.max_threads = PS_MAX_THREADS_CTG - 1; + else + state->wm5.max_threads = PS_MAX_THREADS_BRW - 1; + state->wm5.thread_dispatch_enable = 1; + + if (device->is_g4x) { + /* XXX contiguous 32 pixel dispatch */ + } + state->wm5.enable_16_pix = 1; + /* 8 pixel dispatch and friends */ + //state->wm5.early_depth_test = 1; + + state->thread1.binding_table_entry_count = i965_shader_binding_table_count(shader); + state->thread3.urb_entry_read_length = i965_shader_pue_length (shader); + state->thread3.const_urb_entry_read_length = i965_shader_const_urb_length (shader); + + key.offset = i965_stream_offsetof (&device->general, state); + + cache = _cairo_freelist_alloc (&device->wm_state_freelist); + if (likely (cache != NULL)) { + *cache = key; + status = _cairo_hash_table_insert (device->wm_states, &cache->entry); + if (unlikely (status)) + _cairo_freelist_free (&device->wm_state_freelist, cache); + } + + device->wm_state = key; + return key.offset; +} + +static uint32_t +vs_unit_state_emit (i965_device_t *device) +{ + if (device->vs_offset == (uint32_t) -1) { + struct brw_vs_unit_state *state; + + /* Set up the vertex shader to be disabled (passthrough) */ + state = i965_stream_alloc (&device->general, 32, sizeof (*state)); + memset (state, 0, sizeof (*state)); + + state->thread4.nr_urb_entries = URB_VS_ENTRIES; + state->thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1; + state->vs6.vert_cache_disable = 1; + + device->vs_offset = i965_stream_offsetof (&device->general, state); + } + + return device->vs_offset; +} + +static uint32_t +i965_get_card_format (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + return BRW_SURFACEFORMAT_B8G8R8A8_UNORM; + case CAIRO_FORMAT_RGB24: + return BRW_SURFACEFORMAT_B8G8R8X8_UNORM; + case CAIRO_FORMAT_RGB16_565: + return BRW_SURFACEFORMAT_B5G6R5_UNORM; + case CAIRO_FORMAT_A8: + return BRW_SURFACEFORMAT_A8_UNORM; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +static uint32_t +i965_get_dest_format (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + return BRW_SURFACEFORMAT_B8G8R8A8_UNORM; + case CAIRO_FORMAT_RGB16_565: + return BRW_SURFACEFORMAT_B5G6R5_UNORM; + case CAIRO_FORMAT_A8: + return BRW_SURFACEFORMAT_A8_UNORM; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_INVALID: + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +/* XXX silly inline due to compiler bug... */ +static inline void +i965_stream_add_pending_relocation (i965_stream_t *stream, + uint32_t target_offset, + uint32_t read_domains, + uint32_t write_domain, + uint32_t delta) +{ + int n; + + n = stream->num_pending_relocations++; + assert (n < stream->max_pending_relocations); + + stream->pending_relocations[n].offset = target_offset; + stream->pending_relocations[n].read_domains = read_domains; + stream->pending_relocations[n].write_domain = write_domain; + stream->pending_relocations[n].delta = delta; +} + +static uint32_t +emit_surface_state (i965_device_t *device, + cairo_bool_t is_target, + intel_bo_t *bo, + cairo_format_t format, + int width, int height, int stride, + int type) +{ + struct brw_surface_state *state; + uint32_t write_domain, read_domains; + uint32_t offset; + + state = i965_stream_alloc (&device->surface, 32, sizeof (*state)); + memset (state, 0, sizeof (*state)); + + state->ss0.surface_type = type; + if (is_target) + state->ss0.surface_format = i965_get_dest_format (format); + else + state->ss0.surface_format = i965_get_card_format (format); + + state->ss0.data_return_format = BRW_SURFACERETURNFORMAT_FLOAT32; + state->ss0.color_blend = 1; + if (is_target && device->is_g4x) + state->ss0.render_cache_read_mode = 1; + + state->ss1.base_addr = bo->offset; + + state->ss2.height = height - 1; + state->ss2.width = width - 1; + state->ss3.pitch = stride - 1; + state->ss3.tile_walk = bo->tiling == I915_TILING_Y; + state->ss3.tiled_surface = bo->tiling != I915_TILING_NONE; + + if (is_target) { + read_domains = I915_GEM_DOMAIN_RENDER; + write_domain = I915_GEM_DOMAIN_RENDER; + } else { + read_domains = I915_GEM_DOMAIN_SAMPLER; + write_domain = 0; + } + + offset = i965_stream_offsetof (&device->surface, state); + i965_emit_relocation (device, &device->surface, + bo, 0, + read_domains, write_domain, + offset + offsetof (struct brw_surface_state, ss1.base_addr)); + return offset; +} + +static uint32_t +emit_surface_state_for_shader (i965_device_t *device, + const union i965_shader_channel *channel) +{ + int type = BRW_SURFACE_2D; + + assert (channel->type.fragment != FS_NONE); + assert (channel->type.fragment != FS_CONSTANT); + + if (channel->type.fragment != FS_SURFACE) + type = BRW_SURFACE_1D; + + return emit_surface_state (device, FALSE, + channel->base.bo, + channel->base.format, + channel->base.width, + channel->base.height, + channel->base.stride, + type); +} + +cairo_bool_t +i965_wm_binding_equal (const void *A, + const void *B) +{ + const struct i965_wm_binding *a = A, *b = B; + + if (a->entry.hash != b->entry.hash) + return FALSE; + + if (a->size != b->size) + return FALSE; + + return memcmp (a->table, b->table, sizeof (uint32_t) * a->size) == 0; +} + +static void +i965_wm_binding_init (struct i965_wm_binding *state, + const uint32_t *table, + int size) +{ + int n; + + state->entry.hash = size; + state->size = size; + + for (n = 0; n < size; n++) { + state->table[n] = table[n]; + state->entry.hash ^= (table[n] << (8 * n)) | + (table[n] >> (32 - (8*n))); + } +} + +static uint32_t +emit_binding_table (i965_device_t *device, + i965_shader_t *shader) +{ + intel_bo_t *bo; + struct i965_wm_binding key, *cache; + uint32_t *table; + int n = 0; + + table = i965_stream_alloc (&device->surface, 32, 5 * sizeof (uint32_t)); + if (shader->target->stream != device->surface.serial) { + shader->target->stream = device->surface.serial; + shader->target->offset = emit_surface_state (device, + TRUE, + to_intel_bo (shader->target->intel.drm.bo), + shader->target->intel.drm.format, + shader->target->intel.drm.width, + shader->target->intel.drm.height, + shader->target->intel.drm.stride, + BRW_SURFACE_2D); + } + table[n++] = shader->target->offset; + + bo = shader->source.base.bo; + if (bo != NULL) { + if (bo->opaque0 != device->surface.serial) { + bo->opaque0 = device->surface.serial; + bo->opaque1 = emit_surface_state_for_shader (device, &shader->source); + } + table[n++] = bo->opaque1; + } + + bo = shader->mask.base.bo; + if (bo != NULL) { + if (bo->opaque0 != device->surface.serial) { + bo->opaque0 = device->surface.serial; + bo->opaque1 = emit_surface_state_for_shader (device, &shader->mask); + } + table[n++] = bo->opaque1; + } + + bo = shader->clip.base.bo; + if (bo != NULL) { + if (bo->opaque0 != device->surface.serial) { + bo->opaque0 = device->surface.serial; + bo->opaque1 = emit_surface_state_for_shader (device, &shader->clip); + } + table[n++] = bo->opaque1; + } + + bo = shader->dst.base.bo; + if (bo != NULL) { + if (bo->opaque0 != device->surface.serial) { + bo->opaque0 = device->surface.serial; + bo->opaque1 = emit_surface_state_for_shader (device, &shader->dst); + } + table[n++] = bo->opaque1; + } + + i965_wm_binding_init (&key, table, n); + key.offset = i965_stream_offsetof (&device->surface, table); + + if (i965_wm_binding_equal (&key, &device->wm_binding)) { + device->surface.used = key.offset; + return device->wm_binding.offset; + } + + cache = _cairo_hash_table_lookup (device->wm_bindings, &key.entry); + if (cache != NULL) { + device->surface.used = key.offset; + key.offset = cache->offset; + } + + device->wm_binding = key; + return key.offset; +} + +static void +i965_emit_invariants (i965_device_t *device) +{ + OUT_BATCH (BRW_CS_URB_STATE | 0); + OUT_BATCH (((URB_CS_ENTRY_SIZE-1) << 4) | (URB_CS_ENTRIES << 0)); +} + +static void +i965_emit_urb_fences (i965_device_t *device) +{ + int urb_vs_start, urb_vs_size; + int urb_gs_start, urb_gs_size; + int urb_clip_start, urb_clip_size; + int urb_sf_start, urb_sf_size; + int urb_cs_start, urb_cs_size; + + if (device->have_urb_fences) + return; + + /* URB fence */ + urb_vs_start = 0; + urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE; + urb_gs_start = urb_vs_start + urb_vs_size; + urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE; + urb_clip_start = urb_gs_start + urb_gs_size; + urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE; + urb_sf_start = urb_clip_start + urb_clip_size; + urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE; + urb_cs_start = urb_sf_start + urb_sf_size; + urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; + + /* erratum: URB_FENCE must not cross a 64-byte cache-line */ + while ((device->batch.used & 63) > 64-12) + OUT_BATCH (MI_NOOP); + OUT_BATCH (BRW_URB_FENCE | + UF0_CS_REALLOC | + UF0_SF_REALLOC | + UF0_CLIP_REALLOC | + UF0_GS_REALLOC | + UF0_VS_REALLOC | + 1); + OUT_BATCH (((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) | + ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) | + ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT)); + OUT_BATCH (((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) | + ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT)); + + device->have_urb_fences = TRUE; + device->constants_size = 0; +} + +static void +i965_emit_base (i965_device_t *device) +{ + OUT_BATCH (BRW_STATE_BASE_ADDRESS | 4); + if (likely (device->general.num_pending_relocations == 0)) { + i965_stream_add_pending_relocation (&device->general, + device->batch.used, + I915_GEM_DOMAIN_INSTRUCTION, 0, + BASE_ADDRESS_MODIFY); + } + OUT_BATCH (0); /* pending relocation */ + + if (likely (device->surface.num_pending_relocations == 0)) { + i965_stream_add_pending_relocation (&device->surface, + device->batch.used, + I915_GEM_DOMAIN_INSTRUCTION, 0, + BASE_ADDRESS_MODIFY); + } + OUT_BATCH (0); /* pending relocation */ + + OUT_BATCH (0 | BASE_ADDRESS_MODIFY); + /* general state max addr, disabled */ + OUT_BATCH (0x10000000 | BASE_ADDRESS_MODIFY); + /* media object state max addr, disabled */ + OUT_BATCH (0x10000000 | BASE_ADDRESS_MODIFY); +} + +static void +i965_emit_vertex_element (i965_device_t *device, + i965_shader_t *shader) +{ + uint32_t offset; + uint32_t type; + int nelem; + + type = 0; + nelem = 1; + if (shader->mask.type.vertex == VS_SPANS || + shader->mask.type.vertex == VS_GLYPHS) + { + type = shader->mask.type.vertex; + nelem++; + } + + if (type == device->vertex_type) + return; + device->vertex_type = type; + + offset = 0; + + OUT_BATCH (BRW_3DSTATE_VERTEX_ELEMENTS | ((2 * nelem) - 1)); + OUT_BATCH ((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | + VE0_VALID | + (BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) | + (offset << VE0_OFFSET_SHIFT)); + OUT_BATCH ((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | + (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | + (BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT) | + (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | + (4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); + offset += 8; + + assert (shader->source.type.vertex == VS_NONE); + switch (shader->mask.type.vertex) { + default: + case VS_NONE: + break; + + case VS_SPANS: + OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | + VE0_VALID | + (BRW_SURFACEFORMAT_R32_FLOAT << VE0_FORMAT_SHIFT) | + (offset << VE0_OFFSET_SHIFT)); + OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | + (BRW_VFCOMPONENT_NOSTORE << VE1_VFCOMPONENT_1_SHIFT) | + (BRW_VFCOMPONENT_NOSTORE << VE1_VFCOMPONENT_2_SHIFT) | + (BRW_VFCOMPONENT_NOSTORE << VE1_VFCOMPONENT_3_SHIFT) | + (8 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); + + offset += 4; + break; + + case VS_GLYPHS: + OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | + VE0_VALID | + (BRW_SURFACEFORMAT_R16G16_FLOAT << VE0_FORMAT_SHIFT) | + (offset << VE0_OFFSET_SHIFT)); + OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | + (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | + (BRW_VFCOMPONENT_NOSTORE << VE1_VFCOMPONENT_2_SHIFT) | + (BRW_VFCOMPONENT_NOSTORE << VE1_VFCOMPONENT_3_SHIFT) | + (8 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); + + offset += 4; + break; + } + assert (shader->clip.type.vertex == VS_NONE); + assert (shader->dst.type.vertex == VS_NONE); + + device->vertex_size = offset; + i965_stream_align (&device->vertex, device->vertex_size); + device->vertex.committed = device->vertex.used; + + device->rectangle_size = 3 * offset; +} + +static cairo_bool_t +i965_shader_needs_surface_update (const i965_shader_t *shader, + const i965_device_t *device) +{ + return device->target != shader->target || shader->target->stream == 0 || + (shader->source.base.bo != NULL && device->source != shader->source.base.bo) || + (shader->mask.base.bo != NULL && device->mask != shader->mask.base.bo) || + (shader->clip.base.bo != NULL && device->clip != shader->clip.base.bo); +} + +static cairo_bool_t +i965_shader_needs_constants_update (const i965_shader_t *shader, + const i965_device_t *device) +{ + if (shader->constants_size == 0) + return FALSE; + + if (device->constants_size != shader->constants_size) + return TRUE; + + return memcmp (device->constants, + shader->constants, + sizeof (float) * shader->constants_size); +} + +static cairo_bool_t +i965_shader_needs_state_update (const i965_shader_t *shader, + const i965_device_t *device) +{ + union { + struct i965_sf_state sf; + struct i965_wm_state wm; + struct i965_cc_state cc; + } state; + + i965_sf_state_init (&state.sf, shader); + if (! i965_sf_state_equal (&state.sf, &device->sf_state)) + return TRUE; + + i965_wm_state_init (&state.wm, shader); + if (! i965_wm_state_equal (&state.wm, &device->wm_state)) + return TRUE; + + i965_cc_state_init (&state.cc, shader); + if (! i965_cc_state_equal (&state.cc, &device->cc_state)) + return TRUE; + + return FALSE; +} + +static void +i965_emit_composite (i965_device_t *device, + i965_shader_t *shader) +{ + uint32_t draw_rectangle; + + if (i965_shader_needs_surface_update (shader, device)) { + uint32_t offset; + + offset = emit_binding_table (device, shader); + + /* Only the PS uses the binding table */ + OUT_BATCH (BRW_3DSTATE_BINDING_TABLE_POINTERS | 4); + OUT_BATCH (0); /* vs */ + OUT_BATCH (0); /* gs */ + OUT_BATCH (0); /* clip */ + OUT_BATCH (0); /* sf */ + OUT_BATCH (offset); + + device->target = shader->target; + device->source = shader->source.base.bo; + device->mask = shader->mask.base.bo; + device->clip = shader->clip.base.bo; + } + + /* The drawing rectangle clipping is always on. Set it to values that + * shouldn't do any clipping. + */ + draw_rectangle = DRAW_YMAX (shader->target->intel.drm.height) | + DRAW_XMAX (shader->target->intel.drm.width); + if (draw_rectangle != device->draw_rectangle) { + OUT_BATCH (BRW_3DSTATE_DRAWING_RECTANGLE | 2); + OUT_BATCH (0x00000000); /* ymin, xmin */ + OUT_BATCH (draw_rectangle); + OUT_BATCH (0x00000000); /* yorigin, xorigin */ + device->draw_rectangle = draw_rectangle; + } + + /* skip the depth buffer */ + /* skip the polygon stipple */ + /* skip the polygon stipple offset */ + /* skip the line stipple */ + + /* Set the pointers to the 3d pipeline state */ + if (i965_shader_needs_state_update (shader, device)) { + OUT_BATCH (BRW_3DSTATE_PIPELINED_POINTERS | 5); + OUT_BATCH (vs_unit_state_emit (device)); + OUT_BATCH (BRW_GS_DISABLE); + OUT_BATCH (BRW_CLIP_DISABLE); + OUT_BATCH (gen4_create_sf_state (device, shader)); + OUT_BATCH (gen4_create_wm_state (device, shader)); + OUT_BATCH (cc_state_emit (device, shader)); + + /* Once the units are initialized, we need to setup the fences */ + i965_emit_urb_fences (device); + } + + if (i965_shader_needs_constants_update (shader, device)) { + uint32_t size = (sizeof (float) * shader->constants_size + 63) & -64; + + /* XXX reuse clear/black/white + * ht! + */ + + /* XXX CONSTANT_BUFFER Address Offset Disable? INSTPM? */ + + assert (size <= 64 * URB_CS_ENTRY_SIZE); + assert (((sizeof (float) * shader->constants_size + 31) & -32) == 32 * i965_shader_const_urb_length (shader)); + + device->constants = i965_stream_alloc (&device->surface, 64, size); + memcpy (device->constants, shader->constants, size); + device->constants_size = shader->constants_size; + + OUT_BATCH (BRW_CONSTANT_BUFFER | (1 << 8)); + OUT_BATCH (i965_stream_offsetof (&device->surface, device->constants) + size / 64 - 1); + } + + i965_emit_vertex_element (device, shader); +} + +void +i965_flush_vertices (i965_device_t *device) +{ + int vertex_count, vertex_start; + + if (device->vertex.used == device->vertex.committed) + return; + + assert (device->vertex.used > device->vertex.committed); + + vertex_start = device->vertex.committed / device->vertex_size; + vertex_count = + (device->vertex.used - device->vertex.committed) / device->vertex_size; + + assert (vertex_count); + + if (device->vertex_size != device->last_vertex_size) { + i965_stream_add_pending_relocation (&device->vertex, + device->batch.used + 8, + I915_GEM_DOMAIN_VERTEX, 0, + 0); + + OUT_BATCH (BRW_3DSTATE_VERTEX_BUFFERS | 3); + OUT_BATCH ((0 << VB0_BUFFER_INDEX_SHIFT) | + VB0_VERTEXDATA | + (device->vertex_size << VB0_BUFFER_PITCH_SHIFT)); + OUT_BATCH (0); /* pending relocation */ + OUT_BATCH (0); + OUT_BATCH (0); + device->last_vertex_size = device->vertex_size; + } + + OUT_BATCH (BRW_3DPRIMITIVE | + BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | + (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | + (0 << 9) | + 4); + OUT_BATCH (vertex_count); /* vertex count per instance */ + OUT_BATCH (vertex_start); /* start vertex offset */ + OUT_BATCH (1); /* single instance */ + OUT_BATCH (0); + OUT_BATCH (0); + + device->vertex.committed = device->vertex.used; +} + +void +i965_finish_vertices (i965_device_t *device) +{ + cairo_status_t status; + + i965_flush_vertices (device); + + i965_stream_commit (device, &device->vertex); + + if (! i965_shader_check_aperture (device->shader, device)) { + status = i965_device_flush (device); + if (unlikely (status)) + longjmp (device->shader->unwind, status); + + status = i965_shader_commit (device->shader, device); + assert (status == CAIRO_STATUS_SUCCESS); + } + + device->last_vertex_size = 0; +} + +static cairo_bool_t +i965_shader_needs_update (const i965_shader_t *shader, + const i965_device_t *device) +{ + if (i965_shader_needs_surface_update (shader, device)) + return TRUE; + + if (i965_shader_needs_constants_update (shader, device)) + return TRUE; + + return i965_shader_needs_state_update (shader, device); +} + +static void +i965_shader_reduce (i965_shader_t *shader, + const i965_device_t *device) +{ + if (shader->op == CAIRO_OPERATOR_OVER && + (i965_wm_kernel_hash (shader) & ~0xff) == 0 && + (shader->source.base.content & CAIRO_CONTENT_ALPHA) == 0) + { + shader->op = CAIRO_OPERATOR_SOURCE; + } +} + +cairo_status_t +i965_shader_commit (i965_shader_t *shader, + i965_device_t *device) +{ + cairo_status_t status; + + if (! shader->committed) { + device->shader = shader; + + status = i965_shader_setup_dst (shader); + if (unlikely (status)) + return status; + + i965_shader_setup_constants (shader); + i965_shader_reduce (shader, device); + + if ((status = setjmp (shader->unwind))) + return status; + + shader->committed = TRUE; + } + + if (! i965_shader_needs_update (shader, device)) + return CAIRO_STATUS_SUCCESS; + + /* XXX too many guestimates about likely maximum sizes */ +recheck: + if (device->batch.used + 128 > device->batch.size || + ! i965_shader_check_aperture (shader, device)) + { + status = i965_device_flush (device); + if (unlikely (status)) + longjmp (shader->unwind, status); + } + + i965_flush_vertices (device); + + if (unlikely (device->surface.used + 128 > device->surface.size || + device->surface.num_relocations + 4 > device->surface.max_relocations)) + { + i965_stream_commit (device, &device->surface); + goto recheck; + } + + if (unlikely (device->general.used + 512 > device->general.size)) { + i965_stream_commit (device, &device->general); + i965_general_state_reset (device); + goto recheck; + } + + if (unlikely (device->batch.used == 0)) + i965_emit_invariants (device); + + if (unlikely (device->surface.num_pending_relocations == 0 || + device->general.num_pending_relocations == 0)) + { + i965_emit_base (device); + } + + i965_emit_composite (device, shader); + + return CAIRO_STATUS_SUCCESS; +} + +void +i965_clipped_vertices (i965_device_t *device, + struct i965_vbo *vbo, + cairo_region_t *clip_region) +{ + int i, num_rectangles, size; + cairo_status_t status; + + if (vbo->count == 0) + return; + + num_rectangles = cairo_region_num_rectangles (clip_region); + assert (num_rectangles); + + if (vbo->next || + vbo->count * device->vertex_size + device->vertex.used > device->vertex.size) + { + i965_finish_vertices (device); + + size = device->rectangle_size; + do { + for (i = 0; i < num_rectangles; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, i, &rect); + + if (unlikely (device->vertex.used + size > device->vertex.size || + device->batch.used + 64 > device->batch.size || + ! i965_shader_check_aperture (device->shader, device))) + { + status = i965_device_flush (device); + if (unlikely (status)) + longjmp (device->shader->unwind, status); + + status = i965_shader_commit (device->shader, device); + assert (status == CAIRO_STATUS_SUCCESS); + } + + i965_emit_relocation (device, &device->batch, + vbo->bo, 0, + I915_GEM_DOMAIN_VERTEX, 0, + device->batch.used + 8); + + OUT_BATCH (BRW_3DSTATE_VERTEX_BUFFERS | 3); + OUT_BATCH ((0 << VB0_BUFFER_INDEX_SHIFT) | + VB0_VERTEXDATA | + (device->vertex_size << VB0_BUFFER_PITCH_SHIFT)); + OUT_BATCH (vbo->bo->offset); + OUT_BATCH (0); + OUT_BATCH (0); + + /* XXX scissor? */ + OUT_BATCH (BRW_3DSTATE_DRAWING_RECTANGLE | 2); + OUT_BATCH (DRAW_YMIN (rect.y) | DRAW_XMIN (rect.x)); + OUT_BATCH (DRAW_YMAX (rect.y + rect.height) | + DRAW_XMAX (rect.x + rect.width)); + OUT_BATCH (0x00000000); /* yorigin, xorigin */ + + OUT_BATCH (BRW_3DPRIMITIVE | + BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | + (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | + (0 << 9) | + 4); + OUT_BATCH (vbo->count); /* vertex count per instance */ + OUT_BATCH (0); /* start vertex offset */ + OUT_BATCH (1); /* single instance */ + OUT_BATCH (0); + OUT_BATCH (0); + } + } while ((vbo = vbo->next) != NULL); + assert (device->last_vertex_size == 0); + } else { + int vertex_start, vertex_count; + void *ptr; + + vertex_start = device->vertex.committed / device->vertex_size; + vertex_count = vbo->count; + + size = vertex_count * device->vertex_size; + ptr = intel_bo_map (&device->intel, vbo->bo); + memcpy (device->vertex.data + device->vertex.used, ptr, size); + device->vertex.committed = device->vertex.used += size; + + for (i = 0; i < num_rectangles; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, i, &rect); + + /* XXX scissor? */ + OUT_BATCH (BRW_3DSTATE_DRAWING_RECTANGLE | 2); + OUT_BATCH (DRAW_YMIN (rect.y) | DRAW_XMIN (rect.x)); + OUT_BATCH (DRAW_YMAX (rect.y + rect.height) | + DRAW_XMAX (rect.x + rect.width)); + OUT_BATCH (0x00000000); /* yorigin, xorigin */ + + OUT_BATCH (BRW_3DPRIMITIVE | + BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | + (_3DPRIM_RECTLIST << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | + (0 << 9) | + 4); + OUT_BATCH (vertex_count); /* vertex count per instance */ + OUT_BATCH (vertex_start); /* start vertex offset */ + OUT_BATCH (1); /* single instance */ + OUT_BATCH (0); + OUT_BATCH (0); + } + } + + device->draw_rectangle = 0; +} diff --git a/src/drm/cairo-drm-i965-spans.c b/src/drm/cairo-drm-i965-spans.c new file mode 100644 index 000000000..5cba7cec8 --- /dev/null +++ b/src/drm/cairo-drm-i965-spans.c @@ -0,0 +1,407 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-boxes-private.h" +#include "cairo-error-private.h" +#include "cairo-drm-i965-private.h" + +/* Operates in either immediate or retained mode. + * When given a clip region we record the sequence of vbo and then + * replay them for each clip rectangle, otherwise we simply emit + * the vbo straight into the command stream. + */ + +typedef struct _i965_spans i965_spans_t; + +typedef float * +(*i965_get_rectangle_func_t) (i965_spans_t *spans); + +struct _i965_spans { + cairo_span_renderer_t renderer; + + i965_device_t *device; + + int xmin, xmax; + cairo_bool_t is_bounded; + const cairo_rectangle_int_t *extents; + + i965_get_rectangle_func_t get_rectangle; + i965_shader_t shader; + + cairo_region_t *clip_region; + + struct i965_vbo head, *tail; + + unsigned int vbo_offset; + float *vbo_base; +}; + +static float * +i965_spans_emit_rectangle (i965_spans_t *spans) +{ + return i965_add_rectangle (spans->device); +} + +static float * +i965_spans_accumulate_rectangle (i965_spans_t *spans) +{ + float *vertices; + uint32_t size; + + size = spans->device->rectangle_size; + if (unlikely (spans->vbo_offset + size > I965_VERTEX_SIZE)) { + struct i965_vbo *vbo; + + vbo = malloc (sizeof (struct i965_vbo)); + if (unlikely (vbo == NULL)) { + /* throw error! */ + } + + spans->tail->next = vbo; + spans->tail = vbo; + + vbo->next = NULL; + vbo->bo = intel_bo_create (&spans->device->intel, + I965_VERTEX_SIZE, I965_VERTEX_SIZE, + FALSE, I915_TILING_NONE, 0); + vbo->count = 0; + + spans->vbo_offset = 0; + spans->vbo_base = intel_bo_map (&spans->device->intel, vbo->bo); + } + + vertices = spans->vbo_base + spans->vbo_offset; + spans->vbo_offset += size; + spans->tail->count += 3; + + return vertices; +} + +static void +i965_span_rectangle (i965_spans_t *spans, + int x0, int x1, int y0, int y1, + int alpha) +{ + float *vertices; + float a = alpha / 255.; + + vertices = spans->get_rectangle (spans); + + *vertices++ = x1; + *vertices++ = y1; + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y1; + *vertices++ = a; + + *vertices++ = x0; + *vertices++ = y0; + *vertices++ = a; +} + +static cairo_status_t +i965_bounded_spans_mono (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i965_spans_t *spans = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (half[0].coverage >= 128) { + i965_span_rectangle (spans, + half[0].x, half[1].x, + y, y + height, + 255); + } + half++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_bounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i965_spans_t *spans = abstract_renderer; + + if (num_spans == 0) + return CAIRO_STATUS_SUCCESS; + + do { + if (half[0].coverage) { + i965_span_rectangle (spans, + half[0].x, half[1].x, + y, y + height, + half[0].coverage); + } + half++; + } while (--num_spans > 1); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_unbounded_spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i965_spans_t *spans = abstract_renderer; + + if (num_spans == 0) { + i965_span_rectangle (spans, + spans->xmin, spans->xmax, + y, y + height, + 0); + return CAIRO_STATUS_SUCCESS; + } + + if (half[0].x != spans->xmin) { + i965_span_rectangle (spans, + spans->xmin, half[0].x, + y, y + height, + 0); + } + + do { + i965_span_rectangle (spans, + half[0].x, half[1].x, + y, y + height, + half[0].coverage); + half++; + } while (--num_spans > 1); + + if (half[0].x != spans->xmax) { + i965_span_rectangle (spans, + half[0].x, spans->xmax, + y, y + height, + 0); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_unbounded_spans_mono (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *half, + unsigned num_spans) +{ + i965_spans_t *spans = abstract_renderer; + + if (num_spans == 0) { + i965_span_rectangle (spans, + spans->xmin, spans->xmax, + y, y + height, + 0); + return CAIRO_STATUS_SUCCESS; + } + + if (half[0].x != spans->xmin) { + i965_span_rectangle (spans, + spans->xmin, half[0].x, + y, y + height, + 0); + } + + do { + int alpha = 0; + if (half[0].coverage >= 128) + alpha = 255; + i965_span_rectangle (spans, + half[0].x, half[1].x, + y, y + height, + alpha); + half++; + } while (--num_spans > 1); + + if (half[0].x != spans->xmax) { + i965_span_rectangle (spans, + half[0].x, spans->xmax, + y, y + height, + 0); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +i965_spans_init (i965_spans_t *spans, + i965_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_antialias_t antialias, + cairo_clip_t *clip, + const cairo_composite_rectangles_t *extents) +{ + cairo_status_t status; + + spans->device = i965_device (dst); + i965_shader_init (&spans->shader, dst, op); + + spans->is_bounded = extents->is_bounded; + if (extents->is_bounded) { + if (antialias == CAIRO_ANTIALIAS_NONE) + spans->renderer.render_rows = i965_bounded_spans_mono; + else + spans->renderer.render_rows = i965_bounded_spans; + + spans->extents = &extents->bounded; + } else { + if (antialias == CAIRO_ANTIALIAS_NONE) + spans->renderer.render_rows = i965_unbounded_spans_mono; + else + spans->renderer.render_rows = i965_unbounded_spans; + + spans->extents = &extents->unbounded; + } + spans->xmin = spans->extents->x; + spans->xmax = spans->extents->x + spans->extents->width; + + spans->clip_region = NULL; + if (clip != NULL) { + cairo_region_t *clip_region = NULL; + + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED); + + if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1) + clip_region = NULL; + + spans->clip_region = clip_region; + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i965_shader_set_clip (&spans->shader, clip); + } + + spans->head.next = NULL; + spans->head.bo = NULL; + spans->head.count = 0; + spans->tail = &spans->head; + + if (spans->clip_region == NULL) { + spans->get_rectangle = i965_spans_emit_rectangle; + } else { + spans->get_rectangle = i965_spans_accumulate_rectangle; + spans->head.bo = intel_bo_create (&spans->device->intel, + I965_VERTEX_SIZE, I965_VERTEX_SIZE, + FALSE, I915_TILING_NONE, 0); + if (unlikely (spans->head.bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + spans->vbo_base = intel_bo_map (&spans->device->intel, spans->head.bo); + } + spans->vbo_offset = 0; + + return i965_shader_acquire_pattern (&spans->shader, + &spans->shader.source, + pattern, &extents->bounded); +} + +static void +i965_spans_fini (i965_spans_t *spans) +{ + i965_shader_fini (&spans->shader); + + if (spans->head.bo != NULL) { + struct i965_vbo *vbo, *next; + + intel_bo_destroy (&spans->device->intel, spans->head.bo); + for (vbo = spans->head.next; vbo != NULL; vbo = next) { + next = vbo->next; + intel_bo_destroy (&spans->device->intel, vbo->bo); + free (vbo); + } + } +} + +cairo_status_t +i965_clip_and_composite_spans (i965_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_antialias_t antialias, + i965_spans_func_t draw_func, + void *draw_closure, + const cairo_composite_rectangles_t*extents, + cairo_clip_t *clip) +{ + i965_spans_t spans; + i965_device_t *device; + cairo_status_t status; + + if (op == CAIRO_OPERATOR_CLEAR) { + pattern = &_cairo_pattern_white.base; + op = CAIRO_OPERATOR_DEST_OUT; + } + + status = i965_spans_init (&spans, dst, op, pattern, antialias, clip, extents); + if (unlikely (status)) + return status; + + spans.shader.mask.base.content = CAIRO_CONTENT_ALPHA; + spans.shader.mask.type.fragment = FS_SPANS; + spans.shader.mask.type.vertex = VS_SPANS; + spans.shader.mask.type.pattern = PATTERN_BASE; + + status = cairo_device_acquire (dst->intel.drm.base.device); + if (unlikely (status)) + goto CLEANUP_SPANS; + + device = i965_device (dst); + status = i965_shader_commit (&spans.shader, device); + if (unlikely (status)) + goto CLEANUP_DEVICE; + + status = draw_func (draw_closure, &spans.renderer, spans.extents); + if (spans.clip_region != NULL && status == CAIRO_STATUS_SUCCESS) + i965_clipped_vertices (device, &spans.head, spans.clip_region); + + CLEANUP_DEVICE: + cairo_device_release (dst->intel.drm.base.device); + CLEANUP_SPANS: + i965_spans_fini (&spans); + + return status; +} diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c new file mode 100644 index 000000000..ec7b5954c --- /dev/null +++ b/src/drm/cairo-drm-i965-surface.c @@ -0,0 +1,1927 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Kristian Høgsberg + * Copyright © 2009 Chris Wilson + * Copyright © 2009 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Kristian Høgsberg. + * + * Based on the xf86-intel-driver i965 render acceleration code, + * authored by: + * Wang Zhenyu + * Eric Anholt + * Carl Worth + * Keith Packard + */ + +/* XXX + * + * FIXME: Use brw_PLN for [DevCTG-B+] + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-ioctl-private.h" +#include "cairo-drm-intel-private.h" +#include "cairo-drm-intel-command-private.h" +#include "cairo-drm-intel-ioctl-private.h" +#include "cairo-drm-i965-private.h" + +#include "cairo-boxes-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-region-private.h" +#include "cairo-surface-offset-private.h" + +#include +#include + +#define I965_MAX_SIZE 8192 + +static const cairo_surface_backend_t i965_surface_backend; + +static void +i965_stream_init (i965_stream_t *stream, + uint8_t *data, uint32_t size, + struct i965_pending_relocation *pending, int max_pending, + struct drm_i915_gem_relocation_entry *relocations, int max_relocations) + +{ + stream->used = stream->committed = 0; + stream->data = data; + stream->size = size; + stream->serial = 1; + + stream->num_pending_relocations = 0; + stream->max_pending_relocations = max_pending; + stream->pending_relocations = pending; + + stream->num_relocations = 0; + stream->max_relocations = max_relocations; + stream->relocations = relocations; +} + +static void +i965_add_relocation (i965_device_t *device, + intel_bo_t *bo, + uint32_t read_domains, + uint32_t write_domain) +{ + if (bo->exec == NULL) { + int i; + + device->exec.gtt_size += bo->base.size; + + i = device->exec.count++; + assert (i < ARRAY_LENGTH (device->exec.exec)); + + device->exec.exec[i].handle = bo->base.handle; + device->exec.exec[i].relocation_count = 0; + device->exec.exec[i].relocs_ptr = 0; + device->exec.exec[i].alignment = 0; + device->exec.exec[i].offset = 0; + device->exec.exec[i].flags = 0; + device->exec.exec[i].rsvd1 = 0; + device->exec.exec[i].rsvd2 = 0; + + device->exec.bo[i] = intel_bo_reference (bo); + bo->exec = &device->exec.exec[i]; + } + + if (cairo_list_is_empty (&bo->link)) + cairo_list_add_tail (&device->flush, &bo->link); + + assert (write_domain == 0 || bo->batch_write_domain == 0 || bo->batch_write_domain == write_domain); + bo->batch_read_domains |= read_domains; + bo->batch_write_domain |= write_domain; +} + +void +i965_emit_relocation (i965_device_t *device, + i965_stream_t *stream, + intel_bo_t *target, + uint32_t target_offset, + uint32_t read_domains, + uint32_t write_domain, + uint32_t offset) +{ + int n; + + assert (target_offset < target->base.size); + + i965_add_relocation (device, target, read_domains, write_domain); + + n = stream->num_relocations++; + assert (n < stream->max_relocations); + + stream->relocations[n].offset = offset; + stream->relocations[n].delta = target_offset; + stream->relocations[n].target_handle = target->base.handle; + stream->relocations[n].read_domains = read_domains; + stream->relocations[n].write_domain = write_domain; + stream->relocations[n].presumed_offset = target->offset; +} + +static void +i965_stream_reset (i965_stream_t *stream) +{ + stream->used = stream->committed = 0; + stream->num_relocations = 0; + stream->num_pending_relocations = 0; + if (++stream->serial == 0) + stream->serial = 1; +} + +void +i965_stream_commit (i965_device_t *device, + i965_stream_t *stream) +{ + intel_bo_t *bo; + int n; + + assert (stream->used); + + bo = intel_bo_create (&device->intel, + stream->used, stream->used, + FALSE, I915_TILING_NONE, 0); + + /* apply pending relocations */ + for (n = 0; n < stream->num_pending_relocations; n++) { + struct i965_pending_relocation *p = &stream->pending_relocations[n]; + + i965_emit_relocation (device, &device->batch, bo, + p->delta, + p->read_domains, + p->write_domain, + p->offset); + if (bo->offset) + *(uint32_t *) (device->batch.data + p->offset) = bo->offset + p->delta; + } + + intel_bo_write (&device->intel, bo, 0, stream->used, stream->data); + + if (stream->num_relocations) { + assert (bo->exec != NULL); + bo->exec->relocs_ptr = (uintptr_t) stream->relocations; + bo->exec->relocation_count = stream->num_relocations; + } + + intel_bo_destroy (&device->intel, bo); + + i965_stream_reset (stream); +} + +static void +sf_states_pluck (void *entry, void *closure) +{ + i965_device_t *device = closure; + + _cairo_hash_table_remove (device->sf_states, entry); + _cairo_freelist_free (&device->sf_freelist, entry); +} + +static void +cc_offsets_pluck (void *entry, void *closure) +{ + i965_device_t *device = closure; + + _cairo_hash_table_remove (device->cc_states, entry); + _cairo_freelist_free (&device->cc_freelist, entry); +} + +static void +wm_kernels_pluck (void *entry, void *closure) +{ + i965_device_t *device = closure; + + _cairo_hash_table_remove (device->wm_kernels, entry); + _cairo_freelist_free (&device->wm_kernel_freelist, entry); +} + +static void +wm_states_pluck (void *entry, void *closure) +{ + i965_device_t *device = closure; + + _cairo_hash_table_remove (device->wm_states, entry); + _cairo_freelist_free (&device->wm_state_freelist, entry); +} + +static void +wm_bindings_pluck (void *entry, void *closure) +{ + i965_device_t *device = closure; + + _cairo_hash_table_remove (device->wm_bindings, entry); + _cairo_freelist_free (&device->wm_binding_freelist, entry); +} + +static void +samplers_pluck (void *entry, void *closure) +{ + i965_device_t *device = closure; + + _cairo_hash_table_remove (device->samplers, entry); + _cairo_freelist_free (&device->sampler_freelist, entry); +} + +void +i965_general_state_reset (i965_device_t *device) +{ + _cairo_hash_table_foreach (device->sf_states, + sf_states_pluck, + device); + + _cairo_hash_table_foreach (device->cc_states, + cc_offsets_pluck, + device); + + _cairo_hash_table_foreach (device->wm_kernels, + wm_kernels_pluck, + device); + + _cairo_hash_table_foreach (device->wm_states, + wm_states_pluck, + device); + + _cairo_hash_table_foreach (device->wm_bindings, + wm_bindings_pluck, + device); + + _cairo_hash_table_foreach (device->samplers, + samplers_pluck, + device); + + device->vs_offset = (uint32_t) -1; + device->border_color_offset = (uint32_t) -1; + + if (device->general_state != NULL) { + intel_bo_destroy (&device->intel, device->general_state); + device->general_state = NULL; + } +} + +static void +i965_device_reset (i965_device_t *device) +{ + device->exec.count = 0; + device->exec.gtt_size = I965_VERTEX_SIZE + + I965_SURFACE_SIZE + + I965_GENERAL_SIZE + + I965_BATCH_SIZE; + + device->sf_state.entry.hash = (uint32_t) -1; + device->wm_state.entry.hash = (uint32_t) -1; + device->wm_binding.entry.hash = (uint32_t) -1; + device->cc_state.entry.hash = (uint32_t) -1; + + device->target = NULL; + device->source = NULL; + device->mask = NULL; + device->clip = NULL; + + device->draw_rectangle = (uint32_t) -1; + + device->vertex_type = (uint32_t) -1; + device->vertex_size = 0; + device->rectangle_size = 0; + device->last_vertex_size = 0; + + device->constants = NULL; + device->constants_size = 0; + + device->have_urb_fences = FALSE; +} + +static cairo_status_t +i965_exec (i965_device_t *device, uint32_t offset) +{ + struct drm_i915_gem_execbuffer2 execbuf; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + int ret, i; + + execbuf.buffers_ptr = (uintptr_t) device->exec.exec; + execbuf.buffer_count = device->exec.count; + execbuf.batch_start_offset = offset; + execbuf.batch_len = device->batch.used; + execbuf.DR1 = 0; + execbuf.DR4 = 0; + execbuf.num_cliprects = 0; + execbuf.cliprects_ptr = 0; + execbuf.flags = I915_GEM_3D_PIPELINE; + execbuf.rsvd1 = 0; + execbuf.rsvd2 = 0; + +#if 0 + printf ("exec: offset=%d, length=%d, buffers=%d\n", + offset, device->batch.used, device->exec.count); + intel_dump_batchbuffer ((uint32_t *) device->batch.data, + device->batch.used, + device->intel.base.chip_id); +#endif + + ret = 0; + do { + ret = ioctl (device->intel.base.fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); + } while (ret != 0 && errno == EINTR); + if (unlikely (ret)) { + if (errno == ENOMEM) + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + else + status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + fprintf (stderr, "Batch submission failed: %d\n", errno); + fprintf (stderr, " gtt size: %zd/%zd\n", + device->exec.gtt_size, device->intel.gtt_avail_size); + + fprintf (stderr, " %d buffers:\n", + device->exec.count); + for (i = 0; i < device->exec.count; i++) { + fprintf (stderr, " exec[%d] = %d\n", + i, device->exec.bo[i]->base.size); + } + + intel_dump_batchbuffer ((uint32_t *) device->batch.data, + device->batch.used, + device->intel.base.chip_id); + } + + /* XXX any write target within the batch should now be in error */ + for (i = 0; i < device->exec.count; i++) { + intel_bo_t *bo = device->exec.bo[i]; + cairo_bool_t ret; + + bo->offset = device->exec.exec[i].offset; + bo->exec = NULL; + bo->batch_read_domains = 0; + bo->batch_write_domain = 0; + + if (bo->virtual) + intel_bo_unmap (bo); + bo->cpu = FALSE; + + if (bo->purgeable) + ret = intel_bo_madvise (&device->intel, bo, I915_MADV_DONTNEED); + /* ignore immediate notification of purging */ + + cairo_list_del (&bo->cache_list); + cairo_list_init (&bo->link); + intel_bo_destroy (&device->intel, bo); + } + cairo_list_init (&device->flush); + + device->exec.count = 0; + + return status; +} + +static inline uint32_t +next_bo_size (uint32_t v) +{ + v = (v + 8191) / 8192; + + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + + return v * 8192; +} + +static void +_copy_to_bo_and_apply_relocations (i965_device_t *device, + intel_bo_t *bo, + i965_stream_t *stream, + uint32_t offset) +{ + int n; + + intel_bo_write (&device->intel, bo, + offset, stream->used, + stream->data); + + for (n = 0; n < stream->num_pending_relocations; n++) { + struct i965_pending_relocation *p = &stream->pending_relocations[n]; + + i965_emit_relocation (device, &device->batch, bo, + p->delta + offset, + p->read_domains, + p->write_domain, + p->offset); + + if (bo->offset) { + *(uint32_t *) (device->batch.data + p->offset) = + bo->offset + p->delta + offset; + } + } +} + +cairo_status_t +i965_device_flush (i965_device_t *device) +{ + cairo_status_t status; + uint32_t aligned, max; + intel_bo_t *bo; + int n; + + if (device->batch.used == 0) + return CAIRO_STATUS_SUCCESS; + + i965_flush_vertices (device); + + OUT_BATCH (MI_BATCH_BUFFER_END); + /* Emit a padding dword if we aren't going to be quad-word aligned. */ + if (device->batch.used & 4) + OUT_BATCH (MI_NOOP); + +#if 0 + printf ("device flush: vertex=%d, constant=%d, surface=%d, general=%d, batch=%d\n", + device->vertex.used, + device->constant.used, + device->surface.used, + device->general.used, + device->batch.used); +#endif + + /* can we pack the surface state into the tail of the general state? */ + if (device->general.used == device->general.committed) { + if (device->general.used) { + assert (device->general.num_pending_relocations == 1); + assert (device->general_state != NULL); + i965_emit_relocation (device, &device->batch, + device->general_state, + device->general.pending_relocations[0].delta, + device->general.pending_relocations[0].read_domains, + device->general.pending_relocations[0].write_domain, + device->general.pending_relocations[0].offset); + + if (device->general_state->offset) { + *(uint32_t *) (device->batch.data + + device->general.pending_relocations[0].offset) = + device->general_state->offset + + device->general.pending_relocations[0].delta; + } + } + } else { + assert (device->general.num_pending_relocations == 1); + if (device->general_state != NULL) { + intel_bo_destroy (&device->intel, device->general_state); + device->general_state = NULL; + } + + bo = intel_bo_create (&device->intel, + device->general.used, + device->general.used, + FALSE, I915_TILING_NONE, 0); + if (unlikely (bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + aligned = (device->general.used + 31) & -32; + if (device->surface.used && + aligned + device->surface.used <= bo->base.size) + { + _copy_to_bo_and_apply_relocations (device, bo, &device->general, 0); + _copy_to_bo_and_apply_relocations (device, bo, &device->surface, aligned); + + if (device->surface.num_relocations) { + for (n = 0; n < device->surface.num_relocations; n++) + device->surface.relocations[n].offset += aligned; + + assert (bo->exec != NULL); + bo->exec->relocs_ptr = (uintptr_t) device->surface.relocations; + bo->exec->relocation_count = device->surface.num_relocations; + } + + i965_stream_reset (&device->surface); + } + else + { + _copy_to_bo_and_apply_relocations (device, bo, &device->general, 0); + } + + /* Note we don't reset the general state, just mark what data we've committed. */ + device->general.committed = device->general.used; + device->general_state = bo; + } + device->general.num_pending_relocations = 0; + + /* Combine vertex+constant+surface+batch streams? */ + max = aligned = device->vertex.used; + if (device->surface.used) { + aligned = (aligned + 63) & -64; + aligned += device->surface.used; + if (device->surface.used > max) + max = device->surface.used; + } + aligned = (aligned + 63) & -64; + aligned += device->batch.used; + if (device->batch.used > max) + max = device->batch.used; + if (aligned <= next_bo_size (max)) { + int batch_num_relocations; + + if (aligned <= 8192) + max = aligned; + + bo = intel_bo_create (&device->intel, + max, max, + FALSE, I915_TILING_NONE, 0); + if (unlikely (bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + assert (aligned <= bo->base.size); + + if (device->vertex.used) + _copy_to_bo_and_apply_relocations (device, bo, &device->vertex, 0); + + aligned = device->vertex.used; + + batch_num_relocations = device->batch.num_relocations; + if (device->surface.used) { + aligned = (aligned + 63) & -64; + _copy_to_bo_and_apply_relocations (device, bo, &device->surface, aligned); + + batch_num_relocations = device->batch.num_relocations; + if (device->surface.num_relocations) { + assert (device->batch.num_relocations + device->surface.num_relocations < device->batch.max_relocations); + + memcpy (device->batch.relocations + device->batch.num_relocations, + device->surface.relocations, + sizeof (device->surface.relocations[0]) * device->surface.num_relocations); + + for (n = 0; n < device->surface.num_relocations; n++) + device->batch.relocations[device->batch.num_relocations + n].offset += aligned; + + device->batch.num_relocations += device->surface.num_relocations; + } + + aligned += device->surface.used; + } + + aligned = (aligned + 63) & -64; + intel_bo_write (&device->intel, bo, + aligned, device->batch.used, + device->batch.data); + + for (n = 0; n < batch_num_relocations; n++) + device->batch.relocations[n].offset += aligned; + + if (device->exec.bo[device->exec.count-1] == bo) { + assert (bo->exec == &device->exec.exec[device->exec.count-1]); + + bo->exec->relocation_count = device->batch.num_relocations; + bo->exec->relocs_ptr = (uintptr_t) device->batch.relocations; + intel_bo_destroy (&device->intel, bo); + } else { + assert (bo->exec == NULL); + + n = device->exec.count++; + device->exec.exec[n].handle = bo->base.handle; + device->exec.exec[n].relocation_count = device->batch.num_relocations; + device->exec.exec[n].relocs_ptr = (uintptr_t) device->batch.relocations; + device->exec.exec[n].alignment = 0; + device->exec.exec[n].offset = 0; + device->exec.exec[n].flags = 0; + device->exec.exec[n].rsvd1 = 0; + device->exec.exec[n].rsvd2 = 0; + + /* transfer ownership to the exec */ + device->exec.bo[n] = bo; + } + } else { + i965_stream_commit (device, &device->vertex); + if (device->surface.used) + i965_stream_commit (device, &device->surface); + + bo = intel_bo_create (&device->intel, + device->batch.used, device->batch.used, + FALSE, I915_TILING_NONE, 0); + if (unlikely (bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + intel_bo_write (&device->intel, bo, + 0, device->batch.used, + device->batch.data); + + n = device->exec.count++; + device->exec.exec[n].handle = bo->base.handle; + device->exec.exec[n].relocation_count = device->batch.num_relocations; + device->exec.exec[n].relocs_ptr = (uintptr_t) device->batch.relocations; + device->exec.exec[n].alignment = 0; + device->exec.exec[n].offset = 0; + device->exec.exec[n].flags = 0; + device->exec.exec[n].rsvd1 = 0; + device->exec.exec[n].rsvd2 = 0; + + /* transfer ownership to the exec */ + device->exec.bo[n] = bo; + aligned = 0; + } + + status = i965_exec (device, aligned); + + i965_stream_reset (&device->vertex); + i965_stream_reset (&device->surface); + i965_stream_reset (&device->batch); + + intel_glyph_cache_unpin (&device->intel); + intel_snapshot_cache_thaw (&device->intel); + + i965_device_reset (device); + + return status; +} + +static cairo_surface_t * +i965_surface_create_similar (void *abstract_other, + cairo_content_t content, + int width, int height) +{ + i965_surface_t *other; + cairo_format_t format; + + if (width > 8192 || height > 8192) + return NULL; + + other = abstract_other; + if (content == other->intel.drm.base.content) + format = other->intel.drm.format; + else + format = _cairo_format_from_content (content); + + return i965_surface_create_internal ((cairo_drm_device_t *) other->intel.drm.base.device, + format, + width, height, + I965_TILING_DEFAULT, TRUE); +} + +static cairo_status_t +i965_surface_finish (void *abstract_surface) +{ + i965_surface_t *surface = abstract_surface; + + return intel_surface_finish (&surface->intel); +} + +static cairo_status_t +i965_surface_flush (void *abstract_surface, unsigned flags) +{ + i965_surface_t *surface = abstract_surface; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (surface->intel.drm.fallback != NULL) + return intel_surface_flush (abstract_surface); + + /* Forgo flushing on finish as the user cannot access the surface directly. */ + if (! surface->intel.drm.base.finished && + to_intel_bo (surface->intel.drm.bo)->exec != NULL) + { + status = cairo_device_acquire (surface->intel.drm.base.device); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + i965_device_t *device; + + device = i965_device (surface); + status = i965_device_flush (device); + cairo_device_release (&device->intel.base.base); + } + } + + return status; +} + +/* rasterisation */ + +static cairo_status_t +_composite_boxes_spans (void *closure, + cairo_span_renderer_t *renderer, + const cairo_rectangle_int_t *extents) +{ + cairo_boxes_t *boxes = closure; + cairo_rectangular_scan_converter_t converter; + struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + + _cairo_rectangular_scan_converter_init (&converter, extents); + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + cairo_box_t *box = chunk->base; + int i; + + for (i = 0; i < chunk->count; i++) { + status = _cairo_rectangular_scan_converter_add_box (&converter, &box[i], 1); + if (unlikely (status)) + goto CLEANUP; + } + } + + status = converter.base.generate (&converter.base, renderer); + + CLEANUP: + converter.base.destroy (&converter.base); + return status; +} + +cairo_status_t +i965_fixup_unbounded (i965_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip) +{ + i965_shader_t shader; + i965_device_t *device; + cairo_status_t status; + + i965_shader_init (&shader, dst, CAIRO_OPERATOR_CLEAR); + + if (clip != NULL) { + cairo_region_t *clip_region = NULL; + + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || CAIRO_INT_STATUS_UNSUPPORTED); + assert (clip_region == NULL); + + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i965_shader_set_clip (&shader, clip); + } else { + if (extents->bounded.width == extents->unbounded.width && + extents->bounded.height == extents->unbounded.height) + { + return CAIRO_STATUS_SUCCESS; + } + } + + status = i965_shader_acquire_pattern (&shader, + &shader.source, + &_cairo_pattern_clear.base, + &extents->unbounded); + if (unlikely (status)) { + i965_shader_fini (&shader); + return status; + } + + device = i965_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + return status; + + status = i965_shader_commit (&shader, device); + if (unlikely (status)) { + goto BAIL; + } + + if (extents->bounded.width == 0 || extents->bounded.height == 0) { + i965_shader_add_rectangle (&shader, + extents->unbounded.x, + extents->unbounded.y, + extents->unbounded.width, + extents->unbounded.height); + } else { /* top */ + if (extents->bounded.y != extents->unbounded.y) { + cairo_rectangle_int_t rect; + + rect.x = extents->unbounded.x; + rect.y = extents->unbounded.y; + rect.width = extents->unbounded.width; + rect.height = extents->bounded.y - rect.y; + + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } + + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + cairo_rectangle_int_t rect; + + rect.x = extents->unbounded.x; + rect.y = extents->bounded.y; + rect.width = extents->bounded.x - extents->unbounded.x; + rect.height = extents->bounded.height; + + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } + + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + cairo_rectangle_int_t rect; + + rect.x = extents->bounded.x + extents->bounded.width; + rect.y = extents->bounded.y; + rect.width = extents->unbounded.x + extents->unbounded.width - rect.x; + rect.height = extents->bounded.height; + + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } + + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + cairo_rectangle_int_t rect; + + rect.x = extents->unbounded.x; + rect.y = extents->bounded.y + extents->bounded.height; + rect.width = extents->unbounded.width; + rect.height = extents->unbounded.y + extents->unbounded.height - rect.y; + + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } + } + + i965_shader_fini (&shader); + BAIL: + cairo_device_release (&device->intel.base.base); + return status; +} + +static cairo_status_t +i965_fixup_unbounded_boxes (i965_surface_t *dst, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip, + cairo_boxes_t *boxes) +{ + cairo_boxes_t clear; + cairo_box_t box; + cairo_region_t *clip_region = NULL; + cairo_status_t status; + struct _cairo_boxes_chunk *chunk; + i965_shader_t shader; + int i; + + if (boxes->num_boxes <= 1) + return i965_fixup_unbounded (dst, extents, clip); + + i965_shader_init (&shader, dst, CAIRO_OPERATOR_CLEAR); + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || CAIRO_INT_STATUS_UNSUPPORTED); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + i965_shader_set_clip (&shader, clip); + } + + status = i965_shader_acquire_pattern (&shader, + &shader.source, + &_cairo_pattern_clear.base, + &extents->unbounded); + if (unlikely (status)) { + i965_shader_fini (&shader); + return status; + } + + _cairo_boxes_init (&clear); + + box.p1.x = _cairo_fixed_from_int (extents->unbounded.x + extents->unbounded.width); + box.p1.y = _cairo_fixed_from_int (extents->unbounded.y); + box.p2.x = _cairo_fixed_from_int (extents->unbounded.x); + box.p2.y = _cairo_fixed_from_int (extents->unbounded.y + extents->unbounded.height); + + if (clip_region == NULL) { + cairo_boxes_t tmp; + + _cairo_boxes_init (&tmp); + + status = _cairo_boxes_add (&tmp, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + tmp.chunks.next = &boxes->chunks; + tmp.num_boxes += boxes->num_boxes; + + status = _cairo_bentley_ottmann_tessellate_boxes (&tmp, + CAIRO_FILL_RULE_WINDING, + &clear); + + tmp.chunks.next = NULL; + } else { + pixman_box32_t *pbox; + + pbox = pixman_region32_rectangles (&clip_region->rgn, &i); + _cairo_boxes_limit (&clear, (cairo_box_t *) pbox, i); + + status = _cairo_boxes_add (&clear, &box); + assert (status == CAIRO_STATUS_SUCCESS); + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + status = _cairo_boxes_add (&clear, &chunk->base[i]); + if (unlikely (status)) { + _cairo_boxes_fini (&clear); + return status; + } + } + } + + status = _cairo_bentley_ottmann_tessellate_boxes (&clear, + CAIRO_FILL_RULE_WINDING, + &clear); + } + + if (likely (status == CAIRO_STATUS_SUCCESS && clear.num_boxes)) { + i965_device_t *device; + + device = i965_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + status = i965_shader_commit (&shader, device); + if (unlikely (status)) + goto err_device; + + for (chunk = &clear.chunks; chunk != NULL; chunk = chunk->next) { + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_part (chunk->base[i].p1.x); + int y1 = _cairo_fixed_integer_part (chunk->base[i].p1.y); + int x2 = _cairo_fixed_integer_part (chunk->base[i].p2.x); + int y2 = _cairo_fixed_integer_part (chunk->base[i].p2.y); + + i965_shader_add_rectangle (&shader, x1, y1, x2 - x1, y2 - y1); + } + } + +err_device: + cairo_device_release (&device->intel.base.base); +err_shader: + i965_shader_fini (&shader); + } + + _cairo_boxes_fini (&clear); + + return status; +} + +static cairo_status_t +_composite_boxes (i965_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *pattern, + cairo_boxes_t *boxes, + cairo_antialias_t antialias, + cairo_clip_t *clip, + const cairo_composite_rectangles_t *extents) +{ + cairo_bool_t need_clip_surface = FALSE; + cairo_region_t *clip_region = NULL; + const struct _cairo_boxes_chunk *chunk; + cairo_status_t status; + i965_shader_t shader; + i965_device_t *device; + int i; + + /* If the boxes are not pixel-aligned, we will need to compute a real mask */ + if (antialias != CAIRO_ANTIALIAS_NONE) { + if (! boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + i965_shader_init (&shader, dst, op); + + status = i965_shader_acquire_pattern (&shader, + &shader.source, + pattern, + &extents->bounded); + if (unlikely (status)) + return status; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || CAIRO_INT_STATUS_UNSUPPORTED); + need_clip_surface = status == CAIRO_INT_STATUS_UNSUPPORTED; + if (need_clip_surface) + i965_shader_set_clip (&shader, clip); + } + + device = i965_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + status = i965_shader_commit (&shader, i965_device (dst)); + if (unlikely (status)) + goto err_device; + + for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { + cairo_box_t *box = chunk->base; + for (i = 0; i < chunk->count; i++) { + int x1 = _cairo_fixed_integer_round (box[i].p1.x); + int y1 = _cairo_fixed_integer_round (box[i].p1.y); + int x2 = _cairo_fixed_integer_round (box[i].p2.x); + int y2 = _cairo_fixed_integer_round (box[i].p2.y); + + if (x2 > x1 && y2 > y1) + i965_shader_add_rectangle (&shader, x1, y1, x2 - x1, y2 - y1); + } + } + + if (! extents->is_bounded) + status = i965_fixup_unbounded_boxes (dst, extents, clip, boxes); + + err_device: + cairo_device_release (&device->intel.base.base); + err_shader: + i965_shader_fini (&shader); + + return status; +} + +static cairo_status_t +_clip_and_composite_boxes (i965_surface_t *dst, + cairo_operator_t op, + const cairo_pattern_t *src, + cairo_boxes_t *boxes, + cairo_antialias_t antialias, + const cairo_composite_rectangles_t *extents, + cairo_clip_t *clip) +{ + cairo_status_t status; + + if (boxes->num_boxes == 0) { + if (extents->is_bounded) + return CAIRO_STATUS_SUCCESS; + + return i965_fixup_unbounded (dst, extents, clip); + } + + /* Use a fast path if the boxes are pixel aligned */ + status = _composite_boxes (dst, op, src, boxes, antialias, clip, extents); + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + return status; + + /* Otherwise render the boxes via an implicit mask and composite in the usual + * fashion. + */ + return i965_clip_and_composite_spans (dst, op, src, antialias, + _composite_boxes_spans, boxes, + extents, clip); +} + +static cairo_int_status_t +i965_surface_paint (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_clip_t *clip) +{ + i965_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + cairo_boxes_t boxes; + cairo_box_t *clip_boxes = boxes.boxes_embedded; + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + int num_boxes = ARRAY_LENGTH (boxes.boxes_embedded); + cairo_status_t status; + + /* XXX unsupported operators? use pixel shader blending, eventually */ + + status = _cairo_composite_rectangles_init_for_paint (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, + clip); + if (unlikely (status)) + return status; + + if (clip != NULL && _cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL) { + clip = _cairo_clip_init_copy (&local_clip, clip); + have_clip = TRUE; + } + + status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes); + if (unlikely (status)) { + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; + } + + _cairo_boxes_init_for_array (&boxes, clip_boxes, num_boxes); + status = _clip_and_composite_boxes (dst, op, source, + &boxes, CAIRO_ANTIALIAS_DEFAULT, + &extents, clip); + if (clip_boxes != boxes.boxes_embedded) + free (clip_boxes); + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static cairo_int_status_t +i965_surface_mask (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + cairo_clip_t *clip) +{ + i965_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + i965_shader_t shader; + i965_device_t *device; + cairo_clip_t local_clip; + cairo_region_t *clip_region = NULL; + cairo_bool_t need_clip_surface = FALSE; + cairo_bool_t have_clip = FALSE; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_mask (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, mask, clip); + if (unlikely (status)) + return status; + + if (clip != NULL && _cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL && extents.is_bounded) { + clip = _cairo_clip_init_copy (&local_clip, clip); + status = _cairo_clip_rectangle (clip, &extents.bounded); + if (unlikely (status)) { + _cairo_clip_fini (&local_clip); + return status; + } + + have_clip = TRUE; + } + + i965_shader_init (&shader, dst, op); + + status = i965_shader_acquire_pattern (&shader, + &shader.source, + source, + &extents.bounded); + if (unlikely (status)) + goto err_shader; + + status = i965_shader_acquire_pattern (&shader, + &shader.mask, + mask, + &extents.bounded); + if (unlikely (status)) + goto err_shader; + + if (clip != NULL) { + status = _cairo_clip_get_region (clip, &clip_region); + assert (status == CAIRO_STATUS_SUCCESS || CAIRO_INT_STATUS_UNSUPPORTED); + need_clip_surface = status == CAIRO_INT_STATUS_UNSUPPORTED; + if (need_clip_surface) + i965_shader_set_clip (&shader, clip); + } + + device = i965_device (dst); + status = cairo_device_acquire (&device->intel.base.base); + if (unlikely (status)) + goto err_shader; + + status = i965_shader_commit (&shader, device); + if (unlikely (status)) + goto err_device; + + if (clip_region != NULL) { + unsigned int n, num_rectangles; + + num_rectangles = cairo_region_num_rectangles (clip_region); + for (n = 0; n < num_rectangles; n++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (clip_region, n, &rect); + + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } + } else { + i965_shader_add_rectangle (&shader, + extents.bounded.x, + extents.bounded.y, + extents.bounded.width, + extents.bounded.height); + } + + if (! extents.is_bounded) + status = i965_fixup_unbounded (dst, &extents, clip); + + err_device: + cairo_device_release (&device->intel.base.base); + err_shader: + i965_shader_fini (&shader); + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +typedef struct { + cairo_polygon_t polygon; + cairo_fill_rule_t fill_rule; + cairo_antialias_t antialias; +} composite_polygon_info_t; + +static cairo_status_t +_composite_polygon_spans (void *closure, + cairo_span_renderer_t *renderer, + const cairo_rectangle_int_t *extents) +{ + composite_polygon_info_t *info = closure; + cairo_botor_scan_converter_t converter; + cairo_status_t status; + cairo_box_t box; + + box.p1.x = _cairo_fixed_from_int (extents->x); + box.p1.y = _cairo_fixed_from_int (extents->y); + box.p2.x = _cairo_fixed_from_int (extents->x + extents->width); + box.p2.y = _cairo_fixed_from_int (extents->y + extents->height); + + _cairo_botor_scan_converter_init (&converter, &box, info->fill_rule); + + status = converter.base.add_polygon (&converter.base, &info->polygon); + if (likely (status == CAIRO_STATUS_SUCCESS)) + status = converter.base.generate (&converter.base, renderer); + + converter.base.destroy (&converter.base); + + return status; +} + +static cairo_int_status_t +i965_surface_stroke (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + i965_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + composite_polygon_info_t info; + cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack; + int num_boxes = ARRAY_LENGTH (boxes_stack); + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_stroke (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, + path, stroke_style, ctm, + clip); + if (unlikely (status)) + return status; + + if (clip != NULL && _cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL) { + clip = _cairo_clip_init_copy (&local_clip, clip); + have_clip = TRUE; + } + + status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes); + if (unlikely (status)) { + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; + } + + if (_cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + _cairo_boxes_limit (&boxes, clip_boxes, num_boxes); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + stroke_style, + ctm, + &boxes); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _clip_and_composite_boxes (dst, op, source, + &boxes, antialias, + &extents, clip); + } + + _cairo_boxes_fini (&boxes); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto CLEANUP_BOXES; + } + + _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes); + + status = _cairo_path_fixed_stroke_to_polygon (path, + stroke_style, + ctm, ctm_inverse, + tolerance, + &info.polygon); + if (unlikely (status)) + goto CLEANUP_POLYGON; + + if (extents.is_bounded) { + cairo_rectangle_int_t rect; + + _cairo_box_round_to_rectangle (&info.polygon.extents, &rect); + if (! _cairo_rectangle_intersect (&extents.bounded, &rect)) + goto CLEANUP_POLYGON; + } + + if (info.polygon.num_edges == 0) { + if (! extents.is_bounded) + status = i965_fixup_unbounded (dst, &extents, clip); + } else { + info.fill_rule = CAIRO_FILL_RULE_WINDING; + info.antialias = antialias; + status = i965_clip_and_composite_spans (dst, op, source, antialias, + _composite_polygon_spans, &info, + &extents, clip); + } + +CLEANUP_POLYGON: + _cairo_polygon_fini (&info.polygon); + +CLEANUP_BOXES: + if (clip_boxes != boxes_stack) + free (clip_boxes); + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static cairo_int_status_t +i965_surface_fill (void *abstract_dst, + cairo_operator_t op, + const cairo_pattern_t*source, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + i965_surface_t *dst = abstract_dst; + cairo_composite_rectangles_t extents; + composite_polygon_info_t info; + cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack; + cairo_clip_t local_clip; + cairo_bool_t have_clip = FALSE; + int num_boxes = ARRAY_LENGTH (boxes_stack); + cairo_status_t status; + + status = _cairo_composite_rectangles_init_for_fill (&extents, + dst->intel.drm.width, + dst->intel.drm.height, + op, source, path, + clip); + if (unlikely (status)) + return status; + + if (clip != NULL && _cairo_clip_contains_extents (clip, &extents)) + clip = NULL; + + if (clip != NULL) { + clip = _cairo_clip_init_copy (&local_clip, clip); + have_clip = TRUE; + } + + status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes); + if (unlikely (status)) { + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; + } + + assert (! _cairo_path_fixed_fill_is_empty (path)); + + if (_cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + _cairo_boxes_init (&boxes); + _cairo_boxes_limit (&boxes, clip_boxes, num_boxes); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + &boxes); + if (likely (status == CAIRO_STATUS_SUCCESS)) { + status = _clip_and_composite_boxes (dst, op, source, + &boxes, antialias, + &extents, clip); + } + + _cairo_boxes_fini (&boxes); + + if (status != CAIRO_INT_STATUS_UNSUPPORTED) + goto CLEANUP_BOXES; + } + + _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes); + + status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &info.polygon); + if (unlikely (status)) + goto CLEANUP_POLYGON; + + if (extents.is_bounded) { + cairo_rectangle_int_t rect; + + _cairo_box_round_to_rectangle (&info.polygon.extents, &rect); + if (! _cairo_rectangle_intersect (&extents.bounded, &rect)) + goto CLEANUP_POLYGON; + } + + if (info.polygon.num_edges == 0) { + if (! extents.is_bounded) + status = i965_fixup_unbounded (dst, &extents, clip); + } else { + info.fill_rule = fill_rule; + info.antialias = antialias; + status = i965_clip_and_composite_spans (dst, op, source, antialias, + _composite_polygon_spans, &info, + &extents, clip); + } + +CLEANUP_POLYGON: + _cairo_polygon_fini (&info.polygon); + +CLEANUP_BOXES: + if (clip_boxes != boxes_stack) + free (clip_boxes); + + if (have_clip) + _cairo_clip_fini (&local_clip); + + return status; +} + +static const cairo_surface_backend_t i965_surface_backend = { + CAIRO_SURFACE_TYPE_DRM, + _cairo_default_context_create, + + i965_surface_create_similar, + i965_surface_finish, + + NULL, + intel_surface_acquire_source_image, + intel_surface_release_source_image, + + NULL, NULL, NULL, + NULL, /* composite */ + NULL, /* fill */ + NULL, /* trapezoids */ + NULL, /* span */ + NULL, /* check-span */ + + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_drm_surface_get_extents, + NULL, /* old-glyphs */ + _cairo_drm_surface_get_font_options, + + i965_surface_flush, + NULL, /* mark_dirty */ + intel_scaled_font_fini, + intel_scaled_glyph_fini, + + i965_surface_paint, + i965_surface_mask, + i965_surface_stroke, + i965_surface_fill, + i965_surface_glyphs, +}; + +static void +i965_surface_init (i965_surface_t *surface, + cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + intel_surface_init (&surface->intel, &i965_surface_backend, device, + format, width, height); + surface->stream = 0; +} + +static inline int cairo_const +i965_tiling_stride (uint32_t tiling, int stride) +{ + if (tiling == I915_TILING_NONE) + return stride; + + return (stride + 127) & -128; +} + +static inline int cairo_const +i965_tiling_height (uint32_t tiling, int height) +{ + switch (tiling) { + default: + case I915_TILING_NONE: return (height + 1) & -2; + case I915_TILING_X: return (height + 7) & -8; + case I915_TILING_Y: return (height + 31) & -32; + } +} + +cairo_surface_t * +i965_surface_create_internal (cairo_drm_device_t *base_dev, + cairo_format_t format, + int width, int height, + uint32_t tiling, + cairo_bool_t gpu_target) +{ + i965_surface_t *surface; + cairo_status_t status_ignored; + + surface = malloc (sizeof (i965_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + i965_surface_init (surface, base_dev, format, width, height); + + if (width && height) { + uint32_t size, stride; + intel_bo_t *bo; + + width = (width + 3) & -4; + stride = cairo_format_stride_for_width (surface->intel.drm.format, width); + stride = (stride + 63) & ~63; + stride = i965_tiling_stride (tiling, stride); + surface->intel.drm.stride = stride; + + height = i965_tiling_height (tiling, height); + assert (height <= I965_MAX_SIZE); + + size = stride * height; + bo = intel_bo_create (to_intel_device (&base_dev->base), + size, size, + gpu_target, tiling, stride); + if (bo == NULL) { + status_ignored = _cairo_drm_surface_finish (&surface->intel.drm); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + bo->tiling = tiling; + bo->stride = stride; + surface->intel.drm.bo = &bo->base; + + assert (bo->base.size >= (size_t) stride*height); + } + + return &surface->intel.drm.base; +} + +static cairo_surface_t * +i965_surface_create (cairo_drm_device_t *device, + cairo_format_t format, int width, int height) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_INVALID: + default: + case CAIRO_FORMAT_A1: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + return i965_surface_create_internal (device, format, width, height, + I965_TILING_DEFAULT, TRUE); +} + +static cairo_surface_t * +i965_surface_create_for_name (cairo_drm_device_t *base_dev, + unsigned int name, + cairo_format_t format, + int width, int height, int stride) +{ + i965_device_t *device; + i965_surface_t *surface; + cairo_status_t status_ignored; + int min_stride; + + min_stride = cairo_format_stride_for_width (format, (width + 3) & -4); + if (stride < min_stride || stride & 63) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + + if (format == CAIRO_FORMAT_A1) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + switch (format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + case CAIRO_FORMAT_INVALID: + default: + case CAIRO_FORMAT_A1: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + surface = malloc (sizeof (i965_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + i965_surface_init (surface, base_dev, format, width, height); + + device = (i965_device_t *) base_dev; + surface->intel.drm.bo = &intel_bo_create_for_name (&device->intel, name)->base; + if (unlikely (surface->intel.drm.bo == NULL)) { + status_ignored = _cairo_drm_surface_finish (&surface->intel.drm); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + surface->intel.drm.stride = stride; + + return &surface->intel.drm.base; +} + +static cairo_status_t +i965_surface_enable_scan_out (void *abstract_surface) +{ + i965_surface_t *surface = abstract_surface; + intel_bo_t *bo; + + if (unlikely (surface->intel.drm.bo == NULL)) + return _cairo_error (CAIRO_STATUS_INVALID_SIZE); + + bo = to_intel_bo (surface->intel.drm.bo); + if (bo->tiling != I915_TILING_X) { + i965_device_t *device = i965_device (surface); + cairo_surface_pattern_t pattern; + cairo_surface_t *clone; + cairo_status_t status; + + clone = i965_surface_create_internal (&device->intel.base, + surface->intel.drm.base.content, + surface->intel.drm.width, + surface->intel.drm.height, + I915_TILING_X, + TRUE); + if (unlikely (clone->status)) + return clone->status; + + /* 2D blit? */ + _cairo_pattern_init_for_surface (&pattern, &surface->intel.drm.base); + pattern.base.filter = CAIRO_FILTER_NEAREST; + + status = _cairo_surface_paint (clone, + CAIRO_OPERATOR_SOURCE, + &pattern.base, + NULL); + + _cairo_pattern_fini (&pattern.base); + + if (unlikely (status)) { + cairo_surface_destroy (clone); + return status; + } + + /* swap buffer objects */ + surface->intel.drm.bo = ((cairo_drm_surface_t *) clone)->bo; + ((cairo_drm_surface_t *) clone)->bo = &bo->base; + bo = to_intel_bo (surface->intel.drm.bo); + + cairo_surface_destroy (clone); + } + + if (unlikely (bo->tiling == I915_TILING_Y)) + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); /* XXX */ + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_i965_device_flush (cairo_drm_device_t *device) +{ + cairo_status_t status; + + if (unlikely (device->base.finished)) + return CAIRO_STATUS_SUCCESS; + + status = cairo_device_acquire (&device->base); + if (likely (status == CAIRO_STATUS_SUCCESS)) + status = i965_device_flush ((i965_device_t *) device); + + cairo_device_release (&device->base); + + return status; +} + +static cairo_int_status_t +_i965_device_throttle (cairo_drm_device_t *device) +{ + cairo_status_t status; + + status = cairo_device_acquire (&device->base); + if (unlikely (status)) + return status; + + status = i965_device_flush ((i965_device_t *) device); + intel_throttle ((intel_device_t *) device); + + cairo_device_release (&device->base); + + return status; +} + +static void +_i965_device_destroy (void *base) +{ + i965_device_t *device = base; + + i965_device_reset (device); + i965_general_state_reset (device); + + _cairo_hash_table_destroy (device->sf_states); + _cairo_hash_table_destroy (device->samplers); + _cairo_hash_table_destroy (device->cc_states); + _cairo_hash_table_destroy (device->wm_kernels); + _cairo_hash_table_destroy (device->wm_states); + _cairo_hash_table_destroy (device->wm_bindings); + + _cairo_freelist_fini (&device->sf_freelist); + _cairo_freelist_fini (&device->cc_freelist); + _cairo_freelist_fini (&device->wm_kernel_freelist); + _cairo_freelist_fini (&device->wm_state_freelist); + _cairo_freelist_fini (&device->wm_binding_freelist); + _cairo_freelist_fini (&device->sampler_freelist); + + intel_device_fini (&device->intel); + free (device); +} + +static cairo_bool_t +hash_equal (const void *A, const void *B) +{ + const cairo_hash_entry_t *a = A, *b = B; + return a->hash == b->hash; +} + +cairo_drm_device_t * +_cairo_drm_i965_device_create (int fd, dev_t dev, int vendor_id, int chip_id) +{ + i965_device_t *device; + uint64_t gtt_size; + cairo_status_t status; + + if (! intel_info (fd, >t_size)) + return NULL; + + device = malloc (sizeof (i965_device_t)); + if (unlikely (device == NULL)) + return (cairo_drm_device_t *) _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + + status = intel_device_init (&device->intel, fd); + if (unlikely (status)) + goto CLEANUP; + + device->is_g4x = IS_G4X (chip_id); + //device->is_g5x = IS_G5X (chip_id); + + device->intel.base.surface.create = i965_surface_create; + device->intel.base.surface.create_for_name = i965_surface_create_for_name; + device->intel.base.surface.create_from_cacheable_image = NULL; + device->intel.base.surface.enable_scan_out = i965_surface_enable_scan_out; + + device->intel.base.device.flush = _i965_device_flush; + device->intel.base.device.throttle = _i965_device_throttle; + device->intel.base.device.destroy = _i965_device_destroy; + + device->sf_states = _cairo_hash_table_create (i965_sf_state_equal); + if (unlikely (device->sf_states == NULL)) + goto CLEANUP_INTEL; + + _cairo_freelist_init (&device->sf_freelist, + sizeof (struct i965_sf_state)); + + + device->cc_states = _cairo_hash_table_create (i965_cc_state_equal); + if (unlikely (device->cc_states == NULL)) + goto CLEANUP_SF; + + _cairo_freelist_init (&device->cc_freelist, + sizeof (struct i965_cc_state)); + + + device->wm_kernels = _cairo_hash_table_create (hash_equal); + if (unlikely (device->wm_kernels == NULL)) + goto CLEANUP_CC; + + _cairo_freelist_init (&device->wm_kernel_freelist, + sizeof (struct i965_wm_kernel)); + + device->wm_states = _cairo_hash_table_create (i965_wm_state_equal); + if (unlikely (device->wm_states == NULL)) + goto CLEANUP_WM_KERNEL; + + _cairo_freelist_init (&device->wm_state_freelist, + sizeof (struct i965_wm_state)); + + + device->wm_bindings = _cairo_hash_table_create (i965_wm_binding_equal); + if (unlikely (device->wm_bindings == NULL)) + goto CLEANUP_WM_STATE; + + _cairo_freelist_init (&device->wm_binding_freelist, + sizeof (struct i965_wm_binding)); + + device->samplers = _cairo_hash_table_create (hash_equal); + if (unlikely (device->samplers == NULL)) + goto CLEANUP_WM_BINDING; + + _cairo_freelist_init (&device->sampler_freelist, + sizeof (struct i965_sampler)); + + i965_stream_init (&device->batch, + device->batch_base, sizeof (device->batch_base), + NULL, 0, + device->batch_relocations, + ARRAY_LENGTH (device->batch_relocations)); + + i965_stream_init (&device->surface, + device->surface_base, sizeof (device->surface_base), + device->surface_pending_relocations, + ARRAY_LENGTH (device->surface_pending_relocations), + device->surface_relocations, + ARRAY_LENGTH (device->surface_relocations)); + + i965_stream_init (&device->general, + device->general_base, sizeof (device->general_base), + device->general_pending_relocations, + ARRAY_LENGTH (device->general_pending_relocations), + NULL, 0); + + i965_stream_init (&device->vertex, + device->vertex_base, sizeof (device->vertex_base), + device->vertex_pending_relocations, + ARRAY_LENGTH (device->vertex_pending_relocations), + NULL, 0); + + cairo_list_init (&device->flush); + i965_device_reset (device); + device->vs_offset = (uint32_t) -1; + device->border_color_offset = (uint32_t) -1; + device->general_state = NULL; + + return _cairo_drm_device_init (&device->intel.base, + fd, dev, vendor_id, chip_id, + I965_MAX_SIZE); + + CLEANUP_WM_BINDING: + _cairo_hash_table_destroy (device->wm_bindings); + CLEANUP_WM_STATE: + _cairo_hash_table_destroy (device->wm_states); + CLEANUP_WM_KERNEL: + _cairo_hash_table_destroy (device->wm_kernels); + CLEANUP_CC: + _cairo_hash_table_destroy (device->cc_states); + CLEANUP_SF: + _cairo_hash_table_destroy (device->sf_states); + CLEANUP_INTEL: + intel_device_fini (&device->intel); + CLEANUP: + free (device); + return (cairo_drm_device_t *) _cairo_device_create_in_error (status); +} diff --git a/src/drm/cairo-drm-intel-brw-defines.h b/src/drm/cairo-drm-intel-brw-defines.h new file mode 100644 index 000000000..b2be36f18 --- /dev/null +++ b/src/drm/cairo-drm-intel-brw-defines.h @@ -0,0 +1,824 @@ +/************************************************************************** + * + * Copyright 2005 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef CAIRO_DRM_INTEL_BRW_DEFINES_H +#define CAIRO_DRM_INTEL_BRW_DEFINES_H + +/* 3D state: */ +#define _3DOP_3DSTATE_PIPELINED 0x0 +#define _3DOP_3DSTATE_NONPIPELINED 0x1 +#define _3DOP_3DCONTROL 0x2 +#define _3DOP_3DPRIMITIVE 0x3 + +#define _3DSTATE_PIPELINED_POINTERS 0x00 +#define _3DSTATE_BINDING_TABLE_POINTERS 0x01 +#define _3DSTATE_VERTEX_BUFFERS 0x08 +#define _3DSTATE_VERTEX_ELEMENTS 0x09 +#define _3DSTATE_INDEX_BUFFER 0x0A +#define _3DSTATE_VF_STATISTICS 0x0B +#define _3DSTATE_DRAWING_RECTANGLE 0x00 +#define _3DSTATE_CONSTANT_COLOR 0x01 +#define _3DSTATE_SAMPLER_PALETTE_LOAD 0x02 +#define _3DSTATE_CHROMA_KEY 0x04 +#define _3DSTATE_DEPTH_BUFFER 0x05 +#define _3DSTATE_POLY_STIPPLE_OFFSET 0x06 +#define _3DSTATE_POLY_STIPPLE_PATTERN 0x07 +#define _3DSTATE_LINE_STIPPLE 0x08 +#define _3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP 0x09 +#define _3DCONTROL 0x00 +#define _3DPRIMITIVE 0x00 + +#define PIPE_CONTROL_NOWRITE 0x00 +#define PIPE_CONTROL_WRITEIMMEDIATE 0x01 +#define PIPE_CONTROL_WRITEDEPTH 0x02 +#define PIPE_CONTROL_WRITETIMESTAMP 0x03 + +#define PIPE_CONTROL_GTTWRITE_PROCESS_LOCAL 0x00 +#define PIPE_CONTROL_GTTWRITE_GLOBAL 0x01 + +#define BRW_3D(Pipeline,Opcode,Subopcode) ((3 << 29) | \ + ((Pipeline) << 27) | \ + ((Opcode) << 24) | \ + ((Subopcode) << 16)) + +#define BRW_PIPE_CONTROL BRW_3D(3, 2, 0) +#define BRW_PIPE_CONTROL_NOWRITE (0 << 14) +#define BRW_PIPE_CONTROL_WRITE_QWORD (1 << 14) +#define BRW_PIPE_CONTROL_WRITE_DEPTH (2 << 14) +#define BRW_PIPE_CONTROL_WRITE_TIME (3 << 14) +#define BRW_PIPE_CONTROL_DEPTH_STALL (1 << 13) +#define BRW_PIPE_CONTROL_WC_FLUSH (1 << 12) +#define BRW_PIPE_CONTROL_IS_FLUSH (1 << 11) +#define BRW_PIPE_CONTROL_NOTIFY_ENABLE (1 << 8) +#define BRW_PIPE_CONTROL_GLOBAL_GTT (1 << 2) +#define BRW_PIPE_CONTROL_LOCAL_PGTT (0 << 2) + +#define _3DPRIM_POINTLIST 0x01 +#define _3DPRIM_LINELIST 0x02 +#define _3DPRIM_LINESTRIP 0x03 +#define _3DPRIM_TRILIST 0x04 +#define _3DPRIM_TRISTRIP 0x05 +#define _3DPRIM_TRIFAN 0x06 +#define _3DPRIM_QUADLIST 0x07 +#define _3DPRIM_QUADSTRIP 0x08 +#define _3DPRIM_LINELIST_ADJ 0x09 +#define _3DPRIM_LINESTRIP_ADJ 0x0A +#define _3DPRIM_TRILIST_ADJ 0x0B +#define _3DPRIM_TRISTRIP_ADJ 0x0C +#define _3DPRIM_TRISTRIP_REVERSE 0x0D +#define _3DPRIM_POLYGON 0x0E +#define _3DPRIM_RECTLIST 0x0F +#define _3DPRIM_LINELOOP 0x10 +#define _3DPRIM_POINTLIST_BF 0x11 +#define _3DPRIM_LINESTRIP_CONT 0x12 +#define _3DPRIM_LINESTRIP_BF 0x13 +#define _3DPRIM_LINESTRIP_CONT_BF 0x14 +#define _3DPRIM_TRIFAN_NOSTIPPLE 0x15 + +#define _3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL 0 +#define _3DPRIM_VERTEXBUFFER_ACCESS_RANDOM 1 + +#define BRW_ANISORATIO_2 0 +#define BRW_ANISORATIO_4 1 +#define BRW_ANISORATIO_6 2 +#define BRW_ANISORATIO_8 3 +#define BRW_ANISORATIO_10 4 +#define BRW_ANISORATIO_12 5 +#define BRW_ANISORATIO_14 6 +#define BRW_ANISORATIO_16 7 + +#define BRW_BLENDFACTOR_ONE 0x1 +#define BRW_BLENDFACTOR_SRC_COLOR 0x2 +#define BRW_BLENDFACTOR_SRC_ALPHA 0x3 +#define BRW_BLENDFACTOR_DST_ALPHA 0x4 +#define BRW_BLENDFACTOR_DST_COLOR 0x5 +#define BRW_BLENDFACTOR_SRC_ALPHA_SATURATE 0x6 +#define BRW_BLENDFACTOR_CONST_COLOR 0x7 +#define BRW_BLENDFACTOR_CONST_ALPHA 0x8 +#define BRW_BLENDFACTOR_SRC1_COLOR 0x9 +#define BRW_BLENDFACTOR_SRC1_ALPHA 0x0A +#define BRW_BLENDFACTOR_ZERO 0x11 +#define BRW_BLENDFACTOR_INV_SRC_COLOR 0x12 +#define BRW_BLENDFACTOR_INV_SRC_ALPHA 0x13 +#define BRW_BLENDFACTOR_INV_DST_ALPHA 0x14 +#define BRW_BLENDFACTOR_INV_DST_COLOR 0x15 +#define BRW_BLENDFACTOR_INV_CONST_COLOR 0x17 +#define BRW_BLENDFACTOR_INV_CONST_ALPHA 0x18 +#define BRW_BLENDFACTOR_INV_SRC1_COLOR 0x19 +#define BRW_BLENDFACTOR_INV_SRC1_ALPHA 0x1A + +#define BRW_BLENDFUNCTION_ADD 0 +#define BRW_BLENDFUNCTION_SUBTRACT 1 +#define BRW_BLENDFUNCTION_REVERSE_SUBTRACT 2 +#define BRW_BLENDFUNCTION_MIN 3 +#define BRW_BLENDFUNCTION_MAX 4 + +#define BRW_ALPHATEST_FORMAT_UNORM8 0 +#define BRW_ALPHATEST_FORMAT_FLOAT32 1 + +#define BRW_CHROMAKEY_KILL_ON_ANY_MATCH 0 +#define BRW_CHROMAKEY_REPLACE_BLACK 1 + +#define BRW_CLIP_API_OGL 0 +#define BRW_CLIP_API_DX 1 + +#define BRW_CLIPMODE_NORMAL 0 +#define BRW_CLIPMODE_CLIP_ALL 1 +#define BRW_CLIPMODE_CLIP_NON_REJECTED 2 +#define BRW_CLIPMODE_REJECT_ALL 3 +#define BRW_CLIPMODE_ACCEPT_ALL 4 + +#define BRW_CLIP_NDCSPACE 0 +#define BRW_CLIP_SCREENSPACE 1 + +#define BRW_COMPAREFUNCTION_ALWAYS 0 +#define BRW_COMPAREFUNCTION_NEVER 1 +#define BRW_COMPAREFUNCTION_LESS 2 +#define BRW_COMPAREFUNCTION_EQUAL 3 +#define BRW_COMPAREFUNCTION_LEQUAL 4 +#define BRW_COMPAREFUNCTION_GREATER 5 +#define BRW_COMPAREFUNCTION_NOTEQUAL 6 +#define BRW_COMPAREFUNCTION_GEQUAL 7 + +#define BRW_COVERAGE_PIXELS_HALF 0 +#define BRW_COVERAGE_PIXELS_1 1 +#define BRW_COVERAGE_PIXELS_2 2 +#define BRW_COVERAGE_PIXELS_4 3 + +#define BRW_CULLMODE_BOTH 0 +#define BRW_CULLMODE_NONE 1 +#define BRW_CULLMODE_FRONT 2 +#define BRW_CULLMODE_BACK 3 + +#define BRW_DEFAULTCOLOR_R8G8B8A8_UNORM 0 +#define BRW_DEFAULTCOLOR_R32G32B32A32_FLOAT 1 + +#define BRW_DEPTHFORMAT_D32_FLOAT_S8X24_UINT 0 +#define BRW_DEPTHFORMAT_D32_FLOAT 1 +#define BRW_DEPTHFORMAT_D24_UNORM_S8_UINT 2 +#define BRW_DEPTHFORMAT_D16_UNORM 5 + +#define BRW_FLOATING_POINT_IEEE_754 0 +#define BRW_FLOATING_POINT_NON_IEEE_754 1 + +#define BRW_FRONTWINDING_CW 0 +#define BRW_FRONTWINDING_CCW 1 + +#define BRW_INDEX_BYTE 0 +#define BRW_INDEX_WORD 1 +#define BRW_INDEX_DWORD 2 + +#define BRW_LOGICOPFUNCTION_CLEAR 0 +#define BRW_LOGICOPFUNCTION_NOR 1 +#define BRW_LOGICOPFUNCTION_AND_INVERTED 2 +#define BRW_LOGICOPFUNCTION_COPY_INVERTED 3 +#define BRW_LOGICOPFUNCTION_AND_REVERSE 4 +#define BRW_LOGICOPFUNCTION_INVERT 5 +#define BRW_LOGICOPFUNCTION_XOR 6 +#define BRW_LOGICOPFUNCTION_NAND 7 +#define BRW_LOGICOPFUNCTION_AND 8 +#define BRW_LOGICOPFUNCTION_EQUIV 9 +#define BRW_LOGICOPFUNCTION_NOOP 10 +#define BRW_LOGICOPFUNCTION_OR_INVERTED 11 +#define BRW_LOGICOPFUNCTION_COPY 12 +#define BRW_LOGICOPFUNCTION_OR_REVERSE 13 +#define BRW_LOGICOPFUNCTION_OR 14 +#define BRW_LOGICOPFUNCTION_SET 15 + +#define BRW_MAPFILTER_NEAREST 0x0 +#define BRW_MAPFILTER_LINEAR 0x1 +#define BRW_MAPFILTER_ANISOTROPIC 0x2 + +#define BRW_MIPFILTER_NONE 0 +#define BRW_MIPFILTER_NEAREST 1 +#define BRW_MIPFILTER_LINEAR 3 + +#define BRW_POLYGON_FRONT_FACING 0 +#define BRW_POLYGON_BACK_FACING 1 + +#define BRW_PREFILTER_ALWAYS 0x0 +#define BRW_PREFILTER_NEVER 0x1 +#define BRW_PREFILTER_LESS 0x2 +#define BRW_PREFILTER_EQUAL 0x3 +#define BRW_PREFILTER_LEQUAL 0x4 +#define BRW_PREFILTER_GREATER 0x5 +#define BRW_PREFILTER_NOTEQUAL 0x6 +#define BRW_PREFILTER_GEQUAL 0x7 + +#define BRW_PROVOKING_VERTEX_0 0 +#define BRW_PROVOKING_VERTEX_1 1 +#define BRW_PROVOKING_VERTEX_2 2 + +#define BRW_RASTRULE_UPPER_LEFT 0 +#define BRW_RASTRULE_UPPER_RIGHT 1 + +#define BRW_RENDERTARGET_CLAMPRANGE_UNORM 0 +#define BRW_RENDERTARGET_CLAMPRANGE_SNORM 1 +#define BRW_RENDERTARGET_CLAMPRANGE_FORMAT 2 + +#define BRW_STENCILOP_KEEP 0 +#define BRW_STENCILOP_ZERO 1 +#define BRW_STENCILOP_REPLACE 2 +#define BRW_STENCILOP_INCRSAT 3 +#define BRW_STENCILOP_DECRSAT 4 +#define BRW_STENCILOP_INCR 5 +#define BRW_STENCILOP_DECR 6 +#define BRW_STENCILOP_INVERT 7 + +#define BRW_SURFACE_MIPMAPLAYOUT_BELOW 0 +#define BRW_SURFACE_MIPMAPLAYOUT_RIGHT 1 + +#define BRW_SURFACEFORMAT_R32G32B32A32_FLOAT 0x000 +#define BRW_SURFACEFORMAT_R32G32B32A32_SINT 0x001 +#define BRW_SURFACEFORMAT_R32G32B32A32_UINT 0x002 +#define BRW_SURFACEFORMAT_R32G32B32A32_UNORM 0x003 +#define BRW_SURFACEFORMAT_R32G32B32A32_SNORM 0x004 +#define BRW_SURFACEFORMAT_R64G64_FLOAT 0x005 +#define BRW_SURFACEFORMAT_R32G32B32X32_FLOAT 0x006 +#define BRW_SURFACEFORMAT_R32G32B32A32_SSCALED 0x007 +#define BRW_SURFACEFORMAT_R32G32B32A32_USCALED 0x008 +#define BRW_SURFACEFORMAT_R32G32B32_FLOAT 0x040 +#define BRW_SURFACEFORMAT_R32G32B32_SINT 0x041 +#define BRW_SURFACEFORMAT_R32G32B32_UINT 0x042 +#define BRW_SURFACEFORMAT_R32G32B32_UNORM 0x043 +#define BRW_SURFACEFORMAT_R32G32B32_SNORM 0x044 +#define BRW_SURFACEFORMAT_R32G32B32_SSCALED 0x045 +#define BRW_SURFACEFORMAT_R32G32B32_USCALED 0x046 +#define BRW_SURFACEFORMAT_R16G16B16A16_UNORM 0x080 +#define BRW_SURFACEFORMAT_R16G16B16A16_SNORM 0x081 +#define BRW_SURFACEFORMAT_R16G16B16A16_SINT 0x082 +#define BRW_SURFACEFORMAT_R16G16B16A16_UINT 0x083 +#define BRW_SURFACEFORMAT_R16G16B16A16_FLOAT 0x084 +#define BRW_SURFACEFORMAT_R32G32_FLOAT 0x085 +#define BRW_SURFACEFORMAT_R32G32_SINT 0x086 +#define BRW_SURFACEFORMAT_R32G32_UINT 0x087 +#define BRW_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS 0x088 +#define BRW_SURFACEFORMAT_X32_TYPELESS_G8X24_UINT 0x089 +#define BRW_SURFACEFORMAT_L32A32_FLOAT 0x08A +#define BRW_SURFACEFORMAT_R32G32_UNORM 0x08B +#define BRW_SURFACEFORMAT_R32G32_SNORM 0x08C +#define BRW_SURFACEFORMAT_R64_FLOAT 0x08D +#define BRW_SURFACEFORMAT_R16G16B16X16_UNORM 0x08E +#define BRW_SURFACEFORMAT_R16G16B16X16_FLOAT 0x08F +#define BRW_SURFACEFORMAT_A32X32_FLOAT 0x090 +#define BRW_SURFACEFORMAT_L32X32_FLOAT 0x091 +#define BRW_SURFACEFORMAT_I32X32_FLOAT 0x092 +#define BRW_SURFACEFORMAT_R16G16B16A16_SSCALED 0x093 +#define BRW_SURFACEFORMAT_R16G16B16A16_USCALED 0x094 +#define BRW_SURFACEFORMAT_R32G32_SSCALED 0x095 +#define BRW_SURFACEFORMAT_R32G32_USCALED 0x096 +#define BRW_SURFACEFORMAT_B8G8R8A8_UNORM 0x0C0 +#define BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB 0x0C1 +#define BRW_SURFACEFORMAT_R10G10B10A2_UNORM 0x0C2 +#define BRW_SURFACEFORMAT_R10G10B10A2_UNORM_SRGB 0x0C3 +#define BRW_SURFACEFORMAT_R10G10B10A2_UINT 0x0C4 +#define BRW_SURFACEFORMAT_R10G10B10_SNORM_A2_UNORM 0x0C5 +#define BRW_SURFACEFORMAT_R8G8B8A8_UNORM 0x0C7 +#define BRW_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB 0x0C8 +#define BRW_SURFACEFORMAT_R8G8B8A8_SNORM 0x0C9 +#define BRW_SURFACEFORMAT_R8G8B8A8_SINT 0x0CA +#define BRW_SURFACEFORMAT_R8G8B8A8_UINT 0x0CB +#define BRW_SURFACEFORMAT_R16G16_UNORM 0x0CC +#define BRW_SURFACEFORMAT_R16G16_SNORM 0x0CD +#define BRW_SURFACEFORMAT_R16G16_SINT 0x0CE +#define BRW_SURFACEFORMAT_R16G16_UINT 0x0CF +#define BRW_SURFACEFORMAT_R16G16_FLOAT 0x0D0 +#define BRW_SURFACEFORMAT_B10G10R10A2_UNORM 0x0D1 +#define BRW_SURFACEFORMAT_B10G10R10A2_UNORM_SRGB 0x0D2 +#define BRW_SURFACEFORMAT_R11G11B10_FLOAT 0x0D3 +#define BRW_SURFACEFORMAT_R32_SINT 0x0D6 +#define BRW_SURFACEFORMAT_R32_UINT 0x0D7 +#define BRW_SURFACEFORMAT_R32_FLOAT 0x0D8 +#define BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS 0x0D9 +#define BRW_SURFACEFORMAT_X24_TYPELESS_G8_UINT 0x0DA +#define BRW_SURFACEFORMAT_L16A16_UNORM 0x0DF +#define BRW_SURFACEFORMAT_I24X8_UNORM 0x0E0 +#define BRW_SURFACEFORMAT_L24X8_UNORM 0x0E1 +#define BRW_SURFACEFORMAT_A24X8_UNORM 0x0E2 +#define BRW_SURFACEFORMAT_I32_FLOAT 0x0E3 +#define BRW_SURFACEFORMAT_L32_FLOAT 0x0E4 +#define BRW_SURFACEFORMAT_A32_FLOAT 0x0E5 +#define BRW_SURFACEFORMAT_B8G8R8X8_UNORM 0x0E9 +#define BRW_SURFACEFORMAT_B8G8R8X8_UNORM_SRGB 0x0EA +#define BRW_SURFACEFORMAT_R8G8B8X8_UNORM 0x0EB +#define BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB 0x0EC +#define BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP 0x0ED +#define BRW_SURFACEFORMAT_B10G10R10X2_UNORM 0x0EE +#define BRW_SURFACEFORMAT_L16A16_FLOAT 0x0F0 +#define BRW_SURFACEFORMAT_R32_UNORM 0x0F1 +#define BRW_SURFACEFORMAT_R32_SNORM 0x0F2 +#define BRW_SURFACEFORMAT_R10G10B10X2_USCALED 0x0F3 +#define BRW_SURFACEFORMAT_R8G8B8A8_SSCALED 0x0F4 +#define BRW_SURFACEFORMAT_R8G8B8A8_USCALED 0x0F5 +#define BRW_SURFACEFORMAT_R16G16_SSCALED 0x0F6 +#define BRW_SURFACEFORMAT_R16G16_USCALED 0x0F7 +#define BRW_SURFACEFORMAT_R32_SSCALED 0x0F8 +#define BRW_SURFACEFORMAT_R32_USCALED 0x0F9 +#define BRW_SURFACEFORMAT_B5G6R5_UNORM 0x100 +#define BRW_SURFACEFORMAT_B5G6R5_UNORM_SRGB 0x101 +#define BRW_SURFACEFORMAT_B5G5R5A1_UNORM 0x102 +#define BRW_SURFACEFORMAT_B5G5R5A1_UNORM_SRGB 0x103 +#define BRW_SURFACEFORMAT_B4G4R4A4_UNORM 0x104 +#define BRW_SURFACEFORMAT_B4G4R4A4_UNORM_SRGB 0x105 +#define BRW_SURFACEFORMAT_R8G8_UNORM 0x106 +#define BRW_SURFACEFORMAT_R8G8_SNORM 0x107 +#define BRW_SURFACEFORMAT_R8G8_SINT 0x108 +#define BRW_SURFACEFORMAT_R8G8_UINT 0x109 +#define BRW_SURFACEFORMAT_R16_UNORM 0x10A +#define BRW_SURFACEFORMAT_R16_SNORM 0x10B +#define BRW_SURFACEFORMAT_R16_SINT 0x10C +#define BRW_SURFACEFORMAT_R16_UINT 0x10D +#define BRW_SURFACEFORMAT_R16_FLOAT 0x10E +#define BRW_SURFACEFORMAT_I16_UNORM 0x111 +#define BRW_SURFACEFORMAT_L16_UNORM 0x112 +#define BRW_SURFACEFORMAT_A16_UNORM 0x113 +#define BRW_SURFACEFORMAT_L8A8_UNORM 0x114 +#define BRW_SURFACEFORMAT_I16_FLOAT 0x115 +#define BRW_SURFACEFORMAT_L16_FLOAT 0x116 +#define BRW_SURFACEFORMAT_A16_FLOAT 0x117 +#define BRW_SURFACEFORMAT_R5G5_SNORM_B6_UNORM 0x119 +#define BRW_SURFACEFORMAT_B5G5R5X1_UNORM 0x11A +#define BRW_SURFACEFORMAT_B5G5R5X1_UNORM_SRGB 0x11B +#define BRW_SURFACEFORMAT_R8G8_SSCALED 0x11C +#define BRW_SURFACEFORMAT_R8G8_USCALED 0x11D +#define BRW_SURFACEFORMAT_R16_SSCALED 0x11E +#define BRW_SURFACEFORMAT_R16_USCALED 0x11F +#define BRW_SURFACEFORMAT_R8_UNORM 0x140 +#define BRW_SURFACEFORMAT_R8_SNORM 0x141 +#define BRW_SURFACEFORMAT_R8_SINT 0x142 +#define BRW_SURFACEFORMAT_R8_UINT 0x143 +#define BRW_SURFACEFORMAT_A8_UNORM 0x144 +#define BRW_SURFACEFORMAT_I8_UNORM 0x145 +#define BRW_SURFACEFORMAT_L8_UNORM 0x146 +#define BRW_SURFACEFORMAT_P4A4_UNORM 0x147 +#define BRW_SURFACEFORMAT_A4P4_UNORM 0x148 +#define BRW_SURFACEFORMAT_R8_SSCALED 0x149 +#define BRW_SURFACEFORMAT_R8_USCALED 0x14A +#define BRW_SURFACEFORMAT_R1_UINT 0x181 +#define BRW_SURFACEFORMAT_YCRCB_NORMAL 0x182 +#define BRW_SURFACEFORMAT_YCRCB_SWAPUVY 0x183 +#define BRW_SURFACEFORMAT_BC1_UNORM 0x186 +#define BRW_SURFACEFORMAT_BC2_UNORM 0x187 +#define BRW_SURFACEFORMAT_BC3_UNORM 0x188 +#define BRW_SURFACEFORMAT_BC4_UNORM 0x189 +#define BRW_SURFACEFORMAT_BC5_UNORM 0x18A +#define BRW_SURFACEFORMAT_BC1_UNORM_SRGB 0x18B +#define BRW_SURFACEFORMAT_BC2_UNORM_SRGB 0x18C +#define BRW_SURFACEFORMAT_BC3_UNORM_SRGB 0x18D +#define BRW_SURFACEFORMAT_MONO8 0x18E +#define BRW_SURFACEFORMAT_YCRCB_SWAPUV 0x18F +#define BRW_SURFACEFORMAT_YCRCB_SWAPY 0x190 +#define BRW_SURFACEFORMAT_DXT1_RGB 0x191 +#define BRW_SURFACEFORMAT_FXT1 0x192 +#define BRW_SURFACEFORMAT_R8G8B8_UNORM 0x193 +#define BRW_SURFACEFORMAT_R8G8B8_SNORM 0x194 +#define BRW_SURFACEFORMAT_R8G8B8_SSCALED 0x195 +#define BRW_SURFACEFORMAT_R8G8B8_USCALED 0x196 +#define BRW_SURFACEFORMAT_R64G64B64A64_FLOAT 0x197 +#define BRW_SURFACEFORMAT_R64G64B64_FLOAT 0x198 +#define BRW_SURFACEFORMAT_BC4_SNORM 0x199 +#define BRW_SURFACEFORMAT_BC5_SNORM 0x19A +#define BRW_SURFACEFORMAT_R16G16B16_UNORM 0x19C +#define BRW_SURFACEFORMAT_R16G16B16_SNORM 0x19D +#define BRW_SURFACEFORMAT_R16G16B16_SSCALED 0x19E +#define BRW_SURFACEFORMAT_R16G16B16_USCALED 0x19F + +#define BRW_SURFACERETURNFORMAT_FLOAT32 0 +#define BRW_SURFACERETURNFORMAT_S1 1 + +#define BRW_SURFACE_1D 0 +#define BRW_SURFACE_2D 1 +#define BRW_SURFACE_3D 2 +#define BRW_SURFACE_CUBE 3 +#define BRW_SURFACE_BUFFER 4 +#define BRW_SURFACE_NULL 7 + +#define BRW_BORDER_COLOR_MODE_DEFAULT 0 +#define BRW_BORDER_COLOR_MODE_LEGACY 1 + +#define BRW_TEXCOORDMODE_WRAP 0 +#define BRW_TEXCOORDMODE_MIRROR 1 +#define BRW_TEXCOORDMODE_CLAMP 2 +#define BRW_TEXCOORDMODE_CUBE 3 +#define BRW_TEXCOORDMODE_CLAMP_BORDER 4 +#define BRW_TEXCOORDMODE_MIRROR_ONCE 5 + +#define BRW_THREAD_PRIORITY_NORMAL 0 +#define BRW_THREAD_PRIORITY_HIGH 1 + +#define BRW_TILEWALK_XMAJOR 0 +#define BRW_TILEWALK_YMAJOR 1 + +#define BRW_VERTEX_SUBPIXEL_PRECISION_8BITS 0 +#define BRW_VERTEX_SUBPIXEL_PRECISION_4BITS 1 + +#define BRW_VERTEXBUFFER_ACCESS_VERTEXDATA 0 +#define BRW_VERTEXBUFFER_ACCESS_INSTANCEDATA 1 + +#define BRW_VFCOMPONENT_NOSTORE 0 +#define BRW_VFCOMPONENT_STORE_SRC 1 +#define BRW_VFCOMPONENT_STORE_0 2 +#define BRW_VFCOMPONENT_STORE_1_FLT 3 +#define BRW_VFCOMPONENT_STORE_1_INT 4 +#define BRW_VFCOMPONENT_STORE_VID 5 +#define BRW_VFCOMPONENT_STORE_IID 6 +#define BRW_VFCOMPONENT_STORE_PID 7 + + + +/* Execution Unit (EU) defines */ + +#define BRW_ALIGN_1 0 +#define BRW_ALIGN_16 1 + +#define BRW_ADDRESS_DIRECT 0 +#define BRW_ADDRESS_REGISTER_INDIRECT_REGISTER 1 + +#define BRW_CHANNEL_X 0 +#define BRW_CHANNEL_Y 1 +#define BRW_CHANNEL_Z 2 +#define BRW_CHANNEL_W 3 + +#define BRW_COMPRESSION_NONE 0 +#define BRW_COMPRESSION_2NDHALF 1 +#define BRW_COMPRESSION_COMPRESSED 2 + +#define BRW_CONDITIONAL_NONE 0 +#define BRW_CONDITIONAL_Z 1 +#define BRW_CONDITIONAL_NZ 2 +#define BRW_CONDITIONAL_EQ 1 /* Z */ +#define BRW_CONDITIONAL_NEQ 2 /* NZ */ +#define BRW_CONDITIONAL_G 3 +#define BRW_CONDITIONAL_GE 4 +#define BRW_CONDITIONAL_L 5 +#define BRW_CONDITIONAL_LE 6 +#define BRW_CONDITIONAL_C 7 +#define BRW_CONDITIONAL_O 8 + +#define BRW_DEBUG_NONE 0 +#define BRW_DEBUG_BREAKPOINT 1 + +#define BRW_DEPENDENCY_NORMAL 0 +#define BRW_DEPENDENCY_NOTCLEARED 1 +#define BRW_DEPENDENCY_NOTCHECKED 2 +#define BRW_DEPENDENCY_DISABLE 3 + +#define BRW_EXECUTE_1 0 +#define BRW_EXECUTE_2 1 +#define BRW_EXECUTE_4 2 +#define BRW_EXECUTE_8 3 +#define BRW_EXECUTE_16 4 +#define BRW_EXECUTE_32 5 + +#define BRW_HORIZONTAL_STRIDE_0 0 +#define BRW_HORIZONTAL_STRIDE_1 1 +#define BRW_HORIZONTAL_STRIDE_2 2 +#define BRW_HORIZONTAL_STRIDE_4 3 + +#define BRW_INSTRUCTION_NORMAL 0 +#define BRW_INSTRUCTION_SATURATE 1 + +#define BRW_MASK_ENABLE 0 +#define BRW_MASK_DISABLE 1 + +#define BRW_OPCODE_MOV 1 +#define BRW_OPCODE_SEL 2 +#define BRW_OPCODE_NOT 4 +#define BRW_OPCODE_AND 5 +#define BRW_OPCODE_OR 6 +#define BRW_OPCODE_XOR 7 +#define BRW_OPCODE_SHR 8 +#define BRW_OPCODE_SHL 9 +#define BRW_OPCODE_RSR 10 +#define BRW_OPCODE_RSL 11 +#define BRW_OPCODE_ASR 12 +#define BRW_OPCODE_CMP 16 +#define BRW_OPCODE_JMPI 32 +#define BRW_OPCODE_IF 34 +#define BRW_OPCODE_IFF 35 +#define BRW_OPCODE_ELSE 36 +#define BRW_OPCODE_ENDIF 37 +#define BRW_OPCODE_DO 38 +#define BRW_OPCODE_WHILE 39 +#define BRW_OPCODE_BREAK 40 +#define BRW_OPCODE_CONTINUE 41 +#define BRW_OPCODE_HALT 42 +#define BRW_OPCODE_MSAVE 44 +#define BRW_OPCODE_MRESTORE 45 +#define BRW_OPCODE_PUSH 46 +#define BRW_OPCODE_POP 47 +#define BRW_OPCODE_WAIT 48 +#define BRW_OPCODE_SEND 49 +#define BRW_OPCODE_ADD 64 +#define BRW_OPCODE_MUL 65 +#define BRW_OPCODE_AVG 66 +#define BRW_OPCODE_FRC 67 +#define BRW_OPCODE_RNDU 68 +#define BRW_OPCODE_RNDD 69 +#define BRW_OPCODE_RNDE 70 +#define BRW_OPCODE_RNDZ 71 +#define BRW_OPCODE_MAC 72 +#define BRW_OPCODE_MACH 73 +#define BRW_OPCODE_LZD 74 +#define BRW_OPCODE_SAD2 80 +#define BRW_OPCODE_SADA2 81 +#define BRW_OPCODE_DP4 84 +#define BRW_OPCODE_DPH 85 +#define BRW_OPCODE_DP3 86 +#define BRW_OPCODE_DP2 87 +#define BRW_OPCODE_DPA2 88 +#define BRW_OPCODE_LINE 89 +#define BRW_OPCODE_NOP 126 + +#define BRW_PREDICATE_NONE 0 +#define BRW_PREDICATE_NORMAL 1 +#define BRW_PREDICATE_ALIGN1_ANYV 2 +#define BRW_PREDICATE_ALIGN1_ALLV 3 +#define BRW_PREDICATE_ALIGN1_ANY2H 4 +#define BRW_PREDICATE_ALIGN1_ALL2H 5 +#define BRW_PREDICATE_ALIGN1_ANY4H 6 +#define BRW_PREDICATE_ALIGN1_ALL4H 7 +#define BRW_PREDICATE_ALIGN1_ANY8H 8 +#define BRW_PREDICATE_ALIGN1_ALL8H 9 +#define BRW_PREDICATE_ALIGN1_ANY16H 10 +#define BRW_PREDICATE_ALIGN1_ALL16H 11 +#define BRW_PREDICATE_ALIGN16_REPLICATE_X 2 +#define BRW_PREDICATE_ALIGN16_REPLICATE_Y 3 +#define BRW_PREDICATE_ALIGN16_REPLICATE_Z 4 +#define BRW_PREDICATE_ALIGN16_REPLICATE_W 5 +#define BRW_PREDICATE_ALIGN16_ANY4H 6 +#define BRW_PREDICATE_ALIGN16_ALL4H 7 + +#define BRW_ARCHITECTURE_REGISTER_FILE 0 +#define BRW_GENERAL_REGISTER_FILE 1 +#define BRW_MESSAGE_REGISTER_FILE 2 +#define BRW_IMMEDIATE_VALUE 3 + +#define BRW_REGISTER_TYPE_UD 0 +#define BRW_REGISTER_TYPE_D 1 +#define BRW_REGISTER_TYPE_UW 2 +#define BRW_REGISTER_TYPE_W 3 +#define BRW_REGISTER_TYPE_UB 4 +#define BRW_REGISTER_TYPE_B 5 +#define BRW_REGISTER_TYPE_VF 5 /* packed float vector, immediates only? */ +#define BRW_REGISTER_TYPE_HF 6 +#define BRW_REGISTER_TYPE_V 6 /* packed int vector, immediates only, uword dest only */ +#define BRW_REGISTER_TYPE_F 7 + +#define BRW_ARF_NULL 0x00 +#define BRW_ARF_ADDRESS 0x10 +#define BRW_ARF_ACCUMULATOR 0x20 +#define BRW_ARF_FLAG 0x30 +#define BRW_ARF_MASK 0x40 +#define BRW_ARF_MASK_STACK 0x50 +#define BRW_ARF_MASK_STACK_DEPTH 0x60 +#define BRW_ARF_STATE 0x70 +#define BRW_ARF_CONTROL 0x80 +#define BRW_ARF_NOTIFICATION_COUNT 0x90 +#define BRW_ARF_IP 0xA0 + +#define BRW_AMASK 0 +#define BRW_IMASK 1 +#define BRW_LMASK 2 +#define BRW_CMASK 3 + + + +#define BRW_THREAD_NORMAL 0 +#define BRW_THREAD_ATOMIC 1 +#define BRW_THREAD_SWITCH 2 + +#define BRW_VERTICAL_STRIDE_0 0 +#define BRW_VERTICAL_STRIDE_1 1 +#define BRW_VERTICAL_STRIDE_2 2 +#define BRW_VERTICAL_STRIDE_4 3 +#define BRW_VERTICAL_STRIDE_8 4 +#define BRW_VERTICAL_STRIDE_16 5 +#define BRW_VERTICAL_STRIDE_32 6 +#define BRW_VERTICAL_STRIDE_64 7 +#define BRW_VERTICAL_STRIDE_128 8 +#define BRW_VERTICAL_STRIDE_256 9 +#define BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL 0xF + +#define BRW_WIDTH_1 0 +#define BRW_WIDTH_2 1 +#define BRW_WIDTH_4 2 +#define BRW_WIDTH_8 3 +#define BRW_WIDTH_16 4 + +#define BRW_STATELESS_BUFFER_BOUNDARY_1K 0 +#define BRW_STATELESS_BUFFER_BOUNDARY_2K 1 +#define BRW_STATELESS_BUFFER_BOUNDARY_4K 2 +#define BRW_STATELESS_BUFFER_BOUNDARY_8K 3 +#define BRW_STATELESS_BUFFER_BOUNDARY_16K 4 +#define BRW_STATELESS_BUFFER_BOUNDARY_32K 5 +#define BRW_STATELESS_BUFFER_BOUNDARY_64K 6 +#define BRW_STATELESS_BUFFER_BOUNDARY_128K 7 +#define BRW_STATELESS_BUFFER_BOUNDARY_256K 8 +#define BRW_STATELESS_BUFFER_BOUNDARY_512K 9 +#define BRW_STATELESS_BUFFER_BOUNDARY_1M 10 +#define BRW_STATELESS_BUFFER_BOUNDARY_2M 11 + +#define BRW_POLYGON_FACING_FRONT 0 +#define BRW_POLYGON_FACING_BACK 1 + +#define BRW_MESSAGE_TARGET_NULL 0 +#define BRW_MESSAGE_TARGET_MATH 1 +#define BRW_MESSAGE_TARGET_SAMPLER 2 +#define BRW_MESSAGE_TARGET_GATEWAY 3 +#define BRW_MESSAGE_TARGET_DATAPORT_READ 4 +#define BRW_MESSAGE_TARGET_DATAPORT_WRITE 5 +#define BRW_MESSAGE_TARGET_URB 6 +#define BRW_MESSAGE_TARGET_THREAD_SPAWNER 7 + +#define BRW_SAMPLER_RETURN_FORMAT_FLOAT32 0 +#define BRW_SAMPLER_RETURN_FORMAT_UINT32 2 +#define BRW_SAMPLER_RETURN_FORMAT_SINT32 3 + +#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE 0 +#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE 0 +#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS 0 +#define BRW_SAMPLER_MESSAGE_SIMD8_KILLPIX 1 +#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_LOD 1 +#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_LOD 1 +#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_GRADIENTS 2 +#define BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE_GRADIENTS 2 +#define BRW_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_COMPARE 0 +#define BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_COMPARE 2 +#define BRW_SAMPLER_MESSAGE_SIMD4X2_RESINFO 2 +#define BRW_SAMPLER_MESSAGE_SIMD8_RESINFO 2 +#define BRW_SAMPLER_MESSAGE_SIMD16_RESINFO 2 +#define BRW_SAMPLER_MESSAGE_SIMD4X2_LD 3 +#define BRW_SAMPLER_MESSAGE_SIMD8_LD 3 +#define BRW_SAMPLER_MESSAGE_SIMD16_LD 3 + +#define BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW 0 +#define BRW_DATAPORT_OWORD_BLOCK_1_OWORDHIGH 1 +#define BRW_DATAPORT_OWORD_BLOCK_2_OWORDS 2 +#define BRW_DATAPORT_OWORD_BLOCK_4_OWORDS 3 +#define BRW_DATAPORT_OWORD_BLOCK_8_OWORDS 4 + +#define BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD 0 +#define BRW_DATAPORT_OWORD_DUAL_BLOCK_4OWORDS 2 + +#define BRW_DATAPORT_DWORD_SCATTERED_BLOCK_8DWORDS 2 +#define BRW_DATAPORT_DWORD_SCATTERED_BLOCK_16DWORDS 3 + +#define BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ 0 +#define BRW_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ 1 +#define BRW_DATAPORT_READ_MESSAGE_DWORD_BLOCK_READ 2 +#define BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ 3 + +#define BRW_DATAPORT_READ_TARGET_DATA_CACHE 0 +#define BRW_DATAPORT_READ_TARGET_RENDER_CACHE 1 +#define BRW_DATAPORT_READ_TARGET_SAMPLER_CACHE 2 + +#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE 0 +#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED 1 +#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN01 2 +#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN23 3 +#define BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_SINGLE_SOURCE_SUBSPAN01 4 + +#define BRW_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE 0 +#define BRW_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE 1 +#define BRW_DATAPORT_WRITE_MESSAGE_DWORD_BLOCK_WRITE 2 +#define BRW_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE 3 +#define BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE 4 +#define BRW_DATAPORT_WRITE_MESSAGE_STREAMED_VERTEX_BUFFER_WRITE 5 +#define BRW_DATAPORT_WRITE_MESSAGE_FLUSH_RENDER_CACHE 7 + +#define BRW_MATH_FUNCTION_INV 1 +#define BRW_MATH_FUNCTION_LOG 2 +#define BRW_MATH_FUNCTION_EXP 3 +#define BRW_MATH_FUNCTION_SQRT 4 +#define BRW_MATH_FUNCTION_RSQ 5 +#define BRW_MATH_FUNCTION_SIN 6 /* was 7 */ +#define BRW_MATH_FUNCTION_COS 7 /* was 8 */ +#define BRW_MATH_FUNCTION_SINCOS 8 /* was 6 */ +#define BRW_MATH_FUNCTION_TAN 9 +#define BRW_MATH_FUNCTION_POW 10 +#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER 11 +#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT 12 +#define BRW_MATH_FUNCTION_INT_DIV_REMAINDER 13 + +#define BRW_MATH_INTEGER_UNSIGNED 0 +#define BRW_MATH_INTEGER_SIGNED 1 + +#define BRW_MATH_PRECISION_FULL 0 +#define BRW_MATH_PRECISION_PARTIAL 1 + +#define BRW_MATH_SATURATE_NONE 0 +#define BRW_MATH_SATURATE_SATURATE 1 + +#define BRW_MATH_DATA_VECTOR 0 +#define BRW_MATH_DATA_SCALAR 1 + +#define BRW_URB_OPCODE_WRITE 0 + +#define BRW_URB_SWIZZLE_NONE 0 +#define BRW_URB_SWIZZLE_INTERLEAVE 1 +#define BRW_URB_SWIZZLE_TRANSPOSE 2 + +#define BRW_SCRATCH_SPACE_SIZE_1K 0 +#define BRW_SCRATCH_SPACE_SIZE_2K 1 +#define BRW_SCRATCH_SPACE_SIZE_4K 2 +#define BRW_SCRATCH_SPACE_SIZE_8K 3 +#define BRW_SCRATCH_SPACE_SIZE_16K 4 +#define BRW_SCRATCH_SPACE_SIZE_32K 5 +#define BRW_SCRATCH_SPACE_SIZE_64K 6 +#define BRW_SCRATCH_SPACE_SIZE_128K 7 +#define BRW_SCRATCH_SPACE_SIZE_256K 8 +#define BRW_SCRATCH_SPACE_SIZE_512K 9 +#define BRW_SCRATCH_SPACE_SIZE_1M 10 +#define BRW_SCRATCH_SPACE_SIZE_2M 11 + + + + +#define CMD_URB_FENCE 0x6000 +#define CMD_CONST_BUFFER_STATE 0x6001 +#define CMD_CONST_BUFFER 0x6002 + +#define CMD_STATE_BASE_ADDRESS 0x6101 +#define CMD_STATE_INSN_POINTER 0x6102 +#define CMD_PIPELINE_SELECT 0x6104 + +#define CMD_PIPELINED_STATE_POINTERS 0x7800 +#define CMD_BINDING_TABLE_PTRS 0x7801 +#define CMD_VERTEX_BUFFER 0x7808 +#define CMD_VERTEX_ELEMENT 0x7809 +#define CMD_INDEX_BUFFER 0x780a +#define CMD_VF_STATISTICS 0x780b + +#define CMD_DRAW_RECT 0x7900 +#define CMD_BLEND_CONSTANT_COLOR 0x7901 +#define CMD_CHROMA_KEY 0x7904 +#define CMD_DEPTH_BUFFER 0x7905 +#define CMD_POLY_STIPPLE_OFFSET 0x7906 +#define CMD_POLY_STIPPLE_PATTERN 0x7907 +#define CMD_LINE_STIPPLE_PATTERN 0x7908 +#define CMD_GLOBAL_DEPTH_OFFSET_CLAMP 0x7908 + +#define CMD_PIPE_CONTROL 0x7a00 + +#define CMD_3D_PRIM 0x7b00 + +#define CMD_MI_FLUSH 0x0200 + + +/* Various values from the R0 vertex header: + */ +#define R02_PRIM_END 0x1 +#define R02_PRIM_START 0x2 + +/* media pipeline */ + +#define BRW_VFE_MODE_GENERIC 0x0 +#define BRW_VFE_MODE_VLD_MPEG2 0x1 +#define BRW_VFE_MODE_IS 0x2 +#define BRW_VFE_MODE_AVC_MC 0x4 +#define BRW_VFE_MODE_AVC_IT 0x7 +#define BRW_VFE_MODE_VC1_IT 0xB + +#define BRW_VFE_DEBUG_COUNTER_FREE 0 +#define BRW_VFE_DEBUG_COUNTER_FROZEN 1 +#define BRW_VFE_DEBUG_COUNTER_ONCE 2 +#define BRW_VFE_DEBUG_COUNTER_ALWAYS 3 + +/* VLD_STATE */ +#define BRW_MPEG_TOP_FIELD 1 +#define BRW_MPEG_BOTTOM_FIELD 2 +#define BRW_MPEG_FRAME 3 +#define BRW_MPEG_QSCALE_LINEAR 0 +#define BRW_MPEG_QSCALE_NONLINEAR 1 +#define BRW_MPEG_ZIGZAG_SCAN 0 +#define BRW_MPEG_ALTER_VERTICAL_SCAN 1 +#define BRW_MPEG_I_PICTURE 1 +#define BRW_MPEG_P_PICTURE 2 +#define BRW_MPEG_B_PICTURE 3 + +#endif diff --git a/src/drm/cairo-drm-intel-brw-eu-emit.c b/src/drm/cairo-drm-intel-brw-eu-emit.c new file mode 100644 index 000000000..f27b23804 --- /dev/null +++ b/src/drm/cairo-drm-intel-brw-eu-emit.c @@ -0,0 +1,1089 @@ +/* + Copyright (C) Intel Corp. 2006. All Rights Reserved. + Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to + develop this 3D driver. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + **********************************************************************/ +/* + * Authors: + * Keith Whitwell + */ + +#include "cairoint.h" +#include "cairo-drm-intel-brw-eu.h" + +#include + +/*********************************************************************** + * Internal helper for constructing instructions + */ + +static void guess_execution_size( struct brw_instruction *insn, + struct brw_reg reg ) +{ + if (reg.width == BRW_WIDTH_8 && + insn->header.compression_control == BRW_COMPRESSION_COMPRESSED) + insn->header.execution_size = BRW_EXECUTE_16; + else + insn->header.execution_size = reg.width; /* note - definitions are compatible */ +} + + +void +brw_instruction_set_destination (struct brw_instruction *insn, + struct brw_reg dest) +{ + insn->bits1.da1.dest_reg_file = dest.file; + insn->bits1.da1.dest_reg_type = dest.type; + insn->bits1.da1.dest_address_mode = dest.address_mode; + + if (dest.address_mode == BRW_ADDRESS_DIRECT) { + insn->bits1.da1.dest_reg_nr = dest.nr; + + if (insn->header.access_mode == BRW_ALIGN_1) { + insn->bits1.da1.dest_subreg_nr = dest.subnr; + if (dest.hstride == BRW_HORIZONTAL_STRIDE_0) + dest.hstride = BRW_HORIZONTAL_STRIDE_1; + insn->bits1.da1.dest_horiz_stride = dest.hstride; + } else { + insn->bits1.da16.dest_subreg_nr = dest.subnr / 16; + insn->bits1.da16.dest_writemask = dest.dw1.bits.writemask; + } + } else { + insn->bits1.ia1.dest_subreg_nr = dest.subnr; + + /* These are different sizes in align1 vs align16: + */ + if (insn->header.access_mode == BRW_ALIGN_1) { + insn->bits1.ia1.dest_indirect_offset = dest.dw1.bits.indirect_offset; + if (dest.hstride == BRW_HORIZONTAL_STRIDE_0) + dest.hstride = BRW_HORIZONTAL_STRIDE_1; + insn->bits1.ia1.dest_horiz_stride = dest.hstride; + } else { + insn->bits1.ia16.dest_indirect_offset = dest.dw1.bits.indirect_offset; + } + } + + /* NEW: Set the execution size based on dest.width and + * insn->compression_control: + */ + guess_execution_size(insn, dest); +} + +void +brw_instruction_set_source0 (struct brw_instruction *insn, + struct brw_reg reg) +{ + assert(reg.file != BRW_MESSAGE_REGISTER_FILE); + + insn->bits1.da1.src0_reg_file = reg.file; + insn->bits1.da1.src0_reg_type = reg.type; + insn->bits2.da1.src0_abs = reg.abs; + insn->bits2.da1.src0_negate = reg.negate; + insn->bits2.da1.src0_address_mode = reg.address_mode; + + if (reg.file == BRW_IMMEDIATE_VALUE) { + insn->bits3.ud = reg.dw1.ud; + + /* Required to set some fields in src1 as well: + */ + insn->bits1.da1.src1_reg_file = 0; /* arf */ + insn->bits1.da1.src1_reg_type = reg.type; + } else { + if (reg.address_mode == BRW_ADDRESS_DIRECT) { + if (insn->header.access_mode == BRW_ALIGN_1) { + insn->bits2.da1.src0_subreg_nr = reg.subnr; + insn->bits2.da1.src0_reg_nr = reg.nr; + } else { + insn->bits2.da16.src0_subreg_nr = reg.subnr / 16; + insn->bits2.da16.src0_reg_nr = reg.nr; + } + } else { + insn->bits2.ia1.src0_subreg_nr = reg.subnr; + + if (insn->header.access_mode == BRW_ALIGN_1) { + insn->bits2.ia1.src0_indirect_offset = reg.dw1.bits.indirect_offset; + } else { + insn->bits2.ia16.src0_subreg_nr = reg.dw1.bits.indirect_offset; + } + } + + if (insn->header.access_mode == BRW_ALIGN_1) { + if (reg.width == BRW_WIDTH_1 && + insn->header.execution_size == BRW_EXECUTE_1) { + insn->bits2.da1.src0_horiz_stride = BRW_HORIZONTAL_STRIDE_0; + insn->bits2.da1.src0_width = BRW_WIDTH_1; + insn->bits2.da1.src0_vert_stride = BRW_VERTICAL_STRIDE_0; + } else { + insn->bits2.da1.src0_horiz_stride = reg.hstride; + insn->bits2.da1.src0_width = reg.width; + insn->bits2.da1.src0_vert_stride = reg.vstride; + } + } else { + insn->bits2.da16.src0_swz_x = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_X); + insn->bits2.da16.src0_swz_y = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Y); + insn->bits2.da16.src0_swz_z = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Z); + insn->bits2.da16.src0_swz_w = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_W); + + /* This is an oddity of the fact we're using the same + * descriptions for registers in align_16 as align_1: + */ + if (reg.vstride == BRW_VERTICAL_STRIDE_8) + insn->bits2.da16.src0_vert_stride = BRW_VERTICAL_STRIDE_4; + else + insn->bits2.da16.src0_vert_stride = reg.vstride; + } + } +} + + +void brw_set_src1( struct brw_instruction *insn, + struct brw_reg reg ) +{ + assert(reg.file != BRW_MESSAGE_REGISTER_FILE); + + insn->bits1.da1.src1_reg_file = reg.file; + insn->bits1.da1.src1_reg_type = reg.type; + insn->bits3.da1.src1_abs = reg.abs; + insn->bits3.da1.src1_negate = reg.negate; + + /* Only src1 can be immediate in two-argument instructions. + */ + assert(insn->bits1.da1.src0_reg_file != BRW_IMMEDIATE_VALUE); + + if (reg.file == BRW_IMMEDIATE_VALUE) { + insn->bits3.ud = reg.dw1.ud; + } + else { + /* This is a hardware restriction, which may or may not be lifted + * in the future: + */ + assert (reg.address_mode == BRW_ADDRESS_DIRECT); + //assert (reg.file == BRW_GENERAL_REGISTER_FILE); + + if (insn->header.access_mode == BRW_ALIGN_1) { + insn->bits3.da1.src1_subreg_nr = reg.subnr; + insn->bits3.da1.src1_reg_nr = reg.nr; + } + else { + insn->bits3.da16.src1_subreg_nr = reg.subnr / 16; + insn->bits3.da16.src1_reg_nr = reg.nr; + } + + if (insn->header.access_mode == BRW_ALIGN_1) { + if (reg.width == BRW_WIDTH_1 && + insn->header.execution_size == BRW_EXECUTE_1) { + insn->bits3.da1.src1_horiz_stride = BRW_HORIZONTAL_STRIDE_0; + insn->bits3.da1.src1_width = BRW_WIDTH_1; + insn->bits3.da1.src1_vert_stride = BRW_VERTICAL_STRIDE_0; + } + else { + insn->bits3.da1.src1_horiz_stride = reg.hstride; + insn->bits3.da1.src1_width = reg.width; + insn->bits3.da1.src1_vert_stride = reg.vstride; + } + } + else { + insn->bits3.da16.src1_swz_x = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_X); + insn->bits3.da16.src1_swz_y = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Y); + insn->bits3.da16.src1_swz_z = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Z); + insn->bits3.da16.src1_swz_w = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_W); + + /* This is an oddity of the fact we're using the same + * descriptions for registers in align_16 as align_1: + */ + if (reg.vstride == BRW_VERTICAL_STRIDE_8) + insn->bits3.da16.src1_vert_stride = BRW_VERTICAL_STRIDE_4; + else + insn->bits3.da16.src1_vert_stride = reg.vstride; + } + } +} + + + +static void brw_set_math_message( struct brw_instruction *insn, + uint32_t msg_length, + uint32_t response_length, + uint32_t function, + uint32_t integer_type, + int low_precision, + int saturate, + uint32_t dataType ) +{ + brw_set_src1 (insn, brw_imm_d (0)); + + insn->bits3.math.function = function; + insn->bits3.math.int_type = integer_type; + insn->bits3.math.precision = low_precision; + insn->bits3.math.saturate = saturate; + insn->bits3.math.data_type = dataType; + insn->bits3.math.response_length = response_length; + insn->bits3.math.msg_length = msg_length; + insn->bits3.math.msg_target = BRW_MESSAGE_TARGET_MATH; + insn->bits3.math.end_of_thread = 0; +} + +static void brw_set_urb_message( struct brw_instruction *insn, + int allocate, + int used, + uint32_t msg_length, + uint32_t response_length, + int end_of_thread, + int complete, + uint32_t offset, + uint32_t swizzle_control ) +{ + brw_set_src1 (insn, brw_imm_d (0)); + + insn->bits3.urb.opcode = 0; /* ? */ + insn->bits3.urb.offset = offset; + insn->bits3.urb.swizzle_control = swizzle_control; + insn->bits3.urb.allocate = allocate; + insn->bits3.urb.used = used; /* ? */ + insn->bits3.urb.complete = complete; + insn->bits3.urb.response_length = response_length; + insn->bits3.urb.msg_length = msg_length; + insn->bits3.urb.msg_target = BRW_MESSAGE_TARGET_URB; + insn->bits3.urb.end_of_thread = end_of_thread; +} + +void +brw_instruction_set_dp_write_message (struct brw_instruction *insn, + uint32_t binding_table_index, + uint32_t msg_control, + uint32_t msg_type, + uint32_t msg_length, + uint32_t pixel_scoreboard_clear, + uint32_t response_length, + uint32_t end_of_thread) +{ + brw_set_src1 (insn, brw_imm_d (0)); + + insn->bits3.dp_write.binding_table_index = binding_table_index; + insn->bits3.dp_write.msg_control = msg_control; + insn->bits3.dp_write.pixel_scoreboard_clear = pixel_scoreboard_clear; + insn->bits3.dp_write.msg_type = msg_type; + insn->bits3.dp_write.send_commit_msg = 0; + insn->bits3.dp_write.response_length = response_length; + insn->bits3.dp_write.msg_length = msg_length; + insn->bits3.dp_write.msg_target = BRW_MESSAGE_TARGET_DATAPORT_WRITE; + insn->bits3.urb.end_of_thread = end_of_thread; +} + +static void brw_set_dp_read_message( struct brw_instruction *insn, + uint32_t binding_table_index, + uint32_t msg_control, + uint32_t msg_type, + uint32_t target_cache, + uint32_t msg_length, + uint32_t response_length, + uint32_t end_of_thread ) +{ + brw_set_src1 (insn, brw_imm_d (0)); + + insn->bits3.dp_read.binding_table_index = binding_table_index; + insn->bits3.dp_read.msg_control = msg_control; + insn->bits3.dp_read.msg_type = msg_type; + insn->bits3.dp_read.target_cache = target_cache; + insn->bits3.dp_read.response_length = response_length; + insn->bits3.dp_read.msg_length = msg_length; + insn->bits3.dp_read.msg_target = BRW_MESSAGE_TARGET_DATAPORT_READ; + insn->bits3.dp_read.end_of_thread = end_of_thread; +} + +static void +brw_set_sampler_message (struct brw_instruction *insn, + cairo_bool_t is_g4x, + uint32_t binding_table_index, + uint32_t sampler, + uint32_t msg_type, + uint32_t response_length, + uint32_t msg_length, + cairo_bool_t eot) +{ + brw_set_src1 (insn, brw_imm_d (0)); + + if (is_g4x) { + /* XXX presume the driver is sane! */ + insn->bits3.sampler_g4x.binding_table_index = binding_table_index; + insn->bits3.sampler_g4x.sampler = sampler; + insn->bits3.sampler_g4x.msg_type = msg_type; + insn->bits3.sampler_g4x.response_length = response_length; + insn->bits3.sampler_g4x.msg_length = msg_length; + insn->bits3.sampler_g4x.end_of_thread = eot; + insn->bits3.sampler_g4x.msg_target = BRW_MESSAGE_TARGET_SAMPLER; + } else { + insn->bits3.sampler.binding_table_index = binding_table_index; + insn->bits3.sampler.sampler = sampler; + insn->bits3.sampler.msg_type = msg_type; + insn->bits3.sampler.return_format = BRW_SAMPLER_RETURN_FORMAT_FLOAT32; + insn->bits3.sampler.response_length = response_length; + insn->bits3.sampler.msg_length = msg_length; + insn->bits3.sampler.end_of_thread = eot; + insn->bits3.sampler.msg_target = BRW_MESSAGE_TARGET_SAMPLER; + } +} + +struct brw_instruction * +brw_next_instruction (struct brw_compile *p, + uint32_t opcode) +{ + struct brw_instruction *insn; + + assert(p->nr_insn + 1 < BRW_EU_MAX_INSN); + + insn = &p->store[p->nr_insn++]; + memcpy(insn, p->current, sizeof(*insn)); + + /* Reset this one-shot flag: */ + if (p->current->header.destreg__conditonalmod) { + p->current->header.destreg__conditonalmod = 0; + p->current->header.predicate_control = BRW_PREDICATE_NORMAL; + } + + insn->header.opcode = opcode; + return insn; +} + +static struct brw_instruction *brw_alu1( struct brw_compile *p, + uint32_t opcode, + struct brw_reg dest, + struct brw_reg src ) +{ + struct brw_instruction *insn = brw_next_instruction(p, opcode); + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src); + return insn; +} + +static struct brw_instruction *brw_alu2(struct brw_compile *p, + uint32_t opcode, + struct brw_reg dest, + struct brw_reg src0, + struct brw_reg src1 ) +{ + struct brw_instruction *insn = brw_next_instruction(p, opcode); + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src0); + brw_set_src1(insn, src1); + return insn; +} + + +/*********************************************************************** + * Convenience routines. + */ +#define ALU1(OP) \ + struct brw_instruction *brw_##OP(struct brw_compile *p, \ + struct brw_reg dest, \ + struct brw_reg src0) \ +{ \ + return brw_alu1(p, BRW_OPCODE_##OP, dest, src0); \ +} + +#define ALU2(OP) \ + struct brw_instruction *brw_##OP(struct brw_compile *p, \ + struct brw_reg dest, \ + struct brw_reg src0, \ + struct brw_reg src1) \ +{ \ + return brw_alu2(p, BRW_OPCODE_##OP, dest, src0, src1); \ +} + + + ALU1(MOV) + ALU2(SEL) + ALU1(NOT) + ALU2(AND) + ALU2(OR) + ALU2(XOR) + ALU2(SHR) + ALU2(SHL) + ALU2(RSR) + ALU2(RSL) + ALU2(ASR) + ALU2(ADD) + ALU2(MUL) + ALU1(FRC) + ALU1(RNDD) + ALU1(RNDZ) + ALU2(MAC) + ALU2(MACH) + ALU1(LZD) + ALU2(DP4) + ALU2(DPH) + ALU2(DP3) + ALU2(DP2) +ALU2(LINE) + + + + +void brw_NOP(struct brw_compile *p) +{ + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_NOP); + brw_instruction_set_destination(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); + brw_instruction_set_source0(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); + brw_set_src1(insn, brw_imm_ud(0x0)); +} + + + + + +/*********************************************************************** + * Comparisons, if/else/endif + */ + +struct brw_instruction *brw_JMPI(struct brw_compile *p, + struct brw_reg dest, + struct brw_reg src0, + struct brw_reg src1) +{ + struct brw_instruction *insn = brw_alu2(p, BRW_OPCODE_JMPI, dest, src0, src1); + + p->current->header.predicate_control = BRW_PREDICATE_NONE; + + return insn; +} + +/* EU takes the value from the flag register and pushes it onto some + * sort of a stack (presumably merging with any flag value already on + * the stack). Within an if block, the flags at the top of the stack + * control execution on each channel of the unit, eg. on each of the + * 16 pixel values in our wm programs. + * + * When the matching 'else' instruction is reached (presumably by + * countdown of the instruction count patched in by our ELSE/ENDIF + * functions), the relevant flags are inverted. + * + * When the matching 'endif' instruction is reached, the flags are + * popped off. If the stack is now empty, normal execution resumes. + * + * No attempt is made to deal with stack overflow (14 elements?). + */ +struct brw_instruction *brw_IF(struct brw_compile *p, uint32_t execute_size) +{ + struct brw_instruction *insn; + + if (p->single_program_flow) { + assert(execute_size == BRW_EXECUTE_1); + + insn = brw_next_instruction(p, BRW_OPCODE_ADD); + insn->header.predicate_inverse = 1; + } else { + insn = brw_next_instruction(p, BRW_OPCODE_IF); + } + + /* Override the defaults for this instruction: + */ + brw_instruction_set_destination (insn, brw_ip_reg ()); + brw_instruction_set_source0 (insn, brw_ip_reg ()); + brw_set_src1 (insn, brw_imm_d (0)); + + insn->header.execution_size = execute_size; + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.predicate_control = BRW_PREDICATE_NORMAL; + insn->header.mask_control = BRW_MASK_ENABLE; + if (!p->single_program_flow) + insn->header.thread_control = BRW_THREAD_SWITCH; + + p->current->header.predicate_control = BRW_PREDICATE_NONE; + + return insn; +} + + +struct brw_instruction *brw_ELSE(struct brw_compile *p, + struct brw_instruction *if_insn) +{ + struct brw_instruction *insn; + + if (p->single_program_flow) { + insn = brw_next_instruction(p, BRW_OPCODE_ADD); + } else { + insn = brw_next_instruction(p, BRW_OPCODE_ELSE); + } + + brw_instruction_set_destination (insn, brw_ip_reg ()); + brw_instruction_set_source0 (insn, brw_ip_reg ()); + brw_set_src1 (insn, brw_imm_d (0)); + + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.execution_size = if_insn->header.execution_size; + insn->header.mask_control = BRW_MASK_ENABLE; + if (!p->single_program_flow) + insn->header.thread_control = BRW_THREAD_SWITCH; + + /* Patch the if instruction to point at this instruction. + */ + if (p->single_program_flow) { + assert(if_insn->header.opcode == BRW_OPCODE_ADD); + + if_insn->bits3.ud = (insn - if_insn + 1) * 16; + } else { + assert(if_insn->header.opcode == BRW_OPCODE_IF); + + if_insn->bits3.if_else.jump_count = insn - if_insn; + if_insn->bits3.if_else.pop_count = 1; + if_insn->bits3.if_else.pad0 = 0; + } + + return insn; +} + +void brw_ENDIF(struct brw_compile *p, + struct brw_instruction *patch_insn) +{ + if (p->single_program_flow) { + /* In single program flow mode, there's no need to execute an ENDIF, + * since we don't need to do any stack operations, and if we're executing + * currently, we want to just continue executing. + */ + struct brw_instruction *next = &p->store[p->nr_insn]; + + assert(patch_insn->header.opcode == BRW_OPCODE_ADD); + + patch_insn->bits3.ud = (next - patch_insn) * 16; + } else { + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_ENDIF); + + brw_instruction_set_destination(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); + brw_instruction_set_source0(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD)); + brw_set_src1 (insn, brw_imm_d (0)); + + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.execution_size = patch_insn->header.execution_size; + insn->header.mask_control = BRW_MASK_ENABLE; + insn->header.thread_control = BRW_THREAD_SWITCH; + + assert(patch_insn->bits3.if_else.jump_count == 0); + + /* Patch the if or else instructions to point at this or the next + * instruction respectively. + */ + if (patch_insn->header.opcode == BRW_OPCODE_IF) { + /* Automagically turn it into an IFF: + */ + patch_insn->header.opcode = BRW_OPCODE_IFF; + patch_insn->bits3.if_else.jump_count = insn - patch_insn + 1; + patch_insn->bits3.if_else.pop_count = 0; + patch_insn->bits3.if_else.pad0 = 0; + } else if (patch_insn->header.opcode == BRW_OPCODE_ELSE) { + patch_insn->bits3.if_else.jump_count = insn - patch_insn + 1; + patch_insn->bits3.if_else.pop_count = 1; + patch_insn->bits3.if_else.pad0 = 0; + } else { + assert(0); + } + + /* Also pop item off the stack in the endif instruction: + */ + insn->bits3.if_else.jump_count = 0; + insn->bits3.if_else.pop_count = 1; + insn->bits3.if_else.pad0 = 0; + } +} + +struct brw_instruction *brw_BREAK(struct brw_compile *p) +{ + struct brw_instruction *insn; + insn = brw_next_instruction(p, BRW_OPCODE_BREAK); + brw_instruction_set_destination(insn, brw_ip_reg()); + brw_instruction_set_source0(insn, brw_ip_reg()); + brw_set_src1(insn, brw_imm_d (0)); + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.execution_size = BRW_EXECUTE_8; + /* insn->header.mask_control = BRW_MASK_DISABLE; */ + insn->bits3.if_else.pad0 = 0; + return insn; +} + +struct brw_instruction *brw_CONT(struct brw_compile *p) +{ + struct brw_instruction *insn; + insn = brw_next_instruction(p, BRW_OPCODE_CONTINUE); + brw_instruction_set_destination(insn, brw_ip_reg()); + brw_instruction_set_source0(insn, brw_ip_reg()); + brw_set_src1 (insn, brw_imm_d (0)); + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.execution_size = BRW_EXECUTE_8; + /* insn->header.mask_control = BRW_MASK_DISABLE; */ + insn->bits3.if_else.pad0 = 0; + return insn; +} + +/* DO/WHILE loop: +*/ +struct brw_instruction *brw_DO(struct brw_compile *p, uint32_t execute_size) +{ + if (p->single_program_flow) { + return &p->store[p->nr_insn]; + } else { + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_DO); + + /* Override the defaults for this instruction: + */ + brw_instruction_set_destination(insn, brw_null_reg()); + brw_instruction_set_source0(insn, brw_null_reg()); + brw_set_src1(insn, brw_null_reg()); + + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.execution_size = execute_size; + insn->header.predicate_control = BRW_PREDICATE_NONE; + /* insn->header.mask_control = BRW_MASK_ENABLE; */ + /* insn->header.mask_control = BRW_MASK_DISABLE; */ + + return insn; + } +} + + + +struct brw_instruction *brw_WHILE(struct brw_compile *p, + struct brw_instruction *do_insn) +{ + struct brw_instruction *insn; + + if (p->single_program_flow) + insn = brw_next_instruction(p, BRW_OPCODE_ADD); + else + insn = brw_next_instruction(p, BRW_OPCODE_WHILE); + + brw_instruction_set_destination(insn, brw_ip_reg()); + brw_instruction_set_source0(insn, brw_ip_reg()); + brw_set_src1 (insn, brw_imm_d (0)); + + insn->header.compression_control = BRW_COMPRESSION_NONE; + + if (p->single_program_flow) { + insn->header.execution_size = BRW_EXECUTE_1; + + insn->bits3.d = (do_insn - insn) * 16; + } else { + insn->header.execution_size = do_insn->header.execution_size; + + assert(do_insn->header.opcode == BRW_OPCODE_DO); + insn->bits3.if_else.jump_count = do_insn - insn + 1; + insn->bits3.if_else.pop_count = 0; + insn->bits3.if_else.pad0 = 0; + } + + /* insn->header.mask_control = BRW_MASK_ENABLE; */ + + /* insn->header.mask_control = BRW_MASK_DISABLE; */ + p->current->header.predicate_control = BRW_PREDICATE_NONE; + return insn; +} + + +/* FORWARD JUMPS: +*/ +void brw_land_fwd_jump(struct brw_compile *p, + struct brw_instruction *jmp_insn) +{ + struct brw_instruction *landing = &p->store[p->nr_insn]; + + assert(jmp_insn->header.opcode == BRW_OPCODE_JMPI); + assert(jmp_insn->bits1.da1.src1_reg_file = BRW_IMMEDIATE_VALUE); + + jmp_insn->bits3.ud = (landing - jmp_insn) - 1; +} + + + +/* To integrate with the above, it makes sense that the comparison + * instruction should populate the flag register. It might be simpler + * just to use the flag reg for most WM tasks? + */ +void brw_CMP(struct brw_compile *p, + struct brw_reg dest, + uint32_t conditional, + struct brw_reg src0, + struct brw_reg src1) +{ + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_CMP); + + insn->header.destreg__conditonalmod = conditional; + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src0); + brw_set_src1(insn, src1); + + /* guess_execution_size(insn, src0); */ + + + /* Make it so that future instructions will use the computed flag + * value until brw_set_predicate_control_flag_value() is called + * again. + */ + if (dest.file == BRW_ARCHITECTURE_REGISTER_FILE && + dest.nr == 0) { + p->current->header.predicate_control = BRW_PREDICATE_NORMAL; + p->flag_value = 0xff; + } +} + + + +/*********************************************************************** + * Helpers for the various SEND message types: + */ + +/* Invert 8 values +*/ +void brw_math( struct brw_compile *p, + struct brw_reg dest, + uint32_t function, + uint32_t saturate, + uint32_t msg_reg_nr, + struct brw_reg src, + uint32_t data_type, + uint32_t precision ) +{ + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_SEND); + uint32_t msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1; + uint32_t response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1; + + /* Example code doesn't set predicate_control for send + * instructions. + */ + insn->header.predicate_control = 0; + insn->header.destreg__conditonalmod = msg_reg_nr; + + response_length = 1; + + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src); + brw_set_math_message(insn, + msg_length, response_length, + function, + BRW_MATH_INTEGER_UNSIGNED, + precision, + saturate, + data_type); +} + +/* Use 2 send instructions to invert 16 elements +*/ +void brw_math_16( struct brw_compile *p, + struct brw_reg dest, + uint32_t function, + uint32_t saturate, + uint32_t msg_reg_nr, + struct brw_reg src, + uint32_t precision ) +{ + struct brw_instruction *insn; + uint32_t msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1; + uint32_t response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1; + + /* First instruction: + */ + brw_push_insn_state(p); + brw_set_predicate_control_flag_value(p, 0xff); + brw_set_compression_control(p, BRW_COMPRESSION_NONE); + + insn = brw_next_instruction(p, BRW_OPCODE_SEND); + insn->header.destreg__conditonalmod = msg_reg_nr; + + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src); + brw_set_math_message(insn, + msg_length, response_length, + function, + BRW_MATH_INTEGER_UNSIGNED, + precision, + saturate, + BRW_MATH_DATA_VECTOR); + + /* Second instruction: + */ + insn = brw_next_instruction(p, BRW_OPCODE_SEND); + insn->header.compression_control = BRW_COMPRESSION_2NDHALF; + insn->header.destreg__conditonalmod = msg_reg_nr+1; + + brw_instruction_set_destination(insn, offset(dest,1)); + brw_instruction_set_source0(insn, src); + brw_set_math_message(insn, + msg_length, response_length, + function, + BRW_MATH_INTEGER_UNSIGNED, + precision, + saturate, + BRW_MATH_DATA_VECTOR); + + brw_pop_insn_state(p); +} + + + + +void brw_dp_WRITE_16( struct brw_compile *p, + struct brw_reg src, + uint32_t msg_reg_nr, + uint32_t scratch_offset ) +{ + { + brw_push_insn_state(p); + brw_set_mask_control(p, BRW_MASK_DISABLE); + brw_set_compression_control(p, BRW_COMPRESSION_NONE); + + brw_MOV (p, + retype (brw_vec1_grf (0, 2), BRW_REGISTER_TYPE_D), + brw_imm_d (scratch_offset)); + + brw_pop_insn_state(p); + } + + { + uint32_t msg_length = 3; + struct brw_reg dest = retype(brw_null_reg(), BRW_REGISTER_TYPE_UW); + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_SEND); + + insn->header.predicate_control = 0; /* XXX */ + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.destreg__conditonalmod = msg_reg_nr; + + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src); + + brw_instruction_set_dp_write_message(insn, + 255, /* bti */ + BRW_DATAPORT_OWORD_BLOCK_4_OWORDS, /* msg_control */ + BRW_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE, /* msg_type */ + msg_length, + 0, /* pixel scoreboard */ + 0, /* response_length */ + 0); /* eot */ + } + +} + + +void brw_dp_READ_16( struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + uint32_t scratch_offset ) +{ + { + brw_push_insn_state(p); + brw_set_compression_control(p, BRW_COMPRESSION_NONE); + brw_set_mask_control(p, BRW_MASK_DISABLE); + + brw_MOV (p, + retype (brw_vec1_grf (0, 2), BRW_REGISTER_TYPE_D), + brw_imm_d (scratch_offset)); + + brw_pop_insn_state(p); + } + + { + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_SEND); + + insn->header.predicate_control = 0; /* XXX */ + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.destreg__conditonalmod = msg_reg_nr; + + brw_instruction_set_destination(insn, dest); /* UW? */ + brw_instruction_set_source0(insn, retype(brw_vec8_grf(0), BRW_REGISTER_TYPE_UW)); + + brw_set_dp_read_message(insn, + 255, /* bti */ + 3, /* msg_control */ + BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* msg_type */ + 1, /* target cache */ + 1, /* msg_length */ + 2, /* response_length */ + 0); /* eot */ + } +} + + +void brw_fb_WRITE(struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + struct brw_reg src0, + uint32_t binding_table_index, + uint32_t msg_length, + uint32_t response_length, + int eot) +{ + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_SEND); + + insn->header.predicate_control = 0; /* XXX */ + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.destreg__conditonalmod = msg_reg_nr; + + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src0); + brw_instruction_set_dp_write_message(insn, + binding_table_index, + BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE, /* msg_control */ + BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE, /* msg_type */ + msg_length, + 1, /* pixel scoreboard */ + response_length, + eot); +} + + + +void brw_SAMPLE (struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + struct brw_reg src0, + uint32_t binding_table_index, + uint32_t sampler, + uint32_t writemask, + uint32_t msg_type, + uint32_t response_length, + uint32_t msg_length, + cairo_bool_t eot) +{ + int need_stall = 0; + + if(writemask == 0) { + /* printf("%s: zero writemask??\n", __FUNCTION__); */ + return; + } + + /* Hardware doesn't do destination dependency checking on send + * instructions properly. Add a workaround which generates the + * dependency by other means. In practice it seems like this bug + * only crops up for texture samples, and only where registers are + * written by the send and then written again later without being + * read in between. Luckily for us, we already track that + * information and use it to modify the writemask for the + * instruction, so that is a guide for whether a workaround is + * needed. + */ + if (writemask != WRITEMASK_XYZW) { + uint32_t dst_offset = 0; + uint32_t i, newmask = 0, len = 0; + + for (i = 0; i < 4; i++) { + if (writemask & (1<header.predicate_control = 0; /* XXX */ + insn->header.compression_control = BRW_COMPRESSION_NONE; + insn->header.destreg__conditonalmod = msg_reg_nr; + + brw_instruction_set_destination(insn, dest); + brw_instruction_set_source0(insn, src0); + brw_set_sampler_message (insn, p->is_g4x, + binding_table_index, + sampler, + msg_type, + response_length, + msg_length, + eot); + } + + if (need_stall) + { + struct brw_reg reg = vec8(offset(dest, response_length-1)); + + /* mov (8) r9.0<1>:f r9.0<8;8,1>:f { Align1 } + */ + brw_push_insn_state(p); + brw_set_compression_control(p, 0); + brw_MOV(p, reg, reg); + brw_pop_insn_state(p); + } +} + +/* All these variables are pretty confusing - we might be better off + * using bitmasks and macros for this, in the old style. Or perhaps + * just having the caller instantiate the fields in dword3 itself. + */ +void brw_urb_WRITE(struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + struct brw_reg src0, + int allocate, + int used, + uint32_t msg_length, + uint32_t response_length, + int eot, + int writes_complete, + uint32_t offset, + uint32_t swizzle) +{ + struct brw_instruction *insn = brw_next_instruction(p, BRW_OPCODE_SEND); + + assert(msg_length < 16); + + brw_instruction_set_destination (insn, dest); + brw_instruction_set_source0 (insn, src0); + brw_set_src1 (insn, brw_imm_d (0)); + + insn->header.destreg__conditonalmod = msg_reg_nr; + + brw_set_urb_message (insn, + allocate, + used, + msg_length, + response_length, + eot, + writes_complete, + offset, + swizzle); +} diff --git a/src/drm/cairo-drm-intel-brw-eu-util.c b/src/drm/cairo-drm-intel-brw-eu-util.c new file mode 100644 index 000000000..592235b12 --- /dev/null +++ b/src/drm/cairo-drm-intel-brw-eu-util.c @@ -0,0 +1,121 @@ +/* + Copyright (C) Intel Corp. 2006. All Rights Reserved. + Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to + develop this 3D driver. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + **********************************************************************/ +/* + * Authors: + * Keith Whitwell + */ + + +#include "cairoint.h" +#include "cairo-drm-intel-brw-eu.h" + + +void brw_math_invert( struct brw_compile *p, + struct brw_reg dst, + struct brw_reg src) +{ + brw_math( p, + dst, + BRW_MATH_FUNCTION_INV, + BRW_MATH_SATURATE_NONE, + 0, + src, + BRW_MATH_PRECISION_FULL, + BRW_MATH_DATA_VECTOR ); +} + + + +void brw_copy4(struct brw_compile *p, + struct brw_reg dst, + struct brw_reg src, + uint32_t count) +{ + uint32_t i; + + dst = vec4(dst); + src = vec4(src); + + for (i = 0; i < count; i++) + { + uint32_t delta = i*32; + brw_MOV(p, byte_offset(dst, delta), byte_offset(src, delta)); + brw_MOV(p, byte_offset(dst, delta+16), byte_offset(src, delta+16)); + } +} + + +void brw_copy8(struct brw_compile *p, + struct brw_reg dst, + struct brw_reg src, + uint32_t count) +{ + uint32_t i; + + dst = vec8(dst); + src = vec8(src); + + for (i = 0; i < count; i++) + { + uint32_t delta = i*32; + brw_MOV(p, byte_offset(dst, delta), byte_offset(src, delta)); + } +} + + +void brw_copy_indirect_to_indirect(struct brw_compile *p, + struct brw_indirect dst_ptr, + struct brw_indirect src_ptr, + uint32_t count) +{ + uint32_t i; + + for (i = 0; i < count; i++) + { + uint32_t delta = i*32; + brw_MOV(p, deref_4f(dst_ptr, delta), deref_4f(src_ptr, delta)); + brw_MOV(p, deref_4f(dst_ptr, delta+16), deref_4f(src_ptr, delta+16)); + } +} + + +void brw_copy_from_indirect(struct brw_compile *p, + struct brw_reg dst, + struct brw_indirect ptr, + uint32_t count) +{ + uint32_t i; + + dst = vec4(dst); + + for (i = 0; i < count; i++) + { + uint32_t delta = i*32; + brw_MOV(p, byte_offset(dst, delta), deref_4f(ptr, delta)); + brw_MOV(p, byte_offset(dst, delta+16), deref_4f(ptr, delta+16)); + } +} diff --git a/src/drm/cairo-drm-intel-brw-eu.c b/src/drm/cairo-drm-intel-brw-eu.c new file mode 100644 index 000000000..2b47d8c37 --- /dev/null +++ b/src/drm/cairo-drm-intel-brw-eu.c @@ -0,0 +1,250 @@ +/* + Copyright (C) Intel Corp. 2006. All Rights Reserved. + Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to + develop this 3D driver. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + **********************************************************************/ +/* + * Authors: + * Keith Whitwell + */ + +#include "cairoint.h" +#include "cairo-drm-intel-brw-eu.h" + +#include +#include +#include + + +/* How does predicate control work when execution_size != 8? Do I + * need to test/set for 0xffff when execution_size is 16? + */ +void brw_set_predicate_control_flag_value( struct brw_compile *p, uint32_t value ) +{ + p->current->header.predicate_control = BRW_PREDICATE_NONE; + + if (value != 0xff) { + if (value != p->flag_value) { + brw_push_insn_state(p); + brw_MOV(p, brw_flag_reg(), brw_imm_uw(value)); + p->flag_value = value; + brw_pop_insn_state(p); + } + + p->current->header.predicate_control = BRW_PREDICATE_NORMAL; + } +} + +void brw_set_predicate_control( struct brw_compile *p, uint32_t pc ) +{ + p->current->header.predicate_control = pc; +} + +void brw_set_conditionalmod( struct brw_compile *p, uint32_t conditional ) +{ + p->current->header.destreg__conditonalmod = conditional; +} + +void brw_set_access_mode( struct brw_compile *p, uint32_t access_mode ) +{ + p->current->header.access_mode = access_mode; +} + +void brw_set_compression_control( struct brw_compile *p, int compression_control ) +{ + p->current->header.compression_control = compression_control; +} + +void brw_set_mask_control( struct brw_compile *p, uint32_t value ) +{ + p->current->header.mask_control = value; +} + +void brw_set_saturate( struct brw_compile *p, uint32_t value ) +{ + p->current->header.saturate = value; +} + +void brw_push_insn_state( struct brw_compile *p ) +{ + assert(p->current != &p->stack[BRW_EU_MAX_INSN_STACK-1]); + memcpy(p->current+1, p->current, sizeof(struct brw_instruction)); + p->current++; +} + +void brw_pop_insn_state( struct brw_compile *p ) +{ + assert(p->current != p->stack); + p->current--; +} + +/************************************************************************/ +void +brw_compile_init (struct brw_compile *p, + cairo_bool_t is_g4x) +{ + p->nr_insn = 0; + p->current = p->stack; + memset (p->current, 0, sizeof (p->current[0])); + + p->is_g4x = is_g4x; + + /* Some defaults? */ + brw_set_mask_control (p, BRW_MASK_ENABLE); /* what does this do? */ + brw_set_saturate (p, 0); + brw_set_compression_control (p, BRW_COMPRESSION_NONE); + brw_set_predicate_control_flag_value (p, 0xff); +} + +const uint32_t * +brw_get_program (struct brw_compile *p, + uint32_t *sz) +{ + *sz = p->nr_insn * sizeof (struct brw_instruction); + return (const uint32_t *)p->store; +} + + + +/* + * Subroutine calls require special attention. + * Mesa instructions may be expanded into multiple hardware instructions + * so the prog_instruction::BranchTarget field can't be used as an index + * into the hardware instructions. + * + * The BranchTarget field isn't needed, however. Mesa's GLSL compiler + * emits CAL and BGNSUB instructions with labels that can be used to map + * subroutine calls to actual subroutine code blocks. + * + * The structures and function here implement patching of CAL instructions + * so they jump to the right subroutine code... + */ + + +/* + * For each OPCODE_BGNSUB we create one of these. + */ +struct brw_glsl_label +{ + const char *name; /*< the label string */ + uint32_t position; /*< the position of the brw instruction for this label */ + struct brw_glsl_label *next; /*< next in linked list */ +}; + + +/* + * For each OPCODE_CAL we create one of these. + */ +struct brw_glsl_call +{ + uint32_t call_inst_pos; /*< location of the CAL instruction */ + const char *sub_name; /*< name of subroutine to call */ + struct brw_glsl_call *next; /*< next in linked list */ +}; + + +/* + * Called for each OPCODE_BGNSUB. + */ + void +brw_save_label(struct brw_compile *c, const char *name, uint32_t position) +{ + struct brw_glsl_label *label = calloc(1, sizeof *label); + label->name = name; + label->position = position; + label->next = c->first_label; + c->first_label = label; +} + + +/* + * Called for each OPCODE_CAL. + */ + void +brw_save_call(struct brw_compile *c, const char *name, uint32_t call_pos) +{ + struct brw_glsl_call *call = calloc(1, sizeof *call); + call->call_inst_pos = call_pos; + call->sub_name = name; + call->next = c->first_call; + c->first_call = call; +} + + +/* + * Lookup a label, return label's position/offset. + */ + static uint32_t +brw_lookup_label(struct brw_compile *c, const char *name) +{ + const struct brw_glsl_label *label; + for (label = c->first_label; label; label = label->next) { + if (strcmp(name, label->name) == 0) { + return label->position; + } + } + abort(); /* should never happen */ + return ~0; +} + + +/* + * When we're done generating code, this function is called to resolve + * subroutine calls. + */ + void +brw_resolve_cals(struct brw_compile *c) +{ + const struct brw_glsl_call *call; + + for (call = c->first_call; call; call = call->next) { + const uint32_t sub_loc = brw_lookup_label(c, call->sub_name); + struct brw_instruction *brw_call_inst = &c->store[call->call_inst_pos]; + struct brw_instruction *brw_sub_inst = &c->store[sub_loc]; + int32_t offset = brw_sub_inst - brw_call_inst; + + /* patch brw_inst1 to point to brw_inst2 */ + brw_set_src1(brw_call_inst, brw_imm_d(offset * 16)); + } + + /* free linked list of calls */ + { + struct brw_glsl_call *call, *next; + for (call = c->first_call; call; call = next) { + next = call->next; + free(call); + } + c->first_call = NULL; + } + + /* free linked list of labels */ + { + struct brw_glsl_label *label, *next; + for (label = c->first_label; label; label = next) { + next = label->next; + free(label); + } + c->first_label = NULL; + } +} diff --git a/src/drm/cairo-drm-intel-brw-eu.h b/src/drm/cairo-drm-intel-brw-eu.h new file mode 100644 index 000000000..2662a2e7f --- /dev/null +++ b/src/drm/cairo-drm-intel-brw-eu.h @@ -0,0 +1,1043 @@ +/* + Copyright (C) Intel Corp. 2006. All Rights Reserved. + Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to + develop this 3D driver. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice (including the + next paragraph) shall be included in all copies or substantial + portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + **********************************************************************/ +/* + * Authors: + * Keith Whitwell + */ + +#ifndef CAIRO_DRM_INTEL_BRW_EU_H +#define CAIRO_DRM_INTEL_BRW_EU_H + +#include "cairo-drm-intel-brw-structs.h" +#include "cairo-drm-intel-brw-defines.h" + +#include + + +/* + * Writemask values, 1 bit per component. + */ +#define WRITEMASK_X 0x1 +#define WRITEMASK_Y 0x2 +#define WRITEMASK_Z 0x4 +#define WRITEMASK_W 0x8 +#define WRITEMASK_XY (WRITEMASK_X | WRITEMASK_Y) +#define WRITEMASK_XZ (WRITEMASK_X | WRITEMASK_Z) +#define WRITEMASK_YZ (WRITEMASK_Y | WRITEMASK_Z) +#define WRITEMASK_XYZ (WRITEMASK_X | WRITEMASK_Y | WRITEMASK_Z) +#define WRITEMASK_XW (WRITEMASK_X | WRITEMASK_W) +#define WRITEMASK_YW (WRITEMASK_Y | WRITEMASK_W) +#define WRITEMASK_XYW (WRITEMASK_X | WRITEMASK_Y | WRITEMASK_W) +#define WRITEMASK_ZW (WRITEMASK_Z | WRITEMASK_W) +#define WRITEMASK_XZW (WRITEMASK_X | WRITEMASK_Z | WRITEMASK_W) +#define WRITEMASK_YZW (WRITEMASK_Y | WRITEMASK_Z | WRITEMASK_W) +#define WRITEMASK_XYZW (WRITEMASK_X | WRITEMASK_Y | WRITEMASK_Z | WRITEMASK_W) + +#define BRW_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<2) | ((c)<<4) | ((d)<<6)) +#define BRW_GET_SWZ(swz, idx) (((swz) >> ((idx)*2)) & 0x3) + +#define BRW_SWIZZLE_NOOP BRW_SWIZZLE4 (0,1,2,3) +#define BRW_SWIZZLE_XYZW BRW_SWIZZLE4 (0,1,2,3) +#define BRW_SWIZZLE_XXXX BRW_SWIZZLE4 (0,0,0,0) +#define BRW_SWIZZLE_XYXY BRW_SWIZZLE4 (0,1,0,1) + +#define REG_SIZE (8*4) + +/* These aren't hardware structs, just something useful for us to pass around: + * + * Align1 operation has a lot of control over input ranges. Used in + * WM programs to implement shaders decomposed into "channel serial" + * or "structure of array" form: + */ +struct brw_reg { + uint32_t type:4; + uint32_t file:2; + uint32_t nr:8; + uint32_t subnr:5; /* :1 in align16 */ + uint32_t negate:1; /* source only */ + uint32_t abs:1; /* source only */ + uint32_t vstride:4; /* source only */ + uint32_t width:3; /* src only, align1 only */ + uint32_t hstride:2; /* align1 only */ + uint32_t address_mode:1; /* relative addressing, hopefully! */ + uint32_t pad0:1; + + union { + struct { + uint32_t swizzle:8; /* src only, align16 only */ + uint32_t writemask:4; /* dest only, align16 only */ + int32_t indirect_offset:10; /* relative addressing offset */ + uint32_t pad1:10; /* two dwords total */ + } bits; + + float f; + int32_t d; + uint32_t ud; + } dw1; +}; + +struct brw_indirect { + uint32_t addr_subnr:4; + int32_t addr_offset:10; + uint32_t pad:18; +}; + +struct brw_glsl_label; +struct brw_glsl_call; + +#define BRW_EU_MAX_INSN_STACK 5 +#define BRW_EU_MAX_INSN 200 + +struct brw_compile { + struct brw_instruction store[BRW_EU_MAX_INSN]; + uint32_t nr_insn; + + cairo_bool_t is_g4x; + + /* Allow clients to push/pop instruction state: + */ + struct brw_instruction stack[BRW_EU_MAX_INSN_STACK]; + struct brw_instruction *current; + + uint32_t flag_value; + int single_program_flow; + struct brw_context *brw; + + struct brw_glsl_label *first_label; /*< linked list of labels */ + struct brw_glsl_call *first_call; /*< linked list of CALs */ +}; + +cairo_private void +brw_save_label (struct brw_compile *c, + const char *name, + uint32_t position); + +cairo_private void +brw_save_call (struct brw_compile *c, + const char *name, + uint32_t call_pos); + +cairo_private void +brw_resolve_cals (struct brw_compile *c); + +static cairo_always_inline int +type_sz (uint32_t type) +{ + switch (type) { + case BRW_REGISTER_TYPE_UD: + case BRW_REGISTER_TYPE_D: + case BRW_REGISTER_TYPE_F: + return 4; + case BRW_REGISTER_TYPE_HF: + case BRW_REGISTER_TYPE_UW: + case BRW_REGISTER_TYPE_W: + return 2; + case BRW_REGISTER_TYPE_UB: + case BRW_REGISTER_TYPE_B: + return 1; + default: + return 0; + } +} + +/* + * Construct a brw_reg. + * \param file one of the BRW_x_REGISTER_FILE values + * \param nr register number/index + * \param subnr register sub number + * \param type one of BRW_REGISTER_TYPE_x + * \param vstride one of BRW_VERTICAL_STRIDE_x + * \param width one of BRW_WIDTH_x + * \param hstride one of BRW_HORIZONTAL_STRIDE_x + * \param swizzle one of BRW_SWIZZLE_x + * \param writemask WRITEMASK_X/Y/Z/W bitfield + */ +static cairo_always_inline struct brw_reg +brw_reg (uint32_t file, + uint32_t nr, + uint32_t subnr, + uint32_t type, + uint32_t vstride, + uint32_t width, + uint32_t hstride, + uint32_t swizzle, + uint32_t writemask) +{ + struct brw_reg reg; + + if (type == BRW_GENERAL_REGISTER_FILE) + assert(nr < 128); + else if (type == BRW_MESSAGE_REGISTER_FILE) + assert(nr < 9); + else if (type == BRW_ARCHITECTURE_REGISTER_FILE) + assert(nr <= BRW_ARF_IP); + + reg.type = type; + reg.file = file; + reg.nr = nr; + reg.subnr = subnr * type_sz(type); + reg.negate = 0; + reg.abs = 0; + reg.vstride = vstride; + reg.width = width; + reg.hstride = hstride; + reg.address_mode = BRW_ADDRESS_DIRECT; + reg.pad0 = 0; + + /* Could do better: If the reg is r5.3<0;1,0>, we probably want to + * set swizzle and writemask to W, as the lower bits of subnr will + * be lost when converted to align16. This is probably too much to + * keep track of as you'd want it adjusted by suboffset(), etc. + * Perhaps fix up when converting to align16? + */ + reg.dw1.bits.swizzle = swizzle; + reg.dw1.bits.writemask = writemask; + reg.dw1.bits.indirect_offset = 0; + reg.dw1.bits.pad1 = 0; + + return reg; +} + +/* Construct float[16] register */ +static cairo_always_inline struct brw_reg +brw_vec16_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return brw_reg (file, nr, subnr, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_16, + BRW_WIDTH_16, + BRW_HORIZONTAL_STRIDE_1, + BRW_SWIZZLE_XYZW, + WRITEMASK_XYZW); +} + +/* Construct float[8] register */ +static cairo_always_inline struct brw_reg +brw_vec8_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return brw_reg (file, nr, subnr, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_8, + BRW_WIDTH_8, + BRW_HORIZONTAL_STRIDE_1, + BRW_SWIZZLE_XYZW, + WRITEMASK_XYZW); +} + +/* Construct float[4] register */ +static cairo_always_inline struct brw_reg +brw_vec4_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return brw_reg (file, nr, subnr, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_4, + BRW_WIDTH_4, + BRW_HORIZONTAL_STRIDE_1, + BRW_SWIZZLE_XYZW, + WRITEMASK_XYZW); +} + +/* Construct float[2] register */ +static cairo_always_inline struct brw_reg +brw_vec2_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return brw_reg (file, nr, subnr, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_2, + BRW_WIDTH_2, + BRW_HORIZONTAL_STRIDE_1, + BRW_SWIZZLE_XYXY, + WRITEMASK_XY); +} + +/* Construct float[1] register */ +static cairo_always_inline struct brw_reg +brw_vec1_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return brw_reg (file, nr, subnr, + BRW_REGISTER_TYPE_F, + BRW_VERTICAL_STRIDE_0, + BRW_WIDTH_1, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_XXXX, + WRITEMASK_X); +} + +static cairo_always_inline struct brw_reg +retype (struct brw_reg reg, + uint32_t type) +{ + reg.type = type; + return reg; +} + +static cairo_always_inline struct brw_reg +suboffset (struct brw_reg reg, + uint32_t delta) +{ + reg.subnr += delta * type_sz (reg.type); + return reg; +} + +static cairo_always_inline struct brw_reg +offset (struct brw_reg reg, + uint32_t delta) +{ + reg.nr += delta; + return reg; +} + +static cairo_always_inline struct brw_reg +byte_offset (struct brw_reg reg, + uint32_t bytes) +{ + uint32_t newoffset = reg.nr * REG_SIZE + reg.subnr + bytes; + reg.nr = newoffset / REG_SIZE; + reg.subnr = newoffset % REG_SIZE; + return reg; +} + +/* Construct unsigned word[16] register */ +static cairo_always_inline struct brw_reg +brw_uw16_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return suboffset (retype (brw_vec16_reg (file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); +} + +/* Construct unsigned word[8] register */ +static cairo_always_inline struct brw_reg +brw_uw8_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return suboffset (retype (brw_vec8_reg (file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); +} + +/* Construct unsigned word[2] register */ +static cairo_always_inline struct brw_reg +brw_uw2_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return suboffset (retype (brw_vec2_reg (file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); +} + +/* Construct unsigned word[1] register */ +static cairo_always_inline struct brw_reg +brw_uw1_reg (uint32_t file, + uint32_t nr, + uint32_t subnr) +{ + return suboffset (retype (brw_vec1_reg (file, nr, 0), BRW_REGISTER_TYPE_UW), subnr); +} + +static cairo_always_inline struct brw_reg +brw_imm_reg (uint32_t type) +{ + return brw_reg (BRW_IMMEDIATE_VALUE, + 0, + 0, + type, + BRW_VERTICAL_STRIDE_0, + BRW_WIDTH_1, + BRW_HORIZONTAL_STRIDE_0, + 0, + 0); +} + +/* Construct float immediate register */ +static cairo_always_inline struct brw_reg brw_imm_f( float f ) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_F); + imm.dw1.f = f; + return imm; +} + +/* Construct integer immediate register */ +static cairo_always_inline struct brw_reg brw_imm_d( int32_t d ) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_D); + imm.dw1.d = d; + return imm; +} + +/* Construct uint immediate register */ +static cairo_always_inline struct brw_reg brw_imm_ud( uint32_t ud ) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_UD); + imm.dw1.ud = ud; + return imm; +} + +/* Construct ushort immediate register */ +static cairo_always_inline struct brw_reg brw_imm_uw( uint16_t uw ) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_UW); + imm.dw1.ud = uw | (uw << 16); + return imm; +} + +/* Construct short immediate register */ +static cairo_always_inline struct brw_reg brw_imm_w( int16_t w ) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_W); + imm.dw1.d = w | (w << 16); + return imm; +} + +/* brw_imm_b and brw_imm_ub aren't supported by hardware - the type + * numbers alias with _V and _VF below: + */ + +/* Construct vector of eight signed half-byte values */ +static cairo_always_inline +struct brw_reg brw_imm_v (uint32_t v) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_V); + imm.vstride = BRW_VERTICAL_STRIDE_0; + imm.width = BRW_WIDTH_8; + imm.hstride = BRW_HORIZONTAL_STRIDE_1; + imm.dw1.ud = v; + return imm; +} + +/* Construct vector of four 8-bit float values */ +static cairo_always_inline struct brw_reg +brw_imm_vf (uint32_t v) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_VF); + imm.vstride = BRW_VERTICAL_STRIDE_0; + imm.width = BRW_WIDTH_4; + imm.hstride = BRW_HORIZONTAL_STRIDE_1; + imm.dw1.ud = v; + return imm; +} + +#define VF_ZERO 0x0 +#define VF_ONE 0x30 +#define VF_NEG (1<<7) + +static cairo_always_inline struct brw_reg +brw_imm_vf4 (uint32_t v0, + uint32_t v1, + uint32_t v2, + uint32_t v3) +{ + struct brw_reg imm = brw_imm_reg(BRW_REGISTER_TYPE_VF); + imm.vstride = BRW_VERTICAL_STRIDE_0; + imm.width = BRW_WIDTH_4; + imm.hstride = BRW_HORIZONTAL_STRIDE_1; + imm.dw1.ud = ((v0 << 0) | + (v1 << 8) | + (v2 << 16) | + (v3 << 24)); + return imm; +} + +static cairo_always_inline struct brw_reg +brw_address (struct brw_reg reg) +{ + return brw_imm_uw (reg.nr * REG_SIZE + reg.subnr); +} + +/* Construct float[1] general-purpose register */ +static cairo_always_inline struct brw_reg +brw_vec1_grf (uint32_t nr, uint32_t subnr) +{ + return brw_vec1_reg (BRW_GENERAL_REGISTER_FILE, nr, subnr); +} + +/* Construct float[2] general-purpose register */ +static cairo_always_inline struct brw_reg +brw_vec2_grf (uint32_t nr, uint32_t subnr) +{ + return brw_vec2_reg (BRW_GENERAL_REGISTER_FILE, nr, subnr); +} + +/* Construct float[4] general-purpose register */ +static cairo_always_inline struct brw_reg +brw_vec4_grf (uint32_t nr, uint32_t subnr) +{ + return brw_vec4_reg (BRW_GENERAL_REGISTER_FILE, nr, subnr); +} + +/* Construct float[8] general-purpose register */ +static cairo_always_inline struct brw_reg +brw_vec8_grf (uint32_t nr) +{ + return brw_vec8_reg (BRW_GENERAL_REGISTER_FILE, nr, 0); +} + +static cairo_always_inline struct brw_reg +brw_uw8_grf (uint32_t nr, uint32_t subnr) +{ + return brw_uw8_reg (BRW_GENERAL_REGISTER_FILE, nr, subnr); +} + +static cairo_always_inline struct brw_reg +brw_uw16_grf (uint32_t nr, uint32_t subnr) +{ + return brw_uw16_reg (BRW_GENERAL_REGISTER_FILE, nr, subnr); +} + +/* Construct null register (usually used for setting condition codes) */ +static cairo_always_inline struct brw_reg +brw_null_reg (void) +{ + return brw_vec8_reg (BRW_ARCHITECTURE_REGISTER_FILE, + BRW_ARF_NULL, + 0); +} + +static cairo_always_inline struct brw_reg +brw_address_reg (uint32_t subnr) +{ + return brw_uw1_reg (BRW_ARCHITECTURE_REGISTER_FILE, + BRW_ARF_ADDRESS, + subnr); +} + +/* If/else instructions break in align16 mode if writemask & swizzle + * aren't xyzw. This goes against the convention for other scalar + * regs: + */ +static cairo_always_inline struct brw_reg +brw_ip_reg (void) +{ + return brw_reg (BRW_ARCHITECTURE_REGISTER_FILE, + BRW_ARF_IP, + 0, + BRW_REGISTER_TYPE_UD, + BRW_VERTICAL_STRIDE_4, /* ? */ + BRW_WIDTH_1, + BRW_HORIZONTAL_STRIDE_0, + BRW_SWIZZLE_XYZW, + WRITEMASK_XYZW); +} + +static cairo_always_inline struct brw_reg +brw_acc_reg (void) +{ + return brw_vec8_reg (BRW_ARCHITECTURE_REGISTER_FILE, + BRW_ARF_ACCUMULATOR, + 0); +} + +static cairo_always_inline struct brw_reg +brw_flag_reg (void) +{ + return brw_uw1_reg (BRW_ARCHITECTURE_REGISTER_FILE, + BRW_ARF_FLAG, + 0); +} + +static cairo_always_inline struct brw_reg +brw_mask_reg (uint32_t subnr) +{ + return brw_uw1_reg (BRW_ARCHITECTURE_REGISTER_FILE, + BRW_ARF_MASK, + subnr); +} + +static cairo_always_inline struct brw_reg +brw_message4_reg (uint32_t nr) +{ + return brw_vec4_reg (BRW_MESSAGE_REGISTER_FILE, + nr, + 0); +} + +static cairo_always_inline struct brw_reg +brw_message_reg (uint32_t nr) +{ + return brw_vec8_reg (BRW_MESSAGE_REGISTER_FILE, + nr, + 0); +} + +/* This is almost always called with a numeric constant argument, so + * make things easy to evaluate at compile time: + */ +static cairo_always_inline uint32_t +cvt (uint32_t val) +{ + switch (val) { + case 0: return 0; + case 1: return 1; + case 2: return 2; + case 4: return 3; + case 8: return 4; + case 16: return 5; + case 32: return 6; + } + return 0; +} + +static cairo_always_inline struct brw_reg +stride (struct brw_reg reg, + uint32_t vstride, + uint32_t width, + uint32_t hstride) +{ + reg.vstride = cvt (vstride); + reg.width = cvt (width) - 1; + reg.hstride = cvt (hstride); + return reg; +} + +static cairo_always_inline struct brw_reg +vec16 (struct brw_reg reg) +{ + return stride (reg, 16,16,1); +} + +static cairo_always_inline struct brw_reg +vec8 (struct brw_reg reg) +{ + return stride (reg, 8,8,1); +} + +static cairo_always_inline struct brw_reg +vec4 (struct brw_reg reg) +{ + return stride (reg, 4,4,1); +} + +static cairo_always_inline struct brw_reg +vec2 (struct brw_reg reg) +{ + return stride (reg, 2,2,1); +} + +static cairo_always_inline struct brw_reg +vec1 (struct brw_reg reg) +{ + return stride (reg, 0,1,0); +} + +static cairo_always_inline struct brw_reg +get_element (struct brw_reg reg, uint32_t elt) +{ + return vec1 (suboffset (reg, elt)); +} + +static cairo_always_inline struct brw_reg +get_element_ud (struct brw_reg reg, uint32_t elt) +{ + return vec1 (suboffset (retype (reg, BRW_REGISTER_TYPE_UD), elt)); +} + +static cairo_always_inline struct brw_reg +brw_swizzle (struct brw_reg reg, + uint32_t x, + uint32_t y, + uint32_t z, + uint32_t w) +{ + reg.dw1.bits.swizzle = BRW_SWIZZLE4 (BRW_GET_SWZ (reg.dw1.bits.swizzle, x), + BRW_GET_SWZ (reg.dw1.bits.swizzle, y), + BRW_GET_SWZ (reg.dw1.bits.swizzle, z), + BRW_GET_SWZ (reg.dw1.bits.swizzle, w)); + return reg; +} + +static cairo_always_inline struct brw_reg +brw_swizzle1 (struct brw_reg reg, + uint32_t x) +{ + return brw_swizzle (reg, x, x, x, x); +} + +static cairo_always_inline struct brw_reg +brw_writemask (struct brw_reg reg, + uint32_t mask) +{ + reg.dw1.bits.writemask &= mask; + return reg; +} + +static cairo_always_inline struct brw_reg +brw_set_writemask (struct brw_reg reg, + uint32_t mask) +{ + reg.dw1.bits.writemask = mask; + return reg; +} + +static cairo_always_inline struct brw_reg +negate (struct brw_reg reg) +{ + reg.negate ^= 1; + return reg; +} + +static cairo_always_inline struct brw_reg +brw_abs (struct brw_reg reg) +{ + reg.abs = 1; + return reg; +} + +static cairo_always_inline struct brw_reg +brw_vec4_indirect (uint32_t subnr, + int32_t offset) +{ + struct brw_reg reg = brw_vec4_grf (0, 0); + reg.subnr = subnr; + reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER; + reg.dw1.bits.indirect_offset = offset; + return reg; +} + +static cairo_always_inline struct brw_reg +brw_vec1_indirect (uint32_t subnr, + int32_t offset) +{ + struct brw_reg reg = brw_vec1_grf (0, 0); + reg.subnr = subnr; + reg.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER; + reg.dw1.bits.indirect_offset = offset; + return reg; +} + +static cairo_always_inline struct brw_reg +deref_4f (struct brw_indirect ptr, int32_t offset) +{ + return brw_vec4_indirect (ptr.addr_subnr, ptr.addr_offset + offset); +} + +static cairo_always_inline struct brw_reg +deref_1f(struct brw_indirect ptr, int32_t offset) +{ + return brw_vec1_indirect (ptr.addr_subnr, ptr.addr_offset + offset); +} + +static cairo_always_inline struct brw_reg +deref_4b(struct brw_indirect ptr, int32_t offset) +{ + return retype (deref_4f (ptr, offset), BRW_REGISTER_TYPE_B); +} + +static cairo_always_inline struct brw_reg +deref_1uw(struct brw_indirect ptr, int32_t offset) +{ + return retype (deref_1f (ptr, offset), BRW_REGISTER_TYPE_UW); +} + +static cairo_always_inline struct brw_reg +deref_1d (struct brw_indirect ptr, int32_t offset) +{ + return retype (deref_1f (ptr, offset), BRW_REGISTER_TYPE_D); +} + +static cairo_always_inline struct brw_reg +deref_1ud (struct brw_indirect ptr, int32_t offset) +{ + return retype (deref_1f (ptr, offset), BRW_REGISTER_TYPE_UD); +} + +static cairo_always_inline struct brw_reg +get_addr_reg (struct brw_indirect ptr) +{ + return brw_address_reg (ptr.addr_subnr); +} + +static cairo_always_inline struct brw_indirect +brw_indirect_offset (struct brw_indirect ptr, int32_t offset) +{ + ptr.addr_offset += offset; + return ptr; +} + +static cairo_always_inline struct brw_indirect +brw_indirect (uint32_t addr_subnr, int32_t offset) +{ + struct brw_indirect ptr; + ptr.addr_subnr = addr_subnr; + ptr.addr_offset = offset; + ptr.pad = 0; + return ptr; +} + +static cairo_always_inline struct brw_instruction * +current_insn (struct brw_compile *p) +{ + return &p->store[p->nr_insn]; +} + +cairo_private void brw_pop_insn_state (struct brw_compile *p); +cairo_private void brw_push_insn_state (struct brw_compile *p); +cairo_private void brw_set_mask_control (struct brw_compile *p, uint32_t value); +cairo_private void brw_set_saturate (struct brw_compile *p, uint32_t value); +cairo_private void brw_set_access_mode (struct brw_compile *p, uint32_t access_mode); +cairo_private void brw_set_compression_control (struct brw_compile *p, int control); +cairo_private void brw_set_predicate_control_flag_value (struct brw_compile *p, uint32_t value); +cairo_private void brw_set_predicate_control (struct brw_compile *p, uint32_t pc); +cairo_private void brw_set_conditionalmod (struct brw_compile *p, uint32_t conditional); + +cairo_private void +brw_compile_init (struct brw_compile *p, + cairo_bool_t is_g4x); +cairo_private const uint32_t *brw_get_program (struct brw_compile *p, uint32_t *sz); + +/* Helpers for regular instructions: + */ +#define ALU1(OP) \ +cairo_private_no_warn struct brw_instruction * \ +brw_##OP(struct brw_compile *p, \ + struct brw_reg dest, \ + struct brw_reg src0); + +#define ALU2(OP) \ +cairo_private_no_warn struct brw_instruction * \ +brw_##OP(struct brw_compile *p, \ + struct brw_reg dest, \ + struct brw_reg src0, \ + struct brw_reg src1); + +ALU1(MOV) +ALU2(SEL) +ALU1(NOT) +ALU2(AND) +ALU2(OR) +ALU2(XOR) +ALU2(SHR) +ALU2(SHL) +ALU2(RSR) +ALU2(RSL) +ALU2(ASR) +ALU2(JMPI) +ALU2(ADD) +ALU2(MUL) +ALU1(FRC) +ALU1(RNDD) +ALU1(RNDZ) +ALU2(MAC) +ALU2(MACH) +ALU1(LZD) +ALU2(DP4) +ALU2(DPH) +ALU2(DP3) +ALU2(DP2) +ALU2(LINE) + +#undef ALU1 +#undef ALU2 + +/* Helpers for SEND instruction: */ +cairo_private void +brw_urb_WRITE (struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + struct brw_reg src0, + int allocate, + int used, + uint32_t msg_length, + uint32_t response_length, + int eot, + int writes_complete, + uint32_t offset, + uint32_t swizzle); + +cairo_private void +brw_fb_WRITE (struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + struct brw_reg src0, + uint32_t binding_table_index, + uint32_t msg_length, + uint32_t response_length, + int eot); + +cairo_private void +brw_SAMPLE (struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + struct brw_reg src0, + uint32_t binding_table_index, + uint32_t sampler, + uint32_t writemask, + uint32_t msg_type, + uint32_t response_length, + uint32_t msg_length, + cairo_bool_t eot); + +cairo_private void +brw_math_16 (struct brw_compile *p, + struct brw_reg dest, + uint32_t function, + uint32_t saturate, + uint32_t msg_reg_nr, + struct brw_reg src, + uint32_t precision); + +cairo_private void +brw_math (struct brw_compile *p, + struct brw_reg dest, + uint32_t function, + uint32_t saturate, + uint32_t msg_reg_nr, + struct brw_reg src, + uint32_t data_type, + uint32_t precision); + +cairo_private void +brw_dp_READ_16 (struct brw_compile *p, + struct brw_reg dest, + uint32_t msg_reg_nr, + uint32_t scratch_offset); + +cairo_private void +brw_dp_WRITE_16 (struct brw_compile *p, + struct brw_reg src, + uint32_t msg_reg_nr, + uint32_t scratch_offset); + +/* If/else/endif. Works by manipulating the execution flags on each + * channel. + */ +cairo_private struct brw_instruction * +brw_IF (struct brw_compile *p, + uint32_t execute_size); + +cairo_private struct brw_instruction * +brw_ELSE (struct brw_compile *p, + struct brw_instruction *if_insn); + +cairo_private void +brw_ENDIF (struct brw_compile *p, + struct brw_instruction *if_or_else_insn); + + +/* DO/WHILE loops: */ +cairo_private struct brw_instruction * +brw_DO (struct brw_compile *p, + uint32_t execute_size); + +cairo_private struct brw_instruction * +brw_WHILE (struct brw_compile *p, + struct brw_instruction *patch_insn); + +cairo_private struct brw_instruction * +brw_BREAK (struct brw_compile *p); + +cairo_private struct brw_instruction * +brw_CONT (struct brw_compile *p); + +/* Forward jumps: */ +cairo_private void +brw_land_fwd_jump (struct brw_compile *p, + struct brw_instruction *jmp_insn); + +cairo_private void +brw_NOP (struct brw_compile *p); + +/* Special case: there is never a destination, execution size will be + * taken from src0: + */ +cairo_private void +brw_CMP (struct brw_compile *p, + struct brw_reg dest, + uint32_t conditional, + struct brw_reg src0, + struct brw_reg src1); + +cairo_private void +brw_print_reg (struct brw_reg reg); + +cairo_private struct brw_instruction * +brw_next_instruction (struct brw_compile *p, + uint32_t opcode); + +cairo_private void +brw_instruction_set_destination (struct brw_instruction *insn, + struct brw_reg dest); + +cairo_private void +brw_instruction_set_source0 (struct brw_instruction *insn, + struct brw_reg reg); + +cairo_private void +brw_instruction_set_dp_write_message (struct brw_instruction *insn, + uint32_t binding_table_index, + uint32_t msg_control, + uint32_t msg_type, + uint32_t msg_length, + uint32_t pixel_scoreboard_clear, + uint32_t response_length, + uint32_t end_of_thread); + +/*********************************************************************** + * brw_eu_util.c: + */ + +cairo_private void +brw_copy_indirect_to_indirect (struct brw_compile *p, + struct brw_indirect dst_ptr, + struct brw_indirect src_ptr, + uint32_t count); + +cairo_private void +brw_copy_from_indirect (struct brw_compile *p, + struct brw_reg dst, + struct brw_indirect ptr, + uint32_t count); + +cairo_private void +brw_copy4 (struct brw_compile *p, + struct brw_reg dst, + struct brw_reg src, + uint32_t count); + +cairo_private void +brw_copy8 (struct brw_compile *p, + struct brw_reg dst, + struct brw_reg src, + uint32_t count); + +cairo_private void +brw_math_invert (struct brw_compile *p, + struct brw_reg dst, + struct brw_reg src); + +cairo_private void +brw_set_src1 (struct brw_instruction *insn, + struct brw_reg reg); + +#endif diff --git a/src/drm/cairo-drm-intel-brw-structs.h b/src/drm/cairo-drm-intel-brw-structs.h new file mode 100644 index 000000000..f42483ed1 --- /dev/null +++ b/src/drm/cairo-drm-intel-brw-structs.h @@ -0,0 +1,1328 @@ +/************************************************************************** + * + * Copyright 2005 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef CAIRO_DRM_INTEL_BRW_STRUCTS_H +#define CAIRO_DRM_INTEL_BRW_STRUCTS_H + +#include "cairo-types-private.h" + +/* Command packets: +*/ +struct header { + unsigned int length:16; + unsigned int opcode:16; +}; + +union header_union { + struct header bits; + unsigned int dword; +}; + +struct brw_3d_control { + struct { + unsigned int length:8; + unsigned int notify_enable:1; + unsigned int pad:3; + unsigned int wc_flush_enable:1; + unsigned int depth_stall_enable:1; + unsigned int operation:2; + unsigned int opcode:16; + } header; + + struct { + unsigned int pad:2; + unsigned int dest_addr_type:1; + unsigned int dest_addr:29; + } dest; + + unsigned int dword2; + unsigned int dword3; +}; + + +struct brw_3d_primitive { + struct { + unsigned int length:8; + unsigned int pad:2; + unsigned int topology:5; + unsigned int indexed:1; + unsigned int opcode:16; + } header; + + unsigned int verts_per_instance; + unsigned int start_vert_location; + unsigned int instance_count; + unsigned int start_instance_location; + unsigned int base_vert_location; +}; + +/* These seem to be passed around as function args, so it works out + * better to keep them as #defines: + */ +#define BRW_FLUSH_READ_CACHE 0x1 +#define BRW_FLUSH_STATE_CACHE 0x2 +#define BRW_INHIBIT_FLUSH_RENDER_CACHE 0x4 +#define BRW_FLUSH_SNAPSHOT_COUNTERS 0x8 + +struct brw_mi_flush { + unsigned int flags:4; + unsigned int pad:12; + unsigned int opcode:16; +}; + +struct brw_vf_statistics { + unsigned int statistics_enable:1; + unsigned int pad:15; + unsigned int opcode:16; +}; + + +struct brw_binding_table_pointers { + struct header header; + unsigned int vs; + unsigned int gs; + unsigned int clp; + unsigned int sf; + unsigned int wm; +}; + +struct brw_blend_constant_color { + struct header header; + float blend_constant_color[4]; +}; + +struct brw_depthbuffer { + union header_union header; + + union { + struct { + unsigned int pitch:18; + unsigned int format:3; + unsigned int pad:4; + unsigned int depth_offset_disable:1; + unsigned int tile_walk:1; + unsigned int tiled_surface:1; + unsigned int pad2:1; + unsigned int surface_type:3; + } bits; + unsigned int dword; + } dword1; + + unsigned int dword2_base_addr; + + union { + struct { + unsigned int pad:1; + unsigned int mipmap_layout:1; + unsigned int lod:4; + unsigned int width:13; + unsigned int height:13; + } bits; + unsigned int dword; + } dword3; + + union { + struct { + unsigned int pad:12; + unsigned int min_array_element:9; + unsigned int depth:11; + } bits; + unsigned int dword; + } dword4; +}; + +struct brw_drawrect { + struct header header; + unsigned int xmin:16; + unsigned int ymin:16; + unsigned int xmax:16; + unsigned int ymax:16; + unsigned int xorg:16; + unsigned int yorg:16; +}; + +struct brw_global_depth_offset_clamp { + struct header header; + float depth_offset_clamp; +}; + +struct brw_indexbuffer { + union { + struct { + unsigned int length:8; + unsigned int index_format:2; + unsigned int cut_index_enable:1; + unsigned int pad:5; + unsigned int opcode:16; + } bits; + unsigned int dword; + } header; + unsigned int buffer_start; + unsigned int buffer_end; +}; + + +struct brw_line_stipple { + struct header header; + + struct { + unsigned int pattern:16; + unsigned int pad:16; + } bits0; + + struct { + unsigned int repeat_count:9; + unsigned int pad:7; + unsigned int inverse_repeat_count:16; + } bits1; +}; + +struct brw_pipelined_state_pointers { + struct header header; + + struct { + unsigned int pad:5; + unsigned int offset:27; + } vs; + + struct { + unsigned int enable:1; + unsigned int pad:4; + unsigned int offset:27; + } gs; + + struct { + unsigned int enable:1; + unsigned int pad:4; + unsigned int offset:27; + } clp; + + struct { + unsigned int pad:5; + unsigned int offset:27; + } sf; + + struct { + unsigned int pad:5; + unsigned int offset:27; + } wm; + + struct { + unsigned int pad:6; + unsigned int offset:26; + } cc; +}; + +struct brw_polygon_stipple_offset { + struct header header; + + struct { + unsigned int y_offset:5; + unsigned int pad:3; + unsigned int x_offset:5; + unsigned int pad0:19; + } bits0; +}; + +struct brw_polygon_stipple { + struct header header; + unsigned int stipple[32]; +}; + +struct brw_pipeline_select { + struct { + unsigned int pipeline_select:1; + unsigned int pad:15; + unsigned int opcode:16; + } header; +}; + +struct brw_pipe_control { + struct { + unsigned int length:8; + unsigned int notify_enable:1; + unsigned int pad:2; + unsigned int instruction_state_cache_flush_enable:1; + unsigned int write_cache_flush_enable:1; + unsigned int depth_stall_enable:1; + unsigned int post_sync_operation:2; + + unsigned int opcode:16; + } header; + + struct { + unsigned int pad:2; + unsigned int dest_addr_type:1; + unsigned int dest_addr:29; + } bits1; + + unsigned int data0; + unsigned int data1; +}; + + +struct brw_urb_fence { + struct { + unsigned int length:8; + unsigned int vs_realloc:1; + unsigned int gs_realloc:1; + unsigned int clp_realloc:1; + unsigned int sf_realloc:1; + unsigned int vfe_realloc:1; + unsigned int cs_realloc:1; + unsigned int pad:2; + unsigned int opcode:16; + } header; + + struct { + unsigned int vs_fence:10; + unsigned int gs_fence:10; + unsigned int clp_fence:10; + unsigned int pad:2; + } bits0; + + struct { + unsigned int sf_fence:10; + unsigned int vf_fence:10; + unsigned int cs_fence:10; + unsigned int pad:2; + } bits1; +}; + +struct brw_constant_buffer_state { + struct header header; + + struct { + unsigned int nr_urb_entries:3; + unsigned int pad:1; + unsigned int urb_entry_size:5; + unsigned int pad0:23; + } bits0; +}; + +struct brw_constant_buffer { + struct { + unsigned int length:8; + unsigned int valid:1; + unsigned int pad:7; + unsigned int opcode:16; + } header; + + struct { + unsigned int buffer_length:6; + unsigned int buffer_address:26; + } bits0; +}; + +struct brw_state_base_address { + struct header header; + + struct { + unsigned int modify_enable:1; + unsigned int pad:4; + unsigned int general_state_address:27; + } bits0; + + struct { + unsigned int modify_enable:1; + unsigned int pad:4; + unsigned int surface_state_address:27; + } bits1; + + struct { + unsigned int modify_enable:1; + unsigned int pad:4; + unsigned int indirect_object_state_address:27; + } bits2; + + struct { + unsigned int modify_enable:1; + unsigned int pad:11; + unsigned int general_state_upper_bound:20; + } bits3; + + struct { + unsigned int modify_enable:1; + unsigned int pad:11; + unsigned int indirect_object_state_upper_bound:20; + } bits4; +}; + +struct brw_state_prefetch { + struct header header; + + struct { + unsigned int prefetch_count:3; + unsigned int pad:3; + unsigned int prefetch_pointer:26; + } bits0; +}; + +struct brw_system_instruction_pointer { + struct header header; + + struct { + unsigned int pad:4; + unsigned int system_instruction_pointer:28; + } bits0; +}; + + +/* State structs for the various fixed function units: +*/ + +struct thread0 { + unsigned int pad0:1; + unsigned int grf_reg_count:3; + unsigned int pad1:2; + unsigned int kernel_start_pointer:26; +}; + +struct thread1 { + unsigned int ext_halt_exception_enable:1; + unsigned int sw_exception_enable:1; + unsigned int mask_stack_exception_enable:1; + unsigned int timeout_exception_enable:1; + unsigned int illegal_op_exception_enable:1; + unsigned int pad0:3; + unsigned int depth_coef_urb_read_offset:6; /* WM only */ + unsigned int pad1:2; + unsigned int floating_point_mode:1; + unsigned int thread_priority:1; + unsigned int binding_table_entry_count:8; + unsigned int pad3:5; + unsigned int single_program_flow:1; +}; + +struct thread2 { + unsigned int per_thread_scratch_space:4; + unsigned int pad0:6; + unsigned int scratch_space_base_pointer:22; +}; + +struct thread3 { + unsigned int dispatch_grf_start_reg:4; + unsigned int urb_entry_read_offset:6; + unsigned int pad0:1; + unsigned int urb_entry_read_length:6; + unsigned int pad1:1; + unsigned int const_urb_entry_read_offset:6; + unsigned int pad2:1; + unsigned int const_urb_entry_read_length:6; + unsigned int pad3:1; +}; + +struct brw_clip_unit_state { + struct thread0 thread0; + struct thread1 thread1; + struct thread2 thread2; + struct thread3 thread3; + + struct { + unsigned int pad0:9; + unsigned int gs_output_stats:1; /* not always */ + unsigned int stats_enable:1; + unsigned int nr_urb_entries:7; + unsigned int pad1:1; + unsigned int urb_entry_allocation_size:5; + unsigned int pad2:1; + unsigned int max_threads:6; /* may be less */ + unsigned int pad3:1; + } thread4; + + struct { + unsigned int pad0:13; + unsigned int clip_mode:3; + unsigned int userclip_enable_flags:8; + unsigned int userclip_must_clip:1; + unsigned int pad1:1; + unsigned int guard_band_enable:1; + unsigned int viewport_z_clip_enable:1; + unsigned int viewport_xy_clip_enable:1; + unsigned int vertex_position_space:1; + unsigned int api_mode:1; + unsigned int pad2:1; + } clip5; + + struct { + unsigned int pad0:5; + unsigned int clipper_viewport_state_ptr:27; + } clip6; + + float viewport_xmin; + float viewport_xmax; + float viewport_ymin; + float viewport_ymax; +}; + +struct brw_cc_unit_state { + struct { + unsigned int pad0:3; + unsigned int bf_stencil_pass_depth_pass_op:3; + unsigned int bf_stencil_pass_depth_fail_op:3; + unsigned int bf_stencil_fail_op:3; + unsigned int bf_stencil_func:3; + unsigned int bf_stencil_enable:1; + unsigned int pad1:2; + unsigned int stencil_write_enable:1; + unsigned int stencil_pass_depth_pass_op:3; + unsigned int stencil_pass_depth_fail_op:3; + unsigned int stencil_fail_op:3; + unsigned int stencil_func:3; + unsigned int stencil_enable:1; + } cc0; + + struct { + unsigned int bf_stencil_ref:8; + unsigned int stencil_write_mask:8; + unsigned int stencil_test_mask:8; + unsigned int stencil_ref:8; + } cc1; + + struct { + unsigned int logicop_enable:1; + unsigned int pad0:10; + unsigned int depth_write_enable:1; + unsigned int depth_test_function:3; + unsigned int depth_test:1; + unsigned int bf_stencil_write_mask:8; + unsigned int bf_stencil_test_mask:8; + } cc2; + + struct { + unsigned int pad0:8; + unsigned int alpha_test_func:3; + unsigned int alpha_test:1; + unsigned int blend_enable:1; + unsigned int ia_blend_enable:1; + unsigned int pad1:1; + unsigned int alpha_test_format:1; + unsigned int pad2:16; + } cc3; + + struct { + unsigned int pad0:5; + unsigned int cc_viewport_state_offset:27; + } cc4; + + struct { + unsigned int pad0:2; + unsigned int ia_dest_blend_factor:5; + unsigned int ia_src_blend_factor:5; + unsigned int ia_blend_function:3; + unsigned int statistics_enable:1; + unsigned int logicop_func:4; + unsigned int pad1:11; + unsigned int dither_enable:1; + } cc5; + + struct { + unsigned int clamp_post_alpha_blend:1; + unsigned int clamp_pre_alpha_blend:1; + unsigned int clamp_range:2; + unsigned int pad0:11; + unsigned int y_dither_offset:2; + unsigned int x_dither_offset:2; + unsigned int dest_blend_factor:5; + unsigned int src_blend_factor:5; + unsigned int blend_function:3; + } cc6; + + struct { + union { + float f; + unsigned char ub[4]; + } alpha_ref; + } cc7; +}; + +struct brw_sf_unit_state { + struct thread0 thread0; + struct { + unsigned int pad0:7; + unsigned int sw_exception_enable:1; + unsigned int pad1:3; + unsigned int mask_stack_exception_enable:1; + unsigned int pad2:1; + unsigned int illegal_op_exception_enable:1; + unsigned int pad3:2; + unsigned int floating_point_mode:1; + unsigned int thread_priority:1; + unsigned int binding_table_entry_count:8; + unsigned int pad4:5; + unsigned int single_program_flow:1; + } sf1; + + struct thread2 thread2; + struct thread3 thread3; + + struct { + unsigned int pad0:10; + unsigned int stats_enable:1; + unsigned int nr_urb_entries:7; + unsigned int pad1:1; + unsigned int urb_entry_allocation_size:5; + unsigned int pad2:1; + unsigned int max_threads:6; + unsigned int pad3:1; + } thread4; + + struct { + unsigned int front_winding:1; + unsigned int viewport_transform:1; + unsigned int pad0:3; + unsigned int sf_viewport_state_offset:27; + } sf5; + + struct { + unsigned int pad0:9; + unsigned int dest_org_vbias:4; + unsigned int dest_org_hbias:4; + unsigned int scissor:1; + unsigned int disable_2x2_trifilter:1; + unsigned int disable_zero_pix_trifilter:1; + unsigned int point_rast_rule:2; + unsigned int line_endcap_aa_region_width:2; + unsigned int line_width:4; + unsigned int fast_scissor_disable:1; + unsigned int cull_mode:2; + unsigned int aa_enable:1; + } sf6; + + struct { + unsigned int point_size:11; + unsigned int use_point_size_state:1; + unsigned int subpixel_precision:1; + unsigned int sprite_point:1; + unsigned int pad0:11; + unsigned int trifan_pv:2; + unsigned int linestrip_pv:2; + unsigned int tristrip_pv:2; + unsigned int line_last_pixel_enable:1; + } sf7; +}; + +struct brw_gs_unit_state { + struct thread0 thread0; + struct thread1 thread1; + struct thread2 thread2; + struct thread3 thread3; + + struct { + unsigned int pad0:10; + unsigned int stats_enable:1; + unsigned int nr_urb_entries:7; + unsigned int pad1:1; + unsigned int urb_entry_allocation_size:5; + unsigned int pad2:1; + unsigned int max_threads:1; + unsigned int pad3:6; + } thread4; + + struct { + unsigned int sampler_count:3; + unsigned int pad0:2; + unsigned int sampler_state_pointer:27; + } gs5; + + struct { + unsigned int max_vp_index:4; + unsigned int pad0:26; + unsigned int reorder_enable:1; + unsigned int pad1:1; + } gs6; +}; + +struct brw_vs_unit_state { + struct thread0 thread0; + struct thread1 thread1; + struct thread2 thread2; + struct thread3 thread3; + + struct { + unsigned int pad0:10; + unsigned int stats_enable:1; + unsigned int nr_urb_entries:7; + unsigned int pad1:1; + unsigned int urb_entry_allocation_size:5; + unsigned int pad2:1; + unsigned int max_threads:4; + unsigned int pad3:3; + } thread4; + + struct { + unsigned int sampler_count:3; + unsigned int pad0:2; + unsigned int sampler_state_pointer:27; + } vs5; + + struct { + unsigned int vs_enable:1; + unsigned int vert_cache_disable:1; + unsigned int pad0:30; + } vs6; +}; + +struct brw_wm_unit_state { + struct thread0 thread0; + struct thread1 thread1; + struct thread2 thread2; + struct thread3 thread3; + + struct { + unsigned int stats_enable:1; + unsigned int pad0:1; + unsigned int sampler_count:3; + unsigned int sampler_state_pointer:27; + } wm4; + + struct { + unsigned int enable_8_pix:1; + unsigned int enable_16_pix:1; + unsigned int enable_32_pix:1; + unsigned int pad0:7; + unsigned int legacy_global_depth_bias:1; + unsigned int line_stipple:1; + unsigned int depth_offset:1; + unsigned int polygon_stipple:1; + unsigned int line_aa_region_width:2; + unsigned int line_endcap_aa_region_width:2; + unsigned int early_depth_test:1; + unsigned int thread_dispatch_enable:1; + unsigned int program_uses_depth:1; + unsigned int program_computes_depth:1; + unsigned int program_uses_killpixel:1; + unsigned int legacy_line_rast: 1; + unsigned int transposed_urb_read:1; + unsigned int max_threads:7; + } wm5; + + float global_depth_offset_constant; + float global_depth_offset_scale; +}; + +/* The hardware supports two different modes for border color. The + * default (OpenGL) mode uses floating-point color channels, while the + * legacy mode uses 4 bytes. + * + * More significantly, the legacy mode respects the components of the + * border color for channels not present in the source, (whereas the + * default mode will ignore the border color's alpha channel and use + * alpha==1 for an RGB source, for example). + * + * The legacy mode matches the semantics specified by the Render + * extension. + */ +struct brw_sampler_default_border_color { + float color[4]; +}; + +struct brw_sampler_legacy_border_color { + uint8_t color[4]; +}; + +struct brw_sampler_state { + struct { + unsigned int shadow_function:3; + unsigned int lod_bias:11; + unsigned int min_filter:3; + unsigned int mag_filter:3; + unsigned int mip_filter:2; + unsigned int base_level:5; + unsigned int pad:1; + unsigned int lod_preclamp:1; + unsigned int border_color_mode:1; + unsigned int pad0:1; + unsigned int disable:1; + } ss0; + + struct { + unsigned int r_wrap_mode:3; + unsigned int t_wrap_mode:3; + unsigned int s_wrap_mode:3; + unsigned int pad:3; + unsigned int max_lod:10; + unsigned int min_lod:10; + } ss1; + + struct { + unsigned int pad:5; + unsigned int border_color_pointer:27; + } ss2; + + struct { + unsigned int pad:19; + unsigned int max_aniso:3; + unsigned int chroma_key_mode:1; + unsigned int chroma_key_index:2; + unsigned int chroma_key_enable:1; + unsigned int monochrome_filter_width:3; + unsigned int monochrome_filter_height:3; + } ss3; +}; + +struct brw_clipper_viewport { + float xmin; + float xmax; + float ymin; + float ymax; +}; + +struct brw_cc_viewport { + float min_depth; + float max_depth; +}; + +struct brw_sf_viewport { + struct { + float m00; + float m11; + float m22; + float m30; + float m31; + float m32; + } viewport; + + struct { + short xmin; + short ymin; + short xmax; + short ymax; + } scissor; +}; + +/* Documented in the subsystem/shared-functions/sampler chapter... +*/ +struct brw_surface_state { + struct { + unsigned int cube_pos_z:1; + unsigned int cube_neg_z:1; + unsigned int cube_pos_y:1; + unsigned int cube_neg_y:1; + unsigned int cube_pos_x:1; + unsigned int cube_neg_x:1; + unsigned int pad:3; + unsigned int render_cache_read_mode:1; + unsigned int mipmap_layout_mode:1; + unsigned int vert_line_stride_ofs:1; + unsigned int vert_line_stride:1; + unsigned int color_blend:1; + unsigned int writedisable_blue:1; + unsigned int writedisable_green:1; + unsigned int writedisable_red:1; + unsigned int writedisable_alpha:1; + unsigned int surface_format:9; + unsigned int data_return_format:1; + unsigned int pad0:1; + unsigned int surface_type:3; + } ss0; + + struct { + unsigned int base_addr; + } ss1; + + struct { + unsigned int render_target_rotation:2; + unsigned int mip_count:4; + unsigned int width:13; + unsigned int height:13; + } ss2; + + struct { + unsigned int tile_walk:1; + unsigned int tiled_surface:1; + unsigned int pad:1; + unsigned int pitch:18; + unsigned int depth:11; + } ss3; + + struct { + unsigned int pad:19; + unsigned int min_array_elt:9; + unsigned int min_lod:4; + } ss4; + + struct { + unsigned int pad:20; + unsigned int y_offset:4; + unsigned int pad2:1; + unsigned int x_offset:7; + } ss5; +}; + +struct brw_vertex_buffer_state { + struct { + unsigned int pitch:11; + unsigned int pad:15; + unsigned int access_type:1; + unsigned int vb_index:5; + } vb0; + + unsigned int start_addr; + unsigned int max_index; +#if 1 + unsigned int instance_data_step_rate; /* not included for sequential/random vertices? */ +#endif +}; + +#define BRW_VBP_MAX 17 + +struct brw_vb_array_state { + struct header header; + struct brw_vertex_buffer_state vb[BRW_VBP_MAX]; +}; + +struct brw_vertex_element_state { + struct { + unsigned int src_offset:11; + unsigned int pad:5; + unsigned int src_format:9; + unsigned int pad0:1; + unsigned int valid:1; + unsigned int vertex_buffer_index:5; + } ve0; + + struct { + unsigned int dst_offset:8; + unsigned int pad:8; + unsigned int vfcomponent3:4; + unsigned int vfcomponent2:4; + unsigned int vfcomponent1:4; + unsigned int vfcomponent0:4; + } ve1; +}; + +#define BRW_VEP_MAX 18 + +struct brw_vertex_element_packet { + struct header header; + struct brw_vertex_element_state ve[BRW_VEP_MAX]; +}; + +struct brw_urb_immediate { + unsigned int opcode:4; + unsigned int offset:6; + unsigned int swizzle_control:2; + unsigned int pad:1; + unsigned int allocate:1; + unsigned int used:1; + unsigned int complete:1; + unsigned int response_length:4; + unsigned int msg_length:4; + unsigned int msg_target:4; + unsigned int pad1:3; + unsigned int end_of_thread:1; +}; + +/* Instruction format for the execution units: */ + +struct brw_instruction { + struct { + unsigned int opcode:7; + unsigned int pad:1; + unsigned int access_mode:1; + unsigned int mask_control:1; + unsigned int dependency_control:2; + unsigned int compression_control:2; + unsigned int thread_control:2; + unsigned int predicate_control:4; + unsigned int predicate_inverse:1; + unsigned int execution_size:3; + unsigned int destreg__conditonalmod:4; /* destreg - send, conditionalmod - others */ + unsigned int pad0:2; + unsigned int debug_control:1; + unsigned int saturate:1; + } header; + + union { + struct { + unsigned int dest_reg_file:2; + unsigned int dest_reg_type:3; + unsigned int src0_reg_file:2; + unsigned int src0_reg_type:3; + unsigned int src1_reg_file:2; + unsigned int src1_reg_type:3; + unsigned int pad:1; + unsigned int dest_subreg_nr:5; + unsigned int dest_reg_nr:8; + unsigned int dest_horiz_stride:2; + unsigned int dest_address_mode:1; + } da1; + + struct { + unsigned int dest_reg_file:2; + unsigned int dest_reg_type:3; + unsigned int src0_reg_file:2; + unsigned int src0_reg_type:3; + unsigned int pad:6; + int dest_indirect_offset:10; /* offset against the deref'd address reg */ + unsigned int dest_subreg_nr:3; /* subnr for the address reg a0.x */ + unsigned int dest_horiz_stride:2; + unsigned int dest_address_mode:1; + } ia1; + + struct { + unsigned int dest_reg_file:2; + unsigned int dest_reg_type:3; + unsigned int src0_reg_file:2; + unsigned int src0_reg_type:3; + unsigned int src1_reg_file:2; + unsigned int src1_reg_type:3; + unsigned int pad0:1; + unsigned int dest_writemask:4; + unsigned int dest_subreg_nr:1; + unsigned int dest_reg_nr:8; + unsigned int pad1:2; + unsigned int dest_address_mode:1; + } da16; + + struct { + unsigned int dest_reg_file:2; + unsigned int dest_reg_type:3; + unsigned int src0_reg_file:2; + unsigned int src0_reg_type:3; + unsigned int pad0:6; + unsigned int dest_writemask:4; + int dest_indirect_offset:6; + unsigned int dest_subreg_nr:3; + unsigned int pad1:2; + unsigned int dest_address_mode:1; + } ia16; + } bits1; + + + union { + struct { + unsigned int src0_subreg_nr:5; + unsigned int src0_reg_nr:8; + unsigned int src0_abs:1; + unsigned int src0_negate:1; + unsigned int src0_address_mode:1; + unsigned int src0_horiz_stride:2; + unsigned int src0_width:3; + unsigned int src0_vert_stride:4; + unsigned int flag_reg_nr:1; + unsigned int pad:6; + } da1; + + struct { + int src0_indirect_offset:10; + unsigned int src0_subreg_nr:3; + unsigned int src0_abs:1; + unsigned int src0_negate:1; + unsigned int src0_address_mode:1; + unsigned int src0_horiz_stride:2; + unsigned int src0_width:3; + unsigned int src0_vert_stride:4; + unsigned int flag_reg_nr:1; + unsigned int pad:6; + } ia1; + + struct { + unsigned int src0_swz_x:2; + unsigned int src0_swz_y:2; + unsigned int src0_subreg_nr:1; + unsigned int src0_reg_nr:8; + unsigned int src0_abs:1; + unsigned int src0_negate:1; + unsigned int src0_address_mode:1; + unsigned int src0_swz_z:2; + unsigned int src0_swz_w:2; + unsigned int pad0:1; + unsigned int src0_vert_stride:4; + unsigned int flag_reg_nr:1; + unsigned int pad1:6; + } da16; + + struct { + unsigned int src0_swz_x:2; + unsigned int src0_swz_y:2; + int src0_indirect_offset:6; + unsigned int src0_subreg_nr:3; + unsigned int src0_abs:1; + unsigned int src0_negate:1; + unsigned int src0_address_mode:1; + unsigned int src0_swz_z:2; + unsigned int src0_swz_w:2; + unsigned int pad0:1; + unsigned int src0_vert_stride:4; + unsigned int flag_reg_nr:1; + unsigned int pad1:6; + } ia16; + + } bits2; + + union { + struct { + unsigned int src1_subreg_nr:5; + unsigned int src1_reg_nr:8; + unsigned int src1_abs:1; + unsigned int src1_negate:1; + unsigned int pad:1; + unsigned int src1_horiz_stride:2; + unsigned int src1_width:3; + unsigned int src1_vert_stride:4; + unsigned int pad0:7; + } da1; + + struct { + unsigned int src1_swz_x:2; + unsigned int src1_swz_y:2; + unsigned int src1_subreg_nr:1; + unsigned int src1_reg_nr:8; + unsigned int src1_abs:1; + unsigned int src1_negate:1; + unsigned int pad0:1; + unsigned int src1_swz_z:2; + unsigned int src1_swz_w:2; + unsigned int pad1:1; + unsigned int src1_vert_stride:4; + unsigned int pad2:7; + } da16; + + struct { + int src1_indirect_offset:10; + unsigned int src1_subreg_nr:3; + unsigned int src1_abs:1; + unsigned int src1_negate:1; + unsigned int pad0:1; + unsigned int src1_horiz_stride:2; + unsigned int src1_width:3; + unsigned int src1_vert_stride:4; + unsigned int flag_reg_nr:1; + unsigned int pad1:6; + } ia1; + + struct { + unsigned int src1_swz_x:2; + unsigned int src1_swz_y:2; + int src1_indirect_offset:6; + unsigned int src1_subreg_nr:3; + unsigned int src1_abs:1; + unsigned int src1_negate:1; + unsigned int pad0:1; + unsigned int src1_swz_z:2; + unsigned int src1_swz_w:2; + unsigned int pad1:1; + unsigned int src1_vert_stride:4; + unsigned int flag_reg_nr:1; + unsigned int pad2:6; + } ia16; + + struct { + int jump_count:16; /* note: signed */ + unsigned int pop_count:4; + unsigned int pad0:12; + } if_else; + + struct { + unsigned int function:4; + unsigned int int_type:1; + unsigned int precision:1; + unsigned int saturate:1; + unsigned int data_type:1; + unsigned int pad0:8; + unsigned int response_length:4; + unsigned int msg_length:4; + unsigned int msg_target:4; + unsigned int pad1:3; + unsigned int end_of_thread:1; + } math; + + struct { + unsigned int binding_table_index:8; + unsigned int sampler:4; + unsigned int return_format:2; + unsigned int msg_type:2; + unsigned int response_length:4; + unsigned int msg_length:4; + unsigned int msg_target:4; + unsigned int pad1:3; + unsigned int end_of_thread:1; + } sampler; + + struct { + uint32_t binding_table_index:8; + uint32_t sampler:4; + uint32_t msg_type:4; + uint32_t response_length:4; + uint32_t msg_length:4; + uint32_t msg_target:4; + uint32_t pad1:3; + uint32_t end_of_thread:1; + } sampler_g4x; + + struct brw_urb_immediate urb; + + struct { + unsigned int binding_table_index:8; + unsigned int msg_control:4; + unsigned int msg_type:2; + unsigned int target_cache:2; + unsigned int response_length:4; + unsigned int msg_length:4; + unsigned int msg_target:4; + unsigned int pad1:3; + unsigned int end_of_thread:1; + } dp_read; + + struct { + unsigned int binding_table_index:8; + unsigned int msg_control:3; + unsigned int pixel_scoreboard_clear:1; + unsigned int msg_type:3; + unsigned int send_commit_msg:1; + unsigned int response_length:4; + unsigned int msg_length:4; + unsigned int msg_target:4; + unsigned int pad1:3; + unsigned int end_of_thread:1; + } dp_write; + + struct { + unsigned int pad:16; + unsigned int response_length:4; + unsigned int msg_length:4; + unsigned int msg_target:4; + unsigned int pad1:3; + unsigned int end_of_thread:1; + } generic; + + uint32_t ud; + int32_t d; + } bits3; +}; + +/* media pipeline */ + +struct brw_vfe_state { + struct { + unsigned int per_thread_scratch_space:4; + unsigned int pad3:3; + unsigned int extend_vfe_state_present:1; + unsigned int pad2:2; + unsigned int scratch_base:22; + } vfe0; + + struct { + unsigned int debug_counter_control:2; + unsigned int children_present:1; + unsigned int vfe_mode:4; + unsigned int pad2:2; + unsigned int num_urb_entries:7; + unsigned int urb_entry_alloc_size:9; + unsigned int max_threads:7; + } vfe1; + + struct { + unsigned int pad4:4; + unsigned int interface_descriptor_base:28; + } vfe2; +}; + +struct brw_vld_state { + struct { + unsigned int pad6:6; + unsigned int scan_order:1; + unsigned int intra_vlc_format:1; + unsigned int quantizer_scale_type:1; + unsigned int concealment_motion_vector:1; + unsigned int frame_predict_frame_dct:1; + unsigned int top_field_first:1; + unsigned int picture_structure:2; + unsigned int intra_dc_precision:2; + unsigned int f_code_0_0:4; + unsigned int f_code_0_1:4; + unsigned int f_code_1_0:4; + unsigned int f_code_1_1:4; + } vld0; + + struct { + unsigned int pad2:9; + unsigned int picture_coding_type:2; + unsigned int pad:21; + } vld1; + + struct { + unsigned int index_0:4; + unsigned int index_1:4; + unsigned int index_2:4; + unsigned int index_3:4; + unsigned int index_4:4; + unsigned int index_5:4; + unsigned int index_6:4; + unsigned int index_7:4; + } desc_remap_table0; + + struct { + unsigned int index_8:4; + unsigned int index_9:4; + unsigned int index_10:4; + unsigned int index_11:4; + unsigned int index_12:4; + unsigned int index_13:4; + unsigned int index_14:4; + unsigned int index_15:4; + } desc_remap_table1; +}; + +struct brw_interface_descriptor { + struct { + unsigned int grf_reg_blocks:4; + unsigned int pad:2; + unsigned int kernel_start_pointer:26; + } desc0; + + struct { + unsigned int pad:7; + unsigned int software_exception:1; + unsigned int pad2:3; + unsigned int maskstack_exception:1; + unsigned int pad3:1; + unsigned int illegal_opcode_exception:1; + unsigned int pad4:2; + unsigned int floating_point_mode:1; + unsigned int thread_priority:1; + unsigned int single_program_flow:1; + unsigned int pad5:1; + unsigned int const_urb_entry_read_offset:6; + unsigned int const_urb_entry_read_len:6; + } desc1; + + struct { + unsigned int pad:2; + unsigned int sampler_count:3; + unsigned int sampler_state_pointer:27; + } desc2; + + struct { + unsigned int binding_table_entry_count:5; + unsigned int binding_table_pointer:27; + } desc3; +}; + +#endif diff --git a/src/drm/cairo-drm-intel-command-private.h b/src/drm/cairo-drm-intel-command-private.h new file mode 100644 index 000000000..a93ac12ab --- /dev/null +++ b/src/drm/cairo-drm-intel-command-private.h @@ -0,0 +1,909 @@ +/************************************************************************** + * + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef CAIRO_DRM_INTEL_COMMAND_PRIVATE_H +#define CAIRO_DRM_INTEL_COMMAND_PRIVATE_H + +#include "cairo-types-private.h" + +#define CMD_MI (0x0 << 29) +#define CMD_misc (0x1 << 29) +#define CMD_2D (0x2 << 29) +#define CMD_3D (0x3 << 29) +/* 4-7 reserved */ + +#define MI_NOOP (CMD_MI | 0) +/* Batch */ +#define MI_BATCH_BUFFER (CMD_MI | (0x30 << 23) | 1) +#define MI_BATCH_BUFFER_START (CMD_MI | (0x31 << 23)) +#define MI_BATCH_BUFFER_END (CMD_MI | (0x0a << 23)) +#define MI_BATCH_NON_SECURE (1) +#define MI_BATCH_NON_SECURE_I965 (1 << 8) +/* Flush */ +#define MI_FLUSH (CMD_MI | (0x04 << 23)) +#define MI_WRITE_DIRTY_STATE (1<<4) +#define MI_END_SCENE (1<<3) +#define MI_GLOBAL_SNAPSHOT_COUNT_RESET (1<<3) +#define MI_INHIBIT_RENDER_CACHE_FLUSH (1<<2) +#define MI_STATE_INSTRUCTION_CACHE_FLUSH (1<<1) +#define MI_INVALIDATE_MAP_CACHE (1<<0) + +#define PRIM3D (CMD_3D | (0x1f<<24)) +#define PRIM3D_TRILIST (PRIM3D | (0x0<<18)) +#define PRIM3D_TRISTRIP (PRIM3D | (0x1<<18)) +#define PRIM3D_TRISTRIP_RVRSE (PRIM3D | (0x2<<18)) +#define PRIM3D_TRIFAN (PRIM3D | (0x3<<18)) +#define PRIM3D_POLY (PRIM3D | (0x4<<18)) +#define PRIM3D_LINELIST (PRIM3D | (0x5<<18)) +#define PRIM3D_LINESTRIP (PRIM3D | (0x6<<18)) +#define PRIM3D_RECTLIST (PRIM3D | (0x7<<18)) +#define PRIM3D_POINTLIST (PRIM3D | (0x8<<18)) +#define PRIM3D_DIB (PRIM3D | (0x9<<18)) +#define PRIM3D_CLEAR_RECT (PRIM3D | (0xa<<18)) +#define PRIM3D_ZONE_INIT (PRIM3D | (0xd<<18)) +#define PRIM3D_MASK (0x1f<<18) +#define PRIM3D_INDIRECT_SEQUENTIAL ((1<<23) | (0<<17)) +#define PRIM3D_INDIRECT_ELTS ((1<<23) | (1<<17)) + +/* p137 */ +#define _3DSTATE_AA_CMD (CMD_3D | (0x06<<24)) +#define AA_LINE_ECAAR_WIDTH_ENABLE (1<<16) +#define AA_LINE_ECAAR_WIDTH_0_5 0 +#define AA_LINE_ECAAR_WIDTH_1_0 (1<<14) +#define AA_LINE_ECAAR_WIDTH_2_0 (2<<14) +#define AA_LINE_ECAAR_WIDTH_4_0 (3<<14) +#define AA_LINE_REGION_WIDTH_ENABLE (1<<8) +#define AA_LINE_REGION_WIDTH_0_5 0 +#define AA_LINE_REGION_WIDTH_1_0 (1<<6) +#define AA_LINE_REGION_WIDTH_2_0 (2<<6) +#define AA_LINE_REGION_WIDTH_4_0 (3<<6) + +/* 3DSTATE_BACKFACE_STENCIL_OPS, p138*/ +#define _3DSTATE_BACKFACE_STENCIL_OPS (CMD_3D | (0x8<<24)) +#define BFO_ENABLE_STENCIL_REF (1<<23) +#define BFO_STENCIL_REF_SHIFT 15 +#define BFO_STENCIL_REF_MASK (0xff<<15) +#define BFO_ENABLE_STENCIL_FUNCS (1<<14) +#define BFO_STENCIL_TEST_SHIFT 11 +#define BFO_STENCIL_TEST_MASK (0x7<<11) +#define BFO_STENCIL_FAIL_SHIFT 8 +#define BFO_STENCIL_FAIL_MASK (0x7<<8) +#define BFO_STENCIL_PASS_Z_FAIL_SHIFT 5 +#define BFO_STENCIL_PASS_Z_FAIL_MASK (0x7<<5) +#define BFO_STENCIL_PASS_Z_PASS_SHIFT 2 +#define BFO_STENCIL_PASS_Z_PASS_MASK (0x7<<2) +#define BFO_ENABLE_STENCIL_TWO_SIDE (1<<1) +#define BFO_STENCIL_TWO_SIDE (1<<0) + +/* 3DSTATE_BACKFACE_STENCIL_MASKS, p140 */ +#define _3DSTATE_BACKFACE_STENCIL_MASKS (CMD_3D | (0x9<<24)) +#define BFM_ENABLE_STENCIL_TEST_MASK (1<<17) +#define BFM_ENABLE_STENCIL_WRITE_MASK (1<<16) +#define BFM_STENCIL_TEST_MASK_SHIFT 8 +#define BFM_STENCIL_TEST_MASK_MASK (0xff<<8) +#define BFM_STENCIL_WRITE_MASK_SHIFT 0 +#define BFM_STENCIL_WRITE_MASK_MASK (0xff<<0) + +/* 3DSTATE_BIN_CONTROL p141 */ + +/* p143 */ +#define _3DSTATE_BUF_INFO_CMD (CMD_3D | (0x1d<<24) | (0x8e<<16) | 1) +/* Dword 1 */ +#define BUF_3D_ID_COLOR_BACK (0x3<<24) +#define BUF_3D_ID_DEPTH (0x7<<24) +#define BUF_3D_USE_FENCE (1<<23) +#define BUF_3D_TILED_SURFACE (1<<22) +#define BUF_3D_TILE_WALK_X 0 +#define BUF_3D_TILE_WALK_Y (1<<21) +#define BUF_3D_PITCH(x) (x) +/* Dword 2 */ +#define BUF_3D_ADDR(x) ((x) & ~0x3) + +/* 3DSTATE_CHROMA_KEY */ + +/* 3DSTATE_CLEAR_PARAMETERS, p150 */ +#define _3DSTATE_CLEAR_PARAMETERS (CMD_3D | (0x1d<<24) | (0x9c<<16) | 5) +/* Dword 1 */ +#define CLEARPARAM_CLEAR_RECT (1 << 16) +#define CLEARPARAM_ZONE_INIT (0 << 16) +#define CLEARPARAM_WRITE_COLOR (1 << 2) +#define CLEARPARAM_WRITE_DEPTH (1 << 1) +#define CLEARPARAM_WRITE_STENCIL (1 << 0) + +/* 3DSTATE_CONSTANT_BLEND_COLOR, p153 */ +#define _3DSTATE_CONST_BLEND_COLOR_CMD (CMD_3D | (0x1d<<24) | (0x88<<16)) + +/* 3DSTATE_COORD_SET_BINDINGS, p154 */ +#define _3DSTATE_COORD_SET_BINDINGS (CMD_3D | (0x16<<24)) +#define CSB_TCB(iunit, eunit) ((eunit)<<(iunit*3)) + +/* p156 */ +#define _3DSTATE_DFLT_DIFFUSE_CMD (CMD_3D | (0x1d<<24) | (0x99<<16)) + +/* p157 */ +#define _3DSTATE_DFLT_SPEC_CMD (CMD_3D | (0x1d<<24) | (0x9a<<16)) + +/* p158 */ +#define _3DSTATE_DFLT_Z_CMD (CMD_3D | (0x1d<<24) | (0x98<<16)) + +/* 3DSTATE_DEPTH_OFFSET_SCALE, p159 */ +#define _3DSTATE_DEPTH_OFFSET_SCALE (CMD_3D | (0x1d<<24) | (0x97<<16)) +/* scale in dword 1 */ + +/* The depth subrectangle is not supported, but must be disabled. */ +/* 3DSTATE_DEPTH_SUBRECT_DISABLE, p160 */ +#define _3DSTATE_DEPTH_SUBRECT_DISABLE (CMD_3D | (0x1c<<24) | (0x11<<19) | (1 << 1) | (0 << 0)) + +/* p161 */ +#define _3DSTATE_DST_BUF_VARS_CMD (CMD_3D | (0x1d<<24) | (0x85<<16)) +/* Dword 1 */ +#define TEX_DEFAULT_COLOR_OGL (0<<30) +#define TEX_DEFAULT_COLOR_D3D (1<<30) +#define ZR_EARLY_DEPTH (1<<29) +#define LOD_PRECLAMP_OGL (1<<28) +#define LOD_PRECLAMP_D3D (0<<28) +#define DITHER_FULL_ALWAYS (0<<26) +#define DITHER_FULL_ON_FB_BLEND (1<<26) +#define DITHER_CLAMPED_ALWAYS (2<<26) +#define LINEAR_GAMMA_BLEND_32BPP (1<<25) +#define DEBUG_DISABLE_ENH_DITHER (1<<24) +#define DSTORG_HORT_BIAS(x) ((x)<<20) +#define DSTORG_VERT_BIAS(x) ((x)<<16) +#define COLOR_4_2_2_CHNL_WRT_ALL 0 +#define COLOR_4_2_2_CHNL_WRT_Y (1<<12) +#define COLOR_4_2_2_CHNL_WRT_CR (2<<12) +#define COLOR_4_2_2_CHNL_WRT_CB (3<<12) +#define COLOR_4_2_2_CHNL_WRT_CRCB (4<<12) +#define COLR_BUF_8BIT 0 +#define COLR_BUF_RGB555 (1<<8) +#define COLR_BUF_RGB565 (2<<8) +#define COLR_BUF_ARGB8888 (3<<8) +#define COLR_BUF_ARGB4444 (8<<8) +#define COLR_BUF_ARGB1555 (9<<8) +#define COLR_BUF_ARGB2AAA (0xa<<8) +#define DEPTH_FRMT_16_FIXED 0 +#define DEPTH_FRMT_16_FLOAT (1<<2) +#define DEPTH_FRMT_24_FIXED_8_OTHER (2<<2) +#define VERT_LINE_STRIDE_1 (1<<1) +#define VERT_LINE_STRIDE_0 (0<<1) +#define VERT_LINE_STRIDE_OFS_1 1 +#define VERT_LINE_STRIDE_OFS_0 0 + +/* p166 */ +#define _3DSTATE_DRAW_RECT_CMD (CMD_3D|(0x1d<<24)|(0x80<<16)|3) +/* Dword 1 */ +#define DRAW_RECT_DIS_DEPTH_OFS (1<<30) +#define DRAW_DITHER_OFS_X(x) ((x)<<26) +#define DRAW_DITHER_OFS_Y(x) ((x)<<24) +/* Dword 2 */ +#define DRAW_YMIN(x) ((x)<<16) +#define DRAW_XMIN(x) (x) +/* Dword 3 */ +#define DRAW_YMAX(x) ((x-1)<<16) +#define DRAW_XMAX(x) (x-1) +/* Dword 4 */ +#define DRAW_YORG(x) ((x)<<16) +#define DRAW_XORG(x) (x) + +/* 3DSTATE_FILTER_COEFFICIENTS_4X4, p170 */ + +/* 3DSTATE_FILTER_COEFFICIENTS_6X5, p172 */ + +/* _3DSTATE_FOG_COLOR, p173 */ +#define _3DSTATE_FOG_COLOR_CMD (CMD_3D|(0x15<<24)) +#define FOG_COLOR_RED(x) ((x)<<16) +#define FOG_COLOR_GREEN(x) ((x)<<8) +#define FOG_COLOR_BLUE(x) (x) + +/* _3DSTATE_FOG_MODE, p174 */ +#define _3DSTATE_FOG_MODE_CMD (CMD_3D|(0x1d<<24)|(0x89<<16)|2) +/* Dword 1 */ +#define FMC1_FOGFUNC_MODIFY_ENABLE (1<<31) +#define FMC1_FOGFUNC_VERTEX (0<<28) +#define FMC1_FOGFUNC_PIXEL_EXP (1<<28) +#define FMC1_FOGFUNC_PIXEL_EXP2 (2<<28) +#define FMC1_FOGFUNC_PIXEL_LINEAR (3<<28) +#define FMC1_FOGFUNC_MASK (3<<28) +#define FMC1_FOGINDEX_MODIFY_ENABLE (1<<27) +#define FMC1_FOGINDEX_Z (0<<25) +#define FMC1_FOGINDEX_W (1<<25) +#define FMC1_C1_C2_MODIFY_ENABLE (1<<24) +#define FMC1_DENSITY_MODIFY_ENABLE (1<<23) +#define FMC1_C1_ONE (1<<13) +#define FMC1_C1_MASK (0xffff<<4) +/* Dword 2 */ +#define FMC2_C2_ONE (1<<16) +/* Dword 3 */ +#define FMC3_D_ONE (1<<16) + +/* _3DSTATE_INDEPENDENT_ALPHA_BLEND, p177 */ +#define _3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD (CMD_3D|(0x0b<<24)) +#define IAB_MODIFY_ENABLE (1<<23) +#define IAB_ENABLE (1<<22) +#define IAB_MODIFY_FUNC (1<<21) +#define IAB_FUNC_SHIFT 16 +#define IAB_MODIFY_SRC_FACTOR (1<<11) +#define IAB_SRC_FACTOR_SHIFT 6 +#define IAB_SRC_FACTOR_MASK (BLENDFACT_MASK<<6) +#define IAB_MODIFY_DST_FACTOR (1<<5) +#define IAB_DST_FACTOR_SHIFT 0 +#define IAB_DST_FACTOR_MASK (BLENDFACT_MASK<<0) + +#define BLENDFACT_ZERO 0x01 +#define BLENDFACT_ONE 0x02 +#define BLENDFACT_SRC_COLR 0x03 +#define BLENDFACT_INV_SRC_COLR 0x04 +#define BLENDFACT_SRC_ALPHA 0x05 +#define BLENDFACT_INV_SRC_ALPHA 0x06 +#define BLENDFACT_DST_ALPHA 0x07 +#define BLENDFACT_INV_DST_ALPHA 0x08 +#define BLENDFACT_DST_COLR 0x09 +#define BLENDFACT_INV_DST_COLR 0x0a +#define BLENDFACT_SRC_ALPHA_SATURATE 0x0b +#define BLENDFACT_CONST_COLOR 0x0c +#define BLENDFACT_INV_CONST_COLOR 0x0d +#define BLENDFACT_CONST_ALPHA 0x0e +#define BLENDFACT_INV_CONST_ALPHA 0x0f +#define BLENDFACT_MASK 0x0f + +#define BLENDFUNC_ADD 0x0 +#define BLENDFUNC_SUBTRACT 0x1 +#define BLENDFUNC_REVERSE_SUBTRACT 0x2 +#define BLENDFUNC_MIN 0x3 +#define BLENDFUNC_MAX 0x4 +#define BLENDFUNC_MASK 0x7 + +/* 3DSTATE_LOAD_INDIRECT, p180 */ + +#define _3DSTATE_LOAD_INDIRECT (CMD_3D|(0x1d<<24)|(0x7<<16)) +#define LI0_STATE_STATIC_INDIRECT (0x01<<8) +#define LI0_STATE_DYNAMIC_INDIRECT (0x02<<8) +#define LI0_STATE_SAMPLER (0x04<<8) +#define LI0_STATE_MAP (0x08<<8) +#define LI0_STATE_PROGRAM (0x10<<8) +#define LI0_STATE_CONSTANTS (0x20<<8) + +#define SIS0_BUFFER_ADDRESS(x) ((x)&~0x3) +#define SIS0_FORCE_LOAD (1<<1) +#define SIS0_BUFFER_VALID (1<<0) +#define SIS1_BUFFER_LENGTH(x) ((x)&0xff) + +#define DIS0_BUFFER_ADDRESS(x) ((x)&~0x3) +#define DIS0_BUFFER_RESET (1<<1) +#define DIS0_BUFFER_VALID (1<<0) + +#define SSB0_BUFFER_ADDRESS(x) ((x)&~0x3) +#define SSB0_FORCE_LOAD (1<<1) +#define SSB0_BUFFER_VALID (1<<0) +#define SSB1_BUFFER_LENGTH(x) ((x)&0xff) + +#define MSB0_BUFFER_ADDRESS(x) ((x)&~0x3) +#define MSB0_FORCE_LOAD (1<<1) +#define MSB0_BUFFER_VALID (1<<0) +#define MSB1_BUFFER_LENGTH(x) ((x)&0xff) + +#define PSP0_BUFFER_ADDRESS(x) ((x)&~0x3) +#define PSP0_FORCE_LOAD (1<<1) +#define PSP0_BUFFER_VALID (1<<0) +#define PSP1_BUFFER_LENGTH(x) ((x)&0xff) + +#define PSC0_BUFFER_ADDRESS(x) ((x)&~0x3) +#define PSC0_FORCE_LOAD (1<<1) +#define PSC0_BUFFER_VALID (1<<0) +#define PSC1_BUFFER_LENGTH(x) ((x)&0xff) + +/* _3DSTATE_RASTERIZATION_RULES */ +#define _3DSTATE_RASTER_RULES_CMD (CMD_3D|(0x07<<24)) +#define ENABLE_POINT_RASTER_RULE (1<<15) +#define OGL_POINT_RASTER_RULE (1<<13) +#define ENABLE_TEXKILL_3D_4D (1<<10) +#define TEXKILL_3D (0<<9) +#define TEXKILL_4D (1<<9) +#define ENABLE_LINE_STRIP_PROVOKE_VRTX (1<<8) +#define ENABLE_TRI_FAN_PROVOKE_VRTX (1<<5) +#define LINE_STRIP_PROVOKE_VRTX(x) ((x)<<6) +#define TRI_FAN_PROVOKE_VRTX(x) ((x)<<3) + +/* _3DSTATE_SCISSOR_ENABLE, p256 */ +#define _3DSTATE_SCISSOR_ENABLE_CMD (CMD_3D|(0x1c<<24)|(0x10<<19)) +#define ENABLE_SCISSOR_RECT ((1<<1) | 1) +#define DISABLE_SCISSOR_RECT (1<<1) + +/* _3DSTATE_SCISSOR_RECTANGLE_0, p257 */ +#define _3DSTATE_SCISSOR_RECT_0_CMD (CMD_3D|(0x1d<<24)|(0x81<<16)|1) +/* Dword 1 */ +#define SCISSOR_RECT_0_YMIN(x) ((x)<<16) +#define SCISSOR_RECT_0_XMIN(x) (x) +/* Dword 2 */ +#define SCISSOR_RECT_0_YMAX(x) ((x)<<16) +#define SCISSOR_RECT_0_XMAX(x) (x) + +/* p189 */ +#define _3DSTATE_LOAD_STATE_IMMEDIATE_1 (CMD_3D | (0x1d<<24) | (0x04<<16)) +#define I1_LOAD_S(n) (1<<(4+n)) + +#define S0_VB_OFFSET_MASK 0xffffffc +#define S0_AUTO_CACHE_INV_DISABLE (1<<0) + +#define S1_VERTEX_WIDTH_SHIFT 24 +#define S1_VERTEX_WIDTH_MASK (0x3f<<24) +#define S1_VERTEX_PITCH_SHIFT 16 +#define S1_VERTEX_PITCH_MASK (0x3f<<16) + +#define TEXCOORDFMT_2D 0x0 +#define TEXCOORDFMT_3D 0x1 +#define TEXCOORDFMT_4D 0x2 +#define TEXCOORDFMT_1D 0x3 +#define TEXCOORDFMT_2D_16 0x4 +#define TEXCOORDFMT_4D_16 0x5 +#define TEXCOORDFMT_NOT_PRESENT 0xf +#define S2_TEXCOORD_FMT0_MASK 0xf +#define S2_TEXCOORD_FMT1_SHIFT 4 +#define S2_TEXCOORD_FMT(unit, type) ((type)<<(unit*4)) +#define S2_TEXCOORD_NONE (~0U) + +#define TEXCOORD_WRAP_SHORTEST_TCX 8 +#define TEXCOORD_WRAP_SHORTEST_TCY 4 +#define TEXCOORD_WRAP_SHORTEST_TCZ 2 +#define TEXCOORD_PERSPECTIVE_DISABLE 1 + +#define S3_WRAP_SHORTEST_TCX(unit) (TEXCOORD_WRAP_SHORTEST_TCX << ((unit) * 4)) +#define S3_WRAP_SHORTEST_TCY(unit) (TEXCOORD_WRAP_SHORTEST_TCY << ((unit) * 4)) +#define S3_WRAP_SHORTEST_TCZ(unit) (TEXCOORD_WRAP_SHORTEST_TCZ << ((unit) * 4)) +#define S3_PERSPECTIVE_DISABLE(unit) (TEXCOORD_PERSPECTIVE_DISABLE << ((unit) * 4)) + +/* S3 not interesting */ + +#define S4_POINT_WIDTH_SHIFT 23 +#define S4_POINT_WIDTH_MASK (0x1ff<<23) +#define S4_LINE_WIDTH_SHIFT 19 +#define S4_LINE_WIDTH_ONE (0x2<<19) +#define S4_LINE_WIDTH_MASK (0xf<<19) +#define S4_FLATSHADE_ALPHA (1<<18) +#define S4_FLATSHADE_FOG (1<<17) +#define S4_FLATSHADE_SPECULAR (1<<16) +#define S4_FLATSHADE_COLOR (1<<15) +#define S4_CULLMODE_BOTH (0<<13) +#define S4_CULLMODE_NONE (1<<13) +#define S4_CULLMODE_CW (2<<13) +#define S4_CULLMODE_CCW (3<<13) +#define S4_CULLMODE_MASK (3<<13) +#define S4_VFMT_POINT_WIDTH (1<<12) +#define S4_VFMT_SPEC_FOG (1<<11) +#define S4_VFMT_COLOR (1<<10) +#define S4_VFMT_DEPTH_OFFSET (1<<9) +#define S4_VFMT_XYZ (1<<6) +#define S4_VFMT_XYZW (2<<6) +#define S4_VFMT_XY (3<<6) +#define S4_VFMT_XYW (4<<6) +#define S4_VFMT_XYZW_MASK (7<<6) +#define S4_FORCE_DEFAULT_DIFFUSE (1<<5) +#define S4_FORCE_DEFAULT_SPECULAR (1<<4) +#define S4_LOCAL_DEPTH_OFFSET_ENABLE (1<<3) +#define S4_VFMT_FOG_PARAM (1<<2) +#define S4_SPRITE_POINT_ENABLE (1<<1) +#define S4_LINE_ANTIALIAS_ENABLE (1<<0) + +#define S4_VFMT_MASK (S4_VFMT_POINT_WIDTH | \ + S4_VFMT_SPEC_FOG | \ + S4_VFMT_COLOR | \ + S4_VFMT_DEPTH_OFFSET | \ + S4_VFMT_XYZW_MASK | \ + S4_VFMT_FOG_PARAM) + +#define S5_WRITEDISABLE_ALPHA (1<<31) +#define S5_WRITEDISABLE_RED (1<<30) +#define S5_WRITEDISABLE_GREEN (1<<29) +#define S5_WRITEDISABLE_BLUE (1<<28) +#define S5_WRITEDISABLE_MASK (0xf<<28) +#define S5_FORCE_DEFAULT_POINT_SIZE (1<<27) +#define S5_LAST_PIXEL_ENABLE (1<<26) +#define S5_GLOBAL_DEPTH_OFFSET_ENABLE (1<<25) +#define S5_FOG_ENABLE (1<<24) +#define S5_STENCIL_REF_SHIFT 16 +#define S5_STENCIL_REF_MASK (0xff<<16) +#define S5_STENCIL_TEST_FUNC_SHIFT 13 +#define S5_STENCIL_TEST_FUNC_MASK (0x7<<13) +#define S5_STENCIL_FAIL_SHIFT 10 +#define S5_STENCIL_FAIL_MASK (0x7<<10) +#define S5_STENCIL_PASS_Z_FAIL_SHIFT 7 +#define S5_STENCIL_PASS_Z_FAIL_MASK (0x7<<7) +#define S5_STENCIL_PASS_Z_PASS_SHIFT 4 +#define S5_STENCIL_PASS_Z_PASS_MASK (0x7<<4) +#define S5_STENCIL_WRITE_ENABLE (1<<3) +#define S5_STENCIL_TEST_ENABLE (1<<2) +#define S5_COLOR_DITHER_ENABLE (1<<1) +#define S5_LOGICOP_ENABLE (1<<0) + +#define COMPAREFUNC_ALWAYS 0 +#define COMPAREFUNC_NEVER 0x1 +#define COMPAREFUNC_LESS 0x2 +#define COMPAREFUNC_EQUAL 0x3 +#define COMPAREFUNC_LEQUAL 0x4 +#define COMPAREFUNC_GREATER 0x5 +#define COMPAREFUNC_NOTEQUAL 0x6 +#define COMPAREFUNC_GEQUAL 0x7 + +#define STENCILOP_KEEP 0 +#define STENCILOP_ZERO 0x1 +#define STENCILOP_REPLACE 0x2 +#define STENCILOP_INCRSAT 0x3 +#define STENCILOP_DECRSAT 0x4 +#define STENCILOP_INCR 0x5 +#define STENCILOP_DECR 0x6 +#define STENCILOP_INVERT 0x7 + +#define S6_ALPHA_TEST_ENABLE (1<<31) +#define S6_ALPHA_TEST_FUNC_SHIFT 28 +#define S6_ALPHA_TEST_FUNC_MASK (0x7<<28) +#define S6_ALPHA_REF_SHIFT 20 +#define S6_ALPHA_REF_MASK (0xff<<20) +#define S6_DEPTH_TEST_ENABLE (1<<19) +#define S6_DEPTH_TEST_FUNC_SHIFT 16 +#define S6_DEPTH_TEST_FUNC_MASK (0x7<<16) +#define S6_CBUF_BLEND_ENABLE (1<<15) +#define S6_CBUF_BLEND_FUNC_SHIFT 12 +#define S6_CBUF_BLEND_FUNC_MASK (0x7<<12) +#define S6_CBUF_SRC_BLEND_FACT_SHIFT 8 +#define S6_CBUF_SRC_BLEND_FACT_MASK (0xf<<8) +#define S6_CBUF_DST_BLEND_FACT_SHIFT 4 +#define S6_CBUF_DST_BLEND_FACT_MASK (0xf<<4) +#define S6_DEPTH_WRITE_ENABLE (1<<3) +#define S6_COLOR_WRITE_ENABLE (1<<2) +#define S6_TRISTRIP_PV_SHIFT 0 +#define S6_TRISTRIP_PV_MASK (0x3<<0) + +#define S7_DEPTH_OFFSET_CONST_MASK ~0 + +/* 3DSTATE_MAP_DEINTERLACER_PARAMETERS */ +/* 3DSTATE_MAP_PALETTE_LOAD_32, p206 */ + +/* _3DSTATE_MODES_4, p218 */ +#define _3DSTATE_MODES_4_CMD (CMD_3D|(0x0d<<24)) +#define ENABLE_LOGIC_OP_FUNC (1<<23) +#define LOGIC_OP_FUNC(x) ((x)<<18) +#define LOGICOP_MASK (0xf<<18) +#define LOGICOP_COPY 0xc +#define MODE4_ENABLE_STENCIL_TEST_MASK ((1<<17)|(0xff00)) +#define ENABLE_STENCIL_TEST_MASK (1<<17) +#define STENCIL_TEST_MASK(x) ((x)<<8) +#define MODE4_ENABLE_STENCIL_WRITE_MASK ((1<<16)|(0x00ff)) +#define ENABLE_STENCIL_WRITE_MASK (1<<16) +#define STENCIL_WRITE_MASK(x) ((x)&0xff) + +/* _3DSTATE_MODES_5, p220 */ +#define _3DSTATE_MODES_5_CMD (CMD_3D|(0x0c<<24)) +#define PIPELINE_FLUSH_RENDER_CACHE (1<<18) +#define PIPELINE_FLUSH_TEXTURE_CACHE (1<<16) + +/* p221 */ +#define _3DSTATE_PIXEL_SHADER_CONSTANTS (CMD_3D|(0x1d<<24)|(0x6<<16)) +#define PS1_REG(n) (1<<(n)) +#define PS2_CONST_X(n) (n) +#define PS3_CONST_Y(n) (n) +#define PS4_CONST_Z(n) (n) +#define PS5_CONST_W(n) (n) + +/* p222 */ + +#define I915_MAX_TEX_INDIRECT 4 +#define I915_MAX_TEX_INSN 32 +#define I915_MAX_ALU_INSN 64 +#define I915_MAX_DECL_INSN 27 +#define I915_MAX_TEMPORARY 16 + +/* Each instruction is 3 dwords long, though most don't require all + * this space. Maximum of 123 instructions. Smaller maxes per insn + * type. + */ +#define _3DSTATE_PIXEL_SHADER_PROGRAM (CMD_3D|(0x1d<<24)|(0x5<<16)) + +#define REG_TYPE_R 0 /* temporary regs, no need to + * dcl, must be written before + * read -- Preserved between + * phases. + */ +#define REG_TYPE_T 1 /* Interpolated values, must be + * dcl'ed before use. + * + * 0..7: texture coord, + * 8: diffuse spec, + * 9: specular color, + * 10: fog parameter in w. + */ +#define REG_TYPE_CONST 2 /* Restriction: only one const + * can be referenced per + * instruction, though it may be + * selected for multiple inputs. + * Constants not initialized + * default to zero. + */ +#define REG_TYPE_S 3 /* sampler */ +#define REG_TYPE_OC 4 /* output color (rgba) */ +#define REG_TYPE_OD 5 /* output depth (w), xyz are + * temporaries. If not written, + * interpolated depth is used? + */ +#define REG_TYPE_U 6 /* unpreserved temporaries */ +#define REG_TYPE_MASK 0x7 +#define REG_NR_MASK 0xf + +/* REG_TYPE_T: + */ +#define T_TEX0 0 +#define T_TEX1 1 +#define T_TEX2 2 +#define T_TEX3 3 +#define T_TEX4 4 +#define T_TEX5 5 +#define T_TEX6 6 +#define T_TEX7 7 +#define T_DIFFUSE 8 +#define T_SPECULAR 9 +#define T_FOG_W 10 /* interpolated fog is in W coord */ + +/* Arithmetic instructions */ + +/* .replicate_swizzle == selection and replication of a particular + * scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww + */ +#define A0_NOP (0x0<<24) /* no operation */ +#define A0_ADD (0x1<<24) /* dst = src0 + src1 */ +#define A0_MOV (0x2<<24) /* dst = src0 */ +#define A0_MUL (0x3<<24) /* dst = src0 * src1 */ +#define A0_MAD (0x4<<24) /* dst = src0 * src1 + src2 */ +#define A0_DP2ADD (0x5<<24) /* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */ +#define A0_DP3 (0x6<<24) /* dst.xyzw = src0.xyz dot src1.xyz */ +#define A0_DP4 (0x7<<24) /* dst.xyzw = src0.xyzw dot src1.xyzw */ +#define A0_FRC (0x8<<24) /* dst = src0 - floor(src0) */ +#define A0_RCP (0x9<<24) /* dst.xyzw = 1/(src0.replicate_swizzle) */ +#define A0_RSQ (0xa<<24) /* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */ +#define A0_EXP (0xb<<24) /* dst.xyzw = exp2(src0.replicate_swizzle) */ +#define A0_LOG (0xc<<24) /* dst.xyzw = log2(abs(src0.replicate_swizzle)) */ +#define A0_CMP (0xd<<24) /* dst = (src0 >= 0.0) ? src1 : src2 */ +#define A0_MIN (0xe<<24) /* dst = (src0 < src1) ? src0 : src1 */ +#define A0_MAX (0xf<<24) /* dst = (src0 >= src1) ? src0 : src1 */ +#define A0_FLR (0x10<<24) /* dst = floor(src0) */ +#define A0_MOD (0x11<<24) /* dst = src0 fmod 1.0 */ +#define A0_TRC (0x12<<24) /* dst = int(src0) */ +#define A0_SGE (0x13<<24) /* dst = src0 >= src1 ? 1.0 : 0.0 */ +#define A0_SLT (0x14<<24) /* dst = src0 < src1 ? 1.0 : 0.0 */ +#define A0_DEST_SATURATE (1<<22) +#define A0_DEST_TYPE_SHIFT 19 +/* Allow: R, OC, OD, U */ +#define A0_DEST_NR_SHIFT 14 +/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */ +#define A0_DEST_CHANNEL_X (1<<10) +#define A0_DEST_CHANNEL_Y (2<<10) +#define A0_DEST_CHANNEL_Z (4<<10) +#define A0_DEST_CHANNEL_W (8<<10) +#define A0_DEST_CHANNEL_ALL (0xf<<10) +#define A0_DEST_CHANNEL_SHIFT 10 +#define A0_SRC0_TYPE_SHIFT 7 +#define A0_SRC0_NR_SHIFT 2 + +#define A0_DEST_CHANNEL_XY (A0_DEST_CHANNEL_X|A0_DEST_CHANNEL_Y) +#define A0_DEST_CHANNEL_XYZ (A0_DEST_CHANNEL_XY|A0_DEST_CHANNEL_Z) + +#define SRC_X 0 +#define SRC_Y 1 +#define SRC_Z 2 +#define SRC_W 3 +#define SRC_ZERO 4 +#define SRC_ONE 5 + +#define A1_SRC0_CHANNEL_X_NEGATE (1<<31) +#define A1_SRC0_CHANNEL_X_SHIFT 28 +#define A1_SRC0_CHANNEL_Y_NEGATE (1<<27) +#define A1_SRC0_CHANNEL_Y_SHIFT 24 +#define A1_SRC0_CHANNEL_Z_NEGATE (1<<23) +#define A1_SRC0_CHANNEL_Z_SHIFT 20 +#define A1_SRC0_CHANNEL_W_NEGATE (1<<19) +#define A1_SRC0_CHANNEL_W_SHIFT 16 +#define A1_SRC1_TYPE_SHIFT 13 +#define A1_SRC1_NR_SHIFT 8 +#define A1_SRC1_CHANNEL_X_NEGATE (1<<7) +#define A1_SRC1_CHANNEL_X_SHIFT 4 +#define A1_SRC1_CHANNEL_Y_NEGATE (1<<3) +#define A1_SRC1_CHANNEL_Y_SHIFT 0 + +#define A2_SRC1_CHANNEL_Z_NEGATE (1<<31) +#define A2_SRC1_CHANNEL_Z_SHIFT 28 +#define A2_SRC1_CHANNEL_W_NEGATE (1<<27) +#define A2_SRC1_CHANNEL_W_SHIFT 24 +#define A2_SRC2_TYPE_SHIFT 21 +#define A2_SRC2_NR_SHIFT 16 +#define A2_SRC2_CHANNEL_X_NEGATE (1<<15) +#define A2_SRC2_CHANNEL_X_SHIFT 12 +#define A2_SRC2_CHANNEL_Y_NEGATE (1<<11) +#define A2_SRC2_CHANNEL_Y_SHIFT 8 +#define A2_SRC2_CHANNEL_Z_NEGATE (1<<7) +#define A2_SRC2_CHANNEL_Z_SHIFT 4 +#define A2_SRC2_CHANNEL_W_NEGATE (1<<3) +#define A2_SRC2_CHANNEL_W_SHIFT 0 + +/* Texture instructions */ +#define T0_TEXLD (0x15<<24) /* Sample texture using predeclared + * sampler and address, and output + * filtered texel data to destination + * register */ +#define T0_TEXLDP (0x16<<24) /* Same as texld but performs a + * perspective divide of the texture + * coordinate .xyz values by .w before + * sampling. */ +#define T0_TEXLDB (0x17<<24) /* Same as texld but biases the + * computed LOD by w. Only S4.6 two's + * comp is used. This implies that a + * float to fixed conversion is + * done. */ +#define T0_TEXKILL (0x18<<24) /* Does not perform a sampling + * operation. Simply kills the pixel + * if any channel of the address + * register is < 0.0. */ +#define T0_DEST_TYPE_SHIFT 19 +/* Allow: R, OC, OD, U */ +/* Note: U (unpreserved) regs do not retain their values between + * phases (cannot be used for feedback) + * + * Note: oC and OD registers can only be used as the destination of a + * texture instruction once per phase (this is an implementation + * restriction). + */ +#define T0_DEST_NR_SHIFT 14 +/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */ +#define T0_SAMPLER_NR_SHIFT 0 /* This field ignored for TEXKILL */ +#define T0_SAMPLER_NR_MASK (0xf<<0) + +#define T1_ADDRESS_REG_TYPE_SHIFT 24 /* Reg to use as texture coord */ +/* Allow R, T, OC, OD -- R, OC, OD are 'dependent' reads, new program phase */ +#define T1_ADDRESS_REG_NR_SHIFT 17 +#define T2_MBZ 0 + +/* Declaration instructions */ +#define D0_DCL (0x19<<24) /* Declare a t (interpolated attrib) + * register or an s (sampler) + * register. */ +#define D0_SAMPLE_TYPE_SHIFT 22 +#define D0_SAMPLE_TYPE_2D (0x0<<22) +#define D0_SAMPLE_TYPE_CUBE (0x1<<22) +#define D0_SAMPLE_TYPE_VOLUME (0x2<<22) +#define D0_SAMPLE_TYPE_MASK (0x3<<22) + +#define D0_TYPE_SHIFT 19 +/* Allow: T, S */ +#define D0_NR_SHIFT 14 +/* Allow T: 0..10, S: 0..15 */ +#define D0_CHANNEL_X (1<<10) +#define D0_CHANNEL_Y (2<<10) +#define D0_CHANNEL_Z (4<<10) +#define D0_CHANNEL_W (8<<10) +#define D0_CHANNEL_ALL (0xf<<10) +#define D0_CHANNEL_NONE (0<<10) + +#define D0_CHANNEL_XY (D0_CHANNEL_X|D0_CHANNEL_Y) +#define D0_CHANNEL_XYZ (D0_CHANNEL_XY|D0_CHANNEL_Z) + +/* I915 Errata: Do not allow (xz), (xw), (xzw) combinations for diffuse + * or specular declarations. + * + * For T dcls, only allow: (x), (xy), (xyz), (w), (xyzw) + * + * Must be zero for S (sampler) dcls + */ +#define D1_MBZ 0 +#define D2_MBZ 0 + +/* p207. + * The DWORD count is 3 times the number of bits set in MS1_MAPMASK_MASK + */ +#define _3DSTATE_MAP_STATE (CMD_3D|(0x1d<<24)|(0x0<<16)) + +#define MS1_MAPMASK_SHIFT 0 +#define MS1_MAPMASK_MASK (0x8fff<<0) + +#define MS2_UNTRUSTED_SURFACE (1<<31) +#define MS2_ADDRESS_MASK 0xfffffffc +#define MS2_VERTICAL_LINE_STRIDE (1<<1) +#define MS2_VERTICAL_OFFSET (1<<1) + +#define MS3_HEIGHT_SHIFT 21 +#define MS3_WIDTH_SHIFT 10 +#define MS3_PALETTE_SELECT (1<<9) +#define MS3_MAPSURF_FORMAT_SHIFT 7 +#define MS3_MAPSURF_FORMAT_MASK (0x7<<7) +#define MAPSURF_8BIT (1<<7) +#define MAPSURF_16BIT (2<<7) +#define MAPSURF_32BIT (3<<7) +#define MAPSURF_422 (5<<7) +#define MAPSURF_COMPRESSED (6<<7) +#define MAPSURF_4BIT_INDEXED (7<<7) +#define MS3_MT_FORMAT_MASK (0x7 << 3) +#define MS3_MT_FORMAT_SHIFT 3 +#define MT_4BIT_IDX_ARGB8888 (7<<3) /* SURFACE_4BIT_INDEXED */ +#define MT_8BIT_I8 (0<<3) /* SURFACE_8BIT */ +#define MT_8BIT_L8 (1<<3) +#define MT_8BIT_A8 (4<<3) +#define MT_8BIT_MONO8 (5<<3) +#define MT_16BIT_RGB565 (0<<3) /* SURFACE_16BIT */ +#define MT_16BIT_ARGB1555 (1<<3) +#define MT_16BIT_ARGB4444 (2<<3) +#define MT_16BIT_AY88 (3<<3) +#define MT_16BIT_88DVDU (5<<3) +#define MT_16BIT_BUMP_655LDVDU (6<<3) +#define MT_16BIT_I16 (7<<3) +#define MT_16BIT_L16 (8<<3) +#define MT_16BIT_A16 (9<<3) +#define MT_32BIT_ARGB8888 (0<<3) /* SURFACE_32BIT */ +#define MT_32BIT_ABGR8888 (1<<3) +#define MT_32BIT_XRGB8888 (2<<3) +#define MT_32BIT_XBGR8888 (3<<3) +#define MT_32BIT_QWVU8888 (4<<3) +#define MT_32BIT_AXVU8888 (5<<3) +#define MT_32BIT_LXVU8888 (6<<3) +#define MT_32BIT_XLVU8888 (7<<3) +#define MT_32BIT_ARGB2101010 (8<<3) +#define MT_32BIT_ABGR2101010 (9<<3) +#define MT_32BIT_AWVU2101010 (0xA<<3) +#define MT_32BIT_GR1616 (0xB<<3) +#define MT_32BIT_VU1616 (0xC<<3) +#define MT_32BIT_xI824 (0xD<<3) +#define MT_32BIT_xA824 (0xE<<3) +#define MT_32BIT_xL824 (0xF<<3) +#define MT_422_YCRCB_SWAPY (0<<3) /* SURFACE_422 */ +#define MT_422_YCRCB_NORMAL (1<<3) +#define MT_422_YCRCB_SWAPUV (2<<3) +#define MT_422_YCRCB_SWAPUVY (3<<3) +#define MT_COMPRESS_DXT1 (0<<3) /* SURFACE_COMPRESSED */ +#define MT_COMPRESS_DXT2_3 (1<<3) +#define MT_COMPRESS_DXT4_5 (2<<3) +#define MT_COMPRESS_FXT1 (3<<3) +#define MT_COMPRESS_DXT1_RGB (4<<3) +#define MS3_USE_FENCE_REGS (1<<2) +#define MS3_TILED_SURFACE (1<<1) +#define MS3_TILE_WALK (1<<0) + +/* The pitch is the pitch measured in DWORDS, minus 1 */ +#define MS4_PITCH_SHIFT 21 +#define MS4_CUBE_FACE_ENA_NEGX (1<<20) +#define MS4_CUBE_FACE_ENA_POSX (1<<19) +#define MS4_CUBE_FACE_ENA_NEGY (1<<18) +#define MS4_CUBE_FACE_ENA_POSY (1<<17) +#define MS4_CUBE_FACE_ENA_NEGZ (1<<16) +#define MS4_CUBE_FACE_ENA_POSZ (1<<15) +#define MS4_CUBE_FACE_ENA_MASK (0x3f<<15) +#define MS4_MAX_LOD_SHIFT 9 +#define MS4_MAX_LOD_MASK (0x3f<<9) +#define MS4_MIP_LAYOUT_LEGACY (0<<8) +#define MS4_MIP_LAYOUT_BELOW_LPT (0<<8) +#define MS4_MIP_LAYOUT_RIGHT_LPT (1<<8) +#define MS4_VOLUME_DEPTH_SHIFT 0 +#define MS4_VOLUME_DEPTH_MASK (0xff<<0) + +/* p244. + * The DWORD count is 3 times the number of bits set in SS1_MAPMASK_MASK. + */ +#define _3DSTATE_SAMPLER_STATE (CMD_3D|(0x1d<<24)|(0x1<<16)) + +#define SS1_MAPMASK_SHIFT 0 +#define SS1_MAPMASK_MASK (0x8fff<<0) + +#define SS2_REVERSE_GAMMA_ENABLE (1<<31) +#define SS2_PACKED_TO_PLANAR_ENABLE (1<<30) +#define SS2_COLORSPACE_CONVERSION (1<<29) +#define SS2_CHROMAKEY_SHIFT 27 +#define SS2_BASE_MIP_LEVEL_SHIFT 22 +#define SS2_BASE_MIP_LEVEL_MASK (0x1f<<22) +#define SS2_MIP_FILTER_SHIFT 20 +#define SS2_MIP_FILTER_MASK (0x3<<20) +#define MIPFILTER_NONE 0 +#define MIPFILTER_NEAREST 1 +#define MIPFILTER_LINEAR 3 +#define SS2_MAG_FILTER_SHIFT 17 +#define SS2_MAG_FILTER_MASK (0x7<<17) +#define FILTER_NEAREST 0 +#define FILTER_LINEAR 1 +#define FILTER_ANISOTROPIC 2 +#define FILTER_4X4_1 3 +#define FILTER_4X4_2 4 +#define FILTER_4X4_FLAT 5 +#define FILTER_6X5_MONO 6 /* XXX - check */ +#define SS2_MIN_FILTER_SHIFT 14 +#define SS2_MIN_FILTER_MASK (0x7<<14) +#define SS2_LOD_BIAS_SHIFT 5 +#define SS2_LOD_BIAS_ONE (0x10<<5) +#define SS2_LOD_BIAS_MASK (0x1ff<<5) +/* Shadow requires: + * MT_X8{I,L,A}24 or MT_{I,L,A}16 texture format + * FILTER_4X4_x MIN and MAG filters + */ +#define SS2_SHADOW_ENABLE (1<<4) +#define SS2_MAX_ANISO_MASK (1<<3) +#define SS2_MAX_ANISO_2 (0<<3) +#define SS2_MAX_ANISO_4 (1<<3) +#define SS2_SHADOW_FUNC_SHIFT 0 +#define SS2_SHADOW_FUNC_MASK (0x7<<0) +/* SS2_SHADOW_FUNC values: see COMPAREFUNC_* */ + +#define SS3_MIN_LOD_SHIFT 24 +#define SS3_MIN_LOD_ONE (0x10<<24) +#define SS3_MIN_LOD_MASK (0xff<<24) +#define SS3_KILL_PIXEL_ENABLE (1<<17) +#define SS3_TCX_ADDR_MODE_SHIFT 12 +#define SS3_TCX_ADDR_MODE_MASK (0x7<<12) +#define TEXCOORDMODE_WRAP 0 +#define TEXCOORDMODE_MIRROR 1 +#define TEXCOORDMODE_CLAMP_EDGE 2 +#define TEXCOORDMODE_CUBE 3 +#define TEXCOORDMODE_CLAMP_BORDER 4 +#define TEXCOORDMODE_MIRROR_ONCE 5 +#define SS3_TCY_ADDR_MODE_SHIFT 9 +#define SS3_TCY_ADDR_MODE_MASK (0x7<<9) +#define SS3_TCZ_ADDR_MODE_SHIFT 6 +#define SS3_TCZ_ADDR_MODE_MASK (0x7<<6) +#define SS3_NORMALIZED_COORDS (1<<5) +#define SS3_TEXTUREMAP_INDEX_SHIFT 1 +#define SS3_TEXTUREMAP_INDEX_MASK (0xf<<1) +#define SS3_DEINTERLACER_ENABLE (1<<0) + +#define SS4_BORDER_COLOR_MASK (~0) + +/* 3DSTATE_SPAN_STIPPLE, p258 + */ +#define _3DSTATE_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16)) +#define ST1_ENABLE (1<<16) +#define ST1_MASK (0xffff) + +#define FLUSH_MAP_CACHE (1<<0) +#define FLUSH_RENDER_CACHE (1<<1) + +/* BLT commands */ +#define COLOR_BLT_CMD (CMD_2D | (0x40 << 22) | 3) +#define XY_COLOR_BLT_CMD (CMD_2D | (0x50 << 22) | 4) +#define XY_SETUP_CLIP_BLT_CMD (CMD_2D | (0x03 << 22) | 1) +#define XY_SRC_COPY_BLT_CMD (CMD_2D | (0x53 << 22) | 6) +#define SRC_COPY_BLT_CMD (CMD_2D | (0x43 << 22) | 4) + +#define XY_MONO_PAT_BLT_CMD (CMD_2D | (0x52<<22)|0x7) +#define XY_MONO_PAT_VERT_SEED ((1<<10) | (1<<9)|(1<<8)) +#define XY_MONO_PAT_HORT_SEED ((1<<14) | (1<<13)|(1<<12)) +#define XY_MONO_SRC_BLT_CMD (CMD_2D | (0x54<<22)|(0x6)) + +#define XY_SETUP_BLT_CMD (CMD_2D | (0x01 << 22) | 6) +#define XY_TEXT_IMMEDIATE_BLIT_CMD (CMD_2D | (0x31 << 22)) +#define XY_TEXT_BYTE_PACKED (1 << 16) + +/* BR00 */ +#define XY_BLT_WRITE_ALPHA (1 << 21) +#define XY_BLT_WRITE_RGB (1 << 20) +#define XY_SRC_TILED (1 << 15) +#define XY_DST_TILED (1 << 11) + +/* BR13 */ +#define BR13_565 (0x1 << 24) +#define BR13_8888 (0x3 << 24) + +#endif /* CAIRO_DRM_INTEL_COMMAND_PRIVATE_H */ diff --git a/src/drm/cairo-drm-intel-debug.c b/src/drm/cairo-drm-intel-debug.c new file mode 100644 index 000000000..7068c933e --- /dev/null +++ b/src/drm/cairo-drm-intel-debug.c @@ -0,0 +1,1209 @@ +/************************************************************************** + * + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#include "cairoint.h" +#include "cairo-drm-intel-private.h" + +struct debug_stream { + unsigned offset; /* current gtt offset */ + const char *ptr; /* pointer to gtt offset zero */ + const char *end; /* pointer to gtt offset zero */ +}; + +static cairo_bool_t +debug (struct debug_stream *stream, const char *name, uint32_t len) +{ + uint32_t i; + const uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + + if (len == 0) { + fprintf (stderr, "Error - zero length packet (0x%08x)\n", stream->ptr[0]); + ASSERT_NOT_REACHED; + return FALSE; + } + + fprintf (stderr, "%04x: ", stream->offset); + + fprintf (stderr, "%s (%d dwords):\n", name, len); + for (i = 0; i < len; i++) + fprintf (stderr, "\t0x%08x\n", ptr[i]); + fprintf (stderr, "\n"); + + stream->offset += len * sizeof(uint32_t); + return TRUE; +} + + +static const char * +get_prim_name (uint32_t val) +{ + switch (val & PRIM3D_MASK) { + case PRIM3D_TRILIST: return "TRILIST"; + case PRIM3D_TRISTRIP: return "TRISTRIP"; + case PRIM3D_TRISTRIP_RVRSE: return "TRISTRIP_RVRSE"; + case PRIM3D_TRIFAN: return "TRIFAN"; + case PRIM3D_POLY: return "POLY"; + case PRIM3D_LINELIST: return "LINELIST"; + case PRIM3D_LINESTRIP: return "LINESTRIP"; + case PRIM3D_RECTLIST: return "RECTLIST"; + case PRIM3D_POINTLIST: return "POINTLIST"; + case PRIM3D_DIB: return "DIB"; + case PRIM3D_CLEAR_RECT: return "CLEAR_RECT"; + case PRIM3D_ZONE_INIT: return "ZONE_INIT"; + default: return "????"; + } +} + +static cairo_bool_t +debug_prim (struct debug_stream *stream, + const char *name, + cairo_bool_t dump_floats, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + const char *prim = get_prim_name( ptr[0] ); + uint32_t i; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s %s (%d dwords):\n", name, prim, len); + fprintf (stderr, "\t0x%08x\n", ptr[0]); + for (i = 1; i < len; i++) { + if (dump_floats) + fprintf (stderr, "\t0x%08x // %f\n", ptr[i], *(float *)&ptr[i]); + else + fprintf (stderr, "\t0x%08x\n", ptr[i]); + } + + fprintf (stderr, "\n"); + + stream->offset += len * sizeof(uint32_t); + return TRUE; +} + +static const char *opcodes[] = { + "NOP", + "ADD", + "MOV", + "MUL", + "MAD", + "DP2ADD", + "DP3", + "DP4", + "FRC", + "RCP", + "RSQ", + "EXP", + "LOG", + "CMP", + "MIN", + "MAX", + "FLR", + "MOD", + "TRC", + "SGE", + "SLT", + "TEXLD", + "TEXLDP", + "TEXLDB", + "TEXKILL", + "DCL", + "0x1a", + "0x1b", + "0x1c", + "0x1d", + "0x1e", + "0x1f", +}; + +static const int args[] = { + 0, /* 0 nop */ + 2, /* 1 add */ + 1, /* 2 mov */ + 2, /* 3 m ul */ + 3, /* 4 mad */ + 3, /* 5 dp2add */ + 2, /* 6 dp3 */ + 2, /* 7 dp4 */ + 1, /* 8 frc */ + 1, /* 9 rcp */ + 1, /* a rsq */ + 1, /* b exp */ + 1, /* c log */ + 3, /* d cmp */ + 2, /* e min */ + 2, /* f max */ + 1, /* 10 flr */ + 1, /* 11 mod */ + 1, /* 12 trc */ + 2, /* 13 sge */ + 2, /* 14 slt */ + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; + +static const char *regname[] = { + "R", + "T", + "CONST", + "S", + "OC", + "OD", + "U", + "UNKNOWN", +}; + +static void +print_reg_type_nr(uint32_t type, uint32_t nr) +{ + switch (type) { + case REG_TYPE_T: + switch (nr) { + case T_DIFFUSE: + fprintf (stderr, "T_DIFFUSE"); + return; + case T_SPECULAR: + fprintf (stderr, "T_SPECULAR"); + return; + case T_FOG_W: + fprintf (stderr, "T_FOG_W"); + return; + default: + fprintf (stderr, "T_TEX%d", nr); + return; + } + case REG_TYPE_OC: + if (nr == 0) { + fprintf (stderr, "oC"); + return; + } + break; + case REG_TYPE_OD: + if (nr == 0) { + fprintf (stderr, "oD"); + return; + } + break; + default: + break; + } + + fprintf (stderr, "%s[%d]", regname[type], nr); +} + +#define REG_SWIZZLE_MASK 0x7777 +#define REG_NEGATE_MASK 0x8888 + +#define REG_SWIZZLE_XYZW ((SRC_X << A2_SRC2_CHANNEL_X_SHIFT) | \ + (SRC_Y << A2_SRC2_CHANNEL_Y_SHIFT) | \ + (SRC_Z << A2_SRC2_CHANNEL_Z_SHIFT) | \ + (SRC_W << A2_SRC2_CHANNEL_W_SHIFT)) + +static void +print_reg_neg_swizzle(uint32_t reg) +{ + int i; + + if ((reg & REG_SWIZZLE_MASK) == REG_SWIZZLE_XYZW && + (reg & REG_NEGATE_MASK) == 0) + return; + + fprintf (stderr, "."); + + for (i = 12; i >= 0; i -= 4) { + if (reg & (8 << i)) + fprintf (stderr, "-"); + + switch ((reg >> i) & 0x7) { + case 0: + fprintf (stderr, "x"); + break; + case 1: + fprintf (stderr, "y"); + break; + case 2: + fprintf (stderr, "z"); + break; + case 3: + fprintf (stderr, "w"); + break; + case 4: + fprintf (stderr, "0"); + break; + case 5: + fprintf (stderr, "1"); + break; + default: + fprintf (stderr, "?"); + break; + } + } +} + +static void +print_src_reg(uint32_t dword) +{ + uint32_t nr = (dword >> A2_SRC2_NR_SHIFT) & REG_NR_MASK; + uint32_t type = (dword >> A2_SRC2_TYPE_SHIFT) & REG_TYPE_MASK; + print_reg_type_nr(type, nr); + print_reg_neg_swizzle(dword); +} + +static void +print_dest_reg(uint32_t dword) +{ + uint32_t nr = (dword >> A0_DEST_NR_SHIFT) & REG_NR_MASK; + uint32_t type = (dword >> A0_DEST_TYPE_SHIFT) & REG_TYPE_MASK; + print_reg_type_nr(type, nr); + if ((dword & A0_DEST_CHANNEL_ALL) == A0_DEST_CHANNEL_ALL) + return; + fprintf (stderr, "."); + if (dword & A0_DEST_CHANNEL_X) + fprintf (stderr, "x"); + if (dword & A0_DEST_CHANNEL_Y) + fprintf (stderr, "y"); + if (dword & A0_DEST_CHANNEL_Z) + fprintf (stderr, "z"); + if (dword & A0_DEST_CHANNEL_W) + fprintf (stderr, "w"); +} + +#define GET_SRC0_REG(r0, r1) ((r0<<14)|(r1>>A1_SRC0_CHANNEL_W_SHIFT)) +#define GET_SRC1_REG(r0, r1) ((r0<<8)|(r1>>A2_SRC1_CHANNEL_W_SHIFT)) +#define GET_SRC2_REG(r) (r) + +static void +print_arith_op(uint32_t opcode, const uint32_t * program) +{ + if (opcode != A0_NOP) { + print_dest_reg(program[0]); + if (program[0] & A0_DEST_SATURATE) + fprintf (stderr, " = SATURATE "); + else + fprintf (stderr, " = "); + } + + fprintf (stderr, "%s ", opcodes[opcode]); + + print_src_reg(GET_SRC0_REG(program[0], program[1])); + if (args[opcode] == 1) { + fprintf (stderr, "\n"); + return; + } + + fprintf (stderr, ", "); + print_src_reg(GET_SRC1_REG(program[1], program[2])); + if (args[opcode] == 2) { + fprintf (stderr, "\n"); + return; + } + + fprintf (stderr, ", "); + print_src_reg(GET_SRC2_REG(program[2])); + fprintf (stderr, "\n"); + return; +} + +static void +print_tex_op(uint32_t opcode, const uint32_t * program) +{ + print_dest_reg(program[0] | A0_DEST_CHANNEL_ALL); + fprintf (stderr, " = "); + + fprintf (stderr, "%s ", opcodes[opcode]); + + fprintf (stderr, "S[%d],", program[0] & T0_SAMPLER_NR_MASK); + + print_reg_type_nr((program[1] >> T1_ADDRESS_REG_TYPE_SHIFT) & + REG_TYPE_MASK, + (program[1] >> T1_ADDRESS_REG_NR_SHIFT) & REG_NR_MASK); + fprintf (stderr, "\n"); +} + +static void +print_dcl_op(uint32_t opcode, const uint32_t * program) +{ + fprintf (stderr, "%s ", opcodes[opcode]); + print_dest_reg(program[0] | A0_DEST_CHANNEL_ALL); + fprintf (stderr, "\n"); +} + +static void +i915_disassemble_program (const uint32_t * program, uint32_t sz) +{ + uint32_t size = program[0] & 0x1ff; + uint32_t i; + + fprintf (stderr, "\tPROGRAM\n"); + + assert(size + 2 == sz); + + program++; + for (i = 1; i < sz; i += 3, program += 3) { + uint32_t opcode = program[0] & (0x1f << 24); + + fprintf (stderr, "\t\t"); + + if ((int) opcode >= A0_NOP && opcode <= A0_SLT) + print_arith_op(opcode >> 24, program); + else if (opcode >= T0_TEXLD && opcode <= T0_TEXKILL) + print_tex_op(opcode >> 24, program); + else if (opcode == D0_DCL) + print_dcl_op(opcode >> 24, program); + else + fprintf (stderr, "Unknown opcode 0x%x\n", opcode); + } + + fprintf (stderr, "\tEND-PROGRAM\n\n"); +} + +static cairo_bool_t +debug_program (struct debug_stream *stream, const char *name, uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + + if (len == 0) { + fprintf (stderr, "Error - zero length packet (0x%08x)\n", stream->ptr[0]); + ASSERT_NOT_REACHED; + return FALSE; + } + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + i915_disassemble_program (ptr, len); + + stream->offset += len * sizeof(uint32_t); + return TRUE; +} + +static cairo_bool_t +debug_chain (struct debug_stream *stream, const char *name, uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t old_offset = stream->offset + len * sizeof(uint32_t); + uint32_t i; + + fprintf (stderr, "%s (%d dwords):\n", name, len); + for (i = 0; i < len; i++) + fprintf (stderr, "\t0x%08x\n", ptr[i]); + + stream->offset = ptr[1] & ~0x3; + + if (stream->offset < old_offset) + fprintf (stderr, "\n... skipping backwards from 0x%x --> 0x%x ...\n\n", + old_offset, stream->offset ); + else + fprintf (stderr, "\n... skipping from 0x%x --> 0x%x ...\n\n", + old_offset, stream->offset ); + + return TRUE; +} + +static cairo_bool_t +debug_variable_length_prim (struct debug_stream *stream) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + const char *prim = get_prim_name( ptr[0] ); + uint32_t i, len; + + uint16_t *idx = (uint16_t *)(ptr+1); + for (i = 0; idx[i] != 0xffff; i++) + ; + + len = 1+(i+2)/2; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "3DPRIM, %s variable length %d indicies (%d dwords):\n", prim, i, len); + for (i = 0; i < len; i++) + fprintf (stderr, "\t0x%08x\n", ptr[i]); + fprintf (stderr, "\n"); + + stream->offset += len * sizeof(uint32_t); + return TRUE; +} + +#define BITS(dw, hi, lo, ...) \ + do { \ + unsigned himask = 0xffffffffU >> (31 - (hi)); \ + fprintf (stderr, "\t\t "); \ + fprintf (stderr, __VA_ARGS__); \ + fprintf (stderr, ": 0x%x\n", ((dw) & himask) >> (lo)); \ + } while (0) + +#define MBZ(dw, hi, lo) do { \ + unsigned x = (dw) >> (lo); \ + unsigned lomask = (1 << (lo)) - 1; \ + unsigned himask; \ + himask = (1UL << (hi)) - 1; \ + assert ((x & himask & ~lomask) == 0); \ +} while (0) + +#define FLAG(dw, bit, ... ) \ + do { \ + if (((dw) >> (bit)) & 1) { \ + fprintf (stderr, "\t\t "); \ + fprintf (stderr, __VA_ARGS__); \ + fprintf (stderr, "\n"); \ + } \ + } while (0) + +static cairo_bool_t +debug_load_immediate (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t bits = (ptr[0] >> 4) & 0xff; + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords, flags: %x):\n", name, len, bits); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + if (bits & (1<<0)) { + fprintf (stderr, "\t LIS0: 0x%08x\n", ptr[j]); + fprintf (stderr, "\t vb address: 0x%08x\n", (ptr[j] & ~0x3)); + BITS (ptr[j], 0, 0, "vb invalidate disable"); + j++; + } + if (bits & (1<<1)) { + fprintf (stderr, "\t LIS1: 0x%08x\n", ptr[j]); + BITS (ptr[j], 29, 24, "vb dword width"); + BITS (ptr[j], 21, 16, "vb dword pitch"); + BITS (ptr[j], 15, 0, "vb max index"); + j++; + } + if (bits & (1<<2)) { + int i; + fprintf (stderr, "\t LIS2: 0x%08x\n", ptr[j]); + for (i = 0; i < 8; i++) { + unsigned tc = (ptr[j] >> (i * 4)) & 0xf; + if (tc != 0xf) + BITS (tc, 3, 0, "tex coord %d", i); + } + j++; + } + if (bits & (1<<3)) { + fprintf (stderr, "\t LIS3: 0x%08x\n", ptr[j]); + j++; + } + if (bits & (1<<4)) { + fprintf (stderr, "\t LIS4: 0x%08x\n", ptr[j]); + BITS (ptr[j], 31, 23, "point width"); + BITS (ptr[j], 22, 19, "line width"); + FLAG (ptr[j], 18, "alpha flatshade"); + FLAG (ptr[j], 17, "fog flatshade"); + FLAG (ptr[j], 16, "spec flatshade"); + FLAG (ptr[j], 15, "rgb flatshade"); + BITS (ptr[j], 14, 13, "cull mode"); + FLAG (ptr[j], 12, "vfmt: point width"); + FLAG (ptr[j], 11, "vfmt: specular/fog"); + FLAG (ptr[j], 10, "vfmt: rgba"); + FLAG (ptr[j], 9, "vfmt: depth offset"); + BITS (ptr[j], 8, 6, "vfmt: position (2==xyzw)"); + FLAG (ptr[j], 5, "force dflt diffuse"); + FLAG (ptr[j], 4, "force dflt specular"); + FLAG (ptr[j], 3, "local depth offset enable"); + FLAG (ptr[j], 2, "vfmt: fp32 fog coord"); + FLAG (ptr[j], 1, "sprite point"); + FLAG (ptr[j], 0, "antialiasing"); + j++; + } + if (bits & (1<<5)) { + fprintf (stderr, "\t LIS5: 0x%08x\n", ptr[j]); + BITS (ptr[j], 31, 28, "rgba write disables"); + FLAG (ptr[j], 27, "force dflt point width"); + FLAG (ptr[j], 26, "last pixel enable"); + FLAG (ptr[j], 25, "global z offset enable"); + FLAG (ptr[j], 24, "fog enable"); + BITS (ptr[j], 23, 16, "stencil ref"); + BITS (ptr[j], 15, 13, "stencil test"); + BITS (ptr[j], 12, 10, "stencil fail op"); + BITS (ptr[j], 9, 7, "stencil pass z fail op"); + BITS (ptr[j], 6, 4, "stencil pass z pass op"); + FLAG (ptr[j], 3, "stencil write enable"); + FLAG (ptr[j], 2, "stencil test enable"); + FLAG (ptr[j], 1, "color dither enable"); + FLAG (ptr[j], 0, "logiop enable"); + j++; + } + if (bits & (1<<6)) { + fprintf (stderr, "\t LIS6: 0x%08x\n", ptr[j]); + FLAG (ptr[j], 31, "alpha test enable"); + BITS (ptr[j], 30, 28, "alpha func"); + BITS (ptr[j], 27, 20, "alpha ref"); + FLAG (ptr[j], 19, "depth test enable"); + BITS (ptr[j], 18, 16, "depth func"); + FLAG (ptr[j], 15, "blend enable"); + BITS (ptr[j], 14, 12, "blend func"); + BITS (ptr[j], 11, 8, "blend src factor"); + BITS (ptr[j], 7, 4, "blend dst factor"); + FLAG (ptr[j], 3, "depth write enable"); + FLAG (ptr[j], 2, "color write enable"); + BITS (ptr[j], 1, 0, "provoking vertex"); + j++; + } + + fprintf (stderr, "\n"); + + assert(j == len); + + stream->offset += len * sizeof(uint32_t); + return TRUE; +} + +static cairo_bool_t +debug_load_indirect (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t bits = (ptr[0] >> 8) & 0x3f; + uint32_t i, j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + for (i = 0; i < 6; i++) { + if (bits & (1<offset += len * sizeof(uint32_t); + return TRUE; +} + +static void +BR13 (struct debug_stream *stream, + uint32_t val) +{ + fprintf (stderr, "\t0x%08x\n", val); + FLAG (val, 30, "clipping enable"); + BITS (val, 25, 24, "color depth (3==32bpp)"); + BITS (val, 23, 16, "raster op"); + BITS (val, 15, 0, "dest pitch"); +} + +static void +BR2223 (struct debug_stream *stream, + uint32_t val22, uint32_t val23) +{ + union { uint32_t val; short field[2]; } BR22, BR23; + + BR22.val = val22; + BR23.val = val23; + + fprintf (stderr, "\t0x%08x\n", val22); + BITS (val22, 31, 16, "dest y1"); + BITS (val22, 15, 0, "dest x1"); + + fprintf (stderr, "\t0x%08x\n", val23); + BITS (val23, 31, 16, "dest y2"); + BITS (val23, 15, 0, "dest x2"); + + /* The blit engine may produce unexpected results when these aren't met */ + assert(BR22.field[0] < BR23.field[0]); + assert(BR22.field[1] < BR23.field[1]); +} + +static void +BR09 (struct debug_stream *stream, + uint32_t val) +{ + fprintf (stderr, "\t0x%08x -- dest address\n", val); +} + +static void +BR26 (struct debug_stream *stream, + uint32_t val) +{ + fprintf (stderr, "\t0x%08x\n", val); + BITS (val, 31, 16, "src y1"); + BITS (val, 15, 0, "src x1"); +} + +static void +BR11 (struct debug_stream *stream, + uint32_t val) +{ + fprintf (stderr, "\t0x%08x\n", val); + BITS (val, 15, 0, "src pitch"); +} + +static void +BR12 (struct debug_stream *stream, + uint32_t val) +{ + fprintf (stderr, "\t0x%08x -- src address\n", val); +} + +static void +BR16 (struct debug_stream *stream, + uint32_t val) +{ + fprintf (stderr, "\t0x%08x -- color\n", val); +} + +static cairo_bool_t +debug_copy_blit (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + BR13(stream, ptr[j++]); + BR2223(stream, ptr[j], ptr[j+1]); + j += 2; + BR09(stream, ptr[j++]); + BR26(stream, ptr[j++]); + BR11(stream, ptr[j++]); + BR12(stream, ptr[j++]); + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t +debug_color_blit (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + BR13(stream, ptr[j++]); + BR2223(stream, ptr[j], ptr[j+1]); + j += 2; + BR09(stream, ptr[j++]); + BR16(stream, ptr[j++]); + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t +debug_modes4 (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j]); + BITS (ptr[j], 21, 18, "logicop func"); + FLAG (ptr[j], 17, "stencil test mask modify-enable"); + FLAG (ptr[j], 16, "stencil write mask modify-enable"); + BITS (ptr[j], 15, 8, "stencil test mask"); + BITS (ptr[j], 7, 0, "stencil write mask"); + fprintf (stderr, "\n"); + j++; + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t +debug_map_state (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + { + fprintf (stderr, "\t0x%08x\n", ptr[j]); + BITS (ptr[j], 15, 0, "map mask"); + j++; + } + + while (j < len) { + { + fprintf (stderr, "\t TMn.0: 0x%08x\n", ptr[j]); + fprintf (stderr, "\t map address: 0x%08x\n", (ptr[j] & ~0x3)); + FLAG (ptr[j], 1, "vertical line stride"); + FLAG (ptr[j], 0, "vertical line stride offset"); + j++; + } + + { + fprintf (stderr, "\t TMn.1: 0x%08x\n", ptr[j]); + BITS (ptr[j], 31, 21, "height"); + BITS (ptr[j], 20, 10, "width"); + BITS (ptr[j], 9, 7, "surface format"); + BITS (ptr[j], 6, 3, "texel format"); + FLAG (ptr[j], 2, "use fence regs"); + FLAG (ptr[j], 1, "tiled surface"); + FLAG (ptr[j], 0, "tile walk ymajor"); + j++; + } + { + fprintf (stderr, "\t TMn.2: 0x%08x\n", ptr[j]); + BITS (ptr[j], 31, 21, "dword pitch"); + BITS (ptr[j], 20, 15, "cube face enables"); + BITS (ptr[j], 14, 9, "max lod"); + FLAG (ptr[j], 8, "mip layout right"); + BITS (ptr[j], 7, 0, "depth"); + j++; + } + } + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t +debug_sampler_state (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + { + fprintf (stderr, "\t0x%08x\n", ptr[j]); + BITS (ptr[j], 15, 0, "sampler mask"); + j++; + } + + while (j < len) { + { + fprintf (stderr, "\t TSn.0: 0x%08x\n", ptr[j]); + FLAG (ptr[j], 31, "reverse gamma"); + FLAG (ptr[j], 30, "planar to packed"); + FLAG (ptr[j], 29, "yuv->rgb"); + BITS (ptr[j], 28, 27, "chromakey index"); + BITS (ptr[j], 26, 22, "base mip level"); + BITS (ptr[j], 21, 20, "mip mode filter"); + BITS (ptr[j], 19, 17, "mag mode filter"); + BITS (ptr[j], 16, 14, "min mode filter"); + BITS (ptr[j], 13, 5, "lod bias (s4.4)"); + FLAG (ptr[j], 4, "shadow enable"); + FLAG (ptr[j], 3, "max-aniso-4"); + BITS (ptr[j], 2, 0, "shadow func"); + j++; + } + + { + fprintf (stderr, "\t TSn.1: 0x%08x\n", ptr[j]); + BITS (ptr[j], 31, 24, "min lod"); + MBZ( ptr[j], 23, 18 ); + FLAG (ptr[j], 17, "kill pixel enable"); + FLAG (ptr[j], 16, "keyed tex filter mode"); + FLAG (ptr[j], 15, "chromakey enable"); + BITS (ptr[j], 14, 12, "tcx wrap mode"); + BITS (ptr[j], 11, 9, "tcy wrap mode"); + BITS (ptr[j], 8, 6, "tcz wrap mode"); + FLAG (ptr[j], 5, "normalized coords"); + BITS (ptr[j], 4, 1, "map (surface) index"); + FLAG (ptr[j], 0, "EAST deinterlacer enable"); + j++; + } + { + fprintf (stderr, "\t TSn.2: 0x%08x (default color)\n", ptr[j]); + j++; + } + } + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t +debug_dest_vars (struct debug_stream *stream, + const char *name, + uint32_t len) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + { + fprintf (stderr, "\t0x%08x\n", ptr[j]); + FLAG (ptr[j], 31, "early classic ztest"); + FLAG (ptr[j], 30, "opengl tex default color"); + FLAG (ptr[j], 29, "bypass iz"); + FLAG (ptr[j], 28, "lod preclamp"); + BITS (ptr[j], 27, 26, "dither pattern"); + FLAG (ptr[j], 25, "linear gamma blend"); + FLAG (ptr[j], 24, "debug dither"); + BITS (ptr[j], 23, 20, "dstorg x"); + BITS (ptr[j], 19, 16, "dstorg y"); + MBZ (ptr[j], 15, 15 ); + BITS (ptr[j], 14, 12, "422 write select"); + BITS (ptr[j], 11, 8, "cbuf format"); + BITS (ptr[j], 3, 2, "zbuf format"); + FLAG (ptr[j], 1, "vert line stride"); + FLAG (ptr[j], 1, "vert line stride offset"); + j++; + } + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t debug_buf_info( struct debug_stream *stream, + const char *name, + uint32_t len ) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t j = 0; + + fprintf (stderr, "%04x: ", stream->offset); + fprintf (stderr, "%s (%d dwords):\n", name, len); + fprintf (stderr, "\t0x%08x\n", ptr[j++]); + + { + fprintf (stderr, "\t0x%08x\n", ptr[j]); + BITS (ptr[j], 28, 28, "aux buffer id"); + BITS (ptr[j], 27, 24, "buffer id (7=depth, 3=back)"); + FLAG (ptr[j], 23, "use fence regs"); + FLAG (ptr[j], 22, "tiled surface"); + FLAG (ptr[j], 21, "tile walk ymajor"); + MBZ (ptr[j], 20, 14); + BITS (ptr[j], 13, 2, "dword pitch"); + MBZ (ptr[j], 2, 0); + j++; + } + + fprintf (stderr, "\t0x%08x -- buffer base address\n", ptr[j++]); + + stream->offset += len * sizeof(uint32_t); + assert(j == len); + return TRUE; +} + +static cairo_bool_t +decode_3d_i915 (struct debug_stream *stream) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t cmd = *ptr; + + switch ((cmd >> 24) & 0x1f) { + case 0x6: + return debug (stream, "3DSTATE_ANTI_ALIASING", 1); + case 0x7: + return debug (stream, "3DSTATE_RASTERIZATION_RULES", 1); + case 0x8: + return debug (stream, "3DSTATE_BACKFACE_STENCIL_OPS", 1); + case 0x9: + return debug (stream, "3DSTATE_BACKFACE_STENCIL_MASKS", 1); + case 0xb: + return debug (stream, "3DSTATE_INDEPENDENT_ALPHA_BLEND", 1); + case 0xc: + return debug (stream, "3DSTATE_MODES5", 1); + case 0xd: + return debug_modes4(stream, "3DSTATE_MODES4", 1); + case 0x15: + return debug (stream, "3DSTATE_FOG_COLOR", 1); + case 0x16: + return debug (stream, "3DSTATE_COORD_SET_BINDINGS", 1); + case 0x1c: + /* 3DState16NP */ + switch((cmd >> 19) & 0x1f) { + case 0x10: + return debug (stream, "3DSTATE_SCISSOR_ENABLE", 1); + case 0x11: + return debug (stream, "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE", 1); + default: + break; + } + break; + case 0x1d: + /* 3DStateMW */ + switch ((cmd >> 16) & 0xff) { + case 0x0: + return debug_map_state(stream, "3DSTATE_MAP_STATE", (cmd & 0x1f) + 2); + case 0x1: + return debug_sampler_state(stream, "3DSTATE_SAMPLER_STATE", (cmd & 0x1f) + 2); + case 0x4: + return debug_load_immediate(stream, "3DSTATE_LOAD_STATE_IMMEDIATE", (cmd & 0xf) + 2); + case 0x5: + return debug_program(stream, "3DSTATE_PIXEL_SHADER_PROGRAM", (cmd & 0x1ff) + 2); + case 0x6: + return debug (stream, "3DSTATE_PIXEL_SHADER_CONSTANTS", (cmd & 0xff) + 2); + case 0x7: + return debug_load_indirect(stream, "3DSTATE_LOAD_INDIRECT", (cmd & 0xff) + 2); + case 0x80: + return debug (stream, "3DSTATE_DRAWING_RECTANGLE", (cmd & 0xffff) + 2); + case 0x81: + return debug (stream, "3DSTATE_SCISSOR_RECTANGLE", (cmd & 0xffff) + 2); + case 0x83: + return debug (stream, "3DSTATE_SPAN_STIPPLE", (cmd & 0xffff) + 2); + case 0x85: + return debug_dest_vars(stream, "3DSTATE_DEST_BUFFER_VARS", (cmd & 0xffff) + 2); + case 0x88: + return debug (stream, "3DSTATE_CONSTANT_BLEND_COLOR", (cmd & 0xffff) + 2); + case 0x89: + return debug (stream, "3DSTATE_FOG_MODE", (cmd & 0xffff) + 2); + case 0x8e: + return debug_buf_info(stream, "3DSTATE_BUFFER_INFO", (cmd & 0xffff) + 2); + case 0x97: + return debug (stream, "3DSTATE_DEPTH_OFFSET_SCALE", (cmd & 0xffff) + 2); + case 0x98: + return debug (stream, "3DSTATE_DEFAULT_Z", (cmd & 0xffff) + 2); + case 0x99: + return debug (stream, "3DSTATE_DEFAULT_DIFFUSE", (cmd & 0xffff) + 2); + case 0x9a: + return debug (stream, "3DSTATE_DEFAULT_SPECULAR", (cmd & 0xffff) + 2); + case 0x9c: + return debug (stream, "3DSTATE_CLEAR_PARAMETERS", (cmd & 0xffff) + 2); + default: + ASSERT_NOT_REACHED; + return 0; + } + break; + case 0x1e: + if (cmd & (1 << 23)) + return debug (stream, "???", (cmd & 0xffff) + 1); + else + return debug (stream, "", 1); + break; + case 0x1f: + if ((cmd & (1 << 23)) == 0) { + return debug_prim (stream, "3DPRIM (inline)", 1, (cmd & 0x1ffff) + 2); + } else if (cmd & (1 << 17)) { + if ((cmd & 0xffff) == 0) + return debug_variable_length_prim (stream); + else + return debug_prim (stream, "3DPRIM (indexed)", 0, (((cmd & 0xffff) + 1) / 2) + 1); + } else + return debug_prim (stream, "3DPRIM (indirect sequential)", 0, 2); + break; + default: + return debug (stream, "", 0); + } + + return FALSE; +} + +static cairo_bool_t +decode_3d_i965 (struct debug_stream *stream) +{ + const uint32_t *data = (uint32_t *) (stream->ptr + stream->offset); + const uint32_t opcode = (data[0] & 0xffff0000) >> 16; + unsigned int idx; + const struct { + uint32_t opcode; + int min_len; + int max_len; + const char *name; + } opcodes_3d[] = { + { 0x6000, 3, 3, "URB_FENCE" }, + { 0x6001, 2, 2, "CS_URB_STATE" }, + { 0x6002, 2, 2, "CONSTANT_BUFFER" }, + { 0x6101, 6, 6, "STATE_BASE_ADDRESS" }, + { 0x6102, 2, 2 , "STATE_SIP" }, + { 0x6104, 1, 1, "3DSTATE_PIPELINE_SELECT" }, + { 0x680b, 1, 1, "3DSTATE_VF_STATISTICS" }, + { 0x6904, 1, 1, "3DSTATE_PIPELINE_SELECT" }, + { 0x7800, 7, 7, "3DSTATE_PIPELINED_POINTERS" }, + { 0x7801, 6, 6, "3DSTATE_BINDING_TABLE_POINTERS" }, + { 0x780b, 1, 1, "3DSTATE_VF_STATISTICS" }, + { 0x7808, 5, 257, "3DSTATE_VERTEX_BUFFERS" }, + { 0x7809, 3, 256, "3DSTATE_VERTEX_ELEMENTS" }, + { 0x780a, 3, 3, "3DSTATE_INDEX_BUFFER" }, + { 0x7900, 4, 4, "3DSTATE_DRAWING_RECTANGLE" }, + { 0x7901, 5, 5, "3DSTATE_CONSTANT_COLOR" }, + { 0x7905, 5, 7, "3DSTATE_DEPTH_BUFFER" }, + { 0x7906, 2, 2, "3DSTATE_POLY_STIPPLE_OFFSET" }, + { 0x7907, 33, 33, "3DSTATE_POLY_STIPPLE_PATTERN" }, + { 0x7908, 3, 3, "3DSTATE_LINE_STIPPLE" }, + { 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" }, + { 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" }, + { 0x7b00, 6, 6, "3DPRIMITIVE" }, + }, *opcode_3d; + + for (idx = 0; idx < ARRAY_LENGTH (opcodes_3d); idx++) { + opcode_3d = &opcodes_3d[idx]; + if (opcode == opcode_3d->opcode) { + unsigned int len = 1; + if (opcode_3d->max_len != 1) + len = (data[0] & 0x000000ff) + 2; + return debug (stream, opcode_3d->name, len); + } + } + + return FALSE; +} + +static cairo_bool_t +decode_3d_i830 (struct debug_stream *stream) +{ + ASSERT_NOT_REACHED; + return FALSE; +} + +static cairo_bool_t +i915_debug_packet (struct debug_stream *stream, + int devid) +{ + uint32_t *ptr = (uint32_t *)(stream->ptr + stream->offset); + uint32_t cmd = *ptr; + + switch (((cmd >> 29) & 0x7)) { + case 0x0: + switch ((cmd >> 23) & 0x3f) { + case 0x0: + return debug (stream, "MI_NOOP", 1); + case 0x3: + return debug (stream, "MI_WAIT_FOR_EVENT", 1); + case 0x4: + return debug (stream, "MI_FLUSH", 1); + case 0xA: + debug (stream, "MI_BATCH_BUFFER_END", 1); + return FALSE; + case 0x22: + return debug (stream, "MI_LOAD_REGISTER_IMM", 3); + case 0x31: + return debug_chain(stream, "MI_BATCH_BUFFER_START", 2); + default: + break; + } + break; + case 0x1: + break; + case 0x2: + switch ((cmd >> 22) & 0xff) { + case 0x50: + return debug_color_blit(stream, "XY_COLOR_BLT", (cmd & 0xff) + 2); + case 0x53: + return debug_copy_blit(stream, "XY_SRC_COPY_BLT", (cmd & 0xff) + 2); + default: + return debug (stream, "blit command", (cmd & 0xff) + 2); + } + break; + case 0x3: + if (IS_965(devid)) + return decode_3d_i965 (stream); + else if (IS_9XX(devid)) + return decode_3d_i915 (stream); + else + return decode_3d_i830 (stream); + default: + break; + } + + fprintf (stderr, "Bogus cmd: %x [%x]\n", (cmd >> 29) & 7, cmd); + ASSERT_NOT_REACHED; + return 0; +} + +void +intel_dump_batchbuffer (const void *batch, + uint32_t length, + int devid) +{ + struct debug_stream stream; + cairo_bool_t done = FALSE; + + fprintf (stderr, "\nBATCH: (%d dwords)\n", length / 4); + + stream.offset = 0; + stream.ptr = batch; + + while (! done && stream.offset < length) { + if (! i915_debug_packet (&stream, devid)) + break; + + assert (stream.offset <= length); + } + + fprintf (stderr, "END-BATCH\n\n"); + fflush (stderr); +} diff --git a/src/drm/cairo-drm-intel-ioctl-private.h b/src/drm/cairo-drm-intel-ioctl-private.h new file mode 100644 index 000000000..004d3bfd7 --- /dev/null +++ b/src/drm/cairo-drm-intel-ioctl-private.h @@ -0,0 +1,442 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#ifndef CAIRO_DRM_INTEL_IOCTL_PRIVATE_H +#define CAIRO_DRM_INTEL_IOCTL_PRIVATE_H + +#include "cairo-drm-intel-command-private.h" + +#define I915_PARAM_IRQ_ACTIVE 1 +#define I915_PARAM_ALLOW_BATCHBUFFER 2 +#define I915_PARAM_LAST_DISPATCH 3 +#define I915_PARAM_CHIPSET_ID 4 +#define I915_PARAM_HAS_GEM 5 +#define I915_PARAM_NUM_FENCES_AVAIL 6 +#define I915_PARAM_HAS_OVERLAY 7 +#define I915_PARAM_HAS_PAGEFLIPPING 8 +#define I915_PARAM_HAS_EXECBUF2 9 + +struct intel_getparam { + int param; + int *value; +}; + + +/* @{ + * Intel memory domains + * + * Most of these just align with the various caches in + * the system and are used to flush and invalidate as + * objects end up cached in different domains. + */ +/* CPU cache */ +#define I915_GEM_DOMAIN_CPU 0x00000001 +/* Render cache, used by 2D and 3D drawing */ +#define I915_GEM_DOMAIN_RENDER 0x00000002 +/* Sampler cache, used by texture engine */ +#define I915_GEM_DOMAIN_SAMPLER 0x00000004 +/* Command queue, used to load batch buffers */ +#define I915_GEM_DOMAIN_COMMAND 0x00000008 +/* Instruction cache, used by shader programs */ +#define I915_GEM_DOMAIN_INSTRUCTION 0x00000010 +/* Vertex address cache */ +#define I915_GEM_DOMAIN_VERTEX 0x00000020 +/* GTT domain - aperture and scanout */ +#define I915_GEM_DOMAIN_GTT 0x00000040 +/* @} */ + +#define I915_TILING_NONE 0 +#define I915_TILING_X 1 +#define I915_TILING_Y 2 + +#define I915_BIT_6_SWIZZLE_NONE 0 +#define I915_BIT_6_SWIZZLE_9 1 +#define I915_BIT_6_SWIZZLE_9_10 2 +#define I915_BIT_6_SWIZZLE_9_11 3 +#define I915_BIT_6_SWIZZLE_9_10_11 4 + +#define DRM_I915_GEM_EXECBUFFER 0x14 +#define DRM_I915_GEM_BUSY 0x17 +#define DRM_I915_GEM_THROTTLE 0x18 +#define DRM_I915_GEM_CREATE 0x1b +#define DRM_I915_GEM_PREAD 0x1c +#define DRM_I915_GEM_PWRITE 0x1d +#define DRM_I915_GEM_MMAP 0x1e +#define DRM_I915_GEM_SET_DOMAIN 0x1f +#define DRM_I915_GEM_SET_TILING 0x21 +#define DRM_I915_GEM_GET_TILING 0x22 +#define DRM_I915_GEM_GET_APERTURE 0x23 +#define DRM_I915_GEM_MMAP_GTT 0x24 + +struct drm_i915_gem_create { + /* + * Requested size for the object. + * + * The (page-aligned) allocated size for the object will be returned. + */ + uint64_t size; + /* + * Returned handle for the object. + * + * Object handles are nonzero. + */ + uint32_t handle; + uint32_t pad; +}; + +struct drm_i915_gem_pread { + /* Handle for the object being read. */ + uint32_t handle; + uint32_t pad; + /* Offset into the object to read from */ + uint64_t offset; + /* Length of data to read */ + uint64_t size; + /* + * Pointer to write the data into. + * + * This is a fixed-size type for 32/64 compatibility. + */ + uint64_t data_ptr; +}; + +struct drm_i915_gem_pwrite { + /* Handle for the object being written to. */ + uint32_t handle; + uint32_t pad; + /* Offset into the object to write to */ + uint64_t offset; + /* Length of data to write */ + uint64_t size; + /* + * Pointer to read the data from. + * + * This is a fixed-size type for 32/64 compatibility. + */ + uint64_t data_ptr; +}; + +struct drm_i915_gem_mmap { + /* Handle for the object being mapped. */ + uint32_t handle; + uint32_t pad; + /* Offset in the object to map. */ + uint64_t offset; + /* + * Length of data to map. + * + * The value will be page-aligned. + */ + uint64_t size; + /* + * Returned pointer the data was mapped at. + * + * This is a fixed-size type for 32/64 compatibility. + */ + uint64_t addr_ptr; +}; + +struct drm_i915_gem_mmap_gtt { + /* Handle for the object being mapped. */ + uint32_t handle; + uint32_t pad; + /* + * Fake offset to use for subsequent mmap call + * + * This is a fixed-size type for 32/64 compatibility. + */ + uint64_t offset; +}; + +struct drm_i915_gem_set_domain { + /* Handle for the object */ + uint32_t handle; + + /* New read domains */ + uint32_t read_domains; + + /* New write domain */ + uint32_t write_domain; +}; + +struct drm_i915_gem_relocation_entry { + /* + * Handle of the buffer being pointed to by this relocation entry. + * + * It's appealing to make this be an index into the mm_validate_entry + * list to refer to the buffer, but this allows the driver to create + * a relocation list for state buffers and not re-write it per + * exec using the buffer. + */ + uint32_t target_handle; + + /* + * Value to be added to the offset of the target buffer to make up + * the relocation entry. + */ + uint32_t delta; + + /* Offset in the buffer the relocation entry will be written into */ + uint64_t offset; + + /* + * Offset value of the target buffer that the relocation entry was last + * written as. + * + * If the buffer has the same offset as last time, we can skip syncing + * and writing the relocation. This value is written back out by + * the execbuffer ioctl when the relocation is written. + */ + uint64_t presumed_offset; + + /* + * Target memory domains read by this operation. + */ + uint32_t read_domains; + + /* + * Target memory domains written by this operation. + * + * Note that only one domain may be written by the whole + * execbuffer operation, so that where there are conflicts, + * the application will get -EINVAL back. + */ + uint32_t write_domain; +}; + +struct drm_i915_gem_exec_object { + /* + * User's handle for a buffer to be bound into the GTT for this + * operation. + */ + uint32_t handle; + + /* Number of relocations to be performed on this buffer */ + uint32_t relocation_count; + /* + * Pointer to array of struct drm_i915_gem_relocation_entry containing + * the relocations to be performed in this buffer. + */ + uint64_t relocs_ptr; + + /* Required alignment in graphics aperture */ + uint64_t alignment; + + /* + * Returned value of the updated offset of the object, for future + * presumed_offset writes. + */ + uint64_t offset; +}; + +struct drm_i915_gem_execbuffer { + /* + * List of buffers to be validated with their relocations to be + * performend on them. + * + * This is a pointer to an array of struct drm_i915_gem_validate_entry. + * + * These buffers must be listed in an order such that all relocations + * a buffer is performing refer to buffers that have already appeared + * in the validate list. + */ + uint64_t buffers_ptr; + uint32_t buffer_count; + + /* Offset in the batchbuffer to start execution from. */ + uint32_t batch_start_offset; + /* Bytes used in batchbuffer from batch_start_offset */ + uint32_t batch_len; + uint32_t DR1; + uint32_t DR4; + uint32_t num_cliprects; + /* This is a struct drm_clip_rect *cliprects */ + uint64_t cliprects_ptr; +}; + +struct drm_i915_gem_busy { + /* Handle of the buffer to check for busy */ + uint32_t handle; + + /* Return busy status (1 if busy, 0 if idle) */ + uint32_t busy; +}; + +struct drm_i915_gem_set_tiling { + /* Handle of the buffer to have its tiling state updated */ + uint32_t handle; + + /* + * Tiling mode for the object (I915_TILING_NONE, I915_TILING_X, + * I915_TILING_Y). + * + * This value is to be set on request, and will be updated by the + * kernel on successful return with the actual chosen tiling layout. + * + * The tiling mode may be demoted to I915_TILING_NONE when the system + * has bit 6 swizzling that can't be managed correctly by GEM. + * + * Buffer contents become undefined when changing tiling_mode. + */ + uint32_t tiling_mode; + + /* + * Stride in bytes for the object when in I915_TILING_X or + * I915_TILING_Y. + */ + uint32_t stride; + + /* + * Returned address bit 6 swizzling required for CPU access through + * mmap mapping. + */ + uint32_t swizzle_mode; +}; + +struct drm_i915_gem_get_tiling { + /* Handle of the buffer to get tiling state for. */ + uint32_t handle; + + /* + * Current tiling mode for the object (I915_TILING_NONE, I915_TILING_X, + * I915_TILING_Y). + */ + uint32_t tiling_mode; + + /* + * Returned address bit 6 swizzling required for CPU access through + * mmap mapping. + */ + uint32_t swizzle_mode; +}; + +struct drm_i915_gem_get_aperture { + /* Total size of the aperture used by i915_gem_execbuffer, in bytes */ + uint64_t aper_size; + + /* + * Available space in the aperture used by i915_gem_execbuffer, in + * bytes + */ + uint64_t aper_available_size; +}; + +#define DRM_I915_GETPARAM 0x06 + +#define DRM_IOCTL_I915_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, struct intel_getparam) +#define DRM_IOCTL_I915_GEM_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer) +#define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy) +#define DRM_IOCTL_I915_GEM_THROTTLE DRM_IO ( DRM_COMMAND_BASE + DRM_I915_GEM_THROTTLE) +#define DRM_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create) +#define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) +#define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) +#define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) +#define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt) +#define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain) +#define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling) +#define DRM_IOCTL_I915_GEM_GET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling) +#define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) + +#define I915_MADV_WILLNEED 0 +#define I915_MADV_DONTNEED 1 + +struct drm_i915_gem_madvise { + uint32_t handle; + uint32_t madv; + uint32_t retained; +}; +#define DRM_I915_GEM_MADVISE 0x26 +#define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) + + +/* XXX execbuffer2 */ +struct drm_i915_gem_exec_object2 { + /* + * User's handle for a buffer to be bound into the GTT for this + * operation. + */ + uint32_t handle; + + /* Number of relocations to be performed on this buffer */ + uint32_t relocation_count; + /* + * Pointer to array of struct drm_i915_gem_relocation_entry containing + * the relocations to be performed in this buffer. + */ + uint64_t relocs_ptr; + + /* Required alignment in graphics aperture */ + uint64_t alignment; + + /* + * Returned value of the updated offset of the object, for future + * presumed_offset writes. + */ + uint64_t offset; + +#define EXEC_OBJECT_NEEDS_FENCE (1<<0) + uint64_t flags; + uint64_t rsvd1; + uint64_t rsvd2; +}; + +struct drm_i915_gem_execbuffer2 { + /* + * List of gem_exec_object2 structs + */ + uint64_t buffers_ptr; + uint32_t buffer_count; + + /* Offset in the batchbuffer to start execution from. */ + uint32_t batch_start_offset; + /* Bytes used in batchbuffer from batch_start_offset */ + uint32_t batch_len; + uint32_t DR1; + uint32_t DR4; + uint32_t num_cliprects; + /* This is a struct drm_clip_rect *cliprects */ + uint64_t cliprects_ptr; + uint64_t flags; + uint64_t rsvd1; + uint64_t rsvd2; +}; + +#define I915_GEM_3D_PIPELINE 0x1 +#define I915_GEM_MEDIA_PIPELINE 0x2 +#define DRM_I915_GEM_EXECBUFFER2 0x29 +#define DRM_IOCTL_I915_GEM_EXECBUFFER2 DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2, struct drm_i915_gem_execbuffer2) + +struct drm_i915_gem_real_size { + uint32_t handle; + uint64_t size; +}; +#define DRM_I915_GEM_REAL_SIZE 0x2a +#define DRM_IOCTL_I915_GEM_REAL_SIZE DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_REAL_SIZE, struct drm_i915_gem_real_size) + +#endif /* CAIRO_DRM_INTEL_IOCTL_PRIVATE_H */ diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h new file mode 100644 index 000000000..343270a3c --- /dev/null +++ b/src/drm/cairo-drm-intel-private.h @@ -0,0 +1,519 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#ifndef CAIRO_DRM_INTEL_PRIVATE_H +#define CAIRO_DRM_INTEL_PRIVATE_H + +#include "cairoint.h" +#include "cairo-cache-private.h" +#include "cairo-compiler-private.h" +#include "cairo-drm-private.h" +#include "cairo-freelist-private.h" +#include "cairo-list-private.h" +#include "cairo-mutex-private.h" +#include "cairo-rtree-private.h" +#include "cairo-types-private.h" + +#include "cairo-drm-intel-ioctl-private.h" + +#define INTEL_TILING_DEFAULT I915_TILING_Y + +#define INTEL_BO_CACHE_BUCKETS 12 /* cache surfaces up to 16 MiB */ + +#define INTEL_GLYPH_CACHE_WIDTH 1024 +#define INTEL_GLYPH_CACHE_HEIGHT 1024 +#define INTEL_GLYPH_CACHE_MIN_SIZE 1 +#define INTEL_GLYPH_CACHE_MAX_SIZE 128 + +typedef struct _intel_bo { + cairo_drm_bo_t base; + + cairo_list_t link; + cairo_list_t cache_list; + + uint32_t offset; + uint32_t batch_read_domains; + uint32_t batch_write_domain; + + uint32_t opaque0; + uint32_t opaque1; + + uint32_t full_size; + uint16_t stride; + uint16_t _stride; + uint32_t tiling :4; + uint32_t _tiling :4; + uint32_t purgeable :1; + uint32_t busy :1; + uint32_t cpu :1; + + struct drm_i915_gem_exec_object2 *exec; + void *virtual; +} intel_bo_t; + +#define INTEL_BATCH_SIZE (64*1024) +#define INTEL_VERTEX_BUFFER_SIZE (512*1024) +#define INTEL_MAX_RELOCS 2048 + +static inline void +intel_bo_mark_purgeable (intel_bo_t *bo) +{ + if (bo->base.name == 0) + bo->purgeable = 1; +} + +typedef struct _intel_vertex_buffer intel_vertex_buffer_t; + +typedef void (*intel_vertex_buffer_new_func_t) (intel_vertex_buffer_t *vertex_buffer); +typedef void (*intel_vertex_buffer_start_rectangles_func_t) (intel_vertex_buffer_t *vertex_buffer, + uint32_t floats_per_vertex); +typedef void (*intel_vertex_buffer_flush_func_t) (intel_vertex_buffer_t *vertex_buffer); +typedef void (*intel_vertex_buffer_finish_func_t) (intel_vertex_buffer_t *vertex_buffer); + +struct _intel_vertex_buffer { + uint32_t vbo_batch; /* reloc position in batch, 0 -> not yet allocated */ + uint32_t vbo_offset; + uint32_t vbo_used; + + uint32_t vertex_index; + uint32_t vertex_count; + + uint32_t floats_per_vertex; + uint32_t rectangle_size; + + intel_bo_t *last_vbo; + uint32_t last_vbo_offset; + uint32_t last_vbo_space; + + intel_vertex_buffer_new_func_t new; + intel_vertex_buffer_start_rectangles_func_t start_rectangles; + intel_vertex_buffer_flush_func_t flush; + intel_vertex_buffer_finish_func_t finish; + + uint32_t base[INTEL_VERTEX_BUFFER_SIZE / sizeof (uint32_t)]; +}; + +typedef struct _intel_batch intel_batch_t; + +typedef void (*intel_batch_commit_func_t) (intel_batch_t *batch); +typedef void (*intel_batch_reset_func_t) (intel_batch_t *batch); + +struct _intel_batch { + size_t gtt_size; + size_t gtt_avail_size; + + intel_batch_commit_func_t commit; + intel_batch_reset_func_t reset; + + uint16_t exec_count; + uint16_t reloc_count; + uint16_t used; + uint16_t header; + + intel_bo_t *target_bo[INTEL_MAX_RELOCS]; + struct drm_i915_gem_exec_object2 exec[INTEL_MAX_RELOCS]; + struct drm_i915_gem_relocation_entry reloc[INTEL_MAX_RELOCS]; + + uint32_t base[INTEL_BATCH_SIZE / sizeof (uint32_t)]; + + intel_vertex_buffer_t vertex_buffer; +}; + +typedef struct _intel_buffer { + intel_bo_t *bo; + uint32_t offset; + cairo_format_t format; + uint32_t map0, map1; + uint32_t width; + uint32_t height; + uint32_t stride; +} intel_buffer_t; + +typedef struct _intel_buffer_cache { + int ref_count; + intel_buffer_t buffer; + cairo_rtree_t rtree; + cairo_list_t link; +} intel_buffer_cache_t; + +typedef struct _intel_glyph { + cairo_rtree_node_t node; + intel_buffer_cache_t *cache; + void **owner; + float texcoord[3]; + int width, height; +} intel_glyph_t; + +typedef struct _intel_gradient_cache { + cairo_pattern_union_t pattern; + intel_buffer_t buffer; +} intel_gradient_cache_t; +#define GRADIENT_CACHE_SIZE 16 + +typedef struct _intel_surface { + cairo_drm_surface_t drm; + + cairo_cache_entry_t snapshot_cache_entry; +} intel_surface_t; + +typedef void (*intel_reset_context_func_t) (void *device); + +typedef struct _intel_device { + cairo_drm_device_t base; + + size_t gtt_max_size; + size_t gtt_avail_size; + + cairo_freepool_t bo_pool; + cairo_list_t bo_in_flight; + + cairo_mutex_t mutex; + intel_batch_t batch; + + intel_buffer_cache_t glyph_cache[2]; + cairo_list_t fonts; + + struct { + intel_gradient_cache_t cache[GRADIENT_CACHE_SIZE]; + unsigned int size; + } gradient_cache; + + cairo_cache_t snapshot_cache; + size_t snapshot_cache_max_size; + + intel_reset_context_func_t reset_context; + + cairo_status_t (*flush) (struct _intel_device *); +} intel_device_t; + +static inline intel_device_t * +to_intel_device (cairo_device_t *base) +{ + return (intel_device_t *) base; +} + +static inline intel_bo_t * +to_intel_bo (cairo_drm_bo_t *base) +{ + return (intel_bo_t *) base; +} + +static inline intel_bo_t * +intel_bo_reference (intel_bo_t *bo) +{ + return to_intel_bo (cairo_drm_bo_reference (&bo->base)); +} + +cairo_private cairo_bool_t +intel_bo_madvise (intel_device_t *device, intel_bo_t *bo, int madv); + +static cairo_always_inline void +intel_bo_destroy (intel_device_t *device, intel_bo_t *bo) +{ + cairo_drm_bo_destroy (&device->base.base, &bo->base); +} + +static inline void +intel_bo_in_flight_add (intel_device_t *device, + intel_bo_t *bo) +{ + if (bo->base.name == 0 && bo->exec != NULL && cairo_list_is_empty (&bo->cache_list)) + cairo_list_add (&bo->cache_list, &device->bo_in_flight); +} + +cairo_private int +intel_get (int fd, int param); + +cairo_private cairo_bool_t +intel_info (int fd, uint64_t *gtt_size); + +cairo_private cairo_status_t +intel_device_init (intel_device_t *device, int fd); + +cairo_private void +intel_device_fini (intel_device_t *dev); + +cairo_private intel_bo_t * +intel_bo_create (intel_device_t *dev, + uint32_t max_size, + uint32_t real_size, + cairo_bool_t gpu_target, + uint32_t tiling, + uint32_t stride); + +cairo_private intel_bo_t * +intel_bo_create_for_name (intel_device_t *dev, uint32_t name); + +cairo_private void +intel_bo_set_tiling (const intel_device_t *dev, + intel_bo_t *bo); + +cairo_private cairo_bool_t +intel_bo_is_inactive (const intel_device_t *device, + intel_bo_t *bo); + +cairo_private cairo_bool_t +intel_bo_wait (const intel_device_t *device, const intel_bo_t *bo); + +cairo_private void +intel_bo_write (const intel_device_t *dev, + intel_bo_t *bo, + unsigned long offset, + unsigned long size, + const void *data); + +cairo_private void +intel_bo_read (const intel_device_t *dev, + intel_bo_t *bo, + unsigned long offset, + unsigned long size, + void *data); + +cairo_private void * +intel_bo_map (const intel_device_t *dev, intel_bo_t *bo); + +cairo_private void +intel_bo_unmap (intel_bo_t *bo); + +cairo_private cairo_status_t +intel_bo_init (const intel_device_t *dev, + intel_bo_t *bo, + uint32_t size, + uint32_t initial_domain); + +cairo_private cairo_status_t +intel_bo_init_for_name (const intel_device_t *dev, + intel_bo_t *bo, + uint32_t size, + uint32_t name); + +cairo_private cairo_surface_t * +intel_bo_get_image (const intel_device_t *device, + intel_bo_t *bo, + const cairo_drm_surface_t *surface); + +cairo_private cairo_status_t +intel_bo_put_image (intel_device_t *dev, + intel_bo_t *bo, + cairo_image_surface_t *src, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y); + +cairo_private void +intel_surface_init (intel_surface_t *surface, + const cairo_surface_backend_t *backend, + cairo_drm_device_t *device, + cairo_format_t format, + int width, int height); + +cairo_private cairo_status_t +intel_buffer_cache_init (intel_buffer_cache_t *cache, + intel_device_t *device, + cairo_format_t format, + int width, int height); + +cairo_private cairo_status_t +intel_gradient_render (intel_device_t *device, + const cairo_gradient_pattern_t *pattern, + intel_buffer_t *buffer); + +cairo_private cairo_int_status_t +intel_get_glyph (intel_device_t *device, + cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph); + +cairo_private void +intel_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font); + +cairo_private void +intel_scaled_font_fini (cairo_scaled_font_t *scaled_font); + +cairo_private void +intel_glyph_cache_unpin (intel_device_t *device); + +static inline intel_glyph_t * +intel_glyph_pin (intel_glyph_t *glyph) +{ + cairo_rtree_node_t *node = &glyph->node; + if (unlikely (node->pinned == 0)) + return _cairo_rtree_pin (&glyph->cache->rtree, node); + return glyph; +} + +cairo_private cairo_status_t +intel_snapshot_cache_insert (intel_device_t *device, + intel_surface_t *surface); + +cairo_private void +intel_surface_detach_snapshot (cairo_surface_t *abstract_surface); + +cairo_private void +intel_snapshot_cache_thaw (intel_device_t *device); + +cairo_private void +intel_throttle (intel_device_t *device); + +cairo_private cairo_status_t +intel_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra); + +cairo_private void +intel_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra); +cairo_private cairo_surface_t * +intel_surface_map_to_image (void *abstract_surface); + +cairo_private cairo_status_t +intel_surface_flush (void *abstract_surface, + unsigned flags); + +cairo_private cairo_status_t +intel_surface_finish (void *abstract_surface); + +cairo_private void +intel_dump_batchbuffer (const void *batch, + uint32_t length, + int devid); + +static inline uint32_t cairo_const +MS3_tiling (uint32_t tiling) +{ + switch (tiling) { + default: + case I915_TILING_NONE: return 0; + case I915_TILING_X: return MS3_TILED_SURFACE; + case I915_TILING_Y: return MS3_TILED_SURFACE | MS3_TILE_WALK; + } +} + +static inline float cairo_const +texcoord_2d_16 (double x, double y) +{ + union { + uint32_t ui; + float f; + } u; + u.ui = (_cairo_half_from_float (y) << 16) | _cairo_half_from_float (x); + return u.f; +} + +#define PCI_CHIP_I810 0x7121 +#define PCI_CHIP_I810_DC100 0x7123 +#define PCI_CHIP_I810_E 0x7125 +#define PCI_CHIP_I815 0x1132 + +#define PCI_CHIP_I830_M 0x3577 +#define PCI_CHIP_845_G 0x2562 +#define PCI_CHIP_I855_GM 0x3582 +#define PCI_CHIP_I865_G 0x2572 + +#define PCI_CHIP_I915_G 0x2582 +#define PCI_CHIP_E7221_G 0x258A +#define PCI_CHIP_I915_GM 0x2592 +#define PCI_CHIP_I945_G 0x2772 +#define PCI_CHIP_I945_GM 0x27A2 +#define PCI_CHIP_I945_GME 0x27AE + +#define PCI_CHIP_Q35_G 0x29B2 +#define PCI_CHIP_G33_G 0x29C2 +#define PCI_CHIP_Q33_G 0x29D2 + +#define PCI_CHIP_IGD_GM 0xA011 +#define PCI_CHIP_IGD_G 0xA001 + +#define IS_IGDGM(devid) (devid == PCI_CHIP_IGD_GM) +#define IS_IGDG(devid) (devid == PCI_CHIP_IGD_G) +#define IS_IGD(devid) (IS_IGDG(devid) || IS_IGDGM(devid)) + +#define PCI_CHIP_I965_G 0x29A2 +#define PCI_CHIP_I965_Q 0x2992 +#define PCI_CHIP_I965_G_1 0x2982 +#define PCI_CHIP_I946_GZ 0x2972 +#define PCI_CHIP_I965_GM 0x2A02 +#define PCI_CHIP_I965_GME 0x2A12 + +#define PCI_CHIP_GM45_GM 0x2A42 + +#define PCI_CHIP_IGD_E_G 0x2E02 +#define PCI_CHIP_Q45_G 0x2E12 +#define PCI_CHIP_G45_G 0x2E22 +#define PCI_CHIP_G41_G 0x2E32 + +#define PCI_CHIP_ILD_G 0x0042 +#define PCI_CHIP_ILM_G 0x0046 + +#define IS_MOBILE(devid) (devid == PCI_CHIP_I855_GM || \ + devid == PCI_CHIP_I915_GM || \ + devid == PCI_CHIP_I945_GM || \ + devid == PCI_CHIP_I945_GME || \ + devid == PCI_CHIP_I965_GM || \ + devid == PCI_CHIP_I965_GME || \ + devid == PCI_CHIP_GM45_GM || IS_IGD(devid)) + +#define IS_G45(devid) (devid == PCI_CHIP_IGD_E_G || \ + devid == PCI_CHIP_Q45_G || \ + devid == PCI_CHIP_G45_G || \ + devid == PCI_CHIP_G41_G) +#define IS_GM45(devid) (devid == PCI_CHIP_GM45_GM) +#define IS_G4X(devid) (IS_G45(devid) || IS_GM45(devid)) + +#define IS_ILD(devid) (devid == PCI_CHIP_ILD_G) +#define IS_ILM(devid) (devid == PCI_CHIP_ILM_G) +#define IS_IRONLAKE(devid) (IS_ILD(devid) || IS_ILM(devid)) + +#define IS_915(devid) (devid == PCI_CHIP_I915_G || \ + devid == PCI_CHIP_E7221_G || \ + devid == PCI_CHIP_I915_GM) + +#define IS_945(devid) (devid == PCI_CHIP_I945_G || \ + devid == PCI_CHIP_I945_GM || \ + devid == PCI_CHIP_I945_GME || \ + devid == PCI_CHIP_G33_G || \ + devid == PCI_CHIP_Q33_G || \ + devid == PCI_CHIP_Q35_G || IS_IGD(devid)) + +#define IS_965(devid) (devid == PCI_CHIP_I965_G || \ + devid == PCI_CHIP_I965_Q || \ + devid == PCI_CHIP_I965_G_1 || \ + devid == PCI_CHIP_I965_GM || \ + devid == PCI_CHIP_I965_GME || \ + devid == PCI_CHIP_I946_GZ || \ + IS_G4X(devid) || \ + IS_IRONLAKE(devid)) + +#define IS_9XX(devid) (IS_915(devid) || \ + IS_945(devid) || \ + IS_965(devid)) + + +#endif /* CAIRO_DRM_INTEL_PRIVATE_H */ diff --git a/src/drm/cairo-drm-intel-surface.c b/src/drm/cairo-drm-intel-surface.c new file mode 100644 index 000000000..88f5b8f0c --- /dev/null +++ b/src/drm/cairo-drm-intel-surface.c @@ -0,0 +1,451 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-intel-private.h" + +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" + +/* Basic generic/stub surface for intel chipsets */ + +#define MAX_SIZE 2048 + +static cairo_surface_t * +intel_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + return cairo_image_surface_create (_cairo_format_from_content (content), + width, height); +} + +cairo_status_t +intel_surface_finish (void *abstract_surface) +{ + intel_surface_t *surface = abstract_surface; + + intel_bo_in_flight_add (to_intel_device (surface->drm.base.device), + to_intel_bo (surface->drm.bo)); + return _cairo_drm_surface_finish (&surface->drm); +} + +static void +surface_finish_and_destroy (cairo_surface_t *surface) +{ + cairo_surface_finish (surface); + cairo_surface_destroy (surface); +} + +cairo_status_t +intel_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + intel_surface_t *surface = abstract_surface; + cairo_surface_t *image; + cairo_status_t status; + void *ptr; + + if (surface->drm.fallback != NULL) { + image = surface->drm.fallback; + goto DONE; + } + + image = _cairo_surface_has_snapshot (&surface->drm.base, + &_cairo_image_surface_backend); + if (image != NULL) + goto DONE; + + if (surface->drm.base.backend->flush != NULL) { + status = surface->drm.base.backend->flush (surface); + if (unlikely (status)) + return status; + } + + ptr = intel_bo_map (to_intel_device (surface->drm.base.device), + to_intel_bo (surface->drm.bo)); + if (unlikely (ptr == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + image = cairo_image_surface_create_for_data (ptr, + surface->drm.format, + surface->drm.width, + surface->drm.height, + surface->drm.stride); + if (unlikely (image->status)) + return image->status; + + _cairo_surface_attach_snapshot (&surface->drm.base, image, surface_finish_and_destroy); + +DONE: + *image_out = (cairo_image_surface_t *) cairo_surface_reference (image); + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; +} + +void +intel_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +cairo_surface_t * +intel_surface_map_to_image (void *abstract_surface) +{ + intel_surface_t *surface = abstract_surface; + + if (surface->drm.fallback == NULL) { + cairo_surface_t *image; + cairo_status_t status; + void *ptr; + + if (surface->drm.base.backend->flush != NULL) { + status = surface->drm.base.backend->flush (surface); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + } + + ptr = intel_bo_map (to_intel_device (surface->drm.base.device), + to_intel_bo (surface->drm.bo)); + if (unlikely (ptr == NULL)) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + image = cairo_image_surface_create_for_data (ptr, + surface->drm.format, + surface->drm.width, + surface->drm.height, + surface->drm.stride); + if (unlikely (image->status)) + return image; + + surface->drm.fallback = image; + } + + return surface->drm.fallback; +} + +cairo_status_t +intel_surface_flush (void *abstract_surface, unsigned flags) +{ + intel_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (surface->drm.fallback == NULL) + return CAIRO_STATUS_SUCCESS; + + /* kill any outstanding maps */ + cairo_surface_finish (surface->drm.fallback); + + status = cairo_surface_status (surface->drm.fallback); + cairo_surface_destroy (surface->drm.fallback); + surface->drm.fallback = NULL; + + return status; +} + +static cairo_int_status_t +intel_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_clip_t *clip) +{ + return _cairo_surface_paint (intel_surface_map_to_image (abstract_surface), + op, source, clip); +} + +static cairo_int_status_t +intel_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + cairo_clip_t *clip) +{ + return _cairo_surface_mask (intel_surface_map_to_image (abstract_surface), + op, source, mask, clip); +} + +static cairo_int_status_t +intel_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + return _cairo_surface_stroke (intel_surface_map_to_image (abstract_surface), + op, source, path, stroke_style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +intel_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + return _cairo_surface_fill (intel_surface_map_to_image (abstract_surface), + op, source, path, fill_rule, + tolerance, antialias, clip); +} + +static cairo_int_status_t +intel_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining) +{ + *num_remaining = 0; + return _cairo_surface_show_text_glyphs (intel_surface_map_to_image (abstract_surface), + op, source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, clip); +} + +static const cairo_surface_backend_t intel_surface_backend = { + CAIRO_SURFACE_TYPE_DRM, + _cairo_default_context_create, + + intel_surface_create_similar, + intel_surface_finish, + + NULL, + intel_surface_acquire_source_image, + intel_surface_release_source_image, + + NULL, NULL, NULL, + NULL, /* composite */ + NULL, /* fill */ + NULL, /* trapezoids */ + NULL, /* span */ + NULL, /* check-span */ + + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_drm_surface_get_extents, + NULL, /* old-glyphs */ + _cairo_drm_surface_get_font_options, + + intel_surface_flush, + NULL, /* mark dirty */ + NULL, NULL, /* font/glyph fini */ + + intel_surface_paint, + intel_surface_mask, + intel_surface_stroke, + intel_surface_fill, + intel_surface_glyphs, +}; + +void +intel_surface_init (intel_surface_t *surface, + const cairo_surface_backend_t *backend, + cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + _cairo_surface_init (&surface->drm.base, + backend, + &device->base, + _cairo_content_from_format (format)); + _cairo_drm_surface_init (&surface->drm, format, width, height); + + surface->snapshot_cache_entry.hash = 0; +} + +static cairo_surface_t * +intel_surface_create (cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + intel_surface_t *surface; + cairo_status_t status; + + surface = malloc (sizeof (intel_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + intel_surface_init (surface, &intel_surface_backend, device, + format, width, height); + + if (width && height) { + /* Vol I, p134: size restrictions for textures */ + width = (width + 3) & -4; + height = (height + 1) & -2; + surface->drm.stride = + cairo_format_stride_for_width (surface->drm.format, width); + surface->drm.bo = &intel_bo_create (to_intel_device (&device->base), + surface->drm.stride * height, + surface->drm.stride * height, + TRUE, I915_TILING_NONE, surface->drm.stride)->base; + if (surface->drm.bo == NULL) { + status = _cairo_drm_surface_finish (&surface->drm); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + return &surface->drm.base; +} + +static cairo_surface_t * +intel_surface_create_for_name (cairo_drm_device_t *device, + unsigned int name, + cairo_format_t format, + int width, int height, int stride) +{ + intel_surface_t *surface; + cairo_status_t status; + + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + } + + if (stride < cairo_format_stride_for_width (format, width)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + + surface = malloc (sizeof (intel_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + intel_surface_init (surface, &intel_surface_backend, + device, format, width, height); + + if (width && height) { + surface->drm.stride = stride; + + surface->drm.bo = &intel_bo_create_for_name (to_intel_device (&device->base), + name)->base; + if (unlikely (surface->drm.bo == NULL)) { + status = _cairo_drm_surface_finish (&surface->drm); + free (surface); + return _cairo_surface_create_in_error (_cairo_error + (CAIRO_STATUS_NO_MEMORY)); + } + } + + return &surface->drm.base; +} + +static cairo_status_t +intel_surface_enable_scan_out (void *abstract_surface) +{ + intel_surface_t *surface = abstract_surface; + + if (unlikely (surface->drm.bo == NULL)) + return _cairo_error (CAIRO_STATUS_INVALID_SIZE); + + to_intel_bo (surface->drm.bo)->tiling = I915_TILING_X; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +intel_device_throttle (cairo_drm_device_t *device) +{ + intel_throttle (to_intel_device (&device->base)); + return CAIRO_STATUS_SUCCESS; +} + +static void +intel_device_destroy (void *data) +{ + intel_device_t *device = data; + + intel_device_fini (device); + + free (data); +} + +cairo_drm_device_t * +_cairo_drm_intel_device_create (int fd, dev_t dev, int vendor_id, int chip_id) +{ + intel_device_t *device; + cairo_status_t status; + + if (! intel_info (fd, NULL)) + return NULL; + + device = malloc (sizeof (intel_device_t)); + if (unlikely (device == NULL)) + return (cairo_drm_device_t *) _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + + status = intel_device_init (device, fd); + if (unlikely (status)) { + free (device); + return (cairo_drm_device_t *) _cairo_device_create_in_error (status); + } + + device->base.surface.create = intel_surface_create; + device->base.surface.create_for_name = intel_surface_create_for_name; + device->base.surface.create_from_cacheable_image = NULL; + device->base.surface.flink = _cairo_drm_surface_flink; + device->base.surface.enable_scan_out = intel_surface_enable_scan_out; + + device->base.surface.map_to_image = intel_surface_map_to_image; + + device->base.device.flush = NULL; + device->base.device.throttle = intel_device_throttle; + device->base.device.destroy = intel_device_destroy; + + return _cairo_drm_device_init (&device->base, + fd, dev, + vendor_id, chip_id, + MAX_SIZE); +} diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c new file mode 100644 index 000000000..d45155ebe --- /dev/null +++ b/src/drm/cairo-drm-intel.c @@ -0,0 +1,1389 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-ioctl-private.h" +#include "cairo-drm-intel-private.h" +#include "cairo-drm-intel-ioctl-private.h" + +#include "cairo-error-private.h" +#include "cairo-freelist-private.h" + +#include +#include +#include + +#define GLYPH_CACHE_WIDTH 1024 +#define GLYPH_CACHE_HEIGHT 1024 +#define GLYPH_CACHE_MIN_SIZE 1 +#define GLYPH_CACHE_MAX_SIZE 128 + +#define IMAGE_CACHE_WIDTH 1024 +#define IMAGE_CACHE_HEIGHT 1024 + +int +intel_get (int fd, int param) +{ + struct intel_getparam gp; + int value; + + gp.param = param; + gp.value = &value; + if (ioctl (fd, DRM_IOCTL_I915_GETPARAM, &gp) < 0) + return 0; + + VG (VALGRIND_MAKE_MEM_DEFINED (&value, sizeof (value))); + + return value; +} + +cairo_bool_t +intel_info (int fd, uint64_t *gtt_size) +{ + struct drm_i915_gem_get_aperture info; + + if (! intel_get (fd, I915_PARAM_HAS_GEM)) + return FALSE; + + if (! intel_get (fd, I915_PARAM_HAS_EXECBUF2)) + return FALSE; + + if (ioctl (fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &info) < 0) + return FALSE; + + VG (VALGRIND_MAKE_MEM_DEFINED (&info, sizeof (info))); + + if (gtt_size != NULL) + *gtt_size = info.aper_size; + + return TRUE; +} + +void +intel_bo_write (const intel_device_t *device, + intel_bo_t *bo, + unsigned long offset, + unsigned long size, + const void *data) +{ + struct drm_i915_gem_pwrite pwrite; + int ret; + + assert (bo->tiling == I915_TILING_NONE); + assert (size); + assert (offset < bo->base.size); + assert (size+offset <= bo->base.size); + + intel_bo_set_tiling (device, bo); + + assert (bo->_tiling == I915_TILING_NONE); + + memset (&pwrite, 0, sizeof (pwrite)); + pwrite.handle = bo->base.handle; + pwrite.offset = offset; + pwrite.size = size; + pwrite.data_ptr = (uint64_t) (uintptr_t) data; + do { + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite); + } while (ret == -1 && errno == EINTR); + assert (ret == 0); + + bo->busy = FALSE; +} + +void +intel_bo_read (const intel_device_t *device, + intel_bo_t *bo, + unsigned long offset, + unsigned long size, + void *data) +{ + struct drm_i915_gem_pread pread; + int ret; + + assert (bo->tiling == I915_TILING_NONE); + assert (size); + assert (offset < bo->base.size); + assert (size+offset <= bo->base.size); + + intel_bo_set_tiling (device, bo); + + assert (bo->_tiling == I915_TILING_NONE); + + memset (&pread, 0, sizeof (pread)); + pread.handle = bo->base.handle; + pread.offset = offset; + pread.size = size; + pread.data_ptr = (uint64_t) (uintptr_t) data; + do { + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_PREAD, &pread); + } while (ret == -1 && errno == EINTR); + assert (ret == 0); + + bo->cpu = TRUE; + bo->busy = FALSE; +} + +void * +intel_bo_map (const intel_device_t *device, intel_bo_t *bo) +{ + struct drm_i915_gem_set_domain set_domain; + uint32_t domain; + int ret; + + intel_bo_set_tiling (device, bo); + + if (bo->virtual != NULL) + return bo->virtual; + + if (bo->cpu && bo->tiling == I915_TILING_NONE) { + struct drm_i915_gem_mmap mmap_arg; + + mmap_arg.handle = bo->base.handle; + mmap_arg.offset = 0; + mmap_arg.size = bo->base.size; + mmap_arg.addr_ptr = 0; + + do { + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_MMAP, &mmap_arg); + } while (ret == -1 && errno == EINTR); + if (unlikely (ret != 0)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + bo->virtual = (void *) (uintptr_t) mmap_arg.addr_ptr; + domain = I915_GEM_DOMAIN_CPU; + } else { + struct drm_i915_gem_mmap_gtt mmap_arg; + void *ptr; + + /* Get the fake offset back... */ + mmap_arg.handle = bo->base.handle; + do { + ret = ioctl (device->base.fd, + DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_arg); + } while (ret == -1 && errno == EINTR); + if (unlikely (ret != 0)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + /* and mmap it */ + ptr = mmap (0, bo->base.size, PROT_READ | PROT_WRITE, + MAP_SHARED, device->base.fd, + mmap_arg.offset); + if (unlikely (ptr == MAP_FAILED)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + bo->virtual = ptr; + domain = I915_GEM_DOMAIN_GTT; + } + + VG (VALGRIND_MAKE_MEM_DEFINED (bo->virtual, bo->base.size)); + + set_domain.handle = bo->base.handle; + set_domain.read_domains = domain; + set_domain.write_domain = domain; + + do { + ret = ioctl (device->base.fd, + DRM_IOCTL_I915_GEM_SET_DOMAIN, + &set_domain); + } while (ret == -1 && errno == EINTR); + + if (ret != 0) { + intel_bo_unmap (bo); + _cairo_error_throw (CAIRO_STATUS_DEVICE_ERROR); + return NULL; + } + + bo->busy = FALSE; + return bo->virtual; +} + +void +intel_bo_unmap (intel_bo_t *bo) +{ + munmap (bo->virtual, bo->base.size); + bo->virtual = NULL; +} + +cairo_bool_t +intel_bo_is_inactive (const intel_device_t *device, intel_bo_t *bo) +{ + struct drm_i915_gem_busy busy; + + if (! bo->busy) + return TRUE; + + /* Is this buffer busy for our intended usage pattern? */ + busy.handle = bo->base.handle; + busy.busy = 1; + ioctl (device->base.fd, DRM_IOCTL_I915_GEM_BUSY, &busy); + + bo->busy = busy.busy; + return ! busy.busy; +} + +cairo_bool_t +intel_bo_wait (const intel_device_t *device, const intel_bo_t *bo) +{ + struct drm_i915_gem_set_domain set_domain; + int ret; + + set_domain.handle = bo->base.handle; + set_domain.read_domains = I915_GEM_DOMAIN_GTT; + set_domain.write_domain = 0; + + do { + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain); + } while (ret == -1 && errno == EINTR); + + return ret == 0; +} + +static inline int +pot (int v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + +cairo_bool_t +intel_bo_madvise (intel_device_t *device, + intel_bo_t *bo, + int advice) +{ + struct drm_i915_gem_madvise madv; + + madv.handle = bo->base.handle; + madv.madv = advice; + madv.retained = TRUE; + ioctl (device->base.fd, DRM_IOCTL_I915_GEM_MADVISE, &madv); + return madv.retained; +} + +static void +intel_bo_set_real_size (intel_device_t *device, + intel_bo_t *bo, + size_t size) +{ + struct drm_i915_gem_real_size arg; + int ret; + + return; + + if (size == bo->base.size) + return; + + arg.handle = bo->base.handle; + arg.size = size; + do { + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_REAL_SIZE, &arg); + } while (ret == -1 && errno == EINTR); + + if (ret == 0) { + if (size > bo->base.size) { + assert (bo->exec == NULL); + bo->cpu = TRUE; + bo->busy = FALSE; + } + + bo->base.size = size; + } +} + +intel_bo_t * +intel_bo_create (intel_device_t *device, + uint32_t max_size, + uint32_t real_size, + cairo_bool_t gpu_target, + uint32_t tiling, + uint32_t stride) +{ + intel_bo_t *bo; + uint32_t cache_size; + struct drm_i915_gem_create create; + int bucket; + int ret; + + max_size = (max_size + 4095) & -4096; + real_size = (real_size + 4095) & -4096; + cache_size = pot (max_size); + bucket = ffs (cache_size / 4096) - 1; + if (bucket >= INTEL_BO_CACHE_BUCKETS) + cache_size = max_size; + + if (gpu_target) { + intel_bo_t *first = NULL; + + cairo_list_foreach_entry (bo, intel_bo_t, + &device->bo_in_flight, + cache_list) + { + assert (bo->exec != NULL); + if (tiling && bo->_tiling && + (bo->_tiling != tiling || bo->_stride != stride)) + { + continue; + } + + if (real_size <= bo->base.size) { + if (real_size >= bo->base.size/2) { + cairo_list_del (&bo->cache_list); + bo = intel_bo_reference (bo); + goto DONE; + } + + if (first == NULL) + first = bo; + } + } + + if (first != NULL) { + cairo_list_del (&first->cache_list); + bo = intel_bo_reference (first); + goto DONE; + } + } + + /* no cached buffer available, allocate fresh */ + bo = _cairo_freepool_alloc (&device->bo_pool); + if (unlikely (bo == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return bo; + } + + cairo_list_init (&bo->cache_list); + + bo->base.name = 0; + + bo->offset = 0; + bo->virtual = NULL; + bo->cpu = TRUE; + + bo->_tiling = I915_TILING_NONE; + bo->_stride = 0; + bo->purgeable = 0; + bo->busy = FALSE; + + bo->opaque0 = 0; + bo->opaque1 = 0; + + bo->exec = NULL; + bo->batch_read_domains = 0; + bo->batch_write_domain = 0; + cairo_list_init (&bo->link); + + create.size = cache_size; + create.handle = 0; + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_CREATE, &create); + if (unlikely (ret != 0)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + _cairo_freepool_free (&device->bo_pool, bo); + return NULL; + } + + bo->base.handle = create.handle; + bo->full_size = bo->base.size = create.size; + + intel_bo_set_real_size (device, bo, real_size); + CAIRO_REFERENCE_COUNT_INIT (&bo->base.ref_count, 1); +DONE: + bo->tiling = tiling; + bo->stride = stride; + return bo; +} + +intel_bo_t * +intel_bo_create_for_name (intel_device_t *device, uint32_t name) +{ + struct drm_i915_gem_get_tiling get_tiling; + cairo_status_t status; + intel_bo_t *bo; + int ret; + + bo = _cairo_freepool_alloc (&device->bo_pool); + if (unlikely (bo == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + status = _cairo_drm_bo_open_for_name (&device->base, &bo->base, name); + if (unlikely (status)) + goto FAIL; + + CAIRO_REFERENCE_COUNT_INIT (&bo->base.ref_count, 1); + cairo_list_init (&bo->cache_list); + + bo->full_size = bo->base.size; + bo->offset = 0; + bo->virtual = NULL; + bo->purgeable = 0; + bo->busy = TRUE; + bo->cpu = FALSE; + + bo->opaque0 = 0; + bo->opaque1 = 0; + + bo->exec = NULL; + bo->batch_read_domains = 0; + bo->batch_write_domain = 0; + cairo_list_init (&bo->link); + + memset (&get_tiling, 0, sizeof (get_tiling)); + get_tiling.handle = bo->base.handle; + + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling); + if (unlikely (ret != 0)) { + _cairo_error_throw (CAIRO_STATUS_DEVICE_ERROR); + _cairo_drm_bo_close (&device->base, &bo->base); + goto FAIL; + } + + bo->_tiling = bo->tiling = get_tiling.tiling_mode; + // bo->stride = get_tiling.stride; /* XXX not available from get_tiling */ + + return bo; + +FAIL: + _cairo_freepool_free (&device->bo_pool, bo); + return NULL; +} + +static void +intel_bo_release (void *_dev, void *_bo) +{ + intel_device_t *device = _dev; + intel_bo_t *bo = _bo; + + if (bo->virtual != NULL) + intel_bo_unmap (bo); + + assert (bo->exec == NULL); + assert (cairo_list_is_empty (&bo->cache_list)); + + _cairo_drm_bo_close (&device->base, &bo->base); + _cairo_freepool_free (&device->bo_pool, bo); +} + +void +intel_bo_set_tiling (const intel_device_t *device, + intel_bo_t *bo) +{ + struct drm_i915_gem_set_tiling set_tiling; + int ret; + + if (bo->tiling == bo->_tiling && + (bo->tiling == I915_TILING_NONE || bo->stride == bo->_stride)) + return; + + do { + set_tiling.handle = bo->base.handle; + set_tiling.tiling_mode = bo->tiling; + set_tiling.stride = bo->stride; + + ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); + } while (ret == -1 && errno == EINTR); + + assert (ret == 0); + bo->_tiling = bo->tiling; + bo->_stride = bo->stride; +} + +cairo_surface_t * +intel_bo_get_image (const intel_device_t *device, + intel_bo_t *bo, + const cairo_drm_surface_t *surface) +{ + cairo_image_surface_t *image; + uint8_t *dst; + int size, row; + + image = (cairo_image_surface_t *) + cairo_image_surface_create (surface->format, + surface->width, + surface->height); + if (unlikely (image->base.status)) + return &image->base; + + intel_bo_set_tiling (device, bo); + + if (bo->tiling == I915_TILING_NONE && image->stride == surface->stride) { + size = surface->stride * surface->height; + intel_bo_read (device, bo, 0, size, image->data); + } else { + const uint8_t *src; + + src = intel_bo_map (device, bo); + if (unlikely (src == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + size = surface->width; + if (surface->format != CAIRO_FORMAT_A8) + size *= 4; + + row = surface->height; + dst = image->data; + while (row--) { + memcpy (dst, src, size); + dst += image->stride; + src += surface->stride; + } + } + + return &image->base; +} + +static cairo_status_t +_intel_bo_put_a1_image (intel_device_t *device, + intel_bo_t *bo, + cairo_image_surface_t *src, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y) +{ + uint8_t buf[CAIRO_STACK_BUFFER_SIZE]; + uint8_t *a8 = buf; + uint8_t *data; + int x; + + data = src->data + src_y * src->stride; + + if (bo->tiling == I915_TILING_NONE && width == bo->stride) { + uint8_t *p; + int size; + + size = bo->stride * height; + if (size > (int) sizeof (buf)) { + a8 = _cairo_malloc_ab (bo->stride, height); + if (a8 == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + p = a8; + while (height--) { + for (x = 0; x < width; x++) { + int i = src_x + x; + int byte = i / 8; + int bit = i % 8; + p[x] = data[byte] & (1 << bit) ? 0xff : 0x00; + } + + data += src->stride; + p += bo->stride; + } + + intel_bo_write (device, bo, + dst_y * bo->stride + dst_x, /* XXX bo_offset */ + size, a8); + } else { + uint8_t *dst; + + if (width > (int) sizeof (buf)) { + a8 = malloc (width); + if (a8 == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + dst = intel_bo_map (device, bo); + if (dst == NULL) { + if (a8 != buf) + free (a8); + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + } + + dst += dst_y * bo->stride + dst_x; /* XXX bo_offset */ + while (height--) { + for (x = 0; x < width; x++) { + int i = src_x + x; + int byte = i / 8; + int bit = i % 8; + a8[x] = data[byte] & (1 << bit) ? 0xff : 0x00; + } + + memcpy (dst, a8, width); + dst += bo->stride; + data += src->stride; + } + } + + if (a8 != buf) + free (a8); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +intel_bo_put_image (intel_device_t *device, + intel_bo_t *bo, + cairo_image_surface_t *src, + int src_x, int src_y, + int width, int height, + int dst_x, int dst_y) +{ + uint8_t *data; + int size; + int offset; + + intel_bo_set_tiling (device, bo); + + offset = dst_y * bo->stride; + data = src->data + src_y * src->stride; + switch (src->format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + offset += 4 * dst_x; + data += 4 * src_x; + size = 4 * width; + break; + case CAIRO_FORMAT_RGB16_565: + offset += 2 * dst_x; + data += 2 * src_x; + size = 2 * width; + break; + case CAIRO_FORMAT_A8: + offset += dst_x; + data += src_x; + size = width; + break; + case CAIRO_FORMAT_A1: + return _intel_bo_put_a1_image (device, bo, src, + src_x, src_y, + width, height, + dst_x, dst_y); + default: + case CAIRO_FORMAT_INVALID: + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + } + + if (bo->tiling == I915_TILING_NONE && src->stride == bo->stride) { + intel_bo_write (device, bo, offset, bo->stride * height, data); + } else { + uint8_t *dst; + + dst = intel_bo_map (device, bo); + if (unlikely (dst == NULL)) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + dst += offset; + while (height--) { + memcpy (dst, data, size); + dst += bo->stride; + data += src->stride; + } + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_intel_snapshot_cache_entry_can_remove (const void *closure) +{ + return TRUE; +} + +static void +_intel_snapshot_cache_entry_destroy (void *closure) +{ + intel_surface_t *surface = cairo_container_of (closure, + intel_surface_t, + snapshot_cache_entry); + + surface->snapshot_cache_entry.hash = 0; +} + +cairo_status_t +intel_device_init (intel_device_t *device, int fd) +{ + struct drm_i915_gem_get_aperture aperture; + cairo_status_t status; + size_t size; + int ret; + int n; + + ret = ioctl (fd, DRM_IOCTL_I915_GEM_GET_APERTURE, &aperture); + if (ret != 0) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + + CAIRO_MUTEX_INIT (device->mutex); + + device->gtt_max_size = aperture.aper_size; + device->gtt_avail_size = aperture.aper_available_size; + device->gtt_avail_size -= device->gtt_avail_size >> 5; + + size = aperture.aper_size / 8; + device->snapshot_cache_max_size = size / 4; + status = _cairo_cache_init (&device->snapshot_cache, + NULL, + _intel_snapshot_cache_entry_can_remove, + _intel_snapshot_cache_entry_destroy, + size); + if (unlikely (status)) + return status; + + for (n = 0; n < ARRAY_LENGTH (device->glyph_cache); n++) { + device->glyph_cache[n].buffer.bo = NULL; + cairo_list_init (&device->glyph_cache[n].rtree.pinned); + } + cairo_list_init (&device->fonts); + + device->gradient_cache.size = 0; + + device->base.bo.release = intel_bo_release; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_intel_gradient_cache_fini (intel_device_t *device) +{ + unsigned int n; + + for (n = 0; n < device->gradient_cache.size; n++) { + _cairo_pattern_fini (&device->gradient_cache.cache[n].pattern.base); + if (device->gradient_cache.cache[n].buffer.bo != NULL) + cairo_drm_bo_destroy (&device->base.base, + &device->gradient_cache.cache[n].buffer.bo->base); + } +} + +static void +_intel_glyph_cache_fini (intel_device_t *device, intel_buffer_cache_t *cache) +{ + if (cache->buffer.bo == NULL) + return; + + intel_bo_destroy (device, cache->buffer.bo); + _cairo_rtree_fini (&cache->rtree); +} + +void +intel_device_fini (intel_device_t *device) +{ + cairo_scaled_font_t *scaled_font, *next_scaled_font; + int n; + + cairo_list_foreach_entry_safe (scaled_font, + next_scaled_font, + cairo_scaled_font_t, + &device->fonts, + link) + { + _cairo_scaled_font_revoke_ownership (scaled_font); + } + + for (n = 0; n < ARRAY_LENGTH (device->glyph_cache); n++) + _intel_glyph_cache_fini (device, &device->glyph_cache[n]); + + _cairo_cache_fini (&device->snapshot_cache); + + _intel_gradient_cache_fini (device); + _cairo_freepool_fini (&device->bo_pool); + + _cairo_drm_device_fini (&device->base); +} + +void +intel_throttle (intel_device_t *device) +{ + ioctl (device->base.fd, DRM_IOCTL_I915_GEM_THROTTLE); +} + +void +intel_glyph_cache_unpin (intel_device_t *device) +{ + int n; + + for (n = 0; n < ARRAY_LENGTH (device->glyph_cache); n++) + _cairo_rtree_unpin (&device->glyph_cache[n].rtree); +} + +static cairo_status_t +intel_glyph_cache_add_glyph (intel_device_t *device, + intel_buffer_cache_t *cache, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_image_surface_t *glyph_surface = scaled_glyph->surface; + intel_glyph_t *glyph; + cairo_rtree_node_t *node = NULL; + double sf_x, sf_y; + cairo_status_t status; + uint8_t *dst, *src; + int width, height; + + width = glyph_surface->width; + if (width < GLYPH_CACHE_MIN_SIZE) + width = GLYPH_CACHE_MIN_SIZE; + height = glyph_surface->height; + if (height < GLYPH_CACHE_MIN_SIZE) + height = GLYPH_CACHE_MIN_SIZE; + + /* search for an available slot */ + status = _cairo_rtree_insert (&cache->rtree, width, height, &node); + /* search for an unpinned slot */ + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + status = _cairo_rtree_evict_random (&cache->rtree, width, height, &node); + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_rtree_node_insert (&cache->rtree, node, width, height, &node); + } + if (unlikely (status)) + return status; + + /* XXX streaming upload? */ + + height = glyph_surface->height; + src = glyph_surface->data; + dst = cache->buffer.bo->virtual; + if (dst == NULL) { + dst = intel_bo_map (device, cache->buffer.bo); + if (unlikely (dst == NULL)) + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + } + + dst += node->y * cache->buffer.stride; + switch (glyph_surface->format) { + case CAIRO_FORMAT_A1: { + uint8_t buf[CAIRO_STACK_BUFFER_SIZE]; + uint8_t *a8 = buf; + int x; + + if (width > (int) sizeof (buf)) { + a8 = malloc (width); + if (unlikely (a8 == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + dst += node->x; + width = glyph_surface->width; + while (height--) { + for (x = 0; x < width; x++) + a8[x] = src[x>>3] & (1 << (x&7)) ? 0xff : 0x00; + + memcpy (dst, a8, width); + dst += cache->buffer.stride; + src += glyph_surface->stride; + } + + if (a8 != buf) + free (a8); + break; + } + + case CAIRO_FORMAT_A8: + dst += node->x; + width = glyph_surface->width; + while (height--) { + memcpy (dst, src, width); + dst += cache->buffer.stride; + src += glyph_surface->stride; + } + break; + + case CAIRO_FORMAT_ARGB32: + dst += 4*node->x; + width = 4*glyph_surface->width; + while (height--) { + memcpy (dst, src, width); + dst += cache->buffer.stride; + src += glyph_surface->stride; + } + break; + default: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + } + + scaled_glyph->surface_private = node; + + glyph= (intel_glyph_t *) node; + glyph->node.owner = &scaled_glyph->surface_private; + glyph->cache = cache; + + /* compute tex coords: bottom-right, bottom-left, top-left */ + sf_x = 1. / cache->buffer.width; + sf_y = 1. / cache->buffer.height; + glyph->texcoord[0] = + texcoord_2d_16 (sf_x * (node->x + glyph_surface->width), + sf_y * (node->y + glyph_surface->height)); + glyph->texcoord[1] = + texcoord_2d_16 (sf_x * node->x, + sf_y * (node->y + glyph_surface->height)); + glyph->texcoord[2] = + texcoord_2d_16 (sf_x * node->x, + sf_y * node->y); + + glyph->width = glyph_surface->width; + glyph->height = glyph_surface->height; + + return CAIRO_STATUS_SUCCESS; +} + +void +intel_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_font_t *scaled_font) +{ + intel_glyph_t *glyph; + + glyph = scaled_glyph->surface_private; + if (glyph != NULL) { + /* XXX thread-safety? Probably ok due to the frozen scaled-font. */ + glyph->node.owner = NULL; + if (! glyph->node.pinned) + _cairo_rtree_node_remove (&glyph->cache->rtree, &glyph->node); + } +} + +void +intel_scaled_font_fini (cairo_scaled_font_t *scaled_font) +{ + cairo_list_del (&scaled_font->link); +} + +static cairo_status_t +intel_get_glyph_cache (intel_device_t *device, + cairo_format_t format, + intel_buffer_cache_t **out) +{ + intel_buffer_cache_t *cache; + cairo_status_t status; + + switch (format) { + case CAIRO_FORMAT_ARGB32: + cache = &device->glyph_cache[0]; + format = CAIRO_FORMAT_ARGB32; + break; + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + cache = &device->glyph_cache[1]; + format = CAIRO_FORMAT_A8; + break; + default: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + } + + if (unlikely (cache->buffer.bo == NULL)) { + status = intel_buffer_cache_init (cache, device, format, + INTEL_GLYPH_CACHE_WIDTH, + INTEL_GLYPH_CACHE_HEIGHT); + if (unlikely (status)) + return status; + + _cairo_rtree_init (&cache->rtree, + INTEL_GLYPH_CACHE_WIDTH, + INTEL_GLYPH_CACHE_HEIGHT, + 0, sizeof (intel_glyph_t)); + } + + *out = cache; + return CAIRO_STATUS_SUCCESS; +} + +cairo_int_status_t +intel_get_glyph (intel_device_t *device, + cairo_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_bool_t own_surface = FALSE; + intel_buffer_cache_t *cache; + cairo_status_t status; + + if (scaled_glyph->surface == NULL) { + status = + scaled_font->backend->scaled_glyph_init (scaled_font, + scaled_glyph, + CAIRO_SCALED_GLYPH_INFO_SURFACE); + if (unlikely (status)) + return status; + + if (unlikely (scaled_glyph->surface == NULL)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + own_surface = TRUE; + } + + if (unlikely (scaled_glyph->surface->width == 0 || + scaled_glyph->surface->height == 0)) + { + return CAIRO_INT_STATUS_NOTHING_TO_DO; + } + + if (unlikely (scaled_glyph->surface->width > GLYPH_CACHE_MAX_SIZE || + scaled_glyph->surface->height > GLYPH_CACHE_MAX_SIZE)) + { + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + status = intel_get_glyph_cache (device, + scaled_glyph->surface->format, + &cache); + if (unlikely (status)) + return status; + + status = intel_glyph_cache_add_glyph (device, cache, scaled_glyph); + if (unlikely (_cairo_status_is_error (status))) + return status; + + if (unlikely (status == CAIRO_INT_STATUS_UNSUPPORTED)) { + /* no room, replace entire cache */ + + assert (cache->buffer.bo->exec != NULL); + + _cairo_rtree_reset (&cache->rtree); + intel_bo_destroy (device, cache->buffer.bo); + cache->buffer.bo = NULL; + + status = intel_buffer_cache_init (cache, device, + scaled_glyph->surface->format, + GLYPH_CACHE_WIDTH, + GLYPH_CACHE_HEIGHT); + if (unlikely (status)) + return status; + + status = intel_glyph_cache_add_glyph (device, cache, scaled_glyph); + if (unlikely (status)) + return status; + } + + if (own_surface) { + /* and release the copy of the image from system memory */ + cairo_surface_destroy (&scaled_glyph->surface->base); + scaled_glyph->surface = NULL; + } + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +intel_buffer_cache_init (intel_buffer_cache_t *cache, + intel_device_t *device, + cairo_format_t format, + int width, int height) +{ + const uint32_t tiling = I915_TILING_Y; + uint32_t stride, size; + + assert ((width & 3) == 0); + assert ((height & 1) == 0); + cache->buffer.format = format; + cache->buffer.width = width; + cache->buffer.height = height; + + switch (format) { + default: + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: + ASSERT_NOT_REACHED; + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + case CAIRO_FORMAT_ARGB32: + cache->buffer.map0 = MAPSURF_32BIT | MT_32BIT_ARGB8888; + stride = width * 4; + break; + case CAIRO_FORMAT_A8: + cache->buffer.map0 = MAPSURF_8BIT | MT_8BIT_I8; + stride = width; + break; + } + + size = height * stride; + cache->buffer.bo = intel_bo_create (device, + size, size, + FALSE, tiling, stride); + if (unlikely (cache->buffer.bo == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + cache->buffer.stride = stride; + + cache->buffer.offset = 0; + cache->buffer.map0 |= MS3_tiling (tiling); + cache->buffer.map0 |= ((height - 1) << MS3_HEIGHT_SHIFT) | + ((width - 1) << MS3_WIDTH_SHIFT); + cache->buffer.map1 = ((stride / 4) - 1) << MS4_PITCH_SHIFT; + + cache->ref_count = 0; + cairo_list_init (&cache->link); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +intel_snapshot_cache_insert (intel_device_t *device, + intel_surface_t *surface) +{ + cairo_status_t status; + + surface->snapshot_cache_entry.size = surface->drm.bo->size; + if (surface->snapshot_cache_entry.size > + device->snapshot_cache_max_size) + { + return CAIRO_STATUS_SUCCESS; + } + + if (device->snapshot_cache.freeze_count == 0) + _cairo_cache_freeze (&device->snapshot_cache); + + surface->snapshot_cache_entry.hash = (unsigned long) surface; + status = _cairo_cache_insert (&device->snapshot_cache, + &surface->snapshot_cache_entry); + if (unlikely (status)) { + surface->snapshot_cache_entry.hash = 0; + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +void +intel_surface_detach_snapshot (cairo_surface_t *abstract_surface) +{ + intel_surface_t *surface = (intel_surface_t *) abstract_surface; + + if (surface->snapshot_cache_entry.hash) { + intel_device_t *device; + + device = (intel_device_t *) surface->drm.base.device; + _cairo_cache_remove (&device->snapshot_cache, + &surface->snapshot_cache_entry); + assert (surface->snapshot_cache_entry.hash == 0); + } +} + +void +intel_snapshot_cache_thaw (intel_device_t *device) +{ + if (device->snapshot_cache.freeze_count) + _cairo_cache_thaw (&device->snapshot_cache); +} + +static cairo_bool_t +_gradient_color_stops_equal (const cairo_gradient_pattern_t *a, + const cairo_gradient_pattern_t *b) +{ + unsigned int n; + + if (a->n_stops != b->n_stops) + return FALSE; + + for (n = 0; n < a->n_stops; n++) { + if (_cairo_fixed_from_double (a->stops[n].offset) != + _cairo_fixed_from_double (b->stops[n].offset)) + { + return FALSE; + } + + if (! _cairo_color_stop_equal (&a->stops[n].color, &b->stops[n].color)) + return FALSE; + } + + return TRUE; +} + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + static uint32_t x; + return x = (x ^ rol (x, 5) ^ rol (x, 24)) + 0x37798849; +#undef rol +} + +static int +intel_gradient_sample_width (const cairo_gradient_pattern_t *gradient) +{ + unsigned int n; + int width; + + width = 8; + for (n = 1; n < gradient->n_stops; n++) { + double dx = gradient->stops[n].offset - gradient->stops[n-1].offset; + double delta, max; + int ramp; + + if (dx == 0) + continue; + + max = gradient->stops[n].color.red - + gradient->stops[n-1].color.red; + + delta = gradient->stops[n].color.green - + gradient->stops[n-1].color.green; + if (delta > max) + max = delta; + + delta = gradient->stops[n].color.blue - + gradient->stops[n-1].color.blue; + if (delta > max) + max = delta; + + delta = gradient->stops[n].color.alpha - + gradient->stops[n-1].color.alpha; + if (delta > max) + max = delta; + + ramp = 128 * max / dx; + if (ramp > width) + width = ramp; + } + + width = (width + 7) & -8; + return MIN (width, 1024); +} + +cairo_status_t +intel_gradient_render (intel_device_t *device, + const cairo_gradient_pattern_t *pattern, + intel_buffer_t *buffer) +{ + pixman_image_t *gradient, *image; + pixman_gradient_stop_t pixman_stops_stack[32]; + pixman_gradient_stop_t *pixman_stops; + pixman_point_fixed_t p1, p2; + int width; + unsigned int i; + cairo_status_t status; + + for (i = 0; i < device->gradient_cache.size; i++) { + if (_gradient_color_stops_equal (pattern, + &device->gradient_cache.cache[i].pattern.gradient.base)) { + *buffer = device->gradient_cache.cache[i].buffer; + return CAIRO_STATUS_SUCCESS; + } + } + + pixman_stops = pixman_stops_stack; + if (unlikely (pattern->n_stops > ARRAY_LENGTH (pixman_stops_stack))) { + pixman_stops = _cairo_malloc_ab (pattern->n_stops, + sizeof (pixman_gradient_stop_t)); + if (unlikely (pixman_stops == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + for (i = 0; i < pattern->n_stops; i++) { + pixman_stops[i].x = _cairo_fixed_16_16_from_double (pattern->stops[i].offset); + pixman_stops[i].color.red = pattern->stops[i].color.red_short; + pixman_stops[i].color.green = pattern->stops[i].color.green_short; + pixman_stops[i].color.blue = pattern->stops[i].color.blue_short; + pixman_stops[i].color.alpha = pattern->stops[i].color.alpha_short; + } + + width = intel_gradient_sample_width (pattern); + + p1.x = 0; + p1.y = 0; + p2.x = width << 16; + p2.y = 0; + + gradient = pixman_image_create_linear_gradient (&p1, &p2, + pixman_stops, + pattern->n_stops); + if (pixman_stops != pixman_stops_stack) + free (pixman_stops); + + if (unlikely (gradient == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pixman_image_set_filter (gradient, PIXMAN_FILTER_BILINEAR, NULL, 0); + pixman_image_set_repeat (gradient, PIXMAN_REPEAT_PAD); + + image = pixman_image_create_bits (PIXMAN_a8r8g8b8, width, 1, NULL, 0); + if (unlikely (image == NULL)) { + pixman_image_unref (gradient); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pixman_image_composite32 (PIXMAN_OP_SRC, + gradient, NULL, image, + 0, 0, + 0, 0, + 0, 0, + width, 1); + + pixman_image_unref (gradient); + + buffer->bo = intel_bo_create (device, + 4*width, 4*width, + FALSE, I915_TILING_NONE, 4*width); + if (unlikely (buffer->bo == NULL)) { + pixman_image_unref (image); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + intel_bo_write (device, buffer->bo, 0, 4*width, pixman_image_get_data (image)); + pixman_image_unref (image); + + buffer->offset = 0; + buffer->width = width; + buffer->height = 1; + buffer->stride = 4*width; + buffer->format = CAIRO_FORMAT_ARGB32; + buffer->map0 = MAPSURF_32BIT | MT_32BIT_ARGB8888; + buffer->map0 |= ((width - 1) << MS3_WIDTH_SHIFT); + buffer->map1 = (width - 1) << MS4_PITCH_SHIFT; + + if (device->gradient_cache.size < GRADIENT_CACHE_SIZE) { + i = device->gradient_cache.size++; + } else { + i = hars_petruska_f54_1_random () % GRADIENT_CACHE_SIZE; + _cairo_pattern_fini (&device->gradient_cache.cache[i].pattern.base); + intel_bo_destroy (device, device->gradient_cache.cache[i].buffer.bo); + } + + status = _cairo_pattern_init_copy (&device->gradient_cache.cache[i].pattern.base, + &pattern->base); + if (unlikely (status)) { + intel_bo_destroy (device, buffer->bo); + /* Ensure the cache is correctly initialised for i965_device_destroy */ + _cairo_pattern_init_solid (&device->gradient_cache.cache[i].pattern.solid, + CAIRO_COLOR_TRANSPARENT); + return status; + } + + device->gradient_cache.cache[i].buffer = *buffer; + return CAIRO_STATUS_SUCCESS; +} diff --git a/src/drm/cairo-drm-ioctl-private.h b/src/drm/cairo-drm-ioctl-private.h new file mode 100644 index 000000000..4294de2d5 --- /dev/null +++ b/src/drm/cairo-drm-ioctl-private.h @@ -0,0 +1,12 @@ +#ifndef CAIRO_DRM_IOCTL_PRIVATE_H +#define CAIRO_DRM_IOCTL_PRIVATE_H + +#define DRM_IOCTL_BASE 'd' +#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) +#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) +#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type) +#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type) + +#define DRM_COMMAND_BASE 0x40 + +#endif /* CAIRO_DRM_IOCTL_PRIVATE_H */ diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h new file mode 100644 index 000000000..2db7f38d6 --- /dev/null +++ b/src/drm/cairo-drm-private.h @@ -0,0 +1,238 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributors(s): + * Chris Wilson + */ + +#ifndef CAIRO_DRM_PRIVATE_H +#define CAIRO_DRM_PRIVATE_H + +#include "cairo-drm.h" + +#include "cairo-device-private.h" +#include "cairo-reference-count-private.h" +#include "cairo-surface-private.h" + +#include /* dev_t */ + +typedef struct _cairo_drm_device cairo_drm_device_t; + +typedef cairo_drm_device_t * +(*cairo_drm_device_create_func_t) (int fd, + dev_t dev, + int vendor_id, + int chip_id); + +typedef cairo_int_status_t +(*cairo_drm_device_flush_func_t) (cairo_drm_device_t *device); + +typedef cairo_int_status_t +(*cairo_drm_device_throttle_func_t) (cairo_drm_device_t *device); + +typedef void +(*cairo_drm_device_destroy_func_t) (void *data); + +typedef cairo_surface_t * +(*cairo_drm_surface_create_func_t) (cairo_drm_device_t *device, + cairo_format_t format, + int width, int height); + +typedef cairo_surface_t * +(*cairo_drm_surface_create_for_name_func_t) (cairo_drm_device_t *device, + unsigned int name, + cairo_format_t format, + int width, int height, int stride); + +typedef cairo_surface_t * +(*cairo_drm_surface_create_from_cacheable_image_func_t) + (cairo_drm_device_t *device, cairo_surface_t *image); + +typedef cairo_int_status_t +(*cairo_drm_surface_flink_func_t) (void *surface); + +typedef cairo_status_t +(*cairo_drm_surface_enable_scan_out_func_t) (void *surface); + +typedef cairo_surface_t * +(*cairo_drm_surface_map_to_image_func_t) (void *surface); + +typedef struct _cairo_drm_bo_backend { + void (*release) (void *device, void *bo); +} cairo_drm_bo_backend_t; + +typedef struct _cairo_drm_device_backend { + cairo_drm_device_flush_func_t flush; + cairo_drm_device_throttle_func_t throttle; + cairo_drm_device_destroy_func_t destroy; +} cairo_drm_device_backend_t; + +typedef struct _cairo_drm_surface_backend { + cairo_drm_surface_create_func_t create; + cairo_drm_surface_create_for_name_func_t create_for_name; + cairo_drm_surface_create_from_cacheable_image_func_t create_from_cacheable_image; + cairo_drm_surface_flink_func_t flink; + cairo_drm_surface_enable_scan_out_func_t enable_scan_out; + cairo_drm_surface_map_to_image_func_t map_to_image; +} cairo_drm_surface_backend_t; + +typedef struct _cairo_drm_bo { + cairo_reference_count_t ref_count; + uint32_t name; + uint32_t handle; + uint32_t size; +} cairo_drm_bo_t; + +struct _cairo_drm_device { + cairo_device_t base; + + int vendor_id; + int chip_id; + dev_t id; + int fd; + + int max_surface_size; + + cairo_drm_bo_backend_t bo; + cairo_drm_surface_backend_t surface; + cairo_drm_device_backend_t device; + + cairo_drm_device_t *next, *prev; +}; + +typedef struct _cairo_drm_surface { + cairo_surface_t base; + + cairo_drm_bo_t *bo; + + cairo_format_t format; + int width, height, stride; + + cairo_surface_t *fallback; + uint32_t map_count; +} cairo_drm_surface_t; + +static inline cairo_drm_bo_t * +cairo_drm_bo_reference (cairo_drm_bo_t *bo) +{ + _cairo_reference_count_inc (&bo->ref_count); + return bo; +} + +static cairo_always_inline void +cairo_drm_bo_destroy (cairo_device_t *abstract_device, + cairo_drm_bo_t *bo) +{ + if (_cairo_reference_count_dec_and_test (&bo->ref_count)) { + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + device->bo.release (device, bo); + } +} + +cairo_private cairo_status_t +_cairo_drm_bo_open_for_name (const cairo_drm_device_t *dev, + cairo_drm_bo_t *bo, + uint32_t name); + +cairo_private cairo_status_t +_cairo_drm_bo_flink (const cairo_drm_device_t *dev, + cairo_drm_bo_t *bo); + +cairo_private void +_cairo_drm_bo_close (const cairo_drm_device_t *dev, + cairo_drm_bo_t *bo); + +cairo_private void +_cairo_drm_surface_init (cairo_drm_surface_t *surface, + cairo_format_t format, + int width, int height); + +cairo_private cairo_status_t +_cairo_drm_surface_finish (cairo_drm_surface_t *surface); + +cairo_private void +_cairo_drm_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options); + +cairo_private cairo_bool_t +_cairo_drm_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle); + +cairo_private cairo_int_status_t +_cairo_drm_surface_flink (void *abstract_surface); + +static inline cairo_drm_device_t * +_cairo_drm_device_create_in_error (cairo_status_t status) +{ + return (cairo_drm_device_t *) _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); +} + +cairo_private cairo_drm_device_t * +_cairo_drm_device_init (cairo_drm_device_t *device, + int fd, + dev_t devid, + int vendor_id, + int chip_id, + int max_surface_size); + +cairo_private void +_cairo_drm_device_fini (cairo_drm_device_t *device); + +/* h/w specific backends */ + +cairo_private cairo_drm_device_t * +_cairo_drm_intel_device_create (int fd, dev_t dev, int vendor_id, int chip_id); + +cairo_private cairo_drm_device_t * +_cairo_drm_i915_device_create (int fd, dev_t dev, int vendor_id, int chip_id); + +cairo_private cairo_drm_device_t * +_cairo_drm_i965_device_create (int fd, dev_t dev, int vendor_id, int chip_id); + +cairo_private cairo_drm_device_t * +_cairo_drm_radeon_device_create (int fd, dev_t dev, int vendor_id, int chip_id); + +#if CAIRO_HAS_GALLIUM_SURFACE +cairo_private cairo_drm_device_t * +_cairo_drm_gallium_device_create (int fd, dev_t dev, int vendor_id, int chip_id); +#endif + +slim_hidden_proto (cairo_drm_device_default); +slim_hidden_proto (cairo_drm_device_get); +slim_hidden_proto (cairo_drm_device_get_for_fd); + +slim_hidden_proto (cairo_drm_surface_create_for_name); + +cairo_private cairo_bool_t +_cairo_drm_size_is_valid (cairo_device_t *abstract_device, + int width, int height); + +#endif /* CAIRO_DRM_PRIVATE_H */ diff --git a/src/drm/cairo-drm-radeon-private.h b/src/drm/cairo-drm-radeon-private.h new file mode 100644 index 000000000..546126c6f --- /dev/null +++ b/src/drm/cairo-drm-radeon-private.h @@ -0,0 +1,107 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#ifndef CAIRO_DRM_RADEON_PRIVATE_H +#define CAIRO_DRM_RADEON_PRIVATE_H + +#include "cairo-compiler-private.h" +#include "cairo-types-private.h" +#include "cairo-drm-private.h" +#include "cairo-freelist-private.h" + +#define RADEON_GEM_DOMAIN_CPU 0x1 +#define RADEON_GEM_DOMAIN_GTT 0x2 +#define RADEON_GEM_DOMAIN_VRAM 0x4 + +typedef struct _radeon_bo { + cairo_drm_bo_t base; + + void *virtual; + + cairo_bool_t in_batch; + uint32_t read_domains; + uint32_t write_domain; +} radeon_bo_t; + +typedef struct _radeon_device { + cairo_drm_device_t base; + cairo_freepool_t bo_pool; + + uint64_t vram_limit; + uint64_t gart_limit; +} radeon_device_t; + +cairo_private cairo_status_t +radeon_device_init (radeon_device_t *device, int fd); + +cairo_private void +radeon_device_fini (radeon_device_t *device); + +cairo_private cairo_bool_t +radeon_info (int fd, + uint64_t *gart_size, + uint64_t *vram_size); + +cairo_private void +radeon_bo_write (const radeon_device_t *dev, + radeon_bo_t *bo, + unsigned long offset, + unsigned long size, + const void *data); + +cairo_private void +radeon_bo_read (const radeon_device_t *dev, + radeon_bo_t *bo, + unsigned long offset, + unsigned long size, + void *data); + +cairo_private void +radeon_bo_wait (const radeon_device_t *dev, radeon_bo_t *bo); + +cairo_private void * +radeon_bo_map (const radeon_device_t *dev, radeon_bo_t *bo); + +cairo_private void +radeon_bo_unmap (radeon_bo_t *bo); + +cairo_private cairo_drm_bo_t * +radeon_bo_create (radeon_device_t *dev, + uint32_t size, + uint32_t initial_domain); + +cairo_private cairo_drm_bo_t * +radeon_bo_create_for_name (radeon_device_t *dev, uint32_t name); + +cairo_private cairo_surface_t * +radeon_bo_get_image (const radeon_device_t *device, + radeon_bo_t *bo, + const cairo_drm_surface_t *surface); + +#endif /* CAIRO_DRM_RADEON_PRIVATE_H */ diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c new file mode 100644 index 000000000..6dbddaae4 --- /dev/null +++ b/src/drm/cairo-drm-radeon-surface.c @@ -0,0 +1,448 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-radeon-private.h" + +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" + +/* Basic stub surface for radeon chipsets */ + +#define MAX_SIZE 2048 + +typedef struct _radeon_surface { + cairo_drm_surface_t base; +} radeon_surface_t; + +static inline radeon_device_t * +to_radeon_device (cairo_device_t *device) +{ + return (radeon_device_t *) device; +} + +static inline radeon_bo_t * +to_radeon_bo (cairo_drm_bo_t *bo) +{ + return (radeon_bo_t *) bo; +} + +static cairo_surface_t * +radeon_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + return cairo_image_surface_create (_cairo_format_from_content (content), + width, height); +} + +static cairo_status_t +radeon_surface_finish (void *abstract_surface) +{ + radeon_surface_t *surface = abstract_surface; + + return _cairo_drm_surface_finish (&surface->base); +} + +static cairo_status_t +radeon_surface_acquire_source_image (void *abstract_surface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + radeon_surface_t *surface = abstract_surface; + cairo_surface_t *image; + cairo_status_t status; + + /* XXX batch flush */ + + if (surface->base.fallback != NULL) { + image = surface->base.fallback; + goto DONE; + } + + image = _cairo_surface_has_snapshot (&surface->base.base, + &_cairo_image_surface_backend); + if (image != NULL) + goto DONE; + + if (surface->base.base.backend->flush != NULL) { + status = surface->base.base.backend->flush (surface); + if (unlikely (status)) + return status; + } + + image = radeon_bo_get_image (to_radeon_device (surface->base.base.device), + to_radeon_bo (surface->base.bo), + &surface->base); + status = image->status; + if (unlikely (status)) + return status; + + _cairo_surface_attach_snapshot (&surface->base.base, image, cairo_surface_destroy); + +DONE: + *image_out = (cairo_image_surface_t *) cairo_surface_reference (image); + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; +} + +static void +radeon_surface_release_source_image (void *abstract_surface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_surface_destroy (&image->base); +} + +static cairo_surface_t * +radeon_surface_map_to_image (radeon_surface_t *surface) +{ + if (surface->base.fallback == NULL) { + cairo_surface_t *image; + cairo_status_t status; + void *ptr; + + if (surface->base.base.backend->flush != NULL) { + status = surface->base.base.backend->flush (surface); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + } + + ptr = radeon_bo_map (to_radeon_device (surface->base.base.device), + to_radeon_bo (surface->base.bo)); + if (unlikely (ptr == NULL)) + return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); + + image = cairo_image_surface_create_for_data (ptr, + surface->base.format, + surface->base.width, + surface->base.height, + surface->base.stride); + if (unlikely (image->status)) { + radeon_bo_unmap (to_radeon_bo (surface->base.bo)); + return image; + } + + surface->base.fallback = image; + } + + return surface->base.fallback; +} + +static cairo_status_t +radeon_surface_flush (void *abstract_surface, + unsigned flags) +{ + radeon_surface_t *surface = abstract_surface; + cairo_status_t status; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + if (surface->base.fallback == NULL) + return CAIRO_STATUS_SUCCESS; + + /* kill any outstanding maps */ + cairo_surface_finish (surface->base.fallback); + + status = cairo_surface_status (surface->base.fallback); + cairo_surface_destroy (surface->base.fallback); + surface->base.fallback = NULL; + + radeon_bo_unmap (to_radeon_bo (surface->base.bo)); + + return status; +} + +static cairo_int_status_t +radeon_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_clip_t *clip) +{ + return _cairo_surface_paint (radeon_surface_map_to_image (abstract_surface), + op, source, clip); +} + +static cairo_int_status_t +radeon_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + cairo_clip_t *clip) +{ + return _cairo_surface_mask (radeon_surface_map_to_image (abstract_surface), + op, source, mask, clip); +} + +static cairo_int_status_t +radeon_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + return _cairo_surface_stroke (radeon_surface_map_to_image (abstract_surface), + op, source, path, stroke_style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +radeon_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + cairo_clip_t *clip) +{ + return _cairo_surface_fill (radeon_surface_map_to_image (abstract_surface), + op, source, path, fill_rule, + tolerance, antialias, clip); +} + +static cairo_int_status_t +radeon_surface_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_clip_t *clip, + int *num_remaining) +{ + *num_remaining = 0; + return _cairo_surface_show_text_glyphs (radeon_surface_map_to_image (abstract_surface), + op, source, + NULL, 0, + glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, clip); +} + +static const cairo_surface_backend_t radeon_surface_backend = { + CAIRO_SURFACE_TYPE_DRM, + _cairo_default_context_create, + + radeon_surface_create_similar, + radeon_surface_finish, + + NULL, + radeon_surface_acquire_source_image, + radeon_surface_release_source_image, + + NULL, NULL, NULL, + NULL, /* composite */ + NULL, /* fill */ + NULL, /* trapezoids */ + NULL, /* span */ + NULL, /* check-span */ + + NULL, /* copy_page */ + NULL, /* show_page */ + _cairo_drm_surface_get_extents, + NULL, /* old-glyphs */ + _cairo_drm_surface_get_font_options, + + radeon_surface_flush, + NULL, /* mark dirty */ + NULL, NULL, /* font/glyph fini */ + + radeon_surface_paint, + radeon_surface_mask, + radeon_surface_stroke, + radeon_surface_fill, + radeon_surface_glyphs, +}; + +static void +radeon_surface_init (radeon_surface_t *surface, + cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + _cairo_surface_init (&surface->base.base, + &radeon_surface_backend, + &device->base, + _cairo_content_from_format (format)); + _cairo_drm_surface_init (&surface->base, format, width, height); +} + +static cairo_surface_t * +radeon_surface_create_internal (cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + radeon_surface_t *surface; + cairo_status_t status; + + surface = malloc (sizeof (radeon_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + radeon_surface_init (surface, device, format, width, height); + + if (width && height) { + surface->base.stride = + cairo_format_stride_for_width (surface->base.format, width); + + surface->base.bo = radeon_bo_create (to_radeon_device (&device->base), + surface->base.stride * height, + RADEON_GEM_DOMAIN_GTT); + + if (unlikely (surface->base.bo == NULL)) { + status = _cairo_drm_surface_finish (&surface->base); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + return &surface->base.base; +} + +static cairo_surface_t * +radeon_surface_create (cairo_drm_device_t *device, + cairo_format_t format, + int width, int height) +{ + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB16_565: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + } + + return radeon_surface_create_internal (device, format, width, height); +} + +static cairo_surface_t * +radeon_surface_create_for_name (cairo_drm_device_t *device, + unsigned int name, + cairo_format_t format, + int width, int height, int stride) +{ + radeon_surface_t *surface; + cairo_status_t status; + + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB16_565: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_A8: + break; + } + + if (stride < cairo_format_stride_for_width (format, width)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); + + surface = malloc (sizeof (radeon_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + radeon_surface_init (surface, device, format, width, height); + + if (width && height) { + surface->base.stride = stride; + + surface->base.bo = radeon_bo_create_for_name (to_radeon_device (&device->base), + name); + + if (unlikely (surface->base.bo == NULL)) { + status = _cairo_drm_surface_finish (&surface->base); + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + } + + return &surface->base.base; +} + +static void +radeon_device_destroy (void *data) +{ + radeon_device_t *device = data; + + radeon_device_fini (device); + + free (data); +} + +cairo_drm_device_t * +_cairo_drm_radeon_device_create (int fd, dev_t dev, int vendor_id, int chip_id) +{ + radeon_device_t *device; + uint64_t gart_size, vram_size; + cairo_status_t status; + + if (! radeon_info (fd, &gart_size, &vram_size)) + return NULL; + + device = malloc (sizeof (radeon_device_t)); + if (device == NULL) + return _cairo_drm_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + + status = radeon_device_init (device, fd); + if (unlikely (status)) { + free (device); + return _cairo_drm_device_create_in_error (status); + } + + device->base.surface.create = radeon_surface_create; + device->base.surface.create_for_name = radeon_surface_create_for_name; + device->base.surface.create_from_cacheable_image = NULL; + device->base.surface.flink = _cairo_drm_surface_flink; + device->base.surface.enable_scan_out = NULL; + + device->base.device.flush = NULL; + device->base.device.throttle = NULL; + device->base.device.destroy = radeon_device_destroy; + + device->vram_limit = vram_size; + device->gart_limit = gart_size; + + return _cairo_drm_device_init (&device->base, fd, dev, vendor_id, chip_id, MAX_SIZE); +} diff --git a/src/drm/cairo-drm-radeon.c b/src/drm/cairo-drm-radeon.c new file mode 100644 index 000000000..a6d22089b --- /dev/null +++ b/src/drm/cairo-drm-radeon.c @@ -0,0 +1,451 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" +#include "cairo-drm-radeon-private.h" +#include "cairo-drm-ioctl-private.h" + +#include "cairo-error-private.h" + +#include +#include +#include + +#define DRM_RADEON_GEM_INFO 0x1c +#define DRM_RADEON_GEM_CREATE 0x1d +#define DRM_RADEON_GEM_MMAP 0x1e +#define DRM_RADEON_GEM_PREAD 0x21 +#define DRM_RADEON_GEM_PWRITE 0x22 +#define DRM_RADEON_GEM_SET_DOMAIN 0x23 +#define DRM_RADEON_GEM_WAIT_IDLE 0x24 +#define DRM_RADEON_CS 0x26 +#define DRM_RADEON_INFO 0x27 + +#define DRM_IOCTL_RADEON_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INFO, struct drm_radeon_gem_info) +#define DRM_IOCTL_RADEON_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, struct drm_radeon_gem_create) +#define DRM_IOCTL_RADEON_GEM_WAIT_IDLE DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_IDLE, struct drm_radeon_gem_wait_idle) +#define DRM_IOCTL_RADEON_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_MMAP, struct drm_radeon_gem_mmap) +#define DRM_IOCTL_RADEON_GEM_PREAD DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PREAD, struct drm_radeon_gem_pread) +#define DRM_IOCTL_RADEON_GEM_PWRITE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PWRITE, struct drm_radeon_gem_pwrite) +#define DRM_IOCTL_RADEON_GEM_SET_DOMAIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain) +//#define DRM_IOCTL_RADEON_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs) + +struct drm_radeon_gem_info { + uint64_t gart_size; + uint64_t vram_size; + uint64_t vram_visible; +}; + +#define RADEON_GEM_NO_BACKING_STORE 1 + +struct drm_radeon_gem_create { + uint64_t size; + uint64_t alignment; + uint32_t handle; + uint32_t initial_domain; + uint32_t flags; +}; + +struct drm_radeon_gem_mmap { + uint32_t handle; + uint32_t pad; + uint64_t offset; + uint64_t size; + uint64_t addr_ptr; +}; + +struct drm_radeon_gem_set_domain { + uint32_t handle; + uint32_t read_domains; + uint32_t write_domain; +}; + +struct drm_radeon_gem_wait_idle { + uint32_t handle; + uint32_t pad; +}; + +struct drm_radeon_gem_busy { + uint32_t handle; + uint32_t busy; +}; + +struct drm_radeon_gem_pread { + /** Handle for the object being read. */ + uint32_t handle; + uint32_t pad; + /** Offset into the object to read from */ + uint64_t offset; + /** Length of data to read */ + uint64_t size; + /** Pointer to write the data into. */ + /* void *, but pointers are not 32/64 compatible */ + uint64_t data_ptr; +}; + +struct drm_radeon_gem_pwrite { + /** Handle for the object being written to. */ + uint32_t handle; + uint32_t pad; + /** Offset into the object to write to */ + uint64_t offset; + /** Length of data to write */ + uint64_t size; + /** Pointer to read the data from. */ + /* void *, but pointers are not 32/64 compatible */ + uint64_t data_ptr; +}; + +#define RADEON_CHUNK_ID_RELOCS 0x01 +#define RADEON_CHUNK_ID_IB 0x02 + +struct drm_radeon_cs_chunk { + uint32_t chunk_id; + uint32_t length_dw; + uint64_t chunk_data; +}; + +struct drm_radeon_cs_reloc { + uint32_t handle; + uint32_t read_domains; + uint32_t write_domain; + uint32_t flags; +}; + +struct drm_radeon_cs { + uint32_t num_chunks; + uint32_t cs_id; + /* this points to uint64_t * which point to cs chunks */ + uint64_t chunks; + /* updates to the limits after this CS ioctl */ + uint64_t gart_limit; + uint64_t vram_limit; +}; + +#define RADEON_INFO_DEVICE_ID 0x00 +#define RADEON_INFO_NUM_GB_PIPES 0x01 + +struct drm_radeon_info { + uint32_t request; + uint32_t pad; + uint64_t value; +}; + + +cairo_bool_t +radeon_info (int fd, + uint64_t *gart_size, + uint64_t *vram_size) +{ + struct drm_radeon_gem_info info; + int ret; + + ret = ioctl (fd, DRM_IOCTL_RADEON_GEM_INFO, &info); + if (ret == -1) + return FALSE; + + if (gart_size != NULL) + *gart_size = info.gart_size; + + if (vram_size != NULL) + *vram_size = info.vram_size; + + return TRUE; +} + +void +radeon_bo_write (const radeon_device_t *device, + radeon_bo_t *bo, + unsigned long offset, + unsigned long size, + const void *data) +{ + struct drm_radeon_gem_pwrite pwrite; + int ret; + + memset (&pwrite, 0, sizeof (pwrite)); + pwrite.handle = bo->base.handle; + pwrite.offset = offset; + pwrite.size = size; + pwrite.data_ptr = (uint64_t) (uintptr_t) data; + do { + ret = ioctl (device->base.fd, DRM_IOCTL_RADEON_GEM_PWRITE, &pwrite); + } while (ret == -1 && errno == EINTR); + + /* XXX temporary workaround */ + if (ret == -1 && errno == ENOSYS) { + uint8_t *ptr; + + ptr = radeon_bo_map (device, bo); + if (ptr != NULL) { + memcpy (ptr + offset, data, size); + radeon_bo_unmap (bo); + } + } +} + +void +radeon_bo_read (const radeon_device_t *device, + radeon_bo_t *bo, + unsigned long offset, + unsigned long size, + void *data) +{ + struct drm_radeon_gem_pread pread; + int ret; + + memset (&pread, 0, sizeof (pread)); + pread.handle = bo->base.handle; + pread.offset = offset; + pread.size = size; + pread.data_ptr = (uint64_t) (uintptr_t) data; + do { + ret = ioctl (device->base.fd, DRM_IOCTL_RADEON_GEM_PREAD, &pread); + } while (ret == -1 && errno == EINTR); + + /* XXX temporary workaround */ + if (ret == -1 && errno == ENOSYS) { + uint8_t *ptr; + + ptr = radeon_bo_map (device, bo); + if (ptr != NULL) { + memcpy (data, ptr + offset, size); + radeon_bo_unmap (bo); + } + } + + VG (VALGRIND_MAKE_MEM_DEFINED (data, size)); +} + +void +radeon_bo_wait (const radeon_device_t *device, radeon_bo_t *bo) +{ + struct drm_radeon_gem_wait_idle wait; + int ret; + + wait.handle = bo->base.handle; + do { + ret = ioctl (device->base.fd, DRM_IOCTL_RADEON_GEM_WAIT_IDLE, &wait); + } while (ret == -1 && (errno == EINTR || errno == EBUSY)); +} + +void * +radeon_bo_map (const radeon_device_t *device, radeon_bo_t *bo) +{ + struct drm_radeon_gem_mmap mmap_arg; + void *ptr; + int ret; + + assert (bo->virtual == NULL); + + memset (&mmap_arg, 0, sizeof (mmap_arg)); + mmap_arg.handle = bo->base.handle; + mmap_arg.offset = 0; + mmap_arg.size = bo->base.size; + + do { + ret = ioctl (device->base.fd, DRM_IOCTL_RADEON_GEM_MMAP, &mmap_arg); + } while (ret == -1 && errno == EINTR); + if (unlikely (ret != 0)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + VG (VALGRIND_MAKE_MEM_DEFINED (&mmap_arg, sizeof (mmap_arg))); + + /* and mmap it */ + ptr = mmap (0, bo->base.size, PROT_READ | PROT_WRITE, + MAP_SHARED, device->base.fd, + mmap_arg.addr_ptr); + if (unlikely (ptr == MAP_FAILED)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + + bo->virtual = ptr; + + /* XXX set_domain? */ + return bo->virtual; +} + +void +radeon_bo_unmap (radeon_bo_t *bo) +{ + assert (bo->virtual != NULL); + + munmap (bo->virtual, bo->base.size); + bo->virtual = NULL; +} + +cairo_drm_bo_t * +radeon_bo_create (radeon_device_t *device, + uint32_t size, + uint32_t initial_domain) +{ + struct drm_radeon_gem_create create; + radeon_bo_t *bo; + int ret; + + bo = _cairo_freepool_alloc (&device->bo_pool); + if (unlikely (bo == NULL)) + return NULL; + + create.size = size; + create.alignment = 0; + create.initial_domain = initial_domain; + create.flags = 0; + create.handle = 0; + + do { + ret = ioctl (device->base.fd, DRM_IOCTL_RADEON_GEM_CREATE, &create); + } while (ret == -1 && errno == EINTR); + if (ret == -1) { + _cairo_freepool_free (&device->bo_pool, bo); + return NULL; + } + + bo->base.handle = create.handle; + bo->base.size = size; + + bo->virtual = NULL; + + bo->in_batch = FALSE; + bo->read_domains = 0; + bo->write_domain = 0; + + CAIRO_REFERENCE_COUNT_INIT (&bo->base.ref_count, 1); + return &bo->base; +} + +cairo_drm_bo_t * +radeon_bo_create_for_name (radeon_device_t *device, + uint32_t name) +{ + radeon_bo_t *bo; + cairo_status_t status; + + bo = _cairo_freepool_alloc (&device->bo_pool); + if (unlikely (bo == NULL)) + return NULL; + + status = _cairo_drm_bo_open_for_name (&device->base, &bo->base, name); + if (unlikely (status)) { + _cairo_freepool_free (&device->bo_pool, bo); + return NULL; + } + + bo->virtual = NULL; + + bo->in_batch = FALSE; + bo->read_domains = 0; + bo->write_domain = 0; + + CAIRO_REFERENCE_COUNT_INIT (&bo->base.ref_count, 1); + return &bo->base; +} + +static void +radeon_bo_release (void *_dev, void *_bo) +{ + radeon_device_t *device = _dev; + radeon_bo_t *bo = _bo; + + _cairo_drm_bo_close (&device->base, &bo->base); + _cairo_freepool_free (&device->bo_pool, bo); +} + +cairo_surface_t * +radeon_bo_get_image (const radeon_device_t *device, + radeon_bo_t *bo, + const cairo_drm_surface_t *surface) +{ + cairo_image_surface_t *image; + uint8_t *dst; + int size, row; + + image = (cairo_image_surface_t *) + cairo_image_surface_create (surface->format, + surface->width, + surface->height); + if (unlikely (image->base.status)) + return &image->base; + + if (image->stride == surface->stride) { + size = surface->stride * surface->height; + radeon_bo_read (device, bo, 0, size, image->data); + } else { + int offset; + + size = surface->width; + if (surface->format != CAIRO_FORMAT_A8) + size *= 4; + + offset = 0; + row = surface->height; + dst = image->data; + while (row--) { + radeon_bo_read (device, bo, offset, size, dst); + offset += surface->stride; + dst += image->stride; + } + } + + return &image->base; +} + +static void +_radeon_device_init_bo_cache (radeon_device_t *device) +{ + _cairo_freepool_init (&device->bo_pool, sizeof (radeon_bo_t)); +} + +cairo_status_t +radeon_device_init (radeon_device_t *device, int fd) +{ + _radeon_device_init_bo_cache (device); + + device->base.bo.release = radeon_bo_release; + + return CAIRO_STATUS_SUCCESS; +} + +static void +_radeon_bo_cache_fini (radeon_device_t *device) +{ + _cairo_freepool_fini (&device->bo_pool); +} + +void +radeon_device_fini (radeon_device_t *device) +{ + _radeon_bo_cache_fini (device); + _cairo_drm_device_fini (&device->base); +} diff --git a/src/drm/cairo-drm-surface.c b/src/drm/cairo-drm-surface.c new file mode 100644 index 000000000..8c4dd0ee8 --- /dev/null +++ b/src/drm/cairo-drm-surface.c @@ -0,0 +1,369 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" + +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" + +void +_cairo_drm_surface_init (cairo_drm_surface_t *surface, + cairo_format_t format, + int width, int height) +{ + surface->bo = NULL; + surface->format = format; + surface->width = width; + surface->height = height; + surface->stride = 0; + + surface->fallback = NULL; + surface->map_count = 0; +} + +cairo_status_t +_cairo_drm_surface_finish (cairo_drm_surface_t *surface) +{ + assert (surface->fallback == NULL); + + if (surface->bo != NULL) + cairo_drm_bo_destroy (surface->base.device, surface->bo); + + return CAIRO_STATUS_SUCCESS; +} + +void +_cairo_drm_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); +} + +cairo_bool_t +_cairo_drm_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_drm_surface_t *surface = abstract_surface; + + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = surface->width; + rectangle->height = surface->height; + + return TRUE; +} + +cairo_surface_t * +cairo_drm_surface_create (cairo_device_t *abstract_device, + cairo_format_t format, + int width, int height) +{ + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + cairo_surface_t *surface; + + if (device != NULL && device->base.status) + { + surface = _cairo_surface_create_in_error (device->base.status); + } + else if (device == NULL || + device->surface.create == NULL || + width == 0 || width > device->max_surface_size || + height == 0 || height > device->max_surface_size) + { + surface = cairo_image_surface_create (format, width, height); + } + else if (device->base.finished) + { + surface = _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + } + else + { + surface = device->surface.create (device, format, width, height); + if (surface->status == CAIRO_STATUS_INVALID_SIZE) + surface = cairo_image_surface_create (format, width, height); + } + + return surface; +} + +cairo_surface_t * +cairo_drm_surface_create_for_name (cairo_device_t *abstract_device, + unsigned int name, + cairo_format_t format, + int width, int height, int stride) +{ + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + cairo_surface_t *surface; + + if (! CAIRO_FORMAT_VALID (format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + if (device != NULL && device->base.status) + { + surface = _cairo_surface_create_in_error (device->base.status); + } + else if (device == NULL || device->surface.create_for_name == NULL) + { + /* XXX invalid device! */ + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + else if (width == 0 || width > device->max_surface_size || + height == 0 || height > device->max_surface_size) + { + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_SIZE)); + } + else if (device->base.finished) + { + surface = _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + } + else + { + surface = device->surface.create_for_name (device, + name, format, + width, height, stride); + } + + return surface; +} +slim_hidden_def (cairo_drm_surface_create_for_name); + +cairo_surface_t * +cairo_drm_surface_create_from_cacheable_image (cairo_device_t *abstract_device, + cairo_surface_t *surface) +{ + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + + if (surface->status) { + surface = _cairo_surface_create_in_error (surface->status); + } else if (device != NULL && device->base.status) { + surface = _cairo_surface_create_in_error (device->base.status); + } else if (device == NULL || device->surface.create_from_cacheable_image == NULL) { + /* XXX invalid device! */ + surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } else if (device->base.finished) { + surface = _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + } else { + surface = device->surface.create_from_cacheable_image (device, surface); + } + + return surface; +} + +static cairo_drm_surface_t * +_cairo_surface_as_drm (cairo_surface_t *abstract_surface) +{ + if (unlikely (abstract_surface->status)) + return NULL; + + if (abstract_surface->type != CAIRO_SURFACE_TYPE_DRM) + return NULL; + + return (cairo_drm_surface_t *) abstract_surface; +} + +cairo_status_t +cairo_drm_surface_enable_scan_out (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + cairo_drm_device_t *device; + + surface = _cairo_surface_as_drm (abstract_surface); + if (unlikely (surface == NULL)) + return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + if (unlikely (surface->base.finished)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + device = (cairo_drm_device_t *) surface->base.device; + if (device->surface.enable_scan_out == NULL) + return CAIRO_STATUS_SUCCESS; + + if (unlikely (device->base.finished)) + return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + + return device->surface.enable_scan_out (abstract_surface); +} + +unsigned int +cairo_drm_surface_get_handle (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + return surface->bo->handle; +} + +cairo_int_status_t +_cairo_drm_surface_flink (void *abstract_surface) +{ + cairo_drm_surface_t *surface = abstract_surface; + + return _cairo_drm_bo_flink ((cairo_drm_device_t *) surface->base.device, + surface->bo); +} + +unsigned int +cairo_drm_surface_get_name (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + cairo_drm_device_t *device; + cairo_status_t status; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) { + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return 0; + } + + if (surface->bo->name) + return surface->bo->name; + + device = (cairo_drm_device_t *) surface->base.device; + if (device->surface.flink == NULL) + return 0; + + status = device->surface.flink (abstract_surface); + if (status) { + if (_cairo_status_is_error (status)) + status = _cairo_surface_set_error (abstract_surface, status); + + return 0; + } + + return surface->bo->name; +} + +cairo_format_t +cairo_drm_surface_get_format (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) + return cairo_image_surface_get_format (abstract_surface); + + return surface->format; +} + +int +cairo_drm_surface_get_width (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) + return cairo_image_surface_get_width (abstract_surface); + + return surface->width; +} + +int +cairo_drm_surface_get_height (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) + return cairo_image_surface_get_height (abstract_surface); + + return surface->height; +} + +int +cairo_drm_surface_get_stride (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) + return cairo_image_surface_get_stride (abstract_surface); + + return surface->stride; +} + +/* XXX drm or general surface layer? naming? */ +cairo_surface_t * +cairo_drm_surface_map_to_image (cairo_surface_t *abstract_surface) +{ + cairo_drm_surface_t *surface; + cairo_drm_device_t *device; + cairo_status_t status; + + if (unlikely (abstract_surface->status)) + return _cairo_surface_create_in_error (abstract_surface->status); + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) { + if (_cairo_surface_is_image (abstract_surface)) + return cairo_surface_reference (abstract_surface); + + status = _cairo_surface_set_error (abstract_surface, + CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return _cairo_surface_create_in_error (status); + } + + surface->map_count++; + device = (cairo_drm_device_t *) surface->base.device; + return cairo_surface_reference (device->surface.map_to_image (surface)); +} + +void +cairo_drm_surface_unmap (cairo_surface_t *abstract_surface, + cairo_surface_t *image) +{ + cairo_drm_surface_t *surface; + + surface = _cairo_surface_as_drm (abstract_surface); + if (surface == NULL) { + if (_cairo_surface_is_image (abstract_surface)) + cairo_surface_destroy (image); + else + _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); + return; + } + + /* XXX assert image belongs to drm */ + //assert (image == drm->fallback); + cairo_surface_destroy (image); + + assert (surface->map_count > 0); + if (--surface->map_count == 0) + cairo_surface_flush (&surface->base); +} diff --git a/src/drm/cairo-drm.c b/src/drm/cairo-drm.c new file mode 100644 index 000000000..661e181b6 --- /dev/null +++ b/src/drm/cairo-drm.c @@ -0,0 +1,390 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairoint.h" + +#include "cairo-drm-private.h" + +#include "cairo-device-private.h" +#include "cairo-error-private.h" + +#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE +#include +#include +#include /* open(), close() */ + +static cairo_drm_device_t *_cairo_drm_known_devices; +static cairo_drm_device_t *_cairo_drm_default_device; + +static const char * +get_udev_property(struct udev_device *device, const char *name) +{ + struct udev_list_entry *entry; + + udev_list_entry_foreach (entry, + udev_device_get_properties_list_entry (device)) + { + if (strcmp (udev_list_entry_get_name (entry), name) == 0) + return udev_list_entry_get_value (entry); + } + + return NULL; +} + +static void +_device_flush (void *abstract_device) +{ + cairo_drm_device_t *device = abstract_device; + + device->device.flush (device); +} + +static void +_device_finish (void *abstract_device) +{ + cairo_drm_device_t *device = abstract_device; + + CAIRO_MUTEX_LOCK (_cairo_drm_device_mutex); + if (device->prev != NULL) + device->prev->next = device->next; + else + _cairo_drm_known_devices = device->next; + if (device->next != NULL) + device->next->prev = device->prev; + + CAIRO_MUTEX_UNLOCK (_cairo_drm_device_mutex); + + if (_cairo_atomic_ptr_cmpxchg (&_cairo_drm_default_device, + device, NULL)) + { + cairo_device_destroy (&device->base); + } +} + +static void +_device_destroy (void *abstract_device) +{ + cairo_drm_device_t *device = abstract_device; + + device->device.destroy (device); +} + +static const cairo_device_backend_t _cairo_drm_device_backend = { + CAIRO_DEVICE_TYPE_DRM, + + NULL, NULL, /* lock, unlock */ + + _device_flush, + _device_finish, + _device_destroy, +}; + +cairo_drm_device_t * +_cairo_drm_device_init (cairo_drm_device_t *dev, + int fd, + dev_t devid, + int vendor_id, + int chip_id, + int max_surface_size) +{ + assert (CAIRO_MUTEX_IS_LOCKED (_cairo_drm_device_mutex)); + + _cairo_device_init (&dev->base, &_cairo_drm_device_backend); + + dev->id = devid; + dev->vendor_id = vendor_id; + dev->chip_id = chip_id; + dev->fd = fd; + + dev->max_surface_size = max_surface_size; + + dev->prev = NULL; + dev->next = _cairo_drm_known_devices; + if (_cairo_drm_known_devices != NULL) + _cairo_drm_known_devices->prev = dev; + _cairo_drm_known_devices = dev; + + if (_cairo_drm_default_device == NULL) + _cairo_drm_default_device = (cairo_drm_device_t *) cairo_device_reference (&dev->base); + + return dev; +} + +cairo_device_t * +cairo_drm_device_get (struct udev_device *device) +{ + static const struct dri_driver_entry { + uint32_t vendor_id; + uint32_t chip_id; + cairo_drm_device_create_func_t create_func; + } driver_map[] = { + { 0x8086, 0x29a2, _cairo_drm_i965_device_create }, /* I965_G */ + { 0x8086, 0x2982, _cairo_drm_i965_device_create }, /* G35_G */ + { 0x8086, 0x2992, _cairo_drm_i965_device_create }, /* I965_Q */ + { 0x8086, 0x2972, _cairo_drm_i965_device_create }, /* I946_GZ */ + { 0x8086, 0x2a02, _cairo_drm_i965_device_create }, /* I965_GM */ + { 0x8086, 0x2a12, _cairo_drm_i965_device_create }, /* I965_GME */ + { 0x8086, 0x2e02, _cairo_drm_i965_device_create }, /* IGD_E_G */ + { 0x8086, 0x2e22, _cairo_drm_i965_device_create }, /* G45_G */ + { 0x8086, 0x2e12, _cairo_drm_i965_device_create }, /* Q45_G */ + { 0x8086, 0x2e32, _cairo_drm_i965_device_create }, /* G41_G */ + { 0x8086, 0x2a42, _cairo_drm_i965_device_create }, /* GM45_GM */ + + { 0x8086, 0x2582, _cairo_drm_i915_device_create }, /* I915_G */ + { 0x8086, 0x2592, _cairo_drm_i915_device_create }, /* I915_GM */ + { 0x8086, 0x258a, _cairo_drm_i915_device_create }, /* E7221_G */ + { 0x8086, 0x2772, _cairo_drm_i915_device_create }, /* I945_G */ + { 0x8086, 0x27a2, _cairo_drm_i915_device_create }, /* I945_GM */ + { 0x8086, 0x27ae, _cairo_drm_i915_device_create }, /* I945_GME */ + { 0x8086, 0x29c2, _cairo_drm_i915_device_create }, /* G33_G */ + { 0x8086, 0x29b2, _cairo_drm_i915_device_create }, /* Q35_G */ + { 0x8086, 0x29d2, _cairo_drm_i915_device_create }, /* Q33_G */ + { 0x8086, 0xa011, _cairo_drm_i915_device_create }, /* IGD_GM */ + { 0x8086, 0xa001, _cairo_drm_i915_device_create }, /* IGD_G */ + + /* XXX i830 */ + + { 0x8086, ~0, _cairo_drm_intel_device_create }, + + { 0x1002, ~0, _cairo_drm_radeon_device_create }, +#if CAIRO_HAS_GALLIUM_SURFACE + { ~0, ~0, _cairo_drm_gallium_device_create }, +#endif + }; + + cairo_drm_device_t *dev; + dev_t devid; + struct udev_device *parent; + const char *pci_id; + uint32_t vendor_id, chip_id; + const char *path; + int i, fd; + + devid = udev_device_get_devnum (device); + + CAIRO_MUTEX_LOCK (_cairo_drm_device_mutex); + for (dev = _cairo_drm_known_devices; dev != NULL; dev = dev->next) { + if (dev->id == devid) { + dev = (cairo_drm_device_t *) cairo_device_reference (&dev->base); + goto DONE; + } + } + + parent = udev_device_get_parent (device); + pci_id = get_udev_property (parent, "PCI_ID"); + if (pci_id == NULL || sscanf (pci_id, "%x:%x", &vendor_id, &chip_id) != 2) { + dev = NULL; + goto DONE; + } + +#if CAIRO_HAS_GALLIUM_SURFACE + if (getenv ("CAIRO_GALLIUM_FORCE")) + { + i = ARRAY_LENGTH (driver_map) - 1; + } + else +#endif + { + for (i = 0; i < ARRAY_LENGTH (driver_map); i++) { + if (driver_map[i].vendor_id == ~0U) + break; + + if (driver_map[i].vendor_id == vendor_id && + (driver_map[i].chip_id == ~0U || driver_map[i].chip_id == chip_id)) + break; + } + + if (i == ARRAY_LENGTH (driver_map)) { + dev = (cairo_drm_device_t *) + _cairo_device_create_in_error (CAIRO_STATUS_DEVICE_ERROR); + goto DONE; + } + } + + path = udev_device_get_devnode (device); + if (path == NULL) + path = "/dev/dri/card0"; /* XXX buggy udev? */ + + fd = open (path, O_RDWR); + if (fd == -1) { + /* XXX more likely to be a permissions issue... */ + _cairo_error_throw (CAIRO_STATUS_FILE_NOT_FOUND); + dev = NULL; + goto DONE; + } + + dev = driver_map[i].create_func (fd, devid, vendor_id, chip_id); + if (dev == NULL) + close (fd); + + DONE: + CAIRO_MUTEX_UNLOCK (_cairo_drm_device_mutex); + + if (dev == NULL) + return _cairo_device_create_in_error (CAIRO_STATUS_DEVICE_ERROR); + else + return &dev->base; +} +slim_hidden_def (cairo_drm_device_get); + +cairo_device_t * +cairo_drm_device_get_for_fd (int fd) +{ + struct stat st; + struct udev *udev; + struct udev_device *device; + cairo_device_t *dev = NULL; + + if (fstat (fd, &st) < 0 || ! S_ISCHR (st.st_mode)) { + //_cairo_error_throw (CAIRO_STATUS_INVALID_DEVICE); + return _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + } + + udev = udev_new (); + + device = udev_device_new_from_devnum (udev, 'c', st.st_rdev); + if (device != NULL) { + dev = cairo_drm_device_get (device); + udev_device_unref (device); + } + + udev_unref (udev); + + return dev; +} +slim_hidden_def (cairo_drm_device_get_for_fd); + +cairo_device_t * +cairo_drm_device_default (void) +{ + struct udev *udev; + struct udev_enumerate *e; + struct udev_list_entry *entry; + cairo_device_t *dev; + + /* optimistic atomic pointer read */ + dev = &_cairo_drm_default_device->base; + if (dev != NULL) + return dev; + + udev = udev_new(); + if (udev == NULL) + return _cairo_device_create_in_error (CAIRO_STATUS_NO_MEMORY); + + e = udev_enumerate_new (udev); + udev_enumerate_add_match_subsystem (e, "drm"); + udev_enumerate_scan_devices (e); + udev_list_entry_foreach (entry, udev_enumerate_get_list_entry (e)) { + struct udev_device *device; + + device = + udev_device_new_from_syspath (udev, + udev_list_entry_get_name (entry)); + + dev = cairo_drm_device_get (device); + + udev_device_unref (device); + + if (dev != NULL) { + if (((cairo_drm_device_t *) dev)->fd == -1) { + /* try again, we may find a usable card */ + cairo_device_destroy (dev); + dev = NULL; + } else + break; + } + } + udev_enumerate_unref (e); + udev_unref (udev); + + cairo_device_destroy (dev); /* owned by _cairo_drm_default_device */ + return dev; +} +slim_hidden_def (cairo_drm_device_default); + +void +_cairo_drm_device_reset_static_data (void) +{ + if (_cairo_drm_default_device != NULL) { + cairo_device_t *device = &_cairo_drm_default_device->base; + _cairo_drm_default_device = NULL; + cairo_device_destroy (device); + } +} + +int +cairo_drm_device_get_fd (cairo_device_t *abstract_device) +{ + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + + if (device->base.status) + return -1; + + return device->fd; +} + +void +_cairo_drm_device_fini (cairo_drm_device_t *device) +{ + if (device->fd != -1) + close (device->fd); +} + +void +cairo_drm_device_throttle (cairo_device_t *abstract_device) +{ + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + cairo_status_t status; + + if (unlikely (device->base.status)) + return; + + if (device->device.throttle == NULL) + return; + + status = device->device.throttle (device); + if (unlikely (status)) + _cairo_status_set_error (&device->base.status, status); +} + +cairo_bool_t +_cairo_drm_size_is_valid (cairo_device_t *abstract_device, + int width, int height) +{ + cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + + if (unlikely (device->base.status)) + return FALSE; + + return width <= device->max_surface_size && + height <= device->max_surface_size; +} diff --git a/src/skia/cairo-skia-context.cpp b/src/skia/cairo-skia-context.cpp new file mode 100644 index 000000000..9ffb8f6a2 --- /dev/null +++ b/src/skia/cairo-skia-context.cpp @@ -0,0 +1,1781 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2010 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Chris Wilson + */ + +#include "cairoint.h" + +#include "cairo-private.h" +#include "cairo-error-private.h" +#include "cairo-arc-private.h" +#include "cairo-backend-private.h" +#include "cairo-default-context-private.h" +#include "cairo-freed-pool-private.h" +#include "cairo-gstate-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-path-private.h" +#include "cairo-pattern-private.h" +#include "cairo-skia-private.h" +#include "cairo-surface-backend-private.h" + +#include +#include +#include +#include +#include + +#if !defined(INFINITY) +#define INFINITY HUGE_VAL +#endif + +#if (CAIRO_FIXED_BITS == 32) && (CAIRO_FIXED_FRAC_BITS == 16) && defined(SK_SCALAR_IS_FIXED) +# define CAIRO_FIXED_TO_SK_SCALAR(x) (x) +#elif defined(SK_SCALAR_IS_FIXED) +/* This can be done better, but this will do for now */ +# define CAIRO_FIXED_TO_SK_SCALAR(x) SkFloatToScalar(_cairo_fixed_to_double(x)) +#else +# define CAIRO_FIXED_TO_SK_SCALAR(x) SkFloatToScalar(_cairo_fixed_to_double(x)) +#endif + +#define UNSUPPORTED + + +static freed_pool_t context_pool; + +static void +_cairo_skia_context_destroy (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->path->reset (); + cr->paint->reset (); + + delete cr->canvas; + + cairo_surface_destroy (&cr->target->image.base); + cairo_surface_destroy (&cr->original->image.base); + + if (cr->source != NULL) { + if (cr->source_image != NULL) { + _cairo_surface_release_source_image (cr->source, cr->source_image, cr->source_extra); + cr->source_image = NULL; + } + cairo_surface_destroy (cr->source); + cr->source = NULL; + } + + _cairo_fini (&cr->base); + + _freed_pool_put (&context_pool, cr); +} + +static cairo_surface_t * +_cairo_skia_context_get_original_target (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return &cr->original->image.base; +} + +static cairo_surface_t * +_cairo_skia_context_get_current_target (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return &cr->target->image.base; +} + +static cairo_status_t +_cairo_skia_context_save (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->canvas->save (); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_restore (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->canvas->restore (); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_push_group (void *abstract_cr, cairo_content_t content) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_surface_t *group_surface; + cairo_status_t status; + int width, height; + + //clip = _cairo_gstate_get_clip (cr->gstate); + width = cr->target->image.width; + height = cr->target->image.height; + group_surface = cr->target->image.base.backend->create_similar (&cr->target->image.base, + content, width, height); + +#if 0 + /* Set device offsets on the new surface so that logically it appears at + * the same location on the parent surface -- when we pop_group this, + * the source pattern will get fixed up for the appropriate target surface + * device offsets, so we want to set our own surface offsets from /that/, + * and not from the device origin. */ + cairo_surface_set_device_offset (group_surface, + parent_surface->device_transform.x0 - extents.x, + parent_surface->device_transform.y0 - extents.y); + + /* If we have a current path, we need to adjust it to compensate for + * the device offset just applied. */ + _cairo_path_fixed_transform (cr->path, + &group_surface->device_transform); +#endif + + status = _cairo_skia_context_save (cr); + if (unlikely (status)) { + cairo_surface_destroy (group_surface); + return status; + } + + cairo_surface_destroy (&cr->target->image.base); + cr->target = (cairo_skia_surface_t *) group_surface; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_pattern_t * +_cairo_skia_context_pop_group (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_surface_t *group_surface; + cairo_pattern_t *group_pattern; + cairo_status_t status; + + group_surface = cairo_surface_reference (&cr->target->image.base); + + status = _cairo_skia_context_restore (cr); + if (unlikely (status)) { + group_pattern = _cairo_pattern_create_in_error (status); + goto done; + } + + group_pattern = cairo_pattern_create_for_surface (group_surface); + status = group_pattern->status; + if (unlikely (status)) + goto done; + +#if 0 + _cairo_gstate_get_matrix (cr->gstate, &group_matrix); + /* Transform by group_matrix centered around device_transform so that when + * we call _cairo_gstate_copy_transformed_pattern the result is a pattern + * with a matrix equivalent to the device_transform of group_surface. */ + if (_cairo_surface_has_device_transform (group_surface)) { + cairo_pattern_set_matrix (group_pattern, &group_surface->device_transform); + _cairo_pattern_transform (group_pattern, &group_matrix); + _cairo_pattern_transform (group_pattern, &group_surface->device_transform_inverse); + } else { + cairo_pattern_set_matrix (group_pattern, &group_matrix); + } + + /* If we have a current path, we need to adjust it to compensate for + * the device offset just removed. */ + _cairo_path_fixed_transform (cr->path, + &group_surface->device_transform_inverse); +#endif + +done: + cairo_surface_destroy (group_surface); + + return group_pattern; +} + +static inline cairo_surface_t * +surface_from_pattern (const cairo_pattern_t *pattern) +{ + return (reinterpret_cast (pattern))->surface; +} + +static inline bool +surface_to_sk_bitmap (cairo_surface_t *surface, SkBitmap& bitmap) +{ + cairo_image_surface_t *img = (cairo_image_surface_t *) surface; + SkBitmap::Config config; + SkColorType colorType; + bool opaque; + + if (unlikely (! format_to_sk_config (img->format, config, opaque))) + return false; + + bitmap.reset (); + bitmap.setAlphaType (opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); + colorType = SkBitmapConfigToColorType(config); + bitmap.setInfo (SkImageInfo::Make(img->width, img->height, colorType, kPremul_SkAlphaType), img->stride); + bitmap.setPixels (img->data); + + + return true; +} + +static inline SkMatrix +matrix_to_sk (const cairo_matrix_t& mat) +{ + SkMatrix skm; + + skm.reset (); + skm.set (SkMatrix::kMScaleX, SkFloatToScalar (mat.xx)); + skm.set (SkMatrix::kMSkewX, SkFloatToScalar (mat.xy)); + skm.set (SkMatrix::kMTransX, SkFloatToScalar (mat.x0)); + skm.set (SkMatrix::kMSkewY, SkFloatToScalar (mat.yx)); + skm.set (SkMatrix::kMScaleY, SkFloatToScalar (mat.yy)); + skm.set (SkMatrix::kMTransY, SkFloatToScalar (mat.y0)); + + /* + skm[6] = SkFloatToScalar (0.0); + skm[7] = SkFloatToScalar (0.0); + skm[8] = SkFloatToScalar (1.0); -- this isn't right, it wants a magic value in there that it'll set itself. It wants Sk_Fract1 (2.30), not Sk_Scalar1 + */ + + return skm; +} + +static inline SkMatrix +matrix_inverse_to_sk (const cairo_matrix_t& mat) +{ + cairo_matrix_t inv = mat; + cairo_status_t status = cairo_matrix_invert (&inv); + assert (status == CAIRO_STATUS_SUCCESS); + return matrix_to_sk (inv); +} + +static SkShader::TileMode +extend_to_sk (cairo_extend_t extend) +{ + static const SkShader::TileMode modeMap[] = { + SkShader::kClamp_TileMode, // NONE behaves like PAD, because noone wants NONE + SkShader::kRepeat_TileMode, + SkShader::kMirror_TileMode, + SkShader::kClamp_TileMode + }; + + return modeMap[extend]; +} + +static inline SkColor +color_to_sk (const cairo_color_t& c) +{ + /* Need unpremultiplied 1-byte values */ + return SkColorSetARGB ((U8CPU) (c.alpha * 255), + (U8CPU) (c.red * 255), + (U8CPU) (c.green * 255), + (U8CPU) (c.blue * 255)); +} + +static inline SkColor +color_stop_to_sk (const cairo_color_stop_t& c) +{ + /* Need unpremultiplied 1-byte values */ + return SkColorSetARGB ((U8CPU) (c.alpha * 255), + (U8CPU) (c.red * 255), + (U8CPU) (c.green * 255), + (U8CPU) (c.blue * 255)); +} + +static SkShader* +source_to_sk_shader (cairo_skia_context_t *cr, + const cairo_pattern_t *pattern) +{ + SkShader *shader = NULL; + + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern; + return new SkColorShader (color_to_sk (solid->color)); + } else if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_t *surface = surface_from_pattern (pattern); + + cr->source = cairo_surface_reference (surface); + + if (surface->type == CAIRO_SURFACE_TYPE_SKIA) { + cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; + + if (! _cairo_matrix_is_identity (&pattern->matrix)) + { + SkMatrix localMatrix = matrix_inverse_to_sk (pattern->matrix); + shader = SkShader::CreateBitmapShader (*esurf->bitmap, + extend_to_sk (pattern->extend), + extend_to_sk (pattern->extend), + &localMatrix); + } else { + shader = SkShader::CreateBitmapShader (*esurf->bitmap, + extend_to_sk (pattern->extend), + extend_to_sk (pattern->extend)); + } + } else { + SkBitmap bitmap; + + if (! _cairo_surface_is_image (surface)) { + cairo_status_t status; + + status = _cairo_surface_acquire_source_image (surface, + &cr->source_image, + &cr->source_extra); + if (status) + return NULL; + + surface = &cr->source_image->base; + } + + if (unlikely (! surface_to_sk_bitmap (surface, bitmap))) + return NULL; + + if (! _cairo_matrix_is_identity (&pattern->matrix)) + { + SkMatrix localMatrix = matrix_inverse_to_sk (pattern->matrix); + shader = SkShader::CreateBitmapShader (bitmap, + extend_to_sk (pattern->extend), + extend_to_sk (pattern->extend), + &localMatrix); + } else { + shader = SkShader::CreateBitmapShader (bitmap, + extend_to_sk (pattern->extend), + extend_to_sk (pattern->extend)); + } + } + } else if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR + /* || pattern->type == CAIRO_PATTERN_TYPE_RADIAL */) + { + cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; + SkColor colors_stack[10]; + SkScalar pos_stack[10]; + SkColor *colors = colors_stack; + SkScalar *pos = pos_stack; + + if (gradient->n_stops > 10) { + colors = new SkColor[gradient->n_stops]; + pos = new SkScalar[gradient->n_stops]; + } + + for (unsigned int i = 0; i < gradient->n_stops; i++) { + pos[i] = CAIRO_FIXED_TO_SK_SCALAR (gradient->stops[i].offset); + colors[i] = color_stop_to_sk (gradient->stops[i].color); + } + + if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { + cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) gradient; + SkPoint points[2]; + + points[0].set (SkFloatToScalar (linear->pd1.x), + SkFloatToScalar (linear->pd1.y)); + points[1].set (SkFloatToScalar (linear->pd2.x), + SkFloatToScalar (linear->pd2.y)); + + if(! _cairo_matrix_is_identity (&pattern->matrix)) + { + SkMatrix localMatrix = matrix_inverse_to_sk (pattern->matrix); + shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops, + extend_to_sk (pattern->extend), + 0, &localMatrix); + } else { + shader = SkGradientShader::CreateLinear (points, colors, pos, gradient->n_stops, + extend_to_sk (pattern->extend)); + } + } else { + // XXX todo -- implement real radial shaders in Skia + } + + if (gradient->n_stops > 10) { + delete [] colors; + delete [] pos; + } + } + + return shader; +} + +static inline bool +pattern_filter_to_sk (const cairo_pattern_t *pattern) +{ + switch (pattern->filter) { + case CAIRO_FILTER_GOOD: + case CAIRO_FILTER_BEST: + case CAIRO_FILTER_BILINEAR: + case CAIRO_FILTER_GAUSSIAN: + return true; + default: + case CAIRO_FILTER_FAST: + case CAIRO_FILTER_NEAREST: + return false; + } +} + +static inline bool +pattern_to_sk_color (const cairo_pattern_t *pattern, SkColor& color) +{ + if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) + return false; + + color = color_to_sk (((cairo_solid_pattern_t *) pattern)->color); + return true; +} + +static cairo_status_t +_cairo_skia_context_set_source (void *abstract_cr, + cairo_pattern_t *source) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + SkColor color; + + if (cr->source != NULL) { + if (cr->source_image != NULL) { + _cairo_surface_release_source_image (cr->source, cr->source_image, cr->source_extra); + cr->source_image = NULL; + } + cairo_surface_destroy (cr->source); + cr->source = NULL; + } + + if (pattern_to_sk_color (source, color)) { + cr->paint->setColor (color); + } else { + SkShader *shader = source_to_sk_shader (cr, source); + bool fLevel = pattern_filter_to_sk (source); + if (shader == NULL) { + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; + } + + cr->paint->setShader (shader); + shader->unref (); + + cr->paint->setFilterLevel (fLevel ? + (SkPaint::kLow_FilterLevel) : (SkPaint::kNone_FilterLevel)); + } + + /* XXX change notification */ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_source_rgba (void *abstract_cr, double red, double green, double blue, double alpha) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* Need unpremultiplied 1-byte values */ + cr->paint->setARGB ((U8CPU) (alpha * 255), + (U8CPU) (red * 255), + (U8CPU) (green * 255), + (U8CPU) (blue * 255)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_source_surface (void *abstract_cr, + cairo_surface_t *surface, + double x, + double y) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + cairo_status_t status; + + if (surface->type == CAIRO_SURFACE_TYPE_SKIA) { + cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) surface; + SkShader *shader; + + shader = SkShader::CreateBitmapShader (*esurf->bitmap, + SkShader::kClamp_TileMode, /* XXX */ + SkShader::kClamp_TileMode); + + cr->paint->setShader (shader); + shader->unref (); + + cr->paint->setFilterLevel (true ? + (SkPaint::kLow_FilterLevel) : (SkPaint::kNone_FilterLevel)); + + return CAIRO_STATUS_SUCCESS; + } + + pattern = cairo_pattern_create_for_surface (surface); + if (unlikely (pattern->status)) + return pattern->status; + + cairo_matrix_init_translate (&matrix, -x, -y); + cairo_pattern_set_matrix (pattern, &matrix); + + status = _cairo_skia_context_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + return status; +} + +static cairo_pattern_t * +_cairo_skia_context_get_source (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return NULL; +} + +static cairo_status_t +_cairo_skia_context_set_tolerance (void *abstract_cr, + double tolerance) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX ignored */ + return CAIRO_STATUS_SUCCESS; +} + +static inline SkXfermode::Mode +operator_to_sk (cairo_operator_t op) +{ + static const SkXfermode::Mode modeMap[] = { + SkXfermode::kClear_Mode, + + SkXfermode::kSrc_Mode, + SkXfermode::kSrcOver_Mode, + SkXfermode::kSrcIn_Mode, + SkXfermode::kSrcOut_Mode, + SkXfermode::kSrcATop_Mode, + + SkXfermode::kDst_Mode, + SkXfermode::kDstOver_Mode, + SkXfermode::kDstIn_Mode, + SkXfermode::kDstOut_Mode, + SkXfermode::kDstATop_Mode, + + SkXfermode::kXor_Mode, + SkXfermode::kPlus_Mode, // XXX Add? + SkXfermode::kPlus_Mode, // XXX SATURATE + + SkXfermode::kPlus_Mode, + SkXfermode::kMultiply_Mode, + SkXfermode::kScreen_Mode, + SkXfermode::kOverlay_Mode, + SkXfermode::kDarken_Mode, + SkXfermode::kLighten_Mode, + SkXfermode::kColorDodge_Mode, + SkXfermode::kColorBurn_Mode, + SkXfermode::kHardLight_Mode, + SkXfermode::kSoftLight_Mode, + SkXfermode::kDifference_Mode, + SkXfermode::kExclusion_Mode, + + SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_HUE + SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_SATURATION, + SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_COLOR, + SkXfermode::kSrcOver_Mode, // XXX: CAIRO_OPERATOR_HSL_LUMINOSITY + }; + + return modeMap[op]; +} + +static cairo_status_t +_cairo_skia_context_set_operator (void *abstract_cr, cairo_operator_t op) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setXfermodeMode (operator_to_sk (op)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_opacity (void *abstract_cr, double opacity) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX */ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_antialias (void *abstract_cr, cairo_antialias_t antialias) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setAntiAlias (antialias != CAIRO_ANTIALIAS_NONE); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_fill_rule (void *abstract_cr, + cairo_fill_rule_t fill_rule) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->path->setFillType (fill_rule == CAIRO_FILL_RULE_WINDING ? SkPath::kWinding_FillType : SkPath::kEvenOdd_FillType); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_line_width (void *abstract_cr, + double line_width) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setStrokeWidth (SkFloatToScalar (line_width)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_line_cap (void *abstract_cr, + cairo_line_cap_t line_cap) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + static const SkPaint::Cap map[] = { + SkPaint::kButt_Cap, + SkPaint::kRound_Cap, + SkPaint::kSquare_Cap + }; + cr->paint->setStrokeCap (map[line_cap]); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_line_join (void *abstract_cr, + cairo_line_join_t line_join) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + static const SkPaint::Join map[] = { + SkPaint::kMiter_Join, + SkPaint::kRound_Join, + SkPaint::kBevel_Join + }; + cr->paint->setStrokeJoin (map[line_join]); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_dash (void *abstract_cr, + const double *dashes, + int num_dashes, + double offset) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + SkScalar intervals_static[20]; + SkScalar *intervals = intervals_static; + + if (num_dashes == 0) { + cr->paint->setPathEffect (NULL); + return CAIRO_STATUS_SUCCESS; + } + + int loop = 0; + if ((num_dashes & 1) != 0) { + loop = 1; + num_dashes <<= 1; + } + + if (num_dashes > 20) + intervals = new SkScalar[num_dashes]; + + int i = 0; + do { + for (int j = 0; i < num_dashes; j++) + intervals[i++] = SkFloatToScalar (dashes[j]); + } while (loop--); + + SkDashPathEffect *dash = SkDashPathEffect::Create (intervals, num_dashes, SkFloatToScalar (offset)); + + cr->paint->setPathEffect (dash); + dash->unref (); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_miter_limit (void *abstract_cr, double limit) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setStrokeMiter (SkFloatToScalar (limit)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_antialias_t +_cairo_skia_context_get_antialias (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return cr->paint->isAntiAlias () ? CAIRO_ANTIALIAS_DEFAULT : CAIRO_ANTIALIAS_NONE; +} + +static void +_cairo_skia_context_get_dash (void *abstract_cr, + double *dashes, + int *num_dashes, + double *offset) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + *num_dashes = 0; + /* XXX */ +} + +static cairo_fill_rule_t +_cairo_skia_context_get_fill_rule (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + SkPath::FillType ft; + + ft = cr->path->getFillType (); + if (ft == SkPath::kWinding_FillType) + return CAIRO_FILL_RULE_WINDING; + if (ft == SkPath::kEvenOdd_FillType) + return CAIRO_FILL_RULE_EVEN_ODD;; + + UNSUPPORTED; + return CAIRO_FILL_RULE_WINDING; +} + +static double +_cairo_skia_context_get_line_width (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return /* ScalarToFloat */ cr->paint->getStrokeWidth (); +} + +static cairo_line_cap_t +_cairo_skia_context_get_line_cap (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + static const cairo_line_cap_t map[] = { + CAIRO_LINE_CAP_BUTT, + CAIRO_LINE_CAP_ROUND, + CAIRO_LINE_CAP_SQUARE + }; + return map[cr->paint->getStrokeCap ()]; +} + +static cairo_line_join_t +_cairo_skia_context_get_line_join (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + static const cairo_line_join_t map[] = { + CAIRO_LINE_JOIN_MITER, + CAIRO_LINE_JOIN_ROUND, + CAIRO_LINE_JOIN_BEVEL + }; + return map[cr->paint->getStrokeJoin ()]; +} + +static double +_cairo_skia_context_get_miter_limit (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return /* SkScalarToFloat */ cr->paint->getStrokeMiter (); +} + +static cairo_operator_t +_cairo_skia_context_get_operator (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + //cr->paint->getXfermode (); + return CAIRO_OPERATOR_OVER; +} + +static double +_cairo_skia_context_get_opacity (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return 1.; +} + +static double +_cairo_skia_context_get_tolerance (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX */ + return CAIRO_GSTATE_TOLERANCE_DEFAULT; +} + + +/* Current tranformation matrix */ + +static cairo_status_t +_cairo_skia_context_translate (void *abstract_cr, + double tx, + double ty) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_translate (&cr->matrix, tx, ty); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_scale (void *abstract_cr, + double sx, + double sy) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_scale (&cr->matrix, sx, sy); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_rotate (void *abstract_cr, + double theta) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_rotate (&cr->matrix, theta); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_transform (void *abstract_cr, + const cairo_matrix_t *matrix) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_multiply (&cr->matrix, &cr->matrix, matrix); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_matrix (void *abstract_cr, + const cairo_matrix_t *matrix) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->matrix = *matrix; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_identity_matrix (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_init_identity (&cr->matrix); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_skia_context_get_matrix (void *abstract_cr, + cairo_matrix_t *matrix) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + *matrix = cr->matrix; +} + +static void +_cairo_skia_context_user_to_device (void *abstract_cr, + double *x, + double *y) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_transform_point (&cr->matrix, x, y); +} + +static void +_cairo_skia_context_user_to_device_distance (void *abstract_cr, + double *dx, + double *dy) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cairo_matrix_transform_distance (&cr->matrix, dx, dy); +} + +static void +_cairo_skia_context_device_to_user (void *abstract_cr, + double *x, + double *y) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_matrix_t inverse; + cairo_status_t status; + + inverse = cr->matrix; + status = cairo_matrix_invert (&inverse); + assert (CAIRO_STATUS_SUCCESS == status); + + cairo_matrix_transform_point (&inverse, x, y); +} + +static void +_cairo_skia_context_device_to_user_distance (void *abstract_cr, + double *dx, + double *dy) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_matrix_t inverse; + cairo_status_t status; + + inverse = cr->matrix; + status = cairo_matrix_invert (&inverse); + assert (CAIRO_STATUS_SUCCESS == status); + + cairo_matrix_transform_distance (&inverse, dx, dy); +} + +/* Path constructor */ + +static cairo_status_t +_cairo_skia_context_new_path (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->path->reset (); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_new_sub_path (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->path->rMoveTo (0, 0); /* XXX */ + return CAIRO_STATUS_SUCCESS; +} + +static void +user_to_device_point (cairo_skia_context_t *cr, double *x, double *y) +{ + cairo_matrix_transform_point (&cr->matrix, x, y); + cairo_matrix_transform_point (&cr->target->image.base.device_transform, x, y); +} + +static void +user_to_device_distance (cairo_skia_context_t *cr, double *dx, double *dy) +{ + cairo_matrix_transform_distance (&cr->matrix, dx, dy); + cairo_matrix_transform_distance (&cr->target->image.base.device_transform, dx, dy); +} + +static cairo_status_t +_cairo_skia_context_move_to (void *abstract_cr, double x, double y) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + user_to_device_point (cr, &x, &y); + cr->path->moveTo (SkFloatToScalar (x), SkFloatToScalar (y)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_line_to (void *abstract_cr, double x, double y) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + user_to_device_point (cr, &x, &y); + cr->path->lineTo (SkFloatToScalar (x), SkFloatToScalar (y)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_curve_to (void *abstract_cr, + double x1, double y1, + double x2, double y2, + double x3, double y3) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + user_to_device_point (cr, &x1, &y1); + user_to_device_point (cr, &x2, &y2); + user_to_device_point (cr, &x3, &y3); + cr->path->cubicTo (SkFloatToScalar (x1), SkFloatToScalar (y1), + SkFloatToScalar (x2), SkFloatToScalar (y2), + SkFloatToScalar (x3), SkFloatToScalar (y3)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_arc_to (void *abstract_cr, + double x1, double y1, + double x2, double y2, + double radius) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + +#if 0 + user_to_device_point (cr, &x1, &y1); + user_to_device_point (cr, &x2, &y2); + user_to_device_distance (cr, &radius, &radius); +#endif + + cr->path->arcTo (SkFloatToScalar (x1), SkFloatToScalar (y1), + SkFloatToScalar (x2), SkFloatToScalar (y2), + SkFloatToScalar (radius)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_rel_move_to (void *abstract_cr, double dx, double dy) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + user_to_device_distance (cr, &dx, &dy); + cr->path->rMoveTo (SkFloatToScalar (dx), SkFloatToScalar (dy)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_rel_line_to (void *abstract_cr, double dx, double dy) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + user_to_device_distance (cr, &dx, &dy); + cr->path->rLineTo (SkFloatToScalar (dx), SkFloatToScalar (dy)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_rel_curve_to (void *abstract_cr, + double dx1, double dy1, + double dx2, double dy2, + double dx3, double dy3) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + user_to_device_distance (cr, &dx1, &dy1); + user_to_device_distance (cr, &dx2, &dy2); + user_to_device_distance (cr, &dx3, &dy3); + cr->path->rCubicTo (SkFloatToScalar (dx1), SkFloatToScalar (dy1), + SkFloatToScalar (dx2), SkFloatToScalar (dy2), + SkFloatToScalar (dx3), SkFloatToScalar (dy3)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_rel_arc_to (void *abstract_cr, + double dx1, double dy1, + double dx2, double dy2, + double radius) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + +#if 0 + user_to_device_point (cr, &x1, &y1); + user_to_device_point (cr, &x2, &y2); + user_to_device_distance (cr, &radius, &radius); +#endif + + cr->path->arcTo (SkFloatToScalar (dx1), SkFloatToScalar (dy1), + SkFloatToScalar (dx2), SkFloatToScalar (dy2), + SkFloatToScalar (radius)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_close_path (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->path->close (); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_rectangle (void *abstract_cr, + double x, double y, + double width, double height) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + double x1, y1, x2, y2; + + /* XXX assume no rotation! */ + x1 = x, y1 = y; + user_to_device_point (cr, &x1, &y1); + + x2 = x + width, y2 = y + height; + user_to_device_point (cr, &x2, &y2); + + cr->path->addRect (SkFloatToScalar (x1), SkFloatToScalar (y1), + SkFloatToScalar (x2), SkFloatToScalar (y2)); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_arc (void *abstract_cr, + double xc, double yc, double radius, + double angle1, double angle2, + cairo_bool_t forward) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_status_t status; + + /* XXX cr->path->arc() */ + + /* Do nothing, successfully, if radius is <= 0 */ + if (radius <= 0.0) { + status = _cairo_skia_context_line_to (cr, xc, yc); + if (unlikely (status)) + return status; + + status = _cairo_skia_context_line_to (cr, xc, yc); + if (unlikely (status)) + return status; + + return CAIRO_STATUS_SUCCESS; + } + + status = _cairo_skia_context_line_to (cr, + xc + radius * cos (angle1), + yc + radius * sin (angle1)); + + if (unlikely (status)) + return status; + + if (forward) + _cairo_arc_path (&cr->base, xc, yc, radius, angle1, angle2); + else + _cairo_arc_path_negative (&cr->base, xc, yc, radius, angle1, angle2); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_skia_context_path_extents (void *abstract_cr, + double *x1, + double *y1, + double *x2, + double *y2) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + SkRect rect; + + rect = cr->path->getBounds (); + + UNSUPPORTED; + /* XXX transform SkScalar rect to user */ +} + +static cairo_bool_t +_cairo_skia_context_has_current_point (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return TRUE; +} + +static cairo_bool_t +_cairo_skia_context_get_current_point (void *abstract_cr, + double *x, + double *y) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + SkPoint pt; + + cr->path->getLastPt (&pt); + //*x = SkScalarToFloat (pt.x); + //*y = SkScalarToFloat (pt.y); + //_cairo_gstate_backend_to_user (cr->gstate, x, y); + + return TRUE; +} + +static cairo_path_t * +_cairo_skia_context_copy_path (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX iterate */ + UNSUPPORTED; + return NULL; +} + +static cairo_path_t * +_cairo_skia_context_copy_path_flat (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX iterate and decompose */ + UNSUPPORTED; + return NULL; +} + +static cairo_status_t +_cairo_skia_context_append_path (void *abstract_cr, + const cairo_path_t *path) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + // return _cairo_path_append_to_context (path, cr); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_stroke_to_path (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setStyle (SkPaint::kStroke_Style); + cr->paint->getFillPath (*cr->path, cr->path); + return CAIRO_STATUS_SUCCESS; +} + + +static cairo_status_t +_cairo_skia_context_paint (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + +#if 0 + if (cr->source != NULL) { + SkBitmap bitmap; + SkMatrix bitmapMatrix; + + if (cr->source->type == CAIRO_SURFACE_TYPE_SKIA) { + cairo_skia_surface_t *esurf = (cairo_skia_surface_t *) cr->source->type; + + bitmap = *esurf->bitmap; + } else { + surface_to_sk_bitmap (&cr->source_image->base, bitmap); + } + + // XXX pattern->matrix, pattern->filter, pattern->extend + cr->canvas->drawBitmapMatrix (bitmap, bitmapMatrix, cr->paint); + } else { + cr->canvas->drawPaint (*cr->paint); + } +#else + cr->canvas->drawPaint (*cr->paint); +#endif + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_paint_with_alpha (void *abstract_cr, + double alpha) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_status_t status; + + if (CAIRO_ALPHA_IS_OPAQUE (alpha)) + return _cairo_skia_context_paint (cr); + + cr->paint->setAlpha(SkScalarRoundToInt(255*alpha)); + status = _cairo_skia_context_paint (cr); + cr->paint->setAlpha(255); + + return status; +} + +static cairo_status_t +_cairo_skia_context_mask (void *abstract_cr, + cairo_pattern_t *mask) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX */ + //UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_stroke_preserve (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setStyle (SkPaint::kStroke_Style); + + /* XXX pen transformation? */ + //assert (_cairo_matrix_is_identity (&cr->matrix)); + cr->canvas->drawPath (*cr->path, *cr->paint); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_stroke (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_status_t status; + + status = _cairo_skia_context_stroke_preserve (cr); + if (unlikely (status)) + return status; + + return _cairo_skia_context_new_path (cr); +} + +static cairo_status_t +_cairo_skia_context_in_stroke (void *abstract_cr, + double x, double y, + cairo_bool_t *inside) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_stroke_extents (void *abstract_cr, + double *x1, double *y1, double *x2, double *y2) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_fill_preserve (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->paint->setStyle (SkPaint::kFill_Style); + cr->canvas->drawPath (*cr->path, *cr->paint); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_fill (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_status_t status; + + status = _cairo_skia_context_fill_preserve (cr); + if (unlikely (status)) + return status; + + return _cairo_skia_context_new_path (cr); +} + +static cairo_status_t +_cairo_skia_context_in_fill (void *abstract_cr, + double x, double y, + cairo_bool_t *inside) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_fill_extents (void *abstract_cr, + double *x1, double *y1, double *x2, double *y2) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_clip_preserve (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + cr->canvas->clipPath (*cr->path); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_clip (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + cairo_status_t status; + + status = _cairo_skia_context_clip_preserve (cr); + if (unlikely (status)) + return status; + + return _cairo_skia_context_new_path (cr); +} + +static cairo_status_t +_cairo_skia_context_in_clip (void *abstract_cr, + double x, double y, + cairo_bool_t *inside) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_reset_clip (void *abstract_cr) +{ + cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + SkRegion rgn(SkIRect::MakeWH (cr->target->bitmap->width (), + cr->target->bitmap->height ())); + + cr->canvas->setClipRegion(rgn); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_clip_extents (void *abstract_cr, + double *x1, double *y1, + double *x2, double *y2) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_rectangle_list_t * +_cairo_skia_context_copy_clip_rectangle_list (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return NULL; +} + +static cairo_status_t +_cairo_skia_context_copy_page (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_show_page (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_font_face (void *abstract_cr, + cairo_font_face_t *font_face) +{ + // cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + //return _cairo_gstate_set_font_face (cr->gstate, font_face); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_font_face_t * +_cairo_skia_context_get_font_face (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return NULL; +} + +static cairo_status_t +_cairo_skia_context_font_extents (void *abstract_cr, + cairo_font_extents_t *extents) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_font_size (void *abstract_cr, + double size) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_set_font_matrix (void *abstract_cr, + const cairo_matrix_t *matrix) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_skia_context_get_font_matrix (void *abstract_cr, + cairo_matrix_t *matrix) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; +} + +static cairo_status_t +_cairo_skia_context_set_font_options (void *abstract_cr, + const cairo_font_options_t *options) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_skia_context_get_font_options (void *abstract_cr, + cairo_font_options_t *options) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; +} + +static cairo_status_t +_cairo_skia_context_set_scaled_font (void *abstract_cr, + cairo_scaled_font_t *scaled_font) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_scaled_font_t * +_cairo_skia_context_get_scaled_font (void *abstract_cr) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return _cairo_scaled_font_create_in_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); +} + +static cairo_status_t +_cairo_skia_context_glyphs (void *abstract_cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_glyph_text_info_t *info) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + /* XXX */ + //UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_glyph_path (void *abstract_cr, + const cairo_glyph_t *glyphs, + int num_glyphs) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_skia_context_glyph_extents (void *abstract_cr, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_text_extents_t *extents) +{ + //cairo_skia_context_t *cr = (cairo_skia_context_t *) abstract_cr; + + UNSUPPORTED; + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_backend_t _cairo_skia_context_backend = { + CAIRO_TYPE_SKIA, + _cairo_skia_context_destroy, + + _cairo_skia_context_get_original_target, + _cairo_skia_context_get_current_target, + + _cairo_skia_context_save, + _cairo_skia_context_restore, + + _cairo_skia_context_push_group, + _cairo_skia_context_pop_group, + + _cairo_skia_context_set_source_rgba, + _cairo_skia_context_set_source_surface, + _cairo_skia_context_set_source, + _cairo_skia_context_get_source, + + _cairo_skia_context_set_antialias, + _cairo_skia_context_set_dash, + _cairo_skia_context_set_fill_rule, + _cairo_skia_context_set_line_cap, + _cairo_skia_context_set_line_join, + _cairo_skia_context_set_line_width, + _cairo_skia_context_set_miter_limit, + _cairo_skia_context_set_opacity, + _cairo_skia_context_set_operator, + _cairo_skia_context_set_tolerance, + _cairo_skia_context_get_antialias, + _cairo_skia_context_get_dash, + _cairo_skia_context_get_fill_rule, + _cairo_skia_context_get_line_cap, + _cairo_skia_context_get_line_join, + _cairo_skia_context_get_line_width, + _cairo_skia_context_get_miter_limit, + _cairo_skia_context_get_opacity, + _cairo_skia_context_get_operator, + _cairo_skia_context_get_tolerance, + + _cairo_skia_context_translate, + _cairo_skia_context_scale, + _cairo_skia_context_rotate, + _cairo_skia_context_transform, + _cairo_skia_context_set_matrix, + _cairo_skia_context_set_identity_matrix, + _cairo_skia_context_get_matrix, + _cairo_skia_context_user_to_device, + _cairo_skia_context_user_to_device_distance, + _cairo_skia_context_device_to_user, + _cairo_skia_context_device_to_user_distance, + _cairo_skia_context_user_to_device, /* XXX backend */ + _cairo_skia_context_user_to_device_distance, /* XXX backend */ + _cairo_skia_context_device_to_user, /* XXX backend */ + _cairo_skia_context_device_to_user_distance, /* XXX backend */ + + _cairo_skia_context_new_path, + _cairo_skia_context_new_sub_path, + _cairo_skia_context_move_to, + _cairo_skia_context_rel_move_to, + _cairo_skia_context_line_to, + _cairo_skia_context_rel_line_to, + _cairo_skia_context_curve_to, + _cairo_skia_context_rel_curve_to, + _cairo_skia_context_arc_to, + _cairo_skia_context_rel_arc_to, + _cairo_skia_context_close_path, + _cairo_skia_context_arc, + _cairo_skia_context_rectangle, + _cairo_skia_context_path_extents, + _cairo_skia_context_has_current_point, + _cairo_skia_context_get_current_point, + _cairo_skia_context_copy_path, + _cairo_skia_context_copy_path_flat, + _cairo_skia_context_append_path, + + _cairo_skia_stroke_to_path, + + _cairo_skia_context_clip, + _cairo_skia_context_clip_preserve, + _cairo_skia_context_in_clip, + _cairo_skia_context_clip_extents, + _cairo_skia_context_reset_clip, + _cairo_skia_context_copy_clip_rectangle_list, + + _cairo_skia_context_paint, + _cairo_skia_context_paint_with_alpha, + _cairo_skia_context_mask, + + _cairo_skia_context_stroke, + _cairo_skia_context_stroke_preserve, + _cairo_skia_context_in_stroke, + _cairo_skia_context_stroke_extents, + + _cairo_skia_context_fill, + _cairo_skia_context_fill_preserve, + _cairo_skia_context_in_fill, + _cairo_skia_context_fill_extents, + + _cairo_skia_context_set_font_face, + _cairo_skia_context_get_font_face, + _cairo_skia_context_set_font_size, + _cairo_skia_context_set_font_matrix, + _cairo_skia_context_get_font_matrix, + _cairo_skia_context_set_font_options, + _cairo_skia_context_get_font_options, + _cairo_skia_context_set_scaled_font, + _cairo_skia_context_get_scaled_font, + _cairo_skia_context_font_extents, + + _cairo_skia_context_glyphs, + _cairo_skia_context_glyph_path, + _cairo_skia_context_glyph_extents, + + _cairo_skia_context_copy_page, + _cairo_skia_context_show_page, +}; + +cairo_t * +_cairo_skia_context_create (void *target) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) target; + cairo_skia_context_t *cr; + + cr = (cairo_skia_context_t *) _freed_pool_get (&context_pool); + if (unlikely (cr == NULL)) { + cr = new cairo_skia_context_t; + if (unlikely (cr == NULL)) + return _cairo_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + cr->path = new SkPath; + cr->paint = new SkPaint; + } + + _cairo_init (&cr->base, &_cairo_skia_context_backend); + + cr->source = NULL; + cr->source_image = NULL; + + cr->paint->setStrokeWidth (SkFloatToScalar (2.0)); + + cr->target = (cairo_skia_surface_t *) cairo_surface_reference ((cairo_surface_t *) target); + cr->original = (cairo_skia_surface_t *) cairo_surface_reference ((cairo_surface_t *) target); + cr->canvas = new SkCanvas (*surface->bitmap); + cr->canvas->save (); + + cairo_matrix_init_identity (&cr->matrix); + + return &cr->base; +} + +#if 0 +void +_cairo_skia_context_set_SkPaint (cairo_t *cr, SkPaint paint) +{ + *cr->paint = paint; +} + +void +_cairo_skia_context_set_SkPath (cairo_t *cr, SkPath path) +{ + *cr->path = path; +} +#endif diff --git a/src/skia/cairo-skia-private.h b/src/skia/cairo-skia-private.h new file mode 100644 index 000000000..f538b486b --- /dev/null +++ b/src/skia/cairo-skia-private.h @@ -0,0 +1,127 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl D. Worth + */ + +#ifndef CAIRO_SKIA_CONTEXT_PRIVATE_H +#define CAIRO_SKIA_CONTEXT_PRIVATE_H + +#include "cairo-private.h" +#include "cairo-image-surface-private.h" + +#include +#include +#include +#include + +/** + * cairo_skia_context_t: + * + * A #cairo_skia_context_t includes handles to Skia's canvas, + * paint, and path objects along with the Cairo source surfaces + * and matrix, and the original and target #cairo_skia_surface_t + * objects. + * + * Since: 1.10 + **/ +typedef struct _cairo_skia_context cairo_skia_context_t; + +/** + * cairo_skia_surface_t: + * + * A #cairo_skia_surface_t is a container for the underlying + * #SkBitmap and the corresponding Cairo image surface. + * + * Since: 1.10 + **/ +typedef struct _cairo_skia_surface cairo_skia_surface_t; + +struct _cairo_skia_context { + cairo_t base; + + cairo_skia_surface_t *original; + cairo_skia_surface_t *target; + + cairo_matrix_t matrix; + + SkCanvas *canvas; + SkPaint *paint; + SkPath *path; + + cairo_surface_t *source; + cairo_image_surface_t *source_image; + void *source_extra; +}; + +struct _cairo_skia_surface { + cairo_image_surface_t image; + + SkBitmap *bitmap; +}; + +static inline bool +format_to_sk_config (cairo_format_t format, + SkBitmap::Config& config, + bool& opaque) +{ + opaque = false; + + switch (format) { + case CAIRO_FORMAT_ARGB32: + config = SkBitmap::kARGB_8888_Config; + break; + case CAIRO_FORMAT_RGB24: + config = SkBitmap::kARGB_8888_Config; + opaque = true; + break; + case CAIRO_FORMAT_RGB16_565: + config = SkBitmap::kRGB_565_Config; + opaque = true; + break; + case CAIRO_FORMAT_A8: + config = SkBitmap::kA8_Config; + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_A1: + default: + return false; + } + + return true; +} + +cairo_private cairo_t * +_cairo_skia_context_create (void *target); + +#endif /* CAIRO_SKIA_CONTEXT_PRIVATE_H */ diff --git a/src/skia/cairo-skia-surface.cpp b/src/skia/cairo-skia-surface.cpp new file mode 100644 index 000000000..834a2f13b --- /dev/null +++ b/src/skia/cairo-skia-surface.cpp @@ -0,0 +1,323 @@ +/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2007 Mozilla Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Mozilla Corporation. + * + * Contributor(s): + * Vladimir Vukicevic + */ + +#include "cairoint.h" + +#include "cairo-skia.h" +#include "cairo-skia-private.h" + +#include "cairo-composite-rectangles-private.h" +#include "cairo-error-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-fallback-private.h" + +static cairo_skia_surface_t * +_cairo_skia_surface_create_internal (SkBitmap::Config config, + bool opaque, + unsigned char *data, + int width, + int height, + int stride); + +static cairo_surface_t * +_cairo_skia_surface_create_similar (void *asurface, + cairo_content_t content, + int width, + int height) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + SkBitmap::Config config; + bool opaque; + + if (content == surface->image.base.content) + { + config = surface->bitmap->config (); + opaque = surface->bitmap->isOpaque (); + } + else if (! format_to_sk_config (_cairo_format_from_content (content), + config, opaque)) + { + return NULL; + } + + return &_cairo_skia_surface_create_internal (config, opaque, + NULL, + width, height, + 0)->image.base; +} + +static cairo_status_t +_cairo_skia_surface_finish (void *asurface) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + + cairo_surface_finish (&surface->image.base); + delete surface->bitmap; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_image_surface_t * +_cairo_skia_surface_map_to_image (void *asurface, + const cairo_rectangle_int_t *extents) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + + surface->bitmap->lockPixels (); + return _cairo_image_surface_map_to_image (&surface->image, extents); +} + +static cairo_int_status_t +_cairo_skia_surface_unmap_image (void *asurface, + cairo_image_surface_t *image) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + cairo_int_status_t status; + + status = _cairo_image_surface_unmap_image (&surface->image, image); + surface->bitmap->unlockPixels (); + + return status; +} + +static cairo_status_t +_cairo_skia_surface_acquire_source_image (void *asurface, + cairo_image_surface_t **image_out, + void **image_extra) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + + surface->bitmap->lockPixels (); + + *image_out = &surface->image; + *image_extra = NULL; + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_skia_surface_release_source_image (void *asurface, + cairo_image_surface_t *image, + void *image_extra) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + + surface->bitmap->unlockPixels (); +} + +static cairo_bool_t +_cairo_skia_surface_get_extents (void *asurface, + cairo_rectangle_int_t *extents) +{ + cairo_skia_surface_t *surface = (cairo_skia_surface_t *) asurface; + extents->x = extents->y = 0; + extents->width = surface->image.width; + extents->height = surface->image.height; + return TRUE; +} + +static void +_cairo_skia_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_ON); +} + +static const struct _cairo_surface_backend +cairo_skia_surface_backend = { + CAIRO_SURFACE_TYPE_SKIA, + _cairo_skia_surface_finish, + + _cairo_skia_context_create, + + _cairo_skia_surface_create_similar, + NULL, //_cairo_skia_surface_create_similar_image, + _cairo_skia_surface_map_to_image, + _cairo_skia_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_skia_surface_acquire_source_image, + _cairo_skia_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_skia_surface_get_extents, + _cairo_skia_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + /* XXX native surface functions? */ + _cairo_surface_fallback_paint, + _cairo_surface_fallback_mask, + _cairo_surface_fallback_stroke, + _cairo_surface_fallback_fill, + NULL, /* fill/stroke */ + _cairo_surface_fallback_glyphs +}; + +/* + * Surface constructors + */ + +static inline pixman_format_code_t +sk_config_to_pixman_format_code (SkBitmap::Config config, + bool opaque) +{ + switch (config) { + case SkBitmap::kARGB_8888_Config: + return opaque ? PIXMAN_x8r8g8b8 : PIXMAN_a8r8g8b8; + + case SkBitmap::kA8_Config: + return PIXMAN_a8; + case SkBitmap::kRGB_565_Config: + return PIXMAN_r5g6b5; + case SkBitmap::kARGB_4444_Config: + return PIXMAN_a4r4g4b4; + + case SkBitmap::kNo_Config: + case SkBitmap::kIndex8_Config: + default: + ASSERT_NOT_REACHED; + return (pixman_format_code_t) -1; + } +} + +static cairo_skia_surface_t * +_cairo_skia_surface_create_internal (SkBitmap::Config config, + bool opaque, + unsigned char *data, + int width, + int height, + int stride) +{ + cairo_skia_surface_t *surface; + pixman_image_t *pixman_image; + pixman_format_code_t pixman_format; + SkColorType colorType; + + surface = (cairo_skia_surface_t *) malloc (sizeof (cairo_skia_surface_t)); + if (unlikely (surface == NULL)) + return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + pixman_format = sk_config_to_pixman_format_code (config, opaque); + pixman_image = pixman_image_create_bits (pixman_format, + width, height, + (uint32_t *) data, stride); + if (unlikely (pixman_image == NULL)) { + free (surface); + return (cairo_skia_surface_t *) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + _cairo_surface_init (&surface->image.base, + &cairo_skia_surface_backend, + NULL, /* device */ + _cairo_content_from_pixman_format (pixman_format)); + + _cairo_image_surface_init (&surface->image, pixman_image, pixman_format); + + surface->bitmap = new SkBitmap; + colorType = SkBitmapConfigToColorType(config); + surface->bitmap->setAlphaType (opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); + surface->bitmap->setInfo (SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType), surface->image.stride); + surface->bitmap->setPixels (surface->image.data); + + surface->image.base.is_clear = data == NULL; + + return surface; +} + +cairo_surface_t * +cairo_skia_surface_create (cairo_format_t format, + int width, + int height) +{ + SkBitmap::Config config; + bool opaque; + + if (! CAIRO_FORMAT_VALID (format) || + ! format_to_sk_config (format, config, opaque)) + { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + return &_cairo_skia_surface_create_internal (config, opaque, NULL, width, height, 0)->image.base; +} + +cairo_surface_t * +cairo_skia_surface_create_for_data (unsigned char *data, + cairo_format_t format, + int width, + int height, + int stride) +{ + SkBitmap::Config config; + bool opaque; + + if (! CAIRO_FORMAT_VALID (format) || + ! format_to_sk_config (format, config, opaque)) + { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + } + + return &_cairo_skia_surface_create_internal (config, opaque, data, width, height, stride)->image.base; +} + +/*** + +Todo: + +*** Skia: + +- mask() + +*** Sk: + +High: +- antialiased clipping? + +Medium: +- implement clip path reset (to avoid restore/save) +- implement complex radial patterns (2 centers and 2 radii) + +Low: +- implement EXTEND_NONE + +***/ diff --git a/src/test-base-compositor-surface.c b/src/test-base-compositor-surface.c new file mode 100644 index 000000000..ff84b10af --- /dev/null +++ b/src/test-base-compositor-surface.c @@ -0,0 +1,824 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2002 University of Southern California + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Joonas Pihlaja + * Chris Wilson + */ + +#include "cairoint.h" + +#include "test-compositor-surface-private.h" + +#include "cairo-clip-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-region-private.h" +#include "cairo-traps-private.h" + +/* The intention is that this is a surface that just works, and most + * important of all does not try to be clever! + */ + +typedef cairo_int_status_t +(*draw_func_t) (cairo_image_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents); + +static pixman_op_t +_pixman_operator (cairo_operator_t op) +{ + switch ((int) op) { + case CAIRO_OPERATOR_CLEAR: + return PIXMAN_OP_CLEAR; + + case CAIRO_OPERATOR_SOURCE: + return PIXMAN_OP_SRC; + case CAIRO_OPERATOR_OVER: + return PIXMAN_OP_OVER; + case CAIRO_OPERATOR_IN: + return PIXMAN_OP_IN; + case CAIRO_OPERATOR_OUT: + return PIXMAN_OP_OUT; + case CAIRO_OPERATOR_ATOP: + return PIXMAN_OP_ATOP; + + case CAIRO_OPERATOR_DEST: + return PIXMAN_OP_DST; + case CAIRO_OPERATOR_DEST_OVER: + return PIXMAN_OP_OVER_REVERSE; + case CAIRO_OPERATOR_DEST_IN: + return PIXMAN_OP_IN_REVERSE; + case CAIRO_OPERATOR_DEST_OUT: + return PIXMAN_OP_OUT_REVERSE; + case CAIRO_OPERATOR_DEST_ATOP: + return PIXMAN_OP_ATOP_REVERSE; + + case CAIRO_OPERATOR_XOR: + return PIXMAN_OP_XOR; + case CAIRO_OPERATOR_ADD: + return PIXMAN_OP_ADD; + case CAIRO_OPERATOR_SATURATE: + return PIXMAN_OP_SATURATE; + + case CAIRO_OPERATOR_MULTIPLY: + return PIXMAN_OP_MULTIPLY; + case CAIRO_OPERATOR_SCREEN: + return PIXMAN_OP_SCREEN; + case CAIRO_OPERATOR_OVERLAY: + return PIXMAN_OP_OVERLAY; + case CAIRO_OPERATOR_DARKEN: + return PIXMAN_OP_DARKEN; + case CAIRO_OPERATOR_LIGHTEN: + return PIXMAN_OP_LIGHTEN; + case CAIRO_OPERATOR_COLOR_DODGE: + return PIXMAN_OP_COLOR_DODGE; + case CAIRO_OPERATOR_COLOR_BURN: + return PIXMAN_OP_COLOR_BURN; + case CAIRO_OPERATOR_HARD_LIGHT: + return PIXMAN_OP_HARD_LIGHT; + case CAIRO_OPERATOR_SOFT_LIGHT: + return PIXMAN_OP_SOFT_LIGHT; + case CAIRO_OPERATOR_DIFFERENCE: + return PIXMAN_OP_DIFFERENCE; + case CAIRO_OPERATOR_EXCLUSION: + return PIXMAN_OP_EXCLUSION; + case CAIRO_OPERATOR_HSL_HUE: + return PIXMAN_OP_HSL_HUE; + case CAIRO_OPERATOR_HSL_SATURATION: + return PIXMAN_OP_HSL_SATURATION; + case CAIRO_OPERATOR_HSL_COLOR: + return PIXMAN_OP_HSL_COLOR; + case CAIRO_OPERATOR_HSL_LUMINOSITY: + return PIXMAN_OP_HSL_LUMINOSITY; + + default: + ASSERT_NOT_REACHED; + return PIXMAN_OP_OVER; + } +} + +static cairo_image_surface_t * +create_composite_mask (cairo_image_surface_t *dst, + void *draw_closure, + draw_func_t draw_func, + const cairo_composite_rectangles_t *extents) +{ + cairo_image_surface_t *surface; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + surface = (cairo_image_surface_t *) + _cairo_image_surface_create_with_pixman_format (NULL, PIXMAN_a8, + extents->bounded.width, + extents->bounded.height, + 0); + if (unlikely (surface->base.status)) + return surface; + + status = draw_func (surface, draw_closure, + CAIRO_OPERATOR_ADD, &_cairo_pattern_white.base, + extents->bounded.x, extents->bounded.y, + &extents->bounded); + if (unlikely (status)) + goto error; + + status = _cairo_clip_combine_with_surface (extents->clip, + &surface->base, + extents->bounded.x, + extents->bounded.y); + if (unlikely (status)) + goto error; + + return surface; + +error: + cairo_surface_destroy (&surface->base); + return (cairo_image_surface_t *)_cairo_surface_create_in_error (status); +} + +/* Handles compositing with a clip surface when the operator allows + * us to combine the clip with the mask + */ +static cairo_status_t +clip_and_composite_with_mask (const cairo_composite_rectangles_t*extents, + draw_func_t draw_func, + void *draw_closure) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *)extents->surface; + cairo_image_surface_t *mask; + pixman_image_t *src; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + int src_x, src_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + mask = create_composite_mask (dst, draw_closure, draw_func, extents); + if (unlikely (mask->base.status)) + return mask->base.status; + + src = _pixman_image_for_pattern (dst, + &extents->source_pattern.base, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (unlikely (src == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto error; + } + + pixman_image_composite32 (_pixman_operator (extents->op), + src, mask->pixman_image, dst->pixman_image, + extents->bounded.x + src_x, + extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + pixman_image_unref (src); +error: + cairo_surface_destroy (&mask->base); + return status; +} + +/* Handles compositing with a clip surface when we have to do the operation + * in two pieces and combine them together. + */ +static cairo_status_t +clip_and_composite_combine (const cairo_composite_rectangles_t*extents, + draw_func_t draw_func, + void *draw_closure) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *)extents->surface; + cairo_image_surface_t *tmp, *clip; + int clip_x, clip_y; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + tmp = (cairo_image_surface_t *) + _cairo_image_surface_create_with_pixman_format (NULL, + dst->pixman_format, + extents->bounded.width, + extents->bounded.height, + 0); + if (unlikely (tmp->base.status)) + return tmp->base.status; + + pixman_image_composite32 (PIXMAN_OP_SRC, + dst->pixman_image, NULL, tmp->pixman_image, + extents->bounded.x, extents->bounded.y, + 0, 0, + 0, 0, + extents->bounded.width, extents->bounded.height); + + status = draw_func (tmp, draw_closure, + extents->op, &extents->source_pattern.base, + extents->bounded.x, extents->bounded.y, + &extents->bounded); + if (unlikely (status)) + goto error; + + clip = (cairo_image_surface_t *) + _cairo_clip_get_surface (extents->clip, &dst->base, &clip_x, &clip_y); + if (unlikely (clip->base.status)) + goto error; + + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + clip->pixman_image, NULL, dst->pixman_image, + extents->bounded.x - clip_x, extents->bounded.y - clip_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + pixman_image_composite32 (PIXMAN_OP_ADD, + tmp->pixman_image, clip->pixman_image, dst->pixman_image, + 0, 0, + extents->bounded.x - clip_x, extents->bounded.y - clip_y, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + cairo_surface_destroy (&clip->base); + + error: + cairo_surface_destroy (&tmp->base); + + return status; +} + +/* Handles compositing for %CAIRO_OPERATOR_SOURCE, which is special; it's + * defined as (src IN mask IN clip) ADD (dst OUT (mask IN clip)) + */ +static cairo_status_t +clip_and_composite_source (const cairo_composite_rectangles_t *extents, + draw_func_t draw_func, + void *draw_closure) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *)extents->surface; + cairo_image_surface_t *mask; + pixman_image_t *src; + int src_x, src_y; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + mask = create_composite_mask (dst, draw_closure, draw_func, extents); + if (unlikely (mask->base.status)) + return mask->base.status; + + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + mask->pixman_image, NULL, dst->pixman_image, + 0, 0, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + src = _pixman_image_for_pattern (dst, + &extents->source_pattern.base, FALSE, + &extents->bounded, + &extents->source_sample_area, + &src_x, &src_y); + if (unlikely (src == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto error; + } + + pixman_image_composite32 (PIXMAN_OP_ADD, + src, mask->pixman_image, dst->pixman_image, + extents->bounded.x + src_x, extents->bounded.y + src_y, + 0, 0, + extents->bounded.x, extents->bounded.y, + extents->bounded.width, extents->bounded.height); + + pixman_image_unref (src); + +error: + cairo_surface_destroy (&mask->base); + return status; +} + +static cairo_status_t +fixup_unbounded (const cairo_composite_rectangles_t *extents) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *)extents->surface; + pixman_image_t *mask; + int mask_x, mask_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if (! _cairo_clip_is_region (extents->clip)) { + cairo_image_surface_t *clip; + + clip = (cairo_image_surface_t *) + _cairo_clip_get_surface (extents->clip, &dst->base, + &mask_x, &mask_y); + if (unlikely (clip->base.status)) + return clip->base.status; + + mask = pixman_image_ref (clip->pixman_image); + cairo_surface_destroy (&clip->base); + } else { + mask_x = mask_y = 0; + mask = _pixman_image_for_color (CAIRO_COLOR_WHITE); + if (unlikely (mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + int x = extents->unbounded.x; + int y = extents->unbounded.y; + int width = extents->unbounded.width; + int height = extents->bounded.y - y; + + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + mask, NULL, dst->pixman_image, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + int x = extents->unbounded.x; + int y = extents->bounded.y; + int width = extents->bounded.x - x; + int height = extents->bounded.height; + + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + mask, NULL, dst->pixman_image, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + int x = extents->bounded.x + extents->bounded.width; + int y = extents->bounded.y; + int width = extents->unbounded.x + extents->unbounded.width - x; + int height = extents->bounded.height; + + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + mask, NULL, dst->pixman_image, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + int x = extents->unbounded.x; + int y = extents->bounded.y + extents->bounded.height; + int width = extents->unbounded.width; + int height = extents->unbounded.y + extents->unbounded.height - y; + + pixman_image_composite32 (PIXMAN_OP_OUT_REVERSE, + mask, NULL, dst->pixman_image, + x - mask_x, y - mask_y, + 0, 0, + x, y, + width, height); + } + + pixman_image_unref (mask); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +set_clip_region (cairo_composite_rectangles_t *extents) +{ + cairo_image_surface_t *dst = (cairo_image_surface_t *) extents->surface; + cairo_region_t *region = _cairo_clip_get_region (extents->clip); + pixman_region32_t *rgn = region ? ®ion->rgn : NULL; + if (! pixman_image_set_clip_region32 (dst->pixman_image, rgn)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +clip_and_composite (cairo_composite_rectangles_t *extents, + draw_func_t draw_func, + void *draw_closure) +{ + cairo_status_t status; + + status = set_clip_region (extents); + if (unlikely (status)) + return status; + + if (extents->op == CAIRO_OPERATOR_SOURCE) { + status = clip_and_composite_source (extents, draw_func, draw_closure); + } else { + if (extents->op == CAIRO_OPERATOR_CLEAR) { + extents->source_pattern.solid = _cairo_pattern_white; + extents->op = CAIRO_OPERATOR_DEST_OUT; + } + if (! _cairo_clip_is_region (extents->clip)) { + if (extents->is_bounded) + status = clip_and_composite_with_mask (extents, draw_func, draw_closure); + else + status = clip_and_composite_combine (extents, draw_func, draw_closure); + } else { + status = draw_func ((cairo_image_surface_t *) extents->surface, + draw_closure, + extents->op, + &extents->source_pattern.base, + 0, 0, + &extents->bounded); + } + } + + if (status == CAIRO_STATUS_SUCCESS && ! extents->is_bounded) + status = fixup_unbounded (extents); + + return status; +} + +/* high-level compositor interface */ + +static cairo_int_status_t +composite_paint (cairo_image_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents) +{ + cairo_rectangle_int_t sample; + pixman_image_t *src; + int src_x, src_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + _cairo_pattern_sampled_area (pattern, extents, &sample); + src = _pixman_image_for_pattern (dst, + pattern, FALSE, + extents, &sample, + &src_x, &src_y); + if (unlikely (src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + TRACE ((stderr, "%s: src=(%d, %d), dst=(%d, %d) size=%dx%d\n", __FUNCTION__, + extents->x + src_x, extents->y + src_y, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height)); + + pixman_image_composite32 (_pixman_operator (op), + src, NULL, dst->pixman_image, + extents->x + src_x, extents->y + src_y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + pixman_image_unref (src); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +base_compositor_paint (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + TRACE ((stderr, "%s\n", __FUNCTION__)); + return clip_and_composite (extents, composite_paint, NULL); +} + +static cairo_int_status_t +composite_mask (cairo_image_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents) +{ + cairo_rectangle_int_t sample; + pixman_image_t *src, *mask; + int src_x, src_y; + int mask_x, mask_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + _cairo_pattern_sampled_area (pattern, extents, &sample); + src = _pixman_image_for_pattern (dst, pattern, FALSE, + extents, &sample, + &src_x, &src_y); + if (unlikely (src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + _cairo_pattern_sampled_area (closure, extents, &sample); + mask = _pixman_image_for_pattern (dst, closure, TRUE, + extents, &sample, + &mask_x, &mask_y); + if (unlikely (mask == NULL)) { + pixman_image_unref (src); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + pixman_image_composite32 (_pixman_operator (op), + src, mask, dst->pixman_image, + extents->x + src_x, extents->y + src_y, + extents->x + mask_x, extents->y + mask_y, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + pixman_image_unref (mask); + pixman_image_unref (src); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +base_compositor_mask (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents) +{ + TRACE ((stderr, "%s\n", __FUNCTION__)); + return clip_and_composite (extents, composite_mask, &extents->mask_pattern.base); +} + +typedef struct { + cairo_traps_t traps; + cairo_antialias_t antialias; +} composite_traps_info_t; + +static cairo_int_status_t +composite_traps (cairo_image_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents) +{ + composite_traps_info_t *info = closure; + cairo_rectangle_int_t sample; + pixman_image_t *src, *mask; + int src_x, src_y; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + _cairo_pattern_sampled_area (pattern, extents, &sample); + src = _pixman_image_for_pattern (dst, pattern, FALSE, + extents, &sample, + &src_x, &src_y); + if (unlikely (src == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + mask = pixman_image_create_bits (info->antialias == CAIRO_ANTIALIAS_NONE ? PIXMAN_a1 : PIXMAN_a8, + extents->width, extents->height, + NULL, 0); + if (unlikely (mask == NULL)) { + pixman_image_unref (src); + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + + _pixman_image_add_traps (mask, extents->x, extents->y, &info->traps); + pixman_image_composite32 (_pixman_operator (op), + src, mask, dst->pixman_image, + extents->x + src_x - dst_x, extents->y + src_y - dst_y, + 0, 0, + extents->x - dst_x, extents->y - dst_y, + extents->width, extents->height); + + pixman_image_unref (mask); + pixman_image_unref (src); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +trim_extents_to_traps (cairo_composite_rectangles_t *extents, + cairo_traps_t *traps) +{ + cairo_box_t box; + + /* X trims the affected area to the extents of the trapezoids, so + * we need to compensate when fixing up the unbounded area. + */ + _cairo_traps_extents (traps, &box); + return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); +} + +static cairo_int_status_t +base_compositor_stroke (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + composite_traps_info_t info; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + info.antialias = antialias; + _cairo_traps_init_with_clip (&info.traps, extents->clip); + status = _cairo_path_fixed_stroke_polygon_to_traps (path, style, + ctm, ctm_inverse, + tolerance, + &info.traps); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = trim_extents_to_traps (extents, &info.traps); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite (extents, composite_traps, &info); + _cairo_traps_fini (&info.traps); + + return status; +} + +static cairo_int_status_t +base_compositor_fill (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + composite_traps_info_t info; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + info.antialias = antialias; + _cairo_traps_init_with_clip (&info.traps, extents->clip); + status = _cairo_path_fixed_fill_to_traps (path, + fill_rule, tolerance, + &info.traps); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = trim_extents_to_traps (extents, &info.traps); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = clip_and_composite (extents, composite_traps, &info); + _cairo_traps_fini (&info.traps); + + return status; +} + +static cairo_int_status_t +composite_glyphs (cairo_image_surface_t *dst, + void *closure, + cairo_operator_t op, + const cairo_pattern_t *pattern, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents) +{ + cairo_composite_glyphs_info_t *info = closure; + pixman_image_t *mask; + cairo_status_t status; + int i; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + mask = pixman_image_create_bits (PIXMAN_a8, + extents->width, extents->height, + NULL, 0); + if (unlikely (mask == NULL)) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + status = CAIRO_STATUS_SUCCESS; + _cairo_scaled_font_freeze_cache (info->font); + for (i = 0; i < info->num_glyphs; i++) { + cairo_image_surface_t *glyph_surface; + cairo_scaled_glyph_t *scaled_glyph; + unsigned long glyph_index = info->glyphs[i].index; + int x, y; + + status = _cairo_scaled_glyph_lookup (info->font, glyph_index, + CAIRO_SCALED_GLYPH_INFO_SURFACE, + &scaled_glyph); + + if (unlikely (status)) + break; + + glyph_surface = scaled_glyph->surface; + if (glyph_surface->width && glyph_surface->height) { + /* round glyph locations to the nearest pixel */ + /* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */ + x = _cairo_lround (info->glyphs[i].x - + glyph_surface->base.device_transform.x0); + y = _cairo_lround (info->glyphs[i].y - + glyph_surface->base.device_transform.y0); + + pixman_image_composite32 (PIXMAN_OP_ADD, + glyph_surface->pixman_image, NULL, mask, + 0, 0, + 0, 0, + x - extents->x, y - extents->y, + glyph_surface->width, + glyph_surface->height); + } + } + _cairo_scaled_font_thaw_cache (info->font); + + if (status == CAIRO_STATUS_SUCCESS) { + cairo_rectangle_int_t sample; + pixman_image_t *src; + int src_x, src_y; + + _cairo_pattern_sampled_area (pattern, extents, &sample); + src = _pixman_image_for_pattern (dst, pattern, FALSE, + extents, &sample, + &src_x, &src_y); + if (src != NULL) { + dst_x = extents->x - dst_x; + dst_y = extents->y - dst_y; + pixman_image_composite32 (_pixman_operator (op), + src, mask, dst->pixman_image, + src_x + dst_x, src_y + dst_y, + 0, 0, + dst_x, dst_y, + extents->width, extents->height); + pixman_image_unref (src); + } else + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + } + pixman_image_unref (mask); + + return status; +} + +static cairo_int_status_t +base_compositor_glyphs (const cairo_compositor_t *_compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_composite_glyphs_info_t info; + + info.font = scaled_font; + info.glyphs = glyphs; + info.num_glyphs = num_glyphs; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + return clip_and_composite (extents, composite_glyphs, &info); +} + +static const cairo_compositor_t base_compositor = { + &__cairo_no_compositor, + + base_compositor_paint, + base_compositor_mask, + base_compositor_stroke, + base_compositor_fill, + base_compositor_glyphs, +}; + +cairo_surface_t * +_cairo_test_base_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (&base_compositor, + content, width, height); +} diff --git a/src/test-compositor-surface-private.h b/src/test-compositor-surface-private.h new file mode 100644 index 000000000..491f241ba --- /dev/null +++ b/src/test-compositor-surface-private.h @@ -0,0 +1,56 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef TEST_COMPOSITOR_SURFACE_PRIVATE_H +#define TEST_COMPOSITOR_SURFACE_PRIVATE_H + +#include "cairo.h" + +#include "test-compositor-surface.h" + +#include "cairo-compiler-private.h" +#include "cairo-compositor-private.h" + +CAIRO_BEGIN_DECLS + +cairo_private cairo_surface_t * +test_compositor_surface_create (const cairo_compositor_t *compositor, + cairo_content_t content, + int width, + int height); + +CAIRO_END_DECLS + +#endif /* TEST_COMPOSITOR_SURFACE_PRIVATE H */ diff --git a/src/test-compositor-surface.c b/src/test-compositor-surface.c new file mode 100644 index 000000000..1cc5f6921 --- /dev/null +++ b/src/test-compositor-surface.c @@ -0,0 +1,264 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairoint.h" + +#include "test-compositor-surface-private.h" + +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-backend-private.h" + +typedef struct _test_compositor_surface { + cairo_image_surface_t base; +} test_compositor_surface_t; + +static const cairo_surface_backend_t test_compositor_surface_backend; + +cairo_surface_t * +test_compositor_surface_create (const cairo_compositor_t *compositor, + cairo_content_t content, + int width, + int height) +{ + test_compositor_surface_t *surface; + pixman_image_t *pixman_image; + pixman_format_code_t pixman_format; + + switch (content) { + case CAIRO_CONTENT_ALPHA: + pixman_format = PIXMAN_a8; + break; + case CAIRO_CONTENT_COLOR: + pixman_format = PIXMAN_x8r8g8b8; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + pixman_format = PIXMAN_a8r8g8b8; + break; + default: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); + } + + pixman_image = pixman_image_create_bits (pixman_format, width, height, + NULL, 0); + if (unlikely (pixman_image == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface = malloc (sizeof (test_compositor_surface_t)); + if (unlikely (surface == NULL)) { + pixman_image_unref (pixman_image); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + _cairo_surface_init (&surface->base.base, + &test_compositor_surface_backend, + NULL, /* device */ + content); + _cairo_image_surface_init (&surface->base, pixman_image, pixman_format); + + surface->base.compositor = compositor; + + return &surface->base.base; +} + +static cairo_surface_t * +test_compositor_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + test_compositor_surface_t *surface = abstract_surface; + + return test_compositor_surface_create (surface->base.compositor, + content, width, height); +} + +static cairo_int_status_t +test_compositor_surface_paint (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_paint (surface->base.compositor, + _surface, op, source, + clip); +} + +static cairo_int_status_t +test_compositor_surface_mask (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_mask (surface->base.compositor, + _surface, op, source, mask, + clip); +} + +static cairo_int_status_t +test_compositor_surface_stroke (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + if (antialias == CAIRO_ANTIALIAS_DEFAULT) + antialias = CAIRO_ANTIALIAS_BEST; + return _cairo_compositor_stroke (surface->base.compositor, + _surface, op, source, + path, style, ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +test_compositor_surface_fill (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + if (antialias == CAIRO_ANTIALIAS_DEFAULT) + antialias = CAIRO_ANTIALIAS_BEST; + return _cairo_compositor_fill (surface->base.compositor, + _surface, op, source, + path, fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +test_compositor_surface_glyphs (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_glyphs (surface->base.compositor, + _surface, op, source, + glyphs, num_glyphs, scaled_font, + clip); +} + +static const cairo_surface_backend_t test_compositor_surface_backend = { + CAIRO_SURFACE_TYPE_IMAGE, + _cairo_image_surface_finish, + _cairo_default_context_create, + + test_compositor_surface_create_similar, + NULL, /* create similar image */ + _cairo_image_surface_map_to_image, + _cairo_image_surface_unmap_image, + + _cairo_image_surface_source, + _cairo_image_surface_acquire_source_image, + _cairo_image_surface_release_source_image, + _cairo_image_surface_snapshot, + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_image_surface_get_extents, + _cairo_image_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + test_compositor_surface_paint, + test_compositor_surface_mask, + test_compositor_surface_stroke, + test_compositor_surface_fill, + NULL, /* fill/stroke */ + test_compositor_surface_glyphs, +}; + +static const cairo_compositor_t * +get_fallback_compositor (void) +{ + return &_cairo_fallback_compositor; +} + +cairo_surface_t * +_cairo_test_fallback_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (get_fallback_compositor(), + content, width, height); +} + +cairo_surface_t * +_cairo_test_mask_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (_cairo_image_mask_compositor_get(), + content, width, height); +} + +cairo_surface_t * +_cairo_test_traps_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (_cairo_image_traps_compositor_get(), + content, width, height); +} + +cairo_surface_t * +_cairo_test_spans_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (_cairo_image_spans_compositor_get(), + content, width, height); +} diff --git a/src/test-compositor-surface.h b/src/test-compositor-surface.h new file mode 100644 index 000000000..8d8af2d54 --- /dev/null +++ b/src/test-compositor-surface.h @@ -0,0 +1,71 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef TEST_COMPOSITOR_SURFACE_H +#define TEST_COMPOSITOR_SURFACE_H + +#include "cairo.h" + +CAIRO_BEGIN_DECLS + +cairo_surface_t * +_cairo_test_fallback_compositor_surface_create (cairo_content_t content, + int width, + int height); + + +cairo_surface_t * +_cairo_test_mask_compositor_surface_create (cairo_content_t content, + int width, + int height); + +cairo_surface_t * +_cairo_test_traps_compositor_surface_create (cairo_content_t content, + int width, + int height); + +cairo_surface_t * +_cairo_test_spans_compositor_surface_create (cairo_content_t content, + int width, + int height); + +cairo_surface_t * +_cairo_test_base_compositor_surface_create (cairo_content_t content, + int width, + int height); + +CAIRO_END_DECLS + +#endif /* TEST_COMPOSITOR_SURFACE_H */ diff --git a/src/test-null-compositor-surface.c b/src/test-null-compositor-surface.c new file mode 100644 index 000000000..2301055e3 --- /dev/null +++ b/src/test-null-compositor-surface.c @@ -0,0 +1,480 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + + +#include "cairoint.h" + +#include "test-null-compositor-surface.h" + +#include "cairo-compositor-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-spans-compositor-private.h" +#include "cairo-spans-private.h" + +typedef struct _test_compositor_surface { + cairo_image_surface_t base; +} test_compositor_surface_t; + +static const cairo_surface_backend_t test_compositor_surface_backend; + +static cairo_surface_t * +test_compositor_surface_create (const cairo_compositor_t *compositor, + cairo_content_t content, + int width, + int height) +{ + test_compositor_surface_t *surface; + pixman_image_t *pixman_image; + pixman_format_code_t pixman_format; + + switch (content) { + case CAIRO_CONTENT_ALPHA: + pixman_format = PIXMAN_a8; + break; + case CAIRO_CONTENT_COLOR: + pixman_format = PIXMAN_x8r8g8b8; + break; + case CAIRO_CONTENT_COLOR_ALPHA: + pixman_format = PIXMAN_a8r8g8b8; + break; + default: + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); + } + + pixman_image = pixman_image_create_bits (pixman_format, width, height, + NULL, 0); + if (unlikely (pixman_image == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface = malloc (sizeof (test_compositor_surface_t)); + if (unlikely (surface == NULL)) { + pixman_image_unref (pixman_image); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + _cairo_surface_init (&surface->base.base, + &test_compositor_surface_backend, + NULL, /* device */ + content); + _cairo_image_surface_init (&surface->base, pixman_image, pixman_format); + + surface->base.compositor = compositor; + + return &surface->base.base; +} + +static cairo_surface_t * +test_compositor_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + test_compositor_surface_t *surface = abstract_surface; + + return test_compositor_surface_create (surface->base.compositor, + content, width, height); +} + +static cairo_int_status_t +test_compositor_surface_paint (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_paint (surface->base.compositor, + _surface, op, source, + clip); +} + +static cairo_int_status_t +test_compositor_surface_mask (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_mask (surface->base.compositor, + _surface, op, source, mask, + clip); +} + +static cairo_int_status_t +test_compositor_surface_stroke (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_stroke (surface->base.compositor, + _surface, op, source, + path, style, ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +test_compositor_surface_fill (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_fill (surface->base.compositor, + _surface, op, source, + path, fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +test_compositor_surface_glyphs (void *_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + test_compositor_surface_t *surface = _surface; + return _cairo_compositor_glyphs (surface->base.compositor, + _surface, op, source, + glyphs, num_glyphs, scaled_font, + clip); +} + +static const cairo_surface_backend_t test_compositor_surface_backend = { + CAIRO_SURFACE_TYPE_IMAGE, + _cairo_image_surface_finish, + _cairo_default_context_create, + + test_compositor_surface_create_similar, + NULL, /* create similar image */ + _cairo_image_surface_map_to_image, + _cairo_image_surface_unmap_image, + + _cairo_image_surface_source, + _cairo_image_surface_acquire_source_image, + _cairo_image_surface_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_image_surface_get_extents, + _cairo_image_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + test_compositor_surface_paint, + test_compositor_surface_mask, + test_compositor_surface_stroke, + test_compositor_surface_fill, + NULL, /* fill/stroke */ + test_compositor_surface_glyphs, +}; + +static cairo_int_status_t +acquire (void *abstract_dst) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +release (void *abstract_dst) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +set_clip_region (void *_surface, + cairo_region_t *region) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +pattern_to_surface (cairo_surface_t *dst, + const cairo_pattern_t *pattern, + cairo_bool_t is_mask, + const cairo_rectangle_int_t *extents, + const cairo_rectangle_int_t *sample, + int *src_x, int *src_y) +{ + return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); +} + +static cairo_int_status_t +fill_boxes (void *_dst, + cairo_operator_t op, + const cairo_color_t *color, + cairo_boxes_t *boxes) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +draw_image_boxes (void *_dst, + cairo_image_surface_t *image, + cairo_boxes_t *boxes, + int dx, int dy) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +lerp (void *_dst, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_boxes (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + cairo_surface_t *abstract_mask, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + cairo_boxes_t *boxes, + const cairo_rectangle_int_t *extents) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_traps (void *_dst, + cairo_operator_t op, + cairo_surface_t *abstract_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + const cairo_rectangle_int_t *extents, + cairo_antialias_t antialias, + cairo_traps_t *traps) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +check_composite_glyphs (const cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int *num_glyphs) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +composite_glyphs (void *_dst, + cairo_operator_t op, + cairo_surface_t *_src, + int src_x, + int src_y, + int dst_x, + int dst_y, + cairo_composite_glyphs_info_t *info) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +spans (void *abstract_renderer, + int y, int height, + const cairo_half_open_span_t *spans, + unsigned num_spans) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +finish_spans (void *abstract_renderer) +{ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +span_renderer_init (cairo_abstract_span_renderer_t *_r, + const cairo_composite_rectangles_t *composite, + cairo_antialias_t antialias, + cairo_bool_t needs_clip) +{ + cairo_span_renderer_t *r = (cairo_span_renderer_t *)_r; + r->render_rows = spans; + r->finish = finish_spans; + return CAIRO_STATUS_SUCCESS; +} + +static void +span_renderer_fini (cairo_abstract_span_renderer_t *_r, + cairo_int_status_t status) +{ +} + +static const cairo_compositor_t * +no_fallback_compositor_get (void) +{ + return &__cairo_no_compositor; +} + +static cairo_int_status_t +check_composite (const cairo_composite_rectangles_t *extents) +{ + return CAIRO_STATUS_SUCCESS; +} + +static const cairo_compositor_t * +no_traps_compositor_get (void) +{ + static cairo_traps_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_traps_compositor_init (&compositor, + no_fallback_compositor_get ()); + + compositor.acquire = acquire; + compositor.release = release; + compositor.set_clip_region = set_clip_region; + compositor.pattern_to_surface = pattern_to_surface; + compositor.draw_image_boxes = draw_image_boxes; + //compositor.copy_boxes = copy_boxes; + compositor.fill_boxes = fill_boxes; + compositor.check_composite = check_composite; + compositor.composite = composite; + compositor.lerp = lerp; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + //compositor.check_composite_traps = check_composite_traps; + compositor.composite_traps = composite_traps; + compositor.check_composite_glyphs = check_composite_glyphs; + compositor.composite_glyphs = composite_glyphs; + } + + return &compositor.base; +} + +static const cairo_compositor_t * +no_spans_compositor_get (void) +{ + static cairo_spans_compositor_t compositor; + + if (compositor.base.delegate == NULL) { + _cairo_spans_compositor_init (&compositor, + no_traps_compositor_get()); + + //compositor.acquire = acquire; + //compositor.release = release; + compositor.fill_boxes = fill_boxes; + //compositor.check_composite_boxes = check_composite_boxes; + compositor.composite_boxes = composite_boxes; + //compositor.check_span_renderer = check_span_renderer; + compositor.renderer_init = span_renderer_init; + compositor.renderer_fini = span_renderer_fini; + } + + return &compositor.base; +} + +cairo_surface_t * +_cairo_test_no_fallback_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (no_fallback_compositor_get(), + content, width, height); +} + +cairo_surface_t * +_cairo_test_no_traps_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (no_traps_compositor_get(), + content, width, height); +} + +cairo_surface_t * +_cairo_test_no_spans_compositor_surface_create (cairo_content_t content, + int width, + int height) +{ + return test_compositor_surface_create (no_spans_compositor_get(), + content, width, height); +} diff --git a/src/test-null-compositor-surface.h b/src/test-null-compositor-surface.h new file mode 100644 index 000000000..52d864b28 --- /dev/null +++ b/src/test-null-compositor-surface.h @@ -0,0 +1,60 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2011 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Intel Corporation + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef TEST_NULL_COMPOSITOR_SURFACE_H +#define TEST_NULL_COMPOSITOR_SURFACE_H + +#include "cairo.h" + +CAIRO_BEGIN_DECLS + +cairo_surface_t * +_cairo_test_no_fallback_compositor_surface_create (cairo_content_t content, + int width, + int height); + +cairo_surface_t * +_cairo_test_no_traps_compositor_surface_create (cairo_content_t content, + int width, + int height); + +cairo_surface_t * +_cairo_test_no_spans_compositor_surface_create (cairo_content_t content, + int width, + int height); + +CAIRO_END_DECLS + +#endif /* TEST_NULL_COMPOSITOR_SURFACE_H */ diff --git a/src/test-paginated-surface.c b/src/test-paginated-surface.c new file mode 100644 index 000000000..0a7c79b37 --- /dev/null +++ b/src/test-paginated-surface.c @@ -0,0 +1,286 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + */ + +/* This isn't a "real" surface, but just something to be used by the + * test suite to help exercise the paginated-surface paths in cairo. + * + * The defining feature of this backend is that it uses a paginated + * surface to record all operations, and then replays everything to an + * image surface. + * + * It's possible that this code might serve as a good starting point + * for someone working on bringing up a new paginated-surface-based + * backend. + */ + +#include "cairoint.h" + +#include "test-paginated-surface.h" + +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-paginated-private.h" +#include "cairo-surface-backend-private.h" + +typedef struct _test_paginated_surface { + cairo_surface_t base; + cairo_surface_t *target; + cairo_paginated_mode_t paginated_mode; +} test_paginated_surface_t; + +static const cairo_surface_backend_t test_paginated_surface_backend; +static const cairo_paginated_surface_backend_t test_paginated_surface_paginated_backend; + +cairo_surface_t * +_cairo_test_paginated_surface_create (cairo_surface_t *target) +{ + cairo_status_t status; + cairo_surface_t *paginated; + test_paginated_surface_t *surface; + + status = cairo_surface_status (target); + if (unlikely (status)) + return _cairo_surface_create_in_error (status); + + surface = malloc (sizeof (test_paginated_surface_t)); + if (unlikely (surface == NULL)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + _cairo_surface_init (&surface->base, + &test_paginated_surface_backend, + NULL, /* device */ + target->content); + + surface->target = cairo_surface_reference (target); + + paginated = _cairo_paginated_surface_create (&surface->base, + target->content, + &test_paginated_surface_paginated_backend); + status = paginated->status; + if (status == CAIRO_STATUS_SUCCESS) { + /* paginated keeps the only reference to surface now, drop ours */ + cairo_surface_destroy (&surface->base); + return paginated; + } + + cairo_surface_destroy (target); + free (surface); + return _cairo_surface_create_in_error (status); +} + +static cairo_status_t +_test_paginated_surface_finish (void *abstract_surface) +{ + test_paginated_surface_t *surface = abstract_surface; + + cairo_surface_destroy (surface->target); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_test_paginated_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + test_paginated_surface_t *surface = abstract_surface; + + return _cairo_surface_get_extents (surface->target, rectangle); +} + +static cairo_int_status_t +_test_paginated_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + test_paginated_surface_t *surface = abstract_surface; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_STATUS_SUCCESS; + + return _cairo_surface_paint (surface->target, op, source, clip); +} + +static cairo_int_status_t +_test_paginated_surface_mask (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + test_paginated_surface_t *surface = abstract_surface; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_STATUS_SUCCESS; + + return _cairo_surface_mask (surface->target, + op, source, mask, clip); +} + +static cairo_int_status_t +_test_paginated_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + test_paginated_surface_t *surface = abstract_surface; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_STATUS_SUCCESS; + + return _cairo_surface_stroke (surface->target, op, source, + path, style, + ctm, ctm_inverse, + tolerance, antialias, + clip); +} + +static cairo_int_status_t +_test_paginated_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + test_paginated_surface_t *surface = abstract_surface; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_STATUS_SUCCESS; + + return _cairo_surface_fill (surface->target, op, source, + path, fill_rule, + tolerance, antialias, + clip); +} + +static cairo_bool_t +_test_paginated_surface_has_show_text_glyphs (void *abstract_surface) +{ + test_paginated_surface_t *surface = abstract_surface; + + return cairo_surface_has_show_text_glyphs (surface->target); +} + +static cairo_int_status_t +_test_paginated_surface_show_text_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const char *utf8, + int utf8_len, + cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t cluster_flags, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + test_paginated_surface_t *surface = abstract_surface; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_STATUS_SUCCESS; + + return _cairo_surface_show_text_glyphs (surface->target, op, source, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + cluster_flags, + scaled_font, + clip); +} + + +static void +_test_paginated_surface_set_paginated_mode (void *abstract_surface, + cairo_paginated_mode_t mode) +{ + test_paginated_surface_t *surface = abstract_surface; + + surface->paginated_mode = mode; +} + +static const cairo_surface_backend_t test_paginated_surface_backend = { + CAIRO_INTERNAL_SURFACE_TYPE_TEST_PAGINATED, + _test_paginated_surface_finish, + _cairo_default_context_create, + + /* Since we are a paginated user, we get to regard most of the + * surface backend interface as historical cruft and ignore it. */ + + NULL, /* create_similar */ + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _test_paginated_surface_get_extents, + NULL, /* get_font_options */ + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + /* Here is the more "modern" section of the surface backend + * interface which is mostly just drawing functions */ + + _test_paginated_surface_paint, + _test_paginated_surface_mask, + _test_paginated_surface_stroke, + _test_paginated_surface_fill, + NULL, /* fill-stroke */ + NULL, /* replaced by show_text_glyphs */ + _test_paginated_surface_has_show_text_glyphs, + _test_paginated_surface_show_text_glyphs +}; + +static const cairo_paginated_surface_backend_t test_paginated_surface_paginated_backend = { + NULL, /* start_page */ + _test_paginated_surface_set_paginated_mode +}; diff --git a/src/test-paginated-surface.h b/src/test-paginated-surface.h new file mode 100644 index 000000000..2bd98aa5e --- /dev/null +++ b/src/test-paginated-surface.h @@ -0,0 +1,48 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Carl Worth + */ + +#ifndef TEST_PAGINATED_SURFACE_H +#define TEST_PAGINATED_SURFACE_H + +#include "cairo.h" + +CAIRO_BEGIN_DECLS + +cairo_surface_t * +_cairo_test_paginated_surface_create (cairo_surface_t *target); + +CAIRO_END_DECLS + +#endif /* TEST_PAGINATED_SURFACE_H */ diff --git a/src/win32/cairo-win32-debug.c b/src/win32/cairo-win32-debug.c new file mode 100644 index 000000000..ff7aeaf1f --- /dev/null +++ b/src/win32/cairo-win32-debug.c @@ -0,0 +1,87 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Stuart Parmenter + * Vladimir Vukicevic + */ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairoint.h" +#include "cairo-win32-private.h" + +#include +#include + +void +_cairo_win32_debug_dump_hrgn (HRGN rgn, char *header) +{ + RGNDATA *rd; + unsigned int z; + + if (header) + fprintf (stderr, "%s\n", header); + + if (rgn == NULL) { + fprintf (stderr, " NULL\n"); + } + + z = GetRegionData(rgn, 0, NULL); + rd = (RGNDATA*) malloc(z); + z = GetRegionData(rgn, z, rd); + + fprintf (stderr, " %ld rects, bounds: %ld %ld %ld %ld\n", + rd->rdh.nCount, + rd->rdh.rcBound.left, + rd->rdh.rcBound.top, + rd->rdh.rcBound.right - rd->rdh.rcBound.left, + rd->rdh.rcBound.bottom - rd->rdh.rcBound.top); + + for (z = 0; z < rd->rdh.nCount; z++) { + RECT r = ((RECT*)rd->Buffer)[z]; + fprintf (stderr, " [%d]: [%ld %ld %ld %ld]\n", + z, r.left, r.top, r.right - r.left, r.bottom - r.top); + } + + free(rd); + fflush (stderr); +} diff --git a/src/win32/cairo-win32-device.c b/src/win32/cairo-win32-device.c new file mode 100644 index 000000000..741e49e33 --- /dev/null +++ b/src/win32/cairo-win32-device.c @@ -0,0 +1,189 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Stuart Parmenter + * Vladimir Vukicevic + */ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairoint.h" + +#include "cairo-atomic-private.h" +#include "cairo-device-private.h" +#include "cairo-win32-private.h" + +#include +#include + +static cairo_device_t *__cairo_win32_device; + +static cairo_status_t +_cairo_win32_device_flush (void *device) +{ + GdiFlush (); + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_win32_device_finish (void *device) +{ +} + +static void +_cairo_win32_device_destroy (void *device) +{ + free (device); +} + +static const cairo_device_backend_t _cairo_win32_device_backend = { + CAIRO_DEVICE_TYPE_WIN32, + + NULL, NULL, /* lock, unlock */ + + _cairo_win32_device_flush, + _cairo_win32_device_finish, + _cairo_win32_device_destroy, +}; + +#if 0 +D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, + D2D1::PixelFormat( + DXGI_FORMAT_B8G8R8A8_UNORM, + D2D1_ALPHA_MODE_IGNORE), + 0, + 0, + D2D1_RENDER_TARGET_USAGE_NONE, + D2D1_FEATURE_LEVEL_DEFAULT + ); + +hr = m_pD2DFactory->CreateDCRenderTarget(&props, &device->d2d); +#endif + +static cairo_bool_t is_win98 (void) +{ + OSVERSIONINFO os; + + os.dwOSVersionInfoSize = sizeof (os); + GetVersionEx (&os); + + return (VER_PLATFORM_WIN32_WINDOWS == os.dwPlatformId && + os.dwMajorVersion == 4 && + os.dwMinorVersion == 10); +} + +static void * +_cairo_win32_device_get_alpha_blend (cairo_win32_device_t *device) +{ + void *func = NULL; + + if (is_win98 ()) + return NULL; + + device->msimg32_dll = LoadLibraryW (L"msimg32"); + if (device->msimg32_dll) + func = GetProcAddress (device->msimg32_dll, "AlphaBlend"); + + return func; +} + +cairo_device_t * +_cairo_win32_device_get (void) +{ + cairo_win32_device_t *device; + + if (__cairo_win32_device) + return cairo_device_reference (__cairo_win32_device); + + device = malloc (sizeof (*device)); + + _cairo_device_init (&device->base, &_cairo_win32_device_backend); + + device->compositor = _cairo_win32_gdi_compositor_get (); + + device->msimg32_dll = NULL; + device->alpha_blend = _cairo_win32_device_get_alpha_blend (device); + + if (_cairo_atomic_ptr_cmpxchg ((void **)&__cairo_win32_device, NULL, device)) + return cairo_device_reference(&device->base); + + _cairo_win32_device_destroy (device); + return cairo_device_reference (__cairo_win32_device); +} + +unsigned +_cairo_win32_flags_for_dc (HDC dc) +{ + uint32_t flags = 0; + int cap; + + cap = GetDeviceCaps(dc, RASTERCAPS); + if (cap & RC_BITBLT) + flags |= CAIRO_WIN32_SURFACE_CAN_BITBLT; + if (cap & RC_STRETCHBLT) + flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHBLT; + if (cap & RC_STRETCHDIB) + flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHDIB; + + if (GetDeviceCaps(dc, TECHNOLOGY) == DT_RASDISPLAY) { + flags |= CAIRO_WIN32_SURFACE_IS_DISPLAY; + + /* These will always be possible, but the actual GetDeviceCaps + * calls will return whether they're accelerated or not. + * We may want to use our own (pixman) routines sometimes + * if they're eventually faster, but for now have GDI do + * everything. + */ +#if 0 + flags |= CAIRO_WIN32_SURFACE_CAN_BITBLT; + flags |= CAIRO_WIN32_SURFACE_CAN_ALPHABLEND; + flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHBLT; + flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHDIB; +#endif + } else { + cap = GetDeviceCaps(dc, SHADEBLENDCAPS); + if (cap != SB_NONE) + flags |= CAIRO_WIN32_SURFACE_CAN_ALPHABLEND; + } + + return flags; +} diff --git a/src/win32/cairo-win32-display-surface.c b/src/win32/cairo-win32-display-surface.c new file mode 100644 index 000000000..965f2c45d --- /dev/null +++ b/src/win32/cairo-win32-display-surface.c @@ -0,0 +1,1075 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Stuart Parmenter + * Vladimir Vukicevic + */ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairoint.h" + +#include "cairo-clip-private.h" +#include "cairo-composite-rectangles-private.h" +#include "cairo-compositor-private.h" +#include "cairo-damage-private.h" +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-inline.h" +#include "cairo-paginated-private.h" +#include "cairo-pattern-private.h" +#include "cairo-win32-private.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-surface-fallback-private.h" +#include "cairo-surface-backend-private.h" + +#include +#include + +#if defined(__MINGW32__) && !defined(ETO_PDY) +# define ETO_PDY 0x2000 +#endif + +#define PELS_72DPI ((LONG)(72. / 0.0254)) + +/** + * SECTION:cairo-win32 + * @Title: Win32 Surfaces + * @Short_Description: Microsoft Windows surface support + * @See_Also: #cairo_surface_t + * + * The Microsoft Windows surface is used to render cairo graphics to + * Microsoft Windows windows, bitmaps, and printing device contexts. + * + * The surface returned by cairo_win32_printing_surface_create() is of surface + * type %CAIRO_SURFACE_TYPE_WIN32_PRINTING and is a multi-page vector surface + * type. + * + * The surface returned by the other win32 constructors is of surface type + * %CAIRO_SURFACE_TYPE_WIN32 and is a raster surface type. + **/ + +/** + * CAIRO_HAS_WIN32_SURFACE: + * + * Defined if the Microsoft Windows surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.0 + **/ + +static const cairo_surface_backend_t cairo_win32_display_surface_backend; + +static cairo_status_t +_create_dc_and_bitmap (cairo_win32_display_surface_t *surface, + HDC original_dc, + cairo_format_t format, + int width, + int height, + unsigned char **bits_out, + int *rowstride_out) +{ + cairo_status_t status; + + BITMAPINFO *bitmap_info = NULL; + struct { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[2]; + } bmi_stack; + void *bits; + + int num_palette = 0; /* Quiet GCC */ + int i; + + surface->win32.dc = NULL; + surface->bitmap = NULL; + surface->is_dib = FALSE; + + switch (format) { + default: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB30: + return _cairo_error (CAIRO_STATUS_INVALID_FORMAT); + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + num_palette = 0; + break; + + case CAIRO_FORMAT_A8: + num_palette = 256; + break; + + case CAIRO_FORMAT_A1: + num_palette = 2; + break; + } + + if (num_palette > 2) { + bitmap_info = _cairo_malloc_ab_plus_c (num_palette, sizeof(RGBQUAD), sizeof(BITMAPINFOHEADER)); + if (!bitmap_info) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } else { + bitmap_info = (BITMAPINFO *)&bmi_stack; + } + + bitmap_info->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); + bitmap_info->bmiHeader.biWidth = width == 0 ? 1 : width; + bitmap_info->bmiHeader.biHeight = height == 0 ? -1 : - height; /* top-down */ + bitmap_info->bmiHeader.biSizeImage = 0; + bitmap_info->bmiHeader.biXPelsPerMeter = PELS_72DPI; /* unused here */ + bitmap_info->bmiHeader.biYPelsPerMeter = PELS_72DPI; /* unused here */ + bitmap_info->bmiHeader.biPlanes = 1; + + switch (format) { + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB30: + ASSERT_NOT_REACHED; + /* We can't create real RGB24 bitmaps because something seems to + * break if we do, especially if we don't set up an image + * fallback. It could be a bug with using a 24bpp pixman image + * (and creating one with masks). So treat them like 32bpp. + * Note: This causes problems when using BitBlt/AlphaBlend/etc! + * see end of file. + */ + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_ARGB32: + bitmap_info->bmiHeader.biBitCount = 32; + bitmap_info->bmiHeader.biCompression = BI_RGB; + bitmap_info->bmiHeader.biClrUsed = 0; /* unused */ + bitmap_info->bmiHeader.biClrImportant = 0; + break; + + case CAIRO_FORMAT_A8: + bitmap_info->bmiHeader.biBitCount = 8; + bitmap_info->bmiHeader.biCompression = BI_RGB; + bitmap_info->bmiHeader.biClrUsed = 256; + bitmap_info->bmiHeader.biClrImportant = 0; + + for (i = 0; i < 256; i++) { + bitmap_info->bmiColors[i].rgbBlue = i; + bitmap_info->bmiColors[i].rgbGreen = i; + bitmap_info->bmiColors[i].rgbRed = i; + bitmap_info->bmiColors[i].rgbReserved = 0; + } + break; + + case CAIRO_FORMAT_A1: + bitmap_info->bmiHeader.biBitCount = 1; + bitmap_info->bmiHeader.biCompression = BI_RGB; + bitmap_info->bmiHeader.biClrUsed = 2; + bitmap_info->bmiHeader.biClrImportant = 0; + + for (i = 0; i < 2; i++) { + bitmap_info->bmiColors[i].rgbBlue = i * 255; + bitmap_info->bmiColors[i].rgbGreen = i * 255; + bitmap_info->bmiColors[i].rgbRed = i * 255; + bitmap_info->bmiColors[i].rgbReserved = 0; + } + break; + } + + surface->win32.dc = CreateCompatibleDC (original_dc); + if (!surface->win32.dc) + goto FAIL; + + surface->bitmap = CreateDIBSection (surface->win32.dc, + bitmap_info, + DIB_RGB_COLORS, + &bits, + NULL, 0); + if (!surface->bitmap) + goto FAIL; + + surface->is_dib = TRUE; + + GdiFlush(); + + surface->saved_dc_bitmap = SelectObject (surface->win32.dc, + surface->bitmap); + if (!surface->saved_dc_bitmap) + goto FAIL; + + if (bitmap_info && num_palette > 2) + free (bitmap_info); + + if (bits_out) + *bits_out = bits; + + if (rowstride_out) { + /* Windows bitmaps are padded to 32-bit (dword) boundaries */ + switch (format) { + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB30: + ASSERT_NOT_REACHED; + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + *rowstride_out = 4 * width; + break; + + case CAIRO_FORMAT_A8: + *rowstride_out = (width + 3) & ~3; + break; + + case CAIRO_FORMAT_A1: + *rowstride_out = ((width + 31) & ~31) / 8; + break; + } + } + + surface->win32.flags = _cairo_win32_flags_for_dc (surface->win32.dc); + + return CAIRO_STATUS_SUCCESS; + + FAIL: + status = _cairo_win32_print_gdi_error (__FUNCTION__); + + if (bitmap_info && num_palette > 2) + free (bitmap_info); + + if (surface->saved_dc_bitmap) { + SelectObject (surface->win32.dc, surface->saved_dc_bitmap); + surface->saved_dc_bitmap = NULL; + } + + if (surface->bitmap) { + DeleteObject (surface->bitmap); + surface->bitmap = NULL; + } + + if (surface->win32.dc) { + DeleteDC (surface->win32.dc); + surface->win32.dc = NULL; + } + + return status; +} + +static cairo_surface_t * +_cairo_win32_display_surface_create_for_dc (HDC original_dc, + cairo_format_t format, + int width, + int height) +{ + cairo_status_t status; + cairo_device_t *device; + cairo_win32_display_surface_t *surface; + unsigned char *bits; + int rowstride; + + surface = malloc (sizeof (*surface)); + if (surface == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + surface->fallback = NULL; + + status = _create_dc_and_bitmap (surface, original_dc, format, + width, height, + &bits, &rowstride); + if (status) + goto FAIL; + + surface->image = cairo_image_surface_create_for_data (bits, format, + width, height, rowstride); + status = surface->image->status; + if (status) + goto FAIL; + + _cairo_image_surface_set_parent (to_image_surface(surface->image), + &surface->win32.base); + + surface->win32.format = format; + + surface->win32.extents.x = 0; + surface->win32.extents.y = 0; + surface->win32.extents.width = width; + surface->win32.extents.height = height; + + surface->initial_clip_rgn = NULL; + surface->had_simple_clip = FALSE; + + device = _cairo_win32_device_get (); + + _cairo_surface_init (&surface->win32.base, + &cairo_win32_display_surface_backend, + device, + _cairo_content_from_format (format)); + + cairo_device_destroy (device); + + return &surface->win32.base; + + FAIL: + if (surface->bitmap) { + SelectObject (surface->win32.dc, surface->saved_dc_bitmap); + DeleteObject (surface->bitmap); + DeleteDC (surface->win32.dc); + } + free (surface); + + return _cairo_surface_create_in_error (status); +} + +static cairo_surface_t * +_cairo_win32_display_surface_create_similar (void *abstract_src, + cairo_content_t content, + int width, + int height) +{ + cairo_win32_display_surface_t *src = abstract_src; + cairo_format_t format = _cairo_format_from_content (content); + cairo_surface_t *new_surf = NULL; + + /* We force a DIB always if: + * - we need alpha; or + * - the parent is a DIB; or + * - the parent is for printing (because we don't care about the + * bit depth at that point) + * + * We also might end up with a DIB even if a DDB is requested if + * DDB creation failed due to out of memory. + */ + if (!(src->is_dib || content & CAIRO_CONTENT_ALPHA)) { + /* try to create a ddb */ + new_surf = cairo_win32_surface_create_with_ddb (src->win32.dc, CAIRO_FORMAT_RGB24, width, height); + + if (new_surf->status) + new_surf = NULL; + } + + if (new_surf == NULL) { + new_surf = _cairo_win32_display_surface_create_for_dc (src->win32.dc, format, width, height); + } + + return new_surf; +} + +static cairo_surface_t * +_cairo_win32_display_surface_create_similar_image (void *abstract_other, + cairo_format_t format, + int width, + int height) +{ + cairo_win32_display_surface_t *surface = abstract_other; + cairo_image_surface_t *image; + + surface = (cairo_win32_display_surface_t *) + _cairo_win32_display_surface_create_for_dc (surface->win32.dc, + format, width, height); + if (surface->win32.base.status) + return &surface->win32.base; + + /* And clear in order to comply with our user API semantics */ + image = (cairo_image_surface_t *) surface->image; + if (! image->base.is_clear) { + memset (image->data, 0, image->stride * height); + image->base.is_clear = TRUE; + } + + return &image->base; +} + +static cairo_status_t +_cairo_win32_display_surface_finish (void *abstract_surface) +{ + cairo_win32_display_surface_t *surface = abstract_surface; + + if (surface->image && to_image_surface(surface->image)->parent) { + assert (to_image_surface(surface->image)->parent == &surface->win32.base); + /* Unhook ourselves first to avoid the double-unref from the image */ + to_image_surface(surface->image)->parent = NULL; + cairo_surface_finish (surface->image); + cairo_surface_destroy (surface->image); + } + + /* If we created the Bitmap and DC, destroy them */ + if (surface->bitmap) { + SelectObject (surface->win32.dc, surface->saved_dc_bitmap); + DeleteObject (surface->bitmap); + DeleteDC (surface->win32.dc); + } + + _cairo_win32_display_surface_discard_fallback (surface); + + if (surface->initial_clip_rgn) + DeleteObject (surface->initial_clip_rgn); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_image_surface_t * +_cairo_win32_display_surface_map_to_image (void *abstract_surface, + const cairo_rectangle_int_t *extents) +{ + cairo_win32_display_surface_t *surface = abstract_surface; + cairo_status_t status; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->win32.base.unique_id)); + + if (surface->image) + goto done; + + if (surface->fallback == NULL) { + surface->fallback = + _cairo_win32_display_surface_create_for_dc (surface->win32.dc, + surface->win32.format, + surface->win32.extents.x + surface->win32.extents.width, + surface->win32.extents.y + surface->win32.extents.height); + if (unlikely (status = surface->fallback->status)) + goto err; + + if (!BitBlt (to_win32_surface(surface->fallback)->dc, + surface->win32.extents.x, surface->win32.extents.y, + surface->win32.extents.width, + surface->win32.extents.height, + surface->win32.dc, + surface->win32.extents.x, surface->win32.extents.y, + SRCCOPY)) { + status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + goto err; + } + } + + surface = to_win32_display_surface (surface->fallback); +done: + GdiFlush(); + return _cairo_surface_map_to_image (surface->image, extents); + +err: + cairo_surface_destroy (surface->fallback); + surface->fallback = NULL; + + return _cairo_image_surface_create_in_error (status); +} + +static cairo_int_status_t +_cairo_win32_display_surface_unmap_image (void *abstract_surface, + cairo_image_surface_t *image) +{ + cairo_win32_display_surface_t *surface = abstract_surface; + + /* Delay the download until the next flush, which means we also need + * to make sure our sources rare flushed. + */ + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, to_win32_surface(surface)->base.unique_id)); + + if (surface->fallback) { + cairo_rectangle_int_t r; + + r.x = image->base.device_transform_inverse.x0; + r.y = image->base.device_transform_inverse.y0; + r.width = image->width; + r.height = image->height; + + TRACE ((stderr, "%s: adding damage (%d,%d)x(%d,%d)\n", + __FUNCTION__, r.x, r.y, r.width, r.height)); + surface->fallback->damage = + _cairo_damage_add_rectangle (surface->fallback->damage, &r); + surface = to_win32_display_surface (surface->fallback); + } + + return _cairo_surface_unmap_image (surface->image, image); +} + +static cairo_status_t +_cairo_win32_display_surface_flush (void *abstract_surface, unsigned flags) +{ + cairo_win32_display_surface_t *surface = abstract_surface; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + if (flags) + return CAIRO_STATUS_SUCCESS; + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->win32.base.unique_id)); + if (surface->fallback == NULL) + return CAIRO_STATUS_SUCCESS; + + if (surface->fallback->damage) { + cairo_win32_display_surface_t *fallback; + cairo_damage_t *damage; + + damage = _cairo_damage_reduce (surface->fallback->damage); + surface->fallback->damage = NULL; + + fallback = to_win32_display_surface (surface->fallback); + assert (fallback->image); + + TRACE ((stderr, "%s: flushing damage x %d\n", __FUNCTION__, + damage->region ? cairo_region_num_rectangles (damage->region) : 0)); + + if (damage->status) { + if (!BitBlt (surface->win32.dc, + 0, 0, + surface->win32.extents.width, + surface->win32.extents.height, + fallback->win32.dc, + 0, 0, + SRCCOPY)) + status = _cairo_win32_print_gdi_error (__FUNCTION__); + } else if (damage->region) { + int n = cairo_region_num_rectangles (damage->region), i; + for (i = 0; i < n; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (damage->region, i, &rect); + TRACE ((stderr, "%s: damage (%d,%d)x(%d,%d)\n", __FUNCTION__, + rect.x, rect.y, + rect.width, rect.height)); + if (!BitBlt (surface->win32.dc, + rect.x, rect.y, + rect.width, rect.height, + fallback->win32.dc, + rect.x, rect.y, + SRCCOPY)) { + status = _cairo_win32_print_gdi_error (__FUNCTION__); + break; + } + } + } + _cairo_damage_destroy (damage); + } else { + cairo_surface_destroy (surface->fallback); + surface->fallback = NULL; + } + + return status; +} + +static cairo_status_t +_cairo_win32_display_surface_mark_dirty (void *abstract_surface, + int x, int y, int width, int height) +{ + _cairo_win32_display_surface_discard_fallback (abstract_surface); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_win32_save_initial_clip (HDC hdc, cairo_win32_display_surface_t *surface) +{ + RECT rect; + int clipBoxType; + int gm; + XFORM saved_xform; + + /* GetClipBox/GetClipRgn and friends interact badly with a world transform + * set. GetClipBox returns values in logical (transformed) coordinates; + * it's unclear what GetClipRgn returns, because the region is empty in the + * case of a SIMPLEREGION clip, but I assume device (untransformed) coordinates. + * Similarly, IntersectClipRect works in logical units, whereas SelectClipRgn + * works in device units. + * + * So, avoid the whole mess and get rid of the world transform + * while we store our initial data and when we restore initial coordinates. + * + * XXX we may need to modify x/y by the ViewportOrg or WindowOrg + * here in GM_COMPATIBLE; unclear. + */ + gm = GetGraphicsMode (hdc); + if (gm == GM_ADVANCED) { + GetWorldTransform (hdc, &saved_xform); + ModifyWorldTransform (hdc, NULL, MWT_IDENTITY); + } + + clipBoxType = GetClipBox (hdc, &rect); + if (clipBoxType == ERROR) { + _cairo_win32_print_gdi_error (__FUNCTION__); + SetGraphicsMode (hdc, gm); + /* XXX: Can we make a more reasonable guess at the error cause here? */ + return _cairo_error (CAIRO_STATUS_DEVICE_ERROR); + } + + surface->win32.extents.x = rect.left; + surface->win32.extents.y = rect.top; + surface->win32.extents.width = rect.right - rect.left; + surface->win32.extents.height = rect.bottom - rect.top; + + surface->initial_clip_rgn = NULL; + surface->had_simple_clip = FALSE; + + if (clipBoxType == COMPLEXREGION) { + surface->initial_clip_rgn = CreateRectRgn (0, 0, 0, 0); + if (GetClipRgn (hdc, surface->initial_clip_rgn) <= 0) { + DeleteObject(surface->initial_clip_rgn); + surface->initial_clip_rgn = NULL; + } + } else if (clipBoxType == SIMPLEREGION) { + surface->had_simple_clip = TRUE; + } + + if (gm == GM_ADVANCED) + SetWorldTransform (hdc, &saved_xform); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_status_t +_cairo_win32_display_surface_set_clip (cairo_win32_display_surface_t *surface, + cairo_clip_t *clip) +{ + char stack[512]; + cairo_rectangle_int_t extents; + int num_rects; + RGNDATA *data; + size_t data_size; + RECT *rects; + int i; + HRGN gdi_region; + cairo_status_t status; + cairo_region_t *region; + + /* The semantics we want is that any clip set by cairo combines + * is intersected with the clip on device context that the + * surface was created for. To implement this, we need to + * save the original clip when first setting a clip on surface. + */ + + assert (_cairo_clip_is_region (clip)); + region = _cairo_clip_get_region (clip); + if (region == NULL) + return CAIRO_STATUS_SUCCESS; + + cairo_region_get_extents (region, &extents); + num_rects = cairo_region_num_rectangles (region); + + /* XXX see notes in _cairo_win32_save_initial_clip -- + * this code will interact badly with a HDC which had an initial + * world transform -- we should probably manually transform the + * region rects, because SelectClipRgn takes device units, not + * logical units (unlike IntersectClipRect). + */ + + data_size = sizeof (RGNDATAHEADER) + num_rects * sizeof (RECT); + if (data_size > sizeof (stack)) { + data = malloc (data_size); + if (!data) + return _cairo_error(CAIRO_STATUS_NO_MEMORY); + } else + data = (RGNDATA *)stack; + + data->rdh.dwSize = sizeof (RGNDATAHEADER); + data->rdh.iType = RDH_RECTANGLES; + data->rdh.nCount = num_rects; + data->rdh.nRgnSize = num_rects * sizeof (RECT); + data->rdh.rcBound.left = extents.x; + data->rdh.rcBound.top = extents.y; + data->rdh.rcBound.right = extents.x + extents.width; + data->rdh.rcBound.bottom = extents.y + extents.height; + + rects = (RECT *)data->Buffer; + for (i = 0; i < num_rects; i++) { + cairo_rectangle_int_t rect; + + cairo_region_get_rectangle (region, i, &rect); + + rects[i].left = rect.x; + rects[i].top = rect.y; + rects[i].right = rect.x + rect.width; + rects[i].bottom = rect.y + rect.height; + } + + gdi_region = ExtCreateRegion (NULL, data_size, data); + if ((char *)data != stack) + free (data); + + if (!gdi_region) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + /* AND the new region into our DC */ + status = CAIRO_STATUS_SUCCESS; + if (ExtSelectClipRgn (surface->win32.dc, gdi_region, RGN_AND) == ERROR) + status = _cairo_win32_print_gdi_error (__FUNCTION__); + + DeleteObject (gdi_region); + + return status; +} + +void +_cairo_win32_display_surface_unset_clip (cairo_win32_display_surface_t *surface) +{ + XFORM saved_xform; + int gm = GetGraphicsMode (surface->win32.dc); + if (gm == GM_ADVANCED) { + GetWorldTransform (surface->win32.dc, &saved_xform); + ModifyWorldTransform (surface->win32.dc, NULL, MWT_IDENTITY); + } + + /* initial_clip_rgn will either be a real region or NULL (which means reset to no clip region) */ + SelectClipRgn (surface->win32.dc, surface->initial_clip_rgn); + + if (surface->had_simple_clip) { + /* then if we had a simple clip, intersect */ + IntersectClipRect (surface->win32.dc, + surface->win32.extents.x, + surface->win32.extents.y, + surface->win32.extents.x + surface->win32.extents.width, + surface->win32.extents.y + surface->win32.extents.height); + } + + if (gm == GM_ADVANCED) + SetWorldTransform (surface->win32.dc, &saved_xform); +} + +void +_cairo_win32_display_surface_discard_fallback (cairo_win32_display_surface_t *surface) +{ + if (surface->fallback) { + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, surface->win32.base.unique_id)); + + cairo_surface_finish (surface->fallback); + cairo_surface_destroy (surface->fallback); + surface->fallback = NULL; + } +} + +static cairo_int_status_t +_cairo_win32_display_surface_paint (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_win32_device_t *device = to_win32_device_from_surface (surface); + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, to_win32_surface(surface)->base.unique_id)); + + if (clip == NULL && + (op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_CLEAR)) + _cairo_win32_display_surface_discard_fallback (surface); + + return _cairo_compositor_paint (device->compositor, + surface, op, source, clip); +} + +static cairo_int_status_t +_cairo_win32_display_surface_mask (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_pattern_t *mask, + const cairo_clip_t *clip) +{ + cairo_win32_device_t *device = to_win32_device_from_surface (surface); + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, to_win32_surface(surface)->base.unique_id)); + + if (clip == NULL && op == CAIRO_OPERATOR_SOURCE) + _cairo_win32_display_surface_discard_fallback (surface); + + return _cairo_compositor_mask (device->compositor, + surface, op, source, mask, clip); +} + +static cairo_int_status_t +_cairo_win32_display_surface_stroke (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_win32_device_t *device = to_win32_device_from_surface (surface); + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, to_win32_surface(surface)->base.unique_id)); + + return _cairo_compositor_stroke (device->compositor, surface, + op, source, path, + style, ctm, ctm_inverse, + tolerance, antialias, clip); +} + +static cairo_int_status_t +_cairo_win32_display_surface_fill (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_win32_device_t *device = to_win32_device_from_surface (surface); + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, to_win32_surface(surface)->base.unique_id)); + + return _cairo_compositor_fill (device->compositor, surface, + op, source, path, + fill_rule, tolerance, antialias, + clip); +} + +static cairo_int_status_t +_cairo_win32_display_surface_glyphs (void *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_win32_device_t *device = to_win32_device_from_surface (surface); + + TRACE ((stderr, "%s (surface=%d)\n", + __FUNCTION__, to_win32_surface(surface)->base.unique_id)); + + return _cairo_compositor_glyphs (device->compositor, surface, + op, source, + glyphs, num_glyphs, scaled_font, + clip); +} + +static const cairo_surface_backend_t cairo_win32_display_surface_backend = { + CAIRO_SURFACE_TYPE_WIN32, + _cairo_win32_display_surface_finish, + + _cairo_default_context_create, + + _cairo_win32_display_surface_create_similar, + _cairo_win32_display_surface_create_similar_image, + _cairo_win32_display_surface_map_to_image, + _cairo_win32_display_surface_unmap_image, + + _cairo_surface_default_source, + _cairo_surface_default_acquire_source_image, + _cairo_surface_default_release_source_image, + NULL, /* snapshot */ + + NULL, /* copy_page */ + NULL, /* show_page */ + + _cairo_win32_surface_get_extents, + NULL, /* get_font_options */ + + _cairo_win32_display_surface_flush, + _cairo_win32_display_surface_mark_dirty, + + _cairo_win32_display_surface_paint, + _cairo_win32_display_surface_mask, + _cairo_win32_display_surface_stroke, + _cairo_win32_display_surface_fill, + NULL, /* fill/stroke */ + _cairo_win32_display_surface_glyphs, +}; + +/* Notes: + * + * Win32 alpha-understanding functions + * + * BitBlt - will copy full 32 bits from a 32bpp DIB to result + * (so it's safe to use for ARGB32->ARGB32 SOURCE blits) + * (but not safe going RGB24->ARGB32, if RGB24 is also represented + * as a 32bpp DIB, since the alpha isn't discarded!) + * + * AlphaBlend - if both the source and dest have alpha, even if AC_SRC_ALPHA isn't set, + * it will still copy over the src alpha, because the SCA value (255) will be + * multiplied by all the src components. + */ + +/** + * cairo_win32_surface_create: + * @hdc: the DC to create a surface for + * + * Creates a cairo surface that targets the given DC. The DC will be + * queried for its initial clip extents, and this will be used as the + * size of the cairo surface. The resulting surface will always be of + * format %CAIRO_FORMAT_RGB24; should you need another surface format, + * you will need to create one through + * cairo_win32_surface_create_with_dib(). + * + * Return value: the newly created surface + * + * Since: 1.0 + **/ +cairo_surface_t * +cairo_win32_surface_create (HDC hdc) +{ + cairo_win32_display_surface_t *surface; + + cairo_format_t format; + cairo_status_t status; + cairo_device_t *device; + + /* Assume that everything coming in as a HDC is RGB24 */ + format = CAIRO_FORMAT_RGB24; + + surface = malloc (sizeof (*surface)); + if (surface == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + + status = _cairo_win32_save_initial_clip (hdc, surface); + if (status) { + free (surface); + return _cairo_surface_create_in_error (status); + } + + surface->image = NULL; + surface->fallback = NULL; + surface->win32.format = format; + + surface->win32.dc = hdc; + surface->bitmap = NULL; + surface->is_dib = FALSE; + surface->saved_dc_bitmap = NULL; + + surface->win32.flags = _cairo_win32_flags_for_dc (surface->win32.dc); + + device = _cairo_win32_device_get (); + + _cairo_surface_init (&surface->win32.base, + &cairo_win32_display_surface_backend, + device, + _cairo_content_from_format (format)); + + cairo_device_destroy (device); + + return &surface->win32.base; +} + +/** + * cairo_win32_surface_create_with_dib: + * @format: format of pixels in the surface to create + * @width: width of the surface, in pixels + * @height: height of the surface, in pixels + * + * Creates a device-independent-bitmap surface not associated with + * any particular existing surface or device context. The created + * bitmap will be uninitialized. + * + * Return value: the newly created surface + * + * Since: 1.2 + **/ +cairo_surface_t * +cairo_win32_surface_create_with_dib (cairo_format_t format, + int width, + int height) +{ + if (! CAIRO_FORMAT_VALID (format)) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); + + return _cairo_win32_display_surface_create_for_dc (NULL, format, width, height); +} + +/** + * cairo_win32_surface_create_with_ddb: + * @hdc: a DC compatible with the surface to create + * @format: format of pixels in the surface to create + * @width: width of the surface, in pixels + * @height: height of the surface, in pixels + * + * Creates a device-dependent-bitmap surface not associated with + * any particular existing surface or device context. The created + * bitmap will be uninitialized. + * + * Return value: the newly created surface + * + * Since: 1.4 + **/ +cairo_surface_t * +cairo_win32_surface_create_with_ddb (HDC hdc, + cairo_format_t format, + int width, + int height) +{ + cairo_win32_display_surface_t *new_surf; + HBITMAP ddb; + HDC screen_dc, ddb_dc; + HBITMAP saved_dc_bitmap; + + if (format != CAIRO_FORMAT_RGB24) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); +/* XXX handle these eventually + format != CAIRO_FORMAT_A8 || + format != CAIRO_FORMAT_A1) +*/ + + if (!hdc) { + screen_dc = GetDC (NULL); + hdc = screen_dc; + } else { + screen_dc = NULL; + } + + ddb_dc = CreateCompatibleDC (hdc); + if (ddb_dc == NULL) { + new_surf = (cairo_win32_display_surface_t*) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + goto FINISH; + } + + ddb = CreateCompatibleBitmap (hdc, width, height); + if (ddb == NULL) { + DeleteDC (ddb_dc); + + /* Note that if an app actually does hit this out of memory + * condition, it's going to have lots of other issues, as + * video memory is probably exhausted. However, it can often + * continue using DIBs instead of DDBs. + */ + new_surf = (cairo_win32_display_surface_t*) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + goto FINISH; + } + + saved_dc_bitmap = SelectObject (ddb_dc, ddb); + + new_surf = (cairo_win32_display_surface_t*) cairo_win32_surface_create (ddb_dc); + new_surf->bitmap = ddb; + new_surf->saved_dc_bitmap = saved_dc_bitmap; + new_surf->is_dib = FALSE; + +FINISH: + if (screen_dc) + ReleaseDC (NULL, screen_dc); + + return &new_surf->win32.base; +} diff --git a/src/win32/cairo-win32-font.c b/src/win32/cairo-win32-font.c new file mode 100644 index 000000000..1599b0751 --- /dev/null +++ b/src/win32/cairo-win32-font.c @@ -0,0 +1,2310 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + */ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as GetGlyphIndices */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairoint.h" + +#include "cairo-win32-private.h" + +#include "cairo-array-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-pattern-private.h" +#include "cairo-scaled-font-subsets-private.h" + +#include + +#ifndef SPI_GETFONTSMOOTHINGTYPE +#define SPI_GETFONTSMOOTHINGTYPE 0x200a +#endif +#ifndef FE_FONTSMOOTHINGCLEARTYPE +#define FE_FONTSMOOTHINGCLEARTYPE 2 +#endif +#ifndef CLEARTYPE_QUALITY +#define CLEARTYPE_QUALITY 5 +#endif +#ifndef TT_PRIM_CSPLINE +#define TT_PRIM_CSPLINE 3 +#endif + +#define CMAP_TAG 0x70616d63 + +/** + * SECTION:cairo-win32-fonts + * @Title: Win32 Fonts + * @Short_Description: Font support for Microsoft Windows + * @See_Also: #cairo_font_face_t + * + * The Microsoft Windows font backend is primarily used to render text on + * Microsoft Windows systems. + **/ + +/** + * CAIRO_HAS_WIN32_FONT: + * + * Defined if the Microsoft Windows font backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.8 + **/ + +const cairo_scaled_font_backend_t _cairo_win32_scaled_font_backend; + +typedef struct { + cairo_scaled_font_t base; + + LOGFONTW logfont; + + BYTE quality; + + /* We do drawing and metrics computation in a "logical space" which + * is similar to font space, except that it is scaled by a factor + * of the (desired font size) * (WIN32_FONT_LOGICAL_SCALE). The multiplication + * by WIN32_FONT_LOGICAL_SCALE allows for sub-pixel precision. + */ + double logical_scale; + + /* The size we should actually request the font at from Windows; differs + * from the logical_scale because it is quantized for orthogonal + * transformations + */ + double logical_size; + + /* Transformations from device <=> logical space + */ + cairo_matrix_t logical_to_device; + cairo_matrix_t device_to_logical; + + /* We special case combinations of 90-degree-rotations, scales and + * flips ... that is transformations that take the axes to the + * axes. If preserve_axes is true, then swap_axes/swap_x/swap_y + * encode the 8 possibilities for orientation (4 rotation angles with + * and without a flip), and scale_x, scale_y the scale components. + */ + cairo_bool_t preserve_axes; + cairo_bool_t swap_axes; + cairo_bool_t swap_x; + cairo_bool_t swap_y; + double x_scale; + double y_scale; + + /* The size of the design unit of the font + */ + int em_square; + + HFONT scaled_hfont; + HFONT unscaled_hfont; + + cairo_bool_t is_bitmap; + cairo_bool_t is_type1; + cairo_bool_t delete_scaled_hfont; + cairo_bool_t has_type1_notdef_index; + unsigned long type1_notdef_index; +} cairo_win32_scaled_font_t; + +static cairo_status_t +_cairo_win32_scaled_font_set_metrics (cairo_win32_scaled_font_t *scaled_font); + +static cairo_status_t +_cairo_win32_scaled_font_init_glyph_metrics (cairo_win32_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph); + +static cairo_status_t +_cairo_win32_scaled_font_init_glyph_surface (cairo_win32_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph); + +static cairo_status_t +_cairo_win32_scaled_font_init_glyph_path (cairo_win32_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph); + +#define NEARLY_ZERO(d) (fabs(d) < (1. / 65536.)) + +static HDC +_get_global_font_dc (void) +{ + static HDC hdc; + + if (!hdc) { + hdc = CreateCompatibleDC (NULL); + if (!hdc) { + _cairo_win32_print_gdi_error ("_get_global_font_dc"); + return NULL; + } + + if (!SetGraphicsMode (hdc, GM_ADVANCED)) { + _cairo_win32_print_gdi_error ("_get_global_font_dc"); + DeleteDC (hdc); + return NULL; + } + } + + return hdc; +} + +static cairo_status_t +_compute_transform (cairo_win32_scaled_font_t *scaled_font, + cairo_matrix_t *sc) +{ + cairo_status_t status; + + if (NEARLY_ZERO (sc->yx) && NEARLY_ZERO (sc->xy) && + !NEARLY_ZERO(sc->xx) && !NEARLY_ZERO(sc->yy)) { + scaled_font->preserve_axes = TRUE; + scaled_font->x_scale = sc->xx; + scaled_font->swap_x = (sc->xx < 0); + scaled_font->y_scale = sc->yy; + scaled_font->swap_y = (sc->yy < 0); + scaled_font->swap_axes = FALSE; + + } else if (NEARLY_ZERO (sc->xx) && NEARLY_ZERO (sc->yy) && + !NEARLY_ZERO(sc->yx) && !NEARLY_ZERO(sc->xy)) { + scaled_font->preserve_axes = TRUE; + scaled_font->x_scale = sc->yx; + scaled_font->swap_x = (sc->yx < 0); + scaled_font->y_scale = sc->xy; + scaled_font->swap_y = (sc->xy < 0); + scaled_font->swap_axes = TRUE; + + } else { + scaled_font->preserve_axes = FALSE; + scaled_font->swap_x = scaled_font->swap_y = scaled_font->swap_axes = FALSE; + } + + if (scaled_font->preserve_axes) { + if (scaled_font->swap_x) + scaled_font->x_scale = - scaled_font->x_scale; + if (scaled_font->swap_y) + scaled_font->y_scale = - scaled_font->y_scale; + + scaled_font->logical_scale = WIN32_FONT_LOGICAL_SCALE * scaled_font->y_scale; + scaled_font->logical_size = WIN32_FONT_LOGICAL_SCALE * + _cairo_lround (scaled_font->y_scale); + } + + /* The font matrix has x and y "scale" components which we extract and + * use as character scale values. + */ + cairo_matrix_init (&scaled_font->logical_to_device, + sc->xx, sc->yx, sc->xy, sc->yy, 0, 0); + + if (!scaled_font->preserve_axes) { + status = _cairo_matrix_compute_basis_scale_factors (&scaled_font->logical_to_device, + &scaled_font->x_scale, &scaled_font->y_scale, + TRUE); /* XXX: Handle vertical text */ + if (status) + return status; + + scaled_font->logical_size = + _cairo_lround (WIN32_FONT_LOGICAL_SCALE * scaled_font->y_scale); + scaled_font->logical_scale = + WIN32_FONT_LOGICAL_SCALE * scaled_font->y_scale; + } + + cairo_matrix_scale (&scaled_font->logical_to_device, + 1.0 / scaled_font->logical_scale, + 1.0 / scaled_font->logical_scale); + + scaled_font->device_to_logical = scaled_font->logical_to_device; + + status = cairo_matrix_invert (&scaled_font->device_to_logical); + if (status) + cairo_matrix_init_identity (&scaled_font->device_to_logical); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_bool_t +_have_cleartype_quality (void) +{ + OSVERSIONINFO version_info; + + version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + + if (!GetVersionEx (&version_info)) { + _cairo_win32_print_gdi_error ("_have_cleartype_quality"); + return FALSE; + } + + return (version_info.dwMajorVersion > 5 || + (version_info.dwMajorVersion == 5 && + version_info.dwMinorVersion >= 1)); /* XP or newer */ +} + +static BYTE +_get_system_quality (void) +{ + BOOL font_smoothing; + UINT smoothing_type; + + if (!SystemParametersInfo (SPI_GETFONTSMOOTHING, 0, &font_smoothing, 0)) { + _cairo_win32_print_gdi_error ("_get_system_quality"); + return DEFAULT_QUALITY; + } + + if (font_smoothing) { + if (_have_cleartype_quality ()) { + if (!SystemParametersInfo (SPI_GETFONTSMOOTHINGTYPE, + 0, &smoothing_type, 0)) { + _cairo_win32_print_gdi_error ("_get_system_quality"); + return DEFAULT_QUALITY; + } + + if (smoothing_type == FE_FONTSMOOTHINGCLEARTYPE) + return CLEARTYPE_QUALITY; + } + + return ANTIALIASED_QUALITY; + } else { + return DEFAULT_QUALITY; + } +} + +/* If face_hfont is non-%NULL then font_matrix must be a simple scale by some + * factor S, ctm must be the identity, logfont->lfHeight must be -S, + * logfont->lfWidth, logfont->lfEscapement, logfont->lfOrientation must + * all be 0, and face_hfont is the result of calling CreateFontIndirectW on + * logfont. + */ +static cairo_status_t +_win32_scaled_font_create (LOGFONTW *logfont, + HFONT face_hfont, + cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **font_out) +{ + HDC hdc; + cairo_win32_scaled_font_t *f; + cairo_matrix_t scale; + cairo_status_t status; + + hdc = _get_global_font_dc (); + if (hdc == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + f = malloc (sizeof(cairo_win32_scaled_font_t)); + if (f == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + f->logfont = *logfont; + + /* We don't have any control over the hinting style or subpixel + * order in the Win32 font API, so we ignore those parts of + * cairo_font_options_t. We use the 'antialias' field to set + * the 'quality'. + * + * XXX: The other option we could pay attention to, but don't + * here is the hint_metrics options. + */ + if (options->antialias == CAIRO_ANTIALIAS_DEFAULT) + f->quality = _get_system_quality (); + else { + switch (options->antialias) { + case CAIRO_ANTIALIAS_NONE: + f->quality = NONANTIALIASED_QUALITY; + break; + case CAIRO_ANTIALIAS_GRAY: + case CAIRO_ANTIALIAS_FAST: + case CAIRO_ANTIALIAS_GOOD: + f->quality = ANTIALIASED_QUALITY; + break; + case CAIRO_ANTIALIAS_SUBPIXEL: + case CAIRO_ANTIALIAS_BEST: + if (_have_cleartype_quality ()) + f->quality = CLEARTYPE_QUALITY; + else + f->quality = ANTIALIASED_QUALITY; + break; + case CAIRO_ANTIALIAS_DEFAULT: + ASSERT_NOT_REACHED; + } + } + + f->em_square = 0; + f->scaled_hfont = NULL; + f->unscaled_hfont = NULL; + f->has_type1_notdef_index = FALSE; + + if (f->quality == logfont->lfQuality || + (logfont->lfQuality == DEFAULT_QUALITY && + options->antialias == CAIRO_ANTIALIAS_DEFAULT)) { + /* If face_hfont is non-NULL, then we can use it to avoid creating our + * own --- because the constraints on face_hfont mentioned above + * guarantee it was created in exactly the same way that + * _win32_scaled_font_get_scaled_hfont would create it. + */ + f->scaled_hfont = face_hfont; + } + /* don't delete the hfont if we're using the one passed in to us */ + f->delete_scaled_hfont = !f->scaled_hfont; + + cairo_matrix_multiply (&scale, font_matrix, ctm); + status = _compute_transform (f, &scale); + if (status) + goto FAIL; + + status = _cairo_scaled_font_init (&f->base, font_face, + font_matrix, ctm, options, + &_cairo_win32_scaled_font_backend); + if (status) + goto FAIL; + + status = _cairo_win32_scaled_font_set_metrics (f); + if (status) { + _cairo_scaled_font_fini (&f->base); + goto FAIL; + } + + *font_out = &f->base; + return CAIRO_STATUS_SUCCESS; + + FAIL: + free (f); + return status; +} + +static cairo_status_t +_win32_scaled_font_set_world_transform (cairo_win32_scaled_font_t *scaled_font, + HDC hdc) +{ + XFORM xform; + + _cairo_matrix_to_win32_xform (&scaled_font->logical_to_device, &xform); + + if (!SetWorldTransform (hdc, &xform)) + return _cairo_win32_print_gdi_error ("_win32_scaled_font_set_world_transform"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_win32_scaled_font_set_identity_transform (HDC hdc) +{ + if (!ModifyWorldTransform (hdc, NULL, MWT_IDENTITY)) + return _cairo_win32_print_gdi_error ("_win32_scaled_font_set_identity_transform"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_win32_scaled_font_get_scaled_hfont (cairo_win32_scaled_font_t *scaled_font, + HFONT *hfont_out) +{ + if (!scaled_font->scaled_hfont) { + LOGFONTW logfont = scaled_font->logfont; + logfont.lfHeight = -scaled_font->logical_size; + logfont.lfWidth = 0; + logfont.lfEscapement = 0; + logfont.lfOrientation = 0; + logfont.lfQuality = scaled_font->quality; + + scaled_font->scaled_hfont = CreateFontIndirectW (&logfont); + if (!scaled_font->scaled_hfont) + return _cairo_win32_print_gdi_error ("_win32_scaled_font_get_scaled_hfont"); + } + + *hfont_out = scaled_font->scaled_hfont; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_win32_scaled_font_get_unscaled_hfont (cairo_win32_scaled_font_t *scaled_font, + HDC hdc, + HFONT *hfont_out) +{ + if (scaled_font->unscaled_hfont == NULL) { + OUTLINETEXTMETRIC *otm; + unsigned int otm_size; + HFONT scaled_hfont; + LOGFONTW logfont; + cairo_status_t status; + + status = _win32_scaled_font_get_scaled_hfont (scaled_font, + &scaled_hfont); + if (status) + return status; + + if (! SelectObject (hdc, scaled_hfont)) + return _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:SelectObject"); + + otm_size = GetOutlineTextMetrics (hdc, 0, NULL); + if (! otm_size) + return _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:GetOutlineTextMetrics"); + + otm = malloc (otm_size); + if (otm == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (! GetOutlineTextMetrics (hdc, otm_size, otm)) { + status = _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:GetOutlineTextMetrics"); + free (otm); + return status; + } + + scaled_font->em_square = otm->otmEMSquare; + free (otm); + + logfont = scaled_font->logfont; + logfont.lfHeight = -scaled_font->em_square; + logfont.lfWidth = 0; + logfont.lfEscapement = 0; + logfont.lfOrientation = 0; + logfont.lfQuality = scaled_font->quality; + + scaled_font->unscaled_hfont = CreateFontIndirectW (&logfont); + if (! scaled_font->unscaled_hfont) + return _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:CreateIndirect"); + } + + *hfont_out = scaled_font->unscaled_hfont; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_scaled_font_select_unscaled_font (cairo_scaled_font_t *scaled_font, + HDC hdc) +{ + cairo_status_t status; + HFONT hfont; + HFONT old_hfont = NULL; + + status = _win32_scaled_font_get_unscaled_hfont ((cairo_win32_scaled_font_t *)scaled_font, hdc, &hfont); + if (status) + return status; + + old_hfont = SelectObject (hdc, hfont); + if (!old_hfont) + return _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_select_unscaled_font"); + + status = _win32_scaled_font_set_identity_transform (hdc); + if (status) { + SelectObject (hdc, old_hfont); + return status; + } + + SetMapMode (hdc, MM_TEXT); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +_cairo_win32_scaled_font_is_type1 (cairo_scaled_font_t *scaled_font) +{ + cairo_win32_scaled_font_t *win32_scaled_font; + + win32_scaled_font = (cairo_win32_scaled_font_t *) scaled_font; + + return win32_scaled_font->is_type1; +} + +cairo_bool_t +_cairo_win32_scaled_font_is_bitmap (cairo_scaled_font_t *scaled_font) +{ + cairo_win32_scaled_font_t *win32_scaled_font; + + win32_scaled_font = (cairo_win32_scaled_font_t *) scaled_font; + + return win32_scaled_font->is_bitmap; +} + +static void +_cairo_win32_scaled_font_done_unscaled_font (cairo_scaled_font_t *scaled_font) +{ +} + +/* implement the font backend interface */ + +static cairo_status_t +_cairo_win32_font_face_create_for_toy (cairo_toy_font_face_t *toy_face, + cairo_font_face_t **font_face) +{ + LOGFONTW logfont; + uint16_t *face_name; + int face_name_len; + cairo_status_t status; + + status = _cairo_utf8_to_utf16 (toy_face->family, -1, + &face_name, &face_name_len); + if (status) + return status; + + if (face_name_len > LF_FACESIZE - 1) + face_name_len = LF_FACESIZE - 1; + + memcpy (logfont.lfFaceName, face_name, sizeof (uint16_t) * face_name_len); + logfont.lfFaceName[face_name_len] = 0; + free (face_name); + + logfont.lfHeight = 0; /* filled in later */ + logfont.lfWidth = 0; /* filled in later */ + logfont.lfEscapement = 0; /* filled in later */ + logfont.lfOrientation = 0; /* filled in later */ + + switch (toy_face->weight) { + case CAIRO_FONT_WEIGHT_NORMAL: + default: + logfont.lfWeight = FW_NORMAL; + break; + case CAIRO_FONT_WEIGHT_BOLD: + logfont.lfWeight = FW_BOLD; + break; + } + + switch (toy_face->slant) { + case CAIRO_FONT_SLANT_NORMAL: + default: + logfont.lfItalic = FALSE; + break; + case CAIRO_FONT_SLANT_ITALIC: + case CAIRO_FONT_SLANT_OBLIQUE: + logfont.lfItalic = TRUE; + break; + } + + logfont.lfUnderline = FALSE; + logfont.lfStrikeOut = FALSE; + /* The docs for LOGFONT discourage using this, since the + * interpretation is locale-specific, but it's not clear what + * would be a better alternative. + */ + logfont.lfCharSet = DEFAULT_CHARSET; + logfont.lfOutPrecision = OUT_DEFAULT_PRECIS; + logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; + logfont.lfQuality = DEFAULT_QUALITY; /* filled in later */ + logfont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; + + *font_face = cairo_win32_font_face_create_for_logfontw (&logfont); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_win32_scaled_font_fini (void *abstract_font) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + + if (scaled_font == NULL) + return; + + if (scaled_font->scaled_hfont && scaled_font->delete_scaled_hfont) + DeleteObject (scaled_font->scaled_hfont); + + if (scaled_font->unscaled_hfont) + DeleteObject (scaled_font->unscaled_hfont); +} + +static cairo_int_status_t +_cairo_win32_scaled_font_type1_text_to_glyphs (cairo_win32_scaled_font_t *scaled_font, + double x, + double y, + const char *utf8, + cairo_glyph_t **glyphs, + int *num_glyphs) +{ + uint16_t *utf16; + int n16; + int i; + WORD *glyph_indices = NULL; + cairo_status_t status; + double x_pos, y_pos; + HDC hdc = NULL; + cairo_matrix_t mat; + + status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &n16); + if (status) + return status; + + glyph_indices = _cairo_malloc_ab (n16 + 1, sizeof (WORD)); + if (!glyph_indices) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL1; + } + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + goto FAIL2; + + if (GetGlyphIndicesW (hdc, utf16, n16, glyph_indices, 0) == GDI_ERROR) { + status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_type1_text_to_glyphs:GetGlyphIndicesW"); + goto FAIL3; + } + + *num_glyphs = n16; + *glyphs = _cairo_malloc_ab (n16, sizeof (cairo_glyph_t)); + if (!*glyphs) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL3; + } + + x_pos = x; + y_pos = y; + + mat = scaled_font->base.ctm; + status = cairo_matrix_invert (&mat); + assert (status == CAIRO_STATUS_SUCCESS); + + _cairo_scaled_font_freeze_cache (&scaled_font->base); + + for (i = 0; i < n16; i++) { + cairo_scaled_glyph_t *scaled_glyph; + + (*glyphs)[i].index = glyph_indices[i]; + (*glyphs)[i].x = x_pos; + (*glyphs)[i].y = y_pos; + + status = _cairo_scaled_glyph_lookup (&scaled_font->base, + glyph_indices[i], + CAIRO_SCALED_GLYPH_INFO_METRICS, + &scaled_glyph); + if (status) { + free (*glyphs); + *glyphs = NULL; + break; + } + + x = scaled_glyph->x_advance; + y = scaled_glyph->y_advance; + cairo_matrix_transform_distance (&mat, &x, &y); + x_pos += x; + y_pos += y; + } + + _cairo_scaled_font_thaw_cache (&scaled_font->base); + +FAIL3: + cairo_win32_scaled_font_done_font (&scaled_font->base); +FAIL2: + free (glyph_indices); +FAIL1: + free (utf16); + + return status; +} + +static cairo_int_status_t +_cairo_win32_scaled_font_text_to_glyphs (void *abstract_font, + double x, + double y, + const char *utf8, + cairo_glyph_t **glyphs, + int *num_glyphs) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + uint16_t *utf16; + int n16; + GCP_RESULTSW gcp_results; + unsigned int buffer_size, i; + WCHAR *glyph_indices = NULL; + int *dx = NULL; + cairo_status_t status; + double x_pos, y_pos; + double x_incr, y_incr; + HDC hdc = NULL; + + /* GetCharacterPlacement() returns utf16 instead of glyph indices + * for Type 1 fonts. Use GetGlyphIndices for Type 1 fonts. */ + if (scaled_font->is_type1) + return _cairo_win32_scaled_font_type1_text_to_glyphs (scaled_font, + x, + y, + utf8, + glyphs, + num_glyphs); + + /* Compute a vector in user space along the baseline of length one logical space unit */ + x_incr = 1; + y_incr = 0; + cairo_matrix_transform_distance (&scaled_font->base.font_matrix, &x_incr, &y_incr); + x_incr /= scaled_font->logical_scale; + y_incr /= scaled_font->logical_scale; + + status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &n16); + if (status) + return status; + + gcp_results.lStructSize = sizeof (GCP_RESULTS); + gcp_results.lpOutString = NULL; + gcp_results.lpOrder = NULL; + gcp_results.lpCaretPos = NULL; + gcp_results.lpClass = NULL; + + buffer_size = MAX (n16 * 1.2, 16); /* Initially guess number of chars plus a few */ + if (buffer_size > INT_MAX) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL1; + } + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + goto FAIL1; + + while (TRUE) { + free (glyph_indices); + glyph_indices = NULL; + + free (dx); + dx = NULL; + + glyph_indices = _cairo_malloc_ab (buffer_size, sizeof (WCHAR)); + dx = _cairo_malloc_ab (buffer_size, sizeof (int)); + if (!glyph_indices || !dx) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL2; + } + + gcp_results.nGlyphs = buffer_size; + gcp_results.lpDx = dx; + gcp_results.lpGlyphs = glyph_indices; + + if (!GetCharacterPlacementW (hdc, utf16, n16, + 0, + &gcp_results, + GCP_DIACRITIC | GCP_LIGATE | GCP_GLYPHSHAPE | GCP_REORDER)) { + status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_text_to_glyphs"); + goto FAIL2; + } + + if (gcp_results.lpDx && gcp_results.lpGlyphs) + break; + + /* Too small a buffer, try again */ + + buffer_size += buffer_size / 2; + if (buffer_size > INT_MAX) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL2; + } + } + + *num_glyphs = gcp_results.nGlyphs; + *glyphs = _cairo_malloc_ab (gcp_results.nGlyphs, sizeof (cairo_glyph_t)); + if (!*glyphs) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FAIL2; + } + + x_pos = x; + y_pos = y; + + for (i = 0; i < gcp_results.nGlyphs; i++) { + (*glyphs)[i].index = glyph_indices[i]; + (*glyphs)[i].x = x_pos ; + (*glyphs)[i].y = y_pos; + + x_pos += x_incr * dx[i]; + y_pos += y_incr * dx[i]; + } + + FAIL2: + free (glyph_indices); + free (dx); + + cairo_win32_scaled_font_done_font (&scaled_font->base); + + FAIL1: + free (utf16); + + return status; +} + +static unsigned long +_cairo_win32_scaled_font_ucs4_to_index (void *abstract_font, + uint32_t ucs4) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + wchar_t unicode[2]; + WORD glyph_index; + HDC hdc = NULL; + cairo_status_t status; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return 0; + + unicode[0] = ucs4; + unicode[1] = 0; + if (GetGlyphIndicesW (hdc, unicode, 1, &glyph_index, 0) == GDI_ERROR) { + _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_ucs4_to_index:GetGlyphIndicesW"); + glyph_index = 0; + } + + cairo_win32_scaled_font_done_font (&scaled_font->base); + + return glyph_index; +} + +static cairo_status_t +_cairo_win32_scaled_font_set_metrics (cairo_win32_scaled_font_t *scaled_font) +{ + cairo_status_t status; + cairo_font_extents_t extents; + + TEXTMETRIC metrics; + HDC hdc; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + if (scaled_font->preserve_axes || scaled_font->base.options.hint_metrics == CAIRO_HINT_METRICS_OFF) { + /* For 90-degree rotations (including 0), we get the metrics + * from the GDI in logical space, then convert back to font space + */ + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return status; + GetTextMetrics (hdc, &metrics); + cairo_win32_scaled_font_done_font (&scaled_font->base); + + extents.ascent = metrics.tmAscent / scaled_font->logical_scale; + extents.descent = metrics.tmDescent / scaled_font->logical_scale; + + extents.height = (metrics.tmHeight + metrics.tmExternalLeading) / scaled_font->logical_scale; + extents.max_x_advance = metrics.tmMaxCharWidth / scaled_font->logical_scale; + extents.max_y_advance = 0; + + } else { + /* For all other transformations, we use the design metrics + * of the font. The GDI results from GetTextMetrics() on a + * transformed font are inexplicably large and we want to + * avoid them. + */ + status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); + if (status) + return status; + GetTextMetrics (hdc, &metrics); + _cairo_win32_scaled_font_done_unscaled_font (&scaled_font->base); + + extents.ascent = (double)metrics.tmAscent / scaled_font->em_square; + extents.descent = (double)metrics.tmDescent / scaled_font->em_square; + extents.height = (double)(metrics.tmHeight + metrics.tmExternalLeading) / scaled_font->em_square; + extents.max_x_advance = (double)(metrics.tmMaxCharWidth) / scaled_font->em_square; + extents.max_y_advance = 0; + + } + + scaled_font->is_bitmap = !(metrics.tmPitchAndFamily & TMPF_VECTOR); + + /* Need to determine if this is a Type 1 font for the special + * handling in _text_to_glyphs. Unlike TrueType or OpenType, + * Type1 fonts do not have a "cmap" table (or any other table). + * However GetFontData() will retrieve a Type1 font when + * requesting that GetFontData() retrieve data from the start of + * the file. This is to distinguish Type1 from stroke fonts such + * as "Script" and "Modern". The TMPF_TRUETYPE test is redundant + * but improves performance for the most common fonts. + */ + scaled_font->is_type1 = FALSE; + if (!(metrics.tmPitchAndFamily & TMPF_TRUETYPE) && + (metrics.tmPitchAndFamily & TMPF_VECTOR)) + { + if ((GetFontData (hdc, CMAP_TAG, 0, NULL, 0) == GDI_ERROR) && + (GetFontData (hdc, 0, 0, NULL, 0) != GDI_ERROR)) + { + scaled_font->is_type1 = TRUE; + } + } + + return _cairo_scaled_font_set_metrics (&scaled_font->base, &extents); +} + +static cairo_status_t +_cairo_win32_scaled_font_init_glyph_metrics (cairo_win32_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + static const MAT2 matrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 } }; + GLYPHMETRICS metrics; + cairo_status_t status; + cairo_text_extents_t extents; + HDC hdc; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + if (scaled_font->is_bitmap) { + /* GetGlyphOutline will not work. Assume that the glyph does not extend outside the font box. */ + cairo_font_extents_t font_extents; + INT width = 0; + UINT charIndex = _cairo_scaled_glyph_index (scaled_glyph); + + cairo_scaled_font_extents (&scaled_font->base, &font_extents); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return status; + + if (!GetCharWidth32(hdc, charIndex, charIndex, &width)) { + status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_init_glyph_metrics:GetCharWidth32"); + width = 0; + } + cairo_win32_scaled_font_done_font (&scaled_font->base); + if (status) + return status; + + extents.x_bearing = 0; + extents.y_bearing = scaled_font->base.ctm.yy * (-font_extents.ascent / scaled_font->y_scale); + extents.width = width / (WIN32_FONT_LOGICAL_SCALE * scaled_font->x_scale); + extents.height = scaled_font->base.ctm.yy * (font_extents.ascent + font_extents.descent) / scaled_font->y_scale; + extents.x_advance = extents.width; + extents.y_advance = 0; + } else if (scaled_font->preserve_axes && scaled_font->base.options.hint_metrics != CAIRO_HINT_METRICS_OFF) { + /* If we aren't rotating / skewing the axes, then we get the metrics + * from the GDI in device space and convert to font space. + */ + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return status; + + if (GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), + GGO_METRICS | GGO_GLYPH_INDEX, + &metrics, 0, NULL, &matrix) == GDI_ERROR) { + memset (&metrics, 0, sizeof (GLYPHMETRICS)); + } else { + if (metrics.gmBlackBoxX > 0 && scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE) { + /* The bounding box reported by Windows supposedly contains the glyph's "black" area; + * however, antialiasing (especially with ClearType) means that the actual image that + * needs to be rendered may "bleed" into the adjacent pixels, mainly on the right side. + * To avoid clipping the glyphs when drawn by _cairo_surface_fallback_show_glyphs, + * for example, or other code that uses glyph extents to determine the area to update, + * we add a pixel of "slop" to left side of the nominal "black" area returned by GDI, + * and two pixels to the right (as tests show some glyphs bleed into this column). + */ + metrics.gmptGlyphOrigin.x -= 1; + metrics.gmBlackBoxX += 3; + } + } + cairo_win32_scaled_font_done_font (&scaled_font->base); + + if (scaled_font->swap_axes) { + extents.x_bearing = - metrics.gmptGlyphOrigin.y / scaled_font->y_scale; + extents.y_bearing = metrics.gmptGlyphOrigin.x / scaled_font->x_scale; + extents.width = metrics.gmBlackBoxY / scaled_font->y_scale; + extents.height = metrics.gmBlackBoxX / scaled_font->x_scale; + extents.x_advance = metrics.gmCellIncY / scaled_font->x_scale; + extents.y_advance = metrics.gmCellIncX / scaled_font->y_scale; + } else { + extents.x_bearing = metrics.gmptGlyphOrigin.x / scaled_font->x_scale; + extents.y_bearing = - metrics.gmptGlyphOrigin.y / scaled_font->y_scale; + extents.width = metrics.gmBlackBoxX / scaled_font->x_scale; + extents.height = metrics.gmBlackBoxY / scaled_font->y_scale; + extents.x_advance = metrics.gmCellIncX / scaled_font->x_scale; + extents.y_advance = metrics.gmCellIncY / scaled_font->y_scale; + } + + if (scaled_font->swap_x) { + extents.x_bearing = (- extents.x_bearing - extents.width); + extents.x_advance = - extents.x_advance; + } + + if (scaled_font->swap_y) { + extents.y_bearing = (- extents.y_bearing - extents.height); + extents.y_advance = - extents.y_advance; + } + } else { + /* For all other transformations, we use the design metrics + * of the font. + */ + status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); + if (status) + return status; + + if (GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), + GGO_METRICS | GGO_GLYPH_INDEX, + &metrics, 0, NULL, &matrix) == GDI_ERROR) { + memset (&metrics, 0, sizeof (GLYPHMETRICS)); + } + _cairo_win32_scaled_font_done_unscaled_font (&scaled_font->base); + + extents.x_bearing = (double)metrics.gmptGlyphOrigin.x / scaled_font->em_square; + extents.y_bearing = - (double)metrics.gmptGlyphOrigin.y / scaled_font->em_square; + extents.width = (double)metrics.gmBlackBoxX / scaled_font->em_square; + extents.height = (double)metrics.gmBlackBoxY / scaled_font->em_square; + extents.x_advance = (double)metrics.gmCellIncX / scaled_font->em_square; + extents.y_advance = (double)metrics.gmCellIncY / scaled_font->em_square; + } + + _cairo_scaled_glyph_set_metrics (scaled_glyph, + &scaled_font->base, + &extents); + + return CAIRO_STATUS_SUCCESS; +} + +/* Not currently used code, but may be useful in the future if we add + * back the capability to the scaled font backend interface to get the + * actual device space bbox rather than computing it from the + * font-space metrics. + */ +#if 0 +static cairo_status_t +_cairo_win32_scaled_font_glyph_bbox (void *abstract_font, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_box_t *bbox) +{ + static const MAT2 matrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 } }; + cairo_win32_scaled_font_t *scaled_font = abstract_font; + int x1 = 0, x2 = 0, y1 = 0, y2 = 0; + + if (num_glyphs > 0) { + HDC hdc; + GLYPHMETRICS metrics; + cairo_status_t status; + int i; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return status; + + for (i = 0; i < num_glyphs; i++) { + int x = _cairo_lround (glyphs[i].x); + int y = _cairo_lround (glyphs[i].y); + + GetGlyphOutlineW (hdc, glyphs[i].index, GGO_METRICS | GGO_GLYPH_INDEX, + &metrics, 0, NULL, &matrix); + + if (i == 0 || x1 > x + metrics.gmptGlyphOrigin.x) + x1 = x + metrics.gmptGlyphOrigin.x; + if (i == 0 || y1 > y - metrics.gmptGlyphOrigin.y) + y1 = y - metrics.gmptGlyphOrigin.y; + if (i == 0 || x2 < x + metrics.gmptGlyphOrigin.x + (int)metrics.gmBlackBoxX) + x2 = x + metrics.gmptGlyphOrigin.x + (int)metrics.gmBlackBoxX; + if (i == 0 || y2 < y - metrics.gmptGlyphOrigin.y + (int)metrics.gmBlackBoxY) + y2 = y - metrics.gmptGlyphOrigin.y + (int)metrics.gmBlackBoxY; + } + + cairo_win32_scaled_font_done_font (&scaled_font->base); + } + + bbox->p1.x = _cairo_fixed_from_int (x1); + bbox->p1.y = _cairo_fixed_from_int (y1); + bbox->p2.x = _cairo_fixed_from_int (x2); + bbox->p2.y = _cairo_fixed_from_int (y2); + + return CAIRO_STATUS_SUCCESS; +} +#endif + +typedef struct { + cairo_win32_scaled_font_t *scaled_font; + HDC hdc; + + cairo_array_t glyphs; + cairo_array_t dx; + + int start_x; + int last_x; + int last_y; +} cairo_glyph_state_t; + +static void +_start_glyphs (cairo_glyph_state_t *state, + cairo_win32_scaled_font_t *scaled_font, + HDC hdc) +{ + state->hdc = hdc; + state->scaled_font = scaled_font; + + _cairo_array_init (&state->glyphs, sizeof (WCHAR)); + _cairo_array_init (&state->dx, sizeof (int)); +} + +static cairo_status_t +_flush_glyphs (cairo_glyph_state_t *state) +{ + cairo_status_t status; + int dx = 0; + WCHAR * elements; + int * dx_elements; + + status = _cairo_array_append (&state->dx, &dx); + if (status) + return status; + + elements = _cairo_array_index (&state->glyphs, 0); + dx_elements = _cairo_array_index (&state->dx, 0); + if (!ExtTextOutW (state->hdc, + state->start_x, state->last_y, + ETO_GLYPH_INDEX, + NULL, + elements, + state->glyphs.num_elements, + dx_elements)) { + return _cairo_win32_print_gdi_error ("_flush_glyphs"); + } + + _cairo_array_truncate (&state->glyphs, 0); + _cairo_array_truncate (&state->dx, 0); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_add_glyph (cairo_glyph_state_t *state, + unsigned long index, + double device_x, + double device_y) +{ + cairo_status_t status; + double user_x = device_x; + double user_y = device_y; + WCHAR glyph_index = index; + int logical_x, logical_y; + + cairo_matrix_transform_point (&state->scaled_font->device_to_logical, &user_x, &user_y); + + logical_x = _cairo_lround (user_x); + logical_y = _cairo_lround (user_y); + + if (state->glyphs.num_elements > 0) { + int dx; + + if (logical_y != state->last_y) { + status = _flush_glyphs (state); + if (status) + return status; + state->start_x = logical_x; + } else { + dx = logical_x - state->last_x; + status = _cairo_array_append (&state->dx, &dx); + if (status) + return status; + } + } else { + state->start_x = logical_x; + } + + state->last_x = logical_x; + state->last_y = logical_y; + + status = _cairo_array_append (&state->glyphs, &glyph_index); + if (status) + return status; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_finish_glyphs (cairo_glyph_state_t *state) +{ + cairo_status_t status; + + status = _flush_glyphs (state); + + _cairo_array_fini (&state->glyphs); + _cairo_array_fini (&state->dx); + + return status; +} + +static cairo_status_t +_draw_glyphs_on_surface (cairo_win32_surface_t *surface, + cairo_win32_scaled_font_t *scaled_font, + COLORREF color, + int x_offset, + int y_offset, + const cairo_glyph_t *glyphs, + int num_glyphs) +{ + cairo_glyph_state_t state; + cairo_status_t status, status2; + int i; + + if (!SaveDC (surface->dc)) + return _cairo_win32_print_gdi_error ("_draw_glyphs_on_surface:SaveDC"); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, surface->dc); + if (status) + goto FAIL1; + + SetTextColor (surface->dc, color); + SetTextAlign (surface->dc, TA_BASELINE | TA_LEFT); + SetBkMode (surface->dc, TRANSPARENT); + + _start_glyphs (&state, scaled_font, surface->dc); + + for (i = 0; i < num_glyphs; i++) { + status = _add_glyph (&state, glyphs[i].index, + glyphs[i].x - x_offset, glyphs[i].y - y_offset); + if (status) + goto FAIL2; + } + + FAIL2: + status2 = _finish_glyphs (&state); + if (status == CAIRO_STATUS_SUCCESS) + status = status2; + + cairo_win32_scaled_font_done_font (&scaled_font->base); + FAIL1: + RestoreDC (surface->dc, -1); + + return status; +} + +static cairo_int_status_t +_cairo_win32_scaled_font_glyph_init (void *abstract_font, + cairo_scaled_glyph_t *scaled_glyph, + cairo_scaled_glyph_info_t info) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + cairo_status_t status; + + if ((info & CAIRO_SCALED_GLYPH_INFO_METRICS) != 0) { + status = _cairo_win32_scaled_font_init_glyph_metrics (scaled_font, scaled_glyph); + if (status) + return status; + } + + if (info & CAIRO_SCALED_GLYPH_INFO_SURFACE) { + status = _cairo_win32_scaled_font_init_glyph_surface (scaled_font, scaled_glyph); + if (status) + return status; + } + + if ((info & CAIRO_SCALED_GLYPH_INFO_PATH) != 0) { + status = _cairo_win32_scaled_font_init_glyph_path (scaled_font, scaled_glyph); + if (status) + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_win32_scaled_font_load_truetype_table (void *abstract_font, + unsigned long tag, + long offset, + unsigned char *buffer, + unsigned long *length) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + HDC hdc; + cairo_status_t status; + DWORD ret; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + tag = (tag&0x000000ff)<<24 | (tag&0x0000ff00)<<8 | (tag&0x00ff0000)>>8 | (tag&0xff000000)>>24; + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return status; + + ret = GetFontData (hdc, tag, offset, buffer, *length); + if (ret == GDI_ERROR || (buffer && ret != *length)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + else + *length = ret; + + cairo_win32_scaled_font_done_font (&scaled_font->base); + + return status; +} + +static cairo_int_status_t +_cairo_win32_scaled_font_index_to_ucs4 (void *abstract_font, + unsigned long index, + uint32_t *ucs4) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + GLYPHSET *glyph_set; + uint16_t *utf16 = NULL; + WORD *glyph_indices = NULL; + HDC hdc = NULL; + int res; + unsigned int i, j, num_glyphs; + cairo_status_t status; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + if (status) + return status; + + res = GetFontUnicodeRanges(hdc, NULL); + if (res == 0) { + status = _cairo_win32_print_gdi_error ( + "_cairo_win32_scaled_font_index_to_ucs4:GetFontUnicodeRanges"); + goto exit1; + } + + glyph_set = malloc (res); + if (glyph_set == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto exit1; + } + + res = GetFontUnicodeRanges(hdc, glyph_set); + if (res == 0) { + status = _cairo_win32_print_gdi_error ( + "_cairo_win32_scaled_font_index_to_ucs4:GetFontUnicodeRanges"); + goto exit1; + } + + *ucs4 = (uint32_t) -1; + for (i = 0; i < glyph_set->cRanges; i++) { + num_glyphs = glyph_set->ranges[i].cGlyphs; + + utf16 = _cairo_malloc_ab (num_glyphs + 1, sizeof (uint16_t)); + if (utf16 == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto exit1; + } + + glyph_indices = _cairo_malloc_ab (num_glyphs + 1, sizeof (WORD)); + if (glyph_indices == NULL) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto exit2; + } + + for (j = 0; j < num_glyphs; j++) + utf16[j] = glyph_set->ranges[i].wcLow + j; + utf16[j] = 0; + + if (GetGlyphIndicesW (hdc, utf16, num_glyphs, glyph_indices, 0) == GDI_ERROR) { + status = _cairo_win32_print_gdi_error ( + "_cairo_win32_scaled_font_index_to_ucs4:GetGlyphIndicesW"); + goto exit2; + } + + for (j = 0; j < num_glyphs; j++) { + if (glyph_indices[j] == index) { + *ucs4 = utf16[j]; + goto exit2; + } + } + + free (glyph_indices); + glyph_indices = NULL; + free (utf16); + utf16 = NULL; + } + +exit2: + free (glyph_indices); + free (utf16); + free (glyph_set); +exit1: + cairo_win32_scaled_font_done_font (&scaled_font->base); + + return status; +} + +static cairo_bool_t +_cairo_win32_scaled_font_is_synthetic (void *abstract_font) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + cairo_status_t status; + int weight; + cairo_bool_t bold; + cairo_bool_t italic; + + status = _cairo_truetype_get_style (&scaled_font->base, + &weight, + &bold, + &italic); + /* If this doesn't work assume it is not synthetic to avoid + * unnecessary subsetting fallbacks. */ + if (status != CAIRO_STATUS_SUCCESS) + return FALSE; + + if (scaled_font->logfont.lfWeight != weight || + scaled_font->logfont.lfItalic != italic) + return TRUE; + + return FALSE; +} + +static cairo_int_status_t +_cairo_win32_scaled_font_index_to_glyph_name (void *abstract_font, + char **glyph_names, + int num_glyph_names, + unsigned long glyph_index, + unsigned long *glyph_array_index) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + int i; + + /* Windows puts .notdef at index 0 then numbers the remaining + * glyphs starting from 1 in the order they appear in the font. */ + + /* Find the position of .notdef in the list of glyph names. We + * only need to do this once per scaled font. */ + if (! scaled_font->has_type1_notdef_index) { + for (i = 0; i < num_glyph_names; i++) { + if (strcmp (glyph_names[i], ".notdef") == 0) { + scaled_font->type1_notdef_index = i; + scaled_font->has_type1_notdef_index = TRUE; + break; + } + } + if (! scaled_font->has_type1_notdef_index) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + + /* Once we know the position of .notdef the position of any glyph + * in the font can easily be obtained. */ + if (glyph_index == 0) + *glyph_array_index = scaled_font->type1_notdef_index; + else if (glyph_index <= scaled_font->type1_notdef_index) + *glyph_array_index = glyph_index - 1; + else if (glyph_index < (unsigned long)num_glyph_names) + *glyph_array_index = glyph_index; + else + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_win32_scaled_font_load_type1_data (void *abstract_font, + long offset, + unsigned char *buffer, + unsigned long *length) +{ + cairo_win32_scaled_font_t *scaled_font = abstract_font; + + if (! scaled_font->is_type1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + /* Using the tag 0 retrieves the entire font file. This works with + * Type 1 fonts as well as TTF/OTF fonts. */ + return _cairo_win32_scaled_font_load_truetype_table (scaled_font, + 0, + offset, + buffer, + length); +} + +static cairo_surface_t * +_compute_mask (cairo_surface_t *surface, + int quality) +{ + cairo_image_surface_t *glyph; + cairo_image_surface_t *mask; + int i, j; + + glyph = (cairo_image_surface_t *)cairo_surface_map_to_image (surface, NULL); + if (unlikely (glyph->base.status)) + return &glyph->base; + + if (quality == CLEARTYPE_QUALITY) { + /* Duplicate the green channel of a 4-channel mask into the + * alpha channel, then invert the whole mask. + */ + mask = (cairo_image_surface_t *) + cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + glyph->width, glyph->height); + if (likely (mask->base.status == CAIRO_STATUS_SUCCESS)) { + for (i = 0; i < glyph->height; i++) { + uint32_t *p = (uint32_t *) (glyph->data + i * glyph->stride); + uint32_t *q = (uint32_t *) (mask->data + i * mask->stride); + + for (j = 0; j < glyph->width; j++) { + *q++ = 0xffffffff ^ (*p | ((*p & 0x0000ff00) << 16)); + p++; + } + } + } + } else { + /* Compute an alpha-mask from a using the green channel of a + * (presumed monochrome) RGB24 image. + */ + mask = (cairo_image_surface_t *) + cairo_image_surface_create (CAIRO_FORMAT_A8, + glyph->width, glyph->height); + if (likely (mask->base.status == CAIRO_STATUS_SUCCESS)) { + for (i = 0; i < glyph->height; i++) { + uint32_t *p = (uint32_t *) (glyph->data + i * glyph->stride); + uint8_t *q = (uint8_t *) (mask->data + i * mask->stride); + + for (j = 0; j < glyph->width; j++) + *q++ = 255 - ((*p++ & 0x0000ff00) >> 8); + } + } + } + + cairo_surface_unmap_image (surface, &glyph->base); + return &mask->base; +} + +static cairo_status_t +_cairo_win32_scaled_font_init_glyph_surface (cairo_win32_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + cairo_status_t status; + cairo_glyph_t glyph; + cairo_surface_t *surface; + cairo_surface_t *image; + int width, height; + int x1, y1, x2, y2; + + x1 = _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x); + y1 = _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); + x2 = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.x); + y2 = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y); + width = x2 - x1; + height = y2 - y1; + + surface = cairo_win32_surface_create_with_dib (CAIRO_FORMAT_RGB24, + width, height); + status = _cairo_surface_paint (surface, CAIRO_OPERATOR_SOURCE, + &_cairo_pattern_white.base, NULL); + if (status) + goto FAIL; + + glyph.index = _cairo_scaled_glyph_index (scaled_glyph); + glyph.x = -x1; + glyph.y = -y1; + status = _draw_glyphs_on_surface (to_win32_surface (surface), + scaled_font, RGB(0,0,0), + 0, 0, &glyph, 1); + if (status) + goto FAIL; + + image = _compute_mask (surface, scaled_font->quality); + status = image->status; + if (status) + goto FAIL; + + cairo_surface_set_device_offset (image, -x1, -y1); + _cairo_scaled_glyph_set_surface (scaled_glyph, + &scaled_font->base, + (cairo_image_surface_t *) image); + + FAIL: + cairo_surface_destroy (surface); + + return status; +} + +static void +_cairo_win32_transform_FIXED_to_fixed (cairo_matrix_t *matrix, + FIXED Fx, FIXED Fy, + cairo_fixed_t *fx, cairo_fixed_t *fy) +{ + double x = Fx.value + Fx.fract / 65536.0; + double y = Fy.value + Fy.fract / 65536.0; + cairo_matrix_transform_point (matrix, &x, &y); + *fx = _cairo_fixed_from_double (x); + *fy = _cairo_fixed_from_double (y); +} + +static cairo_status_t +_cairo_win32_scaled_font_init_glyph_path (cairo_win32_scaled_font_t *scaled_font, + cairo_scaled_glyph_t *scaled_glyph) +{ + static const MAT2 matrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, -1 } }; + cairo_status_t status; + GLYPHMETRICS metrics; + HDC hdc; + DWORD bytesGlyph; + unsigned char *buffer, *ptr; + cairo_path_fixed_t *path; + cairo_matrix_t transform; + cairo_fixed_t x, y; + + if (scaled_font->is_bitmap) + return CAIRO_INT_STATUS_UNSUPPORTED; + + hdc = _get_global_font_dc (); + assert (hdc != NULL); + + path = _cairo_path_fixed_create (); + if (!path) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + if (scaled_font->base.options.hint_style == CAIRO_HINT_STYLE_NONE) { + status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); + transform = scaled_font->base.scale; + cairo_matrix_scale (&transform, 1.0/scaled_font->em_square, 1.0/scaled_font->em_square); + } else { + status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); + cairo_matrix_init_identity(&transform); + } + if (status) + goto CLEANUP_PATH; + + bytesGlyph = GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), + GGO_NATIVE | GGO_GLYPH_INDEX, + &metrics, 0, NULL, &matrix); + + if (bytesGlyph == GDI_ERROR) { + status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_glyph_path"); + goto CLEANUP_FONT; + } + + ptr = buffer = malloc (bytesGlyph); + if (!buffer) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto CLEANUP_FONT; + } + + if (GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), + GGO_NATIVE | GGO_GLYPH_INDEX, + &metrics, bytesGlyph, buffer, &matrix) == GDI_ERROR) { + status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_glyph_path"); + goto CLEANUP_BUFFER; + } + + while (ptr < buffer + bytesGlyph) { + TTPOLYGONHEADER *header = (TTPOLYGONHEADER *)ptr; + unsigned char *endPoly = ptr + header->cb; + + ptr += sizeof (TTPOLYGONHEADER); + + _cairo_win32_transform_FIXED_to_fixed (&transform, + header->pfxStart.x, + header->pfxStart.y, + &x, &y); + status = _cairo_path_fixed_move_to (path, x, y); + if (status) + goto CLEANUP_BUFFER; + + while (ptr < endPoly) { + TTPOLYCURVE *curve = (TTPOLYCURVE *)ptr; + POINTFX *points = curve->apfx; + int i; + switch (curve->wType) { + case TT_PRIM_LINE: + for (i = 0; i < curve->cpfx; i++) { + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i].x, + points[i].y, + &x, &y); + status = _cairo_path_fixed_line_to (path, x, y); + if (status) + goto CLEANUP_BUFFER; + } + break; + case TT_PRIM_QSPLINE: + for (i = 0; i < curve->cpfx - 1; i++) { + cairo_fixed_t p1x, p1y, p2x, p2y, cx, cy, c1x, c1y, c2x, c2y; + if (! _cairo_path_fixed_get_current_point (path, &p1x, &p1y)) + goto CLEANUP_BUFFER; + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i].x, + points[i].y, + &cx, &cy); + + if (i + 1 == curve->cpfx - 1) { + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i + 1].x, + points[i + 1].y, + &p2x, &p2y); + } else { + /* records with more than one curve use interpolation for + control points, per http://support.microsoft.com/kb/q87115/ */ + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i + 1].x, + points[i + 1].y, + &x, &y); + p2x = (cx + x) / 2; + p2y = (cy + y) / 2; + } + + c1x = 2 * cx / 3 + p1x / 3; + c1y = 2 * cy / 3 + p1y / 3; + c2x = 2 * cx / 3 + p2x / 3; + c2y = 2 * cy / 3 + p2y / 3; + + status = _cairo_path_fixed_curve_to (path, c1x, c1y, c2x, c2y, p2x, p2y); + if (status) + goto CLEANUP_BUFFER; + } + break; + case TT_PRIM_CSPLINE: + for (i = 0; i < curve->cpfx - 2; i += 2) { + cairo_fixed_t x1, y1, x2, y2; + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i].x, + points[i].y, + &x, &y); + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i + 1].x, + points[i + 1].y, + &x1, &y1); + _cairo_win32_transform_FIXED_to_fixed (&transform, + points[i + 2].x, + points[i + 2].y, + &x2, &y2); + status = _cairo_path_fixed_curve_to (path, x, y, x1, y1, x2, y2); + if (status) + goto CLEANUP_BUFFER; + } + break; + } + ptr += sizeof(TTPOLYCURVE) + sizeof (POINTFX) * (curve->cpfx - 1); + } + status = _cairo_path_fixed_close_path (path); + if (status) + goto CLEANUP_BUFFER; + } + + _cairo_scaled_glyph_set_path (scaled_glyph, + &scaled_font->base, + path); + + CLEANUP_BUFFER: + free (buffer); + + CLEANUP_FONT: + if (scaled_font->base.options.hint_style == CAIRO_HINT_STYLE_NONE) + _cairo_win32_scaled_font_done_unscaled_font (&scaled_font->base); + else + cairo_win32_scaled_font_done_font (&scaled_font->base); + + CLEANUP_PATH: + if (status != CAIRO_STATUS_SUCCESS) + _cairo_path_fixed_destroy (path); + + return status; +} + +const cairo_scaled_font_backend_t _cairo_win32_scaled_font_backend = { + CAIRO_FONT_TYPE_WIN32, + _cairo_win32_scaled_font_fini, + _cairo_win32_scaled_font_glyph_init, + NULL, /* _cairo_win32_scaled_font_text_to_glyphs, FIXME */ + _cairo_win32_scaled_font_ucs4_to_index, + _cairo_win32_scaled_font_load_truetype_table, + _cairo_win32_scaled_font_index_to_ucs4, + _cairo_win32_scaled_font_is_synthetic, + _cairo_win32_scaled_font_index_to_glyph_name, + _cairo_win32_scaled_font_load_type1_data +}; + +/* #cairo_win32_font_face_t */ + +typedef struct _cairo_win32_font_face cairo_win32_font_face_t; + +/* If hfont is non-%NULL then logfont->lfHeight must be -S for some S, + * logfont->lfWidth, logfont->lfEscapement, logfont->lfOrientation must + * all be 0, and hfont is the result of calling CreateFontIndirectW on + * logfont. + */ +struct _cairo_win32_font_face { + cairo_font_face_t base; + LOGFONTW logfont; + HFONT hfont; +}; + +/* We maintain a hash table from LOGFONT,HFONT => #cairo_font_face_t. + * The primary purpose of this mapping is to provide unique + * #cairo_font_face_t values so that our cache and mapping from + * #cairo_font_face_t => #cairo_scaled_font_t works. Once the + * corresponding #cairo_font_face_t objects fall out of downstream + * caches, we don't need them in this hash table anymore. + * + * Modifications to this hash table are protected by + * _cairo_win32_font_face_mutex. + */ + +static cairo_hash_table_t *cairo_win32_font_face_hash_table = NULL; + +static int +_cairo_win32_font_face_keys_equal (const void *key_a, + const void *key_b); + +static void +_cairo_win32_font_face_hash_table_destroy (void) +{ + cairo_hash_table_t *hash_table; + + /* We manually acquire the lock rather than calling + * _cairo_win32_font_face_hash_table_lock simply to avoid creating + * the table only to destroy it again. */ + CAIRO_MUTEX_LOCK (_cairo_win32_font_face_mutex); + hash_table = cairo_win32_font_face_hash_table; + cairo_win32_font_face_hash_table = NULL; + CAIRO_MUTEX_UNLOCK (_cairo_win32_font_face_mutex); + + if (hash_table != NULL) + _cairo_hash_table_destroy (hash_table); +} + +static cairo_hash_table_t * +_cairo_win32_font_face_hash_table_lock (void) +{ + CAIRO_MUTEX_LOCK (_cairo_win32_font_face_mutex); + + if (unlikely (cairo_win32_font_face_hash_table == NULL)) + { + cairo_win32_font_face_hash_table = + _cairo_hash_table_create (_cairo_win32_font_face_keys_equal); + + if (unlikely (cairo_win32_font_face_hash_table == NULL)) { + CAIRO_MUTEX_UNLOCK (_cairo_win32_font_face_mutex); + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return NULL; + } + } + + return cairo_win32_font_face_hash_table; +} + +static void +_cairo_win32_font_face_hash_table_unlock (void) +{ + CAIRO_MUTEX_UNLOCK (_cairo_win32_font_face_mutex); +} + +static cairo_bool_t +_cairo_win32_font_face_destroy (void *abstract_face) +{ + cairo_win32_font_face_t *font_face = abstract_face; + cairo_hash_table_t *hash_table; + + hash_table = _cairo_win32_font_face_hash_table_lock (); + /* All created objects must have been mapped in the hash table. */ + assert (hash_table != NULL); + + if (! _cairo_reference_count_dec_and_test (&font_face->base.ref_count)) { + /* somebody recreated the font whilst we waited for the lock */ + _cairo_win32_font_face_hash_table_unlock (); + return FALSE; + } + + /* Font faces in SUCCESS status are guaranteed to be in the + * hashtable. Font faces in an error status are removed from the + * hashtable if they are found during a lookup, thus they should + * only be removed if they are in the hashtable. */ + if (likely (font_face->base.status == CAIRO_STATUS_SUCCESS) || + _cairo_hash_table_lookup (hash_table, &font_face->base.hash_entry) == font_face) + _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); + + _cairo_win32_font_face_hash_table_unlock (); + return TRUE; +} + +static void +_cairo_win32_font_face_init_key (cairo_win32_font_face_t *key, + LOGFONTW *logfont, + HFONT font) +{ + unsigned long hash = _CAIRO_HASH_INIT_VALUE; + + key->logfont = *logfont; + key->hfont = font; + + hash = _cairo_hash_bytes (0, logfont->lfFaceName, 2*wcslen(logfont->lfFaceName)); + hash = _cairo_hash_bytes (hash, &logfont->lfWeight, sizeof(logfont->lfWeight)); + hash = _cairo_hash_bytes (hash, &logfont->lfItalic, sizeof(logfont->lfItalic)); + + key->base.hash_entry.hash = hash; +} + +static int +_cairo_win32_font_face_keys_equal (const void *key_a, + const void *key_b) +{ + const cairo_win32_font_face_t *face_a = key_a; + const cairo_win32_font_face_t *face_b = key_b; + + if (face_a->logfont.lfWeight == face_b->logfont.lfWeight && + face_a->logfont.lfItalic == face_b->logfont.lfItalic && + face_a->logfont.lfUnderline == face_b->logfont.lfUnderline && + face_a->logfont.lfStrikeOut == face_b->logfont.lfStrikeOut && + face_a->logfont.lfCharSet == face_b->logfont.lfCharSet && + face_a->logfont.lfOutPrecision == face_b->logfont.lfOutPrecision && + face_a->logfont.lfClipPrecision == face_b->logfont.lfClipPrecision && + face_a->logfont.lfPitchAndFamily == face_b->logfont.lfPitchAndFamily && + (wcscmp (face_a->logfont.lfFaceName, face_b->logfont.lfFaceName) == 0)) + return TRUE; + else + return FALSE; +} + +/* implement the platform-specific interface */ + +static cairo_bool_t +_is_scale (const cairo_matrix_t *matrix, double scale) +{ + return matrix->xx == scale && matrix->yy == scale && + matrix->xy == 0. && matrix->yx == 0. && + matrix->x0 == 0. && matrix->y0 == 0.; +} + +static cairo_status_t +_cairo_win32_font_face_scaled_font_create (void *abstract_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options, + cairo_scaled_font_t **font) +{ + HFONT hfont = NULL; + + cairo_win32_font_face_t *font_face = abstract_face; + + if (font_face->hfont) { + /* Check whether it's OK to go ahead and use the font-face's HFONT. */ + if (_is_scale (ctm, 1.) && + _is_scale (font_matrix, -font_face->logfont.lfHeight)) { + hfont = font_face->hfont; + } + } + + return _win32_scaled_font_create (&font_face->logfont, + hfont, + &font_face->base, + font_matrix, ctm, options, + font); +} + +const cairo_font_face_backend_t _cairo_win32_font_face_backend = { + CAIRO_FONT_TYPE_WIN32, + _cairo_win32_font_face_create_for_toy, + _cairo_win32_font_face_destroy, + _cairo_win32_font_face_scaled_font_create +}; + +/** + * cairo_win32_font_face_create_for_logfontw_hfont: + * @logfont: A #LOGFONTW structure specifying the font to use. + * If @font is %NULL then the lfHeight, lfWidth, lfOrientation and lfEscapement + * fields of this structure are ignored. Otherwise lfWidth, lfOrientation and + * lfEscapement must be zero. + * @font: An #HFONT that can be used when the font matrix is a scale by + * -lfHeight and the CTM is identity. + * + * Creates a new font for the Win32 font backend based on a + * #LOGFONT. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). + * The #cairo_scaled_font_t + * returned from cairo_scaled_font_create() is also for the Win32 backend + * and can be used with functions such as cairo_win32_scaled_font_select_font(). + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.6 + **/ +cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font) +{ + cairo_win32_font_face_t *font_face, key; + cairo_hash_table_t *hash_table; + cairo_status_t status; + + hash_table = _cairo_win32_font_face_hash_table_lock (); + if (unlikely (hash_table == NULL)) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + return (cairo_font_face_t *)&_cairo_font_face_nil; + } + + _cairo_win32_font_face_init_key (&key, logfont, font); + + /* Return existing unscaled font if it exists in the hash table. */ + font_face = _cairo_hash_table_lookup (hash_table, + &key.base.hash_entry); + if (font_face != NULL) { + if (font_face->base.status == CAIRO_STATUS_SUCCESS) { + cairo_font_face_reference (&font_face->base); + _cairo_win32_font_face_hash_table_unlock (); + return &font_face->base; + } + + /* remove the bad font from the hash table */ + _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); + } + + /* Otherwise create it and insert into hash table. */ + font_face = malloc (sizeof (cairo_win32_font_face_t)); + if (!font_face) { + _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); + goto FAIL; + } + + _cairo_win32_font_face_init_key (font_face, logfont, font); + _cairo_font_face_init (&font_face->base, &_cairo_win32_font_face_backend); + + assert (font_face->base.hash_entry.hash == key.base.hash_entry.hash); + status = _cairo_hash_table_insert (hash_table, + &font_face->base.hash_entry); + if (unlikely (status)) + goto FAIL; + + _cairo_win32_font_face_hash_table_unlock (); + return &font_face->base; + +FAIL: + _cairo_win32_font_face_hash_table_unlock (); + return (cairo_font_face_t *)&_cairo_font_face_nil; +} + +/** + * cairo_win32_font_face_create_for_logfontw: + * @logfont: A #LOGFONTW structure specifying the font to use. + * The lfHeight, lfWidth, lfOrientation and lfEscapement + * fields of this structure are ignored. + * + * Creates a new font for the Win32 font backend based on a + * #LOGFONT. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). + * The #cairo_scaled_font_t + * returned from cairo_scaled_font_create() is also for the Win32 backend + * and can be used with functions such as cairo_win32_scaled_font_select_font(). + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.0 + **/ +cairo_font_face_t * +cairo_win32_font_face_create_for_logfontw (LOGFONTW *logfont) +{ + return cairo_win32_font_face_create_for_logfontw_hfont (logfont, NULL); +} + +/** + * cairo_win32_font_face_create_for_hfont: + * @font: An #HFONT structure specifying the font to use. + * + * Creates a new font for the Win32 font backend based on a + * #HFONT. This font can then be used with + * cairo_set_font_face() or cairo_scaled_font_create(). + * The #cairo_scaled_font_t + * returned from cairo_scaled_font_create() is also for the Win32 backend + * and can be used with functions such as cairo_win32_scaled_font_select_font(). + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.2 + **/ +cairo_font_face_t * +cairo_win32_font_face_create_for_hfont (HFONT font) +{ + LOGFONTW logfont; + GetObjectW (font, sizeof(logfont), &logfont); + + if (logfont.lfEscapement != 0 || logfont.lfOrientation != 0 || + logfont.lfWidth != 0) { + /* We can't use this font because that optimization requires that + * lfEscapement, lfOrientation and lfWidth be zero. */ + font = NULL; + } + + return cairo_win32_font_face_create_for_logfontw_hfont (&logfont, font); +} + +static cairo_bool_t +_cairo_scaled_font_is_win32 (cairo_scaled_font_t *scaled_font) +{ + return scaled_font->backend == &_cairo_win32_scaled_font_backend; +} + +/** + * cairo_win32_scaled_font_select_font: + * @scaled_font: A #cairo_scaled_font_t from the Win32 font backend. Such an + * object can be created with cairo_win32_font_face_create_for_logfontw(). + * @hdc: a device context + * + * Selects the font into the given device context and changes the + * map mode and world transformation of the device context to match + * that of the font. This function is intended for use when using + * layout APIs such as Uniscribe to do text layout with the + * cairo font. After finishing using the device context, you must call + * cairo_win32_scaled_font_done_font() to release any resources allocated + * by this function. + * + * See cairo_win32_scaled_font_get_metrics_factor() for converting logical + * coordinates from the device context to font space. + * + * Normally, calls to SaveDC() and RestoreDC() would be made around + * the use of this function to preserve the original graphics state. + * + * Return value: %CAIRO_STATUS_SUCCESS if the operation succeeded. + * otherwise an error such as %CAIRO_STATUS_NO_MEMORY and + * the device context is unchanged. + * + * Since: 1.0 + **/ +cairo_status_t +cairo_win32_scaled_font_select_font (cairo_scaled_font_t *scaled_font, + HDC hdc) +{ + cairo_status_t status; + HFONT hfont; + HFONT old_hfont = NULL; + int old_mode; + + if (! _cairo_scaled_font_is_win32 (scaled_font)) { + return _cairo_error (CAIRO_STATUS_FONT_TYPE_MISMATCH); + } + + if (scaled_font->status) + return scaled_font->status; + + status = _win32_scaled_font_get_scaled_hfont ((cairo_win32_scaled_font_t *)scaled_font, &hfont); + if (status) + return status; + + old_hfont = SelectObject (hdc, hfont); + if (!old_hfont) + return _cairo_win32_print_gdi_error ("cairo_win32_scaled_font_select_font:SelectObject"); + + old_mode = SetGraphicsMode (hdc, GM_ADVANCED); + if (!old_mode) { + status = _cairo_win32_print_gdi_error ("cairo_win32_scaled_font_select_font:SetGraphicsMode"); + SelectObject (hdc, old_hfont); + return status; + } + + status = _win32_scaled_font_set_world_transform ((cairo_win32_scaled_font_t *)scaled_font, hdc); + if (status) { + SetGraphicsMode (hdc, old_mode); + SelectObject (hdc, old_hfont); + return status; + } + + SetMapMode (hdc, MM_TEXT); + + return CAIRO_STATUS_SUCCESS; +} + +/** + * cairo_win32_scaled_font_done_font: + * @scaled_font: A scaled font from the Win32 font backend. + * + * Releases any resources allocated by cairo_win32_scaled_font_select_font() + * + * Since: 1.0 + **/ +void +cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font) +{ + if (! _cairo_scaled_font_is_win32 (scaled_font)) { + _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); + } +} + +/** + * cairo_win32_scaled_font_get_metrics_factor: + * @scaled_font: a scaled font from the Win32 font backend + * + * Gets a scale factor between logical coordinates in the coordinate + * space used by cairo_win32_scaled_font_select_font() (that is, the + * coordinate system used by the Windows functions to return metrics) and + * font space coordinates. + * + * Return value: factor to multiply logical units by to get font space + * coordinates. + * + * Since: 1.0 + **/ +double +cairo_win32_scaled_font_get_metrics_factor (cairo_scaled_font_t *scaled_font) +{ + if (! _cairo_scaled_font_is_win32 (scaled_font)) { + _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); + return 1.; + } + return 1. / ((cairo_win32_scaled_font_t *)scaled_font)->logical_scale; +} + +/** + * cairo_win32_scaled_font_get_logical_to_device: + * @scaled_font: a scaled font from the Win32 font backend + * @logical_to_device: matrix to return + * + * Gets the transformation mapping the logical space used by @scaled_font + * to device space. + * + * Since: 1.4 + **/ +void +cairo_win32_scaled_font_get_logical_to_device (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *logical_to_device) +{ + cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; + if (! _cairo_scaled_font_is_win32 (scaled_font)) { + _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); + cairo_matrix_init_identity (logical_to_device); + return; + } + *logical_to_device = win_font->logical_to_device; +} + +/** + * cairo_win32_scaled_font_get_device_to_logical: + * @scaled_font: a scaled font from the Win32 font backend + * @device_to_logical: matrix to return + * + * Gets the transformation mapping device space to the logical space + * used by @scaled_font. + * + * Since: 1.4 + **/ +void +cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, + cairo_matrix_t *device_to_logical) +{ + cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; + if (! _cairo_scaled_font_is_win32 (scaled_font)) { + _cairo_error_throw (CAIRO_STATUS_FONT_TYPE_MISMATCH); + cairo_matrix_init_identity (device_to_logical); + return; + } + *device_to_logical = win_font->device_to_logical; +} + +void +_cairo_win32_font_reset_static_data (void) +{ + _cairo_win32_font_face_hash_table_destroy (); +} diff --git a/src/win32/cairo-win32-gdi-compositor.c b/src/win32/cairo-win32-gdi-compositor.c new file mode 100644 index 000000000..073e889ab --- /dev/null +++ b/src/win32/cairo-win32-gdi-compositor.c @@ -0,0 +1,650 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Carl D. Worth + * Behdad Esfahbod + * Chris Wilson + * Karl Tomlinson , Mozilla Corporation + */ + +/* The original X drawing API was very restrictive in what it could handle, + * pixel-aligned fill/blits are all that map into Cairo's drawing model. + */ + +#include "cairoint.h" + +#include "cairo-win32-private.h" + +#include "cairo-boxes-private.h" +#include "cairo-clip-inline.h" +#include "cairo-compositor-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-pattern-private.h" +#include "cairo-region-private.h" +#include "cairo-surface-inline.h" +#include "cairo-surface-offset-private.h" + +#if !defined(AC_SRC_OVER) +#define AC_SRC_OVER 0x00 +#pragma pack(1) +typedef struct { + BYTE BlendOp; + BYTE BlendFlags; + BYTE SourceConstantAlpha; + BYTE AlphaFormat; +}BLENDFUNCTION; +#pragma pack() +#endif + +/* for compatibility with VC++ 6 */ +#ifndef AC_SRC_ALPHA +#define AC_SRC_ALPHA 0x01 +#endif + +#define PELS_72DPI ((LONG)(72. / 0.0254)) + +/* the low-level interface */ + +struct fill_box { + HDC dc; + HBRUSH brush; +}; + +static cairo_bool_t fill_box (cairo_box_t *box, void *closure) +{ + struct fill_box *fb = closure; + RECT rect; + + rect.left = _cairo_fixed_integer_part (box->p1.x); + rect.top = _cairo_fixed_integer_part (box->p1.y); + rect.right = _cairo_fixed_integer_part (box->p2.x); + rect.bottom = _cairo_fixed_integer_part (box->p2.y); + + TRACE ((stderr, "%s\n", __FUNCTION__)); + return FillRect (fb->dc, &rect, fb->brush); +} + +struct check_box { + cairo_rectangle_int_t limit; + int tx, ty; +}; + +struct copy_box { + cairo_rectangle_int_t limit; + int tx, ty; + HDC dst, src; + BLENDFUNCTION bf; + cairo_win32_alpha_blend_func_t alpha_blend; +}; + +static cairo_bool_t copy_box (cairo_box_t *box, void *closure) +{ + const struct copy_box *cb = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + + TRACE ((stderr, "%s\n", __FUNCTION__)); + return BitBlt (cb->dst, x, y, width, height, + cb->src, x + cb->tx, y + cb->ty, + SRCCOPY); +} + +static cairo_bool_t alpha_box (cairo_box_t *box, void *closure) +{ + const struct copy_box *cb = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + + TRACE ((stderr, "%s\n", __FUNCTION__)); + return cb->alpha_blend (cb->dst, x, y, width, height, + cb->src, x + cb->tx, y + cb->ty, width, height, + cb->bf); +} + +struct upload_box { + cairo_rectangle_int_t limit; + int tx, ty; + HDC dst; + BITMAPINFO bi; + void *data; +}; + +static cairo_bool_t upload_box (cairo_box_t *box, void *closure) +{ + const struct upload_box *cb = closure; + int x = _cairo_fixed_integer_part (box->p1.x); + int y = _cairo_fixed_integer_part (box->p1.y); + int width = _cairo_fixed_integer_part (box->p2.x - box->p1.x); + int height = _cairo_fixed_integer_part (box->p2.y - box->p1.y); + int src_height = -cb->bi.bmiHeader.biHeight; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + return StretchDIBits (cb->dst, x, y + height - 1, width, -height, + x + cb->tx, src_height - (y + cb->ty - 1), + width, -height, + cb->data, &cb->bi, + DIB_RGB_COLORS, SRCCOPY); +} + +/* the mid-level: converts boxes into drawing operations */ + +static COLORREF color_to_rgb(const cairo_color_t *c) +{ + return RGB (c->red_short >> 8, c->green_short >> 8, c->blue_short >> 8); +} + +static cairo_int_status_t +fill_boxes (cairo_win32_display_surface_t *dst, + const cairo_pattern_t *src, + cairo_boxes_t *boxes) +{ + const cairo_color_t *color = &((cairo_solid_pattern_t *) src)->color; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + struct fill_box fb; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + fb.dc = dst->win32.dc; + fb.brush = CreateSolidBrush (color_to_rgb(color)); + if (!fb.brush) + return _cairo_win32_print_gdi_error (__FUNCTION__); + + if (! _cairo_boxes_for_each_box (boxes, fill_box, &fb)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + + DeleteObject (fb.brush); + + return status; +} + +static cairo_bool_t source_contains_box (cairo_box_t *box, void *closure) +{ + struct check_box *data = closure; + + /* The box is pixel-aligned so the truncation is safe. */ + return + _cairo_fixed_integer_part (box->p1.x) + data->tx >= data->limit.x && + _cairo_fixed_integer_part (box->p1.y) + data->ty >= data->limit.y && + _cairo_fixed_integer_part (box->p2.x) + data->tx <= data->limit.x + data->limit.width && + _cairo_fixed_integer_part (box->p2.y) + data->ty <= data->limit.y + data->limit.height; +} + +static cairo_status_t +copy_boxes (cairo_win32_display_surface_t *dst, + const cairo_pattern_t *source, + cairo_boxes_t *boxes) +{ + const cairo_surface_pattern_t *pattern; + struct copy_box cb; + cairo_surface_t *surface; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + pattern = (const cairo_surface_pattern_t *) source; + surface = _cairo_surface_get_source (pattern->surface, &cb.limit); + if (surface->type == CAIRO_SURFACE_TYPE_IMAGE) { + surface = to_image_surface(surface)->parent; + if (surface == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + if (surface->type != CAIRO_SURFACE_TYPE_WIN32) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, + &cb.tx, &cb.ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + cb.dst = dst->win32.dc; + cb.src = to_win32_surface(surface)->dc; + + /* First check that the data is entirely within the image */ + if (! _cairo_boxes_for_each_box (boxes, source_contains_box, &cb)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = __cairo_surface_flush (surface, 0); + if (status) + return status; + + cb.tx += cb.limit.x; + cb.ty += cb.limit.y; + status = CAIRO_STATUS_SUCCESS; + if (! _cairo_boxes_for_each_box (boxes, copy_box, &cb)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_win32_display_surface_discard_fallback (dst); + return status; +} + +static cairo_status_t +upload_boxes (cairo_win32_display_surface_t *dst, + const cairo_pattern_t *source, + cairo_boxes_t *boxes) +{ + const cairo_surface_pattern_t *pattern; + struct upload_box cb; + cairo_surface_t *surface; + cairo_image_surface_t *image; + void *image_extra; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + + if ((dst->win32.flags & CAIRO_WIN32_SURFACE_CAN_STRETCHDIB) == 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, + &cb.tx, &cb.ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + pattern = (const cairo_surface_pattern_t *) source; + surface = _cairo_surface_get_source (pattern->surface, &cb.limit); + + /* First check that the data is entirely within the image */ + if (! _cairo_boxes_for_each_box (boxes, source_contains_box, &cb)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface->type != CAIRO_SURFACE_TYPE_IMAGE) { + status = _cairo_surface_acquire_source_image (surface, + &image, &image_extra); + if (status) + return status; + } else + image = to_image_surface(surface); + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (!(image->format == CAIRO_FORMAT_ARGB32 || + image->format == CAIRO_FORMAT_RGB24)) + goto err; + if (image->stride != 4*image->width) + goto err; + + cb.dst = dst->win32.dc; + cb.data = image->data; + + cb.bi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER); + cb.bi.bmiHeader.biWidth = image->width; + cb.bi.bmiHeader.biHeight = -image->height; + cb.bi.bmiHeader.biSizeImage = 0; + cb.bi.bmiHeader.biXPelsPerMeter = PELS_72DPI; + cb.bi.bmiHeader.biYPelsPerMeter = PELS_72DPI; + cb.bi.bmiHeader.biPlanes = 1; + cb.bi.bmiHeader.biBitCount = 32; + cb.bi.bmiHeader.biCompression = BI_RGB; + cb.bi.bmiHeader.biClrUsed = 0; + cb.bi.bmiHeader.biClrImportant = 0; + + cb.tx += cb.limit.x; + cb.ty += cb.limit.y; + status = CAIRO_STATUS_SUCCESS; + if (! _cairo_boxes_for_each_box (boxes, upload_box, &cb)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_win32_display_surface_discard_fallback (dst); +err: + if (&image->base != surface) + _cairo_surface_release_source_image (surface, image, image_extra); + + return status; +} + +static cairo_status_t +alpha_blend_boxes (cairo_win32_display_surface_t *dst, + const cairo_pattern_t *source, + cairo_boxes_t *boxes, + uint8_t alpha) +{ + const cairo_surface_pattern_t *pattern; + struct copy_box cb; + cairo_surface_t *surface; + cairo_win32_display_surface_t *src; + cairo_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (source->type != CAIRO_PATTERN_TYPE_SURFACE) + return CAIRO_INT_STATUS_UNSUPPORTED; + + pattern = (const cairo_surface_pattern_t *) source; + surface = _cairo_surface_get_source (pattern->surface, &cb.limit); + if (surface->type == CAIRO_SURFACE_TYPE_IMAGE) { + surface = to_image_surface(surface)->parent; + if (surface == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + } + if (surface->type != CAIRO_SURFACE_TYPE_WIN32) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (! _cairo_matrix_is_integer_translation (&source->matrix, + &cb.tx, &cb.ty)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + src = to_win32_display_surface (surface); + cb.dst = dst->win32.dc; + cb.src = src->win32.dc; + + /* First check that the data is entirely within the image */ + if (! _cairo_boxes_for_each_box (boxes, source_contains_box, &cb)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = __cairo_surface_flush (&src->win32.base, 0); + if (status) + return status; + + cb.bf.BlendOp = AC_SRC_OVER; + cb.bf.BlendFlags = 0; + cb.bf.SourceConstantAlpha = alpha; + cb.bf.AlphaFormat = (src->win32.format == CAIRO_FORMAT_ARGB32) ? AC_SRC_ALPHA : 0; + cb.alpha_blend = to_win32_device(dst->win32.base.device)->alpha_blend; + + cb.tx += cb.limit.x; + cb.ty += cb.limit.y; + status = CAIRO_STATUS_SUCCESS; + if (! _cairo_boxes_for_each_box (boxes, alpha_box, &cb)) + status = CAIRO_INT_STATUS_UNSUPPORTED; + + _cairo_win32_display_surface_discard_fallback (dst); + return status; +} + +static cairo_bool_t +can_alpha_blend (cairo_win32_display_surface_t *dst) +{ + if ((dst->win32.flags & CAIRO_WIN32_SURFACE_CAN_ALPHABLEND) == 0) + return FALSE; + + return to_win32_device(dst->win32.base.device)->alpha_blend != NULL; +} + +static cairo_status_t +draw_boxes (cairo_composite_rectangles_t *composite, + cairo_boxes_t *boxes) +{ + cairo_win32_display_surface_t *dst = to_win32_display_surface(composite->surface); + cairo_operator_t op = composite->op; + const cairo_pattern_t *src = &composite->source_pattern.base; + cairo_int_status_t status; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (boxes->num_boxes == 0 && composite->is_bounded) + return CAIRO_STATUS_SUCCESS; + + if (!boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (op == CAIRO_OPERATOR_CLEAR) + op = CAIRO_OPERATOR_SOURCE; + + if (op == CAIRO_OPERATOR_OVER && + _cairo_pattern_is_opaque (src, &composite->bounded)) + op = CAIRO_OPERATOR_SOURCE; + + if (dst->win32.base.is_clear && + (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ADD)) + op = CAIRO_OPERATOR_SOURCE; + + if (op == CAIRO_OPERATOR_SOURCE) { + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (src->type == CAIRO_PATTERN_TYPE_SURFACE) { + status = copy_boxes (dst, src, boxes); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) + status = upload_boxes (dst, src, boxes); + } else if (src->type == CAIRO_PATTERN_TYPE_SOLID) { + status = fill_boxes (dst, src, boxes); + } + return status; + } + + if (op == CAIRO_OPERATOR_OVER && can_alpha_blend (dst)) + return alpha_blend_boxes (dst, src, boxes, 255); + + return CAIRO_INT_STATUS_UNSUPPORTED; +} + +static cairo_status_t +opacity_boxes (cairo_composite_rectangles_t *composite, + cairo_boxes_t *boxes) +{ + cairo_win32_display_surface_t *dst = to_win32_display_surface(composite->surface); + cairo_operator_t op = composite->op; + const cairo_pattern_t *src = &composite->source_pattern.base; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + if (composite->mask_pattern.base.type != CAIRO_PATTERN_TYPE_SOLID) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (boxes->num_boxes == 0 && composite->is_bounded) + return CAIRO_STATUS_SUCCESS; + + if (!boxes->is_pixel_aligned) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (op != CAIRO_OPERATOR_OVER) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (!can_alpha_blend (dst)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return alpha_blend_boxes (dst, src, boxes, + composite->mask_pattern.solid.color.alpha_short >> 8); +} + +/* high-level compositor interface */ + +static cairo_bool_t check_blit (cairo_composite_rectangles_t *composite) +{ + cairo_win32_display_surface_t *dst; + + if (composite->clip->path) + return FALSE; + + dst = to_win32_display_surface (composite->surface); + if (dst->fallback) + return FALSE; + + if (dst->win32.format != CAIRO_FORMAT_RGB24) + return FALSE; + + if (dst->win32.flags & CAIRO_WIN32_SURFACE_CAN_BITBLT) + return TRUE; + + return dst->image == NULL; +} + +static cairo_int_status_t +_cairo_win32_gdi_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + if (check_blit (composite)) { + cairo_boxes_t boxes; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_clip_steal_boxes (composite->clip, &boxes); + status = draw_boxes (composite, &boxes); + _cairo_clip_unsteal_boxes (composite->clip, &boxes); + } + + return status; +} + +static cairo_int_status_t +_cairo_win32_gdi_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) +{ + cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; + + if (check_blit (composite)) { + cairo_boxes_t boxes; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_clip_steal_boxes (composite->clip, &boxes); + status = opacity_boxes (composite, &boxes); + _cairo_clip_unsteal_boxes (composite->clip, &boxes); + } + + return status; +} + +static cairo_int_status_t +_cairo_win32_gdi_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (check_blit (composite) && + _cairo_path_fixed_stroke_is_rectilinear (path)) { + cairo_boxes_t boxes; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_boxes_init_with_clip (&boxes, composite->clip); + status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path, + style, + ctm, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = draw_boxes (composite, &boxes); + _cairo_boxes_fini (&boxes); + } + + return status; +} + +static cairo_int_status_t +_cairo_win32_gdi_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (check_blit (composite) && + _cairo_path_fixed_fill_is_rectilinear (path)) { + cairo_boxes_t boxes; + + TRACE ((stderr, "%s\n", __FUNCTION__)); + _cairo_boxes_init_with_clip (&boxes, composite->clip); + status = _cairo_path_fixed_fill_rectilinear_to_boxes (path, + fill_rule, + antialias, + &boxes); + if (likely (status == CAIRO_INT_STATUS_SUCCESS)) + status = draw_boxes (composite, &boxes); + _cairo_boxes_fini (&boxes); + } + + return status; +} + +static cairo_bool_t check_glyphs (cairo_composite_rectangles_t *composite, + cairo_scaled_font_t *scaled_font) +{ + if (! _cairo_clip_is_region (composite->clip)) + return FALSE; + + if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32) + return FALSE; + + if (! _cairo_pattern_is_opaque_solid (&composite->source_pattern.base)) + return FALSE; + + return (composite->op == CAIRO_OPERATOR_CLEAR || + composite->op == CAIRO_OPERATOR_SOURCE || + composite->op == CAIRO_OPERATOR_OVER); +} + +static cairo_int_status_t +_cairo_win32_gdi_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t*composite, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_int_status_t status; + + status = CAIRO_INT_STATUS_UNSUPPORTED; + if (check_blit (composite) && check_glyphs (composite, scaled_font)) { + cairo_win32_display_surface_t *dst = to_win32_display_surface (composite->surface); + + TRACE ((stderr, "%s\n", __FUNCTION__)); + status = _cairo_win32_display_surface_set_clip(dst, composite->clip); + if (status) + return status; + + status = _cairo_win32_surface_emit_glyphs (&dst->win32, + &composite->source_pattern.base, + glyphs, + num_glyphs, + scaled_font, + TRUE); + + _cairo_win32_display_surface_unset_clip (dst); + } + + return status; +} + +const cairo_compositor_t * +_cairo_win32_gdi_compositor_get (void) +{ + static cairo_compositor_t compositor; + + if (compositor.delegate == NULL) { + compositor.delegate = &_cairo_fallback_compositor; + + compositor.paint = _cairo_win32_gdi_compositor_paint; + compositor.mask = _cairo_win32_gdi_compositor_mask; + compositor.fill = _cairo_win32_gdi_compositor_fill; + compositor.stroke = _cairo_win32_gdi_compositor_stroke; + compositor.glyphs = _cairo_win32_gdi_compositor_glyphs; + } + + return &compositor; +} diff --git a/src/win32/cairo-win32-printing-surface.c b/src/win32/cairo-win32-printing-surface.c new file mode 100644 index 000000000..6005cb53d --- /dev/null +++ b/src/win32/cairo-win32-printing-surface.c @@ -0,0 +1,1924 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2007, 2008 Adrian Johnson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Adrian Johnson. + * + * Contributor(s): + * Adrian Johnson + * Vladimir Vukicevic + */ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairoint.h" + +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-paginated-private.h" + +#include "cairo-clip-private.h" +#include "cairo-win32-private.h" +#include "cairo-recording-surface-inline.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-image-info-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-surface-backend-private.h" +#include "cairo-surface-clipper-private.h" + +#include + +#if !defined(POSTSCRIPT_IDENTIFY) +# define POSTSCRIPT_IDENTIFY 0x1015 +#endif + +#if !defined(PSIDENT_GDICENTRIC) +# define PSIDENT_GDICENTRIC 0x0000 +#endif + +#if !defined(GET_PS_FEATURESETTING) +# define GET_PS_FEATURESETTING 0x1019 +#endif + +#if !defined(FEATURESETTING_PSLEVEL) +# define FEATURESETTING_PSLEVEL 0x0002 +#endif + +#if !defined(GRADIENT_FILL_RECT_H) +# define GRADIENT_FILL_RECT_H 0x00 +#endif + +#if !defined(CHECKJPEGFORMAT) +# define CHECKJPEGFORMAT 0x1017 +#endif + +#if !defined(CHECKPNGFORMAT) +# define CHECKPNGFORMAT 0x1018 +#endif + +#define PELS_72DPI ((LONG)(72. / 0.0254)) + +static const char *_cairo_win32_printing_supported_mime_types[] = +{ + CAIRO_MIME_TYPE_JPEG, + CAIRO_MIME_TYPE_PNG, + NULL +}; + +static const cairo_surface_backend_t cairo_win32_printing_surface_backend; +static const cairo_paginated_surface_backend_t cairo_win32_surface_paginated_backend; + +static void +_cairo_win32_printing_surface_init_ps_mode (cairo_win32_printing_surface_t *surface) +{ + DWORD word; + INT ps_feature, ps_level; + + word = PSIDENT_GDICENTRIC; + if (ExtEscape (surface->win32.dc, POSTSCRIPT_IDENTIFY, sizeof(DWORD), (char *)&word, 0, (char *)NULL) <= 0) + return; + + ps_feature = FEATURESETTING_PSLEVEL; + if (ExtEscape (surface->win32.dc, GET_PS_FEATURESETTING, sizeof(INT), + (char *)&ps_feature, sizeof(INT), (char *)&ps_level) <= 0) + return; + + if (ps_level >= 3) + surface->win32.flags |= CAIRO_WIN32_SURFACE_CAN_RECT_GRADIENT; +} + +static void +_cairo_win32_printing_surface_init_image_support (cairo_win32_printing_surface_t *surface) +{ + DWORD word; + + word = CHECKJPEGFORMAT; + if (ExtEscape(surface->win32.dc, QUERYESCSUPPORT, sizeof(word), (char *)&word, 0, (char *)NULL) > 0) + surface->win32.flags |= CAIRO_WIN32_SURFACE_CAN_CHECK_JPEG; + + word = CHECKPNGFORMAT; + if (ExtEscape(surface->win32.dc, QUERYESCSUPPORT, sizeof(word), (char *)&word, 0, (char *)NULL) > 0) + surface->win32.flags |= CAIRO_WIN32_SURFACE_CAN_CHECK_PNG; +} + +/* When creating an EMF file, ExtTextOut with ETO_GLYPH_INDEX does not + * work unless the GDI function GdiInitializeLanguagePack() has been + * called. + * + * http://m-a-tech.blogspot.com/2009/04/emf-buffer-idiocracy.html + * + * The only information I could find on the how to use this + * undocumented function is the use in: + * + * http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/render_process.cc?view=markup + * + * to solve the same problem. The above code first checks if LPK.DLL + * is already loaded. If it is not it calls + * GdiInitializeLanguagePack() using the prototype + * BOOL GdiInitializeLanguagePack (int) + * and argument 0. + */ +static void +_cairo_win32_printing_surface_init_language_pack (cairo_win32_printing_surface_t *surface) +{ + typedef BOOL (WINAPI *gdi_init_lang_pack_func_t)(int); + gdi_init_lang_pack_func_t gdi_init_lang_pack; + HMODULE module; + + if (GetModuleHandleW (L"LPK.DLL")) + return; + + module = GetModuleHandleW (L"GDI32.DLL"); + if (module) { + gdi_init_lang_pack = (gdi_init_lang_pack_func_t) + GetProcAddress (module, "GdiInitializeLanguagePack"); + if (gdi_init_lang_pack) + gdi_init_lang_pack (0); + } +} + +static cairo_int_status_t +analyze_surface_pattern_transparency (cairo_surface_pattern_t *pattern) +{ + cairo_image_surface_t *image; + void *image_extra; + cairo_int_status_t status; + cairo_image_transparency_t transparency; + + status = _cairo_surface_acquire_source_image (pattern->surface, + &image, + &image_extra); + if (status) + return status; + + transparency = _cairo_image_analyze_transparency (image); + switch (transparency) { + case CAIRO_IMAGE_UNKNOWN: + ASSERT_NOT_REACHED; + case CAIRO_IMAGE_IS_OPAQUE: + status = CAIRO_STATUS_SUCCESS; + break; + + case CAIRO_IMAGE_HAS_BILEVEL_ALPHA: + case CAIRO_IMAGE_HAS_ALPHA: + status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; + break; + } + + _cairo_surface_release_source_image (pattern->surface, image, image_extra); + + return status; +} + +static cairo_bool_t +surface_pattern_supported (const cairo_surface_pattern_t *pattern) +{ + if (_cairo_surface_is_recording (pattern->surface)) + return TRUE; + + if (cairo_surface_get_type (pattern->surface) != CAIRO_SURFACE_TYPE_WIN32 && + pattern->surface->backend->acquire_source_image == NULL) + { + return FALSE; + } + + return TRUE; +} + +static cairo_bool_t +pattern_supported (cairo_win32_printing_surface_t *surface, const cairo_pattern_t *pattern) +{ + if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) + return TRUE; + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) + return surface_pattern_supported ((const cairo_surface_pattern_t *) pattern); + + if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) + return surface->win32.flags & CAIRO_WIN32_SURFACE_CAN_RECT_GRADIENT; + + return FALSE; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_analyze_operation (cairo_win32_printing_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern) +{ + if (! pattern_supported (surface, pattern)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (!(op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_OVER || + op == CAIRO_OPERATOR_CLEAR)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; + + if ( _cairo_surface_is_recording (surface_pattern->surface)) + return CAIRO_INT_STATUS_ANALYZE_RECORDING_SURFACE_PATTERN; + } + + if (op == CAIRO_OPERATOR_SOURCE || + op == CAIRO_OPERATOR_CLEAR) + return CAIRO_STATUS_SUCCESS; + + /* CAIRO_OPERATOR_OVER is only supported for opaque patterns. If + * the pattern contains transparency, we return + * CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY to the analysis + * surface. If the analysis surface determines that there is + * anything drawn under this operation, a fallback image will be + * used. Otherwise the operation will be replayed during the + * render stage and we blend the transarency into the white + * background to convert the pattern to opaque. + */ + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; + + return analyze_surface_pattern_transparency (surface_pattern); + } + + if (_cairo_pattern_is_opaque (pattern, NULL)) + return CAIRO_STATUS_SUCCESS; + else + return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; +} + +static cairo_bool_t +_cairo_win32_printing_surface_operation_supported (cairo_win32_printing_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *pattern) +{ + if (_cairo_win32_printing_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED) + return TRUE; + else + return FALSE; +} + +static void +_cairo_win32_printing_surface_init_clear_color (cairo_win32_printing_surface_t *surface, + cairo_solid_pattern_t *color) +{ + if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) + _cairo_pattern_init_solid (color, CAIRO_COLOR_WHITE); + else + _cairo_pattern_init_solid (color, CAIRO_COLOR_BLACK); +} + +static COLORREF +_cairo_win32_printing_surface_flatten_transparency (cairo_win32_printing_surface_t *surface, + const cairo_color_t *color) +{ + COLORREF c; + BYTE red, green, blue; + + red = color->red_short >> 8; + green = color->green_short >> 8; + blue = color->blue_short >> 8; + + if (!CAIRO_COLOR_IS_OPAQUE(color)) { + if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) { + /* Blend into white */ + uint8_t one_minus_alpha = 255 - (color->alpha_short >> 8); + + red = (color->red_short >> 8) + one_minus_alpha; + green = (color->green_short >> 8) + one_minus_alpha; + blue = (color->blue_short >> 8) + one_minus_alpha; + } else { + /* Blend into black */ + red = (color->red_short >> 8); + green = (color->green_short >> 8); + blue = (color->blue_short >> 8); + } + } + c = RGB (red, green, blue); + + return c; +} + +static cairo_status_t +_cairo_win32_printing_surface_select_solid_brush (cairo_win32_printing_surface_t *surface, + const cairo_pattern_t *source) +{ + cairo_solid_pattern_t *pattern = (cairo_solid_pattern_t *) source; + COLORREF color; + + color = _cairo_win32_printing_surface_flatten_transparency (surface, + &pattern->color); + surface->brush = CreateSolidBrush (color); + if (!surface->brush) + return _cairo_win32_print_gdi_error ("_cairo_win32_surface_select_solid_brush(CreateSolidBrush)"); + surface->old_brush = SelectObject (surface->win32.dc, surface->brush); + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_win32_printing_surface_done_solid_brush (cairo_win32_printing_surface_t *surface) +{ + if (surface->old_brush) { + SelectObject (surface->win32.dc, surface->old_brush); + DeleteObject (surface->brush); + surface->old_brush = NULL; + } +} + +static cairo_status_t +_cairo_win32_printing_surface_get_ctm_clip_box (cairo_win32_printing_surface_t *surface, + RECT *clip) +{ + XFORM xform; + + _cairo_matrix_to_win32_xform (&surface->ctm, &xform); + if (!ModifyWorldTransform (surface->win32.dc, &xform, MWT_LEFTMULTIPLY)) + return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_get_clip_box:ModifyWorldTransform"); + GetClipBox (surface->win32.dc, clip); + + _cairo_matrix_to_win32_xform (&surface->gdi_ctm, &xform); + if (!SetWorldTransform (surface->win32.dc, &xform)) + return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_get_clip_box:SetWorldTransform"); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_paint_solid_pattern (cairo_win32_printing_surface_t *surface, + const cairo_pattern_t *pattern) +{ + RECT clip; + cairo_status_t status; + + GetClipBox (surface->win32.dc, &clip); + status = _cairo_win32_printing_surface_select_solid_brush (surface, pattern); + if (status) + return status; + + FillRect (surface->win32.dc, &clip, surface->brush); + _cairo_win32_printing_surface_done_solid_brush (surface); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_paint_recording_pattern (cairo_win32_printing_surface_t *surface, + cairo_surface_pattern_t *pattern) +{ + cairo_content_t old_content; + cairo_matrix_t old_ctm; + cairo_bool_t old_has_ctm; + cairo_rectangle_int_t recording_extents; + cairo_status_t status; + cairo_extend_t extend; + cairo_matrix_t p2d; + XFORM xform; + int x_tile, y_tile, left, right, top, bottom; + RECT clip; + cairo_recording_surface_t *recording_surface = (cairo_recording_surface_t *) pattern->surface; + cairo_box_t bbox; + + extend = cairo_pattern_get_extend (&pattern->base); + + p2d = pattern->base.matrix; + status = cairo_matrix_invert (&p2d); + /* _cairo_pattern_set_matrix guarantees invertibility */ + assert (status == CAIRO_STATUS_SUCCESS); + + old_ctm = surface->ctm; + old_has_ctm = surface->has_ctm; + cairo_matrix_multiply (&p2d, &p2d, &surface->ctm); + surface->ctm = p2d; + SaveDC (surface->win32.dc); + _cairo_matrix_to_win32_xform (&p2d, &xform); + + status = _cairo_recording_surface_get_bbox (recording_surface, &bbox, NULL); + if (status) + return status; + + _cairo_box_round_to_rectangle (&bbox, &recording_extents); + + status = _cairo_win32_printing_surface_get_ctm_clip_box (surface, &clip); + if (status) + return status; + + if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { + left = floor (clip.left / _cairo_fixed_to_double (bbox.p2.x - bbox.p1.x)); + right = ceil (clip.right / _cairo_fixed_to_double (bbox.p2.x - bbox.p1.x)); + top = floor (clip.top / _cairo_fixed_to_double (bbox.p2.y - bbox.p1.y)); + bottom = ceil (clip.bottom / _cairo_fixed_to_double (bbox.p2.y - bbox.p1.y)); + } else { + left = 0; + right = 1; + top = 0; + bottom = 1; + } + + old_content = surface->content; + if (recording_surface->base.content == CAIRO_CONTENT_COLOR) { + surface->content = CAIRO_CONTENT_COLOR; + status = _cairo_win32_printing_surface_paint_solid_pattern (surface, + &_cairo_pattern_black.base); + if (status) + return status; + } + + for (y_tile = top; y_tile < bottom; y_tile++) { + for (x_tile = left; x_tile < right; x_tile++) { + cairo_matrix_t m; + double x, y; + + SaveDC (surface->win32.dc); + m = p2d; + cairo_matrix_translate (&m, + x_tile*recording_extents.width, + y_tile*recording_extents.height); + if (extend == CAIRO_EXTEND_REFLECT) { + if (x_tile % 2) { + cairo_matrix_translate (&m, recording_extents.width, 0); + cairo_matrix_scale (&m, -1, 1); + } + if (y_tile % 2) { + cairo_matrix_translate (&m, 0, recording_extents.height); + cairo_matrix_scale (&m, 1, -1); + } + } + surface->ctm = m; + surface->has_ctm = !_cairo_matrix_is_identity (&surface->ctm); + + /* Set clip path around bbox of the pattern. */ + BeginPath (surface->win32.dc); + + x = 0; + y = 0; + cairo_matrix_transform_point (&surface->ctm, &x, &y); + MoveToEx (surface->win32.dc, (int) x, (int) y, NULL); + + x = recording_extents.width; + y = 0; + cairo_matrix_transform_point (&surface->ctm, &x, &y); + LineTo (surface->win32.dc, (int) x, (int) y); + + x = recording_extents.width; + y = recording_extents.height; + cairo_matrix_transform_point (&surface->ctm, &x, &y); + LineTo (surface->win32.dc, (int) x, (int) y); + + x = 0; + y = recording_extents.height; + cairo_matrix_transform_point (&surface->ctm, &x, &y); + LineTo (surface->win32.dc, (int) x, (int) y); + + CloseFigure (surface->win32.dc); + EndPath (surface->win32.dc); + SelectClipPath (surface->win32.dc, RGN_AND); + + SaveDC (surface->win32.dc); /* Allow clip path to be reset during replay */ + status = _cairo_recording_surface_replay_region (&recording_surface->base, NULL, + &surface->win32.base, + CAIRO_RECORDING_REGION_NATIVE); + assert (status != CAIRO_INT_STATUS_UNSUPPORTED); + /* Restore both the clip save and our earlier path SaveDC */ + RestoreDC (surface->win32.dc, -2); + + if (status) + return status; + } + } + + surface->content = old_content; + surface->ctm = old_ctm; + surface->has_ctm = old_has_ctm; + RestoreDC (surface->win32.dc, -1); + + return status; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_check_jpeg (cairo_win32_printing_surface_t *surface, + cairo_surface_t *source, + const unsigned char **data, + unsigned long *length, + cairo_image_info_t *info) +{ + const unsigned char *mime_data; + unsigned long mime_data_length; + cairo_int_status_t status; + DWORD result; + + if (!(surface->win32.flags & CAIRO_WIN32_SURFACE_CAN_CHECK_JPEG)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_JPEG, + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_jpeg_info (info, mime_data, mime_data_length); + if (status) + return status; + + result = 0; + if (ExtEscape(surface->win32.dc, CHECKJPEGFORMAT, mime_data_length, (char *) mime_data, + sizeof(result), (char *) &result) <= 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (result != 1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + *data = mime_data; + *length = mime_data_length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_check_png (cairo_win32_printing_surface_t *surface, + cairo_surface_t *source, + const unsigned char **data, + unsigned long *length, + cairo_image_info_t *info) +{ + const unsigned char *mime_data; + unsigned long mime_data_length; + + cairo_int_status_t status; + DWORD result; + + if (!(surface->win32.flags & CAIRO_WIN32_SURFACE_CAN_CHECK_PNG)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + cairo_surface_get_mime_data (source, CAIRO_MIME_TYPE_PNG, + &mime_data, &mime_data_length); + if (mime_data == NULL) + return CAIRO_INT_STATUS_UNSUPPORTED; + + status = _cairo_image_info_get_png_info (info, mime_data, mime_data_length); + if (status) + return status; + + result = 0; + if (ExtEscape(surface->win32.dc, CHECKPNGFORMAT, mime_data_length, (char *) mime_data, + sizeof(result), (char *) &result) <= 0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (result != 1) + return CAIRO_INT_STATUS_UNSUPPORTED; + + *data = mime_data; + *length = mime_data_length; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_paint_image_pattern (cairo_win32_printing_surface_t *surface, + cairo_surface_pattern_t *pattern) +{ + cairo_status_t status; + cairo_extend_t extend; + cairo_image_surface_t *image; + void *image_extra; + cairo_image_surface_t *opaque_image = NULL; + BITMAPINFO bi; + cairo_matrix_t m; + int oldmode; + XFORM xform; + int x_tile, y_tile, left, right, top, bottom; + RECT clip; + const cairo_color_t *background_color; + const unsigned char *mime_data; + unsigned long mime_size; + cairo_image_info_t mime_info; + cairo_bool_t use_mime; + DWORD mime_type; + + /* If we can't use StretchDIBits with this surface, we can't do anything + * here. + */ + if (!(surface->win32.flags & CAIRO_WIN32_SURFACE_CAN_STRETCHDIB)) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) + background_color = CAIRO_COLOR_WHITE; + else + background_color = CAIRO_COLOR_BLACK; + + extend = cairo_pattern_get_extend (&pattern->base); + + status = _cairo_surface_acquire_source_image (pattern->surface, + &image, &image_extra); + if (status) + return status; + + if (image->base.status) { + status = image->base.status; + goto CLEANUP_IMAGE; + } + + if (image->width == 0 || image->height == 0) { + status = CAIRO_STATUS_SUCCESS; + goto CLEANUP_IMAGE; + } + + mime_type = BI_JPEG; + status = _cairo_win32_printing_surface_check_jpeg (surface, + pattern->surface, + &mime_data, + &mime_size, + &mime_info); + if (status == CAIRO_INT_STATUS_UNSUPPORTED) { + mime_type = BI_PNG; + status = _cairo_win32_printing_surface_check_png (surface, + pattern->surface, + &mime_data, + &mime_size, + &mime_info); + } + if (_cairo_status_is_error (status)) + return status; + + use_mime = (status == CAIRO_STATUS_SUCCESS); + + if (!use_mime && image->format != CAIRO_FORMAT_RGB24) { + cairo_surface_t *opaque_surface; + cairo_surface_pattern_t image_pattern; + cairo_solid_pattern_t background_pattern; + + opaque_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + image->width, + image->height); + if (opaque_surface->status) { + status = opaque_surface->status; + goto CLEANUP_OPAQUE_IMAGE; + } + + _cairo_pattern_init_solid (&background_pattern, + background_color); + status = _cairo_surface_paint (opaque_surface, + CAIRO_OPERATOR_SOURCE, + &background_pattern.base, + NULL); + if (status) + goto CLEANUP_OPAQUE_IMAGE; + + _cairo_pattern_init_for_surface (&image_pattern, &image->base); + status = _cairo_surface_paint (opaque_surface, + CAIRO_OPERATOR_OVER, + &image_pattern.base, + NULL); + _cairo_pattern_fini (&image_pattern.base); + if (status) + goto CLEANUP_OPAQUE_IMAGE; + + opaque_image = (cairo_image_surface_t *) opaque_surface; + } else { + opaque_image = image; + } + + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bi.bmiHeader.biWidth = use_mime ? mime_info.width : opaque_image->width; + bi.bmiHeader.biHeight = use_mime ? - mime_info.height : -opaque_image->height; + bi.bmiHeader.biSizeImage = use_mime ? mime_size : 0; + bi.bmiHeader.biXPelsPerMeter = PELS_72DPI; + bi.bmiHeader.biYPelsPerMeter = PELS_72DPI; + bi.bmiHeader.biPlanes = 1; + bi.bmiHeader.biBitCount = 32; + bi.bmiHeader.biCompression = use_mime ? mime_type : BI_RGB; + bi.bmiHeader.biClrUsed = 0; + bi.bmiHeader.biClrImportant = 0; + + m = pattern->base.matrix; + status = cairo_matrix_invert (&m); + /* _cairo_pattern_set_matrix guarantees invertibility */ + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_multiply (&m, &m, &surface->ctm); + cairo_matrix_multiply (&m, &m, &surface->gdi_ctm); + SaveDC (surface->win32.dc); + _cairo_matrix_to_win32_xform (&m, &xform); + + if (! SetWorldTransform (surface->win32.dc, &xform)) { + status = _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_paint_image_pattern"); + goto CLEANUP_OPAQUE_IMAGE; + } + + oldmode = SetStretchBltMode(surface->win32.dc, HALFTONE); + + GetClipBox (surface->win32.dc, &clip); + if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { + left = floor ( clip.left / (double) opaque_image->width); + right = ceil (clip.right / (double) opaque_image->width); + top = floor (clip.top / (double) opaque_image->height); + bottom = ceil (clip.bottom / (double) opaque_image->height); + } else { + left = 0; + right = 1; + top = 0; + bottom = 1; + } + + for (y_tile = top; y_tile < bottom; y_tile++) { + for (x_tile = left; x_tile < right; x_tile++) { + if (!StretchDIBits (surface->win32.dc, + x_tile*opaque_image->width, + y_tile*opaque_image->height, + opaque_image->width, + opaque_image->height, + 0, + 0, + use_mime ? mime_info.width : opaque_image->width, + use_mime ? mime_info.height : opaque_image->height, + use_mime ? mime_data : opaque_image->data, + &bi, + DIB_RGB_COLORS, + SRCCOPY)) + { + status = _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_paint(StretchDIBits)"); + goto CLEANUP_OPAQUE_IMAGE; + } + } + } + SetStretchBltMode(surface->win32.dc, oldmode); + RestoreDC (surface->win32.dc, -1); + +CLEANUP_OPAQUE_IMAGE: + if (opaque_image != image) + cairo_surface_destroy (&opaque_image->base); +CLEANUP_IMAGE: + _cairo_surface_release_source_image (pattern->surface, image, image_extra); + + return status; +} + +static cairo_status_t +_cairo_win32_printing_surface_paint_surface_pattern (cairo_win32_printing_surface_t *surface, + cairo_surface_pattern_t *pattern) +{ + if (_cairo_surface_is_recording (pattern->surface)) { + return _cairo_win32_printing_surface_paint_recording_pattern (surface, + pattern); + } else { + return _cairo_win32_printing_surface_paint_image_pattern (surface, + pattern); + } +} + +static void +vertex_set_color (TRIVERTEX *vert, cairo_color_stop_t *color) +{ + /* MSDN says that the range here is 0x0000 .. 0xff00; + * that may well be a typo, but just chop the low bits + * here. */ + vert->Alpha = 0xff00; + vert->Red = color->red_short & 0xff00; + vert->Green = color->green_short & 0xff00; + vert->Blue = color->blue_short & 0xff00; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_paint_linear_pattern (cairo_win32_printing_surface_t *surface, + cairo_linear_pattern_t *pattern) +{ + TRIVERTEX *vert; + GRADIENT_RECT *rect; + RECT clip; + XFORM xform; + int i, num_stops; + cairo_matrix_t mat, rot; + double p1x, p1y, p2x, p2y, xd, yd, d, sn, cs; + cairo_extend_t extend; + int range_start, range_stop, num_ranges, num_rects, stop; + int total_verts, total_rects; + cairo_status_t status; + + extend = cairo_pattern_get_extend (&pattern->base.base); + SaveDC (surface->win32.dc); + + mat = pattern->base.base.matrix; + status = cairo_matrix_invert (&mat); + /* _cairo_pattern_set_matrix guarantees invertibility */ + assert (status == CAIRO_STATUS_SUCCESS); + + cairo_matrix_multiply (&mat, &surface->ctm, &mat); + + p1x = pattern->pd1.x; + p1y = pattern->pd1.y; + p2x = pattern->pd2.x; + p2y = pattern->pd2.y; + cairo_matrix_translate (&mat, p1x, p1y); + + xd = p2x - p1x; + yd = p2y - p1y; + d = sqrt (xd*xd + yd*yd); + sn = yd/d; + cs = xd/d; + cairo_matrix_init (&rot, + cs, sn, + -sn, cs, + 0, 0); + cairo_matrix_multiply (&mat, &rot, &mat); + + _cairo_matrix_to_win32_xform (&mat, &xform); + + if (!SetWorldTransform (surface->win32.dc, &xform)) + return _cairo_win32_print_gdi_error ("_win32_printing_surface_paint_linear_pattern:SetWorldTransform2"); + + GetClipBox (surface->win32.dc, &clip); + + if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { + range_start = floor (clip.left / d); + range_stop = ceil (clip.right / d); + } else { + range_start = 0; + range_stop = 1; + } + num_ranges = range_stop - range_start; + num_stops = pattern->base.n_stops; + num_rects = num_stops - 1; + + /* Add an extra four points and two rectangles for EXTEND_PAD */ + vert = malloc (sizeof (TRIVERTEX) * (num_rects*2*num_ranges + 4)); + rect = malloc (sizeof (GRADIENT_RECT) * (num_rects*num_ranges + 2)); + + for (i = 0; i < num_ranges*num_rects; i++) { + vert[i*2].y = (LONG) clip.top; + if (i%num_rects == 0) { + stop = 0; + if (extend == CAIRO_EXTEND_REFLECT && (range_start+(i/num_rects))%2) + stop = num_rects; + vert[i*2].x = (LONG)(d*(range_start + i/num_rects)); + vertex_set_color (&vert[i*2], &pattern->base.stops[stop].color); + } else { + vert[i*2].x = vert[i*2-1].x; + vert[i*2].Red = vert[i*2-1].Red; + vert[i*2].Green = vert[i*2-1].Green; + vert[i*2].Blue = vert[i*2-1].Blue; + vert[i*2].Alpha = vert[i*2-1].Alpha; + } + + stop = i%num_rects + 1; + vert[i*2+1].x = (LONG)(d*(range_start + i/num_rects + pattern->base.stops[stop].offset)); + vert[i*2+1].y = (LONG) clip.bottom; + if (extend == CAIRO_EXTEND_REFLECT && (range_start+(i/num_rects))%2) + stop = num_rects - stop; + vertex_set_color (&vert[i*2+1], &pattern->base.stops[stop].color); + + rect[i].UpperLeft = i*2; + rect[i].LowerRight = i*2 + 1; + } + total_verts = 2*num_ranges*num_rects; + total_rects = num_ranges*num_rects; + + if (extend == CAIRO_EXTEND_PAD) { + vert[i*2].x = vert[i*2-1].x; + vert[i*2].y = (LONG) clip.top; + vert[i*2].Red = vert[i*2-1].Red; + vert[i*2].Green = vert[i*2-1].Green; + vert[i*2].Blue = vert[i*2-1].Blue; + vert[i*2].Alpha = 0xff00; + vert[i*2+1].x = clip.right; + vert[i*2+1].y = (LONG) clip.bottom; + vert[i*2+1].Red = vert[i*2-1].Red; + vert[i*2+1].Green = vert[i*2-1].Green; + vert[i*2+1].Blue = vert[i*2-1].Blue; + vert[i*2+1].Alpha = 0xff00; + rect[i].UpperLeft = i*2; + rect[i].LowerRight = i*2 + 1; + + i++; + + vert[i*2].x = clip.left; + vert[i*2].y = (LONG) clip.top; + vert[i*2].Red = vert[0].Red; + vert[i*2].Green = vert[0].Green; + vert[i*2].Blue = vert[0].Blue; + vert[i*2].Alpha = 0xff00; + vert[i*2+1].x = vert[0].x; + vert[i*2+1].y = (LONG) clip.bottom; + vert[i*2+1].Red = vert[0].Red; + vert[i*2+1].Green = vert[0].Green; + vert[i*2+1].Blue = vert[0].Blue; + vert[i*2+1].Alpha = 0xff00; + rect[i].UpperLeft = i*2; + rect[i].LowerRight = i*2 + 1; + + total_verts += 4; + total_rects += 2; + } + + if (!GradientFill (surface->win32.dc, + vert, total_verts, + rect, total_rects, + GRADIENT_FILL_RECT_H)) + return _cairo_win32_print_gdi_error ("_win32_printing_surface_paint_linear_pattern:GradientFill"); + + free (rect); + free (vert); + RestoreDC (surface->win32.dc, -1); + + return 0; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_paint_pattern (cairo_win32_printing_surface_t *surface, + const cairo_pattern_t *pattern) +{ + cairo_status_t status; + + switch (pattern->type) { + case CAIRO_PATTERN_TYPE_SOLID: + status = _cairo_win32_printing_surface_paint_solid_pattern (surface, pattern); + if (status) + return status; + break; + + case CAIRO_PATTERN_TYPE_SURFACE: + status = _cairo_win32_printing_surface_paint_surface_pattern (surface, + (cairo_surface_pattern_t *) pattern); + if (status) + return status; + break; + + case CAIRO_PATTERN_TYPE_LINEAR: + status = _cairo_win32_printing_surface_paint_linear_pattern (surface, (cairo_linear_pattern_t *) pattern); + if (status) + return status; + break; + + case CAIRO_PATTERN_TYPE_RADIAL: + return CAIRO_INT_STATUS_UNSUPPORTED; + break; + + case CAIRO_PATTERN_TYPE_MESH: + ASSERT_NOT_REACHED; + } + + return CAIRO_STATUS_SUCCESS; +} + +typedef struct _win32_print_path_info { + cairo_win32_printing_surface_t *surface; +} win32_path_info_t; + +static cairo_status_t +_cairo_win32_printing_surface_path_move_to (void *closure, + const cairo_point_t *point) +{ + win32_path_info_t *path_info = closure; + + if (path_info->surface->has_ctm) { + double x, y; + + x = _cairo_fixed_to_double (point->x); + y = _cairo_fixed_to_double (point->y); + cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); + MoveToEx (path_info->surface->win32.dc, (int) x, (int) y, NULL); + } else { + MoveToEx (path_info->surface->win32.dc, + _cairo_fixed_integer_part (point->x), + _cairo_fixed_integer_part (point->y), + NULL); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_path_line_to (void *closure, + const cairo_point_t *point) +{ + win32_path_info_t *path_info = closure; + + path_info->surface->path_empty = FALSE; + if (path_info->surface->has_ctm) { + double x, y; + + x = _cairo_fixed_to_double (point->x); + y = _cairo_fixed_to_double (point->y); + cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); + LineTo (path_info->surface->win32.dc, (int) x, (int) y); + } else { + LineTo (path_info->surface->win32.dc, + _cairo_fixed_integer_part (point->x), + _cairo_fixed_integer_part (point->y)); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_path_curve_to (void *closure, + const cairo_point_t *b, + const cairo_point_t *c, + const cairo_point_t *d) +{ + win32_path_info_t *path_info = closure; + POINT points[3]; + + path_info->surface->path_empty = FALSE; + if (path_info->surface->has_ctm) { + double x, y; + + x = _cairo_fixed_to_double (b->x); + y = _cairo_fixed_to_double (b->y); + cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); + points[0].x = (LONG) x; + points[0].y = (LONG) y; + + x = _cairo_fixed_to_double (c->x); + y = _cairo_fixed_to_double (c->y); + cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); + points[1].x = (LONG) x; + points[1].y = (LONG) y; + + x = _cairo_fixed_to_double (d->x); + y = _cairo_fixed_to_double (d->y); + cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); + points[2].x = (LONG) x; + points[2].y = (LONG) y; + } else { + points[0].x = _cairo_fixed_integer_part (b->x); + points[0].y = _cairo_fixed_integer_part (b->y); + points[1].x = _cairo_fixed_integer_part (c->x); + points[1].y = _cairo_fixed_integer_part (c->y); + points[2].x = _cairo_fixed_integer_part (d->x); + points[2].y = _cairo_fixed_integer_part (d->y); + } + PolyBezierTo (path_info->surface->win32.dc, points, 3); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_path_close_path (void *closure) +{ + win32_path_info_t *path_info = closure; + + CloseFigure (path_info->surface->win32.dc); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_emit_path (cairo_win32_printing_surface_t *surface, + const cairo_path_fixed_t *path) +{ + win32_path_info_t path_info; + + path_info.surface = surface; + return _cairo_path_fixed_interpret (path, + _cairo_win32_printing_surface_path_move_to, + _cairo_win32_printing_surface_path_line_to, + _cairo_win32_printing_surface_path_curve_to, + _cairo_win32_printing_surface_path_close_path, + &path_info); +} + +static cairo_int_status_t +_cairo_win32_printing_surface_show_page (void *abstract_surface) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + + /* Undo both SaveDC's that we did in start_page */ + RestoreDC (surface->win32.dc, -2); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_cairo_win32_printing_surface_clipper_intersect_clip_path (cairo_surface_clipper_t *clipper, + cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_win32_printing_surface_t *surface = cairo_container_of (clipper, + cairo_win32_printing_surface_t, + clipper); + cairo_status_t status; + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return CAIRO_STATUS_SUCCESS; + + if (path == NULL) { + RestoreDC (surface->win32.dc, -1); + SaveDC (surface->win32.dc); + + return CAIRO_STATUS_SUCCESS; + } + + BeginPath (surface->win32.dc); + status = _cairo_win32_printing_surface_emit_path (surface, path); + EndPath (surface->win32.dc); + + switch (fill_rule) { + case CAIRO_FILL_RULE_WINDING: + SetPolyFillMode (surface->win32.dc, WINDING); + break; + case CAIRO_FILL_RULE_EVEN_ODD: + SetPolyFillMode (surface->win32.dc, ALTERNATE); + break; + default: + ASSERT_NOT_REACHED; + } + + SelectClipPath (surface->win32.dc, RGN_AND); + + return status; +} + +static void +_cairo_win32_printing_surface_get_font_options (void *abstract_surface, + cairo_font_options_t *options) +{ + _cairo_font_options_init_default (options); + + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); + _cairo_font_options_set_round_glyph_positions (options, CAIRO_ROUND_GLYPH_POS_ON); +} + +static cairo_int_status_t +_cairo_win32_printing_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + cairo_solid_pattern_t clear; + cairo_status_t status; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (status) + return status; + + if (op == CAIRO_OPERATOR_CLEAR) { + _cairo_win32_printing_surface_init_clear_color (surface, &clear); + source = (cairo_pattern_t*) &clear; + op = CAIRO_OPERATOR_SOURCE; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return _cairo_win32_printing_surface_analyze_operation (surface, op, source); + + assert (_cairo_win32_printing_surface_operation_supported (surface, op, source)); + + return _cairo_win32_printing_surface_paint_pattern (surface, source); +} + +static int +_cairo_win32_line_cap (cairo_line_cap_t cap) +{ + switch (cap) { + case CAIRO_LINE_CAP_BUTT: + return PS_ENDCAP_FLAT; + case CAIRO_LINE_CAP_ROUND: + return PS_ENDCAP_ROUND; + case CAIRO_LINE_CAP_SQUARE: + return PS_ENDCAP_SQUARE; + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +static int +_cairo_win32_line_join (cairo_line_join_t join) +{ + switch (join) { + case CAIRO_LINE_JOIN_MITER: + return PS_JOIN_MITER; + case CAIRO_LINE_JOIN_ROUND: + return PS_JOIN_ROUND; + case CAIRO_LINE_JOIN_BEVEL: + return PS_JOIN_BEVEL; + default: + ASSERT_NOT_REACHED; + return 0; + } +} + +static void +_cairo_matrix_factor_out_scale (cairo_matrix_t *m, double *scale) +{ + double s; + + s = fabs (m->xx); + if (fabs (m->xy) > s) + s = fabs (m->xy); + if (fabs (m->yx) > s) + s = fabs (m->yx); + if (fabs (m->yy) > s) + s = fabs (m->yy); + *scale = s; + s = 1.0/s; + cairo_matrix_scale (m, s, s); +} + +static cairo_int_status_t +_cairo_win32_printing_surface_stroke (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + cairo_int_status_t status; + HPEN pen; + LOGBRUSH brush; + COLORREF color; + XFORM xform; + DWORD pen_style; + DWORD *dash_array; + HGDIOBJ obj; + unsigned int i; + cairo_solid_pattern_t clear; + cairo_matrix_t mat; + double scale; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (status) + return status; + + if (op == CAIRO_OPERATOR_CLEAR) { + _cairo_win32_printing_surface_init_clear_color (surface, &clear); + source = (cairo_pattern_t*) &clear; + op = CAIRO_OPERATOR_SOURCE; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + /* Win32 does not support a dash offset. */ + if (style->num_dashes > 0 && style->dash_offset != 0.0) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return _cairo_win32_printing_surface_analyze_operation (surface, op, source); + } + + assert (_cairo_win32_printing_surface_operation_supported (surface, op, source)); + assert (!(style->num_dashes > 0 && style->dash_offset != 0.0)); + + cairo_matrix_multiply (&mat, stroke_ctm, &surface->ctm); + _cairo_matrix_factor_out_scale (&mat, &scale); + + pen_style = PS_GEOMETRIC; + dash_array = NULL; + if (style->num_dashes) { + pen_style |= PS_USERSTYLE; + dash_array = calloc (sizeof (DWORD), style->num_dashes); + for (i = 0; i < style->num_dashes; i++) { + dash_array[i] = (DWORD) (scale * style->dash[i]); + } + } else { + pen_style |= PS_SOLID; + } + + SetMiterLimit (surface->win32.dc, (FLOAT) (style->miter_limit), NULL); + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; + + + color = _cairo_win32_printing_surface_flatten_transparency (surface, + &solid->color); + } else { + /* Color not used as the pen will only be used by WidenPath() */ + color = RGB (0,0,0); + } + brush.lbStyle = BS_SOLID; + brush.lbColor = color; + brush.lbHatch = 0; + pen_style |= _cairo_win32_line_cap (style->line_cap); + pen_style |= _cairo_win32_line_join (style->line_join); + pen = ExtCreatePen(pen_style, + scale * style->line_width, + &brush, + style->num_dashes, + dash_array); + if (pen == NULL) + return _cairo_win32_print_gdi_error ("_win32_surface_stroke:ExtCreatePen"); + obj = SelectObject (surface->win32.dc, pen); + if (obj == NULL) + return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SelectObject"); + + BeginPath (surface->win32.dc); + status = _cairo_win32_printing_surface_emit_path (surface, path); + EndPath (surface->win32.dc); + if (status) + return status; + + /* + * Switch to user space to set line parameters + */ + SaveDC (surface->win32.dc); + + _cairo_matrix_to_win32_xform (&mat, &xform); + xform.eDx = 0.0f; + xform.eDy = 0.0f; + + if (!ModifyWorldTransform (surface->win32.dc, &xform, MWT_LEFTMULTIPLY)) + return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SetWorldTransform"); + + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + StrokePath (surface->win32.dc); + } else { + if (!WidenPath (surface->win32.dc)) + return _cairo_win32_print_gdi_error ("_win32_surface_stroke:WidenPath"); + if (!SelectClipPath (surface->win32.dc, RGN_AND)) + return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SelectClipPath"); + + /* Return to device space to paint the pattern */ + _cairo_matrix_to_win32_xform (&surface->gdi_ctm, &xform); + if (!SetWorldTransform (surface->win32.dc, &xform)) + return _cairo_win32_print_gdi_error ("_win32_surface_stroke:ModifyWorldTransform"); + status = _cairo_win32_printing_surface_paint_pattern (surface, source); + } + RestoreDC (surface->win32.dc, -1); + DeleteObject (pen); + free (dash_array); + + return status; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_fill (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + cairo_int_status_t status; + cairo_solid_pattern_t clear; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (status) + return status; + + if (op == CAIRO_OPERATOR_CLEAR) { + _cairo_win32_printing_surface_init_clear_color (surface, &clear); + source = (cairo_pattern_t*) &clear; + op = CAIRO_OPERATOR_SOURCE; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) + return _cairo_win32_printing_surface_analyze_operation (surface, op, source); + + assert (_cairo_win32_printing_surface_operation_supported (surface, op, source)); + + surface->path_empty = TRUE; + BeginPath (surface->win32.dc); + status = _cairo_win32_printing_surface_emit_path (surface, path); + EndPath (surface->win32.dc); + + switch (fill_rule) { + case CAIRO_FILL_RULE_WINDING: + SetPolyFillMode (surface->win32.dc, WINDING); + break; + case CAIRO_FILL_RULE_EVEN_ODD: + SetPolyFillMode (surface->win32.dc, ALTERNATE); + break; + default: + ASSERT_NOT_REACHED; + } + + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + status = _cairo_win32_printing_surface_select_solid_brush (surface, source); + if (status) + return status; + + FillPath (surface->win32.dc); + _cairo_win32_printing_surface_done_solid_brush (surface); + } else if (surface->path_empty == FALSE) { + SaveDC (surface->win32.dc); + SelectClipPath (surface->win32.dc, RGN_AND); + status = _cairo_win32_printing_surface_paint_pattern (surface, source); + RestoreDC (surface->win32.dc, -1); + } + + fflush(stderr); + + return status; +} + + +static cairo_int_status_t +_cairo_win32_printing_surface_emit_win32_glyphs (cairo_win32_printing_surface_t *surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_matrix_t ctm; + cairo_glyph_t *unicode_glyphs; + cairo_scaled_font_subsets_glyph_t subset_glyph; + int i, first; + cairo_bool_t sequence_is_unicode; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + + /* Where possible reverse the glyph indices back to unicode + * characters. Strings of glyphs that could not be reversed to + * unicode will be printed with ETO_GLYPH_INDEX. + * + * As _cairo_win32_scaled_font_index_to_ucs4() is a slow + * operation, the font subsetting function + * _cairo_scaled_font_subsets_map_glyph() is used to obtain + * the unicode value because it caches the reverse mapping in + * the subsets. + */ + + if (surface->has_ctm) { + for (i = 0; i < num_glyphs; i++) + cairo_matrix_transform_point (&surface->ctm, &glyphs[i].x, &glyphs[i].y); + cairo_matrix_multiply (&ctm, &scaled_font->ctm, &surface->ctm); + scaled_font = cairo_scaled_font_create (scaled_font->font_face, + &scaled_font->font_matrix, + &ctm, + &scaled_font->options); + } + + unicode_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unicode_glyphs == NULL) + return _cairo_error (CAIRO_STATUS_NO_MEMORY); + + memcpy (unicode_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t)); + for (i = 0; i < num_glyphs; i++) { + status = _cairo_scaled_font_subsets_map_glyph (surface->font_subsets, + scaled_font, + glyphs[i].index, + NULL, 0, + &subset_glyph); + if (status) + goto fail; + + unicode_glyphs[i].index = subset_glyph.unicode; + } + + i = 0; + first = 0; + sequence_is_unicode = unicode_glyphs[0].index <= 0xffff; + while (i < num_glyphs) { + if (i == num_glyphs - 1 || + ((unicode_glyphs[i + 1].index < 0xffff) != sequence_is_unicode)) + { + status = _cairo_win32_surface_emit_glyphs (&surface->win32, + source, + sequence_is_unicode ? &unicode_glyphs[first] : &glyphs[first], + i - first + 1, + scaled_font, + ! sequence_is_unicode); + first = i + 1; + if (i < num_glyphs - 1) + sequence_is_unicode = unicode_glyphs[i + 1].index <= 0xffff; + } + i++; + } + +fail: + if (surface->has_ctm) + cairo_scaled_font_destroy (scaled_font); + + free (unicode_glyphs); + + return status; +} + +static cairo_int_status_t +_cairo_win32_printing_surface_show_glyphs (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + const cairo_clip_t *clip) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + cairo_status_t status = CAIRO_STATUS_SUCCESS; + cairo_scaled_glyph_t *scaled_glyph; + cairo_pattern_t *opaque = NULL; + int i; + cairo_matrix_t old_ctm; + cairo_bool_t old_has_ctm; + cairo_solid_pattern_t clear; + + status = _cairo_surface_clipper_set_clip (&surface->clipper, clip); + if (status) + return status; + + if (op == CAIRO_OPERATOR_CLEAR) { + _cairo_win32_printing_surface_init_clear_color (surface, &clear); + source = (cairo_pattern_t*) &clear; + op = CAIRO_OPERATOR_SOURCE; + } + + if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { + /* When printing bitmap fonts to a printer DC, Windows may + * substitute an outline font for bitmap font. As the win32 + * font backend always uses a screen DC when obtaining the + * font metrics the metrics of the substituted font will not + * match the metrics that the win32 font backend returns. + * + * If we are printing a bitmap font, use fallback images to + * ensure the font is not substituted. + */ +#if CAIRO_HAS_WIN32_FONT + if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32) { + if (_cairo_win32_scaled_font_is_bitmap (scaled_font)) + return CAIRO_INT_STATUS_UNSUPPORTED; + else + return _cairo_win32_printing_surface_analyze_operation (surface, op, source); + } +#endif + + /* For non win32 fonts we need to check that each glyph has a + * path available. If a path is not available, + * _cairo_scaled_glyph_lookup() will return + * CAIRO_INT_STATUS_UNSUPPORTED and a fallback image will be + * used. + */ + _cairo_scaled_font_freeze_cache (scaled_font); + for (i = 0; i < num_glyphs; i++) { + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_PATH, + &scaled_glyph); + if (status) + break; + } + _cairo_scaled_font_thaw_cache (scaled_font); + if (status) + return status; + + return _cairo_win32_printing_surface_analyze_operation (surface, op, source); + } + + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; + COLORREF color; + + color = _cairo_win32_printing_surface_flatten_transparency (surface, + &solid->color); + opaque = cairo_pattern_create_rgb (GetRValue (color) / 255.0, + GetGValue (color) / 255.0, + GetBValue (color) / 255.0); + if (opaque->status) + return opaque->status; + source = opaque; + } + +#if CAIRO_HAS_WIN32_FONT + if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32 && + source->type == CAIRO_PATTERN_TYPE_SOLID) + { + return _cairo_win32_printing_surface_emit_win32_glyphs (surface, + op, + source, + glyphs, + num_glyphs, + scaled_font, + clip); + } +#endif + + SaveDC (surface->win32.dc); + old_ctm = surface->ctm; + old_has_ctm = surface->has_ctm; + surface->has_ctm = TRUE; + surface->path_empty = TRUE; + _cairo_scaled_font_freeze_cache (scaled_font); + BeginPath (surface->win32.dc); + for (i = 0; i < num_glyphs; i++) { + status = _cairo_scaled_glyph_lookup (scaled_font, + glyphs[i].index, + CAIRO_SCALED_GLYPH_INFO_PATH, + &scaled_glyph); + if (status) + break; + surface->ctm = old_ctm; + cairo_matrix_translate (&surface->ctm, glyphs[i].x, glyphs[i].y); + status = _cairo_win32_printing_surface_emit_path (surface, scaled_glyph->path); + } + EndPath (surface->win32.dc); + _cairo_scaled_font_thaw_cache (scaled_font); + surface->ctm = old_ctm; + surface->has_ctm = old_has_ctm; + if (status == CAIRO_STATUS_SUCCESS && surface->path_empty == FALSE) { + if (source->type == CAIRO_PATTERN_TYPE_SOLID) { + status = _cairo_win32_printing_surface_select_solid_brush (surface, source); + if (status) + return status; + + SetPolyFillMode (surface->win32.dc, WINDING); + FillPath (surface->win32.dc); + _cairo_win32_printing_surface_done_solid_brush (surface); + } else { + SelectClipPath (surface->win32.dc, RGN_AND); + status = _cairo_win32_printing_surface_paint_pattern (surface, source); + } + } + RestoreDC (surface->win32.dc, -1); + + if (opaque) + cairo_pattern_destroy (opaque); + + return status; +} + +static const char ** +_cairo_win32_printing_surface_get_supported_mime_types (void *abstract_surface) +{ + return _cairo_win32_printing_supported_mime_types; +} + +static cairo_status_t +_cairo_win32_printing_surface_finish (void *abstract_surface) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + + if (surface->font_subsets != NULL) + _cairo_scaled_font_subsets_destroy (surface->font_subsets); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_surface_t * +_cairo_win32_printing_surface_create_similar (void *abstract_surface, + cairo_content_t content, + int width, + int height) +{ + cairo_rectangle_t extents; + + extents.x = extents.y = 0; + extents.width = width; + extents.height = height; + return cairo_recording_surface_create (content, &extents); +} + +static cairo_int_status_t +_cairo_win32_printing_surface_start_page (void *abstract_surface) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + XFORM xform; + double x_res, y_res; + cairo_matrix_t inverse_ctm; + cairo_status_t status; + + SaveDC (surface->win32.dc); /* Save application context first, before doing MWT */ + + /* As the logical coordinates used by GDI functions (eg LineTo) + * are integers we need to do some additional work to prevent + * rounding errors. For example the obvious way to paint a recording + * pattern is to: + * + * SaveDC() + * transform the device context DC by the pattern to device matrix + * replay the recording surface + * RestoreDC() + * + * The problem here is that if the pattern to device matrix is + * [100 0 0 100 0 0], coordinates in the recording pattern such as + * (1.56, 2.23) which correspond to (156, 223) in device space + * will be rounded to (100, 200) due to (1.56, 2.23) being + * truncated to integers. + * + * This is solved by saving the current GDI CTM in surface->ctm, + * switch the GDI CTM to identity, and transforming all + * coordinates by surface->ctm before passing them to GDI. When + * painting a recording pattern, surface->ctm is transformed by the + * pattern to device matrix. + * + * For printing device contexts where 1 unit is 1 dpi, switching + * the GDI CTM to identity maximises the possible resolution of + * coordinates. + * + * If the device context is an EMF file, using an identity + * transform often provides insufficent resolution. The workaround + * is to set the GDI CTM to a scale < 1 eg [1.0/16 0 0 1/0/16 0 0] + * and scale the cairo CTM by [16 0 0 16 0 0]. The + * SetWorldTransform function call to scale the GDI CTM by 1.0/16 + * will be recorded in the EMF followed by all the graphics + * functions by their coordinateds multiplied by 16. + * + * To support allowing the user to set a GDI CTM with scale < 1, + * we avoid switching to an identity CTM if the CTM xx and yy is < 1. + */ + SetGraphicsMode (surface->win32.dc, GM_ADVANCED); + GetWorldTransform(surface->win32.dc, &xform); + if (xform.eM11 < 1 && xform.eM22 < 1) { + cairo_matrix_init_identity (&surface->ctm); + surface->gdi_ctm.xx = xform.eM11; + surface->gdi_ctm.xy = xform.eM21; + surface->gdi_ctm.yx = xform.eM12; + surface->gdi_ctm.yy = xform.eM22; + surface->gdi_ctm.x0 = xform.eDx; + surface->gdi_ctm.y0 = xform.eDy; + } else { + surface->ctm.xx = xform.eM11; + surface->ctm.xy = xform.eM21; + surface->ctm.yx = xform.eM12; + surface->ctm.yy = xform.eM22; + surface->ctm.x0 = xform.eDx; + surface->ctm.y0 = xform.eDy; + cairo_matrix_init_identity (&surface->gdi_ctm); + if (!ModifyWorldTransform (surface->win32.dc, NULL, MWT_IDENTITY)) + return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_start_page:ModifyWorldTransform"); + } + + surface->has_ctm = !_cairo_matrix_is_identity (&surface->ctm); + surface->has_gdi_ctm = !_cairo_matrix_is_identity (&surface->gdi_ctm); + inverse_ctm = surface->ctm; + status = cairo_matrix_invert (&inverse_ctm); + if (status) + return status; + + x_res = GetDeviceCaps (surface->win32.dc, LOGPIXELSX); + y_res = GetDeviceCaps (surface->win32.dc, LOGPIXELSY); + cairo_matrix_transform_distance (&inverse_ctm, &x_res, &y_res); + _cairo_surface_set_resolution (&surface->win32.base, x_res, y_res); + + SaveDC (surface->win32.dc); /* Then save Cairo's known-good clip state, so the clip path can be reset */ + + return CAIRO_STATUS_SUCCESS; +} + +static void +_cairo_win32_printing_surface_set_paginated_mode (void *abstract_surface, + cairo_paginated_mode_t paginated_mode) +{ + cairo_win32_printing_surface_t *surface = abstract_surface; + + surface->paginated_mode = paginated_mode; +} + +static cairo_bool_t +_cairo_win32_printing_surface_supports_fine_grained_fallbacks (void *abstract_surface) +{ + return TRUE; +} + +/** + * cairo_win32_printing_surface_create: + * @hdc: the DC to create a surface for + * + * Creates a cairo surface that targets the given DC. The DC will be + * queried for its initial clip extents, and this will be used as the + * size of the cairo surface. The DC should be a printing DC; + * antialiasing will be ignored, and GDI will be used as much as + * possible to draw to the surface. + * + * The returned surface will be wrapped using the paginated surface to + * provide correct complex rendering behaviour; cairo_surface_show_page() and + * associated methods must be used for correct output. + * + * Return value: the newly created surface + * + * Since: 1.6 + **/ +cairo_surface_t * +cairo_win32_printing_surface_create (HDC hdc) +{ + cairo_win32_printing_surface_t *surface; + cairo_surface_t *paginated; + RECT rect; + + surface = malloc (sizeof (cairo_win32_printing_surface_t)); + if (surface == NULL) + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + +#if 0 + if (_cairo_win32_save_initial_clip (hdc, surface) != CAIRO_STATUS_SUCCESS) { + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } +#endif + + _cairo_surface_clipper_init (&surface->clipper, + _cairo_win32_printing_surface_clipper_intersect_clip_path); + + surface->win32.format = CAIRO_FORMAT_RGB24; + surface->win32.base.content = CAIRO_CONTENT_COLOR_ALPHA; + + surface->win32.dc = hdc; + + surface->brush = NULL; + surface->old_brush = NULL; + surface->font_subsets = _cairo_scaled_font_subsets_create_scaled (); + if (surface->font_subsets == NULL) { + free (surface); + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); + } + + GetClipBox(hdc, &rect); + surface->win32.extents.x = rect.left; + surface->win32.extents.y = rect.top; + surface->win32.extents.width = rect.right - rect.left; + surface->win32.extents.height = rect.bottom - rect.top; + + surface->win32.flags = _cairo_win32_flags_for_dc (surface->win32.dc); + surface->win32.flags |= CAIRO_WIN32_SURFACE_FOR_PRINTING; + + _cairo_win32_printing_surface_init_ps_mode (surface); + _cairo_win32_printing_surface_init_image_support (surface); + _cairo_win32_printing_surface_init_language_pack (surface); + _cairo_surface_init (&surface->win32.base, + &cairo_win32_printing_surface_backend, + NULL, /* device */ + CAIRO_CONTENT_COLOR_ALPHA); + + paginated = _cairo_paginated_surface_create (&surface->win32.base, + CAIRO_CONTENT_COLOR_ALPHA, + &cairo_win32_surface_paginated_backend); + + /* paginated keeps the only reference to surface now, drop ours */ + cairo_surface_destroy (&surface->win32.base); + + return paginated; +} + +static const cairo_surface_backend_t cairo_win32_printing_surface_backend = { + CAIRO_SURFACE_TYPE_WIN32_PRINTING, + _cairo_win32_printing_surface_finish, + + _cairo_default_context_create, + + _cairo_win32_printing_surface_create_similar, + NULL, /* create similar image */ + NULL, /* map to image */ + NULL, /* unmap image */ + + _cairo_surface_default_source, + NULL, /* acquire_source_image */ + NULL, /* release_source_image */ + NULL, /* snapshot */ + + NULL, /* copy_page */ + _cairo_win32_printing_surface_show_page, + + _cairo_win32_surface_get_extents, + _cairo_win32_printing_surface_get_font_options, + + NULL, /* flush */ + NULL, /* mark_dirty_rectangle */ + + _cairo_win32_printing_surface_paint, + NULL, /* mask */ + _cairo_win32_printing_surface_stroke, + _cairo_win32_printing_surface_fill, + NULL, /* fill/stroke */ + _cairo_win32_printing_surface_show_glyphs, + NULL, /* has_show_text_glyphs */ + NULL, /* show_text_glyphs */ + _cairo_win32_printing_surface_get_supported_mime_types, +}; + +static const cairo_paginated_surface_backend_t cairo_win32_surface_paginated_backend = { + _cairo_win32_printing_surface_start_page, + _cairo_win32_printing_surface_set_paginated_mode, + NULL, /* set_bounding_box */ + NULL, /* _cairo_win32_printing_surface_has_fallback_images, */ + _cairo_win32_printing_surface_supports_fine_grained_fallbacks, +}; diff --git a/src/win32/cairo-win32-private.h b/src/win32/cairo-win32-private.h new file mode 100644 index 000000000..b6c24311a --- /dev/null +++ b/src/win32/cairo-win32-private.h @@ -0,0 +1,226 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + */ + +#ifndef CAIRO_WIN32_PRIVATE_H +#define CAIRO_WIN32_PRIVATE_H + +#include "cairo-win32.h" + +#include "cairoint.h" + +#include "cairo-device-private.h" +#include "cairo-surface-clipper-private.h" +#include "cairo-surface-private.h" + +#ifndef SHADEBLENDCAPS +#define SHADEBLENDCAPS 120 +#endif +#ifndef SB_NONE +#define SB_NONE 0 +#endif + +#define WIN32_FONT_LOGICAL_SCALE 32 + +/* Surface DC flag values */ +enum { + /* If this is a surface created for printing or not */ + CAIRO_WIN32_SURFACE_FOR_PRINTING = (1<<0), + + /* Whether the DC is a display DC or not */ + CAIRO_WIN32_SURFACE_IS_DISPLAY = (1<<1), + + /* Whether we can use BitBlt with this surface */ + CAIRO_WIN32_SURFACE_CAN_BITBLT = (1<<2), + + /* Whether we can use AlphaBlend with this surface */ + CAIRO_WIN32_SURFACE_CAN_ALPHABLEND = (1<<3), + + /* Whether we can use StretchBlt with this surface */ + CAIRO_WIN32_SURFACE_CAN_STRETCHBLT = (1<<4), + + /* Whether we can use StretchDIBits with this surface */ + CAIRO_WIN32_SURFACE_CAN_STRETCHDIB = (1<<5), + + /* Whether we can use GradientFill rectangles with this surface */ + CAIRO_WIN32_SURFACE_CAN_RECT_GRADIENT = (1<<6), + + /* Whether we can use the CHECKJPEGFORMAT escape function */ + CAIRO_WIN32_SURFACE_CAN_CHECK_JPEG = (1<<7), + + /* Whether we can use the CHECKJPEGFORMAT escape function */ + CAIRO_WIN32_SURFACE_CAN_CHECK_PNG = (1<<8), +}; + +typedef struct _cairo_win32_surface { + cairo_surface_t base; + + cairo_format_t format; + HDC dc; + + /* Surface DC flags */ + unsigned flags; + + /* We use the x and y parts of extents for situations where + * we're not supposed to draw to the entire surface. + * For example, during a paint event a program will get + * a DC that has been clipped to the dirty region. + * A cairo surface constructed for that DC will have extents + * that match bounds of the clipped region. + */ + cairo_rectangle_int_t extents; +} cairo_win32_surface_t; +#define to_win32_surface(S) ((cairo_win32_surface_t *)(S)) + +typedef struct _cairo_win32_display_surface { + cairo_win32_surface_t win32; + + /* We create off-screen surfaces as DIBs or DDBs, based on what we created + * originally*/ + HBITMAP bitmap; + cairo_bool_t is_dib; + + /* Used to save the initial 1x1 monochrome bitmap for the DC to + * select back into the DC before deleting the DC and our + * bitmap. For Windows XP, this doesn't seem to be necessary + * ... we can just delete the DC and that automatically unselects + * out bitmap. But it's standard practice so apparently is needed + * on some versions of Windows. + */ + HBITMAP saved_dc_bitmap; + cairo_surface_t *image; + cairo_surface_t *fallback; + + HRGN initial_clip_rgn; + cairo_bool_t had_simple_clip; +} cairo_win32_display_surface_t; +#define to_win32_display_surface(S) ((cairo_win32_display_surface_t *)(S)) + +typedef struct _cairo_win32_printing_surface { + cairo_win32_surface_t win32; + + cairo_surface_clipper_t clipper; + + cairo_paginated_mode_t paginated_mode; + cairo_content_t content; + cairo_bool_t path_empty; + cairo_bool_t has_ctm; + cairo_matrix_t ctm; + cairo_bool_t has_gdi_ctm; + cairo_matrix_t gdi_ctm; + HBRUSH brush, old_brush; + cairo_scaled_font_subsets_t *font_subsets; +} cairo_win32_printing_surface_t; +#define to_win32_printing_surface(S) ((cairo_win32_printing_surface_t *)(S)) + +typedef BOOL (WINAPI *cairo_win32_alpha_blend_func_t) (HDC hdcDest, + int nXOriginDest, + int nYOriginDest, + int nWidthDest, + int hHeightDest, + HDC hdcSrc, + int nXOriginSrc, + int nYOriginSrc, + int nWidthSrc, + int nHeightSrc, + BLENDFUNCTION blendFunction); + +typedef struct _cairo_win32_device { + cairo_device_t base; + + HMODULE msimg32_dll; + + const cairo_compositor_t *compositor; + + cairo_win32_alpha_blend_func_t alpha_blend; +} cairo_win32_device_t; +#define to_win32_device(D) ((cairo_win32_device_t *)(D)) +#define to_win32_device_from_surface(S) to_win32_device(((cairo_surface_t *)(S))->device) + +cairo_private cairo_device_t * +_cairo_win32_device_get (void); + +const cairo_compositor_t * +_cairo_win32_gdi_compositor_get (void); + +cairo_status_t +_cairo_win32_print_gdi_error (const char *context); + +cairo_private void +_cairo_win32_display_surface_discard_fallback (cairo_win32_display_surface_t *surface); + +cairo_bool_t +_cairo_win32_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle); + +uint32_t +_cairo_win32_flags_for_dc (HDC dc); + +cairo_int_status_t +_cairo_win32_surface_emit_glyphs (cairo_win32_surface_t *dst, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_bool_t glyph_indexing); + +static inline void +_cairo_matrix_to_win32_xform (const cairo_matrix_t *m, + XFORM *xform) +{ + xform->eM11 = (FLOAT) m->xx; + xform->eM21 = (FLOAT) m->xy; + xform->eM12 = (FLOAT) m->yx; + xform->eM22 = (FLOAT) m->yy; + xform->eDx = (FLOAT) m->x0; + xform->eDy = (FLOAT) m->y0; +} + +cairo_status_t +_cairo_win32_display_surface_set_clip (cairo_win32_display_surface_t *surface, + cairo_clip_t *clip); + +void +_cairo_win32_display_surface_unset_clip (cairo_win32_display_surface_t *surface); + +void +_cairo_win32_debug_dump_hrgn (HRGN rgn, char *header); + +cairo_bool_t +_cairo_win32_scaled_font_is_type1 (cairo_scaled_font_t *scaled_font); + +cairo_bool_t +_cairo_win32_scaled_font_is_bitmap (cairo_scaled_font_t *scaled_font); + +#endif /* CAIRO_WIN32_PRIVATE_H */ diff --git a/src/win32/cairo-win32-surface.c b/src/win32/cairo-win32-surface.c new file mode 100644 index 000000000..e6862bd10 --- /dev/null +++ b/src/win32/cairo-win32-surface.c @@ -0,0 +1,338 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2012 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Stuart Parmenter + * Vladimir Vukicevic + */ + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include "cairoint.h" + +#include "cairo-default-context-private.h" +#include "cairo-error-private.h" +#include "cairo-image-surface-private.h" +#include "cairo-paginated-private.h" +#include "cairo-pattern-private.h" +#include "cairo-win32-private.h" +#include "cairo-scaled-font-subsets-private.h" +#include "cairo-surface-fallback-private.h" +#include "cairo-surface-backend-private.h" + +#include +#include + +#if defined(__MINGW32__) && !defined(ETO_PDY) +# define ETO_PDY 0x2000 +#endif + +/** + * SECTION:cairo-win32 + * @Title: Win32 Surfaces + * @Short_Description: Microsoft Windows surface support + * @See_Also: #cairo_surface_t + * + * The Microsoft Windows surface is used to render cairo graphics to + * Microsoft Windows windows, bitmaps, and printing device contexts. + * + * The surface returned by cairo_win32_printing_surface_create() is of surface + * type %CAIRO_SURFACE_TYPE_WIN32_PRINTING and is a multi-page vector surface + * type. + * + * The surface returned by the other win32 constructors is of surface type + * %CAIRO_SURFACE_TYPE_WIN32 and is a raster surface type. + **/ + +/** + * CAIRO_HAS_WIN32_SURFACE: + * + * Defined if the Microsoft Windows surface backend is available. + * This macro can be used to conditionally compile backend-specific code. + * + * Since: 1.0 + **/ + +/** + * _cairo_win32_print_gdi_error: + * @context: context string to display along with the error + * + * Helper function to dump out a human readable form of the + * current error code. + * + * Return value: A cairo status code for the error code + **/ +cairo_status_t +_cairo_win32_print_gdi_error (const char *context) +{ + void *lpMsgBuf; + DWORD last_error = GetLastError (); + + if (!FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + last_error, + MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR) &lpMsgBuf, + 0, NULL)) { + fprintf (stderr, "%s: Unknown GDI error", context); + } else { + fprintf (stderr, "%s: %S", context, (wchar_t *)lpMsgBuf); + + LocalFree (lpMsgBuf); + } + + fflush (stderr); + + /* We should switch off of last_status, but we'd either return + * CAIRO_STATUS_NO_MEMORY or CAIRO_STATUS_UNKNOWN_ERROR and there + * is no CAIRO_STATUS_UNKNOWN_ERROR. + */ + return _cairo_error (CAIRO_STATUS_NO_MEMORY); +} + +cairo_bool_t +_cairo_win32_surface_get_extents (void *abstract_surface, + cairo_rectangle_int_t *rectangle) +{ + cairo_win32_surface_t *surface = abstract_surface; + + *rectangle = surface->extents; + return TRUE; +} + +/** + * cairo_win32_surface_get_dc: + * @surface: a #cairo_surface_t + * + * Returns the HDC associated with this surface, or %NULL if none. + * Also returns %NULL if the surface is not a win32 surface. + * + * A call to cairo_surface_flush() is required before using the HDC to + * ensure that all pending drawing operations are finished and to + * restore any temporary modification cairo has made to its state. A + * call to cairo_surface_mark_dirty() is required after the state or + * the content of the HDC has been modified. + * + * Return value: HDC or %NULL if no HDC available. + * + * Since: 1.2 + **/ +HDC +cairo_win32_surface_get_dc (cairo_surface_t *surface) +{ + if (surface->backend->type == CAIRO_SURFACE_TYPE_WIN32) + return to_win32_surface(surface)->dc; + + if (_cairo_surface_is_paginated (surface)) { + cairo_surface_t *target = _cairo_paginated_surface_get_target (surface); + if (target->backend->type == CAIRO_SURFACE_TYPE_WIN32_PRINTING) + return to_win32_surface(target)->dc; + } + + return NULL; +} + +/** + * _cairo_surface_is_win32: + * @surface: a #cairo_surface_t + * + * Checks if a surface is an #cairo_win32_surface_t + * + * Return value: %TRUE if the surface is an win32 surface + **/ +static inline cairo_bool_t +_cairo_surface_is_win32 (const cairo_surface_t *surface) +{ + /* _cairo_surface_nil sets a NULL backend so be safe */ + return surface->backend && surface->backend->type == CAIRO_SURFACE_TYPE_WIN32; +} + +/** + * cairo_win32_surface_get_image: + * @surface: a #cairo_surface_t + * + * Returns a #cairo_surface_t image surface that refers to the same bits + * as the DIB of the Win32 surface. If the passed-in win32 surface + * is not a DIB surface, %NULL is returned. + * + * Return value: a #cairo_surface_t (owned by the win32 #cairo_surface_t), + * or %NULL if the win32 surface is not a DIB. + * + * Since: 1.4 + **/ +cairo_surface_t * +cairo_win32_surface_get_image (cairo_surface_t *surface) +{ + + if (! _cairo_surface_is_win32 (surface)) { + return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH)); + } + + GdiFlush(); + return to_win32_display_surface(surface)->image; +} + +#define STACK_GLYPH_SIZE 256 +cairo_int_status_t +_cairo_win32_surface_emit_glyphs (cairo_win32_surface_t *dst, + const cairo_pattern_t *source, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font, + cairo_bool_t glyph_indexing) +{ +#if CAIRO_HAS_WIN32_FONT + WORD glyph_buf_stack[STACK_GLYPH_SIZE]; + WORD *glyph_buf = glyph_buf_stack; + int dxy_buf_stack[2 * STACK_GLYPH_SIZE]; + int *dxy_buf = dxy_buf_stack; + + BOOL win_result = 0; + int i, j; + + cairo_solid_pattern_t *solid_pattern; + COLORREF color; + + cairo_matrix_t device_to_logical; + + int start_x, start_y; + double user_x, user_y; + int logical_x, logical_y; + unsigned int glyph_index_option; + + /* We can only handle win32 fonts */ + assert (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32); + + /* We can only handle opaque solid color sources and destinations */ + assert (_cairo_pattern_is_opaque_solid(source)); + assert (dst->format == CAIRO_FORMAT_RGB24); + + solid_pattern = (cairo_solid_pattern_t *)source; + color = RGB(((int)solid_pattern->color.red_short) >> 8, + ((int)solid_pattern->color.green_short) >> 8, + ((int)solid_pattern->color.blue_short) >> 8); + + cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical); + + SaveDC(dst->dc); + + cairo_win32_scaled_font_select_font(scaled_font, dst->dc); + SetTextColor(dst->dc, color); + SetTextAlign(dst->dc, TA_BASELINE | TA_LEFT); + SetBkMode(dst->dc, TRANSPARENT); + + if (num_glyphs > STACK_GLYPH_SIZE) { + glyph_buf = (WORD *) _cairo_malloc_ab (num_glyphs, sizeof(WORD)); + dxy_buf = (int *) _cairo_malloc_abc (num_glyphs, sizeof(int), 2); + } + + /* It is vital that dx values for dxy_buf are calculated from the delta of + * _logical_ x coordinates (not user x coordinates) or else the sum of all + * previous dx values may start to diverge from the current glyph's x + * coordinate due to accumulated rounding error. As a result strings could + * be painted shorter or longer than expected. */ + + user_x = glyphs[0].x; + user_y = glyphs[0].y; + + cairo_matrix_transform_point(&device_to_logical, + &user_x, &user_y); + + logical_x = _cairo_lround (user_x); + logical_y = _cairo_lround (user_y); + + start_x = logical_x; + start_y = logical_y; + + for (i = 0, j = 0; i < num_glyphs; ++i, j = 2 * i) { + glyph_buf[i] = (WORD) glyphs[i].index; + if (i == num_glyphs - 1) { + dxy_buf[j] = 0; + dxy_buf[j+1] = 0; + } else { + double next_user_x = glyphs[i+1].x; + double next_user_y = glyphs[i+1].y; + int next_logical_x, next_logical_y; + + cairo_matrix_transform_point(&device_to_logical, + &next_user_x, &next_user_y); + + next_logical_x = _cairo_lround (next_user_x); + next_logical_y = _cairo_lround (next_user_y); + + dxy_buf[j] = _cairo_lround (next_logical_x - logical_x); + dxy_buf[j+1] = _cairo_lround (next_logical_y - logical_y); + + logical_x = next_logical_x; + logical_y = next_logical_y; + } + } + + if (glyph_indexing) + glyph_index_option = ETO_GLYPH_INDEX; + else + glyph_index_option = 0; + + win_result = ExtTextOutW(dst->dc, + start_x, + start_y, + glyph_index_option | ETO_PDY, + NULL, + glyph_buf, + num_glyphs, + dxy_buf); + if (!win_result) { + _cairo_win32_print_gdi_error("_cairo_win32_surface_show_glyphs(ExtTextOutW failed)"); + } + + RestoreDC(dst->dc, -1); + + if (glyph_buf != glyph_buf_stack) { + free(glyph_buf); + free(dxy_buf); + } + return (win_result) ? CAIRO_STATUS_SUCCESS : CAIRO_INT_STATUS_UNSUPPORTED; +#else + return CAIRO_INT_STATUS_UNSUPPORTED; +#endif +} +#undef STACK_GLYPH_SIZE diff --git a/src/win32/cairo-win32-system.c b/src/win32/cairo-win32-system.c new file mode 100644 index 000000000..878553009 --- /dev/null +++ b/src/win32/cairo-win32-system.c @@ -0,0 +1,89 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Owen Taylor + * Stuart Parmenter + * Vladimir Vukicevic + */ + +/* This file should include code that is system-specific, not + * feature-specific. For example, the DLL initialization/finalization + * code on Win32 or OS/2 must live here (not in cairo-whatever-surface.c). + * Same about possible ELF-specific code. + * + * And no other function should live here. + */ + + +#include "cairoint.h" + +#if CAIRO_MUTEX_IMPL_WIN32 +#if !CAIRO_WIN32_STATIC_BUILD + +#define WIN32_LEAN_AND_MEAN +/* We require Windows 2000 features such as ETO_PDY */ +#if !defined(WINVER) || (WINVER < 0x0500) +# define WINVER 0x0500 +#endif +#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) +# define _WIN32_WINNT 0x0500 +#endif + +#include + +/* declare to avoid "no previous prototype for 'DllMain'" warning */ +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved); + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + CAIRO_MUTEX_INITIALIZE (); + break; + + case DLL_PROCESS_DETACH: + CAIRO_MUTEX_FINALIZE (); + break; + } + + return TRUE; +} + +#endif +#endif diff --git a/test/6x13.pcf b/test/6x13.pcf new file mode 100644 index 000000000..1325ae64f Binary files /dev/null and b/test/6x13.pcf differ diff --git a/test/COPYING b/test/COPYING new file mode 100644 index 000000000..3db71fb08 --- /dev/null +++ b/test/COPYING @@ -0,0 +1,26 @@ +Cairo is free software. + +These tests are mainly available under a liberal MIT license to simplify +any use of the code for reference purposes. Please check the opening comment +of each file for copyright and licensing information. + +The test suite also bundles some fonts for use by the test suite. The +fonts included, their licenses, and why we use them in the test suite +are as follows: + + Font License Distinguishing feature + -------- ------------- ---------------------- + 6x13.pcf Public Domain Bitmap font + + +The test suite also bundles some images for use by the test suite. The +images included, their licenses, and why we use them in the test suite +are as follows: + + Image License Distinguishing feature + ------------- ------------- ------------------------- + romedalen.jpg Public Domain Bitmap image (image/jpeg) + romedalen.png Public Domain Bitmap image (image/png) + +The kind contributors of the bundled files are (in alphabetical order): +Øyvind Kolås Author of the original romedalen shot. diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 000000000..950629b39 --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,407 @@ +include $(top_srcdir)/build/Makefile.am.common + +include $(top_srcdir)/test/Makefile.sources + +SUBDIRS=pdiff . + +# Then we have a collection of tests that are only run if certain +# features are compiled into cairo +if HAVE_REAL_PTHREAD +test_sources += $(pthread_test_sources) +endif + +if CAIRO_HAS_FT_FONT +if CAIRO_HAS_FC_FONT +test_sources += $(ft_font_test_sources) +endif +endif + +if CAIRO_HAS_GL_SURFACE +test_sources += $(gl_surface_test_sources) +endif + +if CAIRO_HAS_EGL_FUNCTIONS +test_sources += $(egl_surface_test_sources) +endif + +# Need to add quartz-surface-source +if CAIRO_HAS_QUARTZ_SURFACE +test_sources += $(quartz_surface_test_sources) +endif + +if CAIRO_HAS_PDF_SURFACE +test_sources += $(pdf_surface_test_sources) +endif + +if CAIRO_HAS_PS_SURFACE +test_sources += $(ps_surface_test_sources) +endif + +if CAIRO_HAS_SVG_SURFACE +test_sources += $(svg_surface_test_sources) +endif + +if CAIRO_HAS_TEST_SURFACES +test_sources += $(test_fallback16_surface_test_sources) +endif + +if CAIRO_HAS_XCB_SURFACE +test_sources += $(xcb_surface_test_sources) +endif + +if CAIRO_HAS_XLIB_SURFACE +test_sources += $(xlib_surface_test_sources) +endif + +if CAIRO_HAS_XLIB_XRENDER_SURFACE +test_sources += $(xlib_xrender_surface_test_sources) +endif + +if CAIRO_HAS_MULTI_PAGE_SURFACES +test_sources += $(multi_page_surface_test_sources) +endif + +# Include fallback-resolution (once!) if we have any of the vector surfaces +if BUILD_ANY2PPM +if CAIRO_HAS_SVG_SURFACE +test = $(fallback_resolution_test_sources) +endif +if CAIRO_HAS_PDF_SURFACE +test = $(fallback_resolution_test_sources) +endif +if CAIRO_HAS_PS_SURFACE +test = $(fallback_resolution_test_sources) +endif +endif +test_sources += $(test) + +noinst_PROGRAMS = cairo-test-suite$(EXEEXT) # always build +noinst_SCRIPTS = check-refs.sh + +TESTS += cairo-test-suite$(EXEEXT) + +cairo-test-constructors.c: Makefile $(test_sources) make-cairo-test-constructors.sh + (cd $(srcdir) && sh ./make-cairo-test-constructors.sh $(test_sources)) > $@ + +cairo_test_suite_SOURCES = \ + $(cairo_test_suite_sources) \ + $(cairo_test_suite_headers) \ + $(test_sources) \ + cairo-test-constructors.c +cairo_test_suite_CFLAGS = $(AM_CFLAGS) $(real_pthread_CFLAGS) +cairo_test_suite_LDADD = \ + $(real_pthread_LIBS) \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) +cairo_test_suite_DEPENDENCIES = \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la +if BUILD_ANY2PPM +cairo_test_suite_DEPENDENCIES += \ + any2ppm$(EXEEXT) +endif + +if HAVE_SHM +EXTRA_PROGRAMS += cairo-test-trace +cairo_test_trace_SOURCES = \ + cairo-test-trace.c \ + buffer-diff.c \ + buffer-diff.h +cairo_test_trace_CFLAGS = $(AM_CFLAGS) $(real_pthread_CFLAGS) +cairo_test_trace_LDADD = \ + $(real_pthread_LIBS) \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(CAIRO_LDADD) \ + $(SHM_LIBS) +cairo_test_trace_DEPENDENCIES = \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la \ + $(top_builddir)/util/cairo-missing/libcairo-missing.la \ + $(NULL) +endif + +BUILT_SOURCES += cairo-test-constructors.c +EXTRA_DIST += $(BUILT_SOURCES) $(noinst_SCRIPTS) COPYING make-cairo-test-constructors.sh run-cairo-test-suite.sh generate_refs.sh tiger.inc +CLEANFILES += $(BUILT_SOURCES) + +EXTRA_DIST += \ +6x13.pcf \ +index.html \ +jp2.jp2 \ +jpeg.jpg \ +png.png \ +romedalen.jpg \ +romedalen.png \ +scarab.jpg \ +surface-source.c \ +testtable.js \ +reference + +# Any test that doesn't generate a log file goes here +NOLOG_TESTS = \ +fallback-resolution \ +font-options \ +multi-page \ +pdf-features \ +png \ +ps-eps \ +ps-features \ +svg-clip \ +svg-surface \ +toy-font-face \ +user-data + +# A target to summarise the failures +check-summary: + @FAILED_TESTS=""; \ + for t in output/*.log; do \ + if grep -e '\' $$t >/dev/null 2>&1; then \ + FAILED_TESTS="$$FAILED_TESTS $$t"; \ + fi; \ + done; \ + if test -n "$$FAILED_TESTS"; then \ + echo "Failed tests:"; \ + surfaces=""; \ + for t in $$FAILED_TESTS; do \ + name="$${t##output/}"; name="$${name%.log}"; \ + echo -n " $$name: "; \ + grep -e '\' $$t | sed -e 's/.*TARGET: \([^ ]*\).*/\1/' | sort | uniq | tr '\n' ' '; \ + echo; \ + for s in `grep -e '\' $$t | sed -e 's/.*TARGET: \([^ ]*\).*/\1/' | sort | uniq`; do \ + ss=`echo $$s | tr '-' '_'`; \ + tt=`echo $$name | tr '-' '_'`; \ + eval $$ss=\""$${!ss} $$tt"\"; \ + echo $$surfaces | grep $$ss >/dev/null || surfaces="$$surfaces $$ss"; \ + done; \ + done; \ + echo -n "Failures per surface - "; \ + first=""; \ + for s in $$surfaces; do \ + ss=`echo $$s | tr '_' '-'`; \ + test -n "$$first" && echo -n ", "; \ + cnt=`echo $${!s} | wc -w`; \ + echo -n "$$ss: $$cnt"; \ + first="false"; \ + done; \ + echo "."; \ + for s in $$surfaces; do \ + ss=`echo $$s | tr '_' '-'`; \ + cnt=`echo $${!s} | wc -w`; \ + echo -n " $$ss [$$cnt]: "; \ + echo $${!s} | tr '_' '-'; \ + done; \ + fi + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(srcdir)/pdiff \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/util/cairo-missing \ + -I$(top_srcdir)/util/cairo-script \ + -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) +AM_LDFLAGS = $(CAIRO_LDFLAGS) + +$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la + +$(top_builddir)/src/libcairo.la: + cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la + +$(top_builddir)/test/pdiff/libpdiff.la: + cd $(top_builddir)/test/pdiff && $(MAKE) $(AM_MAKEFLAGS) libpdiff.la + +$(top_builddir)/test/pdiff/perceptualdiff: + cd $(top_builddir)/test/pdiff && $(MAKE) $(AM_MAKEFLAGS) perceptualdiff + +$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la + +EXTRA_PROGRAMS += imagediff png-flatten + +imagediff_SOURCES = \ + imagediff.c \ + buffer-diff.c \ + buffer-diff.h +imagediff_LDADD = \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/src/libcairo.la + +png_flatten_SOURCES = png-flatten.c +png_flatten_LDADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) + +if BUILD_ANY2PPM +check_PROGRAMS += any2ppm +any2ppm_CFLAGS = $(AM_CFLAGS) $(POPPLER_CFLAGS) $(LIBRSVG_CFLAGS) $(LIBSPECTRE_CFLAGS) +# add LDADD, so poppler/librsvg uses "our" cairo +any2ppm_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +any2ppm_LDADD = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) \ + $(CAIROBOILERPLATE_LIBS) \ + $(POPPLER_LIBS) \ + $(LIBRSVG_LIBS) \ + $(LIBSPECTRE_LIBS) +endif + +if CAIRO_CAN_TEST_PDF_SURFACE +check_PROGRAMS += pdf2png +pdf2png_CFLAGS = $(AM_CFLAGS) $(POPPLER_CFLAGS) +# add LDADD, so poppler uses "our" cairo +pdf2png_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +pdf2png_LDADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) \ + $(POPPLER_LIBS) +endif + +if CAIRO_CAN_TEST_SVG_SURFACE +check_PROGRAMS += svg2png +svg2png_CFLAGS = $(AM_CFLAGS) $(LIBRSVG_CFLAGS) +# add LDADD, so librsvg uses "our" cairo +svg2png_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +svg2png_LDADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) \ + $(LIBRSVG_LIBS) +endif + +if CAIRO_HAS_SPECTRE +check_PROGRAMS += ps2png +ps2png_CFLAGS = $(AM_CFLAGS) $(LIBSPECTRE_CFLAGS) +# add LDADD, so ps2png uses "our" cairo +ps2png_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +ps2png_LDADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) \ + $(LIBSPECTRE_LIBS) +endif + +EXTRA_PROGRAMS += $(TESTS) + +# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that +# one can limit tested targets both through CAIRO_TEST_TARGET env var +# and TARGETS make var on the command line. Same for the rest. +TARGETS = $(CAIRO_TEST_TARGET) +TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE) +FORMAT = $(CAIRO_TEST_TARGET_FORMAT) +NUM_THREADS = $(CAIRO_TEST_NUM_THREADS) +MODE = $(CAIRO_TEST_MODE) + +# Same about ENV vs CAIRO_TEST_ENV. ENV is used with "make run" only +ENV = $(CAIRO_TEST_ENV) + +TESTS_ENVIRONMENT = CAIRO_TEST_MODE="$(MODE)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_FORMAT="$(FORMAT)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)" CAIRO_TEST_NUM_THREADS="$(NUM_THREADS)" $(ENV) + +EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS) +VALGRIND_FLAGS = \ + --tool=memcheck --suppressions=$(srcdir)/.valgrind-suppressions \ + --track-origins=yes \ + --leak-check=yes --show-reachable=yes \ + $(EXTRA_VALGRIND_FLAGS) + +CLEANFILES += \ + valgrind-log \ + ref.hash \ + ref.list \ + png-test.png \ + png.out.png \ + create-for-stream.pdf \ + create-for-stream.ps \ + create-for-stream.svg \ + svg-surface-source.out.svg \ + pdf-surface-source.out.pdf \ + ps-surface-source.out.ps \ + pdf-features.pdf \ + pdf-mime-data.out* \ + ps-features.ps \ + svg-clip.svg \ + svg-surface.svg \ + multi-page.pdf \ + multi-page.ps \ + $(NULL) + +# This used to be a simple 'echo ${RM} *.ps *.pdf *.svg *.etc', but +# most systems cannot handle all of our clean files together. +# Then it became a fancy find using many GNU extensions, but then the ugly +# reality of portability was raised and it became.... +clean-local: + rm -rf output + -${FIND} . -name '*.log' -print | ${XARGS} ${RM} + -${FIND} . -name '*.[is]' -print | ${XARGS} ${RM} +clean-caches: + -${FIND} output -name '*.fail.*' -print | ${XARGS} ${RM} + -${FIND} output -name '*.pass.*' -print | ${XARGS} ${RM} + +# The following definitions both should work. +#FAILED_TESTS = `grep -l '\' $(test_sources:.c=.log) 2>/dev/null | sed -e 's/[.]log$$//' | xargs echo` +FAILED_TESTS = `grep -l '\' $(test_sources:.c=.log) 2>/dev/null | tr '\n' ' ' | sed -e 's/[.]log */ /g; s/^ //; s/ $$//'` + +recheck = check CAIRO_TESTS="$(FAILED_TESTS)" + +# Re-checks all failed tests, i.e. tests with a log file that has a failure +recheck: + @echo Re-checking failed tests + @$(MAKE) $(AM_MAKEFLAGS) $(recheck) + +# Checks tests. +# Target doesn't fail if tests fail. +test: + @$(MAKE) $(AM_MAKEFLAGS) check + +# Re-checks tests. +# Target doesn't fail if tests fail. +retest: + @CAIRO_TESTS="$(FAILED_TESTS)"; \ + $(MAKE) $(AM_MAKEFLAGS) check + +# Run tests under a tool specified by TOOL. For example, make run TOOL=gdb +run: + $(MAKE) $(AM_MAKEFLAGS) check TESTS_ENVIRONMENT='$(TESTS_ENVIRONMENT) $(top_builddir)/libtool --mode=execute env $(TOOL)' + +# Check tests under valgrind. Saves log to valgrind-log +check-valgrind: + $(MAKE) $(AM_MAKEFLAGS) check TESTS_ENVIRONMENT='$(TESTS_ENVIRONMENT) CAIRO_TEST_MODE="$(MODE),foreground CAIRO_TEST_TIMEOUT=0" $(top_builddir)/libtool --mode=execute valgrind $(VALGRIND_FLAGS)' 2>&1 | tee valgrind-log + +#%.log: %.c cairo-test-suite +#-./cairo-test-suite $(<:.c=) + +NOLOG_TESTS_LOG = $(NOLOG_TESTS:=.log) + +$(NOLOG_TESTS_LOG): + @echo dummy > $@ + +# Identify identical reference images +check-ref-dups: check-refs.sh $(top_builddir)/test/pdiff/perceptualdiff + sh $(srcdir)/check-refs.sh $(top_builddir)/test/pdiff/perceptualdiff + +# Remove identical reference images (DANGEROUS) +clean-ref-dups: check-refs.sh $(top_builddir)/test/pdiff/perceptualdiff + sh $(srcdir)/check-refs.sh | cut -d' ' -f2 | while read f; do git rm "reference/$$f"; done + +results.tar: + @tar cf $@ index.html testtable.js *.log output/*.log; \ + for i in output/*.fail.png ; do \ + testname=$${i#output/} ; \ + testname=$${testname%%.*} ; \ + echo tar uf $@ reference/$${testname}*.ref.png $${i%fail.png}out.png $${i%fail.png}diff.png ; \ + tar uf $@ reference/$${testname}*.ref.png $${i%fail.png}out.png $${i%fail.png}diff.png ; \ + done + +results.tar.gz: results.tar + gzip -c $< > $@ + +release-verify-sane-tests: + +.PHONY: check-valgrind test recheck retest check-ref-dups release-verify-sane-tests + +EXTRA_DIST += Makefile.win32 diff --git a/test/Makefile.in b/test/Makefile.in new file mode 100644 index 000000000..eaa82e9a0 --- /dev/null +++ b/test/Makefile.in @@ -0,0 +1,8753 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(top_srcdir)/test/Makefile.sources $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/build/depcomp \ + $(top_srcdir)/build/test-driver COPYING README +EXTRA_PROGRAMS = $(am__EXEEXT_1) imagediff$(EXEEXT) \ + png-flatten$(EXEEXT) $(TESTS) +check_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \ + $(am__EXEEXT_5) + +# Then we have a collection of tests that are only run if certain +# features are compiled into cairo +@HAVE_REAL_PTHREAD_TRUE@am__append_1 = $(pthread_test_sources) +@CAIRO_HAS_FC_FONT_TRUE@@CAIRO_HAS_FT_FONT_TRUE@am__append_2 = $(ft_font_test_sources) +@CAIRO_HAS_GL_SURFACE_TRUE@am__append_3 = $(gl_surface_test_sources) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__append_4 = $(egl_surface_test_sources) + +# Need to add quartz-surface-source +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_5 = $(quartz_surface_test_sources) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__append_6 = $(pdf_surface_test_sources) +@CAIRO_HAS_PS_SURFACE_TRUE@am__append_7 = $(ps_surface_test_sources) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__append_8 = $(svg_surface_test_sources) +@CAIRO_HAS_TEST_SURFACES_TRUE@am__append_9 = $(test_fallback16_surface_test_sources) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__append_10 = $(xcb_surface_test_sources) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_11 = $(xlib_surface_test_sources) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_12 = $(xlib_xrender_surface_test_sources) +@CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE@am__append_13 = $(multi_page_surface_test_sources) +@BUILD_ANY2PPM_TRUE@am__append_14 = \ +@BUILD_ANY2PPM_TRUE@ any2ppm$(EXEEXT) + +@HAVE_SHM_TRUE@am__append_15 = cairo-test-trace +@BUILD_ANY2PPM_TRUE@am__append_16 = any2ppm +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@am__append_17 = pdf2png +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@am__append_18 = svg2png +@CAIRO_HAS_SPECTRE_TRUE@am__append_19 = ps2png +subdir = test +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +@HAVE_SHM_TRUE@am__EXEEXT_1 = cairo-test-trace$(EXEEXT) +@BUILD_ANY2PPM_TRUE@am__EXEEXT_2 = any2ppm$(EXEEXT) +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@am__EXEEXT_3 = pdf2png$(EXEEXT) +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@am__EXEEXT_4 = svg2png$(EXEEXT) +@CAIRO_HAS_SPECTRE_TRUE@am__EXEEXT_5 = ps2png$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +any2ppm_SOURCES = any2ppm.c +any2ppm_OBJECTS = any2ppm-any2ppm.$(OBJEXT) +am__DEPENDENCIES_1 = +@BUILD_ANY2PPM_TRUE@any2ppm_DEPENDENCIES = $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ +@BUILD_ANY2PPM_TRUE@ $(top_builddir)/src/libcairo.la \ +@BUILD_ANY2PPM_TRUE@ $(am__DEPENDENCIES_1) \ +@BUILD_ANY2PPM_TRUE@ $(am__DEPENDENCIES_1) \ +@BUILD_ANY2PPM_TRUE@ $(am__DEPENDENCIES_1) \ +@BUILD_ANY2PPM_TRUE@ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +any2ppm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(any2ppm_CFLAGS) \ + $(CFLAGS) $(any2ppm_LDFLAGS) $(LDFLAGS) -o $@ +am__cairo_test_suite_SOURCES_DIST = buffer-diff.c cairo-test.c \ + cairo-test-runner.c buffer-diff.h cairo-test.h \ + cairo-test-private.h world-map.h a1-bug.c a1-clip.c a1-fill.c \ + a1-image-sample.c a1-mask.c a1-mask-sample.c a1-sample.c \ + a1-traps-sample.c a1-rasterisation.c a8-clear.c a8-mask.c \ + aliasing.c alpha-similar.c arc-direction.c arc-infinite-loop.c \ + arc-looping-dash.c api-special-cases.c big-line.c \ + big-empty-box.c big-empty-triangle.c big-little-box.c \ + big-little-triangle.c bug-spline.c big-trap.c bilevel-image.c \ + bug-40410.c bug-51910.c bug-84115.c bug-bo-rectangular.c \ + bug-bo-collins.c bug-bo-ricotz.c bug-source-cu.c bug-extents.c \ + bug-seams.c caps.c checkerboard.c caps-joins.c \ + caps-joins-alpha.c caps-joins-curve.c caps-tails-curve.c \ + caps-sub-paths.c clear.c clear-source.c clip-all.c \ + clip-complex-bug61592.c clip-complex-shape.c clip-contexts.c \ + clip-disjoint.c clip-disjoint-hatching.c clip-disjoint-quad.c \ + clip-device-offset.c clip-double-free.c clip-draw-unbounded.c \ + clip-empty.c clip-empty-group.c clip-empty-save.c clip-fill.c \ + clip-fill-no-op.c clip-fill-rule.c \ + clip-fill-rule-pixel-aligned.c clip-group-shapes.c \ + clip-image.c clip-intersect.c clip-mixed-antialias.c \ + clip-nesting.c clip-operator.c clip-push-group.c \ + clip-polygons.c clip-rectilinear.c clip-shape.c clip-stroke.c \ + clip-stroke-no-op.c clip-text.c clip-twice.c \ + clip-twice-rectangle.c clip-unbounded.c clip-zero.c \ + clipped-group.c clipped-surface.c close-path.c \ + close-path-current-point.c \ + composite-integer-translate-source.c \ + composite-integer-translate-over.c \ + composite-integer-translate-over-repeat.c copy-disjoint.c \ + copy-path.c coverage.c create-for-stream.c create-from-png.c \ + create-from-png-stream.c culled-glyphs.c curve-to-as-line-to.c \ + dash-caps-joins.c dash-curve.c dash-infinite-loop.c \ + dash-no-dash.c dash-offset.c dash-offset-negative.c \ + dash-scale.c dash-state.c dash-zero-length.c degenerate-arc.c \ + degenerate-arcs.c degenerate-curve-to.c degenerate-dash.c \ + degenerate-linear-gradient.c degenerate-path.c \ + degenerate-pen.c degenerate-radial-gradient.c \ + degenerate-rel-curve-to.c degenerate-solid-dash.c \ + drunkard-tails.c device-offset.c device-offset-fractional.c \ + device-offset-positive.c device-offset-scale.c error-setters.c \ + extend-pad.c extend-pad-border.c extend-pad-similar.c \ + extend-reflect.c extend-reflect-similar.c extend-repeat.c \ + extend-repeat-similar.c extended-blend.c fallback.c \ + fill-alpha.c fill-alpha-pattern.c fill-and-stroke.c \ + fill-and-stroke-alpha.c fill-and-stroke-alpha-add.c \ + fill-degenerate-sort-order.c fill-disjoint.c fill-empty.c \ + fill-image.c fill-missed-stop.c fill-rule.c \ + filter-bilinear-extents.c filter-nearest-offset.c \ + filter-nearest-transformed.c finer-grained-fallbacks.c \ + font-face-get-type.c font-matrix-translation.c font-options.c \ + glyph-cache-pressure.c get-and-set.c get-clip.c \ + get-group-target.c get-path-extents.c gradient-alpha.c \ + gradient-constant-alpha.c gradient-zero-stops.c \ + gradient-zero-stops-mask.c group-clip.c group-paint.c \ + group-state.c group-unaligned.c half-coverage.c halo.c \ + hatchings.c horizontal-clip.c huge-linear.c huge-radial.c \ + image-surface-source.c image-bug-710072.c implicit-close.c \ + infinite-join.c in-fill-empty-trapezoid.c in-fill-trapezoid.c \ + invalid-matrix.c inverse-text.c inverted-clip.c joins.c \ + joins-loop.c joins-star.c joins-retrace.c large-clip.c \ + large-font.c large-source.c large-source-roi.c \ + large-twin-antialias-mixed.c leaky-dash.c \ + leaky-dashed-rectangle.c leaky-dashed-stroke.c leaky-polygon.c \ + line-width.c line-width-large-overlap.c line-width-overlap.c \ + line-width-scale.c line-width-tolerance.c line-width-zero.c \ + linear-gradient.c linear-gradient-extend.c \ + linear-gradient-large.c linear-gradient-one-stop.c \ + linear-gradient-reflect.c linear-gradient-subset.c \ + linear-step-function.c linear-uniform.c long-dashed-lines.c \ + long-lines.c map-to-image.c mask.c mask-alpha.c mask-ctm.c \ + mask-glyphs.c mask-surface-ctm.c mask-transformed-image.c \ + mask-transformed-similar.c mesh-pattern.c \ + mesh-pattern-accuracy.c mesh-pattern-conical.c \ + mesh-pattern-control-points.c mesh-pattern-fold.c \ + mesh-pattern-overlap.c mesh-pattern-transformed.c mime-data.c \ + mime-surface-api.c miter-precision.c move-to-show-surface.c \ + negative-stride-image.c new-sub-path.c nil-surface.c \ + operator.c operator-alpha.c operator-alpha-alpha.c \ + operator-clear.c operator-source.c outline-tolerance.c \ + over-above-source.c over-around-source.c over-below-source.c \ + over-between-source.c overlapping-boxes.c overlapping-glyphs.c \ + overlapping-dash-caps.c paint.c paint-clip-fill.c \ + paint-repeat.c paint-source-alpha.c paint-with-alpha.c \ + paint-with-alpha-group-clip.c partial-clip-text.c \ + partial-coverage.c pass-through.c path-append.c \ + path-currentpoint.c path-stroke-twice.c path-precision.c \ + pattern-get-type.c pattern-getters.c pdf-isolated-group.c \ + pixman-downscale.c pixman-rotate.c png.c push-group.c \ + push-group-color.c push-group-path-offset.c radial-gradient.c \ + radial-gradient-extend.c radial-outer-focus.c random-clips.c \ + random-intersections-eo.c random-intersections-nonzero.c \ + random-intersections-curves-eo.c \ + random-intersections-curves-nz.c raster-source.c record.c \ + record1414x.c record2x.c record90.c recordflip.c \ + record-extend.c record-mesh.c recording-surface-pattern.c \ + recording-surface-extend.c rectangle-rounding-error.c \ + rectilinear-fill.c rectilinear-grid.c \ + rectilinear-miter-limit.c rectilinear-dash.c \ + rectilinear-dash-scale.c rectilinear-stroke.c \ + reflected-stroke.c rel-path.c rgb24-ignore-alpha.c \ + rotate-image-surface-paint.c rotate-stroke-box.c \ + rotated-clip.c rounded-rectangle-fill.c \ + rounded-rectangle-stroke.c sample.c \ + scale-down-source-surface-paint.c scale-offset-image.c \ + scale-offset-similar.c scale-source-surface-paint.c \ + scaled-font-zero-matrix.c stroke-ctm-caps.c stroke-clipped.c \ + stroke-image.c stroke-open-box.c select-font-face.c \ + select-font-no-show-text.c self-copy.c self-copy-overlap.c \ + self-intersecting.c set-source.c show-glyphs-advance.c \ + show-glyphs-many.c show-text-current-point.c \ + shape-general-convex.c shape-sierpinski.c simple.c \ + skew-extreme.c smask.c smask-fill.c smask-image-mask.c \ + smask-mask.c smask-paint.c smask-stroke.c smask-text.c \ + solid-pattern-cache-stress.c source-clip.c source-clip-scale.c \ + source-surface-scale-paint.c spline-decomposition.c \ + stride-12-image.c stroke-pattern.c subsurface.c \ + subsurface-image-repeat.c subsurface-repeat.c \ + subsurface-reflect.c subsurface-pad.c \ + subsurface-modify-child.c subsurface-modify-parent.c \ + subsurface-outside-target.c subsurface-scale.c \ + subsurface-similar-repeat.c surface-finish-twice.c \ + surface-pattern.c surface-pattern-big-scale-down.c \ + surface-pattern-operator.c surface-pattern-scale-down.c \ + surface-pattern-scale-down-extend.c surface-pattern-scale-up.c \ + text-antialias.c text-antialias-subpixel.c text-cache-crash.c \ + text-glyph-range.c text-pattern.c text-rotate.c \ + text-transform.c text-zero-len.c tighten-bounds.c tiger.c \ + toy-font-face.c transforms.c translate-show-surface.c \ + trap-clip.c twin.c twin-antialias-gray.c \ + twin-antialias-mixed.c twin-antialias-none.c \ + twin-antialias-subpixel.c unaligned-box.c \ + unantialiased-shapes.c unbounded-operator.c unclosed-strokes.c \ + user-data.c user-font.c user-font-mask.c user-font-proxy.c \ + user-font-rescale.c world-map.c white-in-noop.c \ + xcb-huge-image-shm.c xcb-huge-subimage.c xcb-stress-cache.c \ + xcb-snapshot-assert.c xcomposite-projection.c \ + xlib-expose-event.c zero-alpha.c zero-mask.c \ + pthread-same-source.c pthread-show-text.c pthread-similar.c \ + bitmap-font.c ft-font-create-for-ft-face.c \ + ft-show-glyphs-positioning.c ft-show-glyphs-table.c \ + ft-text-vertical-layout-type1.c \ + ft-text-vertical-layout-type3.c ft-text-antialias-none.c \ + gl-device-release.c gl-oversized-surface.c gl-surface-source.c \ + egl-oversized-surface.c egl-surface-source.c \ + quartz-surface-source.c pdf-features.c pdf-mime-data.c \ + pdf-surface-source.c ps-eps.c ps-features.c \ + ps-surface-source.c svg-surface.c svg-clip.c \ + svg-surface-source.c xcb-surface-source.c xlib-surface.c \ + xlib-surface-source.c get-xrender-format.c multi-page.c \ + fallback-resolution.c cairo-test-constructors.c +am__objects_1 = cairo_test_suite-buffer-diff.$(OBJEXT) \ + cairo_test_suite-cairo-test.$(OBJEXT) \ + cairo_test_suite-cairo-test-runner.$(OBJEXT) +am__objects_2 = +am__objects_3 = cairo_test_suite-pthread-same-source.$(OBJEXT) \ + cairo_test_suite-pthread-show-text.$(OBJEXT) \ + cairo_test_suite-pthread-similar.$(OBJEXT) +@HAVE_REAL_PTHREAD_TRUE@am__objects_4 = $(am__objects_3) +am__objects_5 = cairo_test_suite-bitmap-font.$(OBJEXT) \ + cairo_test_suite-ft-font-create-for-ft-face.$(OBJEXT) \ + cairo_test_suite-ft-show-glyphs-positioning.$(OBJEXT) \ + cairo_test_suite-ft-show-glyphs-table.$(OBJEXT) \ + cairo_test_suite-ft-text-vertical-layout-type1.$(OBJEXT) \ + cairo_test_suite-ft-text-vertical-layout-type3.$(OBJEXT) \ + cairo_test_suite-ft-text-antialias-none.$(OBJEXT) +@CAIRO_HAS_FC_FONT_TRUE@@CAIRO_HAS_FT_FONT_TRUE@am__objects_6 = $(am__objects_5) +am__objects_7 = cairo_test_suite-gl-device-release.$(OBJEXT) \ + cairo_test_suite-gl-oversized-surface.$(OBJEXT) \ + cairo_test_suite-gl-surface-source.$(OBJEXT) +@CAIRO_HAS_GL_SURFACE_TRUE@am__objects_8 = $(am__objects_7) +am__objects_9 = cairo_test_suite-egl-oversized-surface.$(OBJEXT) \ + cairo_test_suite-egl-surface-source.$(OBJEXT) +@CAIRO_HAS_EGL_FUNCTIONS_TRUE@am__objects_10 = $(am__objects_9) +am__objects_11 = cairo_test_suite-quartz-surface-source.$(OBJEXT) +@CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__objects_12 = $(am__objects_11) +am__objects_13 = cairo_test_suite-pdf-features.$(OBJEXT) \ + cairo_test_suite-pdf-mime-data.$(OBJEXT) \ + cairo_test_suite-pdf-surface-source.$(OBJEXT) +@CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_14 = $(am__objects_13) +am__objects_15 = cairo_test_suite-ps-eps.$(OBJEXT) \ + cairo_test_suite-ps-features.$(OBJEXT) \ + cairo_test_suite-ps-surface-source.$(OBJEXT) +@CAIRO_HAS_PS_SURFACE_TRUE@am__objects_16 = $(am__objects_15) +am__objects_17 = cairo_test_suite-svg-surface.$(OBJEXT) \ + cairo_test_suite-svg-clip.$(OBJEXT) \ + cairo_test_suite-svg-surface-source.$(OBJEXT) +@CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_18 = $(am__objects_17) +am__objects_19 = cairo_test_suite-xcb-surface-source.$(OBJEXT) +@CAIRO_HAS_XCB_SURFACE_TRUE@am__objects_20 = $(am__objects_19) +am__objects_21 = cairo_test_suite-xlib-surface.$(OBJEXT) \ + cairo_test_suite-xlib-surface-source.$(OBJEXT) +@CAIRO_HAS_XLIB_SURFACE_TRUE@am__objects_22 = $(am__objects_21) +am__objects_23 = cairo_test_suite-get-xrender-format.$(OBJEXT) +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__objects_24 = \ +@CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@ $(am__objects_23) +am__objects_25 = cairo_test_suite-multi-page.$(OBJEXT) +@CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE@am__objects_26 = \ +@CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE@ $(am__objects_25) +am__objects_27 = cairo_test_suite-fallback-resolution.$(OBJEXT) +@BUILD_ANY2PPM_TRUE@@CAIRO_HAS_PDF_SURFACE_FALSE@@CAIRO_HAS_PS_SURFACE_FALSE@@CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_28 = $(am__objects_27) +@BUILD_ANY2PPM_TRUE@@CAIRO_HAS_PDF_SURFACE_FALSE@@CAIRO_HAS_PS_SURFACE_TRUE@am__objects_28 = $(am__objects_27) +@BUILD_ANY2PPM_TRUE@@CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_28 = $(am__objects_27) +am__objects_29 = cairo_test_suite-a1-bug.$(OBJEXT) \ + cairo_test_suite-a1-clip.$(OBJEXT) \ + cairo_test_suite-a1-fill.$(OBJEXT) \ + cairo_test_suite-a1-image-sample.$(OBJEXT) \ + cairo_test_suite-a1-mask.$(OBJEXT) \ + cairo_test_suite-a1-mask-sample.$(OBJEXT) \ + cairo_test_suite-a1-sample.$(OBJEXT) \ + cairo_test_suite-a1-traps-sample.$(OBJEXT) \ + cairo_test_suite-a1-rasterisation.$(OBJEXT) \ + cairo_test_suite-a8-clear.$(OBJEXT) \ + cairo_test_suite-a8-mask.$(OBJEXT) \ + cairo_test_suite-aliasing.$(OBJEXT) \ + cairo_test_suite-alpha-similar.$(OBJEXT) \ + cairo_test_suite-arc-direction.$(OBJEXT) \ + cairo_test_suite-arc-infinite-loop.$(OBJEXT) \ + cairo_test_suite-arc-looping-dash.$(OBJEXT) \ + cairo_test_suite-api-special-cases.$(OBJEXT) \ + cairo_test_suite-big-line.$(OBJEXT) \ + cairo_test_suite-big-empty-box.$(OBJEXT) \ + cairo_test_suite-big-empty-triangle.$(OBJEXT) \ + cairo_test_suite-big-little-box.$(OBJEXT) \ + cairo_test_suite-big-little-triangle.$(OBJEXT) \ + cairo_test_suite-bug-spline.$(OBJEXT) \ + cairo_test_suite-big-trap.$(OBJEXT) \ + cairo_test_suite-bilevel-image.$(OBJEXT) \ + cairo_test_suite-bug-40410.$(OBJEXT) \ + cairo_test_suite-bug-51910.$(OBJEXT) \ + cairo_test_suite-bug-84115.$(OBJEXT) \ + cairo_test_suite-bug-bo-rectangular.$(OBJEXT) \ + cairo_test_suite-bug-bo-collins.$(OBJEXT) \ + cairo_test_suite-bug-bo-ricotz.$(OBJEXT) \ + cairo_test_suite-bug-source-cu.$(OBJEXT) \ + cairo_test_suite-bug-extents.$(OBJEXT) \ + cairo_test_suite-bug-seams.$(OBJEXT) \ + cairo_test_suite-caps.$(OBJEXT) \ + cairo_test_suite-checkerboard.$(OBJEXT) \ + cairo_test_suite-caps-joins.$(OBJEXT) \ + cairo_test_suite-caps-joins-alpha.$(OBJEXT) \ + cairo_test_suite-caps-joins-curve.$(OBJEXT) \ + cairo_test_suite-caps-tails-curve.$(OBJEXT) \ + cairo_test_suite-caps-sub-paths.$(OBJEXT) \ + cairo_test_suite-clear.$(OBJEXT) \ + cairo_test_suite-clear-source.$(OBJEXT) \ + cairo_test_suite-clip-all.$(OBJEXT) \ + cairo_test_suite-clip-complex-bug61592.$(OBJEXT) \ + cairo_test_suite-clip-complex-shape.$(OBJEXT) \ + cairo_test_suite-clip-contexts.$(OBJEXT) \ + cairo_test_suite-clip-disjoint.$(OBJEXT) \ + cairo_test_suite-clip-disjoint-hatching.$(OBJEXT) \ + cairo_test_suite-clip-disjoint-quad.$(OBJEXT) \ + cairo_test_suite-clip-device-offset.$(OBJEXT) \ + cairo_test_suite-clip-double-free.$(OBJEXT) \ + cairo_test_suite-clip-draw-unbounded.$(OBJEXT) \ + cairo_test_suite-clip-empty.$(OBJEXT) \ + cairo_test_suite-clip-empty-group.$(OBJEXT) \ + cairo_test_suite-clip-empty-save.$(OBJEXT) \ + cairo_test_suite-clip-fill.$(OBJEXT) \ + cairo_test_suite-clip-fill-no-op.$(OBJEXT) \ + cairo_test_suite-clip-fill-rule.$(OBJEXT) \ + cairo_test_suite-clip-fill-rule-pixel-aligned.$(OBJEXT) \ + cairo_test_suite-clip-group-shapes.$(OBJEXT) \ + cairo_test_suite-clip-image.$(OBJEXT) \ + cairo_test_suite-clip-intersect.$(OBJEXT) \ + cairo_test_suite-clip-mixed-antialias.$(OBJEXT) \ + cairo_test_suite-clip-nesting.$(OBJEXT) \ + cairo_test_suite-clip-operator.$(OBJEXT) \ + cairo_test_suite-clip-push-group.$(OBJEXT) \ + cairo_test_suite-clip-polygons.$(OBJEXT) \ + cairo_test_suite-clip-rectilinear.$(OBJEXT) \ + cairo_test_suite-clip-shape.$(OBJEXT) \ + cairo_test_suite-clip-stroke.$(OBJEXT) \ + cairo_test_suite-clip-stroke-no-op.$(OBJEXT) \ + cairo_test_suite-clip-text.$(OBJEXT) \ + cairo_test_suite-clip-twice.$(OBJEXT) \ + cairo_test_suite-clip-twice-rectangle.$(OBJEXT) \ + cairo_test_suite-clip-unbounded.$(OBJEXT) \ + cairo_test_suite-clip-zero.$(OBJEXT) \ + cairo_test_suite-clipped-group.$(OBJEXT) \ + cairo_test_suite-clipped-surface.$(OBJEXT) \ + cairo_test_suite-close-path.$(OBJEXT) \ + cairo_test_suite-close-path-current-point.$(OBJEXT) \ + cairo_test_suite-composite-integer-translate-source.$(OBJEXT) \ + cairo_test_suite-composite-integer-translate-over.$(OBJEXT) \ + cairo_test_suite-composite-integer-translate-over-repeat.$(OBJEXT) \ + cairo_test_suite-copy-disjoint.$(OBJEXT) \ + cairo_test_suite-copy-path.$(OBJEXT) \ + cairo_test_suite-coverage.$(OBJEXT) \ + cairo_test_suite-create-for-stream.$(OBJEXT) \ + cairo_test_suite-create-from-png.$(OBJEXT) \ + cairo_test_suite-create-from-png-stream.$(OBJEXT) \ + cairo_test_suite-culled-glyphs.$(OBJEXT) \ + cairo_test_suite-curve-to-as-line-to.$(OBJEXT) \ + cairo_test_suite-dash-caps-joins.$(OBJEXT) \ + cairo_test_suite-dash-curve.$(OBJEXT) \ + cairo_test_suite-dash-infinite-loop.$(OBJEXT) \ + cairo_test_suite-dash-no-dash.$(OBJEXT) \ + cairo_test_suite-dash-offset.$(OBJEXT) \ + cairo_test_suite-dash-offset-negative.$(OBJEXT) \ + cairo_test_suite-dash-scale.$(OBJEXT) \ + cairo_test_suite-dash-state.$(OBJEXT) \ + cairo_test_suite-dash-zero-length.$(OBJEXT) \ + cairo_test_suite-degenerate-arc.$(OBJEXT) \ + cairo_test_suite-degenerate-arcs.$(OBJEXT) \ + cairo_test_suite-degenerate-curve-to.$(OBJEXT) \ + cairo_test_suite-degenerate-dash.$(OBJEXT) \ + cairo_test_suite-degenerate-linear-gradient.$(OBJEXT) \ + cairo_test_suite-degenerate-path.$(OBJEXT) \ + cairo_test_suite-degenerate-pen.$(OBJEXT) \ + cairo_test_suite-degenerate-radial-gradient.$(OBJEXT) \ + cairo_test_suite-degenerate-rel-curve-to.$(OBJEXT) \ + cairo_test_suite-degenerate-solid-dash.$(OBJEXT) \ + cairo_test_suite-drunkard-tails.$(OBJEXT) \ + cairo_test_suite-device-offset.$(OBJEXT) \ + cairo_test_suite-device-offset-fractional.$(OBJEXT) \ + cairo_test_suite-device-offset-positive.$(OBJEXT) \ + cairo_test_suite-device-offset-scale.$(OBJEXT) \ + cairo_test_suite-error-setters.$(OBJEXT) \ + cairo_test_suite-extend-pad.$(OBJEXT) \ + cairo_test_suite-extend-pad-border.$(OBJEXT) \ + cairo_test_suite-extend-pad-similar.$(OBJEXT) \ + cairo_test_suite-extend-reflect.$(OBJEXT) \ + cairo_test_suite-extend-reflect-similar.$(OBJEXT) \ + cairo_test_suite-extend-repeat.$(OBJEXT) \ + cairo_test_suite-extend-repeat-similar.$(OBJEXT) \ + cairo_test_suite-extended-blend.$(OBJEXT) \ + cairo_test_suite-fallback.$(OBJEXT) \ + cairo_test_suite-fill-alpha.$(OBJEXT) \ + cairo_test_suite-fill-alpha-pattern.$(OBJEXT) \ + cairo_test_suite-fill-and-stroke.$(OBJEXT) \ + cairo_test_suite-fill-and-stroke-alpha.$(OBJEXT) \ + cairo_test_suite-fill-and-stroke-alpha-add.$(OBJEXT) \ + cairo_test_suite-fill-degenerate-sort-order.$(OBJEXT) \ + cairo_test_suite-fill-disjoint.$(OBJEXT) \ + cairo_test_suite-fill-empty.$(OBJEXT) \ + cairo_test_suite-fill-image.$(OBJEXT) \ + cairo_test_suite-fill-missed-stop.$(OBJEXT) \ + cairo_test_suite-fill-rule.$(OBJEXT) \ + cairo_test_suite-filter-bilinear-extents.$(OBJEXT) \ + cairo_test_suite-filter-nearest-offset.$(OBJEXT) \ + cairo_test_suite-filter-nearest-transformed.$(OBJEXT) \ + cairo_test_suite-finer-grained-fallbacks.$(OBJEXT) \ + cairo_test_suite-font-face-get-type.$(OBJEXT) \ + cairo_test_suite-font-matrix-translation.$(OBJEXT) \ + cairo_test_suite-font-options.$(OBJEXT) \ + cairo_test_suite-glyph-cache-pressure.$(OBJEXT) \ + cairo_test_suite-get-and-set.$(OBJEXT) \ + cairo_test_suite-get-clip.$(OBJEXT) \ + cairo_test_suite-get-group-target.$(OBJEXT) \ + cairo_test_suite-get-path-extents.$(OBJEXT) \ + cairo_test_suite-gradient-alpha.$(OBJEXT) \ + cairo_test_suite-gradient-constant-alpha.$(OBJEXT) \ + cairo_test_suite-gradient-zero-stops.$(OBJEXT) \ + cairo_test_suite-gradient-zero-stops-mask.$(OBJEXT) \ + cairo_test_suite-group-clip.$(OBJEXT) \ + cairo_test_suite-group-paint.$(OBJEXT) \ + cairo_test_suite-group-state.$(OBJEXT) \ + cairo_test_suite-group-unaligned.$(OBJEXT) \ + cairo_test_suite-half-coverage.$(OBJEXT) \ + cairo_test_suite-halo.$(OBJEXT) \ + cairo_test_suite-hatchings.$(OBJEXT) \ + cairo_test_suite-horizontal-clip.$(OBJEXT) \ + cairo_test_suite-huge-linear.$(OBJEXT) \ + cairo_test_suite-huge-radial.$(OBJEXT) \ + cairo_test_suite-image-surface-source.$(OBJEXT) \ + cairo_test_suite-image-bug-710072.$(OBJEXT) \ + cairo_test_suite-implicit-close.$(OBJEXT) \ + cairo_test_suite-infinite-join.$(OBJEXT) \ + cairo_test_suite-in-fill-empty-trapezoid.$(OBJEXT) \ + cairo_test_suite-in-fill-trapezoid.$(OBJEXT) \ + cairo_test_suite-invalid-matrix.$(OBJEXT) \ + cairo_test_suite-inverse-text.$(OBJEXT) \ + cairo_test_suite-inverted-clip.$(OBJEXT) \ + cairo_test_suite-joins.$(OBJEXT) \ + cairo_test_suite-joins-loop.$(OBJEXT) \ + cairo_test_suite-joins-star.$(OBJEXT) \ + cairo_test_suite-joins-retrace.$(OBJEXT) \ + cairo_test_suite-large-clip.$(OBJEXT) \ + cairo_test_suite-large-font.$(OBJEXT) \ + cairo_test_suite-large-source.$(OBJEXT) \ + cairo_test_suite-large-source-roi.$(OBJEXT) \ + cairo_test_suite-large-twin-antialias-mixed.$(OBJEXT) \ + cairo_test_suite-leaky-dash.$(OBJEXT) \ + cairo_test_suite-leaky-dashed-rectangle.$(OBJEXT) \ + cairo_test_suite-leaky-dashed-stroke.$(OBJEXT) \ + cairo_test_suite-leaky-polygon.$(OBJEXT) \ + cairo_test_suite-line-width.$(OBJEXT) \ + cairo_test_suite-line-width-large-overlap.$(OBJEXT) \ + cairo_test_suite-line-width-overlap.$(OBJEXT) \ + cairo_test_suite-line-width-scale.$(OBJEXT) \ + cairo_test_suite-line-width-tolerance.$(OBJEXT) \ + cairo_test_suite-line-width-zero.$(OBJEXT) \ + cairo_test_suite-linear-gradient.$(OBJEXT) \ + cairo_test_suite-linear-gradient-extend.$(OBJEXT) \ + cairo_test_suite-linear-gradient-large.$(OBJEXT) \ + cairo_test_suite-linear-gradient-one-stop.$(OBJEXT) \ + cairo_test_suite-linear-gradient-reflect.$(OBJEXT) \ + cairo_test_suite-linear-gradient-subset.$(OBJEXT) \ + cairo_test_suite-linear-step-function.$(OBJEXT) \ + cairo_test_suite-linear-uniform.$(OBJEXT) \ + cairo_test_suite-long-dashed-lines.$(OBJEXT) \ + cairo_test_suite-long-lines.$(OBJEXT) \ + cairo_test_suite-map-to-image.$(OBJEXT) \ + cairo_test_suite-mask.$(OBJEXT) \ + cairo_test_suite-mask-alpha.$(OBJEXT) \ + cairo_test_suite-mask-ctm.$(OBJEXT) \ + cairo_test_suite-mask-glyphs.$(OBJEXT) \ + cairo_test_suite-mask-surface-ctm.$(OBJEXT) \ + cairo_test_suite-mask-transformed-image.$(OBJEXT) \ + cairo_test_suite-mask-transformed-similar.$(OBJEXT) \ + cairo_test_suite-mesh-pattern.$(OBJEXT) \ + cairo_test_suite-mesh-pattern-accuracy.$(OBJEXT) \ + cairo_test_suite-mesh-pattern-conical.$(OBJEXT) \ + cairo_test_suite-mesh-pattern-control-points.$(OBJEXT) \ + cairo_test_suite-mesh-pattern-fold.$(OBJEXT) \ + cairo_test_suite-mesh-pattern-overlap.$(OBJEXT) \ + cairo_test_suite-mesh-pattern-transformed.$(OBJEXT) \ + cairo_test_suite-mime-data.$(OBJEXT) \ + cairo_test_suite-mime-surface-api.$(OBJEXT) \ + cairo_test_suite-miter-precision.$(OBJEXT) \ + cairo_test_suite-move-to-show-surface.$(OBJEXT) \ + cairo_test_suite-negative-stride-image.$(OBJEXT) \ + cairo_test_suite-new-sub-path.$(OBJEXT) \ + cairo_test_suite-nil-surface.$(OBJEXT) \ + cairo_test_suite-operator.$(OBJEXT) \ + cairo_test_suite-operator-alpha.$(OBJEXT) \ + cairo_test_suite-operator-alpha-alpha.$(OBJEXT) \ + cairo_test_suite-operator-clear.$(OBJEXT) \ + cairo_test_suite-operator-source.$(OBJEXT) \ + cairo_test_suite-outline-tolerance.$(OBJEXT) \ + cairo_test_suite-over-above-source.$(OBJEXT) \ + cairo_test_suite-over-around-source.$(OBJEXT) \ + cairo_test_suite-over-below-source.$(OBJEXT) \ + cairo_test_suite-over-between-source.$(OBJEXT) \ + cairo_test_suite-overlapping-boxes.$(OBJEXT) \ + cairo_test_suite-overlapping-glyphs.$(OBJEXT) \ + cairo_test_suite-overlapping-dash-caps.$(OBJEXT) \ + cairo_test_suite-paint.$(OBJEXT) \ + cairo_test_suite-paint-clip-fill.$(OBJEXT) \ + cairo_test_suite-paint-repeat.$(OBJEXT) \ + cairo_test_suite-paint-source-alpha.$(OBJEXT) \ + cairo_test_suite-paint-with-alpha.$(OBJEXT) \ + cairo_test_suite-paint-with-alpha-group-clip.$(OBJEXT) \ + cairo_test_suite-partial-clip-text.$(OBJEXT) \ + cairo_test_suite-partial-coverage.$(OBJEXT) \ + cairo_test_suite-pass-through.$(OBJEXT) \ + cairo_test_suite-path-append.$(OBJEXT) \ + cairo_test_suite-path-currentpoint.$(OBJEXT) \ + cairo_test_suite-path-stroke-twice.$(OBJEXT) \ + cairo_test_suite-path-precision.$(OBJEXT) \ + cairo_test_suite-pattern-get-type.$(OBJEXT) \ + cairo_test_suite-pattern-getters.$(OBJEXT) \ + cairo_test_suite-pdf-isolated-group.$(OBJEXT) \ + cairo_test_suite-pixman-downscale.$(OBJEXT) \ + cairo_test_suite-pixman-rotate.$(OBJEXT) \ + cairo_test_suite-png.$(OBJEXT) \ + cairo_test_suite-push-group.$(OBJEXT) \ + cairo_test_suite-push-group-color.$(OBJEXT) \ + cairo_test_suite-push-group-path-offset.$(OBJEXT) \ + cairo_test_suite-radial-gradient.$(OBJEXT) \ + cairo_test_suite-radial-gradient-extend.$(OBJEXT) \ + cairo_test_suite-radial-outer-focus.$(OBJEXT) \ + cairo_test_suite-random-clips.$(OBJEXT) \ + cairo_test_suite-random-intersections-eo.$(OBJEXT) \ + cairo_test_suite-random-intersections-nonzero.$(OBJEXT) \ + cairo_test_suite-random-intersections-curves-eo.$(OBJEXT) \ + cairo_test_suite-random-intersections-curves-nz.$(OBJEXT) \ + cairo_test_suite-raster-source.$(OBJEXT) \ + cairo_test_suite-record.$(OBJEXT) \ + cairo_test_suite-record1414x.$(OBJEXT) \ + cairo_test_suite-record2x.$(OBJEXT) \ + cairo_test_suite-record90.$(OBJEXT) \ + cairo_test_suite-recordflip.$(OBJEXT) \ + cairo_test_suite-record-extend.$(OBJEXT) \ + cairo_test_suite-record-mesh.$(OBJEXT) \ + cairo_test_suite-recording-surface-pattern.$(OBJEXT) \ + cairo_test_suite-recording-surface-extend.$(OBJEXT) \ + cairo_test_suite-rectangle-rounding-error.$(OBJEXT) \ + cairo_test_suite-rectilinear-fill.$(OBJEXT) \ + cairo_test_suite-rectilinear-grid.$(OBJEXT) \ + cairo_test_suite-rectilinear-miter-limit.$(OBJEXT) \ + cairo_test_suite-rectilinear-dash.$(OBJEXT) \ + cairo_test_suite-rectilinear-dash-scale.$(OBJEXT) \ + cairo_test_suite-rectilinear-stroke.$(OBJEXT) \ + cairo_test_suite-reflected-stroke.$(OBJEXT) \ + cairo_test_suite-rel-path.$(OBJEXT) \ + cairo_test_suite-rgb24-ignore-alpha.$(OBJEXT) \ + cairo_test_suite-rotate-image-surface-paint.$(OBJEXT) \ + cairo_test_suite-rotate-stroke-box.$(OBJEXT) \ + cairo_test_suite-rotated-clip.$(OBJEXT) \ + cairo_test_suite-rounded-rectangle-fill.$(OBJEXT) \ + cairo_test_suite-rounded-rectangle-stroke.$(OBJEXT) \ + cairo_test_suite-sample.$(OBJEXT) \ + cairo_test_suite-scale-down-source-surface-paint.$(OBJEXT) \ + cairo_test_suite-scale-offset-image.$(OBJEXT) \ + cairo_test_suite-scale-offset-similar.$(OBJEXT) \ + cairo_test_suite-scale-source-surface-paint.$(OBJEXT) \ + cairo_test_suite-scaled-font-zero-matrix.$(OBJEXT) \ + cairo_test_suite-stroke-ctm-caps.$(OBJEXT) \ + cairo_test_suite-stroke-clipped.$(OBJEXT) \ + cairo_test_suite-stroke-image.$(OBJEXT) \ + cairo_test_suite-stroke-open-box.$(OBJEXT) \ + cairo_test_suite-select-font-face.$(OBJEXT) \ + cairo_test_suite-select-font-no-show-text.$(OBJEXT) \ + cairo_test_suite-self-copy.$(OBJEXT) \ + cairo_test_suite-self-copy-overlap.$(OBJEXT) \ + cairo_test_suite-self-intersecting.$(OBJEXT) \ + cairo_test_suite-set-source.$(OBJEXT) \ + cairo_test_suite-show-glyphs-advance.$(OBJEXT) \ + cairo_test_suite-show-glyphs-many.$(OBJEXT) \ + cairo_test_suite-show-text-current-point.$(OBJEXT) \ + cairo_test_suite-shape-general-convex.$(OBJEXT) \ + cairo_test_suite-shape-sierpinski.$(OBJEXT) \ + cairo_test_suite-simple.$(OBJEXT) \ + cairo_test_suite-skew-extreme.$(OBJEXT) \ + cairo_test_suite-smask.$(OBJEXT) \ + cairo_test_suite-smask-fill.$(OBJEXT) \ + cairo_test_suite-smask-image-mask.$(OBJEXT) \ + cairo_test_suite-smask-mask.$(OBJEXT) \ + cairo_test_suite-smask-paint.$(OBJEXT) \ + cairo_test_suite-smask-stroke.$(OBJEXT) \ + cairo_test_suite-smask-text.$(OBJEXT) \ + cairo_test_suite-solid-pattern-cache-stress.$(OBJEXT) \ + cairo_test_suite-source-clip.$(OBJEXT) \ + cairo_test_suite-source-clip-scale.$(OBJEXT) \ + cairo_test_suite-source-surface-scale-paint.$(OBJEXT) \ + cairo_test_suite-spline-decomposition.$(OBJEXT) \ + cairo_test_suite-stride-12-image.$(OBJEXT) \ + cairo_test_suite-stroke-pattern.$(OBJEXT) \ + cairo_test_suite-subsurface.$(OBJEXT) \ + cairo_test_suite-subsurface-image-repeat.$(OBJEXT) \ + cairo_test_suite-subsurface-repeat.$(OBJEXT) \ + cairo_test_suite-subsurface-reflect.$(OBJEXT) \ + cairo_test_suite-subsurface-pad.$(OBJEXT) \ + cairo_test_suite-subsurface-modify-child.$(OBJEXT) \ + cairo_test_suite-subsurface-modify-parent.$(OBJEXT) \ + cairo_test_suite-subsurface-outside-target.$(OBJEXT) \ + cairo_test_suite-subsurface-scale.$(OBJEXT) \ + cairo_test_suite-subsurface-similar-repeat.$(OBJEXT) \ + cairo_test_suite-surface-finish-twice.$(OBJEXT) \ + cairo_test_suite-surface-pattern.$(OBJEXT) \ + cairo_test_suite-surface-pattern-big-scale-down.$(OBJEXT) \ + cairo_test_suite-surface-pattern-operator.$(OBJEXT) \ + cairo_test_suite-surface-pattern-scale-down.$(OBJEXT) \ + cairo_test_suite-surface-pattern-scale-down-extend.$(OBJEXT) \ + cairo_test_suite-surface-pattern-scale-up.$(OBJEXT) \ + cairo_test_suite-text-antialias.$(OBJEXT) \ + cairo_test_suite-text-antialias-subpixel.$(OBJEXT) \ + cairo_test_suite-text-cache-crash.$(OBJEXT) \ + cairo_test_suite-text-glyph-range.$(OBJEXT) \ + cairo_test_suite-text-pattern.$(OBJEXT) \ + cairo_test_suite-text-rotate.$(OBJEXT) \ + cairo_test_suite-text-transform.$(OBJEXT) \ + cairo_test_suite-text-zero-len.$(OBJEXT) \ + cairo_test_suite-tighten-bounds.$(OBJEXT) \ + cairo_test_suite-tiger.$(OBJEXT) \ + cairo_test_suite-toy-font-face.$(OBJEXT) \ + cairo_test_suite-transforms.$(OBJEXT) \ + cairo_test_suite-translate-show-surface.$(OBJEXT) \ + cairo_test_suite-trap-clip.$(OBJEXT) \ + cairo_test_suite-twin.$(OBJEXT) \ + cairo_test_suite-twin-antialias-gray.$(OBJEXT) \ + cairo_test_suite-twin-antialias-mixed.$(OBJEXT) \ + cairo_test_suite-twin-antialias-none.$(OBJEXT) \ + cairo_test_suite-twin-antialias-subpixel.$(OBJEXT) \ + cairo_test_suite-unaligned-box.$(OBJEXT) \ + cairo_test_suite-unantialiased-shapes.$(OBJEXT) \ + cairo_test_suite-unbounded-operator.$(OBJEXT) \ + cairo_test_suite-unclosed-strokes.$(OBJEXT) \ + cairo_test_suite-user-data.$(OBJEXT) \ + cairo_test_suite-user-font.$(OBJEXT) \ + cairo_test_suite-user-font-mask.$(OBJEXT) \ + cairo_test_suite-user-font-proxy.$(OBJEXT) \ + cairo_test_suite-user-font-rescale.$(OBJEXT) \ + cairo_test_suite-world-map.$(OBJEXT) \ + cairo_test_suite-white-in-noop.$(OBJEXT) \ + cairo_test_suite-xcb-huge-image-shm.$(OBJEXT) \ + cairo_test_suite-xcb-huge-subimage.$(OBJEXT) \ + cairo_test_suite-xcb-stress-cache.$(OBJEXT) \ + cairo_test_suite-xcb-snapshot-assert.$(OBJEXT) \ + cairo_test_suite-xcomposite-projection.$(OBJEXT) \ + cairo_test_suite-xlib-expose-event.$(OBJEXT) \ + cairo_test_suite-zero-alpha.$(OBJEXT) \ + cairo_test_suite-zero-mask.$(OBJEXT) $(am__objects_4) \ + $(am__objects_6) $(am__objects_8) $(am__objects_10) \ + $(am__objects_12) $(am__objects_14) $(am__objects_16) \ + $(am__objects_18) $(am__objects_2) $(am__objects_20) \ + $(am__objects_22) $(am__objects_24) $(am__objects_26) \ + $(am__objects_28) +am_cairo_test_suite_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_29) \ + cairo_test_suite-cairo-test-constructors.$(OBJEXT) +cairo_test_suite_OBJECTS = $(am_cairo_test_suite_OBJECTS) +cairo_test_suite_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cairo_test_suite_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am__cairo_test_trace_SOURCES_DIST = cairo-test-trace.c buffer-diff.c \ + buffer-diff.h +@HAVE_SHM_TRUE@am_cairo_test_trace_OBJECTS = \ +@HAVE_SHM_TRUE@ cairo_test_trace-cairo-test-trace.$(OBJEXT) \ +@HAVE_SHM_TRUE@ cairo_test_trace-buffer-diff.$(OBJEXT) +cairo_test_trace_OBJECTS = $(am_cairo_test_trace_OBJECTS) +cairo_test_trace_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cairo_test_trace_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +am_imagediff_OBJECTS = imagediff.$(OBJEXT) buffer-diff.$(OBJEXT) +imagediff_OBJECTS = $(am_imagediff_OBJECTS) +imagediff_DEPENDENCIES = $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/src/libcairo.la +pdf2png_SOURCES = pdf2png.c +pdf2png_OBJECTS = pdf2png-pdf2png.$(OBJEXT) +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@pdf2png_DEPENDENCIES = $(top_builddir)/src/libcairo.la \ +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@ $(am__DEPENDENCIES_1) +pdf2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pdf2png_CFLAGS) \ + $(CFLAGS) $(pdf2png_LDFLAGS) $(LDFLAGS) -o $@ +am_png_flatten_OBJECTS = png-flatten.$(OBJEXT) +png_flatten_OBJECTS = $(am_png_flatten_OBJECTS) +png_flatten_DEPENDENCIES = $(top_builddir)/src/libcairo.la +ps2png_SOURCES = ps2png.c +ps2png_OBJECTS = ps2png-ps2png.$(OBJEXT) +@CAIRO_HAS_SPECTRE_TRUE@ps2png_DEPENDENCIES = \ +@CAIRO_HAS_SPECTRE_TRUE@ $(top_builddir)/src/libcairo.la \ +@CAIRO_HAS_SPECTRE_TRUE@ $(am__DEPENDENCIES_1) +ps2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ps2png_CFLAGS) $(CFLAGS) \ + $(ps2png_LDFLAGS) $(LDFLAGS) -o $@ +svg2png_SOURCES = svg2png.c +svg2png_OBJECTS = svg2png-svg2png.$(OBJEXT) +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@svg2png_DEPENDENCIES = $(top_builddir)/src/libcairo.la \ +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@ $(am__DEPENDENCIES_1) +svg2png_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(svg2png_CFLAGS) \ + $(CFLAGS) $(svg2png_LDFLAGS) $(LDFLAGS) -o $@ +SCRIPTS = $(noinst_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = any2ppm.c $(cairo_test_suite_SOURCES) \ + $(cairo_test_trace_SOURCES) $(imagediff_SOURCES) pdf2png.c \ + $(png_flatten_SOURCES) ps2png.c svg2png.c +DIST_SOURCES = any2ppm.c $(am__cairo_test_suite_SOURCES_DIST) \ + $(am__cairo_test_trace_SOURCES_DIST) $(imagediff_SOURCES) \ + pdf2png.c $(png_flatten_SOURCES) ps2png.c svg2png.c +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + check recheck distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = cairo-test-constructors.c +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) $(BUILT_SOURCES) valgrind-log ref.hash \ + ref.list png-test.png png.out.png create-for-stream.pdf \ + create-for-stream.ps create-for-stream.svg \ + svg-surface-source.out.svg pdf-surface-source.out.pdf \ + ps-surface-source.out.ps pdf-features.pdf pdf-mime-data.out* \ + ps-features.ps svg-clip.svg svg-surface.svg multi-page.pdf \ + multi-page.ps $(NULL) +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = $(BUILT_SOURCES) $(noinst_SCRIPTS) COPYING \ + make-cairo-test-constructors.sh run-cairo-test-suite.sh \ + generate_refs.sh tiger.inc 6x13.pcf index.html jp2.jp2 \ + jpeg.jpg png.png romedalen.jpg romedalen.png scarab.jpg \ + surface-source.c testtable.js reference Makefile.win32 +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in +TESTS = cairo-test-suite$(EXEEXT) +test_sources = a1-bug.c a1-clip.c a1-fill.c a1-image-sample.c \ + a1-mask.c a1-mask-sample.c a1-sample.c a1-traps-sample.c \ + a1-rasterisation.c a8-clear.c a8-mask.c aliasing.c \ + alpha-similar.c arc-direction.c arc-infinite-loop.c \ + arc-looping-dash.c api-special-cases.c big-line.c \ + big-empty-box.c big-empty-triangle.c big-little-box.c \ + big-little-triangle.c bug-spline.c big-trap.c bilevel-image.c \ + bug-40410.c bug-51910.c bug-84115.c bug-bo-rectangular.c \ + bug-bo-collins.c bug-bo-ricotz.c bug-source-cu.c bug-extents.c \ + bug-seams.c caps.c checkerboard.c caps-joins.c \ + caps-joins-alpha.c caps-joins-curve.c caps-tails-curve.c \ + caps-sub-paths.c clear.c clear-source.c clip-all.c \ + clip-complex-bug61592.c clip-complex-shape.c clip-contexts.c \ + clip-disjoint.c clip-disjoint-hatching.c clip-disjoint-quad.c \ + clip-device-offset.c clip-double-free.c clip-draw-unbounded.c \ + clip-empty.c clip-empty-group.c clip-empty-save.c clip-fill.c \ + clip-fill-no-op.c clip-fill-rule.c \ + clip-fill-rule-pixel-aligned.c clip-group-shapes.c \ + clip-image.c clip-intersect.c clip-mixed-antialias.c \ + clip-nesting.c clip-operator.c clip-push-group.c \ + clip-polygons.c clip-rectilinear.c clip-shape.c clip-stroke.c \ + clip-stroke-no-op.c clip-text.c clip-twice.c \ + clip-twice-rectangle.c clip-unbounded.c clip-zero.c \ + clipped-group.c clipped-surface.c close-path.c \ + close-path-current-point.c \ + composite-integer-translate-source.c \ + composite-integer-translate-over.c \ + composite-integer-translate-over-repeat.c copy-disjoint.c \ + copy-path.c coverage.c create-for-stream.c create-from-png.c \ + create-from-png-stream.c culled-glyphs.c curve-to-as-line-to.c \ + dash-caps-joins.c dash-curve.c dash-infinite-loop.c \ + dash-no-dash.c dash-offset.c dash-offset-negative.c \ + dash-scale.c dash-state.c dash-zero-length.c degenerate-arc.c \ + degenerate-arcs.c degenerate-curve-to.c degenerate-dash.c \ + degenerate-linear-gradient.c degenerate-path.c \ + degenerate-pen.c degenerate-radial-gradient.c \ + degenerate-rel-curve-to.c degenerate-solid-dash.c \ + drunkard-tails.c device-offset.c device-offset-fractional.c \ + device-offset-positive.c device-offset-scale.c error-setters.c \ + extend-pad.c extend-pad-border.c extend-pad-similar.c \ + extend-reflect.c extend-reflect-similar.c extend-repeat.c \ + extend-repeat-similar.c extended-blend.c fallback.c \ + fill-alpha.c fill-alpha-pattern.c fill-and-stroke.c \ + fill-and-stroke-alpha.c fill-and-stroke-alpha-add.c \ + fill-degenerate-sort-order.c fill-disjoint.c fill-empty.c \ + fill-image.c fill-missed-stop.c fill-rule.c \ + filter-bilinear-extents.c filter-nearest-offset.c \ + filter-nearest-transformed.c finer-grained-fallbacks.c \ + font-face-get-type.c font-matrix-translation.c font-options.c \ + glyph-cache-pressure.c get-and-set.c get-clip.c \ + get-group-target.c get-path-extents.c gradient-alpha.c \ + gradient-constant-alpha.c gradient-zero-stops.c \ + gradient-zero-stops-mask.c group-clip.c group-paint.c \ + group-state.c group-unaligned.c half-coverage.c halo.c \ + hatchings.c horizontal-clip.c huge-linear.c huge-radial.c \ + image-surface-source.c image-bug-710072.c implicit-close.c \ + infinite-join.c in-fill-empty-trapezoid.c in-fill-trapezoid.c \ + invalid-matrix.c inverse-text.c inverted-clip.c joins.c \ + joins-loop.c joins-star.c joins-retrace.c large-clip.c \ + large-font.c large-source.c large-source-roi.c \ + large-twin-antialias-mixed.c leaky-dash.c \ + leaky-dashed-rectangle.c leaky-dashed-stroke.c leaky-polygon.c \ + line-width.c line-width-large-overlap.c line-width-overlap.c \ + line-width-scale.c line-width-tolerance.c line-width-zero.c \ + linear-gradient.c linear-gradient-extend.c \ + linear-gradient-large.c linear-gradient-one-stop.c \ + linear-gradient-reflect.c linear-gradient-subset.c \ + linear-step-function.c linear-uniform.c long-dashed-lines.c \ + long-lines.c map-to-image.c mask.c mask-alpha.c mask-ctm.c \ + mask-glyphs.c mask-surface-ctm.c mask-transformed-image.c \ + mask-transformed-similar.c mesh-pattern.c \ + mesh-pattern-accuracy.c mesh-pattern-conical.c \ + mesh-pattern-control-points.c mesh-pattern-fold.c \ + mesh-pattern-overlap.c mesh-pattern-transformed.c mime-data.c \ + mime-surface-api.c miter-precision.c move-to-show-surface.c \ + negative-stride-image.c new-sub-path.c nil-surface.c \ + operator.c operator-alpha.c operator-alpha-alpha.c \ + operator-clear.c operator-source.c outline-tolerance.c \ + over-above-source.c over-around-source.c over-below-source.c \ + over-between-source.c overlapping-boxes.c overlapping-glyphs.c \ + overlapping-dash-caps.c paint.c paint-clip-fill.c \ + paint-repeat.c paint-source-alpha.c paint-with-alpha.c \ + paint-with-alpha-group-clip.c partial-clip-text.c \ + partial-coverage.c pass-through.c path-append.c \ + path-currentpoint.c path-stroke-twice.c path-precision.c \ + pattern-get-type.c pattern-getters.c pdf-isolated-group.c \ + pixman-downscale.c pixman-rotate.c png.c push-group.c \ + push-group-color.c push-group-path-offset.c radial-gradient.c \ + radial-gradient-extend.c radial-outer-focus.c random-clips.c \ + random-intersections-eo.c random-intersections-nonzero.c \ + random-intersections-curves-eo.c \ + random-intersections-curves-nz.c raster-source.c record.c \ + record1414x.c record2x.c record90.c recordflip.c \ + record-extend.c record-mesh.c recording-surface-pattern.c \ + recording-surface-extend.c rectangle-rounding-error.c \ + rectilinear-fill.c rectilinear-grid.c \ + rectilinear-miter-limit.c rectilinear-dash.c \ + rectilinear-dash-scale.c rectilinear-stroke.c \ + reflected-stroke.c rel-path.c rgb24-ignore-alpha.c \ + rotate-image-surface-paint.c rotate-stroke-box.c \ + rotated-clip.c rounded-rectangle-fill.c \ + rounded-rectangle-stroke.c sample.c \ + scale-down-source-surface-paint.c scale-offset-image.c \ + scale-offset-similar.c scale-source-surface-paint.c \ + scaled-font-zero-matrix.c stroke-ctm-caps.c stroke-clipped.c \ + stroke-image.c stroke-open-box.c select-font-face.c \ + select-font-no-show-text.c self-copy.c self-copy-overlap.c \ + self-intersecting.c set-source.c show-glyphs-advance.c \ + show-glyphs-many.c show-text-current-point.c \ + shape-general-convex.c shape-sierpinski.c simple.c \ + skew-extreme.c smask.c smask-fill.c smask-image-mask.c \ + smask-mask.c smask-paint.c smask-stroke.c smask-text.c \ + solid-pattern-cache-stress.c source-clip.c source-clip-scale.c \ + source-surface-scale-paint.c spline-decomposition.c \ + stride-12-image.c stroke-pattern.c subsurface.c \ + subsurface-image-repeat.c subsurface-repeat.c \ + subsurface-reflect.c subsurface-pad.c \ + subsurface-modify-child.c subsurface-modify-parent.c \ + subsurface-outside-target.c subsurface-scale.c \ + subsurface-similar-repeat.c surface-finish-twice.c \ + surface-pattern.c surface-pattern-big-scale-down.c \ + surface-pattern-operator.c surface-pattern-scale-down.c \ + surface-pattern-scale-down-extend.c surface-pattern-scale-up.c \ + text-antialias.c text-antialias-subpixel.c text-cache-crash.c \ + text-glyph-range.c text-pattern.c text-rotate.c \ + text-transform.c text-zero-len.c tighten-bounds.c tiger.c \ + toy-font-face.c transforms.c translate-show-surface.c \ + trap-clip.c twin.c twin-antialias-gray.c \ + twin-antialias-mixed.c twin-antialias-none.c \ + twin-antialias-subpixel.c unaligned-box.c \ + unantialiased-shapes.c unbounded-operator.c unclosed-strokes.c \ + user-data.c user-font.c user-font-mask.c user-font-proxy.c \ + user-font-rescale.c world-map.c white-in-noop.c \ + xcb-huge-image-shm.c xcb-huge-subimage.c xcb-stress-cache.c \ + xcb-snapshot-assert.c xcomposite-projection.c \ + xlib-expose-event.c zero-alpha.c zero-mask.c $(am__append_1) \ + $(am__append_2) $(am__append_3) $(am__append_4) \ + $(am__append_5) $(am__append_6) $(am__append_7) \ + $(am__append_8) $(am__append_9) $(am__append_10) \ + $(am__append_11) $(am__append_12) $(am__append_13) $(test) +pthread_test_sources = \ + pthread-same-source.c \ + pthread-show-text.c \ + pthread-similar.c \ + $(NULL) + +ft_font_test_sources = \ + bitmap-font.c \ + ft-font-create-for-ft-face.c \ + ft-show-glyphs-positioning.c \ + ft-show-glyphs-table.c \ + ft-text-vertical-layout-type1.c \ + ft-text-vertical-layout-type3.c \ + ft-text-antialias-none.c + +gl_surface_test_sources = \ + gl-device-release.c \ + gl-oversized-surface.c \ + gl-surface-source.c + +egl_surface_test_sources = \ + egl-oversized-surface.c \ + egl-surface-source.c + +quartz_surface_test_sources = quartz-surface-source.c +pdf_surface_test_sources = \ + pdf-features.c \ + pdf-mime-data.c \ + pdf-surface-source.c + +ps_surface_test_sources = \ + ps-eps.c \ + ps-features.c \ + ps-surface-source.c + +svg_surface_test_sources = \ + svg-surface.c \ + svg-clip.c \ + svg-surface-source.c + +xcb_surface_test_sources = \ + xcb-surface-source.c + +xlib_surface_test_sources = \ + xlib-surface.c \ + xlib-surface-source.c + +xlib_xrender_surface_test_sources = get-xrender-format.c +multi_page_surface_test_sources = multi-page.c +fallback_resolution_test_sources = fallback-resolution.c +cairo_test_suite_headers = \ + buffer-diff.h \ + cairo-test.h \ + cairo-test-private.h \ + world-map.h \ + $(NULL) + +cairo_test_suite_sources = \ + buffer-diff.c \ + cairo-test.c \ + cairo-test-runner.c + +SUBDIRS = pdiff . +@BUILD_ANY2PPM_TRUE@@CAIRO_HAS_PDF_SURFACE_TRUE@test = $(fallback_resolution_test_sources) +@BUILD_ANY2PPM_TRUE@@CAIRO_HAS_PS_SURFACE_TRUE@test = $(fallback_resolution_test_sources) + +# Include fallback-resolution (once!) if we have any of the vector surfaces +@BUILD_ANY2PPM_TRUE@@CAIRO_HAS_SVG_SURFACE_TRUE@test = $(fallback_resolution_test_sources) +noinst_PROGRAMS = cairo-test-suite$(EXEEXT) # always build +noinst_SCRIPTS = check-refs.sh +cairo_test_suite_SOURCES = \ + $(cairo_test_suite_sources) \ + $(cairo_test_suite_headers) \ + $(test_sources) \ + cairo-test-constructors.c + +cairo_test_suite_CFLAGS = $(AM_CFLAGS) $(real_pthread_CFLAGS) +cairo_test_suite_LDADD = \ + $(real_pthread_LIBS) \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) + +cairo_test_suite_DEPENDENCIES = \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la $(am__append_14) +@HAVE_SHM_TRUE@cairo_test_trace_SOURCES = \ +@HAVE_SHM_TRUE@ cairo-test-trace.c \ +@HAVE_SHM_TRUE@ buffer-diff.c \ +@HAVE_SHM_TRUE@ buffer-diff.h + +@HAVE_SHM_TRUE@cairo_test_trace_CFLAGS = $(AM_CFLAGS) $(real_pthread_CFLAGS) +@HAVE_SHM_TRUE@cairo_test_trace_LDADD = \ +@HAVE_SHM_TRUE@ $(real_pthread_LIBS) \ +@HAVE_SHM_TRUE@ $(top_builddir)/test/pdiff/libpdiff.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/boilerplate/libcairoboilerplate.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/src/libcairo.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/util/cairo-missing/libcairo-missing.la \ +@HAVE_SHM_TRUE@ $(CAIRO_LDADD) \ +@HAVE_SHM_TRUE@ $(SHM_LIBS) + +@HAVE_SHM_TRUE@cairo_test_trace_DEPENDENCIES = \ +@HAVE_SHM_TRUE@ $(top_builddir)/test/pdiff/libpdiff.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/boilerplate/libcairoboilerplate.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/src/libcairo.la \ +@HAVE_SHM_TRUE@ $(top_builddir)/util/cairo-missing/libcairo-missing.la \ +@HAVE_SHM_TRUE@ $(NULL) + + +# Any test that doesn't generate a log file goes here +NOLOG_TESTS = \ +fallback-resolution \ +font-options \ +multi-page \ +pdf-features \ +png \ +ps-eps \ +ps-features \ +svg-clip \ +svg-surface \ +toy-font-face \ +user-data + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(srcdir)/pdiff \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/util/cairo-missing \ + -I$(top_srcdir)/util/cairo-script \ + -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) + +AM_LDFLAGS = $(CAIRO_LDFLAGS) +imagediff_SOURCES = \ + imagediff.c \ + buffer-diff.c \ + buffer-diff.h + +imagediff_LDADD = \ + $(top_builddir)/test/pdiff/libpdiff.la \ + $(top_builddir)/src/libcairo.la + +png_flatten_SOURCES = png-flatten.c +png_flatten_LDADD = $(top_builddir)/src/libcairo.la \ + $(CAIRO_LDADD) + +@BUILD_ANY2PPM_TRUE@any2ppm_CFLAGS = $(AM_CFLAGS) $(POPPLER_CFLAGS) $(LIBRSVG_CFLAGS) $(LIBSPECTRE_CFLAGS) +# add LDADD, so poppler/librsvg uses "our" cairo +@BUILD_ANY2PPM_TRUE@any2ppm_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +@BUILD_ANY2PPM_TRUE@any2ppm_LDADD = \ +@BUILD_ANY2PPM_TRUE@ $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ +@BUILD_ANY2PPM_TRUE@ $(top_builddir)/src/libcairo.la \ +@BUILD_ANY2PPM_TRUE@ $(CAIRO_LDADD) \ +@BUILD_ANY2PPM_TRUE@ $(CAIROBOILERPLATE_LIBS) \ +@BUILD_ANY2PPM_TRUE@ $(POPPLER_LIBS) \ +@BUILD_ANY2PPM_TRUE@ $(LIBRSVG_LIBS) \ +@BUILD_ANY2PPM_TRUE@ $(LIBSPECTRE_LIBS) + +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@pdf2png_CFLAGS = $(AM_CFLAGS) $(POPPLER_CFLAGS) +# add LDADD, so poppler uses "our" cairo +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@pdf2png_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@pdf2png_LDADD = $(top_builddir)/src/libcairo.la \ +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@ $(CAIRO_LDADD) \ +@CAIRO_CAN_TEST_PDF_SURFACE_TRUE@ $(POPPLER_LIBS) + +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@svg2png_CFLAGS = $(AM_CFLAGS) $(LIBRSVG_CFLAGS) +# add LDADD, so librsvg uses "our" cairo +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@svg2png_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@svg2png_LDADD = $(top_builddir)/src/libcairo.la \ +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@ $(CAIRO_LDADD) \ +@CAIRO_CAN_TEST_SVG_SURFACE_TRUE@ $(LIBRSVG_LIBS) + +@CAIRO_HAS_SPECTRE_TRUE@ps2png_CFLAGS = $(AM_CFLAGS) $(LIBSPECTRE_CFLAGS) +# add LDADD, so ps2png uses "our" cairo +@CAIRO_HAS_SPECTRE_TRUE@ps2png_LDFLAGS = $(AM_LDFLAGS) $(CAIRO_TEST_UNDEFINED_LDFLAGS) +@CAIRO_HAS_SPECTRE_TRUE@ps2png_LDADD = $(top_builddir)/src/libcairo.la \ +@CAIRO_HAS_SPECTRE_TRUE@ $(CAIRO_LDADD) \ +@CAIRO_HAS_SPECTRE_TRUE@ $(LIBSPECTRE_LIBS) + + +# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that +# one can limit tested targets both through CAIRO_TEST_TARGET env var +# and TARGETS make var on the command line. Same for the rest. +TARGETS = $(CAIRO_TEST_TARGET) +TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE) +FORMAT = $(CAIRO_TEST_TARGET_FORMAT) +NUM_THREADS = $(CAIRO_TEST_NUM_THREADS) +MODE = $(CAIRO_TEST_MODE) + +# Same about ENV vs CAIRO_TEST_ENV. ENV is used with "make run" only +ENV = $(CAIRO_TEST_ENV) +TESTS_ENVIRONMENT = CAIRO_TEST_MODE="$(MODE)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_FORMAT="$(FORMAT)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)" CAIRO_TEST_NUM_THREADS="$(NUM_THREADS)" $(ENV) +EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS) +VALGRIND_FLAGS = \ + --tool=memcheck --suppressions=$(srcdir)/.valgrind-suppressions \ + --track-origins=yes \ + --leak-check=yes --show-reachable=yes \ + $(EXTRA_VALGRIND_FLAGS) + + +# The following definitions both should work. +#FAILED_TESTS = `grep -l '\' $(test_sources:.c=.log) 2>/dev/null | sed -e 's/[.]log$$//' | xargs echo` +FAILED_TESTS = `grep -l '\' $(test_sources:.c=.log) 2>/dev/null | tr '\n' ' ' | sed -e 's/[.]log */ /g; s/^ //; s/ $$//'` +recheck = check CAIRO_TESTS="$(FAILED_TESTS)" + +#%.log: %.c cairo-test-suite +#-./cairo-test-suite $(<:.c=) +NOLOG_TESTS_LOG = $(NOLOG_TESTS:=.log) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(top_srcdir)/test/Makefile.sources $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign test/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common $(top_srcdir)/test/Makefile.sources: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +any2ppm$(EXEEXT): $(any2ppm_OBJECTS) $(any2ppm_DEPENDENCIES) $(EXTRA_any2ppm_DEPENDENCIES) + @rm -f any2ppm$(EXEEXT) + $(AM_V_CCLD)$(any2ppm_LINK) $(any2ppm_OBJECTS) $(any2ppm_LDADD) $(LIBS) + +cairo-test-suite$(EXEEXT): $(cairo_test_suite_OBJECTS) $(cairo_test_suite_DEPENDENCIES) $(EXTRA_cairo_test_suite_DEPENDENCIES) + @rm -f cairo-test-suite$(EXEEXT) + $(AM_V_CCLD)$(cairo_test_suite_LINK) $(cairo_test_suite_OBJECTS) $(cairo_test_suite_LDADD) $(LIBS) + +cairo-test-trace$(EXEEXT): $(cairo_test_trace_OBJECTS) $(cairo_test_trace_DEPENDENCIES) $(EXTRA_cairo_test_trace_DEPENDENCIES) + @rm -f cairo-test-trace$(EXEEXT) + $(AM_V_CCLD)$(cairo_test_trace_LINK) $(cairo_test_trace_OBJECTS) $(cairo_test_trace_LDADD) $(LIBS) + +imagediff$(EXEEXT): $(imagediff_OBJECTS) $(imagediff_DEPENDENCIES) $(EXTRA_imagediff_DEPENDENCIES) + @rm -f imagediff$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(imagediff_OBJECTS) $(imagediff_LDADD) $(LIBS) + +pdf2png$(EXEEXT): $(pdf2png_OBJECTS) $(pdf2png_DEPENDENCIES) $(EXTRA_pdf2png_DEPENDENCIES) + @rm -f pdf2png$(EXEEXT) + $(AM_V_CCLD)$(pdf2png_LINK) $(pdf2png_OBJECTS) $(pdf2png_LDADD) $(LIBS) + +png-flatten$(EXEEXT): $(png_flatten_OBJECTS) $(png_flatten_DEPENDENCIES) $(EXTRA_png_flatten_DEPENDENCIES) + @rm -f png-flatten$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(png_flatten_OBJECTS) $(png_flatten_LDADD) $(LIBS) + +ps2png$(EXEEXT): $(ps2png_OBJECTS) $(ps2png_DEPENDENCIES) $(EXTRA_ps2png_DEPENDENCIES) + @rm -f ps2png$(EXEEXT) + $(AM_V_CCLD)$(ps2png_LINK) $(ps2png_OBJECTS) $(ps2png_LDADD) $(LIBS) + +svg2png$(EXEEXT): $(svg2png_OBJECTS) $(svg2png_DEPENDENCIES) $(EXTRA_svg2png_DEPENDENCIES) + @rm -f svg2png$(EXEEXT) + $(AM_V_CCLD)$(svg2png_LINK) $(svg2png_OBJECTS) $(svg2png_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/any2ppm-any2ppm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer-diff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-bug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-fill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-image-sample.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-mask-sample.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-rasterisation.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-sample.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a1-traps-sample.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a8-clear.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-a8-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-aliasing.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-alpha-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-api-special-cases.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-arc-direction.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-arc-infinite-loop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-arc-looping-dash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-big-empty-box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-big-empty-triangle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-big-line.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-big-little-box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-big-little-triangle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-big-trap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bilevel-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bitmap-font.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-buffer-diff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-40410.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-51910.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-84115.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-bo-collins.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-extents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-seams.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-source-cu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-bug-spline.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-cairo-test-constructors.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-cairo-test-runner.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-cairo-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-caps-joins-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-caps-joins-curve.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-caps-joins.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-caps-sub-paths.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-caps-tails-curve.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-caps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-checkerboard.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clear-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clear.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-all.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-complex-shape.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-contexts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-device-offset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-disjoint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-double-free.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-empty-group.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-empty-save.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-empty.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-fill-no-op.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-fill-rule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-fill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-group-shapes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-intersect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-nesting.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-operator.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-polygons.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-push-group.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-rectilinear.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-shape.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-twice.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-unbounded.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clip-zero.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clipped-group.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-clipped-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-close-path-current-point.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-close-path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-copy-disjoint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-copy-path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-coverage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-create-for-stream.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-create-from-png-stream.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-create-from-png.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-culled-glyphs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-caps-joins.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-curve.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-infinite-loop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-no-dash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-offset-negative.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-offset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-scale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-dash-zero-length.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-arc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-arcs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-curve-to.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-dash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-pen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-device-offset-fractional.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-device-offset-positive.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-device-offset-scale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-device-offset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-drunkard-tails.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-egl-oversized-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-egl-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-error-setters.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-pad-border.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-pad-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-pad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-reflect-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-reflect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-repeat-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extend-repeat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-extended-blend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fallback-resolution.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fallback.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-and-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-disjoint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-empty.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-missed-stop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-fill-rule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-filter-nearest-offset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-font-face-get-type.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-font-matrix-translation.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-font-options.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-get-and-set.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-get-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-get-group-target.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-get-path-extents.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-get-xrender-format.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gl-device-release.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gl-oversized-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gl-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gradient-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-gradient-zero-stops.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-group-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-group-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-group-state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-group-unaligned.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-half-coverage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-halo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-hatchings.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-horizontal-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-huge-linear.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-huge-radial.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-image-bug-710072.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-image-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-implicit-close.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-infinite-join.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-invalid-matrix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-inverse-text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-inverted-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-joins-loop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-joins-retrace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-joins-star.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-joins.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-large-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-large-font.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-large-source-roi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-large-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-leaky-dash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-leaky-polygon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-line-width-large-overlap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-line-width-overlap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-line-width-scale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-line-width-tolerance.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-line-width-zero.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-line-width.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-gradient-extend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-gradient-large.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-gradient-subset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-gradient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-step-function.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-linear-uniform.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-long-dashed-lines.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-long-lines.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-map-to-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask-ctm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask-glyphs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask-surface-ctm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask-transformed-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask-transformed-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mesh-pattern.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mime-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-mime-surface-api.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-miter-precision.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-move-to-show-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-multi-page.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-negative-stride-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-new-sub-path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-nil-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-operator-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-operator-clear.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-operator-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-operator.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-outline-tolerance.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-over-above-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-over-around-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-over-below-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-over-between-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-overlapping-boxes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-overlapping-glyphs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-paint-clip-fill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-paint-repeat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-paint-source-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-paint-with-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-partial-clip-text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-partial-coverage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pass-through.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-path-append.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-path-currentpoint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-path-precision.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-path-stroke-twice.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pattern-get-type.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pattern-getters.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pdf-features.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pdf-isolated-group.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pdf-mime-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pdf-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pixman-downscale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pixman-rotate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-png.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ps-eps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ps-features.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-ps-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pthread-same-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pthread-show-text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-pthread-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-push-group-color.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-push-group-path-offset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-push-group.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-quartz-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-radial-gradient-extend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-radial-gradient.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-radial-outer-focus.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-random-clips.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-random-intersections-eo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-raster-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-record-extend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-record-mesh.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-record.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-record1414x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-record2x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-record90.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-recordflip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-recording-surface-extend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-recording-surface-pattern.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectilinear-dash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectilinear-fill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectilinear-grid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rectilinear-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-reflected-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rel-path.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rotate-stroke-box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rotated-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-sample.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-scale-offset-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-scale-offset-similar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-select-font-face.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-select-font-no-show-text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-self-copy-overlap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-self-copy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-self-intersecting.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-set-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-shape-general-convex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-shape-sierpinski.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-show-glyphs-advance.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-show-glyphs-many.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-show-text-current-point.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-simple.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-skew-extreme.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask-fill.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask-image-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask-stroke.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask-text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-smask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-source-clip-scale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-source-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-spline-decomposition.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-stride-12-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-stroke-clipped.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-stroke-image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-stroke-open-box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-stroke-pattern.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-modify-child.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-outside-target.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-pad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-reflect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-repeat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-scale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-subsurface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-finish-twice.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-pattern-operator.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-surface-pattern.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-svg-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-svg-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-svg-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-antialias.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-cache-crash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-glyph-range.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-pattern.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-rotate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-transform.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-text-zero-len.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-tiger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-tighten-bounds.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-toy-font-face.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-transforms.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-translate-show-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-trap-clip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-twin-antialias-gray.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-twin-antialias-none.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-twin.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-unaligned-box.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-unantialiased-shapes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-unbounded-operator.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-unclosed-strokes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-user-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-user-font-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-user-font-proxy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-user-font-rescale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-user-font.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-white-in-noop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-world-map.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xcb-stress-cache.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xcb-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xcomposite-projection.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xlib-expose-event.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xlib-surface-source.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-xlib-surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-zero-alpha.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_suite-zero-mask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_trace-buffer-diff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_test_trace-cairo-test-trace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imagediff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdf2png-pdf2png.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/png-flatten.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps2png-ps2png.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svg2png-svg2png.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +any2ppm-any2ppm.o: any2ppm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(any2ppm_CFLAGS) $(CFLAGS) -MT any2ppm-any2ppm.o -MD -MP -MF $(DEPDIR)/any2ppm-any2ppm.Tpo -c -o any2ppm-any2ppm.o `test -f 'any2ppm.c' || echo '$(srcdir)/'`any2ppm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/any2ppm-any2ppm.Tpo $(DEPDIR)/any2ppm-any2ppm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='any2ppm.c' object='any2ppm-any2ppm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(any2ppm_CFLAGS) $(CFLAGS) -c -o any2ppm-any2ppm.o `test -f 'any2ppm.c' || echo '$(srcdir)/'`any2ppm.c + +any2ppm-any2ppm.obj: any2ppm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(any2ppm_CFLAGS) $(CFLAGS) -MT any2ppm-any2ppm.obj -MD -MP -MF $(DEPDIR)/any2ppm-any2ppm.Tpo -c -o any2ppm-any2ppm.obj `if test -f 'any2ppm.c'; then $(CYGPATH_W) 'any2ppm.c'; else $(CYGPATH_W) '$(srcdir)/any2ppm.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/any2ppm-any2ppm.Tpo $(DEPDIR)/any2ppm-any2ppm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='any2ppm.c' object='any2ppm-any2ppm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(any2ppm_CFLAGS) $(CFLAGS) -c -o any2ppm-any2ppm.obj `if test -f 'any2ppm.c'; then $(CYGPATH_W) 'any2ppm.c'; else $(CYGPATH_W) '$(srcdir)/any2ppm.c'; fi` + +cairo_test_suite-buffer-diff.o: buffer-diff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-buffer-diff.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-buffer-diff.Tpo -c -o cairo_test_suite-buffer-diff.o `test -f 'buffer-diff.c' || echo '$(srcdir)/'`buffer-diff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-buffer-diff.Tpo $(DEPDIR)/cairo_test_suite-buffer-diff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buffer-diff.c' object='cairo_test_suite-buffer-diff.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-buffer-diff.o `test -f 'buffer-diff.c' || echo '$(srcdir)/'`buffer-diff.c + +cairo_test_suite-buffer-diff.obj: buffer-diff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-buffer-diff.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-buffer-diff.Tpo -c -o cairo_test_suite-buffer-diff.obj `if test -f 'buffer-diff.c'; then $(CYGPATH_W) 'buffer-diff.c'; else $(CYGPATH_W) '$(srcdir)/buffer-diff.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-buffer-diff.Tpo $(DEPDIR)/cairo_test_suite-buffer-diff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buffer-diff.c' object='cairo_test_suite-buffer-diff.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-buffer-diff.obj `if test -f 'buffer-diff.c'; then $(CYGPATH_W) 'buffer-diff.c'; else $(CYGPATH_W) '$(srcdir)/buffer-diff.c'; fi` + +cairo_test_suite-cairo-test.o: cairo-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-cairo-test.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-cairo-test.Tpo -c -o cairo_test_suite-cairo-test.o `test -f 'cairo-test.c' || echo '$(srcdir)/'`cairo-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-cairo-test.Tpo $(DEPDIR)/cairo_test_suite-cairo-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test.c' object='cairo_test_suite-cairo-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-cairo-test.o `test -f 'cairo-test.c' || echo '$(srcdir)/'`cairo-test.c + +cairo_test_suite-cairo-test.obj: cairo-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-cairo-test.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-cairo-test.Tpo -c -o cairo_test_suite-cairo-test.obj `if test -f 'cairo-test.c'; then $(CYGPATH_W) 'cairo-test.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-cairo-test.Tpo $(DEPDIR)/cairo_test_suite-cairo-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test.c' object='cairo_test_suite-cairo-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-cairo-test.obj `if test -f 'cairo-test.c'; then $(CYGPATH_W) 'cairo-test.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test.c'; fi` + +cairo_test_suite-cairo-test-runner.o: cairo-test-runner.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-cairo-test-runner.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-cairo-test-runner.Tpo -c -o cairo_test_suite-cairo-test-runner.o `test -f 'cairo-test-runner.c' || echo '$(srcdir)/'`cairo-test-runner.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-cairo-test-runner.Tpo $(DEPDIR)/cairo_test_suite-cairo-test-runner.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test-runner.c' object='cairo_test_suite-cairo-test-runner.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-cairo-test-runner.o `test -f 'cairo-test-runner.c' || echo '$(srcdir)/'`cairo-test-runner.c + +cairo_test_suite-cairo-test-runner.obj: cairo-test-runner.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-cairo-test-runner.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-cairo-test-runner.Tpo -c -o cairo_test_suite-cairo-test-runner.obj `if test -f 'cairo-test-runner.c'; then $(CYGPATH_W) 'cairo-test-runner.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test-runner.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-cairo-test-runner.Tpo $(DEPDIR)/cairo_test_suite-cairo-test-runner.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test-runner.c' object='cairo_test_suite-cairo-test-runner.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-cairo-test-runner.obj `if test -f 'cairo-test-runner.c'; then $(CYGPATH_W) 'cairo-test-runner.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test-runner.c'; fi` + +cairo_test_suite-a1-bug.o: a1-bug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-bug.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-bug.Tpo -c -o cairo_test_suite-a1-bug.o `test -f 'a1-bug.c' || echo '$(srcdir)/'`a1-bug.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-bug.Tpo $(DEPDIR)/cairo_test_suite-a1-bug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-bug.c' object='cairo_test_suite-a1-bug.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-bug.o `test -f 'a1-bug.c' || echo '$(srcdir)/'`a1-bug.c + +cairo_test_suite-a1-bug.obj: a1-bug.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-bug.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-bug.Tpo -c -o cairo_test_suite-a1-bug.obj `if test -f 'a1-bug.c'; then $(CYGPATH_W) 'a1-bug.c'; else $(CYGPATH_W) '$(srcdir)/a1-bug.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-bug.Tpo $(DEPDIR)/cairo_test_suite-a1-bug.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-bug.c' object='cairo_test_suite-a1-bug.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-bug.obj `if test -f 'a1-bug.c'; then $(CYGPATH_W) 'a1-bug.c'; else $(CYGPATH_W) '$(srcdir)/a1-bug.c'; fi` + +cairo_test_suite-a1-clip.o: a1-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-clip.Tpo -c -o cairo_test_suite-a1-clip.o `test -f 'a1-clip.c' || echo '$(srcdir)/'`a1-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-clip.Tpo $(DEPDIR)/cairo_test_suite-a1-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-clip.c' object='cairo_test_suite-a1-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-clip.o `test -f 'a1-clip.c' || echo '$(srcdir)/'`a1-clip.c + +cairo_test_suite-a1-clip.obj: a1-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-clip.Tpo -c -o cairo_test_suite-a1-clip.obj `if test -f 'a1-clip.c'; then $(CYGPATH_W) 'a1-clip.c'; else $(CYGPATH_W) '$(srcdir)/a1-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-clip.Tpo $(DEPDIR)/cairo_test_suite-a1-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-clip.c' object='cairo_test_suite-a1-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-clip.obj `if test -f 'a1-clip.c'; then $(CYGPATH_W) 'a1-clip.c'; else $(CYGPATH_W) '$(srcdir)/a1-clip.c'; fi` + +cairo_test_suite-a1-fill.o: a1-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-fill.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-fill.Tpo -c -o cairo_test_suite-a1-fill.o `test -f 'a1-fill.c' || echo '$(srcdir)/'`a1-fill.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-fill.Tpo $(DEPDIR)/cairo_test_suite-a1-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-fill.c' object='cairo_test_suite-a1-fill.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-fill.o `test -f 'a1-fill.c' || echo '$(srcdir)/'`a1-fill.c + +cairo_test_suite-a1-fill.obj: a1-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-fill.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-fill.Tpo -c -o cairo_test_suite-a1-fill.obj `if test -f 'a1-fill.c'; then $(CYGPATH_W) 'a1-fill.c'; else $(CYGPATH_W) '$(srcdir)/a1-fill.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-fill.Tpo $(DEPDIR)/cairo_test_suite-a1-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-fill.c' object='cairo_test_suite-a1-fill.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-fill.obj `if test -f 'a1-fill.c'; then $(CYGPATH_W) 'a1-fill.c'; else $(CYGPATH_W) '$(srcdir)/a1-fill.c'; fi` + +cairo_test_suite-a1-image-sample.o: a1-image-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-image-sample.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-image-sample.Tpo -c -o cairo_test_suite-a1-image-sample.o `test -f 'a1-image-sample.c' || echo '$(srcdir)/'`a1-image-sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-image-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-image-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-image-sample.c' object='cairo_test_suite-a1-image-sample.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-image-sample.o `test -f 'a1-image-sample.c' || echo '$(srcdir)/'`a1-image-sample.c + +cairo_test_suite-a1-image-sample.obj: a1-image-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-image-sample.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-image-sample.Tpo -c -o cairo_test_suite-a1-image-sample.obj `if test -f 'a1-image-sample.c'; then $(CYGPATH_W) 'a1-image-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-image-sample.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-image-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-image-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-image-sample.c' object='cairo_test_suite-a1-image-sample.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-image-sample.obj `if test -f 'a1-image-sample.c'; then $(CYGPATH_W) 'a1-image-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-image-sample.c'; fi` + +cairo_test_suite-a1-mask.o: a1-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-mask.Tpo -c -o cairo_test_suite-a1-mask.o `test -f 'a1-mask.c' || echo '$(srcdir)/'`a1-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-mask.Tpo $(DEPDIR)/cairo_test_suite-a1-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-mask.c' object='cairo_test_suite-a1-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-mask.o `test -f 'a1-mask.c' || echo '$(srcdir)/'`a1-mask.c + +cairo_test_suite-a1-mask.obj: a1-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-mask.Tpo -c -o cairo_test_suite-a1-mask.obj `if test -f 'a1-mask.c'; then $(CYGPATH_W) 'a1-mask.c'; else $(CYGPATH_W) '$(srcdir)/a1-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-mask.Tpo $(DEPDIR)/cairo_test_suite-a1-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-mask.c' object='cairo_test_suite-a1-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-mask.obj `if test -f 'a1-mask.c'; then $(CYGPATH_W) 'a1-mask.c'; else $(CYGPATH_W) '$(srcdir)/a1-mask.c'; fi` + +cairo_test_suite-a1-mask-sample.o: a1-mask-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-mask-sample.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-mask-sample.Tpo -c -o cairo_test_suite-a1-mask-sample.o `test -f 'a1-mask-sample.c' || echo '$(srcdir)/'`a1-mask-sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-mask-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-mask-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-mask-sample.c' object='cairo_test_suite-a1-mask-sample.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-mask-sample.o `test -f 'a1-mask-sample.c' || echo '$(srcdir)/'`a1-mask-sample.c + +cairo_test_suite-a1-mask-sample.obj: a1-mask-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-mask-sample.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-mask-sample.Tpo -c -o cairo_test_suite-a1-mask-sample.obj `if test -f 'a1-mask-sample.c'; then $(CYGPATH_W) 'a1-mask-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-mask-sample.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-mask-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-mask-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-mask-sample.c' object='cairo_test_suite-a1-mask-sample.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-mask-sample.obj `if test -f 'a1-mask-sample.c'; then $(CYGPATH_W) 'a1-mask-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-mask-sample.c'; fi` + +cairo_test_suite-a1-sample.o: a1-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-sample.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-sample.Tpo -c -o cairo_test_suite-a1-sample.o `test -f 'a1-sample.c' || echo '$(srcdir)/'`a1-sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-sample.c' object='cairo_test_suite-a1-sample.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-sample.o `test -f 'a1-sample.c' || echo '$(srcdir)/'`a1-sample.c + +cairo_test_suite-a1-sample.obj: a1-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-sample.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-sample.Tpo -c -o cairo_test_suite-a1-sample.obj `if test -f 'a1-sample.c'; then $(CYGPATH_W) 'a1-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-sample.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-sample.c' object='cairo_test_suite-a1-sample.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-sample.obj `if test -f 'a1-sample.c'; then $(CYGPATH_W) 'a1-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-sample.c'; fi` + +cairo_test_suite-a1-traps-sample.o: a1-traps-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-traps-sample.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-traps-sample.Tpo -c -o cairo_test_suite-a1-traps-sample.o `test -f 'a1-traps-sample.c' || echo '$(srcdir)/'`a1-traps-sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-traps-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-traps-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-traps-sample.c' object='cairo_test_suite-a1-traps-sample.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-traps-sample.o `test -f 'a1-traps-sample.c' || echo '$(srcdir)/'`a1-traps-sample.c + +cairo_test_suite-a1-traps-sample.obj: a1-traps-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-traps-sample.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-traps-sample.Tpo -c -o cairo_test_suite-a1-traps-sample.obj `if test -f 'a1-traps-sample.c'; then $(CYGPATH_W) 'a1-traps-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-traps-sample.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-traps-sample.Tpo $(DEPDIR)/cairo_test_suite-a1-traps-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-traps-sample.c' object='cairo_test_suite-a1-traps-sample.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-traps-sample.obj `if test -f 'a1-traps-sample.c'; then $(CYGPATH_W) 'a1-traps-sample.c'; else $(CYGPATH_W) '$(srcdir)/a1-traps-sample.c'; fi` + +cairo_test_suite-a1-rasterisation.o: a1-rasterisation.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-rasterisation.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-rasterisation.Tpo -c -o cairo_test_suite-a1-rasterisation.o `test -f 'a1-rasterisation.c' || echo '$(srcdir)/'`a1-rasterisation.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-rasterisation.Tpo $(DEPDIR)/cairo_test_suite-a1-rasterisation.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-rasterisation.c' object='cairo_test_suite-a1-rasterisation.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-rasterisation.o `test -f 'a1-rasterisation.c' || echo '$(srcdir)/'`a1-rasterisation.c + +cairo_test_suite-a1-rasterisation.obj: a1-rasterisation.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a1-rasterisation.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a1-rasterisation.Tpo -c -o cairo_test_suite-a1-rasterisation.obj `if test -f 'a1-rasterisation.c'; then $(CYGPATH_W) 'a1-rasterisation.c'; else $(CYGPATH_W) '$(srcdir)/a1-rasterisation.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a1-rasterisation.Tpo $(DEPDIR)/cairo_test_suite-a1-rasterisation.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a1-rasterisation.c' object='cairo_test_suite-a1-rasterisation.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a1-rasterisation.obj `if test -f 'a1-rasterisation.c'; then $(CYGPATH_W) 'a1-rasterisation.c'; else $(CYGPATH_W) '$(srcdir)/a1-rasterisation.c'; fi` + +cairo_test_suite-a8-clear.o: a8-clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a8-clear.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a8-clear.Tpo -c -o cairo_test_suite-a8-clear.o `test -f 'a8-clear.c' || echo '$(srcdir)/'`a8-clear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a8-clear.Tpo $(DEPDIR)/cairo_test_suite-a8-clear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a8-clear.c' object='cairo_test_suite-a8-clear.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a8-clear.o `test -f 'a8-clear.c' || echo '$(srcdir)/'`a8-clear.c + +cairo_test_suite-a8-clear.obj: a8-clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a8-clear.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a8-clear.Tpo -c -o cairo_test_suite-a8-clear.obj `if test -f 'a8-clear.c'; then $(CYGPATH_W) 'a8-clear.c'; else $(CYGPATH_W) '$(srcdir)/a8-clear.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a8-clear.Tpo $(DEPDIR)/cairo_test_suite-a8-clear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a8-clear.c' object='cairo_test_suite-a8-clear.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a8-clear.obj `if test -f 'a8-clear.c'; then $(CYGPATH_W) 'a8-clear.c'; else $(CYGPATH_W) '$(srcdir)/a8-clear.c'; fi` + +cairo_test_suite-a8-mask.o: a8-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a8-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-a8-mask.Tpo -c -o cairo_test_suite-a8-mask.o `test -f 'a8-mask.c' || echo '$(srcdir)/'`a8-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a8-mask.Tpo $(DEPDIR)/cairo_test_suite-a8-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a8-mask.c' object='cairo_test_suite-a8-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a8-mask.o `test -f 'a8-mask.c' || echo '$(srcdir)/'`a8-mask.c + +cairo_test_suite-a8-mask.obj: a8-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-a8-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-a8-mask.Tpo -c -o cairo_test_suite-a8-mask.obj `if test -f 'a8-mask.c'; then $(CYGPATH_W) 'a8-mask.c'; else $(CYGPATH_W) '$(srcdir)/a8-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-a8-mask.Tpo $(DEPDIR)/cairo_test_suite-a8-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='a8-mask.c' object='cairo_test_suite-a8-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-a8-mask.obj `if test -f 'a8-mask.c'; then $(CYGPATH_W) 'a8-mask.c'; else $(CYGPATH_W) '$(srcdir)/a8-mask.c'; fi` + +cairo_test_suite-aliasing.o: aliasing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-aliasing.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-aliasing.Tpo -c -o cairo_test_suite-aliasing.o `test -f 'aliasing.c' || echo '$(srcdir)/'`aliasing.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-aliasing.Tpo $(DEPDIR)/cairo_test_suite-aliasing.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aliasing.c' object='cairo_test_suite-aliasing.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-aliasing.o `test -f 'aliasing.c' || echo '$(srcdir)/'`aliasing.c + +cairo_test_suite-aliasing.obj: aliasing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-aliasing.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-aliasing.Tpo -c -o cairo_test_suite-aliasing.obj `if test -f 'aliasing.c'; then $(CYGPATH_W) 'aliasing.c'; else $(CYGPATH_W) '$(srcdir)/aliasing.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-aliasing.Tpo $(DEPDIR)/cairo_test_suite-aliasing.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aliasing.c' object='cairo_test_suite-aliasing.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-aliasing.obj `if test -f 'aliasing.c'; then $(CYGPATH_W) 'aliasing.c'; else $(CYGPATH_W) '$(srcdir)/aliasing.c'; fi` + +cairo_test_suite-alpha-similar.o: alpha-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-alpha-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-alpha-similar.Tpo -c -o cairo_test_suite-alpha-similar.o `test -f 'alpha-similar.c' || echo '$(srcdir)/'`alpha-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-alpha-similar.Tpo $(DEPDIR)/cairo_test_suite-alpha-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha-similar.c' object='cairo_test_suite-alpha-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-alpha-similar.o `test -f 'alpha-similar.c' || echo '$(srcdir)/'`alpha-similar.c + +cairo_test_suite-alpha-similar.obj: alpha-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-alpha-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-alpha-similar.Tpo -c -o cairo_test_suite-alpha-similar.obj `if test -f 'alpha-similar.c'; then $(CYGPATH_W) 'alpha-similar.c'; else $(CYGPATH_W) '$(srcdir)/alpha-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-alpha-similar.Tpo $(DEPDIR)/cairo_test_suite-alpha-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha-similar.c' object='cairo_test_suite-alpha-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-alpha-similar.obj `if test -f 'alpha-similar.c'; then $(CYGPATH_W) 'alpha-similar.c'; else $(CYGPATH_W) '$(srcdir)/alpha-similar.c'; fi` + +cairo_test_suite-arc-direction.o: arc-direction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-arc-direction.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-arc-direction.Tpo -c -o cairo_test_suite-arc-direction.o `test -f 'arc-direction.c' || echo '$(srcdir)/'`arc-direction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-arc-direction.Tpo $(DEPDIR)/cairo_test_suite-arc-direction.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='arc-direction.c' object='cairo_test_suite-arc-direction.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-arc-direction.o `test -f 'arc-direction.c' || echo '$(srcdir)/'`arc-direction.c + +cairo_test_suite-arc-direction.obj: arc-direction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-arc-direction.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-arc-direction.Tpo -c -o cairo_test_suite-arc-direction.obj `if test -f 'arc-direction.c'; then $(CYGPATH_W) 'arc-direction.c'; else $(CYGPATH_W) '$(srcdir)/arc-direction.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-arc-direction.Tpo $(DEPDIR)/cairo_test_suite-arc-direction.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='arc-direction.c' object='cairo_test_suite-arc-direction.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-arc-direction.obj `if test -f 'arc-direction.c'; then $(CYGPATH_W) 'arc-direction.c'; else $(CYGPATH_W) '$(srcdir)/arc-direction.c'; fi` + +cairo_test_suite-arc-infinite-loop.o: arc-infinite-loop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-arc-infinite-loop.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-arc-infinite-loop.Tpo -c -o cairo_test_suite-arc-infinite-loop.o `test -f 'arc-infinite-loop.c' || echo '$(srcdir)/'`arc-infinite-loop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-arc-infinite-loop.Tpo $(DEPDIR)/cairo_test_suite-arc-infinite-loop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='arc-infinite-loop.c' object='cairo_test_suite-arc-infinite-loop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-arc-infinite-loop.o `test -f 'arc-infinite-loop.c' || echo '$(srcdir)/'`arc-infinite-loop.c + +cairo_test_suite-arc-infinite-loop.obj: arc-infinite-loop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-arc-infinite-loop.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-arc-infinite-loop.Tpo -c -o cairo_test_suite-arc-infinite-loop.obj `if test -f 'arc-infinite-loop.c'; then $(CYGPATH_W) 'arc-infinite-loop.c'; else $(CYGPATH_W) '$(srcdir)/arc-infinite-loop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-arc-infinite-loop.Tpo $(DEPDIR)/cairo_test_suite-arc-infinite-loop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='arc-infinite-loop.c' object='cairo_test_suite-arc-infinite-loop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-arc-infinite-loop.obj `if test -f 'arc-infinite-loop.c'; then $(CYGPATH_W) 'arc-infinite-loop.c'; else $(CYGPATH_W) '$(srcdir)/arc-infinite-loop.c'; fi` + +cairo_test_suite-arc-looping-dash.o: arc-looping-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-arc-looping-dash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-arc-looping-dash.Tpo -c -o cairo_test_suite-arc-looping-dash.o `test -f 'arc-looping-dash.c' || echo '$(srcdir)/'`arc-looping-dash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-arc-looping-dash.Tpo $(DEPDIR)/cairo_test_suite-arc-looping-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='arc-looping-dash.c' object='cairo_test_suite-arc-looping-dash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-arc-looping-dash.o `test -f 'arc-looping-dash.c' || echo '$(srcdir)/'`arc-looping-dash.c + +cairo_test_suite-arc-looping-dash.obj: arc-looping-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-arc-looping-dash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-arc-looping-dash.Tpo -c -o cairo_test_suite-arc-looping-dash.obj `if test -f 'arc-looping-dash.c'; then $(CYGPATH_W) 'arc-looping-dash.c'; else $(CYGPATH_W) '$(srcdir)/arc-looping-dash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-arc-looping-dash.Tpo $(DEPDIR)/cairo_test_suite-arc-looping-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='arc-looping-dash.c' object='cairo_test_suite-arc-looping-dash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-arc-looping-dash.obj `if test -f 'arc-looping-dash.c'; then $(CYGPATH_W) 'arc-looping-dash.c'; else $(CYGPATH_W) '$(srcdir)/arc-looping-dash.c'; fi` + +cairo_test_suite-api-special-cases.o: api-special-cases.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-api-special-cases.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-api-special-cases.Tpo -c -o cairo_test_suite-api-special-cases.o `test -f 'api-special-cases.c' || echo '$(srcdir)/'`api-special-cases.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-api-special-cases.Tpo $(DEPDIR)/cairo_test_suite-api-special-cases.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api-special-cases.c' object='cairo_test_suite-api-special-cases.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-api-special-cases.o `test -f 'api-special-cases.c' || echo '$(srcdir)/'`api-special-cases.c + +cairo_test_suite-api-special-cases.obj: api-special-cases.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-api-special-cases.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-api-special-cases.Tpo -c -o cairo_test_suite-api-special-cases.obj `if test -f 'api-special-cases.c'; then $(CYGPATH_W) 'api-special-cases.c'; else $(CYGPATH_W) '$(srcdir)/api-special-cases.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-api-special-cases.Tpo $(DEPDIR)/cairo_test_suite-api-special-cases.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api-special-cases.c' object='cairo_test_suite-api-special-cases.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-api-special-cases.obj `if test -f 'api-special-cases.c'; then $(CYGPATH_W) 'api-special-cases.c'; else $(CYGPATH_W) '$(srcdir)/api-special-cases.c'; fi` + +cairo_test_suite-big-line.o: big-line.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-line.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-line.Tpo -c -o cairo_test_suite-big-line.o `test -f 'big-line.c' || echo '$(srcdir)/'`big-line.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-line.Tpo $(DEPDIR)/cairo_test_suite-big-line.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-line.c' object='cairo_test_suite-big-line.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-line.o `test -f 'big-line.c' || echo '$(srcdir)/'`big-line.c + +cairo_test_suite-big-line.obj: big-line.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-line.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-line.Tpo -c -o cairo_test_suite-big-line.obj `if test -f 'big-line.c'; then $(CYGPATH_W) 'big-line.c'; else $(CYGPATH_W) '$(srcdir)/big-line.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-line.Tpo $(DEPDIR)/cairo_test_suite-big-line.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-line.c' object='cairo_test_suite-big-line.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-line.obj `if test -f 'big-line.c'; then $(CYGPATH_W) 'big-line.c'; else $(CYGPATH_W) '$(srcdir)/big-line.c'; fi` + +cairo_test_suite-big-empty-box.o: big-empty-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-empty-box.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-empty-box.Tpo -c -o cairo_test_suite-big-empty-box.o `test -f 'big-empty-box.c' || echo '$(srcdir)/'`big-empty-box.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-empty-box.Tpo $(DEPDIR)/cairo_test_suite-big-empty-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-empty-box.c' object='cairo_test_suite-big-empty-box.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-empty-box.o `test -f 'big-empty-box.c' || echo '$(srcdir)/'`big-empty-box.c + +cairo_test_suite-big-empty-box.obj: big-empty-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-empty-box.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-empty-box.Tpo -c -o cairo_test_suite-big-empty-box.obj `if test -f 'big-empty-box.c'; then $(CYGPATH_W) 'big-empty-box.c'; else $(CYGPATH_W) '$(srcdir)/big-empty-box.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-empty-box.Tpo $(DEPDIR)/cairo_test_suite-big-empty-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-empty-box.c' object='cairo_test_suite-big-empty-box.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-empty-box.obj `if test -f 'big-empty-box.c'; then $(CYGPATH_W) 'big-empty-box.c'; else $(CYGPATH_W) '$(srcdir)/big-empty-box.c'; fi` + +cairo_test_suite-big-empty-triangle.o: big-empty-triangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-empty-triangle.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-empty-triangle.Tpo -c -o cairo_test_suite-big-empty-triangle.o `test -f 'big-empty-triangle.c' || echo '$(srcdir)/'`big-empty-triangle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-empty-triangle.Tpo $(DEPDIR)/cairo_test_suite-big-empty-triangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-empty-triangle.c' object='cairo_test_suite-big-empty-triangle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-empty-triangle.o `test -f 'big-empty-triangle.c' || echo '$(srcdir)/'`big-empty-triangle.c + +cairo_test_suite-big-empty-triangle.obj: big-empty-triangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-empty-triangle.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-empty-triangle.Tpo -c -o cairo_test_suite-big-empty-triangle.obj `if test -f 'big-empty-triangle.c'; then $(CYGPATH_W) 'big-empty-triangle.c'; else $(CYGPATH_W) '$(srcdir)/big-empty-triangle.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-empty-triangle.Tpo $(DEPDIR)/cairo_test_suite-big-empty-triangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-empty-triangle.c' object='cairo_test_suite-big-empty-triangle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-empty-triangle.obj `if test -f 'big-empty-triangle.c'; then $(CYGPATH_W) 'big-empty-triangle.c'; else $(CYGPATH_W) '$(srcdir)/big-empty-triangle.c'; fi` + +cairo_test_suite-big-little-box.o: big-little-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-little-box.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-little-box.Tpo -c -o cairo_test_suite-big-little-box.o `test -f 'big-little-box.c' || echo '$(srcdir)/'`big-little-box.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-little-box.Tpo $(DEPDIR)/cairo_test_suite-big-little-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-little-box.c' object='cairo_test_suite-big-little-box.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-little-box.o `test -f 'big-little-box.c' || echo '$(srcdir)/'`big-little-box.c + +cairo_test_suite-big-little-box.obj: big-little-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-little-box.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-little-box.Tpo -c -o cairo_test_suite-big-little-box.obj `if test -f 'big-little-box.c'; then $(CYGPATH_W) 'big-little-box.c'; else $(CYGPATH_W) '$(srcdir)/big-little-box.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-little-box.Tpo $(DEPDIR)/cairo_test_suite-big-little-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-little-box.c' object='cairo_test_suite-big-little-box.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-little-box.obj `if test -f 'big-little-box.c'; then $(CYGPATH_W) 'big-little-box.c'; else $(CYGPATH_W) '$(srcdir)/big-little-box.c'; fi` + +cairo_test_suite-big-little-triangle.o: big-little-triangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-little-triangle.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-little-triangle.Tpo -c -o cairo_test_suite-big-little-triangle.o `test -f 'big-little-triangle.c' || echo '$(srcdir)/'`big-little-triangle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-little-triangle.Tpo $(DEPDIR)/cairo_test_suite-big-little-triangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-little-triangle.c' object='cairo_test_suite-big-little-triangle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-little-triangle.o `test -f 'big-little-triangle.c' || echo '$(srcdir)/'`big-little-triangle.c + +cairo_test_suite-big-little-triangle.obj: big-little-triangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-little-triangle.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-little-triangle.Tpo -c -o cairo_test_suite-big-little-triangle.obj `if test -f 'big-little-triangle.c'; then $(CYGPATH_W) 'big-little-triangle.c'; else $(CYGPATH_W) '$(srcdir)/big-little-triangle.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-little-triangle.Tpo $(DEPDIR)/cairo_test_suite-big-little-triangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-little-triangle.c' object='cairo_test_suite-big-little-triangle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-little-triangle.obj `if test -f 'big-little-triangle.c'; then $(CYGPATH_W) 'big-little-triangle.c'; else $(CYGPATH_W) '$(srcdir)/big-little-triangle.c'; fi` + +cairo_test_suite-bug-spline.o: bug-spline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-spline.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-spline.Tpo -c -o cairo_test_suite-bug-spline.o `test -f 'bug-spline.c' || echo '$(srcdir)/'`bug-spline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-spline.Tpo $(DEPDIR)/cairo_test_suite-bug-spline.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-spline.c' object='cairo_test_suite-bug-spline.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-spline.o `test -f 'bug-spline.c' || echo '$(srcdir)/'`bug-spline.c + +cairo_test_suite-bug-spline.obj: bug-spline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-spline.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-spline.Tpo -c -o cairo_test_suite-bug-spline.obj `if test -f 'bug-spline.c'; then $(CYGPATH_W) 'bug-spline.c'; else $(CYGPATH_W) '$(srcdir)/bug-spline.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-spline.Tpo $(DEPDIR)/cairo_test_suite-bug-spline.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-spline.c' object='cairo_test_suite-bug-spline.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-spline.obj `if test -f 'bug-spline.c'; then $(CYGPATH_W) 'bug-spline.c'; else $(CYGPATH_W) '$(srcdir)/bug-spline.c'; fi` + +cairo_test_suite-big-trap.o: big-trap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-trap.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-trap.Tpo -c -o cairo_test_suite-big-trap.o `test -f 'big-trap.c' || echo '$(srcdir)/'`big-trap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-trap.Tpo $(DEPDIR)/cairo_test_suite-big-trap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-trap.c' object='cairo_test_suite-big-trap.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-trap.o `test -f 'big-trap.c' || echo '$(srcdir)/'`big-trap.c + +cairo_test_suite-big-trap.obj: big-trap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-big-trap.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-big-trap.Tpo -c -o cairo_test_suite-big-trap.obj `if test -f 'big-trap.c'; then $(CYGPATH_W) 'big-trap.c'; else $(CYGPATH_W) '$(srcdir)/big-trap.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-big-trap.Tpo $(DEPDIR)/cairo_test_suite-big-trap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='big-trap.c' object='cairo_test_suite-big-trap.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-big-trap.obj `if test -f 'big-trap.c'; then $(CYGPATH_W) 'big-trap.c'; else $(CYGPATH_W) '$(srcdir)/big-trap.c'; fi` + +cairo_test_suite-bilevel-image.o: bilevel-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bilevel-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bilevel-image.Tpo -c -o cairo_test_suite-bilevel-image.o `test -f 'bilevel-image.c' || echo '$(srcdir)/'`bilevel-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bilevel-image.Tpo $(DEPDIR)/cairo_test_suite-bilevel-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bilevel-image.c' object='cairo_test_suite-bilevel-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bilevel-image.o `test -f 'bilevel-image.c' || echo '$(srcdir)/'`bilevel-image.c + +cairo_test_suite-bilevel-image.obj: bilevel-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bilevel-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bilevel-image.Tpo -c -o cairo_test_suite-bilevel-image.obj `if test -f 'bilevel-image.c'; then $(CYGPATH_W) 'bilevel-image.c'; else $(CYGPATH_W) '$(srcdir)/bilevel-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bilevel-image.Tpo $(DEPDIR)/cairo_test_suite-bilevel-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bilevel-image.c' object='cairo_test_suite-bilevel-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bilevel-image.obj `if test -f 'bilevel-image.c'; then $(CYGPATH_W) 'bilevel-image.c'; else $(CYGPATH_W) '$(srcdir)/bilevel-image.c'; fi` + +cairo_test_suite-bug-40410.o: bug-40410.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-40410.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-40410.Tpo -c -o cairo_test_suite-bug-40410.o `test -f 'bug-40410.c' || echo '$(srcdir)/'`bug-40410.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-40410.Tpo $(DEPDIR)/cairo_test_suite-bug-40410.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-40410.c' object='cairo_test_suite-bug-40410.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-40410.o `test -f 'bug-40410.c' || echo '$(srcdir)/'`bug-40410.c + +cairo_test_suite-bug-40410.obj: bug-40410.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-40410.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-40410.Tpo -c -o cairo_test_suite-bug-40410.obj `if test -f 'bug-40410.c'; then $(CYGPATH_W) 'bug-40410.c'; else $(CYGPATH_W) '$(srcdir)/bug-40410.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-40410.Tpo $(DEPDIR)/cairo_test_suite-bug-40410.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-40410.c' object='cairo_test_suite-bug-40410.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-40410.obj `if test -f 'bug-40410.c'; then $(CYGPATH_W) 'bug-40410.c'; else $(CYGPATH_W) '$(srcdir)/bug-40410.c'; fi` + +cairo_test_suite-bug-51910.o: bug-51910.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-51910.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-51910.Tpo -c -o cairo_test_suite-bug-51910.o `test -f 'bug-51910.c' || echo '$(srcdir)/'`bug-51910.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-51910.Tpo $(DEPDIR)/cairo_test_suite-bug-51910.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-51910.c' object='cairo_test_suite-bug-51910.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-51910.o `test -f 'bug-51910.c' || echo '$(srcdir)/'`bug-51910.c + +cairo_test_suite-bug-51910.obj: bug-51910.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-51910.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-51910.Tpo -c -o cairo_test_suite-bug-51910.obj `if test -f 'bug-51910.c'; then $(CYGPATH_W) 'bug-51910.c'; else $(CYGPATH_W) '$(srcdir)/bug-51910.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-51910.Tpo $(DEPDIR)/cairo_test_suite-bug-51910.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-51910.c' object='cairo_test_suite-bug-51910.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-51910.obj `if test -f 'bug-51910.c'; then $(CYGPATH_W) 'bug-51910.c'; else $(CYGPATH_W) '$(srcdir)/bug-51910.c'; fi` + +cairo_test_suite-bug-84115.o: bug-84115.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-84115.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-84115.Tpo -c -o cairo_test_suite-bug-84115.o `test -f 'bug-84115.c' || echo '$(srcdir)/'`bug-84115.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-84115.Tpo $(DEPDIR)/cairo_test_suite-bug-84115.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-84115.c' object='cairo_test_suite-bug-84115.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-84115.o `test -f 'bug-84115.c' || echo '$(srcdir)/'`bug-84115.c + +cairo_test_suite-bug-84115.obj: bug-84115.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-84115.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-84115.Tpo -c -o cairo_test_suite-bug-84115.obj `if test -f 'bug-84115.c'; then $(CYGPATH_W) 'bug-84115.c'; else $(CYGPATH_W) '$(srcdir)/bug-84115.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-84115.Tpo $(DEPDIR)/cairo_test_suite-bug-84115.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-84115.c' object='cairo_test_suite-bug-84115.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-84115.obj `if test -f 'bug-84115.c'; then $(CYGPATH_W) 'bug-84115.c'; else $(CYGPATH_W) '$(srcdir)/bug-84115.c'; fi` + +cairo_test_suite-bug-bo-rectangular.o: bug-bo-rectangular.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-bo-rectangular.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Tpo -c -o cairo_test_suite-bug-bo-rectangular.o `test -f 'bug-bo-rectangular.c' || echo '$(srcdir)/'`bug-bo-rectangular.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Tpo $(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-bo-rectangular.c' object='cairo_test_suite-bug-bo-rectangular.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-bo-rectangular.o `test -f 'bug-bo-rectangular.c' || echo '$(srcdir)/'`bug-bo-rectangular.c + +cairo_test_suite-bug-bo-rectangular.obj: bug-bo-rectangular.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-bo-rectangular.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Tpo -c -o cairo_test_suite-bug-bo-rectangular.obj `if test -f 'bug-bo-rectangular.c'; then $(CYGPATH_W) 'bug-bo-rectangular.c'; else $(CYGPATH_W) '$(srcdir)/bug-bo-rectangular.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Tpo $(DEPDIR)/cairo_test_suite-bug-bo-rectangular.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-bo-rectangular.c' object='cairo_test_suite-bug-bo-rectangular.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-bo-rectangular.obj `if test -f 'bug-bo-rectangular.c'; then $(CYGPATH_W) 'bug-bo-rectangular.c'; else $(CYGPATH_W) '$(srcdir)/bug-bo-rectangular.c'; fi` + +cairo_test_suite-bug-bo-collins.o: bug-bo-collins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-bo-collins.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-bo-collins.Tpo -c -o cairo_test_suite-bug-bo-collins.o `test -f 'bug-bo-collins.c' || echo '$(srcdir)/'`bug-bo-collins.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-bo-collins.Tpo $(DEPDIR)/cairo_test_suite-bug-bo-collins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-bo-collins.c' object='cairo_test_suite-bug-bo-collins.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-bo-collins.o `test -f 'bug-bo-collins.c' || echo '$(srcdir)/'`bug-bo-collins.c + +cairo_test_suite-bug-bo-collins.obj: bug-bo-collins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-bo-collins.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-bo-collins.Tpo -c -o cairo_test_suite-bug-bo-collins.obj `if test -f 'bug-bo-collins.c'; then $(CYGPATH_W) 'bug-bo-collins.c'; else $(CYGPATH_W) '$(srcdir)/bug-bo-collins.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-bo-collins.Tpo $(DEPDIR)/cairo_test_suite-bug-bo-collins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-bo-collins.c' object='cairo_test_suite-bug-bo-collins.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-bo-collins.obj `if test -f 'bug-bo-collins.c'; then $(CYGPATH_W) 'bug-bo-collins.c'; else $(CYGPATH_W) '$(srcdir)/bug-bo-collins.c'; fi` + +cairo_test_suite-bug-bo-ricotz.o: bug-bo-ricotz.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-bo-ricotz.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Tpo -c -o cairo_test_suite-bug-bo-ricotz.o `test -f 'bug-bo-ricotz.c' || echo '$(srcdir)/'`bug-bo-ricotz.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Tpo $(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-bo-ricotz.c' object='cairo_test_suite-bug-bo-ricotz.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-bo-ricotz.o `test -f 'bug-bo-ricotz.c' || echo '$(srcdir)/'`bug-bo-ricotz.c + +cairo_test_suite-bug-bo-ricotz.obj: bug-bo-ricotz.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-bo-ricotz.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Tpo -c -o cairo_test_suite-bug-bo-ricotz.obj `if test -f 'bug-bo-ricotz.c'; then $(CYGPATH_W) 'bug-bo-ricotz.c'; else $(CYGPATH_W) '$(srcdir)/bug-bo-ricotz.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Tpo $(DEPDIR)/cairo_test_suite-bug-bo-ricotz.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-bo-ricotz.c' object='cairo_test_suite-bug-bo-ricotz.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-bo-ricotz.obj `if test -f 'bug-bo-ricotz.c'; then $(CYGPATH_W) 'bug-bo-ricotz.c'; else $(CYGPATH_W) '$(srcdir)/bug-bo-ricotz.c'; fi` + +cairo_test_suite-bug-source-cu.o: bug-source-cu.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-source-cu.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-source-cu.Tpo -c -o cairo_test_suite-bug-source-cu.o `test -f 'bug-source-cu.c' || echo '$(srcdir)/'`bug-source-cu.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-source-cu.Tpo $(DEPDIR)/cairo_test_suite-bug-source-cu.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-source-cu.c' object='cairo_test_suite-bug-source-cu.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-source-cu.o `test -f 'bug-source-cu.c' || echo '$(srcdir)/'`bug-source-cu.c + +cairo_test_suite-bug-source-cu.obj: bug-source-cu.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-source-cu.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-source-cu.Tpo -c -o cairo_test_suite-bug-source-cu.obj `if test -f 'bug-source-cu.c'; then $(CYGPATH_W) 'bug-source-cu.c'; else $(CYGPATH_W) '$(srcdir)/bug-source-cu.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-source-cu.Tpo $(DEPDIR)/cairo_test_suite-bug-source-cu.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-source-cu.c' object='cairo_test_suite-bug-source-cu.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-source-cu.obj `if test -f 'bug-source-cu.c'; then $(CYGPATH_W) 'bug-source-cu.c'; else $(CYGPATH_W) '$(srcdir)/bug-source-cu.c'; fi` + +cairo_test_suite-bug-extents.o: bug-extents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-extents.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-extents.Tpo -c -o cairo_test_suite-bug-extents.o `test -f 'bug-extents.c' || echo '$(srcdir)/'`bug-extents.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-extents.Tpo $(DEPDIR)/cairo_test_suite-bug-extents.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-extents.c' object='cairo_test_suite-bug-extents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-extents.o `test -f 'bug-extents.c' || echo '$(srcdir)/'`bug-extents.c + +cairo_test_suite-bug-extents.obj: bug-extents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-extents.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-extents.Tpo -c -o cairo_test_suite-bug-extents.obj `if test -f 'bug-extents.c'; then $(CYGPATH_W) 'bug-extents.c'; else $(CYGPATH_W) '$(srcdir)/bug-extents.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-extents.Tpo $(DEPDIR)/cairo_test_suite-bug-extents.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-extents.c' object='cairo_test_suite-bug-extents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-extents.obj `if test -f 'bug-extents.c'; then $(CYGPATH_W) 'bug-extents.c'; else $(CYGPATH_W) '$(srcdir)/bug-extents.c'; fi` + +cairo_test_suite-bug-seams.o: bug-seams.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-seams.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-seams.Tpo -c -o cairo_test_suite-bug-seams.o `test -f 'bug-seams.c' || echo '$(srcdir)/'`bug-seams.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-seams.Tpo $(DEPDIR)/cairo_test_suite-bug-seams.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-seams.c' object='cairo_test_suite-bug-seams.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-seams.o `test -f 'bug-seams.c' || echo '$(srcdir)/'`bug-seams.c + +cairo_test_suite-bug-seams.obj: bug-seams.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bug-seams.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bug-seams.Tpo -c -o cairo_test_suite-bug-seams.obj `if test -f 'bug-seams.c'; then $(CYGPATH_W) 'bug-seams.c'; else $(CYGPATH_W) '$(srcdir)/bug-seams.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bug-seams.Tpo $(DEPDIR)/cairo_test_suite-bug-seams.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bug-seams.c' object='cairo_test_suite-bug-seams.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bug-seams.obj `if test -f 'bug-seams.c'; then $(CYGPATH_W) 'bug-seams.c'; else $(CYGPATH_W) '$(srcdir)/bug-seams.c'; fi` + +cairo_test_suite-caps.o: caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps.Tpo -c -o cairo_test_suite-caps.o `test -f 'caps.c' || echo '$(srcdir)/'`caps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps.Tpo $(DEPDIR)/cairo_test_suite-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps.c' object='cairo_test_suite-caps.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps.o `test -f 'caps.c' || echo '$(srcdir)/'`caps.c + +cairo_test_suite-caps.obj: caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps.Tpo -c -o cairo_test_suite-caps.obj `if test -f 'caps.c'; then $(CYGPATH_W) 'caps.c'; else $(CYGPATH_W) '$(srcdir)/caps.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps.Tpo $(DEPDIR)/cairo_test_suite-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps.c' object='cairo_test_suite-caps.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps.obj `if test -f 'caps.c'; then $(CYGPATH_W) 'caps.c'; else $(CYGPATH_W) '$(srcdir)/caps.c'; fi` + +cairo_test_suite-checkerboard.o: checkerboard.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-checkerboard.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-checkerboard.Tpo -c -o cairo_test_suite-checkerboard.o `test -f 'checkerboard.c' || echo '$(srcdir)/'`checkerboard.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-checkerboard.Tpo $(DEPDIR)/cairo_test_suite-checkerboard.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='checkerboard.c' object='cairo_test_suite-checkerboard.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-checkerboard.o `test -f 'checkerboard.c' || echo '$(srcdir)/'`checkerboard.c + +cairo_test_suite-checkerboard.obj: checkerboard.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-checkerboard.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-checkerboard.Tpo -c -o cairo_test_suite-checkerboard.obj `if test -f 'checkerboard.c'; then $(CYGPATH_W) 'checkerboard.c'; else $(CYGPATH_W) '$(srcdir)/checkerboard.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-checkerboard.Tpo $(DEPDIR)/cairo_test_suite-checkerboard.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='checkerboard.c' object='cairo_test_suite-checkerboard.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-checkerboard.obj `if test -f 'checkerboard.c'; then $(CYGPATH_W) 'checkerboard.c'; else $(CYGPATH_W) '$(srcdir)/checkerboard.c'; fi` + +cairo_test_suite-caps-joins.o: caps-joins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-joins.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-joins.Tpo -c -o cairo_test_suite-caps-joins.o `test -f 'caps-joins.c' || echo '$(srcdir)/'`caps-joins.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-joins.Tpo $(DEPDIR)/cairo_test_suite-caps-joins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-joins.c' object='cairo_test_suite-caps-joins.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-joins.o `test -f 'caps-joins.c' || echo '$(srcdir)/'`caps-joins.c + +cairo_test_suite-caps-joins.obj: caps-joins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-joins.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-joins.Tpo -c -o cairo_test_suite-caps-joins.obj `if test -f 'caps-joins.c'; then $(CYGPATH_W) 'caps-joins.c'; else $(CYGPATH_W) '$(srcdir)/caps-joins.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-joins.Tpo $(DEPDIR)/cairo_test_suite-caps-joins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-joins.c' object='cairo_test_suite-caps-joins.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-joins.obj `if test -f 'caps-joins.c'; then $(CYGPATH_W) 'caps-joins.c'; else $(CYGPATH_W) '$(srcdir)/caps-joins.c'; fi` + +cairo_test_suite-caps-joins-alpha.o: caps-joins-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-joins-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-joins-alpha.Tpo -c -o cairo_test_suite-caps-joins-alpha.o `test -f 'caps-joins-alpha.c' || echo '$(srcdir)/'`caps-joins-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-joins-alpha.Tpo $(DEPDIR)/cairo_test_suite-caps-joins-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-joins-alpha.c' object='cairo_test_suite-caps-joins-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-joins-alpha.o `test -f 'caps-joins-alpha.c' || echo '$(srcdir)/'`caps-joins-alpha.c + +cairo_test_suite-caps-joins-alpha.obj: caps-joins-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-joins-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-joins-alpha.Tpo -c -o cairo_test_suite-caps-joins-alpha.obj `if test -f 'caps-joins-alpha.c'; then $(CYGPATH_W) 'caps-joins-alpha.c'; else $(CYGPATH_W) '$(srcdir)/caps-joins-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-joins-alpha.Tpo $(DEPDIR)/cairo_test_suite-caps-joins-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-joins-alpha.c' object='cairo_test_suite-caps-joins-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-joins-alpha.obj `if test -f 'caps-joins-alpha.c'; then $(CYGPATH_W) 'caps-joins-alpha.c'; else $(CYGPATH_W) '$(srcdir)/caps-joins-alpha.c'; fi` + +cairo_test_suite-caps-joins-curve.o: caps-joins-curve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-joins-curve.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-joins-curve.Tpo -c -o cairo_test_suite-caps-joins-curve.o `test -f 'caps-joins-curve.c' || echo '$(srcdir)/'`caps-joins-curve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-joins-curve.Tpo $(DEPDIR)/cairo_test_suite-caps-joins-curve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-joins-curve.c' object='cairo_test_suite-caps-joins-curve.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-joins-curve.o `test -f 'caps-joins-curve.c' || echo '$(srcdir)/'`caps-joins-curve.c + +cairo_test_suite-caps-joins-curve.obj: caps-joins-curve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-joins-curve.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-joins-curve.Tpo -c -o cairo_test_suite-caps-joins-curve.obj `if test -f 'caps-joins-curve.c'; then $(CYGPATH_W) 'caps-joins-curve.c'; else $(CYGPATH_W) '$(srcdir)/caps-joins-curve.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-joins-curve.Tpo $(DEPDIR)/cairo_test_suite-caps-joins-curve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-joins-curve.c' object='cairo_test_suite-caps-joins-curve.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-joins-curve.obj `if test -f 'caps-joins-curve.c'; then $(CYGPATH_W) 'caps-joins-curve.c'; else $(CYGPATH_W) '$(srcdir)/caps-joins-curve.c'; fi` + +cairo_test_suite-caps-tails-curve.o: caps-tails-curve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-tails-curve.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-tails-curve.Tpo -c -o cairo_test_suite-caps-tails-curve.o `test -f 'caps-tails-curve.c' || echo '$(srcdir)/'`caps-tails-curve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-tails-curve.Tpo $(DEPDIR)/cairo_test_suite-caps-tails-curve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-tails-curve.c' object='cairo_test_suite-caps-tails-curve.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-tails-curve.o `test -f 'caps-tails-curve.c' || echo '$(srcdir)/'`caps-tails-curve.c + +cairo_test_suite-caps-tails-curve.obj: caps-tails-curve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-tails-curve.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-tails-curve.Tpo -c -o cairo_test_suite-caps-tails-curve.obj `if test -f 'caps-tails-curve.c'; then $(CYGPATH_W) 'caps-tails-curve.c'; else $(CYGPATH_W) '$(srcdir)/caps-tails-curve.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-tails-curve.Tpo $(DEPDIR)/cairo_test_suite-caps-tails-curve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-tails-curve.c' object='cairo_test_suite-caps-tails-curve.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-tails-curve.obj `if test -f 'caps-tails-curve.c'; then $(CYGPATH_W) 'caps-tails-curve.c'; else $(CYGPATH_W) '$(srcdir)/caps-tails-curve.c'; fi` + +cairo_test_suite-caps-sub-paths.o: caps-sub-paths.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-sub-paths.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-sub-paths.Tpo -c -o cairo_test_suite-caps-sub-paths.o `test -f 'caps-sub-paths.c' || echo '$(srcdir)/'`caps-sub-paths.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-sub-paths.Tpo $(DEPDIR)/cairo_test_suite-caps-sub-paths.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-sub-paths.c' object='cairo_test_suite-caps-sub-paths.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-sub-paths.o `test -f 'caps-sub-paths.c' || echo '$(srcdir)/'`caps-sub-paths.c + +cairo_test_suite-caps-sub-paths.obj: caps-sub-paths.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-caps-sub-paths.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-caps-sub-paths.Tpo -c -o cairo_test_suite-caps-sub-paths.obj `if test -f 'caps-sub-paths.c'; then $(CYGPATH_W) 'caps-sub-paths.c'; else $(CYGPATH_W) '$(srcdir)/caps-sub-paths.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-caps-sub-paths.Tpo $(DEPDIR)/cairo_test_suite-caps-sub-paths.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps-sub-paths.c' object='cairo_test_suite-caps-sub-paths.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-caps-sub-paths.obj `if test -f 'caps-sub-paths.c'; then $(CYGPATH_W) 'caps-sub-paths.c'; else $(CYGPATH_W) '$(srcdir)/caps-sub-paths.c'; fi` + +cairo_test_suite-clear.o: clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clear.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clear.Tpo -c -o cairo_test_suite-clear.o `test -f 'clear.c' || echo '$(srcdir)/'`clear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clear.Tpo $(DEPDIR)/cairo_test_suite-clear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clear.c' object='cairo_test_suite-clear.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clear.o `test -f 'clear.c' || echo '$(srcdir)/'`clear.c + +cairo_test_suite-clear.obj: clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clear.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clear.Tpo -c -o cairo_test_suite-clear.obj `if test -f 'clear.c'; then $(CYGPATH_W) 'clear.c'; else $(CYGPATH_W) '$(srcdir)/clear.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clear.Tpo $(DEPDIR)/cairo_test_suite-clear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clear.c' object='cairo_test_suite-clear.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clear.obj `if test -f 'clear.c'; then $(CYGPATH_W) 'clear.c'; else $(CYGPATH_W) '$(srcdir)/clear.c'; fi` + +cairo_test_suite-clear-source.o: clear-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clear-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clear-source.Tpo -c -o cairo_test_suite-clear-source.o `test -f 'clear-source.c' || echo '$(srcdir)/'`clear-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clear-source.Tpo $(DEPDIR)/cairo_test_suite-clear-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clear-source.c' object='cairo_test_suite-clear-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clear-source.o `test -f 'clear-source.c' || echo '$(srcdir)/'`clear-source.c + +cairo_test_suite-clear-source.obj: clear-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clear-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clear-source.Tpo -c -o cairo_test_suite-clear-source.obj `if test -f 'clear-source.c'; then $(CYGPATH_W) 'clear-source.c'; else $(CYGPATH_W) '$(srcdir)/clear-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clear-source.Tpo $(DEPDIR)/cairo_test_suite-clear-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clear-source.c' object='cairo_test_suite-clear-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clear-source.obj `if test -f 'clear-source.c'; then $(CYGPATH_W) 'clear-source.c'; else $(CYGPATH_W) '$(srcdir)/clear-source.c'; fi` + +cairo_test_suite-clip-all.o: clip-all.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-all.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-all.Tpo -c -o cairo_test_suite-clip-all.o `test -f 'clip-all.c' || echo '$(srcdir)/'`clip-all.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-all.Tpo $(DEPDIR)/cairo_test_suite-clip-all.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-all.c' object='cairo_test_suite-clip-all.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-all.o `test -f 'clip-all.c' || echo '$(srcdir)/'`clip-all.c + +cairo_test_suite-clip-all.obj: clip-all.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-all.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-all.Tpo -c -o cairo_test_suite-clip-all.obj `if test -f 'clip-all.c'; then $(CYGPATH_W) 'clip-all.c'; else $(CYGPATH_W) '$(srcdir)/clip-all.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-all.Tpo $(DEPDIR)/cairo_test_suite-clip-all.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-all.c' object='cairo_test_suite-clip-all.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-all.obj `if test -f 'clip-all.c'; then $(CYGPATH_W) 'clip-all.c'; else $(CYGPATH_W) '$(srcdir)/clip-all.c'; fi` + +cairo_test_suite-clip-complex-bug61592.o: clip-complex-bug61592.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-complex-bug61592.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Tpo -c -o cairo_test_suite-clip-complex-bug61592.o `test -f 'clip-complex-bug61592.c' || echo '$(srcdir)/'`clip-complex-bug61592.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Tpo $(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-complex-bug61592.c' object='cairo_test_suite-clip-complex-bug61592.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-complex-bug61592.o `test -f 'clip-complex-bug61592.c' || echo '$(srcdir)/'`clip-complex-bug61592.c + +cairo_test_suite-clip-complex-bug61592.obj: clip-complex-bug61592.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-complex-bug61592.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Tpo -c -o cairo_test_suite-clip-complex-bug61592.obj `if test -f 'clip-complex-bug61592.c'; then $(CYGPATH_W) 'clip-complex-bug61592.c'; else $(CYGPATH_W) '$(srcdir)/clip-complex-bug61592.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Tpo $(DEPDIR)/cairo_test_suite-clip-complex-bug61592.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-complex-bug61592.c' object='cairo_test_suite-clip-complex-bug61592.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-complex-bug61592.obj `if test -f 'clip-complex-bug61592.c'; then $(CYGPATH_W) 'clip-complex-bug61592.c'; else $(CYGPATH_W) '$(srcdir)/clip-complex-bug61592.c'; fi` + +cairo_test_suite-clip-complex-shape.o: clip-complex-shape.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-complex-shape.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-complex-shape.Tpo -c -o cairo_test_suite-clip-complex-shape.o `test -f 'clip-complex-shape.c' || echo '$(srcdir)/'`clip-complex-shape.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-complex-shape.Tpo $(DEPDIR)/cairo_test_suite-clip-complex-shape.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-complex-shape.c' object='cairo_test_suite-clip-complex-shape.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-complex-shape.o `test -f 'clip-complex-shape.c' || echo '$(srcdir)/'`clip-complex-shape.c + +cairo_test_suite-clip-complex-shape.obj: clip-complex-shape.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-complex-shape.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-complex-shape.Tpo -c -o cairo_test_suite-clip-complex-shape.obj `if test -f 'clip-complex-shape.c'; then $(CYGPATH_W) 'clip-complex-shape.c'; else $(CYGPATH_W) '$(srcdir)/clip-complex-shape.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-complex-shape.Tpo $(DEPDIR)/cairo_test_suite-clip-complex-shape.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-complex-shape.c' object='cairo_test_suite-clip-complex-shape.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-complex-shape.obj `if test -f 'clip-complex-shape.c'; then $(CYGPATH_W) 'clip-complex-shape.c'; else $(CYGPATH_W) '$(srcdir)/clip-complex-shape.c'; fi` + +cairo_test_suite-clip-contexts.o: clip-contexts.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-contexts.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-contexts.Tpo -c -o cairo_test_suite-clip-contexts.o `test -f 'clip-contexts.c' || echo '$(srcdir)/'`clip-contexts.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-contexts.Tpo $(DEPDIR)/cairo_test_suite-clip-contexts.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-contexts.c' object='cairo_test_suite-clip-contexts.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-contexts.o `test -f 'clip-contexts.c' || echo '$(srcdir)/'`clip-contexts.c + +cairo_test_suite-clip-contexts.obj: clip-contexts.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-contexts.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-contexts.Tpo -c -o cairo_test_suite-clip-contexts.obj `if test -f 'clip-contexts.c'; then $(CYGPATH_W) 'clip-contexts.c'; else $(CYGPATH_W) '$(srcdir)/clip-contexts.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-contexts.Tpo $(DEPDIR)/cairo_test_suite-clip-contexts.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-contexts.c' object='cairo_test_suite-clip-contexts.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-contexts.obj `if test -f 'clip-contexts.c'; then $(CYGPATH_W) 'clip-contexts.c'; else $(CYGPATH_W) '$(srcdir)/clip-contexts.c'; fi` + +cairo_test_suite-clip-disjoint.o: clip-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-disjoint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-disjoint.Tpo -c -o cairo_test_suite-clip-disjoint.o `test -f 'clip-disjoint.c' || echo '$(srcdir)/'`clip-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-disjoint.Tpo $(DEPDIR)/cairo_test_suite-clip-disjoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-disjoint.c' object='cairo_test_suite-clip-disjoint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-disjoint.o `test -f 'clip-disjoint.c' || echo '$(srcdir)/'`clip-disjoint.c + +cairo_test_suite-clip-disjoint.obj: clip-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-disjoint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-disjoint.Tpo -c -o cairo_test_suite-clip-disjoint.obj `if test -f 'clip-disjoint.c'; then $(CYGPATH_W) 'clip-disjoint.c'; else $(CYGPATH_W) '$(srcdir)/clip-disjoint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-disjoint.Tpo $(DEPDIR)/cairo_test_suite-clip-disjoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-disjoint.c' object='cairo_test_suite-clip-disjoint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-disjoint.obj `if test -f 'clip-disjoint.c'; then $(CYGPATH_W) 'clip-disjoint.c'; else $(CYGPATH_W) '$(srcdir)/clip-disjoint.c'; fi` + +cairo_test_suite-clip-disjoint-hatching.o: clip-disjoint-hatching.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-disjoint-hatching.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Tpo -c -o cairo_test_suite-clip-disjoint-hatching.o `test -f 'clip-disjoint-hatching.c' || echo '$(srcdir)/'`clip-disjoint-hatching.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Tpo $(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-disjoint-hatching.c' object='cairo_test_suite-clip-disjoint-hatching.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-disjoint-hatching.o `test -f 'clip-disjoint-hatching.c' || echo '$(srcdir)/'`clip-disjoint-hatching.c + +cairo_test_suite-clip-disjoint-hatching.obj: clip-disjoint-hatching.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-disjoint-hatching.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Tpo -c -o cairo_test_suite-clip-disjoint-hatching.obj `if test -f 'clip-disjoint-hatching.c'; then $(CYGPATH_W) 'clip-disjoint-hatching.c'; else $(CYGPATH_W) '$(srcdir)/clip-disjoint-hatching.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Tpo $(DEPDIR)/cairo_test_suite-clip-disjoint-hatching.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-disjoint-hatching.c' object='cairo_test_suite-clip-disjoint-hatching.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-disjoint-hatching.obj `if test -f 'clip-disjoint-hatching.c'; then $(CYGPATH_W) 'clip-disjoint-hatching.c'; else $(CYGPATH_W) '$(srcdir)/clip-disjoint-hatching.c'; fi` + +cairo_test_suite-clip-disjoint-quad.o: clip-disjoint-quad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-disjoint-quad.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Tpo -c -o cairo_test_suite-clip-disjoint-quad.o `test -f 'clip-disjoint-quad.c' || echo '$(srcdir)/'`clip-disjoint-quad.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Tpo $(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-disjoint-quad.c' object='cairo_test_suite-clip-disjoint-quad.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-disjoint-quad.o `test -f 'clip-disjoint-quad.c' || echo '$(srcdir)/'`clip-disjoint-quad.c + +cairo_test_suite-clip-disjoint-quad.obj: clip-disjoint-quad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-disjoint-quad.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Tpo -c -o cairo_test_suite-clip-disjoint-quad.obj `if test -f 'clip-disjoint-quad.c'; then $(CYGPATH_W) 'clip-disjoint-quad.c'; else $(CYGPATH_W) '$(srcdir)/clip-disjoint-quad.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Tpo $(DEPDIR)/cairo_test_suite-clip-disjoint-quad.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-disjoint-quad.c' object='cairo_test_suite-clip-disjoint-quad.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-disjoint-quad.obj `if test -f 'clip-disjoint-quad.c'; then $(CYGPATH_W) 'clip-disjoint-quad.c'; else $(CYGPATH_W) '$(srcdir)/clip-disjoint-quad.c'; fi` + +cairo_test_suite-clip-device-offset.o: clip-device-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-device-offset.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-device-offset.Tpo -c -o cairo_test_suite-clip-device-offset.o `test -f 'clip-device-offset.c' || echo '$(srcdir)/'`clip-device-offset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-device-offset.Tpo $(DEPDIR)/cairo_test_suite-clip-device-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-device-offset.c' object='cairo_test_suite-clip-device-offset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-device-offset.o `test -f 'clip-device-offset.c' || echo '$(srcdir)/'`clip-device-offset.c + +cairo_test_suite-clip-device-offset.obj: clip-device-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-device-offset.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-device-offset.Tpo -c -o cairo_test_suite-clip-device-offset.obj `if test -f 'clip-device-offset.c'; then $(CYGPATH_W) 'clip-device-offset.c'; else $(CYGPATH_W) '$(srcdir)/clip-device-offset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-device-offset.Tpo $(DEPDIR)/cairo_test_suite-clip-device-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-device-offset.c' object='cairo_test_suite-clip-device-offset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-device-offset.obj `if test -f 'clip-device-offset.c'; then $(CYGPATH_W) 'clip-device-offset.c'; else $(CYGPATH_W) '$(srcdir)/clip-device-offset.c'; fi` + +cairo_test_suite-clip-double-free.o: clip-double-free.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-double-free.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-double-free.Tpo -c -o cairo_test_suite-clip-double-free.o `test -f 'clip-double-free.c' || echo '$(srcdir)/'`clip-double-free.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-double-free.Tpo $(DEPDIR)/cairo_test_suite-clip-double-free.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-double-free.c' object='cairo_test_suite-clip-double-free.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-double-free.o `test -f 'clip-double-free.c' || echo '$(srcdir)/'`clip-double-free.c + +cairo_test_suite-clip-double-free.obj: clip-double-free.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-double-free.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-double-free.Tpo -c -o cairo_test_suite-clip-double-free.obj `if test -f 'clip-double-free.c'; then $(CYGPATH_W) 'clip-double-free.c'; else $(CYGPATH_W) '$(srcdir)/clip-double-free.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-double-free.Tpo $(DEPDIR)/cairo_test_suite-clip-double-free.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-double-free.c' object='cairo_test_suite-clip-double-free.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-double-free.obj `if test -f 'clip-double-free.c'; then $(CYGPATH_W) 'clip-double-free.c'; else $(CYGPATH_W) '$(srcdir)/clip-double-free.c'; fi` + +cairo_test_suite-clip-draw-unbounded.o: clip-draw-unbounded.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-draw-unbounded.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Tpo -c -o cairo_test_suite-clip-draw-unbounded.o `test -f 'clip-draw-unbounded.c' || echo '$(srcdir)/'`clip-draw-unbounded.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Tpo $(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-draw-unbounded.c' object='cairo_test_suite-clip-draw-unbounded.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-draw-unbounded.o `test -f 'clip-draw-unbounded.c' || echo '$(srcdir)/'`clip-draw-unbounded.c + +cairo_test_suite-clip-draw-unbounded.obj: clip-draw-unbounded.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-draw-unbounded.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Tpo -c -o cairo_test_suite-clip-draw-unbounded.obj `if test -f 'clip-draw-unbounded.c'; then $(CYGPATH_W) 'clip-draw-unbounded.c'; else $(CYGPATH_W) '$(srcdir)/clip-draw-unbounded.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Tpo $(DEPDIR)/cairo_test_suite-clip-draw-unbounded.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-draw-unbounded.c' object='cairo_test_suite-clip-draw-unbounded.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-draw-unbounded.obj `if test -f 'clip-draw-unbounded.c'; then $(CYGPATH_W) 'clip-draw-unbounded.c'; else $(CYGPATH_W) '$(srcdir)/clip-draw-unbounded.c'; fi` + +cairo_test_suite-clip-empty.o: clip-empty.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-empty.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-empty.Tpo -c -o cairo_test_suite-clip-empty.o `test -f 'clip-empty.c' || echo '$(srcdir)/'`clip-empty.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-empty.Tpo $(DEPDIR)/cairo_test_suite-clip-empty.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-empty.c' object='cairo_test_suite-clip-empty.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-empty.o `test -f 'clip-empty.c' || echo '$(srcdir)/'`clip-empty.c + +cairo_test_suite-clip-empty.obj: clip-empty.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-empty.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-empty.Tpo -c -o cairo_test_suite-clip-empty.obj `if test -f 'clip-empty.c'; then $(CYGPATH_W) 'clip-empty.c'; else $(CYGPATH_W) '$(srcdir)/clip-empty.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-empty.Tpo $(DEPDIR)/cairo_test_suite-clip-empty.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-empty.c' object='cairo_test_suite-clip-empty.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-empty.obj `if test -f 'clip-empty.c'; then $(CYGPATH_W) 'clip-empty.c'; else $(CYGPATH_W) '$(srcdir)/clip-empty.c'; fi` + +cairo_test_suite-clip-empty-group.o: clip-empty-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-empty-group.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-empty-group.Tpo -c -o cairo_test_suite-clip-empty-group.o `test -f 'clip-empty-group.c' || echo '$(srcdir)/'`clip-empty-group.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-empty-group.Tpo $(DEPDIR)/cairo_test_suite-clip-empty-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-empty-group.c' object='cairo_test_suite-clip-empty-group.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-empty-group.o `test -f 'clip-empty-group.c' || echo '$(srcdir)/'`clip-empty-group.c + +cairo_test_suite-clip-empty-group.obj: clip-empty-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-empty-group.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-empty-group.Tpo -c -o cairo_test_suite-clip-empty-group.obj `if test -f 'clip-empty-group.c'; then $(CYGPATH_W) 'clip-empty-group.c'; else $(CYGPATH_W) '$(srcdir)/clip-empty-group.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-empty-group.Tpo $(DEPDIR)/cairo_test_suite-clip-empty-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-empty-group.c' object='cairo_test_suite-clip-empty-group.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-empty-group.obj `if test -f 'clip-empty-group.c'; then $(CYGPATH_W) 'clip-empty-group.c'; else $(CYGPATH_W) '$(srcdir)/clip-empty-group.c'; fi` + +cairo_test_suite-clip-empty-save.o: clip-empty-save.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-empty-save.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-empty-save.Tpo -c -o cairo_test_suite-clip-empty-save.o `test -f 'clip-empty-save.c' || echo '$(srcdir)/'`clip-empty-save.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-empty-save.Tpo $(DEPDIR)/cairo_test_suite-clip-empty-save.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-empty-save.c' object='cairo_test_suite-clip-empty-save.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-empty-save.o `test -f 'clip-empty-save.c' || echo '$(srcdir)/'`clip-empty-save.c + +cairo_test_suite-clip-empty-save.obj: clip-empty-save.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-empty-save.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-empty-save.Tpo -c -o cairo_test_suite-clip-empty-save.obj `if test -f 'clip-empty-save.c'; then $(CYGPATH_W) 'clip-empty-save.c'; else $(CYGPATH_W) '$(srcdir)/clip-empty-save.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-empty-save.Tpo $(DEPDIR)/cairo_test_suite-clip-empty-save.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-empty-save.c' object='cairo_test_suite-clip-empty-save.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-empty-save.obj `if test -f 'clip-empty-save.c'; then $(CYGPATH_W) 'clip-empty-save.c'; else $(CYGPATH_W) '$(srcdir)/clip-empty-save.c'; fi` + +cairo_test_suite-clip-fill.o: clip-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill.Tpo -c -o cairo_test_suite-clip-fill.o `test -f 'clip-fill.c' || echo '$(srcdir)/'`clip-fill.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill.Tpo $(DEPDIR)/cairo_test_suite-clip-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill.c' object='cairo_test_suite-clip-fill.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill.o `test -f 'clip-fill.c' || echo '$(srcdir)/'`clip-fill.c + +cairo_test_suite-clip-fill.obj: clip-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill.Tpo -c -o cairo_test_suite-clip-fill.obj `if test -f 'clip-fill.c'; then $(CYGPATH_W) 'clip-fill.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill.Tpo $(DEPDIR)/cairo_test_suite-clip-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill.c' object='cairo_test_suite-clip-fill.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill.obj `if test -f 'clip-fill.c'; then $(CYGPATH_W) 'clip-fill.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill.c'; fi` + +cairo_test_suite-clip-fill-no-op.o: clip-fill-no-op.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill-no-op.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill-no-op.Tpo -c -o cairo_test_suite-clip-fill-no-op.o `test -f 'clip-fill-no-op.c' || echo '$(srcdir)/'`clip-fill-no-op.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill-no-op.Tpo $(DEPDIR)/cairo_test_suite-clip-fill-no-op.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill-no-op.c' object='cairo_test_suite-clip-fill-no-op.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill-no-op.o `test -f 'clip-fill-no-op.c' || echo '$(srcdir)/'`clip-fill-no-op.c + +cairo_test_suite-clip-fill-no-op.obj: clip-fill-no-op.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill-no-op.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill-no-op.Tpo -c -o cairo_test_suite-clip-fill-no-op.obj `if test -f 'clip-fill-no-op.c'; then $(CYGPATH_W) 'clip-fill-no-op.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill-no-op.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill-no-op.Tpo $(DEPDIR)/cairo_test_suite-clip-fill-no-op.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill-no-op.c' object='cairo_test_suite-clip-fill-no-op.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill-no-op.obj `if test -f 'clip-fill-no-op.c'; then $(CYGPATH_W) 'clip-fill-no-op.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill-no-op.c'; fi` + +cairo_test_suite-clip-fill-rule.o: clip-fill-rule.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill-rule.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill-rule.Tpo -c -o cairo_test_suite-clip-fill-rule.o `test -f 'clip-fill-rule.c' || echo '$(srcdir)/'`clip-fill-rule.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill-rule.Tpo $(DEPDIR)/cairo_test_suite-clip-fill-rule.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill-rule.c' object='cairo_test_suite-clip-fill-rule.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill-rule.o `test -f 'clip-fill-rule.c' || echo '$(srcdir)/'`clip-fill-rule.c + +cairo_test_suite-clip-fill-rule.obj: clip-fill-rule.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill-rule.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill-rule.Tpo -c -o cairo_test_suite-clip-fill-rule.obj `if test -f 'clip-fill-rule.c'; then $(CYGPATH_W) 'clip-fill-rule.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill-rule.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill-rule.Tpo $(DEPDIR)/cairo_test_suite-clip-fill-rule.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill-rule.c' object='cairo_test_suite-clip-fill-rule.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill-rule.obj `if test -f 'clip-fill-rule.c'; then $(CYGPATH_W) 'clip-fill-rule.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill-rule.c'; fi` + +cairo_test_suite-clip-fill-rule-pixel-aligned.o: clip-fill-rule-pixel-aligned.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill-rule-pixel-aligned.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Tpo -c -o cairo_test_suite-clip-fill-rule-pixel-aligned.o `test -f 'clip-fill-rule-pixel-aligned.c' || echo '$(srcdir)/'`clip-fill-rule-pixel-aligned.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Tpo $(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill-rule-pixel-aligned.c' object='cairo_test_suite-clip-fill-rule-pixel-aligned.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill-rule-pixel-aligned.o `test -f 'clip-fill-rule-pixel-aligned.c' || echo '$(srcdir)/'`clip-fill-rule-pixel-aligned.c + +cairo_test_suite-clip-fill-rule-pixel-aligned.obj: clip-fill-rule-pixel-aligned.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-fill-rule-pixel-aligned.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Tpo -c -o cairo_test_suite-clip-fill-rule-pixel-aligned.obj `if test -f 'clip-fill-rule-pixel-aligned.c'; then $(CYGPATH_W) 'clip-fill-rule-pixel-aligned.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill-rule-pixel-aligned.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Tpo $(DEPDIR)/cairo_test_suite-clip-fill-rule-pixel-aligned.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-fill-rule-pixel-aligned.c' object='cairo_test_suite-clip-fill-rule-pixel-aligned.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-fill-rule-pixel-aligned.obj `if test -f 'clip-fill-rule-pixel-aligned.c'; then $(CYGPATH_W) 'clip-fill-rule-pixel-aligned.c'; else $(CYGPATH_W) '$(srcdir)/clip-fill-rule-pixel-aligned.c'; fi` + +cairo_test_suite-clip-group-shapes.o: clip-group-shapes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-group-shapes.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-group-shapes.Tpo -c -o cairo_test_suite-clip-group-shapes.o `test -f 'clip-group-shapes.c' || echo '$(srcdir)/'`clip-group-shapes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-group-shapes.Tpo $(DEPDIR)/cairo_test_suite-clip-group-shapes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-group-shapes.c' object='cairo_test_suite-clip-group-shapes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-group-shapes.o `test -f 'clip-group-shapes.c' || echo '$(srcdir)/'`clip-group-shapes.c + +cairo_test_suite-clip-group-shapes.obj: clip-group-shapes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-group-shapes.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-group-shapes.Tpo -c -o cairo_test_suite-clip-group-shapes.obj `if test -f 'clip-group-shapes.c'; then $(CYGPATH_W) 'clip-group-shapes.c'; else $(CYGPATH_W) '$(srcdir)/clip-group-shapes.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-group-shapes.Tpo $(DEPDIR)/cairo_test_suite-clip-group-shapes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-group-shapes.c' object='cairo_test_suite-clip-group-shapes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-group-shapes.obj `if test -f 'clip-group-shapes.c'; then $(CYGPATH_W) 'clip-group-shapes.c'; else $(CYGPATH_W) '$(srcdir)/clip-group-shapes.c'; fi` + +cairo_test_suite-clip-image.o: clip-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-image.Tpo -c -o cairo_test_suite-clip-image.o `test -f 'clip-image.c' || echo '$(srcdir)/'`clip-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-image.Tpo $(DEPDIR)/cairo_test_suite-clip-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-image.c' object='cairo_test_suite-clip-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-image.o `test -f 'clip-image.c' || echo '$(srcdir)/'`clip-image.c + +cairo_test_suite-clip-image.obj: clip-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-image.Tpo -c -o cairo_test_suite-clip-image.obj `if test -f 'clip-image.c'; then $(CYGPATH_W) 'clip-image.c'; else $(CYGPATH_W) '$(srcdir)/clip-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-image.Tpo $(DEPDIR)/cairo_test_suite-clip-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-image.c' object='cairo_test_suite-clip-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-image.obj `if test -f 'clip-image.c'; then $(CYGPATH_W) 'clip-image.c'; else $(CYGPATH_W) '$(srcdir)/clip-image.c'; fi` + +cairo_test_suite-clip-intersect.o: clip-intersect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-intersect.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-intersect.Tpo -c -o cairo_test_suite-clip-intersect.o `test -f 'clip-intersect.c' || echo '$(srcdir)/'`clip-intersect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-intersect.Tpo $(DEPDIR)/cairo_test_suite-clip-intersect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-intersect.c' object='cairo_test_suite-clip-intersect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-intersect.o `test -f 'clip-intersect.c' || echo '$(srcdir)/'`clip-intersect.c + +cairo_test_suite-clip-intersect.obj: clip-intersect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-intersect.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-intersect.Tpo -c -o cairo_test_suite-clip-intersect.obj `if test -f 'clip-intersect.c'; then $(CYGPATH_W) 'clip-intersect.c'; else $(CYGPATH_W) '$(srcdir)/clip-intersect.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-intersect.Tpo $(DEPDIR)/cairo_test_suite-clip-intersect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-intersect.c' object='cairo_test_suite-clip-intersect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-intersect.obj `if test -f 'clip-intersect.c'; then $(CYGPATH_W) 'clip-intersect.c'; else $(CYGPATH_W) '$(srcdir)/clip-intersect.c'; fi` + +cairo_test_suite-clip-mixed-antialias.o: clip-mixed-antialias.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-mixed-antialias.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Tpo -c -o cairo_test_suite-clip-mixed-antialias.o `test -f 'clip-mixed-antialias.c' || echo '$(srcdir)/'`clip-mixed-antialias.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Tpo $(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-mixed-antialias.c' object='cairo_test_suite-clip-mixed-antialias.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-mixed-antialias.o `test -f 'clip-mixed-antialias.c' || echo '$(srcdir)/'`clip-mixed-antialias.c + +cairo_test_suite-clip-mixed-antialias.obj: clip-mixed-antialias.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-mixed-antialias.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Tpo -c -o cairo_test_suite-clip-mixed-antialias.obj `if test -f 'clip-mixed-antialias.c'; then $(CYGPATH_W) 'clip-mixed-antialias.c'; else $(CYGPATH_W) '$(srcdir)/clip-mixed-antialias.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Tpo $(DEPDIR)/cairo_test_suite-clip-mixed-antialias.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-mixed-antialias.c' object='cairo_test_suite-clip-mixed-antialias.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-mixed-antialias.obj `if test -f 'clip-mixed-antialias.c'; then $(CYGPATH_W) 'clip-mixed-antialias.c'; else $(CYGPATH_W) '$(srcdir)/clip-mixed-antialias.c'; fi` + +cairo_test_suite-clip-nesting.o: clip-nesting.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-nesting.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-nesting.Tpo -c -o cairo_test_suite-clip-nesting.o `test -f 'clip-nesting.c' || echo '$(srcdir)/'`clip-nesting.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-nesting.Tpo $(DEPDIR)/cairo_test_suite-clip-nesting.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-nesting.c' object='cairo_test_suite-clip-nesting.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-nesting.o `test -f 'clip-nesting.c' || echo '$(srcdir)/'`clip-nesting.c + +cairo_test_suite-clip-nesting.obj: clip-nesting.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-nesting.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-nesting.Tpo -c -o cairo_test_suite-clip-nesting.obj `if test -f 'clip-nesting.c'; then $(CYGPATH_W) 'clip-nesting.c'; else $(CYGPATH_W) '$(srcdir)/clip-nesting.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-nesting.Tpo $(DEPDIR)/cairo_test_suite-clip-nesting.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-nesting.c' object='cairo_test_suite-clip-nesting.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-nesting.obj `if test -f 'clip-nesting.c'; then $(CYGPATH_W) 'clip-nesting.c'; else $(CYGPATH_W) '$(srcdir)/clip-nesting.c'; fi` + +cairo_test_suite-clip-operator.o: clip-operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-operator.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-operator.Tpo -c -o cairo_test_suite-clip-operator.o `test -f 'clip-operator.c' || echo '$(srcdir)/'`clip-operator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-operator.Tpo $(DEPDIR)/cairo_test_suite-clip-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-operator.c' object='cairo_test_suite-clip-operator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-operator.o `test -f 'clip-operator.c' || echo '$(srcdir)/'`clip-operator.c + +cairo_test_suite-clip-operator.obj: clip-operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-operator.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-operator.Tpo -c -o cairo_test_suite-clip-operator.obj `if test -f 'clip-operator.c'; then $(CYGPATH_W) 'clip-operator.c'; else $(CYGPATH_W) '$(srcdir)/clip-operator.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-operator.Tpo $(DEPDIR)/cairo_test_suite-clip-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-operator.c' object='cairo_test_suite-clip-operator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-operator.obj `if test -f 'clip-operator.c'; then $(CYGPATH_W) 'clip-operator.c'; else $(CYGPATH_W) '$(srcdir)/clip-operator.c'; fi` + +cairo_test_suite-clip-push-group.o: clip-push-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-push-group.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-push-group.Tpo -c -o cairo_test_suite-clip-push-group.o `test -f 'clip-push-group.c' || echo '$(srcdir)/'`clip-push-group.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-push-group.Tpo $(DEPDIR)/cairo_test_suite-clip-push-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-push-group.c' object='cairo_test_suite-clip-push-group.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-push-group.o `test -f 'clip-push-group.c' || echo '$(srcdir)/'`clip-push-group.c + +cairo_test_suite-clip-push-group.obj: clip-push-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-push-group.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-push-group.Tpo -c -o cairo_test_suite-clip-push-group.obj `if test -f 'clip-push-group.c'; then $(CYGPATH_W) 'clip-push-group.c'; else $(CYGPATH_W) '$(srcdir)/clip-push-group.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-push-group.Tpo $(DEPDIR)/cairo_test_suite-clip-push-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-push-group.c' object='cairo_test_suite-clip-push-group.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-push-group.obj `if test -f 'clip-push-group.c'; then $(CYGPATH_W) 'clip-push-group.c'; else $(CYGPATH_W) '$(srcdir)/clip-push-group.c'; fi` + +cairo_test_suite-clip-polygons.o: clip-polygons.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-polygons.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-polygons.Tpo -c -o cairo_test_suite-clip-polygons.o `test -f 'clip-polygons.c' || echo '$(srcdir)/'`clip-polygons.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-polygons.Tpo $(DEPDIR)/cairo_test_suite-clip-polygons.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-polygons.c' object='cairo_test_suite-clip-polygons.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-polygons.o `test -f 'clip-polygons.c' || echo '$(srcdir)/'`clip-polygons.c + +cairo_test_suite-clip-polygons.obj: clip-polygons.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-polygons.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-polygons.Tpo -c -o cairo_test_suite-clip-polygons.obj `if test -f 'clip-polygons.c'; then $(CYGPATH_W) 'clip-polygons.c'; else $(CYGPATH_W) '$(srcdir)/clip-polygons.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-polygons.Tpo $(DEPDIR)/cairo_test_suite-clip-polygons.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-polygons.c' object='cairo_test_suite-clip-polygons.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-polygons.obj `if test -f 'clip-polygons.c'; then $(CYGPATH_W) 'clip-polygons.c'; else $(CYGPATH_W) '$(srcdir)/clip-polygons.c'; fi` + +cairo_test_suite-clip-rectilinear.o: clip-rectilinear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-rectilinear.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-rectilinear.Tpo -c -o cairo_test_suite-clip-rectilinear.o `test -f 'clip-rectilinear.c' || echo '$(srcdir)/'`clip-rectilinear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-rectilinear.Tpo $(DEPDIR)/cairo_test_suite-clip-rectilinear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-rectilinear.c' object='cairo_test_suite-clip-rectilinear.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-rectilinear.o `test -f 'clip-rectilinear.c' || echo '$(srcdir)/'`clip-rectilinear.c + +cairo_test_suite-clip-rectilinear.obj: clip-rectilinear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-rectilinear.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-rectilinear.Tpo -c -o cairo_test_suite-clip-rectilinear.obj `if test -f 'clip-rectilinear.c'; then $(CYGPATH_W) 'clip-rectilinear.c'; else $(CYGPATH_W) '$(srcdir)/clip-rectilinear.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-rectilinear.Tpo $(DEPDIR)/cairo_test_suite-clip-rectilinear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-rectilinear.c' object='cairo_test_suite-clip-rectilinear.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-rectilinear.obj `if test -f 'clip-rectilinear.c'; then $(CYGPATH_W) 'clip-rectilinear.c'; else $(CYGPATH_W) '$(srcdir)/clip-rectilinear.c'; fi` + +cairo_test_suite-clip-shape.o: clip-shape.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-shape.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-shape.Tpo -c -o cairo_test_suite-clip-shape.o `test -f 'clip-shape.c' || echo '$(srcdir)/'`clip-shape.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-shape.Tpo $(DEPDIR)/cairo_test_suite-clip-shape.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-shape.c' object='cairo_test_suite-clip-shape.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-shape.o `test -f 'clip-shape.c' || echo '$(srcdir)/'`clip-shape.c + +cairo_test_suite-clip-shape.obj: clip-shape.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-shape.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-shape.Tpo -c -o cairo_test_suite-clip-shape.obj `if test -f 'clip-shape.c'; then $(CYGPATH_W) 'clip-shape.c'; else $(CYGPATH_W) '$(srcdir)/clip-shape.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-shape.Tpo $(DEPDIR)/cairo_test_suite-clip-shape.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-shape.c' object='cairo_test_suite-clip-shape.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-shape.obj `if test -f 'clip-shape.c'; then $(CYGPATH_W) 'clip-shape.c'; else $(CYGPATH_W) '$(srcdir)/clip-shape.c'; fi` + +cairo_test_suite-clip-stroke.o: clip-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-stroke.Tpo -c -o cairo_test_suite-clip-stroke.o `test -f 'clip-stroke.c' || echo '$(srcdir)/'`clip-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-stroke.Tpo $(DEPDIR)/cairo_test_suite-clip-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-stroke.c' object='cairo_test_suite-clip-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-stroke.o `test -f 'clip-stroke.c' || echo '$(srcdir)/'`clip-stroke.c + +cairo_test_suite-clip-stroke.obj: clip-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-stroke.Tpo -c -o cairo_test_suite-clip-stroke.obj `if test -f 'clip-stroke.c'; then $(CYGPATH_W) 'clip-stroke.c'; else $(CYGPATH_W) '$(srcdir)/clip-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-stroke.Tpo $(DEPDIR)/cairo_test_suite-clip-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-stroke.c' object='cairo_test_suite-clip-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-stroke.obj `if test -f 'clip-stroke.c'; then $(CYGPATH_W) 'clip-stroke.c'; else $(CYGPATH_W) '$(srcdir)/clip-stroke.c'; fi` + +cairo_test_suite-clip-stroke-no-op.o: clip-stroke-no-op.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-stroke-no-op.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Tpo -c -o cairo_test_suite-clip-stroke-no-op.o `test -f 'clip-stroke-no-op.c' || echo '$(srcdir)/'`clip-stroke-no-op.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Tpo $(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-stroke-no-op.c' object='cairo_test_suite-clip-stroke-no-op.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-stroke-no-op.o `test -f 'clip-stroke-no-op.c' || echo '$(srcdir)/'`clip-stroke-no-op.c + +cairo_test_suite-clip-stroke-no-op.obj: clip-stroke-no-op.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-stroke-no-op.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Tpo -c -o cairo_test_suite-clip-stroke-no-op.obj `if test -f 'clip-stroke-no-op.c'; then $(CYGPATH_W) 'clip-stroke-no-op.c'; else $(CYGPATH_W) '$(srcdir)/clip-stroke-no-op.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Tpo $(DEPDIR)/cairo_test_suite-clip-stroke-no-op.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-stroke-no-op.c' object='cairo_test_suite-clip-stroke-no-op.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-stroke-no-op.obj `if test -f 'clip-stroke-no-op.c'; then $(CYGPATH_W) 'clip-stroke-no-op.c'; else $(CYGPATH_W) '$(srcdir)/clip-stroke-no-op.c'; fi` + +cairo_test_suite-clip-text.o: clip-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-text.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-text.Tpo -c -o cairo_test_suite-clip-text.o `test -f 'clip-text.c' || echo '$(srcdir)/'`clip-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-text.Tpo $(DEPDIR)/cairo_test_suite-clip-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-text.c' object='cairo_test_suite-clip-text.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-text.o `test -f 'clip-text.c' || echo '$(srcdir)/'`clip-text.c + +cairo_test_suite-clip-text.obj: clip-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-text.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-text.Tpo -c -o cairo_test_suite-clip-text.obj `if test -f 'clip-text.c'; then $(CYGPATH_W) 'clip-text.c'; else $(CYGPATH_W) '$(srcdir)/clip-text.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-text.Tpo $(DEPDIR)/cairo_test_suite-clip-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-text.c' object='cairo_test_suite-clip-text.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-text.obj `if test -f 'clip-text.c'; then $(CYGPATH_W) 'clip-text.c'; else $(CYGPATH_W) '$(srcdir)/clip-text.c'; fi` + +cairo_test_suite-clip-twice.o: clip-twice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-twice.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-twice.Tpo -c -o cairo_test_suite-clip-twice.o `test -f 'clip-twice.c' || echo '$(srcdir)/'`clip-twice.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-twice.Tpo $(DEPDIR)/cairo_test_suite-clip-twice.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-twice.c' object='cairo_test_suite-clip-twice.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-twice.o `test -f 'clip-twice.c' || echo '$(srcdir)/'`clip-twice.c + +cairo_test_suite-clip-twice.obj: clip-twice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-twice.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-twice.Tpo -c -o cairo_test_suite-clip-twice.obj `if test -f 'clip-twice.c'; then $(CYGPATH_W) 'clip-twice.c'; else $(CYGPATH_W) '$(srcdir)/clip-twice.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-twice.Tpo $(DEPDIR)/cairo_test_suite-clip-twice.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-twice.c' object='cairo_test_suite-clip-twice.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-twice.obj `if test -f 'clip-twice.c'; then $(CYGPATH_W) 'clip-twice.c'; else $(CYGPATH_W) '$(srcdir)/clip-twice.c'; fi` + +cairo_test_suite-clip-twice-rectangle.o: clip-twice-rectangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-twice-rectangle.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Tpo -c -o cairo_test_suite-clip-twice-rectangle.o `test -f 'clip-twice-rectangle.c' || echo '$(srcdir)/'`clip-twice-rectangle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Tpo $(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-twice-rectangle.c' object='cairo_test_suite-clip-twice-rectangle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-twice-rectangle.o `test -f 'clip-twice-rectangle.c' || echo '$(srcdir)/'`clip-twice-rectangle.c + +cairo_test_suite-clip-twice-rectangle.obj: clip-twice-rectangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-twice-rectangle.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Tpo -c -o cairo_test_suite-clip-twice-rectangle.obj `if test -f 'clip-twice-rectangle.c'; then $(CYGPATH_W) 'clip-twice-rectangle.c'; else $(CYGPATH_W) '$(srcdir)/clip-twice-rectangle.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Tpo $(DEPDIR)/cairo_test_suite-clip-twice-rectangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-twice-rectangle.c' object='cairo_test_suite-clip-twice-rectangle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-twice-rectangle.obj `if test -f 'clip-twice-rectangle.c'; then $(CYGPATH_W) 'clip-twice-rectangle.c'; else $(CYGPATH_W) '$(srcdir)/clip-twice-rectangle.c'; fi` + +cairo_test_suite-clip-unbounded.o: clip-unbounded.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-unbounded.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-unbounded.Tpo -c -o cairo_test_suite-clip-unbounded.o `test -f 'clip-unbounded.c' || echo '$(srcdir)/'`clip-unbounded.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-unbounded.Tpo $(DEPDIR)/cairo_test_suite-clip-unbounded.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-unbounded.c' object='cairo_test_suite-clip-unbounded.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-unbounded.o `test -f 'clip-unbounded.c' || echo '$(srcdir)/'`clip-unbounded.c + +cairo_test_suite-clip-unbounded.obj: clip-unbounded.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-unbounded.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-unbounded.Tpo -c -o cairo_test_suite-clip-unbounded.obj `if test -f 'clip-unbounded.c'; then $(CYGPATH_W) 'clip-unbounded.c'; else $(CYGPATH_W) '$(srcdir)/clip-unbounded.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-unbounded.Tpo $(DEPDIR)/cairo_test_suite-clip-unbounded.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-unbounded.c' object='cairo_test_suite-clip-unbounded.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-unbounded.obj `if test -f 'clip-unbounded.c'; then $(CYGPATH_W) 'clip-unbounded.c'; else $(CYGPATH_W) '$(srcdir)/clip-unbounded.c'; fi` + +cairo_test_suite-clip-zero.o: clip-zero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-zero.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-zero.Tpo -c -o cairo_test_suite-clip-zero.o `test -f 'clip-zero.c' || echo '$(srcdir)/'`clip-zero.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-zero.Tpo $(DEPDIR)/cairo_test_suite-clip-zero.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-zero.c' object='cairo_test_suite-clip-zero.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-zero.o `test -f 'clip-zero.c' || echo '$(srcdir)/'`clip-zero.c + +cairo_test_suite-clip-zero.obj: clip-zero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clip-zero.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clip-zero.Tpo -c -o cairo_test_suite-clip-zero.obj `if test -f 'clip-zero.c'; then $(CYGPATH_W) 'clip-zero.c'; else $(CYGPATH_W) '$(srcdir)/clip-zero.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clip-zero.Tpo $(DEPDIR)/cairo_test_suite-clip-zero.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clip-zero.c' object='cairo_test_suite-clip-zero.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clip-zero.obj `if test -f 'clip-zero.c'; then $(CYGPATH_W) 'clip-zero.c'; else $(CYGPATH_W) '$(srcdir)/clip-zero.c'; fi` + +cairo_test_suite-clipped-group.o: clipped-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clipped-group.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clipped-group.Tpo -c -o cairo_test_suite-clipped-group.o `test -f 'clipped-group.c' || echo '$(srcdir)/'`clipped-group.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clipped-group.Tpo $(DEPDIR)/cairo_test_suite-clipped-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipped-group.c' object='cairo_test_suite-clipped-group.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clipped-group.o `test -f 'clipped-group.c' || echo '$(srcdir)/'`clipped-group.c + +cairo_test_suite-clipped-group.obj: clipped-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clipped-group.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clipped-group.Tpo -c -o cairo_test_suite-clipped-group.obj `if test -f 'clipped-group.c'; then $(CYGPATH_W) 'clipped-group.c'; else $(CYGPATH_W) '$(srcdir)/clipped-group.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clipped-group.Tpo $(DEPDIR)/cairo_test_suite-clipped-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipped-group.c' object='cairo_test_suite-clipped-group.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clipped-group.obj `if test -f 'clipped-group.c'; then $(CYGPATH_W) 'clipped-group.c'; else $(CYGPATH_W) '$(srcdir)/clipped-group.c'; fi` + +cairo_test_suite-clipped-surface.o: clipped-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clipped-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-clipped-surface.Tpo -c -o cairo_test_suite-clipped-surface.o `test -f 'clipped-surface.c' || echo '$(srcdir)/'`clipped-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clipped-surface.Tpo $(DEPDIR)/cairo_test_suite-clipped-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipped-surface.c' object='cairo_test_suite-clipped-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clipped-surface.o `test -f 'clipped-surface.c' || echo '$(srcdir)/'`clipped-surface.c + +cairo_test_suite-clipped-surface.obj: clipped-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-clipped-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-clipped-surface.Tpo -c -o cairo_test_suite-clipped-surface.obj `if test -f 'clipped-surface.c'; then $(CYGPATH_W) 'clipped-surface.c'; else $(CYGPATH_W) '$(srcdir)/clipped-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-clipped-surface.Tpo $(DEPDIR)/cairo_test_suite-clipped-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='clipped-surface.c' object='cairo_test_suite-clipped-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-clipped-surface.obj `if test -f 'clipped-surface.c'; then $(CYGPATH_W) 'clipped-surface.c'; else $(CYGPATH_W) '$(srcdir)/clipped-surface.c'; fi` + +cairo_test_suite-close-path.o: close-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-close-path.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-close-path.Tpo -c -o cairo_test_suite-close-path.o `test -f 'close-path.c' || echo '$(srcdir)/'`close-path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-close-path.Tpo $(DEPDIR)/cairo_test_suite-close-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='close-path.c' object='cairo_test_suite-close-path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-close-path.o `test -f 'close-path.c' || echo '$(srcdir)/'`close-path.c + +cairo_test_suite-close-path.obj: close-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-close-path.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-close-path.Tpo -c -o cairo_test_suite-close-path.obj `if test -f 'close-path.c'; then $(CYGPATH_W) 'close-path.c'; else $(CYGPATH_W) '$(srcdir)/close-path.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-close-path.Tpo $(DEPDIR)/cairo_test_suite-close-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='close-path.c' object='cairo_test_suite-close-path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-close-path.obj `if test -f 'close-path.c'; then $(CYGPATH_W) 'close-path.c'; else $(CYGPATH_W) '$(srcdir)/close-path.c'; fi` + +cairo_test_suite-close-path-current-point.o: close-path-current-point.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-close-path-current-point.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-close-path-current-point.Tpo -c -o cairo_test_suite-close-path-current-point.o `test -f 'close-path-current-point.c' || echo '$(srcdir)/'`close-path-current-point.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-close-path-current-point.Tpo $(DEPDIR)/cairo_test_suite-close-path-current-point.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='close-path-current-point.c' object='cairo_test_suite-close-path-current-point.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-close-path-current-point.o `test -f 'close-path-current-point.c' || echo '$(srcdir)/'`close-path-current-point.c + +cairo_test_suite-close-path-current-point.obj: close-path-current-point.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-close-path-current-point.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-close-path-current-point.Tpo -c -o cairo_test_suite-close-path-current-point.obj `if test -f 'close-path-current-point.c'; then $(CYGPATH_W) 'close-path-current-point.c'; else $(CYGPATH_W) '$(srcdir)/close-path-current-point.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-close-path-current-point.Tpo $(DEPDIR)/cairo_test_suite-close-path-current-point.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='close-path-current-point.c' object='cairo_test_suite-close-path-current-point.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-close-path-current-point.obj `if test -f 'close-path-current-point.c'; then $(CYGPATH_W) 'close-path-current-point.c'; else $(CYGPATH_W) '$(srcdir)/close-path-current-point.c'; fi` + +cairo_test_suite-composite-integer-translate-source.o: composite-integer-translate-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-composite-integer-translate-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Tpo -c -o cairo_test_suite-composite-integer-translate-source.o `test -f 'composite-integer-translate-source.c' || echo '$(srcdir)/'`composite-integer-translate-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Tpo $(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='composite-integer-translate-source.c' object='cairo_test_suite-composite-integer-translate-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-composite-integer-translate-source.o `test -f 'composite-integer-translate-source.c' || echo '$(srcdir)/'`composite-integer-translate-source.c + +cairo_test_suite-composite-integer-translate-source.obj: composite-integer-translate-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-composite-integer-translate-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Tpo -c -o cairo_test_suite-composite-integer-translate-source.obj `if test -f 'composite-integer-translate-source.c'; then $(CYGPATH_W) 'composite-integer-translate-source.c'; else $(CYGPATH_W) '$(srcdir)/composite-integer-translate-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Tpo $(DEPDIR)/cairo_test_suite-composite-integer-translate-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='composite-integer-translate-source.c' object='cairo_test_suite-composite-integer-translate-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-composite-integer-translate-source.obj `if test -f 'composite-integer-translate-source.c'; then $(CYGPATH_W) 'composite-integer-translate-source.c'; else $(CYGPATH_W) '$(srcdir)/composite-integer-translate-source.c'; fi` + +cairo_test_suite-composite-integer-translate-over.o: composite-integer-translate-over.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-composite-integer-translate-over.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Tpo -c -o cairo_test_suite-composite-integer-translate-over.o `test -f 'composite-integer-translate-over.c' || echo '$(srcdir)/'`composite-integer-translate-over.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Tpo $(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='composite-integer-translate-over.c' object='cairo_test_suite-composite-integer-translate-over.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-composite-integer-translate-over.o `test -f 'composite-integer-translate-over.c' || echo '$(srcdir)/'`composite-integer-translate-over.c + +cairo_test_suite-composite-integer-translate-over.obj: composite-integer-translate-over.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-composite-integer-translate-over.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Tpo -c -o cairo_test_suite-composite-integer-translate-over.obj `if test -f 'composite-integer-translate-over.c'; then $(CYGPATH_W) 'composite-integer-translate-over.c'; else $(CYGPATH_W) '$(srcdir)/composite-integer-translate-over.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Tpo $(DEPDIR)/cairo_test_suite-composite-integer-translate-over.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='composite-integer-translate-over.c' object='cairo_test_suite-composite-integer-translate-over.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-composite-integer-translate-over.obj `if test -f 'composite-integer-translate-over.c'; then $(CYGPATH_W) 'composite-integer-translate-over.c'; else $(CYGPATH_W) '$(srcdir)/composite-integer-translate-over.c'; fi` + +cairo_test_suite-composite-integer-translate-over-repeat.o: composite-integer-translate-over-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-composite-integer-translate-over-repeat.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Tpo -c -o cairo_test_suite-composite-integer-translate-over-repeat.o `test -f 'composite-integer-translate-over-repeat.c' || echo '$(srcdir)/'`composite-integer-translate-over-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Tpo $(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='composite-integer-translate-over-repeat.c' object='cairo_test_suite-composite-integer-translate-over-repeat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-composite-integer-translate-over-repeat.o `test -f 'composite-integer-translate-over-repeat.c' || echo '$(srcdir)/'`composite-integer-translate-over-repeat.c + +cairo_test_suite-composite-integer-translate-over-repeat.obj: composite-integer-translate-over-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-composite-integer-translate-over-repeat.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Tpo -c -o cairo_test_suite-composite-integer-translate-over-repeat.obj `if test -f 'composite-integer-translate-over-repeat.c'; then $(CYGPATH_W) 'composite-integer-translate-over-repeat.c'; else $(CYGPATH_W) '$(srcdir)/composite-integer-translate-over-repeat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Tpo $(DEPDIR)/cairo_test_suite-composite-integer-translate-over-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='composite-integer-translate-over-repeat.c' object='cairo_test_suite-composite-integer-translate-over-repeat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-composite-integer-translate-over-repeat.obj `if test -f 'composite-integer-translate-over-repeat.c'; then $(CYGPATH_W) 'composite-integer-translate-over-repeat.c'; else $(CYGPATH_W) '$(srcdir)/composite-integer-translate-over-repeat.c'; fi` + +cairo_test_suite-copy-disjoint.o: copy-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-copy-disjoint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-copy-disjoint.Tpo -c -o cairo_test_suite-copy-disjoint.o `test -f 'copy-disjoint.c' || echo '$(srcdir)/'`copy-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-copy-disjoint.Tpo $(DEPDIR)/cairo_test_suite-copy-disjoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='copy-disjoint.c' object='cairo_test_suite-copy-disjoint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-copy-disjoint.o `test -f 'copy-disjoint.c' || echo '$(srcdir)/'`copy-disjoint.c + +cairo_test_suite-copy-disjoint.obj: copy-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-copy-disjoint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-copy-disjoint.Tpo -c -o cairo_test_suite-copy-disjoint.obj `if test -f 'copy-disjoint.c'; then $(CYGPATH_W) 'copy-disjoint.c'; else $(CYGPATH_W) '$(srcdir)/copy-disjoint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-copy-disjoint.Tpo $(DEPDIR)/cairo_test_suite-copy-disjoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='copy-disjoint.c' object='cairo_test_suite-copy-disjoint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-copy-disjoint.obj `if test -f 'copy-disjoint.c'; then $(CYGPATH_W) 'copy-disjoint.c'; else $(CYGPATH_W) '$(srcdir)/copy-disjoint.c'; fi` + +cairo_test_suite-copy-path.o: copy-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-copy-path.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-copy-path.Tpo -c -o cairo_test_suite-copy-path.o `test -f 'copy-path.c' || echo '$(srcdir)/'`copy-path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-copy-path.Tpo $(DEPDIR)/cairo_test_suite-copy-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='copy-path.c' object='cairo_test_suite-copy-path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-copy-path.o `test -f 'copy-path.c' || echo '$(srcdir)/'`copy-path.c + +cairo_test_suite-copy-path.obj: copy-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-copy-path.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-copy-path.Tpo -c -o cairo_test_suite-copy-path.obj `if test -f 'copy-path.c'; then $(CYGPATH_W) 'copy-path.c'; else $(CYGPATH_W) '$(srcdir)/copy-path.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-copy-path.Tpo $(DEPDIR)/cairo_test_suite-copy-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='copy-path.c' object='cairo_test_suite-copy-path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-copy-path.obj `if test -f 'copy-path.c'; then $(CYGPATH_W) 'copy-path.c'; else $(CYGPATH_W) '$(srcdir)/copy-path.c'; fi` + +cairo_test_suite-coverage.o: coverage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-coverage.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-coverage.Tpo -c -o cairo_test_suite-coverage.o `test -f 'coverage.c' || echo '$(srcdir)/'`coverage.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-coverage.Tpo $(DEPDIR)/cairo_test_suite-coverage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coverage.c' object='cairo_test_suite-coverage.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-coverage.o `test -f 'coverage.c' || echo '$(srcdir)/'`coverage.c + +cairo_test_suite-coverage.obj: coverage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-coverage.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-coverage.Tpo -c -o cairo_test_suite-coverage.obj `if test -f 'coverage.c'; then $(CYGPATH_W) 'coverage.c'; else $(CYGPATH_W) '$(srcdir)/coverage.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-coverage.Tpo $(DEPDIR)/cairo_test_suite-coverage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='coverage.c' object='cairo_test_suite-coverage.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-coverage.obj `if test -f 'coverage.c'; then $(CYGPATH_W) 'coverage.c'; else $(CYGPATH_W) '$(srcdir)/coverage.c'; fi` + +cairo_test_suite-create-for-stream.o: create-for-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-create-for-stream.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-create-for-stream.Tpo -c -o cairo_test_suite-create-for-stream.o `test -f 'create-for-stream.c' || echo '$(srcdir)/'`create-for-stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-create-for-stream.Tpo $(DEPDIR)/cairo_test_suite-create-for-stream.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create-for-stream.c' object='cairo_test_suite-create-for-stream.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-create-for-stream.o `test -f 'create-for-stream.c' || echo '$(srcdir)/'`create-for-stream.c + +cairo_test_suite-create-for-stream.obj: create-for-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-create-for-stream.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-create-for-stream.Tpo -c -o cairo_test_suite-create-for-stream.obj `if test -f 'create-for-stream.c'; then $(CYGPATH_W) 'create-for-stream.c'; else $(CYGPATH_W) '$(srcdir)/create-for-stream.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-create-for-stream.Tpo $(DEPDIR)/cairo_test_suite-create-for-stream.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create-for-stream.c' object='cairo_test_suite-create-for-stream.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-create-for-stream.obj `if test -f 'create-for-stream.c'; then $(CYGPATH_W) 'create-for-stream.c'; else $(CYGPATH_W) '$(srcdir)/create-for-stream.c'; fi` + +cairo_test_suite-create-from-png.o: create-from-png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-create-from-png.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-create-from-png.Tpo -c -o cairo_test_suite-create-from-png.o `test -f 'create-from-png.c' || echo '$(srcdir)/'`create-from-png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-create-from-png.Tpo $(DEPDIR)/cairo_test_suite-create-from-png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create-from-png.c' object='cairo_test_suite-create-from-png.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-create-from-png.o `test -f 'create-from-png.c' || echo '$(srcdir)/'`create-from-png.c + +cairo_test_suite-create-from-png.obj: create-from-png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-create-from-png.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-create-from-png.Tpo -c -o cairo_test_suite-create-from-png.obj `if test -f 'create-from-png.c'; then $(CYGPATH_W) 'create-from-png.c'; else $(CYGPATH_W) '$(srcdir)/create-from-png.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-create-from-png.Tpo $(DEPDIR)/cairo_test_suite-create-from-png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create-from-png.c' object='cairo_test_suite-create-from-png.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-create-from-png.obj `if test -f 'create-from-png.c'; then $(CYGPATH_W) 'create-from-png.c'; else $(CYGPATH_W) '$(srcdir)/create-from-png.c'; fi` + +cairo_test_suite-create-from-png-stream.o: create-from-png-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-create-from-png-stream.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-create-from-png-stream.Tpo -c -o cairo_test_suite-create-from-png-stream.o `test -f 'create-from-png-stream.c' || echo '$(srcdir)/'`create-from-png-stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-create-from-png-stream.Tpo $(DEPDIR)/cairo_test_suite-create-from-png-stream.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create-from-png-stream.c' object='cairo_test_suite-create-from-png-stream.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-create-from-png-stream.o `test -f 'create-from-png-stream.c' || echo '$(srcdir)/'`create-from-png-stream.c + +cairo_test_suite-create-from-png-stream.obj: create-from-png-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-create-from-png-stream.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-create-from-png-stream.Tpo -c -o cairo_test_suite-create-from-png-stream.obj `if test -f 'create-from-png-stream.c'; then $(CYGPATH_W) 'create-from-png-stream.c'; else $(CYGPATH_W) '$(srcdir)/create-from-png-stream.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-create-from-png-stream.Tpo $(DEPDIR)/cairo_test_suite-create-from-png-stream.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create-from-png-stream.c' object='cairo_test_suite-create-from-png-stream.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-create-from-png-stream.obj `if test -f 'create-from-png-stream.c'; then $(CYGPATH_W) 'create-from-png-stream.c'; else $(CYGPATH_W) '$(srcdir)/create-from-png-stream.c'; fi` + +cairo_test_suite-culled-glyphs.o: culled-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-culled-glyphs.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-culled-glyphs.Tpo -c -o cairo_test_suite-culled-glyphs.o `test -f 'culled-glyphs.c' || echo '$(srcdir)/'`culled-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-culled-glyphs.Tpo $(DEPDIR)/cairo_test_suite-culled-glyphs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='culled-glyphs.c' object='cairo_test_suite-culled-glyphs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-culled-glyphs.o `test -f 'culled-glyphs.c' || echo '$(srcdir)/'`culled-glyphs.c + +cairo_test_suite-culled-glyphs.obj: culled-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-culled-glyphs.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-culled-glyphs.Tpo -c -o cairo_test_suite-culled-glyphs.obj `if test -f 'culled-glyphs.c'; then $(CYGPATH_W) 'culled-glyphs.c'; else $(CYGPATH_W) '$(srcdir)/culled-glyphs.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-culled-glyphs.Tpo $(DEPDIR)/cairo_test_suite-culled-glyphs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='culled-glyphs.c' object='cairo_test_suite-culled-glyphs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-culled-glyphs.obj `if test -f 'culled-glyphs.c'; then $(CYGPATH_W) 'culled-glyphs.c'; else $(CYGPATH_W) '$(srcdir)/culled-glyphs.c'; fi` + +cairo_test_suite-curve-to-as-line-to.o: curve-to-as-line-to.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-curve-to-as-line-to.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Tpo -c -o cairo_test_suite-curve-to-as-line-to.o `test -f 'curve-to-as-line-to.c' || echo '$(srcdir)/'`curve-to-as-line-to.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Tpo $(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curve-to-as-line-to.c' object='cairo_test_suite-curve-to-as-line-to.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-curve-to-as-line-to.o `test -f 'curve-to-as-line-to.c' || echo '$(srcdir)/'`curve-to-as-line-to.c + +cairo_test_suite-curve-to-as-line-to.obj: curve-to-as-line-to.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-curve-to-as-line-to.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Tpo -c -o cairo_test_suite-curve-to-as-line-to.obj `if test -f 'curve-to-as-line-to.c'; then $(CYGPATH_W) 'curve-to-as-line-to.c'; else $(CYGPATH_W) '$(srcdir)/curve-to-as-line-to.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Tpo $(DEPDIR)/cairo_test_suite-curve-to-as-line-to.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='curve-to-as-line-to.c' object='cairo_test_suite-curve-to-as-line-to.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-curve-to-as-line-to.obj `if test -f 'curve-to-as-line-to.c'; then $(CYGPATH_W) 'curve-to-as-line-to.c'; else $(CYGPATH_W) '$(srcdir)/curve-to-as-line-to.c'; fi` + +cairo_test_suite-dash-caps-joins.o: dash-caps-joins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-caps-joins.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-caps-joins.Tpo -c -o cairo_test_suite-dash-caps-joins.o `test -f 'dash-caps-joins.c' || echo '$(srcdir)/'`dash-caps-joins.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-caps-joins.Tpo $(DEPDIR)/cairo_test_suite-dash-caps-joins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-caps-joins.c' object='cairo_test_suite-dash-caps-joins.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-caps-joins.o `test -f 'dash-caps-joins.c' || echo '$(srcdir)/'`dash-caps-joins.c + +cairo_test_suite-dash-caps-joins.obj: dash-caps-joins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-caps-joins.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-caps-joins.Tpo -c -o cairo_test_suite-dash-caps-joins.obj `if test -f 'dash-caps-joins.c'; then $(CYGPATH_W) 'dash-caps-joins.c'; else $(CYGPATH_W) '$(srcdir)/dash-caps-joins.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-caps-joins.Tpo $(DEPDIR)/cairo_test_suite-dash-caps-joins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-caps-joins.c' object='cairo_test_suite-dash-caps-joins.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-caps-joins.obj `if test -f 'dash-caps-joins.c'; then $(CYGPATH_W) 'dash-caps-joins.c'; else $(CYGPATH_W) '$(srcdir)/dash-caps-joins.c'; fi` + +cairo_test_suite-dash-curve.o: dash-curve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-curve.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-curve.Tpo -c -o cairo_test_suite-dash-curve.o `test -f 'dash-curve.c' || echo '$(srcdir)/'`dash-curve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-curve.Tpo $(DEPDIR)/cairo_test_suite-dash-curve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-curve.c' object='cairo_test_suite-dash-curve.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-curve.o `test -f 'dash-curve.c' || echo '$(srcdir)/'`dash-curve.c + +cairo_test_suite-dash-curve.obj: dash-curve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-curve.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-curve.Tpo -c -o cairo_test_suite-dash-curve.obj `if test -f 'dash-curve.c'; then $(CYGPATH_W) 'dash-curve.c'; else $(CYGPATH_W) '$(srcdir)/dash-curve.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-curve.Tpo $(DEPDIR)/cairo_test_suite-dash-curve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-curve.c' object='cairo_test_suite-dash-curve.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-curve.obj `if test -f 'dash-curve.c'; then $(CYGPATH_W) 'dash-curve.c'; else $(CYGPATH_W) '$(srcdir)/dash-curve.c'; fi` + +cairo_test_suite-dash-infinite-loop.o: dash-infinite-loop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-infinite-loop.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-infinite-loop.Tpo -c -o cairo_test_suite-dash-infinite-loop.o `test -f 'dash-infinite-loop.c' || echo '$(srcdir)/'`dash-infinite-loop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-infinite-loop.Tpo $(DEPDIR)/cairo_test_suite-dash-infinite-loop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-infinite-loop.c' object='cairo_test_suite-dash-infinite-loop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-infinite-loop.o `test -f 'dash-infinite-loop.c' || echo '$(srcdir)/'`dash-infinite-loop.c + +cairo_test_suite-dash-infinite-loop.obj: dash-infinite-loop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-infinite-loop.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-infinite-loop.Tpo -c -o cairo_test_suite-dash-infinite-loop.obj `if test -f 'dash-infinite-loop.c'; then $(CYGPATH_W) 'dash-infinite-loop.c'; else $(CYGPATH_W) '$(srcdir)/dash-infinite-loop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-infinite-loop.Tpo $(DEPDIR)/cairo_test_suite-dash-infinite-loop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-infinite-loop.c' object='cairo_test_suite-dash-infinite-loop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-infinite-loop.obj `if test -f 'dash-infinite-loop.c'; then $(CYGPATH_W) 'dash-infinite-loop.c'; else $(CYGPATH_W) '$(srcdir)/dash-infinite-loop.c'; fi` + +cairo_test_suite-dash-no-dash.o: dash-no-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-no-dash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-no-dash.Tpo -c -o cairo_test_suite-dash-no-dash.o `test -f 'dash-no-dash.c' || echo '$(srcdir)/'`dash-no-dash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-no-dash.Tpo $(DEPDIR)/cairo_test_suite-dash-no-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-no-dash.c' object='cairo_test_suite-dash-no-dash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-no-dash.o `test -f 'dash-no-dash.c' || echo '$(srcdir)/'`dash-no-dash.c + +cairo_test_suite-dash-no-dash.obj: dash-no-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-no-dash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-no-dash.Tpo -c -o cairo_test_suite-dash-no-dash.obj `if test -f 'dash-no-dash.c'; then $(CYGPATH_W) 'dash-no-dash.c'; else $(CYGPATH_W) '$(srcdir)/dash-no-dash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-no-dash.Tpo $(DEPDIR)/cairo_test_suite-dash-no-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-no-dash.c' object='cairo_test_suite-dash-no-dash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-no-dash.obj `if test -f 'dash-no-dash.c'; then $(CYGPATH_W) 'dash-no-dash.c'; else $(CYGPATH_W) '$(srcdir)/dash-no-dash.c'; fi` + +cairo_test_suite-dash-offset.o: dash-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-offset.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-offset.Tpo -c -o cairo_test_suite-dash-offset.o `test -f 'dash-offset.c' || echo '$(srcdir)/'`dash-offset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-offset.Tpo $(DEPDIR)/cairo_test_suite-dash-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-offset.c' object='cairo_test_suite-dash-offset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-offset.o `test -f 'dash-offset.c' || echo '$(srcdir)/'`dash-offset.c + +cairo_test_suite-dash-offset.obj: dash-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-offset.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-offset.Tpo -c -o cairo_test_suite-dash-offset.obj `if test -f 'dash-offset.c'; then $(CYGPATH_W) 'dash-offset.c'; else $(CYGPATH_W) '$(srcdir)/dash-offset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-offset.Tpo $(DEPDIR)/cairo_test_suite-dash-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-offset.c' object='cairo_test_suite-dash-offset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-offset.obj `if test -f 'dash-offset.c'; then $(CYGPATH_W) 'dash-offset.c'; else $(CYGPATH_W) '$(srcdir)/dash-offset.c'; fi` + +cairo_test_suite-dash-offset-negative.o: dash-offset-negative.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-offset-negative.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-offset-negative.Tpo -c -o cairo_test_suite-dash-offset-negative.o `test -f 'dash-offset-negative.c' || echo '$(srcdir)/'`dash-offset-negative.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-offset-negative.Tpo $(DEPDIR)/cairo_test_suite-dash-offset-negative.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-offset-negative.c' object='cairo_test_suite-dash-offset-negative.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-offset-negative.o `test -f 'dash-offset-negative.c' || echo '$(srcdir)/'`dash-offset-negative.c + +cairo_test_suite-dash-offset-negative.obj: dash-offset-negative.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-offset-negative.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-offset-negative.Tpo -c -o cairo_test_suite-dash-offset-negative.obj `if test -f 'dash-offset-negative.c'; then $(CYGPATH_W) 'dash-offset-negative.c'; else $(CYGPATH_W) '$(srcdir)/dash-offset-negative.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-offset-negative.Tpo $(DEPDIR)/cairo_test_suite-dash-offset-negative.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-offset-negative.c' object='cairo_test_suite-dash-offset-negative.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-offset-negative.obj `if test -f 'dash-offset-negative.c'; then $(CYGPATH_W) 'dash-offset-negative.c'; else $(CYGPATH_W) '$(srcdir)/dash-offset-negative.c'; fi` + +cairo_test_suite-dash-scale.o: dash-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-scale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-scale.Tpo -c -o cairo_test_suite-dash-scale.o `test -f 'dash-scale.c' || echo '$(srcdir)/'`dash-scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-scale.Tpo $(DEPDIR)/cairo_test_suite-dash-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-scale.c' object='cairo_test_suite-dash-scale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-scale.o `test -f 'dash-scale.c' || echo '$(srcdir)/'`dash-scale.c + +cairo_test_suite-dash-scale.obj: dash-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-scale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-scale.Tpo -c -o cairo_test_suite-dash-scale.obj `if test -f 'dash-scale.c'; then $(CYGPATH_W) 'dash-scale.c'; else $(CYGPATH_W) '$(srcdir)/dash-scale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-scale.Tpo $(DEPDIR)/cairo_test_suite-dash-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-scale.c' object='cairo_test_suite-dash-scale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-scale.obj `if test -f 'dash-scale.c'; then $(CYGPATH_W) 'dash-scale.c'; else $(CYGPATH_W) '$(srcdir)/dash-scale.c'; fi` + +cairo_test_suite-dash-state.o: dash-state.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-state.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-state.Tpo -c -o cairo_test_suite-dash-state.o `test -f 'dash-state.c' || echo '$(srcdir)/'`dash-state.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-state.Tpo $(DEPDIR)/cairo_test_suite-dash-state.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-state.c' object='cairo_test_suite-dash-state.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-state.o `test -f 'dash-state.c' || echo '$(srcdir)/'`dash-state.c + +cairo_test_suite-dash-state.obj: dash-state.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-state.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-state.Tpo -c -o cairo_test_suite-dash-state.obj `if test -f 'dash-state.c'; then $(CYGPATH_W) 'dash-state.c'; else $(CYGPATH_W) '$(srcdir)/dash-state.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-state.Tpo $(DEPDIR)/cairo_test_suite-dash-state.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-state.c' object='cairo_test_suite-dash-state.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-state.obj `if test -f 'dash-state.c'; then $(CYGPATH_W) 'dash-state.c'; else $(CYGPATH_W) '$(srcdir)/dash-state.c'; fi` + +cairo_test_suite-dash-zero-length.o: dash-zero-length.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-zero-length.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-zero-length.Tpo -c -o cairo_test_suite-dash-zero-length.o `test -f 'dash-zero-length.c' || echo '$(srcdir)/'`dash-zero-length.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-zero-length.Tpo $(DEPDIR)/cairo_test_suite-dash-zero-length.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-zero-length.c' object='cairo_test_suite-dash-zero-length.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-zero-length.o `test -f 'dash-zero-length.c' || echo '$(srcdir)/'`dash-zero-length.c + +cairo_test_suite-dash-zero-length.obj: dash-zero-length.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-dash-zero-length.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-dash-zero-length.Tpo -c -o cairo_test_suite-dash-zero-length.obj `if test -f 'dash-zero-length.c'; then $(CYGPATH_W) 'dash-zero-length.c'; else $(CYGPATH_W) '$(srcdir)/dash-zero-length.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-dash-zero-length.Tpo $(DEPDIR)/cairo_test_suite-dash-zero-length.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dash-zero-length.c' object='cairo_test_suite-dash-zero-length.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-dash-zero-length.obj `if test -f 'dash-zero-length.c'; then $(CYGPATH_W) 'dash-zero-length.c'; else $(CYGPATH_W) '$(srcdir)/dash-zero-length.c'; fi` + +cairo_test_suite-degenerate-arc.o: degenerate-arc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-arc.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-arc.Tpo -c -o cairo_test_suite-degenerate-arc.o `test -f 'degenerate-arc.c' || echo '$(srcdir)/'`degenerate-arc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-arc.Tpo $(DEPDIR)/cairo_test_suite-degenerate-arc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-arc.c' object='cairo_test_suite-degenerate-arc.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-arc.o `test -f 'degenerate-arc.c' || echo '$(srcdir)/'`degenerate-arc.c + +cairo_test_suite-degenerate-arc.obj: degenerate-arc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-arc.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-arc.Tpo -c -o cairo_test_suite-degenerate-arc.obj `if test -f 'degenerate-arc.c'; then $(CYGPATH_W) 'degenerate-arc.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-arc.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-arc.Tpo $(DEPDIR)/cairo_test_suite-degenerate-arc.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-arc.c' object='cairo_test_suite-degenerate-arc.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-arc.obj `if test -f 'degenerate-arc.c'; then $(CYGPATH_W) 'degenerate-arc.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-arc.c'; fi` + +cairo_test_suite-degenerate-arcs.o: degenerate-arcs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-arcs.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-arcs.Tpo -c -o cairo_test_suite-degenerate-arcs.o `test -f 'degenerate-arcs.c' || echo '$(srcdir)/'`degenerate-arcs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-arcs.Tpo $(DEPDIR)/cairo_test_suite-degenerate-arcs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-arcs.c' object='cairo_test_suite-degenerate-arcs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-arcs.o `test -f 'degenerate-arcs.c' || echo '$(srcdir)/'`degenerate-arcs.c + +cairo_test_suite-degenerate-arcs.obj: degenerate-arcs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-arcs.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-arcs.Tpo -c -o cairo_test_suite-degenerate-arcs.obj `if test -f 'degenerate-arcs.c'; then $(CYGPATH_W) 'degenerate-arcs.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-arcs.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-arcs.Tpo $(DEPDIR)/cairo_test_suite-degenerate-arcs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-arcs.c' object='cairo_test_suite-degenerate-arcs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-arcs.obj `if test -f 'degenerate-arcs.c'; then $(CYGPATH_W) 'degenerate-arcs.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-arcs.c'; fi` + +cairo_test_suite-degenerate-curve-to.o: degenerate-curve-to.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-curve-to.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-curve-to.Tpo -c -o cairo_test_suite-degenerate-curve-to.o `test -f 'degenerate-curve-to.c' || echo '$(srcdir)/'`degenerate-curve-to.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-curve-to.Tpo $(DEPDIR)/cairo_test_suite-degenerate-curve-to.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-curve-to.c' object='cairo_test_suite-degenerate-curve-to.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-curve-to.o `test -f 'degenerate-curve-to.c' || echo '$(srcdir)/'`degenerate-curve-to.c + +cairo_test_suite-degenerate-curve-to.obj: degenerate-curve-to.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-curve-to.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-curve-to.Tpo -c -o cairo_test_suite-degenerate-curve-to.obj `if test -f 'degenerate-curve-to.c'; then $(CYGPATH_W) 'degenerate-curve-to.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-curve-to.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-curve-to.Tpo $(DEPDIR)/cairo_test_suite-degenerate-curve-to.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-curve-to.c' object='cairo_test_suite-degenerate-curve-to.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-curve-to.obj `if test -f 'degenerate-curve-to.c'; then $(CYGPATH_W) 'degenerate-curve-to.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-curve-to.c'; fi` + +cairo_test_suite-degenerate-dash.o: degenerate-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-dash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-dash.Tpo -c -o cairo_test_suite-degenerate-dash.o `test -f 'degenerate-dash.c' || echo '$(srcdir)/'`degenerate-dash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-dash.Tpo $(DEPDIR)/cairo_test_suite-degenerate-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-dash.c' object='cairo_test_suite-degenerate-dash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-dash.o `test -f 'degenerate-dash.c' || echo '$(srcdir)/'`degenerate-dash.c + +cairo_test_suite-degenerate-dash.obj: degenerate-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-dash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-dash.Tpo -c -o cairo_test_suite-degenerate-dash.obj `if test -f 'degenerate-dash.c'; then $(CYGPATH_W) 'degenerate-dash.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-dash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-dash.Tpo $(DEPDIR)/cairo_test_suite-degenerate-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-dash.c' object='cairo_test_suite-degenerate-dash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-dash.obj `if test -f 'degenerate-dash.c'; then $(CYGPATH_W) 'degenerate-dash.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-dash.c'; fi` + +cairo_test_suite-degenerate-linear-gradient.o: degenerate-linear-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-linear-gradient.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Tpo -c -o cairo_test_suite-degenerate-linear-gradient.o `test -f 'degenerate-linear-gradient.c' || echo '$(srcdir)/'`degenerate-linear-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Tpo $(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-linear-gradient.c' object='cairo_test_suite-degenerate-linear-gradient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-linear-gradient.o `test -f 'degenerate-linear-gradient.c' || echo '$(srcdir)/'`degenerate-linear-gradient.c + +cairo_test_suite-degenerate-linear-gradient.obj: degenerate-linear-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-linear-gradient.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Tpo -c -o cairo_test_suite-degenerate-linear-gradient.obj `if test -f 'degenerate-linear-gradient.c'; then $(CYGPATH_W) 'degenerate-linear-gradient.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-linear-gradient.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Tpo $(DEPDIR)/cairo_test_suite-degenerate-linear-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-linear-gradient.c' object='cairo_test_suite-degenerate-linear-gradient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-linear-gradient.obj `if test -f 'degenerate-linear-gradient.c'; then $(CYGPATH_W) 'degenerate-linear-gradient.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-linear-gradient.c'; fi` + +cairo_test_suite-degenerate-path.o: degenerate-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-path.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-path.Tpo -c -o cairo_test_suite-degenerate-path.o `test -f 'degenerate-path.c' || echo '$(srcdir)/'`degenerate-path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-path.Tpo $(DEPDIR)/cairo_test_suite-degenerate-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-path.c' object='cairo_test_suite-degenerate-path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-path.o `test -f 'degenerate-path.c' || echo '$(srcdir)/'`degenerate-path.c + +cairo_test_suite-degenerate-path.obj: degenerate-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-path.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-path.Tpo -c -o cairo_test_suite-degenerate-path.obj `if test -f 'degenerate-path.c'; then $(CYGPATH_W) 'degenerate-path.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-path.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-path.Tpo $(DEPDIR)/cairo_test_suite-degenerate-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-path.c' object='cairo_test_suite-degenerate-path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-path.obj `if test -f 'degenerate-path.c'; then $(CYGPATH_W) 'degenerate-path.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-path.c'; fi` + +cairo_test_suite-degenerate-pen.o: degenerate-pen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-pen.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-pen.Tpo -c -o cairo_test_suite-degenerate-pen.o `test -f 'degenerate-pen.c' || echo '$(srcdir)/'`degenerate-pen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-pen.Tpo $(DEPDIR)/cairo_test_suite-degenerate-pen.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-pen.c' object='cairo_test_suite-degenerate-pen.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-pen.o `test -f 'degenerate-pen.c' || echo '$(srcdir)/'`degenerate-pen.c + +cairo_test_suite-degenerate-pen.obj: degenerate-pen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-pen.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-pen.Tpo -c -o cairo_test_suite-degenerate-pen.obj `if test -f 'degenerate-pen.c'; then $(CYGPATH_W) 'degenerate-pen.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-pen.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-pen.Tpo $(DEPDIR)/cairo_test_suite-degenerate-pen.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-pen.c' object='cairo_test_suite-degenerate-pen.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-pen.obj `if test -f 'degenerate-pen.c'; then $(CYGPATH_W) 'degenerate-pen.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-pen.c'; fi` + +cairo_test_suite-degenerate-radial-gradient.o: degenerate-radial-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-radial-gradient.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Tpo -c -o cairo_test_suite-degenerate-radial-gradient.o `test -f 'degenerate-radial-gradient.c' || echo '$(srcdir)/'`degenerate-radial-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Tpo $(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-radial-gradient.c' object='cairo_test_suite-degenerate-radial-gradient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-radial-gradient.o `test -f 'degenerate-radial-gradient.c' || echo '$(srcdir)/'`degenerate-radial-gradient.c + +cairo_test_suite-degenerate-radial-gradient.obj: degenerate-radial-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-radial-gradient.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Tpo -c -o cairo_test_suite-degenerate-radial-gradient.obj `if test -f 'degenerate-radial-gradient.c'; then $(CYGPATH_W) 'degenerate-radial-gradient.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-radial-gradient.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Tpo $(DEPDIR)/cairo_test_suite-degenerate-radial-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-radial-gradient.c' object='cairo_test_suite-degenerate-radial-gradient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-radial-gradient.obj `if test -f 'degenerate-radial-gradient.c'; then $(CYGPATH_W) 'degenerate-radial-gradient.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-radial-gradient.c'; fi` + +cairo_test_suite-degenerate-rel-curve-to.o: degenerate-rel-curve-to.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-rel-curve-to.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Tpo -c -o cairo_test_suite-degenerate-rel-curve-to.o `test -f 'degenerate-rel-curve-to.c' || echo '$(srcdir)/'`degenerate-rel-curve-to.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Tpo $(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-rel-curve-to.c' object='cairo_test_suite-degenerate-rel-curve-to.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-rel-curve-to.o `test -f 'degenerate-rel-curve-to.c' || echo '$(srcdir)/'`degenerate-rel-curve-to.c + +cairo_test_suite-degenerate-rel-curve-to.obj: degenerate-rel-curve-to.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-rel-curve-to.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Tpo -c -o cairo_test_suite-degenerate-rel-curve-to.obj `if test -f 'degenerate-rel-curve-to.c'; then $(CYGPATH_W) 'degenerate-rel-curve-to.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-rel-curve-to.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Tpo $(DEPDIR)/cairo_test_suite-degenerate-rel-curve-to.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-rel-curve-to.c' object='cairo_test_suite-degenerate-rel-curve-to.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-rel-curve-to.obj `if test -f 'degenerate-rel-curve-to.c'; then $(CYGPATH_W) 'degenerate-rel-curve-to.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-rel-curve-to.c'; fi` + +cairo_test_suite-degenerate-solid-dash.o: degenerate-solid-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-solid-dash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Tpo -c -o cairo_test_suite-degenerate-solid-dash.o `test -f 'degenerate-solid-dash.c' || echo '$(srcdir)/'`degenerate-solid-dash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Tpo $(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-solid-dash.c' object='cairo_test_suite-degenerate-solid-dash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-solid-dash.o `test -f 'degenerate-solid-dash.c' || echo '$(srcdir)/'`degenerate-solid-dash.c + +cairo_test_suite-degenerate-solid-dash.obj: degenerate-solid-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-degenerate-solid-dash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Tpo -c -o cairo_test_suite-degenerate-solid-dash.obj `if test -f 'degenerate-solid-dash.c'; then $(CYGPATH_W) 'degenerate-solid-dash.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-solid-dash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Tpo $(DEPDIR)/cairo_test_suite-degenerate-solid-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='degenerate-solid-dash.c' object='cairo_test_suite-degenerate-solid-dash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-degenerate-solid-dash.obj `if test -f 'degenerate-solid-dash.c'; then $(CYGPATH_W) 'degenerate-solid-dash.c'; else $(CYGPATH_W) '$(srcdir)/degenerate-solid-dash.c'; fi` + +cairo_test_suite-drunkard-tails.o: drunkard-tails.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-drunkard-tails.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-drunkard-tails.Tpo -c -o cairo_test_suite-drunkard-tails.o `test -f 'drunkard-tails.c' || echo '$(srcdir)/'`drunkard-tails.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-drunkard-tails.Tpo $(DEPDIR)/cairo_test_suite-drunkard-tails.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drunkard-tails.c' object='cairo_test_suite-drunkard-tails.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-drunkard-tails.o `test -f 'drunkard-tails.c' || echo '$(srcdir)/'`drunkard-tails.c + +cairo_test_suite-drunkard-tails.obj: drunkard-tails.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-drunkard-tails.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-drunkard-tails.Tpo -c -o cairo_test_suite-drunkard-tails.obj `if test -f 'drunkard-tails.c'; then $(CYGPATH_W) 'drunkard-tails.c'; else $(CYGPATH_W) '$(srcdir)/drunkard-tails.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-drunkard-tails.Tpo $(DEPDIR)/cairo_test_suite-drunkard-tails.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='drunkard-tails.c' object='cairo_test_suite-drunkard-tails.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-drunkard-tails.obj `if test -f 'drunkard-tails.c'; then $(CYGPATH_W) 'drunkard-tails.c'; else $(CYGPATH_W) '$(srcdir)/drunkard-tails.c'; fi` + +cairo_test_suite-device-offset.o: device-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset.Tpo -c -o cairo_test_suite-device-offset.o `test -f 'device-offset.c' || echo '$(srcdir)/'`device-offset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset.Tpo $(DEPDIR)/cairo_test_suite-device-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset.c' object='cairo_test_suite-device-offset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset.o `test -f 'device-offset.c' || echo '$(srcdir)/'`device-offset.c + +cairo_test_suite-device-offset.obj: device-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset.Tpo -c -o cairo_test_suite-device-offset.obj `if test -f 'device-offset.c'; then $(CYGPATH_W) 'device-offset.c'; else $(CYGPATH_W) '$(srcdir)/device-offset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset.Tpo $(DEPDIR)/cairo_test_suite-device-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset.c' object='cairo_test_suite-device-offset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset.obj `if test -f 'device-offset.c'; then $(CYGPATH_W) 'device-offset.c'; else $(CYGPATH_W) '$(srcdir)/device-offset.c'; fi` + +cairo_test_suite-device-offset-fractional.o: device-offset-fractional.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset-fractional.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset-fractional.Tpo -c -o cairo_test_suite-device-offset-fractional.o `test -f 'device-offset-fractional.c' || echo '$(srcdir)/'`device-offset-fractional.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset-fractional.Tpo $(DEPDIR)/cairo_test_suite-device-offset-fractional.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset-fractional.c' object='cairo_test_suite-device-offset-fractional.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset-fractional.o `test -f 'device-offset-fractional.c' || echo '$(srcdir)/'`device-offset-fractional.c + +cairo_test_suite-device-offset-fractional.obj: device-offset-fractional.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset-fractional.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset-fractional.Tpo -c -o cairo_test_suite-device-offset-fractional.obj `if test -f 'device-offset-fractional.c'; then $(CYGPATH_W) 'device-offset-fractional.c'; else $(CYGPATH_W) '$(srcdir)/device-offset-fractional.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset-fractional.Tpo $(DEPDIR)/cairo_test_suite-device-offset-fractional.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset-fractional.c' object='cairo_test_suite-device-offset-fractional.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset-fractional.obj `if test -f 'device-offset-fractional.c'; then $(CYGPATH_W) 'device-offset-fractional.c'; else $(CYGPATH_W) '$(srcdir)/device-offset-fractional.c'; fi` + +cairo_test_suite-device-offset-positive.o: device-offset-positive.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset-positive.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset-positive.Tpo -c -o cairo_test_suite-device-offset-positive.o `test -f 'device-offset-positive.c' || echo '$(srcdir)/'`device-offset-positive.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset-positive.Tpo $(DEPDIR)/cairo_test_suite-device-offset-positive.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset-positive.c' object='cairo_test_suite-device-offset-positive.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset-positive.o `test -f 'device-offset-positive.c' || echo '$(srcdir)/'`device-offset-positive.c + +cairo_test_suite-device-offset-positive.obj: device-offset-positive.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset-positive.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset-positive.Tpo -c -o cairo_test_suite-device-offset-positive.obj `if test -f 'device-offset-positive.c'; then $(CYGPATH_W) 'device-offset-positive.c'; else $(CYGPATH_W) '$(srcdir)/device-offset-positive.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset-positive.Tpo $(DEPDIR)/cairo_test_suite-device-offset-positive.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset-positive.c' object='cairo_test_suite-device-offset-positive.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset-positive.obj `if test -f 'device-offset-positive.c'; then $(CYGPATH_W) 'device-offset-positive.c'; else $(CYGPATH_W) '$(srcdir)/device-offset-positive.c'; fi` + +cairo_test_suite-device-offset-scale.o: device-offset-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset-scale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset-scale.Tpo -c -o cairo_test_suite-device-offset-scale.o `test -f 'device-offset-scale.c' || echo '$(srcdir)/'`device-offset-scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset-scale.Tpo $(DEPDIR)/cairo_test_suite-device-offset-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset-scale.c' object='cairo_test_suite-device-offset-scale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset-scale.o `test -f 'device-offset-scale.c' || echo '$(srcdir)/'`device-offset-scale.c + +cairo_test_suite-device-offset-scale.obj: device-offset-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-device-offset-scale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-device-offset-scale.Tpo -c -o cairo_test_suite-device-offset-scale.obj `if test -f 'device-offset-scale.c'; then $(CYGPATH_W) 'device-offset-scale.c'; else $(CYGPATH_W) '$(srcdir)/device-offset-scale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-device-offset-scale.Tpo $(DEPDIR)/cairo_test_suite-device-offset-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='device-offset-scale.c' object='cairo_test_suite-device-offset-scale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-device-offset-scale.obj `if test -f 'device-offset-scale.c'; then $(CYGPATH_W) 'device-offset-scale.c'; else $(CYGPATH_W) '$(srcdir)/device-offset-scale.c'; fi` + +cairo_test_suite-error-setters.o: error-setters.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-error-setters.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-error-setters.Tpo -c -o cairo_test_suite-error-setters.o `test -f 'error-setters.c' || echo '$(srcdir)/'`error-setters.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-error-setters.Tpo $(DEPDIR)/cairo_test_suite-error-setters.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error-setters.c' object='cairo_test_suite-error-setters.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-error-setters.o `test -f 'error-setters.c' || echo '$(srcdir)/'`error-setters.c + +cairo_test_suite-error-setters.obj: error-setters.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-error-setters.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-error-setters.Tpo -c -o cairo_test_suite-error-setters.obj `if test -f 'error-setters.c'; then $(CYGPATH_W) 'error-setters.c'; else $(CYGPATH_W) '$(srcdir)/error-setters.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-error-setters.Tpo $(DEPDIR)/cairo_test_suite-error-setters.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error-setters.c' object='cairo_test_suite-error-setters.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-error-setters.obj `if test -f 'error-setters.c'; then $(CYGPATH_W) 'error-setters.c'; else $(CYGPATH_W) '$(srcdir)/error-setters.c'; fi` + +cairo_test_suite-extend-pad.o: extend-pad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-pad.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-pad.Tpo -c -o cairo_test_suite-extend-pad.o `test -f 'extend-pad.c' || echo '$(srcdir)/'`extend-pad.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-pad.Tpo $(DEPDIR)/cairo_test_suite-extend-pad.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-pad.c' object='cairo_test_suite-extend-pad.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-pad.o `test -f 'extend-pad.c' || echo '$(srcdir)/'`extend-pad.c + +cairo_test_suite-extend-pad.obj: extend-pad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-pad.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-pad.Tpo -c -o cairo_test_suite-extend-pad.obj `if test -f 'extend-pad.c'; then $(CYGPATH_W) 'extend-pad.c'; else $(CYGPATH_W) '$(srcdir)/extend-pad.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-pad.Tpo $(DEPDIR)/cairo_test_suite-extend-pad.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-pad.c' object='cairo_test_suite-extend-pad.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-pad.obj `if test -f 'extend-pad.c'; then $(CYGPATH_W) 'extend-pad.c'; else $(CYGPATH_W) '$(srcdir)/extend-pad.c'; fi` + +cairo_test_suite-extend-pad-border.o: extend-pad-border.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-pad-border.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-pad-border.Tpo -c -o cairo_test_suite-extend-pad-border.o `test -f 'extend-pad-border.c' || echo '$(srcdir)/'`extend-pad-border.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-pad-border.Tpo $(DEPDIR)/cairo_test_suite-extend-pad-border.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-pad-border.c' object='cairo_test_suite-extend-pad-border.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-pad-border.o `test -f 'extend-pad-border.c' || echo '$(srcdir)/'`extend-pad-border.c + +cairo_test_suite-extend-pad-border.obj: extend-pad-border.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-pad-border.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-pad-border.Tpo -c -o cairo_test_suite-extend-pad-border.obj `if test -f 'extend-pad-border.c'; then $(CYGPATH_W) 'extend-pad-border.c'; else $(CYGPATH_W) '$(srcdir)/extend-pad-border.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-pad-border.Tpo $(DEPDIR)/cairo_test_suite-extend-pad-border.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-pad-border.c' object='cairo_test_suite-extend-pad-border.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-pad-border.obj `if test -f 'extend-pad-border.c'; then $(CYGPATH_W) 'extend-pad-border.c'; else $(CYGPATH_W) '$(srcdir)/extend-pad-border.c'; fi` + +cairo_test_suite-extend-pad-similar.o: extend-pad-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-pad-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-pad-similar.Tpo -c -o cairo_test_suite-extend-pad-similar.o `test -f 'extend-pad-similar.c' || echo '$(srcdir)/'`extend-pad-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-pad-similar.Tpo $(DEPDIR)/cairo_test_suite-extend-pad-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-pad-similar.c' object='cairo_test_suite-extend-pad-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-pad-similar.o `test -f 'extend-pad-similar.c' || echo '$(srcdir)/'`extend-pad-similar.c + +cairo_test_suite-extend-pad-similar.obj: extend-pad-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-pad-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-pad-similar.Tpo -c -o cairo_test_suite-extend-pad-similar.obj `if test -f 'extend-pad-similar.c'; then $(CYGPATH_W) 'extend-pad-similar.c'; else $(CYGPATH_W) '$(srcdir)/extend-pad-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-pad-similar.Tpo $(DEPDIR)/cairo_test_suite-extend-pad-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-pad-similar.c' object='cairo_test_suite-extend-pad-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-pad-similar.obj `if test -f 'extend-pad-similar.c'; then $(CYGPATH_W) 'extend-pad-similar.c'; else $(CYGPATH_W) '$(srcdir)/extend-pad-similar.c'; fi` + +cairo_test_suite-extend-reflect.o: extend-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-reflect.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-reflect.Tpo -c -o cairo_test_suite-extend-reflect.o `test -f 'extend-reflect.c' || echo '$(srcdir)/'`extend-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-reflect.Tpo $(DEPDIR)/cairo_test_suite-extend-reflect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-reflect.c' object='cairo_test_suite-extend-reflect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-reflect.o `test -f 'extend-reflect.c' || echo '$(srcdir)/'`extend-reflect.c + +cairo_test_suite-extend-reflect.obj: extend-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-reflect.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-reflect.Tpo -c -o cairo_test_suite-extend-reflect.obj `if test -f 'extend-reflect.c'; then $(CYGPATH_W) 'extend-reflect.c'; else $(CYGPATH_W) '$(srcdir)/extend-reflect.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-reflect.Tpo $(DEPDIR)/cairo_test_suite-extend-reflect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-reflect.c' object='cairo_test_suite-extend-reflect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-reflect.obj `if test -f 'extend-reflect.c'; then $(CYGPATH_W) 'extend-reflect.c'; else $(CYGPATH_W) '$(srcdir)/extend-reflect.c'; fi` + +cairo_test_suite-extend-reflect-similar.o: extend-reflect-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-reflect-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-reflect-similar.Tpo -c -o cairo_test_suite-extend-reflect-similar.o `test -f 'extend-reflect-similar.c' || echo '$(srcdir)/'`extend-reflect-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-reflect-similar.Tpo $(DEPDIR)/cairo_test_suite-extend-reflect-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-reflect-similar.c' object='cairo_test_suite-extend-reflect-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-reflect-similar.o `test -f 'extend-reflect-similar.c' || echo '$(srcdir)/'`extend-reflect-similar.c + +cairo_test_suite-extend-reflect-similar.obj: extend-reflect-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-reflect-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-reflect-similar.Tpo -c -o cairo_test_suite-extend-reflect-similar.obj `if test -f 'extend-reflect-similar.c'; then $(CYGPATH_W) 'extend-reflect-similar.c'; else $(CYGPATH_W) '$(srcdir)/extend-reflect-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-reflect-similar.Tpo $(DEPDIR)/cairo_test_suite-extend-reflect-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-reflect-similar.c' object='cairo_test_suite-extend-reflect-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-reflect-similar.obj `if test -f 'extend-reflect-similar.c'; then $(CYGPATH_W) 'extend-reflect-similar.c'; else $(CYGPATH_W) '$(srcdir)/extend-reflect-similar.c'; fi` + +cairo_test_suite-extend-repeat.o: extend-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-repeat.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-repeat.Tpo -c -o cairo_test_suite-extend-repeat.o `test -f 'extend-repeat.c' || echo '$(srcdir)/'`extend-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-repeat.Tpo $(DEPDIR)/cairo_test_suite-extend-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-repeat.c' object='cairo_test_suite-extend-repeat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-repeat.o `test -f 'extend-repeat.c' || echo '$(srcdir)/'`extend-repeat.c + +cairo_test_suite-extend-repeat.obj: extend-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-repeat.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-repeat.Tpo -c -o cairo_test_suite-extend-repeat.obj `if test -f 'extend-repeat.c'; then $(CYGPATH_W) 'extend-repeat.c'; else $(CYGPATH_W) '$(srcdir)/extend-repeat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-repeat.Tpo $(DEPDIR)/cairo_test_suite-extend-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-repeat.c' object='cairo_test_suite-extend-repeat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-repeat.obj `if test -f 'extend-repeat.c'; then $(CYGPATH_W) 'extend-repeat.c'; else $(CYGPATH_W) '$(srcdir)/extend-repeat.c'; fi` + +cairo_test_suite-extend-repeat-similar.o: extend-repeat-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-repeat-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-repeat-similar.Tpo -c -o cairo_test_suite-extend-repeat-similar.o `test -f 'extend-repeat-similar.c' || echo '$(srcdir)/'`extend-repeat-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-repeat-similar.Tpo $(DEPDIR)/cairo_test_suite-extend-repeat-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-repeat-similar.c' object='cairo_test_suite-extend-repeat-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-repeat-similar.o `test -f 'extend-repeat-similar.c' || echo '$(srcdir)/'`extend-repeat-similar.c + +cairo_test_suite-extend-repeat-similar.obj: extend-repeat-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extend-repeat-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extend-repeat-similar.Tpo -c -o cairo_test_suite-extend-repeat-similar.obj `if test -f 'extend-repeat-similar.c'; then $(CYGPATH_W) 'extend-repeat-similar.c'; else $(CYGPATH_W) '$(srcdir)/extend-repeat-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extend-repeat-similar.Tpo $(DEPDIR)/cairo_test_suite-extend-repeat-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extend-repeat-similar.c' object='cairo_test_suite-extend-repeat-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extend-repeat-similar.obj `if test -f 'extend-repeat-similar.c'; then $(CYGPATH_W) 'extend-repeat-similar.c'; else $(CYGPATH_W) '$(srcdir)/extend-repeat-similar.c'; fi` + +cairo_test_suite-extended-blend.o: extended-blend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extended-blend.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-extended-blend.Tpo -c -o cairo_test_suite-extended-blend.o `test -f 'extended-blend.c' || echo '$(srcdir)/'`extended-blend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extended-blend.Tpo $(DEPDIR)/cairo_test_suite-extended-blend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extended-blend.c' object='cairo_test_suite-extended-blend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extended-blend.o `test -f 'extended-blend.c' || echo '$(srcdir)/'`extended-blend.c + +cairo_test_suite-extended-blend.obj: extended-blend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-extended-blend.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-extended-blend.Tpo -c -o cairo_test_suite-extended-blend.obj `if test -f 'extended-blend.c'; then $(CYGPATH_W) 'extended-blend.c'; else $(CYGPATH_W) '$(srcdir)/extended-blend.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-extended-blend.Tpo $(DEPDIR)/cairo_test_suite-extended-blend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extended-blend.c' object='cairo_test_suite-extended-blend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-extended-blend.obj `if test -f 'extended-blend.c'; then $(CYGPATH_W) 'extended-blend.c'; else $(CYGPATH_W) '$(srcdir)/extended-blend.c'; fi` + +cairo_test_suite-fallback.o: fallback.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fallback.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fallback.Tpo -c -o cairo_test_suite-fallback.o `test -f 'fallback.c' || echo '$(srcdir)/'`fallback.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fallback.Tpo $(DEPDIR)/cairo_test_suite-fallback.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fallback.c' object='cairo_test_suite-fallback.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fallback.o `test -f 'fallback.c' || echo '$(srcdir)/'`fallback.c + +cairo_test_suite-fallback.obj: fallback.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fallback.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fallback.Tpo -c -o cairo_test_suite-fallback.obj `if test -f 'fallback.c'; then $(CYGPATH_W) 'fallback.c'; else $(CYGPATH_W) '$(srcdir)/fallback.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fallback.Tpo $(DEPDIR)/cairo_test_suite-fallback.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fallback.c' object='cairo_test_suite-fallback.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fallback.obj `if test -f 'fallback.c'; then $(CYGPATH_W) 'fallback.c'; else $(CYGPATH_W) '$(srcdir)/fallback.c'; fi` + +cairo_test_suite-fill-alpha.o: fill-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-alpha.Tpo -c -o cairo_test_suite-fill-alpha.o `test -f 'fill-alpha.c' || echo '$(srcdir)/'`fill-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-alpha.Tpo $(DEPDIR)/cairo_test_suite-fill-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-alpha.c' object='cairo_test_suite-fill-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-alpha.o `test -f 'fill-alpha.c' || echo '$(srcdir)/'`fill-alpha.c + +cairo_test_suite-fill-alpha.obj: fill-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-alpha.Tpo -c -o cairo_test_suite-fill-alpha.obj `if test -f 'fill-alpha.c'; then $(CYGPATH_W) 'fill-alpha.c'; else $(CYGPATH_W) '$(srcdir)/fill-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-alpha.Tpo $(DEPDIR)/cairo_test_suite-fill-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-alpha.c' object='cairo_test_suite-fill-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-alpha.obj `if test -f 'fill-alpha.c'; then $(CYGPATH_W) 'fill-alpha.c'; else $(CYGPATH_W) '$(srcdir)/fill-alpha.c'; fi` + +cairo_test_suite-fill-alpha-pattern.o: fill-alpha-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-alpha-pattern.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Tpo -c -o cairo_test_suite-fill-alpha-pattern.o `test -f 'fill-alpha-pattern.c' || echo '$(srcdir)/'`fill-alpha-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Tpo $(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-alpha-pattern.c' object='cairo_test_suite-fill-alpha-pattern.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-alpha-pattern.o `test -f 'fill-alpha-pattern.c' || echo '$(srcdir)/'`fill-alpha-pattern.c + +cairo_test_suite-fill-alpha-pattern.obj: fill-alpha-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-alpha-pattern.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Tpo -c -o cairo_test_suite-fill-alpha-pattern.obj `if test -f 'fill-alpha-pattern.c'; then $(CYGPATH_W) 'fill-alpha-pattern.c'; else $(CYGPATH_W) '$(srcdir)/fill-alpha-pattern.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Tpo $(DEPDIR)/cairo_test_suite-fill-alpha-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-alpha-pattern.c' object='cairo_test_suite-fill-alpha-pattern.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-alpha-pattern.obj `if test -f 'fill-alpha-pattern.c'; then $(CYGPATH_W) 'fill-alpha-pattern.c'; else $(CYGPATH_W) '$(srcdir)/fill-alpha-pattern.c'; fi` + +cairo_test_suite-fill-and-stroke.o: fill-and-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-and-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-and-stroke.Tpo -c -o cairo_test_suite-fill-and-stroke.o `test -f 'fill-and-stroke.c' || echo '$(srcdir)/'`fill-and-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-and-stroke.Tpo $(DEPDIR)/cairo_test_suite-fill-and-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-and-stroke.c' object='cairo_test_suite-fill-and-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-and-stroke.o `test -f 'fill-and-stroke.c' || echo '$(srcdir)/'`fill-and-stroke.c + +cairo_test_suite-fill-and-stroke.obj: fill-and-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-and-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-and-stroke.Tpo -c -o cairo_test_suite-fill-and-stroke.obj `if test -f 'fill-and-stroke.c'; then $(CYGPATH_W) 'fill-and-stroke.c'; else $(CYGPATH_W) '$(srcdir)/fill-and-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-and-stroke.Tpo $(DEPDIR)/cairo_test_suite-fill-and-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-and-stroke.c' object='cairo_test_suite-fill-and-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-and-stroke.obj `if test -f 'fill-and-stroke.c'; then $(CYGPATH_W) 'fill-and-stroke.c'; else $(CYGPATH_W) '$(srcdir)/fill-and-stroke.c'; fi` + +cairo_test_suite-fill-and-stroke-alpha.o: fill-and-stroke-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-and-stroke-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Tpo -c -o cairo_test_suite-fill-and-stroke-alpha.o `test -f 'fill-and-stroke-alpha.c' || echo '$(srcdir)/'`fill-and-stroke-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Tpo $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-and-stroke-alpha.c' object='cairo_test_suite-fill-and-stroke-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-and-stroke-alpha.o `test -f 'fill-and-stroke-alpha.c' || echo '$(srcdir)/'`fill-and-stroke-alpha.c + +cairo_test_suite-fill-and-stroke-alpha.obj: fill-and-stroke-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-and-stroke-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Tpo -c -o cairo_test_suite-fill-and-stroke-alpha.obj `if test -f 'fill-and-stroke-alpha.c'; then $(CYGPATH_W) 'fill-and-stroke-alpha.c'; else $(CYGPATH_W) '$(srcdir)/fill-and-stroke-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Tpo $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-and-stroke-alpha.c' object='cairo_test_suite-fill-and-stroke-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-and-stroke-alpha.obj `if test -f 'fill-and-stroke-alpha.c'; then $(CYGPATH_W) 'fill-and-stroke-alpha.c'; else $(CYGPATH_W) '$(srcdir)/fill-and-stroke-alpha.c'; fi` + +cairo_test_suite-fill-and-stroke-alpha-add.o: fill-and-stroke-alpha-add.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-and-stroke-alpha-add.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Tpo -c -o cairo_test_suite-fill-and-stroke-alpha-add.o `test -f 'fill-and-stroke-alpha-add.c' || echo '$(srcdir)/'`fill-and-stroke-alpha-add.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Tpo $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-and-stroke-alpha-add.c' object='cairo_test_suite-fill-and-stroke-alpha-add.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-and-stroke-alpha-add.o `test -f 'fill-and-stroke-alpha-add.c' || echo '$(srcdir)/'`fill-and-stroke-alpha-add.c + +cairo_test_suite-fill-and-stroke-alpha-add.obj: fill-and-stroke-alpha-add.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-and-stroke-alpha-add.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Tpo -c -o cairo_test_suite-fill-and-stroke-alpha-add.obj `if test -f 'fill-and-stroke-alpha-add.c'; then $(CYGPATH_W) 'fill-and-stroke-alpha-add.c'; else $(CYGPATH_W) '$(srcdir)/fill-and-stroke-alpha-add.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Tpo $(DEPDIR)/cairo_test_suite-fill-and-stroke-alpha-add.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-and-stroke-alpha-add.c' object='cairo_test_suite-fill-and-stroke-alpha-add.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-and-stroke-alpha-add.obj `if test -f 'fill-and-stroke-alpha-add.c'; then $(CYGPATH_W) 'fill-and-stroke-alpha-add.c'; else $(CYGPATH_W) '$(srcdir)/fill-and-stroke-alpha-add.c'; fi` + +cairo_test_suite-fill-degenerate-sort-order.o: fill-degenerate-sort-order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-degenerate-sort-order.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Tpo -c -o cairo_test_suite-fill-degenerate-sort-order.o `test -f 'fill-degenerate-sort-order.c' || echo '$(srcdir)/'`fill-degenerate-sort-order.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Tpo $(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-degenerate-sort-order.c' object='cairo_test_suite-fill-degenerate-sort-order.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-degenerate-sort-order.o `test -f 'fill-degenerate-sort-order.c' || echo '$(srcdir)/'`fill-degenerate-sort-order.c + +cairo_test_suite-fill-degenerate-sort-order.obj: fill-degenerate-sort-order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-degenerate-sort-order.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Tpo -c -o cairo_test_suite-fill-degenerate-sort-order.obj `if test -f 'fill-degenerate-sort-order.c'; then $(CYGPATH_W) 'fill-degenerate-sort-order.c'; else $(CYGPATH_W) '$(srcdir)/fill-degenerate-sort-order.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Tpo $(DEPDIR)/cairo_test_suite-fill-degenerate-sort-order.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-degenerate-sort-order.c' object='cairo_test_suite-fill-degenerate-sort-order.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-degenerate-sort-order.obj `if test -f 'fill-degenerate-sort-order.c'; then $(CYGPATH_W) 'fill-degenerate-sort-order.c'; else $(CYGPATH_W) '$(srcdir)/fill-degenerate-sort-order.c'; fi` + +cairo_test_suite-fill-disjoint.o: fill-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-disjoint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-disjoint.Tpo -c -o cairo_test_suite-fill-disjoint.o `test -f 'fill-disjoint.c' || echo '$(srcdir)/'`fill-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-disjoint.Tpo $(DEPDIR)/cairo_test_suite-fill-disjoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-disjoint.c' object='cairo_test_suite-fill-disjoint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-disjoint.o `test -f 'fill-disjoint.c' || echo '$(srcdir)/'`fill-disjoint.c + +cairo_test_suite-fill-disjoint.obj: fill-disjoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-disjoint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-disjoint.Tpo -c -o cairo_test_suite-fill-disjoint.obj `if test -f 'fill-disjoint.c'; then $(CYGPATH_W) 'fill-disjoint.c'; else $(CYGPATH_W) '$(srcdir)/fill-disjoint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-disjoint.Tpo $(DEPDIR)/cairo_test_suite-fill-disjoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-disjoint.c' object='cairo_test_suite-fill-disjoint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-disjoint.obj `if test -f 'fill-disjoint.c'; then $(CYGPATH_W) 'fill-disjoint.c'; else $(CYGPATH_W) '$(srcdir)/fill-disjoint.c'; fi` + +cairo_test_suite-fill-empty.o: fill-empty.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-empty.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-empty.Tpo -c -o cairo_test_suite-fill-empty.o `test -f 'fill-empty.c' || echo '$(srcdir)/'`fill-empty.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-empty.Tpo $(DEPDIR)/cairo_test_suite-fill-empty.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-empty.c' object='cairo_test_suite-fill-empty.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-empty.o `test -f 'fill-empty.c' || echo '$(srcdir)/'`fill-empty.c + +cairo_test_suite-fill-empty.obj: fill-empty.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-empty.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-empty.Tpo -c -o cairo_test_suite-fill-empty.obj `if test -f 'fill-empty.c'; then $(CYGPATH_W) 'fill-empty.c'; else $(CYGPATH_W) '$(srcdir)/fill-empty.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-empty.Tpo $(DEPDIR)/cairo_test_suite-fill-empty.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-empty.c' object='cairo_test_suite-fill-empty.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-empty.obj `if test -f 'fill-empty.c'; then $(CYGPATH_W) 'fill-empty.c'; else $(CYGPATH_W) '$(srcdir)/fill-empty.c'; fi` + +cairo_test_suite-fill-image.o: fill-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-image.Tpo -c -o cairo_test_suite-fill-image.o `test -f 'fill-image.c' || echo '$(srcdir)/'`fill-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-image.Tpo $(DEPDIR)/cairo_test_suite-fill-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-image.c' object='cairo_test_suite-fill-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-image.o `test -f 'fill-image.c' || echo '$(srcdir)/'`fill-image.c + +cairo_test_suite-fill-image.obj: fill-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-image.Tpo -c -o cairo_test_suite-fill-image.obj `if test -f 'fill-image.c'; then $(CYGPATH_W) 'fill-image.c'; else $(CYGPATH_W) '$(srcdir)/fill-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-image.Tpo $(DEPDIR)/cairo_test_suite-fill-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-image.c' object='cairo_test_suite-fill-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-image.obj `if test -f 'fill-image.c'; then $(CYGPATH_W) 'fill-image.c'; else $(CYGPATH_W) '$(srcdir)/fill-image.c'; fi` + +cairo_test_suite-fill-missed-stop.o: fill-missed-stop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-missed-stop.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-missed-stop.Tpo -c -o cairo_test_suite-fill-missed-stop.o `test -f 'fill-missed-stop.c' || echo '$(srcdir)/'`fill-missed-stop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-missed-stop.Tpo $(DEPDIR)/cairo_test_suite-fill-missed-stop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-missed-stop.c' object='cairo_test_suite-fill-missed-stop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-missed-stop.o `test -f 'fill-missed-stop.c' || echo '$(srcdir)/'`fill-missed-stop.c + +cairo_test_suite-fill-missed-stop.obj: fill-missed-stop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-missed-stop.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-missed-stop.Tpo -c -o cairo_test_suite-fill-missed-stop.obj `if test -f 'fill-missed-stop.c'; then $(CYGPATH_W) 'fill-missed-stop.c'; else $(CYGPATH_W) '$(srcdir)/fill-missed-stop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-missed-stop.Tpo $(DEPDIR)/cairo_test_suite-fill-missed-stop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-missed-stop.c' object='cairo_test_suite-fill-missed-stop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-missed-stop.obj `if test -f 'fill-missed-stop.c'; then $(CYGPATH_W) 'fill-missed-stop.c'; else $(CYGPATH_W) '$(srcdir)/fill-missed-stop.c'; fi` + +cairo_test_suite-fill-rule.o: fill-rule.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-rule.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-rule.Tpo -c -o cairo_test_suite-fill-rule.o `test -f 'fill-rule.c' || echo '$(srcdir)/'`fill-rule.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-rule.Tpo $(DEPDIR)/cairo_test_suite-fill-rule.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-rule.c' object='cairo_test_suite-fill-rule.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-rule.o `test -f 'fill-rule.c' || echo '$(srcdir)/'`fill-rule.c + +cairo_test_suite-fill-rule.obj: fill-rule.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fill-rule.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fill-rule.Tpo -c -o cairo_test_suite-fill-rule.obj `if test -f 'fill-rule.c'; then $(CYGPATH_W) 'fill-rule.c'; else $(CYGPATH_W) '$(srcdir)/fill-rule.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fill-rule.Tpo $(DEPDIR)/cairo_test_suite-fill-rule.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fill-rule.c' object='cairo_test_suite-fill-rule.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fill-rule.obj `if test -f 'fill-rule.c'; then $(CYGPATH_W) 'fill-rule.c'; else $(CYGPATH_W) '$(srcdir)/fill-rule.c'; fi` + +cairo_test_suite-filter-bilinear-extents.o: filter-bilinear-extents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-filter-bilinear-extents.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Tpo -c -o cairo_test_suite-filter-bilinear-extents.o `test -f 'filter-bilinear-extents.c' || echo '$(srcdir)/'`filter-bilinear-extents.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Tpo $(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter-bilinear-extents.c' object='cairo_test_suite-filter-bilinear-extents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-filter-bilinear-extents.o `test -f 'filter-bilinear-extents.c' || echo '$(srcdir)/'`filter-bilinear-extents.c + +cairo_test_suite-filter-bilinear-extents.obj: filter-bilinear-extents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-filter-bilinear-extents.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Tpo -c -o cairo_test_suite-filter-bilinear-extents.obj `if test -f 'filter-bilinear-extents.c'; then $(CYGPATH_W) 'filter-bilinear-extents.c'; else $(CYGPATH_W) '$(srcdir)/filter-bilinear-extents.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Tpo $(DEPDIR)/cairo_test_suite-filter-bilinear-extents.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter-bilinear-extents.c' object='cairo_test_suite-filter-bilinear-extents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-filter-bilinear-extents.obj `if test -f 'filter-bilinear-extents.c'; then $(CYGPATH_W) 'filter-bilinear-extents.c'; else $(CYGPATH_W) '$(srcdir)/filter-bilinear-extents.c'; fi` + +cairo_test_suite-filter-nearest-offset.o: filter-nearest-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-filter-nearest-offset.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-filter-nearest-offset.Tpo -c -o cairo_test_suite-filter-nearest-offset.o `test -f 'filter-nearest-offset.c' || echo '$(srcdir)/'`filter-nearest-offset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-filter-nearest-offset.Tpo $(DEPDIR)/cairo_test_suite-filter-nearest-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter-nearest-offset.c' object='cairo_test_suite-filter-nearest-offset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-filter-nearest-offset.o `test -f 'filter-nearest-offset.c' || echo '$(srcdir)/'`filter-nearest-offset.c + +cairo_test_suite-filter-nearest-offset.obj: filter-nearest-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-filter-nearest-offset.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-filter-nearest-offset.Tpo -c -o cairo_test_suite-filter-nearest-offset.obj `if test -f 'filter-nearest-offset.c'; then $(CYGPATH_W) 'filter-nearest-offset.c'; else $(CYGPATH_W) '$(srcdir)/filter-nearest-offset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-filter-nearest-offset.Tpo $(DEPDIR)/cairo_test_suite-filter-nearest-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter-nearest-offset.c' object='cairo_test_suite-filter-nearest-offset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-filter-nearest-offset.obj `if test -f 'filter-nearest-offset.c'; then $(CYGPATH_W) 'filter-nearest-offset.c'; else $(CYGPATH_W) '$(srcdir)/filter-nearest-offset.c'; fi` + +cairo_test_suite-filter-nearest-transformed.o: filter-nearest-transformed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-filter-nearest-transformed.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Tpo -c -o cairo_test_suite-filter-nearest-transformed.o `test -f 'filter-nearest-transformed.c' || echo '$(srcdir)/'`filter-nearest-transformed.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Tpo $(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter-nearest-transformed.c' object='cairo_test_suite-filter-nearest-transformed.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-filter-nearest-transformed.o `test -f 'filter-nearest-transformed.c' || echo '$(srcdir)/'`filter-nearest-transformed.c + +cairo_test_suite-filter-nearest-transformed.obj: filter-nearest-transformed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-filter-nearest-transformed.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Tpo -c -o cairo_test_suite-filter-nearest-transformed.obj `if test -f 'filter-nearest-transformed.c'; then $(CYGPATH_W) 'filter-nearest-transformed.c'; else $(CYGPATH_W) '$(srcdir)/filter-nearest-transformed.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Tpo $(DEPDIR)/cairo_test_suite-filter-nearest-transformed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter-nearest-transformed.c' object='cairo_test_suite-filter-nearest-transformed.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-filter-nearest-transformed.obj `if test -f 'filter-nearest-transformed.c'; then $(CYGPATH_W) 'filter-nearest-transformed.c'; else $(CYGPATH_W) '$(srcdir)/filter-nearest-transformed.c'; fi` + +cairo_test_suite-finer-grained-fallbacks.o: finer-grained-fallbacks.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-finer-grained-fallbacks.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Tpo -c -o cairo_test_suite-finer-grained-fallbacks.o `test -f 'finer-grained-fallbacks.c' || echo '$(srcdir)/'`finer-grained-fallbacks.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Tpo $(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='finer-grained-fallbacks.c' object='cairo_test_suite-finer-grained-fallbacks.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-finer-grained-fallbacks.o `test -f 'finer-grained-fallbacks.c' || echo '$(srcdir)/'`finer-grained-fallbacks.c + +cairo_test_suite-finer-grained-fallbacks.obj: finer-grained-fallbacks.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-finer-grained-fallbacks.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Tpo -c -o cairo_test_suite-finer-grained-fallbacks.obj `if test -f 'finer-grained-fallbacks.c'; then $(CYGPATH_W) 'finer-grained-fallbacks.c'; else $(CYGPATH_W) '$(srcdir)/finer-grained-fallbacks.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Tpo $(DEPDIR)/cairo_test_suite-finer-grained-fallbacks.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='finer-grained-fallbacks.c' object='cairo_test_suite-finer-grained-fallbacks.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-finer-grained-fallbacks.obj `if test -f 'finer-grained-fallbacks.c'; then $(CYGPATH_W) 'finer-grained-fallbacks.c'; else $(CYGPATH_W) '$(srcdir)/finer-grained-fallbacks.c'; fi` + +cairo_test_suite-font-face-get-type.o: font-face-get-type.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-font-face-get-type.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-font-face-get-type.Tpo -c -o cairo_test_suite-font-face-get-type.o `test -f 'font-face-get-type.c' || echo '$(srcdir)/'`font-face-get-type.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-font-face-get-type.Tpo $(DEPDIR)/cairo_test_suite-font-face-get-type.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-face-get-type.c' object='cairo_test_suite-font-face-get-type.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-font-face-get-type.o `test -f 'font-face-get-type.c' || echo '$(srcdir)/'`font-face-get-type.c + +cairo_test_suite-font-face-get-type.obj: font-face-get-type.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-font-face-get-type.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-font-face-get-type.Tpo -c -o cairo_test_suite-font-face-get-type.obj `if test -f 'font-face-get-type.c'; then $(CYGPATH_W) 'font-face-get-type.c'; else $(CYGPATH_W) '$(srcdir)/font-face-get-type.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-font-face-get-type.Tpo $(DEPDIR)/cairo_test_suite-font-face-get-type.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-face-get-type.c' object='cairo_test_suite-font-face-get-type.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-font-face-get-type.obj `if test -f 'font-face-get-type.c'; then $(CYGPATH_W) 'font-face-get-type.c'; else $(CYGPATH_W) '$(srcdir)/font-face-get-type.c'; fi` + +cairo_test_suite-font-matrix-translation.o: font-matrix-translation.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-font-matrix-translation.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-font-matrix-translation.Tpo -c -o cairo_test_suite-font-matrix-translation.o `test -f 'font-matrix-translation.c' || echo '$(srcdir)/'`font-matrix-translation.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-font-matrix-translation.Tpo $(DEPDIR)/cairo_test_suite-font-matrix-translation.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-matrix-translation.c' object='cairo_test_suite-font-matrix-translation.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-font-matrix-translation.o `test -f 'font-matrix-translation.c' || echo '$(srcdir)/'`font-matrix-translation.c + +cairo_test_suite-font-matrix-translation.obj: font-matrix-translation.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-font-matrix-translation.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-font-matrix-translation.Tpo -c -o cairo_test_suite-font-matrix-translation.obj `if test -f 'font-matrix-translation.c'; then $(CYGPATH_W) 'font-matrix-translation.c'; else $(CYGPATH_W) '$(srcdir)/font-matrix-translation.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-font-matrix-translation.Tpo $(DEPDIR)/cairo_test_suite-font-matrix-translation.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-matrix-translation.c' object='cairo_test_suite-font-matrix-translation.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-font-matrix-translation.obj `if test -f 'font-matrix-translation.c'; then $(CYGPATH_W) 'font-matrix-translation.c'; else $(CYGPATH_W) '$(srcdir)/font-matrix-translation.c'; fi` + +cairo_test_suite-font-options.o: font-options.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-font-options.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-font-options.Tpo -c -o cairo_test_suite-font-options.o `test -f 'font-options.c' || echo '$(srcdir)/'`font-options.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-font-options.Tpo $(DEPDIR)/cairo_test_suite-font-options.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-options.c' object='cairo_test_suite-font-options.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-font-options.o `test -f 'font-options.c' || echo '$(srcdir)/'`font-options.c + +cairo_test_suite-font-options.obj: font-options.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-font-options.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-font-options.Tpo -c -o cairo_test_suite-font-options.obj `if test -f 'font-options.c'; then $(CYGPATH_W) 'font-options.c'; else $(CYGPATH_W) '$(srcdir)/font-options.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-font-options.Tpo $(DEPDIR)/cairo_test_suite-font-options.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-options.c' object='cairo_test_suite-font-options.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-font-options.obj `if test -f 'font-options.c'; then $(CYGPATH_W) 'font-options.c'; else $(CYGPATH_W) '$(srcdir)/font-options.c'; fi` + +cairo_test_suite-glyph-cache-pressure.o: glyph-cache-pressure.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-glyph-cache-pressure.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Tpo -c -o cairo_test_suite-glyph-cache-pressure.o `test -f 'glyph-cache-pressure.c' || echo '$(srcdir)/'`glyph-cache-pressure.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Tpo $(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='glyph-cache-pressure.c' object='cairo_test_suite-glyph-cache-pressure.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-glyph-cache-pressure.o `test -f 'glyph-cache-pressure.c' || echo '$(srcdir)/'`glyph-cache-pressure.c + +cairo_test_suite-glyph-cache-pressure.obj: glyph-cache-pressure.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-glyph-cache-pressure.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Tpo -c -o cairo_test_suite-glyph-cache-pressure.obj `if test -f 'glyph-cache-pressure.c'; then $(CYGPATH_W) 'glyph-cache-pressure.c'; else $(CYGPATH_W) '$(srcdir)/glyph-cache-pressure.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Tpo $(DEPDIR)/cairo_test_suite-glyph-cache-pressure.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='glyph-cache-pressure.c' object='cairo_test_suite-glyph-cache-pressure.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-glyph-cache-pressure.obj `if test -f 'glyph-cache-pressure.c'; then $(CYGPATH_W) 'glyph-cache-pressure.c'; else $(CYGPATH_W) '$(srcdir)/glyph-cache-pressure.c'; fi` + +cairo_test_suite-get-and-set.o: get-and-set.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-and-set.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-and-set.Tpo -c -o cairo_test_suite-get-and-set.o `test -f 'get-and-set.c' || echo '$(srcdir)/'`get-and-set.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-and-set.Tpo $(DEPDIR)/cairo_test_suite-get-and-set.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-and-set.c' object='cairo_test_suite-get-and-set.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-and-set.o `test -f 'get-and-set.c' || echo '$(srcdir)/'`get-and-set.c + +cairo_test_suite-get-and-set.obj: get-and-set.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-and-set.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-and-set.Tpo -c -o cairo_test_suite-get-and-set.obj `if test -f 'get-and-set.c'; then $(CYGPATH_W) 'get-and-set.c'; else $(CYGPATH_W) '$(srcdir)/get-and-set.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-and-set.Tpo $(DEPDIR)/cairo_test_suite-get-and-set.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-and-set.c' object='cairo_test_suite-get-and-set.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-and-set.obj `if test -f 'get-and-set.c'; then $(CYGPATH_W) 'get-and-set.c'; else $(CYGPATH_W) '$(srcdir)/get-and-set.c'; fi` + +cairo_test_suite-get-clip.o: get-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-clip.Tpo -c -o cairo_test_suite-get-clip.o `test -f 'get-clip.c' || echo '$(srcdir)/'`get-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-clip.Tpo $(DEPDIR)/cairo_test_suite-get-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-clip.c' object='cairo_test_suite-get-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-clip.o `test -f 'get-clip.c' || echo '$(srcdir)/'`get-clip.c + +cairo_test_suite-get-clip.obj: get-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-clip.Tpo -c -o cairo_test_suite-get-clip.obj `if test -f 'get-clip.c'; then $(CYGPATH_W) 'get-clip.c'; else $(CYGPATH_W) '$(srcdir)/get-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-clip.Tpo $(DEPDIR)/cairo_test_suite-get-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-clip.c' object='cairo_test_suite-get-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-clip.obj `if test -f 'get-clip.c'; then $(CYGPATH_W) 'get-clip.c'; else $(CYGPATH_W) '$(srcdir)/get-clip.c'; fi` + +cairo_test_suite-get-group-target.o: get-group-target.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-group-target.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-group-target.Tpo -c -o cairo_test_suite-get-group-target.o `test -f 'get-group-target.c' || echo '$(srcdir)/'`get-group-target.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-group-target.Tpo $(DEPDIR)/cairo_test_suite-get-group-target.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-group-target.c' object='cairo_test_suite-get-group-target.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-group-target.o `test -f 'get-group-target.c' || echo '$(srcdir)/'`get-group-target.c + +cairo_test_suite-get-group-target.obj: get-group-target.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-group-target.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-group-target.Tpo -c -o cairo_test_suite-get-group-target.obj `if test -f 'get-group-target.c'; then $(CYGPATH_W) 'get-group-target.c'; else $(CYGPATH_W) '$(srcdir)/get-group-target.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-group-target.Tpo $(DEPDIR)/cairo_test_suite-get-group-target.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-group-target.c' object='cairo_test_suite-get-group-target.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-group-target.obj `if test -f 'get-group-target.c'; then $(CYGPATH_W) 'get-group-target.c'; else $(CYGPATH_W) '$(srcdir)/get-group-target.c'; fi` + +cairo_test_suite-get-path-extents.o: get-path-extents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-path-extents.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-path-extents.Tpo -c -o cairo_test_suite-get-path-extents.o `test -f 'get-path-extents.c' || echo '$(srcdir)/'`get-path-extents.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-path-extents.Tpo $(DEPDIR)/cairo_test_suite-get-path-extents.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-path-extents.c' object='cairo_test_suite-get-path-extents.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-path-extents.o `test -f 'get-path-extents.c' || echo '$(srcdir)/'`get-path-extents.c + +cairo_test_suite-get-path-extents.obj: get-path-extents.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-path-extents.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-path-extents.Tpo -c -o cairo_test_suite-get-path-extents.obj `if test -f 'get-path-extents.c'; then $(CYGPATH_W) 'get-path-extents.c'; else $(CYGPATH_W) '$(srcdir)/get-path-extents.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-path-extents.Tpo $(DEPDIR)/cairo_test_suite-get-path-extents.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-path-extents.c' object='cairo_test_suite-get-path-extents.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-path-extents.obj `if test -f 'get-path-extents.c'; then $(CYGPATH_W) 'get-path-extents.c'; else $(CYGPATH_W) '$(srcdir)/get-path-extents.c'; fi` + +cairo_test_suite-gradient-alpha.o: gradient-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-alpha.Tpo -c -o cairo_test_suite-gradient-alpha.o `test -f 'gradient-alpha.c' || echo '$(srcdir)/'`gradient-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-alpha.Tpo $(DEPDIR)/cairo_test_suite-gradient-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-alpha.c' object='cairo_test_suite-gradient-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-alpha.o `test -f 'gradient-alpha.c' || echo '$(srcdir)/'`gradient-alpha.c + +cairo_test_suite-gradient-alpha.obj: gradient-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-alpha.Tpo -c -o cairo_test_suite-gradient-alpha.obj `if test -f 'gradient-alpha.c'; then $(CYGPATH_W) 'gradient-alpha.c'; else $(CYGPATH_W) '$(srcdir)/gradient-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-alpha.Tpo $(DEPDIR)/cairo_test_suite-gradient-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-alpha.c' object='cairo_test_suite-gradient-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-alpha.obj `if test -f 'gradient-alpha.c'; then $(CYGPATH_W) 'gradient-alpha.c'; else $(CYGPATH_W) '$(srcdir)/gradient-alpha.c'; fi` + +cairo_test_suite-gradient-constant-alpha.o: gradient-constant-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-constant-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Tpo -c -o cairo_test_suite-gradient-constant-alpha.o `test -f 'gradient-constant-alpha.c' || echo '$(srcdir)/'`gradient-constant-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Tpo $(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-constant-alpha.c' object='cairo_test_suite-gradient-constant-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-constant-alpha.o `test -f 'gradient-constant-alpha.c' || echo '$(srcdir)/'`gradient-constant-alpha.c + +cairo_test_suite-gradient-constant-alpha.obj: gradient-constant-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-constant-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Tpo -c -o cairo_test_suite-gradient-constant-alpha.obj `if test -f 'gradient-constant-alpha.c'; then $(CYGPATH_W) 'gradient-constant-alpha.c'; else $(CYGPATH_W) '$(srcdir)/gradient-constant-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Tpo $(DEPDIR)/cairo_test_suite-gradient-constant-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-constant-alpha.c' object='cairo_test_suite-gradient-constant-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-constant-alpha.obj `if test -f 'gradient-constant-alpha.c'; then $(CYGPATH_W) 'gradient-constant-alpha.c'; else $(CYGPATH_W) '$(srcdir)/gradient-constant-alpha.c'; fi` + +cairo_test_suite-gradient-zero-stops.o: gradient-zero-stops.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-zero-stops.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-zero-stops.Tpo -c -o cairo_test_suite-gradient-zero-stops.o `test -f 'gradient-zero-stops.c' || echo '$(srcdir)/'`gradient-zero-stops.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-zero-stops.Tpo $(DEPDIR)/cairo_test_suite-gradient-zero-stops.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-zero-stops.c' object='cairo_test_suite-gradient-zero-stops.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-zero-stops.o `test -f 'gradient-zero-stops.c' || echo '$(srcdir)/'`gradient-zero-stops.c + +cairo_test_suite-gradient-zero-stops.obj: gradient-zero-stops.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-zero-stops.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-zero-stops.Tpo -c -o cairo_test_suite-gradient-zero-stops.obj `if test -f 'gradient-zero-stops.c'; then $(CYGPATH_W) 'gradient-zero-stops.c'; else $(CYGPATH_W) '$(srcdir)/gradient-zero-stops.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-zero-stops.Tpo $(DEPDIR)/cairo_test_suite-gradient-zero-stops.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-zero-stops.c' object='cairo_test_suite-gradient-zero-stops.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-zero-stops.obj `if test -f 'gradient-zero-stops.c'; then $(CYGPATH_W) 'gradient-zero-stops.c'; else $(CYGPATH_W) '$(srcdir)/gradient-zero-stops.c'; fi` + +cairo_test_suite-gradient-zero-stops-mask.o: gradient-zero-stops-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-zero-stops-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Tpo -c -o cairo_test_suite-gradient-zero-stops-mask.o `test -f 'gradient-zero-stops-mask.c' || echo '$(srcdir)/'`gradient-zero-stops-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Tpo $(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-zero-stops-mask.c' object='cairo_test_suite-gradient-zero-stops-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-zero-stops-mask.o `test -f 'gradient-zero-stops-mask.c' || echo '$(srcdir)/'`gradient-zero-stops-mask.c + +cairo_test_suite-gradient-zero-stops-mask.obj: gradient-zero-stops-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gradient-zero-stops-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Tpo -c -o cairo_test_suite-gradient-zero-stops-mask.obj `if test -f 'gradient-zero-stops-mask.c'; then $(CYGPATH_W) 'gradient-zero-stops-mask.c'; else $(CYGPATH_W) '$(srcdir)/gradient-zero-stops-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Tpo $(DEPDIR)/cairo_test_suite-gradient-zero-stops-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gradient-zero-stops-mask.c' object='cairo_test_suite-gradient-zero-stops-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gradient-zero-stops-mask.obj `if test -f 'gradient-zero-stops-mask.c'; then $(CYGPATH_W) 'gradient-zero-stops-mask.c'; else $(CYGPATH_W) '$(srcdir)/gradient-zero-stops-mask.c'; fi` + +cairo_test_suite-group-clip.o: group-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-clip.Tpo -c -o cairo_test_suite-group-clip.o `test -f 'group-clip.c' || echo '$(srcdir)/'`group-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-clip.Tpo $(DEPDIR)/cairo_test_suite-group-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-clip.c' object='cairo_test_suite-group-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-clip.o `test -f 'group-clip.c' || echo '$(srcdir)/'`group-clip.c + +cairo_test_suite-group-clip.obj: group-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-clip.Tpo -c -o cairo_test_suite-group-clip.obj `if test -f 'group-clip.c'; then $(CYGPATH_W) 'group-clip.c'; else $(CYGPATH_W) '$(srcdir)/group-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-clip.Tpo $(DEPDIR)/cairo_test_suite-group-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-clip.c' object='cairo_test_suite-group-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-clip.obj `if test -f 'group-clip.c'; then $(CYGPATH_W) 'group-clip.c'; else $(CYGPATH_W) '$(srcdir)/group-clip.c'; fi` + +cairo_test_suite-group-paint.o: group-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-paint.Tpo -c -o cairo_test_suite-group-paint.o `test -f 'group-paint.c' || echo '$(srcdir)/'`group-paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-paint.Tpo $(DEPDIR)/cairo_test_suite-group-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-paint.c' object='cairo_test_suite-group-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-paint.o `test -f 'group-paint.c' || echo '$(srcdir)/'`group-paint.c + +cairo_test_suite-group-paint.obj: group-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-paint.Tpo -c -o cairo_test_suite-group-paint.obj `if test -f 'group-paint.c'; then $(CYGPATH_W) 'group-paint.c'; else $(CYGPATH_W) '$(srcdir)/group-paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-paint.Tpo $(DEPDIR)/cairo_test_suite-group-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-paint.c' object='cairo_test_suite-group-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-paint.obj `if test -f 'group-paint.c'; then $(CYGPATH_W) 'group-paint.c'; else $(CYGPATH_W) '$(srcdir)/group-paint.c'; fi` + +cairo_test_suite-group-state.o: group-state.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-state.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-state.Tpo -c -o cairo_test_suite-group-state.o `test -f 'group-state.c' || echo '$(srcdir)/'`group-state.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-state.Tpo $(DEPDIR)/cairo_test_suite-group-state.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-state.c' object='cairo_test_suite-group-state.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-state.o `test -f 'group-state.c' || echo '$(srcdir)/'`group-state.c + +cairo_test_suite-group-state.obj: group-state.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-state.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-state.Tpo -c -o cairo_test_suite-group-state.obj `if test -f 'group-state.c'; then $(CYGPATH_W) 'group-state.c'; else $(CYGPATH_W) '$(srcdir)/group-state.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-state.Tpo $(DEPDIR)/cairo_test_suite-group-state.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-state.c' object='cairo_test_suite-group-state.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-state.obj `if test -f 'group-state.c'; then $(CYGPATH_W) 'group-state.c'; else $(CYGPATH_W) '$(srcdir)/group-state.c'; fi` + +cairo_test_suite-group-unaligned.o: group-unaligned.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-unaligned.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-unaligned.Tpo -c -o cairo_test_suite-group-unaligned.o `test -f 'group-unaligned.c' || echo '$(srcdir)/'`group-unaligned.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-unaligned.Tpo $(DEPDIR)/cairo_test_suite-group-unaligned.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-unaligned.c' object='cairo_test_suite-group-unaligned.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-unaligned.o `test -f 'group-unaligned.c' || echo '$(srcdir)/'`group-unaligned.c + +cairo_test_suite-group-unaligned.obj: group-unaligned.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-group-unaligned.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-group-unaligned.Tpo -c -o cairo_test_suite-group-unaligned.obj `if test -f 'group-unaligned.c'; then $(CYGPATH_W) 'group-unaligned.c'; else $(CYGPATH_W) '$(srcdir)/group-unaligned.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-group-unaligned.Tpo $(DEPDIR)/cairo_test_suite-group-unaligned.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='group-unaligned.c' object='cairo_test_suite-group-unaligned.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-group-unaligned.obj `if test -f 'group-unaligned.c'; then $(CYGPATH_W) 'group-unaligned.c'; else $(CYGPATH_W) '$(srcdir)/group-unaligned.c'; fi` + +cairo_test_suite-half-coverage.o: half-coverage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-half-coverage.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-half-coverage.Tpo -c -o cairo_test_suite-half-coverage.o `test -f 'half-coverage.c' || echo '$(srcdir)/'`half-coverage.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-half-coverage.Tpo $(DEPDIR)/cairo_test_suite-half-coverage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='half-coverage.c' object='cairo_test_suite-half-coverage.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-half-coverage.o `test -f 'half-coverage.c' || echo '$(srcdir)/'`half-coverage.c + +cairo_test_suite-half-coverage.obj: half-coverage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-half-coverage.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-half-coverage.Tpo -c -o cairo_test_suite-half-coverage.obj `if test -f 'half-coverage.c'; then $(CYGPATH_W) 'half-coverage.c'; else $(CYGPATH_W) '$(srcdir)/half-coverage.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-half-coverage.Tpo $(DEPDIR)/cairo_test_suite-half-coverage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='half-coverage.c' object='cairo_test_suite-half-coverage.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-half-coverage.obj `if test -f 'half-coverage.c'; then $(CYGPATH_W) 'half-coverage.c'; else $(CYGPATH_W) '$(srcdir)/half-coverage.c'; fi` + +cairo_test_suite-halo.o: halo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-halo.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-halo.Tpo -c -o cairo_test_suite-halo.o `test -f 'halo.c' || echo '$(srcdir)/'`halo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-halo.Tpo $(DEPDIR)/cairo_test_suite-halo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='halo.c' object='cairo_test_suite-halo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-halo.o `test -f 'halo.c' || echo '$(srcdir)/'`halo.c + +cairo_test_suite-halo.obj: halo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-halo.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-halo.Tpo -c -o cairo_test_suite-halo.obj `if test -f 'halo.c'; then $(CYGPATH_W) 'halo.c'; else $(CYGPATH_W) '$(srcdir)/halo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-halo.Tpo $(DEPDIR)/cairo_test_suite-halo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='halo.c' object='cairo_test_suite-halo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-halo.obj `if test -f 'halo.c'; then $(CYGPATH_W) 'halo.c'; else $(CYGPATH_W) '$(srcdir)/halo.c'; fi` + +cairo_test_suite-hatchings.o: hatchings.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-hatchings.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-hatchings.Tpo -c -o cairo_test_suite-hatchings.o `test -f 'hatchings.c' || echo '$(srcdir)/'`hatchings.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-hatchings.Tpo $(DEPDIR)/cairo_test_suite-hatchings.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hatchings.c' object='cairo_test_suite-hatchings.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-hatchings.o `test -f 'hatchings.c' || echo '$(srcdir)/'`hatchings.c + +cairo_test_suite-hatchings.obj: hatchings.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-hatchings.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-hatchings.Tpo -c -o cairo_test_suite-hatchings.obj `if test -f 'hatchings.c'; then $(CYGPATH_W) 'hatchings.c'; else $(CYGPATH_W) '$(srcdir)/hatchings.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-hatchings.Tpo $(DEPDIR)/cairo_test_suite-hatchings.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hatchings.c' object='cairo_test_suite-hatchings.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-hatchings.obj `if test -f 'hatchings.c'; then $(CYGPATH_W) 'hatchings.c'; else $(CYGPATH_W) '$(srcdir)/hatchings.c'; fi` + +cairo_test_suite-horizontal-clip.o: horizontal-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-horizontal-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-horizontal-clip.Tpo -c -o cairo_test_suite-horizontal-clip.o `test -f 'horizontal-clip.c' || echo '$(srcdir)/'`horizontal-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-horizontal-clip.Tpo $(DEPDIR)/cairo_test_suite-horizontal-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='horizontal-clip.c' object='cairo_test_suite-horizontal-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-horizontal-clip.o `test -f 'horizontal-clip.c' || echo '$(srcdir)/'`horizontal-clip.c + +cairo_test_suite-horizontal-clip.obj: horizontal-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-horizontal-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-horizontal-clip.Tpo -c -o cairo_test_suite-horizontal-clip.obj `if test -f 'horizontal-clip.c'; then $(CYGPATH_W) 'horizontal-clip.c'; else $(CYGPATH_W) '$(srcdir)/horizontal-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-horizontal-clip.Tpo $(DEPDIR)/cairo_test_suite-horizontal-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='horizontal-clip.c' object='cairo_test_suite-horizontal-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-horizontal-clip.obj `if test -f 'horizontal-clip.c'; then $(CYGPATH_W) 'horizontal-clip.c'; else $(CYGPATH_W) '$(srcdir)/horizontal-clip.c'; fi` + +cairo_test_suite-huge-linear.o: huge-linear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-huge-linear.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-huge-linear.Tpo -c -o cairo_test_suite-huge-linear.o `test -f 'huge-linear.c' || echo '$(srcdir)/'`huge-linear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-huge-linear.Tpo $(DEPDIR)/cairo_test_suite-huge-linear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='huge-linear.c' object='cairo_test_suite-huge-linear.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-huge-linear.o `test -f 'huge-linear.c' || echo '$(srcdir)/'`huge-linear.c + +cairo_test_suite-huge-linear.obj: huge-linear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-huge-linear.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-huge-linear.Tpo -c -o cairo_test_suite-huge-linear.obj `if test -f 'huge-linear.c'; then $(CYGPATH_W) 'huge-linear.c'; else $(CYGPATH_W) '$(srcdir)/huge-linear.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-huge-linear.Tpo $(DEPDIR)/cairo_test_suite-huge-linear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='huge-linear.c' object='cairo_test_suite-huge-linear.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-huge-linear.obj `if test -f 'huge-linear.c'; then $(CYGPATH_W) 'huge-linear.c'; else $(CYGPATH_W) '$(srcdir)/huge-linear.c'; fi` + +cairo_test_suite-huge-radial.o: huge-radial.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-huge-radial.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-huge-radial.Tpo -c -o cairo_test_suite-huge-radial.o `test -f 'huge-radial.c' || echo '$(srcdir)/'`huge-radial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-huge-radial.Tpo $(DEPDIR)/cairo_test_suite-huge-radial.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='huge-radial.c' object='cairo_test_suite-huge-radial.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-huge-radial.o `test -f 'huge-radial.c' || echo '$(srcdir)/'`huge-radial.c + +cairo_test_suite-huge-radial.obj: huge-radial.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-huge-radial.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-huge-radial.Tpo -c -o cairo_test_suite-huge-radial.obj `if test -f 'huge-radial.c'; then $(CYGPATH_W) 'huge-radial.c'; else $(CYGPATH_W) '$(srcdir)/huge-radial.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-huge-radial.Tpo $(DEPDIR)/cairo_test_suite-huge-radial.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='huge-radial.c' object='cairo_test_suite-huge-radial.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-huge-radial.obj `if test -f 'huge-radial.c'; then $(CYGPATH_W) 'huge-radial.c'; else $(CYGPATH_W) '$(srcdir)/huge-radial.c'; fi` + +cairo_test_suite-image-surface-source.o: image-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-image-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-image-surface-source.Tpo -c -o cairo_test_suite-image-surface-source.o `test -f 'image-surface-source.c' || echo '$(srcdir)/'`image-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-image-surface-source.Tpo $(DEPDIR)/cairo_test_suite-image-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='image-surface-source.c' object='cairo_test_suite-image-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-image-surface-source.o `test -f 'image-surface-source.c' || echo '$(srcdir)/'`image-surface-source.c + +cairo_test_suite-image-surface-source.obj: image-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-image-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-image-surface-source.Tpo -c -o cairo_test_suite-image-surface-source.obj `if test -f 'image-surface-source.c'; then $(CYGPATH_W) 'image-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/image-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-image-surface-source.Tpo $(DEPDIR)/cairo_test_suite-image-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='image-surface-source.c' object='cairo_test_suite-image-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-image-surface-source.obj `if test -f 'image-surface-source.c'; then $(CYGPATH_W) 'image-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/image-surface-source.c'; fi` + +cairo_test_suite-image-bug-710072.o: image-bug-710072.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-image-bug-710072.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-image-bug-710072.Tpo -c -o cairo_test_suite-image-bug-710072.o `test -f 'image-bug-710072.c' || echo '$(srcdir)/'`image-bug-710072.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-image-bug-710072.Tpo $(DEPDIR)/cairo_test_suite-image-bug-710072.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='image-bug-710072.c' object='cairo_test_suite-image-bug-710072.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-image-bug-710072.o `test -f 'image-bug-710072.c' || echo '$(srcdir)/'`image-bug-710072.c + +cairo_test_suite-image-bug-710072.obj: image-bug-710072.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-image-bug-710072.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-image-bug-710072.Tpo -c -o cairo_test_suite-image-bug-710072.obj `if test -f 'image-bug-710072.c'; then $(CYGPATH_W) 'image-bug-710072.c'; else $(CYGPATH_W) '$(srcdir)/image-bug-710072.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-image-bug-710072.Tpo $(DEPDIR)/cairo_test_suite-image-bug-710072.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='image-bug-710072.c' object='cairo_test_suite-image-bug-710072.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-image-bug-710072.obj `if test -f 'image-bug-710072.c'; then $(CYGPATH_W) 'image-bug-710072.c'; else $(CYGPATH_W) '$(srcdir)/image-bug-710072.c'; fi` + +cairo_test_suite-implicit-close.o: implicit-close.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-implicit-close.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-implicit-close.Tpo -c -o cairo_test_suite-implicit-close.o `test -f 'implicit-close.c' || echo '$(srcdir)/'`implicit-close.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-implicit-close.Tpo $(DEPDIR)/cairo_test_suite-implicit-close.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='implicit-close.c' object='cairo_test_suite-implicit-close.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-implicit-close.o `test -f 'implicit-close.c' || echo '$(srcdir)/'`implicit-close.c + +cairo_test_suite-implicit-close.obj: implicit-close.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-implicit-close.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-implicit-close.Tpo -c -o cairo_test_suite-implicit-close.obj `if test -f 'implicit-close.c'; then $(CYGPATH_W) 'implicit-close.c'; else $(CYGPATH_W) '$(srcdir)/implicit-close.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-implicit-close.Tpo $(DEPDIR)/cairo_test_suite-implicit-close.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='implicit-close.c' object='cairo_test_suite-implicit-close.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-implicit-close.obj `if test -f 'implicit-close.c'; then $(CYGPATH_W) 'implicit-close.c'; else $(CYGPATH_W) '$(srcdir)/implicit-close.c'; fi` + +cairo_test_suite-infinite-join.o: infinite-join.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-infinite-join.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-infinite-join.Tpo -c -o cairo_test_suite-infinite-join.o `test -f 'infinite-join.c' || echo '$(srcdir)/'`infinite-join.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-infinite-join.Tpo $(DEPDIR)/cairo_test_suite-infinite-join.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='infinite-join.c' object='cairo_test_suite-infinite-join.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-infinite-join.o `test -f 'infinite-join.c' || echo '$(srcdir)/'`infinite-join.c + +cairo_test_suite-infinite-join.obj: infinite-join.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-infinite-join.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-infinite-join.Tpo -c -o cairo_test_suite-infinite-join.obj `if test -f 'infinite-join.c'; then $(CYGPATH_W) 'infinite-join.c'; else $(CYGPATH_W) '$(srcdir)/infinite-join.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-infinite-join.Tpo $(DEPDIR)/cairo_test_suite-infinite-join.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='infinite-join.c' object='cairo_test_suite-infinite-join.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-infinite-join.obj `if test -f 'infinite-join.c'; then $(CYGPATH_W) 'infinite-join.c'; else $(CYGPATH_W) '$(srcdir)/infinite-join.c'; fi` + +cairo_test_suite-in-fill-empty-trapezoid.o: in-fill-empty-trapezoid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-in-fill-empty-trapezoid.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Tpo -c -o cairo_test_suite-in-fill-empty-trapezoid.o `test -f 'in-fill-empty-trapezoid.c' || echo '$(srcdir)/'`in-fill-empty-trapezoid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Tpo $(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='in-fill-empty-trapezoid.c' object='cairo_test_suite-in-fill-empty-trapezoid.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-in-fill-empty-trapezoid.o `test -f 'in-fill-empty-trapezoid.c' || echo '$(srcdir)/'`in-fill-empty-trapezoid.c + +cairo_test_suite-in-fill-empty-trapezoid.obj: in-fill-empty-trapezoid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-in-fill-empty-trapezoid.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Tpo -c -o cairo_test_suite-in-fill-empty-trapezoid.obj `if test -f 'in-fill-empty-trapezoid.c'; then $(CYGPATH_W) 'in-fill-empty-trapezoid.c'; else $(CYGPATH_W) '$(srcdir)/in-fill-empty-trapezoid.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Tpo $(DEPDIR)/cairo_test_suite-in-fill-empty-trapezoid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='in-fill-empty-trapezoid.c' object='cairo_test_suite-in-fill-empty-trapezoid.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-in-fill-empty-trapezoid.obj `if test -f 'in-fill-empty-trapezoid.c'; then $(CYGPATH_W) 'in-fill-empty-trapezoid.c'; else $(CYGPATH_W) '$(srcdir)/in-fill-empty-trapezoid.c'; fi` + +cairo_test_suite-in-fill-trapezoid.o: in-fill-trapezoid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-in-fill-trapezoid.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Tpo -c -o cairo_test_suite-in-fill-trapezoid.o `test -f 'in-fill-trapezoid.c' || echo '$(srcdir)/'`in-fill-trapezoid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Tpo $(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='in-fill-trapezoid.c' object='cairo_test_suite-in-fill-trapezoid.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-in-fill-trapezoid.o `test -f 'in-fill-trapezoid.c' || echo '$(srcdir)/'`in-fill-trapezoid.c + +cairo_test_suite-in-fill-trapezoid.obj: in-fill-trapezoid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-in-fill-trapezoid.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Tpo -c -o cairo_test_suite-in-fill-trapezoid.obj `if test -f 'in-fill-trapezoid.c'; then $(CYGPATH_W) 'in-fill-trapezoid.c'; else $(CYGPATH_W) '$(srcdir)/in-fill-trapezoid.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Tpo $(DEPDIR)/cairo_test_suite-in-fill-trapezoid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='in-fill-trapezoid.c' object='cairo_test_suite-in-fill-trapezoid.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-in-fill-trapezoid.obj `if test -f 'in-fill-trapezoid.c'; then $(CYGPATH_W) 'in-fill-trapezoid.c'; else $(CYGPATH_W) '$(srcdir)/in-fill-trapezoid.c'; fi` + +cairo_test_suite-invalid-matrix.o: invalid-matrix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-invalid-matrix.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-invalid-matrix.Tpo -c -o cairo_test_suite-invalid-matrix.o `test -f 'invalid-matrix.c' || echo '$(srcdir)/'`invalid-matrix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-invalid-matrix.Tpo $(DEPDIR)/cairo_test_suite-invalid-matrix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='invalid-matrix.c' object='cairo_test_suite-invalid-matrix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-invalid-matrix.o `test -f 'invalid-matrix.c' || echo '$(srcdir)/'`invalid-matrix.c + +cairo_test_suite-invalid-matrix.obj: invalid-matrix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-invalid-matrix.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-invalid-matrix.Tpo -c -o cairo_test_suite-invalid-matrix.obj `if test -f 'invalid-matrix.c'; then $(CYGPATH_W) 'invalid-matrix.c'; else $(CYGPATH_W) '$(srcdir)/invalid-matrix.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-invalid-matrix.Tpo $(DEPDIR)/cairo_test_suite-invalid-matrix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='invalid-matrix.c' object='cairo_test_suite-invalid-matrix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-invalid-matrix.obj `if test -f 'invalid-matrix.c'; then $(CYGPATH_W) 'invalid-matrix.c'; else $(CYGPATH_W) '$(srcdir)/invalid-matrix.c'; fi` + +cairo_test_suite-inverse-text.o: inverse-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-inverse-text.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-inverse-text.Tpo -c -o cairo_test_suite-inverse-text.o `test -f 'inverse-text.c' || echo '$(srcdir)/'`inverse-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-inverse-text.Tpo $(DEPDIR)/cairo_test_suite-inverse-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='inverse-text.c' object='cairo_test_suite-inverse-text.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-inverse-text.o `test -f 'inverse-text.c' || echo '$(srcdir)/'`inverse-text.c + +cairo_test_suite-inverse-text.obj: inverse-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-inverse-text.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-inverse-text.Tpo -c -o cairo_test_suite-inverse-text.obj `if test -f 'inverse-text.c'; then $(CYGPATH_W) 'inverse-text.c'; else $(CYGPATH_W) '$(srcdir)/inverse-text.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-inverse-text.Tpo $(DEPDIR)/cairo_test_suite-inverse-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='inverse-text.c' object='cairo_test_suite-inverse-text.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-inverse-text.obj `if test -f 'inverse-text.c'; then $(CYGPATH_W) 'inverse-text.c'; else $(CYGPATH_W) '$(srcdir)/inverse-text.c'; fi` + +cairo_test_suite-inverted-clip.o: inverted-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-inverted-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-inverted-clip.Tpo -c -o cairo_test_suite-inverted-clip.o `test -f 'inverted-clip.c' || echo '$(srcdir)/'`inverted-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-inverted-clip.Tpo $(DEPDIR)/cairo_test_suite-inverted-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='inverted-clip.c' object='cairo_test_suite-inverted-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-inverted-clip.o `test -f 'inverted-clip.c' || echo '$(srcdir)/'`inverted-clip.c + +cairo_test_suite-inverted-clip.obj: inverted-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-inverted-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-inverted-clip.Tpo -c -o cairo_test_suite-inverted-clip.obj `if test -f 'inverted-clip.c'; then $(CYGPATH_W) 'inverted-clip.c'; else $(CYGPATH_W) '$(srcdir)/inverted-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-inverted-clip.Tpo $(DEPDIR)/cairo_test_suite-inverted-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='inverted-clip.c' object='cairo_test_suite-inverted-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-inverted-clip.obj `if test -f 'inverted-clip.c'; then $(CYGPATH_W) 'inverted-clip.c'; else $(CYGPATH_W) '$(srcdir)/inverted-clip.c'; fi` + +cairo_test_suite-joins.o: joins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins.Tpo -c -o cairo_test_suite-joins.o `test -f 'joins.c' || echo '$(srcdir)/'`joins.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins.Tpo $(DEPDIR)/cairo_test_suite-joins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins.c' object='cairo_test_suite-joins.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins.o `test -f 'joins.c' || echo '$(srcdir)/'`joins.c + +cairo_test_suite-joins.obj: joins.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins.Tpo -c -o cairo_test_suite-joins.obj `if test -f 'joins.c'; then $(CYGPATH_W) 'joins.c'; else $(CYGPATH_W) '$(srcdir)/joins.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins.Tpo $(DEPDIR)/cairo_test_suite-joins.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins.c' object='cairo_test_suite-joins.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins.obj `if test -f 'joins.c'; then $(CYGPATH_W) 'joins.c'; else $(CYGPATH_W) '$(srcdir)/joins.c'; fi` + +cairo_test_suite-joins-loop.o: joins-loop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins-loop.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins-loop.Tpo -c -o cairo_test_suite-joins-loop.o `test -f 'joins-loop.c' || echo '$(srcdir)/'`joins-loop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins-loop.Tpo $(DEPDIR)/cairo_test_suite-joins-loop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins-loop.c' object='cairo_test_suite-joins-loop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins-loop.o `test -f 'joins-loop.c' || echo '$(srcdir)/'`joins-loop.c + +cairo_test_suite-joins-loop.obj: joins-loop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins-loop.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins-loop.Tpo -c -o cairo_test_suite-joins-loop.obj `if test -f 'joins-loop.c'; then $(CYGPATH_W) 'joins-loop.c'; else $(CYGPATH_W) '$(srcdir)/joins-loop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins-loop.Tpo $(DEPDIR)/cairo_test_suite-joins-loop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins-loop.c' object='cairo_test_suite-joins-loop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins-loop.obj `if test -f 'joins-loop.c'; then $(CYGPATH_W) 'joins-loop.c'; else $(CYGPATH_W) '$(srcdir)/joins-loop.c'; fi` + +cairo_test_suite-joins-star.o: joins-star.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins-star.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins-star.Tpo -c -o cairo_test_suite-joins-star.o `test -f 'joins-star.c' || echo '$(srcdir)/'`joins-star.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins-star.Tpo $(DEPDIR)/cairo_test_suite-joins-star.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins-star.c' object='cairo_test_suite-joins-star.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins-star.o `test -f 'joins-star.c' || echo '$(srcdir)/'`joins-star.c + +cairo_test_suite-joins-star.obj: joins-star.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins-star.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins-star.Tpo -c -o cairo_test_suite-joins-star.obj `if test -f 'joins-star.c'; then $(CYGPATH_W) 'joins-star.c'; else $(CYGPATH_W) '$(srcdir)/joins-star.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins-star.Tpo $(DEPDIR)/cairo_test_suite-joins-star.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins-star.c' object='cairo_test_suite-joins-star.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins-star.obj `if test -f 'joins-star.c'; then $(CYGPATH_W) 'joins-star.c'; else $(CYGPATH_W) '$(srcdir)/joins-star.c'; fi` + +cairo_test_suite-joins-retrace.o: joins-retrace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins-retrace.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins-retrace.Tpo -c -o cairo_test_suite-joins-retrace.o `test -f 'joins-retrace.c' || echo '$(srcdir)/'`joins-retrace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins-retrace.Tpo $(DEPDIR)/cairo_test_suite-joins-retrace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins-retrace.c' object='cairo_test_suite-joins-retrace.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins-retrace.o `test -f 'joins-retrace.c' || echo '$(srcdir)/'`joins-retrace.c + +cairo_test_suite-joins-retrace.obj: joins-retrace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-joins-retrace.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-joins-retrace.Tpo -c -o cairo_test_suite-joins-retrace.obj `if test -f 'joins-retrace.c'; then $(CYGPATH_W) 'joins-retrace.c'; else $(CYGPATH_W) '$(srcdir)/joins-retrace.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-joins-retrace.Tpo $(DEPDIR)/cairo_test_suite-joins-retrace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='joins-retrace.c' object='cairo_test_suite-joins-retrace.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-joins-retrace.obj `if test -f 'joins-retrace.c'; then $(CYGPATH_W) 'joins-retrace.c'; else $(CYGPATH_W) '$(srcdir)/joins-retrace.c'; fi` + +cairo_test_suite-large-clip.o: large-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-clip.Tpo -c -o cairo_test_suite-large-clip.o `test -f 'large-clip.c' || echo '$(srcdir)/'`large-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-clip.Tpo $(DEPDIR)/cairo_test_suite-large-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-clip.c' object='cairo_test_suite-large-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-clip.o `test -f 'large-clip.c' || echo '$(srcdir)/'`large-clip.c + +cairo_test_suite-large-clip.obj: large-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-clip.Tpo -c -o cairo_test_suite-large-clip.obj `if test -f 'large-clip.c'; then $(CYGPATH_W) 'large-clip.c'; else $(CYGPATH_W) '$(srcdir)/large-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-clip.Tpo $(DEPDIR)/cairo_test_suite-large-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-clip.c' object='cairo_test_suite-large-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-clip.obj `if test -f 'large-clip.c'; then $(CYGPATH_W) 'large-clip.c'; else $(CYGPATH_W) '$(srcdir)/large-clip.c'; fi` + +cairo_test_suite-large-font.o: large-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-font.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-font.Tpo -c -o cairo_test_suite-large-font.o `test -f 'large-font.c' || echo '$(srcdir)/'`large-font.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-font.Tpo $(DEPDIR)/cairo_test_suite-large-font.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-font.c' object='cairo_test_suite-large-font.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-font.o `test -f 'large-font.c' || echo '$(srcdir)/'`large-font.c + +cairo_test_suite-large-font.obj: large-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-font.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-font.Tpo -c -o cairo_test_suite-large-font.obj `if test -f 'large-font.c'; then $(CYGPATH_W) 'large-font.c'; else $(CYGPATH_W) '$(srcdir)/large-font.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-font.Tpo $(DEPDIR)/cairo_test_suite-large-font.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-font.c' object='cairo_test_suite-large-font.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-font.obj `if test -f 'large-font.c'; then $(CYGPATH_W) 'large-font.c'; else $(CYGPATH_W) '$(srcdir)/large-font.c'; fi` + +cairo_test_suite-large-source.o: large-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-source.Tpo -c -o cairo_test_suite-large-source.o `test -f 'large-source.c' || echo '$(srcdir)/'`large-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-source.Tpo $(DEPDIR)/cairo_test_suite-large-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-source.c' object='cairo_test_suite-large-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-source.o `test -f 'large-source.c' || echo '$(srcdir)/'`large-source.c + +cairo_test_suite-large-source.obj: large-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-source.Tpo -c -o cairo_test_suite-large-source.obj `if test -f 'large-source.c'; then $(CYGPATH_W) 'large-source.c'; else $(CYGPATH_W) '$(srcdir)/large-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-source.Tpo $(DEPDIR)/cairo_test_suite-large-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-source.c' object='cairo_test_suite-large-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-source.obj `if test -f 'large-source.c'; then $(CYGPATH_W) 'large-source.c'; else $(CYGPATH_W) '$(srcdir)/large-source.c'; fi` + +cairo_test_suite-large-source-roi.o: large-source-roi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-source-roi.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-source-roi.Tpo -c -o cairo_test_suite-large-source-roi.o `test -f 'large-source-roi.c' || echo '$(srcdir)/'`large-source-roi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-source-roi.Tpo $(DEPDIR)/cairo_test_suite-large-source-roi.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-source-roi.c' object='cairo_test_suite-large-source-roi.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-source-roi.o `test -f 'large-source-roi.c' || echo '$(srcdir)/'`large-source-roi.c + +cairo_test_suite-large-source-roi.obj: large-source-roi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-source-roi.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-source-roi.Tpo -c -o cairo_test_suite-large-source-roi.obj `if test -f 'large-source-roi.c'; then $(CYGPATH_W) 'large-source-roi.c'; else $(CYGPATH_W) '$(srcdir)/large-source-roi.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-source-roi.Tpo $(DEPDIR)/cairo_test_suite-large-source-roi.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-source-roi.c' object='cairo_test_suite-large-source-roi.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-source-roi.obj `if test -f 'large-source-roi.c'; then $(CYGPATH_W) 'large-source-roi.c'; else $(CYGPATH_W) '$(srcdir)/large-source-roi.c'; fi` + +cairo_test_suite-large-twin-antialias-mixed.o: large-twin-antialias-mixed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-twin-antialias-mixed.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Tpo -c -o cairo_test_suite-large-twin-antialias-mixed.o `test -f 'large-twin-antialias-mixed.c' || echo '$(srcdir)/'`large-twin-antialias-mixed.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Tpo $(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-twin-antialias-mixed.c' object='cairo_test_suite-large-twin-antialias-mixed.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-twin-antialias-mixed.o `test -f 'large-twin-antialias-mixed.c' || echo '$(srcdir)/'`large-twin-antialias-mixed.c + +cairo_test_suite-large-twin-antialias-mixed.obj: large-twin-antialias-mixed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-large-twin-antialias-mixed.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Tpo -c -o cairo_test_suite-large-twin-antialias-mixed.obj `if test -f 'large-twin-antialias-mixed.c'; then $(CYGPATH_W) 'large-twin-antialias-mixed.c'; else $(CYGPATH_W) '$(srcdir)/large-twin-antialias-mixed.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Tpo $(DEPDIR)/cairo_test_suite-large-twin-antialias-mixed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='large-twin-antialias-mixed.c' object='cairo_test_suite-large-twin-antialias-mixed.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-large-twin-antialias-mixed.obj `if test -f 'large-twin-antialias-mixed.c'; then $(CYGPATH_W) 'large-twin-antialias-mixed.c'; else $(CYGPATH_W) '$(srcdir)/large-twin-antialias-mixed.c'; fi` + +cairo_test_suite-leaky-dash.o: leaky-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-dash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-dash.Tpo -c -o cairo_test_suite-leaky-dash.o `test -f 'leaky-dash.c' || echo '$(srcdir)/'`leaky-dash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-dash.Tpo $(DEPDIR)/cairo_test_suite-leaky-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-dash.c' object='cairo_test_suite-leaky-dash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-dash.o `test -f 'leaky-dash.c' || echo '$(srcdir)/'`leaky-dash.c + +cairo_test_suite-leaky-dash.obj: leaky-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-dash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-dash.Tpo -c -o cairo_test_suite-leaky-dash.obj `if test -f 'leaky-dash.c'; then $(CYGPATH_W) 'leaky-dash.c'; else $(CYGPATH_W) '$(srcdir)/leaky-dash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-dash.Tpo $(DEPDIR)/cairo_test_suite-leaky-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-dash.c' object='cairo_test_suite-leaky-dash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-dash.obj `if test -f 'leaky-dash.c'; then $(CYGPATH_W) 'leaky-dash.c'; else $(CYGPATH_W) '$(srcdir)/leaky-dash.c'; fi` + +cairo_test_suite-leaky-dashed-rectangle.o: leaky-dashed-rectangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-dashed-rectangle.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Tpo -c -o cairo_test_suite-leaky-dashed-rectangle.o `test -f 'leaky-dashed-rectangle.c' || echo '$(srcdir)/'`leaky-dashed-rectangle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Tpo $(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-dashed-rectangle.c' object='cairo_test_suite-leaky-dashed-rectangle.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-dashed-rectangle.o `test -f 'leaky-dashed-rectangle.c' || echo '$(srcdir)/'`leaky-dashed-rectangle.c + +cairo_test_suite-leaky-dashed-rectangle.obj: leaky-dashed-rectangle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-dashed-rectangle.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Tpo -c -o cairo_test_suite-leaky-dashed-rectangle.obj `if test -f 'leaky-dashed-rectangle.c'; then $(CYGPATH_W) 'leaky-dashed-rectangle.c'; else $(CYGPATH_W) '$(srcdir)/leaky-dashed-rectangle.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Tpo $(DEPDIR)/cairo_test_suite-leaky-dashed-rectangle.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-dashed-rectangle.c' object='cairo_test_suite-leaky-dashed-rectangle.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-dashed-rectangle.obj `if test -f 'leaky-dashed-rectangle.c'; then $(CYGPATH_W) 'leaky-dashed-rectangle.c'; else $(CYGPATH_W) '$(srcdir)/leaky-dashed-rectangle.c'; fi` + +cairo_test_suite-leaky-dashed-stroke.o: leaky-dashed-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-dashed-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Tpo -c -o cairo_test_suite-leaky-dashed-stroke.o `test -f 'leaky-dashed-stroke.c' || echo '$(srcdir)/'`leaky-dashed-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Tpo $(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-dashed-stroke.c' object='cairo_test_suite-leaky-dashed-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-dashed-stroke.o `test -f 'leaky-dashed-stroke.c' || echo '$(srcdir)/'`leaky-dashed-stroke.c + +cairo_test_suite-leaky-dashed-stroke.obj: leaky-dashed-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-dashed-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Tpo -c -o cairo_test_suite-leaky-dashed-stroke.obj `if test -f 'leaky-dashed-stroke.c'; then $(CYGPATH_W) 'leaky-dashed-stroke.c'; else $(CYGPATH_W) '$(srcdir)/leaky-dashed-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Tpo $(DEPDIR)/cairo_test_suite-leaky-dashed-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-dashed-stroke.c' object='cairo_test_suite-leaky-dashed-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-dashed-stroke.obj `if test -f 'leaky-dashed-stroke.c'; then $(CYGPATH_W) 'leaky-dashed-stroke.c'; else $(CYGPATH_W) '$(srcdir)/leaky-dashed-stroke.c'; fi` + +cairo_test_suite-leaky-polygon.o: leaky-polygon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-polygon.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-polygon.Tpo -c -o cairo_test_suite-leaky-polygon.o `test -f 'leaky-polygon.c' || echo '$(srcdir)/'`leaky-polygon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-polygon.Tpo $(DEPDIR)/cairo_test_suite-leaky-polygon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-polygon.c' object='cairo_test_suite-leaky-polygon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-polygon.o `test -f 'leaky-polygon.c' || echo '$(srcdir)/'`leaky-polygon.c + +cairo_test_suite-leaky-polygon.obj: leaky-polygon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-leaky-polygon.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-leaky-polygon.Tpo -c -o cairo_test_suite-leaky-polygon.obj `if test -f 'leaky-polygon.c'; then $(CYGPATH_W) 'leaky-polygon.c'; else $(CYGPATH_W) '$(srcdir)/leaky-polygon.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-leaky-polygon.Tpo $(DEPDIR)/cairo_test_suite-leaky-polygon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='leaky-polygon.c' object='cairo_test_suite-leaky-polygon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-leaky-polygon.obj `if test -f 'leaky-polygon.c'; then $(CYGPATH_W) 'leaky-polygon.c'; else $(CYGPATH_W) '$(srcdir)/leaky-polygon.c'; fi` + +cairo_test_suite-line-width.o: line-width.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width.Tpo -c -o cairo_test_suite-line-width.o `test -f 'line-width.c' || echo '$(srcdir)/'`line-width.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width.Tpo $(DEPDIR)/cairo_test_suite-line-width.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width.c' object='cairo_test_suite-line-width.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width.o `test -f 'line-width.c' || echo '$(srcdir)/'`line-width.c + +cairo_test_suite-line-width.obj: line-width.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width.Tpo -c -o cairo_test_suite-line-width.obj `if test -f 'line-width.c'; then $(CYGPATH_W) 'line-width.c'; else $(CYGPATH_W) '$(srcdir)/line-width.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width.Tpo $(DEPDIR)/cairo_test_suite-line-width.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width.c' object='cairo_test_suite-line-width.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width.obj `if test -f 'line-width.c'; then $(CYGPATH_W) 'line-width.c'; else $(CYGPATH_W) '$(srcdir)/line-width.c'; fi` + +cairo_test_suite-line-width-large-overlap.o: line-width-large-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-large-overlap.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-large-overlap.Tpo -c -o cairo_test_suite-line-width-large-overlap.o `test -f 'line-width-large-overlap.c' || echo '$(srcdir)/'`line-width-large-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-large-overlap.Tpo $(DEPDIR)/cairo_test_suite-line-width-large-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-large-overlap.c' object='cairo_test_suite-line-width-large-overlap.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-large-overlap.o `test -f 'line-width-large-overlap.c' || echo '$(srcdir)/'`line-width-large-overlap.c + +cairo_test_suite-line-width-large-overlap.obj: line-width-large-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-large-overlap.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-large-overlap.Tpo -c -o cairo_test_suite-line-width-large-overlap.obj `if test -f 'line-width-large-overlap.c'; then $(CYGPATH_W) 'line-width-large-overlap.c'; else $(CYGPATH_W) '$(srcdir)/line-width-large-overlap.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-large-overlap.Tpo $(DEPDIR)/cairo_test_suite-line-width-large-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-large-overlap.c' object='cairo_test_suite-line-width-large-overlap.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-large-overlap.obj `if test -f 'line-width-large-overlap.c'; then $(CYGPATH_W) 'line-width-large-overlap.c'; else $(CYGPATH_W) '$(srcdir)/line-width-large-overlap.c'; fi` + +cairo_test_suite-line-width-overlap.o: line-width-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-overlap.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-overlap.Tpo -c -o cairo_test_suite-line-width-overlap.o `test -f 'line-width-overlap.c' || echo '$(srcdir)/'`line-width-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-overlap.Tpo $(DEPDIR)/cairo_test_suite-line-width-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-overlap.c' object='cairo_test_suite-line-width-overlap.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-overlap.o `test -f 'line-width-overlap.c' || echo '$(srcdir)/'`line-width-overlap.c + +cairo_test_suite-line-width-overlap.obj: line-width-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-overlap.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-overlap.Tpo -c -o cairo_test_suite-line-width-overlap.obj `if test -f 'line-width-overlap.c'; then $(CYGPATH_W) 'line-width-overlap.c'; else $(CYGPATH_W) '$(srcdir)/line-width-overlap.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-overlap.Tpo $(DEPDIR)/cairo_test_suite-line-width-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-overlap.c' object='cairo_test_suite-line-width-overlap.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-overlap.obj `if test -f 'line-width-overlap.c'; then $(CYGPATH_W) 'line-width-overlap.c'; else $(CYGPATH_W) '$(srcdir)/line-width-overlap.c'; fi` + +cairo_test_suite-line-width-scale.o: line-width-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-scale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-scale.Tpo -c -o cairo_test_suite-line-width-scale.o `test -f 'line-width-scale.c' || echo '$(srcdir)/'`line-width-scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-scale.Tpo $(DEPDIR)/cairo_test_suite-line-width-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-scale.c' object='cairo_test_suite-line-width-scale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-scale.o `test -f 'line-width-scale.c' || echo '$(srcdir)/'`line-width-scale.c + +cairo_test_suite-line-width-scale.obj: line-width-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-scale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-scale.Tpo -c -o cairo_test_suite-line-width-scale.obj `if test -f 'line-width-scale.c'; then $(CYGPATH_W) 'line-width-scale.c'; else $(CYGPATH_W) '$(srcdir)/line-width-scale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-scale.Tpo $(DEPDIR)/cairo_test_suite-line-width-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-scale.c' object='cairo_test_suite-line-width-scale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-scale.obj `if test -f 'line-width-scale.c'; then $(CYGPATH_W) 'line-width-scale.c'; else $(CYGPATH_W) '$(srcdir)/line-width-scale.c'; fi` + +cairo_test_suite-line-width-tolerance.o: line-width-tolerance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-tolerance.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-tolerance.Tpo -c -o cairo_test_suite-line-width-tolerance.o `test -f 'line-width-tolerance.c' || echo '$(srcdir)/'`line-width-tolerance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-tolerance.Tpo $(DEPDIR)/cairo_test_suite-line-width-tolerance.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-tolerance.c' object='cairo_test_suite-line-width-tolerance.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-tolerance.o `test -f 'line-width-tolerance.c' || echo '$(srcdir)/'`line-width-tolerance.c + +cairo_test_suite-line-width-tolerance.obj: line-width-tolerance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-tolerance.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-tolerance.Tpo -c -o cairo_test_suite-line-width-tolerance.obj `if test -f 'line-width-tolerance.c'; then $(CYGPATH_W) 'line-width-tolerance.c'; else $(CYGPATH_W) '$(srcdir)/line-width-tolerance.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-tolerance.Tpo $(DEPDIR)/cairo_test_suite-line-width-tolerance.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-tolerance.c' object='cairo_test_suite-line-width-tolerance.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-tolerance.obj `if test -f 'line-width-tolerance.c'; then $(CYGPATH_W) 'line-width-tolerance.c'; else $(CYGPATH_W) '$(srcdir)/line-width-tolerance.c'; fi` + +cairo_test_suite-line-width-zero.o: line-width-zero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-zero.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-zero.Tpo -c -o cairo_test_suite-line-width-zero.o `test -f 'line-width-zero.c' || echo '$(srcdir)/'`line-width-zero.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-zero.Tpo $(DEPDIR)/cairo_test_suite-line-width-zero.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-zero.c' object='cairo_test_suite-line-width-zero.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-zero.o `test -f 'line-width-zero.c' || echo '$(srcdir)/'`line-width-zero.c + +cairo_test_suite-line-width-zero.obj: line-width-zero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-line-width-zero.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-line-width-zero.Tpo -c -o cairo_test_suite-line-width-zero.obj `if test -f 'line-width-zero.c'; then $(CYGPATH_W) 'line-width-zero.c'; else $(CYGPATH_W) '$(srcdir)/line-width-zero.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-line-width-zero.Tpo $(DEPDIR)/cairo_test_suite-line-width-zero.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='line-width-zero.c' object='cairo_test_suite-line-width-zero.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-line-width-zero.obj `if test -f 'line-width-zero.c'; then $(CYGPATH_W) 'line-width-zero.c'; else $(CYGPATH_W) '$(srcdir)/line-width-zero.c'; fi` + +cairo_test_suite-linear-gradient.o: linear-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient.Tpo -c -o cairo_test_suite-linear-gradient.o `test -f 'linear-gradient.c' || echo '$(srcdir)/'`linear-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient.c' object='cairo_test_suite-linear-gradient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient.o `test -f 'linear-gradient.c' || echo '$(srcdir)/'`linear-gradient.c + +cairo_test_suite-linear-gradient.obj: linear-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient.Tpo -c -o cairo_test_suite-linear-gradient.obj `if test -f 'linear-gradient.c'; then $(CYGPATH_W) 'linear-gradient.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient.c' object='cairo_test_suite-linear-gradient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient.obj `if test -f 'linear-gradient.c'; then $(CYGPATH_W) 'linear-gradient.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient.c'; fi` + +cairo_test_suite-linear-gradient-extend.o: linear-gradient-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-extend.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-extend.Tpo -c -o cairo_test_suite-linear-gradient-extend.o `test -f 'linear-gradient-extend.c' || echo '$(srcdir)/'`linear-gradient-extend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-extend.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-extend.c' object='cairo_test_suite-linear-gradient-extend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-extend.o `test -f 'linear-gradient-extend.c' || echo '$(srcdir)/'`linear-gradient-extend.c + +cairo_test_suite-linear-gradient-extend.obj: linear-gradient-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-extend.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-extend.Tpo -c -o cairo_test_suite-linear-gradient-extend.obj `if test -f 'linear-gradient-extend.c'; then $(CYGPATH_W) 'linear-gradient-extend.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-extend.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-extend.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-extend.c' object='cairo_test_suite-linear-gradient-extend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-extend.obj `if test -f 'linear-gradient-extend.c'; then $(CYGPATH_W) 'linear-gradient-extend.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-extend.c'; fi` + +cairo_test_suite-linear-gradient-large.o: linear-gradient-large.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-large.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-large.Tpo -c -o cairo_test_suite-linear-gradient-large.o `test -f 'linear-gradient-large.c' || echo '$(srcdir)/'`linear-gradient-large.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-large.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-large.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-large.c' object='cairo_test_suite-linear-gradient-large.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-large.o `test -f 'linear-gradient-large.c' || echo '$(srcdir)/'`linear-gradient-large.c + +cairo_test_suite-linear-gradient-large.obj: linear-gradient-large.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-large.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-large.Tpo -c -o cairo_test_suite-linear-gradient-large.obj `if test -f 'linear-gradient-large.c'; then $(CYGPATH_W) 'linear-gradient-large.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-large.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-large.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-large.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-large.c' object='cairo_test_suite-linear-gradient-large.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-large.obj `if test -f 'linear-gradient-large.c'; then $(CYGPATH_W) 'linear-gradient-large.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-large.c'; fi` + +cairo_test_suite-linear-gradient-one-stop.o: linear-gradient-one-stop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-one-stop.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Tpo -c -o cairo_test_suite-linear-gradient-one-stop.o `test -f 'linear-gradient-one-stop.c' || echo '$(srcdir)/'`linear-gradient-one-stop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-one-stop.c' object='cairo_test_suite-linear-gradient-one-stop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-one-stop.o `test -f 'linear-gradient-one-stop.c' || echo '$(srcdir)/'`linear-gradient-one-stop.c + +cairo_test_suite-linear-gradient-one-stop.obj: linear-gradient-one-stop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-one-stop.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Tpo -c -o cairo_test_suite-linear-gradient-one-stop.obj `if test -f 'linear-gradient-one-stop.c'; then $(CYGPATH_W) 'linear-gradient-one-stop.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-one-stop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-one-stop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-one-stop.c' object='cairo_test_suite-linear-gradient-one-stop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-one-stop.obj `if test -f 'linear-gradient-one-stop.c'; then $(CYGPATH_W) 'linear-gradient-one-stop.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-one-stop.c'; fi` + +cairo_test_suite-linear-gradient-reflect.o: linear-gradient-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-reflect.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Tpo -c -o cairo_test_suite-linear-gradient-reflect.o `test -f 'linear-gradient-reflect.c' || echo '$(srcdir)/'`linear-gradient-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-reflect.c' object='cairo_test_suite-linear-gradient-reflect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-reflect.o `test -f 'linear-gradient-reflect.c' || echo '$(srcdir)/'`linear-gradient-reflect.c + +cairo_test_suite-linear-gradient-reflect.obj: linear-gradient-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-reflect.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Tpo -c -o cairo_test_suite-linear-gradient-reflect.obj `if test -f 'linear-gradient-reflect.c'; then $(CYGPATH_W) 'linear-gradient-reflect.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-reflect.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-reflect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-reflect.c' object='cairo_test_suite-linear-gradient-reflect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-reflect.obj `if test -f 'linear-gradient-reflect.c'; then $(CYGPATH_W) 'linear-gradient-reflect.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-reflect.c'; fi` + +cairo_test_suite-linear-gradient-subset.o: linear-gradient-subset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-subset.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-subset.Tpo -c -o cairo_test_suite-linear-gradient-subset.o `test -f 'linear-gradient-subset.c' || echo '$(srcdir)/'`linear-gradient-subset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-subset.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-subset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-subset.c' object='cairo_test_suite-linear-gradient-subset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-subset.o `test -f 'linear-gradient-subset.c' || echo '$(srcdir)/'`linear-gradient-subset.c + +cairo_test_suite-linear-gradient-subset.obj: linear-gradient-subset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-gradient-subset.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-gradient-subset.Tpo -c -o cairo_test_suite-linear-gradient-subset.obj `if test -f 'linear-gradient-subset.c'; then $(CYGPATH_W) 'linear-gradient-subset.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-subset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-gradient-subset.Tpo $(DEPDIR)/cairo_test_suite-linear-gradient-subset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-gradient-subset.c' object='cairo_test_suite-linear-gradient-subset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-gradient-subset.obj `if test -f 'linear-gradient-subset.c'; then $(CYGPATH_W) 'linear-gradient-subset.c'; else $(CYGPATH_W) '$(srcdir)/linear-gradient-subset.c'; fi` + +cairo_test_suite-linear-step-function.o: linear-step-function.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-step-function.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-step-function.Tpo -c -o cairo_test_suite-linear-step-function.o `test -f 'linear-step-function.c' || echo '$(srcdir)/'`linear-step-function.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-step-function.Tpo $(DEPDIR)/cairo_test_suite-linear-step-function.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-step-function.c' object='cairo_test_suite-linear-step-function.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-step-function.o `test -f 'linear-step-function.c' || echo '$(srcdir)/'`linear-step-function.c + +cairo_test_suite-linear-step-function.obj: linear-step-function.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-step-function.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-step-function.Tpo -c -o cairo_test_suite-linear-step-function.obj `if test -f 'linear-step-function.c'; then $(CYGPATH_W) 'linear-step-function.c'; else $(CYGPATH_W) '$(srcdir)/linear-step-function.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-step-function.Tpo $(DEPDIR)/cairo_test_suite-linear-step-function.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-step-function.c' object='cairo_test_suite-linear-step-function.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-step-function.obj `if test -f 'linear-step-function.c'; then $(CYGPATH_W) 'linear-step-function.c'; else $(CYGPATH_W) '$(srcdir)/linear-step-function.c'; fi` + +cairo_test_suite-linear-uniform.o: linear-uniform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-uniform.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-uniform.Tpo -c -o cairo_test_suite-linear-uniform.o `test -f 'linear-uniform.c' || echo '$(srcdir)/'`linear-uniform.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-uniform.Tpo $(DEPDIR)/cairo_test_suite-linear-uniform.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-uniform.c' object='cairo_test_suite-linear-uniform.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-uniform.o `test -f 'linear-uniform.c' || echo '$(srcdir)/'`linear-uniform.c + +cairo_test_suite-linear-uniform.obj: linear-uniform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-linear-uniform.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-linear-uniform.Tpo -c -o cairo_test_suite-linear-uniform.obj `if test -f 'linear-uniform.c'; then $(CYGPATH_W) 'linear-uniform.c'; else $(CYGPATH_W) '$(srcdir)/linear-uniform.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-linear-uniform.Tpo $(DEPDIR)/cairo_test_suite-linear-uniform.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='linear-uniform.c' object='cairo_test_suite-linear-uniform.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-linear-uniform.obj `if test -f 'linear-uniform.c'; then $(CYGPATH_W) 'linear-uniform.c'; else $(CYGPATH_W) '$(srcdir)/linear-uniform.c'; fi` + +cairo_test_suite-long-dashed-lines.o: long-dashed-lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-long-dashed-lines.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-long-dashed-lines.Tpo -c -o cairo_test_suite-long-dashed-lines.o `test -f 'long-dashed-lines.c' || echo '$(srcdir)/'`long-dashed-lines.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-long-dashed-lines.Tpo $(DEPDIR)/cairo_test_suite-long-dashed-lines.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='long-dashed-lines.c' object='cairo_test_suite-long-dashed-lines.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-long-dashed-lines.o `test -f 'long-dashed-lines.c' || echo '$(srcdir)/'`long-dashed-lines.c + +cairo_test_suite-long-dashed-lines.obj: long-dashed-lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-long-dashed-lines.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-long-dashed-lines.Tpo -c -o cairo_test_suite-long-dashed-lines.obj `if test -f 'long-dashed-lines.c'; then $(CYGPATH_W) 'long-dashed-lines.c'; else $(CYGPATH_W) '$(srcdir)/long-dashed-lines.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-long-dashed-lines.Tpo $(DEPDIR)/cairo_test_suite-long-dashed-lines.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='long-dashed-lines.c' object='cairo_test_suite-long-dashed-lines.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-long-dashed-lines.obj `if test -f 'long-dashed-lines.c'; then $(CYGPATH_W) 'long-dashed-lines.c'; else $(CYGPATH_W) '$(srcdir)/long-dashed-lines.c'; fi` + +cairo_test_suite-long-lines.o: long-lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-long-lines.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-long-lines.Tpo -c -o cairo_test_suite-long-lines.o `test -f 'long-lines.c' || echo '$(srcdir)/'`long-lines.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-long-lines.Tpo $(DEPDIR)/cairo_test_suite-long-lines.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='long-lines.c' object='cairo_test_suite-long-lines.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-long-lines.o `test -f 'long-lines.c' || echo '$(srcdir)/'`long-lines.c + +cairo_test_suite-long-lines.obj: long-lines.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-long-lines.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-long-lines.Tpo -c -o cairo_test_suite-long-lines.obj `if test -f 'long-lines.c'; then $(CYGPATH_W) 'long-lines.c'; else $(CYGPATH_W) '$(srcdir)/long-lines.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-long-lines.Tpo $(DEPDIR)/cairo_test_suite-long-lines.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='long-lines.c' object='cairo_test_suite-long-lines.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-long-lines.obj `if test -f 'long-lines.c'; then $(CYGPATH_W) 'long-lines.c'; else $(CYGPATH_W) '$(srcdir)/long-lines.c'; fi` + +cairo_test_suite-map-to-image.o: map-to-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-map-to-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-map-to-image.Tpo -c -o cairo_test_suite-map-to-image.o `test -f 'map-to-image.c' || echo '$(srcdir)/'`map-to-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-map-to-image.Tpo $(DEPDIR)/cairo_test_suite-map-to-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='map-to-image.c' object='cairo_test_suite-map-to-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-map-to-image.o `test -f 'map-to-image.c' || echo '$(srcdir)/'`map-to-image.c + +cairo_test_suite-map-to-image.obj: map-to-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-map-to-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-map-to-image.Tpo -c -o cairo_test_suite-map-to-image.obj `if test -f 'map-to-image.c'; then $(CYGPATH_W) 'map-to-image.c'; else $(CYGPATH_W) '$(srcdir)/map-to-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-map-to-image.Tpo $(DEPDIR)/cairo_test_suite-map-to-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='map-to-image.c' object='cairo_test_suite-map-to-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-map-to-image.obj `if test -f 'map-to-image.c'; then $(CYGPATH_W) 'map-to-image.c'; else $(CYGPATH_W) '$(srcdir)/map-to-image.c'; fi` + +cairo_test_suite-mask.o: mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask.Tpo -c -o cairo_test_suite-mask.o `test -f 'mask.c' || echo '$(srcdir)/'`mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask.Tpo $(DEPDIR)/cairo_test_suite-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask.c' object='cairo_test_suite-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask.o `test -f 'mask.c' || echo '$(srcdir)/'`mask.c + +cairo_test_suite-mask.obj: mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask.Tpo -c -o cairo_test_suite-mask.obj `if test -f 'mask.c'; then $(CYGPATH_W) 'mask.c'; else $(CYGPATH_W) '$(srcdir)/mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask.Tpo $(DEPDIR)/cairo_test_suite-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask.c' object='cairo_test_suite-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask.obj `if test -f 'mask.c'; then $(CYGPATH_W) 'mask.c'; else $(CYGPATH_W) '$(srcdir)/mask.c'; fi` + +cairo_test_suite-mask-alpha.o: mask-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-alpha.Tpo -c -o cairo_test_suite-mask-alpha.o `test -f 'mask-alpha.c' || echo '$(srcdir)/'`mask-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-alpha.Tpo $(DEPDIR)/cairo_test_suite-mask-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-alpha.c' object='cairo_test_suite-mask-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-alpha.o `test -f 'mask-alpha.c' || echo '$(srcdir)/'`mask-alpha.c + +cairo_test_suite-mask-alpha.obj: mask-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-alpha.Tpo -c -o cairo_test_suite-mask-alpha.obj `if test -f 'mask-alpha.c'; then $(CYGPATH_W) 'mask-alpha.c'; else $(CYGPATH_W) '$(srcdir)/mask-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-alpha.Tpo $(DEPDIR)/cairo_test_suite-mask-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-alpha.c' object='cairo_test_suite-mask-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-alpha.obj `if test -f 'mask-alpha.c'; then $(CYGPATH_W) 'mask-alpha.c'; else $(CYGPATH_W) '$(srcdir)/mask-alpha.c'; fi` + +cairo_test_suite-mask-ctm.o: mask-ctm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-ctm.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-ctm.Tpo -c -o cairo_test_suite-mask-ctm.o `test -f 'mask-ctm.c' || echo '$(srcdir)/'`mask-ctm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-ctm.Tpo $(DEPDIR)/cairo_test_suite-mask-ctm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-ctm.c' object='cairo_test_suite-mask-ctm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-ctm.o `test -f 'mask-ctm.c' || echo '$(srcdir)/'`mask-ctm.c + +cairo_test_suite-mask-ctm.obj: mask-ctm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-ctm.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-ctm.Tpo -c -o cairo_test_suite-mask-ctm.obj `if test -f 'mask-ctm.c'; then $(CYGPATH_W) 'mask-ctm.c'; else $(CYGPATH_W) '$(srcdir)/mask-ctm.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-ctm.Tpo $(DEPDIR)/cairo_test_suite-mask-ctm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-ctm.c' object='cairo_test_suite-mask-ctm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-ctm.obj `if test -f 'mask-ctm.c'; then $(CYGPATH_W) 'mask-ctm.c'; else $(CYGPATH_W) '$(srcdir)/mask-ctm.c'; fi` + +cairo_test_suite-mask-glyphs.o: mask-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-glyphs.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-glyphs.Tpo -c -o cairo_test_suite-mask-glyphs.o `test -f 'mask-glyphs.c' || echo '$(srcdir)/'`mask-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-glyphs.Tpo $(DEPDIR)/cairo_test_suite-mask-glyphs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-glyphs.c' object='cairo_test_suite-mask-glyphs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-glyphs.o `test -f 'mask-glyphs.c' || echo '$(srcdir)/'`mask-glyphs.c + +cairo_test_suite-mask-glyphs.obj: mask-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-glyphs.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-glyphs.Tpo -c -o cairo_test_suite-mask-glyphs.obj `if test -f 'mask-glyphs.c'; then $(CYGPATH_W) 'mask-glyphs.c'; else $(CYGPATH_W) '$(srcdir)/mask-glyphs.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-glyphs.Tpo $(DEPDIR)/cairo_test_suite-mask-glyphs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-glyphs.c' object='cairo_test_suite-mask-glyphs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-glyphs.obj `if test -f 'mask-glyphs.c'; then $(CYGPATH_W) 'mask-glyphs.c'; else $(CYGPATH_W) '$(srcdir)/mask-glyphs.c'; fi` + +cairo_test_suite-mask-surface-ctm.o: mask-surface-ctm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-surface-ctm.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-surface-ctm.Tpo -c -o cairo_test_suite-mask-surface-ctm.o `test -f 'mask-surface-ctm.c' || echo '$(srcdir)/'`mask-surface-ctm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-surface-ctm.Tpo $(DEPDIR)/cairo_test_suite-mask-surface-ctm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-surface-ctm.c' object='cairo_test_suite-mask-surface-ctm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-surface-ctm.o `test -f 'mask-surface-ctm.c' || echo '$(srcdir)/'`mask-surface-ctm.c + +cairo_test_suite-mask-surface-ctm.obj: mask-surface-ctm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-surface-ctm.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-surface-ctm.Tpo -c -o cairo_test_suite-mask-surface-ctm.obj `if test -f 'mask-surface-ctm.c'; then $(CYGPATH_W) 'mask-surface-ctm.c'; else $(CYGPATH_W) '$(srcdir)/mask-surface-ctm.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-surface-ctm.Tpo $(DEPDIR)/cairo_test_suite-mask-surface-ctm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-surface-ctm.c' object='cairo_test_suite-mask-surface-ctm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-surface-ctm.obj `if test -f 'mask-surface-ctm.c'; then $(CYGPATH_W) 'mask-surface-ctm.c'; else $(CYGPATH_W) '$(srcdir)/mask-surface-ctm.c'; fi` + +cairo_test_suite-mask-transformed-image.o: mask-transformed-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-transformed-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-transformed-image.Tpo -c -o cairo_test_suite-mask-transformed-image.o `test -f 'mask-transformed-image.c' || echo '$(srcdir)/'`mask-transformed-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-transformed-image.Tpo $(DEPDIR)/cairo_test_suite-mask-transformed-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-transformed-image.c' object='cairo_test_suite-mask-transformed-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-transformed-image.o `test -f 'mask-transformed-image.c' || echo '$(srcdir)/'`mask-transformed-image.c + +cairo_test_suite-mask-transformed-image.obj: mask-transformed-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-transformed-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-transformed-image.Tpo -c -o cairo_test_suite-mask-transformed-image.obj `if test -f 'mask-transformed-image.c'; then $(CYGPATH_W) 'mask-transformed-image.c'; else $(CYGPATH_W) '$(srcdir)/mask-transformed-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-transformed-image.Tpo $(DEPDIR)/cairo_test_suite-mask-transformed-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-transformed-image.c' object='cairo_test_suite-mask-transformed-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-transformed-image.obj `if test -f 'mask-transformed-image.c'; then $(CYGPATH_W) 'mask-transformed-image.c'; else $(CYGPATH_W) '$(srcdir)/mask-transformed-image.c'; fi` + +cairo_test_suite-mask-transformed-similar.o: mask-transformed-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-transformed-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-transformed-similar.Tpo -c -o cairo_test_suite-mask-transformed-similar.o `test -f 'mask-transformed-similar.c' || echo '$(srcdir)/'`mask-transformed-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-transformed-similar.Tpo $(DEPDIR)/cairo_test_suite-mask-transformed-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-transformed-similar.c' object='cairo_test_suite-mask-transformed-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-transformed-similar.o `test -f 'mask-transformed-similar.c' || echo '$(srcdir)/'`mask-transformed-similar.c + +cairo_test_suite-mask-transformed-similar.obj: mask-transformed-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mask-transformed-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mask-transformed-similar.Tpo -c -o cairo_test_suite-mask-transformed-similar.obj `if test -f 'mask-transformed-similar.c'; then $(CYGPATH_W) 'mask-transformed-similar.c'; else $(CYGPATH_W) '$(srcdir)/mask-transformed-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mask-transformed-similar.Tpo $(DEPDIR)/cairo_test_suite-mask-transformed-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mask-transformed-similar.c' object='cairo_test_suite-mask-transformed-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mask-transformed-similar.obj `if test -f 'mask-transformed-similar.c'; then $(CYGPATH_W) 'mask-transformed-similar.c'; else $(CYGPATH_W) '$(srcdir)/mask-transformed-similar.c'; fi` + +cairo_test_suite-mesh-pattern.o: mesh-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern.Tpo -c -o cairo_test_suite-mesh-pattern.o `test -f 'mesh-pattern.c' || echo '$(srcdir)/'`mesh-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern.c' object='cairo_test_suite-mesh-pattern.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern.o `test -f 'mesh-pattern.c' || echo '$(srcdir)/'`mesh-pattern.c + +cairo_test_suite-mesh-pattern.obj: mesh-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern.Tpo -c -o cairo_test_suite-mesh-pattern.obj `if test -f 'mesh-pattern.c'; then $(CYGPATH_W) 'mesh-pattern.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern.c' object='cairo_test_suite-mesh-pattern.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern.obj `if test -f 'mesh-pattern.c'; then $(CYGPATH_W) 'mesh-pattern.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern.c'; fi` + +cairo_test_suite-mesh-pattern-accuracy.o: mesh-pattern-accuracy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-accuracy.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Tpo -c -o cairo_test_suite-mesh-pattern-accuracy.o `test -f 'mesh-pattern-accuracy.c' || echo '$(srcdir)/'`mesh-pattern-accuracy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-accuracy.c' object='cairo_test_suite-mesh-pattern-accuracy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-accuracy.o `test -f 'mesh-pattern-accuracy.c' || echo '$(srcdir)/'`mesh-pattern-accuracy.c + +cairo_test_suite-mesh-pattern-accuracy.obj: mesh-pattern-accuracy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-accuracy.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Tpo -c -o cairo_test_suite-mesh-pattern-accuracy.obj `if test -f 'mesh-pattern-accuracy.c'; then $(CYGPATH_W) 'mesh-pattern-accuracy.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-accuracy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-accuracy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-accuracy.c' object='cairo_test_suite-mesh-pattern-accuracy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-accuracy.obj `if test -f 'mesh-pattern-accuracy.c'; then $(CYGPATH_W) 'mesh-pattern-accuracy.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-accuracy.c'; fi` + +cairo_test_suite-mesh-pattern-conical.o: mesh-pattern-conical.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-conical.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Tpo -c -o cairo_test_suite-mesh-pattern-conical.o `test -f 'mesh-pattern-conical.c' || echo '$(srcdir)/'`mesh-pattern-conical.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-conical.c' object='cairo_test_suite-mesh-pattern-conical.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-conical.o `test -f 'mesh-pattern-conical.c' || echo '$(srcdir)/'`mesh-pattern-conical.c + +cairo_test_suite-mesh-pattern-conical.obj: mesh-pattern-conical.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-conical.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Tpo -c -o cairo_test_suite-mesh-pattern-conical.obj `if test -f 'mesh-pattern-conical.c'; then $(CYGPATH_W) 'mesh-pattern-conical.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-conical.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-conical.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-conical.c' object='cairo_test_suite-mesh-pattern-conical.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-conical.obj `if test -f 'mesh-pattern-conical.c'; then $(CYGPATH_W) 'mesh-pattern-conical.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-conical.c'; fi` + +cairo_test_suite-mesh-pattern-control-points.o: mesh-pattern-control-points.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-control-points.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Tpo -c -o cairo_test_suite-mesh-pattern-control-points.o `test -f 'mesh-pattern-control-points.c' || echo '$(srcdir)/'`mesh-pattern-control-points.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-control-points.c' object='cairo_test_suite-mesh-pattern-control-points.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-control-points.o `test -f 'mesh-pattern-control-points.c' || echo '$(srcdir)/'`mesh-pattern-control-points.c + +cairo_test_suite-mesh-pattern-control-points.obj: mesh-pattern-control-points.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-control-points.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Tpo -c -o cairo_test_suite-mesh-pattern-control-points.obj `if test -f 'mesh-pattern-control-points.c'; then $(CYGPATH_W) 'mesh-pattern-control-points.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-control-points.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-control-points.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-control-points.c' object='cairo_test_suite-mesh-pattern-control-points.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-control-points.obj `if test -f 'mesh-pattern-control-points.c'; then $(CYGPATH_W) 'mesh-pattern-control-points.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-control-points.c'; fi` + +cairo_test_suite-mesh-pattern-fold.o: mesh-pattern-fold.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-fold.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Tpo -c -o cairo_test_suite-mesh-pattern-fold.o `test -f 'mesh-pattern-fold.c' || echo '$(srcdir)/'`mesh-pattern-fold.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-fold.c' object='cairo_test_suite-mesh-pattern-fold.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-fold.o `test -f 'mesh-pattern-fold.c' || echo '$(srcdir)/'`mesh-pattern-fold.c + +cairo_test_suite-mesh-pattern-fold.obj: mesh-pattern-fold.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-fold.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Tpo -c -o cairo_test_suite-mesh-pattern-fold.obj `if test -f 'mesh-pattern-fold.c'; then $(CYGPATH_W) 'mesh-pattern-fold.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-fold.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-fold.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-fold.c' object='cairo_test_suite-mesh-pattern-fold.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-fold.obj `if test -f 'mesh-pattern-fold.c'; then $(CYGPATH_W) 'mesh-pattern-fold.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-fold.c'; fi` + +cairo_test_suite-mesh-pattern-overlap.o: mesh-pattern-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-overlap.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Tpo -c -o cairo_test_suite-mesh-pattern-overlap.o `test -f 'mesh-pattern-overlap.c' || echo '$(srcdir)/'`mesh-pattern-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-overlap.c' object='cairo_test_suite-mesh-pattern-overlap.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-overlap.o `test -f 'mesh-pattern-overlap.c' || echo '$(srcdir)/'`mesh-pattern-overlap.c + +cairo_test_suite-mesh-pattern-overlap.obj: mesh-pattern-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-overlap.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Tpo -c -o cairo_test_suite-mesh-pattern-overlap.obj `if test -f 'mesh-pattern-overlap.c'; then $(CYGPATH_W) 'mesh-pattern-overlap.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-overlap.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-overlap.c' object='cairo_test_suite-mesh-pattern-overlap.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-overlap.obj `if test -f 'mesh-pattern-overlap.c'; then $(CYGPATH_W) 'mesh-pattern-overlap.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-overlap.c'; fi` + +cairo_test_suite-mesh-pattern-transformed.o: mesh-pattern-transformed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-transformed.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Tpo -c -o cairo_test_suite-mesh-pattern-transformed.o `test -f 'mesh-pattern-transformed.c' || echo '$(srcdir)/'`mesh-pattern-transformed.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-transformed.c' object='cairo_test_suite-mesh-pattern-transformed.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-transformed.o `test -f 'mesh-pattern-transformed.c' || echo '$(srcdir)/'`mesh-pattern-transformed.c + +cairo_test_suite-mesh-pattern-transformed.obj: mesh-pattern-transformed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mesh-pattern-transformed.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Tpo -c -o cairo_test_suite-mesh-pattern-transformed.obj `if test -f 'mesh-pattern-transformed.c'; then $(CYGPATH_W) 'mesh-pattern-transformed.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-transformed.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Tpo $(DEPDIR)/cairo_test_suite-mesh-pattern-transformed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mesh-pattern-transformed.c' object='cairo_test_suite-mesh-pattern-transformed.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mesh-pattern-transformed.obj `if test -f 'mesh-pattern-transformed.c'; then $(CYGPATH_W) 'mesh-pattern-transformed.c'; else $(CYGPATH_W) '$(srcdir)/mesh-pattern-transformed.c'; fi` + +cairo_test_suite-mime-data.o: mime-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mime-data.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mime-data.Tpo -c -o cairo_test_suite-mime-data.o `test -f 'mime-data.c' || echo '$(srcdir)/'`mime-data.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mime-data.Tpo $(DEPDIR)/cairo_test_suite-mime-data.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mime-data.c' object='cairo_test_suite-mime-data.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mime-data.o `test -f 'mime-data.c' || echo '$(srcdir)/'`mime-data.c + +cairo_test_suite-mime-data.obj: mime-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mime-data.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mime-data.Tpo -c -o cairo_test_suite-mime-data.obj `if test -f 'mime-data.c'; then $(CYGPATH_W) 'mime-data.c'; else $(CYGPATH_W) '$(srcdir)/mime-data.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mime-data.Tpo $(DEPDIR)/cairo_test_suite-mime-data.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mime-data.c' object='cairo_test_suite-mime-data.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mime-data.obj `if test -f 'mime-data.c'; then $(CYGPATH_W) 'mime-data.c'; else $(CYGPATH_W) '$(srcdir)/mime-data.c'; fi` + +cairo_test_suite-mime-surface-api.o: mime-surface-api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mime-surface-api.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-mime-surface-api.Tpo -c -o cairo_test_suite-mime-surface-api.o `test -f 'mime-surface-api.c' || echo '$(srcdir)/'`mime-surface-api.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mime-surface-api.Tpo $(DEPDIR)/cairo_test_suite-mime-surface-api.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mime-surface-api.c' object='cairo_test_suite-mime-surface-api.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mime-surface-api.o `test -f 'mime-surface-api.c' || echo '$(srcdir)/'`mime-surface-api.c + +cairo_test_suite-mime-surface-api.obj: mime-surface-api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-mime-surface-api.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-mime-surface-api.Tpo -c -o cairo_test_suite-mime-surface-api.obj `if test -f 'mime-surface-api.c'; then $(CYGPATH_W) 'mime-surface-api.c'; else $(CYGPATH_W) '$(srcdir)/mime-surface-api.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-mime-surface-api.Tpo $(DEPDIR)/cairo_test_suite-mime-surface-api.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mime-surface-api.c' object='cairo_test_suite-mime-surface-api.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-mime-surface-api.obj `if test -f 'mime-surface-api.c'; then $(CYGPATH_W) 'mime-surface-api.c'; else $(CYGPATH_W) '$(srcdir)/mime-surface-api.c'; fi` + +cairo_test_suite-miter-precision.o: miter-precision.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-miter-precision.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-miter-precision.Tpo -c -o cairo_test_suite-miter-precision.o `test -f 'miter-precision.c' || echo '$(srcdir)/'`miter-precision.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-miter-precision.Tpo $(DEPDIR)/cairo_test_suite-miter-precision.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='miter-precision.c' object='cairo_test_suite-miter-precision.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-miter-precision.o `test -f 'miter-precision.c' || echo '$(srcdir)/'`miter-precision.c + +cairo_test_suite-miter-precision.obj: miter-precision.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-miter-precision.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-miter-precision.Tpo -c -o cairo_test_suite-miter-precision.obj `if test -f 'miter-precision.c'; then $(CYGPATH_W) 'miter-precision.c'; else $(CYGPATH_W) '$(srcdir)/miter-precision.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-miter-precision.Tpo $(DEPDIR)/cairo_test_suite-miter-precision.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='miter-precision.c' object='cairo_test_suite-miter-precision.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-miter-precision.obj `if test -f 'miter-precision.c'; then $(CYGPATH_W) 'miter-precision.c'; else $(CYGPATH_W) '$(srcdir)/miter-precision.c'; fi` + +cairo_test_suite-move-to-show-surface.o: move-to-show-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-move-to-show-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-move-to-show-surface.Tpo -c -o cairo_test_suite-move-to-show-surface.o `test -f 'move-to-show-surface.c' || echo '$(srcdir)/'`move-to-show-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-move-to-show-surface.Tpo $(DEPDIR)/cairo_test_suite-move-to-show-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='move-to-show-surface.c' object='cairo_test_suite-move-to-show-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-move-to-show-surface.o `test -f 'move-to-show-surface.c' || echo '$(srcdir)/'`move-to-show-surface.c + +cairo_test_suite-move-to-show-surface.obj: move-to-show-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-move-to-show-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-move-to-show-surface.Tpo -c -o cairo_test_suite-move-to-show-surface.obj `if test -f 'move-to-show-surface.c'; then $(CYGPATH_W) 'move-to-show-surface.c'; else $(CYGPATH_W) '$(srcdir)/move-to-show-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-move-to-show-surface.Tpo $(DEPDIR)/cairo_test_suite-move-to-show-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='move-to-show-surface.c' object='cairo_test_suite-move-to-show-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-move-to-show-surface.obj `if test -f 'move-to-show-surface.c'; then $(CYGPATH_W) 'move-to-show-surface.c'; else $(CYGPATH_W) '$(srcdir)/move-to-show-surface.c'; fi` + +cairo_test_suite-negative-stride-image.o: negative-stride-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-negative-stride-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-negative-stride-image.Tpo -c -o cairo_test_suite-negative-stride-image.o `test -f 'negative-stride-image.c' || echo '$(srcdir)/'`negative-stride-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-negative-stride-image.Tpo $(DEPDIR)/cairo_test_suite-negative-stride-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='negative-stride-image.c' object='cairo_test_suite-negative-stride-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-negative-stride-image.o `test -f 'negative-stride-image.c' || echo '$(srcdir)/'`negative-stride-image.c + +cairo_test_suite-negative-stride-image.obj: negative-stride-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-negative-stride-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-negative-stride-image.Tpo -c -o cairo_test_suite-negative-stride-image.obj `if test -f 'negative-stride-image.c'; then $(CYGPATH_W) 'negative-stride-image.c'; else $(CYGPATH_W) '$(srcdir)/negative-stride-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-negative-stride-image.Tpo $(DEPDIR)/cairo_test_suite-negative-stride-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='negative-stride-image.c' object='cairo_test_suite-negative-stride-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-negative-stride-image.obj `if test -f 'negative-stride-image.c'; then $(CYGPATH_W) 'negative-stride-image.c'; else $(CYGPATH_W) '$(srcdir)/negative-stride-image.c'; fi` + +cairo_test_suite-new-sub-path.o: new-sub-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-new-sub-path.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-new-sub-path.Tpo -c -o cairo_test_suite-new-sub-path.o `test -f 'new-sub-path.c' || echo '$(srcdir)/'`new-sub-path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-new-sub-path.Tpo $(DEPDIR)/cairo_test_suite-new-sub-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='new-sub-path.c' object='cairo_test_suite-new-sub-path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-new-sub-path.o `test -f 'new-sub-path.c' || echo '$(srcdir)/'`new-sub-path.c + +cairo_test_suite-new-sub-path.obj: new-sub-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-new-sub-path.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-new-sub-path.Tpo -c -o cairo_test_suite-new-sub-path.obj `if test -f 'new-sub-path.c'; then $(CYGPATH_W) 'new-sub-path.c'; else $(CYGPATH_W) '$(srcdir)/new-sub-path.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-new-sub-path.Tpo $(DEPDIR)/cairo_test_suite-new-sub-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='new-sub-path.c' object='cairo_test_suite-new-sub-path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-new-sub-path.obj `if test -f 'new-sub-path.c'; then $(CYGPATH_W) 'new-sub-path.c'; else $(CYGPATH_W) '$(srcdir)/new-sub-path.c'; fi` + +cairo_test_suite-nil-surface.o: nil-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-nil-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-nil-surface.Tpo -c -o cairo_test_suite-nil-surface.o `test -f 'nil-surface.c' || echo '$(srcdir)/'`nil-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-nil-surface.Tpo $(DEPDIR)/cairo_test_suite-nil-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nil-surface.c' object='cairo_test_suite-nil-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-nil-surface.o `test -f 'nil-surface.c' || echo '$(srcdir)/'`nil-surface.c + +cairo_test_suite-nil-surface.obj: nil-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-nil-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-nil-surface.Tpo -c -o cairo_test_suite-nil-surface.obj `if test -f 'nil-surface.c'; then $(CYGPATH_W) 'nil-surface.c'; else $(CYGPATH_W) '$(srcdir)/nil-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-nil-surface.Tpo $(DEPDIR)/cairo_test_suite-nil-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='nil-surface.c' object='cairo_test_suite-nil-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-nil-surface.obj `if test -f 'nil-surface.c'; then $(CYGPATH_W) 'nil-surface.c'; else $(CYGPATH_W) '$(srcdir)/nil-surface.c'; fi` + +cairo_test_suite-operator.o: operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator.Tpo -c -o cairo_test_suite-operator.o `test -f 'operator.c' || echo '$(srcdir)/'`operator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator.Tpo $(DEPDIR)/cairo_test_suite-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator.c' object='cairo_test_suite-operator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator.o `test -f 'operator.c' || echo '$(srcdir)/'`operator.c + +cairo_test_suite-operator.obj: operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator.Tpo -c -o cairo_test_suite-operator.obj `if test -f 'operator.c'; then $(CYGPATH_W) 'operator.c'; else $(CYGPATH_W) '$(srcdir)/operator.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator.Tpo $(DEPDIR)/cairo_test_suite-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator.c' object='cairo_test_suite-operator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator.obj `if test -f 'operator.c'; then $(CYGPATH_W) 'operator.c'; else $(CYGPATH_W) '$(srcdir)/operator.c'; fi` + +cairo_test_suite-operator-alpha.o: operator-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-alpha.Tpo -c -o cairo_test_suite-operator-alpha.o `test -f 'operator-alpha.c' || echo '$(srcdir)/'`operator-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-alpha.Tpo $(DEPDIR)/cairo_test_suite-operator-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-alpha.c' object='cairo_test_suite-operator-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-alpha.o `test -f 'operator-alpha.c' || echo '$(srcdir)/'`operator-alpha.c + +cairo_test_suite-operator-alpha.obj: operator-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-alpha.Tpo -c -o cairo_test_suite-operator-alpha.obj `if test -f 'operator-alpha.c'; then $(CYGPATH_W) 'operator-alpha.c'; else $(CYGPATH_W) '$(srcdir)/operator-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-alpha.Tpo $(DEPDIR)/cairo_test_suite-operator-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-alpha.c' object='cairo_test_suite-operator-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-alpha.obj `if test -f 'operator-alpha.c'; then $(CYGPATH_W) 'operator-alpha.c'; else $(CYGPATH_W) '$(srcdir)/operator-alpha.c'; fi` + +cairo_test_suite-operator-alpha-alpha.o: operator-alpha-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-alpha-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Tpo -c -o cairo_test_suite-operator-alpha-alpha.o `test -f 'operator-alpha-alpha.c' || echo '$(srcdir)/'`operator-alpha-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Tpo $(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-alpha-alpha.c' object='cairo_test_suite-operator-alpha-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-alpha-alpha.o `test -f 'operator-alpha-alpha.c' || echo '$(srcdir)/'`operator-alpha-alpha.c + +cairo_test_suite-operator-alpha-alpha.obj: operator-alpha-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-alpha-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Tpo -c -o cairo_test_suite-operator-alpha-alpha.obj `if test -f 'operator-alpha-alpha.c'; then $(CYGPATH_W) 'operator-alpha-alpha.c'; else $(CYGPATH_W) '$(srcdir)/operator-alpha-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Tpo $(DEPDIR)/cairo_test_suite-operator-alpha-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-alpha-alpha.c' object='cairo_test_suite-operator-alpha-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-alpha-alpha.obj `if test -f 'operator-alpha-alpha.c'; then $(CYGPATH_W) 'operator-alpha-alpha.c'; else $(CYGPATH_W) '$(srcdir)/operator-alpha-alpha.c'; fi` + +cairo_test_suite-operator-clear.o: operator-clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-clear.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-clear.Tpo -c -o cairo_test_suite-operator-clear.o `test -f 'operator-clear.c' || echo '$(srcdir)/'`operator-clear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-clear.Tpo $(DEPDIR)/cairo_test_suite-operator-clear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-clear.c' object='cairo_test_suite-operator-clear.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-clear.o `test -f 'operator-clear.c' || echo '$(srcdir)/'`operator-clear.c + +cairo_test_suite-operator-clear.obj: operator-clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-clear.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-clear.Tpo -c -o cairo_test_suite-operator-clear.obj `if test -f 'operator-clear.c'; then $(CYGPATH_W) 'operator-clear.c'; else $(CYGPATH_W) '$(srcdir)/operator-clear.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-clear.Tpo $(DEPDIR)/cairo_test_suite-operator-clear.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-clear.c' object='cairo_test_suite-operator-clear.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-clear.obj `if test -f 'operator-clear.c'; then $(CYGPATH_W) 'operator-clear.c'; else $(CYGPATH_W) '$(srcdir)/operator-clear.c'; fi` + +cairo_test_suite-operator-source.o: operator-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-source.Tpo -c -o cairo_test_suite-operator-source.o `test -f 'operator-source.c' || echo '$(srcdir)/'`operator-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-source.Tpo $(DEPDIR)/cairo_test_suite-operator-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-source.c' object='cairo_test_suite-operator-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-source.o `test -f 'operator-source.c' || echo '$(srcdir)/'`operator-source.c + +cairo_test_suite-operator-source.obj: operator-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-operator-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-operator-source.Tpo -c -o cairo_test_suite-operator-source.obj `if test -f 'operator-source.c'; then $(CYGPATH_W) 'operator-source.c'; else $(CYGPATH_W) '$(srcdir)/operator-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-operator-source.Tpo $(DEPDIR)/cairo_test_suite-operator-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='operator-source.c' object='cairo_test_suite-operator-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-operator-source.obj `if test -f 'operator-source.c'; then $(CYGPATH_W) 'operator-source.c'; else $(CYGPATH_W) '$(srcdir)/operator-source.c'; fi` + +cairo_test_suite-outline-tolerance.o: outline-tolerance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-outline-tolerance.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-outline-tolerance.Tpo -c -o cairo_test_suite-outline-tolerance.o `test -f 'outline-tolerance.c' || echo '$(srcdir)/'`outline-tolerance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-outline-tolerance.Tpo $(DEPDIR)/cairo_test_suite-outline-tolerance.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='outline-tolerance.c' object='cairo_test_suite-outline-tolerance.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-outline-tolerance.o `test -f 'outline-tolerance.c' || echo '$(srcdir)/'`outline-tolerance.c + +cairo_test_suite-outline-tolerance.obj: outline-tolerance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-outline-tolerance.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-outline-tolerance.Tpo -c -o cairo_test_suite-outline-tolerance.obj `if test -f 'outline-tolerance.c'; then $(CYGPATH_W) 'outline-tolerance.c'; else $(CYGPATH_W) '$(srcdir)/outline-tolerance.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-outline-tolerance.Tpo $(DEPDIR)/cairo_test_suite-outline-tolerance.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='outline-tolerance.c' object='cairo_test_suite-outline-tolerance.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-outline-tolerance.obj `if test -f 'outline-tolerance.c'; then $(CYGPATH_W) 'outline-tolerance.c'; else $(CYGPATH_W) '$(srcdir)/outline-tolerance.c'; fi` + +cairo_test_suite-over-above-source.o: over-above-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-above-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-above-source.Tpo -c -o cairo_test_suite-over-above-source.o `test -f 'over-above-source.c' || echo '$(srcdir)/'`over-above-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-above-source.Tpo $(DEPDIR)/cairo_test_suite-over-above-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-above-source.c' object='cairo_test_suite-over-above-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-above-source.o `test -f 'over-above-source.c' || echo '$(srcdir)/'`over-above-source.c + +cairo_test_suite-over-above-source.obj: over-above-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-above-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-above-source.Tpo -c -o cairo_test_suite-over-above-source.obj `if test -f 'over-above-source.c'; then $(CYGPATH_W) 'over-above-source.c'; else $(CYGPATH_W) '$(srcdir)/over-above-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-above-source.Tpo $(DEPDIR)/cairo_test_suite-over-above-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-above-source.c' object='cairo_test_suite-over-above-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-above-source.obj `if test -f 'over-above-source.c'; then $(CYGPATH_W) 'over-above-source.c'; else $(CYGPATH_W) '$(srcdir)/over-above-source.c'; fi` + +cairo_test_suite-over-around-source.o: over-around-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-around-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-around-source.Tpo -c -o cairo_test_suite-over-around-source.o `test -f 'over-around-source.c' || echo '$(srcdir)/'`over-around-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-around-source.Tpo $(DEPDIR)/cairo_test_suite-over-around-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-around-source.c' object='cairo_test_suite-over-around-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-around-source.o `test -f 'over-around-source.c' || echo '$(srcdir)/'`over-around-source.c + +cairo_test_suite-over-around-source.obj: over-around-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-around-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-around-source.Tpo -c -o cairo_test_suite-over-around-source.obj `if test -f 'over-around-source.c'; then $(CYGPATH_W) 'over-around-source.c'; else $(CYGPATH_W) '$(srcdir)/over-around-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-around-source.Tpo $(DEPDIR)/cairo_test_suite-over-around-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-around-source.c' object='cairo_test_suite-over-around-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-around-source.obj `if test -f 'over-around-source.c'; then $(CYGPATH_W) 'over-around-source.c'; else $(CYGPATH_W) '$(srcdir)/over-around-source.c'; fi` + +cairo_test_suite-over-below-source.o: over-below-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-below-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-below-source.Tpo -c -o cairo_test_suite-over-below-source.o `test -f 'over-below-source.c' || echo '$(srcdir)/'`over-below-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-below-source.Tpo $(DEPDIR)/cairo_test_suite-over-below-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-below-source.c' object='cairo_test_suite-over-below-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-below-source.o `test -f 'over-below-source.c' || echo '$(srcdir)/'`over-below-source.c + +cairo_test_suite-over-below-source.obj: over-below-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-below-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-below-source.Tpo -c -o cairo_test_suite-over-below-source.obj `if test -f 'over-below-source.c'; then $(CYGPATH_W) 'over-below-source.c'; else $(CYGPATH_W) '$(srcdir)/over-below-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-below-source.Tpo $(DEPDIR)/cairo_test_suite-over-below-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-below-source.c' object='cairo_test_suite-over-below-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-below-source.obj `if test -f 'over-below-source.c'; then $(CYGPATH_W) 'over-below-source.c'; else $(CYGPATH_W) '$(srcdir)/over-below-source.c'; fi` + +cairo_test_suite-over-between-source.o: over-between-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-between-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-between-source.Tpo -c -o cairo_test_suite-over-between-source.o `test -f 'over-between-source.c' || echo '$(srcdir)/'`over-between-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-between-source.Tpo $(DEPDIR)/cairo_test_suite-over-between-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-between-source.c' object='cairo_test_suite-over-between-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-between-source.o `test -f 'over-between-source.c' || echo '$(srcdir)/'`over-between-source.c + +cairo_test_suite-over-between-source.obj: over-between-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-over-between-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-over-between-source.Tpo -c -o cairo_test_suite-over-between-source.obj `if test -f 'over-between-source.c'; then $(CYGPATH_W) 'over-between-source.c'; else $(CYGPATH_W) '$(srcdir)/over-between-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-over-between-source.Tpo $(DEPDIR)/cairo_test_suite-over-between-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='over-between-source.c' object='cairo_test_suite-over-between-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-over-between-source.obj `if test -f 'over-between-source.c'; then $(CYGPATH_W) 'over-between-source.c'; else $(CYGPATH_W) '$(srcdir)/over-between-source.c'; fi` + +cairo_test_suite-overlapping-boxes.o: overlapping-boxes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-overlapping-boxes.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-overlapping-boxes.Tpo -c -o cairo_test_suite-overlapping-boxes.o `test -f 'overlapping-boxes.c' || echo '$(srcdir)/'`overlapping-boxes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-overlapping-boxes.Tpo $(DEPDIR)/cairo_test_suite-overlapping-boxes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlapping-boxes.c' object='cairo_test_suite-overlapping-boxes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-overlapping-boxes.o `test -f 'overlapping-boxes.c' || echo '$(srcdir)/'`overlapping-boxes.c + +cairo_test_suite-overlapping-boxes.obj: overlapping-boxes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-overlapping-boxes.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-overlapping-boxes.Tpo -c -o cairo_test_suite-overlapping-boxes.obj `if test -f 'overlapping-boxes.c'; then $(CYGPATH_W) 'overlapping-boxes.c'; else $(CYGPATH_W) '$(srcdir)/overlapping-boxes.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-overlapping-boxes.Tpo $(DEPDIR)/cairo_test_suite-overlapping-boxes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlapping-boxes.c' object='cairo_test_suite-overlapping-boxes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-overlapping-boxes.obj `if test -f 'overlapping-boxes.c'; then $(CYGPATH_W) 'overlapping-boxes.c'; else $(CYGPATH_W) '$(srcdir)/overlapping-boxes.c'; fi` + +cairo_test_suite-overlapping-glyphs.o: overlapping-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-overlapping-glyphs.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-overlapping-glyphs.Tpo -c -o cairo_test_suite-overlapping-glyphs.o `test -f 'overlapping-glyphs.c' || echo '$(srcdir)/'`overlapping-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-overlapping-glyphs.Tpo $(DEPDIR)/cairo_test_suite-overlapping-glyphs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlapping-glyphs.c' object='cairo_test_suite-overlapping-glyphs.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-overlapping-glyphs.o `test -f 'overlapping-glyphs.c' || echo '$(srcdir)/'`overlapping-glyphs.c + +cairo_test_suite-overlapping-glyphs.obj: overlapping-glyphs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-overlapping-glyphs.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-overlapping-glyphs.Tpo -c -o cairo_test_suite-overlapping-glyphs.obj `if test -f 'overlapping-glyphs.c'; then $(CYGPATH_W) 'overlapping-glyphs.c'; else $(CYGPATH_W) '$(srcdir)/overlapping-glyphs.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-overlapping-glyphs.Tpo $(DEPDIR)/cairo_test_suite-overlapping-glyphs.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlapping-glyphs.c' object='cairo_test_suite-overlapping-glyphs.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-overlapping-glyphs.obj `if test -f 'overlapping-glyphs.c'; then $(CYGPATH_W) 'overlapping-glyphs.c'; else $(CYGPATH_W) '$(srcdir)/overlapping-glyphs.c'; fi` + +cairo_test_suite-overlapping-dash-caps.o: overlapping-dash-caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-overlapping-dash-caps.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Tpo -c -o cairo_test_suite-overlapping-dash-caps.o `test -f 'overlapping-dash-caps.c' || echo '$(srcdir)/'`overlapping-dash-caps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Tpo $(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlapping-dash-caps.c' object='cairo_test_suite-overlapping-dash-caps.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-overlapping-dash-caps.o `test -f 'overlapping-dash-caps.c' || echo '$(srcdir)/'`overlapping-dash-caps.c + +cairo_test_suite-overlapping-dash-caps.obj: overlapping-dash-caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-overlapping-dash-caps.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Tpo -c -o cairo_test_suite-overlapping-dash-caps.obj `if test -f 'overlapping-dash-caps.c'; then $(CYGPATH_W) 'overlapping-dash-caps.c'; else $(CYGPATH_W) '$(srcdir)/overlapping-dash-caps.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Tpo $(DEPDIR)/cairo_test_suite-overlapping-dash-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlapping-dash-caps.c' object='cairo_test_suite-overlapping-dash-caps.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-overlapping-dash-caps.obj `if test -f 'overlapping-dash-caps.c'; then $(CYGPATH_W) 'overlapping-dash-caps.c'; else $(CYGPATH_W) '$(srcdir)/overlapping-dash-caps.c'; fi` + +cairo_test_suite-paint.o: paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint.Tpo -c -o cairo_test_suite-paint.o `test -f 'paint.c' || echo '$(srcdir)/'`paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint.Tpo $(DEPDIR)/cairo_test_suite-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint.c' object='cairo_test_suite-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint.o `test -f 'paint.c' || echo '$(srcdir)/'`paint.c + +cairo_test_suite-paint.obj: paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint.Tpo -c -o cairo_test_suite-paint.obj `if test -f 'paint.c'; then $(CYGPATH_W) 'paint.c'; else $(CYGPATH_W) '$(srcdir)/paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint.Tpo $(DEPDIR)/cairo_test_suite-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint.c' object='cairo_test_suite-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint.obj `if test -f 'paint.c'; then $(CYGPATH_W) 'paint.c'; else $(CYGPATH_W) '$(srcdir)/paint.c'; fi` + +cairo_test_suite-paint-clip-fill.o: paint-clip-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-clip-fill.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-clip-fill.Tpo -c -o cairo_test_suite-paint-clip-fill.o `test -f 'paint-clip-fill.c' || echo '$(srcdir)/'`paint-clip-fill.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-clip-fill.Tpo $(DEPDIR)/cairo_test_suite-paint-clip-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-clip-fill.c' object='cairo_test_suite-paint-clip-fill.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-clip-fill.o `test -f 'paint-clip-fill.c' || echo '$(srcdir)/'`paint-clip-fill.c + +cairo_test_suite-paint-clip-fill.obj: paint-clip-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-clip-fill.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-clip-fill.Tpo -c -o cairo_test_suite-paint-clip-fill.obj `if test -f 'paint-clip-fill.c'; then $(CYGPATH_W) 'paint-clip-fill.c'; else $(CYGPATH_W) '$(srcdir)/paint-clip-fill.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-clip-fill.Tpo $(DEPDIR)/cairo_test_suite-paint-clip-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-clip-fill.c' object='cairo_test_suite-paint-clip-fill.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-clip-fill.obj `if test -f 'paint-clip-fill.c'; then $(CYGPATH_W) 'paint-clip-fill.c'; else $(CYGPATH_W) '$(srcdir)/paint-clip-fill.c'; fi` + +cairo_test_suite-paint-repeat.o: paint-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-repeat.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-repeat.Tpo -c -o cairo_test_suite-paint-repeat.o `test -f 'paint-repeat.c' || echo '$(srcdir)/'`paint-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-repeat.Tpo $(DEPDIR)/cairo_test_suite-paint-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-repeat.c' object='cairo_test_suite-paint-repeat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-repeat.o `test -f 'paint-repeat.c' || echo '$(srcdir)/'`paint-repeat.c + +cairo_test_suite-paint-repeat.obj: paint-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-repeat.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-repeat.Tpo -c -o cairo_test_suite-paint-repeat.obj `if test -f 'paint-repeat.c'; then $(CYGPATH_W) 'paint-repeat.c'; else $(CYGPATH_W) '$(srcdir)/paint-repeat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-repeat.Tpo $(DEPDIR)/cairo_test_suite-paint-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-repeat.c' object='cairo_test_suite-paint-repeat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-repeat.obj `if test -f 'paint-repeat.c'; then $(CYGPATH_W) 'paint-repeat.c'; else $(CYGPATH_W) '$(srcdir)/paint-repeat.c'; fi` + +cairo_test_suite-paint-source-alpha.o: paint-source-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-source-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-source-alpha.Tpo -c -o cairo_test_suite-paint-source-alpha.o `test -f 'paint-source-alpha.c' || echo '$(srcdir)/'`paint-source-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-source-alpha.Tpo $(DEPDIR)/cairo_test_suite-paint-source-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-source-alpha.c' object='cairo_test_suite-paint-source-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-source-alpha.o `test -f 'paint-source-alpha.c' || echo '$(srcdir)/'`paint-source-alpha.c + +cairo_test_suite-paint-source-alpha.obj: paint-source-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-source-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-source-alpha.Tpo -c -o cairo_test_suite-paint-source-alpha.obj `if test -f 'paint-source-alpha.c'; then $(CYGPATH_W) 'paint-source-alpha.c'; else $(CYGPATH_W) '$(srcdir)/paint-source-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-source-alpha.Tpo $(DEPDIR)/cairo_test_suite-paint-source-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-source-alpha.c' object='cairo_test_suite-paint-source-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-source-alpha.obj `if test -f 'paint-source-alpha.c'; then $(CYGPATH_W) 'paint-source-alpha.c'; else $(CYGPATH_W) '$(srcdir)/paint-source-alpha.c'; fi` + +cairo_test_suite-paint-with-alpha.o: paint-with-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-with-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-with-alpha.Tpo -c -o cairo_test_suite-paint-with-alpha.o `test -f 'paint-with-alpha.c' || echo '$(srcdir)/'`paint-with-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-with-alpha.Tpo $(DEPDIR)/cairo_test_suite-paint-with-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-with-alpha.c' object='cairo_test_suite-paint-with-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-with-alpha.o `test -f 'paint-with-alpha.c' || echo '$(srcdir)/'`paint-with-alpha.c + +cairo_test_suite-paint-with-alpha.obj: paint-with-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-with-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-with-alpha.Tpo -c -o cairo_test_suite-paint-with-alpha.obj `if test -f 'paint-with-alpha.c'; then $(CYGPATH_W) 'paint-with-alpha.c'; else $(CYGPATH_W) '$(srcdir)/paint-with-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-with-alpha.Tpo $(DEPDIR)/cairo_test_suite-paint-with-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-with-alpha.c' object='cairo_test_suite-paint-with-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-with-alpha.obj `if test -f 'paint-with-alpha.c'; then $(CYGPATH_W) 'paint-with-alpha.c'; else $(CYGPATH_W) '$(srcdir)/paint-with-alpha.c'; fi` + +cairo_test_suite-paint-with-alpha-group-clip.o: paint-with-alpha-group-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-with-alpha-group-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Tpo -c -o cairo_test_suite-paint-with-alpha-group-clip.o `test -f 'paint-with-alpha-group-clip.c' || echo '$(srcdir)/'`paint-with-alpha-group-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Tpo $(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-with-alpha-group-clip.c' object='cairo_test_suite-paint-with-alpha-group-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-with-alpha-group-clip.o `test -f 'paint-with-alpha-group-clip.c' || echo '$(srcdir)/'`paint-with-alpha-group-clip.c + +cairo_test_suite-paint-with-alpha-group-clip.obj: paint-with-alpha-group-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-paint-with-alpha-group-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Tpo -c -o cairo_test_suite-paint-with-alpha-group-clip.obj `if test -f 'paint-with-alpha-group-clip.c'; then $(CYGPATH_W) 'paint-with-alpha-group-clip.c'; else $(CYGPATH_W) '$(srcdir)/paint-with-alpha-group-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Tpo $(DEPDIR)/cairo_test_suite-paint-with-alpha-group-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='paint-with-alpha-group-clip.c' object='cairo_test_suite-paint-with-alpha-group-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-paint-with-alpha-group-clip.obj `if test -f 'paint-with-alpha-group-clip.c'; then $(CYGPATH_W) 'paint-with-alpha-group-clip.c'; else $(CYGPATH_W) '$(srcdir)/paint-with-alpha-group-clip.c'; fi` + +cairo_test_suite-partial-clip-text.o: partial-clip-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-partial-clip-text.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-partial-clip-text.Tpo -c -o cairo_test_suite-partial-clip-text.o `test -f 'partial-clip-text.c' || echo '$(srcdir)/'`partial-clip-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-partial-clip-text.Tpo $(DEPDIR)/cairo_test_suite-partial-clip-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='partial-clip-text.c' object='cairo_test_suite-partial-clip-text.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-partial-clip-text.o `test -f 'partial-clip-text.c' || echo '$(srcdir)/'`partial-clip-text.c + +cairo_test_suite-partial-clip-text.obj: partial-clip-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-partial-clip-text.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-partial-clip-text.Tpo -c -o cairo_test_suite-partial-clip-text.obj `if test -f 'partial-clip-text.c'; then $(CYGPATH_W) 'partial-clip-text.c'; else $(CYGPATH_W) '$(srcdir)/partial-clip-text.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-partial-clip-text.Tpo $(DEPDIR)/cairo_test_suite-partial-clip-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='partial-clip-text.c' object='cairo_test_suite-partial-clip-text.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-partial-clip-text.obj `if test -f 'partial-clip-text.c'; then $(CYGPATH_W) 'partial-clip-text.c'; else $(CYGPATH_W) '$(srcdir)/partial-clip-text.c'; fi` + +cairo_test_suite-partial-coverage.o: partial-coverage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-partial-coverage.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-partial-coverage.Tpo -c -o cairo_test_suite-partial-coverage.o `test -f 'partial-coverage.c' || echo '$(srcdir)/'`partial-coverage.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-partial-coverage.Tpo $(DEPDIR)/cairo_test_suite-partial-coverage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='partial-coverage.c' object='cairo_test_suite-partial-coverage.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-partial-coverage.o `test -f 'partial-coverage.c' || echo '$(srcdir)/'`partial-coverage.c + +cairo_test_suite-partial-coverage.obj: partial-coverage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-partial-coverage.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-partial-coverage.Tpo -c -o cairo_test_suite-partial-coverage.obj `if test -f 'partial-coverage.c'; then $(CYGPATH_W) 'partial-coverage.c'; else $(CYGPATH_W) '$(srcdir)/partial-coverage.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-partial-coverage.Tpo $(DEPDIR)/cairo_test_suite-partial-coverage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='partial-coverage.c' object='cairo_test_suite-partial-coverage.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-partial-coverage.obj `if test -f 'partial-coverage.c'; then $(CYGPATH_W) 'partial-coverage.c'; else $(CYGPATH_W) '$(srcdir)/partial-coverage.c'; fi` + +cairo_test_suite-pass-through.o: pass-through.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pass-through.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pass-through.Tpo -c -o cairo_test_suite-pass-through.o `test -f 'pass-through.c' || echo '$(srcdir)/'`pass-through.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pass-through.Tpo $(DEPDIR)/cairo_test_suite-pass-through.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pass-through.c' object='cairo_test_suite-pass-through.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pass-through.o `test -f 'pass-through.c' || echo '$(srcdir)/'`pass-through.c + +cairo_test_suite-pass-through.obj: pass-through.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pass-through.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pass-through.Tpo -c -o cairo_test_suite-pass-through.obj `if test -f 'pass-through.c'; then $(CYGPATH_W) 'pass-through.c'; else $(CYGPATH_W) '$(srcdir)/pass-through.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pass-through.Tpo $(DEPDIR)/cairo_test_suite-pass-through.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pass-through.c' object='cairo_test_suite-pass-through.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pass-through.obj `if test -f 'pass-through.c'; then $(CYGPATH_W) 'pass-through.c'; else $(CYGPATH_W) '$(srcdir)/pass-through.c'; fi` + +cairo_test_suite-path-append.o: path-append.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-append.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-append.Tpo -c -o cairo_test_suite-path-append.o `test -f 'path-append.c' || echo '$(srcdir)/'`path-append.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-append.Tpo $(DEPDIR)/cairo_test_suite-path-append.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-append.c' object='cairo_test_suite-path-append.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-append.o `test -f 'path-append.c' || echo '$(srcdir)/'`path-append.c + +cairo_test_suite-path-append.obj: path-append.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-append.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-append.Tpo -c -o cairo_test_suite-path-append.obj `if test -f 'path-append.c'; then $(CYGPATH_W) 'path-append.c'; else $(CYGPATH_W) '$(srcdir)/path-append.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-append.Tpo $(DEPDIR)/cairo_test_suite-path-append.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-append.c' object='cairo_test_suite-path-append.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-append.obj `if test -f 'path-append.c'; then $(CYGPATH_W) 'path-append.c'; else $(CYGPATH_W) '$(srcdir)/path-append.c'; fi` + +cairo_test_suite-path-currentpoint.o: path-currentpoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-currentpoint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-currentpoint.Tpo -c -o cairo_test_suite-path-currentpoint.o `test -f 'path-currentpoint.c' || echo '$(srcdir)/'`path-currentpoint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-currentpoint.Tpo $(DEPDIR)/cairo_test_suite-path-currentpoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-currentpoint.c' object='cairo_test_suite-path-currentpoint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-currentpoint.o `test -f 'path-currentpoint.c' || echo '$(srcdir)/'`path-currentpoint.c + +cairo_test_suite-path-currentpoint.obj: path-currentpoint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-currentpoint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-currentpoint.Tpo -c -o cairo_test_suite-path-currentpoint.obj `if test -f 'path-currentpoint.c'; then $(CYGPATH_W) 'path-currentpoint.c'; else $(CYGPATH_W) '$(srcdir)/path-currentpoint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-currentpoint.Tpo $(DEPDIR)/cairo_test_suite-path-currentpoint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-currentpoint.c' object='cairo_test_suite-path-currentpoint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-currentpoint.obj `if test -f 'path-currentpoint.c'; then $(CYGPATH_W) 'path-currentpoint.c'; else $(CYGPATH_W) '$(srcdir)/path-currentpoint.c'; fi` + +cairo_test_suite-path-stroke-twice.o: path-stroke-twice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-stroke-twice.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-stroke-twice.Tpo -c -o cairo_test_suite-path-stroke-twice.o `test -f 'path-stroke-twice.c' || echo '$(srcdir)/'`path-stroke-twice.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-stroke-twice.Tpo $(DEPDIR)/cairo_test_suite-path-stroke-twice.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-stroke-twice.c' object='cairo_test_suite-path-stroke-twice.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-stroke-twice.o `test -f 'path-stroke-twice.c' || echo '$(srcdir)/'`path-stroke-twice.c + +cairo_test_suite-path-stroke-twice.obj: path-stroke-twice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-stroke-twice.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-stroke-twice.Tpo -c -o cairo_test_suite-path-stroke-twice.obj `if test -f 'path-stroke-twice.c'; then $(CYGPATH_W) 'path-stroke-twice.c'; else $(CYGPATH_W) '$(srcdir)/path-stroke-twice.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-stroke-twice.Tpo $(DEPDIR)/cairo_test_suite-path-stroke-twice.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-stroke-twice.c' object='cairo_test_suite-path-stroke-twice.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-stroke-twice.obj `if test -f 'path-stroke-twice.c'; then $(CYGPATH_W) 'path-stroke-twice.c'; else $(CYGPATH_W) '$(srcdir)/path-stroke-twice.c'; fi` + +cairo_test_suite-path-precision.o: path-precision.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-precision.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-precision.Tpo -c -o cairo_test_suite-path-precision.o `test -f 'path-precision.c' || echo '$(srcdir)/'`path-precision.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-precision.Tpo $(DEPDIR)/cairo_test_suite-path-precision.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-precision.c' object='cairo_test_suite-path-precision.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-precision.o `test -f 'path-precision.c' || echo '$(srcdir)/'`path-precision.c + +cairo_test_suite-path-precision.obj: path-precision.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-path-precision.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-path-precision.Tpo -c -o cairo_test_suite-path-precision.obj `if test -f 'path-precision.c'; then $(CYGPATH_W) 'path-precision.c'; else $(CYGPATH_W) '$(srcdir)/path-precision.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-path-precision.Tpo $(DEPDIR)/cairo_test_suite-path-precision.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='path-precision.c' object='cairo_test_suite-path-precision.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-path-precision.obj `if test -f 'path-precision.c'; then $(CYGPATH_W) 'path-precision.c'; else $(CYGPATH_W) '$(srcdir)/path-precision.c'; fi` + +cairo_test_suite-pattern-get-type.o: pattern-get-type.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pattern-get-type.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pattern-get-type.Tpo -c -o cairo_test_suite-pattern-get-type.o `test -f 'pattern-get-type.c' || echo '$(srcdir)/'`pattern-get-type.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pattern-get-type.Tpo $(DEPDIR)/cairo_test_suite-pattern-get-type.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pattern-get-type.c' object='cairo_test_suite-pattern-get-type.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pattern-get-type.o `test -f 'pattern-get-type.c' || echo '$(srcdir)/'`pattern-get-type.c + +cairo_test_suite-pattern-get-type.obj: pattern-get-type.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pattern-get-type.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pattern-get-type.Tpo -c -o cairo_test_suite-pattern-get-type.obj `if test -f 'pattern-get-type.c'; then $(CYGPATH_W) 'pattern-get-type.c'; else $(CYGPATH_W) '$(srcdir)/pattern-get-type.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pattern-get-type.Tpo $(DEPDIR)/cairo_test_suite-pattern-get-type.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pattern-get-type.c' object='cairo_test_suite-pattern-get-type.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pattern-get-type.obj `if test -f 'pattern-get-type.c'; then $(CYGPATH_W) 'pattern-get-type.c'; else $(CYGPATH_W) '$(srcdir)/pattern-get-type.c'; fi` + +cairo_test_suite-pattern-getters.o: pattern-getters.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pattern-getters.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pattern-getters.Tpo -c -o cairo_test_suite-pattern-getters.o `test -f 'pattern-getters.c' || echo '$(srcdir)/'`pattern-getters.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pattern-getters.Tpo $(DEPDIR)/cairo_test_suite-pattern-getters.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pattern-getters.c' object='cairo_test_suite-pattern-getters.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pattern-getters.o `test -f 'pattern-getters.c' || echo '$(srcdir)/'`pattern-getters.c + +cairo_test_suite-pattern-getters.obj: pattern-getters.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pattern-getters.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pattern-getters.Tpo -c -o cairo_test_suite-pattern-getters.obj `if test -f 'pattern-getters.c'; then $(CYGPATH_W) 'pattern-getters.c'; else $(CYGPATH_W) '$(srcdir)/pattern-getters.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pattern-getters.Tpo $(DEPDIR)/cairo_test_suite-pattern-getters.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pattern-getters.c' object='cairo_test_suite-pattern-getters.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pattern-getters.obj `if test -f 'pattern-getters.c'; then $(CYGPATH_W) 'pattern-getters.c'; else $(CYGPATH_W) '$(srcdir)/pattern-getters.c'; fi` + +cairo_test_suite-pdf-isolated-group.o: pdf-isolated-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-isolated-group.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-isolated-group.Tpo -c -o cairo_test_suite-pdf-isolated-group.o `test -f 'pdf-isolated-group.c' || echo '$(srcdir)/'`pdf-isolated-group.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-isolated-group.Tpo $(DEPDIR)/cairo_test_suite-pdf-isolated-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-isolated-group.c' object='cairo_test_suite-pdf-isolated-group.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-isolated-group.o `test -f 'pdf-isolated-group.c' || echo '$(srcdir)/'`pdf-isolated-group.c + +cairo_test_suite-pdf-isolated-group.obj: pdf-isolated-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-isolated-group.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-isolated-group.Tpo -c -o cairo_test_suite-pdf-isolated-group.obj `if test -f 'pdf-isolated-group.c'; then $(CYGPATH_W) 'pdf-isolated-group.c'; else $(CYGPATH_W) '$(srcdir)/pdf-isolated-group.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-isolated-group.Tpo $(DEPDIR)/cairo_test_suite-pdf-isolated-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-isolated-group.c' object='cairo_test_suite-pdf-isolated-group.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-isolated-group.obj `if test -f 'pdf-isolated-group.c'; then $(CYGPATH_W) 'pdf-isolated-group.c'; else $(CYGPATH_W) '$(srcdir)/pdf-isolated-group.c'; fi` + +cairo_test_suite-pixman-downscale.o: pixman-downscale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pixman-downscale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pixman-downscale.Tpo -c -o cairo_test_suite-pixman-downscale.o `test -f 'pixman-downscale.c' || echo '$(srcdir)/'`pixman-downscale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pixman-downscale.Tpo $(DEPDIR)/cairo_test_suite-pixman-downscale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixman-downscale.c' object='cairo_test_suite-pixman-downscale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pixman-downscale.o `test -f 'pixman-downscale.c' || echo '$(srcdir)/'`pixman-downscale.c + +cairo_test_suite-pixman-downscale.obj: pixman-downscale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pixman-downscale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pixman-downscale.Tpo -c -o cairo_test_suite-pixman-downscale.obj `if test -f 'pixman-downscale.c'; then $(CYGPATH_W) 'pixman-downscale.c'; else $(CYGPATH_W) '$(srcdir)/pixman-downscale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pixman-downscale.Tpo $(DEPDIR)/cairo_test_suite-pixman-downscale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixman-downscale.c' object='cairo_test_suite-pixman-downscale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pixman-downscale.obj `if test -f 'pixman-downscale.c'; then $(CYGPATH_W) 'pixman-downscale.c'; else $(CYGPATH_W) '$(srcdir)/pixman-downscale.c'; fi` + +cairo_test_suite-pixman-rotate.o: pixman-rotate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pixman-rotate.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pixman-rotate.Tpo -c -o cairo_test_suite-pixman-rotate.o `test -f 'pixman-rotate.c' || echo '$(srcdir)/'`pixman-rotate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pixman-rotate.Tpo $(DEPDIR)/cairo_test_suite-pixman-rotate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixman-rotate.c' object='cairo_test_suite-pixman-rotate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pixman-rotate.o `test -f 'pixman-rotate.c' || echo '$(srcdir)/'`pixman-rotate.c + +cairo_test_suite-pixman-rotate.obj: pixman-rotate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pixman-rotate.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pixman-rotate.Tpo -c -o cairo_test_suite-pixman-rotate.obj `if test -f 'pixman-rotate.c'; then $(CYGPATH_W) 'pixman-rotate.c'; else $(CYGPATH_W) '$(srcdir)/pixman-rotate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pixman-rotate.Tpo $(DEPDIR)/cairo_test_suite-pixman-rotate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pixman-rotate.c' object='cairo_test_suite-pixman-rotate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pixman-rotate.obj `if test -f 'pixman-rotate.c'; then $(CYGPATH_W) 'pixman-rotate.c'; else $(CYGPATH_W) '$(srcdir)/pixman-rotate.c'; fi` + +cairo_test_suite-png.o: png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-png.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-png.Tpo -c -o cairo_test_suite-png.o `test -f 'png.c' || echo '$(srcdir)/'`png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-png.Tpo $(DEPDIR)/cairo_test_suite-png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='png.c' object='cairo_test_suite-png.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-png.o `test -f 'png.c' || echo '$(srcdir)/'`png.c + +cairo_test_suite-png.obj: png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-png.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-png.Tpo -c -o cairo_test_suite-png.obj `if test -f 'png.c'; then $(CYGPATH_W) 'png.c'; else $(CYGPATH_W) '$(srcdir)/png.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-png.Tpo $(DEPDIR)/cairo_test_suite-png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='png.c' object='cairo_test_suite-png.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-png.obj `if test -f 'png.c'; then $(CYGPATH_W) 'png.c'; else $(CYGPATH_W) '$(srcdir)/png.c'; fi` + +cairo_test_suite-push-group.o: push-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-push-group.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-push-group.Tpo -c -o cairo_test_suite-push-group.o `test -f 'push-group.c' || echo '$(srcdir)/'`push-group.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-push-group.Tpo $(DEPDIR)/cairo_test_suite-push-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='push-group.c' object='cairo_test_suite-push-group.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-push-group.o `test -f 'push-group.c' || echo '$(srcdir)/'`push-group.c + +cairo_test_suite-push-group.obj: push-group.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-push-group.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-push-group.Tpo -c -o cairo_test_suite-push-group.obj `if test -f 'push-group.c'; then $(CYGPATH_W) 'push-group.c'; else $(CYGPATH_W) '$(srcdir)/push-group.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-push-group.Tpo $(DEPDIR)/cairo_test_suite-push-group.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='push-group.c' object='cairo_test_suite-push-group.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-push-group.obj `if test -f 'push-group.c'; then $(CYGPATH_W) 'push-group.c'; else $(CYGPATH_W) '$(srcdir)/push-group.c'; fi` + +cairo_test_suite-push-group-color.o: push-group-color.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-push-group-color.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-push-group-color.Tpo -c -o cairo_test_suite-push-group-color.o `test -f 'push-group-color.c' || echo '$(srcdir)/'`push-group-color.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-push-group-color.Tpo $(DEPDIR)/cairo_test_suite-push-group-color.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='push-group-color.c' object='cairo_test_suite-push-group-color.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-push-group-color.o `test -f 'push-group-color.c' || echo '$(srcdir)/'`push-group-color.c + +cairo_test_suite-push-group-color.obj: push-group-color.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-push-group-color.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-push-group-color.Tpo -c -o cairo_test_suite-push-group-color.obj `if test -f 'push-group-color.c'; then $(CYGPATH_W) 'push-group-color.c'; else $(CYGPATH_W) '$(srcdir)/push-group-color.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-push-group-color.Tpo $(DEPDIR)/cairo_test_suite-push-group-color.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='push-group-color.c' object='cairo_test_suite-push-group-color.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-push-group-color.obj `if test -f 'push-group-color.c'; then $(CYGPATH_W) 'push-group-color.c'; else $(CYGPATH_W) '$(srcdir)/push-group-color.c'; fi` + +cairo_test_suite-push-group-path-offset.o: push-group-path-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-push-group-path-offset.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-push-group-path-offset.Tpo -c -o cairo_test_suite-push-group-path-offset.o `test -f 'push-group-path-offset.c' || echo '$(srcdir)/'`push-group-path-offset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-push-group-path-offset.Tpo $(DEPDIR)/cairo_test_suite-push-group-path-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='push-group-path-offset.c' object='cairo_test_suite-push-group-path-offset.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-push-group-path-offset.o `test -f 'push-group-path-offset.c' || echo '$(srcdir)/'`push-group-path-offset.c + +cairo_test_suite-push-group-path-offset.obj: push-group-path-offset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-push-group-path-offset.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-push-group-path-offset.Tpo -c -o cairo_test_suite-push-group-path-offset.obj `if test -f 'push-group-path-offset.c'; then $(CYGPATH_W) 'push-group-path-offset.c'; else $(CYGPATH_W) '$(srcdir)/push-group-path-offset.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-push-group-path-offset.Tpo $(DEPDIR)/cairo_test_suite-push-group-path-offset.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='push-group-path-offset.c' object='cairo_test_suite-push-group-path-offset.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-push-group-path-offset.obj `if test -f 'push-group-path-offset.c'; then $(CYGPATH_W) 'push-group-path-offset.c'; else $(CYGPATH_W) '$(srcdir)/push-group-path-offset.c'; fi` + +cairo_test_suite-radial-gradient.o: radial-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-radial-gradient.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-radial-gradient.Tpo -c -o cairo_test_suite-radial-gradient.o `test -f 'radial-gradient.c' || echo '$(srcdir)/'`radial-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-radial-gradient.Tpo $(DEPDIR)/cairo_test_suite-radial-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='radial-gradient.c' object='cairo_test_suite-radial-gradient.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-radial-gradient.o `test -f 'radial-gradient.c' || echo '$(srcdir)/'`radial-gradient.c + +cairo_test_suite-radial-gradient.obj: radial-gradient.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-radial-gradient.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-radial-gradient.Tpo -c -o cairo_test_suite-radial-gradient.obj `if test -f 'radial-gradient.c'; then $(CYGPATH_W) 'radial-gradient.c'; else $(CYGPATH_W) '$(srcdir)/radial-gradient.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-radial-gradient.Tpo $(DEPDIR)/cairo_test_suite-radial-gradient.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='radial-gradient.c' object='cairo_test_suite-radial-gradient.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-radial-gradient.obj `if test -f 'radial-gradient.c'; then $(CYGPATH_W) 'radial-gradient.c'; else $(CYGPATH_W) '$(srcdir)/radial-gradient.c'; fi` + +cairo_test_suite-radial-gradient-extend.o: radial-gradient-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-radial-gradient-extend.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-radial-gradient-extend.Tpo -c -o cairo_test_suite-radial-gradient-extend.o `test -f 'radial-gradient-extend.c' || echo '$(srcdir)/'`radial-gradient-extend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-radial-gradient-extend.Tpo $(DEPDIR)/cairo_test_suite-radial-gradient-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='radial-gradient-extend.c' object='cairo_test_suite-radial-gradient-extend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-radial-gradient-extend.o `test -f 'radial-gradient-extend.c' || echo '$(srcdir)/'`radial-gradient-extend.c + +cairo_test_suite-radial-gradient-extend.obj: radial-gradient-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-radial-gradient-extend.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-radial-gradient-extend.Tpo -c -o cairo_test_suite-radial-gradient-extend.obj `if test -f 'radial-gradient-extend.c'; then $(CYGPATH_W) 'radial-gradient-extend.c'; else $(CYGPATH_W) '$(srcdir)/radial-gradient-extend.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-radial-gradient-extend.Tpo $(DEPDIR)/cairo_test_suite-radial-gradient-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='radial-gradient-extend.c' object='cairo_test_suite-radial-gradient-extend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-radial-gradient-extend.obj `if test -f 'radial-gradient-extend.c'; then $(CYGPATH_W) 'radial-gradient-extend.c'; else $(CYGPATH_W) '$(srcdir)/radial-gradient-extend.c'; fi` + +cairo_test_suite-radial-outer-focus.o: radial-outer-focus.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-radial-outer-focus.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-radial-outer-focus.Tpo -c -o cairo_test_suite-radial-outer-focus.o `test -f 'radial-outer-focus.c' || echo '$(srcdir)/'`radial-outer-focus.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-radial-outer-focus.Tpo $(DEPDIR)/cairo_test_suite-radial-outer-focus.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='radial-outer-focus.c' object='cairo_test_suite-radial-outer-focus.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-radial-outer-focus.o `test -f 'radial-outer-focus.c' || echo '$(srcdir)/'`radial-outer-focus.c + +cairo_test_suite-radial-outer-focus.obj: radial-outer-focus.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-radial-outer-focus.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-radial-outer-focus.Tpo -c -o cairo_test_suite-radial-outer-focus.obj `if test -f 'radial-outer-focus.c'; then $(CYGPATH_W) 'radial-outer-focus.c'; else $(CYGPATH_W) '$(srcdir)/radial-outer-focus.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-radial-outer-focus.Tpo $(DEPDIR)/cairo_test_suite-radial-outer-focus.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='radial-outer-focus.c' object='cairo_test_suite-radial-outer-focus.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-radial-outer-focus.obj `if test -f 'radial-outer-focus.c'; then $(CYGPATH_W) 'radial-outer-focus.c'; else $(CYGPATH_W) '$(srcdir)/radial-outer-focus.c'; fi` + +cairo_test_suite-random-clips.o: random-clips.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-clips.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-clips.Tpo -c -o cairo_test_suite-random-clips.o `test -f 'random-clips.c' || echo '$(srcdir)/'`random-clips.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-clips.Tpo $(DEPDIR)/cairo_test_suite-random-clips.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-clips.c' object='cairo_test_suite-random-clips.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-clips.o `test -f 'random-clips.c' || echo '$(srcdir)/'`random-clips.c + +cairo_test_suite-random-clips.obj: random-clips.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-clips.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-clips.Tpo -c -o cairo_test_suite-random-clips.obj `if test -f 'random-clips.c'; then $(CYGPATH_W) 'random-clips.c'; else $(CYGPATH_W) '$(srcdir)/random-clips.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-clips.Tpo $(DEPDIR)/cairo_test_suite-random-clips.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-clips.c' object='cairo_test_suite-random-clips.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-clips.obj `if test -f 'random-clips.c'; then $(CYGPATH_W) 'random-clips.c'; else $(CYGPATH_W) '$(srcdir)/random-clips.c'; fi` + +cairo_test_suite-random-intersections-eo.o: random-intersections-eo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-eo.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-eo.Tpo -c -o cairo_test_suite-random-intersections-eo.o `test -f 'random-intersections-eo.c' || echo '$(srcdir)/'`random-intersections-eo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-eo.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-eo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-eo.c' object='cairo_test_suite-random-intersections-eo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-eo.o `test -f 'random-intersections-eo.c' || echo '$(srcdir)/'`random-intersections-eo.c + +cairo_test_suite-random-intersections-eo.obj: random-intersections-eo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-eo.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-eo.Tpo -c -o cairo_test_suite-random-intersections-eo.obj `if test -f 'random-intersections-eo.c'; then $(CYGPATH_W) 'random-intersections-eo.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-eo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-eo.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-eo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-eo.c' object='cairo_test_suite-random-intersections-eo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-eo.obj `if test -f 'random-intersections-eo.c'; then $(CYGPATH_W) 'random-intersections-eo.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-eo.c'; fi` + +cairo_test_suite-random-intersections-nonzero.o: random-intersections-nonzero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-nonzero.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Tpo -c -o cairo_test_suite-random-intersections-nonzero.o `test -f 'random-intersections-nonzero.c' || echo '$(srcdir)/'`random-intersections-nonzero.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-nonzero.c' object='cairo_test_suite-random-intersections-nonzero.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-nonzero.o `test -f 'random-intersections-nonzero.c' || echo '$(srcdir)/'`random-intersections-nonzero.c + +cairo_test_suite-random-intersections-nonzero.obj: random-intersections-nonzero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-nonzero.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Tpo -c -o cairo_test_suite-random-intersections-nonzero.obj `if test -f 'random-intersections-nonzero.c'; then $(CYGPATH_W) 'random-intersections-nonzero.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-nonzero.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-nonzero.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-nonzero.c' object='cairo_test_suite-random-intersections-nonzero.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-nonzero.obj `if test -f 'random-intersections-nonzero.c'; then $(CYGPATH_W) 'random-intersections-nonzero.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-nonzero.c'; fi` + +cairo_test_suite-random-intersections-curves-eo.o: random-intersections-curves-eo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-curves-eo.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Tpo -c -o cairo_test_suite-random-intersections-curves-eo.o `test -f 'random-intersections-curves-eo.c' || echo '$(srcdir)/'`random-intersections-curves-eo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-curves-eo.c' object='cairo_test_suite-random-intersections-curves-eo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-curves-eo.o `test -f 'random-intersections-curves-eo.c' || echo '$(srcdir)/'`random-intersections-curves-eo.c + +cairo_test_suite-random-intersections-curves-eo.obj: random-intersections-curves-eo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-curves-eo.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Tpo -c -o cairo_test_suite-random-intersections-curves-eo.obj `if test -f 'random-intersections-curves-eo.c'; then $(CYGPATH_W) 'random-intersections-curves-eo.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-curves-eo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-curves-eo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-curves-eo.c' object='cairo_test_suite-random-intersections-curves-eo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-curves-eo.obj `if test -f 'random-intersections-curves-eo.c'; then $(CYGPATH_W) 'random-intersections-curves-eo.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-curves-eo.c'; fi` + +cairo_test_suite-random-intersections-curves-nz.o: random-intersections-curves-nz.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-curves-nz.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Tpo -c -o cairo_test_suite-random-intersections-curves-nz.o `test -f 'random-intersections-curves-nz.c' || echo '$(srcdir)/'`random-intersections-curves-nz.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-curves-nz.c' object='cairo_test_suite-random-intersections-curves-nz.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-curves-nz.o `test -f 'random-intersections-curves-nz.c' || echo '$(srcdir)/'`random-intersections-curves-nz.c + +cairo_test_suite-random-intersections-curves-nz.obj: random-intersections-curves-nz.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-random-intersections-curves-nz.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Tpo -c -o cairo_test_suite-random-intersections-curves-nz.obj `if test -f 'random-intersections-curves-nz.c'; then $(CYGPATH_W) 'random-intersections-curves-nz.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-curves-nz.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Tpo $(DEPDIR)/cairo_test_suite-random-intersections-curves-nz.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='random-intersections-curves-nz.c' object='cairo_test_suite-random-intersections-curves-nz.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-random-intersections-curves-nz.obj `if test -f 'random-intersections-curves-nz.c'; then $(CYGPATH_W) 'random-intersections-curves-nz.c'; else $(CYGPATH_W) '$(srcdir)/random-intersections-curves-nz.c'; fi` + +cairo_test_suite-raster-source.o: raster-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-raster-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-raster-source.Tpo -c -o cairo_test_suite-raster-source.o `test -f 'raster-source.c' || echo '$(srcdir)/'`raster-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-raster-source.Tpo $(DEPDIR)/cairo_test_suite-raster-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='raster-source.c' object='cairo_test_suite-raster-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-raster-source.o `test -f 'raster-source.c' || echo '$(srcdir)/'`raster-source.c + +cairo_test_suite-raster-source.obj: raster-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-raster-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-raster-source.Tpo -c -o cairo_test_suite-raster-source.obj `if test -f 'raster-source.c'; then $(CYGPATH_W) 'raster-source.c'; else $(CYGPATH_W) '$(srcdir)/raster-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-raster-source.Tpo $(DEPDIR)/cairo_test_suite-raster-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='raster-source.c' object='cairo_test_suite-raster-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-raster-source.obj `if test -f 'raster-source.c'; then $(CYGPATH_W) 'raster-source.c'; else $(CYGPATH_W) '$(srcdir)/raster-source.c'; fi` + +cairo_test_suite-record.o: record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-record.Tpo -c -o cairo_test_suite-record.o `test -f 'record.c' || echo '$(srcdir)/'`record.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record.Tpo $(DEPDIR)/cairo_test_suite-record.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record.c' object='cairo_test_suite-record.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record.o `test -f 'record.c' || echo '$(srcdir)/'`record.c + +cairo_test_suite-record.obj: record.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-record.Tpo -c -o cairo_test_suite-record.obj `if test -f 'record.c'; then $(CYGPATH_W) 'record.c'; else $(CYGPATH_W) '$(srcdir)/record.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record.Tpo $(DEPDIR)/cairo_test_suite-record.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record.c' object='cairo_test_suite-record.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record.obj `if test -f 'record.c'; then $(CYGPATH_W) 'record.c'; else $(CYGPATH_W) '$(srcdir)/record.c'; fi` + +cairo_test_suite-record1414x.o: record1414x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record1414x.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-record1414x.Tpo -c -o cairo_test_suite-record1414x.o `test -f 'record1414x.c' || echo '$(srcdir)/'`record1414x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record1414x.Tpo $(DEPDIR)/cairo_test_suite-record1414x.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record1414x.c' object='cairo_test_suite-record1414x.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record1414x.o `test -f 'record1414x.c' || echo '$(srcdir)/'`record1414x.c + +cairo_test_suite-record1414x.obj: record1414x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record1414x.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-record1414x.Tpo -c -o cairo_test_suite-record1414x.obj `if test -f 'record1414x.c'; then $(CYGPATH_W) 'record1414x.c'; else $(CYGPATH_W) '$(srcdir)/record1414x.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record1414x.Tpo $(DEPDIR)/cairo_test_suite-record1414x.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record1414x.c' object='cairo_test_suite-record1414x.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record1414x.obj `if test -f 'record1414x.c'; then $(CYGPATH_W) 'record1414x.c'; else $(CYGPATH_W) '$(srcdir)/record1414x.c'; fi` + +cairo_test_suite-record2x.o: record2x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record2x.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-record2x.Tpo -c -o cairo_test_suite-record2x.o `test -f 'record2x.c' || echo '$(srcdir)/'`record2x.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record2x.Tpo $(DEPDIR)/cairo_test_suite-record2x.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record2x.c' object='cairo_test_suite-record2x.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record2x.o `test -f 'record2x.c' || echo '$(srcdir)/'`record2x.c + +cairo_test_suite-record2x.obj: record2x.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record2x.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-record2x.Tpo -c -o cairo_test_suite-record2x.obj `if test -f 'record2x.c'; then $(CYGPATH_W) 'record2x.c'; else $(CYGPATH_W) '$(srcdir)/record2x.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record2x.Tpo $(DEPDIR)/cairo_test_suite-record2x.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record2x.c' object='cairo_test_suite-record2x.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record2x.obj `if test -f 'record2x.c'; then $(CYGPATH_W) 'record2x.c'; else $(CYGPATH_W) '$(srcdir)/record2x.c'; fi` + +cairo_test_suite-record90.o: record90.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record90.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-record90.Tpo -c -o cairo_test_suite-record90.o `test -f 'record90.c' || echo '$(srcdir)/'`record90.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record90.Tpo $(DEPDIR)/cairo_test_suite-record90.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record90.c' object='cairo_test_suite-record90.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record90.o `test -f 'record90.c' || echo '$(srcdir)/'`record90.c + +cairo_test_suite-record90.obj: record90.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record90.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-record90.Tpo -c -o cairo_test_suite-record90.obj `if test -f 'record90.c'; then $(CYGPATH_W) 'record90.c'; else $(CYGPATH_W) '$(srcdir)/record90.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record90.Tpo $(DEPDIR)/cairo_test_suite-record90.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record90.c' object='cairo_test_suite-record90.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record90.obj `if test -f 'record90.c'; then $(CYGPATH_W) 'record90.c'; else $(CYGPATH_W) '$(srcdir)/record90.c'; fi` + +cairo_test_suite-recordflip.o: recordflip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-recordflip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-recordflip.Tpo -c -o cairo_test_suite-recordflip.o `test -f 'recordflip.c' || echo '$(srcdir)/'`recordflip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-recordflip.Tpo $(DEPDIR)/cairo_test_suite-recordflip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recordflip.c' object='cairo_test_suite-recordflip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-recordflip.o `test -f 'recordflip.c' || echo '$(srcdir)/'`recordflip.c + +cairo_test_suite-recordflip.obj: recordflip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-recordflip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-recordflip.Tpo -c -o cairo_test_suite-recordflip.obj `if test -f 'recordflip.c'; then $(CYGPATH_W) 'recordflip.c'; else $(CYGPATH_W) '$(srcdir)/recordflip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-recordflip.Tpo $(DEPDIR)/cairo_test_suite-recordflip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recordflip.c' object='cairo_test_suite-recordflip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-recordflip.obj `if test -f 'recordflip.c'; then $(CYGPATH_W) 'recordflip.c'; else $(CYGPATH_W) '$(srcdir)/recordflip.c'; fi` + +cairo_test_suite-record-extend.o: record-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record-extend.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-record-extend.Tpo -c -o cairo_test_suite-record-extend.o `test -f 'record-extend.c' || echo '$(srcdir)/'`record-extend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record-extend.Tpo $(DEPDIR)/cairo_test_suite-record-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record-extend.c' object='cairo_test_suite-record-extend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record-extend.o `test -f 'record-extend.c' || echo '$(srcdir)/'`record-extend.c + +cairo_test_suite-record-extend.obj: record-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record-extend.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-record-extend.Tpo -c -o cairo_test_suite-record-extend.obj `if test -f 'record-extend.c'; then $(CYGPATH_W) 'record-extend.c'; else $(CYGPATH_W) '$(srcdir)/record-extend.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record-extend.Tpo $(DEPDIR)/cairo_test_suite-record-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record-extend.c' object='cairo_test_suite-record-extend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record-extend.obj `if test -f 'record-extend.c'; then $(CYGPATH_W) 'record-extend.c'; else $(CYGPATH_W) '$(srcdir)/record-extend.c'; fi` + +cairo_test_suite-record-mesh.o: record-mesh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record-mesh.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-record-mesh.Tpo -c -o cairo_test_suite-record-mesh.o `test -f 'record-mesh.c' || echo '$(srcdir)/'`record-mesh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record-mesh.Tpo $(DEPDIR)/cairo_test_suite-record-mesh.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record-mesh.c' object='cairo_test_suite-record-mesh.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record-mesh.o `test -f 'record-mesh.c' || echo '$(srcdir)/'`record-mesh.c + +cairo_test_suite-record-mesh.obj: record-mesh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-record-mesh.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-record-mesh.Tpo -c -o cairo_test_suite-record-mesh.obj `if test -f 'record-mesh.c'; then $(CYGPATH_W) 'record-mesh.c'; else $(CYGPATH_W) '$(srcdir)/record-mesh.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-record-mesh.Tpo $(DEPDIR)/cairo_test_suite-record-mesh.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='record-mesh.c' object='cairo_test_suite-record-mesh.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-record-mesh.obj `if test -f 'record-mesh.c'; then $(CYGPATH_W) 'record-mesh.c'; else $(CYGPATH_W) '$(srcdir)/record-mesh.c'; fi` + +cairo_test_suite-recording-surface-pattern.o: recording-surface-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-recording-surface-pattern.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-recording-surface-pattern.Tpo -c -o cairo_test_suite-recording-surface-pattern.o `test -f 'recording-surface-pattern.c' || echo '$(srcdir)/'`recording-surface-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-recording-surface-pattern.Tpo $(DEPDIR)/cairo_test_suite-recording-surface-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recording-surface-pattern.c' object='cairo_test_suite-recording-surface-pattern.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-recording-surface-pattern.o `test -f 'recording-surface-pattern.c' || echo '$(srcdir)/'`recording-surface-pattern.c + +cairo_test_suite-recording-surface-pattern.obj: recording-surface-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-recording-surface-pattern.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-recording-surface-pattern.Tpo -c -o cairo_test_suite-recording-surface-pattern.obj `if test -f 'recording-surface-pattern.c'; then $(CYGPATH_W) 'recording-surface-pattern.c'; else $(CYGPATH_W) '$(srcdir)/recording-surface-pattern.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-recording-surface-pattern.Tpo $(DEPDIR)/cairo_test_suite-recording-surface-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recording-surface-pattern.c' object='cairo_test_suite-recording-surface-pattern.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-recording-surface-pattern.obj `if test -f 'recording-surface-pattern.c'; then $(CYGPATH_W) 'recording-surface-pattern.c'; else $(CYGPATH_W) '$(srcdir)/recording-surface-pattern.c'; fi` + +cairo_test_suite-recording-surface-extend.o: recording-surface-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-recording-surface-extend.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-recording-surface-extend.Tpo -c -o cairo_test_suite-recording-surface-extend.o `test -f 'recording-surface-extend.c' || echo '$(srcdir)/'`recording-surface-extend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-recording-surface-extend.Tpo $(DEPDIR)/cairo_test_suite-recording-surface-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recording-surface-extend.c' object='cairo_test_suite-recording-surface-extend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-recording-surface-extend.o `test -f 'recording-surface-extend.c' || echo '$(srcdir)/'`recording-surface-extend.c + +cairo_test_suite-recording-surface-extend.obj: recording-surface-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-recording-surface-extend.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-recording-surface-extend.Tpo -c -o cairo_test_suite-recording-surface-extend.obj `if test -f 'recording-surface-extend.c'; then $(CYGPATH_W) 'recording-surface-extend.c'; else $(CYGPATH_W) '$(srcdir)/recording-surface-extend.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-recording-surface-extend.Tpo $(DEPDIR)/cairo_test_suite-recording-surface-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recording-surface-extend.c' object='cairo_test_suite-recording-surface-extend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-recording-surface-extend.obj `if test -f 'recording-surface-extend.c'; then $(CYGPATH_W) 'recording-surface-extend.c'; else $(CYGPATH_W) '$(srcdir)/recording-surface-extend.c'; fi` + +cairo_test_suite-rectangle-rounding-error.o: rectangle-rounding-error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectangle-rounding-error.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Tpo -c -o cairo_test_suite-rectangle-rounding-error.o `test -f 'rectangle-rounding-error.c' || echo '$(srcdir)/'`rectangle-rounding-error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Tpo $(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectangle-rounding-error.c' object='cairo_test_suite-rectangle-rounding-error.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectangle-rounding-error.o `test -f 'rectangle-rounding-error.c' || echo '$(srcdir)/'`rectangle-rounding-error.c + +cairo_test_suite-rectangle-rounding-error.obj: rectangle-rounding-error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectangle-rounding-error.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Tpo -c -o cairo_test_suite-rectangle-rounding-error.obj `if test -f 'rectangle-rounding-error.c'; then $(CYGPATH_W) 'rectangle-rounding-error.c'; else $(CYGPATH_W) '$(srcdir)/rectangle-rounding-error.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Tpo $(DEPDIR)/cairo_test_suite-rectangle-rounding-error.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectangle-rounding-error.c' object='cairo_test_suite-rectangle-rounding-error.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectangle-rounding-error.obj `if test -f 'rectangle-rounding-error.c'; then $(CYGPATH_W) 'rectangle-rounding-error.c'; else $(CYGPATH_W) '$(srcdir)/rectangle-rounding-error.c'; fi` + +cairo_test_suite-rectilinear-fill.o: rectilinear-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-fill.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-fill.Tpo -c -o cairo_test_suite-rectilinear-fill.o `test -f 'rectilinear-fill.c' || echo '$(srcdir)/'`rectilinear-fill.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-fill.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-fill.c' object='cairo_test_suite-rectilinear-fill.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-fill.o `test -f 'rectilinear-fill.c' || echo '$(srcdir)/'`rectilinear-fill.c + +cairo_test_suite-rectilinear-fill.obj: rectilinear-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-fill.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-fill.Tpo -c -o cairo_test_suite-rectilinear-fill.obj `if test -f 'rectilinear-fill.c'; then $(CYGPATH_W) 'rectilinear-fill.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-fill.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-fill.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-fill.c' object='cairo_test_suite-rectilinear-fill.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-fill.obj `if test -f 'rectilinear-fill.c'; then $(CYGPATH_W) 'rectilinear-fill.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-fill.c'; fi` + +cairo_test_suite-rectilinear-grid.o: rectilinear-grid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-grid.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-grid.Tpo -c -o cairo_test_suite-rectilinear-grid.o `test -f 'rectilinear-grid.c' || echo '$(srcdir)/'`rectilinear-grid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-grid.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-grid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-grid.c' object='cairo_test_suite-rectilinear-grid.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-grid.o `test -f 'rectilinear-grid.c' || echo '$(srcdir)/'`rectilinear-grid.c + +cairo_test_suite-rectilinear-grid.obj: rectilinear-grid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-grid.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-grid.Tpo -c -o cairo_test_suite-rectilinear-grid.obj `if test -f 'rectilinear-grid.c'; then $(CYGPATH_W) 'rectilinear-grid.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-grid.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-grid.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-grid.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-grid.c' object='cairo_test_suite-rectilinear-grid.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-grid.obj `if test -f 'rectilinear-grid.c'; then $(CYGPATH_W) 'rectilinear-grid.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-grid.c'; fi` + +cairo_test_suite-rectilinear-miter-limit.o: rectilinear-miter-limit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-miter-limit.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Tpo -c -o cairo_test_suite-rectilinear-miter-limit.o `test -f 'rectilinear-miter-limit.c' || echo '$(srcdir)/'`rectilinear-miter-limit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-miter-limit.c' object='cairo_test_suite-rectilinear-miter-limit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-miter-limit.o `test -f 'rectilinear-miter-limit.c' || echo '$(srcdir)/'`rectilinear-miter-limit.c + +cairo_test_suite-rectilinear-miter-limit.obj: rectilinear-miter-limit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-miter-limit.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Tpo -c -o cairo_test_suite-rectilinear-miter-limit.obj `if test -f 'rectilinear-miter-limit.c'; then $(CYGPATH_W) 'rectilinear-miter-limit.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-miter-limit.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-miter-limit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-miter-limit.c' object='cairo_test_suite-rectilinear-miter-limit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-miter-limit.obj `if test -f 'rectilinear-miter-limit.c'; then $(CYGPATH_W) 'rectilinear-miter-limit.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-miter-limit.c'; fi` + +cairo_test_suite-rectilinear-dash.o: rectilinear-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-dash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-dash.Tpo -c -o cairo_test_suite-rectilinear-dash.o `test -f 'rectilinear-dash.c' || echo '$(srcdir)/'`rectilinear-dash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-dash.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-dash.c' object='cairo_test_suite-rectilinear-dash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-dash.o `test -f 'rectilinear-dash.c' || echo '$(srcdir)/'`rectilinear-dash.c + +cairo_test_suite-rectilinear-dash.obj: rectilinear-dash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-dash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-dash.Tpo -c -o cairo_test_suite-rectilinear-dash.obj `if test -f 'rectilinear-dash.c'; then $(CYGPATH_W) 'rectilinear-dash.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-dash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-dash.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-dash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-dash.c' object='cairo_test_suite-rectilinear-dash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-dash.obj `if test -f 'rectilinear-dash.c'; then $(CYGPATH_W) 'rectilinear-dash.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-dash.c'; fi` + +cairo_test_suite-rectilinear-dash-scale.o: rectilinear-dash-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-dash-scale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Tpo -c -o cairo_test_suite-rectilinear-dash-scale.o `test -f 'rectilinear-dash-scale.c' || echo '$(srcdir)/'`rectilinear-dash-scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-dash-scale.c' object='cairo_test_suite-rectilinear-dash-scale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-dash-scale.o `test -f 'rectilinear-dash-scale.c' || echo '$(srcdir)/'`rectilinear-dash-scale.c + +cairo_test_suite-rectilinear-dash-scale.obj: rectilinear-dash-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-dash-scale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Tpo -c -o cairo_test_suite-rectilinear-dash-scale.obj `if test -f 'rectilinear-dash-scale.c'; then $(CYGPATH_W) 'rectilinear-dash-scale.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-dash-scale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-dash-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-dash-scale.c' object='cairo_test_suite-rectilinear-dash-scale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-dash-scale.obj `if test -f 'rectilinear-dash-scale.c'; then $(CYGPATH_W) 'rectilinear-dash-scale.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-dash-scale.c'; fi` + +cairo_test_suite-rectilinear-stroke.o: rectilinear-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-stroke.Tpo -c -o cairo_test_suite-rectilinear-stroke.o `test -f 'rectilinear-stroke.c' || echo '$(srcdir)/'`rectilinear-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-stroke.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-stroke.c' object='cairo_test_suite-rectilinear-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-stroke.o `test -f 'rectilinear-stroke.c' || echo '$(srcdir)/'`rectilinear-stroke.c + +cairo_test_suite-rectilinear-stroke.obj: rectilinear-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rectilinear-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rectilinear-stroke.Tpo -c -o cairo_test_suite-rectilinear-stroke.obj `if test -f 'rectilinear-stroke.c'; then $(CYGPATH_W) 'rectilinear-stroke.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rectilinear-stroke.Tpo $(DEPDIR)/cairo_test_suite-rectilinear-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rectilinear-stroke.c' object='cairo_test_suite-rectilinear-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rectilinear-stroke.obj `if test -f 'rectilinear-stroke.c'; then $(CYGPATH_W) 'rectilinear-stroke.c'; else $(CYGPATH_W) '$(srcdir)/rectilinear-stroke.c'; fi` + +cairo_test_suite-reflected-stroke.o: reflected-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-reflected-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-reflected-stroke.Tpo -c -o cairo_test_suite-reflected-stroke.o `test -f 'reflected-stroke.c' || echo '$(srcdir)/'`reflected-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-reflected-stroke.Tpo $(DEPDIR)/cairo_test_suite-reflected-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='reflected-stroke.c' object='cairo_test_suite-reflected-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-reflected-stroke.o `test -f 'reflected-stroke.c' || echo '$(srcdir)/'`reflected-stroke.c + +cairo_test_suite-reflected-stroke.obj: reflected-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-reflected-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-reflected-stroke.Tpo -c -o cairo_test_suite-reflected-stroke.obj `if test -f 'reflected-stroke.c'; then $(CYGPATH_W) 'reflected-stroke.c'; else $(CYGPATH_W) '$(srcdir)/reflected-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-reflected-stroke.Tpo $(DEPDIR)/cairo_test_suite-reflected-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='reflected-stroke.c' object='cairo_test_suite-reflected-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-reflected-stroke.obj `if test -f 'reflected-stroke.c'; then $(CYGPATH_W) 'reflected-stroke.c'; else $(CYGPATH_W) '$(srcdir)/reflected-stroke.c'; fi` + +cairo_test_suite-rel-path.o: rel-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rel-path.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rel-path.Tpo -c -o cairo_test_suite-rel-path.o `test -f 'rel-path.c' || echo '$(srcdir)/'`rel-path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rel-path.Tpo $(DEPDIR)/cairo_test_suite-rel-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rel-path.c' object='cairo_test_suite-rel-path.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rel-path.o `test -f 'rel-path.c' || echo '$(srcdir)/'`rel-path.c + +cairo_test_suite-rel-path.obj: rel-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rel-path.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rel-path.Tpo -c -o cairo_test_suite-rel-path.obj `if test -f 'rel-path.c'; then $(CYGPATH_W) 'rel-path.c'; else $(CYGPATH_W) '$(srcdir)/rel-path.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rel-path.Tpo $(DEPDIR)/cairo_test_suite-rel-path.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rel-path.c' object='cairo_test_suite-rel-path.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rel-path.obj `if test -f 'rel-path.c'; then $(CYGPATH_W) 'rel-path.c'; else $(CYGPATH_W) '$(srcdir)/rel-path.c'; fi` + +cairo_test_suite-rgb24-ignore-alpha.o: rgb24-ignore-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rgb24-ignore-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Tpo -c -o cairo_test_suite-rgb24-ignore-alpha.o `test -f 'rgb24-ignore-alpha.c' || echo '$(srcdir)/'`rgb24-ignore-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Tpo $(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rgb24-ignore-alpha.c' object='cairo_test_suite-rgb24-ignore-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rgb24-ignore-alpha.o `test -f 'rgb24-ignore-alpha.c' || echo '$(srcdir)/'`rgb24-ignore-alpha.c + +cairo_test_suite-rgb24-ignore-alpha.obj: rgb24-ignore-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rgb24-ignore-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Tpo -c -o cairo_test_suite-rgb24-ignore-alpha.obj `if test -f 'rgb24-ignore-alpha.c'; then $(CYGPATH_W) 'rgb24-ignore-alpha.c'; else $(CYGPATH_W) '$(srcdir)/rgb24-ignore-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Tpo $(DEPDIR)/cairo_test_suite-rgb24-ignore-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rgb24-ignore-alpha.c' object='cairo_test_suite-rgb24-ignore-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rgb24-ignore-alpha.obj `if test -f 'rgb24-ignore-alpha.c'; then $(CYGPATH_W) 'rgb24-ignore-alpha.c'; else $(CYGPATH_W) '$(srcdir)/rgb24-ignore-alpha.c'; fi` + +cairo_test_suite-rotate-image-surface-paint.o: rotate-image-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rotate-image-surface-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Tpo -c -o cairo_test_suite-rotate-image-surface-paint.o `test -f 'rotate-image-surface-paint.c' || echo '$(srcdir)/'`rotate-image-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Tpo $(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rotate-image-surface-paint.c' object='cairo_test_suite-rotate-image-surface-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rotate-image-surface-paint.o `test -f 'rotate-image-surface-paint.c' || echo '$(srcdir)/'`rotate-image-surface-paint.c + +cairo_test_suite-rotate-image-surface-paint.obj: rotate-image-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rotate-image-surface-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Tpo -c -o cairo_test_suite-rotate-image-surface-paint.obj `if test -f 'rotate-image-surface-paint.c'; then $(CYGPATH_W) 'rotate-image-surface-paint.c'; else $(CYGPATH_W) '$(srcdir)/rotate-image-surface-paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Tpo $(DEPDIR)/cairo_test_suite-rotate-image-surface-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rotate-image-surface-paint.c' object='cairo_test_suite-rotate-image-surface-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rotate-image-surface-paint.obj `if test -f 'rotate-image-surface-paint.c'; then $(CYGPATH_W) 'rotate-image-surface-paint.c'; else $(CYGPATH_W) '$(srcdir)/rotate-image-surface-paint.c'; fi` + +cairo_test_suite-rotate-stroke-box.o: rotate-stroke-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rotate-stroke-box.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rotate-stroke-box.Tpo -c -o cairo_test_suite-rotate-stroke-box.o `test -f 'rotate-stroke-box.c' || echo '$(srcdir)/'`rotate-stroke-box.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rotate-stroke-box.Tpo $(DEPDIR)/cairo_test_suite-rotate-stroke-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rotate-stroke-box.c' object='cairo_test_suite-rotate-stroke-box.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rotate-stroke-box.o `test -f 'rotate-stroke-box.c' || echo '$(srcdir)/'`rotate-stroke-box.c + +cairo_test_suite-rotate-stroke-box.obj: rotate-stroke-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rotate-stroke-box.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rotate-stroke-box.Tpo -c -o cairo_test_suite-rotate-stroke-box.obj `if test -f 'rotate-stroke-box.c'; then $(CYGPATH_W) 'rotate-stroke-box.c'; else $(CYGPATH_W) '$(srcdir)/rotate-stroke-box.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rotate-stroke-box.Tpo $(DEPDIR)/cairo_test_suite-rotate-stroke-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rotate-stroke-box.c' object='cairo_test_suite-rotate-stroke-box.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rotate-stroke-box.obj `if test -f 'rotate-stroke-box.c'; then $(CYGPATH_W) 'rotate-stroke-box.c'; else $(CYGPATH_W) '$(srcdir)/rotate-stroke-box.c'; fi` + +cairo_test_suite-rotated-clip.o: rotated-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rotated-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rotated-clip.Tpo -c -o cairo_test_suite-rotated-clip.o `test -f 'rotated-clip.c' || echo '$(srcdir)/'`rotated-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rotated-clip.Tpo $(DEPDIR)/cairo_test_suite-rotated-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rotated-clip.c' object='cairo_test_suite-rotated-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rotated-clip.o `test -f 'rotated-clip.c' || echo '$(srcdir)/'`rotated-clip.c + +cairo_test_suite-rotated-clip.obj: rotated-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rotated-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rotated-clip.Tpo -c -o cairo_test_suite-rotated-clip.obj `if test -f 'rotated-clip.c'; then $(CYGPATH_W) 'rotated-clip.c'; else $(CYGPATH_W) '$(srcdir)/rotated-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rotated-clip.Tpo $(DEPDIR)/cairo_test_suite-rotated-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rotated-clip.c' object='cairo_test_suite-rotated-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rotated-clip.obj `if test -f 'rotated-clip.c'; then $(CYGPATH_W) 'rotated-clip.c'; else $(CYGPATH_W) '$(srcdir)/rotated-clip.c'; fi` + +cairo_test_suite-rounded-rectangle-fill.o: rounded-rectangle-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rounded-rectangle-fill.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Tpo -c -o cairo_test_suite-rounded-rectangle-fill.o `test -f 'rounded-rectangle-fill.c' || echo '$(srcdir)/'`rounded-rectangle-fill.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Tpo $(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rounded-rectangle-fill.c' object='cairo_test_suite-rounded-rectangle-fill.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rounded-rectangle-fill.o `test -f 'rounded-rectangle-fill.c' || echo '$(srcdir)/'`rounded-rectangle-fill.c + +cairo_test_suite-rounded-rectangle-fill.obj: rounded-rectangle-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rounded-rectangle-fill.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Tpo -c -o cairo_test_suite-rounded-rectangle-fill.obj `if test -f 'rounded-rectangle-fill.c'; then $(CYGPATH_W) 'rounded-rectangle-fill.c'; else $(CYGPATH_W) '$(srcdir)/rounded-rectangle-fill.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Tpo $(DEPDIR)/cairo_test_suite-rounded-rectangle-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rounded-rectangle-fill.c' object='cairo_test_suite-rounded-rectangle-fill.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rounded-rectangle-fill.obj `if test -f 'rounded-rectangle-fill.c'; then $(CYGPATH_W) 'rounded-rectangle-fill.c'; else $(CYGPATH_W) '$(srcdir)/rounded-rectangle-fill.c'; fi` + +cairo_test_suite-rounded-rectangle-stroke.o: rounded-rectangle-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rounded-rectangle-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Tpo -c -o cairo_test_suite-rounded-rectangle-stroke.o `test -f 'rounded-rectangle-stroke.c' || echo '$(srcdir)/'`rounded-rectangle-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Tpo $(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rounded-rectangle-stroke.c' object='cairo_test_suite-rounded-rectangle-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rounded-rectangle-stroke.o `test -f 'rounded-rectangle-stroke.c' || echo '$(srcdir)/'`rounded-rectangle-stroke.c + +cairo_test_suite-rounded-rectangle-stroke.obj: rounded-rectangle-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-rounded-rectangle-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Tpo -c -o cairo_test_suite-rounded-rectangle-stroke.obj `if test -f 'rounded-rectangle-stroke.c'; then $(CYGPATH_W) 'rounded-rectangle-stroke.c'; else $(CYGPATH_W) '$(srcdir)/rounded-rectangle-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Tpo $(DEPDIR)/cairo_test_suite-rounded-rectangle-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rounded-rectangle-stroke.c' object='cairo_test_suite-rounded-rectangle-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-rounded-rectangle-stroke.obj `if test -f 'rounded-rectangle-stroke.c'; then $(CYGPATH_W) 'rounded-rectangle-stroke.c'; else $(CYGPATH_W) '$(srcdir)/rounded-rectangle-stroke.c'; fi` + +cairo_test_suite-sample.o: sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-sample.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-sample.Tpo -c -o cairo_test_suite-sample.o `test -f 'sample.c' || echo '$(srcdir)/'`sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-sample.Tpo $(DEPDIR)/cairo_test_suite-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sample.c' object='cairo_test_suite-sample.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-sample.o `test -f 'sample.c' || echo '$(srcdir)/'`sample.c + +cairo_test_suite-sample.obj: sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-sample.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-sample.Tpo -c -o cairo_test_suite-sample.obj `if test -f 'sample.c'; then $(CYGPATH_W) 'sample.c'; else $(CYGPATH_W) '$(srcdir)/sample.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-sample.Tpo $(DEPDIR)/cairo_test_suite-sample.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sample.c' object='cairo_test_suite-sample.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-sample.obj `if test -f 'sample.c'; then $(CYGPATH_W) 'sample.c'; else $(CYGPATH_W) '$(srcdir)/sample.c'; fi` + +cairo_test_suite-scale-down-source-surface-paint.o: scale-down-source-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-down-source-surface-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Tpo -c -o cairo_test_suite-scale-down-source-surface-paint.o `test -f 'scale-down-source-surface-paint.c' || echo '$(srcdir)/'`scale-down-source-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Tpo $(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-down-source-surface-paint.c' object='cairo_test_suite-scale-down-source-surface-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-down-source-surface-paint.o `test -f 'scale-down-source-surface-paint.c' || echo '$(srcdir)/'`scale-down-source-surface-paint.c + +cairo_test_suite-scale-down-source-surface-paint.obj: scale-down-source-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-down-source-surface-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Tpo -c -o cairo_test_suite-scale-down-source-surface-paint.obj `if test -f 'scale-down-source-surface-paint.c'; then $(CYGPATH_W) 'scale-down-source-surface-paint.c'; else $(CYGPATH_W) '$(srcdir)/scale-down-source-surface-paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Tpo $(DEPDIR)/cairo_test_suite-scale-down-source-surface-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-down-source-surface-paint.c' object='cairo_test_suite-scale-down-source-surface-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-down-source-surface-paint.obj `if test -f 'scale-down-source-surface-paint.c'; then $(CYGPATH_W) 'scale-down-source-surface-paint.c'; else $(CYGPATH_W) '$(srcdir)/scale-down-source-surface-paint.c'; fi` + +cairo_test_suite-scale-offset-image.o: scale-offset-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-offset-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-offset-image.Tpo -c -o cairo_test_suite-scale-offset-image.o `test -f 'scale-offset-image.c' || echo '$(srcdir)/'`scale-offset-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-offset-image.Tpo $(DEPDIR)/cairo_test_suite-scale-offset-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-offset-image.c' object='cairo_test_suite-scale-offset-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-offset-image.o `test -f 'scale-offset-image.c' || echo '$(srcdir)/'`scale-offset-image.c + +cairo_test_suite-scale-offset-image.obj: scale-offset-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-offset-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-offset-image.Tpo -c -o cairo_test_suite-scale-offset-image.obj `if test -f 'scale-offset-image.c'; then $(CYGPATH_W) 'scale-offset-image.c'; else $(CYGPATH_W) '$(srcdir)/scale-offset-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-offset-image.Tpo $(DEPDIR)/cairo_test_suite-scale-offset-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-offset-image.c' object='cairo_test_suite-scale-offset-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-offset-image.obj `if test -f 'scale-offset-image.c'; then $(CYGPATH_W) 'scale-offset-image.c'; else $(CYGPATH_W) '$(srcdir)/scale-offset-image.c'; fi` + +cairo_test_suite-scale-offset-similar.o: scale-offset-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-offset-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-offset-similar.Tpo -c -o cairo_test_suite-scale-offset-similar.o `test -f 'scale-offset-similar.c' || echo '$(srcdir)/'`scale-offset-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-offset-similar.Tpo $(DEPDIR)/cairo_test_suite-scale-offset-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-offset-similar.c' object='cairo_test_suite-scale-offset-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-offset-similar.o `test -f 'scale-offset-similar.c' || echo '$(srcdir)/'`scale-offset-similar.c + +cairo_test_suite-scale-offset-similar.obj: scale-offset-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-offset-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-offset-similar.Tpo -c -o cairo_test_suite-scale-offset-similar.obj `if test -f 'scale-offset-similar.c'; then $(CYGPATH_W) 'scale-offset-similar.c'; else $(CYGPATH_W) '$(srcdir)/scale-offset-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-offset-similar.Tpo $(DEPDIR)/cairo_test_suite-scale-offset-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-offset-similar.c' object='cairo_test_suite-scale-offset-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-offset-similar.obj `if test -f 'scale-offset-similar.c'; then $(CYGPATH_W) 'scale-offset-similar.c'; else $(CYGPATH_W) '$(srcdir)/scale-offset-similar.c'; fi` + +cairo_test_suite-scale-source-surface-paint.o: scale-source-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-source-surface-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Tpo -c -o cairo_test_suite-scale-source-surface-paint.o `test -f 'scale-source-surface-paint.c' || echo '$(srcdir)/'`scale-source-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Tpo $(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-source-surface-paint.c' object='cairo_test_suite-scale-source-surface-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-source-surface-paint.o `test -f 'scale-source-surface-paint.c' || echo '$(srcdir)/'`scale-source-surface-paint.c + +cairo_test_suite-scale-source-surface-paint.obj: scale-source-surface-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scale-source-surface-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Tpo -c -o cairo_test_suite-scale-source-surface-paint.obj `if test -f 'scale-source-surface-paint.c'; then $(CYGPATH_W) 'scale-source-surface-paint.c'; else $(CYGPATH_W) '$(srcdir)/scale-source-surface-paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Tpo $(DEPDIR)/cairo_test_suite-scale-source-surface-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scale-source-surface-paint.c' object='cairo_test_suite-scale-source-surface-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scale-source-surface-paint.obj `if test -f 'scale-source-surface-paint.c'; then $(CYGPATH_W) 'scale-source-surface-paint.c'; else $(CYGPATH_W) '$(srcdir)/scale-source-surface-paint.c'; fi` + +cairo_test_suite-scaled-font-zero-matrix.o: scaled-font-zero-matrix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scaled-font-zero-matrix.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Tpo -c -o cairo_test_suite-scaled-font-zero-matrix.o `test -f 'scaled-font-zero-matrix.c' || echo '$(srcdir)/'`scaled-font-zero-matrix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Tpo $(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scaled-font-zero-matrix.c' object='cairo_test_suite-scaled-font-zero-matrix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scaled-font-zero-matrix.o `test -f 'scaled-font-zero-matrix.c' || echo '$(srcdir)/'`scaled-font-zero-matrix.c + +cairo_test_suite-scaled-font-zero-matrix.obj: scaled-font-zero-matrix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-scaled-font-zero-matrix.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Tpo -c -o cairo_test_suite-scaled-font-zero-matrix.obj `if test -f 'scaled-font-zero-matrix.c'; then $(CYGPATH_W) 'scaled-font-zero-matrix.c'; else $(CYGPATH_W) '$(srcdir)/scaled-font-zero-matrix.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Tpo $(DEPDIR)/cairo_test_suite-scaled-font-zero-matrix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scaled-font-zero-matrix.c' object='cairo_test_suite-scaled-font-zero-matrix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-scaled-font-zero-matrix.obj `if test -f 'scaled-font-zero-matrix.c'; then $(CYGPATH_W) 'scaled-font-zero-matrix.c'; else $(CYGPATH_W) '$(srcdir)/scaled-font-zero-matrix.c'; fi` + +cairo_test_suite-stroke-ctm-caps.o: stroke-ctm-caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-ctm-caps.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Tpo -c -o cairo_test_suite-stroke-ctm-caps.o `test -f 'stroke-ctm-caps.c' || echo '$(srcdir)/'`stroke-ctm-caps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Tpo $(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-ctm-caps.c' object='cairo_test_suite-stroke-ctm-caps.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-ctm-caps.o `test -f 'stroke-ctm-caps.c' || echo '$(srcdir)/'`stroke-ctm-caps.c + +cairo_test_suite-stroke-ctm-caps.obj: stroke-ctm-caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-ctm-caps.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Tpo -c -o cairo_test_suite-stroke-ctm-caps.obj `if test -f 'stroke-ctm-caps.c'; then $(CYGPATH_W) 'stroke-ctm-caps.c'; else $(CYGPATH_W) '$(srcdir)/stroke-ctm-caps.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Tpo $(DEPDIR)/cairo_test_suite-stroke-ctm-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-ctm-caps.c' object='cairo_test_suite-stroke-ctm-caps.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-ctm-caps.obj `if test -f 'stroke-ctm-caps.c'; then $(CYGPATH_W) 'stroke-ctm-caps.c'; else $(CYGPATH_W) '$(srcdir)/stroke-ctm-caps.c'; fi` + +cairo_test_suite-stroke-clipped.o: stroke-clipped.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-clipped.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-clipped.Tpo -c -o cairo_test_suite-stroke-clipped.o `test -f 'stroke-clipped.c' || echo '$(srcdir)/'`stroke-clipped.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-clipped.Tpo $(DEPDIR)/cairo_test_suite-stroke-clipped.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-clipped.c' object='cairo_test_suite-stroke-clipped.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-clipped.o `test -f 'stroke-clipped.c' || echo '$(srcdir)/'`stroke-clipped.c + +cairo_test_suite-stroke-clipped.obj: stroke-clipped.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-clipped.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-clipped.Tpo -c -o cairo_test_suite-stroke-clipped.obj `if test -f 'stroke-clipped.c'; then $(CYGPATH_W) 'stroke-clipped.c'; else $(CYGPATH_W) '$(srcdir)/stroke-clipped.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-clipped.Tpo $(DEPDIR)/cairo_test_suite-stroke-clipped.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-clipped.c' object='cairo_test_suite-stroke-clipped.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-clipped.obj `if test -f 'stroke-clipped.c'; then $(CYGPATH_W) 'stroke-clipped.c'; else $(CYGPATH_W) '$(srcdir)/stroke-clipped.c'; fi` + +cairo_test_suite-stroke-image.o: stroke-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-image.Tpo -c -o cairo_test_suite-stroke-image.o `test -f 'stroke-image.c' || echo '$(srcdir)/'`stroke-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-image.Tpo $(DEPDIR)/cairo_test_suite-stroke-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-image.c' object='cairo_test_suite-stroke-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-image.o `test -f 'stroke-image.c' || echo '$(srcdir)/'`stroke-image.c + +cairo_test_suite-stroke-image.obj: stroke-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-image.Tpo -c -o cairo_test_suite-stroke-image.obj `if test -f 'stroke-image.c'; then $(CYGPATH_W) 'stroke-image.c'; else $(CYGPATH_W) '$(srcdir)/stroke-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-image.Tpo $(DEPDIR)/cairo_test_suite-stroke-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-image.c' object='cairo_test_suite-stroke-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-image.obj `if test -f 'stroke-image.c'; then $(CYGPATH_W) 'stroke-image.c'; else $(CYGPATH_W) '$(srcdir)/stroke-image.c'; fi` + +cairo_test_suite-stroke-open-box.o: stroke-open-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-open-box.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-open-box.Tpo -c -o cairo_test_suite-stroke-open-box.o `test -f 'stroke-open-box.c' || echo '$(srcdir)/'`stroke-open-box.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-open-box.Tpo $(DEPDIR)/cairo_test_suite-stroke-open-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-open-box.c' object='cairo_test_suite-stroke-open-box.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-open-box.o `test -f 'stroke-open-box.c' || echo '$(srcdir)/'`stroke-open-box.c + +cairo_test_suite-stroke-open-box.obj: stroke-open-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-open-box.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-open-box.Tpo -c -o cairo_test_suite-stroke-open-box.obj `if test -f 'stroke-open-box.c'; then $(CYGPATH_W) 'stroke-open-box.c'; else $(CYGPATH_W) '$(srcdir)/stroke-open-box.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-open-box.Tpo $(DEPDIR)/cairo_test_suite-stroke-open-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-open-box.c' object='cairo_test_suite-stroke-open-box.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-open-box.obj `if test -f 'stroke-open-box.c'; then $(CYGPATH_W) 'stroke-open-box.c'; else $(CYGPATH_W) '$(srcdir)/stroke-open-box.c'; fi` + +cairo_test_suite-select-font-face.o: select-font-face.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-select-font-face.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-select-font-face.Tpo -c -o cairo_test_suite-select-font-face.o `test -f 'select-font-face.c' || echo '$(srcdir)/'`select-font-face.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-select-font-face.Tpo $(DEPDIR)/cairo_test_suite-select-font-face.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='select-font-face.c' object='cairo_test_suite-select-font-face.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-select-font-face.o `test -f 'select-font-face.c' || echo '$(srcdir)/'`select-font-face.c + +cairo_test_suite-select-font-face.obj: select-font-face.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-select-font-face.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-select-font-face.Tpo -c -o cairo_test_suite-select-font-face.obj `if test -f 'select-font-face.c'; then $(CYGPATH_W) 'select-font-face.c'; else $(CYGPATH_W) '$(srcdir)/select-font-face.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-select-font-face.Tpo $(DEPDIR)/cairo_test_suite-select-font-face.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='select-font-face.c' object='cairo_test_suite-select-font-face.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-select-font-face.obj `if test -f 'select-font-face.c'; then $(CYGPATH_W) 'select-font-face.c'; else $(CYGPATH_W) '$(srcdir)/select-font-face.c'; fi` + +cairo_test_suite-select-font-no-show-text.o: select-font-no-show-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-select-font-no-show-text.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-select-font-no-show-text.Tpo -c -o cairo_test_suite-select-font-no-show-text.o `test -f 'select-font-no-show-text.c' || echo '$(srcdir)/'`select-font-no-show-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-select-font-no-show-text.Tpo $(DEPDIR)/cairo_test_suite-select-font-no-show-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='select-font-no-show-text.c' object='cairo_test_suite-select-font-no-show-text.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-select-font-no-show-text.o `test -f 'select-font-no-show-text.c' || echo '$(srcdir)/'`select-font-no-show-text.c + +cairo_test_suite-select-font-no-show-text.obj: select-font-no-show-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-select-font-no-show-text.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-select-font-no-show-text.Tpo -c -o cairo_test_suite-select-font-no-show-text.obj `if test -f 'select-font-no-show-text.c'; then $(CYGPATH_W) 'select-font-no-show-text.c'; else $(CYGPATH_W) '$(srcdir)/select-font-no-show-text.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-select-font-no-show-text.Tpo $(DEPDIR)/cairo_test_suite-select-font-no-show-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='select-font-no-show-text.c' object='cairo_test_suite-select-font-no-show-text.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-select-font-no-show-text.obj `if test -f 'select-font-no-show-text.c'; then $(CYGPATH_W) 'select-font-no-show-text.c'; else $(CYGPATH_W) '$(srcdir)/select-font-no-show-text.c'; fi` + +cairo_test_suite-self-copy.o: self-copy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-self-copy.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-self-copy.Tpo -c -o cairo_test_suite-self-copy.o `test -f 'self-copy.c' || echo '$(srcdir)/'`self-copy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-self-copy.Tpo $(DEPDIR)/cairo_test_suite-self-copy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='self-copy.c' object='cairo_test_suite-self-copy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-self-copy.o `test -f 'self-copy.c' || echo '$(srcdir)/'`self-copy.c + +cairo_test_suite-self-copy.obj: self-copy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-self-copy.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-self-copy.Tpo -c -o cairo_test_suite-self-copy.obj `if test -f 'self-copy.c'; then $(CYGPATH_W) 'self-copy.c'; else $(CYGPATH_W) '$(srcdir)/self-copy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-self-copy.Tpo $(DEPDIR)/cairo_test_suite-self-copy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='self-copy.c' object='cairo_test_suite-self-copy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-self-copy.obj `if test -f 'self-copy.c'; then $(CYGPATH_W) 'self-copy.c'; else $(CYGPATH_W) '$(srcdir)/self-copy.c'; fi` + +cairo_test_suite-self-copy-overlap.o: self-copy-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-self-copy-overlap.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-self-copy-overlap.Tpo -c -o cairo_test_suite-self-copy-overlap.o `test -f 'self-copy-overlap.c' || echo '$(srcdir)/'`self-copy-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-self-copy-overlap.Tpo $(DEPDIR)/cairo_test_suite-self-copy-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='self-copy-overlap.c' object='cairo_test_suite-self-copy-overlap.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-self-copy-overlap.o `test -f 'self-copy-overlap.c' || echo '$(srcdir)/'`self-copy-overlap.c + +cairo_test_suite-self-copy-overlap.obj: self-copy-overlap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-self-copy-overlap.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-self-copy-overlap.Tpo -c -o cairo_test_suite-self-copy-overlap.obj `if test -f 'self-copy-overlap.c'; then $(CYGPATH_W) 'self-copy-overlap.c'; else $(CYGPATH_W) '$(srcdir)/self-copy-overlap.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-self-copy-overlap.Tpo $(DEPDIR)/cairo_test_suite-self-copy-overlap.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='self-copy-overlap.c' object='cairo_test_suite-self-copy-overlap.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-self-copy-overlap.obj `if test -f 'self-copy-overlap.c'; then $(CYGPATH_W) 'self-copy-overlap.c'; else $(CYGPATH_W) '$(srcdir)/self-copy-overlap.c'; fi` + +cairo_test_suite-self-intersecting.o: self-intersecting.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-self-intersecting.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-self-intersecting.Tpo -c -o cairo_test_suite-self-intersecting.o `test -f 'self-intersecting.c' || echo '$(srcdir)/'`self-intersecting.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-self-intersecting.Tpo $(DEPDIR)/cairo_test_suite-self-intersecting.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='self-intersecting.c' object='cairo_test_suite-self-intersecting.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-self-intersecting.o `test -f 'self-intersecting.c' || echo '$(srcdir)/'`self-intersecting.c + +cairo_test_suite-self-intersecting.obj: self-intersecting.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-self-intersecting.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-self-intersecting.Tpo -c -o cairo_test_suite-self-intersecting.obj `if test -f 'self-intersecting.c'; then $(CYGPATH_W) 'self-intersecting.c'; else $(CYGPATH_W) '$(srcdir)/self-intersecting.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-self-intersecting.Tpo $(DEPDIR)/cairo_test_suite-self-intersecting.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='self-intersecting.c' object='cairo_test_suite-self-intersecting.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-self-intersecting.obj `if test -f 'self-intersecting.c'; then $(CYGPATH_W) 'self-intersecting.c'; else $(CYGPATH_W) '$(srcdir)/self-intersecting.c'; fi` + +cairo_test_suite-set-source.o: set-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-set-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-set-source.Tpo -c -o cairo_test_suite-set-source.o `test -f 'set-source.c' || echo '$(srcdir)/'`set-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-set-source.Tpo $(DEPDIR)/cairo_test_suite-set-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='set-source.c' object='cairo_test_suite-set-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-set-source.o `test -f 'set-source.c' || echo '$(srcdir)/'`set-source.c + +cairo_test_suite-set-source.obj: set-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-set-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-set-source.Tpo -c -o cairo_test_suite-set-source.obj `if test -f 'set-source.c'; then $(CYGPATH_W) 'set-source.c'; else $(CYGPATH_W) '$(srcdir)/set-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-set-source.Tpo $(DEPDIR)/cairo_test_suite-set-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='set-source.c' object='cairo_test_suite-set-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-set-source.obj `if test -f 'set-source.c'; then $(CYGPATH_W) 'set-source.c'; else $(CYGPATH_W) '$(srcdir)/set-source.c'; fi` + +cairo_test_suite-show-glyphs-advance.o: show-glyphs-advance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-show-glyphs-advance.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-show-glyphs-advance.Tpo -c -o cairo_test_suite-show-glyphs-advance.o `test -f 'show-glyphs-advance.c' || echo '$(srcdir)/'`show-glyphs-advance.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-show-glyphs-advance.Tpo $(DEPDIR)/cairo_test_suite-show-glyphs-advance.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-glyphs-advance.c' object='cairo_test_suite-show-glyphs-advance.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-show-glyphs-advance.o `test -f 'show-glyphs-advance.c' || echo '$(srcdir)/'`show-glyphs-advance.c + +cairo_test_suite-show-glyphs-advance.obj: show-glyphs-advance.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-show-glyphs-advance.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-show-glyphs-advance.Tpo -c -o cairo_test_suite-show-glyphs-advance.obj `if test -f 'show-glyphs-advance.c'; then $(CYGPATH_W) 'show-glyphs-advance.c'; else $(CYGPATH_W) '$(srcdir)/show-glyphs-advance.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-show-glyphs-advance.Tpo $(DEPDIR)/cairo_test_suite-show-glyphs-advance.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-glyphs-advance.c' object='cairo_test_suite-show-glyphs-advance.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-show-glyphs-advance.obj `if test -f 'show-glyphs-advance.c'; then $(CYGPATH_W) 'show-glyphs-advance.c'; else $(CYGPATH_W) '$(srcdir)/show-glyphs-advance.c'; fi` + +cairo_test_suite-show-glyphs-many.o: show-glyphs-many.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-show-glyphs-many.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-show-glyphs-many.Tpo -c -o cairo_test_suite-show-glyphs-many.o `test -f 'show-glyphs-many.c' || echo '$(srcdir)/'`show-glyphs-many.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-show-glyphs-many.Tpo $(DEPDIR)/cairo_test_suite-show-glyphs-many.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-glyphs-many.c' object='cairo_test_suite-show-glyphs-many.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-show-glyphs-many.o `test -f 'show-glyphs-many.c' || echo '$(srcdir)/'`show-glyphs-many.c + +cairo_test_suite-show-glyphs-many.obj: show-glyphs-many.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-show-glyphs-many.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-show-glyphs-many.Tpo -c -o cairo_test_suite-show-glyphs-many.obj `if test -f 'show-glyphs-many.c'; then $(CYGPATH_W) 'show-glyphs-many.c'; else $(CYGPATH_W) '$(srcdir)/show-glyphs-many.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-show-glyphs-many.Tpo $(DEPDIR)/cairo_test_suite-show-glyphs-many.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-glyphs-many.c' object='cairo_test_suite-show-glyphs-many.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-show-glyphs-many.obj `if test -f 'show-glyphs-many.c'; then $(CYGPATH_W) 'show-glyphs-many.c'; else $(CYGPATH_W) '$(srcdir)/show-glyphs-many.c'; fi` + +cairo_test_suite-show-text-current-point.o: show-text-current-point.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-show-text-current-point.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-show-text-current-point.Tpo -c -o cairo_test_suite-show-text-current-point.o `test -f 'show-text-current-point.c' || echo '$(srcdir)/'`show-text-current-point.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-show-text-current-point.Tpo $(DEPDIR)/cairo_test_suite-show-text-current-point.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-text-current-point.c' object='cairo_test_suite-show-text-current-point.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-show-text-current-point.o `test -f 'show-text-current-point.c' || echo '$(srcdir)/'`show-text-current-point.c + +cairo_test_suite-show-text-current-point.obj: show-text-current-point.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-show-text-current-point.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-show-text-current-point.Tpo -c -o cairo_test_suite-show-text-current-point.obj `if test -f 'show-text-current-point.c'; then $(CYGPATH_W) 'show-text-current-point.c'; else $(CYGPATH_W) '$(srcdir)/show-text-current-point.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-show-text-current-point.Tpo $(DEPDIR)/cairo_test_suite-show-text-current-point.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-text-current-point.c' object='cairo_test_suite-show-text-current-point.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-show-text-current-point.obj `if test -f 'show-text-current-point.c'; then $(CYGPATH_W) 'show-text-current-point.c'; else $(CYGPATH_W) '$(srcdir)/show-text-current-point.c'; fi` + +cairo_test_suite-shape-general-convex.o: shape-general-convex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-shape-general-convex.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-shape-general-convex.Tpo -c -o cairo_test_suite-shape-general-convex.o `test -f 'shape-general-convex.c' || echo '$(srcdir)/'`shape-general-convex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-shape-general-convex.Tpo $(DEPDIR)/cairo_test_suite-shape-general-convex.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shape-general-convex.c' object='cairo_test_suite-shape-general-convex.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-shape-general-convex.o `test -f 'shape-general-convex.c' || echo '$(srcdir)/'`shape-general-convex.c + +cairo_test_suite-shape-general-convex.obj: shape-general-convex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-shape-general-convex.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-shape-general-convex.Tpo -c -o cairo_test_suite-shape-general-convex.obj `if test -f 'shape-general-convex.c'; then $(CYGPATH_W) 'shape-general-convex.c'; else $(CYGPATH_W) '$(srcdir)/shape-general-convex.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-shape-general-convex.Tpo $(DEPDIR)/cairo_test_suite-shape-general-convex.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shape-general-convex.c' object='cairo_test_suite-shape-general-convex.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-shape-general-convex.obj `if test -f 'shape-general-convex.c'; then $(CYGPATH_W) 'shape-general-convex.c'; else $(CYGPATH_W) '$(srcdir)/shape-general-convex.c'; fi` + +cairo_test_suite-shape-sierpinski.o: shape-sierpinski.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-shape-sierpinski.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-shape-sierpinski.Tpo -c -o cairo_test_suite-shape-sierpinski.o `test -f 'shape-sierpinski.c' || echo '$(srcdir)/'`shape-sierpinski.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-shape-sierpinski.Tpo $(DEPDIR)/cairo_test_suite-shape-sierpinski.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shape-sierpinski.c' object='cairo_test_suite-shape-sierpinski.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-shape-sierpinski.o `test -f 'shape-sierpinski.c' || echo '$(srcdir)/'`shape-sierpinski.c + +cairo_test_suite-shape-sierpinski.obj: shape-sierpinski.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-shape-sierpinski.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-shape-sierpinski.Tpo -c -o cairo_test_suite-shape-sierpinski.obj `if test -f 'shape-sierpinski.c'; then $(CYGPATH_W) 'shape-sierpinski.c'; else $(CYGPATH_W) '$(srcdir)/shape-sierpinski.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-shape-sierpinski.Tpo $(DEPDIR)/cairo_test_suite-shape-sierpinski.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shape-sierpinski.c' object='cairo_test_suite-shape-sierpinski.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-shape-sierpinski.obj `if test -f 'shape-sierpinski.c'; then $(CYGPATH_W) 'shape-sierpinski.c'; else $(CYGPATH_W) '$(srcdir)/shape-sierpinski.c'; fi` + +cairo_test_suite-simple.o: simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-simple.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-simple.Tpo -c -o cairo_test_suite-simple.o `test -f 'simple.c' || echo '$(srcdir)/'`simple.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-simple.Tpo $(DEPDIR)/cairo_test_suite-simple.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simple.c' object='cairo_test_suite-simple.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-simple.o `test -f 'simple.c' || echo '$(srcdir)/'`simple.c + +cairo_test_suite-simple.obj: simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-simple.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-simple.Tpo -c -o cairo_test_suite-simple.obj `if test -f 'simple.c'; then $(CYGPATH_W) 'simple.c'; else $(CYGPATH_W) '$(srcdir)/simple.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-simple.Tpo $(DEPDIR)/cairo_test_suite-simple.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simple.c' object='cairo_test_suite-simple.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-simple.obj `if test -f 'simple.c'; then $(CYGPATH_W) 'simple.c'; else $(CYGPATH_W) '$(srcdir)/simple.c'; fi` + +cairo_test_suite-skew-extreme.o: skew-extreme.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-skew-extreme.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-skew-extreme.Tpo -c -o cairo_test_suite-skew-extreme.o `test -f 'skew-extreme.c' || echo '$(srcdir)/'`skew-extreme.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-skew-extreme.Tpo $(DEPDIR)/cairo_test_suite-skew-extreme.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='skew-extreme.c' object='cairo_test_suite-skew-extreme.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-skew-extreme.o `test -f 'skew-extreme.c' || echo '$(srcdir)/'`skew-extreme.c + +cairo_test_suite-skew-extreme.obj: skew-extreme.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-skew-extreme.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-skew-extreme.Tpo -c -o cairo_test_suite-skew-extreme.obj `if test -f 'skew-extreme.c'; then $(CYGPATH_W) 'skew-extreme.c'; else $(CYGPATH_W) '$(srcdir)/skew-extreme.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-skew-extreme.Tpo $(DEPDIR)/cairo_test_suite-skew-extreme.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='skew-extreme.c' object='cairo_test_suite-skew-extreme.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-skew-extreme.obj `if test -f 'skew-extreme.c'; then $(CYGPATH_W) 'skew-extreme.c'; else $(CYGPATH_W) '$(srcdir)/skew-extreme.c'; fi` + +cairo_test_suite-smask.o: smask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask.Tpo -c -o cairo_test_suite-smask.o `test -f 'smask.c' || echo '$(srcdir)/'`smask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask.Tpo $(DEPDIR)/cairo_test_suite-smask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask.c' object='cairo_test_suite-smask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask.o `test -f 'smask.c' || echo '$(srcdir)/'`smask.c + +cairo_test_suite-smask.obj: smask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask.Tpo -c -o cairo_test_suite-smask.obj `if test -f 'smask.c'; then $(CYGPATH_W) 'smask.c'; else $(CYGPATH_W) '$(srcdir)/smask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask.Tpo $(DEPDIR)/cairo_test_suite-smask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask.c' object='cairo_test_suite-smask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask.obj `if test -f 'smask.c'; then $(CYGPATH_W) 'smask.c'; else $(CYGPATH_W) '$(srcdir)/smask.c'; fi` + +cairo_test_suite-smask-fill.o: smask-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-fill.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-fill.Tpo -c -o cairo_test_suite-smask-fill.o `test -f 'smask-fill.c' || echo '$(srcdir)/'`smask-fill.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-fill.Tpo $(DEPDIR)/cairo_test_suite-smask-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-fill.c' object='cairo_test_suite-smask-fill.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-fill.o `test -f 'smask-fill.c' || echo '$(srcdir)/'`smask-fill.c + +cairo_test_suite-smask-fill.obj: smask-fill.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-fill.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-fill.Tpo -c -o cairo_test_suite-smask-fill.obj `if test -f 'smask-fill.c'; then $(CYGPATH_W) 'smask-fill.c'; else $(CYGPATH_W) '$(srcdir)/smask-fill.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-fill.Tpo $(DEPDIR)/cairo_test_suite-smask-fill.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-fill.c' object='cairo_test_suite-smask-fill.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-fill.obj `if test -f 'smask-fill.c'; then $(CYGPATH_W) 'smask-fill.c'; else $(CYGPATH_W) '$(srcdir)/smask-fill.c'; fi` + +cairo_test_suite-smask-image-mask.o: smask-image-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-image-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-image-mask.Tpo -c -o cairo_test_suite-smask-image-mask.o `test -f 'smask-image-mask.c' || echo '$(srcdir)/'`smask-image-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-image-mask.Tpo $(DEPDIR)/cairo_test_suite-smask-image-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-image-mask.c' object='cairo_test_suite-smask-image-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-image-mask.o `test -f 'smask-image-mask.c' || echo '$(srcdir)/'`smask-image-mask.c + +cairo_test_suite-smask-image-mask.obj: smask-image-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-image-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-image-mask.Tpo -c -o cairo_test_suite-smask-image-mask.obj `if test -f 'smask-image-mask.c'; then $(CYGPATH_W) 'smask-image-mask.c'; else $(CYGPATH_W) '$(srcdir)/smask-image-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-image-mask.Tpo $(DEPDIR)/cairo_test_suite-smask-image-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-image-mask.c' object='cairo_test_suite-smask-image-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-image-mask.obj `if test -f 'smask-image-mask.c'; then $(CYGPATH_W) 'smask-image-mask.c'; else $(CYGPATH_W) '$(srcdir)/smask-image-mask.c'; fi` + +cairo_test_suite-smask-mask.o: smask-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-mask.Tpo -c -o cairo_test_suite-smask-mask.o `test -f 'smask-mask.c' || echo '$(srcdir)/'`smask-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-mask.Tpo $(DEPDIR)/cairo_test_suite-smask-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-mask.c' object='cairo_test_suite-smask-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-mask.o `test -f 'smask-mask.c' || echo '$(srcdir)/'`smask-mask.c + +cairo_test_suite-smask-mask.obj: smask-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-mask.Tpo -c -o cairo_test_suite-smask-mask.obj `if test -f 'smask-mask.c'; then $(CYGPATH_W) 'smask-mask.c'; else $(CYGPATH_W) '$(srcdir)/smask-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-mask.Tpo $(DEPDIR)/cairo_test_suite-smask-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-mask.c' object='cairo_test_suite-smask-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-mask.obj `if test -f 'smask-mask.c'; then $(CYGPATH_W) 'smask-mask.c'; else $(CYGPATH_W) '$(srcdir)/smask-mask.c'; fi` + +cairo_test_suite-smask-paint.o: smask-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-paint.Tpo -c -o cairo_test_suite-smask-paint.o `test -f 'smask-paint.c' || echo '$(srcdir)/'`smask-paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-paint.Tpo $(DEPDIR)/cairo_test_suite-smask-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-paint.c' object='cairo_test_suite-smask-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-paint.o `test -f 'smask-paint.c' || echo '$(srcdir)/'`smask-paint.c + +cairo_test_suite-smask-paint.obj: smask-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-paint.Tpo -c -o cairo_test_suite-smask-paint.obj `if test -f 'smask-paint.c'; then $(CYGPATH_W) 'smask-paint.c'; else $(CYGPATH_W) '$(srcdir)/smask-paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-paint.Tpo $(DEPDIR)/cairo_test_suite-smask-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-paint.c' object='cairo_test_suite-smask-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-paint.obj `if test -f 'smask-paint.c'; then $(CYGPATH_W) 'smask-paint.c'; else $(CYGPATH_W) '$(srcdir)/smask-paint.c'; fi` + +cairo_test_suite-smask-stroke.o: smask-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-stroke.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-stroke.Tpo -c -o cairo_test_suite-smask-stroke.o `test -f 'smask-stroke.c' || echo '$(srcdir)/'`smask-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-stroke.Tpo $(DEPDIR)/cairo_test_suite-smask-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-stroke.c' object='cairo_test_suite-smask-stroke.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-stroke.o `test -f 'smask-stroke.c' || echo '$(srcdir)/'`smask-stroke.c + +cairo_test_suite-smask-stroke.obj: smask-stroke.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-stroke.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-stroke.Tpo -c -o cairo_test_suite-smask-stroke.obj `if test -f 'smask-stroke.c'; then $(CYGPATH_W) 'smask-stroke.c'; else $(CYGPATH_W) '$(srcdir)/smask-stroke.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-stroke.Tpo $(DEPDIR)/cairo_test_suite-smask-stroke.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-stroke.c' object='cairo_test_suite-smask-stroke.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-stroke.obj `if test -f 'smask-stroke.c'; then $(CYGPATH_W) 'smask-stroke.c'; else $(CYGPATH_W) '$(srcdir)/smask-stroke.c'; fi` + +cairo_test_suite-smask-text.o: smask-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-text.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-text.Tpo -c -o cairo_test_suite-smask-text.o `test -f 'smask-text.c' || echo '$(srcdir)/'`smask-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-text.Tpo $(DEPDIR)/cairo_test_suite-smask-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-text.c' object='cairo_test_suite-smask-text.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-text.o `test -f 'smask-text.c' || echo '$(srcdir)/'`smask-text.c + +cairo_test_suite-smask-text.obj: smask-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-smask-text.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-smask-text.Tpo -c -o cairo_test_suite-smask-text.obj `if test -f 'smask-text.c'; then $(CYGPATH_W) 'smask-text.c'; else $(CYGPATH_W) '$(srcdir)/smask-text.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-smask-text.Tpo $(DEPDIR)/cairo_test_suite-smask-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='smask-text.c' object='cairo_test_suite-smask-text.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-smask-text.obj `if test -f 'smask-text.c'; then $(CYGPATH_W) 'smask-text.c'; else $(CYGPATH_W) '$(srcdir)/smask-text.c'; fi` + +cairo_test_suite-solid-pattern-cache-stress.o: solid-pattern-cache-stress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-solid-pattern-cache-stress.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Tpo -c -o cairo_test_suite-solid-pattern-cache-stress.o `test -f 'solid-pattern-cache-stress.c' || echo '$(srcdir)/'`solid-pattern-cache-stress.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Tpo $(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='solid-pattern-cache-stress.c' object='cairo_test_suite-solid-pattern-cache-stress.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-solid-pattern-cache-stress.o `test -f 'solid-pattern-cache-stress.c' || echo '$(srcdir)/'`solid-pattern-cache-stress.c + +cairo_test_suite-solid-pattern-cache-stress.obj: solid-pattern-cache-stress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-solid-pattern-cache-stress.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Tpo -c -o cairo_test_suite-solid-pattern-cache-stress.obj `if test -f 'solid-pattern-cache-stress.c'; then $(CYGPATH_W) 'solid-pattern-cache-stress.c'; else $(CYGPATH_W) '$(srcdir)/solid-pattern-cache-stress.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Tpo $(DEPDIR)/cairo_test_suite-solid-pattern-cache-stress.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='solid-pattern-cache-stress.c' object='cairo_test_suite-solid-pattern-cache-stress.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-solid-pattern-cache-stress.obj `if test -f 'solid-pattern-cache-stress.c'; then $(CYGPATH_W) 'solid-pattern-cache-stress.c'; else $(CYGPATH_W) '$(srcdir)/solid-pattern-cache-stress.c'; fi` + +cairo_test_suite-source-clip.o: source-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-source-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-source-clip.Tpo -c -o cairo_test_suite-source-clip.o `test -f 'source-clip.c' || echo '$(srcdir)/'`source-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-source-clip.Tpo $(DEPDIR)/cairo_test_suite-source-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='source-clip.c' object='cairo_test_suite-source-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-source-clip.o `test -f 'source-clip.c' || echo '$(srcdir)/'`source-clip.c + +cairo_test_suite-source-clip.obj: source-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-source-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-source-clip.Tpo -c -o cairo_test_suite-source-clip.obj `if test -f 'source-clip.c'; then $(CYGPATH_W) 'source-clip.c'; else $(CYGPATH_W) '$(srcdir)/source-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-source-clip.Tpo $(DEPDIR)/cairo_test_suite-source-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='source-clip.c' object='cairo_test_suite-source-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-source-clip.obj `if test -f 'source-clip.c'; then $(CYGPATH_W) 'source-clip.c'; else $(CYGPATH_W) '$(srcdir)/source-clip.c'; fi` + +cairo_test_suite-source-clip-scale.o: source-clip-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-source-clip-scale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-source-clip-scale.Tpo -c -o cairo_test_suite-source-clip-scale.o `test -f 'source-clip-scale.c' || echo '$(srcdir)/'`source-clip-scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-source-clip-scale.Tpo $(DEPDIR)/cairo_test_suite-source-clip-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='source-clip-scale.c' object='cairo_test_suite-source-clip-scale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-source-clip-scale.o `test -f 'source-clip-scale.c' || echo '$(srcdir)/'`source-clip-scale.c + +cairo_test_suite-source-clip-scale.obj: source-clip-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-source-clip-scale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-source-clip-scale.Tpo -c -o cairo_test_suite-source-clip-scale.obj `if test -f 'source-clip-scale.c'; then $(CYGPATH_W) 'source-clip-scale.c'; else $(CYGPATH_W) '$(srcdir)/source-clip-scale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-source-clip-scale.Tpo $(DEPDIR)/cairo_test_suite-source-clip-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='source-clip-scale.c' object='cairo_test_suite-source-clip-scale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-source-clip-scale.obj `if test -f 'source-clip-scale.c'; then $(CYGPATH_W) 'source-clip-scale.c'; else $(CYGPATH_W) '$(srcdir)/source-clip-scale.c'; fi` + +cairo_test_suite-source-surface-scale-paint.o: source-surface-scale-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-source-surface-scale-paint.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Tpo -c -o cairo_test_suite-source-surface-scale-paint.o `test -f 'source-surface-scale-paint.c' || echo '$(srcdir)/'`source-surface-scale-paint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Tpo $(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='source-surface-scale-paint.c' object='cairo_test_suite-source-surface-scale-paint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-source-surface-scale-paint.o `test -f 'source-surface-scale-paint.c' || echo '$(srcdir)/'`source-surface-scale-paint.c + +cairo_test_suite-source-surface-scale-paint.obj: source-surface-scale-paint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-source-surface-scale-paint.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Tpo -c -o cairo_test_suite-source-surface-scale-paint.obj `if test -f 'source-surface-scale-paint.c'; then $(CYGPATH_W) 'source-surface-scale-paint.c'; else $(CYGPATH_W) '$(srcdir)/source-surface-scale-paint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Tpo $(DEPDIR)/cairo_test_suite-source-surface-scale-paint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='source-surface-scale-paint.c' object='cairo_test_suite-source-surface-scale-paint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-source-surface-scale-paint.obj `if test -f 'source-surface-scale-paint.c'; then $(CYGPATH_W) 'source-surface-scale-paint.c'; else $(CYGPATH_W) '$(srcdir)/source-surface-scale-paint.c'; fi` + +cairo_test_suite-spline-decomposition.o: spline-decomposition.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-spline-decomposition.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-spline-decomposition.Tpo -c -o cairo_test_suite-spline-decomposition.o `test -f 'spline-decomposition.c' || echo '$(srcdir)/'`spline-decomposition.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-spline-decomposition.Tpo $(DEPDIR)/cairo_test_suite-spline-decomposition.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spline-decomposition.c' object='cairo_test_suite-spline-decomposition.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-spline-decomposition.o `test -f 'spline-decomposition.c' || echo '$(srcdir)/'`spline-decomposition.c + +cairo_test_suite-spline-decomposition.obj: spline-decomposition.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-spline-decomposition.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-spline-decomposition.Tpo -c -o cairo_test_suite-spline-decomposition.obj `if test -f 'spline-decomposition.c'; then $(CYGPATH_W) 'spline-decomposition.c'; else $(CYGPATH_W) '$(srcdir)/spline-decomposition.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-spline-decomposition.Tpo $(DEPDIR)/cairo_test_suite-spline-decomposition.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spline-decomposition.c' object='cairo_test_suite-spline-decomposition.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-spline-decomposition.obj `if test -f 'spline-decomposition.c'; then $(CYGPATH_W) 'spline-decomposition.c'; else $(CYGPATH_W) '$(srcdir)/spline-decomposition.c'; fi` + +cairo_test_suite-stride-12-image.o: stride-12-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stride-12-image.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-stride-12-image.Tpo -c -o cairo_test_suite-stride-12-image.o `test -f 'stride-12-image.c' || echo '$(srcdir)/'`stride-12-image.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stride-12-image.Tpo $(DEPDIR)/cairo_test_suite-stride-12-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stride-12-image.c' object='cairo_test_suite-stride-12-image.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stride-12-image.o `test -f 'stride-12-image.c' || echo '$(srcdir)/'`stride-12-image.c + +cairo_test_suite-stride-12-image.obj: stride-12-image.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stride-12-image.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-stride-12-image.Tpo -c -o cairo_test_suite-stride-12-image.obj `if test -f 'stride-12-image.c'; then $(CYGPATH_W) 'stride-12-image.c'; else $(CYGPATH_W) '$(srcdir)/stride-12-image.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stride-12-image.Tpo $(DEPDIR)/cairo_test_suite-stride-12-image.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stride-12-image.c' object='cairo_test_suite-stride-12-image.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stride-12-image.obj `if test -f 'stride-12-image.c'; then $(CYGPATH_W) 'stride-12-image.c'; else $(CYGPATH_W) '$(srcdir)/stride-12-image.c'; fi` + +cairo_test_suite-stroke-pattern.o: stroke-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-pattern.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-pattern.Tpo -c -o cairo_test_suite-stroke-pattern.o `test -f 'stroke-pattern.c' || echo '$(srcdir)/'`stroke-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-pattern.Tpo $(DEPDIR)/cairo_test_suite-stroke-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-pattern.c' object='cairo_test_suite-stroke-pattern.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-pattern.o `test -f 'stroke-pattern.c' || echo '$(srcdir)/'`stroke-pattern.c + +cairo_test_suite-stroke-pattern.obj: stroke-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-stroke-pattern.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-stroke-pattern.Tpo -c -o cairo_test_suite-stroke-pattern.obj `if test -f 'stroke-pattern.c'; then $(CYGPATH_W) 'stroke-pattern.c'; else $(CYGPATH_W) '$(srcdir)/stroke-pattern.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-stroke-pattern.Tpo $(DEPDIR)/cairo_test_suite-stroke-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stroke-pattern.c' object='cairo_test_suite-stroke-pattern.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-stroke-pattern.obj `if test -f 'stroke-pattern.c'; then $(CYGPATH_W) 'stroke-pattern.c'; else $(CYGPATH_W) '$(srcdir)/stroke-pattern.c'; fi` + +cairo_test_suite-subsurface.o: subsurface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface.Tpo -c -o cairo_test_suite-subsurface.o `test -f 'subsurface.c' || echo '$(srcdir)/'`subsurface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface.Tpo $(DEPDIR)/cairo_test_suite-subsurface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface.c' object='cairo_test_suite-subsurface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface.o `test -f 'subsurface.c' || echo '$(srcdir)/'`subsurface.c + +cairo_test_suite-subsurface.obj: subsurface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface.Tpo -c -o cairo_test_suite-subsurface.obj `if test -f 'subsurface.c'; then $(CYGPATH_W) 'subsurface.c'; else $(CYGPATH_W) '$(srcdir)/subsurface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface.Tpo $(DEPDIR)/cairo_test_suite-subsurface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface.c' object='cairo_test_suite-subsurface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface.obj `if test -f 'subsurface.c'; then $(CYGPATH_W) 'subsurface.c'; else $(CYGPATH_W) '$(srcdir)/subsurface.c'; fi` + +cairo_test_suite-subsurface-image-repeat.o: subsurface-image-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-image-repeat.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Tpo -c -o cairo_test_suite-subsurface-image-repeat.o `test -f 'subsurface-image-repeat.c' || echo '$(srcdir)/'`subsurface-image-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Tpo $(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-image-repeat.c' object='cairo_test_suite-subsurface-image-repeat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-image-repeat.o `test -f 'subsurface-image-repeat.c' || echo '$(srcdir)/'`subsurface-image-repeat.c + +cairo_test_suite-subsurface-image-repeat.obj: subsurface-image-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-image-repeat.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Tpo -c -o cairo_test_suite-subsurface-image-repeat.obj `if test -f 'subsurface-image-repeat.c'; then $(CYGPATH_W) 'subsurface-image-repeat.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-image-repeat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Tpo $(DEPDIR)/cairo_test_suite-subsurface-image-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-image-repeat.c' object='cairo_test_suite-subsurface-image-repeat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-image-repeat.obj `if test -f 'subsurface-image-repeat.c'; then $(CYGPATH_W) 'subsurface-image-repeat.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-image-repeat.c'; fi` + +cairo_test_suite-subsurface-repeat.o: subsurface-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-repeat.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-repeat.Tpo -c -o cairo_test_suite-subsurface-repeat.o `test -f 'subsurface-repeat.c' || echo '$(srcdir)/'`subsurface-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-repeat.Tpo $(DEPDIR)/cairo_test_suite-subsurface-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-repeat.c' object='cairo_test_suite-subsurface-repeat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-repeat.o `test -f 'subsurface-repeat.c' || echo '$(srcdir)/'`subsurface-repeat.c + +cairo_test_suite-subsurface-repeat.obj: subsurface-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-repeat.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-repeat.Tpo -c -o cairo_test_suite-subsurface-repeat.obj `if test -f 'subsurface-repeat.c'; then $(CYGPATH_W) 'subsurface-repeat.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-repeat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-repeat.Tpo $(DEPDIR)/cairo_test_suite-subsurface-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-repeat.c' object='cairo_test_suite-subsurface-repeat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-repeat.obj `if test -f 'subsurface-repeat.c'; then $(CYGPATH_W) 'subsurface-repeat.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-repeat.c'; fi` + +cairo_test_suite-subsurface-reflect.o: subsurface-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-reflect.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-reflect.Tpo -c -o cairo_test_suite-subsurface-reflect.o `test -f 'subsurface-reflect.c' || echo '$(srcdir)/'`subsurface-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-reflect.Tpo $(DEPDIR)/cairo_test_suite-subsurface-reflect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-reflect.c' object='cairo_test_suite-subsurface-reflect.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-reflect.o `test -f 'subsurface-reflect.c' || echo '$(srcdir)/'`subsurface-reflect.c + +cairo_test_suite-subsurface-reflect.obj: subsurface-reflect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-reflect.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-reflect.Tpo -c -o cairo_test_suite-subsurface-reflect.obj `if test -f 'subsurface-reflect.c'; then $(CYGPATH_W) 'subsurface-reflect.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-reflect.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-reflect.Tpo $(DEPDIR)/cairo_test_suite-subsurface-reflect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-reflect.c' object='cairo_test_suite-subsurface-reflect.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-reflect.obj `if test -f 'subsurface-reflect.c'; then $(CYGPATH_W) 'subsurface-reflect.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-reflect.c'; fi` + +cairo_test_suite-subsurface-pad.o: subsurface-pad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-pad.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-pad.Tpo -c -o cairo_test_suite-subsurface-pad.o `test -f 'subsurface-pad.c' || echo '$(srcdir)/'`subsurface-pad.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-pad.Tpo $(DEPDIR)/cairo_test_suite-subsurface-pad.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-pad.c' object='cairo_test_suite-subsurface-pad.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-pad.o `test -f 'subsurface-pad.c' || echo '$(srcdir)/'`subsurface-pad.c + +cairo_test_suite-subsurface-pad.obj: subsurface-pad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-pad.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-pad.Tpo -c -o cairo_test_suite-subsurface-pad.obj `if test -f 'subsurface-pad.c'; then $(CYGPATH_W) 'subsurface-pad.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-pad.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-pad.Tpo $(DEPDIR)/cairo_test_suite-subsurface-pad.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-pad.c' object='cairo_test_suite-subsurface-pad.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-pad.obj `if test -f 'subsurface-pad.c'; then $(CYGPATH_W) 'subsurface-pad.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-pad.c'; fi` + +cairo_test_suite-subsurface-modify-child.o: subsurface-modify-child.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-modify-child.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-modify-child.Tpo -c -o cairo_test_suite-subsurface-modify-child.o `test -f 'subsurface-modify-child.c' || echo '$(srcdir)/'`subsurface-modify-child.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-modify-child.Tpo $(DEPDIR)/cairo_test_suite-subsurface-modify-child.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-modify-child.c' object='cairo_test_suite-subsurface-modify-child.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-modify-child.o `test -f 'subsurface-modify-child.c' || echo '$(srcdir)/'`subsurface-modify-child.c + +cairo_test_suite-subsurface-modify-child.obj: subsurface-modify-child.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-modify-child.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-modify-child.Tpo -c -o cairo_test_suite-subsurface-modify-child.obj `if test -f 'subsurface-modify-child.c'; then $(CYGPATH_W) 'subsurface-modify-child.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-modify-child.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-modify-child.Tpo $(DEPDIR)/cairo_test_suite-subsurface-modify-child.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-modify-child.c' object='cairo_test_suite-subsurface-modify-child.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-modify-child.obj `if test -f 'subsurface-modify-child.c'; then $(CYGPATH_W) 'subsurface-modify-child.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-modify-child.c'; fi` + +cairo_test_suite-subsurface-modify-parent.o: subsurface-modify-parent.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-modify-parent.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Tpo -c -o cairo_test_suite-subsurface-modify-parent.o `test -f 'subsurface-modify-parent.c' || echo '$(srcdir)/'`subsurface-modify-parent.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Tpo $(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-modify-parent.c' object='cairo_test_suite-subsurface-modify-parent.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-modify-parent.o `test -f 'subsurface-modify-parent.c' || echo '$(srcdir)/'`subsurface-modify-parent.c + +cairo_test_suite-subsurface-modify-parent.obj: subsurface-modify-parent.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-modify-parent.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Tpo -c -o cairo_test_suite-subsurface-modify-parent.obj `if test -f 'subsurface-modify-parent.c'; then $(CYGPATH_W) 'subsurface-modify-parent.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-modify-parent.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Tpo $(DEPDIR)/cairo_test_suite-subsurface-modify-parent.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-modify-parent.c' object='cairo_test_suite-subsurface-modify-parent.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-modify-parent.obj `if test -f 'subsurface-modify-parent.c'; then $(CYGPATH_W) 'subsurface-modify-parent.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-modify-parent.c'; fi` + +cairo_test_suite-subsurface-outside-target.o: subsurface-outside-target.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-outside-target.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-outside-target.Tpo -c -o cairo_test_suite-subsurface-outside-target.o `test -f 'subsurface-outside-target.c' || echo '$(srcdir)/'`subsurface-outside-target.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-outside-target.Tpo $(DEPDIR)/cairo_test_suite-subsurface-outside-target.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-outside-target.c' object='cairo_test_suite-subsurface-outside-target.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-outside-target.o `test -f 'subsurface-outside-target.c' || echo '$(srcdir)/'`subsurface-outside-target.c + +cairo_test_suite-subsurface-outside-target.obj: subsurface-outside-target.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-outside-target.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-outside-target.Tpo -c -o cairo_test_suite-subsurface-outside-target.obj `if test -f 'subsurface-outside-target.c'; then $(CYGPATH_W) 'subsurface-outside-target.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-outside-target.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-outside-target.Tpo $(DEPDIR)/cairo_test_suite-subsurface-outside-target.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-outside-target.c' object='cairo_test_suite-subsurface-outside-target.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-outside-target.obj `if test -f 'subsurface-outside-target.c'; then $(CYGPATH_W) 'subsurface-outside-target.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-outside-target.c'; fi` + +cairo_test_suite-subsurface-scale.o: subsurface-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-scale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-scale.Tpo -c -o cairo_test_suite-subsurface-scale.o `test -f 'subsurface-scale.c' || echo '$(srcdir)/'`subsurface-scale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-scale.Tpo $(DEPDIR)/cairo_test_suite-subsurface-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-scale.c' object='cairo_test_suite-subsurface-scale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-scale.o `test -f 'subsurface-scale.c' || echo '$(srcdir)/'`subsurface-scale.c + +cairo_test_suite-subsurface-scale.obj: subsurface-scale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-scale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-scale.Tpo -c -o cairo_test_suite-subsurface-scale.obj `if test -f 'subsurface-scale.c'; then $(CYGPATH_W) 'subsurface-scale.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-scale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-scale.Tpo $(DEPDIR)/cairo_test_suite-subsurface-scale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-scale.c' object='cairo_test_suite-subsurface-scale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-scale.obj `if test -f 'subsurface-scale.c'; then $(CYGPATH_W) 'subsurface-scale.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-scale.c'; fi` + +cairo_test_suite-subsurface-similar-repeat.o: subsurface-similar-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-similar-repeat.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Tpo -c -o cairo_test_suite-subsurface-similar-repeat.o `test -f 'subsurface-similar-repeat.c' || echo '$(srcdir)/'`subsurface-similar-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Tpo $(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-similar-repeat.c' object='cairo_test_suite-subsurface-similar-repeat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-similar-repeat.o `test -f 'subsurface-similar-repeat.c' || echo '$(srcdir)/'`subsurface-similar-repeat.c + +cairo_test_suite-subsurface-similar-repeat.obj: subsurface-similar-repeat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-subsurface-similar-repeat.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Tpo -c -o cairo_test_suite-subsurface-similar-repeat.obj `if test -f 'subsurface-similar-repeat.c'; then $(CYGPATH_W) 'subsurface-similar-repeat.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-similar-repeat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Tpo $(DEPDIR)/cairo_test_suite-subsurface-similar-repeat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='subsurface-similar-repeat.c' object='cairo_test_suite-subsurface-similar-repeat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-subsurface-similar-repeat.obj `if test -f 'subsurface-similar-repeat.c'; then $(CYGPATH_W) 'subsurface-similar-repeat.c'; else $(CYGPATH_W) '$(srcdir)/subsurface-similar-repeat.c'; fi` + +cairo_test_suite-surface-finish-twice.o: surface-finish-twice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-finish-twice.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-finish-twice.Tpo -c -o cairo_test_suite-surface-finish-twice.o `test -f 'surface-finish-twice.c' || echo '$(srcdir)/'`surface-finish-twice.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-finish-twice.Tpo $(DEPDIR)/cairo_test_suite-surface-finish-twice.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-finish-twice.c' object='cairo_test_suite-surface-finish-twice.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-finish-twice.o `test -f 'surface-finish-twice.c' || echo '$(srcdir)/'`surface-finish-twice.c + +cairo_test_suite-surface-finish-twice.obj: surface-finish-twice.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-finish-twice.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-finish-twice.Tpo -c -o cairo_test_suite-surface-finish-twice.obj `if test -f 'surface-finish-twice.c'; then $(CYGPATH_W) 'surface-finish-twice.c'; else $(CYGPATH_W) '$(srcdir)/surface-finish-twice.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-finish-twice.Tpo $(DEPDIR)/cairo_test_suite-surface-finish-twice.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-finish-twice.c' object='cairo_test_suite-surface-finish-twice.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-finish-twice.obj `if test -f 'surface-finish-twice.c'; then $(CYGPATH_W) 'surface-finish-twice.c'; else $(CYGPATH_W) '$(srcdir)/surface-finish-twice.c'; fi` + +cairo_test_suite-surface-pattern.o: surface-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern.Tpo -c -o cairo_test_suite-surface-pattern.o `test -f 'surface-pattern.c' || echo '$(srcdir)/'`surface-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern.c' object='cairo_test_suite-surface-pattern.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern.o `test -f 'surface-pattern.c' || echo '$(srcdir)/'`surface-pattern.c + +cairo_test_suite-surface-pattern.obj: surface-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern.Tpo -c -o cairo_test_suite-surface-pattern.obj `if test -f 'surface-pattern.c'; then $(CYGPATH_W) 'surface-pattern.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern.c' object='cairo_test_suite-surface-pattern.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern.obj `if test -f 'surface-pattern.c'; then $(CYGPATH_W) 'surface-pattern.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern.c'; fi` + +cairo_test_suite-surface-pattern-big-scale-down.o: surface-pattern-big-scale-down.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-big-scale-down.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Tpo -c -o cairo_test_suite-surface-pattern-big-scale-down.o `test -f 'surface-pattern-big-scale-down.c' || echo '$(srcdir)/'`surface-pattern-big-scale-down.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-big-scale-down.c' object='cairo_test_suite-surface-pattern-big-scale-down.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-big-scale-down.o `test -f 'surface-pattern-big-scale-down.c' || echo '$(srcdir)/'`surface-pattern-big-scale-down.c + +cairo_test_suite-surface-pattern-big-scale-down.obj: surface-pattern-big-scale-down.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-big-scale-down.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Tpo -c -o cairo_test_suite-surface-pattern-big-scale-down.obj `if test -f 'surface-pattern-big-scale-down.c'; then $(CYGPATH_W) 'surface-pattern-big-scale-down.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-big-scale-down.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-big-scale-down.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-big-scale-down.c' object='cairo_test_suite-surface-pattern-big-scale-down.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-big-scale-down.obj `if test -f 'surface-pattern-big-scale-down.c'; then $(CYGPATH_W) 'surface-pattern-big-scale-down.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-big-scale-down.c'; fi` + +cairo_test_suite-surface-pattern-operator.o: surface-pattern-operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-operator.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-operator.Tpo -c -o cairo_test_suite-surface-pattern-operator.o `test -f 'surface-pattern-operator.c' || echo '$(srcdir)/'`surface-pattern-operator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-operator.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-operator.c' object='cairo_test_suite-surface-pattern-operator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-operator.o `test -f 'surface-pattern-operator.c' || echo '$(srcdir)/'`surface-pattern-operator.c + +cairo_test_suite-surface-pattern-operator.obj: surface-pattern-operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-operator.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-operator.Tpo -c -o cairo_test_suite-surface-pattern-operator.obj `if test -f 'surface-pattern-operator.c'; then $(CYGPATH_W) 'surface-pattern-operator.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-operator.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-operator.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-operator.c' object='cairo_test_suite-surface-pattern-operator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-operator.obj `if test -f 'surface-pattern-operator.c'; then $(CYGPATH_W) 'surface-pattern-operator.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-operator.c'; fi` + +cairo_test_suite-surface-pattern-scale-down.o: surface-pattern-scale-down.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-scale-down.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Tpo -c -o cairo_test_suite-surface-pattern-scale-down.o `test -f 'surface-pattern-scale-down.c' || echo '$(srcdir)/'`surface-pattern-scale-down.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-scale-down.c' object='cairo_test_suite-surface-pattern-scale-down.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-scale-down.o `test -f 'surface-pattern-scale-down.c' || echo '$(srcdir)/'`surface-pattern-scale-down.c + +cairo_test_suite-surface-pattern-scale-down.obj: surface-pattern-scale-down.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-scale-down.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Tpo -c -o cairo_test_suite-surface-pattern-scale-down.obj `if test -f 'surface-pattern-scale-down.c'; then $(CYGPATH_W) 'surface-pattern-scale-down.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-scale-down.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-scale-down.c' object='cairo_test_suite-surface-pattern-scale-down.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-scale-down.obj `if test -f 'surface-pattern-scale-down.c'; then $(CYGPATH_W) 'surface-pattern-scale-down.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-scale-down.c'; fi` + +cairo_test_suite-surface-pattern-scale-down-extend.o: surface-pattern-scale-down-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-scale-down-extend.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Tpo -c -o cairo_test_suite-surface-pattern-scale-down-extend.o `test -f 'surface-pattern-scale-down-extend.c' || echo '$(srcdir)/'`surface-pattern-scale-down-extend.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-scale-down-extend.c' object='cairo_test_suite-surface-pattern-scale-down-extend.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-scale-down-extend.o `test -f 'surface-pattern-scale-down-extend.c' || echo '$(srcdir)/'`surface-pattern-scale-down-extend.c + +cairo_test_suite-surface-pattern-scale-down-extend.obj: surface-pattern-scale-down-extend.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-scale-down-extend.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Tpo -c -o cairo_test_suite-surface-pattern-scale-down-extend.obj `if test -f 'surface-pattern-scale-down-extend.c'; then $(CYGPATH_W) 'surface-pattern-scale-down-extend.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-scale-down-extend.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-scale-down-extend.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-scale-down-extend.c' object='cairo_test_suite-surface-pattern-scale-down-extend.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-scale-down-extend.obj `if test -f 'surface-pattern-scale-down-extend.c'; then $(CYGPATH_W) 'surface-pattern-scale-down-extend.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-scale-down-extend.c'; fi` + +cairo_test_suite-surface-pattern-scale-up.o: surface-pattern-scale-up.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-scale-up.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Tpo -c -o cairo_test_suite-surface-pattern-scale-up.o `test -f 'surface-pattern-scale-up.c' || echo '$(srcdir)/'`surface-pattern-scale-up.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-scale-up.c' object='cairo_test_suite-surface-pattern-scale-up.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-scale-up.o `test -f 'surface-pattern-scale-up.c' || echo '$(srcdir)/'`surface-pattern-scale-up.c + +cairo_test_suite-surface-pattern-scale-up.obj: surface-pattern-scale-up.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-surface-pattern-scale-up.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Tpo -c -o cairo_test_suite-surface-pattern-scale-up.obj `if test -f 'surface-pattern-scale-up.c'; then $(CYGPATH_W) 'surface-pattern-scale-up.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-scale-up.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Tpo $(DEPDIR)/cairo_test_suite-surface-pattern-scale-up.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='surface-pattern-scale-up.c' object='cairo_test_suite-surface-pattern-scale-up.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-surface-pattern-scale-up.obj `if test -f 'surface-pattern-scale-up.c'; then $(CYGPATH_W) 'surface-pattern-scale-up.c'; else $(CYGPATH_W) '$(srcdir)/surface-pattern-scale-up.c'; fi` + +cairo_test_suite-text-antialias.o: text-antialias.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-antialias.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-antialias.Tpo -c -o cairo_test_suite-text-antialias.o `test -f 'text-antialias.c' || echo '$(srcdir)/'`text-antialias.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-antialias.Tpo $(DEPDIR)/cairo_test_suite-text-antialias.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-antialias.c' object='cairo_test_suite-text-antialias.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-antialias.o `test -f 'text-antialias.c' || echo '$(srcdir)/'`text-antialias.c + +cairo_test_suite-text-antialias.obj: text-antialias.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-antialias.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-antialias.Tpo -c -o cairo_test_suite-text-antialias.obj `if test -f 'text-antialias.c'; then $(CYGPATH_W) 'text-antialias.c'; else $(CYGPATH_W) '$(srcdir)/text-antialias.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-antialias.Tpo $(DEPDIR)/cairo_test_suite-text-antialias.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-antialias.c' object='cairo_test_suite-text-antialias.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-antialias.obj `if test -f 'text-antialias.c'; then $(CYGPATH_W) 'text-antialias.c'; else $(CYGPATH_W) '$(srcdir)/text-antialias.c'; fi` + +cairo_test_suite-text-antialias-subpixel.o: text-antialias-subpixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-antialias-subpixel.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Tpo -c -o cairo_test_suite-text-antialias-subpixel.o `test -f 'text-antialias-subpixel.c' || echo '$(srcdir)/'`text-antialias-subpixel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Tpo $(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-antialias-subpixel.c' object='cairo_test_suite-text-antialias-subpixel.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-antialias-subpixel.o `test -f 'text-antialias-subpixel.c' || echo '$(srcdir)/'`text-antialias-subpixel.c + +cairo_test_suite-text-antialias-subpixel.obj: text-antialias-subpixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-antialias-subpixel.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Tpo -c -o cairo_test_suite-text-antialias-subpixel.obj `if test -f 'text-antialias-subpixel.c'; then $(CYGPATH_W) 'text-antialias-subpixel.c'; else $(CYGPATH_W) '$(srcdir)/text-antialias-subpixel.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Tpo $(DEPDIR)/cairo_test_suite-text-antialias-subpixel.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-antialias-subpixel.c' object='cairo_test_suite-text-antialias-subpixel.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-antialias-subpixel.obj `if test -f 'text-antialias-subpixel.c'; then $(CYGPATH_W) 'text-antialias-subpixel.c'; else $(CYGPATH_W) '$(srcdir)/text-antialias-subpixel.c'; fi` + +cairo_test_suite-text-cache-crash.o: text-cache-crash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-cache-crash.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-cache-crash.Tpo -c -o cairo_test_suite-text-cache-crash.o `test -f 'text-cache-crash.c' || echo '$(srcdir)/'`text-cache-crash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-cache-crash.Tpo $(DEPDIR)/cairo_test_suite-text-cache-crash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-cache-crash.c' object='cairo_test_suite-text-cache-crash.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-cache-crash.o `test -f 'text-cache-crash.c' || echo '$(srcdir)/'`text-cache-crash.c + +cairo_test_suite-text-cache-crash.obj: text-cache-crash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-cache-crash.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-cache-crash.Tpo -c -o cairo_test_suite-text-cache-crash.obj `if test -f 'text-cache-crash.c'; then $(CYGPATH_W) 'text-cache-crash.c'; else $(CYGPATH_W) '$(srcdir)/text-cache-crash.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-cache-crash.Tpo $(DEPDIR)/cairo_test_suite-text-cache-crash.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-cache-crash.c' object='cairo_test_suite-text-cache-crash.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-cache-crash.obj `if test -f 'text-cache-crash.c'; then $(CYGPATH_W) 'text-cache-crash.c'; else $(CYGPATH_W) '$(srcdir)/text-cache-crash.c'; fi` + +cairo_test_suite-text-glyph-range.o: text-glyph-range.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-glyph-range.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-glyph-range.Tpo -c -o cairo_test_suite-text-glyph-range.o `test -f 'text-glyph-range.c' || echo '$(srcdir)/'`text-glyph-range.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-glyph-range.Tpo $(DEPDIR)/cairo_test_suite-text-glyph-range.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-glyph-range.c' object='cairo_test_suite-text-glyph-range.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-glyph-range.o `test -f 'text-glyph-range.c' || echo '$(srcdir)/'`text-glyph-range.c + +cairo_test_suite-text-glyph-range.obj: text-glyph-range.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-glyph-range.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-glyph-range.Tpo -c -o cairo_test_suite-text-glyph-range.obj `if test -f 'text-glyph-range.c'; then $(CYGPATH_W) 'text-glyph-range.c'; else $(CYGPATH_W) '$(srcdir)/text-glyph-range.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-glyph-range.Tpo $(DEPDIR)/cairo_test_suite-text-glyph-range.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-glyph-range.c' object='cairo_test_suite-text-glyph-range.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-glyph-range.obj `if test -f 'text-glyph-range.c'; then $(CYGPATH_W) 'text-glyph-range.c'; else $(CYGPATH_W) '$(srcdir)/text-glyph-range.c'; fi` + +cairo_test_suite-text-pattern.o: text-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-pattern.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-pattern.Tpo -c -o cairo_test_suite-text-pattern.o `test -f 'text-pattern.c' || echo '$(srcdir)/'`text-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-pattern.Tpo $(DEPDIR)/cairo_test_suite-text-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-pattern.c' object='cairo_test_suite-text-pattern.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-pattern.o `test -f 'text-pattern.c' || echo '$(srcdir)/'`text-pattern.c + +cairo_test_suite-text-pattern.obj: text-pattern.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-pattern.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-pattern.Tpo -c -o cairo_test_suite-text-pattern.obj `if test -f 'text-pattern.c'; then $(CYGPATH_W) 'text-pattern.c'; else $(CYGPATH_W) '$(srcdir)/text-pattern.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-pattern.Tpo $(DEPDIR)/cairo_test_suite-text-pattern.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-pattern.c' object='cairo_test_suite-text-pattern.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-pattern.obj `if test -f 'text-pattern.c'; then $(CYGPATH_W) 'text-pattern.c'; else $(CYGPATH_W) '$(srcdir)/text-pattern.c'; fi` + +cairo_test_suite-text-rotate.o: text-rotate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-rotate.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-rotate.Tpo -c -o cairo_test_suite-text-rotate.o `test -f 'text-rotate.c' || echo '$(srcdir)/'`text-rotate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-rotate.Tpo $(DEPDIR)/cairo_test_suite-text-rotate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-rotate.c' object='cairo_test_suite-text-rotate.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-rotate.o `test -f 'text-rotate.c' || echo '$(srcdir)/'`text-rotate.c + +cairo_test_suite-text-rotate.obj: text-rotate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-rotate.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-rotate.Tpo -c -o cairo_test_suite-text-rotate.obj `if test -f 'text-rotate.c'; then $(CYGPATH_W) 'text-rotate.c'; else $(CYGPATH_W) '$(srcdir)/text-rotate.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-rotate.Tpo $(DEPDIR)/cairo_test_suite-text-rotate.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-rotate.c' object='cairo_test_suite-text-rotate.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-rotate.obj `if test -f 'text-rotate.c'; then $(CYGPATH_W) 'text-rotate.c'; else $(CYGPATH_W) '$(srcdir)/text-rotate.c'; fi` + +cairo_test_suite-text-transform.o: text-transform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-transform.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-transform.Tpo -c -o cairo_test_suite-text-transform.o `test -f 'text-transform.c' || echo '$(srcdir)/'`text-transform.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-transform.Tpo $(DEPDIR)/cairo_test_suite-text-transform.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-transform.c' object='cairo_test_suite-text-transform.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-transform.o `test -f 'text-transform.c' || echo '$(srcdir)/'`text-transform.c + +cairo_test_suite-text-transform.obj: text-transform.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-transform.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-transform.Tpo -c -o cairo_test_suite-text-transform.obj `if test -f 'text-transform.c'; then $(CYGPATH_W) 'text-transform.c'; else $(CYGPATH_W) '$(srcdir)/text-transform.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-transform.Tpo $(DEPDIR)/cairo_test_suite-text-transform.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-transform.c' object='cairo_test_suite-text-transform.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-transform.obj `if test -f 'text-transform.c'; then $(CYGPATH_W) 'text-transform.c'; else $(CYGPATH_W) '$(srcdir)/text-transform.c'; fi` + +cairo_test_suite-text-zero-len.o: text-zero-len.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-zero-len.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-zero-len.Tpo -c -o cairo_test_suite-text-zero-len.o `test -f 'text-zero-len.c' || echo '$(srcdir)/'`text-zero-len.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-zero-len.Tpo $(DEPDIR)/cairo_test_suite-text-zero-len.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-zero-len.c' object='cairo_test_suite-text-zero-len.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-zero-len.o `test -f 'text-zero-len.c' || echo '$(srcdir)/'`text-zero-len.c + +cairo_test_suite-text-zero-len.obj: text-zero-len.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-text-zero-len.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-text-zero-len.Tpo -c -o cairo_test_suite-text-zero-len.obj `if test -f 'text-zero-len.c'; then $(CYGPATH_W) 'text-zero-len.c'; else $(CYGPATH_W) '$(srcdir)/text-zero-len.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-text-zero-len.Tpo $(DEPDIR)/cairo_test_suite-text-zero-len.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='text-zero-len.c' object='cairo_test_suite-text-zero-len.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-text-zero-len.obj `if test -f 'text-zero-len.c'; then $(CYGPATH_W) 'text-zero-len.c'; else $(CYGPATH_W) '$(srcdir)/text-zero-len.c'; fi` + +cairo_test_suite-tighten-bounds.o: tighten-bounds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-tighten-bounds.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-tighten-bounds.Tpo -c -o cairo_test_suite-tighten-bounds.o `test -f 'tighten-bounds.c' || echo '$(srcdir)/'`tighten-bounds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-tighten-bounds.Tpo $(DEPDIR)/cairo_test_suite-tighten-bounds.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tighten-bounds.c' object='cairo_test_suite-tighten-bounds.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-tighten-bounds.o `test -f 'tighten-bounds.c' || echo '$(srcdir)/'`tighten-bounds.c + +cairo_test_suite-tighten-bounds.obj: tighten-bounds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-tighten-bounds.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-tighten-bounds.Tpo -c -o cairo_test_suite-tighten-bounds.obj `if test -f 'tighten-bounds.c'; then $(CYGPATH_W) 'tighten-bounds.c'; else $(CYGPATH_W) '$(srcdir)/tighten-bounds.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-tighten-bounds.Tpo $(DEPDIR)/cairo_test_suite-tighten-bounds.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tighten-bounds.c' object='cairo_test_suite-tighten-bounds.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-tighten-bounds.obj `if test -f 'tighten-bounds.c'; then $(CYGPATH_W) 'tighten-bounds.c'; else $(CYGPATH_W) '$(srcdir)/tighten-bounds.c'; fi` + +cairo_test_suite-tiger.o: tiger.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-tiger.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-tiger.Tpo -c -o cairo_test_suite-tiger.o `test -f 'tiger.c' || echo '$(srcdir)/'`tiger.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-tiger.Tpo $(DEPDIR)/cairo_test_suite-tiger.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiger.c' object='cairo_test_suite-tiger.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-tiger.o `test -f 'tiger.c' || echo '$(srcdir)/'`tiger.c + +cairo_test_suite-tiger.obj: tiger.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-tiger.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-tiger.Tpo -c -o cairo_test_suite-tiger.obj `if test -f 'tiger.c'; then $(CYGPATH_W) 'tiger.c'; else $(CYGPATH_W) '$(srcdir)/tiger.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-tiger.Tpo $(DEPDIR)/cairo_test_suite-tiger.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiger.c' object='cairo_test_suite-tiger.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-tiger.obj `if test -f 'tiger.c'; then $(CYGPATH_W) 'tiger.c'; else $(CYGPATH_W) '$(srcdir)/tiger.c'; fi` + +cairo_test_suite-toy-font-face.o: toy-font-face.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-toy-font-face.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-toy-font-face.Tpo -c -o cairo_test_suite-toy-font-face.o `test -f 'toy-font-face.c' || echo '$(srcdir)/'`toy-font-face.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-toy-font-face.Tpo $(DEPDIR)/cairo_test_suite-toy-font-face.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='toy-font-face.c' object='cairo_test_suite-toy-font-face.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-toy-font-face.o `test -f 'toy-font-face.c' || echo '$(srcdir)/'`toy-font-face.c + +cairo_test_suite-toy-font-face.obj: toy-font-face.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-toy-font-face.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-toy-font-face.Tpo -c -o cairo_test_suite-toy-font-face.obj `if test -f 'toy-font-face.c'; then $(CYGPATH_W) 'toy-font-face.c'; else $(CYGPATH_W) '$(srcdir)/toy-font-face.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-toy-font-face.Tpo $(DEPDIR)/cairo_test_suite-toy-font-face.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='toy-font-face.c' object='cairo_test_suite-toy-font-face.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-toy-font-face.obj `if test -f 'toy-font-face.c'; then $(CYGPATH_W) 'toy-font-face.c'; else $(CYGPATH_W) '$(srcdir)/toy-font-face.c'; fi` + +cairo_test_suite-transforms.o: transforms.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-transforms.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-transforms.Tpo -c -o cairo_test_suite-transforms.o `test -f 'transforms.c' || echo '$(srcdir)/'`transforms.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-transforms.Tpo $(DEPDIR)/cairo_test_suite-transforms.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='transforms.c' object='cairo_test_suite-transforms.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-transforms.o `test -f 'transforms.c' || echo '$(srcdir)/'`transforms.c + +cairo_test_suite-transforms.obj: transforms.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-transforms.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-transforms.Tpo -c -o cairo_test_suite-transforms.obj `if test -f 'transforms.c'; then $(CYGPATH_W) 'transforms.c'; else $(CYGPATH_W) '$(srcdir)/transforms.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-transforms.Tpo $(DEPDIR)/cairo_test_suite-transforms.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='transforms.c' object='cairo_test_suite-transforms.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-transforms.obj `if test -f 'transforms.c'; then $(CYGPATH_W) 'transforms.c'; else $(CYGPATH_W) '$(srcdir)/transforms.c'; fi` + +cairo_test_suite-translate-show-surface.o: translate-show-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-translate-show-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-translate-show-surface.Tpo -c -o cairo_test_suite-translate-show-surface.o `test -f 'translate-show-surface.c' || echo '$(srcdir)/'`translate-show-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-translate-show-surface.Tpo $(DEPDIR)/cairo_test_suite-translate-show-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='translate-show-surface.c' object='cairo_test_suite-translate-show-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-translate-show-surface.o `test -f 'translate-show-surface.c' || echo '$(srcdir)/'`translate-show-surface.c + +cairo_test_suite-translate-show-surface.obj: translate-show-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-translate-show-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-translate-show-surface.Tpo -c -o cairo_test_suite-translate-show-surface.obj `if test -f 'translate-show-surface.c'; then $(CYGPATH_W) 'translate-show-surface.c'; else $(CYGPATH_W) '$(srcdir)/translate-show-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-translate-show-surface.Tpo $(DEPDIR)/cairo_test_suite-translate-show-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='translate-show-surface.c' object='cairo_test_suite-translate-show-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-translate-show-surface.obj `if test -f 'translate-show-surface.c'; then $(CYGPATH_W) 'translate-show-surface.c'; else $(CYGPATH_W) '$(srcdir)/translate-show-surface.c'; fi` + +cairo_test_suite-trap-clip.o: trap-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-trap-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-trap-clip.Tpo -c -o cairo_test_suite-trap-clip.o `test -f 'trap-clip.c' || echo '$(srcdir)/'`trap-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-trap-clip.Tpo $(DEPDIR)/cairo_test_suite-trap-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='trap-clip.c' object='cairo_test_suite-trap-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-trap-clip.o `test -f 'trap-clip.c' || echo '$(srcdir)/'`trap-clip.c + +cairo_test_suite-trap-clip.obj: trap-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-trap-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-trap-clip.Tpo -c -o cairo_test_suite-trap-clip.obj `if test -f 'trap-clip.c'; then $(CYGPATH_W) 'trap-clip.c'; else $(CYGPATH_W) '$(srcdir)/trap-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-trap-clip.Tpo $(DEPDIR)/cairo_test_suite-trap-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='trap-clip.c' object='cairo_test_suite-trap-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-trap-clip.obj `if test -f 'trap-clip.c'; then $(CYGPATH_W) 'trap-clip.c'; else $(CYGPATH_W) '$(srcdir)/trap-clip.c'; fi` + +cairo_test_suite-twin.o: twin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin.Tpo -c -o cairo_test_suite-twin.o `test -f 'twin.c' || echo '$(srcdir)/'`twin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin.Tpo $(DEPDIR)/cairo_test_suite-twin.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin.c' object='cairo_test_suite-twin.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin.o `test -f 'twin.c' || echo '$(srcdir)/'`twin.c + +cairo_test_suite-twin.obj: twin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin.Tpo -c -o cairo_test_suite-twin.obj `if test -f 'twin.c'; then $(CYGPATH_W) 'twin.c'; else $(CYGPATH_W) '$(srcdir)/twin.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin.Tpo $(DEPDIR)/cairo_test_suite-twin.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin.c' object='cairo_test_suite-twin.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin.obj `if test -f 'twin.c'; then $(CYGPATH_W) 'twin.c'; else $(CYGPATH_W) '$(srcdir)/twin.c'; fi` + +cairo_test_suite-twin-antialias-gray.o: twin-antialias-gray.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-gray.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-gray.Tpo -c -o cairo_test_suite-twin-antialias-gray.o `test -f 'twin-antialias-gray.c' || echo '$(srcdir)/'`twin-antialias-gray.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-gray.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-gray.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-gray.c' object='cairo_test_suite-twin-antialias-gray.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-gray.o `test -f 'twin-antialias-gray.c' || echo '$(srcdir)/'`twin-antialias-gray.c + +cairo_test_suite-twin-antialias-gray.obj: twin-antialias-gray.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-gray.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-gray.Tpo -c -o cairo_test_suite-twin-antialias-gray.obj `if test -f 'twin-antialias-gray.c'; then $(CYGPATH_W) 'twin-antialias-gray.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-gray.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-gray.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-gray.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-gray.c' object='cairo_test_suite-twin-antialias-gray.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-gray.obj `if test -f 'twin-antialias-gray.c'; then $(CYGPATH_W) 'twin-antialias-gray.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-gray.c'; fi` + +cairo_test_suite-twin-antialias-mixed.o: twin-antialias-mixed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-mixed.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Tpo -c -o cairo_test_suite-twin-antialias-mixed.o `test -f 'twin-antialias-mixed.c' || echo '$(srcdir)/'`twin-antialias-mixed.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-mixed.c' object='cairo_test_suite-twin-antialias-mixed.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-mixed.o `test -f 'twin-antialias-mixed.c' || echo '$(srcdir)/'`twin-antialias-mixed.c + +cairo_test_suite-twin-antialias-mixed.obj: twin-antialias-mixed.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-mixed.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Tpo -c -o cairo_test_suite-twin-antialias-mixed.obj `if test -f 'twin-antialias-mixed.c'; then $(CYGPATH_W) 'twin-antialias-mixed.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-mixed.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-mixed.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-mixed.c' object='cairo_test_suite-twin-antialias-mixed.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-mixed.obj `if test -f 'twin-antialias-mixed.c'; then $(CYGPATH_W) 'twin-antialias-mixed.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-mixed.c'; fi` + +cairo_test_suite-twin-antialias-none.o: twin-antialias-none.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-none.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-none.Tpo -c -o cairo_test_suite-twin-antialias-none.o `test -f 'twin-antialias-none.c' || echo '$(srcdir)/'`twin-antialias-none.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-none.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-none.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-none.c' object='cairo_test_suite-twin-antialias-none.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-none.o `test -f 'twin-antialias-none.c' || echo '$(srcdir)/'`twin-antialias-none.c + +cairo_test_suite-twin-antialias-none.obj: twin-antialias-none.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-none.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-none.Tpo -c -o cairo_test_suite-twin-antialias-none.obj `if test -f 'twin-antialias-none.c'; then $(CYGPATH_W) 'twin-antialias-none.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-none.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-none.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-none.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-none.c' object='cairo_test_suite-twin-antialias-none.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-none.obj `if test -f 'twin-antialias-none.c'; then $(CYGPATH_W) 'twin-antialias-none.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-none.c'; fi` + +cairo_test_suite-twin-antialias-subpixel.o: twin-antialias-subpixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-subpixel.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Tpo -c -o cairo_test_suite-twin-antialias-subpixel.o `test -f 'twin-antialias-subpixel.c' || echo '$(srcdir)/'`twin-antialias-subpixel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-subpixel.c' object='cairo_test_suite-twin-antialias-subpixel.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-subpixel.o `test -f 'twin-antialias-subpixel.c' || echo '$(srcdir)/'`twin-antialias-subpixel.c + +cairo_test_suite-twin-antialias-subpixel.obj: twin-antialias-subpixel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-twin-antialias-subpixel.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Tpo -c -o cairo_test_suite-twin-antialias-subpixel.obj `if test -f 'twin-antialias-subpixel.c'; then $(CYGPATH_W) 'twin-antialias-subpixel.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-subpixel.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Tpo $(DEPDIR)/cairo_test_suite-twin-antialias-subpixel.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='twin-antialias-subpixel.c' object='cairo_test_suite-twin-antialias-subpixel.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-twin-antialias-subpixel.obj `if test -f 'twin-antialias-subpixel.c'; then $(CYGPATH_W) 'twin-antialias-subpixel.c'; else $(CYGPATH_W) '$(srcdir)/twin-antialias-subpixel.c'; fi` + +cairo_test_suite-unaligned-box.o: unaligned-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unaligned-box.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-unaligned-box.Tpo -c -o cairo_test_suite-unaligned-box.o `test -f 'unaligned-box.c' || echo '$(srcdir)/'`unaligned-box.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unaligned-box.Tpo $(DEPDIR)/cairo_test_suite-unaligned-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unaligned-box.c' object='cairo_test_suite-unaligned-box.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unaligned-box.o `test -f 'unaligned-box.c' || echo '$(srcdir)/'`unaligned-box.c + +cairo_test_suite-unaligned-box.obj: unaligned-box.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unaligned-box.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-unaligned-box.Tpo -c -o cairo_test_suite-unaligned-box.obj `if test -f 'unaligned-box.c'; then $(CYGPATH_W) 'unaligned-box.c'; else $(CYGPATH_W) '$(srcdir)/unaligned-box.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unaligned-box.Tpo $(DEPDIR)/cairo_test_suite-unaligned-box.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unaligned-box.c' object='cairo_test_suite-unaligned-box.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unaligned-box.obj `if test -f 'unaligned-box.c'; then $(CYGPATH_W) 'unaligned-box.c'; else $(CYGPATH_W) '$(srcdir)/unaligned-box.c'; fi` + +cairo_test_suite-unantialiased-shapes.o: unantialiased-shapes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unantialiased-shapes.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-unantialiased-shapes.Tpo -c -o cairo_test_suite-unantialiased-shapes.o `test -f 'unantialiased-shapes.c' || echo '$(srcdir)/'`unantialiased-shapes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unantialiased-shapes.Tpo $(DEPDIR)/cairo_test_suite-unantialiased-shapes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unantialiased-shapes.c' object='cairo_test_suite-unantialiased-shapes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unantialiased-shapes.o `test -f 'unantialiased-shapes.c' || echo '$(srcdir)/'`unantialiased-shapes.c + +cairo_test_suite-unantialiased-shapes.obj: unantialiased-shapes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unantialiased-shapes.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-unantialiased-shapes.Tpo -c -o cairo_test_suite-unantialiased-shapes.obj `if test -f 'unantialiased-shapes.c'; then $(CYGPATH_W) 'unantialiased-shapes.c'; else $(CYGPATH_W) '$(srcdir)/unantialiased-shapes.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unantialiased-shapes.Tpo $(DEPDIR)/cairo_test_suite-unantialiased-shapes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unantialiased-shapes.c' object='cairo_test_suite-unantialiased-shapes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unantialiased-shapes.obj `if test -f 'unantialiased-shapes.c'; then $(CYGPATH_W) 'unantialiased-shapes.c'; else $(CYGPATH_W) '$(srcdir)/unantialiased-shapes.c'; fi` + +cairo_test_suite-unbounded-operator.o: unbounded-operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unbounded-operator.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-unbounded-operator.Tpo -c -o cairo_test_suite-unbounded-operator.o `test -f 'unbounded-operator.c' || echo '$(srcdir)/'`unbounded-operator.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unbounded-operator.Tpo $(DEPDIR)/cairo_test_suite-unbounded-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unbounded-operator.c' object='cairo_test_suite-unbounded-operator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unbounded-operator.o `test -f 'unbounded-operator.c' || echo '$(srcdir)/'`unbounded-operator.c + +cairo_test_suite-unbounded-operator.obj: unbounded-operator.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unbounded-operator.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-unbounded-operator.Tpo -c -o cairo_test_suite-unbounded-operator.obj `if test -f 'unbounded-operator.c'; then $(CYGPATH_W) 'unbounded-operator.c'; else $(CYGPATH_W) '$(srcdir)/unbounded-operator.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unbounded-operator.Tpo $(DEPDIR)/cairo_test_suite-unbounded-operator.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unbounded-operator.c' object='cairo_test_suite-unbounded-operator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unbounded-operator.obj `if test -f 'unbounded-operator.c'; then $(CYGPATH_W) 'unbounded-operator.c'; else $(CYGPATH_W) '$(srcdir)/unbounded-operator.c'; fi` + +cairo_test_suite-unclosed-strokes.o: unclosed-strokes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unclosed-strokes.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-unclosed-strokes.Tpo -c -o cairo_test_suite-unclosed-strokes.o `test -f 'unclosed-strokes.c' || echo '$(srcdir)/'`unclosed-strokes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unclosed-strokes.Tpo $(DEPDIR)/cairo_test_suite-unclosed-strokes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unclosed-strokes.c' object='cairo_test_suite-unclosed-strokes.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unclosed-strokes.o `test -f 'unclosed-strokes.c' || echo '$(srcdir)/'`unclosed-strokes.c + +cairo_test_suite-unclosed-strokes.obj: unclosed-strokes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-unclosed-strokes.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-unclosed-strokes.Tpo -c -o cairo_test_suite-unclosed-strokes.obj `if test -f 'unclosed-strokes.c'; then $(CYGPATH_W) 'unclosed-strokes.c'; else $(CYGPATH_W) '$(srcdir)/unclosed-strokes.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-unclosed-strokes.Tpo $(DEPDIR)/cairo_test_suite-unclosed-strokes.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unclosed-strokes.c' object='cairo_test_suite-unclosed-strokes.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-unclosed-strokes.obj `if test -f 'unclosed-strokes.c'; then $(CYGPATH_W) 'unclosed-strokes.c'; else $(CYGPATH_W) '$(srcdir)/unclosed-strokes.c'; fi` + +cairo_test_suite-user-data.o: user-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-data.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-data.Tpo -c -o cairo_test_suite-user-data.o `test -f 'user-data.c' || echo '$(srcdir)/'`user-data.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-data.Tpo $(DEPDIR)/cairo_test_suite-user-data.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-data.c' object='cairo_test_suite-user-data.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-data.o `test -f 'user-data.c' || echo '$(srcdir)/'`user-data.c + +cairo_test_suite-user-data.obj: user-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-data.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-data.Tpo -c -o cairo_test_suite-user-data.obj `if test -f 'user-data.c'; then $(CYGPATH_W) 'user-data.c'; else $(CYGPATH_W) '$(srcdir)/user-data.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-data.Tpo $(DEPDIR)/cairo_test_suite-user-data.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-data.c' object='cairo_test_suite-user-data.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-data.obj `if test -f 'user-data.c'; then $(CYGPATH_W) 'user-data.c'; else $(CYGPATH_W) '$(srcdir)/user-data.c'; fi` + +cairo_test_suite-user-font.o: user-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font.Tpo -c -o cairo_test_suite-user-font.o `test -f 'user-font.c' || echo '$(srcdir)/'`user-font.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font.Tpo $(DEPDIR)/cairo_test_suite-user-font.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font.c' object='cairo_test_suite-user-font.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font.o `test -f 'user-font.c' || echo '$(srcdir)/'`user-font.c + +cairo_test_suite-user-font.obj: user-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font.Tpo -c -o cairo_test_suite-user-font.obj `if test -f 'user-font.c'; then $(CYGPATH_W) 'user-font.c'; else $(CYGPATH_W) '$(srcdir)/user-font.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font.Tpo $(DEPDIR)/cairo_test_suite-user-font.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font.c' object='cairo_test_suite-user-font.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font.obj `if test -f 'user-font.c'; then $(CYGPATH_W) 'user-font.c'; else $(CYGPATH_W) '$(srcdir)/user-font.c'; fi` + +cairo_test_suite-user-font-mask.o: user-font-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font-mask.Tpo -c -o cairo_test_suite-user-font-mask.o `test -f 'user-font-mask.c' || echo '$(srcdir)/'`user-font-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font-mask.Tpo $(DEPDIR)/cairo_test_suite-user-font-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font-mask.c' object='cairo_test_suite-user-font-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font-mask.o `test -f 'user-font-mask.c' || echo '$(srcdir)/'`user-font-mask.c + +cairo_test_suite-user-font-mask.obj: user-font-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font-mask.Tpo -c -o cairo_test_suite-user-font-mask.obj `if test -f 'user-font-mask.c'; then $(CYGPATH_W) 'user-font-mask.c'; else $(CYGPATH_W) '$(srcdir)/user-font-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font-mask.Tpo $(DEPDIR)/cairo_test_suite-user-font-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font-mask.c' object='cairo_test_suite-user-font-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font-mask.obj `if test -f 'user-font-mask.c'; then $(CYGPATH_W) 'user-font-mask.c'; else $(CYGPATH_W) '$(srcdir)/user-font-mask.c'; fi` + +cairo_test_suite-user-font-proxy.o: user-font-proxy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font-proxy.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font-proxy.Tpo -c -o cairo_test_suite-user-font-proxy.o `test -f 'user-font-proxy.c' || echo '$(srcdir)/'`user-font-proxy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font-proxy.Tpo $(DEPDIR)/cairo_test_suite-user-font-proxy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font-proxy.c' object='cairo_test_suite-user-font-proxy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font-proxy.o `test -f 'user-font-proxy.c' || echo '$(srcdir)/'`user-font-proxy.c + +cairo_test_suite-user-font-proxy.obj: user-font-proxy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font-proxy.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font-proxy.Tpo -c -o cairo_test_suite-user-font-proxy.obj `if test -f 'user-font-proxy.c'; then $(CYGPATH_W) 'user-font-proxy.c'; else $(CYGPATH_W) '$(srcdir)/user-font-proxy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font-proxy.Tpo $(DEPDIR)/cairo_test_suite-user-font-proxy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font-proxy.c' object='cairo_test_suite-user-font-proxy.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font-proxy.obj `if test -f 'user-font-proxy.c'; then $(CYGPATH_W) 'user-font-proxy.c'; else $(CYGPATH_W) '$(srcdir)/user-font-proxy.c'; fi` + +cairo_test_suite-user-font-rescale.o: user-font-rescale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font-rescale.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font-rescale.Tpo -c -o cairo_test_suite-user-font-rescale.o `test -f 'user-font-rescale.c' || echo '$(srcdir)/'`user-font-rescale.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font-rescale.Tpo $(DEPDIR)/cairo_test_suite-user-font-rescale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font-rescale.c' object='cairo_test_suite-user-font-rescale.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font-rescale.o `test -f 'user-font-rescale.c' || echo '$(srcdir)/'`user-font-rescale.c + +cairo_test_suite-user-font-rescale.obj: user-font-rescale.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-user-font-rescale.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-user-font-rescale.Tpo -c -o cairo_test_suite-user-font-rescale.obj `if test -f 'user-font-rescale.c'; then $(CYGPATH_W) 'user-font-rescale.c'; else $(CYGPATH_W) '$(srcdir)/user-font-rescale.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-user-font-rescale.Tpo $(DEPDIR)/cairo_test_suite-user-font-rescale.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='user-font-rescale.c' object='cairo_test_suite-user-font-rescale.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-user-font-rescale.obj `if test -f 'user-font-rescale.c'; then $(CYGPATH_W) 'user-font-rescale.c'; else $(CYGPATH_W) '$(srcdir)/user-font-rescale.c'; fi` + +cairo_test_suite-world-map.o: world-map.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-world-map.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-world-map.Tpo -c -o cairo_test_suite-world-map.o `test -f 'world-map.c' || echo '$(srcdir)/'`world-map.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-world-map.Tpo $(DEPDIR)/cairo_test_suite-world-map.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='world-map.c' object='cairo_test_suite-world-map.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-world-map.o `test -f 'world-map.c' || echo '$(srcdir)/'`world-map.c + +cairo_test_suite-world-map.obj: world-map.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-world-map.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-world-map.Tpo -c -o cairo_test_suite-world-map.obj `if test -f 'world-map.c'; then $(CYGPATH_W) 'world-map.c'; else $(CYGPATH_W) '$(srcdir)/world-map.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-world-map.Tpo $(DEPDIR)/cairo_test_suite-world-map.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='world-map.c' object='cairo_test_suite-world-map.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-world-map.obj `if test -f 'world-map.c'; then $(CYGPATH_W) 'world-map.c'; else $(CYGPATH_W) '$(srcdir)/world-map.c'; fi` + +cairo_test_suite-white-in-noop.o: white-in-noop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-white-in-noop.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-white-in-noop.Tpo -c -o cairo_test_suite-white-in-noop.o `test -f 'white-in-noop.c' || echo '$(srcdir)/'`white-in-noop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-white-in-noop.Tpo $(DEPDIR)/cairo_test_suite-white-in-noop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='white-in-noop.c' object='cairo_test_suite-white-in-noop.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-white-in-noop.o `test -f 'white-in-noop.c' || echo '$(srcdir)/'`white-in-noop.c + +cairo_test_suite-white-in-noop.obj: white-in-noop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-white-in-noop.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-white-in-noop.Tpo -c -o cairo_test_suite-white-in-noop.obj `if test -f 'white-in-noop.c'; then $(CYGPATH_W) 'white-in-noop.c'; else $(CYGPATH_W) '$(srcdir)/white-in-noop.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-white-in-noop.Tpo $(DEPDIR)/cairo_test_suite-white-in-noop.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='white-in-noop.c' object='cairo_test_suite-white-in-noop.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-white-in-noop.obj `if test -f 'white-in-noop.c'; then $(CYGPATH_W) 'white-in-noop.c'; else $(CYGPATH_W) '$(srcdir)/white-in-noop.c'; fi` + +cairo_test_suite-xcb-huge-image-shm.o: xcb-huge-image-shm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-huge-image-shm.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Tpo -c -o cairo_test_suite-xcb-huge-image-shm.o `test -f 'xcb-huge-image-shm.c' || echo '$(srcdir)/'`xcb-huge-image-shm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Tpo $(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-huge-image-shm.c' object='cairo_test_suite-xcb-huge-image-shm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-huge-image-shm.o `test -f 'xcb-huge-image-shm.c' || echo '$(srcdir)/'`xcb-huge-image-shm.c + +cairo_test_suite-xcb-huge-image-shm.obj: xcb-huge-image-shm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-huge-image-shm.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Tpo -c -o cairo_test_suite-xcb-huge-image-shm.obj `if test -f 'xcb-huge-image-shm.c'; then $(CYGPATH_W) 'xcb-huge-image-shm.c'; else $(CYGPATH_W) '$(srcdir)/xcb-huge-image-shm.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Tpo $(DEPDIR)/cairo_test_suite-xcb-huge-image-shm.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-huge-image-shm.c' object='cairo_test_suite-xcb-huge-image-shm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-huge-image-shm.obj `if test -f 'xcb-huge-image-shm.c'; then $(CYGPATH_W) 'xcb-huge-image-shm.c'; else $(CYGPATH_W) '$(srcdir)/xcb-huge-image-shm.c'; fi` + +cairo_test_suite-xcb-huge-subimage.o: xcb-huge-subimage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-huge-subimage.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Tpo -c -o cairo_test_suite-xcb-huge-subimage.o `test -f 'xcb-huge-subimage.c' || echo '$(srcdir)/'`xcb-huge-subimage.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Tpo $(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-huge-subimage.c' object='cairo_test_suite-xcb-huge-subimage.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-huge-subimage.o `test -f 'xcb-huge-subimage.c' || echo '$(srcdir)/'`xcb-huge-subimage.c + +cairo_test_suite-xcb-huge-subimage.obj: xcb-huge-subimage.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-huge-subimage.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Tpo -c -o cairo_test_suite-xcb-huge-subimage.obj `if test -f 'xcb-huge-subimage.c'; then $(CYGPATH_W) 'xcb-huge-subimage.c'; else $(CYGPATH_W) '$(srcdir)/xcb-huge-subimage.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Tpo $(DEPDIR)/cairo_test_suite-xcb-huge-subimage.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-huge-subimage.c' object='cairo_test_suite-xcb-huge-subimage.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-huge-subimage.obj `if test -f 'xcb-huge-subimage.c'; then $(CYGPATH_W) 'xcb-huge-subimage.c'; else $(CYGPATH_W) '$(srcdir)/xcb-huge-subimage.c'; fi` + +cairo_test_suite-xcb-stress-cache.o: xcb-stress-cache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-stress-cache.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-stress-cache.Tpo -c -o cairo_test_suite-xcb-stress-cache.o `test -f 'xcb-stress-cache.c' || echo '$(srcdir)/'`xcb-stress-cache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-stress-cache.Tpo $(DEPDIR)/cairo_test_suite-xcb-stress-cache.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-stress-cache.c' object='cairo_test_suite-xcb-stress-cache.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-stress-cache.o `test -f 'xcb-stress-cache.c' || echo '$(srcdir)/'`xcb-stress-cache.c + +cairo_test_suite-xcb-stress-cache.obj: xcb-stress-cache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-stress-cache.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-stress-cache.Tpo -c -o cairo_test_suite-xcb-stress-cache.obj `if test -f 'xcb-stress-cache.c'; then $(CYGPATH_W) 'xcb-stress-cache.c'; else $(CYGPATH_W) '$(srcdir)/xcb-stress-cache.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-stress-cache.Tpo $(DEPDIR)/cairo_test_suite-xcb-stress-cache.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-stress-cache.c' object='cairo_test_suite-xcb-stress-cache.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-stress-cache.obj `if test -f 'xcb-stress-cache.c'; then $(CYGPATH_W) 'xcb-stress-cache.c'; else $(CYGPATH_W) '$(srcdir)/xcb-stress-cache.c'; fi` + +cairo_test_suite-xcb-snapshot-assert.o: xcb-snapshot-assert.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-snapshot-assert.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Tpo -c -o cairo_test_suite-xcb-snapshot-assert.o `test -f 'xcb-snapshot-assert.c' || echo '$(srcdir)/'`xcb-snapshot-assert.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Tpo $(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-snapshot-assert.c' object='cairo_test_suite-xcb-snapshot-assert.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-snapshot-assert.o `test -f 'xcb-snapshot-assert.c' || echo '$(srcdir)/'`xcb-snapshot-assert.c + +cairo_test_suite-xcb-snapshot-assert.obj: xcb-snapshot-assert.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-snapshot-assert.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Tpo -c -o cairo_test_suite-xcb-snapshot-assert.obj `if test -f 'xcb-snapshot-assert.c'; then $(CYGPATH_W) 'xcb-snapshot-assert.c'; else $(CYGPATH_W) '$(srcdir)/xcb-snapshot-assert.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Tpo $(DEPDIR)/cairo_test_suite-xcb-snapshot-assert.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-snapshot-assert.c' object='cairo_test_suite-xcb-snapshot-assert.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-snapshot-assert.obj `if test -f 'xcb-snapshot-assert.c'; then $(CYGPATH_W) 'xcb-snapshot-assert.c'; else $(CYGPATH_W) '$(srcdir)/xcb-snapshot-assert.c'; fi` + +cairo_test_suite-xcomposite-projection.o: xcomposite-projection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcomposite-projection.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcomposite-projection.Tpo -c -o cairo_test_suite-xcomposite-projection.o `test -f 'xcomposite-projection.c' || echo '$(srcdir)/'`xcomposite-projection.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcomposite-projection.Tpo $(DEPDIR)/cairo_test_suite-xcomposite-projection.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcomposite-projection.c' object='cairo_test_suite-xcomposite-projection.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcomposite-projection.o `test -f 'xcomposite-projection.c' || echo '$(srcdir)/'`xcomposite-projection.c + +cairo_test_suite-xcomposite-projection.obj: xcomposite-projection.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcomposite-projection.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcomposite-projection.Tpo -c -o cairo_test_suite-xcomposite-projection.obj `if test -f 'xcomposite-projection.c'; then $(CYGPATH_W) 'xcomposite-projection.c'; else $(CYGPATH_W) '$(srcdir)/xcomposite-projection.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcomposite-projection.Tpo $(DEPDIR)/cairo_test_suite-xcomposite-projection.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcomposite-projection.c' object='cairo_test_suite-xcomposite-projection.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcomposite-projection.obj `if test -f 'xcomposite-projection.c'; then $(CYGPATH_W) 'xcomposite-projection.c'; else $(CYGPATH_W) '$(srcdir)/xcomposite-projection.c'; fi` + +cairo_test_suite-xlib-expose-event.o: xlib-expose-event.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xlib-expose-event.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xlib-expose-event.Tpo -c -o cairo_test_suite-xlib-expose-event.o `test -f 'xlib-expose-event.c' || echo '$(srcdir)/'`xlib-expose-event.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xlib-expose-event.Tpo $(DEPDIR)/cairo_test_suite-xlib-expose-event.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xlib-expose-event.c' object='cairo_test_suite-xlib-expose-event.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xlib-expose-event.o `test -f 'xlib-expose-event.c' || echo '$(srcdir)/'`xlib-expose-event.c + +cairo_test_suite-xlib-expose-event.obj: xlib-expose-event.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xlib-expose-event.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xlib-expose-event.Tpo -c -o cairo_test_suite-xlib-expose-event.obj `if test -f 'xlib-expose-event.c'; then $(CYGPATH_W) 'xlib-expose-event.c'; else $(CYGPATH_W) '$(srcdir)/xlib-expose-event.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xlib-expose-event.Tpo $(DEPDIR)/cairo_test_suite-xlib-expose-event.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xlib-expose-event.c' object='cairo_test_suite-xlib-expose-event.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xlib-expose-event.obj `if test -f 'xlib-expose-event.c'; then $(CYGPATH_W) 'xlib-expose-event.c'; else $(CYGPATH_W) '$(srcdir)/xlib-expose-event.c'; fi` + +cairo_test_suite-zero-alpha.o: zero-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-zero-alpha.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-zero-alpha.Tpo -c -o cairo_test_suite-zero-alpha.o `test -f 'zero-alpha.c' || echo '$(srcdir)/'`zero-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-zero-alpha.Tpo $(DEPDIR)/cairo_test_suite-zero-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='zero-alpha.c' object='cairo_test_suite-zero-alpha.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-zero-alpha.o `test -f 'zero-alpha.c' || echo '$(srcdir)/'`zero-alpha.c + +cairo_test_suite-zero-alpha.obj: zero-alpha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-zero-alpha.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-zero-alpha.Tpo -c -o cairo_test_suite-zero-alpha.obj `if test -f 'zero-alpha.c'; then $(CYGPATH_W) 'zero-alpha.c'; else $(CYGPATH_W) '$(srcdir)/zero-alpha.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-zero-alpha.Tpo $(DEPDIR)/cairo_test_suite-zero-alpha.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='zero-alpha.c' object='cairo_test_suite-zero-alpha.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-zero-alpha.obj `if test -f 'zero-alpha.c'; then $(CYGPATH_W) 'zero-alpha.c'; else $(CYGPATH_W) '$(srcdir)/zero-alpha.c'; fi` + +cairo_test_suite-zero-mask.o: zero-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-zero-mask.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-zero-mask.Tpo -c -o cairo_test_suite-zero-mask.o `test -f 'zero-mask.c' || echo '$(srcdir)/'`zero-mask.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-zero-mask.Tpo $(DEPDIR)/cairo_test_suite-zero-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='zero-mask.c' object='cairo_test_suite-zero-mask.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-zero-mask.o `test -f 'zero-mask.c' || echo '$(srcdir)/'`zero-mask.c + +cairo_test_suite-zero-mask.obj: zero-mask.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-zero-mask.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-zero-mask.Tpo -c -o cairo_test_suite-zero-mask.obj `if test -f 'zero-mask.c'; then $(CYGPATH_W) 'zero-mask.c'; else $(CYGPATH_W) '$(srcdir)/zero-mask.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-zero-mask.Tpo $(DEPDIR)/cairo_test_suite-zero-mask.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='zero-mask.c' object='cairo_test_suite-zero-mask.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-zero-mask.obj `if test -f 'zero-mask.c'; then $(CYGPATH_W) 'zero-mask.c'; else $(CYGPATH_W) '$(srcdir)/zero-mask.c'; fi` + +cairo_test_suite-pthread-same-source.o: pthread-same-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pthread-same-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pthread-same-source.Tpo -c -o cairo_test_suite-pthread-same-source.o `test -f 'pthread-same-source.c' || echo '$(srcdir)/'`pthread-same-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pthread-same-source.Tpo $(DEPDIR)/cairo_test_suite-pthread-same-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pthread-same-source.c' object='cairo_test_suite-pthread-same-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pthread-same-source.o `test -f 'pthread-same-source.c' || echo '$(srcdir)/'`pthread-same-source.c + +cairo_test_suite-pthread-same-source.obj: pthread-same-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pthread-same-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pthread-same-source.Tpo -c -o cairo_test_suite-pthread-same-source.obj `if test -f 'pthread-same-source.c'; then $(CYGPATH_W) 'pthread-same-source.c'; else $(CYGPATH_W) '$(srcdir)/pthread-same-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pthread-same-source.Tpo $(DEPDIR)/cairo_test_suite-pthread-same-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pthread-same-source.c' object='cairo_test_suite-pthread-same-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pthread-same-source.obj `if test -f 'pthread-same-source.c'; then $(CYGPATH_W) 'pthread-same-source.c'; else $(CYGPATH_W) '$(srcdir)/pthread-same-source.c'; fi` + +cairo_test_suite-pthread-show-text.o: pthread-show-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pthread-show-text.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pthread-show-text.Tpo -c -o cairo_test_suite-pthread-show-text.o `test -f 'pthread-show-text.c' || echo '$(srcdir)/'`pthread-show-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pthread-show-text.Tpo $(DEPDIR)/cairo_test_suite-pthread-show-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pthread-show-text.c' object='cairo_test_suite-pthread-show-text.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pthread-show-text.o `test -f 'pthread-show-text.c' || echo '$(srcdir)/'`pthread-show-text.c + +cairo_test_suite-pthread-show-text.obj: pthread-show-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pthread-show-text.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pthread-show-text.Tpo -c -o cairo_test_suite-pthread-show-text.obj `if test -f 'pthread-show-text.c'; then $(CYGPATH_W) 'pthread-show-text.c'; else $(CYGPATH_W) '$(srcdir)/pthread-show-text.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pthread-show-text.Tpo $(DEPDIR)/cairo_test_suite-pthread-show-text.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pthread-show-text.c' object='cairo_test_suite-pthread-show-text.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pthread-show-text.obj `if test -f 'pthread-show-text.c'; then $(CYGPATH_W) 'pthread-show-text.c'; else $(CYGPATH_W) '$(srcdir)/pthread-show-text.c'; fi` + +cairo_test_suite-pthread-similar.o: pthread-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pthread-similar.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pthread-similar.Tpo -c -o cairo_test_suite-pthread-similar.o `test -f 'pthread-similar.c' || echo '$(srcdir)/'`pthread-similar.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pthread-similar.Tpo $(DEPDIR)/cairo_test_suite-pthread-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pthread-similar.c' object='cairo_test_suite-pthread-similar.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pthread-similar.o `test -f 'pthread-similar.c' || echo '$(srcdir)/'`pthread-similar.c + +cairo_test_suite-pthread-similar.obj: pthread-similar.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pthread-similar.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pthread-similar.Tpo -c -o cairo_test_suite-pthread-similar.obj `if test -f 'pthread-similar.c'; then $(CYGPATH_W) 'pthread-similar.c'; else $(CYGPATH_W) '$(srcdir)/pthread-similar.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pthread-similar.Tpo $(DEPDIR)/cairo_test_suite-pthread-similar.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pthread-similar.c' object='cairo_test_suite-pthread-similar.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pthread-similar.obj `if test -f 'pthread-similar.c'; then $(CYGPATH_W) 'pthread-similar.c'; else $(CYGPATH_W) '$(srcdir)/pthread-similar.c'; fi` + +cairo_test_suite-bitmap-font.o: bitmap-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bitmap-font.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-bitmap-font.Tpo -c -o cairo_test_suite-bitmap-font.o `test -f 'bitmap-font.c' || echo '$(srcdir)/'`bitmap-font.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bitmap-font.Tpo $(DEPDIR)/cairo_test_suite-bitmap-font.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bitmap-font.c' object='cairo_test_suite-bitmap-font.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bitmap-font.o `test -f 'bitmap-font.c' || echo '$(srcdir)/'`bitmap-font.c + +cairo_test_suite-bitmap-font.obj: bitmap-font.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-bitmap-font.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-bitmap-font.Tpo -c -o cairo_test_suite-bitmap-font.obj `if test -f 'bitmap-font.c'; then $(CYGPATH_W) 'bitmap-font.c'; else $(CYGPATH_W) '$(srcdir)/bitmap-font.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-bitmap-font.Tpo $(DEPDIR)/cairo_test_suite-bitmap-font.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bitmap-font.c' object='cairo_test_suite-bitmap-font.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-bitmap-font.obj `if test -f 'bitmap-font.c'; then $(CYGPATH_W) 'bitmap-font.c'; else $(CYGPATH_W) '$(srcdir)/bitmap-font.c'; fi` + +cairo_test_suite-ft-font-create-for-ft-face.o: ft-font-create-for-ft-face.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-font-create-for-ft-face.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Tpo -c -o cairo_test_suite-ft-font-create-for-ft-face.o `test -f 'ft-font-create-for-ft-face.c' || echo '$(srcdir)/'`ft-font-create-for-ft-face.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Tpo $(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-font-create-for-ft-face.c' object='cairo_test_suite-ft-font-create-for-ft-face.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-font-create-for-ft-face.o `test -f 'ft-font-create-for-ft-face.c' || echo '$(srcdir)/'`ft-font-create-for-ft-face.c + +cairo_test_suite-ft-font-create-for-ft-face.obj: ft-font-create-for-ft-face.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-font-create-for-ft-face.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Tpo -c -o cairo_test_suite-ft-font-create-for-ft-face.obj `if test -f 'ft-font-create-for-ft-face.c'; then $(CYGPATH_W) 'ft-font-create-for-ft-face.c'; else $(CYGPATH_W) '$(srcdir)/ft-font-create-for-ft-face.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Tpo $(DEPDIR)/cairo_test_suite-ft-font-create-for-ft-face.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-font-create-for-ft-face.c' object='cairo_test_suite-ft-font-create-for-ft-face.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-font-create-for-ft-face.obj `if test -f 'ft-font-create-for-ft-face.c'; then $(CYGPATH_W) 'ft-font-create-for-ft-face.c'; else $(CYGPATH_W) '$(srcdir)/ft-font-create-for-ft-face.c'; fi` + +cairo_test_suite-ft-show-glyphs-positioning.o: ft-show-glyphs-positioning.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-show-glyphs-positioning.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Tpo -c -o cairo_test_suite-ft-show-glyphs-positioning.o `test -f 'ft-show-glyphs-positioning.c' || echo '$(srcdir)/'`ft-show-glyphs-positioning.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Tpo $(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-show-glyphs-positioning.c' object='cairo_test_suite-ft-show-glyphs-positioning.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-show-glyphs-positioning.o `test -f 'ft-show-glyphs-positioning.c' || echo '$(srcdir)/'`ft-show-glyphs-positioning.c + +cairo_test_suite-ft-show-glyphs-positioning.obj: ft-show-glyphs-positioning.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-show-glyphs-positioning.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Tpo -c -o cairo_test_suite-ft-show-glyphs-positioning.obj `if test -f 'ft-show-glyphs-positioning.c'; then $(CYGPATH_W) 'ft-show-glyphs-positioning.c'; else $(CYGPATH_W) '$(srcdir)/ft-show-glyphs-positioning.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Tpo $(DEPDIR)/cairo_test_suite-ft-show-glyphs-positioning.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-show-glyphs-positioning.c' object='cairo_test_suite-ft-show-glyphs-positioning.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-show-glyphs-positioning.obj `if test -f 'ft-show-glyphs-positioning.c'; then $(CYGPATH_W) 'ft-show-glyphs-positioning.c'; else $(CYGPATH_W) '$(srcdir)/ft-show-glyphs-positioning.c'; fi` + +cairo_test_suite-ft-show-glyphs-table.o: ft-show-glyphs-table.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-show-glyphs-table.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Tpo -c -o cairo_test_suite-ft-show-glyphs-table.o `test -f 'ft-show-glyphs-table.c' || echo '$(srcdir)/'`ft-show-glyphs-table.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Tpo $(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-show-glyphs-table.c' object='cairo_test_suite-ft-show-glyphs-table.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-show-glyphs-table.o `test -f 'ft-show-glyphs-table.c' || echo '$(srcdir)/'`ft-show-glyphs-table.c + +cairo_test_suite-ft-show-glyphs-table.obj: ft-show-glyphs-table.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-show-glyphs-table.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Tpo -c -o cairo_test_suite-ft-show-glyphs-table.obj `if test -f 'ft-show-glyphs-table.c'; then $(CYGPATH_W) 'ft-show-glyphs-table.c'; else $(CYGPATH_W) '$(srcdir)/ft-show-glyphs-table.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Tpo $(DEPDIR)/cairo_test_suite-ft-show-glyphs-table.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-show-glyphs-table.c' object='cairo_test_suite-ft-show-glyphs-table.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-show-glyphs-table.obj `if test -f 'ft-show-glyphs-table.c'; then $(CYGPATH_W) 'ft-show-glyphs-table.c'; else $(CYGPATH_W) '$(srcdir)/ft-show-glyphs-table.c'; fi` + +cairo_test_suite-ft-text-vertical-layout-type1.o: ft-text-vertical-layout-type1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-text-vertical-layout-type1.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Tpo -c -o cairo_test_suite-ft-text-vertical-layout-type1.o `test -f 'ft-text-vertical-layout-type1.c' || echo '$(srcdir)/'`ft-text-vertical-layout-type1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Tpo $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-text-vertical-layout-type1.c' object='cairo_test_suite-ft-text-vertical-layout-type1.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-text-vertical-layout-type1.o `test -f 'ft-text-vertical-layout-type1.c' || echo '$(srcdir)/'`ft-text-vertical-layout-type1.c + +cairo_test_suite-ft-text-vertical-layout-type1.obj: ft-text-vertical-layout-type1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-text-vertical-layout-type1.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Tpo -c -o cairo_test_suite-ft-text-vertical-layout-type1.obj `if test -f 'ft-text-vertical-layout-type1.c'; then $(CYGPATH_W) 'ft-text-vertical-layout-type1.c'; else $(CYGPATH_W) '$(srcdir)/ft-text-vertical-layout-type1.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Tpo $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type1.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-text-vertical-layout-type1.c' object='cairo_test_suite-ft-text-vertical-layout-type1.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-text-vertical-layout-type1.obj `if test -f 'ft-text-vertical-layout-type1.c'; then $(CYGPATH_W) 'ft-text-vertical-layout-type1.c'; else $(CYGPATH_W) '$(srcdir)/ft-text-vertical-layout-type1.c'; fi` + +cairo_test_suite-ft-text-vertical-layout-type3.o: ft-text-vertical-layout-type3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-text-vertical-layout-type3.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Tpo -c -o cairo_test_suite-ft-text-vertical-layout-type3.o `test -f 'ft-text-vertical-layout-type3.c' || echo '$(srcdir)/'`ft-text-vertical-layout-type3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Tpo $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-text-vertical-layout-type3.c' object='cairo_test_suite-ft-text-vertical-layout-type3.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-text-vertical-layout-type3.o `test -f 'ft-text-vertical-layout-type3.c' || echo '$(srcdir)/'`ft-text-vertical-layout-type3.c + +cairo_test_suite-ft-text-vertical-layout-type3.obj: ft-text-vertical-layout-type3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-text-vertical-layout-type3.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Tpo -c -o cairo_test_suite-ft-text-vertical-layout-type3.obj `if test -f 'ft-text-vertical-layout-type3.c'; then $(CYGPATH_W) 'ft-text-vertical-layout-type3.c'; else $(CYGPATH_W) '$(srcdir)/ft-text-vertical-layout-type3.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Tpo $(DEPDIR)/cairo_test_suite-ft-text-vertical-layout-type3.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-text-vertical-layout-type3.c' object='cairo_test_suite-ft-text-vertical-layout-type3.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-text-vertical-layout-type3.obj `if test -f 'ft-text-vertical-layout-type3.c'; then $(CYGPATH_W) 'ft-text-vertical-layout-type3.c'; else $(CYGPATH_W) '$(srcdir)/ft-text-vertical-layout-type3.c'; fi` + +cairo_test_suite-ft-text-antialias-none.o: ft-text-antialias-none.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-text-antialias-none.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Tpo -c -o cairo_test_suite-ft-text-antialias-none.o `test -f 'ft-text-antialias-none.c' || echo '$(srcdir)/'`ft-text-antialias-none.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Tpo $(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-text-antialias-none.c' object='cairo_test_suite-ft-text-antialias-none.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-text-antialias-none.o `test -f 'ft-text-antialias-none.c' || echo '$(srcdir)/'`ft-text-antialias-none.c + +cairo_test_suite-ft-text-antialias-none.obj: ft-text-antialias-none.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ft-text-antialias-none.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Tpo -c -o cairo_test_suite-ft-text-antialias-none.obj `if test -f 'ft-text-antialias-none.c'; then $(CYGPATH_W) 'ft-text-antialias-none.c'; else $(CYGPATH_W) '$(srcdir)/ft-text-antialias-none.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Tpo $(DEPDIR)/cairo_test_suite-ft-text-antialias-none.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ft-text-antialias-none.c' object='cairo_test_suite-ft-text-antialias-none.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ft-text-antialias-none.obj `if test -f 'ft-text-antialias-none.c'; then $(CYGPATH_W) 'ft-text-antialias-none.c'; else $(CYGPATH_W) '$(srcdir)/ft-text-antialias-none.c'; fi` + +cairo_test_suite-gl-device-release.o: gl-device-release.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gl-device-release.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gl-device-release.Tpo -c -o cairo_test_suite-gl-device-release.o `test -f 'gl-device-release.c' || echo '$(srcdir)/'`gl-device-release.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gl-device-release.Tpo $(DEPDIR)/cairo_test_suite-gl-device-release.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl-device-release.c' object='cairo_test_suite-gl-device-release.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gl-device-release.o `test -f 'gl-device-release.c' || echo '$(srcdir)/'`gl-device-release.c + +cairo_test_suite-gl-device-release.obj: gl-device-release.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gl-device-release.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gl-device-release.Tpo -c -o cairo_test_suite-gl-device-release.obj `if test -f 'gl-device-release.c'; then $(CYGPATH_W) 'gl-device-release.c'; else $(CYGPATH_W) '$(srcdir)/gl-device-release.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gl-device-release.Tpo $(DEPDIR)/cairo_test_suite-gl-device-release.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl-device-release.c' object='cairo_test_suite-gl-device-release.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gl-device-release.obj `if test -f 'gl-device-release.c'; then $(CYGPATH_W) 'gl-device-release.c'; else $(CYGPATH_W) '$(srcdir)/gl-device-release.c'; fi` + +cairo_test_suite-gl-oversized-surface.o: gl-oversized-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gl-oversized-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gl-oversized-surface.Tpo -c -o cairo_test_suite-gl-oversized-surface.o `test -f 'gl-oversized-surface.c' || echo '$(srcdir)/'`gl-oversized-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gl-oversized-surface.Tpo $(DEPDIR)/cairo_test_suite-gl-oversized-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl-oversized-surface.c' object='cairo_test_suite-gl-oversized-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gl-oversized-surface.o `test -f 'gl-oversized-surface.c' || echo '$(srcdir)/'`gl-oversized-surface.c + +cairo_test_suite-gl-oversized-surface.obj: gl-oversized-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gl-oversized-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gl-oversized-surface.Tpo -c -o cairo_test_suite-gl-oversized-surface.obj `if test -f 'gl-oversized-surface.c'; then $(CYGPATH_W) 'gl-oversized-surface.c'; else $(CYGPATH_W) '$(srcdir)/gl-oversized-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gl-oversized-surface.Tpo $(DEPDIR)/cairo_test_suite-gl-oversized-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl-oversized-surface.c' object='cairo_test_suite-gl-oversized-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gl-oversized-surface.obj `if test -f 'gl-oversized-surface.c'; then $(CYGPATH_W) 'gl-oversized-surface.c'; else $(CYGPATH_W) '$(srcdir)/gl-oversized-surface.c'; fi` + +cairo_test_suite-gl-surface-source.o: gl-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gl-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-gl-surface-source.Tpo -c -o cairo_test_suite-gl-surface-source.o `test -f 'gl-surface-source.c' || echo '$(srcdir)/'`gl-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gl-surface-source.Tpo $(DEPDIR)/cairo_test_suite-gl-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl-surface-source.c' object='cairo_test_suite-gl-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gl-surface-source.o `test -f 'gl-surface-source.c' || echo '$(srcdir)/'`gl-surface-source.c + +cairo_test_suite-gl-surface-source.obj: gl-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-gl-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-gl-surface-source.Tpo -c -o cairo_test_suite-gl-surface-source.obj `if test -f 'gl-surface-source.c'; then $(CYGPATH_W) 'gl-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/gl-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-gl-surface-source.Tpo $(DEPDIR)/cairo_test_suite-gl-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gl-surface-source.c' object='cairo_test_suite-gl-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-gl-surface-source.obj `if test -f 'gl-surface-source.c'; then $(CYGPATH_W) 'gl-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/gl-surface-source.c'; fi` + +cairo_test_suite-egl-oversized-surface.o: egl-oversized-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-egl-oversized-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-egl-oversized-surface.Tpo -c -o cairo_test_suite-egl-oversized-surface.o `test -f 'egl-oversized-surface.c' || echo '$(srcdir)/'`egl-oversized-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-egl-oversized-surface.Tpo $(DEPDIR)/cairo_test_suite-egl-oversized-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egl-oversized-surface.c' object='cairo_test_suite-egl-oversized-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-egl-oversized-surface.o `test -f 'egl-oversized-surface.c' || echo '$(srcdir)/'`egl-oversized-surface.c + +cairo_test_suite-egl-oversized-surface.obj: egl-oversized-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-egl-oversized-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-egl-oversized-surface.Tpo -c -o cairo_test_suite-egl-oversized-surface.obj `if test -f 'egl-oversized-surface.c'; then $(CYGPATH_W) 'egl-oversized-surface.c'; else $(CYGPATH_W) '$(srcdir)/egl-oversized-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-egl-oversized-surface.Tpo $(DEPDIR)/cairo_test_suite-egl-oversized-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egl-oversized-surface.c' object='cairo_test_suite-egl-oversized-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-egl-oversized-surface.obj `if test -f 'egl-oversized-surface.c'; then $(CYGPATH_W) 'egl-oversized-surface.c'; else $(CYGPATH_W) '$(srcdir)/egl-oversized-surface.c'; fi` + +cairo_test_suite-egl-surface-source.o: egl-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-egl-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-egl-surface-source.Tpo -c -o cairo_test_suite-egl-surface-source.o `test -f 'egl-surface-source.c' || echo '$(srcdir)/'`egl-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-egl-surface-source.Tpo $(DEPDIR)/cairo_test_suite-egl-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egl-surface-source.c' object='cairo_test_suite-egl-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-egl-surface-source.o `test -f 'egl-surface-source.c' || echo '$(srcdir)/'`egl-surface-source.c + +cairo_test_suite-egl-surface-source.obj: egl-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-egl-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-egl-surface-source.Tpo -c -o cairo_test_suite-egl-surface-source.obj `if test -f 'egl-surface-source.c'; then $(CYGPATH_W) 'egl-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/egl-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-egl-surface-source.Tpo $(DEPDIR)/cairo_test_suite-egl-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='egl-surface-source.c' object='cairo_test_suite-egl-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-egl-surface-source.obj `if test -f 'egl-surface-source.c'; then $(CYGPATH_W) 'egl-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/egl-surface-source.c'; fi` + +cairo_test_suite-quartz-surface-source.o: quartz-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-quartz-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-quartz-surface-source.Tpo -c -o cairo_test_suite-quartz-surface-source.o `test -f 'quartz-surface-source.c' || echo '$(srcdir)/'`quartz-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-quartz-surface-source.Tpo $(DEPDIR)/cairo_test_suite-quartz-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quartz-surface-source.c' object='cairo_test_suite-quartz-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-quartz-surface-source.o `test -f 'quartz-surface-source.c' || echo '$(srcdir)/'`quartz-surface-source.c + +cairo_test_suite-quartz-surface-source.obj: quartz-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-quartz-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-quartz-surface-source.Tpo -c -o cairo_test_suite-quartz-surface-source.obj `if test -f 'quartz-surface-source.c'; then $(CYGPATH_W) 'quartz-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/quartz-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-quartz-surface-source.Tpo $(DEPDIR)/cairo_test_suite-quartz-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quartz-surface-source.c' object='cairo_test_suite-quartz-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-quartz-surface-source.obj `if test -f 'quartz-surface-source.c'; then $(CYGPATH_W) 'quartz-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/quartz-surface-source.c'; fi` + +cairo_test_suite-pdf-features.o: pdf-features.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-features.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-features.Tpo -c -o cairo_test_suite-pdf-features.o `test -f 'pdf-features.c' || echo '$(srcdir)/'`pdf-features.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-features.Tpo $(DEPDIR)/cairo_test_suite-pdf-features.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-features.c' object='cairo_test_suite-pdf-features.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-features.o `test -f 'pdf-features.c' || echo '$(srcdir)/'`pdf-features.c + +cairo_test_suite-pdf-features.obj: pdf-features.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-features.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-features.Tpo -c -o cairo_test_suite-pdf-features.obj `if test -f 'pdf-features.c'; then $(CYGPATH_W) 'pdf-features.c'; else $(CYGPATH_W) '$(srcdir)/pdf-features.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-features.Tpo $(DEPDIR)/cairo_test_suite-pdf-features.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-features.c' object='cairo_test_suite-pdf-features.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-features.obj `if test -f 'pdf-features.c'; then $(CYGPATH_W) 'pdf-features.c'; else $(CYGPATH_W) '$(srcdir)/pdf-features.c'; fi` + +cairo_test_suite-pdf-mime-data.o: pdf-mime-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-mime-data.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-mime-data.Tpo -c -o cairo_test_suite-pdf-mime-data.o `test -f 'pdf-mime-data.c' || echo '$(srcdir)/'`pdf-mime-data.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-mime-data.Tpo $(DEPDIR)/cairo_test_suite-pdf-mime-data.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-mime-data.c' object='cairo_test_suite-pdf-mime-data.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-mime-data.o `test -f 'pdf-mime-data.c' || echo '$(srcdir)/'`pdf-mime-data.c + +cairo_test_suite-pdf-mime-data.obj: pdf-mime-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-mime-data.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-mime-data.Tpo -c -o cairo_test_suite-pdf-mime-data.obj `if test -f 'pdf-mime-data.c'; then $(CYGPATH_W) 'pdf-mime-data.c'; else $(CYGPATH_W) '$(srcdir)/pdf-mime-data.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-mime-data.Tpo $(DEPDIR)/cairo_test_suite-pdf-mime-data.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-mime-data.c' object='cairo_test_suite-pdf-mime-data.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-mime-data.obj `if test -f 'pdf-mime-data.c'; then $(CYGPATH_W) 'pdf-mime-data.c'; else $(CYGPATH_W) '$(srcdir)/pdf-mime-data.c'; fi` + +cairo_test_suite-pdf-surface-source.o: pdf-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-surface-source.Tpo -c -o cairo_test_suite-pdf-surface-source.o `test -f 'pdf-surface-source.c' || echo '$(srcdir)/'`pdf-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-surface-source.Tpo $(DEPDIR)/cairo_test_suite-pdf-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-surface-source.c' object='cairo_test_suite-pdf-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-surface-source.o `test -f 'pdf-surface-source.c' || echo '$(srcdir)/'`pdf-surface-source.c + +cairo_test_suite-pdf-surface-source.obj: pdf-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-pdf-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-pdf-surface-source.Tpo -c -o cairo_test_suite-pdf-surface-source.obj `if test -f 'pdf-surface-source.c'; then $(CYGPATH_W) 'pdf-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/pdf-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-pdf-surface-source.Tpo $(DEPDIR)/cairo_test_suite-pdf-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf-surface-source.c' object='cairo_test_suite-pdf-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-pdf-surface-source.obj `if test -f 'pdf-surface-source.c'; then $(CYGPATH_W) 'pdf-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/pdf-surface-source.c'; fi` + +cairo_test_suite-ps-eps.o: ps-eps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ps-eps.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ps-eps.Tpo -c -o cairo_test_suite-ps-eps.o `test -f 'ps-eps.c' || echo '$(srcdir)/'`ps-eps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ps-eps.Tpo $(DEPDIR)/cairo_test_suite-ps-eps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps-eps.c' object='cairo_test_suite-ps-eps.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ps-eps.o `test -f 'ps-eps.c' || echo '$(srcdir)/'`ps-eps.c + +cairo_test_suite-ps-eps.obj: ps-eps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ps-eps.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ps-eps.Tpo -c -o cairo_test_suite-ps-eps.obj `if test -f 'ps-eps.c'; then $(CYGPATH_W) 'ps-eps.c'; else $(CYGPATH_W) '$(srcdir)/ps-eps.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ps-eps.Tpo $(DEPDIR)/cairo_test_suite-ps-eps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps-eps.c' object='cairo_test_suite-ps-eps.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ps-eps.obj `if test -f 'ps-eps.c'; then $(CYGPATH_W) 'ps-eps.c'; else $(CYGPATH_W) '$(srcdir)/ps-eps.c'; fi` + +cairo_test_suite-ps-features.o: ps-features.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ps-features.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ps-features.Tpo -c -o cairo_test_suite-ps-features.o `test -f 'ps-features.c' || echo '$(srcdir)/'`ps-features.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ps-features.Tpo $(DEPDIR)/cairo_test_suite-ps-features.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps-features.c' object='cairo_test_suite-ps-features.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ps-features.o `test -f 'ps-features.c' || echo '$(srcdir)/'`ps-features.c + +cairo_test_suite-ps-features.obj: ps-features.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ps-features.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ps-features.Tpo -c -o cairo_test_suite-ps-features.obj `if test -f 'ps-features.c'; then $(CYGPATH_W) 'ps-features.c'; else $(CYGPATH_W) '$(srcdir)/ps-features.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ps-features.Tpo $(DEPDIR)/cairo_test_suite-ps-features.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps-features.c' object='cairo_test_suite-ps-features.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ps-features.obj `if test -f 'ps-features.c'; then $(CYGPATH_W) 'ps-features.c'; else $(CYGPATH_W) '$(srcdir)/ps-features.c'; fi` + +cairo_test_suite-ps-surface-source.o: ps-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ps-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-ps-surface-source.Tpo -c -o cairo_test_suite-ps-surface-source.o `test -f 'ps-surface-source.c' || echo '$(srcdir)/'`ps-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ps-surface-source.Tpo $(DEPDIR)/cairo_test_suite-ps-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps-surface-source.c' object='cairo_test_suite-ps-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ps-surface-source.o `test -f 'ps-surface-source.c' || echo '$(srcdir)/'`ps-surface-source.c + +cairo_test_suite-ps-surface-source.obj: ps-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-ps-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-ps-surface-source.Tpo -c -o cairo_test_suite-ps-surface-source.obj `if test -f 'ps-surface-source.c'; then $(CYGPATH_W) 'ps-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/ps-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-ps-surface-source.Tpo $(DEPDIR)/cairo_test_suite-ps-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps-surface-source.c' object='cairo_test_suite-ps-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-ps-surface-source.obj `if test -f 'ps-surface-source.c'; then $(CYGPATH_W) 'ps-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/ps-surface-source.c'; fi` + +cairo_test_suite-svg-surface.o: svg-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-svg-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-svg-surface.Tpo -c -o cairo_test_suite-svg-surface.o `test -f 'svg-surface.c' || echo '$(srcdir)/'`svg-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-svg-surface.Tpo $(DEPDIR)/cairo_test_suite-svg-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg-surface.c' object='cairo_test_suite-svg-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-svg-surface.o `test -f 'svg-surface.c' || echo '$(srcdir)/'`svg-surface.c + +cairo_test_suite-svg-surface.obj: svg-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-svg-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-svg-surface.Tpo -c -o cairo_test_suite-svg-surface.obj `if test -f 'svg-surface.c'; then $(CYGPATH_W) 'svg-surface.c'; else $(CYGPATH_W) '$(srcdir)/svg-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-svg-surface.Tpo $(DEPDIR)/cairo_test_suite-svg-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg-surface.c' object='cairo_test_suite-svg-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-svg-surface.obj `if test -f 'svg-surface.c'; then $(CYGPATH_W) 'svg-surface.c'; else $(CYGPATH_W) '$(srcdir)/svg-surface.c'; fi` + +cairo_test_suite-svg-clip.o: svg-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-svg-clip.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-svg-clip.Tpo -c -o cairo_test_suite-svg-clip.o `test -f 'svg-clip.c' || echo '$(srcdir)/'`svg-clip.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-svg-clip.Tpo $(DEPDIR)/cairo_test_suite-svg-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg-clip.c' object='cairo_test_suite-svg-clip.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-svg-clip.o `test -f 'svg-clip.c' || echo '$(srcdir)/'`svg-clip.c + +cairo_test_suite-svg-clip.obj: svg-clip.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-svg-clip.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-svg-clip.Tpo -c -o cairo_test_suite-svg-clip.obj `if test -f 'svg-clip.c'; then $(CYGPATH_W) 'svg-clip.c'; else $(CYGPATH_W) '$(srcdir)/svg-clip.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-svg-clip.Tpo $(DEPDIR)/cairo_test_suite-svg-clip.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg-clip.c' object='cairo_test_suite-svg-clip.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-svg-clip.obj `if test -f 'svg-clip.c'; then $(CYGPATH_W) 'svg-clip.c'; else $(CYGPATH_W) '$(srcdir)/svg-clip.c'; fi` + +cairo_test_suite-svg-surface-source.o: svg-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-svg-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-svg-surface-source.Tpo -c -o cairo_test_suite-svg-surface-source.o `test -f 'svg-surface-source.c' || echo '$(srcdir)/'`svg-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-svg-surface-source.Tpo $(DEPDIR)/cairo_test_suite-svg-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg-surface-source.c' object='cairo_test_suite-svg-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-svg-surface-source.o `test -f 'svg-surface-source.c' || echo '$(srcdir)/'`svg-surface-source.c + +cairo_test_suite-svg-surface-source.obj: svg-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-svg-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-svg-surface-source.Tpo -c -o cairo_test_suite-svg-surface-source.obj `if test -f 'svg-surface-source.c'; then $(CYGPATH_W) 'svg-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/svg-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-svg-surface-source.Tpo $(DEPDIR)/cairo_test_suite-svg-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg-surface-source.c' object='cairo_test_suite-svg-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-svg-surface-source.obj `if test -f 'svg-surface-source.c'; then $(CYGPATH_W) 'svg-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/svg-surface-source.c'; fi` + +cairo_test_suite-xcb-surface-source.o: xcb-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-surface-source.Tpo -c -o cairo_test_suite-xcb-surface-source.o `test -f 'xcb-surface-source.c' || echo '$(srcdir)/'`xcb-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-surface-source.Tpo $(DEPDIR)/cairo_test_suite-xcb-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-surface-source.c' object='cairo_test_suite-xcb-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-surface-source.o `test -f 'xcb-surface-source.c' || echo '$(srcdir)/'`xcb-surface-source.c + +cairo_test_suite-xcb-surface-source.obj: xcb-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xcb-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xcb-surface-source.Tpo -c -o cairo_test_suite-xcb-surface-source.obj `if test -f 'xcb-surface-source.c'; then $(CYGPATH_W) 'xcb-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/xcb-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xcb-surface-source.Tpo $(DEPDIR)/cairo_test_suite-xcb-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xcb-surface-source.c' object='cairo_test_suite-xcb-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xcb-surface-source.obj `if test -f 'xcb-surface-source.c'; then $(CYGPATH_W) 'xcb-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/xcb-surface-source.c'; fi` + +cairo_test_suite-xlib-surface.o: xlib-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xlib-surface.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xlib-surface.Tpo -c -o cairo_test_suite-xlib-surface.o `test -f 'xlib-surface.c' || echo '$(srcdir)/'`xlib-surface.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xlib-surface.Tpo $(DEPDIR)/cairo_test_suite-xlib-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xlib-surface.c' object='cairo_test_suite-xlib-surface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xlib-surface.o `test -f 'xlib-surface.c' || echo '$(srcdir)/'`xlib-surface.c + +cairo_test_suite-xlib-surface.obj: xlib-surface.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xlib-surface.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xlib-surface.Tpo -c -o cairo_test_suite-xlib-surface.obj `if test -f 'xlib-surface.c'; then $(CYGPATH_W) 'xlib-surface.c'; else $(CYGPATH_W) '$(srcdir)/xlib-surface.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xlib-surface.Tpo $(DEPDIR)/cairo_test_suite-xlib-surface.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xlib-surface.c' object='cairo_test_suite-xlib-surface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xlib-surface.obj `if test -f 'xlib-surface.c'; then $(CYGPATH_W) 'xlib-surface.c'; else $(CYGPATH_W) '$(srcdir)/xlib-surface.c'; fi` + +cairo_test_suite-xlib-surface-source.o: xlib-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xlib-surface-source.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-xlib-surface-source.Tpo -c -o cairo_test_suite-xlib-surface-source.o `test -f 'xlib-surface-source.c' || echo '$(srcdir)/'`xlib-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xlib-surface-source.Tpo $(DEPDIR)/cairo_test_suite-xlib-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xlib-surface-source.c' object='cairo_test_suite-xlib-surface-source.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xlib-surface-source.o `test -f 'xlib-surface-source.c' || echo '$(srcdir)/'`xlib-surface-source.c + +cairo_test_suite-xlib-surface-source.obj: xlib-surface-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-xlib-surface-source.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-xlib-surface-source.Tpo -c -o cairo_test_suite-xlib-surface-source.obj `if test -f 'xlib-surface-source.c'; then $(CYGPATH_W) 'xlib-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/xlib-surface-source.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-xlib-surface-source.Tpo $(DEPDIR)/cairo_test_suite-xlib-surface-source.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xlib-surface-source.c' object='cairo_test_suite-xlib-surface-source.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-xlib-surface-source.obj `if test -f 'xlib-surface-source.c'; then $(CYGPATH_W) 'xlib-surface-source.c'; else $(CYGPATH_W) '$(srcdir)/xlib-surface-source.c'; fi` + +cairo_test_suite-get-xrender-format.o: get-xrender-format.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-xrender-format.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-xrender-format.Tpo -c -o cairo_test_suite-get-xrender-format.o `test -f 'get-xrender-format.c' || echo '$(srcdir)/'`get-xrender-format.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-xrender-format.Tpo $(DEPDIR)/cairo_test_suite-get-xrender-format.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-xrender-format.c' object='cairo_test_suite-get-xrender-format.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-xrender-format.o `test -f 'get-xrender-format.c' || echo '$(srcdir)/'`get-xrender-format.c + +cairo_test_suite-get-xrender-format.obj: get-xrender-format.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-get-xrender-format.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-get-xrender-format.Tpo -c -o cairo_test_suite-get-xrender-format.obj `if test -f 'get-xrender-format.c'; then $(CYGPATH_W) 'get-xrender-format.c'; else $(CYGPATH_W) '$(srcdir)/get-xrender-format.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-get-xrender-format.Tpo $(DEPDIR)/cairo_test_suite-get-xrender-format.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get-xrender-format.c' object='cairo_test_suite-get-xrender-format.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-get-xrender-format.obj `if test -f 'get-xrender-format.c'; then $(CYGPATH_W) 'get-xrender-format.c'; else $(CYGPATH_W) '$(srcdir)/get-xrender-format.c'; fi` + +cairo_test_suite-multi-page.o: multi-page.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-multi-page.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-multi-page.Tpo -c -o cairo_test_suite-multi-page.o `test -f 'multi-page.c' || echo '$(srcdir)/'`multi-page.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-multi-page.Tpo $(DEPDIR)/cairo_test_suite-multi-page.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multi-page.c' object='cairo_test_suite-multi-page.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-multi-page.o `test -f 'multi-page.c' || echo '$(srcdir)/'`multi-page.c + +cairo_test_suite-multi-page.obj: multi-page.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-multi-page.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-multi-page.Tpo -c -o cairo_test_suite-multi-page.obj `if test -f 'multi-page.c'; then $(CYGPATH_W) 'multi-page.c'; else $(CYGPATH_W) '$(srcdir)/multi-page.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-multi-page.Tpo $(DEPDIR)/cairo_test_suite-multi-page.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multi-page.c' object='cairo_test_suite-multi-page.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-multi-page.obj `if test -f 'multi-page.c'; then $(CYGPATH_W) 'multi-page.c'; else $(CYGPATH_W) '$(srcdir)/multi-page.c'; fi` + +cairo_test_suite-fallback-resolution.o: fallback-resolution.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fallback-resolution.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-fallback-resolution.Tpo -c -o cairo_test_suite-fallback-resolution.o `test -f 'fallback-resolution.c' || echo '$(srcdir)/'`fallback-resolution.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fallback-resolution.Tpo $(DEPDIR)/cairo_test_suite-fallback-resolution.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fallback-resolution.c' object='cairo_test_suite-fallback-resolution.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fallback-resolution.o `test -f 'fallback-resolution.c' || echo '$(srcdir)/'`fallback-resolution.c + +cairo_test_suite-fallback-resolution.obj: fallback-resolution.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-fallback-resolution.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-fallback-resolution.Tpo -c -o cairo_test_suite-fallback-resolution.obj `if test -f 'fallback-resolution.c'; then $(CYGPATH_W) 'fallback-resolution.c'; else $(CYGPATH_W) '$(srcdir)/fallback-resolution.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-fallback-resolution.Tpo $(DEPDIR)/cairo_test_suite-fallback-resolution.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fallback-resolution.c' object='cairo_test_suite-fallback-resolution.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-fallback-resolution.obj `if test -f 'fallback-resolution.c'; then $(CYGPATH_W) 'fallback-resolution.c'; else $(CYGPATH_W) '$(srcdir)/fallback-resolution.c'; fi` + +cairo_test_suite-cairo-test-constructors.o: cairo-test-constructors.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-cairo-test-constructors.o -MD -MP -MF $(DEPDIR)/cairo_test_suite-cairo-test-constructors.Tpo -c -o cairo_test_suite-cairo-test-constructors.o `test -f 'cairo-test-constructors.c' || echo '$(srcdir)/'`cairo-test-constructors.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-cairo-test-constructors.Tpo $(DEPDIR)/cairo_test_suite-cairo-test-constructors.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test-constructors.c' object='cairo_test_suite-cairo-test-constructors.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-cairo-test-constructors.o `test -f 'cairo-test-constructors.c' || echo '$(srcdir)/'`cairo-test-constructors.c + +cairo_test_suite-cairo-test-constructors.obj: cairo-test-constructors.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -MT cairo_test_suite-cairo-test-constructors.obj -MD -MP -MF $(DEPDIR)/cairo_test_suite-cairo-test-constructors.Tpo -c -o cairo_test_suite-cairo-test-constructors.obj `if test -f 'cairo-test-constructors.c'; then $(CYGPATH_W) 'cairo-test-constructors.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test-constructors.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_suite-cairo-test-constructors.Tpo $(DEPDIR)/cairo_test_suite-cairo-test-constructors.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test-constructors.c' object='cairo_test_suite-cairo-test-constructors.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_suite_CFLAGS) $(CFLAGS) -c -o cairo_test_suite-cairo-test-constructors.obj `if test -f 'cairo-test-constructors.c'; then $(CYGPATH_W) 'cairo-test-constructors.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test-constructors.c'; fi` + +cairo_test_trace-cairo-test-trace.o: cairo-test-trace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -MT cairo_test_trace-cairo-test-trace.o -MD -MP -MF $(DEPDIR)/cairo_test_trace-cairo-test-trace.Tpo -c -o cairo_test_trace-cairo-test-trace.o `test -f 'cairo-test-trace.c' || echo '$(srcdir)/'`cairo-test-trace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_trace-cairo-test-trace.Tpo $(DEPDIR)/cairo_test_trace-cairo-test-trace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test-trace.c' object='cairo_test_trace-cairo-test-trace.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -c -o cairo_test_trace-cairo-test-trace.o `test -f 'cairo-test-trace.c' || echo '$(srcdir)/'`cairo-test-trace.c + +cairo_test_trace-cairo-test-trace.obj: cairo-test-trace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -MT cairo_test_trace-cairo-test-trace.obj -MD -MP -MF $(DEPDIR)/cairo_test_trace-cairo-test-trace.Tpo -c -o cairo_test_trace-cairo-test-trace.obj `if test -f 'cairo-test-trace.c'; then $(CYGPATH_W) 'cairo-test-trace.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test-trace.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_trace-cairo-test-trace.Tpo $(DEPDIR)/cairo_test_trace-cairo-test-trace.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-test-trace.c' object='cairo_test_trace-cairo-test-trace.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -c -o cairo_test_trace-cairo-test-trace.obj `if test -f 'cairo-test-trace.c'; then $(CYGPATH_W) 'cairo-test-trace.c'; else $(CYGPATH_W) '$(srcdir)/cairo-test-trace.c'; fi` + +cairo_test_trace-buffer-diff.o: buffer-diff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -MT cairo_test_trace-buffer-diff.o -MD -MP -MF $(DEPDIR)/cairo_test_trace-buffer-diff.Tpo -c -o cairo_test_trace-buffer-diff.o `test -f 'buffer-diff.c' || echo '$(srcdir)/'`buffer-diff.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_trace-buffer-diff.Tpo $(DEPDIR)/cairo_test_trace-buffer-diff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buffer-diff.c' object='cairo_test_trace-buffer-diff.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -c -o cairo_test_trace-buffer-diff.o `test -f 'buffer-diff.c' || echo '$(srcdir)/'`buffer-diff.c + +cairo_test_trace-buffer-diff.obj: buffer-diff.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -MT cairo_test_trace-buffer-diff.obj -MD -MP -MF $(DEPDIR)/cairo_test_trace-buffer-diff.Tpo -c -o cairo_test_trace-buffer-diff.obj `if test -f 'buffer-diff.c'; then $(CYGPATH_W) 'buffer-diff.c'; else $(CYGPATH_W) '$(srcdir)/buffer-diff.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_test_trace-buffer-diff.Tpo $(DEPDIR)/cairo_test_trace-buffer-diff.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buffer-diff.c' object='cairo_test_trace-buffer-diff.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cairo_test_trace_CFLAGS) $(CFLAGS) -c -o cairo_test_trace-buffer-diff.obj `if test -f 'buffer-diff.c'; then $(CYGPATH_W) 'buffer-diff.c'; else $(CYGPATH_W) '$(srcdir)/buffer-diff.c'; fi` + +pdf2png-pdf2png.o: pdf2png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdf2png_CFLAGS) $(CFLAGS) -MT pdf2png-pdf2png.o -MD -MP -MF $(DEPDIR)/pdf2png-pdf2png.Tpo -c -o pdf2png-pdf2png.o `test -f 'pdf2png.c' || echo '$(srcdir)/'`pdf2png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdf2png-pdf2png.Tpo $(DEPDIR)/pdf2png-pdf2png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf2png.c' object='pdf2png-pdf2png.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdf2png_CFLAGS) $(CFLAGS) -c -o pdf2png-pdf2png.o `test -f 'pdf2png.c' || echo '$(srcdir)/'`pdf2png.c + +pdf2png-pdf2png.obj: pdf2png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdf2png_CFLAGS) $(CFLAGS) -MT pdf2png-pdf2png.obj -MD -MP -MF $(DEPDIR)/pdf2png-pdf2png.Tpo -c -o pdf2png-pdf2png.obj `if test -f 'pdf2png.c'; then $(CYGPATH_W) 'pdf2png.c'; else $(CYGPATH_W) '$(srcdir)/pdf2png.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pdf2png-pdf2png.Tpo $(DEPDIR)/pdf2png-pdf2png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pdf2png.c' object='pdf2png-pdf2png.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pdf2png_CFLAGS) $(CFLAGS) -c -o pdf2png-pdf2png.obj `if test -f 'pdf2png.c'; then $(CYGPATH_W) 'pdf2png.c'; else $(CYGPATH_W) '$(srcdir)/pdf2png.c'; fi` + +ps2png-ps2png.o: ps2png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ps2png_CFLAGS) $(CFLAGS) -MT ps2png-ps2png.o -MD -MP -MF $(DEPDIR)/ps2png-ps2png.Tpo -c -o ps2png-ps2png.o `test -f 'ps2png.c' || echo '$(srcdir)/'`ps2png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ps2png-ps2png.Tpo $(DEPDIR)/ps2png-ps2png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps2png.c' object='ps2png-ps2png.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ps2png_CFLAGS) $(CFLAGS) -c -o ps2png-ps2png.o `test -f 'ps2png.c' || echo '$(srcdir)/'`ps2png.c + +ps2png-ps2png.obj: ps2png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ps2png_CFLAGS) $(CFLAGS) -MT ps2png-ps2png.obj -MD -MP -MF $(DEPDIR)/ps2png-ps2png.Tpo -c -o ps2png-ps2png.obj `if test -f 'ps2png.c'; then $(CYGPATH_W) 'ps2png.c'; else $(CYGPATH_W) '$(srcdir)/ps2png.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ps2png-ps2png.Tpo $(DEPDIR)/ps2png-ps2png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ps2png.c' object='ps2png-ps2png.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ps2png_CFLAGS) $(CFLAGS) -c -o ps2png-ps2png.obj `if test -f 'ps2png.c'; then $(CYGPATH_W) 'ps2png.c'; else $(CYGPATH_W) '$(srcdir)/ps2png.c'; fi` + +svg2png-svg2png.o: svg2png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svg2png_CFLAGS) $(CFLAGS) -MT svg2png-svg2png.o -MD -MP -MF $(DEPDIR)/svg2png-svg2png.Tpo -c -o svg2png-svg2png.o `test -f 'svg2png.c' || echo '$(srcdir)/'`svg2png.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svg2png-svg2png.Tpo $(DEPDIR)/svg2png-svg2png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg2png.c' object='svg2png-svg2png.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svg2png_CFLAGS) $(CFLAGS) -c -o svg2png-svg2png.o `test -f 'svg2png.c' || echo '$(srcdir)/'`svg2png.c + +svg2png-svg2png.obj: svg2png.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svg2png_CFLAGS) $(CFLAGS) -MT svg2png-svg2png.obj -MD -MP -MF $(DEPDIR)/svg2png-svg2png.Tpo -c -o svg2png-svg2png.obj `if test -f 'svg2png.c'; then $(CYGPATH_W) 'svg2png.c'; else $(CYGPATH_W) '$(srcdir)/svg2png.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svg2png-svg2png.Tpo $(DEPDIR)/svg2png-svg2png.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='svg2png.c' object='svg2png-svg2png.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svg2png_CFLAGS) $(CFLAGS) -c -o svg2png-svg2png.obj `if test -f 'svg2png.c'; then $(CYGPATH_W) 'svg2png.c'; else $(CYGPATH_W) '$(srcdir)/svg2png.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +cairo-test-suite.log: cairo-test-suite$(EXEEXT) + @p='cairo-test-suite$(EXEEXT)'; \ + b='cairo-test-suite'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(PROGRAMS) $(SCRIPTS) +installdirs: installdirs-recursive +installdirs-am: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-TESTS check-am clean clean-checkPROGRAMS clean-generic \ + clean-libtool clean-local clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + + +cairo-test-constructors.c: Makefile $(test_sources) make-cairo-test-constructors.sh + (cd $(srcdir) && sh ./make-cairo-test-constructors.sh $(test_sources)) > $@ + +# A target to summarise the failures +check-summary: + @FAILED_TESTS=""; \ + for t in output/*.log; do \ + if grep -e '\' $$t >/dev/null 2>&1; then \ + FAILED_TESTS="$$FAILED_TESTS $$t"; \ + fi; \ + done; \ + if test -n "$$FAILED_TESTS"; then \ + echo "Failed tests:"; \ + surfaces=""; \ + for t in $$FAILED_TESTS; do \ + name="$${t##output/}"; name="$${name%.log}"; \ + echo -n " $$name: "; \ + grep -e '\' $$t | sed -e 's/.*TARGET: \([^ ]*\).*/\1/' | sort | uniq | tr '\n' ' '; \ + echo; \ + for s in `grep -e '\' $$t | sed -e 's/.*TARGET: \([^ ]*\).*/\1/' | sort | uniq`; do \ + ss=`echo $$s | tr '-' '_'`; \ + tt=`echo $$name | tr '-' '_'`; \ + eval $$ss=\""$${!ss} $$tt"\"; \ + echo $$surfaces | grep $$ss >/dev/null || surfaces="$$surfaces $$ss"; \ + done; \ + done; \ + echo -n "Failures per surface - "; \ + first=""; \ + for s in $$surfaces; do \ + ss=`echo $$s | tr '_' '-'`; \ + test -n "$$first" && echo -n ", "; \ + cnt=`echo $${!s} | wc -w`; \ + echo -n "$$ss: $$cnt"; \ + first="false"; \ + done; \ + echo "."; \ + for s in $$surfaces; do \ + ss=`echo $$s | tr '_' '-'`; \ + cnt=`echo $${!s} | wc -w`; \ + echo -n " $$ss [$$cnt]: "; \ + echo $${!s} | tr '_' '-'; \ + done; \ + fi + +$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la + +$(top_builddir)/src/libcairo.la: + cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la + +$(top_builddir)/test/pdiff/libpdiff.la: + cd $(top_builddir)/test/pdiff && $(MAKE) $(AM_MAKEFLAGS) libpdiff.la + +$(top_builddir)/test/pdiff/perceptualdiff: + cd $(top_builddir)/test/pdiff && $(MAKE) $(AM_MAKEFLAGS) perceptualdiff + +$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la + +# This used to be a simple 'echo ${RM} *.ps *.pdf *.svg *.etc', but +# most systems cannot handle all of our clean files together. +# Then it became a fancy find using many GNU extensions, but then the ugly +# reality of portability was raised and it became.... +clean-local: + rm -rf output + -${FIND} . -name '*.log' -print | ${XARGS} ${RM} + -${FIND} . -name '*.[is]' -print | ${XARGS} ${RM} +clean-caches: + -${FIND} output -name '*.fail.*' -print | ${XARGS} ${RM} + -${FIND} output -name '*.pass.*' -print | ${XARGS} ${RM} + +# Re-checks all failed tests, i.e. tests with a log file that has a failure +recheck: + @echo Re-checking failed tests + @$(MAKE) $(AM_MAKEFLAGS) $(recheck) + +# Checks tests. +# Target doesn't fail if tests fail. +test: + @$(MAKE) $(AM_MAKEFLAGS) check + +# Re-checks tests. +# Target doesn't fail if tests fail. +retest: + @CAIRO_TESTS="$(FAILED_TESTS)"; \ + $(MAKE) $(AM_MAKEFLAGS) check + +# Run tests under a tool specified by TOOL. For example, make run TOOL=gdb +run: + $(MAKE) $(AM_MAKEFLAGS) check TESTS_ENVIRONMENT='$(TESTS_ENVIRONMENT) $(top_builddir)/libtool --mode=execute env $(TOOL)' + +# Check tests under valgrind. Saves log to valgrind-log +check-valgrind: + $(MAKE) $(AM_MAKEFLAGS) check TESTS_ENVIRONMENT='$(TESTS_ENVIRONMENT) CAIRO_TEST_MODE="$(MODE),foreground CAIRO_TEST_TIMEOUT=0" $(top_builddir)/libtool --mode=execute valgrind $(VALGRIND_FLAGS)' 2>&1 | tee valgrind-log + +$(NOLOG_TESTS_LOG): + @echo dummy > $@ + +# Identify identical reference images +check-ref-dups: check-refs.sh $(top_builddir)/test/pdiff/perceptualdiff + sh $(srcdir)/check-refs.sh $(top_builddir)/test/pdiff/perceptualdiff + +# Remove identical reference images (DANGEROUS) +clean-ref-dups: check-refs.sh $(top_builddir)/test/pdiff/perceptualdiff + sh $(srcdir)/check-refs.sh | cut -d' ' -f2 | while read f; do git rm "reference/$$f"; done + +results.tar: + @tar cf $@ index.html testtable.js *.log output/*.log; \ + for i in output/*.fail.png ; do \ + testname=$${i#output/} ; \ + testname=$${testname%%.*} ; \ + echo tar uf $@ reference/$${testname}*.ref.png $${i%fail.png}out.png $${i%fail.png}diff.png ; \ + tar uf $@ reference/$${testname}*.ref.png $${i%fail.png}out.png $${i%fail.png}diff.png ; \ + done + +results.tar.gz: results.tar + gzip -c $< > $@ + +release-verify-sane-tests: + +.PHONY: check-valgrind test recheck retest check-ref-dups release-verify-sane-tests + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/Makefile.sources b/test/Makefile.sources new file mode 100644 index 000000000..e4fedb404 --- /dev/null +++ b/test/Makefile.sources @@ -0,0 +1,450 @@ +test_sources = \ + a1-bug.c \ + a1-clip.c \ + a1-fill.c \ + a1-image-sample.c \ + a1-mask.c \ + a1-mask-sample.c \ + a1-sample.c \ + a1-traps-sample.c \ + a1-rasterisation.c \ + a8-clear.c \ + a8-mask.c \ + aliasing.c \ + alpha-similar.c \ + arc-direction.c \ + arc-infinite-loop.c \ + arc-looping-dash.c \ + api-special-cases.c \ + big-line.c \ + big-empty-box.c \ + big-empty-triangle.c \ + big-little-box.c \ + big-little-triangle.c \ + bug-spline.c \ + big-trap.c \ + bilevel-image.c \ + bug-40410.c \ + bug-51910.c \ + bug-84115.c \ + bug-bo-rectangular.c \ + bug-bo-collins.c \ + bug-bo-ricotz.c \ + bug-source-cu.c \ + bug-extents.c \ + bug-seams.c \ + caps.c \ + checkerboard.c \ + caps-joins.c \ + caps-joins-alpha.c \ + caps-joins-curve.c \ + caps-tails-curve.c \ + caps-sub-paths.c \ + clear.c \ + clear-source.c \ + clip-all.c \ + clip-complex-bug61592.c \ + clip-complex-shape.c \ + clip-contexts.c \ + clip-disjoint.c \ + clip-disjoint-hatching.c \ + clip-disjoint-quad.c \ + clip-device-offset.c \ + clip-double-free.c \ + clip-draw-unbounded.c \ + clip-empty.c \ + clip-empty-group.c \ + clip-empty-save.c \ + clip-fill.c \ + clip-fill-no-op.c \ + clip-fill-rule.c \ + clip-fill-rule-pixel-aligned.c \ + clip-group-shapes.c \ + clip-image.c \ + clip-intersect.c \ + clip-mixed-antialias.c \ + clip-nesting.c \ + clip-operator.c \ + clip-push-group.c \ + clip-polygons.c \ + clip-rectilinear.c \ + clip-shape.c \ + clip-stroke.c \ + clip-stroke-no-op.c \ + clip-text.c \ + clip-twice.c \ + clip-twice-rectangle.c \ + clip-unbounded.c \ + clip-zero.c \ + clipped-group.c \ + clipped-surface.c \ + close-path.c \ + close-path-current-point.c \ + composite-integer-translate-source.c \ + composite-integer-translate-over.c \ + composite-integer-translate-over-repeat.c \ + copy-disjoint.c \ + copy-path.c \ + coverage.c \ + create-for-stream.c \ + create-from-png.c \ + create-from-png-stream.c \ + culled-glyphs.c \ + curve-to-as-line-to.c \ + dash-caps-joins.c \ + dash-curve.c \ + dash-infinite-loop.c \ + dash-no-dash.c \ + dash-offset.c \ + dash-offset-negative.c \ + dash-scale.c \ + dash-state.c \ + dash-zero-length.c \ + degenerate-arc.c \ + degenerate-arcs.c \ + degenerate-curve-to.c \ + degenerate-dash.c \ + degenerate-linear-gradient.c \ + degenerate-path.c \ + degenerate-pen.c \ + degenerate-radial-gradient.c \ + degenerate-rel-curve-to.c \ + degenerate-solid-dash.c \ + drunkard-tails.c \ + device-offset.c \ + device-offset-fractional.c \ + device-offset-positive.c \ + device-offset-scale.c \ + error-setters.c \ + extend-pad.c \ + extend-pad-border.c \ + extend-pad-similar.c \ + extend-reflect.c \ + extend-reflect-similar.c \ + extend-repeat.c \ + extend-repeat-similar.c \ + extended-blend.c \ + fallback.c \ + fill-alpha.c \ + fill-alpha-pattern.c \ + fill-and-stroke.c \ + fill-and-stroke-alpha.c \ + fill-and-stroke-alpha-add.c \ + fill-degenerate-sort-order.c \ + fill-disjoint.c \ + fill-empty.c \ + fill-image.c \ + fill-missed-stop.c \ + fill-rule.c \ + filter-bilinear-extents.c \ + filter-nearest-offset.c \ + filter-nearest-transformed.c \ + finer-grained-fallbacks.c \ + font-face-get-type.c \ + font-matrix-translation.c \ + font-options.c \ + glyph-cache-pressure.c \ + get-and-set.c \ + get-clip.c \ + get-group-target.c \ + get-path-extents.c \ + gradient-alpha.c \ + gradient-constant-alpha.c \ + gradient-zero-stops.c \ + gradient-zero-stops-mask.c \ + group-clip.c \ + group-paint.c \ + group-state.c \ + group-unaligned.c \ + half-coverage.c \ + halo.c \ + hatchings.c \ + horizontal-clip.c \ + huge-linear.c \ + huge-radial.c \ + image-surface-source.c \ + image-bug-710072.c \ + implicit-close.c \ + infinite-join.c \ + in-fill-empty-trapezoid.c \ + in-fill-trapezoid.c \ + invalid-matrix.c \ + inverse-text.c \ + inverted-clip.c \ + joins.c \ + joins-loop.c \ + joins-star.c \ + joins-retrace.c \ + large-clip.c \ + large-font.c \ + large-source.c \ + large-source-roi.c \ + large-twin-antialias-mixed.c \ + leaky-dash.c \ + leaky-dashed-rectangle.c \ + leaky-dashed-stroke.c \ + leaky-polygon.c \ + line-width.c \ + line-width-large-overlap.c \ + line-width-overlap.c \ + line-width-scale.c \ + line-width-tolerance.c \ + line-width-zero.c \ + linear-gradient.c \ + linear-gradient-extend.c \ + linear-gradient-large.c \ + linear-gradient-one-stop.c \ + linear-gradient-reflect.c \ + linear-gradient-subset.c \ + linear-step-function.c \ + linear-uniform.c \ + long-dashed-lines.c \ + long-lines.c \ + map-to-image.c \ + mask.c \ + mask-alpha.c \ + mask-ctm.c \ + mask-glyphs.c \ + mask-surface-ctm.c \ + mask-transformed-image.c \ + mask-transformed-similar.c \ + mesh-pattern.c \ + mesh-pattern-accuracy.c \ + mesh-pattern-conical.c \ + mesh-pattern-control-points.c \ + mesh-pattern-fold.c \ + mesh-pattern-overlap.c \ + mesh-pattern-transformed.c \ + mime-data.c \ + mime-surface-api.c \ + miter-precision.c \ + move-to-show-surface.c \ + negative-stride-image.c \ + new-sub-path.c \ + nil-surface.c \ + operator.c \ + operator-alpha.c \ + operator-alpha-alpha.c \ + operator-clear.c \ + operator-source.c \ + outline-tolerance.c \ + over-above-source.c \ + over-around-source.c \ + over-below-source.c \ + over-between-source.c \ + overlapping-boxes.c \ + overlapping-glyphs.c \ + overlapping-dash-caps.c \ + paint.c \ + paint-clip-fill.c \ + paint-repeat.c \ + paint-source-alpha.c \ + paint-with-alpha.c \ + paint-with-alpha-group-clip.c \ + partial-clip-text.c \ + partial-coverage.c \ + pass-through.c \ + path-append.c \ + path-currentpoint.c \ + path-stroke-twice.c \ + path-precision.c \ + pattern-get-type.c \ + pattern-getters.c \ + pdf-isolated-group.c \ + pixman-downscale.c \ + pixman-rotate.c \ + png.c \ + push-group.c \ + push-group-color.c \ + push-group-path-offset.c \ + radial-gradient.c \ + radial-gradient-extend.c \ + radial-outer-focus.c \ + random-clips.c \ + random-intersections-eo.c \ + random-intersections-nonzero.c \ + random-intersections-curves-eo.c \ + random-intersections-curves-nz.c \ + raster-source.c \ + record.c \ + record1414x.c \ + record2x.c \ + record90.c \ + recordflip.c \ + record-extend.c \ + record-mesh.c \ + recording-surface-pattern.c \ + recording-surface-extend.c \ + rectangle-rounding-error.c \ + rectilinear-fill.c \ + rectilinear-grid.c \ + rectilinear-miter-limit.c \ + rectilinear-dash.c \ + rectilinear-dash-scale.c \ + rectilinear-stroke.c \ + reflected-stroke.c \ + rel-path.c \ + rgb24-ignore-alpha.c \ + rotate-image-surface-paint.c \ + rotate-stroke-box.c \ + rotated-clip.c \ + rounded-rectangle-fill.c \ + rounded-rectangle-stroke.c \ + sample.c \ + scale-down-source-surface-paint.c \ + scale-offset-image.c \ + scale-offset-similar.c \ + scale-source-surface-paint.c \ + scaled-font-zero-matrix.c \ + stroke-ctm-caps.c \ + stroke-clipped.c \ + stroke-image.c \ + stroke-open-box.c \ + select-font-face.c \ + select-font-no-show-text.c \ + self-copy.c \ + self-copy-overlap.c \ + self-intersecting.c \ + set-source.c \ + show-glyphs-advance.c \ + show-glyphs-many.c \ + show-text-current-point.c \ + shape-general-convex.c \ + shape-sierpinski.c \ + simple.c \ + skew-extreme.c \ + smask.c \ + smask-fill.c \ + smask-image-mask.c \ + smask-mask.c \ + smask-paint.c \ + smask-stroke.c \ + smask-text.c \ + solid-pattern-cache-stress.c \ + source-clip.c \ + source-clip-scale.c \ + source-surface-scale-paint.c \ + spline-decomposition.c \ + stride-12-image.c \ + stroke-pattern.c \ + subsurface.c \ + subsurface-image-repeat.c \ + subsurface-repeat.c \ + subsurface-reflect.c \ + subsurface-pad.c \ + subsurface-modify-child.c \ + subsurface-modify-parent.c \ + subsurface-outside-target.c \ + subsurface-scale.c \ + subsurface-similar-repeat.c \ + surface-finish-twice.c \ + surface-pattern.c \ + surface-pattern-big-scale-down.c \ + surface-pattern-operator.c \ + surface-pattern-scale-down.c \ + surface-pattern-scale-down-extend.c \ + surface-pattern-scale-up.c \ + text-antialias.c \ + text-antialias-subpixel.c \ + text-cache-crash.c \ + text-glyph-range.c \ + text-pattern.c \ + text-rotate.c \ + text-transform.c \ + text-zero-len.c \ + tighten-bounds.c \ + tiger.c \ + toy-font-face.c \ + transforms.c \ + translate-show-surface.c \ + trap-clip.c \ + twin.c \ + twin-antialias-gray.c \ + twin-antialias-mixed.c \ + twin-antialias-none.c \ + twin-antialias-subpixel.c \ + unaligned-box.c \ + unantialiased-shapes.c \ + unbounded-operator.c \ + unclosed-strokes.c \ + user-data.c \ + user-font.c \ + user-font-mask.c \ + user-font-proxy.c \ + user-font-rescale.c \ + world-map.c \ + white-in-noop.c \ + xcb-huge-image-shm.c \ + xcb-huge-subimage.c \ + xcb-stress-cache.c \ + xcb-snapshot-assert.c \ + xcomposite-projection.c \ + xlib-expose-event.c \ + zero-alpha.c \ + zero-mask.c + +pthread_test_sources = \ + pthread-same-source.c \ + pthread-show-text.c \ + pthread-similar.c \ + $(NULL) + +ft_font_test_sources = \ + bitmap-font.c \ + ft-font-create-for-ft-face.c \ + ft-show-glyphs-positioning.c \ + ft-show-glyphs-table.c \ + ft-text-vertical-layout-type1.c \ + ft-text-vertical-layout-type3.c \ + ft-text-antialias-none.c + +gl_surface_test_sources = \ + gl-device-release.c \ + gl-oversized-surface.c \ + gl-surface-source.c + +egl_surface_test_sources = \ + egl-oversized-surface.c \ + egl-surface-source.c + +quartz_surface_test_sources = quartz-surface-source.c + +pdf_surface_test_sources = \ + pdf-features.c \ + pdf-mime-data.c \ + pdf-surface-source.c + +ps_surface_test_sources = \ + ps-eps.c \ + ps-features.c \ + ps-surface-source.c + +svg_surface_test_sources = \ + svg-surface.c \ + svg-clip.c \ + svg-surface-source.c + +xcb_surface_test_sources = \ + xcb-surface-source.c + +xlib_surface_test_sources = \ + xlib-surface.c \ + xlib-surface-source.c + +xlib_xrender_surface_test_sources = get-xrender-format.c + +multi_page_surface_test_sources = multi-page.c + +fallback_resolution_test_sources = fallback-resolution.c + +cairo_test_suite_headers = \ + buffer-diff.h \ + cairo-test.h \ + cairo-test-private.h \ + world-map.h \ + $(NULL) + +cairo_test_suite_sources = \ + buffer-diff.c \ + cairo-test.c \ + cairo-test-runner.c diff --git a/test/Makefile.win32 b/test/Makefile.win32 new file mode 100644 index 000000000..ba8ea5b86 --- /dev/null +++ b/test/Makefile.win32 @@ -0,0 +1,55 @@ +top_srcdir = .. +include $(top_srcdir)/build/Makefile.win32.common +include $(top_srcdir)/test/Makefile.sources + +CFLAGS += \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/util/cairo-script/ \ + -I./pdiff \ + $(NULL) + +TEST_LIBS = \ + ./pdiff/$(CFG)/pdiff.lib \ + $(top_builddir)/boilerplate/$(CFG)/boiler.lib \ + $(top_builddir)/src/$(CFG)/cairo-static.lib \ + $(NULL) + +all: inform $(CFG)/cairo-test-suite.exe + +cairo-test-constructors.c: Makefile.sources Makefile.win32 $(test_sources) make-cairo-test-constructors.sh + sh ./make-cairo-test-constructors.sh $(test_sources) > $@ + +SOURCES = $(cairo_test_suite_sources) $(test_sources) cairo-test-constructors.c + +OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(SOURCES)) + +ANY2PPM_OBJS = \ + $(CFG)/any2ppm-static.obj \ + $(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib \ + $(top_builddir)/src/$(CFG)/cairo-static.lib \ + $(NULL) + +$(CFG)/cairo-test-suite.exe: $(OBJECTS) $(TEST_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(OBJECTS) $(TEST_LIBS) $(CAIRO_LIBS) + +$(CFG)/any2ppm.exe: $(ANY2PPM_OBJS) + $(LD) $(CAIRO_LDFLAGS) -OUT:$@ $^ $(CAIRO_LIBS) + +./pdiff/$(CFG)/pdiff.lib: + $(MAKE) -C pdiff -f Makefile.win32 + +$(top_builddir)/src/$(CFG)/cairo-static.lib: + $(MAKE) -C $(top_srcdir)/src -f Makefile.win32 + +$(top_builddir)/boilerplate/$(CFG)/boiler.lib: + $(MAKE) -C $(top_srcdir)/boilerplate -f Makefile.win32 + +$(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib: + $(MAKE) -C $(top_srcdir)/util/cairo-script -f Makefile.win32 + +.PHONY: check test + +check: inform $(CFG)/any2ppm.exe $(CFG)/cairo-test-suite.exe + @ANY2PPM=$(CFG)\\any2ppm.exe $(CFG)/cairo-test-suite.exe + +test: inform check diff --git a/test/README b/test/README new file mode 100644 index 000000000..f1433944b --- /dev/null +++ b/test/README @@ -0,0 +1,319 @@ +Regression test suite for cairo. + +How to use cairo's test suite +============================= +Using this test should be as simple as running: + + make test + +assuming that the cairo distribution in the directory above has been +configured and built. The test suite here goes through some effort to +run against the locally compiled library rather than any installed +version, but those efforts may fall short depending on the level of your +libtool madness. + +The results of the test suite run are summarized in an index.html +file, which, when viewed in a web browser makes it quite easy to +visually see any failed renderings alongside the corresponding +reference image, (and a diff image as well). + +The test suite needs to be run before any code is committed and before +any release. See below for hints and rules governing the use of the suite. + +The test suite is built as a single binary, which allows you to choose +individual or categories of tests to run. For example, if you want to +run all text related tests you can use: + ./cairo-test-suite text +Or if you want to check the current status of known failures: + ./cairo-test-suite XFAIL +Or to run a subset of tests, use the -k option to run only the tests +that include the given keyword: + ./cairo-test-suite -k downscale +The binary also permits controlling which backend is used via the +CAIRO_TEST_TARGET environment variable, so for instance: + CAIRO_TEST_TARGET=gl ./cairo-test-suite -k blur +This binary should be backwards-compatible with all library versions, +allowing you to compare current versus past behaviour for any test. + +Tailoring tests running +----------------------- +There are some mechanisms to limit the tests run during "make test". +These come very handy when doing development, but should not be used +to circumvent the "pass" requirements listed below. + +make's TARGETS environment variable can be used to limit the backends when +running the tests. It should contain a (space-, comma-separated) list of +backends. CAIRO_TESTS environment variable, which is a comma-, space-seperated +lists, can be used to limit the tests run. +For example: + + CAIRO_TESTS="zero-alpha" make test TARGETS=image,ps + +make's FORMAT variable can also be used to limit the content formats when +running the tests. It should contain a (space-, comma-separated) list of +content formats to test. +For example: + + CAIRO_TESTS="zero-alpha" make test TARGETS=image,ps FORMAT="rgb,rgba" + +Another very handy mechanism when trying to fix bugs is: + + make retest + +This will re-run the test suite, but only on tests that failed on the +last run. So this is a much faster way of checking if changes actually +fix bugs rather than running the entire test suite again. + +The test suite first compares the output from the current run against the +previous in order to skip more expensive image comparisons . If you think +this is interfering with the results, you can clear the cached results using: + + make clean-caches + +Running tests under modified environments or tools +------------------------------------------------- +To run tests under a tool like gdb, one can use the run target and +the TOOL variable. For example: + + CAIRO_TESTS=user-font make run TOOL=gdb TARGETS=pdf + +If you want to run under valgrind, there is a specific target for that +that also sets a bunch of useful valgrind options. Try: + + CAIRO_TESTS=user-font make check-valgrind + +You can run tests under a modified environment you can use the ENV +make variable. However, that environment will also affect the libtool +wrapper of the tests. To only affect the actual test binaries, pass +such environment as TOOL: + + CAIRO_TESTS=user-font make run TOOL="LD_PRELOAD=/path/to/something.so" + +Getting the elusive zero failures +--------------------------------- +It's generally been very difficult to achieve a test run with zero +failures. The difficulties stem from the various versions of the many +libraries that the test suite depends on, (it depends on a lot more +than cairo itself), as well as fonts and other system-specific +settings. If your system differs significantly from the system on +which the reference images were generated, then you will likely see +the test suite reporting "failures", (even if cairo is working just +fine). + +We are constantly working to reduce the number of variables that need +to be tweaked to get a clean run, (for example, by bundling fonts with +the test suite itself), and also working to more carefully document +the software configuration used to generate the reference images. + +Here are some of the relevant details: + + * Your system must have a copy of the DejaVu font, the sha1sum of + the version used are listed in [...]. These are + "DejaVu Sans" (DejaVuSans.ttf) [1cd336329f45f241002ded61893d91e3acd04436]; + "DejaVu Sans Mono" (DejaVuSansMono.ttf) [0458c0f0fb57f3eb8ced62f26fe7c5ed4e6a9a68]; + "DejaVu Serif" (DejaVuSerif.ttf) [93502d0d0445d1fe1c9f51e51b3e0169266346ce]; + [the DejaVu fonts can be installed from the ttf-dejavu 2.33-2 Debian package] + and also + "Nimbus Sans L" (n019003l.pfb) + [which can be found in the gsfonts Debian package]. + + * Currently, you must be using a build of cairo using freetype + (cairo-ft) as the default font backend. Otherwise all tests + involving text are likely to fail. + + * To test the pdf backend, you will want the very latest version of + poppler as made available via git: + + git clone git://anongit.freedesktop.org/git/poppler/poppler + + As of this writing, no released version of poppler contains all + the fixes you will need to avoid false negatives from the test + suite. + + * To test the ps backend, you will need ghostscript version 9.04. + + * Testing the xlib backend is problematic since many X server + drivers have bugs that are exercised by the test suite. (Or, if + not actual bugs, differ slightly in their output in such a way + that the test suite will report errors.) This can be quite handy + if you want to debug an X server driver, but since most people + don't want to do that, another option is to run against a headless + X server that uses only software for all rendering. One such X + server is Xvfb which can be started like this: + + Xvfb -screen 0 1680x1024x24 -ac -nolisten tcp :2 + + after which the test suite can be run against it like so: + + DISPLAY=:2 make test + + We have been using Xvfb for testing cairo releases and ensuring + that all tests behave as expected with this X server. + +What if I can't make my system match? +------------------------------------- +For one reason or another, you may be unable to get a clean run of the +test suite even if cairo is working properly, (for example, you might +be on a system without freetype). In this case, it's still useful to +be able to determine if code changes you make to cairo result in any +regressions to the test suite. But it's hard to notice regressions if +there are many failures both before and after your changes. + +For this scenario, you can capture the output of a run of the test +suite before your changes, and then use the CAIRO_REF_DIR environment +variable to use that output as the reference images for a run after +your changes. The process looks like this: + + # Before code change there may be failures we don't care about + make test + + # Let's save those output images + mkdir /some/directory/ + cp -r test/output /some/directory/ + + # hack, hack, hack + + # Now to see if nothing changed: + CAIRO_REF_DIR=/some/directory/ make test + +Best practices for cairo developers +=================================== +If we all follow the guidelines below, then both the test suite and +cairo itself will stay much healthier, and we'll all have a lot more +fun hacking on cairo. + +Before committing +----------------- +All tests should return a result of PASS or XFAIL. The XFAIL results +indicate known bugs. The final message should be one of the following: + + All XX tests behaved as expected (YY expected failures) + All XX tests passed + +If any tests have a status of FAIL, then the new code has caused a +regression error which should be fixed before the code is committed. + +When a new bug is found +----------------------- +A new test case should be added by imitating the style of an existing +test. This means adding the following files: + + new-bug.c + reference/new-bug.ref.png + reference/new-bug.xfail.png + +Where new-bug.c is a minimal program to demonstrate the bug, following +the style of existing tests. The new-bug.ref.png image should contain +the desired result of new-bug.c if the bug were fixed while +new-bug.xfail.png contains the current results of the test. + +Makefile.sources should be edited by adding new-bug.c to test_sources. +And last but not least, don't forget to "git add" the new files. + +When a new feature is added +--------------------------- +It's important for the regression suite to keep pace with development +of the library. So a new test should be added for each new feature. +The work involved is similar the work described above for new bugs. +The only distinction is that the test is expected to pass so it +should not need a new-bug.xfail.png file. + +While working on a test +----------------------- +Before a bugfix or feature is ready, it may be useful to compare +output from different builds. For convenience, you can set +CAIRO_REF_DIR to point at a previous test directory, relative +to the current test directory, and any previous output will be +used by preference as reference images. + +When a bug is fixed +------------------- +The fix should be verified by running the test suite which should +result in an "unexpected pass" for the test of interest. Rejoice as +appropriate, then remove the relevant xfail.png file from git. + +Before releasing +---------------- +All tests should return a result of PASS for all supported (those enabled by +default) backends, meaning all known bugs are fixed, resulting in the happy +message: + + All XX tests passed + +Some notes on limitations in poppler +==================================== +One of the difficulties of our current test infrastructure is that we +rely on external tools to convert cairo's vector output (PDF, +PostScript, and SVG), into an image that can be used for the image +comparison. This means that any bugs in that conversion tool will +result in false negatives in the test suite. + +We've identified several such bugs in the poppler library which is +used to convert PDF to an image. This is particularly discouraging +because 1) poppler is free software that will be used by *many* cairo +users, and 2) poppler calls into cairo for its rendering so it should +be able to do a 100% faithful conversion. + +So we have an interest in ensuring that these poppler bugs get fixed +sooner rather than later. As such, we're trying to be good citizens by +reporting all such poppler bugs that we identify to the poppler +bugzilla. Here's a tracking bug explaining the situation: + + Poppler does not yet handle everything in the cairo test suite + https://bugs.freedesktop.org/show_bug.cgi?id=12143 + +Here's the rule: If a cairo-pdf test reports a failure, but viewing +the resulting PDF file with acroread suggests that the PDF itself is +correct, then there's likely a bug in poppler. In this case, we can +simply report the poppler bug, (making it block 12143 above), post the +PDF result from the test suite, and list the bug in this file. Once +we've done this, we can capture poppler's buggy output as a +pdf-specific reference image (as reference/*.xfail.png) so that the +test suite will regard the test as passing, (and we'll ensure there +is no regression). + +Once the poppler bug gets fixed, the test suite will start reporting a +false negative again, and this will be easy to fix by simply removing +the pdf-specific reference image. + +Here are the reported poppler bugs and the tests they affect: + +Poppler doesn't correctly handle gradients with transparency +https://bugs.freedesktop.org/show_bug.cgi?id=12144 +-------------------------------------------------- +fill-alpha-pattern +gradient-alpha +gradient-constant-alpha +linear-gradient +linear-gradient-reflect +radial-gradient +trap-clip + +Poppler should paint images with CAIRO_EXTEND_PAD +https://bugs.freedesktop.org/show_bug.cgi?id=14578 +-------------------------------------------------- +paint-source-alpha +paint-with-alpha +rotate-image-surface-paint +scale-source-surface-paint + +Incorrect clipping of group object (regression?) +https://bugs.freedesktop.org/show_bug.cgi?id=14580 +-------------------------------------------------- +push-group + +spurious horizontal stripes in color gradients +https://bugs.freedesktop.org/show_bug.cgi?id=10942 +-------------------------------------------------- +smask +smask-fill +smask-image-mask +smask-mask +smask-paint +smask-stroke +smask-text + +Ghostscript does not correctly render small miters +http://bugs.ghostscript.com/show_bug.cgi?id=690098 +-------------------------------------------------- +miter-precision diff --git a/test/a1-bug.c b/test/a1-bug.c new file mode 100644 index 000000000..8e00d40e3 --- /dev/null +++ b/test/a1-bug.c @@ -0,0 +1,61 @@ +/* + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + static const struct point { + double x; + double y; + } xy[] = { + { 627.016212, 221.749777 }, + { 756.120787, 221.749777 }, + { 756.120787, 557.602766 }, + { 626.952721, 557.602766 }, + { 626.548456, 493.315729 }, + }; + unsigned int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + for (i = 0; i < ARRAY_LENGTH (xy); i++) + cairo_line_to (cr, xy[i].x, xy[i].y); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_bug, + "Check the fidelity of the rasterisation.", + "a1, raster", /* keywords */ + "target=raster", /* requirements */ + 1000, 800, + NULL, draw) diff --git a/test/a1-clip.c b/test/a1-clip.c new file mode 100644 index 000000000..0e84cd39b --- /dev/null +++ b/test/a1-clip.c @@ -0,0 +1,175 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define POINTS 10 +#define STEP (1.0 / POINTS) +#define PAD 1 +#define WIDTH (PAD + POINTS * 2 + PAD) +#define HEIGHT (WIDTH) + +static cairo_test_status_t +paint (cairo_t *cr, int width, int height) +{ + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* Draw in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, PAD, PAD); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (i = 0; i < POINTS; i++) + for (j = 0; j < POINTS; j++) { + cairo_save (cr); + cairo_rectangle (cr, 2 * i + i * STEP, 2 * j + j * STEP, 1, 1); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +fill_equal (cairo_t *cr, int width, int height) +{ + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* Draw in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, PAD, PAD); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (i = 0; i < POINTS; i++) + for (j = 0; j < POINTS; j++) { + cairo_save (cr); + cairo_rectangle (cr, 2 * i + i * STEP, 2 * j + j * STEP, 1, 1); + cairo_clip_preserve (cr); + cairo_fill (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +fill (cairo_t *cr, int width, int height) +{ + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* Draw in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, PAD, PAD); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (i = 0; i < POINTS; i++) + for (j = 0; j < POINTS; j++) { + cairo_save (cr); + cairo_rectangle (cr, 2 * i + i * STEP, 2 * j + j * STEP, 1, 1); + cairo_clip (cr); + cairo_rectangle (cr, 2 * i, 2 * j, 2, 2); + cairo_fill (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +stroke (cairo_t *cr, int width, int height) +{ + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* Draw in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, PAD, PAD); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_set_line_width (cr, 2); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + + for (i = 0; i < POINTS; i++) + for (j = 0; j < POINTS; j++) { + cairo_save (cr); + cairo_rectangle (cr, 2 * i + i * STEP, 2 * j + j * STEP, 1, 1); + cairo_clip (cr); + cairo_move_to (cr, 2 * i, 2 * j + 1); + cairo_line_to (cr, 2 * i + 2, 2 * j + 1); + cairo_stroke (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_clip_paint, + "Test sample position when drawing trapezoids with ANTIALIAS_NONE", + "alpha, clip", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, paint) + +CAIRO_TEST (a1_clip_fill, + "Test sample position when drawing trapezoids with ANTIALIAS_NONE", + "alpha, clip", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, fill) + +CAIRO_TEST (a1_clip_fill_equal, + "Test sample position when drawing trapezoids with ANTIALIAS_NONE", + "alpha, clip", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, fill_equal) + +CAIRO_TEST (a1_clip_stroke, + "Test sample position when drawing trapezoids with ANTIALIAS_NONE", + "alpha, clip", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, stroke) diff --git a/test/a1-fill.c b/test/a1-fill.c new file mode 100644 index 000000000..8c8b8c8ae --- /dev/null +++ b/test/a1-fill.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Exercise https://bugs.freedesktop.org/show_bug.cgi?id=31604 */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *a1; + cairo_t *cr2; + + a1 = cairo_image_surface_create (CAIRO_FORMAT_A1, 100, 100); + cr2 = cairo_create (a1); + cairo_surface_destroy (a1); + + cairo_set_operator (cr2, CAIRO_OPERATOR_SOURCE); + cairo_rectangle (cr2, 10, 10, 80, 80); + cairo_set_source_rgb (cr2, 1, 1, 1); + cairo_fill (cr2); + cairo_rectangle (cr2, 20, 20, 60, 60); + cairo_set_source_rgb (cr2, 0, 0, 0); + cairo_fill (cr2); + + a1 = cairo_surface_reference (cairo_get_target (cr2)); + cairo_destroy (cr2); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_mask_surface (cr, a1, 0, 0); + cairo_surface_destroy (a1); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_fill, + "Test filling of an a1-surface and use as mask", + "a1, alpha, fill, mask", /* keywords */ + "target=raster", /* requirements */ + 100, 100, + NULL, draw) diff --git a/test/a1-image-sample.c b/test/a1-image-sample.c new file mode 100644 index 000000000..3c349af81 --- /dev/null +++ b/test/a1-image-sample.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define POINTS 10 +#define STEP (1.0 / POINTS) +#define PAD 1 +#define WIDTH (PAD + POINTS * 2 + PAD) +#define HEIGHT (WIDTH) + +/* A single, black pixel */ +static const uint32_t black_pixel = 0xff000000; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i, j; + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) &black_pixel, + CAIRO_FORMAT_ARGB32, + 1, 1, 4); + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, PAD, PAD); + + for (i = 0; i < POINTS; i++) + for (j = 0; j < POINTS; j++) { + cairo_set_source_surface (cr, surface, + 2 * i + i * STEP, 2 * j + j * STEP); + cairo_pattern_set_filter (cairo_get_source (cr), + CAIRO_FILTER_NEAREST); + cairo_paint (cr); + } + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_image_sample, + "Test sample position when drawing images with FILTER_NEAREST", + "image, alpha", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/a1-mask-sample.c b/test/a1-mask-sample.c new file mode 100644 index 000000000..4214e8f40 --- /dev/null +++ b/test/a1-mask-sample.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * Copyright © 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define POINTS 10 +#define STEP (1.0 / POINTS) +#define PAD 1 +#define WIDTH (PAD + POINTS * 2 + PAD) +#define HEIGHT (WIDTH) + +/* A single, opaque pixel */ +static const uint32_t black_pixel = 0xffffffff; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_pattern_t *mask; + int i, j; + + surface = cairo_image_surface_create_for_data ((unsigned char *) &black_pixel, + CAIRO_FORMAT_A8, + 1, 1, 4); + mask = cairo_pattern_create_for_surface (surface); + cairo_pattern_set_filter (mask, CAIRO_FILTER_NEAREST); + cairo_surface_destroy (surface); + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, PAD, PAD); + + cairo_set_source_rgb (cr, 0, 0, 0); + for (i = 0; i < POINTS; i++) { + for (j = 0; j < POINTS; j++) { + cairo_matrix_t m; + + cairo_matrix_init_translate (&m, + -(2 * i + i * STEP), + -(2 * j + j * STEP)); + cairo_pattern_set_matrix (mask, &m); + cairo_mask (cr, mask); + } + } + + cairo_pattern_destroy (mask); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_mask_sample, + "Test sample position when masking with FILTER_NEAREST", + "image, alpha", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/a1-mask.c b/test/a1-mask.c new file mode 100644 index 000000000..c52aa9dd9 --- /dev/null +++ b/test/a1-mask.c @@ -0,0 +1,202 @@ +/* + * Copyright © Jeff Muizelaar + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF MUIZELAAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Jeff Muizelaar + * Carl Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define MASK_WIDTH 10 +#define MASK_HEIGHT 8 + +#ifdef WORDS_BIGENDIAN +#define MASK 0x28, 0x55 +#else +#define MASK 0x14, 0xAA +#endif +static unsigned char mask[(MASK_WIDTH + 7) / 8 * MASK_HEIGHT] = { + MASK, + MASK, + MASK, + MASK, + MASK, + MASK, + MASK, + MASK, +}; + +static cairo_test_status_t +check_status (const cairo_test_context_t *ctx, + cairo_status_t status, + cairo_status_t expected) +{ + if (status == expected) + return CAIRO_TEST_SUCCESS; + + cairo_test_log (ctx, + "Error: Expected status value %d (%s), received %d (%s)\n", + expected, + cairo_status_to_string (expected), + status, + cairo_status_to_string (status)); + return CAIRO_TEST_FAILURE; +} + +static cairo_test_status_t +test_surface_with_width_and_stride (const cairo_test_context_t *ctx, + int width, int stride, + cairo_status_t expected) +{ + cairo_test_status_t status; + cairo_surface_t *surface; + cairo_t *cr; + int len; + unsigned char *data; + + cairo_test_log (ctx, + "Creating surface with width %d and stride %d\n", + width, stride); + + len = stride; + if (len < 0) + len = -len; + data = xmalloc (len); + + surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_A1, + width, 1, stride); + cr = cairo_create (surface); + + cairo_paint (cr); + + status = check_status (ctx, cairo_surface_status (surface), expected); + if (status) + goto BAIL; + + status = check_status (ctx, cairo_status (cr), expected); + if (status) + goto BAIL; + + BAIL: + cairo_destroy (cr); + cairo_surface_destroy (surface); + free (data); + return status; +} + +static cairo_test_status_t +draw (cairo_t *cr, int dst_width, int dst_height) +{ + unsigned char *mask_aligned; + cairo_surface_t *surface; + + surface = cairo_image_surface_create (CAIRO_FORMAT_A1, + MASK_WIDTH, + MASK_HEIGHT); + + mask_aligned = cairo_image_surface_get_data (surface); + if (mask_aligned != NULL) { + int stride = cairo_image_surface_get_stride (surface), row; + const unsigned char *src = mask; + unsigned char *dst = mask_aligned; + for (row = 0; row < MASK_HEIGHT; row++) { + memcpy (dst, src, (MASK_WIDTH + 7) / 8); + src += (MASK_WIDTH + 7) / 8; + dst += stride; + } + } + cairo_surface_mark_dirty (surface); + + /* Paint background blue */ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + /* Then paint red through our mask */ + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + cairo_mask_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_test_status_t status = CAIRO_TEST_SUCCESS; + int test_width; + + /* first check the API strictness */ + for (test_width = 0; test_width < 40; test_width++) { + int test_stride = (test_width + 7) / 8; + int stride = cairo_format_stride_for_width (CAIRO_FORMAT_A1, + test_width); + cairo_status_t expected; + + /* First create a surface using the width as the stride, + * (most of these should fail). + */ + expected = (stride == test_stride) ? + CAIRO_STATUS_SUCCESS : CAIRO_STATUS_INVALID_STRIDE; + + status = test_surface_with_width_and_stride (ctx, + test_width, + test_stride, + expected); + if (status) + return status; + + status = test_surface_with_width_and_stride (ctx, + test_width, + -test_stride, + expected); + if (status) + return status; + + + /* Then create a surface using the correct stride, + * (should always succeed). + */ + status = test_surface_with_width_and_stride (ctx, + test_width, + stride, + CAIRO_STATUS_SUCCESS); + if (status) + return status; + + status = test_surface_with_width_and_stride (ctx, + test_width, + -stride, + CAIRO_STATUS_SUCCESS); + if (status) + return status; + } + + return status; +} + +CAIRO_TEST (a1_mask, + "test masks of CAIRO_FORMAT_A1", + "alpha, mask", /* keywords */ + NULL, /* requirements */ + MASK_WIDTH, MASK_HEIGHT, + preamble, draw) diff --git a/test/a1-rasterisation.c b/test/a1-rasterisation.c new file mode 100644 index 000000000..b59090ab5 --- /dev/null +++ b/test/a1-rasterisation.c @@ -0,0 +1,101 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* + * Test the fidelity of the rasterisation, paying careful attention to rounding. + */ + +#include "../src/cairo-fixed-type-private.h" +#define PRECISION (int)(1 << CAIRO_FIXED_FRAC_BITS) + +#define WIDTH ((PRECISION/2+1)*3) +#define HEIGHT ((PRECISION/2+1)*3) + +#define SUBPIXEL(v) ((v)/(double)(PRECISION/2)) + +static cairo_test_status_t +rectangles (cairo_t *cr, int width, int height) +{ + int x, y; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (x = 0; x < WIDTH; x += 3) { + for (y = 0; y < HEIGHT; y += 3) { + cairo_rectangle (cr, x + SUBPIXEL (y/3) - .5, y + SUBPIXEL (x/3) - .5, .5, .5); + } + } + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +triangles (cairo_t *cr, int width, int height) +{ + int x, y; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (x = 0; x < WIDTH; x += 3) { + for (y = 0; y < HEIGHT; y += 3) { + /* a rectangle with a diagonal to force tessellation */ + cairo_move_to (cr, x + SUBPIXEL (y/3) - .5, y + SUBPIXEL (x/3) - .5); + cairo_rel_line_to (cr, .5, .5); + cairo_rel_line_to (cr, 0, -.5); + cairo_rel_line_to (cr, -.5, 0); + cairo_rel_line_to (cr, 0, .5); + cairo_rel_line_to (cr, .5, 0); + } + } + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_rasterisation_rectangles, + "Check the fidelity of the rasterisation.", + "rasterisation", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, rectangles) + +CAIRO_TEST (a1_rasterisation_triangles, + "Check the fidelity of the rasterisation.", + "rasterisation", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, triangles) diff --git a/test/a1-sample.c b/test/a1-sample.c new file mode 100644 index 000000000..977dfc832 --- /dev/null +++ b/test/a1-sample.c @@ -0,0 +1,59 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH (256) //CAIRO_FIXED_ONE +#define HEIGHT (WIDTH) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_set_source_rgb (cr, 0, 0, 0); + + /* Only the single rectangle that covers the centre pixel should be filled*/ + for (i = 0; i < 256; i++) + for (j = 0; j < 256; j++) { + cairo_rectangle (cr, i + i/256., j + j/256., 1/256., 1/256.); + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_sample, + "Tests unantialiased rendering of a quantum box", + " alpha", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/a1-traps-sample.c b/test/a1-traps-sample.c new file mode 100644 index 000000000..5bb97bb4c --- /dev/null +++ b/test/a1-traps-sample.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define POINTS 10 +#define STEP (1.0 / POINTS) +#define PAD 1 +#define WIDTH (PAD + POINTS * 2 + PAD) +#define HEIGHT (WIDTH) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* Draw in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, PAD, PAD); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (i = 0; i < POINTS; i++) + for (j = 0; j < POINTS; j++) { + cairo_rectangle (cr, 2 * i + i * STEP, 2 * j + j * STEP, 1, 1); + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a1_traps_sample, + "Test sample position when drawing trapezoids with ANTIALIAS_NONE", + "alpha, traps", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/a8-clear.c b/test/a8-clear.c new file mode 100644 index 000000000..1459f833e --- /dev/null +++ b/test/a8-clear.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + * + * Based on a bug snippet by Jeremy Moles + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *mask; + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_push_group_with_content (cr, CAIRO_CONTENT_ALPHA); + { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, width, height); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_set_line_width (cr, 10); + cairo_stroke (cr); + } + mask = cairo_pop_group (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_mask (cr, mask); + cairo_pattern_destroy (mask); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (a8_clear, + "Test clear on an a8 surface", + "a8, clear", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) + diff --git a/test/a8-mask.c b/test/a8-mask.c new file mode 100644 index 000000000..ec708121e --- /dev/null +++ b/test/a8-mask.c @@ -0,0 +1,201 @@ +/* + * Copyright © Jeff Muizelaar + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF MUIZELAAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Jeff Muizelaar + * Carl Worth + */ + +#include "cairo-test.h" + +#define MASK_WIDTH 8 +#define MASK_HEIGHT 8 + +static unsigned char mask[MASK_WIDTH * MASK_HEIGHT] = { + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, +}; + +static cairo_test_status_t +check_status (const cairo_test_context_t *ctx, + cairo_status_t status, + cairo_status_t expected) +{ + if (status == expected) + return CAIRO_TEST_SUCCESS; + + cairo_test_log (ctx, + "Error: Expected status value %d (%s), received %d (%s)\n", + expected, + cairo_status_to_string (expected), + status, + cairo_status_to_string (status)); + return CAIRO_TEST_FAILURE; +} + +static cairo_test_status_t +test_surface_with_width_and_stride (const cairo_test_context_t *ctx, + int width, int stride, + cairo_status_t expected) +{ + cairo_test_status_t status; + cairo_surface_t *surface; + cairo_t *cr; + int len; + unsigned char *data; + + cairo_test_log (ctx, + "Creating surface with width %d and stride %d\n", + width, stride); + + len = stride; + if (len < 0) + len = -len; + data = xmalloc (len); + + surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_A8, + width, 1, stride); + cr = cairo_create (surface); + + cairo_paint (cr); + + status = check_status (ctx, cairo_surface_status (surface), expected); + if (status) + goto BAIL; + + status = check_status (ctx, cairo_status (cr), expected); + if (status) + goto BAIL; + + BAIL: + cairo_destroy (cr); + cairo_surface_destroy (surface); + free (data); + return status; +} + +static cairo_test_status_t +draw (cairo_t *cr, int dst_width, int dst_height) +{ + int stride, row; + unsigned char *src, *dst, *mask_aligned; + cairo_surface_t *surface; + + /* Now test actually drawing through our mask data, allocating and + * copying with the proper stride. */ + stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, + MASK_WIDTH); + + mask_aligned = xmalloc (stride * MASK_HEIGHT); + + src = mask; + dst = mask_aligned; + for (row = 0; row < MASK_HEIGHT; row++) { + memcpy (dst, src, MASK_WIDTH); + src += MASK_WIDTH; + dst += stride; + } + + surface = cairo_image_surface_create_for_data (mask_aligned, + CAIRO_FORMAT_A8, + MASK_WIDTH, + MASK_HEIGHT, + stride); + + /* Paint background blue */ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + /* Then paint red through our mask */ + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + cairo_mask_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + + free (mask_aligned); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_test_status_t status = CAIRO_TEST_SUCCESS; + int test_width; + + for (test_width = 0; test_width < 40; test_width++) { + int stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, + test_width); + cairo_status_t expected; + + /* First create a surface using the width as the stride, + * (most of these should fail). + */ + expected = (stride == test_width) ? + CAIRO_STATUS_SUCCESS : CAIRO_STATUS_INVALID_STRIDE; + + status = test_surface_with_width_and_stride (ctx, + test_width, + test_width, + expected); + if (status) + return status; + + status = test_surface_with_width_and_stride (ctx, + test_width, + -test_width, + expected); + if (status) + return status; + + + /* Then create a surface using the correct stride, + * (should always succeed). + */ + status = test_surface_with_width_and_stride (ctx, + test_width, + stride, + CAIRO_STATUS_SUCCESS); + if (status) + return status; + + status = test_surface_with_width_and_stride (ctx, + test_width, + -stride, + CAIRO_STATUS_SUCCESS); + if (status) + return status; + } + + return status; +} + +CAIRO_TEST (a8_mask, + "test masks of CAIRO_FORMAT_A8", + "alpha, mask", /* keywords */ + NULL, /* requirements */ + 8, 8, + preamble, draw) diff --git a/test/aliasing.c b/test/aliasing.c new file mode 100644 index 000000000..73c1f1ae2 --- /dev/null +++ b/test/aliasing.c @@ -0,0 +1,100 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* A fun little test to explore color fringing in various experimental + * subpixel rasterisation techniques. + */ + +#define WIDTH 60 +#define HEIGHT 40 + +static const struct color { + double red, green, blue; +} color[] = { + { 1, 1, 1 }, + { 0, 0, 0 }, + { 1, 0, 0 }, + { 0, 1, 0 }, + { 0, 0, 1 }, + { 1, 1, 0 }, + { 0, 1, 1 }, + { 1, 0, 1 }, + { .5, .5, .5 }, +}; + +#define NUM_COLORS ARRAY_LENGTH (color) + +static void +object (cairo_t *cr, const struct color *fg, const struct color *bg) +{ + cairo_set_source_rgb (cr, bg->red, bg->green, bg->blue); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_fill (cr); + + cairo_set_source_rgb (cr, fg->red, fg->green, fg->blue); + cairo_save (cr); + cairo_scale (cr, WIDTH, HEIGHT); + cairo_arc (cr, .5, .5, .5 - 4. / MAX (WIDTH, HEIGHT), 0, 2 * M_PI); + cairo_fill (cr); + cairo_arc (cr, .5, .5, .5 - 2. / MAX (WIDTH, HEIGHT), 0, 2 * M_PI); + cairo_restore (cr); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, bg->red, bg->green, bg->blue); + cairo_set_line_width (cr, 4.); + cairo_move_to (cr, 4, HEIGHT-4); + cairo_line_to (cr, WIDTH-12, 4); + cairo_move_to (cr, 12, HEIGHT-4); + cairo_line_to (cr, WIDTH-4, 4); + cairo_stroke (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + unsigned int i, j; + + for (i = 0; i < NUM_COLORS; i++) { + for (j = 0; j < NUM_COLORS; j++) { + cairo_save (cr); + cairo_translate (cr, i * WIDTH, j * HEIGHT); + object (cr, &color[i], &color[j]); + cairo_restore (cr); + } + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (aliasing, + "Check for subpixel aliasing and color fringing", + "rasterisation", /* keywords */ + "target=raster", /* requirements */ + NUM_COLORS * WIDTH, NUM_COLORS * HEIGHT, + NULL, draw) diff --git a/test/alpha-similar.c b/test/alpha-similar.c new file mode 100644 index 000000000..86c6ae39d --- /dev/null +++ b/test/alpha-similar.c @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_surface_t * +create_source (cairo_surface_t *target, int width, int height) +{ + cairo_surface_t *similar; + cairo_t *cr; + + similar = cairo_surface_create_similar (target, + CAIRO_CONTENT_ALPHA, + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + cairo_set_source_rgba (cr, 1, 0, 0, .5); + cairo_paint (cr); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + + source = create_source (cairo_get_target (cr), width, height); + cairo_set_source_surface (cr, source, 0, 0); + cairo_surface_destroy (source); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +/* + * XFAIL: discrepancy between backends in applying color components of a pure + * alpha surface + */ +CAIRO_TEST (alpha_similar, + "Tests creation of similar alpha surfaces" + "\nApplication of a pure-alpha similar source is inconsistent across backends.", + "alpha, similar", /* keywords */ + NULL, /* requirements */ + 10, 10, + NULL, draw) + diff --git a/test/any2ppm.c b/test/any2ppm.c new file mode 100644 index 000000000..b60b4d959 --- /dev/null +++ b/test/any2ppm.c @@ -0,0 +1,894 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + * + * Contributor(s): + * Carlos Garcia Campos + * + * Adapted from pdf2png.c: + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#if HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include +#include + +#if CAIRO_CAN_TEST_PDF_SURFACE +#include +#endif + +#if CAIRO_CAN_TEST_SVG_SURFACE +#include +#ifndef RSVG_CAIRO_H +#include +#endif +#endif + +#if CAIRO_HAS_SPECTRE +#include +#endif + +#include + +#if HAVE_FCNTL_H +#include +#endif + +#if HAVE_UNISTD_H && HAVE_SIGNAL_H && HAVE_SYS_STAT_H && HAVE_SYS_SOCKET_H && HAVE_SYS_POLL_H && HAVE_SYS_UN_H +#include +#include +#include +#include +#include + +#define SOCKET_PATH "./.any2ppm" +#define TIMEOUT 60000 /* 60 seconds */ + +#if HAVE_FORK +#define CAN_RUN_AS_DAEMON 1 +#endif +#endif + +#define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) + +static int +_cairo_writen (int fd, char *buf, int len) +{ + while (len) { + int ret; + + ret = write (fd, buf, len); + if (ret == -1) { + int err = errno; + switch (err) { + case EINTR: + case EAGAIN: + continue; + default: + return 0; + } + } + len -= ret; + buf += ret; + } + + return 1; +} + +static int +_cairo_write (int fd, + char *buf, int maxlen, int buflen, + const unsigned char *src, int srclen) +{ + if (buflen < 0) + return buflen; + + while (srclen) { + int len; + + len = buflen + srclen; + if (len > maxlen) + len = maxlen; + len -= buflen; + + memcpy (buf + buflen, src, len); + buflen += len; + srclen -= len; + src += len; + + if (buflen == maxlen) { + if (! _cairo_writen (fd, buf, buflen)) + return -1; + + buflen = 0; + } + } + + return buflen; +} + +static const char * +write_ppm (cairo_surface_t *surface, int fd) +{ + char buf[4096]; + cairo_format_t format; + const char *format_str; + const unsigned char *data; + int len; + int width, height, stride; + int i, j; + + data = cairo_image_surface_get_data (surface); + height = cairo_image_surface_get_height (surface); + width = cairo_image_surface_get_width (surface); + stride = cairo_image_surface_get_stride (surface); + format = cairo_image_surface_get_format (surface); + if (format == CAIRO_FORMAT_ARGB32) { + /* see if we can convert to a standard ppm type and trim a few bytes */ + const unsigned char *alpha = data; + for (j = height; j--; alpha += stride) { + for (i = 0; i < width; i++) { + if ((*(unsigned int *) (alpha+4*i) & 0xff000000) != 0xff000000) + goto done; + } + } + format = CAIRO_FORMAT_RGB24; + done: ; + } + + switch (format) { + case CAIRO_FORMAT_ARGB32: + /* XXX need true alpha for svg */ + format_str = "P7"; + break; + case CAIRO_FORMAT_RGB24: + format_str = "P6"; + break; + case CAIRO_FORMAT_A8: + format_str = "P5"; + break; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + default: + return "unhandled image format"; + } + + len = sprintf (buf, "%s %d %d 255\n", format_str, width, height); + for (j = 0; j < height; j++) { + const unsigned int *row = (unsigned int *) (data + stride * j); + + switch ((int) format) { + case CAIRO_FORMAT_ARGB32: + len = _cairo_write (fd, + buf, sizeof (buf), len, + (unsigned char *) row, 4 * width); + break; + case CAIRO_FORMAT_RGB24: + for (i = 0; i < width; i++) { + unsigned char rgb[3]; + unsigned int p = *row++; + rgb[0] = (p & 0xff0000) >> 16; + rgb[1] = (p & 0x00ff00) >> 8; + rgb[2] = (p & 0x0000ff) >> 0; + len = _cairo_write (fd, + buf, sizeof (buf), len, + rgb, 3); + } + break; + case CAIRO_FORMAT_A8: + len = _cairo_write (fd, + buf, sizeof (buf), len, + (unsigned char *) row, width); + break; + } + if (len < 0) + return "write failed"; + } + + if (len && ! _cairo_writen (fd, buf, len)) + return "write failed"; + + return NULL; +} + +static cairo_surface_t * +_create_image (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + cairo_surface_t **out = closure; + cairo_format_t format; + switch (content) { + case CAIRO_CONTENT_ALPHA: + format = CAIRO_FORMAT_A8; + break; + case CAIRO_CONTENT_COLOR: + format = CAIRO_FORMAT_RGB24; + break; + default: + case CAIRO_CONTENT_COLOR_ALPHA: + format = CAIRO_FORMAT_ARGB32; + break; + } + *out = cairo_image_surface_create (format, width, height); + return cairo_surface_reference (*out); +} + +#if CAIRO_HAS_INTERPRETER +static const char * +_cairo_script_render_page (const char *filename, + cairo_surface_t **surface_out) +{ + cairo_script_interpreter_t *csi; + cairo_surface_t *surface = NULL; + cairo_status_t status; + const cairo_script_interpreter_hooks_t hooks = { + &surface, + _create_image, + NULL, /* surface_destroy */ + NULL, /* context_create */ + NULL, /* context_destroy */ + NULL, /* show_page */ + NULL /* copy_page */ + }; + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + status = cairo_script_interpreter_run (csi, filename); + if (status) { + cairo_surface_destroy (surface); + surface = NULL; + } + status = cairo_script_interpreter_destroy (csi); + if (surface == NULL) + return "cairo-script interpreter failed"; + + if (status == CAIRO_STATUS_SUCCESS) + status = cairo_surface_status (surface); + if (status) { + cairo_surface_destroy (surface); + return cairo_status_to_string (status); + } + + *surface_out = surface; + return NULL; +} + +static const char * +cs_convert (char **argv, int fd) +{ + const char *err; + cairo_surface_t *surface = NULL; /* silence compiler warning */ + + err = _cairo_script_render_page (argv[0], &surface); + if (err != NULL) + return err; + + err = write_ppm (surface, fd); + cairo_surface_destroy (surface); + + return err; +} +#else +static const char * +cs_convert (char **argv, int fd) +{ + return "compiled without CairoScript support."; +} +#endif + +#if CAIRO_CAN_TEST_PDF_SURFACE +/* adapted from pdf2png.c */ +static const char * +_poppler_render_page (const char *filename, + const char *page_label, + cairo_surface_t **surface_out) +{ + PopplerDocument *document; + PopplerPage *page; + double width, height; + GError *error = NULL; + gchar *absolute, *uri; + cairo_surface_t *surface; + cairo_t *cr; + cairo_status_t status; + + if (g_path_is_absolute (filename)) { + absolute = g_strdup (filename); + } else { + gchar *dir = g_get_current_dir (); + absolute = g_build_filename (dir, filename, (gchar *) 0); + g_free (dir); + } + + uri = g_filename_to_uri (absolute, NULL, &error); + g_free (absolute); + if (uri == NULL) + return error->message; /* XXX g_error_free (error) */ + + document = poppler_document_new_from_file (uri, NULL, &error); + g_free (uri); + if (document == NULL) + return error->message; /* XXX g_error_free (error) */ + + page = poppler_document_get_page_by_label (document, page_label); + g_object_unref (document); + if (page == NULL) + return "page not found"; + + poppler_page_get_size (page, &width, &height); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + cr = cairo_create (surface); + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA); + + poppler_page_render (page, cr); + g_object_unref (page); + + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + status = cairo_status (cr); + cairo_destroy (cr); + + if (status) { + cairo_surface_destroy (surface); + return cairo_status_to_string (status); + } + + *surface_out = surface; + return NULL; +} + +static const char * +pdf_convert (char **argv, int fd) +{ + const char *err; + cairo_surface_t *surface = NULL; /* silence compiler warning */ + + err = _poppler_render_page (argv[0], argv[1], &surface); + if (err != NULL) + return err; + + err = write_ppm (surface, fd); + cairo_surface_destroy (surface); + + return err; +} +#else +static const char * +pdf_convert (char **argv, int fd) +{ + return "compiled without PDF support."; +} +#endif + +#if CAIRO_CAN_TEST_SVG_SURFACE +static const char * +_rsvg_render_page (const char *filename, + cairo_surface_t **surface_out) +{ + RsvgHandle *handle; + RsvgDimensionData dimensions; + GError *error = NULL; + cairo_surface_t *surface; + cairo_t *cr; + cairo_status_t status; + + handle = rsvg_handle_new_from_file (filename, &error); + if (handle == NULL) + return error->message; /* XXX g_error_free */ + + rsvg_handle_get_dimensions (handle, &dimensions); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + dimensions.width, + dimensions.height); + cr = cairo_create (surface); + + rsvg_handle_render_cairo (handle, cr); + g_object_unref (handle); + + status = cairo_status (cr); + cairo_destroy (cr); + + if (status) { + cairo_surface_destroy (surface); + return cairo_status_to_string (status); + } + + *surface_out = surface; + return NULL; +} + +static const char * +svg_convert (char **argv, int fd) +{ + const char *err; + cairo_surface_t *surface = NULL; /* silence compiler warning */ + + err = _rsvg_render_page (argv[0], &surface); + if (err != NULL) + return err; + + err = write_ppm (surface, fd); + cairo_surface_destroy (surface); + + return err; +} +#else +static const char * +svg_convert (char **argv, int fd) +{ + return "compiled without SVG support."; +} +#endif + +#if CAIRO_HAS_SPECTRE +static const char * +_spectre_render_page (const char *filename, + const char *page_label, + cairo_surface_t **surface_out) +{ + static const cairo_user_data_key_t key; + + SpectreDocument *document; + SpectreStatus status; + int width, height, stride; + unsigned char *pixels; + cairo_surface_t *surface; + + document = spectre_document_new (); + spectre_document_load (document, filename); + status = spectre_document_status (document); + if (status) { + spectre_document_free (document); + return spectre_status_to_string (status); + } + + if (page_label) { + SpectrePage *page; + SpectreRenderContext *rc; + + page = spectre_document_get_page_by_label (document, page_label); + spectre_document_free (document); + if (page == NULL) + return "page not found"; + + spectre_page_get_size (page, &width, &height); + rc = spectre_render_context_new (); + spectre_render_context_set_page_size (rc, width, height); + spectre_page_render (page, rc, &pixels, &stride); + spectre_render_context_free (rc); + status = spectre_page_status (page); + spectre_page_free (page); + if (status) { + free (pixels); + return spectre_status_to_string (status); + } + } else { + spectre_document_get_page_size (document, &width, &height); + spectre_document_render (document, &pixels, &stride); + spectre_document_free (document); + } + + surface = cairo_image_surface_create_for_data (pixels, + CAIRO_FORMAT_RGB24, + width, height, + stride); + cairo_surface_set_user_data (surface, &key, + pixels, (cairo_destroy_func_t) free); + *surface_out = surface; + return NULL; +} + +static const char * +ps_convert (char **argv, int fd) +{ + const char *err; + cairo_surface_t *surface = NULL; /* silence compiler warning */ + + err = _spectre_render_page (argv[0], argv[1], &surface); + if (err != NULL) + return err; + + err = write_ppm (surface, fd); + cairo_surface_destroy (surface); + + return err; +} +#else +static const char * +ps_convert (char **argv, int fd) +{ + return "compiled without PostScript support."; +} +#endif + +static const char * +convert (char **argv, int fd) +{ + static const struct converter { + const char *type; + const char *(*func) (char **, int); + } converters[] = { + { "cs", cs_convert }, + { "pdf", pdf_convert }, + { "ps", ps_convert }, + { "svg", svg_convert }, + { NULL, NULL } + }; + const struct converter *converter = converters; + char *type; + + type = strrchr (argv[0], '.'); + if (type == NULL) + return "no file extension"; + type++; + + while (converter->type) { + if (strcmp (type, converter->type) == 0) + return converter->func (argv, fd); + converter++; + } + return "no converter"; +} + +#if CAN_RUN_AS_DAEMON +static int +_getline (int fd, char **linep, size_t *lenp) +{ + char *line; + size_t len, i; + ssize_t ret; + + line = *linep; + if (line == NULL) { + line = malloc (1024); + if (line == NULL) + return -1; + line[0] = '\0'; + len = 1024; + } else + len = *lenp; + + /* XXX simple, but ugly! */ + i = 0; + do { + if (i == len - 1) { + char *nline; + + nline = realloc (line, len + 1024); + if (nline == NULL) + goto out; + + line = nline; + len += 1024; + } + + ret = read (fd, line + i, 1); + if (ret == -1 || ret == 0) + goto out; + } while (line[i++] != '\n'); + +out: + line[i] = '\0'; + *linep = line; + *lenp = len; + return i-1; +} + +static int +split_line (char *line, char *argv[], int max_argc) +{ + int i = 0; + + max_argc--; /* leave one spare for the trailing NULL */ + + argv[i++] = line; + while (i < max_argc && (line = strchr (line, ' ')) != NULL) { + *line++ = '\0'; + argv[i++] = line; + } + + /* chomp the newline */ + line = strchr (argv[i-1], '\n'); + if (line != NULL) + *line = '\0'; + + argv[i] = NULL; + + return i; +} + +static int +any2ppm_daemon_exists (void) +{ + struct stat st; + int fd; + char buf[80]; + int pid; + int ret; + + if (stat (SOCKET_PATH, &st) < 0) + return 0; + + fd = open (SOCKET_PATH ".pid", O_RDONLY); + if (fd < 0) + return 0; + + pid = 0; + ret = read (fd, buf, sizeof (buf) - 1); + if (ret > 0) { + buf[ret] = '\0'; + pid = atoi (buf); + } + close (fd); + + return pid > 0 && kill (pid, 0) == 0; +} + +static int +write_pid_file (void) +{ + int fd; + char buf[80]; + int ret; + + fd = open (SOCKET_PATH ".pid", O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (fd < 0) + return 0; + + ret = sprintf (buf, "%d\n", getpid ()); + ret = write (fd, buf, ret) == ret; + close (fd); + + return ret; +} + +static int +open_devnull_to_fd (int want_fd, int flags) +{ + int error; + int got_fd; + + close (want_fd); + + got_fd = open("/dev/null", flags | O_CREAT, 0700); + if (got_fd == -1) + return -1; + + error = dup2 (got_fd, want_fd); + close (got_fd); + + return error; +} + +static int +daemonize (void) +{ + void (*oldhup) (int); + + /* Let the parent go. */ + switch (fork ()) { + case -1: return -1; + case 0: break; + default: _exit (0); + } + + /* Become session leader. */ + if (setsid () == -1) + return -1; + + /* Refork to yield session leadership. */ + oldhup = signal (SIGHUP, SIG_IGN); + + switch (fork ()) { /* refork to yield session leadership. */ + case -1: return -1; + case 0: break; + default: _exit (0); + } + + signal (SIGHUP, oldhup); + + /* Establish stdio. */ + if (open_devnull_to_fd (0, O_RDONLY) == -1) + return -1; + if (open_devnull_to_fd (1, O_WRONLY | O_APPEND) == -1) + return -1; + if (dup2 (1, 2) == -1) + return -1; + + return 0; +} + +static const char * +any2ppm_daemon (void) +{ + int timeout = TIMEOUT; + struct pollfd pfd; + int sk, fd; + long flags; + struct sockaddr_un addr; + char *line = NULL; + size_t len = 0; + +#ifdef SIGPIPE + signal (SIGPIPE, SIG_IGN); +#endif + + /* XXX racy! */ + if (getenv ("ANY2PPM_FORCE") == NULL && any2ppm_daemon_exists ()) + return "any2ppm daemon already running"; + + unlink (SOCKET_PATH); + + sk = socket (PF_UNIX, SOCK_STREAM, 0); + if (sk == -1) + return "unable to create socket"; + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, SOCKET_PATH); + if (bind (sk, (struct sockaddr *) &addr, sizeof (addr)) == -1) { + close (sk); + return "unable to bind socket"; + } + + flags = fcntl (sk, F_GETFL); + if (flags == -1 || fcntl (sk, F_SETFL, flags | O_NONBLOCK) == -1) { + close (sk); + return "unable to set socket to non-blocking"; + } + + if (listen (sk, 5) == -1) { + close (sk); + return "unable to listen on socket"; + } + + /* ready for client connection - detach from parent/terminal */ + if (getenv ("ANY2PPM_NODAEMON") == NULL && daemonize () == -1) { + close (sk); + return "unable to detach from parent"; + } + + if (! write_pid_file ()) { + close (sk); + return "unable to write pid file"; + } + + if (getenv ("ANY2PPM_TIMEOUT") != NULL) { + timeout = atoi (getenv ("ANY2PPM_TIMEOUT")); + if (timeout == 0) + timeout = -1; + if (timeout > 0) + timeout *= 1000; /* convert env (in seconds) to milliseconds */ + } + + pfd.fd = sk; + pfd.events = POLLIN; + pfd.revents = 0; /* valgrind */ + while (poll (&pfd, 1, timeout) > 0) { + while ((fd = accept (sk, NULL, NULL)) != -1) { + if (_getline (fd, &line, &len) != -1) { + char *argv[10]; + + if (split_line (line, argv, ARRAY_LENGTH (argv)) > 0) { + const char *err; + + err = convert (argv, fd); + if (err != NULL) { + FILE *file = fopen (".any2ppm.errors", "a"); + if (file != NULL) { + fprintf (file, + "Failed to convert '%s': %s\n", + argv[0], err); + fclose (file); + } + } + } + } + close (fd); + } + } + close (sk); + unlink (SOCKET_PATH); + unlink (SOCKET_PATH ".pid"); + + free (line); + return NULL; +} +#else +static const char * +any2ppm_daemon (void) +{ + return "daemon not compiled in."; +} +#endif + +int +main (int argc, char **argv) +{ + const char *err; + +#if CAIRO_CAN_TEST_PDF_SURFACE || CAIRO_CAN_TEST_SVG_SURFACE +#if GLIB_MAJOR_VERSION <= 2 && GLIB_MINOR_VERSION <= 34 + g_type_init (); +#endif +#endif + +#if CAIRO_CAN_TEST_SVG_SURFACE + rsvg_set_default_dpi (72.0); +#endif + +#if defined(_WIN32) && !defined (__CYGWIN__) + _setmode (1, _O_BINARY); +#endif + + if (argc == 1) + err = any2ppm_daemon (); + else + err = convert (argv + 1, 1); + if (err != NULL) { + fprintf (stderr, "Failed to run converter: %s\n", err); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/test/api-special-cases.c b/test/api-special-cases.c new file mode 100644 index 000000000..c4a754dee --- /dev/null +++ b/test/api-special-cases.c @@ -0,0 +1,1989 @@ +/* + * Copyright © 2010 Red Hat Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Benjamin Otte + */ + +/* + * WHAT THIS TEST DOES + * + * This test tests that for all public APIs Cairo behaves correct, consistent + * and most of all doesn't crash. It does this by calling all APIs that take + * surfaces or contexts and calling them on specially prepared arguments that + * should fail when called on this function. + * + * ADDING NEW FUNCTIONS + * + * You need (for adding the function cairo_surface_foo): + * 1) A surface_test_func_t named test_cairo_surface_foo that gets passed the + * prepared surface and has the job of calling the function and checking + * the return value (if one exists) for correctness. The top of this file + * contains all these shim functions. + * 2) Knowledge if the function behaves like a setter or like a getter. A + * setter should set an error status on the surface, a getter does not + * modify the function. + * 3) Knowledge if the function only works for a specific surface type and for + * which one. + * 4) An entry in the tests array using the TEST() macro. It takes as arguments: + * - The function name + * - TRUE if the function modifies the surface, FALSE otherwise + * - the surface type for which the function is valid or -1 if it is valid + * for all surface types. + * + * FIXING FAILURES + * + * The test will dump failures notices into the api-special-cases.log file (when + * it doesn't crash). These should be pretty self-explanatory. Usually it is + * enough to just add a new check to the function it complained about. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "cairo-test.h" + +#if CAIRO_HAS_GL_SURFACE +#include +#endif +#if CAIRO_HAS_OS2_SURFACE +#include +#endif +#if CAIRO_HAS_PDF_SURFACE +#include +#endif +#if CAIRO_HAS_PS_SURFACE +#include +#endif +#if CAIRO_HAS_QUARTZ_SURFACE +#define Cursor QuartzCursor +#include +#undef Cursor +#endif +#if CAIRO_HAS_SVG_SURFACE +#include +#endif +#if CAIRO_HAS_TEE_SURFACE +#include +#endif +#if CAIRO_HAS_XCB_SURFACE +#include +#endif +#if CAIRO_HAS_XLIB_SURFACE +#define Cursor XCursor +#include +#undef Cursor +#endif + +#define surface_has_type(surface,type) (cairo_surface_get_type (surface) == (type)) + +typedef cairo_test_status_t (* surface_test_func_t) (cairo_surface_t *surface); +typedef cairo_test_status_t (* context_test_func_t) (cairo_t *cr); + +static cairo_test_status_t +test_cairo_reference (cairo_t *cr) +{ + cairo_destroy (cairo_reference (cr)); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_reference_count (cairo_t *cr) +{ + unsigned int refcount = cairo_get_reference_count (cr); + if (refcount > 0) + return CAIRO_TEST_SUCCESS; + /* inert error context have a refcount of 0 */ + return cairo_status (cr) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_set_user_data (cairo_t *cr) +{ + static cairo_user_data_key_t key; + cairo_status_t status; + + status = cairo_set_user_data (cr, &key, &key, NULL); + if (status == CAIRO_STATUS_NO_MEMORY) + return CAIRO_TEST_NO_MEMORY; + else if (status) + return CAIRO_TEST_SUCCESS; + + if (cairo_get_user_data (cr, &key) != &key) + return CAIRO_TEST_ERROR; + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_save (cairo_t *cr) +{ + cairo_save (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_push_group (cairo_t *cr) +{ + cairo_pattern_t *pattern; + cairo_status_t status; + + cairo_push_group (cr); + pattern = cairo_pop_group (cr); + status = cairo_pattern_status (pattern); + cairo_pattern_destroy (pattern); + + return status == CAIRO_STATUS_SUCCESS || status == cairo_status (cr) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_push_group_with_content (cairo_t *cr) +{ + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA); + cairo_pop_group_to_source (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_operator (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_source (cairo_t *cr) +{ + cairo_pattern_t *source = cairo_pattern_create_rgb (0, 0, 0); + cairo_set_source (cr, source); + cairo_pattern_destroy (source); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_source_rgb (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 0, 0, 0); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_source_rgba (cairo_t *cr) +{ + cairo_set_source_rgba (cr, 0, 0, 0, 1); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_source_surface (cairo_t *cr) +{ + cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_tolerance (cairo_t *cr) +{ + cairo_set_tolerance (cr, 42); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_antialias (cairo_t *cr) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_BEST); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_fill_rule (cairo_t *cr) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_line_width (cairo_t *cr) +{ + cairo_set_line_width (cr, 42); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_line_cap (cairo_t *cr) +{ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_line_join (cairo_t *cr) +{ + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_dash (cairo_t *cr) +{ + cairo_set_dash (cr, NULL, 0, 0); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_miter_limit (cairo_t *cr) +{ + cairo_set_miter_limit (cr, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_translate (cairo_t *cr) +{ + cairo_translate (cr, 2, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_scale (cairo_t *cr) +{ + cairo_scale (cr, 2, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_rotate (cairo_t *cr) +{ + cairo_rotate (cr, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_transform (cairo_t *cr) +{ + cairo_matrix_t matrix; + + cairo_matrix_init_translate (&matrix, 1, 1); + cairo_transform (cr, &matrix); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_matrix (cairo_t *cr) +{ + cairo_matrix_t matrix; + + cairo_matrix_init_translate (&matrix, 1, 1); + cairo_set_matrix (cr, &matrix); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_identity_matrix (cairo_t *cr) +{ + cairo_identity_matrix (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_user_to_device (cairo_t *cr) +{ + double x = 42, y = 42; + + cairo_user_to_device (cr, &x, &y); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_user_to_device_distance (cairo_t *cr) +{ + double x = 42, y = 42; + + cairo_user_to_device_distance (cr, &x, &y); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_device_to_user (cairo_t *cr) +{ + double x = 42, y = 42; + + cairo_device_to_user (cr, &x, &y); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_device_to_user_distance (cairo_t *cr) +{ + double x = 42, y = 42; + + cairo_device_to_user_distance (cr, &x, &y); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_new_path (cairo_t *cr) +{ + cairo_new_path (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_move_to (cairo_t *cr) +{ + cairo_move_to (cr, 2, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_new_sub_path (cairo_t *cr) +{ + cairo_new_sub_path (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_line_to (cairo_t *cr) +{ + cairo_line_to (cr, 2, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_curve_to (cairo_t *cr) +{ + cairo_curve_to (cr, 2, 2, 3, 3, 4, 4); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_arc (cairo_t *cr) +{ + cairo_arc (cr, 2, 2, 3, 0, 2 * M_PI); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_arc_negative (cairo_t *cr) +{ + cairo_arc_negative (cr, 2, 2, 3, 0, 2 * M_PI); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_rel_move_to (cairo_t *cr) +{ + cairo_rel_move_to (cr, 2, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_rel_line_to (cairo_t *cr) +{ + cairo_rel_line_to (cr, 2, 2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_rel_curve_to (cairo_t *cr) +{ + cairo_rel_curve_to (cr, 2, 2, 3, 3, 4, 4); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_rectangle (cairo_t *cr) +{ + cairo_rectangle (cr, 2, 2, 3, 3); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_close_path (cairo_t *cr) +{ + cairo_close_path (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_path_extents (cairo_t *cr) +{ + double x1, y1, x2, y2; + cairo_path_extents (cr, &x1, &y1, &x2, &y2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_paint (cairo_t *cr) +{ + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_paint_with_alpha (cairo_t *cr) +{ + cairo_paint_with_alpha (cr, 0.5); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_mask (cairo_t *cr) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_rgb (0.5, 0.5, 0.5); + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_mask_surface (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + cairo_mask_surface (cr, surface, 0, 0); + + cairo_surface_destroy (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_stroke (cairo_t *cr) +{ + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_stroke_preserve (cairo_t *cr) +{ + cairo_stroke_preserve (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_fill (cairo_t *cr) +{ + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_fill_preserve (cairo_t *cr) +{ + cairo_fill_preserve (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_copy_page (cairo_t *cr) +{ + cairo_copy_page (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_show_page (cairo_t *cr) +{ + cairo_show_page (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_in_stroke (cairo_t *cr) +{ + cairo_in_stroke (cr, 1, 1); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_in_fill (cairo_t *cr) +{ + cairo_in_fill (cr, 1, 1); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_in_clip (cairo_t *cr) +{ + cairo_in_clip (cr, 1, 1); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_stroke_extents (cairo_t *cr) +{ + double x1, y1, x2, y2; + cairo_stroke_extents (cr, &x1, &y1, &x2, &y2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_fill_extents (cairo_t *cr) +{ + double x1, y1, x2, y2; + cairo_fill_extents (cr, &x1, &y1, &x2, &y2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_reset_clip (cairo_t *cr) +{ + cairo_reset_clip (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_clip (cairo_t *cr) +{ + cairo_clip (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_clip_preserve (cairo_t *cr) +{ + cairo_clip_preserve (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_clip_extents (cairo_t *cr) +{ + double x1, y1, x2, y2; + cairo_clip_extents (cr, &x1, &y1, &x2, &y2); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_copy_clip_rectangle_list (cairo_t *cr) +{ + cairo_rectangle_list_destroy (cairo_copy_clip_rectangle_list (cr)); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_select_font_face (cairo_t *cr) +{ + cairo_select_font_face (cr, "Arial", CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_WEIGHT_BOLD); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_font_size (cairo_t *cr) +{ + cairo_set_font_size (cr, 42); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_font_matrix (cairo_t *cr) +{ + cairo_matrix_t matrix; + + cairo_matrix_init_translate (&matrix, 1, 1); + cairo_set_font_matrix (cr, &matrix); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_font_matrix (cairo_t *cr) +{ + cairo_matrix_t matrix; + + cairo_get_font_matrix (cr, &matrix); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_font_options (cairo_t *cr) +{ + cairo_font_options_t *opt = cairo_font_options_create (); + cairo_set_font_options (cr, opt); + cairo_font_options_destroy (opt); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_font_options (cairo_t *cr) +{ + cairo_font_options_t *opt = cairo_font_options_create (); + cairo_get_font_options (cr, opt); + cairo_font_options_destroy (opt); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_font_face (cairo_t *cr) +{ + cairo_set_font_face (cr, cairo_get_font_face (cr)); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_set_scaled_font (cairo_t *cr) +{ + cairo_set_scaled_font (cr, cairo_get_scaled_font (cr)); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_show_text (cairo_t *cr) +{ + cairo_show_text (cr, "Cairo"); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_show_glyphs (cairo_t *cr) +{ + cairo_glyph_t glyph; + + glyph.index = 65; + glyph.x = 0; + glyph.y = 0; + + cairo_show_glyphs (cr, &glyph, 1); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_show_text_glyphs (cairo_t *cr) +{ + cairo_glyph_t glyph; + cairo_text_cluster_t cluster; + + glyph.index = 65; + glyph.x = 0; + glyph.y = 0; + + cluster.num_bytes = 1; + cluster.num_glyphs = 1; + + cairo_show_text_glyphs (cr, "a", -1, &glyph, 1, &cluster, 1, 0); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_text_path (cairo_t *cr) +{ + cairo_text_path (cr, "Cairo"); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_glyph_path (cairo_t *cr) +{ + cairo_glyph_t glyph; + + glyph.index = 65; + glyph.x = 0; + glyph.y = 0; + + cairo_glyph_path (cr, &glyph, 1); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_text_extents (cairo_t *cr) +{ + cairo_text_extents_t extents; + + cairo_text_extents (cr, "Cairo", &extents); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_glyph_extents (cairo_t *cr) +{ + cairo_glyph_t glyph; + cairo_text_extents_t extents; + + glyph.index = 65; + glyph.x = 0; + glyph.y = 0; + + cairo_glyph_extents (cr, &glyph, 1, &extents); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_font_extents (cairo_t *cr) +{ + cairo_font_extents_t extents; + + cairo_font_extents (cr, &extents); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_operator (cairo_t *cr) +{ + cairo_get_operator (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_source (cairo_t *cr) +{ + cairo_get_source (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_tolerance (cairo_t *cr) +{ + cairo_get_tolerance (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_antialias (cairo_t *cr) +{ + cairo_get_antialias (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_has_current_point (cairo_t *cr) +{ + cairo_has_current_point (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_current_point (cairo_t *cr) +{ + double x, y; + + cairo_get_current_point (cr, &x, &y); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_fill_rule (cairo_t *cr) +{ + cairo_get_fill_rule (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_line_width (cairo_t *cr) +{ + cairo_get_line_width (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_line_cap (cairo_t *cr) +{ + cairo_get_line_cap (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_line_join (cairo_t *cr) +{ + cairo_get_line_join (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_miter_limit (cairo_t *cr) +{ + cairo_get_miter_limit (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_dash_count (cairo_t *cr) +{ + cairo_get_dash_count (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_dash (cairo_t *cr) +{ + double dashes[42]; + double offset; + + cairo_get_dash (cr, &dashes[0], &offset); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_matrix (cairo_t *cr) +{ + cairo_matrix_t matrix; + + cairo_get_matrix (cr, &matrix); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_target (cairo_t *cr) +{ + cairo_get_target (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_get_group_target (cairo_t *cr) +{ + cairo_get_group_target (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_copy_path (cairo_t *cr) +{ + cairo_path_destroy (cairo_copy_path (cr)); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_copy_path_flat (cairo_t *cr) +{ + cairo_path_destroy (cairo_copy_path_flat (cr)); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_append_path (cairo_t *cr) +{ + cairo_path_data_t data[3]; + cairo_path_t path; + + path.status = CAIRO_STATUS_SUCCESS; + path.data = &data[0]; + path.num_data = ARRAY_LENGTH(data); + + data[0].header.type = CAIRO_PATH_MOVE_TO; + data[0].header.length = 2; + data[1].point.x = 1; + data[1].point.y = 2; + data[2].header.type = CAIRO_PATH_CLOSE_PATH; + data[2].header.length = 1; + + cairo_append_path (cr, &path); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_create_similar (cairo_surface_t *surface) +{ + cairo_surface_t *similar; + + similar = cairo_surface_create_similar (surface, CAIRO_CONTENT_ALPHA, 100, 100); + + cairo_surface_destroy (similar); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_create_for_rectangle (cairo_surface_t *surface) +{ + cairo_surface_t *similar; + + similar = cairo_surface_create_for_rectangle (surface, 1, 1, 8, 8); + + cairo_surface_destroy (similar); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_reference (cairo_surface_t *surface) +{ + cairo_surface_destroy (cairo_surface_reference (surface)); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_finish (cairo_surface_t *surface) +{ + cairo_surface_finish (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_get_device (cairo_surface_t *surface) +{ + /* cairo_device_t *device = */cairo_surface_get_device (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_get_reference_count (cairo_surface_t *surface) +{ + unsigned int refcount = cairo_surface_get_reference_count (surface); + if (refcount > 0) + return CAIRO_TEST_SUCCESS; + /* inert error surfaces have a refcount of 0 */ + return cairo_surface_status (surface) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_surface_status (cairo_surface_t *surface) +{ + cairo_status_t status = cairo_surface_status (surface); + return status < CAIRO_STATUS_LAST_STATUS ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_surface_get_type (cairo_surface_t *surface) +{ + /* cairo_surface_type_t type = */cairo_surface_get_type (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_get_content (cairo_surface_t *surface) +{ + cairo_content_t content = cairo_surface_get_content (surface); + + switch (content) { + case CAIRO_CONTENT_COLOR: + case CAIRO_CONTENT_ALPHA: + case CAIRO_CONTENT_COLOR_ALPHA: + return CAIRO_TEST_SUCCESS; + default: + return CAIRO_TEST_ERROR; + } +} + +static cairo_test_status_t +test_cairo_surface_set_user_data (cairo_surface_t *surface) +{ + static cairo_user_data_key_t key; + cairo_status_t status; + + status = cairo_surface_set_user_data (surface, &key, &key, NULL); + if (status == CAIRO_STATUS_NO_MEMORY) + return CAIRO_TEST_NO_MEMORY; + else if (status) + return CAIRO_TEST_SUCCESS; + + if (cairo_surface_get_user_data (surface, &key) != &key) + return CAIRO_TEST_ERROR; + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_set_mime_data (cairo_surface_t *surface) +{ + const char *mimetype = "text/x-uri"; + const char *data = "http://www.cairographics.org"; + cairo_status_t status; + + status = cairo_surface_set_mime_data (surface, + mimetype, + (const unsigned char *) data, + strlen (data), + NULL, NULL); + return status ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_surface_get_mime_data (cairo_surface_t *surface) +{ + const char *mimetype = "text/x-uri"; + const unsigned char *data; + unsigned long length; + + cairo_surface_get_mime_data (surface, mimetype, &data, &length); + return data == NULL && length == 0 ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_surface_get_font_options (cairo_surface_t *surface) +{ + cairo_font_options_t *options; + cairo_status_t status; + + options = cairo_font_options_create (); + if (likely (!cairo_font_options_status (options))) + cairo_surface_get_font_options (surface, options); + status = cairo_font_options_status (options); + cairo_font_options_destroy (options); + return status ? CAIRO_TEST_ERROR : CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_flush (cairo_surface_t *surface) +{ + cairo_surface_flush (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_mark_dirty (cairo_surface_t *surface) +{ + cairo_surface_mark_dirty (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface) +{ + cairo_surface_mark_dirty_rectangle (surface, 1, 1, 8, 8); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_set_device_offset (cairo_surface_t *surface) +{ + cairo_surface_set_device_offset (surface, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_get_device_offset (cairo_surface_t *surface) +{ + double x, y; + + cairo_surface_get_device_offset (surface, &x, &y); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_set_fallback_resolution (cairo_surface_t *surface) +{ + cairo_surface_set_fallback_resolution (surface, 42, 42); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_get_fallback_resolution (cairo_surface_t *surface) +{ + double x, y; + + cairo_surface_get_fallback_resolution (surface, &x, &y); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_copy_page (cairo_surface_t *surface) +{ + cairo_surface_copy_page (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_show_page (cairo_surface_t *surface) +{ + cairo_surface_show_page (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_surface_has_show_text_glyphs (cairo_surface_t *surface) +{ + cairo_surface_has_show_text_glyphs (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_image_surface_get_data (cairo_surface_t *surface) +{ + unsigned char *data = cairo_image_surface_get_data (surface); + return data == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_image_surface_get_format (cairo_surface_t *surface) +{ + cairo_format_t format = cairo_image_surface_get_format (surface); + return format == CAIRO_FORMAT_INVALID || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_image_surface_get_width (cairo_surface_t *surface) +{ + unsigned int width = cairo_image_surface_get_width (surface); + return width == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_image_surface_get_height (cairo_surface_t *surface) +{ + unsigned int height = cairo_image_surface_get_height (surface); + return height == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_image_surface_get_stride (cairo_surface_t *surface) +{ + unsigned int stride = cairo_image_surface_get_stride (surface); + return stride == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_IMAGE) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +#if CAIRO_HAS_PNG_FUNCTIONS + +static cairo_test_status_t +test_cairo_surface_write_to_png (cairo_surface_t *surface) +{ + cairo_status_t status; + + status = cairo_surface_write_to_png (surface, "/this/file/will/definitely/not/exist.png"); + + return status ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_status_t +write_func_that_always_fails (void *closure, const unsigned char *data, unsigned int length) +{ + return CAIRO_STATUS_WRITE_ERROR; +} + +static cairo_test_status_t +test_cairo_surface_write_to_png_stream (cairo_surface_t *surface) +{ + cairo_status_t status; + + status = cairo_surface_write_to_png_stream (surface, + write_func_that_always_fails, + NULL); + + return status && status != CAIRO_STATUS_WRITE_ERROR ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +#endif /* CAIRO_HAS_PNG_FUNCTIONS */ + +static cairo_test_status_t +test_cairo_recording_surface_ink_extents (cairo_surface_t *surface) +{ + double x, y, w, h; + + cairo_recording_surface_ink_extents (surface, &x, &y, &w, &h); + return x == 0 && y == 0 && w == 0 && h == 0 ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +#if CAIRO_HAS_TEE_SURFACE + +static cairo_test_status_t +test_cairo_tee_surface_add (cairo_surface_t *surface) +{ + cairo_surface_t *image = cairo_image_surface_create (CAIRO_FORMAT_A8, 10, 10); + + cairo_tee_surface_add (surface, image); + cairo_surface_destroy (image); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_tee_surface_remove (cairo_surface_t *surface) +{ + cairo_surface_t *image = cairo_image_surface_create (CAIRO_FORMAT_A8, 10, 10); + + cairo_tee_surface_remove (surface, image); + cairo_surface_destroy (image); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_tee_surface_index (cairo_surface_t *surface) +{ + cairo_surface_t *master; + cairo_status_t status; + + master = cairo_tee_surface_index (surface, 0); + status = cairo_surface_status (master); + cairo_surface_destroy (master); + return status ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +#endif /* CAIRO_HAS_TEE_SURFACE */ + +#if CAIRO_HAS_GL_SURFACE + +static cairo_test_status_t +test_cairo_gl_surface_set_size (cairo_surface_t *surface) +{ + cairo_gl_surface_set_size (surface, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_gl_surface_get_width (cairo_surface_t *surface) +{ + unsigned int width = cairo_gl_surface_get_width (surface); + return width == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_GL) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_gl_surface_get_height (cairo_surface_t *surface) +{ + unsigned int height = cairo_gl_surface_get_height (surface); + return height == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_GL) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_gl_surface_swapbuffers (cairo_surface_t *surface) +{ + cairo_gl_surface_swapbuffers (surface); + return CAIRO_TEST_SUCCESS; +} + +#endif /* CAIRO_HAS_GL_SURFACE */ + +#if CAIRO_HAS_PDF_SURFACE + +static cairo_test_status_t +test_cairo_pdf_surface_restrict_to_version (cairo_surface_t *surface) +{ + cairo_pdf_surface_restrict_to_version (surface, CAIRO_PDF_VERSION_1_4); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_pdf_surface_set_size (cairo_surface_t *surface) +{ + cairo_pdf_surface_set_size (surface, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +#endif /* CAIRO_HAS_PDF_SURFACE */ + +#if CAIRO_HAS_PS_SURFACE + +static cairo_test_status_t +test_cairo_ps_surface_restrict_to_level (cairo_surface_t *surface) +{ + cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_ps_surface_set_eps (cairo_surface_t *surface) +{ + cairo_ps_surface_set_eps (surface, TRUE); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_ps_surface_get_eps (cairo_surface_t *surface) +{ + cairo_bool_t eps = cairo_ps_surface_get_eps (surface); + return eps ? CAIRO_TEST_ERROR : CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_ps_surface_set_size (cairo_surface_t *surface) +{ + cairo_ps_surface_set_size (surface, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_ps_surface_dsc_comment (cairo_surface_t *surface) +{ + cairo_ps_surface_dsc_comment (surface, "54, 74, 90, 2010"); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface) +{ + cairo_ps_surface_dsc_begin_setup (surface); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface) +{ + cairo_ps_surface_dsc_begin_page_setup (surface); + return CAIRO_TEST_SUCCESS; +} + +#endif /* CAIRO_HAS_PS_SURFACE */ + +#if CAIRO_HAS_QUARTZ_SURFACE + +static cairo_test_status_t +test_cairo_quartz_surface_get_cg_context (cairo_surface_t *surface) +{ + CGContextRef context = cairo_quartz_surface_get_cg_context (surface); + return context == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_QUARTZ) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +#endif /* CAIRO_HAS_QUARTZ_SURFACE */ + +#if CAIRO_HAS_SVG_SURFACE + +static cairo_test_status_t +test_cairo_svg_surface_restrict_to_version (cairo_surface_t *surface) +{ + cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_1); + return CAIRO_TEST_SUCCESS; +} + +#endif /* CAIRO_HAS_SVG_SURFACE */ + +#if CAIRO_HAS_XCB_SURFACE + +static cairo_test_status_t +test_cairo_xcb_surface_set_size (cairo_surface_t *surface) +{ + cairo_xcb_surface_set_size (surface, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_xcb_surface_set_drawable (cairo_surface_t *surface) +{ + cairo_xcb_surface_set_drawable (surface, 0, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +#endif + +#if CAIRO_HAS_XLIB_SURFACE + +static cairo_test_status_t +test_cairo_xlib_surface_set_size (cairo_surface_t *surface) +{ + cairo_xlib_surface_set_size (surface, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_xlib_surface_set_drawable (cairo_surface_t *surface) +{ + cairo_xlib_surface_set_drawable (surface, 0, 5, 5); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_display (cairo_surface_t *surface) +{ + Display *display = cairo_xlib_surface_get_display (surface); + return display == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_screen (cairo_surface_t *surface) +{ + Screen *screen = cairo_xlib_surface_get_screen (surface); + return screen == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_visual (cairo_surface_t *surface) +{ + Visual *visual = cairo_xlib_surface_get_visual (surface); + return visual == NULL || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_drawable (cairo_surface_t *surface) +{ + Drawable drawable = cairo_xlib_surface_get_drawable (surface); + return drawable == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_depth (cairo_surface_t *surface) +{ + int depth = cairo_xlib_surface_get_depth (surface); + return depth == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_width (cairo_surface_t *surface) +{ + int width = cairo_xlib_surface_get_width (surface); + return width == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +static cairo_test_status_t +test_cairo_xlib_surface_get_height (cairo_surface_t *surface) +{ + int height = cairo_xlib_surface_get_height (surface); + return height == 0 || surface_has_type (surface, CAIRO_SURFACE_TYPE_XLIB) ? CAIRO_TEST_SUCCESS : CAIRO_TEST_ERROR; +} + +#endif + +#define TEST(name) { #name, test_ ## name } + +struct { + const char *name; + context_test_func_t func; +} context_tests[] = { + TEST (cairo_reference), + TEST (cairo_get_reference_count), + TEST (cairo_set_user_data), + TEST (cairo_save), + TEST (cairo_push_group), + TEST (cairo_push_group_with_content), + TEST (cairo_set_operator), + TEST (cairo_set_source), + TEST (cairo_set_source_rgb), + TEST (cairo_set_source_rgba), + TEST (cairo_set_source_surface), + TEST (cairo_set_tolerance), + TEST (cairo_set_antialias), + TEST (cairo_set_fill_rule), + TEST (cairo_set_line_width), + TEST (cairo_set_line_cap), + TEST (cairo_set_line_join), + TEST (cairo_set_dash), + TEST (cairo_set_miter_limit), + TEST (cairo_translate), + TEST (cairo_scale), + TEST (cairo_rotate), + TEST (cairo_transform), + TEST (cairo_set_matrix), + TEST (cairo_identity_matrix), + TEST (cairo_user_to_device), + TEST (cairo_user_to_device_distance), + TEST (cairo_device_to_user), + TEST (cairo_device_to_user_distance), + TEST (cairo_new_path), + TEST (cairo_move_to), + TEST (cairo_new_sub_path), + TEST (cairo_line_to), + TEST (cairo_curve_to), + TEST (cairo_arc), + TEST (cairo_arc_negative), + TEST (cairo_rel_move_to), + TEST (cairo_rel_line_to), + TEST (cairo_rel_curve_to), + TEST (cairo_rectangle), + TEST (cairo_close_path), + TEST (cairo_path_extents), + TEST (cairo_paint), + TEST (cairo_paint_with_alpha), + TEST (cairo_mask), + TEST (cairo_mask_surface), + TEST (cairo_stroke), + TEST (cairo_stroke_preserve), + TEST (cairo_fill), + TEST (cairo_fill_preserve), + TEST (cairo_copy_page), + TEST (cairo_show_page), + TEST (cairo_in_stroke), + TEST (cairo_in_fill), + TEST (cairo_in_clip), + TEST (cairo_stroke_extents), + TEST (cairo_fill_extents), + TEST (cairo_reset_clip), + TEST (cairo_clip), + TEST (cairo_clip_preserve), + TEST (cairo_clip_extents), + TEST (cairo_copy_clip_rectangle_list), + TEST (cairo_select_font_face), + TEST (cairo_set_font_size), + TEST (cairo_set_font_matrix), + TEST (cairo_get_font_matrix), + TEST (cairo_set_font_options), + TEST (cairo_get_font_options), + TEST (cairo_set_font_face), + TEST (cairo_set_scaled_font), + TEST (cairo_show_text), + TEST (cairo_show_glyphs), + TEST (cairo_show_text_glyphs), + TEST (cairo_text_path), + TEST (cairo_glyph_path), + TEST (cairo_text_extents), + TEST (cairo_glyph_extents), + TEST (cairo_font_extents), + TEST (cairo_get_operator), + TEST (cairo_get_source), + TEST (cairo_get_tolerance), + TEST (cairo_get_antialias), + TEST (cairo_has_current_point), + TEST (cairo_get_current_point), + TEST (cairo_get_fill_rule), + TEST (cairo_get_line_width), + TEST (cairo_get_line_cap), + TEST (cairo_get_line_join), + TEST (cairo_get_miter_limit), + TEST (cairo_get_dash_count), + TEST (cairo_get_dash), + TEST (cairo_get_matrix), + TEST (cairo_get_target), + TEST (cairo_get_group_target), + TEST (cairo_copy_path), + TEST (cairo_copy_path_flat), + TEST (cairo_append_path), +}; + +#undef TEST + +#define TEST(name, surface_type, sets_status) { #name, test_ ## name, surface_type, sets_status } + +struct { + const char *name; + surface_test_func_t func; + int surface_type; /* cairo_surface_type_t or -1 */ + cairo_bool_t modifies_surface; +} surface_tests[] = { + TEST (cairo_surface_create_similar, -1, FALSE), + TEST (cairo_surface_create_for_rectangle, -1, FALSE), + TEST (cairo_surface_reference, -1, FALSE), + TEST (cairo_surface_finish, -1, TRUE), + TEST (cairo_surface_get_device, -1, FALSE), + TEST (cairo_surface_get_reference_count, -1, FALSE), + TEST (cairo_surface_status, -1, FALSE), + TEST (cairo_surface_get_type, -1, FALSE), + TEST (cairo_surface_get_content, -1, FALSE), + TEST (cairo_surface_set_user_data, -1, FALSE), + TEST (cairo_surface_set_mime_data, -1, TRUE), + TEST (cairo_surface_get_mime_data, -1, FALSE), + TEST (cairo_surface_get_font_options, -1, FALSE), + TEST (cairo_surface_flush, -1, TRUE), + TEST (cairo_surface_mark_dirty, -1, TRUE), + TEST (cairo_surface_mark_dirty_rectangle, -1, TRUE), + TEST (cairo_surface_set_device_offset, -1, TRUE), + TEST (cairo_surface_get_device_offset, -1, FALSE), + TEST (cairo_surface_set_fallback_resolution, -1, TRUE), + TEST (cairo_surface_get_fallback_resolution, -1, FALSE), + TEST (cairo_surface_copy_page, -1, TRUE), + TEST (cairo_surface_show_page, -1, TRUE), + TEST (cairo_surface_has_show_text_glyphs, -1, FALSE), + TEST (cairo_image_surface_get_data, CAIRO_SURFACE_TYPE_IMAGE, FALSE), + TEST (cairo_image_surface_get_format, CAIRO_SURFACE_TYPE_IMAGE, FALSE), + TEST (cairo_image_surface_get_width, CAIRO_SURFACE_TYPE_IMAGE, FALSE), + TEST (cairo_image_surface_get_height, CAIRO_SURFACE_TYPE_IMAGE, FALSE), + TEST (cairo_image_surface_get_stride, CAIRO_SURFACE_TYPE_IMAGE, FALSE), +#if CAIRO_HAS_PNG_FUNCTIONS + TEST (cairo_surface_write_to_png, -1, FALSE), + TEST (cairo_surface_write_to_png_stream, -1, FALSE), +#endif + TEST (cairo_recording_surface_ink_extents, CAIRO_SURFACE_TYPE_RECORDING, FALSE), +#if CAIRO_HAS_TEE_SURFACE + TEST (cairo_tee_surface_add, CAIRO_SURFACE_TYPE_TEE, TRUE), + TEST (cairo_tee_surface_remove, CAIRO_SURFACE_TYPE_TEE, TRUE), + TEST (cairo_tee_surface_index, CAIRO_SURFACE_TYPE_TEE, FALSE), +#endif +#if CAIRO_HAS_GL_SURFACE + TEST (cairo_gl_surface_set_size, CAIRO_SURFACE_TYPE_GL, TRUE), + TEST (cairo_gl_surface_get_width, CAIRO_SURFACE_TYPE_GL, FALSE), + TEST (cairo_gl_surface_get_height, CAIRO_SURFACE_TYPE_GL, FALSE), + TEST (cairo_gl_surface_swapbuffers, CAIRO_SURFACE_TYPE_GL, TRUE), +#endif +#if CAIRO_HAS_PDF_SURFACE + TEST (cairo_pdf_surface_restrict_to_version, CAIRO_SURFACE_TYPE_PDF, TRUE), + TEST (cairo_pdf_surface_set_size, CAIRO_SURFACE_TYPE_PDF, TRUE), +#endif +#if CAIRO_HAS_PS_SURFACE + TEST (cairo_ps_surface_restrict_to_level, CAIRO_SURFACE_TYPE_PS, TRUE), + TEST (cairo_ps_surface_set_eps, CAIRO_SURFACE_TYPE_PS, TRUE), + TEST (cairo_ps_surface_get_eps, CAIRO_SURFACE_TYPE_PS, FALSE), + TEST (cairo_ps_surface_set_size, CAIRO_SURFACE_TYPE_PS, TRUE), + TEST (cairo_ps_surface_dsc_comment, CAIRO_SURFACE_TYPE_PS, TRUE), + TEST (cairo_ps_surface_dsc_begin_setup, CAIRO_SURFACE_TYPE_PS, TRUE), + TEST (cairo_ps_surface_dsc_begin_page_setup, CAIRO_SURFACE_TYPE_PS, TRUE), +#endif +#if CAIRO_HAS_QUARTZ_SURFACE + TEST (cairo_quartz_surface_get_cg_context, CAIRO_SURFACE_TYPE_QUARTZ, FALSE), +#endif +#if CAIRO_HAS_SVG_SURFACE + TEST (cairo_svg_surface_restrict_to_version, CAIRO_SURFACE_TYPE_SVG, TRUE), +#endif +#if CAIRO_HAS_XCB_SURFACE + TEST (cairo_xcb_surface_set_size, CAIRO_SURFACE_TYPE_XCB, TRUE), + TEST (cairo_xcb_surface_set_drawable, CAIRO_SURFACE_TYPE_XCB, TRUE), +#endif +#if CAIRO_HAS_XLIB_SURFACE + TEST (cairo_xlib_surface_set_size, CAIRO_SURFACE_TYPE_XLIB, TRUE), + TEST (cairo_xlib_surface_set_drawable, CAIRO_SURFACE_TYPE_XLIB, TRUE), + TEST (cairo_xlib_surface_get_display, CAIRO_SURFACE_TYPE_XLIB, FALSE), + TEST (cairo_xlib_surface_get_drawable, CAIRO_SURFACE_TYPE_XLIB, FALSE), + TEST (cairo_xlib_surface_get_screen, CAIRO_SURFACE_TYPE_XLIB, FALSE), + TEST (cairo_xlib_surface_get_visual, CAIRO_SURFACE_TYPE_XLIB, FALSE), + TEST (cairo_xlib_surface_get_depth, CAIRO_SURFACE_TYPE_XLIB, FALSE), + TEST (cairo_xlib_surface_get_width, CAIRO_SURFACE_TYPE_XLIB, FALSE), + TEST (cairo_xlib_surface_get_height, CAIRO_SURFACE_TYPE_XLIB, FALSE), +#endif +}; + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_t *cr; + cairo_test_status_t test_status; + cairo_status_t status_before, status_after; + unsigned int i; + + /* Test an error surface */ + for (i = 0; i < ARRAY_LENGTH (surface_tests); i++) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, INT_MAX, INT_MAX); + status_before = cairo_surface_status (surface); + assert (status_before); + + test_status = surface_tests[i].func (surface); + + status_after = cairo_surface_status (surface); + cairo_surface_destroy (surface); + + if (test_status != CAIRO_TEST_SUCCESS) { + cairo_test_log (ctx, + "Failed test %s with %d\n", + surface_tests[i].name, (int) test_status); + return test_status; + } + + if (status_before != status_after) { + cairo_test_log (ctx, + "Failed test %s: Modified surface status from %u (%s) to %u (%s)\n", + surface_tests[i].name, + status_before, cairo_status_to_string (status_before), + status_after, cairo_status_to_string (status_after)); + return CAIRO_TEST_ERROR; + } + } + + /* Test an error context */ + for (i = 0; i < ARRAY_LENGTH (context_tests); i++) { + cr = cairo_create (NULL); + status_before = cairo_status (cr); + assert (status_before); + + test_status = context_tests[i].func (cr); + + status_after = cairo_status (cr); + cairo_destroy (cr); + + if (test_status != CAIRO_TEST_SUCCESS) { + cairo_test_log (ctx, + "Failed test %s with %d\n", + context_tests[i].name, (int) test_status); + return test_status; + } + + if (status_before != status_after) { + cairo_test_log (ctx, + "Failed test %s: Modified context status from %u (%s) to %u (%s)\n", + context_tests[i].name, + status_before, cairo_status_to_string (status_before), + status_after, cairo_status_to_string (status_after)); + return CAIRO_TEST_ERROR; + } + } + + /* Test a context for an error surface */ + for (i = 0; i < ARRAY_LENGTH (context_tests); i++) { + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, INT_MAX, INT_MAX); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + status_before = cairo_status (cr); + assert (status_before); + + test_status = context_tests[i].func (cr); + + status_after = cairo_status (cr); + cairo_destroy (cr); + + if (test_status != CAIRO_TEST_SUCCESS) { + cairo_test_log (ctx, + "Failed test %s with %d\n", + context_tests[i].name, (int) test_status); + return test_status; + } + + if (status_before != status_after) { + cairo_test_log (ctx, + "Failed test %s: Modified context status from %u (%s) to %u (%s)\n", + context_tests[i].name, + status_before, cairo_status_to_string (status_before), + status_after, cairo_status_to_string (status_after)); + return CAIRO_TEST_ERROR; + } + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +test_context (const cairo_test_context_t *ctx, cairo_t *cr, const char *name, unsigned int i) +{ + cairo_test_status_t test_status; + cairo_status_t status_before, status_after; + + /* Make sure that there is a current point */ + cairo_move_to (cr, 0, 0); + + status_before = cairo_status (cr); + test_status = context_tests[i].func (cr); + status_after = cairo_status (cr); + + if (test_status != CAIRO_TEST_SUCCESS) { + cairo_test_log (ctx, + "Failed test %s on %s with %d\n", + context_tests[i].name, name, (int) test_status); + return test_status; + } + + if (status_after != CAIRO_STATUS_SURFACE_FINISHED && status_before != status_after) { + cairo_test_log (ctx, + "Failed test %s on %s: Modified context status from %u (%s) to %u (%s)\n", + context_tests[i].name, name, + status_before, cairo_status_to_string (status_before), + status_after, cairo_status_to_string (status_after)); + return CAIRO_TEST_ERROR; + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *similar, *target; + cairo_test_status_t test_status; + cairo_status_t status; + cairo_t *cr2; + unsigned int i; + + target = cairo_get_target (cr); + + /* Test a finished similar surface */ + for (i = 0; i < ARRAY_LENGTH (surface_tests); i++) { + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + 10, 10); + cairo_surface_finish (similar); + test_status = surface_tests[i].func (similar); + status = cairo_surface_status (similar); + cairo_surface_destroy (similar); + + if (test_status != CAIRO_TEST_SUCCESS) { + cairo_test_log (ctx, + "Failed test %s with %d\n", + surface_tests[i].name, (int) test_status); + return test_status; + } + + if (surface_tests[i].modifies_surface && + strcmp (surface_tests[i].name, "cairo_surface_finish") && + strcmp (surface_tests[i].name, "cairo_surface_flush") && + status != CAIRO_STATUS_SURFACE_FINISHED) { + cairo_test_log (ctx, + "Failed test %s: Finished surface not set into error state\n", + surface_tests[i].name); + return CAIRO_TEST_ERROR; + } + } + + /* Test a context for a finished similar surface */ + for (i = 0; i < ARRAY_LENGTH (context_tests); i++) { + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + 10, 10); + cairo_surface_finish (similar); + cr2 = cairo_create (similar); + test_status = test_context (ctx, cr2, "finished surface", i); + cairo_surface_destroy (similar); + cairo_destroy (cr2); + + if (test_status != CAIRO_TEST_SUCCESS) + return test_status; + } + + /* Test a context for a similar surface finished later */ + for (i = 0; i < ARRAY_LENGTH (context_tests); i++) { + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + 10, 10); + cr2 = cairo_create (similar); + cairo_surface_finish (similar); + test_status = test_context (ctx, cr2, "finished surface after create", i); + cairo_surface_destroy (similar); + cairo_destroy (cr2); + + if (test_status != CAIRO_TEST_SUCCESS) + return test_status; + } + + /* Test a context for a similar surface finished later with a path */ + for (i = 0; i < ARRAY_LENGTH (context_tests); i++) { + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + 10, 10); + cr2 = cairo_create (similar); + cairo_rectangle (cr2, 2, 2, 4, 4); + cairo_surface_finish (similar); + test_status = test_context (ctx, cr2, "finished surface with path", i); + cairo_surface_destroy (similar); + cairo_destroy (cr2); + + if (test_status != CAIRO_TEST_SUCCESS) + return test_status; + } + + /* Test a normal surface for functions that have the wrong type */ + for (i = 0; i < ARRAY_LENGTH (surface_tests); i++) { + cairo_status_t desired_status; + + if (surface_tests[i].surface_type == -1) + continue; + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + 10, 10); + if (cairo_surface_get_type (similar) == (cairo_surface_type_t) surface_tests[i].surface_type) { + cairo_surface_destroy (similar); + continue; + } + + test_status = surface_tests[i].func (similar); + status = cairo_surface_status (similar); + cairo_surface_destroy (similar); + + if (test_status != CAIRO_TEST_SUCCESS) { + cairo_test_log (ctx, + "Failed test %s with %d\n", + surface_tests[i].name, (int) test_status); + return test_status; + } + + desired_status = surface_tests[i].modifies_surface ? CAIRO_STATUS_SURFACE_TYPE_MISMATCH : CAIRO_STATUS_SUCCESS; + if (status != desired_status) { + cairo_test_log (ctx, + "Failed test %s: Surface status should be %u (%s), but is %u (%s)\n", + surface_tests[i].name, + desired_status, cairo_status_to_string (desired_status), + status, cairo_status_to_string (status)); + return CAIRO_TEST_ERROR; + } + } + + /* 565-compatible gray background */ + cairo_set_source_rgb (cr, 0.51613, 0.55555, 0.51613); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (api_special_cases, + "Check surface functions properly handle wrong surface arguments", + "api", /* keywords */ + NULL, /* requirements */ + 10, 10, + preamble, draw) diff --git a/test/arc-direction.c b/test/arc-direction.c new file mode 100644 index 000000000..92c1a8d36 --- /dev/null +++ b/test/arc-direction.c @@ -0,0 +1,105 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE (2 * 20) +#define PAD (2) + +static cairo_test_status_t +draw_arcs (cairo_t *cr) +{ + double start = M_PI/12, stop = 2*start; + + cairo_move_to (cr, SIZE/2, SIZE/2); + cairo_arc (cr, SIZE/2, SIZE/2, SIZE/2, start, stop); + cairo_fill (cr); + + cairo_translate (cr, SIZE+PAD, 0); + cairo_move_to (cr, SIZE/2, SIZE/2); + cairo_arc (cr, SIZE/2, SIZE/2, SIZE/2, 2*M_PI-stop, 2*M_PI-start); + cairo_fill (cr); + + cairo_translate (cr, 0, SIZE+PAD); + cairo_move_to (cr, SIZE/2, SIZE/2); + cairo_arc_negative (cr, SIZE/2, SIZE/2, SIZE/2, 2*M_PI-stop, 2*M_PI-start); + cairo_fill (cr); + + cairo_translate (cr, -SIZE-PAD, 0); + cairo_move_to (cr, SIZE/2, SIZE/2); + cairo_arc_negative (cr, SIZE/2, SIZE/2, SIZE/2, start, stop); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, PAD, PAD); + draw_arcs(cr); + cairo_restore (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_translate (cr, 2*SIZE+3*PAD, 0); + cairo_save (cr); + cairo_translate (cr, 2*SIZE+2*PAD, PAD); + cairo_scale (cr, -1, 1); + draw_arcs(cr); + cairo_restore (cr); + + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_translate (cr, 0, 2*SIZE+3*PAD); + cairo_save (cr); + cairo_translate (cr, 2*SIZE+2*PAD, 2*SIZE+2*PAD); + cairo_scale (cr, -1, -1); + draw_arcs(cr); + cairo_restore (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_translate (cr, -(2*SIZE+3*PAD), 0); + cairo_save (cr); + cairo_translate (cr, PAD, 2*SIZE+2*PAD); + cairo_scale (cr, 1, -1); + draw_arcs(cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (arc_direction, + "Test drawing positive/negative arcs", + "arc, fill", /* keywords */ + NULL, /* requirements */ + 2*(3*PAD + 2*SIZE), 2*(3*PAD + 2*SIZE), + NULL, draw) + diff --git a/test/arc-infinite-loop.c b/test/arc-infinite-loop.c new file mode 100644 index 000000000..8b469eacf --- /dev/null +++ b/test/arc-infinite-loop.c @@ -0,0 +1,61 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" +#include + +#define SIZE 8 + +/* + cairo_arc can hang in an infinite loop if given huge (so big that + adding/subtracting 4*M_PI to them doesn't change the value because + of floating point rounding). + + The purpose of this test is to check that cairo doesn't hang or crash. +*/ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* Check if the code that guarantees start <= end hangs */ + cairo_arc (cr, 0, 0, 1, 1024 / DBL_EPSILON * M_PI, 0); + + /* Check if the code that handles huge angles hangs */ + cairo_arc (cr, 0, 0, 1, 0, 1024 / DBL_EPSILON * M_PI); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (arc_infinite_loop, + "Test cairo_arc with huge angles", + "arc", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/arc-looping-dash.c b/test/arc-looping-dash.c new file mode 100644 index 000000000..ff5556a54 --- /dev/null +++ b/test/arc-looping-dash.c @@ -0,0 +1,79 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define SIZE 32 + +/* + When cairo_arc is used to draw an arc of more than 2pi radians + (i.e. a circle "looping over itself"), various different behaviors + are possible: + + - draw exactly a circle (an arc of 2pi radians) + + - draw an arc such that the current point is the expected one and + that does at least a complete circle (an arc of [2pi, 4pi) + radians) + + - draw an arc with the original number of loops + + This test produces different results for each of these three cases. +*/ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dashes[] = { 0.3, 7 }; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_save (cr); + + cairo_translate (cr, SIZE * .5, SIZE * .5); + cairo_scale (cr, SIZE * 3 / 8., SIZE * 3 / 8.); + + cairo_arc (cr, 0, 0, 1, 0, 11 * M_PI); + + cairo_set_line_width (cr, 8. / SIZE); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dashes, 2, 0); + cairo_stroke (cr); + + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (arc_looping_dash, + "Test cairo_arc for angles describing more than a complete circle", + "arc", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/big-empty-box.c b/test/big-empty-box.c new file mode 100644 index 000000000..4ea91a1ba --- /dev/null +++ b/test/big-empty-box.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * The mystery of the disappearing box, similar to big-little-box. + * + * The issue is that we failed to tighten the initial approximated bounds + * after tessellating the path. + */ + +#include "cairo-test.h" + +#define SIZE 60 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_paint (cr); + + /* Set an unbounded operator so that we can see how accurate the bounded + * extents were. + */ + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 1, 1, 1); + + /* Wind several boxes together that reduce to nothing */ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (big_empty_box, + "Tests that we tighten the bounds after tessellation.", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/big-empty-triangle.c b/test/big-empty-triangle.c new file mode 100644 index 000000000..4c02c87a5 --- /dev/null +++ b/test/big-empty-triangle.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * A variation on + * + * https://bugzilla.mozilla.org/show_bug.cgi?id=668921 + * + * The issue is that we failed to tighten the initial approximated bounds + * after tessellating the path. + */ + +#include "cairo-test.h" + +#define SIZE 60 + +static void +triangle (cairo_t *cr, double x, double y, double h) +{ + cairo_move_to (cr, x, y); + cairo_line_to (cr, x+h/2, y+h); + cairo_line_to (cr, x+h, y); + cairo_close_path (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_paint (cr); + + /* Set an unbounded operator so that we can see how accurate the bounded + * extents were. + */ + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 1, 1, 1); + + /* Wind several triangles together that reduce to nothing */ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + triangle (cr, 0, 0, SIZE); + triangle (cr, 0, 0, SIZE); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (big_empty_triangle, + "Tests that we tighten the bounds after tessellation.", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/big-line.c b/test/big-line.c new file mode 100644 index 000000000..6260fba12 --- /dev/null +++ b/test/big-line.c @@ -0,0 +1,62 @@ +/* + * Copyright © 2008 Novell, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Novell, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Novell, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Larry Ewing + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_move_to (cr, 50, 50); + cairo_rel_line_to (cr, 50000, 50000); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_move_to (cr, 50, 50); + cairo_rel_line_to (cr, -50000, 50000); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_move_to (cr, 50, 50); + cairo_rel_line_to (cr, 50000, -50000); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_move_to (cr, 50, 50); + cairo_rel_line_to (cr, -50000, -50000); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (big_line, + "Test drawing of simple lines with positive and negative coordinates > 2^16", + "stroke, line", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw) diff --git a/test/big-little-box.c b/test/big-little-box.c new file mode 100644 index 000000000..1787ee539 --- /dev/null +++ b/test/big-little-box.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * This attempts to exercise the bug found in + * + * https://bugzilla.mozilla.org/show_bug.cgi?id=668921 + * + * and also identified by Taekyun Kim. + * + * The issue is that we failed to tighten the initial approximated bounds + * after tessellating the path. + */ + +#include "cairo-test.h" + +#define SIZE 60 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_paint (cr); + + /* Set an unbounded operator so that we can see how accurate the bounded + * extents were. + */ + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 1, 1, 1); + + /* Wind several boxes together that reduce to just one */ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_rectangle (cr, SIZE/2 - 20, SIZE/2 - 20, 40, 40); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (big_little_box, + "Tests that we tighten the bounds after tessellation.", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/big-little-triangle.c b/test/big-little-triangle.c new file mode 100644 index 000000000..27eb2325e --- /dev/null +++ b/test/big-little-triangle.c @@ -0,0 +1,76 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * A variation on + * + * https://bugzilla.mozilla.org/show_bug.cgi?id=668921 + * + * The issue is that we failed to tighten the initial approximated bounds + * after tessellating the path. + */ + +#include "cairo-test.h" + +#define SIZE 60 + +static void +triangle (cairo_t *cr, double x, double y, double h) +{ + cairo_move_to (cr, x, y); + cairo_line_to (cr, x+h/2, y+h); + cairo_line_to (cr, x+h, y); + cairo_close_path (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_paint (cr); + + /* Set an unbounded operator so that we can see how accurate the bounded + * extents were. + */ + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 1, 1, 1); + + /* Wind several triangles together that reduce to just one */ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + triangle (cr, 0, 0, SIZE); + triangle (cr, 0, 0, SIZE); + triangle (cr, SIZE/2-20, SIZE/2 - 20, 40); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (big_little_triangle, + "Tests that we tighten the bounds after tessellation.", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/big-trap.c b/test/big-trap.c new file mode 100644 index 000000000..5e11237a8 --- /dev/null +++ b/test/big-trap.c @@ -0,0 +1,92 @@ +/* + * Copyright © 2006 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +/* This test was originally written to exercise a bug in pixman in + * which it would scribble all over memory when given a particular + * (and bogus) trapezoid. However, a recent change to + * _cairo_fixed_from_double changed the details of the bogus trapezoid + * (it overflows in a different way now), so the bug is being masked. + * + * According to Vladimir, (http://lists.freedesktop.org/archives/cairo/2006-November/008482.html): + * + * Before the change, the two trapezoids that were generated were: + * + * Trap[0]: T: 0x80000000 B: 0x80000003 + * L: [(0x000a0000, 0x80000000) (0x00080000, 0x00080000)] + * R: [(0x01360000, 0x80000000) (0x01380000, 0x00080000)] + * Trap[1]: T: 0x80000003 B: 0x00080000 + * L: [(0x000a0000, 0x80000000) (0x00080000, 0x00080000)] + * R: [(0x01360000, 0x80000000) (0x01380000, 0x00080000)] + * + * After the change, the L/R coordinates are identical for both traps, but + * the top and bottom change: + * + * Trap[0]: t: 0x80000000 b: 0xfda80003 + * l: [(0x000a0000, 0x80000000) (0x00080000, 0x00080000)] + * r: [(0x01360000, 0x80000000) (0x01380000, 0x00080000)] + * Trap[1]: t: 0xfda80003 b: 0x00080000 + * l: [(0x000a0000, 0x80000000) (0x00080000, 0x00080000)] + * r: [(0x01360000, 0x80000000) (0x01380000, 0x00080000)] + * + * I think the fix we want here is to rewrite this test to call + * directly into pixman with the trapezoid of interest, (which will + * require adding a new way to configure cairo for "testing" which + * will prevent the hiding of internal library symbols. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0,0,0); + + /* Note that without the clip, this doesn't crash... */ + cairo_new_path (cr); + cairo_rectangle (cr, 0, 0, width, height); + cairo_clip (cr); + + cairo_new_path (cr); + cairo_line_to (cr, 8.0, 8.0); + cairo_line_to (cr, 312.0, 8.0); + cairo_line_to (cr, 310.0, 31378756.2666666666); + cairo_line_to (cr, 10.0, 31378756.2666666666); + cairo_line_to (cr, 8.0, 8.0); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +/* XFAIL: range overflow of fixed-point */ +CAIRO_TEST (big_trap, + "Test oversize trapezoid with a clip region" + "\nTest needs to be adjusted to trigger the original bug", + "trap", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw) diff --git a/test/bilevel-image.c b/test/bilevel-image.c new file mode 100644 index 000000000..4feff0e7a --- /dev/null +++ b/test/bilevel-image.c @@ -0,0 +1,63 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define RGBx 0xffff0000, 0xff00ff00, 0xff0000ff, 0x00000000 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + uint32_t data[] = { + RGBx, RGBx, RGBx, + RGBx, RGBx, RGBx, + RGBx, RGBx, RGBx, + RGBx, RGBx, RGBx, + }; + cairo_surface_t *mask; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + mask = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_ARGB32, 12, 4, 48); + + cairo_set_source_surface (cr, mask, 0, 0); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + + cairo_paint (cr); + + cairo_surface_finish (mask); /* data goes out of scope */ + cairo_surface_destroy (mask); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bilevel_image, + "Test that PS can embed an RGB image with a bilevel alpha channel.", + "alpha, ps", /* keywords */ + NULL, /* requirements */ + 12, 4, + NULL, draw) diff --git a/test/bitmap-font.c b/test/bitmap-font.c new file mode 100644 index 000000000..0ec9b3de5 --- /dev/null +++ b/test/bitmap-font.c @@ -0,0 +1,218 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include +#include +#include + +#include +#include +#include + +#define FONT "6x13.pcf" +#define TEXT_SIZE 13 + +static cairo_bool_t +font_extents_equal (const cairo_font_extents_t *A, + const cairo_font_extents_t *B) +{ + return + CAIRO_TEST_DOUBLE_EQUALS (A->ascent, B->ascent) && + CAIRO_TEST_DOUBLE_EQUALS (A->descent, B->descent) && + CAIRO_TEST_DOUBLE_EQUALS (A->height, B->height) && + CAIRO_TEST_DOUBLE_EQUALS (A->max_x_advance, B->max_x_advance) && + CAIRO_TEST_DOUBLE_EQUALS (A->max_y_advance, B->max_y_advance); +} + +static cairo_test_status_t +check_font_extents (const cairo_test_context_t *ctx, cairo_t *cr, const char *comment) +{ + cairo_font_extents_t font_extents, ref_font_extents = {11, 2, 13, 6, 0}; + cairo_status_t status; + + memset (&font_extents, 0xff, sizeof (cairo_font_extents_t)); + cairo_font_extents (cr, &font_extents); + + status = cairo_status (cr); + if (status) + return cairo_test_status_from_status (ctx, status); + + if (! font_extents_equal (&font_extents, &ref_font_extents)) { + cairo_test_log (ctx, "Error: %s: cairo_font_extents(); extents (%g, %g, %g, %g, %g)\n", + comment, + font_extents.ascent, font_extents.descent, + font_extents.height, + font_extents.max_x_advance, font_extents.max_y_advance); + return CAIRO_TEST_FAILURE; + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + FcPattern *pattern; + cairo_font_face_t *font_face; + cairo_font_extents_t font_extents; + cairo_font_options_t *font_options; + cairo_status_t status; + char *filename; + int face_count; + struct stat stat_buf; + + xasprintf (&filename, "%s/%s", ctx->srcdir, FONT); + + if (stat (filename, &stat_buf) || ! S_ISREG (stat_buf.st_mode)) { + cairo_test_log (ctx, "Error finding font: %s: file not found?\n", filename); + return CAIRO_TEST_FAILURE; + } + + pattern = FcFreeTypeQuery ((unsigned char *)filename, 0, NULL, &face_count); + free (filename); + if (! pattern) { + cairo_test_log (ctx, "FcFreeTypeQuery failed.\n"); + return cairo_test_status_from_status (ctx, CAIRO_STATUS_NO_MEMORY); + } + + font_face = cairo_ft_font_face_create_for_pattern (pattern); + FcPatternDestroy (pattern); + + status = cairo_font_face_status (font_face); + if (status) { + cairo_test_log (ctx, "Error creating font face for %s: %s\n", + filename, + cairo_status_to_string (status)); + return cairo_test_status_from_status (ctx, status); + } + + if (cairo_font_face_get_type (font_face) != CAIRO_FONT_TYPE_FT) { + cairo_test_log (ctx, "Unexpected value from cairo_font_face_get_type: %d (expected %d)\n", + cairo_font_face_get_type (font_face), CAIRO_FONT_TYPE_FT); + cairo_font_face_destroy (font_face); + return CAIRO_TEST_FAILURE; + } + + cairo_set_font_face (cr, font_face); + cairo_font_face_destroy (font_face); + cairo_set_font_size (cr, 13); + + font_options = cairo_font_options_create (); + +#define CHECK_FONT_EXTENTS(comment) do {\ + cairo_test_status_t test_status; \ + test_status = check_font_extents (ctx, cr, (comment)); \ + if (test_status != CAIRO_TEST_SUCCESS) { \ + cairo_font_options_destroy (font_options); \ + return test_status; \ + } \ +} while (0) + + cairo_font_extents (cr, &font_extents); + CHECK_FONT_EXTENTS ("default"); + + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_ON); + cairo_set_font_options (cr, font_options); + + CHECK_FONT_EXTENTS ("HINT_METRICS_ON"); + + cairo_move_to (cr, 1, font_extents.ascent - 1); + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); /* blue */ + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_ON HINT_STYLE_NONE"); + cairo_show_text (cr, "the "); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_SLIGHT); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_ON HINT_STYLE_SLIGHT"); + cairo_show_text (cr, "quick "); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_MEDIUM); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_ON HINT_STYLE_MEDIUM"); + cairo_show_text (cr, "brown"); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_FULL); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_ON HINT_STYLE_FULL"); + cairo_show_text (cr, " fox"); + + /* Switch from show_text to text_path/fill to exercise bug #7889 */ + cairo_text_path (cr, " jumps over a lazy dog"); + cairo_fill (cr); + + /* And test it rotated as well for the sake of bug #7888 */ + + cairo_translate (cr, width, height); + cairo_rotate (cr, M_PI); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_DEFAULT); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_OFF"); + + cairo_move_to (cr, 1, font_extents.height - font_extents.descent - 1); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_OFF HINT_STYLE_NONE"); + cairo_show_text (cr, "the "); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_SLIGHT); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_OFF HINT_STYLE_SLIGHT"); + cairo_show_text (cr, "quick"); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_MEDIUM); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_OFF HINT_STYLE_MEDIUM"); + cairo_show_text (cr, " brown"); + + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_FULL); + cairo_set_font_options (cr, font_options); + CHECK_FONT_EXTENTS ("HINT_METRICS_OFF HINT_STYLE_FULL"); + cairo_show_text (cr, " fox"); + + cairo_text_path (cr, " jumps over"); + cairo_text_path (cr, " a lazy dog"); + cairo_fill (cr); + + cairo_font_options_destroy (font_options); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bitmap_font, + "Test drawing with a font consisting only of bitmaps" + "\nThe PDF and PS backends embed a slightly distorted font for the rotated case.", + "text", /* keywords */ + "ft", /* requirements */ + 246 + 1, 2 * TEXT_SIZE, + NULL, draw) diff --git a/test/buffer-diff.c b/test/buffer-diff.c new file mode 100644 index 000000000..087ac459b --- /dev/null +++ b/test/buffer-diff.c @@ -0,0 +1,262 @@ +/* imagediff - Compare two images + * + * Copyright © 2004 Richard D. Worth + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Richard Worth + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Richard Worth makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * RICHARD WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL RICHARD WORTH BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Richard D. Worth */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include "cairo-test.h" + +#include "pdiff.h" +#include "buffer-diff.h" + +/* Don't allow any differences greater than this value, even if pdiff + * claims that the images are identical */ +#define PERCEPTUAL_DIFF_THRESHOLD 25 + +/* Compare two buffers, returning the number of pixels that are + * different and the maximum difference of any single color channel in + * result_ret. + * + * This function should be rewritten to compare all formats supported by + * cairo_format_t instead of taking a mask as a parameter. + */ +static void +buffer_diff_core (const unsigned char *_buf_a, int stride_a, + const unsigned char *_buf_b, int stride_b, + unsigned char *_buf_diff, int stride_diff, + int width, + int height, + uint32_t mask, + buffer_diff_result_t *result_ret) +{ + const uint32_t *buf_a = (const uint32_t*) _buf_a; + const uint32_t *buf_b = (const uint32_t*) _buf_b; + uint32_t *buf_diff = (uint32_t*) _buf_diff; + int x, y; + buffer_diff_result_t result = {0, 0}; + + stride_a /= sizeof (uint32_t); + stride_b /= sizeof (uint32_t); + stride_diff /= sizeof (uint32_t); + for (y = 0; y < height; y++) { + const uint32_t *row_a = buf_a + y * stride_a; + const uint32_t *row_b = buf_b + y * stride_b; + uint32_t *row = buf_diff + y * stride_diff; + + for (x = 0; x < width; x++) { + /* check if the pixels are the same */ + if ((row_a[x] & mask) != (row_b[x] & mask)) { + int channel; + uint32_t diff_pixel = 0; + + /* calculate a difference value for all 4 channels */ + for (channel = 0; channel < 4; channel++) { + int value_a = (row_a[x] >> (channel*8)) & 0xff; + int value_b = (row_b[x] >> (channel*8)) & 0xff; + unsigned int diff; + diff = abs (value_a - value_b); + if (diff > result.max_diff) + result.max_diff = diff; + diff *= 4; /* emphasize */ + if (diff) + diff += 128; /* make sure it's visible */ + if (diff > 255) + diff = 255; + diff_pixel |= diff << (channel*8); + } + + result.pixels_changed++; + if ((diff_pixel & 0x00ffffff) == 0) { + /* alpha only difference, convert to luminance */ + uint8_t alpha = diff_pixel >> 24; + diff_pixel = alpha * 0x010101; + } + row[x] = diff_pixel; + } else { + row[x] = 0; + } + row[x] |= 0xff000000; /* Set ALPHA to 100% (opaque) */ + } + } + + *result_ret = result; +} + +/* Compares two image surfaces + * + * Provides number of pixels changed and maximum single-channel + * difference in result. + * + * Also fills in a "diff" surface intended to visually show where the + * images differ. + */ +static void +compare_surfaces (const cairo_test_context_t *ctx, + cairo_surface_t *surface_a, + cairo_surface_t *surface_b, + cairo_surface_t *surface_diff, + buffer_diff_result_t *result) +{ + /* These default values were taken straight from the + * perceptualdiff program. We'll probably want to tune these as + * necessary. */ + double gamma = 2.2; + double luminance = 100.0; + double field_of_view = 45.0; + int discernible_pixels_changed; + + /* First, we run cairo's old buffer_diff algorithm which looks for + * pixel-perfect images, (we do this first since the test suite + * runs about 3x slower if we run pdiff_compare first). + */ + buffer_diff_core (cairo_image_surface_get_data (surface_a), + cairo_image_surface_get_stride (surface_a), + cairo_image_surface_get_data (surface_b), + cairo_image_surface_get_stride (surface_b), + cairo_image_surface_get_data (surface_diff), + cairo_image_surface_get_stride (surface_diff), + cairo_image_surface_get_width (surface_a), + cairo_image_surface_get_height (surface_a), + cairo_surface_get_content (surface_a) & CAIRO_CONTENT_ALPHA ? 0xffffffff : 0x00ffffff, + result); + if (result->pixels_changed == 0) + return; + + cairo_test_log (ctx, + "%d pixels differ (with maximum difference of %d) from reference image\n", + result->pixels_changed, result->max_diff); + + /* Then, if there are any different pixels, we give the pdiff code + * a crack at the images. If it decides that there are no visually + * discernible differences in any pixels, then we accept this + * result as good enough. + * + * Only let pdiff have a crack at the comparison if the max difference + * is lower than a threshold, otherwise some problems could be masked. + */ + if (result->max_diff < PERCEPTUAL_DIFF_THRESHOLD) { + discernible_pixels_changed = pdiff_compare (surface_a, surface_b, + gamma, luminance, field_of_view); + if (discernible_pixels_changed == 0) { + result->pixels_changed = 0; + cairo_test_log (ctx, + "But perceptual diff finds no visually discernible difference.\n" + "Accepting result.\n"); + } + } +} + +void +buffer_diff_noalpha (const unsigned char *buf_a, + const unsigned char *buf_b, + unsigned char *buf_diff, + int width, + int height, + int stride, + buffer_diff_result_t *result) +{ + buffer_diff_core(buf_a, stride, + buf_b, stride, + buf_diff, stride, + width, height, + 0x00ffffff, + result); +} + +static cairo_bool_t +same_size (cairo_surface_t *a, cairo_surface_t *b) +{ + unsigned int width_a, height_a; + unsigned int width_b, height_b; + + width_a = cairo_image_surface_get_width (a); + height_a = cairo_image_surface_get_height (a); + + width_b = cairo_image_surface_get_width (b); + height_b = cairo_image_surface_get_height (b); + + return width_a == width_b && height_a == height_b; +} + +/* Image comparison code courtesy of Richard Worth + * Returns number of pixels changed, (or -1 on error). + * Also saves a "diff" image intended to visually show where the + * images differ. + * + * The return value simply indicates whether a check was successfully + * made, (as opposed to a file-not-found condition or similar). It + * does not indicate anything about how much the images differ. For + * that, see result. + * + * One failure mode is if the two images provided do not have the same + * dimensions. In this case, this function will return + * CAIRO_STATUS_SURFACE_TYPE_MISMATCH (which is a bit of an abuse, but + * oh well). + */ +cairo_status_t +image_diff (const cairo_test_context_t *ctx, + cairo_surface_t *surface_a, + cairo_surface_t *surface_b, + cairo_surface_t *surface_diff, + buffer_diff_result_t *result) +{ + if (cairo_surface_status (surface_a)) + return cairo_surface_status (surface_a); + + if (cairo_surface_status (surface_b)) + return cairo_surface_status (surface_b); + + if (cairo_surface_status (surface_diff)) + return cairo_surface_status (surface_diff); + + if (! same_size (surface_a, surface_b) || + ! same_size (surface_a, surface_diff)) + { + cairo_test_log (ctx, "Error: Image size mismatch\n"); + return CAIRO_STATUS_SURFACE_TYPE_MISMATCH; + } + + compare_surfaces (ctx, surface_a, surface_b, surface_diff, result); + + return CAIRO_STATUS_SUCCESS; +} + +cairo_bool_t +image_diff_is_failure (const buffer_diff_result_t *result, + unsigned int tolerance) +{ + return result->pixels_changed && + result->max_diff > tolerance; +} diff --git a/test/buffer-diff.h b/test/buffer-diff.h new file mode 100644 index 000000000..2cbb8959c --- /dev/null +++ b/test/buffer-diff.h @@ -0,0 +1,73 @@ +/* imagediff - Compare two images + * + * Copyright © 2004 Richard D. Worth + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the authors + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * The authors make no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Richard D. Worth + * Carl Worth + */ + +#ifndef BUFFER_DIFF_H +#define BUFFER_DIFF_H + +#include "cairo-test.h" + +typedef struct _buffer_diff_result { + unsigned int pixels_changed; + unsigned int max_diff; +} buffer_diff_result_t; + +/* Compares two image buffers ignoring the alpha channel. + * + * Provides number of pixels changed and maximum single-channel + * difference in result. + * + * Also fills in a "diff" buffer intended to visually show where the + * images differ. + */ +void +buffer_diff_noalpha (const unsigned char *buf_a, + const unsigned char *buf_b, + unsigned char *buf_diff, + int width, + int height, + int stride, + buffer_diff_result_t *result); + +/* The central algorithm to compare two images, and return the differences + * in the surface_diff. + * + * Provides number of pixels changed and maximum single-channel + * difference in result. + */ +cairo_status_t +image_diff (const cairo_test_context_t *ctx, + cairo_surface_t *surface_a, + cairo_surface_t *surface_b, + cairo_surface_t *surface_diff, + buffer_diff_result_t *result); + +cairo_bool_t +image_diff_is_failure (const buffer_diff_result_t *result, + unsigned int tolerance); + +#endif diff --git a/test/bug-40410.c b/test/bug-40410.c new file mode 100644 index 000000000..2d6e512c0 --- /dev/null +++ b/test/bug-40410.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2011 Krzysztof KosiÅ„ski + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Krzysztof KosiÅ„ski + */ + +#include "cairo-test.h" + +#define WIDTH 300 +#define HEIGHT 100 + +/* + * The bug appears to be triggered if: + * 1. There is more than one subpath + * 2. All subpaths are axis-aligned rectangles + * 3. Only one of the subpaths is within surface bounds + * + * Tweaking any of the coordinates so that there is at least one + * non-axis-aligned segment or removing the second subpath (the one that is + * outside the surface bounds) causes the bug to disappear. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + cairo_move_to (cr, 10.3, 10.6); + cairo_line_to (cr, 10.3, 150.2); + cairo_line_to (cr, 290.1, 150.2); + cairo_line_to (cr, 290.1, 10.6); + cairo_close_path (cr); + + cairo_move_to (cr, 10.3, 180.7); + cairo_line_to (cr, 10.3, 230.2); + cairo_line_to (cr, 290.1, 230.2); + cairo_line_to (cr, 290.1, 180.7); + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_40410, + "Exercises a bug found in 1.10.2 (and never again!)", + "fill", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/bug-51910.c b/test/bug-51910.c new file mode 100644 index 000000000..37881de3e --- /dev/null +++ b/test/bug-51910.c @@ -0,0 +1,91 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "cairo-test.h" + +/* An error in xlib pattern transformation discovered by Albertas VyÅ¡niauskas */ + +static cairo_pattern_t * +source(void) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + cairo_t *cr; + int i; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 32, 32); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_set_line_width (cr, 2); + + for (i = -1; i <= 8; i++) { + cairo_move_to (cr, -34 + 8*i, 34); + cairo_rel_line_to (cr, 36, -36); + cairo_stroke (cr); + } + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + + cairo_matrix_init_translate(&matrix, 14.1, 0); + cairo_pattern_set_matrix(pattern, &matrix); + + return pattern; +} + + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + int i; + + cairo_paint (cr); + + pattern = source (); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + for (i = 0; i < 8; i++) { + cairo_rectangle (cr, 3.5*i, 32*i, 256, 32); + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_51910, + "A bug in the xlib pattern transformation", + " paint", /* keywords */ + NULL, /* requirements */ + 256, 256, + NULL, draw) diff --git a/test/bug-84115.c b/test/bug-84115.c new file mode 100644 index 000000000..4db113c5c --- /dev/null +++ b/test/bug-84115.c @@ -0,0 +1,61 @@ +/* + * Copyright © 2011 Krzysztof KosiÅ„ski + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Krzysztof KosiÅ„ski + */ + +#include "cairo-test.h" + +#define WIDTH 800 +#define HEIGHT 800 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double lw = 800; + int n = 0; + + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + cairo_set_source_rgba (cr, 0, 0, 0, .4); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + do { + cairo_set_line_width(cr, lw); + cairo_arc(cr, WIDTH/2, HEIGHT/2, lw/2, + 2*M_PI*(13*n + 1) / 130, 2*M_PI*(13*n + 12) / 130); + cairo_stroke(cr); + + n++; + lw /= 1.1; + } while (lw > 0.5); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_84115, + "Exercises a bug found in stroke generation using trapezoids", + "stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/bug-bo-collins.c b/test/bug-bo-collins.c new file mode 100644 index 000000000..cf6d688e3 --- /dev/null +++ b/test/bug-bo-collins.c @@ -0,0 +1,76 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, 0, 0); + cairo_save (cr); + cairo_rectangle (cr, 10, 10, 20, 20); + cairo_rectangle (cr, 20, 10, -10, 10); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, 40, 0); + cairo_save (cr); + cairo_rectangle (cr, 10, 10, 20, 20); + cairo_rectangle (cr, 30, 10, -10, 10); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, 0, 40); + cairo_save (cr); + cairo_rectangle (cr, 10, 10, 20, 20); + cairo_rectangle (cr, 30, 20, -10, 10); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, -40, 0); + cairo_save (cr); + cairo_rectangle (cr, 10, 10, 20, 20); + cairo_rectangle (cr, 20, 20, -10, 10); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_bo_collins, + "Exercises a bug discovered by S. Christian Collins", + "clip, rectangular", /* keywords */ + NULL, /* requirements */ + 80, 80, + NULL, draw) diff --git a/test/bug-bo-rectangular.c b/test/bug-bo-rectangular.c new file mode 100644 index 000000000..08e2e494a --- /dev/null +++ b/test/bug-bo-rectangular.c @@ -0,0 +1,67 @@ +/* + * Copyright 2010 Red Hat + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +static void +rect (cairo_t *cr, int x1, int y1, int x2, int y2) +{ + cairo_rectangle (cr, x1, y1, x2 - x1, y2 - y1); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_scale (cr, 1./256, 1./256); + + rect (cr, 0, 0, 29696, 7680); + rect (cr, 0, 0, -15360, 15360); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1, 0.5, 0); + cairo_paint (cr); + + rect (cr, 9984, 0, 2969, 3840); + rect (cr, 0, 3840, 9472, 7680); + cairo_clip (cr); + + rect (cr, 0, 3840, 3584, 7680); + cairo_set_source_rgb (cr, 1, 0, 0.5); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_bo_rectangular, + "Tests a bug found by Benjamin Otte in the rectangular tessellator", + "tessellator", /* keywords */ + NULL, /* requirements */ + 300, 300, + NULL, draw) diff --git a/test/bug-bo-ricotz.c b/test/bug-bo-ricotz.c new file mode 100644 index 000000000..9524d208d --- /dev/null +++ b/test/bug-bo-ricotz.c @@ -0,0 +1,74 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* An assertion failure found by Rico Tzschichholz */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_rectangle (cr, 10, 55,165, 1); + cairo_rectangle (cr, 174, 55,1, 413); + cairo_rectangle (cr, 10, 56, 1, 413); + cairo_rectangle (cr, 10, 469, 165, 1); + cairo_clip (cr); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_move_to (cr, 10, 57); + cairo_curve_to (cr, 10, 55.894531, 10.894531, 55, 12, 55); + cairo_line_to (cr, 173, 55); + cairo_curve_to (cr, 174.105469, 55, 175, 55.894531, 175, 57); + cairo_line_to (cr, 175, 468); + cairo_curve_to (cr, 175, 469.105469, 174.105469, 470, 173, 470); + cairo_line_to (cr, 12, 470); + cairo_curve_to (cr, 10.894531, 470, 10, 469.105469, 10, 468); + + cairo_move_to (cr, 11, 57); + cairo_curve_to (cr, 11, 56.449219, 11.449219, 56, 12, 56); + cairo_line_to (cr, 173, 56); + cairo_curve_to (cr, 173.550781, 56, 174, 56.449219, 174, 57); + cairo_line_to (cr, 174, 468); + cairo_curve_to (cr, 174, 468.550781, 173.550781, 469, 173, 469); + cairo_line_to (cr, 12, 469); + cairo_curve_to (cr, 11.449219, 469, 11, 468.550781, 11, 468); + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_bo_ricotz, + "Exercises a bug discovered by Rico Tzschichholz", + "clip, fill", /* keywords */ + NULL, /* requirements */ + 649, 480, + NULL, draw) diff --git a/test/bug-extents.c b/test/bug-extents.c new file mode 100644 index 000000000..4edb4a548 --- /dev/null +++ b/test/bug-extents.c @@ -0,0 +1,59 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 0, -25); + + cairo_move_to (cr, 50, 200); + cairo_curve_to (cr, 50, 150, 100, 50, 150, 50); + cairo_curve_to (cr, 200, 50, 250, 250, 200, 250); + cairo_curve_to (cr, 150, 250, 200, 50, 50, 100); + cairo_curve_to (cr, -100, 150, 200, 150, 200, 200); + cairo_curve_to (cr, 200, 250, 50, 250, 50, 200); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_extents, + "Tests a bug in the computation of approximate extents", + "extents", /* keywords */ + NULL, /* requirements */ + 250, 250, + NULL, draw) diff --git a/test/bug-seams.c b/test/bug-seams.c new file mode 100644 index 000000000..01e84ff06 --- /dev/null +++ b/test/bug-seams.c @@ -0,0 +1,120 @@ +/* + * Copyright 2010 Soeren Sandmann Pedersen + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Soeren Sandmann + */ + +/* Exercises a case of seam appearing between two polygons in the image + * backend but not in xlib [using pixman]. + * + * The test case draws two abutting quads both individually on the + * leftm combining them with operator ADD, and in one go on the right. + * Both methods should show no signs of seaming at the common edge + * between the two quads, but the individually drawn ones have a + * slight seam. + * + * The cause of the seam is that there are slight differences in the + * output of the analytical coverage rasterization and the + * supersampling rasterization methods, both employed by + * cairo-tor-scan-converter. When drawn individually, the scan + * converter gets a partial view of the geometry at a time, so it ends + * up making different decisions about which scanlines it rasterizes + * with which method, compared to when the geometry is draw all at + * once. Though both methods produce seamless results individually + * (where applicable), they don't produce bit-exact identical results, + * and hence we get seaming where they meet. + */ + +#include "cairo-test.h" + +static void +draw_quad (cairo_t *cr, + double x1, double y1, double x2, double y2, + double x3, double y3, double x4, double y4) +{ + cairo_move_to (cr, x1, y1); + cairo_line_to (cr, x2, y2); + cairo_line_to (cr, x3, y3); + cairo_line_to (cr, x4, y4); + cairo_close_path (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_scale (cr, 20, 20); + cairo_translate (cr, 5, 1); + + /* On the left side, we have two quads drawn one at a time and + * combined with OPERATOR_ADD. This should be seamless, but + * isn't. */ + cairo_push_group (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + + cairo_set_source_rgb (cr, 0, 0.6, 0); + draw_quad (cr, + 1.50, 1.50, + 2.64, 1.63, + 1.75, 2.75, + 0.55, 2.63); + cairo_fill (cr); + draw_quad (cr, + 0.55, 2.63, + 1.75, 2.75, + 0.98, 4.11, + -0.35, 4.05); + cairo_fill (cr); + + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_paint (cr); + + /* On the right side, we have the same two quads drawn both at the + * same time. This is seamless. */ + cairo_translate (cr, 10, 0); + + cairo_set_source_rgb (cr, 0, 0.6, 0); + draw_quad (cr, + 1.50, 1.50, + 2.64, 1.63, + 1.75, 2.75, + 0.55, 2.63); + draw_quad (cr, + 0.55, 2.63, + 1.75, 2.75, + 0.98, 4.11, + -0.35, 4.05); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_seams, + "Check the fidelity of the rasterisation.", + "raster", /* keywords */ + "target=raster", /* requirements */ + 500, 300, + NULL, draw) diff --git a/test/bug-source-cu.c b/test/bug-source-cu.c new file mode 100644 index 000000000..4c1e2bc63 --- /dev/null +++ b/test/bug-source-cu.c @@ -0,0 +1,81 @@ +/* + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "cairo-test.h" + +static cairo_pattern_t * +create_pattern (cairo_surface_t *target) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_t *cr; + cairo_matrix_t m; + + surface = cairo_surface_create_similar(target, + cairo_surface_get_content (target), + 1000, 600); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint(cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy(cr); + + cairo_matrix_init_translate (&m, 0, 0.1); // y offset must be non-integer + cairo_pattern_set_matrix (pattern, &m); + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_new_path (cr); + cairo_move_to (cr, 10, 400.1); + cairo_line_to (cr, 990, 400.1); + cairo_line_to (cr, 990, 600); + cairo_line_to (cr, 10, 600); + cairo_close_path (cr); + + pattern = create_pattern (cairo_get_target (cr)); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_fill(cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_source_cu, + "Exercises a bug discovered in the tracking of unbounded source extents", + "fill", /* keywords */ + NULL, /* requirements */ + 1000, 600, + NULL, draw) diff --git a/test/bug-spline.c b/test/bug-spline.c new file mode 100644 index 000000000..9a54a7c8c --- /dev/null +++ b/test/bug-spline.c @@ -0,0 +1,95 @@ +/* cc `pkg-config --cflags --libs cairo` cairo-spline-image.c -o cairo-spline-image */ + +/* Copyright © 2005 Carl Worth + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "cairo-test.h" + +#define WIDE_LINE_WIDTH 160 +#define NARROW_LINE_WIDTH 2 + +/* A spline showing bugs in the "contour-based stroking" in cairo 1.12 */ +static const struct spline { + struct { double x, y; } pt[5]; + double line_width; + double rgba[4]; +} splines[] = { + { + { + { 172.25, 156.185 }, + { 177.225, 164.06 }, + { 176.5, 157.5 }, + { 175.5, 159.5 }, + }, + WIDE_LINE_WIDTH, + { 1, 1, 1, 1 }, + }, + { + { + { 571.25, 247.185 }, + { 78.225, 224.06 }, + { 129.5, 312.5 }, + { 210.5, 224.5 }, + }, + NARROW_LINE_WIDTH, + { 1, 0, 0, 1 }, + } +}; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + unsigned n; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE); + + for (n = 0; n < ARRAY_LENGTH(splines); n++) { + cairo_set_line_width (cr, splines[n].line_width); + cairo_set_source_rgba (cr, + splines[n].rgba[0], + splines[n].rgba[1], + splines[n].rgba[2], + splines[n].rgba[3]); + + cairo_move_to (cr, splines[n].pt[0].x, splines[n].pt[0].y); + cairo_curve_to (cr, + splines[n].pt[1].x, splines[n].pt[1].y, + splines[n].pt[2].x, splines[n].pt[2].y, + splines[n].pt[3].x, splines[n].pt[3].y); + + cairo_stroke (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (bug_spline, + "Exercises a bug in the stroking of splines", + "spline, stroke", /* keywords */ + NULL, /* requirements */ + 300, 300, + NULL, draw) diff --git a/test/cairo-test-constructors.c b/test/cairo-test-constructors.c new file mode 100644 index 000000000..51ef9341b --- /dev/null +++ b/test/cairo-test-constructors.c @@ -0,0 +1,1139 @@ +/* WARNING: Autogenerated file - see ./make-cairo-test-constructors.sh! */ + +#include "cairo-test-private.h" + +void _cairo_test_runner_register_tests (void); + +extern void _register_a1_bug (void); +extern void _register_a1_clip_paint (void); +extern void _register_a1_clip_fill (void); +extern void _register_a1_clip_fill_equal (void); +extern void _register_a1_clip_stroke (void); +extern void _register_a1_fill (void); +extern void _register_a1_image_sample (void); +extern void _register_a1_mask (void); +extern void _register_a1_mask_sample (void); +extern void _register_a1_sample (void); +extern void _register_a1_traps_sample (void); +extern void _register_a1_rasterisation_rectangles (void); +extern void _register_a1_rasterisation_triangles (void); +extern void _register_a8_clear (void); +extern void _register_a8_mask (void); +extern void _register_aliasing (void); +extern void _register_alpha_similar (void); +extern void _register_arc_direction (void); +extern void _register_arc_infinite_loop (void); +extern void _register_arc_looping_dash (void); +extern void _register_api_special_cases (void); +extern void _register_big_line (void); +extern void _register_big_empty_box (void); +extern void _register_big_empty_triangle (void); +extern void _register_big_little_box (void); +extern void _register_big_little_triangle (void); +extern void _register_bug_spline (void); +extern void _register_big_trap (void); +extern void _register_bilevel_image (void); +extern void _register_bug_40410 (void); +extern void _register_bug_51910 (void); +extern void _register_bug_84115 (void); +extern void _register_bug_bo_rectangular (void); +extern void _register_bug_bo_collins (void); +extern void _register_bug_bo_ricotz (void); +extern void _register_bug_source_cu (void); +extern void _register_bug_extents (void); +extern void _register_bug_seams (void); +extern void _register_caps (void); +extern void _register_caps_2 (void); +extern void _register_caps_1 (void); +extern void _register_caps_05 (void); +extern void _register_checkerboard (void); +extern void _register_caps_joins (void); +extern void _register_caps_joins_2 (void); +extern void _register_caps_joins_1 (void); +extern void _register_caps_joins_05 (void); +extern void _register_caps_joins_alpha (void); +extern void _register_caps_joins_curve (void); +extern void _register_caps_tails_curve (void); +extern void _register_caps_sub_paths (void); +extern void _register_clear (void); +extern void _register_clear_source (void); +extern void _register_clip_all (void); +extern void _register_clip_complex_bug61492 (void); +extern void _register_clip_complex_shape_eo_mono (void); +extern void _register_clip_complex_shape_eo_aa (void); +extern void _register_clip_contexts (void); +extern void _register_clip_disjoint (void); +extern void _register_clip_disjoint_hatching (void); +extern void _register_clip_disjoint_quad (void); +extern void _register_clip_device_offset (void); +extern void _register_clip_double_free (void); +extern void _register_clip_stroke_unbounded (void); +extern void _register_clip_fill_nz_unbounded (void); +extern void _register_clip_fill_eo_unbounded (void); +extern void _register_clip_empty (void); +extern void _register_clip_empty_group (void); +extern void _register_clip_empty_save (void); +extern void _register_clip_fill (void); +extern void _register_clip_fill_no_op (void); +extern void _register_clip_fill_rule (void); +extern void _register_a1_clip_fill_rule (void); +extern void _register_clip_fill_rule_pixel_aligned (void); +extern void _register_clip_group_shapes_aligned_rectangles (void); +extern void _register_clip_group_shapes_unaligned_rectangles (void); +extern void _register_clip_group_shapes_circles (void); +extern void _register_clip_image (void); +extern void _register_clip_intersect (void); +extern void _register_clip_mixed_antialias (void); +extern void _register_clip_nesting (void); +extern void _register_clip_operator (void); +extern void _register_clip_push_group (void); +extern void _register_clip_polygons (void); +extern void _register_clip_rectilinear (void); +extern void _register_clip_shape (void); +extern void _register_clip_stroke (void); +extern void _register_clip_stroke_no_op (void); +extern void _register_clip_text (void); +extern void _register_clip_twice (void); +extern void _register_clip_twice_rectangle (void); +extern void _register_clip_unbounded (void); +extern void _register_clip_zero (void); +extern void _register_clipped_group (void); +extern void _register_clipped_surface (void); +extern void _register_close_path (void); +extern void _register_close_path_current_point (void); +extern void _register_composite_integer_translate_source (void); +extern void _register_composite_integer_translate_over (void); +extern void _register_composite_integer_translate_over_repeat (void); +extern void _register_copy_disjoint (void); +extern void _register_copy_path (void); +extern void _register_coverage_rectangles (void); +extern void _register_coverage_rhombus (void); +extern void _register_coverage_intersecting_quads (void); +extern void _register_coverage_intersecting_triangles (void); +extern void _register_coverage_row_triangles (void); +extern void _register_coverage_column_triangles (void); +extern void _register_coverage_triangles (void); +extern void _register_coverage_abutting (void); +extern void _register_create_for_stream (void); +extern void _register_create_from_png (void); +extern void _register_create_from_png_stream (void); +extern void _register_culled_glyphs (void); +extern void _register_curve_to_as_line_to (void); +extern void _register_dash_caps_joins (void); +extern void _register_dash_curve (void); +extern void _register_dash_infinite_loop (void); +extern void _register_dash_no_dash (void); +extern void _register_dash_offset (void); +extern void _register_dash_offset_negative (void); +extern void _register_dash_scale (void); +extern void _register_dash_state (void); +extern void _register_dash_zero_length (void); +extern void _register_degenerate_arc (void); +extern void _register_degenerate_arcs (void); +extern void _register_degenerate_curve_to (void); +extern void _register_degenerate_dash (void); +extern void _register_degenerate_linear_gradient (void); +extern void _register_degenerate_path (void); +extern void _register_degenerate_pen (void); +extern void _register_degenerate_radial_gradient (void); +extern void _register_degenerate_rel_curve_to (void); +extern void _register_degenerate_solid_dash (void); +extern void _register_drunkard_tails (void); +extern void _register_device_offset (void); +extern void _register_device_offset_fractional (void); +extern void _register_device_offset_positive (void); +extern void _register_device_offset_scale (void); +extern void _register_error_setters (void); +extern void _register_extend_pad (void); +extern void _register_extend_pad_border (void); +extern void _register_extend_pad_similar (void); +extern void _register_extend_reflect (void); +extern void _register_extend_reflect_similar (void); +extern void _register_extend_repeat (void); +extern void _register_extend_repeat_similar (void); +extern void _register_extended_blend (void); +extern void _register_extended_blend_alpha (void); +extern void _register_extended_blend_mask (void); +extern void _register_extended_blend_alpha_mask (void); +extern void _register_extended_blend_solid (void); +extern void _register_extended_blend_solid_alpha (void); +extern void _register_fallback (void); +extern void _register_fill_alpha (void); +extern void _register_fill_alpha_pattern (void); +extern void _register_fill_and_stroke (void); +extern void _register_fill_and_stroke_alpha (void); +extern void _register_fill_and_stroke_alpha_add (void); +extern void _register_fill_degenerate_sort_order (void); +extern void _register_fill_disjoint (void); +extern void _register_fill_empty (void); +extern void _register_fill_image (void); +extern void _register_fill_missed_stop (void); +extern void _register_fill_rule (void); +extern void _register_filter_bilinear_extents (void); +extern void _register_filter_nearest_offset (void); +extern void _register_filter_nearest_transformed (void); +extern void _register_finer_grained_fallbacks (void); +extern void _register_font_face_get_type (void); +extern void _register_font_matrix_translation (void); +extern void _register_font_options (void); +extern void _register_glyph_cache_pressure (void); +extern void _register_get_and_set (void); +extern void _register_get_clip (void); +extern void _register_get_group_target (void); +extern void _register_get_path_extents (void); +extern void _register_gradient_alpha (void); +extern void _register_gradient_constant_alpha (void); +extern void _register_gradient_zero_stops (void); +extern void _register_gradient_zero_stops_mask (void); +extern void _register_group_clip (void); +extern void _register_group_paint (void); +extern void _register_group_state (void); +extern void _register_group_unaligned (void); +extern void _register_half_coverage_rectangles (void); +extern void _register_half_coverage_triangles (void); +extern void _register_halo (void); +extern void _register_halo_transform (void); +extern void _register_hatchings (void); +extern void _register_horizontal_clip (void); +extern void _register_huge_linear (void); +extern void _register_huge_radial (void); +extern void _register_image_surface_source (void); +extern void _register_image_bug_710072_aligned (void); +extern void _register_image_bug_710072_unaligned (void); +extern void _register_implicit_close (void); +extern void _register_infinite_join (void); +extern void _register_in_fill_empty_trapezoid (void); +extern void _register_in_fill_trapezoid (void); +extern void _register_invalid_matrix (void); +extern void _register_inverse_text (void); +extern void _register_inverted_clip (void); +extern void _register_joins (void); +extern void _register_joins_loop (void); +extern void _register_joins_star (void); +extern void _register_joins_retrace (void); +extern void _register_large_clip (void); +extern void _register_large_font (void); +extern void _register_large_source (void); +extern void _register_large_source_roi (void); +extern void _register_large_twin_antialias_mixed (void); +extern void _register_leaky_dash (void); +extern void _register_leaky_dashed_rectangle (void); +extern void _register_leaky_dashed_stroke (void); +extern void _register_leaky_polygon (void); +extern void _register_line_width (void); +extern void _register_a1_line_width (void); +extern void _register_line_width_large_overlap (void); +extern void _register_line_width_large_overlap_offset (void); +extern void _register_line_width_large_overlap_rotated (void); +extern void _register_line_width_large_overlap_flipped (void); +extern void _register_line_width_large_overlap_flopped (void); +extern void _register_line_width_large_overlap_dashed (void); +extern void _register_line_width_overlap (void); +extern void _register_line_width_overlap_offset (void); +extern void _register_line_width_overlap_rotated (void); +extern void _register_line_width_overlap_flipped (void); +extern void _register_line_width_overlap_flopped (void); +extern void _register_line_width_overlap_dashed (void); +extern void _register_line_width_scale (void); +extern void _register_line_width_tolerance (void); +extern void _register_line_width_zero (void); +extern void _register_linear_gradient (void); +extern void _register_linear_gradient_extend (void); +extern void _register_linear_gradient_large (void); +extern void _register_linear_gradient_one_stop (void); +extern void _register_linear_gradient_reflect (void); +extern void _register_linear_gradient_subset (void); +extern void _register_linear_step_function (void); +extern void _register_linear_uniform (void); +extern void _register_long_dashed_lines (void); +extern void _register_long_lines (void); +extern void _register_map_all_to_image (void); +extern void _register_map_bit_to_image (void); +extern void _register_map_to_image_fill (void); +extern void _register_mask (void); +extern void _register_mask_alpha (void); +extern void _register_mask_ctm (void); +extern void _register_mask_glyphs (void); +extern void _register_mask_surface_ctm (void); +extern void _register_mask_transformed_image (void); +extern void _register_mask_transformed_similar (void); +extern void _register_mesh_pattern (void); +extern void _register_mesh_pattern_accuracy (void); +extern void _register_mesh_pattern_conical (void); +extern void _register_mesh_pattern_control_points (void); +extern void _register_mesh_pattern_fold (void); +extern void _register_mesh_pattern_overlap (void); +extern void _register_mesh_pattern_transformed (void); +extern void _register_mime_data (void); +extern void _register_mime_surface_api (void); +extern void _register_miter_precision (void); +extern void _register_move_to_show_surface (void); +extern void _register_negative_stride_image (void); +extern void _register_new_sub_path (void); +extern void _register_nil_surface (void); +extern void _register_operator (void); +extern void _register_operator_alpha (void); +extern void _register_operator_alpha_alpha (void); +extern void _register_operator_clear (void); +extern void _register_operator_source (void); +extern void _register_outline_tolerance (void); +extern void _register_over_above_source (void); +extern void _register_over_around_source (void); +extern void _register_over_below_source (void); +extern void _register_over_between_source (void); +extern void _register_overlapping_boxes (void); +extern void _register_overlapping_glyphs (void); +extern void _register_overlapping_dash_caps (void); +extern void _register_paint (void); +extern void _register_paint_clip_fill_mono (void); +extern void _register_paint_clip_fill_aa (void); +extern void _register_paint_repeat (void); +extern void _register_paint_source_alpha (void); +extern void _register_paint_with_alpha (void); +extern void _register_paint_with_alpha_solid_clip (void); +extern void _register_paint_with_alpha_clip (void); +extern void _register_paint_with_alpha_clip_mask (void); +extern void _register_paint_with_alpha_group_clip (void); +extern void _register_partial_clip_text_top (void); +extern void _register_partial_clip_text_bottom (void); +extern void _register_partial_clip_text_left (void); +extern void _register_partial_clip_text_right (void); +extern void _register_partial_coverage_rectangles (void); +extern void _register_partial_coverage_intersecting_quads (void); +extern void _register_partial_coverage_intersecting_triangles (void); +extern void _register_partial_coverage_triangles (void); +extern void _register_partial_coverage_overlap_three_quarter_triangles (void); +extern void _register_partial_coverage_overlap_half_triangles_eo (void); +extern void _register_partial_coverage_overlap_half_triangles (void); +extern void _register_partial_coverage_half_triangles (void); +extern void _register_partial_coverage_reference (void); +extern void _register_partial_coverage_three_quarter_reference (void); +extern void _register_partial_coverage_half_reference (void); +extern void _register_pass_through (void); +extern void _register_path_append (void); +extern void _register_path_currentpoint (void); +extern void _register_path_stroke_twice (void); +extern void _register_path_precision (void); +extern void _register_pattern_get_type (void); +extern void _register_pattern_getters (void); +extern void _register_pdf_isolated_group (void); +extern void _register_pixman_downscale_fast_96 (void); +extern void _register_pixman_downscale_fast_95 (void); +extern void _register_pixman_downscale_fast_24 (void); +extern void _register_pixman_downscale_good_96 (void); +extern void _register_pixman_downscale_good_95 (void); +extern void _register_pixman_downscale_good_24 (void); +extern void _register_pixman_downscale_best_96 (void); +extern void _register_pixman_downscale_best_95 (void); +extern void _register_pixman_downscale_best_24 (void); +extern void _register_pixman_downscale_nearest_96 (void); +extern void _register_pixman_downscale_nearest_95 (void); +extern void _register_pixman_downscale_nearest_24 (void); +extern void _register_pixman_downscale_bilinear_96 (void); +extern void _register_pixman_downscale_bilinear_95 (void); +extern void _register_pixman_downscale_bilinear_24 (void); +extern void _register_pixman_rotate (void); +extern void _register_png (void); +extern void _register_push_group (void); +extern void _register_push_group_color (void); +extern void _register_push_group_path_offset (void); +extern void _register_radial_gradient (void); +extern void _register_radial_gradient_mask (void); +extern void _register_radial_gradient_source (void); +extern void _register_radial_gradient_mask_source (void); +extern void _register_radial_gradient_one_stop (void); +extern void _register_radial_gradient_extend (void); +extern void _register_radial_outer_focus (void); +extern void _register_random_clip (void); +extern void _register_random_intersections_eo (void); +extern void _register_random_intersections_nonzero (void); +extern void _register_random_intersections_curves_eo (void); +extern void _register_random_intersections_curves_nz (void); +extern void _register_raster_source (void); +extern void _register_record_paint (void); +extern void _register_record_paint_alpha (void); +extern void _register_record_paint_alpha_solid_clip (void); +extern void _register_record_paint_alpha_clip (void); +extern void _register_record_paint_alpha_clip_mask (void); +extern void _register_record_fill_alpha (void); +extern void _register_record_select_font_face (void); +extern void _register_record_self_intersecting (void); +extern void _register_record_text_transform (void); +extern void _register_record1414x_paint (void); +extern void _register_record1414x_paint_alpha (void); +extern void _register_record1414x_paint_alpha_solid_clip (void); +extern void _register_record1414x_paint_alpha_clip (void); +extern void _register_record1414x_paint_alpha_clip_mask (void); +extern void _register_record1414x_fill_alpha (void); +extern void _register_record1414x_select_font_face (void); +extern void _register_record1414x_self_intersecting (void); +extern void _register_record1414x_text_transform (void); +extern void _register_record2x_paint (void); +extern void _register_record2x_paint_alpha (void); +extern void _register_record2x_paint_alpha_solid_clip (void); +extern void _register_record2x_paint_alpha_clip (void); +extern void _register_record2x_paint_alpha_clip_mask (void); +extern void _register_record2x_fill_alpha (void); +extern void _register_record2x_select_font_face (void); +extern void _register_record2x_self_intersecting (void); +extern void _register_record2x_text_transform (void); +extern void _register_record90_paint (void); +extern void _register_record90_paint_alpha (void); +extern void _register_record90_paint_alpha_solid_clip (void); +extern void _register_record90_paint_alpha_clip (void); +extern void _register_record90_paint_alpha_clip_mask (void); +extern void _register_record90_fill_alpha (void); +extern void _register_record90_select_font_face (void); +extern void _register_record90_self_intersecting (void); +extern void _register_record90_text_transform (void); +extern void _register_recordflip_whole_paint (void); +extern void _register_recordflip_whole_paint_alpha (void); +extern void _register_recordflip_whole_paint_alpha_solid_clip (void); +extern void _register_recordflip_whole_paint_alpha_clip (void); +extern void _register_recordflip_whole_paint_alpha_clip_mask (void); +extern void _register_recordflip_whole_fill_alpha (void); +extern void _register_recordflip_whole_select_font_face (void); +extern void _register_recordflip_whole_self_intersecting (void); +extern void _register_recordflip_whole_text_transform (void); +extern void _register_recordflip_paint (void); +extern void _register_recordflip_paint_alpha (void); +extern void _register_recordflip_paint_alpha_solid_clip (void); +extern void _register_recordflip_paint_alpha_clip (void); +extern void _register_recordflip_paint_alpha_clip_mask (void); +extern void _register_recordflip_fill_alpha (void); +extern void _register_recordflip_select_font_face (void); +extern void _register_recordflip_self_intersecting (void); +extern void _register_recordflip_text_transform (void); +extern void _register_record_extend_none (void); +extern void _register_record_extend_pad (void); +extern void _register_record_extend_repeat (void); +extern void _register_record_extend_reflect (void); +extern void _register_record_extend_none_similar (void); +extern void _register_record_extend_pad_similar (void); +extern void _register_record_extend_repeat_similar (void); +extern void _register_record_extend_reflect_similar (void); +extern void _register_record_mesh (void); +extern void _register_recording_surface_over (void); +extern void _register_recording_surface_source (void); +extern void _register_recording_surface_extend_none (void); +extern void _register_recording_surface_extend_repeat (void); +extern void _register_recording_surface_extend_reflect (void); +extern void _register_recording_surface_extend_pad (void); +extern void _register_rectangle_rounding_error (void); +extern void _register_rectilinear_fill (void); +extern void _register_rectilinear_grid (void); +extern void _register_a1_rectilinear_grid (void); +extern void _register_rectilinear_miter_limit (void); +extern void _register_rectilinear_dash (void); +extern void _register_rectilinear_dash_scale (void); +extern void _register_rectilinear_dash_scale_unaligned (void); +extern void _register_rectilinear_stroke (void); +extern void _register_reflected_stroke (void); +extern void _register_rel_path (void); +extern void _register_rgb24_ignore_alpha (void); +extern void _register_rotate_image_surface_paint (void); +extern void _register_clip_rotate_image_surface_paint (void); +extern void _register_rotate_clip_image_surface_paint (void); +extern void _register_rotate_stroke_box (void); +extern void _register_rotated_clip (void); +extern void _register_rounded_rectangle_fill (void); +extern void _register_rounded_rectangle_stroke (void); +extern void _register_sample_vertical (void); +extern void _register_sample_horizontal (void); +extern void _register_sample_diagonal (void); +extern void _register_scale_down_source_surface_paint (void); +extern void _register_scale_offset_image (void); +extern void _register_scale_offset_similar (void); +extern void _register_scale_source_surface_paint (void); +extern void _register_scaled_font_zero_matrix (void); +extern void _register_stroke_ctm_caps (void); +extern void _register_stroke_clipped (void); +extern void _register_stroke_image (void); +extern void _register_stroke_open_box (void); +extern void _register_select_font_face (void); +extern void _register_select_font_no_show_text (void); +extern void _register_self_copy (void); +extern void _register_self_copy_overlap (void); +extern void _register_self_intersecting (void); +extern void _register_set_source (void); +extern void _register_show_glyphs_advance (void); +extern void _register_show_glyphs_many (void); +extern void _register_show_text_current_point (void); +extern void _register_shape_general_convex (void); +extern void _register_shape_sierpinski (void); +extern void _register_simple_edge (void); +extern void _register_skew_extreme (void); +extern void _register_smask (void); +extern void _register_smask_fill (void); +extern void _register_smask_image_mask (void); +extern void _register_smask_mask (void); +extern void _register_smask_paint (void); +extern void _register_smask_stroke (void); +extern void _register_smask_text (void); +extern void _register_solid_pattern_cache_stress (void); +extern void _register_source_clip (void); +extern void _register_source_clip_scale (void); +extern void _register_source_surface_scale_paint (void); +extern void _register_spline_decomposition (void); +extern void _register_stride_12_image (void); +extern void _register_stroke_pattern (void); +extern void _register_subsurface (void); +extern void _register_subsurface_image_repeat (void); +extern void _register_subsurface_repeat (void); +extern void _register_subsurface_reflect (void); +extern void _register_subsurface_pad (void); +extern void _register_subsurface_modify_child (void); +extern void _register_subsurface_modify_parent (void); +extern void _register_subsurface_outside_target (void); +extern void _register_subsurface_scale (void); +extern void _register_subsurface_similar_repeat (void); +extern void _register_surface_finish_twice (void); +extern void _register_surface_pattern (void); +extern void _register_surface_pattern_big_scale_down (void); +extern void _register_surface_pattern_operator (void); +extern void _register_surface_pattern_scale_down (void); +extern void _register_surface_pattern_scale_down_extend_repeat (void); +extern void _register_surface_pattern_scale_down_extend_none (void); +extern void _register_surface_pattern_scale_down_extend_reflect (void); +extern void _register_surface_pattern_scale_down_extend_pad (void); +extern void _register_surface_pattern_scale_up (void); +extern void _register_text_antialias_gray (void); +extern void _register_text_antialias_none (void); +extern void _register_text_antialias_subpixel (void); +extern void _register_text_antialias_subpixel_rgb (void); +extern void _register_text_antialias_subpixel_bgr (void); +extern void _register_text_antialias_subpixel_vrgb (void); +extern void _register_text_antialias_subpixel_vbgr (void); +extern void _register_text_cache_crash (void); +extern void _register_text_glyph_range (void); +extern void _register_text_pattern (void); +extern void _register_text_rotate (void); +extern void _register_text_transform (void); +extern void _register_text_zero_len (void); +extern void _register_tighten_bounds (void); +extern void _register_tiger (void); +extern void _register_a1_tiger (void); +extern void _register_toy_font_face (void); +extern void _register_transforms (void); +extern void _register_translate_show_surface (void); +extern void _register_trap_clip (void); +extern void _register_twin (void); +extern void _register_twin_antialias_gray (void); +extern void _register_twin_antialias_mixed (void); +extern void _register_twin_antialias_none (void); +extern void _register_twin_antialias_subpixel (void); +extern void _register_unaligned_box (void); +extern void _register_unantialiased_shapes (void); +extern void _register_unbounded_operator (void); +extern void _register_unclosed_strokes (void); +extern void _register_user_data (void); +extern void _register_user_font (void); +extern void _register_user_font_mask (void); +extern void _register_user_font_proxy (void); +extern void _register_user_font_rescale (void); +extern void _register_world_map (void); +extern void _register_world_map_stroke (void); +extern void _register_world_map_fill (void); +extern void _register_white_in_noop (void); +extern void _register_xcb_huge_image_shm (void); +extern void _register_xcb_huge_subimage (void); +extern void _register_xcb_stress_cache (void); +extern void _register_xcb_snapshot_assert (void); +extern void _register_xcomposite_projection (void); +extern void _register_xlib_expose_event (void); +extern void _register_zero_alpha (void); +extern void _register_zero_mask (void); +extern void _register_pthread_same_source (void); +extern void _register_pthread_show_text (void); +extern void _register_pthread_similar (void); +extern void _register_bitmap_font (void); +extern void _register_ft_font_create_for_ft_face (void); +extern void _register_ft_show_glyphs_positioning (void); +extern void _register_ft_show_glyphs_table (void); +extern void _register_ft_text_vertical_layout_type1 (void); +extern void _register_ft_text_vertical_layout_type3 (void); +extern void _register_ft_text_antialias_none (void); +extern void _register_pdf_features (void); +extern void _register_pdf_mime_data (void); +extern void _register_pdf_surface_source (void); +extern void _register_ps_eps (void); +extern void _register_ps_features (void); +extern void _register_ps_surface_source (void); +extern void _register_svg_surface (void); +extern void _register_svg_clip (void); +extern void _register_svg_surface_source (void); +extern void _register_xcb_surface_source (void); +extern void _register_xlib_surface (void); +extern void _register_xlib_surface_source (void); +extern void _register_get_xrender_format (void); +extern void _register_multi_page (void); +extern void _register_fallback_resolution (void); + +void +_cairo_test_runner_register_tests (void) +{ + _register_a1_bug (); + _register_a1_clip_paint (); + _register_a1_clip_fill (); + _register_a1_clip_fill_equal (); + _register_a1_clip_stroke (); + _register_a1_fill (); + _register_a1_image_sample (); + _register_a1_mask (); + _register_a1_mask_sample (); + _register_a1_sample (); + _register_a1_traps_sample (); + _register_a1_rasterisation_rectangles (); + _register_a1_rasterisation_triangles (); + _register_a8_clear (); + _register_a8_mask (); + _register_aliasing (); + _register_alpha_similar (); + _register_arc_direction (); + _register_arc_infinite_loop (); + _register_arc_looping_dash (); + _register_api_special_cases (); + _register_big_line (); + _register_big_empty_box (); + _register_big_empty_triangle (); + _register_big_little_box (); + _register_big_little_triangle (); + _register_bug_spline (); + _register_big_trap (); + _register_bilevel_image (); + _register_bug_40410 (); + _register_bug_51910 (); + _register_bug_84115 (); + _register_bug_bo_rectangular (); + _register_bug_bo_collins (); + _register_bug_bo_ricotz (); + _register_bug_source_cu (); + _register_bug_extents (); + _register_bug_seams (); + _register_caps (); + _register_caps_2 (); + _register_caps_1 (); + _register_caps_05 (); + _register_checkerboard (); + _register_caps_joins (); + _register_caps_joins_2 (); + _register_caps_joins_1 (); + _register_caps_joins_05 (); + _register_caps_joins_alpha (); + _register_caps_joins_curve (); + _register_caps_tails_curve (); + _register_caps_sub_paths (); + _register_clear (); + _register_clear_source (); + _register_clip_all (); + _register_clip_complex_bug61492 (); + _register_clip_complex_shape_eo_mono (); + _register_clip_complex_shape_eo_aa (); + _register_clip_contexts (); + _register_clip_disjoint (); + _register_clip_disjoint_hatching (); + _register_clip_disjoint_quad (); + _register_clip_device_offset (); + _register_clip_double_free (); + _register_clip_stroke_unbounded (); + _register_clip_fill_nz_unbounded (); + _register_clip_fill_eo_unbounded (); + _register_clip_empty (); + _register_clip_empty_group (); + _register_clip_empty_save (); + _register_clip_fill (); + _register_clip_fill_no_op (); + _register_clip_fill_rule (); + _register_a1_clip_fill_rule (); + _register_clip_fill_rule_pixel_aligned (); + _register_clip_group_shapes_aligned_rectangles (); + _register_clip_group_shapes_unaligned_rectangles (); + _register_clip_group_shapes_circles (); + _register_clip_image (); + _register_clip_intersect (); + _register_clip_mixed_antialias (); + _register_clip_nesting (); + _register_clip_operator (); + _register_clip_push_group (); + _register_clip_polygons (); + _register_clip_rectilinear (); + _register_clip_shape (); + _register_clip_stroke (); + _register_clip_stroke_no_op (); + _register_clip_text (); + _register_clip_twice (); + _register_clip_twice_rectangle (); + _register_clip_unbounded (); + _register_clip_zero (); + _register_clipped_group (); + _register_clipped_surface (); + _register_close_path (); + _register_close_path_current_point (); + _register_composite_integer_translate_source (); + _register_composite_integer_translate_over (); + _register_composite_integer_translate_over_repeat (); + _register_copy_disjoint (); + _register_copy_path (); + _register_coverage_rectangles (); + _register_coverage_rhombus (); + _register_coverage_intersecting_quads (); + _register_coverage_intersecting_triangles (); + _register_coverage_row_triangles (); + _register_coverage_column_triangles (); + _register_coverage_triangles (); + _register_coverage_abutting (); + _register_create_for_stream (); + _register_create_from_png (); + _register_create_from_png_stream (); + _register_culled_glyphs (); + _register_curve_to_as_line_to (); + _register_dash_caps_joins (); + _register_dash_curve (); + _register_dash_infinite_loop (); + _register_dash_no_dash (); + _register_dash_offset (); + _register_dash_offset_negative (); + _register_dash_scale (); + _register_dash_state (); + _register_dash_zero_length (); + _register_degenerate_arc (); + _register_degenerate_arcs (); + _register_degenerate_curve_to (); + _register_degenerate_dash (); + _register_degenerate_linear_gradient (); + _register_degenerate_path (); + _register_degenerate_pen (); + _register_degenerate_radial_gradient (); + _register_degenerate_rel_curve_to (); + _register_degenerate_solid_dash (); + _register_drunkard_tails (); + _register_device_offset (); + _register_device_offset_fractional (); + _register_device_offset_positive (); + _register_device_offset_scale (); + _register_error_setters (); + _register_extend_pad (); + _register_extend_pad_border (); + _register_extend_pad_similar (); + _register_extend_reflect (); + _register_extend_reflect_similar (); + _register_extend_repeat (); + _register_extend_repeat_similar (); + _register_extended_blend (); + _register_extended_blend_alpha (); + _register_extended_blend_mask (); + _register_extended_blend_alpha_mask (); + _register_extended_blend_solid (); + _register_extended_blend_solid_alpha (); + _register_fallback (); + _register_fill_alpha (); + _register_fill_alpha_pattern (); + _register_fill_and_stroke (); + _register_fill_and_stroke_alpha (); + _register_fill_and_stroke_alpha_add (); + _register_fill_degenerate_sort_order (); + _register_fill_disjoint (); + _register_fill_empty (); + _register_fill_image (); + _register_fill_missed_stop (); + _register_fill_rule (); + _register_filter_bilinear_extents (); + _register_filter_nearest_offset (); + _register_filter_nearest_transformed (); + _register_finer_grained_fallbacks (); + _register_font_face_get_type (); + _register_font_matrix_translation (); + _register_font_options (); + _register_glyph_cache_pressure (); + _register_get_and_set (); + _register_get_clip (); + _register_get_group_target (); + _register_get_path_extents (); + _register_gradient_alpha (); + _register_gradient_constant_alpha (); + _register_gradient_zero_stops (); + _register_gradient_zero_stops_mask (); + _register_group_clip (); + _register_group_paint (); + _register_group_state (); + _register_group_unaligned (); + _register_half_coverage_rectangles (); + _register_half_coverage_triangles (); + _register_halo (); + _register_halo_transform (); + _register_hatchings (); + _register_horizontal_clip (); + _register_huge_linear (); + _register_huge_radial (); + _register_image_surface_source (); + _register_image_bug_710072_aligned (); + _register_image_bug_710072_unaligned (); + _register_implicit_close (); + _register_infinite_join (); + _register_in_fill_empty_trapezoid (); + _register_in_fill_trapezoid (); + _register_invalid_matrix (); + _register_inverse_text (); + _register_inverted_clip (); + _register_joins (); + _register_joins_loop (); + _register_joins_star (); + _register_joins_retrace (); + _register_large_clip (); + _register_large_font (); + _register_large_source (); + _register_large_source_roi (); + _register_large_twin_antialias_mixed (); + _register_leaky_dash (); + _register_leaky_dashed_rectangle (); + _register_leaky_dashed_stroke (); + _register_leaky_polygon (); + _register_line_width (); + _register_a1_line_width (); + _register_line_width_large_overlap (); + _register_line_width_large_overlap_offset (); + _register_line_width_large_overlap_rotated (); + _register_line_width_large_overlap_flipped (); + _register_line_width_large_overlap_flopped (); + _register_line_width_large_overlap_dashed (); + _register_line_width_overlap (); + _register_line_width_overlap_offset (); + _register_line_width_overlap_rotated (); + _register_line_width_overlap_flipped (); + _register_line_width_overlap_flopped (); + _register_line_width_overlap_dashed (); + _register_line_width_scale (); + _register_line_width_tolerance (); + _register_line_width_zero (); + _register_linear_gradient (); + _register_linear_gradient_extend (); + _register_linear_gradient_large (); + _register_linear_gradient_one_stop (); + _register_linear_gradient_reflect (); + _register_linear_gradient_subset (); + _register_linear_step_function (); + _register_linear_uniform (); + _register_long_dashed_lines (); + _register_long_lines (); + _register_map_all_to_image (); + _register_map_bit_to_image (); + _register_map_to_image_fill (); + _register_mask (); + _register_mask_alpha (); + _register_mask_ctm (); + _register_mask_glyphs (); + _register_mask_surface_ctm (); + _register_mask_transformed_image (); + _register_mask_transformed_similar (); + _register_mesh_pattern (); + _register_mesh_pattern_accuracy (); + _register_mesh_pattern_conical (); + _register_mesh_pattern_control_points (); + _register_mesh_pattern_fold (); + _register_mesh_pattern_overlap (); + _register_mesh_pattern_transformed (); + _register_mime_data (); + _register_mime_surface_api (); + _register_miter_precision (); + _register_move_to_show_surface (); + _register_negative_stride_image (); + _register_new_sub_path (); + _register_nil_surface (); + _register_operator (); + _register_operator_alpha (); + _register_operator_alpha_alpha (); + _register_operator_clear (); + _register_operator_source (); + _register_outline_tolerance (); + _register_over_above_source (); + _register_over_around_source (); + _register_over_below_source (); + _register_over_between_source (); + _register_overlapping_boxes (); + _register_overlapping_glyphs (); + _register_overlapping_dash_caps (); + _register_paint (); + _register_paint_clip_fill_mono (); + _register_paint_clip_fill_aa (); + _register_paint_repeat (); + _register_paint_source_alpha (); + _register_paint_with_alpha (); + _register_paint_with_alpha_solid_clip (); + _register_paint_with_alpha_clip (); + _register_paint_with_alpha_clip_mask (); + _register_paint_with_alpha_group_clip (); + _register_partial_clip_text_top (); + _register_partial_clip_text_bottom (); + _register_partial_clip_text_left (); + _register_partial_clip_text_right (); + _register_partial_coverage_rectangles (); + _register_partial_coverage_intersecting_quads (); + _register_partial_coverage_intersecting_triangles (); + _register_partial_coverage_triangles (); + _register_partial_coverage_overlap_three_quarter_triangles (); + _register_partial_coverage_overlap_half_triangles_eo (); + _register_partial_coverage_overlap_half_triangles (); + _register_partial_coverage_half_triangles (); + _register_partial_coverage_reference (); + _register_partial_coverage_three_quarter_reference (); + _register_partial_coverage_half_reference (); + _register_pass_through (); + _register_path_append (); + _register_path_currentpoint (); + _register_path_stroke_twice (); + _register_path_precision (); + _register_pattern_get_type (); + _register_pattern_getters (); + _register_pdf_isolated_group (); + _register_pixman_downscale_fast_96 (); + _register_pixman_downscale_fast_95 (); + _register_pixman_downscale_fast_24 (); + _register_pixman_downscale_good_96 (); + _register_pixman_downscale_good_95 (); + _register_pixman_downscale_good_24 (); + _register_pixman_downscale_best_96 (); + _register_pixman_downscale_best_95 (); + _register_pixman_downscale_best_24 (); + _register_pixman_downscale_nearest_96 (); + _register_pixman_downscale_nearest_95 (); + _register_pixman_downscale_nearest_24 (); + _register_pixman_downscale_bilinear_96 (); + _register_pixman_downscale_bilinear_95 (); + _register_pixman_downscale_bilinear_24 (); + _register_pixman_rotate (); + _register_png (); + _register_push_group (); + _register_push_group_color (); + _register_push_group_path_offset (); + _register_radial_gradient (); + _register_radial_gradient_mask (); + _register_radial_gradient_source (); + _register_radial_gradient_mask_source (); + _register_radial_gradient_one_stop (); + _register_radial_gradient_extend (); + _register_radial_outer_focus (); + _register_random_clip (); + _register_random_intersections_eo (); + _register_random_intersections_nonzero (); + _register_random_intersections_curves_eo (); + _register_random_intersections_curves_nz (); + _register_raster_source (); + _register_record_paint (); + _register_record_paint_alpha (); + _register_record_paint_alpha_solid_clip (); + _register_record_paint_alpha_clip (); + _register_record_paint_alpha_clip_mask (); + _register_record_fill_alpha (); + _register_record_select_font_face (); + _register_record_self_intersecting (); + _register_record_text_transform (); + _register_record1414x_paint (); + _register_record1414x_paint_alpha (); + _register_record1414x_paint_alpha_solid_clip (); + _register_record1414x_paint_alpha_clip (); + _register_record1414x_paint_alpha_clip_mask (); + _register_record1414x_fill_alpha (); + _register_record1414x_select_font_face (); + _register_record1414x_self_intersecting (); + _register_record1414x_text_transform (); + _register_record2x_paint (); + _register_record2x_paint_alpha (); + _register_record2x_paint_alpha_solid_clip (); + _register_record2x_paint_alpha_clip (); + _register_record2x_paint_alpha_clip_mask (); + _register_record2x_fill_alpha (); + _register_record2x_select_font_face (); + _register_record2x_self_intersecting (); + _register_record2x_text_transform (); + _register_record90_paint (); + _register_record90_paint_alpha (); + _register_record90_paint_alpha_solid_clip (); + _register_record90_paint_alpha_clip (); + _register_record90_paint_alpha_clip_mask (); + _register_record90_fill_alpha (); + _register_record90_select_font_face (); + _register_record90_self_intersecting (); + _register_record90_text_transform (); + _register_recordflip_whole_paint (); + _register_recordflip_whole_paint_alpha (); + _register_recordflip_whole_paint_alpha_solid_clip (); + _register_recordflip_whole_paint_alpha_clip (); + _register_recordflip_whole_paint_alpha_clip_mask (); + _register_recordflip_whole_fill_alpha (); + _register_recordflip_whole_select_font_face (); + _register_recordflip_whole_self_intersecting (); + _register_recordflip_whole_text_transform (); + _register_recordflip_paint (); + _register_recordflip_paint_alpha (); + _register_recordflip_paint_alpha_solid_clip (); + _register_recordflip_paint_alpha_clip (); + _register_recordflip_paint_alpha_clip_mask (); + _register_recordflip_fill_alpha (); + _register_recordflip_select_font_face (); + _register_recordflip_self_intersecting (); + _register_recordflip_text_transform (); + _register_record_extend_none (); + _register_record_extend_pad (); + _register_record_extend_repeat (); + _register_record_extend_reflect (); + _register_record_extend_none_similar (); + _register_record_extend_pad_similar (); + _register_record_extend_repeat_similar (); + _register_record_extend_reflect_similar (); + _register_record_mesh (); + _register_recording_surface_over (); + _register_recording_surface_source (); + _register_recording_surface_extend_none (); + _register_recording_surface_extend_repeat (); + _register_recording_surface_extend_reflect (); + _register_recording_surface_extend_pad (); + _register_rectangle_rounding_error (); + _register_rectilinear_fill (); + _register_rectilinear_grid (); + _register_a1_rectilinear_grid (); + _register_rectilinear_miter_limit (); + _register_rectilinear_dash (); + _register_rectilinear_dash_scale (); + _register_rectilinear_dash_scale_unaligned (); + _register_rectilinear_stroke (); + _register_reflected_stroke (); + _register_rel_path (); + _register_rgb24_ignore_alpha (); + _register_rotate_image_surface_paint (); + _register_clip_rotate_image_surface_paint (); + _register_rotate_clip_image_surface_paint (); + _register_rotate_stroke_box (); + _register_rotated_clip (); + _register_rounded_rectangle_fill (); + _register_rounded_rectangle_stroke (); + _register_sample_vertical (); + _register_sample_horizontal (); + _register_sample_diagonal (); + _register_scale_down_source_surface_paint (); + _register_scale_offset_image (); + _register_scale_offset_similar (); + _register_scale_source_surface_paint (); + _register_scaled_font_zero_matrix (); + _register_stroke_ctm_caps (); + _register_stroke_clipped (); + _register_stroke_image (); + _register_stroke_open_box (); + _register_select_font_face (); + _register_select_font_no_show_text (); + _register_self_copy (); + _register_self_copy_overlap (); + _register_self_intersecting (); + _register_set_source (); + _register_show_glyphs_advance (); + _register_show_glyphs_many (); + _register_show_text_current_point (); + _register_shape_general_convex (); + _register_shape_sierpinski (); + _register_simple_edge (); + _register_skew_extreme (); + _register_smask (); + _register_smask_fill (); + _register_smask_image_mask (); + _register_smask_mask (); + _register_smask_paint (); + _register_smask_stroke (); + _register_smask_text (); + _register_solid_pattern_cache_stress (); + _register_source_clip (); + _register_source_clip_scale (); + _register_source_surface_scale_paint (); + _register_spline_decomposition (); + _register_stride_12_image (); + _register_stroke_pattern (); + _register_subsurface (); + _register_subsurface_image_repeat (); + _register_subsurface_repeat (); + _register_subsurface_reflect (); + _register_subsurface_pad (); + _register_subsurface_modify_child (); + _register_subsurface_modify_parent (); + _register_subsurface_outside_target (); + _register_subsurface_scale (); + _register_subsurface_similar_repeat (); + _register_surface_finish_twice (); + _register_surface_pattern (); + _register_surface_pattern_big_scale_down (); + _register_surface_pattern_operator (); + _register_surface_pattern_scale_down (); + _register_surface_pattern_scale_down_extend_repeat (); + _register_surface_pattern_scale_down_extend_none (); + _register_surface_pattern_scale_down_extend_reflect (); + _register_surface_pattern_scale_down_extend_pad (); + _register_surface_pattern_scale_up (); + _register_text_antialias_gray (); + _register_text_antialias_none (); + _register_text_antialias_subpixel (); + _register_text_antialias_subpixel_rgb (); + _register_text_antialias_subpixel_bgr (); + _register_text_antialias_subpixel_vrgb (); + _register_text_antialias_subpixel_vbgr (); + _register_text_cache_crash (); + _register_text_glyph_range (); + _register_text_pattern (); + _register_text_rotate (); + _register_text_transform (); + _register_text_zero_len (); + _register_tighten_bounds (); + _register_tiger (); + _register_a1_tiger (); + _register_toy_font_face (); + _register_transforms (); + _register_translate_show_surface (); + _register_trap_clip (); + _register_twin (); + _register_twin_antialias_gray (); + _register_twin_antialias_mixed (); + _register_twin_antialias_none (); + _register_twin_antialias_subpixel (); + _register_unaligned_box (); + _register_unantialiased_shapes (); + _register_unbounded_operator (); + _register_unclosed_strokes (); + _register_user_data (); + _register_user_font (); + _register_user_font_mask (); + _register_user_font_proxy (); + _register_user_font_rescale (); + _register_world_map (); + _register_world_map_stroke (); + _register_world_map_fill (); + _register_white_in_noop (); + _register_xcb_huge_image_shm (); + _register_xcb_huge_subimage (); + _register_xcb_stress_cache (); + _register_xcb_snapshot_assert (); + _register_xcomposite_projection (); + _register_xlib_expose_event (); + _register_zero_alpha (); + _register_zero_mask (); + _register_pthread_same_source (); + _register_pthread_show_text (); + _register_pthread_similar (); + _register_bitmap_font (); + _register_ft_font_create_for_ft_face (); + _register_ft_show_glyphs_positioning (); + _register_ft_show_glyphs_table (); + _register_ft_text_vertical_layout_type1 (); + _register_ft_text_vertical_layout_type3 (); + _register_ft_text_antialias_none (); + _register_pdf_features (); + _register_pdf_mime_data (); + _register_pdf_surface_source (); + _register_ps_eps (); + _register_ps_features (); + _register_ps_surface_source (); + _register_svg_surface (); + _register_svg_clip (); + _register_svg_surface_source (); + _register_xcb_surface_source (); + _register_xlib_surface (); + _register_xlib_surface_source (); + _register_get_xrender_format (); + _register_multi_page (); + _register_fallback_resolution (); +} diff --git a/test/cairo-test-private.h b/test/cairo-test-private.h new file mode 100644 index 000000000..cfd22de4e --- /dev/null +++ b/test/cairo-test-private.h @@ -0,0 +1,72 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#ifndef _CAIRO_TEST_PRIVATE_H_ +#define _CAIRO_TEST_PRIVATE_H_ + +#include "cairo-test.h" + +/* For communication between the core components of cairo-test and not + * for the tests themselves. + */ + +CAIRO_BEGIN_DECLS + +typedef enum { + DIRECT, + SIMILAR +} cairo_test_similar_t; + +cairo_test_similar_t +cairo_test_target_has_similar (const cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target); + +cairo_test_status_t +_cairo_test_context_run_for_target (cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target, + cairo_bool_t similar, + int dev_offset, int dev_scale); + +void +_cairo_test_context_init_for_test (cairo_test_context_t *ctx, + const cairo_test_context_t *parent, + const cairo_test_t *test); + +void +cairo_test_init (cairo_test_context_t *ctx, + const char *test_name, + const char *output); + +void +cairo_test_fini (cairo_test_context_t *ctx); + +void +_cairo_test_runner_register_tests (void); + +CAIRO_END_DECLS + +#endif /* _CAIRO_TEST_PRIVATE_H_ */ diff --git a/test/cairo-test-runner.c b/test/cairo-test-runner.c new file mode 100644 index 000000000..f9e7d4712 --- /dev/null +++ b/test/cairo-test-runner.c @@ -0,0 +1,1108 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test-private.h" +#include "cairo-boilerplate-getopt.h" + +/* get the "real" version info instead of dummy cairo-version.h */ +#undef CAIRO_VERSION_H +#undef CAIRO_VERSION_MAJOR +#undef CAIRO_VERSION_MINOR +#undef CAIRO_VERSION_MICRO +#include "../cairo-version.h" + +#include /* for version information */ + +#define SHOULD_FORK HAVE_FORK && HAVE_WAITPID +#if SHOULD_FORK +#if HAVE_UNISTD_H +#include +#endif +#if HAVE_SIGNAL_H +#include +#endif +#include +#include +#endif +#if HAVE_LIBGEN_H +#include +#endif + +#if HAVE_VALGRIND +#include +#else +#define RUNNING_ON_VALGRIND 0 +#endif + +#ifdef _MSC_VER +#include +#endif + +typedef struct _cairo_test_list { + const cairo_test_t *test; + struct _cairo_test_list *next; +} cairo_test_list_t; + +typedef struct _cairo_test_runner { + cairo_test_context_t base; + + unsigned int num_device_offsets; + unsigned int num_device_scales; + + cairo_bool_t passed; + int num_passed; + int num_skipped; + int num_failed; + int num_xfailed; + int num_error; + int num_crashed; + + cairo_test_list_t *crashes_preamble; + cairo_test_list_t *errors_preamble; + cairo_test_list_t *fails_preamble; + + cairo_test_list_t **crashes_per_target; + cairo_test_list_t **errors_per_target; + cairo_test_list_t **fails_per_target; + + int *num_failed_per_target; + int *num_error_per_target; + int *num_crashed_per_target; + + cairo_bool_t foreground; + cairo_bool_t exit_on_failure; + cairo_bool_t list_only; + cairo_bool_t full_test; + cairo_bool_t keyword_match; + cairo_bool_t slow; + cairo_bool_t force_pass; +} cairo_test_runner_t; + +typedef enum { + GE, + GT +} cairo_test_compare_op_t; + +static cairo_test_list_t *tests; + +static void CAIRO_BOILERPLATE_PRINTF_FORMAT(2,3) +_log (cairo_test_context_t *ctx, + const char *fmt, + ...) +{ + va_list ap; + + va_start (ap, fmt); + vprintf (fmt, ap); + va_end (ap); + + va_start (ap, fmt); + cairo_test_logv (ctx, fmt, ap); + va_end (ap); +} + +static cairo_test_list_t * +_list_prepend (cairo_test_list_t *head, const cairo_test_t *test) +{ + cairo_test_list_t *list; + + list = xmalloc (sizeof (cairo_test_list_t)); + list->test = test; + list->next = head; + head = list; + + return head; +} + +static cairo_test_list_t * +_list_reverse (cairo_test_list_t *head) +{ + cairo_test_list_t *list, *next; + + for (list = head, head = NULL; list != NULL; list = next) { + next = list->next; + list->next = head; + head = list; + } + + return head; +} + +static void +_list_free (cairo_test_list_t *list) +{ + while (list != NULL) { + cairo_test_list_t *next = list->next; + free (list); + list = next; + } +} + +static cairo_bool_t +is_running_under_debugger (void) +{ +#if HAVE_UNISTD_H && HAVE_LIBGEN_H && __linux__ + char buf[1024]; + + sprintf (buf, "/proc/%d/exe", getppid ()); + if (readlink (buf, buf, sizeof (buf)) != -1 && + strncmp (basename (buf), "gdb", 3) == 0) + { + return TRUE; + } +#endif + + if (RUNNING_ON_VALGRIND) + return TRUE; + + return FALSE; +} + +#if SHOULD_FORK +static cairo_test_status_t +_cairo_test_wait (pid_t pid) +{ + int exitcode; + + if (waitpid (pid, &exitcode, 0) != pid) + return CAIRO_TEST_CRASHED; + + if (WIFSIGNALED (exitcode)) { + switch (WTERMSIG (exitcode)) { + case SIGINT: +#if HAVE_RAISE + raise (SIGINT); +#endif + return CAIRO_TEST_UNTESTED; + default: + return CAIRO_TEST_CRASHED; + } + } + + return WEXITSTATUS (exitcode); +} +#endif + +static cairo_test_status_t +_cairo_test_runner_preamble (cairo_test_runner_t *runner, + cairo_test_context_t *ctx) +{ +#if SHOULD_FORK + if (! runner->foreground) { + pid_t pid; + + switch ((pid = fork ())) { + case -1: /* error */ + return CAIRO_TEST_UNTESTED; + + case 0: /* child */ + exit (ctx->test->preamble (ctx)); + + default: + return _cairo_test_wait (pid); + } + } +#endif + return ctx->test->preamble (ctx); +} + +static cairo_test_status_t +_cairo_test_runner_draw (cairo_test_runner_t *runner, + cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target, + cairo_bool_t similar, + int device_offset, int device_scale) +{ +#if SHOULD_FORK + if (! runner->foreground) { + pid_t pid; + + switch ((pid = fork ())) { + case -1: /* error */ + return CAIRO_TEST_UNTESTED; + + case 0: /* child */ + exit (_cairo_test_context_run_for_target (ctx, target, + similar, device_offset, device_scale)); + + default: + return _cairo_test_wait (pid); + } + } +#endif + return _cairo_test_context_run_for_target (ctx, target, + similar, device_offset, device_scale); +} + +static void +append_argv (int *argc, char ***argv, const char *str) +{ + int old_argc; + char **old_argv; + cairo_bool_t doit; + const char *s, *t; + int olen; + int len; + int i; + int args_to_add = 0; + + if (str == NULL) + return; + + old_argc = *argc; + old_argv = *argv; + + doit = FALSE; + do { + if (doit) + *argv = xmalloc (olen); + + olen = sizeof (char *) * (args_to_add + *argc); + for (i = 0; i < old_argc; i++) { + len = strlen (old_argv[i]) + 1; + if (doit) { + (*argv)[i] = (char *) *argv + olen; + memcpy ((*argv)[i], old_argv[i], len); + } + olen += len; + } + + s = str; + while ((t = strpbrk (s, " \t,:;")) != NULL) { + if (t - s) { + len = t - s; + if (doit) { + (*argv)[i] = (char *) *argv + olen; + memcpy ((*argv)[i], s, len); + (*argv)[i][len] = '\0'; + } else { + olen += sizeof (char *); + } + args_to_add++; + olen += len + 1; + i++; + } + s = t + 1; + } + if (*s != '\0') { + len = strlen (s) + 1; + if (doit) { + (*argv)[i] = (char *) *argv + olen; + memcpy ((*argv)[i], s, len); + } else { + olen += sizeof (char *); + } + args_to_add++; + olen += len; + i++; + } + } while (doit++ == FALSE); + *argc = i; +} + +static void +usage (const char *argv0) +{ + fprintf (stderr, + "Usage: %s [-afkxsl] [test-names|keywords ...]\n" + "\n" + "Run the cairo conformance test suite over the given tests (all by default)\n" + "The command-line arguments are interpreted as follows:\n" + "\n" + " -a all; run the full set of tests. By default the test suite\n" + " skips similar surface and device offset testing.\n" + " -f foreground; do not fork\n" + " -k match tests by keyword\n" + " -l list only; just list selected test case names without executing\n" + " -s include slow, long running tests\n" + " -x exit on first failure\n" + "\n" + "If test names are given they are used as matches either to a specific\n" + "test case or to a keyword, so a command such as\n" + "\"%s -k text\" can be used to run all text test cases, and\n" + "\"%s text-transform\" to run the individual case.\n", + argv0, argv0, argv0); +} + +static void +_parse_cmdline (cairo_test_runner_t *runner, int *argc, char **argv[]) +{ + int c; + + while (1) { + c = _cairo_getopt (*argc, *argv, ":afklsx"); + if (c == -1) + break; + + switch (c) { + case 'a': + runner->full_test = ~0; + break; + case 'f': + runner->foreground = TRUE; + break; + case 'k': + runner->keyword_match = TRUE; + break; + case 'l': + runner->list_only = TRUE; + break; + case 's': + runner->slow = TRUE; + break; + case 'x': + runner->exit_on_failure = TRUE; + break; + default: + fprintf (stderr, "Internal error: unhandled option: %c\n", c); + /* fall-through */ + case '?': + usage ((*argv)[0]); + exit (1); + } + } + + *argc -= optind; + *argv += optind; +} + +static void +_runner_init (cairo_test_runner_t *runner) +{ + cairo_test_init (&runner->base, "cairo-test-suite", "."); + + runner->passed = TRUE; + + runner->fails_preamble = NULL; + runner->crashes_preamble = NULL; + runner->errors_preamble = NULL; + + runner->fails_per_target = xcalloc (sizeof (cairo_test_list_t *), + runner->base.num_targets); + runner->crashes_per_target = xcalloc (sizeof (cairo_test_list_t *), + runner->base.num_targets); + runner->errors_per_target = xcalloc (sizeof (cairo_test_list_t *), + runner->base.num_targets); + runner->num_failed_per_target = xcalloc (sizeof (int), + runner->base.num_targets); + runner->num_error_per_target = xcalloc (sizeof (int), + runner->base.num_targets); + runner->num_crashed_per_target = xcalloc (sizeof (int), + runner->base.num_targets); +} + +static void +_runner_print_versions (cairo_test_runner_t *runner) +{ + _log (&runner->base, + "Compiled against cairo %s, running on %s.\n", + CAIRO_VERSION_STRING, cairo_version_string ()); + _log (&runner->base, + "Compiled against pixman %s, running on %s.\n", + PIXMAN_VERSION_STRING, pixman_version_string ()); + + fflush (runner->base.log_file); +} + +static void +_runner_print_summary (cairo_test_runner_t *runner) +{ + _log (&runner->base, + "%d Passed, %d Failed [%d crashed, %d expected], %d Skipped\n", + runner->num_passed, + + runner->num_failed + runner->num_crashed + runner->num_xfailed, + runner->num_crashed, + runner->num_xfailed, + + runner->num_skipped); +} + +static void +_runner_print_details (cairo_test_runner_t *runner) +{ + cairo_test_list_t *list; + unsigned int n; + + if (runner->crashes_preamble) { + int count = 0; + + for (list = runner->crashes_preamble; list != NULL; list = list->next) + count++; + + _log (&runner->base, "Preamble: %d crashed! -", count); + + for (list = runner->crashes_preamble; list != NULL; list = list->next) { + char *name = cairo_test_get_name (list->test); + _log (&runner->base, " %s", name); + free (name); + } + _log (&runner->base, "\n"); + } + if (runner->errors_preamble) { + int count = 0; + + for (list = runner->errors_preamble; list != NULL; list = list->next) + count++; + + _log (&runner->base, "Preamble: %d error -", count); + + for (list = runner->errors_preamble; list != NULL; list = list->next) { + char *name = cairo_test_get_name (list->test); + _log (&runner->base, " %s", name); + free (name); + } + _log (&runner->base, "\n"); + } + if (runner->fails_preamble) { + int count = 0; + + for (list = runner->fails_preamble; list != NULL; list = list->next) + count++; + + _log (&runner->base, "Preamble: %d failed -", count); + + for (list = runner->fails_preamble; list != NULL; list = list->next) { + char *name = cairo_test_get_name (list->test); + _log (&runner->base, " %s", name); + free (name); + } + _log (&runner->base, "\n"); + } + + for (n = 0; n < runner->base.num_targets; n++) { + const cairo_boilerplate_target_t *target; + + target = runner->base.targets_to_test[n]; + if (runner->num_crashed_per_target[n]) { + _log (&runner->base, "%s (%s): %d crashed! -", + target->name, + cairo_boilerplate_content_name (target->content), + runner->num_crashed_per_target[n]); + + for (list = runner->crashes_per_target[n]; + list != NULL; + list = list->next) + { + char *name = cairo_test_get_name (list->test); + _log (&runner->base, " %s", name); + free (name); + } + _log (&runner->base, "\n"); + } + if (runner->num_error_per_target[n]) { + _log (&runner->base, "%s (%s): %d error -", + target->name, + cairo_boilerplate_content_name (target->content), + runner->num_error_per_target[n]); + + for (list = runner->errors_per_target[n]; + list != NULL; + list = list->next) + { + char *name = cairo_test_get_name (list->test); + _log (&runner->base, " %s", name); + free (name); + } + _log (&runner->base, "\n"); + } + + if (runner->num_failed_per_target[n]) { + _log (&runner->base, "%s (%s): %d failed -", + target->name, + cairo_boilerplate_content_name (target->content), + runner->num_failed_per_target[n]); + + for (list = runner->fails_per_target[n]; + list != NULL; + list = list->next) + { + char *name = cairo_test_get_name (list->test); + _log (&runner->base, " %s", name); + free (name); + } + _log (&runner->base, "\n"); + } + } +} + +static void +_runner_print_results (cairo_test_runner_t *runner) +{ + _runner_print_summary (runner); + _runner_print_details (runner); + + if (! runner->passed && ! runner->num_crashed) { + _log (&runner->base, +"\n" +"Note: These failures may be due to external factors.\n" +"Please read test/README -- \"Getting the elusive zero failures\".\n"); + } +} + +static cairo_test_status_t +_runner_fini (cairo_test_runner_t *runner) +{ + unsigned int n; + + _list_free (runner->crashes_preamble); + _list_free (runner->errors_preamble); + _list_free (runner->fails_preamble); + + for (n = 0; n < runner->base.num_targets; n++) { + _list_free (runner->crashes_per_target[n]); + _list_free (runner->errors_per_target[n]); + _list_free (runner->fails_per_target[n]); + } + free (runner->crashes_per_target); + free (runner->errors_per_target); + free (runner->fails_per_target); + + free (runner->num_crashed_per_target); + free (runner->num_error_per_target); + free (runner->num_failed_per_target); + + cairo_test_fini (&runner->base); + + if (runner->force_pass) + return CAIRO_TEST_SUCCESS; + + return runner->num_failed + runner->num_crashed ? + CAIRO_TEST_FAILURE : + runner->num_passed + runner->num_xfailed ? + CAIRO_TEST_SUCCESS : CAIRO_TEST_UNTESTED; +} + +static cairo_bool_t +_version_compare (int a, cairo_test_compare_op_t op, int b) +{ + switch (op) { + case GT: return a > b; + case GE: return a >= b; + default: return FALSE; + } +} + + +static cairo_bool_t +_get_required_version (const char *str, + cairo_test_compare_op_t *op, + int *major, + int *minor, + int *micro) +{ + while (*str == ' ') + str++; + + if (strncmp (str, ">=", 2) == 0) { + *op = GE; + str += 2; + } else if (strncmp (str, ">", 1) == 0) { + *op = GT; + str += 1; + } else + return FALSE; + + while (*str == ' ') + str++; + + if (sscanf (str, "%d.%d.%d", major, minor, micro) != 3) { + *micro = 0; + if (sscanf (str, "%d.%d", major, minor) != 2) + return FALSE; + } + + return TRUE; +} + +static cairo_bool_t +_has_required_cairo_version (const char *str) +{ + cairo_test_compare_op_t op; + int major, minor, micro; + + if (! _get_required_version (str + 5 /* advance over "cairo" */, + &op, &major, &minor, µ)) + { + fprintf (stderr, "unrecognised cairo version requirement '%s'\n", str); + return FALSE; + } + + return _version_compare (cairo_version (), + op, + CAIRO_VERSION_ENCODE (major, minor, micro)); +} + +static cairo_bool_t +_has_required_ghostscript_version (const char *str) +{ +#if ! CAIRO_CAN_TEST_PS_SURFACE + return TRUE; +#endif + + str += 2; /* advance over "gs" */ + + return TRUE; +} + +static cairo_bool_t +_has_required_poppler_version (const char *str) +{ +#if ! CAIRO_CAN_TEST_PDF_SURFACE + return TRUE; +#endif + + str += 7; /* advance over "poppler" */ + + return TRUE; +} + +static cairo_bool_t +_has_required_rsvg_version (const char *str) +{ +#if ! CAIRO_CAN_TEST_SVG_SURFACE + return TRUE; +#endif + + str += 4; /* advance over "rsvg" */ + + return TRUE; +} + +#define TEST_SIMILAR 0x1 +#define TEST_OFFSET 0x2 +#define TEST_SCALE 0x4 +int +main (int argc, char **argv) +{ + cairo_test_runner_t runner; + cairo_test_list_t *test_list; + cairo_test_status_t *target_status; + unsigned int n, m, k; + char targets[4096]; + int len; + char *cairo_tests_env; + +#ifdef _MSC_VER + /* We don't want an assert dialog, we want stderr */ + _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); + _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); +#endif + + _cairo_test_runner_register_tests (); + tests = _list_reverse (tests); + + memset (&runner, 0, sizeof (runner)); + runner.num_device_offsets = 1; + runner.num_device_scales = 1; + + if (is_running_under_debugger ()) + runner.foreground = TRUE; + + if (getenv ("CAIRO_TEST_MODE")) { + const char *env = getenv ("CAIRO_TEST_MODE"); + + if (strstr (env, "full")) { + runner.full_test = ~0; + } + if (strstr (env, "similar")) { + runner.full_test |= TEST_SIMILAR; + } + if (strstr (env, "offset")) { + runner.full_test |= TEST_OFFSET; + } + if (strstr (env, "scale")) { + runner.full_test |= TEST_SCALE; + } + if (strstr (env, "foreground")) { + runner.foreground = TRUE; + } + if (strstr (env, "exit-on-failure")) { + runner.exit_on_failure = TRUE; + } + } + + if (getenv ("CAIRO_TEST_FORCE_PASS")) { + const char *env = getenv ("CAIRO_TEST_FORCE_PASS"); + + runner.force_pass = atoi (env); + } + + _parse_cmdline (&runner, &argc, &argv); + + cairo_tests_env = getenv("CAIRO_TESTS"); + append_argv (&argc, &argv, cairo_tests_env); + + if (runner.full_test & TEST_OFFSET) { + runner.num_device_offsets = 2; + } + if (runner.full_test & TEST_SCALE) { + runner.num_device_scales = 2; + } + + target_status = NULL; /* silence the compiler */ + if (! runner.list_only) { + _runner_init (&runner); + _runner_print_versions (&runner); + target_status = xmalloc (sizeof (cairo_test_status_t) * + runner.base.num_targets); + } + + for (test_list = tests; test_list != NULL; test_list = test_list->next) { + const cairo_test_t *test = test_list->test; + cairo_test_context_t ctx; + cairo_test_status_t status; + cairo_bool_t failed = FALSE, xfailed = FALSE, error = FALSE, crashed = FALSE, skipped = TRUE; + cairo_bool_t in_preamble = FALSE; + char *name = cairo_test_get_name (test); + int i; + + /* check for restricted runs */ + if (argc) { + cairo_bool_t found = FALSE; + const char *keywords = test->keywords; + + for (i = 0; i < argc; i++) { + const char *match = argv[i]; + cairo_bool_t invert = match[0] == '!'; + if (invert) + match++; + + if (runner.keyword_match) { + if (keywords != NULL && strstr (keywords, match) != NULL) { + found = ! invert; + break; + } else if (invert) { + found = TRUE; + } + } else { + /* exact match on test name */ + if (strcmp (name, match) == 0) { + found = ! invert; + break; + } else if (invert) { + found = TRUE; + } + } + } + + if (! found) { + free (name); + continue; + } + } + + /* check to see if external requirements match */ + if (test->requirements != NULL) { + const char *requirements = test->requirements; + const char *str; + + str = strstr (requirements, "slow"); + if (str != NULL && ! runner.slow) { + if (runner.list_only) + goto TEST_NEXT; + else + goto TEST_SKIPPED; + } + + str = strstr (requirements, "cairo"); + if (str != NULL && ! _has_required_cairo_version (str)) { + if (runner.list_only) + goto TEST_NEXT; + else + goto TEST_SKIPPED; + } + + str = strstr (requirements, "gs"); + if (str != NULL && ! _has_required_ghostscript_version (str)) { + if (runner.list_only) + goto TEST_NEXT; + else + goto TEST_SKIPPED; + } + + str = strstr (requirements, "poppler"); + if (str != NULL && ! _has_required_poppler_version (str)) { + if (runner.list_only) + goto TEST_NEXT; + else + goto TEST_SKIPPED; + } + + str = strstr (requirements, "rsvg"); + if (str != NULL && ! _has_required_rsvg_version (str)) { + if (runner.list_only) + goto TEST_NEXT; + else + goto TEST_SKIPPED; + } + } + + if (runner.list_only) { + printf ("%s ", name); + goto TEST_NEXT; + } + + _cairo_test_context_init_for_test (&ctx, &runner.base, test); + memset (target_status, 0, + sizeof (cairo_test_status_t) * ctx.num_targets); + + if (ctx.test->preamble != NULL) { + status = _cairo_test_runner_preamble (&runner, &ctx); + switch (status) { + case CAIRO_TEST_SUCCESS: + in_preamble = TRUE; + skipped = FALSE; + break; + + case CAIRO_TEST_XFAILURE: + in_preamble = TRUE; + xfailed = TRUE; + goto TEST_DONE; + + case CAIRO_TEST_NEW: + case CAIRO_TEST_FAILURE: + runner.fails_preamble = _list_prepend (runner.fails_preamble, + test); + in_preamble = TRUE; + failed = TRUE; + goto TEST_DONE; + + case CAIRO_TEST_ERROR: + runner.errors_preamble = _list_prepend (runner.errors_preamble, + test); + in_preamble = TRUE; + failed = TRUE; + goto TEST_DONE; + + case CAIRO_TEST_NO_MEMORY: + case CAIRO_TEST_CRASHED: + runner.crashes_preamble = _list_prepend (runner.crashes_preamble, + test); + in_preamble = TRUE; + failed = TRUE; + goto TEST_DONE; + + case CAIRO_TEST_UNTESTED: + goto TEST_DONE; + } + } + + if (ctx.test->draw == NULL) + goto TEST_DONE; + + for (n = 0; n < ctx.num_targets; n++) { + const cairo_boilerplate_target_t *target; + cairo_bool_t target_failed = FALSE, + target_xfailed = FALSE, + target_error = FALSE, + target_crashed = FALSE, + target_skipped = TRUE; + cairo_test_similar_t has_similar; + + target = ctx.targets_to_test[n]; + + has_similar = runner.full_test & TEST_SIMILAR ? + cairo_test_target_has_similar (&ctx, target) : + DIRECT; + for (m = 0; m < runner.num_device_offsets; m++) { + for (k = 0; k < runner.num_device_scales; k++) { + int dev_offset = m * 25; + int dev_scale = k + 1; + cairo_test_similar_t similar; + + for (similar = DIRECT; similar <= has_similar; similar++) { + status = _cairo_test_runner_draw (&runner, &ctx, target, + similar, dev_offset, dev_scale); + switch (status) { + case CAIRO_TEST_SUCCESS: + target_skipped = FALSE; + break; + case CAIRO_TEST_XFAILURE: + target_xfailed = TRUE; + break; + case CAIRO_TEST_NEW: + case CAIRO_TEST_FAILURE: + target_failed = TRUE; + break; + case CAIRO_TEST_ERROR: + target_error = TRUE; + break; + case CAIRO_TEST_NO_MEMORY: + case CAIRO_TEST_CRASHED: + target_crashed = TRUE; + break; + case CAIRO_TEST_UNTESTED: + break; + } + } + } + } + + if (target_crashed) { + target_status[n] = CAIRO_TEST_CRASHED; + runner.num_crashed_per_target[n]++; + runner.crashes_per_target[n] = _list_prepend (runner.crashes_per_target[n], + test); + crashed = TRUE; + } else if (target_error) { + target_status[n] = CAIRO_TEST_ERROR; + runner.num_error_per_target[n]++; + runner.errors_per_target[n] = _list_prepend (runner.errors_per_target[n], + test); + + error = TRUE; + } else if (target_failed) { + target_status[n] = CAIRO_TEST_FAILURE; + runner.num_failed_per_target[n]++; + runner.fails_per_target[n] = _list_prepend (runner.fails_per_target[n], + test); + + failed = TRUE; + } else if (target_xfailed) { + target_status[n] = CAIRO_TEST_XFAILURE; + xfailed = TRUE; + } else if (target_skipped) { + target_status[n] = CAIRO_TEST_UNTESTED; + } else { + target_status[n] = CAIRO_TEST_SUCCESS; + skipped = FALSE; + } + } + + TEST_DONE: + cairo_test_fini (&ctx); + TEST_SKIPPED: + targets[0] = '\0'; + if (crashed) { + if (! in_preamble) { + len = 0; + for (n = 0 ; n < runner.base.num_targets; n++) { + if (target_status[n] == CAIRO_TEST_CRASHED) { + if (strstr (targets, + runner.base.targets_to_test[n]->name) == NULL) + { + len += snprintf (targets + len, sizeof (targets) - len, + "%s, ", + runner.base.targets_to_test[n]->name); + } + } + } + targets[len-2] = '\0'; + _log (&runner.base, "\n%s: CRASH! (%s)\n", name, targets); + } else { + _log (&runner.base, "\n%s: CRASH!\n", name); + } + runner.num_crashed++; + runner.passed = FALSE; + } else if (error) { + if (! in_preamble) { + len = 0; + for (n = 0 ; n < runner.base.num_targets; n++) { + if (target_status[n] == CAIRO_TEST_ERROR) { + if (strstr (targets, + runner.base.targets_to_test[n]->name) == NULL) + { + len += snprintf (targets + len, + sizeof (targets) - len, + "%s, ", + runner.base.targets_to_test[n]->name); + } + } + } + targets[len-2] = '\0'; + _log (&runner.base, "%s: ERROR (%s)\n", name, targets); + } else { + _log (&runner.base, "%s: ERROR\n", name); + } + runner.num_error++; + runner.passed = FALSE; + } else if (failed) { + if (! in_preamble) { + len = 0; + for (n = 0 ; n < runner.base.num_targets; n++) { + if (target_status[n] == CAIRO_TEST_FAILURE) { + if (strstr (targets, + runner.base.targets_to_test[n]->name) == NULL) + { + len += snprintf (targets + len, + sizeof (targets) - len, + "%s, ", + runner.base.targets_to_test[n]->name); + } + } + } + targets[len-2] = '\0'; + _log (&runner.base, "%s: FAIL (%s)\n", name, targets); + } else { + _log (&runner.base, "%s: FAIL\n", name); + } + runner.num_failed++; + runner.passed = FALSE; + } else if (xfailed) { + _log (&runner.base, "%s: XFAIL\n", name); + runner.num_xfailed++; + } else if (skipped) { + _log (&runner.base, "%s: UNTESTED\n", name); + runner.num_skipped++; + } else { + _log (&runner.base, "%s: PASS\n", name); + runner.num_passed++; + } + fflush (runner.base.log_file); + + TEST_NEXT: + free (name); + if (runner.exit_on_failure && ! runner.passed) + break; + + } + + if (cairo_tests_env) + free(argv); + + if (runner.list_only) { + printf ("\n"); + return CAIRO_TEST_SUCCESS; + } + + for (n = 0 ; n < runner.base.num_targets; n++) { + runner.crashes_per_target[n] = _list_reverse (runner.crashes_per_target[n]); + runner.errors_per_target[n] = _list_reverse (runner.errors_per_target[n]); + runner.fails_per_target[n] = _list_reverse (runner.fails_per_target[n]); + } + + _runner_print_results (&runner); + + _list_free (tests); + free (target_status); + return _runner_fini (&runner); +} + +void +cairo_test_register (cairo_test_t *test) +{ + tests = _list_prepend (tests, test); +} diff --git a/test/cairo-test-trace.c b/test/cairo-test-trace.c new file mode 100644 index 000000000..5badc4377 --- /dev/null +++ b/test/cairo-test-trace.c @@ -0,0 +1,1780 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Chris Wilson + */ + +/* + * The basic idea is that we feed the trace to multiple backends in parallel + * and compare the output at the end of each context (based on the premise + * that contexts demarcate expose events, or their logical equivalents) with + * that of the image[1] backend. Each backend is executed in a separate + * process, for robustness and to isolate the global cairo state, with the + * image data residing in shared memory and synchronising over a socket. + * + * [1] Should be reference implementation, currently the image backend is + * considered to be the reference for all other backends. + */ + +/* XXX Can't directly compare fills using spans versus trapezoidation, + * i.e. xlib vs image. Gah, kinda renders this whole scheme moot. + * How about reference platforms? + * E.g. accelerated xlib driver vs Xvfb? + * + * boilerplate->create_reference_surface()? + * boilerplate->reference->create_surface()? + * So for each backend spawn two processes, a reference and xlib + * (obviously minimising the number of reference processes when possible) + */ + +/* + * XXX Handle show-page as well as cairo_destroy()? Though arguably that is + * only relevant for paginated backends which is currently outside the + * scope of this test. + */ + +#define _GNU_SOURCE 1 /* getline() */ + +#include "cairo-test.h" +#include "buffer-diff.h" + +#include "cairo-boilerplate-getopt.h" +#include +#include "cairo-missing.h" + +#if CAIRO_HAS_SCRIPT_SURFACE +#include +#endif + +/* For basename */ +#ifdef HAVE_LIBGEN_H +#include +#endif +#include /* isspace() */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if CAIRO_HAS_REAL_PTHREAD +#include +#endif + +#if HAVE_FCFINI +#include +#endif + +#ifndef MAP_NORESERVE +#define MAP_NORESERVE 0 +#endif + +#define DEBUG 0 + +#define ignore_image_differences 0 /* XXX make me a cmdline option! */ +#define write_results 1 +#define write_traces 1 + +#define DATA_SIZE (256 << 20) +#define SHM_PATH_XXX "/.shmem-cairo-trace" + +typedef struct _test_trace { + /* Options from command-line */ + cairo_bool_t list_only; + char **names; + unsigned int num_names; + char **exclude_names; + unsigned int num_exclude_names; + + /* Stuff used internally */ + const cairo_boilerplate_target_t **targets; + int num_targets; +} test_trace_t; + +typedef struct _test_runner { + const char *name; + cairo_surface_t *surface; + void *closure; + uint8_t *base; + const char *trace; + pid_t pid; + int sk; + cairo_bool_t is_recording; + + cairo_script_interpreter_t *csi; + struct context_closure { + struct context_closure *next; + unsigned long id; + unsigned long start_line; + unsigned long end_line; + cairo_t *context; + cairo_surface_t *surface; + } *contexts; + + unsigned long context_id; +} test_runner_t; + +struct slave { + pid_t pid; + int fd; + unsigned long image_serial; + unsigned long image_ready; + unsigned long start_line; + unsigned long end_line; + cairo_surface_t *image; + long width, height; + cairo_surface_t *difference; + buffer_diff_result_t result; + const cairo_boilerplate_target_t *target; + const struct slave *reference; + cairo_bool_t is_recording; +}; + +struct request_image { + unsigned long id; + unsigned long start_line; + unsigned long end_line; + cairo_format_t format; + long width; + long height; + long stride; +}; + +struct surface_tag { + long width, height; +}; +static const cairo_user_data_key_t surface_tag; + +#define TARGET_NAME(T) ((T) ? (T)->name : "recording") + +#if CAIRO_HAS_REAL_PTHREAD +#define tr_die(t) t->is_recording ? pthread_exit(NULL) : exit(1) +#else +#define tr_die(t) exit(1) +#endif + +static cairo_bool_t +writen (int fd, const void *ptr, int len) +{ +#if 0 + const uint8_t *data = ptr; + while (len) { + int ret = write (fd, data, len); + if (ret < 0) { + switch (errno) { + case EAGAIN: + case EINTR: + continue; + default: + return FALSE; + } + } else if (ret == 0) { + return FALSE; + } else { + data += ret; + len -= ret; + } + } + return TRUE; +#else + int ret = send (fd, ptr, len, 0); + return ret == len; +#endif +} + +static cairo_bool_t +readn (int fd, void *ptr, int len) +{ +#if 0 + uint8_t *data = ptr; + while (len) { + int ret = read (fd, data, len); + if (ret < 0) { + switch (errno) { + case EAGAIN: + case EINTR: + continue; + default: + return FALSE; + } + } else if (ret == 0) { + return FALSE; + } else { + data += ret; + len -= ret; + } + } + return TRUE; +#else + int ret = recv (fd, ptr, len, MSG_WAITALL); + return ret == len; +#endif +} + +static cairo_format_t +format_for_content (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: + return CAIRO_FORMAT_A8; + case CAIRO_CONTENT_COLOR: + return CAIRO_FORMAT_RGB24; + default: + case CAIRO_CONTENT_COLOR_ALPHA: + return CAIRO_FORMAT_ARGB32; + } +} + +static void +send_recording_surface (test_runner_t *tr, + int width, int height, + struct context_closure *closure) +{ +#if CAIRO_HAS_REAL_PTHREAD + const struct request_image rq = { + closure->id, + closure->start_line, + closure->end_line, + -1, + width, height, + (long) closure->surface, + }; + unsigned long offset; + unsigned long serial; + + if (DEBUG > 1) { + printf ("send-recording-surface: %lu [%lu, %lu]\n", + closure->id, + closure->start_line, + closure->end_line); + } + writen (tr->sk, &rq, sizeof (rq)); + readn (tr->sk, &offset, sizeof (offset)); + + /* signal completion */ + writen (tr->sk, &closure->id, sizeof (closure->id)); + + /* wait for image check */ + serial = 0; + readn (tr->sk, &serial, sizeof (serial)); + if (DEBUG > 1) { + printf ("send-recording-surface: serial: %lu\n", serial); + } + if (serial != closure->id) + pthread_exit (NULL); +#else + exit (1); +#endif +} + +static void * +request_image (test_runner_t *tr, + struct context_closure *closure, + cairo_format_t format, + int width, int height, int stride) +{ + const struct request_image rq = { + closure->id, + closure->start_line, + closure->end_line, + format, width, height, stride + }; + unsigned long offset = -1; + + assert (format != (cairo_format_t) -1); + + writen (tr->sk, &rq, sizeof (rq)); + readn (tr->sk, &offset, sizeof (offset)); + if (offset == (unsigned long) -1) + return NULL; + + return tr->base + offset; +} + +static void +send_surface (test_runner_t *tr, + struct context_closure *closure) +{ + cairo_surface_t *source = closure->surface; + cairo_surface_t *image; + cairo_format_t format = (cairo_format_t) -1; + cairo_t *cr; + int width, height, stride; + void *data; + unsigned long serial; + + if (DEBUG > 1) { + printf ("send-surface: '%s', is-recording? %d\n", + tr->name, tr->is_recording); + } + + if (cairo_surface_get_type (source) == CAIRO_SURFACE_TYPE_IMAGE) { + width = cairo_image_surface_get_width (source); + height = cairo_image_surface_get_height (source); + format = cairo_image_surface_get_format (source); + } else { + struct surface_tag *tag; + + tag = cairo_surface_get_user_data (source, &surface_tag); + if (tag != NULL) { + width = tag->width; + height = tag->height; + } else { + double x0, x1, y0, y1; + + /* presumably created using cairo_surface_create_similar() */ + cr = cairo_create (source); + cairo_clip_extents (cr, &x0, &y0, &x1, &y1); + cairo_destroy (cr); + + tag = xmalloc (sizeof (*tag)); + width = tag->width = x1 - x0; + height = tag->height = y1 - y0; + + if (cairo_surface_set_user_data (source, &surface_tag, tag, free)) + tr_die (tr); + } + } + + if (tr->is_recording) { + send_recording_surface (tr, width, height, closure); + return; + } + + if (format == (cairo_format_t) -1) + format = format_for_content (cairo_surface_get_content (source)); + + stride = cairo_format_stride_for_width (format, width); + + data = request_image (tr, closure, format, width, height, stride); + if (data == NULL) + tr_die (tr); + + image = cairo_image_surface_create_for_data (data, + format, + width, height, + stride); + cr = cairo_create (image); + cairo_surface_destroy (image); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, source, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + /* signal completion */ + writen (tr->sk, &closure->id, sizeof (closure->id)); + + /* wait for image check */ + serial = 0; + readn (tr->sk, &serial, sizeof (serial)); + if (serial != closure->id) + tr_die (tr); +} + +static cairo_surface_t * +_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + test_runner_t *tr = closure; + cairo_surface_t *surface; + + surface = cairo_surface_create_similar (tr->surface, + content, width, height); + if (cairo_surface_get_type (surface) != CAIRO_SURFACE_TYPE_IMAGE) { + struct surface_tag *tag; + + tag = xmalloc (sizeof (*tag)); + tag->width = width; + tag->height = height; + if (cairo_surface_set_user_data (surface, &surface_tag, tag, free)) + tr_die (tr); + } + + return surface; +} + +static cairo_t * +_context_create (void *closure, cairo_surface_t *surface) +{ + test_runner_t *tr = closure; + struct context_closure *l; + + if (DEBUG) { + fprintf (stderr, "%s: starting context %lu on line %d\n", + tr->name ? tr->name : "recording" , + tr->context_id + 1, + cairo_script_interpreter_get_line_number (tr->csi)); + } + + l = xmalloc (sizeof (*l)); + l->next = tr->contexts; + l->start_line = cairo_script_interpreter_get_line_number (tr->csi); + l->end_line = l->start_line; + l->context = cairo_create (surface); + l->surface = cairo_surface_reference (surface); + l->id = ++tr->context_id; + if (l->id == 0) + l->id = ++tr->context_id; + tr->contexts = l; + + return l->context; +} + +static void +_context_destroy (void *closure, void *ptr) +{ + test_runner_t *tr = closure; + struct context_closure *l, **prev = &tr->contexts; + + while ((l = *prev) != NULL) { + if (l->context == ptr) { + if (DEBUG) { + fprintf (stderr, "%s: context %lu complete on line %d\n", + tr->name ? tr->name : "recording" , + tr->context_id, + cairo_script_interpreter_get_line_number (tr->csi)); + } + l->end_line = + cairo_script_interpreter_get_line_number (tr->csi); + if (cairo_surface_status (l->surface) == CAIRO_STATUS_SUCCESS) { + send_surface (tr, l); + } else { + fprintf (stderr, "%s: error during replay, line %lu: %s!\n", + tr->name, + l->end_line, + cairo_status_to_string (cairo_surface_status (l->surface))); + tr_die (tr); + } + + cairo_surface_destroy (l->surface); + *prev = l->next; + free (l); + return; + } + prev = &l->next; + } +} + +static void +execute (test_runner_t *tr) +{ + const cairo_script_interpreter_hooks_t hooks = { + .closure = tr, + .surface_create = _surface_create, + .context_create = _context_create, + .context_destroy = _context_destroy, + }; + pid_t ack; + + tr->csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (tr->csi, &hooks); + + ack = -1; + readn (tr->sk, &ack, sizeof (ack)); + if (ack != tr->pid) + tr_die (tr); + + cairo_script_interpreter_run (tr->csi, tr->trace); + + cairo_script_interpreter_finish (tr->csi); + if (cairo_script_interpreter_destroy (tr->csi)) + tr_die (tr); +} + +static int +spawn_socket (const char *socket_path, pid_t pid) +{ + struct sockaddr_un addr; + int sk; + + sk = socket (PF_UNIX, SOCK_STREAM, 0); + if (sk == -1) + return -1; + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, socket_path); + + if (connect (sk, (struct sockaddr *) &addr, sizeof (addr)) == -1) + return -1; + + if (! writen (sk, &pid, sizeof (pid))) + return -1; + + return sk; +} + +static void * +spawn_shm (const char *shm_path) +{ + void *base; + int fd; + + fd = shm_open (shm_path, O_RDWR, 0); + if (fd == -1) + return MAP_FAILED; + + base = mmap (NULL, DATA_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_NORESERVE, + fd, 0); + close (fd); + + return base; +} + +static int +spawn_target (const char *socket_path, + const char *shm_path, + const cairo_boilerplate_target_t *target, + const char *trace) +{ + test_runner_t tr; + pid_t pid; + + if (DEBUG) + printf ("Spawning slave '%s' for %s\n", target->name, trace); + + pid = fork (); + if (pid != 0) + return pid; + + tr.is_recording = FALSE; + tr.pid = getpid (); + + tr.sk = spawn_socket (socket_path, tr.pid); + if (tr.sk == -1) { + fprintf (stderr, "%s: Failed to open socket.\n", + target->name); + exit (-1); + } + + tr.base = spawn_shm (shm_path); + if (tr.base == MAP_FAILED) { + fprintf (stderr, "%s: Failed to map shared memory segment.\n", + target->name); + exit (-1); + } + + tr.name = target->name; + tr.contexts = NULL; + tr.context_id = 0; + tr.trace = trace; + + tr.surface = target->create_surface (NULL, + target->content, + 1, 1, + 1, 1, + CAIRO_BOILERPLATE_MODE_TEST, + &tr.closure); + if (tr.surface == NULL) { + fprintf (stderr, + "%s: Failed to create target surface.\n", + target->name); + exit (-1); + } + + execute (&tr); + + cairo_surface_destroy (tr.surface); + + if (target->cleanup) + target->cleanup (tr.closure); + + close (tr.sk); + munmap (tr.base, DATA_SIZE); + + exit (0); +} + +#if CAIRO_HAS_REAL_PTHREAD +static void +cleanup_recorder (void *arg) +{ + test_runner_t *tr = arg; + + cairo_surface_finish (tr->surface); + cairo_surface_destroy (tr->surface); + + close (tr->sk); + free (tr); +} + +static void * +record (void *arg) +{ + test_runner_t *tr = arg; + + pthread_cleanup_push (cleanup_recorder, tr); + execute (tr); + pthread_cleanup_pop (TRUE); + + return NULL; +} + +/* The recorder is special: + * 1. It doesn't generate an image, but keeps an in-memory trace to + * reconstruct any surface. + * 2. Runs in the same process, but separate thread. + */ +static pid_t +spawn_recorder (const char *socket_path, const char *trace, test_runner_t **out) +{ + test_runner_t *tr; + pthread_t id; + pthread_attr_t attr; + pid_t pid = getpid (); + + if (DEBUG) + printf ("Spawning recorder for %s\n", trace); + + tr = malloc (sizeof (*tr)); + if (tr == NULL) + return -1; + + tr->is_recording = TRUE; + tr->pid = pid; + tr->sk = spawn_socket (socket_path, tr->pid); + if (tr->sk == -1) { + free (tr); + return -1; + } + + tr->base = NULL; + tr->name = NULL; + tr->contexts = NULL; + tr->context_id = 0; + tr->trace = trace; + + tr->surface = cairo_recording_surface_create (CAIRO_CONTENT_COLOR_ALPHA, + NULL); + if (tr->surface == NULL) { + cleanup_recorder (tr); + return -1; + } + + pthread_attr_init (&attr); + pthread_attr_setdetachstate (&attr, TRUE); + if (pthread_create (&id, &attr, record, tr) < 0) { + pthread_attr_destroy (&attr); + cleanup_recorder (tr); + return -1; + } + pthread_attr_destroy (&attr); + + + *out = tr; + return pid; +} +#endif + +/* XXX imagediff - is the extra expense worth it? */ +static cairo_bool_t +matches_reference (struct slave *slave) +{ + cairo_surface_t *a, *b; + + a = slave->image; + b = slave->reference->image; + + if (a == b) + return TRUE; + + if (a == NULL || b == NULL) + return FALSE; + + if (cairo_surface_status (a) || cairo_surface_status (b)) + return FALSE; + + if (cairo_surface_get_type (a) != cairo_surface_get_type (b)) + return FALSE; + + if (cairo_image_surface_get_format (a) != cairo_image_surface_get_format (b)) + return FALSE; + + if (cairo_image_surface_get_width (a) != cairo_image_surface_get_width (b)) + return FALSE; + + if (cairo_image_surface_get_height (a) != cairo_image_surface_get_height (b)) + return FALSE; + + if (cairo_image_surface_get_stride (a) != cairo_image_surface_get_stride (b)) + return FALSE; + + if (FALSE && cairo_surface_get_content (a) & CAIRO_CONTENT_COLOR) { + cairo_surface_t *diff; + int width, height, stride, size; + unsigned char *data; + cairo_status_t status; + + width = cairo_image_surface_get_width (a); + height = cairo_image_surface_get_height (a); + stride = cairo_image_surface_get_stride (a); + size = height * stride * 4; + data = malloc (size); + if (data == NULL) + return FALSE; + + diff = cairo_image_surface_create_for_data (data, + cairo_image_surface_get_format (a), + width, height, stride); + cairo_surface_set_user_data (diff, (cairo_user_data_key_t *) diff, + data, free); + + status = image_diff (NULL, a, b, diff, &slave->result); + if (status) { + cairo_surface_destroy (diff); + return FALSE; + } + + if (image_diff_is_failure (&slave->result, slave->target->error_tolerance)) { + slave->difference = diff; + return FALSE; + } else { + cairo_surface_destroy (diff); + return TRUE; + } + } else { + int width, height, stride; + const uint8_t *aa, *bb; + int x, y; + + width = cairo_image_surface_get_width (a); + height = cairo_image_surface_get_height (a); + stride = cairo_image_surface_get_stride (a); + + aa = cairo_image_surface_get_data (a); + bb = cairo_image_surface_get_data (b); + switch (cairo_image_surface_get_format (a)) { + case CAIRO_FORMAT_ARGB32: + for (y = 0; y < height; y++) { + const uint32_t *ua = (uint32_t *) aa; + const uint32_t *ub = (uint32_t *) bb; + for (x = 0; x < width; x++) { + if (ua[x] != ub[x]) { + int channel; + + for (channel = 0; channel < 4; channel++) { + unsigned va, vb, diff; + + va = (ua[x] >> (channel*8)) & 0xff; + vb = (ub[x] >> (channel*8)) & 0xff; + diff = abs (va - vb); + if (diff > slave->target->error_tolerance) + return FALSE; + } + } + } + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_RGB24: + for (y = 0; y < height; y++) { + const uint32_t *ua = (uint32_t *) aa; + const uint32_t *ub = (uint32_t *) bb; + for (x = 0; x < width; x++) { + if ((ua[x] & 0x00ffffff) != (ub[x] & 0x00ffffff)) { + int channel; + + for (channel = 0; channel < 3; channel++) { + unsigned va, vb, diff; + + va = (ua[x] >> (channel*8)) & 0xff; + vb = (ub[x] >> (channel*8)) & 0xff; + diff = abs (va - vb); + if (diff > slave->target->error_tolerance) + return FALSE; + } + } + } + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_A8: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + if (aa[x] != bb[x]) { + unsigned diff = abs (aa[x] - bb[x]); + if (diff > slave->target->error_tolerance) + return FALSE; + } + } + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_A1: + width /= 8; + for (y = 0; y < height; y++) { + if (memcmp (aa, bb, width)) + return FALSE; + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_INVALID: + assert (0); + } + + return TRUE; + } +} + +static cairo_bool_t +check_images (struct slave *slaves, int num_slaves) +{ + int n; + + if (ignore_image_differences) + return TRUE; + + for (n = 0; n < num_slaves; n++) { + if (slaves[n].reference == NULL) + continue; + + if (! matches_reference (&slaves[n])) + return FALSE; + } + + return TRUE; +} + +static void +write_images (const char *trace, struct slave *slave, int num_slaves) +{ + while (num_slaves--) { + if (slave->image != NULL && ! slave->is_recording) { + char *filename; + + xasprintf (&filename, "%s-%s-fail.png", + trace, slave->target->name); + cairo_surface_write_to_png (slave->image, filename); + free (filename); + + if (slave->difference) { + xasprintf (&filename, "%s-%s-diff.png", + trace, slave->target->name); + cairo_surface_write_to_png (slave->difference, filename); + free (filename); + } + } + + slave++; + } +} + +static void +write_result (const char *trace, struct slave *slave) +{ + static int index; + char *filename; + + xasprintf (&filename, "%s-%s-pass-%d-%d-%d.png", + trace, slave->target->name, ++index, + slave->start_line, slave->end_line); + cairo_surface_write_to_png (slave->image, filename); + free (filename); +} + +static void +write_trace (const char *trace, const char *id, struct slave *slave) +{ +#if CAIRO_HAS_SCRIPT_SURFACE + cairo_device_t *script; + char *filename; + + assert (slave->is_recording); + + xasprintf (&filename, "%s-%s.trace", trace, id); + + script = cairo_script_create (filename); + cairo_script_from_recording_surface (script, slave->image); + cairo_device_destroy (script); + + free (filename); +#endif +} + +static void +dump_traces (test_runner_t *tr, + const char *trace, + const char *target, + const char *fail) +{ +#if CAIRO_HAS_SCRIPT_SURFACE + struct context_closure *c; + + for (c = tr->contexts; c; c = c->next) { + cairo_device_t *script; + char *filename; + + xasprintf (&filename, "%s-%s-%s.%lu.trace", + trace, target, fail, c->start_line); + + script = cairo_script_create (filename); + cairo_script_from_recording_surface (script, c->surface); + cairo_device_destroy (script); + + free (filename); + } +#endif +} + +static unsigned long +allocate_image_for_slave (uint8_t *base, + unsigned long offset, + struct slave *slave) +{ + struct request_image rq; + int size; + uint8_t *data; + + assert (slave->image == NULL); + + readn (slave->fd, &rq, sizeof (rq)); + slave->image_serial = rq.id; + slave->start_line = rq.start_line; + slave->end_line = rq.end_line; + + slave->width = rq.width; + slave->height = rq.height; + + if (DEBUG > 1) { + printf ("allocate-image-for-slave: %s %lu [%lu, %lu] %ldx%ld stride=%lu => %lu, is-recording? %d\n", + TARGET_NAME (slave->target), + slave->image_serial, + slave->start_line, + slave->end_line, + slave->width, + slave->height, + rq.stride, + offset, + slave->is_recording); + } + + if (slave->is_recording) { + /* special communication with recording-surface thread */ + slave->image = cairo_surface_reference ((cairo_surface_t *) rq.stride); + } else { + size = rq.height * rq.stride; + size = (size + 4095) & -4096; + data = base + offset; + offset += size; + assert (offset <= DATA_SIZE); + + slave->image = cairo_image_surface_create_for_data (data, rq.format, + rq.width, rq.height, + rq.stride); + } + + return offset; +} + +struct error_info { + unsigned long context_id; + unsigned long start_line; + unsigned long end_line; +}; + +static cairo_bool_t +test_run (void *base, + int sk, + const char *trace, + struct slave *slaves, + int num_slaves, + struct error_info *error) +{ + struct pollfd *pfd; + int npfd, cnt, n, i; + int completion, err = 0; + cairo_bool_t ret = FALSE; + unsigned long image; + + if (DEBUG) { + printf ("Running trace '%s' over %d slaves\n", + trace, num_slaves); + } + + pfd = xcalloc (num_slaves+1, sizeof (*pfd)); + + pfd[0].fd = sk; + pfd[0].events = POLLIN; + npfd = 1; + + completion = 0; + image = 0; + while ((cnt = poll (pfd, npfd, -1)) > 0) { + if (pfd[0].revents) { + int fd; + + while ((fd = accept (sk, NULL, NULL)) != -1) { + pid_t pid; + + readn (fd, &pid, sizeof (pid)); + for (n = 0; n < num_slaves; n++) { + if (slaves[n].pid == pid) { + slaves[n].fd = fd; + break; + } + } + if (n == num_slaves) { + if (DEBUG) + printf ("unknown slave pid\n"); + goto out; + } + + pfd[npfd].fd = fd; + pfd[npfd].events = POLLIN; + npfd++; + + if (! writen (fd, &pid, sizeof (pid))) + goto out; + } + cnt--; + } + + for (n = 1; n < npfd && cnt; n++) { + if (! pfd[n].revents) + continue; + + if (pfd[n].revents & POLLHUP) { + pfd[n].events = pfd[n].revents = 0; + completion++; + continue; + } + + for (i = 0; i < num_slaves; i++) { + if (slaves[i].fd == pfd[n].fd) { + /* Communication with the slave is done in three phases, + * and we do each pass synchronously. + * + * 1. The slave requests an image buffer, which we + * allocate and then return to the slave the offset into + * the shared memory segment. + * + * 2. The slave indicates that it has finished writing + * into the shared image buffer. The slave now waits + * for the server to collate all the image data - thereby + * throttling the slaves. + * + * 3. After all slaves have finished writing their images, + * we compare them all against the reference image and, + * if satisfied, send an acknowledgement to all slaves. + */ + if (slaves[i].image_serial == 0) { + unsigned long offset; + + image = + allocate_image_for_slave (base, + offset = image, + &slaves[i]); + if (! writen (pfd[n].fd, &offset, sizeof (offset))) { + pfd[n].events = pfd[n].revents = 0; + err = 1; + completion++; + continue; + } + } else { + readn (pfd[n].fd, + &slaves[i].image_ready, + sizeof (slaves[i].image_ready)); + if (DEBUG) { + printf ("slave '%s' reports completion on %lu (expecting %lu)\n", + TARGET_NAME (slaves[i].target), + slaves[i].image_ready, + slaves[i].image_serial); + } + if (slaves[i].image_ready != slaves[i].image_serial) { + pfd[n].events = pfd[n].revents = 0; + err = 1; + completion++; + continue; + } + + /* Can anyone spell 'P·E·D·A·N·T'? */ + if (! slaves[i].is_recording) + cairo_surface_mark_dirty (slaves[i].image); + completion++; + } + + break; + } + } + + cnt--; + } + + if (completion >= num_slaves) { + if (err) { + if (DEBUG > 1) + printf ("error detected\n"); + goto out; + } + + if (DEBUG > 1) { + printf ("all saves report completion\n"); + } + if (slaves[0].end_line >= slaves[0].start_line && + ! check_images (slaves, num_slaves)) { + error->context_id = slaves[0].image_serial; + error->start_line = slaves[0].start_line; + error->end_line = slaves[0].end_line; + + if (DEBUG) { + printf ("check_images failed: %lu, [%lu, %lu]\n", + slaves[0].image_serial, + slaves[0].start_line, + slaves[0].end_line); + } + + write_images (trace, slaves, num_slaves); + + if (slaves[0].is_recording) + write_trace (trace, "fail", &slaves[0]); + + goto out; + } + + if (write_results) write_result (trace, &slaves[1]); + if (write_traces && slaves[0].is_recording) { + char buf[80]; + snprintf (buf, sizeof (buf), "%d", slaves[0].image_serial); + write_trace (trace, buf, &slaves[0]); + } + + /* ack */ + for (i = 0; i < num_slaves; i++) { + cairo_surface_destroy (slaves[i].image); + slaves[i].image = NULL; + + if (DEBUG > 1) { + printf ("sending continuation to '%s'\n", + TARGET_NAME (slaves[i].target)); + } + if (! writen (slaves[i].fd, + &slaves[i].image_serial, + sizeof (slaves[i].image_serial))) + { + goto out; + } + + slaves[i].image_serial = 0; + slaves[i].image_ready = 0; + } + + completion = 0; + image = 0; + } + } +done: + ret = TRUE; + +out: + if (DEBUG) { + printf ("run complete: %d\n", ret); + } + + for (n = 0; n < num_slaves; n++) { + if (slaves[n].fd != -1) + close (slaves[n].fd); + + if (slaves[n].image == NULL) + continue; + + cairo_surface_destroy (slaves[n].image); + slaves[n].image = NULL; + + cairo_surface_destroy (slaves[n].difference); + slaves[n].difference = NULL; + + slaves[n].image_serial = 0; + slaves[n].image_ready = 0; + } + + free (pfd); + + return ret; +} + +static int +server_socket (const char *socket_path) +{ + long flags; + struct sockaddr_un addr; + int sk; + + sk = socket (PF_UNIX, SOCK_STREAM, 0); + if (sk == -1) + return -1; + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, socket_path); + if (bind (sk, (struct sockaddr *) &addr, sizeof (addr)) == -1) { + close (sk); + return -1; + } + + flags = fcntl (sk, F_GETFL); + if (flags == -1 || fcntl (sk, F_SETFL, flags | O_NONBLOCK) == -1) { + close (sk); + return -1; + } + + if (listen (sk, 5) == -1) { + close (sk); + return -1; + } + + return sk; +} + +static int +server_shm (const char *shm_path) +{ + int fd; + + fd = shm_open (shm_path, O_RDWR | O_EXCL | O_CREAT, 0777); + if (fd == -1) + return -1; + + if (ftruncate (fd, DATA_SIZE) == -1) { + close (fd); + return -1; + } + + return fd; +} + +static cairo_bool_t +_test_trace (test_trace_t *test, + const char *trace, + const char *name, + struct error_info *error) +{ + const char *shm_path = SHM_PATH_XXX; + const cairo_boilerplate_target_t *target, *image; + struct slave *slaves, *s; + test_runner_t *recorder = NULL; + pid_t slave; + char socket_dir[] = "/tmp/cairo-test-trace.XXXXXX"; + char *socket_path; + int sk, fd; + int i, num_slaves; + void *base; + cairo_bool_t ret = FALSE; + + if (DEBUG) + printf ("setting up trace '%s'\n", trace); + + /* create a socket to control the test runners */ + if (mkdtemp (socket_dir) == NULL) { + fprintf (stderr, "Unable to create temporary name for socket\n"); + return FALSE; + } + + xasprintf (&socket_path, "%s/socket", socket_dir); + sk = server_socket (socket_path); + if (sk == -1) { + fprintf (stderr, "Unable to create socket for server\n"); + goto cleanup_paths; + } + + /* allocate some shared memory */ + fd = server_shm (shm_path); + if (fd == -1) { + fprintf (stderr, "Unable to create shared memory '%s': %s\n", + shm_path, strerror (errno)); + goto cleanup_sk; + } + + image = cairo_boilerplate_get_image_target (CAIRO_CONTENT_COLOR_ALPHA); + assert (image != NULL); + + s = slaves = xcalloc (2*test->num_targets + 1, sizeof (struct slave)); + +#if CAIRO_HAS_REAL_PTHREAD + /* set-up a recording-surface to reconstruct errors */ + slave = spawn_recorder (socket_path, trace, &recorder); + if (slave < 0) { + fprintf (stderr, "Unable to create recording surface\n"); + goto cleanup_sk; + } + + s->pid = slave; + s->is_recording = TRUE; + s->target = NULL; + s->fd = -1; + s->reference = NULL; + s++; +#endif + + /* spawn slave processes to run the trace */ + for (i = 0; i < test->num_targets; i++) { + const cairo_boilerplate_target_t *reference; + struct slave *master; + + target = test->targets[i]; + + if (DEBUG) + printf ("setting up target[%d]? '%s' (image? %d, measurable? %d)\n", + i, target->name, target == image, target->is_measurable); + + if (target == image || ! target->is_measurable) + continue; + + /* find a matching slave to use as a reference for this target */ + if (target->reference_target != NULL) { + reference = + cairo_boilerplate_get_target_by_name (target->reference_target, + target->content); + assert (reference != NULL); + } else { + reference = image; + } + for (master = slaves; master < s; master++) { + if (master->target == reference) + break; + } + + if (master == s) { + /* no match found, spawn a slave to render the reference image */ + slave = spawn_target (socket_path, shm_path, reference, trace); + if (slave < 0) + continue; + + s->pid = slave; + s->target = reference; + s->fd = -1; + s->reference = NULL; + s++; + } + + slave = spawn_target (socket_path, shm_path, target, trace); + if (slave < 0) + continue; + + s->pid = slave; + s->target = target; + s->fd = -1; + s->reference = master; + s++; + } + num_slaves = s - slaves; + if (num_slaves == 1) { + fprintf (stderr, "No targets to test\n"); + goto cleanup; + } + + base = mmap (NULL, DATA_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (base == MAP_FAILED) { + fprintf (stderr, "Unable to mmap shared memory\n"); + goto cleanup; + } + ret = test_run (base, sk, name, slaves, num_slaves, error); + munmap (base, DATA_SIZE); + +cleanup: + close (fd); + while (s-- > slaves) { + int status; + + if (s->fd != -1) + close (s->fd); + + cairo_surface_destroy (s->image); + cairo_surface_destroy (s->difference); + + if (s->is_recording) /* in-process */ + continue; + + kill (s->pid, SIGKILL); + waitpid (s->pid, &status, 0); + if (WIFSIGNALED (status) && WTERMSIG(status) != SIGKILL) { + fprintf (stderr, "%s crashed\n", s->target->name); + if (recorder) + dump_traces (recorder, trace, s->target->name, "crash"); + } + } + free (slaves); + shm_unlink (shm_path); +cleanup_sk: + close (sk); + +cleanup_paths: + remove (socket_path); + remove (socket_dir); + + free (socket_path); + return ret; +} + +static void +test_trace (test_trace_t *test, const char *trace) +{ + char *trace_cpy, *name, *dot; + + trace_cpy = xstrdup (trace); + name = basename (trace_cpy); + dot = strchr (name, '.'); + if (dot) + *dot = '\0'; + + if (test->list_only) { + printf ("%s\n", name); + } else { + struct error_info error = {0}; + cairo_bool_t ret; + + printf ("%s: ", name); + fflush (stdout); + + ret = _test_trace (test, trace, name, &error); + if (ret) { + printf ("PASS\n"); + } else { + if (error.context_id) { + printf ("FAIL (context %lu, lines [%lu, %lu])\n", + error.context_id, + error.start_line, + error.end_line); + } else { + printf ("FAIL\n"); + } + } + } + + free (trace_cpy); +} + +static cairo_bool_t +read_excludes (test_trace_t *test, const char *filename) +{ + FILE *file; + char *line = NULL; + size_t line_size = 0; + char *s, *t; + + file = fopen (filename, "r"); + if (file == NULL) + return FALSE; + + while (getline (&line, &line_size, file) != -1) { + /* terminate the line at a comment marker '#' */ + s = strchr (line, '#'); + if (s) + *s = '\0'; + + /* whitespace delimits */ + s = line; + while (*s != '\0' && isspace (*s)) + s++; + + t = s; + while (*t != '\0' && ! isspace (*t)) + t++; + + if (s != t) { + int i = test->num_exclude_names; + test->exclude_names = xrealloc (test->exclude_names, + sizeof (char *) * (i+1)); + test->exclude_names[i] = strndup (s, t-s); + test->num_exclude_names++; + } + } + free (line); + + fclose (file); + + return TRUE; +} + +static void +usage (const char *argv0) +{ + fprintf (stderr, +"Usage: %s [-l] [-x exclude-file] [test-names ... | traces ...]\n" +"\n" +"Run the cairo test suite over the given traces (all by default).\n" +"The command-line arguments are interpreted as follows:\n" +"\n" +" -l list only; just list selected test case names without executing\n" +" -x exclude; specify a file to read a list of traces to exclude\n" +"\n" +"If test names are given they are used as sub-string matches so a command\n" +"such as \"%s firefox\" can be used to run all firefox traces.\n" +"Alternatively, you can specify a list of filenames to execute.\n", + argv0, argv0); +} + +static void +parse_options (test_trace_t *test, int argc, char *argv[]) +{ + int c; + + test->list_only = FALSE; + test->names = NULL; + test->num_names = 0; + test->exclude_names = NULL; + test->num_exclude_names = 0; + + while (1) { + c = _cairo_getopt (argc, argv, "lx:"); + if (c == -1) + break; + + switch (c) { + case 'l': + test->list_only = TRUE; + break; + case 'x': + if (! read_excludes (test, optarg)) { + fprintf (stderr, "Invalid argument for -x (not readable file): %s\n", + optarg); + exit (1); + } + break; + default: + fprintf (stderr, "Internal error: unhandled option: %c\n", c); + /* fall-through */ + case '?': + usage (argv[0]); + exit (1); + } + } + + if (optind < argc) { + test->names = &argv[optind]; + test->num_names = argc - optind; + } +} + +static void +test_reset (test_trace_t *test) +{ + /* XXX leaking fonts again via recording-surface? */ +#if 0 + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif +#endif +} + +static void +test_fini (test_trace_t *test) +{ + test_reset (test); + + cairo_boilerplate_free_targets (test->targets); + free (test->exclude_names); +} + +static cairo_bool_t +test_has_filenames (test_trace_t *test) +{ + unsigned int i; + + if (test->num_names == 0) + return FALSE; + + for (i = 0; i < test->num_names; i++) + if (access (test->names[i], R_OK) == 0) + return TRUE; + + return FALSE; +} + +static cairo_bool_t +test_can_run (test_trace_t *test, const char *name) +{ + unsigned int i; + char *copy, *dot; + cairo_bool_t ret; + + if (test->num_names == 0 && test->num_exclude_names == 0) + return TRUE; + + copy = xstrdup (name); + dot = strrchr (copy, '.'); + if (dot != NULL) + *dot = '\0'; + + if (test->num_names) { + ret = TRUE; + for (i = 0; i < test->num_names; i++) + if (strstr (copy, test->names[i])) + goto check_exclude; + + ret = FALSE; + goto done; + } + +check_exclude: + if (test->num_exclude_names) { + ret = FALSE; + for (i = 0; i < test->num_exclude_names; i++) + if (strstr (copy, test->exclude_names[i])) + goto done; + + ret = TRUE; + goto done; + } + +done: + free (copy); + + return ret; +} + +static void +warn_no_traces (const char *message, const char *trace_dir) +{ + fprintf (stderr, +"Error: %s '%s'.\n" +"Have you cloned the cairo-traces repository and uncompressed the traces?\n" +" git clone git://anongit.freedesktop.org/cairo-traces\n" +" cd cairo-traces && make\n" +"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n", + message, trace_dir); +} + +static void +interrupt (int sig) +{ + shm_unlink (SHM_PATH_XXX); + + signal (sig, SIG_DFL); + raise (sig); +} + +int +main (int argc, char *argv[]) +{ + test_trace_t test; + const char *trace_dir = "cairo-traces"; + unsigned int n; + + signal (SIGPIPE, SIG_IGN); + signal (SIGINT, interrupt); + + parse_options (&test, argc, argv); + + shm_unlink (SHM_PATH_XXX); + + if (getenv ("CAIRO_TRACE_DIR") != NULL) + trace_dir = getenv ("CAIRO_TRACE_DIR"); + + test.targets = cairo_boilerplate_get_targets (&test.num_targets, NULL); + + if (test_has_filenames (&test)) { + for (n = 0; n < test.num_names; n++) { + if (access (test.names[n], R_OK) == 0) { + test_trace (&test, test.names[n]); + test_reset (&test); + } + } + } else { + DIR *dir; + struct dirent *de; + int num_traces = 0; + + dir = opendir (trace_dir); + if (dir == NULL) { + warn_no_traces ("Failed to open directory", trace_dir); + test_fini (&test); + return 1; + } + + while ((de = readdir (dir)) != NULL) { + char *trace; + const char *dot; + + dot = strrchr (de->d_name, '.'); + if (dot == NULL) + continue; + if (strcmp (dot, ".trace")) + continue; + + num_traces++; + if (! test_can_run (&test, de->d_name)) + continue; + + xasprintf (&trace, "%s/%s", trace_dir, de->d_name); + test_trace (&test, trace); + test_reset (&test); + + free (trace); + + } + closedir (dir); + + if (num_traces == 0) { + warn_no_traces ("Found no traces in", trace_dir); + test_fini (&test); + return 1; + } + } + + test_fini (&test); + + return 0; +} + +void +cairo_test_logv (const cairo_test_context_t *ctx, + const char *fmt, va_list va) +{ +#if 0 + vfprintf (stderr, fmt, va); +#endif +} + +void +cairo_test_log (const cairo_test_context_t *ctx, const char *fmt, ...) +{ +#if 0 + va_list va; + + va_start (va, fmt); + vfprintf (stderr, fmt, va); + va_end (va); +#endif +} diff --git a/test/cairo-test.c b/test/cairo-test.c new file mode 100644 index 000000000..a351b0174 --- /dev/null +++ b/test/cairo-test.c @@ -0,0 +1,1803 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#define _GNU_SOURCE 1 /* for feenableexcept() et al */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#if HAVE_UNISTD_H +#include +#endif +#include +#include +#if HAVE_FCFINI +#include +#endif +#if CAIRO_HAS_REAL_PTHREAD +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif + +#if HAVE_VALGRIND +#include +#else +#define RUNNING_ON_VALGRIND 0 +#endif + +#if HAVE_MEMFAULT +#include +#define MF(x) x +#else +#define MF(x) +#endif + +#include "cairo-test-private.h" + +#include "buffer-diff.h" + +#ifdef _MSC_VER +#include +#include +#define F_OK 0 +#define HAVE_MKDIR 1 +#define mkdir _mkdir +#endif + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE !FALSE +#endif + +#if ! HAVE_ALARM || ! defined(SIGALRM) +#define alarm(X); +#endif + +static const cairo_user_data_key_t _cairo_test_context_key; + +static void +_xunlink (const cairo_test_context_t *ctx, const char *pathname); + +static const char *fail_face = "", *xfail_face="", *normal_face = ""; +static cairo_bool_t print_fail_on_stdout; +static int cairo_test_timeout = 60; + +#define NUM_DEVICE_OFFSETS 2 +#define NUM_DEVICE_SCALE 2 + +cairo_bool_t +cairo_test_mkdir (const char *path) +{ +#if ! HAVE_MKDIR + return FALSE; +#elif HAVE_MKDIR == 1 + if (mkdir (path) == 0) + return TRUE; +#elif HAVE_MKDIR == 2 + if (mkdir (path, 0770) == 0) + return TRUE; +#else +#error Bad value for HAVE_MKDIR +#endif + + return errno == EEXIST; +} + +static char * +_cairo_test_fixup_name (const char *original) +{ + char *name, *s; + + s = name = xstrdup (original); + while ((s = strchr (s, '_')) != NULL) + *s++ = '-'; + + return name; +} + +char * +cairo_test_get_name (const cairo_test_t *test) +{ + return _cairo_test_fixup_name (test->name); +} + +static void +_cairo_test_init (cairo_test_context_t *ctx, + const cairo_test_context_t *parent, + const cairo_test_t *test, + const char *test_name, + const char *output) +{ + char *log_name; + + MF (MEMFAULT_DISABLE_FAULTS ()); + +#if HAVE_FEENABLEEXCEPT + feenableexcept (FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); +#endif + + ctx->test = test; + ctx->test_name = _cairo_test_fixup_name (test_name); + ctx->output = output; + + cairo_test_mkdir (ctx->output); + + ctx->malloc_failure = 0; +#if HAVE_MEMFAULT + if (getenv ("CAIRO_TEST_MALLOC_FAILURE")) + ctx->malloc_failure = atoi (getenv ("CAIRO_TEST_MALLOC_FAILURE")); + if (ctx->malloc_failure && ! RUNNING_ON_MEMFAULT ()) + ctx->malloc_failure = 0; +#endif + + ctx->timeout = cairo_test_timeout; + if (getenv ("CAIRO_TEST_TIMEOUT")) + ctx->timeout = atoi (getenv ("CAIRO_TEST_TIMEOUT")); + + xasprintf (&log_name, "%s/%s%s", ctx->output, ctx->test_name, CAIRO_TEST_LOG_SUFFIX); + _xunlink (NULL, log_name); + + ctx->log_file = fopen (log_name, "a"); + if (ctx->log_file == NULL) { + fprintf (stderr, "Error opening log file: %s\n", log_name); + ctx->log_file = stderr; + } + free (log_name); + + ctx->ref_name = NULL; + ctx->ref_image = NULL; + ctx->ref_image_flattened = NULL; + + if (parent != NULL) { + ctx->targets_to_test = parent->targets_to_test; + ctx->num_targets = parent->num_targets; + ctx->limited_targets = parent->limited_targets; + ctx->own_targets = FALSE; + + ctx->srcdir = parent->srcdir; + ctx->refdir = parent->refdir; + } else { + int tmp_num_targets; + cairo_bool_t tmp_limited_targets; + + ctx->targets_to_test = cairo_boilerplate_get_targets (&tmp_num_targets, &tmp_limited_targets); + ctx->num_targets = tmp_num_targets; + ctx->limited_targets = tmp_limited_targets; + ctx->own_targets = TRUE; + + ctx->srcdir = getenv ("srcdir"); + if (ctx->srcdir == NULL) + ctx->srcdir = "."; + + ctx->refdir = getenv ("CAIRO_REF_DIR"); + } + +#ifdef HAVE_UNISTD_H + if (*fail_face == '\0' && isatty (2)) { + fail_face = "\033[41;37;1m"; + xfail_face = "\033[43;37;1m"; + normal_face = "\033[m"; + if (isatty (1)) + print_fail_on_stdout = FALSE; + } +#endif + + printf ("\nTESTING %s\n", ctx->test_name); +} + +void +_cairo_test_context_init_for_test (cairo_test_context_t *ctx, + const cairo_test_context_t *parent, + const cairo_test_t *test) +{ + _cairo_test_init (ctx, parent, test, test->name, CAIRO_TEST_OUTPUT_DIR); +} + +void +cairo_test_init (cairo_test_context_t *ctx, + const char *test_name, + const char *output) +{ + _cairo_test_init (ctx, NULL, NULL, test_name, output); +} + +void +cairo_test_fini (cairo_test_context_t *ctx) +{ + if (ctx->log_file == NULL) + return; + + if (ctx->log_file != stderr) + fclose (ctx->log_file); + ctx->log_file = NULL; + + free (ctx->ref_name); + cairo_surface_destroy (ctx->ref_image); + cairo_surface_destroy (ctx->ref_image_flattened); + + if (ctx->test_name != NULL) + free ((char *) ctx->test_name); + + if (ctx->own_targets) + cairo_boilerplate_free_targets (ctx->targets_to_test); + + cairo_boilerplate_fini (); + + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif +} + +void +cairo_test_logv (const cairo_test_context_t *ctx, + const char *fmt, va_list va) +{ + FILE *file = ctx && ctx->log_file ? ctx->log_file : stderr; + vfprintf (file, fmt, va); +} + +void +cairo_test_log (const cairo_test_context_t *ctx, const char *fmt, ...) +{ + va_list va; + + va_start (va, fmt); + cairo_test_logv (ctx, fmt, va); + va_end (va); +} + +static void +_xunlink (const cairo_test_context_t *ctx, const char *pathname) +{ + if (unlink (pathname) < 0 && errno != ENOENT) { + cairo_test_log (ctx, "Error: Cannot remove %s: %s\n", + pathname, strerror (errno)); + exit (1); + } +} + +char * +cairo_test_reference_filename (const cairo_test_context_t *ctx, + const char *base_name, + const char *test_name, + const char *target_name, + const char *base_target_name, + const char *format, + const char *suffix, + const char *extension) +{ + char *ref_name = NULL; + + /* First look for a previous build for comparison. */ + if (ctx->refdir != NULL && strcmp(suffix, CAIRO_TEST_REF_SUFFIX) == 0) { + xasprintf (&ref_name, "%s/%s" CAIRO_TEST_OUT_SUFFIX "%s", + ctx->refdir, + base_name, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + } + + if (target_name != NULL) { + /* Next look for a target/format-specific reference image. */ + xasprintf (&ref_name, "%s/reference/%s.%s.%s%s%s", + ctx->srcdir, + test_name, + target_name, + format, + suffix, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + + /* Next, look for target-specific reference image. */ + xasprintf (&ref_name, "%s/reference/%s.%s%s%s", + ctx->srcdir, + test_name, + target_name, + suffix, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + } + + if (base_target_name != NULL) { + /* Next look for a base/format-specific reference image. */ + xasprintf (&ref_name, "%s/reference/%s.%s.%s%s%s", + ctx->srcdir, + test_name, + base_target_name, + format, + suffix, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + + /* Next, look for base-specific reference image. */ + xasprintf (&ref_name, "%s/reference/%s.%s%s%s", + ctx->srcdir, + test_name, + base_target_name, + suffix, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + } + + /* Next, look for format-specific reference image. */ + xasprintf (&ref_name, "%s/reference/%s.%s%s%s", + ctx->srcdir, + test_name, + format, + suffix, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + + /* Finally, look for the standard reference image. */ + xasprintf (&ref_name, "%s/reference/%s%s%s", ctx->srcdir, + test_name, + suffix, + extension); + if (access (ref_name, F_OK) != 0) + free (ref_name); + else + goto done; + + ref_name = NULL; + +done: + return ref_name; +} + +cairo_test_similar_t +cairo_test_target_has_similar (const cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target) +{ + cairo_surface_t *surface; + cairo_test_similar_t has_similar; + cairo_t * cr; + cairo_surface_t *similar; + cairo_status_t status; + void *closure; + char *path; + + /* ignore image intermediate targets */ + if (target->expected_type == CAIRO_SURFACE_TYPE_IMAGE) + return DIRECT; + + if (getenv ("CAIRO_TEST_IGNORE_SIMILAR")) + return DIRECT; + + xasprintf (&path, "%s/%s", + cairo_test_mkdir (ctx->output) ? ctx->output : ".", + ctx->test_name); + + has_similar = DIRECT; + do { + do { + surface = (target->create_surface) (path, + target->content, + ctx->test->width, + ctx->test->height, + ctx->test->width* NUM_DEVICE_SCALE + 25 * NUM_DEVICE_OFFSETS, + ctx->test->height* NUM_DEVICE_SCALE + 25 * NUM_DEVICE_OFFSETS, + CAIRO_BOILERPLATE_MODE_TEST, + &closure); + if (surface == NULL) + goto out; + } while (cairo_test_malloc_failure (ctx, cairo_surface_status (surface))); + + if (cairo_surface_status (surface)) + goto out; + + cr = cairo_create (surface); + cairo_push_group_with_content (cr, + cairo_boilerplate_content (target->content)); + similar = cairo_get_group_target (cr); + status = cairo_surface_status (similar); + + if (cairo_surface_get_type (similar) == cairo_surface_get_type (surface)) + has_similar = SIMILAR; + else + has_similar = DIRECT; + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + if (target->cleanup) + target->cleanup (closure); + } while (! has_similar && cairo_test_malloc_failure (ctx, status)); +out: + free (path); + + return has_similar; +} + +static cairo_surface_t * +_cairo_test_flatten_reference_image (cairo_test_context_t *ctx, + cairo_bool_t flatten) +{ + cairo_surface_t *surface; + cairo_t *cr; + + if (! flatten) + return ctx->ref_image; + + if (ctx->ref_image_flattened != NULL) + return ctx->ref_image_flattened; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + cairo_image_surface_get_width (ctx->ref_image), + cairo_image_surface_get_height (ctx->ref_image)); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_surface (cr, ctx->ref_image, 0, 0); + cairo_paint (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + if (cairo_surface_status (surface) == CAIRO_STATUS_SUCCESS) + ctx->ref_image_flattened = surface; + return surface; +} + +cairo_surface_t * +cairo_test_get_reference_image (cairo_test_context_t *ctx, + const char *filename, + cairo_bool_t flatten) +{ + cairo_surface_t *surface; + + if (ctx->ref_name != NULL) { + if (strcmp (ctx->ref_name, filename) == 0) + return _cairo_test_flatten_reference_image (ctx, flatten); + + cairo_surface_destroy (ctx->ref_image); + ctx->ref_image = NULL; + + cairo_surface_destroy (ctx->ref_image_flattened); + ctx->ref_image_flattened = NULL; + + free (ctx->ref_name); + ctx->ref_name = NULL; + } + + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) + return surface; + + ctx->ref_name = xstrdup (filename); + ctx->ref_image = surface; + return _cairo_test_flatten_reference_image (ctx, flatten); +} + +static cairo_bool_t +cairo_test_file_is_older (const char *filename, + char **ref_filenames, + int num_ref_filenames) +{ +#if HAVE_SYS_STAT_H + struct stat st; + + if (stat (filename, &st) < 0) + return FALSE; + + while (num_ref_filenames--) { + struct stat ref; + char *ref_filename = *ref_filenames++; + + if (ref_filename == NULL) + continue; + + if (stat (ref_filename++, &ref) < 0) + continue; + + if (st.st_mtime <= ref.st_mtime) + return TRUE; + } +#endif + + return FALSE; +} + +static cairo_bool_t +cairo_test_files_equal (const char *test_filename, + const char *pass_filename) +{ + FILE *test, *pass; + int t, p; + + if (test_filename == NULL || pass_filename == NULL) + return FALSE; + + test = fopen (test_filename, "rb"); + if (test == NULL) + return FALSE; + + pass = fopen (pass_filename, "rb"); + if (pass == NULL) { + fclose (test); + return FALSE; + } + + /* as simple as it gets */ + do { + t = getc (test); + p = getc (pass); + if (t != p) + break; + } while (t != EOF && p != EOF); + + fclose (pass); + fclose (test); + + return t == p; /* both EOF */ +} + +static cairo_bool_t +cairo_test_copy_file (const char *src_filename, + const char *dst_filename) +{ + FILE *src, *dst; + int c; + +#if HAVE_LINK + if (link (src_filename, dst_filename) == 0) + return TRUE; + + unlink (dst_filename); +#endif + + src = fopen (src_filename, "rb"); + if (src == NULL) + return FALSE; + + dst = fopen (dst_filename, "wb"); + if (dst == NULL) { + fclose (src); + return FALSE; + } + + /* as simple as it gets */ + while ((c = getc (src)) != EOF) + putc (c, dst); + + fclose (src); + fclose (dst); + + return TRUE; +} + +static cairo_test_status_t +cairo_test_for_target (cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target, + int dev_offset, + int dev_scale, + cairo_bool_t similar) +{ + cairo_test_status_t status; + cairo_surface_t *surface = NULL; + cairo_t *cr; + const char *empty_str = ""; + char *offset_str; + char *scale_str; + char *base_name, *base_path; + char *out_png_path; + char *ref_path = NULL, *ref_png_path, *cmp_png_path = NULL; + char *new_path = NULL, *new_png_path; + char *xfail_path = NULL, *xfail_png_path; + char *base_ref_png_path; + char *base_new_png_path; + char *base_xfail_png_path; + char *diff_png_path; + char *test_filename = NULL, *pass_filename = NULL, *fail_filename = NULL; + cairo_test_status_t ret; + cairo_content_t expected_content; + cairo_font_options_t *font_options; + const char *format; + cairo_bool_t have_output = FALSE; + cairo_bool_t have_result = FALSE; + void *closure; + double width, height; + cairo_bool_t have_output_dir; +#if HAVE_MEMFAULT + int malloc_failure_iterations = ctx->malloc_failure; + int last_fault_count = 0; +#endif + + /* Get the strings ready that we'll need. */ + format = cairo_boilerplate_content_name (target->content); + if (dev_offset) + xasprintf (&offset_str, ".%d", dev_offset); + else + offset_str = (char *) empty_str; + + if (dev_scale != 1) + xasprintf (&scale_str, ".x%d", dev_scale); + else + scale_str = (char *) empty_str; + + xasprintf (&base_name, "%s.%s.%s%s%s%s", + ctx->test_name, + target->name, + format, + similar ? ".similar" : "", + offset_str, + scale_str); + + if (offset_str != empty_str) + free (offset_str); + if (scale_str != empty_str) + free (scale_str); + + ref_png_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + target->name, + target->basename, + format, + CAIRO_TEST_REF_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + new_png_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + target->name, + target->basename, + format, + CAIRO_TEST_NEW_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + xfail_png_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + target->name, + target->basename, + format, + CAIRO_TEST_XFAIL_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + + base_ref_png_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + NULL, NULL, + format, + CAIRO_TEST_REF_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + base_new_png_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + NULL, NULL, + format, + CAIRO_TEST_NEW_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + base_xfail_png_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + NULL, NULL, + format, + CAIRO_TEST_XFAIL_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + + if (target->file_extension != NULL) { + ref_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + target->name, + target->basename, + format, + CAIRO_TEST_REF_SUFFIX, + target->file_extension); + new_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + target->name, + target->basename, + format, + CAIRO_TEST_NEW_SUFFIX, + target->file_extension); + xfail_path = cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + target->name, + target->basename, + format, + CAIRO_TEST_XFAIL_SUFFIX, + target->file_extension); + } + + have_output_dir = cairo_test_mkdir (ctx->output); + xasprintf (&base_path, "%s/%s", + have_output_dir ? ctx->output : ".", + base_name); + xasprintf (&out_png_path, "%s" CAIRO_TEST_OUT_PNG, base_path); + xasprintf (&diff_png_path, "%s" CAIRO_TEST_DIFF_PNG, base_path); + + if (ctx->test->requirements != NULL) { + const char *required; + + required = target->is_vector ? "target=raster" : "target=vector"; + if (strstr (ctx->test->requirements, required) != NULL) { + cairo_test_log (ctx, "Error: Skipping for %s target %s\n", + target->is_vector ? "vector" : "raster", + target->name); + ret = CAIRO_TEST_UNTESTED; + goto UNWIND_STRINGS; + } + + required = target->is_recording ? "target=!recording" : "target=recording"; + if (strstr (ctx->test->requirements, required) != NULL) { + cairo_test_log (ctx, "Error: Skipping for %s target %s\n", + target->is_recording ? "recording" : "non-recording", + target->name); + ret = CAIRO_TEST_UNTESTED; + goto UNWIND_STRINGS; + } + } + + width = ctx->test->width; + height = ctx->test->height; + if (width && height) { + width *= dev_scale; + height *= dev_scale; + width += dev_offset; + height += dev_offset; + } + +#if HAVE_MEMFAULT +REPEAT: + MEMFAULT_CLEAR_FAULTS (); + MEMFAULT_RESET_LEAKS (); + ctx->last_fault_count = 0; + last_fault_count = MEMFAULT_COUNT_FAULTS (); + + /* Pre-initialise fontconfig so that the configuration is loaded without + * malloc failures (our primary goal is to test cairo fault tolerance). + */ +#if HAVE_FCINIT + FcInit (); +#endif + + MEMFAULT_ENABLE_FAULTS (); +#endif + have_output = FALSE; + have_result = FALSE; + + /* Run the actual drawing code. */ + ret = CAIRO_TEST_SUCCESS; + surface = (target->create_surface) (base_path, + target->content, + width, height, + ctx->test->width * NUM_DEVICE_SCALE + 25 * NUM_DEVICE_OFFSETS, + ctx->test->height * NUM_DEVICE_SCALE + 25 * NUM_DEVICE_OFFSETS, + CAIRO_BOILERPLATE_MODE_TEST, + &closure); + if (surface == NULL) { + cairo_test_log (ctx, "Error: Failed to set %s target\n", target->name); + ret = CAIRO_TEST_UNTESTED; + goto UNWIND_STRINGS; + } + +#if HAVE_MEMFAULT + if (ctx->malloc_failure && + MEMFAULT_COUNT_FAULTS () - last_fault_count > 0 && + cairo_surface_status (surface) == CAIRO_STATUS_NO_MEMORY) + { + goto REPEAT; + } +#endif + + if (cairo_surface_status (surface)) { + MF (MEMFAULT_PRINT_FAULTS ()); + cairo_test_log (ctx, "Error: Created an error surface: %s\n", + cairo_status_to_string (cairo_surface_status (surface))); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_STRINGS; + } + + /* Check that we created a surface of the expected type. */ + if (cairo_surface_get_type (surface) != target->expected_type) { + MF (MEMFAULT_PRINT_FAULTS ()); + cairo_test_log (ctx, "Error: Created surface is of type %d (expected %d)\n", + cairo_surface_get_type (surface), target->expected_type); + ret = CAIRO_TEST_UNTESTED; + goto UNWIND_SURFACE; + } + + /* Check that we created a surface of the expected content, + * (ignore the artificial CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED value). + */ + expected_content = cairo_boilerplate_content (target->content); + + if (cairo_surface_get_content (surface) != expected_content) { + MF (MEMFAULT_PRINT_FAULTS ()); + cairo_test_log (ctx, "Error: Created surface has content %d (expected %d)\n", + cairo_surface_get_content (surface), expected_content); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_SURFACE; + } + + if (cairo_surface_set_user_data (surface, + &cairo_boilerplate_output_basename_key, + base_path, + NULL)) + { +#if HAVE_MEMFAULT + cairo_surface_destroy (surface); + + if (target->cleanup) + target->cleanup (closure); + + goto REPEAT; +#else + ret = CAIRO_TEST_FAILURE; + goto UNWIND_SURFACE; +#endif + } + + cairo_surface_set_device_offset (surface, dev_offset, dev_offset); + cairo_surface_set_device_scale (surface, dev_scale, dev_scale); + + cr = cairo_create (surface); + if (cairo_set_user_data (cr, &_cairo_test_context_key, (void*) ctx, NULL)) { +#if HAVE_MEMFAULT + cairo_destroy (cr); + cairo_surface_destroy (surface); + + if (target->cleanup) + target->cleanup (closure); + + goto REPEAT; +#else + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; +#endif + } + + if (similar) + cairo_push_group_with_content (cr, expected_content); + + /* Clear to transparent (or black) depending on whether the target + * surface supports alpha. */ + cairo_save (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr); + cairo_restore (cr); + + /* Set all components of font_options to avoid backend differences + * and reduce number of needed reference images. */ + font_options = cairo_font_options_create (); + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_ON); + cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_GRAY); + cairo_set_font_options (cr, font_options); + cairo_font_options_destroy (font_options); + + cairo_save (cr); + alarm (ctx->timeout); + status = (ctx->test->draw) (cr, ctx->test->width, ctx->test->height); + alarm (0); + cairo_restore (cr); + + if (similar) { + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + } + +#if HAVE_MEMFAULT + MEMFAULT_DISABLE_FAULTS (); + + /* repeat test after malloc failure injection */ + if (ctx->malloc_failure && + MEMFAULT_COUNT_FAULTS () - last_fault_count > 0 && + (status == CAIRO_TEST_NO_MEMORY || + cairo_status (cr) == CAIRO_STATUS_NO_MEMORY || + cairo_surface_status (surface) == CAIRO_STATUS_NO_MEMORY)) + { + cairo_destroy (cr); + cairo_surface_destroy (surface); + if (target->cleanup) + target->cleanup (closure); + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif + if (MEMFAULT_COUNT_LEAKS () > 0) { + MEMFAULT_PRINT_FAULTS (); + MEMFAULT_PRINT_LEAKS (); + } + + goto REPEAT; + } +#endif + + /* Then, check all the different ways it could fail. */ + if (status) { + cairo_test_log (ctx, "Error: Function under test failed\n"); + ret = status; + goto UNWIND_CAIRO; + } + +#if HAVE_MEMFAULT + if (MEMFAULT_COUNT_FAULTS () - last_fault_count > 0 && + MEMFAULT_HAS_FAULTS ()) + { + VALGRIND_PRINTF ("Unreported memfaults..."); + MEMFAULT_PRINT_FAULTS (); + } +#endif + + if (target->finish_surface != NULL) { +#if HAVE_MEMFAULT + /* We need to re-enable faults as most recording-surface processing + * is done during cairo_surface_finish(). + */ + MEMFAULT_CLEAR_FAULTS (); + last_fault_count = MEMFAULT_COUNT_FAULTS (); + MEMFAULT_ENABLE_FAULTS (); +#endif + + /* also check for infinite loops whilst replaying */ + alarm (ctx->timeout); + status = target->finish_surface (surface); + alarm (0); + +#if HAVE_MEMFAULT + MEMFAULT_DISABLE_FAULTS (); + + if (ctx->malloc_failure && + MEMFAULT_COUNT_FAULTS () - last_fault_count > 0 && + status == CAIRO_STATUS_NO_MEMORY) + { + cairo_destroy (cr); + cairo_surface_destroy (surface); + if (target->cleanup) + target->cleanup (closure); + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif + if (MEMFAULT_COUNT_LEAKS () > 0) { + MEMFAULT_PRINT_FAULTS (); + MEMFAULT_PRINT_LEAKS (); + } + + goto REPEAT; + } +#endif + if (status) { + cairo_test_log (ctx, "Error: Failed to finish surface: %s\n", + cairo_status_to_string (status)); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; + } + } + + /* Skip image check for tests with no image (width,height == 0,0) */ + if (ctx->test->width != 0 && ctx->test->height != 0) { + cairo_surface_t *ref_image; + cairo_surface_t *test_image; + cairo_surface_t *diff_image; + buffer_diff_result_t result; + cairo_status_t diff_status; + + if (ref_png_path == NULL) { + cairo_test_log (ctx, "Error: Cannot find reference image for %s\n", + base_name); + + /* we may be running this test to generate reference images */ + _xunlink (ctx, out_png_path); + /* be more generous as we may need to use external renderers */ + alarm (4 * ctx->timeout); + test_image = target->get_image_surface (surface, 0, + ctx->test->width, + ctx->test->height); + alarm (0); + diff_status = cairo_surface_write_to_png (test_image, out_png_path); + cairo_surface_destroy (test_image); + if (diff_status) { + if (cairo_surface_status (test_image) == CAIRO_STATUS_INVALID_STATUS) + ret = CAIRO_TEST_CRASHED; + else + ret = CAIRO_TEST_FAILURE; + cairo_test_log (ctx, + "Error: Failed to write output image: %s\n", + cairo_status_to_string (diff_status)); + } + have_output = TRUE; + + ret = CAIRO_TEST_XFAILURE; + goto UNWIND_CAIRO; + } + + if (target->file_extension != NULL) { /* compare vector surfaces */ + char *filenames[] = { + ref_png_path, + ref_path, + new_png_path, + new_path, + xfail_png_path, + xfail_path, + base_ref_png_path, + base_new_png_path, + base_xfail_png_path, + }; + + xasprintf (&test_filename, "%s.out%s", + base_path, target->file_extension); + xasprintf (&pass_filename, "%s.pass%s", + base_path, target->file_extension); + xasprintf (&fail_filename, "%s.fail%s", + base_path, target->file_extension); + + if (cairo_test_file_is_older (pass_filename, + filenames, + ARRAY_LENGTH (filenames))) + { + _xunlink (ctx, pass_filename); + } + if (cairo_test_file_is_older (fail_filename, + filenames, + ARRAY_LENGTH (filenames))) + { + _xunlink (ctx, fail_filename); + } + + if (cairo_test_files_equal (out_png_path, ref_path)) { + cairo_test_log (ctx, "Vector surface matches reference.\n"); + have_output = FALSE; + ret = CAIRO_TEST_SUCCESS; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, new_path)) { + cairo_test_log (ctx, "Vector surface matches current failure.\n"); + have_output = FALSE; + ret = CAIRO_TEST_NEW; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, xfail_path)) { + cairo_test_log (ctx, "Vector surface matches known failure.\n"); + have_output = FALSE; + ret = CAIRO_TEST_XFAILURE; + goto UNWIND_CAIRO; + } + + if (cairo_test_files_equal (test_filename, pass_filename)) { + /* identical output as last known PASS */ + cairo_test_log (ctx, "Vector surface matches last pass.\n"); + have_output = TRUE; + ret = CAIRO_TEST_SUCCESS; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (test_filename, fail_filename)) { + /* identical output as last known FAIL, fail */ + cairo_test_log (ctx, "Vector surface matches last fail.\n"); + have_result = TRUE; /* presume these were kept around as well */ + have_output = TRUE; + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; + } + } + + /* be more generous as we may need to use external renderers */ + alarm (4 * ctx->timeout); + test_image = target->get_image_surface (surface, 0, + ctx->test->width, + ctx->test->height); + alarm (0); + if (cairo_surface_status (test_image)) { + cairo_test_log (ctx, "Error: Failed to extract image: %s\n", + cairo_status_to_string (cairo_surface_status (test_image))); + if (cairo_surface_status (test_image) == CAIRO_STATUS_INVALID_STATUS) + ret = CAIRO_TEST_CRASHED; + else + ret = CAIRO_TEST_FAILURE; + cairo_surface_destroy (test_image); + goto UNWIND_CAIRO; + } + + _xunlink (ctx, out_png_path); + diff_status = cairo_surface_write_to_png (test_image, out_png_path); + if (diff_status) { + cairo_test_log (ctx, "Error: Failed to write output image: %s\n", + cairo_status_to_string (diff_status)); + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; + } + have_output = TRUE; + + /* binary compare png files (no decompression) */ + if (target->file_extension == NULL) { + char *filenames[] = { + ref_png_path, + new_png_path, + xfail_png_path, + base_ref_png_path, + base_new_png_path, + base_xfail_png_path, + }; + + xasprintf (&test_filename, "%s", out_png_path); + xasprintf (&pass_filename, "%s.pass.png", base_path); + xasprintf (&fail_filename, "%s.fail.png", base_path); + + if (cairo_test_file_is_older (pass_filename, + filenames, + ARRAY_LENGTH (filenames))) + { + _xunlink (ctx, pass_filename); + } + if (cairo_test_file_is_older (fail_filename, + filenames, + ARRAY_LENGTH (filenames))) + { + _xunlink (ctx, fail_filename); + } + + if (cairo_test_files_equal (test_filename, pass_filename)) { + cairo_test_log (ctx, "PNG file exactly matches last pass.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_SUCCESS; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, ref_png_path)) { + cairo_test_log (ctx, "PNG file exactly matches reference image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_SUCCESS; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, new_png_path)) { + cairo_test_log (ctx, "PNG file exactly matches current failure image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_NEW; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, xfail_png_path)) { + cairo_test_log (ctx, "PNG file exactly matches known failure image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_XFAILURE; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (test_filename, fail_filename)) { + cairo_test_log (ctx, "PNG file exactly matches last fail.\n"); + have_result = TRUE; /* presume these were kept around as well */ + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; + } + } else { + if (cairo_test_files_equal (out_png_path, ref_png_path)) { + cairo_test_log (ctx, "PNG file exactly matches reference image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_SUCCESS; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, new_png_path)) { + cairo_test_log (ctx, "PNG file exactly matches current failure image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_NEW; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, xfail_png_path)) { + cairo_test_log (ctx, "PNG file exactly matches known failure image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_XFAILURE; + goto UNWIND_CAIRO; + } + } + + if (cairo_test_files_equal (out_png_path, base_ref_png_path)) { + cairo_test_log (ctx, "PNG file exactly reference image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_SUCCESS; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, base_new_png_path)) { + cairo_test_log (ctx, "PNG file exactly current failure image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_NEW; + goto UNWIND_CAIRO; + } + if (cairo_test_files_equal (out_png_path, base_xfail_png_path)) { + cairo_test_log (ctx, "PNG file exactly known failure image.\n"); + have_result = TRUE; + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_XFAILURE; + goto UNWIND_CAIRO; + } + + /* first compare against the ideal reference */ + ref_image = cairo_test_get_reference_image (ctx, base_ref_png_path, + target->content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED); + if (cairo_surface_status (ref_image)) { + cairo_test_log (ctx, "Error: Cannot open reference image for %s: %s\n", + base_ref_png_path, + cairo_status_to_string (cairo_surface_status (ref_image))); + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; + } + + diff_image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + ctx->test->width, + ctx->test->height); + + cmp_png_path = base_ref_png_path; + diff_status = image_diff (ctx, + test_image, ref_image, diff_image, + &result); + _xunlink (ctx, diff_png_path); + if (diff_status || + image_diff_is_failure (&result, target->error_tolerance)) + { + /* that failed, so check against the specific backend */ + ref_image = cairo_test_get_reference_image (ctx, ref_png_path, + target->content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED); + if (cairo_surface_status (ref_image)) { + cairo_test_log (ctx, "Error: Cannot open reference image for %s: %s\n", + ref_png_path, + cairo_status_to_string (cairo_surface_status (ref_image))); + cairo_surface_destroy (test_image); + ret = CAIRO_TEST_FAILURE; + goto UNWIND_CAIRO; + } + + cmp_png_path = ref_png_path; + diff_status = image_diff (ctx, + test_image, ref_image, + diff_image, + &result); + if (diff_status) + { + cairo_test_log (ctx, "Error: Failed to compare images: %s\n", + cairo_status_to_string (diff_status)); + ret = CAIRO_TEST_FAILURE; + } + else if (image_diff_is_failure (&result, target->error_tolerance)) + { + ret = CAIRO_TEST_FAILURE; + + diff_status = cairo_surface_write_to_png (diff_image, + diff_png_path); + if (diff_status) { + cairo_test_log (ctx, "Error: Failed to write differences image: %s\n", + cairo_status_to_string (diff_status)); + } else { + have_result = TRUE; + } + + cairo_test_copy_file (test_filename, fail_filename); + } + else + { /* success */ + cairo_test_copy_file (test_filename, pass_filename); + } + } + else + { /* success */ + cairo_test_copy_file (test_filename, pass_filename); + } + + /* If failed, compare against the current image output, + * and attempt to detect systematic failures. + */ + if (ret == CAIRO_TEST_FAILURE) { + char *image_out_path; + + image_out_path = + cairo_test_reference_filename (ctx, + base_name, + ctx->test_name, + "image", + "image", + format, + CAIRO_TEST_OUT_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + if (image_out_path != NULL) { + if (cairo_test_files_equal (out_png_path, + image_out_path)) + { + ret = CAIRO_TEST_XFAILURE; + } + else + { + ref_image = + cairo_image_surface_create_from_png (image_out_path); + if (cairo_surface_status (ref_image) == CAIRO_STATUS_SUCCESS) + { + diff_status = image_diff (ctx, + test_image, ref_image, + diff_image, + &result); + if (diff_status == CAIRO_STATUS_SUCCESS && + !image_diff_is_failure (&result, target->error_tolerance)) + { + ret = CAIRO_TEST_XFAILURE; + } + + cairo_surface_destroy (ref_image); + } + } + + free (image_out_path); + } + } + + cairo_surface_destroy (test_image); + cairo_surface_destroy (diff_image); + } + + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { + cairo_test_log (ctx, "Error: Function under test left cairo status in an error state: %s\n", + cairo_status_to_string (cairo_status (cr))); + ret = CAIRO_TEST_ERROR; + goto UNWIND_CAIRO; + } + +UNWIND_CAIRO: + free (test_filename); + free (fail_filename); + free (pass_filename); + + test_filename = fail_filename = pass_filename = NULL; + +#if HAVE_MEMFAULT + if (ret == CAIRO_TEST_FAILURE) + MEMFAULT_PRINT_FAULTS (); +#endif + cairo_destroy (cr); +UNWIND_SURFACE: + cairo_surface_destroy (surface); + + if (target->cleanup) + target->cleanup (closure); + +#if HAVE_MEMFAULT + cairo_debug_reset_static_data (); + +#if HAVE_FCFINI + FcFini (); +#endif + + if (MEMFAULT_COUNT_LEAKS () > 0) { + if (ret != CAIRO_TEST_FAILURE) + MEMFAULT_PRINT_FAULTS (); + MEMFAULT_PRINT_LEAKS (); + } + + if (ret == CAIRO_TEST_SUCCESS && --malloc_failure_iterations > 0) + goto REPEAT; +#endif + + if (have_output) + cairo_test_log (ctx, "OUTPUT: %s\n", out_png_path); + + if (have_result) { + if (cmp_png_path == NULL) { + /* XXX presume we matched the normal ref last time */ + cmp_png_path = ref_png_path; + } + cairo_test_log (ctx, + "REFERENCE: %s\nDIFFERENCE: %s\n", + cmp_png_path, diff_png_path); + } + +UNWIND_STRINGS: + free (out_png_path); + free (ref_png_path); + free (base_ref_png_path); + free (ref_path); + free (new_png_path); + free (base_new_png_path); + free (new_path); + free (xfail_png_path); + free (base_xfail_png_path); + free (xfail_path); + free (diff_png_path); + free (base_path); + free (base_name); + + return ret; +} + +#if defined(HAVE_SIGNAL_H) && defined(HAVE_SETJMP_H) +#include +#include +/* Used to catch crashes in a test, so that we report it as such and + * continue testing, although one crasher may already have corrupted memory in + * an nonrecoverable fashion. */ +static jmp_buf jmpbuf; + +static void +segfault_handler (int signal) +{ + longjmp (jmpbuf, signal); +} +#endif + +cairo_test_status_t +_cairo_test_context_run_for_target (cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target, + cairo_bool_t similar, + int dev_offset, int dev_scale) +{ + cairo_test_status_t status; + + if (target->get_image_surface == NULL) + return CAIRO_TEST_UNTESTED; + + if (similar && ! cairo_test_target_has_similar (ctx, target)) + return CAIRO_TEST_UNTESTED; + + cairo_test_log (ctx, + "Testing %s with %s%s target (dev offset %d scale: %d)\n", + ctx->test_name, + similar ? " (similar) " : "", + target->name, + dev_offset, dev_scale); + + printf ("%s.%s.%s [%dx%d]%s:\t", ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), + dev_offset, dev_scale, + similar ? " (similar)": ""); + fflush (stdout); + +#if defined(HAVE_SIGNAL_H) && defined(HAVE_SETJMP_H) + if (! RUNNING_ON_VALGRIND) { + void (* volatile old_segfault_handler)(int); + void (* volatile old_segfpe_handler)(int); + void (* volatile old_sigpipe_handler)(int); + void (* volatile old_sigabrt_handler)(int); + void (* volatile old_sigalrm_handler)(int); + + /* Set up a checkpoint to get back to in case of segfaults. */ +#ifdef SIGSEGV + old_segfault_handler = signal (SIGSEGV, segfault_handler); +#endif +#ifdef SIGFPE + old_segfpe_handler = signal (SIGFPE, segfault_handler); +#endif +#ifdef SIGPIPE + old_sigpipe_handler = signal (SIGPIPE, segfault_handler); +#endif +#ifdef SIGABRT + old_sigabrt_handler = signal (SIGABRT, segfault_handler); +#endif +#ifdef SIGALRM + old_sigalrm_handler = signal (SIGALRM, segfault_handler); +#endif + if (0 == setjmp (jmpbuf)) + status = cairo_test_for_target (ctx, target, dev_offset, dev_scale, similar); + else + status = CAIRO_TEST_CRASHED; +#ifdef SIGSEGV + signal (SIGSEGV, old_segfault_handler); +#endif +#ifdef SIGFPE + signal (SIGFPE, old_segfpe_handler); +#endif +#ifdef SIGPIPE + signal (SIGPIPE, old_sigpipe_handler); +#endif +#ifdef SIGABRT + signal (SIGABRT, old_sigabrt_handler); +#endif +#ifdef SIGALRM + signal (SIGALRM, old_sigalrm_handler); +#endif + } else { + status = cairo_test_for_target (ctx, target, dev_offset, dev_scale, similar); + } +#else + status = cairo_test_for_target (ctx, target, dev_offset, dev_scale, similar); +#endif + + cairo_test_log (ctx, + "TEST: %s TARGET: %s FORMAT: %s OFFSET: %d SCALE: %d SIMILAR: %d RESULT: ", + ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), + dev_offset, dev_scale, similar); + switch (status) { + case CAIRO_TEST_SUCCESS: + printf ("PASS\n"); + cairo_test_log (ctx, "PASS\n"); + break; + + case CAIRO_TEST_UNTESTED: + printf ("UNTESTED\n"); + cairo_test_log (ctx, "UNTESTED\n"); + break; + + default: + case CAIRO_TEST_CRASHED: + if (print_fail_on_stdout) { + printf ("!!!CRASHED!!!\n"); + } else { + /* eat the test name */ + printf ("\r"); + fflush (stdout); + } + cairo_test_log (ctx, "CRASHED\n"); + fprintf (stderr, "%s.%s.%s [%dx%d]%s:\t%s!!!CRASHED!!!%s\n", + ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), dev_offset, dev_scale, similar ? " (similar)" : "", + fail_face, normal_face); + break; + + case CAIRO_TEST_ERROR: + if (print_fail_on_stdout) { + printf ("!!!ERROR!!!\n"); + } else { + /* eat the test name */ + printf ("\r"); + fflush (stdout); + } + cairo_test_log (ctx, "ERROR\n"); + fprintf (stderr, "%s.%s.%s [%dx%d]%s:\t%s!!!ERROR!!!%s\n", + ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), dev_offset, dev_scale, similar ? " (similar)" : "", + fail_face, normal_face); + break; + + case CAIRO_TEST_XFAILURE: + if (print_fail_on_stdout) { + printf ("XFAIL\n"); + } else { + /* eat the test name */ + printf ("\r"); + fflush (stdout); + } + fprintf (stderr, "%s.%s.%s [%dx%d]%s:\t%sXFAIL%s\n", + ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), dev_offset, dev_scale, similar ? " (similar)" : "", + xfail_face, normal_face); + cairo_test_log (ctx, "XFAIL\n"); + break; + + case CAIRO_TEST_NEW: + if (print_fail_on_stdout) { + printf ("NEW\n"); + } else { + /* eat the test name */ + printf ("\r"); + fflush (stdout); + } + fprintf (stderr, "%s.%s.%s [%dx%d]%s:\t%sNEW%s\n", + ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), dev_offset, dev_scale, similar ? " (similar)" : "", + fail_face, normal_face); + cairo_test_log (ctx, "NEW\n"); + break; + + case CAIRO_TEST_NO_MEMORY: + case CAIRO_TEST_FAILURE: + if (print_fail_on_stdout) { + printf ("FAIL\n"); + } else { + /* eat the test name */ + printf ("\r"); + fflush (stdout); + } + fprintf (stderr, "%s.%s.%s [%dx%d]%s:\t%sFAIL%s\n", + ctx->test_name, target->name, + cairo_boilerplate_content_name (target->content), dev_offset, dev_scale, similar ? " (similar)" : "", + fail_face, normal_face); + cairo_test_log (ctx, "FAIL\n"); + break; + } + fflush (stdout); + + return status; +} + +const cairo_test_context_t * +cairo_test_get_context (cairo_t *cr) +{ + return cairo_get_user_data (cr, &_cairo_test_context_key); +} + +cairo_surface_t * +cairo_test_create_surface_from_png (const cairo_test_context_t *ctx, + const char *filename) +{ + cairo_surface_t *image; + cairo_status_t status; + + image = cairo_image_surface_create_from_png (filename); + status = cairo_surface_status (image); + if (status == CAIRO_STATUS_FILE_NOT_FOUND) { + /* expect not found when running with srcdir != builddir + * such as when 'make distcheck' is run + */ + if (ctx->srcdir) { + char *srcdir_filename; + xasprintf (&srcdir_filename, "%s/%s", ctx->srcdir, filename); + cairo_surface_destroy (image); + image = cairo_image_surface_create_from_png (srcdir_filename); + free (srcdir_filename); + } + } + + return image; +} + +cairo_pattern_t * +cairo_test_create_pattern_from_png (const cairo_test_context_t *ctx, + const char *filename) +{ + cairo_surface_t *image; + cairo_pattern_t *pattern; + + image = cairo_test_create_surface_from_png (ctx, filename); + + pattern = cairo_pattern_create_for_surface (image); + + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + + cairo_surface_destroy (image); + + return pattern; +} + +static cairo_surface_t * +_draw_check (int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 12, 12); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 0.75, 0.75, 0.75); /* light gray */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.25, 0.25, 0.25); /* dark gray */ + cairo_rectangle (cr, width / 2, 0, width / 2, height / 2); + cairo_rectangle (cr, 0, height / 2, width / 2, height / 2); + cairo_fill (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +void +cairo_test_paint_checkered (cairo_t *cr) +{ + cairo_surface_t *check; + + check = _draw_check (12, 12); + + cairo_save (cr); + cairo_set_source_surface (cr, check, 0, 0); + cairo_surface_destroy (check); + + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_paint (cr); + + cairo_restore (cr); +} + +cairo_bool_t +cairo_test_is_target_enabled (const cairo_test_context_t *ctx, + const char *target) +{ + size_t i; + + for (i = 0; i < ctx->num_targets; i++) { + const cairo_boilerplate_target_t *t = ctx->targets_to_test[i]; + if (strcmp (t->name, target) == 0) { + /* XXX ask the target whether is it possible to run? + * e.g. the xlib backend could check whether it is able to connect + * to the Display. + */ + return t->get_image_surface != NULL; + } + } + + return FALSE; +} + +cairo_bool_t +cairo_test_malloc_failure (const cairo_test_context_t *ctx, + cairo_status_t status) +{ + if (! ctx->malloc_failure) + return FALSE; + + if (status != CAIRO_STATUS_NO_MEMORY) + return FALSE; + +#if HAVE_MEMFAULT + { + int n_faults; + + /* prevent infinite loops... */ + n_faults = MEMFAULT_COUNT_FAULTS (); + if (n_faults == ctx->last_fault_count) + return FALSE; + + ((cairo_test_context_t *) ctx)->last_fault_count = n_faults; + } +#endif + + return TRUE; +} + +cairo_test_status_t +cairo_test_status_from_status (const cairo_test_context_t *ctx, + cairo_status_t status) +{ + if (status == CAIRO_STATUS_SUCCESS) + return CAIRO_TEST_SUCCESS; + + if (cairo_test_malloc_failure (ctx, status)) + return CAIRO_TEST_NO_MEMORY; + + return CAIRO_TEST_FAILURE; +} diff --git a/test/cairo-test.h b/test/cairo-test.h new file mode 100644 index 000000000..7e9605f61 --- /dev/null +++ b/test/cairo-test.h @@ -0,0 +1,322 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#ifndef _CAIRO_TEST_H_ +#define _CAIRO_TEST_H_ + +#include "cairo-boilerplate.h" + +#include + +CAIRO_BEGIN_DECLS + +#if HAVE_STDINT_H +# include +#elif HAVE_INTTYPES_H +# include +#elif HAVE_SYS_INT_TYPES_H +# include +#elif defined(_MSC_VER) +typedef __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +# ifndef HAVE_UINT64_T +# define HAVE_UINT64_T 1 +# endif +#else +#error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, \etc.) +#endif + +#ifdef _MSC_VER +#define _USE_MATH_DEFINES + +#include +#define isnan(x) _isnan(x) + +#endif + +#if HAVE_FENV_H +# include +#endif +/* The following are optional in C99, so define them if they aren't yet */ +#ifndef FE_DIVBYZERO +#define FE_DIVBYZERO 0 +#endif +#ifndef FE_INEXACT +#define FE_INEXACT 0 +#endif +#ifndef FE_INVALID +#define FE_INVALID 0 +#endif +#ifndef FE_OVERFLOW +#define FE_OVERFLOW 0 +#endif +#ifndef FE_UNDERFLOW +#define FE_UNDERFLOW 0 +#endif + +#include + +static inline double +cairo_test_NaN (void) +{ +#ifdef _MSC_VER + /* MSVC strtod("NaN", NULL) returns 0.0 */ + union { + uint32_t i[2]; + double d; + } nan = {{0xffffffff, 0x7fffffff}}; + return nan.d; +#else + return strtod("NaN", NULL); +#endif +} + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#define CAIRO_TEST_OUTPUT_DIR "output" + +#define CAIRO_TEST_LOG_SUFFIX ".log" + +#define CAIRO_TEST_FONT_FAMILY "DejaVu" + +/* What is a fail and what isn't? + * When running the test suite we want to detect unexpected output. This + * can be caused by a change we have made to cairo itself, or a change + * in our environment. To capture this we classify the expected output into 3 + * classes: + * + * REF -- Perfect output. + * Might be different for each backend, due to slight implementation + * differences. + * + * NEW -- A new failure. We have uncovered a bug within cairo and have + * recorded the current failure (along with the expected output + * if possible!) so we can detect any changes in our attempt to + * fix the bug. + * + * XFAIL -- An external failure. We believe the cairo output is perfect, + * but an external renderer is causing gross failure. + * (We also use this to capture current WONTFIX issues within cairo, + * such as overflow in internal coordinates, so as not to distract + * us when regression testing.) + * + * If no REF is given for a test, then it is assumed to be XFAIL. + */ +#define CAIRO_TEST_REF_SUFFIX ".ref" +#define CAIRO_TEST_XFAIL_SUFFIX ".xfail" +#define CAIRO_TEST_NEW_SUFFIX ".new" + +#define CAIRO_TEST_OUT_SUFFIX ".out" +#define CAIRO_TEST_DIFF_SUFFIX ".diff" + +#define CAIRO_TEST_PNG_EXTENSION ".png" +#define CAIRO_TEST_OUT_PNG CAIRO_TEST_OUT_SUFFIX CAIRO_TEST_PNG_EXTENSION +#define CAIRO_TEST_REF_PNG CAIRO_TEST_REF_SUFFIX CAIRO_TEST_PNG_EXTENSION +#define CAIRO_TEST_DIFF_PNG CAIRO_TEST_DIFF_SUFFIX CAIRO_TEST_PNG_EXTENSION + +typedef enum cairo_test_status { + CAIRO_TEST_SUCCESS = 0, + CAIRO_TEST_NO_MEMORY, + CAIRO_TEST_FAILURE, + CAIRO_TEST_NEW, + CAIRO_TEST_XFAILURE, + CAIRO_TEST_ERROR, + CAIRO_TEST_CRASHED, + CAIRO_TEST_UNTESTED = 77 /* match automake's skipped exit status */ +} cairo_test_status_t; + +typedef struct _cairo_test_context cairo_test_context_t; +typedef struct _cairo_test cairo_test_t; + +typedef cairo_test_status_t +(cairo_test_preamble_function_t) (cairo_test_context_t *ctx); + +typedef cairo_test_status_t +(cairo_test_draw_function_t) (cairo_t *cr, int width, int height); + +struct _cairo_test { + const char *name; + const char *description; + const char *keywords; + const char *requirements; + double width; + double height; + cairo_test_preamble_function_t *preamble; + cairo_test_draw_function_t *draw; +}; + +/* The standard test interface which works by examining result image. + * + * CAIRO_TEST() constructs a test which will be called once before (the + * preamble callback), and then once for each testable backend (the draw + * callback). The following checks will be performed for each backend: + * + * 1) If preamble() returns CAIRO_TEST_UNTESTED, the test is skipped. + * + * 2) If preamble() does not return CAIRO_TEST_SUCCESS, the test fails. + * + * 3) If draw() does not return CAIRO_TEST_SUCCESS then this backend + * fails. + * + * 4) Otherwise, if cairo_status(cr) indicates an error then this + * backend fails. + * + * 5) Otherwise, if the image size is 0, then this backend passes. + * + * 6) Otherwise, if every channel of every pixel exactly matches the + * reference image then this backend passes. If not, this backend + * fails. + * + * The overall test result is PASS if and only if there is at least + * one backend that is tested and if all tested backend pass according + * to the four criteria above. + */ +#define CAIRO_TEST(name, description, keywords, requirements, width, height, preamble, draw) \ +void _register_##name (void); \ +void _register_##name (void) { \ + static cairo_test_t test = { \ + #name, description, \ + keywords, requirements, \ + width, height, \ + preamble, draw \ + }; \ + cairo_test_register (&test); \ +} + +void +cairo_test_register (cairo_test_t *test); + +/* The full context for the test. + * For ordinary tests (using the CAIRO_TEST()->draw interface) the context + * is passed to the draw routine via user_data on the cairo_t. + * The reason why the context is not passed as an explicit parameter is that + * it is rarely required by the test itself and by removing the parameter + * we can keep the draw routines simple and serve as example code. + * + * In contrast, for the preamble phase the context is passed as the only + * parameter. + */ +struct _cairo_test_context { + const cairo_test_t *test; + const char *test_name; + + FILE *log_file; + const char *output; + const char *srcdir; /* directory containing sources and input data */ + const char *refdir; /* directory containing reference images */ + + char *ref_name; /* cache of the current reference image */ + cairo_surface_t *ref_image; + cairo_surface_t *ref_image_flattened; + + size_t num_targets; + cairo_bool_t limited_targets; + const cairo_boilerplate_target_t **targets_to_test; + cairo_bool_t own_targets; + + int malloc_failure; + int last_fault_count; + + int timeout; +}; + +/* Retrieve the test context from the cairo_t, used for logging, paths etc */ +const cairo_test_context_t * +cairo_test_get_context (cairo_t *cr); + + +/* Print a message to the log file, ala printf. */ +void +cairo_test_log (const cairo_test_context_t *ctx, + const char *fmt, ...) CAIRO_BOILERPLATE_PRINTF_FORMAT(2, 3); +void +cairo_test_logv (const cairo_test_context_t *ctx, + const char *fmt, va_list ap) CAIRO_BOILERPLATE_PRINTF_FORMAT(2, 0); + +/* Helper functions that take care of finding source images even when + * building in a non-srcdir manner, (i.e. the tests will be run in a + * directory that is different from the one where the source image + * exists). */ +cairo_surface_t * +cairo_test_create_surface_from_png (const cairo_test_context_t *ctx, + const char *filename); + +cairo_pattern_t * +cairo_test_create_pattern_from_png (const cairo_test_context_t *ctx, + const char *filename); + +void +cairo_test_paint_checkered (cairo_t *cr); + +#define CAIRO_TEST_DOUBLE_EQUALS(a,b) (fabs((a)-(b)) < 0.00001) + +cairo_bool_t +cairo_test_is_target_enabled (const cairo_test_context_t *ctx, + const char *target); + +char * +cairo_test_get_name (const cairo_test_t *test); + +cairo_bool_t +cairo_test_malloc_failure (const cairo_test_context_t *ctx, + cairo_status_t status); + +cairo_test_status_t +cairo_test_status_from_status (const cairo_test_context_t *ctx, + cairo_status_t status); + +char * +cairo_test_reference_filename (const cairo_test_context_t *ctx, + const char *base_name, + const char *test_name, + const char *target_name, + const char *base_target_name, + const char *format, + const char *suffix, + const char *extension); + +cairo_surface_t * +cairo_test_get_reference_image (cairo_test_context_t *ctx, + const char *filename, + cairo_bool_t flatten); + +cairo_bool_t +cairo_test_mkdir (const char *path); + +CAIRO_END_DECLS + +#endif diff --git a/test/caps-joins-alpha.c b/test/caps-joins-alpha.c new file mode 100644 index 000000000..bbff44e57 --- /dev/null +++ b/test/caps-joins-alpha.c @@ -0,0 +1,89 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0., 0.); + cairo_rel_line_to (cr, 0., SIZE); + cairo_rel_line_to (cr, SIZE, 0.); + cairo_close_path (cr); + + cairo_move_to (cr, 2 * LINE_WIDTH, 0.); + cairo_rel_line_to (cr, 3 * LINE_WIDTH, 0.); + cairo_rel_line_to (cr, 0., 3 * LINE_WIDTH); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* First draw a checkered background */ + cairo_test_paint_checkered (cr); + + /* Then draw the original caps-joins test but with a bit of alphs thrown in. */ + cairo_set_line_width (cr, LINE_WIDTH); + + cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 0.5); /* 50% red */ + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_set_source_rgba (cr, 0.0, 1.0, 0.0, 0.5); /* 50% green */ + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.5); /* 50% blue */ + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (caps_joins_alpha, + "Test caps and joins with some source alpha", + "stroke", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + PAD + SIZE + PAD, + NULL, draw) diff --git a/test/caps-joins-curve.c b/test/caps-joins-curve.c new file mode 100644 index 000000000..cf197547c --- /dev/null +++ b/test/caps-joins-curve.c @@ -0,0 +1,111 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (3 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0, 0); + cairo_rel_curve_to (cr, + -SIZE/4, SIZE/3, + -SIZE/4, SIZE/3, + 0, SIZE); + cairo_rel_curve_to (cr, + SIZE/3, -SIZE/4, + SIZE/3, -SIZE/4, + SIZE, 0); + cairo_close_path (cr); + + cairo_move_to (cr, 5 * LINE_WIDTH, 3 * LINE_WIDTH); + cairo_rel_curve_to (cr, + 0, -3 * LINE_WIDTH, + 0, -3 * LINE_WIDTH, + -3 * LINE_WIDTH, -3 * LINE_WIDTH); +} + +static void +draw_caps_joins (cairo_t *cr) +{ + cairo_save (cr); + + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, LINE_WIDTH); + + draw_caps_joins (cr); + + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + draw_caps_joins (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (caps_joins_curve, + "Test caps and joins on curves", + "stroke, cap, join", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 2 * (PAD + SIZE) + PAD, + NULL, draw) + diff --git a/test/caps-joins.c b/test/caps-joins.c new file mode 100644 index 000000000..de22d0367 --- /dev/null +++ b/test/caps-joins.c @@ -0,0 +1,150 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0., 0.); + cairo_rel_line_to (cr, 0., SIZE); + cairo_rel_line_to (cr, SIZE, 0.); + cairo_close_path (cr); + + cairo_move_to (cr, 5 * LINE_WIDTH, 3 * LINE_WIDTH); + cairo_rel_line_to (cr, 0., -3 * LINE_WIDTH); + cairo_rel_line_to (cr, -3 * LINE_WIDTH, 0.); +} + +static void +draw_caps_joins (cairo_t *cr) +{ + cairo_save (cr); + + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, float line_width) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, line_width); + + draw_caps_joins (cr); + + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, 2 * (PAD + SIZE) + PAD); + cairo_scale (cr, 1, -1); + + draw_caps_joins (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_10 (cairo_t *cr, int width, int height) +{ + return draw (cr, LINE_WIDTH); +} + +static cairo_test_status_t +draw_2 (cairo_t *cr, int width, int height) +{ + return draw (cr, 2.0); +} + +static cairo_test_status_t +draw_1 (cairo_t *cr, int width, int height) +{ + return draw (cr, 1.0); +} + +static cairo_test_status_t +draw_05 (cairo_t *cr, int width, int height) +{ + return draw (cr, 0.5); +} + +CAIRO_TEST (caps_joins, + "Test caps and joins", + "stroke", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 2 * (PAD + SIZE) + PAD, + NULL, draw_10) + +CAIRO_TEST (caps_joins_2, + "Test caps and joins with default line width", + "stroke", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 2 * (PAD + SIZE) + PAD, + NULL, draw_2) + +CAIRO_TEST (caps_joins_1, + "Test caps and joins with hairlines", + "stroke", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 2 * (PAD + SIZE) + PAD, + NULL, draw_1) + +CAIRO_TEST (caps_joins_05, + "Test caps and joins with fine lines", + "stroke", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 2 * (PAD + SIZE) + PAD, + NULL, draw_05) diff --git a/test/caps-sub-paths.c b/test/caps-sub-paths.c new file mode 100644 index 000000000..2310eb752 --- /dev/null +++ b/test/caps-sub-paths.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +/* Test case for bug #4205: + + https://bugs.freedesktop.org/show_bug.cgi?id=4205 +*/ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, 4); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + + cairo_move_to (cr, 4, 4); + cairo_line_to (cr, 4, 16); + + cairo_move_to (cr, 10, 4); + cairo_line_to (cr, 10, 16); + + cairo_move_to (cr, 16, 4); + cairo_line_to (cr, 16, 16); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (caps_sub_paths, + "Test that sub-paths receive caps.", + "stroke", /* keywords */ + NULL, /* requirements */ + 20, 20, + NULL, draw) + diff --git a/test/caps-tails-curve.c b/test/caps-tails-curve.c new file mode 100644 index 000000000..fa6aded3d --- /dev/null +++ b/test/caps-tails-curve.c @@ -0,0 +1,127 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 30. +#define SIZE (2 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr, double theta) +{ + double line_width = cairo_get_line_width (cr) / 4; + + cairo_move_to (cr, 0, 0); + cairo_rel_curve_to (cr, + SIZE/3, -SIZE/4, + SIZE/3, -SIZE/4, + SIZE, 0); + + cairo_rel_line_to (cr, + cos (theta) * line_width, + sin (theta) * line_width); +} + +static void +draw_joins (cairo_t *cr, double theta) +{ + make_path (cr, theta); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr, theta); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr, theta); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); +} + +static void +draw_caps_joins (cairo_t *cr, double theta) +{ + cairo_translate (cr, PAD, 0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + draw_joins (cr, theta); + + cairo_translate (cr, PAD, 0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + draw_joins (cr, theta); + + cairo_translate (cr, PAD, 0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + draw_joins (cr, theta); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double theta[] = { + -M_PI/2, -M_PI/4, 0, M_PI/8, M_PI/3, M_PI + }; + unsigned int t; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, LINE_WIDTH); + + for (t = 0; t < ARRAY_LENGTH(theta); t++) { + cairo_save (cr); + cairo_translate (cr, 0, t * (SIZE + PAD) + PAD); + draw_caps_joins (cr, theta[t]); + cairo_restore (cr); + + cairo_save (cr); + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, height - t * (SIZE + PAD) - PAD); + cairo_scale (cr, 1, -1); + draw_caps_joins (cr, theta[t]); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (caps_tails_curve, + "Test caps and joins on short tail segments", + "stroke, cap, join", /* keywords */ + NULL, /* requirements */ + 9 * (PAD + SIZE) + 4*PAD, + 12 * (PAD + SIZE) + PAD, + NULL, draw) + diff --git a/test/caps.c b/test/caps.c new file mode 100644 index 000000000..87f008a7c --- /dev/null +++ b/test/caps.c @@ -0,0 +1,138 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + int i; + + cairo_save (cr); + for (i = 0; i <= 3; i++) { + cairo_new_sub_path (cr); + cairo_move_to (cr, -SIZE / 2, 0.); + cairo_line_to (cr, SIZE / 2, 0.); + cairo_rotate (cr, M_PI / 4.); + } + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr) +{ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, PAD + SIZE / 2., PAD + SIZE / 2.); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + make_path (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + make_path (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + make_path (cr); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_10 (cairo_t *cr, int width, int height) +{ + cairo_set_line_width (cr, LINE_WIDTH); + return draw (cr); +} + +static cairo_test_status_t +draw_2 (cairo_t *cr, int width, int height) +{ + cairo_set_line_width (cr, 2); + return draw (cr); +} + +static cairo_test_status_t +draw_1 (cairo_t *cr, int width, int height) +{ + cairo_set_line_width (cr, 1); + return draw (cr); +} + +static cairo_test_status_t +draw_05 (cairo_t *cr, int width, int height) +{ + cairo_set_line_width (cr, 0.5); + return draw (cr); +} + +CAIRO_TEST (caps, + "Test caps", + "stroke, caps", /* keywords */ + NULL, /* requirements */ + PAD + SIZE + PAD, + 3 * (PAD + SIZE) + PAD, + NULL, draw_10) + +CAIRO_TEST (caps_2, + "Test normal caps", + "stroke, caps", /* keywords */ + NULL, /* requirements */ + PAD + SIZE + PAD, + 3 * (PAD + SIZE) + PAD, + NULL, draw_2) + +CAIRO_TEST (caps_1, + "Test hairline caps", + "stroke, caps", /* keywords */ + NULL, /* requirements */ + PAD + SIZE + PAD, + 3 * (PAD + SIZE) + PAD, + NULL, draw_1) + +CAIRO_TEST (caps_05, + "Test fine caps", + "stroke, caps", /* keywords */ + NULL, /* requirements */ + PAD + SIZE + PAD, + 3 * (PAD + SIZE) + PAD, + NULL, draw_05) + diff --git a/test/check-refs.sh b/test/check-refs.sh new file mode 100755 index 000000000..81ef81b35 --- /dev/null +++ b/test/check-refs.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +cd $(dirname $0)/reference || exit + +pdiff=$1 +[ -n "$pdiff" ] || pdiff=../pdiff/perceptualdiff +if [ ! -e "${pdiff}" ]; then + echo "Error: requires pdiff executable" + exit 128 +fi + +for file in *.ref.png; do + test=$(echo $file | cut -d'.' -f1) + target=$(echo $file | cut -d'.' -f2) + format=$(echo $file | cut -d'.' -f3) + notes="" + ref="" + result="" + + if [ $target = 'base' ]; then + # Ignore the base images for this script's purposes + continue + elif [ $target = 'ref' ]; then + # This is actually the baseline reference image + continue + elif [ $format = 'ref' ]; then + # This is either a format-specific reference, or a target-specific/format-generic image + # In either case, compare it against the generic reference image + ref="$test.ref.png" + else + # Prefer the target-specific/format-generic reference image, if available + ref="$test.$target.ref.png" + if [ ! -e $ref ]; then + ref="$test.$format.ref.png" + fi + fi + + # Special cases + if [ $test = "create-from-png" ]; then + # The create-from-png test utilizes multiple reference images directly + continue + elif [ $test = "fallback-resolution" ]; then + # The fallback-resolution test generates a set of reference images; + # These won't be redundant with one another, but just ignore them all. + continue + fi + + if [ -e $ref ]; then + if cmp --silent "$ref" "$file" ; then + printf "redundant: %s and %s are byte-by-byte identical files\n" $file $ref + else + # Run perceptualdiff with minimum threshold + pdiff_output=$($pdiff $ref $file -threshold 1) + result=${pdiff_output%:*} + notes=$(echo "${pdiff_output#*: }" | tail -n 1) + if [ "$result" = "PASS" ] && [ "$notes" = "Images are binary identical" ]; then + printf "redundant: %s and %s are pixel equivalent images\n" $file $ref + notes="" + fi + fi + fi + +done diff --git a/test/checkerboard.c b/test/checkerboard.c new file mode 100644 index 000000000..aeb2efe14 --- /dev/null +++ b/test/checkerboard.c @@ -0,0 +1,48 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Test the basic background used extensively in the test suite. */ + +#include "cairo-test.h" + +#define HEIGHT 32 +#define WIDTH 32 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_test_paint_checkered (cr); + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (checkerboard, + "Tests the checkerboard background", + "paint", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) + diff --git a/test/clear-source.c b/test/clear-source.c new file mode 100644 index 000000000..5410932fc --- /dev/null +++ b/test/clear-source.c @@ -0,0 +1,169 @@ +/* + * Copyright 2009 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +typedef enum { + CLEAR, + CLEARED, + PAINTED +} surface_type_t; + +#define SIZE 10 +#define SPACE 5 + +static cairo_surface_t * +create_surface (cairo_t *target, cairo_content_t content, surface_type_t type) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_surface_create_similar (cairo_get_target (target), + content, + SIZE, SIZE); + + if (type == CLEAR) + return surface; + + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 0.75, 0, 0); + cairo_paint (cr); + + if (type == PAINTED) + goto DONE; + + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr); + +DONE: + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static void +paint (cairo_t *cr, cairo_surface_t *surface) +{ + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); +} + +static void +fill (cairo_t *cr, cairo_surface_t *surface) +{ + cairo_set_source_surface (cr, surface, 0, 0); + cairo_rectangle (cr, -SPACE, -SPACE, SIZE + 2 * SPACE, SIZE + 2 * SPACE); + cairo_fill (cr); +} + +static void +stroke (cairo_t *cr, cairo_surface_t *surface) +{ + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_line_width (cr, 2.0); + cairo_rectangle (cr, 1, 1, SIZE - 2, SIZE - 2); + cairo_stroke (cr); +} + +static void +mask (cairo_t *cr, cairo_surface_t *surface) +{ + cairo_set_source_rgb (cr, 0, 0, 0.75); + cairo_mask_surface (cr, surface, 0, 0); +} + +static void +mask_self (cairo_t *cr, cairo_surface_t *surface) +{ + cairo_set_source_surface (cr, surface, 0, 0); + cairo_mask_surface (cr, surface, 0, 0); +} + +static void +glyphs (cairo_t *cr, cairo_surface_t *surface) +{ + cairo_set_source_surface (cr, surface, 0, 0); + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, 16); + cairo_translate (cr, 0, SIZE); + cairo_show_text (cr, "C"); +} + +typedef void (* operation_t) (cairo_t *cr, cairo_surface_t *surface); +static operation_t operations[] = { + paint, + fill, + stroke, + mask, + mask_self, + glyphs +}; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_content_t contents[] = { CAIRO_CONTENT_COLOR_ALPHA, CAIRO_CONTENT_COLOR, CAIRO_CONTENT_ALPHA }; + unsigned int content, type, ops; + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + cairo_translate (cr, SPACE, SPACE); + + for (type = 0; type <= PAINTED; type++) { + for (content = 0; content < ARRAY_LENGTH (contents); content++) { + cairo_surface_t *surface; + + surface = create_surface (cr, contents[content], type); + + cairo_save (cr); + for (ops = 0; ops < ARRAY_LENGTH (operations); ops++) { + cairo_save (cr); + operations[ops] (cr, surface); + cairo_restore (cr); + cairo_translate (cr, 0, SIZE + SPACE); + } + cairo_restore (cr); + cairo_translate (cr, SIZE + SPACE, 0); + + cairo_surface_destroy (surface); + } + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clear_source, + "Check painting with cleared surfaces works as expected", + NULL, /* keywords */ + NULL, /* requirements */ + (SIZE + SPACE) * 9 + SPACE, ARRAY_LENGTH (operations) * (SIZE + SPACE) + SPACE, + NULL, draw) diff --git a/test/clear.c b/test/clear.c new file mode 100644 index 000000000..696993d3f --- /dev/null +++ b/test/clear.c @@ -0,0 +1,86 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + + cairo_translate (cr, 2, 2); + cairo_save (cr); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_clip (cr); + cairo_rectangle (cr, 5, 5, 10, 10); + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, 20, 0); + cairo_save (cr); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_clip (cr); + cairo_arc (cr, 10, 10, 8, 0, 2*M_PI); + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, 0, 20); + cairo_save (cr); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_clip (cr); + cairo_text_extents (cr, "Cairo", &extents); + cairo_move_to (cr, + 10 - (extents.width/2. + extents.x_bearing), + 10 - (extents.height/2. + extents.y_bearing)); + cairo_text_path (cr, "Cairo"); + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, -20, 0); + cairo_save (cr); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_clip (cr); + cairo_move_to (cr, 10, 2); + cairo_line_to (cr, 18, 18); + cairo_line_to (cr, 2, 18); + cairo_close_path (cr); + cairo_fill (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clear, + "Test masked clears", + "paint, clear", /* keywords */ + NULL, /* requirements */ + 44, 44, + NULL, draw) + diff --git a/test/clip-all.c b/test/clip-all.c new file mode 100644 index 000000000..dc216c9cb --- /dev/null +++ b/test/clip-all.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2005 Novell, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Novell, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Novell, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Radek Doulík + */ + +#include "cairo-test.h" + +#define SIZE 10 +#define CLIP_SIZE 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill (cr); + + cairo_reset_clip (cr); + cairo_rectangle (cr, CLIP_SIZE, CLIP_SIZE, CLIP_SIZE, CLIP_SIZE); + cairo_clip (cr); + cairo_rectangle (cr, 3*CLIP_SIZE, 3*CLIP_SIZE, CLIP_SIZE, CLIP_SIZE); + cairo_clip (cr); + + cairo_translate (cr, .5, .5); + + cairo_reset_clip (cr); + cairo_rectangle (cr, CLIP_SIZE, CLIP_SIZE, CLIP_SIZE, CLIP_SIZE); + cairo_clip (cr); + cairo_rectangle (cr, 3*CLIP_SIZE, 3*CLIP_SIZE, CLIP_SIZE, CLIP_SIZE); + cairo_clip (cr); + + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_fill (cr); + + /* https://bugs.freedesktop.org/show_bug.cgi?id=13084 */ + cairo_select_font_face (cr, + CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_move_to (cr, 0., SIZE); + cairo_show_text (cr, "cairo"); + + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_all, + "Test clipping with everything clipped out", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + diff --git a/test/clip-complex-bug61592.c b/test/clip-complex-bug61592.c new file mode 100644 index 000000000..998b7aa1e --- /dev/null +++ b/test/clip-complex-bug61592.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2013 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); + cairo_move_to(cr, 85, -465); + cairo_line_to(cr, 3, 4.1); + cairo_line_to(cr, -145, -25); + cairo_close_path(cr); + cairo_clip(cr); + + cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); + cairo_move_to(cr, -139, -524); + cairo_line_to(cr, 78, 44); + cairo_line_to(cr, -229, -10); + cairo_close_path(cr); + cairo_clip(cr); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_complex_bug61492, + "Exercise a bug found in 1.12", + "clip", /* keywords */ + NULL, /* requirements */ + 8, 5, + NULL, draw) diff --git a/test/clip-complex-shape.c b/test/clip-complex-shape.c new file mode 100644 index 000000000..d7d530146 --- /dev/null +++ b/test/clip-complex-shape.c @@ -0,0 +1,114 @@ +/* + * Copyright 2011 SCore Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Taekyun Kim + */ + +#include "cairo-test.h" + +static void +rounded_rectangle(cairo_t *cr, + double x, double y, + double width, double height, + double radius) +{ + cairo_move_to (cr, x, y + radius); + cairo_line_to (cr, x, y + height - radius); + cairo_curve_to (cr, x, y + height - radius/2.0, + x + radius/2.0, y + height, + x + radius, y + height); + cairo_line_to (cr, x + width - radius, y + height); + cairo_curve_to (cr, x + width - radius/2.0, y + height, + x + width, y + height - radius/2.0, + x + width, y + height - radius); + cairo_line_to (cr, x + width, y + radius); + cairo_curve_to (cr, x + width, y + radius/2.0, + x + width - radius/2.0, y, + x + width - radius, y); + cairo_line_to (cr, x + radius, y); + cairo_curve_to (cr, x + radius/2.0, y, x, y + radius/2.0, x, y + radius); + cairo_close_path(cr); +} + +static void +background (cairo_t *cr) +{ + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); + cairo_paint(cr); +} + +static void +foreground (cairo_t *cr) +{ + cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0); + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_rectangle(cr, 20, 20, 60, 60); + cairo_fill(cr); +} + +static cairo_test_status_t +clip_eo_mono (cairo_t *cr, int width, int height) +{ + + background (cr); + + cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); + cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); + rounded_rectangle(cr, 0, 0, 40, 100, 10); + rounded_rectangle(cr, 60, 0, 40, 100, 10); + cairo_clip(cr); + + foreground (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +clip_eo_aa (cairo_t *cr, int width, int height) +{ + background (cr); + + cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); + cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); + rounded_rectangle(cr, 0, 0, 40, 100, 10); + rounded_rectangle(cr, 60, 0, 40, 100, 10); + cairo_clip(cr); + + foreground (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_complex_shape_eo_mono, + "Test clipping against a complex shape", + "clip", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, clip_eo_mono) +CAIRO_TEST (clip_complex_shape_eo_aa, + "Test clipping against a complex shape", + "clip", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, clip_eo_aa) diff --git a/test/clip-contexts.c b/test/clip-contexts.c new file mode 100644 index 000000000..39d2004c0 --- /dev/null +++ b/test/clip-contexts.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2010 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* + * Jeff Muizelaar found a bug on Quartz with cairo-surface-clipper, which was + * the topmost clip path from two different contexts and finding them equally + * incorrectly concluding that the operation was a no-op. + */ + +#define SIZE 10 +#define CLIP_SIZE 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_t *cr2; + + /* opaque background */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* first create an empty, non-overlappiny clip */ + cr2 = cairo_create (cairo_get_target (cr)); + cairo_rectangle (cr2, 0, 0, SIZE/2-2, SIZE/2-2); + cairo_clip (cr2); + + cairo_rectangle (cr2, SIZE/2+2, SIZE/2+2, SIZE/2-2, SIZE/2-2); + cairo_clip (cr2); + + /* and apply the clip onto the surface, empty nothing should be painted */ + cairo_set_source_rgba (cr2, 1, 0, 0, .5); + cairo_paint (cr2); + + /* switch back to the original, and set only the last clip */ + cairo_rectangle (cr, SIZE/2+2, SIZE/2+2, SIZE/2-2, SIZE/2-2); + cairo_clip (cr); + + cairo_set_source_rgba (cr, 0, 0, 1, .5); + cairo_paint (cr); + + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_contexts, + "Test clipping with 2 separate contexts", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/clip-device-offset.c b/test/clip-device-offset.c new file mode 100644 index 000000000..f725b8e93 --- /dev/null +++ b/test/clip-device-offset.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2009 Benjamin Otte + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Benjamin Otte + */ + +#include "cairo-test.h" + +#define WIDTH 50 +#define HEIGHT 50 + +static cairo_pattern_t * +create_green_source (void) +{ + cairo_surface_t *image; + cairo_pattern_t *pattern; + cairo_t *cr; + + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); + cr = cairo_create (image); + cairo_surface_destroy (image); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *source; + double old_x, old_y; + + cairo_surface_get_device_offset (cairo_get_group_target (cr), &old_x, &old_y); + cairo_surface_set_device_offset (cairo_get_group_target (cr), old_x+5, old_y+5); + + source = create_green_source (); + cairo_set_source (cr, source); + cairo_pattern_destroy (source); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + cairo_paint (cr); + + cairo_surface_set_device_offset (cairo_get_group_target (cr), old_x, old_y); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_device_offset, + "Test clipping on surfaces with device offsets", + "clip", /* keywords */ + NULL, /* requirements */ + WIDTH+10, HEIGHT+10, + NULL, draw) diff --git a/test/clip-disjoint-hatching.c b/test/clip-disjoint-hatching.c new file mode 100644 index 000000000..8626e80df --- /dev/null +++ b/test/clip-disjoint-hatching.c @@ -0,0 +1,104 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define STEP 5 +#define WIDTH 100 +#define HEIGHT 100 + +static void hatching (cairo_t *cr) +{ + int i; + + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + cairo_translate (cr, WIDTH/2, HEIGHT/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -WIDTH/2, -HEIGHT/2); + + for (i = 0; i < WIDTH; i += STEP) { + cairo_rectangle (cr, i, -2, 1, HEIGHT+4); + cairo_rectangle (cr, -2, i, WIDTH+4, 1); + } +} + +static void background (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); +} + +static void clip_to_grid (cairo_t *cr) +{ + int i, j; + + for (j = 0; j < HEIGHT; j += 2*STEP) { + for (i = 0; i < WIDTH; i += 2*STEP) + cairo_rectangle (cr, i, j, STEP, STEP); + + j += 2*STEP; + for (i = 0; i < WIDTH; i += 2*STEP) + cairo_rectangle (cr, i+STEP/2, j, STEP, STEP); + } + + cairo_clip (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + background (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + + cairo_save (cr); { + clip_to_grid (cr); + hatching (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + } cairo_restore (cr); + + cairo_translate (cr, 0.25, HEIGHT+.25); + + cairo_save (cr); { + clip_to_grid (cr); + hatching (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill (cr); + } cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_disjoint_hatching, + "Test drawing through through an array of clips", + "clip", /* keywords */ + "target=raster", /* requirements */ + WIDTH, 2*HEIGHT, + NULL, draw) diff --git a/test/clip-disjoint-quad.c b/test/clip-disjoint-quad.c new file mode 100644 index 000000000..fe20381d7 --- /dev/null +++ b/test/clip-disjoint-quad.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2012 Red Hat, Inc. + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Soren Sandmann + * Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 100 +#define HEIGHT 200 + +static void +draw_quad (cairo_t *cr, + double x1, double y1, + double x2, double y2, + double x3, double y3, + double x4, double y4) +{ + cairo_move_to (cr, x1, y1); + cairo_line_to (cr, x2, y2); + cairo_line_to (cr, x3, y3); + cairo_line_to (cr, x4, y4); + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 0, 0.6, 0); + cairo_fill (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int position[5] = {0, HEIGHT/2-10, HEIGHT/2-5, HEIGHT/2, HEIGHT-10 }; + int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + for (i = 0; i < 5; i++) { + cairo_reset_clip (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 0, 0, WIDTH/2, HEIGHT/2); + cairo_rectangle (cr, WIDTH/2, position[i], WIDTH/2, 10); + cairo_fill_preserve (cr); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1, 0, 1); + draw_quad (cr, 50, 50, 75, 75, 50, 150, 25, 75); + cairo_fill (cr); + + cairo_translate(cr, WIDTH, 0); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_disjoint_quad, + "Tests a simple fill through two disjoint clips.", + "clip, fill", /* keywords */ + NULL, /* requirements */ + 5*WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-disjoint.c b/test/clip-disjoint.c new file mode 100644 index 000000000..28bb963c2 --- /dev/null +++ b/test/clip-disjoint.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Soren Sandmann + */ + +#include "cairo-test.h" + +#define WIDTH 300 +#define HEIGHT 300 + +typedef struct { + double x, y; +} point_t; + +static void +paint_curve (cairo_t *cr) +{ + const point_t points[] = { + { 100, 320 }, { 110, -80 }, + { 180, 60 }, { 300, 170 }, + { 300, -40 } + }; + unsigned i; + + cairo_set_line_width (cr, 2); + cairo_move_to (cr, points[0].x, points[0].y); + + for (i = 1; i < ARRAY_LENGTH (points) - 2; i += 3) { + cairo_curve_to (cr, + points[i].x, points[i].y, + points[i + 1].x, points[i + 1].y, + points[i + 2].x, points[i + 2].y); + } + cairo_set_line_width (cr, 5); + cairo_stroke (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Fill window with light blue */ + cairo_set_source_rgba (cr, 0.8, 0.8, 1.9, 1.0); + cairo_paint (cr); + + /* Paint curve in green */ + cairo_set_source_rgba (cr, 0.6, 0.8, 0.6, 1.0); + paint_curve (cr); + + /* Make clip region */ + cairo_rectangle (cr, 228, 131, 50, 13); + cairo_rectangle (cr, 20, 99, 200, 75); + cairo_clip_preserve (cr); + + /* Fill clip region with red */ + cairo_set_source_rgba (cr, 1.0, 0.5, 0.5, 0.8); + cairo_fill (cr); + + /* Paint curve again, this time in blue */ + cairo_set_source_rgba (cr, 0, 0, 1.0, 1.0); + paint_curve (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_disjoint, + "Tests stroking through two disjoint clips.", + "clip, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-double-free.c b/test/clip-double-free.c new file mode 100644 index 000000000..74b9a6e6d --- /dev/null +++ b/test/clip-double-free.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2011 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +/* + * This test wants to hit the following double free: + * + * ==10517== Invalid free() / delete / delete[] + * ==10517== at 0x4C268FE: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + * ==10517== by 0x87FBE80: _cairo_clip_destroy (cairo-clip.c:136) + * ==10517== by 0x87FE520: _cairo_clip_intersect_boxes.part.1 (cairo-clip-private.h:92) + * ==10517== by 0x87FE79F: _cairo_clip_intersect_rectilinear_path (cairo-clip-boxes.c:266) + * ==10517== by 0x87FC29B: _cairo_clip_intersect_path.part.3 (cairo-clip.c:242) + * ==10517== by 0x8809C3A: _cairo_gstate_clip (cairo-gstate.c:1518) + * ==10517== by 0x8802E40: _cairo_default_context_clip (cairo-default-context.c:1048) + * ==10517== by 0x87FA2C6: cairo_clip (cairo.c:2380) + * ==10517== Address 0x18d44cb0 is 0 bytes inside a block of size 32 free'd + * ==10517== at 0x4C268FE: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + * ==10517== by 0x87FE506: _cairo_clip_intersect_boxes.part.1 (cairo-clip-boxes.c:295) + * ==10517== by 0x87FE79F: _cairo_clip_intersect_rectilinear_path (cairo-clip-boxes.c:266) + * ==10517== by 0x87FC29B: _cairo_clip_intersect_path.part.3 (cairo-clip.c:242) + * ==10517== by 0x8809C3A: _cairo_gstate_clip (cairo-gstate.c:1518) + * ==10517== by 0x8802E40: _cairo_default_context_clip (cairo-default-context.c:1048) + * ==10517== by 0x87FA2C6: cairo_clip (cairo.c:2380) + * + * _cairo_clip_intersect_boxes() is called with clip->num_boxes != 0. It then + * calls _cairo_boxes_init_for_array (&clip_boxes, clip->boxes, clip->num_boxes) + * and free (clip->boxes), stealing the clip's boxes, but leaving a dangling + * pointer behind. + * Because this code already intersected the existing boxes and the new ones, we + * now have num_boxes == 0. This means that _cairo_clip_set_all_clipped() gets + * called and tries to free the clip's boxes again. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + /* To hit this bug, we first need a clip with + * clip->boxes != clip->embedded_boxes. + */ + cairo_rectangle (cr, 0, 0, 2, 2); + cairo_rectangle (cr, 0, 0, 1, 1); + cairo_clip (cr); + + /* Then we have to intersect this with a rectilinear path which results in + * all clipped. This path must consist of at least two boxes or we will hit + * a different code path. + */ + cairo_rectangle (cr, 10, 10, 2, 2); + cairo_rectangle (cr, 10, 10, 1, 1); + cairo_clip (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_double_free, + "Test a double free bug in the clipping code", + "clip", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/clip-draw-unbounded.c b/test/clip-draw-unbounded.c new file mode 100644 index 000000000..6b9263beb --- /dev/null +++ b/test/clip-draw-unbounded.c @@ -0,0 +1,184 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2009 Chris Wilson + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 60 +#define HEIGHT 60 + +static void +stroke (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 0, 0.7, 0); + cairo_arc (cr, 10, 10, 7.5, 0, 2 * M_PI); + cairo_move_to (cr, 0, 20); + cairo_line_to (cr, 20, 0); + cairo_stroke (cr); +} + +static void +fill (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 0, 0.7, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, 10, 10, 8.5, 0, 2 * M_PI); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, 10, 10, 6.5, 2 * M_PI, 0); + + cairo_move_to (cr, -1, 19); + cairo_line_to (cr, 1, 21); + cairo_line_to (cr, 21, 1); + cairo_line_to (cr, 19, -1); + cairo_line_to (cr, -1, 19); + + cairo_fill (cr); +} + +static void +clip_simple (cairo_t *cr) +{ + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_clip (cr); +} + +static void +clip_unaligned (cairo_t *cr) +{ + cairo_rectangle (cr, 0.5, 0.5, 20, 20); + cairo_clip (cr); +} + +static void +clip_aligned (cairo_t *cr) +{ + cairo_fill_rule_t orig_rule; + + orig_rule = cairo_get_fill_rule (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_rectangle (cr, 3, 3, 10, 10); + cairo_rectangle (cr, 7, 7, 10, 10); + cairo_clip (cr); + cairo_set_fill_rule (cr, orig_rule); +} + +static void +clip_mask (cairo_t *cr) +{ + cairo_arc (cr, 10, 10, 10, 0, 2 * M_PI); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, 10, 10, 5, 2 * M_PI, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, 10, 10, 2, 0, 2 * M_PI); + cairo_clip (cr); +} + +static void (* const clip_funcs[])(cairo_t *cr) = { + clip_simple, + clip_unaligned, + clip_aligned, + clip_mask +}; + +static double translations[][2] = { + { 10, 10 }, + { WIDTH, 0 }, + { -WIDTH, HEIGHT }, + { WIDTH, 0 } +}; + +static cairo_test_status_t +draw (cairo_t *cr, void (*shapes)(cairo_t *)) +{ + unsigned int i; + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + for (i = 0; i < ARRAY_LENGTH (clip_funcs); i++) { + cairo_translate (cr, translations[i][0], translations[i][1]); + + cairo_save (cr); + cairo_scale (cr, 2, 2); + clip_funcs[i] (cr); + shapes (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_stroke (cairo_t *cr, int width, int height) +{ + return draw (cr, stroke); +} + +static cairo_test_status_t +draw_fill_nz (cairo_t *cr, int width, int height) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + return draw (cr, fill); +} + +static cairo_test_status_t +draw_fill_eo (cairo_t *cr, int width, int height) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + return draw (cr, fill); +} + +CAIRO_TEST (clip_stroke_unbounded, + "Tests unbounded stroke through complex clips.", + "clip, stroke, unbounded", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, 2 * HEIGHT, + NULL, draw_stroke) + +CAIRO_TEST (clip_fill_nz_unbounded, + "Tests unbounded fill through complex clips (with winding fill rule).", + "clip, fill, unbounded", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, 2 * HEIGHT, + NULL, draw_fill_nz) + +CAIRO_TEST (clip_fill_eo_unbounded, + "Tests unbounded fill through complex clips (with even-odd fill rule).", + "clip, fill, unbounded", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, 2 * HEIGHT, + NULL, draw_fill_eo) diff --git a/test/clip-empty-group.c b/test/clip-empty-group.c new file mode 100644 index 000000000..3829c8858 --- /dev/null +++ b/test/clip-empty-group.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Test the handling of cairo_push_group() with everything clipped. */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_paint (cr); /* opaque background */ + + cairo_rectangle (cr, 20, 20, 0, 0); + cairo_clip (cr); + + cairo_push_group (cr); /* => 0x0 group */ + cairo_reset_clip (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_rectangle (cr, 0, 0, width, height); + cairo_set_source_rgba (cr, 0, 1, 0, .5); + cairo_fill (cr); + + cairo_move_to (cr, 0, 20); + cairo_line_to (cr, width, 20); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + + cairo_pop_group_to_source (cr); + cairo_reset_clip (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_empty_group, + "Test handling of groups with everything clipped", + "clip, group", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) diff --git a/test/clip-empty-save.c b/test/clip-empty-save.c new file mode 100644 index 000000000..35de3cb94 --- /dev/null +++ b/test/clip-empty-save.c @@ -0,0 +1,68 @@ +/* + * Copyright © 2007 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_reset_clip (cr); + cairo_clip (cr); + + cairo_save (cr); + + cairo_translate (cr, .5, .5); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + + /* https://bugs.freedesktop.org/show_bug.cgi?id=13084 */ + cairo_select_font_face (cr, + CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_move_to (cr, 0., SIZE); + cairo_show_text (cr, "cairo"); + + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_empty_save, + "Test clipping with an empty clip path", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/clip-empty.c b/test/clip-empty.c new file mode 100644 index 000000000..858b69a9e --- /dev/null +++ b/test/clip-empty.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2007 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_reset_clip (cr); + cairo_clip (cr); + + cairo_translate (cr, .5, .5); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + + /* https://bugs.freedesktop.org/show_bug.cgi?id=13084 */ + cairo_select_font_face (cr, + CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_move_to (cr, 0., SIZE); + cairo_show_text (cr, "cairo"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_empty, + "Test clipping with an empty clip path", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/clip-fill-no-op.c b/test/clip-fill-no-op.c new file mode 100644 index 000000000..b686b6e0e --- /dev/null +++ b/test/clip-fill-no-op.c @@ -0,0 +1,67 @@ +/* + * Copyright 2009 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +#define WIDTH 50 +#define HEIGHT 50 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Neutral gray background */ + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + /* remove this clip operation and everything works */ + cairo_rectangle (cr, 10, 10, 30, 30); + cairo_clip (cr); + + /* remove this no-op and everything works */ + cairo_fill (cr); + + /* make the y coordinates integers and everything works */ + cairo_move_to (cr, 20, 20.101562); + cairo_line_to (cr, 30, 20.101562); + + /* This clip operation should fail to work. But with cairo 1.9, if all the + * 3 cases above happen, the clip will not work and the paint will happen. + */ + cairo_save (cr); { + cairo_set_source_rgba (cr, 1, 0.5, 0.5, 1); + cairo_clip_preserve (cr); + cairo_paint (cr); + } cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_fill_no_op, + "Exercises a bug found by Benjamin Otte whereby a no-op clip is nullified by a stroke", + "clip, fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-fill-rule-pixel-aligned.c b/test/clip-fill-rule-pixel-aligned.c new file mode 100644 index 000000000..210afcb83 --- /dev/null +++ b/test/clip-fill-rule-pixel-aligned.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define PAD 1 +#define SIZE 5 + +static void +pixel_aligned_path (cairo_t *cr) +{ + cairo_save (cr); + { + cairo_scale (cr, SIZE, SIZE); + cairo_move_to (cr, 1, 0); + cairo_rel_line_to (cr, 1, 0); + cairo_rel_line_to (cr, 0, 3); + cairo_rel_line_to (cr, 1, 0); + cairo_rel_line_to (cr, 0, -1); + cairo_rel_line_to (cr, -3, 0); + cairo_rel_line_to (cr, 0, -1); + cairo_rel_line_to (cr, 4, 0); + cairo_rel_line_to (cr, 0, 3); + cairo_rel_line_to (cr, -3, 0); + cairo_rel_line_to (cr, 0, -4); + cairo_close_path (cr); + } + cairo_restore (cr); +} + +/* Use clipping to draw the same path twice, once with each fill rule */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + cairo_translate (cr, PAD, PAD); + + cairo_save (cr); + { + pixel_aligned_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_clip (cr); + cairo_paint (cr); + } + cairo_restore (cr); + + cairo_translate (cr, SIZE*4 + PAD, 0); + + cairo_save (cr); + { + pixel_aligned_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + cairo_clip (cr); + cairo_paint (cr); + } + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_fill_rule_pixel_aligned, + "Tests interaction of clipping and cairo_set_fill_rule with a pixel-aligned path", + "clip", /* keywords */ + NULL, /* requirements */ + PAD + (SIZE*4) + PAD + (SIZE*4) + PAD, + PAD + (SIZE*4) + PAD, + NULL, draw) diff --git a/test/clip-fill-rule.c b/test/clip-fill-rule.c new file mode 100644 index 000000000..31c3ab71d --- /dev/null +++ b/test/clip-fill-rule.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define STAR_SIZE 20 + +static void +star_path (cairo_t *cr) +{ + cairo_move_to (cr, 10, 0); + cairo_rel_line_to (cr, 6, 20); + cairo_rel_line_to (cr, -16, -12); + cairo_rel_line_to (cr, 20, 0); + cairo_rel_line_to (cr, -16, 12); +} + +/* Use clipping to draw the same path twice, once with each fill rule */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_translate (cr, 1, 1); + cairo_save (cr); + { + star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + cairo_clip (cr); + cairo_paint (cr); + } + cairo_restore (cr); + + cairo_translate (cr, STAR_SIZE + 1, 0); + cairo_save (cr); + { + star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_clip (cr); + cairo_paint (cr); + } + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +a1_draw (cairo_t *cr, int width, int height) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + return draw (cr, width, height); +} + +CAIRO_TEST (clip_fill_rule, + "Tests interaction of clipping with cairo_set_fill_rule", + "clip", /* keywords */ + NULL, /* requirements */ + STAR_SIZE * 2 + 2, STAR_SIZE + 2, + NULL, draw) +CAIRO_TEST (a1_clip_fill_rule, + "Tests interaction of clipping with cairo_set_fill_rule", + "clip", /* keywords */ + "target=raster", /* requirements */ + STAR_SIZE * 2 + 2, STAR_SIZE + 2, + NULL, a1_draw) diff --git a/test/clip-fill.c b/test/clip-fill.c new file mode 100644 index 000000000..331af7963 --- /dev/null +++ b/test/clip-fill.c @@ -0,0 +1,78 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 20 +#define HEIGHT 20 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* aligned-clip */ + cairo_save (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_rectangle (cr, 3, 3, 10, 10); + cairo_rectangle (cr, 7, 7, 10, 10); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 0.7, 0, 0); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0.7, 0); + cairo_arc (cr, 10, 10, 8, 0, 2 * M_PI); + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* force a clip-mask */ + cairo_save (cr); + cairo_arc (cr, 10, 10, 10, 0, 2 * M_PI); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, 10, 10, 5, 2 * M_PI, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, 10, 10, 2, 0, 2 * M_PI); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 0, 0, 0.7); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0.7, 0); + cairo_arc (cr, 10, 10, 7.5, 0, 2 * M_PI); + cairo_fill (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_fill, + "Tests filling through complex clips.", + "clip, fill", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-group-shapes.c b/test/clip-group-shapes.c new file mode 100644 index 000000000..88bb9b3dd --- /dev/null +++ b/test/clip-group-shapes.c @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2010 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ +#include "cairo-test.h" + +/* Tests specific clipping fast paths and their interaction with + * groups: It shouldn't matter if the clip is set before or after + * pushing a group. + * + * There's some overlap with the following tests, but they test for + * different things: + * + * group-clip.c (tests preserving paths), clipped-group.c (tests + * clipping the same thing different ways), clip-push-group (tests + * for a specific bug). + */ + +#define GENERATE_REF 0 + +/* For determining whether we establish the clip path before or after + * pushing a group. */ +enum { + CLIP_OUTSIDE_GROUP, + CLIP_INSIDE_GROUP +}; + +typedef void (*clipper_t)(cairo_t *cr, int w, int h); + +static cairo_test_status_t +clip_and_paint (cairo_t *cr, + int w, int h, + clipper_t do_clip, + int clip_where) +{ + cairo_save (cr); { + if (GENERATE_REF) { + do_clip (cr, w, h); + cairo_paint (cr); + } else { + if (clip_where == CLIP_OUTSIDE_GROUP) + do_clip (cr, w, h); + cairo_push_group (cr); { + if (clip_where == CLIP_INSIDE_GROUP) + do_clip (cr, w, h); + cairo_paint (cr); + } + cairo_pop_group_to_source (cr); + if (clip_where == CLIP_OUTSIDE_GROUP) + cairo_reset_clip (cr); + cairo_paint (cr); + } + } + cairo_restore (cr); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +run_clip_test (cairo_t *cr, int w, int h, clipper_t do_clip) +{ + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 1,0,0); + + /* Left. */ + clip_and_paint (cr, w/2, h, do_clip, CLIP_OUTSIDE_GROUP); + + /* Right */ + cairo_translate(cr, w/2, 0); + clip_and_paint (cr, w/2, h, do_clip, CLIP_INSIDE_GROUP); + + return CAIRO_TEST_SUCCESS; +} + +static void +clip_aligned_rectangles (cairo_t *cr, int w, int h) +{ + int x1 = 0.2 * w; + int y1 = 0.2 * h; + int x2 = 0.8 * w; + int y2 = 0.8 * h; + + cairo_rectangle (cr, x1, y1, w, h); + cairo_clip (cr); + + cairo_rectangle (cr, x2, y2, -w, -h); + cairo_clip (cr); +} + +static void +clip_unaligned_rectangles (cairo_t *cr, int w, int h) +{ + /* This clip stresses the antialiased edges produced by an + * unaligned rectangular clip. The edges should be produced by + * compositing red on white with alpha = 0.5 on the sides, and with + * alpha = 0.25 in the corners. */ + int x1 = 0.2 * w; + int y1 = 0.2 * h; + int x2 = 0.8 * w; + int y2 = 0.8 * h; + + cairo_rectangle (cr, x1+0.5, y1+0.5, w, h); + cairo_clip (cr); + + cairo_rectangle (cr, x2+0.5, y2+0.5, -w, -h); + w = x2 - x1; + h = y2 - y1; + cairo_rectangle (cr, x2, y1+1, -w+1, h-1); + cairo_clip (cr); +} + +static void +clip_circles (cairo_t *cr, int w, int h) +{ + int x1 = 0.5 * w; + int y1 = 0.5 * h; + int x2 = 0.75 * w; + int y2 = 0.75 * h; + int r = 0.4*MIN(w,h); + + cairo_arc (cr, x1, y1, r, 0, 6.28); + cairo_close_path (cr); + cairo_clip (cr); + + cairo_arc (cr, x2, y2, r, 0, 6.28); + cairo_close_path (cr); + cairo_clip (cr); +} + +static cairo_test_status_t +draw_aligned_rectangles (cairo_t *cr, int width, int height) +{ + return run_clip_test (cr, width, height, clip_aligned_rectangles); +} + +static cairo_test_status_t +draw_unaligned_rectangles (cairo_t *cr, int width, int height) +{ + return run_clip_test (cr, width, height, clip_unaligned_rectangles); +} + +static cairo_test_status_t +draw_circles (cairo_t *cr, int width, int height) +{ + return run_clip_test (cr, width, height, clip_circles); +} + +CAIRO_TEST (clip_group_shapes_aligned_rectangles, + "Test clip and group interaction with aligned rectangle clips", + "clip", /* keywords */ + NULL, /* requirements */ + 200, 100, + NULL, draw_aligned_rectangles) + +CAIRO_TEST (clip_group_shapes_unaligned_rectangles, + "Test clip and group interaction with unaligned rectangle clips", + "clip", /* keywords */ + "target=raster", /* requirements */ + 200, 100, + NULL, draw_unaligned_rectangles) + +CAIRO_TEST (clip_group_shapes_circles, + "Test clip and group interaction with circular clips", + "clip", /* keywords */ + NULL, /* requirements */ + 200, 100, + NULL, draw_circles) diff --git a/test/clip-image.c b/test/clip-image.c new file mode 100644 index 000000000..68ed142d6 --- /dev/null +++ b/test/clip-image.c @@ -0,0 +1,95 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 20 +#define HEIGHT 20 + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + image = cairo_test_create_surface_from_png (ctx, png_filename); + cairo_set_source_surface (cr, image, 0, 0); + cairo_surface_destroy (image); + + /* simple clip */ + cairo_save (cr); + cairo_rectangle (cr, 2, 2, 16, 16); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* unaligned clip */ + cairo_save (cr); + cairo_rectangle (cr, 2.5, 2.5, 15, 15); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, -WIDTH, HEIGHT); + + /* aligned-clip */ + cairo_save (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_rectangle (cr, 3, 3, 10, 10); + cairo_rectangle (cr, 7, 7, 10, 10); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* force a clip-mask */ + cairo_save (cr); + cairo_arc (cr, 10, 10, 10, 0, 2 * M_PI); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, 10, 10, 5, 2 * M_PI, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, 10, 10, 2, 0, 2 * M_PI); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_image, + "Tests painting an image through complex clips.", + "clip, paint", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, 2 * HEIGHT, + NULL, draw) diff --git a/test/clip-intersect.c b/test/clip-intersect.c new file mode 100644 index 000000000..295fbc93c --- /dev/null +++ b/test/clip-intersect.c @@ -0,0 +1,94 @@ +/* + * Copyright 2009 Chris Wilson + * Copyright 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 20 +#define HEIGHT 20 + +static void clip_mask (cairo_t *cr) +{ + cairo_move_to (cr, 10, 0); + cairo_line_to (cr, 0, 10); + cairo_line_to (cr, 10, 20); + cairo_line_to (cr, 20, 10); + cairo_clip (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + clip_mask (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + cairo_reset_clip (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_rectangle (cr, 0, 0, 4, 4); + cairo_clip (cr); + clip_mask (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + cairo_rectangle (cr, 20, 0, -4, 4); + cairo_clip (cr); + clip_mask (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + cairo_rectangle (cr, 20, 20, -4, -4); + cairo_clip (cr); + clip_mask (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + cairo_rectangle (cr, 0, 20, 4, -4); + cairo_clip (cr); + clip_mask (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + + cairo_rectangle (cr, 8, 8, 4, 4); + cairo_clip (cr); + clip_mask (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_intersect, + "Tests intersection of a simple clip with a clip-mask", + "clip, paint", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-mixed-antialias.c b/test/clip-mixed-antialias.c new file mode 100644 index 000000000..23a55ff63 --- /dev/null +++ b/test/clip-mixed-antialias.c @@ -0,0 +1,128 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 200 +#define HEIGHT 200 + +/* This is an example from the wild, as silly as it is +n 52 0 429 709 rectangle +clip+ +//ANTIALIAS_NONE set-antialias +n 8 0 m 952 0 l 956.417969 0 960 3.582031 960 8 c 960 1807 l 960 1811.417969 956.417969 1815 952 1815 c 8 1815 l 3.582031 1815 0 1811.417969 0 1807 c 0 8 l 0 3.582031 3.582031 0 8 0 c h +clip+ +//EVEN_ODD set-fill-rule +n 0 0 m 480 0 l 480 708 l 0 708 l h 8 1 m 952 1 l 955.867188 1 959 4.132812 959 8 c 959 1807 l 959 1810.867188 955.867188 1814 952 1814 c 8 1814 l 4.132812 1814 1 1810.867188 1 1807 c 1 8 l 1 4.132812 4.132812 1 8 1 c h +clip+ +//WINDING set-fill-rule +//ANTIALIAS_DEFAULT set-antialias +n 960 0 m 52.5 907.5 l 52.5 1815 l 960 1815 l h +clip+ +//ANTIALIAS_NONE set-antialias +n 960 0 m 52.5 0 l 52.5 907.5 l 960 1815 l h +clip+ +*/ + +static void background (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); +} + +static void clip_0 (cairo_t *cr) +{ + cairo_rectangle (cr, 5, 5, 190, 190); + cairo_clip (cr); +} + +static void clip_1 (cairo_t *cr) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_arc (cr, 100, 100, 125, 0, 2*M_PI); + cairo_clip (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); +} + +static void +rounded_rectangle (cairo_t *cr, int x, int y, int w, int h, int r) +{ + cairo_new_sub_path (cr); + cairo_arc (cr, x + r, y + r, r, M_PI, 3 * M_PI / 2); + cairo_arc (cr, x + w - r, y + r, r, 3 *M_PI / 2, 2 * M_PI); + cairo_arc (cr, x + w - r, y + h - r, r, 0, M_PI / 2); + cairo_arc (cr, x + r, y + h - r, r, M_PI / 2, M_PI); + cairo_close_path (cr); +} + +static void clip_2 (cairo_t *cr) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + rounded_rectangle (cr, 50, 50, 100, 100, 15); + rounded_rectangle (cr, 60, 60, 80, 80, 5); + cairo_clip (cr); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); +} + +static void clip_3 (cairo_t *cr) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_rectangle (cr, 40.25, 60.25, 120, 80); + cairo_rectangle (cr, 60.25, 40.25, 80, 120); + cairo_clip (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + background (cr); + + clip_0 (cr); + clip_1 (cr); + clip_2 (cr); + clip_3 (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_mixed_antialias, + "Test drawing through through an mixture of clips", + "clip", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-nesting.c b/test/clip-nesting.c new file mode 100644 index 000000000..a9227ec77 --- /dev/null +++ b/test/clip-nesting.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Owen Taylor + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 100 +#define BORDER 10 +#define LINE_WIDTH 20 + +static void +_propagate_status (cairo_t *dst, cairo_t *src) +{ + cairo_path_t path; + + path.status = cairo_status (src); + if (path.status) { + path.num_data = 0; + path.data = NULL; + cairo_append_path (dst, &path); + } +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *target_surface; + cairo_t *cr2, *cr3; + + target_surface = cairo_get_group_target (cr); + + cr2 = cairo_create (target_surface); + + /* Draw a diagonal line and clip to it */ + + cairo_move_to (cr2, BORDER, BORDER); + cairo_line_to (cr2, BORDER + LINE_WIDTH, BORDER); + cairo_line_to (cr2, SIZE - BORDER, SIZE - BORDER); + cairo_line_to (cr2, SIZE - BORDER - LINE_WIDTH, SIZE - BORDER); + + cairo_clip (cr2); + cairo_set_source_rgb (cr2, 0, 0, 1); /* Blue */ + cairo_paint (cr2); + + /* Clipping affects this cairo_t */ + + cairo_set_source_rgb (cr2, 1, 1, 1); /* White */ + cairo_rectangle (cr2, + SIZE / 2 - LINE_WIDTH / 2, BORDER, + LINE_WIDTH, SIZE - 2 * BORDER); + cairo_fill (cr2); + + /* But doesn't affect another cairo_t that we create temporarily for + * the same surface + */ + cr3 = cairo_create (target_surface); + cairo_set_source_rgb (cr3, 1, 1, 1); /* White */ + cairo_rectangle (cr3, + SIZE - BORDER - LINE_WIDTH, BORDER, + LINE_WIDTH, SIZE - 2 * BORDER); + cairo_fill (cr3); + + _propagate_status (cr, cr3); + cairo_destroy (cr3); + + _propagate_status (cr, cr2); + cairo_destroy (cr2); + + /* And doesn't affect anything after this cairo_t is destroyed */ + + cairo_set_source_rgb (cr, 1, 1, 1); /* White */ + cairo_rectangle (cr, + BORDER, BORDER, + LINE_WIDTH, SIZE - 2 * BORDER); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; + +} + +CAIRO_TEST (clip_nesting, + "Test clipping with multiple contexts for the same surface", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/clip-operator.c b/test/clip-operator.c new file mode 100644 index 000000000..ac0a5e966 --- /dev/null +++ b/test/clip-operator.c @@ -0,0 +1,188 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" +#include +#include + +#define WIDTH 16 +#define HEIGHT 16 +#define PAD 2 + +static void +draw_mask (cairo_t *cr, int x, int y) +{ + cairo_surface_t *mask_surface; + cairo_t *cr2; + + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + mask_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask_surface); + cairo_surface_destroy (mask_surface); + + cairo_save (cr2); + cairo_set_source_rgba (cr2, 0, 0, 0, 0); /* transparent */ + cairo_set_operator (cr2, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr2); + cairo_restore (cr2); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.45 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_mask_surface (cr, cairo_get_target (cr2), x, y); + cairo_destroy (cr2); +} + +static void +draw_glyphs (cairo_t *cr, int x, int y) +{ + cairo_text_extents_t extents; + + cairo_set_font_size (cr, 0.8 * HEIGHT); + + cairo_text_extents (cr, "FG", &extents); + cairo_move_to (cr, + x + floor ((WIDTH - extents.width) / 2 + 0.5) - extents.x_bearing, + y + floor ((HEIGHT - extents.height) / 2 + 0.5) - extents.y_bearing); + cairo_show_text (cr, "FG"); +} + +static void +draw_polygon (cairo_t *cr, int x, int y) +{ + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + cairo_new_path (cr); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + height); + cairo_line_to (cr, x + width / 2, y + 3 * height / 4); + cairo_line_to (cr, x + width, y + height); + cairo_line_to (cr, x + width, y); + cairo_line_to (cr, x + width / 2, y + height / 4); + cairo_close_path (cr); + cairo_fill (cr); +} + +static void +draw_rects (cairo_t *cr, int x, int y) +{ + double block_width = (int)(0.33 * WIDTH + 0.5); + double block_height = (int)(0.33 * HEIGHT + 0.5); + int i, j; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + if ((i + j) % 2 == 0) + cairo_rectangle (cr, + x + block_width * i, y + block_height * j, + block_width, block_height); + + cairo_fill (cr); +} + +static void (* const draw_funcs[])(cairo_t *cr, int x, int y) = { + draw_mask, + draw_glyphs, + draw_polygon, + draw_rects +}; + +#define N_OPERATORS (1 + CAIRO_OPERATOR_SATURATE - CAIRO_OPERATOR_CLEAR) + +#define IMAGE_WIDTH (N_OPERATORS * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (draw_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + size_t j, x, y; + cairo_operator_t op; + cairo_pattern_t *pattern; + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, 0.9 * HEIGHT); + + for (j = 0; j < ARRAY_LENGTH (draw_funcs); j++) { + for (op = CAIRO_OPERATOR_CLEAR; op < N_OPERATORS; op++) { + x = op * (WIDTH + PAD) + PAD; + y = j * (HEIGHT + PAD) + PAD; + + cairo_save (cr); + + pattern = cairo_pattern_create_linear (x + WIDTH, y, + x, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, + 0.0, 0.0, 1.0, 1.0); /* Solid blue */ + cairo_pattern_add_color_stop_rgba (pattern, 0.8, + 0.0, 0.0, 1.0, 0.0); /* Transparent blue */ + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill (cr); + + cairo_set_operator (cr, op); + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + + cairo_move_to (cr, x, y); + cairo_line_to (cr, x + WIDTH, y); + cairo_line_to (cr, x, y + HEIGHT); + cairo_clip (cr); + + draw_funcs[j] (cr, x, y); + if (cairo_status (cr)) + cairo_test_log (ctx, "%d %d HERE!\n", op, (int)j); + + cairo_restore (cr); + } + } + + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) + cairo_test_log (ctx, "%d %d .HERE!\n", op, (int)j); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_operator, + "Surface clipping with different operators", + "clip", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) + diff --git a/test/clip-polygons.c b/test/clip-polygons.c new file mode 100644 index 000000000..83eb4df3a --- /dev/null +++ b/test/clip-polygons.c @@ -0,0 +1,112 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define STEP 5 +#define WIDTH 100 +#define HEIGHT 100 + +static void diamond (cairo_t *cr) +{ + cairo_move_to (cr, WIDTH/2, 0); + cairo_line_to (cr, WIDTH, HEIGHT/2); + cairo_line_to (cr, WIDTH/2, HEIGHT); + cairo_line_to (cr, 0, HEIGHT/2); + cairo_close_path (cr); +} + +static void background (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 0,0,0); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + background (cr); + + /* completely overlapping diamonds */ + cairo_save (cr); + diamond (cr); + cairo_clip (cr); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* partial overlap */ + cairo_save (cr); + cairo_translate (cr, -WIDTH/4, 0); + diamond (cr); + cairo_clip (cr); + cairo_translate (cr, WIDTH/2, 0); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* no overlap, but the bounding boxes must */ + cairo_save (cr); + cairo_translate (cr, -WIDTH/2 + 2, -2); + diamond (cr); + cairo_clip (cr); + cairo_translate (cr, WIDTH - 4, 4); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* completely disjoint */ + cairo_save (cr); + cairo_translate (cr, -WIDTH/2 - 1, 0); + diamond (cr); + cairo_clip (cr); + cairo_translate (cr, WIDTH + 2, 0); + diamond (cr); + cairo_clip (cr); + cairo_paint (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_polygons, + "Test drawing through through an intersection of polygons", + "clip", /* keywords */ + "target=raster", /* requirements */ + 4*WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-push-group.c b/test/clip-push-group.c new file mode 100644 index 000000000..4effb0aba --- /dev/null +++ b/test/clip-push-group.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* A test for the crash described here: + * + * http://lists.freedesktop.org/archives/cairo/2006-August/007698.html + * + * The triggering condition for this bug should be setting a + * surface-based clip and then calling cairo_push_group. + */ + +#include "cairo-test.h" + +#define SIZE 10 +#define PAD 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* An overly complex way of drawing a blue circle onto a red + * background, to trigger the bug. */ + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + cairo_paint (cr); + + cairo_arc (cr, + SIZE / 2, SIZE / 2, + SIZE / 2 - PAD, + 0, 2 * M_PI); + cairo_clip (cr); + + cairo_push_group (cr); + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_push_group, + "Test that push_group doesn't crash after setting a surface-based clip", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/clip-rectilinear.c b/test/clip-rectilinear.c new file mode 100644 index 000000000..98db4a2c7 --- /dev/null +++ b/test/clip-rectilinear.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 120 + +static void L(cairo_t *cr, int w, int h) +{ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 0, h); + cairo_line_to (cr, w, h); + cairo_line_to (cr, w, h/2); + cairo_line_to (cr, w/2, h/2); + cairo_line_to (cr, w/2, 0); + cairo_close_path (cr); +} + +static void LL(cairo_t *cr, int w, int h) +{ + cairo_save (cr); + + /* aligned */ + cairo_rectangle (cr, 0, 0, w, h); + cairo_clip (cr); + L (cr, w, h); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + /* unaligned */ + cairo_translate (cr, w+.25, .25); + cairo_rectangle (cr, 0, 0, w, h); + cairo_clip (cr); + L (cr, w, h); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int w = SIZE/2, h = SIZE/2; + + cairo_paint (cr); /* opaque background */ + + cairo_set_source_rgb (cr, 1, 0, 0); + LL (cr, w, h); + + cairo_translate (cr, 0, h); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_set_source_rgb (cr, 0, 0, 1); + LL (cr, w, h); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_rectilinear, + "Test handling of rectilinear clipping", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/clip-shape.c b/test/clip-shape.c new file mode 100644 index 000000000..6a74a6ed5 --- /dev/null +++ b/test/clip-shape.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Adapted from a bug report by */ + +#include "cairo-test.h" + +static const struct xy { + double x; + double y; +} gp[] = { + { 100, 250 }, + { 100, 100 }, + { 150, 230 }, + { 239, 100 }, + { 239, 250 }, +}; + +static const double vp[3] = { 100, 144, 238.5 }; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_paint (cr); /* opaque background */ + + for (i = 0; i < 5; ++i) + cairo_line_to (cr, gp[i].x, gp[i].y); + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 1.5); + cairo_stroke_preserve (cr); + cairo_clip (cr); + + for (i = 1; i < 3; ++i) { + double x1 = vp[i - 1]; + double x2 = vp[i]; + + cairo_move_to (cr, x1, 0); + cairo_line_to (cr, x1, height); + cairo_line_to (cr, x2, height); + cairo_line_to (cr, x2, 0); + cairo_close_path (cr); + + if (i & 1) + cairo_set_source_rgb (cr, 0, 1, 0); + else + cairo_set_source_rgb (cr, 1, 1, 0); + + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_shape, + "Test handling of clipping with a non-aligned shape", + "clip", /* keywords */ + NULL, /* requirements */ + 400, 300, + NULL, draw) diff --git a/test/clip-stroke-no-op.c b/test/clip-stroke-no-op.c new file mode 100644 index 000000000..8eb91719b --- /dev/null +++ b/test/clip-stroke-no-op.c @@ -0,0 +1,67 @@ +/* + * Copyright 2009 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +#define WIDTH 50 +#define HEIGHT 50 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Neutral gray background */ + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + /* remove this clip operation and everything works */ + cairo_rectangle (cr, 10, 10, 30, 30); + cairo_clip (cr); + + /* remove this no-op and everything works */ + cairo_stroke (cr); + + /* make the y coordinates integers and everything works */ + cairo_move_to (cr, 20, 20.101562); + cairo_line_to (cr, 30, 20.101562); + + /* This clip operation should fail to work. But with cairo 1.9, if all the + * 3 cases above happen, the clip will not work and the paint will happen. + */ + cairo_save (cr); { + cairo_set_source_rgba (cr, 1, 0.5, 0.5, 1); + cairo_clip_preserve (cr); + cairo_paint (cr); + } cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_stroke_no_op, + "Exercises a bug found by Benjamin Otte whereby a no-op clip is nullified by a stroke", + "clip, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-stroke.c b/test/clip-stroke.c new file mode 100644 index 000000000..9714dd067 --- /dev/null +++ b/test/clip-stroke.c @@ -0,0 +1,121 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 40 +#define HEIGHT 40 + +static void +shapes (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0.7, 0); + cairo_arc (cr, 10, 10, 7.5, 0, 2 * M_PI); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0, 0.7, 0.7); + cairo_arc (cr, 10, 10, 25, 0, 2 * M_PI); + cairo_stroke (cr); + cairo_rectangle (cr, -5, -5, 30, 30); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0.7, 0.7, 0); + cairo_save (cr); + cairo_translate (cr, 10, 10); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -10, -10); + cairo_rectangle (cr, -5, -5, 30, 30); + cairo_stroke (cr); + cairo_restore (cr); + + cairo_set_source_rgb (cr, 0.7, 0.0, 0.7); + cairo_move_to (cr, 15, -10); + cairo_line_to (cr, 30, 10); + cairo_line_to (cr, 15, 30); + cairo_stroke (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 10, 10); + + /* simple clip */ + cairo_save (cr); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_clip (cr); + shapes (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* unaligned clip */ + cairo_save (cr); + cairo_rectangle (cr, 0.5, 0.5, 20, 20); + cairo_clip (cr); + shapes (cr); + cairo_restore (cr); + + cairo_translate (cr, -WIDTH, HEIGHT); + + /* aligned-clip */ + cairo_save (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_rectangle (cr, 3, 3, 10, 10); + cairo_rectangle (cr, 7, 7, 10, 10); + cairo_clip (cr); + shapes (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* force a clip-mask */ + cairo_save (cr); + cairo_arc (cr, 10, 10, 10, 0, 2 * M_PI); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, 10, 10, 5, 2 * M_PI, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, 10, 10, 2, 0, 2 * M_PI); + cairo_clip (cr); + shapes (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_stroke, + "Tests stroke through complex clips.", + "clip, stroke", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, 2* HEIGHT, + NULL, draw) + diff --git a/test/clip-text.c b/test/clip-text.c new file mode 100644 index 000000000..ed8e10796 --- /dev/null +++ b/test/clip-text.c @@ -0,0 +1,88 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 20 +#define HEIGHT 20 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const char *cairo = "Cairo"; + cairo_text_extents_t extents; + double x0, y0; + + cairo_text_extents (cr, cairo, &extents); + x0 = WIDTH/2. - (extents.width/2. + extents.x_bearing); + y0 = HEIGHT/2. - (extents.height/2. + extents.y_bearing); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* aligned-clip */ + cairo_save (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 0, 0, 20, 20); + cairo_rectangle (cr, 3, 3, 10, 10); + cairo_rectangle (cr, 7, 7, 10, 10); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 0.7, 0, 0); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_move_to (cr, x0, y0); + cairo_show_text (cr, cairo); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + /* force a clip-mask */ + cairo_save (cr); + cairo_arc (cr, 10, 10, 10, 0, 2 * M_PI); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, 10, 10, 5, 2 * M_PI, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, 10, 10, 2, 0, 2 * M_PI); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 0, 0, 0.7); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_move_to (cr, x0, y0); + cairo_show_text (cr, cairo); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_text, + "Tests drawing text through complex clips.", + "clip, text", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-twice-rectangle.c b/test/clip-twice-rectangle.c new file mode 100644 index 000000000..28f16ec84 --- /dev/null +++ b/test/clip-twice-rectangle.c @@ -0,0 +1,70 @@ +/* + * Copyright © 2010 Mozilla Corporation + * Copyright © 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + cairo_t *cr2; + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + /* clip twice, note that the intersection is smaller then the extents */ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_rectangle (cr, 10, 10, 80, 80); + cairo_rectangle (cr, 20, 20, 60, 60); + cairo_clip (cr); + + cairo_rectangle (cr, 0, 40, 40, 30); + cairo_clip (cr); + + /* and exercise the bug found by Jeff Muizelaar */ + mask = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, + width-20, height-20); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_set_source_rgba (cr2, 1, 1, 1, 1); + cairo_paint (cr2); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_twice_rectangle, + "Tests clipping twice using rectangles", + "clip", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw) diff --git a/test/clip-twice.c b/test/clip-twice.c new file mode 100644 index 000000000..641b55144 --- /dev/null +++ b/test/clip-twice.c @@ -0,0 +1,74 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" + +#define WIDTH 64 +#define HEIGHT 64 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_new_path (cr); + cairo_arc (cr, WIDTH / 2, HEIGHT / 2, WIDTH / 3, 0, 2 * M_PI); + cairo_clip (cr); + + cairo_new_path (cr); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, WIDTH / 4, HEIGHT / 2); + cairo_line_to (cr, 0, HEIGHT); + cairo_line_to (cr, WIDTH, HEIGHT); + cairo_line_to (cr, 3 * WIDTH / 4, HEIGHT / 2); + cairo_line_to (cr, WIDTH, 0); + cairo_close_path (cr); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 0, 0, 0.6); + + cairo_new_path (cr); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 0, HEIGHT); + cairo_line_to (cr, WIDTH / 2, 3 * HEIGHT / 4); + cairo_line_to (cr, WIDTH, HEIGHT); + cairo_line_to (cr, WIDTH, 0); + cairo_line_to (cr, WIDTH / 2, HEIGHT / 4); + cairo_close_path (cr); + cairo_fill (cr); + + cairo_new_path (cr); + cairo_arc (cr, WIDTH / 2, HEIGHT / 2, WIDTH / 5, 0, 2 * M_PI); + cairo_clip (cr); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_twice, + "Verifies that the clip mask is updated correctly when it constructed by setting the clip path twice.", + "clip", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clip-unbounded.c b/test/clip-unbounded.c new file mode 100644 index 000000000..cd1c60223 --- /dev/null +++ b/test/clip-unbounded.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 10 + +static cairo_surface_t * +create_source (cairo_surface_t *target) +{ + cairo_surface_t *similar; + cairo_t *cr; + + similar = cairo_surface_create_similar (target, + CAIRO_CONTENT_COLOR, SIZE/2, SIZE); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_rectangle (cr, 0, 0, SIZE/2, SIZE); + cairo_clip (cr); + + /* Draw a source rectangle outside the image, the effect should be to + * clear only within the clip region. + */ + source = create_source (cairo_get_target (cr)); + cairo_set_source_surface (cr, source, SIZE/2, 0); + cairo_surface_destroy (source); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_unbounded, + "Test handling of an unbounded fill outside the clip region", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + diff --git a/test/clip-zero.c b/test/clip-zero.c new file mode 100644 index 000000000..5afd1b561 --- /dev/null +++ b/test/clip-zero.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2007 Mozilla Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pat; + cairo_surface_t *surf; + + cairo_new_path (cr); + cairo_rectangle (cr, 0, 0, 0, 0); + cairo_clip (cr); + + cairo_push_group (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_new_path (cr); + cairo_rectangle (cr, -10, 10, 20, 20); + cairo_fill_preserve (cr); + cairo_stroke_preserve (cr); + cairo_paint (cr); + + cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "ABC"); + + cairo_mask (cr, cairo_get_source (cr)); + + surf = cairo_surface_create_similar (cairo_get_group_target (cr), CAIRO_CONTENT_COLOR_ALPHA, 0, 0); + pat = cairo_pattern_create_for_surface (surf); + cairo_surface_destroy (surf); + + cairo_mask (cr, pat); + cairo_pattern_destroy (pat); + + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clip_zero, + "Verifies that 0x0 surfaces or clips don't cause problems.", + "clip", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/clipped-group.c b/test/clipped-group.c new file mode 100644 index 000000000..a66f357f8 --- /dev/null +++ b/test/clipped-group.c @@ -0,0 +1,88 @@ +/* + * Copyright © 2008 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jeff Muizelaar + */ + +#include "cairo-test.h" + +#define WIDTH 60 +#define HEIGHT 70 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* fill with black so we don't need an rgb test case */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* setting a scale will ensure that the device offset is transformed */ + cairo_scale (cr, 2.1, 2.8); + cairo_set_source_rgb (cr, 1, .5,.4); + + /* all rectangles should look the same */ + + /* plain rectangle */ + cairo_rectangle (cr, 4, 4, 8, 8); + cairo_fill (cr); + + cairo_translate (cr, 10, 0); + + /* clipped rectangle */ + cairo_save (cr); + cairo_rectangle (cr, 3, 3, 9, 9); + cairo_clip (cr); + cairo_rectangle (cr, 4, 4, 8, 8); + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, 0, 10); + + /* clipped and grouped rectangle */ + cairo_save (cr); + cairo_rectangle (cr, 3, 3, 9, 9); + cairo_clip (cr); + cairo_push_group (cr); + cairo_rectangle (cr, 4, 4, 8, 8); + cairo_fill (cr); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, -10, 0); + + /* grouped rectangle */ + cairo_push_group (cr); + cairo_rectangle (cr, 4, 4, 8, 8); + cairo_fill (cr); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clipped_group, + "Test that a clipped group ends up in the right place", + "clip", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/clipped-surface.c b/test/clipped-surface.c new file mode 100644 index 000000000..a10652dc8 --- /dev/null +++ b/test/clipped-surface.c @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * Michael Natterer (mitch) reported a bad regression with post-1.8 trunk + * with artifacts drawn whilst repainting exposed areas. + */ + +#include "cairo-test.h" + +static const char png_filename[] = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + + image = cairo_test_create_surface_from_png (ctx, png_filename); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + cairo_rectangle (cr, 20, 20, 10, 10); + cairo_clip (cr); + + cairo_set_source_surface (cr, image, 10, 10); + cairo_surface_destroy (image); + + cairo_rectangle (cr, 10, 10, 20, 20); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (clipped_surface, + "Tests application of a clip to a source surface", + "clip", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) diff --git a/test/close-path-current-point.c b/test/close-path-current-point.c new file mode 100644 index 000000000..35f8d423b --- /dev/null +++ b/test/close-path-current-point.c @@ -0,0 +1,95 @@ +/* + * Copyright © 2009 Nis Martensen + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the copyright holder + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The + * copyright holder makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without + * express or implied warranty. + * + * THE COPYRIGHT HOLDER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Nis Martensen + */ + +#include "cairo-test.h" + +#define SIZE 20 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + /* subpath starts with cairo_move_to */ + cairo_new_sub_path (cr); + cairo_move_to (cr, SIZE, SIZE); + cairo_rel_line_to (cr, SIZE, 0); + cairo_rel_line_to (cr, 0, SIZE); + cairo_close_path (cr); + cairo_rel_line_to (cr, 0.5 * SIZE, SIZE); + + /* subpath starts with cairo_line_to */ + cairo_new_sub_path (cr); + cairo_line_to (cr, SIZE, 3 * SIZE); + cairo_rel_line_to (cr, SIZE, 0); + cairo_rel_line_to (cr, 0, SIZE); + cairo_close_path (cr); + cairo_rel_line_to (cr, 0, SIZE); + + /* subpath starts with cairo_curve_to */ + cairo_new_sub_path (cr); + cairo_curve_to (cr, + SIZE, 5 * SIZE, + 1.5 * SIZE, 6 * SIZE, + 2 * SIZE, 5 * SIZE); + cairo_rel_line_to (cr, 0, SIZE); + cairo_close_path (cr); + cairo_rel_line_to (cr, -0.5 * SIZE, SIZE); + + /* subpath starts with cairo_arc */ + cairo_new_sub_path (cr); + cairo_arc (cr, + 1.5 * SIZE, 7 * SIZE, + 0.5 * SIZE, + M_PI, 2 * M_PI); + cairo_rel_line_to (cr, 0, SIZE); + cairo_close_path (cr); + cairo_rel_line_to (cr, -0.7 * SIZE, 0.7 * SIZE); + + /* subpath starts with cairo_arc_negative */ + cairo_new_sub_path (cr); + cairo_arc_negative (cr, + 1.5 * SIZE, 9 * SIZE, + 0.5 * SIZE, + M_PI, 2 * M_PI); + cairo_rel_line_to (cr, 0, SIZE); + cairo_close_path (cr); + cairo_rel_line_to (cr, -0.8 * SIZE, 0.3 * SIZE); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (close_path_current_point, + "Test some corner cases related to cairo path operations and the current point", + "path", /* keywords */ + NULL, /* requirements */ + 3 * SIZE, 11 * SIZE, + NULL, draw) diff --git a/test/close-path.c b/test/close-path.c new file mode 100644 index 000000000..f1f1230fa --- /dev/null +++ b/test/close-path.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +static cairo_test_draw_function_t draw; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_path_t *path; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + /* This curious approach for drawing a circle (starting with a + * closed arc) exercises a bug in which the "last move point" was + * not being set so the close_path closes to (0,0). */ + cairo_arc (cr, 8, 8, 4, 0, M_PI); + cairo_close_path (cr); + cairo_arc (cr, 8, 8, 4, M_PI, 2 * M_PI); + + cairo_fill (cr); + + cairo_translate (cr, 16, 0); + + /* Here a curve immediately after a close_to will begin from (0,0) + * when the path is obtained with cairo_copy_path_flat. */ + cairo_move_to (cr, 8, 4); + cairo_arc_negative (cr, 8, 8, 4, 3 * M_PI / 2.0, M_PI / 2.0); + cairo_close_path (cr); + cairo_curve_to (cr, + 12, 4, + 12, 12, + 8, 12); + + path = cairo_copy_path_flat (cr); + cairo_new_path (cr); + cairo_append_path (cr, path); + cairo_path_destroy (path); + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (close_path, + "Test some corner cases related to cairo_close_path", + "path", /* keywords */ + NULL, /* requirements */ + 32, 16, + NULL, draw) diff --git a/test/composite-integer-translate-over-repeat.c b/test/composite-integer-translate-over-repeat.c new file mode 100644 index 000000000..d9e00057b --- /dev/null +++ b/test/composite-integer-translate-over-repeat.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2007 Mozilla Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 100 +#define SIZE2 20 +#define OFFSET 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *image; + cairo_pattern_t *pat; + cairo_t *cr2; + + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, SIZE2, SIZE2); + cr2 = cairo_create (image); + cairo_surface_destroy (image); + + cairo_set_source_rgba (cr2, 1, 0, 0, 1); + cairo_rectangle (cr2, 0, 0, SIZE2/2, SIZE2/2); + cairo_fill (cr2); + cairo_set_source_rgba (cr2, 0, 1, 0, 1); + cairo_rectangle (cr2, SIZE2/2, 0, SIZE2/2, SIZE2/2); + cairo_fill (cr2); + cairo_set_source_rgba (cr2, 0, 0, 1, 1); + cairo_rectangle (cr2, 0, SIZE2/2, SIZE2/2, SIZE2/2); + cairo_fill (cr2); + cairo_set_source_rgba (cr2, 1, 1, 0, 1); + cairo_rectangle (cr2, SIZE2/2, SIZE2/2, SIZE2/2, SIZE2/2); + cairo_fill (cr2); + + pat = cairo_pattern_create_for_surface (cairo_get_target (cr2)); + cairo_destroy (cr2); + + cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); + + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill (cr); + + cairo_translate (cr, OFFSET, OFFSET); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source (cr, pat); + cairo_rectangle (cr, 0, 0, SIZE - OFFSET, SIZE - OFFSET); + cairo_fill (cr); + + cairo_pattern_destroy (pat); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (composite_integer_translate_over_repeat, + "Test simple compositing: integer-translation 32->32 OVER, with repeat", + "composite", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/composite-integer-translate-over.c b/test/composite-integer-translate-over.c new file mode 100644 index 000000000..1b82a3379 --- /dev/null +++ b/test/composite-integer-translate-over.c @@ -0,0 +1,61 @@ +/* + * Copyright © 2006 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ +#include "cairo-test.h" +#include +#include + +#define SIZE 100 +#define OFFSET 10 +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + + image = cairo_test_create_surface_from_png (ctx, png_filename); + + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill (cr); + + cairo_translate (cr, OFFSET, OFFSET); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface (cr, image, 0, 0); + cairo_rectangle (cr, 0, 0, (SIZE-OFFSET), (SIZE-OFFSET)); + cairo_fill (cr); + + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (composite_integer_translate_over, + "Test simple compositing: integer-translation 32->32 OVER", + "composite", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/composite-integer-translate-source.c b/test/composite-integer-translate-source.c new file mode 100644 index 000000000..e6fd93366 --- /dev/null +++ b/test/composite-integer-translate-source.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2007 Mozilla Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 100 +#define OFFSET 10 + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + + image = cairo_test_create_surface_from_png (ctx, png_filename); + + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill (cr); + + cairo_translate (cr, OFFSET, OFFSET); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, image, 0, 0); + cairo_rectangle (cr, 0, 0, SIZE - OFFSET, SIZE - OFFSET); + cairo_fill (cr); + + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (composite_integer_translate_source, + "Test simple compositing: integer-translation 32->32 SOURCE", + "composite", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/copy-disjoint.c b/test/copy-disjoint.c new file mode 100644 index 000000000..1ddfd5a91 --- /dev/null +++ b/test/copy-disjoint.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* The goal is exercise a bug that existed in the xlib backend, where + * it assumed the rectangles generated by rectangular tessallator had + * any sorting guarantees. + */ + +#define WIDTH 300 +#define HEIGHT 300 + +static cairo_surface_t * +create_source (cairo_surface_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_surface_create_similar (target, + CAIRO_CONTENT_COLOR, + WIDTH, HEIGHT); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *white; + int x; + + /* black background */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* white rectangles */ + white = create_source (cairo_get_target (cr)); + cairo_set_source_surface (cr, white, 0, 0); + cairo_surface_destroy (white); + + /* blit a set of rectangles that the rectangular tessellator + * will not emit sorted. */ + for (x = 0; x < WIDTH - 10; x += 15) + cairo_rectangle (cr, x, x, 10, HEIGHT - 2*x); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (copy_disjoint, + "Tests copying unsorted rectangles.", + "fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/copy-path.c b/test/copy-path.c new file mode 100644 index 000000000..25823b6b1 --- /dev/null +++ b/test/copy-path.c @@ -0,0 +1,314 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +static void +scale_by_two (double *x, double *y) +{ + *x = *x * 2.0; + *y = *y * 2.0; +} + +typedef void (*munge_func_t) (double *x, double *y); + +static void +munge_and_set_path (cairo_t *cr, + cairo_path_t *path, + munge_func_t munge) +{ + int i; + cairo_path_data_t *p; + double x1, y1, x2, y2, x3, y3; + + if (path->status) { + cairo_append_path (cr, path); + return; + } + + for (i=0; i < path->num_data; i += path->data[i].header.length) { + p = &path->data[i]; + switch (p->header.type) { + case CAIRO_PATH_MOVE_TO: + x1 = p[1].point.x; y1 = p[1].point.y; + (munge) (&x1, &y1); + cairo_move_to (cr, x1, y1); + break; + case CAIRO_PATH_LINE_TO: + x1 = p[1].point.x; y1 = p[1].point.y; + (munge) (&x1, &y1); + cairo_line_to (cr, x1, y1); + break; + case CAIRO_PATH_CURVE_TO: + x1 = p[1].point.x; y1 = p[1].point.y; + x2 = p[2].point.x; y2 = p[2].point.y; + x3 = p[3].point.x; y3 = p[3].point.y; + (munge) (&x1, &y1); + (munge) (&x2, &y2); + (munge) (&x3, &y3); + cairo_curve_to (cr, + x1, y1, + x2, y2, + x3, y3); + break; + case CAIRO_PATH_CLOSE_PATH: + cairo_close_path (cr); + break; + } + } +} + +static void +make_path (cairo_t *cr) +{ + cairo_rectangle (cr, 0, 0, 5, 5); + cairo_move_to (cr, 15, 2.5); + cairo_arc (cr, 12.5, 2.5, 2.5, 0, 2 * M_PI); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_path_t *path; + cairo_t *cr_error; + + /* Ensure that calling cairo_copy_path on an in-error cairo_t will + * propagate the error. */ + cr_error = cairo_create (NULL); + path = cairo_copy_path (cr_error); + if (path->status != CAIRO_STATUS_NULL_POINTER) { + cairo_test_log (ctx, + "Error: cairo_copy_path returned status of %s rather than propagating %s\n", + cairo_status_to_string (path->status), + cairo_status_to_string (CAIRO_STATUS_NULL_POINTER)); + cairo_path_destroy (path); + cairo_destroy (cr_error); + return CAIRO_TEST_FAILURE; + } + cairo_path_destroy (path); + + path = cairo_copy_path_flat (cr_error); + if (path->status != CAIRO_STATUS_NULL_POINTER) { + cairo_test_log (ctx, + "Error: cairo_copy_path_flat returned status of %s rather than propagating %s\n", + cairo_status_to_string (path->status), + cairo_status_to_string (CAIRO_STATUS_NULL_POINTER)); + cairo_path_destroy (path); + cairo_destroy (cr_error); + return CAIRO_TEST_FAILURE; + } + cairo_path_destroy (path); + + cairo_destroy (cr_error); + + /* first check that we can copy an empty path */ + cairo_new_path (cr); + path = cairo_copy_path (cr); + if (path->status != CAIRO_STATUS_SUCCESS) { + cairo_status_t status = path->status; + cairo_test_log (ctx, + "Error: cairo_copy_path returned status of %s\n", + cairo_status_to_string (status)); + cairo_path_destroy (path); + return cairo_test_status_from_status (ctx, status); + } + if (path->num_data != 0) { + cairo_test_log (ctx, + "Error: cairo_copy_path did not copy an empty path, returned path contains %d elements\n", + path->num_data); + cairo_path_destroy (path); + return CAIRO_TEST_FAILURE; + } + cairo_append_path (cr, path); + cairo_path_destroy (path); + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { + cairo_test_log (ctx, + "Error: cairo_append_path failed with a copy of an empty path, returned status of %s\n", + cairo_status_to_string (cairo_status (cr))); + return cairo_test_status_from_status (ctx, cairo_status (cr)); + } + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + /* copy path, munge, and fill */ + cairo_translate (cr, 5, 5); + make_path (cr); + path = cairo_copy_path (cr); + + cairo_new_path (cr); + munge_and_set_path (cr, path, scale_by_two); + cairo_path_destroy (path); + cairo_fill (cr); + + /* copy flattened path, munge, and fill */ + cairo_translate (cr, 0, 15); + make_path (cr); + path = cairo_copy_path_flat (cr); + + cairo_new_path (cr); + munge_and_set_path (cr, path, scale_by_two); + cairo_path_destroy (path); + cairo_fill (cr); + + /* append two copies of path, and fill */ + cairo_translate (cr, 0, 15); + cairo_scale (cr, 2.0, 2.0); + make_path (cr); + path = cairo_copy_path (cr); + + cairo_new_path (cr); + cairo_append_path (cr, path); + cairo_translate (cr, 2.5, 2.5); + cairo_append_path (cr, path); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); + + cairo_path_destroy (path); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_path_data_t data; + cairo_path_t path; + cairo_surface_t *surface; + cairo_status_t status; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + status = cairo_surface_status (surface); + if (status) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + /* Test a few error cases for cairo_append_path_data */ +#define CAIRO_CREATE() do {\ + cr = cairo_create (surface); \ + status = cairo_status (cr); \ + if (status) { \ + cairo_destroy (cr); \ + cairo_surface_destroy (surface); \ + return cairo_test_status_from_status (ctx, status); \ + } \ +} while (0) + CAIRO_CREATE (); + cairo_append_path (cr, NULL); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_NULL_POINTER) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + CAIRO_CREATE (); + path.status = -1; + cairo_append_path (cr, &path); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_INVALID_STATUS) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + CAIRO_CREATE (); + path.status = CAIRO_STATUS_NO_MEMORY; + cairo_append_path (cr, &path); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_NO_MEMORY) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + CAIRO_CREATE (); + path.data = NULL; + path.num_data = 0; + path.status = CAIRO_STATUS_SUCCESS; + cairo_append_path (cr, &path); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_SUCCESS) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + CAIRO_CREATE (); + path.data = NULL; + path.num_data = 1; + path.status = CAIRO_STATUS_SUCCESS; + cairo_append_path (cr, &path); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_NULL_POINTER) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + CAIRO_CREATE (); + /* Intentionally insert bogus header.length value (otherwise would be 2) */ + data.header.type = CAIRO_PATH_MOVE_TO; + data.header.length = 1; + path.data = &data; + path.num_data = 1; + cairo_append_path (cr, &path); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_INVALID_PATH_DATA) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + /* And test the degnerate case */ + CAIRO_CREATE (); + path.num_data = 0; + cairo_append_path (cr, &path); + status = cairo_status (cr); + cairo_destroy (cr); + if (status != CAIRO_STATUS_SUCCESS) { + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); + } + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (copy_path, + "Tests calls to path_data functions: cairo_copy_path, cairo_copy_path_flat, and cairo_append_path", + "path", /* keywords */ + NULL, /* requirements */ + 45, 53, + preamble, draw) diff --git a/test/coverage.c b/test/coverage.c new file mode 100644 index 000000000..12225c325 --- /dev/null +++ b/test/coverage.c @@ -0,0 +1,506 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Test the fidelity of the rasterisation, because Cairo is my favourite + * driver test suite. + */ + +#define GENERATE_REFERENCE 0 + +#define WIDTH 256 +#define HEIGHT 40 + +#include "../src/cairo-fixed-type-private.h" +#define PRECISION (1 << CAIRO_FIXED_FRAC_BITS) + +/* XXX beware multithreading! */ +static uint32_t state; + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + return state = (state ^ rol (state, 5) ^ rol (state, 24)) + 0x37798849; +#undef rol +} + +static double +random_offset (int range, int precise) +{ + double x = hars_petruska_f54_1_random() / (double) UINT32_MAX * range / WIDTH; + if (precise) + x = floor (x * PRECISION) / PRECISION; + return x; +} + +static cairo_test_status_t +rectangles (cairo_t *cr, int width, int height) +{ + int x, y, channel; + + state = 0x12345678; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 1.0 / (WIDTH * WIDTH)); + cairo_rectangle (cr, x, 0, 1, HEIGHT); + cairo_fill (cr); + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (x = 0; x < WIDTH; x++) { + for (y = 0; y < HEIGHT; y++) { + double dx = random_offset (WIDTH - x, TRUE); + double dy = random_offset (WIDTH - x, TRUE); + cairo_rectangle (cr, x + dx, y + dy, x / (double) WIDTH, x / (double) WIDTH); + } + } + cairo_fill (cr); + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +rhombus (cairo_t *cr, int width, int height) +{ + int x, y; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (y = 0; y < WIDTH; y++) { + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, + x * y / (2. * WIDTH * WIDTH)); + cairo_rectangle (cr, 2*x, 2*y, 2, 2); + cairo_fill (cr); + } + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 1, 1, 1); + + for (y = 0; y < WIDTH; y++) { + double yf = y / (double) WIDTH; + for (x = 0; x < WIDTH; x++) { + double xf = x / (double) WIDTH; + + cairo_move_to (cr, + 2*x + 1 - xf, + 2*y + 1); + cairo_line_to (cr, + 2*x + 1, + 2*y + 1 - yf); + cairo_line_to (cr, + 2*x + 1 + xf, + 2*y + 1); + cairo_line_to (cr, + 2*x + 1, + 2*y + 1 + yf); + cairo_close_path (cr); + } + } + + cairo_fill (cr); +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +intersecting_quads (cairo_t *cr, int width, int height) +{ + int x, y, channel; + + state = 0x12345678; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH)); + cairo_rectangle (cr, x, 0, 1, HEIGHT); + cairo_fill (cr); + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (x = 0; x < WIDTH; x++) { + double step = x / (double) WIDTH; + for (y = 0; y < HEIGHT; y++) { + double dx = random_offset (WIDTH - x, TRUE); + double dy = random_offset (WIDTH - x, TRUE); + cairo_move_to (cr, x + dx, y + dy); + cairo_rel_line_to (cr, step, step); + cairo_rel_line_to (cr, 0, -step); + cairo_rel_line_to (cr, -step, step); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +intersecting_triangles (cairo_t *cr, int width, int height) +{ + int x, y, channel; + + state = 0x12345678; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * 0.75 / WIDTH); + cairo_rectangle (cr, x, 0, 1, HEIGHT); + cairo_fill (cr); + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (x = 0; x < WIDTH; x++) { + double step = x / (double) WIDTH; + for (y = 0; y < HEIGHT; y++) { + double dx = random_offset (WIDTH - x, TRUE); + double dy = random_offset (WIDTH - x, TRUE); + + /* left */ + cairo_move_to (cr, x + dx, y + dy); + cairo_rel_line_to (cr, 0, step); + cairo_rel_line_to (cr, step, 0); + cairo_close_path (cr); + + /* right, mirrored */ + cairo_move_to (cr, x + dx + step, y + dy + step); + cairo_rel_line_to (cr, 0, -step); + cairo_rel_line_to (cr, -step, step); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +triangles (cairo_t *cr, int width, int height) +{ + int x, y, channel; + + state = 0x12345678; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH)); + cairo_rectangle (cr, x, 0, 1, HEIGHT); + cairo_fill (cr); + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (x = 0; x < WIDTH; x++) { + for (y = 0; y < HEIGHT; y++) { + double dx = random_offset (WIDTH - x, TRUE); + double dy = random_offset (WIDTH - x, TRUE); + cairo_move_to (cr, x + dx, y + dy); + cairo_rel_line_to (cr, x / (double) WIDTH, 0); + cairo_rel_line_to (cr, 0, x / (double) WIDTH); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +abutting (cairo_t *cr, int width, int height) +{ + int x, y; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.75); + +#if GENERATE_REFERENCE + cairo_paint (cr); +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + + for (y = 0; y < 16; y++) { + for (x = 0; x < 16; x++) { + double theta = (y * 16 + x) * M_PI / 512; + double cx = 16 * cos (theta) + x * 16; + double cy = 16 * sin (theta) + y * 16; + + cairo_move_to (cr, x * 16, y * 16); + cairo_line_to (cr, cx, cy); + cairo_line_to (cr, (x + 1) * 16, y * 16); + cairo_fill (cr); + + cairo_move_to (cr, (x + 1) * 16, y * 16); + cairo_line_to (cr, cx, cy); + cairo_line_to (cr, (x + 1) * 16, (y + 1) * 16); + cairo_fill (cr); + + cairo_move_to (cr, (x + 1) * 16, (y + 1) * 16); + cairo_line_to (cr, cx, cy); + cairo_line_to (cr, x * 16, (y + 1) * 16); + cairo_fill (cr); + + cairo_move_to (cr, x * 16, (y + 1) * 16); + cairo_line_to (cr, cx, cy); + cairo_line_to (cr, x * 16, y * 16); + cairo_fill (cr); + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +column_triangles (cairo_t *cr, int width, int height) +{ + int x, y, i, channel; + + state = 0x12345678; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH); + cairo_rectangle (cr, x, 0, 1, HEIGHT); + cairo_fill (cr); + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (x = 0; x < WIDTH; x++) { + double step = x / (double) (2 * WIDTH); + for (y = 0; y < HEIGHT; y++) { + for (i = 0; i < PRECISION; i++) { + double dy = random_offset (WIDTH - x, FALSE); + + /* + * We want to test some sharing of edges to further + * stress the rasterisers, so instead of using one + * tall triangle, it is split into two, with vertical + * edges on either side that may co-align with their + * neighbours: + * + * s --- . --- + * t | |\ | + * e | | \ | + * p --- .... | 2 * step = x / WIDTH + * \ | | + * \| | + * . --- + * |---| + * 1 / PRECISION + * + * Each column contains two triangles of width one quantum and + * total height of (x / WIDTH), thus the total area covered by all + * columns in each pixel is .5 * (x / WIDTH). + */ + + cairo_move_to (cr, x + i / (double) PRECISION, y + dy); + cairo_rel_line_to (cr, 0, step); + cairo_rel_line_to (cr, 1 / (double) PRECISION, step); + cairo_rel_line_to (cr, 0, -step); + cairo_close_path (cr); + } + cairo_fill (cr); /* do these per-pixel due to the extra volume of edges */ + } + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +row_triangles (cairo_t *cr, int width, int height) +{ + int x, y, i, channel; + + state = 0x12345678; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + +#if GENERATE_REFERENCE + for (x = 0; x < WIDTH; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH); + cairo_rectangle (cr, x, 0, 1, HEIGHT); + cairo_fill (cr); + } +#else + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (x = 0; x < WIDTH; x++) { + double step = x / (double) (2 * WIDTH); + for (y = 0; y < HEIGHT; y++) { + for (i = 0; i < PRECISION; i++) { + double dx = random_offset (WIDTH - x, FALSE); + + /* See column_triangles() for a transposed description + * of this geometry. + */ + + cairo_move_to (cr, x + dx, y + i / (double) PRECISION); + cairo_rel_line_to (cr, step, 0); + cairo_rel_line_to (cr, step, 1 / (double) PRECISION); + cairo_rel_line_to (cr, -step, 0); + cairo_close_path (cr); + } + cairo_fill (cr); /* do these per-pixel due to the extra volume of edges */ + } + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (coverage_rectangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, rectangles) + +CAIRO_TEST (coverage_rhombus, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + 2*WIDTH, 2*WIDTH, + NULL, rhombus) + +CAIRO_TEST (coverage_intersecting_quads, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, intersecting_quads) + +CAIRO_TEST (coverage_intersecting_triangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, intersecting_triangles) +CAIRO_TEST (coverage_row_triangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, row_triangles) +CAIRO_TEST (coverage_column_triangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, column_triangles) +CAIRO_TEST (coverage_triangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, triangles) +CAIRO_TEST (coverage_abutting, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + 16*16, 16*16, + NULL, abutting) diff --git a/test/create-for-stream.c b/test/create-for-stream.c new file mode 100644 index 000000000..af1632f14 --- /dev/null +++ b/test/create-for-stream.c @@ -0,0 +1,311 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" + +#include +#include +#include + +#if CAIRO_HAS_PS_SURFACE +#include +#endif + +#if CAIRO_HAS_PDF_SURFACE +#include +#endif + +#if CAIRO_HAS_SVG_SURFACE +#include +#endif + +#include "cairo-test.h" + +/* The main test suite doesn't test the *_create_for_stream + * constructors for the PDF, PS and SVG surface, so we do that here. + * We draw to an in-memory buffer using the stream constructor and + * compare the output to the contents of a file written using the + * file constructor. + */ + +#define MAX_OUTPUT_SIZE 4096 + +#define WIDTH_IN_INCHES 3 +#define HEIGHT_IN_INCHES 3 +#define WIDTH_IN_POINTS (WIDTH_IN_INCHES * 72.0) +#define HEIGHT_IN_POINTS (HEIGHT_IN_INCHES * 72.0) + +#define BASENAME "create-for-stream.out" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Just draw a rectangle. */ + + cairo_rectangle (cr, width / 10., height /10., + width - 2 * width / 10., + height - 2 * height /10.); + cairo_fill (cr); + + cairo_show_page (cr); + + return CAIRO_TEST_SUCCESS; +} + +static void +draw_to (cairo_surface_t *surface) +{ + cairo_t *cr; + + cr = cairo_create (surface); + + draw (cr, WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + + cairo_destroy (cr); +} + +typedef struct _write_closure { + const cairo_test_context_t *ctx; + char buffer[MAX_OUTPUT_SIZE]; + size_t index; + cairo_test_status_t status; +} write_closure_t; + +static cairo_status_t +bad_write (void *closure, + const unsigned char *data, + unsigned int length) +{ + return CAIRO_STATUS_WRITE_ERROR; +} + +static cairo_status_t +test_write (void *closure, + const unsigned char *data, + unsigned int length) +{ + write_closure_t *wc = closure; + + if (wc->index + length >= sizeof wc->buffer) { + cairo_test_log (wc->ctx, "Error: out of bounds in write callback\n"); + wc->status = CAIRO_TEST_FAILURE; + return CAIRO_STATUS_SUCCESS; + } + + memcpy (&wc->buffer[wc->index], data, length); + wc->index += length; + + return CAIRO_STATUS_SUCCESS; +} + + +typedef cairo_surface_t * +(*file_constructor_t) (const char *filename, + double width_in_points, + double height_in_points); + +typedef cairo_surface_t * +(*stream_constructor_t) (cairo_write_func_t write_func, + void *closure, + double width_in_points, + double height_in_points); + +static cairo_test_status_t +test_surface (const cairo_test_context_t *ctx, + const char *backend, + const char *filename, + file_constructor_t file_constructor, + stream_constructor_t stream_constructor) +{ + cairo_surface_t *surface; + write_closure_t wc; + char file_contents[MAX_OUTPUT_SIZE]; + cairo_status_t status; + FILE *fp; + + /* test propagation of user errors */ + surface = stream_constructor (bad_write, &wc, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + + status = cairo_surface_status (surface); + if (status) { + cairo_test_log (ctx, + "%s: Failed to create surface for stream.\n", + backend); + return CAIRO_TEST_FAILURE; + } + + draw_to (surface); + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + cairo_surface_destroy (surface); + + if (status != CAIRO_STATUS_WRITE_ERROR) { + cairo_test_log (ctx, + "%s: Error: expected \"write error\", but received \"%s\".\n", + backend, cairo_status_to_string (status)); + return CAIRO_TEST_FAILURE; + } + + /* construct the real surface */ + wc.ctx = ctx; + wc.status = CAIRO_TEST_SUCCESS; + wc.index = 0; + + surface = stream_constructor (test_write, &wc, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + + status = cairo_surface_status (surface); + if (status) { + cairo_test_log (ctx, + "%s: Failed to create surface for stream.\n", backend); + return CAIRO_TEST_FAILURE; + } + + draw_to (surface); + + cairo_surface_destroy (surface); + + if (wc.status != CAIRO_TEST_SUCCESS) { + /* Error already reported. */ + return wc.status; + } + + surface = file_constructor (filename, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + + status = cairo_surface_status (surface); + if (status) { + cairo_test_log (ctx, "%s: Failed to create surface for file %s: %s.\n", + backend, filename, cairo_status_to_string (status)); + return CAIRO_TEST_FAILURE; + } + + draw_to (surface); + + cairo_surface_destroy (surface); + + fp = fopen (filename, "r"); + if (fp == NULL) { + cairo_test_log (ctx, "%s: Failed to open %s for reading: %s.\n", + backend, filename, strerror (errno)); + return CAIRO_TEST_FAILURE; + } + + if (fread (file_contents, 1, wc.index, fp) != wc.index) { + cairo_test_log (ctx, "%s: Failed to read %s: %s.\n", + backend, filename, strerror (errno)); + fclose (fp); + return CAIRO_TEST_FAILURE; + } + + if (memcmp (file_contents, wc.buffer, wc.index) != 0) { + cairo_test_log (ctx, "%s: Stream based output differ from file output for %s.\n", + backend, filename); + fclose (fp); + return CAIRO_TEST_FAILURE; + } + + fclose (fp); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_test_status_t status = CAIRO_TEST_UNTESTED; + cairo_test_status_t test_status; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + +#if CAIRO_HAS_PS_SURFACE + if (cairo_test_is_target_enabled (ctx, "ps2") || + cairo_test_is_target_enabled (ctx, "ps3")) + { + if (status == CAIRO_TEST_UNTESTED) + status = CAIRO_TEST_SUCCESS; + + xasprintf (&filename, "%s/%s", path, BASENAME ".ps"); + test_status = test_surface (ctx, "ps", filename, + cairo_ps_surface_create, + cairo_ps_surface_create_for_stream); + cairo_test_log (ctx, "TEST: %s TARGET: %s RESULT: %s\n", + ctx->test->name, "ps", + test_status ? "FAIL" : "PASS"); + if (status == CAIRO_TEST_SUCCESS) + status = test_status; + free (filename); + } +#endif + +#if CAIRO_HAS_PDF_SURFACE + if (cairo_test_is_target_enabled (ctx, "pdf")) { + if (status == CAIRO_TEST_UNTESTED) + status = CAIRO_TEST_SUCCESS; + + xasprintf (&filename, "%s/%s", path, BASENAME ".pdf"); + test_status = test_surface (ctx, "pdf", filename, + cairo_pdf_surface_create, + cairo_pdf_surface_create_for_stream); + cairo_test_log (ctx, "TEST: %s TARGET: %s RESULT: %s\n", + ctx->test->name, "pdf", + test_status ? "FAIL" : "PASS"); + if (status == CAIRO_TEST_SUCCESS) + status = test_status; + free (filename); + } +#endif + +#if CAIRO_HAS_SVG_SURFACE + if (cairo_test_is_target_enabled (ctx, "svg11") || + cairo_test_is_target_enabled (ctx, "svg12")) + { + if (status == CAIRO_TEST_UNTESTED) + status = CAIRO_TEST_SUCCESS; + + xasprintf (&filename, "%s/%s", path, BASENAME ".svg"); + test_status = test_surface (ctx, "svg", filename, + cairo_svg_surface_create, + cairo_svg_surface_create_for_stream); + cairo_test_log (ctx, "TEST: %s TARGET: %s RESULT: %s\n", + ctx->test->name, "svg", + test_status ? "FAIL" : "PASS"); + if (status == CAIRO_TEST_SUCCESS) + status = test_status; + free (filename); + } +#endif + + return status; +} + +CAIRO_TEST (create_for_stream, + "Checks creating vector surfaces with user defined I/O\n", + "stream", /* keywords */ + "target=vector", /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/create-from-png-stream.c b/test/create-from-png-stream.c new file mode 100644 index 000000000..2e9eeeeac --- /dev/null +++ b/test/create-from-png-stream.c @@ -0,0 +1,119 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +#include "cairo-test.h" + +#include +#include +#include + +#define WIDTH 2 +#define HEIGHT 2 + +static cairo_status_t +read_png_from_file (void *closure, unsigned char *data, unsigned int length) +{ + FILE *file = closure; + size_t bytes_read; + + bytes_read = fread (data, 1, length, file); + if (bytes_read != length) + return CAIRO_STATUS_READ_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + char *filename; + FILE *file; + cairo_surface_t *surface; + cairo_status_t status; + + xasprintf (&filename, "%s/reference/%s", ctx->srcdir, + "create-from-png-stream.ref.png"); + + file = fopen (filename, "rb"); + if (file == NULL) { + cairo_test_status_t ret; + + ret = CAIRO_TEST_FAILURE; + if (errno == ENOMEM) + ret = cairo_test_status_from_status (ctx, CAIRO_STATUS_NO_MEMORY); + + if (ret != CAIRO_TEST_NO_MEMORY) + cairo_test_log (ctx, "Error: failed to open file: %s\n", filename); + + free (filename); + return ret; + } + + surface = cairo_image_surface_create_from_png_stream (read_png_from_file, + file); + + fclose (file); + + status = cairo_surface_status (surface); + if (status) { + cairo_test_status_t ret; + + cairo_surface_destroy (surface); + + ret = cairo_test_status_from_status (ctx, status); + if (ret != CAIRO_TEST_NO_MEMORY) { + cairo_test_log (ctx, + "Error: failed to create surface from PNG: %s - %s\n", + filename, + cairo_status_to_string (status)); + } + + free (filename); + + return ret; + } + + free (filename); + + /* Pretend we modify the surface data (which detaches the PNG mime data) */ + cairo_surface_flush (surface); + cairo_surface_mark_dirty (surface); + + cairo_set_source_surface (cr, surface, 0, 0); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (create_from_png_stream, + "Tests the creation of an image surface from a PNG using a FILE *", + "png", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/create-from-png.c b/test/create-from-png.c new file mode 100644 index 000000000..2ca1fa2c0 --- /dev/null +++ b/test/create-from-png.c @@ -0,0 +1,320 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +#include "cairo-test.h" + +#include + +#define WIDTH 2 +#define HEIGHT 2 + +static cairo_status_t +no_memory_error (void *closure, unsigned char *data, unsigned int size) +{ + return CAIRO_STATUS_NO_MEMORY; +} + +static cairo_status_t +read_error (void *closure, unsigned char *data, unsigned int size) +{ + return CAIRO_STATUS_READ_ERROR; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + char *filename; + cairo_surface_t *surface; + + xasprintf (&filename, "%s/reference/%s", + ctx->srcdir, "create-from-png.ref.png"); + + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + cairo_test_status_t result; + + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + + free (filename); + return result; + } + + /* Pretend we modify the surface data (which detaches the PNG mime data) */ + cairo_surface_flush (surface); + cairo_surface_mark_dirty (surface); + + cairo_set_source_surface (cr, surface, 0, 0); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + + cairo_surface_destroy (surface); + + free (filename); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + char *filename; + char *path; + cairo_surface_t *surface; + cairo_status_t status; + cairo_test_status_t result = CAIRO_TEST_SUCCESS; + + surface = cairo_image_surface_create_from_png ("___THIS_FILE_DOES_NOT_EXIST___"); + if (cairo_surface_status (surface) != CAIRO_STATUS_FILE_NOT_FOUND) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error: expected \"file not found\", but got: %s\n", + cairo_status_to_string (cairo_surface_status (surface))); + } + } + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + surface = cairo_image_surface_create_from_png_stream (no_memory_error, NULL); + if (cairo_surface_status (surface) != CAIRO_STATUS_NO_MEMORY) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error: expected \"out of memory\", but got: %s\n", + cairo_status_to_string (cairo_surface_status (surface))); + } + } + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + surface = cairo_image_surface_create_from_png_stream (read_error, NULL); + if (cairo_surface_status (surface) != CAIRO_STATUS_READ_ERROR) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error: expected \"read error\", but got: %s\n", + cairo_status_to_string (cairo_surface_status (surface))); + } + } + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + /* cheekily test error propagation from the user write funcs as well ... */ + xasprintf (&path, "%s/reference", ctx->srcdir); + xasprintf (&filename, "%s/%s", path, "create-from-png.ref.png"); + + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else { + status = cairo_surface_write_to_png_stream (surface, + (cairo_write_func_t) no_memory_error, + NULL); + if (status != CAIRO_STATUS_NO_MEMORY) { + result = cairo_test_status_from_status (ctx, status); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error: expected \"out of memory\", but got: %s\n", + cairo_status_to_string (status)); + } + } + + status = cairo_surface_write_to_png_stream (surface, + (cairo_write_func_t) read_error, + NULL); + if (status != CAIRO_STATUS_READ_ERROR) { + result = cairo_test_status_from_status (ctx, status); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error: expected \"read error\", but got: %s\n", + cairo_status_to_string (status)); + } + } + + /* and check that error has not propagated to the surface */ + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error: user write error propagated to surface: %s", + cairo_status_to_string (cairo_surface_status (surface))); + } + } + } + cairo_surface_destroy (surface); + free (filename); + if (result != CAIRO_TEST_SUCCESS) + return result; + + /* check that loading alpha/opaque PNGs generate the correct surfaces */ + /* TODO: Avoid using target-specific references as sample images */ + xasprintf (&filename, "%s/%s", path, "create-from-png.alpha.ref.png"); + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_ARGB32) { + cairo_test_log (ctx, "Error reading PNG image %s: did not create an ARGB32 image\n", + filename); + result = CAIRO_TEST_FAILURE; + } + free (filename); + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + xasprintf (&filename, "%s/%s", path, "create-from-png.ref.png"); + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_RGB24) { + cairo_test_log (ctx, "Error reading PNG image %s: did not create an RGB24 image\n", + filename); + result = CAIRO_TEST_FAILURE; + } + free (filename); + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + /* check paletted PNGs */ + /* TODO: Avoid using target-specific references as sample images */ + xasprintf (&filename, "%s/%s", path, "create-from-png.indexed-alpha.ref.png"); + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_ARGB32) { + cairo_test_log (ctx, "Error reading PNG image %s: did not create an ARGB32 image\n", + filename); + result = CAIRO_TEST_FAILURE; + } + free (filename); + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + /* TODO: Avoid using target-specific references as sample images */ + xasprintf (&filename, "%s/%s", path, "create-from-png.indexed.ref.png"); + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_RGB24) { + cairo_test_log (ctx, "Error reading PNG image %s: did not create an RGB24 image\n", + filename); + result = CAIRO_TEST_FAILURE; + } + free (filename); + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + /* check grayscale PNGs */ + /* TODO: Avoid using target-specific references as sample images */ + xasprintf (&filename, "%s/%s", path, "create-from-png.gray-alpha.ref.png"); + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_ARGB32) { + cairo_test_log (ctx, "Error reading PNG image %s: did not create an ARGB32 image\n", + filename); + result = CAIRO_TEST_FAILURE; + } + free (filename); + cairo_surface_destroy (surface); + if (result != CAIRO_TEST_SUCCESS) + return result; + + /* TODO: Avoid using target-specific references as sample images */ + xasprintf (&filename, "%s/%s", path, "create-from-png.gray.ref.png"); + surface = cairo_image_surface_create_from_png (filename); + if (cairo_surface_status (surface)) { + result = cairo_test_status_from_status (ctx, + cairo_surface_status (surface)); + if (result == CAIRO_TEST_FAILURE) { + cairo_test_log (ctx, "Error reading PNG image %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + } + } else if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_RGB24) { + cairo_test_log (ctx, "Error reading PNG image %s: did not create an RGB24 image\n", + filename); + result = CAIRO_TEST_FAILURE; + } + free (filename); + cairo_surface_destroy (surface); + + free (path); + + return result; +} + +CAIRO_TEST (create_from_png, + "Tests the creation of an image surface from a PNG file", + "png", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + preamble, draw) diff --git a/test/culled-glyphs.c b/test/culled-glyphs.c new file mode 100644 index 000000000..28bee7e8c --- /dev/null +++ b/test/culled-glyphs.c @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const char *text = +"This needs to be a very long string, wider than the surface, and yet wider." +"Ideally it should overflow the stack buffers, but do you really want to read " +"a message that long. No. So we compromise with around 300 glyphs that is " +"long enough to trigger the conditions as stated in " +"http://lists.cairographics.org/archives/cairo/2008-December/015976.html. " +"Happy now?"; + cairo_text_extents_t extents; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_font_size (cr, 16); + cairo_text_extents (cr, text, &extents); + cairo_move_to (cr, -extents.width/2, 18); + cairo_show_text (cr, text); + + /* XXX we should exercise cairo_show_text_glyphs() as well, + * and CAIRO_TEXT_CLUSTER_BACKWARDS + */ + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (culled_glyphs, + "Tests culling of glyphs and text clusters", + "glyphs", /* keywords */ + NULL, /* requirements */ + 20, 20, + NULL, draw) + diff --git a/test/curve-to-as-line-to.c b/test/curve-to-as-line-to.c new file mode 100644 index 000000000..07eb005f5 --- /dev/null +++ b/test/curve-to-as-line-to.c @@ -0,0 +1,95 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 30 + +/* At one point, an optimization was proposed for cairo in which a + * curve_to would be optimized as a line_to. The initial (buggy) + * implementation verified that the slopes of several segments of the + * spline's control polygon were identical, but left open the + * possibility of an anti-parallel slope for one segment. + * + * For example, given a spline with collinear control points (A,B,C,D) + * positioned as follows: + * + * C--A--B--D + * + * The code verified identical slopes for AB, CD, and AD. The missing + * check for the BC segment allowed it to be anti-parallel to the + * others as above, and hence invalid to replace this spline with the + * AD line segment. + */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_line_width (cr, 1.0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + cairo_translate (cr, 0, 1.0); + + /* The CABD spline as described above. We ensure that the spline + * folds over on itself outside the bounds of the image to avoid + * the reference image having the curved portion of that fold, + * (which would just be harder to match in all the backends than + * we really want). */ + cairo_move_to (cr, + 10.5, 0.5); + cairo_curve_to (cr, + 11.5, 0.5, + -25.0, 0.5, + 31.0, 0.5); + + cairo_stroke (cr); + + cairo_translate (cr, 0, 2.0); + + /* A reflected version: DBAC */ + cairo_move_to (cr, + 19.5, 0.5); + + cairo_curve_to (cr, + 18.5, 0.5, + 55.0, 0.5, + -1.0, 0.5); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (curve_to_as_line_to, + "Test optimization treating curve_to as line_to", + "path", /* keywords */ + NULL, /* requirements */ + 30, + 5, + NULL, draw) diff --git a/test/dash-caps-joins.c b/test/dash-caps-joins.c new file mode 100644 index 000000000..ace27e9b9 --- /dev/null +++ b/test/dash-caps-joins.c @@ -0,0 +1,104 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Test case for bug #4409: + * + * Dashes are missing initial caps + * https://bugs.freedesktop.org/show_bug.cgi?id=4409 + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0., 0.); + cairo_rel_line_to (cr, 0., SIZE); + cairo_rel_line_to (cr, SIZE, 0.); + cairo_close_path (cr); + + cairo_move_to (cr, 2 * LINE_WIDTH, 0.); + cairo_rel_line_to (cr, 3 * LINE_WIDTH, 0.); + cairo_rel_line_to (cr, 0., 3 * LINE_WIDTH); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dash[] = {LINE_WIDTH, 1.5 * LINE_WIDTH}; + double dash_offset = -2 * LINE_WIDTH; + int i; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + for (i=0; i<2; i++) { + cairo_save (cr); + cairo_set_line_width (cr, LINE_WIDTH); + cairo_set_dash (cr, dash, ARRAY_LENGTH (dash), dash_offset); + + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + cairo_restore (cr); + cairo_translate (cr, 0., SIZE + PAD); + dash_offset = 0; + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_caps_joins, + "Test caps and joins when dashing", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + PAD + SIZE + PAD + SIZE + PAD, + NULL, draw) diff --git a/test/dash-curve.c b/test/dash-curve.c new file mode 100644 index 000000000..c31998012 --- /dev/null +++ b/test/dash-curve.c @@ -0,0 +1,66 @@ +/* + * Copyright © 2007 Jeff Smith + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Jeff Smith not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Jeff Smith makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF SMITH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL JEFF SMITH BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jeff Smith + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dashes[2] = {20, 20}; + int a=0, b=0, c=0; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + for (a=0; a<4; a++) + for (b=0; b<5; b++) + for (c=0; c<5; c++) { + cairo_move_to (cr, ((b*5)+c)*60+10, a*60+10); + cairo_rel_curve_to (cr, + 0, b*10, + 0, b*10, + c*10, b*10); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_set_line_width (cr, 8); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_dash (cr, dashes, 2, a*10); + cairo_stroke_preserve (cr); + + cairo_set_source_rgb (cr, 0, 0.5, 1); + cairo_set_line_width (cr, 2); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_dash (cr, 0, 0, 0); + cairo_stroke (cr); + } + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_curve, + "Tries to explore the state space of the dashing code along curves", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + 25*60, 4*60, + NULL, draw) diff --git a/test/dash-infinite-loop.c b/test/dash-infinite-loop.c new file mode 100644 index 000000000..a3d75442c --- /dev/null +++ b/test/dash-infinite-loop.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2009 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ + +#include "cairo-test.h" + +/* When faced with very small dash lengths the stroker is liable to + * get stuck in an infinite loop when advancing the dash offset. This + * test attempts to hit each of the locations in the stroker code + * where the dash offset is advanced in a loop. + * + * Reported to the cairo mailing list by Hans Breuer. + * http://lists.cairographics.org/archives/cairo/2009-June/017506.html + */ + +#define EPS 1e-30 +/* This should be comfortably smaller than the unit epsilon of the + * floating point type used to advance the dashing, yet not small + * enough that it underflows to zero. 1e-30 works to foil up to 80 + * bit extended precision arithmetic. We want to avoid zero dash + * lengths because those trigger special processing in the stroker. */ + +static void +do_dash (cairo_t *cr, double dx, double dy, double offset) +{ + /* Set the dash pattern to be predominantly ON so that we can + * create a reference image by just ignoring the dashing. */ + static double dash[] = { EPS, EPS/512 }; + cairo_set_dash (cr, dash, 2, offset); + cairo_move_to (cr, 10, 10); + cairo_rel_line_to (cr, dx, dy); + cairo_stroke (cr); + cairo_translate (cr, dx, dy); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + (void)width; (void)height; + + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0,0,0); + + cairo_set_line_width (cr, 10); + + /* The following calls will wedge in various places that try + * to advance the dashing in a loop inside the stroker. */ + do_dash (cr, 30, 30, 0); /* _cairo_stroker_line_to_dashed */ + do_dash (cr, 30, 0, 0); /* _cairo_rectilinear_stroker_line_to_dashed */ + do_dash (cr, 30, 30, 1); /* _cairo_stroker_dash_start */ + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_infinite_loop, + "Test dashing with extremely small dash lengths.", + "dash", + NULL, + 100, 100, + NULL, draw); diff --git a/test/dash-no-dash.c b/test/dash-no-dash.c new file mode 100644 index 000000000..e03094ad4 --- /dev/null +++ b/test/dash-no-dash.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +#define PAD 1 +#define LINE_WIDTH 2 +#define HEIGHT (PAD + 4 * (LINE_WIDTH + PAD)) +#define WIDTH 16 + +static void +line (cairo_t *cr) +{ + cairo_move_to (cr, PAD, 0.0); + cairo_line_to (cr, WIDTH - PAD, 0.0); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dash = 2.0; + + /* We draw in black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_translate (cr, 0.0, PAD + LINE_WIDTH / 2); + + /* First draw a solid line... */ + line (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0.0, LINE_WIDTH + PAD); + + /* then a dashed line... */ + cairo_set_dash (cr, &dash, 1, 0.0); + line (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0.0, LINE_WIDTH + PAD); + + /* back to solid... */ + cairo_set_dash (cr, NULL, 0, 0.0); + line (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0.0, LINE_WIDTH + PAD); + + /* and finally, back to dashed. */ + cairo_set_dash (cr, &dash, 1, 0.0); + line (cr); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_no_dash, + "Tests that we can actually turn dashing on and off again", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/dash-offset-negative.c b/test/dash-offset-negative.c new file mode 100644 index 000000000..8766cc576 --- /dev/null +++ b/test/dash-offset-negative.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Owen Taylor + */ + +#include "cairo-test.h" + +#define IMAGE_WIDTH 19 +#define IMAGE_HEIGHT 19 + +/* Basic test of dashed strokes, including a test for the negative + * dash offset bug: + * + * https://bugs.freedesktop.org/show_bug.cgi?id=2729 + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dashes[] = { 1 }; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, 2); + + /* Basic 1-1 dash pattern */ + cairo_set_dash (cr, dashes, 1, 0.); + + cairo_move_to (cr, 1, 2); + cairo_line_to (cr, 18, 2); + cairo_stroke (cr); + + /* Adjust path by 0.5. Ideally this would give a constant 50% + * gray, (but does not due to the location of the regular sample + * grid points. */ + cairo_move_to (cr, 1.5, 5); + cairo_line_to (cr, 18., 5); + cairo_stroke (cr); + + /* Offset dash by 0.5, rather than the path */ + cairo_set_dash (cr, dashes, 1, 0.5); + + cairo_move_to (cr, 1, 8); + cairo_line_to (cr, 18, 8); + cairo_stroke (cr); + + /* Now, similar tests with negative dash offsets. */ + + /* Basic 1-1 dash pattern dashing */ + cairo_set_dash (cr, dashes, 1, -4); + + cairo_move_to (cr, 1, 11); + cairo_line_to (cr, 18, 11); + cairo_stroke (cr); + + /* Adjust path by 0.5 */ + cairo_move_to (cr, 1.5, 14); + cairo_line_to (cr, 18., 14); + cairo_stroke (cr); + + /* Offset dash by 0.5 */ + cairo_set_dash (cr, dashes, 1, -3.5); + + cairo_move_to (cr, 1, 17); + cairo_line_to (cr, 18, 17); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_offset_negative, + "Tests cairo_set_dash with a negative offset", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/dash-offset.c b/test/dash-offset.c new file mode 100644 index 000000000..f4269ee13 --- /dev/null +++ b/test/dash-offset.c @@ -0,0 +1,83 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2009 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +/* Lengths of the dashes of the dash patterns */ +static const double dashes[] = { 2, 2, 4, 4 }; +/* Dash offset in userspace units + * They always grow by 2, so the dash pattern is + * should be shifted by the same amount each time */ +static const double frac_offset[] = { 0, 2, 4, 6 }; +/* Dash offset relative to the whole dash pattern + * This corresponds to the non-inverted part only if + * the dash pattern has odd length, so the expected result + * is the same for every int_offset if the pattern has + * even length, and inverted each time (or shifted by half + * period, which is the same) if the pattern has odd length. */ +static const double int_offset[] = { -2, -1, 0, 1, 2 }; + +#define PAD 6 +#define STROKE_LENGTH 32 +#define IMAGE_WIDTH (PAD + (STROKE_LENGTH + PAD) * ARRAY_LENGTH (dashes)) +#define IMAGE_HEIGHT (PAD + PAD * ARRAY_LENGTH (int_offset) + PAD * ARRAY_LENGTH (frac_offset) * ARRAY_LENGTH (int_offset)) + + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double total; + size_t i, j, k; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 2); + + total = 0.0; + for (k = 0; k < ARRAY_LENGTH (dashes); ++k) { + total += dashes[k]; + for (i = 0; i < ARRAY_LENGTH (frac_offset); ++i) { + for (j = 0; j < ARRAY_LENGTH (int_offset); ++j) { + cairo_set_dash (cr, dashes, k + 1, frac_offset[i] + total * int_offset[j]); + cairo_move_to (cr, (STROKE_LENGTH + PAD) * k + PAD, PAD * (i + j + ARRAY_LENGTH (frac_offset) * j + 1)); + cairo_line_to (cr, (STROKE_LENGTH + PAD) * (k + 1), PAD * (i + j + ARRAY_LENGTH (frac_offset) * j + 1)); + cairo_stroke (cr); + } + } + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_offset, + "Tests dashes of different length with various offsets", + "stroke, dash", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/dash-scale.c b/test/dash-scale.c new file mode 100644 index 000000000..fd5170255 --- /dev/null +++ b/test/dash-scale.c @@ -0,0 +1,120 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 8. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0., 0.); + cairo_rel_line_to (cr, 0., SIZE); + cairo_rel_line_to (cr, SIZE, 0.); + cairo_close_path (cr); + + cairo_move_to (cr, 2 * LINE_WIDTH, 0.); + cairo_rel_line_to (cr, 3 * LINE_WIDTH, 0.); + cairo_rel_line_to (cr, 0., 3 * LINE_WIDTH); +} + +static void +draw_three_shapes (cairo_t *cr) +{ + cairo_save (cr); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dash[] = {1.5 * LINE_WIDTH}; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, PAD, PAD); + + cairo_set_dash (cr, dash, ARRAY_LENGTH (dash), - 2 * LINE_WIDTH); + cairo_set_line_width (cr, LINE_WIDTH); + draw_three_shapes (cr); + + cairo_translate (cr, 0, SIZE + 2 * PAD); + + cairo_save (cr); + { + cairo_set_dash (cr, dash, ARRAY_LENGTH (dash), - 2 * LINE_WIDTH); + cairo_set_line_width (cr, LINE_WIDTH); + cairo_scale (cr, 1, 2); + draw_three_shapes (cr); + } + cairo_restore (cr); + + cairo_translate (cr, 0, 2 * (SIZE + PAD)); + + cairo_save (cr); + { + cairo_scale (cr, 1, 2); + cairo_set_dash (cr, dash, ARRAY_LENGTH (dash), - 2 * LINE_WIDTH); + cairo_set_line_width (cr, LINE_WIDTH); + draw_three_shapes (cr); + } + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_scale, + "Test interactions of cairo_set_dash and cairo_scale, (in particular with a non-uniformly scaled pen)", + "dash, stroke, transform", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + PAD + 5 * SIZE + 2 * (2 * PAD) + PAD, + NULL, draw) diff --git a/test/dash-state.c b/test/dash-state.c new file mode 100644 index 000000000..5276aeaa6 --- /dev/null +++ b/test/dash-state.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2007 Jeff Smith + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Jeff Smith not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Jeff Smith makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF SMITH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL JEFF SMITH BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jeff Smith + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dashes[2] = {20, 20}; + int a=0, b=0, c=0; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + for (a=0; a<4; a++) + for (b=0; b<5; b++) + for (c=0; c<5; c++) { + cairo_move_to (cr, ((b*5)+c)*60+10, a*60+10); + cairo_rel_line_to (cr, 0, b*10); + cairo_rel_line_to (cr, c*10, 0); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_set_line_width (cr, 8); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_dash (cr, dashes, 2, a*10); + cairo_stroke_preserve (cr); + + cairo_set_source_rgb (cr, 0, 0.5, 1); + cairo_set_line_width (cr, 2); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_dash (cr, 0, 0, 0); + cairo_stroke (cr); + } + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_state, + "Tries to explore the state space of the dashing code", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + 25*60, 4*60, + NULL, draw) diff --git a/test/dash-zero-length.c b/test/dash-zero-length.c new file mode 100644 index 000000000..5ab944bb7 --- /dev/null +++ b/test/dash-zero-length.c @@ -0,0 +1,110 @@ +/* + * Copyright © 2006 Jeff Muizelaar + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Jeff Muizelaar. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Jeff Muizelaar. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF MUIZELAAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL JEFF MUIZELAAR BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jeff Muizelaar + */ + +#include "cairo-test.h" + +#define IMAGE_WIDTH 19 +#define IMAGE_HEIGHT 61 + +/* A test of the two extremes of dashing: a solid line + * and an invisible one. Also test that capping works + * on invisible lines. + */ + +static void +draw_dash (cairo_t *cr, double *dash, int num_dashes) +{ + cairo_set_dash (cr, dash, num_dashes, 0.0); + cairo_move_to (cr, 1, 2); + cairo_line_to (cr, 18, 2); + cairo_stroke (cr); + cairo_translate (cr, 0, 3); +} +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + static double solid_line[] = { 4, 0 }; + static double invisible_line[] = { 0, 4 }; + static double dotted_line[] = { 0, 6 }; + static double zero_1_of_3[] = { 0, 2, 3 }; + static double zero_2_of_3[] = { 1, 0, 3 }; + static double zero_3_of_3[] = { 1, 2, 0 }; + static double zero_1_of_4[] = { 0, 2, 3, 4 }; + static double zero_2_of_4[] = { 1, 0, 3, 4 }; + static double zero_3_of_4[] = { 1, 2, 0, 4 }; + static double zero_4_of_4[] = { 1, 2, 3, 0 }; + static double zero_1_2_of_4[] = { 0, 0, 3, 4 }; + static double zero_1_3_of_4[] = { 0, 2, 0, 4 }; +/* Clearly it would be nice to draw this one as well, but it seems to trigger a bug in ghostscript. */ +#if BUG_FIXED_IN_GHOSTSCRIPT + static double zero_1_4_of_4[] = { 0, 2, 3, 0 }; +#endif + static double zero_2_3_of_4[] = { 1, 0, 0, 4 }; + static double zero_2_4_of_4[] = { 1, 0, 3, 0 }; + static double zero_3_4_of_4[] = { 1, 2, 0, 0 }; + static double zero_1_2_3_of_4[] = { 0, 0, 0, 4 }; + static double zero_1_2_4_of_4[] = { 0, 0, 3, 0 }; + static double zero_1_3_4_of_4[] = { 0, 2, 0, 0 }; + static double zero_2_3_4_of_4[] = { 1, 0, 0, 0 }; + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 2); + + draw_dash (cr, solid_line, 2); + draw_dash (cr, invisible_line, 2); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + draw_dash (cr, dotted_line, 2); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + + draw_dash (cr, zero_1_of_3, 3); + draw_dash (cr, zero_2_of_3, 3); + draw_dash (cr, zero_3_of_3, 3); + draw_dash (cr, zero_1_of_4, 4); + draw_dash (cr, zero_2_of_4, 4); + draw_dash (cr, zero_3_of_4, 4); + draw_dash (cr, zero_4_of_4, 4); + draw_dash (cr, zero_1_2_of_4, 4); + draw_dash (cr, zero_1_3_of_4, 4); +#if BUG_FIXED_IN_GHOSTSCRIPT + draw_dash (cr, zero_1_4_of_4, 4); +#endif + draw_dash (cr, zero_2_3_of_4, 4); + draw_dash (cr, zero_2_4_of_4, 4); + draw_dash (cr, zero_3_4_of_4, 4); + draw_dash (cr, zero_1_2_3_of_4, 4); + draw_dash (cr, zero_1_2_4_of_4, 4); + draw_dash (cr, zero_1_3_4_of_4, 4); + draw_dash (cr, zero_2_3_4_of_4, 4); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (dash_zero_length, + "Tests cairo_set_dash with zero length", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/degenerate-arc.c b/test/degenerate-arc.c new file mode 100644 index 000000000..ab6577421 --- /dev/null +++ b/test/degenerate-arc.c @@ -0,0 +1,74 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* This test case exercises a "Potential division by zero in cairo_arc" + * reported by Luiz Americo Pereira Camara , + * http://lists.cairographics.org/archives/cairo/2008-May/014054.html. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int n; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + + cairo_set_line_width (cr, 5); + cairo_set_source_rgb (cr, 0, 1, 0); + for (n = 0; n < 8; n++) { + double theta = n * 2 * M_PI / 8; + cairo_new_sub_path (cr); + cairo_arc (cr, 20, 20, 15, theta, theta); + cairo_close_path (cr); + } + cairo_stroke (cr); + + cairo_set_line_width (cr, 2); + cairo_set_source_rgb (cr, 0, 0, 1); + for (n = 0; n < 8; n++) { + double theta = n * 2 * M_PI / 8; + cairo_move_to (cr, 20, 20); + cairo_arc (cr, 20, 20, 15, theta, theta); + } + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_arc (cr, 20, 20, 2, 0, 2*M_PI); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_arc, + "Tests the behaviour of degenerate arcs", + "degenerate", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) diff --git a/test/degenerate-arcs.c b/test/degenerate-arcs.c new file mode 100644 index 000000000..2470828bb --- /dev/null +++ b/test/degenerate-arcs.c @@ -0,0 +1,57 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 20 +#define HEIGHT 20 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.3, 0.4, 0.5); + + /* This should be equivalent to a simple rectangle, such as may be + * constructed for a rounded-rectangle with corner radii of 0... + */ + cairo_arc (cr, 5, 5, 0, M_PI, 3*M_PI/2); + cairo_arc (cr, 15, 5, 0, 3*M_PI/2, 2*M_PI); + cairo_arc (cr, 15, 15, 0, 0, M_PI/2); + cairo_arc (cr, 5, 15, 0, M_PI/2, M_PI); + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_arcs, + "Tests path construction using a series of degenerate (radius=0) arcs", + "arc, fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/degenerate-curve-to.c b/test/degenerate-curve-to.c new file mode 100644 index 000000000..a081a3bb0 --- /dev/null +++ b/test/degenerate-curve-to.c @@ -0,0 +1,103 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 30 + +/* Another attempt at avoiding unnecessary splines was made, where + * a curve-to that ended on the same point as it began were discarded. + */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_line_width (cr, 1.0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + /* entirely degenerate */ + cairo_move_to (cr, + 2.5, 2.5); + cairo_curve_to (cr, + 2.5, 2.5, + 2.5, 2.5, + 2.5, 2.5); + cairo_stroke (cr); + + /* horizontal */ + cairo_move_to (cr, + 5.5, 2.5); + cairo_curve_to (cr, + 22.0, 2.5, + -0.5, 2.5, + 5.5, 2.5); + cairo_stroke (cr); + + /* vertical */ + cairo_move_to (cr, + 7.5, 0.0); + cairo_curve_to (cr, + 7.5, 11.0, + 7.5, 0.0, + 7.5, 0.0); + cairo_stroke (cr); + + cairo_translate (cr, 15, 0); + + /* horizontal/vertical */ + cairo_move_to (cr, + 5.5, 0.5); + cairo_curve_to (cr, + -0.5, 0.5, + 5.5, 10.5, + 5.5, 0.5); + + cairo_translate (cr, 10, 0); + + /* vertical/horizontal */ + cairo_move_to (cr, + 5.5, 0.0); + cairo_curve_to (cr, + 5.5, 11.0, + 10.5, 0.0, + 5.5, 0.0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_curve_to, + "Test optimization treating degenerate curve_to as line_to", + "path", /* keywords */ + NULL, /* requirements */ + 40, + 5, + NULL, draw) diff --git a/test/degenerate-dash.c b/test/degenerate-dash.c new file mode 100644 index 000000000..6e7bf6b37 --- /dev/null +++ b/test/degenerate-dash.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + * + * Based on an original test case by M Joonas Pihlaja. + */ + +#include "cairo-test.h" + +#define PAD 5 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double dashes[] = { 25, 25 }; + cairo_line_join_t joins[] = { + CAIRO_LINE_JOIN_ROUND, + CAIRO_LINE_JOIN_MITER, + CAIRO_LINE_JOIN_BEVEL + }; + cairo_line_cap_t caps[] = { + CAIRO_LINE_CAP_ROUND, + CAIRO_LINE_CAP_SQUARE, + CAIRO_LINE_CAP_BUTT, + }; + int i, j; + + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_set_dash (cr, dashes, 2, 0.); + cairo_set_line_width (cr, 10); + + cairo_translate (cr, 5 + PAD, 5 + PAD); + + for (i = 0; i < ARRAY_LENGTH (joins); i++) { + cairo_set_line_join (cr, joins[i]); + cairo_save (cr); + + for (j = 0; j < ARRAY_LENGTH (caps); j++) { + cairo_set_line_cap (cr, caps[j]); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 50, 0); + cairo_line_to (cr, 50,50); + cairo_stroke (cr); + + cairo_translate (cr, 75, 0); + } + cairo_restore (cr); + + cairo_translate (cr, 0, 75); + } + + return CAIRO_TEST_SUCCESS; +} + +/* + * XFAIL: needs path editing in PS to convert degenerate + * end-caps into the shapes as expected by cairo (Or maybe PS is the correct + * behaviour?) + */ +CAIRO_TEST (degenerate_dash, + "Tests the behaviour of dashed segments that end on a off-on transition", + "dash, degenerate", /* keywords */ + NULL, /* requirementts */ + 210 + 2*PAD, 210 + 2*PAD, + NULL, draw) diff --git a/test/degenerate-linear-gradient.c b/test/degenerate-linear-gradient.c new file mode 100644 index 000000000..0d174fc89 --- /dev/null +++ b/test/degenerate-linear-gradient.c @@ -0,0 +1,81 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define NUM_EXTEND 4 +#define HEIGHT 16 +#define WIDTH 16 +#define PAD 3 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + unsigned int j; + + cairo_extend_t extend[NUM_EXTEND] = { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD + }; + + cairo_test_paint_checkered (cr); + + pattern = cairo_pattern_create_linear (WIDTH/2, HEIGHT/2, WIDTH/2, HEIGHT/2); + + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 0, 0, 1); + cairo_pattern_add_color_stop_rgba (pattern, sqrt (1.0 / 2.0), 0, 1, 0, 0); + cairo_pattern_add_color_stop_rgba (pattern, 1, 0, 0, 1, 0.5); + + cairo_translate (cr, PAD, PAD); + + for (j = 0; j < NUM_EXTEND; j++) { + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + cairo_pattern_set_extend (pattern, extend[j]); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_translate (cr, WIDTH+PAD, 0); + } + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_linear_gradient, + "Tests degenerate linear gradients", + "linear, pattern, extend", /* keywords */ + NULL, /* requirements */ + (WIDTH+PAD) * NUM_EXTEND + PAD, 1*(HEIGHT + PAD) + PAD, + NULL, draw) diff --git a/test/degenerate-path.c b/test/degenerate-path.c new file mode 100644 index 000000000..aa5f8225b --- /dev/null +++ b/test/degenerate-path.c @@ -0,0 +1,120 @@ +/* + * Copyright © 2006 Jeff Muizelaar + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Jeff Muizelaar not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Jeff Muizelaar makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF MUIZELAAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL JEFF MUIZELAAR BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jeff Muizelaar + */ + +#include "cairo-test.h" + +#define PAD 3.0 +#define LINE_WIDTH 6.0 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_line_cap_t cap[] = { CAIRO_LINE_CAP_ROUND, CAIRO_LINE_CAP_SQUARE, CAIRO_LINE_CAP_BUTT }; + size_t i; + double dash[] = {2, 2}; + double dash_long[] = {6, 6}; + + cairo_set_source_rgb (cr, 1, 0, 0); + + for (i = 0; i < ARRAY_LENGTH (cap); i++) { + cairo_save (cr); + + cairo_set_line_cap (cr, cap[i]); + + /* simple degenerate paths */ + cairo_set_line_width (cr, LINE_WIDTH); + cairo_move_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_stroke (cr); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_close_path (cr); + cairo_stroke (cr); + + /* degenerate paths starting with dash on */ + cairo_set_dash (cr, dash, 2, 0.); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_stroke (cr); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_close_path (cr); + cairo_stroke (cr); + + /* degenerate paths starting with dash off */ + /* these should not draw anything */ + cairo_set_dash (cr, dash, 2, 2.); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_stroke (cr); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_close_path (cr); + cairo_stroke (cr); + + /* this should draw a single degenerate sub-path + * at the end of the path */ + cairo_set_dash (cr, dash_long, 2, 6.); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH + 6.0, LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_stroke (cr); + + /* this should draw a single degenerate sub-path + * at the end of the path. The difference between this + * and the above is that this ends with a degenerate sub-path*/ + cairo_set_dash (cr, dash_long, 2, 6.); + + cairo_translate (cr, 0, 3*PAD); + cairo_move_to (cr, LINE_WIDTH + 6.0, LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, LINE_WIDTH); + cairo_stroke (cr); + + cairo_restore (cr); + + cairo_translate (cr, PAD+LINE_WIDTH+PAD, 0); + } + return CAIRO_TEST_SUCCESS; +} + +/* + * XFAIL: undefined behaviour in PS, needs path editing to convert degenerate + * segments into circles/rectangles as expected by cairo + */ +CAIRO_TEST (degenerate_path, + "Tests the behaviour of degenerate paths with different cap types", + "degenerate", /* keywords */ + NULL, /* requirements */ + 3*(PAD+LINE_WIDTH+PAD), 8*(LINE_WIDTH+PAD) + PAD, + NULL, draw) diff --git a/test/degenerate-pen.c b/test/degenerate-pen.c new file mode 100644 index 000000000..ec8bd198a --- /dev/null +++ b/test/degenerate-pen.c @@ -0,0 +1,105 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 20 +#define PAD 5 +#define WIDTH (PAD + 3 * (PAD + SIZE) + PAD) +#define HEIGHT (PAD + SIZE + PAD) + +/* We're demonstrating here a bug originally reported by Benjamin Otte + * on the cairo mailing list here, (after he ran into this problem + * with various flash animations): + * + * [cairo] Assertion `i < pen->num_vertices' failed in 1.4.10 + * http://lists.cairographics.org/archives/cairo/2007-August/011282.html + * + * The problem shows up with an extreme transformation matrix that + * collapses the pen to a single line, (which means that + * _cairo_slope_compare cannot handle adjacent vertices in the pen + * since they have parallel slope). + * + * This test case tests degenerate pens in several directions and uses + * round caps to force the stroking code to attempt to walk around the + * pen doing slope comparisons. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + + cairo_translate (cr, PAD, PAD); + + /* First compress the pen to a vertical line. */ + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_curve_to (cr, SIZE / 2, 0, SIZE, SIZE / 2, SIZE, SIZE); + cairo_save (cr); + { + cairo_scale (cr, 0.000001, 1.0); + cairo_stroke (cr); + } + cairo_restore (cr); + + cairo_translate (cr, PAD + SIZE, 0); + + /* Then compress the pen to a horizontal line. */ + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_curve_to (cr, SIZE / 2, 0, SIZE, SIZE / 2, SIZE, SIZE); + cairo_save (cr); + { + cairo_scale (cr, 1.0, 0.000001); + cairo_stroke (cr); + } + cairo_restore (cr); + + cairo_translate (cr, PAD + SIZE, 0); + + /* Finally a line at an angle. */ + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_curve_to (cr, SIZE / 2, 0, SIZE, SIZE / 2, SIZE, SIZE); + cairo_save (cr); + { + cairo_rotate (cr, M_PI / 4.0); + cairo_scale (cr, 0.000001, 1.0); + cairo_stroke (cr); + } + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_pen, + "Test round joins with a pen that's transformed to a line", + "degenerate", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/degenerate-radial-gradient.c b/test/degenerate-radial-gradient.c new file mode 100644 index 000000000..14666450e --- /dev/null +++ b/test/degenerate-radial-gradient.c @@ -0,0 +1,93 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define NUM_EXTEND 4 +#define HEIGHT 32 +#define WIDTH 32 +#define PAD 6 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + unsigned int i, j; + + cairo_extend_t extend[NUM_EXTEND] = { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD + }; + + cairo_test_paint_checkered (cr); + + cairo_translate (cr, PAD, PAD); + + for (i = 0; i < 3; i++) { + cairo_save (cr); + + for (j = 0; j < NUM_EXTEND; j++) { + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + if (i == 0) + pattern = cairo_pattern_create_radial (WIDTH/2, HEIGHT/2, 0, WIDTH/2, HEIGHT/2, 0); + else if (i == 1) + pattern = cairo_pattern_create_radial (WIDTH/2, HEIGHT/2, 2*PAD, WIDTH/2, HEIGHT/2, 2*PAD); + else if (i == 2) + pattern = cairo_pattern_create_radial (PAD, PAD, 0, WIDTH-PAD, HEIGHT-PAD, 0); + + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 0, 0, 1); + cairo_pattern_add_color_stop_rgba (pattern, sqrt (1.0 / 2.0), 0, 1, 0, 0); + cairo_pattern_add_color_stop_rgba (pattern, 1, 0, 0, 1, 0.5); + + cairo_pattern_set_extend (pattern, extend[j]); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + + cairo_translate (cr, WIDTH+PAD, 0); + } + + cairo_restore (cr); + cairo_translate (cr, 0, HEIGHT+PAD); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_radial_gradient, + "Tests degenerate radial gradients", + "radial, pattern, extend", /* keywords */ + NULL, /* requirements */ + (WIDTH+PAD) * NUM_EXTEND + PAD, 3*(HEIGHT + PAD) + PAD, + NULL, draw) diff --git a/test/degenerate-rel-curve-to.c b/test/degenerate-rel-curve-to.c new file mode 100644 index 000000000..d7c0523c6 --- /dev/null +++ b/test/degenerate-rel-curve-to.c @@ -0,0 +1,99 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 30 + +/* Another attempt at avoiding unnecessary splines was made, where + * a curve-to that ended on the same point as it began were discarded. + * The same bug was made to rel-curve-to as well, hence this test. + */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_line_width (cr, 1.0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + /* entirely degenerate */ + cairo_move_to (cr, 2.5, 2.5); + cairo_rel_curve_to (cr, + 0., 0., + 0., 0., + 0., 0.); + cairo_stroke (cr); + + /* horizontal */ + cairo_move_to (cr, 5.5, 2.5); + cairo_rel_curve_to (cr, + 10., 0., + -10., 0., + 0., 0.); + cairo_stroke (cr); + + /* vertical */ + cairo_move_to (cr, 5.5, 2.5); + cairo_rel_curve_to (cr, + 0., 10., + 0., -10., + 0., 0.); + cairo_stroke (cr); + + cairo_translate (cr, 15, 0); + + /* horizontal/vertical */ + cairo_move_to (cr, 5.5, 0.5); + cairo_rel_curve_to (cr, + -6., 0., + 0., 10., + 0., 0.); + + cairo_translate (cr, 10, 0); + + /* vertical/horizontal */ + cairo_move_to (cr, 5.5, 0.0); + cairo_rel_curve_to (cr, + 0., 11., + 5., 0., + 0., 0.); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_rel_curve_to, + "Test optimization treating degenerate rel-curve-to as line-to", + "path", /* keywords */ + NULL, /* requirements */ + 40, + 5, + NULL, draw) diff --git a/test/degenerate-solid-dash.c b/test/degenerate-solid-dash.c new file mode 100644 index 000000000..293a80899 --- /dev/null +++ b/test/degenerate-solid-dash.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double dashes_1[] = { 10, 0 }; + const double dashes_2[] = { 10, 0, 10, 10}; + const double dashes_3[] = { 10, 0, 10, 0}; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_line_width (cr, 6); + + cairo_set_dash (cr, NULL, 0, 0); + cairo_rectangle (cr, 10, 10, 30, 30); + cairo_stroke (cr); + + cairo_translate (cr, 50, 0); + cairo_set_dash (cr, dashes_1, 2, 0); + cairo_rectangle (cr, 10, 10, 30, 30); + cairo_stroke (cr); + + cairo_translate (cr, 0, 50); + cairo_set_dash (cr, dashes_2, 4, 0); + cairo_rectangle (cr, 10, 10, 30, 30); + cairo_stroke (cr); + + cairo_translate (cr, -50, 0); + cairo_set_dash (cr, dashes_3, 4, 0); + cairo_rectangle (cr, 10, 10, 30, 30); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (degenerate_solid_dash, + "Exercises degenerate dash ellison", + "stroke, dash", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw) diff --git a/test/device-offset-fractional.c b/test/device-offset-fractional.c new file mode 100644 index 000000000..adc21161f --- /dev/null +++ b/test/device-offset-fractional.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 10 +#define PAD 4 +#define COUNT 4 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr2; + int i,j; + + /* Fill the background */ + cairo_set_source_rgb (cr, 1, 1, 1); /* white */ + cairo_paint (cr); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, SIZE, SIZE); + cr2 = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr2, 0, 0, 1); /* blue */ + cairo_paint (cr2); + + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + for (i = 0; i < COUNT; i++) { + for (j = 0; j < COUNT; j++) { + cairo_surface_set_device_offset (surface, + -i*(SIZE+PAD+.5)-PAD, + -j*(SIZE+PAD+.5)-PAD); + cairo_paint (cr); + } + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (device_offset_fractional, + "Test using image surfaces with fractional device-offsets as sources.", + "device-offset", /* keywords */ + NULL, /* requirements */ + COUNT*(SIZE+PAD+.5)+PAD, COUNT*(SIZE+PAD+.5)+PAD, + NULL, draw) diff --git a/test/device-offset-positive.c b/test/device-offset-positive.c new file mode 100644 index 000000000..5afe9730d --- /dev/null +++ b/test/device-offset-positive.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +#define SIZE 10 +#define PAD 2 + +static void +draw_square (cairo_t *cr) +{ + cairo_rectangle (cr, + PAD, PAD, + SIZE - 2 * PAD, + SIZE - 2 * PAD); + cairo_fill (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface, *target; + cairo_t *cr2; + + /* First draw a shape in blue on the original destination. */ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + draw_square (cr); + + /* Then, create an offset surface and repeat the drawing in red. */ + target = cairo_get_group_target (cr); + surface = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + SIZE / 2, SIZE / 2); + cr2 = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr2, 1, 0, 0); /* red */ + draw_square (cr2); + + /* Finally, copy the offset surface to the original destination. + * The final result should be a blue square with the upper-left + * quarter red. */ + surface = cairo_surface_reference (cairo_get_target (cr2)); + cairo_destroy (cr2); + cairo_surface_set_device_offset (surface, + SIZE / 2, + SIZE / 2); + cairo_set_source_surface (cr, surface, SIZE / 2, SIZE / 2); + cairo_surface_destroy (surface); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (device_offset_positive, + "Simple test using a surface with a positive device-offset as a source.", + "device-offset", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/device-offset-scale.c b/test/device-offset-scale.c new file mode 100644 index 000000000..33784fa8b --- /dev/null +++ b/test/device-offset-scale.c @@ -0,0 +1,77 @@ +/* + * Copyright © 2008 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Michael Ventnor, Jeff Muizelaar + */ + +#include "cairo-test.h" + +#define WIDTH 20 +#define HEIGHT 20 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *second; + cairo_t *second_cr; + + /* fill with black so we don't need an rgb test case */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_scale (cr, 0.5, 0.5); + + /* draw the first rectangle */ + cairo_set_source_rgb (cr, 0, 0, 0.4); + cairo_rectangle (cr, 6, 6, 10, 10); + cairo_fill (cr); + + /* adjust the offset so that the second rectangle will fit on the surface */ + second = cairo_image_surface_create (CAIRO_FORMAT_A8, 10, 10); + cairo_surface_set_device_offset (second, -6, -6); + + /* draw the second rectangle: + * this rectangle should end up in the same place as the rectangle above + * independent of the device offset of the surface it is painted on*/ + second_cr = cairo_create (second); + cairo_surface_destroy (second); + cairo_rectangle (second_cr, 6, 6, 10, 10); + cairo_fill (second_cr); + + /* paint the second rectangle on top of the first rectangle */ + cairo_set_source_rgb (cr, 0.5, 0.5, 0); + cairo_mask_surface (cr, cairo_get_target (second_cr), 0, 0); + cairo_destroy (second_cr); + + return CAIRO_TEST_SUCCESS; +} + +/* + * XFAIL: complication of pre-multiplying device_offset into the pattern_matrix + * and then requiring further manipulation for SVG + */ +CAIRO_TEST (device_offset_scale, + "Test that the device-offset transform is transformed by the ctm.", + "device-offset", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/device-offset.c b/test/device-offset.c new file mode 100644 index 000000000..1bf5283bd --- /dev/null +++ b/test/device-offset.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +#define SIZE 10 +#define PAD 2 + +static void +draw_square (cairo_t *cr) +{ + cairo_rectangle (cr, + PAD, PAD, + SIZE - 2 * PAD, + SIZE - 2 * PAD); + cairo_fill (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface, *target; + cairo_t *cr2; + + /* First draw a shape in blue on the original destination. */ + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + draw_square (cr); + + /* Then, create an offset surface and repeat the drawing in red. */ + target = cairo_get_group_target (cr); + surface = cairo_surface_create_similar (target, + cairo_surface_get_content (target), + SIZE / 2, SIZE / 2); + cairo_surface_set_device_offset (surface, - SIZE / 2, - SIZE / 2); + cr2 = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr2, 1, 0, 0); /* red */ + draw_square (cr2); + + + /* Finally, copy the offset surface to the original destination. + * The final result should be a blue square with the lower-right + * quarter red. */ + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + cairo_paint (cr); + + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (device_offset, + "Simple test using a surface with a negative device-offset as a source.", + "device-offset", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/drunkard-tails.c b/test/drunkard-tails.c new file mode 100644 index 000000000..f55c7becf --- /dev/null +++ b/test/drunkard-tails.c @@ -0,0 +1,135 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (3 * LINE_WIDTH) + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static void +make_path (cairo_t *cr) +{ + int i; + + state = 0xdeadbeef; + + cairo_move_to (cr, SIZE/2, SIZE/2); + for (i = 0; i < 200; i++) { + double theta = uniform_random (-M_PI, M_PI); + cairo_rel_line_to (cr, + cos (theta) * LINE_WIDTH / 4, + sin (theta) * LINE_WIDTH / 4); + } +} + +static void +draw_caps_joins (cairo_t *cr) +{ + cairo_save (cr); + + cairo_translate (cr, PAD, PAD); + + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + PAD, 0.); + + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); + + make_path (cr); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, LINE_WIDTH); + + draw_caps_joins (cr); + + cairo_save (cr); + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + draw_caps_joins (cr); + cairo_restore (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (drunkard_tails, + "Test caps and joins on short tail segments", + "stroke, cap, join", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 2 * (PAD + SIZE) + PAD, + NULL, draw) + diff --git a/test/egl-oversized-surface.c b/test/egl-oversized-surface.c new file mode 100644 index 000000000..cb85a628d --- /dev/null +++ b/test/egl-oversized-surface.c @@ -0,0 +1,117 @@ +/* + * Copyright © 2014 Samsung Electronics + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Ravi Nanjundappa + */ + +/* + * This test exercises error scenario for over sized egl surface + * + */ + +#include "cairo-test.h" +#include +#include +#include + +static cairo_test_status_t +preamble (cairo_test_context_t *test_ctx) +{ + EGLint rgba_attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, +#if CAIRO_HAS_GL_SURFACE + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, +#elif CAIRO_HAS_GLESV2_SURFACE + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, +#endif + EGL_NONE + }; + const EGLint ctx_attribs[] = { +#if CAIRO_HAS_GLESV2_SURFACE + EGL_CONTEXT_CLIENT_VERSION, 2, +#endif + EGL_NONE + }; + + EGLDisplay dpy; + EGLContext ctx; + EGLConfig config; + EGLint numConfigs; + int major, minor; + cairo_device_t *device; + cairo_surface_t *oversized_surface; + cairo_test_status_t test_status = CAIRO_TEST_SUCCESS; + + dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); + if (! eglInitialize (dpy, &major, &minor)) { + test_status = CAIRO_TEST_UNTESTED; + goto CLEANUP_1; + } + + eglChooseConfig (dpy, rgba_attribs, &config, 1, &numConfigs); + if (numConfigs == 0) { + test_status = CAIRO_TEST_UNTESTED; + goto CLEANUP_1; + } + +#if CAIRO_HAS_GL_SURFACE + eglBindAPI (EGL_OPENGL_API); +#elif CAIRO_HAS_GLESV2_SURFACE + eglBindAPI (EGL_OPENGL_ES_API); +#endif + + ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT, + ctx_attribs); + if (ctx == EGL_NO_CONTEXT) { + test_status = CAIRO_TEST_UNTESTED; + goto CLEANUP_2; + } + + device = cairo_egl_device_create (dpy, ctx); + + oversized_surface = cairo_gl_surface_create (device, CAIRO_CONTENT_COLOR_ALPHA, INT_MAX, INT_MAX); + if (cairo_surface_status (oversized_surface) != CAIRO_STATUS_INVALID_SIZE) + test_status = CAIRO_TEST_FAILURE; + + cairo_device_destroy (device); + eglDestroyContext (dpy, ctx); + eglMakeCurrent (dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + ctx = EGL_NO_CONTEXT; + +CLEANUP_2: + eglTerminate (dpy); + +CLEANUP_1: + return test_status; +} + +CAIRO_TEST (egl_oversized_surface, + "Test that creating a surface beyond texture limits results in an error surface", + "egl", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/egl-surface-source.c b/test/egl-surface-source.c new file mode 100644 index 000000000..4a84d7042 --- /dev/null +++ b/test/egl-surface-source.c @@ -0,0 +1,135 @@ +/* + * Copyright © 2014 Samsung Electronics + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Ravi Nanjundappa + */ + +/* + * This case tests using a EGL surface as the source + * + */ + +#include "cairo-test.h" +#include + +#include "surface-source.c" + +struct closure { + EGLDisplay dpy; + EGLContext ctx; +}; + +static void +cleanup (void *data) +{ + struct closure *arg = data; + + eglDestroyContext (arg->dpy, arg->ctx); + eglMakeCurrent (arg->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglTerminate (arg->dpy); + + free (arg); +} + +static cairo_surface_t * +create_source_surface (int size) +{ + EGLint config_attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_ALPHA_SIZE, 8, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, +#if CAIRO_HAS_GL_SURFACE + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, +#elif CAIRO_HAS_GLESV2_SURFACE + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, +#endif + EGL_NONE + }; + const EGLint ctx_attribs[] = { +#if CAIRO_HAS_GLESV2_SURFACE + EGL_CONTEXT_CLIENT_VERSION, 2, +#endif + EGL_NONE + }; + + struct closure *arg; + cairo_device_t *device; + cairo_surface_t *surface; + EGLConfig config; + EGLint numConfigs; + EGLDisplay dpy; + EGLContext ctx; + int major, minor; + + dpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); + if (! eglInitialize (dpy, &major, &minor)) { + return NULL; + } + + eglChooseConfig (dpy, config_attribs, &config, 1, &numConfigs); + if (numConfigs == 0) { + return NULL; + } + +#if CAIRO_HAS_GL_SURFACE + eglBindAPI (EGL_OPENGL_API); +#elif CAIRO_HAS_GLESV2_SURFACE + eglBindAPI (EGL_OPENGL_ES_API); +#endif + + ctx = eglCreateContext (dpy, config, EGL_NO_CONTEXT, + ctx_attribs); + if (ctx == EGL_NO_CONTEXT) { + eglTerminate (dpy); + return NULL; + } + + arg = xmalloc (sizeof (struct closure)); + arg->dpy = dpy; + arg->ctx = ctx; + device = cairo_egl_device_create (dpy, ctx); + if (cairo_device_set_user_data (device, + (cairo_user_data_key_t *) cleanup, + arg, + cleanup)) + { + cleanup (arg); + return NULL; + } + + surface = cairo_gl_surface_create (device, + CAIRO_CONTENT_COLOR_ALPHA, + size, size); + cairo_device_destroy (device); + + return surface; +} + +CAIRO_TEST (egl_surface_source, + "Test using a EGL surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/error-setters.c b/test/error-setters.c new file mode 100644 index 000000000..ff65ad4f2 --- /dev/null +++ b/test/error-setters.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2010 Red Hat Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Benjamin Otte + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "cairo-test.h" + +#if CAIRO_HAS_GL_SURFACE +#include +#endif +#if CAIRO_HAS_OS2_SURFACE +#include +#endif +#if CAIRO_HAS_PDF_SURFACE +#include +#endif +#if CAIRO_HAS_PS_SURFACE +#include +#endif +#if CAIRO_HAS_XCB_SURFACE +#include +#endif +#if CAIRO_HAS_XLIB_SURFACE +#include +#endif + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + + /* get the error surface */ + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, INT_MAX, INT_MAX); + +#if CAIRO_HAS_GL_SURFACE + cairo_gl_surface_set_size (surface, 0, 0); + cairo_gl_surface_swapbuffers (surface); +#endif + +#if CAIRO_HAS_OS2_SURFACE + cairo_os2_surface_set_hwnd (surface, 0); + cairo_os2_surface_set_size (surface, 0, 0, 0); + cairo_os2_surface_set_manual_window_refresh (surface, FALSE); +#endif + +#if CAIRO_HAS_PDF_SURFACE + cairo_pdf_surface_restrict_to_version (surface, CAIRO_PDF_VERSION_1_4); + cairo_pdf_surface_set_size (surface, 0, 0); +#endif + +#if CAIRO_HAS_PS_SURFACE + cairo_ps_surface_set_eps (surface, FALSE); + cairo_ps_surface_set_size (surface, 0, 0); + cairo_ps_surface_restrict_to_level (surface, CAIRO_PS_LEVEL_2); + cairo_ps_surface_dsc_comment (surface, NULL); + cairo_ps_surface_dsc_begin_setup (surface); + cairo_ps_surface_dsc_begin_page_setup (surface); +#endif + +#if CAIRO_HAS_XCB_SURFACE + cairo_xcb_surface_set_size (surface, 0, 0); +#endif + +#if CAIRO_HAS_XLIB_SURFACE + cairo_xlib_surface_set_size (surface, 0, 0); + cairo_xlib_surface_set_drawable (surface, 0, 0, 0); +#endif + + cairo_surface_set_mime_data (surface, NULL, NULL, 0, NULL, 0); + cairo_surface_set_device_offset (surface, 0, 0); + cairo_surface_set_fallback_resolution (surface, 0, 0); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (error_setters, + "Check setters properly error out on read-only error surfaces", + NULL, /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/extend-pad-border.c b/test/extend-pad-border.c new file mode 100644 index 000000000..c02ec4f00 --- /dev/null +++ b/test/extend-pad-border.c @@ -0,0 +1,95 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 90 + +/* Check the border-pixels of an EXTEND_PAD image pattern */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t * cr_surface; + int surface_size = (SIZE - 30) / 10; + + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_fill (cr); + + /* Create an image surface with my favorite four colors in each + * quadrant. */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + surface_size, surface_size); + cr_surface = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr_surface, 1, 1, 1); + cairo_rectangle (cr_surface, + 0, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 1, 0, 0); + cairo_rectangle (cr_surface, + surface_size / 2, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 1, 0); + cairo_rectangle (cr_surface, + 0, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 0, 1); + cairo_rectangle (cr_surface, + surface_size / 2, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + + cairo_scale (cr, 10, 10); + cairo_set_source_surface (cr, cairo_get_target (cr_surface), 1.5, 1.5); + cairo_destroy (cr_surface); + + /* Using EXTEND_REFLECT makes this test pass for image and xlib backends */ + /*cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REFLECT);*/ + + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD); + cairo_rectangle (cr, 1.5, 1.5, 6, 6); + cairo_clip (cr); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_pad_border, + "Test CAIRO_EXTEND_PAD for surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/extend-pad-similar.c b/test/extend-pad-similar.c new file mode 100644 index 000000000..09a90f46d --- /dev/null +++ b/test/extend-pad-similar.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 90 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr_surface; + + /* Create a 4-pixel similar surface with my favorite four colors in each + * quadrant. */ + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR, 2, 2); + cr_surface = cairo_create (surface); + cairo_surface_destroy (surface); + + /* upper-left = white */ + cairo_set_source_rgb (cr_surface, 1, 1, 1); + cairo_rectangle (cr_surface, 0, 0, 1, 1); + cairo_fill (cr_surface); + + /* upper-right = red */ + cairo_set_source_rgb (cr_surface, 1, 0, 0); + cairo_rectangle (cr_surface, 1, 0, 1, 1); + cairo_fill (cr_surface); + + /* lower-left = green */ + cairo_set_source_rgb (cr_surface, 0, 1, 0); + cairo_rectangle (cr_surface, 0, 1, 1, 1); + cairo_fill (cr_surface); + + /* lower-right = blue */ + cairo_set_source_rgb (cr_surface, 0, 0, 1); + cairo_rectangle (cr_surface, 1, 1, 1, 1); + cairo_fill (cr_surface); + + /* Now use extend pad to cover the entire surface with those 4 colors */ + cairo_set_source_surface (cr, cairo_get_target (cr_surface), + width/2 - 1, + height/2 - 1); + cairo_destroy (cr_surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_pad_similar, + "Test CAIRO_EXTEND_PAD for similar surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/extend-pad.c b/test/extend-pad.c new file mode 100644 index 000000000..f851d44a4 --- /dev/null +++ b/test/extend-pad.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 90 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr_surface; + + /* Create a 4-pixel image surface with my favorite four colors in each + * quadrant. */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 2, 2); + cr_surface = cairo_create (surface); + cairo_surface_destroy (surface); + + /* upper-left = white */ + cairo_set_source_rgb (cr_surface, 1, 1, 1); + cairo_rectangle (cr_surface, 0, 0, 1, 1); + cairo_fill (cr_surface); + + /* upper-right = red */ + cairo_set_source_rgb (cr_surface, 1, 0, 0); + cairo_rectangle (cr_surface, 1, 0, 1, 1); + cairo_fill (cr_surface); + + /* lower-left = green */ + cairo_set_source_rgb (cr_surface, 0, 1, 0); + cairo_rectangle (cr_surface, 0, 1, 1, 1); + cairo_fill (cr_surface); + + /* lower-right = blue */ + cairo_set_source_rgb (cr_surface, 0, 0, 1); + cairo_rectangle (cr_surface, 1, 1, 1, 1); + cairo_fill (cr_surface); + + /* Now use extend pad to cover the entire surface with those 4 colors */ + cairo_set_source_surface (cr, cairo_get_target (cr_surface), + width/2 - 1, + height/2 - 1); + cairo_destroy (cr_surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_pad, + "Test CAIRO_EXTEND_PAD for surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/extend-reflect-similar.c b/test/extend-reflect-similar.c new file mode 100644 index 000000000..fa376a7bf --- /dev/null +++ b/test/extend-reflect-similar.c @@ -0,0 +1,51 @@ +#include "cairo-test.h" + +static const char *png_filename = "romedalen.png"; + +static cairo_surface_t * +clone_similar_surface (cairo_surface_t * target, cairo_surface_t *surface) +{ + cairo_t *cr; + cairo_surface_t *similar; + + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (surface), + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + cairo_surface_t *similar; + + surface = cairo_test_create_surface_from_png (ctx, png_filename); + similar = clone_similar_surface (cairo_get_group_target (cr), surface); + cairo_set_source_surface (cr, similar, 32, 32); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REFLECT); + + cairo_paint (cr); + + cairo_surface_destroy (similar); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_reflect_similar, + "Test CAIRO_EXTEND_REFLECT for surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + 256 + 32*2, 192 + 32*2, + NULL, draw) diff --git a/test/extend-reflect.c b/test/extend-reflect.c new file mode 100644 index 000000000..173befc26 --- /dev/null +++ b/test/extend-reflect.c @@ -0,0 +1,29 @@ +#include "cairo-test.h" +#include +#include + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + + surface = cairo_test_create_surface_from_png (ctx, png_filename); + cairo_set_source_surface (cr, surface, 32, 32); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REFLECT); + + cairo_paint (cr); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_reflect, + "Test CAIRO_EXTEND_REFLECT for surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + 256 + 32*2, 192 + 32*2, + NULL, draw) diff --git a/test/extend-repeat-similar.c b/test/extend-repeat-similar.c new file mode 100644 index 000000000..08cfd29ab --- /dev/null +++ b/test/extend-repeat-similar.c @@ -0,0 +1,51 @@ +#include "cairo-test.h" + +static const char *png_filename = "romedalen.png"; + +static cairo_surface_t * +clone_similar_surface (cairo_surface_t * target, cairo_surface_t *surface) +{ + cairo_t *cr; + cairo_surface_t *similar; + + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (surface), + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + cairo_surface_t *similar; + + surface = cairo_test_create_surface_from_png (ctx, png_filename); + similar = clone_similar_surface (cairo_get_group_target (cr), surface); + cairo_set_source_surface (cr, similar, 32, 32); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + + cairo_paint (cr); + + cairo_surface_destroy (similar); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_repeat_similar, + "Test CAIRO_EXTEND_REPEAT for surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + 256 + 32*2, 192 + 32*2, + NULL, draw) diff --git a/test/extend-repeat.c b/test/extend-repeat.c new file mode 100644 index 000000000..e6c0bccb6 --- /dev/null +++ b/test/extend-repeat.c @@ -0,0 +1,27 @@ +#include "cairo-test.h" + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + + surface = cairo_test_create_surface_from_png (ctx, png_filename); + cairo_set_source_surface (cr, surface, 32, 32); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + + cairo_paint (cr); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (extend_repeat, + "Test CAIRO_EXTEND_REPEAT for surface patterns", + "extend", /* keywords */ + NULL, /* requirements */ + 256 + 32*2, 192 + 32*2, + NULL, draw) diff --git a/test/extended-blend.c b/test/extended-blend.c new file mode 100644 index 000000000..8edd182d6 --- /dev/null +++ b/test/extended-blend.c @@ -0,0 +1,256 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2007 Emmanuel Pacaud + * Copyright © 2008 Benjamin Otte + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Owen Taylor + * Kristian Høgsberg + * Emmanuel Pacaud + */ + +#include "cairo-test.h" +#include +#include + +#define STEPS 16 +#define START_OPERATOR CAIRO_OPERATOR_MULTIPLY +#define STOP_OPERATOR CAIRO_OPERATOR_HSL_LUMINOSITY + +#define SIZE 5 +#define COUNT 4 +#define FULL_WIDTH ((STEPS + 1) * COUNT - 1) +#define FULL_HEIGHT ((COUNT + STOP_OPERATOR - START_OPERATOR) / COUNT) * (STEPS + 1) + +static void +set_solid_pattern (cairo_t *cr, + int step, + cairo_bool_t bg, + cairo_bool_t alpha) +{ + double c, a; + + a = ((double) step) / (STEPS - 1); + if (alpha) { + c = 1; + } else { + c = a; + a = 1; + } + + if (bg) /* draw a yellow background fading in using discrete steps */ + cairo_set_source_rgba (cr, c, c, 0, a); + else /* draw a teal foreground pattern fading in using discrete steps */ + cairo_set_source_rgba (cr, 0, c, c, a); +} + +/* expects a STEP*STEP pixel rectangle */ +static void +do_blend_solid (cairo_t *cr, cairo_operator_t op, cairo_bool_t alpha) +{ + int x; + + cairo_save (cr); + cairo_scale (cr, SIZE, SIZE); + + /* not using CAIRO_OPERATOR_SOURCE here, it triggers a librsvg bug */ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + for (x = 0; x < STEPS; x++) { + /* draw the background using discrete steps */ + set_solid_pattern (cr, x, TRUE, alpha); + cairo_rectangle (cr, x, 0, 1, STEPS); + cairo_fill (cr); + } + + cairo_set_operator (cr, op); + for (x = 0; x < STEPS; x++) { + /* draw an orthogonal foreground pattern using discrete steps */ + set_solid_pattern (cr, x, FALSE, alpha); + cairo_rectangle (cr, 0, x, STEPS, 1); + cairo_fill (cr); + } + + cairo_restore (cr); +} + +static void +create_patterns (cairo_t *cr, + cairo_surface_t **bg, + cairo_surface_t **fg, + cairo_bool_t alpha) +{ + cairo_t *bgcr, *fgcr; + + *bg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + SIZE * STEPS, + SIZE * STEPS); + *fg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + SIZE * STEPS, + SIZE * STEPS); + + bgcr = cairo_create (*bg); + fgcr = cairo_create (*fg); + + do_blend_solid (bgcr, CAIRO_OPERATOR_DEST, alpha); + do_blend_solid (fgcr, CAIRO_OPERATOR_SOURCE, alpha); + + cairo_destroy (bgcr); + cairo_destroy (fgcr); +} + +/* expects a STEP*STEP pixel rectangle */ +static void +do_blend (cairo_t *cr, cairo_operator_t op, cairo_bool_t alpha) +{ + cairo_surface_t *bg, *fg; + + create_patterns (cr, &bg, &fg, alpha); + + /* not using CAIRO_OPERATOR_SOURCE here, it triggers a librsvg bug */ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface (cr, bg, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, op); + cairo_set_source_surface (cr, fg, 0, 0); + cairo_paint (cr); + + cairo_surface_destroy (fg); + cairo_surface_destroy (bg); +} + +static void +do_blend_mask (cairo_t *cr, cairo_operator_t op, cairo_bool_t alpha) +{ + cairo_surface_t *bg, *fg; + + create_patterns (cr, &bg, &fg, alpha); + + /* not using CAIRO_OPERATOR_SOURCE here, it triggers a librsvg bug */ + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface (cr, bg, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, op); + cairo_set_source_surface (cr, fg, 0, 0); + cairo_paint_with_alpha (cr, .5); + + cairo_surface_destroy (fg); + cairo_surface_destroy (bg); +} + +static cairo_test_status_t +draw (cairo_t *cr, cairo_bool_t alpha, + void (*blend)(cairo_t *, cairo_operator_t, cairo_bool_t)) +{ + size_t i = 0; + cairo_operator_t op; + + for (op = START_OPERATOR; op <= STOP_OPERATOR; op++, i++) { + cairo_save (cr); + cairo_translate (cr, + SIZE * (STEPS + 1) * (i % COUNT), + SIZE * (STEPS + 1) * (i / COUNT)); + blend (cr, op, alpha); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_extended_blend (cairo_t *cr, int width, int height) +{ + return draw (cr, FALSE, do_blend); +} + +static cairo_test_status_t +draw_extended_blend_alpha (cairo_t *cr, int width, int height) +{ + return draw (cr, TRUE, do_blend); +} + +static cairo_test_status_t +draw_extended_blend_solid (cairo_t *cr, int width, int height) +{ + return draw (cr, FALSE, do_blend_solid); +} + +static cairo_test_status_t +draw_extended_blend_solid_alpha (cairo_t *cr, int width, int height) +{ + return draw (cr, TRUE, do_blend_solid); +} + +static cairo_test_status_t +draw_extended_blend_mask (cairo_t *cr, int width, int height) +{ + return draw (cr, FALSE, do_blend_mask); +} +static cairo_test_status_t +draw_extended_blend_alpha_mask (cairo_t *cr, int width, int height) +{ + return draw (cr, TRUE, do_blend_mask); +} + +CAIRO_TEST (extended_blend, + "Tests extended blend modes without alpha", + "operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw_extended_blend) + +CAIRO_TEST (extended_blend_alpha, + "Tests extended blend modes with alpha", + "operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw_extended_blend_alpha) + +CAIRO_TEST (extended_blend_mask, + "Tests extended blend modes with an alpha mask", + "operator,mask", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw_extended_blend_mask) +CAIRO_TEST (extended_blend_alpha_mask, + "Tests extended blend modes with an alpha mask", + "operator,mask", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw_extended_blend_alpha_mask) + + +CAIRO_TEST (extended_blend_solid, + "Tests extended blend modes on solid patterns without alpha", + "operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw_extended_blend_solid) + +CAIRO_TEST (extended_blend_solid_alpha, + "Tests extended blend modes on solid patterns with alpha", + "operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw_extended_blend_solid_alpha) diff --git a/test/fallback-resolution.c b/test/fallback-resolution.c new file mode 100644 index 000000000..306a57013 --- /dev/null +++ b/test/fallback-resolution.c @@ -0,0 +1,517 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#if CAIRO_HAS_PDF_SURFACE +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif + +#include "cairo-test.h" +#include "buffer-diff.h" + +/* This test exists to test cairo_surface_set_fallback_resolution + * + * one more thing. + * if you can somehow incorporate cairo_show_page stuff in the + * test suite. such that fallback-resolution can actually be + * automated.. + * if we could get a callback on surface when that function is + * called, we could do cool stuff like making other backends + * draw a long strip of images, one for each page... + */ + +#define INCHES_TO_POINTS(in) ((in) * 72.0) +#define SIZE INCHES_TO_POINTS(2) + +/* cairo_set_tolerance() is not respected by the PS/PDF backends currently */ +#define SET_TOLERANCE 0 + +#define GENERATE_REFERENCE 0 + +static void +draw (cairo_t *cr, double width, double height) +{ + const char *text = "cairo"; + cairo_text_extents_t extents; + const double dash[2] = { 8, 16 }; + cairo_pattern_t *pattern; + + cairo_save (cr); + + cairo_new_path (cr); + + cairo_set_line_width (cr, .05 * SIZE / 2.0); + + cairo_arc (cr, SIZE / 2.0, SIZE / 2.0, + 0.875 * SIZE / 2.0, + 0, 2.0 * M_PI); + cairo_stroke (cr); + + /* use dashes to demonstrate bugs: + * https://bugs.freedesktop.org/show_bug.cgi?id=9189 + * https://bugs.freedesktop.org/show_bug.cgi?id=17223 + */ + cairo_save (cr); + cairo_set_dash (cr, dash, 2, 0); + cairo_arc (cr, SIZE / 2.0, SIZE / 2.0, + 0.75 * SIZE / 2.0, + 0, 2.0 * M_PI); + cairo_stroke (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_rectangle (cr, 0, 0, SIZE/2, SIZE); + cairo_clip (cr); + cairo_arc (cr, SIZE / 2.0, SIZE / 2.0, + 0.6 * SIZE / 2.0, + 0, 2.0 * M_PI); + cairo_fill (cr); + cairo_restore (cr); + + /* use a pattern to exercise bug: + * https://bugs.launchpad.net/inkscape/+bug/234546 + */ + cairo_save (cr); + cairo_rectangle (cr, SIZE/2, 0, SIZE/2, SIZE); + cairo_clip (cr); + pattern = cairo_pattern_create_linear (SIZE/2, 0, SIZE, 0); + cairo_pattern_add_color_stop_rgba (pattern, 0, 0, 0, 0, 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1, 0, 0, 0, 0.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_arc (cr, SIZE / 2.0, SIZE / 2.0, + 0.6 * SIZE / 2.0, + 0, 2.0 * M_PI); + cairo_fill (cr); + cairo_restore (cr); + + cairo_set_source_rgb (cr, 1, 1, 1); /* white */ + cairo_set_font_size (cr, .25 * SIZE / 2.0); + cairo_text_extents (cr, text, &extents); + cairo_move_to (cr, (SIZE-extents.width)/2.0-extents.x_bearing, + (SIZE-extents.height)/2.0-extents.y_bearing); + cairo_show_text (cr, text); + + cairo_restore (cr); +} + +static void +_xunlink (const cairo_test_context_t *ctx, const char *pathname) +{ + if (unlink (pathname) < 0 && errno != ENOENT) { + cairo_test_log (ctx, "Error: Cannot remove %s: %s\n", + pathname, strerror (errno)); + exit (1); + } +} + +static cairo_bool_t +check_result (cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target, + const char *test_name, + const char *base_name, + cairo_surface_t *surface) +{ + const char *format; + char *ref_name; + char *png_name; + char *diff_name; + cairo_surface_t *test_image, *ref_image, *diff_image; + buffer_diff_result_t result; + cairo_status_t status; + cairo_bool_t ret; + + /* XXX log target, OUTPUT, REFERENCE, DIFFERENCE for index.html */ + + if (target->finish_surface != NULL) { + status = target->finish_surface (surface); + if (status) { + cairo_test_log (ctx, "Error: Failed to finish surface: %s\n", + cairo_status_to_string (status)); + cairo_surface_destroy (surface); + return FALSE; + } + } + + xasprintf (&png_name, "%s.out.png", base_name); + xasprintf (&diff_name, "%s.diff.png", base_name); + + test_image = target->get_image_surface (surface, 0, SIZE, SIZE); + if (cairo_surface_status (test_image)) { + cairo_test_log (ctx, "Error: Failed to extract page: %s\n", + cairo_status_to_string (cairo_surface_status (test_image))); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + return FALSE; + } + + _xunlink (ctx, png_name); + status = cairo_surface_write_to_png (test_image, png_name); + if (status) { + cairo_test_log (ctx, "Error: Failed to write output image: %s\n", + cairo_status_to_string (status)); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + return FALSE; + } + + format = cairo_boilerplate_content_name (target->content); + ref_name = cairo_test_reference_filename (ctx, + base_name, + test_name, + target->name, + target->basename, + format, + CAIRO_TEST_REF_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + if (ref_name == NULL) { + cairo_test_log (ctx, "Error: Cannot find reference image for %s\n", + base_name); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + return FALSE; + } + + + ref_image = cairo_test_get_reference_image (ctx, ref_name, + target->content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED); + if (cairo_surface_status (ref_image)) { + cairo_test_log (ctx, "Error: Cannot open reference image for %s: %s\n", + ref_name, + cairo_status_to_string (cairo_surface_status (ref_image))); + cairo_surface_destroy (ref_image); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + free (ref_name); + return FALSE; + } + + diff_image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + SIZE, SIZE); + + ret = TRUE; + status = image_diff (ctx, + test_image, ref_image, diff_image, + &result); + _xunlink (ctx, diff_name); + if (status) { + cairo_test_log (ctx, "Error: Failed to compare images: %s\n", + cairo_status_to_string (status)); + ret = FALSE; + } else if (image_diff_is_failure (&result, target->error_tolerance)) + { + ret = FALSE; + + status = cairo_surface_write_to_png (diff_image, diff_name); + if (status) { + cairo_test_log (ctx, "Error: Failed to write differences image: %s\n", + cairo_status_to_string (status)); + } + } + + cairo_surface_destroy (test_image); + cairo_surface_destroy (diff_image); + free (png_name); + free (diff_name); + free (ref_name); + + return ret; +} + +#if GENERATE_REFERENCE +static void +generate_reference (double ppi_x, double ppi_y, const char *filename) +{ + cairo_surface_t *surface, *target; + cairo_t *cr; + cairo_status_t status; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + SIZE*ppi_x/72, SIZE*ppi_y/72); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + /* As we wish to mimic a PDF surface, copy across the default font options + * from the PDF backend. + */ + { + cairo_surface_t *pdf; + cairo_font_options_t *options; + + options = cairo_font_options_create (); + +#if CAIRO_HAS_PDF_SURFACE + pdf = cairo_pdf_surface_create ("tmp.pdf", 1, 1); + cairo_surface_get_font_options (pdf, options); + cairo_surface_destroy (pdf); +#endif + + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + } + +#if SET_TOLERANCE + cairo_set_tolerance (cr, 3.0); +#endif + + cairo_save (cr); { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + } cairo_restore (cr); + + cairo_scale (cr, ppi_x/72., ppi_y/72.); + draw (cr, SIZE, SIZE); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + target = cairo_image_surface_create (CAIRO_FORMAT_RGB24, SIZE, SIZE); + cr = cairo_create (target); + cairo_scale (cr, 72./ppi_x, 72./ppi_y); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + + status = cairo_surface_write_to_png (cairo_get_target (cr), filename); + cairo_destroy (cr); + + if (status) { + fprintf (stderr, "Failed to generate reference image '%s': %s\n", + filename, cairo_status_to_string (status)); + exit (1); + } +} +#endif + +/* TODO: Split each ppi case out to its own CAIRO_TEST() test case */ +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_test_status_t ret = CAIRO_TEST_UNTESTED; + struct { + double x, y; + } ppi[] = { + { 576, 576 }, + { 576, 72 }, + + { 288, 288 }, + { 288, 72 }, + + { 144, 144 }, + { 144, 72 }, + + { 72, 576 }, + { 72, 288 }, + { 72, 144 }, + { 72, 72 }, + }; + unsigned int i; + int n, num_ppi; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + num_ppi = ARRAY_LENGTH (ppi); + +#if GENERATE_REFERENCE + for (n = 0; n < num_ppi; n++) { + char *ref_name; + xasprintf (&ref_name, "reference/fallback-resolution.ppi%gx%g.ref.png", + ppi[n].x, ppi[n].y); + generate_reference (ppi[n].x, ppi[n].y, ref_name); + free (ref_name); + } +#endif + + for (i = 0; i < ctx->num_targets; i++) { + const cairo_boilerplate_target_t *target = ctx->targets_to_test[i]; + cairo_surface_t *surface = NULL; + char *base_name; + void *closure; + const char *format; + cairo_status_t status; + + if (! target->is_vector) + continue; + + if (! cairo_test_is_target_enabled (ctx, target->name)) + continue; + + format = cairo_boilerplate_content_name (target->content); + xasprintf (&base_name, "%s/fallback-resolution.%s.%s", + path, target->name, + format); + + surface = (target->create_surface) (base_name, + target->content, + SIZE, SIZE, + SIZE, SIZE, + CAIRO_BOILERPLATE_MODE_TEST, + &closure); + + if (surface == NULL) { + free (base_name); + continue; + } + + if (ret == CAIRO_TEST_UNTESTED) + ret = CAIRO_TEST_SUCCESS; + + cairo_surface_destroy (surface); + if (target->cleanup) + target->cleanup (closure); + free (base_name); + + /* we need to recreate the surface for each resolution as we include + * SVG in testing which does not support the paginated interface. + */ + for (n = 0; n < num_ppi; n++) { + char *test_name; + cairo_bool_t pass; + + xasprintf (&test_name, "fallback-resolution.ppi%gx%g", + ppi[n].x, ppi[n].y); + xasprintf (&base_name, "%s/%s.%s.%s", + path, test_name, + target->name, + format); + + surface = (target->create_surface) (base_name, + target->content, + SIZE + 25, SIZE + 25, + SIZE + 25, SIZE + 25, + CAIRO_BOILERPLATE_MODE_TEST, + &closure); + if (surface == NULL || cairo_surface_status (surface)) { + cairo_test_log (ctx, "Failed to generate surface: %s.%s\n", + target->name, + format); + free (base_name); + free (test_name); + ret = CAIRO_TEST_FAILURE; + continue; + } + + cairo_test_log (ctx, + "Testing fallback-resolution %gx%g with %s target\n", + ppi[n].x, ppi[n].y, target->name); + printf ("%s:\t", base_name); + fflush (stdout); + + if (target->force_fallbacks != NULL) + target->force_fallbacks (surface, ppi[n].x, ppi[n].y); + cr = cairo_create (surface); +#if SET_TOLERANCE + cairo_set_tolerance (cr, 3.0); +#endif + + cairo_surface_set_device_offset (surface, 25, 25); + + cairo_save (cr); { + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + } cairo_restore (cr); + + /* First draw the top half in a conventional way. */ + cairo_save (cr); { + cairo_rectangle (cr, 0, 0, SIZE, SIZE / 2.0); + cairo_clip (cr); + + draw (cr, SIZE, SIZE); + } cairo_restore (cr); + + /* Then draw the bottom half in a separate group, + * (exposing a bug in 1.6.4 with the group not being + * rendered with the correct fallback resolution). */ + cairo_save (cr); { + cairo_rectangle (cr, 0, SIZE / 2.0, SIZE, SIZE / 2.0); + cairo_clip (cr); + + cairo_push_group (cr); { + draw (cr, SIZE, SIZE); + } cairo_pop_group_to_source (cr); + + cairo_paint (cr); + } cairo_restore (cr); + + status = cairo_status (cr); + cairo_destroy (cr); + + pass = FALSE; + if (status) { + cairo_test_log (ctx, "Error: Failed to create target surface: %s\n", + cairo_status_to_string (status)); + ret = CAIRO_TEST_FAILURE; + } else { + /* extract the image and compare it to our reference */ + if (! check_result (ctx, target, test_name, base_name, surface)) + ret = CAIRO_TEST_FAILURE; + else + pass = TRUE; + } + cairo_surface_destroy (surface); + if (target->cleanup) + target->cleanup (closure); + + free (base_name); + free (test_name); + + if (pass) { + printf ("PASS\n"); + } else { + printf ("FAIL\n"); + } + fflush (stdout); + } + } + + return ret; +} + +CAIRO_TEST (fallback_resolution, + "Check handling of fallback resolutions", + "fallback", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/fallback.c b/test/fallback.c new file mode 100644 index 000000000..a3cfc401c --- /dev/null +++ b/test/fallback.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2012 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 40 +#define WIDTH (7*SIZE) +#define HEIGHT (5*SIZE) + +#define FALLBACK_RES_X 300 +#define FALLBACK_RES_Y 150 + +static void +rectangles (cairo_t *cr) +{ + cairo_save (cr); + + cairo_rotate (cr, M_PI/8); + cairo_translate (cr, 2*SIZE, SIZE/16); + cairo_scale (cr, 1.5, 1.5); + + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, 0.5); + cairo_fill (cr); + + /* Select an operator not supported by PDF/PS/SVG to trigger fallback */ + cairo_set_operator (cr, CAIRO_OPERATOR_SATURATE); + + cairo_rectangle (cr, SIZE/2, SIZE/2, SIZE, SIZE); + cairo_set_source_rgba (cr, 0, 1, 0, 0.5); + cairo_fill (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_set_fallback_resolution (cairo_get_target (cr), FALLBACK_RES_X, FALLBACK_RES_Y); + + rectangles (cr); + cairo_translate (cr, 3*SIZE, 0); + cairo_push_group (cr); + rectangles (cr); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fallback, + "Check that fallback images are correct when fallback resolution is not 72ppi", + "fallback", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/fill-alpha-pattern.c b/test/fill-alpha-pattern.c new file mode 100644 index 000000000..3698779c1 --- /dev/null +++ b/test/fill-alpha-pattern.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double alpha = 1./3; + cairo_pattern_t *pattern; + int n; + + /* draw a simple pattern behind */ + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgb (pattern, 0, 1, 1, 0); + cairo_pattern_add_color_stop_rgb (pattern, 1, 1, 1, 1); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_alpha_pattern, + "Tests using set_rgba();fill() over a linear gradient", + "fill, alpha", /* keywords */ + NULL, /* requirements */ + 2*SIZE + 4*PAD, 2*SIZE + 4*PAD, + NULL, draw) diff --git a/test/fill-alpha.c b/test/fill-alpha.c new file mode 100644 index 000000000..6c2948dfa --- /dev/null +++ b/test/fill-alpha.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double alpha = 1./3; + int n; + + /* flatten to white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_alpha, + "Tests using set_rgba();fill()", + "fill, alpha", /* keywords */ + NULL, /* requirements */ + 2*SIZE + 4*PAD, 2*SIZE + 4*PAD, + NULL, draw) diff --git a/test/fill-and-stroke-alpha-add.c b/test/fill-and-stroke-alpha-add.c new file mode 100644 index 000000000..55cd4c6a2 --- /dev/null +++ b/test/fill-and-stroke-alpha-add.c @@ -0,0 +1,107 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define PAD 2 +#define SIZE 10 + +typedef void (*path_func_t) (cairo_t *cr); + +static void +rectangle (cairo_t *cr) +{ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); +} + +static void +circle (cairo_t *cr) +{ + cairo_arc (cr, + PAD + SIZE / 2, PAD + SIZE / 2, + SIZE / 2, + 0, 2 * M_PI); +} + +/* Given a path-generating function and two possibly translucent + * patterns, fill and stroke the path with the patterns (to an + * offscreen group), then blend the result into the destination. + */ +static void +fill_and_stroke (cairo_t *cr, + path_func_t path_func, + cairo_pattern_t *fill_pattern, + cairo_pattern_t *stroke_pattern) +{ + cairo_push_group (cr); + { + (path_func) (cr); + cairo_set_source (cr, fill_pattern); + cairo_fill_preserve (cr); + + /* Use DEST_OUT to subtract stroke from fill. */ + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OUT); + cairo_stroke_preserve (cr); + + /* Then use ADD to draw the stroke without a seam. */ + cairo_set_source (cr, stroke_pattern); + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + cairo_stroke (cr); + } + cairo_pop_group_to_source (cr); + cairo_paint (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *blue; + cairo_pattern_t *red; + + blue = cairo_pattern_create_rgba (0.0, 0.0, 1.0, 0.8); + red = cairo_pattern_create_rgba (1.0, 0.0, 0.0, 0.2); + + cairo_test_paint_checkered (cr); + + fill_and_stroke (cr, rectangle, blue, red); + + cairo_translate (cr, SIZE + 2 * PAD, 0); + + fill_and_stroke (cr, circle, red, blue); + + cairo_pattern_destroy (blue); + cairo_pattern_destroy (red); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_and_stroke_alpha_add, + "Use a group to fill/stroke a path (each with different alpha) using DEST_OUT and ADD to combine", + "fill-and-stroke, fill, stroke", /* keywords */ + NULL, /* requirements */ + 2 * SIZE + 4 * PAD, SIZE + 2 * PAD, + NULL, draw) diff --git a/test/fill-and-stroke-alpha.c b/test/fill-and-stroke-alpha.c new file mode 100644 index 000000000..c6d7c0062 --- /dev/null +++ b/test/fill-and-stroke-alpha.c @@ -0,0 +1,101 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define PAD 2 +#define SIZE 10 + +typedef void (*path_func_t) (cairo_t *cr); + +static void +rectangle (cairo_t *cr) +{ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); +} + +static void +circle (cairo_t *cr) +{ + cairo_arc (cr, + PAD + SIZE / 2, PAD + SIZE / 2, + SIZE / 2, + 0, 2 * M_PI); +} + +/* Given a path-generating function and two opaque patterns, fill and + * stroke the path with the patterns (to an offscreen group), then + * blend the result into the destination with the given alpha + * value. + */ +static void +fill_and_stroke_alpha (cairo_t *cr, + path_func_t path_func, + cairo_pattern_t *fill_pattern, + cairo_pattern_t *stroke_pattern, + double alpha) +{ + cairo_push_group (cr); + { + (path_func) (cr); + cairo_set_source (cr, fill_pattern); + cairo_fill_preserve (cr); + cairo_set_source (cr, stroke_pattern); + cairo_stroke (cr); + } + cairo_pop_group_to_source (cr); + cairo_paint_with_alpha (cr, alpha); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *blue; + cairo_pattern_t *red; + + blue = cairo_pattern_create_rgb (0.0, 0.0, 1.0); + red = cairo_pattern_create_rgb (1.0, 0.0, 0.0); + + cairo_test_paint_checkered (cr); + + fill_and_stroke_alpha (cr, rectangle, blue, red, 0.5); + + cairo_translate (cr, SIZE + 2 * PAD, 0); + + fill_and_stroke_alpha (cr, circle, red, blue, 0.5); + + cairo_pattern_destroy (blue); + cairo_pattern_destroy (red); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_and_stroke_alpha, + "Use a group to fill/stroke a path then blend the result with alpha onto the destination", + "fill-and-stroke, fill, stroke", /* keywords */ + NULL, /* requirements */ + 2 * SIZE + 4 * PAD, SIZE + 2 * PAD, + NULL, draw) diff --git a/test/fill-and-stroke.c b/test/fill-and-stroke.c new file mode 100644 index 000000000..c983c3299 --- /dev/null +++ b/test/fill-and-stroke.c @@ -0,0 +1,58 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define PAD 2 +#define SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + + cairo_translate (cr, SIZE + 2 * PAD, 0); + + cairo_arc (cr, + PAD + SIZE / 2, PAD + SIZE / 2, + SIZE / 2, + 0, 2 * M_PI); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_and_stroke, + "Tests using cairo_fill_preserve/cairo_stroke to fill/stroke the same path", + "fill-and-stroke, fill, stroke", /* keywords */ + NULL, /* requirements */ + 2 * SIZE + 4 * PAD, SIZE + 2 * PAD, + NULL, draw) diff --git a/test/fill-degenerate-sort-order.c b/test/fill-degenerate-sort-order.c new file mode 100644 index 000000000..d93481048 --- /dev/null +++ b/test/fill-degenerate-sort-order.c @@ -0,0 +1,77 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ + +/* Bug history + * + * 2006-12-05 M Joonas Pihlaja + * + * There's currently a regression bug in the tessellation code from + * switching to the "new tessellator". The bug is caused by + * confusion in the comparator used to order events when there are + * degenerate edges. + */ + +#include "cairo-test.h" + +/* Derived from zrusin's "another" polygon in the performance suite. */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 0); + + /* The polygon uses (43,103) as its "base point". Closed + * subpaths are simulated by going from the base point to the + * subpath's first point, doing the subpath, and returning to the + * base point. The moving to and from the base point causes + * degenerate edges which shouldn't result in anything visible. */ + cairo_move_to (cr, 43, 103); + + /* First subpath. */ + cairo_line_to (cr, 91, 101); + cairo_line_to (cr, 0, 112); + cairo_line_to (cr, 60, 0); + cairo_line_to (cr, 91, 101); + + cairo_line_to (cr, 43, 103); + + /* Second subpath. */ + cairo_line_to (cr, 176, 110); + cairo_line_to (cr, 116, 100); + cairo_line_to (cr, 176, 0); + cairo_line_to (cr, 176, 110); + + cairo_close_path (cr); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_degenerate_sort_order, + "Tests the tessellator's event comparator with degenerate input", + "degenerate, fill", /* keywords */ + NULL, /* requirements */ + 190, 120, + NULL, draw) diff --git a/test/fill-disjoint.c b/test/fill-disjoint.c new file mode 100644 index 000000000..ea2c14fff --- /dev/null +++ b/test/fill-disjoint.c @@ -0,0 +1,63 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* The goal is exercise a bug that existed in the xlib backend, where + * it assumed the rectangles generated by rectangular tessallator had + * any sorting guarantees. + */ + +#define WIDTH 300 +#define HEIGHT 300 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int x; + + /* black background */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* white rectangles */ + cairo_set_source_rgb (cr, 1, 1, 1); + + /* fill with a set of rectangles that the rectangular tessellator + * will not emit sorted. */ + for (x = 0; x < WIDTH - 10; x += 15) + cairo_rectangle (cr, x, x, 10, HEIGHT - 2*x); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_disjoint, + "Tests filling unsorted rectangles.", + "fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/fill-empty.c b/test/fill-empty.c new file mode 100644 index 000000000..0594e57ad --- /dev/null +++ b/test/fill-empty.c @@ -0,0 +1,62 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + + /* first drawn an ordinary empty path */ + cairo_save (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE/2); + cairo_clip (cr); + cairo_fill (cr); + cairo_restore (cr); + + /* and then an unbounded empty path */ + cairo_save (cr); + cairo_rectangle (cr, 0, SIZE/2, SIZE, SIZE/2); + cairo_clip (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN); + cairo_fill (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_empty, + "Test filling with an empty path", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + diff --git a/test/fill-image.c b/test/fill-image.c new file mode 100644 index 000000000..24ee03142 --- /dev/null +++ b/test/fill-image.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2006 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +#define PAD 10 +#define SIZE 100 +#define IMAGE_SIZE (SIZE-PAD*2) +#define LINE_WIDTH 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *image; + cairo_t *cr_image; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + IMAGE_SIZE, IMAGE_SIZE); + cr_image = cairo_create (image); + cairo_surface_destroy (image); + + /* Create the image */ + cairo_set_source_rgb (cr_image, 0, 0, 0); + cairo_paint (cr_image); + + cairo_set_source_rgb (cr_image, 0, 1, 0); + cairo_new_sub_path (cr_image); + cairo_arc (cr_image, IMAGE_SIZE/2, IMAGE_SIZE/2, IMAGE_SIZE/2 - LINE_WIDTH, 0, M_PI * 2.0); + cairo_close_path (cr_image); + cairo_new_sub_path (cr_image); + cairo_arc_negative (cr_image, IMAGE_SIZE/2, IMAGE_SIZE/2, IMAGE_SIZE/2, 0, -M_PI * 2.0); + cairo_close_path (cr_image); + cairo_fill (cr_image); + + /* Now stroke^Wfill with it */ + cairo_translate (cr, PAD, PAD); + + cairo_set_source_surface (cr, cairo_get_target (cr_image), 0, 0); + cairo_destroy (cr_image); + + cairo_new_sub_path (cr); + cairo_arc (cr, IMAGE_SIZE/2, IMAGE_SIZE/2, IMAGE_SIZE/2 - LINE_WIDTH, 0, M_PI * 2.0); + cairo_close_path (cr); + cairo_new_sub_path (cr); + cairo_arc_negative (cr, IMAGE_SIZE/2, IMAGE_SIZE/2, IMAGE_SIZE/2, 0, -M_PI * 2.0); + cairo_close_path (cr); + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_image, + "Test filling with an image source, with a non-identity CTM", + "fill, image, transform", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/fill-missed-stop.c b/test/fill-missed-stop.c new file mode 100644 index 000000000..558933778 --- /dev/null +++ b/test/fill-missed-stop.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ + +/* Bug history + * + * 2006-12-05 M Joonas Pihlaja + * + * The tessellator has a regression where a trapezoid may continue + * below the end of a polygon edge (i.e. the bottom of the trapezoid + * is miscomputed.) This can only happen if the right edge of a + * trapezoid stops earlier than the left edge and there is no start + * event at the end point of the right edge. + */ + +#include "cairo-test.h" + +#define SIZE 50 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_translate (cr, 1, 1); + + /* What it should look like, with # marking the filled areas: + * + * |\ |\ + * |#\ |#\ + * |##\__|##\ + * \#| + * \| + * + * What it looke like with the bug, when the rightmost edge's end + * is missed: + * + * |\ |\ + * |#\ |#\ + * |##\__|##\ + * \#####| + * \####| + */ + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, SIZE/2, SIZE); + cairo_line_to (cr, SIZE/2, 0); + cairo_line_to (cr, SIZE, SIZE/2); + cairo_line_to (cr, 0, SIZE/2); + cairo_close_path (cr); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_missed_stop, + "Tests that the tessellator doesn't miss stop events when generating trapezoids", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE+3, SIZE+3, + NULL, draw) diff --git a/test/fill-rule.c b/test/fill-rule.c new file mode 100644 index 000000000..66f19b7cc --- /dev/null +++ b/test/fill-rule.c @@ -0,0 +1,127 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2004-10-27 Carl Worth + * + * There's currently a regression bug in the tessellation code. This + * causes each of these simple star shapes to be filled incorrectly. + * + * It looks like right now we can get this test to pass by doing: + * + * cvs update -r 1.16 src/cairo_traps.c + * + * But we don't want to revert that change permanently since it + * really does correct some bugs. It must be that the old version of + * the code is masking some other bugs in the tessellation code. My + * current plan is to back this revision up for the next snapshot, + * but not to list the test as an expected failure since I'm + * planning on doing the new tessellator which should fix this + * problem. + * + * 2005-01-11 Carl Worth + * + * Keith committed some fixes that fix the original size-20 + * star_path: + * + * * src/cairo_wideint.c: (_cairo_int32x32_64_mul), + * (_cairo_int64x64_128_mul): + * * src/cairo_wideint.h: + * int32x32_64_mul and int64x64_128_mul are different from their + * unsigned compatriots + * + * 2005-01-12 Carl Worth + * + * Going back to the SVG test suite, however, the original star + * shape is still broken. Adding both shapes now as little_star_path + * and big_star_path. + * + */ + +#include "cairo-test.h" + +#define LITTLE_STAR_SIZE 20 +#define BIG_STAR_SIZE 80 + +/* The SVG start trimmed down, but still showing the bug (originally) */ +static void +little_star_path (cairo_t *cr) +{ + cairo_move_to (cr, 10, 0); + cairo_rel_line_to (cr, 6, 20); + cairo_rel_line_to (cr, -16, -12); + cairo_rel_line_to (cr, 20, 0); + cairo_rel_line_to (cr, -16, 12); +} + +/* The star shape from the SVG test suite. This was is still buggy even after + we got little_star_path working. */ +static void +big_star_path (cairo_t *cr) +{ + cairo_move_to (cr, 40, 0); + cairo_rel_line_to (cr, 25, 80); + cairo_rel_line_to (cr, -65, -50); + cairo_rel_line_to (cr, 80, 0); + cairo_rel_line_to (cr, -65, 50); + cairo_close_path (cr); +} + +/* Fill the same path twice, once with each fill rule */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_translate (cr, 1, 1); + little_star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + cairo_fill (cr); + + cairo_translate (cr, LITTLE_STAR_SIZE + 1, 0); + little_star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); + + cairo_translate (cr, -(LITTLE_STAR_SIZE + 1), LITTLE_STAR_SIZE + 1); + big_star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + cairo_fill (cr); + + cairo_translate (cr, BIG_STAR_SIZE + 1, 0); + big_star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (fill_rule, + "Tests cairo_set_fill_rule with some star shapes", + "fill, path", /* keywords */ + NULL, /* requirements */ + BIG_STAR_SIZE * 2 + 3, BIG_STAR_SIZE + LITTLE_STAR_SIZE + 3, + NULL, draw) diff --git a/test/filter-bilinear-extents.c b/test/filter-bilinear-extents.c new file mode 100644 index 000000000..79d36f6e6 --- /dev/null +++ b/test/filter-bilinear-extents.c @@ -0,0 +1,102 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: Carl D. Worth + * Owen Taylor + */ + +#include "cairo-test.h" + +/* This test exercises code that computes the extents of a surface + * pattern with CAIRO_FILTER_BILINEAR, (where the filtering + * effectively increases the extents of the pattern). + * + * The original bug was reported by Owen Taylor here: + * + * bad clipping with EXTEND_NONE + * http://bugs.freedesktop.org/show_bug.cgi?id=15349 + */ + +#define SCALE 10 +#define PAD 3 +#define WIDTH (PAD + 3 * SCALE + PAD) +#define HEIGHT WIDTH + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *image; + cairo_t *cr2; + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 2, 2); + + /* Fill with an opaque background to avoid a separate rgb24 ref image */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* First check handling of pattern extents > surface extents */ + cairo_save (cr); + cairo_scale (cr, width/2., height/2.); + + /* Create a solid black source to merge with the background */ + cr2 = cairo_create (image); + cairo_set_source_rgb (cr2, 0, 0 ,0); + cairo_paint (cr2); + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_BILINEAR); + cairo_paint (cr); + cairo_restore (cr); + + /* Then scale to smaller so we can see the full bilinear extents */ + cairo_save (cr); + cairo_translate (cr, PAD, PAD); + cairo_scale (cr, SCALE, SCALE); + cairo_translate (cr, 0.5, 0.5); + + /* Create a 2x2 blue+red checkerboard source */ + cr2 = cairo_create (image); + cairo_set_source_rgb (cr2, 1, 0 ,0); /* red */ + cairo_paint (cr2); + cairo_set_source_rgb (cr2, 0, 0, 1); /* blue */ + cairo_rectangle (cr2, 0, 1, 1, 1); + cairo_rectangle (cr2, 1, 0, 1, 1); + cairo_fill (cr2); + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_BILINEAR); + cairo_paint (cr); + cairo_restore (cr); + + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (filter_bilinear_extents, + "Test that pattern extents are properly computed for CAIRO_FILTER_BILINEAR", + "extents", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/filter-nearest-offset.c b/test/filter-nearest-offset.c new file mode 100644 index 000000000..4df609702 --- /dev/null +++ b/test/filter-nearest-offset.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define STAMP_WIDTH 4 +#define STAMP_HEIGHT 4 +#define PAD 1 + +#define STEPS 10 + +#define IMAGE_WIDTH (PAD + STEPS * (STAMP_WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (PAD + STEPS * (STAMP_HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t data[STAMP_WIDTH * STAMP_HEIGHT] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff + }; + int i, j; + + /* fill with off-white to avoid a separate rgb24 ref image */ + cairo_save (cr); + cairo_set_source_rgb (cr, .7, .7, .7); + cairo_paint (cr); + cairo_restore (cr); + + /* Draw reference lines where the jump should be. */ + cairo_move_to (cr, PAD + STEPS / 2 * (STAMP_WIDTH + PAD), 0); + cairo_rel_line_to (cr, 0, IMAGE_HEIGHT); + cairo_move_to (cr, 0, PAD + STEPS / 2 * (STAMP_HEIGHT + PAD)); + cairo_rel_line_to (cr, IMAGE_WIDTH, 0); + cairo_set_line_width (cr, 2.0); + cairo_stroke (cr); + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, + STAMP_WIDTH, + STAMP_HEIGHT, + STAMP_WIDTH * 4); + + for (j=0; j < STEPS; j++) { + double j_step; + + for (i=0; i < STEPS; i++) { + double i_step; + +#define GENERATE_REFERENCE_IMAGE 0 +#if GENERATE_REFERENCE_IMAGE + i_step = i >= STEPS / 2 ? 1 : 0; + j_step = j >= STEPS / 2 ? 1 : 0; +#else + i_step = i * 1.0 / STEPS; + j_step = j * 1.0 / STEPS; +#endif + + cairo_save (cr); + + cairo_set_source_surface (cr, surface, + PAD + i * (STAMP_WIDTH + PAD) + i_step, + PAD + j * (STAMP_HEIGHT + PAD) + j_step); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + + cairo_restore (cr); + } + } + + cairo_surface_finish (surface); /* data goes out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (filter_nearest_offset, + "Test sampling offset of CAIRO_FILTER_NEAREST" + "\nwrong sampling location for nearest-neighbor filter in libpixman and Render", + "filter", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/filter-nearest-transformed.c b/test/filter-nearest-transformed.c new file mode 100644 index 000000000..ba56f7c5a --- /dev/null +++ b/test/filter-nearest-transformed.c @@ -0,0 +1,120 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* + * We wish to check the optimization away of non-fractional translations + * for NEAREST surface patterns under a few transformations. + */ + +static const char png_filename[] = "romedalen.png"; + +/* A single, black pixel */ +static const uint32_t black_pixel = 0xff000000; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + unsigned int i, j, k; + cairo_surface_t *surface; + cairo_pattern_t *pattern; + const cairo_matrix_t transform[] = { + { 1, 0, 0, 1, 0, 0 }, + { -1, 0, 0, 1, 8, 0 }, + { 1, 0, 0, -1, 0, 8 }, + { -1, 0, 0, -1, 8, 8 }, + }; + const cairo_matrix_t ctx_transform[] = { + { 1, 0, 0, 1, 0, 0 }, + { -1, 0, 0, 1, 14, 0 }, + { 1, 0, 0, -1, 0, 14 }, + { -1, 0, 0, -1, 14, 14 }, + }; + const double colour[][3] = { + {0, 0, 0}, + {1, 0, 0}, + {0, 1, 0}, + {0, 0, 1}, + }; + cairo_matrix_t m; + + surface = cairo_image_surface_create_for_data ((uint8_t *) &black_pixel, + CAIRO_FORMAT_ARGB32, + 1, 1, 4); + pattern = cairo_pattern_create_for_surface (surface); + cairo_surface_destroy (surface); + + cairo_pattern_set_filter (pattern, CAIRO_FILTER_NEAREST); + + surface = cairo_test_create_surface_from_png (ctx, png_filename); + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + for (k = 0; k < ARRAY_LENGTH (transform); k++) { + /* draw a "large" section from an image */ + cairo_save (cr); { + cairo_set_matrix(cr, &ctx_transform[k]); + cairo_rectangle (cr, 0, 0, 7, 7); + cairo_clip (cr); + + cairo_set_source_surface (cr, surface, + -cairo_image_surface_get_width (surface)/2., + -cairo_image_surface_get_height (surface)/2.); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + } cairo_restore (cr); + + cairo_set_source_rgb (cr, colour[k][0], colour[k][1], colour[k][2]); + for (j = 4; j <= 6; j++) { + for (i = 4; i <= 6; i++) { + cairo_matrix_init_translate (&m, + -(2*(i-4) + .1*i), + -(2*(j-4) + .1*j)); + cairo_matrix_multiply (&m, &m, &transform[k]); + cairo_pattern_set_matrix (pattern, &m); + cairo_mask (cr, pattern); + } + } + } + + cairo_pattern_destroy (pattern); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (filter_nearest_transformed, + "Test sample position when drawing transformed images with FILTER_NEAREST", + "filter, nearest", /* keywords */ + NULL, + 14, 14, + NULL, draw) diff --git a/test/finer-grained-fallbacks.c b/test/finer-grained-fallbacks.c new file mode 100644 index 000000000..fa16f72f0 --- /dev/null +++ b/test/finer-grained-fallbacks.c @@ -0,0 +1,180 @@ +/* + * Copyright © 2008 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define CIRCLE_SIZE 10 +#define PAD 2 +#define WIDTH (CIRCLE_SIZE*6.5 + PAD) +#define HEIGHT (CIRCLE_SIZE*7.0 + PAD) + +static void +draw_circle (cairo_t *cr, double x, double y) +{ + cairo_save (cr); + cairo_translate (cr, x, y); + cairo_arc (cr, 0, 0, CIRCLE_SIZE / 2, 0., 2. * M_PI); + cairo_fill (cr); + cairo_restore (cr); +} + +static void +draw_image_circle (cairo_t *cr, cairo_surface_t *source, double x, double y) +{ + cairo_save (cr); + + cairo_set_source_surface (cr, source, x, y); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REFLECT); + cairo_rectangle (cr, x, y, CIRCLE_SIZE, CIRCLE_SIZE); + cairo_fill (cr); + + cairo_restore (cr); +} + +static void +draw_circles (cairo_t *cr) +{ + draw_circle (cr, 0, -CIRCLE_SIZE*0.1); + draw_circle (cr, CIRCLE_SIZE*0.4, CIRCLE_SIZE*0.25); + + draw_circle (cr, CIRCLE_SIZE*2, 0); + draw_circle (cr, CIRCLE_SIZE*4, 0); + draw_circle (cr, CIRCLE_SIZE*6, 0); +} + +static void +draw_image_circles (cairo_t *cr, cairo_surface_t *source) +{ + draw_image_circle (cr, source, 0, -CIRCLE_SIZE*0.1); + draw_image_circle (cr, source, CIRCLE_SIZE*0.4, CIRCLE_SIZE*0.25); + + draw_image_circle (cr, source, CIRCLE_SIZE*2, 0); + draw_image_circle (cr, source, CIRCLE_SIZE*4, 0); + draw_image_circle (cr, source, CIRCLE_SIZE*6, 0); +} + +/* For each of circle and fallback_circle we draw: + * - two overlapping + * - one isolated + * - one off the page + * - one overlapping the edge of the page. + * + * We also draw a circle and fallback_circle overlapping each other. + * + * Circles are drawn in green. An opaque color and CAIRO_OPERATOR_OVER + * is used to ensure they will be emitted as a vectors in PS/PDF. + * + * Fallback circles are drawn in red. CAIRO_OPERATOR_ADD is used to + * ensure they will be emitted as a fallback image in PS/PDF. + * + * In order to trigger a fallback for SVG, we need to use a surface with + * REFLECT. + */ +static cairo_surface_t * +surface_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_surface_create_similar (cairo_get_target (target), + CAIRO_CONTENT_COLOR_ALPHA, + CIRCLE_SIZE, CIRCLE_SIZE); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + draw_circle (cr, CIRCLE_SIZE/2, CIRCLE_SIZE/2); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + + cairo_translate (cr, PAD, PAD); + + cairo_save (cr); + + /* Draw overlapping circle and fallback circle */ + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + draw_circle (cr, CIRCLE_SIZE*0.5, CIRCLE_SIZE*1.5); + + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + draw_circle (cr, CIRCLE_SIZE*0.75, CIRCLE_SIZE*1.75); + + /* Draw circles */ + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_translate (cr, CIRCLE_SIZE*2.5, CIRCLE_SIZE*0.6); + draw_circles (cr); + + /* Draw fallback circles */ + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + cairo_translate (cr, 0, CIRCLE_SIZE*2); + draw_circles (cr); + + cairo_restore (cr); + cairo_translate (cr, 0, CIRCLE_SIZE * 3.5); + + /* Draw using fallback surface */ + surface = surface_create (cr); + + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + draw_circle (cr, CIRCLE_SIZE*0.5, CIRCLE_SIZE*1.5); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + draw_image_circle (cr, surface, CIRCLE_SIZE/4, CIRCLE_SIZE + CIRCLE_SIZE/4); + + /* Draw circles */ + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_translate (cr, CIRCLE_SIZE*2.5, CIRCLE_SIZE*0.6); + draw_circles (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + cairo_translate (cr, -CIRCLE_SIZE/2, CIRCLE_SIZE*1.5); + draw_image_circles (cr, surface); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (finer_grained_fallbacks, + "Test that multiple PS/PDF fallback images in various locations are correct", + "fallbacks", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/font-face-get-type.c b/test/font-face-get-type.c new file mode 100644 index 000000000..afbb73944 --- /dev/null +++ b/test/font-face-get-type.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_test_status_t status = CAIRO_TEST_SUCCESS; + cairo_surface_t *surface; + cairo_t *cr; + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; + + cairo_test_log (ctx, "Creating cairo context and obtaining a font face\n"); + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + cr = cairo_create (surface); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + cairo_test_log (ctx, "Testing return value of cairo_font_face_get_type\n"); + + font_face = cairo_get_font_face (cr); + + if (cairo_font_face_get_type (font_face) != CAIRO_FONT_TYPE_TOY) { + cairo_test_log (ctx, "Unexpected value %d from cairo_font_face_get_type (expected %d)\n", + cairo_font_face_get_type (font_face), CAIRO_FONT_TYPE_TOY); + status = CAIRO_TEST_FAILURE; + goto done; + } + + cairo_test_log (ctx, "Testing return value of cairo_get_scaled_font\n"); + + scaled_font = cairo_get_scaled_font (cr); + + if (cairo_scaled_font_get_font_face (scaled_font) != font_face) { + cairo_test_log (ctx, "Font face returned from the scaled font is different from that returned by the context\n"); + status = CAIRO_TEST_FAILURE; + goto done; + } + +done: + cairo_destroy (cr); + cairo_surface_destroy (surface); + + return status; +} + +CAIRO_TEST (font_face_get_type, + "Check the returned type from cairo_select_font_face.", + "font", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/font-matrix-translation.c b/test/font-matrix-translation.c new file mode 100644 index 000000000..465ac7cf4 --- /dev/null +++ b/test/font-matrix-translation.c @@ -0,0 +1,141 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 +#define PAD 4 +#define TEXT "text" + +static cairo_bool_t +text_extents_equal (const cairo_text_extents_t *A, + const cairo_text_extents_t *B) +{ + return A->x_bearing == B->x_bearing && + A->y_bearing == B->y_bearing && + A->width == B->width && + A->height == B->height && + A->x_advance == B->x_advance && + A->y_advance == B->y_advance; +} + +static cairo_test_status_t +box_text (const cairo_test_context_t *ctx, cairo_t *cr, + const char *utf8, + double x, double y) +{ + double line_width; + cairo_text_extents_t extents = {0}, scaled_extents = {0}; + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + + cairo_save (cr); + + cairo_text_extents (cr, utf8, &extents); + + scaled_font = cairo_get_scaled_font (cr); + cairo_scaled_font_text_extents (scaled_font, TEXT, &scaled_extents); + status = cairo_scaled_font_status (scaled_font); + if (status) + return cairo_test_status_from_status (ctx, status); + + if (! text_extents_equal (&extents, &scaled_extents)) { + cairo_test_log (ctx, + "Error: extents differ when they shouldn't:\n" + "cairo_text_extents(); extents (%g, %g, %g, %g, %g, %g)\n" + "cairo_scaled_font_text_extents(); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance, + scaled_extents.x_bearing, scaled_extents.y_bearing, + scaled_extents.width, scaled_extents.height, + scaled_extents.x_advance, scaled_extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + line_width = cairo_get_line_width (cr); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + cairo_move_to (cr, x, y); + cairo_show_text (cr, utf8); + + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_test_status_t status; + cairo_text_extents_t extents; + cairo_matrix_t matrix; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_translate (cr, PAD, PAD); + cairo_set_line_width (cr, 1.0); + + cairo_text_extents (cr, TEXT, &extents); + + /* Draw text and bounding box */ + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + status = box_text (ctx, cr, TEXT, 0, - extents.y_bearing); + if (status) + return status; + + /* Then draw again with the same coordinates, but with a font + * matrix to position the text below and shifted a bit to the + * right. */ + cairo_matrix_init_translate (&matrix, TEXT_SIZE / 2, TEXT_SIZE + PAD); + cairo_matrix_scale (&matrix, TEXT_SIZE, TEXT_SIZE); + cairo_set_font_matrix (cr, &matrix); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + status = box_text (ctx, cr, TEXT, 0, - extents.y_bearing); + if (status) + return status; + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (font_matrix_translation, + "Test that translation in a font matrix can be used to offset a string", + "font", /* keywords */ + NULL, /* requirements */ + 38, 34, + NULL, draw) diff --git a/test/font-options.c b/test/font-options.c new file mode 100644 index 000000000..873a5c398 --- /dev/null +++ b/test/font-options.c @@ -0,0 +1,110 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_font_options_t *default_options; + cairo_font_options_t *nil_options; + cairo_surface_t *surface; + cairo_matrix_t identity; + cairo_t *cr; + cairo_scaled_font_t *scaled_font; + + /* first check NULL handling of cairo_font_options_t */ + default_options = cairo_font_options_create (); + assert (cairo_font_options_status (default_options) == CAIRO_STATUS_SUCCESS); + nil_options = cairo_font_options_copy (NULL); + assert (cairo_font_options_status (nil_options) == CAIRO_STATUS_NO_MEMORY); + + assert (cairo_font_options_equal (default_options, default_options)); + assert (! cairo_font_options_equal (default_options, nil_options)); + assert (! cairo_font_options_equal (NULL, nil_options)); + assert (! cairo_font_options_equal (nil_options, nil_options)); + assert (! cairo_font_options_equal (default_options, NULL)); + assert (! cairo_font_options_equal (NULL, default_options)); + + assert (cairo_font_options_hash (default_options) == cairo_font_options_hash (nil_options)); + assert (cairo_font_options_hash (NULL) == cairo_font_options_hash (nil_options)); + assert (cairo_font_options_hash (default_options) == cairo_font_options_hash (NULL)); + + cairo_font_options_merge (NULL, NULL); + cairo_font_options_merge (default_options, NULL); + cairo_font_options_merge (default_options, nil_options); + + cairo_font_options_set_antialias (NULL, CAIRO_ANTIALIAS_DEFAULT); + cairo_font_options_get_antialias (NULL); + assert (cairo_font_options_get_antialias (default_options) == CAIRO_ANTIALIAS_DEFAULT); + + cairo_font_options_set_subpixel_order (NULL, CAIRO_SUBPIXEL_ORDER_DEFAULT); + cairo_font_options_get_subpixel_order (NULL); + assert (cairo_font_options_get_subpixel_order (default_options) == CAIRO_SUBPIXEL_ORDER_DEFAULT); + + cairo_font_options_set_hint_style (NULL, CAIRO_HINT_STYLE_DEFAULT); + cairo_font_options_get_hint_style (NULL); + assert (cairo_font_options_get_hint_style (default_options) == CAIRO_HINT_STYLE_DEFAULT); + + cairo_font_options_set_hint_metrics (NULL, CAIRO_HINT_METRICS_DEFAULT); + cairo_font_options_get_hint_metrics (NULL); + assert (cairo_font_options_get_hint_metrics (default_options) == CAIRO_HINT_METRICS_DEFAULT); + + cairo_font_options_destroy (NULL); + cairo_font_options_destroy (default_options); + cairo_font_options_destroy (nil_options); + + + /* Now try creating fonts with NULLs */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 0, 0); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_matrix_init_identity (&identity); + scaled_font = cairo_scaled_font_create (cairo_get_font_face (cr), + &identity, &identity, + NULL); + assert (cairo_scaled_font_status (scaled_font) == CAIRO_STATUS_NULL_POINTER); + cairo_scaled_font_get_font_options (scaled_font, NULL); + cairo_scaled_font_destroy (scaled_font); + + assert (cairo_status (cr) == CAIRO_STATUS_SUCCESS); + cairo_get_font_options (cr, NULL); + cairo_set_font_options (cr, NULL); + assert (cairo_status (cr) == CAIRO_STATUS_NULL_POINTER); + + cairo_destroy (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (font_options, + "Check setters and getters on cairo_font_options_t.", + "font, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/ft-font-create-for-ft-face.c b/test/ft-font-create-for-ft-face.c new file mode 100644 index 000000000..52c838dd4 --- /dev/null +++ b/test/ft-font-create-for-ft-face.c @@ -0,0 +1,228 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +static void +_stress_font_cache (FT_Face ft_face, cairo_t *cr, int lvl); + +static cairo_font_face_t * +_load_font (FT_Face ft_face, int flags, cairo_t *cr, int lvl) +{ + cairo_font_face_t *font_face; + cairo_font_extents_t font_extents; + + _stress_font_cache (ft_face, cr, lvl+1); + + font_face = cairo_ft_font_face_create_for_ft_face (ft_face, flags); + + cairo_set_font_face (cr, font_face); + cairo_font_extents (cr, &font_extents); + + _stress_font_cache (ft_face, cr, lvl+1); + + return font_face; +} + +static void +_stress_font_cache (FT_Face ft_face, cairo_t *cr, int lvl) +{ +#define A _load_font (ft_face, 0, cr, lvl) +#define B _load_font (ft_face, FT_LOAD_NO_BITMAP, cr, lvl) +#define C _load_font (ft_face, FT_LOAD_NO_RECURSE, cr, lvl) +#define D _load_font (ft_face, FT_LOAD_FORCE_AUTOHINT, cr, lvl) + + cairo_font_face_t *font_face[4]; + + while (lvl++ < 5) { + font_face[0] = A; font_face[1] = A; + font_face[2] = A; font_face[3] = A; + cairo_font_face_destroy (font_face[0]); + cairo_font_face_destroy (font_face[1]); + cairo_font_face_destroy (font_face[2]); + cairo_font_face_destroy (font_face[3]); + + font_face[0] = A; font_face[1] = B; + font_face[2] = C; font_face[3] = D; + cairo_font_face_destroy (font_face[0]); + cairo_font_face_destroy (font_face[1]); + cairo_font_face_destroy (font_face[2]); + cairo_font_face_destroy (font_face[3]); + + font_face[0] = A; font_face[1] = B; + font_face[2] = C; font_face[3] = D; + cairo_font_face_destroy (font_face[3]); + cairo_font_face_destroy (font_face[2]); + cairo_font_face_destroy (font_face[1]); + cairo_font_face_destroy (font_face[0]); + + font_face[0] = A; + font_face[1] = A; + cairo_font_face_destroy (font_face[0]); + font_face[2] = A; + cairo_font_face_destroy (font_face[1]); + font_face[3] = A; + cairo_font_face_destroy (font_face[2]); + cairo_font_face_destroy (font_face[3]); + + font_face[0] = A; + font_face[1] = B; + cairo_font_face_destroy (font_face[0]); + font_face[2] = C; + cairo_font_face_destroy (font_face[1]); + font_face[3] = D; + cairo_font_face_destroy (font_face[2]); + cairo_font_face_destroy (font_face[3]); + } + +#undef A +#undef B +#undef C +#undef D +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + FcPattern *pattern, *resolved; + FcResult result; + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; + cairo_font_options_t *font_options; + cairo_font_extents_t font_extents; + cairo_matrix_t font_matrix, ctm; + FT_Face ft_face; + + /* We're trying here to get our hands on _some_ FT_Face but we do + * not at all care which one. So we start with an empty pattern + * and do the minimal substitution on it in order to get a valid + * pattern. + * + * Do not use this in production code! */ + pattern = FcPatternCreate (); + if (! pattern) { + cairo_test_log (ctx, "FcPatternCreate failed.\n"); + return cairo_test_status_from_status (ctx, CAIRO_STATUS_NO_MEMORY); + } + + FcConfigSubstitute (NULL, pattern, FcMatchPattern); + FcDefaultSubstitute (pattern); + resolved = FcFontMatch (NULL, pattern, &result); + if (! resolved) { + FcPatternDestroy (pattern); + cairo_test_log (ctx, "FcFontMatch failed.\n"); + return cairo_test_status_from_status (ctx, CAIRO_STATUS_NO_MEMORY); + } + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + if (cairo_font_face_status (font_face)) { + FcPatternDestroy (resolved); + FcPatternDestroy (pattern); + return cairo_test_status_from_status (ctx, cairo_font_face_status (font_face)); + } + + if (cairo_font_face_get_type (font_face) != CAIRO_FONT_TYPE_FT) { + cairo_test_log (ctx, "Unexpected value from cairo_font_face_get_type: %d (expected %d)\n", + cairo_font_face_get_type (font_face), CAIRO_FONT_TYPE_FT); + cairo_font_face_destroy (font_face); + FcPatternDestroy (resolved); + FcPatternDestroy (pattern); + return CAIRO_TEST_FAILURE; + } + + cairo_matrix_init_identity (&font_matrix); + + cairo_get_matrix (cr, &ctm); + + font_options = cairo_font_options_create (); + + cairo_get_font_options (cr, font_options); + + scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + font_options); + + cairo_font_options_destroy (font_options); + cairo_font_face_destroy (font_face); + FcPatternDestroy (pattern); + FcPatternDestroy (resolved); + + if (cairo_scaled_font_status (scaled_font)) { + return cairo_test_status_from_status (ctx, + cairo_scaled_font_status (scaled_font)); + } + + if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_FT) { + cairo_test_log (ctx, "Unexpected value from cairo_scaled_font_get_type: %d (expected %d)\n", + cairo_scaled_font_get_type (scaled_font), CAIRO_FONT_TYPE_FT); + cairo_scaled_font_destroy (scaled_font); + return CAIRO_TEST_FAILURE; + } + + ft_face = cairo_ft_scaled_font_lock_face (scaled_font); + if (ft_face == NULL) { + cairo_test_log (ctx, "Failed to get an ft_face with cairo_ft_scaled_font_lock_face\n"); + cairo_scaled_font_destroy (scaled_font); + return CAIRO_TEST_FAILURE; + } + + /* phew, that was a lot of work. But at least we didn't ever have + * to call freetype directly, nor did we have to make many (any?) + * assumptions about the current system. + * + * Now, on to the simple thing we actually want to test. + */ + + cairo_save (cr); + + /* First we want to test caching behaviour */ + _stress_font_cache (ft_face, cr, 0); + + /* Set the font_face and force cairo to actually use it for + * something. */ + font_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0); + cairo_set_font_face (cr, font_face); + cairo_font_extents (cr, &font_extents); + + cairo_restore (cr); + + /* Finally, even more cleanup */ + cairo_font_face_destroy (font_face); + cairo_ft_scaled_font_unlock_face (scaled_font); + cairo_scaled_font_destroy (scaled_font); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_font_create_for_ft_face, + "Simple test to verify that cairo_ft_font_create_for_ft_face doesn't crash.", + "ft, font", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) + diff --git a/test/ft-show-glyphs-positioning.c b/test/ft-show-glyphs-positioning.c new file mode 100644 index 000000000..449f8eb1f --- /dev/null +++ b/test/ft-show-glyphs-positioning.c @@ -0,0 +1,191 @@ +/* + * Copyright © 2008 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" +#include + +#define TEXT_SIZE 12 + +typedef struct { + cairo_glyph_t glyph_list[100]; + int num_glyphs; + double x; + double y; +} glyph_array_t; + +static void +glyph_array_init (glyph_array_t *glyphs, double x, double y) +{ + glyphs->num_glyphs = 0; + glyphs->x = x; + glyphs->y = y; +} + +static void +glyph_array_rel_move_to (glyph_array_t *glyphs, double x, double y) +{ + glyphs->x += x; + glyphs->y += y; +} + +static void +glyph_array_show (glyph_array_t *glyphs, cairo_t *cr) +{ + cairo_show_glyphs (cr, glyphs->glyph_list, glyphs->num_glyphs); +} + +#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) + +static cairo_status_t +glyph_array_add_text(glyph_array_t *glyphs, cairo_t *cr, const char *s, double spacing) +{ + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + FT_Face face; + unsigned long charcode; + unsigned int index; + cairo_text_extents_t extents; + const char *p; + FT_Vector kerning; + double kern_x; + int first = TRUE; + + scaled_font = cairo_get_scaled_font (cr); + status = cairo_scaled_font_status (scaled_font); + if (status) + return status; + + face = cairo_ft_scaled_font_lock_face (scaled_font); + if (face == NULL) + return CAIRO_STATUS_FONT_TYPE_MISMATCH; + + p = s; + while (*p) + { + charcode = *p; + index = FT_Get_Char_Index (face, charcode); + glyphs->glyph_list[glyphs->num_glyphs].index = index; + if (first) { + first = FALSE; + glyphs->glyph_list[glyphs->num_glyphs].x = glyphs->x; + glyphs->glyph_list[glyphs->num_glyphs].y = glyphs->y; + } else { + cairo_glyph_extents (cr, &glyphs->glyph_list[glyphs->num_glyphs - 1], 1, &extents); + FT_Get_Kerning (face, + glyphs->glyph_list[glyphs->num_glyphs - 1].index, + glyphs->glyph_list[glyphs->num_glyphs].index, + FT_KERNING_UNSCALED, + &kerning); + kern_x = DOUBLE_FROM_26_6(kerning.x); + glyphs->glyph_list[glyphs->num_glyphs].x = + glyphs->glyph_list[glyphs->num_glyphs - 1].x + extents.x_advance + kern_x + spacing; + glyphs->glyph_list[glyphs->num_glyphs].y = + glyphs->glyph_list[glyphs->num_glyphs - 1].y + extents.y_advance; + } + + cairo_glyph_extents (cr, &glyphs->glyph_list[glyphs->num_glyphs], 1, &extents); + glyphs->x = glyphs->glyph_list[glyphs->num_glyphs].x + extents.x_advance + spacing; + glyphs->y = glyphs->glyph_list[glyphs->num_glyphs].y + extents.y_advance; + p++; + glyphs->num_glyphs++; + } + + cairo_ft_scaled_font_unlock_face (scaled_font); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + glyph_array_t glyphs; + cairo_font_options_t *font_options; + cairo_status_t status; + + /* paint white so we don't need separate ref images for + * RGB24 and ARGB32 */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF); + cairo_set_font_options (cr, font_options); + cairo_font_options_destroy (font_options); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + + glyph_array_init (&glyphs, 1, TEXT_SIZE); + + status = glyph_array_add_text(&glyphs, cr, "AWAY again", 0.0); + if (status) + return cairo_test_status_from_status (ctx, status); + + glyph_array_rel_move_to (&glyphs, TEXT_SIZE*1, 0.0); + status = glyph_array_add_text(&glyphs, cr, "character space", TEXT_SIZE*0.3); + if (status) + return cairo_test_status_from_status (ctx, status); + + glyph_array_show (&glyphs, cr); + + + glyph_array_init (&glyphs, 1, TEXT_SIZE*2 + 4); + + status = glyph_array_add_text(&glyphs, cr, "Increasing", 0.0); + if (status) + return cairo_test_status_from_status (ctx, status); + + glyph_array_rel_move_to (&glyphs, TEXT_SIZE*0.5, 0.0); + status = glyph_array_add_text(&glyphs, cr, "space", 0.0); + if (status) + return cairo_test_status_from_status (ctx, status); + + glyph_array_rel_move_to (&glyphs, TEXT_SIZE*1.0, 0.0); + status = glyph_array_add_text(&glyphs, cr, "between", 0.0); + if (status) + return cairo_test_status_from_status (ctx, status); + + glyph_array_rel_move_to (&glyphs, TEXT_SIZE*1.5, 0.0); + status = glyph_array_add_text(&glyphs, cr, "words", 0.0); + if (status) + return cairo_test_status_from_status (ctx, status); + + glyph_array_show (&glyphs, cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_show_glyphs_positioning, + "Test that the PS/PDF glyph positioning optimizations are correct", + "ft, text", /* keywords */ + NULL, /* requirements */ + 235, (TEXT_SIZE + 4)*2, + NULL, draw) diff --git a/test/ft-show-glyphs-table.c b/test/ft-show-glyphs-table.c new file mode 100644 index 000000000..344392f40 --- /dev/null +++ b/test/ft-show-glyphs-table.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: Eugeniy Meshcheryakov + * Adrian Johnson + * Carl Worth + */ + +#include "cairo-test.h" +#include + +#define TEXT_SIZE 20 +#define PAD 10 +#define GRID_SIZE 30 +#define GRID_ROWS 10 +#define GRID_COLS 4 +#define NUM_GLYPHS (GRID_ROWS * GRID_COLS) +#define WIDTH (PAD + GRID_COLS * GRID_SIZE + PAD) +#define HEIGHT (PAD + GRID_ROWS * GRID_SIZE + PAD) + +/* This test was originally inspired by this bug report: + * + * Error when creating pdf charts for new FreeSerifItalic.ttf + * http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%23474136 + * + * The original assertion failure was fairly boring, but the later + * glyph mispositiing was quite interesting. And it turns out that the + * _cairo_pdf_operators_show_glyphs code is fairly convoluted with a + * code path that wasn't being exercised at all by the test suite. + * + * So this is an attempt to exercise that code path. Apparently laying + * glyphs out vertically in a table like this, (so that there's a + * large change in Y position from one glyph to the next), exercises + * the code well. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_options_t *font_options; + cairo_scaled_font_t *scaled_font; + FT_Face face; + FT_ULong charcode; + FT_UInt idx; + int i = 0; + cairo_glyph_t glyphs[NUM_GLYPHS]; + + /* paint white so we don't need separate ref images for + * RGB24 and ARGB32 */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF); + cairo_set_font_options (cr, font_options); + cairo_font_options_destroy (font_options); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + + scaled_font = cairo_get_scaled_font (cr); + face = cairo_ft_scaled_font_lock_face (scaled_font); + { + charcode = FT_Get_First_Char(face, &idx); + while (idx && (i < NUM_GLYPHS)) { + glyphs[i] = (cairo_glyph_t) {idx, PAD + GRID_SIZE * (i/GRID_ROWS), PAD + TEXT_SIZE + GRID_SIZE * (i%GRID_ROWS)}; + i++; + charcode = FT_Get_Next_Char(face, charcode, &idx); + } + } + cairo_ft_scaled_font_unlock_face (scaled_font); + + cairo_show_glyphs(cr, glyphs, i); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_show_glyphs_table, + "Test cairo_show_glyphs with cairo-ft backend and glyphs laid out in a table", + "ft, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) + diff --git a/test/ft-text-antialias-none.c b/test/ft-text-antialias-none.c new file mode 100644 index 000000000..64eea64f9 --- /dev/null +++ b/test/ft-text-antialias-none.c @@ -0,0 +1,146 @@ +/* + * Copyright © 2006 Jinghua Luo + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JINGHUA LUO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jinghua Luo + * Derived from: + * text-antialias-none.c, + * ft-font-create-for-ft-face.c. + * Original Author: Carl D. Worth + */ +#include "cairo-test.h" +#include + +#define WIDTH 40 +#define HEIGHT 30 +#define TEXT_SIZE 12 + +static cairo_status_t +create_scaled_font (cairo_t * cr, + cairo_scaled_font_t **out) +{ + FcPattern *pattern, *resolved; + FcResult result; + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; + cairo_font_options_t *font_options; + cairo_matrix_t font_matrix, ctm; + cairo_status_t status; + double pixel_size; + + font_options = cairo_font_options_create (); + + cairo_get_font_options (cr, font_options); + + pattern = FcPatternCreate (); + if (pattern == NULL) + return CAIRO_STATUS_NO_MEMORY; + + FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *) CAIRO_TEST_FONT_FAMILY " Sans"); + FcPatternAddDouble (pattern, FC_SIZE, TEXT_SIZE); + FcConfigSubstitute (NULL, pattern, FcMatchPattern); + + cairo_ft_font_options_substitute (font_options, pattern); + + FcDefaultSubstitute (pattern); + resolved = FcFontMatch (NULL, pattern, &result); + if (resolved == NULL) { + FcPatternDestroy (pattern); + return CAIRO_STATUS_NO_MEMORY; + } + + /* turn antialiasing off */ + FcPatternDel (resolved, FC_ANTIALIAS); + FcPatternAddBool (resolved, FC_ANTIALIAS, FcFalse); + + FcPatternGetDouble (resolved, FC_PIXEL_SIZE, 0, &pixel_size); + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + + cairo_matrix_init_identity (&font_matrix); + cairo_matrix_scale (&font_matrix, pixel_size, pixel_size); + + cairo_get_matrix (cr, &ctm); + + scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + font_options); + + cairo_font_options_destroy (font_options); + cairo_font_face_destroy (font_face); + FcPatternDestroy (pattern); + FcPatternDestroy (resolved); + + status = cairo_scaled_font_status (scaled_font); + if (status) { + cairo_scaled_font_destroy (scaled_font); + return status; + } + + *out = scaled_font; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + const char black[] = "black", blue[] = "blue"; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + status = create_scaled_font (cr, &scaled_font); + if (status) { + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_scaled_font (cr, scaled_font); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_text_extents (cr, black, &extents); + cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing); + cairo_show_text (cr, black); + cairo_translate (cr, 0, -extents.y_bearing + 1); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_text_extents (cr, blue, &extents); + cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing); + cairo_show_text (cr, blue); + + cairo_scaled_font_destroy (scaled_font); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_text_antialias_none, + "Tests text rendering with no antialiasing", + "ft, text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/ft-text-vertical-layout-type1.c b/test/ft-text-vertical-layout-type1.c new file mode 100644 index 000000000..c6f26a66a --- /dev/null +++ b/test/ft-text-vertical-layout-type1.c @@ -0,0 +1,167 @@ +/* + * Copyright © 2006 Jinghua Luo + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JINGHUA LUO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jinghua Luo + * Derived from: + * text-antialias-none.c, + * ft-font-create-for-ft-face.c. + * Original Author: Carl D. Worth + */ +#include "cairo-test.h" +#include + +#define WIDTH 80 +#define HEIGHT 240 +#define TEXT_SIZE 30 + +static cairo_status_t +create_scaled_font (cairo_t * cr, + cairo_scaled_font_t **out) +{ + FcPattern *pattern, *resolved; + FcResult result; + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; + cairo_font_options_t *font_options; + cairo_matrix_t font_matrix, ctm; + cairo_status_t status; + double pixel_size; + + font_options = cairo_font_options_create (); + + cairo_get_font_options (cr, font_options); + + pattern = FcPatternCreate (); + if (pattern == NULL) + return CAIRO_STATUS_NO_MEMORY; + + FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *)"Nimbus Sans L"); + FcPatternAddDouble (pattern, FC_PIXEL_SIZE, TEXT_SIZE); + FcConfigSubstitute (NULL, pattern, FcMatchPattern); + + cairo_ft_font_options_substitute (font_options, pattern); + + FcDefaultSubstitute (pattern); + resolved = FcFontMatch (NULL, pattern, &result); + if (resolved == NULL) { + FcPatternDestroy (pattern); + return CAIRO_STATUS_NO_MEMORY; + } + + /* set layout to vertical */ + FcPatternDel (resolved, FC_VERTICAL_LAYOUT); + FcPatternAddBool (resolved, FC_VERTICAL_LAYOUT, FcTrue); + + FcPatternGetDouble (resolved, FC_PIXEL_SIZE, 0, &pixel_size); + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + + cairo_matrix_init_translate (&font_matrix, 10, 30); + cairo_matrix_rotate (&font_matrix, M_PI_2/3); + cairo_matrix_scale (&font_matrix, pixel_size, pixel_size); + + cairo_get_matrix (cr, &ctm); + + scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + font_options); + + cairo_font_options_destroy (font_options); + cairo_font_face_destroy (font_face); + FcPatternDestroy (pattern); + FcPatternDestroy (resolved); + + status = cairo_scaled_font_status (scaled_font); + if (status) { + cairo_scaled_font_destroy (scaled_font); + return status; + } + + *out = scaled_font; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + const char text[] = "i-W"; + double line_width, x, y; + + line_width = cairo_get_line_width (cr); + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + status = create_scaled_font (cr, &scaled_font); + if (status) { + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_scaled_font (cr, scaled_font); + cairo_scaled_font_destroy (scaled_font); + + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_text_extents (cr, text, &extents); + x = width - (extents.width + extents.x_bearing) - 5; + y = height - (extents.height + extents.y_bearing) - 5; + cairo_move_to (cr, x, y); + cairo_show_text (cr, text); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_text_extents (cr, text, &extents); + x = -extents.x_bearing + 5; + y = -extents.y_bearing + 5; + cairo_move_to (cr, x, y); + cairo_text_path (cr, text); + cairo_fill (cr); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_text_vertical_layout_type1, + "Tests text rendering for vertical layout with Type1 fonts" + "\nCan fail if an incorrect font is loaded---need to bundle the desired font", + "ft, fc, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/ft-text-vertical-layout-type3.c b/test/ft-text-vertical-layout-type3.c new file mode 100644 index 000000000..0cea9dd80 --- /dev/null +++ b/test/ft-text-vertical-layout-type3.c @@ -0,0 +1,166 @@ +/* + * Copyright © 2006 Jinghua Luo + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JINGHUA LUO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jinghua Luo + * Derived from: + * text-antialias-none.c, + * ft-font-create-for-ft-face.c. + * Original Author: Carl D. Worth + */ +#include "cairo-test.h" +#include + +#define WIDTH 80 +#define HEIGHT 200 +#define TEXT_SIZE 30 + +static cairo_status_t +create_scaled_font (cairo_t * cr, + cairo_scaled_font_t **out) +{ + FcPattern *pattern, *resolved; + FcResult result; + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; + cairo_font_options_t *font_options; + cairo_matrix_t font_matrix, ctm; + cairo_status_t status; + double pixel_size; + + font_options = cairo_font_options_create (); + + cairo_get_font_options (cr, font_options); + + pattern = FcPatternCreate (); + if (pattern == NULL) + return CAIRO_STATUS_NO_MEMORY; + + FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *)CAIRO_TEST_FONT_FAMILY " Sans"); + FcPatternAddDouble (pattern, FC_PIXEL_SIZE, TEXT_SIZE); + FcConfigSubstitute (NULL, pattern, FcMatchPattern); + + cairo_ft_font_options_substitute (font_options, pattern); + + FcDefaultSubstitute (pattern); + resolved = FcFontMatch (NULL, pattern, &result); + if (resolved == NULL) { + FcPatternDestroy (pattern); + return CAIRO_STATUS_NO_MEMORY; + } + + /* set layout to vertical */ + FcPatternDel (resolved, FC_VERTICAL_LAYOUT); + FcPatternAddBool (resolved, FC_VERTICAL_LAYOUT, FcTrue); + + FcPatternGetDouble (resolved, FC_PIXEL_SIZE, 0, &pixel_size); + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + + cairo_matrix_init_translate (&font_matrix, 10, 30); + cairo_matrix_rotate (&font_matrix, M_PI_2/3); + cairo_matrix_scale (&font_matrix, pixel_size, pixel_size); + + cairo_get_matrix (cr, &ctm); + + scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + font_options); + + cairo_font_options_destroy (font_options); + cairo_font_face_destroy (font_face); + FcPatternDestroy (pattern); + FcPatternDestroy (resolved); + + status = cairo_scaled_font_status (scaled_font); + if (status) { + cairo_scaled_font_destroy (scaled_font); + return status; + } + + *out = scaled_font; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + cairo_scaled_font_t *scaled_font; + cairo_status_t status; + const char text[] = "i-W"; + double line_width, x, y; + + line_width = cairo_get_line_width (cr); + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + status = create_scaled_font (cr, &scaled_font); + if (status) { + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_scaled_font (cr, scaled_font); + cairo_scaled_font_destroy (scaled_font); + + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_text_extents (cr, text, &extents); + x = width - (extents.width + extents.x_bearing) - 5; + y = height - (extents.height + extents.y_bearing) - 5; + cairo_move_to (cr, x, y); + cairo_show_text (cr, text); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_text_extents (cr, text, &extents); + x = -extents.x_bearing + 5; + y = -extents.y_bearing + 5; + cairo_move_to (cr, x, y); + cairo_text_path (cr, text); + cairo_fill (cr); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_text_vertical_layout_type3, + "Tests text rendering for vertical layout with TrueType fonts", + "ft, fc, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/generate_refs.sh b/test/generate_refs.sh new file mode 100755 index 000000000..e22aa2548 --- /dev/null +++ b/test/generate_refs.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# A very simple script. But sufficient, hopefully, for our current purposes. + +cat < + */ + +#include "cairo-test.h" + +typedef struct { + cairo_operator_t op; + double tolerance; + cairo_fill_rule_t fill_rule; + double line_width; + cairo_line_cap_t line_cap; + cairo_line_join_t line_join; + double miter_limit; + cairo_matrix_t matrix; + double dash[5]; + double dash_offset; +} settings_t; + +/* Two sets of settings, no defaults */ +static const settings_t settings[] = { + { + CAIRO_OPERATOR_IN, + 2.0, + CAIRO_FILL_RULE_EVEN_ODD, + 7.7, + CAIRO_LINE_CAP_SQUARE, + CAIRO_LINE_JOIN_ROUND, + 3.14, + {2.0, 0.0, 0.0, 2.0, 5.0, 5.0}, + {0.1, 0.2, 0.3, 0.4, 0.5}, + 2.0 + }, + { + CAIRO_OPERATOR_ATOP, + 5.25, + CAIRO_FILL_RULE_WINDING, + 2.17, + CAIRO_LINE_CAP_ROUND, + CAIRO_LINE_JOIN_BEVEL, + 1000.0, + {-3.0, 1.0, 1.0, -3.0, -4, -4}, + {1.0, 2.0, 3.0, 4.0, 5.0}, + 3.0 + } +}; + +static void +settings_set (cairo_t *cr, const settings_t *settings) +{ + cairo_set_operator (cr, settings->op); + cairo_set_tolerance (cr, settings->tolerance); + cairo_set_fill_rule (cr, settings->fill_rule); + cairo_set_line_width (cr, settings->line_width); + cairo_set_line_cap (cr, settings->line_cap); + cairo_set_line_join (cr, settings->line_join); + cairo_set_miter_limit (cr, settings->miter_limit); + cairo_set_matrix (cr, &settings->matrix); + cairo_set_dash (cr, settings->dash, 5, settings->dash_offset); +} + +static int +settings_get (cairo_t *cr, settings_t *settings) +{ + int count; + + settings->op = cairo_get_operator (cr); + settings->tolerance = cairo_get_tolerance (cr); + settings->fill_rule = cairo_get_fill_rule (cr); + settings->line_width = cairo_get_line_width (cr); + settings->line_cap = cairo_get_line_cap (cr); + settings->line_join = cairo_get_line_join (cr); + settings->miter_limit = cairo_get_miter_limit (cr); + cairo_get_matrix (cr, &settings->matrix); + + count = cairo_get_dash_count (cr); + if (count != 5) + return -1; + + cairo_get_dash (cr, settings->dash, &settings->dash_offset); + + return 0; +} + +static int +settings_equal (const settings_t *a, const settings_t *b) +{ + return (a->op == b->op && + a->tolerance == b->tolerance && + a->fill_rule == b->fill_rule && + a->line_width == b->line_width && + a->line_cap == b->line_cap && + a->line_join == b->line_join && + a->miter_limit == b->miter_limit && + a->matrix.xx == b->matrix.xx && + a->matrix.xy == b->matrix.xy && + a->matrix.x0 == b->matrix.x0 && + a->matrix.yx == b->matrix.yx && + a->matrix.yy == b->matrix.yy && + a->matrix.y0 == b->matrix.y0 && + memcmp(a->dash, b->dash, sizeof(a->dash)) == 0 && + a->dash_offset == b->dash_offset); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + settings_t check; + + settings_set (cr, &settings[0]); + + cairo_save (cr); + { + settings_set (cr, &settings[1]); + if (settings_get (cr, &check)) + return CAIRO_TEST_FAILURE; + + if (!settings_equal (&settings[1], &check)) + return CAIRO_TEST_FAILURE; + } + cairo_restore (cr); + + if (settings_get (cr, &check)) + return CAIRO_TEST_FAILURE; + + if (!settings_equal (&settings[0], &check)) + return CAIRO_TEST_FAILURE; + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (get_and_set, + "Tests calls to the most trivial cairo_get and cairo_set functions", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/get-clip.c b/test/get-clip.c new file mode 100644 index 000000000..f97db3f62 --- /dev/null +++ b/test/get-clip.c @@ -0,0 +1,264 @@ +/* + * Copyright © 2006 Novell, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Novell, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Novell, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Robert O'Callahan + */ + +#include "cairo-test.h" +#include + +static cairo_bool_t +check_count (const cairo_test_context_t *ctx, + const char *message, + cairo_rectangle_list_t *list, int expected) +{ + if (list->status != CAIRO_STATUS_SUCCESS) { + cairo_test_log (ctx, "Error: %s; cairo_copy_clip_rectangle_list failed with \"%s\"\n", + message, cairo_status_to_string(list->status)); + return 0; + } + + if (list->num_rectangles == expected) + return 1; + cairo_test_log (ctx, "Error: %s; expected %d rectangles, got %d\n", message, + expected, list->num_rectangles); + return 0; +} + +static cairo_bool_t +check_unrepresentable (const cairo_test_context_t *ctx, const char *message, cairo_rectangle_list_t *list) +{ + if (list->status != CAIRO_STATUS_CLIP_NOT_REPRESENTABLE) { + cairo_test_log (ctx, "Error: %s; cairo_copy_clip_rectangle_list got unexpected result \"%s\"\n" + " (we expected CAIRO_STATUS_CLIP_NOT_REPRESENTABLE)", + message, cairo_status_to_string(list->status)); + return 0; + } + return 1; +} + +static cairo_bool_t +check_rectangles_contain (const cairo_test_context_t *ctx, + const char *message, + cairo_rectangle_list_t *list, + double x, double y, double width, double height) +{ + int i; + + for (i = 0; i < list->num_rectangles; ++i) { + if (list->rectangles[i].x == x && list->rectangles[i].y == y && + list->rectangles[i].width == width && list->rectangles[i].height == height) + return 1; + } + cairo_test_log (ctx, "Error: %s; rectangle list does not contain rectangle %f,%f,%f,%f\n", + message, x, y, width, height); + return 0; +} + +static cairo_bool_t +check_clip_extents (const cairo_test_context_t *ctx, + const char *message, cairo_t *cr, + double x, double y, double width, double height) +{ + double ext_x1, ext_y1, ext_x2, ext_y2; + cairo_clip_extents (cr, &ext_x1, &ext_y1, &ext_x2, &ext_y2); + if (ext_x1 == x && ext_y1 == y && ext_x2 == x + width && ext_y2 == y + height) + return 1; + if (width == 0.0 && height == 0.0 && ext_x1 == ext_x2 && ext_y1 == ext_y2) + return 1; + cairo_test_log (ctx, "Error: %s; clip extents %f,%f,%f,%f should be %f,%f,%f,%f\n", + message, ext_x1, ext_y1, ext_x2 - ext_x1, ext_y2 - ext_y1, + x, y, width, height); + return 0; +} + +#define SIZE 100 + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_t *cr; + cairo_rectangle_list_t *rectangle_list; + const char *phase; + cairo_bool_t completed = 0; + cairo_status_t status; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, SIZE, SIZE); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + + /* first, test basic stuff. This should not be clipped, it should + return the surface rectangle. */ + phase = "No clip set"; + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 1) || + ! check_clip_extents (ctx, phase, cr, 0, 0, SIZE, SIZE) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 0, 0, SIZE, SIZE)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + + /* We should get the same results after applying a clip that contains the + existing clip. */ + phase = "Clip beyond surface extents"; + cairo_save (cr); + cairo_rectangle (cr, -10, -10, SIZE + 20 , SIZE + 20); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 1) || + ! check_clip_extents (ctx, phase, cr, 0, 0, SIZE, SIZE) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 0, 0, SIZE, SIZE)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + /* Test simple clip rect. */ + phase = "Simple clip rect"; + cairo_save (cr); + cairo_rectangle (cr, 10, 10, 80, 80); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 1) || + ! check_clip_extents (ctx, phase, cr, 10, 10, 80, 80) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 10, 10, 80, 80)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + /* Test everything clipped out. */ + phase = "All clipped out"; + cairo_save (cr); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 0) || + ! check_clip_extents (ctx, phase, cr, 0, 0, 0, 0)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + /* test two clip rects */ + phase = "Two clip rects"; + cairo_save (cr); + cairo_rectangle (cr, 10, 10, 10, 10); + cairo_rectangle (cr, 20, 20, 10, 10); + cairo_clip (cr); + cairo_rectangle (cr, 15, 15, 10, 10); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 2) || + ! check_clip_extents (ctx, phase, cr, 15, 15, 10, 10) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 15, 15, 5, 5) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 20, 20, 5, 5)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + /* test non-rectangular clip */ + phase = "Nonrectangular clip"; + cairo_save (cr); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 100, 100); + cairo_line_to (cr, 100, 0); + cairo_close_path (cr); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + /* can't get this in one tight user-space rectangle */ + if (! check_unrepresentable (ctx, phase, rectangle_list) || + ! check_clip_extents (ctx, phase, cr, 0, 0, 100, 100)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + phase = "User space, simple scale, getting clip with same transform"; + cairo_save (cr); + cairo_scale (cr, 2, 2); + cairo_rectangle (cr, 5, 5, 40, 40); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 1) || + ! check_clip_extents (ctx, phase, cr, 5, 5, 40, 40) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 5, 5, 40, 40)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + phase = "User space, simple scale, getting clip with no transform"; + cairo_save (cr); + cairo_save (cr); + cairo_scale (cr, 2, 2); + cairo_rectangle (cr, 5, 5, 40, 40); + cairo_restore (cr); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_count (ctx, phase, rectangle_list, 1) || + ! check_clip_extents (ctx, phase, cr, 10, 10, 80, 80) || + ! check_rectangles_contain (ctx, phase, rectangle_list, 10, 10, 80, 80)) + { + goto FAIL; + } + cairo_rectangle_list_destroy (rectangle_list); + cairo_restore (cr); + + phase = "User space, rotation, getting clip with no transform"; + cairo_save (cr); + cairo_save (cr); + cairo_rotate (cr, 12); + cairo_rectangle (cr, 5, 5, 40, 40); + cairo_restore (cr); + cairo_clip (cr); + rectangle_list = cairo_copy_clip_rectangle_list (cr); + if (! check_unrepresentable (ctx, phase, rectangle_list)) + goto FAIL; + + completed = 1; +FAIL: + cairo_rectangle_list_destroy (rectangle_list); + status = cairo_status (cr); + cairo_destroy (cr); + + if (!completed) + return CAIRO_TEST_FAILURE; + + return cairo_test_status_from_status (ctx, status); +} + +CAIRO_TEST (get_clip, + "Test cairo_copy_clip_rectangle_list and cairo_clip_extents", + "clip, extents", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/get-group-target.c b/test/get-group-target.c new file mode 100644 index 000000000..5aff19b29 --- /dev/null +++ b/test/get-group-target.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 8 +#define PAD 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *group; + double x, y; + + /* First paint background in blue. */ + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + cairo_paint (cr); + + /* Then clip so that the group surface ends up smaller than the + * original surface. */ + cairo_rectangle (cr, PAD, PAD, width - 2 * PAD, height - 2 * PAD); + cairo_clip (cr); + + /* Paint the clipped region in red (which should all be overwritten later). */ + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_paint (cr); + + /* Redirect to a new group and get that surface. */ + cairo_push_group (cr); + group = cairo_get_group_target (cr); + + /* Then paint in green what we query the group surface size to be. */ + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_surface_get_device_offset (group, &x, &y); + /* Or rather, we calculate the group surface size based on the + * only thing we can query which is the device offset. Ideally, + * the size would always be the minimal (width - 2 * PAD, height - + * 2 * PAD) based on the clip. But currently, group targets are + * created oversized for paginated surfaces, so we only subtract + * anything from the size if there is a non-zero device offfset. + * + * The calculation below might also be less confusing if the sign + * convention on the device offset were reversed, but it is what + * it is. Oh well. */ + cairo_rectangle (cr, + -x, -y, + width + 2 * x, + height + 2 * y); + cairo_fill (cr); + + /* Finish up the group painting. */ + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (get_group_target, + "Test of both cairo_get_group_target and cairo_surface_get_device_offset", + "api", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/get-path-extents.c b/test/get-path-extents.c new file mode 100644 index 000000000..3b80d1e03 --- /dev/null +++ b/test/get-path-extents.c @@ -0,0 +1,443 @@ +/* + * Copyright © 2006 Novell, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Novell, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Novell, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Robert O'Callahan + */ + +#include "cairo-test.h" +#include +#include + +enum ExtentsType { FILL, STROKE, PATH }; + +enum Relation { EQUALS, APPROX_EQUALS, CONTAINS }; + + +static cairo_bool_t within_tolerance(double x1, double y1, + double x2, double y2, + double expected_x1, double expected_y1, + double expected_x2, double expected_y2, + double tolerance) +{ + return (fabs (expected_x1 - x1) < tolerance && + fabs (expected_y1 - y1) < tolerance && + fabs (expected_x2 - x2) < tolerance && + fabs (expected_y2 - y2) < tolerance); +} + +static cairo_bool_t +check_extents (const cairo_test_context_t *ctx, + const char *message, cairo_t *cr, enum ExtentsType type, + enum Relation relation, + double x, double y, double width, double height) +{ + double ext_x1, ext_y1, ext_x2, ext_y2; + const char *type_string; + const char *relation_string; + + switch (type) { + default: + case FILL: + type_string = "fill"; + cairo_fill_extents (cr, &ext_x1, &ext_y1, &ext_x2, &ext_y2); + break; + case STROKE: + type_string = "stroke"; + cairo_stroke_extents (cr, &ext_x1, &ext_y1, &ext_x2, &ext_y2); + break; + case PATH: + type_string = "path"; + cairo_path_extents (cr, &ext_x1, &ext_y1, &ext_x2, &ext_y2); + break; + } + + /* ignore results after an error occurs */ + if (cairo_status (cr)) + return 1; + + switch (relation) { + default: + case EQUALS: + relation_string = "equal"; + if (within_tolerance(x, y, x + width, y + height, + ext_x1, ext_y1, ext_x2, ext_y2, + cairo_get_tolerance(cr))) + return 1; + break; + case APPROX_EQUALS: + relation_string = "approx. equal"; + if (within_tolerance(x, y, x + width, y + height, + ext_x1, ext_y1, ext_x2, ext_y2, + 1.)) + return 1; + break; + case CONTAINS: + relation_string = "contain"; + if (width == 0 || height == 0) { + /* odd test that doesn't really test anything... */ + return 1; + } + if (ext_x1 <= x && ext_y1 <= y && ext_x2 >= x + width && ext_y2 >= y + height) + return 1; + break; + } + + cairo_test_log (ctx, "Error: %s; %s extents (%g, %g) x (%g, %g) should %s (%g, %g) x (%g, %g)\n", + message, type_string, + ext_x1, ext_y1, ext_x2 - ext_x1, ext_y2 - ext_y1, + relation_string, + x, y, width, height); + return 0; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + cairo_t *cr2; + const char *phase; + const char string[] = "The quick brown fox jumps over the lazy dog."; + cairo_text_extents_t extents, scaled_font_extents; + cairo_status_t status; + int errors = 0; + + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR, 1000, 1000); + /* don't use cr accidentally */ + cr = NULL; + cr2 = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_line_width (cr2, 10); + cairo_set_line_join (cr2, CAIRO_LINE_JOIN_MITER); + cairo_set_miter_limit (cr2, 100); + + phase = "No path"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 0, 0, 0, 0); + + cairo_save (cr2); + + cairo_new_path (cr2); + cairo_move_to (cr2, 200, 400); + cairo_close_path (cr2); + phase = "Degenerate closed path"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0); + + cairo_new_path (cr2); + cairo_move_to (cr2, 200, 400); + cairo_rel_line_to (cr2, 0., 0.); + phase = "Degenerate line"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0); + + cairo_new_path (cr2); + cairo_move_to (cr2, 200, 400); + cairo_rel_curve_to (cr2, 0., 0., 0., 0., 0., 0.); + phase = "Degenerate curve"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0); + + cairo_new_path (cr2); + cairo_arc (cr2, 200, 400, 0., 0, 2 * M_PI); + phase = "Degenerate arc (R=0)"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0); + + cairo_new_path (cr2); + cairo_arc_negative (cr2, 200, 400, 0., 0, 2 * M_PI); + phase = "Degenerate negative arc (R=0)"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0); + + cairo_new_path (cr2); + cairo_arc (cr2, 200, 400, 10., 0, 0); + phase = "Degenerate arc (Θ=0)"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 210, 400, 0, 0); + + cairo_new_path (cr2); + cairo_arc_negative (cr2, 200, 400, 10., 0, 0); + phase = "Degenerate negative arc (Θ=0)"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 210, 400, 0, 0); + + cairo_new_path (cr2); + cairo_restore (cr2); + + /* Test that with CAIRO_LINE_CAP_ROUND, we get "dots" from + * cairo_move_to; cairo_rel_line_to(0,0) */ + cairo_save (cr2); + + cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr2, 20); + + cairo_move_to (cr2, 200, 400); + cairo_rel_line_to (cr2, 0, 0); + phase = "Single 'dot'"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 190, 390, 20, 20); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 200, 400, 0, 0); + + /* Add another dot without starting a new path */ + cairo_move_to (cr2, 100, 500); + cairo_rel_line_to (cr2, 0, 0); + phase = "Multiple 'dots'"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 90, 390, 120, 120); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 100, 400, 100, 100); + + cairo_new_path (cr2); + + cairo_restore (cr2); + + /* http://bugs.freedesktop.org/show_bug.cgi?id=7965 */ + phase = "A horizontal, open path"; + cairo_save (cr2); + cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr2, CAIRO_LINE_JOIN_ROUND); + cairo_move_to (cr2, 0, 180); + cairo_line_to (cr2, 750, 180); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, -5, 175, 760, 10); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 0, 180, 750, 0); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "A vertical, open path"; + cairo_save (cr2); + cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr2, CAIRO_LINE_JOIN_ROUND); + cairo_new_path (cr2); + cairo_move_to (cr2, 180, 0); + cairo_line_to (cr2, 180, 750); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 175, -5, 10, 760); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 180, 0, 0, 750); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "A degenerate open path"; + cairo_save (cr2); + cairo_set_line_cap (cr2, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr2, CAIRO_LINE_JOIN_ROUND); + cairo_new_path (cr2); + cairo_move_to (cr2, 180, 0); + cairo_line_to (cr2, 180, 0); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 0, 0, 0, 0); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 175, -5, 10, 10); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 180, 0, 0, 0); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "Simple rect"; + cairo_save (cr2); + cairo_rectangle (cr2, 10, 10, 80, 80); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 80, 80); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 5, 5, 90, 90); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 80, 80); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "Two rects"; + cairo_save (cr2); + cairo_rectangle (cr2, 10, 10, 10, 10); + cairo_rectangle (cr2, 20, 20, 10, 10); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 20, 20); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 5, 5, 30, 30); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 20, 20); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "Triangle"; + cairo_save (cr2); + cairo_move_to (cr2, 10, 10); + cairo_line_to (cr2, 90, 90); + cairo_line_to (cr2, 90, 10); + cairo_close_path (cr2); + /* miter joins protrude 5*(1+sqrt(2)) above the top-left corner and to + the right of the bottom-right corner */ + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 80, 80); + errors += !check_extents (ctx, phase, cr2, STROKE, CONTAINS, 0, 5, 95, 95); + errors += !check_extents (ctx, phase, cr2, PATH, CONTAINS, 10, 10, 80, 80); + cairo_new_path (cr2); + cairo_restore (cr2); + + cairo_save (cr2); + + cairo_set_line_width (cr2, 4); + + cairo_rectangle (cr2, 10, 10, 30, 30); + cairo_rectangle (cr2, 25, 10, 15, 30); + + cairo_set_fill_rule (cr2, CAIRO_FILL_RULE_EVEN_ODD); + phase = "EVEN_ODD overlapping rectangles"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 15, 30); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 8, 8, 34, 34); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 30, 30); + + /* Test other fill rule with the same path. */ + + cairo_set_fill_rule (cr2, CAIRO_FILL_RULE_WINDING); + phase = "WINDING overlapping rectangles"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 30, 30); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 8, 8, 34, 34); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 30, 30); + + /* Now, change the direction of the second rectangle and test both + * fill rules again. */ + cairo_new_path (cr2); + cairo_rectangle (cr2, 10, 10, 30, 30); + cairo_rectangle (cr2, 25, 40, 15, -30); + + cairo_set_fill_rule (cr2, CAIRO_FILL_RULE_EVEN_ODD); + phase = "EVEN_ODD overlapping rectangles"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 15, 30); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 8, 8, 34, 34); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 30, 30); + + /* Test other fill rule with the same path. */ + + cairo_set_fill_rule (cr2, CAIRO_FILL_RULE_WINDING); + phase = "WINDING overlapping rectangles"; + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 15, 30); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 8, 8, 34, 34); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 30, 30); + + cairo_new_path (cr2); + + cairo_restore (cr2); + + /* http://bugs.freedesktop.org/show_bug.cgi?id=7245 */ + phase = "Arc"; + cairo_save (cr2); + cairo_arc (cr2, 250.0, 250.0, 157.0, 5.147, 3.432); + cairo_set_line_width (cr2, 154.0); + errors += !check_extents (ctx, phase, cr2, STROKE, APPROX_EQUALS, 16, 38, 468, 446); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "Text"; + cairo_save (cr2); + cairo_select_font_face (cr2, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr2, 12); + cairo_text_extents (cr2, string, &extents); + /* double check that the two methods of measuring the text agree... */ + cairo_scaled_font_text_extents (cairo_get_scaled_font (cr2), + string, + &scaled_font_extents); + if (memcmp (&extents, &scaled_font_extents, sizeof (extents))) { + cairo_test_log (ctx, "Error: cairo_text_extents() does not match cairo_scaled_font_text_extents() - font extents (%f, %f) x (%f, %f) should be (%f, %f) x (%f, %f)\n", + scaled_font_extents.x_bearing, + scaled_font_extents.y_bearing, + scaled_font_extents.width, + scaled_font_extents.height, + extents.x_bearing, + extents.y_bearing, + extents.width, + extents.height); + errors++; + } + + cairo_move_to (cr2, -extents.x_bearing, -extents.y_bearing); + cairo_text_path (cr2, string); + cairo_set_line_width (cr2, 2.0); + /* XXX: We'd like to be able to use EQUALS here, but currently + * when hinting is enabled freetype returns integer extents. See + * http://cairographics.org/todo */ + errors += !check_extents (ctx, phase, cr2, FILL, APPROX_EQUALS, + 0, 0, extents.width, extents.height); + errors += !check_extents (ctx, phase, cr2, STROKE, APPROX_EQUALS, + -1, -1, extents.width+2, extents.height+2); + errors += !check_extents (ctx, phase, cr2, PATH, APPROX_EQUALS, + 0, 0, extents.width, extents.height); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "User space, simple scale, getting extents with same transform"; + cairo_save (cr2); + cairo_scale (cr2, 2, 2); + cairo_rectangle (cr2, 5, 5, 40, 40); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 5, 5, 40, 40); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 0, 0, 50, 50); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 5, 5, 40, 40); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "User space, simple scale, getting extents with no transform"; + cairo_save (cr2); + cairo_save (cr2); + cairo_scale (cr2, 2, 2); + cairo_rectangle (cr2, 5, 5, 40, 40); + cairo_restore (cr2); + errors += !check_extents (ctx, phase, cr2, FILL, EQUALS, 10, 10, 80, 80); + errors += !check_extents (ctx, phase, cr2, STROKE, EQUALS, 5, 5, 90, 90); + errors += !check_extents (ctx, phase, cr2, PATH, EQUALS, 10, 10, 80, 80); + cairo_new_path (cr2); + cairo_restore (cr2); + + phase = "User space, rotation, getting extents with transform"; + cairo_save (cr2); + cairo_rectangle (cr2, -50, -50, 50, 50); + cairo_rotate (cr2, -M_PI/4); + /* the path in user space is now (nearly) the square rotated by + 45 degrees about the origin. Thus its x1 and x2 are both nearly 0. + This should show any bugs where we just transform device-space + x1,y1 and x2,y2 to get the extents. */ + /* The largest axis-aligned square inside the rotated path has + side lengths 50*sqrt(2), so a bit over 35 on either side of + the axes. With the stroke width added to the rotated path, + the largest axis-aligned square is a bit over 38 on either side of + the axes. */ + errors += !check_extents (ctx, phase, cr2, FILL, CONTAINS, -35, -35, 35, 35); + errors += !check_extents (ctx, phase, cr2, STROKE, CONTAINS, -38, -38, 38, 38); + errors += !check_extents (ctx, phase, cr2, PATH, CONTAINS, -35, -35, 35, 35); + cairo_new_path (cr2); + cairo_restore (cr2); + + status = cairo_status (cr2); + cairo_destroy (cr2); + + if (status) + return cairo_test_status_from_status (ctx, status); + + return errors == 0 ? CAIRO_TEST_SUCCESS : CAIRO_TEST_FAILURE; +} + +CAIRO_TEST (get_path_extents, + "Test cairo_fill_extents and cairo_stroke_extents", + "extents, path", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/get-xrender-format.c b/test/get-xrender-format.c new file mode 100644 index 000000000..3228d57c6 --- /dev/null +++ b/test/get-xrender-format.c @@ -0,0 +1,122 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include "cairo-xlib.h" +#include "cairo-xlib-xrender.h" + +#include "cairo-boilerplate-xlib.h" + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + Display *dpy; + XRenderPictFormat *orig_format, *format; + cairo_surface_t *surface; + Pixmap pixmap; + int screen; + cairo_test_status_t result; + + result = CAIRO_TEST_UNTESTED; + + if (! cairo_test_is_target_enabled (ctx, "xlib")) + goto CLEANUP_TEST; + + dpy = XOpenDisplay (NULL); + if (! dpy) { + cairo_test_log (ctx, "Error: Cannot open display: %s, skipping.\n", + XDisplayName (NULL)); + goto CLEANUP_TEST; + } + + result = CAIRO_TEST_FAILURE; + + screen = DefaultScreen (dpy); + + cairo_test_log (ctx, "Testing with image surface.\n"); + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + + format = cairo_xlib_surface_get_xrender_format (surface); + if (format != NULL) { + cairo_test_log (ctx, "Error: expected NULL for image surface\n"); + goto CLEANUP_SURFACE; + } + + cairo_surface_destroy (surface); + + cairo_test_log (ctx, "Testing with non-xrender xlib surface.\n"); + + pixmap = XCreatePixmap (dpy, DefaultRootWindow (dpy), + 1, 1, DefaultDepth (dpy, screen)); + surface = cairo_xlib_surface_create (dpy, pixmap, + DefaultVisual (dpy, screen), + 1, 1); + orig_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen)); + format = cairo_xlib_surface_get_xrender_format (surface); + if (format != orig_format) { + cairo_test_log (ctx, "Error: did not receive the same format as XRenderFindVisualFormat\n"); + goto CLEANUP_PIXMAP; + } + cairo_surface_destroy (surface); + XFreePixmap (dpy, pixmap); + + cairo_test_log (ctx, "Testing with xlib xrender surface.\n"); + + orig_format = XRenderFindStandardFormat (dpy, PictStandardARGB32); + pixmap = XCreatePixmap (dpy, DefaultRootWindow (dpy), + 1, 1, 32); + surface = cairo_xlib_surface_create_with_xrender_format (dpy, + pixmap, + DefaultScreenOfDisplay (dpy), + orig_format, + 1, 1); + format = cairo_xlib_surface_get_xrender_format (surface); + if (format != orig_format) { + cairo_test_log (ctx, "Error: did not receive the same format originally set\n"); + goto CLEANUP_PIXMAP; + } + + result = CAIRO_TEST_SUCCESS; + + CLEANUP_PIXMAP: + XFreePixmap (dpy, pixmap); + CLEANUP_SURFACE: + cairo_surface_destroy (surface); + + XCloseDisplay (dpy); + + CLEANUP_TEST: + return result; +} + +CAIRO_TEST (get_xrender_format, + "Check XRender specific API", + "xrender, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/gl-device-release.c b/test/gl-device-release.c new file mode 100644 index 000000000..7f554be30 --- /dev/null +++ b/test/gl-device-release.c @@ -0,0 +1,182 @@ +/* + * Copyright © 2012 Igalia S.L. + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005 Red Hat, Inc + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * IGALIA S.L. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Martin Robinson + */ + +#include "cairo-test.h" +#include +#include + +static Window +create_test_window (Display *display, + GLXContext glx_context, + XVisualInfo *visual_info) +{ + Colormap colormap; + XSetWindowAttributes window_attributes; + Window window = None; + + colormap = XCreateColormap (display, + RootWindow (display, visual_info->screen), + visual_info->visual, + AllocNone); + window_attributes.colormap = colormap; + window_attributes.border_pixel = 0; + window = XCreateWindow (display, RootWindow (display, visual_info->screen), + -1, -1, 1, 1, 0, + visual_info->depth, + InputOutput, + visual_info->visual, + CWBorderPixel | CWColormap, &window_attributes); + XFreeColormap (display, colormap); + + XFlush (display); + return window; +} + +static cairo_bool_t +multithread_makecurrent_available (Display *display) +{ + const char *extensions = glXQueryExtensionsString (display, + DefaultScreen (display)); + return !! strstr(extensions, "GLX_MESA_multithread_makecurrent"); +} + +static void +draw_to_surface (cairo_surface_t *surface) +{ + cairo_t *cr = cairo_create (surface); + cairo_paint (cr); + cairo_destroy (cr); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *test_ctx) +{ + int rgba_attribs[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + None + }; + + XVisualInfo *visual_info; + GLXContext glx_context; + cairo_device_t *device; + Display *display; + Window test_window; + cairo_surface_t *window_surface; + cairo_bool_t has_multithread_makecurrent; + + display = XOpenDisplay (NULL); + if (display == NULL) + return CAIRO_TEST_UNTESTED; + + visual_info = glXChooseVisual (display, DefaultScreen (display), rgba_attribs); + if (visual_info == NULL) { + XCloseDisplay (display); + return CAIRO_TEST_UNTESTED; + } + + glx_context = glXCreateContext (display, visual_info, NULL, True); + if (glx_context == NULL) { + XCloseDisplay (display); + return CAIRO_TEST_UNTESTED; + } + + test_window = create_test_window (display, glx_context, visual_info); + XFree (visual_info); + if (test_window == None) { + XCloseDisplay (display); + return CAIRO_TEST_UNTESTED; + } + + has_multithread_makecurrent = multithread_makecurrent_available (display); + + glXMakeCurrent (display, None, None); + + /* Creating the device should actually change the GL context, because of + * the creation/activation of a dummy window used for texture surfaces. */ + device = cairo_glx_device_create (display, glx_context); + + /* It's important that when multithread_makecurrent isn't available the + * Cairo backend clears the current context, so that the dummy texture + * window is not active while the device is unlocked. */ + if (has_multithread_makecurrent) { + assert (None != glXGetCurrentDrawable ()); + assert (display == glXGetCurrentDisplay ()); + assert (glx_context == glXGetCurrentContext ()); + } else { + assert (None == glXGetCurrentDrawable ()); + assert (None == glXGetCurrentDisplay ()); + assert (None == glXGetCurrentContext ()); + } + + window_surface = cairo_gl_surface_create_for_window (device, test_window, + 1, 1); + assert (cairo_surface_status (window_surface) == CAIRO_STATUS_SUCCESS); + + draw_to_surface (window_surface); + if (has_multithread_makecurrent) { + assert (test_window == glXGetCurrentDrawable ()); + assert (display == glXGetCurrentDisplay ()); + assert (glx_context == glXGetCurrentContext ()); + } else { + assert (None == glXGetCurrentDrawable ()); + assert (None == glXGetCurrentDisplay ()); + assert (None == glXGetCurrentContext ()); + } + + /* In this case, drawing to the window surface will not change the current + * GL context, so Cairo setting the current surface and context to none. */ + glXMakeCurrent (display, test_window, glx_context); + draw_to_surface (window_surface); + assert (test_window == glXGetCurrentDrawable ()); + assert (display == glXGetCurrentDisplay ()); + assert (glx_context == glXGetCurrentContext ()); + + /* There should be no context change when destroying the device. */ + cairo_device_destroy (device); + assert (test_window == glXGetCurrentDrawable ()); + assert (display == glXGetCurrentDisplay ()); + assert (glx_context == glXGetCurrentContext ()); + + glXDestroyContext(display, glx_context); + XDestroyWindow (display, test_window); + XCloseDisplay (display); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (gl_device_creation_changes_context, + "Test that using the Cairo GL backend leaves the current GL context in the appropriate state", + "gl", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/gl-oversized-surface.c b/test/gl-oversized-surface.c new file mode 100644 index 000000000..4c46efd80 --- /dev/null +++ b/test/gl-oversized-surface.c @@ -0,0 +1,88 @@ +/* + * Copyright © 2012 Igalia S.L. + * Copyright © 2009 Eric Anholt + * Copyright © 2009 Chris Wilson + * Copyright © 2005 Red Hat, Inc + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * IGALIA S.L. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Martin Robinson + */ + +#include "cairo-test.h" +#include +#include +#include + +static cairo_test_status_t +preamble (cairo_test_context_t *test_ctx) +{ + int rgba_attribs[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + None + }; + + Display *display; + XVisualInfo *visual_info; + GLXContext glx_context; + cairo_device_t *device; + cairo_surface_t *oversized_surface; + cairo_test_status_t test_status = CAIRO_TEST_SUCCESS; + + display = XOpenDisplay (NULL); + if (display == NULL) + return CAIRO_TEST_UNTESTED; + + visual_info = glXChooseVisual (display, DefaultScreen (display), rgba_attribs); + if (visual_info == NULL) { + XCloseDisplay (display); + return CAIRO_TEST_UNTESTED; + } + + glx_context = glXCreateContext (display, visual_info, NULL, True); + if (glx_context == NULL) { + XCloseDisplay (display); + return CAIRO_TEST_UNTESTED; + } + + device = cairo_glx_device_create (display, glx_context); + + oversized_surface = cairo_gl_surface_create (device, CAIRO_CONTENT_COLOR_ALPHA, INT_MAX, INT_MAX); + if (cairo_surface_status (oversized_surface) != CAIRO_STATUS_INVALID_SIZE) + test_status = CAIRO_TEST_FAILURE; + + cairo_device_destroy (device); + glXDestroyContext(display, glx_context); + XCloseDisplay (display); + + return test_status; +} + +CAIRO_TEST (gl_oversized_surface, + "Test that creating a surface beyond texture limits results in an error surface", + "gl", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/gl-surface-source.c b/test/gl-surface-source.c new file mode 100644 index 000000000..09d4d9c47 --- /dev/null +++ b/test/gl-surface-source.c @@ -0,0 +1,111 @@ +/* + * Copyright © 2008 Chris Wilson + * Copyright © 2010 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#include + +#include "surface-source.c" + +struct closure { + Display *dpy; + GLXContext ctx; +}; + +static void +cleanup (void *data) +{ + struct closure *arg = data; + + glXDestroyContext (arg->dpy, arg->ctx); + XCloseDisplay (arg->dpy); + + free (arg); +} + +static cairo_surface_t * +create_source_surface (int size) +{ + int rgba_attribs[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + None + }; + XVisualInfo *visinfo; + GLXContext ctx; + struct closure *arg; + cairo_device_t *device; + cairo_surface_t *surface; + Display *dpy; + + dpy = XOpenDisplay (NULL); + if (dpy == NULL) + return NULL; + + visinfo = glXChooseVisual (dpy, DefaultScreen (dpy), rgba_attribs); + if (visinfo == NULL) { + XCloseDisplay (dpy); + return NULL; + } + + ctx = glXCreateContext (dpy, visinfo, NULL, True); + XFree (visinfo); + + if (ctx == NULL) { + XCloseDisplay (dpy); + return NULL; + } + + arg = xmalloc (sizeof (struct closure)); + arg->dpy = dpy; + arg->ctx = ctx; + device = cairo_glx_device_create (dpy, ctx); + if (cairo_device_set_user_data (device, + (cairo_user_data_key_t *) cleanup, + arg, + cleanup)) + { + cleanup (arg); + return NULL; + } + + surface = cairo_gl_surface_create (device, + CAIRO_CONTENT_COLOR_ALPHA, + size, size); + cairo_device_destroy (device); + + return surface; +} + +CAIRO_TEST (gl_surface_source, + "Test using a GL surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/glyph-cache-pressure.c b/test/glyph-cache-pressure.c new file mode 100644 index 000000000..eb4f7c5c2 --- /dev/null +++ b/test/glyph-cache-pressure.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include "cairo-boilerplate-scaled-font.h" + +#define TEXT_SIZE 12 + +/* Bug history + * + * 2006-06-22 Carl Worth + * + * This is a test case to demonstrate the following bug in the xlib backend: + * + * Some characters aren't displayed when using xlib (cache usage missing freeze/thaw) + * https://bugs.freedesktop.org/show_bug.cgi?id=6955 + * + * We replicate this bug by using the cairo_scaled_font_set_max_glyphs_per_font + * function to artificially induce cache pressure. (This function was added + * for this very purpose.) + * + * 2006-06-22 Carl Worth + * + * Bug was simple enough to solve by just adding a freeze/thaw pair + * around the scaled_font's glyph cache in + * _cairo_xlib_surface_show_glyphs, (I went ahead and added + * _cairo_sacled_font_freeze/thaw_cache functions for this). + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_boilerplate_scaled_font_set_max_glyphs_cached (cairo_get_scaled_font (cr), 1); + + cairo_move_to (cr, 1, TEXT_SIZE); + cairo_show_text (cr, "the five boxing wizards jump quickly"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (glyph_cache_pressure, + "Ensure that all backends behave well under artificial glyph cache pressure", + "stress", /* keywords */ + NULL, /* requirements */ + 223, TEXT_SIZE + 4, + NULL, draw) diff --git a/test/gradient-alpha.c b/test/gradient-alpha.c new file mode 100644 index 000000000..24cd3245f --- /dev/null +++ b/test/gradient-alpha.c @@ -0,0 +1,56 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *gradient; + + gradient = cairo_pattern_create_linear (0, -height, + 0, height); + cairo_pattern_add_color_stop_rgba (gradient, 0.0, + 1.0, 0.0, 0.0, + 1.0); + cairo_pattern_add_color_stop_rgba (gradient, 1.0, + 0.0, 0.0, 1.0, + 0.5); + + cairo_set_source (cr, gradient); + + cairo_paint (cr); + + cairo_pattern_destroy (gradient); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (gradient_alpha, + "Tests drawing of a gradient with various alpha values in the color stops", + "gradient, alpha", /* keywords */ + NULL, /* requirements */ + 10, 10, + NULL, draw) diff --git a/test/gradient-constant-alpha.c b/test/gradient-constant-alpha.c new file mode 100644 index 000000000..7640b6eb5 --- /dev/null +++ b/test/gradient-constant-alpha.c @@ -0,0 +1,61 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *gradient; + + gradient = cairo_pattern_create_linear (0, 0, + 0, height); + cairo_pattern_add_color_stop_rgba (gradient, 0.0, + 1.0, 0.0, 0.0, + 0.5); + cairo_pattern_add_color_stop_rgba (gradient, 0.0, + 0.0, 1.0, 0.0, + 0.5); + cairo_pattern_add_color_stop_rgba (gradient, 1.0, + 0.0, 0.0, 1.0, + 0.5); + + cairo_set_source (cr, gradient); + + cairo_paint (cr); + + cairo_pattern_destroy (gradient); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (gradient_constant_alpha, + "Tests drawing of a gradient with constant alpha values in the color stops", + "gradient, alpha", /* keywords */ + NULL, + 10, 10, + NULL, draw) diff --git a/test/gradient-zero-stops-mask.c b/test/gradient-zero-stops-mask.c new file mode 100644 index 000000000..b2a10ec34 --- /dev/null +++ b/test/gradient-zero-stops-mask.c @@ -0,0 +1,59 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2007 Brian Ewins + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Brian Ewins + * Contributor(s): + * Andrea Canciani + */ + +#include "cairo-test.h" + +/* This test case is designed to exercise the opaque test for + * gradients with no stop. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pat; + + cairo_set_source_rgb (cr, 1., 0., 0.); + + pat = cairo_pattern_create_linear (0., 0., 1., 1.); + cairo_mask (cr, pat); + cairo_pattern_destroy (pat); + + pat = cairo_pattern_create_radial (0., 0., 0., 1., 1., 1.); + cairo_mask (cr, pat); + cairo_pattern_destroy (pat); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (gradient_zero_stops_mask, + "Verifies that gradients with no stops are considered clear.", + "gradient", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/gradient-zero-stops.c b/test/gradient-zero-stops.c new file mode 100644 index 000000000..57a91c536 --- /dev/null +++ b/test/gradient-zero-stops.c @@ -0,0 +1,58 @@ +/* + * Copyright © 2007 Brian Ewins + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Brian Ewins + */ + +#include "cairo-test.h" + +/* This test case is designed to exercise the following bug: + * + * Crash when trying to paint gradient with no stops + * https://bugzilla.mozilla.org/show_bug.cgi?id=407104 + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pat; + + pat = cairo_pattern_create_linear (0., 0., 1., 1.); + cairo_set_source (cr, pat); + cairo_paint (cr); + cairo_pattern_destroy (pat); + + pat = cairo_pattern_create_radial (0., 0., 0., 1., 1., 1.); + cairo_set_source (cr, pat); + cairo_paint (cr); + cairo_pattern_destroy (pat); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (gradient_zero_stops, + "Verifies that gradients with no stops don't cause problems.", + "gradient", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/group-clip.c b/test/group-clip.c new file mode 100644 index 000000000..b99d8617e --- /dev/null +++ b/test/group-clip.c @@ -0,0 +1,57 @@ +/* + * Copyright © Chris Wilson, 2008 + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Chris Wilson + * Larry Ewing + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_rectangle (cr, 25, 25, width, height); + cairo_clip_preserve (cr); + cairo_push_group (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill (cr); + cairo_rectangle (cr, 0, 0, width, height); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + cairo_reset_clip (cr); + cairo_clip_preserve (cr); + cairo_set_source_rgba (cr, 1, 0, 0, .5); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (group_clip, + "test preserving paths across groups", + "group", /* keywords */ + NULL, /* requirements */ + 40 + 25, 40 + 25, + NULL, draw) diff --git a/test/group-paint.c b/test/group-paint.c new file mode 100644 index 000000000..38544856f --- /dev/null +++ b/test/group-paint.c @@ -0,0 +1,48 @@ +/* + * Copyright © Chris Wilson, 2008 + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_push_group (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (group_paint, + "test push_group(); pop_group_to_source(); set_operator(SOURCE); paint();", + "group", /* keywords */ + NULL, /* requirements */ + 10, 10, + NULL, draw) diff --git a/test/group-state.c b/test/group-state.c new file mode 100644 index 000000000..a96b2e3d0 --- /dev/null +++ b/test/group-state.c @@ -0,0 +1,96 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define CHECK_STATUS(status) \ + do { \ + if (cairo_status (cr) != (status)) { \ + cairo_test_log (ctx, "Expected status: %s\n", \ + cairo_status_to_string (status)); \ + cairo_test_log (ctx, "Actual status: %s\n", \ + cairo_status_to_string (cairo_status (cr))); \ + result = CAIRO_TEST_FAILURE; \ + } \ + } while (0) + +static void +reinit_cairo (cairo_t **cr) +{ + if (*cr) + cairo_destroy (*cr); + + *cr = cairo_create (cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1)); + cairo_surface_destroy (cairo_get_target (*cr)); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_test_status_t result = CAIRO_TEST_SUCCESS; + + cr = NULL; + + reinit_cairo (&cr); + + /* cairo_restore() must fail with CAIRO_STATUS_INVALID_RESTORE if + * no matching cairo_save() call has been performed. */ + cairo_test_log (ctx, "Checking save(); push(); restore();\n"); + cairo_save (cr); + CHECK_STATUS (CAIRO_STATUS_SUCCESS); + cairo_push_group (cr); + CHECK_STATUS (CAIRO_STATUS_SUCCESS); + cairo_restore (cr); + CHECK_STATUS (CAIRO_STATUS_INVALID_RESTORE); + + + reinit_cairo (&cr); + + /* cairo_restore() must fail with CAIRO_STATUS_INVALID_RESTORE if + * no matching cairo_save() call has been performed. */ + cairo_test_log (ctx, "Checking push(); save(); pop();\n"); + cairo_push_group (cr); + CHECK_STATUS (CAIRO_STATUS_SUCCESS); + cairo_save (cr); + CHECK_STATUS (CAIRO_STATUS_SUCCESS); + cairo_pop_group_to_source (cr); + CHECK_STATUS (CAIRO_STATUS_INVALID_POP_GROUP); + + + cairo_destroy (cr); + + return result; +} + +CAIRO_TEST (group_state, + "Tests the interaction between state (cairo_save, cairo_restore) " + "and group (cairo_push_group/cairo_pop_group) API", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/group-unaligned.c b/test/group-unaligned.c new file mode 100644 index 000000000..9124a032c --- /dev/null +++ b/test/group-unaligned.c @@ -0,0 +1,60 @@ +/* + * Copyright © Chris Wilson, 2008 + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Chris Wilson + * Stefan Röllin + */ + +#include "cairo-test.h" + +static void +circle (cairo_t* cr, double xc, double yc, double radius) +{ + cairo_arc (cr, xc, yc, radius, 0.0, 2*M_PI); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + circle (cr, 12.5, 12.5, 10.); + cairo_fill (cr); + + cairo_push_group (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + circle (cr, 12.5, 12.5, 10.); + cairo_fill (cr); + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (group_unaligned, + "test non-integer sized sub-surface", + "group", /* keywords */ + NULL, /* requirements */ + 35.5, 35.5, + NULL, draw) diff --git a/test/half-coverage.c b/test/half-coverage.c new file mode 100644 index 000000000..38cafda75 --- /dev/null +++ b/test/half-coverage.c @@ -0,0 +1,155 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Test the fidelity of the rasterisation, because Cairo is my favourite + * driver test suite. + */ + +#define SIZE 256 +#define WIDTH 2 +#define HEIGHT 10 + +static cairo_test_status_t +rectangles (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_paint (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + + for (i = 1; i <= SIZE; i++) { + int x, y; + + cairo_save (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + cairo_scale (cr, 1./SIZE, 1./SIZE); + for (x = -i; x < SIZE*WIDTH; x += 2*i) { + for (y = -i; y < SIZE*HEIGHT; y += 2*i) { + /* Add a little tile composed of two non-overlapping squares + * +--+ + * | | + * |__|__ + * | | + * | | + * +--+ + */ + cairo_rectangle (cr, x, y, i, i); + cairo_rectangle (cr, x+i, y+i, i, i); + } + } + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +triangles (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_paint (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + + for (i = 1; i <= SIZE; i++) { + int x, y; + + cairo_save (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + cairo_scale (cr, 1./SIZE, 1./SIZE); + for (x = -i; x < SIZE*WIDTH; x += 2*i) { + for (y = -i; y < SIZE*HEIGHT; y += 2*i) { + /* Add a tile composed of four non-overlapping + * triangles. The plus and minus signs inside the + * triangles denote the orientation of the triangle's + * edges: + for clockwise and - for anticlockwise. + * + * +-----+ + * \-|+/ + * \|/ + * /|\ + * /-|-\ + * +-----+ + */ + + /* top left triangle */ + cairo_move_to (cr, x, y); + cairo_line_to (cr, x+i, y+i); + cairo_line_to (cr, x+i, y); + cairo_close_path (cr); + + /* top right triangle */ + cairo_move_to (cr, x+i, y); + cairo_line_to (cr, x+2*i, y); + cairo_line_to (cr, x+i, y+i); + cairo_close_path (cr); + + /* bottom left triangle */ + cairo_move_to (cr, x+i, y+i); + cairo_line_to (cr, x, y+2*i); + cairo_line_to (cr, x+i, y+2*i); + cairo_close_path (cr); + + /* bottom right triangle */ + cairo_move_to (cr, x+i, y+i); + cairo_line_to (cr, x+i, y+2*i); + cairo_line_to (cr, x+2*i, y+2*i); + cairo_close_path (cr); + } + } + cairo_fill (cr); + cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (half_coverage_rectangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster slow", /* requirements */ + WIDTH * SIZE, HEIGHT, + NULL, rectangles) + +CAIRO_TEST (half_coverage_triangles, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster slow", /* requirements */ + WIDTH * SIZE, HEIGHT, + NULL, triangles) diff --git a/test/halo.c b/test/halo.c new file mode 100644 index 000000000..30064e51a --- /dev/null +++ b/test/halo.c @@ -0,0 +1,158 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Try to replicate the misbehaviour of show_glyphs() versus glyph_path() + * in the PDF backend reported by Ian Britten. + */ + +static void +halo_around_path (cairo_t *cr, const char *str) +{ + cairo_text_path (cr, str); + + cairo_set_source_rgb (cr, 0, .5, 1); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, 1, .5, 0); + cairo_fill (cr); +} + +static void +halo_around_text (cairo_t *cr, const char *str) +{ + double x, y; + + cairo_get_current_point (cr, &x, &y); + cairo_text_path (cr, str); + + cairo_set_source_rgb (cr, 0, .5, 1); + cairo_stroke(cr); + + cairo_set_source_rgb (cr, 1, .5, 0); + cairo_move_to (cr, x, y); + cairo_show_text (cr, str); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const char *string = "0123456789"; + cairo_text_extents_t extents; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_text_extents (cr, string, &extents); + + cairo_set_font_size (cr, 12); + cairo_set_line_width (cr, 3); + cairo_move_to (cr, 9, 4 + extents.height); + halo_around_path (cr, string); + + cairo_move_to (cr, 109, 4 + extents.height); + halo_around_text (cr, string); + + cairo_set_font_size (cr, 6); + cairo_set_line_width (cr, 3); + cairo_move_to (cr, 19 + extents.width, 20 + extents.height); + halo_around_path (cr, "0"); + + cairo_move_to (cr, 119 + extents.width, 20 + extents.height); + halo_around_text (cr, "0"); + + cairo_set_font_size (cr, 64); + cairo_set_line_width (cr, 10); + cairo_move_to (cr, 8, 70); + halo_around_path (cr, "6"); + cairo_move_to (cr, 32, 90); + halo_around_path (cr, "7"); + + cairo_move_to (cr, 108, 70); + halo_around_text (cr, "6"); + cairo_move_to (cr, 132, 90); + halo_around_text (cr, "7"); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_transform (cairo_t *cr, int width, int height) +{ + const char *string = "0123456789"; + cairo_text_extents_t extents; + + cairo_translate (cr, 50, 50); + cairo_scale (cr, M_SQRT2, M_SQRT2); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_text_extents (cr, string, &extents); + + cairo_set_line_width (cr, 3); + cairo_move_to (cr, 9, 4 + extents.height); + halo_around_path (cr, string); + + cairo_move_to (cr, 109, 4 + extents.height); + halo_around_text (cr, string); + + cairo_set_font_size (cr, 6); + cairo_set_line_width (cr, 3); + cairo_move_to (cr, 19 + extents.width, 20 + extents.height); + halo_around_path (cr, "0"); + + cairo_move_to (cr, 119 + extents.width, 20 + extents.height); + halo_around_text (cr, "0"); + + cairo_set_font_size (cr, 64); + cairo_set_line_width (cr, 10); + cairo_move_to (cr, 8, 70); + halo_around_path (cr, "6"); + cairo_move_to (cr, 32, 90); + halo_around_path (cr, "7"); + + cairo_move_to (cr, 108, 70); + halo_around_text (cr, "6"); + cairo_move_to (cr, 132, 90); + halo_around_text (cr, "7"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (halo, + "Check the show_glyphs() vs glyph_path()", + "text", /* keywords */ + NULL, /* requirements */ + 200, 100, + NULL, draw) + +CAIRO_TEST (halo_transform, + "Check the show_glyphs() vs glyph_path()", + "text", /* keywords */ + NULL, /* requirements */ + 400, 200, + NULL, draw_transform) diff --git a/test/hatchings.c b/test/hatchings.c new file mode 100644 index 000000000..ca3f2c6af --- /dev/null +++ b/test/hatchings.c @@ -0,0 +1,153 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define STEP 5 +#define WIDTH 100 +#define HEIGHT 100 + +static void hatching (cairo_t *cr) +{ + int i; + + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + for (i = 0; i < WIDTH; i += STEP) { + cairo_rectangle (cr, i-1, -2, 2, HEIGHT+4); + cairo_rectangle (cr, -2, i-1, WIDTH+4, 2); + } +} + +static void background (cairo_t *cr) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); +} + +static void clip_to_quadrant (cairo_t *cr) +{ + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); +} + +static void draw_hatching (cairo_t *cr, void (*func) (cairo_t *)) +{ + cairo_save (cr); { + clip_to_quadrant (cr); + hatching (cr); + func (cr); + } cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + cairo_save (cr); { + clip_to_quadrant (cr); + cairo_translate (cr, 0.25, 0.25); + hatching (cr); + func (cr); + } cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); + + cairo_save (cr); { + clip_to_quadrant (cr); + cairo_translate (cr, WIDTH/2, HEIGHT/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -WIDTH/2, -HEIGHT/2); + hatching (cr); + func (cr); + } cairo_restore (cr); + + cairo_translate (cr, WIDTH, 0); +} + +static void do_clip (cairo_t *cr) +{ + cairo_clip (cr); + cairo_paint (cr); +} + +static void do_clip_alpha (cairo_t *cr) +{ + cairo_clip (cr); + cairo_paint_with_alpha (cr, .5); +} + +static void hatchings (cairo_t *cr, void (*func) (cairo_t *)) +{ + cairo_save (cr); { + cairo_set_source_rgb(cr, 1, 0, 0); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); + draw_hatching (cr, func); + cairo_set_source_rgb(cr, 0, 0, 1); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + draw_hatching (cr, func); + } cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + background (cr); + + + /* aligned, misaligned, diagonal; mono repeat + * x fill + * x clip; paint + * x clip; paint-alpha + * repeated, for over/source + */ + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + + hatchings (cr, cairo_fill); + cairo_translate (cr, 0, HEIGHT); + hatchings (cr, do_clip); + cairo_translate (cr, 0, HEIGHT); + hatchings (cr, do_clip_alpha); + cairo_translate (cr, 0, HEIGHT); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + hatchings (cr, cairo_fill); + cairo_translate (cr, 0, HEIGHT); + hatchings (cr, do_clip); + cairo_translate (cr, 0, HEIGHT); + hatchings (cr, do_clip_alpha); + cairo_translate (cr, 0, HEIGHT); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (hatchings, + "Test drawing through various aligned/unaliged clips", + "clip, alpha", /* keywords */ + "target=raster", /* requirements */ + 6*WIDTH, 6*HEIGHT, + NULL, draw) diff --git a/test/horizontal-clip.c b/test/horizontal-clip.c new file mode 100644 index 000000000..93127a722 --- /dev/null +++ b/test/horizontal-clip.c @@ -0,0 +1,77 @@ +/* + * Copyright 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Exercises a bug spotted by Andrea Canciani where the polygon clipping + * code was hopeless broken with horizontal edges. + */ + +#include "cairo-test.h" + +#define WIDTH 16 +#define HEIGHT 26 + +#define BUGY 1 +#define BUGX (4 * BUGY * WIDTH * 256) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_move_to (cr, - BUGX, 6 - BUGY); + cairo_line_to (cr, + BUGX, 6 + BUGY); + cairo_line_to (cr, WIDTH + BUGX, 2 - BUGY); + cairo_line_to (cr, WIDTH - BUGX, 2 + BUGY); + cairo_fill (cr); + + cairo_move_to (cr, WIDTH + BUGX, 8 - BUGY); + cairo_line_to (cr, WIDTH - BUGX, 8 + BUGY); + cairo_line_to (cr, - BUGX, 12 - BUGY); + cairo_line_to (cr, + BUGX, 12 + BUGY); + cairo_fill (cr); + + cairo_move_to (cr, - BUGX, 14 - BUGY); + cairo_line_to (cr, + BUGX, 14 + BUGY); + cairo_line_to (cr, WIDTH + BUGX, 18 - BUGY); + cairo_line_to (cr, WIDTH - BUGX, 18 + BUGY); + cairo_fill (cr); + + cairo_move_to (cr, WIDTH + BUGX, 24 - BUGY); + cairo_line_to (cr, WIDTH - BUGX, 24 + BUGY); + cairo_line_to (cr, - BUGX, 20 - BUGY); + cairo_line_to (cr, + BUGX, 20 + BUGY); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (horizontal_clip, + "Tests intersection of a nearly horizontal lines with a clipped polygon", + "clip, fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/huge-linear.c b/test/huge-linear.c new file mode 100644 index 000000000..f84b4ea0c --- /dev/null +++ b/test/huge-linear.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2006 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +/* set this to 0.1 to make this test work */ +#define FACTOR 1.e6 + +/* XXX poppler-cairo doesn't handle gradients very well... */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + cairo_matrix_t mat = { + 0, -4.5254285714285709 * FACTOR, + -2.6398333333333333 * FACTOR, 0, + 0, 0 + }; + + pattern = cairo_pattern_create_linear (-16384 * FACTOR, 0, + 16384 * FACTOR, 0); + cairo_pattern_add_color_stop_rgba (pattern, + 0, 0.376471, 0.533333, 0.27451, 1); + cairo_pattern_add_color_stop_rgba (pattern, 1, 1, 1, 1, 1); + cairo_pattern_set_matrix (pattern, &mat); + + cairo_scale (cr, 0.05, 0.05); + cairo_translate (cr, 6000, 3500); + + cairo_set_source (cr, pattern); + cairo_rectangle (cr, -6000, -3500, 12000, 7000); + cairo_pattern_destroy (pattern); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (huge_linear, + "Test huge linear patterns", + "gradient, linear", /* keywords */ + NULL, /* requirements */ + 600, 350, + NULL, draw) diff --git a/test/huge-radial.c b/test/huge-radial.c new file mode 100644 index 000000000..21524b7a4 --- /dev/null +++ b/test/huge-radial.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2006 Benjamin Otte + * Copyright © 2009 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + * Chris Wilson + */ + +#include "cairo-test.h" + +/* set this to 0.1 to make this test work */ +#define FACTOR 1.e6 + +/* XXX poppler-cairo doesn't handle gradients very well... */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + cairo_matrix_t mat = { + 0, -4.5254285714285709 * FACTOR, + -2.6398333333333333 * FACTOR, 0, + 0, 0 + }; + + pattern = cairo_pattern_create_radial (0, 0, 0, + 0, 0, 16384 * FACTOR); + cairo_pattern_add_color_stop_rgba (pattern, + 0, 0.376471, 0.533333, 0.27451, 1); + cairo_pattern_add_color_stop_rgba (pattern, 1, 1, 1, 1, 1); + cairo_pattern_set_matrix (pattern, &mat); + + cairo_scale (cr, 0.05, 0.05); + cairo_translate (cr, 6000, 3500); + + cairo_set_source (cr, pattern); + cairo_rectangle (cr, -6000, -3500, 12000, 7000); + cairo_pattern_destroy (pattern); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (huge_radial, + "Test huge radial patterns", + "gradient, radial", /* keywords */ + NULL, /* requirements */ + 600, 350, + NULL, draw) diff --git a/test/image-bug-710072.c b/test/image-bug-710072.c new file mode 100644 index 000000000..9cf0da799 --- /dev/null +++ b/test/image-bug-710072.c @@ -0,0 +1,80 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * This test case aims to reproduce the misbehaviour exhibited in + * https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/710072 + * i.e. out of bounds rendering with the rectangular span compositor. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw_aligned (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_rectangle (cr, -10, -10, 20, 20); + cairo_rectangle (cr, 5, 5, 20, 20); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgba (cr, 1, 0, 0, .5); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_unaligned (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_rectangle (cr, -10.5, -10.5, 20, 20); + cairo_rectangle (cr, 5.5, 5.5, 20, 20); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgba (cr, 1, 0, 0, .5); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (image_bug_710072_aligned, + "Tests a bug where we may compute spans greater than bounded extents", + "extents, fill, stroke", /* keywords */ + NULL, /* requirements */ + 15, 15, + NULL, draw_aligned) + +CAIRO_TEST (image_bug_710072_unaligned, + "Tests a bug where we may compute spans greater than bounded extents", + "extents, fill, stroke", /* keywords */ + NULL, /* requirements */ + 15, 15, + NULL, draw_unaligned) diff --git a/test/image-surface-source.c b/test/image-surface-source.c new file mode 100644 index 000000000..c7c1fdc33 --- /dev/null +++ b/test/image-surface-source.c @@ -0,0 +1,41 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include "surface-source.c" + +static cairo_surface_t * +create_source_surface (int size) +{ + return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, size, size); +} + +CAIRO_TEST (image_surface_source, + "Test using a image surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/imagediff.c b/test/imagediff.c new file mode 100644 index 000000000..6ebbcfca7 --- /dev/null +++ b/test/imagediff.c @@ -0,0 +1,303 @@ +/* imagediff - Compare two images + * + * Copyright © 2004 Richard D. Worth + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Richard Worth + * not be used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Richard Worth makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * RICHARD WORTH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL RICHARD WORTH BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Richard D. Worth */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include "buffer-diff.h" + +static void +_xunlink (const char *pathname) +{ + if (unlink (pathname) < 0 && errno != ENOENT) { + fprintf (stderr, " Error: Cannot remove %s: %s\n", + pathname, strerror (errno)); + exit (1); + } +} + +void +cairo_test_logv (const cairo_test_context_t *ctx, + const char *fmt, va_list va) +{ + vfprintf (stderr, fmt, va); +} + +void +cairo_test_log (const cairo_test_context_t *ctx, const char *fmt, ...) +{ + va_list va; + + va_start (va, fmt); + vfprintf (stderr, fmt, va); + va_end (va); +} + +/* Flatten an ARGB surface by blending it over white. The resulting + * surface, (still in ARGB32 format, but with only alpha==1.0 + * everywhere) is returned in the same surface pointer. + * + * The original surface will be destroyed. + * + * The (x,y) value specify an origin of interest for the original + * image. The flattened image will be generated only from the box + * extending from (x,y) to (width,height). + */ +static void +flatten_surface (cairo_surface_t **surface, int x, int y) +{ + cairo_surface_t *flat; + cairo_t *cr; + + flat = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + cairo_image_surface_get_width (*surface) - x, + cairo_image_surface_get_height (*surface) - y); + cairo_surface_set_device_offset (flat, -x, -y); + + cr = cairo_create (flat); + cairo_surface_destroy (flat); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_surface (cr, *surface, 0, 0); + cairo_surface_destroy (*surface); + cairo_paint (cr); + + *surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); +} + +/* Given an image surface, create a new surface that has the same + * contents as the sub-surface with its origin at x,y. + * + * The original surface will be destroyed. + */ +static void +extract_sub_surface (cairo_surface_t **surface, int x, int y) +{ + cairo_surface_t *sub; + cairo_t *cr; + + sub = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + cairo_image_surface_get_width (*surface) - x, + cairo_image_surface_get_height (*surface) - y); + + /* We don't use a device offset like flatten_surface. That's not + * for any important reason, (the results should be + * identical). This style just seemed more natural to me this + * time, so I'm leaving both here so I can look at both to see + * which I like better. */ + cr = cairo_create (sub); + cairo_surface_destroy (sub); + + cairo_set_source_surface (cr, *surface, -x, -y); + cairo_surface_destroy (*surface); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + *surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); +} + +static cairo_status_t +stdio_write_func (void *closure, const unsigned char *data, unsigned int length) +{ + FILE *file = closure; + + if (fwrite (data, 1, length, file) != length) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +write_png (cairo_surface_t *surface, const char *filename) +{ + cairo_status_t status; + FILE *png_file; + + if (filename != NULL) { + png_file = fopen (filename, "wb"); + if (png_file == NULL) { + switch (errno) { + case ENOMEM: + return CAIRO_STATUS_NO_MEMORY; + default: + return CAIRO_STATUS_WRITE_ERROR; + } + } + } else + png_file = stdout; + + status = cairo_surface_write_to_png_stream (surface, + stdio_write_func, + png_file); + + if (png_file != stdout) + fclose (png_file); + + return status; +} + +static cairo_status_t +png_diff (const char *filename_a, + const char *filename_b, + const char *filename_diff, + int ax, + int ay, + int bx, + int by, + buffer_diff_result_t *result) +{ + cairo_surface_t *surface_a; + cairo_surface_t *surface_b; + cairo_surface_t *surface_diff; + cairo_status_t status; + + surface_a = cairo_image_surface_create_from_png (filename_a); + status = cairo_surface_status (surface_a); + if (status) { + fprintf (stderr, "Error: Failed to create surface from %s: %s\n", + filename_a, cairo_status_to_string (status)); + return status; + } + + surface_b = cairo_image_surface_create_from_png (filename_b); + status = cairo_surface_status (surface_b); + if (status) { + fprintf (stderr, "Error: Failed to create surface from %s: %s\n", + filename_b, cairo_status_to_string (status)); + cairo_surface_destroy (surface_a); + return status; + } + + if (ax || ay) { + extract_sub_surface (&surface_a, ax, ay); + ax = ay = 0; + } + + if (bx || by) { + extract_sub_surface (&surface_b, bx, by); + bx = by = 0; + } + + status = cairo_surface_status (surface_a); + if (status) { + fprintf (stderr, "Error: Failed to extract surface from %s: %s\n", + filename_a, cairo_status_to_string (status)); + cairo_surface_destroy (surface_a); + cairo_surface_destroy (surface_b); + return status; + } + status = cairo_surface_status (surface_b); + if (status) { + fprintf (stderr, "Error: Failed to extract surface from %s: %s\n", + filename_b, cairo_status_to_string (status)); + cairo_surface_destroy (surface_a); + cairo_surface_destroy (surface_b); + return status; + } + + surface_diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + cairo_image_surface_get_width (surface_a), + cairo_image_surface_get_height (surface_a)); + status = cairo_surface_status (surface_diff); + if (status) { + fprintf (stderr, + "Error: Failed to allocate surface to hold differences\n"); + cairo_surface_destroy (surface_a); + cairo_surface_destroy (surface_b); + return CAIRO_STATUS_NO_MEMORY; + } + + status = image_diff (NULL, + surface_a, surface_b, surface_diff, + result); + + if (filename_diff) + _xunlink (filename_diff); + + if (status == CAIRO_STATUS_SUCCESS && + result->pixels_changed) + { + status = write_png (surface_diff, filename_diff); + } + + cairo_surface_destroy (surface_a); + cairo_surface_destroy (surface_b); + cairo_surface_destroy (surface_diff); + + return status; +} + +int +main (int argc, char *argv[]) +{ + buffer_diff_result_t result; + cairo_status_t status; + + unsigned int ax, ay, bx, by; + + if (argc != 3 && argc != 7) { + fprintf (stderr, "Usage: %s image1.png image2.png [ax ay bx by]\n", argv[0]); + fprintf (stderr, "Computes an output image designed to present a \"visual diff\" such that even\n"); + fprintf (stderr, "small errors in single pixels are readily apparent in the output.\n"); + fprintf (stderr, "The output image is written on stdout.\n"); + exit (1); + } + + if (argc == 7) { + ax = strtoul (argv[3], NULL, 0); + ay = strtoul (argv[4], NULL, 0); + bx = strtoul (argv[5], NULL, 0); + by = strtoul (argv[6], NULL, 0); + } else { + ax = ay = bx = by = 0; + } + + status = png_diff (argv[1], argv[2], NULL, ax, ay, bx, by, &result); + + if (status) { + fprintf (stderr, "Error comparing images: %s\n", + cairo_status_to_string (status)); + return 1; + } + + if (result.pixels_changed) + fprintf (stderr, "Total pixels changed: %d with a maximum channel difference of %d.\n", + result.pixels_changed, + result.max_diff); + + return (result.pixels_changed != 0); +} diff --git a/test/implicit-close.c b/test/implicit-close.c new file mode 100644 index 000000000..2529bb00f --- /dev/null +++ b/test/implicit-close.c @@ -0,0 +1,54 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 40 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_move_to (cr, SIZE, 0); + cairo_rel_line_to (cr, 0, SIZE); + cairo_rel_line_to (cr, -SIZE, 0); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (implicit_close, + "Test implicitly closing paths", + "fill", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/in-fill-empty-trapezoid.c b/test/in-fill-empty-trapezoid.c new file mode 100644 index 000000000..0797399c5 --- /dev/null +++ b/test/in-fill-empty-trapezoid.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ + +/* Bug history + * + * 2006-12-05 M Joonas Pihlaja + * + * The cairo_in_fill () function can sometimes produce false + * positives when the tessellator produces empty trapezoids + * and the query point lands exactly on a trapezoid edge. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + int x,y; + int width = 10; + int height = 10; + cairo_surface_t *surf; + cairo_t *cr; + int false_positive_count = 0; + cairo_status_t status; + cairo_test_status_t ret; + + surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + cr = cairo_create (surf); + cairo_surface_destroy (surf); + + /* Empty horizontal trapezoid. */ + cairo_move_to (cr, 0, height/3); + cairo_line_to (cr, width, height/3); + cairo_close_path (cr); + + /* Empty non-horizontal trapezoid #1. */ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, width, height/2); + cairo_close_path (cr); + + /* Empty non-horizontal trapezoid #2 intersecting #1. */ + cairo_move_to (cr, 0, height/2); + cairo_line_to (cr, width, 0); + cairo_close_path (cr); + + status = cairo_status (cr); + + /* Point sample the tessellated path. */ + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + if (cairo_in_fill (cr, x, y)) { + false_positive_count++; + } + } + } + cairo_destroy (cr); + + /* Check that everything went well. */ + ret = CAIRO_TEST_SUCCESS; + if (CAIRO_STATUS_SUCCESS != status) { + cairo_test_log (ctx, "Failed to create a test surface and path: %s\n", + cairo_status_to_string (status)); + ret = CAIRO_TEST_XFAILURE; + } + + if (0 != false_positive_count) { + cairo_test_log (ctx, "Point sampling found %d false positives " + "from cairo_in_fill()\n", + false_positive_count); + ret = CAIRO_TEST_XFAILURE; + } + + return ret; +} + +/* + * XFAIL: The cairo_in_fill () function can sometimes produce false positives + * when the tessellator produces empty trapezoids and the query point lands + * exactly on a trapezoid edge. + */ +CAIRO_TEST (in_fill_empty_trapezoid, + "Test that the tessellator isn't producing obviously empty trapezoids", + "in, trap", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/in-fill-trapezoid.c b/test/in-fill-trapezoid.c new file mode 100644 index 000000000..84b323a05 --- /dev/null +++ b/test/in-fill-trapezoid.c @@ -0,0 +1,279 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_test_status_t ret = CAIRO_TEST_SUCCESS; + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + /* simple rectangle */ + cairo_new_path (cr); + cairo_rectangle (cr, -10, -10, 20, 20); + if (! cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* rectangular boundary tests */ + if (! cairo_in_fill (cr, -10, -10)) { + cairo_test_log (ctx, "Error: Failed to find top-left vertex inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, -10, 10)) { + cairo_test_log (ctx, "Error: Failed to find bottom-left vertex inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 10, -10)) { + cairo_test_log (ctx, "Error: Failed to find top-right vertex inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 10, 10)) { + cairo_test_log (ctx, "Error: Failed to find bottom-right vertex inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, -10, 0)) { + cairo_test_log (ctx, "Error: Failed to find left edge inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 0, -10)) { + cairo_test_log (ctx, "Error: Failed to find top edge inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 10, 0)) { + cairo_test_log (ctx, "Error: Failed to find right edge inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 0, 10)) { + cairo_test_log (ctx, "Error: Failed to find bottom edge inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* simple circle */ + cairo_new_path (cr); + cairo_arc (cr, 0, 0, 10, 0, 2 * M_PI); + if (! cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside circle [even-odd]\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* holey rectangle */ + cairo_new_path (cr); + cairo_rectangle (cr, -10, -10, 20, 20); + cairo_rectangle (cr, -5, -5, 10, 10); + if (cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Found an unexpected point inside rectangular eo-hole\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* holey circle */ + cairo_new_path (cr); + cairo_arc (cr, 0, 0, 10, 0, 2 * M_PI); + cairo_arc (cr, 0, 0, 5, 0, 2 * M_PI); + if (cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Found an unexpected point inside circular eo-hole\n"); + ret = CAIRO_TEST_FAILURE; + } + + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + + /* simple rectangle */ + cairo_new_path (cr); + cairo_rectangle (cr, -10, -10, 20, 20); + if (! cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* simple circle */ + cairo_new_path (cr); + cairo_arc (cr, 0, 0, 10, 0, 2 * M_PI); + if (! cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside circle [nonzero]\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* overlapping circle/rectangle */ + cairo_new_path (cr); + cairo_rectangle (cr, -10, -10, 20, 20); + cairo_new_sub_path (cr); + cairo_arc (cr, 0, 0, 10, 0, 2 * M_PI); + if (! cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside circle+rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* holey rectangle */ + cairo_new_path (cr); + cairo_rectangle (cr, -10, -10, 20, 20); + cairo_rectangle (cr, 5, -5, -10, 10); + if (cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Found an unexpected point inside rectangular non-zero-hole\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* holey circle */ + cairo_new_path (cr); + cairo_arc (cr, 0, 0, 10, 0, 2 * M_PI); + cairo_arc_negative (cr, 0, 0, 5, 0, -2 * M_PI); + if (cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Found an unexpected point inside circular non-zero-hole\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* not a holey circle */ + cairo_new_path (cr); + cairo_arc (cr, 0, 0, 10, 0, 2 * M_PI); + cairo_arc (cr, 0, 0, 5, 0, 2 * M_PI); + if (! cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside two circles\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* check off-centre */ + cairo_new_path (cr); + cairo_arc (cr, 7.5, 0, 10, 0, 2 * M_PI); + cairo_arc_negative (cr, 7.5, 0, 5, 0, -2 * M_PI); + if (cairo_in_fill (cr, 7.5, 0)) { + cairo_test_log (ctx, "Error: Found an unexpected point inside off-centre-x circular non-zero-hole\n"); + ret = CAIRO_TEST_FAILURE; + } + cairo_new_path (cr); + cairo_arc (cr, 0, 7.5, 10, 0, 2 * M_PI); + cairo_arc_negative (cr, 0, 7.5, 5, 0, -2 * M_PI); + if (cairo_in_fill (cr, 0, 7.5)) { + cairo_test_log (ctx, "Error: Found an unexpected point inside off-centre-y circular non-zero-hole\n"); + ret = CAIRO_TEST_FAILURE; + } + cairo_new_path (cr); + cairo_arc (cr, 15, 0, 10, 0, 2 * M_PI); + if (! cairo_in_fill (cr, 15, 0)) { + cairo_test_log (ctx, "Error: Failed to find point inside off-centre-x circle\n"); + ret = CAIRO_TEST_FAILURE; + } + cairo_new_path (cr); + cairo_arc (cr, 0, 15, 10, 0, 2 * M_PI); + if (! cairo_in_fill (cr, 0, 15)) { + cairo_test_log (ctx, "Error: Failed to find point inside off-centre-y circle\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* simple rectangle */ + cairo_new_path (cr); + cairo_rectangle (cr, 10, 0, 5, 5); + if (cairo_in_fill (cr, 0, 0)) { + cairo_test_log (ctx, "Error: Found an unexpected point outside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (cairo_in_fill (cr, 20, 20)) { + cairo_test_log (ctx, "Error: Found an unexpected point outside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 12.5, 2.5)) { + cairo_test_log (ctx, "Error: Failed to find point inside rectangle\n"); + ret = CAIRO_TEST_FAILURE; + } + + /* off-centre triangle */ + cairo_new_path (cr); + cairo_move_to (cr, 10, 0); + cairo_line_to (cr, 15, 5); + cairo_line_to (cr, 5, 5); + cairo_close_path (cr); + if (cairo_in_fill (cr, 0, 0) || + cairo_in_fill (cr, 5, 0) || + cairo_in_fill (cr, 15, 0) || + cairo_in_fill (cr, 20, 0) || + cairo_in_fill (cr, 0, 10) || + cairo_in_fill (cr, 10, 10) || + cairo_in_fill (cr, 20, 10) || + cairo_in_fill (cr, 7, 2.5) || + cairo_in_fill (cr, 13, 2.5)) + { + cairo_test_log (ctx, + "Error: Found an unexpected point outside triangle\n" + "\t(0, 0) -> %s\n" + "\t(5, 0) -> %s\n" + "\t(15, 0) -> %s\n" + "\t(20, 0) -> %s\n" + "\t(0, 10) -> %s\n" + "\t(10, 10) -> %s\n" + "\t(20, 10) -> %s\n" + "\t(7, 2.5) -> %s\n" + "\t(13, 2.5) -> %s\n", + cairo_in_fill (cr, 0, 0) ? "inside" : "outside", + cairo_in_fill (cr, 5, 0) ? "inside" : "outside", + cairo_in_fill (cr, 15, 0) ? "inside" : "outside", + cairo_in_fill (cr, 20, 0) ? "inside" : "outside", + cairo_in_fill (cr, 0, 10) ? "inside" : "outside", + cairo_in_fill (cr, 10, 10) ? "inside" : "outside", + cairo_in_fill (cr, 20, 10) ? "inside" : "outside", + cairo_in_fill (cr, 7, 2.5) ? "inside" : "outside", + cairo_in_fill (cr, 13, 2.5) ? "inside" : "outside"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 7.5, 2.5) || + ! cairo_in_fill (cr, 12.5, 2.5) || + ! cairo_in_fill (cr, 10, 5)) + { + cairo_test_log (ctx, + "Error: Failed to find point on triangle edge\n" + "\t(7.5, 2.5) -> %s\n" + "\t(12.5, 2.5) -> %s\n" + "\t(10, 5) -> %s\n", + cairo_in_fill (cr, 7.5, 2.5) ? "inside" : "outside", + cairo_in_fill (cr, 12.5, 2.5) ? "inside" : "outside", + cairo_in_fill (cr, 10, 5) ? "inside" : "outside"); + ret = CAIRO_TEST_FAILURE; + } + if (! cairo_in_fill (cr, 8, 2.5) || + ! cairo_in_fill (cr, 12, 2.5)) + { + cairo_test_log (ctx, "Error: Failed to find point inside triangle\n"); + ret = CAIRO_TEST_FAILURE; + } + + cairo_destroy (cr); + + return ret; +} + +CAIRO_TEST (in_fill_trapezoid, + "Test cairo_in_fill", + "in, trap", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/index.html b/test/index.html new file mode 100644 index 000000000..54c65cdc1 --- /dev/null +++ b/test/index.html @@ -0,0 +1,42 @@ + +Cairo Test Results + + + + +
+ + diff --git a/test/infinite-join.c b/test/infinite-join.c new file mode 100644 index 000000000..a573f56a5 --- /dev/null +++ b/test/infinite-join.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Test case for bug #8379: + * + * infinite loop when stroking + * https://bugs.freedesktop.org/show_bug.cgi?id=8379 + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Paint white, then draw in black. */ + cairo_set_source_rgb (cr, 1, 1, 1); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + + /* scaling 2 times causes a slight rounding error in the ctm. + * Without that, the bug doesn't happen. */ + cairo_scale (cr, 20 / 100., 20 / 100.); + cairo_scale (cr, 1. / 20, 1. / 20); + + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_width (cr, 20); + + cairo_translate (cr, -18300, -13200); + + cairo_new_path (cr); + cairo_move_to (cr, 18928, 13843); + cairo_line_to (cr, 18500, 13843); + cairo_line_to (cr, 18500, 13400); + cairo_line_to (cr, 18928, 13400); + cairo_line_to (cr, 18928, 13843); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (infinite_join, + "Test case for infinite loop when stroking with round joins", + "stroke", /* keywords */ + NULL, + 8, 8, + NULL, draw) diff --git a/test/invalid-matrix.c b/test/invalid-matrix.c new file mode 100644 index 000000000..9bb26be0b --- /dev/null +++ b/test/invalid-matrix.c @@ -0,0 +1,374 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl Worth + */ + +#define _ISOC99_SOURCE /* for INFINITY */ +#define _GNU_SOURCE 1 /* for fedisableeexcept() et al */ + +#include "cairo-test.h" + +#if !defined(INFINITY) +#define INFINITY HUGE_VAL +#endif + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_status_t status; + cairo_surface_t *target; + cairo_font_face_t *font_face; + cairo_font_options_t *font_options; + cairo_scaled_font_t *scaled_font; + cairo_pattern_t *pattern; + cairo_t *cr2; + cairo_matrix_t identity, bogus, inf, invalid = { + 4.0, 4.0, + 4.0, 4.0, + 4.0, 4.0 + }; + +#define CHECK_STATUS(status, function_name) \ +if ((status) == CAIRO_STATUS_SUCCESS) { \ + cairo_test_log (ctx, "Error: %s with invalid matrix passed\n", \ + (function_name)); \ + return CAIRO_TEST_FAILURE; \ +} else if ((status) != CAIRO_STATUS_INVALID_MATRIX) { \ + cairo_test_log (ctx, "Error: %s with invalid matrix returned unexpected status " \ + "(%d): %s\n", \ + (function_name), \ + status, \ + cairo_status_to_string (status)); \ + return CAIRO_TEST_FAILURE; \ +} + + /* clear floating point exceptions (added by cairo_test_init()) */ +#if HAVE_FEDISABLEEXCEPT + fedisableexcept (FE_INVALID); +#endif + + /* create a bogus matrix and check results of attempted inversion */ + bogus.x0 = bogus.xy = bogus.xx = cairo_test_NaN (); + bogus.y0 = bogus.yx = bogus.yy = bogus.xx; + status = cairo_matrix_invert (&bogus); + CHECK_STATUS (status, "cairo_matrix_invert(NaN)"); + + inf.x0 = inf.xy = inf.xx = INFINITY; + inf.y0 = inf.yx = inf.yy = inf.xx; + status = cairo_matrix_invert (&inf); + CHECK_STATUS (status, "cairo_matrix_invert(infinity)"); + + /* test cairo_matrix_invert with invalid matrix */ + status = cairo_matrix_invert (&invalid); + CHECK_STATUS (status, "cairo_matrix_invert(invalid)"); + + + cairo_matrix_init_identity (&identity); + + target = cairo_get_group_target (cr); + + /* test cairo_transform with invalid matrix */ + cr2 = cairo_create (target); + cairo_transform (cr2, &invalid); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_transform(invalid)"); + + /* test cairo_transform with bogus matrix */ + cr2 = cairo_create (target); + cairo_transform (cr2, &bogus); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_transform(NaN)"); + + /* test cairo_transform with ∞ matrix */ + cr2 = cairo_create (target); + cairo_transform (cr2, &inf); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_transform(infinity)"); + + + /* test cairo_set_matrix with invalid matrix */ + cr2 = cairo_create (target); + cairo_set_matrix (cr2, &invalid); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_set_matrix(invalid)"); + + /* test cairo_set_matrix with bogus matrix */ + cr2 = cairo_create (target); + cairo_set_matrix (cr2, &bogus); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_set_matrix(NaN)"); + + /* test cairo_set_matrix with ∞ matrix */ + cr2 = cairo_create (target); + cairo_set_matrix (cr2, &inf); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_set_matrix(infinity)"); + + + /* test cairo_set_font_matrix with invalid matrix */ + cr2 = cairo_create (target); + cairo_set_font_matrix (cr2, &invalid); + + /* draw some text to force the font to be resolved */ + cairo_show_text (cr2, "hello"); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_set_font_matrix(invalid)"); + + /* test cairo_set_font_matrix with bogus matrix */ + cr2 = cairo_create (target); + cairo_set_font_matrix (cr2, &bogus); + + /* draw some text to force the font to be resolved */ + cairo_show_text (cr2, "hello"); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_set_font_matrix(NaN)"); + + /* test cairo_set_font_matrix with ∞ matrix */ + cr2 = cairo_create (target); + cairo_set_font_matrix (cr2, &inf); + + /* draw some text to force the font to be resolved */ + cairo_show_text (cr2, "hello"); + + status = cairo_status (cr2); + cairo_destroy (cr2); + CHECK_STATUS (status, "cairo_set_font_matrix(infinity)"); + + + /* test cairo_scaled_font_create with invalid matrix */ + cr2 = cairo_create (target); + font_face = cairo_get_font_face (cr2); + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + scaled_font = cairo_scaled_font_create (font_face, + &invalid, + &identity, + font_options); + status = cairo_scaled_font_status (scaled_font); + CHECK_STATUS (status, "cairo_scaled_font_create(invalid)"); + + cairo_scaled_font_destroy (scaled_font); + + scaled_font = cairo_scaled_font_create (font_face, + &identity, + &invalid, + font_options); + status = cairo_scaled_font_status (scaled_font); + CHECK_STATUS (status, "cairo_scaled_font_create(invalid)"); + + cairo_scaled_font_destroy (scaled_font); + cairo_font_options_destroy (font_options); + cairo_destroy (cr2); + + /* test cairo_scaled_font_create with bogus matrix */ + cr2 = cairo_create (target); + font_face = cairo_get_font_face (cr2); + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + scaled_font = cairo_scaled_font_create (font_face, + &bogus, + &identity, + font_options); + status = cairo_scaled_font_status (scaled_font); + CHECK_STATUS (status, "cairo_scaled_font_create(NaN)"); + + cairo_scaled_font_destroy (scaled_font); + + scaled_font = cairo_scaled_font_create (font_face, + &identity, + &bogus, + font_options); + status = cairo_scaled_font_status (scaled_font); + CHECK_STATUS (status, "cairo_scaled_font_create(NaN)"); + + cairo_scaled_font_destroy (scaled_font); + cairo_font_options_destroy (font_options); + cairo_destroy (cr2); + + /* test cairo_scaled_font_create with ∞ matrix */ + cr2 = cairo_create (target); + font_face = cairo_get_font_face (cr2); + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + scaled_font = cairo_scaled_font_create (font_face, + &inf, + &identity, + font_options); + status = cairo_scaled_font_status (scaled_font); + CHECK_STATUS (status, "cairo_scaled_font_create(infinity)"); + + cairo_scaled_font_destroy (scaled_font); + + scaled_font = cairo_scaled_font_create (font_face, + &identity, + &inf, + font_options); + status = cairo_scaled_font_status (scaled_font); + CHECK_STATUS (status, "cairo_scaled_font_create(infinity)"); + + cairo_scaled_font_destroy (scaled_font); + cairo_font_options_destroy (font_options); + cairo_destroy (cr2); + + + /* test cairo_pattern_set_matrix with invalid matrix */ + pattern = cairo_pattern_create_rgb (1.0, 1.0, 1.0); + cairo_pattern_set_matrix (pattern, &invalid); + status = cairo_pattern_status (pattern); + CHECK_STATUS (status, "cairo_pattern_set_matrix(invalid)"); + cairo_pattern_destroy (pattern); + + /* test cairo_pattern_set_matrix with bogus matrix */ + pattern = cairo_pattern_create_rgb (1.0, 1.0, 1.0); + cairo_pattern_set_matrix (pattern, &bogus); + status = cairo_pattern_status (pattern); + CHECK_STATUS (status, "cairo_pattern_set_matrix(NaN)"); + cairo_pattern_destroy (pattern); + + /* test cairo_pattern_set_matrix with ∞ matrix */ + pattern = cairo_pattern_create_rgb (1.0, 1.0, 1.0); + cairo_pattern_set_matrix (pattern, &inf); + status = cairo_pattern_status (pattern); + CHECK_STATUS (status, "cairo_pattern_set_matrix(infinity)"); + cairo_pattern_destroy (pattern); + + + /* test invalid transformations */ + cr2 = cairo_create (target); + cairo_translate (cr2, bogus.xx, bogus.yy); + CHECK_STATUS (status, "cairo_translate(NaN, NaN)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_translate (cr2, 0, bogus.yy); + CHECK_STATUS (status, "cairo_translate(0, NaN)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_translate (cr2, bogus.xx, 0); + CHECK_STATUS (status, "cairo_translate(NaN, 0)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_translate (cr2, inf.xx, inf.yy); + CHECK_STATUS (status, "cairo_translate(∞, ∞)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_translate (cr2, 0, inf.yy); + CHECK_STATUS (status, "cairo_translate(0, ∞)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_translate (cr2, inf.xx, 0); + CHECK_STATUS (status, "cairo_translate(∞, 0)"); + cairo_destroy (cr2); + + + cr2 = cairo_create (target); + cairo_scale (cr2, bogus.xx, bogus.yy); + CHECK_STATUS (status, "cairo_scale(NaN, NaN)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, 1, bogus.yy); + CHECK_STATUS (status, "cairo_scale(1, NaN)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, bogus.xx, 1); + CHECK_STATUS (status, "cairo_scale(NaN, 1)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, inf.xx, inf.yy); + CHECK_STATUS (status, "cairo_scale(∞, ∞)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, 1, inf.yy); + CHECK_STATUS (status, "cairo_scale(1, ∞)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, inf.xx, 1); + CHECK_STATUS (status, "cairo_scale(∞, 1)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, bogus.xx, bogus.yy); + CHECK_STATUS (status, "cairo_scale(0, 0)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, 1, bogus.yy); + CHECK_STATUS (status, "cairo_scale(1, 0)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_scale (cr2, bogus.xx, 1); + CHECK_STATUS (status, "cairo_scale(0, 1)"); + cairo_destroy (cr2); + + + cr2 = cairo_create (target); + cairo_rotate (cr2, bogus.xx); + CHECK_STATUS (status, "cairo_rotate(NaN)"); + cairo_destroy (cr2); + + cr2 = cairo_create (target); + cairo_rotate (cr2, inf.xx); + CHECK_STATUS (status, "cairo_rotate(∞)"); + cairo_destroy (cr2); + +#if HAVE_FECLEAREXCEPT + feclearexcept (FE_INVALID); +#endif + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (invalid_matrix, + "Test that all relevant public functions return CAIRO_STATUS_INVALID_MATRIX as appropriate", + "api, matrix", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/inverse-text.c b/test/inverse-text.c new file mode 100644 index 000000000..c8d7aea62 --- /dev/null +++ b/test/inverse-text.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2010 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* This is just the inverse of select-font-face.c */ + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 1, 1); + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (inverse_text, + "Tests rendering of inverse text (white-on-black)", + "font, text", /* keywords */ + NULL, /* requirements */ + 192, TEXT_SIZE + 4, + NULL, draw) diff --git a/test/inverted-clip.c b/test/inverted-clip.c new file mode 100644 index 000000000..b05dd6b6b --- /dev/null +++ b/test/inverted-clip.c @@ -0,0 +1,56 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* An assertion failure found by Rico Tzschichholz */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_set_source_rgb (cr, 0, 1, 0); + + cairo_arc (cr, 50, 50, 40, 0, 2 * M_PI); + cairo_clip_preserve (cr); + + cairo_paint (cr); + + cairo_rectangle (cr, 0, 0, 100, 100); + cairo_reset_clip (cr); + cairo_clip (cr); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (inverted_clip, + "Clip + InvertedClip should be opaque", + "clip, paint", /* keywords */ + "target=raster", /* requirements */ + 100, 100, + NULL, draw) diff --git a/test/joins-loop.c b/test/joins-loop.c new file mode 100644 index 000000000..f0b7bc11d --- /dev/null +++ b/test/joins-loop.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (8 * LINE_WIDTH) +#define PAD (1 * LINE_WIDTH) + + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0, 0); + cairo_rel_curve_to (cr, + SIZE, 0, + 0, SIZE, + SIZE, SIZE); + cairo_rel_line_to (cr, -SIZE, 0); + cairo_rel_curve_to (cr, + SIZE, 0, + 0, -SIZE, + SIZE, -SIZE); + cairo_close_path (cr); +} + +static void +draw_joins (cairo_t *cr) +{ + cairo_save (cr); + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_line_width (cr, LINE_WIDTH); + + draw_joins (cr); + + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + draw_joins (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (joins_loop, + "A loopy concave shape", + "stroke", /* keywords */ + NULL, /* requirements */ + 3*(SIZE+PAD)+PAD, 2*(SIZE+PAD)+2*PAD, + NULL, draw) + diff --git a/test/joins-retrace.c b/test/joins-retrace.c new file mode 100644 index 000000000..9a2cf708b --- /dev/null +++ b/test/joins-retrace.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (8 * LINE_WIDTH) +#define PAD (1 * LINE_WIDTH) + + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0, SIZE/2 + LINE_WIDTH); + cairo_rel_line_to (cr, SIZE, 0); + cairo_rel_line_to (cr, -SIZE, 0); + cairo_close_path (cr); + + cairo_move_to (cr, 3*SIZE/4, 0); + cairo_rel_line_to (cr, -SIZE/2, SIZE); + cairo_rel_line_to (cr, SIZE/2, -SIZE); + cairo_close_path (cr); + + cairo_move_to (cr, 0, SIZE/2-LINE_WIDTH); + cairo_rel_curve_to (cr, + SIZE/2, -2*LINE_WIDTH, + SIZE/2, 2*LINE_WIDTH, + SIZE, 0); + cairo_rel_curve_to (cr, + -SIZE/2, 2*LINE_WIDTH, + -SIZE/2, -2*LINE_WIDTH, + -SIZE, 0); + cairo_close_path (cr); +} + +static void +draw_joins (cairo_t *cr) +{ + cairo_save (cr); + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_line_width (cr, LINE_WIDTH); + + draw_joins (cr); + + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + draw_joins (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (joins_retrace, + "A shape that repeats upon itself", + "stroke", /* keywords */ + NULL, /* requirements */ + 3*(SIZE+PAD)+PAD, 2*(SIZE+PAD)+2*PAD, + NULL, draw) + diff --git a/test/joins-star.c b/test/joins-star.c new file mode 100644 index 000000000..17c1b4e66 --- /dev/null +++ b/test/joins-star.c @@ -0,0 +1,99 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (8 * LINE_WIDTH) +#define PAD (1 * LINE_WIDTH) + + +static void +make_path (cairo_t *cr) +{ +#define PROTRUSION 20 + cairo_move_to (cr, SIZE/2-PROTRUSION, LINE_WIDTH); + cairo_line_to (cr, SIZE-LINE_WIDTH, SIZE/2+PROTRUSION); + cairo_line_to (cr, SIZE-LINE_WIDTH, SIZE/2-PROTRUSION); + cairo_line_to (cr, SIZE/2-PROTRUSION, SIZE-LINE_WIDTH); + cairo_line_to (cr, SIZE/2+PROTRUSION, SIZE-LINE_WIDTH); + cairo_line_to (cr, LINE_WIDTH, SIZE/2-PROTRUSION); + cairo_line_to (cr, LINE_WIDTH, SIZE/2+PROTRUSION); + cairo_line_to (cr, SIZE/2+PROTRUSION, LINE_WIDTH); + cairo_close_path (cr); +} + +static void +draw_joins (cairo_t *cr) +{ + cairo_save (cr); + cairo_translate (cr, PAD, PAD); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + make_path (cr); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke (cr); + cairo_translate (cr, SIZE + PAD, 0.); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_line_width (cr, LINE_WIDTH); + + draw_joins (cr); + + /* and reflect to generate the opposite vertex ordering */ + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + + draw_joins (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (joins_star, + "A nice and simple concave shape", + "stroke", /* keywords */ + NULL, /* requirements */ + 3*(SIZE+PAD)+PAD, 2*(SIZE+PAD)+PAD, + NULL, draw) + diff --git a/test/joins.c b/test/joins.c new file mode 100644 index 000000000..40ef72e21 --- /dev/null +++ b/test/joins.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 12. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + const struct { + double x, y; + } scales[] = { + { 1, 1 }, + { -1, 1 }, + { 1, -1 }, + { -1, -1 }, + }; + unsigned int i, j; + + for (j = 0; j < ARRAY_LENGTH (scales); j++) { + cairo_save (cr); + /* include reflections to flip the orientation of the join */ + cairo_scale (cr, scales[j].x, scales[j].y); + for (i = 0; i < 3; i++) { + cairo_new_sub_path (cr); + cairo_move_to (cr, 0, -9*LINE_WIDTH/4 - 2); + cairo_line_to (cr, 0, -2*LINE_WIDTH - 2); + cairo_line_to (cr, LINE_WIDTH/4, -2*LINE_WIDTH - 2); + cairo_rotate (cr, M_PI / 4.); + } + cairo_restore (cr); + } +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_line_join_t join; + + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, LINE_WIDTH); + cairo_translate (cr, PAD + SIZE / 2., PAD + SIZE / 2.); + + for (join = CAIRO_LINE_JOIN_MITER; join <= CAIRO_LINE_JOIN_BEVEL; join++) { + cairo_save (cr); + + cairo_set_line_join (cr, join); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + make_path (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + make_path (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + make_path (cr); + cairo_stroke (cr); + + cairo_restore (cr); + + cairo_translate (cr, SIZE + PAD, 0); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (joins, + "Test joins", + "stroke, joins", /* keywords */ + NULL, /* requirements */ + 3 * (PAD + SIZE) + PAD, + 3 * (PAD + SIZE) + PAD, + NULL, draw) + diff --git a/test/jp2.jp2 b/test/jp2.jp2 new file mode 100644 index 000000000..fe8dd6e54 Binary files /dev/null and b/test/jp2.jp2 differ diff --git a/test/jpeg.jpg b/test/jpeg.jpg new file mode 100644 index 000000000..a1bac1c81 Binary files /dev/null and b/test/jpeg.jpg differ diff --git a/test/large-clip.c b/test/large-clip.c new file mode 100644 index 000000000..d2380def5 --- /dev/null +++ b/test/large-clip.c @@ -0,0 +1,50 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Soren Sandmann + */ + +#include "cairo-test.h" + +#define SIZE 100 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_rectangle (cr, 0, 0, 65536 + 25, 65536 + 25); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (large_clip, + "Incorrect clipping when the clip rectangle doesn't fit in 16 bits signed", + "clip, stress", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/large-font.c b/test/large-font.c new file mode 100644 index 000000000..0a139441c --- /dev/null +++ b/test/large-font.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history: + * + * 2008-05-23: Caolan McNamara noticed a bug in OpenOffice.org where, + * when using a very large font, space would be left for a + * glyph but it would actually be rendered in the wrong + * place. He wrote a minimal test case and posted the bug + * here: + * + * corrupt glyph positions with large font + * https://bugzilla.redhat.com/show_bug.cgi?id=448104 + * + * 2008-05-23: Carl Worth wrote this test for the cairo test suite to + * exercise the bug. + */ + +#include "cairo-test.h" + +#define WIDTH 800 +#define HEIGHT 800 +#define TEXT_SIZE 10000 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* paint white so we don't need separate ref images for + * RGB24 and ARGB32 */ + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, -TEXT_SIZE / 2, TEXT_SIZE / 2); + cairo_show_text (cr, "xW"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (large_font, + "Draws a very large font to exercise a glyph-positioning bug", + "stress, font", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/large-source-roi.c b/test/large-source-roi.c new file mode 100644 index 000000000..dfd3554d7 --- /dev/null +++ b/test/large-source-roi.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2009 Joonas Pihlaja + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "cairo-test.h" + +/* This test attempts to trigger failures in those clone_similar + * backend methods that have size restrictions. */ + +static cairo_surface_t * +create_large_source (int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1,0,0); /* red */ + cairo_paint (cr); + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + /* Since 1cc750ed92a936d84b47cac696aaffd226e1c02e pixman will not + * paint on the source surface if source_width > 30582. */ + double source_width = 30000.0; + + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + /* Create an excessively wide source image, all red. */ + source = create_large_source (source_width, height); + + /* Set a transform so that the source is scaled down to fit in the + * destination horizontally and then paint the entire source to + * the context. */ + cairo_scale (cr, width/source_width, 1.0); + cairo_set_source_surface (cr, source, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + cairo_surface_destroy (source); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (large_source_roi, + "Uses a all of a large source image.", + "stress, source", /* keywords */ + NULL, /* requirements */ + 7, 7, + NULL, draw) diff --git a/test/large-source.c b/test/large-source.c new file mode 100644 index 000000000..2b6b84fb4 --- /dev/null +++ b/test/large-source.c @@ -0,0 +1,100 @@ +/* + * Copyright © Chris Wilson, 2008 + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Chris Wilson + */ + +#include "cairo-test.h" + +/* This is a test case for the following bug: + * + * crafted gif file will crash firefox + * [XError: 'BadAlloc (insufficient resources for operation)'] + * https://bugzilla.mozilla.org/show_bug.cgi?id=424333 + */ + +#ifdef WORDS_BIGENDIAN +#define RED_MASK 0xA0 +#define GREEN_MASK 0xA +#else +#define RED_MASK 0x5 +#define GREEN_MASK 0x50 +#endif + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + unsigned char *data; + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_paint (cr); + + surface = cairo_image_surface_create (CAIRO_FORMAT_A1, 32000, 20); + data = cairo_image_surface_get_data (surface); + if (data != NULL) { + int stride = cairo_image_surface_get_stride (surface); + int width = cairo_image_surface_get_width (surface); + int height = cairo_image_surface_get_height (surface); + int x, y; + + for (y = 0; y < height; y++) { + for (x = 0; x < (width + 7) / 8; x++) + data[x] = RED_MASK; + data += stride; + } + cairo_surface_mark_dirty (surface); + } + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + cairo_mask_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + + surface = cairo_image_surface_create (CAIRO_FORMAT_A1, 20, 32000); + data = cairo_image_surface_get_data (surface); + if (data != NULL) { + int stride = cairo_image_surface_get_stride (surface); + int width = cairo_image_surface_get_width (surface); + int height = cairo_image_surface_get_height (surface); + int x, y; + + for (y = 0; y < height; y++) { + for (x = 0; x < (width + 7) / 8; x++) + data[x] = GREEN_MASK; + data += stride; + } + cairo_surface_mark_dirty (surface); + } + + cairo_set_source_rgb (cr, 0, 1, 0); /* green */ + cairo_mask_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (large_source, + "Exercises mozilla bug 424333 - handling of massive images", + "stress, source", /* keywords */ + NULL, /* requirements */ + 20, 20, + NULL, draw) diff --git a/test/large-twin-antialias-mixed.c b/test/large-twin-antialias-mixed.c new file mode 100644 index 000000000..9626a9dd2 --- /dev/null +++ b/test/large-twin-antialias-mixed.c @@ -0,0 +1,97 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_scaled_font_t * +create_twin (cairo_t *cr, cairo_antialias_t antialias) +{ + cairo_font_options_t *options; + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, antialias); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + return cairo_scaled_font_reference (cairo_get_scaled_font (cr)); +} + + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_scaled_font_t *subpixel, *gray, *none; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_font_size (cr, 64); + subpixel = create_twin (cr, CAIRO_ANTIALIAS_SUBPIXEL); + gray = create_twin (cr, CAIRO_ANTIALIAS_GRAY); + none = create_twin (cr, CAIRO_ANTIALIAS_NONE); + + cairo_move_to (cr, 4, 64); + cairo_set_scaled_font (cr, subpixel); + cairo_show_text (cr, "Is cairo's"); + cairo_set_scaled_font (cr, gray); + cairo_show_text (cr, " twin"); + cairo_set_scaled_font (cr, none); + cairo_show_text (cr, " giza?"); + + cairo_move_to (cr, 4, 128+16); + cairo_set_scaled_font (cr, gray); + cairo_show_text (cr, "Is cairo's"); + cairo_set_scaled_font (cr, none); + cairo_show_text (cr, " twin"); + cairo_set_scaled_font (cr, subpixel); + cairo_show_text (cr, " giza?"); + + cairo_move_to (cr, 4, 192+32); + cairo_set_scaled_font (cr, none); + cairo_show_text (cr, "Is cairo's"); + cairo_set_scaled_font (cr, gray); + cairo_show_text (cr, " twin"); + cairo_set_scaled_font (cr, subpixel); + cairo_show_text (cr, " giza?"); + + cairo_scaled_font_destroy (none); + cairo_scaled_font_destroy (gray); + cairo_scaled_font_destroy (subpixel); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (large_twin_antialias_mixed, + "Tests the internal font (with intermixed antialiasing)", + "twin, font", /* keywords */ + "target=raster", /* requirements */ + 524, 240, + NULL, draw) diff --git a/test/leaky-dash.c b/test/leaky-dash.c new file mode 100644 index 000000000..12e91ac1d --- /dev/null +++ b/test/leaky-dash.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Test case for bug #4863: + * + * stroking problems with wide dashed lines + * https://bugs.freedesktop.org/show_bug.cgi?id=4863 + */ + +#include "cairo-test.h" + +#define WIDTH 71 +#define HEIGHT 28 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dash[2]; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + cairo_set_line_width (cr, 2); + dash[0] = 8.0; + dash[1] = 2.0; + + cairo_rectangle (cr, 2.0, 2.0, 67.0, 24.0); + + cairo_set_dash (cr, dash, 2, 9.0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (leaky_dash, + "Exercises bug #4863 in which a dashed stroke leaks into half the rectangle being filled" + "\nknown bug (#4863) which has existed since the 1.0 release", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/leaky-dashed-rectangle.c b/test/leaky-dashed-rectangle.c new file mode 100644 index 000000000..25f5674e9 --- /dev/null +++ b/test/leaky-dashed-rectangle.c @@ -0,0 +1,86 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + * Franz Schmid + */ + +/* Test case for bug reported by Franz Schmid + * http://lists.cairographics.org/archives/cairo/2008-April/013912.html + * + * See also: http://bugs.freedesktop.org/show_bug.cgi?id=17177 + */ + +#include "cairo-test.h" + +#define WIDTH 60 +#define HEIGHT 60 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double dash[2] = {4, 2}; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0); + + cairo_translate (cr, 0.5, .5); + cairo_set_line_width (cr, 1); /* This is vital to reproduce the bug. */ + + /* First check simple rectangles */ + cairo_set_source_rgb (cr, 0., 0., 0); + cairo_rectangle (cr, -WIDTH/4, -HEIGHT/4, WIDTH, HEIGHT); + cairo_stroke (cr); + cairo_rectangle (cr, WIDTH+WIDTH/4, -HEIGHT/4, -WIDTH, HEIGHT); + cairo_stroke (cr); + cairo_rectangle (cr, -WIDTH/4, HEIGHT+HEIGHT/4, WIDTH, -HEIGHT); + cairo_stroke (cr); + cairo_rectangle (cr, WIDTH+WIDTH/4, HEIGHT+HEIGHT/4, -WIDTH, -HEIGHT); + cairo_stroke (cr); + + cairo_set_dash (cr, dash, 2, 0); + + /* And now dashed. */ + cairo_set_source_rgb (cr, 1., 0., 0); + cairo_rectangle (cr, -WIDTH/4, -HEIGHT/4, WIDTH, HEIGHT); + cairo_stroke (cr); + cairo_set_source_rgb (cr, 0., 1., 0); + cairo_rectangle (cr, WIDTH+WIDTH/4, -HEIGHT/4, -WIDTH, HEIGHT); + cairo_stroke (cr); + cairo_set_source_rgb (cr, 0., 0., 1); + cairo_rectangle (cr, -WIDTH/4, HEIGHT+HEIGHT/4, WIDTH, -HEIGHT); + cairo_stroke (cr); + cairo_set_source_rgb (cr, 1., 1., 0); + cairo_rectangle (cr, WIDTH+WIDTH/4, HEIGHT+HEIGHT/4, -WIDTH, -HEIGHT); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (leaky_dashed_rectangle, + "Exercises bug in which a dashed stroke leaks in from outside the surface", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/leaky-dashed-stroke.c b/test/leaky-dashed-stroke.c new file mode 100644 index 000000000..457d7ce70 --- /dev/null +++ b/test/leaky-dashed-stroke.c @@ -0,0 +1,166 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Extracted from a test case reported by Jeff Muizelaar found whilst running + * firefox http://people.mozilla.com/~jmuizelaar/BerlinDistricts-check.svg + */ + +#include "cairo-test.h" + +#define WIDTH 205 +#define HEIGHT 260 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const double dash[2] = {.5, .5}; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1., 0., 0); + + /* By adjusting the miter limit, we can see variations on the artifact. + * cairo_set_miter_limit (cr, 4.); + */ + + cairo_translate (cr, -720, -484); + cairo_scale (cr, 2.5, 2.5); + + cairo_set_dash (cr, dash, 2, 0); + + cairo_move_to (cr, 293.622, 330); + cairo_line_to (cr, 293.703, 337.028); + cairo_line_to (cr, 297.45, 336.851); + cairo_line_to (cr, 308.88, 342.609); + cairo_line_to (cr, 309.736, 346.107); + cairo_line_to (cr, 312.972, 348.128); + cairo_line_to (cr, 312.977, 353.478); + cairo_line_to (cr, 322.486, 359.355); + cairo_line_to (cr, 320.831, 363.642); + cairo_line_to (cr, 315.175, 367.171); + cairo_line_to (cr, 308.987, 365.715); + cairo_line_to (cr, 301.3, 365.964); + cairo_line_to (cr, 304.712, 368.852); + cairo_line_to (cr, 305.349, 373.022); + cairo_line_to (cr, 303.211, 376.551); + cairo_line_to (cr, 304.915, 382.855); + cairo_line_to (cr, 323.715, 400.475); + cairo_line_to (cr, 355.323, 424.072); + cairo_line_to (cr, 443.078, 426.534); + cairo_line_to (cr, 455.26, 400.603); + cairo_line_to (cr, 471.924, 392.604); + cairo_line_to (cr, 478.556, 390.797); + cairo_line_to (cr, 477.715, 386); + cairo_line_to (cr, 456.807, 376.507); + cairo_line_to (cr, 449.134, 368.722); + cairo_line_to (cr, 449.147, 365.847); + cairo_line_to (cr, 439.981, 361.692); + cairo_line_to (cr, 439.994, 358.603); + cairo_line_to (cr, 454.645, 336.128); + cairo_line_to (cr, 434.995, 324.005); + cairo_line_to (cr, 423.884, 319.354); + cairo_line_to (cr, 421.098, 312.569); + cairo_line_to (cr, 424.291, 305.997); + cairo_line_to (cr, 431.308, 305.069); + cairo_line_to (cr, 437.257, 296.882); + cairo_line_to (cr, 448.544, 296.808); + cairo_line_to (cr, 452.113, 290.651); + cairo_line_to (cr, 448.469, 285.483); + cairo_line_to (cr, 442.903, 282.877); + cairo_line_to (cr, 447.798, 281.124); + cairo_line_to (cr, 454.622, 274.911); + cairo_line_to (cr, 449.491, 269.978); + cairo_line_to (cr, 443.666, 253.148); + cairo_line_to (cr, 445.741, 250.834); + cairo_line_to (cr, 441.87, 247.131); + cairo_line_to (cr, 436.932, 246.203); + cairo_line_to (cr, 430.5, 251.252); + cairo_line_to (cr, 427.483, 250.751); + cairo_line_to (cr, 427.26, 253.572); + cairo_line_to (cr, 423.621, 255.539); + cairo_line_to (cr, 423.824, 257.933); + cairo_line_to (cr, 425.239, 259.582); + cairo_line_to (cr, 422.385, 261.443); + cairo_line_to (cr, 421.665, 260.53); + cairo_line_to (cr, 419.238, 262.819); + cairo_line_to (cr, 418.731, 257.849); + cairo_line_to (cr, 419.72, 255.227); + cairo_line_to (cr, 418.786, 250.258); + cairo_line_to (cr, 405.685, 235.254); + cairo_line_to (cr, 427.167, 215.127); + cairo_line_to (cr, 413.852, 196.281); + cairo_line_to (cr, 420.177, 192.379); + cairo_line_to (cr, 419.885, 185.701); + cairo_line_to (cr, 413.401, 185.428); + cairo_line_to (cr, 407.985, 186.863); + cairo_line_to (cr, 397.11, 189.112); + cairo_line_to (cr, 390.505, 186.664); + cairo_line_to (cr, 388.527, 183.694); + cairo_line_to (cr, 336.503, 221.048); + cairo_line_to (cr, 367.028, 241.656); + cairo_line_to (cr, 365.103, 244.117); + cairo_line_to (cr, 364.886, 246.792); + cairo_line_to (cr, 361.467, 247.119); + cairo_line_to (cr, 360.396, 245.525); + cairo_line_to (cr, 356.336, 245.638); + cairo_line_to (cr, 353.344, 242.122); + cairo_line_to (cr, 347.149, 242.876); + cairo_line_to (cr, 341.809, 256.652); + cairo_line_to (cr, 342.232, 268.72); + cairo_line_to (cr, 329.579, 269.095); + cairo_line_to (cr, 327.001, 271.009); + cairo_line_to (cr, 325.579, 275.598); + cairo_line_to (cr, 318.941, 277.313); + cairo_line_to (cr, 306.048, 277.231); + cairo_line_to (cr, 304.071, 276.27); + cairo_line_to (cr, 301.153, 277.175); + cairo_line_to (cr, 293.52, 277.529); + cairo_line_to (cr, 290.682, 281.947); + cairo_line_to (cr, 293.911, 286.63); + cairo_line_to (cr, 302.417, 290.547); + cairo_line_to (cr, 303.521, 294.73); + cairo_line_to (cr, 307.787, 298.088); + cairo_line_to (cr, 311.718, 299.126); + cairo_line_to (cr, 313.255, 302.146); + cairo_line_to (cr, 314.6, 306.206); + cairo_line_to (cr, 322.603, 308.96); + cairo_line_to (cr, 321.718, 314.477); + cairo_line_to (cr, 319.596, 320.341); + cairo_line_to (cr, 300.689, 323.69); + cairo_line_to (cr, 301.232, 326.789); + cairo_line_to (cr, 293.622, 330); + cairo_close_path (cr); + + cairo_stroke (cr); + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (leaky_dashed_stroke, + "Exercises bug in which a dashed stroke leaks in from outside the surface", + "dash, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/leaky-polygon.c b/test/leaky-polygon.c new file mode 100644 index 000000000..0ea7094c9 --- /dev/null +++ b/test/leaky-polygon.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2005-01-07 Carl Worth + * + * Bug reported: + * + * From: Chris + * Subject: [cairo] Render to image buffer artifacts + * To: cairo@cairographics.org + * Date: Fri, 07 Jan 2005 02:22:28 -0500 + * + * I've attached the code and image that shows this off. Scaling at + * different levels seems to change the corruption. + * + * For some reason there are artifacts in the alpha channel. I don't know + * if that's the only place, but the alpha channel looks bad. + * + * If you run the code and parse the attached image, directing stdout to a + * file, you can see in the lower left corner there are alpha values where + * it should be transparent. + * [...] + * + * 2005-01-11 Carl Worth + * + * I trimmed the original test case down to the code that appears here. + * + */ + +#include "cairo-test.h" + +#define WIDTH 21 +#define HEIGHT 21 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_scale (cr, 1.0/(1<<16), 1.0/(1<<16)); + + cairo_move_to (cr, 131072,39321); + cairo_line_to (cr, 1103072,1288088); + cairo_line_to (cr, 1179648,1294990); + cairo_close_path (cr); + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (leaky_polygon, + "Exercises a corner case in the trapezoid rasterization in which pixels outside the trapezoids received a non-zero alpha", + "fill, trap", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/line-width-large-overlap.c b/test/line-width-large-overlap.c new file mode 100644 index 000000000..767734f6b --- /dev/null +++ b/test/line-width-large-overlap.c @@ -0,0 +1,149 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +/* + * Test case taken from the WebKit test suite, failure originally reported + * by Zan Dobersek . WebKit test is + * LayoutTests/canvas/philip/tests/2d.path.rect.selfintersect.html + */ + +#include "cairo-test.h" + +#include + +#define LINE_WIDTH 120 +#define SIZE 100 +#define RECT_SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* fill with green so RGB and RGBA tests can share the ref image */ + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + /* red to see eventual bugs immediately */ + cairo_set_source_rgb (cr, 1, 0, 0); + + /* big line width */ + cairo_set_line_width (cr, LINE_WIDTH); + + /* rectangle that is smaller than the line width in center of image */ + cairo_rectangle (cr, + (SIZE - RECT_SIZE) / 2, + (SIZE - RECT_SIZE) / 2, + RECT_SIZE, + RECT_SIZE); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +/* and again slightly offset to trigger another path */ +static cairo_test_status_t +draw_offset (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, .5, .5); + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_rotated (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, SIZE/2, SIZE/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -SIZE/2, -SIZE/2); + + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_flipped (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, SIZE/2, SIZE/2); + cairo_scale (cr, -1, 1); + cairo_translate (cr, -SIZE/2, -SIZE/2); + + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_flopped (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, SIZE/2, SIZE/2); + cairo_scale (cr, 1, -1); + cairo_translate (cr, -SIZE/2, -SIZE/2); + + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_dashed (cairo_t *cr, int width, int height) +{ + const double dashes[] = { 4 }; + cairo_set_dash (cr, dashes, 1, 0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + return draw (cr, width, height); +} + +CAIRO_TEST (line_width_large_overlap, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) +CAIRO_TEST (line_width_large_overlap_offset, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_offset) +CAIRO_TEST (line_width_large_overlap_rotated, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_rotated) +CAIRO_TEST (line_width_large_overlap_flipped, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_flipped) +CAIRO_TEST (line_width_large_overlap_flopped, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_flopped) +CAIRO_TEST (line_width_large_overlap_dashed, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_dashed) diff --git a/test/line-width-overlap.c b/test/line-width-overlap.c new file mode 100644 index 000000000..ac8c23479 --- /dev/null +++ b/test/line-width-overlap.c @@ -0,0 +1,149 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +/* + * Test case taken from the WebKit test suite, failure originally reported + * by Zan Dobersek . WebKit test is + * LayoutTests/canvas/philip/tests/2d.path.rect.selfintersect.html + */ + +#include "cairo-test.h" + +#include + +#define LINE_WIDTH 60 +#define SIZE 100 +#define RECT_SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* fill with green so RGB and RGBA tests can share the ref image */ + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + /* red to see eventual bugs immediately */ + cairo_set_source_rgb (cr, 1, 0, 0); + + /* big line width */ + cairo_set_line_width (cr, LINE_WIDTH); + + /* rectangle that is smaller than the line width in center of image */ + cairo_rectangle (cr, + (SIZE - RECT_SIZE) / 2, + (SIZE - RECT_SIZE) / 2, + RECT_SIZE, + RECT_SIZE); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +/* and again slightly offset to trigger another path */ +static cairo_test_status_t +draw_offset (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, .5, .5); + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_rotated (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, SIZE/2, SIZE/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -SIZE/2, -SIZE/2); + + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_flipped (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, SIZE/2, SIZE/2); + cairo_scale (cr, -1, 1); + cairo_translate (cr, -SIZE/2, -SIZE/2); + + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_flopped (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, SIZE/2, SIZE/2); + cairo_scale (cr, 1, -1); + cairo_translate (cr, -SIZE/2, -SIZE/2); + + return draw (cr, width, height); +} + +static cairo_test_status_t +draw_dashed (cairo_t *cr, int width, int height) +{ + const double dashes[] = { 4 }; + cairo_set_dash (cr, dashes, 1, 0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + return draw (cr, width, height); +} + +CAIRO_TEST (line_width_overlap, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) +CAIRO_TEST (line_width_overlap_offset, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_offset) +CAIRO_TEST (line_width_overlap_rotated, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_rotated) +CAIRO_TEST (line_width_overlap_flipped, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_flipped) +CAIRO_TEST (line_width_overlap_flopped, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_flopped) +CAIRO_TEST (line_width_overlap_dashed, + "Test overlapping lines due to large line width", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_dashed) diff --git a/test/line-width-scale.c b/test/line-width-scale.c new file mode 100644 index 000000000..037b887fd --- /dev/null +++ b/test/line-width-scale.c @@ -0,0 +1,178 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +/* This test exercises the various interactions between + * cairo_set_line_width and cairo_scale. Specifically it shows how + * separate transformations can affect the pen for stroking compared + * to the path itself. + * + * This was inspired by an image by Maxim Shemanarev demonstrating the + * flexible-pipeline nature of his Antigrain Geometry project: + * + * http://antigrain.com/tips/line_alignment/conv_order.gif + * + * It also uncovered some behavior in cairo that I found surprising. + * Namely, cairo_set_line_width was not transforming the width + * according the the current CTM, but instead delaying that + * transformation until the time of cairo_stroke. + * + * This delayed behavior was released in cairo 1.0 so we're going to + * document this as the way cairo_set_line_width works rather than + * considering this a bug. + */ + +#define LINE_WIDTH 13 +#define SPLINE 50.0 +#define XSCALE 0.5 +#define YSCALE 2.0 +#define WIDTH (XSCALE * SPLINE * 6.0) +#define HEIGHT (YSCALE * SPLINE * 2.0) + +static void +spline_path (cairo_t *cr) +{ + cairo_save (cr); + { + cairo_move_to (cr, + - SPLINE, 0); + cairo_curve_to (cr, + - SPLINE / 4, - SPLINE, + SPLINE / 4, SPLINE, + SPLINE, 0); + } + cairo_restore (cr); +} + +/* If we scale before setting the line width or creating the path, + * then obviously both will be scaled. */ +static void +scale_then_set_line_width_and_stroke (cairo_t *cr) +{ + cairo_scale (cr, XSCALE, YSCALE); + cairo_set_line_width (cr, LINE_WIDTH); + spline_path (cr); + cairo_stroke (cr); +} + +/* This is used to verify the results of + * scale_then_set_line_width_and_stroke. + * + * It uses save/restore pairs to isolate the scaling of the path and + * line_width and ensures that both are scaled. + */ +static void +scale_path_and_line_width (cairo_t *cr) +{ + cairo_save (cr); + { + cairo_scale (cr, XSCALE, YSCALE); + spline_path (cr); + } + cairo_restore (cr); + + cairo_save (cr); + { + cairo_scale (cr, XSCALE, YSCALE); + cairo_set_line_width (cr, LINE_WIDTH); + cairo_stroke (cr); + } + cairo_restore (cr); +} + +/* This is the case that was surprising. + * + * Setting the line width before scaling doesn't change anything. The + * line width will be interpreted under the CTM in effect at the time + * of cairo_stroke, so the line width will be scaled as well as the + * path here. + */ +static void +set_line_width_then_scale_and_stroke (cairo_t *cr) +{ + cairo_set_line_width (cr, LINE_WIDTH); + cairo_scale (cr, XSCALE, YSCALE); + spline_path (cr); + cairo_stroke (cr); +} + +/* Here then is the way to achieve the alternate result. + * + * This uses save/restore pairs to isolate the scaling of the path and + * line_width and ensures that the path is scaled while the line width + * is not. + */ +static void +scale_path_not_line_width (cairo_t *cr) +{ + cairo_save (cr); + { + cairo_scale (cr, XSCALE, YSCALE); + spline_path (cr); + } + cairo_restore (cr); + + cairo_save (cr); + { + cairo_set_line_width (cr, LINE_WIDTH); + cairo_stroke (cr); + } + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + void (* const figures[4]) (cairo_t *cr) = { + scale_then_set_line_width_and_stroke, + scale_path_and_line_width, + set_line_width_then_scale_and_stroke, + scale_path_not_line_width + }; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + for (i = 0; i < 4; i++) { + cairo_save (cr); + cairo_translate (cr, + WIDTH/4 + (i % 2) * WIDTH/2, + HEIGHT/4 + (i / 2) * HEIGHT/2); + (figures[i]) (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (line_width_scale, + "Tests interaction of cairo_set_line_width with cairo_scale", + "stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/line-width-tolerance.c b/test/line-width-tolerance.c new file mode 100644 index 000000000..5a581ca11 --- /dev/null +++ b/test/line-width-tolerance.c @@ -0,0 +1,66 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +/* + * Test case taken from the WebKit test suite, failure originally reported + * by Zan Dobersek at + * https://bugs.webkit.org/show_bug.cgi?id=54471 + */ + +#include "cairo-test.h" + +#include + +#define RADIUS 50 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* fill with green so RGB and RGBA tests can share the ref image */ + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + /* red to see eventual bugs immediately */ + cairo_set_source_rgb (cr, 1, 0, 0); + + /* stroke 3/4 of a circle where the last quarter would be this + * reference image. Keep just a 1 pixel border. Use a huge line + * width (twice the circle's radius to get it filled completely). + */ + cairo_set_line_width (cr, 2 * RADIUS); + cairo_arc (cr, 1, RADIUS - 1, RADIUS, 0, - M_PI / 2.0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (line_width_tolerance, + "Test interaction of line width and tolerance when stroking arcs", + "stroke", /* keywords */ + NULL, /* requirements */ + RADIUS, RADIUS, + NULL, draw) diff --git a/test/line-width-zero.c b/test/line-width-zero.c new file mode 100644 index 000000000..c7ac8a0fd --- /dev/null +++ b/test/line-width-zero.c @@ -0,0 +1,71 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl Worth + */ + +#include "cairo-test.h" + +/* This is a test case for the following bug: + * + * Crash in cairo_stroke_extents whe line width is 0 and line cap is ROUND + * (_cairo_pen_find_active_cw_vertex_index) + * https://bugs.freedesktop.org/show_bug.cgi?id=10231 + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double x1, y1, x2, y2; + + cairo_move_to (cr, 0.0, 0.0); + cairo_line_to (cr, 100.0, 100.0); + cairo_set_line_width (cr, 0.0); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_stroke_extents (cr, &x1, &y1, &x2, &y2); + cairo_in_stroke (cr, 50, 50); + cairo_stroke_preserve (cr); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke_extents (cr, &x1, &y1, &x2, &y2); + cairo_in_stroke (cr, 50, 50); + cairo_stroke_preserve (cr); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_stroke_extents (cr, &x1, &y1, &x2, &y2); + cairo_in_stroke (cr, 50, 50); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (line_width_zero, + "Test all stroke operations and all cap,join styles with line width of zero", + "stroke", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/line-width.c b/test/line-width.c new file mode 100644 index 000000000..315ebc393 --- /dev/null +++ b/test/line-width.c @@ -0,0 +1,77 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define LINES 5 +#define LINE_LENGTH 10 +#define IMAGE_WIDTH 2 * LINE_LENGTH + 6 +#define IMAGE_HEIGHT ((LINES+4)*LINES)/2 + 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + /* We draw in black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_translate (cr, 2, 2); + + for (i=0; i < LINES; i++) { + cairo_set_line_width (cr, i+1); + cairo_move_to (cr, 0, 0); + cairo_rel_line_to (cr, LINE_LENGTH, 0); + cairo_stroke (cr); + cairo_move_to (cr, LINE_LENGTH + 2, 0.5); + cairo_rel_line_to (cr, LINE_LENGTH, 0); + cairo_stroke (cr); + cairo_translate (cr, 0, i+3); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_a1 (cairo_t *cr, int width, int height) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + return draw (cr, width, height); +} + +CAIRO_TEST (line_width, + "Tests cairo_set_line_width", + "stroke", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) +CAIRO_TEST (a1_line_width, + "Tests cairo_set_line_width", + "stroke", /* keywords */ + "target=raster", /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw_a1) diff --git a/test/linear-gradient-extend.c b/test/linear-gradient-extend.c new file mode 100644 index 000000000..b1328b425 --- /dev/null +++ b/test/linear-gradient-extend.c @@ -0,0 +1,92 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define NUM_EXTEND 4 +#define HEIGHT 16 +#define WIDTH 16 +#define PAD 3 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + unsigned int i, j; + + cairo_extend_t extend[NUM_EXTEND] = { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD + }; + + cairo_test_paint_checkered (cr); + + pattern = cairo_pattern_create_linear (0, 2*PAD, 0, HEIGHT - 2*PAD); + + cairo_pattern_add_color_stop_rgb (pattern, 0, 0, 0, 1); + cairo_pattern_add_color_stop_rgb (pattern, 1, 0, 0, 1); + + cairo_translate (cr, PAD, PAD); + + for (i = 0; i < 2; i++) { + cairo_save (cr); + + for (j = 0; j < NUM_EXTEND; j++) { + cairo_pattern_set_extend (pattern, extend[j]); + + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + if (i & 1) { + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_mask (cr, pattern); + } else { + cairo_set_source (cr, pattern); + cairo_paint (cr); + } + + cairo_translate (cr, WIDTH+PAD, 0); + } + + cairo_restore (cr); + cairo_translate (cr, 0, HEIGHT+PAD); + } + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_gradient_extend, + "Tests gradient to solid reduction of linear gradients", + "linear, pattern, extend", /* keywords */ + NULL, /* requirements */ + (WIDTH+PAD) * NUM_EXTEND + PAD, 2*(HEIGHT + PAD) + PAD, + NULL, draw) diff --git a/test/linear-gradient-large.c b/test/linear-gradient-large.c new file mode 100644 index 000000000..5646aa485 --- /dev/null +++ b/test/linear-gradient-large.c @@ -0,0 +1,68 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Krzysztof Kosiński + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Krzysztof Kosiński + */ + +#include "cairo-test.h" + +/* originally reported in https://bugs.freedesktop.org/show_bug.cgi?id=29470 */ + +#define OFFSET 50 +#define SIZE 1000 + +static void mark_point(cairo_t *ct, double x, double y) +{ + cairo_rectangle(ct, x-2, y-2, 4, 4); + cairo_set_source_rgb(ct, 1,0,0); + cairo_fill(ct); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *gr = cairo_pattern_create_linear (SIZE - OFFSET, OFFSET, + OFFSET, SIZE - OFFSET); + + cairo_pattern_add_color_stop_rgb (gr, 0.0, 1, 1, 1); + cairo_pattern_add_color_stop_rgb (gr, 0.0, 0, 0, 0); + cairo_pattern_add_color_stop_rgb (gr, 1.0, 0, 0, 0); + cairo_pattern_add_color_stop_rgb (gr, 1.0, 1, 1, 1); + + cairo_set_source (cr, gr); + cairo_pattern_destroy (gr); + cairo_paint (cr); + + mark_point(cr, SIZE - OFFSET, OFFSET); + mark_point(cr, OFFSET, SIZE - OFFSET); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_gradient_large, + "Tests that large linear gradients get rendered at the correct place", + "linear, pattern", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/linear-gradient-one-stop.c b/test/linear-gradient-one-stop.c new file mode 100644 index 000000000..09c4b9d23 --- /dev/null +++ b/test/linear-gradient-one-stop.c @@ -0,0 +1,90 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define NUM_EXTEND 4 +#define HEIGHT 16 +#define WIDTH 16 +#define PAD 3 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + unsigned int i, j; + + cairo_extend_t extend[NUM_EXTEND] = { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD + }; + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + cairo_translate (cr, PAD, PAD); + + for (i = 0; i < 3; i++) { + cairo_save (cr); + + for (j = 0; j < NUM_EXTEND; j++) { + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + if (i == 0) + pattern = cairo_pattern_create_linear (0, 2*PAD, 0, HEIGHT - 2*PAD); + else if (i == 1) + pattern = cairo_pattern_create_linear (2*PAD, 2*PAD, HEIGHT - 2*PAD, HEIGHT - 2*PAD); + else if (i == 2) + pattern = cairo_pattern_create_linear (2*PAD, 0, HEIGHT - 2*PAD, 0); + + cairo_pattern_add_color_stop_rgb (pattern, 0.25, 0, 0, 1); + cairo_pattern_set_extend (pattern, extend[j]); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + + cairo_translate (cr, WIDTH+PAD, 0); + } + + cairo_restore (cr); + cairo_translate (cr, 0, HEIGHT+PAD); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_gradient_one_stop, + "Tests linear gradients with a single stop", + "gradient,linear,", /* keywords */ + NULL, /* requirements */ + (WIDTH+PAD) * NUM_EXTEND + PAD, 3*(HEIGHT + PAD) + PAD, + NULL, draw) diff --git a/test/linear-gradient-reflect.c b/test/linear-gradient-reflect.c new file mode 100644 index 000000000..8adb58784 --- /dev/null +++ b/test/linear-gradient-reflect.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2007 Tim Rowley + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Tim Rowley + */ + +#include "cairo-test.h" +#include "stdio.h" + +#define WIDTH 50 +#define HEIGHT 50 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + cairo_save (cr); + + pattern = cairo_pattern_create_linear (0, 0, 10.0, 0); + + cairo_pattern_add_color_stop_rgb (pattern, 0.0, + 0.0, 0.0, 1.0); + cairo_pattern_add_color_stop_rgb (pattern, 1.0, + 1.0, 0.0, 0.0); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REFLECT); + + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_rectangle (cr, 0.0, 0.0, WIDTH, HEIGHT); + cairo_fill (cr); + + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_gradient_reflect, + "Tests the drawing of linear gradient with reflect", + "gradient", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) + diff --git a/test/linear-gradient-subset.c b/test/linear-gradient-subset.c new file mode 100644 index 000000000..ce05e6ec1 --- /dev/null +++ b/test/linear-gradient-subset.c @@ -0,0 +1,127 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Owen Taylor + */ + +#include "cairo-test.h" +#include "stdio.h" + +/* The test matrix is + * + * A) Horizontal B) 5° C) 45° D) Vertical + * 1) Rotated 0° 2) Rotated 45° C) Rotated 90° + * a) 2 stop b) 3 stop + * + * A1a B1a C1a D1a + * A2a B2a C2a D2a + * A3a B3a C3a D3a + * A1b B1b C1b D1b + * A2b B2b C2b D2b + * A3b B3b C3b D3b + */ + +static const double gradient_angles[] = { 0, 45, 90 }; +#define N_GRADIENT_ANGLES 3 +static const double rotate_angles[] = { 0, 45, 90 }; +#define N_ROTATE_ANGLES 3 +static const int n_stops[] = { 2, 3 }; +#define N_N_STOPS 2 + +#define UNIT_SIZE 6 +#define UNIT_SIZE 6 +#define PAD 1 + +#define WIDTH N_GRADIENT_ANGLES * UNIT_SIZE + (N_GRADIENT_ANGLES + 1) * PAD +#define HEIGHT N_N_STOPS * N_ROTATE_ANGLES * UNIT_SIZE + (N_N_STOPS * N_ROTATE_ANGLES + 1) * PAD + +static void +draw_unit (cairo_t *cr, + double gradient_angle, + double rotate_angle, + int n_stops) +{ + cairo_pattern_t *pattern; + + cairo_rectangle (cr, 0, 0, 1, 1); + cairo_clip (cr); + cairo_new_path(cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_rectangle (cr, 0, 0, 1, 1); + cairo_fill (cr); + + cairo_translate (cr, 0.5, 0.5); + cairo_scale (cr, 1 / 1.5, 1 / 1.5); + cairo_rotate (cr, rotate_angle); + + pattern = cairo_pattern_create_linear (-0.5 * cos (gradient_angle), -0.5 * sin (gradient_angle), + 0.5 * cos (gradient_angle), 0.5 * sin (gradient_angle)); + + if (n_stops == 2) { + cairo_pattern_add_color_stop_rgb (pattern, 0.2, 0.3, 0.3, 0.3); + cairo_pattern_add_color_stop_rgb (pattern, 0.8, 1.0, 1.0, 1.0); + } else { + cairo_pattern_add_color_stop_rgb (pattern, 0.2, 1.0, 0.0, 0.0); + cairo_pattern_add_color_stop_rgb (pattern, 0.5, 1.0, 1.0, 1.0); + cairo_pattern_add_color_stop_rgb (pattern, 0.8, 0.0, 0.0, 1.0); + } + + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_rectangle (cr, -0.5, -0.5, 1, 1); + cairo_fill (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i, j, k; + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + for (i = 0; i < N_GRADIENT_ANGLES; i++) + for (j = 0; j < N_ROTATE_ANGLES; j++) + for (k = 0; k < N_N_STOPS; k++) { + cairo_save (cr); + cairo_translate (cr, + PAD + (PAD + UNIT_SIZE) * i, + PAD + (PAD + UNIT_SIZE) * (N_ROTATE_ANGLES * k + j)); + cairo_scale (cr, UNIT_SIZE, UNIT_SIZE); + + draw_unit (cr, + gradient_angles[i] * M_PI / 180., + rotate_angles[j] * M_PI / 180., + n_stops[k]); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_gradient_subset, + "Tests the drawing of linear gradients", + "gradient", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/linear-gradient.c b/test/linear-gradient.c new file mode 100644 index 000000000..054d6abbc --- /dev/null +++ b/test/linear-gradient.c @@ -0,0 +1,132 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Owen Taylor + */ + +#include "cairo-test.h" +#include "stdio.h" + +/* The test matrix is + * + * A) Horizontal B) 5° C) 45° D) Vertical + * 1) Rotated 0° 2) Rotated 45° C) Rotated 90° + * a) 2 stop b) 3 stop + * + * A1a B1a C1a D1a + * A2a B2a C2a D2a + * A3a B3a C3a D3a + * A1b B1b C1b D1b + * A2b B2b C2b D2b + * A3b B3b C3b D3b + */ + +static const double gradient_angles[] = { 0, 45, 90 }; +#define N_GRADIENT_ANGLES 3 +static const double rotate_angles[] = { 0, 45, 90 }; +#define N_ROTATE_ANGLES 3 +static const int n_stops[] = { 2, 3 }; +#define N_N_STOPS 2 + +#define UNIT_SIZE 6 +#define UNIT_SIZE 6 +#define PAD 1 + +#define WIDTH N_GRADIENT_ANGLES * UNIT_SIZE + (N_GRADIENT_ANGLES + 1) * PAD +#define HEIGHT N_N_STOPS * N_ROTATE_ANGLES * UNIT_SIZE + (N_N_STOPS * N_ROTATE_ANGLES + 1) * PAD + +static void +draw_unit (cairo_t *cr, + double gradient_angle, + double rotate_angle, + int n_stops) +{ + cairo_pattern_t *pattern; + + cairo_rectangle (cr, 0, 0, 1, 1); + cairo_clip (cr); + cairo_new_path(cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_rectangle (cr, 0, 0, 1, 1); + cairo_fill (cr); + + cairo_translate (cr, 0.5, 0.5); + cairo_scale (cr, 1 / 1.5, 1 / 1.5); + cairo_rotate (cr, rotate_angle); + + pattern = cairo_pattern_create_linear (-0.5 * cos (gradient_angle), -0.5 * sin (gradient_angle), + 0.5 * cos (gradient_angle), 0.5 * sin (gradient_angle)); + + if (n_stops == 2) { + cairo_pattern_add_color_stop_rgb (pattern, 0., + 0.3, 0.3, 0.3); + cairo_pattern_add_color_stop_rgb (pattern, 1., + 1.0, 1.0, 1.0); + } else { + cairo_pattern_add_color_stop_rgb (pattern, 0., + 1.0, 0.0, 0.0); + cairo_pattern_add_color_stop_rgb (pattern, 0.5, + 1.0, 1.0, 1.0); + cairo_pattern_add_color_stop_rgb (pattern, 1., + 0.0, 0.0, 1.0); + } + + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_rectangle (cr, -0.5, -0.5, 1, 1); + cairo_fill (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i, j, k; + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + for (i = 0; i < N_GRADIENT_ANGLES; i++) + for (j = 0; j < N_ROTATE_ANGLES; j++) + for (k = 0; k < N_N_STOPS; k++) { + cairo_save (cr); + cairo_translate (cr, + PAD + (PAD + UNIT_SIZE) * i, + PAD + (PAD + UNIT_SIZE) * (N_ROTATE_ANGLES * k + j)); + cairo_scale (cr, UNIT_SIZE, UNIT_SIZE); + + draw_unit (cr, + gradient_angles[i] * M_PI / 180., + rotate_angles[j] * M_PI / 180., + n_stops[k]); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_gradient, + "Tests the drawing of linear gradients", + "gradient", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/linear-step-function.c b/test/linear-step-function.c new file mode 100644 index 000000000..da7e8ca19 --- /dev/null +++ b/test/linear-step-function.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + pattern = cairo_pattern_create_linear (width/2, 0, width/2, 0); + cairo_pattern_add_color_stop_rgb (pattern, 0, 1, 0, 0); + cairo_pattern_add_color_stop_rgb (pattern, 1, 0, 0, 1); + cairo_set_source (cr, pattern); + + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE); /* nothing */ + cairo_rectangle (cr, 0, 0, width, height/2); + cairo_fill (cr); + + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); /* step */ + cairo_rectangle (cr, 0, height/2, width, height/2); + cairo_fill (cr); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_step_function, + "Tests creating a step function using a linear gradient", + "gradient, linear", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) diff --git a/test/linear-uniform.c b/test/linear-uniform.c new file mode 100644 index 000000000..2f6553502 --- /dev/null +++ b/test/linear-uniform.c @@ -0,0 +1,63 @@ +/* + * Copyright © 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* with alpha */ + pattern = cairo_pattern_create_linear (0, 0, 0, height); + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 1, 1, .5); + cairo_pattern_add_color_stop_rgba (pattern, 1, 1, 1, 1, .5); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_rectangle (cr, 0, 0, width/2, height); + cairo_fill (cr); + + /* without alpha */ + pattern = cairo_pattern_create_linear (0, 0, 0, height); + cairo_pattern_add_color_stop_rgb (pattern, 0, 1, 1, 1); + cairo_pattern_add_color_stop_rgb (pattern, 1, 1, 1, 1); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + cairo_rectangle (cr, width/2, 0, width/2, height); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (linear_uniform, + "Tests handling of \"solid\" linear gradients", + "gradient, linear", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) diff --git a/test/long-dashed-lines.c b/test/long-dashed-lines.c new file mode 100644 index 000000000..4d6ded9a5 --- /dev/null +++ b/test/long-dashed-lines.c @@ -0,0 +1,66 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The author makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHOR. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + double dashes[] = {6, 3}; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* partially visible rectangle... */ + cairo_rectangle (cr, -0.5, -0.5, 61, 61); + + /* rectangles with intersecting segments... */ + cairo_save (cr); + cairo_translate (cr, 30, 30); + for (i = 0; i < 4; i++) { + cairo_rotate (cr, M_PI / 4); + cairo_rectangle (cr, -37, -15, 74, 30); + } + cairo_restore (cr); + + /* completely invisible rectangle */ + cairo_rectangle (cr, -5, -5, 70, 70); + + cairo_set_dash (cr, dashes, ARRAY_LENGTH (dashes), 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (long_dashed_lines, + "Exercises _cairo_box_intersects_line_segment()", + "dash, stroke, stress", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/long-lines.c b/test/long-lines.c new file mode 100644 index 000000000..69b64e9c4 --- /dev/null +++ b/test/long-lines.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Carl D. Worth + * Emmanuel Pacaud + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 1. +#define SIZE 10 +#define LINE_NBR 6 + +struct { + double length; + double red, green, blue; +} lines[LINE_NBR] = { + { 100.0, 1.0, 0.0, 0.0 }, + { 10000.0, 0.0, 1.0, 0.0 }, + { 100000.0, 0.0, 0.0, 1.0 }, + { 1000000.0, 1.0, 1.0, 0.0 }, + { 10000000.0, 0.0, 1.0, 1.0 }, + { 100000000.0, 1.0, 0.0, 1.0 } +}; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double pos; + int i; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, LINE_WIDTH); + + pos = SIZE + .5; + for (i = 0; i < LINE_NBR; i++) { + cairo_move_to (cr, pos, -lines[i].length); + cairo_line_to (cr, pos, +lines[i].length); + cairo_set_source_rgb (cr, lines[i].red, lines[i].green, lines[i].blue); + cairo_stroke (cr); + pos += SIZE; + } + + /* This should display a perfect vertically centered black line */ + cairo_move_to (cr, 0.5, -1e100); + cairo_line_to (cr, pos, 1e100); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +/* XFAIL: range overflow of fixed-point */ +CAIRO_TEST (long_lines, + "Test long lines" + "\nLong lines are not drawn due to the limitations of the internal 16.16 fixed-point coordinates", + "stroke, stress", /* keywords */ + NULL, /* requirements */ + SIZE * (LINE_NBR + 1), SIZE * (LINE_NBR + 1), + NULL, draw) + diff --git a/test/make-cairo-test-constructors.sh b/test/make-cairo-test-constructors.sh new file mode 100644 index 000000000..cb1391e73 --- /dev/null +++ b/test/make-cairo-test-constructors.sh @@ -0,0 +1,29 @@ +#! /bin/sh + +if test $# -eq 0; then + echo "$0: no input files." >&2 + exit 0 +fi + +cat < + */ + +#include "cairo-test.h" + +#define WIDTH 3 +#define HEIGHT 3 + +/* A single, black pixel */ +static const uint32_t black_pixel_argb = 0xff000000; +static const uint32_t black_pixel = 0x00000000; + +static cairo_bool_t +set_pixel_black(uint8_t *data, int stride, + cairo_format_t format, int x, int y) +{ + switch (format) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + *(uint32_t *)(data + y * stride + 4*x) = black_pixel_argb; + break; + case CAIRO_FORMAT_RGB16_565: + *(uint16_t *)(data + y * stride + 2*x) = black_pixel; + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_INVALID: + default: + return FALSE; + } + return TRUE; +} + +static cairo_test_status_t +all (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint8_t *data; + int stride; + cairo_format_t format; + int i, j; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + surface = cairo_surface_map_to_image (cairo_get_target (cr), NULL); + cairo_surface_flush (surface); + format = cairo_image_surface_get_format (surface); + stride = cairo_image_surface_get_stride (surface); + data = cairo_image_surface_get_data (surface); + if (data) { + for (j = 0; j < HEIGHT; j++) + for (i = 0; i < WIDTH; i++) + if (! set_pixel_black (data, stride, format, i, j)) + return CAIRO_TEST_FAILURE; + } + cairo_surface_mark_dirty (surface); + cairo_surface_unmap_image (cairo_get_target (cr), surface); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +bit (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_rectangle_int_t extents; + cairo_format_t format; + uint8_t *data; + + extents.x = extents.y = extents.width = extents.height = 1; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + surface = cairo_surface_map_to_image (cairo_get_target (cr), &extents); + cairo_surface_flush (surface); + data = cairo_image_surface_get_data (surface); + format = cairo_image_surface_get_format (surface); + if (data) { + if (! set_pixel_black (data, 0, format, 0, 0)) + return CAIRO_TEST_FAILURE; + } + cairo_surface_mark_dirty (surface); + cairo_surface_unmap_image (cairo_get_target (cr), surface); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +fill (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_rectangle_int_t extents; + cairo_t *cr2; + + extents.x = extents.y = extents.width = extents.height = 1; + + /* Fill background white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + surface = cairo_surface_map_to_image (cairo_get_target (cr), &extents); + cr2 = cairo_create (surface); + cairo_set_source_rgb (cr2, 1, 0, 0); + cairo_paint (cr2); + cairo_destroy (cr2); + cairo_surface_unmap_image (cairo_get_target (cr), surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (map_all_to_image, + "Test maping a surface to an image and modifying it externally", + "image", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, all) +CAIRO_TEST (map_bit_to_image, + "Test maping a surface to an image and modifying it externally", + "image", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, bit) +CAIRO_TEST (map_to_image_fill, + "Test maping a surface to an image and modifying it externally", + "image", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, fill) diff --git a/test/mask-alpha.c b/test/mask-alpha.c new file mode 100644 index 000000000..d66e0ac13 --- /dev/null +++ b/test/mask-alpha.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2007 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 40 +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to test that PDF viewers use the correct + * alpha values in an Alpha SMasks. Some viewers use the color values + * instead of the alpha. The test draws a triangle and rectangle in a + * group then draws the group using cairo_mask(). The mask consists of + * a circle with the rgba (0.4, 0.4, 0.4, 0.8) and the background rgba + * (0.8, 0.8, 0.8, 0.4). + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_translate (cr, PAD, PAD); + + /* mask */ + cairo_push_group (cr); + cairo_set_source_rgba (cr, 0.8, 0.8, 0.8, 0.4); + cairo_paint (cr); + cairo_arc (cr, SIZE / 2, SIZE / 2, SIZE / 6, 0., 2. * M_PI); + cairo_set_source_rgba (cr, 0.4, 0.4, 0.4, 0.8); + cairo_fill (cr); + pattern = cairo_pop_group (cr); + + /* source */ + cairo_push_group (cr); + cairo_rectangle (cr, 0.3 * SIZE, 0.2 * SIZE, 0.5 * SIZE, 0.5 * SIZE); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill (cr); + cairo_move_to (cr, 0.0, 0.8 * SIZE); + cairo_rel_line_to (cr, 0.7 * SIZE, 0.0); + cairo_rel_line_to (cr, -0.375 * SIZE, -0.6 * SIZE); + cairo_close_path (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_fill (cr); + cairo_pop_group_to_source (cr); + + cairo_mask (cr, pattern); + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mask_alpha, + "A simple test painting a group through a circle mask", + "mask, alpha", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mask-ctm.c b/test/mask-ctm.c new file mode 100644 index 000000000..205ab0691 --- /dev/null +++ b/test/mask-ctm.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask_surface; + cairo_pattern_t *mask; + uint32_t data[] = { + 0x80000000, 0x80000000, + 0x80000000, 0x80000000, + }; + cairo_matrix_t matrix; + + mask_surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_ARGB32, 2, 2, 8); + mask = cairo_pattern_create_for_surface (mask_surface); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + + /* We can translate with the CTM, with the pattern matrix, or with + * both. */ + + /* 1. CTM alone. */ + cairo_save (cr); + { + cairo_translate (cr, 2, 2); + cairo_mask (cr, mask); + } + cairo_restore (cr); + + /* 2. Pattern matrix alone. */ + cairo_matrix_init_translate (&matrix, -4, -4); + cairo_pattern_set_matrix (mask, &matrix); + + cairo_mask (cr, mask); + + /* 3. CTM + pattern matrix */ + cairo_translate (cr, 2, 2); + cairo_mask (cr, mask); + + cairo_pattern_destroy (mask); + + cairo_surface_finish (mask_surface); /* data goes out of scope */ + cairo_surface_destroy (mask_surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mask_ctm, + "Test that cairo_mask is affected properly by the CTM", + "mask", /* keywords */ + NULL, /* requirements */ + 10, 10, + NULL, draw) + diff --git a/test/mask-glyphs.c b/test/mask-glyphs.c new file mode 100644 index 000000000..2e7b70301 --- /dev/null +++ b/test/mask-glyphs.c @@ -0,0 +1,187 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include + +static const char *png_filename = "romedalen.png"; + +#define WIDTH 800 +#define HEIGHT 600 + +static cairo_status_t +_image_to_glyphs (cairo_surface_t *image, + int channel, + int level, + cairo_scaled_font_t *scaled_font, + double tx, double ty, + cairo_glyph_t *glyphs, + int *num_glyphs) +{ + int width, height, stride; + const unsigned char *data; + int x, y, z, n; + + width = cairo_image_surface_get_width (image); + height = cairo_image_surface_get_height (image); + stride = cairo_image_surface_get_stride (image); + data = cairo_image_surface_get_data (image); + + n = 0; + for (y = 0; y < height; y++) { + const uint32_t *row = (uint32_t *) (data + y * stride); + + for (x = 0; x < width; x++) { + z = (row[x] >> channel) & 0xff; + if (z == level) { + double xx, yy, zz; + char c = n % 26 + 'a'; + int count = 1; + cairo_glyph_t *glyphs_p = &glyphs[n]; + cairo_status_t status; + + xx = 4 * (x - width/2.) + width/2.; + yy = 4 * (y - height/2.) + height/2.; + + zz = z / 1000.; + xx = xx + zz*(width/2. - xx); + yy = yy + zz*(height/2. - yy); + + cairo_scaled_font_text_to_glyphs (scaled_font, + tx + xx, ty + yy, + &c, 1, + &glyphs_p, &count, + NULL, NULL, + NULL); + status = cairo_scaled_font_status (scaled_font); + if (status) + return status; + + assert (glyphs_p == &glyphs[n]); + assert (count == 1); + n++; + } + } + } + + *num_glyphs = n; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_render_image (cairo_t *cr, + int width, int height, + cairo_surface_t *image) +{ + int ww, hh; + cairo_glyph_t *glyphs; + cairo_pattern_t *mask; + cairo_scaled_font_t *scaled_font; + double tx, ty; + const struct { + int shift; + double red; + double green; + double blue; + } channel[3] = { + { 0, 0.9, 0.3, 0.4 }, + { 8, 0.4, 0.9, 0.3 }, + { 16, 0.3, 0.4, 0.9 }, + }; + unsigned int n, i; + + ww = cairo_image_surface_get_width (image); + hh = cairo_image_surface_get_height (image); + + glyphs = cairo_glyph_allocate (ww * hh); + if (glyphs == NULL) + return CAIRO_STATUS_NO_MEMORY; + + tx = (width - ww) / 2.; + ty = (height - hh) / 2.; + + cairo_set_font_size (cr, 5); + scaled_font = cairo_get_scaled_font (cr); + + for (i = 0; i < ARRAY_LENGTH (channel); i++) { + cairo_push_group_with_content (cr, CAIRO_CONTENT_ALPHA); + for (n = 0; n < 256; n++) { + cairo_status_t status; + int num_glyphs; + + status = _image_to_glyphs (image, channel[i].shift, n, + scaled_font, + tx, ty, glyphs, &num_glyphs); + if (status) { + cairo_glyph_free (glyphs); + return status; + } + + cairo_set_source_rgba (cr, + 0, 0, 0, + .15 + .85 * n / 255.); + cairo_show_glyphs (cr, glyphs, num_glyphs); + } + mask = cairo_pop_group (cr); + cairo_set_source_rgb (cr, + channel[i].red, + channel[i].green, + channel[i].blue); + cairo_mask (cr, mask); + cairo_pattern_destroy (mask); + } + + cairo_glyph_free (glyphs); + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + cairo_status_t status; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + image = cairo_test_create_surface_from_png (ctx, png_filename); + status = cairo_surface_status (image); + if (status) + return cairo_test_status_from_status (ctx, status); + + status = _render_image (cr, width, height, image); + cairo_surface_destroy (image); + + return cairo_test_status_from_status (ctx, status); +} + +CAIRO_TEST (mask_glyphs, + "Creates a mask using a distorted array of overlapping glyphs", + "mask, glyphs", /* keywords */ + "slow", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mask-surface-ctm.c b/test/mask-surface-ctm.c new file mode 100644 index 000000000..064de3c54 --- /dev/null +++ b/test/mask-surface-ctm.c @@ -0,0 +1,71 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + uint32_t data[] = { + 0x80000000, 0x80000000, + 0x80000000, 0x80000000, + }; + + mask = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_ARGB32, 2, 2, 8); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + + /* We can translate with the CTM, with the mask_surface offset, or + * with both. */ + + /* 1. CTM alone. */ + cairo_save (cr); + { + cairo_translate (cr, 2, 2); + cairo_mask_surface (cr, mask, 0, 0); + } + cairo_restore (cr); + + /* 2. Offset alone. */ + cairo_mask_surface (cr, mask, 4, 4); + + /* 3. CTM + offset */ + cairo_translate (cr, 2, 2); + cairo_mask_surface (cr, mask, 4, 4); + + cairo_surface_finish (mask); /* data goes out of scope */ + cairo_surface_destroy (mask); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mask_surface_ctm, + "Test that cairo_mask_surface is affected properly by the CTM", + "mask", /* keywords */ + NULL, /* requirements */ + 10, 10, + NULL, draw) diff --git a/test/mask-transformed-image.c b/test/mask-transformed-image.c new file mode 100644 index 000000000..13c8fe7fc --- /dev/null +++ b/test/mask-transformed-image.c @@ -0,0 +1,96 @@ +/* + * Copyright 2008 Kai-Uwe Behrmann + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Kai-Uwe Behrmann not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Kai-Uwe Behrmann makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * KAI_UWE BEHRMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL KAI_UWE BEHRMANN BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kai-Uwe Behrmann + * Chris Wilson + */ + +#include "cairo-test.h" + +static const char png_filename[] = "romedalen.png"; + +static cairo_surface_t * +create_mask (cairo_t *dst, int width, int height) +{ + cairo_surface_t *mask; + cairo_t *cr; + + mask = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); + cr = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_rectangle (cr, width/4, height/4, width/2, height/2); + cairo_fill (cr); + + mask = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return mask; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image, *mask; + + image = cairo_test_create_surface_from_png (ctx, png_filename); + mask = create_mask (cr, 40, 40); + + /* opaque background */ + cairo_paint (cr); + + /* center */ + cairo_translate (cr, + (width - cairo_image_surface_get_width (image)) / 2., + (height - cairo_image_surface_get_height (image)) / 2.); + + /* rotate 30 degree around the center */ + cairo_translate (cr, width/2., height/2.); + cairo_rotate (cr, -30 * 2 * M_PI / 360); + cairo_translate (cr, -width/2., -height/2.); + + /* place the image on our surface */ + cairo_set_source_surface (cr, image, 0, 0); + + /* reset the drawing matrix */ + cairo_identity_matrix (cr); + + /* fill nicely */ + cairo_scale (cr, width / 40., height / 40.); + + /* apply the mask */ + cairo_mask_surface (cr, mask, 0, 0); + + cairo_surface_destroy (mask); + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mask_transformed_image, + "Test that cairo_mask() is affected properly by the CTM and not the image", + "mask", /* keywords */ + NULL, /* requirements */ + 80, 80, + NULL, draw) diff --git a/test/mask-transformed-similar.c b/test/mask-transformed-similar.c new file mode 100644 index 000000000..c37deb2c0 --- /dev/null +++ b/test/mask-transformed-similar.c @@ -0,0 +1,98 @@ +/* + * Copyright 2008 Kai-Uwe Behrmann + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Kai-Uwe Behrmann not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Kai-Uwe Behrmann makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * KAI_UWE BEHRMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL KAI_UWE BEHRMANN BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kai-Uwe Behrmann + * Chris Wilson + */ + +#include "cairo-test.h" + +static const char png_filename[] = "romedalen.png"; + +static cairo_surface_t * +create_mask (cairo_t *dst, int width, int height) +{ + cairo_surface_t *mask; + cairo_t *cr; + + mask = cairo_surface_create_similar (cairo_get_target (dst), + CAIRO_CONTENT_ALPHA, + width, height); + cr = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_rectangle (cr, width/4, height/4, width/2, height/2); + cairo_fill (cr); + + mask = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return mask; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image, *mask; + + image = cairo_test_create_surface_from_png (ctx, png_filename); + mask = create_mask (cr, 40, 40); + + /* opaque background */ + cairo_paint (cr); + + /* center */ + cairo_translate (cr, + (width - cairo_image_surface_get_width (image)) / 2., + (height - cairo_image_surface_get_height (image)) / 2.); + + /* rotate 30 degree around the center */ + cairo_translate (cr, width/2., height/2.); + cairo_rotate (cr, -30 * 2 * M_PI / 360); + cairo_translate (cr, -width/2., -height/2.); + + /* place the image on our surface */ + cairo_set_source_surface (cr, image, 0, 0); + + /* reset the drawing matrix */ + cairo_identity_matrix (cr); + + /* fill nicely */ + cairo_scale (cr, width / 40., height / 40.); + + /* apply the mask */ + cairo_mask_surface (cr, mask, 0, 0); + + cairo_surface_destroy (mask); + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mask_transformed_similar, + "Test that cairo_mask() is affected properly by the CTM and not the image", + "mask", /* keywords */ + NULL, /* requirements */ + 80, 80, + NULL, draw) diff --git a/test/mask.c b/test/mask.c new file mode 100644 index 000000000..89f4c3cc2 --- /dev/null +++ b/test/mask.c @@ -0,0 +1,246 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Owen Taylor + * Kristian Høgsberg + */ + +#include "cairo-test.h" +#include +#include + +#define WIDTH 16 +#define HEIGHT 16 +#define PAD 2 + +static const char *png_filename = "romedalen.png"; +static cairo_surface_t *image; + +static void +set_solid_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_set_source_rgb (cr, 0, 0, 0.6); +} + +static void +set_translucent_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_set_source_rgba (cr, 0, 0, 0.6, 0.5); +} + +static void +set_gradient_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = + cairo_pattern_create_linear (x, y, x + WIDTH, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 1, 1, 1); + cairo_pattern_add_color_stop_rgba (pattern, 1, 0, 0, 0.4, 1); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); +} + +static void +set_image_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + if (image == NULL || cairo_surface_status (image)) { + cairo_surface_destroy (image); + image = cairo_test_create_surface_from_png (ctx, png_filename); + } + + pattern = cairo_pattern_create_for_surface (image); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); +} + +static void +mask_polygon (cairo_t *cr, int x, int y) +{ + cairo_surface_t *mask_surface; + cairo_t *cr2; + + mask_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + WIDTH, HEIGHT); + cr2 = cairo_create (mask_surface); + cairo_surface_destroy (mask_surface); + + cairo_save (cr2); + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + cairo_restore (cr2); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_new_path (cr2); + cairo_move_to (cr2, 0, 0); + cairo_line_to (cr2, 0, HEIGHT); + cairo_line_to (cr2, WIDTH / 2, 3 * HEIGHT / 4); + cairo_line_to (cr2, WIDTH, HEIGHT); + cairo_line_to (cr2, WIDTH, 0); + cairo_line_to (cr2, WIDTH / 2, HEIGHT / 4); + cairo_close_path (cr2); + cairo_fill (cr2); + + cairo_mask_surface (cr, cairo_get_target (cr2), x, y); + cairo_destroy (cr2); +} + +static void +mask_alpha (cairo_t *cr, int x, int y) +{ + cairo_paint_with_alpha (cr, 0.75); +} + +static void +mask_gradient (cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_linear (x, y, + x + WIDTH, y + HEIGHT); + + cairo_pattern_add_color_stop_rgba (pattern, + 0, + 1, 1, 1, 1); + cairo_pattern_add_color_stop_rgba (pattern, + 1, + 1, 1, 1, 0); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + +static void +clip_none (cairo_t *cr, int x, int y) +{ +} + +static void +clip_rects (cairo_t *cr, int x, int y) +{ + int height = HEIGHT / 3; + + cairo_new_path (cr); + cairo_rectangle (cr, x, y, WIDTH, height); + cairo_rectangle (cr, x, y + 2 * height, WIDTH, height); + cairo_clip (cr); +} + +static void +clip_circle (cairo_t *cr, int x, int y) +{ + cairo_new_path (cr); + cairo_arc (cr, x + WIDTH / 2, y + HEIGHT / 2, + WIDTH / 2, 0, 2 * M_PI); + cairo_clip (cr); + cairo_new_path (cr); +} + +static void (* const pattern_funcs[])(const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) = { + set_solid_pattern, + set_translucent_pattern, + set_gradient_pattern, + set_image_pattern, +}; + +static void (* const mask_funcs[])(cairo_t *cr, int x, int y) = { + mask_alpha, + mask_gradient, + mask_polygon, +}; + +static void (* const clip_funcs[])(cairo_t *cr, int x, int y) = { + clip_none, + clip_rects, + clip_circle, +}; + +#define IMAGE_WIDTH (ARRAY_LENGTH (pattern_funcs) * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (mask_funcs) * ARRAY_LENGTH (clip_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *tmp_surface; + size_t i, j, k; + cairo_t *cr2; + + /* Some of our drawing is unbounded, so we draw each test to + * a temporary surface and copy over. + */ + tmp_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + IMAGE_WIDTH, IMAGE_HEIGHT); + cr2 = cairo_create (tmp_surface); + cairo_surface_destroy (tmp_surface); + + for (k = 0; k < ARRAY_LENGTH (clip_funcs); k++) { + for (j = 0; j < ARRAY_LENGTH (mask_funcs); j++) { + for (i = 0; i < ARRAY_LENGTH (pattern_funcs); i++) { + int x = i * (WIDTH + PAD) + PAD; + int y = (ARRAY_LENGTH (mask_funcs) * k + j) * (HEIGHT + PAD) + PAD; + + /* Clear intermediate surface we are going to be drawing onto */ + cairo_save (cr2); + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + cairo_restore (cr2); + + /* draw */ + cairo_save (cr2); + + clip_funcs[k] (cr2, x, y); + pattern_funcs[i] (ctx, cr2, x, y); + mask_funcs[j] (cr2, x, y); + + cairo_restore (cr2); + + /* Copy back to the main pixmap */ + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill (cr); + } + } + } + + cairo_destroy (cr2); + + cairo_surface_destroy (image); + image = NULL; + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mask, + "Tests of cairo_mask", + "mask", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) + diff --git a/test/mesh-pattern-accuracy.c b/test/mesh-pattern-accuracy.c new file mode 100644 index 000000000..d1f60b2fa --- /dev/null +++ b/test/mesh-pattern-accuracy.c @@ -0,0 +1,99 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" +#include + +#define SIZE 256 + +/* This test is designed to test the accuracy of the rendering of mesh + * patterns. + * + * Color accuracy is tested by a square patch covering the whole + * surface with black and white corners. + * + * Extents accuracy is checked by a small red square patch at the + * center of the surface which should measure 2x2 pixels. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + double offset; + + cairo_test_paint_checkered (cr); + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_line_to (pattern, 1, 0); + cairo_mesh_pattern_line_to (pattern, 1, 1); + cairo_mesh_pattern_line_to (pattern, 0, 1); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 0, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 1, 1, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 1); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_mesh_pattern_begin_patch (pattern); + + /* A small 1x1 red patch, that should be rendered as a 2x2 red + * square in the center of the image */ + + offset = 0.5 / SIZE; + + cairo_mesh_pattern_move_to (pattern, 0.5 + offset, 0.5 + offset); + cairo_mesh_pattern_line_to (pattern, 0.5 + offset, 0.5 - offset); + cairo_mesh_pattern_line_to (pattern, 0.5 - offset, 0.5 - offset); + cairo_mesh_pattern_line_to (pattern, 0.5 - offset, 0.5 + offset); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 0, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_scale (cr, SIZE, SIZE); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mesh_pattern_accuracy, + "Paint mesh pattern", + "mesh, pattern", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/mesh-pattern-conical.c b/test/mesh-pattern-conical.c new file mode 100644 index 000000000..4e87eec66 --- /dev/null +++ b/test/mesh-pattern-conical.c @@ -0,0 +1,135 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" +#include + +#define PAT_WIDTH 100 +#define PAT_HEIGHT 100 +#define SIZE PAT_WIDTH +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + + +/* + * This test is designed to paint a mesh pattern which contains 8 + * circular sectors approximating a conical gradient. + */ + +#define CENTER_X 50 +#define CENTER_Y 50 +#define RADIUS 50 + +static void +sector_patch (cairo_pattern_t *pattern, + double angle_A, + double A_r, double A_g, double A_b, + double angle_B, + double B_r, double B_g, double B_b) +{ + double r_sin_A, r_cos_A; + double r_sin_B, r_cos_B; + double h; + + r_sin_A = RADIUS * sin (angle_A); + r_cos_A = RADIUS * cos (angle_A); + r_sin_B = RADIUS * sin (angle_B); + r_cos_B = RADIUS * cos (angle_B); + + h = 4.0/3.0 * tan ((angle_B - angle_A) / 4.0); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, CENTER_X, CENTER_Y); + cairo_mesh_pattern_line_to (pattern, + CENTER_X + r_cos_A, + CENTER_Y + r_sin_A); + + cairo_mesh_pattern_curve_to (pattern, + CENTER_X + r_cos_A - h * r_sin_A, + CENTER_Y + r_sin_A + h * r_cos_A, + CENTER_X + r_cos_B + h * r_sin_B, + CENTER_Y + r_sin_B - h * r_cos_B, + CENTER_X + r_cos_B, + CENTER_Y + r_sin_B); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 1, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, A_r, A_g, A_b); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, B_r, B_g, B_b); + + cairo_mesh_pattern_end_patch (pattern); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, PAD, PAD); + + pattern = cairo_pattern_create_mesh (); + sector_patch (pattern, + 0, 1, 0, 0, + M_PI/4, 1, 1, 0); + sector_patch (pattern, + M_PI/4, 0, 1, 0, + M_PI/2, 0, 1, 1); + sector_patch (pattern, + M_PI/2, 0, 0, 1, + 3*M_PI/4, 1, 0, 1); + sector_patch (pattern, + 3*M_PI/4, 1, 0, 0, + M_PI, 1, 1, 0); + sector_patch (pattern, + -M_PI, 1, 1, 0, + -3*M_PI/4, 0, 1, 0); + sector_patch (pattern, + -3*M_PI/4, 0, 1, 0, + -M_PI/2, 0, 1, 1); + sector_patch (pattern, + -M_PI/2, 0, 1, 1, + -M_PI/4, 0, 0, 1); + sector_patch (pattern, + -M_PI/4, 0, 0, 1, + 0, 1, 0, 0); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mesh_pattern_conical, + "Paint a conical pattern using a mesh pattern", + "conical, mesh, pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mesh-pattern-control-points.c b/test/mesh-pattern-control-points.c new file mode 100644 index 000000000..057e7a1f6 --- /dev/null +++ b/test/mesh-pattern-control-points.c @@ -0,0 +1,114 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 90 +#define PAD 10 +#define WIDTH (PAD + 2 * (SIZE + PAD)) +#define HEIGHT (PAD + SIZE + PAD) + + +/* + * This test is designed to paint a two mesh patches. One with default + * control points and one with a control point at a no default + * location. The control points of both of them are drawn as squares + * to make them visible. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + unsigned int i, j; + unsigned int num_patches; + double x, y; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, PAD, PAD); + + pattern = cairo_pattern_create_mesh (); + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_line_to (pattern, SIZE, 0); + cairo_mesh_pattern_line_to (pattern, SIZE, SIZE); + cairo_mesh_pattern_line_to (pattern, 0, SIZE); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_set_control_point (pattern, 0, SIZE * .7, SIZE * .7); + cairo_mesh_pattern_set_control_point (pattern, 1, SIZE * .9, SIZE * .7); + cairo_mesh_pattern_set_control_point (pattern, 2, SIZE * .9, SIZE * .9); + cairo_mesh_pattern_set_control_point (pattern, 3, SIZE * .7, SIZE * .9); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, SIZE + PAD, 0); + cairo_mesh_pattern_line_to (pattern, 2*SIZE + PAD, 0); + cairo_mesh_pattern_line_to (pattern, 2*SIZE + PAD, SIZE); + cairo_mesh_pattern_line_to (pattern, SIZE + PAD, SIZE); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + /* mark the location of the control points */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_mesh_pattern_get_patch_count (pattern, &num_patches); + for (i = 0; i < num_patches; i++) { + for (j = 0; j < 4; j++) { + cairo_mesh_pattern_get_control_point (pattern, i, j, &x, &y); + cairo_rectangle (cr, x - 5, y - 5, 10, 10); + cairo_fill (cr); + } + } + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + + +CAIRO_TEST (mesh_pattern_control_points, + "Paint mesh pattern with non default control points", + "mesh, pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mesh-pattern-fold.c b/test/mesh-pattern-fold.c new file mode 100644 index 000000000..cacd712e7 --- /dev/null +++ b/test/mesh-pattern-fold.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 100 +#define PAD 15 +#define WIDTH (5*SIZE) +#define HEIGHT (5*SIZE) + + +/* This test is designed to paint a mesh pattern which folds along + * both parameters. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_test_paint_checkered (cr); + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 1, 1); + + cairo_mesh_pattern_curve_to (pattern, 6, 0, -1, 0, 4, 1); + cairo_mesh_pattern_curve_to (pattern, 5, 6, 5, -1, 4, 4); + cairo_mesh_pattern_curve_to (pattern, -1, 3, 6, 3, 1, 4); + cairo_mesh_pattern_curve_to (pattern, 2, -1, 2, 6, 1, 1); + + cairo_mesh_pattern_set_control_point (pattern, 0, 2, 3); + cairo_mesh_pattern_set_control_point (pattern, 1, 3, 3); + cairo_mesh_pattern_set_control_point (pattern, 2, 3, 2); + cairo_mesh_pattern_set_control_point (pattern, 3, 2, 2); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 0, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_scale (cr, SIZE, SIZE); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mesh_pattern_fold, + "Paint a mesh pattern with complex folds", + "mesh, pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mesh-pattern-overlap.c b/test/mesh-pattern-overlap.c new file mode 100644 index 000000000..969bc73a3 --- /dev/null +++ b/test/mesh-pattern-overlap.c @@ -0,0 +1,76 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 100 +#define PAD 15 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + + +/* This test is designed to paint a mesh pattern with a simple + * fold. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_test_paint_checkered (cr); + + cairo_translate (cr, PAD, PAD); + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); + cairo_mesh_pattern_curve_to (pattern, 130, 140, 60, -40, 100, 100); + cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); + cairo_mesh_pattern_curve_to (pattern, -30, -40, 30, 140, 0, 0); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mesh_pattern_overlap, + "Paint a mesh pattern with a simple fold", + "mesh, pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mesh-pattern-transformed.c b/test/mesh-pattern-transformed.c new file mode 100644 index 000000000..5fe0dc048 --- /dev/null +++ b/test/mesh-pattern-transformed.c @@ -0,0 +1,107 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define PAT_WIDTH 170 +#define PAT_HEIGHT 170 +#define SIZE PAT_WIDTH +#define PAD 10 +#define WIDTH 190 +#define HEIGHT 140 + + +/* This test is designed to paint a mesh pattern containing two + * overlapping patches transformed in different ways. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_test_paint_checkered (cr); + + cairo_translate (cr, PAD, PAD); + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); + cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); + cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); + cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 50, 50); + cairo_mesh_pattern_curve_to (pattern, 80, 20, 110, 80, 150, 50); + + cairo_mesh_pattern_curve_to (pattern, 110, 80, 180, 110, 150, 150); + + cairo_mesh_pattern_curve_to (pattern, 110, 120, 80, 180, 50, 150); + + cairo_mesh_pattern_curve_to (pattern, 80, 120, 20, 80, 50, 50); + + cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, 1, 0, 0, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, 0, 0, 1, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_scale (cr, .5, .5); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_translate (cr, PAT_WIDTH, PAT_HEIGHT); + cairo_translate (cr, PAT_WIDTH/2, PAT_HEIGHT/2); + cairo_rotate (cr, M_PI/4); + cairo_translate (cr, -PAT_WIDTH, -PAT_HEIGHT); + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mesh_pattern_transformed, + "Paint mesh pattern with a transformation", + "mesh, pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) + diff --git a/test/mesh-pattern.c b/test/mesh-pattern.c new file mode 100644 index 000000000..eccbd389a --- /dev/null +++ b/test/mesh-pattern.c @@ -0,0 +1,94 @@ +/* + * Copyright © 2009 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define PAT_WIDTH 170 +#define PAT_HEIGHT 170 +#define SIZE PAT_WIDTH +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + + +/* This test is designed to paint a mesh pattern. The mesh contains + * two overlapping patches */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_test_paint_checkered (cr); + + cairo_translate (cr, PAD, PAD); + cairo_translate (cr, 10, 10); + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); + cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); + cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); + cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 50, 50); + cairo_mesh_pattern_curve_to (pattern, 80, 20, 110, 80, 150, 50); + cairo_mesh_pattern_curve_to (pattern, 110, 80, 180, 110, 150, 150); + cairo_mesh_pattern_curve_to (pattern, 110, 120, 80, 180, 50, 150); + cairo_mesh_pattern_curve_to (pattern, 80, 120, 20, 80, 50, 50); + + cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, 1, 0, 0, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, 0, 0, 1, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mesh_pattern, + "Paint mesh pattern", + "mesh, pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/mime-data.c b/test/mime-data.c new file mode 100644 index 000000000..c744f5c9b --- /dev/null +++ b/test/mime-data.c @@ -0,0 +1,241 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include +#include + +/* Basic test to exercise the new mime-data embedding. */ + +static cairo_status_t +read_file (const cairo_test_context_t *ctx, + const char *filename, + unsigned char **data_out, + unsigned int *length_out) +{ + FILE *file; + unsigned char *buf; + unsigned int len; + + file = fopen (filename, "rb"); + if (file == NULL) { + char path[4096]; + + if (errno == ENOMEM) + return CAIRO_STATUS_NO_MEMORY; + + /* try again with srcdir */ + snprintf (path, sizeof (path), + "%s/%s", ctx->srcdir, filename); + file = fopen (path, "rb"); + } + if (file == NULL) { + switch (errno) { + case ENOMEM: + return CAIRO_STATUS_NO_MEMORY; + default: + return CAIRO_STATUS_FILE_NOT_FOUND; + } + } + + fseek (file, 0, SEEK_END); + len = ftell (file); + fseek (file, 0, SEEK_SET); + + buf = xmalloc (len); + *length_out = fread (buf, 1, len, file); + fclose (file); + if (*length_out != len) { + free (buf); + return CAIRO_STATUS_READ_ERROR; + } + + *data_out = buf; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +paint_file (cairo_t *cr, + const char *filename, const char *mime_type, + int x, int y) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + unsigned char *mime_data; + unsigned int mime_length; + cairo_status_t status; + + /* Deliberately use a non-matching MIME images, so that we can identify + * when the MIME representation is used in preference to the plain image + * surface. + */ + status = read_file (ctx, filename, &mime_data, &mime_length); + if (status) + return cairo_test_status_from_status (ctx, status); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 200, 50); + + status = cairo_surface_set_mime_data (image, mime_type, + mime_data, mime_length, + free, mime_data); + if (status) { + cairo_surface_destroy (image); + free (mime_data); + return cairo_test_status_from_status (ctx, status); + } + + cairo_set_source_surface (cr, image, x, y); + cairo_surface_destroy (image); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +paint_jbig2_file (cairo_t *cr, int x, int y) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + unsigned char *mime_data; + unsigned int mime_length; + cairo_status_t status; + const char jbig2_image1_filename[] = "image1.jb2"; + const char jbig2_image2_filename[] = "image2.jb2"; + const char jbig2_global_filename[] = "global.jb2"; + + /* Deliberately use a non-matching MIME images, so that we can identify + * when the MIME representation is used in preference to the plain image + * surface. + */ + + /* Image 1 */ + + status = read_file (ctx, jbig2_image1_filename, &mime_data, &mime_length); + if (status) + return cairo_test_status_from_status (ctx, status); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 200, 50); + + status = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, + (unsigned char *)"global", 6, NULL, NULL); + if (status) { + cairo_surface_destroy (image); + return cairo_test_status_from_status (ctx, status); + } + + status = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2, + mime_data, mime_length, + free, mime_data); + if (status) { + cairo_surface_destroy (image); + free (mime_data); + return cairo_test_status_from_status (ctx, status); + } + + cairo_set_source_surface (cr, image, x, y); + cairo_surface_destroy (image); + + cairo_paint (cr); + + /* Image 2 */ + + status = read_file (ctx, jbig2_image2_filename, &mime_data, &mime_length); + if (status) + return cairo_test_status_from_status (ctx, status); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 200, 50); + + status = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, + (unsigned char *)"global", 6, NULL, NULL); + if (status) { + cairo_surface_destroy (image); + return cairo_test_status_from_status (ctx, status); + } + + status = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2, + mime_data, mime_length, + free, mime_data); + if (status) { + cairo_surface_destroy (image); + free (mime_data); + return cairo_test_status_from_status (ctx, status); + } + + /* Set the global data */ + status = read_file (ctx, jbig2_global_filename, &mime_data, &mime_length); + if (status) + return cairo_test_status_from_status (ctx, status); + + status = cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2_GLOBAL, + mime_data, mime_length, + free, mime_data); + if (status) { + cairo_surface_destroy (image); + free (mime_data); + return cairo_test_status_from_status (ctx, status); + } + + cairo_set_source_surface (cr, image, x, y + 50); + cairo_surface_destroy (image); + + cairo_paint (cr); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const char jpg_filename[] = "jpeg.jpg"; + const char png_filename[] = "png.png"; + const char jp2_filename[] = "jp2.jp2"; + cairo_test_status_t status; + + status = paint_file (cr, jpg_filename, CAIRO_MIME_TYPE_JPEG, 0, 0); + if (status) + return status; + + status = paint_file (cr, png_filename, CAIRO_MIME_TYPE_PNG, 0, 50); + if (status) + return status; + + status = paint_file (cr, jp2_filename, CAIRO_MIME_TYPE_JP2, 0, 100); + if (status) + return status; + + status = paint_jbig2_file (cr, 0, 150); + if (status) + return status; + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (mime_data, + "Check that the mime-data embedding works", + "jpeg, api", /* keywords */ + NULL, /* requirements */ + 200, 250, + NULL, draw) diff --git a/test/mime-surface-api.c b/test/mime-surface-api.c new file mode 100644 index 000000000..ce12653e1 --- /dev/null +++ b/test/mime-surface-api.c @@ -0,0 +1,151 @@ +/* + * Copyright © 2011 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" + +static void +mime_data_destroy_func (void *data) +{ + cairo_bool_t *called = data; + *called = TRUE; +} + +static cairo_test_status_t +check_mime_data (cairo_test_context_t *ctx, cairo_surface_t *surface, + const char *mimetype, const unsigned char *data, + unsigned long length) +{ + const unsigned char *data_ret; + unsigned long length_ret; + + cairo_surface_get_mime_data (surface, mimetype, &data_ret, &length_ret); + if (data_ret != data || length_ret != length) { + cairo_test_log (ctx, + "Surface has mime data %p with length %lu, " + "but expected %p with length %lu\n", + data_ret, length_ret, data, length); + return CAIRO_TEST_ERROR; + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +set_and_check_mime_data (cairo_test_context_t *ctx, cairo_surface_t *surface, + const char *mimetype, const unsigned char *data, + unsigned long length, cairo_bool_t *destroy_called) +{ + cairo_status_t status; + + status = cairo_surface_set_mime_data (surface, mimetype, + data, length, + mime_data_destroy_func, + destroy_called); + if (status) { + cairo_test_log (ctx, "Could not set mime data to %s: %s\n", + data, cairo_status_to_string(status)); + return CAIRO_TEST_ERROR; + } + + return check_mime_data (ctx, surface, mimetype, data, length); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + const char *mimetype = "text/x-uri"; + const char *data1 = "http://www.cairographics.org"; + const char *data2 = "http://cairographics.org/examples/"; + cairo_bool_t destroy1_called = FALSE; + cairo_bool_t destroy2_called = FALSE; + cairo_surface_t *surface; + cairo_test_status_t test_status = CAIRO_TEST_SUCCESS; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); + if (cairo_surface_status (surface)) { + cairo_test_log (ctx, "Could not create image surface\n"); + test_status = CAIRO_TEST_ERROR; + goto out; + } + + test_status = check_mime_data (ctx, surface, mimetype, NULL, 0); + if (test_status) + goto out; + + test_status = set_and_check_mime_data (ctx, surface, mimetype, + (const unsigned char *) data1, + strlen (data1), + &destroy1_called); + if (test_status) + goto out; + + if (destroy1_called) { + cairo_test_log (ctx, "MIME data 1 destroyed too early\n"); + test_status = CAIRO_TEST_ERROR; + goto out; + } + + test_status = set_and_check_mime_data (ctx, surface, mimetype, + (const unsigned char *) data2, + strlen (data2), + &destroy2_called); + if (test_status) + goto out; + + if (!destroy1_called) { + cairo_test_log (ctx, "MIME data 1 destroy callback not called\n"); + test_status = CAIRO_TEST_ERROR; + goto out; + } + if (destroy2_called) { + cairo_test_log (ctx, "MIME data 2 destroyed too early\n"); + test_status = CAIRO_TEST_ERROR; + goto out; + } + + test_status = set_and_check_mime_data (ctx, surface, mimetype, + NULL, 0, NULL); + if (test_status) + goto out; + + if (!destroy2_called) { + cairo_test_log (ctx, "MIME data destroy callback not called\n"); + test_status = CAIRO_TEST_ERROR; + goto out; + } + +out: + cairo_surface_destroy (surface); + + return test_status; +} + +CAIRO_TEST (mime_surface_api, + "Check the mime data API", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/miter-precision.c b/test/miter-precision.c new file mode 100644 index 000000000..3bcdde00d --- /dev/null +++ b/test/miter-precision.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2007 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith Packard + */ +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double xscale, yscale; + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_miter_limit (cr, 100000); + for (xscale = 1; xscale <= 1000; xscale += 999) + for (yscale = 1; yscale <= 1000; yscale += 999) + { + double max_scale = xscale > yscale ? xscale : yscale; + cairo_save (cr); + if (xscale > 1) + cairo_translate (cr, 50, 0); + if (yscale > 1) + cairo_translate (cr, 0, 50); + cairo_scale (cr, xscale, yscale); + cairo_set_line_width (cr, 10.0 / max_scale); + cairo_move_to (cr, 10.0 / xscale, 10.0 / yscale); + cairo_line_to (cr, 40.0 / xscale, 10.0 / yscale); + cairo_line_to (cr, 10.0 / xscale, 30.0 / yscale); + cairo_stroke (cr); + cairo_restore (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (miter_precision, + "test how cairo deals with small miters" + "\ncurrent code draws inappropriate bevels at times", + "stoke, stress", /* keywords */ + NULL, /* requirements */ + 120, 100, + NULL, draw) diff --git a/test/move-to-show-surface.c b/test/move-to-show-surface.c new file mode 100644 index 000000000..a52b46827 --- /dev/null +++ b/test/move-to-show-surface.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2004-10-25 Carl Worth + * + * It looks like cairo_show_surface has no effect if it follows a + * call to cairo_move_to to any coordinate other than 0,0. A little + * bit of poking around suggests this isn't a regression, (at least + * not since the last pixman snapshot). + * + * 2005-04-02 Carl Worth + * + * Status: RESOLVED + * + * Inside cairo_show_surface the current point was being used as + * both source and destination offsets. After fixing that to use 0,0 + * as the source offset and the current point as the destination + * offset, the bug seems to be gone. + * + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t colors[4] = { + 0xffffffff, 0xffff0000, + 0xff00ff00, 0xff0000ff + }; + int i; + + for (i=0; i < 4; i++) { + surface = cairo_image_surface_create_for_data ((unsigned char *) &colors[i], + CAIRO_FORMAT_RGB24, + 1, 1, 4); + cairo_set_source_surface (cr, surface, + i % 2, i / 2); + cairo_paint (cr); + + cairo_surface_finish (surface); /* colors will go out of scope */ + cairo_surface_destroy (surface); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (move_to_show_surface, + "Tests calls to cairo_show_surface after cairo_move_to", + "transform", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/multi-page.c b/test/multi-page.c new file mode 100644 index 000000000..a3102dba3 --- /dev/null +++ b/test/multi-page.c @@ -0,0 +1,198 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include + +#include + +#if CAIRO_HAS_PS_SURFACE +#include +#endif + +#if CAIRO_HAS_PDF_SURFACE +#include +#endif + +/* The PostScript and PDF backends are now integrated into the main + * test suite, so we are getting good verification of most things + * there. + * + * One thing that isn't supported there yet is multi-page output. So, + * for now we have this one-off test. There's no automatic + * verififcation here yet, but you can manually view the output to + * make sure it looks happy. + */ + +#define WIDTH_IN_INCHES 3 +#define HEIGHT_IN_INCHES 3 +#define WIDTH_IN_POINTS (WIDTH_IN_INCHES * 72.0) +#define HEIGHT_IN_POINTS (HEIGHT_IN_INCHES * 72.0) +#define BASENAME "multi-page.out" + +static void +draw_smiley (cairo_t *cr, double width, double height, double smile_ratio) +{ +#define STROKE_WIDTH .04 + double size; + + double theta = M_PI / 4 * smile_ratio; + double dx = sqrt (0.005) * cos (theta); + double dy = sqrt (0.005) * sin (theta); + + cairo_save (cr); + + if (width > height) + size = height; + else + size = width; + + cairo_translate (cr, (width - size) / 2.0, (height - size) / 2.0); + cairo_scale (cr, size, size); + + /* Fill face */ + cairo_arc (cr, 0.5, 0.5, 0.5 - STROKE_WIDTH, 0, 2 * M_PI); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + + /* Stroke face */ + cairo_set_line_width (cr, STROKE_WIDTH / 2.0); + cairo_stroke (cr); + + /* Eyes */ + cairo_set_line_width (cr, STROKE_WIDTH); + cairo_arc (cr, 0.3, 0.4, STROKE_WIDTH, 0, 2 * M_PI); + cairo_fill (cr); + cairo_arc (cr, 0.7, 0.4, STROKE_WIDTH, 0, 2 * M_PI); + cairo_fill (cr); + + /* Mouth */ + cairo_move_to (cr, + 0.35 - dx, 0.75 - dy); + cairo_curve_to (cr, + 0.35 + dx, 0.75 + dy, + 0.65 - dx, 0.75 + dy, + 0.65 + dx, 0.75 - dy); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static void +draw_some_pages (cairo_surface_t *surface) +{ + cairo_t *cr; + int i; + + cr = cairo_create (surface); + +#define NUM_FRAMES 5 + for (i=0; i < NUM_FRAMES; i++) { + draw_smiley (cr, WIDTH_IN_POINTS, HEIGHT_IN_POINTS, + (double) i / (NUM_FRAMES - 1)); + + /* Duplicate the last frame onto another page. (This is just a + * way to sneak cairo_copy_page into the test). + */ + if (i == (NUM_FRAMES - 1)) + cairo_copy_page (cr); + + cairo_show_page (cr); + } + + cairo_destroy (cr); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_status_t status; + char *filename; + cairo_test_status_t result = CAIRO_TEST_UNTESTED; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + +#if CAIRO_HAS_PS_SURFACE + if (cairo_test_is_target_enabled (ctx, "ps2") || + cairo_test_is_target_enabled (ctx, "ps3")) + { + if (result == CAIRO_TEST_UNTESTED) + result = CAIRO_TEST_SUCCESS; + + xasprintf (&filename, "%s/%s", path, BASENAME ".ps"); + surface = cairo_ps_surface_create (filename, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + status = cairo_surface_status (surface); + if (status) { + cairo_test_log (ctx, "Failed to create ps surface for file %s: %s\n", + filename, cairo_status_to_string (status)); + result = CAIRO_TEST_FAILURE; + } + + draw_some_pages (surface); + + cairo_surface_destroy (surface); + + printf ("multi-page: Please check %s to ensure it looks happy.\n", filename); + free (filename); + } +#endif + +#if CAIRO_HAS_PDF_SURFACE + if (cairo_test_is_target_enabled (ctx, "pdf")) { + if (result == CAIRO_TEST_UNTESTED) + result = CAIRO_TEST_SUCCESS; + + xasprintf (&filename, "%s/%s", path, BASENAME ".pdf"); + surface = cairo_pdf_surface_create (filename, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + status = cairo_surface_status (surface); + if (status) { + cairo_test_log (ctx, "Failed to create pdf surface for file %s: %s\n", + filename, cairo_status_to_string (status)); + result = CAIRO_TEST_FAILURE; + } + + draw_some_pages (surface); + + cairo_surface_destroy (surface); + + printf ("multi-page: Please check %s to ensure it looks happy.\n", filename); + free (filename); + } +#endif + + return result; +} + +CAIRO_TEST (multi_page, + "Check the paginated surfaces handle multiple pages.", + "paginated", /* keywords */ + "target=vector", /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/negative-stride-image.c b/test/negative-stride-image.c new file mode 100644 index 000000000..dfc8d644d --- /dev/null +++ b/test/negative-stride-image.c @@ -0,0 +1,71 @@ +/* + * Copyright 2012 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_format_t format = CAIRO_FORMAT_ARGB32; + cairo_t *cr_inv; + cairo_surface_t *png, *inv; + uint8_t *data; + int stride; + + png = cairo_test_create_surface_from_png (ctx, png_filename); + + stride = cairo_format_stride_for_width (format, width); + data = xcalloc (stride, height); + inv = cairo_image_surface_create_for_data (data + stride * (height - 1), + format, width, height, -stride); + + cr_inv = cairo_create (inv); + cairo_set_source_surface (cr_inv, png, 0, 0); + cairo_paint (cr_inv); + cairo_destroy (cr_inv); + + cairo_set_source_surface (cr, inv, 0, 0); + cairo_paint (cr); + + cairo_surface_destroy (png); + + cairo_surface_finish (inv); + cairo_surface_destroy (inv); + + free (data); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (negative_stride_image, + "Test that images with a negative stride are handled correctly.", + "stride, image", /* keywords */ + NULL, /* requirements */ + 256, 192, + NULL, draw) diff --git a/test/new-sub-path.c b/test/new-sub-path.c new file mode 100644 index 000000000..f8f6bbe8d --- /dev/null +++ b/test/new-sub-path.c @@ -0,0 +1,74 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); /* blue */ + + /* Test cairo_new_sub_path followed by several different + * path-modification functions in turn... + */ + + /* ... cairo_move_to */ + cairo_new_sub_path (cr); + cairo_move_to (cr, SIZE, SIZE); + cairo_line_to (cr, SIZE, 2 * SIZE); + + /* ... cairo_line_to */ + cairo_new_sub_path (cr); + cairo_line_to (cr, 2 * SIZE, 1.5 * SIZE); + cairo_line_to (cr, 3 * SIZE, 1.5 * SIZE); + + /* ... cairo_curve_to */ + cairo_new_sub_path (cr); + cairo_curve_to (cr, + 4.0 * SIZE, 1.5 * SIZE, + 4.5 * SIZE, 1.0 * SIZE, + 5.0 * SIZE, 1.5 * SIZE); + + /* ... cairo_arc */ + cairo_new_sub_path (cr); + cairo_arc (cr, + 6.5 * SIZE, 1.5 * SIZE, + 0.5 * SIZE, + 0.0, 2.0 * M_PI); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (new_sub_path, + "Test the cairo_new_sub_path call", + "path", /* keywords */ + NULL, /* requirements */ + 8 * SIZE, + 3 * SIZE, + NULL, draw) diff --git a/test/nil-surface.c b/test/nil-surface.c new file mode 100644 index 000000000..30a1f97e5 --- /dev/null +++ b/test/nil-surface.c @@ -0,0 +1,170 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" +#include + +/* Test to verify fixes for the following similar bugs: + * + * https://bugs.freedesktop.org/show_bug.cgi?id=4088 + * https://bugs.freedesktop.org/show_bug.cgi?id=3915 + * https://bugs.freedesktop.org/show_bug.cgi?id=9906 + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_t *cr2; + + /* + * 1. Test file-not-found from surface->pattern->cairo_t + */ + + /* Make a custom context to not interfere with the one passed in. */ + cr2 = cairo_create (cairo_get_target (cr)); + + /* First, let's make a nil surface. */ + surface = cairo_image_surface_create_from_png ("___THIS_FILE_DOES_NOT_EXIST___"); + + /* Let the error propagate into a nil pattern. */ + pattern = cairo_pattern_create_for_surface (surface); + + /* Then let it propagate into the cairo_t. */ + cairo_set_source (cr2, pattern); + cairo_paint (cr2); + + cairo_pattern_destroy (pattern); + cairo_surface_destroy (surface); + + /* Check that the error made it all that way. */ + if (cairo_status (cr2) != CAIRO_STATUS_FILE_NOT_FOUND) { + cairo_test_log (ctx, "Error: Received status of \"%s\" rather than expected \"%s\"\n", + cairo_status_to_string (cairo_status (cr2)), + cairo_status_to_string (CAIRO_STATUS_FILE_NOT_FOUND)); + cairo_destroy (cr2); + return CAIRO_TEST_FAILURE; + } + + cairo_destroy (cr2); + + /* + * 2. Test NULL pointer pattern->cairo_t + */ + cr2 = cairo_create (cairo_get_target (cr)); + + /* First, trigger the NULL pointer status. */ + pattern = cairo_pattern_create_for_surface (NULL); + + /* Then let it propagate into the cairo_t. */ + cairo_set_source (cr2, pattern); + cairo_paint (cr2); + + cairo_pattern_destroy (pattern); + + /* Check that the error made it all that way. */ + if (cairo_status (cr2) != CAIRO_STATUS_NULL_POINTER) { + cairo_test_log (ctx, "Error: Received status of \"%s\" rather than expected \"%s\"\n", + cairo_status_to_string (cairo_status (cr2)), + cairo_status_to_string (CAIRO_STATUS_NULL_POINTER)); + cairo_destroy (cr2); + return CAIRO_TEST_FAILURE; + } + + cairo_destroy (cr2); + + /* + * 3. Test that cairo_surface_finish can accept NULL or a nil + * surface without crashing. + */ + + cairo_surface_finish (NULL); + + surface = cairo_image_surface_create_from_png ("___THIS_FILE_DOES_NOT_EXIST___"); + cairo_surface_finish (surface); + cairo_surface_destroy (surface); + + /* + * 4. OK, we're straying from the original name, but it's still a + * similar kind of testing of error paths. Here we're making sure + * we can still call a cairo_get_* function after triggering an + * INVALID_RESTORE error. + */ + cr2 = cairo_create (cairo_get_target (cr)); + + /* Trigger invalid restore. */ + cairo_restore (cr2); + if (cairo_status (cr2) != CAIRO_STATUS_INVALID_RESTORE) { + cairo_test_log (ctx, "Error: Received status of \"%s\" rather than expected \"%s\"\n", + cairo_status_to_string (cairo_status (cr2)), + cairo_status_to_string (CAIRO_STATUS_INVALID_RESTORE)); + cairo_destroy (cr2); + return CAIRO_TEST_FAILURE; + } + + /* Test that we can still call cairo_get_fill_rule without crashing. */ + cairo_get_fill_rule (cr2); + + cairo_destroy (cr2); + + /* + * 5. Create a cairo_t for the NULL surface. + */ + cr2 = cairo_create (NULL); + + if (cairo_status (cr2) != CAIRO_STATUS_NULL_POINTER) { + cairo_test_log (ctx, "Error: Received status of \"%s\" rather than expected \"%s\"\n", + cairo_status_to_string (cairo_status (cr2)), + cairo_status_to_string (CAIRO_STATUS_NULL_POINTER)); + cairo_destroy (cr2); + return CAIRO_TEST_FAILURE; + } + + /* Test that get_target returns something valid */ + if (cairo_get_target (cr2) == NULL) { + cairo_test_log (ctx, "Error: cairo_get_target() returned NULL\n"); + cairo_destroy (cr2); + return CAIRO_TEST_FAILURE; + } + + /* Test that push_group doesn't crash */ + cairo_push_group (cr2); + cairo_stroke (cr2); + pattern = cairo_pop_group (cr2); + cairo_pattern_destroy (pattern); + + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (nil_surface, + "Test that nil surfaces do not make cairo crash.", + "api", /* keywords */ + NULL, /* requirements */ + 1, 1, + NULL, draw) diff --git a/test/operator-alpha-alpha.c b/test/operator-alpha-alpha.c new file mode 100644 index 000000000..2cef8585c --- /dev/null +++ b/test/operator-alpha-alpha.c @@ -0,0 +1,166 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright 2002 University of Southern California + * Copyright 2005 Red Hat, Inc. + * Copyright 2007 Emmanuel Pacaud + * Copyright 2008 Benjamin Otte + * Copyright 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Owen Taylor + * Kristian Høgsberg + * Emmanuel Pacaud + * Chris Wilson + * Andrea Canciani + */ + +#include "cairo-test.h" + +#define STEPS 16 +#define START_OPERATOR CAIRO_OPERATOR_CLEAR +#define STOP_OPERATOR CAIRO_OPERATOR_HSL_LUMINOSITY + +#define SIZE 3 +#define COUNT 6 +#define FULL_WIDTH ((STEPS + 1) * COUNT - 1) +#define FULL_HEIGHT ((COUNT + STOP_OPERATOR - START_OPERATOR) / COUNT) * (STEPS + 1) + +static void +create_patterns (cairo_t *bg, cairo_t *fg) +{ + int x; + + for (x = 0; x < STEPS; x++) { + double i = (double) x / (STEPS - 1); + cairo_set_source_rgba (bg, 0, 0, 0, i); + cairo_rectangle (bg, x, 0, 1, STEPS); + cairo_fill (bg); + + cairo_set_source_rgba (fg, 0, 0, 0, i); + cairo_rectangle (fg, 0, x, STEPS, 1); + cairo_fill (fg); + } +} + +/* expects a STEP*STEP pixel rectangle */ +static void +do_composite (cairo_t *cr, cairo_operator_t op, cairo_surface_t *bg, cairo_surface_t *fg) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, bg, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, op); + cairo_set_source_surface (cr, fg, 0, 0); + cairo_paint (cr); +} + +static void +subdraw (cairo_t *cr, int width, int height) +{ + size_t i = 0; + cairo_operator_t op; + cairo_t *bgcr, *fgcr; + cairo_surface_t *bg, *fg; + + bg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, SIZE * STEPS, SIZE * STEPS); + fg = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, SIZE * STEPS, SIZE * STEPS); + bgcr = cairo_create (bg); + fgcr = cairo_create (fg); + cairo_scale (bgcr, SIZE, SIZE); + cairo_scale (fgcr, SIZE, SIZE); + create_patterns (bgcr, fgcr); + cairo_destroy (bgcr); + cairo_destroy (fgcr); + + for (op = START_OPERATOR; op <= STOP_OPERATOR; op++, i++) { + cairo_save (cr); + cairo_translate (cr, + SIZE * (STEPS + 1) * (i % COUNT), + SIZE * (STEPS + 1) * (i / COUNT)); + cairo_rectangle (cr, 0, 0, SIZE * (STEPS + 1), SIZE * (STEPS+1)); + cairo_clip (cr); + do_composite (cr, op, bg, fg); + cairo_restore (cr); + } + + cairo_surface_destroy (fg); + cairo_surface_destroy (bg); +} + + +static cairo_surface_t * +create_source (cairo_surface_t *target, int width, int height) +{ + cairo_surface_t *similar; + cairo_t *cr; + + similar = cairo_surface_create_similar (target, + CAIRO_CONTENT_ALPHA, + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + subdraw (cr, width, height); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + source = create_source (cairo_get_target (cr), width, height); + cairo_set_source_surface (cr, source, 0, 0); + cairo_surface_destroy (source); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (operator_alpha_alpha, + "Tests result of compositing pure-alpha surfaces" + "\nCompositing of pure-alpha sources is inconsistent across backends.", + "alpha, similar, operator", /* keywords */ + NULL, /* requirements */ + FULL_WIDTH * SIZE, FULL_HEIGHT * SIZE, + NULL, draw) diff --git a/test/operator-alpha.c b/test/operator-alpha.c new file mode 100644 index 000000000..1ce4ecdf2 --- /dev/null +++ b/test/operator-alpha.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define N_OPERATORS (CAIRO_OPERATOR_SATURATE + 1) +#define SIZE 10 +#define PAD 3 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + unsigned int n; + + cairo_translate (cr, PAD, PAD); + + for (n = 0; n < N_OPERATORS; n++) { + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_rectangle (cr, 0, 0, SIZE-PAD, SIZE-PAD); + cairo_fill (cr); + + cairo_set_source_rgba (cr, 0, 0, 1, .33); + cairo_set_operator (cr, n); + cairo_rectangle (cr, PAD, PAD, SIZE-PAD, SIZE-PAD); + cairo_fill (cr); + + cairo_translate (cr, SIZE+PAD, 0); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (operator_alpha, + "Tests using set_operator() with an non-opaque source", + "operator, alpha", /* keywords */ + NULL, /* requirements */ + (SIZE+PAD) * N_OPERATORS + PAD, SIZE + 2*PAD, + NULL, draw) diff --git a/test/operator-clear.c b/test/operator-clear.c new file mode 100644 index 000000000..72a32c219 --- /dev/null +++ b/test/operator-clear.c @@ -0,0 +1,196 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Kristian Høgsberg + * Owen Taylor + */ + +#include "cairo-test.h" +#include +#include + +#define WIDTH 16 +#define HEIGHT 16 +#define PAD 2 + +static void +set_solid_pattern (cairo_t *cr, int x, int y) +{ + cairo_set_source_rgb (cr, 1.0, 0, 0.0); +} + +static void +set_gradient_pattern (cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_linear (x, y, x + WIDTH, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, 1, 0, 0, 1); + cairo_pattern_add_color_stop_rgba (pattern, 0.8, 1, 0, 0, 0.0); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); +} + +static void +draw_mask (cairo_t *cr, int x, int y) +{ + cairo_surface_t *mask_surface; + cairo_t *cr2; + + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + mask_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask_surface); + cairo_surface_destroy (mask_surface); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.45 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_mask_surface (cr, cairo_get_target (cr2), x, y); + cairo_destroy (cr2); +} + +static void +draw_glyphs (cairo_t *cr, int x, int y) +{ + cairo_text_extents_t extents; + + cairo_set_font_size (cr, 0.8 * HEIGHT); + + cairo_text_extents (cr, "FG", &extents); + cairo_move_to (cr, + x + floor ((WIDTH - extents.width) / 2 + 0.5) - extents.x_bearing, + y + floor ((HEIGHT - extents.height) / 2 + 0.5) - extents.y_bearing); + cairo_show_text (cr, "FG"); +} + +static void +draw_polygon (cairo_t *cr, int x, int y) +{ + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + cairo_new_path (cr); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + height); + cairo_line_to (cr, x + width / 2, y + 3 * height / 4); + cairo_line_to (cr, x + width, y + height); + cairo_line_to (cr, x + width, y); + cairo_line_to (cr, x + width / 2, y + height / 4); + cairo_close_path (cr); + cairo_fill (cr); +} + +static void +draw_rects (cairo_t *cr, int x, int y) +{ + double block_width = (int)(0.33 * WIDTH + 0.5); + double block_height = (int)(0.33 * HEIGHT + 0.5); + int i, j; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + if ((i + j) % 2 == 0) + cairo_rectangle (cr, + x + block_width * i, y + block_height * j, + block_width, block_height); + + cairo_fill (cr); +} + +static void (* const pattern_funcs[])(cairo_t *cr, int x, int y) = { + set_solid_pattern, + set_gradient_pattern, +}; + +static void (* const draw_funcs[])(cairo_t *cr, int x, int y) = { + draw_mask, + draw_glyphs, + draw_polygon, + draw_rects +}; + +#define IMAGE_WIDTH (ARRAY_LENGTH (pattern_funcs) * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (draw_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + size_t i, j, x, y; + cairo_pattern_t *pattern; + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + for (j = 0; j < ARRAY_LENGTH (draw_funcs); j++) { + for (i = 0; i < ARRAY_LENGTH (pattern_funcs); i++) { + x = i * (WIDTH + PAD) + PAD; + y = j * (HEIGHT + PAD) + PAD; + + cairo_save (cr); + + pattern = cairo_pattern_create_linear (x + WIDTH, y, + x, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, + 0.0, 0.0, 1.0, 1.0); /* Solid blue */ + cairo_pattern_add_color_stop_rgba (pattern, 0.8, + 0.0, 0.0, 1.0, 0.0); /* Transparent blue */ + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill_preserve (cr); + cairo_clip (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + pattern_funcs[i] (cr, x, y); + draw_funcs[j] (cr, x, y); + if (cairo_status (cr)) + cairo_test_log (ctx, "%d %d HERE!\n", (int)i, (int)j); + + cairo_restore (cr); + } + } + + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) + cairo_test_log (ctx, "%d %d .HERE!\n", (int)i, (int)j); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (operator_clear, + "Test of CAIRO_OPERATOR_CLEAR", + "operator", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/operator-source.c b/test/operator-source.c new file mode 100644 index 000000000..9330a65d1 --- /dev/null +++ b/test/operator-source.c @@ -0,0 +1,250 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Kristian Høgsberg + * Owen Taylor + * Uli Schlachter + */ + +#include "cairo-test.h" +#include +#include + +#define WIDTH 16 +#define HEIGHT 16 +#define PAD 2 + +static void +set_solid_pattern (cairo_t *cr, int x, int y) +{ + cairo_set_source_rgb (cr, 1.0, 0, 0.0); +} + +static void +set_translucent_pattern (cairo_t *cr, int x, int y) +{ + cairo_set_source_rgba (cr, 1, 0, 0, 0.5); +} + +static void +set_gradient_pattern (cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_linear (x, y, x + WIDTH, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, 1, 0, 0, 1); + cairo_pattern_add_color_stop_rgba (pattern, 0.8, 1, 0, 0, 0.0); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); +} + +static void +set_surface_pattern (cairo_t *cr, int x, int y) +{ + cairo_surface_t *source_surface; + cairo_t *cr2; + + double width = (int)(0.6 * WIDTH); + double height = (int)(0.6 * HEIGHT); + x += 0.2 * WIDTH; + y += 0.2 * HEIGHT; + + source_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + width, height); + cr2 = cairo_create (source_surface); + cairo_surface_destroy (source_surface); + + cairo_set_source_rgb (cr2, 1, 0, 0); /* red */ + cairo_paint (cr2); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.5 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_set_source_surface (cr, cairo_get_target (cr2), x, y); + cairo_destroy (cr2); +} + +static void +draw_mask (cairo_t *cr, int x, int y) +{ + cairo_surface_t *mask_surface; + cairo_t *cr2; + + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + mask_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask_surface); + cairo_surface_destroy (mask_surface); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.45 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_mask_surface (cr, cairo_get_target (cr2), x, y); + cairo_destroy (cr2); +} + +static void +draw_glyphs (cairo_t *cr, int x, int y) +{ + cairo_text_extents_t extents; + + cairo_set_font_size (cr, 0.8 * HEIGHT); + + cairo_text_extents (cr, "FG", &extents); + cairo_move_to (cr, + x + floor ((WIDTH - extents.width) / 2 + 0.5) - extents.x_bearing, + y + floor ((HEIGHT - extents.height) / 2 + 0.5) - extents.y_bearing); + cairo_show_text (cr, "FG"); +} + +static void +draw_polygon (cairo_t *cr, int x, int y) +{ + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + cairo_new_path (cr); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + height); + cairo_line_to (cr, x + width / 2, y + 3 * height / 4); + cairo_line_to (cr, x + width, y + height); + cairo_line_to (cr, x + width, y); + cairo_line_to (cr, x + width / 2, y + height / 4); + cairo_close_path (cr); + cairo_fill (cr); +} + +static void +draw_rects (cairo_t *cr, int x, int y, double offset) +{ + double block_width = (int)(0.33 * WIDTH + 0.5) - offset/3; + double block_height = (int)(0.33 * HEIGHT + 0.5) - offset/3; + int i, j; + + x += offset/2; + y += offset/2; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + if ((i + j) % 2 == 0) + cairo_rectangle (cr, + x + block_width * i, y + block_height * j, + block_width, block_height); + + cairo_fill (cr); +} + +static void +draw_aligned_rects (cairo_t *cr, int x, int y) +{ + draw_rects (cr, x, y, 0); +} + +static void +draw_unaligned_rects (cairo_t *cr, int x, int y) +{ + draw_rects (cr, x, y, 2.1); +} + +static void (* const pattern_funcs[])(cairo_t *cr, int x, int y) = { + set_solid_pattern, + set_translucent_pattern, + set_gradient_pattern, + set_surface_pattern, +}; + +static void (* const draw_funcs[])(cairo_t *cr, int x, int y) = { + draw_mask, + draw_glyphs, + draw_polygon, + draw_aligned_rects, + draw_unaligned_rects +}; + +#define IMAGE_WIDTH (ARRAY_LENGTH (pattern_funcs) * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (draw_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + size_t i, j, x, y; + cairo_pattern_t *pattern; + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + for (j = 0; j < ARRAY_LENGTH (draw_funcs); j++) { + for (i = 0; i < ARRAY_LENGTH (pattern_funcs); i++) { + x = i * (WIDTH + PAD) + PAD; + y = j * (HEIGHT + PAD) + PAD; + + cairo_save (cr); + + pattern = cairo_pattern_create_linear (x + WIDTH, y, + x, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, + 0.0, 0.0, 1.0, 1.0); /* Solid blue */ + cairo_pattern_add_color_stop_rgba (pattern, 0.8, + 0.0, 0.0, 1.0, 0.0); /* Transparent blue */ + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill_preserve (cr); + cairo_clip (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + pattern_funcs[i] (cr, x, y); + draw_funcs[j] (cr, x, y); + if (cairo_status (cr)) + cairo_test_log (ctx, "%d %d HERE!\n", (int)i, (int)j); + + cairo_restore (cr); + } + } + + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) + cairo_test_log (ctx, "%d %d .HERE!\n", (int)i, (int)j); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (operator_source, + "Test of CAIRO_OPERATOR_SOURCE", + "operator", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/operator.c b/test/operator.c new file mode 100644 index 000000000..666fcafd6 --- /dev/null +++ b/test/operator.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define N_OPERATORS (CAIRO_OPERATOR_SATURATE + 1) +#define SIZE 10 +#define PAD 3 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + unsigned int n; + + cairo_translate (cr, PAD, PAD); + + for (n = 0; n < N_OPERATORS; n++) { + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_rectangle (cr, 0, 0, SIZE-PAD, SIZE-PAD); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_operator (cr, n); + cairo_rectangle (cr, PAD, PAD, SIZE-PAD, SIZE-PAD); + cairo_fill (cr); + + cairo_translate (cr, SIZE+PAD, 0); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (operator, + "Tests using set_operator()", + "operator", /* keywords */ + NULL, /* requirements */ + (SIZE+PAD) * N_OPERATORS + PAD, SIZE + 2*PAD, + NULL, draw) diff --git a/test/outline-tolerance.c b/test/outline-tolerance.c new file mode 100644 index 000000000..6453f5c96 --- /dev/null +++ b/test/outline-tolerance.c @@ -0,0 +1,52 @@ +/* + * Copyright © 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* An assertion failure found by Rico Tzschichholz */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_set_line_width (cr, 200); + cairo_set_miter_limit (cr, 1.5); + cairo_rectangle (cr, 100, 25, 1000, 0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (outline_tolerance, + "Rectangle drawn incorrectly when it has zero height and miter limit greater than 1.414", + "stroke", /* keywords */ + NULL, /* requirements */ + 100, 50, + NULL, draw) diff --git a/test/over-above-source.c b/test/over-above-source.c new file mode 100644 index 000000000..7191c8da3 --- /dev/null +++ b/test/over-above-source.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 40 +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to explore the interactions of "native" and + * "fallback" objects. For the ps surface, OVER with non-1.0 opacity + * will be a fallback while SOURCE will be native. For the pdf + * surface, it's the reverse where OVER is native while SOURCE is a + * fallback. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, PAD, PAD); + + /* A red triangle with SOURCE */ + cairo_move_to (cr, SIZE / 2, SIZE / 2); + cairo_rel_line_to (cr, SIZE / 2, 0); + cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); + cairo_close_path (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ + + cairo_fill (cr); + + /* A green circle with OVER */ + cairo_arc (cr, SIZE / 2, SIZE / 2, SIZE / 4, 0., 2. * M_PI); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgba (cr, 0., 1., 0., 0.5); /* 50% green */ + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (over_above_source, + "A simple test drawing a circle with OVER after a triangle drawn with SOURCE", + "operator", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/over-around-source.c b/test/over-around-source.c new file mode 100644 index 000000000..531eda804 --- /dev/null +++ b/test/over-around-source.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 40 +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to explore the interactions of "native" and + * "fallback" objects. For the ps surface, OVER with non-1.0 opacity + * will be a fallback while SOURCE will be native. For the pdf + * surface, it's the reverse where OVER is native while SOURCE is a + * fallback. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, PAD, PAD); + + /* A green triangle with OVER */ + cairo_move_to (cr, SIZE / 5, SIZE / 5); + cairo_rel_line_to (cr, SIZE / 2, 0); + cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); + cairo_close_path (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgba (cr, 0., 1., 0., 0.5); /* 50% green */ + + cairo_fill (cr); + + /* A red circle with SOURCE */ + cairo_arc (cr, SIZE / 2, SIZE / 2, SIZE / 4, 0., 2. * M_PI); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ + + cairo_fill (cr); + + /* Another green triangle with OVER */ + cairo_move_to (cr, SIZE / 2, SIZE / 2); + cairo_rel_line_to (cr, SIZE / 2, 0); + cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); + cairo_close_path (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgba (cr, 0., 1., 0., 0.5); /* 50% green */ + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (over_around_source, + "A simple test drawing a triangle with SOURCE between two circles drawn with OVER", + "operator", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/over-below-source.c b/test/over-below-source.c new file mode 100644 index 000000000..7fe5bd889 --- /dev/null +++ b/test/over-below-source.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 40 +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to explore the interactions of "native" and + * "fallback" objects. For the ps surface, OVER with non-1.0 opacity + * will be a fallback while SOURCE will be native. For the pdf + * surface, it's the reverse where OVER is native while SOURCE is a + * fallback. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, PAD, PAD); + + /* A green circle with OVER */ + cairo_arc (cr, SIZE / 2, SIZE / 2, SIZE / 4, 0., 2. * M_PI); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgba (cr, 0., 1., 0., 0.5); /* 50% green */ + + cairo_fill (cr); + + /* A red triangle with SOURCE */ + cairo_move_to (cr, SIZE / 2, SIZE / 2); + cairo_line_to (cr, SIZE, SIZE / 2); + cairo_line_to (cr, SIZE / 2, SIZE); + cairo_close_path (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (over_below_source, + "A simple test drawing a circle with OVER before a triangle drawn with SOURCE", + "operator", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/over-between-source.c b/test/over-between-source.c new file mode 100644 index 000000000..ffb657208 --- /dev/null +++ b/test/over-between-source.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 40 +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to explore the interactions of "native" and + * "fallback" objects. For the ps surface, OVER with non-1.0 opacity + * will be a fallback while SOURCE will be native. For the pdf + * surface, it's the reverse where OVER is native while SOURCE is a + * fallback. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, PAD, PAD); + + /* A red triangle with SOURCE */ + cairo_move_to (cr, SIZE / 5, SIZE / 5); + cairo_rel_line_to (cr, SIZE / 2, 0); + cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); + cairo_close_path (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ + + cairo_fill (cr); + + /* A green circle with OVER */ + cairo_arc (cr, SIZE / 2, SIZE / 2, SIZE / 4, 0., 2. * M_PI); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgba (cr, 0., 1., 0., 0.5); /* 50% green */ + + cairo_fill (cr); + + /* Another red triangle with SOURCE */ + cairo_move_to (cr, SIZE / 2, SIZE / 2); + cairo_rel_line_to (cr, SIZE / 2, 0); + cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); + cairo_close_path (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ + + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (over_between_source, + "A simple test drawing a circle with OVER between two triangles drawn with SOURCE", + "operator", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/overlapping-boxes.c b/test/overlapping-boxes.c new file mode 100644 index 000000000..92211ee06 --- /dev/null +++ b/test/overlapping-boxes.c @@ -0,0 +1,96 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Not strictly overlapping, but it does highlight the error in + * an optimisation of fill-box handling that I frequently am + * tempted to write. + */ + +#include "cairo-test.h" + +#define WIDTH (20) +#define HEIGHT (20) + +static void +border (cairo_t *cr) +{ + cairo_rectangle (cr, 1, 1, 8, 8); + cairo_rectangle (cr, 1.25, 1.25, 7.5, 7.5); + cairo_rectangle (cr, 1.75, 1.75, 6.5, 6.5); + cairo_rectangle (cr, 2, 2, 6, 6); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + border (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_fill (cr); + + cairo_translate (cr, 10, 0); + + border (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_fill (cr); + + cairo_translate (cr, 0, 10); + + cairo_rectangle (cr, 0, 0, 10, 10); + cairo_clip (cr); + + border (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_fill (cr); + + cairo_reset_clip (cr); + + cairo_translate (cr, -10, 0); + + cairo_rectangle (cr, 0, 0, 10, 10); + cairo_clip (cr); + + border (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (overlapping_boxes, + "A sub-pixel double border to highlight the danger in an easy optimisation", + "fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/overlapping-dash-caps.c b/test/overlapping-dash-caps.c new file mode 100644 index 000000000..f7ba248c2 --- /dev/null +++ b/test/overlapping-dash-caps.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 100 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + double dashes1[] = {20, 10}; + double dashes2[] = {10, 1}; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_line_width (cr, 15); + + cairo_set_dash (cr, dashes1, 2, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, SIZE/2, SIZE/2, SIZE/2-10, 0, 2*M_PI); + + cairo_set_source_rgba (cr, 1, 0, 0, 0.5); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_stroke (cr); + + cairo_set_dash (cr, dashes2, 2, 0); + cairo_new_sub_path (cr); + cairo_arc (cr, SIZE/2, SIZE/2, SIZE/4-5, 0, 2*M_PI); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_source_rgba (cr, 0, 1, 0, 0.5); + cairo_stroke (cr); + + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (overlapping_dash_caps, + "Test intersections between neighbouring dash segments", + "overlap, dash", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/overlapping-glyphs.c b/test/overlapping-glyphs.c new file mode 100644 index 000000000..93067abc7 --- /dev/null +++ b/test/overlapping-glyphs.c @@ -0,0 +1,123 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include + +#define TEXT_SIZE 12 +#define HEIGHT (TEXT_SIZE + 4) +#define WIDTH 50 + +#define MAX_GLYPHS 80 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_glyph_t glyphs_stack[MAX_GLYPHS], *glyphs; + const char *cairo = "Cairo"; + const char *giza = "Giza"; + cairo_text_extents_t cairo_extents; + cairo_text_extents_t giza_extents; + int count, num_glyphs; + double x0, y0; + + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + /* We want to overlap two strings, so compute overlapping glyphs. */ + + cairo_text_extents (cr, cairo, &cairo_extents); + cairo_text_extents (cr, giza, &giza_extents); + + x0 = WIDTH/2. - (cairo_extents.width/2. + cairo_extents.x_bearing); + y0 = HEIGHT/2. - (cairo_extents.height/2. + cairo_extents.y_bearing); + glyphs = glyphs_stack; + count = MAX_GLYPHS; + cairo_scaled_font_text_to_glyphs (cairo_get_scaled_font (cr), + x0, y0, + cairo, strlen (cairo), + &glyphs, &count, + NULL, NULL, + NULL); + assert (glyphs == glyphs_stack); + num_glyphs = count; + + x0 = WIDTH/2. - (giza_extents.width/2. + giza_extents.x_bearing); + y0 = HEIGHT/2. - (giza_extents.height/2. + giza_extents.y_bearing); + glyphs = glyphs_stack + count; + count = MAX_GLYPHS - count; + cairo_scaled_font_text_to_glyphs (cairo_get_scaled_font (cr), + x0, y0, + giza, strlen (giza), + &glyphs, &count, + NULL, NULL, + NULL); + assert (glyphs == glyphs_stack + num_glyphs); + glyphs = glyphs_stack; + num_glyphs += count; + + cairo_set_source_rgba (cr, 0, 0, 0, .5); /* translucent black, gray! */ + cairo_show_glyphs (cr, glyphs, num_glyphs); + + /* and compare with filling */ + cairo_translate (cr, 0, HEIGHT); + cairo_glyph_path (cr, glyphs, num_glyphs); + cairo_fill (cr); + + /* switch to using an unbounded operator for added complexity */ + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + + cairo_translate (cr, WIDTH, -HEIGHT); + cairo_save (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + cairo_show_glyphs (cr, glyphs, num_glyphs); + cairo_restore (cr); + + cairo_translate (cr, 0, HEIGHT); + cairo_save (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + cairo_glyph_path (cr, glyphs, num_glyphs); + cairo_fill (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (overlapping_glyphs, + "Test handing of overlapping glyphs", + "text, glyphs", /* keywords */ + NULL, /* requirements */ + 2 * WIDTH, 2 * HEIGHT, + NULL, draw) + diff --git a/test/paint-clip-fill.c b/test/paint-clip-fill.c new file mode 100644 index 000000000..5a9e24ffb --- /dev/null +++ b/test/paint-clip-fill.c @@ -0,0 +1,106 @@ +/* + * Copyright 2011 SCore Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Taekyun Kim + */ + +#include "cairo-test.h" + +static void +rounded_rectangle(cairo_t *cr, + double x, double y, + double width, double height, + double radius) +{ + cairo_move_to (cr, x, y + radius); + cairo_line_to (cr, x, y + height - radius); + cairo_curve_to (cr, x, y + height - radius/2.0, + x + radius/2.0, y + height, + x + radius, y + height); + cairo_line_to (cr, x + width - radius, y + height); + cairo_curve_to (cr, x + width - radius/2.0, y + height, + x + width, y + height - radius/2.0, + x + width, y + height - radius); + cairo_line_to (cr, x + width, y + radius); + cairo_curve_to (cr, x + width, y + radius/2.0, + x + width - radius/2.0, y, + x + width - radius, y); + cairo_line_to (cr, x + radius, y); + cairo_curve_to (cr, x + radius/2.0, y, x, y + radius/2.0, x, y + radius); + cairo_close_path(cr); +} + +static cairo_test_status_t +draw_mono (cairo_t *cr, int width, int height) +{ + cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); + cairo_paint(cr); + + cairo_rectangle(cr, 20, 20, 60, 60); + cairo_clip(cr); + + rounded_rectangle(cr, 0, 0, 100, 100, 10); + cairo_clip(cr); + + cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0); + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_paint(cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_aa (cairo_t *cr, int width, int height) +{ + cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); + cairo_paint(cr); + + cairo_rectangle(cr, 20, 20, 60, 60); + cairo_clip(cr); + + rounded_rectangle(cr, 0, 0, 100, 100, 10); + cairo_clip(cr); + + cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0); + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_paint(cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (paint_clip_fill_mono, + "Test reduction of a paint with a clip", + "paint, clip", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw_mono) +CAIRO_TEST (paint_clip_fill_aa, + "Test reduction of a paint with a clip", + "paint, clip", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw_aa) diff --git a/test/paint-repeat.c b/test/paint-repeat.c new file mode 100644 index 000000000..c48d84c0e --- /dev/null +++ b/test/paint-repeat.c @@ -0,0 +1,61 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff + }; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + /* We use a non-zero offset larger than the source surface size to + * stress cairo out a bit more. */ + cairo_set_source_surface (cr, surface, 10, 10); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_paint (cr); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (paint_repeat, + "Test calls to cairo_paint with a repeating source surface pattern", + "paint", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, draw) diff --git a/test/paint-source-alpha.c b/test/paint-source-alpha.c new file mode 100644 index 000000000..cb2d488ca --- /dev/null +++ b/test/paint-source-alpha.c @@ -0,0 +1,63 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t data[16] = { + 0x80808080, 0x80808080, 0x80800000, 0x80800000, + 0x80808080, 0x80808080, 0x80800000, 0x80800000, + + 0x80008000, 0x80008000, 0x80000080, 0x80000080, + 0x80008000, 0x80008000, 0x80000080, 0x80000080 + }; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_ARGB32, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (paint_source_alpha, + "Simple test of cairo_paint with a source surface with non-opaque alpha", + "paint, alpha", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, draw) diff --git a/test/paint-with-alpha-group-clip.c b/test/paint-with-alpha-group-clip.c new file mode 100644 index 000000000..e1e438330 --- /dev/null +++ b/test/paint-with-alpha-group-clip.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2013 Adrian Johnson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Adrian Johnson + */ + +/* + * This attempts to exercise the bug found in + * + * https://bugs.launchpad.net/inkscape/+bug/1258265 + */ + + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_push_group (cr); + cairo_push_group (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + cairo_pop_group_to_source (cr); + cairo_paint_with_alpha (cr, 0.25); + cairo_pop_group_to_source (cr); + cairo_rectangle (cr, 5, 5, 20, 20); + cairo_clip (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (paint_with_alpha_group_clip, + "Test paint with alpha and clipping", + "paint alpha clip group record", /* keywords */ + NULL, /* requirements */ + 30, 30, + NULL, draw) diff --git a/test/paint-with-alpha.c b/test/paint-with-alpha.c new file mode 100644 index 000000000..8daa935f7 --- /dev/null +++ b/test/paint-with-alpha.c @@ -0,0 +1,148 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff +}; +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_solid_clip (cairo_t *cr, int width, int height) +{ + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 2.5, 2.5, 27, 27); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1., 0.,0.); + cairo_paint_with_alpha (cr, 0.5); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_clip (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 10.5, 10.5, 11, 11); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_clip_mask (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_move_to (cr, 16, 5); + cairo_line_to (cr, 5, 16); + cairo_line_to (cr, 16, 27); + cairo_line_to (cr, 27, 16); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (paint_with_alpha, + "Simple test of cairo_paint_with_alpha", + "paint, alpha", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, draw) +CAIRO_TEST (paint_with_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, draw_solid_clip) +CAIRO_TEST (paint_with_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, draw_clip) +CAIRO_TEST (paint_with_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, draw_clip_mask) diff --git a/test/paint.c b/test/paint.c new file mode 100644 index 000000000..c5fd648e3 --- /dev/null +++ b/test/paint.c @@ -0,0 +1,48 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 2, 2); + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (paint, + "Test calls to cairo_paint", + "paint", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, draw) diff --git a/test/partial-clip-text.c b/test/partial-clip-text.c new file mode 100644 index 000000000..4d8bae077 --- /dev/null +++ b/test/partial-clip-text.c @@ -0,0 +1,120 @@ +/* + * Copyright 2010 Igor Nikitin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Igor Nikitin + */ + +#include "cairo-test.h" + +#define HEIGHT 15 +#define WIDTH 40 + +static void background (cairo_t *cr) +{ + cairo_set_source_rgb( cr, 0, 0, 0 ); + cairo_paint (cr); +} + +static void text (cairo_t *cr) +{ + cairo_move_to (cr, 0, 12); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_show_text (cr, "CAIRO"); +} + +static cairo_test_status_t +top (cairo_t *cr, int width, int height) +{ + background (cr); + + cairo_rectangle (cr, 0, 0, WIDTH, 5); + cairo_clip (cr); + + text (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +bottom (cairo_t *cr, int width, int height) +{ + background (cr); + + cairo_rectangle (cr, 0, HEIGHT-5, WIDTH, 5); + cairo_clip (cr); + + text (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +left (cairo_t *cr, int width, int height) +{ + background (cr); + + cairo_rectangle (cr, 0, 0, 10, HEIGHT); + cairo_clip (cr); + + text (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +right (cairo_t *cr, int width, int height) +{ + background (cr); + + cairo_rectangle (cr, WIDTH-10, 0, 10, HEIGHT); + cairo_clip (cr); + + text (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (partial_clip_text_top, + "Tests drawing text through a single, partial clip.", + "clip, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, top) +CAIRO_TEST (partial_clip_text_bottom, + "Tests drawing text through a single, partial clip.", + "clip, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, bottom) +CAIRO_TEST (partial_clip_text_left, + "Tests drawing text through a single, partial clip.", + "clip, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, left) +CAIRO_TEST (partial_clip_text_right, + "Tests drawing text through a single, partial clip.", + "clip, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, right) diff --git a/test/partial-coverage.c b/test/partial-coverage.c new file mode 100644 index 000000000..7e67a5e16 --- /dev/null +++ b/test/partial-coverage.c @@ -0,0 +1,680 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Test the sampling stratagems of the rasterisers by creating pixels + * containing minute holes and seeing how close to the expected + * coverage each rasteriser approaches. + */ + +#define SIZE 64 + +#include "../src/cairo-fixed-type-private.h" +#define SAMPLE (1 << CAIRO_FIXED_FRAC_BITS) + +static uint32_t state; + +static uint32_t +hars_petruska_f54_1_random (void) +{ +#define rol(x,k) ((x << k) | (x >> (32-k))) + return state = (state ^ rol (state, 5) ^ rol (state, 24)) + 0x37798849; +#undef rol +} + +static double +uniform_random (void) +{ + return hars_petruska_f54_1_random() / (double) UINT32_MAX; +} + +/* coverage is given in [0,sample] */ +static void +compute_occupancy (uint8_t *occupancy, int coverage, int sample) +{ + int i, c; + + if (coverage < sample/2) { + memset (occupancy, 0, sample); + if (coverage == 0) + return; + + for (i = c = 0; i < sample; i++) { + if ((sample - i) * uniform_random() < coverage - c) { + occupancy[i] = 0xff; + if (++c == coverage) + return; + } + } + } else { + coverage = sample - coverage; + memset (occupancy, 0xff, sample); + if (coverage == 0) + return; + + for (i = c = 0; i < sample; i++) { + if ((sample - i) * uniform_random() < coverage - c) { + occupancy[i] = 0; + if (++c == coverage) + return; + } + } + } +} + +static cairo_test_status_t +reference (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + for (i = 0; i < SIZE*SIZE; i++) { + cairo_set_source_rgba (cr, 1., 1., 1., + i / (double) (SIZE * SIZE)); + cairo_rectangle (cr, i % SIZE, i / SIZE, 1, 1); + cairo_fill (cr); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +three_quarter_reference (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + for (i = 0; i < SIZE*SIZE; i++) { + cairo_set_source_rgba (cr, 1., 1., 1., + .75 * i / (double) (SIZE * SIZE)); + cairo_rectangle (cr, i % SIZE, i / SIZE, 1, 1); + cairo_fill (cr); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +half_reference (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + for (i = 0; i < SIZE*SIZE; i++) { + cairo_set_source_rgba (cr, 1., 1., 1., + .5 * i / (double) (SIZE * SIZE)); + cairo_rectangle (cr, i % SIZE, i / SIZE, 1, 1); + cairo_fill (cr); + } + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +rectangles (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE*SAMPLE; j++) { + if (occupancy[j]) { + cairo_rectangle (cr, + (j % SAMPLE + xs) / (double) SAMPLE, + (j / SAMPLE + ys) / (double) SAMPLE, + 1 / (double) SAMPLE, + 1 / (double) SAMPLE); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +intersecting_quads (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE*SAMPLE; j++) { + if (occupancy[j]) { + cairo_move_to (cr, + (j % SAMPLE + xs) / (double) SAMPLE, + (j / SAMPLE + ys) / (double) SAMPLE); + cairo_rel_line_to (cr, 1 / (double) SAMPLE, 1 / (double) SAMPLE); + cairo_rel_line_to (cr, 0, -1 / (double) SAMPLE); + cairo_rel_line_to (cr, -1 / (double) SAMPLE, 1 / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +half_triangles (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE*SAMPLE; j++) { + if (occupancy[j]) { + int x = j % SAMPLE + xs; + int y = j / SAMPLE + ys; + cairo_move_to (cr, x / (double) SAMPLE, y / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, y / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +overlap_half_triangles (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE/2*SAMPLE/2 * i / (SIZE * SIZE), SAMPLE/2*SAMPLE/2); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE/2*SAMPLE/2; j++) { + if (occupancy[j]) { + int x = 2 * (j % (SAMPLE/2)) + xs; + int y = 2 * (j / (SAMPLE/2)) + ys; + + /* Add a 4-tile composed of two overlapping triangles. + * .__.__. + * |\ /| + * | \ / | + * . x | + * | / \ | + * |/ \| + * . . + * + * Coverage should be computable as 50% (due to counter-winding). + */ + + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x) / (double) SAMPLE, (y+2) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y+2) / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +overlap_half_triangles_eo (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE/2*SAMPLE/2 * i / (SIZE * SIZE), SAMPLE/2*SAMPLE/2); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE/2*SAMPLE/2; j++) { + if (occupancy[j]) { + int x = 2 * (j % (SAMPLE/2)) + xs; + int y = 2 * (j / (SAMPLE/2)) + ys; + + /* Add a 4-tile composed of two overlapping triangles. + * .__.__. + * |\ /| + * | \ / | + * . x | + * | / \ | + * |/ \| + * . . + * + * Coverage should be computable as 50%, due to even-odd fill rule. + */ + + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x) / (double) SAMPLE, (y+2) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y+2) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +overlap_three_quarter_triangles (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE/2*SAMPLE/2 * i / (SIZE * SIZE), SAMPLE/2*SAMPLE/2); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE/2*SAMPLE/2; j++) { + if (occupancy[j]) { + int x = 2 * (j % (SAMPLE/2)) + xs; + int y = 2 * (j / (SAMPLE/2)) + ys; + + /* Add a 4-tile composed of two overlapping triangles. + * .__.__. + * |\ /| + * | \ / | + * . x | + * | / \ | + * |/ \| + * . . + * + * Coverage should be computable as 75%. + */ + + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x) / (double) SAMPLE, (y+2) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y+2) / (double) SAMPLE); + cairo_line_to (cr, (x+2) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +triangles (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE*SAMPLE; j++) { + if (occupancy[j]) { + /* Add a tile composed of two non-overlapping triangles. + * .__. + * | /| + * |/ | + * .--. + */ + int x = j % SAMPLE + xs; + int y = j / SAMPLE + ys; + + /* top-left triangle */ + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_close_path (cr); + + /* bottom-right triangle */ + cairo_move_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +intersecting_triangles (cairo_t *cr, int width, int height) +{ + uint8_t *occupancy; + int i, j, channel; + + state = 0x12345678; + occupancy = xmalloc (SAMPLE*SAMPLE); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + for (channel = 0; channel < 3; channel++) { + switch (channel) { + default: + case 0: cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); break; + case 1: cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); break; + case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; + } + + for (i = 0; i < SIZE*SIZE; i++) { + int xs, ys; + + compute_occupancy (occupancy, SAMPLE*SAMPLE * i / (SIZE * SIZE), SAMPLE*SAMPLE); + + xs = i % SIZE * SAMPLE; + ys = i / SIZE * SAMPLE; + for (j = 0; j < SAMPLE*SAMPLE; j++) { + if (occupancy[j]) { + /* Add 2 overlapping tiles in a single cell, each composed + * of two non-overlapping triangles. + * .--. .--. + * | /| |\ | + * |/ | + | \| + * .--. .--. + */ + int x = j % SAMPLE + xs; + int y = j / SAMPLE + ys; + + /* first pair of triangles, diagonal bottom-left to top-right */ + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_close_path (cr); + cairo_move_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + + /* second pair of triangles, diagonal top-left to bottom-right */ + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_close_path (cr); + cairo_move_to (cr, (x) / (double) SAMPLE, (y) / (double) SAMPLE); + cairo_line_to (cr, (x+1) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_line_to (cr, (x) / (double) SAMPLE, (y+1) / (double) SAMPLE); + cairo_close_path (cr); + } + } + cairo_fill (cr); + } + } + + free (occupancy); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (partial_coverage_rectangles, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, rectangles) + +CAIRO_TEST (partial_coverage_intersecting_quads, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, intersecting_quads) + +CAIRO_TEST (partial_coverage_intersecting_triangles, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, intersecting_triangles) +CAIRO_TEST (partial_coverage_triangles, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, triangles) +CAIRO_TEST (partial_coverage_overlap_three_quarter_triangles, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, overlap_three_quarter_triangles) +CAIRO_TEST (partial_coverage_overlap_half_triangles_eo, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, overlap_half_triangles_eo) +CAIRO_TEST (partial_coverage_overlap_half_triangles, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, overlap_half_triangles) +CAIRO_TEST (partial_coverage_half_triangles, + "Check the fidelity of the rasterisation.", + "coverage, raster", /* keywords */ + "target=raster slow", /* requirements */ + SIZE, SIZE, + NULL, half_triangles) + +CAIRO_TEST (partial_coverage_reference, + "Check the fidelity of this test.", + "coverage, raster", /* keywords */ + "target=raster", /* requirements */ + SIZE, SIZE, + NULL, reference) +CAIRO_TEST (partial_coverage_three_quarter_reference, + "Check the fidelity of this test.", + "coverage, raster", /* keywords */ + "target=raster", /* requirements */ + SIZE, SIZE, + NULL, three_quarter_reference) +CAIRO_TEST (partial_coverage_half_reference, + "Check the fidelity of this test.", + "coverage, raster", /* keywords */ + "target=raster", /* requirements */ + SIZE, SIZE, + NULL, half_reference) diff --git a/test/pass-through.c b/test/pass-through.c new file mode 100644 index 000000000..17a38db99 --- /dev/null +++ b/test/pass-through.c @@ -0,0 +1,91 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int n; + + for (n = 0; n < 256; n++) { + cairo_set_source_rgba (cr, 1, 1, 1, n / 255.); + cairo_rectangle (cr, 0, n, 2, 1); + cairo_fill (cr); + } + for (n = 0; n < 256; n++) { + cairo_set_source_rgb (cr, n / 255., n / 255., n / 255.); + cairo_rectangle (cr, 2, n, 2, 1); + cairo_fill (cr); + } + + cairo_translate (cr, 4, 0); + + for (n = 0; n < 256; n++) { + cairo_set_source_rgba (cr, 1, 0, 0, n / 255.); + cairo_rectangle (cr, 0, n, 2, 1); + cairo_fill (cr); + } + for (n = 0; n < 256; n++) { + cairo_set_source_rgb (cr, n / 255., 0, 0); + cairo_rectangle (cr, 2, n, 2, 1); + cairo_fill (cr); + } + + cairo_translate (cr, 4, 0); + + for (n = 0; n < 256; n++) { + cairo_set_source_rgba (cr, 0, 1, 0, n / 255.); + cairo_rectangle (cr, 0, n, 2, 1); + cairo_fill (cr); + } + for (n = 0; n < 256; n++) { + cairo_set_source_rgb (cr, 0, n / 255., 0); + cairo_rectangle (cr, 2, n, 2, 1); + cairo_fill (cr); + } + + cairo_translate (cr, 4, 0); + + for (n = 0; n < 256; n++) { + cairo_set_source_rgba (cr, 0, 0, 1, n / 255.); + cairo_rectangle (cr, 0, n, 2, 1); + cairo_fill (cr); + } + for (n = 0; n < 256; n++) { + cairo_set_source_rgb (cr, 0, 0, n / 255.); + cairo_rectangle (cr, 2, n, 2, 1); + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (pass_through, + "tests pixel values", + "color", /* keywords */ + NULL, /* requirements */ + 16, 256, + NULL, draw) diff --git a/test/path-append.c b/test/path-append.c new file mode 100644 index 000000000..bdcc63abf --- /dev/null +++ b/test/path-append.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2009 Jeff Muizelaar + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "cairo-test.h" +#include + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_matrix_t m; + int xoffset = 50; + int yoffset = 50; + + cairo_surface_t *shadow; + cairo_t *shadow_cr; + cairo_path_t *path; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 130, 130); + cairo_rotate (cr, .5);//2*M_PI*angle/360); + cairo_rectangle (cr, 0, 0, 50, 100); + cairo_get_matrix (cr, &m); + + shadow = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + 600 - xoffset, + 600 - yoffset); + cairo_surface_set_device_offset (shadow, xoffset, yoffset); + shadow_cr = cairo_create (shadow); + cairo_surface_destroy (shadow); + + cairo_set_source_rgb (shadow_cr, 0, 1, 0); + cairo_set_matrix (shadow_cr, &m); + + path = cairo_copy_path (cr); + cairo_new_path (shadow_cr); + cairo_append_path (shadow_cr, path); + cairo_fill (shadow_cr); + cairo_path_destroy (path); + + cairo_identity_matrix (cr); + cairo_translate (cr, 10, 50); + cairo_set_source_surface (cr, cairo_get_target (shadow_cr), 0, 0); + cairo_paint (cr); + cairo_set_matrix (cr, &m); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + + cairo_destroy (shadow_cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (path_append, + "Test appending path to a context, in particular to exercise a regression in 005436", + "path", /* keywords */ + NULL, /* requirements */ + 600, 600, + NULL, draw) diff --git a/test/path-currentpoint.c b/test/path-currentpoint.c new file mode 100644 index 000000000..ccd44b1c8 --- /dev/null +++ b/test/path-currentpoint.c @@ -0,0 +1,89 @@ +/* + * Copyright © 2014 Google, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "cairo-test.h" + +#include + +static void +assert_point (cairo_t *cr, double expected_x, double expected_y) { + double x, y; + assert (cairo_has_current_point (cr)); + cairo_get_current_point (cr, &x, &y); + assert (x == expected_x); + assert (y == expected_y); +} + +static void +assert_point_maintained (cairo_t *cr, double expected_x, double expected_y) { + cairo_path_t *path; + + assert_point (cr, expected_x, expected_y); + + path = cairo_copy_path (cr); + + cairo_new_path (cr); + cairo_rectangle (cr, 5, 5, 10, 20); + cairo_stroke (cr); + + cairo_new_path (cr); + cairo_append_path (cr, path); + cairo_path_destroy (path); + + assert_point (cr, expected_x, expected_y); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 20, 20); + cr = cairo_create (surface); + + cairo_new_path (cr); + cairo_move_to (cr, 1., 2.); + assert_point_maintained (cr, 1., 2.); + + cairo_line_to (cr, 4., 5.); + cairo_move_to (cr, 2., 1.); + assert_point_maintained (cr, 2., 1.); + + cairo_move_to (cr, 5, 5); + cairo_arc (cr, 5, 5, 10, 0, M_PI / 3); + cairo_close_path (cr); + assert_point_maintained (cr, 5, 5); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (path_currentpoint, + "Test save/restore path maintains current point", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/path-precision.c b/test/path-precision.c new file mode 100644 index 000000000..3a7fb11c8 --- /dev/null +++ b/test/path-precision.c @@ -0,0 +1,111 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + * + * Based on an example by Dirk "krit" Schulze found during WebKit integration. + */ + +#include "cairo-test.h" + +/* we know that this is an inherent limitation in cairo */ +#define FAIL CAIRO_TEST_XFAILURE + +/* Test the idempotency of path construction and copying */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_path_data_t path_data[] = { + { { CAIRO_PATH_MOVE_TO, 2 }, }, + { { 95.000000, 40.000000 }, }, + + { { CAIRO_PATH_LINE_TO, 2 }, }, + { { 94.960533, 41.255810 }, }, + + { { CAIRO_PATH_LINE_TO, 2 }, }, + { { 94.842293, 42.50666 }, }, + + { { CAIRO_PATH_LINE_TO, 2 }, }, + { { 94.645744, 43.747627 }, }, + + { { CAIRO_PATH_LINE_TO, 2 }, }, + { { 94.371666, 44.973797 }, }, + }; + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_path_t path, *path_copy; + int i, j, n; + cairo_test_status_t result = CAIRO_TEST_SUCCESS; + + path.status = CAIRO_STATUS_SUCCESS; + path.num_data = ARRAY_LENGTH (path_data); + path.data = path_data; + + cairo_new_path (cr); + cairo_append_path (cr, &path); + path_copy = cairo_copy_path (cr); + + if (path_copy->status) + return cairo_test_status_from_status (ctx, path_copy->status); + + for (i = j = n = 0; + i < path.num_data && j < path_copy->num_data; + i += path.data[i].header.length, + j += path_copy->data[j].header.length, + n++) + { + const cairo_path_data_t *src, *dst; + + src = &path.data[i]; + dst = &path_copy->data[j]; + + if (src->header.type != dst->header.type) { + cairo_test_log (ctx, + "Paths differ in header type after %d operations.\n" + "Expected path operation %d, found %d.\n", + n, src->header.type, dst->header.type); + result = FAIL; + break; + } + + if (memcmp (&src[1].point, &dst[1].point, sizeof (src->point))) { + cairo_test_log (ctx, + "Paths differ in coordinates after %d operations.\n" + "Expected point (%f, %f), found (%f, %f).\n", + n, + src[1].point.x, src[1].point.y, + dst[1].point.x, dst[1].point.y); + result = FAIL; + break; + } + } + + cairo_path_destroy (path_copy); + return result; +} + +CAIRO_TEST (path_precision, + "Check that the path append/copy is idempotent.", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/path-stroke-twice.c b/test/path-stroke-twice.c new file mode 100644 index 000000000..10bbbf8b0 --- /dev/null +++ b/test/path-stroke-twice.c @@ -0,0 +1,54 @@ +/* + * Copyright 2010 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Exercises a bug found by alois@astro.ch: + * http://bugs.freedesktop.org/show_bug.cgi?id=26010 + * cairo_line_to optimizes away path segment + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, 10, 10); + cairo_line_to (cr, 10, 20); + cairo_line_to (cr, 20, 30); + cairo_line_to (cr, 10, 20); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (path_stroke_twice, + "Tests stroking of a path containing a segment drawn twice", + "path, stroke", /* keywords */ + NULL, /* requirements */ + 40, 40, + NULL, draw) diff --git a/test/pattern-get-type.c b/test/pattern-get-type.c new file mode 100644 index 000000000..c807b14e8 --- /dev/null +++ b/test/pattern-get-type.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +preamble (cairo_test_context_t *Ctx) +{ + cairo_surface_t *surface; + cairo_pattern_t *solid_rgb, *solid_rgba, *surface_pattern, *linear, *radial, *mesh; + cairo_test_status_t result = CAIRO_TEST_SUCCESS; + + solid_rgb = cairo_pattern_create_rgb (0.0, 0.1, 0.2); + solid_rgba = cairo_pattern_create_rgba (0.3, 0.4, 0.5, 0.6); + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + 1, 1); + surface_pattern = cairo_pattern_create_for_surface (surface); + linear = cairo_pattern_create_linear (0.0, 0.0, 10.0, 10.0); + radial = cairo_pattern_create_radial (10.0, 10.0, 0.1, + 10.0, 10.0, 1.0); + mesh = cairo_pattern_create_mesh (); + + if (cairo_pattern_get_type (solid_rgb) != CAIRO_PATTERN_TYPE_SOLID) + result = CAIRO_TEST_FAILURE; + + if (cairo_pattern_get_type (solid_rgba) != CAIRO_PATTERN_TYPE_SOLID) + result = CAIRO_TEST_FAILURE; + + if (cairo_pattern_get_type (surface_pattern) != CAIRO_PATTERN_TYPE_SURFACE) + result = CAIRO_TEST_FAILURE; + + if (cairo_pattern_get_type (linear) != CAIRO_PATTERN_TYPE_LINEAR) + result = CAIRO_TEST_FAILURE; + + if (cairo_pattern_get_type (radial) != CAIRO_PATTERN_TYPE_RADIAL) + result = CAIRO_TEST_FAILURE; + + if (cairo_pattern_get_type (mesh) != CAIRO_PATTERN_TYPE_MESH) + result = CAIRO_TEST_FAILURE; + + cairo_pattern_destroy (solid_rgb); + cairo_pattern_destroy (solid_rgba); + cairo_pattern_destroy (surface_pattern); + cairo_surface_destroy (surface); + cairo_pattern_destroy (linear); + cairo_pattern_destroy (radial); + cairo_pattern_destroy (mesh); + + return result; +} + +CAIRO_TEST (pattern_get_type, + "Creating patterns of all types", + "pattern, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/pattern-getters.c b/test/pattern-getters.c new file mode 100644 index 000000000..08508d7d4 --- /dev/null +++ b/test/pattern-getters.c @@ -0,0 +1,279 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2005 Mozilla Corporation, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" +#include + +#define CHECK_SUCCESS do { \ + if (status) { \ + cairo_pattern_destroy (pat); \ + return cairo_test_status_from_status (ctx, status); \ + } \ +} while (0) + +static int +double_buf_equal (const cairo_test_context_t *ctx, double *a, double *b, int nc) +{ + int i; + for (i = 0; i < nc; i++) { + if (!CAIRO_TEST_DOUBLE_EQUALS(a[i],b[i])) { + cairo_test_log (ctx, "Error: doubles not equal: %g, %g\n", + a[i], b[i]); + return 0; + } + } + return 1; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_status_t status; + cairo_pattern_t *pat; + + /* Test pattern_get_rgba */ + { + double r, g, b, a; + pat = cairo_pattern_create_rgba (0.2, 0.3, 0.4, 0.5); + + status = cairo_pattern_get_rgba (pat, &r, &g, &b, &a); + CHECK_SUCCESS; + + if (!CAIRO_TEST_DOUBLE_EQUALS(r,0.2) || + !CAIRO_TEST_DOUBLE_EQUALS(g,0.3) || + !CAIRO_TEST_DOUBLE_EQUALS(b,0.4) || + !CAIRO_TEST_DOUBLE_EQUALS(a,0.5)) { + cairo_test_log (ctx, "Error: cairo_pattern_get_rgba returned unexepcted results: %g, %g, %g, %g\n", + r, g, b, a); + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + cairo_pattern_destroy (pat); + } + + /* Test pattern_get_surface */ + { + cairo_surface_t *surf; + + pat = cairo_pattern_create_for_surface (cairo_get_target (cr)); + + status = cairo_pattern_get_surface (pat, &surf); + CHECK_SUCCESS; + + if (surf != cairo_get_target (cr)) { + cairo_test_log (ctx, "Error: cairo_pattern_get_resurface returned wrong surface\n"); + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + cairo_pattern_destroy (pat); + } + + /* Test get_color_stops & linear_get_points */ + { + int i; + double x0, y0, x1, y1; + double expected_values[15] = { 0.0, 0.2, 0.4, 0.2, 1.0, + 0.5, 0.4, 0.5, 0.2, 0.5, + 1.0, 0.2, 0.4, 0.5, 0.2 }; + double new_buf[15]; + + pat = cairo_pattern_create_linear (1.0, 2.0, 3.0, 4.0); + + for (i = 0; i < 3; i++) { + cairo_pattern_add_color_stop_rgba (pat, + expected_values[i*5+0], + expected_values[i*5+1], + expected_values[i*5+2], + expected_values[i*5+3], + expected_values[i*5+4]); + } + + status = cairo_pattern_get_linear_points (pat, &x0, &y0, &x1, &y1); + CHECK_SUCCESS; + + if (!CAIRO_TEST_DOUBLE_EQUALS(x0,1.0) || + !CAIRO_TEST_DOUBLE_EQUALS(y0,2.0) || + !CAIRO_TEST_DOUBLE_EQUALS(x1,3.0) || + !CAIRO_TEST_DOUBLE_EQUALS(y1,4.0)) + { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + status = cairo_pattern_get_color_stop_count (pat, &i); + CHECK_SUCCESS; + + if (i != 3) { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + for (i = 0; i < 3; i++) { + status = cairo_pattern_get_color_stop_rgba (pat, i, + &new_buf[i*5+0], + &new_buf[i*5+1], + &new_buf[i*5+2], + &new_buf[i*5+3], + &new_buf[i*5+4]); + CHECK_SUCCESS; + } + + status = cairo_pattern_get_color_stop_rgba (pat, 5, NULL, NULL, NULL, NULL, NULL); + if (status != CAIRO_STATUS_INVALID_INDEX) { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + if (!double_buf_equal (ctx, new_buf, expected_values, + ARRAY_LENGTH (expected_values)) != 0) + { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + cairo_pattern_destroy (pat); + } + + /* Test radial_get_circles */ + { + double a, b, c, d, e, f; + pat = cairo_pattern_create_radial (1, 2, 3, + 4, 5, 6); + + status = cairo_pattern_get_radial_circles (pat, &a, &b, &c, &d, &e, &f); + CHECK_SUCCESS; + + if (!CAIRO_TEST_DOUBLE_EQUALS(a,1.0) || + !CAIRO_TEST_DOUBLE_EQUALS(b,2.0) || + !CAIRO_TEST_DOUBLE_EQUALS(c,3.0) || + !CAIRO_TEST_DOUBLE_EQUALS(d,4.0) || + !CAIRO_TEST_DOUBLE_EQUALS(e,5.0) || + !CAIRO_TEST_DOUBLE_EQUALS(f,6.0)) + { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + cairo_pattern_destroy (pat); + } + + /* Test mesh getters */ + { + unsigned int count; + int i; + pat = cairo_pattern_create_mesh (); + + status = cairo_mesh_pattern_get_patch_count (pat, &count); + CHECK_SUCCESS; + + if (count != 0) { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + cairo_mesh_pattern_begin_patch (pat); + cairo_mesh_pattern_move_to (pat, 0, 0); + cairo_mesh_pattern_line_to (pat, 0, 3); + cairo_mesh_pattern_line_to (pat, 3, 3); + cairo_mesh_pattern_line_to (pat, 3, 0); + + status = cairo_mesh_pattern_get_patch_count (pat, &count); + CHECK_SUCCESS; + + if (count != 0) { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + cairo_mesh_pattern_end_patch (pat); + + status = cairo_mesh_pattern_get_patch_count (pat, &count); + CHECK_SUCCESS; + + if (count != 1) { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + + for (i = 0; i < 4; i++) { + double cp_x[4] = { 1, 1, 2, 2 }; + double cp_y[4] = { 1, 2, 2, 1 }; + double x, y; + + status = cairo_mesh_pattern_get_control_point (pat, 0, i, &x, &y); + CHECK_SUCCESS; + + if (!CAIRO_TEST_DOUBLE_EQUALS(x,cp_x[i]) || + !CAIRO_TEST_DOUBLE_EQUALS(y,cp_y[i])) + { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + } + + cairo_mesh_pattern_begin_patch (pat); + cairo_mesh_pattern_move_to (pat, 0, 0); + cairo_mesh_pattern_line_to (pat, 1, 0); + cairo_mesh_pattern_line_to (pat, 1, 1); + cairo_mesh_pattern_set_corner_color_rgb (pat, 0, 1, 1, 1); + cairo_mesh_pattern_end_patch (pat); + + for (i = 0; i < 4; i++) { + double corner_color[4] = { 1, 0, 0, 1 }; + double a, r, g, b; + + status = cairo_mesh_pattern_get_corner_color_rgba (pat, 1, i, + &r, &g, &b, &a); + CHECK_SUCCESS; + + if (!CAIRO_TEST_DOUBLE_EQUALS(a,corner_color[i]) || + !CAIRO_TEST_DOUBLE_EQUALS(r,corner_color[i]) || + !CAIRO_TEST_DOUBLE_EQUALS(g,corner_color[i]) || + !CAIRO_TEST_DOUBLE_EQUALS(b,corner_color[i])) + { + cairo_pattern_destroy (pat); + return CAIRO_TEST_FAILURE; + } + } + + cairo_pattern_destroy (pat); + } + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (pattern_getters, + "Tests calls to pattern getter functions", + "pattern, api", /* keywords */ + NULL, /* requirements */ + 1, 1, + NULL, draw) diff --git a/test/pdf-features.c b/test/pdf-features.c new file mode 100644 index 000000000..b9c2bd07a --- /dev/null +++ b/test/pdf-features.c @@ -0,0 +1,148 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include +#include +#include + +/* This test exists to test the various features of cairo-pdf.h. + * + * Currently, this test exercises the following function calls: + * + * cairo_pdf_surface_set_size + */ + +#define INCHES_TO_POINTS(in) ((in) * 72.0) +#define MM_TO_POINTS(mm) ((mm) / 25.4 * 72.0) +#define TEXT_SIZE 12 +#define BASENAME "pdf-features.out" + +static struct { + const char *page_size; + const char *page_size_alias; + const char *orientation; + double width_in_points; + double height_in_points; +} pages[] = { + {"na_letter_8.5x11in", "letter", "portrait", + INCHES_TO_POINTS(8.5), INCHES_TO_POINTS(11)}, + {"na_letter_8.5x11in", "letter", "landscape", + INCHES_TO_POINTS(11), INCHES_TO_POINTS(8.5)}, + {"iso_a4_210x297mm", "a4", "portrait", + MM_TO_POINTS(210), MM_TO_POINTS(297)}, + {"iso_a4_210x297mm", "a4", "landscape", + MM_TO_POINTS(297), MM_TO_POINTS(210)}, + {"iso_a5_148x210mm", "a5", "portrait", + MM_TO_POINTS(148), MM_TO_POINTS(210)}, + {"iso_a5_148x210mm", "a5", "landscape", + MM_TO_POINTS(210), MM_TO_POINTS(148)}, + {"iso_a6_105x148mm", "a6", "portrait", + MM_TO_POINTS(105), MM_TO_POINTS(148)}, + {"iso_a6_105x148mm", "a6", "landscape", + MM_TO_POINTS(148), MM_TO_POINTS(105)}, + {"iso_a7_74x105mm", "a7", "portrait", + MM_TO_POINTS(74), MM_TO_POINTS(105)}, + {"iso_a7_74x105mm", "a7", "landscape", + MM_TO_POINTS(105), MM_TO_POINTS(74)}, + {"iso_a8_52x74mm", "a8", "portrait", + MM_TO_POINTS(52), MM_TO_POINTS(74)}, + {"iso_a8_52x74mm", "a8", "landscape", + MM_TO_POINTS(74), MM_TO_POINTS(52)}, + {"iso_a9_37x52mm", "a9", "portrait", + MM_TO_POINTS(37), MM_TO_POINTS(52)}, + {"iso_a9_37x52mm", "a9", "landscape", + MM_TO_POINTS(52), MM_TO_POINTS(37)}, + {"iso_a10_26x37mm", "a10", "portrait", + MM_TO_POINTS(26), MM_TO_POINTS(37)}, + {"iso_a10_26x37mm", "a10", "landscape", + MM_TO_POINTS(37), MM_TO_POINTS(26)} +}; + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_t *cr; + cairo_status_t status; + size_t i; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + if (! cairo_test_is_target_enabled (ctx, "pdf")) + return CAIRO_TEST_UNTESTED; + + xasprintf (&filename, "%s/%s.pdf", path, BASENAME); + + /* The initial size passed here is the default size that will be + * inheritable by each page. That is, any page for which this + * initial size applies will not have its own /MediaBox entry in + * its dictionary. */ + surface = cairo_pdf_surface_create (filename, + INCHES_TO_POINTS(8.5), + INCHES_TO_POINTS(11)); + + cr = cairo_create (surface); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + for (i = 0; i < ARRAY_LENGTH (pages); i++) { + cairo_pdf_surface_set_size (surface, + pages[i].width_in_points, + pages[i].height_in_points); + + cairo_move_to (cr, TEXT_SIZE, TEXT_SIZE); + cairo_show_text (cr, pages[i].page_size); + cairo_show_text (cr, " - "); + cairo_show_text (cr, pages[i].orientation); + cairo_show_page (cr); + } + + status = cairo_status (cr); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + free (filename); + + if (status) { + cairo_test_log (ctx, "Failed to create pdf surface for file %s: %s\n", + filename, cairo_status_to_string (status)); + return CAIRO_TEST_FAILURE; + } + + printf ("pdf-features: Please check %s to ensure it looks/prints correctly.\n", filename); + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (pdf_features, + "Check PDF specific API", + "pdf", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/pdf-isolated-group.c b/test/pdf-isolated-group.c new file mode 100644 index 000000000..e74a346a2 --- /dev/null +++ b/test/pdf-isolated-group.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2012 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 60 +#define WIDTH SIZE +#define HEIGHT SIZE + + +/* PDF transparency groups can be isolated or non-isolated. This test + * checks that the PDF output is using isolated groups. If the group + * is non-isolated the bottom half of the inner rectangle will be + * red. Note poppler-cairo currently ignores the isolated flag and + * treats the group as isolated. + * + * Refer to http://www.pdfvt.com/PDFVT_TransparencyGuide.html for an + * explanation isolated vs non-isolated. + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 0.5, 0); + cairo_rectangle (cr, 0, SIZE/2, SIZE, SIZE/2); + cairo_fill (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_MULTIPLY); + + cairo_push_group (cr); + + cairo_set_source_rgb (cr, 0.7, 0.7, 0.7); + cairo_rectangle (cr, SIZE/4, SIZE/4, SIZE/2, SIZE/2); + cairo_fill (cr); + + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (pdf_isolated_group, + "Check that transparency groups in PDF output are isolated", + "group, operator", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/pdf-mime-data.c b/test/pdf-mime-data.c new file mode 100644 index 000000000..fd5af1f7f --- /dev/null +++ b/test/pdf-mime-data.c @@ -0,0 +1,187 @@ +/* + * Copyright © 2008 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#include +#include +#include +#include + +/* This test checks that the mime data is correctly used by the PDF + * surface when embedding images.. + */ + +/* Both a *.png and *.jpg file with this name is required since we + * are not using a jpeg library */ +#define IMAGE_FILE "romedalen" + +#define BASENAME "pdf-mime-data.out" + +static cairo_test_status_t +read_file (const cairo_test_context_t *ctx, + const char *file, + unsigned char **data, + unsigned int *len) +{ + FILE *fp; + + fp = fopen (file, "rb"); + if (fp == NULL) { + char filename[4096]; + + /* try again with srcdir */ + snprintf (filename, sizeof (filename), + "%s/%s", ctx->srcdir, file); + fp = fopen (filename, "rb"); + } + if (fp == NULL) { + switch (errno) { + case ENOMEM: + cairo_test_log (ctx, "Could not create file handle for %s due to \ + lack of memory\n", file); + return CAIRO_TEST_NO_MEMORY; + default: + cairo_test_log (ctx, "Could not get the file handle for %s\n", file); + return CAIRO_TEST_FAILURE; + } + } + + fseek (fp, 0, SEEK_END); + *len = ftell(fp); + fseek (fp, 0, SEEK_SET); + *data = malloc (*len); + if (*data == NULL) { + fclose(fp); + cairo_test_log (ctx, "Could not allocate memory for buffer to read \ + from file %s\n", file); + return CAIRO_TEST_NO_MEMORY; + } + + if (fread(*data, *len, 1, fp) != 1) { + free (data); + fclose(fp); + cairo_test_log (ctx, "Could not read data from file %s\n", file); + return CAIRO_TEST_FAILURE; + } + + fclose(fp); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *image; + cairo_surface_t *surface; + cairo_t *cr; + cairo_status_t status, status2; + cairo_test_status_t test_status; + int width, height; + unsigned char *data; + unsigned char *out_data; + unsigned int len, out_len; + char command[4096]; + int exit_status; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + if (! cairo_test_is_target_enabled (ctx, "pdf")) + return CAIRO_TEST_UNTESTED; + + image = cairo_image_surface_create_from_png (IMAGE_FILE ".png"); + test_status = read_file (ctx, IMAGE_FILE ".jpg", &data, &len); + if (test_status) { + return test_status; + } + + cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JPEG, + data, len, + free, data); + width = cairo_image_surface_get_width (image); + height = cairo_image_surface_get_height (image); + + xasprintf (&filename, "%s/%s.pdf", path, BASENAME); + surface = cairo_pdf_surface_create (filename, width + 20, height + 20); + cr = cairo_create (surface); + cairo_translate (cr, 10, 10); + cairo_set_source_surface (cr, image, 0, 0); + cairo_paint (cr); + status = cairo_status (cr); + cairo_destroy (cr); + cairo_surface_finish (surface); + status2 = cairo_surface_status (surface); + if (status != CAIRO_STATUS_SUCCESS) + status = status2; + cairo_surface_destroy (surface); + cairo_surface_destroy (image); + + if (status) { + free (filename); + cairo_test_log (ctx, "Failed to create pdf surface for file %s: %s\n", + filename, cairo_status_to_string (status)); + return CAIRO_TEST_FAILURE; + } + + printf ("pdf-mime-data: Please check %s to ensure it looks/prints correctly.\n", filename); + + sprintf (command, "pdfimages -j %s %s", filename, CAIRO_TEST_OUTPUT_DIR "/" BASENAME); + exit_status = system (command); + free (filename); + if (exit_status) { + cairo_test_log (ctx, "pdfimages failed with exit status %d\n", exit_status); + return CAIRO_TEST_FAILURE; + } + + test_status = read_file (ctx, IMAGE_FILE ".jpg", &data, &len); + if (test_status) { + return test_status; + } + + test_status = read_file (ctx, CAIRO_TEST_OUTPUT_DIR "/" BASENAME "-000.jpg", &out_data, &out_len); + if (test_status) { + return test_status; + } + + if (len != out_len || memcmp(data, out_data, len) != 0) { + free (data); + free (out_data); + cairo_test_log (ctx, "output mime data does not match source mime data\n"); + return CAIRO_TEST_FAILURE; + } + + free (data); + free (out_data); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (pdf_mime_data, + "Check mime data correctly used by PDF surface", + "pdf, mime-data", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/pdf-surface-source.c b/test/pdf-surface-source.c new file mode 100644 index 000000000..354a7259a --- /dev/null +++ b/test/pdf-surface-source.c @@ -0,0 +1,53 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#include + +#include "surface-source.c" + +#define BASENAME "pdf-surface-source.out" + +static cairo_surface_t * +create_source_surface (int size) +{ + cairo_surface_t *surface; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + xasprintf (&filename, "%s/%s.pdf", path, BASENAME); + surface = cairo_pdf_surface_create (filename, size, size); + cairo_surface_set_fallback_resolution (surface, 72., 72.); + free (filename); + + return surface; +} + +CAIRO_TEST (pdf_surface_source, + "Test using a PDF surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/pdf2png.c b/test/pdf2png.c new file mode 100644 index 000000000..06fa05b18 --- /dev/null +++ b/test/pdf2png.c @@ -0,0 +1,99 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include +#include +#include + +#define FAIL(msg) \ + do { fprintf (stderr, "FAIL: %s\n", msg); exit (-1); } while (0) + +#define PIXELS_PER_POINT 1 + +int main (int argc, char *argv[]) +{ + PopplerDocument *document; + PopplerPage *page; + double width, height; + const char *filename = argv[1]; + const char *output_filename = argv[2]; + const char *page_label = argv[3]; + gchar *absolute, *uri; + cairo_surface_t *surface; + cairo_t *cr; + cairo_status_t status; + GError *error = NULL; + + if (argc != 4) + FAIL ("usage: pdf2png input_file.pdf output_file.png page"); + + g_type_init (); + + if (g_path_is_absolute(filename)) { + absolute = g_strdup (filename); + } else { + gchar *dir = g_get_current_dir (); + absolute = g_build_filename (dir, filename, (gchar *) 0); + g_free (dir); + } + + uri = g_filename_to_uri (absolute, NULL, &error); + g_free (absolute); + if (uri == NULL) + FAIL (error->message); + + document = poppler_document_new_from_file (uri, NULL, &error); + if (document == NULL) + FAIL (error->message); + + page = poppler_document_get_page_by_label (document, page_label); + if (page == NULL) + FAIL ("page not found"); + + poppler_page_get_size (page, &width, &height); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA); + + poppler_page_render (page, cr); + g_object_unref (page); + + cairo_pop_group_to_source (cr); + cairo_paint (cr); + + status = cairo_surface_write_to_png (cairo_get_target (cr), + output_filename); + cairo_destroy (cr); + + if (status) + FAIL (cairo_status_to_string (status)); + + return 0; +} diff --git a/test/pdiff/Makefile.am b/test/pdiff/Makefile.am new file mode 100644 index 000000000..73098da78 --- /dev/null +++ b/test/pdiff/Makefile.am @@ -0,0 +1,19 @@ +include $(top_srcdir)/build/Makefile.am.common + +EXTRA_PROGRAMS += perceptualdiff +EXTRA_DIST += gpl.txt + +noinst_LTLIBRARIES = libpdiff.la +libpdiff_la_SOURCES = \ + pdiff.h \ + lpyramid.c \ + lpyramid.h \ + pdiff.c + +perceptualdiff_SOURCES = \ + args.c \ + args.h \ + perceptualdiff.c + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src $(CAIRO_CFLAGS) +LDADD = libpdiff.la $(top_builddir)/src/libcairo.la diff --git a/test/pdiff/Makefile.in b/test/pdiff/Makefile.in new file mode 100644 index 000000000..f8d77c920 --- /dev/null +++ b/test/pdiff/Makefile.in @@ -0,0 +1,1105 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp $(top_srcdir)/build/test-driver +EXTRA_PROGRAMS = perceptualdiff$(EXEEXT) +TESTS = +check_PROGRAMS = +subdir = test/pdiff +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libpdiff_la_LIBADD = +am_libpdiff_la_OBJECTS = lpyramid.lo pdiff.lo +libpdiff_la_OBJECTS = $(am_libpdiff_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_perceptualdiff_OBJECTS = args.$(OBJEXT) perceptualdiff.$(OBJEXT) +perceptualdiff_OBJECTS = $(am_perceptualdiff_OBJECTS) +perceptualdiff_LDADD = $(LDADD) +perceptualdiff_DEPENDENCIES = libpdiff.la \ + $(top_builddir)/src/libcairo.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libpdiff_la_SOURCES) $(perceptualdiff_SOURCES) +DIST_SOURCES = $(libpdiff_la_SOURCES) $(perceptualdiff_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = gpl.txt +EXTRA_LTLIBRARIES = +MAINTAINERCLEANFILES = Makefile.in +noinst_LTLIBRARIES = libpdiff.la +libpdiff_la_SOURCES = \ + pdiff.h \ + lpyramid.c \ + lpyramid.h \ + pdiff.c + +perceptualdiff_SOURCES = \ + args.c \ + args.h \ + perceptualdiff.c + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src $(CAIRO_CFLAGS) +LDADD = libpdiff.la $(top_builddir)/src/libcairo.la +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/pdiff/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign test/pdiff/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libpdiff.la: $(libpdiff_la_OBJECTS) $(libpdiff_la_DEPENDENCIES) $(EXTRA_libpdiff_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libpdiff_la_OBJECTS) $(libpdiff_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +perceptualdiff$(EXEEXT): $(perceptualdiff_OBJECTS) $(perceptualdiff_DEPENDENCIES) $(EXTRA_perceptualdiff_DEPENDENCIES) + @rm -f perceptualdiff$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(perceptualdiff_OBJECTS) $(perceptualdiff_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/args.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpyramid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pdiff.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perceptualdiff.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am recheck tags tags-am uninstall \ + uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/test/pdiff/args.c b/test/pdiff/args.c new file mode 100644 index 000000000..ac3aa83a9 --- /dev/null +++ b/test/pdiff/args.c @@ -0,0 +1,119 @@ +/* + Comapre Args + Copyright (C) 2006 Yangli Hector Yee + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ + +#include "args.h" +#include +#include +#include + +static const char* copyright = +"PerceptualDiff version 1.0, Copyright (C) 2006 Yangli Hector Yee\n\ +PerceptualDiff comes with ABSOLUTELY NO WARRANTY;\n\ +This is free software, and you are welcome\n\ +to redistribute it under certain conditions;\n\ +See the GPL page for details: http://www.gnu.org/copyleft/gpl.html\n\n"; + +static const char *usage = +"PeceptualDiff image1.tif image2.tif\n\n\ + Compares image1.tif and image2.tif using a perceptually based image metric\n\ + Options:\n\ +\t-verbose : Turns on verbose mode\n\ +\t-fov deg : Field of view in degrees (0.1 to 89.9)\n\ +\t-threshold p : #pixels p below which differences are ignored\n\ +\t-gamma g : Value to convert rgb into linear space (default 2.2)\n\ +\t-luminance l : White luminance (default 100.0 cdm^-2)\n\ +\n\ +\n Note: Input files can also be in the PNG format\ +\n"; + +void +args_init (args_t *args) +{ + args->surface_a = NULL; + args->surface_b = NULL; + args->Verbose = false; + args->FieldOfView = 45.0f; + args->Gamma = 2.2f; + args->ThresholdPixels = 100; + args->Luminance = 100.0f; +} + +void +args_fini (args_t *args) +{ + cairo_surface_destroy (args->surface_a); + cairo_surface_destroy (args->surface_b); +} + +bool +args_parse (args_t *args, int argc, char **argv) +{ + int i; + if (argc < 3) { + fprintf (stderr, "%s", copyright); + fprintf (stderr, "%s", usage); + return false; + } + for (i = 0; i < argc; i++) { + if (i == 1) { + args->surface_a = cairo_image_surface_create_from_png (argv[1]); + if (cairo_surface_status (args->surface_a)) + { + fprintf (stderr, "FAIL: Cannot open %s: %s\n", + argv[1], cairo_status_to_string (cairo_surface_status (args->surface_a))); + return false; + } + } else if (i == 2) { + args->surface_b = cairo_image_surface_create_from_png (argv[2]); + if (cairo_surface_status (args->surface_b)) + { + fprintf (stderr, "FAIL: Cannot open %s: %s\n", + argv[2], cairo_status_to_string (cairo_surface_status (args->surface_b))); + return false; + } + } else { + if (strstr(argv[i], "-fov")) { + if (i + 1 < argc) { + args->FieldOfView = (float) atof(argv[i + 1]); + } + } else if (strstr(argv[i], "-verbose")) { + args->Verbose = true; + } else if (strstr(argv[i], "-threshold")) { + if (i + 1 < argc) { + args->ThresholdPixels = atoi(argv[i + 1]); + } + } else if (strstr(argv[i], "-gamma")) { + if (i + 1 < argc) { + args->Gamma = (float) atof(argv[i + 1]); + } + }else if (strstr(argv[i], "-luminance")) { + if (i + 1 < argc) { + args->Luminance = (float) atof(argv[i + 1]); + } + } + } + } /* i */ + return true; +} + +void +args_print (args_t *args) +{ + printf("Field of view is %f degrees\n", args->FieldOfView); + printf("Threshold pixels is %d pixels\n", args->ThresholdPixels); + printf("The Gamma is %f\n", args->Gamma); + printf("The Display's luminance is %f candela per meter squared\n", args->Luminance); +} diff --git a/test/pdiff/args.h b/test/pdiff/args.h new file mode 100644 index 000000000..502023915 --- /dev/null +++ b/test/pdiff/args.h @@ -0,0 +1,46 @@ +/* + Comapre Args + Copyright (C) 2006 Yangli Hector Yee + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ + +#ifndef _ARGS_H +#define _ARGS_H + +#include "pdiff.h" + +/* Args to pass into the comparison function */ +typedef struct _args +{ + cairo_surface_t *surface_a; /* Image A */ + cairo_surface_t *surface_b; /* Image B */ + bool Verbose; /* Print lots of text or not */ + float FieldOfView; /* Field of view in degrees */ + float Gamma; /* The gamma to convert to linear color space */ + float Luminance; /* the display's luminance */ + unsigned int ThresholdPixels; /* How many pixels different to ignore */ +} args_t; + +void +args_init (args_t *args); + +void +args_fini (args_t *args); + +bool +args_parse (args_t *args, int argc, char **argv); + +void +args_print (args_t *args); + +#endif diff --git a/test/pdiff/gpl.txt b/test/pdiff/gpl.txt new file mode 100644 index 000000000..f90922eea --- /dev/null +++ b/test/pdiff/gpl.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/test/pdiff/lpyramid.c b/test/pdiff/lpyramid.c new file mode 100644 index 000000000..bd402c7da --- /dev/null +++ b/test/pdiff/lpyramid.c @@ -0,0 +1,116 @@ +/* + Laplacian Pyramid + Copyright (C) 2006 Yangli Hector Yee + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ + +#include "lpyramid.h" +#include +#include +#include + +struct _lpyramid { + /* Successively blurred versions of the original image */ + float *levels[MAX_PYR_LEVELS]; + + int width; + int height; +}; + +static void +convolve (lpyramid_t *pyramid, float *a, const float *b) +/* convolves image b with the filter kernel and stores it in a */ +{ + int y,x,i,j; + const float Kernel[] = {0.05f, 0.25f, 0.4f, 0.25f, 0.05f}; + int width = pyramid->width; + int height = pyramid->height; + + for (y=0; y=height) ny=2*height - ny - 1; + ny *= width; + for (i=-2; i<=2; i++) { + int nx=x+i; + if (nx<0) nx=-nx; + if (nx>=width) nx=2*width - nx - 1; + sum_i += Kernel[i+2] * b[ny + nx]; + } + sum += sum_i * Kernel[j+2]; + } + *a++ = sum; + } + } +} + +/* + * Construction/Destruction + */ + +lpyramid_t * +lpyramid_create (float *image, int width, int height) +{ + lpyramid_t *pyramid; + int i; + + pyramid = malloc (sizeof (lpyramid_t)); + if (pyramid == NULL) { + fprintf (stderr, "Out of memory.\n"); + exit (1); + } + pyramid->width = width; + pyramid->height = height; + + /* Make the Laplacian pyramid by successively + * copying the earlier levels and blurring them */ + for (i=0; ilevels[i] = malloc (width * height * sizeof (float)); + if (pyramid->levels[i] == NULL) { + fprintf (stderr, "Out of memory.\n"); + exit (1); + } + if (i == 0) { + memcpy (pyramid->levels[i], image, width * height * sizeof (float)); + } else { + convolve(pyramid, pyramid->levels[i], pyramid->levels[i - 1]); + } + } + + return pyramid; +} + +void +lpyramid_destroy (lpyramid_t *pyramid) +{ + int i; + + for (i=0; ilevels[i]); + + free (pyramid); +} + +float +lpyramid_get_value (lpyramid_t *pyramid, int x, int y, int level) +{ + int index = x + y * pyramid->width; + int l = level; + if (l > MAX_PYR_LEVELS) + l = MAX_PYR_LEVELS; + return pyramid->levels[l][index]; +} diff --git a/test/pdiff/lpyramid.h b/test/pdiff/lpyramid.h new file mode 100644 index 000000000..e47a66e20 --- /dev/null +++ b/test/pdiff/lpyramid.h @@ -0,0 +1,32 @@ +/* + Laplacian Pyramid + Copyright (C) 2006 Yangli Hector Yee + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ +#ifndef _LPYRAMID_H +#define _LPYRAMID_H + +#define MAX_PYR_LEVELS 8 + +typedef struct _lpyramid lpyramid_t; + +lpyramid_t * +lpyramid_create (float *image, int width, int height); + +void +lpyramid_destroy (lpyramid_t *pyramid); + +float +lpyramid_get_value (lpyramid_t *pyramid, int x, int y, int level); + +#endif /* _LPYRAMID_H */ diff --git a/test/pdiff/pdiff.c b/test/pdiff/pdiff.c new file mode 100644 index 000000000..eb5f15682 --- /dev/null +++ b/test/pdiff/pdiff.c @@ -0,0 +1,420 @@ +/* + Metric + Copyright (C) 2006 Yangli Hector Yee + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ + +#define _GNU_SOURCE + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include "lpyramid.h" +#include +#include +#include + +#if HAVE_STDINT_H +# include +#elif HAVE_INTTYPES_H +# include +#elif HAVE_SYS_INT_TYPES_H +# include +#elif defined(_MSC_VER) + typedef __int8 int8_t; + typedef unsigned __int8 uint8_t; + typedef __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef __int32 int32_t; + typedef unsigned __int32 uint32_t; + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +# ifndef HAVE_UINT64_T +# define HAVE_UINT64_T 1 +# endif +# ifndef INT16_MIN +# define INT16_MIN (-32767-1) +# endif +# ifndef INT16_MAX +# define INT16_MAX (32767) +# endif +# ifndef UINT16_MAX +# define UINT16_MAX (65535) +# endif +#else +#error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.) +#endif + +#include "pdiff.h" + +#ifndef M_PI +#define M_PI 3.14159265f +#endif + +#ifndef __USE_ISOC99 +#define expf exp +#define powf pow +#define fabsf fabs +#define sqrtf sqrt +#define log10f log10 +#endif + +/* + * Given the adaptation luminance, this function returns the + * threshold of visibility in cd per m^2 + * TVI means Threshold vs Intensity function + * This version comes from Ward Larson Siggraph 1997 + */ +static float +tvi (float adaptation_luminance) +{ + /* returns the threshold luminance given the adaptation luminance + units are candelas per meter squared + */ + float log_a, r, result; + log_a = log10f(adaptation_luminance); + + if (log_a < -3.94f) { + r = -2.86f; + } else if (log_a < -1.44f) { + r = powf(0.405f * log_a + 1.6f , 2.18f) - 2.86f; + } else if (log_a < -0.0184f) { + r = log_a - 0.395f; + } else if (log_a < 1.9f) { + r = powf(0.249f * log_a + 0.65f, 2.7f) - 0.72f; + } else { + r = log_a - 1.255f; + } + + result = powf(10.0f , r); + + return result; +} + +/* computes the contrast sensitivity function (Barten SPIE 1989) + * given the cycles per degree (cpd) and luminance (lum) + */ +static float +csf (float cpd, float lum) +{ + float a, b, result; + + a = 440.0f * powf((1.0f + 0.7f / lum), -0.2f); + b = 0.3f * powf((1.0f + 100.0f / lum), 0.15f); + + result = a * cpd * expf(-b * cpd) * sqrtf(1.0f + 0.06f * expf(b * cpd)); + + return result; +} + +/* + * Visual Masking Function + * from Daly 1993 + */ +static float +mask (float contrast) +{ + float a, b, result; + a = powf(392.498f * contrast, 0.7f); + b = powf(0.0153f * a, 4.0f); + result = powf(1.0f + b, 0.25f); + + return result; +} + +/* convert Adobe RGB (1998) with reference white D65 to XYZ */ +static void +AdobeRGBToXYZ (float r, float g, float b, float *x, float *y, float *z) +{ + /* matrix is from http://www.brucelindbloom.com/ */ + *x = r * 0.576700f + g * 0.185556f + b * 0.188212f; + *y = r * 0.297361f + g * 0.627355f + b * 0.0752847f; + *z = r * 0.0270328f + g * 0.0706879f + b * 0.991248f; +} + +static void +XYZToLAB (float x, float y, float z, float *L, float *A, float *B) +{ + static float xw = -1; + static float yw; + static float zw; + const float epsilon = 216.0f / 24389.0f; + const float kappa = 24389.0f / 27.0f; + float f[3]; + float r[3]; + int i; + + /* reference white */ + if (xw < 0) { + AdobeRGBToXYZ(1, 1, 1, &xw, &yw, &zw); + } + r[0] = x / xw; + r[1] = y / yw; + r[2] = z / zw; + for (i = 0; i < 3; i++) { + if (r[i] > epsilon) { + f[i] = powf(r[i], 1.0f / 3.0f); + } else { + f[i] = (kappa * r[i] + 16.0f) / 116.0f; + } + } + *L = 116.0f * f[1] - 16.0f; + *A = 500.0f * (f[0] - f[1]); + *B = 200.0f * (f[1] - f[2]); +} + +static uint32_t +_get_pixel (const uint32_t *data, int i) +{ + return data[i]; +} + +static unsigned char +_get_red (const uint32_t *data, int i) +{ + uint32_t pixel; + uint8_t alpha; + + pixel = _get_pixel (data, i); + alpha = (pixel & 0xff000000) >> 24; + if (alpha == 0) + return 0; + else + return (((pixel & 0x00ff0000) >> 16) * 255 + alpha / 2) / alpha; +} + +static unsigned char +_get_green (const uint32_t *data, int i) +{ + uint32_t pixel; + uint8_t alpha; + + pixel = _get_pixel (data, i); + alpha = (pixel & 0xff000000) >> 24; + if (alpha == 0) + return 0; + else + return (((pixel & 0x0000ff00) >> 8) * 255 + alpha / 2) / alpha; +} + +static unsigned char +_get_blue (const uint32_t *data, int i) +{ + uint32_t pixel; + uint8_t alpha; + + pixel = _get_pixel (data, i); + alpha = (pixel & 0xff000000) >> 24; + if (alpha == 0) + return 0; + else + return (((pixel & 0x000000ff) >> 0) * 255 + alpha / 2) / alpha; +} + +static void * +xmalloc (size_t size) +{ + void *buf; + + buf = malloc (size); + if (buf == NULL) { + fprintf (stderr, "Out of memory.\n"); + exit (1); + } + + return buf; +} + +int +pdiff_compare (cairo_surface_t *surface_a, + cairo_surface_t *surface_b, + double gamma, + double luminance, + double field_of_view) +{ + unsigned int dim = (cairo_image_surface_get_width (surface_a) + * cairo_image_surface_get_height (surface_a)); + unsigned int i; + + /* assuming colorspaces are in Adobe RGB (1998) convert to XYZ */ + float *aX; + float *aY; + float *aZ; + float *bX; + float *bY; + float *bZ; + float *aLum; + float *bLum; + + float *aA; + float *bA; + float *aB; + float *bB; + + unsigned int x, y, w, h; + + lpyramid_t *la, *lb; + + float num_one_degree_pixels, pixels_per_degree, num_pixels; + unsigned int adaptation_level; + + float cpd[MAX_PYR_LEVELS]; + float F_freq[MAX_PYR_LEVELS - 2]; + float csf_max; + const uint32_t *data_a, *data_b; + + unsigned int pixels_failed; + + w = cairo_image_surface_get_width (surface_a); + h = cairo_image_surface_get_height (surface_a); + if (w < 3 || h < 3) /* too small for the Laplacian convolution */ + return -1; + + aX = xmalloc (dim * sizeof (float)); + aY = xmalloc (dim * sizeof (float)); + aZ = xmalloc (dim * sizeof (float)); + bX = xmalloc (dim * sizeof (float)); + bY = xmalloc (dim * sizeof (float)); + bZ = xmalloc (dim * sizeof (float)); + aLum = xmalloc (dim * sizeof (float)); + bLum = xmalloc (dim * sizeof (float)); + + aA = xmalloc (dim * sizeof (float)); + bA = xmalloc (dim * sizeof (float)); + aB = xmalloc (dim * sizeof (float)); + bB = xmalloc (dim * sizeof (float)); + + data_a = (uint32_t *) cairo_image_surface_get_data (surface_a); + data_b = (uint32_t *) cairo_image_surface_get_data (surface_b); + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + float r, g, b, l; + i = x + y * w; + r = powf(_get_red (data_a, i) / 255.0f, gamma); + g = powf(_get_green (data_a, i) / 255.0f, gamma); + b = powf(_get_blue (data_a, i) / 255.0f, gamma); + + AdobeRGBToXYZ(r,g,b,&aX[i],&aY[i],&aZ[i]); + XYZToLAB(aX[i], aY[i], aZ[i], &l, &aA[i], &aB[i]); + r = powf(_get_red (data_b, i) / 255.0f, gamma); + g = powf(_get_green (data_b, i) / 255.0f, gamma); + b = powf(_get_blue (data_b, i) / 255.0f, gamma); + + AdobeRGBToXYZ(r,g,b,&bX[i],&bY[i],&bZ[i]); + XYZToLAB(bX[i], bY[i], bZ[i], &l, &bA[i], &bB[i]); + aLum[i] = aY[i] * luminance; + bLum[i] = bY[i] * luminance; + } + } + + la = lpyramid_create (aLum, w, h); + lb = lpyramid_create (bLum, w, h); + + num_one_degree_pixels = (float) (2 * tan(field_of_view * 0.5 * M_PI / 180) * 180 / M_PI); + pixels_per_degree = w / num_one_degree_pixels; + + num_pixels = 1; + adaptation_level = 0; + for (i = 0; i < MAX_PYR_LEVELS; i++) { + adaptation_level = i; + if (num_pixels > num_one_degree_pixels) break; + num_pixels *= 2; + } + + cpd[0] = 0.5f * pixels_per_degree; + for (i = 1; i < MAX_PYR_LEVELS; i++) cpd[i] = 0.5f * cpd[i - 1]; + csf_max = csf(3.248f, 100.0f); + + for (i = 0; i < MAX_PYR_LEVELS - 2; i++) F_freq[i] = csf_max / csf( cpd[i], 100.0f); + + pixels_failed = 0; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + int index = x + y * w; + float contrast[MAX_PYR_LEVELS - 2]; + float F_mask[MAX_PYR_LEVELS - 2]; + float factor; + float delta; + float adapt; + bool pass; + float sum_contrast = 0; + for (i = 0; i < MAX_PYR_LEVELS - 2; i++) { + float n1 = fabsf(lpyramid_get_value (la,x,y,i) - lpyramid_get_value (la,x,y,i + 1)); + float n2 = fabsf(lpyramid_get_value (lb,x,y,i) - lpyramid_get_value (lb,x,y,i + 1)); + float numerator = (n1 > n2) ? n1 : n2; + float d1 = fabsf(lpyramid_get_value(la,x,y,i+2)); + float d2 = fabsf(lpyramid_get_value(lb,x,y,i+2)); + float denominator = (d1 > d2) ? d1 : d2; + if (denominator < 1e-5f) denominator = 1e-5f; + contrast[i] = numerator / denominator; + sum_contrast += contrast[i]; + } + if (sum_contrast < 1e-5) sum_contrast = 1e-5f; + adapt = lpyramid_get_value(la,x,y,adaptation_level) + lpyramid_get_value(lb,x,y,adaptation_level); + adapt *= 0.5f; + if (adapt < 1e-5) adapt = 1e-5f; + for (i = 0; i < MAX_PYR_LEVELS - 2; i++) { + F_mask[i] = mask(contrast[i] * csf(cpd[i], adapt)); + } + factor = 0; + for (i = 0; i < MAX_PYR_LEVELS - 2; i++) { + factor += contrast[i] * F_freq[i] * F_mask[i] / sum_contrast; + } + if (factor < 1) factor = 1; + if (factor > 10) factor = 10; + delta = fabsf(lpyramid_get_value(la,x,y,0) - lpyramid_get_value(lb,x,y,0)); + pass = true; + /* pure luminance test */ + if (delta > factor * tvi(adapt)) { + pass = false; + } else { + /* CIE delta E test with modifications */ + float color_scale = 1.0f; + float da = aA[index] - bA[index]; + float db = aB[index] - bB[index]; + float delta_e; + /* ramp down the color test in scotopic regions */ + if (adapt < 10.0f) { + color_scale = 1.0f - (10.0f - color_scale) / 10.0f; + color_scale = color_scale * color_scale; + } + da = da * da; + db = db * db; + delta_e = (da + db) * color_scale; + if (delta_e > factor) { + pass = false; + } + } + if (!pass) + pixels_failed++; + } + } + + free (aX); + free (aY); + free (aZ); + free (bX); + free (bY); + free (bZ); + free (aLum); + free (bLum); + lpyramid_destroy (la); + lpyramid_destroy (lb); + free (aA); + free (bA); + free (aB); + free (bB); + + return pixels_failed; +} diff --git a/test/pdiff/pdiff.h b/test/pdiff/pdiff.h new file mode 100644 index 000000000..30fec06cf --- /dev/null +++ b/test/pdiff/pdiff.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2006 Yangli Hector Yee + Copyright (C) 2006 Red Hat, Inc. + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ + +#ifndef _PDIFF_H +#define _PDIFF_H + +#include + +typedef int bool; +#ifndef true +#define true 1 +#endif +#ifndef false +#define false 0 +#endif + +/* Image comparison metric using Yee's method (and a cairo interface) + * References: A Perceptual Metric for Production Testing, Hector Yee, Journal of Graphics Tools 2004 + */ +int +pdiff_compare (cairo_surface_t *surface_a, + cairo_surface_t *surface_b, + double gamma, + double luminance, + double field_of_view); + +#endif diff --git a/test/pdiff/perceptualdiff.c b/test/pdiff/perceptualdiff.c new file mode 100644 index 000000000..5850dc916 --- /dev/null +++ b/test/pdiff/perceptualdiff.c @@ -0,0 +1,101 @@ +/* + PerceptualDiff - a program that compares two images using a perceptual metric + based on the paper : + A perceptual metric for production testing. Journal of graphics tools, 9(4):33-40, 2004, Hector Yee + Copyright (C) 2006 Yangli Hector Yee + + This program is free software; you can redistribute it and/or modify it under the terms of the + GNU General Public License as published by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program; + if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA +*/ + +#include +#include +#include +#include +#include "lpyramid.h" +#include "args.h" +#include "pdiff.h" + +static bool Yee_Compare(args_t *args) +{ + unsigned int width_a, height_a, stride_a; + unsigned char *data_a, *row_a; + uint32_t *pixel_a; + unsigned int width_b, height_b, stride_b; + unsigned char *data_b, *row_b; + uint32_t *pixel_b; + unsigned int x, y, pixels_failed; + bool identical = true; + + width_a = cairo_image_surface_get_width (args->surface_a); + height_a = cairo_image_surface_get_height (args->surface_a); + stride_a = cairo_image_surface_get_stride (args->surface_a); + data_a = cairo_image_surface_get_data (args->surface_a); + + width_b = cairo_image_surface_get_width (args->surface_b); + height_b = cairo_image_surface_get_height (args->surface_b); + stride_b = cairo_image_surface_get_stride (args->surface_b); + data_b = cairo_image_surface_get_data (args->surface_b); + + if ((width_a != width_b) || (height_a != height_b)) { + printf ("FAIL: Image dimensions do not match\n"); + return false; + } + + identical = true; + + for (y = 0; y < height_a; y++) { + row_a = data_a + y * stride_a; + row_b = data_b + y * stride_b; + pixel_a = (uint32_t *) row_a; + pixel_b = (uint32_t *) row_b; + for (x = 0; x < width_a; x++) { + if (*pixel_a != *pixel_b) { + identical = false; + } + pixel_a++; + pixel_b++; + } + } + if (identical) { + printf ("PASS: Images are binary identical\n"); + return true; + } + + pixels_failed = pdiff_compare (args->surface_a, args->surface_b, + args->Gamma, args->Luminance, + args->FieldOfView); + + if (pixels_failed < args->ThresholdPixels) { + printf ("PASS: Images are perceptually indistinguishable\n"); + return true; + } + + printf("FAIL: Images are visibly different\n" + "%d pixels are different\n", pixels_failed); + + return false; +} + +int main(int argc, char **argv) +{ + args_t args; + + args_init (&args); + + if (!args_parse (&args, argc, argv)) { + return -1; + } else { + if (args.Verbose) + args_print (&args); + } + return ! Yee_Compare(&args); +} diff --git a/test/pixman-downscale.c b/test/pixman-downscale.c new file mode 100644 index 000000000..6b653d223 --- /dev/null +++ b/test/pixman-downscale.c @@ -0,0 +1,203 @@ +/* + * Copyright © 2013 Samsung Electronics + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Bryce Harrington + */ + +/* This test exercises scaling a png image to smaller pixel dimensions + * + * Currently, this exercises several of pixman's scaling filters. + */ + +#include "cairo-test.h" + +#include +#include + +#include + +static const char png_filename[] = "quad-color.png"; + +/* Draw an image scaled down, with antialiasing disabled */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height, cairo_filter_t filter) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image; + double x_scale, y_scale, scale; + + cairo_set_source_rgb (cr, 1, 1, 1); + image = cairo_test_create_surface_from_png (ctx, png_filename); + x_scale = width * 1.0 / cairo_image_surface_get_width (image); + y_scale = height * 1.0 / cairo_image_surface_get_height (image); + scale = x_scale < y_scale ? x_scale : y_scale; + + cairo_save (cr); + cairo_scale (cr, scale, scale); + cairo_set_source_surface (cr, image, 0, 0); + cairo_pattern_set_filter (cairo_get_source (cr), filter); + cairo_paint (cr); + cairo_restore (cr); + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_fast (cairo_t *cr, int width, int height) +{ + return draw (cr, width, height, CAIRO_FILTER_FAST); +} + +static cairo_test_status_t +draw_good (cairo_t *cr, int width, int height) +{ + return draw (cr, width, height, CAIRO_FILTER_GOOD); +} + +static cairo_test_status_t +draw_best (cairo_t *cr, int width, int height) +{ + return draw (cr, width, height, CAIRO_FILTER_BEST); +} + +static cairo_test_status_t +draw_nearest (cairo_t *cr, int width, int height) +{ + return draw (cr, width, height, CAIRO_FILTER_NEAREST); +} + +static cairo_test_status_t +draw_bilinear (cairo_t *cr, int width, int height) +{ + return draw (cr, width, height, CAIRO_FILTER_BILINEAR); +} + +CAIRO_TEST (pixman_downscale_fast_96, + "Tests scaling to equivalent size using the fast filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 96, 96, + NULL, draw_fast) + +CAIRO_TEST (pixman_downscale_fast_95, + "Tests downscaling by a single pixel using the fast filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 95, 95, + NULL, draw_fast) + +CAIRO_TEST (pixman_downscale_fast_24, + "Tests downscaling by an even multiple using the fast filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 24, 24, + NULL, draw_fast) + + +CAIRO_TEST (pixman_downscale_good_96, + "Tests scaling to equivalent size using the good filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 96, 96, + NULL, draw_good) + +CAIRO_TEST (pixman_downscale_good_95, + "Tests downscaling by a single pixel using the good filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 95, 95, + NULL, draw_good) + +CAIRO_TEST (pixman_downscale_good_24, + "Tests downscaling by an even multiple using the good filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 24, 24, + NULL, draw_good) + + +CAIRO_TEST (pixman_downscale_best_96, + "Tests scaling to equivalent size using the best filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 96, 96, + NULL, draw_best) + +CAIRO_TEST (pixman_downscale_best_95, + "Tests downscaling by a single pixel using the best filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 95, 95, + NULL, draw_best) + +CAIRO_TEST (pixman_downscale_best_24, + "Tests downscaling by an even multiple using the best filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 24, 24, + NULL, draw_best) + + +CAIRO_TEST (pixman_downscale_nearest_96, + "Tests scaling to equivalent size using the nearest filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 96, 96, + NULL, draw_nearest) + +CAIRO_TEST (pixman_downscale_nearest_95, + "Tests downscaling by a single pixel using the nearest filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 95, 95, + NULL, draw_nearest) + +CAIRO_TEST (pixman_downscale_nearest_24, + "Tests downscaling by an even multiple using the nearest filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 24, 24, + NULL, draw_nearest) + + +CAIRO_TEST (pixman_downscale_bilinear_96, + "Tests scaling to equivalent size using the bilinear filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 96, 96, + NULL, draw_bilinear) + +CAIRO_TEST (pixman_downscale_bilinear_95, + "Tests downscaling by a single pixel using the bilinear filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 95, 95, + NULL, draw_bilinear) + +CAIRO_TEST (pixman_downscale_bilinear_24, + "Tests downscaling by an even multiple using the bilinear filter", + "image, transform, raster, downscale", /* keywords */ + NULL, /* requirements */ + 24, 24, + NULL, draw_bilinear) diff --git a/test/pixman-rotate.c b/test/pixman-rotate.c new file mode 100644 index 000000000..e0d0fc885 --- /dev/null +++ b/test/pixman-rotate.c @@ -0,0 +1,92 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" + +#include +#include +#include +#include + +#include + +#define WIDTH 32 +#define HEIGHT WIDTH + +#define IMAGE_WIDTH (3 * WIDTH) +#define IMAGE_HEIGHT IMAGE_WIDTH + +/* Draw the word cairo at NUM_TEXT different angles */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *stamp; + cairo_t *cr2; + + /* Draw a translucent rectangle for reference where the rotated + * image should be. */ + cairo_new_path (cr); + cairo_rectangle (cr, WIDTH, HEIGHT, WIDTH, HEIGHT); + cairo_set_source_rgba (cr, 1, 1, 0, 0.3); + cairo_fill (cr); + +#if 1 /* Set to 0 to generate reference image */ + cairo_translate (cr, 2 * WIDTH, 2 * HEIGHT); + cairo_rotate (cr, M_PI); +#else + cairo_translate (cr, WIDTH, HEIGHT); +#endif + + stamp = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + WIDTH, HEIGHT); + cr2 = cairo_create (stamp); + cairo_surface_destroy (stamp); + { + cairo_new_path (cr2); + cairo_rectangle (cr2, WIDTH / 4, HEIGHT / 4, WIDTH / 2, HEIGHT / 2); + cairo_set_source_rgba (cr2, 1, 0, 0, 0.8); + cairo_fill (cr2); + + cairo_rectangle (cr2, 0, 0, WIDTH, HEIGHT); + cairo_set_line_width (cr2, 2); + cairo_set_source_rgb (cr2, 0, 0, 0); + cairo_stroke (cr2); + } + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (pixman_rotate, + "Exposes pixman off-by-one error when rotating", + "image, transform", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/png-flatten.c b/test/png-flatten.c new file mode 100644 index 000000000..2ce804ea6 --- /dev/null +++ b/test/png-flatten.c @@ -0,0 +1,77 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +#include + +#include + +int +main (int argc, char *argv[]) +{ + cairo_t *cr; + cairo_surface_t *argb, *rgb24; + cairo_status_t status; + const char *input, *output; + + if (argc != 3) { + fprintf (stderr, "usage: %s input.png output.png", argv[0]); + fprintf (stderr, "Loads a PNG image (potentially with alpha) and writes out a flattened (no alpha)\nPNG image by first blending over white.\n"); + return 1; + } + + input = argv[1]; + output = argv[2]; + + argb = cairo_image_surface_create_from_png (input); + status = cairo_surface_status (argb); + if (status) { + fprintf (stderr, "%s: Error: Failed to load %s: %s\n", + argv[0], input, cairo_status_to_string (status)); + return 1; + } + + rgb24 = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + cairo_image_surface_get_width (argb), + cairo_image_surface_get_height (argb)); + + cr = cairo_create (rgb24); + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_surface (cr, argb, 0, 0); + cairo_paint (cr); + + cairo_destroy (cr); + + status = cairo_surface_write_to_png (rgb24, output); + if (status) { + fprintf (stderr, "%s: Error: Failed to write %s: %s\n", + argv[0], output, cairo_status_to_string (status)); + return 1; + } + + return 0; +} diff --git a/test/png.c b/test/png.c new file mode 100644 index 000000000..c01fbd7bd --- /dev/null +++ b/test/png.c @@ -0,0 +1,172 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include + +/* Test the idempotency of write_png->read_png */ + +#define RGB_MASK 0x00ffffff +#define BASENAME "png.out" + +static cairo_bool_t +image_surface_equals (cairo_surface_t *A, cairo_surface_t *B) +{ + if (cairo_image_surface_get_format (A) != + cairo_image_surface_get_format (B)) + return 0; + + if (cairo_image_surface_get_width (A) != + cairo_image_surface_get_width (B)) + return 0; + + if (cairo_image_surface_get_height (A) != + cairo_image_surface_get_height (B)) + return 0; + + return 1; +} + +static const char * +format_to_string (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_A1: return "a1"; + case CAIRO_FORMAT_A8: return "a8"; + case CAIRO_FORMAT_RGB16_565: return "rgb16"; + case CAIRO_FORMAT_RGB24: return "rgb24"; + case CAIRO_FORMAT_RGB30: return "rgb30"; + case CAIRO_FORMAT_ARGB32: return "argb32"; + case CAIRO_FORMAT_INVALID: + default: return "???"; + } +} + +static void +print_surface (const cairo_test_context_t *ctx, cairo_surface_t *surface) +{ + cairo_test_log (ctx, + "%s (%dx%d)\n", + format_to_string (cairo_image_surface_get_format (surface)), + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface0, *surface1; + cairo_status_t status; + uint32_t argb32 = 0xdeadbede; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + xasprintf (&filename, "%s/%s.png", path, BASENAME); + surface0 = cairo_image_surface_create_for_data ((unsigned char *) &argb32, + CAIRO_FORMAT_ARGB32, + 1, 1, 4); + status = cairo_surface_write_to_png (surface0, filename); + if (status) { + cairo_test_log (ctx, "Error writing '%s': %s\n", + filename, cairo_status_to_string (status)); + + cairo_surface_destroy (surface0); + free (filename); + return cairo_test_status_from_status (ctx, status); + } + surface1 = cairo_image_surface_create_from_png (filename); + status = cairo_surface_status (surface1); + if (status) { + cairo_test_log (ctx, "Error reading '%s': %s\n", + filename, cairo_status_to_string (status)); + + cairo_surface_destroy (surface1); + cairo_surface_destroy (surface0); + free (filename); + return cairo_test_status_from_status (ctx, status); + } + + if (! image_surface_equals (surface0, surface1)) { + cairo_test_log (ctx, "Error surface mismatch.\n"); + cairo_test_log (ctx, "to png: "); print_surface (ctx, surface0); + cairo_test_log (ctx, "from png: "); print_surface (ctx, surface1); + + cairo_surface_destroy (surface0); + cairo_surface_destroy (surface1); + free (filename); + return CAIRO_TEST_FAILURE; + } + assert (*(uint32_t *) cairo_image_surface_get_data (surface1) == argb32); + + cairo_surface_destroy (surface0); + cairo_surface_destroy (surface1); + + surface0 = cairo_image_surface_create_for_data ((unsigned char *) &argb32, + CAIRO_FORMAT_RGB24, + 1, 1, 4); + status = cairo_surface_write_to_png (surface0, filename); + if (status) { + cairo_test_log (ctx, "Error writing '%s': %s\n", + filename, cairo_status_to_string (status)); + cairo_surface_destroy (surface0); + return cairo_test_status_from_status (ctx, status); + } + surface1 = cairo_image_surface_create_from_png (filename); + status = cairo_surface_status (surface1); + free (filename); + if (status) { + cairo_test_log (ctx, "Error reading '%s': %s\n", + filename, cairo_status_to_string (status)); + + cairo_surface_destroy (surface1); + cairo_surface_destroy (surface0); + return cairo_test_status_from_status (ctx, status); + } + + if (! image_surface_equals (surface0, surface1)) { + cairo_test_log (ctx, "Error surface mismatch.\n"); + cairo_test_log (ctx, "to png: "); print_surface (ctx, surface0); + cairo_test_log (ctx, "from png: "); print_surface (ctx, surface1); + + cairo_surface_destroy (surface0); + cairo_surface_destroy (surface1); + return CAIRO_TEST_FAILURE; + } + assert ((*(uint32_t *) cairo_image_surface_get_data (surface1) & RGB_MASK) + == (argb32 & RGB_MASK)); + + cairo_surface_destroy (surface0); + cairo_surface_destroy (surface1); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (png, + "Check that the png export/import is idempotent.", + "png, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/png.png b/test/png.png new file mode 100644 index 000000000..56c428e12 Binary files /dev/null and b/test/png.png differ diff --git a/test/ps-eps.c b/test/ps-eps.c new file mode 100644 index 000000000..de1248d81 --- /dev/null +++ b/test/ps-eps.c @@ -0,0 +1,354 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2009 Adrian Johnson + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Adrian Johnson + * Chris Wilson + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif + +#include "cairo-test.h" +#include "buffer-diff.h" + +/* Test EPS output. + */ + +#define WIDTH 595 +#define HEIGHT 842 + +/* Reference Bounding Box */ +#define LLX 95 +#define LLY 687 +#define URX 155 +#define URY 747 + +static void +_xunlink (const cairo_test_context_t *ctx, const char *pathname) +{ + if (unlink (pathname) < 0 && errno != ENOENT) { + cairo_test_log (ctx, "Error: Cannot remove %s: %s\n", + pathname, strerror (errno)); + exit (1); + } +} + +static cairo_bool_t +check_result (cairo_test_context_t *ctx, + const cairo_boilerplate_target_t *target, + const char *test_name, + const char *base_name, + cairo_surface_t *surface) +{ + const char *format; + char *ref_name; + char *png_name; + char *diff_name; + cairo_surface_t *test_image, *ref_image, *diff_image; + buffer_diff_result_t result; + cairo_status_t status; + cairo_bool_t ret; + + /* XXX log target, OUTPUT, REFERENCE, DIFFERENCE for index.html */ + + if (target->finish_surface != NULL) { + status = target->finish_surface (surface); + if (status) { + cairo_test_log (ctx, "Error: Failed to finish surface: %s\n", + cairo_status_to_string (status)); + cairo_surface_destroy (surface); + return FALSE; + } + } + + xasprintf (&png_name, "%s.out.png", base_name); + xasprintf (&diff_name, "%s.diff.png", base_name); + + test_image = target->get_image_surface (surface, 0, WIDTH, HEIGHT); + if (cairo_surface_status (test_image)) { + cairo_test_log (ctx, "Error: Failed to extract page: %s\n", + cairo_status_to_string (cairo_surface_status (test_image))); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + return FALSE; + } + + _xunlink (ctx, png_name); + status = cairo_surface_write_to_png (test_image, png_name); + if (status) { + cairo_test_log (ctx, "Error: Failed to write output image: %s\n", + cairo_status_to_string (status)); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + return FALSE; + } + + format = cairo_boilerplate_content_name (target->content); + ref_name = cairo_test_reference_filename (ctx, + base_name, + test_name, + target->name, + target->basename, + format, + CAIRO_TEST_REF_SUFFIX, + CAIRO_TEST_PNG_EXTENSION); + if (ref_name == NULL) { + cairo_test_log (ctx, "Error: Cannot find reference image for %s\n", + base_name); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + return FALSE; + } + + ref_image = cairo_test_get_reference_image (ctx, ref_name, + target->content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED); + if (cairo_surface_status (ref_image)) { + cairo_test_log (ctx, "Error: Cannot open reference image for %s: %s\n", + ref_name, + cairo_status_to_string (cairo_surface_status (ref_image))); + cairo_surface_destroy (ref_image); + cairo_surface_destroy (test_image); + free (png_name); + free (diff_name); + free (ref_name); + return FALSE; + } + + diff_image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + WIDTH, HEIGHT); + + ret = TRUE; + status = image_diff (ctx, + test_image, ref_image, diff_image, + &result); + _xunlink (ctx, diff_name); + if (status) { + cairo_test_log (ctx, "Error: Failed to compare images: %s\n", + cairo_status_to_string (status)); + ret = FALSE; + } else if (image_diff_is_failure (&result, target->error_tolerance)) + { + ret = FALSE; + + status = cairo_surface_write_to_png (diff_image, diff_name); + if (status) { + cairo_test_log (ctx, "Error: Failed to write differences image: %s\n", + cairo_status_to_string (status)); + } + } + + cairo_surface_destroy (test_image); + cairo_surface_destroy (diff_image); + free (png_name); + free (diff_name); + free (ref_name); + + return ret; +} + + +#define DOCUMENT_BBOX "%%BoundingBox:" +#define PAGE_BBOX "%%PageBoundingBox:" + +static cairo_bool_t +check_bbox (cairo_test_context_t *ctx, + const char *base_name) +{ + char *filename; + FILE *f; + char buf[256]; + cairo_bool_t bbox_pass, page_bbox_pass; + int llx, lly, urx, ury; + int ret; + + xasprintf (&filename, "%s.out.ps", base_name); + f = fopen (filename, "r"); + if (!f) { + cairo_test_log (ctx, "Error: Cannot open EPS output: %s\n", + base_name); + free (filename); + return FALSE; + } + + bbox_pass = FALSE; + page_bbox_pass = FALSE; + while (!feof(f)) { + if (fgets (buf, sizeof(buf), f) == (char *)EOF) { + cairo_test_log (ctx, "Error: Unexpected EOF in %s\n", + filename); + break; + } + + if (strncmp (buf, DOCUMENT_BBOX, strlen (DOCUMENT_BBOX)) == 0) { + ret = sscanf (buf+strlen (DOCUMENT_BBOX), "%d %d %d %d", &llx, &lly, &urx, &ury); + if (ret == 4 && llx == LLX && lly == LLY && urx == URX && ury == URY) + bbox_pass = TRUE; + } + + if (strncmp (buf, PAGE_BBOX, strlen (PAGE_BBOX)) == 0) { + ret = sscanf (buf+strlen (PAGE_BBOX), "%d %d %d %d", &llx, &lly, &urx, &ury); + if (ret == 4 && llx == LLX && lly == LLY && urx == URX && ury == URY) + page_bbox_pass = TRUE; + } + } + fclose (f); + + if (!bbox_pass || !page_bbox_pass) { + cairo_test_log (ctx, "Error: EPS Bounding Box does not match reference Bounding Box\n"); + return FALSE; + } + + free (filename); + + return TRUE; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_test_status_t ret = CAIRO_TEST_UNTESTED; + unsigned int i; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + for (i = 0; i < ctx->num_targets; i++) { + const cairo_boilerplate_target_t *target = ctx->targets_to_test[i]; + cairo_surface_t *surface = NULL; + char *base_name; + void *closure; + const char *format; + cairo_status_t status; + cairo_bool_t pass; + char *test_name; + + if (! cairo_test_is_target_enabled (ctx, target->name)) + continue; + + format = cairo_boilerplate_content_name (target->content); + xasprintf (&test_name, "ps-eps"); + xasprintf (&base_name, "%s/ps-eps.%s.%s", + path, target->name, format); + + surface = (target->create_surface) (base_name, + target->content, + WIDTH, HEIGHT, + WIDTH, HEIGHT, + CAIRO_BOILERPLATE_MODE_TEST, + &closure); + + if (surface == NULL) { + free (base_name); + free (test_name); + continue; + } + + cairo_ps_surface_set_eps (surface, TRUE); + if (!cairo_ps_surface_get_eps (surface)) { + cairo_surface_destroy (surface); + if (target->cleanup) + target->cleanup (closure); + + free (base_name); + free (test_name); + continue; + } + + cairo_test_log (ctx, + "Testing ps-eps with %s target\n", + target->name); + printf ("%s:\t", base_name); + fflush (stdout); + + cairo_surface_set_device_offset (surface, 25, 25); + cr = cairo_create (surface); + + cairo_new_sub_path (cr); + cairo_arc (cr, 100, 100, 25, 0, 2*M_PI); + cairo_set_line_width (cr, 10); + cairo_stroke (cr); + + cairo_show_page (cr); + + status = cairo_status (cr); + cairo_destroy (cr); + + if (status) { + cairo_test_log (ctx, "Error: Failed to create target surface: %s\n", + cairo_status_to_string (status)); + pass = FALSE; + } else { + pass = TRUE; + /* extract the image and compare it to our reference */ + if (! check_result (ctx, target, test_name, base_name, surface)) + pass = FALSE; + + /* check the bounding box of the EPS file and compare it to our reference */ + if (! check_bbox (ctx, base_name)) + pass = FALSE; + } + cairo_surface_destroy (surface); + if (target->cleanup) + target->cleanup (closure); + + free (base_name); + free (test_name); + + if (pass) { + printf ("PASS\n"); + ret = CAIRO_TEST_SUCCESS; + } else { + printf ("FAIL\n"); + ret = CAIRO_TEST_FAILURE; + } + fflush (stdout); + } + + return ret; +} + +CAIRO_TEST (ps_eps, + "Check EPS output from PS surface", + "ps, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/ps-features.c b/test/ps-features.c new file mode 100644 index 000000000..d1abf91fe --- /dev/null +++ b/test/ps-features.c @@ -0,0 +1,166 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include +#include +#include + +/* This test exists to test the various features of cairo-ps.h. + * + * Currently, this test exercises the following function calls: + * + * cairo_ps_surface_set_size + * cairo_ps_surface_dsc_comment + * cairo_ps_surface_dsc_begin_setup + * cairo_ps_surface_dsc_begin_page_setup + */ + +#define INCHES_TO_POINTS(in) ((in) * 72.0) +#define MM_TO_POINTS(mm) ((mm) / 25.4 * 72.0) +#define TEXT_SIZE 12 +#define BASENAME "ps-features.out" + +static struct { + const char *page_size; + const char *page_size_alias; + const char *orientation; + double width_in_points; + double height_in_points; +} pages[] = { + {"na_letter_8.5x11in", "letter", "portrait", + INCHES_TO_POINTS(8.5), INCHES_TO_POINTS(11)}, + {"na_letter_8.5x11in", "letter", "landscape", + INCHES_TO_POINTS(11), INCHES_TO_POINTS(8.5)}, + {"iso_a4_210x297mm", "a4", "portrait", + MM_TO_POINTS(210), MM_TO_POINTS(297)}, + {"iso_a4_210x297mm", "a4", "landscape", + MM_TO_POINTS(297), MM_TO_POINTS(210)}, + {"iso_a5_148x210mm", "a5", "portrait", + MM_TO_POINTS(148), MM_TO_POINTS(210)}, + {"iso_a5_148x210mm", "a5", "landscape", + MM_TO_POINTS(210), MM_TO_POINTS(148)}, + {"iso_a6_105x148mm", "a6", "portrait", + MM_TO_POINTS(105), MM_TO_POINTS(148)}, + {"iso_a6_105x148mm", "a6", "landscape", + MM_TO_POINTS(148), MM_TO_POINTS(105)}, + {"iso_a7_74x105mm", "a7", "portrait", + MM_TO_POINTS(74), MM_TO_POINTS(105)}, + {"iso_a7_74x105mm", "a7", "landscape", + MM_TO_POINTS(105), MM_TO_POINTS(74)}, + {"iso_a8_52x74mm", "a8", "portrait", + MM_TO_POINTS(52), MM_TO_POINTS(74)}, + {"iso_a8_52x74mm", "a8", "landscape", + MM_TO_POINTS(74), MM_TO_POINTS(52)}, + {"iso_a9_37x52mm", "a9", "portrait", + MM_TO_POINTS(37), MM_TO_POINTS(52)}, + {"iso_a9_37x52mm", "a9", "landscape", + MM_TO_POINTS(52), MM_TO_POINTS(37)}, + {"iso_a10_26x37mm", "a10", "portrait", + MM_TO_POINTS(26), MM_TO_POINTS(37)}, + {"iso_a10_26x37mm", "a10", "landscape", + MM_TO_POINTS(37), MM_TO_POINTS(26)} +}; + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_t *cr; + cairo_status_t status; + size_t i; + char dsc[255]; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + if (! (cairo_test_is_target_enabled (ctx, "ps2") || + cairo_test_is_target_enabled (ctx, "ps3"))) + { + return CAIRO_TEST_UNTESTED; + } + + xasprintf (&filename, "%s/%s.ps", path, BASENAME); + /* We demonstrate that the initial size doesn't matter (we're + * passing 0,0), if we use cairo_ps_surface_set_size on the first + * page. */ + surface = cairo_ps_surface_create (filename, 0, 0); + + cairo_ps_surface_dsc_comment (surface, "%%Title: ps-features"); + cairo_ps_surface_dsc_comment (surface, "%%Copyright: Copyright (C) 2006 Red Hat, Inc."); + + cairo_ps_surface_dsc_begin_setup (surface); + cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize letter"); + cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor White"); + + cr = cairo_create (surface); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + for (i = 0; i < ARRAY_LENGTH (pages); i++) { + cairo_ps_surface_set_size (surface, + pages[i].width_in_points, + pages[i].height_in_points); + cairo_ps_surface_dsc_begin_page_setup (surface); + snprintf (dsc, 255, "%%IncludeFeature: *PageSize %s", pages[i].page_size_alias); + cairo_ps_surface_dsc_comment (surface, dsc); + if (i % 2) { + snprintf (dsc, 255, "%%IncludeFeature: *MediaType Glossy"); + cairo_ps_surface_dsc_comment (surface, dsc); + } + + cairo_move_to (cr, TEXT_SIZE, TEXT_SIZE); + cairo_show_text (cr, pages[i].page_size); + cairo_show_text (cr, " - "); + cairo_show_text (cr, pages[i].orientation); + cairo_show_page (cr); + } + + status = cairo_status (cr); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + if (status) { + cairo_test_log (ctx, "Failed to create ps surface for file %s: %s\n", + filename, cairo_status_to_string (status)); + free (filename); + return CAIRO_TEST_FAILURE; + } + + printf ("ps-features: Please check %s to ensure it looks/prints correctly.\n", filename); + free (filename); + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ps_features, + "Check PS specific API", + "ps, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/ps-surface-source.c b/test/ps-surface-source.c new file mode 100644 index 000000000..16c677674 --- /dev/null +++ b/test/ps-surface-source.c @@ -0,0 +1,53 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#include + +#include "surface-source.c" + +#define BASENAME "ps-surface-source.out" + +static cairo_surface_t * +create_source_surface (int size) +{ + cairo_surface_t *surface; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + xasprintf (&filename, "%s/%s.ps", path, BASENAME); + surface = cairo_ps_surface_create (filename, size, size); + cairo_surface_set_fallback_resolution (surface, 72., 72.); + free (filename); + + return surface; +} + +CAIRO_TEST (ps_surface_source, + "Test using a PS surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/ps2png.c b/test/ps2png.c new file mode 100644 index 000000000..cf98aed3b --- /dev/null +++ b/test/ps2png.c @@ -0,0 +1,113 @@ +/* + * Copyright © 2008 Carlos Garcia Campos + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carlos Garcia Campos + */ + +#include +#include +#include +#include + +#define FAIL(msg) \ + do { fprintf (stderr, "FAIL: %s\n", msg); exit (-1); } while (0) + +static const char * +_spectre_render_page (const char *filename, + const char *page_label, + cairo_surface_t **surface_out) +{ + static const cairo_user_data_key_t key; + + SpectreDocument *document; + SpectreStatus status; + int width, height, stride; + unsigned char *pixels; + cairo_surface_t *surface; + + document = spectre_document_new (); + spectre_document_load (document, filename); + status = spectre_document_status (document); + if (status) { + spectre_document_free (document); + return spectre_status_to_string (status); + } + + if (page_label) { + SpectrePage *page; + SpectreRenderContext *rc; + + page = spectre_document_get_page_by_label (document, page_label); + spectre_document_free (document); + if (page == NULL) + return "page not found"; + + spectre_page_get_size (page, &width, &height); + rc = spectre_render_context_new (); + spectre_render_context_set_page_size (rc, width, height); + spectre_page_render (page, rc, &pixels, &stride); + spectre_render_context_free (rc); + status = spectre_page_status (page); + spectre_page_free (page); + if (status) { + free (pixels); + return spectre_status_to_string (status); + } + } else { + spectre_document_get_page_size (document, &width, &height); + spectre_document_render (document, &pixels, &stride); + spectre_document_free (document); + } + + surface = cairo_image_surface_create_for_data (pixels, + CAIRO_FORMAT_RGB24, + width, height, + stride); + cairo_surface_set_user_data (surface, &key, + pixels, (cairo_destroy_func_t) free); + *surface_out = surface; + return NULL; +} + +int main +(int argc, char *argv[]) +{ + const char *err; + cairo_surface_t *surface = NULL; /* silence compiler warning */ + cairo_status_t status; + + if (argc < 3 || argc > 4) + FAIL ("usage: ps2png input_file.ps output_file.png [page]"); + + err = _spectre_render_page (argv[1], argv[3], &surface); + if (err != NULL) + FAIL (err); + + status = cairo_surface_write_to_png (surface, argv[2]); + cairo_surface_destroy (surface); + + if (status != CAIRO_STATUS_SUCCESS) + FAIL (cairo_status_to_string (status)); + + return 0; +} diff --git a/test/pthread-same-source.c b/test/pthread-same-source.c new file mode 100644 index 000000000..2b26d187d --- /dev/null +++ b/test/pthread-same-source.c @@ -0,0 +1,192 @@ +/* + * Copyright 2009 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#define GENERATE_REFERENCE 0 + +#include "cairo-test.h" +#if !GENERATE_REFERENCE +#include +#endif + +#define N_THREADS 8 + +#define WIDTH 64 +#define HEIGHT 8 + +typedef struct { + cairo_surface_t *target; + cairo_surface_t *source; + int id; +} thread_data_t; + +static void * +draw_thread (void *arg) +{ + thread_data_t *thread_data = arg; + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_matrix_t pattern_matrix = { 2, 0, 0, 2, 0, 0 }; + cairo_t *cr; + int x, y; + + cr = cairo_create (thread_data->target); + cairo_surface_destroy (thread_data->target); + + pattern = cairo_pattern_create_for_surface (thread_data->source); + cairo_surface_destroy (thread_data->source); + cairo_pattern_set_extend (pattern, thread_data->id % 4); + cairo_pattern_set_filter (pattern, thread_data->id >= 4 ? CAIRO_FILTER_BILINEAR : CAIRO_FILTER_NEAREST); + cairo_pattern_set_matrix (pattern, &pattern_matrix); + + for (y = 0; y < HEIGHT; y++) { + for (x = 0; x < WIDTH; x++) { + cairo_save (cr); + cairo_translate (cr, 4 * x + 1, 4 * y + 1); + cairo_rectangle (cr, 0, 0, 2, 2); + cairo_set_source (cr, pattern); + cairo_fill (cr); + cairo_restore (cr); + } + } + cairo_pattern_destroy (pattern); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_surface_t * +create_source (cairo_surface_t *similar) +{ + cairo_surface_t *source; + cairo_t *cr; + double colors[4][3] = { + { 0.75, 0, 0 }, + { 0, 0.75, 0 }, + { 0, 0, 0.75 }, + { 0.75, 0.75, 0 } + }; + int i; + + source = cairo_surface_create_similar (similar, + CAIRO_CONTENT_COLOR_ALPHA, + 2, 2); + + cr = cairo_create (source); + cairo_surface_destroy (source); + + for (i = 0; i < 4; i++) { + cairo_set_source_rgb (cr, colors[i][0], colors[i][1], colors[i][2]); + cairo_rectangle (cr, i % 2, i / 2, 1, 1); + cairo_fill (cr); + } + + source = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return source; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ +#if !GENERATE_REFERENCE + pthread_t threads[N_THREADS]; +#endif + thread_data_t thread_data[N_THREADS]; + cairo_test_status_t test_status = CAIRO_TEST_SUCCESS; + cairo_surface_t *source; + cairo_status_t status; + int i; + + source = create_source (cairo_get_target (cr)); + status = cairo_surface_status (source); + if (status) { + cairo_surface_destroy (source); + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + for (i = 0; i < N_THREADS; i++) { + thread_data[i].target = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + 4 * WIDTH, 4 * HEIGHT); + thread_data[i].source = cairo_surface_reference (source); + thread_data[i].id = i; +#if !GENERATE_REFERENCE + if (pthread_create (&threads[i], NULL, draw_thread, &thread_data[i]) != 0) { + threads[i] = pthread_self (); /* to indicate error */ + cairo_surface_destroy (thread_data[i].target); + cairo_surface_destroy (thread_data[i].source); + test_status = CAIRO_TEST_FAILURE; + break; + } +#else + { + cairo_surface_t *surface = draw_thread(&thread_data[i]); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_paint (cr); + + cairo_translate (cr, 0, 4 * HEIGHT); + } +#endif + } + + cairo_surface_destroy (source); + +#if !GENERATE_REFERENCE + for (i = 0; i < N_THREADS; i++) { + void *surface; + + if (pthread_equal (threads[i], pthread_self ())) + break; + + if (pthread_join (threads[i], &surface) == 0) { + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_paint (cr); + + cairo_translate (cr, 0, 4 * HEIGHT); + } else { + test_status = CAIRO_TEST_FAILURE; + } + } +#endif + + return test_status; +} + +CAIRO_TEST (pthread_same_source, + "Use the same source for drawing in different threads", + "threads", /* keywords */ + NULL, /* requirements */ + 4 * WIDTH, 4 * HEIGHT * N_THREADS, + NULL, draw) diff --git a/test/pthread-show-text.c b/test/pthread-show-text.c new file mode 100644 index 000000000..0e070b7b7 --- /dev/null +++ b/test/pthread-show-text.c @@ -0,0 +1,142 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Test case for bug #4299: + + Assertion fails in "cairo-font.c" when using multithreads + https://bugs.freedesktop.org/show_bug.cgi?id=4299 +*/ + +#include "cairo-test.h" + +#include +#include +#include + +#define N_THREADS 8 +#define NUM_ITERATIONS 40 + +#define WIDTH 400 +#define HEIGHT 42 + +typedef struct { + cairo_surface_t *target; + int id; +} thread_data_t; + +static void * +draw_thread (void *arg) +{ + const char *text = "Hello world. "; + thread_data_t *thread_data = arg; + cairo_surface_t *surface; + cairo_font_extents_t extents; + cairo_t *cr; + int i; + + cr = cairo_create (thread_data->target); + cairo_surface_destroy (thread_data->target); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_select_font_face (cr, "serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, NUM_ITERATIONS); + cairo_font_extents (cr, &extents); + + cairo_move_to (cr, 1, HEIGHT - extents.descent - 1); + + for (i = 0; i < NUM_ITERATIONS; i++) { + char buf[2]; + + cairo_select_font_face (cr, "serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, i); + + buf[0] = text[i%strlen(text)]; + buf[1] = '\0'; + cairo_show_text (cr, buf); + } + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + pthread_t threads[N_THREADS]; + thread_data_t thread_data[N_THREADS]; + cairo_test_status_t test_status = CAIRO_TEST_SUCCESS; + int i; + + for (i = 0; i < N_THREADS; i++) { + thread_data[i].target = cairo_surface_create_similar (cairo_get_target (cr), + cairo_surface_get_content (cairo_get_target (cr)), + WIDTH, HEIGHT); + thread_data[i].id = i; + if (pthread_create (&threads[i], NULL, draw_thread, &thread_data[i]) != 0) { + threads[i] = pthread_self (); /* to indicate error */ + cairo_surface_destroy (thread_data[i].target); + test_status = CAIRO_TEST_FAILURE; + break; + } + } + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + for (i = 0; i < N_THREADS; i++) { + void *surface; + + if (pthread_equal (threads[i], pthread_self ())) + break; + + if (pthread_join (threads[i], &surface) == 0) { + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_paint (cr); + + cairo_translate (cr, 0, HEIGHT); + } else { + test_status = CAIRO_TEST_FAILURE; + } + } + + return test_status; +} + +CAIRO_TEST (pthread_show_text, + "Concurrent stress test of the cairo_show_text().", + "thread, text", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT * N_THREADS, + NULL, draw) diff --git a/test/pthread-similar.c b/test/pthread-similar.c new file mode 100644 index 000000000..a5f5e3bf4 --- /dev/null +++ b/test/pthread-similar.c @@ -0,0 +1,106 @@ +/* + * Copyright 2009 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" +#include + +#define N_THREADS 8 + +#define WIDTH 64 +#define HEIGHT 8 + +static void * +draw_thread (void *arg) +{ + cairo_surface_t *surface = arg; + cairo_t *cr; + int x, y; + + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + for (y = 0; y < HEIGHT; y++) { + for (x = 0; x < WIDTH; x++) { + cairo_rectangle (cr, x, y, 1, 1); + cairo_set_source_rgba (cr, 0, 0.75, 0.75, (double) x / WIDTH); + cairo_fill (cr); + } + } + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + pthread_t threads[N_THREADS]; + cairo_test_status_t test_status = CAIRO_TEST_SUCCESS; + int i; + + for (i = 0; i < N_THREADS; i++) { + cairo_surface_t *surface; + + surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR, + WIDTH, HEIGHT); + if (pthread_create (&threads[i], NULL, draw_thread, surface) != 0) { + threads[i] = pthread_self (); + test_status = cairo_test_status_from_status (cairo_test_get_context (cr), + cairo_surface_status (surface)); + cairo_surface_destroy (surface); + break; + } + } + + for (i = 0; i < N_THREADS; i++) { + void *surface; + + if (pthread_equal (threads[i], pthread_self ())) + break; + + if (pthread_join (threads[i], &surface) == 0) { + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_paint (cr); + + cairo_translate (cr, 0, HEIGHT); + } else { + test_status = CAIRO_TEST_FAILURE; + } + } + + return test_status; +} + +CAIRO_TEST (pthread_similar, + "Draw lots of 1x1 rectangles on similar surfaces in lots of threads", + "threads", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT * N_THREADS, + NULL, draw) diff --git a/test/push-group-color.c b/test/push-group-color.c new file mode 100644 index 000000000..1bc5bca9b --- /dev/null +++ b/test/push-group-color.c @@ -0,0 +1,141 @@ +/* + * Copyright © 2005 Mozilla Corporation + * Copyright © 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + * Chris Wilson + */ + +#include "cairo-test.h" + +#define UNIT_SIZE 100 +#define PAD 5 +#define INNER_PAD 10 + +#define WIDTH (UNIT_SIZE + PAD) + PAD +#define HEIGHT (UNIT_SIZE + PAD) + PAD + +static cairo_pattern_t * +argb32_source (void) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 16, 16); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, 8, 0, 8, 8); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, 0, 8, 8, 8); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, 8, 8, 8, 8); + cairo_fill (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *gradient, *image; + + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + cairo_translate (cr, PAD, PAD); + + /* clip to the unit size */ + cairo_rectangle (cr, 0, 0, + UNIT_SIZE, UNIT_SIZE); + cairo_clip (cr); + + cairo_rectangle (cr, 0, 0, + UNIT_SIZE, UNIT_SIZE); + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* start a group */ + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR); + + /* draw a gradient background */ + cairo_save (cr); + cairo_translate (cr, INNER_PAD, INNER_PAD); + cairo_new_path (cr); + cairo_rectangle (cr, 0, 0, + UNIT_SIZE - (INNER_PAD*2), UNIT_SIZE - (INNER_PAD*2)); + gradient = cairo_pattern_create_linear (UNIT_SIZE - (INNER_PAD*2), 0, + UNIT_SIZE - (INNER_PAD*2), UNIT_SIZE - (INNER_PAD*2)); + cairo_pattern_add_color_stop_rgba (gradient, 0.0, 0.3, 0.3, 0.3, 1.0); + cairo_pattern_add_color_stop_rgba (gradient, 1.0, 1.0, 1.0, 1.0, 1.0); + cairo_set_source (cr, gradient); + cairo_pattern_destroy (gradient); + cairo_fill (cr); + cairo_restore (cr); + + /* draw diamond */ + cairo_move_to (cr, UNIT_SIZE / 2, 0); + cairo_line_to (cr, UNIT_SIZE , UNIT_SIZE / 2); + cairo_line_to (cr, UNIT_SIZE / 2, UNIT_SIZE); + cairo_line_to (cr, 0 , UNIT_SIZE / 2); + cairo_close_path (cr); + cairo_set_source_rgba (cr, 0, 0, 1, 1); + cairo_fill (cr); + + /* draw circle */ + cairo_arc (cr, + UNIT_SIZE / 2, UNIT_SIZE / 2, + UNIT_SIZE / 3.5, + 0, M_PI * 2); + cairo_set_source_rgba (cr, 1, 0, 0, 1); + cairo_fill (cr); + + /* and put the image on top */ + cairo_translate (cr, UNIT_SIZE/2 - 8, UNIT_SIZE/2 - 8); + image = argb32_source (); + cairo_set_source (cr, image); + cairo_pattern_destroy (image); + cairo_paint (cr); + + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (push_group_color, + "Verify that cairo_push_group_with_content works.", + "group", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/push-group-path-offset.c b/test/push-group-path-offset.c new file mode 100644 index 000000000..6b73ca4fa --- /dev/null +++ b/test/push-group-path-offset.c @@ -0,0 +1,77 @@ +/* + * Copyright 2010 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +#define CLIP_OFFSET 15 +#define CLIP_SIZE 20 + +#define WIDTH 50 +#define HEIGHT 50 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Neutral gray background */ + cairo_set_source_rgb (cr, 0.51613, 0.55555, 0.51613); + cairo_paint (cr); + + /* the rest uses CAIRO_OPERATOR_SOURCE so we see better when something goes wrong */ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + /* add a rectangle */ + cairo_rectangle (cr, CLIP_OFFSET, CLIP_OFFSET, CLIP_SIZE, CLIP_SIZE); + + /* clip to the rectangle */ + cairo_clip_preserve (cr); + + /* push a group. We now have a device offset. */ + cairo_push_group (cr); + + /* push a group again. This is where the bug used to happen. */ + cairo_push_group (cr); + + /* draw something */ + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + + /* make sure the stuff we drew ends up on the output */ + cairo_pop_group_to_source (cr); + cairo_fill_preserve (cr); + + cairo_pop_group_to_source (cr); + cairo_fill_preserve (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (push_group_path_offset, + "Exercises a bug in Cairo 1.9 where existing paths applied the target's" + " device offset twice when cairo_push_group() was called.", + "group, path", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/push-group.c b/test/push-group.c new file mode 100644 index 000000000..8e6ce1924 --- /dev/null +++ b/test/push-group.c @@ -0,0 +1,113 @@ +/* + * Copyright © 2005 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +#define UNIT_SIZE 100 +#define PAD 5 +#define INNER_PAD 10 + +#define WIDTH (UNIT_SIZE + PAD) + PAD +#define HEIGHT (UNIT_SIZE + PAD) + PAD + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *gradient; + int i, j; + + gradient = cairo_pattern_create_linear (UNIT_SIZE - (INNER_PAD*2), 0, + UNIT_SIZE - (INNER_PAD*2), UNIT_SIZE - (INNER_PAD*2)); + cairo_pattern_add_color_stop_rgba (gradient, 0.0, 0.3, 0.3, 0.3, 1.0); + cairo_pattern_add_color_stop_rgba (gradient, 1.0, 1.0, 1.0, 1.0, 1.0); + + for (j = 0; j < 1; j++) { + for (i = 0; i < 1; i++) { + double x = (i * UNIT_SIZE) + (i + 1) * PAD; + double y = (j * UNIT_SIZE) + (j + 1) * PAD; + + cairo_save (cr); + + cairo_translate (cr, x, y); + + /* draw a gradient background */ + cairo_save (cr); + cairo_translate (cr, INNER_PAD, INNER_PAD); + cairo_new_path (cr); + cairo_rectangle (cr, 0, 0, + UNIT_SIZE - (INNER_PAD*2), UNIT_SIZE - (INNER_PAD*2)); + cairo_set_source (cr, gradient); + cairo_fill (cr); + cairo_restore (cr); + + /* clip to the unit size */ + cairo_rectangle (cr, 0, 0, + UNIT_SIZE, UNIT_SIZE); + cairo_clip (cr); + + cairo_rectangle (cr, 0, 0, + UNIT_SIZE, UNIT_SIZE); + cairo_set_source_rgba (cr, 0, 0, 0, 1); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* start a group */ + cairo_push_group (cr); + + /* draw diamond */ + cairo_move_to (cr, UNIT_SIZE / 2, 0); + cairo_line_to (cr, UNIT_SIZE , UNIT_SIZE / 2); + cairo_line_to (cr, UNIT_SIZE / 2, UNIT_SIZE); + cairo_line_to (cr, 0 , UNIT_SIZE / 2); + cairo_close_path (cr); + cairo_set_source_rgba (cr, 0, 0, 1, 1); + cairo_fill (cr); + + /* draw circle */ + cairo_arc (cr, + UNIT_SIZE / 2, UNIT_SIZE / 2, + UNIT_SIZE / 3.5, + 0, M_PI * 2); + cairo_set_source_rgba (cr, 1, 0, 0, 1); + cairo_fill (cr); + + cairo_pop_group_to_source (cr); + cairo_paint_with_alpha (cr, 0.5); + + cairo_restore (cr); + } + } + + cairo_pattern_destroy (gradient); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (push_group, + "Verify that cairo_push_group works.", + "group", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/quartz-surface-source.c b/test/quartz-surface-source.c new file mode 100644 index 000000000..b0c86d0f9 --- /dev/null +++ b/test/quartz-surface-source.c @@ -0,0 +1,42 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#include "cairo-quartz.h" + +#include "surface-source.c" + +static cairo_surface_t * +create_source_surface (int size) +{ + return cairo_quartz_surface_create (CAIRO_FORMAT_ARGB32, size, size); +} + +CAIRO_TEST (quartz_surface_source, + "Test using a Quartz surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/radial-gradient-extend.c b/test/radial-gradient-extend.c new file mode 100644 index 000000000..c32a2c37b --- /dev/null +++ b/test/radial-gradient-extend.c @@ -0,0 +1,92 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define NUM_EXTEND 4 +#define HEIGHT 16 +#define WIDTH 16 +#define PAD 3 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + unsigned int i, j; + + cairo_extend_t extend[NUM_EXTEND] = { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD + }; + + cairo_test_paint_checkered (cr); + + pattern = cairo_pattern_create_radial (WIDTH / 2, HEIGHT / 2, 0, WIDTH / 2, HEIGHT / 2, 2 * PAD); + + cairo_pattern_add_color_stop_rgb (pattern, 0, 0, 0, 1); + cairo_pattern_add_color_stop_rgb (pattern, 1, 0, 0, 1); + + cairo_translate (cr, PAD, PAD); + + for (i = 0; i < 2; i++) { + cairo_save (cr); + + for (j = 0; j < NUM_EXTEND; j++) { + cairo_pattern_set_extend (pattern, extend[j]); + + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + if (i & 1) { + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_mask (cr, pattern); + } else { + cairo_set_source (cr, pattern); + cairo_paint (cr); + } + + cairo_translate (cr, WIDTH+PAD, 0); + } + + cairo_restore (cr); + cairo_translate (cr, 0, HEIGHT+PAD); + } + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (radial_gradient_extend, + "Tests gradient to solid reduction of radial gradients", + "radial, pattern, extend", /* keywords */ + NULL, /* requirements */ + (WIDTH+PAD) * NUM_EXTEND + PAD, 2*(HEIGHT + PAD) + PAD, + NULL, draw) diff --git a/test/radial-gradient.c b/test/radial-gradient.c new file mode 100644 index 000000000..026876b1b --- /dev/null +++ b/test/radial-gradient.c @@ -0,0 +1,256 @@ +/* + * Copyright © 2005, 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define NUM_GRADIENTS 7 +#define NUM_EXTEND 4 +#define SIZE 120 +#define WIDTH (SIZE * NUM_GRADIENTS) +#define HEIGHT (SIZE * NUM_EXTEND) + +typedef void (*composite_t)(cairo_t *cr, cairo_pattern_t *pattern); +typedef void (*add_stops_t)(cairo_pattern_t *pattern); + +/* + * We want to test all the possible relative positions of the start + * and end circle: + * + * - The start circle can be smaller/equal/bigger than the end + * circle. A radial gradient can be classified in one of these + * three cases depending on the sign of dr. + * + * - The smaller circle can be completely inside/internally + * tangent/outside (at least in part) of the bigger circle. This + * classification is the same as the one which can be computed by + * examining the sign of a = (dx^2 + dy^2 - dr^2). + * + * - If the two circles have the same size, neither can be inside or + * internally tangent + * + * This test draws radial gradients whose circles always have the same + * centers (0, 0) and (1, 0), but with different radiuses. From left + * to right: + * + * - Small start circle completely inside the end circle + * 0.25 -> 1.75; dr = 1.5 > 0; a = 1 - 1.50^2 < 0 + * + * - Small start circle internally tangent to the end circle + * 0.50 -> 1.50; dr = 1.0 > 0; a = 1 - 1.00^2 = 0 + * + * - Small start circle outside of the end circle + * 0.50 -> 1.00; dr = 0.5 > 0; a = 1 - 0.50^2 > 0 + * + * - Start circle with the same size as the end circle + * 1.00 -> 1.00; dr = 0.0 = 0; a = 1 - 0.00^2 > 0 + * + * - Small end circle outside of the start circle + * 1.00 -> 0.50; dr = -0.5 > 0; a = 1 - 0.50^2 > 0 + * + * - Small end circle internally tangent to the start circle + * 1.50 -> 0.50; dr = -1.0 > 0; a = 1 - 1.00^2 = 0 + * + * - Small end circle completely inside the start circle + * 1.75 -> 0.25; dr = -1.5 > 0; a = 1 - 1.50^2 < 0 + * + */ + +static const double radiuses[NUM_GRADIENTS] = { + 0.25, + 0.50, + 0.50, + 1.00, + 1.00, + 1.50, + 1.75 +}; + +static cairo_pattern_t * +create_pattern (int index) +{ + double x0, x1, radius0, radius1, left, right, center; + + x0 = 0; + x1 = 1; + radius0 = radiuses[index]; + radius1 = radiuses[NUM_GRADIENTS - index - 1]; + + /* center the gradient */ + left = MIN (x0 - radius0, x1 - radius1); + right = MAX (x0 + radius0, x1 + radius1); + center = (left + right) * 0.5; + x0 -= center; + x1 -= center; + + /* scale to make it fit within a 1x1 rect centered in (0,0) */ + x0 *= 0.25; + x1 *= 0.25; + radius0 *= 0.25; + radius1 *= 0.25; + + return cairo_pattern_create_radial (x0, 0, radius0, x1, 0, radius1); +} + +static void +pattern_add_stops (cairo_pattern_t *pattern) +{ + cairo_pattern_add_color_stop_rgba (pattern, 0.0, 1, 0, 0, 0.75); + cairo_pattern_add_color_stop_rgba (pattern, sqrt (0.5), 0, 1, 0, 0); + cairo_pattern_add_color_stop_rgba (pattern, 1.0, 0, 0, 1, 1); +} + +static void +pattern_add_single_stop (cairo_pattern_t *pattern) +{ + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1, 0, 0, 1); +} + + +static cairo_test_status_t +draw (cairo_t *cr, add_stops_t add_stops, composite_t composite) +{ + int i, j; + cairo_extend_t extend[NUM_EXTEND] = { + CAIRO_EXTEND_NONE, + CAIRO_EXTEND_REPEAT, + CAIRO_EXTEND_REFLECT, + CAIRO_EXTEND_PAD + }; + + cairo_scale (cr, SIZE, SIZE); + cairo_translate (cr, 0.5, 0.5); + + for (j = 0; j < NUM_EXTEND; j++) { + cairo_save (cr); + for (i = 0; i < NUM_GRADIENTS; i++) { + cairo_pattern_t *pattern; + + pattern = create_pattern (i); + add_stops (pattern); + cairo_pattern_set_extend (pattern, extend[j]); + + cairo_save (cr); + cairo_rectangle (cr, -0.5, -0.5, 1, 1); + cairo_clip (cr); + composite (cr, pattern); + cairo_restore (cr); + cairo_pattern_destroy (pattern); + + cairo_translate (cr, 1, 0); + } + cairo_restore (cr); + cairo_translate (cr, 0, 1); + } + + return CAIRO_TEST_SUCCESS; +} + + +static void +composite_simple (cairo_t *cr, cairo_pattern_t *pattern) +{ + cairo_set_source (cr, pattern); + cairo_paint (cr); +} + +static void +composite_mask (cairo_t *cr, cairo_pattern_t *pattern) +{ + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_mask (cr, pattern); +} + + +static cairo_test_status_t +draw_simple (cairo_t *cr, int width, int height) +{ + cairo_test_paint_checkered (cr); + return draw (cr, pattern_add_stops, composite_simple); +} + +static cairo_test_status_t +draw_mask (cairo_t *cr, int width, int height) +{ + cairo_test_paint_checkered (cr); + return draw (cr, pattern_add_stops, composite_mask); +} + +static cairo_test_status_t +draw_source (cairo_t *cr, int width, int height) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + return draw (cr, pattern_add_stops, composite_simple); +} + + +static cairo_test_status_t +draw_mask_source (cairo_t *cr, int width, int height) +{ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + return draw (cr, pattern_add_stops, composite_mask); +} + +static cairo_test_status_t +draw_one_stop (cairo_t *cr, int width, int height) +{ + cairo_test_paint_checkered (cr); + return draw (cr, pattern_add_single_stop, composite_simple); +} + +CAIRO_TEST (radial_gradient, + "Simple test of radial gradients", + "gradient", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_simple) + +CAIRO_TEST (radial_gradient_mask, + "Simple test of radial gradients using a MASK", + "gradient,mask", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_mask) + +CAIRO_TEST (radial_gradient_source, + "Simple test of radial gradients using the SOURCE operator", + "gradient,source", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_source) + +CAIRO_TEST (radial_gradient_mask_source, + "Simple test of radial gradients using a MASK with a SOURCE operator", + "gradient,mask,source", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_mask_source) + +CAIRO_TEST (radial_gradient_one_stop, + "Tests radial gradients with a single stop", + "gradient,radial", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_one_stop) diff --git a/test/radial-outer-focus.c b/test/radial-outer-focus.c new file mode 100644 index 000000000..e03894745 --- /dev/null +++ b/test/radial-outer-focus.c @@ -0,0 +1,72 @@ +/* + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Krzysztof Kosi\u0144ski + */ + +/* Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=40918 */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *radial; + double angle; + int i, j; + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + angle = 0.0; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + cairo_save (cr); + cairo_rectangle (cr, 100*i, 100*j, 100, 100); + cairo_clip (cr); + + radial = cairo_pattern_create_radial (cos (angle), sin (angle), 0, + 0, 0, 1); + cairo_pattern_add_color_stop_rgb (radial, 0.0, 1, 0, 0); + cairo_pattern_add_color_stop_rgb (radial, 1.0, 0, 1, 0); + + cairo_translate (cr, 100*i+50, 100*j+50); + cairo_scale (cr, 50, -50); + cairo_set_source (cr, radial); + cairo_pattern_destroy (radial); + + cairo_paint(cr); + cairo_restore (cr); + + angle += M_PI/17; + } + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (radial_outer_focus, + "Exercises the condition of rendering a radial gradial on its outer focus", + "radial", /* keywords */ + NULL, /* requirements */ + 400, 400, + NULL, draw) diff --git a/test/random-clips.c b/test/random-clips.c new file mode 100644 index 000000000..31d7d6df0 --- /dev/null +++ b/test/random-clips.c @@ -0,0 +1,232 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * Copyright © 2011 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * M Joonas Pihlaja + * Chris Wilson + */ +#include "cairo-test.h" + +#define SIZE 512 +#define STEP (512+2) +#define NUM_SEGMENTS 128 + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static void nz_path (cairo_t *cr) +{ + int i; + + state = 0xc0ffee; + + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) { + double x = uniform_random (0, SIZE); + double y = uniform_random (0, SIZE); + cairo_line_to (cr, x, y); + } + cairo_close_path (cr); +} + +static void region_path (cairo_t *cr) +{ + int i; + + state = 0xc0ffee; + + for (i = 0; i < NUM_SEGMENTS; i++) { + int x = uniform_random (0, SIZE); + int y = uniform_random (0, SIZE); + int w = uniform_random (0, 40); + int h = uniform_random (0, 40); + cairo_rectangle (cr, x, y, w, h); + } +} + +static void rectangle_path (cairo_t *cr) +{ + int i; + + state = 0xc0ffee; + + for (i = 0; i < NUM_SEGMENTS; i++) { + double x = uniform_random (0, SIZE); + double y = uniform_random (0, SIZE); + double w = uniform_random (0, 40); + double h = uniform_random (0, 40); + cairo_rectangle (cr, x, y, w, h); + } +} + +static void arc_path (cairo_t *cr) +{ + int i; + + state = 0xc0ffee; + + for (i = 0; i < NUM_SEGMENTS; i++) { + double x = uniform_random (0, SIZE); + double y = uniform_random (0, SIZE); + double r = uniform_random (0, 20); + cairo_new_sub_path (cr); + cairo_arc (cr, x, y, r, 0, 2*M_PI); + } +} + + +static void nz_fill_stroke (cairo_t *cr) +{ + nz_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); +} + +static void clip_to_quadrant (cairo_t *cr) +{ + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + + state = 0xc0ffee; + cairo_translate (cr, 1, 1); + + /* no clipping */ + cairo_save (cr); { + clip_to_quadrant (cr); + + nz_fill_stroke (cr); + } cairo_restore (cr); + + cairo_translate (cr, STEP, 0); + + /* random clipping */ + cairo_save (cr); { + clip_to_quadrant (cr); + + nz_path (cr); + cairo_clip (cr); + + nz_fill_stroke (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + cairo_paint (cr); + } cairo_restore (cr); + + cairo_translate (cr, STEP, 0); + + /* regional clipping */ + cairo_save (cr); { + clip_to_quadrant (cr); + + region_path (cr); + cairo_clip (cr); + + nz_fill_stroke (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + cairo_paint (cr); + } cairo_restore (cr); + + cairo_translate (cr, -2*STEP, STEP); + + /* rectangular clipping */ + cairo_save (cr); { + clip_to_quadrant (cr); + + rectangle_path (cr); + cairo_clip (cr); + + nz_fill_stroke (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + cairo_paint (cr); + } cairo_restore (cr); + + cairo_translate (cr, STEP, 0); + + /* circular clipping */ + cairo_save (cr); { + clip_to_quadrant (cr); + + arc_path (cr); + cairo_clip (cr); + + nz_fill_stroke (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + cairo_paint (cr); + } cairo_restore (cr); + + cairo_translate (cr, STEP, 0); + + /* all-of-the-above clipping */ + cairo_save (cr); { + clip_to_quadrant (cr); + + nz_path (cr); + cairo_clip (cr); + region_path (cr); + cairo_clip (cr); + rectangle_path (cr); + cairo_clip (cr); + arc_path (cr); + cairo_clip (cr); + + nz_fill_stroke (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 0.5); + cairo_paint (cr); + } cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (random_clip, + "Tests the clip generation and intersection computation", + "trap, clip", /* keywords */ + NULL, /* requirements */ + 3*STEP+2, 2*STEP+2, + NULL, draw) diff --git a/test/random-intersections-curves-eo.c b/test/random-intersections-curves-eo.c new file mode 100644 index 000000000..84e9a75de --- /dev/null +++ b/test/random-intersections-curves-eo.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ +#include "cairo-test.h" + +#define SIZE 512 +#define NUM_SEGMENTS 128 + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + state = 0x12345678; + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) { + double y3 = uniform_random (0, SIZE); + double x3 = uniform_random (0, SIZE); + double y2 = uniform_random (-SIZE, SIZE); + double x2 = uniform_random (-SIZE, SIZE); + double y1 = uniform_random (-SIZE, SIZE); + double x1 = uniform_random (-SIZE, SIZE); + cairo_curve_to (cr, + x1, y1, + x2, y2, + x3, y3); + } + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 0.5); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (random_intersections_curves_eo, + "Tests the tessellator trapezoid generation and intersection computation", + "trap", /* keywords */ + NULL, /* requirements */ + SIZE+3, SIZE+3, + NULL, draw) diff --git a/test/random-intersections-curves-nz.c b/test/random-intersections-curves-nz.c new file mode 100644 index 000000000..5265e4a73 --- /dev/null +++ b/test/random-intersections-curves-nz.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ +#include "cairo-test.h" + +#define SIZE 512 +#define NUM_SEGMENTS 128 + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + state = 0x12345678; + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) { + double y3 = uniform_random (0, SIZE); + double x3 = uniform_random (0, SIZE); + double y2 = uniform_random (-SIZE, SIZE); + double x2 = uniform_random (-SIZE, SIZE); + double y1 = uniform_random (-SIZE, SIZE); + double x1 = uniform_random (-SIZE, SIZE); + cairo_curve_to (cr, + x1, y1, + x2, y2, + x3, y3); + } + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 0.5); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (random_intersections_curves_nz, + "Tests the tessellator trapezoid generation and intersection computation", + "trap", /* keywords */ + NULL, /* requirements */ + SIZE+3, SIZE+3, + NULL, draw) + diff --git a/test/random-intersections-eo.c b/test/random-intersections-eo.c new file mode 100644 index 000000000..d35894f33 --- /dev/null +++ b/test/random-intersections-eo.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ +#include "cairo-test.h" + +#define SIZE 512 +#define NUM_SEGMENTS 128 + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + state = 0x12345678; + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) { + double x = uniform_random (0, width); + double y = uniform_random (0, height); + cairo_line_to (cr, x, y); + } + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 0.5); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (random_intersections_eo, + "Tests the tessellator trapezoid generation and intersection computation", + "trap", /* keywords */ + NULL, /* requirements */ + SIZE+3, SIZE+3, + NULL, draw) + diff --git a/test/random-intersections-nonzero.c b/test/random-intersections-nonzero.c new file mode 100644 index 000000000..cad047e04 --- /dev/null +++ b/test/random-intersections-nonzero.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2006 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ +#include "cairo-test.h" + +#define SIZE 512 +#define NUM_SEGMENTS 128 + +static uint32_t state; + +static double +uniform_random (double minval, double maxval) +{ + static uint32_t const poly = 0x9a795537U; + uint32_t n = 32; + while (n-->0) + state = 2*state < state ? (2*state ^ poly) : 2*state; + return minval + state * (maxval - minval) / 4294967296.0; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + state = 0x12345678; + cairo_translate (cr, 1, 1); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_WINDING); + + cairo_move_to (cr, 0, 0); + for (i = 0; i < NUM_SEGMENTS; i++) { + double x = uniform_random (0, width); + double y = uniform_random (0, height); + cairo_line_to (cr, x, y); + } + cairo_close_path (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 0.5); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (random_intersections_nonzero, + "Tests the tessellator trapezoid generation and intersection computation", + "trap", /* keywords */ + NULL, /* requirements */ + SIZE+3, SIZE+3, + NULL, draw) + + diff --git a/test/raster-source.c b/test/raster-source.c new file mode 100644 index 000000000..5a7646e8a --- /dev/null +++ b/test/raster-source.c @@ -0,0 +1,134 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#include +#include + +/* Basic test to exercise the new mime-surface callback. */ + +#define WIDTH 200 +#define HEIGHT 80 + +/* Lazy way of determining PNG dimensions... */ +static void +png_dimensions (const char *filename, + cairo_content_t *content, int *width, int *height) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_from_png (filename); + *content = cairo_surface_get_content (surface); + *width = cairo_image_surface_get_width (surface); + *height = cairo_image_surface_get_height (surface); + cairo_surface_destroy (surface); +} + +static cairo_surface_t * +png_acquire (cairo_pattern_t *pattern, void *closure, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents) +{ + return cairo_image_surface_create_from_png (closure); +} + +static cairo_surface_t * +red_acquire (cairo_pattern_t *pattern, void *closure, + cairo_surface_t *target, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *image; + cairo_t *cr; + + image = cairo_surface_create_similar_image (target, + CAIRO_FORMAT_RGB24, + extents->width, + extents->height); + cairo_surface_set_device_offset (image, extents->x, extents->y); + + cr = cairo_create (image); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + return image; +} + +static void +release (cairo_pattern_t *pattern, void *closure, cairo_surface_t *image) +{ + cairo_surface_destroy (image); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const char *png_filename = "png.png"; + cairo_pattern_t *png, *red; + cairo_content_t content; + int png_width, png_height; + int i, j; + + png_dimensions (png_filename, &content, &png_width, &png_height); + + png = cairo_pattern_create_raster_source ((void*)png_filename, + content, png_width, png_height); + cairo_raster_source_pattern_set_acquire (png, png_acquire, release); + + red = cairo_pattern_create_raster_source (NULL, + CAIRO_CONTENT_COLOR, WIDTH, HEIGHT); + cairo_raster_source_pattern_set_acquire (red, red_acquire, release); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 0, (HEIGHT-png_height)/2); + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + cairo_pattern_t *source; + if ((i ^ j) & 1) + source = red; + else + source = png; + cairo_set_source (cr, source); + cairo_rectangle (cr, i * WIDTH/4, j * png_height/4, WIDTH/4, png_height/4); + cairo_fill (cr); + } + } + + cairo_pattern_destroy (red); + cairo_pattern_destroy (png); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (raster_source, + "Check that the mime-surface embedding works", + "api", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/record-extend.c b/test/record-extend.c new file mode 100644 index 000000000..8e8387151 --- /dev/null +++ b/test/record-extend.c @@ -0,0 +1,288 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Behdad Esfahbod + * Chris Wilson + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 90 + +/* This is written using clip+paint to exercise a bug that once was in the + * recording surface. + */ + +static cairo_surface_t * +source (cairo_surface_t *surface) +{ + cairo_t *cr; + + /* Create a 4-pixel image surface with my favorite four colors in each + * quadrant. */ + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + /* upper-left = white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 0, 0, 1, 1); + cairo_fill (cr); + + /* upper-right = red */ + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, 1, 0, 1, 1); + cairo_fill (cr); + + /* lower-left = green */ + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, 0, 1, 1, 1); + cairo_fill (cr); + + /* lower-right = blue */ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, 1, 1, 1, 1); + cairo_fill (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_surface_t * +image (cairo_t *cr) +{ + return source (cairo_image_surface_create (CAIRO_FORMAT_RGB24, 2, 2)); +} + +static cairo_surface_t * +similar (cairo_t *cr) +{ + return source (cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR, 2, 2)); +} + +static cairo_t * +extend (cairo_t *cr, cairo_surface_t *(*surface)(cairo_t *), cairo_extend_t mode) +{ + cairo_surface_t *s; + + cairo_set_source_rgb (cr, 0, 1, 1); + cairo_paint (cr); + + /* Now use extend modes to cover most of the surface with those 4 colors */ + s = surface (cr); + cairo_set_source_surface (cr, s, SIZE/2 - 1, SIZE/2 - 1); + cairo_surface_destroy (s); + + cairo_pattern_set_extend (cairo_get_source (cr), mode); + + cairo_rectangle (cr, 10, 10, SIZE-20, SIZE-20); + cairo_clip (cr); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +extend_none (cairo_t *cr, + cairo_surface_t *(*pattern)(cairo_t *)) +{ + return extend (cr, pattern, CAIRO_EXTEND_NONE); +} + +static cairo_t * +extend_pad (cairo_t *cr, + cairo_surface_t *(*pattern)(cairo_t *)) +{ + return extend (cr, pattern, CAIRO_EXTEND_PAD); +} + +static cairo_t * +extend_repeat (cairo_t *cr, + cairo_surface_t *(*pattern)(cairo_t *)) +{ + return extend (cr, pattern, CAIRO_EXTEND_REPEAT); +} + +static cairo_t * +extend_reflect (cairo_t *cr, + cairo_surface_t *(*pattern)(cairo_t *)) +{ + return extend (cr, pattern, CAIRO_EXTEND_REFLECT); +} + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, + cairo_t *(*func)(cairo_t *, + cairo_surface_t *(*pattern)(cairo_t *)), + cairo_surface_t *(*pattern)(cairo_t *), + int width, int height) +{ + cairo_surface_t *surface; + int x, y; + + surface = record_get (func (record_create (cr), pattern)); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_extend_none (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_none, image, width, height); +} + +static cairo_test_status_t +record_extend_pad (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_pad, image, width, height); +} + +static cairo_test_status_t +record_extend_repeat (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_repeat, image, width, height); +} + +static cairo_test_status_t +record_extend_reflect (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_reflect, image, width, height); +} + +static cairo_test_status_t +record_extend_none_similar (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_none, similar, width, height); +} + +static cairo_test_status_t +record_extend_pad_similar (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_pad, similar, width, height); +} + +static cairo_test_status_t +record_extend_repeat_similar (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_repeat, similar, width, height); +} + +static cairo_test_status_t +record_extend_reflect_similar (cairo_t *cr, int width, int height) +{ + return record_replay (cr, extend_reflect, similar, width, height); +} + +CAIRO_TEST (record_extend_none, + "Test CAIRO_EXTEND_NONE for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_none) +CAIRO_TEST (record_extend_pad, + "Test CAIRO_EXTEND_PAD for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_pad) +CAIRO_TEST (record_extend_repeat, + "Test CAIRO_EXTEND_REPEAT for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_repeat) +CAIRO_TEST (record_extend_reflect, + "Test CAIRO_EXTEND_REFLECT for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_reflect) + +CAIRO_TEST (record_extend_none_similar, + "Test CAIRO_EXTEND_NONE for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_none_similar) +CAIRO_TEST (record_extend_pad_similar, + "Test CAIRO_EXTEND_PAD for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_pad_similar) +CAIRO_TEST (record_extend_repeat_similar, + "Test CAIRO_EXTEND_REPEAT for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_repeat_similar) +CAIRO_TEST (record_extend_reflect_similar, + "Test CAIRO_EXTEND_REFLECT for recorded surface patterns", + "record, extend", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, record_extend_reflect_similar) diff --git a/test/record-mesh.c b/test/record-mesh.c new file mode 100644 index 000000000..754a1d430 --- /dev/null +++ b/test/record-mesh.c @@ -0,0 +1,166 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * Copyright © 2009 Adrian Johnson + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Behdad Esfahbod + * Adrian Johnson + * Chris Wilson + */ + +#include "cairo-test.h" +#include +#include + +#define PAT_WIDTH 170 +#define PAT_HEIGHT 170 +#define SIZE PAT_WIDTH +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to paint a mesh pattern. The mesh contains + * two overlapping patches */ + +static cairo_pattern_t * +mesh (void) +{ + cairo_pattern_t *pattern; + + pattern = cairo_pattern_create_mesh (); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 0, 0); + cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); + cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); + cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); + cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); + + cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + cairo_mesh_pattern_begin_patch (pattern); + + cairo_mesh_pattern_move_to (pattern, 50, 50); + cairo_mesh_pattern_curve_to (pattern, 80, 20, 110, 80, 150, 50); + cairo_mesh_pattern_curve_to (pattern, 110, 80, 180, 110, 150, 150); + cairo_mesh_pattern_curve_to (pattern, 110, 120, 80, 180, 50, 150); + cairo_mesh_pattern_curve_to (pattern, 80, 120, 20, 80, 50, 50); + + cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, 1, 0, 0, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); + cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, 0, 0, 1, 0.3); + cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); + + cairo_mesh_pattern_end_patch (pattern); + + return pattern; +} + +static cairo_t * +draw (cairo_t *cr) +{ + cairo_pattern_t *source; + + cairo_set_source_rgb (cr, 0, 1, 1); + cairo_paint (cr); + + source = mesh (); + cairo_set_source (cr, source); + cairo_pattern_destroy (source); + + cairo_rectangle (cr, 10, 10, SIZE-20, SIZE-20); + cairo_clip (cr); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + + surface = record_get (func (record_create (cr))); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_mesh (cairo_t *cr, int width, int height) +{ + return record_replay (cr, draw, width, height); +} + +CAIRO_TEST (record_mesh, + "Paint mesh pattern through a recording surface", + "record,mesh,pattern", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, record_mesh) + diff --git a/test/record.c b/test/record.c new file mode 100644 index 000000000..b1baadace --- /dev/null +++ b/test/record.c @@ -0,0 +1,491 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: + * Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +#define TT_SIZE 100 +#define TT_PAD 5 +#define TT_FONT_SIZE 32.0 + +#define GENERATE_REF 0 + +static uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff +}; + +static const char *png_filename = "romedalen.png"; + +static cairo_t * +paint (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 2, 2); + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +paint_alpha (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_solid_clip (cairo_t *cr) +{ + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 2.5, 2.5, 27, 27); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1., 0.,0.); + cairo_paint_with_alpha (cr, 0.5); + + return cr; +} + +static cairo_t * +paint_alpha_clip (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 10.5, 10.5, 11, 11); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_clip_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_move_to (cr, 16, 5); + cairo_line_to (cr, 5, 16); + cairo_line_to (cr, 16, 27); + cairo_line_to (cr, 27, 16); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +select_font_face (cairo_t *cr) +{ + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return cr; +} + +static cairo_t * +fill_alpha (cairo_t *cr) +{ + const double alpha = 1./3; + int n; + + /* flatten to white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return cr; +} + +static cairo_t * +self_intersecting (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 1.0, 1.0); + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + /* First draw the desired shape with a fill */ + cairo_rectangle (cr, 0.5, 0.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 3.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 1.5, -2.0, 2.0); + cairo_rectangle (cr, 6.5, 4.5, -2.0, 2.0); + + cairo_fill (cr); + + /* Then try the same thing with a stroke */ + cairo_translate (cr, 0, 10); + cairo_move_to (cr, 1.0, 1.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, 6.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, -3.0); + cairo_rel_line_to (cr, -6.0, 0.0); + cairo_close_path (cr); + + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + + return cr; +} + +static void +draw_text_transform (cairo_t *cr) +{ + cairo_matrix_t tm; + + /* skew */ + cairo_matrix_init (&tm, 1, 0, + -0.25, 1, + 0, 0); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, 50, TT_SIZE-TT_PAD); + cairo_show_text (cr, "A"); + + /* rotate and scale */ + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE * 2.0); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 25); + cairo_show_text (cr, "A"); + + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE * 2.0, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 50); + cairo_show_text (cr, "A"); +} + +static cairo_t * +text_transform (cairo_t *cr) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0.); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + draw_text_transform (cr); + + cairo_translate (cr, TT_SIZE, TT_SIZE); + cairo_rotate (cr, M_PI); + + pattern = cairo_test_create_pattern_from_png (ctx, png_filename); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + draw_text_transform (cr); + + return cr; +} + +/* And here begins the recording and replaying... */ + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + +#if GENERATE_REF + func(cr); +#else + surface = record_get (func (record_create (cr))); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_paint (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint, width, height); +} + +static cairo_test_status_t +record_paint_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha, width, height); +} + +static cairo_test_status_t +record_paint_alpha_solid_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_solid_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip_mask (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip_mask, width, height); +} + +static cairo_test_status_t +record_fill_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, fill_alpha, width, height); +} + +static cairo_test_status_t +record_self_intersecting (cairo_t *cr, int width, int height) +{ + return record_replay (cr, self_intersecting, width, height); +} + +static cairo_test_status_t +record_select_font_face (cairo_t *cr, int width, int height) +{ + return record_replay (cr, select_font_face, width, height); +} + +static cairo_test_status_t +record_text_transform (cairo_t *cr, int width, int height) +{ + return record_replay (cr, text_transform, width, height); +} + +CAIRO_TEST (record_paint, + "Test replayed calls to cairo_paint", + "paint,record", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, record_paint) +CAIRO_TEST (record_paint_alpha, + "Simple test of cairo_paint_with_alpha", + "record, paint, alpha", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha) +CAIRO_TEST (record_paint_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_solid_clip) +CAIRO_TEST (record_paint_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_clip) +CAIRO_TEST (record_paint_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+triangular clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_clip_mask) +CAIRO_TEST (record_fill_alpha, + "Tests using set_rgba();fill()", + "record,fill, alpha", /* keywords */ + NULL, /* requirements */ + 2*SIZE + 4*PAD, 2*SIZE + 4*PAD, + NULL, record_fill_alpha) +CAIRO_TEST (record_select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "record, font", /* keywords */ + NULL, /* requirements */ + 192, TEXT_SIZE + 4, + NULL, record_select_font_face) +CAIRO_TEST (record_self_intersecting, + "Test strokes of self-intersecting paths", + "record, stroke, trap", /* keywords */ + NULL, /* requirements */ + 10, 20, + NULL, record_self_intersecting) +CAIRO_TEST (record_text_transform, + "Test various applications of the font matrix", + "record, text, transform", /* keywords */ + NULL, /* requirements */ + TT_SIZE, TT_SIZE, + NULL, record_text_transform) diff --git a/test/record1414x.c b/test/record1414x.c new file mode 100644 index 000000000..029e5a4d6 --- /dev/null +++ b/test/record1414x.c @@ -0,0 +1,498 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: + * Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#ifndef M_SQRT2 +#define M_SQRT2 1.41421345623730951 +#endif + +#define TEXT_SIZE 12 +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +#define TT_SIZE 100 +#define TT_PAD 5 +#define TT_FONT_SIZE 32.0 + +#define GENERATE_REF 0 + +static uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff +}; + +static const char *png_filename = "romedalen.png"; + +static cairo_t * +paint (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 2, 2); + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +paint_alpha (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_solid_clip (cairo_t *cr) +{ + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 2.5, 2.5, 27, 27); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1., 0.,0.); + cairo_paint_with_alpha (cr, 0.5); + + return cr; +} + +static cairo_t * +paint_alpha_clip (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 10.5, 10.5, 11, 11); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_clip_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_move_to (cr, 16, 5); + cairo_line_to (cr, 5, 16); + cairo_line_to (cr, 16, 27); + cairo_line_to (cr, 27, 16); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +select_font_face (cairo_t *cr) +{ + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return cr; +} + +static cairo_t * +fill_alpha (cairo_t *cr) +{ + const double alpha = 1./3; + int n; + + /* flatten to white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return cr; +} + +static cairo_t * +self_intersecting (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 1.0, 1.0); + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + /* First draw the desired shape with a fill */ + cairo_rectangle (cr, 0.5, 0.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 3.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 1.5, -2.0, 2.0); + cairo_rectangle (cr, 6.5, 4.5, -2.0, 2.0); + + cairo_fill (cr); + + /* Then try the same thing with a stroke */ + cairo_translate (cr, 0, 10); + cairo_move_to (cr, 1.0, 1.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, 6.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, -3.0); + cairo_rel_line_to (cr, -6.0, 0.0); + cairo_close_path (cr); + + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + + return cr; +} + +static void +draw_text_transform (cairo_t *cr) +{ + cairo_matrix_t tm; + + /* skew */ + cairo_matrix_init (&tm, 1, 0, + -0.25, 1, + 0, 0); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, 50, TT_SIZE-TT_PAD); + cairo_show_text (cr, "A"); + + /* rotate and scale */ + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE * 2.0); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 25); + cairo_show_text (cr, "A"); + + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE * 2.0, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 50); + cairo_show_text (cr, "A"); +} + +static cairo_t * +text_transform (cairo_t *cr) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0.); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + draw_text_transform (cr); + + cairo_translate (cr, TT_SIZE, TT_SIZE); + cairo_rotate (cr, M_PI); + + pattern = cairo_test_create_pattern_from_png (ctx, png_filename); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + draw_text_transform (cr); + + return cr; +} + +/* And here begins the recording and replaying... */ + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + +#if GENERATE_REF + cairo_scale (cr, M_SQRT2, M_SQRT2); + func (cr); +#else + surface = record_get (func (record_create (cr))); + + cairo_scale (cr, M_SQRT2, M_SQRT2); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + cairo_identity_matrix (cr); /* make sure the clip is pixel-aligned */ + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_paint (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint, width, height); +} + +static cairo_test_status_t +record_paint_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha, width, height); +} + +static cairo_test_status_t +record_paint_alpha_solid_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_solid_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip_mask (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip_mask, width, height); +} + +static cairo_test_status_t +record_fill_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, fill_alpha, width, height); +} + +static cairo_test_status_t +record_self_intersecting (cairo_t *cr, int width, int height) +{ + return record_replay (cr, self_intersecting, width, height); +} + +static cairo_test_status_t +record_select_font_face (cairo_t *cr, int width, int height) +{ + return record_replay (cr, select_font_face, width, height); +} + +static cairo_test_status_t +record_text_transform (cairo_t *cr, int width, int height) +{ + return record_replay (cr, text_transform, width, height); +} + +CAIRO_TEST (record1414x_paint, + "Test replayed calls to cairo_paint", + "paint, record", /* keywords */ + NULL, /* requirements */ + M_SQRT2*8, M_SQRT2*8, + NULL, record_paint) +CAIRO_TEST (record1414x_paint_alpha, + "Simple test of cairo_paint_with_alpha", + "record, paint, alpha", /* keywords */ + NULL, /* requirements */ + M_SQRT2*32, M_SQRT2*32, + NULL, record_paint_alpha) +CAIRO_TEST (record1414x_paint_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + M_SQRT2*32, M_SQRT2*32, + NULL, record_paint_alpha_solid_clip) +CAIRO_TEST (record1414x_paint_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + M_SQRT2*32, M_SQRT2*32, + NULL, record_paint_alpha_clip) +CAIRO_TEST (record1414x_paint_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+triangular clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + M_SQRT2*32, M_SQRT2*32, + NULL, record_paint_alpha_clip_mask) +CAIRO_TEST (record1414x_fill_alpha, + "Tests using set_rgba();fill()", + "record, fill, alpha", /* keywords */ + NULL, /* requirements */ + M_SQRT2*(2*SIZE + 4*PAD), M_SQRT2*(2*SIZE + 4*PAD), + NULL, record_fill_alpha) +CAIRO_TEST (record1414x_select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "record, font", /* keywords */ + NULL, /* requirements */ + M_SQRT2*192, M_SQRT2*(TEXT_SIZE + 4), + NULL, record_select_font_face) +CAIRO_TEST (record1414x_self_intersecting, + "Test strokes of self-intersecting paths", + "record, stroke, trap", /* keywords */ + NULL, /* requirements */ + M_SQRT2*10, M_SQRT2*20, + NULL, record_self_intersecting) +CAIRO_TEST (record1414x_text_transform, + "Test various applications of the font matrix", + "record, text, transform", /* keywords */ + NULL, /* requirements */ + M_SQRT2*TT_SIZE, M_SQRT2*TT_SIZE, + NULL, record_text_transform) diff --git a/test/record2x.c b/test/record2x.c new file mode 100644 index 000000000..7fe037732 --- /dev/null +++ b/test/record2x.c @@ -0,0 +1,493 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: + * Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +#define TT_SIZE 100 +#define TT_PAD 5 +#define TT_FONT_SIZE 32.0 + +#define GENERATE_REF 0 + +static uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff +}; + +static const char *png_filename = "romedalen.png"; + +static cairo_t * +paint (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 2, 2); + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +paint_alpha (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_solid_clip (cairo_t *cr) +{ + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 2.5, 2.5, 27, 27); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1., 0.,0.); + cairo_paint_with_alpha (cr, 0.5); + + return cr; +} + +static cairo_t * +paint_alpha_clip (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 10.5, 10.5, 11, 11); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_clip_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_move_to (cr, 16, 5); + cairo_line_to (cr, 5, 16); + cairo_line_to (cr, 16, 27); + cairo_line_to (cr, 27, 16); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +select_font_face (cairo_t *cr) +{ + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return cr; +} + +static cairo_t * +fill_alpha (cairo_t *cr) +{ + const double alpha = 1./3; + int n; + + /* flatten to white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return cr; +} + +static cairo_t * +self_intersecting (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 1.0, 1.0); + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + /* First draw the desired shape with a fill */ + cairo_rectangle (cr, 0.5, 0.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 3.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 1.5, -2.0, 2.0); + cairo_rectangle (cr, 6.5, 4.5, -2.0, 2.0); + + cairo_fill (cr); + + /* Then try the same thing with a stroke */ + cairo_translate (cr, 0, 10); + cairo_move_to (cr, 1.0, 1.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, 6.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, -3.0); + cairo_rel_line_to (cr, -6.0, 0.0); + cairo_close_path (cr); + + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + + return cr; +} + +static void +draw_text_transform (cairo_t *cr) +{ + cairo_matrix_t tm; + + /* skew */ + cairo_matrix_init (&tm, 1, 0, + -0.25, 1, + 0, 0); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, 50, TT_SIZE-TT_PAD); + cairo_show_text (cr, "A"); + + /* rotate and scale */ + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE * 2.0); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 25); + cairo_show_text (cr, "A"); + + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE * 2.0, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 50); + cairo_show_text (cr, "A"); +} + +static cairo_t * +text_transform (cairo_t *cr) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0.); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + draw_text_transform (cr); + + cairo_translate (cr, TT_SIZE, TT_SIZE); + cairo_rotate (cr, M_PI); + + pattern = cairo_test_create_pattern_from_png (ctx, png_filename); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + draw_text_transform (cr); + + return cr; +} + +/* And here begins the recording and replaying... */ + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + +#if GENERATE_REF + cairo_scale (cr, 2, 2); + func(cr); +#else + surface = record_get (func (record_create (cr))); + + cairo_scale (cr, 2, 2); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_paint (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint, width, height); +} + +static cairo_test_status_t +record_paint_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha, width, height); +} + +static cairo_test_status_t +record_paint_alpha_solid_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_solid_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip_mask (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip_mask, width, height); +} + +static cairo_test_status_t +record_fill_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, fill_alpha, width, height); +} + +static cairo_test_status_t +record_self_intersecting (cairo_t *cr, int width, int height) +{ + return record_replay (cr, self_intersecting, width, height); +} + +static cairo_test_status_t +record_select_font_face (cairo_t *cr, int width, int height) +{ + return record_replay (cr, select_font_face, width, height); +} + +static cairo_test_status_t +record_text_transform (cairo_t *cr, int width, int height) +{ + return record_replay (cr, text_transform, width, height); +} + +CAIRO_TEST (record2x_paint, + "Test replayed calls to cairo_paint", + "paint,record", /* keywords */ + NULL, /* requirements */ + 2*8, 2*8, + NULL, record_paint) +CAIRO_TEST (record2x_paint_alpha, + "Simple test of cairo_paint_with_alpha", + "record, paint, alpha", /* keywords */ + NULL, /* requirements */ + 2*32, 2*32, + NULL, record_paint_alpha) +CAIRO_TEST (record2x_paint_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 2*32, 2*32, + NULL, record_paint_alpha_solid_clip) +CAIRO_TEST (record2x_paint_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 2*32, 2*32, + NULL, record_paint_alpha_clip) +CAIRO_TEST (record2x_paint_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+triangular clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 2*32, 2*32, + NULL, record_paint_alpha_clip_mask) +CAIRO_TEST (record2x_fill_alpha, + "Tests using set_rgba();fill()", + "record,fill, alpha", /* keywords */ + NULL, /* requirements */ + 2*(2*SIZE + 4*PAD), 2*(2*SIZE + 4*PAD), + NULL, record_fill_alpha) +CAIRO_TEST (record2x_select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "record, font", /* keywords */ + NULL, /* requirements */ + 2*192, 2*(TEXT_SIZE + 4), + NULL, record_select_font_face) +CAIRO_TEST (record2x_self_intersecting, + "Test strokes of self-intersecting paths", + "record, stroke, trap", /* keywords */ + NULL, /* requirements */ + 2*10, 2*20, + NULL, record_self_intersecting) +CAIRO_TEST (record2x_text_transform, + "Test various applications of the font matrix", + "record, text, transform", /* keywords */ + NULL, /* requirements */ + 2*TT_SIZE, 2*TT_SIZE, + NULL, record_text_transform) diff --git a/test/record90.c b/test/record90.c new file mode 100644 index 000000000..95ba3b1b1 --- /dev/null +++ b/test/record90.c @@ -0,0 +1,495 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: + * Carl D. Worth + * Chris Wilson + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +#define TT_SIZE 100 +#define TT_PAD 5 +#define TT_FONT_SIZE 32.0 + +#define GENERATE_REF 0 + +static uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff +}; + +static const char *png_filename = "romedalen.png"; + +static cairo_t * +paint (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 2, 2); + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +paint_alpha (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_solid_clip (cairo_t *cr) +{ + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 2.5, 2.5, 27, 27); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1., 0.,0.); + cairo_paint_with_alpha (cr, 0.5); + + return cr; +} + +static cairo_t * +paint_alpha_clip (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 10.5, 10.5, 11, 11); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_clip_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_move_to (cr, 16, 5); + cairo_line_to (cr, 5, 16); + cairo_line_to (cr, 16, 27); + cairo_line_to (cr, 27, 16); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +select_font_face (cairo_t *cr) +{ + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return cr; +} + +static cairo_t * +fill_alpha (cairo_t *cr) +{ + const double alpha = 1./3; + int n; + + /* flatten to white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return cr; +} + +static cairo_t * +self_intersecting (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 1.0, 1.0); + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + /* First draw the desired shape with a fill */ + cairo_rectangle (cr, 0.5, 0.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 3.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 1.5, -2.0, 2.0); + cairo_rectangle (cr, 6.5, 4.5, -2.0, 2.0); + + cairo_fill (cr); + + /* Then try the same thing with a stroke */ + cairo_translate (cr, 0, 10); + cairo_move_to (cr, 1.0, 1.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, 6.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, -3.0); + cairo_rel_line_to (cr, -6.0, 0.0); + cairo_close_path (cr); + + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + + return cr; +} + +static void +draw_text_transform (cairo_t *cr) +{ + cairo_matrix_t tm; + + /* skew */ + cairo_matrix_init (&tm, 1, 0, + -0.25, 1, + 0, 0); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, 50, TT_SIZE-TT_PAD); + cairo_show_text (cr, "A"); + + /* rotate and scale */ + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE * 2.0); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 25); + cairo_show_text (cr, "A"); + + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE * 2.0, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 50); + cairo_show_text (cr, "A"); +} + +static cairo_t * +text_transform (cairo_t *cr) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0.); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + draw_text_transform (cr); + + cairo_translate (cr, TT_SIZE, TT_SIZE); + cairo_rotate (cr, M_PI); + + pattern = cairo_test_create_pattern_from_png (ctx, png_filename); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + draw_text_transform (cr); + + return cr; +} + +/* And here begins the recording and replaying... */ + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + +#if GENERATE_REF + cairo_translate(cr, width, 0); + cairo_rotate (cr, M_PI/2); + func(cr); +#else + surface = record_get (func (record_create (cr))); + + cairo_translate(cr, width, 0); + cairo_rotate (cr, M_PI/2); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < width; y += 2) { + for (x = 0; x < height; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_paint (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint, width, height); +} + +static cairo_test_status_t +record_paint_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha, width, height); +} + +static cairo_test_status_t +record_paint_alpha_solid_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_solid_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip_mask (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip_mask, width, height); +} + +static cairo_test_status_t +record_fill_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, fill_alpha, width, height); +} + +static cairo_test_status_t +record_self_intersecting (cairo_t *cr, int width, int height) +{ + return record_replay (cr, self_intersecting, width, height); +} + +static cairo_test_status_t +record_select_font_face (cairo_t *cr, int width, int height) +{ + return record_replay (cr, select_font_face, width, height); +} + +static cairo_test_status_t +record_text_transform (cairo_t *cr, int width, int height) +{ + return record_replay (cr, text_transform, width, height); +} + +CAIRO_TEST (record90_paint, + "Test replayed calls to cairo_paint", + "paint,record", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, record_paint) +CAIRO_TEST (record90_paint_alpha, + "Simple test of cairo_paint_with_alpha", + "record, paint, alpha", /* keywords */ + NULL, /* requirements */ + 2, 32, + NULL, record_paint_alpha) +CAIRO_TEST (record90_paint_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_solid_clip) +CAIRO_TEST (record90_paint_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_clip) +CAIRO_TEST (record90_paint_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+triangular clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_clip_mask) +CAIRO_TEST (record90_fill_alpha, + "Tests using set_rgba();fill()", + "record,fill, alpha", /* keywords */ + NULL, /* requirements */ + 2*SIZE + 4*PAD, 2*SIZE + 4*PAD, + NULL, record_fill_alpha) +CAIRO_TEST (record90_select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "record, font", /* keywords */ + NULL, /* requirements */ + TEXT_SIZE + 4, 192, + NULL, record_select_font_face) +CAIRO_TEST (record90_self_intersecting, + "Test strokes of self-intersecting paths", + "record, stroke, trap", /* keywords */ + NULL, /* requirements */ + 20, 10, + NULL, record_self_intersecting) +CAIRO_TEST (record90_text_transform, + "Test various applications of the font matrix", + "record, text, transform", /* keywords */ + NULL, /* requirements */ + TT_SIZE, TT_SIZE, + NULL, record_text_transform) diff --git a/test/recordflip.c b/test/recordflip.c new file mode 100644 index 000000000..e923c8a2a --- /dev/null +++ b/test/recordflip.c @@ -0,0 +1,733 @@ +/* + * Copyright © 2011,2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 +#define SIZE 60 /* needs to be big to check large area effects (dithering) */ +#define PAD 2 + +#define TT_SIZE 100 +#define TT_PAD 5 +#define TT_FONT_SIZE 32.0 + +#define GENERATE_REF 0 + +static uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff +}; + +static const char *png_filename = "romedalen.png"; + +static cairo_t * +paint (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + cairo_translate (cr, 2, 2); + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + return cr; +} + +static cairo_t * +paint_alpha (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_solid_clip (cairo_t *cr) +{ + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 2.5, 2.5, 27, 27); + cairo_clip (cr); + + cairo_set_source_rgb (cr, 1., 0.,0.); + cairo_paint_with_alpha (cr, 0.5); + + return cr; +} + +static cairo_t * +paint_alpha_clip (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_rectangle (cr, 10.5, 10.5, 11, 11); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +paint_alpha_clip_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_test_paint_checkered (cr); + + cairo_move_to (cr, 16, 5); + cairo_line_to (cr, 5, 16); + cairo_line_to (cr, 16, 27); + cairo_line_to (cr, 27, 16); + cairo_clip (cr); + + cairo_scale (cr, 4, 4); + + cairo_set_source_surface (cr, surface, 2 , 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint_with_alpha (cr, 0.5); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_t * +select_font_face (cairo_t *cr) +{ + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return cr; +} + +static cairo_t * +fill_alpha (cairo_t *cr) +{ + const double alpha = 1./3; + int n; + + /* flatten to white */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* square */ + cairo_rectangle (cr, PAD, PAD, SIZE, SIZE); + cairo_set_source_rgba (cr, 1, 0, 0, alpha); + cairo_fill (cr); + + /* circle */ + cairo_translate (cr, SIZE + 2 * PAD, 0); + cairo_arc (cr, PAD + SIZE / 2., PAD + SIZE / 2., SIZE / 2., 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 1, 0, alpha); + cairo_fill (cr); + + /* triangle */ + cairo_translate (cr, 0, SIZE + 2 * PAD); + cairo_move_to (cr, PAD + SIZE / 2, PAD); + cairo_line_to (cr, PAD + SIZE, PAD + SIZE); + cairo_line_to (cr, PAD, PAD + SIZE); + cairo_set_source_rgba (cr, 0, 0, 1, alpha); + cairo_fill (cr); + + /* star */ + cairo_translate (cr, -(SIZE + 2 * PAD) + SIZE/2., SIZE/2.); + for (n = 0; n < 5; n++) { + cairo_line_to (cr, + SIZE/2 * cos (2*n * 2*M_PI / 10), + SIZE/2 * sin (2*n * 2*M_PI / 10)); + + cairo_line_to (cr, + SIZE/4 * cos ((2*n+1)*2*M_PI / 10), + SIZE/4 * sin ((2*n+1)*2*M_PI / 10)); + } + cairo_set_source_rgba (cr, 0, 0, 0, alpha); + cairo_fill (cr); + + return cr; +} + +static cairo_t * +self_intersecting (cairo_t *cr) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 1.0, 1.0); + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + /* First draw the desired shape with a fill */ + cairo_rectangle (cr, 0.5, 0.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 3.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 1.5, -2.0, 2.0); + cairo_rectangle (cr, 6.5, 4.5, -2.0, 2.0); + + cairo_fill (cr); + + /* Then try the same thing with a stroke */ + cairo_translate (cr, 0, 10); + cairo_move_to (cr, 1.0, 1.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, 6.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, -3.0); + cairo_rel_line_to (cr, -6.0, 0.0); + cairo_close_path (cr); + + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + + return cr; +} + +static void +draw_text_transform (cairo_t *cr) +{ + cairo_matrix_t tm; + + /* skew */ + cairo_matrix_init (&tm, 1, 0, + -0.25, 1, + 0, 0); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, 50, TT_SIZE-TT_PAD); + cairo_show_text (cr, "A"); + + /* rotate and scale */ + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE, TT_FONT_SIZE * 2.0); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 25); + cairo_show_text (cr, "A"); + + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, TT_FONT_SIZE * 2.0, TT_FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, TT_PAD, TT_PAD + 50); + cairo_show_text (cr, "A"); +} + +static cairo_t * +text_transform (cairo_t *cr) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0.); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + draw_text_transform (cr); + + cairo_translate (cr, TT_SIZE, TT_SIZE); + cairo_rotate (cr, M_PI); + + pattern = cairo_test_create_pattern_from_png (ctx, png_filename); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + draw_text_transform (cr); + + return cr; +} + +/* And here begins the recording and replaying... */ + +static cairo_t * +record_create (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_recording_surface_create (cairo_surface_get_content (cairo_get_target (target)), NULL); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + return cr; +} + +static cairo_surface_t * +record_get (cairo_t *target) +{ + cairo_surface_t *surface; + + surface = cairo_surface_reference (cairo_get_target (target)); + cairo_destroy (target); + + return surface; +} + +static cairo_test_status_t +record_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + int x, y; + +#if GENERATE_REF + { + cairo_surface_t *image; + uint8_t *data, *tmp; + int stride, bpp; + + surface = cairo_get_target (cr); + + func(cr); + + image = cairo_surface_map_to_image (surface, NULL); + + switch (cairo_image_surface_get_format (image)) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB30: + bpp=4; + break; + case CAIRO_FORMAT_RGB16_565: + bpp=2; + break; + case CAIRO_FORMAT_A8: + bpp=1; + break; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_INVALID: + default: + return CAIRO_TEST_FAILURE; + } + + data = cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image); + + tmp = malloc (stride); + if (tmp == NULL) + return CAIRO_TEST_FAILURE; + + for (y = 0; y < height; y++) { + uint8_t *row = data + y * stride; + for (x = 0; x < width/2; x++) { + memcpy (tmp, row + bpp * x, bpp); + memcpy (row + bpp * x, row + bpp * (width - x - 1), bpp); + memcpy (row + bpp * (width - x - 1), tmp, bpp); + } + } + + for (y = 0; y < height/2; y++) { + memcpy (tmp, data + y * stride, stride); + memcpy (data + y * stride, data + (height - y - 1) * stride, stride); + memcpy (data + (height - y - 1) * stride, tmp, stride); + } + + free (tmp); + + cairo_surface_unmap_image (surface, image); + } +#else + surface = record_get (func (record_create (cr))); + + cairo_scale (cr, -1, -1); + cairo_translate (cr, -width, -height); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + for (y = 0; y < height; y += 2) { + for (x = 0; x < width; x += 2) { + cairo_rectangle (cr, x, y, 2, 2); + cairo_clip (cr); + cairo_paint (cr); + cairo_reset_clip (cr); + } + } +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_whole_replay (cairo_t *cr, cairo_t *(*func)(cairo_t *), int width, int height) +{ + cairo_surface_t *surface; + +#if GENERATE_REF + { + cairo_surface_t *image; + uint8_t *data, *tmp; + int stride, bpp; + int x, y; + + surface = cairo_get_target (cr); + + func(cr); + + image = cairo_surface_map_to_image (surface, NULL); + + switch (cairo_image_surface_get_format (image)) { + case CAIRO_FORMAT_ARGB32: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB30: + bpp=4; + break; + case CAIRO_FORMAT_RGB16_565: + bpp=2; + break; + case CAIRO_FORMAT_A8: + bpp=1; + break; + case CAIRO_FORMAT_A1: + case CAIRO_FORMAT_INVALID: + default: + return CAIRO_TEST_FAILURE; + } + + data = cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image); + + tmp = malloc (stride); + if (tmp == NULL) + return CAIRO_TEST_FAILURE; + + for (y = 0; y < height; y++) { + uint8_t *row = data + y * stride; + for (x = 0; x < width/2; x++) { + memcpy (tmp, row + bpp * x, bpp); + memcpy (row + bpp * x, row + bpp * (width - x - 1), bpp); + memcpy (row + bpp * (width - x - 1), tmp, bpp); + } + } + + for (y = 0; y < height/2; y++) { + memcpy (tmp, data + y * stride, stride); + memcpy (data + y * stride, data + (height - y - 1) * stride, stride); + memcpy (data + (height - y - 1) * stride, tmp, stride); + } + + free (tmp); + + cairo_surface_unmap_image (surface, image); + } +#else + surface = record_get (func (record_create (cr))); + + cairo_scale (cr, -1, -1); + cairo_translate (cr, -width, -height); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + + cairo_paint (cr); +#endif + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +record_paint (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint, width, height); +} + +static cairo_test_status_t +record_paint_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha, width, height); +} + +static cairo_test_status_t +record_paint_alpha_solid_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_solid_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip, width, height); +} + +static cairo_test_status_t +record_paint_alpha_clip_mask (cairo_t *cr, int width, int height) +{ + return record_replay (cr, paint_alpha_clip_mask, width, height); +} + +static cairo_test_status_t +record_fill_alpha (cairo_t *cr, int width, int height) +{ + return record_replay (cr, fill_alpha, width, height); +} + +static cairo_test_status_t +record_self_intersecting (cairo_t *cr, int width, int height) +{ + return record_replay (cr, self_intersecting, width, height); +} + +static cairo_test_status_t +record_select_font_face (cairo_t *cr, int width, int height) +{ + return record_replay (cr, select_font_face, width, height); +} + +static cairo_test_status_t +record_text_transform (cairo_t *cr, int width, int height) +{ + return record_replay (cr, text_transform, width, height); +} + +static cairo_test_status_t +record_whole_paint (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, paint, width, height); +} + +static cairo_test_status_t +record_whole_paint_alpha (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, paint_alpha, width, height); +} + +static cairo_test_status_t +record_whole_paint_alpha_solid_clip (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, paint_alpha_solid_clip, width, height); +} + +static cairo_test_status_t +record_whole_paint_alpha_clip (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, paint_alpha_clip, width, height); +} + +static cairo_test_status_t +record_whole_paint_alpha_clip_mask (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, paint_alpha_clip_mask, width, height); +} + +static cairo_test_status_t +record_whole_fill_alpha (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, fill_alpha, width, height); +} + +static cairo_test_status_t +record_whole_self_intersecting (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, self_intersecting, width, height); +} + +static cairo_test_status_t +record_whole_select_font_face (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, select_font_face, width, height); +} + +static cairo_test_status_t +record_whole_text_transform (cairo_t *cr, int width, int height) +{ + return record_whole_replay (cr, text_transform, width, height); +} + +CAIRO_TEST (recordflip_whole_paint, + "Test replayed calls to cairo_paint", + "paint,record", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, record_whole_paint) +CAIRO_TEST (recordflip_whole_paint_alpha, + "Simple test of cairo_paint_with_alpha", + "record, paint, alpha", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_whole_paint_alpha) +CAIRO_TEST (recordflip_whole_paint_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_whole_paint_alpha_solid_clip) +CAIRO_TEST (recordflip_whole_paint_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_whole_paint_alpha_clip) +CAIRO_TEST (recordflip_whole_paint_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+triangular clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_whole_paint_alpha_clip_mask) +CAIRO_TEST (recordflip_whole_fill_alpha, + "Tests using set_rgba();fill()", + "record,fill, alpha", /* keywords */ + NULL, /* requirements */ + (2*SIZE + 4*PAD), (2*SIZE + 4*PAD), + NULL, record_whole_fill_alpha) +CAIRO_TEST (recordflip_whole_select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "record, font", /* keywords */ + NULL, /* requirements */ + 192, (TEXT_SIZE + 4), + NULL, record_whole_select_font_face) +CAIRO_TEST (recordflip_whole_self_intersecting, + "Test strokes of self-intersecting paths", + "record, stroke, trap", /* keywords */ + NULL, /* requirements */ + 10, 20, + NULL, record_whole_self_intersecting) +CAIRO_TEST (recordflip_whole_text_transform, + "Test various applications of the font matrix", + "record, text, transform", /* keywords */ + NULL, /* requirements */ + TT_SIZE, TT_SIZE, + NULL, record_whole_text_transform) + + +CAIRO_TEST (recordflip_paint, + "Test replayed calls to cairo_paint", + "paint,record", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, record_paint) +CAIRO_TEST (recordflip_paint_alpha, + "Simple test of cairo_paint_with_alpha", + "record, paint, alpha", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha) +CAIRO_TEST (recordflip_paint_alpha_solid_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_solid_clip) +CAIRO_TEST (recordflip_paint_alpha_clip, + "Simple test of cairo_paint_with_alpha+unaligned clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_clip) +CAIRO_TEST (recordflip_paint_alpha_clip_mask, + "Simple test of cairo_paint_with_alpha+triangular clip", + "record, paint, alpha, clip", /* keywords */ + NULL, /* requirements */ + 32, 32, + NULL, record_paint_alpha_clip_mask) +CAIRO_TEST (recordflip_fill_alpha, + "Tests using set_rgba();fill()", + "record,fill, alpha", /* keywords */ + NULL, /* requirements */ + (2*SIZE + 4*PAD), (2*SIZE + 4*PAD), + NULL, record_fill_alpha) +CAIRO_TEST (recordflip_select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "record, font", /* keywords */ + NULL, /* requirements */ + 192, (TEXT_SIZE + 4), + NULL, record_select_font_face) +CAIRO_TEST (recordflip_self_intersecting, + "Test strokes of self-intersecting paths", + "record, stroke, trap", /* keywords */ + NULL, /* requirements */ + 10, 20, + NULL, record_self_intersecting) +CAIRO_TEST (recordflip_text_transform, + "Test various applications of the font matrix", + "record, text, transform", /* keywords */ + NULL, /* requirements */ + TT_SIZE, TT_SIZE, + NULL, record_text_transform) diff --git a/test/recording-surface-extend.c b/test/recording-surface-extend.c new file mode 100644 index 000000000..056654530 --- /dev/null +++ b/test/recording-surface-extend.c @@ -0,0 +1,174 @@ +/* + * Copyright © 2007 Adrian Johnson + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Adrian Johnson + * Chris Wilson + */ + +#include "cairo-test.h" + +#define PAT_WIDTH 120 +#define PAT_HEIGHT 120 +#define SIZE (PAT_WIDTH*2) +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + + +/* This test is designed to test painting a recording surface pattern with + * CAIRO_EXTEND_NONE and a non identity pattern matrix. + */ +static cairo_pattern_t *create_pattern (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_t *cr; + + surface = cairo_surface_create_similar (cairo_get_group_target (target), + CAIRO_CONTENT_COLOR_ALPHA, + PAT_WIDTH, PAT_HEIGHT); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgba (cr, 1, 0, 1, 0.5); + cairo_rectangle (cr, PAT_WIDTH/6.0, PAT_HEIGHT/6.0, PAT_WIDTH/4.0, PAT_HEIGHT/4.0); + cairo_fill (cr); + + cairo_set_source_rgba (cr, 0, 1, 1, 0.5); + cairo_rectangle (cr, PAT_WIDTH/2.0, PAT_HEIGHT/2.0, PAT_WIDTH/4.0, PAT_HEIGHT/4.0); + cairo_fill (cr); + + cairo_set_line_width (cr, 1); + cairo_move_to (cr, PAT_WIDTH/6.0, 0); + cairo_line_to (cr, 0, 0); + cairo_line_to (cr, 0, PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + cairo_move_to (cr, PAT_WIDTH/6.0, PAT_HEIGHT); + cairo_line_to (cr, 0, PAT_HEIGHT); + cairo_line_to (cr, 0, 5*PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_stroke (cr); + cairo_move_to (cr, 5*PAT_WIDTH/6.0, 0); + cairo_line_to (cr, PAT_WIDTH, 0); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + cairo_move_to (cr, 5*PAT_WIDTH/6.0, PAT_HEIGHT); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT); + cairo_line_to (cr, PAT_WIDTH, 5*PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_set_line_width (cr, PAT_WIDTH/10.0); + + cairo_move_to (cr, 0, PAT_HEIGHT/4.0); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT/4.0); + cairo_stroke (cr); + + cairo_move_to (cr, PAT_WIDTH/4.0, 0); + cairo_line_to (cr, PAT_WIDTH/4.0, PAT_WIDTH); + cairo_stroke (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, cairo_extend_t extend) +{ + cairo_pattern_t *pattern; + cairo_matrix_t mat; + + cairo_translate (cr, PAD, PAD); + + pattern = create_pattern (cr); + + cairo_matrix_init_identity (&mat); + cairo_matrix_scale (&mat, 2, 1.5); + cairo_matrix_rotate (&mat, 1); + cairo_matrix_translate (&mat, -PAT_WIDTH/4.0, -PAT_WIDTH/2.0); + cairo_pattern_set_matrix (pattern, &mat); + cairo_pattern_set_extend (pattern, extend); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +none (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_EXTEND_NONE); +} + +static cairo_test_status_t +repeat (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_EXTEND_REPEAT); +} + +static cairo_test_status_t +reflect (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_EXTEND_REFLECT); +} + +static cairo_test_status_t +pad (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_EXTEND_PAD); +} + +CAIRO_TEST (recording_surface_extend_none, + "Paint recording surface pattern with extend modes", + "recording, extend", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, none) +CAIRO_TEST (recording_surface_extend_repeat, + "Paint recording surface pattern with extend modes", + "recording, extend", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, repeat) +CAIRO_TEST (recording_surface_extend_reflect, + "Paint recording surface pattern with extend modes", + "recording, extend", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, reflect) +CAIRO_TEST (recording_surface_extend_pad, + "Paint recording surface pattern with extend modes", + "recording, extend", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, pad) diff --git a/test/recording-surface-pattern.c b/test/recording-surface-pattern.c new file mode 100644 index 000000000..5a5fee2b0 --- /dev/null +++ b/test/recording-surface-pattern.c @@ -0,0 +1,162 @@ +/* + * Copyright © 2007 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define PAT_WIDTH 120 +#define PAT_HEIGHT 120 +#define SIZE (PAT_WIDTH*2) +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + + +/* This test is designed to test painting a recording surface pattern with + * CAIRO_EXTEND_NONE and a non identity pattern matrix. + */ +static cairo_pattern_t *create_pattern (cairo_t *target) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_t *cr; + + surface = cairo_surface_create_similar (cairo_get_group_target (target), + CAIRO_CONTENT_COLOR_ALPHA, + PAT_WIDTH, PAT_HEIGHT); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgba (cr, 1, 0, 1, 0.5); + cairo_rectangle (cr, PAT_WIDTH/6.0, PAT_HEIGHT/6.0, PAT_WIDTH/4.0, PAT_HEIGHT/4.0); + cairo_fill (cr); + + cairo_set_source_rgba (cr, 0, 1, 1, 0.5); + cairo_rectangle (cr, PAT_WIDTH/2.0, PAT_HEIGHT/2.0, PAT_WIDTH/4.0, PAT_HEIGHT/4.0); + cairo_fill (cr); + + cairo_set_line_width (cr, 1); + cairo_move_to (cr, PAT_WIDTH/6.0, 0); + cairo_line_to (cr, 0, 0); + cairo_line_to (cr, 0, PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + cairo_move_to (cr, PAT_WIDTH/6.0, PAT_HEIGHT); + cairo_line_to (cr, 0, PAT_HEIGHT); + cairo_line_to (cr, 0, 5*PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_stroke (cr); + cairo_move_to (cr, 5*PAT_WIDTH/6.0, 0); + cairo_line_to (cr, PAT_WIDTH, 0); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + cairo_move_to (cr, 5*PAT_WIDTH/6.0, PAT_HEIGHT); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT); + cairo_line_to (cr, PAT_WIDTH, 5*PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_set_line_width (cr, PAT_WIDTH/10.0); + + cairo_move_to (cr, 0, PAT_HEIGHT/4.0); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT/4.0); + cairo_stroke (cr); + + cairo_move_to (cr, PAT_WIDTH/4.0, 0); + cairo_line_to (cr, PAT_WIDTH/4.0, PAT_WIDTH); + cairo_stroke (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + return pattern; +} + +static cairo_test_status_t +over (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + cairo_matrix_t mat; + + cairo_translate (cr, PAD, PAD); + + pattern = create_pattern (cr); + + cairo_matrix_init_identity (&mat); + cairo_matrix_scale (&mat, 2, 1.5); + cairo_matrix_rotate (&mat, 1); + cairo_matrix_translate (&mat, -PAT_WIDTH/4.0, -PAT_WIDTH/2.0); + cairo_pattern_set_matrix (pattern, &mat); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE); + + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +source (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + cairo_matrix_t mat; + + cairo_translate (cr, PAD, PAD); + + pattern = create_pattern (cr); + + cairo_matrix_init_identity (&mat); + cairo_matrix_scale (&mat, 2, 1.5); + cairo_matrix_rotate (&mat, 1); + cairo_matrix_translate (&mat, -PAT_WIDTH/4.0, -PAT_WIDTH/2.0); + cairo_pattern_set_matrix (pattern, &mat); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE); + + cairo_set_source (cr, pattern); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (recording_surface_over, + "Paint recording surface pattern with non identity pattern matrix", + "recording", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, over) + +CAIRO_TEST (recording_surface_source, + "Paint recording surface pattern with non identity pattern matrix", + "recording", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, source) diff --git a/test/rectangle-rounding-error.c b/test/rectangle-rounding-error.c new file mode 100644 index 000000000..6ad99ae20 --- /dev/null +++ b/test/rectangle-rounding-error.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2005 Bertram Felgenhauer + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The author makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHOR. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Bertram Felgenhauer + */ + +#include "cairo-test.h" + +/* Test case for: + * + * https://bugs.freedesktop.org/show_bug.cgi?id=4137 + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate(cr, -300, -300); + cairo_scale(cr, 677.0/26, 677.0/26); + cairo_translate(cr, 1, 1); + + /* this should draw a seamless 2x2 rectangle */ + cairo_rectangle(cr, 11, 11, 1, 1); + cairo_rectangle(cr, 11, 12, 1, 1); + cairo_rectangle(cr, 12, 11, 1, 1); + cairo_rectangle(cr, 12, 12, 1, 1); + + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_fill(cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rectangle_rounding_error, + "This demonstrates (or not) a rounding error that causes a gap between " + "two neighbouring rectangles.", + "trap", /* keywords */ + "target=raster", /* requirements */ + 76, 76, + NULL, draw) diff --git a/test/rectilinear-dash-scale.c b/test/rectilinear-dash-scale.c new file mode 100644 index 000000000..34f334561 --- /dev/null +++ b/test/rectilinear-dash-scale.c @@ -0,0 +1,196 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + * + * Based on the original test/rectilinear-stroke.c by Carl D. Worth. + */ + +#include "cairo-test.h" + +#define SIZE 50 + +static void +draw_dashes (cairo_t *cr) +{ + const double dash_square[4] = {4, 2, 2, 2}; + const double dash_butt[4] = {5, 1, 3, 1}; + + cairo_save (cr); + + cairo_set_dash (cr, dash_square, 4, 0); + + cairo_set_line_width (cr, 1.0); + cairo_translate (cr, 1, 1); + + /* Draw everything first with square caps. */ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + + /* Draw horizontal and vertical segments, each in both + * directions. */ + cairo_move_to (cr, 4.5, 0.5); + cairo_rel_line_to (cr, 2.0, 0.0); + + cairo_move_to (cr, 10.5, 4.5); + cairo_rel_line_to (cr, 0.0, 2.0); + + cairo_move_to (cr, 6.5, 10.5); + cairo_rel_line_to (cr, -2.0, 0.0); + + cairo_move_to (cr, 0.5, 6.5); + cairo_rel_line_to (cr, 0.0, -2.0); + + /* Draw right angle turns in four directions. */ + cairo_move_to (cr, 0.5, 2.5); + cairo_rel_line_to (cr, 0.0, -2.0); + cairo_rel_line_to (cr, 2.0, 0.0); + + cairo_move_to (cr, 8.5, 0.5); + cairo_rel_line_to (cr, 2.0, 0.0); + cairo_rel_line_to (cr, 0.0, 2.0); + + cairo_move_to (cr, 10.5, 8.5); + cairo_rel_line_to (cr, 0.0, 2.0); + cairo_rel_line_to (cr, -2.0, 0.0); + + cairo_move_to (cr, 2.5, 10.5); + cairo_rel_line_to (cr, -2.0, 0.0); + cairo_rel_line_to (cr, 0.0, -2.0); + + cairo_stroke (cr); + + /* Draw a closed-path rectangle */ + cairo_rectangle (cr, 0.5, 12.5, 10.0, 10.0); + cairo_set_dash (cr, dash_square, 4, 2); + cairo_stroke (cr); + + cairo_translate (cr, 12, 0); + + /* Now draw the same results, but with butt caps. */ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_dash (cr, dash_butt, 4, 0.0); + + /* Draw horizontal and vertical segments, each in both + * directions. */ + cairo_move_to (cr, 4.0, 0.5); + cairo_rel_line_to (cr, 3.0, 0.0); + + cairo_move_to (cr, 10.5, 4.0); + cairo_rel_line_to (cr, 0.0, 3.0); + + cairo_move_to (cr, 7.0, 10.5); + cairo_rel_line_to (cr, -3.0, 0.0); + + cairo_move_to (cr, 0.5, 7.0); + cairo_rel_line_to (cr, 0.0, -3.0); + + /* Draw right angle turns in four directions. */ + cairo_move_to (cr, 0.5, 3.0); + cairo_rel_line_to (cr, 0.0, -2.5); + cairo_rel_line_to (cr, 2.5, 0.0); + + cairo_move_to (cr, 8.0, 0.5); + cairo_rel_line_to (cr, 2.5, 0.0); + cairo_rel_line_to (cr, 0.0, 2.5); + + cairo_move_to (cr, 10.5, 8.0); + cairo_rel_line_to (cr, 0.0, 2.5); + cairo_rel_line_to (cr, -2.5, 0.0); + + cairo_move_to (cr, 3.0, 10.5); + cairo_rel_line_to (cr, -2.5, 0.0); + cairo_rel_line_to (cr, 0.0, -2.5); + + cairo_stroke (cr); + + /* Draw a closed-path rectangle */ + cairo_set_dash (cr, dash_butt, 4, 2.5); + cairo_rectangle (cr, 0.5, 12.5, 10.0, 10.0); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +dashes (cairo_t *cr) +{ + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + draw_dashes (cr); + + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_translate (cr, 0, SIZE); + cairo_scale (cr, 1, -1); + draw_dashes (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_translate (cr, SIZE, 0); + cairo_scale (cr, -1, 1); + draw_dashes (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + cairo_translate (cr, SIZE, SIZE); + cairo_scale (cr, -1, -1); + draw_dashes (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +aligned (cairo_t *cr, int width, int height) +{ + cairo_scale (cr, 4, 2); + return dashes(cr); +} + +static cairo_test_status_t +unaligned (cairo_t *cr, int width, int height) +{ + cairo_scale (cr, 3.9, 1.9); + return dashes(cr); +} + +CAIRO_TEST (rectilinear_dash_scale, + "Test dashed rectilinear stroke operations (covering only whole pixels) after scaling", + "stroke, dash", /* keywords */ + NULL, /* requirements */ + 4*SIZE, 2*SIZE, + NULL, aligned) + +CAIRO_TEST (rectilinear_dash_scale_unaligned, + "Test dashed rectilinear stroke operations (covering partial pixels) after scaling", + "stroke, dash", /* keywords */ + NULL, /* requirements */ + 4*SIZE, 2*SIZE, + NULL, unaligned) diff --git a/test/rectilinear-dash.c b/test/rectilinear-dash.c new file mode 100644 index 000000000..954a2a042 --- /dev/null +++ b/test/rectilinear-dash.c @@ -0,0 +1,176 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2008 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + * Chris Wilson + * + * Based on the original test/rectilinear-stroke.c by Carl D. Worth. + */ + +#include "cairo-test.h" + +#define SIZE 50 + +static void +draw_dashes (cairo_t *cr) +{ + const double dash_square[4] = {4, 2, 2, 2}; + const double dash_butt[4] = {5, 1, 3, 1}; + + cairo_save (cr); + + cairo_set_dash (cr, dash_square, 4, 0); + + cairo_set_line_width (cr, 1.0); + cairo_translate (cr, 1, 1); + + /* Draw everything first with square caps. */ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + + /* Draw horizontal and vertical segments, each in both + * directions. */ + cairo_move_to (cr, 4.5, 0.5); + cairo_rel_line_to (cr, 2.0, 0.0); + + cairo_move_to (cr, 10.5, 4.5); + cairo_rel_line_to (cr, 0.0, 2.0); + + cairo_move_to (cr, 6.5, 10.5); + cairo_rel_line_to (cr, -2.0, 0.0); + + cairo_move_to (cr, 0.5, 6.5); + cairo_rel_line_to (cr, 0.0, -2.0); + + /* Draw right angle turns in four directions. */ + cairo_move_to (cr, 0.5, 2.5); + cairo_rel_line_to (cr, 0.0, -2.0); + cairo_rel_line_to (cr, 2.0, 0.0); + + cairo_move_to (cr, 8.5, 0.5); + cairo_rel_line_to (cr, 2.0, 0.0); + cairo_rel_line_to (cr, 0.0, 2.0); + + cairo_move_to (cr, 10.5, 8.5); + cairo_rel_line_to (cr, 0.0, 2.0); + cairo_rel_line_to (cr, -2.0, 0.0); + + cairo_move_to (cr, 2.5, 10.5); + cairo_rel_line_to (cr, -2.0, 0.0); + cairo_rel_line_to (cr, 0.0, -2.0); + + cairo_stroke (cr); + + /* Draw a closed-path rectangle */ + cairo_rectangle (cr, 0.5, 12.5, 10.0, 10.0); + cairo_set_dash (cr, dash_square, 4, 2); + cairo_stroke (cr); + + cairo_translate (cr, 12, 0); + + /* Now draw the same results, but with butt caps. */ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_dash (cr, dash_butt, 4, 0.0); + + /* Draw horizontal and vertical segments, each in both + * directions. */ + cairo_move_to (cr, 4.0, 0.5); + cairo_rel_line_to (cr, 3.0, 0.0); + + cairo_move_to (cr, 10.5, 4.0); + cairo_rel_line_to (cr, 0.0, 3.0); + + cairo_move_to (cr, 7.0, 10.5); + cairo_rel_line_to (cr, -3.0, 0.0); + + cairo_move_to (cr, 0.5, 7.0); + cairo_rel_line_to (cr, 0.0, -3.0); + + /* Draw right angle turns in four directions. */ + cairo_move_to (cr, 0.5, 3.0); + cairo_rel_line_to (cr, 0.0, -2.5); + cairo_rel_line_to (cr, 2.5, 0.0); + + cairo_move_to (cr, 8.0, 0.5); + cairo_rel_line_to (cr, 2.5, 0.0); + cairo_rel_line_to (cr, 0.0, 2.5); + + cairo_move_to (cr, 10.5, 8.0); + cairo_rel_line_to (cr, 0.0, 2.5); + cairo_rel_line_to (cr, -2.5, 0.0); + + cairo_move_to (cr, 3.0, 10.5); + cairo_rel_line_to (cr, -2.5, 0.0); + cairo_rel_line_to (cr, 0.0, -2.5); + + cairo_stroke (cr); + + /* Draw a closed-path rectangle */ + cairo_set_dash (cr, dash_butt, 4, 2.5); + cairo_rectangle (cr, 0.5, 12.5, 10.0, 10.0); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + draw_dashes (cr); + + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_translate (cr, 0, height); + cairo_scale (cr, 1, -1); + draw_dashes (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_translate (cr, width, 0); + cairo_scale (cr, -1, 1); + draw_dashes (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + cairo_translate (cr, width, height); + cairo_scale (cr, -1, -1); + draw_dashes (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rectilinear_dash, + "Test dashed rectilinear stroke operations (covering only whole pixels)", + "stroke, dash", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + diff --git a/test/rectilinear-fill.c b/test/rectilinear-fill.c new file mode 100644 index 000000000..3678379ee --- /dev/null +++ b/test/rectilinear-fill.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 24 + +static void +draw_rectangles (cairo_t *cr) +{ + cairo_save (cr); + + /* test constructing single rectangles */ + cairo_rectangle (cr, 0, 0, SIZE/2, 2); + cairo_fill (cr); + + cairo_rectangle (cr, 0, 5, SIZE/2, -2); + cairo_fill (cr); + + cairo_rectangle (cr, SIZE/2, 6, -SIZE/2, 2); + cairo_fill (cr); + + cairo_rectangle (cr, SIZE/2, 11, -SIZE/2, -2); + cairo_fill (cr); + + /* test constructing multiple rectangles */ + cairo_translate (cr, 0, 12); + cairo_rectangle (cr, 0, 0, SIZE/2, 2); + cairo_rectangle (cr, 0, 5, SIZE/2, -2); + cairo_rectangle (cr, SIZE/2, 6, -SIZE/2, 2); + cairo_rectangle (cr, SIZE/2, 11, -SIZE/2, -2); + cairo_fill (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + draw_rectangles (cr); + + /* and check using cw winding */ + cairo_translate (cr, SIZE, SIZE); + cairo_scale (cr, -1, 1); + + draw_rectangles (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rectilinear_fill, + "Test rectilinear fill operations (covering only whole pixels)", + "fill, rectilinear", /* keywords */ + NULL, /* requirements */ + SIZE, 2 * SIZE, + NULL, draw) diff --git a/test/rectilinear-grid.c b/test/rectilinear-grid.c new file mode 100644 index 000000000..6d37c6b8a --- /dev/null +++ b/test/rectilinear-grid.c @@ -0,0 +1,92 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2010 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define SIZE 52 +#define OFFSET 5 +#define DISTANCE 10.25 + +/* + This test checks that boxes not aligned to pixels are drawn + correctly. + + In particular the corners of the boxes are drawn incorrectly by + cairo-image in cairo 1.10.0, because overlapping boxes are passed to + a span converter which assumes disjoint boxes as input. + + This results in corners to be drawn with the wrong shade. +*/ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 4); + cairo_translate (cr, 2*OFFSET, 2*OFFSET); + + for (i = 0; i < 4; i++) { + double x = i * DISTANCE; + + cairo_move_to (cr, x, -OFFSET-0.75); + cairo_line_to (cr, x, SIZE-3*OFFSET-0.25); + + cairo_move_to (cr, -OFFSET-0.75, x); + cairo_line_to (cr, SIZE-3*OFFSET-0.25, x); + } + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +aligned (cairo_t *cr, int width, int height) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + return draw (cr, width, height); +} + +CAIRO_TEST (rectilinear_grid, + "Test rectilinear rasterizer (covering partial pixels)", + "rectilinear", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + +CAIRO_TEST (a1_rectilinear_grid, + "Test rectilinear rasterizer (covering whole pixels)", + "rectilinear", /* keywords */ + "target=raster", /* requirements */ + SIZE, SIZE, + NULL, aligned) diff --git a/test/rectilinear-miter-limit.c b/test/rectilinear-miter-limit.c new file mode 100644 index 000000000..581d98bad --- /dev/null +++ b/test/rectilinear-miter-limit.c @@ -0,0 +1,72 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10 +#define PAD 2 +#define WIDTH (PAD + LINE_WIDTH + PAD) +#define HEIGHT (WIDTH) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_translate (cr, PAD, PAD); + + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_width (cr, LINE_WIDTH); + + /* The default miter limit value of 10.0 guarantees that + * right-angle turns, (in fact, any angle greater than 11 + * degrees), gets a miter rather than a bevel join. The + * rectilinear stroke optimization was originally written in a + * buggy way that did not respect the miter limit, (that is, + * inappropriately drawing miter joins when the miter limit would + * turn them into bevels). So we draw here with a miter limit of + * 1.0 to force all miter joins into bevels. */ + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + cairo_set_miter_limit (cr, 1.0); + + cairo_move_to (cr, LINE_WIDTH / 2.0, LINE_WIDTH); + cairo_rel_line_to (cr, 0, - LINE_WIDTH / 2.0); + cairo_rel_line_to (cr, LINE_WIDTH / 2.0, 0); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rectilinear_miter_limit, + "Test that the rectilinear stroke optimization doesn't break cairo_set_miter_limit", + "miter, stroke, stress", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/rectilinear-stroke.c b/test/rectilinear-stroke.c new file mode 100644 index 000000000..e05ff8c2e --- /dev/null +++ b/test/rectilinear-stroke.c @@ -0,0 +1,139 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 25 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + cairo_set_line_width (cr, 1.0); + cairo_translate (cr, 1, 1); + + /* Draw everything first with square caps. */ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + + /* Draw horizontal and vertical segments, each in both + * directions. */ + cairo_move_to (cr, 4.5, 0.5); + cairo_rel_line_to (cr, 2.0, 0.0); + + cairo_move_to (cr, 10.5, 4.5); + cairo_rel_line_to (cr, 0.0, 2.0); + + cairo_move_to (cr, 6.5, 10.5); + cairo_rel_line_to (cr, -2.0, 0.0); + + cairo_move_to (cr, 0.5, 6.5); + cairo_rel_line_to (cr, 0.0, -2.0); + + /* Draw right angle turns in four directions. */ + cairo_move_to (cr, 0.5, 2.5); + cairo_rel_line_to (cr, 0.0, -2.0); + cairo_rel_line_to (cr, 2.0, 0.0); + + cairo_move_to (cr, 8.5, 0.5); + cairo_rel_line_to (cr, 2.0, 0.0); + cairo_rel_line_to (cr, 0.0, 2.0); + + cairo_move_to (cr, 10.5, 8.5); + cairo_rel_line_to (cr, 0.0, 2.0); + cairo_rel_line_to (cr, -2.0, 0.0); + + cairo_move_to (cr, 2.5, 10.5); + cairo_rel_line_to (cr, -2.0, 0.0); + cairo_rel_line_to (cr, 0.0, -2.0); + + /* Draw a closed-path rectangle */ + cairo_rectangle (cr, 0.5, 12.5, 10.0, 10.0); + + cairo_stroke (cr); + + cairo_translate (cr, 12, 0); + + /* Now draw the same results, but with butt caps. */ + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + + /* Draw horizontal and vertical segments, each in both + * directions. */ + cairo_move_to (cr, 4.0, 0.5); + cairo_rel_line_to (cr, 3.0, 0.0); + + cairo_move_to (cr, 10.5, 4.0); + cairo_rel_line_to (cr, 0.0, 3.0); + + cairo_move_to (cr, 7.0, 10.5); + cairo_rel_line_to (cr, -3.0, 0.0); + + cairo_move_to (cr, 0.5, 7.0); + cairo_rel_line_to (cr, 0.0, -3.0); + + /* Draw right angle turns in four directions. */ + cairo_move_to (cr, 0.5, 3.0); + cairo_rel_line_to (cr, 0.0, -2.5); + cairo_rel_line_to (cr, 2.5, 0.0); + + cairo_move_to (cr, 8.0, 0.5); + cairo_rel_line_to (cr, 2.5, 0.0); + cairo_rel_line_to (cr, 0.0, 2.5); + + cairo_move_to (cr, 10.5, 8.0); + cairo_rel_line_to (cr, 0.0, 2.5); + cairo_rel_line_to (cr, -2.5, 0.0); + + cairo_move_to (cr, 3.0, 10.5); + cairo_rel_line_to (cr, -2.5, 0.0); + cairo_rel_line_to (cr, 0.0, -2.5); + + /* Draw a closed-path rectangle */ + cairo_rectangle (cr, 0.5, 12.5, 10.0, 10.0); + + /* Draw a path that is rectilinear initially, but not completely */ + /* We draw this out of the target window. The bug that caused this + * addition was leaks if part of the path was rectilinear but not + * completely */ + cairo_move_to (cr, 3.0, 30.5); + cairo_rel_line_to (cr, -2.5, 0.0); + cairo_rel_line_to (cr, +2.5, +2.5); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rectilinear_stroke, + "Test rectilinear stroke operations (covering only whole pixels)", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + diff --git a/test/reference/a1-bug.base.argb32.ref.png b/test/reference/a1-bug.base.argb32.ref.png new file mode 100644 index 000000000..4b08e0683 Binary files /dev/null and b/test/reference/a1-bug.base.argb32.ref.png differ diff --git a/test/reference/a1-bug.base.rgb24.ref.png b/test/reference/a1-bug.base.rgb24.ref.png new file mode 100644 index 000000000..4b08e0683 Binary files /dev/null and b/test/reference/a1-bug.base.rgb24.ref.png differ diff --git a/test/reference/a1-bug.image16.ref.png b/test/reference/a1-bug.image16.ref.png new file mode 100644 index 000000000..48ce4b65a Binary files /dev/null and b/test/reference/a1-bug.image16.ref.png differ diff --git a/test/reference/a1-bug.mask.argb32.ref.png b/test/reference/a1-bug.mask.argb32.ref.png new file mode 100644 index 000000000..f9ae8a87e Binary files /dev/null and b/test/reference/a1-bug.mask.argb32.ref.png differ diff --git a/test/reference/a1-bug.mask.rgb24.ref.png b/test/reference/a1-bug.mask.rgb24.ref.png new file mode 100644 index 000000000..f9ae8a87e Binary files /dev/null and b/test/reference/a1-bug.mask.rgb24.ref.png differ diff --git a/test/reference/a1-bug.quartz.xfail.png b/test/reference/a1-bug.quartz.xfail.png new file mode 100644 index 000000000..4ed379365 Binary files /dev/null and b/test/reference/a1-bug.quartz.xfail.png differ diff --git a/test/reference/a1-bug.ref.png b/test/reference/a1-bug.ref.png new file mode 100644 index 000000000..dc6ff931b Binary files /dev/null and b/test/reference/a1-bug.ref.png differ diff --git a/test/reference/a1-bug.traps.argb32.ref.png b/test/reference/a1-bug.traps.argb32.ref.png new file mode 100644 index 000000000..4b08e0683 Binary files /dev/null and b/test/reference/a1-bug.traps.argb32.ref.png differ diff --git a/test/reference/a1-bug.traps.rgb24.ref.png b/test/reference/a1-bug.traps.rgb24.ref.png new file mode 100644 index 000000000..4b08e0683 Binary files /dev/null and b/test/reference/a1-bug.traps.rgb24.ref.png differ diff --git a/test/reference/a1-clip-fill-equal.base.argb32.ref.png b/test/reference/a1-clip-fill-equal.base.argb32.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-fill-equal.base.argb32.ref.png differ diff --git a/test/reference/a1-clip-fill-equal.base.rgb24.ref.png b/test/reference/a1-clip-fill-equal.base.rgb24.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-fill-equal.base.rgb24.ref.png differ diff --git a/test/reference/a1-clip-fill-equal.ref.png b/test/reference/a1-clip-fill-equal.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-fill-equal.ref.png differ diff --git a/test/reference/a1-clip-fill-rule.base.argb32.ref.png b/test/reference/a1-clip-fill-rule.base.argb32.ref.png new file mode 100644 index 000000000..c3ba9dd5f Binary files /dev/null and b/test/reference/a1-clip-fill-rule.base.argb32.ref.png differ diff --git a/test/reference/a1-clip-fill-rule.base.rgb24.ref.png b/test/reference/a1-clip-fill-rule.base.rgb24.ref.png new file mode 100644 index 000000000..6fe9346ba Binary files /dev/null and b/test/reference/a1-clip-fill-rule.base.rgb24.ref.png differ diff --git a/test/reference/a1-clip-fill-rule.ref.png b/test/reference/a1-clip-fill-rule.ref.png new file mode 100644 index 000000000..c3ba9dd5f Binary files /dev/null and b/test/reference/a1-clip-fill-rule.ref.png differ diff --git a/test/reference/a1-clip-fill.base.argb32.ref.png b/test/reference/a1-clip-fill.base.argb32.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-fill.base.argb32.ref.png differ diff --git a/test/reference/a1-clip-fill.base.rgb24.ref.png b/test/reference/a1-clip-fill.base.rgb24.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-fill.base.rgb24.ref.png differ diff --git a/test/reference/a1-clip-fill.ref.png b/test/reference/a1-clip-fill.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-fill.ref.png differ diff --git a/test/reference/a1-clip-paint.base.argb32.ref.png b/test/reference/a1-clip-paint.base.argb32.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-paint.base.argb32.ref.png differ diff --git a/test/reference/a1-clip-paint.base.rgb24.ref.png b/test/reference/a1-clip-paint.base.rgb24.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-paint.base.rgb24.ref.png differ diff --git a/test/reference/a1-clip-paint.ref.png b/test/reference/a1-clip-paint.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-paint.ref.png differ diff --git a/test/reference/a1-clip-stroke.base.argb32.ref.png b/test/reference/a1-clip-stroke.base.argb32.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-stroke.base.argb32.ref.png differ diff --git a/test/reference/a1-clip-stroke.base.rgb24.ref.png b/test/reference/a1-clip-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-stroke.base.rgb24.ref.png differ diff --git a/test/reference/a1-clip-stroke.ref.png b/test/reference/a1-clip-stroke.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-clip-stroke.ref.png differ diff --git a/test/reference/a1-fill.base.argb32.ref.png b/test/reference/a1-fill.base.argb32.ref.png new file mode 100644 index 000000000..e40202bf9 Binary files /dev/null and b/test/reference/a1-fill.base.argb32.ref.png differ diff --git a/test/reference/a1-fill.base.rgb24.ref.png b/test/reference/a1-fill.base.rgb24.ref.png new file mode 100644 index 000000000..e40202bf9 Binary files /dev/null and b/test/reference/a1-fill.base.rgb24.ref.png differ diff --git a/test/reference/a1-fill.ref.png b/test/reference/a1-fill.ref.png new file mode 100644 index 000000000..e40202bf9 Binary files /dev/null and b/test/reference/a1-fill.ref.png differ diff --git a/test/reference/a1-image-sample.base.argb32.ref.png b/test/reference/a1-image-sample.base.argb32.ref.png new file mode 100644 index 000000000..b8fd4570d Binary files /dev/null and b/test/reference/a1-image-sample.base.argb32.ref.png differ diff --git a/test/reference/a1-image-sample.base.rgb24.ref.png b/test/reference/a1-image-sample.base.rgb24.ref.png new file mode 100644 index 000000000..b8fd4570d Binary files /dev/null and b/test/reference/a1-image-sample.base.rgb24.ref.png differ diff --git a/test/reference/a1-image-sample.gl.xfail.png b/test/reference/a1-image-sample.gl.xfail.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-image-sample.gl.xfail.png differ diff --git a/test/reference/a1-image-sample.ref.png b/test/reference/a1-image-sample.ref.png new file mode 100644 index 000000000..b4e81eb35 Binary files /dev/null and b/test/reference/a1-image-sample.ref.png differ diff --git a/test/reference/a1-line-width.base.argb32.ref.png b/test/reference/a1-line-width.base.argb32.ref.png new file mode 100644 index 000000000..35d9cad60 Binary files /dev/null and b/test/reference/a1-line-width.base.argb32.ref.png differ diff --git a/test/reference/a1-line-width.base.rgb24.ref.png b/test/reference/a1-line-width.base.rgb24.ref.png new file mode 100644 index 000000000..35d9cad60 Binary files /dev/null and b/test/reference/a1-line-width.base.rgb24.ref.png differ diff --git a/test/reference/a1-line-width.pdf.ref.png b/test/reference/a1-line-width.pdf.ref.png new file mode 100644 index 000000000..41a06e769 Binary files /dev/null and b/test/reference/a1-line-width.pdf.ref.png differ diff --git a/test/reference/a1-line-width.ps.ref.png b/test/reference/a1-line-width.ps.ref.png new file mode 100644 index 000000000..c52f8d874 Binary files /dev/null and b/test/reference/a1-line-width.ps.ref.png differ diff --git a/test/reference/a1-line-width.ref.png b/test/reference/a1-line-width.ref.png new file mode 100644 index 000000000..35d9cad60 Binary files /dev/null and b/test/reference/a1-line-width.ref.png differ diff --git a/test/reference/a1-mask-sample.base.argb32.ref.png b/test/reference/a1-mask-sample.base.argb32.ref.png new file mode 100644 index 000000000..b8fd4570d Binary files /dev/null and b/test/reference/a1-mask-sample.base.argb32.ref.png differ diff --git a/test/reference/a1-mask-sample.base.rgb24.ref.png b/test/reference/a1-mask-sample.base.rgb24.ref.png new file mode 100644 index 000000000..b8fd4570d Binary files /dev/null and b/test/reference/a1-mask-sample.base.rgb24.ref.png differ diff --git a/test/reference/a1-mask-sample.ref.png b/test/reference/a1-mask-sample.ref.png new file mode 100644 index 000000000..b4e81eb35 Binary files /dev/null and b/test/reference/a1-mask-sample.ref.png differ diff --git a/test/reference/a1-mask.base.argb32.ref.png b/test/reference/a1-mask.base.argb32.ref.png new file mode 100644 index 000000000..864fc1031 Binary files /dev/null and b/test/reference/a1-mask.base.argb32.ref.png differ diff --git a/test/reference/a1-mask.base.rgb24.ref.png b/test/reference/a1-mask.base.rgb24.ref.png new file mode 100644 index 000000000..864fc1031 Binary files /dev/null and b/test/reference/a1-mask.base.rgb24.ref.png differ diff --git a/test/reference/a1-mask.ref.png b/test/reference/a1-mask.ref.png new file mode 100644 index 000000000..ac4d97aca Binary files /dev/null and b/test/reference/a1-mask.ref.png differ diff --git a/test/reference/a1-rasterisation-rectangles.base.argb32.ref.png b/test/reference/a1-rasterisation-rectangles.base.argb32.ref.png new file mode 100644 index 000000000..784cf873e Binary files /dev/null and b/test/reference/a1-rasterisation-rectangles.base.argb32.ref.png differ diff --git a/test/reference/a1-rasterisation-rectangles.base.rgb24.ref.png b/test/reference/a1-rasterisation-rectangles.base.rgb24.ref.png new file mode 100644 index 000000000..784cf873e Binary files /dev/null and b/test/reference/a1-rasterisation-rectangles.base.rgb24.ref.png differ diff --git a/test/reference/a1-rasterisation-rectangles.quartz.xfail.png b/test/reference/a1-rasterisation-rectangles.quartz.xfail.png new file mode 100644 index 000000000..f8f3bf865 Binary files /dev/null and b/test/reference/a1-rasterisation-rectangles.quartz.xfail.png differ diff --git a/test/reference/a1-rasterisation-rectangles.ref.png b/test/reference/a1-rasterisation-rectangles.ref.png new file mode 100644 index 000000000..784cf873e Binary files /dev/null and b/test/reference/a1-rasterisation-rectangles.ref.png differ diff --git a/test/reference/a1-rasterisation-triangles.base.argb32.ref.png b/test/reference/a1-rasterisation-triangles.base.argb32.ref.png new file mode 100644 index 000000000..784cf873e Binary files /dev/null and b/test/reference/a1-rasterisation-triangles.base.argb32.ref.png differ diff --git a/test/reference/a1-rasterisation-triangles.base.rgb24.ref.png b/test/reference/a1-rasterisation-triangles.base.rgb24.ref.png new file mode 100644 index 000000000..784cf873e Binary files /dev/null and b/test/reference/a1-rasterisation-triangles.base.rgb24.ref.png differ diff --git a/test/reference/a1-rasterisation-triangles.quartz.xfail.png b/test/reference/a1-rasterisation-triangles.quartz.xfail.png new file mode 100644 index 000000000..f8f3bf865 Binary files /dev/null and b/test/reference/a1-rasterisation-triangles.quartz.xfail.png differ diff --git a/test/reference/a1-rasterisation-triangles.ref.png b/test/reference/a1-rasterisation-triangles.ref.png new file mode 100644 index 000000000..784cf873e Binary files /dev/null and b/test/reference/a1-rasterisation-triangles.ref.png differ diff --git a/test/reference/a1-rectilinear-grid.base.argb32.ref.png b/test/reference/a1-rectilinear-grid.base.argb32.ref.png new file mode 100644 index 000000000..2dfb85e13 Binary files /dev/null and b/test/reference/a1-rectilinear-grid.base.argb32.ref.png differ diff --git a/test/reference/a1-rectilinear-grid.base.rgb24.ref.png b/test/reference/a1-rectilinear-grid.base.rgb24.ref.png new file mode 100644 index 000000000..2dfb85e13 Binary files /dev/null and b/test/reference/a1-rectilinear-grid.base.rgb24.ref.png differ diff --git a/test/reference/a1-rectilinear-grid.ref.png b/test/reference/a1-rectilinear-grid.ref.png new file mode 100644 index 000000000..2dfb85e13 Binary files /dev/null and b/test/reference/a1-rectilinear-grid.ref.png differ diff --git a/test/reference/a1-sample.base.argb32.ref.png b/test/reference/a1-sample.base.argb32.ref.png new file mode 100644 index 000000000..4c6131ce0 Binary files /dev/null and b/test/reference/a1-sample.base.argb32.ref.png differ diff --git a/test/reference/a1-sample.base.rgb24.ref.png b/test/reference/a1-sample.base.rgb24.ref.png new file mode 100644 index 000000000..4c6131ce0 Binary files /dev/null and b/test/reference/a1-sample.base.rgb24.ref.png differ diff --git a/test/reference/a1-sample.ref.png b/test/reference/a1-sample.ref.png new file mode 100644 index 000000000..4c6131ce0 Binary files /dev/null and b/test/reference/a1-sample.ref.png differ diff --git a/test/reference/a1-tiger.base.argb32.ref.png b/test/reference/a1-tiger.base.argb32.ref.png new file mode 100644 index 000000000..38472822f Binary files /dev/null and b/test/reference/a1-tiger.base.argb32.ref.png differ diff --git a/test/reference/a1-tiger.base.rgb24.ref.png b/test/reference/a1-tiger.base.rgb24.ref.png new file mode 100644 index 000000000..38472822f Binary files /dev/null and b/test/reference/a1-tiger.base.rgb24.ref.png differ diff --git a/test/reference/a1-tiger.mask.argb32.ref.png b/test/reference/a1-tiger.mask.argb32.ref.png new file mode 100644 index 000000000..9a62af760 Binary files /dev/null and b/test/reference/a1-tiger.mask.argb32.ref.png differ diff --git a/test/reference/a1-tiger.mask.rgb24.ref.png b/test/reference/a1-tiger.mask.rgb24.ref.png new file mode 100644 index 000000000..9a62af760 Binary files /dev/null and b/test/reference/a1-tiger.mask.rgb24.ref.png differ diff --git a/test/reference/a1-tiger.ref.png b/test/reference/a1-tiger.ref.png new file mode 100644 index 000000000..cc641e290 Binary files /dev/null and b/test/reference/a1-tiger.ref.png differ diff --git a/test/reference/a1-tiger.traps.argb32.ref.png b/test/reference/a1-tiger.traps.argb32.ref.png new file mode 100644 index 000000000..cc641e290 Binary files /dev/null and b/test/reference/a1-tiger.traps.argb32.ref.png differ diff --git a/test/reference/a1-tiger.traps.rgb24.ref.png b/test/reference/a1-tiger.traps.rgb24.ref.png new file mode 100644 index 000000000..cc641e290 Binary files /dev/null and b/test/reference/a1-tiger.traps.rgb24.ref.png differ diff --git a/test/reference/a1-traps-sample.base.argb32.ref.png b/test/reference/a1-traps-sample.base.argb32.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-traps-sample.base.argb32.ref.png differ diff --git a/test/reference/a1-traps-sample.base.rgb24.ref.png b/test/reference/a1-traps-sample.base.rgb24.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-traps-sample.base.rgb24.ref.png differ diff --git a/test/reference/a1-traps-sample.quartz.xfail.png b/test/reference/a1-traps-sample.quartz.xfail.png new file mode 100644 index 000000000..c89f4fe05 Binary files /dev/null and b/test/reference/a1-traps-sample.quartz.xfail.png differ diff --git a/test/reference/a1-traps-sample.ref.png b/test/reference/a1-traps-sample.ref.png new file mode 100644 index 000000000..384ba4a04 Binary files /dev/null and b/test/reference/a1-traps-sample.ref.png differ diff --git a/test/reference/a8-clear.base.argb32.ref.png b/test/reference/a8-clear.base.argb32.ref.png new file mode 100644 index 000000000..52010808c Binary files /dev/null and b/test/reference/a8-clear.base.argb32.ref.png differ diff --git a/test/reference/a8-clear.base.rgb24.ref.png b/test/reference/a8-clear.base.rgb24.ref.png new file mode 100644 index 000000000..52010808c Binary files /dev/null and b/test/reference/a8-clear.base.rgb24.ref.png differ diff --git a/test/reference/a8-clear.quartz.ref.png b/test/reference/a8-clear.quartz.ref.png new file mode 100644 index 000000000..5b7c67fe9 Binary files /dev/null and b/test/reference/a8-clear.quartz.ref.png differ diff --git a/test/reference/a8-clear.ref.png b/test/reference/a8-clear.ref.png new file mode 100644 index 000000000..dbf45492c Binary files /dev/null and b/test/reference/a8-clear.ref.png differ diff --git a/test/reference/a8-clear.traps.argb32.ref.png b/test/reference/a8-clear.traps.argb32.ref.png new file mode 100644 index 000000000..52010808c Binary files /dev/null and b/test/reference/a8-clear.traps.argb32.ref.png differ diff --git a/test/reference/a8-clear.traps.rgb24.ref.png b/test/reference/a8-clear.traps.rgb24.ref.png new file mode 100644 index 000000000..52010808c Binary files /dev/null and b/test/reference/a8-clear.traps.rgb24.ref.png differ diff --git a/test/reference/a8-mask.base.argb32.ref.png b/test/reference/a8-mask.base.argb32.ref.png new file mode 100644 index 000000000..e0503d93e Binary files /dev/null and b/test/reference/a8-mask.base.argb32.ref.png differ diff --git a/test/reference/a8-mask.base.rgb24.ref.png b/test/reference/a8-mask.base.rgb24.ref.png new file mode 100644 index 000000000..e0503d93e Binary files /dev/null and b/test/reference/a8-mask.base.rgb24.ref.png differ diff --git a/test/reference/a8-mask.ref.png b/test/reference/a8-mask.ref.png new file mode 100644 index 000000000..38556156c Binary files /dev/null and b/test/reference/a8-mask.ref.png differ diff --git a/test/reference/aliasing.base.argb32.ref.png b/test/reference/aliasing.base.argb32.ref.png new file mode 100644 index 000000000..a88dbe272 Binary files /dev/null and b/test/reference/aliasing.base.argb32.ref.png differ diff --git a/test/reference/aliasing.base.rgb24.ref.png b/test/reference/aliasing.base.rgb24.ref.png new file mode 100644 index 000000000..a88dbe272 Binary files /dev/null and b/test/reference/aliasing.base.rgb24.ref.png differ diff --git a/test/reference/aliasing.image16.ref.png b/test/reference/aliasing.image16.ref.png new file mode 100644 index 000000000..c76333337 Binary files /dev/null and b/test/reference/aliasing.image16.ref.png differ diff --git a/test/reference/aliasing.quartz.ref.png b/test/reference/aliasing.quartz.ref.png new file mode 100644 index 000000000..f4b6e2217 Binary files /dev/null and b/test/reference/aliasing.quartz.ref.png differ diff --git a/test/reference/aliasing.ref.png b/test/reference/aliasing.ref.png new file mode 100644 index 000000000..35bdb1857 Binary files /dev/null and b/test/reference/aliasing.ref.png differ diff --git a/test/reference/aliasing.traps.argb32.ref.png b/test/reference/aliasing.traps.argb32.ref.png new file mode 100644 index 000000000..a88dbe272 Binary files /dev/null and b/test/reference/aliasing.traps.argb32.ref.png differ diff --git a/test/reference/aliasing.traps.rgb24.ref.png b/test/reference/aliasing.traps.rgb24.ref.png new file mode 100644 index 000000000..a88dbe272 Binary files /dev/null and b/test/reference/aliasing.traps.rgb24.ref.png differ diff --git a/test/reference/alpha-similar.base.argb32.ref.png b/test/reference/alpha-similar.base.argb32.ref.png new file mode 100644 index 000000000..9e1bfaace Binary files /dev/null and b/test/reference/alpha-similar.base.argb32.ref.png differ diff --git a/test/reference/alpha-similar.base.rgb24.ref.png b/test/reference/alpha-similar.base.rgb24.ref.png new file mode 100644 index 000000000..a1f5280a4 Binary files /dev/null and b/test/reference/alpha-similar.base.rgb24.ref.png differ diff --git a/test/reference/alpha-similar.gl.argb32.xfail.png b/test/reference/alpha-similar.gl.argb32.xfail.png new file mode 100644 index 000000000..579aae131 Binary files /dev/null and b/test/reference/alpha-similar.gl.argb32.xfail.png differ diff --git a/test/reference/alpha-similar.gl.rgb24.xfail.png b/test/reference/alpha-similar.gl.rgb24.xfail.png new file mode 100644 index 000000000..86366d26f Binary files /dev/null and b/test/reference/alpha-similar.gl.rgb24.xfail.png differ diff --git a/test/reference/alpha-similar.pdf.argb32.xfail.png b/test/reference/alpha-similar.pdf.argb32.xfail.png new file mode 100644 index 000000000..75aa6005c Binary files /dev/null and b/test/reference/alpha-similar.pdf.argb32.xfail.png differ diff --git a/test/reference/alpha-similar.pdf.rgb24.xfail.png b/test/reference/alpha-similar.pdf.rgb24.xfail.png new file mode 100644 index 000000000..86366d26f Binary files /dev/null and b/test/reference/alpha-similar.pdf.rgb24.xfail.png differ diff --git a/test/reference/alpha-similar.ps.argb32.xfail.png b/test/reference/alpha-similar.ps.argb32.xfail.png new file mode 100644 index 000000000..75aa6005c Binary files /dev/null and b/test/reference/alpha-similar.ps.argb32.xfail.png differ diff --git a/test/reference/alpha-similar.ps.rgb24.xfail.png b/test/reference/alpha-similar.ps.rgb24.xfail.png new file mode 100644 index 000000000..15a6aa114 Binary files /dev/null and b/test/reference/alpha-similar.ps.rgb24.xfail.png differ diff --git a/test/reference/alpha-similar.ref.png b/test/reference/alpha-similar.ref.png new file mode 100644 index 000000000..9e1bfaace Binary files /dev/null and b/test/reference/alpha-similar.ref.png differ diff --git a/test/reference/alpha-similar.svg.argb32.xfail.png b/test/reference/alpha-similar.svg.argb32.xfail.png new file mode 100644 index 000000000..2ade632d6 Binary files /dev/null and b/test/reference/alpha-similar.svg.argb32.xfail.png differ diff --git a/test/reference/alpha-similar.svg.rgb24.xfail.png b/test/reference/alpha-similar.svg.rgb24.xfail.png new file mode 100644 index 000000000..c23689855 Binary files /dev/null and b/test/reference/alpha-similar.svg.rgb24.xfail.png differ diff --git a/test/reference/api-special-cases.base.argb32.ref.png b/test/reference/api-special-cases.base.argb32.ref.png new file mode 100644 index 000000000..56b88a935 Binary files /dev/null and b/test/reference/api-special-cases.base.argb32.ref.png differ diff --git a/test/reference/api-special-cases.base.rgb24.ref.png b/test/reference/api-special-cases.base.rgb24.ref.png new file mode 100644 index 000000000..56b88a935 Binary files /dev/null and b/test/reference/api-special-cases.base.rgb24.ref.png differ diff --git a/test/reference/api-special-cases.ref.png b/test/reference/api-special-cases.ref.png new file mode 100644 index 000000000..56b88a935 Binary files /dev/null and b/test/reference/api-special-cases.ref.png differ diff --git a/test/reference/arc-direction.base.argb32.ref.png b/test/reference/arc-direction.base.argb32.ref.png new file mode 100644 index 000000000..2790a2b75 Binary files /dev/null and b/test/reference/arc-direction.base.argb32.ref.png differ diff --git a/test/reference/arc-direction.base.rgb24.ref.png b/test/reference/arc-direction.base.rgb24.ref.png new file mode 100644 index 000000000..2790a2b75 Binary files /dev/null and b/test/reference/arc-direction.base.rgb24.ref.png differ diff --git a/test/reference/arc-direction.ps.ref.png b/test/reference/arc-direction.ps.ref.png new file mode 100644 index 000000000..902ab4578 Binary files /dev/null and b/test/reference/arc-direction.ps.ref.png differ diff --git a/test/reference/arc-direction.ref.png b/test/reference/arc-direction.ref.png new file mode 100644 index 000000000..05ff4107c Binary files /dev/null and b/test/reference/arc-direction.ref.png differ diff --git a/test/reference/arc-direction.traps.ref.png b/test/reference/arc-direction.traps.ref.png new file mode 100644 index 000000000..2790a2b75 Binary files /dev/null and b/test/reference/arc-direction.traps.ref.png differ diff --git a/test/reference/arc-infinite-loop.base.argb32.ref.png b/test/reference/arc-infinite-loop.base.argb32.ref.png new file mode 100644 index 000000000..82d645f30 Binary files /dev/null and b/test/reference/arc-infinite-loop.base.argb32.ref.png differ diff --git a/test/reference/arc-infinite-loop.base.rgb24.ref.png b/test/reference/arc-infinite-loop.base.rgb24.ref.png new file mode 100644 index 000000000..82d645f30 Binary files /dev/null and b/test/reference/arc-infinite-loop.base.rgb24.ref.png differ diff --git a/test/reference/arc-infinite-loop.ref.png b/test/reference/arc-infinite-loop.ref.png new file mode 100644 index 000000000..82d645f30 Binary files /dev/null and b/test/reference/arc-infinite-loop.ref.png differ diff --git a/test/reference/arc-looping-dash.image16.ref.png b/test/reference/arc-looping-dash.image16.ref.png new file mode 100644 index 000000000..addc93c13 Binary files /dev/null and b/test/reference/arc-looping-dash.image16.ref.png differ diff --git a/test/reference/arc-looping-dash.mask.argb32.ref.png b/test/reference/arc-looping-dash.mask.argb32.ref.png new file mode 100644 index 000000000..516e66ce0 Binary files /dev/null and b/test/reference/arc-looping-dash.mask.argb32.ref.png differ diff --git a/test/reference/arc-looping-dash.mask.rgb24.ref.png b/test/reference/arc-looping-dash.mask.rgb24.ref.png new file mode 100644 index 000000000..516e66ce0 Binary files /dev/null and b/test/reference/arc-looping-dash.mask.rgb24.ref.png differ diff --git a/test/reference/arc-looping-dash.ps.ref.png b/test/reference/arc-looping-dash.ps.ref.png new file mode 100644 index 000000000..ab19b199f Binary files /dev/null and b/test/reference/arc-looping-dash.ps.ref.png differ diff --git a/test/reference/arc-looping-dash.quartz.ref.png b/test/reference/arc-looping-dash.quartz.ref.png new file mode 100644 index 000000000..70304ca85 Binary files /dev/null and b/test/reference/arc-looping-dash.quartz.ref.png differ diff --git a/test/reference/arc-looping-dash.ref.png b/test/reference/arc-looping-dash.ref.png new file mode 100644 index 000000000..516e66ce0 Binary files /dev/null and b/test/reference/arc-looping-dash.ref.png differ diff --git a/test/reference/arc-looping-dash.traps.argb32.ref.png b/test/reference/arc-looping-dash.traps.argb32.ref.png new file mode 100644 index 000000000..58801ccd0 Binary files /dev/null and b/test/reference/arc-looping-dash.traps.argb32.ref.png differ diff --git a/test/reference/arc-looping-dash.traps.rgb24.ref.png b/test/reference/arc-looping-dash.traps.rgb24.ref.png new file mode 100644 index 000000000..58801ccd0 Binary files /dev/null and b/test/reference/arc-looping-dash.traps.rgb24.ref.png differ diff --git a/test/reference/big-empty-box.base.argb32.ref.png b/test/reference/big-empty-box.base.argb32.ref.png new file mode 100644 index 000000000..a88d3b6de Binary files /dev/null and b/test/reference/big-empty-box.base.argb32.ref.png differ diff --git a/test/reference/big-empty-box.base.rgb24.ref.png b/test/reference/big-empty-box.base.rgb24.ref.png new file mode 100644 index 000000000..6c2ca32f0 Binary files /dev/null and b/test/reference/big-empty-box.base.rgb24.ref.png differ diff --git a/test/reference/big-empty-box.ref.png b/test/reference/big-empty-box.ref.png new file mode 100644 index 000000000..a88d3b6de Binary files /dev/null and b/test/reference/big-empty-box.ref.png differ diff --git a/test/reference/big-empty-triangle.base.argb32.ref.png b/test/reference/big-empty-triangle.base.argb32.ref.png new file mode 100644 index 000000000..a88d3b6de Binary files /dev/null and b/test/reference/big-empty-triangle.base.argb32.ref.png differ diff --git a/test/reference/big-empty-triangle.base.rgb24.ref.png b/test/reference/big-empty-triangle.base.rgb24.ref.png new file mode 100644 index 000000000..6c2ca32f0 Binary files /dev/null and b/test/reference/big-empty-triangle.base.rgb24.ref.png differ diff --git a/test/reference/big-empty-triangle.ref.png b/test/reference/big-empty-triangle.ref.png new file mode 100644 index 000000000..a88d3b6de Binary files /dev/null and b/test/reference/big-empty-triangle.ref.png differ diff --git a/test/reference/big-line.base.argb32.ref.png b/test/reference/big-line.base.argb32.ref.png new file mode 100644 index 000000000..35d2e36ab Binary files /dev/null and b/test/reference/big-line.base.argb32.ref.png differ diff --git a/test/reference/big-line.base.rgb24.ref.png b/test/reference/big-line.base.rgb24.ref.png new file mode 100644 index 000000000..35d2e36ab Binary files /dev/null and b/test/reference/big-line.base.rgb24.ref.png differ diff --git a/test/reference/big-line.image16.ref.png b/test/reference/big-line.image16.ref.png new file mode 100644 index 000000000..47e33b8da Binary files /dev/null and b/test/reference/big-line.image16.ref.png differ diff --git a/test/reference/big-line.ps.ref.png b/test/reference/big-line.ps.ref.png new file mode 100644 index 000000000..7b7e875d4 Binary files /dev/null and b/test/reference/big-line.ps.ref.png differ diff --git a/test/reference/big-line.quartz.ref.png b/test/reference/big-line.quartz.ref.png new file mode 100644 index 000000000..a6f72404a Binary files /dev/null and b/test/reference/big-line.quartz.ref.png differ diff --git a/test/reference/big-line.ref.png b/test/reference/big-line.ref.png new file mode 100644 index 000000000..2f35bfa56 Binary files /dev/null and b/test/reference/big-line.ref.png differ diff --git a/test/reference/big-line.traps.argb32.ref.png b/test/reference/big-line.traps.argb32.ref.png new file mode 100644 index 000000000..35d2e36ab Binary files /dev/null and b/test/reference/big-line.traps.argb32.ref.png differ diff --git a/test/reference/big-line.traps.rgb24.ref.png b/test/reference/big-line.traps.rgb24.ref.png new file mode 100644 index 000000000..35d2e36ab Binary files /dev/null and b/test/reference/big-line.traps.rgb24.ref.png differ diff --git a/test/reference/big-little-box.base.argb32.ref.png b/test/reference/big-little-box.base.argb32.ref.png new file mode 100644 index 000000000..928c5e690 Binary files /dev/null and b/test/reference/big-little-box.base.argb32.ref.png differ diff --git a/test/reference/big-little-box.base.rgb24.ref.png b/test/reference/big-little-box.base.rgb24.ref.png new file mode 100644 index 000000000..c069d6fdc Binary files /dev/null and b/test/reference/big-little-box.base.rgb24.ref.png differ diff --git a/test/reference/big-little-box.ref.png b/test/reference/big-little-box.ref.png new file mode 100644 index 000000000..928c5e690 Binary files /dev/null and b/test/reference/big-little-box.ref.png differ diff --git a/test/reference/big-little-triangle.argb32.ref.png b/test/reference/big-little-triangle.argb32.ref.png new file mode 100644 index 000000000..5308ccedb Binary files /dev/null and b/test/reference/big-little-triangle.argb32.ref.png differ diff --git a/test/reference/big-little-triangle.base.argb32.ref.png b/test/reference/big-little-triangle.base.argb32.ref.png new file mode 100644 index 000000000..5308ccedb Binary files /dev/null and b/test/reference/big-little-triangle.base.argb32.ref.png differ diff --git a/test/reference/big-little-triangle.base.rgb24.ref.png b/test/reference/big-little-triangle.base.rgb24.ref.png new file mode 100644 index 000000000..9e4773b2d Binary files /dev/null and b/test/reference/big-little-triangle.base.rgb24.ref.png differ diff --git a/test/reference/big-little-triangle.rgb24.ref.png b/test/reference/big-little-triangle.rgb24.ref.png new file mode 100644 index 000000000..9e4773b2d Binary files /dev/null and b/test/reference/big-little-triangle.rgb24.ref.png differ diff --git a/test/reference/big-little-triangle.traps.argb32.ref.png b/test/reference/big-little-triangle.traps.argb32.ref.png new file mode 100644 index 000000000..5308ccedb Binary files /dev/null and b/test/reference/big-little-triangle.traps.argb32.ref.png differ diff --git a/test/reference/big-little-triangle.traps.rgb24.ref.png b/test/reference/big-little-triangle.traps.rgb24.ref.png new file mode 100644 index 000000000..9e4773b2d Binary files /dev/null and b/test/reference/big-little-triangle.traps.rgb24.ref.png differ diff --git a/test/reference/big-trap.base.argb32.ref.png b/test/reference/big-trap.base.argb32.ref.png new file mode 100644 index 000000000..c0975c9b5 Binary files /dev/null and b/test/reference/big-trap.base.argb32.ref.png differ diff --git a/test/reference/big-trap.base.rgb24.ref.png b/test/reference/big-trap.base.rgb24.ref.png new file mode 100644 index 000000000..c0975c9b5 Binary files /dev/null and b/test/reference/big-trap.base.rgb24.ref.png differ diff --git a/test/reference/big-trap.mask.argb32.ref.png b/test/reference/big-trap.mask.argb32.ref.png new file mode 100644 index 000000000..c0975c9b5 Binary files /dev/null and b/test/reference/big-trap.mask.argb32.ref.png differ diff --git a/test/reference/big-trap.mask.rgb24.ref.png b/test/reference/big-trap.mask.rgb24.ref.png new file mode 100644 index 000000000..c0975c9b5 Binary files /dev/null and b/test/reference/big-trap.mask.rgb24.ref.png differ diff --git a/test/reference/big-trap.traps.argb32.ref.png b/test/reference/big-trap.traps.argb32.ref.png new file mode 100644 index 000000000..c0975c9b5 Binary files /dev/null and b/test/reference/big-trap.traps.argb32.ref.png differ diff --git a/test/reference/big-trap.traps.rgb24.ref.png b/test/reference/big-trap.traps.rgb24.ref.png new file mode 100644 index 000000000..c0975c9b5 Binary files /dev/null and b/test/reference/big-trap.traps.rgb24.ref.png differ diff --git a/test/reference/bilevel-image.base.argb32.ref.png b/test/reference/bilevel-image.base.argb32.ref.png new file mode 100644 index 000000000..3fb25c2e5 Binary files /dev/null and b/test/reference/bilevel-image.base.argb32.ref.png differ diff --git a/test/reference/bilevel-image.base.rgb24.ref.png b/test/reference/bilevel-image.base.rgb24.ref.png new file mode 100644 index 000000000..3fb25c2e5 Binary files /dev/null and b/test/reference/bilevel-image.base.rgb24.ref.png differ diff --git a/test/reference/bilevel-image.ref.png b/test/reference/bilevel-image.ref.png new file mode 100644 index 000000000..cae76d69d Binary files /dev/null and b/test/reference/bilevel-image.ref.png differ diff --git a/test/reference/bilevel-xlib-fallback.rgb24.ref.png b/test/reference/bilevel-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..3fb25c2e5 Binary files /dev/null and b/test/reference/bilevel-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/bilevel-xlib-window.rgb24.ref.png b/test/reference/bilevel-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..3fb25c2e5 Binary files /dev/null and b/test/reference/bilevel-xlib-window.rgb24.ref.png differ diff --git a/test/reference/bilevel-xlib.ref.png b/test/reference/bilevel-xlib.ref.png new file mode 100644 index 000000000..3fb25c2e5 Binary files /dev/null and b/test/reference/bilevel-xlib.ref.png differ diff --git a/test/reference/bitmap-font.base.argb32.ref.png b/test/reference/bitmap-font.base.argb32.ref.png new file mode 100644 index 000000000..bc2bc52e0 Binary files /dev/null and b/test/reference/bitmap-font.base.argb32.ref.png differ diff --git a/test/reference/bitmap-font.base.rgb24.ref.png b/test/reference/bitmap-font.base.rgb24.ref.png new file mode 100644 index 000000000..285d74288 Binary files /dev/null and b/test/reference/bitmap-font.base.rgb24.ref.png differ diff --git a/test/reference/bitmap-font.ref.png b/test/reference/bitmap-font.ref.png new file mode 100644 index 000000000..0718bf96a Binary files /dev/null and b/test/reference/bitmap-font.ref.png differ diff --git a/test/reference/bug-40410.base.argb32.ref.png b/test/reference/bug-40410.base.argb32.ref.png new file mode 100644 index 000000000..a31593536 Binary files /dev/null and b/test/reference/bug-40410.base.argb32.ref.png differ diff --git a/test/reference/bug-40410.base.rgb24.ref.png b/test/reference/bug-40410.base.rgb24.ref.png new file mode 100644 index 000000000..a31593536 Binary files /dev/null and b/test/reference/bug-40410.base.rgb24.ref.png differ diff --git a/test/reference/bug-40410.ref.png b/test/reference/bug-40410.ref.png new file mode 100644 index 000000000..ae4420a70 Binary files /dev/null and b/test/reference/bug-40410.ref.png differ diff --git a/test/reference/bug-40410.traps.argb32.ref.png b/test/reference/bug-40410.traps.argb32.ref.png new file mode 100644 index 000000000..a31593536 Binary files /dev/null and b/test/reference/bug-40410.traps.argb32.ref.png differ diff --git a/test/reference/bug-40410.traps.rgb24.ref.png b/test/reference/bug-40410.traps.rgb24.ref.png new file mode 100644 index 000000000..a31593536 Binary files /dev/null and b/test/reference/bug-40410.traps.rgb24.ref.png differ diff --git a/test/reference/bug-51910.ref.png b/test/reference/bug-51910.ref.png new file mode 100644 index 000000000..7f55eaae5 Binary files /dev/null and b/test/reference/bug-51910.ref.png differ diff --git a/test/reference/bug-84115.ref.png b/test/reference/bug-84115.ref.png new file mode 100644 index 000000000..df16257ad Binary files /dev/null and b/test/reference/bug-84115.ref.png differ diff --git a/test/reference/bug-84115.xlib.ref.png b/test/reference/bug-84115.xlib.ref.png new file mode 100644 index 000000000..2e17a6570 Binary files /dev/null and b/test/reference/bug-84115.xlib.ref.png differ diff --git a/test/reference/bug-bo-collins.ref.png b/test/reference/bug-bo-collins.ref.png new file mode 100644 index 000000000..72e5c1d7c Binary files /dev/null and b/test/reference/bug-bo-collins.ref.png differ diff --git a/test/reference/bug-bo-rectangular.base.argb32.ref.png b/test/reference/bug-bo-rectangular.base.argb32.ref.png new file mode 100644 index 000000000..ffa4edef6 Binary files /dev/null and b/test/reference/bug-bo-rectangular.base.argb32.ref.png differ diff --git a/test/reference/bug-bo-rectangular.base.rgb24.ref.png b/test/reference/bug-bo-rectangular.base.rgb24.ref.png new file mode 100644 index 000000000..ffa4edef6 Binary files /dev/null and b/test/reference/bug-bo-rectangular.base.rgb24.ref.png differ diff --git a/test/reference/bug-bo-rectangular.image16.ref.png b/test/reference/bug-bo-rectangular.image16.ref.png new file mode 100644 index 000000000..d468d59ef Binary files /dev/null and b/test/reference/bug-bo-rectangular.image16.ref.png differ diff --git a/test/reference/bug-bo-rectangular.ps.xfail.png b/test/reference/bug-bo-rectangular.ps.xfail.png new file mode 100644 index 000000000..44b8c0331 Binary files /dev/null and b/test/reference/bug-bo-rectangular.ps.xfail.png differ diff --git a/test/reference/bug-bo-rectangular.ref.png b/test/reference/bug-bo-rectangular.ref.png new file mode 100644 index 000000000..ffa4edef6 Binary files /dev/null and b/test/reference/bug-bo-rectangular.ref.png differ diff --git a/test/reference/bug-bo-ricotz.base.argb32.ref.png b/test/reference/bug-bo-ricotz.base.argb32.ref.png new file mode 100644 index 000000000..ff7a552f7 Binary files /dev/null and b/test/reference/bug-bo-ricotz.base.argb32.ref.png differ diff --git a/test/reference/bug-bo-ricotz.base.rgb24.ref.png b/test/reference/bug-bo-ricotz.base.rgb24.ref.png new file mode 100644 index 000000000..ff7a552f7 Binary files /dev/null and b/test/reference/bug-bo-ricotz.base.rgb24.ref.png differ diff --git a/test/reference/bug-bo-ricotz.ref.png b/test/reference/bug-bo-ricotz.ref.png new file mode 100644 index 000000000..0e52b2454 Binary files /dev/null and b/test/reference/bug-bo-ricotz.ref.png differ diff --git a/test/reference/bug-bo-ricotz.traps.ref.png b/test/reference/bug-bo-ricotz.traps.ref.png new file mode 100644 index 000000000..ff7a552f7 Binary files /dev/null and b/test/reference/bug-bo-ricotz.traps.ref.png differ diff --git a/test/reference/bug-extents.base.argb32.ref.png b/test/reference/bug-extents.base.argb32.ref.png new file mode 100644 index 000000000..e07f8aa49 Binary files /dev/null and b/test/reference/bug-extents.base.argb32.ref.png differ diff --git a/test/reference/bug-extents.base.rgb24.ref.png b/test/reference/bug-extents.base.rgb24.ref.png new file mode 100644 index 000000000..e07f8aa49 Binary files /dev/null and b/test/reference/bug-extents.base.rgb24.ref.png differ diff --git a/test/reference/bug-extents.image16.ref.png b/test/reference/bug-extents.image16.ref.png new file mode 100644 index 000000000..8eb3d4bcd Binary files /dev/null and b/test/reference/bug-extents.image16.ref.png differ diff --git a/test/reference/bug-extents.ps.ref.png b/test/reference/bug-extents.ps.ref.png new file mode 100644 index 000000000..2d5540565 Binary files /dev/null and b/test/reference/bug-extents.ps.ref.png differ diff --git a/test/reference/bug-extents.quartz.ref.png b/test/reference/bug-extents.quartz.ref.png new file mode 100644 index 000000000..29734483d Binary files /dev/null and b/test/reference/bug-extents.quartz.ref.png differ diff --git a/test/reference/bug-extents.ref.png b/test/reference/bug-extents.ref.png new file mode 100644 index 000000000..e85561183 Binary files /dev/null and b/test/reference/bug-extents.ref.png differ diff --git a/test/reference/bug-extents.traps.argb32.ref.png b/test/reference/bug-extents.traps.argb32.ref.png new file mode 100644 index 000000000..e07f8aa49 Binary files /dev/null and b/test/reference/bug-extents.traps.argb32.ref.png differ diff --git a/test/reference/bug-extents.traps.rgb24.ref.png b/test/reference/bug-extents.traps.rgb24.ref.png new file mode 100644 index 000000000..e07f8aa49 Binary files /dev/null and b/test/reference/bug-extents.traps.rgb24.ref.png differ diff --git a/test/reference/bug-seams.base.argb32.ref.png b/test/reference/bug-seams.base.argb32.ref.png new file mode 100644 index 000000000..ac8065120 Binary files /dev/null and b/test/reference/bug-seams.base.argb32.ref.png differ diff --git a/test/reference/bug-seams.base.rgb24.ref.png b/test/reference/bug-seams.base.rgb24.ref.png new file mode 100644 index 000000000..ac8065120 Binary files /dev/null and b/test/reference/bug-seams.base.rgb24.ref.png differ diff --git a/test/reference/bug-seams.image.xfail.png b/test/reference/bug-seams.image.xfail.png new file mode 100644 index 000000000..99098db8c Binary files /dev/null and b/test/reference/bug-seams.image.xfail.png differ diff --git a/test/reference/bug-seams.mask.argb32.ref.png b/test/reference/bug-seams.mask.argb32.ref.png new file mode 100644 index 000000000..99098db8c Binary files /dev/null and b/test/reference/bug-seams.mask.argb32.ref.png differ diff --git a/test/reference/bug-seams.mask.rgb24.ref.png b/test/reference/bug-seams.mask.rgb24.ref.png new file mode 100644 index 000000000..99098db8c Binary files /dev/null and b/test/reference/bug-seams.mask.rgb24.ref.png differ diff --git a/test/reference/bug-seams.ref.png b/test/reference/bug-seams.ref.png new file mode 100644 index 000000000..e4e72faf4 Binary files /dev/null and b/test/reference/bug-seams.ref.png differ diff --git a/test/reference/bug-seams.traps.argb32.ref.png b/test/reference/bug-seams.traps.argb32.ref.png new file mode 100644 index 000000000..ac8065120 Binary files /dev/null and b/test/reference/bug-seams.traps.argb32.ref.png differ diff --git a/test/reference/bug-seams.traps.rgb24.ref.png b/test/reference/bug-seams.traps.rgb24.ref.png new file mode 100644 index 000000000..ac8065120 Binary files /dev/null and b/test/reference/bug-seams.traps.rgb24.ref.png differ diff --git a/test/reference/bug-seams.xlib-fallback.ref.png b/test/reference/bug-seams.xlib-fallback.ref.png new file mode 100644 index 000000000..e81fc6caa Binary files /dev/null and b/test/reference/bug-seams.xlib-fallback.ref.png differ diff --git a/test/reference/bug-source-cu.ref.png b/test/reference/bug-source-cu.ref.png new file mode 100644 index 000000000..808feb5f2 Binary files /dev/null and b/test/reference/bug-source-cu.ref.png differ diff --git a/test/reference/bug-source-cu.traps.argb32.ref.png b/test/reference/bug-source-cu.traps.argb32.ref.png new file mode 100644 index 000000000..d8837c30d Binary files /dev/null and b/test/reference/bug-source-cu.traps.argb32.ref.png differ diff --git a/test/reference/bug-source-cu.traps.rgb24.ref.png b/test/reference/bug-source-cu.traps.rgb24.ref.png new file mode 100644 index 000000000..75e3b326e Binary files /dev/null and b/test/reference/bug-source-cu.traps.rgb24.ref.png differ diff --git a/test/reference/bug-spline.ref.png b/test/reference/bug-spline.ref.png new file mode 100644 index 000000000..26d560953 Binary files /dev/null and b/test/reference/bug-spline.ref.png differ diff --git a/test/reference/caps-05.ref.png b/test/reference/caps-05.ref.png new file mode 100644 index 000000000..946adcbfa Binary files /dev/null and b/test/reference/caps-05.ref.png differ diff --git a/test/reference/caps-05.traps.ref.png b/test/reference/caps-05.traps.ref.png new file mode 100644 index 000000000..409bdab07 Binary files /dev/null and b/test/reference/caps-05.traps.ref.png differ diff --git a/test/reference/caps-1.ref.png b/test/reference/caps-1.ref.png new file mode 100644 index 000000000..dfb111808 Binary files /dev/null and b/test/reference/caps-1.ref.png differ diff --git a/test/reference/caps-1.traps.ref.png b/test/reference/caps-1.traps.ref.png new file mode 100644 index 000000000..10f7d57a3 Binary files /dev/null and b/test/reference/caps-1.traps.ref.png differ diff --git a/test/reference/caps-2.ref.png b/test/reference/caps-2.ref.png new file mode 100644 index 000000000..ca420bcab Binary files /dev/null and b/test/reference/caps-2.ref.png differ diff --git a/test/reference/caps-2.traps.ref.png b/test/reference/caps-2.traps.ref.png new file mode 100644 index 000000000..1c5d88574 Binary files /dev/null and b/test/reference/caps-2.traps.ref.png differ diff --git a/test/reference/caps-joins-05.ref.png b/test/reference/caps-joins-05.ref.png new file mode 100644 index 000000000..8814acede Binary files /dev/null and b/test/reference/caps-joins-05.ref.png differ diff --git a/test/reference/caps-joins-05.traps.ref.png b/test/reference/caps-joins-05.traps.ref.png new file mode 100644 index 000000000..938fb6d1b Binary files /dev/null and b/test/reference/caps-joins-05.traps.ref.png differ diff --git a/test/reference/caps-joins-1.ref.png b/test/reference/caps-joins-1.ref.png new file mode 100644 index 000000000..d7cdf2c86 Binary files /dev/null and b/test/reference/caps-joins-1.ref.png differ diff --git a/test/reference/caps-joins-1.traps.ref.png b/test/reference/caps-joins-1.traps.ref.png new file mode 100644 index 000000000..d9721f29f Binary files /dev/null and b/test/reference/caps-joins-1.traps.ref.png differ diff --git a/test/reference/caps-joins-2.ref.png b/test/reference/caps-joins-2.ref.png new file mode 100644 index 000000000..1416a54e4 Binary files /dev/null and b/test/reference/caps-joins-2.ref.png differ diff --git a/test/reference/caps-joins-2.traps.ref.png b/test/reference/caps-joins-2.traps.ref.png new file mode 100644 index 000000000..e7089a8de Binary files /dev/null and b/test/reference/caps-joins-2.traps.ref.png differ diff --git a/test/reference/caps-joins-alpha.image16.ref.png b/test/reference/caps-joins-alpha.image16.ref.png new file mode 100644 index 000000000..ddefea81c Binary files /dev/null and b/test/reference/caps-joins-alpha.image16.ref.png differ diff --git a/test/reference/caps-joins-alpha.mask.argb32.ref.png b/test/reference/caps-joins-alpha.mask.argb32.ref.png new file mode 100644 index 000000000..964a70f37 Binary files /dev/null and b/test/reference/caps-joins-alpha.mask.argb32.ref.png differ diff --git a/test/reference/caps-joins-alpha.mask.rgb24.ref.png b/test/reference/caps-joins-alpha.mask.rgb24.ref.png new file mode 100644 index 000000000..964a70f37 Binary files /dev/null and b/test/reference/caps-joins-alpha.mask.rgb24.ref.png differ diff --git a/test/reference/caps-joins-alpha.quartz.ref.png b/test/reference/caps-joins-alpha.quartz.ref.png new file mode 100644 index 000000000..190c1e96c Binary files /dev/null and b/test/reference/caps-joins-alpha.quartz.ref.png differ diff --git a/test/reference/caps-joins-alpha.ref.png b/test/reference/caps-joins-alpha.ref.png new file mode 100644 index 000000000..9479bf247 Binary files /dev/null and b/test/reference/caps-joins-alpha.ref.png differ diff --git a/test/reference/caps-joins-alpha.traps.argb32.ref.png b/test/reference/caps-joins-alpha.traps.argb32.ref.png new file mode 100644 index 000000000..e17c4a197 Binary files /dev/null and b/test/reference/caps-joins-alpha.traps.argb32.ref.png differ diff --git a/test/reference/caps-joins-alpha.traps.rgb24.ref.png b/test/reference/caps-joins-alpha.traps.rgb24.ref.png new file mode 100644 index 000000000..e17c4a197 Binary files /dev/null and b/test/reference/caps-joins-alpha.traps.rgb24.ref.png differ diff --git a/test/reference/caps-joins-curve.image16.ref.png b/test/reference/caps-joins-curve.image16.ref.png new file mode 100644 index 000000000..060b3dcb1 Binary files /dev/null and b/test/reference/caps-joins-curve.image16.ref.png differ diff --git a/test/reference/caps-joins-curve.mask.argb32.ref.png b/test/reference/caps-joins-curve.mask.argb32.ref.png new file mode 100644 index 000000000..35959002c Binary files /dev/null and b/test/reference/caps-joins-curve.mask.argb32.ref.png differ diff --git a/test/reference/caps-joins-curve.mask.rgb24.ref.png b/test/reference/caps-joins-curve.mask.rgb24.ref.png new file mode 100644 index 000000000..35959002c Binary files /dev/null and b/test/reference/caps-joins-curve.mask.rgb24.ref.png differ diff --git a/test/reference/caps-joins-curve.ps.ref.png b/test/reference/caps-joins-curve.ps.ref.png new file mode 100644 index 000000000..7fbb826a1 Binary files /dev/null and b/test/reference/caps-joins-curve.ps.ref.png differ diff --git a/test/reference/caps-joins-curve.quartz.ref.png b/test/reference/caps-joins-curve.quartz.ref.png new file mode 100644 index 000000000..ec3d30796 Binary files /dev/null and b/test/reference/caps-joins-curve.quartz.ref.png differ diff --git a/test/reference/caps-joins-curve.ref.png b/test/reference/caps-joins-curve.ref.png new file mode 100644 index 000000000..a9f66a04b Binary files /dev/null and b/test/reference/caps-joins-curve.ref.png differ diff --git a/test/reference/caps-joins-curve.traps.argb32.ref.png b/test/reference/caps-joins-curve.traps.argb32.ref.png new file mode 100644 index 000000000..7ce1acc3d Binary files /dev/null and b/test/reference/caps-joins-curve.traps.argb32.ref.png differ diff --git a/test/reference/caps-joins-curve.traps.rgb24.ref.png b/test/reference/caps-joins-curve.traps.rgb24.ref.png new file mode 100644 index 000000000..7ce1acc3d Binary files /dev/null and b/test/reference/caps-joins-curve.traps.rgb24.ref.png differ diff --git a/test/reference/caps-joins.base.argb32.ref.png b/test/reference/caps-joins.base.argb32.ref.png new file mode 100644 index 000000000..470eec3b1 Binary files /dev/null and b/test/reference/caps-joins.base.argb32.ref.png differ diff --git a/test/reference/caps-joins.base.rgb24.ref.png b/test/reference/caps-joins.base.rgb24.ref.png new file mode 100644 index 000000000..470eec3b1 Binary files /dev/null and b/test/reference/caps-joins.base.rgb24.ref.png differ diff --git a/test/reference/caps-joins.image16.ref.png b/test/reference/caps-joins.image16.ref.png new file mode 100644 index 000000000..0c452f29e Binary files /dev/null and b/test/reference/caps-joins.image16.ref.png differ diff --git a/test/reference/caps-joins.ps.ref.png b/test/reference/caps-joins.ps.ref.png new file mode 100644 index 000000000..f6c85cef7 Binary files /dev/null and b/test/reference/caps-joins.ps.ref.png differ diff --git a/test/reference/caps-joins.ref.png b/test/reference/caps-joins.ref.png new file mode 100644 index 000000000..6d7122ee1 Binary files /dev/null and b/test/reference/caps-joins.ref.png differ diff --git a/test/reference/caps-joins.traps.argb32.ref.png b/test/reference/caps-joins.traps.argb32.ref.png new file mode 100644 index 000000000..470eec3b1 Binary files /dev/null and b/test/reference/caps-joins.traps.argb32.ref.png differ diff --git a/test/reference/caps-joins.traps.rgb24.ref.png b/test/reference/caps-joins.traps.rgb24.ref.png new file mode 100644 index 000000000..470eec3b1 Binary files /dev/null and b/test/reference/caps-joins.traps.rgb24.ref.png differ diff --git a/test/reference/caps-sub-paths.base.argb32.ref.png b/test/reference/caps-sub-paths.base.argb32.ref.png new file mode 100644 index 000000000..1e4a83f0b Binary files /dev/null and b/test/reference/caps-sub-paths.base.argb32.ref.png differ diff --git a/test/reference/caps-sub-paths.base.rgb24.ref.png b/test/reference/caps-sub-paths.base.rgb24.ref.png new file mode 100644 index 000000000..1e4a83f0b Binary files /dev/null and b/test/reference/caps-sub-paths.base.rgb24.ref.png differ diff --git a/test/reference/caps-sub-paths.image16.ref.png b/test/reference/caps-sub-paths.image16.ref.png new file mode 100644 index 000000000..c0cc4d74b Binary files /dev/null and b/test/reference/caps-sub-paths.image16.ref.png differ diff --git a/test/reference/caps-sub-paths.ps.ref.png b/test/reference/caps-sub-paths.ps.ref.png new file mode 100644 index 000000000..197b443cd Binary files /dev/null and b/test/reference/caps-sub-paths.ps.ref.png differ diff --git a/test/reference/caps-sub-paths.ref.png b/test/reference/caps-sub-paths.ref.png new file mode 100644 index 000000000..744338957 Binary files /dev/null and b/test/reference/caps-sub-paths.ref.png differ diff --git a/test/reference/caps-sub-paths.traps.argb32.ref.png b/test/reference/caps-sub-paths.traps.argb32.ref.png new file mode 100644 index 000000000..1e4a83f0b Binary files /dev/null and b/test/reference/caps-sub-paths.traps.argb32.ref.png differ diff --git a/test/reference/caps-sub-paths.traps.rgb24.ref.png b/test/reference/caps-sub-paths.traps.rgb24.ref.png new file mode 100644 index 000000000..1e4a83f0b Binary files /dev/null and b/test/reference/caps-sub-paths.traps.rgb24.ref.png differ diff --git a/test/reference/caps-tails-curve.mask.argb32.ref.png b/test/reference/caps-tails-curve.mask.argb32.ref.png new file mode 100644 index 000000000..b0f477df9 Binary files /dev/null and b/test/reference/caps-tails-curve.mask.argb32.ref.png differ diff --git a/test/reference/caps-tails-curve.mask.rgb24.ref.png b/test/reference/caps-tails-curve.mask.rgb24.ref.png new file mode 100644 index 000000000..b0f477df9 Binary files /dev/null and b/test/reference/caps-tails-curve.mask.rgb24.ref.png differ diff --git a/test/reference/caps-tails-curve.ps.ref.png b/test/reference/caps-tails-curve.ps.ref.png new file mode 100644 index 000000000..fca77c345 Binary files /dev/null and b/test/reference/caps-tails-curve.ps.ref.png differ diff --git a/test/reference/caps-tails-curve.ref.png b/test/reference/caps-tails-curve.ref.png new file mode 100644 index 000000000..df036d273 Binary files /dev/null and b/test/reference/caps-tails-curve.ref.png differ diff --git a/test/reference/caps-tails-curve.traps.argb32.ref.png b/test/reference/caps-tails-curve.traps.argb32.ref.png new file mode 100644 index 000000000..9d579998a Binary files /dev/null and b/test/reference/caps-tails-curve.traps.argb32.ref.png differ diff --git a/test/reference/caps-tails-curve.traps.rgb24.ref.png b/test/reference/caps-tails-curve.traps.rgb24.ref.png new file mode 100644 index 000000000..9d579998a Binary files /dev/null and b/test/reference/caps-tails-curve.traps.rgb24.ref.png differ diff --git a/test/reference/caps-tails-curve.xcb.ref.png b/test/reference/caps-tails-curve.xcb.ref.png new file mode 100644 index 000000000..89022033c Binary files /dev/null and b/test/reference/caps-tails-curve.xcb.ref.png differ diff --git a/test/reference/caps.base.argb32.ref.png b/test/reference/caps.base.argb32.ref.png new file mode 100644 index 000000000..b3504abcb Binary files /dev/null and b/test/reference/caps.base.argb32.ref.png differ diff --git a/test/reference/caps.base.rgb24.ref.png b/test/reference/caps.base.rgb24.ref.png new file mode 100644 index 000000000..b3504abcb Binary files /dev/null and b/test/reference/caps.base.rgb24.ref.png differ diff --git a/test/reference/caps.image16.ref.png b/test/reference/caps.image16.ref.png new file mode 100644 index 000000000..a33a5ef73 Binary files /dev/null and b/test/reference/caps.image16.ref.png differ diff --git a/test/reference/caps.ps.ref.png b/test/reference/caps.ps.ref.png new file mode 100644 index 000000000..c91b8aa3b Binary files /dev/null and b/test/reference/caps.ps.ref.png differ diff --git a/test/reference/caps.ref.png b/test/reference/caps.ref.png new file mode 100644 index 000000000..bf784fd40 Binary files /dev/null and b/test/reference/caps.ref.png differ diff --git a/test/reference/caps.traps.argb32.ref.png b/test/reference/caps.traps.argb32.ref.png new file mode 100644 index 000000000..b3504abcb Binary files /dev/null and b/test/reference/caps.traps.argb32.ref.png differ diff --git a/test/reference/caps.traps.rgb24.ref.png b/test/reference/caps.traps.rgb24.ref.png new file mode 100644 index 000000000..b3504abcb Binary files /dev/null and b/test/reference/caps.traps.rgb24.ref.png differ diff --git a/test/reference/checkerboard.base.argb32.ref.png b/test/reference/checkerboard.base.argb32.ref.png new file mode 100644 index 000000000..1444bc41b Binary files /dev/null and b/test/reference/checkerboard.base.argb32.ref.png differ diff --git a/test/reference/checkerboard.base.rgb24.ref.png b/test/reference/checkerboard.base.rgb24.ref.png new file mode 100644 index 000000000..1444bc41b Binary files /dev/null and b/test/reference/checkerboard.base.rgb24.ref.png differ diff --git a/test/reference/checkerboard.ref.png b/test/reference/checkerboard.ref.png new file mode 100644 index 000000000..1444bc41b Binary files /dev/null and b/test/reference/checkerboard.ref.png differ diff --git a/test/reference/clear-source.base.argb32.ref.png b/test/reference/clear-source.base.argb32.ref.png new file mode 100644 index 000000000..293411c47 Binary files /dev/null and b/test/reference/clear-source.base.argb32.ref.png differ diff --git a/test/reference/clear-source.base.rgb24.ref.png b/test/reference/clear-source.base.rgb24.ref.png new file mode 100644 index 000000000..293411c47 Binary files /dev/null and b/test/reference/clear-source.base.rgb24.ref.png differ diff --git a/test/reference/clear-source.image16.ref.png b/test/reference/clear-source.image16.ref.png new file mode 100644 index 000000000..4055b95fe Binary files /dev/null and b/test/reference/clear-source.image16.ref.png differ diff --git a/test/reference/clear-source.pdf.xfail.png b/test/reference/clear-source.pdf.xfail.png new file mode 100644 index 000000000..8e1bdd76e Binary files /dev/null and b/test/reference/clear-source.pdf.xfail.png differ diff --git a/test/reference/clear-source.ps.xfail.png b/test/reference/clear-source.ps.xfail.png new file mode 100644 index 000000000..b515751d6 Binary files /dev/null and b/test/reference/clear-source.ps.xfail.png differ diff --git a/test/reference/clear-source.ref.png b/test/reference/clear-source.ref.png new file mode 100644 index 000000000..352bf4503 Binary files /dev/null and b/test/reference/clear-source.ref.png differ diff --git a/test/reference/clear-source.traps.argb32.ref.png b/test/reference/clear-source.traps.argb32.ref.png new file mode 100644 index 000000000..293411c47 Binary files /dev/null and b/test/reference/clear-source.traps.argb32.ref.png differ diff --git a/test/reference/clear-source.traps.rgb24.ref.png b/test/reference/clear-source.traps.rgb24.ref.png new file mode 100644 index 000000000..293411c47 Binary files /dev/null and b/test/reference/clear-source.traps.rgb24.ref.png differ diff --git a/test/reference/clear.argb32.ref.png b/test/reference/clear.argb32.ref.png new file mode 100644 index 000000000..64d89c1cb Binary files /dev/null and b/test/reference/clear.argb32.ref.png differ diff --git a/test/reference/clear.base.argb32.ref.png b/test/reference/clear.base.argb32.ref.png new file mode 100644 index 000000000..1caca6dfb Binary files /dev/null and b/test/reference/clear.base.argb32.ref.png differ diff --git a/test/reference/clear.base.rgb24.ref.png b/test/reference/clear.base.rgb24.ref.png new file mode 100644 index 000000000..7d789b0bb Binary files /dev/null and b/test/reference/clear.base.rgb24.ref.png differ diff --git a/test/reference/clear.pdf.argb32.ref.png b/test/reference/clear.pdf.argb32.ref.png new file mode 100644 index 000000000..0960f4851 Binary files /dev/null and b/test/reference/clear.pdf.argb32.ref.png differ diff --git a/test/reference/clear.ps.argb32.ref.png b/test/reference/clear.ps.argb32.ref.png new file mode 100644 index 000000000..0960f4851 Binary files /dev/null and b/test/reference/clear.ps.argb32.ref.png differ diff --git a/test/reference/clear.quartz.argb32.ref.png b/test/reference/clear.quartz.argb32.ref.png new file mode 100644 index 000000000..12e604312 Binary files /dev/null and b/test/reference/clear.quartz.argb32.ref.png differ diff --git a/test/reference/clear.quartz.rgb24.ref.png b/test/reference/clear.quartz.rgb24.ref.png new file mode 100644 index 000000000..6ea449094 Binary files /dev/null and b/test/reference/clear.quartz.rgb24.ref.png differ diff --git a/test/reference/clear.rgb24.ref.png b/test/reference/clear.rgb24.ref.png new file mode 100644 index 000000000..d59e44e11 Binary files /dev/null and b/test/reference/clear.rgb24.ref.png differ diff --git a/test/reference/clear.svg12.argb32.xfail.png b/test/reference/clear.svg12.argb32.xfail.png new file mode 100644 index 000000000..cb25bcb40 Binary files /dev/null and b/test/reference/clear.svg12.argb32.xfail.png differ diff --git a/test/reference/clear.svg12.rgb24.xfail.png b/test/reference/clear.svg12.rgb24.xfail.png new file mode 100644 index 000000000..cb25bcb40 Binary files /dev/null and b/test/reference/clear.svg12.rgb24.xfail.png differ diff --git a/test/reference/clear.traps.argb32.ref.png b/test/reference/clear.traps.argb32.ref.png new file mode 100644 index 000000000..1caca6dfb Binary files /dev/null and b/test/reference/clear.traps.argb32.ref.png differ diff --git a/test/reference/clear.traps.rgb24.ref.png b/test/reference/clear.traps.rgb24.ref.png new file mode 100644 index 000000000..7d789b0bb Binary files /dev/null and b/test/reference/clear.traps.rgb24.ref.png differ diff --git a/test/reference/clip-all.base.argb32.ref.png b/test/reference/clip-all.base.argb32.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-all.base.argb32.ref.png differ diff --git a/test/reference/clip-all.base.rgb24.ref.png b/test/reference/clip-all.base.rgb24.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-all.base.rgb24.ref.png differ diff --git a/test/reference/clip-all.ref.png b/test/reference/clip-all.ref.png new file mode 100644 index 000000000..6c14df51f Binary files /dev/null and b/test/reference/clip-all.ref.png differ diff --git a/test/reference/clip-complex-bug61492.ref.png b/test/reference/clip-complex-bug61492.ref.png new file mode 100644 index 000000000..8e2e982be Binary files /dev/null and b/test/reference/clip-complex-bug61492.ref.png differ diff --git a/test/reference/clip-complex-shape-eo-aa.base.argb32.ref.png b/test/reference/clip-complex-shape-eo-aa.base.argb32.ref.png new file mode 100644 index 000000000..bafbb8ad1 Binary files /dev/null and b/test/reference/clip-complex-shape-eo-aa.base.argb32.ref.png differ diff --git a/test/reference/clip-complex-shape-eo-aa.base.rgb24.ref.png b/test/reference/clip-complex-shape-eo-aa.base.rgb24.ref.png new file mode 100644 index 000000000..bafbb8ad1 Binary files /dev/null and b/test/reference/clip-complex-shape-eo-aa.base.rgb24.ref.png differ diff --git a/test/reference/clip-complex-shape-eo-aa.ref.png b/test/reference/clip-complex-shape-eo-aa.ref.png new file mode 100644 index 000000000..d575aa9ad Binary files /dev/null and b/test/reference/clip-complex-shape-eo-aa.ref.png differ diff --git a/test/reference/clip-complex-shape-eo-mono.base.argb32.ref.png b/test/reference/clip-complex-shape-eo-mono.base.argb32.ref.png new file mode 100644 index 000000000..bafbb8ad1 Binary files /dev/null and b/test/reference/clip-complex-shape-eo-mono.base.argb32.ref.png differ diff --git a/test/reference/clip-complex-shape-eo-mono.base.rgb24.ref.png b/test/reference/clip-complex-shape-eo-mono.base.rgb24.ref.png new file mode 100644 index 000000000..bafbb8ad1 Binary files /dev/null and b/test/reference/clip-complex-shape-eo-mono.base.rgb24.ref.png differ diff --git a/test/reference/clip-complex-shape-eo-mono.ref.png b/test/reference/clip-complex-shape-eo-mono.ref.png new file mode 100644 index 000000000..d575aa9ad Binary files /dev/null and b/test/reference/clip-complex-shape-eo-mono.ref.png differ diff --git a/test/reference/clip-contexts.base.argb32.ref.png b/test/reference/clip-contexts.base.argb32.ref.png new file mode 100644 index 000000000..0d575a628 Binary files /dev/null and b/test/reference/clip-contexts.base.argb32.ref.png differ diff --git a/test/reference/clip-contexts.base.rgb24.ref.png b/test/reference/clip-contexts.base.rgb24.ref.png new file mode 100644 index 000000000..0d575a628 Binary files /dev/null and b/test/reference/clip-contexts.base.rgb24.ref.png differ diff --git a/test/reference/clip-contexts.ref.png b/test/reference/clip-contexts.ref.png new file mode 100644 index 000000000..0d575a628 Binary files /dev/null and b/test/reference/clip-contexts.ref.png differ diff --git a/test/reference/clip-device-offset.base.argb32.ref.png b/test/reference/clip-device-offset.base.argb32.ref.png new file mode 100644 index 000000000..06be98519 Binary files /dev/null and b/test/reference/clip-device-offset.base.argb32.ref.png differ diff --git a/test/reference/clip-device-offset.base.rgb24.ref.png b/test/reference/clip-device-offset.base.rgb24.ref.png new file mode 100644 index 000000000..241938459 Binary files /dev/null and b/test/reference/clip-device-offset.base.rgb24.ref.png differ diff --git a/test/reference/clip-device-offset.ref.png b/test/reference/clip-device-offset.ref.png new file mode 100644 index 000000000..06be98519 Binary files /dev/null and b/test/reference/clip-device-offset.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.base.argb32.ref.png b/test/reference/clip-disjoint-hatching.base.argb32.ref.png new file mode 100644 index 000000000..55f26d0b5 Binary files /dev/null and b/test/reference/clip-disjoint-hatching.base.argb32.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.base.rgb24.ref.png b/test/reference/clip-disjoint-hatching.base.rgb24.ref.png new file mode 100644 index 000000000..55f26d0b5 Binary files /dev/null and b/test/reference/clip-disjoint-hatching.base.rgb24.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.mask.argb32.ref.png b/test/reference/clip-disjoint-hatching.mask.argb32.ref.png new file mode 100644 index 000000000..a29f04ac9 Binary files /dev/null and b/test/reference/clip-disjoint-hatching.mask.argb32.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.mask.rgb24.ref.png b/test/reference/clip-disjoint-hatching.mask.rgb24.ref.png new file mode 100644 index 000000000..a29f04ac9 Binary files /dev/null and b/test/reference/clip-disjoint-hatching.mask.rgb24.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.ref.png b/test/reference/clip-disjoint-hatching.ref.png new file mode 100644 index 000000000..ff47816f8 Binary files /dev/null and b/test/reference/clip-disjoint-hatching.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.traps.argb32.ref.png b/test/reference/clip-disjoint-hatching.traps.argb32.ref.png new file mode 100644 index 000000000..6226d931e Binary files /dev/null and b/test/reference/clip-disjoint-hatching.traps.argb32.ref.png differ diff --git a/test/reference/clip-disjoint-hatching.traps.rgb24.ref.png b/test/reference/clip-disjoint-hatching.traps.rgb24.ref.png new file mode 100644 index 000000000..6226d931e Binary files /dev/null and b/test/reference/clip-disjoint-hatching.traps.rgb24.ref.png differ diff --git a/test/reference/clip-disjoint-quad.ref.png b/test/reference/clip-disjoint-quad.ref.png new file mode 100644 index 000000000..25fbf0b1c Binary files /dev/null and b/test/reference/clip-disjoint-quad.ref.png differ diff --git a/test/reference/clip-disjoint-quad.traps.ref.png b/test/reference/clip-disjoint-quad.traps.ref.png new file mode 100644 index 000000000..de5ceb77b Binary files /dev/null and b/test/reference/clip-disjoint-quad.traps.ref.png differ diff --git a/test/reference/clip-disjoint.base.argb32.ref.png b/test/reference/clip-disjoint.base.argb32.ref.png new file mode 100644 index 000000000..74ae9d869 Binary files /dev/null and b/test/reference/clip-disjoint.base.argb32.ref.png differ diff --git a/test/reference/clip-disjoint.base.rgb24.ref.png b/test/reference/clip-disjoint.base.rgb24.ref.png new file mode 100644 index 000000000..74ae9d869 Binary files /dev/null and b/test/reference/clip-disjoint.base.rgb24.ref.png differ diff --git a/test/reference/clip-disjoint.image16.ref.png b/test/reference/clip-disjoint.image16.ref.png new file mode 100644 index 000000000..79aaf7164 Binary files /dev/null and b/test/reference/clip-disjoint.image16.ref.png differ diff --git a/test/reference/clip-disjoint.mask.argb32.ref.png b/test/reference/clip-disjoint.mask.argb32.ref.png new file mode 100644 index 000000000..4e18b7c7c Binary files /dev/null and b/test/reference/clip-disjoint.mask.argb32.ref.png differ diff --git a/test/reference/clip-disjoint.mask.rgb24.ref.png b/test/reference/clip-disjoint.mask.rgb24.ref.png new file mode 100644 index 000000000..4e18b7c7c Binary files /dev/null and b/test/reference/clip-disjoint.mask.rgb24.ref.png differ diff --git a/test/reference/clip-disjoint.ps.ref.png b/test/reference/clip-disjoint.ps.ref.png new file mode 100644 index 000000000..5410d0aa3 Binary files /dev/null and b/test/reference/clip-disjoint.ps.ref.png differ diff --git a/test/reference/clip-disjoint.quartz.ref.png b/test/reference/clip-disjoint.quartz.ref.png new file mode 100644 index 000000000..10068152e Binary files /dev/null and b/test/reference/clip-disjoint.quartz.ref.png differ diff --git a/test/reference/clip-disjoint.ref.png b/test/reference/clip-disjoint.ref.png new file mode 100644 index 000000000..c0d1c0640 Binary files /dev/null and b/test/reference/clip-disjoint.ref.png differ diff --git a/test/reference/clip-disjoint.traps.argb32.ref.png b/test/reference/clip-disjoint.traps.argb32.ref.png new file mode 100644 index 000000000..74ae9d869 Binary files /dev/null and b/test/reference/clip-disjoint.traps.argb32.ref.png differ diff --git a/test/reference/clip-disjoint.traps.rgb24.ref.png b/test/reference/clip-disjoint.traps.rgb24.ref.png new file mode 100644 index 000000000..74ae9d869 Binary files /dev/null and b/test/reference/clip-disjoint.traps.rgb24.ref.png differ diff --git a/test/reference/clip-empty-group.base.argb32.ref.png b/test/reference/clip-empty-group.base.argb32.ref.png new file mode 100644 index 000000000..a59ca472d Binary files /dev/null and b/test/reference/clip-empty-group.base.argb32.ref.png differ diff --git a/test/reference/clip-empty-group.base.rgb24.ref.png b/test/reference/clip-empty-group.base.rgb24.ref.png new file mode 100644 index 000000000..a59ca472d Binary files /dev/null and b/test/reference/clip-empty-group.base.rgb24.ref.png differ diff --git a/test/reference/clip-empty-group.ref.png b/test/reference/clip-empty-group.ref.png new file mode 100644 index 000000000..a59ca472d Binary files /dev/null and b/test/reference/clip-empty-group.ref.png differ diff --git a/test/reference/clip-empty-save.base.argb32.ref.png b/test/reference/clip-empty-save.base.argb32.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-empty-save.base.argb32.ref.png differ diff --git a/test/reference/clip-empty-save.base.rgb24.ref.png b/test/reference/clip-empty-save.base.rgb24.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-empty-save.base.rgb24.ref.png differ diff --git a/test/reference/clip-empty-save.ref.png b/test/reference/clip-empty-save.ref.png new file mode 100644 index 000000000..6c14df51f Binary files /dev/null and b/test/reference/clip-empty-save.ref.png differ diff --git a/test/reference/clip-empty.base.argb32.ref.png b/test/reference/clip-empty.base.argb32.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-empty.base.argb32.ref.png differ diff --git a/test/reference/clip-empty.base.rgb24.ref.png b/test/reference/clip-empty.base.rgb24.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-empty.base.rgb24.ref.png differ diff --git a/test/reference/clip-empty.ref.png b/test/reference/clip-empty.ref.png new file mode 100644 index 000000000..6c14df51f Binary files /dev/null and b/test/reference/clip-empty.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.argb32.ref.png b/test/reference/clip-fill-eo-unbounded.argb32.ref.png new file mode 100644 index 000000000..be56f728d Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.argb32.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.base.argb32.ref.png b/test/reference/clip-fill-eo-unbounded.base.argb32.ref.png new file mode 100644 index 000000000..81ecfb9a6 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.base.argb32.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.base.rgb24.ref.png b/test/reference/clip-fill-eo-unbounded.base.rgb24.ref.png new file mode 100644 index 000000000..d6a5939b7 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.base.rgb24.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.image16.ref.png b/test/reference/clip-fill-eo-unbounded.image16.ref.png new file mode 100644 index 000000000..e0e66ff7b Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.image16.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.mask.argb32.ref.png b/test/reference/clip-fill-eo-unbounded.mask.argb32.ref.png new file mode 100644 index 000000000..2340bdf12 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.mask.argb32.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.mask.rgb24.ref.png b/test/reference/clip-fill-eo-unbounded.mask.rgb24.ref.png new file mode 100644 index 000000000..299bd72a8 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.mask.rgb24.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.quartz.argb32.ref.png b/test/reference/clip-fill-eo-unbounded.quartz.argb32.ref.png new file mode 100644 index 000000000..342300095 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.quartz.argb32.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.quartz.rgb24.ref.png b/test/reference/clip-fill-eo-unbounded.quartz.rgb24.ref.png new file mode 100644 index 000000000..1612801bd Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.rgb24.ref.png b/test/reference/clip-fill-eo-unbounded.rgb24.ref.png new file mode 100644 index 000000000..e78ef0a32 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.rgb24.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.svg12.rgb24.xfail.png b/test/reference/clip-fill-eo-unbounded.svg12.rgb24.xfail.png new file mode 100644 index 000000000..f949de1ad Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.svg12.rgb24.xfail.png differ diff --git a/test/reference/clip-fill-eo-unbounded.traps.argb32.ref.png b/test/reference/clip-fill-eo-unbounded.traps.argb32.ref.png new file mode 100644 index 000000000..19b9f0909 Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.traps.argb32.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.traps.rgb24.ref.png b/test/reference/clip-fill-eo-unbounded.traps.rgb24.ref.png new file mode 100644 index 000000000..1ad0b176b Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.traps.rgb24.ref.png differ diff --git a/test/reference/clip-fill-eo-unbounded.xlib-fallback.rgb24.ref.png b/test/reference/clip-fill-eo-unbounded.xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..ec258968e Binary files /dev/null and b/test/reference/clip-fill-eo-unbounded.xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/clip-fill-no-op.base.argb32.ref.png b/test/reference/clip-fill-no-op.base.argb32.ref.png new file mode 100644 index 000000000..2256461a9 Binary files /dev/null and b/test/reference/clip-fill-no-op.base.argb32.ref.png differ diff --git a/test/reference/clip-fill-no-op.base.rgb24.ref.png b/test/reference/clip-fill-no-op.base.rgb24.ref.png new file mode 100644 index 000000000..2256461a9 Binary files /dev/null and b/test/reference/clip-fill-no-op.base.rgb24.ref.png differ diff --git a/test/reference/clip-fill-no-op.image16.ref.png b/test/reference/clip-fill-no-op.image16.ref.png new file mode 100644 index 000000000..cf0c74ad8 Binary files /dev/null and b/test/reference/clip-fill-no-op.image16.ref.png differ diff --git a/test/reference/clip-fill-no-op.ref.png b/test/reference/clip-fill-no-op.ref.png new file mode 100644 index 000000000..2256461a9 Binary files /dev/null and b/test/reference/clip-fill-no-op.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.argb32.ref.png b/test/reference/clip-fill-nz-unbounded.argb32.ref.png new file mode 100644 index 000000000..be56f728d Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.argb32.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.base.argb32.ref.png b/test/reference/clip-fill-nz-unbounded.base.argb32.ref.png new file mode 100644 index 000000000..81ecfb9a6 Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.base.argb32.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.base.rgb24.ref.png b/test/reference/clip-fill-nz-unbounded.base.rgb24.ref.png new file mode 100644 index 000000000..d6a5939b7 Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.base.rgb24.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.image16.ref.png b/test/reference/clip-fill-nz-unbounded.image16.ref.png new file mode 100644 index 000000000..e0e66ff7b Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.image16.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.mask.argb32.ref.png b/test/reference/clip-fill-nz-unbounded.mask.argb32.ref.png new file mode 100644 index 000000000..05b26282c Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.mask.argb32.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.mask.rgb24.ref.png b/test/reference/clip-fill-nz-unbounded.mask.rgb24.ref.png new file mode 100644 index 000000000..9ce760b13 Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.mask.rgb24.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.quartz.argb32.ref.png b/test/reference/clip-fill-nz-unbounded.quartz.argb32.ref.png new file mode 100644 index 000000000..342300095 Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.quartz.argb32.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.quartz.rgb24.ref.png b/test/reference/clip-fill-nz-unbounded.quartz.rgb24.ref.png new file mode 100644 index 000000000..1612801bd Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.rgb24.ref.png b/test/reference/clip-fill-nz-unbounded.rgb24.ref.png new file mode 100644 index 000000000..e78ef0a32 Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.rgb24.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.svg12.rgb24.xfail.png b/test/reference/clip-fill-nz-unbounded.svg12.rgb24.xfail.png new file mode 100644 index 000000000..f949de1ad Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.svg12.rgb24.xfail.png differ diff --git a/test/reference/clip-fill-nz-unbounded.traps.argb32.ref.png b/test/reference/clip-fill-nz-unbounded.traps.argb32.ref.png new file mode 100644 index 000000000..19b9f0909 Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.traps.argb32.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.traps.rgb24.ref.png b/test/reference/clip-fill-nz-unbounded.traps.rgb24.ref.png new file mode 100644 index 000000000..1ad0b176b Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.traps.rgb24.ref.png differ diff --git a/test/reference/clip-fill-nz-unbounded.xlib-fallback.rgb24.ref.png b/test/reference/clip-fill-nz-unbounded.xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..ec258968e Binary files /dev/null and b/test/reference/clip-fill-nz-unbounded.xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule-pixel-aligned.base.argb32.ref.png b/test/reference/clip-fill-rule-pixel-aligned.base.argb32.ref.png new file mode 100644 index 000000000..9b82c4b5f Binary files /dev/null and b/test/reference/clip-fill-rule-pixel-aligned.base.argb32.ref.png differ diff --git a/test/reference/clip-fill-rule-pixel-aligned.base.rgb24.ref.png b/test/reference/clip-fill-rule-pixel-aligned.base.rgb24.ref.png new file mode 100644 index 000000000..0b4f06883 Binary files /dev/null and b/test/reference/clip-fill-rule-pixel-aligned.base.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule-pixel-aligned.ref.png b/test/reference/clip-fill-rule-pixel-aligned.ref.png new file mode 100644 index 000000000..66eb6852e Binary files /dev/null and b/test/reference/clip-fill-rule-pixel-aligned.ref.png differ diff --git a/test/reference/clip-fill-rule.argb32.ref.png b/test/reference/clip-fill-rule.argb32.ref.png new file mode 100644 index 000000000..f32db7c36 Binary files /dev/null and b/test/reference/clip-fill-rule.argb32.ref.png differ diff --git a/test/reference/clip-fill-rule.base.argb32.ref.png b/test/reference/clip-fill-rule.base.argb32.ref.png new file mode 100644 index 000000000..cb23ea61d Binary files /dev/null and b/test/reference/clip-fill-rule.base.argb32.ref.png differ diff --git a/test/reference/clip-fill-rule.base.rgb24.ref.png b/test/reference/clip-fill-rule.base.rgb24.ref.png new file mode 100644 index 000000000..5265ddea9 Binary files /dev/null and b/test/reference/clip-fill-rule.base.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule.image16.ref.png b/test/reference/clip-fill-rule.image16.ref.png new file mode 100644 index 000000000..101449d33 Binary files /dev/null and b/test/reference/clip-fill-rule.image16.ref.png differ diff --git a/test/reference/clip-fill-rule.pdf.argb32.ref.png b/test/reference/clip-fill-rule.pdf.argb32.ref.png new file mode 100644 index 000000000..0d9938e77 Binary files /dev/null and b/test/reference/clip-fill-rule.pdf.argb32.ref.png differ diff --git a/test/reference/clip-fill-rule.ps.argb32.ref.png b/test/reference/clip-fill-rule.ps.argb32.ref.png new file mode 100644 index 000000000..1b8943491 Binary files /dev/null and b/test/reference/clip-fill-rule.ps.argb32.ref.png differ diff --git a/test/reference/clip-fill-rule.ps.rgb24.ref.png b/test/reference/clip-fill-rule.ps.rgb24.ref.png new file mode 100644 index 000000000..1b061b718 Binary files /dev/null and b/test/reference/clip-fill-rule.ps.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule.quartz.rgb24.ref.png b/test/reference/clip-fill-rule.quartz.rgb24.ref.png new file mode 100644 index 000000000..c95f290d8 Binary files /dev/null and b/test/reference/clip-fill-rule.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule.rgb24.ref.png b/test/reference/clip-fill-rule.rgb24.ref.png new file mode 100644 index 000000000..e180fccbd Binary files /dev/null and b/test/reference/clip-fill-rule.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule.test-paginated.rgb24.ref.png b/test/reference/clip-fill-rule.test-paginated.rgb24.ref.png new file mode 100644 index 000000000..d21472dc5 Binary files /dev/null and b/test/reference/clip-fill-rule.test-paginated.rgb24.ref.png differ diff --git a/test/reference/clip-fill-rule.traps.argb32.ref.png b/test/reference/clip-fill-rule.traps.argb32.ref.png new file mode 100644 index 000000000..6b083a787 Binary files /dev/null and b/test/reference/clip-fill-rule.traps.argb32.ref.png differ diff --git a/test/reference/clip-fill-rule.traps.rgb24.ref.png b/test/reference/clip-fill-rule.traps.rgb24.ref.png new file mode 100644 index 000000000..d21472dc5 Binary files /dev/null and b/test/reference/clip-fill-rule.traps.rgb24.ref.png differ diff --git a/test/reference/clip-fill.base.argb32.ref.png b/test/reference/clip-fill.base.argb32.ref.png new file mode 100644 index 000000000..72dc2298a Binary files /dev/null and b/test/reference/clip-fill.base.argb32.ref.png differ diff --git a/test/reference/clip-fill.base.rgb24.ref.png b/test/reference/clip-fill.base.rgb24.ref.png new file mode 100644 index 000000000..72dc2298a Binary files /dev/null and b/test/reference/clip-fill.base.rgb24.ref.png differ diff --git a/test/reference/clip-fill.image16.ref.png b/test/reference/clip-fill.image16.ref.png new file mode 100644 index 000000000..24595ba2a Binary files /dev/null and b/test/reference/clip-fill.image16.ref.png differ diff --git a/test/reference/clip-fill.mask.argb32.ref.png b/test/reference/clip-fill.mask.argb32.ref.png new file mode 100644 index 000000000..c3f27003c Binary files /dev/null and b/test/reference/clip-fill.mask.argb32.ref.png differ diff --git a/test/reference/clip-fill.mask.rgb24.ref.png b/test/reference/clip-fill.mask.rgb24.ref.png new file mode 100644 index 000000000..c3f27003c Binary files /dev/null and b/test/reference/clip-fill.mask.rgb24.ref.png differ diff --git a/test/reference/clip-fill.ps.xfail.png b/test/reference/clip-fill.ps.xfail.png new file mode 100644 index 000000000..d0aeaf142 Binary files /dev/null and b/test/reference/clip-fill.ps.xfail.png differ diff --git a/test/reference/clip-fill.quartz.ref.png b/test/reference/clip-fill.quartz.ref.png new file mode 100644 index 000000000..4f235b4dc Binary files /dev/null and b/test/reference/clip-fill.quartz.ref.png differ diff --git a/test/reference/clip-fill.ref.png b/test/reference/clip-fill.ref.png new file mode 100644 index 000000000..7f0785725 Binary files /dev/null and b/test/reference/clip-fill.ref.png differ diff --git a/test/reference/clip-fill.traps.argb32.ref.png b/test/reference/clip-fill.traps.argb32.ref.png new file mode 100644 index 000000000..d6e84a3ef Binary files /dev/null and b/test/reference/clip-fill.traps.argb32.ref.png differ diff --git a/test/reference/clip-fill.traps.rgb24.ref.png b/test/reference/clip-fill.traps.rgb24.ref.png new file mode 100644 index 000000000..d6e84a3ef Binary files /dev/null and b/test/reference/clip-fill.traps.rgb24.ref.png differ diff --git a/test/reference/clip-fill.xlib-fallback.ref.png b/test/reference/clip-fill.xlib-fallback.ref.png new file mode 100644 index 000000000..064b0cfb0 Binary files /dev/null and b/test/reference/clip-fill.xlib-fallback.ref.png differ diff --git a/test/reference/clip-group-shapes-aligned-rectangles.base.argb32.ref.png b/test/reference/clip-group-shapes-aligned-rectangles.base.argb32.ref.png new file mode 100644 index 000000000..cba75078a Binary files /dev/null and b/test/reference/clip-group-shapes-aligned-rectangles.base.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-aligned-rectangles.base.rgb24.ref.png b/test/reference/clip-group-shapes-aligned-rectangles.base.rgb24.ref.png new file mode 100644 index 000000000..cba75078a Binary files /dev/null and b/test/reference/clip-group-shapes-aligned-rectangles.base.rgb24.ref.png differ diff --git a/test/reference/clip-group-shapes-aligned-rectangles.ref.png b/test/reference/clip-group-shapes-aligned-rectangles.ref.png new file mode 100644 index 000000000..cba75078a Binary files /dev/null and b/test/reference/clip-group-shapes-aligned-rectangles.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.base.argb32.ref.png b/test/reference/clip-group-shapes-circles.base.argb32.ref.png new file mode 100644 index 000000000..7dd6a8353 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.base.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.base.rgb24.ref.png b/test/reference/clip-group-shapes-circles.base.rgb24.ref.png new file mode 100644 index 000000000..7dd6a8353 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.base.rgb24.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.mask.argb32.ref.png b/test/reference/clip-group-shapes-circles.mask.argb32.ref.png new file mode 100644 index 000000000..7dd6a8353 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.mask.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.mask.rgb24.ref.png b/test/reference/clip-group-shapes-circles.mask.rgb24.ref.png new file mode 100644 index 000000000..7dd6a8353 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.mask.rgb24.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.ps.ref.png b/test/reference/clip-group-shapes-circles.ps.ref.png new file mode 100644 index 000000000..be6203f25 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.ps.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.quartz.ref.png b/test/reference/clip-group-shapes-circles.quartz.ref.png new file mode 100644 index 000000000..c2ac9ea49 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.quartz.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.ref.png b/test/reference/clip-group-shapes-circles.ref.png new file mode 100644 index 000000000..abb11e52e Binary files /dev/null and b/test/reference/clip-group-shapes-circles.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.traps.argb32.ref.png b/test/reference/clip-group-shapes-circles.traps.argb32.ref.png new file mode 100644 index 000000000..3b8114691 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.traps.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-circles.traps.rgb24.ref.png b/test/reference/clip-group-shapes-circles.traps.rgb24.ref.png new file mode 100644 index 000000000..3b8114691 Binary files /dev/null and b/test/reference/clip-group-shapes-circles.traps.rgb24.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.base.argb32.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.base.argb32.ref.png new file mode 100644 index 000000000..2ad411824 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.base.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.base.rgb24.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.base.rgb24.ref.png new file mode 100644 index 000000000..2ad411824 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.base.rgb24.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.mask.argb32.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.mask.argb32.ref.png new file mode 100644 index 000000000..877e78bd7 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.mask.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.mask.rgb24.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.mask.rgb24.ref.png new file mode 100644 index 000000000..877e78bd7 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.mask.rgb24.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.ref.png new file mode 100644 index 000000000..2ad411824 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.traps.argb32.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.traps.argb32.ref.png new file mode 100644 index 000000000..877e78bd7 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.traps.argb32.ref.png differ diff --git a/test/reference/clip-group-shapes-unaligned-rectangles.traps.rgb24.ref.png b/test/reference/clip-group-shapes-unaligned-rectangles.traps.rgb24.ref.png new file mode 100644 index 000000000..877e78bd7 Binary files /dev/null and b/test/reference/clip-group-shapes-unaligned-rectangles.traps.rgb24.ref.png differ diff --git a/test/reference/clip-image.base.argb32.ref.png b/test/reference/clip-image.base.argb32.ref.png new file mode 100644 index 000000000..0f71f7360 Binary files /dev/null and b/test/reference/clip-image.base.argb32.ref.png differ diff --git a/test/reference/clip-image.base.rgb24.ref.png b/test/reference/clip-image.base.rgb24.ref.png new file mode 100644 index 000000000..0f71f7360 Binary files /dev/null and b/test/reference/clip-image.base.rgb24.ref.png differ diff --git a/test/reference/clip-image.image16.ref.png b/test/reference/clip-image.image16.ref.png new file mode 100644 index 000000000..770891aab Binary files /dev/null and b/test/reference/clip-image.image16.ref.png differ diff --git a/test/reference/clip-image.mask.argb32.ref.png b/test/reference/clip-image.mask.argb32.ref.png new file mode 100644 index 000000000..86c28afd7 Binary files /dev/null and b/test/reference/clip-image.mask.argb32.ref.png differ diff --git a/test/reference/clip-image.mask.rgb24.ref.png b/test/reference/clip-image.mask.rgb24.ref.png new file mode 100644 index 000000000..86c28afd7 Binary files /dev/null and b/test/reference/clip-image.mask.rgb24.ref.png differ diff --git a/test/reference/clip-image.ps.ref.png b/test/reference/clip-image.ps.ref.png new file mode 100644 index 000000000..b2422495f Binary files /dev/null and b/test/reference/clip-image.ps.ref.png differ diff --git a/test/reference/clip-image.ref.png b/test/reference/clip-image.ref.png new file mode 100644 index 000000000..0f71f7360 Binary files /dev/null and b/test/reference/clip-image.ref.png differ diff --git a/test/reference/clip-image.traps.argb32.ref.png b/test/reference/clip-image.traps.argb32.ref.png new file mode 100644 index 000000000..062c721f5 Binary files /dev/null and b/test/reference/clip-image.traps.argb32.ref.png differ diff --git a/test/reference/clip-image.traps.rgb24.ref.png b/test/reference/clip-image.traps.rgb24.ref.png new file mode 100644 index 000000000..062c721f5 Binary files /dev/null and b/test/reference/clip-image.traps.rgb24.ref.png differ diff --git a/test/reference/clip-intersect.base.argb32.ref.png b/test/reference/clip-intersect.base.argb32.ref.png new file mode 100644 index 000000000..6627b3a50 Binary files /dev/null and b/test/reference/clip-intersect.base.argb32.ref.png differ diff --git a/test/reference/clip-intersect.base.rgb24.ref.png b/test/reference/clip-intersect.base.rgb24.ref.png new file mode 100644 index 000000000..6627b3a50 Binary files /dev/null and b/test/reference/clip-intersect.base.rgb24.ref.png differ diff --git a/test/reference/clip-intersect.ref.png b/test/reference/clip-intersect.ref.png new file mode 100644 index 000000000..5f2de3764 Binary files /dev/null and b/test/reference/clip-intersect.ref.png differ diff --git a/test/reference/clip-intersect.traps.argb32.ref.png b/test/reference/clip-intersect.traps.argb32.ref.png new file mode 100644 index 000000000..2e97b5414 Binary files /dev/null and b/test/reference/clip-intersect.traps.argb32.ref.png differ diff --git a/test/reference/clip-intersect.traps.rgb24.ref.png b/test/reference/clip-intersect.traps.rgb24.ref.png new file mode 100644 index 000000000..2e97b5414 Binary files /dev/null and b/test/reference/clip-intersect.traps.rgb24.ref.png differ diff --git a/test/reference/clip-mixed-antialias.base.argb32.ref.png b/test/reference/clip-mixed-antialias.base.argb32.ref.png new file mode 100644 index 000000000..982530cb8 Binary files /dev/null and b/test/reference/clip-mixed-antialias.base.argb32.ref.png differ diff --git a/test/reference/clip-mixed-antialias.base.rgb24.ref.png b/test/reference/clip-mixed-antialias.base.rgb24.ref.png new file mode 100644 index 000000000..982530cb8 Binary files /dev/null and b/test/reference/clip-mixed-antialias.base.rgb24.ref.png differ diff --git a/test/reference/clip-mixed-antialias.ref.png b/test/reference/clip-mixed-antialias.ref.png new file mode 100644 index 000000000..243c4dde6 Binary files /dev/null and b/test/reference/clip-mixed-antialias.ref.png differ diff --git a/test/reference/clip-mixed-antialias.traps.argb32.ref.png b/test/reference/clip-mixed-antialias.traps.argb32.ref.png new file mode 100644 index 000000000..982530cb8 Binary files /dev/null and b/test/reference/clip-mixed-antialias.traps.argb32.ref.png differ diff --git a/test/reference/clip-mixed-antialias.traps.rgb24.ref.png b/test/reference/clip-mixed-antialias.traps.rgb24.ref.png new file mode 100644 index 000000000..982530cb8 Binary files /dev/null and b/test/reference/clip-mixed-antialias.traps.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.argb32.ref.png b/test/reference/clip-nesting.argb32.ref.png new file mode 100644 index 000000000..c82ed463b Binary files /dev/null and b/test/reference/clip-nesting.argb32.ref.png differ diff --git a/test/reference/clip-nesting.base.argb32.ref.png b/test/reference/clip-nesting.base.argb32.ref.png new file mode 100644 index 000000000..ce0cc0d08 Binary files /dev/null and b/test/reference/clip-nesting.base.argb32.ref.png differ diff --git a/test/reference/clip-nesting.base.rgb24.ref.png b/test/reference/clip-nesting.base.rgb24.ref.png new file mode 100644 index 000000000..524784371 Binary files /dev/null and b/test/reference/clip-nesting.base.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.mask.rgb24.ref.png b/test/reference/clip-nesting.mask.rgb24.ref.png new file mode 100644 index 000000000..524784371 Binary files /dev/null and b/test/reference/clip-nesting.mask.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.pdf.argb32.ref.png b/test/reference/clip-nesting.pdf.argb32.ref.png new file mode 100644 index 000000000..78ae6e080 Binary files /dev/null and b/test/reference/clip-nesting.pdf.argb32.ref.png differ diff --git a/test/reference/clip-nesting.ps.argb32.ref.png b/test/reference/clip-nesting.ps.argb32.ref.png new file mode 100644 index 000000000..8a0239be5 Binary files /dev/null and b/test/reference/clip-nesting.ps.argb32.ref.png differ diff --git a/test/reference/clip-nesting.ps.rgb24.ref.png b/test/reference/clip-nesting.ps.rgb24.ref.png new file mode 100644 index 000000000..f9e1ac9fc Binary files /dev/null and b/test/reference/clip-nesting.ps.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.quartz.argb32.ref.png b/test/reference/clip-nesting.quartz.argb32.ref.png new file mode 100644 index 000000000..7bc187c7e Binary files /dev/null and b/test/reference/clip-nesting.quartz.argb32.ref.png differ diff --git a/test/reference/clip-nesting.quartz.rgb24.ref.png b/test/reference/clip-nesting.quartz.rgb24.ref.png new file mode 100644 index 000000000..926f5f590 Binary files /dev/null and b/test/reference/clip-nesting.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.rgb24.ref.png b/test/reference/clip-nesting.rgb24.ref.png new file mode 100644 index 000000000..93c5b1713 Binary files /dev/null and b/test/reference/clip-nesting.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.test-paginated.rgb24.ref.png b/test/reference/clip-nesting.test-paginated.rgb24.ref.png new file mode 100644 index 000000000..d087ab6c1 Binary files /dev/null and b/test/reference/clip-nesting.test-paginated.rgb24.ref.png differ diff --git a/test/reference/clip-nesting.traps.argb32.ref.png b/test/reference/clip-nesting.traps.argb32.ref.png new file mode 100644 index 000000000..01168dfe8 Binary files /dev/null and b/test/reference/clip-nesting.traps.argb32.ref.png differ diff --git a/test/reference/clip-nesting.traps.rgb24.ref.png b/test/reference/clip-nesting.traps.rgb24.ref.png new file mode 100644 index 000000000..d087ab6c1 Binary files /dev/null and b/test/reference/clip-nesting.traps.rgb24.ref.png differ diff --git a/test/reference/clip-operator.argb32.ref.png b/test/reference/clip-operator.argb32.ref.png new file mode 100644 index 000000000..d041a2f6b Binary files /dev/null and b/test/reference/clip-operator.argb32.ref.png differ diff --git a/test/reference/clip-operator.base.argb32.ref.png b/test/reference/clip-operator.base.argb32.ref.png new file mode 100644 index 000000000..f7697bafe Binary files /dev/null and b/test/reference/clip-operator.base.argb32.ref.png differ diff --git a/test/reference/clip-operator.base.rgb24.ref.png b/test/reference/clip-operator.base.rgb24.ref.png new file mode 100644 index 000000000..eed34690e Binary files /dev/null and b/test/reference/clip-operator.base.rgb24.ref.png differ diff --git a/test/reference/clip-operator.gl.argb32.ref.png b/test/reference/clip-operator.gl.argb32.ref.png new file mode 100644 index 000000000..92d8b755c Binary files /dev/null and b/test/reference/clip-operator.gl.argb32.ref.png differ diff --git a/test/reference/clip-operator.image16.ref.png b/test/reference/clip-operator.image16.ref.png new file mode 100644 index 000000000..ab8cd9b89 Binary files /dev/null and b/test/reference/clip-operator.image16.ref.png differ diff --git a/test/reference/clip-operator.mask.argb32.ref.png b/test/reference/clip-operator.mask.argb32.ref.png new file mode 100644 index 000000000..8db1a07c2 Binary files /dev/null and b/test/reference/clip-operator.mask.argb32.ref.png differ diff --git a/test/reference/clip-operator.mask.rgb24.ref.png b/test/reference/clip-operator.mask.rgb24.ref.png new file mode 100644 index 000000000..ddd1ec376 Binary files /dev/null and b/test/reference/clip-operator.mask.rgb24.ref.png differ diff --git a/test/reference/clip-operator.pdf.argb32.ref.png b/test/reference/clip-operator.pdf.argb32.ref.png new file mode 100644 index 000000000..7f8c93eaa Binary files /dev/null and b/test/reference/clip-operator.pdf.argb32.ref.png differ diff --git a/test/reference/clip-operator.pdf.rgb24.ref.png b/test/reference/clip-operator.pdf.rgb24.ref.png new file mode 100644 index 000000000..fc4f431d6 Binary files /dev/null and b/test/reference/clip-operator.pdf.rgb24.ref.png differ diff --git a/test/reference/clip-operator.ps2.rgb24.ref.png b/test/reference/clip-operator.ps2.rgb24.ref.png new file mode 100644 index 000000000..52452993a Binary files /dev/null and b/test/reference/clip-operator.ps2.rgb24.ref.png differ diff --git a/test/reference/clip-operator.ps3.argb32.ref.png b/test/reference/clip-operator.ps3.argb32.ref.png new file mode 100644 index 000000000..cd207d924 Binary files /dev/null and b/test/reference/clip-operator.ps3.argb32.ref.png differ diff --git a/test/reference/clip-operator.ps3.ref.png b/test/reference/clip-operator.ps3.ref.png new file mode 100644 index 000000000..dee12ca8c Binary files /dev/null and b/test/reference/clip-operator.ps3.ref.png differ diff --git a/test/reference/clip-operator.ps3.rgb24.ref.png b/test/reference/clip-operator.ps3.rgb24.ref.png new file mode 100644 index 000000000..52452993a Binary files /dev/null and b/test/reference/clip-operator.ps3.rgb24.ref.png differ diff --git a/test/reference/clip-operator.quartz.argb32.ref.png b/test/reference/clip-operator.quartz.argb32.ref.png new file mode 100644 index 000000000..ecf6ee2af Binary files /dev/null and b/test/reference/clip-operator.quartz.argb32.ref.png differ diff --git a/test/reference/clip-operator.quartz.rgb24.ref.png b/test/reference/clip-operator.quartz.rgb24.ref.png new file mode 100644 index 000000000..67c628f91 Binary files /dev/null and b/test/reference/clip-operator.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-operator.rgb24.ref.png b/test/reference/clip-operator.rgb24.ref.png new file mode 100644 index 000000000..7e3a640ad Binary files /dev/null and b/test/reference/clip-operator.rgb24.ref.png differ diff --git a/test/reference/clip-operator.svg12.argb32.xfail.png b/test/reference/clip-operator.svg12.argb32.xfail.png new file mode 100644 index 000000000..a1b807226 Binary files /dev/null and b/test/reference/clip-operator.svg12.argb32.xfail.png differ diff --git a/test/reference/clip-operator.svg12.rgb24.xfail.png b/test/reference/clip-operator.svg12.rgb24.xfail.png new file mode 100644 index 000000000..95227701b Binary files /dev/null and b/test/reference/clip-operator.svg12.rgb24.xfail.png differ diff --git a/test/reference/clip-operator.test-paginated.argb32.ref.png b/test/reference/clip-operator.test-paginated.argb32.ref.png new file mode 100644 index 000000000..0203b1db5 Binary files /dev/null and b/test/reference/clip-operator.test-paginated.argb32.ref.png differ diff --git a/test/reference/clip-operator.traps.argb32.ref.png b/test/reference/clip-operator.traps.argb32.ref.png new file mode 100644 index 000000000..76f9ee8dd Binary files /dev/null and b/test/reference/clip-operator.traps.argb32.ref.png differ diff --git a/test/reference/clip-operator.traps.rgb24.ref.png b/test/reference/clip-operator.traps.rgb24.ref.png new file mode 100644 index 000000000..f35c9d5d9 Binary files /dev/null and b/test/reference/clip-operator.traps.rgb24.ref.png differ diff --git a/test/reference/clip-operator.xlib-fallback.ref.png b/test/reference/clip-operator.xlib-fallback.ref.png new file mode 100644 index 000000000..9ef8637b6 Binary files /dev/null and b/test/reference/clip-operator.xlib-fallback.ref.png differ diff --git a/test/reference/clip-polygons.base.argb32.ref.png b/test/reference/clip-polygons.base.argb32.ref.png new file mode 100644 index 000000000..e139ef3f5 Binary files /dev/null and b/test/reference/clip-polygons.base.argb32.ref.png differ diff --git a/test/reference/clip-polygons.base.rgb24.ref.png b/test/reference/clip-polygons.base.rgb24.ref.png new file mode 100644 index 000000000..e139ef3f5 Binary files /dev/null and b/test/reference/clip-polygons.base.rgb24.ref.png differ diff --git a/test/reference/clip-polygons.mask.argb32.ref.png b/test/reference/clip-polygons.mask.argb32.ref.png new file mode 100644 index 000000000..e139ef3f5 Binary files /dev/null and b/test/reference/clip-polygons.mask.argb32.ref.png differ diff --git a/test/reference/clip-polygons.mask.rgb24.ref.png b/test/reference/clip-polygons.mask.rgb24.ref.png new file mode 100644 index 000000000..e139ef3f5 Binary files /dev/null and b/test/reference/clip-polygons.mask.rgb24.ref.png differ diff --git a/test/reference/clip-polygons.ref.png b/test/reference/clip-polygons.ref.png new file mode 100644 index 000000000..1b76cd071 Binary files /dev/null and b/test/reference/clip-polygons.ref.png differ diff --git a/test/reference/clip-polygons.traps.ref.png b/test/reference/clip-polygons.traps.ref.png new file mode 100644 index 000000000..a8c5734bc Binary files /dev/null and b/test/reference/clip-polygons.traps.ref.png differ diff --git a/test/reference/clip-push-group.base.argb32.ref.png b/test/reference/clip-push-group.base.argb32.ref.png new file mode 100644 index 000000000..86724a23b Binary files /dev/null and b/test/reference/clip-push-group.base.argb32.ref.png differ diff --git a/test/reference/clip-push-group.base.rgb24.ref.png b/test/reference/clip-push-group.base.rgb24.ref.png new file mode 100644 index 000000000..86724a23b Binary files /dev/null and b/test/reference/clip-push-group.base.rgb24.ref.png differ diff --git a/test/reference/clip-push-group.image16.ref.png b/test/reference/clip-push-group.image16.ref.png new file mode 100644 index 000000000..24f4424fc Binary files /dev/null and b/test/reference/clip-push-group.image16.ref.png differ diff --git a/test/reference/clip-push-group.pdf.ref.png b/test/reference/clip-push-group.pdf.ref.png new file mode 100644 index 000000000..37b58c598 Binary files /dev/null and b/test/reference/clip-push-group.pdf.ref.png differ diff --git a/test/reference/clip-push-group.ps.ref.png b/test/reference/clip-push-group.ps.ref.png new file mode 100644 index 000000000..7af9fe526 Binary files /dev/null and b/test/reference/clip-push-group.ps.ref.png differ diff --git a/test/reference/clip-push-group.quartz.ref.png b/test/reference/clip-push-group.quartz.ref.png new file mode 100644 index 000000000..22e15255d Binary files /dev/null and b/test/reference/clip-push-group.quartz.ref.png differ diff --git a/test/reference/clip-push-group.ref.png b/test/reference/clip-push-group.ref.png new file mode 100644 index 000000000..6a90fb433 Binary files /dev/null and b/test/reference/clip-push-group.ref.png differ diff --git a/test/reference/clip-push-group.svg.ref.png b/test/reference/clip-push-group.svg.ref.png new file mode 100644 index 000000000..291b4738b Binary files /dev/null and b/test/reference/clip-push-group.svg.ref.png differ diff --git a/test/reference/clip-push-group.traps.argb32.ref.png b/test/reference/clip-push-group.traps.argb32.ref.png new file mode 100644 index 000000000..de6ac632c Binary files /dev/null and b/test/reference/clip-push-group.traps.argb32.ref.png differ diff --git a/test/reference/clip-push-group.traps.rgb24.ref.png b/test/reference/clip-push-group.traps.rgb24.ref.png new file mode 100644 index 000000000..de6ac632c Binary files /dev/null and b/test/reference/clip-push-group.traps.rgb24.ref.png differ diff --git a/test/reference/clip-rectilinear.base.argb32.ref.png b/test/reference/clip-rectilinear.base.argb32.ref.png new file mode 100644 index 000000000..9d910db57 Binary files /dev/null and b/test/reference/clip-rectilinear.base.argb32.ref.png differ diff --git a/test/reference/clip-rectilinear.base.rgb24.ref.png b/test/reference/clip-rectilinear.base.rgb24.ref.png new file mode 100644 index 000000000..9d910db57 Binary files /dev/null and b/test/reference/clip-rectilinear.base.rgb24.ref.png differ diff --git a/test/reference/clip-rectilinear.mask.argb32.ref.png b/test/reference/clip-rectilinear.mask.argb32.ref.png new file mode 100644 index 000000000..2a27beca3 Binary files /dev/null and b/test/reference/clip-rectilinear.mask.argb32.ref.png differ diff --git a/test/reference/clip-rectilinear.mask.rgb24.ref.png b/test/reference/clip-rectilinear.mask.rgb24.ref.png new file mode 100644 index 000000000..2a27beca3 Binary files /dev/null and b/test/reference/clip-rectilinear.mask.rgb24.ref.png differ diff --git a/test/reference/clip-rectilinear.ref.png b/test/reference/clip-rectilinear.ref.png new file mode 100644 index 000000000..9d910db57 Binary files /dev/null and b/test/reference/clip-rectilinear.ref.png differ diff --git a/test/reference/clip-rectilinear.traps.ref.png b/test/reference/clip-rectilinear.traps.ref.png new file mode 100644 index 000000000..2a27beca3 Binary files /dev/null and b/test/reference/clip-rectilinear.traps.ref.png differ diff --git a/test/reference/clip-rotate-image-surface-paint.base.argb32.ref.png b/test/reference/clip-rotate-image-surface-paint.base.argb32.ref.png new file mode 100644 index 000000000..1093804d7 Binary files /dev/null and b/test/reference/clip-rotate-image-surface-paint.base.argb32.ref.png differ diff --git a/test/reference/clip-rotate-image-surface-paint.base.rgb24.ref.png b/test/reference/clip-rotate-image-surface-paint.base.rgb24.ref.png new file mode 100644 index 000000000..1093804d7 Binary files /dev/null and b/test/reference/clip-rotate-image-surface-paint.base.rgb24.ref.png differ diff --git a/test/reference/clip-rotate-image-surface-paint.ref.png b/test/reference/clip-rotate-image-surface-paint.ref.png new file mode 100644 index 000000000..1093804d7 Binary files /dev/null and b/test/reference/clip-rotate-image-surface-paint.ref.png differ diff --git a/test/reference/clip-shape.base.argb32.ref.png b/test/reference/clip-shape.base.argb32.ref.png new file mode 100644 index 000000000..5d79521a9 Binary files /dev/null and b/test/reference/clip-shape.base.argb32.ref.png differ diff --git a/test/reference/clip-shape.base.rgb24.ref.png b/test/reference/clip-shape.base.rgb24.ref.png new file mode 100644 index 000000000..5d79521a9 Binary files /dev/null and b/test/reference/clip-shape.base.rgb24.ref.png differ diff --git a/test/reference/clip-shape.image16.ref.png b/test/reference/clip-shape.image16.ref.png new file mode 100644 index 000000000..0ef06b238 Binary files /dev/null and b/test/reference/clip-shape.image16.ref.png differ diff --git a/test/reference/clip-shape.mask.argb32.ref.png b/test/reference/clip-shape.mask.argb32.ref.png new file mode 100644 index 000000000..03edf68f0 Binary files /dev/null and b/test/reference/clip-shape.mask.argb32.ref.png differ diff --git a/test/reference/clip-shape.mask.rgb24.ref.png b/test/reference/clip-shape.mask.rgb24.ref.png new file mode 100644 index 000000000..03edf68f0 Binary files /dev/null and b/test/reference/clip-shape.mask.rgb24.ref.png differ diff --git a/test/reference/clip-shape.ps.ref.png b/test/reference/clip-shape.ps.ref.png new file mode 100644 index 000000000..1125fb595 Binary files /dev/null and b/test/reference/clip-shape.ps.ref.png differ diff --git a/test/reference/clip-shape.quartz.ref.png b/test/reference/clip-shape.quartz.ref.png new file mode 100644 index 000000000..292340676 Binary files /dev/null and b/test/reference/clip-shape.quartz.ref.png differ diff --git a/test/reference/clip-shape.ref.png b/test/reference/clip-shape.ref.png new file mode 100644 index 000000000..83190e616 Binary files /dev/null and b/test/reference/clip-shape.ref.png differ diff --git a/test/reference/clip-shape.traps.argb32.ref.png b/test/reference/clip-shape.traps.argb32.ref.png new file mode 100644 index 000000000..362f24f91 Binary files /dev/null and b/test/reference/clip-shape.traps.argb32.ref.png differ diff --git a/test/reference/clip-shape.traps.rgb24.ref.png b/test/reference/clip-shape.traps.rgb24.ref.png new file mode 100644 index 000000000..362f24f91 Binary files /dev/null and b/test/reference/clip-shape.traps.rgb24.ref.png differ diff --git a/test/reference/clip-shape.xlib-fallback.ref.png b/test/reference/clip-shape.xlib-fallback.ref.png new file mode 100644 index 000000000..e9aa94770 Binary files /dev/null and b/test/reference/clip-shape.xlib-fallback.ref.png differ diff --git a/test/reference/clip-stroke-no-op.base.argb32.ref.png b/test/reference/clip-stroke-no-op.base.argb32.ref.png new file mode 100644 index 000000000..2256461a9 Binary files /dev/null and b/test/reference/clip-stroke-no-op.base.argb32.ref.png differ diff --git a/test/reference/clip-stroke-no-op.base.rgb24.ref.png b/test/reference/clip-stroke-no-op.base.rgb24.ref.png new file mode 100644 index 000000000..2256461a9 Binary files /dev/null and b/test/reference/clip-stroke-no-op.base.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-no-op.image16.ref.png b/test/reference/clip-stroke-no-op.image16.ref.png new file mode 100644 index 000000000..cf0c74ad8 Binary files /dev/null and b/test/reference/clip-stroke-no-op.image16.ref.png differ diff --git a/test/reference/clip-stroke-no-op.ref.png b/test/reference/clip-stroke-no-op.ref.png new file mode 100644 index 000000000..2256461a9 Binary files /dev/null and b/test/reference/clip-stroke-no-op.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.argb32.ref.png b/test/reference/clip-stroke-unbounded.argb32.ref.png new file mode 100644 index 000000000..7f603b70b Binary files /dev/null and b/test/reference/clip-stroke-unbounded.argb32.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.base.argb32.ref.png b/test/reference/clip-stroke-unbounded.base.argb32.ref.png new file mode 100644 index 000000000..de0d5892f Binary files /dev/null and b/test/reference/clip-stroke-unbounded.base.argb32.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.base.rgb24.ref.png b/test/reference/clip-stroke-unbounded.base.rgb24.ref.png new file mode 100644 index 000000000..7d204ee14 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.base.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.image16.rgb24.ref.png b/test/reference/clip-stroke-unbounded.image16.rgb24.ref.png new file mode 100644 index 000000000..2dfd48bac Binary files /dev/null and b/test/reference/clip-stroke-unbounded.image16.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.mask.argb32.ref.png b/test/reference/clip-stroke-unbounded.mask.argb32.ref.png new file mode 100644 index 000000000..274feb641 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.mask.argb32.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.mask.rgb24.ref.png b/test/reference/clip-stroke-unbounded.mask.rgb24.ref.png new file mode 100644 index 000000000..a9a8f7be4 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.mask.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.quartz.argb32.ref.png b/test/reference/clip-stroke-unbounded.quartz.argb32.ref.png new file mode 100644 index 000000000..8bd5b3681 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.quartz.argb32.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.quartz.rgb24.ref.png b/test/reference/clip-stroke-unbounded.quartz.rgb24.ref.png new file mode 100644 index 000000000..5349f8494 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.rgb24.ref.png b/test/reference/clip-stroke-unbounded.rgb24.ref.png new file mode 100644 index 000000000..4a06c4bbc Binary files /dev/null and b/test/reference/clip-stroke-unbounded.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.svg12.rgb24.xfail.png b/test/reference/clip-stroke-unbounded.svg12.rgb24.xfail.png new file mode 100644 index 000000000..c35fc8326 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.svg12.rgb24.xfail.png differ diff --git a/test/reference/clip-stroke-unbounded.traps.argb32.ref.png b/test/reference/clip-stroke-unbounded.traps.argb32.ref.png new file mode 100644 index 000000000..aea8cba70 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.traps.argb32.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.traps.rgb24.ref.png b/test/reference/clip-stroke-unbounded.traps.rgb24.ref.png new file mode 100644 index 000000000..70cddacfa Binary files /dev/null and b/test/reference/clip-stroke-unbounded.traps.rgb24.ref.png differ diff --git a/test/reference/clip-stroke-unbounded.xlib-fallback.rgb24.ref.png b/test/reference/clip-stroke-unbounded.xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..20ebfe443 Binary files /dev/null and b/test/reference/clip-stroke-unbounded.xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/clip-stroke.base.argb32.ref.png b/test/reference/clip-stroke.base.argb32.ref.png new file mode 100644 index 000000000..31ed15e32 Binary files /dev/null and b/test/reference/clip-stroke.base.argb32.ref.png differ diff --git a/test/reference/clip-stroke.base.rgb24.ref.png b/test/reference/clip-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..31ed15e32 Binary files /dev/null and b/test/reference/clip-stroke.base.rgb24.ref.png differ diff --git a/test/reference/clip-stroke.image16.ref.png b/test/reference/clip-stroke.image16.ref.png new file mode 100644 index 000000000..ad62af406 Binary files /dev/null and b/test/reference/clip-stroke.image16.ref.png differ diff --git a/test/reference/clip-stroke.mask.argb32.ref.png b/test/reference/clip-stroke.mask.argb32.ref.png new file mode 100644 index 000000000..afa7fc0dc Binary files /dev/null and b/test/reference/clip-stroke.mask.argb32.ref.png differ diff --git a/test/reference/clip-stroke.mask.rgb24.ref.png b/test/reference/clip-stroke.mask.rgb24.ref.png new file mode 100644 index 000000000..afa7fc0dc Binary files /dev/null and b/test/reference/clip-stroke.mask.rgb24.ref.png differ diff --git a/test/reference/clip-stroke.ps.xfail.png b/test/reference/clip-stroke.ps.xfail.png new file mode 100644 index 000000000..cc67b0882 Binary files /dev/null and b/test/reference/clip-stroke.ps.xfail.png differ diff --git a/test/reference/clip-stroke.quartz.ref.png b/test/reference/clip-stroke.quartz.ref.png new file mode 100644 index 000000000..994e31707 Binary files /dev/null and b/test/reference/clip-stroke.quartz.ref.png differ diff --git a/test/reference/clip-stroke.ref.png b/test/reference/clip-stroke.ref.png new file mode 100644 index 000000000..c29680713 Binary files /dev/null and b/test/reference/clip-stroke.ref.png differ diff --git a/test/reference/clip-stroke.traps.argb32.ref.png b/test/reference/clip-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..36b113adc Binary files /dev/null and b/test/reference/clip-stroke.traps.argb32.ref.png differ diff --git a/test/reference/clip-stroke.traps.rgb24.ref.png b/test/reference/clip-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..36b113adc Binary files /dev/null and b/test/reference/clip-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/clip-stroke.xlib-fallback.ref.png b/test/reference/clip-stroke.xlib-fallback.ref.png new file mode 100644 index 000000000..cef5000f5 Binary files /dev/null and b/test/reference/clip-stroke.xlib-fallback.ref.png differ diff --git a/test/reference/clip-text.base.argb32.ref.png b/test/reference/clip-text.base.argb32.ref.png new file mode 100644 index 000000000..e2b2ca701 Binary files /dev/null and b/test/reference/clip-text.base.argb32.ref.png differ diff --git a/test/reference/clip-text.base.rgb24.ref.png b/test/reference/clip-text.base.rgb24.ref.png new file mode 100644 index 000000000..e2b2ca701 Binary files /dev/null and b/test/reference/clip-text.base.rgb24.ref.png differ diff --git a/test/reference/clip-text.image16.ref.png b/test/reference/clip-text.image16.ref.png new file mode 100644 index 000000000..212295411 Binary files /dev/null and b/test/reference/clip-text.image16.ref.png differ diff --git a/test/reference/clip-text.mask.argb32.ref.png b/test/reference/clip-text.mask.argb32.ref.png new file mode 100644 index 000000000..98484cdd4 Binary files /dev/null and b/test/reference/clip-text.mask.argb32.ref.png differ diff --git a/test/reference/clip-text.mask.rgb24.ref.png b/test/reference/clip-text.mask.rgb24.ref.png new file mode 100644 index 000000000..98484cdd4 Binary files /dev/null and b/test/reference/clip-text.mask.rgb24.ref.png differ diff --git a/test/reference/clip-text.ps.xfail.png b/test/reference/clip-text.ps.xfail.png new file mode 100644 index 000000000..b50217d88 Binary files /dev/null and b/test/reference/clip-text.ps.xfail.png differ diff --git a/test/reference/clip-text.quartz.ref.png b/test/reference/clip-text.quartz.ref.png new file mode 100644 index 000000000..d251bfa08 Binary files /dev/null and b/test/reference/clip-text.quartz.ref.png differ diff --git a/test/reference/clip-text.ref.png b/test/reference/clip-text.ref.png new file mode 100644 index 000000000..c73d1fd35 Binary files /dev/null and b/test/reference/clip-text.ref.png differ diff --git a/test/reference/clip-text.svg.ref.png b/test/reference/clip-text.svg.ref.png new file mode 100644 index 000000000..a113b14ed Binary files /dev/null and b/test/reference/clip-text.svg.ref.png differ diff --git a/test/reference/clip-text.traps.argb32.ref.png b/test/reference/clip-text.traps.argb32.ref.png new file mode 100644 index 000000000..2a682981c Binary files /dev/null and b/test/reference/clip-text.traps.argb32.ref.png differ diff --git a/test/reference/clip-text.traps.rgb24.ref.png b/test/reference/clip-text.traps.rgb24.ref.png new file mode 100644 index 000000000..2a682981c Binary files /dev/null and b/test/reference/clip-text.traps.rgb24.ref.png differ diff --git a/test/reference/clip-twice-rectangle.base.argb32.ref.png b/test/reference/clip-twice-rectangle.base.argb32.ref.png new file mode 100644 index 000000000..d0e65ead3 Binary files /dev/null and b/test/reference/clip-twice-rectangle.base.argb32.ref.png differ diff --git a/test/reference/clip-twice-rectangle.base.rgb24.ref.png b/test/reference/clip-twice-rectangle.base.rgb24.ref.png new file mode 100644 index 000000000..d0e65ead3 Binary files /dev/null and b/test/reference/clip-twice-rectangle.base.rgb24.ref.png differ diff --git a/test/reference/clip-twice-rectangle.ref.png b/test/reference/clip-twice-rectangle.ref.png new file mode 100644 index 000000000..d0e65ead3 Binary files /dev/null and b/test/reference/clip-twice-rectangle.ref.png differ diff --git a/test/reference/clip-twice.argb32.ref.png b/test/reference/clip-twice.argb32.ref.png new file mode 100644 index 000000000..03dc4a5be Binary files /dev/null and b/test/reference/clip-twice.argb32.ref.png differ diff --git a/test/reference/clip-twice.base.argb32.ref.png b/test/reference/clip-twice.base.argb32.ref.png new file mode 100644 index 000000000..a3dcca4b4 Binary files /dev/null and b/test/reference/clip-twice.base.argb32.ref.png differ diff --git a/test/reference/clip-twice.base.rgb24.ref.png b/test/reference/clip-twice.base.rgb24.ref.png new file mode 100644 index 000000000..0c4aaba37 Binary files /dev/null and b/test/reference/clip-twice.base.rgb24.ref.png differ diff --git a/test/reference/clip-twice.image16.ref.png b/test/reference/clip-twice.image16.ref.png new file mode 100644 index 000000000..d5a3f455a Binary files /dev/null and b/test/reference/clip-twice.image16.ref.png differ diff --git a/test/reference/clip-twice.mask.argb32.ref.png b/test/reference/clip-twice.mask.argb32.ref.png new file mode 100644 index 000000000..828dd23b7 Binary files /dev/null and b/test/reference/clip-twice.mask.argb32.ref.png differ diff --git a/test/reference/clip-twice.mask.rgb24.ref.png b/test/reference/clip-twice.mask.rgb24.ref.png new file mode 100644 index 000000000..8b6baed5e Binary files /dev/null and b/test/reference/clip-twice.mask.rgb24.ref.png differ diff --git a/test/reference/clip-twice.pdf.argb32.ref.png b/test/reference/clip-twice.pdf.argb32.ref.png new file mode 100644 index 000000000..2a7541fe2 Binary files /dev/null and b/test/reference/clip-twice.pdf.argb32.ref.png differ diff --git a/test/reference/clip-twice.ps.argb32.ref.png b/test/reference/clip-twice.ps.argb32.ref.png new file mode 100644 index 000000000..5d29d17f7 Binary files /dev/null and b/test/reference/clip-twice.ps.argb32.ref.png differ diff --git a/test/reference/clip-twice.ps.rgb24.ref.png b/test/reference/clip-twice.ps.rgb24.ref.png new file mode 100644 index 000000000..85eb890c5 Binary files /dev/null and b/test/reference/clip-twice.ps.rgb24.ref.png differ diff --git a/test/reference/clip-twice.quartz.argb32.ref.png b/test/reference/clip-twice.quartz.argb32.ref.png new file mode 100644 index 000000000..04b588d80 Binary files /dev/null and b/test/reference/clip-twice.quartz.argb32.ref.png differ diff --git a/test/reference/clip-twice.quartz.rgb24.ref.png b/test/reference/clip-twice.quartz.rgb24.ref.png new file mode 100644 index 000000000..eb4f62c2f Binary files /dev/null and b/test/reference/clip-twice.quartz.rgb24.ref.png differ diff --git a/test/reference/clip-twice.rgb24.ref.png b/test/reference/clip-twice.rgb24.ref.png new file mode 100644 index 000000000..c25fffa57 Binary files /dev/null and b/test/reference/clip-twice.rgb24.ref.png differ diff --git a/test/reference/clip-twice.test-paginated.argb32.ref.png b/test/reference/clip-twice.test-paginated.argb32.ref.png new file mode 100644 index 000000000..ffd59aaf8 Binary files /dev/null and b/test/reference/clip-twice.test-paginated.argb32.ref.png differ diff --git a/test/reference/clip-twice.test-paginated.rgb24.ref.png b/test/reference/clip-twice.test-paginated.rgb24.ref.png new file mode 100644 index 000000000..e3d0ae49f Binary files /dev/null and b/test/reference/clip-twice.test-paginated.rgb24.ref.png differ diff --git a/test/reference/clip-twice.traps.argb32.ref.png b/test/reference/clip-twice.traps.argb32.ref.png new file mode 100644 index 000000000..057fc31f8 Binary files /dev/null and b/test/reference/clip-twice.traps.argb32.ref.png differ diff --git a/test/reference/clip-twice.traps.rgb24.ref.png b/test/reference/clip-twice.traps.rgb24.ref.png new file mode 100644 index 000000000..6002d34ca Binary files /dev/null and b/test/reference/clip-twice.traps.rgb24.ref.png differ diff --git a/test/reference/clip-unbounded.base.argb32.ref.png b/test/reference/clip-unbounded.base.argb32.ref.png new file mode 100644 index 000000000..0b6590565 Binary files /dev/null and b/test/reference/clip-unbounded.base.argb32.ref.png differ diff --git a/test/reference/clip-unbounded.base.rgb24.ref.png b/test/reference/clip-unbounded.base.rgb24.ref.png new file mode 100644 index 000000000..2baf9f464 Binary files /dev/null and b/test/reference/clip-unbounded.base.rgb24.ref.png differ diff --git a/test/reference/clip-unbounded.pdf.argb32.xfail.png b/test/reference/clip-unbounded.pdf.argb32.xfail.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-unbounded.pdf.argb32.xfail.png differ diff --git a/test/reference/clip-unbounded.pdf.rgb24.xfail.png b/test/reference/clip-unbounded.pdf.rgb24.xfail.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/clip-unbounded.pdf.rgb24.xfail.png differ diff --git a/test/reference/clip-unbounded.ref.png b/test/reference/clip-unbounded.ref.png new file mode 100644 index 000000000..0b6590565 Binary files /dev/null and b/test/reference/clip-unbounded.ref.png differ diff --git a/test/reference/clip-unbounded.svg12.rgb24.xfail.png b/test/reference/clip-unbounded.svg12.rgb24.xfail.png new file mode 100644 index 000000000..0b6590565 Binary files /dev/null and b/test/reference/clip-unbounded.svg12.rgb24.xfail.png differ diff --git a/test/reference/clip-xlib-fallback.rgb24.ref.png b/test/reference/clip-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..062c721f5 Binary files /dev/null and b/test/reference/clip-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/clip-xlib-window.rgb24.ref.png b/test/reference/clip-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..062c721f5 Binary files /dev/null and b/test/reference/clip-xlib-window.rgb24.ref.png differ diff --git a/test/reference/clip-xlib.ref.png b/test/reference/clip-xlib.ref.png new file mode 100644 index 000000000..062c721f5 Binary files /dev/null and b/test/reference/clip-xlib.ref.png differ diff --git a/test/reference/clipped-group.base.argb32.ref.png b/test/reference/clipped-group.base.argb32.ref.png new file mode 100644 index 000000000..bea4c751e Binary files /dev/null and b/test/reference/clipped-group.base.argb32.ref.png differ diff --git a/test/reference/clipped-group.base.rgb24.ref.png b/test/reference/clipped-group.base.rgb24.ref.png new file mode 100644 index 000000000..bea4c751e Binary files /dev/null and b/test/reference/clipped-group.base.rgb24.ref.png differ diff --git a/test/reference/clipped-group.image16.ref.png b/test/reference/clipped-group.image16.ref.png new file mode 100644 index 000000000..bf419f683 Binary files /dev/null and b/test/reference/clipped-group.image16.ref.png differ diff --git a/test/reference/clipped-group.mask.argb32.ref.png b/test/reference/clipped-group.mask.argb32.ref.png new file mode 100644 index 000000000..53b149fc8 Binary files /dev/null and b/test/reference/clipped-group.mask.argb32.ref.png differ diff --git a/test/reference/clipped-group.mask.rgb24.ref.png b/test/reference/clipped-group.mask.rgb24.ref.png new file mode 100644 index 000000000..53b149fc8 Binary files /dev/null and b/test/reference/clipped-group.mask.rgb24.ref.png differ diff --git a/test/reference/clipped-group.pdf.ref.png b/test/reference/clipped-group.pdf.ref.png new file mode 100644 index 000000000..23db5a4fd Binary files /dev/null and b/test/reference/clipped-group.pdf.ref.png differ diff --git a/test/reference/clipped-group.ps2.ref.png b/test/reference/clipped-group.ps2.ref.png new file mode 100644 index 000000000..7a0f45c16 Binary files /dev/null and b/test/reference/clipped-group.ps2.ref.png differ diff --git a/test/reference/clipped-group.ps3.ref.png b/test/reference/clipped-group.ps3.ref.png new file mode 100644 index 000000000..7a0f45c16 Binary files /dev/null and b/test/reference/clipped-group.ps3.ref.png differ diff --git a/test/reference/clipped-group.quartz.ref.png b/test/reference/clipped-group.quartz.ref.png new file mode 100644 index 000000000..10e22f7a1 Binary files /dev/null and b/test/reference/clipped-group.quartz.ref.png differ diff --git a/test/reference/clipped-group.ref.png b/test/reference/clipped-group.ref.png new file mode 100644 index 000000000..245b16e56 Binary files /dev/null and b/test/reference/clipped-group.ref.png differ diff --git a/test/reference/clipped-group.svg.ref.png b/test/reference/clipped-group.svg.ref.png new file mode 100644 index 000000000..196aec049 Binary files /dev/null and b/test/reference/clipped-group.svg.ref.png differ diff --git a/test/reference/clipped-group.traps.argb32.ref.png b/test/reference/clipped-group.traps.argb32.ref.png new file mode 100644 index 000000000..b25c9f4db Binary files /dev/null and b/test/reference/clipped-group.traps.argb32.ref.png differ diff --git a/test/reference/clipped-group.traps.rgb24.ref.png b/test/reference/clipped-group.traps.rgb24.ref.png new file mode 100644 index 000000000..b25c9f4db Binary files /dev/null and b/test/reference/clipped-group.traps.rgb24.ref.png differ diff --git a/test/reference/clipped-group.xlib-fallback.ref.png b/test/reference/clipped-group.xlib-fallback.ref.png new file mode 100644 index 000000000..e0a5dc097 Binary files /dev/null and b/test/reference/clipped-group.xlib-fallback.ref.png differ diff --git a/test/reference/clipped-surface.base.argb32.ref.png b/test/reference/clipped-surface.base.argb32.ref.png new file mode 100644 index 000000000..8e8b0083e Binary files /dev/null and b/test/reference/clipped-surface.base.argb32.ref.png differ diff --git a/test/reference/clipped-surface.base.rgb24.ref.png b/test/reference/clipped-surface.base.rgb24.ref.png new file mode 100644 index 000000000..8e8b0083e Binary files /dev/null and b/test/reference/clipped-surface.base.rgb24.ref.png differ diff --git a/test/reference/clipped-surface.image16.ref.png b/test/reference/clipped-surface.image16.ref.png new file mode 100644 index 000000000..e9ad5723b Binary files /dev/null and b/test/reference/clipped-surface.image16.ref.png differ diff --git a/test/reference/clipped-surface.ref.png b/test/reference/clipped-surface.ref.png new file mode 100644 index 000000000..7fed5a3e0 Binary files /dev/null and b/test/reference/clipped-surface.ref.png differ diff --git a/test/reference/clipped-trapezoids.ref.png b/test/reference/clipped-trapezoids.ref.png new file mode 100644 index 000000000..975a692d8 Binary files /dev/null and b/test/reference/clipped-trapezoids.ref.png differ diff --git a/test/reference/close-path-current-point.base.argb32.ref.png b/test/reference/close-path-current-point.base.argb32.ref.png new file mode 100644 index 000000000..373eb1176 Binary files /dev/null and b/test/reference/close-path-current-point.base.argb32.ref.png differ diff --git a/test/reference/close-path-current-point.base.rgb24.ref.png b/test/reference/close-path-current-point.base.rgb24.ref.png new file mode 100644 index 000000000..373eb1176 Binary files /dev/null and b/test/reference/close-path-current-point.base.rgb24.ref.png differ diff --git a/test/reference/close-path-current-point.image16.ref.png b/test/reference/close-path-current-point.image16.ref.png new file mode 100644 index 000000000..6aacf3e1b Binary files /dev/null and b/test/reference/close-path-current-point.image16.ref.png differ diff --git a/test/reference/close-path-current-point.mask.argb32.ref.png b/test/reference/close-path-current-point.mask.argb32.ref.png new file mode 100644 index 000000000..ab3124b79 Binary files /dev/null and b/test/reference/close-path-current-point.mask.argb32.ref.png differ diff --git a/test/reference/close-path-current-point.mask.rgb24.ref.png b/test/reference/close-path-current-point.mask.rgb24.ref.png new file mode 100644 index 000000000..ab3124b79 Binary files /dev/null and b/test/reference/close-path-current-point.mask.rgb24.ref.png differ diff --git a/test/reference/close-path-current-point.ps.ref.png b/test/reference/close-path-current-point.ps.ref.png new file mode 100644 index 000000000..1442f01f7 Binary files /dev/null and b/test/reference/close-path-current-point.ps.ref.png differ diff --git a/test/reference/close-path-current-point.ref.png b/test/reference/close-path-current-point.ref.png new file mode 100644 index 000000000..3ae490031 Binary files /dev/null and b/test/reference/close-path-current-point.ref.png differ diff --git a/test/reference/close-path-current-point.traps.argb32.ref.png b/test/reference/close-path-current-point.traps.argb32.ref.png new file mode 100644 index 000000000..373eb1176 Binary files /dev/null and b/test/reference/close-path-current-point.traps.argb32.ref.png differ diff --git a/test/reference/close-path-current-point.traps.rgb24.ref.png b/test/reference/close-path-current-point.traps.rgb24.ref.png new file mode 100644 index 000000000..373eb1176 Binary files /dev/null and b/test/reference/close-path-current-point.traps.rgb24.ref.png differ diff --git a/test/reference/close-path.base.argb32.ref.png b/test/reference/close-path.base.argb32.ref.png new file mode 100644 index 000000000..b53fab252 Binary files /dev/null and b/test/reference/close-path.base.argb32.ref.png differ diff --git a/test/reference/close-path.base.rgb24.ref.png b/test/reference/close-path.base.rgb24.ref.png new file mode 100644 index 000000000..b53fab252 Binary files /dev/null and b/test/reference/close-path.base.rgb24.ref.png differ diff --git a/test/reference/close-path.ps2.ref.png b/test/reference/close-path.ps2.ref.png new file mode 100644 index 000000000..e43821c86 Binary files /dev/null and b/test/reference/close-path.ps2.ref.png differ diff --git a/test/reference/close-path.ps3.ref.png b/test/reference/close-path.ps3.ref.png new file mode 100644 index 000000000..e43821c86 Binary files /dev/null and b/test/reference/close-path.ps3.ref.png differ diff --git a/test/reference/close-path.ref.png b/test/reference/close-path.ref.png new file mode 100644 index 000000000..5506ff8bd Binary files /dev/null and b/test/reference/close-path.ref.png differ diff --git a/test/reference/close-path.traps.argb32.ref.png b/test/reference/close-path.traps.argb32.ref.png new file mode 100644 index 000000000..b53fab252 Binary files /dev/null and b/test/reference/close-path.traps.argb32.ref.png differ diff --git a/test/reference/close-path.traps.rgb24.ref.png b/test/reference/close-path.traps.rgb24.ref.png new file mode 100644 index 000000000..b53fab252 Binary files /dev/null and b/test/reference/close-path.traps.rgb24.ref.png differ diff --git a/test/reference/composite-integer-translate-over-repeat.base.argb32.ref.png b/test/reference/composite-integer-translate-over-repeat.base.argb32.ref.png new file mode 100644 index 000000000..c42574988 Binary files /dev/null and b/test/reference/composite-integer-translate-over-repeat.base.argb32.ref.png differ diff --git a/test/reference/composite-integer-translate-over-repeat.base.rgb24.ref.png b/test/reference/composite-integer-translate-over-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..c42574988 Binary files /dev/null and b/test/reference/composite-integer-translate-over-repeat.base.rgb24.ref.png differ diff --git a/test/reference/composite-integer-translate-over-repeat.ps2.ref.png b/test/reference/composite-integer-translate-over-repeat.ps2.ref.png new file mode 100644 index 000000000..f0e7b8401 Binary files /dev/null and b/test/reference/composite-integer-translate-over-repeat.ps2.ref.png differ diff --git a/test/reference/composite-integer-translate-over-repeat.ps3.ref.png b/test/reference/composite-integer-translate-over-repeat.ps3.ref.png new file mode 100644 index 000000000..f0e7b8401 Binary files /dev/null and b/test/reference/composite-integer-translate-over-repeat.ps3.ref.png differ diff --git a/test/reference/composite-integer-translate-over-repeat.ref.png b/test/reference/composite-integer-translate-over-repeat.ref.png new file mode 100644 index 000000000..c04db2631 Binary files /dev/null and b/test/reference/composite-integer-translate-over-repeat.ref.png differ diff --git a/test/reference/composite-integer-translate-over.base.argb32.ref.png b/test/reference/composite-integer-translate-over.base.argb32.ref.png new file mode 100644 index 000000000..7ac3ddf4c Binary files /dev/null and b/test/reference/composite-integer-translate-over.base.argb32.ref.png differ diff --git a/test/reference/composite-integer-translate-over.base.rgb24.ref.png b/test/reference/composite-integer-translate-over.base.rgb24.ref.png new file mode 100644 index 000000000..7ac3ddf4c Binary files /dev/null and b/test/reference/composite-integer-translate-over.base.rgb24.ref.png differ diff --git a/test/reference/composite-integer-translate-over.image16.ref.png b/test/reference/composite-integer-translate-over.image16.ref.png new file mode 100644 index 000000000..acb0917db Binary files /dev/null and b/test/reference/composite-integer-translate-over.image16.ref.png differ diff --git a/test/reference/composite-integer-translate-over.ps2.ref.png b/test/reference/composite-integer-translate-over.ps2.ref.png new file mode 100644 index 000000000..8c8cc0de0 Binary files /dev/null and b/test/reference/composite-integer-translate-over.ps2.ref.png differ diff --git a/test/reference/composite-integer-translate-over.ps3.ref.png b/test/reference/composite-integer-translate-over.ps3.ref.png new file mode 100644 index 000000000..8c8cc0de0 Binary files /dev/null and b/test/reference/composite-integer-translate-over.ps3.ref.png differ diff --git a/test/reference/composite-integer-translate-over.ref.png b/test/reference/composite-integer-translate-over.ref.png new file mode 100644 index 000000000..630d99351 Binary files /dev/null and b/test/reference/composite-integer-translate-over.ref.png differ diff --git a/test/reference/composite-integer-translate-source.base.argb32.ref.png b/test/reference/composite-integer-translate-source.base.argb32.ref.png new file mode 100644 index 000000000..7ac3ddf4c Binary files /dev/null and b/test/reference/composite-integer-translate-source.base.argb32.ref.png differ diff --git a/test/reference/composite-integer-translate-source.base.rgb24.ref.png b/test/reference/composite-integer-translate-source.base.rgb24.ref.png new file mode 100644 index 000000000..7ac3ddf4c Binary files /dev/null and b/test/reference/composite-integer-translate-source.base.rgb24.ref.png differ diff --git a/test/reference/composite-integer-translate-source.image16.ref.png b/test/reference/composite-integer-translate-source.image16.ref.png new file mode 100644 index 000000000..acb0917db Binary files /dev/null and b/test/reference/composite-integer-translate-source.image16.ref.png differ diff --git a/test/reference/composite-integer-translate-source.ps2.ref.png b/test/reference/composite-integer-translate-source.ps2.ref.png new file mode 100644 index 000000000..8c8cc0de0 Binary files /dev/null and b/test/reference/composite-integer-translate-source.ps2.ref.png differ diff --git a/test/reference/composite-integer-translate-source.ps3.ref.png b/test/reference/composite-integer-translate-source.ps3.ref.png new file mode 100644 index 000000000..8c8cc0de0 Binary files /dev/null and b/test/reference/composite-integer-translate-source.ps3.ref.png differ diff --git a/test/reference/composite-integer-translate-source.ref.png b/test/reference/composite-integer-translate-source.ref.png new file mode 100644 index 000000000..da9a3986a Binary files /dev/null and b/test/reference/composite-integer-translate-source.ref.png differ diff --git a/test/reference/composite-integer-translate-source.svg12.argb32.xfail.png b/test/reference/composite-integer-translate-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..c4f319701 Binary files /dev/null and b/test/reference/composite-integer-translate-source.svg12.argb32.xfail.png differ diff --git a/test/reference/composite-integer-translate-source.svg12.rgb24.xfail.png b/test/reference/composite-integer-translate-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..c4f319701 Binary files /dev/null and b/test/reference/composite-integer-translate-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/copy-disjoint.base.argb32.ref.png b/test/reference/copy-disjoint.base.argb32.ref.png new file mode 100644 index 000000000..da9a3b112 Binary files /dev/null and b/test/reference/copy-disjoint.base.argb32.ref.png differ diff --git a/test/reference/copy-disjoint.base.rgb24.ref.png b/test/reference/copy-disjoint.base.rgb24.ref.png new file mode 100644 index 000000000..da9a3b112 Binary files /dev/null and b/test/reference/copy-disjoint.base.rgb24.ref.png differ diff --git a/test/reference/copy-disjoint.ref.png b/test/reference/copy-disjoint.ref.png new file mode 100644 index 000000000..da9a3b112 Binary files /dev/null and b/test/reference/copy-disjoint.ref.png differ diff --git a/test/reference/copy-path.base.argb32.ref.png b/test/reference/copy-path.base.argb32.ref.png new file mode 100644 index 000000000..6ca6f48e6 Binary files /dev/null and b/test/reference/copy-path.base.argb32.ref.png differ diff --git a/test/reference/copy-path.base.rgb24.ref.png b/test/reference/copy-path.base.rgb24.ref.png new file mode 100644 index 000000000..6ca6f48e6 Binary files /dev/null and b/test/reference/copy-path.base.rgb24.ref.png differ diff --git a/test/reference/copy-path.image16.ref.png b/test/reference/copy-path.image16.ref.png new file mode 100644 index 000000000..1b3cabc63 Binary files /dev/null and b/test/reference/copy-path.image16.ref.png differ diff --git a/test/reference/copy-path.ps.ref.png b/test/reference/copy-path.ps.ref.png new file mode 100644 index 000000000..41423a09a Binary files /dev/null and b/test/reference/copy-path.ps.ref.png differ diff --git a/test/reference/copy-path.ref.png b/test/reference/copy-path.ref.png new file mode 100644 index 000000000..b50e9e47b Binary files /dev/null and b/test/reference/copy-path.ref.png differ diff --git a/test/reference/copy-path.traps.argb32.ref.png b/test/reference/copy-path.traps.argb32.ref.png new file mode 100644 index 000000000..6ca6f48e6 Binary files /dev/null and b/test/reference/copy-path.traps.argb32.ref.png differ diff --git a/test/reference/copy-path.traps.rgb24.ref.png b/test/reference/copy-path.traps.rgb24.ref.png new file mode 100644 index 000000000..6ca6f48e6 Binary files /dev/null and b/test/reference/copy-path.traps.rgb24.ref.png differ diff --git a/test/reference/coverage-abutting.ref.png b/test/reference/coverage-abutting.ref.png new file mode 100644 index 000000000..8e37ca313 Binary files /dev/null and b/test/reference/coverage-abutting.ref.png differ diff --git a/test/reference/coverage-column-triangles.ref.png b/test/reference/coverage-column-triangles.ref.png new file mode 100644 index 000000000..aa61031b7 Binary files /dev/null and b/test/reference/coverage-column-triangles.ref.png differ diff --git a/test/reference/coverage-column-triangles.xfail.png b/test/reference/coverage-column-triangles.xfail.png new file mode 100644 index 000000000..566b41544 Binary files /dev/null and b/test/reference/coverage-column-triangles.xfail.png differ diff --git a/test/reference/coverage-column-triangles.xlib.xfail.png b/test/reference/coverage-column-triangles.xlib.xfail.png new file mode 100644 index 000000000..f433b7a84 Binary files /dev/null and b/test/reference/coverage-column-triangles.xlib.xfail.png differ diff --git a/test/reference/coverage-intersecting-quads.ref.png b/test/reference/coverage-intersecting-quads.ref.png new file mode 100644 index 000000000..f56cb5570 Binary files /dev/null and b/test/reference/coverage-intersecting-quads.ref.png differ diff --git a/test/reference/coverage-intersecting-quads.xlib.xfail.png b/test/reference/coverage-intersecting-quads.xlib.xfail.png new file mode 100644 index 000000000..d6b8c2ef2 Binary files /dev/null and b/test/reference/coverage-intersecting-quads.xlib.xfail.png differ diff --git a/test/reference/coverage-intersecting-triangles.ref.png b/test/reference/coverage-intersecting-triangles.ref.png new file mode 100644 index 000000000..40a48c138 Binary files /dev/null and b/test/reference/coverage-intersecting-triangles.ref.png differ diff --git a/test/reference/coverage-intersecting-triangles.xfail.png b/test/reference/coverage-intersecting-triangles.xfail.png new file mode 100644 index 000000000..c0290e492 Binary files /dev/null and b/test/reference/coverage-intersecting-triangles.xfail.png differ diff --git a/test/reference/coverage-intersecting-triangles.xlib.xfail.png b/test/reference/coverage-intersecting-triangles.xlib.xfail.png new file mode 100644 index 000000000..e64cd4741 Binary files /dev/null and b/test/reference/coverage-intersecting-triangles.xlib.xfail.png differ diff --git a/test/reference/coverage-rectangles.ref.png b/test/reference/coverage-rectangles.ref.png new file mode 100644 index 000000000..cc1d31cf8 Binary files /dev/null and b/test/reference/coverage-rectangles.ref.png differ diff --git a/test/reference/coverage-rectangles.xlib.xfail.png b/test/reference/coverage-rectangles.xlib.xfail.png new file mode 100644 index 000000000..622c2d75e Binary files /dev/null and b/test/reference/coverage-rectangles.xlib.xfail.png differ diff --git a/test/reference/coverage-rhombus.ref.png b/test/reference/coverage-rhombus.ref.png new file mode 100644 index 000000000..51e08353e Binary files /dev/null and b/test/reference/coverage-rhombus.ref.png differ diff --git a/test/reference/coverage-rhombus.xfail.png b/test/reference/coverage-rhombus.xfail.png new file mode 100644 index 000000000..cbfc10afa Binary files /dev/null and b/test/reference/coverage-rhombus.xfail.png differ diff --git a/test/reference/coverage-row-triangles.ref.png b/test/reference/coverage-row-triangles.ref.png new file mode 100644 index 000000000..aa61031b7 Binary files /dev/null and b/test/reference/coverage-row-triangles.ref.png differ diff --git a/test/reference/coverage-row-triangles.xfail.png b/test/reference/coverage-row-triangles.xfail.png new file mode 100644 index 000000000..d451ba96a Binary files /dev/null and b/test/reference/coverage-row-triangles.xfail.png differ diff --git a/test/reference/coverage-row-triangles.xlib.xfail.png b/test/reference/coverage-row-triangles.xlib.xfail.png new file mode 100644 index 000000000..f8582fbb9 Binary files /dev/null and b/test/reference/coverage-row-triangles.xlib.xfail.png differ diff --git a/test/reference/coverage-triangles.ref.png b/test/reference/coverage-triangles.ref.png new file mode 100644 index 000000000..f56cb5570 Binary files /dev/null and b/test/reference/coverage-triangles.ref.png differ diff --git a/test/reference/coverage-triangles.xfail.png b/test/reference/coverage-triangles.xfail.png new file mode 100644 index 000000000..dea5983ae Binary files /dev/null and b/test/reference/coverage-triangles.xfail.png differ diff --git a/test/reference/coverage-triangles.xlib.xfail.png b/test/reference/coverage-triangles.xlib.xfail.png new file mode 100644 index 000000000..133fd3384 Binary files /dev/null and b/test/reference/coverage-triangles.xlib.xfail.png differ diff --git a/test/reference/create-from-png-stream.base.argb32.ref.png b/test/reference/create-from-png-stream.base.argb32.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png-stream.base.argb32.ref.png differ diff --git a/test/reference/create-from-png-stream.base.rgb24.ref.png b/test/reference/create-from-png-stream.base.rgb24.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png-stream.base.rgb24.ref.png differ diff --git a/test/reference/create-from-png-stream.ref.png b/test/reference/create-from-png-stream.ref.png new file mode 100644 index 000000000..765adc4a4 Binary files /dev/null and b/test/reference/create-from-png-stream.ref.png differ diff --git a/test/reference/create-from-png.alpha.ref.png b/test/reference/create-from-png.alpha.ref.png new file mode 100644 index 000000000..a5175a1eb Binary files /dev/null and b/test/reference/create-from-png.alpha.ref.png differ diff --git a/test/reference/create-from-png.base.argb32.ref.png b/test/reference/create-from-png.base.argb32.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.base.argb32.ref.png differ diff --git a/test/reference/create-from-png.base.rgb24.ref.png b/test/reference/create-from-png.base.rgb24.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.base.rgb24.ref.png differ diff --git a/test/reference/create-from-png.gray-alpha.ref.png b/test/reference/create-from-png.gray-alpha.ref.png new file mode 100644 index 000000000..f5d47dc4b Binary files /dev/null and b/test/reference/create-from-png.gray-alpha.ref.png differ diff --git a/test/reference/create-from-png.gray.ref.png b/test/reference/create-from-png.gray.ref.png new file mode 100644 index 000000000..12dc90bc3 Binary files /dev/null and b/test/reference/create-from-png.gray.ref.png differ diff --git a/test/reference/create-from-png.indexed-alpha.ref.png b/test/reference/create-from-png.indexed-alpha.ref.png new file mode 100644 index 000000000..9f32c6986 Binary files /dev/null and b/test/reference/create-from-png.indexed-alpha.ref.png differ diff --git a/test/reference/create-from-png.indexed.ref.png b/test/reference/create-from-png.indexed.ref.png new file mode 100644 index 000000000..6b1d71316 Binary files /dev/null and b/test/reference/create-from-png.indexed.ref.png differ diff --git a/test/reference/create-from-png.mask.argb32.ref.png b/test/reference/create-from-png.mask.argb32.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.mask.argb32.ref.png differ diff --git a/test/reference/create-from-png.mask.rgb24.ref.png b/test/reference/create-from-png.mask.rgb24.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.mask.rgb24.ref.png differ diff --git a/test/reference/create-from-png.ref.png b/test/reference/create-from-png.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.ref.png differ diff --git a/test/reference/create-from-png.traps.argb32.ref.png b/test/reference/create-from-png.traps.argb32.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.traps.argb32.ref.png differ diff --git a/test/reference/create-from-png.traps.rgb24.ref.png b/test/reference/create-from-png.traps.rgb24.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/create-from-png.traps.rgb24.ref.png differ diff --git a/test/reference/culled-glyphs.base.argb32.ref.png b/test/reference/culled-glyphs.base.argb32.ref.png new file mode 100644 index 000000000..6701295be Binary files /dev/null and b/test/reference/culled-glyphs.base.argb32.ref.png differ diff --git a/test/reference/culled-glyphs.base.rgb24.ref.png b/test/reference/culled-glyphs.base.rgb24.ref.png new file mode 100644 index 000000000..6701295be Binary files /dev/null and b/test/reference/culled-glyphs.base.rgb24.ref.png differ diff --git a/test/reference/culled-glyphs.image16.ref.png b/test/reference/culled-glyphs.image16.ref.png new file mode 100644 index 000000000..724cb8ff9 Binary files /dev/null and b/test/reference/culled-glyphs.image16.ref.png differ diff --git a/test/reference/culled-glyphs.ps.ref.png b/test/reference/culled-glyphs.ps.ref.png new file mode 100644 index 000000000..f34fb9566 Binary files /dev/null and b/test/reference/culled-glyphs.ps.ref.png differ diff --git a/test/reference/culled-glyphs.quartz.ref.png b/test/reference/culled-glyphs.quartz.ref.png new file mode 100644 index 000000000..1aa234219 Binary files /dev/null and b/test/reference/culled-glyphs.quartz.ref.png differ diff --git a/test/reference/culled-glyphs.ref.png b/test/reference/culled-glyphs.ref.png new file mode 100644 index 000000000..6701295be Binary files /dev/null and b/test/reference/culled-glyphs.ref.png differ diff --git a/test/reference/curve-to-as-line-to.base.argb32.ref.png b/test/reference/curve-to-as-line-to.base.argb32.ref.png new file mode 100644 index 000000000..15589db2e Binary files /dev/null and b/test/reference/curve-to-as-line-to.base.argb32.ref.png differ diff --git a/test/reference/curve-to-as-line-to.base.rgb24.ref.png b/test/reference/curve-to-as-line-to.base.rgb24.ref.png new file mode 100644 index 000000000..15589db2e Binary files /dev/null and b/test/reference/curve-to-as-line-to.base.rgb24.ref.png differ diff --git a/test/reference/curve-to-as-line-to.mask.argb32.ref.png b/test/reference/curve-to-as-line-to.mask.argb32.ref.png new file mode 100644 index 000000000..d2411832e Binary files /dev/null and b/test/reference/curve-to-as-line-to.mask.argb32.ref.png differ diff --git a/test/reference/curve-to-as-line-to.mask.rgb24.ref.png b/test/reference/curve-to-as-line-to.mask.rgb24.ref.png new file mode 100644 index 000000000..d2411832e Binary files /dev/null and b/test/reference/curve-to-as-line-to.mask.rgb24.ref.png differ diff --git a/test/reference/curve-to-as-line-to.ps.xfail.png b/test/reference/curve-to-as-line-to.ps.xfail.png new file mode 100644 index 000000000..3f31058e3 Binary files /dev/null and b/test/reference/curve-to-as-line-to.ps.xfail.png differ diff --git a/test/reference/curve-to-as-line-to.ref.png b/test/reference/curve-to-as-line-to.ref.png new file mode 100644 index 000000000..15589db2e Binary files /dev/null and b/test/reference/curve-to-as-line-to.ref.png differ diff --git a/test/reference/curve-to-as-line-to.traps.argb32.ref.png b/test/reference/curve-to-as-line-to.traps.argb32.ref.png new file mode 100644 index 000000000..15589db2e Binary files /dev/null and b/test/reference/curve-to-as-line-to.traps.argb32.ref.png differ diff --git a/test/reference/curve-to-as-line-to.traps.rgb24.ref.png b/test/reference/curve-to-as-line-to.traps.rgb24.ref.png new file mode 100644 index 000000000..15589db2e Binary files /dev/null and b/test/reference/curve-to-as-line-to.traps.rgb24.ref.png differ diff --git a/test/reference/dash-caps-joins.base.argb32.ref.png b/test/reference/dash-caps-joins.base.argb32.ref.png new file mode 100644 index 000000000..b85b03360 Binary files /dev/null and b/test/reference/dash-caps-joins.base.argb32.ref.png differ diff --git a/test/reference/dash-caps-joins.base.rgb24.ref.png b/test/reference/dash-caps-joins.base.rgb24.ref.png new file mode 100644 index 000000000..b85b03360 Binary files /dev/null and b/test/reference/dash-caps-joins.base.rgb24.ref.png differ diff --git a/test/reference/dash-caps-joins.image16.ref.png b/test/reference/dash-caps-joins.image16.ref.png new file mode 100644 index 000000000..1f8d04877 Binary files /dev/null and b/test/reference/dash-caps-joins.image16.ref.png differ diff --git a/test/reference/dash-caps-joins.mask.argb32.ref.png b/test/reference/dash-caps-joins.mask.argb32.ref.png new file mode 100644 index 000000000..b09b86fce Binary files /dev/null and b/test/reference/dash-caps-joins.mask.argb32.ref.png differ diff --git a/test/reference/dash-caps-joins.mask.rgb24.ref.png b/test/reference/dash-caps-joins.mask.rgb24.ref.png new file mode 100644 index 000000000..b09b86fce Binary files /dev/null and b/test/reference/dash-caps-joins.mask.rgb24.ref.png differ diff --git a/test/reference/dash-caps-joins.ps.ref.png b/test/reference/dash-caps-joins.ps.ref.png new file mode 100644 index 000000000..466bc62d7 Binary files /dev/null and b/test/reference/dash-caps-joins.ps.ref.png differ diff --git a/test/reference/dash-caps-joins.quartz.xfail.png b/test/reference/dash-caps-joins.quartz.xfail.png new file mode 100644 index 000000000..0dc54336b Binary files /dev/null and b/test/reference/dash-caps-joins.quartz.xfail.png differ diff --git a/test/reference/dash-caps-joins.ref.png b/test/reference/dash-caps-joins.ref.png new file mode 100644 index 000000000..0600125bf Binary files /dev/null and b/test/reference/dash-caps-joins.ref.png differ diff --git a/test/reference/dash-caps-joins.traps.argb32.ref.png b/test/reference/dash-caps-joins.traps.argb32.ref.png new file mode 100644 index 000000000..b85b03360 Binary files /dev/null and b/test/reference/dash-caps-joins.traps.argb32.ref.png differ diff --git a/test/reference/dash-caps-joins.traps.rgb24.ref.png b/test/reference/dash-caps-joins.traps.rgb24.ref.png new file mode 100644 index 000000000..b85b03360 Binary files /dev/null and b/test/reference/dash-caps-joins.traps.rgb24.ref.png differ diff --git a/test/reference/dash-curve.image16.ref.png b/test/reference/dash-curve.image16.ref.png new file mode 100644 index 000000000..d89cedace Binary files /dev/null and b/test/reference/dash-curve.image16.ref.png differ diff --git a/test/reference/dash-curve.mask.argb32.ref.png b/test/reference/dash-curve.mask.argb32.ref.png new file mode 100644 index 000000000..8bebde204 Binary files /dev/null and b/test/reference/dash-curve.mask.argb32.ref.png differ diff --git a/test/reference/dash-curve.mask.rgb24.ref.png b/test/reference/dash-curve.mask.rgb24.ref.png new file mode 100644 index 000000000..8bebde204 Binary files /dev/null and b/test/reference/dash-curve.mask.rgb24.ref.png differ diff --git a/test/reference/dash-curve.ps2.ref.png b/test/reference/dash-curve.ps2.ref.png new file mode 100644 index 000000000..ffb402fe3 Binary files /dev/null and b/test/reference/dash-curve.ps2.ref.png differ diff --git a/test/reference/dash-curve.ps3.ref.png b/test/reference/dash-curve.ps3.ref.png new file mode 100644 index 000000000..ffb402fe3 Binary files /dev/null and b/test/reference/dash-curve.ps3.ref.png differ diff --git a/test/reference/dash-curve.quartz.xfail.png b/test/reference/dash-curve.quartz.xfail.png new file mode 100644 index 000000000..b68d7a735 Binary files /dev/null and b/test/reference/dash-curve.quartz.xfail.png differ diff --git a/test/reference/dash-curve.ref.png b/test/reference/dash-curve.ref.png new file mode 100644 index 000000000..8eefce2f9 Binary files /dev/null and b/test/reference/dash-curve.ref.png differ diff --git a/test/reference/dash-curve.traps.argb32.ref.png b/test/reference/dash-curve.traps.argb32.ref.png new file mode 100644 index 000000000..a29f43dc6 Binary files /dev/null and b/test/reference/dash-curve.traps.argb32.ref.png differ diff --git a/test/reference/dash-curve.traps.rgb24.ref.png b/test/reference/dash-curve.traps.rgb24.ref.png new file mode 100644 index 000000000..a29f43dc6 Binary files /dev/null and b/test/reference/dash-curve.traps.rgb24.ref.png differ diff --git a/test/reference/dash-infinite-loop.base.argb32.ref.png b/test/reference/dash-infinite-loop.base.argb32.ref.png new file mode 100644 index 000000000..c0cc7391e Binary files /dev/null and b/test/reference/dash-infinite-loop.base.argb32.ref.png differ diff --git a/test/reference/dash-infinite-loop.base.rgb24.ref.png b/test/reference/dash-infinite-loop.base.rgb24.ref.png new file mode 100644 index 000000000..c0cc7391e Binary files /dev/null and b/test/reference/dash-infinite-loop.base.rgb24.ref.png differ diff --git a/test/reference/dash-infinite-loop.ps.ref.png b/test/reference/dash-infinite-loop.ps.ref.png new file mode 100644 index 000000000..bab313a73 Binary files /dev/null and b/test/reference/dash-infinite-loop.ps.ref.png differ diff --git a/test/reference/dash-infinite-loop.ref.png b/test/reference/dash-infinite-loop.ref.png new file mode 100644 index 000000000..2ae1717a1 Binary files /dev/null and b/test/reference/dash-infinite-loop.ref.png differ diff --git a/test/reference/dash-infinite-loop.traps.argb32.ref.png b/test/reference/dash-infinite-loop.traps.argb32.ref.png new file mode 100644 index 000000000..c0cc7391e Binary files /dev/null and b/test/reference/dash-infinite-loop.traps.argb32.ref.png differ diff --git a/test/reference/dash-infinite-loop.traps.rgb24.ref.png b/test/reference/dash-infinite-loop.traps.rgb24.ref.png new file mode 100644 index 000000000..c0cc7391e Binary files /dev/null and b/test/reference/dash-infinite-loop.traps.rgb24.ref.png differ diff --git a/test/reference/dash-no-dash.base.argb32.ref.png b/test/reference/dash-no-dash.base.argb32.ref.png new file mode 100644 index 000000000..c150a4f02 Binary files /dev/null and b/test/reference/dash-no-dash.base.argb32.ref.png differ diff --git a/test/reference/dash-no-dash.base.rgb24.ref.png b/test/reference/dash-no-dash.base.rgb24.ref.png new file mode 100644 index 000000000..c150a4f02 Binary files /dev/null and b/test/reference/dash-no-dash.base.rgb24.ref.png differ diff --git a/test/reference/dash-no-dash.ref.png b/test/reference/dash-no-dash.ref.png new file mode 100644 index 000000000..9afd045db Binary files /dev/null and b/test/reference/dash-no-dash.ref.png differ diff --git a/test/reference/dash-offset-negative.base.argb32.ref.png b/test/reference/dash-offset-negative.base.argb32.ref.png new file mode 100644 index 000000000..77b929164 Binary files /dev/null and b/test/reference/dash-offset-negative.base.argb32.ref.png differ diff --git a/test/reference/dash-offset-negative.base.rgb24.ref.png b/test/reference/dash-offset-negative.base.rgb24.ref.png new file mode 100644 index 000000000..77b929164 Binary files /dev/null and b/test/reference/dash-offset-negative.base.rgb24.ref.png differ diff --git a/test/reference/dash-offset-negative.pdf.ref.png b/test/reference/dash-offset-negative.pdf.ref.png new file mode 100644 index 000000000..df22d08b2 Binary files /dev/null and b/test/reference/dash-offset-negative.pdf.ref.png differ diff --git a/test/reference/dash-offset-negative.ref.png b/test/reference/dash-offset-negative.ref.png new file mode 100644 index 000000000..df22d08b2 Binary files /dev/null and b/test/reference/dash-offset-negative.ref.png differ diff --git a/test/reference/dash-offset-negative.traps.argb32.ref.png b/test/reference/dash-offset-negative.traps.argb32.ref.png new file mode 100644 index 000000000..77b929164 Binary files /dev/null and b/test/reference/dash-offset-negative.traps.argb32.ref.png differ diff --git a/test/reference/dash-offset-negative.traps.rgb24.ref.png b/test/reference/dash-offset-negative.traps.rgb24.ref.png new file mode 100644 index 000000000..77b929164 Binary files /dev/null and b/test/reference/dash-offset-negative.traps.rgb24.ref.png differ diff --git a/test/reference/dash-offset.base.argb32.ref.png b/test/reference/dash-offset.base.argb32.ref.png new file mode 100644 index 000000000..52600c435 Binary files /dev/null and b/test/reference/dash-offset.base.argb32.ref.png differ diff --git a/test/reference/dash-offset.base.rgb24.ref.png b/test/reference/dash-offset.base.rgb24.ref.png new file mode 100644 index 000000000..52600c435 Binary files /dev/null and b/test/reference/dash-offset.base.rgb24.ref.png differ diff --git a/test/reference/dash-offset.ref.png b/test/reference/dash-offset.ref.png new file mode 100644 index 000000000..52600c435 Binary files /dev/null and b/test/reference/dash-offset.ref.png differ diff --git a/test/reference/dash-scale.image16.ref.png b/test/reference/dash-scale.image16.ref.png new file mode 100644 index 000000000..2b4fca560 Binary files /dev/null and b/test/reference/dash-scale.image16.ref.png differ diff --git a/test/reference/dash-scale.mask.argb32.ref.png b/test/reference/dash-scale.mask.argb32.ref.png new file mode 100644 index 000000000..deef9dcd2 Binary files /dev/null and b/test/reference/dash-scale.mask.argb32.ref.png differ diff --git a/test/reference/dash-scale.mask.rgb24.ref.png b/test/reference/dash-scale.mask.rgb24.ref.png new file mode 100644 index 000000000..deef9dcd2 Binary files /dev/null and b/test/reference/dash-scale.mask.rgb24.ref.png differ diff --git a/test/reference/dash-scale.ps.ref.png b/test/reference/dash-scale.ps.ref.png new file mode 100644 index 000000000..f8c25277c Binary files /dev/null and b/test/reference/dash-scale.ps.ref.png differ diff --git a/test/reference/dash-scale.quartz.ref.png b/test/reference/dash-scale.quartz.ref.png new file mode 100644 index 000000000..62ccdf52d Binary files /dev/null and b/test/reference/dash-scale.quartz.ref.png differ diff --git a/test/reference/dash-scale.ref.png b/test/reference/dash-scale.ref.png new file mode 100644 index 000000000..a169364fd Binary files /dev/null and b/test/reference/dash-scale.ref.png differ diff --git a/test/reference/dash-scale.traps.argb32.ref.png b/test/reference/dash-scale.traps.argb32.ref.png new file mode 100644 index 000000000..c87cad468 Binary files /dev/null and b/test/reference/dash-scale.traps.argb32.ref.png differ diff --git a/test/reference/dash-scale.traps.rgb24.ref.png b/test/reference/dash-scale.traps.rgb24.ref.png new file mode 100644 index 000000000..c87cad468 Binary files /dev/null and b/test/reference/dash-scale.traps.rgb24.ref.png differ diff --git a/test/reference/dash-state.base.argb32.ref.png b/test/reference/dash-state.base.argb32.ref.png new file mode 100644 index 000000000..53341102b Binary files /dev/null and b/test/reference/dash-state.base.argb32.ref.png differ diff --git a/test/reference/dash-state.base.rgb24.ref.png b/test/reference/dash-state.base.rgb24.ref.png new file mode 100644 index 000000000..53341102b Binary files /dev/null and b/test/reference/dash-state.base.rgb24.ref.png differ diff --git a/test/reference/dash-state.image16.ref.png b/test/reference/dash-state.image16.ref.png new file mode 100644 index 000000000..07c77dacc Binary files /dev/null and b/test/reference/dash-state.image16.ref.png differ diff --git a/test/reference/dash-state.ps2.ref.png b/test/reference/dash-state.ps2.ref.png new file mode 100644 index 000000000..88e208c58 Binary files /dev/null and b/test/reference/dash-state.ps2.ref.png differ diff --git a/test/reference/dash-state.ps3.ref.png b/test/reference/dash-state.ps3.ref.png new file mode 100644 index 000000000..88e208c58 Binary files /dev/null and b/test/reference/dash-state.ps3.ref.png differ diff --git a/test/reference/dash-state.quartz.xfail.png b/test/reference/dash-state.quartz.xfail.png new file mode 100644 index 000000000..993498ceb Binary files /dev/null and b/test/reference/dash-state.quartz.xfail.png differ diff --git a/test/reference/dash-state.ref.png b/test/reference/dash-state.ref.png new file mode 100644 index 000000000..31551cfee Binary files /dev/null and b/test/reference/dash-state.ref.png differ diff --git a/test/reference/dash-state.traps.argb32.ref.png b/test/reference/dash-state.traps.argb32.ref.png new file mode 100644 index 000000000..53341102b Binary files /dev/null and b/test/reference/dash-state.traps.argb32.ref.png differ diff --git a/test/reference/dash-state.traps.rgb24.ref.png b/test/reference/dash-state.traps.rgb24.ref.png new file mode 100644 index 000000000..53341102b Binary files /dev/null and b/test/reference/dash-state.traps.rgb24.ref.png differ diff --git a/test/reference/dash-zero-length.base.argb32.ref.png b/test/reference/dash-zero-length.base.argb32.ref.png new file mode 100644 index 000000000..367fe3c91 Binary files /dev/null and b/test/reference/dash-zero-length.base.argb32.ref.png differ diff --git a/test/reference/dash-zero-length.base.rgb24.ref.png b/test/reference/dash-zero-length.base.rgb24.ref.png new file mode 100644 index 000000000..9bd4e93b1 Binary files /dev/null and b/test/reference/dash-zero-length.base.rgb24.ref.png differ diff --git a/test/reference/dash-zero-length.mask.rgb24.ref.png b/test/reference/dash-zero-length.mask.rgb24.ref.png new file mode 100644 index 000000000..b14bd8dca Binary files /dev/null and b/test/reference/dash-zero-length.mask.rgb24.ref.png differ diff --git a/test/reference/dash-zero-length.ps2.ref.png b/test/reference/dash-zero-length.ps2.ref.png new file mode 100644 index 000000000..68fd3fb2e Binary files /dev/null and b/test/reference/dash-zero-length.ps2.ref.png differ diff --git a/test/reference/dash-zero-length.ps2.rgb24.ref.png b/test/reference/dash-zero-length.ps2.rgb24.ref.png new file mode 100644 index 000000000..8a4a40fd4 Binary files /dev/null and b/test/reference/dash-zero-length.ps2.rgb24.ref.png differ diff --git a/test/reference/dash-zero-length.ps3.ref.png b/test/reference/dash-zero-length.ps3.ref.png new file mode 100644 index 000000000..68fd3fb2e Binary files /dev/null and b/test/reference/dash-zero-length.ps3.ref.png differ diff --git a/test/reference/dash-zero-length.ps3.rgb24.ref.png b/test/reference/dash-zero-length.ps3.rgb24.ref.png new file mode 100644 index 000000000..8a4a40fd4 Binary files /dev/null and b/test/reference/dash-zero-length.ps3.rgb24.ref.png differ diff --git a/test/reference/dash-zero-length.ref.png b/test/reference/dash-zero-length.ref.png new file mode 100644 index 000000000..fdc5f5ef2 Binary files /dev/null and b/test/reference/dash-zero-length.ref.png differ diff --git a/test/reference/dash-zero-length.traps.argb32.ref.png b/test/reference/dash-zero-length.traps.argb32.ref.png new file mode 100644 index 000000000..367fe3c91 Binary files /dev/null and b/test/reference/dash-zero-length.traps.argb32.ref.png differ diff --git a/test/reference/dash-zero-length.traps.rgb24.ref.png b/test/reference/dash-zero-length.traps.rgb24.ref.png new file mode 100644 index 000000000..9bd4e93b1 Binary files /dev/null and b/test/reference/dash-zero-length.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-arc.base.argb32.ref.png b/test/reference/degenerate-arc.base.argb32.ref.png new file mode 100644 index 000000000..9cf3b0793 Binary files /dev/null and b/test/reference/degenerate-arc.base.argb32.ref.png differ diff --git a/test/reference/degenerate-arc.base.rgb24.ref.png b/test/reference/degenerate-arc.base.rgb24.ref.png new file mode 100644 index 000000000..9cf3b0793 Binary files /dev/null and b/test/reference/degenerate-arc.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-arc.image16.ref.png b/test/reference/degenerate-arc.image16.ref.png new file mode 100644 index 000000000..690e4a4de Binary files /dev/null and b/test/reference/degenerate-arc.image16.ref.png differ diff --git a/test/reference/degenerate-arc.mask.argb32.ref.png b/test/reference/degenerate-arc.mask.argb32.ref.png new file mode 100644 index 000000000..4da4fd6e4 Binary files /dev/null and b/test/reference/degenerate-arc.mask.argb32.ref.png differ diff --git a/test/reference/degenerate-arc.mask.rgb24.ref.png b/test/reference/degenerate-arc.mask.rgb24.ref.png new file mode 100644 index 000000000..4da4fd6e4 Binary files /dev/null and b/test/reference/degenerate-arc.mask.rgb24.ref.png differ diff --git a/test/reference/degenerate-arc.ps2.ref.png b/test/reference/degenerate-arc.ps2.ref.png new file mode 100644 index 000000000..f6d913460 Binary files /dev/null and b/test/reference/degenerate-arc.ps2.ref.png differ diff --git a/test/reference/degenerate-arc.ps3.ref.png b/test/reference/degenerate-arc.ps3.ref.png new file mode 100644 index 000000000..f6d913460 Binary files /dev/null and b/test/reference/degenerate-arc.ps3.ref.png differ diff --git a/test/reference/degenerate-arc.quartz.ref.png b/test/reference/degenerate-arc.quartz.ref.png new file mode 100644 index 000000000..a43f6c9fd Binary files /dev/null and b/test/reference/degenerate-arc.quartz.ref.png differ diff --git a/test/reference/degenerate-arc.ref.png b/test/reference/degenerate-arc.ref.png new file mode 100644 index 000000000..3242ca4e8 Binary files /dev/null and b/test/reference/degenerate-arc.ref.png differ diff --git a/test/reference/degenerate-arc.traps.argb32.ref.png b/test/reference/degenerate-arc.traps.argb32.ref.png new file mode 100644 index 000000000..9cf3b0793 Binary files /dev/null and b/test/reference/degenerate-arc.traps.argb32.ref.png differ diff --git a/test/reference/degenerate-arc.traps.rgb24.ref.png b/test/reference/degenerate-arc.traps.rgb24.ref.png new file mode 100644 index 000000000..9cf3b0793 Binary files /dev/null and b/test/reference/degenerate-arc.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-arcs.base.argb32.ref.png b/test/reference/degenerate-arcs.base.argb32.ref.png new file mode 100644 index 000000000..fc1869dc1 Binary files /dev/null and b/test/reference/degenerate-arcs.base.argb32.ref.png differ diff --git a/test/reference/degenerate-arcs.base.rgb24.ref.png b/test/reference/degenerate-arcs.base.rgb24.ref.png new file mode 100644 index 000000000..fc1869dc1 Binary files /dev/null and b/test/reference/degenerate-arcs.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-arcs.image16.ref.png b/test/reference/degenerate-arcs.image16.ref.png new file mode 100644 index 000000000..595cb7b93 Binary files /dev/null and b/test/reference/degenerate-arcs.image16.ref.png differ diff --git a/test/reference/degenerate-arcs.ref.png b/test/reference/degenerate-arcs.ref.png new file mode 100644 index 000000000..fc1869dc1 Binary files /dev/null and b/test/reference/degenerate-arcs.ref.png differ diff --git a/test/reference/degenerate-curve-to.base.argb32.ref.png b/test/reference/degenerate-curve-to.base.argb32.ref.png new file mode 100644 index 000000000..b676a1a24 Binary files /dev/null and b/test/reference/degenerate-curve-to.base.argb32.ref.png differ diff --git a/test/reference/degenerate-curve-to.base.rgb24.ref.png b/test/reference/degenerate-curve-to.base.rgb24.ref.png new file mode 100644 index 000000000..b676a1a24 Binary files /dev/null and b/test/reference/degenerate-curve-to.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-curve-to.image16.ref.png b/test/reference/degenerate-curve-to.image16.ref.png new file mode 100644 index 000000000..8036d0f8c Binary files /dev/null and b/test/reference/degenerate-curve-to.image16.ref.png differ diff --git a/test/reference/degenerate-curve-to.mask.argb32.ref.png b/test/reference/degenerate-curve-to.mask.argb32.ref.png new file mode 100644 index 000000000..18ab11ece Binary files /dev/null and b/test/reference/degenerate-curve-to.mask.argb32.ref.png differ diff --git a/test/reference/degenerate-curve-to.mask.rgb24.ref.png b/test/reference/degenerate-curve-to.mask.rgb24.ref.png new file mode 100644 index 000000000..18ab11ece Binary files /dev/null and b/test/reference/degenerate-curve-to.mask.rgb24.ref.png differ diff --git a/test/reference/degenerate-curve-to.ps.xfail.png b/test/reference/degenerate-curve-to.ps.xfail.png new file mode 100644 index 000000000..1c07965fd Binary files /dev/null and b/test/reference/degenerate-curve-to.ps.xfail.png differ diff --git a/test/reference/degenerate-curve-to.quartz.ref.png b/test/reference/degenerate-curve-to.quartz.ref.png new file mode 100644 index 000000000..04483436e Binary files /dev/null and b/test/reference/degenerate-curve-to.quartz.ref.png differ diff --git a/test/reference/degenerate-curve-to.ref.png b/test/reference/degenerate-curve-to.ref.png new file mode 100644 index 000000000..f3fde8701 Binary files /dev/null and b/test/reference/degenerate-curve-to.ref.png differ diff --git a/test/reference/degenerate-curve-to.traps.argb32.ref.png b/test/reference/degenerate-curve-to.traps.argb32.ref.png new file mode 100644 index 000000000..b676a1a24 Binary files /dev/null and b/test/reference/degenerate-curve-to.traps.argb32.ref.png differ diff --git a/test/reference/degenerate-curve-to.traps.rgb24.ref.png b/test/reference/degenerate-curve-to.traps.rgb24.ref.png new file mode 100644 index 000000000..b676a1a24 Binary files /dev/null and b/test/reference/degenerate-curve-to.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-dash.base.argb32.ref.png b/test/reference/degenerate-dash.base.argb32.ref.png new file mode 100644 index 000000000..ab8573a1a Binary files /dev/null and b/test/reference/degenerate-dash.base.argb32.ref.png differ diff --git a/test/reference/degenerate-dash.base.rgb24.ref.png b/test/reference/degenerate-dash.base.rgb24.ref.png new file mode 100644 index 000000000..ab8573a1a Binary files /dev/null and b/test/reference/degenerate-dash.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-dash.mask.argb32.ref.png b/test/reference/degenerate-dash.mask.argb32.ref.png new file mode 100644 index 000000000..2ddfc8bbf Binary files /dev/null and b/test/reference/degenerate-dash.mask.argb32.ref.png differ diff --git a/test/reference/degenerate-dash.mask.rgb24.ref.png b/test/reference/degenerate-dash.mask.rgb24.ref.png new file mode 100644 index 000000000..2ddfc8bbf Binary files /dev/null and b/test/reference/degenerate-dash.mask.rgb24.ref.png differ diff --git a/test/reference/degenerate-dash.ps.xfail.png b/test/reference/degenerate-dash.ps.xfail.png new file mode 100644 index 000000000..d5f8884aa Binary files /dev/null and b/test/reference/degenerate-dash.ps.xfail.png differ diff --git a/test/reference/degenerate-dash.quartz.xfail.png b/test/reference/degenerate-dash.quartz.xfail.png new file mode 100644 index 000000000..594437cca Binary files /dev/null and b/test/reference/degenerate-dash.quartz.xfail.png differ diff --git a/test/reference/degenerate-dash.ref.png b/test/reference/degenerate-dash.ref.png new file mode 100644 index 000000000..e8635f1e0 Binary files /dev/null and b/test/reference/degenerate-dash.ref.png differ diff --git a/test/reference/degenerate-dash.traps.argb32.ref.png b/test/reference/degenerate-dash.traps.argb32.ref.png new file mode 100644 index 000000000..ab8573a1a Binary files /dev/null and b/test/reference/degenerate-dash.traps.argb32.ref.png differ diff --git a/test/reference/degenerate-dash.traps.rgb24.ref.png b/test/reference/degenerate-dash.traps.rgb24.ref.png new file mode 100644 index 000000000..ab8573a1a Binary files /dev/null and b/test/reference/degenerate-dash.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-linear-gradient.base.argb32.ref.png b/test/reference/degenerate-linear-gradient.base.argb32.ref.png new file mode 100644 index 000000000..ceed48a72 Binary files /dev/null and b/test/reference/degenerate-linear-gradient.base.argb32.ref.png differ diff --git a/test/reference/degenerate-linear-gradient.base.rgb24.ref.png b/test/reference/degenerate-linear-gradient.base.rgb24.ref.png new file mode 100644 index 000000000..ceed48a72 Binary files /dev/null and b/test/reference/degenerate-linear-gradient.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-linear-gradient.ref.png b/test/reference/degenerate-linear-gradient.ref.png new file mode 100644 index 000000000..ceed48a72 Binary files /dev/null and b/test/reference/degenerate-linear-gradient.ref.png differ diff --git a/test/reference/degenerate-path.base.argb32.ref.png b/test/reference/degenerate-path.base.argb32.ref.png new file mode 100644 index 000000000..b0fef0e01 Binary files /dev/null and b/test/reference/degenerate-path.base.argb32.ref.png differ diff --git a/test/reference/degenerate-path.base.rgb24.ref.png b/test/reference/degenerate-path.base.rgb24.ref.png new file mode 100644 index 000000000..33a8ac0b8 Binary files /dev/null and b/test/reference/degenerate-path.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-path.mask.argb32.ref.png b/test/reference/degenerate-path.mask.argb32.ref.png new file mode 100644 index 000000000..045939719 Binary files /dev/null and b/test/reference/degenerate-path.mask.argb32.ref.png differ diff --git a/test/reference/degenerate-path.mask.rgb24.ref.png b/test/reference/degenerate-path.mask.rgb24.ref.png new file mode 100644 index 000000000..07fda634a Binary files /dev/null and b/test/reference/degenerate-path.mask.rgb24.ref.png differ diff --git a/test/reference/degenerate-path.ps.argb32.xfail.png b/test/reference/degenerate-path.ps.argb32.xfail.png new file mode 100644 index 000000000..33d713cbd Binary files /dev/null and b/test/reference/degenerate-path.ps.argb32.xfail.png differ diff --git a/test/reference/degenerate-path.ps.rgb24.xfail.png b/test/reference/degenerate-path.ps.rgb24.xfail.png new file mode 100644 index 000000000..e73f3149b Binary files /dev/null and b/test/reference/degenerate-path.ps.rgb24.xfail.png differ diff --git a/test/reference/degenerate-path.quartz.argb32.xfail.png b/test/reference/degenerate-path.quartz.argb32.xfail.png new file mode 100644 index 000000000..d655e2758 Binary files /dev/null and b/test/reference/degenerate-path.quartz.argb32.xfail.png differ diff --git a/test/reference/degenerate-path.quartz.rgb24.xfail.png b/test/reference/degenerate-path.quartz.rgb24.xfail.png new file mode 100644 index 000000000..525695111 Binary files /dev/null and b/test/reference/degenerate-path.quartz.rgb24.xfail.png differ diff --git a/test/reference/degenerate-path.ref.png b/test/reference/degenerate-path.ref.png new file mode 100644 index 000000000..f3dafe652 Binary files /dev/null and b/test/reference/degenerate-path.ref.png differ diff --git a/test/reference/degenerate-path.traps.argb32.ref.png b/test/reference/degenerate-path.traps.argb32.ref.png new file mode 100644 index 000000000..b0fef0e01 Binary files /dev/null and b/test/reference/degenerate-path.traps.argb32.ref.png differ diff --git a/test/reference/degenerate-path.traps.rgb24.ref.png b/test/reference/degenerate-path.traps.rgb24.ref.png new file mode 100644 index 000000000..33a8ac0b8 Binary files /dev/null and b/test/reference/degenerate-path.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-pen.base.argb32.ref.png b/test/reference/degenerate-pen.base.argb32.ref.png new file mode 100644 index 000000000..103b8586a Binary files /dev/null and b/test/reference/degenerate-pen.base.argb32.ref.png differ diff --git a/test/reference/degenerate-pen.base.rgb24.ref.png b/test/reference/degenerate-pen.base.rgb24.ref.png new file mode 100644 index 000000000..103b8586a Binary files /dev/null and b/test/reference/degenerate-pen.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-pen.image16.ref.png b/test/reference/degenerate-pen.image16.ref.png new file mode 100644 index 000000000..55011270b Binary files /dev/null and b/test/reference/degenerate-pen.image16.ref.png differ diff --git a/test/reference/degenerate-pen.ps.ref.png b/test/reference/degenerate-pen.ps.ref.png new file mode 100644 index 000000000..34d173b7d Binary files /dev/null and b/test/reference/degenerate-pen.ps.ref.png differ diff --git a/test/reference/degenerate-pen.ref.png b/test/reference/degenerate-pen.ref.png new file mode 100644 index 000000000..ea65d2275 Binary files /dev/null and b/test/reference/degenerate-pen.ref.png differ diff --git a/test/reference/degenerate-pen.traps.argb32.ref.png b/test/reference/degenerate-pen.traps.argb32.ref.png new file mode 100644 index 000000000..103b8586a Binary files /dev/null and b/test/reference/degenerate-pen.traps.argb32.ref.png differ diff --git a/test/reference/degenerate-pen.traps.rgb24.ref.png b/test/reference/degenerate-pen.traps.rgb24.ref.png new file mode 100644 index 000000000..103b8586a Binary files /dev/null and b/test/reference/degenerate-pen.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-radial-gradient.base.argb32.ref.png b/test/reference/degenerate-radial-gradient.base.argb32.ref.png new file mode 100644 index 000000000..9a5213b58 Binary files /dev/null and b/test/reference/degenerate-radial-gradient.base.argb32.ref.png differ diff --git a/test/reference/degenerate-radial-gradient.base.rgb24.ref.png b/test/reference/degenerate-radial-gradient.base.rgb24.ref.png new file mode 100644 index 000000000..9a5213b58 Binary files /dev/null and b/test/reference/degenerate-radial-gradient.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-radial-gradient.ref.png b/test/reference/degenerate-radial-gradient.ref.png new file mode 100644 index 000000000..9a5213b58 Binary files /dev/null and b/test/reference/degenerate-radial-gradient.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.base.argb32.ref.png b/test/reference/degenerate-rel-curve-to.base.argb32.ref.png new file mode 100644 index 000000000..0353520c9 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.base.argb32.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.base.rgb24.ref.png b/test/reference/degenerate-rel-curve-to.base.rgb24.ref.png new file mode 100644 index 000000000..0353520c9 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.base.rgb24.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.image16.ref.png b/test/reference/degenerate-rel-curve-to.image16.ref.png new file mode 100644 index 000000000..ece894338 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.image16.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.mask.argb32.ref.png b/test/reference/degenerate-rel-curve-to.mask.argb32.ref.png new file mode 100644 index 000000000..c4293adf4 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.mask.argb32.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.mask.rgb24.ref.png b/test/reference/degenerate-rel-curve-to.mask.rgb24.ref.png new file mode 100644 index 000000000..c4293adf4 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.mask.rgb24.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.ps.ref.png b/test/reference/degenerate-rel-curve-to.ps.ref.png new file mode 100644 index 000000000..98a1fc9ec Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.ps.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.quartz.ref.png b/test/reference/degenerate-rel-curve-to.quartz.ref.png new file mode 100644 index 000000000..2d21e0480 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.quartz.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.ref.png b/test/reference/degenerate-rel-curve-to.ref.png new file mode 100644 index 000000000..4284bfa5b Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.traps.argb32.ref.png b/test/reference/degenerate-rel-curve-to.traps.argb32.ref.png new file mode 100644 index 000000000..0353520c9 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.traps.argb32.ref.png differ diff --git a/test/reference/degenerate-rel-curve-to.traps.rgb24.ref.png b/test/reference/degenerate-rel-curve-to.traps.rgb24.ref.png new file mode 100644 index 000000000..0353520c9 Binary files /dev/null and b/test/reference/degenerate-rel-curve-to.traps.rgb24.ref.png differ diff --git a/test/reference/degenerate-solid-dash.ref.png b/test/reference/degenerate-solid-dash.ref.png new file mode 100644 index 000000000..9511289b5 Binary files /dev/null and b/test/reference/degenerate-solid-dash.ref.png differ diff --git a/test/reference/device-offset-fractional.base.argb32.ref.png b/test/reference/device-offset-fractional.base.argb32.ref.png new file mode 100644 index 000000000..b1eef5f28 Binary files /dev/null and b/test/reference/device-offset-fractional.base.argb32.ref.png differ diff --git a/test/reference/device-offset-fractional.base.rgb24.ref.png b/test/reference/device-offset-fractional.base.rgb24.ref.png new file mode 100644 index 000000000..b1eef5f28 Binary files /dev/null and b/test/reference/device-offset-fractional.base.rgb24.ref.png differ diff --git a/test/reference/device-offset-fractional.gl.xfail.png b/test/reference/device-offset-fractional.gl.xfail.png new file mode 100644 index 000000000..96b0a6a62 Binary files /dev/null and b/test/reference/device-offset-fractional.gl.xfail.png differ diff --git a/test/reference/device-offset-fractional.pdf.xfail.png b/test/reference/device-offset-fractional.pdf.xfail.png new file mode 100644 index 000000000..50bbd343c Binary files /dev/null and b/test/reference/device-offset-fractional.pdf.xfail.png differ diff --git a/test/reference/device-offset-fractional.ps2.ref.png b/test/reference/device-offset-fractional.ps2.ref.png new file mode 100644 index 000000000..5b44082c2 Binary files /dev/null and b/test/reference/device-offset-fractional.ps2.ref.png differ diff --git a/test/reference/device-offset-fractional.ps3.ref.png b/test/reference/device-offset-fractional.ps3.ref.png new file mode 100644 index 000000000..5b44082c2 Binary files /dev/null and b/test/reference/device-offset-fractional.ps3.ref.png differ diff --git a/test/reference/device-offset-fractional.ref.png b/test/reference/device-offset-fractional.ref.png new file mode 100644 index 000000000..9250d33d3 Binary files /dev/null and b/test/reference/device-offset-fractional.ref.png differ diff --git a/test/reference/device-offset-positive.base.argb32.ref.png b/test/reference/device-offset-positive.base.argb32.ref.png new file mode 100644 index 000000000..1115bca7a Binary files /dev/null and b/test/reference/device-offset-positive.base.argb32.ref.png differ diff --git a/test/reference/device-offset-positive.base.rgb24.ref.png b/test/reference/device-offset-positive.base.rgb24.ref.png new file mode 100644 index 000000000..dcdd3324c Binary files /dev/null and b/test/reference/device-offset-positive.base.rgb24.ref.png differ diff --git a/test/reference/device-offset-positive.ref.png b/test/reference/device-offset-positive.ref.png new file mode 100644 index 000000000..bdf63afdd Binary files /dev/null and b/test/reference/device-offset-positive.ref.png differ diff --git a/test/reference/device-offset-scale.base.argb32.ref.png b/test/reference/device-offset-scale.base.argb32.ref.png new file mode 100644 index 000000000..fdffbf3c6 Binary files /dev/null and b/test/reference/device-offset-scale.base.argb32.ref.png differ diff --git a/test/reference/device-offset-scale.base.rgb24.ref.png b/test/reference/device-offset-scale.base.rgb24.ref.png new file mode 100644 index 000000000..fdffbf3c6 Binary files /dev/null and b/test/reference/device-offset-scale.base.rgb24.ref.png differ diff --git a/test/reference/device-offset-scale.ref.png b/test/reference/device-offset-scale.ref.png new file mode 100644 index 000000000..66b29732e Binary files /dev/null and b/test/reference/device-offset-scale.ref.png differ diff --git a/test/reference/device-offset-scale.svg.xfail.png b/test/reference/device-offset-scale.svg.xfail.png new file mode 100644 index 000000000..58a82d698 Binary files /dev/null and b/test/reference/device-offset-scale.svg.xfail.png differ diff --git a/test/reference/device-offset.base.argb32.ref.png b/test/reference/device-offset.base.argb32.ref.png new file mode 100644 index 000000000..43ced46b2 Binary files /dev/null and b/test/reference/device-offset.base.argb32.ref.png differ diff --git a/test/reference/device-offset.base.rgb24.ref.png b/test/reference/device-offset.base.rgb24.ref.png new file mode 100644 index 000000000..f19acba17 Binary files /dev/null and b/test/reference/device-offset.base.rgb24.ref.png differ diff --git a/test/reference/device-offset.ref.png b/test/reference/device-offset.ref.png new file mode 100644 index 000000000..22cbfb4d7 Binary files /dev/null and b/test/reference/device-offset.ref.png differ diff --git a/test/reference/drunkard-tails.base.argb32.ref.png b/test/reference/drunkard-tails.base.argb32.ref.png new file mode 100644 index 000000000..92ab0b9f4 Binary files /dev/null and b/test/reference/drunkard-tails.base.argb32.ref.png differ diff --git a/test/reference/drunkard-tails.base.rgb24.ref.png b/test/reference/drunkard-tails.base.rgb24.ref.png new file mode 100644 index 000000000..92ab0b9f4 Binary files /dev/null and b/test/reference/drunkard-tails.base.rgb24.ref.png differ diff --git a/test/reference/drunkard-tails.mask.argb32.ref.png b/test/reference/drunkard-tails.mask.argb32.ref.png new file mode 100644 index 000000000..053e47075 Binary files /dev/null and b/test/reference/drunkard-tails.mask.argb32.ref.png differ diff --git a/test/reference/drunkard-tails.mask.rgb24.ref.png b/test/reference/drunkard-tails.mask.rgb24.ref.png new file mode 100644 index 000000000..053e47075 Binary files /dev/null and b/test/reference/drunkard-tails.mask.rgb24.ref.png differ diff --git a/test/reference/drunkard-tails.ps.ref.png b/test/reference/drunkard-tails.ps.ref.png new file mode 100644 index 000000000..f68c8b58c Binary files /dev/null and b/test/reference/drunkard-tails.ps.ref.png differ diff --git a/test/reference/drunkard-tails.ref.png b/test/reference/drunkard-tails.ref.png new file mode 100644 index 000000000..b38b897aa Binary files /dev/null and b/test/reference/drunkard-tails.ref.png differ diff --git a/test/reference/drunkard-tails.traps.argb32.ref.png b/test/reference/drunkard-tails.traps.argb32.ref.png new file mode 100644 index 000000000..92ab0b9f4 Binary files /dev/null and b/test/reference/drunkard-tails.traps.argb32.ref.png differ diff --git a/test/reference/drunkard-tails.traps.rgb24.ref.png b/test/reference/drunkard-tails.traps.rgb24.ref.png new file mode 100644 index 000000000..92ab0b9f4 Binary files /dev/null and b/test/reference/drunkard-tails.traps.rgb24.ref.png differ diff --git a/test/reference/egl-surface-source.base.argb32.ref.png b/test/reference/egl-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/egl-surface-source.base.argb32.ref.png differ diff --git a/test/reference/egl-surface-source.base.rgb24.ref.png b/test/reference/egl-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/egl-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/egl-surface-source.image16.ref.png b/test/reference/egl-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/egl-surface-source.image16.ref.png differ diff --git a/test/reference/egl-surface-source.ref.png b/test/reference/egl-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/egl-surface-source.ref.png differ diff --git a/test/reference/extend-pad-border.base.argb32.ref.png b/test/reference/extend-pad-border.base.argb32.ref.png new file mode 100644 index 000000000..f4fc524ac Binary files /dev/null and b/test/reference/extend-pad-border.base.argb32.ref.png differ diff --git a/test/reference/extend-pad-border.base.rgb24.ref.png b/test/reference/extend-pad-border.base.rgb24.ref.png new file mode 100644 index 000000000..f4fc524ac Binary files /dev/null and b/test/reference/extend-pad-border.base.rgb24.ref.png differ diff --git a/test/reference/extend-pad-border.image16.ref.png b/test/reference/extend-pad-border.image16.ref.png new file mode 100644 index 000000000..2a1efd4d2 Binary files /dev/null and b/test/reference/extend-pad-border.image16.ref.png differ diff --git a/test/reference/extend-pad-border.pdf.ref.png b/test/reference/extend-pad-border.pdf.ref.png new file mode 100644 index 000000000..f4fc524ac Binary files /dev/null and b/test/reference/extend-pad-border.pdf.ref.png differ diff --git a/test/reference/extend-pad-border.ps.ref.png b/test/reference/extend-pad-border.ps.ref.png new file mode 100644 index 000000000..b1f4c406c Binary files /dev/null and b/test/reference/extend-pad-border.ps.ref.png differ diff --git a/test/reference/extend-pad-border.quartz.ref.png b/test/reference/extend-pad-border.quartz.ref.png new file mode 100644 index 000000000..4ad67a1de Binary files /dev/null and b/test/reference/extend-pad-border.quartz.ref.png differ diff --git a/test/reference/extend-pad-border.ref.png b/test/reference/extend-pad-border.ref.png new file mode 100644 index 000000000..f4fc524ac Binary files /dev/null and b/test/reference/extend-pad-border.ref.png differ diff --git a/test/reference/extend-pad-border.svg.xfail.png b/test/reference/extend-pad-border.svg.xfail.png new file mode 100644 index 000000000..0fde36d90 Binary files /dev/null and b/test/reference/extend-pad-border.svg.xfail.png differ diff --git a/test/reference/extend-pad-similar.base.argb32.ref.png b/test/reference/extend-pad-similar.base.argb32.ref.png new file mode 100644 index 000000000..934522189 Binary files /dev/null and b/test/reference/extend-pad-similar.base.argb32.ref.png differ diff --git a/test/reference/extend-pad-similar.base.rgb24.ref.png b/test/reference/extend-pad-similar.base.rgb24.ref.png new file mode 100644 index 000000000..934522189 Binary files /dev/null and b/test/reference/extend-pad-similar.base.rgb24.ref.png differ diff --git a/test/reference/extend-pad-similar.quartz.xfail.png b/test/reference/extend-pad-similar.quartz.xfail.png new file mode 100644 index 000000000..a2cf3530c Binary files /dev/null and b/test/reference/extend-pad-similar.quartz.xfail.png differ diff --git a/test/reference/extend-pad-similar.ref.png b/test/reference/extend-pad-similar.ref.png new file mode 100644 index 000000000..82da7b65a Binary files /dev/null and b/test/reference/extend-pad-similar.ref.png differ diff --git a/test/reference/extend-pad-similar.svg.xfail.png b/test/reference/extend-pad-similar.svg.xfail.png new file mode 100644 index 000000000..a2cf3530c Binary files /dev/null and b/test/reference/extend-pad-similar.svg.xfail.png differ diff --git a/test/reference/extend-pad.base.argb32.ref.png b/test/reference/extend-pad.base.argb32.ref.png new file mode 100644 index 000000000..934522189 Binary files /dev/null and b/test/reference/extend-pad.base.argb32.ref.png differ diff --git a/test/reference/extend-pad.base.rgb24.ref.png b/test/reference/extend-pad.base.rgb24.ref.png new file mode 100644 index 000000000..934522189 Binary files /dev/null and b/test/reference/extend-pad.base.rgb24.ref.png differ diff --git a/test/reference/extend-pad.ps.ref.png b/test/reference/extend-pad.ps.ref.png new file mode 100644 index 000000000..a249ee209 Binary files /dev/null and b/test/reference/extend-pad.ps.ref.png differ diff --git a/test/reference/extend-pad.quartz.xfail.png b/test/reference/extend-pad.quartz.xfail.png new file mode 100644 index 000000000..a2cf3530c Binary files /dev/null and b/test/reference/extend-pad.quartz.xfail.png differ diff --git a/test/reference/extend-pad.ref.png b/test/reference/extend-pad.ref.png new file mode 100644 index 000000000..82da7b65a Binary files /dev/null and b/test/reference/extend-pad.ref.png differ diff --git a/test/reference/extend-pad.svg.xfail.png b/test/reference/extend-pad.svg.xfail.png new file mode 100644 index 000000000..a2cf3530c Binary files /dev/null and b/test/reference/extend-pad.svg.xfail.png differ diff --git a/test/reference/extend-reflect-similar.base.argb32.ref.png b/test/reference/extend-reflect-similar.base.argb32.ref.png new file mode 100644 index 000000000..5fc3448fa Binary files /dev/null and b/test/reference/extend-reflect-similar.base.argb32.ref.png differ diff --git a/test/reference/extend-reflect-similar.base.rgb24.ref.png b/test/reference/extend-reflect-similar.base.rgb24.ref.png new file mode 100644 index 000000000..5fc3448fa Binary files /dev/null and b/test/reference/extend-reflect-similar.base.rgb24.ref.png differ diff --git a/test/reference/extend-reflect-similar.image16.ref.png b/test/reference/extend-reflect-similar.image16.ref.png new file mode 100644 index 000000000..27c6594ea Binary files /dev/null and b/test/reference/extend-reflect-similar.image16.ref.png differ diff --git a/test/reference/extend-reflect-similar.ps2.ref.png b/test/reference/extend-reflect-similar.ps2.ref.png new file mode 100644 index 000000000..acaee1b5a Binary files /dev/null and b/test/reference/extend-reflect-similar.ps2.ref.png differ diff --git a/test/reference/extend-reflect-similar.ps3.ref.png b/test/reference/extend-reflect-similar.ps3.ref.png new file mode 100644 index 000000000..acaee1b5a Binary files /dev/null and b/test/reference/extend-reflect-similar.ps3.ref.png differ diff --git a/test/reference/extend-reflect-similar.ref.png b/test/reference/extend-reflect-similar.ref.png new file mode 100644 index 000000000..93a8b001b Binary files /dev/null and b/test/reference/extend-reflect-similar.ref.png differ diff --git a/test/reference/extend-reflect.base.argb32.ref.png b/test/reference/extend-reflect.base.argb32.ref.png new file mode 100644 index 000000000..5fc3448fa Binary files /dev/null and b/test/reference/extend-reflect.base.argb32.ref.png differ diff --git a/test/reference/extend-reflect.base.rgb24.ref.png b/test/reference/extend-reflect.base.rgb24.ref.png new file mode 100644 index 000000000..5fc3448fa Binary files /dev/null and b/test/reference/extend-reflect.base.rgb24.ref.png differ diff --git a/test/reference/extend-reflect.image16.ref.png b/test/reference/extend-reflect.image16.ref.png new file mode 100644 index 000000000..27c6594ea Binary files /dev/null and b/test/reference/extend-reflect.image16.ref.png differ diff --git a/test/reference/extend-reflect.ps2.ref.png b/test/reference/extend-reflect.ps2.ref.png new file mode 100644 index 000000000..acaee1b5a Binary files /dev/null and b/test/reference/extend-reflect.ps2.ref.png differ diff --git a/test/reference/extend-reflect.ps3.ref.png b/test/reference/extend-reflect.ps3.ref.png new file mode 100644 index 000000000..acaee1b5a Binary files /dev/null and b/test/reference/extend-reflect.ps3.ref.png differ diff --git a/test/reference/extend-reflect.ref.png b/test/reference/extend-reflect.ref.png new file mode 100644 index 000000000..93a8b001b Binary files /dev/null and b/test/reference/extend-reflect.ref.png differ diff --git a/test/reference/extend-repeat-similar.base.argb32.ref.png b/test/reference/extend-repeat-similar.base.argb32.ref.png new file mode 100644 index 000000000..81f0503df Binary files /dev/null and b/test/reference/extend-repeat-similar.base.argb32.ref.png differ diff --git a/test/reference/extend-repeat-similar.base.rgb24.ref.png b/test/reference/extend-repeat-similar.base.rgb24.ref.png new file mode 100644 index 000000000..81f0503df Binary files /dev/null and b/test/reference/extend-repeat-similar.base.rgb24.ref.png differ diff --git a/test/reference/extend-repeat-similar.image16.ref.png b/test/reference/extend-repeat-similar.image16.ref.png new file mode 100644 index 000000000..cdc742a74 Binary files /dev/null and b/test/reference/extend-repeat-similar.image16.ref.png differ diff --git a/test/reference/extend-repeat-similar.ps2.ref.png b/test/reference/extend-repeat-similar.ps2.ref.png new file mode 100644 index 000000000..8218211ee Binary files /dev/null and b/test/reference/extend-repeat-similar.ps2.ref.png differ diff --git a/test/reference/extend-repeat-similar.ps3.ref.png b/test/reference/extend-repeat-similar.ps3.ref.png new file mode 100644 index 000000000..8218211ee Binary files /dev/null and b/test/reference/extend-repeat-similar.ps3.ref.png differ diff --git a/test/reference/extend-repeat-similar.ref.png b/test/reference/extend-repeat-similar.ref.png new file mode 100644 index 000000000..ee2527fad Binary files /dev/null and b/test/reference/extend-repeat-similar.ref.png differ diff --git a/test/reference/extend-repeat.base.argb32.ref.png b/test/reference/extend-repeat.base.argb32.ref.png new file mode 100644 index 000000000..81f0503df Binary files /dev/null and b/test/reference/extend-repeat.base.argb32.ref.png differ diff --git a/test/reference/extend-repeat.base.rgb24.ref.png b/test/reference/extend-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..81f0503df Binary files /dev/null and b/test/reference/extend-repeat.base.rgb24.ref.png differ diff --git a/test/reference/extend-repeat.image16.ref.png b/test/reference/extend-repeat.image16.ref.png new file mode 100644 index 000000000..cdc742a74 Binary files /dev/null and b/test/reference/extend-repeat.image16.ref.png differ diff --git a/test/reference/extend-repeat.ps2.ref.png b/test/reference/extend-repeat.ps2.ref.png new file mode 100644 index 000000000..8218211ee Binary files /dev/null and b/test/reference/extend-repeat.ps2.ref.png differ diff --git a/test/reference/extend-repeat.ps3.ref.png b/test/reference/extend-repeat.ps3.ref.png new file mode 100644 index 000000000..8218211ee Binary files /dev/null and b/test/reference/extend-repeat.ps3.ref.png differ diff --git a/test/reference/extend-repeat.ref.png b/test/reference/extend-repeat.ref.png new file mode 100644 index 000000000..ee2527fad Binary files /dev/null and b/test/reference/extend-repeat.ref.png differ diff --git a/test/reference/extended-blend-alpha-mask.argb32.ref.png b/test/reference/extended-blend-alpha-mask.argb32.ref.png new file mode 100644 index 000000000..a1dd2a93f Binary files /dev/null and b/test/reference/extended-blend-alpha-mask.argb32.ref.png differ diff --git a/test/reference/extended-blend-alpha-mask.base.argb32.ref.png b/test/reference/extended-blend-alpha-mask.base.argb32.ref.png new file mode 100644 index 000000000..a1dd2a93f Binary files /dev/null and b/test/reference/extended-blend-alpha-mask.base.argb32.ref.png differ diff --git a/test/reference/extended-blend-alpha-mask.base.rgb24.ref.png b/test/reference/extended-blend-alpha-mask.base.rgb24.ref.png new file mode 100644 index 000000000..b5f12f145 Binary files /dev/null and b/test/reference/extended-blend-alpha-mask.base.rgb24.ref.png differ diff --git a/test/reference/extended-blend-alpha-mask.rgb24.ref.png b/test/reference/extended-blend-alpha-mask.rgb24.ref.png new file mode 100644 index 000000000..b5f12f145 Binary files /dev/null and b/test/reference/extended-blend-alpha-mask.rgb24.ref.png differ diff --git a/test/reference/extended-blend-alpha.argb32.ref.png b/test/reference/extended-blend-alpha.argb32.ref.png new file mode 100644 index 000000000..4d56a21fc Binary files /dev/null and b/test/reference/extended-blend-alpha.argb32.ref.png differ diff --git a/test/reference/extended-blend-alpha.base.argb32.ref.png b/test/reference/extended-blend-alpha.base.argb32.ref.png new file mode 100644 index 000000000..4d56a21fc Binary files /dev/null and b/test/reference/extended-blend-alpha.base.argb32.ref.png differ diff --git a/test/reference/extended-blend-alpha.base.rgb24.ref.png b/test/reference/extended-blend-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..86d0e2d91 Binary files /dev/null and b/test/reference/extended-blend-alpha.base.rgb24.ref.png differ diff --git a/test/reference/extended-blend-alpha.image16.ref.png b/test/reference/extended-blend-alpha.image16.ref.png new file mode 100644 index 000000000..df9646977 Binary files /dev/null and b/test/reference/extended-blend-alpha.image16.ref.png differ diff --git a/test/reference/extended-blend-alpha.quartz.argb32.ref.png b/test/reference/extended-blend-alpha.quartz.argb32.ref.png new file mode 100644 index 000000000..e5701a652 Binary files /dev/null and b/test/reference/extended-blend-alpha.quartz.argb32.ref.png differ diff --git a/test/reference/extended-blend-alpha.quartz.rgb24.ref.png b/test/reference/extended-blend-alpha.quartz.rgb24.ref.png new file mode 100644 index 000000000..477d346c5 Binary files /dev/null and b/test/reference/extended-blend-alpha.quartz.rgb24.ref.png differ diff --git a/test/reference/extended-blend-alpha.rgb24.ref.png b/test/reference/extended-blend-alpha.rgb24.ref.png new file mode 100644 index 000000000..86d0e2d91 Binary files /dev/null and b/test/reference/extended-blend-alpha.rgb24.ref.png differ diff --git a/test/reference/extended-blend-alpha.svg12.argb32.xfail.png b/test/reference/extended-blend-alpha.svg12.argb32.xfail.png new file mode 100644 index 000000000..cc344164f Binary files /dev/null and b/test/reference/extended-blend-alpha.svg12.argb32.xfail.png differ diff --git a/test/reference/extended-blend-alpha.svg12.rgb24.xfail.png b/test/reference/extended-blend-alpha.svg12.rgb24.xfail.png new file mode 100644 index 000000000..f80569e99 Binary files /dev/null and b/test/reference/extended-blend-alpha.svg12.rgb24.xfail.png differ diff --git a/test/reference/extended-blend-mask.argb32.ref.png b/test/reference/extended-blend-mask.argb32.ref.png new file mode 100644 index 000000000..79a6e5380 Binary files /dev/null and b/test/reference/extended-blend-mask.argb32.ref.png differ diff --git a/test/reference/extended-blend-mask.base.argb32.ref.png b/test/reference/extended-blend-mask.base.argb32.ref.png new file mode 100644 index 000000000..5fa78e4cc Binary files /dev/null and b/test/reference/extended-blend-mask.base.argb32.ref.png differ diff --git a/test/reference/extended-blend-mask.base.rgb24.ref.png b/test/reference/extended-blend-mask.base.rgb24.ref.png new file mode 100644 index 000000000..1c854745b Binary files /dev/null and b/test/reference/extended-blend-mask.base.rgb24.ref.png differ diff --git a/test/reference/extended-blend-mask.rgb24.ref.png b/test/reference/extended-blend-mask.rgb24.ref.png new file mode 100644 index 000000000..400df6a20 Binary files /dev/null and b/test/reference/extended-blend-mask.rgb24.ref.png differ diff --git a/test/reference/extended-blend-solid-alpha.argb32.ref.png b/test/reference/extended-blend-solid-alpha.argb32.ref.png new file mode 100644 index 000000000..4d56a21fc Binary files /dev/null and b/test/reference/extended-blend-solid-alpha.argb32.ref.png differ diff --git a/test/reference/extended-blend-solid-alpha.base.argb32.ref.png b/test/reference/extended-blend-solid-alpha.base.argb32.ref.png new file mode 100644 index 000000000..4d56a21fc Binary files /dev/null and b/test/reference/extended-blend-solid-alpha.base.argb32.ref.png differ diff --git a/test/reference/extended-blend-solid-alpha.base.rgb24.ref.png b/test/reference/extended-blend-solid-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..86d0e2d91 Binary files /dev/null and b/test/reference/extended-blend-solid-alpha.base.rgb24.ref.png differ diff --git a/test/reference/extended-blend-solid-alpha.image16.ref.png b/test/reference/extended-blend-solid-alpha.image16.ref.png new file mode 100644 index 000000000..df9646977 Binary files /dev/null and b/test/reference/extended-blend-solid-alpha.image16.ref.png differ diff --git a/test/reference/extended-blend-solid-alpha.rgb24.ref.png b/test/reference/extended-blend-solid-alpha.rgb24.ref.png new file mode 100644 index 000000000..86d0e2d91 Binary files /dev/null and b/test/reference/extended-blend-solid-alpha.rgb24.ref.png differ diff --git a/test/reference/extended-blend-solid.argb32.ref.png b/test/reference/extended-blend-solid.argb32.ref.png new file mode 100644 index 000000000..573c16a26 Binary files /dev/null and b/test/reference/extended-blend-solid.argb32.ref.png differ diff --git a/test/reference/extended-blend-solid.base.argb32.ref.png b/test/reference/extended-blend-solid.base.argb32.ref.png new file mode 100644 index 000000000..902ef8845 Binary files /dev/null and b/test/reference/extended-blend-solid.base.argb32.ref.png differ diff --git a/test/reference/extended-blend-solid.base.rgb24.ref.png b/test/reference/extended-blend-solid.base.rgb24.ref.png new file mode 100644 index 000000000..4580e0dad Binary files /dev/null and b/test/reference/extended-blend-solid.base.rgb24.ref.png differ diff --git a/test/reference/extended-blend-solid.image16.ref.png b/test/reference/extended-blend-solid.image16.ref.png new file mode 100644 index 000000000..2052ea7cb Binary files /dev/null and b/test/reference/extended-blend-solid.image16.ref.png differ diff --git a/test/reference/extended-blend-solid.rgb24.ref.png b/test/reference/extended-blend-solid.rgb24.ref.png new file mode 100644 index 000000000..cdcb6ad11 Binary files /dev/null and b/test/reference/extended-blend-solid.rgb24.ref.png differ diff --git a/test/reference/extended-blend.argb32.ref.png b/test/reference/extended-blend.argb32.ref.png new file mode 100644 index 000000000..573c16a26 Binary files /dev/null and b/test/reference/extended-blend.argb32.ref.png differ diff --git a/test/reference/extended-blend.base.argb32.ref.png b/test/reference/extended-blend.base.argb32.ref.png new file mode 100644 index 000000000..902ef8845 Binary files /dev/null and b/test/reference/extended-blend.base.argb32.ref.png differ diff --git a/test/reference/extended-blend.base.rgb24.ref.png b/test/reference/extended-blend.base.rgb24.ref.png new file mode 100644 index 000000000..4580e0dad Binary files /dev/null and b/test/reference/extended-blend.base.rgb24.ref.png differ diff --git a/test/reference/extended-blend.image16.ref.png b/test/reference/extended-blend.image16.ref.png new file mode 100644 index 000000000..2052ea7cb Binary files /dev/null and b/test/reference/extended-blend.image16.ref.png differ diff --git a/test/reference/extended-blend.quartz.argb32.ref.png b/test/reference/extended-blend.quartz.argb32.ref.png new file mode 100644 index 000000000..173c6e23c Binary files /dev/null and b/test/reference/extended-blend.quartz.argb32.ref.png differ diff --git a/test/reference/extended-blend.quartz.rgb24.ref.png b/test/reference/extended-blend.quartz.rgb24.ref.png new file mode 100644 index 000000000..56a1214ee Binary files /dev/null and b/test/reference/extended-blend.quartz.rgb24.ref.png differ diff --git a/test/reference/extended-blend.rgb24.ref.png b/test/reference/extended-blend.rgb24.ref.png new file mode 100644 index 000000000..cdcb6ad11 Binary files /dev/null and b/test/reference/extended-blend.rgb24.ref.png differ diff --git a/test/reference/extended-blend.svg12.argb32.xfail.png b/test/reference/extended-blend.svg12.argb32.xfail.png new file mode 100644 index 000000000..93297a5c4 Binary files /dev/null and b/test/reference/extended-blend.svg12.argb32.xfail.png differ diff --git a/test/reference/extended-blend.svg12.rgb24.xfail.png b/test/reference/extended-blend.svg12.rgb24.xfail.png new file mode 100644 index 000000000..8db02c554 Binary files /dev/null and b/test/reference/extended-blend.svg12.rgb24.xfail.png differ diff --git a/test/reference/fallback-resolution.ppi144x144.ps.ref.png b/test/reference/fallback-resolution.ppi144x144.ps.ref.png new file mode 100644 index 000000000..0922f03d3 Binary files /dev/null and b/test/reference/fallback-resolution.ppi144x144.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi144x144.ref.png b/test/reference/fallback-resolution.ppi144x144.ref.png new file mode 100644 index 000000000..fd0666a42 Binary files /dev/null and b/test/reference/fallback-resolution.ppi144x144.ref.png differ diff --git a/test/reference/fallback-resolution.ppi144x72.ps.ref.png b/test/reference/fallback-resolution.ppi144x72.ps.ref.png new file mode 100644 index 000000000..2f8d82d8d Binary files /dev/null and b/test/reference/fallback-resolution.ppi144x72.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi144x72.ref.png b/test/reference/fallback-resolution.ppi144x72.ref.png new file mode 100644 index 000000000..ec6685cc0 Binary files /dev/null and b/test/reference/fallback-resolution.ppi144x72.ref.png differ diff --git a/test/reference/fallback-resolution.ppi288x288.pdf.ref.png b/test/reference/fallback-resolution.ppi288x288.pdf.ref.png new file mode 100644 index 000000000..181e110fe Binary files /dev/null and b/test/reference/fallback-resolution.ppi288x288.pdf.ref.png differ diff --git a/test/reference/fallback-resolution.ppi288x288.ps.ref.png b/test/reference/fallback-resolution.ppi288x288.ps.ref.png new file mode 100644 index 000000000..99bccef2a Binary files /dev/null and b/test/reference/fallback-resolution.ppi288x288.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi288x288.svg.ref.png b/test/reference/fallback-resolution.ppi288x288.svg.ref.png new file mode 100644 index 000000000..e71ff8157 Binary files /dev/null and b/test/reference/fallback-resolution.ppi288x288.svg.ref.png differ diff --git a/test/reference/fallback-resolution.ppi288x72.ps.ref.png b/test/reference/fallback-resolution.ppi288x72.ps.ref.png new file mode 100644 index 000000000..89b9c5176 Binary files /dev/null and b/test/reference/fallback-resolution.ppi288x72.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi288x72.ref.png b/test/reference/fallback-resolution.ppi288x72.ref.png new file mode 100644 index 000000000..969c04f17 Binary files /dev/null and b/test/reference/fallback-resolution.ppi288x72.ref.png differ diff --git a/test/reference/fallback-resolution.ppi576x576.pdf.ref.png b/test/reference/fallback-resolution.ppi576x576.pdf.ref.png new file mode 100644 index 000000000..5b376199b Binary files /dev/null and b/test/reference/fallback-resolution.ppi576x576.pdf.ref.png differ diff --git a/test/reference/fallback-resolution.ppi576x576.ps.ref.png b/test/reference/fallback-resolution.ppi576x576.ps.ref.png new file mode 100644 index 000000000..9dc473532 Binary files /dev/null and b/test/reference/fallback-resolution.ppi576x576.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi576x576.svg.ref.png b/test/reference/fallback-resolution.ppi576x576.svg.ref.png new file mode 100644 index 000000000..b5a97e30d Binary files /dev/null and b/test/reference/fallback-resolution.ppi576x576.svg.ref.png differ diff --git a/test/reference/fallback-resolution.ppi576x72.ps.ref.png b/test/reference/fallback-resolution.ppi576x72.ps.ref.png new file mode 100644 index 000000000..9ac6be4a5 Binary files /dev/null and b/test/reference/fallback-resolution.ppi576x72.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi576x72.ref.png b/test/reference/fallback-resolution.ppi576x72.ref.png new file mode 100644 index 000000000..bbab0653e Binary files /dev/null and b/test/reference/fallback-resolution.ppi576x72.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x144.ps.ref.png b/test/reference/fallback-resolution.ppi72x144.ps.ref.png new file mode 100644 index 000000000..50b5a9905 Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x144.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x144.ref.png b/test/reference/fallback-resolution.ppi72x144.ref.png new file mode 100644 index 000000000..3f5562967 Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x144.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x288.ps.ref.png b/test/reference/fallback-resolution.ppi72x288.ps.ref.png new file mode 100644 index 000000000..b4ff82d72 Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x288.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x288.ref.png b/test/reference/fallback-resolution.ppi72x288.ref.png new file mode 100644 index 000000000..9d50b64d6 Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x288.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x576.ps.ref.png b/test/reference/fallback-resolution.ppi72x576.ps.ref.png new file mode 100644 index 000000000..6a3ddcb5c Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x576.ps.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x576.ref.png b/test/reference/fallback-resolution.ppi72x576.ref.png new file mode 100644 index 000000000..7b4d62e19 Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x576.ref.png differ diff --git a/test/reference/fallback-resolution.ppi72x72.ref.png b/test/reference/fallback-resolution.ppi72x72.ref.png new file mode 100644 index 000000000..690c0af2d Binary files /dev/null and b/test/reference/fallback-resolution.ppi72x72.ref.png differ diff --git a/test/reference/fallback.argb32.ref.png b/test/reference/fallback.argb32.ref.png new file mode 100644 index 000000000..b96e90af6 Binary files /dev/null and b/test/reference/fallback.argb32.ref.png differ diff --git a/test/reference/fallback.base.argb32.ref.png b/test/reference/fallback.base.argb32.ref.png new file mode 100644 index 000000000..c0c5f4676 Binary files /dev/null and b/test/reference/fallback.base.argb32.ref.png differ diff --git a/test/reference/fallback.base.rgb24.ref.png b/test/reference/fallback.base.rgb24.ref.png new file mode 100644 index 000000000..18b6a7c83 Binary files /dev/null and b/test/reference/fallback.base.rgb24.ref.png differ diff --git a/test/reference/fallback.image16.rgb24.ref.png b/test/reference/fallback.image16.rgb24.ref.png new file mode 100644 index 000000000..d90ab0e6b Binary files /dev/null and b/test/reference/fallback.image16.rgb24.ref.png differ diff --git a/test/reference/fallback.mask.argb32.ref.png b/test/reference/fallback.mask.argb32.ref.png new file mode 100644 index 000000000..b7ce57363 Binary files /dev/null and b/test/reference/fallback.mask.argb32.ref.png differ diff --git a/test/reference/fallback.mask.rgb24.ref.png b/test/reference/fallback.mask.rgb24.ref.png new file mode 100644 index 000000000..16d3c14e4 Binary files /dev/null and b/test/reference/fallback.mask.rgb24.ref.png differ diff --git a/test/reference/fallback.rgb24.ref.png b/test/reference/fallback.rgb24.ref.png new file mode 100644 index 000000000..3f9213219 Binary files /dev/null and b/test/reference/fallback.rgb24.ref.png differ diff --git a/test/reference/fallback.traps.argb32.ref.png b/test/reference/fallback.traps.argb32.ref.png new file mode 100644 index 000000000..c0c5f4676 Binary files /dev/null and b/test/reference/fallback.traps.argb32.ref.png differ diff --git a/test/reference/fallback.traps.rgb24.ref.png b/test/reference/fallback.traps.rgb24.ref.png new file mode 100644 index 000000000..18b6a7c83 Binary files /dev/null and b/test/reference/fallback.traps.rgb24.ref.png differ diff --git a/test/reference/fill-alpha-pattern.base.argb32.ref.png b/test/reference/fill-alpha-pattern.base.argb32.ref.png new file mode 100644 index 000000000..4dafb8359 Binary files /dev/null and b/test/reference/fill-alpha-pattern.base.argb32.ref.png differ diff --git a/test/reference/fill-alpha-pattern.base.rgb24.ref.png b/test/reference/fill-alpha-pattern.base.rgb24.ref.png new file mode 100644 index 000000000..4dafb8359 Binary files /dev/null and b/test/reference/fill-alpha-pattern.base.rgb24.ref.png differ diff --git a/test/reference/fill-alpha-pattern.image16.ref.png b/test/reference/fill-alpha-pattern.image16.ref.png new file mode 100644 index 000000000..f323c10ff Binary files /dev/null and b/test/reference/fill-alpha-pattern.image16.ref.png differ diff --git a/test/reference/fill-alpha-pattern.pdf.ref.png b/test/reference/fill-alpha-pattern.pdf.ref.png new file mode 100644 index 000000000..ed7f40453 Binary files /dev/null and b/test/reference/fill-alpha-pattern.pdf.ref.png differ diff --git a/test/reference/fill-alpha-pattern.ps3.argb32.ref.png b/test/reference/fill-alpha-pattern.ps3.argb32.ref.png new file mode 100644 index 000000000..28689a381 Binary files /dev/null and b/test/reference/fill-alpha-pattern.ps3.argb32.ref.png differ diff --git a/test/reference/fill-alpha-pattern.quartz.ref.png b/test/reference/fill-alpha-pattern.quartz.ref.png new file mode 100644 index 000000000..b612e7a6b Binary files /dev/null and b/test/reference/fill-alpha-pattern.quartz.ref.png differ diff --git a/test/reference/fill-alpha-pattern.ref.png b/test/reference/fill-alpha-pattern.ref.png new file mode 100644 index 000000000..e32eb90f1 Binary files /dev/null and b/test/reference/fill-alpha-pattern.ref.png differ diff --git a/test/reference/fill-alpha-pattern.traps.argb32.ref.png b/test/reference/fill-alpha-pattern.traps.argb32.ref.png new file mode 100644 index 000000000..4dafb8359 Binary files /dev/null and b/test/reference/fill-alpha-pattern.traps.argb32.ref.png differ diff --git a/test/reference/fill-alpha-pattern.traps.rgb24.ref.png b/test/reference/fill-alpha-pattern.traps.rgb24.ref.png new file mode 100644 index 000000000..4dafb8359 Binary files /dev/null and b/test/reference/fill-alpha-pattern.traps.rgb24.ref.png differ diff --git a/test/reference/fill-alpha.base.argb32.ref.png b/test/reference/fill-alpha.base.argb32.ref.png new file mode 100644 index 000000000..85df9198c Binary files /dev/null and b/test/reference/fill-alpha.base.argb32.ref.png differ diff --git a/test/reference/fill-alpha.base.rgb24.ref.png b/test/reference/fill-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..85df9198c Binary files /dev/null and b/test/reference/fill-alpha.base.rgb24.ref.png differ diff --git a/test/reference/fill-alpha.image16.ref.png b/test/reference/fill-alpha.image16.ref.png new file mode 100644 index 000000000..08252b6c9 Binary files /dev/null and b/test/reference/fill-alpha.image16.ref.png differ diff --git a/test/reference/fill-alpha.ps.argb32.ref.png b/test/reference/fill-alpha.ps.argb32.ref.png new file mode 100644 index 000000000..8d70d53f8 Binary files /dev/null and b/test/reference/fill-alpha.ps.argb32.ref.png differ diff --git a/test/reference/fill-alpha.quartz.ref.png b/test/reference/fill-alpha.quartz.ref.png new file mode 100644 index 000000000..81cee81e2 Binary files /dev/null and b/test/reference/fill-alpha.quartz.ref.png differ diff --git a/test/reference/fill-alpha.ref.png b/test/reference/fill-alpha.ref.png new file mode 100644 index 000000000..25c1ac68f Binary files /dev/null and b/test/reference/fill-alpha.ref.png differ diff --git a/test/reference/fill-alpha.traps.argb32.ref.png b/test/reference/fill-alpha.traps.argb32.ref.png new file mode 100644 index 000000000..85df9198c Binary files /dev/null and b/test/reference/fill-alpha.traps.argb32.ref.png differ diff --git a/test/reference/fill-alpha.traps.rgb24.ref.png b/test/reference/fill-alpha.traps.rgb24.ref.png new file mode 100644 index 000000000..85df9198c Binary files /dev/null and b/test/reference/fill-alpha.traps.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.base.argb32.ref.png b/test/reference/fill-and-stroke-alpha-add.base.argb32.ref.png new file mode 100644 index 000000000..71d2b2221 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.base.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.base.rgb24.ref.png b/test/reference/fill-and-stroke-alpha-add.base.rgb24.ref.png new file mode 100644 index 000000000..71d2b2221 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.base.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.image16.ref.png b/test/reference/fill-and-stroke-alpha-add.image16.ref.png new file mode 100644 index 000000000..3162c8115 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.image16.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.quartz.ref.png b/test/reference/fill-and-stroke-alpha-add.quartz.ref.png new file mode 100644 index 000000000..1d8975253 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.quartz.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.ref.png b/test/reference/fill-and-stroke-alpha-add.ref.png new file mode 100644 index 000000000..f10ffc2a3 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.svg12.xfail.png b/test/reference/fill-and-stroke-alpha-add.svg12.xfail.png new file mode 100644 index 000000000..c1d7d6fc7 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.svg12.xfail.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.traps.argb32.ref.png b/test/reference/fill-and-stroke-alpha-add.traps.argb32.ref.png new file mode 100644 index 000000000..71d2b2221 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.traps.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha-add.traps.rgb24.ref.png b/test/reference/fill-and-stroke-alpha-add.traps.rgb24.ref.png new file mode 100644 index 000000000..71d2b2221 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha-add.traps.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha.base.argb32.ref.png b/test/reference/fill-and-stroke-alpha.base.argb32.ref.png new file mode 100644 index 000000000..c85b933b0 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha.base.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha.base.rgb24.ref.png b/test/reference/fill-and-stroke-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..c85b933b0 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha.base.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha.image16.ref.png b/test/reference/fill-and-stroke-alpha.image16.ref.png new file mode 100644 index 000000000..cde5bd92d Binary files /dev/null and b/test/reference/fill-and-stroke-alpha.image16.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha.ref.png b/test/reference/fill-and-stroke-alpha.ref.png new file mode 100644 index 000000000..8e811570e Binary files /dev/null and b/test/reference/fill-and-stroke-alpha.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha.traps.argb32.ref.png b/test/reference/fill-and-stroke-alpha.traps.argb32.ref.png new file mode 100644 index 000000000..c85b933b0 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha.traps.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke-alpha.traps.rgb24.ref.png b/test/reference/fill-and-stroke-alpha.traps.rgb24.ref.png new file mode 100644 index 000000000..c85b933b0 Binary files /dev/null and b/test/reference/fill-and-stroke-alpha.traps.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke.base.argb32.ref.png b/test/reference/fill-and-stroke.base.argb32.ref.png new file mode 100644 index 000000000..3f32060f4 Binary files /dev/null and b/test/reference/fill-and-stroke.base.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke.base.rgb24.ref.png b/test/reference/fill-and-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..2797921e4 Binary files /dev/null and b/test/reference/fill-and-stroke.base.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke.image16.ref.png b/test/reference/fill-and-stroke.image16.ref.png new file mode 100644 index 000000000..f562509f3 Binary files /dev/null and b/test/reference/fill-and-stroke.image16.ref.png differ diff --git a/test/reference/fill-and-stroke.ps.argb32.ref.png b/test/reference/fill-and-stroke.ps.argb32.ref.png new file mode 100644 index 000000000..8cf8d9cc6 Binary files /dev/null and b/test/reference/fill-and-stroke.ps.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke.ps.rgb24.ref.png b/test/reference/fill-and-stroke.ps.rgb24.ref.png new file mode 100644 index 000000000..fceda260e Binary files /dev/null and b/test/reference/fill-and-stroke.ps.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke.quartz.argb32.ref.png b/test/reference/fill-and-stroke.quartz.argb32.ref.png new file mode 100644 index 000000000..944071919 Binary files /dev/null and b/test/reference/fill-and-stroke.quartz.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke.quartz.rgb24.ref.png b/test/reference/fill-and-stroke.quartz.rgb24.ref.png new file mode 100644 index 000000000..5ba219756 Binary files /dev/null and b/test/reference/fill-and-stroke.quartz.rgb24.ref.png differ diff --git a/test/reference/fill-and-stroke.ref.png b/test/reference/fill-and-stroke.ref.png new file mode 100644 index 000000000..c71a4e589 Binary files /dev/null and b/test/reference/fill-and-stroke.ref.png differ diff --git a/test/reference/fill-and-stroke.traps.argb32.ref.png b/test/reference/fill-and-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..3f32060f4 Binary files /dev/null and b/test/reference/fill-and-stroke.traps.argb32.ref.png differ diff --git a/test/reference/fill-and-stroke.traps.rgb24.ref.png b/test/reference/fill-and-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..2797921e4 Binary files /dev/null and b/test/reference/fill-and-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.argb32.ref.png b/test/reference/fill-degenerate-sort-order.argb32.ref.png new file mode 100644 index 000000000..bed9b5ccd Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.argb32.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.base.argb32.ref.png b/test/reference/fill-degenerate-sort-order.base.argb32.ref.png new file mode 100644 index 000000000..860ee1b16 Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.base.argb32.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.base.rgb24.ref.png b/test/reference/fill-degenerate-sort-order.base.rgb24.ref.png new file mode 100644 index 000000000..18b08fc4b Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.base.rgb24.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.image16.ref.png b/test/reference/fill-degenerate-sort-order.image16.ref.png new file mode 100644 index 000000000..6dc207870 Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.image16.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.ps.argb32.xfail.png b/test/reference/fill-degenerate-sort-order.ps.argb32.xfail.png new file mode 100644 index 000000000..79ea63071 Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.ps.argb32.xfail.png differ diff --git a/test/reference/fill-degenerate-sort-order.ps.rgb24.xfail.png b/test/reference/fill-degenerate-sort-order.ps.rgb24.xfail.png new file mode 100644 index 000000000..b4c45f9a1 Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.ps.rgb24.xfail.png differ diff --git a/test/reference/fill-degenerate-sort-order.quartz.argb32.ref.png b/test/reference/fill-degenerate-sort-order.quartz.argb32.ref.png new file mode 100644 index 000000000..a8b9f15bc Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.quartz.argb32.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.quartz.rgb24.ref.png b/test/reference/fill-degenerate-sort-order.quartz.rgb24.ref.png new file mode 100644 index 000000000..703467cf2 Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.quartz.rgb24.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.rgb24.ref.png b/test/reference/fill-degenerate-sort-order.rgb24.ref.png new file mode 100644 index 000000000..3f26e302d Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.rgb24.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.traps.argb32.ref.png b/test/reference/fill-degenerate-sort-order.traps.argb32.ref.png new file mode 100644 index 000000000..860ee1b16 Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.traps.argb32.ref.png differ diff --git a/test/reference/fill-degenerate-sort-order.traps.rgb24.ref.png b/test/reference/fill-degenerate-sort-order.traps.rgb24.ref.png new file mode 100644 index 000000000..18b08fc4b Binary files /dev/null and b/test/reference/fill-degenerate-sort-order.traps.rgb24.ref.png differ diff --git a/test/reference/fill-disjoint.base.argb32.ref.png b/test/reference/fill-disjoint.base.argb32.ref.png new file mode 100644 index 000000000..da9a3b112 Binary files /dev/null and b/test/reference/fill-disjoint.base.argb32.ref.png differ diff --git a/test/reference/fill-disjoint.base.rgb24.ref.png b/test/reference/fill-disjoint.base.rgb24.ref.png new file mode 100644 index 000000000..da9a3b112 Binary files /dev/null and b/test/reference/fill-disjoint.base.rgb24.ref.png differ diff --git a/test/reference/fill-disjoint.ref.png b/test/reference/fill-disjoint.ref.png new file mode 100644 index 000000000..da9a3b112 Binary files /dev/null and b/test/reference/fill-disjoint.ref.png differ diff --git a/test/reference/fill-empty.base.argb32.ref.png b/test/reference/fill-empty.base.argb32.ref.png new file mode 100644 index 000000000..8c26f7ebf Binary files /dev/null and b/test/reference/fill-empty.base.argb32.ref.png differ diff --git a/test/reference/fill-empty.base.rgb24.ref.png b/test/reference/fill-empty.base.rgb24.ref.png new file mode 100644 index 000000000..dc7a8a0e4 Binary files /dev/null and b/test/reference/fill-empty.base.rgb24.ref.png differ diff --git a/test/reference/fill-empty.ref.png b/test/reference/fill-empty.ref.png new file mode 100644 index 000000000..8c26f7ebf Binary files /dev/null and b/test/reference/fill-empty.ref.png differ diff --git a/test/reference/fill-empty.svg12.rgb24.xfail.png b/test/reference/fill-empty.svg12.rgb24.xfail.png new file mode 100644 index 000000000..8c26f7ebf Binary files /dev/null and b/test/reference/fill-empty.svg12.rgb24.xfail.png differ diff --git a/test/reference/fill-image.base.argb32.ref.png b/test/reference/fill-image.base.argb32.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-image.base.argb32.ref.png differ diff --git a/test/reference/fill-image.base.rgb24.ref.png b/test/reference/fill-image.base.rgb24.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-image.base.rgb24.ref.png differ diff --git a/test/reference/fill-image.image16.ref.png b/test/reference/fill-image.image16.ref.png new file mode 100644 index 000000000..3a9b7c794 Binary files /dev/null and b/test/reference/fill-image.image16.ref.png differ diff --git a/test/reference/fill-image.ps.ref.png b/test/reference/fill-image.ps.ref.png new file mode 100644 index 000000000..97137015e Binary files /dev/null and b/test/reference/fill-image.ps.ref.png differ diff --git a/test/reference/fill-image.quartz.ref.png b/test/reference/fill-image.quartz.ref.png new file mode 100644 index 000000000..bb205a7d1 Binary files /dev/null and b/test/reference/fill-image.quartz.ref.png differ diff --git a/test/reference/fill-image.ref.png b/test/reference/fill-image.ref.png new file mode 100644 index 000000000..e521be4fd Binary files /dev/null and b/test/reference/fill-image.ref.png differ diff --git a/test/reference/fill-image.traps.argb32.ref.png b/test/reference/fill-image.traps.argb32.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-image.traps.argb32.ref.png differ diff --git a/test/reference/fill-image.traps.rgb24.ref.png b/test/reference/fill-image.traps.rgb24.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-image.traps.rgb24.ref.png differ diff --git a/test/reference/fill-missed-stop.base.argb32.ref.png b/test/reference/fill-missed-stop.base.argb32.ref.png new file mode 100644 index 000000000..223fb360e Binary files /dev/null and b/test/reference/fill-missed-stop.base.argb32.ref.png differ diff --git a/test/reference/fill-missed-stop.base.rgb24.ref.png b/test/reference/fill-missed-stop.base.rgb24.ref.png new file mode 100644 index 000000000..f56b4b2e9 Binary files /dev/null and b/test/reference/fill-missed-stop.base.rgb24.ref.png differ diff --git a/test/reference/fill-missed-stop.pdf.argb32.ref.png b/test/reference/fill-missed-stop.pdf.argb32.ref.png new file mode 100644 index 000000000..7d56e3e8c Binary files /dev/null and b/test/reference/fill-missed-stop.pdf.argb32.ref.png differ diff --git a/test/reference/fill-missed-stop.ps2.argb32.ref.png b/test/reference/fill-missed-stop.ps2.argb32.ref.png new file mode 100644 index 000000000..b94a70899 Binary files /dev/null and b/test/reference/fill-missed-stop.ps2.argb32.ref.png differ diff --git a/test/reference/fill-missed-stop.ps2.rgb24.ref.png b/test/reference/fill-missed-stop.ps2.rgb24.ref.png new file mode 100644 index 000000000..fd54c7b1e Binary files /dev/null and b/test/reference/fill-missed-stop.ps2.rgb24.ref.png differ diff --git a/test/reference/fill-missed-stop.ps3.argb32.ref.png b/test/reference/fill-missed-stop.ps3.argb32.ref.png new file mode 100644 index 000000000..b94a70899 Binary files /dev/null and b/test/reference/fill-missed-stop.ps3.argb32.ref.png differ diff --git a/test/reference/fill-missed-stop.ps3.rgb24.ref.png b/test/reference/fill-missed-stop.ps3.rgb24.ref.png new file mode 100644 index 000000000..fd54c7b1e Binary files /dev/null and b/test/reference/fill-missed-stop.ps3.rgb24.ref.png differ diff --git a/test/reference/fill-missed-stop.ref.png b/test/reference/fill-missed-stop.ref.png new file mode 100644 index 000000000..477eec9a5 Binary files /dev/null and b/test/reference/fill-missed-stop.ref.png differ diff --git a/test/reference/fill-missed-stop.traps.argb32.ref.png b/test/reference/fill-missed-stop.traps.argb32.ref.png new file mode 100644 index 000000000..223fb360e Binary files /dev/null and b/test/reference/fill-missed-stop.traps.argb32.ref.png differ diff --git a/test/reference/fill-missed-stop.traps.rgb24.ref.png b/test/reference/fill-missed-stop.traps.rgb24.ref.png new file mode 100644 index 000000000..f56b4b2e9 Binary files /dev/null and b/test/reference/fill-missed-stop.traps.rgb24.ref.png differ diff --git a/test/reference/fill-rule.argb32.ref.png b/test/reference/fill-rule.argb32.ref.png new file mode 100644 index 000000000..9a0ea401f Binary files /dev/null and b/test/reference/fill-rule.argb32.ref.png differ diff --git a/test/reference/fill-rule.base.argb32.ref.png b/test/reference/fill-rule.base.argb32.ref.png new file mode 100644 index 000000000..e2e10d4a8 Binary files /dev/null and b/test/reference/fill-rule.base.argb32.ref.png differ diff --git a/test/reference/fill-rule.base.rgb24.ref.png b/test/reference/fill-rule.base.rgb24.ref.png new file mode 100644 index 000000000..49fb39c76 Binary files /dev/null and b/test/reference/fill-rule.base.rgb24.ref.png differ diff --git a/test/reference/fill-rule.image16.ref.png b/test/reference/fill-rule.image16.ref.png new file mode 100644 index 000000000..27613f70a Binary files /dev/null and b/test/reference/fill-rule.image16.ref.png differ diff --git a/test/reference/fill-rule.ps2.argb32.ref.png b/test/reference/fill-rule.ps2.argb32.ref.png new file mode 100644 index 000000000..c9bdf9054 Binary files /dev/null and b/test/reference/fill-rule.ps2.argb32.ref.png differ diff --git a/test/reference/fill-rule.ps2.rgb24.ref.png b/test/reference/fill-rule.ps2.rgb24.ref.png new file mode 100644 index 000000000..617a20bda Binary files /dev/null and b/test/reference/fill-rule.ps2.rgb24.ref.png differ diff --git a/test/reference/fill-rule.ps3.argb32.ref.png b/test/reference/fill-rule.ps3.argb32.ref.png new file mode 100644 index 000000000..c9bdf9054 Binary files /dev/null and b/test/reference/fill-rule.ps3.argb32.ref.png differ diff --git a/test/reference/fill-rule.ps3.rgb24.ref.png b/test/reference/fill-rule.ps3.rgb24.ref.png new file mode 100644 index 000000000..617a20bda Binary files /dev/null and b/test/reference/fill-rule.ps3.rgb24.ref.png differ diff --git a/test/reference/fill-rule.quartz.argb32.ref.png b/test/reference/fill-rule.quartz.argb32.ref.png new file mode 100644 index 000000000..2ac534091 Binary files /dev/null and b/test/reference/fill-rule.quartz.argb32.ref.png differ diff --git a/test/reference/fill-rule.quartz.rgb24.ref.png b/test/reference/fill-rule.quartz.rgb24.ref.png new file mode 100644 index 000000000..bd671d62d Binary files /dev/null and b/test/reference/fill-rule.quartz.rgb24.ref.png differ diff --git a/test/reference/fill-rule.rgb24.ref.png b/test/reference/fill-rule.rgb24.ref.png new file mode 100644 index 000000000..25023a28c Binary files /dev/null and b/test/reference/fill-rule.rgb24.ref.png differ diff --git a/test/reference/fill-rule.traps.argb32.ref.png b/test/reference/fill-rule.traps.argb32.ref.png new file mode 100644 index 000000000..e2e10d4a8 Binary files /dev/null and b/test/reference/fill-rule.traps.argb32.ref.png differ diff --git a/test/reference/fill-rule.traps.rgb24.ref.png b/test/reference/fill-rule.traps.rgb24.ref.png new file mode 100644 index 000000000..49fb39c76 Binary files /dev/null and b/test/reference/fill-rule.traps.rgb24.ref.png differ diff --git a/test/reference/fill-xlib-fallback.rgb24.ref.png b/test/reference/fill-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/fill-xlib-window.rgb24.ref.png b/test/reference/fill-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-xlib-window.rgb24.ref.png differ diff --git a/test/reference/fill-xlib.ref.png b/test/reference/fill-xlib.ref.png new file mode 100644 index 000000000..1e67073df Binary files /dev/null and b/test/reference/fill-xlib.ref.png differ diff --git a/test/reference/fill.image.argb32.ref.png b/test/reference/fill.image.argb32.ref.png new file mode 100644 index 000000000..70c6bccc0 Binary files /dev/null and b/test/reference/fill.image.argb32.ref.png differ diff --git a/test/reference/fill.image.rgb24.ref.png b/test/reference/fill.image.rgb24.ref.png new file mode 100644 index 000000000..70c6bccc0 Binary files /dev/null and b/test/reference/fill.image.rgb24.ref.png differ diff --git a/test/reference/filter-bilinear-extents.base.argb32.ref.png b/test/reference/filter-bilinear-extents.base.argb32.ref.png new file mode 100644 index 000000000..797e7981f Binary files /dev/null and b/test/reference/filter-bilinear-extents.base.argb32.ref.png differ diff --git a/test/reference/filter-bilinear-extents.base.rgb24.ref.png b/test/reference/filter-bilinear-extents.base.rgb24.ref.png new file mode 100644 index 000000000..797e7981f Binary files /dev/null and b/test/reference/filter-bilinear-extents.base.rgb24.ref.png differ diff --git a/test/reference/filter-bilinear-extents.image16.ref.png b/test/reference/filter-bilinear-extents.image16.ref.png new file mode 100644 index 000000000..5b7755bb3 Binary files /dev/null and b/test/reference/filter-bilinear-extents.image16.ref.png differ diff --git a/test/reference/filter-bilinear-extents.pdf.xfail.png b/test/reference/filter-bilinear-extents.pdf.xfail.png new file mode 100644 index 000000000..e6c4bb460 Binary files /dev/null and b/test/reference/filter-bilinear-extents.pdf.xfail.png differ diff --git a/test/reference/filter-bilinear-extents.ps2.ref.png b/test/reference/filter-bilinear-extents.ps2.ref.png new file mode 100644 index 000000000..97c105c9d Binary files /dev/null and b/test/reference/filter-bilinear-extents.ps2.ref.png differ diff --git a/test/reference/filter-bilinear-extents.ps3.ref.png b/test/reference/filter-bilinear-extents.ps3.ref.png new file mode 100644 index 000000000..97c105c9d Binary files /dev/null and b/test/reference/filter-bilinear-extents.ps3.ref.png differ diff --git a/test/reference/filter-bilinear-extents.quartz.xfail.png b/test/reference/filter-bilinear-extents.quartz.xfail.png new file mode 100644 index 000000000..312ee802d Binary files /dev/null and b/test/reference/filter-bilinear-extents.quartz.xfail.png differ diff --git a/test/reference/filter-bilinear-extents.ref.png b/test/reference/filter-bilinear-extents.ref.png new file mode 100644 index 000000000..797e7981f Binary files /dev/null and b/test/reference/filter-bilinear-extents.ref.png differ diff --git a/test/reference/filter-nearest-offset.base.argb32.ref.png b/test/reference/filter-nearest-offset.base.argb32.ref.png new file mode 100644 index 000000000..8cca9a1dc Binary files /dev/null and b/test/reference/filter-nearest-offset.base.argb32.ref.png differ diff --git a/test/reference/filter-nearest-offset.base.rgb24.ref.png b/test/reference/filter-nearest-offset.base.rgb24.ref.png new file mode 100644 index 000000000..8cca9a1dc Binary files /dev/null and b/test/reference/filter-nearest-offset.base.rgb24.ref.png differ diff --git a/test/reference/filter-nearest-offset.gl.xfail.png b/test/reference/filter-nearest-offset.gl.xfail.png new file mode 100644 index 000000000..a777e7cc0 Binary files /dev/null and b/test/reference/filter-nearest-offset.gl.xfail.png differ diff --git a/test/reference/filter-nearest-offset.pdf.xfail.png b/test/reference/filter-nearest-offset.pdf.xfail.png new file mode 100644 index 000000000..3042821f4 Binary files /dev/null and b/test/reference/filter-nearest-offset.pdf.xfail.png differ diff --git a/test/reference/filter-nearest-offset.ps2.ref.png b/test/reference/filter-nearest-offset.ps2.ref.png new file mode 100644 index 000000000..185f77939 Binary files /dev/null and b/test/reference/filter-nearest-offset.ps2.ref.png differ diff --git a/test/reference/filter-nearest-offset.ps3.ref.png b/test/reference/filter-nearest-offset.ps3.ref.png new file mode 100644 index 000000000..185f77939 Binary files /dev/null and b/test/reference/filter-nearest-offset.ps3.ref.png differ diff --git a/test/reference/filter-nearest-offset.ref.png b/test/reference/filter-nearest-offset.ref.png new file mode 100644 index 000000000..af81aeea1 Binary files /dev/null and b/test/reference/filter-nearest-offset.ref.png differ diff --git a/test/reference/filter-nearest-offset.svg.xfail.png b/test/reference/filter-nearest-offset.svg.xfail.png new file mode 100644 index 000000000..a46dc76d5 Binary files /dev/null and b/test/reference/filter-nearest-offset.svg.xfail.png differ diff --git a/test/reference/filter-nearest-transformed.base.argb32.ref.png b/test/reference/filter-nearest-transformed.base.argb32.ref.png new file mode 100644 index 000000000..24adf8bc1 Binary files /dev/null and b/test/reference/filter-nearest-transformed.base.argb32.ref.png differ diff --git a/test/reference/filter-nearest-transformed.base.rgb24.ref.png b/test/reference/filter-nearest-transformed.base.rgb24.ref.png new file mode 100644 index 000000000..24adf8bc1 Binary files /dev/null and b/test/reference/filter-nearest-transformed.base.rgb24.ref.png differ diff --git a/test/reference/filter-nearest-transformed.gl.xfail.png b/test/reference/filter-nearest-transformed.gl.xfail.png new file mode 100644 index 000000000..ba8170b0b Binary files /dev/null and b/test/reference/filter-nearest-transformed.gl.xfail.png differ diff --git a/test/reference/filter-nearest-transformed.image16.ref.png b/test/reference/filter-nearest-transformed.image16.ref.png new file mode 100644 index 000000000..a02e1e11b Binary files /dev/null and b/test/reference/filter-nearest-transformed.image16.ref.png differ diff --git a/test/reference/filter-nearest-transformed.pdf.xfail.png b/test/reference/filter-nearest-transformed.pdf.xfail.png new file mode 100644 index 000000000..e5b83784f Binary files /dev/null and b/test/reference/filter-nearest-transformed.pdf.xfail.png differ diff --git a/test/reference/filter-nearest-transformed.quartz.xfail.png b/test/reference/filter-nearest-transformed.quartz.xfail.png new file mode 100644 index 000000000..246cdf421 Binary files /dev/null and b/test/reference/filter-nearest-transformed.quartz.xfail.png differ diff --git a/test/reference/filter-nearest-transformed.ref.png b/test/reference/filter-nearest-transformed.ref.png new file mode 100644 index 000000000..dc413b47e Binary files /dev/null and b/test/reference/filter-nearest-transformed.ref.png differ diff --git a/test/reference/filter-nearest-transformed.svg.xfail.png b/test/reference/filter-nearest-transformed.svg.xfail.png new file mode 100644 index 000000000..e6bbe28e8 Binary files /dev/null and b/test/reference/filter-nearest-transformed.svg.xfail.png differ diff --git a/test/reference/finer-grained-fallbacks.base.argb32.ref.png b/test/reference/finer-grained-fallbacks.base.argb32.ref.png new file mode 100644 index 000000000..accb01be7 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.base.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.base.rgb24.ref.png b/test/reference/finer-grained-fallbacks.base.rgb24.ref.png new file mode 100644 index 000000000..0e6094cd3 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.base.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.gl.argb32.ref.png b/test/reference/finer-grained-fallbacks.gl.argb32.ref.png new file mode 100644 index 000000000..69ec48776 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.gl.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.image16.ref.png b/test/reference/finer-grained-fallbacks.image16.ref.png new file mode 100644 index 000000000..3b104ef8f Binary files /dev/null and b/test/reference/finer-grained-fallbacks.image16.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.mask.argb32.ref.png b/test/reference/finer-grained-fallbacks.mask.argb32.ref.png new file mode 100644 index 000000000..8cd99d0e4 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.mask.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.mask.rgb24.ref.png b/test/reference/finer-grained-fallbacks.mask.rgb24.ref.png new file mode 100644 index 000000000..5d6cd94f8 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.mask.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ps2.argb32.ref.png b/test/reference/finer-grained-fallbacks.ps2.argb32.ref.png new file mode 100644 index 000000000..19c132f68 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ps2.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ps2.ref.png b/test/reference/finer-grained-fallbacks.ps2.ref.png new file mode 100644 index 000000000..1744100c9 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ps2.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ps2.rgb24.ref.png b/test/reference/finer-grained-fallbacks.ps2.rgb24.ref.png new file mode 100644 index 000000000..3f94a3a02 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ps2.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ps3.argb32.ref.png b/test/reference/finer-grained-fallbacks.ps3.argb32.ref.png new file mode 100644 index 000000000..19c132f68 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ps3.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ps3.ref.png b/test/reference/finer-grained-fallbacks.ps3.ref.png new file mode 100644 index 000000000..1744100c9 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ps3.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ps3.rgb24.ref.png b/test/reference/finer-grained-fallbacks.ps3.rgb24.ref.png new file mode 100644 index 000000000..3f94a3a02 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ps3.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.quartz.argb32.ref.png b/test/reference/finer-grained-fallbacks.quartz.argb32.ref.png new file mode 100644 index 000000000..dc0576100 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.quartz.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.quartz.rgb24.ref.png b/test/reference/finer-grained-fallbacks.quartz.rgb24.ref.png new file mode 100644 index 000000000..1fdedd01f Binary files /dev/null and b/test/reference/finer-grained-fallbacks.quartz.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.ref.png b/test/reference/finer-grained-fallbacks.ref.png new file mode 100644 index 000000000..cb18717f5 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.svg12.argb32.ref.png b/test/reference/finer-grained-fallbacks.svg12.argb32.ref.png new file mode 100644 index 000000000..5aaf86b27 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.svg12.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.svg12.rgb24.ref.png b/test/reference/finer-grained-fallbacks.svg12.rgb24.ref.png new file mode 100644 index 000000000..ad55366dd Binary files /dev/null and b/test/reference/finer-grained-fallbacks.svg12.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.traps.argb32.ref.png b/test/reference/finer-grained-fallbacks.traps.argb32.ref.png new file mode 100644 index 000000000..accb01be7 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.traps.argb32.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.traps.rgb24.ref.png b/test/reference/finer-grained-fallbacks.traps.rgb24.ref.png new file mode 100644 index 000000000..0e6094cd3 Binary files /dev/null and b/test/reference/finer-grained-fallbacks.traps.rgb24.ref.png differ diff --git a/test/reference/finer-grained-fallbacks.xlib-fallback.ref.png b/test/reference/finer-grained-fallbacks.xlib-fallback.ref.png new file mode 100644 index 000000000..c2af714cc Binary files /dev/null and b/test/reference/finer-grained-fallbacks.xlib-fallback.ref.png differ diff --git a/test/reference/font-matrix-translation.base.argb32.ref.png b/test/reference/font-matrix-translation.base.argb32.ref.png new file mode 100644 index 000000000..a4a108206 Binary files /dev/null and b/test/reference/font-matrix-translation.base.argb32.ref.png differ diff --git a/test/reference/font-matrix-translation.base.rgb24.ref.png b/test/reference/font-matrix-translation.base.rgb24.ref.png new file mode 100644 index 000000000..a4a108206 Binary files /dev/null and b/test/reference/font-matrix-translation.base.rgb24.ref.png differ diff --git a/test/reference/font-matrix-translation.image16.ref.png b/test/reference/font-matrix-translation.image16.ref.png new file mode 100644 index 000000000..f76b9ae80 Binary files /dev/null and b/test/reference/font-matrix-translation.image16.ref.png differ diff --git a/test/reference/font-matrix-translation.ps2.argb32.ref.png b/test/reference/font-matrix-translation.ps2.argb32.ref.png new file mode 100644 index 000000000..41d05a07d Binary files /dev/null and b/test/reference/font-matrix-translation.ps2.argb32.ref.png differ diff --git a/test/reference/font-matrix-translation.ps2.rgb24.ref.png b/test/reference/font-matrix-translation.ps2.rgb24.ref.png new file mode 100644 index 000000000..41d05a07d Binary files /dev/null and b/test/reference/font-matrix-translation.ps2.rgb24.ref.png differ diff --git a/test/reference/font-matrix-translation.ps3.argb32.ref.png b/test/reference/font-matrix-translation.ps3.argb32.ref.png new file mode 100644 index 000000000..41d05a07d Binary files /dev/null and b/test/reference/font-matrix-translation.ps3.argb32.ref.png differ diff --git a/test/reference/font-matrix-translation.ps3.rgb24.ref.png b/test/reference/font-matrix-translation.ps3.rgb24.ref.png new file mode 100644 index 000000000..41d05a07d Binary files /dev/null and b/test/reference/font-matrix-translation.ps3.rgb24.ref.png differ diff --git a/test/reference/font-matrix-translation.quartz.ref.png b/test/reference/font-matrix-translation.quartz.ref.png new file mode 100644 index 000000000..187e2c1aa Binary files /dev/null and b/test/reference/font-matrix-translation.quartz.ref.png differ diff --git a/test/reference/font-matrix-translation.ref.png b/test/reference/font-matrix-translation.ref.png new file mode 100644 index 000000000..a4a108206 Binary files /dev/null and b/test/reference/font-matrix-translation.ref.png differ diff --git a/test/reference/font-matrix-translation.svg.ref.png b/test/reference/font-matrix-translation.svg.ref.png new file mode 100644 index 000000000..e35f9bea5 Binary files /dev/null and b/test/reference/font-matrix-translation.svg.ref.png differ diff --git a/test/reference/font-matrix-translation.traps.ref.png b/test/reference/font-matrix-translation.traps.ref.png new file mode 100644 index 000000000..a4a108206 Binary files /dev/null and b/test/reference/font-matrix-translation.traps.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.base.argb32.ref.png b/test/reference/ft-show-glyphs-positioning.base.argb32.ref.png new file mode 100644 index 000000000..af6dcaf95 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.base.argb32.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.base.rgb24.ref.png b/test/reference/ft-show-glyphs-positioning.base.rgb24.ref.png new file mode 100644 index 000000000..af6dcaf95 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.base.rgb24.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.image16.ref.png b/test/reference/ft-show-glyphs-positioning.image16.ref.png new file mode 100644 index 000000000..f3d9f0d1f Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.image16.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.pdf.ref.png b/test/reference/ft-show-glyphs-positioning.pdf.ref.png new file mode 100644 index 000000000..0d62fd378 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.pdf.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.ps2.ref.png b/test/reference/ft-show-glyphs-positioning.ps2.ref.png new file mode 100644 index 000000000..c5fbf30b5 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.ps2.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.ps3.ref.png b/test/reference/ft-show-glyphs-positioning.ps3.ref.png new file mode 100644 index 000000000..c5fbf30b5 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.ps3.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.ref.png b/test/reference/ft-show-glyphs-positioning.ref.png new file mode 100644 index 000000000..af6dcaf95 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.svg.ref.png b/test/reference/ft-show-glyphs-positioning.svg.ref.png new file mode 100644 index 000000000..04fe674d1 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.svg.ref.png differ diff --git a/test/reference/ft-show-glyphs-positioning.traps.ref.png b/test/reference/ft-show-glyphs-positioning.traps.ref.png new file mode 100644 index 000000000..af6dcaf95 Binary files /dev/null and b/test/reference/ft-show-glyphs-positioning.traps.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.base.argb32.ref.png b/test/reference/ft-show-glyphs-table.base.argb32.ref.png new file mode 100644 index 000000000..ed6912489 Binary files /dev/null and b/test/reference/ft-show-glyphs-table.base.argb32.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.base.rgb24.ref.png b/test/reference/ft-show-glyphs-table.base.rgb24.ref.png new file mode 100644 index 000000000..ed6912489 Binary files /dev/null and b/test/reference/ft-show-glyphs-table.base.rgb24.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.image16.ref.png b/test/reference/ft-show-glyphs-table.image16.ref.png new file mode 100644 index 000000000..af01a49a0 Binary files /dev/null and b/test/reference/ft-show-glyphs-table.image16.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.ps2.ref.png b/test/reference/ft-show-glyphs-table.ps2.ref.png new file mode 100644 index 000000000..5143663fc Binary files /dev/null and b/test/reference/ft-show-glyphs-table.ps2.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.ps3.ref.png b/test/reference/ft-show-glyphs-table.ps3.ref.png new file mode 100644 index 000000000..5143663fc Binary files /dev/null and b/test/reference/ft-show-glyphs-table.ps3.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.quartz.xfail.png b/test/reference/ft-show-glyphs-table.quartz.xfail.png new file mode 100644 index 000000000..0e131b26f Binary files /dev/null and b/test/reference/ft-show-glyphs-table.quartz.xfail.png differ diff --git a/test/reference/ft-show-glyphs-table.ref.png b/test/reference/ft-show-glyphs-table.ref.png new file mode 100644 index 000000000..ed6912489 Binary files /dev/null and b/test/reference/ft-show-glyphs-table.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.svg.ref.png b/test/reference/ft-show-glyphs-table.svg.ref.png new file mode 100644 index 000000000..e0654b7a0 Binary files /dev/null and b/test/reference/ft-show-glyphs-table.svg.ref.png differ diff --git a/test/reference/ft-show-glyphs-table.traps.ref.png b/test/reference/ft-show-glyphs-table.traps.ref.png new file mode 100644 index 000000000..ed6912489 Binary files /dev/null and b/test/reference/ft-show-glyphs-table.traps.ref.png differ diff --git a/test/reference/ft-text-antialias-none.base.argb32.ref.png b/test/reference/ft-text-antialias-none.base.argb32.ref.png new file mode 100644 index 000000000..c638c9ea6 Binary files /dev/null and b/test/reference/ft-text-antialias-none.base.argb32.ref.png differ diff --git a/test/reference/ft-text-antialias-none.base.rgb24.ref.png b/test/reference/ft-text-antialias-none.base.rgb24.ref.png new file mode 100644 index 000000000..c638c9ea6 Binary files /dev/null and b/test/reference/ft-text-antialias-none.base.rgb24.ref.png differ diff --git a/test/reference/ft-text-antialias-none.ps2.argb32.ref.png b/test/reference/ft-text-antialias-none.ps2.argb32.ref.png new file mode 100644 index 000000000..4f7ee8324 Binary files /dev/null and b/test/reference/ft-text-antialias-none.ps2.argb32.ref.png differ diff --git a/test/reference/ft-text-antialias-none.ps3.argb32.ref.png b/test/reference/ft-text-antialias-none.ps3.argb32.ref.png new file mode 100644 index 000000000..4f7ee8324 Binary files /dev/null and b/test/reference/ft-text-antialias-none.ps3.argb32.ref.png differ diff --git a/test/reference/ft-text-antialias-none.ref.png b/test/reference/ft-text-antialias-none.ref.png new file mode 100644 index 000000000..cb0c13222 Binary files /dev/null and b/test/reference/ft-text-antialias-none.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.base.argb32.ref.png b/test/reference/ft-text-vertical-layout-type1.base.argb32.ref.png new file mode 100644 index 000000000..09c4cbbbe Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.base.argb32.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.base.rgb24.ref.png b/test/reference/ft-text-vertical-layout-type1.base.rgb24.ref.png new file mode 100644 index 000000000..09c4cbbbe Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.base.rgb24.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.image16.ref.png b/test/reference/ft-text-vertical-layout-type1.image16.ref.png new file mode 100644 index 000000000..4985907c9 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.image16.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.pdf.ref.png b/test/reference/ft-text-vertical-layout-type1.pdf.ref.png new file mode 100644 index 000000000..1f52ff23b Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.pdf.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.ps.ref.png b/test/reference/ft-text-vertical-layout-type1.ps.ref.png new file mode 100644 index 000000000..bb99239b8 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.ps.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.quartz.xfail.png b/test/reference/ft-text-vertical-layout-type1.quartz.xfail.png new file mode 100644 index 000000000..a603b3597 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.quartz.xfail.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.ref.png b/test/reference/ft-text-vertical-layout-type1.ref.png new file mode 100644 index 000000000..7a5670ee6 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.svg.ref.png b/test/reference/ft-text-vertical-layout-type1.svg.ref.png new file mode 100644 index 000000000..0be400c13 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.svg.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.traps.argb32.ref.png b/test/reference/ft-text-vertical-layout-type1.traps.argb32.ref.png new file mode 100644 index 000000000..09c4cbbbe Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.traps.argb32.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.traps.rgb24.ref.png b/test/reference/ft-text-vertical-layout-type1.traps.rgb24.ref.png new file mode 100644 index 000000000..09c4cbbbe Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.traps.rgb24.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type1.xfail.png b/test/reference/ft-text-vertical-layout-type1.xfail.png new file mode 100644 index 000000000..063bbd967 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type1.xfail.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.base.argb32.ref.png b/test/reference/ft-text-vertical-layout-type3.base.argb32.ref.png new file mode 100644 index 000000000..82374b70b Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.base.argb32.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.base.rgb24.ref.png b/test/reference/ft-text-vertical-layout-type3.base.rgb24.ref.png new file mode 100644 index 000000000..82374b70b Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.base.rgb24.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.image16.ref.png b/test/reference/ft-text-vertical-layout-type3.image16.ref.png new file mode 100644 index 000000000..a5c3c1110 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.image16.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.mask.argb32.ref.png b/test/reference/ft-text-vertical-layout-type3.mask.argb32.ref.png new file mode 100644 index 000000000..7f7b428c1 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.mask.argb32.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.mask.rgb24.ref.png b/test/reference/ft-text-vertical-layout-type3.mask.rgb24.ref.png new file mode 100644 index 000000000..7f7b428c1 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.mask.rgb24.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.pdf.ref.png b/test/reference/ft-text-vertical-layout-type3.pdf.ref.png new file mode 100644 index 000000000..a05ec1d74 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.pdf.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.ps.ref.png b/test/reference/ft-text-vertical-layout-type3.ps.ref.png new file mode 100644 index 000000000..f8aafa2d4 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.ps.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.quartz.ref.png b/test/reference/ft-text-vertical-layout-type3.quartz.ref.png new file mode 100644 index 000000000..4a063f3b5 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.quartz.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.ref.png b/test/reference/ft-text-vertical-layout-type3.ref.png new file mode 100644 index 000000000..5f64d8825 Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.svg.ref.png b/test/reference/ft-text-vertical-layout-type3.svg.ref.png new file mode 100644 index 000000000..cddb955aa Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.svg.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.traps.argb32.ref.png b/test/reference/ft-text-vertical-layout-type3.traps.argb32.ref.png new file mode 100644 index 000000000..82374b70b Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.traps.argb32.ref.png differ diff --git a/test/reference/ft-text-vertical-layout-type3.traps.rgb24.ref.png b/test/reference/ft-text-vertical-layout-type3.traps.rgb24.ref.png new file mode 100644 index 000000000..82374b70b Binary files /dev/null and b/test/reference/ft-text-vertical-layout-type3.traps.rgb24.ref.png differ diff --git a/test/reference/get-group-target.base.argb32.ref.png b/test/reference/get-group-target.base.argb32.ref.png new file mode 100644 index 000000000..d162775e7 Binary files /dev/null and b/test/reference/get-group-target.base.argb32.ref.png differ diff --git a/test/reference/get-group-target.base.rgb24.ref.png b/test/reference/get-group-target.base.rgb24.ref.png new file mode 100644 index 000000000..d162775e7 Binary files /dev/null and b/test/reference/get-group-target.base.rgb24.ref.png differ diff --git a/test/reference/get-group-target.ref.png b/test/reference/get-group-target.ref.png new file mode 100644 index 000000000..316a93f31 Binary files /dev/null and b/test/reference/get-group-target.ref.png differ diff --git a/test/reference/gl-surface-source.base.argb32.ref.png b/test/reference/gl-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/gl-surface-source.base.argb32.ref.png differ diff --git a/test/reference/gl-surface-source.base.rgb24.ref.png b/test/reference/gl-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/gl-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/gl-surface-source.image16.ref.png b/test/reference/gl-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/gl-surface-source.image16.ref.png differ diff --git a/test/reference/gl-surface-source.ref.png b/test/reference/gl-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/gl-surface-source.ref.png differ diff --git a/test/reference/glyph-cache-pressure.base.argb32.ref.png b/test/reference/glyph-cache-pressure.base.argb32.ref.png new file mode 100644 index 000000000..a6e1b061f Binary files /dev/null and b/test/reference/glyph-cache-pressure.base.argb32.ref.png differ diff --git a/test/reference/glyph-cache-pressure.base.rgb24.ref.png b/test/reference/glyph-cache-pressure.base.rgb24.ref.png new file mode 100644 index 000000000..a6e1b061f Binary files /dev/null and b/test/reference/glyph-cache-pressure.base.rgb24.ref.png differ diff --git a/test/reference/glyph-cache-pressure.image16.ref.png b/test/reference/glyph-cache-pressure.image16.ref.png new file mode 100644 index 000000000..f3985bdf0 Binary files /dev/null and b/test/reference/glyph-cache-pressure.image16.ref.png differ diff --git a/test/reference/glyph-cache-pressure.ps2.ref.png b/test/reference/glyph-cache-pressure.ps2.ref.png new file mode 100644 index 000000000..88fa4478b Binary files /dev/null and b/test/reference/glyph-cache-pressure.ps2.ref.png differ diff --git a/test/reference/glyph-cache-pressure.ps3.ref.png b/test/reference/glyph-cache-pressure.ps3.ref.png new file mode 100644 index 000000000..88fa4478b Binary files /dev/null and b/test/reference/glyph-cache-pressure.ps3.ref.png differ diff --git a/test/reference/glyph-cache-pressure.quartz.ref.png b/test/reference/glyph-cache-pressure.quartz.ref.png new file mode 100644 index 000000000..6291e84b4 Binary files /dev/null and b/test/reference/glyph-cache-pressure.quartz.ref.png differ diff --git a/test/reference/glyph-cache-pressure.ref.png b/test/reference/glyph-cache-pressure.ref.png new file mode 100644 index 000000000..a6e1b061f Binary files /dev/null and b/test/reference/glyph-cache-pressure.ref.png differ diff --git a/test/reference/glyph-cache-pressure.traps.ref.png b/test/reference/glyph-cache-pressure.traps.ref.png new file mode 100644 index 000000000..a6e1b061f Binary files /dev/null and b/test/reference/glyph-cache-pressure.traps.ref.png differ diff --git a/test/reference/gradient-alpha.base.argb32.ref.png b/test/reference/gradient-alpha.base.argb32.ref.png new file mode 100644 index 000000000..f64b26a76 Binary files /dev/null and b/test/reference/gradient-alpha.base.argb32.ref.png differ diff --git a/test/reference/gradient-alpha.base.rgb24.ref.png b/test/reference/gradient-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..3c7258d95 Binary files /dev/null and b/test/reference/gradient-alpha.base.rgb24.ref.png differ diff --git a/test/reference/gradient-alpha.ps2.argb32.ref.png b/test/reference/gradient-alpha.ps2.argb32.ref.png new file mode 100644 index 000000000..37eafba3c Binary files /dev/null and b/test/reference/gradient-alpha.ps2.argb32.ref.png differ diff --git a/test/reference/gradient-alpha.ps2.rgb24.ref.png b/test/reference/gradient-alpha.ps2.rgb24.ref.png new file mode 100644 index 000000000..2432c2996 Binary files /dev/null and b/test/reference/gradient-alpha.ps2.rgb24.ref.png differ diff --git a/test/reference/gradient-alpha.ps3.argb32.ref.png b/test/reference/gradient-alpha.ps3.argb32.ref.png new file mode 100644 index 000000000..37eafba3c Binary files /dev/null and b/test/reference/gradient-alpha.ps3.argb32.ref.png differ diff --git a/test/reference/gradient-alpha.ps3.rgb24.ref.png b/test/reference/gradient-alpha.ps3.rgb24.ref.png new file mode 100644 index 000000000..2432c2996 Binary files /dev/null and b/test/reference/gradient-alpha.ps3.rgb24.ref.png differ diff --git a/test/reference/gradient-alpha.ref.png b/test/reference/gradient-alpha.ref.png new file mode 100644 index 000000000..f64b26a76 Binary files /dev/null and b/test/reference/gradient-alpha.ref.png differ diff --git a/test/reference/gradient-constant-alpha.base.argb32.ref.png b/test/reference/gradient-constant-alpha.base.argb32.ref.png new file mode 100644 index 000000000..7f49e2c6f Binary files /dev/null and b/test/reference/gradient-constant-alpha.base.argb32.ref.png differ diff --git a/test/reference/gradient-constant-alpha.base.rgb24.ref.png b/test/reference/gradient-constant-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..69cd5963a Binary files /dev/null and b/test/reference/gradient-constant-alpha.base.rgb24.ref.png differ diff --git a/test/reference/gradient-constant-alpha.ps3.ref.png b/test/reference/gradient-constant-alpha.ps3.ref.png new file mode 100644 index 000000000..7089f4fdc Binary files /dev/null and b/test/reference/gradient-constant-alpha.ps3.ref.png differ diff --git a/test/reference/gradient-constant-alpha.ps3.rgb24.ref.png b/test/reference/gradient-constant-alpha.ps3.rgb24.ref.png new file mode 100644 index 000000000..5962925f2 Binary files /dev/null and b/test/reference/gradient-constant-alpha.ps3.rgb24.ref.png differ diff --git a/test/reference/gradient-constant-alpha.quartz.argb32.ref.png b/test/reference/gradient-constant-alpha.quartz.argb32.ref.png new file mode 100644 index 000000000..a426f5ad0 Binary files /dev/null and b/test/reference/gradient-constant-alpha.quartz.argb32.ref.png differ diff --git a/test/reference/gradient-constant-alpha.ref.png b/test/reference/gradient-constant-alpha.ref.png new file mode 100644 index 000000000..7f49e2c6f Binary files /dev/null and b/test/reference/gradient-constant-alpha.ref.png differ diff --git a/test/reference/gradient-zero-stops-mask.base.argb32.ref.png b/test/reference/gradient-zero-stops-mask.base.argb32.ref.png new file mode 100644 index 000000000..0a50f4cac Binary files /dev/null and b/test/reference/gradient-zero-stops-mask.base.argb32.ref.png differ diff --git a/test/reference/gradient-zero-stops-mask.base.rgb24.ref.png b/test/reference/gradient-zero-stops-mask.base.rgb24.ref.png new file mode 100644 index 000000000..21465ce4a Binary files /dev/null and b/test/reference/gradient-zero-stops-mask.base.rgb24.ref.png differ diff --git a/test/reference/gradient-zero-stops-mask.ref.png b/test/reference/gradient-zero-stops-mask.ref.png new file mode 100644 index 000000000..0a50f4cac Binary files /dev/null and b/test/reference/gradient-zero-stops-mask.ref.png differ diff --git a/test/reference/gradient-zero-stops.base.argb32.ref.png b/test/reference/gradient-zero-stops.base.argb32.ref.png new file mode 100644 index 000000000..0a50f4cac Binary files /dev/null and b/test/reference/gradient-zero-stops.base.argb32.ref.png differ diff --git a/test/reference/gradient-zero-stops.base.rgb24.ref.png b/test/reference/gradient-zero-stops.base.rgb24.ref.png new file mode 100644 index 000000000..21465ce4a Binary files /dev/null and b/test/reference/gradient-zero-stops.base.rgb24.ref.png differ diff --git a/test/reference/gradient-zero-stops.ref.png b/test/reference/gradient-zero-stops.ref.png new file mode 100644 index 000000000..3f1867037 Binary files /dev/null and b/test/reference/gradient-zero-stops.ref.png differ diff --git a/test/reference/group-clip.base.argb32.ref.png b/test/reference/group-clip.base.argb32.ref.png new file mode 100644 index 000000000..7b8a7532f Binary files /dev/null and b/test/reference/group-clip.base.argb32.ref.png differ diff --git a/test/reference/group-clip.base.rgb24.ref.png b/test/reference/group-clip.base.rgb24.ref.png new file mode 100644 index 000000000..7b8a7532f Binary files /dev/null and b/test/reference/group-clip.base.rgb24.ref.png differ diff --git a/test/reference/group-clip.image16.ref.png b/test/reference/group-clip.image16.ref.png new file mode 100644 index 000000000..98b66efa3 Binary files /dev/null and b/test/reference/group-clip.image16.ref.png differ diff --git a/test/reference/group-clip.ref.png b/test/reference/group-clip.ref.png new file mode 100644 index 000000000..7b8a7532f Binary files /dev/null and b/test/reference/group-clip.ref.png differ diff --git a/test/reference/group-paint.base.argb32.ref.png b/test/reference/group-paint.base.argb32.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/group-paint.base.argb32.ref.png differ diff --git a/test/reference/group-paint.base.rgb24.ref.png b/test/reference/group-paint.base.rgb24.ref.png new file mode 100644 index 000000000..1ed070cae Binary files /dev/null and b/test/reference/group-paint.base.rgb24.ref.png differ diff --git a/test/reference/group-paint.ref.png b/test/reference/group-paint.ref.png new file mode 100644 index 000000000..f2e111b88 Binary files /dev/null and b/test/reference/group-paint.ref.png differ diff --git a/test/reference/group-unaligned.base.argb32.ref.png b/test/reference/group-unaligned.base.argb32.ref.png new file mode 100644 index 000000000..451e1713f Binary files /dev/null and b/test/reference/group-unaligned.base.argb32.ref.png differ diff --git a/test/reference/group-unaligned.base.rgb24.ref.png b/test/reference/group-unaligned.base.rgb24.ref.png new file mode 100644 index 000000000..451e1713f Binary files /dev/null and b/test/reference/group-unaligned.base.rgb24.ref.png differ diff --git a/test/reference/group-unaligned.image16.ref.png b/test/reference/group-unaligned.image16.ref.png new file mode 100644 index 000000000..6a60a6ea4 Binary files /dev/null and b/test/reference/group-unaligned.image16.ref.png differ diff --git a/test/reference/group-unaligned.ps.ref.png b/test/reference/group-unaligned.ps.ref.png new file mode 100644 index 000000000..f10899879 Binary files /dev/null and b/test/reference/group-unaligned.ps.ref.png differ diff --git a/test/reference/group-unaligned.ps.rgb24.xfail.png b/test/reference/group-unaligned.ps.rgb24.xfail.png new file mode 100644 index 000000000..5672cb0bf Binary files /dev/null and b/test/reference/group-unaligned.ps.rgb24.xfail.png differ diff --git a/test/reference/group-unaligned.quartz.ref.png b/test/reference/group-unaligned.quartz.ref.png new file mode 100644 index 000000000..1711025e9 Binary files /dev/null and b/test/reference/group-unaligned.quartz.ref.png differ diff --git a/test/reference/group-unaligned.ref.png b/test/reference/group-unaligned.ref.png new file mode 100644 index 000000000..6356e6c14 Binary files /dev/null and b/test/reference/group-unaligned.ref.png differ diff --git a/test/reference/group-unaligned.svg.argb32.xfail.png b/test/reference/group-unaligned.svg.argb32.xfail.png new file mode 100644 index 000000000..01c34bec4 Binary files /dev/null and b/test/reference/group-unaligned.svg.argb32.xfail.png differ diff --git a/test/reference/group-unaligned.svg.rgb24.xfail.png b/test/reference/group-unaligned.svg.rgb24.xfail.png new file mode 100644 index 000000000..c0f18619b Binary files /dev/null and b/test/reference/group-unaligned.svg.rgb24.xfail.png differ diff --git a/test/reference/group-unaligned.traps.argb32.ref.png b/test/reference/group-unaligned.traps.argb32.ref.png new file mode 100644 index 000000000..451e1713f Binary files /dev/null and b/test/reference/group-unaligned.traps.argb32.ref.png differ diff --git a/test/reference/group-unaligned.traps.rgb24.ref.png b/test/reference/group-unaligned.traps.rgb24.ref.png new file mode 100644 index 000000000..451e1713f Binary files /dev/null and b/test/reference/group-unaligned.traps.rgb24.ref.png differ diff --git a/test/reference/group-unaligned.xlib-fallback.ref.png b/test/reference/group-unaligned.xlib-fallback.ref.png new file mode 100644 index 000000000..5ddbc164f Binary files /dev/null and b/test/reference/group-unaligned.xlib-fallback.ref.png differ diff --git a/test/reference/halo-transform.base.argb32.ref.png b/test/reference/halo-transform.base.argb32.ref.png new file mode 100644 index 000000000..45cb90ff0 Binary files /dev/null and b/test/reference/halo-transform.base.argb32.ref.png differ diff --git a/test/reference/halo-transform.base.rgb24.ref.png b/test/reference/halo-transform.base.rgb24.ref.png new file mode 100644 index 000000000..45cb90ff0 Binary files /dev/null and b/test/reference/halo-transform.base.rgb24.ref.png differ diff --git a/test/reference/halo-transform.image16.ref.png b/test/reference/halo-transform.image16.ref.png new file mode 100644 index 000000000..b2268f01f Binary files /dev/null and b/test/reference/halo-transform.image16.ref.png differ diff --git a/test/reference/halo-transform.ps.ref.png b/test/reference/halo-transform.ps.ref.png new file mode 100644 index 000000000..89e1f7629 Binary files /dev/null and b/test/reference/halo-transform.ps.ref.png differ diff --git a/test/reference/halo-transform.quartz.ref.png b/test/reference/halo-transform.quartz.ref.png new file mode 100644 index 000000000..91a99baaf Binary files /dev/null and b/test/reference/halo-transform.quartz.ref.png differ diff --git a/test/reference/halo-transform.ref.png b/test/reference/halo-transform.ref.png new file mode 100644 index 000000000..f549c0dc2 Binary files /dev/null and b/test/reference/halo-transform.ref.png differ diff --git a/test/reference/halo-transform.traps.ref.png b/test/reference/halo-transform.traps.ref.png new file mode 100644 index 000000000..45cb90ff0 Binary files /dev/null and b/test/reference/halo-transform.traps.ref.png differ diff --git a/test/reference/halo.base.argb32.ref.png b/test/reference/halo.base.argb32.ref.png new file mode 100644 index 000000000..c915a242b Binary files /dev/null and b/test/reference/halo.base.argb32.ref.png differ diff --git a/test/reference/halo.base.rgb24.ref.png b/test/reference/halo.base.rgb24.ref.png new file mode 100644 index 000000000..c915a242b Binary files /dev/null and b/test/reference/halo.base.rgb24.ref.png differ diff --git a/test/reference/halo.image16.ref.png b/test/reference/halo.image16.ref.png new file mode 100644 index 000000000..a813cd921 Binary files /dev/null and b/test/reference/halo.image16.ref.png differ diff --git a/test/reference/halo.mask.argb32.ref.png b/test/reference/halo.mask.argb32.ref.png new file mode 100644 index 000000000..191ee4794 Binary files /dev/null and b/test/reference/halo.mask.argb32.ref.png differ diff --git a/test/reference/halo.mask.rgb24.ref.png b/test/reference/halo.mask.rgb24.ref.png new file mode 100644 index 000000000..191ee4794 Binary files /dev/null and b/test/reference/halo.mask.rgb24.ref.png differ diff --git a/test/reference/halo.ps.ref.png b/test/reference/halo.ps.ref.png new file mode 100644 index 000000000..1426d2e0c Binary files /dev/null and b/test/reference/halo.ps.ref.png differ diff --git a/test/reference/halo.quartz.ref.png b/test/reference/halo.quartz.ref.png new file mode 100644 index 000000000..c5cf999c9 Binary files /dev/null and b/test/reference/halo.quartz.ref.png differ diff --git a/test/reference/halo.ref.png b/test/reference/halo.ref.png new file mode 100644 index 000000000..dc1316d5b Binary files /dev/null and b/test/reference/halo.ref.png differ diff --git a/test/reference/halo.traps.ref.png b/test/reference/halo.traps.ref.png new file mode 100644 index 000000000..c915a242b Binary files /dev/null and b/test/reference/halo.traps.ref.png differ diff --git a/test/reference/hatchings.base.argb32.ref.png b/test/reference/hatchings.base.argb32.ref.png new file mode 100644 index 000000000..73e156dd3 Binary files /dev/null and b/test/reference/hatchings.base.argb32.ref.png differ diff --git a/test/reference/hatchings.base.rgb24.ref.png b/test/reference/hatchings.base.rgb24.ref.png new file mode 100644 index 000000000..73e156dd3 Binary files /dev/null and b/test/reference/hatchings.base.rgb24.ref.png differ diff --git a/test/reference/hatchings.mask.argb32.ref.png b/test/reference/hatchings.mask.argb32.ref.png new file mode 100644 index 000000000..77fe853a8 Binary files /dev/null and b/test/reference/hatchings.mask.argb32.ref.png differ diff --git a/test/reference/hatchings.mask.rgb24.ref.png b/test/reference/hatchings.mask.rgb24.ref.png new file mode 100644 index 000000000..77fe853a8 Binary files /dev/null and b/test/reference/hatchings.mask.rgb24.ref.png differ diff --git a/test/reference/hatchings.ref.png b/test/reference/hatchings.ref.png new file mode 100644 index 000000000..215d61fa8 Binary files /dev/null and b/test/reference/hatchings.ref.png differ diff --git a/test/reference/hatchings.traps.argb32.ref.png b/test/reference/hatchings.traps.argb32.ref.png new file mode 100644 index 000000000..3b72949c1 Binary files /dev/null and b/test/reference/hatchings.traps.argb32.ref.png differ diff --git a/test/reference/hatchings.traps.rgb24.ref.png b/test/reference/hatchings.traps.rgb24.ref.png new file mode 100644 index 000000000..3b72949c1 Binary files /dev/null and b/test/reference/hatchings.traps.rgb24.ref.png differ diff --git a/test/reference/horizontal-clip.base.argb32.ref.png b/test/reference/horizontal-clip.base.argb32.ref.png new file mode 100644 index 000000000..43dd07f15 Binary files /dev/null and b/test/reference/horizontal-clip.base.argb32.ref.png differ diff --git a/test/reference/horizontal-clip.base.rgb24.ref.png b/test/reference/horizontal-clip.base.rgb24.ref.png new file mode 100644 index 000000000..43dd07f15 Binary files /dev/null and b/test/reference/horizontal-clip.base.rgb24.ref.png differ diff --git a/test/reference/horizontal-clip.ref.png b/test/reference/horizontal-clip.ref.png new file mode 100644 index 000000000..43dd07f15 Binary files /dev/null and b/test/reference/horizontal-clip.ref.png differ diff --git a/test/reference/huge-linear.base.argb32.ref.png b/test/reference/huge-linear.base.argb32.ref.png new file mode 100644 index 000000000..f89217b82 Binary files /dev/null and b/test/reference/huge-linear.base.argb32.ref.png differ diff --git a/test/reference/huge-linear.base.rgb24.ref.png b/test/reference/huge-linear.base.rgb24.ref.png new file mode 100644 index 000000000..f89217b82 Binary files /dev/null and b/test/reference/huge-linear.base.rgb24.ref.png differ diff --git a/test/reference/huge-linear.image16.ref.png b/test/reference/huge-linear.image16.ref.png new file mode 100644 index 000000000..56dc58aca Binary files /dev/null and b/test/reference/huge-linear.image16.ref.png differ diff --git a/test/reference/huge-linear.pdf.ref.png b/test/reference/huge-linear.pdf.ref.png new file mode 100644 index 000000000..8313470cc Binary files /dev/null and b/test/reference/huge-linear.pdf.ref.png differ diff --git a/test/reference/huge-linear.ps3.ref.png b/test/reference/huge-linear.ps3.ref.png new file mode 100644 index 000000000..d55239bf4 Binary files /dev/null and b/test/reference/huge-linear.ps3.ref.png differ diff --git a/test/reference/huge-linear.quartz.ref.png b/test/reference/huge-linear.quartz.ref.png new file mode 100644 index 000000000..3d12f7bea Binary files /dev/null and b/test/reference/huge-linear.quartz.ref.png differ diff --git a/test/reference/huge-linear.ref.png b/test/reference/huge-linear.ref.png new file mode 100644 index 000000000..c20a8b7de Binary files /dev/null and b/test/reference/huge-linear.ref.png differ diff --git a/test/reference/huge-radial.base.argb32.ref.png b/test/reference/huge-radial.base.argb32.ref.png new file mode 100644 index 000000000..541bb309a Binary files /dev/null and b/test/reference/huge-radial.base.argb32.ref.png differ diff --git a/test/reference/huge-radial.base.rgb24.ref.png b/test/reference/huge-radial.base.rgb24.ref.png new file mode 100644 index 000000000..541bb309a Binary files /dev/null and b/test/reference/huge-radial.base.rgb24.ref.png differ diff --git a/test/reference/huge-radial.image16.ref.png b/test/reference/huge-radial.image16.ref.png new file mode 100644 index 000000000..3913190fe Binary files /dev/null and b/test/reference/huge-radial.image16.ref.png differ diff --git a/test/reference/huge-radial.ps3.ref.png b/test/reference/huge-radial.ps3.ref.png new file mode 100644 index 000000000..c2319487b Binary files /dev/null and b/test/reference/huge-radial.ps3.ref.png differ diff --git a/test/reference/huge-radial.quartz.ref.png b/test/reference/huge-radial.quartz.ref.png new file mode 100644 index 000000000..d823f8651 Binary files /dev/null and b/test/reference/huge-radial.quartz.ref.png differ diff --git a/test/reference/huge-radial.ref.png b/test/reference/huge-radial.ref.png new file mode 100644 index 000000000..541bb309a Binary files /dev/null and b/test/reference/huge-radial.ref.png differ diff --git a/test/reference/image-bug-710072-aligned.base.argb32.ref.png b/test/reference/image-bug-710072-aligned.base.argb32.ref.png new file mode 100644 index 000000000..42abd2054 Binary files /dev/null and b/test/reference/image-bug-710072-aligned.base.argb32.ref.png differ diff --git a/test/reference/image-bug-710072-aligned.base.rgb24.ref.png b/test/reference/image-bug-710072-aligned.base.rgb24.ref.png new file mode 100644 index 000000000..42abd2054 Binary files /dev/null and b/test/reference/image-bug-710072-aligned.base.rgb24.ref.png differ diff --git a/test/reference/image-bug-710072-aligned.ref.png b/test/reference/image-bug-710072-aligned.ref.png new file mode 100644 index 000000000..42abd2054 Binary files /dev/null and b/test/reference/image-bug-710072-aligned.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.base.argb32.ref.png b/test/reference/image-bug-710072-unaligned.base.argb32.ref.png new file mode 100644 index 000000000..0a5a6e6cf Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.base.argb32.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.base.rgb24.ref.png b/test/reference/image-bug-710072-unaligned.base.rgb24.ref.png new file mode 100644 index 000000000..0a5a6e6cf Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.base.rgb24.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.ref.png b/test/reference/image-bug-710072-unaligned.ref.png new file mode 100644 index 000000000..13efa30f8 Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.traps.argb32.ref.png b/test/reference/image-bug-710072-unaligned.traps.argb32.ref.png new file mode 100644 index 000000000..0a5a6e6cf Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.traps.argb32.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.traps.rgb24.ref.png b/test/reference/image-bug-710072-unaligned.traps.rgb24.ref.png new file mode 100644 index 000000000..0a5a6e6cf Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.traps.rgb24.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.xlib-fallback.rgb24.ref.png b/test/reference/image-bug-710072-unaligned.xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..0a5a6e6cf Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/image-bug-710072-unaligned.xlib-window.rgb24.ref.png b/test/reference/image-bug-710072-unaligned.xlib-window.rgb24.ref.png new file mode 100644 index 000000000..0a5a6e6cf Binary files /dev/null and b/test/reference/image-bug-710072-unaligned.xlib-window.rgb24.ref.png differ diff --git a/test/reference/image-surface-source.base.argb32.ref.png b/test/reference/image-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/image-surface-source.base.argb32.ref.png differ diff --git a/test/reference/image-surface-source.base.rgb24.ref.png b/test/reference/image-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/image-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/image-surface-source.image16.ref.png b/test/reference/image-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/image-surface-source.image16.ref.png differ diff --git a/test/reference/image-surface-source.ps2.ref.png b/test/reference/image-surface-source.ps2.ref.png new file mode 100644 index 000000000..10231581b Binary files /dev/null and b/test/reference/image-surface-source.ps2.ref.png differ diff --git a/test/reference/image-surface-source.ps3.ref.png b/test/reference/image-surface-source.ps3.ref.png new file mode 100644 index 000000000..10231581b Binary files /dev/null and b/test/reference/image-surface-source.ps3.ref.png differ diff --git a/test/reference/image-surface-source.ref.png b/test/reference/image-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/image-surface-source.ref.png differ diff --git a/test/reference/image-surface-source.svg12.argb32.xfail.png b/test/reference/image-surface-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/image-surface-source.svg12.argb32.xfail.png differ diff --git a/test/reference/image-surface-source.svg12.rgb24.xfail.png b/test/reference/image-surface-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/image-surface-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/implicit-close.base.argb32.ref.png b/test/reference/implicit-close.base.argb32.ref.png new file mode 100644 index 000000000..fdd756110 Binary files /dev/null and b/test/reference/implicit-close.base.argb32.ref.png differ diff --git a/test/reference/implicit-close.base.rgb24.ref.png b/test/reference/implicit-close.base.rgb24.ref.png new file mode 100644 index 000000000..fdd756110 Binary files /dev/null and b/test/reference/implicit-close.base.rgb24.ref.png differ diff --git a/test/reference/implicit-close.ps.ref.png b/test/reference/implicit-close.ps.ref.png new file mode 100644 index 000000000..66baf2480 Binary files /dev/null and b/test/reference/implicit-close.ps.ref.png differ diff --git a/test/reference/implicit-close.ref.png b/test/reference/implicit-close.ref.png new file mode 100644 index 000000000..f15f8a3a0 Binary files /dev/null and b/test/reference/implicit-close.ref.png differ diff --git a/test/reference/implicit-close.traps.argb32.ref.png b/test/reference/implicit-close.traps.argb32.ref.png new file mode 100644 index 000000000..fdd756110 Binary files /dev/null and b/test/reference/implicit-close.traps.argb32.ref.png differ diff --git a/test/reference/implicit-close.traps.rgb24.ref.png b/test/reference/implicit-close.traps.rgb24.ref.png new file mode 100644 index 000000000..fdd756110 Binary files /dev/null and b/test/reference/implicit-close.traps.rgb24.ref.png differ diff --git a/test/reference/infinite-join.base.argb32.ref.png b/test/reference/infinite-join.base.argb32.ref.png new file mode 100644 index 000000000..9e7572b93 Binary files /dev/null and b/test/reference/infinite-join.base.argb32.ref.png differ diff --git a/test/reference/infinite-join.base.rgb24.ref.png b/test/reference/infinite-join.base.rgb24.ref.png new file mode 100644 index 000000000..9e7572b93 Binary files /dev/null and b/test/reference/infinite-join.base.rgb24.ref.png differ diff --git a/test/reference/infinite-join.ps2.ref.png b/test/reference/infinite-join.ps2.ref.png new file mode 100644 index 000000000..6fba8f4b1 Binary files /dev/null and b/test/reference/infinite-join.ps2.ref.png differ diff --git a/test/reference/infinite-join.ps3.ref.png b/test/reference/infinite-join.ps3.ref.png new file mode 100644 index 000000000..6fba8f4b1 Binary files /dev/null and b/test/reference/infinite-join.ps3.ref.png differ diff --git a/test/reference/infinite-join.ref.png b/test/reference/infinite-join.ref.png new file mode 100644 index 000000000..54a911241 Binary files /dev/null and b/test/reference/infinite-join.ref.png differ diff --git a/test/reference/infinite-join.traps.argb32.ref.png b/test/reference/infinite-join.traps.argb32.ref.png new file mode 100644 index 000000000..9e7572b93 Binary files /dev/null and b/test/reference/infinite-join.traps.argb32.ref.png differ diff --git a/test/reference/infinite-join.traps.rgb24.ref.png b/test/reference/infinite-join.traps.rgb24.ref.png new file mode 100644 index 000000000..9e7572b93 Binary files /dev/null and b/test/reference/infinite-join.traps.rgb24.ref.png differ diff --git a/test/reference/inverse-text.base.argb32.ref.png b/test/reference/inverse-text.base.argb32.ref.png new file mode 100644 index 000000000..b7bbb972f Binary files /dev/null and b/test/reference/inverse-text.base.argb32.ref.png differ diff --git a/test/reference/inverse-text.base.rgb24.ref.png b/test/reference/inverse-text.base.rgb24.ref.png new file mode 100644 index 000000000..b7bbb972f Binary files /dev/null and b/test/reference/inverse-text.base.rgb24.ref.png differ diff --git a/test/reference/inverse-text.mask.argb32.ref.png b/test/reference/inverse-text.mask.argb32.ref.png new file mode 100644 index 000000000..b7bbb972f Binary files /dev/null and b/test/reference/inverse-text.mask.argb32.ref.png differ diff --git a/test/reference/inverse-text.mask.rgb24.ref.png b/test/reference/inverse-text.mask.rgb24.ref.png new file mode 100644 index 000000000..b7bbb972f Binary files /dev/null and b/test/reference/inverse-text.mask.rgb24.ref.png differ diff --git a/test/reference/inverse-text.ref.png b/test/reference/inverse-text.ref.png new file mode 100644 index 000000000..b7bbb972f Binary files /dev/null and b/test/reference/inverse-text.ref.png differ diff --git a/test/reference/inverse-text.traps.ref.png b/test/reference/inverse-text.traps.ref.png new file mode 100644 index 000000000..b7bbb972f Binary files /dev/null and b/test/reference/inverse-text.traps.ref.png differ diff --git a/test/reference/inverted-clip.argb32.ref.png b/test/reference/inverted-clip.argb32.ref.png new file mode 100644 index 000000000..f97d377d4 Binary files /dev/null and b/test/reference/inverted-clip.argb32.ref.png differ diff --git a/test/reference/inverted-clip.base.xfail.png b/test/reference/inverted-clip.base.xfail.png new file mode 100644 index 000000000..080b7825b Binary files /dev/null and b/test/reference/inverted-clip.base.xfail.png differ diff --git a/test/reference/inverted-clip.rgb24.ref.png b/test/reference/inverted-clip.rgb24.ref.png new file mode 100644 index 000000000..df945ec2e Binary files /dev/null and b/test/reference/inverted-clip.rgb24.ref.png differ diff --git a/test/reference/inverted-clip.traps.xfail.png b/test/reference/inverted-clip.traps.xfail.png new file mode 100644 index 000000000..5962795ac Binary files /dev/null and b/test/reference/inverted-clip.traps.xfail.png differ diff --git a/test/reference/inverted-clip.xfail.png b/test/reference/inverted-clip.xfail.png new file mode 100644 index 000000000..080b7825b Binary files /dev/null and b/test/reference/inverted-clip.xfail.png differ diff --git a/test/reference/joins-loop.base.argb32.ref.png b/test/reference/joins-loop.base.argb32.ref.png new file mode 100644 index 000000000..95400dfbd Binary files /dev/null and b/test/reference/joins-loop.base.argb32.ref.png differ diff --git a/test/reference/joins-loop.base.rgb24.ref.png b/test/reference/joins-loop.base.rgb24.ref.png new file mode 100644 index 000000000..95400dfbd Binary files /dev/null and b/test/reference/joins-loop.base.rgb24.ref.png differ diff --git a/test/reference/joins-loop.ref.png b/test/reference/joins-loop.ref.png new file mode 100644 index 000000000..ecd6b23d0 Binary files /dev/null and b/test/reference/joins-loop.ref.png differ diff --git a/test/reference/joins-loop.traps.argb32.ref.png b/test/reference/joins-loop.traps.argb32.ref.png new file mode 100644 index 000000000..95400dfbd Binary files /dev/null and b/test/reference/joins-loop.traps.argb32.ref.png differ diff --git a/test/reference/joins-loop.traps.rgb24.ref.png b/test/reference/joins-loop.traps.rgb24.ref.png new file mode 100644 index 000000000..95400dfbd Binary files /dev/null and b/test/reference/joins-loop.traps.rgb24.ref.png differ diff --git a/test/reference/joins-retrace.base.argb32.ref.png b/test/reference/joins-retrace.base.argb32.ref.png new file mode 100644 index 000000000..efbf91a6b Binary files /dev/null and b/test/reference/joins-retrace.base.argb32.ref.png differ diff --git a/test/reference/joins-retrace.base.rgb24.ref.png b/test/reference/joins-retrace.base.rgb24.ref.png new file mode 100644 index 000000000..efbf91a6b Binary files /dev/null and b/test/reference/joins-retrace.base.rgb24.ref.png differ diff --git a/test/reference/joins-retrace.mask.argb32.ref.png b/test/reference/joins-retrace.mask.argb32.ref.png new file mode 100644 index 000000000..22b0ecf9a Binary files /dev/null and b/test/reference/joins-retrace.mask.argb32.ref.png differ diff --git a/test/reference/joins-retrace.mask.rgb24.ref.png b/test/reference/joins-retrace.mask.rgb24.ref.png new file mode 100644 index 000000000..22b0ecf9a Binary files /dev/null and b/test/reference/joins-retrace.mask.rgb24.ref.png differ diff --git a/test/reference/joins-retrace.ref.png b/test/reference/joins-retrace.ref.png new file mode 100644 index 000000000..c21c80a6d Binary files /dev/null and b/test/reference/joins-retrace.ref.png differ diff --git a/test/reference/joins-retrace.traps.argb32.ref.png b/test/reference/joins-retrace.traps.argb32.ref.png new file mode 100644 index 000000000..efbf91a6b Binary files /dev/null and b/test/reference/joins-retrace.traps.argb32.ref.png differ diff --git a/test/reference/joins-retrace.traps.rgb24.ref.png b/test/reference/joins-retrace.traps.rgb24.ref.png new file mode 100644 index 000000000..efbf91a6b Binary files /dev/null and b/test/reference/joins-retrace.traps.rgb24.ref.png differ diff --git a/test/reference/joins-star.base.argb32.ref.png b/test/reference/joins-star.base.argb32.ref.png new file mode 100644 index 000000000..f1de705c3 Binary files /dev/null and b/test/reference/joins-star.base.argb32.ref.png differ diff --git a/test/reference/joins-star.base.rgb24.ref.png b/test/reference/joins-star.base.rgb24.ref.png new file mode 100644 index 000000000..f1de705c3 Binary files /dev/null and b/test/reference/joins-star.base.rgb24.ref.png differ diff --git a/test/reference/joins-star.ref.png b/test/reference/joins-star.ref.png new file mode 100644 index 000000000..6fea13e3e Binary files /dev/null and b/test/reference/joins-star.ref.png differ diff --git a/test/reference/joins-star.traps.argb32.ref.png b/test/reference/joins-star.traps.argb32.ref.png new file mode 100644 index 000000000..f1de705c3 Binary files /dev/null and b/test/reference/joins-star.traps.argb32.ref.png differ diff --git a/test/reference/joins-star.traps.rgb24.ref.png b/test/reference/joins-star.traps.rgb24.ref.png new file mode 100644 index 000000000..f1de705c3 Binary files /dev/null and b/test/reference/joins-star.traps.rgb24.ref.png differ diff --git a/test/reference/joins.base.argb32.ref.png b/test/reference/joins.base.argb32.ref.png new file mode 100644 index 000000000..0b190c22b Binary files /dev/null and b/test/reference/joins.base.argb32.ref.png differ diff --git a/test/reference/joins.base.rgb24.ref.png b/test/reference/joins.base.rgb24.ref.png new file mode 100644 index 000000000..0b190c22b Binary files /dev/null and b/test/reference/joins.base.rgb24.ref.png differ diff --git a/test/reference/joins.image16.ref.png b/test/reference/joins.image16.ref.png new file mode 100644 index 000000000..57f9bb15f Binary files /dev/null and b/test/reference/joins.image16.ref.png differ diff --git a/test/reference/joins.mask.argb32.ref.png b/test/reference/joins.mask.argb32.ref.png new file mode 100644 index 000000000..a1d069d3d Binary files /dev/null and b/test/reference/joins.mask.argb32.ref.png differ diff --git a/test/reference/joins.mask.rgb24.ref.png b/test/reference/joins.mask.rgb24.ref.png new file mode 100644 index 000000000..a1d069d3d Binary files /dev/null and b/test/reference/joins.mask.rgb24.ref.png differ diff --git a/test/reference/joins.ps.ref.png b/test/reference/joins.ps.ref.png new file mode 100644 index 000000000..0d5adea01 Binary files /dev/null and b/test/reference/joins.ps.ref.png differ diff --git a/test/reference/joins.quartz.ref.png b/test/reference/joins.quartz.ref.png new file mode 100644 index 000000000..59b8fdb0b Binary files /dev/null and b/test/reference/joins.quartz.ref.png differ diff --git a/test/reference/joins.ref.png b/test/reference/joins.ref.png new file mode 100644 index 000000000..d1e34fece Binary files /dev/null and b/test/reference/joins.ref.png differ diff --git a/test/reference/joins.traps.argb32.ref.png b/test/reference/joins.traps.argb32.ref.png new file mode 100644 index 000000000..0b190c22b Binary files /dev/null and b/test/reference/joins.traps.argb32.ref.png differ diff --git a/test/reference/joins.traps.rgb24.ref.png b/test/reference/joins.traps.rgb24.ref.png new file mode 100644 index 000000000..0b190c22b Binary files /dev/null and b/test/reference/joins.traps.rgb24.ref.png differ diff --git a/test/reference/large-clip.base.argb32.ref.png b/test/reference/large-clip.base.argb32.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/large-clip.base.argb32.ref.png differ diff --git a/test/reference/large-clip.base.rgb24.ref.png b/test/reference/large-clip.base.rgb24.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/large-clip.base.rgb24.ref.png differ diff --git a/test/reference/large-clip.ref.png b/test/reference/large-clip.ref.png new file mode 100644 index 000000000..9e46d2d5f Binary files /dev/null and b/test/reference/large-clip.ref.png differ diff --git a/test/reference/large-font.base.argb32.ref.png b/test/reference/large-font.base.argb32.ref.png new file mode 100644 index 000000000..503061a9e Binary files /dev/null and b/test/reference/large-font.base.argb32.ref.png differ diff --git a/test/reference/large-font.base.rgb24.ref.png b/test/reference/large-font.base.rgb24.ref.png new file mode 100644 index 000000000..503061a9e Binary files /dev/null and b/test/reference/large-font.base.rgb24.ref.png differ diff --git a/test/reference/large-font.image16.ref.png b/test/reference/large-font.image16.ref.png new file mode 100644 index 000000000..d5d11a5b7 Binary files /dev/null and b/test/reference/large-font.image16.ref.png differ diff --git a/test/reference/large-font.ref.png b/test/reference/large-font.ref.png new file mode 100644 index 000000000..da5c43114 Binary files /dev/null and b/test/reference/large-font.ref.png differ diff --git a/test/reference/large-source-roi.base.argb32.ref.png b/test/reference/large-source-roi.base.argb32.ref.png new file mode 100644 index 000000000..216a065e1 Binary files /dev/null and b/test/reference/large-source-roi.base.argb32.ref.png differ diff --git a/test/reference/large-source-roi.base.rgb24.ref.png b/test/reference/large-source-roi.base.rgb24.ref.png new file mode 100644 index 000000000..216a065e1 Binary files /dev/null and b/test/reference/large-source-roi.base.rgb24.ref.png differ diff --git a/test/reference/large-source-roi.ref.png b/test/reference/large-source-roi.ref.png new file mode 100644 index 000000000..b8dc8b1b6 Binary files /dev/null and b/test/reference/large-source-roi.ref.png differ diff --git a/test/reference/large-source.base.argb32.ref.png b/test/reference/large-source.base.argb32.ref.png new file mode 100644 index 000000000..a54455fbb Binary files /dev/null and b/test/reference/large-source.base.argb32.ref.png differ diff --git a/test/reference/large-source.base.rgb24.ref.png b/test/reference/large-source.base.rgb24.ref.png new file mode 100644 index 000000000..a54455fbb Binary files /dev/null and b/test/reference/large-source.base.rgb24.ref.png differ diff --git a/test/reference/large-source.ref.png b/test/reference/large-source.ref.png new file mode 100644 index 000000000..5d96dd323 Binary files /dev/null and b/test/reference/large-source.ref.png differ diff --git a/test/reference/large-twin-antialias-mixed.base.argb32.ref.png b/test/reference/large-twin-antialias-mixed.base.argb32.ref.png new file mode 100644 index 000000000..a0b265f33 Binary files /dev/null and b/test/reference/large-twin-antialias-mixed.base.argb32.ref.png differ diff --git a/test/reference/large-twin-antialias-mixed.base.rgb24.ref.png b/test/reference/large-twin-antialias-mixed.base.rgb24.ref.png new file mode 100644 index 000000000..a0b265f33 Binary files /dev/null and b/test/reference/large-twin-antialias-mixed.base.rgb24.ref.png differ diff --git a/test/reference/large-twin-antialias-mixed.image16.ref.png b/test/reference/large-twin-antialias-mixed.image16.ref.png new file mode 100644 index 000000000..93f071ee4 Binary files /dev/null and b/test/reference/large-twin-antialias-mixed.image16.ref.png differ diff --git a/test/reference/large-twin-antialias-mixed.ref.png b/test/reference/large-twin-antialias-mixed.ref.png new file mode 100644 index 000000000..73755ab52 Binary files /dev/null and b/test/reference/large-twin-antialias-mixed.ref.png differ diff --git a/test/reference/large-twin-antialias-mixed.traps.argb32.ref.png b/test/reference/large-twin-antialias-mixed.traps.argb32.ref.png new file mode 100644 index 000000000..a0b265f33 Binary files /dev/null and b/test/reference/large-twin-antialias-mixed.traps.argb32.ref.png differ diff --git a/test/reference/large-twin-antialias-mixed.traps.rgb24.ref.png b/test/reference/large-twin-antialias-mixed.traps.rgb24.ref.png new file mode 100644 index 000000000..a0b265f33 Binary files /dev/null and b/test/reference/large-twin-antialias-mixed.traps.rgb24.ref.png differ diff --git a/test/reference/leaky-dash.base.argb32.ref.png b/test/reference/leaky-dash.base.argb32.ref.png new file mode 100644 index 000000000..0973ece7e Binary files /dev/null and b/test/reference/leaky-dash.base.argb32.ref.png differ diff --git a/test/reference/leaky-dash.base.rgb24.ref.png b/test/reference/leaky-dash.base.rgb24.ref.png new file mode 100644 index 000000000..0973ece7e Binary files /dev/null and b/test/reference/leaky-dash.base.rgb24.ref.png differ diff --git a/test/reference/leaky-dash.ps2.argb32.ref.png b/test/reference/leaky-dash.ps2.argb32.ref.png new file mode 100644 index 000000000..93b8640a9 Binary files /dev/null and b/test/reference/leaky-dash.ps2.argb32.ref.png differ diff --git a/test/reference/leaky-dash.ps2.rgb24.ref.png b/test/reference/leaky-dash.ps2.rgb24.ref.png new file mode 100644 index 000000000..c11eb4807 Binary files /dev/null and b/test/reference/leaky-dash.ps2.rgb24.ref.png differ diff --git a/test/reference/leaky-dash.ps3.argb32.ref.png b/test/reference/leaky-dash.ps3.argb32.ref.png new file mode 100644 index 000000000..93b8640a9 Binary files /dev/null and b/test/reference/leaky-dash.ps3.argb32.ref.png differ diff --git a/test/reference/leaky-dash.ps3.rgb24.ref.png b/test/reference/leaky-dash.ps3.rgb24.ref.png new file mode 100644 index 000000000..c11eb4807 Binary files /dev/null and b/test/reference/leaky-dash.ps3.rgb24.ref.png differ diff --git a/test/reference/leaky-dash.quartz.ref.png b/test/reference/leaky-dash.quartz.ref.png new file mode 100644 index 000000000..96928195a Binary files /dev/null and b/test/reference/leaky-dash.quartz.ref.png differ diff --git a/test/reference/leaky-dash.ref.png b/test/reference/leaky-dash.ref.png new file mode 100644 index 000000000..87facc551 Binary files /dev/null and b/test/reference/leaky-dash.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.base.argb32.ref.png b/test/reference/leaky-dashed-rectangle.base.argb32.ref.png new file mode 100644 index 000000000..de3542098 Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.base.argb32.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.base.rgb24.ref.png b/test/reference/leaky-dashed-rectangle.base.rgb24.ref.png new file mode 100644 index 000000000..de3542098 Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.base.rgb24.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.image16.ref.png b/test/reference/leaky-dashed-rectangle.image16.ref.png new file mode 100644 index 000000000..f61db4c29 Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.image16.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.pdf.ref.png b/test/reference/leaky-dashed-rectangle.pdf.ref.png new file mode 100644 index 000000000..72efd4954 Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.pdf.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.ps.ref.png b/test/reference/leaky-dashed-rectangle.ps.ref.png new file mode 100644 index 000000000..1e0a1388c Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.ps.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.quartz.ref.png b/test/reference/leaky-dashed-rectangle.quartz.ref.png new file mode 100644 index 000000000..fad8588fe Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.quartz.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.ref.png b/test/reference/leaky-dashed-rectangle.ref.png new file mode 100644 index 000000000..05f45846a Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.traps.argb32.ref.png b/test/reference/leaky-dashed-rectangle.traps.argb32.ref.png new file mode 100644 index 000000000..de3542098 Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.traps.argb32.ref.png differ diff --git a/test/reference/leaky-dashed-rectangle.traps.rgb24.ref.png b/test/reference/leaky-dashed-rectangle.traps.rgb24.ref.png new file mode 100644 index 000000000..de3542098 Binary files /dev/null and b/test/reference/leaky-dashed-rectangle.traps.rgb24.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.base.argb32.ref.png b/test/reference/leaky-dashed-stroke.base.argb32.ref.png new file mode 100644 index 000000000..da6807f77 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.base.argb32.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.base.rgb24.ref.png b/test/reference/leaky-dashed-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..da6807f77 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.base.rgb24.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.image16.ref.png b/test/reference/leaky-dashed-stroke.image16.ref.png new file mode 100644 index 000000000..f90bb2375 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.image16.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.ps.ref.png b/test/reference/leaky-dashed-stroke.ps.ref.png new file mode 100644 index 000000000..7d581e916 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.ps.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.quartz.ref.png b/test/reference/leaky-dashed-stroke.quartz.ref.png new file mode 100644 index 000000000..adbfd612a Binary files /dev/null and b/test/reference/leaky-dashed-stroke.quartz.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.ref.png b/test/reference/leaky-dashed-stroke.ref.png new file mode 100644 index 000000000..1b8569244 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.traps.argb32.ref.png b/test/reference/leaky-dashed-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..da6807f77 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.traps.argb32.ref.png differ diff --git a/test/reference/leaky-dashed-stroke.traps.rgb24.ref.png b/test/reference/leaky-dashed-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..da6807f77 Binary files /dev/null and b/test/reference/leaky-dashed-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/leaky-polygon.base.argb32.ref.png b/test/reference/leaky-polygon.base.argb32.ref.png new file mode 100644 index 000000000..1cb7a3cac Binary files /dev/null and b/test/reference/leaky-polygon.base.argb32.ref.png differ diff --git a/test/reference/leaky-polygon.base.rgb24.ref.png b/test/reference/leaky-polygon.base.rgb24.ref.png new file mode 100644 index 000000000..1cb7a3cac Binary files /dev/null and b/test/reference/leaky-polygon.base.rgb24.ref.png differ diff --git a/test/reference/leaky-polygon.image16.ref.png b/test/reference/leaky-polygon.image16.ref.png new file mode 100644 index 000000000..e91d0fa34 Binary files /dev/null and b/test/reference/leaky-polygon.image16.ref.png differ diff --git a/test/reference/leaky-polygon.ps.ref.png b/test/reference/leaky-polygon.ps.ref.png new file mode 100644 index 000000000..dd8a10434 Binary files /dev/null and b/test/reference/leaky-polygon.ps.ref.png differ diff --git a/test/reference/leaky-polygon.ref.png b/test/reference/leaky-polygon.ref.png new file mode 100644 index 000000000..d2a06a3cc Binary files /dev/null and b/test/reference/leaky-polygon.ref.png differ diff --git a/test/reference/leaky-polygon.traps.argb32.ref.png b/test/reference/leaky-polygon.traps.argb32.ref.png new file mode 100644 index 000000000..1cb7a3cac Binary files /dev/null and b/test/reference/leaky-polygon.traps.argb32.ref.png differ diff --git a/test/reference/leaky-polygon.traps.rgb24.ref.png b/test/reference/leaky-polygon.traps.rgb24.ref.png new file mode 100644 index 000000000..1cb7a3cac Binary files /dev/null and b/test/reference/leaky-polygon.traps.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.base.argb32.ref.png b/test/reference/line-width-large-overlap-dashed.base.argb32.ref.png new file mode 100644 index 000000000..e6cdcc2f7 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.base.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.base.rgb24.ref.png b/test/reference/line-width-large-overlap-dashed.base.rgb24.ref.png new file mode 100644 index 000000000..e6cdcc2f7 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.base.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.mask.argb32.ref.png b/test/reference/line-width-large-overlap-dashed.mask.argb32.ref.png new file mode 100644 index 000000000..8cd4d31e1 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.mask.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.mask.rgb24.ref.png b/test/reference/line-width-large-overlap-dashed.mask.rgb24.ref.png new file mode 100644 index 000000000..8cd4d31e1 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.mask.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.ref.png b/test/reference/line-width-large-overlap-dashed.ref.png new file mode 100644 index 000000000..12379ac03 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.traps.argb32.ref.png b/test/reference/line-width-large-overlap-dashed.traps.argb32.ref.png new file mode 100644 index 000000000..12379ac03 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.traps.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-dashed.traps.rgb24.ref.png b/test/reference/line-width-large-overlap-dashed.traps.rgb24.ref.png new file mode 100644 index 000000000..12379ac03 Binary files /dev/null and b/test/reference/line-width-large-overlap-dashed.traps.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-flipped.base.argb32.ref.png b/test/reference/line-width-large-overlap-flipped.base.argb32.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-flipped.base.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-flipped.base.rgb24.ref.png b/test/reference/line-width-large-overlap-flipped.base.rgb24.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-flipped.base.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-flipped.ref.png b/test/reference/line-width-large-overlap-flipped.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-flipped.ref.png differ diff --git a/test/reference/line-width-large-overlap-flopped.base.argb32.ref.png b/test/reference/line-width-large-overlap-flopped.base.argb32.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-flopped.base.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-flopped.base.rgb24.ref.png b/test/reference/line-width-large-overlap-flopped.base.rgb24.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-flopped.base.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-flopped.ref.png b/test/reference/line-width-large-overlap-flopped.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-flopped.ref.png differ diff --git a/test/reference/line-width-large-overlap-offset.base.argb32.ref.png b/test/reference/line-width-large-overlap-offset.base.argb32.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-offset.base.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-offset.base.rgb24.ref.png b/test/reference/line-width-large-overlap-offset.base.rgb24.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-offset.base.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-offset.ref.png b/test/reference/line-width-large-overlap-offset.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap-offset.ref.png differ diff --git a/test/reference/line-width-large-overlap-rotated.base.argb32.ref.png b/test/reference/line-width-large-overlap-rotated.base.argb32.ref.png new file mode 100644 index 000000000..87fe7523b Binary files /dev/null and b/test/reference/line-width-large-overlap-rotated.base.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap-rotated.base.rgb24.ref.png b/test/reference/line-width-large-overlap-rotated.base.rgb24.ref.png new file mode 100644 index 000000000..87fe7523b Binary files /dev/null and b/test/reference/line-width-large-overlap-rotated.base.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap-rotated.ref.png b/test/reference/line-width-large-overlap-rotated.ref.png new file mode 100644 index 000000000..3eeebb254 Binary files /dev/null and b/test/reference/line-width-large-overlap-rotated.ref.png differ diff --git a/test/reference/line-width-large-overlap-rotated.traps.ref.png b/test/reference/line-width-large-overlap-rotated.traps.ref.png new file mode 100644 index 000000000..87fe7523b Binary files /dev/null and b/test/reference/line-width-large-overlap-rotated.traps.ref.png differ diff --git a/test/reference/line-width-large-overlap.base.argb32.ref.png b/test/reference/line-width-large-overlap.base.argb32.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap.base.argb32.ref.png differ diff --git a/test/reference/line-width-large-overlap.base.rgb24.ref.png b/test/reference/line-width-large-overlap.base.rgb24.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap.base.rgb24.ref.png differ diff --git a/test/reference/line-width-large-overlap.ref.png b/test/reference/line-width-large-overlap.ref.png new file mode 100644 index 000000000..3c3464bed Binary files /dev/null and b/test/reference/line-width-large-overlap.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.base.argb32.ref.png b/test/reference/line-width-overlap-dashed.base.argb32.ref.png new file mode 100644 index 000000000..066b182ae Binary files /dev/null and b/test/reference/line-width-overlap-dashed.base.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.base.rgb24.ref.png b/test/reference/line-width-overlap-dashed.base.rgb24.ref.png new file mode 100644 index 000000000..066b182ae Binary files /dev/null and b/test/reference/line-width-overlap-dashed.base.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.mask.argb32.ref.png b/test/reference/line-width-overlap-dashed.mask.argb32.ref.png new file mode 100644 index 000000000..0de187d40 Binary files /dev/null and b/test/reference/line-width-overlap-dashed.mask.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.mask.rgb24.ref.png b/test/reference/line-width-overlap-dashed.mask.rgb24.ref.png new file mode 100644 index 000000000..0de187d40 Binary files /dev/null and b/test/reference/line-width-overlap-dashed.mask.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.ref.png b/test/reference/line-width-overlap-dashed.ref.png new file mode 100644 index 000000000..065d69958 Binary files /dev/null and b/test/reference/line-width-overlap-dashed.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.traps.argb32.ref.png b/test/reference/line-width-overlap-dashed.traps.argb32.ref.png new file mode 100644 index 000000000..065d69958 Binary files /dev/null and b/test/reference/line-width-overlap-dashed.traps.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-dashed.traps.rgb24.ref.png b/test/reference/line-width-overlap-dashed.traps.rgb24.ref.png new file mode 100644 index 000000000..065d69958 Binary files /dev/null and b/test/reference/line-width-overlap-dashed.traps.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-flipped.base.argb32.ref.png b/test/reference/line-width-overlap-flipped.base.argb32.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap-flipped.base.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-flipped.base.rgb24.ref.png b/test/reference/line-width-overlap-flipped.base.rgb24.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap-flipped.base.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-flipped.ref.png b/test/reference/line-width-overlap-flipped.ref.png new file mode 100644 index 000000000..09911bc51 Binary files /dev/null and b/test/reference/line-width-overlap-flipped.ref.png differ diff --git a/test/reference/line-width-overlap-flopped.base.argb32.ref.png b/test/reference/line-width-overlap-flopped.base.argb32.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap-flopped.base.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-flopped.base.rgb24.ref.png b/test/reference/line-width-overlap-flopped.base.rgb24.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap-flopped.base.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-flopped.ref.png b/test/reference/line-width-overlap-flopped.ref.png new file mode 100644 index 000000000..09911bc51 Binary files /dev/null and b/test/reference/line-width-overlap-flopped.ref.png differ diff --git a/test/reference/line-width-overlap-offset.base.argb32.ref.png b/test/reference/line-width-overlap-offset.base.argb32.ref.png new file mode 100644 index 000000000..13a138b9a Binary files /dev/null and b/test/reference/line-width-overlap-offset.base.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-offset.base.rgb24.ref.png b/test/reference/line-width-overlap-offset.base.rgb24.ref.png new file mode 100644 index 000000000..13a138b9a Binary files /dev/null and b/test/reference/line-width-overlap-offset.base.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-offset.ref.png b/test/reference/line-width-overlap-offset.ref.png new file mode 100644 index 000000000..eafa50b1f Binary files /dev/null and b/test/reference/line-width-overlap-offset.ref.png differ diff --git a/test/reference/line-width-overlap-offset.traps.ref.png b/test/reference/line-width-overlap-offset.traps.ref.png new file mode 100644 index 000000000..13a138b9a Binary files /dev/null and b/test/reference/line-width-overlap-offset.traps.ref.png differ diff --git a/test/reference/line-width-overlap-rotated.base.argb32.ref.png b/test/reference/line-width-overlap-rotated.base.argb32.ref.png new file mode 100644 index 000000000..fa7290d6c Binary files /dev/null and b/test/reference/line-width-overlap-rotated.base.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-rotated.base.rgb24.ref.png b/test/reference/line-width-overlap-rotated.base.rgb24.ref.png new file mode 100644 index 000000000..fa7290d6c Binary files /dev/null and b/test/reference/line-width-overlap-rotated.base.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap-rotated.ref.png b/test/reference/line-width-overlap-rotated.ref.png new file mode 100644 index 000000000..cce46c70a Binary files /dev/null and b/test/reference/line-width-overlap-rotated.ref.png differ diff --git a/test/reference/line-width-overlap-rotated.traps.argb32.ref.png b/test/reference/line-width-overlap-rotated.traps.argb32.ref.png new file mode 100644 index 000000000..fa7290d6c Binary files /dev/null and b/test/reference/line-width-overlap-rotated.traps.argb32.ref.png differ diff --git a/test/reference/line-width-overlap-rotated.traps.rgb24.ref.png b/test/reference/line-width-overlap-rotated.traps.rgb24.ref.png new file mode 100644 index 000000000..fa7290d6c Binary files /dev/null and b/test/reference/line-width-overlap-rotated.traps.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap.base.argb32.ref.png b/test/reference/line-width-overlap.base.argb32.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap.base.argb32.ref.png differ diff --git a/test/reference/line-width-overlap.base.rgb24.ref.png b/test/reference/line-width-overlap.base.rgb24.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap.base.rgb24.ref.png differ diff --git a/test/reference/line-width-overlap.ref.png b/test/reference/line-width-overlap.ref.png new file mode 100644 index 000000000..13d70c8fe Binary files /dev/null and b/test/reference/line-width-overlap.ref.png differ diff --git a/test/reference/line-width-scale.base.argb32.ref.png b/test/reference/line-width-scale.base.argb32.ref.png new file mode 100644 index 000000000..41d55b0eb Binary files /dev/null and b/test/reference/line-width-scale.base.argb32.ref.png differ diff --git a/test/reference/line-width-scale.base.rgb24.ref.png b/test/reference/line-width-scale.base.rgb24.ref.png new file mode 100644 index 000000000..41d55b0eb Binary files /dev/null and b/test/reference/line-width-scale.base.rgb24.ref.png differ diff --git a/test/reference/line-width-scale.image16.ref.png b/test/reference/line-width-scale.image16.ref.png new file mode 100644 index 000000000..a784f6582 Binary files /dev/null and b/test/reference/line-width-scale.image16.ref.png differ diff --git a/test/reference/line-width-scale.ps2.ref.png b/test/reference/line-width-scale.ps2.ref.png new file mode 100644 index 000000000..57999b802 Binary files /dev/null and b/test/reference/line-width-scale.ps2.ref.png differ diff --git a/test/reference/line-width-scale.ps3.ref.png b/test/reference/line-width-scale.ps3.ref.png new file mode 100644 index 000000000..57999b802 Binary files /dev/null and b/test/reference/line-width-scale.ps3.ref.png differ diff --git a/test/reference/line-width-scale.quartz.ref.png b/test/reference/line-width-scale.quartz.ref.png new file mode 100644 index 000000000..afdc9da76 Binary files /dev/null and b/test/reference/line-width-scale.quartz.ref.png differ diff --git a/test/reference/line-width-scale.ref.png b/test/reference/line-width-scale.ref.png new file mode 100644 index 000000000..5767bc7d8 Binary files /dev/null and b/test/reference/line-width-scale.ref.png differ diff --git a/test/reference/line-width-scale.traps.argb32.ref.png b/test/reference/line-width-scale.traps.argb32.ref.png new file mode 100644 index 000000000..41d55b0eb Binary files /dev/null and b/test/reference/line-width-scale.traps.argb32.ref.png differ diff --git a/test/reference/line-width-scale.traps.rgb24.ref.png b/test/reference/line-width-scale.traps.rgb24.ref.png new file mode 100644 index 000000000..41d55b0eb Binary files /dev/null and b/test/reference/line-width-scale.traps.rgb24.ref.png differ diff --git a/test/reference/line-width-tolerance.base.argb32.ref.png b/test/reference/line-width-tolerance.base.argb32.ref.png new file mode 100644 index 000000000..f890a52ed Binary files /dev/null and b/test/reference/line-width-tolerance.base.argb32.ref.png differ diff --git a/test/reference/line-width-tolerance.base.rgb24.ref.png b/test/reference/line-width-tolerance.base.rgb24.ref.png new file mode 100644 index 000000000..f890a52ed Binary files /dev/null and b/test/reference/line-width-tolerance.base.rgb24.ref.png differ diff --git a/test/reference/line-width-tolerance.ref.png b/test/reference/line-width-tolerance.ref.png new file mode 100644 index 000000000..9c4d43987 Binary files /dev/null and b/test/reference/line-width-tolerance.ref.png differ diff --git a/test/reference/line-width-tolerance.traps.argb32.ref.png b/test/reference/line-width-tolerance.traps.argb32.ref.png new file mode 100644 index 000000000..f890a52ed Binary files /dev/null and b/test/reference/line-width-tolerance.traps.argb32.ref.png differ diff --git a/test/reference/line-width-tolerance.traps.rgb24.ref.png b/test/reference/line-width-tolerance.traps.rgb24.ref.png new file mode 100644 index 000000000..f890a52ed Binary files /dev/null and b/test/reference/line-width-tolerance.traps.rgb24.ref.png differ diff --git a/test/reference/line-width.base.argb32.ref.png b/test/reference/line-width.base.argb32.ref.png new file mode 100644 index 000000000..208d17083 Binary files /dev/null and b/test/reference/line-width.base.argb32.ref.png differ diff --git a/test/reference/line-width.base.rgb24.ref.png b/test/reference/line-width.base.rgb24.ref.png new file mode 100644 index 000000000..208d17083 Binary files /dev/null and b/test/reference/line-width.base.rgb24.ref.png differ diff --git a/test/reference/line-width.ref.png b/test/reference/line-width.ref.png new file mode 100644 index 000000000..2a788285f Binary files /dev/null and b/test/reference/line-width.ref.png differ diff --git a/test/reference/line-width.traps.argb32.ref.png b/test/reference/line-width.traps.argb32.ref.png new file mode 100644 index 000000000..208d17083 Binary files /dev/null and b/test/reference/line-width.traps.argb32.ref.png differ diff --git a/test/reference/line-width.traps.rgb24.ref.png b/test/reference/line-width.traps.rgb24.ref.png new file mode 100644 index 000000000..208d17083 Binary files /dev/null and b/test/reference/line-width.traps.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-extend.base.argb32.ref.png b/test/reference/linear-gradient-extend.base.argb32.ref.png new file mode 100644 index 000000000..79ce747db Binary files /dev/null and b/test/reference/linear-gradient-extend.base.argb32.ref.png differ diff --git a/test/reference/linear-gradient-extend.base.rgb24.ref.png b/test/reference/linear-gradient-extend.base.rgb24.ref.png new file mode 100644 index 000000000..79ce747db Binary files /dev/null and b/test/reference/linear-gradient-extend.base.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-extend.ref.png b/test/reference/linear-gradient-extend.ref.png new file mode 100644 index 000000000..79ce747db Binary files /dev/null and b/test/reference/linear-gradient-extend.ref.png differ diff --git a/test/reference/linear-gradient-large.base.argb32.ref.png b/test/reference/linear-gradient-large.base.argb32.ref.png new file mode 100644 index 000000000..f1f37ab47 Binary files /dev/null and b/test/reference/linear-gradient-large.base.argb32.ref.png differ diff --git a/test/reference/linear-gradient-large.base.rgb24.ref.png b/test/reference/linear-gradient-large.base.rgb24.ref.png new file mode 100644 index 000000000..f1f37ab47 Binary files /dev/null and b/test/reference/linear-gradient-large.base.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-large.quartz.ref.png b/test/reference/linear-gradient-large.quartz.ref.png new file mode 100644 index 000000000..68f08297b Binary files /dev/null and b/test/reference/linear-gradient-large.quartz.ref.png differ diff --git a/test/reference/linear-gradient-large.ref.png b/test/reference/linear-gradient-large.ref.png new file mode 100644 index 000000000..f1f37ab47 Binary files /dev/null and b/test/reference/linear-gradient-large.ref.png differ diff --git a/test/reference/linear-gradient-one-stop.base.argb32.ref.png b/test/reference/linear-gradient-one-stop.base.argb32.ref.png new file mode 100644 index 000000000..da02fda49 Binary files /dev/null and b/test/reference/linear-gradient-one-stop.base.argb32.ref.png differ diff --git a/test/reference/linear-gradient-one-stop.base.rgb24.ref.png b/test/reference/linear-gradient-one-stop.base.rgb24.ref.png new file mode 100644 index 000000000..efc12ee71 Binary files /dev/null and b/test/reference/linear-gradient-one-stop.base.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-one-stop.ref.png b/test/reference/linear-gradient-one-stop.ref.png new file mode 100644 index 000000000..da02fda49 Binary files /dev/null and b/test/reference/linear-gradient-one-stop.ref.png differ diff --git a/test/reference/linear-gradient-reflect.base.argb32.ref.png b/test/reference/linear-gradient-reflect.base.argb32.ref.png new file mode 100644 index 000000000..b68dccb5e Binary files /dev/null and b/test/reference/linear-gradient-reflect.base.argb32.ref.png differ diff --git a/test/reference/linear-gradient-reflect.base.rgb24.ref.png b/test/reference/linear-gradient-reflect.base.rgb24.ref.png new file mode 100644 index 000000000..b68dccb5e Binary files /dev/null and b/test/reference/linear-gradient-reflect.base.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-reflect.image16.ref.png b/test/reference/linear-gradient-reflect.image16.ref.png new file mode 100644 index 000000000..de74afcb0 Binary files /dev/null and b/test/reference/linear-gradient-reflect.image16.ref.png differ diff --git a/test/reference/linear-gradient-reflect.pdf.argb32.ref.png b/test/reference/linear-gradient-reflect.pdf.argb32.ref.png new file mode 100644 index 000000000..46e1c0f0e Binary files /dev/null and b/test/reference/linear-gradient-reflect.pdf.argb32.ref.png differ diff --git a/test/reference/linear-gradient-reflect.pdf.rgb24.ref.png b/test/reference/linear-gradient-reflect.pdf.rgb24.ref.png new file mode 100644 index 000000000..46e1c0f0e Binary files /dev/null and b/test/reference/linear-gradient-reflect.pdf.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-reflect.ps3.ref.png b/test/reference/linear-gradient-reflect.ps3.ref.png new file mode 100644 index 000000000..ea6d25c17 Binary files /dev/null and b/test/reference/linear-gradient-reflect.ps3.ref.png differ diff --git a/test/reference/linear-gradient-reflect.quartz.ref.png b/test/reference/linear-gradient-reflect.quartz.ref.png new file mode 100644 index 000000000..89bac91da Binary files /dev/null and b/test/reference/linear-gradient-reflect.quartz.ref.png differ diff --git a/test/reference/linear-gradient-reflect.ref.png b/test/reference/linear-gradient-reflect.ref.png new file mode 100644 index 000000000..b68dccb5e Binary files /dev/null and b/test/reference/linear-gradient-reflect.ref.png differ diff --git a/test/reference/linear-gradient-subset.base.argb32.ref.png b/test/reference/linear-gradient-subset.base.argb32.ref.png new file mode 100644 index 000000000..e03d3d60f Binary files /dev/null and b/test/reference/linear-gradient-subset.base.argb32.ref.png differ diff --git a/test/reference/linear-gradient-subset.base.rgb24.ref.png b/test/reference/linear-gradient-subset.base.rgb24.ref.png new file mode 100644 index 000000000..e03d3d60f Binary files /dev/null and b/test/reference/linear-gradient-subset.base.rgb24.ref.png differ diff --git a/test/reference/linear-gradient-subset.image16.ref.png b/test/reference/linear-gradient-subset.image16.ref.png new file mode 100644 index 000000000..9d04057e2 Binary files /dev/null and b/test/reference/linear-gradient-subset.image16.ref.png differ diff --git a/test/reference/linear-gradient-subset.ps3.ref.png b/test/reference/linear-gradient-subset.ps3.ref.png new file mode 100644 index 000000000..db0a4c067 Binary files /dev/null and b/test/reference/linear-gradient-subset.ps3.ref.png differ diff --git a/test/reference/linear-gradient-subset.quartz.ref.png b/test/reference/linear-gradient-subset.quartz.ref.png new file mode 100644 index 000000000..85d80adbb Binary files /dev/null and b/test/reference/linear-gradient-subset.quartz.ref.png differ diff --git a/test/reference/linear-gradient-subset.ref.png b/test/reference/linear-gradient-subset.ref.png new file mode 100644 index 000000000..8e95d10f6 Binary files /dev/null and b/test/reference/linear-gradient-subset.ref.png differ diff --git a/test/reference/linear-gradient-subset.traps.argb32.ref.png b/test/reference/linear-gradient-subset.traps.argb32.ref.png new file mode 100644 index 000000000..e03d3d60f Binary files /dev/null and b/test/reference/linear-gradient-subset.traps.argb32.ref.png differ diff --git a/test/reference/linear-gradient-subset.traps.rgb24.ref.png b/test/reference/linear-gradient-subset.traps.rgb24.ref.png new file mode 100644 index 000000000..e03d3d60f Binary files /dev/null and b/test/reference/linear-gradient-subset.traps.rgb24.ref.png differ diff --git a/test/reference/linear-gradient.base.argb32.ref.png b/test/reference/linear-gradient.base.argb32.ref.png new file mode 100644 index 000000000..083a9b87b Binary files /dev/null and b/test/reference/linear-gradient.base.argb32.ref.png differ diff --git a/test/reference/linear-gradient.base.rgb24.ref.png b/test/reference/linear-gradient.base.rgb24.ref.png new file mode 100644 index 000000000..083a9b87b Binary files /dev/null and b/test/reference/linear-gradient.base.rgb24.ref.png differ diff --git a/test/reference/linear-gradient.image16.ref.png b/test/reference/linear-gradient.image16.ref.png new file mode 100644 index 000000000..183d3d985 Binary files /dev/null and b/test/reference/linear-gradient.image16.ref.png differ diff --git a/test/reference/linear-gradient.ps3.ref.png b/test/reference/linear-gradient.ps3.ref.png new file mode 100644 index 000000000..c2fa71b11 Binary files /dev/null and b/test/reference/linear-gradient.ps3.ref.png differ diff --git a/test/reference/linear-gradient.quartz.ref.png b/test/reference/linear-gradient.quartz.ref.png new file mode 100644 index 000000000..1c3e7c228 Binary files /dev/null and b/test/reference/linear-gradient.quartz.ref.png differ diff --git a/test/reference/linear-gradient.ref.png b/test/reference/linear-gradient.ref.png new file mode 100644 index 000000000..32c99a4a3 Binary files /dev/null and b/test/reference/linear-gradient.ref.png differ diff --git a/test/reference/linear-gradient.traps.argb32.ref.png b/test/reference/linear-gradient.traps.argb32.ref.png new file mode 100644 index 000000000..083a9b87b Binary files /dev/null and b/test/reference/linear-gradient.traps.argb32.ref.png differ diff --git a/test/reference/linear-gradient.traps.rgb24.ref.png b/test/reference/linear-gradient.traps.rgb24.ref.png new file mode 100644 index 000000000..083a9b87b Binary files /dev/null and b/test/reference/linear-gradient.traps.rgb24.ref.png differ diff --git a/test/reference/linear-step-function.base.argb32.ref.png b/test/reference/linear-step-function.base.argb32.ref.png new file mode 100644 index 000000000..0ed126e1d Binary files /dev/null and b/test/reference/linear-step-function.base.argb32.ref.png differ diff --git a/test/reference/linear-step-function.base.rgb24.ref.png b/test/reference/linear-step-function.base.rgb24.ref.png new file mode 100644 index 000000000..0ed126e1d Binary files /dev/null and b/test/reference/linear-step-function.base.rgb24.ref.png differ diff --git a/test/reference/linear-step-function.mask.argb32.ref.png b/test/reference/linear-step-function.mask.argb32.ref.png new file mode 100644 index 000000000..0ed126e1d Binary files /dev/null and b/test/reference/linear-step-function.mask.argb32.ref.png differ diff --git a/test/reference/linear-step-function.mask.rgb24.ref.png b/test/reference/linear-step-function.mask.rgb24.ref.png new file mode 100644 index 000000000..0ed126e1d Binary files /dev/null and b/test/reference/linear-step-function.mask.rgb24.ref.png differ diff --git a/test/reference/linear-step-function.traps.argb32.ref.png b/test/reference/linear-step-function.traps.argb32.ref.png new file mode 100644 index 000000000..0ed126e1d Binary files /dev/null and b/test/reference/linear-step-function.traps.argb32.ref.png differ diff --git a/test/reference/linear-step-function.traps.rgb24.ref.png b/test/reference/linear-step-function.traps.rgb24.ref.png new file mode 100644 index 000000000..0ed126e1d Binary files /dev/null and b/test/reference/linear-step-function.traps.rgb24.ref.png differ diff --git a/test/reference/linear-step-function.xfail.png b/test/reference/linear-step-function.xfail.png new file mode 100644 index 000000000..b8afd218a Binary files /dev/null and b/test/reference/linear-step-function.xfail.png differ diff --git a/test/reference/linear-uniform.base.argb32.ref.png b/test/reference/linear-uniform.base.argb32.ref.png new file mode 100644 index 000000000..94ca33615 Binary files /dev/null and b/test/reference/linear-uniform.base.argb32.ref.png differ diff --git a/test/reference/linear-uniform.base.rgb24.ref.png b/test/reference/linear-uniform.base.rgb24.ref.png new file mode 100644 index 000000000..94ca33615 Binary files /dev/null and b/test/reference/linear-uniform.base.rgb24.ref.png differ diff --git a/test/reference/linear-uniform.image16.ref.png b/test/reference/linear-uniform.image16.ref.png new file mode 100644 index 000000000..7bf4bf561 Binary files /dev/null and b/test/reference/linear-uniform.image16.ref.png differ diff --git a/test/reference/linear-uniform.ref.png b/test/reference/linear-uniform.ref.png new file mode 100644 index 000000000..94ca33615 Binary files /dev/null and b/test/reference/linear-uniform.ref.png differ diff --git a/test/reference/long-dashed-lines.base.argb32.ref.png b/test/reference/long-dashed-lines.base.argb32.ref.png new file mode 100644 index 000000000..ccd3d5df1 Binary files /dev/null and b/test/reference/long-dashed-lines.base.argb32.ref.png differ diff --git a/test/reference/long-dashed-lines.base.rgb24.ref.png b/test/reference/long-dashed-lines.base.rgb24.ref.png new file mode 100644 index 000000000..ccd3d5df1 Binary files /dev/null and b/test/reference/long-dashed-lines.base.rgb24.ref.png differ diff --git a/test/reference/long-dashed-lines.image16.ref.png b/test/reference/long-dashed-lines.image16.ref.png new file mode 100644 index 000000000..8abac9b4d Binary files /dev/null and b/test/reference/long-dashed-lines.image16.ref.png differ diff --git a/test/reference/long-dashed-lines.ps2.ref.png b/test/reference/long-dashed-lines.ps2.ref.png new file mode 100644 index 000000000..7fce667e8 Binary files /dev/null and b/test/reference/long-dashed-lines.ps2.ref.png differ diff --git a/test/reference/long-dashed-lines.ps3.ref.png b/test/reference/long-dashed-lines.ps3.ref.png new file mode 100644 index 000000000..7fce667e8 Binary files /dev/null and b/test/reference/long-dashed-lines.ps3.ref.png differ diff --git a/test/reference/long-dashed-lines.quartz.ref.png b/test/reference/long-dashed-lines.quartz.ref.png new file mode 100644 index 000000000..3f68d216d Binary files /dev/null and b/test/reference/long-dashed-lines.quartz.ref.png differ diff --git a/test/reference/long-dashed-lines.ref.png b/test/reference/long-dashed-lines.ref.png new file mode 100644 index 000000000..9c7208c18 Binary files /dev/null and b/test/reference/long-dashed-lines.ref.png differ diff --git a/test/reference/long-dashed-lines.traps.argb32.ref.png b/test/reference/long-dashed-lines.traps.argb32.ref.png new file mode 100644 index 000000000..ccd3d5df1 Binary files /dev/null and b/test/reference/long-dashed-lines.traps.argb32.ref.png differ diff --git a/test/reference/long-dashed-lines.traps.rgb24.ref.png b/test/reference/long-dashed-lines.traps.rgb24.ref.png new file mode 100644 index 000000000..ccd3d5df1 Binary files /dev/null and b/test/reference/long-dashed-lines.traps.rgb24.ref.png differ diff --git a/test/reference/long-lines.base.argb32.ref.png b/test/reference/long-lines.base.argb32.ref.png new file mode 100644 index 000000000..fe9116312 Binary files /dev/null and b/test/reference/long-lines.base.argb32.ref.png differ diff --git a/test/reference/long-lines.base.rgb24.ref.png b/test/reference/long-lines.base.rgb24.ref.png new file mode 100644 index 000000000..fe9116312 Binary files /dev/null and b/test/reference/long-lines.base.rgb24.ref.png differ diff --git a/test/reference/long-lines.mask.argb32.ref.png b/test/reference/long-lines.mask.argb32.ref.png new file mode 100644 index 000000000..fe9116312 Binary files /dev/null and b/test/reference/long-lines.mask.argb32.ref.png differ diff --git a/test/reference/long-lines.mask.rgb24.ref.png b/test/reference/long-lines.mask.rgb24.ref.png new file mode 100644 index 000000000..fe9116312 Binary files /dev/null and b/test/reference/long-lines.mask.rgb24.ref.png differ diff --git a/test/reference/long-lines.traps.argb32.ref.png b/test/reference/long-lines.traps.argb32.ref.png new file mode 100644 index 000000000..fe9116312 Binary files /dev/null and b/test/reference/long-lines.traps.argb32.ref.png differ diff --git a/test/reference/long-lines.traps.rgb24.ref.png b/test/reference/long-lines.traps.rgb24.ref.png new file mode 100644 index 000000000..fe9116312 Binary files /dev/null and b/test/reference/long-lines.traps.rgb24.ref.png differ diff --git a/test/reference/map-all-to-image.base.argb32.ref.png b/test/reference/map-all-to-image.base.argb32.ref.png new file mode 100644 index 000000000..c56d9698d Binary files /dev/null and b/test/reference/map-all-to-image.base.argb32.ref.png differ diff --git a/test/reference/map-all-to-image.base.rgb24.ref.png b/test/reference/map-all-to-image.base.rgb24.ref.png new file mode 100644 index 000000000..c56d9698d Binary files /dev/null and b/test/reference/map-all-to-image.base.rgb24.ref.png differ diff --git a/test/reference/map-all-to-image.ref.png b/test/reference/map-all-to-image.ref.png new file mode 100644 index 000000000..c56d9698d Binary files /dev/null and b/test/reference/map-all-to-image.ref.png differ diff --git a/test/reference/map-all-to-xlib-fallback.rgb24.ref.png b/test/reference/map-all-to-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..c56d9698d Binary files /dev/null and b/test/reference/map-all-to-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/map-all-to-xlib-window.rgb24.ref.png b/test/reference/map-all-to-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..c56d9698d Binary files /dev/null and b/test/reference/map-all-to-xlib-window.rgb24.ref.png differ diff --git a/test/reference/map-all-to-xlib.ref.png b/test/reference/map-all-to-xlib.ref.png new file mode 100644 index 000000000..c56d9698d Binary files /dev/null and b/test/reference/map-all-to-xlib.ref.png differ diff --git a/test/reference/map-bit-to-image.base.argb32.ref.png b/test/reference/map-bit-to-image.base.argb32.ref.png new file mode 100644 index 000000000..b42dcb62a Binary files /dev/null and b/test/reference/map-bit-to-image.base.argb32.ref.png differ diff --git a/test/reference/map-bit-to-image.base.rgb24.ref.png b/test/reference/map-bit-to-image.base.rgb24.ref.png new file mode 100644 index 000000000..b42dcb62a Binary files /dev/null and b/test/reference/map-bit-to-image.base.rgb24.ref.png differ diff --git a/test/reference/map-bit-to-image.ref.png b/test/reference/map-bit-to-image.ref.png new file mode 100644 index 000000000..b42dcb62a Binary files /dev/null and b/test/reference/map-bit-to-image.ref.png differ diff --git a/test/reference/map-bit-to-xlib-fallback.rgb24.ref.png b/test/reference/map-bit-to-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..b42dcb62a Binary files /dev/null and b/test/reference/map-bit-to-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/map-bit-to-xlib-window.rgb24.ref.png b/test/reference/map-bit-to-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..b42dcb62a Binary files /dev/null and b/test/reference/map-bit-to-xlib-window.rgb24.ref.png differ diff --git a/test/reference/map-bit-to-xlib.ref.png b/test/reference/map-bit-to-xlib.ref.png new file mode 100644 index 000000000..b42dcb62a Binary files /dev/null and b/test/reference/map-bit-to-xlib.ref.png differ diff --git a/test/reference/map-to-image-fill.base.argb32.ref.png b/test/reference/map-to-image-fill.base.argb32.ref.png new file mode 100644 index 000000000..c2893e0de Binary files /dev/null and b/test/reference/map-to-image-fill.base.argb32.ref.png differ diff --git a/test/reference/map-to-image-fill.base.rgb24.ref.png b/test/reference/map-to-image-fill.base.rgb24.ref.png new file mode 100644 index 000000000..c2893e0de Binary files /dev/null and b/test/reference/map-to-image-fill.base.rgb24.ref.png differ diff --git a/test/reference/map-to-image-fill.ref.png b/test/reference/map-to-image-fill.ref.png new file mode 100644 index 000000000..c2893e0de Binary files /dev/null and b/test/reference/map-to-image-fill.ref.png differ diff --git a/test/reference/mask-alpha.argb32.ref.png b/test/reference/mask-alpha.argb32.ref.png new file mode 100644 index 000000000..90717f0cc Binary files /dev/null and b/test/reference/mask-alpha.argb32.ref.png differ diff --git a/test/reference/mask-alpha.base.argb32.ref.png b/test/reference/mask-alpha.base.argb32.ref.png new file mode 100644 index 000000000..a0b9017e0 Binary files /dev/null and b/test/reference/mask-alpha.base.argb32.ref.png differ diff --git a/test/reference/mask-alpha.base.rgb24.ref.png b/test/reference/mask-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..d8f4b8f81 Binary files /dev/null and b/test/reference/mask-alpha.base.rgb24.ref.png differ diff --git a/test/reference/mask-alpha.image16.ref.png b/test/reference/mask-alpha.image16.ref.png new file mode 100644 index 000000000..dbf121a4b Binary files /dev/null and b/test/reference/mask-alpha.image16.ref.png differ diff --git a/test/reference/mask-alpha.ps.ref.png b/test/reference/mask-alpha.ps.ref.png new file mode 100644 index 000000000..b0058dd47 Binary files /dev/null and b/test/reference/mask-alpha.ps.ref.png differ diff --git a/test/reference/mask-alpha.quartz.argb32.ref.png b/test/reference/mask-alpha.quartz.argb32.ref.png new file mode 100644 index 000000000..1d530ee17 Binary files /dev/null and b/test/reference/mask-alpha.quartz.argb32.ref.png differ diff --git a/test/reference/mask-alpha.rgb24.ref.png b/test/reference/mask-alpha.rgb24.ref.png new file mode 100644 index 000000000..9999b8a4f Binary files /dev/null and b/test/reference/mask-alpha.rgb24.ref.png differ diff --git a/test/reference/mask-alpha.svg.rgb24.xfail.png b/test/reference/mask-alpha.svg.rgb24.xfail.png new file mode 100644 index 000000000..15ebf7559 Binary files /dev/null and b/test/reference/mask-alpha.svg.rgb24.xfail.png differ diff --git a/test/reference/mask-alpha.traps.argb32.ref.png b/test/reference/mask-alpha.traps.argb32.ref.png new file mode 100644 index 000000000..a0b9017e0 Binary files /dev/null and b/test/reference/mask-alpha.traps.argb32.ref.png differ diff --git a/test/reference/mask-alpha.traps.rgb24.ref.png b/test/reference/mask-alpha.traps.rgb24.ref.png new file mode 100644 index 000000000..d8f4b8f81 Binary files /dev/null and b/test/reference/mask-alpha.traps.rgb24.ref.png differ diff --git a/test/reference/mask-ctm.base.argb32.ref.png b/test/reference/mask-ctm.base.argb32.ref.png new file mode 100644 index 000000000..07d903d15 Binary files /dev/null and b/test/reference/mask-ctm.base.argb32.ref.png differ diff --git a/test/reference/mask-ctm.base.rgb24.ref.png b/test/reference/mask-ctm.base.rgb24.ref.png new file mode 100644 index 000000000..de3fa097f Binary files /dev/null and b/test/reference/mask-ctm.base.rgb24.ref.png differ diff --git a/test/reference/mask-ctm.ref.png b/test/reference/mask-ctm.ref.png new file mode 100644 index 000000000..88a0402ca Binary files /dev/null and b/test/reference/mask-ctm.ref.png differ diff --git a/test/reference/mask-glyphs.gl.ref.png b/test/reference/mask-glyphs.gl.ref.png new file mode 100644 index 000000000..d3410976f Binary files /dev/null and b/test/reference/mask-glyphs.gl.ref.png differ diff --git a/test/reference/mask-glyphs.image16.ref.png b/test/reference/mask-glyphs.image16.ref.png new file mode 100644 index 000000000..177e79560 Binary files /dev/null and b/test/reference/mask-glyphs.image16.ref.png differ diff --git a/test/reference/mask-glyphs.pdf.ref.png b/test/reference/mask-glyphs.pdf.ref.png new file mode 100644 index 000000000..673ef92d8 Binary files /dev/null and b/test/reference/mask-glyphs.pdf.ref.png differ diff --git a/test/reference/mask-glyphs.ref.png b/test/reference/mask-glyphs.ref.png new file mode 100644 index 000000000..5beda0dbe Binary files /dev/null and b/test/reference/mask-glyphs.ref.png differ diff --git a/test/reference/mask-glyphs.svg.ref.png b/test/reference/mask-glyphs.svg.ref.png new file mode 100644 index 000000000..bbc44f207 Binary files /dev/null and b/test/reference/mask-glyphs.svg.ref.png differ diff --git a/test/reference/mask-surface-ctm.base.argb32.ref.png b/test/reference/mask-surface-ctm.base.argb32.ref.png new file mode 100644 index 000000000..07d903d15 Binary files /dev/null and b/test/reference/mask-surface-ctm.base.argb32.ref.png differ diff --git a/test/reference/mask-surface-ctm.base.rgb24.ref.png b/test/reference/mask-surface-ctm.base.rgb24.ref.png new file mode 100644 index 000000000..de3fa097f Binary files /dev/null and b/test/reference/mask-surface-ctm.base.rgb24.ref.png differ diff --git a/test/reference/mask-surface-ctm.ref.png b/test/reference/mask-surface-ctm.ref.png new file mode 100644 index 000000000..744b1dd37 Binary files /dev/null and b/test/reference/mask-surface-ctm.ref.png differ diff --git a/test/reference/mask-transformed-image.base.argb32.ref.png b/test/reference/mask-transformed-image.base.argb32.ref.png new file mode 100644 index 000000000..af84b39d3 Binary files /dev/null and b/test/reference/mask-transformed-image.base.argb32.ref.png differ diff --git a/test/reference/mask-transformed-image.base.rgb24.ref.png b/test/reference/mask-transformed-image.base.rgb24.ref.png new file mode 100644 index 000000000..af84b39d3 Binary files /dev/null and b/test/reference/mask-transformed-image.base.rgb24.ref.png differ diff --git a/test/reference/mask-transformed-image.image16.ref.png b/test/reference/mask-transformed-image.image16.ref.png new file mode 100644 index 000000000..9e196eff1 Binary files /dev/null and b/test/reference/mask-transformed-image.image16.ref.png differ diff --git a/test/reference/mask-transformed-image.pdf.ref.png b/test/reference/mask-transformed-image.pdf.ref.png new file mode 100644 index 000000000..33ec27997 Binary files /dev/null and b/test/reference/mask-transformed-image.pdf.ref.png differ diff --git a/test/reference/mask-transformed-image.quartz.ref.png b/test/reference/mask-transformed-image.quartz.ref.png new file mode 100644 index 000000000..58ac57558 Binary files /dev/null and b/test/reference/mask-transformed-image.quartz.ref.png differ diff --git a/test/reference/mask-transformed-image.ref.png b/test/reference/mask-transformed-image.ref.png new file mode 100644 index 000000000..af84b39d3 Binary files /dev/null and b/test/reference/mask-transformed-image.ref.png differ diff --git a/test/reference/mask-transformed-similar.base.argb32.ref.png b/test/reference/mask-transformed-similar.base.argb32.ref.png new file mode 100644 index 000000000..af84b39d3 Binary files /dev/null and b/test/reference/mask-transformed-similar.base.argb32.ref.png differ diff --git a/test/reference/mask-transformed-similar.base.rgb24.ref.png b/test/reference/mask-transformed-similar.base.rgb24.ref.png new file mode 100644 index 000000000..af84b39d3 Binary files /dev/null and b/test/reference/mask-transformed-similar.base.rgb24.ref.png differ diff --git a/test/reference/mask-transformed-similar.image16.ref.png b/test/reference/mask-transformed-similar.image16.ref.png new file mode 100644 index 000000000..9e196eff1 Binary files /dev/null and b/test/reference/mask-transformed-similar.image16.ref.png differ diff --git a/test/reference/mask-transformed-similar.pdf.ref.png b/test/reference/mask-transformed-similar.pdf.ref.png new file mode 100644 index 000000000..e8d387903 Binary files /dev/null and b/test/reference/mask-transformed-similar.pdf.ref.png differ diff --git a/test/reference/mask-transformed-similar.quartz.ref.png b/test/reference/mask-transformed-similar.quartz.ref.png new file mode 100644 index 000000000..58ac57558 Binary files /dev/null and b/test/reference/mask-transformed-similar.quartz.ref.png differ diff --git a/test/reference/mask-transformed-similar.recording.ref.png b/test/reference/mask-transformed-similar.recording.ref.png new file mode 100644 index 000000000..33ec27997 Binary files /dev/null and b/test/reference/mask-transformed-similar.recording.ref.png differ diff --git a/test/reference/mask-transformed-similar.ref.png b/test/reference/mask-transformed-similar.ref.png new file mode 100644 index 000000000..af84b39d3 Binary files /dev/null and b/test/reference/mask-transformed-similar.ref.png differ diff --git a/test/reference/mask-transformed-similar.svg.ref.png b/test/reference/mask-transformed-similar.svg.ref.png new file mode 100644 index 000000000..a5b9b00b9 Binary files /dev/null and b/test/reference/mask-transformed-similar.svg.ref.png differ diff --git a/test/reference/mask-transformed-xlib-fallback.rgb24.ref.png b/test/reference/mask-transformed-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..09eb43ae7 Binary files /dev/null and b/test/reference/mask-transformed-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/mask-transformed-xlib-window.rgb24.ref.png b/test/reference/mask-transformed-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..09eb43ae7 Binary files /dev/null and b/test/reference/mask-transformed-xlib-window.rgb24.ref.png differ diff --git a/test/reference/mask-transformed-xlib.ref.png b/test/reference/mask-transformed-xlib.ref.png new file mode 100644 index 000000000..09eb43ae7 Binary files /dev/null and b/test/reference/mask-transformed-xlib.ref.png differ diff --git a/test/reference/mask.argb32.ref.png b/test/reference/mask.argb32.ref.png new file mode 100644 index 000000000..a4c683ccc Binary files /dev/null and b/test/reference/mask.argb32.ref.png differ diff --git a/test/reference/mask.base.argb32.ref.png b/test/reference/mask.base.argb32.ref.png new file mode 100644 index 000000000..7ee6b4536 Binary files /dev/null and b/test/reference/mask.base.argb32.ref.png differ diff --git a/test/reference/mask.base.rgb24.ref.png b/test/reference/mask.base.rgb24.ref.png new file mode 100644 index 000000000..b0ceb3522 Binary files /dev/null and b/test/reference/mask.base.rgb24.ref.png differ diff --git a/test/reference/mask.image16.ref.png b/test/reference/mask.image16.ref.png new file mode 100644 index 000000000..4ab52de26 Binary files /dev/null and b/test/reference/mask.image16.ref.png differ diff --git a/test/reference/mask.pdf.argb32.ref.png b/test/reference/mask.pdf.argb32.ref.png new file mode 100644 index 000000000..33769ee16 Binary files /dev/null and b/test/reference/mask.pdf.argb32.ref.png differ diff --git a/test/reference/mask.pdf.rgb24.ref.png b/test/reference/mask.pdf.rgb24.ref.png new file mode 100644 index 000000000..dbd49a816 Binary files /dev/null and b/test/reference/mask.pdf.rgb24.ref.png differ diff --git a/test/reference/mask.quartz.argb32.ref.png b/test/reference/mask.quartz.argb32.ref.png new file mode 100644 index 000000000..c7ab76e82 Binary files /dev/null and b/test/reference/mask.quartz.argb32.ref.png differ diff --git a/test/reference/mask.quartz.rgb24.ref.png b/test/reference/mask.quartz.rgb24.ref.png new file mode 100644 index 000000000..f475ba933 Binary files /dev/null and b/test/reference/mask.quartz.rgb24.ref.png differ diff --git a/test/reference/mask.rgb24.ref.png b/test/reference/mask.rgb24.ref.png new file mode 100644 index 000000000..1bd18334f Binary files /dev/null and b/test/reference/mask.rgb24.ref.png differ diff --git a/test/reference/mask.svg.argb32.xfail.png b/test/reference/mask.svg.argb32.xfail.png new file mode 100644 index 000000000..867248004 Binary files /dev/null and b/test/reference/mask.svg.argb32.xfail.png differ diff --git a/test/reference/mask.svg.rgb24.xfail.png b/test/reference/mask.svg.rgb24.xfail.png new file mode 100644 index 000000000..743a758e6 Binary files /dev/null and b/test/reference/mask.svg.rgb24.xfail.png differ diff --git a/test/reference/mask.traps.argb32.ref.png b/test/reference/mask.traps.argb32.ref.png new file mode 100644 index 000000000..3286ce6b7 Binary files /dev/null and b/test/reference/mask.traps.argb32.ref.png differ diff --git a/test/reference/mask.traps.rgb24.ref.png b/test/reference/mask.traps.rgb24.ref.png new file mode 100644 index 000000000..edcabaf91 Binary files /dev/null and b/test/reference/mask.traps.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-accuracy.base.argb32.ref.png b/test/reference/mesh-pattern-accuracy.base.argb32.ref.png new file mode 100644 index 000000000..dfc19ff4f Binary files /dev/null and b/test/reference/mesh-pattern-accuracy.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern-accuracy.base.rgb24.ref.png b/test/reference/mesh-pattern-accuracy.base.rgb24.ref.png new file mode 100644 index 000000000..dfc19ff4f Binary files /dev/null and b/test/reference/mesh-pattern-accuracy.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-accuracy.image16.ref.png b/test/reference/mesh-pattern-accuracy.image16.ref.png new file mode 100644 index 000000000..a82e4fbeb Binary files /dev/null and b/test/reference/mesh-pattern-accuracy.image16.ref.png differ diff --git a/test/reference/mesh-pattern-accuracy.ref.png b/test/reference/mesh-pattern-accuracy.ref.png new file mode 100644 index 000000000..dfc19ff4f Binary files /dev/null and b/test/reference/mesh-pattern-accuracy.ref.png differ diff --git a/test/reference/mesh-pattern-conical.base.argb32.ref.png b/test/reference/mesh-pattern-conical.base.argb32.ref.png new file mode 100644 index 000000000..f5dc21dc8 Binary files /dev/null and b/test/reference/mesh-pattern-conical.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern-conical.base.rgb24.ref.png b/test/reference/mesh-pattern-conical.base.rgb24.ref.png new file mode 100644 index 000000000..f5dc21dc8 Binary files /dev/null and b/test/reference/mesh-pattern-conical.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-conical.image16.ref.png b/test/reference/mesh-pattern-conical.image16.ref.png new file mode 100644 index 000000000..b8f9416ea Binary files /dev/null and b/test/reference/mesh-pattern-conical.image16.ref.png differ diff --git a/test/reference/mesh-pattern-conical.ref.png b/test/reference/mesh-pattern-conical.ref.png new file mode 100644 index 000000000..f5dc21dc8 Binary files /dev/null and b/test/reference/mesh-pattern-conical.ref.png differ diff --git a/test/reference/mesh-pattern-control-points.base.argb32.ref.png b/test/reference/mesh-pattern-control-points.base.argb32.ref.png new file mode 100644 index 000000000..841fc3ef9 Binary files /dev/null and b/test/reference/mesh-pattern-control-points.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern-control-points.base.rgb24.ref.png b/test/reference/mesh-pattern-control-points.base.rgb24.ref.png new file mode 100644 index 000000000..841fc3ef9 Binary files /dev/null and b/test/reference/mesh-pattern-control-points.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-control-points.image16.ref.png b/test/reference/mesh-pattern-control-points.image16.ref.png new file mode 100644 index 000000000..b664ef90d Binary files /dev/null and b/test/reference/mesh-pattern-control-points.image16.ref.png differ diff --git a/test/reference/mesh-pattern-control-points.ref.png b/test/reference/mesh-pattern-control-points.ref.png new file mode 100644 index 000000000..841fc3ef9 Binary files /dev/null and b/test/reference/mesh-pattern-control-points.ref.png differ diff --git a/test/reference/mesh-pattern-fold.base.argb32.ref.png b/test/reference/mesh-pattern-fold.base.argb32.ref.png new file mode 100644 index 000000000..6275b82d8 Binary files /dev/null and b/test/reference/mesh-pattern-fold.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern-fold.base.rgb24.ref.png b/test/reference/mesh-pattern-fold.base.rgb24.ref.png new file mode 100644 index 000000000..6275b82d8 Binary files /dev/null and b/test/reference/mesh-pattern-fold.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-fold.image16.ref.png b/test/reference/mesh-pattern-fold.image16.ref.png new file mode 100644 index 000000000..4264ad2c7 Binary files /dev/null and b/test/reference/mesh-pattern-fold.image16.ref.png differ diff --git a/test/reference/mesh-pattern-fold.ref.png b/test/reference/mesh-pattern-fold.ref.png new file mode 100644 index 000000000..6275b82d8 Binary files /dev/null and b/test/reference/mesh-pattern-fold.ref.png differ diff --git a/test/reference/mesh-pattern-overlap.base.argb32.ref.png b/test/reference/mesh-pattern-overlap.base.argb32.ref.png new file mode 100644 index 000000000..1394c9ec5 Binary files /dev/null and b/test/reference/mesh-pattern-overlap.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern-overlap.base.rgb24.ref.png b/test/reference/mesh-pattern-overlap.base.rgb24.ref.png new file mode 100644 index 000000000..1394c9ec5 Binary files /dev/null and b/test/reference/mesh-pattern-overlap.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-overlap.image16.ref.png b/test/reference/mesh-pattern-overlap.image16.ref.png new file mode 100644 index 000000000..a67f7ddec Binary files /dev/null and b/test/reference/mesh-pattern-overlap.image16.ref.png differ diff --git a/test/reference/mesh-pattern-overlap.ref.png b/test/reference/mesh-pattern-overlap.ref.png new file mode 100644 index 000000000..1394c9ec5 Binary files /dev/null and b/test/reference/mesh-pattern-overlap.ref.png differ diff --git a/test/reference/mesh-pattern-transformed.base.argb32.ref.png b/test/reference/mesh-pattern-transformed.base.argb32.ref.png new file mode 100644 index 000000000..9aa482f52 Binary files /dev/null and b/test/reference/mesh-pattern-transformed.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern-transformed.base.rgb24.ref.png b/test/reference/mesh-pattern-transformed.base.rgb24.ref.png new file mode 100644 index 000000000..9aa482f52 Binary files /dev/null and b/test/reference/mesh-pattern-transformed.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern-transformed.image16.ref.png b/test/reference/mesh-pattern-transformed.image16.ref.png new file mode 100644 index 000000000..0645b861e Binary files /dev/null and b/test/reference/mesh-pattern-transformed.image16.ref.png differ diff --git a/test/reference/mesh-pattern-transformed.ref.png b/test/reference/mesh-pattern-transformed.ref.png new file mode 100644 index 000000000..9aa482f52 Binary files /dev/null and b/test/reference/mesh-pattern-transformed.ref.png differ diff --git a/test/reference/mesh-pattern.base.argb32.ref.png b/test/reference/mesh-pattern.base.argb32.ref.png new file mode 100644 index 000000000..1f76639f0 Binary files /dev/null and b/test/reference/mesh-pattern.base.argb32.ref.png differ diff --git a/test/reference/mesh-pattern.base.rgb24.ref.png b/test/reference/mesh-pattern.base.rgb24.ref.png new file mode 100644 index 000000000..1f76639f0 Binary files /dev/null and b/test/reference/mesh-pattern.base.rgb24.ref.png differ diff --git a/test/reference/mesh-pattern.image16.ref.png b/test/reference/mesh-pattern.image16.ref.png new file mode 100644 index 000000000..bd6353842 Binary files /dev/null and b/test/reference/mesh-pattern.image16.ref.png differ diff --git a/test/reference/mesh-pattern.ref.png b/test/reference/mesh-pattern.ref.png new file mode 100644 index 000000000..1f76639f0 Binary files /dev/null and b/test/reference/mesh-pattern.ref.png differ diff --git a/test/reference/mime-data.base.argb32.ref.png b/test/reference/mime-data.base.argb32.ref.png new file mode 100644 index 000000000..4bc007c8a Binary files /dev/null and b/test/reference/mime-data.base.argb32.ref.png differ diff --git a/test/reference/mime-data.base.rgb24.ref.png b/test/reference/mime-data.base.rgb24.ref.png new file mode 100644 index 000000000..4bc007c8a Binary files /dev/null and b/test/reference/mime-data.base.rgb24.ref.png differ diff --git a/test/reference/mime-data.pdf.ref.png b/test/reference/mime-data.pdf.ref.png new file mode 100644 index 000000000..76c17f8de Binary files /dev/null and b/test/reference/mime-data.pdf.ref.png differ diff --git a/test/reference/mime-data.ps.ref.png b/test/reference/mime-data.ps.ref.png new file mode 100644 index 000000000..7ec7d9b2c Binary files /dev/null and b/test/reference/mime-data.ps.ref.png differ diff --git a/test/reference/mime-data.ref.png b/test/reference/mime-data.ref.png new file mode 100644 index 000000000..4bc007c8a Binary files /dev/null and b/test/reference/mime-data.ref.png differ diff --git a/test/reference/mime-data.script.ref.png b/test/reference/mime-data.script.ref.png new file mode 100644 index 000000000..07691b101 Binary files /dev/null and b/test/reference/mime-data.script.ref.png differ diff --git a/test/reference/mime-data.svg.ref.png b/test/reference/mime-data.svg.ref.png new file mode 100644 index 000000000..a4bbb1b6c Binary files /dev/null and b/test/reference/mime-data.svg.ref.png differ diff --git a/test/reference/miter-precision.base.argb32.ref.png b/test/reference/miter-precision.base.argb32.ref.png new file mode 100644 index 000000000..b881dd4ad Binary files /dev/null and b/test/reference/miter-precision.base.argb32.ref.png differ diff --git a/test/reference/miter-precision.base.rgb24.ref.png b/test/reference/miter-precision.base.rgb24.ref.png new file mode 100644 index 000000000..b881dd4ad Binary files /dev/null and b/test/reference/miter-precision.base.rgb24.ref.png differ diff --git a/test/reference/miter-precision.ps2.ref.png b/test/reference/miter-precision.ps2.ref.png new file mode 100644 index 000000000..c2b69ad6a Binary files /dev/null and b/test/reference/miter-precision.ps2.ref.png differ diff --git a/test/reference/miter-precision.ps3.ref.png b/test/reference/miter-precision.ps3.ref.png new file mode 100644 index 000000000..c2b69ad6a Binary files /dev/null and b/test/reference/miter-precision.ps3.ref.png differ diff --git a/test/reference/miter-precision.ref.png b/test/reference/miter-precision.ref.png new file mode 100644 index 000000000..a2c333e41 Binary files /dev/null and b/test/reference/miter-precision.ref.png differ diff --git a/test/reference/miter-precision.traps.argb32.ref.png b/test/reference/miter-precision.traps.argb32.ref.png new file mode 100644 index 000000000..b881dd4ad Binary files /dev/null and b/test/reference/miter-precision.traps.argb32.ref.png differ diff --git a/test/reference/miter-precision.traps.rgb24.ref.png b/test/reference/miter-precision.traps.rgb24.ref.png new file mode 100644 index 000000000..b881dd4ad Binary files /dev/null and b/test/reference/miter-precision.traps.rgb24.ref.png differ diff --git a/test/reference/move-to-show-surface.base.argb32.ref.png b/test/reference/move-to-show-surface.base.argb32.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/move-to-show-surface.base.argb32.ref.png differ diff --git a/test/reference/move-to-show-surface.base.rgb24.ref.png b/test/reference/move-to-show-surface.base.rgb24.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/move-to-show-surface.base.rgb24.ref.png differ diff --git a/test/reference/move-to-show-surface.ref.png b/test/reference/move-to-show-surface.ref.png new file mode 100644 index 000000000..765adc4a4 Binary files /dev/null and b/test/reference/move-to-show-surface.ref.png differ diff --git a/test/reference/negative-stride-image.base.argb32.ref.png b/test/reference/negative-stride-image.base.argb32.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/negative-stride-image.base.argb32.ref.png differ diff --git a/test/reference/negative-stride-image.base.rgb24.ref.png b/test/reference/negative-stride-image.base.rgb24.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/negative-stride-image.base.rgb24.ref.png differ diff --git a/test/reference/negative-stride-image.image16.ref.png b/test/reference/negative-stride-image.image16.ref.png new file mode 100644 index 000000000..4b15914f2 Binary files /dev/null and b/test/reference/negative-stride-image.image16.ref.png differ diff --git a/test/reference/negative-stride-image.ps.ref.png b/test/reference/negative-stride-image.ps.ref.png new file mode 100644 index 000000000..953c9a18e Binary files /dev/null and b/test/reference/negative-stride-image.ps.ref.png differ diff --git a/test/reference/negative-stride-image.ref.png b/test/reference/negative-stride-image.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/negative-stride-image.ref.png differ diff --git a/test/reference/new-sub-path.base.argb32.ref.png b/test/reference/new-sub-path.base.argb32.ref.png new file mode 100644 index 000000000..13e067550 Binary files /dev/null and b/test/reference/new-sub-path.base.argb32.ref.png differ diff --git a/test/reference/new-sub-path.base.rgb24.ref.png b/test/reference/new-sub-path.base.rgb24.ref.png new file mode 100644 index 000000000..b69e4abec Binary files /dev/null and b/test/reference/new-sub-path.base.rgb24.ref.png differ diff --git a/test/reference/new-sub-path.pdf.argb32.ref.png b/test/reference/new-sub-path.pdf.argb32.ref.png new file mode 100644 index 000000000..41fe1314e Binary files /dev/null and b/test/reference/new-sub-path.pdf.argb32.ref.png differ diff --git a/test/reference/new-sub-path.ps2.argb32.ref.png b/test/reference/new-sub-path.ps2.argb32.ref.png new file mode 100644 index 000000000..45253dbee Binary files /dev/null and b/test/reference/new-sub-path.ps2.argb32.ref.png differ diff --git a/test/reference/new-sub-path.ps2.rgb24.ref.png b/test/reference/new-sub-path.ps2.rgb24.ref.png new file mode 100644 index 000000000..bceb5b75a Binary files /dev/null and b/test/reference/new-sub-path.ps2.rgb24.ref.png differ diff --git a/test/reference/new-sub-path.ps3.argb32.ref.png b/test/reference/new-sub-path.ps3.argb32.ref.png new file mode 100644 index 000000000..45253dbee Binary files /dev/null and b/test/reference/new-sub-path.ps3.argb32.ref.png differ diff --git a/test/reference/new-sub-path.ps3.rgb24.ref.png b/test/reference/new-sub-path.ps3.rgb24.ref.png new file mode 100644 index 000000000..bceb5b75a Binary files /dev/null and b/test/reference/new-sub-path.ps3.rgb24.ref.png differ diff --git a/test/reference/new-sub-path.quartz.ref.png b/test/reference/new-sub-path.quartz.ref.png new file mode 100644 index 000000000..20d49ba33 Binary files /dev/null and b/test/reference/new-sub-path.quartz.ref.png differ diff --git a/test/reference/new-sub-path.ref.png b/test/reference/new-sub-path.ref.png new file mode 100644 index 000000000..87a6c91c5 Binary files /dev/null and b/test/reference/new-sub-path.ref.png differ diff --git a/test/reference/new-sub-path.traps.argb32.ref.png b/test/reference/new-sub-path.traps.argb32.ref.png new file mode 100644 index 000000000..13e067550 Binary files /dev/null and b/test/reference/new-sub-path.traps.argb32.ref.png differ diff --git a/test/reference/new-sub-path.traps.rgb24.ref.png b/test/reference/new-sub-path.traps.rgb24.ref.png new file mode 100644 index 000000000..b69e4abec Binary files /dev/null and b/test/reference/new-sub-path.traps.rgb24.ref.png differ diff --git a/test/reference/nil-surface.base.argb32.ref.png b/test/reference/nil-surface.base.argb32.ref.png new file mode 100644 index 000000000..50e35a246 Binary files /dev/null and b/test/reference/nil-surface.base.argb32.ref.png differ diff --git a/test/reference/nil-surface.base.rgb24.ref.png b/test/reference/nil-surface.base.rgb24.ref.png new file mode 100644 index 000000000..7d5589c1d Binary files /dev/null and b/test/reference/nil-surface.base.rgb24.ref.png differ diff --git a/test/reference/nil-surface.ref.png b/test/reference/nil-surface.ref.png new file mode 100644 index 000000000..79dd2bc1d Binary files /dev/null and b/test/reference/nil-surface.ref.png differ diff --git a/test/reference/operator-alpha-alpha.base.argb32.ref.png b/test/reference/operator-alpha-alpha.base.argb32.ref.png new file mode 100644 index 000000000..fc173cb18 Binary files /dev/null and b/test/reference/operator-alpha-alpha.base.argb32.ref.png differ diff --git a/test/reference/operator-alpha-alpha.base.rgb24.ref.png b/test/reference/operator-alpha-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..fc173cb18 Binary files /dev/null and b/test/reference/operator-alpha-alpha.base.rgb24.ref.png differ diff --git a/test/reference/operator-alpha-alpha.image16.ref.png b/test/reference/operator-alpha-alpha.image16.ref.png new file mode 100644 index 000000000..31eba5f75 Binary files /dev/null and b/test/reference/operator-alpha-alpha.image16.ref.png differ diff --git a/test/reference/operator-alpha-alpha.pdf.xfail.png b/test/reference/operator-alpha-alpha.pdf.xfail.png new file mode 100644 index 000000000..0a06685e6 Binary files /dev/null and b/test/reference/operator-alpha-alpha.pdf.xfail.png differ diff --git a/test/reference/operator-alpha-alpha.ps.xfail.png b/test/reference/operator-alpha-alpha.ps.xfail.png new file mode 100644 index 000000000..e7c4fea2d Binary files /dev/null and b/test/reference/operator-alpha-alpha.ps.xfail.png differ diff --git a/test/reference/operator-alpha-alpha.ref.png b/test/reference/operator-alpha-alpha.ref.png new file mode 100644 index 000000000..695d0d012 Binary files /dev/null and b/test/reference/operator-alpha-alpha.ref.png differ diff --git a/test/reference/operator-alpha-alpha.svg.xfail.png b/test/reference/operator-alpha-alpha.svg.xfail.png new file mode 100644 index 000000000..c7dc8cbd3 Binary files /dev/null and b/test/reference/operator-alpha-alpha.svg.xfail.png differ diff --git a/test/reference/operator-alpha-alpha.traps.argb32.ref.png b/test/reference/operator-alpha-alpha.traps.argb32.ref.png new file mode 100644 index 000000000..fc173cb18 Binary files /dev/null and b/test/reference/operator-alpha-alpha.traps.argb32.ref.png differ diff --git a/test/reference/operator-alpha-alpha.traps.rgb24.ref.png b/test/reference/operator-alpha-alpha.traps.rgb24.ref.png new file mode 100644 index 000000000..fc173cb18 Binary files /dev/null and b/test/reference/operator-alpha-alpha.traps.rgb24.ref.png differ diff --git a/test/reference/operator-alpha.argb32.ref.png b/test/reference/operator-alpha.argb32.ref.png new file mode 100644 index 000000000..b4f3b71f0 Binary files /dev/null and b/test/reference/operator-alpha.argb32.ref.png differ diff --git a/test/reference/operator-alpha.base.argb32.ref.png b/test/reference/operator-alpha.base.argb32.ref.png new file mode 100644 index 000000000..b4f3b71f0 Binary files /dev/null and b/test/reference/operator-alpha.base.argb32.ref.png differ diff --git a/test/reference/operator-alpha.base.rgb24.ref.png b/test/reference/operator-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..bc7be3aeb Binary files /dev/null and b/test/reference/operator-alpha.base.rgb24.ref.png differ diff --git a/test/reference/operator-alpha.rgb24.ref.png b/test/reference/operator-alpha.rgb24.ref.png new file mode 100644 index 000000000..bc7be3aeb Binary files /dev/null and b/test/reference/operator-alpha.rgb24.ref.png differ diff --git a/test/reference/operator-alpha.svg12.argb32.xfail.png b/test/reference/operator-alpha.svg12.argb32.xfail.png new file mode 100644 index 000000000..e821d206f Binary files /dev/null and b/test/reference/operator-alpha.svg12.argb32.xfail.png differ diff --git a/test/reference/operator-alpha.svg12.rgb24.xfail.png b/test/reference/operator-alpha.svg12.rgb24.xfail.png new file mode 100644 index 000000000..42d9ddee9 Binary files /dev/null and b/test/reference/operator-alpha.svg12.rgb24.xfail.png differ diff --git a/test/reference/operator-clear.argb32.ref.png b/test/reference/operator-clear.argb32.ref.png new file mode 100644 index 000000000..2ce556e7c Binary files /dev/null and b/test/reference/operator-clear.argb32.ref.png differ diff --git a/test/reference/operator-clear.base.argb32.ref.png b/test/reference/operator-clear.base.argb32.ref.png new file mode 100644 index 000000000..c49b4a8d6 Binary files /dev/null and b/test/reference/operator-clear.base.argb32.ref.png differ diff --git a/test/reference/operator-clear.base.rgb24.ref.png b/test/reference/operator-clear.base.rgb24.ref.png new file mode 100644 index 000000000..51d38d134 Binary files /dev/null and b/test/reference/operator-clear.base.rgb24.ref.png differ diff --git a/test/reference/operator-clear.mask.rgb24.ref.png b/test/reference/operator-clear.mask.rgb24.ref.png new file mode 100644 index 000000000..3d58ab341 Binary files /dev/null and b/test/reference/operator-clear.mask.rgb24.ref.png differ diff --git a/test/reference/operator-clear.ps2.argb32.ref.png b/test/reference/operator-clear.ps2.argb32.ref.png new file mode 100644 index 000000000..92b41111f Binary files /dev/null and b/test/reference/operator-clear.ps2.argb32.ref.png differ diff --git a/test/reference/operator-clear.ps3.argb32.ref.png b/test/reference/operator-clear.ps3.argb32.ref.png new file mode 100644 index 000000000..92b41111f Binary files /dev/null and b/test/reference/operator-clear.ps3.argb32.ref.png differ diff --git a/test/reference/operator-clear.quartz.argb32.ref.png b/test/reference/operator-clear.quartz.argb32.ref.png new file mode 100644 index 000000000..caf265e75 Binary files /dev/null and b/test/reference/operator-clear.quartz.argb32.ref.png differ diff --git a/test/reference/operator-clear.quartz.rgb24.ref.png b/test/reference/operator-clear.quartz.rgb24.ref.png new file mode 100644 index 000000000..a07a6e0af Binary files /dev/null and b/test/reference/operator-clear.quartz.rgb24.ref.png differ diff --git a/test/reference/operator-clear.rgb24.ref.png b/test/reference/operator-clear.rgb24.ref.png new file mode 100644 index 000000000..533b49aa0 Binary files /dev/null and b/test/reference/operator-clear.rgb24.ref.png differ diff --git a/test/reference/operator-clear.svg12.argb32.xfail.png b/test/reference/operator-clear.svg12.argb32.xfail.png new file mode 100644 index 000000000..7dfbd28fa Binary files /dev/null and b/test/reference/operator-clear.svg12.argb32.xfail.png differ diff --git a/test/reference/operator-clear.svg12.rgb24.xfail.png b/test/reference/operator-clear.svg12.rgb24.xfail.png new file mode 100644 index 000000000..c561bc36c Binary files /dev/null and b/test/reference/operator-clear.svg12.rgb24.xfail.png differ diff --git a/test/reference/operator-clear.traps.argb32.ref.png b/test/reference/operator-clear.traps.argb32.ref.png new file mode 100644 index 000000000..c49b4a8d6 Binary files /dev/null and b/test/reference/operator-clear.traps.argb32.ref.png differ diff --git a/test/reference/operator-clear.traps.rgb24.ref.png b/test/reference/operator-clear.traps.rgb24.ref.png new file mode 100644 index 000000000..51d38d134 Binary files /dev/null and b/test/reference/operator-clear.traps.rgb24.ref.png differ diff --git a/test/reference/operator-source.argb32.ref.png b/test/reference/operator-source.argb32.ref.png new file mode 100644 index 000000000..5fd5c43b8 Binary files /dev/null and b/test/reference/operator-source.argb32.ref.png differ diff --git a/test/reference/operator-source.base.argb32.ref.png b/test/reference/operator-source.base.argb32.ref.png new file mode 100644 index 000000000..42e24f24c Binary files /dev/null and b/test/reference/operator-source.base.argb32.ref.png differ diff --git a/test/reference/operator-source.base.rgb24.ref.png b/test/reference/operator-source.base.rgb24.ref.png new file mode 100644 index 000000000..4736d5852 Binary files /dev/null and b/test/reference/operator-source.base.rgb24.ref.png differ diff --git a/test/reference/operator-source.image16.ref.png b/test/reference/operator-source.image16.ref.png new file mode 100644 index 000000000..45562603c Binary files /dev/null and b/test/reference/operator-source.image16.ref.png differ diff --git a/test/reference/operator-source.mask.argb32.ref.png b/test/reference/operator-source.mask.argb32.ref.png new file mode 100644 index 000000000..74ad1dad6 Binary files /dev/null and b/test/reference/operator-source.mask.argb32.ref.png differ diff --git a/test/reference/operator-source.mask.rgb24.ref.png b/test/reference/operator-source.mask.rgb24.ref.png new file mode 100644 index 000000000..c0033562b Binary files /dev/null and b/test/reference/operator-source.mask.rgb24.ref.png differ diff --git a/test/reference/operator-source.rgb24.ref.png b/test/reference/operator-source.rgb24.ref.png new file mode 100644 index 000000000..c7846e5a7 Binary files /dev/null and b/test/reference/operator-source.rgb24.ref.png differ diff --git a/test/reference/operator-source.traps.argb32.ref.png b/test/reference/operator-source.traps.argb32.ref.png new file mode 100644 index 000000000..42e24f24c Binary files /dev/null and b/test/reference/operator-source.traps.argb32.ref.png differ diff --git a/test/reference/operator-source.traps.rgb24.ref.png b/test/reference/operator-source.traps.rgb24.ref.png new file mode 100644 index 000000000..4736d5852 Binary files /dev/null and b/test/reference/operator-source.traps.rgb24.ref.png differ diff --git a/test/reference/operator-source.xlib-fallback.ref.png b/test/reference/operator-source.xlib-fallback.ref.png new file mode 100644 index 000000000..4527ce715 Binary files /dev/null and b/test/reference/operator-source.xlib-fallback.ref.png differ diff --git a/test/reference/operator.argb32.ref.png b/test/reference/operator.argb32.ref.png new file mode 100644 index 000000000..34fce987b Binary files /dev/null and b/test/reference/operator.argb32.ref.png differ diff --git a/test/reference/operator.base.argb32.ref.png b/test/reference/operator.base.argb32.ref.png new file mode 100644 index 000000000..34fce987b Binary files /dev/null and b/test/reference/operator.base.argb32.ref.png differ diff --git a/test/reference/operator.base.rgb24.ref.png b/test/reference/operator.base.rgb24.ref.png new file mode 100644 index 000000000..aa6103df8 Binary files /dev/null and b/test/reference/operator.base.rgb24.ref.png differ diff --git a/test/reference/operator.rgb24.ref.png b/test/reference/operator.rgb24.ref.png new file mode 100644 index 000000000..aa6103df8 Binary files /dev/null and b/test/reference/operator.rgb24.ref.png differ diff --git a/test/reference/operator.svg12.argb32.xfail.png b/test/reference/operator.svg12.argb32.xfail.png new file mode 100644 index 000000000..3996221e7 Binary files /dev/null and b/test/reference/operator.svg12.argb32.xfail.png differ diff --git a/test/reference/operator.svg12.rgb24.xfail.png b/test/reference/operator.svg12.rgb24.xfail.png new file mode 100644 index 000000000..198d4b1c9 Binary files /dev/null and b/test/reference/operator.svg12.rgb24.xfail.png differ diff --git a/test/reference/outline-tolerance.ref.png b/test/reference/outline-tolerance.ref.png new file mode 100644 index 000000000..2733836c9 Binary files /dev/null and b/test/reference/outline-tolerance.ref.png differ diff --git a/test/reference/over-above-source.argb32.ref.png b/test/reference/over-above-source.argb32.ref.png new file mode 100644 index 000000000..479437fa8 Binary files /dev/null and b/test/reference/over-above-source.argb32.ref.png differ diff --git a/test/reference/over-above-source.base.argb32.ref.png b/test/reference/over-above-source.base.argb32.ref.png new file mode 100644 index 000000000..8a0183a6e Binary files /dev/null and b/test/reference/over-above-source.base.argb32.ref.png differ diff --git a/test/reference/over-above-source.base.rgb24.ref.png b/test/reference/over-above-source.base.rgb24.ref.png new file mode 100644 index 000000000..85c19971d Binary files /dev/null and b/test/reference/over-above-source.base.rgb24.ref.png differ diff --git a/test/reference/over-above-source.ps2.argb32.ref.png b/test/reference/over-above-source.ps2.argb32.ref.png new file mode 100644 index 000000000..7c90d0867 Binary files /dev/null and b/test/reference/over-above-source.ps2.argb32.ref.png differ diff --git a/test/reference/over-above-source.ps3.argb32.ref.png b/test/reference/over-above-source.ps3.argb32.ref.png new file mode 100644 index 000000000..7c90d0867 Binary files /dev/null and b/test/reference/over-above-source.ps3.argb32.ref.png differ diff --git a/test/reference/over-above-source.quartz.argb32.ref.png b/test/reference/over-above-source.quartz.argb32.ref.png new file mode 100644 index 000000000..eeb3622b6 Binary files /dev/null and b/test/reference/over-above-source.quartz.argb32.ref.png differ diff --git a/test/reference/over-above-source.quartz.rgb24.ref.png b/test/reference/over-above-source.quartz.rgb24.ref.png new file mode 100644 index 000000000..2ab347653 Binary files /dev/null and b/test/reference/over-above-source.quartz.rgb24.ref.png differ diff --git a/test/reference/over-above-source.rgb24.ref.png b/test/reference/over-above-source.rgb24.ref.png new file mode 100644 index 000000000..6fc2f5248 Binary files /dev/null and b/test/reference/over-above-source.rgb24.ref.png differ diff --git a/test/reference/over-above-source.svg12.rgb24.xfail.png b/test/reference/over-above-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..b2939c24b Binary files /dev/null and b/test/reference/over-above-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/over-above-source.traps.argb32.ref.png b/test/reference/over-above-source.traps.argb32.ref.png new file mode 100644 index 000000000..8a0183a6e Binary files /dev/null and b/test/reference/over-above-source.traps.argb32.ref.png differ diff --git a/test/reference/over-above-source.traps.rgb24.ref.png b/test/reference/over-above-source.traps.rgb24.ref.png new file mode 100644 index 000000000..85c19971d Binary files /dev/null and b/test/reference/over-above-source.traps.rgb24.ref.png differ diff --git a/test/reference/over-around-source.argb32.ref.png b/test/reference/over-around-source.argb32.ref.png new file mode 100644 index 000000000..abc81c771 Binary files /dev/null and b/test/reference/over-around-source.argb32.ref.png differ diff --git a/test/reference/over-around-source.base.argb32.ref.png b/test/reference/over-around-source.base.argb32.ref.png new file mode 100644 index 000000000..fca75056d Binary files /dev/null and b/test/reference/over-around-source.base.argb32.ref.png differ diff --git a/test/reference/over-around-source.base.rgb24.ref.png b/test/reference/over-around-source.base.rgb24.ref.png new file mode 100644 index 000000000..e8dd91d6e Binary files /dev/null and b/test/reference/over-around-source.base.rgb24.ref.png differ diff --git a/test/reference/over-around-source.image16.ref.png b/test/reference/over-around-source.image16.ref.png new file mode 100644 index 000000000..f571b7d1d Binary files /dev/null and b/test/reference/over-around-source.image16.ref.png differ diff --git a/test/reference/over-around-source.pdf.argb32.ref.png b/test/reference/over-around-source.pdf.argb32.ref.png new file mode 100644 index 000000000..da700af73 Binary files /dev/null and b/test/reference/over-around-source.pdf.argb32.ref.png differ diff --git a/test/reference/over-around-source.ps2.argb32.ref.png b/test/reference/over-around-source.ps2.argb32.ref.png new file mode 100644 index 000000000..43917597d Binary files /dev/null and b/test/reference/over-around-source.ps2.argb32.ref.png differ diff --git a/test/reference/over-around-source.ps2.rgb24.ref.png b/test/reference/over-around-source.ps2.rgb24.ref.png new file mode 100644 index 000000000..ee325eab3 Binary files /dev/null and b/test/reference/over-around-source.ps2.rgb24.ref.png differ diff --git a/test/reference/over-around-source.ps3.argb32.ref.png b/test/reference/over-around-source.ps3.argb32.ref.png new file mode 100644 index 000000000..43917597d Binary files /dev/null and b/test/reference/over-around-source.ps3.argb32.ref.png differ diff --git a/test/reference/over-around-source.ps3.rgb24.ref.png b/test/reference/over-around-source.ps3.rgb24.ref.png new file mode 100644 index 000000000..ee325eab3 Binary files /dev/null and b/test/reference/over-around-source.ps3.rgb24.ref.png differ diff --git a/test/reference/over-around-source.quartz.argb32.ref.png b/test/reference/over-around-source.quartz.argb32.ref.png new file mode 100644 index 000000000..26ab8e5cd Binary files /dev/null and b/test/reference/over-around-source.quartz.argb32.ref.png differ diff --git a/test/reference/over-around-source.rgb24.ref.png b/test/reference/over-around-source.rgb24.ref.png new file mode 100644 index 000000000..41ade9574 Binary files /dev/null and b/test/reference/over-around-source.rgb24.ref.png differ diff --git a/test/reference/over-around-source.svg12.argb32.xfail.png b/test/reference/over-around-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..bb29538d1 Binary files /dev/null and b/test/reference/over-around-source.svg12.argb32.xfail.png differ diff --git a/test/reference/over-around-source.svg12.rgb24.xfail.png b/test/reference/over-around-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..bb29538d1 Binary files /dev/null and b/test/reference/over-around-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/over-around-source.traps.argb32.ref.png b/test/reference/over-around-source.traps.argb32.ref.png new file mode 100644 index 000000000..fca75056d Binary files /dev/null and b/test/reference/over-around-source.traps.argb32.ref.png differ diff --git a/test/reference/over-around-source.traps.rgb24.ref.png b/test/reference/over-around-source.traps.rgb24.ref.png new file mode 100644 index 000000000..e8dd91d6e Binary files /dev/null and b/test/reference/over-around-source.traps.rgb24.ref.png differ diff --git a/test/reference/over-below-source.argb32.ref.png b/test/reference/over-below-source.argb32.ref.png new file mode 100644 index 000000000..519160967 Binary files /dev/null and b/test/reference/over-below-source.argb32.ref.png differ diff --git a/test/reference/over-below-source.base.argb32.ref.png b/test/reference/over-below-source.base.argb32.ref.png new file mode 100644 index 000000000..c65936323 Binary files /dev/null and b/test/reference/over-below-source.base.argb32.ref.png differ diff --git a/test/reference/over-below-source.base.rgb24.ref.png b/test/reference/over-below-source.base.rgb24.ref.png new file mode 100644 index 000000000..88a85acbb Binary files /dev/null and b/test/reference/over-below-source.base.rgb24.ref.png differ diff --git a/test/reference/over-below-source.pdf.argb32.ref.png b/test/reference/over-below-source.pdf.argb32.ref.png new file mode 100644 index 000000000..b9c4fe283 Binary files /dev/null and b/test/reference/over-below-source.pdf.argb32.ref.png differ diff --git a/test/reference/over-below-source.ps2.argb32.ref.png b/test/reference/over-below-source.ps2.argb32.ref.png new file mode 100644 index 000000000..c05bda540 Binary files /dev/null and b/test/reference/over-below-source.ps2.argb32.ref.png differ diff --git a/test/reference/over-below-source.ps2.rgb24.ref.png b/test/reference/over-below-source.ps2.rgb24.ref.png new file mode 100644 index 000000000..07e10d464 Binary files /dev/null and b/test/reference/over-below-source.ps2.rgb24.ref.png differ diff --git a/test/reference/over-below-source.ps3.argb32.ref.png b/test/reference/over-below-source.ps3.argb32.ref.png new file mode 100644 index 000000000..c05bda540 Binary files /dev/null and b/test/reference/over-below-source.ps3.argb32.ref.png differ diff --git a/test/reference/over-below-source.ps3.rgb24.ref.png b/test/reference/over-below-source.ps3.rgb24.ref.png new file mode 100644 index 000000000..07e10d464 Binary files /dev/null and b/test/reference/over-below-source.ps3.rgb24.ref.png differ diff --git a/test/reference/over-below-source.rgb24.ref.png b/test/reference/over-below-source.rgb24.ref.png new file mode 100644 index 000000000..20ee671fa Binary files /dev/null and b/test/reference/over-below-source.rgb24.ref.png differ diff --git a/test/reference/over-below-source.svg12.argb32.xfail.png b/test/reference/over-below-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..c80705b7e Binary files /dev/null and b/test/reference/over-below-source.svg12.argb32.xfail.png differ diff --git a/test/reference/over-below-source.svg12.rgb24.xfail.png b/test/reference/over-below-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..c80705b7e Binary files /dev/null and b/test/reference/over-below-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/over-below-source.traps.argb32.ref.png b/test/reference/over-below-source.traps.argb32.ref.png new file mode 100644 index 000000000..c65936323 Binary files /dev/null and b/test/reference/over-below-source.traps.argb32.ref.png differ diff --git a/test/reference/over-below-source.traps.rgb24.ref.png b/test/reference/over-below-source.traps.rgb24.ref.png new file mode 100644 index 000000000..88a85acbb Binary files /dev/null and b/test/reference/over-below-source.traps.rgb24.ref.png differ diff --git a/test/reference/over-between-source.argb32.ref.png b/test/reference/over-between-source.argb32.ref.png new file mode 100644 index 000000000..9ba86f0e4 Binary files /dev/null and b/test/reference/over-between-source.argb32.ref.png differ diff --git a/test/reference/over-between-source.base.argb32.ref.png b/test/reference/over-between-source.base.argb32.ref.png new file mode 100644 index 000000000..a8fe66a30 Binary files /dev/null and b/test/reference/over-between-source.base.argb32.ref.png differ diff --git a/test/reference/over-between-source.base.rgb24.ref.png b/test/reference/over-between-source.base.rgb24.ref.png new file mode 100644 index 000000000..bb77a9b97 Binary files /dev/null and b/test/reference/over-between-source.base.rgb24.ref.png differ diff --git a/test/reference/over-between-source.ps2.argb32.ref.png b/test/reference/over-between-source.ps2.argb32.ref.png new file mode 100644 index 000000000..dd95940ae Binary files /dev/null and b/test/reference/over-between-source.ps2.argb32.ref.png differ diff --git a/test/reference/over-between-source.ps3.argb32.ref.png b/test/reference/over-between-source.ps3.argb32.ref.png new file mode 100644 index 000000000..dd95940ae Binary files /dev/null and b/test/reference/over-between-source.ps3.argb32.ref.png differ diff --git a/test/reference/over-between-source.quartz.argb32.ref.png b/test/reference/over-between-source.quartz.argb32.ref.png new file mode 100644 index 000000000..adb17aee4 Binary files /dev/null and b/test/reference/over-between-source.quartz.argb32.ref.png differ diff --git a/test/reference/over-between-source.rgb24.ref.png b/test/reference/over-between-source.rgb24.ref.png new file mode 100644 index 000000000..b0d31e6f7 Binary files /dev/null and b/test/reference/over-between-source.rgb24.ref.png differ diff --git a/test/reference/over-between-source.svg12.argb32.xfail.png b/test/reference/over-between-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..c80705b7e Binary files /dev/null and b/test/reference/over-between-source.svg12.argb32.xfail.png differ diff --git a/test/reference/over-between-source.svg12.rgb24.xfail.png b/test/reference/over-between-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..c80705b7e Binary files /dev/null and b/test/reference/over-between-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/over-between-source.traps.argb32.ref.png b/test/reference/over-between-source.traps.argb32.ref.png new file mode 100644 index 000000000..a8fe66a30 Binary files /dev/null and b/test/reference/over-between-source.traps.argb32.ref.png differ diff --git a/test/reference/over-between-source.traps.rgb24.ref.png b/test/reference/over-between-source.traps.rgb24.ref.png new file mode 100644 index 000000000..bb77a9b97 Binary files /dev/null and b/test/reference/over-between-source.traps.rgb24.ref.png differ diff --git a/test/reference/overlapping-boxes.base.argb32.ref.png b/test/reference/overlapping-boxes.base.argb32.ref.png new file mode 100644 index 000000000..278e62a84 Binary files /dev/null and b/test/reference/overlapping-boxes.base.argb32.ref.png differ diff --git a/test/reference/overlapping-boxes.base.rgb24.ref.png b/test/reference/overlapping-boxes.base.rgb24.ref.png new file mode 100644 index 000000000..f35d0e6b3 Binary files /dev/null and b/test/reference/overlapping-boxes.base.rgb24.ref.png differ diff --git a/test/reference/overlapping-boxes.ref.png b/test/reference/overlapping-boxes.ref.png new file mode 100644 index 000000000..1c684381f Binary files /dev/null and b/test/reference/overlapping-boxes.ref.png differ diff --git a/test/reference/overlapping-boxes.traps.argb32.ref.png b/test/reference/overlapping-boxes.traps.argb32.ref.png new file mode 100644 index 000000000..278e62a84 Binary files /dev/null and b/test/reference/overlapping-boxes.traps.argb32.ref.png differ diff --git a/test/reference/overlapping-boxes.traps.rgb24.ref.png b/test/reference/overlapping-boxes.traps.rgb24.ref.png new file mode 100644 index 000000000..f35d0e6b3 Binary files /dev/null and b/test/reference/overlapping-boxes.traps.rgb24.ref.png differ diff --git a/test/reference/overlapping-dash-caps.base.argb32.ref.png b/test/reference/overlapping-dash-caps.base.argb32.ref.png new file mode 100644 index 000000000..849a5163f Binary files /dev/null and b/test/reference/overlapping-dash-caps.base.argb32.ref.png differ diff --git a/test/reference/overlapping-dash-caps.base.rgb24.ref.png b/test/reference/overlapping-dash-caps.base.rgb24.ref.png new file mode 100644 index 000000000..849a5163f Binary files /dev/null and b/test/reference/overlapping-dash-caps.base.rgb24.ref.png differ diff --git a/test/reference/overlapping-dash-caps.mask.argb32.ref.png b/test/reference/overlapping-dash-caps.mask.argb32.ref.png new file mode 100644 index 000000000..367d68357 Binary files /dev/null and b/test/reference/overlapping-dash-caps.mask.argb32.ref.png differ diff --git a/test/reference/overlapping-dash-caps.mask.rgb24.ref.png b/test/reference/overlapping-dash-caps.mask.rgb24.ref.png new file mode 100644 index 000000000..367d68357 Binary files /dev/null and b/test/reference/overlapping-dash-caps.mask.rgb24.ref.png differ diff --git a/test/reference/overlapping-dash-caps.ref.png b/test/reference/overlapping-dash-caps.ref.png new file mode 100644 index 000000000..1a2abf738 Binary files /dev/null and b/test/reference/overlapping-dash-caps.ref.png differ diff --git a/test/reference/overlapping-dash-caps.traps.argb32.ref.png b/test/reference/overlapping-dash-caps.traps.argb32.ref.png new file mode 100644 index 000000000..849a5163f Binary files /dev/null and b/test/reference/overlapping-dash-caps.traps.argb32.ref.png differ diff --git a/test/reference/overlapping-dash-caps.traps.rgb24.ref.png b/test/reference/overlapping-dash-caps.traps.rgb24.ref.png new file mode 100644 index 000000000..849a5163f Binary files /dev/null and b/test/reference/overlapping-dash-caps.traps.rgb24.ref.png differ diff --git a/test/reference/overlapping-glyphs.base.argb32.ref.png b/test/reference/overlapping-glyphs.base.argb32.ref.png new file mode 100644 index 000000000..11bf4e111 Binary files /dev/null and b/test/reference/overlapping-glyphs.base.argb32.ref.png differ diff --git a/test/reference/overlapping-glyphs.base.rgb24.ref.png b/test/reference/overlapping-glyphs.base.rgb24.ref.png new file mode 100644 index 000000000..6b6551044 Binary files /dev/null and b/test/reference/overlapping-glyphs.base.rgb24.ref.png differ diff --git a/test/reference/overlapping-glyphs.pdf.argb32.xfail.png b/test/reference/overlapping-glyphs.pdf.argb32.xfail.png new file mode 100644 index 000000000..e3e433727 Binary files /dev/null and b/test/reference/overlapping-glyphs.pdf.argb32.xfail.png differ diff --git a/test/reference/overlapping-glyphs.pdf.rgb24.xfail.png b/test/reference/overlapping-glyphs.pdf.rgb24.xfail.png new file mode 100644 index 000000000..a3f1d7047 Binary files /dev/null and b/test/reference/overlapping-glyphs.pdf.rgb24.xfail.png differ diff --git a/test/reference/overlapping-glyphs.quartz.argb32.ref.png b/test/reference/overlapping-glyphs.quartz.argb32.ref.png new file mode 100644 index 000000000..eaa0cb9c6 Binary files /dev/null and b/test/reference/overlapping-glyphs.quartz.argb32.ref.png differ diff --git a/test/reference/overlapping-glyphs.quartz.rgb24.ref.png b/test/reference/overlapping-glyphs.quartz.rgb24.ref.png new file mode 100644 index 000000000..c2b5fc0ab Binary files /dev/null and b/test/reference/overlapping-glyphs.quartz.rgb24.ref.png differ diff --git a/test/reference/overlapping-glyphs.ref.png b/test/reference/overlapping-glyphs.ref.png new file mode 100644 index 000000000..4ec4ee541 Binary files /dev/null and b/test/reference/overlapping-glyphs.ref.png differ diff --git a/test/reference/overlapping-glyphs.svg.argb32.ref.png b/test/reference/overlapping-glyphs.svg.argb32.ref.png new file mode 100644 index 000000000..ce3849967 Binary files /dev/null and b/test/reference/overlapping-glyphs.svg.argb32.ref.png differ diff --git a/test/reference/overlapping-glyphs.svg.rgb24.ref.png b/test/reference/overlapping-glyphs.svg.rgb24.ref.png new file mode 100644 index 000000000..ce3849967 Binary files /dev/null and b/test/reference/overlapping-glyphs.svg.rgb24.ref.png differ diff --git a/test/reference/overlapping-glyphs.traps.argb32.ref.png b/test/reference/overlapping-glyphs.traps.argb32.ref.png new file mode 100644 index 000000000..11bf4e111 Binary files /dev/null and b/test/reference/overlapping-glyphs.traps.argb32.ref.png differ diff --git a/test/reference/overlapping-glyphs.traps.rgb24.ref.png b/test/reference/overlapping-glyphs.traps.rgb24.ref.png new file mode 100644 index 000000000..6b6551044 Binary files /dev/null and b/test/reference/overlapping-glyphs.traps.rgb24.ref.png differ diff --git a/test/reference/paint-clip-fill-aa.base.argb32.ref.png b/test/reference/paint-clip-fill-aa.base.argb32.ref.png new file mode 100644 index 000000000..768322a39 Binary files /dev/null and b/test/reference/paint-clip-fill-aa.base.argb32.ref.png differ diff --git a/test/reference/paint-clip-fill-aa.base.rgb24.ref.png b/test/reference/paint-clip-fill-aa.base.rgb24.ref.png new file mode 100644 index 000000000..768322a39 Binary files /dev/null and b/test/reference/paint-clip-fill-aa.base.rgb24.ref.png differ diff --git a/test/reference/paint-clip-fill-aa.ref.png b/test/reference/paint-clip-fill-aa.ref.png new file mode 100644 index 000000000..a8cf417b3 Binary files /dev/null and b/test/reference/paint-clip-fill-aa.ref.png differ diff --git a/test/reference/paint-clip-fill-mono.base.argb32.ref.png b/test/reference/paint-clip-fill-mono.base.argb32.ref.png new file mode 100644 index 000000000..768322a39 Binary files /dev/null and b/test/reference/paint-clip-fill-mono.base.argb32.ref.png differ diff --git a/test/reference/paint-clip-fill-mono.base.rgb24.ref.png b/test/reference/paint-clip-fill-mono.base.rgb24.ref.png new file mode 100644 index 000000000..768322a39 Binary files /dev/null and b/test/reference/paint-clip-fill-mono.base.rgb24.ref.png differ diff --git a/test/reference/paint-clip-fill-mono.ref.png b/test/reference/paint-clip-fill-mono.ref.png new file mode 100644 index 000000000..a8cf417b3 Binary files /dev/null and b/test/reference/paint-clip-fill-mono.ref.png differ diff --git a/test/reference/paint-repeat.base.argb32.ref.png b/test/reference/paint-repeat.base.argb32.ref.png new file mode 100644 index 000000000..8cdd9b4be Binary files /dev/null and b/test/reference/paint-repeat.base.argb32.ref.png differ diff --git a/test/reference/paint-repeat.base.rgb24.ref.png b/test/reference/paint-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..8cdd9b4be Binary files /dev/null and b/test/reference/paint-repeat.base.rgb24.ref.png differ diff --git a/test/reference/paint-repeat.ref.png b/test/reference/paint-repeat.ref.png new file mode 100644 index 000000000..2cc48f336 Binary files /dev/null and b/test/reference/paint-repeat.ref.png differ diff --git a/test/reference/paint-source-alpha.base.argb32.ref.png b/test/reference/paint-source-alpha.base.argb32.ref.png new file mode 100644 index 000000000..65d9c179b Binary files /dev/null and b/test/reference/paint-source-alpha.base.argb32.ref.png differ diff --git a/test/reference/paint-source-alpha.base.rgb24.ref.png b/test/reference/paint-source-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..65d9c179b Binary files /dev/null and b/test/reference/paint-source-alpha.base.rgb24.ref.png differ diff --git a/test/reference/paint-source-alpha.image16.ref.png b/test/reference/paint-source-alpha.image16.ref.png new file mode 100644 index 000000000..12bd89d55 Binary files /dev/null and b/test/reference/paint-source-alpha.image16.ref.png differ diff --git a/test/reference/paint-source-alpha.ref.png b/test/reference/paint-source-alpha.ref.png new file mode 100644 index 000000000..548bcd7f3 Binary files /dev/null and b/test/reference/paint-source-alpha.ref.png differ diff --git a/test/reference/paint-source-alpha.svg.ref.png b/test/reference/paint-source-alpha.svg.ref.png new file mode 100644 index 000000000..763bb592b Binary files /dev/null and b/test/reference/paint-source-alpha.svg.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.base.argb32.ref.png b/test/reference/paint-with-alpha-clip-mask.base.argb32.ref.png new file mode 100644 index 000000000..95746ffcb Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.base.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.base.rgb24.ref.png b/test/reference/paint-with-alpha-clip-mask.base.rgb24.ref.png new file mode 100644 index 000000000..95746ffcb Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.base.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.mask.argb32.ref.png b/test/reference/paint-with-alpha-clip-mask.mask.argb32.ref.png new file mode 100644 index 000000000..95746ffcb Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.mask.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.mask.rgb24.ref.png b/test/reference/paint-with-alpha-clip-mask.mask.rgb24.ref.png new file mode 100644 index 000000000..95746ffcb Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.mask.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.ref.png b/test/reference/paint-with-alpha-clip-mask.ref.png new file mode 100644 index 000000000..4ee4c41ac Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.traps.argb32.ref.png b/test/reference/paint-with-alpha-clip-mask.traps.argb32.ref.png new file mode 100644 index 000000000..201bd0d55 Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.traps.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-clip-mask.traps.rgb24.ref.png b/test/reference/paint-with-alpha-clip-mask.traps.rgb24.ref.png new file mode 100644 index 000000000..201bd0d55 Binary files /dev/null and b/test/reference/paint-with-alpha-clip-mask.traps.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.base.argb32.ref.png b/test/reference/paint-with-alpha-clip.base.argb32.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/paint-with-alpha-clip.base.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.base.rgb24.ref.png b/test/reference/paint-with-alpha-clip.base.rgb24.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/paint-with-alpha-clip.base.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.mask.argb32.ref.png b/test/reference/paint-with-alpha-clip.mask.argb32.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/paint-with-alpha-clip.mask.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.mask.rgb24.ref.png b/test/reference/paint-with-alpha-clip.mask.rgb24.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/paint-with-alpha-clip.mask.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.ref.png b/test/reference/paint-with-alpha-clip.ref.png new file mode 100644 index 000000000..4bad4e8ca Binary files /dev/null and b/test/reference/paint-with-alpha-clip.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.traps.argb32.ref.png b/test/reference/paint-with-alpha-clip.traps.argb32.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/paint-with-alpha-clip.traps.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-clip.traps.rgb24.ref.png b/test/reference/paint-with-alpha-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/paint-with-alpha-clip.traps.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-group-clip.ref.png b/test/reference/paint-with-alpha-group-clip.ref.png new file mode 100644 index 000000000..e2dfb063a Binary files /dev/null and b/test/reference/paint-with-alpha-group-clip.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.base.argb32.ref.png b/test/reference/paint-with-alpha-solid-clip.base.argb32.ref.png new file mode 100644 index 000000000..59d226d1a Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.base.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.base.rgb24.ref.png b/test/reference/paint-with-alpha-solid-clip.base.rgb24.ref.png new file mode 100644 index 000000000..59d226d1a Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.base.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.mask.argb32.ref.png b/test/reference/paint-with-alpha-solid-clip.mask.argb32.ref.png new file mode 100644 index 000000000..2cd2df21c Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.mask.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.mask.rgb24.ref.png b/test/reference/paint-with-alpha-solid-clip.mask.rgb24.ref.png new file mode 100644 index 000000000..2cd2df21c Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.mask.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.ref.png b/test/reference/paint-with-alpha-solid-clip.ref.png new file mode 100644 index 000000000..59d226d1a Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.traps.argb32.ref.png b/test/reference/paint-with-alpha-solid-clip.traps.argb32.ref.png new file mode 100644 index 000000000..2cd2df21c Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.traps.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha-solid-clip.traps.rgb24.ref.png b/test/reference/paint-with-alpha-solid-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..2cd2df21c Binary files /dev/null and b/test/reference/paint-with-alpha-solid-clip.traps.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha.base.argb32.ref.png b/test/reference/paint-with-alpha.base.argb32.ref.png new file mode 100644 index 000000000..65d9c179b Binary files /dev/null and b/test/reference/paint-with-alpha.base.argb32.ref.png differ diff --git a/test/reference/paint-with-alpha.base.rgb24.ref.png b/test/reference/paint-with-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..65d9c179b Binary files /dev/null and b/test/reference/paint-with-alpha.base.rgb24.ref.png differ diff --git a/test/reference/paint-with-alpha.image16.ref.png b/test/reference/paint-with-alpha.image16.ref.png new file mode 100644 index 000000000..12bd89d55 Binary files /dev/null and b/test/reference/paint-with-alpha.image16.ref.png differ diff --git a/test/reference/paint-with-alpha.ref.png b/test/reference/paint-with-alpha.ref.png new file mode 100644 index 000000000..ab7ce3e04 Binary files /dev/null and b/test/reference/paint-with-alpha.ref.png differ diff --git a/test/reference/paint-with-alpha.svg.ref.png b/test/reference/paint-with-alpha.svg.ref.png new file mode 100644 index 000000000..c0df8eb72 Binary files /dev/null and b/test/reference/paint-with-alpha.svg.ref.png differ diff --git a/test/reference/paint.base.argb32.ref.png b/test/reference/paint.base.argb32.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/paint.base.argb32.ref.png differ diff --git a/test/reference/paint.base.rgb24.ref.png b/test/reference/paint.base.rgb24.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/paint.base.rgb24.ref.png differ diff --git a/test/reference/paint.ref.png b/test/reference/paint.ref.png new file mode 100644 index 000000000..fff03b363 Binary files /dev/null and b/test/reference/paint.ref.png differ diff --git a/test/reference/partial-clip-text-bottom.base.argb32.ref.png b/test/reference/partial-clip-text-bottom.base.argb32.ref.png new file mode 100644 index 000000000..6a299d48c Binary files /dev/null and b/test/reference/partial-clip-text-bottom.base.argb32.ref.png differ diff --git a/test/reference/partial-clip-text-bottom.base.rgb24.ref.png b/test/reference/partial-clip-text-bottom.base.rgb24.ref.png new file mode 100644 index 000000000..6a299d48c Binary files /dev/null and b/test/reference/partial-clip-text-bottom.base.rgb24.ref.png differ diff --git a/test/reference/partial-clip-text-bottom.ref.png b/test/reference/partial-clip-text-bottom.ref.png new file mode 100644 index 000000000..6a299d48c Binary files /dev/null and b/test/reference/partial-clip-text-bottom.ref.png differ diff --git a/test/reference/partial-clip-text-left.base.argb32.ref.png b/test/reference/partial-clip-text-left.base.argb32.ref.png new file mode 100644 index 000000000..54a1a8586 Binary files /dev/null and b/test/reference/partial-clip-text-left.base.argb32.ref.png differ diff --git a/test/reference/partial-clip-text-left.base.rgb24.ref.png b/test/reference/partial-clip-text-left.base.rgb24.ref.png new file mode 100644 index 000000000..54a1a8586 Binary files /dev/null and b/test/reference/partial-clip-text-left.base.rgb24.ref.png differ diff --git a/test/reference/partial-clip-text-left.ref.png b/test/reference/partial-clip-text-left.ref.png new file mode 100644 index 000000000..54a1a8586 Binary files /dev/null and b/test/reference/partial-clip-text-left.ref.png differ diff --git a/test/reference/partial-clip-text-right.base.argb32.ref.png b/test/reference/partial-clip-text-right.base.argb32.ref.png new file mode 100644 index 000000000..2fbdca038 Binary files /dev/null and b/test/reference/partial-clip-text-right.base.argb32.ref.png differ diff --git a/test/reference/partial-clip-text-right.base.rgb24.ref.png b/test/reference/partial-clip-text-right.base.rgb24.ref.png new file mode 100644 index 000000000..2fbdca038 Binary files /dev/null and b/test/reference/partial-clip-text-right.base.rgb24.ref.png differ diff --git a/test/reference/partial-clip-text-right.ref.png b/test/reference/partial-clip-text-right.ref.png new file mode 100644 index 000000000..2fbdca038 Binary files /dev/null and b/test/reference/partial-clip-text-right.ref.png differ diff --git a/test/reference/partial-clip-text-right.traps.ref.png b/test/reference/partial-clip-text-right.traps.ref.png new file mode 100644 index 000000000..2fbdca038 Binary files /dev/null and b/test/reference/partial-clip-text-right.traps.ref.png differ diff --git a/test/reference/partial-clip-text-top.base.argb32.ref.png b/test/reference/partial-clip-text-top.base.argb32.ref.png new file mode 100644 index 000000000..d18475be3 Binary files /dev/null and b/test/reference/partial-clip-text-top.base.argb32.ref.png differ diff --git a/test/reference/partial-clip-text-top.base.rgb24.ref.png b/test/reference/partial-clip-text-top.base.rgb24.ref.png new file mode 100644 index 000000000..d18475be3 Binary files /dev/null and b/test/reference/partial-clip-text-top.base.rgb24.ref.png differ diff --git a/test/reference/partial-clip-text-top.ps.ref.png b/test/reference/partial-clip-text-top.ps.ref.png new file mode 100644 index 000000000..049bba58f Binary files /dev/null and b/test/reference/partial-clip-text-top.ps.ref.png differ diff --git a/test/reference/partial-clip-text-top.quartz.ref.png b/test/reference/partial-clip-text-top.quartz.ref.png new file mode 100644 index 000000000..33ac283af Binary files /dev/null and b/test/reference/partial-clip-text-top.quartz.ref.png differ diff --git a/test/reference/partial-clip-text-top.ref.png b/test/reference/partial-clip-text-top.ref.png new file mode 100644 index 000000000..d18475be3 Binary files /dev/null and b/test/reference/partial-clip-text-top.ref.png differ diff --git a/test/reference/partial-clip-text-top.svg.ref.png b/test/reference/partial-clip-text-top.svg.ref.png new file mode 100644 index 000000000..dc3fc5869 Binary files /dev/null and b/test/reference/partial-clip-text-top.svg.ref.png differ diff --git a/test/reference/partial-clip-text-top.traps.ref.png b/test/reference/partial-clip-text-top.traps.ref.png new file mode 100644 index 000000000..d18475be3 Binary files /dev/null and b/test/reference/partial-clip-text-top.traps.ref.png differ diff --git a/test/reference/partial-coverage-half-reference.base.argb32.ref.png b/test/reference/partial-coverage-half-reference.base.argb32.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-half-reference.base.argb32.ref.png differ diff --git a/test/reference/partial-coverage-half-reference.base.rgb24.ref.png b/test/reference/partial-coverage-half-reference.base.rgb24.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-half-reference.base.rgb24.ref.png differ diff --git a/test/reference/partial-coverage-half-reference.ref.png b/test/reference/partial-coverage-half-reference.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-half-reference.ref.png differ diff --git a/test/reference/partial-coverage-half-triangles.ref.png b/test/reference/partial-coverage-half-triangles.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-half-triangles.ref.png differ diff --git a/test/reference/partial-coverage-intersecting-quads.ref.png b/test/reference/partial-coverage-intersecting-quads.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-intersecting-quads.ref.png differ diff --git a/test/reference/partial-coverage-intersecting-quads.xfail.png b/test/reference/partial-coverage-intersecting-quads.xfail.png new file mode 100644 index 000000000..a6635b9e8 Binary files /dev/null and b/test/reference/partial-coverage-intersecting-quads.xfail.png differ diff --git a/test/reference/partial-coverage-intersecting-triangles.ref.png b/test/reference/partial-coverage-intersecting-triangles.ref.png new file mode 100644 index 000000000..9e4a6fe42 Binary files /dev/null and b/test/reference/partial-coverage-intersecting-triangles.ref.png differ diff --git a/test/reference/partial-coverage-overlap-half-triangles-eo.ref.png b/test/reference/partial-coverage-overlap-half-triangles-eo.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-overlap-half-triangles-eo.ref.png differ diff --git a/test/reference/partial-coverage-overlap-half-triangles.ref.png b/test/reference/partial-coverage-overlap-half-triangles.ref.png new file mode 100644 index 000000000..17f4ff06b Binary files /dev/null and b/test/reference/partial-coverage-overlap-half-triangles.ref.png differ diff --git a/test/reference/partial-coverage-overlap-three-quarter-triangles.ref.png b/test/reference/partial-coverage-overlap-three-quarter-triangles.ref.png new file mode 100644 index 000000000..ea16dc4bb Binary files /dev/null and b/test/reference/partial-coverage-overlap-three-quarter-triangles.ref.png differ diff --git a/test/reference/partial-coverage-rectangles.ref.png b/test/reference/partial-coverage-rectangles.ref.png new file mode 100644 index 000000000..9e4a6fe42 Binary files /dev/null and b/test/reference/partial-coverage-rectangles.ref.png differ diff --git a/test/reference/partial-coverage-reference.base.argb32.ref.png b/test/reference/partial-coverage-reference.base.argb32.ref.png new file mode 100644 index 000000000..9e4a6fe42 Binary files /dev/null and b/test/reference/partial-coverage-reference.base.argb32.ref.png differ diff --git a/test/reference/partial-coverage-reference.base.rgb24.ref.png b/test/reference/partial-coverage-reference.base.rgb24.ref.png new file mode 100644 index 000000000..9e4a6fe42 Binary files /dev/null and b/test/reference/partial-coverage-reference.base.rgb24.ref.png differ diff --git a/test/reference/partial-coverage-reference.ref.png b/test/reference/partial-coverage-reference.ref.png new file mode 100644 index 000000000..9e4a6fe42 Binary files /dev/null and b/test/reference/partial-coverage-reference.ref.png differ diff --git a/test/reference/partial-coverage-three-quarter-reference.base.argb32.ref.png b/test/reference/partial-coverage-three-quarter-reference.base.argb32.ref.png new file mode 100644 index 000000000..ea16dc4bb Binary files /dev/null and b/test/reference/partial-coverage-three-quarter-reference.base.argb32.ref.png differ diff --git a/test/reference/partial-coverage-three-quarter-reference.base.rgb24.ref.png b/test/reference/partial-coverage-three-quarter-reference.base.rgb24.ref.png new file mode 100644 index 000000000..ea16dc4bb Binary files /dev/null and b/test/reference/partial-coverage-three-quarter-reference.base.rgb24.ref.png differ diff --git a/test/reference/partial-coverage-three-quarter-reference.ref.png b/test/reference/partial-coverage-three-quarter-reference.ref.png new file mode 100644 index 000000000..ea16dc4bb Binary files /dev/null and b/test/reference/partial-coverage-three-quarter-reference.ref.png differ diff --git a/test/reference/partial-coverage-triangles.ref.png b/test/reference/partial-coverage-triangles.ref.png new file mode 100644 index 000000000..9e4a6fe42 Binary files /dev/null and b/test/reference/partial-coverage-triangles.ref.png differ diff --git a/test/reference/pass-through.base.argb32.ref.png b/test/reference/pass-through.base.argb32.ref.png new file mode 100644 index 000000000..058a1920f Binary files /dev/null and b/test/reference/pass-through.base.argb32.ref.png differ diff --git a/test/reference/pass-through.base.rgb24.ref.png b/test/reference/pass-through.base.rgb24.ref.png new file mode 100644 index 000000000..1be631aad Binary files /dev/null and b/test/reference/pass-through.base.rgb24.ref.png differ diff --git a/test/reference/pass-through.ref.png b/test/reference/pass-through.ref.png new file mode 100644 index 000000000..058a1920f Binary files /dev/null and b/test/reference/pass-through.ref.png differ diff --git a/test/reference/path-append.base.argb32.ref.png b/test/reference/path-append.base.argb32.ref.png new file mode 100644 index 000000000..6fb6b2a33 Binary files /dev/null and b/test/reference/path-append.base.argb32.ref.png differ diff --git a/test/reference/path-append.base.rgb24.ref.png b/test/reference/path-append.base.rgb24.ref.png new file mode 100644 index 000000000..6fb6b2a33 Binary files /dev/null and b/test/reference/path-append.base.rgb24.ref.png differ diff --git a/test/reference/path-append.image16.ref.png b/test/reference/path-append.image16.ref.png new file mode 100644 index 000000000..5d939bbc1 Binary files /dev/null and b/test/reference/path-append.image16.ref.png differ diff --git a/test/reference/path-append.ps.ref.png b/test/reference/path-append.ps.ref.png new file mode 100644 index 000000000..2c8df1698 Binary files /dev/null and b/test/reference/path-append.ps.ref.png differ diff --git a/test/reference/path-append.quartz.ref.png b/test/reference/path-append.quartz.ref.png new file mode 100644 index 000000000..665d3ccb9 Binary files /dev/null and b/test/reference/path-append.quartz.ref.png differ diff --git a/test/reference/path-append.ref.png b/test/reference/path-append.ref.png new file mode 100644 index 000000000..33af231bb Binary files /dev/null and b/test/reference/path-append.ref.png differ diff --git a/test/reference/path-append.test-fallback.ref.png b/test/reference/path-append.test-fallback.ref.png new file mode 100644 index 000000000..fa72ac06f Binary files /dev/null and b/test/reference/path-append.test-fallback.ref.png differ diff --git a/test/reference/path-append.traps.argb32.ref.png b/test/reference/path-append.traps.argb32.ref.png new file mode 100644 index 000000000..6fb6b2a33 Binary files /dev/null and b/test/reference/path-append.traps.argb32.ref.png differ diff --git a/test/reference/path-append.traps.rgb24.ref.png b/test/reference/path-append.traps.rgb24.ref.png new file mode 100644 index 000000000..6fb6b2a33 Binary files /dev/null and b/test/reference/path-append.traps.rgb24.ref.png differ diff --git a/test/reference/path-append.xlib-fallback.ref.png b/test/reference/path-append.xlib-fallback.ref.png new file mode 100644 index 000000000..d34cce125 Binary files /dev/null and b/test/reference/path-append.xlib-fallback.ref.png differ diff --git a/test/reference/path-stroke-twice.base.argb32.ref.png b/test/reference/path-stroke-twice.base.argb32.ref.png new file mode 100644 index 000000000..48dd2c7c6 Binary files /dev/null and b/test/reference/path-stroke-twice.base.argb32.ref.png differ diff --git a/test/reference/path-stroke-twice.base.rgb24.ref.png b/test/reference/path-stroke-twice.base.rgb24.ref.png new file mode 100644 index 000000000..48dd2c7c6 Binary files /dev/null and b/test/reference/path-stroke-twice.base.rgb24.ref.png differ diff --git a/test/reference/path-stroke-twice.image16.ref.png b/test/reference/path-stroke-twice.image16.ref.png new file mode 100644 index 000000000..9f162adf3 Binary files /dev/null and b/test/reference/path-stroke-twice.image16.ref.png differ diff --git a/test/reference/path-stroke-twice.ps.ref.png b/test/reference/path-stroke-twice.ps.ref.png new file mode 100644 index 000000000..23e814743 Binary files /dev/null and b/test/reference/path-stroke-twice.ps.ref.png differ diff --git a/test/reference/path-stroke-twice.ref.png b/test/reference/path-stroke-twice.ref.png new file mode 100644 index 000000000..743c6ce52 Binary files /dev/null and b/test/reference/path-stroke-twice.ref.png differ diff --git a/test/reference/path-stroke-twice.traps.argb32.ref.png b/test/reference/path-stroke-twice.traps.argb32.ref.png new file mode 100644 index 000000000..48dd2c7c6 Binary files /dev/null and b/test/reference/path-stroke-twice.traps.argb32.ref.png differ diff --git a/test/reference/path-stroke-twice.traps.rgb24.ref.png b/test/reference/path-stroke-twice.traps.rgb24.ref.png new file mode 100644 index 000000000..48dd2c7c6 Binary files /dev/null and b/test/reference/path-stroke-twice.traps.rgb24.ref.png differ diff --git a/test/reference/pattern-getters.base.argb32.ref.png b/test/reference/pattern-getters.base.argb32.ref.png new file mode 100644 index 000000000..3cc39a8be Binary files /dev/null and b/test/reference/pattern-getters.base.argb32.ref.png differ diff --git a/test/reference/pattern-getters.base.rgb24.ref.png b/test/reference/pattern-getters.base.rgb24.ref.png new file mode 100644 index 000000000..3cc39a8be Binary files /dev/null and b/test/reference/pattern-getters.base.rgb24.ref.png differ diff --git a/test/reference/pattern-getters.ref.png b/test/reference/pattern-getters.ref.png new file mode 100644 index 000000000..80304b0ec Binary files /dev/null and b/test/reference/pattern-getters.ref.png differ diff --git a/test/reference/pdf-isolated-group.base.argb32.ref.png b/test/reference/pdf-isolated-group.base.argb32.ref.png new file mode 100644 index 000000000..6c8522ccc Binary files /dev/null and b/test/reference/pdf-isolated-group.base.argb32.ref.png differ diff --git a/test/reference/pdf-isolated-group.base.rgb24.ref.png b/test/reference/pdf-isolated-group.base.rgb24.ref.png new file mode 100644 index 000000000..6c8522ccc Binary files /dev/null and b/test/reference/pdf-isolated-group.base.rgb24.ref.png differ diff --git a/test/reference/pdf-isolated-group.ref.png b/test/reference/pdf-isolated-group.ref.png new file mode 100644 index 000000000..6c8522ccc Binary files /dev/null and b/test/reference/pdf-isolated-group.ref.png differ diff --git a/test/reference/pdf-surface-source.base.argb32.ref.png b/test/reference/pdf-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/pdf-surface-source.base.argb32.ref.png differ diff --git a/test/reference/pdf-surface-source.base.rgb24.ref.png b/test/reference/pdf-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/pdf-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/pdf-surface-source.image16.ref.png b/test/reference/pdf-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/pdf-surface-source.image16.ref.png differ diff --git a/test/reference/pdf-surface-source.ref.png b/test/reference/pdf-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/pdf-surface-source.ref.png differ diff --git a/test/reference/pdf-surface-source.svg12.argb32.xfail.png b/test/reference/pdf-surface-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/pdf-surface-source.svg12.argb32.xfail.png differ diff --git a/test/reference/pdf-surface-source.svg12.rgb24.xfail.png b/test/reference/pdf-surface-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/pdf-surface-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/pixman-downscale-best-24.ref.png b/test/reference/pixman-downscale-best-24.ref.png new file mode 100644 index 000000000..df0f9c0d8 Binary files /dev/null and b/test/reference/pixman-downscale-best-24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.image.rgb24.ref.png b/test/reference/pixman-downscale-best-95.image.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.image.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.image16.rgb24.ref.png b/test/reference/pixman-downscale-best-95.image16.rgb24.ref.png new file mode 100644 index 000000000..37783991d Binary files /dev/null and b/test/reference/pixman-downscale-best-95.image16.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.pdf.ref.png b/test/reference/pixman-downscale-best-95.pdf.ref.png new file mode 100644 index 000000000..71b518e1e Binary files /dev/null and b/test/reference/pixman-downscale-best-95.pdf.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.ps2.ref.png b/test/reference/pixman-downscale-best-95.ps2.ref.png new file mode 100644 index 000000000..08983dca6 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.ps2.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.ps3.ref.png b/test/reference/pixman-downscale-best-95.ps3.ref.png new file mode 100644 index 000000000..08983dca6 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.ps3.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.recording.rgb24.ref.png b/test/reference/pixman-downscale-best-95.recording.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.recording.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.ref.png b/test/reference/pixman-downscale-best-95.ref.png new file mode 100644 index 000000000..1b98e8f63 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.script.ref.png b/test/reference/pixman-downscale-best-95.script.ref.png new file mode 100644 index 000000000..f3bd7ff81 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.script.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.svg11.ref.png b/test/reference/pixman-downscale-best-95.svg11.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.svg11.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.svg12.ref.png b/test/reference/pixman-downscale-best-95.svg12.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.svg12.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.test-base.rgb24.ref.png b/test/reference/pixman-downscale-best-95.test-base.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.test-base.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.test-fallback.rgb24.ref.png b/test/reference/pixman-downscale-best-95.test-fallback.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.test-fallback.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.test-mask.rgb24.ref.png b/test/reference/pixman-downscale-best-95.test-mask.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.test-mask.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.test-paginated.rgb24.ref.png b/test/reference/pixman-downscale-best-95.test-paginated.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.test-paginated.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.test-spans.rgb24.ref.png b/test/reference/pixman-downscale-best-95.test-spans.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.test-spans.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.test-traps.rgb24.ref.png b/test/reference/pixman-downscale-best-95.test-traps.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.test-traps.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xcb-fallback.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xcb-fallback.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xcb-fallback.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xcb-render-0_0.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xcb-render-0_0.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xcb-render-0_0.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xcb-window&.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xcb-window&.rgb24.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xcb-window&.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xcb-window.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xcb-window.rgb24.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xcb-window.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xcb.ref.png b/test/reference/pixman-downscale-best-95.xcb.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xcb.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xlib-fallback.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xlib-render-0_0.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xlib-render-0_0.rgb24.ref.png new file mode 100644 index 000000000..5885c4bcc Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xlib-render-0_0.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xlib-window.rgb24.ref.png b/test/reference/pixman-downscale-best-95.xlib-window.rgb24.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xlib-window.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-best-95.xlib.ref.png b/test/reference/pixman-downscale-best-95.xlib.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-best-95.xlib.ref.png differ diff --git a/test/reference/pixman-downscale-best-96.ref.png b/test/reference/pixman-downscale-best-96.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/pixman-downscale-best-96.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-24.ref.png b/test/reference/pixman-downscale-bilinear-24.ref.png new file mode 100644 index 000000000..df0f9c0d8 Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-24.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-95.image16.rgb24.ref.png b/test/reference/pixman-downscale-bilinear-95.image16.rgb24.ref.png new file mode 100644 index 000000000..9d67251e2 Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-95.image16.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-95.pdf.ref.png b/test/reference/pixman-downscale-bilinear-95.pdf.ref.png new file mode 100644 index 000000000..71b518e1e Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-95.pdf.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-95.ps2.ref.png b/test/reference/pixman-downscale-bilinear-95.ps2.ref.png new file mode 100644 index 000000000..08983dca6 Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-95.ps2.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-95.ps3.ref.png b/test/reference/pixman-downscale-bilinear-95.ps3.ref.png new file mode 100644 index 000000000..08983dca6 Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-95.ps3.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-95.ref.png b/test/reference/pixman-downscale-bilinear-95.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-95.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-95.script.ref.png b/test/reference/pixman-downscale-bilinear-95.script.ref.png new file mode 100644 index 000000000..fa4c04c02 Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-95.script.ref.png differ diff --git a/test/reference/pixman-downscale-bilinear-96.ref.png b/test/reference/pixman-downscale-bilinear-96.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/pixman-downscale-bilinear-96.ref.png differ diff --git a/test/reference/pixman-downscale-fast-24.ref.png b/test/reference/pixman-downscale-fast-24.ref.png new file mode 100644 index 000000000..df0f9c0d8 Binary files /dev/null and b/test/reference/pixman-downscale-fast-24.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.image16.rgb24.ref.png b/test/reference/pixman-downscale-fast-95.image16.rgb24.ref.png new file mode 100644 index 000000000..a2b67156f Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.image16.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.pdf.ref.png b/test/reference/pixman-downscale-fast-95.pdf.ref.png new file mode 100644 index 000000000..71b518e1e Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.pdf.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.ps2.ref.png b/test/reference/pixman-downscale-fast-95.ps2.ref.png new file mode 100644 index 000000000..af93ae72d Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.ps2.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.ps3.ref.png b/test/reference/pixman-downscale-fast-95.ps3.ref.png new file mode 100644 index 000000000..af93ae72d Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.ps3.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.ref.png b/test/reference/pixman-downscale-fast-95.ref.png new file mode 100644 index 000000000..3340423fc Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.svg11.ref.png b/test/reference/pixman-downscale-fast-95.svg11.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.svg11.ref.png differ diff --git a/test/reference/pixman-downscale-fast-95.svg12.ref.png b/test/reference/pixman-downscale-fast-95.svg12.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-fast-95.svg12.ref.png differ diff --git a/test/reference/pixman-downscale-fast-96.ref.png b/test/reference/pixman-downscale-fast-96.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/pixman-downscale-fast-96.ref.png differ diff --git a/test/reference/pixman-downscale-good-24.ref.png b/test/reference/pixman-downscale-good-24.ref.png new file mode 100644 index 000000000..df0f9c0d8 Binary files /dev/null and b/test/reference/pixman-downscale-good-24.ref.png differ diff --git a/test/reference/pixman-downscale-good-95.image16.rgb24.ref.png b/test/reference/pixman-downscale-good-95.image16.rgb24.ref.png new file mode 100644 index 000000000..9d67251e2 Binary files /dev/null and b/test/reference/pixman-downscale-good-95.image16.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-good-95.pdf.ref.png b/test/reference/pixman-downscale-good-95.pdf.ref.png new file mode 100644 index 000000000..71b518e1e Binary files /dev/null and b/test/reference/pixman-downscale-good-95.pdf.ref.png differ diff --git a/test/reference/pixman-downscale-good-95.ps2.ref.png b/test/reference/pixman-downscale-good-95.ps2.ref.png new file mode 100644 index 000000000..08983dca6 Binary files /dev/null and b/test/reference/pixman-downscale-good-95.ps2.ref.png differ diff --git a/test/reference/pixman-downscale-good-95.ps3.ref.png b/test/reference/pixman-downscale-good-95.ps3.ref.png new file mode 100644 index 000000000..08983dca6 Binary files /dev/null and b/test/reference/pixman-downscale-good-95.ps3.ref.png differ diff --git a/test/reference/pixman-downscale-good-95.ref.png b/test/reference/pixman-downscale-good-95.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-good-95.ref.png differ diff --git a/test/reference/pixman-downscale-good-95.script.ref.png b/test/reference/pixman-downscale-good-95.script.ref.png new file mode 100644 index 000000000..fa4c04c02 Binary files /dev/null and b/test/reference/pixman-downscale-good-95.script.ref.png differ diff --git a/test/reference/pixman-downscale-good-96.ref.png b/test/reference/pixman-downscale-good-96.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/pixman-downscale-good-96.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-24.ref.png b/test/reference/pixman-downscale-nearest-24.ref.png new file mode 100644 index 000000000..df0f9c0d8 Binary files /dev/null and b/test/reference/pixman-downscale-nearest-24.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.image16.rgb24.ref.png b/test/reference/pixman-downscale-nearest-95.image16.rgb24.ref.png new file mode 100644 index 000000000..a2b67156f Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.image16.rgb24.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.pdf.ref.png b/test/reference/pixman-downscale-nearest-95.pdf.ref.png new file mode 100644 index 000000000..71b518e1e Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.pdf.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.ps2.ref.png b/test/reference/pixman-downscale-nearest-95.ps2.ref.png new file mode 100644 index 000000000..af93ae72d Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.ps2.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.ps3.ref.png b/test/reference/pixman-downscale-nearest-95.ps3.ref.png new file mode 100644 index 000000000..af93ae72d Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.ps3.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.ref.png b/test/reference/pixman-downscale-nearest-95.ref.png new file mode 100644 index 000000000..3340423fc Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.svg11.ref.png b/test/reference/pixman-downscale-nearest-95.svg11.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.svg11.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-95.svg12.ref.png b/test/reference/pixman-downscale-nearest-95.svg12.ref.png new file mode 100644 index 000000000..777f448e3 Binary files /dev/null and b/test/reference/pixman-downscale-nearest-95.svg12.ref.png differ diff --git a/test/reference/pixman-downscale-nearest-96.ref.png b/test/reference/pixman-downscale-nearest-96.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/pixman-downscale-nearest-96.ref.png differ diff --git a/test/reference/pixman-rotate.base.argb32.ref.png b/test/reference/pixman-rotate.base.argb32.ref.png new file mode 100644 index 000000000..7e47a4d8f Binary files /dev/null and b/test/reference/pixman-rotate.base.argb32.ref.png differ diff --git a/test/reference/pixman-rotate.base.rgb24.ref.png b/test/reference/pixman-rotate.base.rgb24.ref.png new file mode 100644 index 000000000..397acbe7e Binary files /dev/null and b/test/reference/pixman-rotate.base.rgb24.ref.png differ diff --git a/test/reference/pixman-rotate.ps.argb32.ref.png b/test/reference/pixman-rotate.ps.argb32.ref.png new file mode 100644 index 000000000..0e916883d Binary files /dev/null and b/test/reference/pixman-rotate.ps.argb32.ref.png differ diff --git a/test/reference/pixman-rotate.ref.png b/test/reference/pixman-rotate.ref.png new file mode 100644 index 000000000..7e47a4d8f Binary files /dev/null and b/test/reference/pixman-rotate.ref.png differ diff --git a/test/reference/ps-eps.ref.png b/test/reference/ps-eps.ref.png new file mode 100644 index 000000000..9aadb0887 Binary files /dev/null and b/test/reference/ps-eps.ref.png differ diff --git a/test/reference/ps-surface-source.base.argb32.ref.png b/test/reference/ps-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/ps-surface-source.base.argb32.ref.png differ diff --git a/test/reference/ps-surface-source.base.rgb24.ref.png b/test/reference/ps-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/ps-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/ps-surface-source.image16.ref.png b/test/reference/ps-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/ps-surface-source.image16.ref.png differ diff --git a/test/reference/ps-surface-source.ref.png b/test/reference/ps-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/ps-surface-source.ref.png differ diff --git a/test/reference/ps-surface-source.svg12.argb32.xfail.png b/test/reference/ps-surface-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/ps-surface-source.svg12.argb32.xfail.png differ diff --git a/test/reference/ps-surface-source.svg12.rgb24.xfail.png b/test/reference/ps-surface-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/ps-surface-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/pthread-same-source.image16.ref.png b/test/reference/pthread-same-source.image16.ref.png new file mode 100644 index 000000000..67eb22f9d Binary files /dev/null and b/test/reference/pthread-same-source.image16.ref.png differ diff --git a/test/reference/pthread-same-source.quartz.xfail.png b/test/reference/pthread-same-source.quartz.xfail.png new file mode 100644 index 000000000..ffed61998 Binary files /dev/null and b/test/reference/pthread-same-source.quartz.xfail.png differ diff --git a/test/reference/pthread-same-source.ref.png b/test/reference/pthread-same-source.ref.png new file mode 100644 index 000000000..c1c186b9b Binary files /dev/null and b/test/reference/pthread-same-source.ref.png differ diff --git a/test/reference/pthread-show-text.base.argb32.ref.png b/test/reference/pthread-show-text.base.argb32.ref.png new file mode 100644 index 000000000..90d0af349 Binary files /dev/null and b/test/reference/pthread-show-text.base.argb32.ref.png differ diff --git a/test/reference/pthread-show-text.base.rgb24.ref.png b/test/reference/pthread-show-text.base.rgb24.ref.png new file mode 100644 index 000000000..90d0af349 Binary files /dev/null and b/test/reference/pthread-show-text.base.rgb24.ref.png differ diff --git a/test/reference/pthread-show-text.image16.ref.png b/test/reference/pthread-show-text.image16.ref.png new file mode 100644 index 000000000..a1d1af57c Binary files /dev/null and b/test/reference/pthread-show-text.image16.ref.png differ diff --git a/test/reference/pthread-show-text.pdf.ref.png b/test/reference/pthread-show-text.pdf.ref.png new file mode 100644 index 000000000..bb72fc27b Binary files /dev/null and b/test/reference/pthread-show-text.pdf.ref.png differ diff --git a/test/reference/pthread-show-text.ps.ref.png b/test/reference/pthread-show-text.ps.ref.png new file mode 100644 index 000000000..807b73ff3 Binary files /dev/null and b/test/reference/pthread-show-text.ps.ref.png differ diff --git a/test/reference/pthread-show-text.quartz.ref.png b/test/reference/pthread-show-text.quartz.ref.png new file mode 100644 index 000000000..cc9bb25dc Binary files /dev/null and b/test/reference/pthread-show-text.quartz.ref.png differ diff --git a/test/reference/pthread-show-text.ref.png b/test/reference/pthread-show-text.ref.png new file mode 100644 index 000000000..90d0af349 Binary files /dev/null and b/test/reference/pthread-show-text.ref.png differ diff --git a/test/reference/pthread-show-text.traps.ref.png b/test/reference/pthread-show-text.traps.ref.png new file mode 100644 index 000000000..90d0af349 Binary files /dev/null and b/test/reference/pthread-show-text.traps.ref.png differ diff --git a/test/reference/pthread-show-text.xlib-fallback.ref.png b/test/reference/pthread-show-text.xlib-fallback.ref.png new file mode 100644 index 000000000..d96abed47 Binary files /dev/null and b/test/reference/pthread-show-text.xlib-fallback.ref.png differ diff --git a/test/reference/pthread-similar.base.argb32.ref.png b/test/reference/pthread-similar.base.argb32.ref.png new file mode 100644 index 000000000..a22210db8 Binary files /dev/null and b/test/reference/pthread-similar.base.argb32.ref.png differ diff --git a/test/reference/pthread-similar.base.rgb24.ref.png b/test/reference/pthread-similar.base.rgb24.ref.png new file mode 100644 index 000000000..a22210db8 Binary files /dev/null and b/test/reference/pthread-similar.base.rgb24.ref.png differ diff --git a/test/reference/pthread-similar.ref.png b/test/reference/pthread-similar.ref.png new file mode 100644 index 000000000..c8763ba0e Binary files /dev/null and b/test/reference/pthread-similar.ref.png differ diff --git a/test/reference/push-group-color.base.argb32.ref.png b/test/reference/push-group-color.base.argb32.ref.png new file mode 100644 index 000000000..11b1014e0 Binary files /dev/null and b/test/reference/push-group-color.base.argb32.ref.png differ diff --git a/test/reference/push-group-color.base.rgb24.ref.png b/test/reference/push-group-color.base.rgb24.ref.png new file mode 100644 index 000000000..11b1014e0 Binary files /dev/null and b/test/reference/push-group-color.base.rgb24.ref.png differ diff --git a/test/reference/push-group-color.image16.ref.png b/test/reference/push-group-color.image16.ref.png new file mode 100644 index 000000000..6378b75ad Binary files /dev/null and b/test/reference/push-group-color.image16.ref.png differ diff --git a/test/reference/push-group-color.ps2.ref.png b/test/reference/push-group-color.ps2.ref.png new file mode 100644 index 000000000..daf827ee3 Binary files /dev/null and b/test/reference/push-group-color.ps2.ref.png differ diff --git a/test/reference/push-group-color.ps3.ref.png b/test/reference/push-group-color.ps3.ref.png new file mode 100644 index 000000000..291fcec8d Binary files /dev/null and b/test/reference/push-group-color.ps3.ref.png differ diff --git a/test/reference/push-group-color.quartz.ref.png b/test/reference/push-group-color.quartz.ref.png new file mode 100644 index 000000000..bca7c5693 Binary files /dev/null and b/test/reference/push-group-color.quartz.ref.png differ diff --git a/test/reference/push-group-color.ref.png b/test/reference/push-group-color.ref.png new file mode 100644 index 000000000..a2842b092 Binary files /dev/null and b/test/reference/push-group-color.ref.png differ diff --git a/test/reference/push-group-color.traps.argb32.ref.png b/test/reference/push-group-color.traps.argb32.ref.png new file mode 100644 index 000000000..11b1014e0 Binary files /dev/null and b/test/reference/push-group-color.traps.argb32.ref.png differ diff --git a/test/reference/push-group-color.traps.rgb24.ref.png b/test/reference/push-group-color.traps.rgb24.ref.png new file mode 100644 index 000000000..11b1014e0 Binary files /dev/null and b/test/reference/push-group-color.traps.rgb24.ref.png differ diff --git a/test/reference/push-group-path-offset.base.argb32.ref.png b/test/reference/push-group-path-offset.base.argb32.ref.png new file mode 100644 index 000000000..b836a9197 Binary files /dev/null and b/test/reference/push-group-path-offset.base.argb32.ref.png differ diff --git a/test/reference/push-group-path-offset.base.rgb24.ref.png b/test/reference/push-group-path-offset.base.rgb24.ref.png new file mode 100644 index 000000000..b836a9197 Binary files /dev/null and b/test/reference/push-group-path-offset.base.rgb24.ref.png differ diff --git a/test/reference/push-group-path-offset.ref.png b/test/reference/push-group-path-offset.ref.png new file mode 100644 index 000000000..b836a9197 Binary files /dev/null and b/test/reference/push-group-path-offset.ref.png differ diff --git a/test/reference/push-group.argb32.ref.png b/test/reference/push-group.argb32.ref.png new file mode 100644 index 000000000..28dcf0c27 Binary files /dev/null and b/test/reference/push-group.argb32.ref.png differ diff --git a/test/reference/push-group.base.argb32.ref.png b/test/reference/push-group.base.argb32.ref.png new file mode 100644 index 000000000..9d27f4508 Binary files /dev/null and b/test/reference/push-group.base.argb32.ref.png differ diff --git a/test/reference/push-group.base.rgb24.ref.png b/test/reference/push-group.base.rgb24.ref.png new file mode 100644 index 000000000..e19694f02 Binary files /dev/null and b/test/reference/push-group.base.rgb24.ref.png differ diff --git a/test/reference/push-group.image16.ref.png b/test/reference/push-group.image16.ref.png new file mode 100644 index 000000000..999040583 Binary files /dev/null and b/test/reference/push-group.image16.ref.png differ diff --git a/test/reference/push-group.quartz.argb32.ref.png b/test/reference/push-group.quartz.argb32.ref.png new file mode 100644 index 000000000..b3867b98a Binary files /dev/null and b/test/reference/push-group.quartz.argb32.ref.png differ diff --git a/test/reference/push-group.quartz.rgb24.ref.png b/test/reference/push-group.quartz.rgb24.ref.png new file mode 100644 index 000000000..1fd6ef321 Binary files /dev/null and b/test/reference/push-group.quartz.rgb24.ref.png differ diff --git a/test/reference/push-group.rgb24.ref.png b/test/reference/push-group.rgb24.ref.png new file mode 100644 index 000000000..ca6706821 Binary files /dev/null and b/test/reference/push-group.rgb24.ref.png differ diff --git a/test/reference/push-group.traps.argb32.ref.png b/test/reference/push-group.traps.argb32.ref.png new file mode 100644 index 000000000..9d27f4508 Binary files /dev/null and b/test/reference/push-group.traps.argb32.ref.png differ diff --git a/test/reference/push-group.traps.rgb24.ref.png b/test/reference/push-group.traps.rgb24.ref.png new file mode 100644 index 000000000..e19694f02 Binary files /dev/null and b/test/reference/push-group.traps.rgb24.ref.png differ diff --git a/test/reference/quartz-surface-source.ps2.ref.png b/test/reference/quartz-surface-source.ps2.ref.png new file mode 100644 index 000000000..10231581b Binary files /dev/null and b/test/reference/quartz-surface-source.ps2.ref.png differ diff --git a/test/reference/quartz-surface-source.ps3.ref.png b/test/reference/quartz-surface-source.ps3.ref.png new file mode 100644 index 000000000..10231581b Binary files /dev/null and b/test/reference/quartz-surface-source.ps3.ref.png differ diff --git a/test/reference/quartz-surface-source.ref.png b/test/reference/quartz-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/quartz-surface-source.ref.png differ diff --git a/test/reference/radial-gradient-extend.base.argb32.ref.png b/test/reference/radial-gradient-extend.base.argb32.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.base.argb32.ref.png differ diff --git a/test/reference/radial-gradient-extend.base.rgb24.ref.png b/test/reference/radial-gradient-extend.base.rgb24.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.base.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-extend.mask.argb32.ref.png b/test/reference/radial-gradient-extend.mask.argb32.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.mask.argb32.ref.png differ diff --git a/test/reference/radial-gradient-extend.mask.rgb24.ref.png b/test/reference/radial-gradient-extend.mask.rgb24.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.mask.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-extend.ps3.ref.png b/test/reference/radial-gradient-extend.ps3.ref.png new file mode 100644 index 000000000..e84041eae Binary files /dev/null and b/test/reference/radial-gradient-extend.ps3.ref.png differ diff --git a/test/reference/radial-gradient-extend.ref.png b/test/reference/radial-gradient-extend.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.ref.png differ diff --git a/test/reference/radial-gradient-extend.traps.argb32.ref.png b/test/reference/radial-gradient-extend.traps.argb32.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.traps.argb32.ref.png differ diff --git a/test/reference/radial-gradient-extend.traps.rgb24.ref.png b/test/reference/radial-gradient-extend.traps.rgb24.ref.png new file mode 100644 index 000000000..3d7de5e56 Binary files /dev/null and b/test/reference/radial-gradient-extend.traps.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.argb32.ref.png b/test/reference/radial-gradient-mask-source.argb32.ref.png new file mode 100644 index 000000000..2bf65b3d6 Binary files /dev/null and b/test/reference/radial-gradient-mask-source.argb32.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.base.argb32.ref.png b/test/reference/radial-gradient-mask-source.base.argb32.ref.png new file mode 100644 index 000000000..2bf65b3d6 Binary files /dev/null and b/test/reference/radial-gradient-mask-source.base.argb32.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.base.rgb24.ref.png b/test/reference/radial-gradient-mask-source.base.rgb24.ref.png new file mode 100644 index 000000000..55335196a Binary files /dev/null and b/test/reference/radial-gradient-mask-source.base.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.image16.ref.png b/test/reference/radial-gradient-mask-source.image16.ref.png new file mode 100644 index 000000000..edb93a986 Binary files /dev/null and b/test/reference/radial-gradient-mask-source.image16.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.mask.rgb24.ref.png b/test/reference/radial-gradient-mask-source.mask.rgb24.ref.png new file mode 100644 index 000000000..55335196a Binary files /dev/null and b/test/reference/radial-gradient-mask-source.mask.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.quartz.argb32.ref.png b/test/reference/radial-gradient-mask-source.quartz.argb32.ref.png new file mode 100644 index 000000000..5f734f612 Binary files /dev/null and b/test/reference/radial-gradient-mask-source.quartz.argb32.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.quartz.rgb24.ref.png b/test/reference/radial-gradient-mask-source.quartz.rgb24.ref.png new file mode 100644 index 000000000..4ae71f753 Binary files /dev/null and b/test/reference/radial-gradient-mask-source.quartz.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-mask-source.traps.rgb24.ref.png b/test/reference/radial-gradient-mask-source.traps.rgb24.ref.png new file mode 100644 index 000000000..55335196a Binary files /dev/null and b/test/reference/radial-gradient-mask-source.traps.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-mask.base.argb32.ref.png b/test/reference/radial-gradient-mask.base.argb32.ref.png new file mode 100644 index 000000000..4db39aa3f Binary files /dev/null and b/test/reference/radial-gradient-mask.base.argb32.ref.png differ diff --git a/test/reference/radial-gradient-mask.base.rgb24.ref.png b/test/reference/radial-gradient-mask.base.rgb24.ref.png new file mode 100644 index 000000000..4db39aa3f Binary files /dev/null and b/test/reference/radial-gradient-mask.base.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-mask.image16.ref.png b/test/reference/radial-gradient-mask.image16.ref.png new file mode 100644 index 000000000..78712ca52 Binary files /dev/null and b/test/reference/radial-gradient-mask.image16.ref.png differ diff --git a/test/reference/radial-gradient-mask.quartz.ref.png b/test/reference/radial-gradient-mask.quartz.ref.png new file mode 100644 index 000000000..c1bd50686 Binary files /dev/null and b/test/reference/radial-gradient-mask.quartz.ref.png differ diff --git a/test/reference/radial-gradient-mask.ref.png b/test/reference/radial-gradient-mask.ref.png new file mode 100644 index 000000000..4db39aa3f Binary files /dev/null and b/test/reference/radial-gradient-mask.ref.png differ diff --git a/test/reference/radial-gradient-one-stop.base.argb32.ref.png b/test/reference/radial-gradient-one-stop.base.argb32.ref.png new file mode 100644 index 000000000..fb35be61d Binary files /dev/null and b/test/reference/radial-gradient-one-stop.base.argb32.ref.png differ diff --git a/test/reference/radial-gradient-one-stop.base.rgb24.ref.png b/test/reference/radial-gradient-one-stop.base.rgb24.ref.png new file mode 100644 index 000000000..fb35be61d Binary files /dev/null and b/test/reference/radial-gradient-one-stop.base.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-one-stop.quartz.ref.png b/test/reference/radial-gradient-one-stop.quartz.ref.png new file mode 100644 index 000000000..da991b1bd Binary files /dev/null and b/test/reference/radial-gradient-one-stop.quartz.ref.png differ diff --git a/test/reference/radial-gradient-one-stop.ref.png b/test/reference/radial-gradient-one-stop.ref.png new file mode 100644 index 000000000..fb35be61d Binary files /dev/null and b/test/reference/radial-gradient-one-stop.ref.png differ diff --git a/test/reference/radial-gradient-source.base.argb32.ref.png b/test/reference/radial-gradient-source.base.argb32.ref.png new file mode 100644 index 000000000..4ab4796fa Binary files /dev/null and b/test/reference/radial-gradient-source.base.argb32.ref.png differ diff --git a/test/reference/radial-gradient-source.base.rgb24.ref.png b/test/reference/radial-gradient-source.base.rgb24.ref.png new file mode 100644 index 000000000..afaa24118 Binary files /dev/null and b/test/reference/radial-gradient-source.base.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-source.image16.ref.png b/test/reference/radial-gradient-source.image16.ref.png new file mode 100644 index 000000000..f992b6f39 Binary files /dev/null and b/test/reference/radial-gradient-source.image16.ref.png differ diff --git a/test/reference/radial-gradient-source.quartz.argb32.ref.png b/test/reference/radial-gradient-source.quartz.argb32.ref.png new file mode 100644 index 000000000..421c0b988 Binary files /dev/null and b/test/reference/radial-gradient-source.quartz.argb32.ref.png differ diff --git a/test/reference/radial-gradient-source.quartz.rgb24.ref.png b/test/reference/radial-gradient-source.quartz.rgb24.ref.png new file mode 100644 index 000000000..22f2b9077 Binary files /dev/null and b/test/reference/radial-gradient-source.quartz.rgb24.ref.png differ diff --git a/test/reference/radial-gradient-source.ref.png b/test/reference/radial-gradient-source.ref.png new file mode 100644 index 000000000..4ab4796fa Binary files /dev/null and b/test/reference/radial-gradient-source.ref.png differ diff --git a/test/reference/radial-gradient.base.argb32.ref.png b/test/reference/radial-gradient.base.argb32.ref.png new file mode 100644 index 000000000..a2cbbc82e Binary files /dev/null and b/test/reference/radial-gradient.base.argb32.ref.png differ diff --git a/test/reference/radial-gradient.base.rgb24.ref.png b/test/reference/radial-gradient.base.rgb24.ref.png new file mode 100644 index 000000000..a2cbbc82e Binary files /dev/null and b/test/reference/radial-gradient.base.rgb24.ref.png differ diff --git a/test/reference/radial-gradient.image16.ref.png b/test/reference/radial-gradient.image16.ref.png new file mode 100644 index 000000000..91202d3c4 Binary files /dev/null and b/test/reference/radial-gradient.image16.ref.png differ diff --git a/test/reference/radial-gradient.quartz.ref.png b/test/reference/radial-gradient.quartz.ref.png new file mode 100644 index 000000000..f01c6eb89 Binary files /dev/null and b/test/reference/radial-gradient.quartz.ref.png differ diff --git a/test/reference/radial-gradient.ref.png b/test/reference/radial-gradient.ref.png new file mode 100644 index 000000000..a2cbbc82e Binary files /dev/null and b/test/reference/radial-gradient.ref.png differ diff --git a/test/reference/radial-outer-focus.base.argb32.ref.png b/test/reference/radial-outer-focus.base.argb32.ref.png new file mode 100644 index 000000000..21f0bf6fb Binary files /dev/null and b/test/reference/radial-outer-focus.base.argb32.ref.png differ diff --git a/test/reference/radial-outer-focus.base.rgb24.ref.png b/test/reference/radial-outer-focus.base.rgb24.ref.png new file mode 100644 index 000000000..21f0bf6fb Binary files /dev/null and b/test/reference/radial-outer-focus.base.rgb24.ref.png differ diff --git a/test/reference/radial-outer-focus.mask.argb32.ref.png b/test/reference/radial-outer-focus.mask.argb32.ref.png new file mode 100644 index 000000000..21f0bf6fb Binary files /dev/null and b/test/reference/radial-outer-focus.mask.argb32.ref.png differ diff --git a/test/reference/radial-outer-focus.mask.rgb24.ref.png b/test/reference/radial-outer-focus.mask.rgb24.ref.png new file mode 100644 index 000000000..21f0bf6fb Binary files /dev/null and b/test/reference/radial-outer-focus.mask.rgb24.ref.png differ diff --git a/test/reference/radial-outer-focus.traps.argb32.ref.png b/test/reference/radial-outer-focus.traps.argb32.ref.png new file mode 100644 index 000000000..21f0bf6fb Binary files /dev/null and b/test/reference/radial-outer-focus.traps.argb32.ref.png differ diff --git a/test/reference/radial-outer-focus.traps.rgb24.ref.png b/test/reference/radial-outer-focus.traps.rgb24.ref.png new file mode 100644 index 000000000..21f0bf6fb Binary files /dev/null and b/test/reference/radial-outer-focus.traps.rgb24.ref.png differ diff --git a/test/reference/radial-outer-focus.xfail.png b/test/reference/radial-outer-focus.xfail.png new file mode 100644 index 000000000..53e9f8238 Binary files /dev/null and b/test/reference/radial-outer-focus.xfail.png differ diff --git a/test/reference/random-clip.base.argb32.ref.png b/test/reference/random-clip.base.argb32.ref.png new file mode 100644 index 000000000..2750fb159 Binary files /dev/null and b/test/reference/random-clip.base.argb32.ref.png differ diff --git a/test/reference/random-clip.base.argb32.xfail.png b/test/reference/random-clip.base.argb32.xfail.png new file mode 100644 index 000000000..15f91588e Binary files /dev/null and b/test/reference/random-clip.base.argb32.xfail.png differ diff --git a/test/reference/random-clip.base.rgb24.ref.png b/test/reference/random-clip.base.rgb24.ref.png new file mode 100644 index 000000000..2750fb159 Binary files /dev/null and b/test/reference/random-clip.base.rgb24.ref.png differ diff --git a/test/reference/random-clip.base.rgb24.xfail.png b/test/reference/random-clip.base.rgb24.xfail.png new file mode 100644 index 000000000..15f91588e Binary files /dev/null and b/test/reference/random-clip.base.rgb24.xfail.png differ diff --git a/test/reference/random-clip.mask.argb32.ref.png b/test/reference/random-clip.mask.argb32.ref.png new file mode 100644 index 000000000..41643cbad Binary files /dev/null and b/test/reference/random-clip.mask.argb32.ref.png differ diff --git a/test/reference/random-clip.mask.rgb24.ref.png b/test/reference/random-clip.mask.rgb24.ref.png new file mode 100644 index 000000000..41643cbad Binary files /dev/null and b/test/reference/random-clip.mask.rgb24.ref.png differ diff --git a/test/reference/random-clip.ref.png b/test/reference/random-clip.ref.png new file mode 100644 index 000000000..de7a6052c Binary files /dev/null and b/test/reference/random-clip.ref.png differ diff --git a/test/reference/random-clip.traps.argb32.ref.png b/test/reference/random-clip.traps.argb32.ref.png new file mode 100644 index 000000000..01cc60a4f Binary files /dev/null and b/test/reference/random-clip.traps.argb32.ref.png differ diff --git a/test/reference/random-clip.traps.rgb24.ref.png b/test/reference/random-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..01cc60a4f Binary files /dev/null and b/test/reference/random-clip.traps.rgb24.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.base.argb32.ref.png b/test/reference/random-intersections-curves-eo.base.argb32.ref.png new file mode 100644 index 000000000..ee10cb409 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.base.argb32.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.base.rgb24.ref.png b/test/reference/random-intersections-curves-eo.base.rgb24.ref.png new file mode 100644 index 000000000..ee10cb409 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.base.rgb24.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.image16.ref.png b/test/reference/random-intersections-curves-eo.image16.ref.png new file mode 100644 index 000000000..0663270f9 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.image16.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.pdf.ref.png b/test/reference/random-intersections-curves-eo.pdf.ref.png new file mode 100644 index 000000000..befa3c859 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.pdf.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.ps.ref.png b/test/reference/random-intersections-curves-eo.ps.ref.png new file mode 100644 index 000000000..374ace90a Binary files /dev/null and b/test/reference/random-intersections-curves-eo.ps.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.quartz.ref.png b/test/reference/random-intersections-curves-eo.quartz.ref.png new file mode 100644 index 000000000..2a44a5a5d Binary files /dev/null and b/test/reference/random-intersections-curves-eo.quartz.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.ref.png b/test/reference/random-intersections-curves-eo.ref.png new file mode 100644 index 000000000..1c12f22d2 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.traps.argb32.ref.png b/test/reference/random-intersections-curves-eo.traps.argb32.ref.png new file mode 100644 index 000000000..ee10cb409 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.traps.argb32.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.traps.rgb24.ref.png b/test/reference/random-intersections-curves-eo.traps.rgb24.ref.png new file mode 100644 index 000000000..ee10cb409 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.traps.rgb24.ref.png differ diff --git a/test/reference/random-intersections-curves-eo.xlib-fallback.ref.png b/test/reference/random-intersections-curves-eo.xlib-fallback.ref.png new file mode 100644 index 000000000..d91af0bf2 Binary files /dev/null and b/test/reference/random-intersections-curves-eo.xlib-fallback.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.base.argb32.ref.png b/test/reference/random-intersections-curves-nz.base.argb32.ref.png new file mode 100644 index 000000000..77f812987 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.base.argb32.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.base.rgb24.ref.png b/test/reference/random-intersections-curves-nz.base.rgb24.ref.png new file mode 100644 index 000000000..77f812987 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.base.rgb24.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.image16.ref.png b/test/reference/random-intersections-curves-nz.image16.ref.png new file mode 100644 index 000000000..5fbc7113b Binary files /dev/null and b/test/reference/random-intersections-curves-nz.image16.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.pdf.ref.png b/test/reference/random-intersections-curves-nz.pdf.ref.png new file mode 100644 index 000000000..a374934bc Binary files /dev/null and b/test/reference/random-intersections-curves-nz.pdf.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.ps.ref.png b/test/reference/random-intersections-curves-nz.ps.ref.png new file mode 100644 index 000000000..6cc5814fc Binary files /dev/null and b/test/reference/random-intersections-curves-nz.ps.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.quartz.ref.png b/test/reference/random-intersections-curves-nz.quartz.ref.png new file mode 100644 index 000000000..cf799bba9 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.quartz.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.ref.png b/test/reference/random-intersections-curves-nz.ref.png new file mode 100644 index 000000000..f251d2705 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.traps.argb32.ref.png b/test/reference/random-intersections-curves-nz.traps.argb32.ref.png new file mode 100644 index 000000000..77f812987 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.traps.argb32.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.traps.rgb24.ref.png b/test/reference/random-intersections-curves-nz.traps.rgb24.ref.png new file mode 100644 index 000000000..77f812987 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.traps.rgb24.ref.png differ diff --git a/test/reference/random-intersections-curves-nz.xlib-fallback.ref.png b/test/reference/random-intersections-curves-nz.xlib-fallback.ref.png new file mode 100644 index 000000000..f72f8f175 Binary files /dev/null and b/test/reference/random-intersections-curves-nz.xlib-fallback.ref.png differ diff --git a/test/reference/random-intersections-eo.base.argb32.ref.png b/test/reference/random-intersections-eo.base.argb32.ref.png new file mode 100644 index 000000000..037f926e4 Binary files /dev/null and b/test/reference/random-intersections-eo.base.argb32.ref.png differ diff --git a/test/reference/random-intersections-eo.base.rgb24.ref.png b/test/reference/random-intersections-eo.base.rgb24.ref.png new file mode 100644 index 000000000..037f926e4 Binary files /dev/null and b/test/reference/random-intersections-eo.base.rgb24.ref.png differ diff --git a/test/reference/random-intersections-eo.image16.ref.png b/test/reference/random-intersections-eo.image16.ref.png new file mode 100644 index 000000000..cf214d41a Binary files /dev/null and b/test/reference/random-intersections-eo.image16.ref.png differ diff --git a/test/reference/random-intersections-eo.ps.ref.png b/test/reference/random-intersections-eo.ps.ref.png new file mode 100644 index 000000000..49b359af0 Binary files /dev/null and b/test/reference/random-intersections-eo.ps.ref.png differ diff --git a/test/reference/random-intersections-eo.quartz.ref.png b/test/reference/random-intersections-eo.quartz.ref.png new file mode 100644 index 000000000..859abb050 Binary files /dev/null and b/test/reference/random-intersections-eo.quartz.ref.png differ diff --git a/test/reference/random-intersections-eo.ref.png b/test/reference/random-intersections-eo.ref.png new file mode 100644 index 000000000..ccd3f80d1 Binary files /dev/null and b/test/reference/random-intersections-eo.ref.png differ diff --git a/test/reference/random-intersections-eo.traps.argb32.ref.png b/test/reference/random-intersections-eo.traps.argb32.ref.png new file mode 100644 index 000000000..037f926e4 Binary files /dev/null and b/test/reference/random-intersections-eo.traps.argb32.ref.png differ diff --git a/test/reference/random-intersections-eo.traps.rgb24.ref.png b/test/reference/random-intersections-eo.traps.rgb24.ref.png new file mode 100644 index 000000000..037f926e4 Binary files /dev/null and b/test/reference/random-intersections-eo.traps.rgb24.ref.png differ diff --git a/test/reference/random-intersections-nonzero.base.argb32.ref.png b/test/reference/random-intersections-nonzero.base.argb32.ref.png new file mode 100644 index 000000000..7eb9a0a3a Binary files /dev/null and b/test/reference/random-intersections-nonzero.base.argb32.ref.png differ diff --git a/test/reference/random-intersections-nonzero.base.rgb24.ref.png b/test/reference/random-intersections-nonzero.base.rgb24.ref.png new file mode 100644 index 000000000..7eb9a0a3a Binary files /dev/null and b/test/reference/random-intersections-nonzero.base.rgb24.ref.png differ diff --git a/test/reference/random-intersections-nonzero.image16.ref.png b/test/reference/random-intersections-nonzero.image16.ref.png new file mode 100644 index 000000000..370abd9d5 Binary files /dev/null and b/test/reference/random-intersections-nonzero.image16.ref.png differ diff --git a/test/reference/random-intersections-nonzero.ps.ref.png b/test/reference/random-intersections-nonzero.ps.ref.png new file mode 100644 index 000000000..53a151f6f Binary files /dev/null and b/test/reference/random-intersections-nonzero.ps.ref.png differ diff --git a/test/reference/random-intersections-nonzero.quartz.ref.png b/test/reference/random-intersections-nonzero.quartz.ref.png new file mode 100644 index 000000000..f4310ea27 Binary files /dev/null and b/test/reference/random-intersections-nonzero.quartz.ref.png differ diff --git a/test/reference/random-intersections-nonzero.ref.png b/test/reference/random-intersections-nonzero.ref.png new file mode 100644 index 000000000..6f02ea0d8 Binary files /dev/null and b/test/reference/random-intersections-nonzero.ref.png differ diff --git a/test/reference/random-intersections-nonzero.traps.argb32.ref.png b/test/reference/random-intersections-nonzero.traps.argb32.ref.png new file mode 100644 index 000000000..7eb9a0a3a Binary files /dev/null and b/test/reference/random-intersections-nonzero.traps.argb32.ref.png differ diff --git a/test/reference/random-intersections-nonzero.traps.rgb24.ref.png b/test/reference/random-intersections-nonzero.traps.rgb24.ref.png new file mode 100644 index 000000000..7eb9a0a3a Binary files /dev/null and b/test/reference/random-intersections-nonzero.traps.rgb24.ref.png differ diff --git a/test/reference/raster-source.base.argb32.ref.png b/test/reference/raster-source.base.argb32.ref.png new file mode 100644 index 000000000..ac5e56063 Binary files /dev/null and b/test/reference/raster-source.base.argb32.ref.png differ diff --git a/test/reference/raster-source.base.rgb24.ref.png b/test/reference/raster-source.base.rgb24.ref.png new file mode 100644 index 000000000..ac5e56063 Binary files /dev/null and b/test/reference/raster-source.base.rgb24.ref.png differ diff --git a/test/reference/raster-source.ps.ref.png b/test/reference/raster-source.ps.ref.png new file mode 100644 index 000000000..2ffc11412 Binary files /dev/null and b/test/reference/raster-source.ps.ref.png differ diff --git a/test/reference/raster-source.ref.png b/test/reference/raster-source.ref.png new file mode 100644 index 000000000..ac5e56063 Binary files /dev/null and b/test/reference/raster-source.ref.png differ diff --git a/test/reference/record-extend-none-similar.base.argb32.ref.png b/test/reference/record-extend-none-similar.base.argb32.ref.png new file mode 100644 index 000000000..7d5c49fa2 Binary files /dev/null and b/test/reference/record-extend-none-similar.base.argb32.ref.png differ diff --git a/test/reference/record-extend-none-similar.base.rgb24.ref.png b/test/reference/record-extend-none-similar.base.rgb24.ref.png new file mode 100644 index 000000000..7d5c49fa2 Binary files /dev/null and b/test/reference/record-extend-none-similar.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-none-similar.ref.png b/test/reference/record-extend-none-similar.ref.png new file mode 100644 index 000000000..d63c31c1f Binary files /dev/null and b/test/reference/record-extend-none-similar.ref.png differ diff --git a/test/reference/record-extend-none-similar.traps.argb32.ref.png b/test/reference/record-extend-none-similar.traps.argb32.ref.png new file mode 100644 index 000000000..7d5c49fa2 Binary files /dev/null and b/test/reference/record-extend-none-similar.traps.argb32.ref.png differ diff --git a/test/reference/record-extend-none-similar.traps.rgb24.ref.png b/test/reference/record-extend-none-similar.traps.rgb24.ref.png new file mode 100644 index 000000000..7d5c49fa2 Binary files /dev/null and b/test/reference/record-extend-none-similar.traps.rgb24.ref.png differ diff --git a/test/reference/record-extend-none.base.argb32.ref.png b/test/reference/record-extend-none.base.argb32.ref.png new file mode 100644 index 000000000..d63c31c1f Binary files /dev/null and b/test/reference/record-extend-none.base.argb32.ref.png differ diff --git a/test/reference/record-extend-none.base.rgb24.ref.png b/test/reference/record-extend-none.base.rgb24.ref.png new file mode 100644 index 000000000..d63c31c1f Binary files /dev/null and b/test/reference/record-extend-none.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-none.ref.png b/test/reference/record-extend-none.ref.png new file mode 100644 index 000000000..d63c31c1f Binary files /dev/null and b/test/reference/record-extend-none.ref.png differ diff --git a/test/reference/record-extend-pad-similar.base.argb32.ref.png b/test/reference/record-extend-pad-similar.base.argb32.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-pad-similar.base.argb32.ref.png differ diff --git a/test/reference/record-extend-pad-similar.base.rgb24.ref.png b/test/reference/record-extend-pad-similar.base.rgb24.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-pad-similar.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-pad-similar.ref.png b/test/reference/record-extend-pad-similar.ref.png new file mode 100644 index 000000000..12915255c Binary files /dev/null and b/test/reference/record-extend-pad-similar.ref.png differ diff --git a/test/reference/record-extend-pad-similar.traps.argb32.ref.png b/test/reference/record-extend-pad-similar.traps.argb32.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-pad-similar.traps.argb32.ref.png differ diff --git a/test/reference/record-extend-pad-similar.traps.rgb24.ref.png b/test/reference/record-extend-pad-similar.traps.rgb24.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-pad-similar.traps.rgb24.ref.png differ diff --git a/test/reference/record-extend-pad.base.argb32.ref.png b/test/reference/record-extend-pad.base.argb32.ref.png new file mode 100644 index 000000000..12915255c Binary files /dev/null and b/test/reference/record-extend-pad.base.argb32.ref.png differ diff --git a/test/reference/record-extend-pad.base.rgb24.ref.png b/test/reference/record-extend-pad.base.rgb24.ref.png new file mode 100644 index 000000000..12915255c Binary files /dev/null and b/test/reference/record-extend-pad.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-pad.ref.png b/test/reference/record-extend-pad.ref.png new file mode 100644 index 000000000..12915255c Binary files /dev/null and b/test/reference/record-extend-pad.ref.png differ diff --git a/test/reference/record-extend-reflect-similar.base.argb32.ref.png b/test/reference/record-extend-reflect-similar.base.argb32.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-reflect-similar.base.argb32.ref.png differ diff --git a/test/reference/record-extend-reflect-similar.base.rgb24.ref.png b/test/reference/record-extend-reflect-similar.base.rgb24.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-reflect-similar.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-reflect-similar.ref.png b/test/reference/record-extend-reflect-similar.ref.png new file mode 100644 index 000000000..aec5c9454 Binary files /dev/null and b/test/reference/record-extend-reflect-similar.ref.png differ diff --git a/test/reference/record-extend-reflect-similar.traps.argb32.ref.png b/test/reference/record-extend-reflect-similar.traps.argb32.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-reflect-similar.traps.argb32.ref.png differ diff --git a/test/reference/record-extend-reflect-similar.traps.rgb24.ref.png b/test/reference/record-extend-reflect-similar.traps.rgb24.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-reflect-similar.traps.rgb24.ref.png differ diff --git a/test/reference/record-extend-reflect.base.argb32.ref.png b/test/reference/record-extend-reflect.base.argb32.ref.png new file mode 100644 index 000000000..aec5c9454 Binary files /dev/null and b/test/reference/record-extend-reflect.base.argb32.ref.png differ diff --git a/test/reference/record-extend-reflect.base.rgb24.ref.png b/test/reference/record-extend-reflect.base.rgb24.ref.png new file mode 100644 index 000000000..aec5c9454 Binary files /dev/null and b/test/reference/record-extend-reflect.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-reflect.ref.png b/test/reference/record-extend-reflect.ref.png new file mode 100644 index 000000000..aec5c9454 Binary files /dev/null and b/test/reference/record-extend-reflect.ref.png differ diff --git a/test/reference/record-extend-repeat-similar.base.argb32.ref.png b/test/reference/record-extend-repeat-similar.base.argb32.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-repeat-similar.base.argb32.ref.png differ diff --git a/test/reference/record-extend-repeat-similar.base.rgb24.ref.png b/test/reference/record-extend-repeat-similar.base.rgb24.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-repeat-similar.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-repeat-similar.ref.png b/test/reference/record-extend-repeat-similar.ref.png new file mode 100644 index 000000000..d4db9bf58 Binary files /dev/null and b/test/reference/record-extend-repeat-similar.ref.png differ diff --git a/test/reference/record-extend-repeat-similar.traps.argb32.ref.png b/test/reference/record-extend-repeat-similar.traps.argb32.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-repeat-similar.traps.argb32.ref.png differ diff --git a/test/reference/record-extend-repeat-similar.traps.rgb24.ref.png b/test/reference/record-extend-repeat-similar.traps.rgb24.ref.png new file mode 100644 index 000000000..da3de96d3 Binary files /dev/null and b/test/reference/record-extend-repeat-similar.traps.rgb24.ref.png differ diff --git a/test/reference/record-extend-repeat.base.argb32.ref.png b/test/reference/record-extend-repeat.base.argb32.ref.png new file mode 100644 index 000000000..d4db9bf58 Binary files /dev/null and b/test/reference/record-extend-repeat.base.argb32.ref.png differ diff --git a/test/reference/record-extend-repeat.base.rgb24.ref.png b/test/reference/record-extend-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..d4db9bf58 Binary files /dev/null and b/test/reference/record-extend-repeat.base.rgb24.ref.png differ diff --git a/test/reference/record-extend-repeat.ref.png b/test/reference/record-extend-repeat.ref.png new file mode 100644 index 000000000..d4db9bf58 Binary files /dev/null and b/test/reference/record-extend-repeat.ref.png differ diff --git a/test/reference/record-fill-alpha.base.argb32.ref.png b/test/reference/record-fill-alpha.base.argb32.ref.png new file mode 100644 index 000000000..5a2ebad01 Binary files /dev/null and b/test/reference/record-fill-alpha.base.argb32.ref.png differ diff --git a/test/reference/record-fill-alpha.base.rgb24.ref.png b/test/reference/record-fill-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..5a2ebad01 Binary files /dev/null and b/test/reference/record-fill-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record-fill-alpha.base.xfail.png b/test/reference/record-fill-alpha.base.xfail.png new file mode 100644 index 000000000..5a2ebad01 Binary files /dev/null and b/test/reference/record-fill-alpha.base.xfail.png differ diff --git a/test/reference/record-fill-alpha.image16.rgb24.ref.png b/test/reference/record-fill-alpha.image16.rgb24.ref.png new file mode 100644 index 000000000..8ba164e28 Binary files /dev/null and b/test/reference/record-fill-alpha.image16.rgb24.ref.png differ diff --git a/test/reference/record-fill-alpha.ref.png b/test/reference/record-fill-alpha.ref.png new file mode 100644 index 000000000..25c1ac68f Binary files /dev/null and b/test/reference/record-fill-alpha.ref.png differ diff --git a/test/reference/record-fill-alpha.traps.argb32.ref.png b/test/reference/record-fill-alpha.traps.argb32.ref.png new file mode 100644 index 000000000..85df9198c Binary files /dev/null and b/test/reference/record-fill-alpha.traps.argb32.ref.png differ diff --git a/test/reference/record-fill-alpha.traps.rgb24.ref.png b/test/reference/record-fill-alpha.traps.rgb24.ref.png new file mode 100644 index 000000000..85df9198c Binary files /dev/null and b/test/reference/record-fill-alpha.traps.rgb24.ref.png differ diff --git a/test/reference/record-fill-alpha.xfail.png b/test/reference/record-fill-alpha.xfail.png new file mode 100644 index 000000000..630c02466 Binary files /dev/null and b/test/reference/record-fill-alpha.xfail.png differ diff --git a/test/reference/record-mesh.base.argb32.ref.png b/test/reference/record-mesh.base.argb32.ref.png new file mode 100644 index 000000000..4921ba386 Binary files /dev/null and b/test/reference/record-mesh.base.argb32.ref.png differ diff --git a/test/reference/record-mesh.base.rgb24.ref.png b/test/reference/record-mesh.base.rgb24.ref.png new file mode 100644 index 000000000..4921ba386 Binary files /dev/null and b/test/reference/record-mesh.base.rgb24.ref.png differ diff --git a/test/reference/record-mesh.image16.rgb24.ref.png b/test/reference/record-mesh.image16.rgb24.ref.png new file mode 100644 index 000000000..df7bd0396 Binary files /dev/null and b/test/reference/record-mesh.image16.rgb24.ref.png differ diff --git a/test/reference/record-mesh.ref.png b/test/reference/record-mesh.ref.png new file mode 100644 index 000000000..4921ba386 Binary files /dev/null and b/test/reference/record-mesh.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.base.argb32.ref.png b/test/reference/record-paint-alpha-clip-mask.base.argb32.ref.png new file mode 100644 index 000000000..f7bb8ffee Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.base.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.base.rgb24.ref.png b/test/reference/record-paint-alpha-clip-mask.base.rgb24.ref.png new file mode 100644 index 000000000..f7bb8ffee Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.base.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.base.xfail.png b/test/reference/record-paint-alpha-clip-mask.base.xfail.png new file mode 100644 index 000000000..f7bb8ffee Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.base.xfail.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.image16.rgb24.ref.png b/test/reference/record-paint-alpha-clip-mask.image16.rgb24.ref.png new file mode 100644 index 000000000..f069c13b8 Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.image16.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.ref.png b/test/reference/record-paint-alpha-clip-mask.ref.png new file mode 100644 index 000000000..4ee4c41ac Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.traps.argb32.ref.png b/test/reference/record-paint-alpha-clip-mask.traps.argb32.ref.png new file mode 100644 index 000000000..201bd0d55 Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.traps.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.traps.rgb24.ref.png b/test/reference/record-paint-alpha-clip-mask.traps.rgb24.ref.png new file mode 100644 index 000000000..201bd0d55 Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.traps.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-clip-mask.xfail.png b/test/reference/record-paint-alpha-clip-mask.xfail.png new file mode 100644 index 000000000..3bc8cd5d5 Binary files /dev/null and b/test/reference/record-paint-alpha-clip-mask.xfail.png differ diff --git a/test/reference/record-paint-alpha-clip.base.argb32.ref.png b/test/reference/record-paint-alpha-clip.base.argb32.ref.png new file mode 100644 index 000000000..9f6841eb1 Binary files /dev/null and b/test/reference/record-paint-alpha-clip.base.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha-clip.base.rgb24.ref.png b/test/reference/record-paint-alpha-clip.base.rgb24.ref.png new file mode 100644 index 000000000..9f6841eb1 Binary files /dev/null and b/test/reference/record-paint-alpha-clip.base.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-clip.image16.rgb24.ref.png b/test/reference/record-paint-alpha-clip.image16.rgb24.ref.png new file mode 100644 index 000000000..6eb92c305 Binary files /dev/null and b/test/reference/record-paint-alpha-clip.image16.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-clip.ref.png b/test/reference/record-paint-alpha-clip.ref.png new file mode 100644 index 000000000..4bad4e8ca Binary files /dev/null and b/test/reference/record-paint-alpha-clip.ref.png differ diff --git a/test/reference/record-paint-alpha-clip.traps.argb32.ref.png b/test/reference/record-paint-alpha-clip.traps.argb32.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/record-paint-alpha-clip.traps.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha-clip.traps.rgb24.ref.png b/test/reference/record-paint-alpha-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..c1da67e01 Binary files /dev/null and b/test/reference/record-paint-alpha-clip.traps.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-solid-clip.base.argb32.ref.png b/test/reference/record-paint-alpha-solid-clip.base.argb32.ref.png new file mode 100644 index 000000000..59d226d1a Binary files /dev/null and b/test/reference/record-paint-alpha-solid-clip.base.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha-solid-clip.base.rgb24.ref.png b/test/reference/record-paint-alpha-solid-clip.base.rgb24.ref.png new file mode 100644 index 000000000..59d226d1a Binary files /dev/null and b/test/reference/record-paint-alpha-solid-clip.base.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-solid-clip.image16.rgb24.ref.png b/test/reference/record-paint-alpha-solid-clip.image16.rgb24.ref.png new file mode 100644 index 000000000..111293d7c Binary files /dev/null and b/test/reference/record-paint-alpha-solid-clip.image16.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha-solid-clip.ref.png b/test/reference/record-paint-alpha-solid-clip.ref.png new file mode 100644 index 000000000..59d226d1a Binary files /dev/null and b/test/reference/record-paint-alpha-solid-clip.ref.png differ diff --git a/test/reference/record-paint-alpha-solid-clip.traps.argb32.ref.png b/test/reference/record-paint-alpha-solid-clip.traps.argb32.ref.png new file mode 100644 index 000000000..2cd2df21c Binary files /dev/null and b/test/reference/record-paint-alpha-solid-clip.traps.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha-solid-clip.traps.rgb24.ref.png b/test/reference/record-paint-alpha-solid-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..2cd2df21c Binary files /dev/null and b/test/reference/record-paint-alpha-solid-clip.traps.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha.base.argb32.ref.png b/test/reference/record-paint-alpha.base.argb32.ref.png new file mode 100644 index 000000000..65d9c179b Binary files /dev/null and b/test/reference/record-paint-alpha.base.argb32.ref.png differ diff --git a/test/reference/record-paint-alpha.base.rgb24.ref.png b/test/reference/record-paint-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..65d9c179b Binary files /dev/null and b/test/reference/record-paint-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha.image16.rgb24.ref.png b/test/reference/record-paint-alpha.image16.rgb24.ref.png new file mode 100644 index 000000000..12bd89d55 Binary files /dev/null and b/test/reference/record-paint-alpha.image16.rgb24.ref.png differ diff --git a/test/reference/record-paint-alpha.ref.png b/test/reference/record-paint-alpha.ref.png new file mode 100644 index 000000000..487b8b622 Binary files /dev/null and b/test/reference/record-paint-alpha.ref.png differ diff --git a/test/reference/record-paint.base.argb32.ref.png b/test/reference/record-paint.base.argb32.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/record-paint.base.argb32.ref.png differ diff --git a/test/reference/record-paint.base.rgb24.ref.png b/test/reference/record-paint.base.rgb24.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/record-paint.base.rgb24.ref.png differ diff --git a/test/reference/record-paint.ref.png b/test/reference/record-paint.ref.png new file mode 100644 index 000000000..fff03b363 Binary files /dev/null and b/test/reference/record-paint.ref.png differ diff --git a/test/reference/record-select-font-face.base.argb32.ref.png b/test/reference/record-select-font-face.base.argb32.ref.png new file mode 100644 index 000000000..63c7cca8a Binary files /dev/null and b/test/reference/record-select-font-face.base.argb32.ref.png differ diff --git a/test/reference/record-select-font-face.base.rgb24.ref.png b/test/reference/record-select-font-face.base.rgb24.ref.png new file mode 100644 index 000000000..63c7cca8a Binary files /dev/null and b/test/reference/record-select-font-face.base.rgb24.ref.png differ diff --git a/test/reference/record-select-font-face.image16.rgb24.ref.png b/test/reference/record-select-font-face.image16.rgb24.ref.png new file mode 100644 index 000000000..88388e5e8 Binary files /dev/null and b/test/reference/record-select-font-face.image16.rgb24.ref.png differ diff --git a/test/reference/record-select-font-face.ref.png b/test/reference/record-select-font-face.ref.png new file mode 100644 index 000000000..1334a9a01 Binary files /dev/null and b/test/reference/record-select-font-face.ref.png differ diff --git a/test/reference/record-select-font-face.xfail.png b/test/reference/record-select-font-face.xfail.png new file mode 100644 index 000000000..1f57d692f Binary files /dev/null and b/test/reference/record-select-font-face.xfail.png differ diff --git a/test/reference/record-self-intersecting.base.argb32.ref.png b/test/reference/record-self-intersecting.base.argb32.ref.png new file mode 100644 index 000000000..d554d83ee Binary files /dev/null and b/test/reference/record-self-intersecting.base.argb32.ref.png differ diff --git a/test/reference/record-self-intersecting.base.rgb24.ref.png b/test/reference/record-self-intersecting.base.rgb24.ref.png new file mode 100644 index 000000000..d554d83ee Binary files /dev/null and b/test/reference/record-self-intersecting.base.rgb24.ref.png differ diff --git a/test/reference/record-self-intersecting.image16.rgb24.ref.png b/test/reference/record-self-intersecting.image16.rgb24.ref.png new file mode 100644 index 000000000..cab3507c9 Binary files /dev/null and b/test/reference/record-self-intersecting.image16.rgb24.ref.png differ diff --git a/test/reference/record-self-intersecting.ref.png b/test/reference/record-self-intersecting.ref.png new file mode 100644 index 000000000..d554d83ee Binary files /dev/null and b/test/reference/record-self-intersecting.ref.png differ diff --git a/test/reference/record-text-transform.base.argb32.ref.png b/test/reference/record-text-transform.base.argb32.ref.png new file mode 100644 index 000000000..8e74785f5 Binary files /dev/null and b/test/reference/record-text-transform.base.argb32.ref.png differ diff --git a/test/reference/record-text-transform.base.rgb24.ref.png b/test/reference/record-text-transform.base.rgb24.ref.png new file mode 100644 index 000000000..8e74785f5 Binary files /dev/null and b/test/reference/record-text-transform.base.rgb24.ref.png differ diff --git a/test/reference/record-text-transform.image16.rgb24.ref.png b/test/reference/record-text-transform.image16.rgb24.ref.png new file mode 100644 index 000000000..460389928 Binary files /dev/null and b/test/reference/record-text-transform.image16.rgb24.ref.png differ diff --git a/test/reference/record-text-transform.ref.png b/test/reference/record-text-transform.ref.png new file mode 100644 index 000000000..4603bc528 Binary files /dev/null and b/test/reference/record-text-transform.ref.png differ diff --git a/test/reference/record1414x-fill-alpha.base.argb32.ref.png b/test/reference/record1414x-fill-alpha.base.argb32.ref.png new file mode 100644 index 000000000..69673434f Binary files /dev/null and b/test/reference/record1414x-fill-alpha.base.argb32.ref.png differ diff --git a/test/reference/record1414x-fill-alpha.base.rgb24.ref.png b/test/reference/record1414x-fill-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..69673434f Binary files /dev/null and b/test/reference/record1414x-fill-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-fill-alpha.base.xfail.png b/test/reference/record1414x-fill-alpha.base.xfail.png new file mode 100644 index 000000000..69673434f Binary files /dev/null and b/test/reference/record1414x-fill-alpha.base.xfail.png differ diff --git a/test/reference/record1414x-fill-alpha.ref.png b/test/reference/record1414x-fill-alpha.ref.png new file mode 100644 index 000000000..8e9f3226a Binary files /dev/null and b/test/reference/record1414x-fill-alpha.ref.png differ diff --git a/test/reference/record1414x-fill-alpha.xfail.png b/test/reference/record1414x-fill-alpha.xfail.png new file mode 100644 index 000000000..9393186f6 Binary files /dev/null and b/test/reference/record1414x-fill-alpha.xfail.png differ diff --git a/test/reference/record1414x-paint-alpha-clip-mask.base.argb32.ref.png b/test/reference/record1414x-paint-alpha-clip-mask.base.argb32.ref.png new file mode 100644 index 000000000..0ae9861d5 Binary files /dev/null and b/test/reference/record1414x-paint-alpha-clip-mask.base.argb32.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-clip-mask.base.rgb24.ref.png b/test/reference/record1414x-paint-alpha-clip-mask.base.rgb24.ref.png new file mode 100644 index 000000000..0ae9861d5 Binary files /dev/null and b/test/reference/record1414x-paint-alpha-clip-mask.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-clip-mask.ref.png b/test/reference/record1414x-paint-alpha-clip-mask.ref.png new file mode 100644 index 000000000..e381b73aa Binary files /dev/null and b/test/reference/record1414x-paint-alpha-clip-mask.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-clip.base.argb32.ref.png b/test/reference/record1414x-paint-alpha-clip.base.argb32.ref.png new file mode 100644 index 000000000..d1b57ae3c Binary files /dev/null and b/test/reference/record1414x-paint-alpha-clip.base.argb32.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-clip.base.rgb24.ref.png b/test/reference/record1414x-paint-alpha-clip.base.rgb24.ref.png new file mode 100644 index 000000000..d1b57ae3c Binary files /dev/null and b/test/reference/record1414x-paint-alpha-clip.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-clip.ref.png b/test/reference/record1414x-paint-alpha-clip.ref.png new file mode 100644 index 000000000..6c11f1d96 Binary files /dev/null and b/test/reference/record1414x-paint-alpha-clip.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-solid-clip.base.argb32.ref.png b/test/reference/record1414x-paint-alpha-solid-clip.base.argb32.ref.png new file mode 100644 index 000000000..86d3f51b2 Binary files /dev/null and b/test/reference/record1414x-paint-alpha-solid-clip.base.argb32.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-solid-clip.base.rgb24.ref.png b/test/reference/record1414x-paint-alpha-solid-clip.base.rgb24.ref.png new file mode 100644 index 000000000..86d3f51b2 Binary files /dev/null and b/test/reference/record1414x-paint-alpha-solid-clip.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-paint-alpha-solid-clip.ref.png b/test/reference/record1414x-paint-alpha-solid-clip.ref.png new file mode 100644 index 000000000..7a8e59462 Binary files /dev/null and b/test/reference/record1414x-paint-alpha-solid-clip.ref.png differ diff --git a/test/reference/record1414x-paint-alpha.base.argb32.ref.png b/test/reference/record1414x-paint-alpha.base.argb32.ref.png new file mode 100644 index 000000000..eee74ced0 Binary files /dev/null and b/test/reference/record1414x-paint-alpha.base.argb32.ref.png differ diff --git a/test/reference/record1414x-paint-alpha.base.rgb24.ref.png b/test/reference/record1414x-paint-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..eee74ced0 Binary files /dev/null and b/test/reference/record1414x-paint-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-paint-alpha.ref.png b/test/reference/record1414x-paint-alpha.ref.png new file mode 100644 index 000000000..eee74ced0 Binary files /dev/null and b/test/reference/record1414x-paint-alpha.ref.png differ diff --git a/test/reference/record1414x-paint.base.argb32.ref.png b/test/reference/record1414x-paint.base.argb32.ref.png new file mode 100644 index 000000000..e0a1341c9 Binary files /dev/null and b/test/reference/record1414x-paint.base.argb32.ref.png differ diff --git a/test/reference/record1414x-paint.base.rgb24.ref.png b/test/reference/record1414x-paint.base.rgb24.ref.png new file mode 100644 index 000000000..e0a1341c9 Binary files /dev/null and b/test/reference/record1414x-paint.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-paint.ref.png b/test/reference/record1414x-paint.ref.png new file mode 100644 index 000000000..e0a1341c9 Binary files /dev/null and b/test/reference/record1414x-paint.ref.png differ diff --git a/test/reference/record1414x-select-font-face.base.argb32.ref.png b/test/reference/record1414x-select-font-face.base.argb32.ref.png new file mode 100644 index 000000000..ac30b23a3 Binary files /dev/null and b/test/reference/record1414x-select-font-face.base.argb32.ref.png differ diff --git a/test/reference/record1414x-select-font-face.base.rgb24.ref.png b/test/reference/record1414x-select-font-face.base.rgb24.ref.png new file mode 100644 index 000000000..ac30b23a3 Binary files /dev/null and b/test/reference/record1414x-select-font-face.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-select-font-face.ref.png b/test/reference/record1414x-select-font-face.ref.png new file mode 100644 index 000000000..6c52067b1 Binary files /dev/null and b/test/reference/record1414x-select-font-face.ref.png differ diff --git a/test/reference/record1414x-self-intersecting.base.argb32.ref.png b/test/reference/record1414x-self-intersecting.base.argb32.ref.png new file mode 100644 index 000000000..62f91c9e7 Binary files /dev/null and b/test/reference/record1414x-self-intersecting.base.argb32.ref.png differ diff --git a/test/reference/record1414x-self-intersecting.base.rgb24.ref.png b/test/reference/record1414x-self-intersecting.base.rgb24.ref.png new file mode 100644 index 000000000..62f91c9e7 Binary files /dev/null and b/test/reference/record1414x-self-intersecting.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-self-intersecting.ref.png b/test/reference/record1414x-self-intersecting.ref.png new file mode 100644 index 000000000..62f91c9e7 Binary files /dev/null and b/test/reference/record1414x-self-intersecting.ref.png differ diff --git a/test/reference/record1414x-text-transform.base.argb32.ref.png b/test/reference/record1414x-text-transform.base.argb32.ref.png new file mode 100644 index 000000000..624e3683a Binary files /dev/null and b/test/reference/record1414x-text-transform.base.argb32.ref.png differ diff --git a/test/reference/record1414x-text-transform.base.rgb24.ref.png b/test/reference/record1414x-text-transform.base.rgb24.ref.png new file mode 100644 index 000000000..624e3683a Binary files /dev/null and b/test/reference/record1414x-text-transform.base.rgb24.ref.png differ diff --git a/test/reference/record1414x-text-transform.ref.png b/test/reference/record1414x-text-transform.ref.png new file mode 100644 index 000000000..3bb8b1212 Binary files /dev/null and b/test/reference/record1414x-text-transform.ref.png differ diff --git a/test/reference/record2x-fill-alpha.base.argb32.ref.png b/test/reference/record2x-fill-alpha.base.argb32.ref.png new file mode 100644 index 000000000..b96ff8d00 Binary files /dev/null and b/test/reference/record2x-fill-alpha.base.argb32.ref.png differ diff --git a/test/reference/record2x-fill-alpha.base.rgb24.ref.png b/test/reference/record2x-fill-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..b96ff8d00 Binary files /dev/null and b/test/reference/record2x-fill-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record2x-fill-alpha.base.xfail.png b/test/reference/record2x-fill-alpha.base.xfail.png new file mode 100644 index 000000000..b96ff8d00 Binary files /dev/null and b/test/reference/record2x-fill-alpha.base.xfail.png differ diff --git a/test/reference/record2x-fill-alpha.ref.png b/test/reference/record2x-fill-alpha.ref.png new file mode 100644 index 000000000..91787bd9b Binary files /dev/null and b/test/reference/record2x-fill-alpha.ref.png differ diff --git a/test/reference/record2x-fill-alpha.xfail.png b/test/reference/record2x-fill-alpha.xfail.png new file mode 100644 index 000000000..3b70c0194 Binary files /dev/null and b/test/reference/record2x-fill-alpha.xfail.png differ diff --git a/test/reference/record2x-paint-alpha-clip-mask.base.argb32.ref.png b/test/reference/record2x-paint-alpha-clip-mask.base.argb32.ref.png new file mode 100644 index 000000000..ebfa1db5d Binary files /dev/null and b/test/reference/record2x-paint-alpha-clip-mask.base.argb32.ref.png differ diff --git a/test/reference/record2x-paint-alpha-clip-mask.base.rgb24.ref.png b/test/reference/record2x-paint-alpha-clip-mask.base.rgb24.ref.png new file mode 100644 index 000000000..ebfa1db5d Binary files /dev/null and b/test/reference/record2x-paint-alpha-clip-mask.base.rgb24.ref.png differ diff --git a/test/reference/record2x-paint-alpha-clip-mask.ref.png b/test/reference/record2x-paint-alpha-clip-mask.ref.png new file mode 100644 index 000000000..dd1ca05f9 Binary files /dev/null and b/test/reference/record2x-paint-alpha-clip-mask.ref.png differ diff --git a/test/reference/record2x-paint-alpha-clip.base.argb32.ref.png b/test/reference/record2x-paint-alpha-clip.base.argb32.ref.png new file mode 100644 index 000000000..b3829d56e Binary files /dev/null and b/test/reference/record2x-paint-alpha-clip.base.argb32.ref.png differ diff --git a/test/reference/record2x-paint-alpha-clip.base.rgb24.ref.png b/test/reference/record2x-paint-alpha-clip.base.rgb24.ref.png new file mode 100644 index 000000000..b3829d56e Binary files /dev/null and b/test/reference/record2x-paint-alpha-clip.base.rgb24.ref.png differ diff --git a/test/reference/record2x-paint-alpha-clip.ref.png b/test/reference/record2x-paint-alpha-clip.ref.png new file mode 100644 index 000000000..b3829d56e Binary files /dev/null and b/test/reference/record2x-paint-alpha-clip.ref.png differ diff --git a/test/reference/record2x-paint-alpha-solid-clip.base.argb32.ref.png b/test/reference/record2x-paint-alpha-solid-clip.base.argb32.ref.png new file mode 100644 index 000000000..06e350f35 Binary files /dev/null and b/test/reference/record2x-paint-alpha-solid-clip.base.argb32.ref.png differ diff --git a/test/reference/record2x-paint-alpha-solid-clip.base.rgb24.ref.png b/test/reference/record2x-paint-alpha-solid-clip.base.rgb24.ref.png new file mode 100644 index 000000000..06e350f35 Binary files /dev/null and b/test/reference/record2x-paint-alpha-solid-clip.base.rgb24.ref.png differ diff --git a/test/reference/record2x-paint-alpha-solid-clip.ref.png b/test/reference/record2x-paint-alpha-solid-clip.ref.png new file mode 100644 index 000000000..06e350f35 Binary files /dev/null and b/test/reference/record2x-paint-alpha-solid-clip.ref.png differ diff --git a/test/reference/record2x-paint-alpha.base.argb32.ref.png b/test/reference/record2x-paint-alpha.base.argb32.ref.png new file mode 100644 index 000000000..3a02b675c Binary files /dev/null and b/test/reference/record2x-paint-alpha.base.argb32.ref.png differ diff --git a/test/reference/record2x-paint-alpha.base.rgb24.ref.png b/test/reference/record2x-paint-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..3a02b675c Binary files /dev/null and b/test/reference/record2x-paint-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record2x-paint-alpha.ref.png b/test/reference/record2x-paint-alpha.ref.png new file mode 100644 index 000000000..3a02b675c Binary files /dev/null and b/test/reference/record2x-paint-alpha.ref.png differ diff --git a/test/reference/record2x-paint.base.argb32.ref.png b/test/reference/record2x-paint.base.argb32.ref.png new file mode 100644 index 000000000..792a1d033 Binary files /dev/null and b/test/reference/record2x-paint.base.argb32.ref.png differ diff --git a/test/reference/record2x-paint.base.rgb24.ref.png b/test/reference/record2x-paint.base.rgb24.ref.png new file mode 100644 index 000000000..792a1d033 Binary files /dev/null and b/test/reference/record2x-paint.base.rgb24.ref.png differ diff --git a/test/reference/record2x-paint.ref.png b/test/reference/record2x-paint.ref.png new file mode 100644 index 000000000..792a1d033 Binary files /dev/null and b/test/reference/record2x-paint.ref.png differ diff --git a/test/reference/record2x-select-font-face.base.argb32.ref.png b/test/reference/record2x-select-font-face.base.argb32.ref.png new file mode 100644 index 000000000..f0b268f5a Binary files /dev/null and b/test/reference/record2x-select-font-face.base.argb32.ref.png differ diff --git a/test/reference/record2x-select-font-face.base.rgb24.ref.png b/test/reference/record2x-select-font-face.base.rgb24.ref.png new file mode 100644 index 000000000..f0b268f5a Binary files /dev/null and b/test/reference/record2x-select-font-face.base.rgb24.ref.png differ diff --git a/test/reference/record2x-select-font-face.ref.png b/test/reference/record2x-select-font-face.ref.png new file mode 100644 index 000000000..7a99795e4 Binary files /dev/null and b/test/reference/record2x-select-font-face.ref.png differ diff --git a/test/reference/record2x-self-intersecting.base.argb32.ref.png b/test/reference/record2x-self-intersecting.base.argb32.ref.png new file mode 100644 index 000000000..2836dae03 Binary files /dev/null and b/test/reference/record2x-self-intersecting.base.argb32.ref.png differ diff --git a/test/reference/record2x-self-intersecting.base.rgb24.ref.png b/test/reference/record2x-self-intersecting.base.rgb24.ref.png new file mode 100644 index 000000000..2836dae03 Binary files /dev/null and b/test/reference/record2x-self-intersecting.base.rgb24.ref.png differ diff --git a/test/reference/record2x-self-intersecting.ref.png b/test/reference/record2x-self-intersecting.ref.png new file mode 100644 index 000000000..2836dae03 Binary files /dev/null and b/test/reference/record2x-self-intersecting.ref.png differ diff --git a/test/reference/record2x-text-transform.base.argb32.ref.png b/test/reference/record2x-text-transform.base.argb32.ref.png new file mode 100644 index 000000000..9811c1b5f Binary files /dev/null and b/test/reference/record2x-text-transform.base.argb32.ref.png differ diff --git a/test/reference/record2x-text-transform.base.rgb24.ref.png b/test/reference/record2x-text-transform.base.rgb24.ref.png new file mode 100644 index 000000000..9811c1b5f Binary files /dev/null and b/test/reference/record2x-text-transform.base.rgb24.ref.png differ diff --git a/test/reference/record2x-text-transform.ref.png b/test/reference/record2x-text-transform.ref.png new file mode 100644 index 000000000..6c21785ef Binary files /dev/null and b/test/reference/record2x-text-transform.ref.png differ diff --git a/test/reference/record90-fill-alpha.base.argb32.ref.png b/test/reference/record90-fill-alpha.base.argb32.ref.png new file mode 100644 index 000000000..4c743f5fc Binary files /dev/null and b/test/reference/record90-fill-alpha.base.argb32.ref.png differ diff --git a/test/reference/record90-fill-alpha.base.rgb24.ref.png b/test/reference/record90-fill-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..4c743f5fc Binary files /dev/null and b/test/reference/record90-fill-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record90-fill-alpha.ref.png b/test/reference/record90-fill-alpha.ref.png new file mode 100644 index 000000000..bf3b260a2 Binary files /dev/null and b/test/reference/record90-fill-alpha.ref.png differ diff --git a/test/reference/record90-fill-alpha.xfail.png b/test/reference/record90-fill-alpha.xfail.png new file mode 100644 index 000000000..ad1e65c4c Binary files /dev/null and b/test/reference/record90-fill-alpha.xfail.png differ diff --git a/test/reference/record90-paint-alpha-clip-mask.base.argb32.ref.png b/test/reference/record90-paint-alpha-clip-mask.base.argb32.ref.png new file mode 100644 index 000000000..976192c1a Binary files /dev/null and b/test/reference/record90-paint-alpha-clip-mask.base.argb32.ref.png differ diff --git a/test/reference/record90-paint-alpha-clip-mask.base.rgb24.ref.png b/test/reference/record90-paint-alpha-clip-mask.base.rgb24.ref.png new file mode 100644 index 000000000..976192c1a Binary files /dev/null and b/test/reference/record90-paint-alpha-clip-mask.base.rgb24.ref.png differ diff --git a/test/reference/record90-paint-alpha-clip-mask.ref.png b/test/reference/record90-paint-alpha-clip-mask.ref.png new file mode 100644 index 000000000..5c2106ba7 Binary files /dev/null and b/test/reference/record90-paint-alpha-clip-mask.ref.png differ diff --git a/test/reference/record90-paint-alpha-clip-mask.xfail.png b/test/reference/record90-paint-alpha-clip-mask.xfail.png new file mode 100644 index 000000000..bad037fee Binary files /dev/null and b/test/reference/record90-paint-alpha-clip-mask.xfail.png differ diff --git a/test/reference/record90-paint-alpha-clip.base.argb32.ref.png b/test/reference/record90-paint-alpha-clip.base.argb32.ref.png new file mode 100644 index 000000000..d687e3b4d Binary files /dev/null and b/test/reference/record90-paint-alpha-clip.base.argb32.ref.png differ diff --git a/test/reference/record90-paint-alpha-clip.base.rgb24.ref.png b/test/reference/record90-paint-alpha-clip.base.rgb24.ref.png new file mode 100644 index 000000000..d687e3b4d Binary files /dev/null and b/test/reference/record90-paint-alpha-clip.base.rgb24.ref.png differ diff --git a/test/reference/record90-paint-alpha-clip.ref.png b/test/reference/record90-paint-alpha-clip.ref.png new file mode 100644 index 000000000..3fae802ac Binary files /dev/null and b/test/reference/record90-paint-alpha-clip.ref.png differ diff --git a/test/reference/record90-paint-alpha-clip.xfail.png b/test/reference/record90-paint-alpha-clip.xfail.png new file mode 100644 index 000000000..d687e3b4d Binary files /dev/null and b/test/reference/record90-paint-alpha-clip.xfail.png differ diff --git a/test/reference/record90-paint-alpha-solid-clip.base.argb32.ref.png b/test/reference/record90-paint-alpha-solid-clip.base.argb32.ref.png new file mode 100644 index 000000000..48a01eaaa Binary files /dev/null and b/test/reference/record90-paint-alpha-solid-clip.base.argb32.ref.png differ diff --git a/test/reference/record90-paint-alpha-solid-clip.base.rgb24.ref.png b/test/reference/record90-paint-alpha-solid-clip.base.rgb24.ref.png new file mode 100644 index 000000000..48a01eaaa Binary files /dev/null and b/test/reference/record90-paint-alpha-solid-clip.base.rgb24.ref.png differ diff --git a/test/reference/record90-paint-alpha-solid-clip.ref.png b/test/reference/record90-paint-alpha-solid-clip.ref.png new file mode 100644 index 000000000..17bff57c5 Binary files /dev/null and b/test/reference/record90-paint-alpha-solid-clip.ref.png differ diff --git a/test/reference/record90-paint-alpha.base.argb32.ref.png b/test/reference/record90-paint-alpha.base.argb32.ref.png new file mode 100644 index 000000000..57aa95d37 Binary files /dev/null and b/test/reference/record90-paint-alpha.base.argb32.ref.png differ diff --git a/test/reference/record90-paint-alpha.base.rgb24.ref.png b/test/reference/record90-paint-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..57aa95d37 Binary files /dev/null and b/test/reference/record90-paint-alpha.base.rgb24.ref.png differ diff --git a/test/reference/record90-paint-alpha.ref.png b/test/reference/record90-paint-alpha.ref.png new file mode 100644 index 000000000..5e9cb58d9 Binary files /dev/null and b/test/reference/record90-paint-alpha.ref.png differ diff --git a/test/reference/record90-paint.base.argb32.ref.png b/test/reference/record90-paint.base.argb32.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/record90-paint.base.argb32.ref.png differ diff --git a/test/reference/record90-paint.base.rgb24.ref.png b/test/reference/record90-paint.base.rgb24.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/record90-paint.base.rgb24.ref.png differ diff --git a/test/reference/record90-paint.ref.png b/test/reference/record90-paint.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/record90-paint.ref.png differ diff --git a/test/reference/record90-select-font-face.base.argb32.ref.png b/test/reference/record90-select-font-face.base.argb32.ref.png new file mode 100644 index 000000000..13ed998f2 Binary files /dev/null and b/test/reference/record90-select-font-face.base.argb32.ref.png differ diff --git a/test/reference/record90-select-font-face.base.rgb24.ref.png b/test/reference/record90-select-font-face.base.rgb24.ref.png new file mode 100644 index 000000000..13ed998f2 Binary files /dev/null and b/test/reference/record90-select-font-face.base.rgb24.ref.png differ diff --git a/test/reference/record90-select-font-face.ref.png b/test/reference/record90-select-font-face.ref.png new file mode 100644 index 000000000..189a3154d Binary files /dev/null and b/test/reference/record90-select-font-face.ref.png differ diff --git a/test/reference/record90-self-intersecting.base.argb32.ref.png b/test/reference/record90-self-intersecting.base.argb32.ref.png new file mode 100644 index 000000000..7df179e94 Binary files /dev/null and b/test/reference/record90-self-intersecting.base.argb32.ref.png differ diff --git a/test/reference/record90-self-intersecting.base.rgb24.ref.png b/test/reference/record90-self-intersecting.base.rgb24.ref.png new file mode 100644 index 000000000..7df179e94 Binary files /dev/null and b/test/reference/record90-self-intersecting.base.rgb24.ref.png differ diff --git a/test/reference/record90-self-intersecting.ref.png b/test/reference/record90-self-intersecting.ref.png new file mode 100644 index 000000000..15ce4c005 Binary files /dev/null and b/test/reference/record90-self-intersecting.ref.png differ diff --git a/test/reference/record90-text-transform.base.argb32.ref.png b/test/reference/record90-text-transform.base.argb32.ref.png new file mode 100644 index 000000000..e8fa7225f Binary files /dev/null and b/test/reference/record90-text-transform.base.argb32.ref.png differ diff --git a/test/reference/record90-text-transform.base.rgb24.ref.png b/test/reference/record90-text-transform.base.rgb24.ref.png new file mode 100644 index 000000000..e8fa7225f Binary files /dev/null and b/test/reference/record90-text-transform.base.rgb24.ref.png differ diff --git a/test/reference/record90-text-transform.ref.png b/test/reference/record90-text-transform.ref.png new file mode 100644 index 000000000..22f6c1f0c Binary files /dev/null and b/test/reference/record90-text-transform.ref.png differ diff --git a/test/reference/recordflip-fill-alpha.ref.png b/test/reference/recordflip-fill-alpha.ref.png new file mode 100644 index 000000000..289a91505 Binary files /dev/null and b/test/reference/recordflip-fill-alpha.ref.png differ diff --git a/test/reference/recordflip-paint-alpha-clip-mask.ref.png b/test/reference/recordflip-paint-alpha-clip-mask.ref.png new file mode 100644 index 000000000..842fa35ae Binary files /dev/null and b/test/reference/recordflip-paint-alpha-clip-mask.ref.png differ diff --git a/test/reference/recordflip-paint-alpha-clip.ref.png b/test/reference/recordflip-paint-alpha-clip.ref.png new file mode 100644 index 000000000..d619b6d60 Binary files /dev/null and b/test/reference/recordflip-paint-alpha-clip.ref.png differ diff --git a/test/reference/recordflip-paint-alpha-solid-clip.ref.png b/test/reference/recordflip-paint-alpha-solid-clip.ref.png new file mode 100644 index 000000000..10dde68c5 Binary files /dev/null and b/test/reference/recordflip-paint-alpha-solid-clip.ref.png differ diff --git a/test/reference/recordflip-paint-alpha.ref.png b/test/reference/recordflip-paint-alpha.ref.png new file mode 100644 index 000000000..599acfba2 Binary files /dev/null and b/test/reference/recordflip-paint-alpha.ref.png differ diff --git a/test/reference/recordflip-paint.ref.png b/test/reference/recordflip-paint.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/recordflip-paint.ref.png differ diff --git a/test/reference/recordflip-select-font-face.ref.png b/test/reference/recordflip-select-font-face.ref.png new file mode 100644 index 000000000..eb710858c Binary files /dev/null and b/test/reference/recordflip-select-font-face.ref.png differ diff --git a/test/reference/recordflip-self-intersecting.ref.png b/test/reference/recordflip-self-intersecting.ref.png new file mode 100644 index 000000000..d554d83ee Binary files /dev/null and b/test/reference/recordflip-self-intersecting.ref.png differ diff --git a/test/reference/recordflip-text-transform.ref.png b/test/reference/recordflip-text-transform.ref.png new file mode 100644 index 000000000..31784d735 Binary files /dev/null and b/test/reference/recordflip-text-transform.ref.png differ diff --git a/test/reference/recordflip-whole-fill-alpha.ref.png b/test/reference/recordflip-whole-fill-alpha.ref.png new file mode 100644 index 000000000..289a91505 Binary files /dev/null and b/test/reference/recordflip-whole-fill-alpha.ref.png differ diff --git a/test/reference/recordflip-whole-paint-alpha-clip-mask.ref.png b/test/reference/recordflip-whole-paint-alpha-clip-mask.ref.png new file mode 100644 index 000000000..842fa35ae Binary files /dev/null and b/test/reference/recordflip-whole-paint-alpha-clip-mask.ref.png differ diff --git a/test/reference/recordflip-whole-paint-alpha-clip.ref.png b/test/reference/recordflip-whole-paint-alpha-clip.ref.png new file mode 100644 index 000000000..d619b6d60 Binary files /dev/null and b/test/reference/recordflip-whole-paint-alpha-clip.ref.png differ diff --git a/test/reference/recordflip-whole-paint-alpha-solid-clip.ref.png b/test/reference/recordflip-whole-paint-alpha-solid-clip.ref.png new file mode 100644 index 000000000..10dde68c5 Binary files /dev/null and b/test/reference/recordflip-whole-paint-alpha-solid-clip.ref.png differ diff --git a/test/reference/recordflip-whole-paint-alpha.ref.png b/test/reference/recordflip-whole-paint-alpha.ref.png new file mode 100644 index 000000000..599acfba2 Binary files /dev/null and b/test/reference/recordflip-whole-paint-alpha.ref.png differ diff --git a/test/reference/recordflip-whole-paint.ref.png b/test/reference/recordflip-whole-paint.ref.png new file mode 100644 index 000000000..22cc7a1ae Binary files /dev/null and b/test/reference/recordflip-whole-paint.ref.png differ diff --git a/test/reference/recordflip-whole-select-font-face.ref.png b/test/reference/recordflip-whole-select-font-face.ref.png new file mode 100644 index 000000000..eb710858c Binary files /dev/null and b/test/reference/recordflip-whole-select-font-face.ref.png differ diff --git a/test/reference/recordflip-whole-self-intersecting.ref.png b/test/reference/recordflip-whole-self-intersecting.ref.png new file mode 100644 index 000000000..d554d83ee Binary files /dev/null and b/test/reference/recordflip-whole-self-intersecting.ref.png differ diff --git a/test/reference/recordflip-whole-text-transform.ref.png b/test/reference/recordflip-whole-text-transform.ref.png new file mode 100644 index 000000000..31784d735 Binary files /dev/null and b/test/reference/recordflip-whole-text-transform.ref.png differ diff --git a/test/reference/recording-surface-extend-none.argb32.ref.png b/test/reference/recording-surface-extend-none.argb32.ref.png new file mode 100644 index 000000000..13898879d Binary files /dev/null and b/test/reference/recording-surface-extend-none.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-none.base.argb32.ref.png b/test/reference/recording-surface-extend-none.base.argb32.ref.png new file mode 100644 index 000000000..d612250af Binary files /dev/null and b/test/reference/recording-surface-extend-none.base.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-none.base.rgb24.ref.png b/test/reference/recording-surface-extend-none.base.rgb24.ref.png new file mode 100644 index 000000000..0a57b44e7 Binary files /dev/null and b/test/reference/recording-surface-extend-none.base.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-none.rgb24.ref.png b/test/reference/recording-surface-extend-none.rgb24.ref.png new file mode 100644 index 000000000..6a8b81e68 Binary files /dev/null and b/test/reference/recording-surface-extend-none.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-none.traps.argb32.ref.png b/test/reference/recording-surface-extend-none.traps.argb32.ref.png new file mode 100644 index 000000000..d612250af Binary files /dev/null and b/test/reference/recording-surface-extend-none.traps.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-none.traps.rgb24.ref.png b/test/reference/recording-surface-extend-none.traps.rgb24.ref.png new file mode 100644 index 000000000..0a57b44e7 Binary files /dev/null and b/test/reference/recording-surface-extend-none.traps.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-pad.argb32.ref.png b/test/reference/recording-surface-extend-pad.argb32.ref.png new file mode 100644 index 000000000..9efed65be Binary files /dev/null and b/test/reference/recording-surface-extend-pad.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-pad.base.argb32.ref.png b/test/reference/recording-surface-extend-pad.base.argb32.ref.png new file mode 100644 index 000000000..7ec94c5bc Binary files /dev/null and b/test/reference/recording-surface-extend-pad.base.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-pad.base.rgb24.ref.png b/test/reference/recording-surface-extend-pad.base.rgb24.ref.png new file mode 100644 index 000000000..8a064cd46 Binary files /dev/null and b/test/reference/recording-surface-extend-pad.base.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-pad.rgb24.ref.png b/test/reference/recording-surface-extend-pad.rgb24.ref.png new file mode 100644 index 000000000..7336890c4 Binary files /dev/null and b/test/reference/recording-surface-extend-pad.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-pad.traps.argb32.ref.png b/test/reference/recording-surface-extend-pad.traps.argb32.ref.png new file mode 100644 index 000000000..7ec94c5bc Binary files /dev/null and b/test/reference/recording-surface-extend-pad.traps.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-pad.traps.rgb24.ref.png b/test/reference/recording-surface-extend-pad.traps.rgb24.ref.png new file mode 100644 index 000000000..8a064cd46 Binary files /dev/null and b/test/reference/recording-surface-extend-pad.traps.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-reflect.argb32.ref.png b/test/reference/recording-surface-extend-reflect.argb32.ref.png new file mode 100644 index 000000000..f63ccee85 Binary files /dev/null and b/test/reference/recording-surface-extend-reflect.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-reflect.base.argb32.ref.png b/test/reference/recording-surface-extend-reflect.base.argb32.ref.png new file mode 100644 index 000000000..4699d42f4 Binary files /dev/null and b/test/reference/recording-surface-extend-reflect.base.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-reflect.base.rgb24.ref.png b/test/reference/recording-surface-extend-reflect.base.rgb24.ref.png new file mode 100644 index 000000000..4975d7559 Binary files /dev/null and b/test/reference/recording-surface-extend-reflect.base.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-reflect.rgb24.ref.png b/test/reference/recording-surface-extend-reflect.rgb24.ref.png new file mode 100644 index 000000000..26d4ae916 Binary files /dev/null and b/test/reference/recording-surface-extend-reflect.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-reflect.traps.argb32.ref.png b/test/reference/recording-surface-extend-reflect.traps.argb32.ref.png new file mode 100644 index 000000000..4699d42f4 Binary files /dev/null and b/test/reference/recording-surface-extend-reflect.traps.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-reflect.traps.rgb24.ref.png b/test/reference/recording-surface-extend-reflect.traps.rgb24.ref.png new file mode 100644 index 000000000..4975d7559 Binary files /dev/null and b/test/reference/recording-surface-extend-reflect.traps.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-repeat.argb32.ref.png b/test/reference/recording-surface-extend-repeat.argb32.ref.png new file mode 100644 index 000000000..99d880c8e Binary files /dev/null and b/test/reference/recording-surface-extend-repeat.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-repeat.base.argb32.ref.png b/test/reference/recording-surface-extend-repeat.base.argb32.ref.png new file mode 100644 index 000000000..305c022a0 Binary files /dev/null and b/test/reference/recording-surface-extend-repeat.base.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-repeat.base.rgb24.ref.png b/test/reference/recording-surface-extend-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..c3e296cbe Binary files /dev/null and b/test/reference/recording-surface-extend-repeat.base.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-repeat.rgb24.ref.png b/test/reference/recording-surface-extend-repeat.rgb24.ref.png new file mode 100644 index 000000000..474e6e9e8 Binary files /dev/null and b/test/reference/recording-surface-extend-repeat.rgb24.ref.png differ diff --git a/test/reference/recording-surface-extend-repeat.traps.argb32.ref.png b/test/reference/recording-surface-extend-repeat.traps.argb32.ref.png new file mode 100644 index 000000000..305c022a0 Binary files /dev/null and b/test/reference/recording-surface-extend-repeat.traps.argb32.ref.png differ diff --git a/test/reference/recording-surface-extend-repeat.traps.rgb24.ref.png b/test/reference/recording-surface-extend-repeat.traps.rgb24.ref.png new file mode 100644 index 000000000..c3e296cbe Binary files /dev/null and b/test/reference/recording-surface-extend-repeat.traps.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.argb32.ref.png b/test/reference/recording-surface-over.argb32.ref.png new file mode 100644 index 000000000..13898879d Binary files /dev/null and b/test/reference/recording-surface-over.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.base.argb32.ref.png b/test/reference/recording-surface-over.base.argb32.ref.png new file mode 100644 index 000000000..d612250af Binary files /dev/null and b/test/reference/recording-surface-over.base.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.base.rgb24.ref.png b/test/reference/recording-surface-over.base.rgb24.ref.png new file mode 100644 index 000000000..0a57b44e7 Binary files /dev/null and b/test/reference/recording-surface-over.base.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.gl.argb32.ref.png b/test/reference/recording-surface-over.gl.argb32.ref.png new file mode 100644 index 000000000..50e6f5ab0 Binary files /dev/null and b/test/reference/recording-surface-over.gl.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.image16.ref.png b/test/reference/recording-surface-over.image16.ref.png new file mode 100644 index 000000000..020289389 Binary files /dev/null and b/test/reference/recording-surface-over.image16.ref.png differ diff --git a/test/reference/recording-surface-over.pdf.argb32.ref.png b/test/reference/recording-surface-over.pdf.argb32.ref.png new file mode 100644 index 000000000..a06386b12 Binary files /dev/null and b/test/reference/recording-surface-over.pdf.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.pdf.rgb24.ref.png b/test/reference/recording-surface-over.pdf.rgb24.ref.png new file mode 100644 index 000000000..bf69f9ea3 Binary files /dev/null and b/test/reference/recording-surface-over.pdf.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.ps.argb32.ref.png b/test/reference/recording-surface-over.ps.argb32.ref.png new file mode 100644 index 000000000..ac6632316 Binary files /dev/null and b/test/reference/recording-surface-over.ps.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.ps.rgb24.ref.png b/test/reference/recording-surface-over.ps.rgb24.ref.png new file mode 100644 index 000000000..fab338235 Binary files /dev/null and b/test/reference/recording-surface-over.ps.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.quartz.argb32.ref.png b/test/reference/recording-surface-over.quartz.argb32.ref.png new file mode 100644 index 000000000..09d955967 Binary files /dev/null and b/test/reference/recording-surface-over.quartz.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.quartz.rgb24.ref.png b/test/reference/recording-surface-over.quartz.rgb24.ref.png new file mode 100644 index 000000000..96aff408b Binary files /dev/null and b/test/reference/recording-surface-over.quartz.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.rgb24.ref.png b/test/reference/recording-surface-over.rgb24.ref.png new file mode 100644 index 000000000..6a8b81e68 Binary files /dev/null and b/test/reference/recording-surface-over.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.svg.argb32.ref.png b/test/reference/recording-surface-over.svg.argb32.ref.png new file mode 100644 index 000000000..ff4154d61 Binary files /dev/null and b/test/reference/recording-surface-over.svg.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.svg.rgb24.ref.png b/test/reference/recording-surface-over.svg.rgb24.ref.png new file mode 100644 index 000000000..d2d537241 Binary files /dev/null and b/test/reference/recording-surface-over.svg.rgb24.ref.png differ diff --git a/test/reference/recording-surface-over.traps.argb32.ref.png b/test/reference/recording-surface-over.traps.argb32.ref.png new file mode 100644 index 000000000..d612250af Binary files /dev/null and b/test/reference/recording-surface-over.traps.argb32.ref.png differ diff --git a/test/reference/recording-surface-over.traps.rgb24.ref.png b/test/reference/recording-surface-over.traps.rgb24.ref.png new file mode 100644 index 000000000..0a57b44e7 Binary files /dev/null and b/test/reference/recording-surface-over.traps.rgb24.ref.png differ diff --git a/test/reference/recording-surface-source.argb32.ref.png b/test/reference/recording-surface-source.argb32.ref.png new file mode 100644 index 000000000..afe658772 Binary files /dev/null and b/test/reference/recording-surface-source.argb32.ref.png differ diff --git a/test/reference/recording-surface-source.base.argb32.ref.png b/test/reference/recording-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..3fe1057fb Binary files /dev/null and b/test/reference/recording-surface-source.base.argb32.ref.png differ diff --git a/test/reference/recording-surface-source.base.rgb24.ref.png b/test/reference/recording-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..d2605bd35 Binary files /dev/null and b/test/reference/recording-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/recording-surface-source.rgb24.ref.png b/test/reference/recording-surface-source.rgb24.ref.png new file mode 100644 index 000000000..76ec38964 Binary files /dev/null and b/test/reference/recording-surface-source.rgb24.ref.png differ diff --git a/test/reference/recording-surface-source.traps.argb32.ref.png b/test/reference/recording-surface-source.traps.argb32.ref.png new file mode 100644 index 000000000..3fe1057fb Binary files /dev/null and b/test/reference/recording-surface-source.traps.argb32.ref.png differ diff --git a/test/reference/recording-surface-source.traps.rgb24.ref.png b/test/reference/recording-surface-source.traps.rgb24.ref.png new file mode 100644 index 000000000..d2605bd35 Binary files /dev/null and b/test/reference/recording-surface-source.traps.rgb24.ref.png differ diff --git a/test/reference/rectangle-rounding-error.base.argb32.ref.png b/test/reference/rectangle-rounding-error.base.argb32.ref.png new file mode 100644 index 000000000..6cc1b21a2 Binary files /dev/null and b/test/reference/rectangle-rounding-error.base.argb32.ref.png differ diff --git a/test/reference/rectangle-rounding-error.base.rgb24.ref.png b/test/reference/rectangle-rounding-error.base.rgb24.ref.png new file mode 100644 index 000000000..6cc1b21a2 Binary files /dev/null and b/test/reference/rectangle-rounding-error.base.rgb24.ref.png differ diff --git a/test/reference/rectangle-rounding-error.ref.png b/test/reference/rectangle-rounding-error.ref.png new file mode 100644 index 000000000..413345d7c Binary files /dev/null and b/test/reference/rectangle-rounding-error.ref.png differ diff --git a/test/reference/rectilinear-dash-scale-unaligned.ref.png b/test/reference/rectilinear-dash-scale-unaligned.ref.png new file mode 100644 index 000000000..19dbe7f15 Binary files /dev/null and b/test/reference/rectilinear-dash-scale-unaligned.ref.png differ diff --git a/test/reference/rectilinear-dash-scale-unaligned.traps.ref.png b/test/reference/rectilinear-dash-scale-unaligned.traps.ref.png new file mode 100644 index 000000000..02abfaad2 Binary files /dev/null and b/test/reference/rectilinear-dash-scale-unaligned.traps.ref.png differ diff --git a/test/reference/rectilinear-dash-scale.ref.png b/test/reference/rectilinear-dash-scale.ref.png new file mode 100644 index 000000000..1ab868c34 Binary files /dev/null and b/test/reference/rectilinear-dash-scale.ref.png differ diff --git a/test/reference/rectilinear-dash.base.argb32.ref.png b/test/reference/rectilinear-dash.base.argb32.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.base.argb32.ref.png differ diff --git a/test/reference/rectilinear-dash.base.rgb24.ref.png b/test/reference/rectilinear-dash.base.rgb24.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.base.rgb24.ref.png differ diff --git a/test/reference/rectilinear-dash.mask.argb32.ref.png b/test/reference/rectilinear-dash.mask.argb32.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.mask.argb32.ref.png differ diff --git a/test/reference/rectilinear-dash.mask.rgb24.ref.png b/test/reference/rectilinear-dash.mask.rgb24.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.mask.rgb24.ref.png differ diff --git a/test/reference/rectilinear-dash.quartz.xfail.png b/test/reference/rectilinear-dash.quartz.xfail.png new file mode 100644 index 000000000..510184551 Binary files /dev/null and b/test/reference/rectilinear-dash.quartz.xfail.png differ diff --git a/test/reference/rectilinear-dash.ref.png b/test/reference/rectilinear-dash.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.ref.png differ diff --git a/test/reference/rectilinear-dash.traps.argb32.ref.png b/test/reference/rectilinear-dash.traps.argb32.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.traps.argb32.ref.png differ diff --git a/test/reference/rectilinear-dash.traps.rgb24.ref.png b/test/reference/rectilinear-dash.traps.rgb24.ref.png new file mode 100644 index 000000000..33e7851e7 Binary files /dev/null and b/test/reference/rectilinear-dash.traps.rgb24.ref.png differ diff --git a/test/reference/rectilinear-fill.base.argb32.ref.png b/test/reference/rectilinear-fill.base.argb32.ref.png new file mode 100644 index 000000000..dbaf38368 Binary files /dev/null and b/test/reference/rectilinear-fill.base.argb32.ref.png differ diff --git a/test/reference/rectilinear-fill.base.rgb24.ref.png b/test/reference/rectilinear-fill.base.rgb24.ref.png new file mode 100644 index 000000000..dbaf38368 Binary files /dev/null and b/test/reference/rectilinear-fill.base.rgb24.ref.png differ diff --git a/test/reference/rectilinear-fill.ref.png b/test/reference/rectilinear-fill.ref.png new file mode 100644 index 000000000..84b5967e2 Binary files /dev/null and b/test/reference/rectilinear-fill.ref.png differ diff --git a/test/reference/rectilinear-grid.base.argb32.ref.png b/test/reference/rectilinear-grid.base.argb32.ref.png new file mode 100644 index 000000000..7176cb4dd Binary files /dev/null and b/test/reference/rectilinear-grid.base.argb32.ref.png differ diff --git a/test/reference/rectilinear-grid.base.rgb24.ref.png b/test/reference/rectilinear-grid.base.rgb24.ref.png new file mode 100644 index 000000000..7176cb4dd Binary files /dev/null and b/test/reference/rectilinear-grid.base.rgb24.ref.png differ diff --git a/test/reference/rectilinear-grid.image16.ref.png b/test/reference/rectilinear-grid.image16.ref.png new file mode 100644 index 000000000..4d4c4da73 Binary files /dev/null and b/test/reference/rectilinear-grid.image16.ref.png differ diff --git a/test/reference/rectilinear-grid.ref.png b/test/reference/rectilinear-grid.ref.png new file mode 100644 index 000000000..8d47ef567 Binary files /dev/null and b/test/reference/rectilinear-grid.ref.png differ diff --git a/test/reference/rectilinear-grid.traps.argb32.ref.png b/test/reference/rectilinear-grid.traps.argb32.ref.png new file mode 100644 index 000000000..7176cb4dd Binary files /dev/null and b/test/reference/rectilinear-grid.traps.argb32.ref.png differ diff --git a/test/reference/rectilinear-grid.traps.rgb24.ref.png b/test/reference/rectilinear-grid.traps.rgb24.ref.png new file mode 100644 index 000000000..7176cb4dd Binary files /dev/null and b/test/reference/rectilinear-grid.traps.rgb24.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.base.argb32.ref.png b/test/reference/rectilinear-miter-limit.base.argb32.ref.png new file mode 100644 index 000000000..ddf7570d6 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.base.argb32.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.base.rgb24.ref.png b/test/reference/rectilinear-miter-limit.base.rgb24.ref.png new file mode 100644 index 000000000..ddf7570d6 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.base.rgb24.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.ps2.ref.png b/test/reference/rectilinear-miter-limit.ps2.ref.png new file mode 100644 index 000000000..821306067 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.ps2.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.ps3.ref.png b/test/reference/rectilinear-miter-limit.ps3.ref.png new file mode 100644 index 000000000..821306067 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.ps3.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.ref.png b/test/reference/rectilinear-miter-limit.ref.png new file mode 100644 index 000000000..d64d581e4 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.traps.argb32.ref.png b/test/reference/rectilinear-miter-limit.traps.argb32.ref.png new file mode 100644 index 000000000..ddf7570d6 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.traps.argb32.ref.png differ diff --git a/test/reference/rectilinear-miter-limit.traps.rgb24.ref.png b/test/reference/rectilinear-miter-limit.traps.rgb24.ref.png new file mode 100644 index 000000000..ddf7570d6 Binary files /dev/null and b/test/reference/rectilinear-miter-limit.traps.rgb24.ref.png differ diff --git a/test/reference/rectilinear-stroke.base.argb32.ref.png b/test/reference/rectilinear-stroke.base.argb32.ref.png new file mode 100644 index 000000000..260909b6f Binary files /dev/null and b/test/reference/rectilinear-stroke.base.argb32.ref.png differ diff --git a/test/reference/rectilinear-stroke.base.rgb24.ref.png b/test/reference/rectilinear-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..260909b6f Binary files /dev/null and b/test/reference/rectilinear-stroke.base.rgb24.ref.png differ diff --git a/test/reference/rectilinear-stroke.quartz.xfail.png b/test/reference/rectilinear-stroke.quartz.xfail.png new file mode 100644 index 000000000..e2a508e41 Binary files /dev/null and b/test/reference/rectilinear-stroke.quartz.xfail.png differ diff --git a/test/reference/rectilinear-stroke.ref.png b/test/reference/rectilinear-stroke.ref.png new file mode 100644 index 000000000..0a40b0dec Binary files /dev/null and b/test/reference/rectilinear-stroke.ref.png differ diff --git a/test/reference/reflected-stroke.base.argb32.ref.png b/test/reference/reflected-stroke.base.argb32.ref.png new file mode 100644 index 000000000..3b99f1cf2 Binary files /dev/null and b/test/reference/reflected-stroke.base.argb32.ref.png differ diff --git a/test/reference/reflected-stroke.base.rgb24.ref.png b/test/reference/reflected-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..3b99f1cf2 Binary files /dev/null and b/test/reference/reflected-stroke.base.rgb24.ref.png differ diff --git a/test/reference/reflected-stroke.image16.ref.png b/test/reference/reflected-stroke.image16.ref.png new file mode 100644 index 000000000..ab1273719 Binary files /dev/null and b/test/reference/reflected-stroke.image16.ref.png differ diff --git a/test/reference/reflected-stroke.mask.argb32.ref.png b/test/reference/reflected-stroke.mask.argb32.ref.png new file mode 100644 index 000000000..9a7d6bc41 Binary files /dev/null and b/test/reference/reflected-stroke.mask.argb32.ref.png differ diff --git a/test/reference/reflected-stroke.mask.rgb24.ref.png b/test/reference/reflected-stroke.mask.rgb24.ref.png new file mode 100644 index 000000000..9a7d6bc41 Binary files /dev/null and b/test/reference/reflected-stroke.mask.rgb24.ref.png differ diff --git a/test/reference/reflected-stroke.ps.ref.png b/test/reference/reflected-stroke.ps.ref.png new file mode 100644 index 000000000..5a28eefec Binary files /dev/null and b/test/reference/reflected-stroke.ps.ref.png differ diff --git a/test/reference/reflected-stroke.ref.png b/test/reference/reflected-stroke.ref.png new file mode 100644 index 000000000..c05eb96f6 Binary files /dev/null and b/test/reference/reflected-stroke.ref.png differ diff --git a/test/reference/reflected-stroke.traps.argb32.ref.png b/test/reference/reflected-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..3b99f1cf2 Binary files /dev/null and b/test/reference/reflected-stroke.traps.argb32.ref.png differ diff --git a/test/reference/reflected-stroke.traps.rgb24.ref.png b/test/reference/reflected-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..3b99f1cf2 Binary files /dev/null and b/test/reference/reflected-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/rel-path.base.argb32.ref.png b/test/reference/rel-path.base.argb32.ref.png new file mode 100644 index 000000000..5c9cf210a Binary files /dev/null and b/test/reference/rel-path.base.argb32.ref.png differ diff --git a/test/reference/rel-path.base.rgb24.ref.png b/test/reference/rel-path.base.rgb24.ref.png new file mode 100644 index 000000000..72e975ac1 Binary files /dev/null and b/test/reference/rel-path.base.rgb24.ref.png differ diff --git a/test/reference/rel-path.mask.rgb24.ref.png b/test/reference/rel-path.mask.rgb24.ref.png new file mode 100644 index 000000000..78d8a0884 Binary files /dev/null and b/test/reference/rel-path.mask.rgb24.ref.png differ diff --git a/test/reference/rel-path.ps2.rgb24.ref.png b/test/reference/rel-path.ps2.rgb24.ref.png new file mode 100644 index 000000000..ccdcebbc6 Binary files /dev/null and b/test/reference/rel-path.ps2.rgb24.ref.png differ diff --git a/test/reference/rel-path.ps3.rgb24.ref.png b/test/reference/rel-path.ps3.rgb24.ref.png new file mode 100644 index 000000000..ccdcebbc6 Binary files /dev/null and b/test/reference/rel-path.ps3.rgb24.ref.png differ diff --git a/test/reference/rel-path.ref.png b/test/reference/rel-path.ref.png new file mode 100644 index 000000000..67fe178a7 Binary files /dev/null and b/test/reference/rel-path.ref.png differ diff --git a/test/reference/rel-path.traps.argb32.ref.png b/test/reference/rel-path.traps.argb32.ref.png new file mode 100644 index 000000000..5c9cf210a Binary files /dev/null and b/test/reference/rel-path.traps.argb32.ref.png differ diff --git a/test/reference/rel-path.traps.rgb24.ref.png b/test/reference/rel-path.traps.rgb24.ref.png new file mode 100644 index 000000000..72e975ac1 Binary files /dev/null and b/test/reference/rel-path.traps.rgb24.ref.png differ diff --git a/test/reference/rgb24-ignore-alpha.base.argb32.ref.png b/test/reference/rgb24-ignore-alpha.base.argb32.ref.png new file mode 100644 index 000000000..922eddda5 Binary files /dev/null and b/test/reference/rgb24-ignore-alpha.base.argb32.ref.png differ diff --git a/test/reference/rgb24-ignore-alpha.base.rgb24.ref.png b/test/reference/rgb24-ignore-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..922eddda5 Binary files /dev/null and b/test/reference/rgb24-ignore-alpha.base.rgb24.ref.png differ diff --git a/test/reference/rgb24-ignore-alpha.ref.png b/test/reference/rgb24-ignore-alpha.ref.png new file mode 100644 index 000000000..ab1d8fac7 Binary files /dev/null and b/test/reference/rgb24-ignore-alpha.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.base.argb32.ref.png b/test/reference/rotate-clip-image-surface-paint.base.argb32.ref.png new file mode 100644 index 000000000..7f74b2b3c Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.base.argb32.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.base.rgb24.ref.png b/test/reference/rotate-clip-image-surface-paint.base.rgb24.ref.png new file mode 100644 index 000000000..7f74b2b3c Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.base.rgb24.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.ref.png b/test/reference/rotate-clip-image-surface-paint.ref.png new file mode 100644 index 000000000..90746fd2e Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.traps.argb32.ref.png b/test/reference/rotate-clip-image-surface-paint.traps.argb32.ref.png new file mode 100644 index 000000000..9d991d971 Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.traps.argb32.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.traps.rgb24.ref.png b/test/reference/rotate-clip-image-surface-paint.traps.rgb24.ref.png new file mode 100644 index 000000000..9d991d971 Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.traps.rgb24.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.xlib-fallback.rgb24.ref.png b/test/reference/rotate-clip-image-surface-paint.xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..9d991d971 Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/rotate-clip-image-surface-paint.xlib-window.rgb24.ref.png b/test/reference/rotate-clip-image-surface-paint.xlib-window.rgb24.ref.png new file mode 100644 index 000000000..9d991d971 Binary files /dev/null and b/test/reference/rotate-clip-image-surface-paint.xlib-window.rgb24.ref.png differ diff --git a/test/reference/rotate-clip.surface-paint.image.argb32.ref.png b/test/reference/rotate-clip.surface-paint.image.argb32.ref.png new file mode 100644 index 000000000..63e6f9625 Binary files /dev/null and b/test/reference/rotate-clip.surface-paint.image.argb32.ref.png differ diff --git a/test/reference/rotate-clip.surface-paint.image.rgb24.ref.png b/test/reference/rotate-clip.surface-paint.image.rgb24.ref.png new file mode 100644 index 000000000..63e6f9625 Binary files /dev/null and b/test/reference/rotate-clip.surface-paint.image.rgb24.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.base.argb32.ref.png b/test/reference/rotate-image-surface-paint.base.argb32.ref.png new file mode 100644 index 000000000..06a482005 Binary files /dev/null and b/test/reference/rotate-image-surface-paint.base.argb32.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.base.rgb24.ref.png b/test/reference/rotate-image-surface-paint.base.rgb24.ref.png new file mode 100644 index 000000000..06a482005 Binary files /dev/null and b/test/reference/rotate-image-surface-paint.base.rgb24.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.pdf.xfail.png b/test/reference/rotate-image-surface-paint.pdf.xfail.png new file mode 100644 index 000000000..e1892e57b Binary files /dev/null and b/test/reference/rotate-image-surface-paint.pdf.xfail.png differ diff --git a/test/reference/rotate-image-surface-paint.ps.ref.png b/test/reference/rotate-image-surface-paint.ps.ref.png new file mode 100644 index 000000000..4e46364e9 Binary files /dev/null and b/test/reference/rotate-image-surface-paint.ps.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.quartz.ref.png b/test/reference/rotate-image-surface-paint.quartz.ref.png new file mode 100644 index 000000000..a716b630a Binary files /dev/null and b/test/reference/rotate-image-surface-paint.quartz.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.ref.png b/test/reference/rotate-image-surface-paint.ref.png new file mode 100644 index 000000000..06a482005 Binary files /dev/null and b/test/reference/rotate-image-surface-paint.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.svg.ref.png b/test/reference/rotate-image-surface-paint.svg.ref.png new file mode 100644 index 000000000..e0db2452e Binary files /dev/null and b/test/reference/rotate-image-surface-paint.svg.ref.png differ diff --git a/test/reference/rotate-image-surface-paint.svg.xfail.png b/test/reference/rotate-image-surface-paint.svg.xfail.png new file mode 100644 index 000000000..4040784b9 Binary files /dev/null and b/test/reference/rotate-image-surface-paint.svg.xfail.png differ diff --git a/test/reference/rotate-stroke-box.ref.png b/test/reference/rotate-stroke-box.ref.png new file mode 100644 index 000000000..ef155f032 Binary files /dev/null and b/test/reference/rotate-stroke-box.ref.png differ diff --git a/test/reference/rotated-clip.base.argb32.ref.png b/test/reference/rotated-clip.base.argb32.ref.png new file mode 100644 index 000000000..e553a138c Binary files /dev/null and b/test/reference/rotated-clip.base.argb32.ref.png differ diff --git a/test/reference/rotated-clip.base.rgb24.ref.png b/test/reference/rotated-clip.base.rgb24.ref.png new file mode 100644 index 000000000..e553a138c Binary files /dev/null and b/test/reference/rotated-clip.base.rgb24.ref.png differ diff --git a/test/reference/rotated-clip.image16.ref.png b/test/reference/rotated-clip.image16.ref.png new file mode 100644 index 000000000..26d9a1aa0 Binary files /dev/null and b/test/reference/rotated-clip.image16.ref.png differ diff --git a/test/reference/rotated-clip.mask.argb32.ref.png b/test/reference/rotated-clip.mask.argb32.ref.png new file mode 100644 index 000000000..8168f9d99 Binary files /dev/null and b/test/reference/rotated-clip.mask.argb32.ref.png differ diff --git a/test/reference/rotated-clip.mask.rgb24.ref.png b/test/reference/rotated-clip.mask.rgb24.ref.png new file mode 100644 index 000000000..8168f9d99 Binary files /dev/null and b/test/reference/rotated-clip.mask.rgb24.ref.png differ diff --git a/test/reference/rotated-clip.ps.ref.png b/test/reference/rotated-clip.ps.ref.png new file mode 100644 index 000000000..a2a0aceda Binary files /dev/null and b/test/reference/rotated-clip.ps.ref.png differ diff --git a/test/reference/rotated-clip.quartz.ref.png b/test/reference/rotated-clip.quartz.ref.png new file mode 100644 index 000000000..6282846e2 Binary files /dev/null and b/test/reference/rotated-clip.quartz.ref.png differ diff --git a/test/reference/rotated-clip.ref.png b/test/reference/rotated-clip.ref.png new file mode 100644 index 000000000..f5468c7de Binary files /dev/null and b/test/reference/rotated-clip.ref.png differ diff --git a/test/reference/rotated-clip.traps.argb32.ref.png b/test/reference/rotated-clip.traps.argb32.ref.png new file mode 100644 index 000000000..ca0f0af71 Binary files /dev/null and b/test/reference/rotated-clip.traps.argb32.ref.png differ diff --git a/test/reference/rotated-clip.traps.rgb24.ref.png b/test/reference/rotated-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..ca0f0af71 Binary files /dev/null and b/test/reference/rotated-clip.traps.rgb24.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.base.argb32.ref.png b/test/reference/rounded-rectangle-fill.base.argb32.ref.png new file mode 100644 index 000000000..52a355dbc Binary files /dev/null and b/test/reference/rounded-rectangle-fill.base.argb32.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.base.rgb24.ref.png b/test/reference/rounded-rectangle-fill.base.rgb24.ref.png new file mode 100644 index 000000000..52a355dbc Binary files /dev/null and b/test/reference/rounded-rectangle-fill.base.rgb24.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.image16.ref.png b/test/reference/rounded-rectangle-fill.image16.ref.png new file mode 100644 index 000000000..0739e5dae Binary files /dev/null and b/test/reference/rounded-rectangle-fill.image16.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.ps.ref.png b/test/reference/rounded-rectangle-fill.ps.ref.png new file mode 100644 index 000000000..215ad3a15 Binary files /dev/null and b/test/reference/rounded-rectangle-fill.ps.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.quartz.ref.png b/test/reference/rounded-rectangle-fill.quartz.ref.png new file mode 100644 index 000000000..ee685ca06 Binary files /dev/null and b/test/reference/rounded-rectangle-fill.quartz.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.ref.png b/test/reference/rounded-rectangle-fill.ref.png new file mode 100644 index 000000000..e9bab0f95 Binary files /dev/null and b/test/reference/rounded-rectangle-fill.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.traps.argb32.ref.png b/test/reference/rounded-rectangle-fill.traps.argb32.ref.png new file mode 100644 index 000000000..52a355dbc Binary files /dev/null and b/test/reference/rounded-rectangle-fill.traps.argb32.ref.png differ diff --git a/test/reference/rounded-rectangle-fill.traps.rgb24.ref.png b/test/reference/rounded-rectangle-fill.traps.rgb24.ref.png new file mode 100644 index 000000000..52a355dbc Binary files /dev/null and b/test/reference/rounded-rectangle-fill.traps.rgb24.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.base.argb32.ref.png b/test/reference/rounded-rectangle-stroke.base.argb32.ref.png new file mode 100644 index 000000000..490821e06 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.base.argb32.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.base.rgb24.ref.png b/test/reference/rounded-rectangle-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..490821e06 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.base.rgb24.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.image16.ref.png b/test/reference/rounded-rectangle-stroke.image16.ref.png new file mode 100644 index 000000000..f32a2e069 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.image16.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.mask.argb32.ref.png b/test/reference/rounded-rectangle-stroke.mask.argb32.ref.png new file mode 100644 index 000000000..3f2a1fb2c Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.mask.argb32.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.mask.rgb24.ref.png b/test/reference/rounded-rectangle-stroke.mask.rgb24.ref.png new file mode 100644 index 000000000..3f2a1fb2c Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.mask.rgb24.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.ps.ref.png b/test/reference/rounded-rectangle-stroke.ps.ref.png new file mode 100644 index 000000000..dd5fc97f8 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.ps.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.ref.png b/test/reference/rounded-rectangle-stroke.ref.png new file mode 100644 index 000000000..a98596006 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.traps.argb32.ref.png b/test/reference/rounded-rectangle-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..490821e06 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.traps.argb32.ref.png differ diff --git a/test/reference/rounded-rectangle-stroke.traps.rgb24.ref.png b/test/reference/rounded-rectangle-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..490821e06 Binary files /dev/null and b/test/reference/rounded-rectangle-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/sample-diagonal.ref.png b/test/reference/sample-diagonal.ref.png new file mode 100644 index 000000000..f866c2e87 Binary files /dev/null and b/test/reference/sample-diagonal.ref.png differ diff --git a/test/reference/sample-horizontal.ref.png b/test/reference/sample-horizontal.ref.png new file mode 100644 index 000000000..75f866b74 Binary files /dev/null and b/test/reference/sample-horizontal.ref.png differ diff --git a/test/reference/sample-vertical.ref.png b/test/reference/sample-vertical.ref.png new file mode 100644 index 000000000..75f866b74 Binary files /dev/null and b/test/reference/sample-vertical.ref.png differ diff --git a/test/reference/scale-down-source-surface-paint.base.argb32.ref.png b/test/reference/scale-down-source-surface-paint.base.argb32.ref.png new file mode 100644 index 000000000..74770948d Binary files /dev/null and b/test/reference/scale-down-source-surface-paint.base.argb32.ref.png differ diff --git a/test/reference/scale-down-source-surface-paint.base.rgb24.ref.png b/test/reference/scale-down-source-surface-paint.base.rgb24.ref.png new file mode 100644 index 000000000..74770948d Binary files /dev/null and b/test/reference/scale-down-source-surface-paint.base.rgb24.ref.png differ diff --git a/test/reference/scale-down-source-surface-paint.ref.png b/test/reference/scale-down-source-surface-paint.ref.png new file mode 100644 index 000000000..5c969d2c5 Binary files /dev/null and b/test/reference/scale-down-source-surface-paint.ref.png differ diff --git a/test/reference/scale-offset-image.base.argb32.ref.png b/test/reference/scale-offset-image.base.argb32.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-image.base.argb32.ref.png differ diff --git a/test/reference/scale-offset-image.base.rgb24.ref.png b/test/reference/scale-offset-image.base.rgb24.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-image.base.rgb24.ref.png differ diff --git a/test/reference/scale-offset-image.gl.ref.png b/test/reference/scale-offset-image.gl.ref.png new file mode 100644 index 000000000..d2a845c5a Binary files /dev/null and b/test/reference/scale-offset-image.gl.ref.png differ diff --git a/test/reference/scale-offset-image.image16.ref.png b/test/reference/scale-offset-image.image16.ref.png new file mode 100644 index 000000000..e67949d01 Binary files /dev/null and b/test/reference/scale-offset-image.image16.ref.png differ diff --git a/test/reference/scale-offset-image.pdf.argb32.ref.png b/test/reference/scale-offset-image.pdf.argb32.ref.png new file mode 100644 index 000000000..74abfaecb Binary files /dev/null and b/test/reference/scale-offset-image.pdf.argb32.ref.png differ diff --git a/test/reference/scale-offset-image.pdf.rgb24.ref.png b/test/reference/scale-offset-image.pdf.rgb24.ref.png new file mode 100644 index 000000000..74abfaecb Binary files /dev/null and b/test/reference/scale-offset-image.pdf.rgb24.ref.png differ diff --git a/test/reference/scale-offset-image.ps.ref.png b/test/reference/scale-offset-image.ps.ref.png new file mode 100644 index 000000000..19941f00e Binary files /dev/null and b/test/reference/scale-offset-image.ps.ref.png differ diff --git a/test/reference/scale-offset-image.quartz.ref.png b/test/reference/scale-offset-image.quartz.ref.png new file mode 100644 index 000000000..f7a5e7228 Binary files /dev/null and b/test/reference/scale-offset-image.quartz.ref.png differ diff --git a/test/reference/scale-offset-image.ref.png b/test/reference/scale-offset-image.ref.png new file mode 100644 index 000000000..ab1ced830 Binary files /dev/null and b/test/reference/scale-offset-image.ref.png differ diff --git a/test/reference/scale-offset-image.script.xfail.png b/test/reference/scale-offset-image.script.xfail.png new file mode 100644 index 000000000..b89bb66b0 Binary files /dev/null and b/test/reference/scale-offset-image.script.xfail.png differ diff --git a/test/reference/scale-offset-image.traps.argb32.ref.png b/test/reference/scale-offset-image.traps.argb32.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-image.traps.argb32.ref.png differ diff --git a/test/reference/scale-offset-image.traps.rgb24.ref.png b/test/reference/scale-offset-image.traps.rgb24.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-image.traps.rgb24.ref.png differ diff --git a/test/reference/scale-offset-image.xfail.png b/test/reference/scale-offset-image.xfail.png new file mode 100644 index 000000000..f0db601fc Binary files /dev/null and b/test/reference/scale-offset-image.xfail.png differ diff --git a/test/reference/scale-offset-image.xlib-fallback.xfail.png b/test/reference/scale-offset-image.xlib-fallback.xfail.png new file mode 100644 index 000000000..3e09d6f88 Binary files /dev/null and b/test/reference/scale-offset-image.xlib-fallback.xfail.png differ diff --git a/test/reference/scale-offset-similar.base.argb32.ref.png b/test/reference/scale-offset-similar.base.argb32.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-similar.base.argb32.ref.png differ diff --git a/test/reference/scale-offset-similar.base.rgb24.ref.png b/test/reference/scale-offset-similar.base.rgb24.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-similar.base.rgb24.ref.png differ diff --git a/test/reference/scale-offset-similar.gl.ref.png b/test/reference/scale-offset-similar.gl.ref.png new file mode 100644 index 000000000..d2a845c5a Binary files /dev/null and b/test/reference/scale-offset-similar.gl.ref.png differ diff --git a/test/reference/scale-offset-similar.image16.ref.png b/test/reference/scale-offset-similar.image16.ref.png new file mode 100644 index 000000000..e67949d01 Binary files /dev/null and b/test/reference/scale-offset-similar.image16.ref.png differ diff --git a/test/reference/scale-offset-similar.pdf.argb32.ref.png b/test/reference/scale-offset-similar.pdf.argb32.ref.png new file mode 100644 index 000000000..c1e27653f Binary files /dev/null and b/test/reference/scale-offset-similar.pdf.argb32.ref.png differ diff --git a/test/reference/scale-offset-similar.pdf.rgb24.ref.png b/test/reference/scale-offset-similar.pdf.rgb24.ref.png new file mode 100644 index 000000000..c1e27653f Binary files /dev/null and b/test/reference/scale-offset-similar.pdf.rgb24.ref.png differ diff --git a/test/reference/scale-offset-similar.ps.ref.png b/test/reference/scale-offset-similar.ps.ref.png new file mode 100644 index 000000000..8c10d30e4 Binary files /dev/null and b/test/reference/scale-offset-similar.ps.ref.png differ diff --git a/test/reference/scale-offset-similar.quartz.ref.png b/test/reference/scale-offset-similar.quartz.ref.png new file mode 100644 index 000000000..f7a5e7228 Binary files /dev/null and b/test/reference/scale-offset-similar.quartz.ref.png differ diff --git a/test/reference/scale-offset-similar.recording.xfail.png b/test/reference/scale-offset-similar.recording.xfail.png new file mode 100644 index 000000000..0f2553e49 Binary files /dev/null and b/test/reference/scale-offset-similar.recording.xfail.png differ diff --git a/test/reference/scale-offset-similar.ref.png b/test/reference/scale-offset-similar.ref.png new file mode 100644 index 000000000..8b3649a33 Binary files /dev/null and b/test/reference/scale-offset-similar.ref.png differ diff --git a/test/reference/scale-offset-similar.script.xfail.png b/test/reference/scale-offset-similar.script.xfail.png new file mode 100644 index 000000000..b89bb66b0 Binary files /dev/null and b/test/reference/scale-offset-similar.script.xfail.png differ diff --git a/test/reference/scale-offset-similar.traps.argb32.ref.png b/test/reference/scale-offset-similar.traps.argb32.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-similar.traps.argb32.ref.png differ diff --git a/test/reference/scale-offset-similar.traps.rgb24.ref.png b/test/reference/scale-offset-similar.traps.rgb24.ref.png new file mode 100644 index 000000000..19cd614d4 Binary files /dev/null and b/test/reference/scale-offset-similar.traps.rgb24.ref.png differ diff --git a/test/reference/scale-offset-similar.xfail.png b/test/reference/scale-offset-similar.xfail.png new file mode 100644 index 000000000..f0db601fc Binary files /dev/null and b/test/reference/scale-offset-similar.xfail.png differ diff --git a/test/reference/scale-offset-similar.xlib-fallback.xfail.png b/test/reference/scale-offset-similar.xlib-fallback.xfail.png new file mode 100644 index 000000000..3e09d6f88 Binary files /dev/null and b/test/reference/scale-offset-similar.xlib-fallback.xfail.png differ diff --git a/test/reference/scale-offset-similar.xlib.xfail.png b/test/reference/scale-offset-similar.xlib.xfail.png new file mode 100644 index 000000000..eb4851628 Binary files /dev/null and b/test/reference/scale-offset-similar.xlib.xfail.png differ diff --git a/test/reference/scale-offset-xlib-fallback.rgb24.ref.png b/test/reference/scale-offset-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..dbb1225ed Binary files /dev/null and b/test/reference/scale-offset-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/scale-offset-xlib-window.rgb24.ref.png b/test/reference/scale-offset-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..dbb1225ed Binary files /dev/null and b/test/reference/scale-offset-xlib-window.rgb24.ref.png differ diff --git a/test/reference/scale-offset-xlib.ref.png b/test/reference/scale-offset-xlib.ref.png new file mode 100644 index 000000000..dbb1225ed Binary files /dev/null and b/test/reference/scale-offset-xlib.ref.png differ diff --git a/test/reference/scale-offset.image.argb32.ref.png b/test/reference/scale-offset.image.argb32.ref.png new file mode 100644 index 000000000..12470634b Binary files /dev/null and b/test/reference/scale-offset.image.argb32.ref.png differ diff --git a/test/reference/scale-offset.image.rgb24.ref.png b/test/reference/scale-offset.image.rgb24.ref.png new file mode 100644 index 000000000..12470634b Binary files /dev/null and b/test/reference/scale-offset.image.rgb24.ref.png differ diff --git a/test/reference/scale-source-surface-paint.base.argb32.ref.png b/test/reference/scale-source-surface-paint.base.argb32.ref.png new file mode 100644 index 000000000..e159d15e3 Binary files /dev/null and b/test/reference/scale-source-surface-paint.base.argb32.ref.png differ diff --git a/test/reference/scale-source-surface-paint.base.rgb24.ref.png b/test/reference/scale-source-surface-paint.base.rgb24.ref.png new file mode 100644 index 000000000..3491a7c05 Binary files /dev/null and b/test/reference/scale-source-surface-paint.base.rgb24.ref.png differ diff --git a/test/reference/scale-source-surface-paint.pdf.argb32.xfail.png b/test/reference/scale-source-surface-paint.pdf.argb32.xfail.png new file mode 100644 index 000000000..7ecac1776 Binary files /dev/null and b/test/reference/scale-source-surface-paint.pdf.argb32.xfail.png differ diff --git a/test/reference/scale-source-surface-paint.pdf.rgb24.xfail.png b/test/reference/scale-source-surface-paint.pdf.rgb24.xfail.png new file mode 100644 index 000000000..fa1291f96 Binary files /dev/null and b/test/reference/scale-source-surface-paint.pdf.rgb24.xfail.png differ diff --git a/test/reference/scale-source-surface-paint.ref.png b/test/reference/scale-source-surface-paint.ref.png new file mode 100644 index 000000000..ec3c059fd Binary files /dev/null and b/test/reference/scale-source-surface-paint.ref.png differ diff --git a/test/reference/scale-source-surface-paint.svg.argb32.xfail.png b/test/reference/scale-source-surface-paint.svg.argb32.xfail.png new file mode 100644 index 000000000..ed946d4d4 Binary files /dev/null and b/test/reference/scale-source-surface-paint.svg.argb32.xfail.png differ diff --git a/test/reference/scale-source-surface-paint.svg.rgb24.xfail.png b/test/reference/scale-source-surface-paint.svg.rgb24.xfail.png new file mode 100644 index 000000000..7d065d405 Binary files /dev/null and b/test/reference/scale-source-surface-paint.svg.rgb24.xfail.png differ diff --git a/test/reference/select-font-face.base.argb32.ref.png b/test/reference/select-font-face.base.argb32.ref.png new file mode 100644 index 000000000..1334a9a01 Binary files /dev/null and b/test/reference/select-font-face.base.argb32.ref.png differ diff --git a/test/reference/select-font-face.base.rgb24.ref.png b/test/reference/select-font-face.base.rgb24.ref.png new file mode 100644 index 000000000..1334a9a01 Binary files /dev/null and b/test/reference/select-font-face.base.rgb24.ref.png differ diff --git a/test/reference/select-font-face.image16.ref.png b/test/reference/select-font-face.image16.ref.png new file mode 100644 index 000000000..2c3191cb9 Binary files /dev/null and b/test/reference/select-font-face.image16.ref.png differ diff --git a/test/reference/select-font-face.ps2.ref.png b/test/reference/select-font-face.ps2.ref.png new file mode 100644 index 000000000..6c2f36115 Binary files /dev/null and b/test/reference/select-font-face.ps2.ref.png differ diff --git a/test/reference/select-font-face.ps3.ref.png b/test/reference/select-font-face.ps3.ref.png new file mode 100644 index 000000000..6c2f36115 Binary files /dev/null and b/test/reference/select-font-face.ps3.ref.png differ diff --git a/test/reference/select-font-face.quartz.ref.png b/test/reference/select-font-face.quartz.ref.png new file mode 100644 index 000000000..69fd2e239 Binary files /dev/null and b/test/reference/select-font-face.quartz.ref.png differ diff --git a/test/reference/select-font-face.ref.png b/test/reference/select-font-face.ref.png new file mode 100644 index 000000000..1334a9a01 Binary files /dev/null and b/test/reference/select-font-face.ref.png differ diff --git a/test/reference/select-font-face.traps.ref.png b/test/reference/select-font-face.traps.ref.png new file mode 100644 index 000000000..1334a9a01 Binary files /dev/null and b/test/reference/select-font-face.traps.ref.png differ diff --git a/test/reference/self-copy-overlap.base.argb32.ref.png b/test/reference/self-copy-overlap.base.argb32.ref.png new file mode 100644 index 000000000..a70e819ed Binary files /dev/null and b/test/reference/self-copy-overlap.base.argb32.ref.png differ diff --git a/test/reference/self-copy-overlap.base.rgb24.ref.png b/test/reference/self-copy-overlap.base.rgb24.ref.png new file mode 100644 index 000000000..e9cd7b567 Binary files /dev/null and b/test/reference/self-copy-overlap.base.rgb24.ref.png differ diff --git a/test/reference/self-copy-overlap.mask.argb32.ref.png b/test/reference/self-copy-overlap.mask.argb32.ref.png new file mode 100644 index 000000000..a70e819ed Binary files /dev/null and b/test/reference/self-copy-overlap.mask.argb32.ref.png differ diff --git a/test/reference/self-copy-overlap.mask.rgb24.ref.png b/test/reference/self-copy-overlap.mask.rgb24.ref.png new file mode 100644 index 000000000..e9cd7b567 Binary files /dev/null and b/test/reference/self-copy-overlap.mask.rgb24.ref.png differ diff --git a/test/reference/self-copy-overlap.traps.argb32.ref.png b/test/reference/self-copy-overlap.traps.argb32.ref.png new file mode 100644 index 000000000..a70e819ed Binary files /dev/null and b/test/reference/self-copy-overlap.traps.argb32.ref.png differ diff --git a/test/reference/self-copy-overlap.traps.rgb24.ref.png b/test/reference/self-copy-overlap.traps.rgb24.ref.png new file mode 100644 index 000000000..e9cd7b567 Binary files /dev/null and b/test/reference/self-copy-overlap.traps.rgb24.ref.png differ diff --git a/test/reference/self-copy.base.argb32.ref.png b/test/reference/self-copy.base.argb32.ref.png new file mode 100644 index 000000000..daa4dcb30 Binary files /dev/null and b/test/reference/self-copy.base.argb32.ref.png differ diff --git a/test/reference/self-copy.base.rgb24.ref.png b/test/reference/self-copy.base.rgb24.ref.png new file mode 100644 index 000000000..daa4dcb30 Binary files /dev/null and b/test/reference/self-copy.base.rgb24.ref.png differ diff --git a/test/reference/self-copy.ps2.ref.png b/test/reference/self-copy.ps2.ref.png new file mode 100644 index 000000000..5c9dd5771 Binary files /dev/null and b/test/reference/self-copy.ps2.ref.png differ diff --git a/test/reference/self-copy.ps3.ref.png b/test/reference/self-copy.ps3.ref.png new file mode 100644 index 000000000..5c9dd5771 Binary files /dev/null and b/test/reference/self-copy.ps3.ref.png differ diff --git a/test/reference/self-copy.ref.png b/test/reference/self-copy.ref.png new file mode 100644 index 000000000..d8221d8a7 Binary files /dev/null and b/test/reference/self-copy.ref.png differ diff --git a/test/reference/self-copy.traps.argb32.ref.png b/test/reference/self-copy.traps.argb32.ref.png new file mode 100644 index 000000000..daa4dcb30 Binary files /dev/null and b/test/reference/self-copy.traps.argb32.ref.png differ diff --git a/test/reference/self-copy.traps.rgb24.ref.png b/test/reference/self-copy.traps.rgb24.ref.png new file mode 100644 index 000000000..daa4dcb30 Binary files /dev/null and b/test/reference/self-copy.traps.rgb24.ref.png differ diff --git a/test/reference/self-intersecting.base.argb32.ref.png b/test/reference/self-intersecting.base.argb32.ref.png new file mode 100644 index 000000000..f0068e618 Binary files /dev/null and b/test/reference/self-intersecting.base.argb32.ref.png differ diff --git a/test/reference/self-intersecting.base.rgb24.ref.png b/test/reference/self-intersecting.base.rgb24.ref.png new file mode 100644 index 000000000..f0068e618 Binary files /dev/null and b/test/reference/self-intersecting.base.rgb24.ref.png differ diff --git a/test/reference/self-intersecting.ps.ref.png b/test/reference/self-intersecting.ps.ref.png new file mode 100644 index 000000000..84fde0171 Binary files /dev/null and b/test/reference/self-intersecting.ps.ref.png differ diff --git a/test/reference/self-intersecting.quartz.xfail.png b/test/reference/self-intersecting.quartz.xfail.png new file mode 100644 index 000000000..4d087137f Binary files /dev/null and b/test/reference/self-intersecting.quartz.xfail.png differ diff --git a/test/reference/self-intersecting.ref.png b/test/reference/self-intersecting.ref.png new file mode 100644 index 000000000..d554d83ee Binary files /dev/null and b/test/reference/self-intersecting.ref.png differ diff --git a/test/reference/self-intersecting.traps.argb32.ref.png b/test/reference/self-intersecting.traps.argb32.ref.png new file mode 100644 index 000000000..f0068e618 Binary files /dev/null and b/test/reference/self-intersecting.traps.argb32.ref.png differ diff --git a/test/reference/self-intersecting.traps.rgb24.ref.png b/test/reference/self-intersecting.traps.rgb24.ref.png new file mode 100644 index 000000000..f0068e618 Binary files /dev/null and b/test/reference/self-intersecting.traps.rgb24.ref.png differ diff --git a/test/reference/set-source.base.argb32.ref.png b/test/reference/set-source.base.argb32.ref.png new file mode 100644 index 000000000..222b3723e Binary files /dev/null and b/test/reference/set-source.base.argb32.ref.png differ diff --git a/test/reference/set-source.base.rgb24.ref.png b/test/reference/set-source.base.rgb24.ref.png new file mode 100644 index 000000000..5e13c82e7 Binary files /dev/null and b/test/reference/set-source.base.rgb24.ref.png differ diff --git a/test/reference/set-source.ref.png b/test/reference/set-source.ref.png new file mode 100644 index 000000000..19793e026 Binary files /dev/null and b/test/reference/set-source.ref.png differ diff --git a/test/reference/shape-general-convex.base.argb32.ref.png b/test/reference/shape-general-convex.base.argb32.ref.png new file mode 100644 index 000000000..fc2d3f0d3 Binary files /dev/null and b/test/reference/shape-general-convex.base.argb32.ref.png differ diff --git a/test/reference/shape-general-convex.base.rgb24.ref.png b/test/reference/shape-general-convex.base.rgb24.ref.png new file mode 100644 index 000000000..fc2d3f0d3 Binary files /dev/null and b/test/reference/shape-general-convex.base.rgb24.ref.png differ diff --git a/test/reference/shape-general-convex.ps.ref.png b/test/reference/shape-general-convex.ps.ref.png new file mode 100644 index 000000000..6cdd615d6 Binary files /dev/null and b/test/reference/shape-general-convex.ps.ref.png differ diff --git a/test/reference/shape-general-convex.ref.png b/test/reference/shape-general-convex.ref.png new file mode 100644 index 000000000..2f648d524 Binary files /dev/null and b/test/reference/shape-general-convex.ref.png differ diff --git a/test/reference/shape-general-convex.traps.argb32.ref.png b/test/reference/shape-general-convex.traps.argb32.ref.png new file mode 100644 index 000000000..fc2d3f0d3 Binary files /dev/null and b/test/reference/shape-general-convex.traps.argb32.ref.png differ diff --git a/test/reference/shape-general-convex.traps.rgb24.ref.png b/test/reference/shape-general-convex.traps.rgb24.ref.png new file mode 100644 index 000000000..fc2d3f0d3 Binary files /dev/null and b/test/reference/shape-general-convex.traps.rgb24.ref.png differ diff --git a/test/reference/shape-sierpinski.base.argb32.ref.png b/test/reference/shape-sierpinski.base.argb32.ref.png new file mode 100644 index 000000000..69755d27a Binary files /dev/null and b/test/reference/shape-sierpinski.base.argb32.ref.png differ diff --git a/test/reference/shape-sierpinski.base.rgb24.ref.png b/test/reference/shape-sierpinski.base.rgb24.ref.png new file mode 100644 index 000000000..69755d27a Binary files /dev/null and b/test/reference/shape-sierpinski.base.rgb24.ref.png differ diff --git a/test/reference/shape-sierpinski.pdf.argb32.ref.png b/test/reference/shape-sierpinski.pdf.argb32.ref.png new file mode 100644 index 000000000..4e70fbd60 Binary files /dev/null and b/test/reference/shape-sierpinski.pdf.argb32.ref.png differ diff --git a/test/reference/shape-sierpinski.pdf.rgb24.ref.png b/test/reference/shape-sierpinski.pdf.rgb24.ref.png new file mode 100644 index 000000000..4e70fbd60 Binary files /dev/null and b/test/reference/shape-sierpinski.pdf.rgb24.ref.png differ diff --git a/test/reference/shape-sierpinski.ps.ref.png b/test/reference/shape-sierpinski.ps.ref.png new file mode 100644 index 000000000..700c9f148 Binary files /dev/null and b/test/reference/shape-sierpinski.ps.ref.png differ diff --git a/test/reference/shape-sierpinski.ps3.argb32.ref.png b/test/reference/shape-sierpinski.ps3.argb32.ref.png new file mode 100644 index 000000000..700c9f148 Binary files /dev/null and b/test/reference/shape-sierpinski.ps3.argb32.ref.png differ diff --git a/test/reference/shape-sierpinski.ps3.rgb24.ref.png b/test/reference/shape-sierpinski.ps3.rgb24.ref.png new file mode 100644 index 000000000..700c9f148 Binary files /dev/null and b/test/reference/shape-sierpinski.ps3.rgb24.ref.png differ diff --git a/test/reference/shape-sierpinski.ref.png b/test/reference/shape-sierpinski.ref.png new file mode 100644 index 000000000..5d983671f Binary files /dev/null and b/test/reference/shape-sierpinski.ref.png differ diff --git a/test/reference/shape-sierpinski.traps.argb32.ref.png b/test/reference/shape-sierpinski.traps.argb32.ref.png new file mode 100644 index 000000000..69755d27a Binary files /dev/null and b/test/reference/shape-sierpinski.traps.argb32.ref.png differ diff --git a/test/reference/shape-sierpinski.traps.rgb24.ref.png b/test/reference/shape-sierpinski.traps.rgb24.ref.png new file mode 100644 index 000000000..69755d27a Binary files /dev/null and b/test/reference/shape-sierpinski.traps.rgb24.ref.png differ diff --git a/test/reference/show-glyphs-advance.base.argb32.ref.png b/test/reference/show-glyphs-advance.base.argb32.ref.png new file mode 100644 index 000000000..e65ad05d5 Binary files /dev/null and b/test/reference/show-glyphs-advance.base.argb32.ref.png differ diff --git a/test/reference/show-glyphs-advance.base.rgb24.ref.png b/test/reference/show-glyphs-advance.base.rgb24.ref.png new file mode 100644 index 000000000..e65ad05d5 Binary files /dev/null and b/test/reference/show-glyphs-advance.base.rgb24.ref.png differ diff --git a/test/reference/show-glyphs-advance.image16.ref.png b/test/reference/show-glyphs-advance.image16.ref.png new file mode 100644 index 000000000..dd2f18d08 Binary files /dev/null and b/test/reference/show-glyphs-advance.image16.ref.png differ diff --git a/test/reference/show-glyphs-advance.ps.ref.png b/test/reference/show-glyphs-advance.ps.ref.png new file mode 100644 index 000000000..96a80f9bc Binary files /dev/null and b/test/reference/show-glyphs-advance.ps.ref.png differ diff --git a/test/reference/show-glyphs-advance.quartz.ref.png b/test/reference/show-glyphs-advance.quartz.ref.png new file mode 100644 index 000000000..4750308fa Binary files /dev/null and b/test/reference/show-glyphs-advance.quartz.ref.png differ diff --git a/test/reference/show-glyphs-advance.ref.png b/test/reference/show-glyphs-advance.ref.png new file mode 100644 index 000000000..e65ad05d5 Binary files /dev/null and b/test/reference/show-glyphs-advance.ref.png differ diff --git a/test/reference/show-glyphs-advance.svg.ref.png b/test/reference/show-glyphs-advance.svg.ref.png new file mode 100644 index 000000000..914d4d69f Binary files /dev/null and b/test/reference/show-glyphs-advance.svg.ref.png differ diff --git a/test/reference/show-glyphs-advance.traps.ref.png b/test/reference/show-glyphs-advance.traps.ref.png new file mode 100644 index 000000000..e65ad05d5 Binary files /dev/null and b/test/reference/show-glyphs-advance.traps.ref.png differ diff --git a/test/reference/show-glyphs-many.base.argb32.ref.png b/test/reference/show-glyphs-many.base.argb32.ref.png new file mode 100644 index 000000000..b638015d3 Binary files /dev/null and b/test/reference/show-glyphs-many.base.argb32.ref.png differ diff --git a/test/reference/show-glyphs-many.base.rgb24.ref.png b/test/reference/show-glyphs-many.base.rgb24.ref.png new file mode 100644 index 000000000..b638015d3 Binary files /dev/null and b/test/reference/show-glyphs-many.base.rgb24.ref.png differ diff --git a/test/reference/show-glyphs-many.ref.png b/test/reference/show-glyphs-many.ref.png new file mode 100644 index 000000000..b61c5f7b6 Binary files /dev/null and b/test/reference/show-glyphs-many.ref.png differ diff --git a/test/reference/show-text-current-point.base.argb32.ref.png b/test/reference/show-text-current-point.base.argb32.ref.png new file mode 100644 index 000000000..d60d4ac01 Binary files /dev/null and b/test/reference/show-text-current-point.base.argb32.ref.png differ diff --git a/test/reference/show-text-current-point.base.rgb24.ref.png b/test/reference/show-text-current-point.base.rgb24.ref.png new file mode 100644 index 000000000..d60d4ac01 Binary files /dev/null and b/test/reference/show-text-current-point.base.rgb24.ref.png differ diff --git a/test/reference/show-text-current-point.image16.ref.png b/test/reference/show-text-current-point.image16.ref.png new file mode 100644 index 000000000..b2b933fba Binary files /dev/null and b/test/reference/show-text-current-point.image16.ref.png differ diff --git a/test/reference/show-text-current-point.ps2.ref.png b/test/reference/show-text-current-point.ps2.ref.png new file mode 100644 index 000000000..b42c48e7f Binary files /dev/null and b/test/reference/show-text-current-point.ps2.ref.png differ diff --git a/test/reference/show-text-current-point.ps3.ref.png b/test/reference/show-text-current-point.ps3.ref.png new file mode 100644 index 000000000..b42c48e7f Binary files /dev/null and b/test/reference/show-text-current-point.ps3.ref.png differ diff --git a/test/reference/show-text-current-point.quartz.ref.png b/test/reference/show-text-current-point.quartz.ref.png new file mode 100644 index 000000000..a5313814a Binary files /dev/null and b/test/reference/show-text-current-point.quartz.ref.png differ diff --git a/test/reference/show-text-current-point.ref.png b/test/reference/show-text-current-point.ref.png new file mode 100644 index 000000000..d60d4ac01 Binary files /dev/null and b/test/reference/show-text-current-point.ref.png differ diff --git a/test/reference/show-text-current-point.traps.ref.png b/test/reference/show-text-current-point.traps.ref.png new file mode 100644 index 000000000..d60d4ac01 Binary files /dev/null and b/test/reference/show-text-current-point.traps.ref.png differ diff --git a/test/reference/simple-edge.ref.png b/test/reference/simple-edge.ref.png new file mode 100644 index 000000000..4757b0a54 Binary files /dev/null and b/test/reference/simple-edge.ref.png differ diff --git a/test/reference/simple-edge.xfail.png b/test/reference/simple-edge.xfail.png new file mode 100644 index 000000000..2daad9783 Binary files /dev/null and b/test/reference/simple-edge.xfail.png differ diff --git a/test/reference/skew-extreme.base.argb32.ref.png b/test/reference/skew-extreme.base.argb32.ref.png new file mode 100644 index 000000000..5e00606d1 Binary files /dev/null and b/test/reference/skew-extreme.base.argb32.ref.png differ diff --git a/test/reference/skew-extreme.base.rgb24.ref.png b/test/reference/skew-extreme.base.rgb24.ref.png new file mode 100644 index 000000000..5e00606d1 Binary files /dev/null and b/test/reference/skew-extreme.base.rgb24.ref.png differ diff --git a/test/reference/skew-extreme.ps2.ref.png b/test/reference/skew-extreme.ps2.ref.png new file mode 100644 index 000000000..69f1d374f Binary files /dev/null and b/test/reference/skew-extreme.ps2.ref.png differ diff --git a/test/reference/skew-extreme.ps3.ref.png b/test/reference/skew-extreme.ps3.ref.png new file mode 100644 index 000000000..69f1d374f Binary files /dev/null and b/test/reference/skew-extreme.ps3.ref.png differ diff --git a/test/reference/skew-extreme.ref.png b/test/reference/skew-extreme.ref.png new file mode 100644 index 000000000..69e026d7e Binary files /dev/null and b/test/reference/skew-extreme.ref.png differ diff --git a/test/reference/skew-extreme.traps.argb32.ref.png b/test/reference/skew-extreme.traps.argb32.ref.png new file mode 100644 index 000000000..5e00606d1 Binary files /dev/null and b/test/reference/skew-extreme.traps.argb32.ref.png differ diff --git a/test/reference/skew-extreme.traps.rgb24.ref.png b/test/reference/skew-extreme.traps.rgb24.ref.png new file mode 100644 index 000000000..5e00606d1 Binary files /dev/null and b/test/reference/skew-extreme.traps.rgb24.ref.png differ diff --git a/test/reference/smask-fill.base.argb32.ref.png b/test/reference/smask-fill.base.argb32.ref.png new file mode 100644 index 000000000..30bc98e14 Binary files /dev/null and b/test/reference/smask-fill.base.argb32.ref.png differ diff --git a/test/reference/smask-fill.base.rgb24.ref.png b/test/reference/smask-fill.base.rgb24.ref.png new file mode 100644 index 000000000..30bc98e14 Binary files /dev/null and b/test/reference/smask-fill.base.rgb24.ref.png differ diff --git a/test/reference/smask-fill.image16.ref.png b/test/reference/smask-fill.image16.ref.png new file mode 100644 index 000000000..25a6d5b2a Binary files /dev/null and b/test/reference/smask-fill.image16.ref.png differ diff --git a/test/reference/smask-fill.pdf.ref.png b/test/reference/smask-fill.pdf.ref.png new file mode 100644 index 000000000..cfd40b07c Binary files /dev/null and b/test/reference/smask-fill.pdf.ref.png differ diff --git a/test/reference/smask-fill.quartz.ref.png b/test/reference/smask-fill.quartz.ref.png new file mode 100644 index 000000000..ae0547652 Binary files /dev/null and b/test/reference/smask-fill.quartz.ref.png differ diff --git a/test/reference/smask-fill.ref.png b/test/reference/smask-fill.ref.png new file mode 100644 index 000000000..c7aff5a1b Binary files /dev/null and b/test/reference/smask-fill.ref.png differ diff --git a/test/reference/smask-fill.svg.ref.png b/test/reference/smask-fill.svg.ref.png new file mode 100644 index 000000000..824e8cff1 Binary files /dev/null and b/test/reference/smask-fill.svg.ref.png differ diff --git a/test/reference/smask-fill.traps.argb32.ref.png b/test/reference/smask-fill.traps.argb32.ref.png new file mode 100644 index 000000000..30bc98e14 Binary files /dev/null and b/test/reference/smask-fill.traps.argb32.ref.png differ diff --git a/test/reference/smask-fill.traps.rgb24.ref.png b/test/reference/smask-fill.traps.rgb24.ref.png new file mode 100644 index 000000000..30bc98e14 Binary files /dev/null and b/test/reference/smask-fill.traps.rgb24.ref.png differ diff --git a/test/reference/smask-image-mask.base.argb32.ref.png b/test/reference/smask-image-mask.base.argb32.ref.png new file mode 100644 index 000000000..12063bda2 Binary files /dev/null and b/test/reference/smask-image-mask.base.argb32.ref.png differ diff --git a/test/reference/smask-image-mask.base.rgb24.ref.png b/test/reference/smask-image-mask.base.rgb24.ref.png new file mode 100644 index 000000000..12063bda2 Binary files /dev/null and b/test/reference/smask-image-mask.base.rgb24.ref.png differ diff --git a/test/reference/smask-image-mask.pdf.ref.png b/test/reference/smask-image-mask.pdf.ref.png new file mode 100644 index 000000000..7ac43e483 Binary files /dev/null and b/test/reference/smask-image-mask.pdf.ref.png differ diff --git a/test/reference/smask-image-mask.ref.png b/test/reference/smask-image-mask.ref.png new file mode 100644 index 000000000..12063bda2 Binary files /dev/null and b/test/reference/smask-image-mask.ref.png differ diff --git a/test/reference/smask-mask.base.argb32.ref.png b/test/reference/smask-mask.base.argb32.ref.png new file mode 100644 index 000000000..80329c263 Binary files /dev/null and b/test/reference/smask-mask.base.argb32.ref.png differ diff --git a/test/reference/smask-mask.base.rgb24.ref.png b/test/reference/smask-mask.base.rgb24.ref.png new file mode 100644 index 000000000..80329c263 Binary files /dev/null and b/test/reference/smask-mask.base.rgb24.ref.png differ diff --git a/test/reference/smask-mask.image16.ref.png b/test/reference/smask-mask.image16.ref.png new file mode 100644 index 000000000..502452157 Binary files /dev/null and b/test/reference/smask-mask.image16.ref.png differ diff --git a/test/reference/smask-mask.pdf.ref.png b/test/reference/smask-mask.pdf.ref.png new file mode 100644 index 000000000..59c97407e Binary files /dev/null and b/test/reference/smask-mask.pdf.ref.png differ diff --git a/test/reference/smask-mask.quartz.ref.png b/test/reference/smask-mask.quartz.ref.png new file mode 100644 index 000000000..98ba2996b Binary files /dev/null and b/test/reference/smask-mask.quartz.ref.png differ diff --git a/test/reference/smask-mask.ref.png b/test/reference/smask-mask.ref.png new file mode 100644 index 000000000..80329c263 Binary files /dev/null and b/test/reference/smask-mask.ref.png differ diff --git a/test/reference/smask-mask.svg.ref.png b/test/reference/smask-mask.svg.ref.png new file mode 100644 index 000000000..ae46036f4 Binary files /dev/null and b/test/reference/smask-mask.svg.ref.png differ diff --git a/test/reference/smask-paint.base.argb32.ref.png b/test/reference/smask-paint.base.argb32.ref.png new file mode 100644 index 000000000..95af29af4 Binary files /dev/null and b/test/reference/smask-paint.base.argb32.ref.png differ diff --git a/test/reference/smask-paint.base.rgb24.ref.png b/test/reference/smask-paint.base.rgb24.ref.png new file mode 100644 index 000000000..95af29af4 Binary files /dev/null and b/test/reference/smask-paint.base.rgb24.ref.png differ diff --git a/test/reference/smask-paint.image16.ref.png b/test/reference/smask-paint.image16.ref.png new file mode 100644 index 000000000..dc371dfc3 Binary files /dev/null and b/test/reference/smask-paint.image16.ref.png differ diff --git a/test/reference/smask-paint.pdf.ref.png b/test/reference/smask-paint.pdf.ref.png new file mode 100644 index 000000000..623a92dae Binary files /dev/null and b/test/reference/smask-paint.pdf.ref.png differ diff --git a/test/reference/smask-paint.quartz.ref.png b/test/reference/smask-paint.quartz.ref.png new file mode 100644 index 000000000..4ee25fd0f Binary files /dev/null and b/test/reference/smask-paint.quartz.ref.png differ diff --git a/test/reference/smask-paint.ref.png b/test/reference/smask-paint.ref.png new file mode 100644 index 000000000..95af29af4 Binary files /dev/null and b/test/reference/smask-paint.ref.png differ diff --git a/test/reference/smask-paint.svg.ref.png b/test/reference/smask-paint.svg.ref.png new file mode 100644 index 000000000..93a423fe5 Binary files /dev/null and b/test/reference/smask-paint.svg.ref.png differ diff --git a/test/reference/smask-stroke.base.argb32.ref.png b/test/reference/smask-stroke.base.argb32.ref.png new file mode 100644 index 000000000..c6a557d8b Binary files /dev/null and b/test/reference/smask-stroke.base.argb32.ref.png differ diff --git a/test/reference/smask-stroke.base.rgb24.ref.png b/test/reference/smask-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..c6a557d8b Binary files /dev/null and b/test/reference/smask-stroke.base.rgb24.ref.png differ diff --git a/test/reference/smask-stroke.image16.ref.png b/test/reference/smask-stroke.image16.ref.png new file mode 100644 index 000000000..ea2138ab3 Binary files /dev/null and b/test/reference/smask-stroke.image16.ref.png differ diff --git a/test/reference/smask-stroke.pdf.xfail.png b/test/reference/smask-stroke.pdf.xfail.png new file mode 100644 index 000000000..9a1a7713e Binary files /dev/null and b/test/reference/smask-stroke.pdf.xfail.png differ diff --git a/test/reference/smask-stroke.quartz.ref.png b/test/reference/smask-stroke.quartz.ref.png new file mode 100644 index 000000000..f6f0d1bcc Binary files /dev/null and b/test/reference/smask-stroke.quartz.ref.png differ diff --git a/test/reference/smask-stroke.ref.png b/test/reference/smask-stroke.ref.png new file mode 100644 index 000000000..5d8c79960 Binary files /dev/null and b/test/reference/smask-stroke.ref.png differ diff --git a/test/reference/smask-stroke.traps.argb32.ref.png b/test/reference/smask-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..c6a557d8b Binary files /dev/null and b/test/reference/smask-stroke.traps.argb32.ref.png differ diff --git a/test/reference/smask-stroke.traps.rgb24.ref.png b/test/reference/smask-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..c6a557d8b Binary files /dev/null and b/test/reference/smask-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/smask-text.base.argb32.ref.png b/test/reference/smask-text.base.argb32.ref.png new file mode 100644 index 000000000..344ac2089 Binary files /dev/null and b/test/reference/smask-text.base.argb32.ref.png differ diff --git a/test/reference/smask-text.base.rgb24.ref.png b/test/reference/smask-text.base.rgb24.ref.png new file mode 100644 index 000000000..344ac2089 Binary files /dev/null and b/test/reference/smask-text.base.rgb24.ref.png differ diff --git a/test/reference/smask-text.image16.ref.png b/test/reference/smask-text.image16.ref.png new file mode 100644 index 000000000..098043d67 Binary files /dev/null and b/test/reference/smask-text.image16.ref.png differ diff --git a/test/reference/smask-text.mask.argb32.ref.png b/test/reference/smask-text.mask.argb32.ref.png new file mode 100644 index 000000000..344ac2089 Binary files /dev/null and b/test/reference/smask-text.mask.argb32.ref.png differ diff --git a/test/reference/smask-text.mask.rgb24.ref.png b/test/reference/smask-text.mask.rgb24.ref.png new file mode 100644 index 000000000..344ac2089 Binary files /dev/null and b/test/reference/smask-text.mask.rgb24.ref.png differ diff --git a/test/reference/smask-text.pdf.ref.png b/test/reference/smask-text.pdf.ref.png new file mode 100644 index 000000000..fa4905627 Binary files /dev/null and b/test/reference/smask-text.pdf.ref.png differ diff --git a/test/reference/smask-text.ps2.ref.png b/test/reference/smask-text.ps2.ref.png new file mode 100644 index 000000000..ae61325cb Binary files /dev/null and b/test/reference/smask-text.ps2.ref.png differ diff --git a/test/reference/smask-text.ps3.ref.png b/test/reference/smask-text.ps3.ref.png new file mode 100644 index 000000000..ae61325cb Binary files /dev/null and b/test/reference/smask-text.ps3.ref.png differ diff --git a/test/reference/smask-text.quartz.ref.png b/test/reference/smask-text.quartz.ref.png new file mode 100644 index 000000000..096dc9853 Binary files /dev/null and b/test/reference/smask-text.quartz.ref.png differ diff --git a/test/reference/smask-text.ref.png b/test/reference/smask-text.ref.png new file mode 100644 index 000000000..66ef289ca Binary files /dev/null and b/test/reference/smask-text.ref.png differ diff --git a/test/reference/smask-text.script.ref.png b/test/reference/smask-text.script.ref.png new file mode 100644 index 000000000..62b2de5af Binary files /dev/null and b/test/reference/smask-text.script.ref.png differ diff --git a/test/reference/smask-text.svg.ref.png b/test/reference/smask-text.svg.ref.png new file mode 100644 index 000000000..65f225ea8 Binary files /dev/null and b/test/reference/smask-text.svg.ref.png differ diff --git a/test/reference/smask-text.traps.ref.png b/test/reference/smask-text.traps.ref.png new file mode 100644 index 000000000..66ef289ca Binary files /dev/null and b/test/reference/smask-text.traps.ref.png differ diff --git a/test/reference/smask-text.xlib-fallback.ref.png b/test/reference/smask-text.xlib-fallback.ref.png new file mode 100644 index 000000000..bb393b520 Binary files /dev/null and b/test/reference/smask-text.xlib-fallback.ref.png differ diff --git a/test/reference/smask.base.argb32.ref.png b/test/reference/smask.base.argb32.ref.png new file mode 100644 index 000000000..357e8e7fb Binary files /dev/null and b/test/reference/smask.base.argb32.ref.png differ diff --git a/test/reference/smask.base.rgb24.ref.png b/test/reference/smask.base.rgb24.ref.png new file mode 100644 index 000000000..357e8e7fb Binary files /dev/null and b/test/reference/smask.base.rgb24.ref.png differ diff --git a/test/reference/smask.image16.ref.png b/test/reference/smask.image16.ref.png new file mode 100644 index 000000000..d817c8014 Binary files /dev/null and b/test/reference/smask.image16.ref.png differ diff --git a/test/reference/smask.mask.argb32.ref.png b/test/reference/smask.mask.argb32.ref.png new file mode 100644 index 000000000..dab308d8e Binary files /dev/null and b/test/reference/smask.mask.argb32.ref.png differ diff --git a/test/reference/smask.mask.rgb24.ref.png b/test/reference/smask.mask.rgb24.ref.png new file mode 100644 index 000000000..dab308d8e Binary files /dev/null and b/test/reference/smask.mask.rgb24.ref.png differ diff --git a/test/reference/smask.pdf.xfail.png b/test/reference/smask.pdf.xfail.png new file mode 100644 index 000000000..f8b559cb4 Binary files /dev/null and b/test/reference/smask.pdf.xfail.png differ diff --git a/test/reference/smask.ps.ref.png b/test/reference/smask.ps.ref.png new file mode 100644 index 000000000..31ccc17b7 Binary files /dev/null and b/test/reference/smask.ps.ref.png differ diff --git a/test/reference/smask.quartz.ref.png b/test/reference/smask.quartz.ref.png new file mode 100644 index 000000000..f9ab00f85 Binary files /dev/null and b/test/reference/smask.quartz.ref.png differ diff --git a/test/reference/smask.ref.png b/test/reference/smask.ref.png new file mode 100644 index 000000000..d49e8f5a1 Binary files /dev/null and b/test/reference/smask.ref.png differ diff --git a/test/reference/smask.script.ref.png b/test/reference/smask.script.ref.png new file mode 100644 index 000000000..3b672d6e9 Binary files /dev/null and b/test/reference/smask.script.ref.png differ diff --git a/test/reference/smask.svg.ref.png b/test/reference/smask.svg.ref.png new file mode 100644 index 000000000..b9c0308d2 Binary files /dev/null and b/test/reference/smask.svg.ref.png differ diff --git a/test/reference/smask.traps.ref.png b/test/reference/smask.traps.ref.png new file mode 100644 index 000000000..357e8e7fb Binary files /dev/null and b/test/reference/smask.traps.ref.png differ diff --git a/test/reference/smask.xlib-fallback.ref.png b/test/reference/smask.xlib-fallback.ref.png new file mode 100644 index 000000000..b5919de37 Binary files /dev/null and b/test/reference/smask.xlib-fallback.ref.png differ diff --git a/test/reference/solid-pattern-cache-stress.base.argb32.ref.png b/test/reference/solid-pattern-cache-stress.base.argb32.ref.png new file mode 100644 index 000000000..08a2ce152 Binary files /dev/null and b/test/reference/solid-pattern-cache-stress.base.argb32.ref.png differ diff --git a/test/reference/solid-pattern-cache-stress.base.rgb24.ref.png b/test/reference/solid-pattern-cache-stress.base.rgb24.ref.png new file mode 100644 index 000000000..08a2ce152 Binary files /dev/null and b/test/reference/solid-pattern-cache-stress.base.rgb24.ref.png differ diff --git a/test/reference/solid-pattern-cache-stress.ref.png b/test/reference/solid-pattern-cache-stress.ref.png new file mode 100644 index 000000000..e0e8498c3 Binary files /dev/null and b/test/reference/solid-pattern-cache-stress.ref.png differ diff --git a/test/reference/source-clip-scale.base.argb32.ref.png b/test/reference/source-clip-scale.base.argb32.ref.png new file mode 100644 index 000000000..4b63ad9bf Binary files /dev/null and b/test/reference/source-clip-scale.base.argb32.ref.png differ diff --git a/test/reference/source-clip-scale.base.rgb24.ref.png b/test/reference/source-clip-scale.base.rgb24.ref.png new file mode 100644 index 000000000..4b63ad9bf Binary files /dev/null and b/test/reference/source-clip-scale.base.rgb24.ref.png differ diff --git a/test/reference/source-clip-scale.gl.ref.png b/test/reference/source-clip-scale.gl.ref.png new file mode 100644 index 000000000..fcffbef1f Binary files /dev/null and b/test/reference/source-clip-scale.gl.ref.png differ diff --git a/test/reference/source-clip-scale.pdf.ref.png b/test/reference/source-clip-scale.pdf.ref.png new file mode 100644 index 000000000..78c77106c Binary files /dev/null and b/test/reference/source-clip-scale.pdf.ref.png differ diff --git a/test/reference/source-clip-scale.ps2.argb32.ref.png b/test/reference/source-clip-scale.ps2.argb32.ref.png new file mode 100644 index 000000000..be57d7721 Binary files /dev/null and b/test/reference/source-clip-scale.ps2.argb32.ref.png differ diff --git a/test/reference/source-clip-scale.ps2.rgb24.ref.png b/test/reference/source-clip-scale.ps2.rgb24.ref.png new file mode 100644 index 000000000..be57d7721 Binary files /dev/null and b/test/reference/source-clip-scale.ps2.rgb24.ref.png differ diff --git a/test/reference/source-clip-scale.ps3.argb32.ref.png b/test/reference/source-clip-scale.ps3.argb32.ref.png new file mode 100644 index 000000000..be57d7721 Binary files /dev/null and b/test/reference/source-clip-scale.ps3.argb32.ref.png differ diff --git a/test/reference/source-clip-scale.ps3.rgb24.ref.png b/test/reference/source-clip-scale.ps3.rgb24.ref.png new file mode 100644 index 000000000..be57d7721 Binary files /dev/null and b/test/reference/source-clip-scale.ps3.rgb24.ref.png differ diff --git a/test/reference/source-clip-scale.quartz.ref.png b/test/reference/source-clip-scale.quartz.ref.png new file mode 100644 index 000000000..366500905 Binary files /dev/null and b/test/reference/source-clip-scale.quartz.ref.png differ diff --git a/test/reference/source-clip-scale.recording.ref.png b/test/reference/source-clip-scale.recording.ref.png new file mode 100644 index 000000000..bbf7c9be5 Binary files /dev/null and b/test/reference/source-clip-scale.recording.ref.png differ diff --git a/test/reference/source-clip-scale.ref.png b/test/reference/source-clip-scale.ref.png new file mode 100644 index 000000000..1519ff895 Binary files /dev/null and b/test/reference/source-clip-scale.ref.png differ diff --git a/test/reference/source-clip-scale.svg.ref.png b/test/reference/source-clip-scale.svg.ref.png new file mode 100644 index 000000000..bbf7c9be5 Binary files /dev/null and b/test/reference/source-clip-scale.svg.ref.png differ diff --git a/test/reference/source-clip.base.argb32.ref.png b/test/reference/source-clip.base.argb32.ref.png new file mode 100644 index 000000000..821bc6cab Binary files /dev/null and b/test/reference/source-clip.base.argb32.ref.png differ diff --git a/test/reference/source-clip.base.rgb24.ref.png b/test/reference/source-clip.base.rgb24.ref.png new file mode 100644 index 000000000..821bc6cab Binary files /dev/null and b/test/reference/source-clip.base.rgb24.ref.png differ diff --git a/test/reference/source-clip.ref.png b/test/reference/source-clip.ref.png new file mode 100644 index 000000000..22454bed9 Binary files /dev/null and b/test/reference/source-clip.ref.png differ diff --git a/test/reference/source-surface-scale-paint.base.argb32.ref.png b/test/reference/source-surface-scale-paint.base.argb32.ref.png new file mode 100644 index 000000000..087ef7521 Binary files /dev/null and b/test/reference/source-surface-scale-paint.base.argb32.ref.png differ diff --git a/test/reference/source-surface-scale-paint.base.rgb24.ref.png b/test/reference/source-surface-scale-paint.base.rgb24.ref.png new file mode 100644 index 000000000..322af211d Binary files /dev/null and b/test/reference/source-surface-scale-paint.base.rgb24.ref.png differ diff --git a/test/reference/source-surface-scale-paint.ref.png b/test/reference/source-surface-scale-paint.ref.png new file mode 100644 index 000000000..a81f93d94 Binary files /dev/null and b/test/reference/source-surface-scale-paint.ref.png differ diff --git a/test/reference/spline-decomposition.base.argb32.ref.png b/test/reference/spline-decomposition.base.argb32.ref.png new file mode 100644 index 000000000..babde7d72 Binary files /dev/null and b/test/reference/spline-decomposition.base.argb32.ref.png differ diff --git a/test/reference/spline-decomposition.base.rgb24.ref.png b/test/reference/spline-decomposition.base.rgb24.ref.png new file mode 100644 index 000000000..babde7d72 Binary files /dev/null and b/test/reference/spline-decomposition.base.rgb24.ref.png differ diff --git a/test/reference/spline-decomposition.image16.ref.png b/test/reference/spline-decomposition.image16.ref.png new file mode 100644 index 000000000..4084b00f9 Binary files /dev/null and b/test/reference/spline-decomposition.image16.ref.png differ diff --git a/test/reference/spline-decomposition.pdf.ref.png b/test/reference/spline-decomposition.pdf.ref.png new file mode 100644 index 000000000..5afa09498 Binary files /dev/null and b/test/reference/spline-decomposition.pdf.ref.png differ diff --git a/test/reference/spline-decomposition.ps.ref.png b/test/reference/spline-decomposition.ps.ref.png new file mode 100644 index 000000000..51e2938ac Binary files /dev/null and b/test/reference/spline-decomposition.ps.ref.png differ diff --git a/test/reference/spline-decomposition.quartz.xfail.png b/test/reference/spline-decomposition.quartz.xfail.png new file mode 100644 index 000000000..18d67fbb5 Binary files /dev/null and b/test/reference/spline-decomposition.quartz.xfail.png differ diff --git a/test/reference/spline-decomposition.ref.png b/test/reference/spline-decomposition.ref.png new file mode 100644 index 000000000..356a3a56e Binary files /dev/null and b/test/reference/spline-decomposition.ref.png differ diff --git a/test/reference/spline-decomposition.svg.ref.png b/test/reference/spline-decomposition.svg.ref.png new file mode 100644 index 000000000..5afa09498 Binary files /dev/null and b/test/reference/spline-decomposition.svg.ref.png differ diff --git a/test/reference/spline-decomposition.traps.argb32.ref.png b/test/reference/spline-decomposition.traps.argb32.ref.png new file mode 100644 index 000000000..babde7d72 Binary files /dev/null and b/test/reference/spline-decomposition.traps.argb32.ref.png differ diff --git a/test/reference/spline-decomposition.traps.rgb24.ref.png b/test/reference/spline-decomposition.traps.rgb24.ref.png new file mode 100644 index 000000000..babde7d72 Binary files /dev/null and b/test/reference/spline-decomposition.traps.rgb24.ref.png differ diff --git a/test/reference/stride-12-image.base.argb32.ref.png b/test/reference/stride-12-image.base.argb32.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/stride-12-image.base.argb32.ref.png differ diff --git a/test/reference/stride-12-image.base.rgb24.ref.png b/test/reference/stride-12-image.base.rgb24.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/stride-12-image.base.rgb24.ref.png differ diff --git a/test/reference/stride-12-image.image16.ref.png b/test/reference/stride-12-image.image16.ref.png new file mode 100644 index 000000000..4b15914f2 Binary files /dev/null and b/test/reference/stride-12-image.image16.ref.png differ diff --git a/test/reference/stride-12-image.ps.ref.png b/test/reference/stride-12-image.ps.ref.png new file mode 100644 index 000000000..953c9a18e Binary files /dev/null and b/test/reference/stride-12-image.ps.ref.png differ diff --git a/test/reference/stride-12-image.ref.png b/test/reference/stride-12-image.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/stride-12-image.ref.png differ diff --git a/test/reference/stride-12-xlib-fallback.rgb24.ref.png b/test/reference/stride-12-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/stride-12-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/stride-12-xlib-window.rgb24.ref.png b/test/reference/stride-12-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/stride-12-xlib-window.rgb24.ref.png differ diff --git a/test/reference/stride-12-xlib.ref.png b/test/reference/stride-12-xlib.ref.png new file mode 100644 index 000000000..44284566e Binary files /dev/null and b/test/reference/stride-12-xlib.ref.png differ diff --git a/test/reference/stroke-clipped.ref.png b/test/reference/stroke-clipped.ref.png new file mode 100644 index 000000000..fbe5788d5 Binary files /dev/null and b/test/reference/stroke-clipped.ref.png differ diff --git a/test/reference/stroke-ctm-caps.base.argb32.ref.png b/test/reference/stroke-ctm-caps.base.argb32.ref.png new file mode 100644 index 000000000..efe2faab3 Binary files /dev/null and b/test/reference/stroke-ctm-caps.base.argb32.ref.png differ diff --git a/test/reference/stroke-ctm-caps.base.rgb24.ref.png b/test/reference/stroke-ctm-caps.base.rgb24.ref.png new file mode 100644 index 000000000..efe2faab3 Binary files /dev/null and b/test/reference/stroke-ctm-caps.base.rgb24.ref.png differ diff --git a/test/reference/stroke-ctm-caps.image16.ref.png b/test/reference/stroke-ctm-caps.image16.ref.png new file mode 100644 index 000000000..f5f551e23 Binary files /dev/null and b/test/reference/stroke-ctm-caps.image16.ref.png differ diff --git a/test/reference/stroke-ctm-caps.mask.argb32.ref.png b/test/reference/stroke-ctm-caps.mask.argb32.ref.png new file mode 100644 index 000000000..3a77d3ea6 Binary files /dev/null and b/test/reference/stroke-ctm-caps.mask.argb32.ref.png differ diff --git a/test/reference/stroke-ctm-caps.mask.rgb24.ref.png b/test/reference/stroke-ctm-caps.mask.rgb24.ref.png new file mode 100644 index 000000000..3a77d3ea6 Binary files /dev/null and b/test/reference/stroke-ctm-caps.mask.rgb24.ref.png differ diff --git a/test/reference/stroke-ctm-caps.ps2.ref.png b/test/reference/stroke-ctm-caps.ps2.ref.png new file mode 100644 index 000000000..63c10645b Binary files /dev/null and b/test/reference/stroke-ctm-caps.ps2.ref.png differ diff --git a/test/reference/stroke-ctm-caps.ps3.ref.png b/test/reference/stroke-ctm-caps.ps3.ref.png new file mode 100644 index 000000000..63c10645b Binary files /dev/null and b/test/reference/stroke-ctm-caps.ps3.ref.png differ diff --git a/test/reference/stroke-ctm-caps.quartz.ref.png b/test/reference/stroke-ctm-caps.quartz.ref.png new file mode 100644 index 000000000..c9da2c9d3 Binary files /dev/null and b/test/reference/stroke-ctm-caps.quartz.ref.png differ diff --git a/test/reference/stroke-ctm-caps.ref.png b/test/reference/stroke-ctm-caps.ref.png new file mode 100644 index 000000000..33ff0fad7 Binary files /dev/null and b/test/reference/stroke-ctm-caps.ref.png differ diff --git a/test/reference/stroke-ctm-caps.traps.argb32.ref.png b/test/reference/stroke-ctm-caps.traps.argb32.ref.png new file mode 100644 index 000000000..efe2faab3 Binary files /dev/null and b/test/reference/stroke-ctm-caps.traps.argb32.ref.png differ diff --git a/test/reference/stroke-ctm-caps.traps.rgb24.ref.png b/test/reference/stroke-ctm-caps.traps.rgb24.ref.png new file mode 100644 index 000000000..efe2faab3 Binary files /dev/null and b/test/reference/stroke-ctm-caps.traps.rgb24.ref.png differ diff --git a/test/reference/stroke-image.base.argb32.ref.png b/test/reference/stroke-image.base.argb32.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-image.base.argb32.ref.png differ diff --git a/test/reference/stroke-image.base.rgb24.ref.png b/test/reference/stroke-image.base.rgb24.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-image.base.rgb24.ref.png differ diff --git a/test/reference/stroke-image.image16.ref.png b/test/reference/stroke-image.image16.ref.png new file mode 100644 index 000000000..cef40bda9 Binary files /dev/null and b/test/reference/stroke-image.image16.ref.png differ diff --git a/test/reference/stroke-image.pdf.ref.png b/test/reference/stroke-image.pdf.ref.png new file mode 100644 index 000000000..790369cb4 Binary files /dev/null and b/test/reference/stroke-image.pdf.ref.png differ diff --git a/test/reference/stroke-image.ps.ref.png b/test/reference/stroke-image.ps.ref.png new file mode 100644 index 000000000..71889acfd Binary files /dev/null and b/test/reference/stroke-image.ps.ref.png differ diff --git a/test/reference/stroke-image.quartz.ref.png b/test/reference/stroke-image.quartz.ref.png new file mode 100644 index 000000000..f9a60f2a6 Binary files /dev/null and b/test/reference/stroke-image.quartz.ref.png differ diff --git a/test/reference/stroke-image.ref.png b/test/reference/stroke-image.ref.png new file mode 100644 index 000000000..f126afe2c Binary files /dev/null and b/test/reference/stroke-image.ref.png differ diff --git a/test/reference/stroke-image.traps.argb32.ref.png b/test/reference/stroke-image.traps.argb32.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-image.traps.argb32.ref.png differ diff --git a/test/reference/stroke-image.traps.rgb24.ref.png b/test/reference/stroke-image.traps.rgb24.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-image.traps.rgb24.ref.png differ diff --git a/test/reference/stroke-open-box.base.argb32.ref.png b/test/reference/stroke-open-box.base.argb32.ref.png new file mode 100644 index 000000000..b5f5bd581 Binary files /dev/null and b/test/reference/stroke-open-box.base.argb32.ref.png differ diff --git a/test/reference/stroke-open-box.base.rgb24.ref.png b/test/reference/stroke-open-box.base.rgb24.ref.png new file mode 100644 index 000000000..b5f5bd581 Binary files /dev/null and b/test/reference/stroke-open-box.base.rgb24.ref.png differ diff --git a/test/reference/stroke-open-box.ref.png b/test/reference/stroke-open-box.ref.png new file mode 100644 index 000000000..b5f5bd581 Binary files /dev/null and b/test/reference/stroke-open-box.ref.png differ diff --git a/test/reference/stroke-pattern.base.argb32.ref.png b/test/reference/stroke-pattern.base.argb32.ref.png new file mode 100644 index 000000000..67bb03143 Binary files /dev/null and b/test/reference/stroke-pattern.base.argb32.ref.png differ diff --git a/test/reference/stroke-pattern.base.rgb24.ref.png b/test/reference/stroke-pattern.base.rgb24.ref.png new file mode 100644 index 000000000..67bb03143 Binary files /dev/null and b/test/reference/stroke-pattern.base.rgb24.ref.png differ diff --git a/test/reference/stroke-pattern.ref.png b/test/reference/stroke-pattern.ref.png new file mode 100644 index 000000000..e299c5869 Binary files /dev/null and b/test/reference/stroke-pattern.ref.png differ diff --git a/test/reference/stroke-pattern.traps.ref.png b/test/reference/stroke-pattern.traps.ref.png new file mode 100644 index 000000000..67bb03143 Binary files /dev/null and b/test/reference/stroke-pattern.traps.ref.png differ diff --git a/test/reference/stroke-xlib-fallback.rgb24.ref.png b/test/reference/stroke-xlib-fallback.rgb24.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-xlib-fallback.rgb24.ref.png differ diff --git a/test/reference/stroke-xlib-window.rgb24.ref.png b/test/reference/stroke-xlib-window.rgb24.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-xlib-window.rgb24.ref.png differ diff --git a/test/reference/stroke-xlib.ref.png b/test/reference/stroke-xlib.ref.png new file mode 100644 index 000000000..75737d57c Binary files /dev/null and b/test/reference/stroke-xlib.ref.png differ diff --git a/test/reference/stroke.image.argb32.ref.png b/test/reference/stroke.image.argb32.ref.png new file mode 100644 index 000000000..0dc701f2e Binary files /dev/null and b/test/reference/stroke.image.argb32.ref.png differ diff --git a/test/reference/stroke.image.rgb24.ref.png b/test/reference/stroke.image.rgb24.ref.png new file mode 100644 index 000000000..0dc701f2e Binary files /dev/null and b/test/reference/stroke.image.rgb24.ref.png differ diff --git a/test/reference/subsurface-image-repeat.base.argb32.ref.png b/test/reference/subsurface-image-repeat.base.argb32.ref.png new file mode 100644 index 000000000..3dd6306a0 Binary files /dev/null and b/test/reference/subsurface-image-repeat.base.argb32.ref.png differ diff --git a/test/reference/subsurface-image-repeat.base.rgb24.ref.png b/test/reference/subsurface-image-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..3dd6306a0 Binary files /dev/null and b/test/reference/subsurface-image-repeat.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-image-repeat.image16.ref.png b/test/reference/subsurface-image-repeat.image16.ref.png new file mode 100644 index 000000000..a62f21078 Binary files /dev/null and b/test/reference/subsurface-image-repeat.image16.ref.png differ diff --git a/test/reference/subsurface-image-repeat.ref.png b/test/reference/subsurface-image-repeat.ref.png new file mode 100644 index 000000000..3dd6306a0 Binary files /dev/null and b/test/reference/subsurface-image-repeat.ref.png differ diff --git a/test/reference/subsurface-modify-child.base.argb32.ref.png b/test/reference/subsurface-modify-child.base.argb32.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-modify-child.base.argb32.ref.png differ diff --git a/test/reference/subsurface-modify-child.base.rgb24.ref.png b/test/reference/subsurface-modify-child.base.rgb24.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-modify-child.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-modify-child.ref.png b/test/reference/subsurface-modify-child.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-modify-child.ref.png differ diff --git a/test/reference/subsurface-modify-parent.base.argb32.ref.png b/test/reference/subsurface-modify-parent.base.argb32.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-modify-parent.base.argb32.ref.png differ diff --git a/test/reference/subsurface-modify-parent.base.rgb24.ref.png b/test/reference/subsurface-modify-parent.base.rgb24.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-modify-parent.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-modify-parent.ref.png b/test/reference/subsurface-modify-parent.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-modify-parent.ref.png differ diff --git a/test/reference/subsurface-outside-target.base.argb32.ref.png b/test/reference/subsurface-outside-target.base.argb32.ref.png new file mode 100644 index 000000000..337cdd803 Binary files /dev/null and b/test/reference/subsurface-outside-target.base.argb32.ref.png differ diff --git a/test/reference/subsurface-outside-target.base.rgb24.ref.png b/test/reference/subsurface-outside-target.base.rgb24.ref.png new file mode 100644 index 000000000..368936e5c Binary files /dev/null and b/test/reference/subsurface-outside-target.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-outside-target.ref.png b/test/reference/subsurface-outside-target.ref.png new file mode 100644 index 000000000..337cdd803 Binary files /dev/null and b/test/reference/subsurface-outside-target.ref.png differ diff --git a/test/reference/subsurface-pad.base.argb32.ref.png b/test/reference/subsurface-pad.base.argb32.ref.png new file mode 100644 index 000000000..eeb9f8f59 Binary files /dev/null and b/test/reference/subsurface-pad.base.argb32.ref.png differ diff --git a/test/reference/subsurface-pad.base.rgb24.ref.png b/test/reference/subsurface-pad.base.rgb24.ref.png new file mode 100644 index 000000000..eeb9f8f59 Binary files /dev/null and b/test/reference/subsurface-pad.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-pad.quartz.xfail.png b/test/reference/subsurface-pad.quartz.xfail.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-pad.quartz.xfail.png differ diff --git a/test/reference/subsurface-pad.ref.png b/test/reference/subsurface-pad.ref.png new file mode 100644 index 000000000..eeb9f8f59 Binary files /dev/null and b/test/reference/subsurface-pad.ref.png differ diff --git a/test/reference/subsurface-reflect.base.argb32.ref.png b/test/reference/subsurface-reflect.base.argb32.ref.png new file mode 100644 index 000000000..55643f448 Binary files /dev/null and b/test/reference/subsurface-reflect.base.argb32.ref.png differ diff --git a/test/reference/subsurface-reflect.base.rgb24.ref.png b/test/reference/subsurface-reflect.base.rgb24.ref.png new file mode 100644 index 000000000..55643f448 Binary files /dev/null and b/test/reference/subsurface-reflect.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-reflect.ref.png b/test/reference/subsurface-reflect.ref.png new file mode 100644 index 000000000..55643f448 Binary files /dev/null and b/test/reference/subsurface-reflect.ref.png differ diff --git a/test/reference/subsurface-repeat.base.argb32.ref.png b/test/reference/subsurface-repeat.base.argb32.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-repeat.base.argb32.ref.png differ diff --git a/test/reference/subsurface-repeat.base.rgb24.ref.png b/test/reference/subsurface-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-repeat.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-repeat.ref.png b/test/reference/subsurface-repeat.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-repeat.ref.png differ diff --git a/test/reference/subsurface-scale.base.argb32.ref.png b/test/reference/subsurface-scale.base.argb32.ref.png new file mode 100644 index 000000000..3b70c2fb4 Binary files /dev/null and b/test/reference/subsurface-scale.base.argb32.ref.png differ diff --git a/test/reference/subsurface-scale.base.rgb24.ref.png b/test/reference/subsurface-scale.base.rgb24.ref.png new file mode 100644 index 000000000..3b70c2fb4 Binary files /dev/null and b/test/reference/subsurface-scale.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-scale.ref.png b/test/reference/subsurface-scale.ref.png new file mode 100644 index 000000000..69bb0fb9a Binary files /dev/null and b/test/reference/subsurface-scale.ref.png differ diff --git a/test/reference/subsurface-scale.traps.argb32.ref.png b/test/reference/subsurface-scale.traps.argb32.ref.png new file mode 100644 index 000000000..3b70c2fb4 Binary files /dev/null and b/test/reference/subsurface-scale.traps.argb32.ref.png differ diff --git a/test/reference/subsurface-scale.traps.rgb24.ref.png b/test/reference/subsurface-scale.traps.rgb24.ref.png new file mode 100644 index 000000000..3b70c2fb4 Binary files /dev/null and b/test/reference/subsurface-scale.traps.rgb24.ref.png differ diff --git a/test/reference/subsurface-similar-repeat.base.argb32.ref.png b/test/reference/subsurface-similar-repeat.base.argb32.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-similar-repeat.base.argb32.ref.png differ diff --git a/test/reference/subsurface-similar-repeat.base.rgb24.ref.png b/test/reference/subsurface-similar-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-similar-repeat.base.rgb24.ref.png differ diff --git a/test/reference/subsurface-similar-repeat.ref.png b/test/reference/subsurface-similar-repeat.ref.png new file mode 100644 index 000000000..c37e22e36 Binary files /dev/null and b/test/reference/subsurface-similar-repeat.ref.png differ diff --git a/test/reference/subsurface.base.argb32.ref.png b/test/reference/subsurface.base.argb32.ref.png new file mode 100644 index 000000000..d2035592e Binary files /dev/null and b/test/reference/subsurface.base.argb32.ref.png differ diff --git a/test/reference/subsurface.base.rgb24.ref.png b/test/reference/subsurface.base.rgb24.ref.png new file mode 100644 index 000000000..d2035592e Binary files /dev/null and b/test/reference/subsurface.base.rgb24.ref.png differ diff --git a/test/reference/subsurface.image16.ref.png b/test/reference/subsurface.image16.ref.png new file mode 100644 index 000000000..ba9b7ed07 Binary files /dev/null and b/test/reference/subsurface.image16.ref.png differ diff --git a/test/reference/subsurface.ps.ref.png b/test/reference/subsurface.ps.ref.png new file mode 100644 index 000000000..51e19fcf7 Binary files /dev/null and b/test/reference/subsurface.ps.ref.png differ diff --git a/test/reference/subsurface.ref.png b/test/reference/subsurface.ref.png new file mode 100644 index 000000000..feeb5dc8a Binary files /dev/null and b/test/reference/subsurface.ref.png differ diff --git a/test/reference/subsurface.traps.argb32.ref.png b/test/reference/subsurface.traps.argb32.ref.png new file mode 100644 index 000000000..d2035592e Binary files /dev/null and b/test/reference/subsurface.traps.argb32.ref.png differ diff --git a/test/reference/subsurface.traps.rgb24.ref.png b/test/reference/subsurface.traps.rgb24.ref.png new file mode 100644 index 000000000..d2035592e Binary files /dev/null and b/test/reference/subsurface.traps.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-big-scale-down.base.argb32.ref.png b/test/reference/surface-pattern-big-scale-down.base.argb32.ref.png new file mode 100644 index 000000000..c05099077 Binary files /dev/null and b/test/reference/surface-pattern-big-scale-down.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-big-scale-down.base.rgb24.ref.png b/test/reference/surface-pattern-big-scale-down.base.rgb24.ref.png new file mode 100644 index 000000000..c05099077 Binary files /dev/null and b/test/reference/surface-pattern-big-scale-down.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-big-scale-down.ps.ref.png b/test/reference/surface-pattern-big-scale-down.ps.ref.png new file mode 100644 index 000000000..13fb09362 Binary files /dev/null and b/test/reference/surface-pattern-big-scale-down.ps.ref.png differ diff --git a/test/reference/surface-pattern-big-scale-down.quartz.ref.png b/test/reference/surface-pattern-big-scale-down.quartz.ref.png new file mode 100644 index 000000000..32deb2d9b Binary files /dev/null and b/test/reference/surface-pattern-big-scale-down.quartz.ref.png differ diff --git a/test/reference/surface-pattern-big-scale-down.ref.png b/test/reference/surface-pattern-big-scale-down.ref.png new file mode 100644 index 000000000..c05099077 Binary files /dev/null and b/test/reference/surface-pattern-big-scale-down.ref.png differ diff --git a/test/reference/surface-pattern-operator.argb32.ref.png b/test/reference/surface-pattern-operator.argb32.ref.png new file mode 100644 index 000000000..67573715c Binary files /dev/null and b/test/reference/surface-pattern-operator.argb32.ref.png differ diff --git a/test/reference/surface-pattern-operator.base.argb32.ref.png b/test/reference/surface-pattern-operator.base.argb32.ref.png new file mode 100644 index 000000000..c274fcf71 Binary files /dev/null and b/test/reference/surface-pattern-operator.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-operator.base.rgb24.ref.png b/test/reference/surface-pattern-operator.base.rgb24.ref.png new file mode 100644 index 000000000..23e540df5 Binary files /dev/null and b/test/reference/surface-pattern-operator.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-operator.image16.ref.png b/test/reference/surface-pattern-operator.image16.ref.png new file mode 100644 index 000000000..507e49c83 Binary files /dev/null and b/test/reference/surface-pattern-operator.image16.ref.png differ diff --git a/test/reference/surface-pattern-operator.pdf.argb32.xfail.png b/test/reference/surface-pattern-operator.pdf.argb32.xfail.png new file mode 100644 index 000000000..371d08474 Binary files /dev/null and b/test/reference/surface-pattern-operator.pdf.argb32.xfail.png differ diff --git a/test/reference/surface-pattern-operator.pdf.rgb24.xfail.png b/test/reference/surface-pattern-operator.pdf.rgb24.xfail.png new file mode 100644 index 000000000..a2da18d22 Binary files /dev/null and b/test/reference/surface-pattern-operator.pdf.rgb24.xfail.png differ diff --git a/test/reference/surface-pattern-operator.quartz.argb32.ref.png b/test/reference/surface-pattern-operator.quartz.argb32.ref.png new file mode 100644 index 000000000..5e934b211 Binary files /dev/null and b/test/reference/surface-pattern-operator.quartz.argb32.ref.png differ diff --git a/test/reference/surface-pattern-operator.quartz.rgb24.ref.png b/test/reference/surface-pattern-operator.quartz.rgb24.ref.png new file mode 100644 index 000000000..30408c1f4 Binary files /dev/null and b/test/reference/surface-pattern-operator.quartz.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-operator.rgb24.ref.png b/test/reference/surface-pattern-operator.rgb24.ref.png new file mode 100644 index 000000000..aee0959c2 Binary files /dev/null and b/test/reference/surface-pattern-operator.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-operator.traps.argb32.ref.png b/test/reference/surface-pattern-operator.traps.argb32.ref.png new file mode 100644 index 000000000..c274fcf71 Binary files /dev/null and b/test/reference/surface-pattern-operator.traps.argb32.ref.png differ diff --git a/test/reference/surface-pattern-operator.traps.rgb24.ref.png b/test/reference/surface-pattern-operator.traps.rgb24.ref.png new file mode 100644 index 000000000..23e540df5 Binary files /dev/null and b/test/reference/surface-pattern-operator.traps.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-none.base.argb32.ref.png b/test/reference/surface-pattern-scale-down-extend-none.base.argb32.ref.png new file mode 100644 index 000000000..9df14cc5c Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-none.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-none.base.rgb24.ref.png b/test/reference/surface-pattern-scale-down-extend-none.base.rgb24.ref.png new file mode 100644 index 000000000..9df14cc5c Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-none.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-none.quartz.ref.png b/test/reference/surface-pattern-scale-down-extend-none.quartz.ref.png new file mode 100644 index 000000000..e126cbb31 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-none.quartz.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-none.ref.png b/test/reference/surface-pattern-scale-down-extend-none.ref.png new file mode 100644 index 000000000..9df14cc5c Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-none.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-pad.base.argb32.ref.png b/test/reference/surface-pattern-scale-down-extend-pad.base.argb32.ref.png new file mode 100644 index 000000000..2ee941907 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-pad.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-pad.base.rgb24.ref.png b/test/reference/surface-pattern-scale-down-extend-pad.base.rgb24.ref.png new file mode 100644 index 000000000..2ee941907 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-pad.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-pad.quartz.xfail.png b/test/reference/surface-pattern-scale-down-extend-pad.quartz.xfail.png new file mode 100644 index 000000000..6b8f7540e Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-pad.quartz.xfail.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-pad.ref.png b/test/reference/surface-pattern-scale-down-extend-pad.ref.png new file mode 100644 index 000000000..2ee941907 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-pad.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-reflect.base.argb32.ref.png b/test/reference/surface-pattern-scale-down-extend-reflect.base.argb32.ref.png new file mode 100644 index 000000000..f2e93a7dd Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-reflect.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-reflect.base.rgb24.ref.png b/test/reference/surface-pattern-scale-down-extend-reflect.base.rgb24.ref.png new file mode 100644 index 000000000..f2e93a7dd Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-reflect.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-reflect.quartz.ref.png b/test/reference/surface-pattern-scale-down-extend-reflect.quartz.ref.png new file mode 100644 index 000000000..ef5e62e11 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-reflect.quartz.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-reflect.ref.png b/test/reference/surface-pattern-scale-down-extend-reflect.ref.png new file mode 100644 index 000000000..f2e93a7dd Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-reflect.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-repeat.base.argb32.ref.png b/test/reference/surface-pattern-scale-down-extend-repeat.base.argb32.ref.png new file mode 100644 index 000000000..c5cff0fe3 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-repeat.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-repeat.base.rgb24.ref.png b/test/reference/surface-pattern-scale-down-extend-repeat.base.rgb24.ref.png new file mode 100644 index 000000000..c5cff0fe3 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-repeat.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-repeat.quartz.ref.png b/test/reference/surface-pattern-scale-down-extend-repeat.quartz.ref.png new file mode 100644 index 000000000..6b8f7540e Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-repeat.quartz.ref.png differ diff --git a/test/reference/surface-pattern-scale-down-extend-repeat.ref.png b/test/reference/surface-pattern-scale-down-extend-repeat.ref.png new file mode 100644 index 000000000..c5cff0fe3 Binary files /dev/null and b/test/reference/surface-pattern-scale-down-extend-repeat.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.base.argb32.ref.png b/test/reference/surface-pattern-scale-down.base.argb32.ref.png new file mode 100644 index 000000000..8bb58a2a1 Binary files /dev/null and b/test/reference/surface-pattern-scale-down.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.base.rgb24.ref.png b/test/reference/surface-pattern-scale-down.base.rgb24.ref.png new file mode 100644 index 000000000..8bb58a2a1 Binary files /dev/null and b/test/reference/surface-pattern-scale-down.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.image16.ref.png b/test/reference/surface-pattern-scale-down.image16.ref.png new file mode 100644 index 000000000..8be8fb0e4 Binary files /dev/null and b/test/reference/surface-pattern-scale-down.image16.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.pdf.ref.png b/test/reference/surface-pattern-scale-down.pdf.ref.png new file mode 100644 index 000000000..1e32a44bb Binary files /dev/null and b/test/reference/surface-pattern-scale-down.pdf.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.ps2.ref.png b/test/reference/surface-pattern-scale-down.ps2.ref.png new file mode 100644 index 000000000..5fb6395ce Binary files /dev/null and b/test/reference/surface-pattern-scale-down.ps2.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.ps3.ref.png b/test/reference/surface-pattern-scale-down.ps3.ref.png new file mode 100644 index 000000000..5fb6395ce Binary files /dev/null and b/test/reference/surface-pattern-scale-down.ps3.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.quartz.ref.png b/test/reference/surface-pattern-scale-down.quartz.ref.png new file mode 100644 index 000000000..5b3ace4ae Binary files /dev/null and b/test/reference/surface-pattern-scale-down.quartz.ref.png differ diff --git a/test/reference/surface-pattern-scale-down.ref.png b/test/reference/surface-pattern-scale-down.ref.png new file mode 100644 index 000000000..8bb58a2a1 Binary files /dev/null and b/test/reference/surface-pattern-scale-down.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.base.argb32.ref.png b/test/reference/surface-pattern-scale-up.base.argb32.ref.png new file mode 100644 index 000000000..e8d84e2b4 Binary files /dev/null and b/test/reference/surface-pattern-scale-up.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.base.rgb24.ref.png b/test/reference/surface-pattern-scale-up.base.rgb24.ref.png new file mode 100644 index 000000000..e8d84e2b4 Binary files /dev/null and b/test/reference/surface-pattern-scale-up.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.image16.ref.png b/test/reference/surface-pattern-scale-up.image16.ref.png new file mode 100644 index 000000000..5207bd3bc Binary files /dev/null and b/test/reference/surface-pattern-scale-up.image16.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.pdf.ref.png b/test/reference/surface-pattern-scale-up.pdf.ref.png new file mode 100644 index 000000000..593d058aa Binary files /dev/null and b/test/reference/surface-pattern-scale-up.pdf.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.ps2.ref.png b/test/reference/surface-pattern-scale-up.ps2.ref.png new file mode 100644 index 000000000..f2eac7a78 Binary files /dev/null and b/test/reference/surface-pattern-scale-up.ps2.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.ps3.ref.png b/test/reference/surface-pattern-scale-up.ps3.ref.png new file mode 100644 index 000000000..f2eac7a78 Binary files /dev/null and b/test/reference/surface-pattern-scale-up.ps3.ref.png differ diff --git a/test/reference/surface-pattern-scale-up.quartz.xfail.png b/test/reference/surface-pattern-scale-up.quartz.xfail.png new file mode 100644 index 000000000..ed52ee80a Binary files /dev/null and b/test/reference/surface-pattern-scale-up.quartz.xfail.png differ diff --git a/test/reference/surface-pattern-scale-up.ref.png b/test/reference/surface-pattern-scale-up.ref.png new file mode 100644 index 000000000..e8d84e2b4 Binary files /dev/null and b/test/reference/surface-pattern-scale-up.ref.png differ diff --git a/test/reference/surface-pattern.base.argb32.ref.png b/test/reference/surface-pattern.base.argb32.ref.png new file mode 100644 index 000000000..079ebfba1 Binary files /dev/null and b/test/reference/surface-pattern.base.argb32.ref.png differ diff --git a/test/reference/surface-pattern.base.rgb24.ref.png b/test/reference/surface-pattern.base.rgb24.ref.png new file mode 100644 index 000000000..079ebfba1 Binary files /dev/null and b/test/reference/surface-pattern.base.rgb24.ref.png differ diff --git a/test/reference/surface-pattern.image16.ref.png b/test/reference/surface-pattern.image16.ref.png new file mode 100644 index 000000000..909009702 Binary files /dev/null and b/test/reference/surface-pattern.image16.ref.png differ diff --git a/test/reference/surface-pattern.pdf.xfail.png b/test/reference/surface-pattern.pdf.xfail.png new file mode 100644 index 000000000..fadc2c240 Binary files /dev/null and b/test/reference/surface-pattern.pdf.xfail.png differ diff --git a/test/reference/surface-pattern.ps.xfail.png b/test/reference/surface-pattern.ps.xfail.png new file mode 100644 index 000000000..02fbde847 Binary files /dev/null and b/test/reference/surface-pattern.ps.xfail.png differ diff --git a/test/reference/surface-pattern.quartz.xfail.png b/test/reference/surface-pattern.quartz.xfail.png new file mode 100644 index 000000000..4ac47de5e Binary files /dev/null and b/test/reference/surface-pattern.quartz.xfail.png differ diff --git a/test/reference/surface-pattern.ref.png b/test/reference/surface-pattern.ref.png new file mode 100644 index 000000000..079ebfba1 Binary files /dev/null and b/test/reference/surface-pattern.ref.png differ diff --git a/test/reference/surface-pattern.svg.xfail.png b/test/reference/surface-pattern.svg.xfail.png new file mode 100644 index 000000000..cdbcf476b Binary files /dev/null and b/test/reference/surface-pattern.svg.xfail.png differ diff --git a/test/reference/svg-surface-source.base.argb32.ref.png b/test/reference/svg-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/svg-surface-source.base.argb32.ref.png differ diff --git a/test/reference/svg-surface-source.base.rgb24.ref.png b/test/reference/svg-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/svg-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/svg-surface-source.image16.ref.png b/test/reference/svg-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/svg-surface-source.image16.ref.png differ diff --git a/test/reference/svg-surface-source.ref.png b/test/reference/svg-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/svg-surface-source.ref.png differ diff --git a/test/reference/svg-surface-source.svg12.argb32.xfail.png b/test/reference/svg-surface-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/svg-surface-source.svg12.argb32.xfail.png differ diff --git a/test/reference/svg-surface-source.svg12.rgb24.xfail.png b/test/reference/svg-surface-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/svg-surface-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/text-antialias-gray.base.argb32.ref.png b/test/reference/text-antialias-gray.base.argb32.ref.png new file mode 100644 index 000000000..06b805eaa Binary files /dev/null and b/test/reference/text-antialias-gray.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-gray.base.rgb24.ref.png b/test/reference/text-antialias-gray.base.rgb24.ref.png new file mode 100644 index 000000000..06b805eaa Binary files /dev/null and b/test/reference/text-antialias-gray.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-gray.image16.ref.png b/test/reference/text-antialias-gray.image16.ref.png new file mode 100644 index 000000000..c86dbae5d Binary files /dev/null and b/test/reference/text-antialias-gray.image16.ref.png differ diff --git a/test/reference/text-antialias-gray.quartz.ref.png b/test/reference/text-antialias-gray.quartz.ref.png new file mode 100644 index 000000000..63926a8eb Binary files /dev/null and b/test/reference/text-antialias-gray.quartz.ref.png differ diff --git a/test/reference/text-antialias-gray.ref.png b/test/reference/text-antialias-gray.ref.png new file mode 100644 index 000000000..06b805eaa Binary files /dev/null and b/test/reference/text-antialias-gray.ref.png differ diff --git a/test/reference/text-antialias-gray.traps.ref.png b/test/reference/text-antialias-gray.traps.ref.png new file mode 100644 index 000000000..06b805eaa Binary files /dev/null and b/test/reference/text-antialias-gray.traps.ref.png differ diff --git a/test/reference/text-antialias-none.base.argb32.ref.png b/test/reference/text-antialias-none.base.argb32.ref.png new file mode 100644 index 000000000..86c09cd36 Binary files /dev/null and b/test/reference/text-antialias-none.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-none.base.rgb24.ref.png b/test/reference/text-antialias-none.base.rgb24.ref.png new file mode 100644 index 000000000..86c09cd36 Binary files /dev/null and b/test/reference/text-antialias-none.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-none.quartz.ref.png b/test/reference/text-antialias-none.quartz.ref.png new file mode 100644 index 000000000..872b21d64 Binary files /dev/null and b/test/reference/text-antialias-none.quartz.ref.png differ diff --git a/test/reference/text-antialias-none.ref.png b/test/reference/text-antialias-none.ref.png new file mode 100644 index 000000000..bdd77bd56 Binary files /dev/null and b/test/reference/text-antialias-none.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.base.argb32.ref.png b/test/reference/text-antialias-subpixel-bgr.base.argb32.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.base.rgb24.ref.png b/test/reference/text-antialias-subpixel-bgr.base.rgb24.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.image16.ref.png b/test/reference/text-antialias-subpixel-bgr.image16.ref.png new file mode 100644 index 000000000..5a4e193b7 Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.image16.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.mask.argb32.ref.png b/test/reference/text-antialias-subpixel-bgr.mask.argb32.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.mask.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.mask.rgb24.ref.png b/test/reference/text-antialias-subpixel-bgr.mask.rgb24.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.mask.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.ref.png b/test/reference/text-antialias-subpixel-bgr.ref.png new file mode 100644 index 000000000..c36218295 Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.ref.png differ diff --git a/test/reference/text-antialias-subpixel-bgr.traps.ref.png b/test/reference/text-antialias-subpixel-bgr.traps.ref.png new file mode 100644 index 000000000..a221472df Binary files /dev/null and b/test/reference/text-antialias-subpixel-bgr.traps.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.base.argb32.ref.png b/test/reference/text-antialias-subpixel-rgb.base.argb32.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.base.rgb24.ref.png b/test/reference/text-antialias-subpixel-rgb.base.rgb24.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.image16.ref.png b/test/reference/text-antialias-subpixel-rgb.image16.ref.png new file mode 100644 index 000000000..cf049b961 Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.image16.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.mask.argb32.ref.png b/test/reference/text-antialias-subpixel-rgb.mask.argb32.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.mask.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.mask.rgb24.ref.png b/test/reference/text-antialias-subpixel-rgb.mask.rgb24.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.mask.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.ref.png b/test/reference/text-antialias-subpixel-rgb.ref.png new file mode 100644 index 000000000..0cbf3f1f2 Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.ref.png differ diff --git a/test/reference/text-antialias-subpixel-rgb.traps.ref.png b/test/reference/text-antialias-subpixel-rgb.traps.ref.png new file mode 100644 index 000000000..af5e0aef5 Binary files /dev/null and b/test/reference/text-antialias-subpixel-rgb.traps.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.base.argb32.ref.png b/test/reference/text-antialias-subpixel-vbgr.base.argb32.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.base.rgb24.ref.png b/test/reference/text-antialias-subpixel-vbgr.base.rgb24.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.image16.ref.png b/test/reference/text-antialias-subpixel-vbgr.image16.ref.png new file mode 100644 index 000000000..6ef721a7d Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.image16.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.mask.argb32.ref.png b/test/reference/text-antialias-subpixel-vbgr.mask.argb32.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.mask.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.mask.rgb24.ref.png b/test/reference/text-antialias-subpixel-vbgr.mask.rgb24.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.mask.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.ref.png b/test/reference/text-antialias-subpixel-vbgr.ref.png new file mode 100644 index 000000000..7c89df9ea Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vbgr.traps.ref.png b/test/reference/text-antialias-subpixel-vbgr.traps.ref.png new file mode 100644 index 000000000..905579b66 Binary files /dev/null and b/test/reference/text-antialias-subpixel-vbgr.traps.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.base.argb32.ref.png b/test/reference/text-antialias-subpixel-vrgb.base.argb32.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.base.rgb24.ref.png b/test/reference/text-antialias-subpixel-vrgb.base.rgb24.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.image16.ref.png b/test/reference/text-antialias-subpixel-vrgb.image16.ref.png new file mode 100644 index 000000000..cb3586b95 Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.image16.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.mask.argb32.ref.png b/test/reference/text-antialias-subpixel-vrgb.mask.argb32.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.mask.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.mask.rgb24.ref.png b/test/reference/text-antialias-subpixel-vrgb.mask.rgb24.ref.png new file mode 100644 index 000000000..9fd35ea2c Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.mask.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.ref.png b/test/reference/text-antialias-subpixel-vrgb.ref.png new file mode 100644 index 000000000..103c7e416 Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.ref.png differ diff --git a/test/reference/text-antialias-subpixel-vrgb.traps.ref.png b/test/reference/text-antialias-subpixel-vrgb.traps.ref.png new file mode 100644 index 000000000..f7c5befa9 Binary files /dev/null and b/test/reference/text-antialias-subpixel-vrgb.traps.ref.png differ diff --git a/test/reference/text-antialias-subpixel.base.argb32.ref.png b/test/reference/text-antialias-subpixel.base.argb32.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel.base.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel.base.argb32.xfail.png b/test/reference/text-antialias-subpixel.base.argb32.xfail.png new file mode 100644 index 000000000..4a6bde49a Binary files /dev/null and b/test/reference/text-antialias-subpixel.base.argb32.xfail.png differ diff --git a/test/reference/text-antialias-subpixel.base.rgb24.ref.png b/test/reference/text-antialias-subpixel.base.rgb24.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel.base.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel.base.rgb24.xfail.png b/test/reference/text-antialias-subpixel.base.rgb24.xfail.png new file mode 100644 index 000000000..4a6bde49a Binary files /dev/null and b/test/reference/text-antialias-subpixel.base.rgb24.xfail.png differ diff --git a/test/reference/text-antialias-subpixel.image16.ref.png b/test/reference/text-antialias-subpixel.image16.ref.png new file mode 100644 index 000000000..81fad89d0 Binary files /dev/null and b/test/reference/text-antialias-subpixel.image16.ref.png differ diff --git a/test/reference/text-antialias-subpixel.mask.argb32.ref.png b/test/reference/text-antialias-subpixel.mask.argb32.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel.mask.argb32.ref.png differ diff --git a/test/reference/text-antialias-subpixel.mask.rgb24.ref.png b/test/reference/text-antialias-subpixel.mask.rgb24.ref.png new file mode 100644 index 000000000..f8d5130af Binary files /dev/null and b/test/reference/text-antialias-subpixel.mask.rgb24.ref.png differ diff --git a/test/reference/text-antialias-subpixel.quartz.ref.png b/test/reference/text-antialias-subpixel.quartz.ref.png new file mode 100644 index 000000000..f5b1aa8f0 Binary files /dev/null and b/test/reference/text-antialias-subpixel.quartz.ref.png differ diff --git a/test/reference/text-antialias-subpixel.ref.png b/test/reference/text-antialias-subpixel.ref.png new file mode 100644 index 000000000..0cbf3f1f2 Binary files /dev/null and b/test/reference/text-antialias-subpixel.ref.png differ diff --git a/test/reference/text-antialias-subpixel.traps.ref.png b/test/reference/text-antialias-subpixel.traps.ref.png new file mode 100644 index 000000000..af5e0aef5 Binary files /dev/null and b/test/reference/text-antialias-subpixel.traps.ref.png differ diff --git a/test/reference/text-glyph-range.base.argb32.ref.png b/test/reference/text-glyph-range.base.argb32.ref.png new file mode 100644 index 000000000..326869923 Binary files /dev/null and b/test/reference/text-glyph-range.base.argb32.ref.png differ diff --git a/test/reference/text-glyph-range.base.rgb24.ref.png b/test/reference/text-glyph-range.base.rgb24.ref.png new file mode 100644 index 000000000..326869923 Binary files /dev/null and b/test/reference/text-glyph-range.base.rgb24.ref.png differ diff --git a/test/reference/text-glyph-range.image16.ref.png b/test/reference/text-glyph-range.image16.ref.png new file mode 100644 index 000000000..51daa1688 Binary files /dev/null and b/test/reference/text-glyph-range.image16.ref.png differ diff --git a/test/reference/text-glyph-range.ps.ref.png b/test/reference/text-glyph-range.ps.ref.png new file mode 100644 index 000000000..96bc85a34 Binary files /dev/null and b/test/reference/text-glyph-range.ps.ref.png differ diff --git a/test/reference/text-glyph-range.quartz.ref.png b/test/reference/text-glyph-range.quartz.ref.png new file mode 100644 index 000000000..e4a14b2aa Binary files /dev/null and b/test/reference/text-glyph-range.quartz.ref.png differ diff --git a/test/reference/text-glyph-range.ref.png b/test/reference/text-glyph-range.ref.png new file mode 100644 index 000000000..648fef5b7 Binary files /dev/null and b/test/reference/text-glyph-range.ref.png differ diff --git a/test/reference/text-glyph-range.traps.ref.png b/test/reference/text-glyph-range.traps.ref.png new file mode 100644 index 000000000..326869923 Binary files /dev/null and b/test/reference/text-glyph-range.traps.ref.png differ diff --git a/test/reference/text-pattern.base.argb32.ref.png b/test/reference/text-pattern.base.argb32.ref.png new file mode 100644 index 000000000..79f18e4e1 Binary files /dev/null and b/test/reference/text-pattern.base.argb32.ref.png differ diff --git a/test/reference/text-pattern.base.rgb24.ref.png b/test/reference/text-pattern.base.rgb24.ref.png new file mode 100644 index 000000000..b073b9831 Binary files /dev/null and b/test/reference/text-pattern.base.rgb24.ref.png differ diff --git a/test/reference/text-pattern.pdf.argb32.ref.png b/test/reference/text-pattern.pdf.argb32.ref.png new file mode 100644 index 000000000..5eef739dc Binary files /dev/null and b/test/reference/text-pattern.pdf.argb32.ref.png differ diff --git a/test/reference/text-pattern.pdf.rgb24.ref.png b/test/reference/text-pattern.pdf.rgb24.ref.png new file mode 100644 index 000000000..27a1195e8 Binary files /dev/null and b/test/reference/text-pattern.pdf.rgb24.ref.png differ diff --git a/test/reference/text-pattern.ps2.argb32.ref.png b/test/reference/text-pattern.ps2.argb32.ref.png new file mode 100644 index 000000000..bdea146f2 Binary files /dev/null and b/test/reference/text-pattern.ps2.argb32.ref.png differ diff --git a/test/reference/text-pattern.ps2.rgb24.ref.png b/test/reference/text-pattern.ps2.rgb24.ref.png new file mode 100644 index 000000000..bdea146f2 Binary files /dev/null and b/test/reference/text-pattern.ps2.rgb24.ref.png differ diff --git a/test/reference/text-pattern.ps3.argb32.ref.png b/test/reference/text-pattern.ps3.argb32.ref.png new file mode 100644 index 000000000..411a531b2 Binary files /dev/null and b/test/reference/text-pattern.ps3.argb32.ref.png differ diff --git a/test/reference/text-pattern.ps3.rgb24.ref.png b/test/reference/text-pattern.ps3.rgb24.ref.png new file mode 100644 index 000000000..f696a9926 Binary files /dev/null and b/test/reference/text-pattern.ps3.rgb24.ref.png differ diff --git a/test/reference/text-pattern.quartz.argb32.ref.png b/test/reference/text-pattern.quartz.argb32.ref.png new file mode 100644 index 000000000..1a15964e5 Binary files /dev/null and b/test/reference/text-pattern.quartz.argb32.ref.png differ diff --git a/test/reference/text-pattern.quartz.rgb24.ref.png b/test/reference/text-pattern.quartz.rgb24.ref.png new file mode 100644 index 000000000..f19dd767d Binary files /dev/null and b/test/reference/text-pattern.quartz.rgb24.ref.png differ diff --git a/test/reference/text-pattern.ref.png b/test/reference/text-pattern.ref.png new file mode 100644 index 000000000..95410fa2b Binary files /dev/null and b/test/reference/text-pattern.ref.png differ diff --git a/test/reference/text-pattern.svg.argb32.ref.png b/test/reference/text-pattern.svg.argb32.ref.png new file mode 100644 index 000000000..f472858f9 Binary files /dev/null and b/test/reference/text-pattern.svg.argb32.ref.png differ diff --git a/test/reference/text-pattern.svg.rgb24.ref.png b/test/reference/text-pattern.svg.rgb24.ref.png new file mode 100644 index 000000000..2b2064ece Binary files /dev/null and b/test/reference/text-pattern.svg.rgb24.ref.png differ diff --git a/test/reference/text-pattern.traps.argb32.ref.png b/test/reference/text-pattern.traps.argb32.ref.png new file mode 100644 index 000000000..79f18e4e1 Binary files /dev/null and b/test/reference/text-pattern.traps.argb32.ref.png differ diff --git a/test/reference/text-pattern.traps.rgb24.ref.png b/test/reference/text-pattern.traps.rgb24.ref.png new file mode 100644 index 000000000..b073b9831 Binary files /dev/null and b/test/reference/text-pattern.traps.rgb24.ref.png differ diff --git a/test/reference/text-rotate.base.argb32.ref.png b/test/reference/text-rotate.base.argb32.ref.png new file mode 100644 index 000000000..ff3fe847c Binary files /dev/null and b/test/reference/text-rotate.base.argb32.ref.png differ diff --git a/test/reference/text-rotate.base.rgb24.ref.png b/test/reference/text-rotate.base.rgb24.ref.png new file mode 100644 index 000000000..ff3fe847c Binary files /dev/null and b/test/reference/text-rotate.base.rgb24.ref.png differ diff --git a/test/reference/text-rotate.image16.ref.png b/test/reference/text-rotate.image16.ref.png new file mode 100644 index 000000000..fddd002c9 Binary files /dev/null and b/test/reference/text-rotate.image16.ref.png differ diff --git a/test/reference/text-rotate.mask.argb32.ref.png b/test/reference/text-rotate.mask.argb32.ref.png new file mode 100644 index 000000000..b455aab63 Binary files /dev/null and b/test/reference/text-rotate.mask.argb32.ref.png differ diff --git a/test/reference/text-rotate.mask.rgb24.ref.png b/test/reference/text-rotate.mask.rgb24.ref.png new file mode 100644 index 000000000..b455aab63 Binary files /dev/null and b/test/reference/text-rotate.mask.rgb24.ref.png differ diff --git a/test/reference/text-rotate.pdf.ref.png b/test/reference/text-rotate.pdf.ref.png new file mode 100644 index 000000000..b533075c4 Binary files /dev/null and b/test/reference/text-rotate.pdf.ref.png differ diff --git a/test/reference/text-rotate.ps.ref.png b/test/reference/text-rotate.ps.ref.png new file mode 100644 index 000000000..c68d02dae Binary files /dev/null and b/test/reference/text-rotate.ps.ref.png differ diff --git a/test/reference/text-rotate.quartz.ref.png b/test/reference/text-rotate.quartz.ref.png new file mode 100644 index 000000000..113e727af Binary files /dev/null and b/test/reference/text-rotate.quartz.ref.png differ diff --git a/test/reference/text-rotate.ref.png b/test/reference/text-rotate.ref.png new file mode 100644 index 000000000..432de3123 Binary files /dev/null and b/test/reference/text-rotate.ref.png differ diff --git a/test/reference/text-rotate.svg.ref.png b/test/reference/text-rotate.svg.ref.png new file mode 100644 index 000000000..9d887a02f Binary files /dev/null and b/test/reference/text-rotate.svg.ref.png differ diff --git a/test/reference/text-rotate.traps.ref.png b/test/reference/text-rotate.traps.ref.png new file mode 100644 index 000000000..ff3fe847c Binary files /dev/null and b/test/reference/text-rotate.traps.ref.png differ diff --git a/test/reference/text-rotate.xlib-fallback.ref.png b/test/reference/text-rotate.xlib-fallback.ref.png new file mode 100644 index 000000000..ce063303a Binary files /dev/null and b/test/reference/text-rotate.xlib-fallback.ref.png differ diff --git a/test/reference/text-transform.base.argb32.ref.png b/test/reference/text-transform.base.argb32.ref.png new file mode 100644 index 000000000..4603bc528 Binary files /dev/null and b/test/reference/text-transform.base.argb32.ref.png differ diff --git a/test/reference/text-transform.base.rgb24.ref.png b/test/reference/text-transform.base.rgb24.ref.png new file mode 100644 index 000000000..4603bc528 Binary files /dev/null and b/test/reference/text-transform.base.rgb24.ref.png differ diff --git a/test/reference/text-transform.image16.ref.png b/test/reference/text-transform.image16.ref.png new file mode 100644 index 000000000..59caca800 Binary files /dev/null and b/test/reference/text-transform.image16.ref.png differ diff --git a/test/reference/text-transform.pdf.argb32.ref.png b/test/reference/text-transform.pdf.argb32.ref.png new file mode 100644 index 000000000..7a2f3a72a Binary files /dev/null and b/test/reference/text-transform.pdf.argb32.ref.png differ diff --git a/test/reference/text-transform.pdf.rgb24.ref.png b/test/reference/text-transform.pdf.rgb24.ref.png new file mode 100644 index 000000000..7a2f3a72a Binary files /dev/null and b/test/reference/text-transform.pdf.rgb24.ref.png differ diff --git a/test/reference/text-transform.ps2.ref.png b/test/reference/text-transform.ps2.ref.png new file mode 100644 index 000000000..07896b302 Binary files /dev/null and b/test/reference/text-transform.ps2.ref.png differ diff --git a/test/reference/text-transform.ps3.ref.png b/test/reference/text-transform.ps3.ref.png new file mode 100644 index 000000000..07896b302 Binary files /dev/null and b/test/reference/text-transform.ps3.ref.png differ diff --git a/test/reference/text-transform.ref.png b/test/reference/text-transform.ref.png new file mode 100644 index 000000000..6f36b9d41 Binary files /dev/null and b/test/reference/text-transform.ref.png differ diff --git a/test/reference/text-transform.svg.ref.png b/test/reference/text-transform.svg.ref.png new file mode 100644 index 000000000..1473a643a Binary files /dev/null and b/test/reference/text-transform.svg.ref.png differ diff --git a/test/reference/tiger.base.argb32.ref.png b/test/reference/tiger.base.argb32.ref.png new file mode 100644 index 000000000..bc7f668e4 Binary files /dev/null and b/test/reference/tiger.base.argb32.ref.png differ diff --git a/test/reference/tiger.base.rgb24.ref.png b/test/reference/tiger.base.rgb24.ref.png new file mode 100644 index 000000000..bc7f668e4 Binary files /dev/null and b/test/reference/tiger.base.rgb24.ref.png differ diff --git a/test/reference/tiger.ref.png b/test/reference/tiger.ref.png new file mode 100644 index 000000000..b8b21758b Binary files /dev/null and b/test/reference/tiger.ref.png differ diff --git a/test/reference/tiger.traps.argb32.ref.png b/test/reference/tiger.traps.argb32.ref.png new file mode 100644 index 000000000..bc7f668e4 Binary files /dev/null and b/test/reference/tiger.traps.argb32.ref.png differ diff --git a/test/reference/tiger.traps.rgb24.ref.png b/test/reference/tiger.traps.rgb24.ref.png new file mode 100644 index 000000000..bc7f668e4 Binary files /dev/null and b/test/reference/tiger.traps.rgb24.ref.png differ diff --git a/test/reference/tighten-bounds.argb32.ref.png b/test/reference/tighten-bounds.argb32.ref.png new file mode 100644 index 000000000..042038c6f Binary files /dev/null and b/test/reference/tighten-bounds.argb32.ref.png differ diff --git a/test/reference/tighten-bounds.base.argb32.ref.png b/test/reference/tighten-bounds.base.argb32.ref.png new file mode 100644 index 000000000..dad3a7fc9 Binary files /dev/null and b/test/reference/tighten-bounds.base.argb32.ref.png differ diff --git a/test/reference/tighten-bounds.base.rgb24.ref.png b/test/reference/tighten-bounds.base.rgb24.ref.png new file mode 100644 index 000000000..9d3a25262 Binary files /dev/null and b/test/reference/tighten-bounds.base.rgb24.ref.png differ diff --git a/test/reference/tighten-bounds.rgb24.ref.png b/test/reference/tighten-bounds.rgb24.ref.png new file mode 100644 index 000000000..28158816b Binary files /dev/null and b/test/reference/tighten-bounds.rgb24.ref.png differ diff --git a/test/reference/tighten-bounds.traps.argb32.ref.png b/test/reference/tighten-bounds.traps.argb32.ref.png new file mode 100644 index 000000000..291a84114 Binary files /dev/null and b/test/reference/tighten-bounds.traps.argb32.ref.png differ diff --git a/test/reference/tighten-bounds.traps.rgb24.ref.png b/test/reference/tighten-bounds.traps.rgb24.ref.png new file mode 100644 index 000000000..f31c17c3d Binary files /dev/null and b/test/reference/tighten-bounds.traps.rgb24.ref.png differ diff --git a/test/reference/transforms.base.argb32.ref.png b/test/reference/transforms.base.argb32.ref.png new file mode 100644 index 000000000..3ce917649 Binary files /dev/null and b/test/reference/transforms.base.argb32.ref.png differ diff --git a/test/reference/transforms.base.rgb24.ref.png b/test/reference/transforms.base.rgb24.ref.png new file mode 100644 index 000000000..3ce917649 Binary files /dev/null and b/test/reference/transforms.base.rgb24.ref.png differ diff --git a/test/reference/transforms.image16.ref.png b/test/reference/transforms.image16.ref.png new file mode 100644 index 000000000..e9a1813a0 Binary files /dev/null and b/test/reference/transforms.image16.ref.png differ diff --git a/test/reference/transforms.ps2.ref.png b/test/reference/transforms.ps2.ref.png new file mode 100644 index 000000000..6d195aaf3 Binary files /dev/null and b/test/reference/transforms.ps2.ref.png differ diff --git a/test/reference/transforms.ps3.ref.png b/test/reference/transforms.ps3.ref.png new file mode 100644 index 000000000..6d195aaf3 Binary files /dev/null and b/test/reference/transforms.ps3.ref.png differ diff --git a/test/reference/transforms.ref.png b/test/reference/transforms.ref.png new file mode 100644 index 000000000..390bad482 Binary files /dev/null and b/test/reference/transforms.ref.png differ diff --git a/test/reference/transforms.traps.argb32.ref.png b/test/reference/transforms.traps.argb32.ref.png new file mode 100644 index 000000000..3ce917649 Binary files /dev/null and b/test/reference/transforms.traps.argb32.ref.png differ diff --git a/test/reference/transforms.traps.rgb24.ref.png b/test/reference/transforms.traps.rgb24.ref.png new file mode 100644 index 000000000..3ce917649 Binary files /dev/null and b/test/reference/transforms.traps.rgb24.ref.png differ diff --git a/test/reference/translate-show-surface.base.argb32.ref.png b/test/reference/translate-show-surface.base.argb32.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/translate-show-surface.base.argb32.ref.png differ diff --git a/test/reference/translate-show-surface.base.rgb24.ref.png b/test/reference/translate-show-surface.base.rgb24.ref.png new file mode 100644 index 000000000..0a145d918 Binary files /dev/null and b/test/reference/translate-show-surface.base.rgb24.ref.png differ diff --git a/test/reference/translate-show-surface.ref.png b/test/reference/translate-show-surface.ref.png new file mode 100644 index 000000000..765adc4a4 Binary files /dev/null and b/test/reference/translate-show-surface.ref.png differ diff --git a/test/reference/trap-clip.argb32.ref.png b/test/reference/trap-clip.argb32.ref.png new file mode 100644 index 000000000..08e6c68a5 Binary files /dev/null and b/test/reference/trap-clip.argb32.ref.png differ diff --git a/test/reference/trap-clip.base.argb32.ref.png b/test/reference/trap-clip.base.argb32.ref.png new file mode 100644 index 000000000..285934bc3 Binary files /dev/null and b/test/reference/trap-clip.base.argb32.ref.png differ diff --git a/test/reference/trap-clip.base.rgb24.ref.png b/test/reference/trap-clip.base.rgb24.ref.png new file mode 100644 index 000000000..ed89be754 Binary files /dev/null and b/test/reference/trap-clip.base.rgb24.ref.png differ diff --git a/test/reference/trap-clip.image16.ref.png b/test/reference/trap-clip.image16.ref.png new file mode 100644 index 000000000..e9ef2cf90 Binary files /dev/null and b/test/reference/trap-clip.image16.ref.png differ diff --git a/test/reference/trap-clip.mask.argb32.ref.png b/test/reference/trap-clip.mask.argb32.ref.png new file mode 100644 index 000000000..98cd0a244 Binary files /dev/null and b/test/reference/trap-clip.mask.argb32.ref.png differ diff --git a/test/reference/trap-clip.mask.rgb24.ref.png b/test/reference/trap-clip.mask.rgb24.ref.png new file mode 100644 index 000000000..c01315331 Binary files /dev/null and b/test/reference/trap-clip.mask.rgb24.ref.png differ diff --git a/test/reference/trap-clip.ps2.argb32.ref.png b/test/reference/trap-clip.ps2.argb32.ref.png new file mode 100644 index 000000000..4db9f8e70 Binary files /dev/null and b/test/reference/trap-clip.ps2.argb32.ref.png differ diff --git a/test/reference/trap-clip.ps2.rgb24.ref.png b/test/reference/trap-clip.ps2.rgb24.ref.png new file mode 100644 index 000000000..de309b975 Binary files /dev/null and b/test/reference/trap-clip.ps2.rgb24.ref.png differ diff --git a/test/reference/trap-clip.ps3.argb32.ref.png b/test/reference/trap-clip.ps3.argb32.ref.png new file mode 100644 index 000000000..17d74beb3 Binary files /dev/null and b/test/reference/trap-clip.ps3.argb32.ref.png differ diff --git a/test/reference/trap-clip.ps3.rgb24.ref.png b/test/reference/trap-clip.ps3.rgb24.ref.png new file mode 100644 index 000000000..236b75c5b Binary files /dev/null and b/test/reference/trap-clip.ps3.rgb24.ref.png differ diff --git a/test/reference/trap-clip.quartz.argb32.ref.png b/test/reference/trap-clip.quartz.argb32.ref.png new file mode 100644 index 000000000..e045ea4ed Binary files /dev/null and b/test/reference/trap-clip.quartz.argb32.ref.png differ diff --git a/test/reference/trap-clip.quartz.rgb24.ref.png b/test/reference/trap-clip.quartz.rgb24.ref.png new file mode 100644 index 000000000..1044d8699 Binary files /dev/null and b/test/reference/trap-clip.quartz.rgb24.ref.png differ diff --git a/test/reference/trap-clip.rgb24.ref.png b/test/reference/trap-clip.rgb24.ref.png new file mode 100644 index 000000000..9c51d62eb Binary files /dev/null and b/test/reference/trap-clip.rgb24.ref.png differ diff --git a/test/reference/trap-clip.test-paginated.argb32.ref.png b/test/reference/trap-clip.test-paginated.argb32.ref.png new file mode 100644 index 000000000..7259edc49 Binary files /dev/null and b/test/reference/trap-clip.test-paginated.argb32.ref.png differ diff --git a/test/reference/trap-clip.traps.argb32.ref.png b/test/reference/trap-clip.traps.argb32.ref.png new file mode 100644 index 000000000..170d3781f Binary files /dev/null and b/test/reference/trap-clip.traps.argb32.ref.png differ diff --git a/test/reference/trap-clip.traps.rgb24.ref.png b/test/reference/trap-clip.traps.rgb24.ref.png new file mode 100644 index 000000000..b1129b033 Binary files /dev/null and b/test/reference/trap-clip.traps.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-gray.base.argb32.ref.png b/test/reference/twin-antialias-gray.base.argb32.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-gray.base.argb32.ref.png differ diff --git a/test/reference/twin-antialias-gray.base.rgb24.ref.png b/test/reference/twin-antialias-gray.base.rgb24.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-gray.base.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-gray.image16.ref.png b/test/reference/twin-antialias-gray.image16.ref.png new file mode 100644 index 000000000..1fadcb125 Binary files /dev/null and b/test/reference/twin-antialias-gray.image16.ref.png differ diff --git a/test/reference/twin-antialias-gray.mask.argb32.ref.png b/test/reference/twin-antialias-gray.mask.argb32.ref.png new file mode 100644 index 000000000..6b091afd8 Binary files /dev/null and b/test/reference/twin-antialias-gray.mask.argb32.ref.png differ diff --git a/test/reference/twin-antialias-gray.mask.rgb24.ref.png b/test/reference/twin-antialias-gray.mask.rgb24.ref.png new file mode 100644 index 000000000..6b091afd8 Binary files /dev/null and b/test/reference/twin-antialias-gray.mask.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-gray.ref.png b/test/reference/twin-antialias-gray.ref.png new file mode 100644 index 000000000..602e00524 Binary files /dev/null and b/test/reference/twin-antialias-gray.ref.png differ diff --git a/test/reference/twin-antialias-gray.traps.argb32.ref.png b/test/reference/twin-antialias-gray.traps.argb32.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-gray.traps.argb32.ref.png differ diff --git a/test/reference/twin-antialias-gray.traps.rgb24.ref.png b/test/reference/twin-antialias-gray.traps.rgb24.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-gray.traps.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-mixed.base.argb32.ref.png b/test/reference/twin-antialias-mixed.base.argb32.ref.png new file mode 100644 index 000000000..ba8180e11 Binary files /dev/null and b/test/reference/twin-antialias-mixed.base.argb32.ref.png differ diff --git a/test/reference/twin-antialias-mixed.base.rgb24.ref.png b/test/reference/twin-antialias-mixed.base.rgb24.ref.png new file mode 100644 index 000000000..ba8180e11 Binary files /dev/null and b/test/reference/twin-antialias-mixed.base.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-mixed.image16.ref.png b/test/reference/twin-antialias-mixed.image16.ref.png new file mode 100644 index 000000000..10c4980fc Binary files /dev/null and b/test/reference/twin-antialias-mixed.image16.ref.png differ diff --git a/test/reference/twin-antialias-mixed.ref.png b/test/reference/twin-antialias-mixed.ref.png new file mode 100644 index 000000000..28e85a3e6 Binary files /dev/null and b/test/reference/twin-antialias-mixed.ref.png differ diff --git a/test/reference/twin-antialias-mixed.traps.argb32.ref.png b/test/reference/twin-antialias-mixed.traps.argb32.ref.png new file mode 100644 index 000000000..ba8180e11 Binary files /dev/null and b/test/reference/twin-antialias-mixed.traps.argb32.ref.png differ diff --git a/test/reference/twin-antialias-mixed.traps.rgb24.ref.png b/test/reference/twin-antialias-mixed.traps.rgb24.ref.png new file mode 100644 index 000000000..ba8180e11 Binary files /dev/null and b/test/reference/twin-antialias-mixed.traps.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-none.base.argb32.ref.png b/test/reference/twin-antialias-none.base.argb32.ref.png new file mode 100644 index 000000000..02cf333d7 Binary files /dev/null and b/test/reference/twin-antialias-none.base.argb32.ref.png differ diff --git a/test/reference/twin-antialias-none.base.rgb24.ref.png b/test/reference/twin-antialias-none.base.rgb24.ref.png new file mode 100644 index 000000000..02cf333d7 Binary files /dev/null and b/test/reference/twin-antialias-none.base.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-none.ref.png b/test/reference/twin-antialias-none.ref.png new file mode 100644 index 000000000..28ad3036d Binary files /dev/null and b/test/reference/twin-antialias-none.ref.png differ diff --git a/test/reference/twin-antialias-none.traps.argb32.ref.png b/test/reference/twin-antialias-none.traps.argb32.ref.png new file mode 100644 index 000000000..02cf333d7 Binary files /dev/null and b/test/reference/twin-antialias-none.traps.argb32.ref.png differ diff --git a/test/reference/twin-antialias-none.traps.rgb24.ref.png b/test/reference/twin-antialias-none.traps.rgb24.ref.png new file mode 100644 index 000000000..02cf333d7 Binary files /dev/null and b/test/reference/twin-antialias-none.traps.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.base.argb32.ref.png b/test/reference/twin-antialias-subpixel.base.argb32.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.base.argb32.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.base.rgb24.ref.png b/test/reference/twin-antialias-subpixel.base.rgb24.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.base.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.image16.ref.png b/test/reference/twin-antialias-subpixel.image16.ref.png new file mode 100644 index 000000000..1fadcb125 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.image16.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.mask.argb32.ref.png b/test/reference/twin-antialias-subpixel.mask.argb32.ref.png new file mode 100644 index 000000000..6b091afd8 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.mask.argb32.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.mask.rgb24.ref.png b/test/reference/twin-antialias-subpixel.mask.rgb24.ref.png new file mode 100644 index 000000000..6b091afd8 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.mask.rgb24.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.ref.png b/test/reference/twin-antialias-subpixel.ref.png new file mode 100644 index 000000000..602e00524 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.traps.argb32.ref.png b/test/reference/twin-antialias-subpixel.traps.argb32.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.traps.argb32.ref.png differ diff --git a/test/reference/twin-antialias-subpixel.traps.rgb24.ref.png b/test/reference/twin-antialias-subpixel.traps.rgb24.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin-antialias-subpixel.traps.rgb24.ref.png differ diff --git a/test/reference/twin.base.argb32.ref.png b/test/reference/twin.base.argb32.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin.base.argb32.ref.png differ diff --git a/test/reference/twin.base.rgb24.ref.png b/test/reference/twin.base.rgb24.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin.base.rgb24.ref.png differ diff --git a/test/reference/twin.image16.ref.png b/test/reference/twin.image16.ref.png new file mode 100644 index 000000000..1fadcb125 Binary files /dev/null and b/test/reference/twin.image16.ref.png differ diff --git a/test/reference/twin.mask.argb32.ref.png b/test/reference/twin.mask.argb32.ref.png new file mode 100644 index 000000000..6b091afd8 Binary files /dev/null and b/test/reference/twin.mask.argb32.ref.png differ diff --git a/test/reference/twin.mask.rgb24.ref.png b/test/reference/twin.mask.rgb24.ref.png new file mode 100644 index 000000000..6b091afd8 Binary files /dev/null and b/test/reference/twin.mask.rgb24.ref.png differ diff --git a/test/reference/twin.ps.ref.png b/test/reference/twin.ps.ref.png new file mode 100644 index 000000000..25c71b440 Binary files /dev/null and b/test/reference/twin.ps.ref.png differ diff --git a/test/reference/twin.ref.png b/test/reference/twin.ref.png new file mode 100644 index 000000000..602e00524 Binary files /dev/null and b/test/reference/twin.ref.png differ diff --git a/test/reference/twin.svg.ref.png b/test/reference/twin.svg.ref.png new file mode 100644 index 000000000..628a83c76 Binary files /dev/null and b/test/reference/twin.svg.ref.png differ diff --git a/test/reference/twin.traps.argb32.ref.png b/test/reference/twin.traps.argb32.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin.traps.argb32.ref.png differ diff --git a/test/reference/twin.traps.rgb24.ref.png b/test/reference/twin.traps.rgb24.ref.png new file mode 100644 index 000000000..0692dea28 Binary files /dev/null and b/test/reference/twin.traps.rgb24.ref.png differ diff --git a/test/reference/unaligned-box.base.argb32.ref.png b/test/reference/unaligned-box.base.argb32.ref.png new file mode 100644 index 000000000..48e23b8f8 Binary files /dev/null and b/test/reference/unaligned-box.base.argb32.ref.png differ diff --git a/test/reference/unaligned-box.base.rgb24.ref.png b/test/reference/unaligned-box.base.rgb24.ref.png new file mode 100644 index 000000000..48e23b8f8 Binary files /dev/null and b/test/reference/unaligned-box.base.rgb24.ref.png differ diff --git a/test/reference/unaligned-box.ref.png b/test/reference/unaligned-box.ref.png new file mode 100644 index 000000000..ec7c48996 Binary files /dev/null and b/test/reference/unaligned-box.ref.png differ diff --git a/test/reference/unaligned-box.traps.argb32.ref.png b/test/reference/unaligned-box.traps.argb32.ref.png new file mode 100644 index 000000000..48e23b8f8 Binary files /dev/null and b/test/reference/unaligned-box.traps.argb32.ref.png differ diff --git a/test/reference/unaligned-box.traps.rgb24.ref.png b/test/reference/unaligned-box.traps.rgb24.ref.png new file mode 100644 index 000000000..48e23b8f8 Binary files /dev/null and b/test/reference/unaligned-box.traps.rgb24.ref.png differ diff --git a/test/reference/unantialiased-shapes.base.argb32.ref.png b/test/reference/unantialiased-shapes.base.argb32.ref.png new file mode 100644 index 000000000..a55ba889b Binary files /dev/null and b/test/reference/unantialiased-shapes.base.argb32.ref.png differ diff --git a/test/reference/unantialiased-shapes.base.rgb24.ref.png b/test/reference/unantialiased-shapes.base.rgb24.ref.png new file mode 100644 index 000000000..a55ba889b Binary files /dev/null and b/test/reference/unantialiased-shapes.base.rgb24.ref.png differ diff --git a/test/reference/unantialiased-shapes.quartz.ref.png b/test/reference/unantialiased-shapes.quartz.ref.png new file mode 100644 index 000000000..349ece778 Binary files /dev/null and b/test/reference/unantialiased-shapes.quartz.ref.png differ diff --git a/test/reference/unantialiased-shapes.ref.png b/test/reference/unantialiased-shapes.ref.png new file mode 100644 index 000000000..d9f466e52 Binary files /dev/null and b/test/reference/unantialiased-shapes.ref.png differ diff --git a/test/reference/unantialiased-shapes.traps.argb32.ref.png b/test/reference/unantialiased-shapes.traps.argb32.ref.png new file mode 100644 index 000000000..cb2ce3d95 Binary files /dev/null and b/test/reference/unantialiased-shapes.traps.argb32.ref.png differ diff --git a/test/reference/unantialiased-shapes.traps.rgb24.ref.png b/test/reference/unantialiased-shapes.traps.rgb24.ref.png new file mode 100644 index 000000000..cb2ce3d95 Binary files /dev/null and b/test/reference/unantialiased-shapes.traps.rgb24.ref.png differ diff --git a/test/reference/unbounded-operator.argb32.ref.png b/test/reference/unbounded-operator.argb32.ref.png new file mode 100644 index 000000000..0b4338865 Binary files /dev/null and b/test/reference/unbounded-operator.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.base.argb32.ref.png b/test/reference/unbounded-operator.base.argb32.ref.png new file mode 100644 index 000000000..fe86a948e Binary files /dev/null and b/test/reference/unbounded-operator.base.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.base.rgb24.ref.png b/test/reference/unbounded-operator.base.rgb24.ref.png new file mode 100644 index 000000000..c8555af14 Binary files /dev/null and b/test/reference/unbounded-operator.base.rgb24.ref.png differ diff --git a/test/reference/unbounded-operator.gl.argb32.xfail.png b/test/reference/unbounded-operator.gl.argb32.xfail.png new file mode 100644 index 000000000..34e32eba1 Binary files /dev/null and b/test/reference/unbounded-operator.gl.argb32.xfail.png differ diff --git a/test/reference/unbounded-operator.gl.rgb24.xfail.png b/test/reference/unbounded-operator.gl.rgb24.xfail.png new file mode 100644 index 000000000..b91da8f08 Binary files /dev/null and b/test/reference/unbounded-operator.gl.rgb24.xfail.png differ diff --git a/test/reference/unbounded-operator.image16.ref.png b/test/reference/unbounded-operator.image16.ref.png new file mode 100644 index 000000000..17dfb46df Binary files /dev/null and b/test/reference/unbounded-operator.image16.ref.png differ diff --git a/test/reference/unbounded-operator.mask.argb32.ref.png b/test/reference/unbounded-operator.mask.argb32.ref.png new file mode 100644 index 000000000..08f43561b Binary files /dev/null and b/test/reference/unbounded-operator.mask.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.mask.rgb24.ref.png b/test/reference/unbounded-operator.mask.rgb24.ref.png new file mode 100644 index 000000000..80d20dc57 Binary files /dev/null and b/test/reference/unbounded-operator.mask.rgb24.ref.png differ diff --git a/test/reference/unbounded-operator.pdf.argb32.ref.png b/test/reference/unbounded-operator.pdf.argb32.ref.png new file mode 100644 index 000000000..4aa476de4 Binary files /dev/null and b/test/reference/unbounded-operator.pdf.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.ps2.argb32.ref.png b/test/reference/unbounded-operator.ps2.argb32.ref.png new file mode 100644 index 000000000..4aa476de4 Binary files /dev/null and b/test/reference/unbounded-operator.ps2.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.ps3.argb32.ref.png b/test/reference/unbounded-operator.ps3.argb32.ref.png new file mode 100644 index 000000000..4aa476de4 Binary files /dev/null and b/test/reference/unbounded-operator.ps3.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.quartz.argb32.ref.png b/test/reference/unbounded-operator.quartz.argb32.ref.png new file mode 100644 index 000000000..b2e99165e Binary files /dev/null and b/test/reference/unbounded-operator.quartz.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.quartz.rgb24.ref.png b/test/reference/unbounded-operator.quartz.rgb24.ref.png new file mode 100644 index 000000000..ea41dc892 Binary files /dev/null and b/test/reference/unbounded-operator.quartz.rgb24.ref.png differ diff --git a/test/reference/unbounded-operator.rgb24.ref.png b/test/reference/unbounded-operator.rgb24.ref.png new file mode 100644 index 000000000..c9b5b3456 Binary files /dev/null and b/test/reference/unbounded-operator.rgb24.ref.png differ diff --git a/test/reference/unbounded-operator.svg12.argb32.ref.png b/test/reference/unbounded-operator.svg12.argb32.ref.png new file mode 100644 index 000000000..45b173fae Binary files /dev/null and b/test/reference/unbounded-operator.svg12.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.svg12.rgb24.xfail.png b/test/reference/unbounded-operator.svg12.rgb24.xfail.png new file mode 100644 index 000000000..828a9db97 Binary files /dev/null and b/test/reference/unbounded-operator.svg12.rgb24.xfail.png differ diff --git a/test/reference/unbounded-operator.traps.argb32.ref.png b/test/reference/unbounded-operator.traps.argb32.ref.png new file mode 100644 index 000000000..fe86a948e Binary files /dev/null and b/test/reference/unbounded-operator.traps.argb32.ref.png differ diff --git a/test/reference/unbounded-operator.traps.rgb24.ref.png b/test/reference/unbounded-operator.traps.rgb24.ref.png new file mode 100644 index 000000000..c8555af14 Binary files /dev/null and b/test/reference/unbounded-operator.traps.rgb24.ref.png differ diff --git a/test/reference/unclosed-strokes.base.argb32.ref.png b/test/reference/unclosed-strokes.base.argb32.ref.png new file mode 100644 index 000000000..34cedbd8b Binary files /dev/null and b/test/reference/unclosed-strokes.base.argb32.ref.png differ diff --git a/test/reference/unclosed-strokes.base.rgb24.ref.png b/test/reference/unclosed-strokes.base.rgb24.ref.png new file mode 100644 index 000000000..34cedbd8b Binary files /dev/null and b/test/reference/unclosed-strokes.base.rgb24.ref.png differ diff --git a/test/reference/unclosed-strokes.ref.png b/test/reference/unclosed-strokes.ref.png new file mode 100644 index 000000000..7649c0338 Binary files /dev/null and b/test/reference/unclosed-strokes.ref.png differ diff --git a/test/reference/unclosed-strokes.traps.argb32.ref.png b/test/reference/unclosed-strokes.traps.argb32.ref.png new file mode 100644 index 000000000..34cedbd8b Binary files /dev/null and b/test/reference/unclosed-strokes.traps.argb32.ref.png differ diff --git a/test/reference/unclosed-strokes.traps.rgb24.ref.png b/test/reference/unclosed-strokes.traps.rgb24.ref.png new file mode 100644 index 000000000..34cedbd8b Binary files /dev/null and b/test/reference/unclosed-strokes.traps.rgb24.ref.png differ diff --git a/test/reference/user-font-mask.base.argb32.ref.png b/test/reference/user-font-mask.base.argb32.ref.png new file mode 100644 index 000000000..02a9a5eca Binary files /dev/null and b/test/reference/user-font-mask.base.argb32.ref.png differ diff --git a/test/reference/user-font-mask.base.rgb24.ref.png b/test/reference/user-font-mask.base.rgb24.ref.png new file mode 100644 index 000000000..02a9a5eca Binary files /dev/null and b/test/reference/user-font-mask.base.rgb24.ref.png differ diff --git a/test/reference/user-font-mask.image16.ref.png b/test/reference/user-font-mask.image16.ref.png new file mode 100644 index 000000000..0a63ddedc Binary files /dev/null and b/test/reference/user-font-mask.image16.ref.png differ diff --git a/test/reference/user-font-mask.pdf.ref.png b/test/reference/user-font-mask.pdf.ref.png new file mode 100644 index 000000000..ebf148587 Binary files /dev/null and b/test/reference/user-font-mask.pdf.ref.png differ diff --git a/test/reference/user-font-mask.ps2.ref.png b/test/reference/user-font-mask.ps2.ref.png new file mode 100644 index 000000000..ebf148587 Binary files /dev/null and b/test/reference/user-font-mask.ps2.ref.png differ diff --git a/test/reference/user-font-mask.ps3.ref.png b/test/reference/user-font-mask.ps3.ref.png new file mode 100644 index 000000000..ebf148587 Binary files /dev/null and b/test/reference/user-font-mask.ps3.ref.png differ diff --git a/test/reference/user-font-mask.ref.png b/test/reference/user-font-mask.ref.png new file mode 100644 index 000000000..02a9a5eca Binary files /dev/null and b/test/reference/user-font-mask.ref.png differ diff --git a/test/reference/user-font-mask.svg.ref.png b/test/reference/user-font-mask.svg.ref.png new file mode 100644 index 000000000..1a8f2c8cc Binary files /dev/null and b/test/reference/user-font-mask.svg.ref.png differ diff --git a/test/reference/user-font-proxy.base.argb32.ref.png b/test/reference/user-font-proxy.base.argb32.ref.png new file mode 100644 index 000000000..094938c6e Binary files /dev/null and b/test/reference/user-font-proxy.base.argb32.ref.png differ diff --git a/test/reference/user-font-proxy.base.rgb24.ref.png b/test/reference/user-font-proxy.base.rgb24.ref.png new file mode 100644 index 000000000..094938c6e Binary files /dev/null and b/test/reference/user-font-proxy.base.rgb24.ref.png differ diff --git a/test/reference/user-font-proxy.image16.ref.png b/test/reference/user-font-proxy.image16.ref.png new file mode 100644 index 000000000..5b44351bd Binary files /dev/null and b/test/reference/user-font-proxy.image16.ref.png differ diff --git a/test/reference/user-font-proxy.pdf.argb32.ref.png b/test/reference/user-font-proxy.pdf.argb32.ref.png new file mode 100644 index 000000000..cffa9edb7 Binary files /dev/null and b/test/reference/user-font-proxy.pdf.argb32.ref.png differ diff --git a/test/reference/user-font-proxy.pdf.ref.png b/test/reference/user-font-proxy.pdf.ref.png new file mode 100644 index 000000000..afe7cb0dc Binary files /dev/null and b/test/reference/user-font-proxy.pdf.ref.png differ diff --git a/test/reference/user-font-proxy.pdf.rgb24.ref.png b/test/reference/user-font-proxy.pdf.rgb24.ref.png new file mode 100644 index 000000000..cffa9edb7 Binary files /dev/null and b/test/reference/user-font-proxy.pdf.rgb24.ref.png differ diff --git a/test/reference/user-font-proxy.ps.ref.png b/test/reference/user-font-proxy.ps.ref.png new file mode 100644 index 000000000..a7b348b6a Binary files /dev/null and b/test/reference/user-font-proxy.ps.ref.png differ diff --git a/test/reference/user-font-proxy.quartz.ref.png b/test/reference/user-font-proxy.quartz.ref.png new file mode 100644 index 000000000..3bead3d1f Binary files /dev/null and b/test/reference/user-font-proxy.quartz.ref.png differ diff --git a/test/reference/user-font-proxy.ref.png b/test/reference/user-font-proxy.ref.png new file mode 100644 index 000000000..aa4f2556a Binary files /dev/null and b/test/reference/user-font-proxy.ref.png differ diff --git a/test/reference/user-font-proxy.svg.ref.png b/test/reference/user-font-proxy.svg.ref.png new file mode 100644 index 000000000..6c458485d Binary files /dev/null and b/test/reference/user-font-proxy.svg.ref.png differ diff --git a/test/reference/user-font-proxy.traps.ref.png b/test/reference/user-font-proxy.traps.ref.png new file mode 100644 index 000000000..094938c6e Binary files /dev/null and b/test/reference/user-font-proxy.traps.ref.png differ diff --git a/test/reference/user-font-rescale.base.argb32.ref.png b/test/reference/user-font-rescale.base.argb32.ref.png new file mode 100644 index 000000000..093906014 Binary files /dev/null and b/test/reference/user-font-rescale.base.argb32.ref.png differ diff --git a/test/reference/user-font-rescale.base.rgb24.ref.png b/test/reference/user-font-rescale.base.rgb24.ref.png new file mode 100644 index 000000000..093906014 Binary files /dev/null and b/test/reference/user-font-rescale.base.rgb24.ref.png differ diff --git a/test/reference/user-font-rescale.image16.ref.png b/test/reference/user-font-rescale.image16.ref.png new file mode 100644 index 000000000..a6be0d3d3 Binary files /dev/null and b/test/reference/user-font-rescale.image16.ref.png differ diff --git a/test/reference/user-font-rescale.ps.ref.png b/test/reference/user-font-rescale.ps.ref.png new file mode 100644 index 000000000..1ee4b1303 Binary files /dev/null and b/test/reference/user-font-rescale.ps.ref.png differ diff --git a/test/reference/user-font-rescale.quartz.ref.png b/test/reference/user-font-rescale.quartz.ref.png new file mode 100644 index 000000000..5fa2984ca Binary files /dev/null and b/test/reference/user-font-rescale.quartz.ref.png differ diff --git a/test/reference/user-font-rescale.ref.png b/test/reference/user-font-rescale.ref.png new file mode 100644 index 000000000..093906014 Binary files /dev/null and b/test/reference/user-font-rescale.ref.png differ diff --git a/test/reference/user-font-rescale.svg.ref.png b/test/reference/user-font-rescale.svg.ref.png new file mode 100644 index 000000000..6ed2a1924 Binary files /dev/null and b/test/reference/user-font-rescale.svg.ref.png differ diff --git a/test/reference/user-font-rescale.traps.ref.png b/test/reference/user-font-rescale.traps.ref.png new file mode 100644 index 000000000..093906014 Binary files /dev/null and b/test/reference/user-font-rescale.traps.ref.png differ diff --git a/test/reference/user-font.base.argb32.ref.png b/test/reference/user-font.base.argb32.ref.png new file mode 100644 index 000000000..896dbab25 Binary files /dev/null and b/test/reference/user-font.base.argb32.ref.png differ diff --git a/test/reference/user-font.base.rgb24.ref.png b/test/reference/user-font.base.rgb24.ref.png new file mode 100644 index 000000000..896dbab25 Binary files /dev/null and b/test/reference/user-font.base.rgb24.ref.png differ diff --git a/test/reference/user-font.image16.ref.png b/test/reference/user-font.image16.ref.png new file mode 100644 index 000000000..fcdfb5793 Binary files /dev/null and b/test/reference/user-font.image16.ref.png differ diff --git a/test/reference/user-font.mask.argb32.ref.png b/test/reference/user-font.mask.argb32.ref.png new file mode 100644 index 000000000..b234a8801 Binary files /dev/null and b/test/reference/user-font.mask.argb32.ref.png differ diff --git a/test/reference/user-font.mask.rgb24.ref.png b/test/reference/user-font.mask.rgb24.ref.png new file mode 100644 index 000000000..b234a8801 Binary files /dev/null and b/test/reference/user-font.mask.rgb24.ref.png differ diff --git a/test/reference/user-font.pdf.ref.png b/test/reference/user-font.pdf.ref.png new file mode 100644 index 000000000..de864074a Binary files /dev/null and b/test/reference/user-font.pdf.ref.png differ diff --git a/test/reference/user-font.ps.ref.png b/test/reference/user-font.ps.ref.png new file mode 100644 index 000000000..63f289698 Binary files /dev/null and b/test/reference/user-font.ps.ref.png differ diff --git a/test/reference/user-font.quartz.ref.png b/test/reference/user-font.quartz.ref.png new file mode 100644 index 000000000..8c0ec94e6 Binary files /dev/null and b/test/reference/user-font.quartz.ref.png differ diff --git a/test/reference/user-font.ref.png b/test/reference/user-font.ref.png new file mode 100644 index 000000000..4cff7e996 Binary files /dev/null and b/test/reference/user-font.ref.png differ diff --git a/test/reference/user-font.svg.ref.png b/test/reference/user-font.svg.ref.png new file mode 100644 index 000000000..1ff6ea0fe Binary files /dev/null and b/test/reference/user-font.svg.ref.png differ diff --git a/test/reference/user-font.traps.argb32.ref.png b/test/reference/user-font.traps.argb32.ref.png new file mode 100644 index 000000000..896dbab25 Binary files /dev/null and b/test/reference/user-font.traps.argb32.ref.png differ diff --git a/test/reference/user-font.traps.rgb24.ref.png b/test/reference/user-font.traps.rgb24.ref.png new file mode 100644 index 000000000..896dbab25 Binary files /dev/null and b/test/reference/user-font.traps.rgb24.ref.png differ diff --git a/test/reference/white-in-noop.base.argb32.ref.png b/test/reference/white-in-noop.base.argb32.ref.png new file mode 100644 index 000000000..f42bb8d5f Binary files /dev/null and b/test/reference/white-in-noop.base.argb32.ref.png differ diff --git a/test/reference/white-in-noop.base.rgb24.ref.png b/test/reference/white-in-noop.base.rgb24.ref.png new file mode 100644 index 000000000..f42bb8d5f Binary files /dev/null and b/test/reference/white-in-noop.base.rgb24.ref.png differ diff --git a/test/reference/white-in-noop.ref.png b/test/reference/white-in-noop.ref.png new file mode 100644 index 000000000..f42bb8d5f Binary files /dev/null and b/test/reference/white-in-noop.ref.png differ diff --git a/test/reference/world-map-fill.base.argb32.ref.png b/test/reference/world-map-fill.base.argb32.ref.png new file mode 100644 index 000000000..926c1a8ee Binary files /dev/null and b/test/reference/world-map-fill.base.argb32.ref.png differ diff --git a/test/reference/world-map-fill.base.rgb24.ref.png b/test/reference/world-map-fill.base.rgb24.ref.png new file mode 100644 index 000000000..926c1a8ee Binary files /dev/null and b/test/reference/world-map-fill.base.rgb24.ref.png differ diff --git a/test/reference/world-map-fill.image16.ref.png b/test/reference/world-map-fill.image16.ref.png new file mode 100644 index 000000000..c97cb5766 Binary files /dev/null and b/test/reference/world-map-fill.image16.ref.png differ diff --git a/test/reference/world-map-fill.ref.png b/test/reference/world-map-fill.ref.png new file mode 100644 index 000000000..23cec5046 Binary files /dev/null and b/test/reference/world-map-fill.ref.png differ diff --git a/test/reference/world-map-fill.traps.argb32.ref.png b/test/reference/world-map-fill.traps.argb32.ref.png new file mode 100644 index 000000000..926c1a8ee Binary files /dev/null and b/test/reference/world-map-fill.traps.argb32.ref.png differ diff --git a/test/reference/world-map-fill.traps.rgb24.ref.png b/test/reference/world-map-fill.traps.rgb24.ref.png new file mode 100644 index 000000000..926c1a8ee Binary files /dev/null and b/test/reference/world-map-fill.traps.rgb24.ref.png differ diff --git a/test/reference/world-map-stroke.base.argb32.ref.png b/test/reference/world-map-stroke.base.argb32.ref.png new file mode 100644 index 000000000..d00c9450e Binary files /dev/null and b/test/reference/world-map-stroke.base.argb32.ref.png differ diff --git a/test/reference/world-map-stroke.base.rgb24.ref.png b/test/reference/world-map-stroke.base.rgb24.ref.png new file mode 100644 index 000000000..d00c9450e Binary files /dev/null and b/test/reference/world-map-stroke.base.rgb24.ref.png differ diff --git a/test/reference/world-map-stroke.image16.ref.png b/test/reference/world-map-stroke.image16.ref.png new file mode 100644 index 000000000..771ff0b19 Binary files /dev/null and b/test/reference/world-map-stroke.image16.ref.png differ diff --git a/test/reference/world-map-stroke.mask.argb32.ref.png b/test/reference/world-map-stroke.mask.argb32.ref.png new file mode 100644 index 000000000..ec0d5021b Binary files /dev/null and b/test/reference/world-map-stroke.mask.argb32.ref.png differ diff --git a/test/reference/world-map-stroke.mask.rgb24.ref.png b/test/reference/world-map-stroke.mask.rgb24.ref.png new file mode 100644 index 000000000..ec0d5021b Binary files /dev/null and b/test/reference/world-map-stroke.mask.rgb24.ref.png differ diff --git a/test/reference/world-map-stroke.ref.png b/test/reference/world-map-stroke.ref.png new file mode 100644 index 000000000..5c6e7d52b Binary files /dev/null and b/test/reference/world-map-stroke.ref.png differ diff --git a/test/reference/world-map-stroke.traps.argb32.ref.png b/test/reference/world-map-stroke.traps.argb32.ref.png new file mode 100644 index 000000000..d00c9450e Binary files /dev/null and b/test/reference/world-map-stroke.traps.argb32.ref.png differ diff --git a/test/reference/world-map-stroke.traps.rgb24.ref.png b/test/reference/world-map-stroke.traps.rgb24.ref.png new file mode 100644 index 000000000..d00c9450e Binary files /dev/null and b/test/reference/world-map-stroke.traps.rgb24.ref.png differ diff --git a/test/reference/world-map.base.argb32.ref.png b/test/reference/world-map.base.argb32.ref.png new file mode 100644 index 000000000..6bae50d2b Binary files /dev/null and b/test/reference/world-map.base.argb32.ref.png differ diff --git a/test/reference/world-map.base.rgb24.ref.png b/test/reference/world-map.base.rgb24.ref.png new file mode 100644 index 000000000..6bae50d2b Binary files /dev/null and b/test/reference/world-map.base.rgb24.ref.png differ diff --git a/test/reference/world-map.image16.ref.png b/test/reference/world-map.image16.ref.png new file mode 100644 index 000000000..ea7ae8a9a Binary files /dev/null and b/test/reference/world-map.image16.ref.png differ diff --git a/test/reference/world-map.mask.argb32.ref.png b/test/reference/world-map.mask.argb32.ref.png new file mode 100644 index 000000000..218a303ac Binary files /dev/null and b/test/reference/world-map.mask.argb32.ref.png differ diff --git a/test/reference/world-map.mask.rgb24.ref.png b/test/reference/world-map.mask.rgb24.ref.png new file mode 100644 index 000000000..218a303ac Binary files /dev/null and b/test/reference/world-map.mask.rgb24.ref.png differ diff --git a/test/reference/world-map.ref.png b/test/reference/world-map.ref.png new file mode 100644 index 000000000..12743675c Binary files /dev/null and b/test/reference/world-map.ref.png differ diff --git a/test/reference/world-map.traps.argb32.ref.png b/test/reference/world-map.traps.argb32.ref.png new file mode 100644 index 000000000..6bae50d2b Binary files /dev/null and b/test/reference/world-map.traps.argb32.ref.png differ diff --git a/test/reference/world-map.traps.rgb24.ref.png b/test/reference/world-map.traps.rgb24.ref.png new file mode 100644 index 000000000..6bae50d2b Binary files /dev/null and b/test/reference/world-map.traps.rgb24.ref.png differ diff --git a/test/reference/xcb-huge-image-shm.base.argb32.ref.png b/test/reference/xcb-huge-image-shm.base.argb32.ref.png new file mode 100644 index 000000000..a0b24c8aa Binary files /dev/null and b/test/reference/xcb-huge-image-shm.base.argb32.ref.png differ diff --git a/test/reference/xcb-huge-image-shm.base.rgb24.ref.png b/test/reference/xcb-huge-image-shm.base.rgb24.ref.png new file mode 100644 index 000000000..a0b24c8aa Binary files /dev/null and b/test/reference/xcb-huge-image-shm.base.rgb24.ref.png differ diff --git a/test/reference/xcb-huge-image-shm.ref.png b/test/reference/xcb-huge-image-shm.ref.png new file mode 100644 index 000000000..5c274f824 Binary files /dev/null and b/test/reference/xcb-huge-image-shm.ref.png differ diff --git a/test/reference/xcb-huge-subimage.ref.png b/test/reference/xcb-huge-subimage.ref.png new file mode 100644 index 000000000..5c274f824 Binary files /dev/null and b/test/reference/xcb-huge-subimage.ref.png differ diff --git a/test/reference/xcb-snapshot-assert.base.argb32.ref.png b/test/reference/xcb-snapshot-assert.base.argb32.ref.png new file mode 100644 index 000000000..850ce59be Binary files /dev/null and b/test/reference/xcb-snapshot-assert.base.argb32.ref.png differ diff --git a/test/reference/xcb-snapshot-assert.base.rgb24.ref.png b/test/reference/xcb-snapshot-assert.base.rgb24.ref.png new file mode 100644 index 000000000..850ce59be Binary files /dev/null and b/test/reference/xcb-snapshot-assert.base.rgb24.ref.png differ diff --git a/test/reference/xcb-snapshot-assert.ref.png b/test/reference/xcb-snapshot-assert.ref.png new file mode 100644 index 000000000..850ce59be Binary files /dev/null and b/test/reference/xcb-snapshot-assert.ref.png differ diff --git a/test/reference/xcb-stress-cache.base.argb32.ref.png b/test/reference/xcb-stress-cache.base.argb32.ref.png new file mode 100644 index 000000000..850ce59be Binary files /dev/null and b/test/reference/xcb-stress-cache.base.argb32.ref.png differ diff --git a/test/reference/xcb-stress-cache.base.rgb24.ref.png b/test/reference/xcb-stress-cache.base.rgb24.ref.png new file mode 100644 index 000000000..850ce59be Binary files /dev/null and b/test/reference/xcb-stress-cache.base.rgb24.ref.png differ diff --git a/test/reference/xcb-stress-cache.ref.png b/test/reference/xcb-stress-cache.ref.png new file mode 100644 index 000000000..850ce59be Binary files /dev/null and b/test/reference/xcb-stress-cache.ref.png differ diff --git a/test/reference/xcb-surface-source.base.argb32.ref.png b/test/reference/xcb-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/xcb-surface-source.base.argb32.ref.png differ diff --git a/test/reference/xcb-surface-source.base.rgb24.ref.png b/test/reference/xcb-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/xcb-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/xcb-surface-source.image16.ref.png b/test/reference/xcb-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/xcb-surface-source.image16.ref.png differ diff --git a/test/reference/xcb-surface-source.ps.argb32.ref.png b/test/reference/xcb-surface-source.ps.argb32.ref.png new file mode 100644 index 000000000..910f895db Binary files /dev/null and b/test/reference/xcb-surface-source.ps.argb32.ref.png differ diff --git a/test/reference/xcb-surface-source.ps.rgb24.ref.png b/test/reference/xcb-surface-source.ps.rgb24.ref.png new file mode 100644 index 000000000..636b0f58b Binary files /dev/null and b/test/reference/xcb-surface-source.ps.rgb24.ref.png differ diff --git a/test/reference/xcb-surface-source.ref.png b/test/reference/xcb-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/xcb-surface-source.ref.png differ diff --git a/test/reference/xcomposite-projection.base.argb32.ref.png b/test/reference/xcomposite-projection.base.argb32.ref.png new file mode 100644 index 000000000..ea4dddf71 Binary files /dev/null and b/test/reference/xcomposite-projection.base.argb32.ref.png differ diff --git a/test/reference/xcomposite-projection.base.rgb24.ref.png b/test/reference/xcomposite-projection.base.rgb24.ref.png new file mode 100644 index 000000000..ea4dddf71 Binary files /dev/null and b/test/reference/xcomposite-projection.base.rgb24.ref.png differ diff --git a/test/reference/xcomposite-projection.image16.ref.png b/test/reference/xcomposite-projection.image16.ref.png new file mode 100644 index 000000000..f9bc3b621 Binary files /dev/null and b/test/reference/xcomposite-projection.image16.ref.png differ diff --git a/test/reference/xcomposite-projection.mask.argb32.ref.png b/test/reference/xcomposite-projection.mask.argb32.ref.png new file mode 100644 index 000000000..9ccabda9f Binary files /dev/null and b/test/reference/xcomposite-projection.mask.argb32.ref.png differ diff --git a/test/reference/xcomposite-projection.mask.rgb24.ref.png b/test/reference/xcomposite-projection.mask.rgb24.ref.png new file mode 100644 index 000000000..9ccabda9f Binary files /dev/null and b/test/reference/xcomposite-projection.mask.rgb24.ref.png differ diff --git a/test/reference/xcomposite-projection.quartz.ref.png b/test/reference/xcomposite-projection.quartz.ref.png new file mode 100644 index 000000000..02216071b Binary files /dev/null and b/test/reference/xcomposite-projection.quartz.ref.png differ diff --git a/test/reference/xcomposite-projection.ref.png b/test/reference/xcomposite-projection.ref.png new file mode 100644 index 000000000..abbea0866 Binary files /dev/null and b/test/reference/xcomposite-projection.ref.png differ diff --git a/test/reference/xcomposite-projection.traps.argb32.ref.png b/test/reference/xcomposite-projection.traps.argb32.ref.png new file mode 100644 index 000000000..ea4dddf71 Binary files /dev/null and b/test/reference/xcomposite-projection.traps.argb32.ref.png differ diff --git a/test/reference/xcomposite-projection.traps.rgb24.ref.png b/test/reference/xcomposite-projection.traps.rgb24.ref.png new file mode 100644 index 000000000..ea4dddf71 Binary files /dev/null and b/test/reference/xcomposite-projection.traps.rgb24.ref.png differ diff --git a/test/reference/xlib-expose-event.base.argb32.ref.png b/test/reference/xlib-expose-event.base.argb32.ref.png new file mode 100644 index 000000000..fd71f5a32 Binary files /dev/null and b/test/reference/xlib-expose-event.base.argb32.ref.png differ diff --git a/test/reference/xlib-expose-event.base.rgb24.ref.png b/test/reference/xlib-expose-event.base.rgb24.ref.png new file mode 100644 index 000000000..fd71f5a32 Binary files /dev/null and b/test/reference/xlib-expose-event.base.rgb24.ref.png differ diff --git a/test/reference/xlib-expose-event.image16.ref.png b/test/reference/xlib-expose-event.image16.ref.png new file mode 100644 index 000000000..54d5f2673 Binary files /dev/null and b/test/reference/xlib-expose-event.image16.ref.png differ diff --git a/test/reference/xlib-expose-event.ps.ref.png b/test/reference/xlib-expose-event.ps.ref.png new file mode 100644 index 000000000..88f49c134 Binary files /dev/null and b/test/reference/xlib-expose-event.ps.ref.png differ diff --git a/test/reference/xlib-expose-event.ref.png b/test/reference/xlib-expose-event.ref.png new file mode 100644 index 000000000..1cca0e749 Binary files /dev/null and b/test/reference/xlib-expose-event.ref.png differ diff --git a/test/reference/xlib-surface-source.base.argb32.ref.png b/test/reference/xlib-surface-source.base.argb32.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/xlib-surface-source.base.argb32.ref.png differ diff --git a/test/reference/xlib-surface-source.base.rgb24.ref.png b/test/reference/xlib-surface-source.base.rgb24.ref.png new file mode 100644 index 000000000..0d68a82cc Binary files /dev/null and b/test/reference/xlib-surface-source.base.rgb24.ref.png differ diff --git a/test/reference/xlib-surface-source.image16.ref.png b/test/reference/xlib-surface-source.image16.ref.png new file mode 100644 index 000000000..2a7460e28 Binary files /dev/null and b/test/reference/xlib-surface-source.image16.ref.png differ diff --git a/test/reference/xlib-surface-source.ps.argb32.ref.png b/test/reference/xlib-surface-source.ps.argb32.ref.png new file mode 100644 index 000000000..910f895db Binary files /dev/null and b/test/reference/xlib-surface-source.ps.argb32.ref.png differ diff --git a/test/reference/xlib-surface-source.ps.rgb24.ref.png b/test/reference/xlib-surface-source.ps.rgb24.ref.png new file mode 100644 index 000000000..636b0f58b Binary files /dev/null and b/test/reference/xlib-surface-source.ps.rgb24.ref.png differ diff --git a/test/reference/xlib-surface-source.ref.png b/test/reference/xlib-surface-source.ref.png new file mode 100644 index 000000000..018297208 Binary files /dev/null and b/test/reference/xlib-surface-source.ref.png differ diff --git a/test/reference/xlib-surface-source.svg12.argb32.xfail.png b/test/reference/xlib-surface-source.svg12.argb32.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/xlib-surface-source.svg12.argb32.xfail.png differ diff --git a/test/reference/xlib-surface-source.svg12.rgb24.xfail.png b/test/reference/xlib-surface-source.svg12.rgb24.xfail.png new file mode 100644 index 000000000..6ebcaf9a1 Binary files /dev/null and b/test/reference/xlib-surface-source.svg12.rgb24.xfail.png differ diff --git a/test/reference/zero-alpha.base.argb32.ref.png b/test/reference/zero-alpha.base.argb32.ref.png new file mode 100644 index 000000000..595c0aee4 Binary files /dev/null and b/test/reference/zero-alpha.base.argb32.ref.png differ diff --git a/test/reference/zero-alpha.base.rgb24.ref.png b/test/reference/zero-alpha.base.rgb24.ref.png new file mode 100644 index 000000000..595c0aee4 Binary files /dev/null and b/test/reference/zero-alpha.base.rgb24.ref.png differ diff --git a/test/reference/zero-alpha.ref.png b/test/reference/zero-alpha.ref.png new file mode 100644 index 000000000..d03727dda Binary files /dev/null and b/test/reference/zero-alpha.ref.png differ diff --git a/test/reference/zero-mask.base.argb32.ref.png b/test/reference/zero-mask.base.argb32.ref.png new file mode 100644 index 000000000..ffae8d995 Binary files /dev/null and b/test/reference/zero-mask.base.argb32.ref.png differ diff --git a/test/reference/zero-mask.base.rgb24.ref.png b/test/reference/zero-mask.base.rgb24.ref.png new file mode 100644 index 000000000..263c3d1e8 Binary files /dev/null and b/test/reference/zero-mask.base.rgb24.ref.png differ diff --git a/test/reference/zero-mask.ref.png b/test/reference/zero-mask.ref.png new file mode 100644 index 000000000..ffae8d995 Binary files /dev/null and b/test/reference/zero-mask.ref.png differ diff --git a/test/reflected-stroke.c b/test/reflected-stroke.c new file mode 100644 index 000000000..895396a6a --- /dev/null +++ b/test/reflected-stroke.c @@ -0,0 +1,91 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the author not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The author makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHOR. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static void +draw_symbol (cairo_t *cr) +{ + double dash[] = {6, 3}; + + cairo_rectangle (cr, -25, -25, 50, 50); + cairo_stroke (cr); + + cairo_move_to (cr, 0, -25); + cairo_curve_to (cr, 12.5, -12.5, 12.5, -12.5, 0, 0); + cairo_curve_to (cr, -12.5, 12.5, -12.5, 12.5, 0, 25); + cairo_curve_to (cr, 12.5, 12.5, 12.5, 12.5, 0, 0); + cairo_stroke (cr); + + cairo_save (cr); + cairo_set_dash (cr, dash, ARRAY_LENGTH (dash), 0.); + cairo_move_to (cr, 0, 0); + cairo_arc (cr, 0, 0, 12.5, 0, 3 * M_PI / 2); + cairo_close_path (cr); + cairo_stroke (cr); + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_save (cr); + cairo_translate (cr, 50, 50); + cairo_scale (cr, 1, 1); + draw_symbol (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, 150, 50); + cairo_scale (cr, -1, 1); + draw_symbol (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, 150, 150); + cairo_scale (cr, -1, -1); + draw_symbol (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, 50, 150); + cairo_scale (cr, 1, -1); + draw_symbol (cr); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (reflected_stroke, + "Exercises the stroker with a reflected ctm", + "stroke, transform", /* keywords */ + NULL, /* requirements */ + 200, 200, + NULL, draw) diff --git a/test/rel-path.c b/test/rel-path.c new file mode 100644 index 000000000..d1ef25920 --- /dev/null +++ b/test/rel-path.c @@ -0,0 +1,129 @@ +/* + * Copyright © 2005 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "cairo-test.h" + +#define SIZE 10 + +static cairo_status_t +invalid_rel_move_to (cairo_surface_t *target) +{ + cairo_t *cr; + cairo_status_t status; + + cr = cairo_create (target); + cairo_rel_move_to (cr, SIZE, SIZE/2); + status = cairo_status (cr); + cairo_destroy (cr); + + return status; +} + +static cairo_status_t +invalid_rel_line_to (cairo_surface_t *target) +{ + cairo_t *cr; + cairo_status_t status; + + cr = cairo_create (target); + cairo_rel_line_to (cr, -SIZE, SIZE/2); + status = cairo_status (cr); + cairo_destroy (cr); + + return status; +} + +static cairo_status_t +invalid_rel_curve_to (cairo_surface_t *target) +{ + cairo_t *cr; + cairo_status_t status; + + cr = cairo_create (target); + cairo_rel_curve_to (cr, + SIZE/2, -SIZE/2, + SIZE*2/3, -SIZE/3, + SIZE/2, -SIZE); + status = cairo_status (cr); + cairo_destroy (cr); + + return status; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_status_t status; + cairo_test_status_t result; + + /* first test that a relative move without a current point fails... */ + status = invalid_rel_move_to (cairo_get_target (cr)); + if (status != CAIRO_STATUS_NO_CURRENT_POINT) { + result = cairo_test_status_from_status (ctx, status); + if (result == CAIRO_TEST_NO_MEMORY) + return result; + + cairo_test_log (ctx, "Error: invalid cairo_rel_move_to() did not raise NO_CURRENT_POINT\n"); + return result; + } + + status = invalid_rel_line_to (cairo_get_target (cr)); + if (status != CAIRO_STATUS_NO_CURRENT_POINT) { + result = cairo_test_status_from_status (ctx, status); + if (result == CAIRO_TEST_NO_MEMORY) + return result; + + cairo_test_log (ctx, "Error: invalid cairo_rel_line_to() did not raise NO_CURRENT_POINT\n"); + return result; + } + + status = invalid_rel_curve_to (cairo_get_target (cr)); + if (status != CAIRO_STATUS_NO_CURRENT_POINT) { + result = cairo_test_status_from_status (ctx, status); + if (result == CAIRO_TEST_NO_MEMORY) + return result; + + cairo_test_log (ctx, "Error: invalid cairo_rel_curve_to() did not raise NO_CURRENT_POINT\n"); + return result; + } + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_move_to (cr, 0, 0); + cairo_rel_move_to (cr, SIZE, SIZE/2); + cairo_rel_line_to (cr, -SIZE, SIZE/2); + cairo_rel_curve_to (cr, + SIZE/2, -SIZE/2, + SIZE*2/3, -SIZE/3, + SIZE/2, -SIZE); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rel_path, + "Tests calls to various relative path functions", + "path", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/rgb24-ignore-alpha.c b/test/rgb24-ignore-alpha.c new file mode 100644 index 000000000..1c9d57e9e --- /dev/null +++ b/test/rgb24-ignore-alpha.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define WIDTH 2 +#define HEIGHT 2 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + /* Four green pixels with different "alpha" values, (but which + * should be entirely ignored). */ + uint32_t colors[4] = { + 0xff00ff00, 0x8800ff00, + 0x4400ff00, 0x0000ff00 + }; + + surface = cairo_image_surface_create_for_data ((unsigned char *) colors, + CAIRO_FORMAT_RGB24, 2, 2, 8); + + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + + cairo_surface_finish (surface); /* colors will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rgb24_ignore_alpha, + "Test that when using an RGB24 image as a source, there is no alpha channel", + "image, alpha", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/romedalen.jpg b/test/romedalen.jpg new file mode 100644 index 000000000..d655e3d89 Binary files /dev/null and b/test/romedalen.jpg differ diff --git a/test/romedalen.png b/test/romedalen.png new file mode 100644 index 000000000..0c41eb0cf Binary files /dev/null and b/test/romedalen.png differ diff --git a/test/rotate-image-surface-paint.c b/test/rotate-image-surface-paint.c new file mode 100644 index 000000000..42fda6ec2 --- /dev/null +++ b/test/rotate-image-surface-paint.c @@ -0,0 +1,172 @@ +/* + * Copyright © 2005, 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 20 +#define PAD 2 + +static cairo_pattern_t * +create_image_source (int size) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + cairo_t *cr; + + /* Create an image surface with my favorite four colors in each + * quadrant. */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, size, size); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 0, 0, size / 2, size / 2); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, size / 2, 0, size - size / 2, size / 2); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, 0, size / 2, size / 2, size - size / 2); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, size / 2, size / 2, size - size / 2, size - size / 2); + cairo_fill (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *source; + int surface_size = sqrt ((SIZE - 2*PAD)*(SIZE - 2*PAD)/2); + + /* Use a gray (neutral) background, so we can spot if the backend pads + * with any other colour. + */ + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + cairo_translate(cr, SIZE/2, SIZE/2); + cairo_rotate (cr, M_PI / 4.0); + cairo_translate (cr, -surface_size/2, -surface_size/2); + + source = create_image_source (surface_size); + cairo_pattern_set_filter (source, CAIRO_FILTER_NEAREST); + cairo_set_source(cr, source); + cairo_pattern_destroy (source); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +clip_draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *source; + int surface_size = sqrt ((SIZE - 2*PAD)*(SIZE - 2*PAD)/2); + + /* Use a gray (neutral) background, so we can spot if the backend pads + * with any other colour. + */ + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + cairo_rectangle (cr, 2*PAD, 2*PAD, SIZE-4*PAD, SIZE-4*PAD); + cairo_clip (cr); + + cairo_translate(cr, SIZE/2, SIZE/2); + cairo_rotate (cr, M_PI / 4.0); + cairo_translate (cr, -surface_size/2, -surface_size/2); + + source = create_image_source (surface_size); + cairo_pattern_set_filter (source, CAIRO_FILTER_NEAREST); + cairo_set_source(cr, source); + cairo_pattern_destroy (source); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_clip (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *source; + int surface_size = sqrt ((SIZE - 2*PAD)*(SIZE - 2*PAD)/2); + + /* Use a gray (neutral) background, so we can spot if the backend pads + * with any other colour. + */ + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + cairo_translate(cr, SIZE/2, SIZE/2); + cairo_rotate (cr, M_PI / 4.0); + cairo_translate (cr, -surface_size/2, -surface_size/2); + + cairo_rectangle (cr, PAD, PAD, surface_size-2*PAD, surface_size-2*PAD); + cairo_clip (cr); + + source = create_image_source (surface_size); + cairo_pattern_set_filter (source, CAIRO_FILTER_NEAREST); + cairo_set_source(cr, source); + cairo_pattern_destroy (source); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rotate_image_surface_paint, + "Test call sequence: image_surface_create; rotate; set_source_surface; paint" + "\nThis test is known to fail on the ps backend currently", + "image, transform, paint", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) + +CAIRO_TEST (clip_rotate_image_surface_paint, + "Test call sequence: image_surface_create; rotate; set_source_surface; paint" + "\nThis test is known to fail on the ps backend currently", + "image, transform, paint", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, clip_draw) +CAIRO_TEST (rotate_clip_image_surface_paint, + "Test call sequence: image_surface_create; rotate; set_source_surface; paint" + "\nThis test is known to fail on the ps backend currently", + "image, transform, paint", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_clip) diff --git a/test/rotate-stroke-box.c b/test/rotate-stroke-box.c new file mode 100644 index 000000000..862abc933 --- /dev/null +++ b/test/rotate-stroke-box.c @@ -0,0 +1,49 @@ +/* + * Copyright © 2013 Adrian Johnson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" +#include + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_restore (cr); + + cairo_rectangle (cr, 5, 5, 20, 20); + cairo_rotate (cr, M_PI/4); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rotate_stroke_box, + "Ensure rectangle path optimization works when the stroking transform is non rectilinear", + "path", /* keywords */ + NULL, /* requirements */ + 30, 30, + NULL, draw) diff --git a/test/rotated-clip.c b/test/rotated-clip.c new file mode 100644 index 000000000..4ca4566d5 --- /dev/null +++ b/test/rotated-clip.c @@ -0,0 +1,110 @@ +/* + * Copyright © 2007 Adrian Johnson + * Copyright © 2009 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + * Chris Wilson + */ + +#include "cairo-test.h" + +#define PAT_WIDTH 120 +#define PAT_HEIGHT 120 +#define SIZE (PAT_WIDTH*2) +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_matrix_t m; + + /* make the output opaque */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_translate (cr, PAD, PAD); + + cairo_matrix_init_scale (&m, 2, 1.5); + cairo_matrix_rotate (&m, 1); + cairo_matrix_translate (&m, -PAT_WIDTH/4.0, -PAT_WIDTH/2.0); + cairo_matrix_invert (&m); + cairo_set_matrix (cr, &m); + + cairo_rectangle (cr, 0, 0, PAT_WIDTH, PAT_HEIGHT); + cairo_clip (cr); + + cairo_set_source_rgba (cr, 1, 0, 1, 0.5); + cairo_rectangle (cr, PAT_WIDTH/6.0, PAT_HEIGHT/6.0, PAT_WIDTH/4.0, PAT_HEIGHT/4.0); + cairo_fill (cr); + + cairo_set_source_rgba (cr, 0, 1, 1, 0.5); + cairo_rectangle (cr, PAT_WIDTH/2.0, PAT_HEIGHT/2.0, PAT_WIDTH/4.0, PAT_HEIGHT/4.0); + cairo_fill (cr); + + cairo_set_line_width (cr, 1); + cairo_move_to (cr, PAT_WIDTH/6.0, 0); + cairo_line_to (cr, 0, 0); + cairo_line_to (cr, 0, PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + + cairo_move_to (cr, PAT_WIDTH/6.0, PAT_HEIGHT); + cairo_line_to (cr, 0, PAT_HEIGHT); + cairo_line_to (cr, 0, 5*PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_stroke (cr); + + cairo_move_to (cr, 5*PAT_WIDTH/6.0, 0); + cairo_line_to (cr, PAT_WIDTH, 0); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + + cairo_move_to (cr, 5*PAT_WIDTH/6.0, PAT_HEIGHT); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT); + cairo_line_to (cr, PAT_WIDTH, 5*PAT_HEIGHT/6.0); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_set_line_width (cr, PAT_WIDTH/10.0); + + cairo_move_to (cr, 0, PAT_HEIGHT/4.0); + cairo_line_to (cr, PAT_WIDTH, PAT_HEIGHT/4.0); + cairo_stroke (cr); + + cairo_move_to (cr, PAT_WIDTH/4.0, 0); + cairo_line_to (cr, PAT_WIDTH/4.0, PAT_WIDTH); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rotated_clip, + "Test clipping with non identity pattern matrix", + "clip", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/rounded-rectangle-fill.c b/test/rounded-rectangle-fill.c new file mode 100644 index 000000000..d211cf626 --- /dev/null +++ b/test/rounded-rectangle-fill.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 80 + +/* A very simple test to exercise the scan rasterisers with constant regions. */ + +static void +rounded_rectangle (cairo_t *cr, int x, int y, int w, int h, int r) +{ + cairo_new_sub_path (cr); + cairo_arc (cr, x + r, y + r, r, M_PI, 3 * M_PI / 2); + cairo_arc (cr, x + w - r, y + r, r, 3 *M_PI / 2, 2 * M_PI); + cairo_arc (cr, x + w - r, y + h - r, r, 0, M_PI / 2); + cairo_arc (cr, x + r, y + h - r, r, M_PI / 2, M_PI); + cairo_close_path (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + rounded_rectangle (cr, 5, 5, width-10, height-10, 15); + rounded_rectangle (cr, 15, 15, width-30, height-30, 5); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rounded_rectangle_fill, + "Tests handling of rounded rectangles, the UI designers favourite", + "fill, rounded-rectangle", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/rounded-rectangle-stroke.c b/test/rounded-rectangle-stroke.c new file mode 100644 index 000000000..22bc51557 --- /dev/null +++ b/test/rounded-rectangle-stroke.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define SIZE 80 + +/* A very simple test to exercise the scan rasterisers with constant regions. */ + +static void +rounded_rectangle (cairo_t *cr, int x, int y, int w, int h, int r) +{ + cairo_new_sub_path (cr); + cairo_arc (cr, x + r, y + r, r, M_PI, 3 * M_PI / 2); + cairo_arc (cr, x + w - r, y + r, r, 3 *M_PI / 2, 2 * M_PI); + cairo_arc (cr, x + w - r, y + h - r, r, 0, M_PI / 2); + cairo_arc (cr, x + r, y + h - r, r, M_PI / 2, M_PI); + cairo_close_path (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Paint background white, then draw in black. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + + cairo_set_line_width (cr, 10); + rounded_rectangle (cr, 10, 10, width-20, height-20, 10); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (rounded_rectangle_stroke, + "Tests handling of rounded rectangles, the UI designers favourite", + "stroke, rounded-rectangle", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/run-cairo-test-suite.sh b/test/run-cairo-test-suite.sh new file mode 100755 index 000000000..567d2b14b --- /dev/null +++ b/test/run-cairo-test-suite.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -m + +if `which gnome-screensaver-command`; then + gnome-screensaver-command -i -n "cairo-test-suite" -r "Cairo needs to read back from the screen in order to test rendering to xlib" & + pid=$! + + restore_screensaver() { kill $pid; } +else + restore_screensaver() { :; } +fi + +trap cleanup SIGINT SIGTERM + +./cairo-test-suite "$*" + +restore_screensaver diff --git a/test/sample.c b/test/sample.c new file mode 100644 index 000000000..caf68777e --- /dev/null +++ b/test/sample.c @@ -0,0 +1,117 @@ +/* + * Copyright 2012 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Test the fidelity of the rasterisation, because Cairo is my favourite + * driver test suite. + */ + +#define GENERATE_REFERENCE 0 + +#define WIDTH 256 +#define HEIGHT 40 + +#include "../src/cairo-fixed-type-private.h" +#define PRECISION (1 << CAIRO_FIXED_FRAC_BITS) + +static cairo_test_status_t +vertical (cairo_t *cr, int width, int height) +{ + int x; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 1); + for (x = -HEIGHT*PRECISION-2; x <= (WIDTH+HEIGHT)*PRECISION+2; x += 4) { + cairo_move_to (cr, x / (double)PRECISION - 2, -2); + cairo_rel_line_to (cr, 0, HEIGHT + 4); + } + cairo_set_line_width (cr, 2 / (double)PRECISION); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +horizontal (cairo_t *cr, int width, int height) +{ + int x; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 1); + for (x = -HEIGHT*PRECISION-2; x <= (WIDTH+HEIGHT)*PRECISION+2; x += 4) { + cairo_move_to (cr, -2, x / (double)PRECISION - 2); + cairo_rel_line_to (cr, HEIGHT + 4, 0); + } + cairo_set_line_width (cr, 2 / (double)PRECISION); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +diagonal (cairo_t *cr, int width, int height) +{ + int x; + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_source_rgba (cr, 1, 1, 1, 1); + for (x = -HEIGHT*PRECISION-2; x <= (WIDTH+HEIGHT)*PRECISION+2; x += 6) { + cairo_move_to (cr, x / (double)PRECISION - 2, -2); + cairo_rel_line_to (cr, HEIGHT + 4, HEIGHT + 4); + } + cairo_set_line_width (cr, 2 / (double)PRECISION); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (sample_vertical, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster slow", /* requirements */ + WIDTH, HEIGHT, + NULL, vertical) + +CAIRO_TEST (sample_horizontal, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster slow", /* requirements */ + WIDTH, HEIGHT, + NULL, horizontal) + +CAIRO_TEST (sample_diagonal, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster slow", /* requirements */ + WIDTH, HEIGHT, + NULL, diagonal) diff --git a/test/scale-down-source-surface-paint.c b/test/scale-down-source-surface-paint.c new file mode 100644 index 000000000..8cf0e06f2 --- /dev/null +++ b/test/scale-down-source-surface-paint.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2005,2007 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff + }; + + /* First paint opaque background (black) so we don't need separate + * ARGB32 and RGB24 reference images. */ + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_paint (cr); + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_scale (cr, 0.5, 0.5); + + cairo_set_source_surface (cr, surface, 4, 4); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (scale_down_source_surface_paint, + "Test call sequence: cairo_scale; cairo_set_source_surface; cairo_paint, with a scale < 1.0", + "paint, transform", /* keywords */ + NULL, /* requirements */ + 6, 6, + NULL, draw) diff --git a/test/scale-offset-image.c b/test/scale-offset-image.c new file mode 100644 index 000000000..7243a0669 --- /dev/null +++ b/test/scale-offset-image.c @@ -0,0 +1,143 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * Test case derived from the bug report by Michel Iwaniec: + * http://lists.cairographics.org/archives/cairo/2008-November/015660.html + */ + +#include "cairo-test.h" + +static cairo_surface_t * +create_source (cairo_surface_t *target, int width, int height) +{ + cairo_surface_t *similar; + cairo_t *cr; + + similar = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, + width - 4, height - 4, + 2, 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, + width - 2, height - 4, + 2, 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, + width - 4, height - 2, + 2, 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, + width - 2, height - 2, + 2, 2); + cairo_fill (cr); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static void +draw_grid (cairo_t *cr, cairo_pattern_t *pattern, int dst_x, int dst_y) +{ + cairo_matrix_t m; + + cairo_save (cr); + cairo_translate (cr, dst_x, dst_y); + cairo_scale (cr, 16, 16); + cairo_rotate (cr, 1); + + cairo_matrix_init_translate (&m, 2560-4, 1280-4); + cairo_pattern_set_matrix (pattern, &m); + cairo_set_source (cr, pattern); + cairo_rectangle (cr, 0, 0, 4, 4); + cairo_fill (cr); + + cairo_set_source_rgb (cr, .7, .7, .7); + cairo_set_line_width (cr, 1./16); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 4, 0); + cairo_move_to (cr, 0, 2); + cairo_line_to (cr, 4, 2); + cairo_move_to (cr, 0, 4); + cairo_line_to (cr, 4, 4); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 0, 4); + cairo_move_to (cr, 2, 0); + cairo_line_to (cr, 2, 4); + cairo_move_to (cr, 4, 0); + cairo_line_to (cr, 4, 4); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + cairo_pattern_t *pattern; + + cairo_paint (cr); + + source = create_source (cairo_get_target (cr), 2560, 1280); + pattern = cairo_pattern_create_for_surface (source); + cairo_surface_destroy (source); + + cairo_pattern_set_filter (pattern, CAIRO_FILTER_NEAREST); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE); + + draw_grid (cr, pattern, 50, 0); + draw_grid (cr, pattern, 130, 0); + draw_grid (cr, pattern, 210, 0); + draw_grid (cr, pattern, 290, 0); + + draw_grid (cr, pattern, 50, 230); + draw_grid (cr, pattern, 130, 230); + draw_grid (cr, pattern, 210, 230); + draw_grid (cr, pattern, 290, 230); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +/* XFAIL: loss of precision converting a cairo matrix to */ +CAIRO_TEST (scale_offset_image, + "Tests drawing surfaces under various scales and transforms", + "surface, scale-offset", /* keywords */ + NULL, /* requirements */ + 320, 320, + NULL, draw) + diff --git a/test/scale-offset-similar.c b/test/scale-offset-similar.c new file mode 100644 index 000000000..e9e6a2bbe --- /dev/null +++ b/test/scale-offset-similar.c @@ -0,0 +1,143 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* + * Test case derived from the bug report by Michel Iwaniec: + * http://lists.cairographics.org/archives/cairo/2008-November/015660.html + */ + +#include "cairo-test.h" + +static cairo_surface_t * +create_source (cairo_surface_t *target, int width, int height) +{ + cairo_surface_t *similar; + cairo_t *cr; + + similar = cairo_surface_create_similar (target, + CAIRO_CONTENT_COLOR, + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, + width - 4, height - 4, + 2, 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, + width - 2, height - 4, + 2, 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, + width - 4, height - 2, + 2, 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, + width - 2, height - 2, + 2, 2); + cairo_fill (cr); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static void +draw_grid (cairo_t *cr, cairo_pattern_t *pattern, int dst_x, int dst_y) +{ + cairo_matrix_t m; + + cairo_save (cr); + cairo_translate (cr, dst_x, dst_y); + cairo_scale (cr, 16, 16); + cairo_rotate (cr, 1); + + cairo_matrix_init_translate (&m, 2560-4, 1280-4); + cairo_pattern_set_matrix (pattern, &m); + cairo_set_source (cr, pattern); + cairo_rectangle (cr, 0, 0, 4, 4); + cairo_fill (cr); + + cairo_set_source_rgb (cr, .7, .7, .7); + cairo_set_line_width (cr, 1./16); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 4, 0); + cairo_move_to (cr, 0, 2); + cairo_line_to (cr, 4, 2); + cairo_move_to (cr, 0, 4); + cairo_line_to (cr, 4, 4); + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 0, 4); + cairo_move_to (cr, 2, 0); + cairo_line_to (cr, 2, 4); + cairo_move_to (cr, 4, 0); + cairo_line_to (cr, 4, 4); + cairo_stroke (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + cairo_pattern_t *pattern; + + cairo_paint (cr); + + source = create_source (cairo_get_target (cr), 2560, 1280); + pattern = cairo_pattern_create_for_surface (source); + cairo_surface_destroy (source); + + cairo_pattern_set_filter (pattern, CAIRO_FILTER_NEAREST); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_NONE); + + draw_grid (cr, pattern, 50, 0); + draw_grid (cr, pattern, 130, 0); + draw_grid (cr, pattern, 210, 0); + draw_grid (cr, pattern, 290, 0); + + draw_grid (cr, pattern, 50, 230); + draw_grid (cr, pattern, 130, 230); + draw_grid (cr, pattern, 210, 230); + draw_grid (cr, pattern, 290, 230); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (scale_offset_similar, + "Tests drawing surfaces under various scales and transforms", + "surface, scale-offset", /* keywords */ + NULL, /* requirements */ + 320, 320, + NULL, draw) + diff --git a/test/scale-source-surface-paint.c b/test/scale-source-surface-paint.c new file mode 100644 index 000000000..0c0a3acd8 --- /dev/null +++ b/test/scale-source-surface-paint.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff + }; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_scale (cr, 2, 2); + + cairo_set_source_surface (cr, surface, 1 , 1); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_paint (cr); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (scale_source_surface_paint, + "Test call sequence: cairo_scale; cairo_set_source_surface; cairo_paint", + "paint, transform", /* keywords */ + NULL, /* requirements */ + 12, 12, + NULL, draw) diff --git a/test/scaled-font-zero-matrix.c b/test/scaled-font-zero-matrix.c new file mode 100644 index 000000000..d4f79a669 --- /dev/null +++ b/test/scaled-font-zero-matrix.c @@ -0,0 +1,63 @@ +/* + * Copyright © 2008 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Jeff Muizelaar + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_face_t *font_face; + cairo_font_options_t *font_options; + cairo_scaled_font_t *scaled_font; + cairo_matrix_t identity; + cairo_matrix_t zero; + + cairo_matrix_init_identity(&identity); + + zero = identity; + cairo_matrix_scale(&zero, 0, 0); + + font_face = cairo_get_font_face (cr); + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + scaled_font = cairo_scaled_font_create (font_face, + &identity, + &zero, + font_options); + cairo_set_scaled_font (cr, scaled_font); + cairo_show_text (cr, "Hello"); + cairo_scaled_font_destroy (scaled_font); + cairo_font_options_destroy (font_options); + + return cairo_test_status_from_status (cairo_test_get_context (cr), + cairo_status(cr)); +} + +CAIRO_TEST (scaled_font_zero_matrix, + "Test that scaled fonts with a degenerate matrix work", + "zero, matrix, degenerate, scaled-font", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/scarab.jpg b/test/scarab.jpg new file mode 100644 index 000000000..6a66ff789 Binary files /dev/null and b/test/scarab.jpg differ diff --git a/test/select-font-face.c b/test/select-font-face.c new file mode 100644 index 000000000..ec4b27cf3 --- /dev/null +++ b/test/select-font-face.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_set_font_size (cr, TEXT_SIZE); + cairo_move_to (cr, 0, TEXT_SIZE); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Serif", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, "i-am-serif"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-sans"); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans Mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_show_text (cr, " i-am-mono"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (select_font_face, + "Tests using cairo_select_font_face to draw text in different faces", + "font", /* keywords */ + NULL, /* requirements */ + 192, TEXT_SIZE + 4, + NULL, draw) diff --git a/test/select-font-no-show-text.c b/test/select-font-no-show-text.c new file mode 100644 index 000000000..b2b47966f --- /dev/null +++ b/test/select-font-no-show-text.c @@ -0,0 +1,59 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +/* Bug history + * + * 2005-04-12 Carl Worth + * + * I noticed that if we call cairo_select_font_face, but then do a + * cairo_destroy before ever drawing any text, then we get: + * + * *** glibc detected *** double free or corruption (fasttop): 0x083274d0 *** + * Aborted + * + * 2005-04-14 Owen Taylor + * + * Fixed... just a stray free(). + */ + +#include "cairo-test.h" +#include + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (select_font_no_show_text, + "Test calling cairo_select_font_face but never drawing text.", + "font", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/self-copy-overlap.c b/test/self-copy-overlap.c new file mode 100644 index 000000000..6e3b39c91 --- /dev/null +++ b/test/self-copy-overlap.c @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* Question: are patterns mutable? The answer depends on who you ask... */ + +#include "cairo-test.h" + +/* This test is only interesting if the target has alpha */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgba (cr, 0, 0, 0, .01); + cairo_paint (cr); + + cairo_set_source_surface (cr, cairo_get_target (cr), 1, 1); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +/* + * XFAIL: vector surfaces take snapshot of patterns in contrast to the raster + * backends which don't. One solution would be to clone overlapping areas of + * dst/source, so patterns were effectively snapshotted across all backends. + */ +CAIRO_TEST (self_copy_overlap, + "Tests painting to itself using itself as the source" + "\nBackends treat this case inconsistently---vector backends are creating snapshots.", + "self-copy", /* keywords */ + NULL, /* requirements */ + 200, 200, + NULL, draw) diff --git a/test/self-copy.c b/test/self-copy.c new file mode 100644 index 000000000..bef02e98b --- /dev/null +++ b/test/self-copy.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Owen Taylor + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 40 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + + /* Paint a diagonal division as a test image */ + cairo_set_source_rgb (cr, 1, 1, 1); /* White */ + cairo_paint (cr); + + cairo_move_to (cr, SIZE, 0); + cairo_line_to (cr, SIZE, SIZE); + cairo_line_to (cr, 0, SIZE); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_fill (cr); + + /* Create a pattern with the target surface as the source, + * offset by SIZE/2 + */ + pattern = cairo_pattern_create_for_surface (cairo_get_group_target (cr)); + + cairo_matrix_init_translate (&matrix, - SIZE / 2, - SIZE / 2); + cairo_pattern_set_matrix (pattern, &matrix); + + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + /* Copy two rectangles from the upper-left quarter of the image to + * the lower right. It will work if we use cairo_fill(), but the + * cairo_clip() cairo_paint() combination fails because the clip + * on the surface as a destination affects it as the source as + * well. + */ + cairo_rectangle (cr, + 2 * SIZE / 4, 2 * SIZE / 4, + SIZE / 4, SIZE / 4); + cairo_rectangle (cr, + 3 * SIZE / 4, 3 * SIZE / 4, + SIZE / 4, SIZE / 4); + cairo_clip (cr); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; + +} + +CAIRO_TEST (self_copy, + "Test copying from a surface to itself with a clip", + "paint", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/self-intersecting.c b/test/self-intersecting.c new file mode 100644 index 000000000..8053235ac --- /dev/null +++ b/test/self-intersecting.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2005-06-01 Carl Worth + * + * There's a long-standing bug in that self-intersecting paths give + * an incorrect result when stroked. The problem is that the + * trapezoids are generated incrementally along the stroke and as + * such, are not disjoint. The errant intersections of these + * trapezoids then leads to overfilled pixels. + * + * The test belows first creates and fills a path. Then it creates a + * second path which has a stroked boundary identical to the first + * filled path. But the results of the two operations are + * different. The most obvious difference is in the central region + * where the entire path intersects itself. But notice that every + * time the path turns there are also errors on the inside of the + * turn, (since the subsequent trapezoids along the path intersect). + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 1.0, 1.0); + + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + + /* First draw the desired shape with a fill */ + cairo_rectangle (cr, 0.5, 0.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 3.5, 4.0, 4.0); + cairo_rectangle (cr, 3.5, 1.5, -2.0, 2.0); + cairo_rectangle (cr, 6.5, 4.5, -2.0, 2.0); + + cairo_fill (cr); + + /* Then try the same thing with a stroke */ + cairo_translate (cr, 0, 10); + cairo_move_to (cr, 1.0, 1.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, 6.0); + cairo_rel_line_to (cr, 3.0, 0.0); + cairo_rel_line_to (cr, 0.0, -3.0); + cairo_rel_line_to (cr, -6.0, 0.0); + cairo_close_path (cr); + + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (self_intersecting, + "Test strokes of self-intersecting paths" + "\nSelf-intersecting strokes are wrong due to incremental trapezoidization.", + "stroke, trap", /* keywords */ + NULL, /* requirements */ + 10, 20, + NULL, draw) diff --git a/test/set-source.c b/test/set-source.c new file mode 100644 index 000000000..7e54626a8 --- /dev/null +++ b/test/set-source.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + uint32_t color = 0x8019334c; + cairo_surface_t *surface; + cairo_pattern_t *pattern; + + surface = cairo_image_surface_create_for_data ((unsigned char *) &color, + CAIRO_FORMAT_ARGB32, 1, 1, 4); + pattern = cairo_pattern_create_for_surface (surface); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + + /* Several different means of making mostly the same color (though + * we can't get anything but alpha==1.0 out of + * cairo_set_source_rgb. */ + for (i=0; i < width; i++) { + switch (i) { + case 0: + cairo_set_source_rgb (cr, .6, .7, .8); + break; + case 1: + cairo_set_source_rgba (cr, .2, .4, .6, 0.5); + break; + case 2: +#if WE_HAD_SUPPORT_FOR_PREMULTIPLIED + cairo_set_source_rgba_premultiplied (cr, .1, .2, .3, 0.5); +#else + cairo_set_source_rgba (cr, .2, .4, .6, 0.5); +#endif + break; + case 3: + default: + cairo_set_source (cr, pattern); + break; + } + + cairo_rectangle (cr, i, 0, 1, height); + cairo_fill (cr); + } + + cairo_pattern_destroy (pattern); + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (set_source, + "Tests calls to various set_source functions", + "api", /* keywords */ + NULL, /* requirements */ + 5, 5, + NULL, draw) diff --git a/test/shape-general-convex.c b/test/shape-general-convex.c new file mode 100644 index 000000000..b9241bb9f --- /dev/null +++ b/test/shape-general-convex.c @@ -0,0 +1,88 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* A general convex shape with a twist. */ + +#include "cairo-test.h" + +#define SIZE (100) +#define PAD 4 + +static void +limacon (cairo_t *cr, double a, double b, double radius) +{ + int i; + + cairo_save (cr); + cairo_translate (cr, PAD, 0); + for (i = 0; i < 360; i++) { + double theta = i * M_PI / 180; + double r = b + a * cos (theta); + double x = radius * r * cos (theta); + double y = radius * r * sin (theta); + cairo_line_to (cr, x, y); + } + cairo_close_path (cr); + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_save (cr); + cairo_translate (cr, 2*PAD, PAD); + + cairo_translate (cr, SIZE/2, SIZE/2); + limacon (cr, 1, .5, SIZE/3); /* trivia, this is a trisectrix */ + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_stroke (cr); + + cairo_scale (cr, -1, 1); + + limacon (cr, 1, .5, SIZE/3); /* trivia, this is a trisectrix */ + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill_preserve (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (shape_general_convex, + "A general shape that is not as convex as it first appears", + "fill,stroke", /* keywords */ + NULL, /* requirements */ + SIZE+4*PAD, SIZE+4*PAD, + NULL, draw) diff --git a/test/shape-sierpinski.c b/test/shape-sierpinski.c new file mode 100644 index 000000000..9d2017067 --- /dev/null +++ b/test/shape-sierpinski.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +/* I thought I spied a bug... */ + +#include "cairo-test.h" + +#define WIDTH (1024) +#define HEIGHT (600) + +static const double m_1_sqrt_3 = 0.577359269; + +static void +T (cairo_t *cr, int size) +{ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, size, 0); + cairo_line_to (cr, size/2, size*m_1_sqrt_3); + + size /= 2; + if (size >= 4) { + T (cr, size); + cairo_save (cr); { + cairo_translate (cr, size, 0); + T (cr, size); + } cairo_restore (cr); + cairo_save (cr); { + cairo_translate (cr, size/2, size*m_1_sqrt_3); + T (cr, size); + } cairo_restore (cr); + } +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_translate (cr, 0, 8); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 1.); + + T (cr, WIDTH); + + cairo_translate (cr, 0, 2*HEIGHT-16); + cairo_scale (cr, 1, -1); + + T (cr, WIDTH); + + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (shape_sierpinski, + "A fractal triangle", + "stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, 2*HEIGHT, + NULL, draw) diff --git a/test/show-glyphs-advance.c b/test/show-glyphs-advance.c new file mode 100644 index 000000000..5fe9ec839 --- /dev/null +++ b/test/show-glyphs-advance.c @@ -0,0 +1,107 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2011 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + * Andrea Canciani + */ + +#include "cairo-test.h" + +static cairo_test_status_t +get_glyph (const cairo_test_context_t *ctx, + cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_glyph_t *glyph) +{ + cairo_glyph_t *text_to_glyphs; + cairo_status_t status; + int i; + + text_to_glyphs = glyph; + i = 1; + status = cairo_scaled_font_text_to_glyphs (scaled_font, + 0, 0, + utf8, -1, + &text_to_glyphs, &i, + NULL, NULL, + 0); + if (status != CAIRO_STATUS_SUCCESS) + return cairo_test_status_from_status (ctx, status); + + if (text_to_glyphs != glyph) { + *glyph = text_to_glyphs[0]; + cairo_glyph_free (text_to_glyphs); + } + + return CAIRO_TEST_SUCCESS; +} + +static const char *characters[] = { "A", "B", "C", "D" }; + +#define NUM_CHARS ARRAY_LENGTH (characters) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_scaled_font_t *scaled_font; + cairo_glyph_t *glyphs = xmalloc (NUM_CHARS * sizeof (cairo_glyph_t)); + int i; + cairo_status_t status; + + /* Paint white background. */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + scaled_font = cairo_get_scaled_font (cr); + + for (i = 0; i < NUM_CHARS; i++) { + status = get_glyph (ctx, scaled_font, characters[i], &glyphs[i]); + if (status) + goto BAIL; + + glyphs[i].x = 10.0 + 10.0 * (i % 2); + glyphs[i].y = 20.0 + 10.0 * (i / 2); + } + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_show_glyphs (cr, glyphs, 4); + + cairo_translate (cr, 40., 20.); + cairo_rotate (cr, M_PI / 4.); + + cairo_show_glyphs (cr, glyphs, NUM_CHARS); + + BAIL: + free(glyphs); + + return status; +} + +CAIRO_TEST (show_glyphs_advance, + "Test that glyph advances work as expected along both axes", + "text, matrix", /* keywords */ + NULL, /* requirements */ + 64, 64, + NULL, draw) diff --git a/test/show-glyphs-many.c b/test/show-glyphs-many.c new file mode 100644 index 000000000..f689fe080 --- /dev/null +++ b/test/show-glyphs-many.c @@ -0,0 +1,176 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include + +/* Bug history + * + * 2006-01-07 Jon Hellan + * + * Jon opened the following bug report: + * + * _XError from XRenderCompositeText8 + * https://bugs.freedesktop.org/show_bug.cgi?id=5528 + * + * 2006-03-02 Carl Worth + * + * I wrote this test case to demonstrate the bug. + * + * Approach: + * + * Draw 65535 glyphs white-on-white all on top of each other. + * + * Rationale: + * + * The number 65535 comes from the original bug report. + * + * I would use cairo_show_text with a long string of 'x's say, + * but then the surface would need to be enormous to contain + * them. A smaller surface could be used, but I fear that at some + * point the off-surface glyph drawing would be optimized away + * and not exercise the bug. + * + * So, to keep the surface size under control, I use + * cairo_show_glyphs which allows me to place the glyphs all on + * top of each other. But, since cairo doesn't provide any + * character-to-glyphs mapping, I can't get a reliable glyph + * index (for character 'x' for example). So I just "guess" a + * glyph index and use white-on-white drawing to ignore the + * result. (I don't care what's drawn---I just want to ensure + * that things don't crash.) + * + * Status: I replicated bug. The largest value of NUM_GLYPHS for + * which I saw success is 21842. + * + * 2008-30-08 Chris Wilson + * This is also a valid test case for: + * + * Bug 5913 crash on overlong string + * https://bugs.freedesktop.org/show_bug.cgi?id=5913 + * + * which is still causing a crash in the Xlib backend - presumably, just + * a miscalculation of the length of the available request. + */ + +#define TEXT_SIZE 12 +#define NUM_GLYPHS 65535 + +static cairo_test_status_t +get_glyph (const cairo_test_context_t *ctx, + cairo_scaled_font_t *scaled_font, + const char *utf8, + cairo_glyph_t *glyph) +{ + cairo_glyph_t *text_to_glyphs; + cairo_status_t status; + int i; + + text_to_glyphs = glyph; + i = 1; + status = cairo_scaled_font_text_to_glyphs (scaled_font, + 0, 0, + utf8, -1, + &text_to_glyphs, &i, + NULL, NULL, + 0); + if (status != CAIRO_STATUS_SUCCESS) + return cairo_test_status_from_status (ctx, status); + + if (text_to_glyphs != glyph) { + *glyph = text_to_glyphs[0]; + cairo_glyph_free (text_to_glyphs); + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_glyph_t *glyphs = xmalloc (NUM_GLYPHS * sizeof (cairo_glyph_t)); + cairo_scaled_font_t *scaled_font; + const char *characters[] = { /* try to exercise different widths of index */ + "m", /* Latin letter m, index=0x50 */ + "μ", /* Greek letter mu, index=0x349 */ + NULL, + }, **utf8; + int i, j; + cairo_status_t status; + + /* Paint white background. */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_select_font_face (cr, "Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + scaled_font = cairo_get_scaled_font (cr); + + for (utf8 = characters; *utf8 != NULL; utf8++) { + status = get_glyph (ctx, scaled_font, *utf8, &glyphs[0]); + if (status) + goto BAIL; + + if (glyphs[0].index) { + glyphs[0].x = 1.0; + glyphs[0].y = height - 1; + for (i=1; i < NUM_GLYPHS; i++) + glyphs[i] = glyphs[0]; + + cairo_show_glyphs (cr, glyphs, NUM_GLYPHS); + } + } + + /* we can pack ~21k 1-byte glyphs into a single XRenderCompositeGlyphs8 */ + status = get_glyph (ctx, scaled_font, "m", &glyphs[0]); + if (status) + goto BAIL; + for (i=1; i < 21500; i++) + glyphs[i] = glyphs[0]; + /* so check expanding the current 1-byte request for 2-byte glyphs */ + status = get_glyph (ctx, scaled_font, "μ", &glyphs[i]); + if (status) + goto BAIL; + for (j=i+1; j < NUM_GLYPHS; j++) + glyphs[j] = glyphs[i]; + + cairo_show_glyphs (cr, glyphs, NUM_GLYPHS); + + BAIL: + free(glyphs); + + return status; +} + +CAIRO_TEST (show_glyphs_many, + "Test that cairo_show_glyphs works when handed 'many' glyphs", + "text, stress", /* keywords */ + NULL, /* requirements */ + 9, 11, + NULL, draw) diff --git a/test/show-text-current-point.c b/test/show-text-current-point.c new file mode 100644 index 000000000..2fe32a82d --- /dev/null +++ b/test/show-text-current-point.c @@ -0,0 +1,59 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define TEXT_SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + cairo_move_to (cr, 0, TEXT_SIZE); + cairo_show_text (cr, "Hello from the "); + cairo_show_text (cr, "show-text-current-point"); + cairo_show_text (cr, " test."); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (show_text_current_point, + "Test that cairo_show_text adjusts the current point properly", + "text, api", /* keywords */ + NULL, /* requirements */ + 263, TEXT_SIZE + 4, + NULL, draw) diff --git a/test/simple.c b/test/simple.c new file mode 100644 index 000000000..7ec8a9ac5 --- /dev/null +++ b/test/simple.c @@ -0,0 +1,347 @@ +/* + * Copyright 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +/* Test the fidelity of the rasterisation, because Cairo is my favourite + * driver test suite. + */ + +#define GENERATE_REFERENCE 0 + +#include "../src/cairo-fixed-type-private.h" + +#if GENERATE_REFERENCE +#include +struct coverage { + int width, height; + struct { + int uncovered_area; + int covered_height; + } cells[0]; +}; + +static int pfloor (int v) +{ + return v >> CAIRO_FIXED_FRAC_BITS; +} + +static int pfrac (int v) +{ + return v & ((1 << CAIRO_FIXED_FRAC_BITS) - 1); +} + +static void add_edge (struct coverage *coverage, + int x1, int y1, int x2, int y2, + int sign) +{ + int dx, dy; + int dxdy_quo, dxdy_rem; + int xq, xr; + int y, t; + + if (y2 < y1) { + t = y1; + y1 = y2; + y2 = t; + + t = x1; + x1 = x2; + x2 = t; + + sign = -sign; + } + + dx = x2 - x1; + dy = y2 - y1; + if (dy == 0) + return; + + dy *= 2; + + dxdy_quo = 2*dx / dy; + dxdy_rem = 2*dx % dy; + + xq = x1 + dxdy_quo / 2; + xr = dxdy_rem / 2; + if (xr < 0) { + xq--; + xr += dy; + } + + for (y = MAX(0, y1); y < MIN(y2, 256*coverage->height); y++) { + int x = xq + (xr >= dy/2); + + if (x < 256*coverage->width) { + int i = pfloor (y) * coverage->width; + if (x > 0) { + i += pfloor (x); + coverage->cells[i].uncovered_area += sign * pfrac(x); + } + coverage->cells[i].covered_height += sign; + } + + xq += dxdy_quo; + xr += dxdy_rem; + if (xr < 0) { + xq--; + xr += dy; + } else if (xr >= dy) { + xq++; + xr -= dy; + } + } +} + +static struct coverage * +coverage_create (int width, int height) +{ + int size; + struct coverage *c; + + size = sizeof (struct coverage); + size += width * height * sizeof (int) * 2; + + c = malloc (size); + if (c == NULL) + return c; + + memset(c, 0, size); + c->width = width; + c->height = height; + + return c; +} + +static cairo_surface_t * +coverage_to_alpha (struct coverage *c) +{ + cairo_surface_t *image; + uint8_t *data; + int x, y, stride; + + image = cairo_image_surface_create (CAIRO_FORMAT_A8, c->width, c->height); + + data = cairo_image_surface_get_data (image); + stride = cairo_image_surface_get_stride (image); + + cairo_surface_flush (image); + for (y = 0; y < c->height; y++) { + uint8_t *row = data + y *stride; + int cover = 0; + for (x = 0; x < c->width; x++) { + int v = y*c->width + x; + + cover += c->cells[v].covered_height * 256; + v = cover - c->cells[v].uncovered_area; + + v /= 256; + if (v < 0) + v = -v; + row[x] = v - (v >> 8); + } + } + cairo_surface_mark_dirty (image); + + free (c); + return image; +} +#endif + +static cairo_test_status_t +edge (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_ADD); + +#if GENERATE_REFERENCE + { + struct coverage *c; + cairo_surface_t *mask; + + cairo_set_source_rgb (cr, 1, 0, 0); + + c = coverage_create (width, height); + add_edge (c, 128*256, 129*256, 129*256, 1*256, 1); + add_edge (c, 128*256, 129*256, 128*256, 131*256, -1); + add_edge (c, 128*256, 131*256, 129*256, 259*256, -1); + add_edge (c, 130*256, 129*256, 129*256, 1*256, -1); + add_edge (c, 130*256, 129*256, 130*256, 131*256, 1); + add_edge (c, 130*256, 131*256, 129*256, 259*256, 1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + c = coverage_create (width, height); + add_edge (c, 128*256/2, 129*256/2, 129*256/2, 1*256/2, 1); + add_edge (c, 128*256/2, 129*256/2, 128*256/2, 131*256/2, -1); + add_edge (c, 128*256/2, 131*256/2, 129*256/2, 259*256/2, -1); + add_edge (c, 130*256/2, 129*256/2, 129*256/2, 1*256/2, -1); + add_edge (c, 130*256/2, 129*256/2, 130*256/2, 131*256/2, 1); + add_edge (c, 130*256/2, 131*256/2, 129*256/2, 259*256/2, 1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + c = coverage_create (width, height); + add_edge (c, (192-2)*256, 129*256, 192*256, 1*256, 1); + add_edge (c, (192-2)*256, 129*256, (192-2)*256, 131*256, -1); + add_edge (c, (192-2)*256, 131*256, 192*256, 259*256, -1); + add_edge (c, (192+2)*256, 129*256, 192*256, 1*256, -1); + add_edge (c, (192+2)*256, 129*256, (192+2)*256, 131*256, 1); + add_edge (c, (192+2)*256, 131*256, 192*256, 259*256, 1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + c = coverage_create (width, height); + add_edge (c, (256-4)*256, 129*256, 256*256, 1*256, 1); + add_edge (c, (256-4)*256, 129*256, (256-4)*256, 131*256, -1); + add_edge (c, (256-4)*256, 131*256, 256*256, 259*256, -1); + add_edge (c, (256+4)*256, 129*256, 256*256, 1*256, -1); + add_edge (c, (256+4)*256, 129*256, (256+4)*256, 131*256, 1); + add_edge (c, (256+4)*256, 131*256, 256*256, 259*256, 1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + cairo_set_source_rgb (cr, 0, 1, 0); + + c = coverage_create (width, height); + add_edge (c, 1*256, 129*256, 129*256, 128*256, 1); + add_edge (c, 131*256, 128*256, 259*256, 129*256, 1); + add_edge (c, 1*256, 129*256, 129*256, 130*256, -1); + add_edge (c, 131*256, 130*256, 259*256, 129*256, -1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + c = coverage_create (width, height); + add_edge (c, 1*256/2, 129*256/2, 129*256/2, 128*256/2, 1); + add_edge (c, 131*256/2, 128*256/2, 259*256/2, 129*256/2, 1); + add_edge (c, 1*256/2, 129*256/2, 129*256/2, 130*256/2, -1); + add_edge (c, 131*256/2, 130*256/2, 259*256/2, 129*256/2, -1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + c = coverage_create (width, height); + add_edge (c, 1*256, (192-0)*256, 129*256, (192-2)*256, 1); + add_edge (c, 131*256, (192-2)*256, 259*256, (192-0)*256, 1); + add_edge (c, 1*256, (192+0)*256, 129*256, (192+2)*256, -1); + add_edge (c, 131*256, (192+2)*256, 259*256, (192+0)*256, -1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + + c = coverage_create (width, height); + add_edge (c, 1*256, (256-0)*256, 129*256, (256-4)*256, 1); + add_edge (c, 131*256, (256-4)*256, 259*256, (256-0)*256, 1); + add_edge (c, 1*256, (256+0)*256, 129*256, (256+4)*256, -1); + add_edge (c, 131*256, (256+4)*256, 259*256, (256+0)*256, -1); + mask = coverage_to_alpha (c); + cairo_mask_surface (cr, mask, 0, 0); + cairo_surface_destroy (mask); + } +#else + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_move_to (cr, 129, 1); + cairo_line_to (cr, 128, 129); + cairo_line_to (cr, 128, 131); + cairo_line_to (cr, 129, 259); + cairo_line_to (cr, 130, 131); + cairo_line_to (cr, 130, 129); + cairo_fill (cr); + + cairo_move_to (cr, 129/2., 1/2.); + cairo_line_to (cr, 128/2., 129/2.); + cairo_line_to (cr, 128/2., 131/2.); + cairo_line_to (cr, 129/2., 259/2.); + cairo_line_to (cr, 130/2., 131/2.); + cairo_line_to (cr, 130/2., 129/2.); + cairo_fill (cr); + + cairo_move_to (cr, 192, 1); + cairo_line_to (cr, 192-2, 129); + cairo_line_to (cr, 192-2, 131); + cairo_line_to (cr, 192, 259); + cairo_line_to (cr, 192+2, 131); + cairo_line_to (cr, 192+2, 129); + cairo_fill (cr); + + cairo_move_to (cr, 256, 1); + cairo_line_to (cr, 256-4, 129); + cairo_line_to (cr, 256-4, 131); + cairo_line_to (cr, 256, 259); + cairo_line_to (cr, 256+4, 131); + cairo_line_to (cr, 256+4, 129); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_move_to (cr, 1, 129); + cairo_line_to (cr, 129, 128); + cairo_line_to (cr, 131, 128); + cairo_line_to (cr, 259, 129); + cairo_line_to (cr, 131, 130); + cairo_line_to (cr, 129, 130); + cairo_fill (cr); + + cairo_move_to (cr, 1/2., 129/2.); + cairo_line_to (cr, 129/2., 128/2.); + cairo_line_to (cr, 131/2., 128/2.); + cairo_line_to (cr, 259/2., 129/2.); + cairo_line_to (cr, 131/2., 130/2.); + cairo_line_to (cr, 129/2., 130/2.); + cairo_fill (cr); + + cairo_move_to (cr, 1, 192); + cairo_line_to (cr, 129, 192-2); + cairo_line_to (cr, 131, 192-2); + cairo_line_to (cr, 259, 192); + cairo_line_to (cr, 131, 192+2); + cairo_line_to (cr, 129, 192+2); + cairo_fill (cr); + + cairo_move_to (cr, 1, 256); + cairo_line_to (cr, 129, 256-4); + cairo_line_to (cr, 131, 256-4); + cairo_line_to (cr, 259, 256); + cairo_line_to (cr, 131, 256+4); + cairo_line_to (cr, 129, 256+4); + cairo_fill (cr); +#endif + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (simple_edge, + "Check the fidelity of the rasterisation.", + NULL, /* keywords */ + "target=raster", /* requirements */ + 260, 260, + NULL, edge) diff --git a/test/skew-extreme.c b/test/skew-extreme.c new file mode 100644 index 000000000..69299a86c --- /dev/null +++ b/test/skew-extreme.c @@ -0,0 +1,118 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl Worth + */ + +#include "cairo-test.h" + +/* This test case is designed to exercise the following bug: + * + * Skew transforms were broken by the cairo update in December + * https://bugzilla.mozilla.org/show_bug.cgi?id=373632 + * + * What's happening is that the rectangle is being skewed into the + * following shape: + * + * a__b + * \ \ + * \ \ + * \ \ + * \ \ + * \ \ + * d\_\c + * + * and the bug is that _cairo_traps_tessellate_convex_quad is + * comparing b.x as less then d.x and therfore determining that the bc + * edge is left of the ad edge. The fix is simply to compare c.x to + * d.x instead of b.x to d.x . + */ + +#define PAD 2 +#define LINE_WIDTH 10 +#define LINE_LENGTH (2 * LINE_WIDTH) +#define SKEW_FACTOR 5.0 +#define WIDTH (PAD + (LINE_LENGTH * SKEW_FACTOR) + LINE_WIDTH + PAD) +#define HEIGHT (PAD + LINE_WIDTH + (LINE_LENGTH * SKEW_FACTOR) + LINE_WIDTH + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, PAD, PAD); + + cairo_set_line_width (cr, LINE_WIDTH); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + + cairo_save (cr); + { + cairo_matrix_t skew_x = { + 1.0, 0.0, + SKEW_FACTOR, 1.0, + 0.0, 0.0 + }; + + cairo_translate (cr, LINE_WIDTH / 2.0, 0.0); + + cairo_transform (cr, &skew_x); + + cairo_move_to (cr, 0.0, 0.0); + cairo_line_to (cr, 0.0, LINE_LENGTH); + cairo_stroke (cr); + } + cairo_restore (cr); + + cairo_translate (cr, 0.0, LINE_WIDTH); + + cairo_save (cr); + { + cairo_matrix_t skew_y = { + 1.0, SKEW_FACTOR, + 0.0, 1.0, + 0.0, 0.0 + }; + + cairo_translate (cr, 0.0, LINE_WIDTH / 2.0); + + cairo_transform (cr, &skew_y); + + cairo_move_to (cr, 0.0, 0.0); + cairo_line_to (cr, LINE_LENGTH, 0.0); + cairo_stroke (cr); + } + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (skew_extreme, + "Test cases of extreme skew.", + "transform, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/smask-fill.c b/test/smask-fill.c new file mode 100644 index 000000000..cb3861036 --- /dev/null +++ b/test/smask-fill.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + cairo_pattern_t *pattern; + cairo_t *cr2; + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.45 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask_fill, + "Test the support of \"soft\" masks with fills", + "smask, fill", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/smask-image-mask.c b/test/smask-image-mask.c new file mode 100644 index 000000000..3d8b5d5a8 --- /dev/null +++ b/test/smask-image-mask.c @@ -0,0 +1,85 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + uint32_t data[] = { + 0xaa000000, 0x55000000, + 0x55000000, 0xaa000000, + }; + + cairo_surface_t *mask, *mask2; + cairo_pattern_t *pattern; + cairo_t *cr2; + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + mask2 = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_ARGB32, 2, 2, 8); + pattern = cairo_pattern_create_for_surface (mask2); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_mask (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + cairo_surface_finish (mask2); /* data will go out of scope */ + cairo_surface_destroy (mask2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask_image_mask, + "Test the support of \"soft\" masks with a secondary image mask", + "smask, image", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/smask-mask.c b/test/smask-mask.c new file mode 100644 index 000000000..11cff82ff --- /dev/null +++ b/test/smask-mask.c @@ -0,0 +1,96 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + cairo_pattern_t *pattern; + cairo_t *cr2, *cr3; + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + mask = cairo_surface_create_similar (cairo_get_group_target (cr2), + CAIRO_CONTENT_ALPHA, + width, height); + cr3 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr3); { + cairo_set_operator (cr3, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr3); + } cairo_restore (cr3); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr3, pattern); + cairo_pattern_destroy (pattern); + cairo_paint (cr3); + + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_radial ( + 0.5 * width, 0.5 * height, 0, + 0.5 * width, 0.5 * height, 0.5 *height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 1., 1., 1., 1.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_mask_surface (cr2, cairo_get_target (cr3), 0, 0); + cairo_destroy (cr3); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask_mask, + "Test the support of \"soft\" masks with a secondary mask", + "smask, mask", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/smask-paint.c b/test/smask-paint.c new file mode 100644 index 000000000..ee781caae --- /dev/null +++ b/test/smask-paint.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + cairo_pattern_t *pattern; + cairo_t *cr2; + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_paint (cr2); + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + pattern = cairo_pattern_create_radial ( + 0.5 * width, 0.5 * height, 0, + 0.5 * width, 0.5 * height, 0.5 *height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 0., 0., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 0., 0., .5); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 1., 0., 0., 1.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask_paint, + "Test the support of \"soft\" masks with paints", + "smask, paint", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/smask-stroke.c b/test/smask-stroke.c new file mode 100644 index 000000000..2a8e7e890 --- /dev/null +++ b/test/smask-stroke.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + cairo_pattern_t *pattern; + cairo_t *cr2; + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.4 * height, 0, 2 * M_PI); + cairo_stroke (cr2); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask_stroke, + "Test the support of \"soft\" masks with strokes", + "smask, stroke", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/smask-text.c b/test/smask-text.c new file mode 100644 index 000000000..f36ae2674 --- /dev/null +++ b/test/smask-text.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *mask; + cairo_pattern_t *pattern; + cairo_t *cr2; + cairo_text_extents_t extents; + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_select_font_face (cr2, + CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr2, 0.5 * height); + + cairo_text_extents (cr2, "cairo", &extents); + cairo_move_to (cr2, + floor ((width - extents.width) / 2 + 0.5) - extents.x_bearing, + floor ((height - extents.height) / 2 - 0.5) - extents.y_bearing); + cairo_show_text (cr2, "cairo"); + + cairo_set_source_rgb (cr, 1.0, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask_text, + "Test the support of \"soft\" masks with text", + "smask, text", /* keywords */ + NULL, /* keywords */ + 120, 60, + NULL, draw) diff --git a/test/smask.c b/test/smask.c new file mode 100644 index 000000000..4cf3adb2a --- /dev/null +++ b/test/smask.c @@ -0,0 +1,123 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + uint32_t data[] = { + 0x80000000, 0x80000000, + 0x80000000, 0x80000000, + }; + + cairo_surface_t *mask, *mask2; + cairo_pattern_t *pattern; + cairo_t *cr2; + cairo_text_extents_t extents; + + mask = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask); + cairo_surface_destroy (mask); + + cairo_save (cr2); { + cairo_set_operator (cr2, CAIRO_OPERATOR_CLEAR); + cairo_paint (cr2); + } cairo_restore (cr2); + + pattern = cairo_pattern_create_linear (0, 0, 0, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.0); + cairo_pattern_add_color_stop_rgba (pattern, 0.80, 0., 0., 0., 0.0); + cairo_pattern_add_color_stop_rgba (pattern, 0.90, 1., 1., 1., 0.25); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 1., 1., 1., 1.0); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_paint (cr2); + + pattern = cairo_pattern_create_linear (0, 0, width, height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 1., 1., .5); + cairo_pattern_add_color_stop_rgba (pattern, 0.75, 1., 1., 1., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 0., 0., 0., 0.); + cairo_set_source (cr2, pattern); + cairo_pattern_destroy (pattern); + + mask2 = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_ARGB32, 2, 2, 8); + pattern = cairo_pattern_create_for_surface (mask2); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_mask (cr2, pattern); + cairo_pattern_destroy (pattern); + + cairo_arc (cr2, 0.5 * width, 0.5 * height - 10, 0.2 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_arc (cr2, 0.5 * width, 0.5 * height - 10, 0.25 * height, 0, 2 * M_PI); + cairo_stroke (cr2); + + cairo_select_font_face (cr2, + CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr2, 0.3 * height); + + cairo_text_extents (cr2, "FG", &extents); + cairo_move_to (cr2, + floor ((width - extents.width) / 2 + 0.5) - extents.x_bearing, + floor (height - extents.height - 0.5) - extents.y_bearing - 5); + cairo_show_text (cr2, "FG"); + + cairo_set_source_rgb (cr, 0, 0, 1.0); + cairo_paint (cr); + + pattern = cairo_pattern_create_radial ( + 0.5 * width, 0.5 * height, 0, + 0.5 * width, 0.5 * height, 0.5 *height); + cairo_pattern_add_color_stop_rgba (pattern, 0.00, 0., 0., 0., 0.); + cairo_pattern_add_color_stop_rgba (pattern, 0.25, 1., 0., 0., 1.); + cairo_pattern_add_color_stop_rgba (pattern, 0.50, 1., 0., 0., .5); + cairo_pattern_add_color_stop_rgba (pattern, 1.00, 1., 0., 0., 1.); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_mask_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + cairo_surface_finish (mask2); /* data will go out of scope */ + cairo_surface_destroy (mask2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (smask, + "Test the support of \"soft\" masks", + "smask", /* keywords */ + NULL, /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/solid-pattern-cache-stress.c b/test/solid-pattern-cache-stress.c new file mode 100644 index 000000000..c2a1c1526 --- /dev/null +++ b/test/solid-pattern-cache-stress.c @@ -0,0 +1,212 @@ +/* + * Copyright © 2007 Chris Wilson. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson. Not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-test.h" +#include /* drand48() */ + +#define LOOPS 10 +#define NRAND 100 + +#ifndef HAVE_DRAND48 +#define drand48() (rand () / (double) RAND_MAX) +#endif + +static cairo_scaled_font_t *scaled_font; + +static cairo_t * +_cairo_create_similar (cairo_t *cr, int width, int height) +{ + cairo_surface_t *similar; + + similar = cairo_surface_create_similar (cairo_get_target (cr), + cairo_surface_get_content (cairo_get_target (cr)), + width, height); + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + return cr; +} + +static cairo_t * +_cairo_create_image (cairo_t *cr, cairo_format_t format, int width, int height) +{ + cairo_surface_t *image; + + image = cairo_image_surface_create (format, width, height); + cr = cairo_create (image); + cairo_surface_destroy (image); + + return cr; +} + +static void +_propagate_status (cairo_t *dst, cairo_t *src) +{ + cairo_path_t path; + + path.status = cairo_status (src); + if (path.status) { + path.num_data = 0; + path.data = NULL; + cairo_append_path (dst, &path); + } +} + +static void +_draw (cairo_t *cr, + double red, + double green, + double blue) +{ + cairo_text_extents_t extents; + + cairo_set_source_rgb (cr, red, green, blue); + cairo_paint (cr); + + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 1, 1); + cairo_stroke (cr); + + cairo_mask (cr, cairo_get_source (cr)); + + cairo_set_scaled_font (cr, scaled_font); + cairo_text_extents (cr, "cairo", &extents); + cairo_move_to (cr, + -extents.x_bearing - .5 * extents.width, + -extents.y_bearing - .5 * extents.height); + cairo_show_text (cr, "cairo"); +} + +static void +use_similar (cairo_t *cr, + double red, + double green, + double blue) +{ + cairo_t *cr2; + + if (cairo_status (cr)) + return; + + cr2 = _cairo_create_similar (cr, 1, 1); + + _draw (cr2, red, green, blue); + + _propagate_status (cr, cr2); + cairo_destroy (cr2); +} + +static void +use_image (cairo_t *cr, + cairo_format_t format, + double red, + double green, + double blue) +{ + cairo_t *cr2; + + if (cairo_status (cr)) + return; + + cr2 = _cairo_create_image (cr, format, 1, 1); + + _draw (cr2, red, green, blue); + + _propagate_status (cr, cr2); + cairo_destroy (cr2); +} + +static void +use_solid (cairo_t *cr, + double red, + double green, + double blue) +{ + /* mix in dissimilar solids */ + use_image (cr, CAIRO_FORMAT_A1, red, green, blue); + use_image (cr, CAIRO_FORMAT_A8, red, green, blue); + use_image (cr, CAIRO_FORMAT_RGB24, red, green, blue); + use_image (cr, CAIRO_FORMAT_ARGB32, red, green, blue); + + use_similar (cr, red, green, blue); + + _draw (cr, red, green, blue); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_status_t status; + const double colors[8][3] = { + { 1.0, 0.0, 0.0 }, /* red */ + { 0.0, 1.0, 0.0 }, /* green */ + { 1.0, 1.0, 0.0 }, /* yellow */ + { 0.0, 0.0, 1.0 }, /* blue */ + { 1.0, 0.0, 1.0 }, /* magenta */ + { 0.0, 1.0, 1.0 }, /* cyan */ + { 1.0, 1.0, 1.0 }, /* white */ + { 0.0, 0.0, 0.0 }, /* black */ + }; + int i, j, loop; + + /* cache a resolved scaled-font */ + scaled_font = cairo_get_scaled_font (cr); + + for (loop = 0; loop < LOOPS; loop++) { + for (i = 0; i < LOOPS; i++) { + for (j = 0; j < 8; j++) { + use_solid (cr, colors[j][0], colors[j][1], colors[j][2]); + status = cairo_status (cr); + if (status) + return cairo_test_status_from_status (ctx, status); + } + } + + for (i = 0; i < NRAND; i++) { + use_solid (cr, drand48 (), drand48 (), drand48 ()); + status = cairo_status (cr); + if (status) + return cairo_test_status_from_status (ctx, status); + } + } + + /* stress test only, so clear the surface before comparing */ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (solid_pattern_cache_stress, + "Stress the solid pattern cache and ensure it behaves", + "stress", /* keywords */ + NULL, /* requirements */ + 1, 1, + NULL, draw) diff --git a/test/source-clip-scale.c b/test/source-clip-scale.c new file mode 100644 index 000000000..4eca2061c --- /dev/null +++ b/test/source-clip-scale.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2005 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + cairo_t *cr2; + + source = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + SIZE, SIZE); + cr2 = cairo_create (source); + cairo_surface_destroy (source); + + /* Fill the source surface with green */ + cairo_set_source_rgb (cr2, 0, 1, 0); + cairo_paint (cr2); + + /* Draw a blue square in the middle of the source with clipping. + * Note that we are only clipping within a save/restore block but + * the buggy behavior demonstrates that the clip remains present + * on the surface. */ + cairo_save (cr2); + cairo_rectangle (cr2, + SIZE / 4, SIZE / 4, + SIZE / 2, SIZE / 2); + cairo_clip (cr2); + cairo_set_source_rgb (cr2, 0, 0, 1); + cairo_paint (cr2); + cairo_restore (cr2); + + /* Fill the destination surface with solid red (should not appear + * in final result) */ + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + /* Now draw the source surface onto the destination with scaling. */ + cairo_scale (cr, 2.0, 1.0); + + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_destroy (cr2); + + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (source_clip_scale, + "Test that a source surface is not affected by a clip when scaling", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE * 2, SIZE, + NULL, draw) diff --git a/test/source-clip.c b/test/source-clip.c new file mode 100644 index 000000000..0c00070b1 --- /dev/null +++ b/test/source-clip.c @@ -0,0 +1,77 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Owen Taylor + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *source; + cairo_t *cr2; + + source = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + SIZE, SIZE); + + cr2 = cairo_create (source); + cairo_surface_destroy (source); + + /* Fill the source surface with green */ + cairo_set_source_rgb (cr2, 0, 1, 0); + cairo_paint (cr2); + + /* Draw a blue square in the middle of the source with clipping, + * and leave the clip there. */ + cairo_rectangle (cr2, + SIZE / 4, SIZE / 4, + SIZE / 2, SIZE / 2); + cairo_clip (cr2); + cairo_set_source_rgb (cr2, 0, 0, 1); + cairo_paint (cr2); + + /* Fill the destination surface with solid red (should not appear + * in final result) */ + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_paint (cr); + + /* Now draw the source surface onto the destination surface */ + cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0); + cairo_paint (cr); + + cairo_destroy (cr2); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (source_clip, + "Test that a source surface is not affected by a clip", + "clip", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/source-surface-scale-paint.c b/test/source-surface-scale-paint.c new file mode 100644 index 000000000..4ac62490a --- /dev/null +++ b/test/source-surface-scale-paint.c @@ -0,0 +1,59 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t data[16] = { + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + 0xffffffff, 0xffffffff, 0xffff0000, 0xffff0000, + + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff, + 0xff00ff00, 0xff00ff00, 0xff0000ff, 0xff0000ff + }; + + surface = cairo_image_surface_create_for_data ((unsigned char *) data, + CAIRO_FORMAT_RGB24, 4, 4, 16); + + cairo_set_source_surface (cr, surface, 2, 2); + cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_NEAREST); + cairo_scale (cr, 2, 2); + cairo_paint (cr); + + cairo_surface_finish (surface); /* data will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (source_surface_scale_paint, + "Test call sequence: cairo_set_source_surface; cairo_scale; cairo_paint", + "transform, paint", /* keywords */ + NULL, /* requirements */ + 8, 8, + NULL, draw) diff --git a/test/spline-decomposition.c b/test/spline-decomposition.c new file mode 100644 index 000000000..ea8f26f23 --- /dev/null +++ b/test/spline-decomposition.c @@ -0,0 +1,471 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +typedef struct _point { + double x,y; +} point_t; + +typedef struct _knots { + point_t a,b,c,d; +} knots_t; + +static knots_t knots[5] = { + { {0, 0}, {0, 100}, {100, 100}, {100, 0} }, + { {0, 0}, {75, 100}, {25, 100}, {100, 0} }, + { {0, 0}, {100, 100}, {0, 100}, {100, 0} }, + { {0, 0}, {150, 100}, {-50, 100}, {100, 0} }, + { {0, 0}, {100, 200}, {0, -100}, {100, 100} }, +}; + +#ifdef REFERENCE +static void +_lerp_half (const point_t *a, const point_t *b, point_t *result) +{ + result->x = .5 * (a->x + b->x); + result->y = .5 * (a->y + b->y); +} + +static void +_de_casteljau (knots_t *k1, knots_t *k2) +{ + point_t ab, bc, cd; + point_t abbc, bccd; + point_t final; + + _lerp_half (&k1->a, &k1->b, &ab); + _lerp_half (&k1->b, &k1->c, &bc); + _lerp_half (&k1->c, &k1->d, &cd); + _lerp_half (&ab, &bc, &abbc); + _lerp_half (&bc, &cd, &bccd); + _lerp_half (&abbc, &bccd, &final); + + k2->a = final; + k2->b = bccd; + k2->c = cd; + k2->d = k1->d; + + k1->b = ab; + k1->c = abbc; + k1->d = final; +} + +static double +_spline_error_squared (const knots_t *knots) +{ + double bdx, bdy, berr; + double cdx, cdy, cerr; + double dx, dy, v; + + /* Intersection point (px): + * px = p1 + u(p2 - p1) + * (p - px) ∙ (p2 - p1) = 0 + * Thus: + * u = ((p - p1) ∙ (p2 - p1)) / ∥p2 - p1∥²; + */ + bdx = knots->b.x - knots->a.x; + bdy = knots->b.y - knots->a.y; + + cdx = knots->c.x - knots->a.x; + cdy = knots->c.y - knots->a.y; + + dx = knots->d.x - knots->a.x; + dy = knots->d.y - knots->a.y; + v = dx * dx + dy * dy; + if (v != 0.) { + double u; + + u = bdx * dx + bdy * dy; + if (u <= 0) { + /* bdx -= 0; + * bdy -= 0; + */ + } else if (u >= v) { + bdx -= dx; + bdy -= dy; + } else { + bdx -= u/v * dx; + bdy -= u/v * dy; + } + + u = cdx * dx + cdy * dy; + if (u <= 0) { + /* cdx -= 0; + * cdy -= 0; + */ + } else if (u >= v) { + cdx -= dx; + cdy -= dy; + } else { + cdx -= u/v * dx; + cdy -= u/v * dy; + } + } + + berr = bdx * bdx + bdy * bdy; + cerr = cdx * cdx + cdy * cdy; + if (berr > cerr) + return berr * v; + else + return cerr * v; +} + +static void +_offset_line_to (cairo_t *cr, + const point_t *p0, + const point_t *p1, + const point_t *p2, + const point_t *p3, + double offset) +{ + double dx, dy, v; + + dx = p1->x - p0->x; + dy = p1->y - p0->y; + v = hypot (dx, dy); + if (v == 0) { + dx = p2->x - p0->x; + dy = p2->y - p0->y; + v = hypot (dx, dy); + if (v == 0) { + dx = p3->x - p0->x; + dy = p3->y - p0->y; + v = hypot (dx, dy); + } + } + + if (v == 0) { + cairo_line_to (cr, p0->x, p0->y); + } else + cairo_line_to (cr, p0->x - offset * dy / v, p0->y + offset * dx / v); +} + +static void +_spline_decompose_into (knots_t *k1, + double tolerance_squared, + double offset, + cairo_t *cr) +{ + knots_t k2; + + if (_spline_error_squared (k1) < tolerance_squared) { + _offset_line_to (cr, &k1->a, &k1->b, &k1->c, &k1->d, offset); + return; + } + + _de_casteljau (k1, &k2); + + _spline_decompose_into (k1, tolerance_squared, offset, cr); + _spline_decompose_into (&k2, tolerance_squared, offset, cr); +} + +static void +_spline_decompose (const knots_t *knots, + double tolerance, double offset, + cairo_t *cr) +{ + knots_t k; + + k = *knots; + _spline_decompose_into (&k, tolerance * tolerance, offset, cr); + + _offset_line_to (cr, &knots->d, &knots->c, &knots->b, &knots->a, -offset); +} + +static void +_knots_reverse (knots_t *knots) +{ + point_t tmp; + + tmp = knots->a; + knots->a = knots->d; + knots->d = tmp; + + tmp = knots->b; + knots->b = knots->c; + knots->c = tmp; +} + +static void +thick_splines (cairo_t *cr, double offset) +{ + knots_t k; + + cairo_save (cr); + cairo_translate (cr, 15, 15); + + k = knots[0]; + + cairo_new_path (cr); + _spline_decompose (&k, .1, offset, cr); + _knots_reverse (&k); + _spline_decompose (&k, .1, offset, cr); + cairo_close_path (cr); + cairo_fill (cr); + + cairo_translate (cr, 130, 0); + + k = knots[1]; + + cairo_new_path (cr); + _spline_decompose (&k, .1, offset, cr); + _knots_reverse (&k); + _spline_decompose (&k, .1, offset, cr); + cairo_close_path (cr); + cairo_fill (cr); + + cairo_translate (cr, 130, 0); + + k = knots[2]; + + cairo_new_path (cr); + _spline_decompose (&k, .1, offset, cr); + _knots_reverse (&k); + _spline_decompose (&k, .1, offset, cr); + cairo_close_path (cr); + cairo_fill (cr); + + cairo_translate (cr, -130 - 65, 130); + + k = knots[3]; + + cairo_new_path (cr); + _spline_decompose (&k, .1, offset, cr); + _knots_reverse (&k); + _spline_decompose (&k, .1, offset, cr); + cairo_close_path (cr); + cairo_fill (cr); + + cairo_translate (cr, 130, 0); + + k = knots[4]; + + cairo_new_path (cr); + _spline_decompose (&k, .1, offset, cr); + _knots_reverse (&k); + _spline_decompose (&k, .1, offset, cr); + cairo_close_path (cr); + cairo_fill (cr); + cairo_restore (cr); +} + +static void +thin_splines (cairo_t *cr) +{ + cairo_save (cr); + cairo_translate (cr, 15, 15); + + cairo_new_path (cr); + _spline_decompose (&knots[0], .1, 0, cr); + cairo_stroke (cr); + + cairo_translate (cr, 130, 0); + + cairo_new_path (cr); + _spline_decompose (&knots[1], .1, 0, cr); + cairo_stroke (cr); + + cairo_translate (cr, 130, 0); + + cairo_new_path (cr); + _spline_decompose (&knots[2], .1, 0, cr); + cairo_stroke (cr); + + cairo_translate (cr, -130 - 65, 130); + + cairo_new_path (cr); + _spline_decompose (&knots[3], .1, 0, cr); + cairo_stroke (cr); + + cairo_translate (cr, 130, 0); + + cairo_new_path (cr); + _spline_decompose (&knots[4], .1, 0, cr); + cairo_stroke (cr); + cairo_restore (cr); +} +#endif + +static void +draw_bbox (cairo_t *cr, double x0, double y0, double x1, double y1) +{ + cairo_rectangle (cr, + floor (x0) + .5, floor (y0) + .5, + ceil (x1) - floor (x0), ceil (y1) - floor (y0)); + cairo_stroke (cr); +} + +static void +stroke_splines (cairo_t *cr) +{ + double stroke_x0, stroke_x1, stroke_y0, stroke_y1; + double path_x0, path_x1, path_y0, path_y1; + + cairo_save (cr); + cairo_translate (cr, 15, 15); + + cairo_new_path (cr); + cairo_move_to (cr, + knots[0].a.x, knots[0].a.y); + cairo_curve_to (cr, + knots[0].b.x, knots[0].b.y, + knots[0].c.x, knots[0].c.y, + knots[0].d.x, knots[0].d.y); + cairo_stroke_extents (cr, &stroke_x0, &stroke_y0, &stroke_x1, &stroke_y1); + cairo_path_extents (cr, &path_x0, &path_y0, &path_x1, &path_y1); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_set_line_width (cr, 1); + cairo_set_source_rgb (cr, 1, 0, 0); + draw_bbox (cr, stroke_x0, stroke_y0, stroke_x1, stroke_y1); + cairo_set_source_rgb (cr, 0, 0, 1); + draw_bbox (cr, path_x0, path_y0, path_x1, path_y1); + } cairo_restore (cr); + + cairo_translate (cr, 130, 0); + + cairo_new_path (cr); + cairo_move_to (cr, + knots[1].a.x, knots[1].a.y); + cairo_curve_to (cr, + knots[1].b.x, knots[1].b.y, + knots[1].c.x, knots[1].c.y, + knots[1].d.x, knots[1].d.y); + cairo_stroke_extents (cr, &stroke_x0, &stroke_y0, &stroke_x1, &stroke_y1); + cairo_path_extents (cr, &path_x0, &path_y0, &path_x1, &path_y1); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_set_line_width (cr, 1); + cairo_set_source_rgb (cr, 1, 0, 0); + draw_bbox (cr, stroke_x0, stroke_y0, stroke_x1, stroke_y1); + cairo_set_source_rgb (cr, 0, 0, 1); + draw_bbox (cr, path_x0, path_y0, path_x1, path_y1); + } cairo_restore (cr); + + cairo_translate (cr, 130, 0); + + cairo_new_path (cr); + cairo_move_to (cr, + knots[2].a.x, knots[2].a.y); + cairo_curve_to (cr, + knots[2].b.x, knots[2].b.y, + knots[2].c.x, knots[2].c.y, + knots[2].d.x, knots[2].d.y); + cairo_stroke_extents (cr, &stroke_x0, &stroke_y0, &stroke_x1, &stroke_y1); + cairo_path_extents (cr, &path_x0, &path_y0, &path_x1, &path_y1); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_set_line_width (cr, 1); + cairo_set_source_rgb (cr, 1, 0, 0); + draw_bbox (cr, stroke_x0, stroke_y0, stroke_x1, stroke_y1); + cairo_set_source_rgb (cr, 0, 0, 1); + draw_bbox (cr, path_x0, path_y0, path_x1, path_y1); + } cairo_restore (cr); + + cairo_translate (cr, -130 - 65, 130); + + cairo_new_path (cr); + cairo_move_to (cr, + knots[3].a.x, knots[3].a.y); + cairo_curve_to (cr, + knots[3].b.x, knots[3].b.y, + knots[3].c.x, knots[3].c.y, + knots[3].d.x, knots[3].d.y); + cairo_stroke_extents (cr, &stroke_x0, &stroke_y0, &stroke_x1, &stroke_y1); + cairo_path_extents (cr, &path_x0, &path_y0, &path_x1, &path_y1); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_set_line_width (cr, 1); + cairo_set_source_rgb (cr, 1, 0, 0); + draw_bbox (cr, stroke_x0, stroke_y0, stroke_x1, stroke_y1); + cairo_set_source_rgb (cr, 0, 0, 1); + draw_bbox (cr, path_x0, path_y0, path_x1, path_y1); + } cairo_restore (cr); + + cairo_translate (cr, 130, 0); + + cairo_new_path (cr); + cairo_move_to (cr, + knots[4].a.x, knots[4].a.y); + cairo_curve_to (cr, + knots[4].b.x, knots[4].b.y, + knots[4].c.x, knots[4].c.y, + knots[4].d.x, knots[4].d.y); + cairo_stroke_extents (cr, &stroke_x0, &stroke_y0, &stroke_x1, &stroke_y1); + cairo_path_extents (cr, &path_x0, &path_y0, &path_x1, &path_y1); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_set_line_width (cr, 1); + cairo_set_source_rgb (cr, 1, 0, 0); + draw_bbox (cr, stroke_x0, stroke_y0, stroke_x1, stroke_y1); + cairo_set_source_rgb (cr, 0, 0, 1); + draw_bbox (cr, path_x0, path_y0, path_x1, path_y1); + } cairo_restore (cr); + + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + +#ifdef REFERENCE + cairo_set_source_rgb (cr, 0, 0, 0); + thick_splines (cr, 5); + + cairo_set_source_rgb (cr, 1, 1, 1); + thin_splines (cr); +#endif + + /* + * Use a high tolerance to reduce dependence upon algorithm used for + * spline decomposition. + */ + cairo_set_tolerance (cr, 0.001); + + cairo_set_line_width (cr, 10); + cairo_set_source_rgb (cr, 0, 0, 0); + stroke_splines (cr); + cairo_set_line_width (cr, 2); + cairo_set_source_rgb (cr, 1, 1, 1); + stroke_splines (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (spline_decomposition, + "Tests splines with various inflection points", + "stroke, spline", /* keywords */ + NULL, /* requirements */ + 390, 260, + NULL, draw) diff --git a/test/stride-12-image.c b/test/stride-12-image.c new file mode 100644 index 000000000..5650e9830 --- /dev/null +++ b/test/stride-12-image.c @@ -0,0 +1,71 @@ +/* + * Copyright 2012 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_format_t format = CAIRO_FORMAT_ARGB32; + cairo_t *cr_src; + cairo_surface_t *png, *src; + uint8_t *data; + int stride; + + png = cairo_test_create_surface_from_png (ctx, png_filename); + + stride = cairo_format_stride_for_width (format, width) + 12; + data = xcalloc (stride, height); + src = cairo_image_surface_create_for_data (data, format, + width, height, stride); + + cr_src = cairo_create (src); + cairo_set_source_surface (cr_src, png, 0, 0); + cairo_paint (cr_src); + cairo_destroy (cr_src); + + cairo_set_source_surface (cr, src, 0, 0); + cairo_paint (cr); + + cairo_surface_destroy (png); + + cairo_surface_finish (src); + cairo_surface_destroy (src); + + free (data); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (stride_12_image, + "Test that images with a non-default stride are handled correctly.", + "stride, image", /* keywords */ + NULL, /* requirements */ + 256, 192, + NULL, draw) diff --git a/test/stroke-clipped.c b/test/stroke-clipped.c new file mode 100644 index 000000000..4b8079480 --- /dev/null +++ b/test/stroke-clipped.c @@ -0,0 +1,54 @@ +/* + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "cairo-test.h" + +#define SIZE 200 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int row; + + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_paint(cr); + + cairo_set_source_rgb(cr, 1, 0, 0); + for(row = 0; row < SIZE; row++) { + cairo_rectangle(cr, 0, row, SIZE, 1); + cairo_clip(cr); + + cairo_arc(cr, SIZE/2, SIZE/2, SIZE/2-8, 0, 2*M_PI); + cairo_stroke(cr); + + cairo_reset_clip(cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (stroke_clipped, + "Check that the stroke is accurately drawn through smaller clips", + "stroke", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/stroke-ctm-caps.c b/test/stroke-ctm-caps.c new file mode 100644 index 000000000..1bbee83c6 --- /dev/null +++ b/test/stroke-ctm-caps.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2008 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define SIZE 100 +#define PAD 2 +#define WIDTH (PAD + SIZE + PAD) +#define HEIGHT WIDTH + +/* This test is designed to test that PDF viewers use the correct + * alpha values in an Alpha SMasks. Some viewers use the color values + * instead of the alpha. The test draws a triangle and rectangle in a + * group then draws the group using cairo_mask(). The mask consists of + * a circle with the rgba (0.4, 0.4, 0.4, 0.8) and the background rgba + * (0.8, 0.8, 0.8, 0.4). + */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + /* flip the CTM, which most clearly shows the problem */ + cairo_translate (cr, 0, HEIGHT); + cairo_scale (cr, 1, -1); + + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_line_width (cr, 10); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + + cairo_move_to (cr, 20, 20); + cairo_line_to (cr, 20, 70); + cairo_stroke (cr); + + cairo_move_to (cr, 40, 20); + cairo_line_to (cr, 70, 70); + cairo_stroke (cr); + + cairo_move_to (cr, 60, 20); + cairo_line_to (cr, 90, 20); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (stroke_ctm_caps, + "Test that the stroker correctly passes the device-space vector to the stroker for endcaps", + "stroke, transform", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/stroke-image.c b/test/stroke-image.c new file mode 100644 index 000000000..17e6653ff --- /dev/null +++ b/test/stroke-image.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2006 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +#define PAD 10 +#define SIZE 100 +#define IMAGE_SIZE (SIZE-PAD*2) +#define LINE_WIDTH 10 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *image; + cairo_t *cr_image; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, IMAGE_SIZE, IMAGE_SIZE); + cr_image = cairo_create (image); + cairo_surface_destroy (image); + + /* Create the image */ + cairo_set_source_rgb (cr_image, 0, 0, 0); + cairo_paint (cr_image); + cairo_set_source_rgb (cr_image, 0, 1, 0); + cairo_set_line_width (cr_image, LINE_WIDTH); + cairo_arc (cr_image, IMAGE_SIZE/2, IMAGE_SIZE/2, IMAGE_SIZE/2 - LINE_WIDTH/2, 0, M_PI * 2.0); + cairo_stroke (cr_image); + + /* Now stroke with it */ + cairo_translate (cr, PAD, PAD); + + cairo_set_source_surface (cr, cairo_get_target (cr_image), 0, 0); + cairo_destroy (cr_image); + + cairo_new_path (cr); + cairo_set_line_width (cr, LINE_WIDTH); + cairo_arc (cr, IMAGE_SIZE/2, IMAGE_SIZE/2, IMAGE_SIZE/2 - LINE_WIDTH/2, 0, M_PI * 2.0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (stroke_image, + "Test stroking with an image source, with a non-identity CTM", + "stroke, image, transform", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/stroke-open-box.c b/test/stroke-open-box.c new file mode 100644 index 000000000..b1dae5090 --- /dev/null +++ b/test/stroke-open-box.c @@ -0,0 +1,51 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Simon Kellner + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Simon Kellner + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, 5, 7); + cairo_rel_line_to (cr, 20, 0); + cairo_rel_line_to (cr, 0, 15); + cairo_rel_line_to (cr, -20, 0); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (stroke_open_box, + "Tests stroking of a 3-sided box", + "stroke,box", /* keywords */ + NULL, /* requirements */ + 30, 32, + NULL, draw) diff --git a/test/stroke-pattern.c b/test/stroke-pattern.c new file mode 100644 index 000000000..01e10195d --- /dev/null +++ b/test/stroke-pattern.c @@ -0,0 +1,68 @@ +/* + * Copyright © 2011 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" + +#define IMAGE_WIDTH 80 +#define IMAGE_HEIGHT 80 + + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *pattern; + + cairo_test_paint_checkered (cr); + + cairo_scale (cr, 0.3, 0.3); + cairo_translate (cr, 50, 50); + + pattern = cairo_pattern_create_linear (70, 100, 130, 100); + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 0, 0, 1.0); + cairo_pattern_add_color_stop_rgba (pattern, 1, 0, 1, 0, 0.5); + + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD); + cairo_set_source (cr, pattern); + + cairo_move_to(cr, 20, 20); + cairo_curve_to(cr, + 130, 0, + 70, 200, + 180, 180); + cairo_set_line_width (cr, 20); + cairo_stroke (cr); + + cairo_pattern_destroy (pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (stroke_pattern, + "Patterned stroke", + "stroke, pattern", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/subsurface-image-repeat.c b/test/subsurface-image-repeat.c new file mode 100644 index 000000000..c741944fb --- /dev/null +++ b/test/subsurface-image-repeat.c @@ -0,0 +1,70 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static const char *png_filename = "romedalen.png"; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *image, *region; + cairo_t *cr_region; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + /* fill the centre */ + region = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20, 20, 20, 20); + cr_region = cairo_create (region); + cairo_surface_destroy (region); + + image = cairo_test_create_surface_from_png (ctx, png_filename); + cairo_set_source_surface (cr_region, image, + 10 - cairo_image_surface_get_width (image)/2, + 10 - cairo_image_surface_get_height (image)/2); + cairo_paint (cr_region); + cairo_surface_destroy (image); + + cairo_set_source_surface (cr, cairo_get_target (cr_region), 20, 20); + cairo_destroy (cr_region); + + /* repeat the pattern around the outside, but do not overwrite...*/ + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_rectangle (cr, 0, 0, width, height); + cairo_rectangle (cr, 20, 40, 20, -20); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_image_repeat, + "Tests source (image) clipping with repeat", + "subsurface, image, repeat", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface-modify-child.c b/test/subsurface-modify-child.c new file mode 100644 index 000000000..ed9435616 --- /dev/null +++ b/test/subsurface-modify-child.c @@ -0,0 +1,98 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region, *similar; + cairo_t *cr_region, *cr_similar; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + similar = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + 20, 20); + + /* copy the centre */ + cr_similar = cairo_create (similar); + cairo_surface_destroy (similar); + cairo_set_source_surface (cr_similar, cairo_get_target (cr), -20, -20); + cairo_paint (cr_similar); + similar = cairo_surface_reference (cairo_get_target (cr_similar)); + cairo_destroy (cr_similar); + + /* fill the centre */ + region = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20, 20, 20, 20); + cr_region = cairo_create (region); + cairo_surface_destroy (region); + + cairo_set_source_rgb (cr_region, 1, 1, 1); + cairo_rectangle (cr_region, 0, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 1, 0, 0); + cairo_rectangle (cr_region, 10, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 1, 0); + cairo_rectangle (cr_region, 0, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 0, 1); + cairo_rectangle (cr_region, 10, 10, 10, 10); + cairo_fill (cr_region); + + cairo_destroy (cr_region); + + /* copy the centre, again */ + cr_similar = cairo_create (similar); + cairo_surface_destroy (similar); + cairo_set_source_surface (cr_similar, cairo_get_target (cr), -20, -20); + cairo_paint (cr_similar); + similar = cairo_surface_reference (cairo_get_target (cr_similar)); + cairo_destroy (cr_similar); + + /* repeat the pattern around the outside, but do not overwrite...*/ + cairo_set_source_surface (cr, similar, 20, 20); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_rectangle (cr, 0, 0, width, height); + cairo_rectangle (cr, 20, 40, 20, -20); + cairo_fill (cr); + + cairo_surface_destroy (similar); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_modify_child, + "Tests source clipping with later modifications", + "subsurface", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface-modify-parent.c b/test/subsurface-modify-parent.c new file mode 100644 index 000000000..de16e7530 --- /dev/null +++ b/test/subsurface-modify-parent.c @@ -0,0 +1,78 @@ +/* + * Copyright 2010 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + /* fill the centre, but through the *original* surface */ + region = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20, 20, 20, 20); + + /* first trigger a snapshot of the region... */ + cairo_set_source_surface (cr, region, 20, 20); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, 20, 20, 10, 10); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, 30, 20, 10, 10); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, 20, 30, 10, 10); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, 30, 30, 10, 10); + cairo_fill (cr); + + cairo_set_source_surface (cr, region, 20, 20); + cairo_surface_destroy (region); + + /* repeat the pattern around the outside, but do not overwrite...*/ + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_rectangle (cr, 0, 0, width, height); + cairo_rectangle (cr, 20, 40, 20, -20); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_modify_parent, + "Tests source clipping with later modifications", + "subsurface", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface-outside-target.c b/test/subsurface-outside-target.c new file mode 100644 index 000000000..ef91a2e1c --- /dev/null +++ b/test/subsurface-outside-target.c @@ -0,0 +1,177 @@ +/* + * Copyright 2010 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +#define TARGET_SIZE 10 + +#define SUB_SIZE 15 +#define SUB_OFFSET -5 + +#define PAINT_OFFSET SUB_SIZE +#define PAINT_SIZE (3 * SUB_SIZE) + +static cairo_content_t contents[] = { CAIRO_CONTENT_ALPHA, + CAIRO_CONTENT_COLOR, + CAIRO_CONTENT_COLOR_ALPHA }; + +#define N_CONTENTS ARRAY_LENGTH (contents) +#define N_PADS (CAIRO_EXTEND_PAD + 1) + + +static cairo_surface_t * +create_target (cairo_surface_t *similar_to, + cairo_content_t content) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_surface_create_similar (similar_to, + content, + TARGET_SIZE, TARGET_SIZE); + + cr = cairo_create (surface); + cairo_test_paint_checkered (cr); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +check_surface_extents (const cairo_test_context_t *ctx, + cairo_surface_t * surface, + double x, + double y, + double width, + double height) +{ + double x1, y1, x2, y2; + cairo_t *cr; + + cr = cairo_create (surface); + cairo_clip_extents (cr, &x1, &y1, &x2, &y2); + cairo_destroy (cr); + + if (x != x1 || + y != y1 || + width != x2 - x1 || + height != y2 - y1) { + cairo_test_log (ctx, + "surface extents should be (%g, %g, %g, %g), but are (%g, %g, %g, %g)\n", + x, y, width, height, + x1, y1, x2 - x1, y2 - y1); + return CAIRO_TEST_FAILURE; + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_for_size (cairo_t *cr, + double x, + double y) +{ + cairo_surface_t *target, *subsurface; + cairo_extend_t extend; + cairo_test_status_t check, result = CAIRO_TEST_SUCCESS; + unsigned int content; + + for (content = 0; content < N_CONTENTS; content++) { + cairo_save (cr); + + /* create a target surface for our subsurface */ + target = create_target (cairo_get_target (cr), + contents[content]); + + /* create a subsurface that extends the target surface */ + subsurface = cairo_surface_create_for_rectangle (target, + x, y, + SUB_SIZE, SUB_SIZE); + + /* ensure the extents are ok */ + check = check_surface_extents (cairo_test_get_context (cr), + subsurface, + 0, 0, + SUB_SIZE, SUB_SIZE); + if (result == CAIRO_TEST_SUCCESS) + result = check; + + /* paint this surface with all extend modes. */ + for (extend = 0; extend < N_PADS; extend++) { + cairo_save (cr); + + cairo_rectangle (cr, 0, 0, PAINT_SIZE, PAINT_SIZE); + cairo_clip (cr); + + cairo_set_source_surface (cr, subsurface, PAINT_OFFSET, PAINT_OFFSET); + cairo_pattern_set_extend (cairo_get_source (cr), extend); + cairo_paint (cr); + + cairo_restore (cr); + + cairo_translate (cr, PAINT_SIZE + TARGET_SIZE, 0); + } + + cairo_surface_destroy (subsurface); + cairo_surface_destroy (target); + + cairo_restore (cr); + + cairo_translate (cr, 0, PAINT_SIZE + TARGET_SIZE); + } + + return result; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_test_status_t check, result = CAIRO_TEST_SUCCESS; + + /* paint background in nice gray */ + cairo_set_source_rgb (cr, 0.51613, 0.55555, 0.51613); + cairo_paint (cr); + + /* Use CAIRO_OPERATOR_SOURCE in the tests so we get the actual + * contents of the subsurface */ + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + + result = draw_for_size (cr, SUB_OFFSET, SUB_OFFSET); + + check = draw_for_size (cr, 0, 0); + if (result == CAIRO_TEST_SUCCESS) + result = check; + + return result; +} + +CAIRO_TEST (subsurface_outside_target, + "Tests contents of subsurfaces outside target area", + "subsurface, pad", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + (PAINT_SIZE + TARGET_SIZE) * N_PADS - TARGET_SIZE, + (PAINT_SIZE + TARGET_SIZE) * N_CONTENTS * 2 - TARGET_SIZE, + NULL, draw) diff --git a/test/subsurface-pad.c b/test/subsurface-pad.c new file mode 100644 index 000000000..1ac7a0e39 --- /dev/null +++ b/test/subsurface-pad.c @@ -0,0 +1,76 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region; + cairo_t *cr_region; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + /* fill the centre */ + region = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20, 20, 20, 20); + cr_region = cairo_create (region); + cairo_surface_destroy (region); + + cairo_set_source_rgb (cr_region, 1, 1, 1); + cairo_rectangle (cr_region, 0, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 1, 0, 0); + cairo_rectangle (cr_region, 10, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 1, 0); + cairo_rectangle (cr_region, 0, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 0, 1); + cairo_rectangle (cr_region, 10, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_surface (cr, cairo_get_target (cr_region), 20, 20); + cairo_destroy (cr_region); + + /* reflect the pattern around the outside, but do not overwrite...*/ + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD); + cairo_rectangle (cr, 0, 0, width, height); + cairo_rectangle (cr, 20, 40, 20, -20); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_pad, + "Tests source clipping with pad", + "subsurface, pad", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface-reflect.c b/test/subsurface-reflect.c new file mode 100644 index 000000000..517106df1 --- /dev/null +++ b/test/subsurface-reflect.c @@ -0,0 +1,76 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region; + cairo_t *cr_region; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + /* fill the centre */ + region = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20, 20, 20, 20); + cr_region = cairo_create (region); + cairo_surface_destroy (region); + + cairo_set_source_rgb (cr_region, 1, 1, 1); + cairo_rectangle (cr_region, 0, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 1, 0, 0); + cairo_rectangle (cr_region, 10, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 1, 0); + cairo_rectangle (cr_region, 0, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 0, 1); + cairo_rectangle (cr_region, 10, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_surface (cr, cairo_get_target (cr_region), 20, 20); + cairo_destroy (cr_region); + + /* reflect the pattern around the outside, but do not overwrite...*/ + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REFLECT); + cairo_rectangle (cr, 0, 0, width, height); + cairo_rectangle (cr, 20, 40, 20, -20); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_reflect, + "Tests source clipping with reflect", + "subsurface, reflect", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface-repeat.c b/test/subsurface-repeat.c new file mode 100644 index 000000000..596b97338 --- /dev/null +++ b/test/subsurface-repeat.c @@ -0,0 +1,76 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region; + cairo_t *cr_region; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + /* fill the centre */ + region = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20, 20, 20, 20); + cr_region = cairo_create (region); + cairo_surface_destroy (region); + + cairo_set_source_rgb (cr_region, 1, 1, 1); + cairo_rectangle (cr_region, 0, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 1, 0, 0); + cairo_rectangle (cr_region, 10, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 1, 0); + cairo_rectangle (cr_region, 0, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 0, 1); + cairo_rectangle (cr_region, 10, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_surface (cr, cairo_get_target (cr_region), 20, 20); + cairo_destroy (cr_region); + + /* repeat the pattern around the outside, but do not overwrite...*/ + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_rectangle (cr, 0, 0, width, height); + cairo_rectangle (cr, 20, 40, 20, -20); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_repeat, + "Tests source clipping with repeat", + "subsurface, repeat", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface-scale.c b/test/subsurface-scale.c new file mode 100644 index 000000000..9ffd2c422 --- /dev/null +++ b/test/subsurface-scale.c @@ -0,0 +1,93 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region[5]; + const char *text = "Cairo"; + int i; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_rectangle (cr, 0, 20, 200, 60); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + + for (i = 0; i < 5; i++) { + cairo_t *cr_region; + cairo_text_extents_t extents; + char buf[2] = { text[i], '\0' }; + + region[i] = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20 * i, 0, 20, 20); + + cr_region = cairo_create (region[i]); + cairo_surface_destroy (region[i]); + + cairo_select_font_face (cr_region, "@cairo:", + CAIRO_FONT_WEIGHT_NORMAL, + CAIRO_FONT_SLANT_NORMAL); + cairo_set_font_size (cr_region, 20); + cairo_text_extents (cr_region, buf, &extents); + cairo_move_to (cr_region, + 10 - (extents.width/2 + extents.x_bearing), + 10 - (extents.height/2 + extents.y_bearing)); + cairo_show_text (cr_region, buf); + + region[i] = cairo_surface_reference (cairo_get_target (cr_region)); + cairo_destroy (cr_region); + } + + cairo_scale (cr, 2, 2); + for (i = 0; i < 5; i++) { + cairo_set_source_surface (cr, region[5-i-1], 20 * i, 20); + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_PAD); + cairo_rectangle (cr, 20*i, 20, 20, 20); + cairo_fill (cr); + } + + for (i = 0; i < 5; i++) { + cairo_set_source_surface (cr, region[5-i-1], 20 * i, 40); + cairo_paint_with_alpha (cr, .5); + } + + for (i = 0; i < 5; i++) + cairo_surface_destroy (region[i]); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_scale, + "Tests clipping of both source and destination using subsurfaces", + "subsurface", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 200, 120, + NULL, draw) diff --git a/test/subsurface-similar-repeat.c b/test/subsurface-similar-repeat.c new file mode 100644 index 000000000..011f876e6 --- /dev/null +++ b/test/subsurface-similar-repeat.c @@ -0,0 +1,86 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *similar; + cairo_surface_t *region; + cairo_t *cr_region; + + cairo_set_source_rgb (cr, .5, .5, .5); + cairo_paint (cr); + + similar = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR, + 60, 60); + cr_region = cairo_create (similar); + cairo_surface_destroy (similar); + + cairo_set_source_rgb (cr_region, .5, .5, .0); + cairo_paint (cr_region); + similar = cairo_surface_reference (cairo_get_target (cr_region)); + cairo_destroy (cr_region); + + /* fill the centre */ + region = cairo_surface_create_for_rectangle (similar, 20, 20, 20, 20); + cairo_surface_destroy (similar); + + cr_region = cairo_create (region); + cairo_surface_destroy (region); + + cairo_set_source_rgb (cr_region, 1, 1, 1); + cairo_rectangle (cr_region, 0, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 1, 0, 0); + cairo_rectangle (cr_region, 10, 0, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 1, 0); + cairo_rectangle (cr_region, 0, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_rgb (cr_region, 0, 0, 1); + cairo_rectangle (cr_region, 10, 10, 10, 10); + cairo_fill (cr_region); + + cairo_set_source_surface (cr, cairo_get_target (cr_region), 20, 20); + cairo_destroy (cr_region); + + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface_similar_repeat, + "Tests source clipping through an intermediate with repeat", + "subsurface, repeat", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 60, 60, + NULL, draw) diff --git a/test/subsurface.c b/test/subsurface.c new file mode 100644 index 000000000..812776c0a --- /dev/null +++ b/test/subsurface.c @@ -0,0 +1,85 @@ +/* + * Copyright 2009 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Intel not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Intel makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * INTEL CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *region[5]; + const char *text = "Cairo"; + int i; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + for (i = 0; i < 5; i++) { + cairo_t *cr_region; + cairo_text_extents_t extents; + char buf[2] = { text[i], '\0' }; + + region[i] = cairo_surface_create_for_rectangle (cairo_get_target (cr), + 20 * i, 0, 20, 20); + + cr_region = cairo_create (region[i]); + cairo_surface_destroy (region[i]); + + cairo_select_font_face (cr_region, "@cairo:", + CAIRO_FONT_WEIGHT_NORMAL, + CAIRO_FONT_SLANT_NORMAL); + cairo_set_font_size (cr_region, 20); + cairo_text_extents (cr_region, buf, &extents); + cairo_move_to (cr_region, + 10 - (extents.width/2 + extents.x_bearing), + 10 - (extents.height/2 + extents.y_bearing)); + cairo_show_text (cr_region, buf); + + region[i] = cairo_surface_reference (cairo_get_target (cr_region)); + cairo_destroy (cr_region); + } + + for (i = 0; i < 5; i++) { + cairo_set_source_surface (cr, region[5-i-1], 20 * i, 20); + cairo_paint (cr); + } + + for (i = 0; i < 5; i++) { + cairo_set_source_surface (cr, region[5-i-1], 20 * i, 40); + cairo_paint_with_alpha (cr, .5); + } + + for (i = 0; i < 5; i++) + cairo_surface_destroy (region[i]); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (subsurface, + "Tests clipping of both source and destination using subsurfaces", + "subsurface", /* keywords */ + "target=raster", /* FIXME! recursion bug in subsurface/snapshot (with pdf backend) */ /* requirements */ + 100, 60, + NULL, draw) diff --git a/test/surface-finish-twice.c b/test/surface-finish-twice.c new file mode 100644 index 000000000..f63b50175 --- /dev/null +++ b/test/surface-finish-twice.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +/* Bug history + * + * 2005-04-10 stevech1097@yahoo.com.au + * + * Subject: [Bug 2950] New: *** glibc detected *** double free or corruption + * URL: https://bugs.freedesktop.org/show_bug.cgi?id=2950 + * + * The following short program gives the error message: + * + * *** glibc detected *** double free or corruption: 0x082a7268 *** + * Aborted + * + * 2005-04-13 Carl Worth + * + * Looks like surface->finished was never being set. Now fixed. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_surface_t *surface; + cairo_status_t status; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status != CAIRO_STATUS_SUCCESS) + return cairo_test_status_from_status (ctx, status); + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status != CAIRO_STATUS_SUCCESS) + return cairo_test_status_from_status (ctx, status); + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + if (status != CAIRO_STATUS_SUCCESS) + return cairo_test_status_from_status (ctx, status); + + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (surface_finish_twice, + "Test to exercise a crash when calling cairo_surface_finish twice on the same surface.", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/surface-pattern-big-scale-down.c b/test/surface-pattern-big-scale-down.c new file mode 100644 index 000000000..698accb6f --- /dev/null +++ b/test/surface-pattern-big-scale-down.c @@ -0,0 +1,125 @@ +/* + * Copyright © 2006 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +#define SRC_WIDTH 2048 +#define SRC_HEIGHT 32 + +static cairo_surface_t * +create_source_surface (int w, int h) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, SRC_WIDTH, SRC_HEIGHT); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + cairo_rectangle (cr, 0, 0, w/2, h/2); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + cairo_rectangle (cr, w/2, 0, w/2, h/2); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + cairo_rectangle (cr, 0, h/2, w/2, h/2); + cairo_fill (cr); + + cairo_set_source_rgb (cr, 1.0, 1.0, 0.0); + cairo_rectangle (cr, w/2, h/2, w/2, h/2); + cairo_fill (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static void +draw_n (cairo_t *cr, cairo_pattern_t *pat, double dest_size, int n) +{ + cairo_matrix_t mat; + + cairo_matrix_init_scale (&mat, SRC_WIDTH / dest_size, SRC_HEIGHT / dest_size); + cairo_matrix_translate (&mat, n * -dest_size, 0.0); + cairo_pattern_set_matrix (pat, &mat); + + cairo_set_source (cr, pat); + cairo_new_path (cr); + cairo_rectangle (cr, n * dest_size, 0.0, dest_size, dest_size); + cairo_fill (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_pattern_t *pat; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + surface = create_source_surface (SRC_WIDTH, SRC_HEIGHT); + + pat = cairo_pattern_create_for_surface (surface); + cairo_surface_destroy (surface); + + /* We want to draw at a position such that n * SRC_WIDTH * (SRC_WIDTH/16.0) > 32768. + * x = n * 16. + * + * To show the bug, we want to draw on either side of the boundary; + * in our case here, n = 16 results in 32768, and n = 17 results in > 32768. + * + * Drawing at 16 and 17 is sufficient to show the problem. + */ + +#if 1 + /* n = 16 */ + draw_n (cr, pat, 16.0, 16); + + /* n = 17 */ + draw_n (cr, pat, 16.0, 17); +#else + { + int n; + for (n = 0; n < 32; n++) + draw_n (cr, pat, 16.0, n); + } +#endif + + cairo_pattern_destroy (pat); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (surface_pattern_big_scale_down, + "Test scaled-down transformed not-repeated surface patterns with large images and offsets", + "transform", /* keywords */ + NULL, /* requirements */ + 512, 16, + NULL, draw) diff --git a/test/surface-pattern-operator.c b/test/surface-pattern-operator.c new file mode 100644 index 000000000..994baf92e --- /dev/null +++ b/test/surface-pattern-operator.c @@ -0,0 +1,119 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2009 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define N_OPERATORS (CAIRO_OPERATOR_SATURATE + 1) +#define HEIGHT 16 +#define WIDTH 16 +#define PAD 3 + +static cairo_pattern_t* +_create_pattern (cairo_surface_t *target, cairo_content_t content, int width, int height) +{ + cairo_pattern_t *pattern; + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_surface_create_similar (target, content, width, height); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_arc (cr, 0.5 * width, 0.5 * height, 0.45 * height, -M_PI / 4, 3 * M_PI / 4); + cairo_fill (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *alpha_pattern, *color_alpha_pattern, *pattern; + unsigned int n, i; + + alpha_pattern = _create_pattern (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, + 0.9 * WIDTH, 0.9 * HEIGHT); + color_alpha_pattern = _create_pattern (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + 0.9 * WIDTH, 0.9 * HEIGHT); + + pattern = cairo_pattern_create_linear (WIDTH, 0, 0, HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, 0, 0, 1, 1); + cairo_pattern_add_color_stop_rgba (pattern, 0.8, 0, 0, 1, 0); + + cairo_translate (cr, PAD, PAD); + + for (n = 0; n < N_OPERATORS; n++) { + cairo_save (cr); + for (i = 0; i < 4; i++) { + cairo_reset_clip (cr); + cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); + cairo_clip (cr); + + cairo_set_source (cr, pattern); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + if (i & 2) { + cairo_paint (cr); + } else { + cairo_rectangle (cr, WIDTH/2, HEIGHT/2, WIDTH, HEIGHT); + cairo_fill (cr); + } + + cairo_set_source (cr, i & 1 ? alpha_pattern : color_alpha_pattern); + cairo_set_operator (cr, n); + if (i & 2) { + cairo_paint (cr); + } else { + cairo_rectangle (cr, WIDTH/2, HEIGHT/2, WIDTH, HEIGHT); + cairo_fill (cr); + } + + cairo_translate (cr, 0, HEIGHT+PAD); + } + cairo_restore (cr); + + cairo_translate (cr, WIDTH+PAD, 0); + } + + cairo_pattern_destroy (pattern); + cairo_pattern_destroy (alpha_pattern); + cairo_pattern_destroy (color_alpha_pattern); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (surface_pattern_operator, + "Tests alpha-only and alpha-color sources with all operators", + "surface, pattern, operator", /* keywords */ + NULL, /* requirements */ + (WIDTH+PAD) * N_OPERATORS + PAD, 4*HEIGHT + 5*PAD, + NULL, draw) diff --git a/test/surface-pattern-scale-down-extend.c b/test/surface-pattern-scale-down-extend.c new file mode 100644 index 000000000..191ab927f --- /dev/null +++ b/test/surface-pattern-scale-down-extend.c @@ -0,0 +1,120 @@ +/* + * Copyright © 2010 M Joonas Pihlaja + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: M Joonas Pihlaja + */ +#include "cairo-test.h" + +/* Test that we can simultaneously downscale and extend a surface + * pattern. Reported by Franz Schmid to the cairo mailing list as a + * regression in 1.9.6: + * + * http://lists.cairographics.org/archives/cairo/2010-February/019492.html + */ + +static cairo_test_status_t +draw_with_extend (cairo_t *cr, int w, int h, cairo_extend_t extend) +{ + cairo_pattern_t *pattern; + cairo_set_source_rgb (cr, 1,1,1); + cairo_paint (cr); + + cairo_save (cr); + + /* When the destination surface is created by cairo-test-suite to + * test device-offset, it is bigger than w x h. This test expects + * the group to have a size which is exactly w x h, so it must + * clip to the this rectangle to guarantee that the group will + * have the correct size. + */ + cairo_rectangle (cr, 0, 0, w, h); + cairo_clip (cr); + + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR); { + /* A two by two checkerboard with black, red and yellow + * cells. */ + cairo_set_source_rgb (cr, 1,0,0); + cairo_rectangle (cr, w/2, 0, w-w/2, h/2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1,1,0); + cairo_rectangle (cr, 0, h/2, w/2, h-h/2); + cairo_fill (cr); + } + pattern = cairo_pop_group (cr); + cairo_pattern_set_extend(pattern, extend); + + cairo_restore (cr); + + cairo_scale (cr, 0.5, 0.5); + cairo_set_source (cr, pattern); + cairo_paint (cr); + + cairo_pattern_destroy (pattern); + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_repeat (cairo_t *cr, int w, int h) +{ + return draw_with_extend (cr, w, h, CAIRO_EXTEND_REPEAT); +} +static cairo_test_status_t +draw_none (cairo_t *cr, int w, int h) +{ + return draw_with_extend (cr, w, h, CAIRO_EXTEND_NONE); +} +static cairo_test_status_t +draw_reflect (cairo_t *cr, int w, int h) +{ + return draw_with_extend (cr, w, h, CAIRO_EXTEND_REFLECT); +} +static cairo_test_status_t +draw_pad (cairo_t *cr, int w, int h) +{ + return draw_with_extend (cr, w, h, CAIRO_EXTEND_PAD); +} + +CAIRO_TEST (surface_pattern_scale_down_extend_repeat, + "Test interaction of downscaling a surface pattern and extend-repeat", + "pattern, transform, extend", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw_repeat) +CAIRO_TEST (surface_pattern_scale_down_extend_none, + "Test interaction of downscaling a surface pattern and extend-none", + "pattern, transform, extend", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw_none) +CAIRO_TEST (surface_pattern_scale_down_extend_reflect, + "Test interaction of downscaling a surface pattern and extend-reflect", + "pattern, transform, extend", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw_reflect) +CAIRO_TEST (surface_pattern_scale_down_extend_pad, + "Test interaction of downscaling a surface pattern and extend-pad", + "pattern, transform, extend", /* keywords */ + NULL, /* requirements */ + 100, 100, + NULL, draw_pad) diff --git a/test/surface-pattern-scale-down.c b/test/surface-pattern-scale-down.c new file mode 100644 index 000000000..95782efb1 --- /dev/null +++ b/test/surface-pattern-scale-down.c @@ -0,0 +1,88 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 200 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t * cr_surface; + int surface_size = 300; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* Create an image surface with my favorite four colors in each + * quadrant. */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + surface_size, surface_size); + cr_surface = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr_surface, 1, 1, 1); + cairo_rectangle (cr_surface, + 0, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 1, 0, 0); + cairo_rectangle (cr_surface, + surface_size / 2, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 1, 0); + cairo_rectangle (cr_surface, + 0, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 0, 1); + cairo_rectangle (cr_surface, + surface_size / 2, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + + cairo_scale (cr, 0.2, 0.2); + cairo_rotate (cr, 1.); + cairo_set_source_surface (cr, cairo_get_target (cr_surface), 225, -225); + cairo_destroy (cr_surface); + + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (surface_pattern_scale_down, + "Test scaled-down transformed not-repeated surface patterns" + "\nFails xlib backend (with argb32) with inexplicable alpha in result", + "transform", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/surface-pattern-scale-up.c b/test/surface-pattern-scale-up.c new file mode 100644 index 000000000..0d71ba150 --- /dev/null +++ b/test/surface-pattern-scale-up.c @@ -0,0 +1,93 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +/* Exhibits nasty behaviour with GS due as their /Interpolate implementation + * does not function for rotated images. */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 100 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t * cr_surface; + int surface_size = 6; + + /* Fill the background with grey, so that it's easily visible when + * things get overdrawn */ + cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); + cairo_paint (cr); + + /* Create an image surface with my favorite four colors in each + * quadrant. */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + surface_size, surface_size); + cr_surface = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr_surface, 1, 1, 1); + cairo_rectangle (cr_surface, + 0, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 1, 0, 0); + cairo_rectangle (cr_surface, + surface_size / 2, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 1, 0); + cairo_rectangle (cr_surface, + 0, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 0, 1); + cairo_rectangle (cr_surface, + surface_size / 2, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + + cairo_scale (cr, 10, 10); + cairo_rotate (cr, 1.); + cairo_set_source_surface (cr, cairo_get_target (cr_surface), 4, -4.5); + cairo_destroy (cr_surface); + + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_NONE); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (surface_pattern_scale_up, + "Test scaled-up transformed not-repeated surface patterns" + "\nFails xlib backend (with argb32) with inexplicable alpha in result", + "transform", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/surface-pattern.c b/test/surface-pattern.c new file mode 100644 index 000000000..725f68d00 --- /dev/null +++ b/test/surface-pattern.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +#include "cairo-test.h" +#include +#include + +#define SIZE 140 +/* Note GhostScript does not support /Interpolate on rotated images, so the PS + * output looks terrible, but is a known issue. */ + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_t * cr_surface; + int surface_size = 6; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + /* Create an image surface with my favorite four colors in each + * quadrant. */ + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + surface_size, surface_size); + cr_surface = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr_surface, 1, 1, 1); + cairo_rectangle (cr_surface, + 0, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 1, 0, 0); + cairo_rectangle (cr_surface, + surface_size / 2, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 1, 0); + cairo_rectangle (cr_surface, + 0, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + cairo_set_source_rgb (cr_surface, 0, 0, 1); + cairo_rectangle (cr_surface, + surface_size / 2, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr_surface); + + cairo_scale (cr, 10, 10); + cairo_rotate (cr, 1.); + cairo_set_source_surface (cr, cairo_get_target (cr_surface), 1.5, 1.5); + cairo_destroy (cr_surface); + + cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (surface_pattern, + "Test transformed repeated surface patterns" + "\nExhibiting a strange (very minor) failure in ps backend with device-offset", + "transform", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/surface-source.c b/test/surface-source.c new file mode 100644 index 000000000..657a0c88e --- /dev/null +++ b/test/surface-source.c @@ -0,0 +1,170 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_surface_t *create_source_surface (int size); + +/* We use a relatively large source to exercise bug: + * Bug 7360 painting huge surfaces fails + * [https://bugs.freedesktop.org/show_bug.cgi?id=7360] + * but still keep the resultant image small for reasonably quick checking. + */ +#define SOURCE_SIZE 2000 +#define INTER_SIZE 512 +#define SIZE 96 + +static void +draw_pattern (cairo_surface_t **surface_inout, int surface_size) +{ + cairo_t *cr; + int mid = surface_size/2; + + cr = cairo_create (*surface_inout); + cairo_surface_destroy (*surface_inout); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 0, 0, 0, 0); + cairo_paint (cr); + + cairo_rectangle (cr, 0, 0, surface_size, surface_size); + cairo_rectangle (cr, mid - SIZE/4, mid + SIZE/4, SIZE/2, -SIZE/2); + cairo_clip (cr); + + /* outside squares -> opaque */ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_rectangle (cr, + 0, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle (cr, + surface_size / 2, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_rectangle (cr, + 0, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_rectangle (cr, + surface_size / 2, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + + cairo_reset_clip (cr); + cairo_rectangle (cr, mid - SIZE/4, mid - SIZE/4, SIZE/2, SIZE/2); + cairo_clip (cr); + + /* inside squares -> translucent */ + cairo_set_source_rgba (cr, 0, 0, 1, .5); + cairo_rectangle (cr, + 0, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + cairo_set_source_rgba (cr, 0, 1, 0, .5); + cairo_rectangle (cr, + surface_size / 2, 0, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + cairo_set_source_rgba (cr, 1, 0, 0, .5); + cairo_rectangle (cr, + 0, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + cairo_set_source_rgba (cr, 1, 1, 1, .5); + cairo_rectangle (cr, + surface_size / 2, surface_size / 2, + surface_size / 2, surface_size / 2); + cairo_fill (cr); + + + *surface_inout = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_surface_t *similar; + cairo_status_t status; + cairo_t *cr2; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + surface = create_source_surface (SOURCE_SIZE); + if (surface == NULL) /* can't create the source so skip the test */ + return CAIRO_TEST_UNTESTED; + + draw_pattern (&surface, SOURCE_SIZE); + + /* copy a subregion to a smaller intermediate surface */ + similar = cairo_surface_create_similar (surface, + CAIRO_CONTENT_COLOR_ALPHA, + INTER_SIZE, INTER_SIZE); + cr2 = cairo_create (similar); + cairo_surface_destroy (similar); + cairo_set_source_surface (cr2, surface, + (INTER_SIZE - SOURCE_SIZE)/2, + (INTER_SIZE - SOURCE_SIZE)/2); + cairo_paint (cr2); + + /* and then paint onto a small surface for checking */ + cairo_set_source_surface (cr, cairo_get_target (cr2), + (width - INTER_SIZE)/2, + (height - INTER_SIZE)/2); + cairo_destroy (cr2); + cairo_rectangle (cr, 16, 16, 64, 64); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_fill (cr); + + /* destroy the surface last, as this triggers XCloseDisplay */ + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + cairo_surface_destroy (surface); + + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_surface_t *surface; + cairo_status_t status; + + surface = create_source_surface (SOURCE_SIZE); + if (surface == NULL) /* can't create the source so skip the test */ + return CAIRO_TEST_UNTESTED; + + cairo_surface_finish (surface); + status = cairo_surface_status (surface); + cairo_surface_destroy (surface); + + return cairo_test_status_from_status (ctx, status); +} diff --git a/test/svg-clip.c b/test/svg-clip.c new file mode 100644 index 000000000..dff65f7cc --- /dev/null +++ b/test/svg-clip.c @@ -0,0 +1,152 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" + +#include + +#include + +/* Test SVG clipping */ + +#define WIDTH_IN_POINTS 600 +#define HEIGHT_IN_POINTS 600 +#define BASENAME "svg-clip.out" + +static void +test_clip (cairo_t *cr, double width, double height) +{ + cairo_t *cr2; + + /* Basic test; set a square clip and draw a circle to be clipped + * against it.*/ + + cairo_rectangle (cr, 100, 100, 400, 400); + cairo_clip (cr); + cairo_arc (cr, 300, 300, 210, 0, 2 * M_PI); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + + /* Add a plus shaped clip path to the square clip and draw a big + * green square to test the new clip path. */ + + cairo_save (cr); + + cairo_rectangle (cr, 250, 100, 100, 400); + cairo_rectangle (cr, 100, 250, 400, 100); + cairo_clip (cr); + + cairo_rectangle (cr, 0, 0, 600, 600); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_fill (cr); + + cairo_restore (cr); + + /* Set a bezier shape in addition to the rectangle clip set before + * the cairo_save() to verify that we successfully removed the + * plus shaped clip path and can set a new clip.*/ + + cairo_move_to (cr, 600, 0); + cairo_curve_to (cr, 300, 600, 0, 300, 600, 0); + cairo_clip (cr); + + cairo_rectangle (cr, 0, 0, 600, 600); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill (cr); + + /* Create a new context for this surface to test overlapped + * drawing from two contexts */ + cr2 = cairo_create (cairo_get_group_target (cr)); + + /* Using the new context, draw a black vertical line, which should + * appear unclipped on top of everything drawn so far. */ + cairo_move_to (cr2, 110, 0); + cairo_line_to (cr2, 110, 600); + cairo_stroke (cr2); + + /* Using the first context, draw another black vertical line. + * This line should be clipped agaist the bezier clipping path set + * earlier. */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, 400, 0); + cairo_line_to (cr, 400, 600); + cairo_stroke (cr); + + cairo_destroy (cr2); + + /* Test reset clip. Draw a transparent black circle over + * everything. Specifically, make sure the circle extends outside + * the square clip set at the top of this function. */ + cairo_reset_clip (cr); + cairo_arc (cr, 300, 300, 220, 0, 2 * M_PI); + cairo_set_source_rgba (cr, 0, 0, 0, 0.2); + cairo_fill (cr); +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_surface_t *surface; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + if (! cairo_test_is_target_enabled (ctx, "svg11") && + ! cairo_test_is_target_enabled (ctx, "svg12")) + { + return CAIRO_TEST_UNTESTED; + } + + xasprintf (&filename, "%s/%s.svg", path, BASENAME); + surface = cairo_svg_surface_create (filename, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + if (cairo_surface_status (surface)) { + cairo_test_log (ctx, + "Failed to create svg surface for file %s: %s\n", + filename, cairo_status_to_string (cairo_surface_status (surface))); + free (filename); + return CAIRO_TEST_FAILURE; + } + + cr = cairo_create (surface); + + test_clip (cr, WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + cairo_show_page (cr); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + printf ("svg-clip: Please check %s to make sure it looks happy.\n", + filename); + free (filename); + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (svg_clip, + "Test SVG clipping", + "svg, clip", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/svg-surface-source.c b/test/svg-surface-source.c new file mode 100644 index 000000000..3c7730f7f --- /dev/null +++ b/test/svg-surface-source.c @@ -0,0 +1,54 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#include + +#include "surface-source.c" + +#define BASENAME "svg-surface-source.out" + +static cairo_surface_t * +create_source_surface (int size) +{ + cairo_surface_t *surface; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + xasprintf (&filename, "%s/%s.svg", path, BASENAME); + surface = cairo_svg_surface_create (filename, + size, size); + cairo_surface_set_fallback_resolution (surface, 72., 72.); + free (filename); + + return surface; +} + +CAIRO_TEST (svg_surface_source, + "Test using a SVG surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/svg-surface.c b/test/svg-surface.c new file mode 100644 index 000000000..13b006d39 --- /dev/null +++ b/test/svg-surface.c @@ -0,0 +1,136 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include + +#include + +/* Pretty boring test just to make sure things aren't crashing --- + * no verification that we're getting good results yet. + * But you can manually view the image to make sure it looks happy. + */ + +#define WIDTH_IN_INCHES 3 +#define HEIGHT_IN_INCHES 3 +#define WIDTH_IN_POINTS (WIDTH_IN_INCHES * 72) +#define HEIGHT_IN_POINTS (HEIGHT_IN_INCHES * 72) +#define BASENAME "svg-surface.out" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ +#define STROKE_WIDTH .04 + + double size; + + if (width > height) + size = height; + else + size = width; + + cairo_translate (cr, (width - size) / 2.0, (height - size) / 2.0); + cairo_scale (cr, size, size); + + /* Fill face */ + cairo_arc (cr, 0.5, 0.5, 0.5 - STROKE_WIDTH, 0, 2 * M_PI); + cairo_set_source_rgb (cr, 1, 1, 0); + cairo_save (cr); + { + cairo_fill (cr); + } + cairo_restore (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); + + /* Stroke face */ + cairo_set_line_width (cr, STROKE_WIDTH / 2.0); + cairo_stroke (cr); + + /* Eyes */ + cairo_set_line_width (cr, STROKE_WIDTH); + cairo_arc (cr, 0.3, 0.4, STROKE_WIDTH, 0, 2 * M_PI); + cairo_fill (cr); + cairo_arc (cr, 0.7, 0.4, STROKE_WIDTH, 0, 2 * M_PI); + cairo_fill (cr); + + /* Mouth */ + cairo_move_to (cr, 0.3, 0.7); + cairo_curve_to (cr, + 0.4, 0.8, + 0.6, 0.8, + 0.7, 0.7); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_surface_t *surface; + char *filename; + const char *path = cairo_test_mkdir (CAIRO_TEST_OUTPUT_DIR) ? CAIRO_TEST_OUTPUT_DIR : "."; + + if (! cairo_test_is_target_enabled (ctx, "svg11") && + ! cairo_test_is_target_enabled (ctx, "svg12")) + { + return CAIRO_TEST_UNTESTED; + } + + xasprintf (&filename, "%s/%s.svg", path, BASENAME); + surface = cairo_svg_surface_create (filename, + WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + if (cairo_surface_status (surface)) { + cairo_test_log (ctx, + "Failed to create svg surface for file %s: %s\n", + filename, + cairo_status_to_string (cairo_surface_status (surface))); + free (filename); + return CAIRO_TEST_FAILURE; + } + + cr = cairo_create (surface); + + draw (cr, WIDTH_IN_POINTS, HEIGHT_IN_POINTS); + + cairo_show_page (cr); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + printf ("svg-surface: Please check %s to make sure it looks happy.\n", filename); + free (filename); + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (svg_surface, + "Check creation of a SVG surface", + "svg", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/svg2png.c b/test/svg2png.c new file mode 100644 index 000000000..bdfbc8b1e --- /dev/null +++ b/test/svg2png.c @@ -0,0 +1,62 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2005 Emmanuel Pacaud + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + * Emmanuel Pacaud + */ + +#include +#include +#include +#include +#include + +#define FAIL(msg) \ + do { fprintf (stderr, "FAIL: %s\n", msg); exit (-1); } while (0) + +int main (int argc, char *argv[]) +{ + GError *error = NULL; + GdkPixbuf *pixbuf; + const char *filename = argv[1]; + const char *output_filename = argv[2]; + + if (argc != 3) + FAIL ("usage: svg2png input_file.svg output_file.png"); + + g_type_init (); + + error = NULL; + + rsvg_set_default_dpi (72.0); + pixbuf = rsvg_pixbuf_from_file (filename, &error); + if (error != NULL) + FAIL (error->message); + + gdk_pixbuf_save (pixbuf, output_filename, "png", &error, NULL); + if (error != NULL) + FAIL (error->message); + + g_object_unref (pixbuf); + return 0; +} diff --git a/test/testtable.js b/test/testtable.js new file mode 100644 index 000000000..4fc664ff2 --- /dev/null +++ b/test/testtable.js @@ -0,0 +1,428 @@ +/* configuration */ +/* TODO: UNTESTED count can't be shown because it's not tracked explicitly */ +headerResults = [ "PASS", "NEW", "FAIL", "XFAIL", "CRASHED" ]; +logResults = [ "PASS", "NEW", "FAIL", "XFAIL", "CRASH!" ]; +resultToImgs = { + "PASS" : [], + "NEW" : [ "output" ], + "FAIL" : [ "output", "difference", "reference" ], + "XFAIL" : [], + "UNTESTED" : [], + "CRASHED" : [] +}; + +resultToString = { + "PASS" : "", + "NEW" : "", + "FAIL" : "", + "XFAIL" : "", + "UNTESTED" : "", + "CRASHED" : "CRASHED!" +}; + +resultField = "result"; +rowFields = [ "test", "offset", "scale", "similar" ]; +colFields = [ "target", "format" ]; +allFields = [ resultField ].concat (rowFields, colFields); + + +/* globals: */ +function resetGlobals () { + dragElement = undefined; + table = document.getElementById ("testTable"); + while (table.rows.length) + table.deleteRow (0); + colsArray = [ "HrowHeader" ]; + colsMap = undefined; + headerId = "HcolHeader"; + + fTrue = function (x) { return true; }; + + empty = new Row (); + header = new Row (); + header[colsArray[0]].toString = function () { return ""; }; + + untested = new Test (); + untested[resultField] = "UNTESTED"; +} + + +/* utility functions */ +function isKey (key) { return key[key.length-1] == ':'; } +function normalizeKey (key) { return key.toLowerCase ().replace (/[^a-z0-9]/, ""); } +function isVisible (x) { return x.style.display != "none"; } + +function link (html, url) { return "" + html + ""; } +function image (url) { return ""; } +function span (html, id, cls) { return "" + html + ""; } + +function fieldsToHTML (bColumns, values) { + var fields = bColumns ? colFields : rowFields; + var prefix = bColumns ? "c" : "r"; + var tmpRE = arrayApply (function (x) { return "[^/]*"; }, fields); + var r = Array (); + for (var i = 0; i < fields.length; i++) + if (fields[i] == "test") { + r.push (link (values[fields[i]], "output/" + values[fields[i]] + ".log")); + } else { + tmpRE[i] = values[fields[i]]; + r.push (span (values[fields[i]], prefix + "/" + tmpRE.join ("/") + "/", fields[i])); + tmpRE[i] = "[^/]*"; + } + return r.join ("/"); +} + +function inArray (value, array) { + for (var i = 0; i < array.length; i++) + if (value == array[i]) + return true; + return false; +} + +function arrayApply (fun, array) { + var r = new Array (); + for (var i = 0; i < array.length; i++) + r.push (fun(array[i])); + return r; +} + +function arrayPred (pred, array) { + var r = new Array (); + for (var i = 0; i < array.length; i++) + if (pred (array[i])) + r.push (array[i]); + return r; +} + +function arrayMap (map, array) { return arrayApply (function (x) { return map[x]; }, array); } + +function binSearch (rows, newId){ + var min = 0; + var max = rows.length; + + while (max - min > 1) { + var mid = (max + min) >> 1; + if (rows[mid].id > newId) + max = mid; + else + min = mid; + } + + if (max == min) + return max; + else + return rows[min].id > newId ? min : max; +} + +/* dynamic table utils */ +function updateCurrent () { + for (var i = 0; i < table.rows.length; i++) { + var row = table.rows[i]; + if (isVisible (row)) { + /* j starts from 1 because we want to ignore _rowHeader */ + for (var j = 1; j < row.cells.length; j++) + if (row.id[0] == "H") + for (var k = 0; k < headerResults.length; k++) + header[row.cells[j].id].current[headerResults[k]] = 0; + else if (isVisible (row.cells[j])) + header[row.cells[j].id].current[row.cells[j].className]++; + } + } + + updateHeader (); +} + +function setVisible (array, subsetPred, visibilityPred, visibleFlag) { + var modified = false, somethingVisible = false; + for (var i = 0; i < array.length; i++) + if (array[i].id[0] != "H") { + if (subsetPred (array[i])) { + var wanted = visibilityPred (array[i]); + if (isVisible (array[i]) != wanted) { + modified = true; + array[i].style.display = wanted ? visibleFlag : "none"; + } + } + somethingVisible = somethingVisible || isVisible (array[i]); + } + return modified && somethingVisible; +} + +function setVisibleOnly (array, pred, visibleFlag) { + return setVisible (array, fTrue, pred, visibleFlag); +} + +function flipVisible (array, subsetPred, visibleFlag) { + return setVisible (array, subsetPred, function (x) { return !isVisible (x); }, visibleFlag); +} + + +/* event handling */ +function ignoreEvent (event) { + if (event.preventDefault) + event.preventDefault(); + else + event.returnValue= false; + return false; +} + +function mouseUp (event) { + var visFun; + if (event.button == 0) + visFun = setVisibleOnly; + else if (event.button == 2) + visFun = flipVisible; + else + return false; + + var structureFun; + if (event.target.id[0] == "r") /* rows */ + structureFun = function (f, p) { return f (table.rows, p, "table-row"); }; + else if (event.target.id[0] == "c") /* cols */ + structureFun = function (f, p) { return inArray (true, arrayApply (function (row) { return f (row.cells, p, "table-cell") }, table.rows)) }; + else + return false; + + var pred; + if (event.target.id[1] == "/") { /* regexp */ + var re = new RegExp (event.target.id); + pred = function (x) { return re.test (x.id); }; + } else if (event.target.id[1] == "#") { /* counters */ + var s = event.target.id.substr (2).split ("/"); + pred = function (row) { return row.cells[s[0]].className == s[1]; } + } else + return false; + + if (!structureFun (visFun, pred)) + if (!structureFun (flipVisible, fTrue)) + structureFun (flipVisible, fTrue); + + updateCurrent (); + + return false; +} + +function noDrag (event) { + dragElement = undefined; + return false; +} + +function startDrag (event) { + if (event.button == 0) + dragElement = event.target; + else + dragElement = undefined; + return false; +} + +function endDrag (event) { + if (!dragElement) + return false; + + if (event.currentTarget.id == colsArray[0] && + inArray (dragElement.className, colFields)) { + rowFields.push (dragElement.className); + colFields = arrayPred (function (x) { return x != dragElement.className; }, colFields); + } else if (event.currentTarget.id == headerId && + inArray (dragElement.className, rowFields)) { + colFields.push (dragElement.className); + rowFields = arrayPred (function (x) { return x != dragElement.className; }, rowFields); + } else + return true; + + reloadAll (); + return false; +} + + +/* table content */ +function Row (id, t) { + this[colsArray[0]] = new RowHeader (id, t); + + this.get = function (c) { return this[c] != undefined ? this[c] : untested; } + this.getHTML = function (c) { return this.get(c).toString (); }; + this.setStyle = function (c, element) { return this.get(c).setStyle (element); }; +} + +function ColumnHeader (id, values) { + this.id = id; + this.values = values; + this.total = new Object (); + this.current = new Object (); + + for (var i = 0; i < headerResults.length; i++) { + this.total[headerResults[i]] = 0; + this.current[headerResults[i]] = 0; + } + + this.toString = function () { + var counts = new Array (); + for (var i = 0; i < headerResults.length; i++) { + var hr = headerResults[i]; + var s = span (this.current[hr], "r#" + colsMap[this.id] + "/" + hr, hr); + if (this.current[hr] != this.total[hr]) + s += span ("[" + this.total[hr] + "]", "r#" + colsMap[this.id] + "/" + hr, hr); + counts.push (s); + } + + return fieldsToHTML (true, this.values) + "
" + counts.join ("/"); + } + + this.setStyle = function (element) { }; +} + +function RowHeader (id, values) { + this.id = id; + this.values = values; + this.toString = function () { return fieldsToHTML (false, this.values); } + this.setStyle = function (element) { element.onmouseup = endDrag; }; +} + +function Test () { + this.rowId = function () { return "r/" + arrayMap (this, rowFields).join("/") + "/"; }; + this.colId = function () { return "c/" + arrayMap (this, colFields).join("/") + "/"; }; + this.isComplete = function () { return !inArray (undefined, arrayMap (this, allFields)); } + this.toString = function () { + var images = arrayMap (this, resultToImgs[this[resultField]]); + images = arrayPred (function (x) { return x != undefined; }, images); + images = arrayApply (function (x) { return link (image (x), x); }, images); + images.push (resultToString[this[resultField]]); + return images.join (" "); + }; + + this.setStyle = function (element) { element.className = this[resultField]; }; + + this.addData = function (array) { + for (var i = 0; i < array.length - 1; i += 2) + if (isKey (array[i])) + this[normalizeKey (array[i])] = array[i+1]; + }; +} + + +/* table creation */ +function insertCell (domRow, nid, tests) { + var domCell = domRow.insertCell (nid); + domCell.id = colsArray[nid]; + domCell.innerHTML = tests.getHTML (colsArray[nid]); + tests.setStyle (colsArray[nid], domCell); +} + +function updateRow (row, tests) { + var domRow = document.getElementById (row); + if (!domRow) { + domRow = table.insertRow (binSearch (table.rows, row)); + domRow.id = row; + } + + for (var i = 0; i < colsArray.length; i++) + if (i >= domRow.cells.length || domRow.cells[i].id != colsArray[i]) + insertCell (domRow, i, tests); +} + +function updateHeader () { + var visibility; + var domRow = document.getElementById (headerId); + if (domRow) { + visibility = new Object (); + for (var i = 0; i < domRow.cells.length; i++) + visibility[domRow.cells[i].id] = domRow.cells[i].style.display; + table.deleteRow (domRow.rowIndex); + } + + updateRow (headerId, header); + table.rows[0].onmouseup = endDrag; + + if (visibility) + for (var i = 0; i < colsArray.length; i++) + if (visibility[colsArray[i]]) + table.rows[0].cells[colsMap[colsArray[i]]].style.display = visibility[colsArray[i]]; +} + +function updateTable () { + colsArray.sort (); + + colsMap = new Object (); + for (var i = 0; i < colsArray.length; i++) + colsMap[colsArray[i]] = i; + + updateHeader (); + for (var i = 0; i < table.rows.length; i++) + updateRow (table.rows[i].id, empty); +} + + +/* log file parsing */ +function parseTest (testData) { + var colsChanged = false; + var rows = new Array (); + var data = new Object (); + var t = new Test (); + var lines = testData.replace (/\r/g, "").split ("\n"); + for (var i = 0; i < lines.length; i++) { + t.addData (lines[i].split (" ")); + if (t.isComplete ()) { + var c = t.colId (); + if (header[c] == undefined) { + colsArray.push (c); + header[c] = new ColumnHeader (c, t); + colsChanged = true; + } + + var r = t.rowId (); + if (!data[r]) { + rows.push (r); + data[r] = new Row (r, t); + } + + data[r][c] = t; + header[c].total[t[resultField]]++; + header[c].current[t[resultField]]++; + t = new Test (); + } + } + + if (colsChanged) + updateTable (); + else + updateHeader (); + + for (var i = 0; i < rows.length; i++) + updateRow (rows[i], data[rows[i]]); +} + +function parseFile (fileName, parser) { + var req = new XMLHttpRequest (); + req.onreadystatechange = function () { + if (req.readyState == 4) + parser (req.responseText); + } + + try { + req.open ("GET", fileName); + req.send (null); + } catch (e) {} +} + +function parseTestList (listData) { + var summaryRE = /\d+ Passed, \d+ Failed \x5b\d+ crashed, \d+ expected\x5d, \d+ Skipped/; + var lines = listData.replace (/\r/g, "").split ("\n"); + for (var i = 0; i < lines.length; i++) { + if (summaryRE.test (lines[i])) + return; + + var words = lines[i].split (" "); + if (words.length >= 2 && + words[0][words[0].length-1] == ":" && + inArray (words[1], logResults)) + parseFile ("output/" + words[0].substr (0, words[0].length-1) + ".log", parseTest); + } +} + +function reloadAll() { + resetGlobals (); + + parseFile ("cairo-test-suite.log", parseTestList); +} + +window.onload = reloadAll; diff --git a/test/text-antialias-subpixel.c b/test/text-antialias-subpixel.c new file mode 100644 index 000000000..6a65059eb --- /dev/null +++ b/test/text-antialias-subpixel.c @@ -0,0 +1,123 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * Copyright © 2011 Uli Schlachter + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Uli Schlachter + * + * Based on test/text-antialias.c + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define WIDTH 31 +#define HEIGHT 22 +#define TEXT_SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, cairo_subpixel_order_t order) +{ + cairo_text_extents_t extents; + cairo_font_options_t *font_options; + const char black[] = "black", blue[] = "blue"; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_SUBPIXEL); + cairo_font_options_set_subpixel_order (font_options, order); + cairo_set_font_options (cr, font_options); + + cairo_font_options_destroy (font_options); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_text_extents (cr, black, &extents); + cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing); + cairo_show_text (cr, black); + cairo_translate (cr, 0, -extents.y_bearing + 1); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_text_extents (cr, blue, &extents); + cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing); + cairo_show_text (cr, blue); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_rgb (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_SUBPIXEL_ORDER_RGB); +} + +static cairo_test_status_t +draw_bgr (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_SUBPIXEL_ORDER_BGR); +} + +static cairo_test_status_t +draw_vrgb (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_SUBPIXEL_ORDER_VRGB); +} + +static cairo_test_status_t +draw_vbgr (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_SUBPIXEL_ORDER_VBGR); +} + +CAIRO_TEST (text_antialias_subpixel_rgb, + "Tests text rendering with rgb subpixel antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_rgb) + +CAIRO_TEST (text_antialias_subpixel_bgr, + "Tests text rendering with bgr subpixel antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_bgr) + +CAIRO_TEST (text_antialias_subpixel_vrgb, + "Tests text rendering with vertical rgb subpixel antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_vrgb) + +CAIRO_TEST (text_antialias_subpixel_vbgr, + "Tests text rendering with vertical bgr subpixel antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_vbgr) diff --git a/test/text-antialias.c b/test/text-antialias.c new file mode 100644 index 000000000..7d338925e --- /dev/null +++ b/test/text-antialias.c @@ -0,0 +1,106 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define WIDTH 31 +#define HEIGHT 22 +#define TEXT_SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, cairo_antialias_t antialias) +{ + cairo_text_extents_t extents; + cairo_font_options_t *font_options; + const char black[] = "black", blue[] = "blue"; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + cairo_font_options_set_antialias (font_options, antialias); + cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_RGB); + cairo_set_font_options (cr, font_options); + + cairo_font_options_destroy (font_options); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_text_extents (cr, black, &extents); + cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing); + cairo_show_text (cr, black); + cairo_translate (cr, 0, -extents.y_bearing + 1); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_text_extents (cr, blue, &extents); + cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing); + cairo_show_text (cr, blue); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_gray (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_ANTIALIAS_GRAY); +} + +static cairo_test_status_t +draw_none (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_ANTIALIAS_NONE); +} + +static cairo_test_status_t +draw_subpixel (cairo_t *cr, int width, int height) +{ + return draw (cr, CAIRO_ANTIALIAS_SUBPIXEL); +} + +CAIRO_TEST (text_antialias_gray, + "Tests text rendering with grayscale antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_gray) + +CAIRO_TEST (text_antialias_none, + "Tests text rendering with no antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_none) + +CAIRO_TEST (text_antialias_subpixel, + "Tests text rendering with subpixel antialiasing", + "text", /* keywords */ + "target=raster", /* requirements */ + WIDTH, HEIGHT, + NULL, draw_subpixel) diff --git a/test/text-cache-crash.c b/test/text-cache-crash.c new file mode 100644 index 000000000..4786af4d5 --- /dev/null +++ b/test/text-cache-crash.c @@ -0,0 +1,93 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2004-11-04 Ned Konz + * + * Reported bug on mailing list: + * + * From: Ned Konz + * To: cairo@cairographics.org + * Date: Thu, 4 Nov 2004 09:49:38 -0800 + * Subject: [cairo] getting assertions [cairo_cache.c:143: _entry_destroy: + * Assertion `cache->used_memory > entry->memory' failed] + * + * The attached program dies on me with the assert + * + * $ ./testCairo + * testCairo: cairo_cache.c:143: _entry_destroy: Assertion `cache->used_memory > entry->memory' failed. + * + * 2004-11-04 Carl Worth + * + * I trimmed down Ned's example to the folllowing test while still + * maintaining the assertion. + * + * Oh, actually, it looks like I may have triggered something + * slightly different: + * + * text_cache_crash: cairo_cache.c:422: _cairo_cache_lookup: Assertion `cache->max_memory >= (cache->used_memory + new_entry->memory)' failed. + * + * I'll have to go back and try the original test after I fix this. + * + * 2004-11-13 Carl Worth + * + * Found the bug. cairo_gstate_select_font was noticing when the + * same font was selected twice in a row and was erroneously failing + * to free the old reference. Committed a fix and verified it also + * fixed the original test case. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* Once there was a bug that choked when selecting the same font twice. */ + cairo_select_font_face (cr, "sans", + CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size (cr, 40.0); + + cairo_select_font_face (cr, "sans", + CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size (cr, 40.0); + cairo_move_to (cr, 10, 50); + cairo_show_text (cr, "hello"); + + /* Then there was a bug that choked when selecting a font too big + * for the cache. */ + + cairo_set_font_size (cr, 500); + cairo_show_text (cr, "hello"); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (text_cache_crash, + "Test case for bug causing an assertion failure in _cairo_cache_lookup", + "text, stress", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/text-glyph-range.c b/test/text-glyph-range.c new file mode 100644 index 000000000..75b87d63a --- /dev/null +++ b/test/text-glyph-range.c @@ -0,0 +1,125 @@ +/* -*- Mode: c; c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t; -*- */ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Brian Ewins. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Brian Ewins not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Brian Ewins makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * BRIAN EWINS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL BRIAN EWINS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Brian Ewins + */ + +/* Related to bug 9530 + * + * cairo_glyph_t can contain any unsigned long in its 'index', the intention + * being that it is large enough to hold a pointer. However, this means that + * it can specify many glyph indexes which don't exist in the font, and may + * exceed the range of legal glyph indexes for the font backend. It may + * also contain special values that are not usable as indexes - e.g. 0xffff is + * kATSDeletedGlyphcode in ATSUI, a glyph that should not be drawn. + * The font backends should handle all legal and out-of-range values + * consistently. + * + * This test expects that operations on out-of-range and missing glyphs should + * act as if they were zero-width. + */ + +#include "cairo-test.h" + +#define WIDTH 100 +#define HEIGHT 75 +#define NUM_TEXT 20 +#define TEXT_SIZE 12 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + int i; + /* Glyphs with no paths followed by 'cairo', the additional + * text is to make the space obvious. + */ + long int index[] = { + 0, /* 'no matching glyph' */ + 0xffff, /* kATSDeletedGlyphCode */ + 0x1ffff, /* out of range */ + -1L, /* out of range */ + 70, 68, 76, 85, 82 /* 'cairo' */ + }; + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, 16); + + for (i = 0; i < 9; i++) { + /* since we're just drawing glyphs directly we need to position them. */ + cairo_glyph_t glyph = { + index[i], 10 * i, 25 + }; + + /* test cairo_glyph_extents. Every glyph index should + * have extents, invalid glyphs should be zero-width. + */ + cairo_move_to (cr, glyph.x, glyph.y); + cairo_set_line_width (cr, 1.0); + cairo_glyph_extents (cr, &glyph, 1, &extents); + cairo_rectangle (cr, + glyph.x + extents.x_bearing - 0.5, + glyph.y + extents.y_bearing - 0.5, + extents.width + 1, + extents.height + 1); + cairo_set_source_rgb (cr, 1, 0, 0); /* red */ + cairo_stroke (cr); + + /* test cairo_show_glyphs. Every glyph index should be + * drawable, invalid glyph indexes should draw nothing. + */ + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_show_glyphs (cr, &glyph, 1); + cairo_move_to (cr, glyph.x, glyph.y); + + /* test cairo_glyph_path. Every glyph index should produce + * a path, invalid glyph indexes should have empty paths. + */ + /* Change the glyph position + * so that the paths are visible. + */ + glyph.y = 55; + cairo_move_to (cr, glyph.x, glyph.y); + cairo_glyph_path (cr, &glyph, 1); + cairo_fill (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (text_glyph_range, + "Tests show_glyphs, glyph_path, glyph_extents with out of range glyph ids." + "\nft and atsui font backends fail, misreporting errors from FT_Load_Glyph and ATSUGlyphGetCubicPaths", + "text, stress", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/text-pattern.c b/test/text-pattern.c new file mode 100644 index 000000000..60267d658 --- /dev/null +++ b/test/text-pattern.c @@ -0,0 +1,73 @@ +/* + * Copyright © 2005 Tim Rowley + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Tim Rowley + */ + +#include "cairo-test.h" + +#define IMAGE_WIDTH 128 +#define IMAGE_HEIGHT 64 + + +static void +draw_text_pattern (cairo_t *cr, double alpha) +{ + cairo_pattern_t *pat; + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + pat = cairo_pattern_create_linear (0.0, 0.0, 1, 1); + cairo_pattern_add_color_stop_rgba (pat, 1, 1, 0, 0, alpha); + cairo_pattern_add_color_stop_rgba (pat, 0, 0, 0, 1, alpha); + cairo_set_source (cr, pat); + + /* test rectangle - make sure the gradient is set correctly */ + cairo_rectangle (cr, 0, 0, 0.1, 1); + cairo_fill (cr); + + cairo_set_font_size (cr, 0.4); + cairo_move_to (cr, 0.1, 0.6); + cairo_show_text (cr, "cairo"); + + cairo_pattern_destroy (pat); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_scale (cr, width/2, height); + draw_text_pattern (cr, 1.0); + cairo_translate (cr, 1, 0); + draw_text_pattern (cr, 0.5); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (text_pattern, + "Patterned Text", + "text, pattern", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/text-rotate.c b/test/text-rotate.c new file mode 100644 index 000000000..0a805ac67 --- /dev/null +++ b/test/text-rotate.c @@ -0,0 +1,189 @@ +/* + * Copyright © 2004 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2004-11-03 Steve Chaplin + * + * Reported bug on mailing list: + * + * From: Steve Chaplin + * To: cairo@cairographics.org + * Date: Thu, 04 Nov 2004 00:00:17 +0800 + * Subject: [cairo] Rotated text bug on drawable target + * + * The attached file draws text rotated 90 degrees first to a PNG file and + * then to a drawable. The PNG file looks fine, the text on the drawable is + * unreadable. + * + * Steve + * + * 2004-11-03 Carl Worth + * + * Looks like the major problems with this bug appeared in the great + * font rework between 0.1.23 and 0.2.0. And it looks like we need + * to fix the regression test suite to test the xlib target (since + * the bug does not show up in the png backend). + * + * Hmm... Actually, things don't look perfect even in the PNG + * output. Look at how that 'o' moves around. It's particularly off + * in the case where it's rotated by PI. + * + * And I'm still not sure about what to do for test cases with + * text--a new version of freetype will change everything. We may + * need to add a simple backend for stroked fonts and add a simple + * builtin font to cairo for pixel-perfect tests with text. + * + * 2005-08-23 + * + * It appears that the worst placement and glyph selection problems + * have now been resolved. In the past some letters were noticeably + * of a different size at some rotations, and there was a lot of + * drift away from the baseline. These problems do not appear + * anymore. + * + * Another thing that helps is that we now have font options which + * we can use to disable hinting in order to get more repeatable + * results. I'm doing that in this test now. + * + * There are still some subtle positioning problems which I'm + * assuming are due to the lack of finer-than-whole-pixel glyph + * positioning. I'm generating a reference image now by replacing + * cairo_show_text with cairo_text_path; cairo_fill. This will let + * us look more closely at the remaining positioning problems. (In + * particular, I want to make sure we're rounding as well as + * possible). + * + * 2007-02-21 + * + * Seems like all the "bugs" have been fixed and all remaining is + * missing support for subpixel glyph positioning. Removing from + * XFAIL now. + */ + +#include "cairo-test.h" + +#define WIDTH 150 +#define HEIGHT 150 +#define NUM_TEXT 20 +#define TEXT_SIZE 12 + +/* Draw the word cairo at NUM_TEXT different angles. + * We separate the circle into quadrants to reduce + * numerical errors i.e. so each quarter is pixel-aligned. + */ +static void +draw_quadrant (cairo_t *cr, + const char *text, + const cairo_text_extents_t *extents, + const cairo_matrix_t *transform, + int x_off, int y_off) +{ + int i; + + for (i = 0; i < NUM_TEXT/4; i++) { + cairo_save (cr); + cairo_rotate (cr, 2*M_PI*i/NUM_TEXT); + cairo_transform (cr, transform); + cairo_set_line_width (cr, 1.0); + cairo_rectangle (cr, x_off - 0.5, y_off - 0.5, extents->width + 1, extents->height + 1); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + cairo_move_to (cr, x_off - extents->x_bearing, y_off - extents->y_bearing); + cairo_set_source_rgb (cr, 0, 0, 0); +#if CAIRO_TEST_GENERATE_REFERENCE_IMAGE + cairo_text_path (cr, text); + cairo_fill (cr); +#else + cairo_show_text (cr, text); +#endif + cairo_restore (cr); + } +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + cairo_font_options_t *font_options; + const char text[] = "cairo"; + int x_off, y_off; + cairo_matrix_t m; + + /* paint white so we don't need separate ref images for + * RGB24 and ARGB32 */ + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, TEXT_SIZE); + + font_options = cairo_font_options_create (); + + cairo_get_font_options (cr, font_options); + cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF); + + cairo_set_font_options (cr, font_options); + cairo_font_options_destroy (font_options); + + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate (cr, WIDTH/2.0, HEIGHT/2.0); + + cairo_text_extents (cr, text, &extents); + + if (NUM_TEXT == 1) { + x_off = y_off = 0; + } else { + y_off = - floor (0.5 + extents.height / 2.0); + x_off = floor (0.5 + (extents.height+1) / (2 * tan (M_PI/NUM_TEXT))); + } + + cairo_save (cr); + cairo_matrix_init_identity (&m); + draw_quadrant (cr, text, &extents, &m, x_off, y_off); + cairo_matrix_init (&m, 0, 1, -1, 0, 0, 0); + draw_quadrant (cr, text, &extents, &m, x_off, y_off); + cairo_restore (cr); + + cairo_save (cr); + cairo_scale (cr, -1, -1); + cairo_matrix_init_identity (&m); + draw_quadrant (cr, text, &extents, &m, x_off, y_off); + cairo_matrix_init (&m, 0, 1, -1, 0, 0, 0); + draw_quadrant (cr, text, &extents, &m, x_off, y_off); + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (text_rotate, + "Tests show_text under various rotations", + "text, transform", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/text-transform.c b/test/text-transform.c new file mode 100644 index 000000000..2cd7f100b --- /dev/null +++ b/test/text-transform.c @@ -0,0 +1,104 @@ +/* + * Copyright © 2006 Mozilla Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Mozilla Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Mozilla Corporation makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * MOZILLA CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL MOZILLA CORPORATION BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Vladimir Vukicevic + */ + +#include "cairo-test.h" + +#define SIZE 100 +#define PAD 5 + +#define FONT_SIZE 32.0 + +static const char *png_filename = "romedalen.png"; + +static void +draw_text (cairo_t *cr) +{ + cairo_matrix_t tm; + + /* skew */ + cairo_matrix_init (&tm, 1, 0, + -0.25, 1, + 0, 0); + cairo_matrix_scale (&tm, FONT_SIZE, FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, 50, SIZE-PAD); + cairo_show_text (cr, "A"); + + /* rotate and scale */ + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, FONT_SIZE, FONT_SIZE * 2.0); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, PAD, PAD + 25); + cairo_show_text (cr, "A"); + + cairo_matrix_init_rotate (&tm, M_PI / 2); + cairo_matrix_scale (&tm, FONT_SIZE * 2.0, FONT_SIZE); + cairo_set_font_matrix (cr, &tm); + + cairo_new_path (cr); + cairo_move_to (cr, PAD, PAD + 50); + cairo_show_text (cr, "A"); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_pattern_t *pattern; + + cairo_set_source_rgb (cr, 1., 1., 1.); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0., 0., 0.); + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + draw_text (cr); + + cairo_translate (cr, SIZE, SIZE); + cairo_rotate (cr, M_PI); + + pattern = cairo_test_create_pattern_from_png (ctx, png_filename); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + draw_text (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (text_transform, + "Test various applications of the font matrix", + "text, transform", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/text-zero-len.c b/test/text-zero-len.c new file mode 100644 index 000000000..5e89816c8 --- /dev/null +++ b/test/text-zero-len.c @@ -0,0 +1,203 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +/* Related bug 5177 + * + * In short: + * + * _cairo_atsui_font_text_to_glyph with a zero-sized string crashes. + * + * Moreover, the fallback path in cairo_scaled_font_text_to_glyphs() + * when handling a zero-sized string, allocates a zero-sized glyph array + * and when NULL is returned by malloc, recognizes that as an out-of-memory + * error. The glibc implementation of malloc() does not return NULL from + * malloc(0), but I don't think it's a safe assumption. + * + * By just bailing out on zero-sized text, we fix both issues. + */ + +#include "cairo-test.h" + +#define NUM_TEXT 20 +#define TEXT_SIZE 12 + +static cairo_bool_t +text_extents_equal (const cairo_text_extents_t *A, + const cairo_text_extents_t *B) +{ + return A->x_bearing == B->x_bearing && + A->y_bearing == B->y_bearing && + A->width == B->width && + A->height == B->height && + A->x_advance == B->x_advance && + A->y_advance == B->y_advance; +} + +static cairo_bool_t +font_extents_equal (const cairo_font_extents_t *A, + const cairo_font_extents_t *B) +{ + return A->ascent == B->ascent && + A->descent == B->descent && + A->height == B->height && + A->max_x_advance == B->max_x_advance && + A->max_y_advance == B->max_y_advance; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_text_extents_t extents, nil_extents; + cairo_font_extents_t font_extents, nil_font_extents; + cairo_scaled_font_t *scaled_font; + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, 16); + + cairo_move_to (cr, 10, 25); + cairo_show_text (cr, NULL); + cairo_show_text (cr, ""); + cairo_show_glyphs (cr, NULL, 0); + cairo_show_glyphs (cr, (void*)8, 0); + + cairo_move_to (cr, 10, 55); + cairo_text_path (cr, NULL); + cairo_text_path (cr, ""); + cairo_glyph_path (cr, (void*)8, 0); + cairo_fill (cr); + + memset (&nil_extents, 0, sizeof (cairo_text_extents_t)); + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_text_extents (cr, "", &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_text_extents(\"\"); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_text_extents (cr, NULL, &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_text_extents(NULL); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_glyph_extents (cr, (void*)8, 0, &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_glyph_extents(); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + scaled_font = cairo_get_scaled_font (cr); + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_scaled_font_text_extents (scaled_font, "", &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_scaled_font_text_extents(\"\"); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_scaled_font_text_extents (scaled_font, NULL, &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_scaled_font_text_extents(NULL); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_scaled_font_glyph_extents (scaled_font, (void*)8, 0, &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_scaled_font_glyph_extents(NULL); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + /* Lets also try font size 0 while here */ + cairo_set_font_size (cr, 0); + + memset (&extents, 0xff, sizeof (cairo_text_extents_t)); + cairo_text_extents (cr, "test", &extents); + if (! text_extents_equal (&extents, &nil_extents)) { + cairo_test_log (ctx, "Error: cairo_set_font_size(0); cairo_text_extents(\"test\"); extents (%g, %g, %g, %g, %g, %g)\n", + extents.x_bearing, extents.y_bearing, + extents.width, extents.height, + extents.x_advance, extents.y_advance); + return CAIRO_TEST_FAILURE; + } + + memset (&nil_font_extents, 0, sizeof (cairo_font_extents_t)); + + memset (&font_extents, 0xff, sizeof (cairo_font_extents_t)); + cairo_font_extents (cr, &font_extents); + if (! font_extents_equal (&font_extents, &nil_font_extents)) { + cairo_test_log (ctx, "Error: cairo_set_font_size(0); cairo_font_extents(); extents (%g, %g, %g, %g, %g)\n", + font_extents.ascent, font_extents.descent, + font_extents.height, + font_extents.max_x_advance, font_extents.max_y_advance); + return CAIRO_TEST_FAILURE; + } + + scaled_font = cairo_get_scaled_font (cr); + + memset (&font_extents, 0xff, sizeof (cairo_font_extents_t)); + cairo_scaled_font_extents (scaled_font, &font_extents); + if (! font_extents_equal (&font_extents, &nil_font_extents)) { + cairo_test_log (ctx, "Error: cairo_set_font_size(0); cairo_scaled_font_extents(); extents (%g, %g, %g, %g, %g)\n", + font_extents.ascent, font_extents.descent, + font_extents.height, + font_extents.max_x_advance, font_extents.max_y_advance); + return CAIRO_TEST_FAILURE; + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (text_zero_len, + "Tests show_text and text_path with a zero-sized string", + "text, stress, extents", /* keywords */ + NULL, /* requirements */ + 0, 0, + NULL, draw) diff --git a/test/tiger.c b/test/tiger.c new file mode 100644 index 000000000..059bb849f --- /dev/null +++ b/test/tiger.c @@ -0,0 +1,85 @@ +/* + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "cairo-test.h" + +#include "tiger.inc" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + unsigned int i; + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 0.1, 0.2, 0.3, 1.0); + cairo_paint (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_OVER); + + cairo_translate (cr, width/2, height/2); + cairo_scale (cr, .85, .85); + + for (i = 0; i < ARRAY_LENGTH(tiger_commands); i++) { + const struct command *cmd = &tiger_commands[i]; + switch (cmd->type) { + case 'm': + cairo_move_to (cr, cmd->x0, cmd->y0); + break; + case 'l': + cairo_line_to (cr, cmd->x0, cmd->y0); + break; + case 'c': + cairo_curve_to (cr, + cmd->x0, cmd->y0, + cmd->x1, cmd->y1, + cmd->x2, cmd->y2); + break; + case 'f': + cairo_set_source_rgba (cr, + cmd->x0, cmd->y0, cmd->x1, cmd->y1); + cairo_fill (cr); + break; + } + } + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +a1_draw (cairo_t *cr, int width, int height) +{ + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + return draw (cr, width, height); +} + +CAIRO_TEST (tiger, + "Check the fidelity of the rasterisation.", + "raster", /* keywords */ + NULL, /* requirements */ + 500, 500, + NULL, draw) + +CAIRO_TEST (a1_tiger, + "Check the fidelity of the rasterisation.", + "fill", /* keywords */ + "target=raster", /* requirements */ + 500, 500, + NULL, a1_draw) diff --git a/test/tiger.inc b/test/tiger.inc new file mode 100644 index 000000000..419b97989 --- /dev/null +++ b/test/tiger.inc @@ -0,0 +1,2316 @@ +static const struct command { + char type; + float x0, y0; + float x1, y1; + float x2, y2; +} tiger_commands[] = { +{'m', -122.30, 84.28, 0, 0, 0, 0}, +{'c', -122.30, 84.28, -122.20 ,86.18, -123.03, 86.16}, +{'c', -123.85, 86.14, -140.31 ,38.07, -160.83, 40.31}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -118.77, 81.26, 0, 0, 0, 0}, +{'c', -118.77, 81.26, -119.32 ,83.08, -120.09, 82.78}, +{'c', -120.86, 82.48, -119.98 ,31.68, -140.04, 26.80}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -91.28, 123.59, 0, 0, 0, 0}, +{'c', -91.28, 123.59, -89.65 ,124.55, -90.12, 125.23}, +{'c', -90.59, 125.90, -139.76 ,113.10, -149.22, 131.46}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -94.09, 133.80, 0, 0, 0, 0}, +{'c', -94.09, 133.80, -92.24 ,134.20, -92.47, 134.99}, +{'c', -92.70, 135.78, -143.41 ,139.12, -146.60, 159.52}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -98.30, 128.28, 0, 0, 0, 0}, +{'c', -98.30, 128.28, -96.53 ,128.94, -96.87, 129.69}, +{'c', -97.22, 130.44, -147.87 ,126.35, -154.00, 146.06}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -109.01, 110.07, 0, 0, 0, 0}, +{'c', -109.01, 110.07, -107.70 ,111.45, -108.34, 111.97}, +{'c', -108.98, 112.49, -152.72 ,86.63, -166.87, 101.68}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -116.55, 114.26, 0, 0, 0, 0}, +{'c', -116.55, 114.26, -115.10 ,115.48, -115.67, 116.07}, +{'c', -116.25, 116.66, -162.64 ,95.92, -174.99, 112.47}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -119.15, 118.33, 0, 0, 0, 0}, +{'c', -119.15, 118.33, -117.55 ,119.34, -118.04, 120.01}, +{'c', -118.53, 120.67, -167.31 ,106.45, -177.29, 124.52}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -108.42, 118.95, 0, 0, 0, 0}, +{'c', -108.42, 118.95, -107.30 ,120.48, -108.00, 120.92}, +{'c', -108.70, 121.35, -148.77 ,90.10, -164.73, 103.21}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -128.20, 90.00, 0, 0, 0, 0}, +{'c', -128.20, 90.00, -127.60 ,91.80, -128.40, 92.00}, +{'c', -129.20, 92.20, -157.80 ,50.20, -177.00, 57.80}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -127.50, 96.98, 0, 0, 0, 0}, +{'c', -127.50, 96.98, -126.53 ,98.61, -127.27, 98.97}, +{'c', -128.01, 99.34, -164.99 ,64.50, -182.10, 76.06}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -127.62, 101.35, 0, 0, 0, 0}, +{'c', -127.62, 101.35, -126.50 ,102.88, -127.20, 103.31}, +{'c', -127.90, 103.75, -167.97 ,72.50, -183.93, 85.61}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -129.83, 103.06, 0, 0, 0, 0}, +{'c', -129.33, 109.11, -128.34 ,115.68, -126.60, 118.80}, +{'c', -126.60, 118.80, -130.20 ,131.20, -121.40, 144.40}, +{'c', -121.40, 144.40, -121.80 ,151.60, -120.20, 154.80}, +{'c', -120.20, 154.80, -116.20 ,163.20, -111.40, 164.00}, +{'c', -107.52, 164.65, -98.79 ,167.72, -88.93, 169.12}, +{'c', -88.93, 169.12, -71.80 ,183.20, -75.00, 196.00}, +{'c', -75.00, 196.00, -75.40 ,212.40, -79.00, 214.00}, +{'c', -79.00, 214.00, -67.40 ,202.80, -77.00, 219.60}, +{'l', -81.40, 238.40, 0, 0, 0, 0}, +{'c', -81.40, 238.40, -55.80 ,216.80, -71.40, 235.20}, +{'l', -81.40, 261.20, 0, 0, 0, 0}, +{'c', -81.40, 261.20, -61.80 ,242.80, -69.00, 251.20}, +{'l', -72.20, 260.00, 0, 0, 0, 0}, +{'c', -72.20, 260.00, -29.00 ,232.80, -59.80, 262.40}, +{'c', -59.80, 262.40, -51.80 ,258.80, -47.40, 261.60}, +{'c', -47.40, 261.60, -40.60 ,260.40, -41.40, 262.00}, +{'c', -41.40, 262.00, -62.20 ,272.40, -65.80, 290.80}, +{'c', -65.80, 290.80, -57.40 ,280.80, -60.60, 291.60}, +{'l', -60.20, 303.20, 0, 0, 0, 0}, +{'c', -60.20, 303.20, -56.20 ,281.60, -56.60, 319.20}, +{'c', -56.60, 319.20, -37.40 ,301.20, -49.00, 322.00}, +{'l', -49.00, 338.80, 0, 0, 0, 0}, +{'c', -49.00, 338.80, -33.80 ,322.40, -40.20, 335.20}, +{'c', -40.20, 335.20, -30.20 ,326.40, -34.20, 341.60}, +{'c', -34.20, 341.60, -35.00 ,352.00, -30.60, 340.80}, +{'c', -30.60, 340.80, -14.60 ,310.20, -20.60, 336.40}, +{'c', -20.60, 336.40, -21.40 ,355.60, -16.60, 340.80}, +{'c', -16.60, 340.80, -16.20 ,351.20, -7.00, 358.40}, +{'c', -7.00, 358.40, -8.20 ,307.60, 4.60, 343.60}, +{'l', 8.60, 360.00, 0, 0, 0, 0}, +{'c', 8.60, 360.00, 11.40 ,350.80, 11.00, 345.60}, +{'c', 11.00, 345.60, 25.80 ,329.20, 19.00, 353.60}, +{'c', 19.00, 353.60, 34.20 ,330.80, 31.00, 344.00}, +{'c', 31.00, 344.00, 23.40 ,360.00, 25.00, 364.80}, +{'c', 25.00, 364.80, 41.80 ,330.00, 43.00, 328.40}, +{'c', 43.00, 328.40, 41.00 ,370.80, 51.80, 334.80}, +{'c', 51.80, 334.80, 57.40 ,346.80, 54.60, 351.20}, +{'c', 54.60, 351.20, 62.60 ,343.20, 61.80, 340.00}, +{'c', 61.80, 340.00, 66.40 ,331.80, 69.20, 345.40}, +{'c', 69.20, 345.40, 71.00 ,354.80, 72.60, 351.60}, +{'c', 72.60, 351.60, 76.60 ,375.60, 77.80, 352.80}, +{'c', 77.80, 352.80, 79.40 ,339.20, 72.20, 327.60}, +{'c', 72.20, 327.60, 73.00 ,324.40, 70.20, 320.40}, +{'c', 70.20, 320.40, 83.80 ,342.00, 76.60, 313.20}, +{'c', 76.60, 313.20, 87.80 ,321.20, 89.00, 321.20}, +{'c', 89.00, 321.20, 75.40 ,298.00, 84.20, 302.80}, +{'c', 84.20, 302.80, 79.00 ,292.40, 97.00, 304.40}, +{'c', 97.00, 304.40, 81.00 ,288.40, 98.60, 298.00}, +{'c', 98.60, 298.00, 106.60 ,304.40, 99.00, 294.40}, +{'c', 99.00, 294.40, 84.60 ,278.40, 106.60, 296.40}, +{'c', 106.60, 296.40, 118.20 ,312.80, 119.00, 315.60}, +{'c', 119.00, 315.60, 109.00 ,286.40, 104.60, 283.60}, +{'c', 104.60, 283.60, 113.00 ,247.20, 154.20, 262.80}, +{'c', 154.20, 262.80, 161.00 ,280.00, 165.40, 261.60}, +{'c', 165.40, 261.60, 178.20 ,255.20, 189.40, 282.80}, +{'c', 189.40, 282.80, 193.40 ,269.20, 192.60, 266.40}, +{'c', 192.60, 266.40, 199.40 ,267.60, 198.60, 266.40}, +{'c', 198.60, 266.40, 211.80 ,270.80, 213.00, 270.00}, +{'c', 213.00, 270.00, 219.80 ,276.80, 220.20, 273.20}, +{'c', 220.20, 273.20, 229.40 ,276.00, 227.40, 272.40}, +{'c', 227.40, 272.40, 236.20 ,288.00, 236.60, 291.60}, +{'l', 239.00, 277.60, 0, 0, 0, 0}, +{'l', 241.00, 280.40, 0, 0, 0, 0}, +{'c', 241.00, 280.40, 242.60 ,272.80, 241.80, 271.60}, +{'c', 241.00, 270.40, 261.80 ,278.40, 266.60, 299.20}, +{'l', 268.60, 307.60, 0, 0, 0, 0}, +{'c', 268.60, 307.60, 274.60 ,292.80, 273.00, 288.80}, +{'c', 273.00, 288.80, 278.20 ,289.60, 278.60, 294.00}, +{'c', 278.60, 294.00, 282.60 ,270.80, 277.80, 264.80}, +{'c', 277.80, 264.80, 282.20 ,264.00, 283.40, 267.60}, +{'l', 283.40, 260.40, 0, 0, 0, 0}, +{'c', 283.40, 260.40, 290.60 ,261.20, 290.60, 258.80}, +{'c', 290.60, 258.80, 295.00 ,254.80, 297.00, 259.60}, +{'c', 297.00, 259.60, 284.60 ,224.40, 303.00, 243.60}, +{'c', 303.00, 243.60, 310.20 ,254.40, 306.60, 235.60}, +{'c', 303.00, 216.80, 299.00 ,215.20, 303.80, 214.80}, +{'c', 303.80, 214.80, 304.60 ,211.20, 302.60, 209.60}, +{'c', 300.60, 208.00, 303.80 ,209.60, 303.80, 209.60}, +{'c', 303.80, 209.60, 308.60 ,213.60, 303.40, 191.60}, +{'c', 303.40, 191.60, 309.80 ,193.20, 297.80, 164.00}, +{'c', 297.80, 164.00, 300.60 ,161.60, 296.60, 153.20}, +{'c', 296.60, 153.20, 304.60 ,157.60, 307.40, 156.00}, +{'c', 307.40, 156.00, 307.00 ,154.40, 303.80, 150.40}, +{'c', 303.80, 150.40, 282.20 ,95.60, 302.60, 117.60}, +{'c', 302.60, 117.60, 314.45 ,131.15, 308.05, 108.35}, +{'c', 308.05, 108.35, 298.94 ,84.34, 299.72, 80.05}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 299.72, 80.25, 0, 0, 0, 0}, +{'c', 300.35, 80.43, 302.55 ,81.55, 303.80, 83.20}, +{'c', 303.80, 83.20, 310.60 ,94.00, 305.40, 75.60}, +{'c', 305.40, 75.60, 296.20 ,46.80, 305.00, 58.00}, +{'c', 305.00, 58.00, 311.00 ,65.20, 307.80, 51.60}, +{'c', 303.94, 35.17, 301.40 ,28.80, 301.40, 28.80}, +{'c', 301.40, 28.80, 313.00 ,33.60, 286.20, -6.00}, +{'l', 295.00, -2.40, 0, 0, 0, 0}, +{'c', 295.00, -2.40, 275.40 ,-42.00, 253.80, -47.20}, +{'l', 245.80, -53.20, 0, 0, 0, 0}, +{'c', 245.80, -53.20, 284.20 ,-91.20, 271.40, -128.00}, +{'c', 271.40, -128.00, 264.60 ,-133.20, 255.00, -124.00}, +{'c', 255.00, -124.00, 248.60 ,-119.20, 242.60, -120.80}, +{'c', 242.60, -120.80, 211.80 ,-119.60, 209.80, -119.60}, +{'c', 207.80, -119.60, 173.00 ,-156.80, 107.40, -139.20}, +{'c', 107.40, -139.20, 102.20 ,-137.20, 97.80, -138.40}, +{'c', 97.80, -138.40, 79.40 ,-154.40, 30.60, -131.60}, +{'c', 30.60, -131.60, 20.60 ,-129.60, 19.00, -129.60}, +{'c', 17.40, -129.60, 14.60 ,-129.60, 6.60, -123.20}, +{'c', -1.40, -116.80, -1.80 ,-116.00, -3.80, -114.40}, +{'c', -3.80, -114.40, -20.20 ,-103.20, -25.00, -102.40}, +{'c', -25.00, -102.40, -36.60 ,-96.00, -41.00, -86.00}, +{'l', -44.60, -84.80, 0, 0, 0, 0}, +{'c', -44.60, -84.80, -46.20 ,-77.60, -46.60, -76.40}, +{'c', -46.60, -76.40, -51.40 ,-72.80, -52.20, -67.20}, +{'c', -52.20, -67.20, -61.00 ,-61.20, -60.60, -56.80}, +{'c', -60.60, -56.80, -62.20 ,-51.60, -63.00, -46.80}, +{'c', -63.00, -46.80, -70.20 ,-42.00, -69.40, -39.20}, +{'c', -69.40, -39.20, -77.00 ,-25.20, -75.80, -18.40}, +{'c', -75.80, -18.40, -82.20 ,-18.80, -85.00, -16.40}, +{'c', -85.00, -16.40, -85.80 ,-11.60, -87.40, -11.20}, +{'c', -87.40, -11.20, -90.20 ,-10.00, -87.80, -6.00}, +{'c', -87.80, -6.00, -89.40 ,-3.20, -89.80, -1.60}, +{'c', -89.80, -1.60, -89.00 ,1.20, -93.40, 6.80}, +{'c', -93.40, 6.80, -99.80 ,25.60, -97.80, 30.80}, +{'c', -97.80, 30.80, -97.40 ,35.60, -100.20, 37.20}, +{'c', -100.20, 37.20, -103.80 ,36.80, -95.40, 48.80}, +{'c', -95.40, 48.80, -94.60 ,50.00, -97.80, 52.40}, +{'c', -97.80, 52.40, -115.00 ,56.00, -117.40, 72.40}, +{'c', -117.40, 72.40, -131.00 ,87.20, -131.00, 92.40}, +{'c', -131.00, 94.70, -130.73 ,97.85, -130.03, 102.47}, +{'c', -130.03, 102.47, -130.60 ,110.80, -103.00, 111.60}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', -115.60, 102.60, 0, 0, 0, 0}, +{'c', -140.60, 63.20, -126.20 ,119.60, -126.20, 119.60}, +{'c', -117.40, 154.00, 12.20 ,116.40, 12.20, 116.40}, +{'c', 12.20, 116.40, 181.00 ,86.00, 192.20, 82.00}, +{'c', 203.40, 78.00, 298.60 ,84.40, 298.60, 84.40}, +{'l', 293.00, 67.60, 0, 0, 0, 0}, +{'c', 228.20, 21.20, 209.00 ,44.40, 195.40, 40.40}, +{'c', 181.80, 36.40, 184.20 ,46.00, 181.00, 46.80}, +{'c', 177.80, 47.60, 138.60 ,22.80, 132.20, 23.60}, +{'c', 125.80, 24.40, 100.46 ,0.65, 115.40, 32.40}, +{'c', 131.40, 66.40, 57.00 ,71.60, 40.20, 60.40}, +{'c', 23.40, 49.20, 47.40 ,78.80, 47.40, 78.80}, +{'c', 65.80, 98.80, 31.40 ,82.00, 31.40, 82.00}, +{'c', -3.00, 69.20, -27.00 ,94.80, -30.20, 95.60}, +{'c', -33.40, 96.40, -38.20 ,99.60, -39.00, 93.20}, +{'c', -39.80, 86.80, -47.31 ,70.10, -79.00, 96.40}, +{'c', -99.00, 113.00, -112.80 ,91.00, -112.80, 91.00}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 133.51, 25.35, 0, 0, 0, 0}, +{'c', 127.11, 26.15, 101.74 ,2.41, 116.71, 34.15}, +{'c', 133.31, 69.35, 58.31 ,73.35, 41.51, 62.15}, +{'c', 24.71, 50.95, 48.71 ,80.55, 48.71, 80.55}, +{'c', 67.11, 100.55, 32.71 ,83.75, 32.71, 83.75}, +{'c', -1.69, 70.95, -25.69 ,96.55, -28.89, 97.35}, +{'c', -32.09, 98.15, -36.89 ,101.35, -37.69, 94.95}, +{'c', -38.49, 88.55, -45.87 ,72.01, -77.69, 98.15}, +{'c', -98.93, 115.49, -112.42 ,94.04, -112.42, 94.04}, +{'l', -115.62, 104.15, 0, 0, 0, 0}, +{'c', -140.62, 64.35, -125.55 ,122.66, -125.55, 122.66}, +{'c', -116.75, 157.06, 13.51 ,118.15, 13.51, 118.15}, +{'c', 13.51, 118.15, 182.31 ,87.75, 193.51, 83.75}, +{'c', 204.71, 79.75, 299.04 ,86.07, 299.04, 86.07}, +{'l', 293.51, 68.76, 0, 0, 0, 0}, +{'c', 228.71, 22.36, 210.31 ,46.15, 196.71, 42.15}, +{'c', 183.11, 38.15, 185.51 ,47.75, 182.31, 48.55}, +{'f', 0.938000,0.469000,0.201000,1.000000,0,0 }, +{'m', 134.82, 27.09, 0, 0, 0, 0}, +{'c', 128.42, 27.89, 103.69 ,3.86, 118.02, 35.89}, +{'c', 134.22, 72.09, 59.62 ,75.09, 42.82, 63.89}, +{'c', 26.02, 52.69, 50.02 ,82.29, 50.02, 82.29}, +{'c', 68.42, 102.29, 34.02 ,85.49, 34.02, 85.49}, +{'c', -0.38, 72.69, -24.38 ,98.29, -27.58, 99.09}, +{'c', -30.78, 99.89, -35.58 ,103.09, -36.38, 96.69}, +{'c', -37.18, 90.29, -44.43 ,73.92, -76.38, 99.89}, +{'c', -98.86, 117.98, -112.04 ,97.07, -112.04, 97.07}, +{'l', -115.64, 105.69, 0, 0, 0, 0}, +{'c', -139.44, 66.69, -124.89 ,125.71, -124.89, 125.71}, +{'c', -116.09, 160.11, 14.82 ,119.89, 14.82, 119.89}, +{'c', 14.82, 119.89, 183.62 ,89.49, 194.82, 85.49}, +{'c', 206.02, 81.49, 299.47 ,87.75, 299.47, 87.75}, +{'l', 294.02, 69.93, 0, 0, 0, 0}, +{'c', 229.22, 23.53, 211.62 ,47.89, 198.02, 43.89}, +{'c', 184.42, 39.89, 186.82 ,49.49, 183.62, 50.29}, +{'f', 0.938000,0.536000,0.268000,1.000000,0,0 }, +{'m', 136.13, 28.84, 0, 0, 0, 0}, +{'c', 129.73, 29.64, 105.00 ,5.61, 119.33, 37.64}, +{'c', 136.13, 75.19, 60.39 ,76.48, 44.13, 65.64}, +{'c', 27.33, 54.44, 51.33 ,84.04, 51.33, 84.04}, +{'c', 69.73, 104.04, 35.33 ,87.24, 35.33, 87.24}, +{'c', 0.93, 74.44, -23.07 ,100.04, -26.27, 100.84}, +{'c', -29.47, 101.64, -34.27 ,104.84, -35.07, 98.44}, +{'c', -35.87, 92.04, -42.99 ,75.84, -75.07, 101.64}, +{'c', -98.78, 120.47, -111.66 ,100.11, -111.66, 100.11}, +{'l', -115.66, 107.24, 0, 0, 0, 0}, +{'c', -137.46, 70.44, -124.24 ,128.76, -124.24, 128.76}, +{'c', -115.44, 163.16, 16.13 ,121.64, 16.13, 121.64}, +{'c', 16.13, 121.64, 184.93 ,91.24, 196.13, 87.24}, +{'c', 207.33, 83.24, 299.91 ,89.42, 299.91, 89.42}, +{'l', 294.53, 71.09, 0, 0, 0, 0}, +{'c', 229.73, 24.69, 212.93 ,49.64, 199.33, 45.64}, +{'c', 185.73, 41.64, 188.13 ,51.24, 184.93, 52.04}, +{'f', 0.938000,0.603000,0.402000,1.000000,0,0 }, +{'m', 137.44, 30.58, 0, 0, 0, 0}, +{'c', 131.04, 31.38, 106.81 ,7.13, 120.64, 39.38}, +{'c', 137.44, 78.58, 62.24 ,78.58, 45.44, 67.38}, +{'c', 28.64, 56.18, 52.64 ,85.78, 52.64, 85.78}, +{'c', 71.04, 105.78, 36.64 ,88.98, 36.64, 88.98}, +{'c', 2.24, 76.18, -21.76 ,101.78, -24.96, 102.58}, +{'c', -28.16, 103.38, -32.96 ,106.58, -33.76, 100.18}, +{'c', -34.56, 93.78, -41.55 ,77.75, -73.76, 103.38}, +{'c', -98.71, 122.97, -111.27 ,103.15, -111.27, 103.15}, +{'l', -115.67, 108.78, 0, 0, 0, 0}, +{'c', -135.47, 73.98, -123.58 ,131.82, -123.58, 131.82}, +{'c', -114.78, 166.22, 17.44 ,123.38, 17.44, 123.38}, +{'c', 17.44, 123.38, 186.24 ,92.98, 197.44, 88.98}, +{'c', 208.64, 84.98, 300.35 ,91.09, 300.35, 91.09}, +{'l', 295.04, 72.25, 0, 0, 0, 0}, +{'c', 230.24, 25.86, 214.24 ,51.38, 200.64, 47.38}, +{'c', 187.04, 43.38, 189.44 ,52.98, 186.24, 53.78}, +{'f', 0.938000,0.670000,0.469000,1.000000,0,0 }, +{'m', 138.75, 32.33, 0, 0, 0, 0}, +{'c', 132.35, 33.13, 106.38 ,9.68, 121.95, 41.13}, +{'c', 141.15, 79.93, 63.55 ,80.33, 46.75, 69.13}, +{'c', 29.95, 57.93, 53.95 ,87.53, 53.95, 87.53}, +{'c', 72.35, 107.53, 37.95 ,90.73, 37.95, 90.73}, +{'c', 3.55, 77.93, -20.45 ,103.53, -23.65, 104.33}, +{'c', -26.85, 105.13, -31.65 ,108.33, -32.45, 101.93}, +{'c', -33.25, 95.53, -40.11 ,79.67, -72.45, 105.13}, +{'c', -98.64, 125.46, -110.89 ,106.18, -110.89, 106.18}, +{'l', -115.69, 110.33, 0, 0, 0, 0}, +{'c', -133.69, 77.13, -122.93 ,134.87, -122.93, 134.87}, +{'c', -114.13, 169.27, 18.75 ,125.13, 18.75, 125.13}, +{'c', 18.75, 125.13, 187.55 ,94.73, 198.75, 90.73}, +{'c', 209.95, 86.73, 300.78 ,92.76, 300.78, 92.76}, +{'l', 295.55, 73.42, 0, 0, 0, 0}, +{'c', 230.75, 27.02, 215.55 ,53.13, 201.95, 49.13}, +{'c', 188.35, 45.13, 190.75 ,54.73, 187.55, 55.53}, +{'f', 1.000000,0.737000,0.536000,1.000000,0,0 }, +{'m', 140.06, 34.07, 0, 0, 0, 0}, +{'c', 133.66, 34.87, 107.31 ,11.61, 123.25, 42.87}, +{'c', 143.66, 82.87, 64.86 ,82.07, 48.05, 70.87}, +{'c', 31.25, 59.67, 55.26 ,89.27, 55.26, 89.27}, +{'c', 73.66, 109.27, 39.26 ,92.47, 39.26, 92.47}, +{'c', 4.86, 79.67, -19.14 ,105.27, -22.34, 106.07}, +{'c', -25.55, 106.87, -30.34 ,110.07, -31.14, 103.67}, +{'c', -31.95, 97.27, -38.67 ,81.58, -71.14, 106.87}, +{'c', -98.56, 127.95, -110.51 ,109.22, -110.51, 109.22}, +{'l', -115.71, 111.87, 0, 0, 0, 0}, +{'c', -131.71, 81.67, -122.27 ,137.93, -122.27, 137.93}, +{'c', -113.47, 172.33, 20.05 ,126.87, 20.05, 126.87}, +{'c', 20.05, 126.87, 188.86 ,96.47, 200.06, 92.47}, +{'c', 211.26, 88.47, 301.22 ,94.44, 301.22, 94.44}, +{'l', 296.06, 74.58, 0, 0, 0, 0}, +{'c', 231.26, 28.18, 216.86 ,54.87, 203.26, 50.87}, +{'c', 189.66, 46.87, 192.06 ,56.47, 188.86, 57.27}, +{'f', 1.000000,0.737000,0.603000,1.000000,0,0 }, +{'m', 141.37, 35.82, 0, 0, 0, 0}, +{'c', 134.97, 36.62, 107.52 ,13.94, 124.56, 44.62}, +{'c', 146.56, 84.22, 66.16 ,83.82, 49.36, 72.62}, +{'c', 32.56, 61.42, 56.56 ,91.02, 56.56, 91.02}, +{'c', 74.96, 111.02, 40.56 ,94.22, 40.56, 94.22}, +{'c', 6.16, 81.42, -17.84 ,107.02, -21.04, 107.82}, +{'c', -24.24, 108.62, -29.04 ,111.82, -29.84, 105.42}, +{'c', -30.64, 99.02, -37.23 ,83.49, -69.84, 108.62}, +{'c', -98.49, 130.44, -110.13 ,112.26, -110.13, 112.26}, +{'l', -115.73, 113.42, 0, 0, 0, 0}, +{'c', -130.13, 85.02, -121.62 ,140.98, -121.62, 140.98}, +{'c', -112.82, 175.38, 21.36 ,128.62, 21.36, 128.62}, +{'c', 21.36, 128.62, 190.16 ,98.22, 201.37, 94.22}, +{'c', 212.56, 90.22, 301.66 ,96.11, 301.66, 96.11}, +{'l', 296.56, 75.75, 0, 0, 0, 0}, +{'c', 231.76, 29.35, 218.16 ,56.62, 204.56, 52.62}, +{'c', 190.97, 48.62, 193.37 ,58.22, 190.16, 59.02}, +{'f', 1.000000,0.804000,0.737000,1.000000,0,0 }, +{'m', 142.67, 37.56, 0, 0, 0, 0}, +{'c', 136.27, 38.37, 108.83 ,15.69, 125.87, 46.37}, +{'c', 147.87, 85.97, 67.47 ,85.56, 50.67, 74.36}, +{'c', 33.87, 63.16, 57.87 ,92.77, 57.87, 92.77}, +{'c', 76.27, 112.77, 41.87 ,95.97, 41.87, 95.97}, +{'c', 7.47, 83.17, -16.53 ,108.77, -19.73, 109.56}, +{'c', -22.93, 110.36, -27.73 ,113.56, -28.53, 107.17}, +{'c', -29.33, 100.77, -35.79 ,85.41, -68.53, 110.36}, +{'c', -98.42, 132.93, -109.75 ,115.29, -109.75, 115.29}, +{'l', -115.75, 114.97, 0, 0, 0, 0}, +{'c', -129.35, 88.56, -120.96 ,144.04, -120.96, 144.04}, +{'c', -112.16, 178.44, 22.67 ,130.37, 22.67, 130.37}, +{'c', 22.67, 130.37, 191.47 ,99.97, 202.67, 95.97}, +{'c', 213.87, 91.97, 302.09 ,97.78, 302.09, 97.78}, +{'l', 297.07, 76.91, 0, 0, 0, 0}, +{'c', 232.27, 30.51, 219.47 ,58.37, 205.87, 54.37}, +{'c', 192.27, 50.37, 194.67 ,59.97, 191.47, 60.77}, +{'f', 1.000000,0.871000,0.804000,1.000000,0,0 }, +{'m', 143.98, 39.31, 0, 0, 0, 0}, +{'c', 137.58, 40.11, 110.53 ,17.22, 127.18, 48.11}, +{'c', 149.18, 88.91, 68.78 ,87.31, 51.98, 76.11}, +{'c', 35.18, 64.91, 59.18 ,94.51, 59.18, 94.51}, +{'c', 77.58, 114.51, 43.18 ,97.71, 43.18, 97.71}, +{'c', 8.78, 84.91, -15.22 ,110.51, -18.42, 111.31}, +{'c', -21.62, 112.11, -26.42 ,115.31, -27.22, 108.91}, +{'c', -28.02, 102.51, -34.35 ,87.32, -67.22, 112.11}, +{'c', -98.34, 135.42, -109.36 ,118.33, -109.36, 118.33}, +{'l', -115.76, 116.51, 0, 0, 0, 0}, +{'c', -128.76, 92.51, -120.31 ,147.09, -120.31, 147.09}, +{'c', -111.51, 181.49, 23.98 ,132.11, 23.98, 132.11}, +{'c', 23.98, 132.11, 192.78 ,101.71, 203.98, 97.71}, +{'c', 215.18, 93.71, 302.53 ,99.46, 302.53, 99.46}, +{'l', 297.58, 78.07, 0, 0, 0, 0}, +{'c', 232.78, 31.67, 220.78 ,60.11, 207.18, 56.11}, +{'c', 193.58, 52.11, 195.98 ,61.71, 192.78, 62.51}, +{'f', 1.000000,0.938000,0.871000,1.000000,0,0 }, +{'m', 145.29, 41.05, 0, 0, 0, 0}, +{'c', 138.89, 41.85, 112.92 ,18.41, 128.49, 49.85}, +{'c', 149.69, 92.66, 70.09 ,89.06, 53.29, 77.86}, +{'c', 36.49, 66.66, 60.49 ,96.26, 60.49, 96.26}, +{'c', 78.89, 116.26, 44.49 ,99.46, 44.49, 99.46}, +{'c', 10.09, 86.66, -13.91 ,112.26, -17.11, 113.06}, +{'c', -20.31, 113.86, -25.11 ,117.06, -25.91, 110.66}, +{'c', -26.71, 104.26, -32.91 ,89.23, -65.91, 113.86}, +{'c', -98.27, 137.91, -108.98 ,121.36, -108.98, 121.36}, +{'l', -115.78, 118.06, 0, 0, 0, 0}, +{'c', -128.58, 94.86, -119.65 ,150.15, -119.65, 150.15}, +{'c', -110.85, 184.55, 25.29 ,133.86, 25.29, 133.86}, +{'c', 25.29, 133.86, 194.09 ,103.46, 205.29, 99.46}, +{'c', 216.49, 95.46, 302.96 ,101.13, 302.96, 101.13}, +{'l', 298.09, 79.24, 0, 0, 0, 0}, +{'c', 233.29, 32.84, 222.09 ,61.86, 208.49, 57.86}, +{'c', 194.89, 53.85, 197.29 ,63.46, 194.09, 64.26}, +{'f', 1.000000,1.000000,0.938000,1.000000,0,0 }, +{'m', -115.80, 119.60, 0, 0, 0, 0}, +{'c', -128.60, 97.60, -119.00 ,153.20, -119.00, 153.20}, +{'c', -110.20, 187.60, 26.60 ,135.60, 26.60, 135.60}, +{'c', 26.60, 135.60, 195.40 ,105.20, 206.60, 101.20}, +{'c', 217.80, 97.20, 303.40 ,102.80, 303.40, 102.80}, +{'l', 298.60, 80.40, 0, 0, 0, 0}, +{'c', 233.80, 34.00, 223.40 ,63.60, 209.80, 59.60}, +{'c', 196.20, 55.60, 198.60 ,65.20, 195.40, 66.00}, +{'c', 192.20, 66.80, 153.00 ,42.00, 146.60, 42.80}, +{'c', 140.20, 43.60, 114.98 ,19.79, 129.80, 51.60}, +{'c', 152.03, 99.31, 69.04 ,89.23, 54.60, 79.60}, +{'c', 37.80, 68.40, 61.80 ,98.00, 61.80, 98.00}, +{'c', 80.20, 118.00, 45.80 ,101.20, 45.80, 101.20}, +{'c', 11.40, 88.40, -12.60 ,114.00, -15.80, 114.80}, +{'c', -19.00, 115.60, -23.80 ,118.80, -24.60, 112.40}, +{'c', -25.40, 106.00, -31.46 ,91.14, -64.60, 115.60}, +{'c', -98.20, 140.40, -108.60 ,124.40, -108.60, 124.40}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -74.20, 149.60, 0, 0, 0, 0}, +{'c', -74.20, 149.60, -81.40 ,161.20, -60.60, 174.40}, +{'c', -60.60, 174.40, -59.20 ,175.80, -77.20, 171.60}, +{'c', -77.20, 171.60, -83.40 ,169.60, -85.00, 159.20}, +{'c', -85.00, 159.20, -89.80 ,154.80, -94.60, 149.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 65.80, 102.00, 0, 0, 0, 0}, +{'c', 65.80, 102.00, 83.50 ,128.82, 82.90, 133.60}, +{'c', 81.60, 144.00, 81.40 ,153.60, 84.60, 157.60}, +{'c', 87.80, 161.60, 96.60 ,194.80, 96.60, 194.80}, +{'c', 96.60, 194.80, 96.20 ,196.00, 108.60, 158.00}, +{'c', 108.60, 158.00, 120.20 ,142.00, 100.20, 123.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -54.20, 176.40, 0, 0, 0, 0}, +{'c', -54.20, 176.40, -43.00 ,183.60, -57.40, 214.80}, +{'l', -51.00, 212.40, 0, 0, 0, 0}, +{'c', -51.00, 212.40, -51.80 ,223.60, -55.00, 226.00}, +{'l', -47.80, 222.80, 0, 0, 0, 0}, +{'c', -47.80, 222.80, -43.00 ,230.80, -47.00, 235.60}, +{'c', -47.00, 235.60, -30.20 ,243.60, -31.00, 250.00}, +{'c', -31.00, 250.00, -24.60 ,242.00, -28.60, 235.60}, +{'c', -32.60, 229.20, -39.80 ,233.20, -39.00, 214.80}, +{'l', -47.80, 218.00, 0, 0, 0, 0}, +{'c', -47.80, 218.00, -42.20 ,209.20, -42.20, 202.80}, +{'l', -50.20, 205.20, 0, 0, 0, 0}, +{'c', -50.20, 205.20, -34.73 ,178.62, -45.40, 177.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -21.80, 193.20, 0, 0, 0, 0}, +{'c', -21.80, 193.20, -19.00 ,188.80, -21.80, 189.60}, +{'c', -24.60, 190.40, -55.80 ,205.20, -61.80, 214.80}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -11.40, 201.20, 0, 0, 0, 0}, +{'c', -11.40, 201.20, -8.60 ,196.80, -11.40, 197.60}, +{'c', -14.20, 198.40, -45.40 ,213.20, -51.40, 222.80}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 1.80, 186.00, 0, 0, 0, 0}, +{'c', 1.80, 186.00, 4.60 ,181.60, 1.80, 182.40}, +{'c', -1.00, 183.20, -32.20 ,198.00, -38.20, 207.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -21.40, 229.60, 0, 0, 0, 0}, +{'c', -21.40, 229.60, -21.40 ,223.60, -24.20, 224.40}, +{'c', -27.00, 225.20, -63.00 ,242.80, -69.00, 252.40}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -20.20, 218.80, 0, 0, 0, 0}, +{'c', -20.20, 218.80, -19.00 ,214.00, -21.80, 214.80}, +{'c', -23.80, 214.80, -50.20 ,226.40, -56.20, 236.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -34.60, 266.40, 0, 0, 0, 0}, +{'l', -44.60, 274.00, 0, 0, 0, 0}, +{'c', -44.60, 274.00, -34.20 ,266.40, -30.60, 267.60}, +{'c', -30.60, 267.60, -37.40 ,278.80, -38.20, 284.00}, +{'c', -38.20, 284.00, -27.80 ,271.20, -22.20, 271.60}, +{'c', -22.20, 271.60, -14.60 ,272.00, -14.60, 282.80}, +{'c', -14.60, 282.80, -9.00 ,272.40, -5.80, 272.80}, +{'c', -5.80, 272.80, -4.60 ,279.20, -5.80, 286.00}, +{'c', -5.80, 286.00, -1.80 ,278.40, 2.20, 280.00}, +{'c', 2.20, 280.00, 8.60 ,278.00, 7.80, 289.60}, +{'c', 7.80, 289.60, 7.80 ,300.00, 7.00, 302.80}, +{'c', 7.00, 302.80, 12.60 ,276.40, 15.00, 276.00}, +{'c', 15.00, 276.00, 23.00 ,274.80, 27.80, 283.60}, +{'c', 27.80, 283.60, 23.80 ,276.00, 28.60, 278.00}, +{'c', 28.60, 278.00, 39.40 ,279.60, 42.60, 286.40}, +{'c', 42.60, 286.40, 35.80 ,274.40, 41.40, 277.60}, +{'c', 41.40, 277.60, 48.20 ,277.60, 49.40, 284.00}, +{'c', 49.40, 284.00, 57.80 ,305.20, 59.80, 306.80}, +{'c', 59.80, 306.80, 52.20 ,285.20, 53.80, 285.20}, +{'c', 53.80, 285.20, 51.80 ,273.20, 57.00, 288.00}, +{'c', 57.00, 288.00, 53.80 ,274.00, 59.40, 274.80}, +{'c', 65.00, 275.60, 69.40 ,285.60, 77.80, 283.20}, +{'c', 77.80, 283.20, 87.40 ,288.80, 89.40, 219.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -29.80, 173.60, 0, 0, 0, 0}, +{'c', -29.80, 173.60, -15.00 ,167.60, 25.00, 173.60}, +{'c', 25.00, 173.60, 32.20 ,174.00, 39.00, 165.20}, +{'c', 45.80, 156.40, 72.60 ,149.20, 79.00, 151.20}, +{'l', 88.60, 157.60, 0, 0, 0, 0}, +{'l', 89.40, 158.80, 0, 0, 0, 0}, +{'c', 89.40, 158.80, 101.80 ,169.20, 102.20, 176.80}, +{'c', 102.60, 184.40, 87.80 ,232.40, 78.20, 248.40}, +{'c', 68.60, 264.40, 59.00 ,276.80, 39.80, 274.40}, +{'c', 39.80, 274.40, 19.00 ,270.40, -6.60, 274.40}, +{'c', -6.60, 274.40, -35.80 ,272.80, -38.60, 264.80}, +{'c', -41.40, 256.80, -27.40 ,241.60, -27.40, 241.60}, +{'c', -27.40, 241.60, -23.00 ,233.20, -24.20, 218.80}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -7.80, 175.60, 0, 0, 0, 0}, +{'c', 0.60, 194.00, -29.00 ,259.20, -29.00, 259.20}, +{'c', -31.00, 260.80, -16.34 ,266.85, -6.20, 264.40}, +{'c', 4.75, 261.76, 45.00 ,266.00, 45.00, 266.00}, +{'c', 68.60, 250.40, 81.40 ,206.00, 81.40, 206.00}, +{'c', 81.40, 206.00, 91.80 ,182.00, 74.20, 178.80}, +{'f', 0.938000,0.402000,0.536000,1.000000,0,0 }, +{'m', -9.83, 206.50, 0, 0, 0, 0}, +{'c', -6.50, 193.71, -4.92 ,181.91, -7.80, 175.60}, +{'c', -7.80, 175.60, 54.60 ,182.00, 65.80, 161.20}, +{'c', 70.04, 153.33, 84.80 ,184.00, 84.40, 193.60}, +{'c', 84.40, 193.60, 21.40 ,208.00, 6.60, 196.80}, +{'f', 0.737000,0.201000,0.335000,1.000000,0,0 }, +{'m', -5.40, 222.80, 0, 0, 0, 0}, +{'c', -5.40, 222.80, -3.40 ,230.00, -5.80, 234.00}, +{'c', -5.80, 234.00, -7.40 ,234.80, -8.60, 235.20}, +{'c', -8.60, 235.20, -7.40 ,238.80, -1.40, 240.40}, +{'c', -1.40, 240.40, 0.60 ,244.80, 3.00, 245.20}, +{'c', 5.40, 245.60, 10.20 ,251.20, 14.20, 250.00}, +{'c', 18.20, 248.80, 29.40 ,244.80, 29.40, 244.80}, +{'c', 29.40, 244.80, 35.00 ,241.60, 43.80, 245.20}, +{'c', 43.80, 245.20, 46.17 ,244.40, 46.60, 240.40}, +{'c', 47.10, 235.70, 50.20 ,232.00, 52.20, 230.00}, +{'c', 54.20, 228.00, 63.80 ,215.20, 62.60, 214.80}, +{'f', 0.670000,0.134000,0.268000,1.000000,0,0 }, +{'m', -9.80, 174.40, 0, 0, 0, 0}, +{'c', -9.80, 174.40, -12.60 ,196.80, -9.40, 205.20}, +{'c', -6.20, 213.60, -7.00 ,215.60, -7.80, 219.60}, +{'c', -8.60, 223.60, -4.20 ,233.60, 1.40, 239.60}, +{'l', 13.40, 241.20, 0, 0, 0, 0}, +{'c', 13.40, 241.20, 28.60 ,237.60, 37.80, 240.40}, +{'c', 37.80, 240.40, 46.79 ,241.74, 50.20, 226.80}, +{'c', 50.20, 226.80, 55.00 ,220.40, 62.20, 217.60}, +{'c', 69.40, 214.80, 76.60 ,173.20, 72.60, 165.20}, +{'c', 68.60, 157.20, 54.20 ,152.80, 38.20, 168.40}, +{'f', 1.000000,0.469000,0.469000,1.000000,0,0 }, +{'m', -8.20, 249.20, 0, 0, 0, 0}, +{'c', -8.20, 249.20, -9.00 ,247.20, -13.40, 246.80}, +{'c', -13.40, 246.80, -35.80 ,243.20, -44.20, 230.80}, +{'c', -44.20, 230.80, -51.00 ,225.20, -46.60, 236.80}, +{'c', -46.60, 236.80, -36.20 ,257.20, -29.40, 260.00}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 71.74, 185.23, 0, 0, 0, 0}, +{'c', 72.40, 177.32, 74.35 ,168.71, 72.60, 165.20}, +{'c', 66.15, 152.31, 49.18 ,157.69, 38.20, 168.40}, +{'c', 22.20, 184.00, 20.20 ,167.20, -9.80, 174.40}, +{'c', -9.80, 174.40, -11.54 ,188.36, -10.71, 198.38}, +{'c', -10.71, 198.38, 26.60 ,186.80, 27.40, 192.40}, +{'c', 27.40, 192.40, 29.00 ,189.20, 38.20, 189.20}, +{'f', 0.804000,0.201000,0.268000,1.000000,0,0 }, +{'m', 28.60, 175.20, 0, 0, 0, 0}, +{'c', 28.60, 175.20, 33.40 ,180.00, 29.80, 189.60}, +{'f', 0.804000,0.201000,0.268000,1.000000,0,0 }, +{'m', -19.40, 260.00, 0, 0, 0, 0}, +{'c', -19.40, 260.00, -23.80 ,247.20, -15.00, 254.00}, +{'c', -15.00, 254.00, -10.20 ,256.00, -11.40, 257.60}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -14.36, 261.20, 0, 0, 0, 0}, +{'c', -14.36, 261.20, -17.88 ,250.96, -10.84, 256.40}, +{'c', -10.84, 256.40, -6.42 ,258.85, -7.96, 259.28}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -9.56, 261.20, 0, 0, 0, 0}, +{'c', -9.56, 261.20, -13.08 ,250.96, -6.04, 256.40}, +{'c', -6.04, 256.40, -1.67 ,258.71, -3.16, 259.28}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -2.96, 261.40, 0, 0, 0, 0}, +{'c', -2.96, 261.40, -6.48 ,251.16, 0.56, 256.60}, +{'c', 0.56, 256.60, 4.94 ,258.93, 3.44, 259.48}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 3.52, 261.32, 0, 0, 0, 0}, +{'c', 3.52, 261.32, 0.00 ,251.08, 7.04, 256.52}, +{'c', 7.04, 256.52, 10.88 ,258.12, 9.92, 259.40}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 10.20, 262.00, 0, 0, 0, 0}, +{'c', 10.20, 262.00, 5.40 ,249.60, 14.60, 256.00}, +{'c', 14.60, 256.00, 19.40 ,258.00, 18.20, 259.60}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -18.20, 244.80, 0, 0, 0, 0}, +{'c', -18.20, 244.80, -5.00 ,242.00, 1.00, 245.20}, +{'c', 1.00, 245.20, 7.00 ,246.40, 8.20, 246.00}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 15.80, 253.60, 0, 0, 0, 0}, +{'c', 15.80, 253.60, 27.80 ,240.00, 39.80, 244.40}, +{'c', 46.82, 246.97, 45.80 ,243.60, 46.60, 240.80}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 33.00, 237.60, 0, 0, 0, 0}, +{'c', 33.00, 237.60, 29.00 ,226.80, 26.20, 239.60}, +{'c', 23.40, 252.40, 20.20 ,256.00, 18.60, 258.80}, +{'c', 18.60, 258.80, 18.60 ,264.00, 27.00, 263.60}, +{'c', 27.00, 263.60, 37.80 ,263.20, 38.20, 260.40}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 47.00, 244.80, 0, 0, 0, 0}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', 53.50, 228.40, 0, 0, 0, 0}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -25.80, 265.20, 0, 0, 0, 0}, +{'c', -25.80, 265.20, -7.80 ,268.40, -3.40, 266.80}, +{'c', -3.40, 266.80, 5.40 ,266.80, -3.00, 268.80}, +{'c', -3.00, 268.80, -15.80 ,268.80, -23.80, 267.60}, +{'f', 0.737000,0.737000,0.737000,1.000000,0,0 }, +{'m', -11.80, 172.00, 0, 0, 0, 0}, +{'c', -11.80, 172.00, 5.80 ,172.00, 7.80, 172.80}, +{'c', 7.80, 172.80, 15.00 ,203.60, 11.40, 211.20}, +{'c', 11.40, 211.20, 10.20 ,214.00, 7.40, 208.40}, +{'c', 7.40, 208.40, -11.00 ,175.60, -14.20, 173.60}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -88.90, 169.30, 0, 0, 0, 0}, +{'c', -88.90, 169.30, -80.00 ,171.00, -67.40, 173.60}, +{'c', -67.40, 173.60, -62.60 ,196.00, -59.40, 200.80}, +{'c', -56.20, 205.60, -59.80 ,205.60, -63.40, 202.80}, +{'c', -67.00, 200.00, -81.80 ,186.00, -83.80, 181.60}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -67.04, 173.82, 0, 0, 0, 0}, +{'c', -67.04, 173.82, -61.24 ,175.37, -60.23, 177.58}, +{'c', -59.22, 179.79, -61.43 ,183.09, -61.43, 183.09}, +{'c', -61.43, 183.09, -62.43 ,186.40, -63.63, 184.24}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -67.00, 173.60, 0, 0, 0, 0}, +{'c', -67.00, 173.60, -63.40 ,178.80, -59.80, 178.80}, +{'c', -56.20, 178.80, -55.82 ,178.39, -53.00, 179.00}, +{'c', -48.40, 180.00, -48.80 ,178.00, -42.20, 179.20}, +{'c', -39.56, 179.68, -37.00 ,178.80, -34.20, 180.00}, +{'c', -31.40, 181.20, -28.20 ,180.40, -27.00, 178.40}, +{'c', -25.80, 176.40, -21.00 ,172.20, -21.00, 172.20}, +{'c', -21.00, 172.20, -33.80 ,174.00, -36.60, 174.80}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -22.40, 173.80, 0, 0, 0, 0}, +{'c', -22.40, 173.80, -28.85 ,177.30, -29.25, 179.70}, +{'c', -29.65, 182.10, -24.00 ,185.80, -24.00, 185.80}, +{'c', -24.00, 185.80, -21.25 ,190.40, -20.65, 188.00}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -59.88, 179.26, 0, 0, 0, 0}, +{'c', -59.88, 179.26, -52.88 ,190.45, -52.66, 179.24}, +{'c', -52.66, 179.24, -52.10 ,177.98, -53.86, 177.96}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -52.71, 179.51, 0, 0, 0, 0}, +{'c', -52.71, 179.51, -44.79 ,190.70, -45.42, 179.42}, +{'c', -45.42, 179.42, -45.41 ,179.09, -47.17, 178.94}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -45.49, 179.52, 0, 0, 0, 0}, +{'c', -45.49, 179.52, -37.53 ,190.15, -38.20, 180.48}, +{'c', -38.20, 180.48, -38.08 ,179.25, -39.74, 178.95}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -38.62, 179.60, 0, 0, 0, 0}, +{'c', -38.62, 179.60, -30.72 ,191.16, -30.37, 181.38}, +{'c', -30.37, 181.38, -28.73 ,180.00, -30.47, 179.78}, +{'f', 1.000000,1.000000,0.804000,1.000000,0,0 }, +{'m', -74.79, 183.13, 0, 0, 0, 0}, +{'l', -82.45, 181.60, 0, 0, 0, 0}, +{'c', -85.05, 176.60, -87.15 ,170.45, -87.15, 170.45}, +{'c', -87.15, 170.45, -80.80 ,171.45, -68.30, 174.25}, +{'c', -68.30, 174.25, -67.42 ,177.57, -65.95, 183.36}, +{'f', 0.938000,0.938000,0.737000,1.000000,0,0 }, +{'m', -9.72, 178.47, 0, 0, 0, 0}, +{'c', -11.39, 175.96, -12.71 ,174.21, -13.36, 173.80}, +{'c', -16.37, 171.92, -12.23 ,172.29, -11.10, 172.29}, +{'c', -11.10, 172.29, 5.47 ,172.29, 7.36, 173.05}, +{'c', 7.36, 173.05, 7.88 ,175.29, 8.56, 178.68}, +{'f', 0.938000,0.938000,0.737000,1.000000,0,0 }, +{'m', 43.88, 40.32, 0, 0, 0, 0}, +{'c', 71.60, 44.28, 97.12 ,8.64, 98.88, -1.04}, +{'c', 100.64, -10.72, 90.52 ,-22.60, 90.52, -22.60}, +{'c', 91.84, -25.68, 87.00 ,-39.76, 81.72, -49.00}, +{'c', 76.44, -58.24, 60.54 ,-57.27, 43.00, -58.24}, +{'c', 27.16, -59.12, 8.68 ,-35.80, 7.36, -34.04}, +{'c', 6.04, -32.28, 12.20 ,6.00, 13.52, 11.72}, +{'c', 14.84, 17.44, 12.20 ,43.84, 12.20, 43.84}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 8.09, -33.39, 0, 0, 0, 0}, +{'c', 6.79, -31.66, 12.84 ,5.92, 14.14, 11.54}, +{'c', 15.43, 17.15, 12.84 ,43.07, 12.84, 43.07}, +{'c', 45.51, 34.19, 16.73 ,35.73, 43.94, 39.62}, +{'c', 71.16, 43.51, 96.22 ,8.51, 97.94, -0.99}, +{'c', 99.67, -10.50, 89.74 ,-22.16, 89.74, -22.16}, +{'c', 91.03, -25.18, 86.28 ,-39.01, 81.10, -48.08}, +{'c', 75.91, -57.15, 60.30 ,-56.20, 43.08, -57.15}, +{'f', 0.938000,0.536000,0.335000,1.000000,0,0 }, +{'m', 8.82, -32.74, 0, 0, 0, 0}, +{'c', 7.54, -31.05, 13.48 ,5.84, 14.75, 11.35}, +{'c', 16.02, 16.86, 13.48 ,42.30, 13.48, 42.30}, +{'c', 44.88, 33.15, 17.30 ,35.10, 44.01, 38.91}, +{'c', 70.72, 42.73, 95.31 ,8.38, 97.01, -0.94}, +{'c', 98.70, -10.27, 88.95 ,-21.72, 88.95, -21.72}, +{'c', 90.22, -24.69, 85.56 ,-38.26, 80.47, -47.16}, +{'c', 75.39, -56.06, 60.06 ,-55.12, 43.16, -56.06}, +{'f', 0.938000,0.670000,0.469000,1.000000,0,0 }, +{'m', 9.54, -32.10, 0, 0, 0, 0}, +{'c', 8.30, -30.43, 14.12 ,5.76, 15.37, 11.17}, +{'c', 16.62, 16.58, 14.12 ,41.54, 14.12, 41.54}, +{'c', 43.56, 32.50, 17.86 ,34.47, 44.07, 38.21}, +{'c', 70.28, 41.95, 94.41 ,8.26, 96.07, -0.90}, +{'c', 97.74, -10.05, 88.17 ,-21.28, 88.17, -21.28}, +{'c', 89.42, -24.19, 84.84 ,-37.50, 79.85, -46.24}, +{'c', 74.86, -54.98, 59.82 ,-54.05, 43.24, -54.98}, +{'f', 1.000000,0.804000,0.670000,1.000000,0,0 }, +{'m', 10.27, -31.45, 0, 0, 0, 0}, +{'c', 9.05, -29.82, 14.76 ,5.68, 15.98, 10.98}, +{'c', 17.21, 16.29, 14.76 ,40.77, 14.76, 40.77}, +{'c', 42.63, 31.85, 18.43 ,33.83, 44.14, 37.51}, +{'c', 69.84, 41.18, 93.50 ,8.13, 95.14, -0.85}, +{'c', 96.77, -9.82, 87.39 ,-20.84, 87.39, -20.84}, +{'c', 88.61, -23.70, 84.12 ,-36.75, 79.22, -45.32}, +{'c', 74.33, -53.89, 59.59 ,-52.98, 43.32, -53.89}, +{'f', 1.000000,0.938000,0.871000,1.000000,0,0 }, +{'m', 44.20, 36.80, 0, 0, 0, 0}, +{'c', 69.40, 40.40, 92.60 ,8.00, 94.20, -0.80}, +{'c', 95.80, -9.60, 86.60 ,-20.40, 86.60, -20.40}, +{'c', 87.80, -23.20, 83.40 ,-36.00, 78.60, -44.40}, +{'c', 73.80, -52.80, 59.35 ,-51.91, 43.40, -52.80}, +{'c', 29.00, -53.60, 12.20 ,-32.40, 11.00, -30.80}, +{'c', 9.80, -29.20, 15.40 ,5.60, 16.60, 10.80}, +{'c', 17.80, 16.00, 15.40 ,40.00, 15.40, 40.00}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 90.60, 2.80, 0, 0, 0, 0}, +{'c', 90.60, 2.80, 62.80 ,10.40, 51.20, 8.80}, +{'c', 51.20, 8.80, 35.40 ,2.20, 26.60, 24.00}, +{'c', 26.60, 24.00, 23.00 ,31.20, 21.00, 33.20}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 94.40, 0.60, 0, 0, 0, 0}, +{'c', 94.40, 0.60, 65.40 ,12.80, 55.40, 12.40}, +{'c', 55.40, 12.40, 39.00 ,7.80, 30.60, 22.40}, +{'c', 30.60, 22.40, 22.20 ,31.60, 19.00, 33.20}, +{'c', 19.00, 33.20, 18.60 ,34.80, 25.00, 30.80}, +{'l', 35.40, 36.00, 0, 0, 0, 0}, +{'c', 35.40, 36.00, 50.20 ,45.60, 59.80, 29.60}, +{'c', 59.80, 29.60, 63.80 ,18.40, 63.80, 16.40}, +{'c', 63.80, 14.40, 85.00 ,8.80, 86.60, 8.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 47.00, 36.51, 0, 0, 0, 0}, +{'c', 40.13, 36.51, 31.75 ,32.65, 31.75, 26.40}, +{'c', 31.75, 20.15, 40.13 ,13.89, 47.00, 13.89}, +{'c', 53.87, 13.89, 59.45 ,18.95, 59.45, 25.20}, +{'f', 0.603000,0.804000,0.201000,1.000000,0,0 }, +{'m', 43.38, 19.83, 0, 0, 0, 0}, +{'c', 38.53, 20.55, 33.44 ,22.05, 33.51, 21.84}, +{'c', 35.05, 17.22, 41.41 ,13.89, 47.00, 13.89}, +{'c', 51.30, 13.89, 55.08 ,15.87, 57.32, 18.88}, +{'f', 0.402000,0.603000,0.000000,1.000000,0,0 }, +{'m', 55.40, 19.60, 0, 0, 0, 0}, +{'c', 55.40, 19.60, 51.00 ,16.40, 51.00, 18.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 45.40, 27.73, 0, 0, 0, 0}, +{'c', 42.90, 27.73, 40.88 ,25.70, 40.88, 23.20}, +{'c', 40.88, 20.70, 42.90 ,18.68, 45.40, 18.68}, +{'c', 47.90, 18.68, 49.93 ,20.70, 49.93, 23.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -58.60, 14.40, 0, 0, 0, 0}, +{'c', -58.60, 14.40, -61.80 ,-6.80, -59.40, -11.20}, +{'c', -59.40, -11.20, -48.60 ,-21.20, -49.00, -24.80}, +{'c', -49.00, -24.80, -49.40 ,-42.80, -50.60, -43.60}, +{'c', -51.80, -44.40, -59.40 ,-50.40, -65.40, -44.00}, +{'c', -65.40, -44.00, -75.80 ,-26.00, -75.00, -19.60}, +{'l', -75.00, -17.60, 0, 0, 0, 0}, +{'c', -75.00, -17.60, -82.60 ,-18.00, -84.20, -16.00}, +{'c', -84.20, -16.00, -85.40 ,-10.80, -86.60, -10.40}, +{'c', -86.60, -10.40, -89.40 ,-8.00, -87.40, -5.20}, +{'c', -87.40, -5.20, -89.40 ,-2.80, -89.00, 1.20}, +{'l', -81.40, 5.20, 0, 0, 0, 0}, +{'c', -81.40, 5.20, -79.40 ,19.60, -68.60, 24.80}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', -59.60, 12.56, 0, 0, 0, 0}, +{'c', -59.60, 12.56, -62.48 ,-6.52, -60.32, -10.48}, +{'c', -60.32, -10.48, -50.60 ,-19.48, -50.96, -22.72}, +{'c', -50.96, -22.72, -51.32 ,-38.92, -52.40, -39.64}, +{'c', -53.48, -40.36, -60.32 ,-45.76, -65.72, -40.00}, +{'c', -65.72, -40.00, -75.08 ,-23.80, -74.36, -18.04}, +{'l', -74.36, -16.24, 0, 0, 0, 0}, +{'c', -74.36, -16.24, -81.20 ,-16.60, -82.64, -14.80}, +{'c', -82.64, -14.80, -83.72 ,-10.12, -84.80, -9.76}, +{'c', -84.80, -9.76, -87.32 ,-7.60, -85.52, -5.08}, +{'c', -85.52, -5.08, -87.32 ,-2.92, -86.96, 0.68}, +{'l', -80.12, 4.28, 0, 0, 0, 0}, +{'c', -80.12, 4.28, -78.32 ,17.24, -68.60, 21.92}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -51.05, -42.61, 0, 0, 0, 0}, +{'c', -52.14, -43.47, -59.63 ,-49.24, -65.48, -43.00}, +{'c', -65.48, -43.00, -75.62 ,-25.45, -74.84, -19.21}, +{'l', -74.84, -17.26, 0, 0, 0, 0}, +{'c', -74.84, -17.26, -82.25 ,-17.65, -83.81, -15.70}, +{'c', -83.81, -15.70, -84.98 ,-10.63, -86.15, -10.24}, +{'c', -86.15, -10.24, -88.88 ,-7.90, -86.93, -5.17}, +{'c', -86.93, -5.17, -88.88 ,-2.83, -88.49, 1.07}, +{'l', -81.08, 4.97, 0, 0, 0, 0}, +{'c', -81.08, 4.97, -79.13 ,19.01, -68.60, 24.08}, +{'c', -63.89, 26.35, -60.80 ,19.79, -58.85, 13.94}, +{'c', -58.85, 13.94, -61.97 ,-6.73, -59.63, -11.02}, +{'c', -59.63, -11.02, -49.10 ,-20.77, -49.49, -24.28}, +{'f', 0.938000,0.603000,0.335000,1.000000,0,0 }, +{'m', -51.50, -41.62, 0, 0, 0, 0}, +{'c', -52.48, -42.54, -59.86 ,-48.08, -65.56, -42.00}, +{'c', -65.56, -42.00, -75.44 ,-24.90, -74.68, -18.82}, +{'l', -74.68, -16.92, 0, 0, 0, 0}, +{'c', -74.68, -16.92, -81.90 ,-17.30, -83.42, -15.40}, +{'c', -83.42, -15.40, -84.56 ,-10.46, -85.70, -10.08}, +{'c', -85.70, -10.08, -88.36 ,-7.80, -86.46, -5.14}, +{'c', -86.46, -5.14, -88.36 ,-2.86, -87.98, 0.94}, +{'l', -80.76, 4.74, 0, 0, 0, 0}, +{'c', -80.76, 4.74, -78.86 ,18.42, -68.60, 23.36}, +{'c', -64.01, 25.57, -61.00 ,19.18, -59.10, 13.48}, +{'c', -59.10, 13.48, -62.14 ,-6.66, -59.86, -10.84}, +{'c', -59.86, -10.84, -49.60 ,-20.34, -49.98, -23.76}, +{'f', 1.000000,0.737000,0.603000,1.000000,0,0 }, +{'m', -51.95, -40.63, 0, 0, 0, 0}, +{'c', -52.82, -41.61, -60.09 ,-46.92, -65.64, -41.00}, +{'c', -65.64, -41.00, -75.26 ,-24.35, -74.52, -18.43}, +{'l', -74.52, -16.58, 0, 0, 0, 0}, +{'c', -74.52, -16.58, -81.55 ,-16.95, -83.03, -15.10}, +{'c', -83.03, -15.10, -84.14 ,-10.29, -85.25, -9.92}, +{'c', -85.25, -9.92, -87.84 ,-7.70, -85.99, -5.11}, +{'c', -85.99, -5.11, -87.84 ,-2.89, -87.47, 0.81}, +{'l', -80.44, 4.51, 0, 0, 0, 0}, +{'c', -80.44, 4.51, -78.59 ,17.83, -68.60, 22.64}, +{'c', -64.13, 24.79, -61.20 ,18.57, -59.35, 13.02}, +{'c', -59.35, 13.02, -62.31 ,-6.59, -60.09, -10.66}, +{'c', -60.09, -10.66, -50.10 ,-19.91, -50.47, -23.24}, +{'f', 1.000000,0.871000,0.804000,1.000000,0,0 }, +{'m', -59.60, 12.46, 0, 0, 0, 0}, +{'c', -59.60, 12.46, -62.48 ,-6.52, -60.32, -10.48}, +{'c', -60.32, -10.48, -50.60 ,-19.48, -50.96, -22.72}, +{'c', -50.96, -22.72, -51.32 ,-38.92, -52.40, -39.64}, +{'c', -53.16, -40.68, -60.32 ,-45.76, -65.72, -40.00}, +{'c', -65.72, -40.00, -75.08 ,-23.80, -74.36, -18.04}, +{'l', -74.36, -16.24, 0, 0, 0, 0}, +{'c', -74.36, -16.24, -81.20 ,-16.60, -82.64, -14.80}, +{'c', -82.64, -14.80, -83.72 ,-10.12, -84.80, -9.76}, +{'c', -84.80, -9.76, -87.32 ,-7.60, -85.52, -5.08}, +{'c', -85.52, -5.08, -87.32 ,-2.92, -86.96, 0.68}, +{'l', -80.12, 4.28, 0, 0, 0, 0}, +{'c', -80.12, 4.28, -78.32 ,17.24, -68.60, 21.92}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -62.70, 6.20, 0, 0, 0, 0}, +{'c', -62.70, 6.20, -84.30 ,-4.00, -85.20, -4.80}, +{'c', -85.20, -4.80, -76.10 ,3.40, -75.30, 3.40}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -79.80, 0.00, 0, 0, 0, 0}, +{'c', -79.80, 0.00, -61.40 ,3.60, -61.40, 8.00}, +{'c', -61.40, 10.91, -61.64 ,24.33, -67.00, 22.80}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -71.40, 3.80, 0, 0, 0, 0}, +{'c', -71.40, 3.80, -62.42 ,5.27, -61.40, 8.00}, +{'c', -60.80, 9.60, -60.14 ,17.91, -65.60, 19.00}, +{'f', 0.603000,0.804000,0.201000,1.000000,0,0 }, +{'m', 14.60, 46.35, 0, 0, 0, 0}, +{'c', 14.10, 44.61, 15.41 ,44.74, 17.20, 44.20}, +{'c', 19.20, 43.60, 31.40 ,39.80, 32.20, 37.20}, +{'c', 33.00, 34.60, 46.20 ,39.00, 46.20, 39.00}, +{'c', 48.00, 39.80, 52.40 ,42.40, 52.40, 42.40}, +{'c', 57.20, 43.60, 63.80 ,44.00, 63.80, 44.00}, +{'c', 66.20, 45.00, 69.60 ,47.80, 69.60, 47.80}, +{'c', 84.20, 58.00, 96.60 ,50.80, 96.60, 50.80}, +{'c', 116.60, 44.20, 110.60 ,27.00, 110.60, 27.00}, +{'c', 107.60, 18.00, 110.80 ,14.60, 110.80, 14.60}, +{'c', 111.00, 10.80, 118.20 ,17.20, 118.20, 17.20}, +{'c', 120.80, 21.40, 121.60 ,26.40, 121.60, 26.40}, +{'c', 129.60, 37.60, 126.20 ,19.80, 126.20, 19.80}, +{'c', 126.40, 18.80, 123.60 ,15.20, 123.60, 14.00}, +{'c', 123.60, 12.80, 121.80 ,9.40, 121.80, 9.40}, +{'c', 118.80, 6.00, 121.20 ,-1.00, 121.20, -1.00}, +{'c', 123.00, -14.80, 120.80 ,-13.00, 120.80, -13.00}, +{'c', 119.60, -14.80, 110.40 ,-4.80, 110.40, -4.80}, +{'c', 108.20, -1.40, 102.20 ,0.20, 102.20, 0.20}, +{'c', 99.40, 2.00, 96.00 ,0.60, 96.00, 0.60}, +{'c', 93.40, 0.20, 87.80 ,7.20, 87.80, 7.20}, +{'c', 90.60, 7.00, 93.00 ,11.40, 95.40, 11.60}, +{'c', 97.80, 11.80, 99.60 ,9.20, 101.20, 8.60}, +{'c', 102.80, 8.00, 105.60 ,13.80, 105.60, 13.80}, +{'c', 106.00, 16.40, 100.40 ,21.20, 100.40, 21.20}, +{'c', 100.00, 25.80, 98.40 ,24.20, 98.40, 24.20}, +{'c', 95.40, 23.60, 94.20 ,27.40, 93.20, 32.00}, +{'c', 92.20, 36.60, 88.00 ,37.00, 88.00, 37.00}, +{'c', 86.40, 44.40, 85.20 ,41.40, 85.20, 41.40}, +{'c', 85.00, 35.80, 79.00 ,41.60, 79.00, 41.60}, +{'c', 77.80, 43.60, 73.20 ,41.40, 73.20, 41.40}, +{'c', 66.40, 39.40, 68.80 ,37.40, 68.80, 37.40}, +{'c', 70.60, 35.20, 81.80 ,37.40, 81.80, 37.40}, +{'c', 84.00, 35.80, 76.00 ,31.80, 76.00, 31.80}, +{'c', 75.40, 30.00, 76.40 ,25.60, 76.40, 25.60}, +{'c', 77.60, 22.40, 84.40 ,16.80, 84.40, 16.80}, +{'c', 93.80, 15.60, 91.00 ,14.00, 91.00, 14.00}, +{'c', 84.80, 8.80, 79.00 ,16.40, 79.00, 16.40}, +{'c', 76.80, 22.60, 59.40 ,37.60, 59.40, 37.60}, +{'c', 54.60, 41.00, 57.20 ,34.20, 53.20, 37.60}, +{'c', 49.20, 41.00, 28.60 ,32.00, 28.60, 32.00}, +{'c', 17.04, 30.81, 14.31 ,46.55, 10.78, 43.43}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 209.40, -120.00, 0, 0, 0, 0}, +{'c', 209.40, -120.00, 183.80 ,-112.00, 181.00, -93.20}, +{'c', 181.00, -93.20, 178.60 ,-70.40, 199.00, -52.80}, +{'c', 199.00, -52.80, 199.40 ,-46.40, 201.40, -43.20}, +{'c', 201.40, -43.20, 199.80 ,-38.40, 218.60, -46.00}, +{'l', 245.80, -54.40, 0, 0, 0, 0}, +{'c', 245.80, -54.40, 252.20 ,-56.80, 257.40, -65.60}, +{'c', 262.60, -74.40, 277.80 ,-93.20, 274.20, -118.40}, +{'c', 274.20, -118.40, 275.40 ,-129.60, 269.40, -130.00}, +{'c', 269.40, -130.00, 261.00 ,-131.60, 253.80, -124.00}, +{'c', 253.80, -124.00, 247.00 ,-120.80, 244.60, -121.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 264.02, -120.99, 0, 0, 0, 0}, +{'c', 264.02, -120.99, 266.12 ,-129.92, 261.28, -125.08}, +{'c', 261.28, -125.08, 254.24 ,-119.36, 246.76, -119.36}, +{'c', 246.76, -119.36, 232.24 ,-117.16, 227.84, -103.96}, +{'c', 227.84, -103.96, 223.88 ,-77.12, 231.80, -71.40}, +{'c', 231.80, -71.40, 236.64 ,-63.92, 243.68, -70.52}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 263.65, -120.63, 0, 0, 0, 0}, +{'c', 263.65, -120.63, 265.74 ,-129.38, 260.99, -124.62}, +{'c', 260.99, -124.62, 254.07 ,-119.01, 246.73, -119.01}, +{'c', 246.73, -119.01, 232.47 ,-116.85, 228.15, -103.89}, +{'c', 228.15, -103.89, 224.26 ,-77.54, 232.04, -71.92}, +{'c', 232.04, -71.92, 236.79 ,-64.58, 243.71, -71.06}, +{'f', 0.201000,0.201000,0.201000,1.000000,0,0 }, +{'m', 263.27, -120.27, 0, 0, 0, 0}, +{'c', 263.27, -120.27, 265.35 ,-128.83, 260.69, -124.17}, +{'c', 260.69, -124.17, 253.91 ,-118.66, 246.70, -118.66}, +{'c', 246.70, -118.66, 232.71 ,-116.54, 228.47, -103.82}, +{'c', 228.47, -103.82, 224.65 ,-77.95, 232.28, -72.44}, +{'c', 232.28, -72.44, 236.94 ,-65.23, 243.73, -71.59}, +{'f', 0.402000,0.402000,0.402000,1.000000,0,0 }, +{'m', 262.90, -119.92, 0, 0, 0, 0}, +{'c', 262.90, -119.92, 264.97 ,-128.29, 260.39, -123.71}, +{'c', 260.39, -123.71, 253.74 ,-118.30, 246.66, -118.30}, +{'c', 246.66, -118.30, 232.94 ,-116.22, 228.78, -103.74}, +{'c', 228.78, -103.74, 225.03 ,-78.37, 232.52, -72.96}, +{'c', 232.52, -72.96, 237.10 ,-65.89, 243.75, -72.13}, +{'f', 0.603000,0.603000,0.603000,1.000000,0,0 }, +{'m', 262.53, -119.56, 0, 0, 0, 0}, +{'c', 262.53, -119.56, 264.59 ,-127.74, 260.10, -123.26}, +{'c', 260.10, -123.26, 253.57 ,-117.95, 246.63, -117.95}, +{'c', 246.63, -117.95, 233.17 ,-115.91, 229.09, -103.67}, +{'c', 229.09, -103.67, 225.42 ,-78.78, 232.76, -73.48}, +{'c', 232.76, -73.48, 237.25 ,-66.54, 243.78, -72.66}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 262.15, -119.20, 0, 0, 0, 0}, +{'c', 262.15, -119.20, 264.20 ,-127.20, 259.80, -122.80}, +{'c', 259.80, -122.80, 253.40 ,-117.60, 246.60, -117.60}, +{'c', 246.60, -117.60, 233.40 ,-115.60, 229.40, -103.60}, +{'c', 229.40, -103.60, 225.80 ,-79.20, 233.00, -74.00}, +{'c', 233.00, -74.00, 237.40 ,-67.20, 243.80, -73.20}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 50.60, 84.00, 0, 0, 0, 0}, +{'c', 50.60, 84.00, 30.20 ,64.80, 22.20, 64.00}, +{'c', 22.20, 64.00, -12.20 ,60.00, -27.00, 78.00}, +{'c', -27.00, 78.00, -9.40 ,57.60, 18.20, 63.20}, +{'c', 18.20, 63.20, -3.40 ,58.80, -15.80, 62.00}, +{'c', -15.80, 62.00, -32.60 ,62.00, -42.20, 76.00}, +{'l', -45.00, 80.80, 0, 0, 0, 0}, +{'c', -45.00, 80.80, -41.00 ,66.00, -22.60, 60.00}, +{'c', -22.60, 60.00, 0.20 ,55.20, 11.00, 60.00}, +{'c', 11.00, 60.00, -10.60 ,53.20, -20.60, 55.20}, +{'c', -20.60, 55.20, -51.00 ,52.80, -63.80, 79.20}, +{'c', -63.80, 79.20, -59.80 ,64.80, -45.00, 57.60}, +{'c', -45.00, 57.60, -31.40 ,48.80, -11.00, 51.60}, +{'c', -11.00, 51.60, 3.40 ,54.80, 8.60, 57.20}, +{'c', 13.80, 59.60, 12.60 ,56.80, 4.20, 52.00}, +{'c', 4.20, 52.00, -1.40 ,42.00, -15.40, 42.40}, +{'c', -15.40, 42.40, -58.20 ,46.00, -68.60, 58.00}, +{'c', -68.60, 58.00, -55.00 ,46.80, -44.60, 44.00}, +{'c', -44.60, 44.00, -22.20 ,36.00, -13.80, 36.80}, +{'c', -13.80, 36.80, 11.00 ,37.80, 18.60, 33.80}, +{'c', 18.60, 33.80, 7.40 ,38.80, 10.60, 42.00}, +{'c', 13.80, 45.20, 20.60 ,52.80, 20.60, 54.00}, +{'c', 20.60, 55.20, 44.80 ,77.30, 48.40, 81.70}, +{'f', 0.603000,0.134000,0.000000,1.000000,0,0 }, +{'m', 189.00, 278.00, 0, 0, 0, 0}, +{'c', 189.00, 278.00, 173.50 ,241.50, 161.00, 232.00}, +{'c', 161.00, 232.00, 187.00 ,248.00, 190.50, 266.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 236.00, 285.50, 0, 0, 0, 0}, +{'c', 236.00, 285.50, 209.50 ,230.50, 191.00, 206.50}, +{'c', 191.00, 206.50, 234.50 ,244.00, 239.50, 270.50}, +{'l', 240.00, 276.00, 0, 0, 0, 0}, +{'l', 237.00, 273.50, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 292.50, 237.00, 0, 0, 0, 0}, +{'c', 292.50, 237.00, 230.00 ,177.50, 228.50, 175.00}, +{'c', 228.50, 175.00, 289.00 ,241.00, 292.00, 248.50}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 104.00, 280.50, 0, 0, 0, 0}, +{'c', 104.00, 280.50, 123.50 ,228.50, 142.50, 251.00}, +{'c', 142.50, 251.00, 157.50 ,261.00, 157.00, 264.00}, +{'c', 157.00, 264.00, 153.00 ,257.50, 135.00, 258.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 294.50, 153.00, 0, 0, 0, 0}, +{'c', 294.50, 153.00, 249.50 ,124.50, 242.00, 123.00}, +{'c', 230.19, 120.64, 291.50 ,152.00, 296.50, 162.50}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 143.80, 259.60, 0, 0, 0, 0}, +{'c', 143.80, 259.60, 164.20 ,257.60, 171.00, 250.80}, +{'l', 175.40, 254.40, 0, 0, 0, 0}, +{'l', 193.00, 216.00, 0, 0, 0, 0}, +{'l', 196.60, 221.20, 0, 0, 0, 0}, +{'c', 196.60, 221.20, 211.00 ,206.40, 210.20, 198.40}, +{'c', 209.40, 190.40, 223.00 ,204.40, 223.00, 204.40}, +{'c', 223.00, 204.40, 222.20 ,192.80, 229.40, 199.60}, +{'c', 229.40, 199.60, 227.00 ,184.00, 235.40, 192.00}, +{'c', 235.40, 192.00, 224.86 ,161.84, 247.40, 187.60}, +{'c', 253.00, 194.00, 248.60 ,187.20, 248.60, 187.20}, +{'c', 248.60, 187.20, 222.60 ,139.20, 244.20, 153.60}, +{'c', 244.20, 153.60, 246.20 ,130.80, 245.00, 126.40}, +{'c', 243.80, 122.00, 241.80 ,99.60, 237.00, 94.40}, +{'c', 232.20, 89.20, 237.40 ,87.60, 243.00, 92.80}, +{'c', 243.00, 92.80, 231.80 ,68.80, 245.00, 80.80}, +{'c', 245.00, 80.80, 241.40 ,65.60, 237.00, 62.80}, +{'c', 237.00, 62.80, 231.40 ,45.60, 246.60, 56.40}, +{'c', 246.60, 56.40, 242.20 ,44.00, 239.00, 40.80}, +{'c', 239.00, 40.80, 227.40 ,13.20, 234.60, 18.00}, +{'l', 239.00, 21.60, 0, 0, 0, 0}, +{'c', 239.00, 21.60, 232.20 ,7.60, 238.60, 12.00}, +{'c', 245.00, 16.40, 245.00 ,16.00, 245.00, 16.00}, +{'c', 245.00, 16.00, 223.80 ,-17.20, 244.20, 0.40}, +{'c', 244.20, 0.40, 236.04 ,-13.52, 232.60, -20.40}, +{'c', 232.60, -20.40, 213.80 ,-40.80, 228.20, -34.40}, +{'l', 233.00, -32.80, 0, 0, 0, 0}, +{'c', 233.00, -32.80, 224.20 ,-42.80, 216.20, -44.40}, +{'c', 208.20, -46.00, 218.60 ,-52.40, 225.00, -50.40}, +{'c', 231.40, -48.40, 247.00 ,-40.80, 247.00, -40.80}, +{'c', 247.00, -40.80, 259.80 ,-22.00, 263.80, -21.60}, +{'c', 263.80, -21.60, 243.80 ,-29.20, 249.80, -21.20}, +{'c', 249.80, -21.20, 264.20 ,-7.20, 257.00, -7.60}, +{'c', 257.00, -7.60, 251.00 ,-0.40, 255.80, 8.40}, +{'c', 255.80, 8.40, 237.34 ,-9.99, 252.20, 15.60}, +{'l', 259.00, 32.00, 0, 0, 0, 0}, +{'c', 259.00, 32.00, 234.60 ,7.20, 245.80, 29.20}, +{'c', 245.80, 29.20, 263.00 ,52.80, 265.00, 53.20}, +{'c', 267.00, 53.60, 271.40 ,62.40, 271.40, 62.40}, +{'l', 267.00, 60.40, 0, 0, 0, 0}, +{'l', 272.20, 69.20, 0, 0, 0, 0}, +{'c', 272.20, 69.20, 261.00 ,57.20, 267.00, 70.40}, +{'l', 272.60, 84.80, 0, 0, 0, 0}, +{'c', 272.60, 84.80, 252.20 ,62.80, 265.80, 92.40}, +{'c', 265.80, 92.40, 249.40 ,87.20, 258.20, 104.40}, +{'c', 258.20, 104.40, 256.60 ,120.40, 257.00, 125.60}, +{'c', 257.40, 130.80, 258.60 ,159.20, 254.20, 167.20}, +{'c', 249.80, 175.20, 260.20 ,194.40, 262.20, 198.40}, +{'c', 264.20, 202.40, 267.80 ,213.20, 259.00, 204.00}, +{'c', 250.20, 194.80, 254.60 ,200.40, 256.60, 209.20}, +{'c', 258.60, 218.00, 264.60 ,233.60, 263.80, 239.20}, +{'c', 263.80, 239.20, 262.60 ,240.40, 259.40, 236.80}, +{'c', 259.40, 236.80, 244.60 ,214.00, 246.20, 228.40}, +{'c', 246.20, 228.40, 245.00 ,236.40, 241.80, 245.20}, +{'c', 241.80, 245.20, 238.60 ,256.00, 238.60, 247.20}, +{'c', 238.60, 247.20, 235.40 ,230.40, 232.60, 238.00}, +{'c', 229.80, 245.60, 226.20 ,251.60, 223.40, 254.00}, +{'c', 220.60, 256.40, 215.40 ,233.60, 214.20, 244.00}, +{'c', 214.20, 244.00, 202.20 ,231.60, 197.40, 248.00}, +{'l', 185.80, 264.40, 0, 0, 0, 0}, +{'c', 185.80, 264.40, 185.40 ,252.00, 184.20, 258.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 109.40, -97.20, 0, 0, 0, 0}, +{'c', 109.40, -97.20, 97.80 ,-105.20, 93.80, -104.80}, +{'c', 89.80, -104.40, 121.40 ,-113.60, 162.60, -86.00}, +{'c', 162.60, -86.00, 167.40 ,-83.20, 171.00, -83.60}, +{'c', 171.00, -83.60, 174.20 ,-81.20, 171.40, -77.60}, +{'c', 171.40, -77.60, 162.60 ,-68.00, 173.80, -56.80}, +{'c', 173.80, -56.80, 192.20 ,-50.00, 186.60, -58.80}, +{'c', 186.60, -58.80, 197.40 ,-54.80, 199.80, -50.80}, +{'c', 202.20, -46.80, 201.00 ,-50.80, 201.00, -50.80}, +{'c', 201.00, -50.80, 194.60 ,-58.00, 188.60, -63.20}, +{'c', 188.60, -63.20, 183.40 ,-65.20, 180.60, -73.60}, +{'c', 177.80, -82.00, 175.40 ,-92.00, 179.80, -95.20}, +{'c', 179.80, -95.20, 175.80 ,-90.80, 176.60, -94.80}, +{'c', 177.40, -98.80, 181.00 ,-102.40, 182.60, -102.80}, +{'c', 184.20, -103.20, 200.60 ,-119.00, 207.40, -119.40}, +{'c', 207.40, -119.40, 198.20 ,-118.00, 195.20, -119.00}, +{'c', 192.20, -120.00, 165.60 ,-131.40, 159.60, -132.60}, +{'c', 159.60, -132.60, 142.80 ,-139.20, 154.80, -137.20}, +{'c', 154.80, -137.20, 190.60 ,-133.40, 208.80, -120.20}, +{'c', 208.80, -120.20, 201.60 ,-128.60, 183.20, -135.60}, +{'c', 183.20, -135.60, 161.00 ,-148.20, 125.80, -143.20}, +{'c', 125.80, -143.20, 108.00 ,-140.00, 100.20, -138.20}, +{'c', 100.20, -138.20, 97.60 ,-138.80, 97.00, -139.20}, +{'c', 96.40, -139.60, 84.60 ,-148.60, 57.00, -141.60}, +{'c', 57.00, -141.60, 40.00 ,-137.00, 31.40, -132.20}, +{'c', 31.40, -132.20, 16.20 ,-131.00, 12.60, -127.80}, +{'c', 12.60, -127.80, -6.00 ,-113.20, -8.00, -112.40}, +{'c', -10.00, -111.60, -21.40 ,-104.00, -22.20, -103.60}, +{'c', -22.20, -103.60, 2.40 ,-110.20, 4.80, -112.60}, +{'c', 7.20, -115.00, 24.60 ,-117.60, 27.00, -116.20}, +{'c', 29.40, -114.80, 37.80 ,-115.40, 28.20, -114.80}, +{'c', 28.20, -114.80, 103.80 ,-100.00, 104.60, -98.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 180.80, -106.40, 0, 0, 0, 0}, +{'c', 180.80, -106.40, 170.60 ,-113.80, 168.60, -113.80}, +{'c', 166.60, -113.80, 154.20 ,-124.00, 150.00, -123.60}, +{'c', 145.80, -123.20, 133.60 ,-133.20, 106.20, -125.00}, +{'c', 106.20, -125.00, 105.60 ,-127.00, 109.20, -127.80}, +{'c', 109.20, -127.80, 115.60 ,-130.00, 116.00, -130.60}, +{'c', 116.00, -130.60, 136.20 ,-134.80, 143.40, -131.20}, +{'c', 143.40, -131.20, 152.60 ,-128.60, 158.80, -122.40}, +{'c', 158.80, -122.40, 170.00 ,-119.20, 173.20, -120.20}, +{'c', 173.20, -120.20, 182.00 ,-118.00, 182.40, -116.20}, +{'c', 182.40, -116.20, 188.20 ,-113.20, 186.40, -110.60}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 168.33, -108.51, 0, 0, 0, 0}, +{'c', 169.14, -107.88, 170.16 ,-107.78, 170.76, -106.97}, +{'c', 171.00, -106.66, 170.71 ,-106.33, 170.39, -106.23}, +{'c', 169.35, -105.92, 168.29 ,-106.49, 167.15, -105.90}, +{'c', 166.75, -105.69, 166.11 ,-105.87, 165.55, -106.02}, +{'c', 163.92, -106.46, 162.09 ,-106.49, 160.40, -105.80}, +{'c', 158.42, -106.93, 156.06 ,-106.34, 153.97, -107.35}, +{'c', 153.92, -107.37, 153.69 ,-107.03, 153.62, -107.05}, +{'c', 150.57, -108.20, 146.83 ,-107.92, 144.40, -110.20}, +{'c', 141.97, -110.61, 139.62 ,-111.07, 137.19, -111.75}, +{'c', 135.37, -112.26, 133.96 ,-113.25, 132.34, -114.08}, +{'c', 130.96, -114.79, 129.51 ,-115.31, 127.97, -115.69}, +{'c', 126.11, -116.14, 124.28 ,-116.03, 122.39, -116.55}, +{'c', 122.29, -116.57, 122.10 ,-116.23, 122.02, -116.25}, +{'c', 121.69, -116.36, 121.41 ,-116.94, 121.23, -116.89}, +{'c', 119.55, -116.37, 118.06 ,-117.34, 116.40, -117.00}, +{'c', 115.22, -118.22, 113.50 ,-117.98, 111.95, -118.42}, +{'c', 108.98, -119.27, 105.83 ,-118.00, 102.80, -119.00}, +{'c', 106.91, -120.84, 111.60 ,-119.61, 115.66, -121.68}, +{'c', 117.99, -122.86, 120.65 ,-121.76, 123.22, -122.52}, +{'c', 123.71, -122.67, 124.40 ,-122.87, 124.80, -122.20}, +{'c', 124.94, -122.33, 125.12 ,-122.57, 125.17, -122.55}, +{'c', 127.62, -121.39, 129.94 ,-120.11, 132.42, -119.05}, +{'c', 132.76, -118.90, 133.29 ,-119.14, 133.55, -118.93}, +{'c', 135.07, -117.72, 137.01 ,-117.82, 138.40, -116.60}, +{'c', 140.10, -117.10, 141.89 ,-116.72, 143.62, -117.35}, +{'c', 143.70, -117.37, 143.93 ,-117.03, 143.97, -117.05}, +{'c', 145.09, -117.80, 146.25 ,-117.53, 147.14, -117.23}, +{'c', 147.48, -117.11, 148.14 ,-116.86, 148.45, -116.79}, +{'c', 149.57, -116.52, 150.43 ,-116.03, 151.61, -115.85}, +{'c', 151.72, -115.83, 151.91 ,-116.17, 151.98, -116.15}, +{'c', 153.10, -115.71, 154.15 ,-115.76, 154.80, -114.60}, +{'c', 154.94, -114.73, 155.10 ,-114.97, 155.18, -114.95}, +{'c', 156.21, -114.61, 156.86 ,-113.85, 157.96, -113.61}, +{'c', 158.44, -113.51, 159.06 ,-112.88, 159.63, -112.70}, +{'c', 162.03, -111.97, 163.87 ,-110.44, 166.06, -109.55}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 91.70, -122.74, 0, 0, 0, 0}, +{'c', 89.18, -124.46, 86.81 ,-125.57, 84.37, -127.36}, +{'c', 84.19, -127.49, 83.83 ,-127.32, 83.62, -127.44}, +{'c', 82.62, -128.05, 81.73 ,-128.63, 80.75, -129.33}, +{'c', 80.21, -129.71, 79.39 ,-129.70, 78.88, -129.96}, +{'c', 76.34, -131.25, 73.71 ,-131.81, 71.20, -133.00}, +{'c', 71.88, -133.64, 73.00 ,-133.39, 73.60, -134.20}, +{'c', 73.80, -133.92, 74.03 ,-133.64, 74.39, -133.83}, +{'c', 76.06, -134.73, 77.91 ,-134.88, 79.59, -134.79}, +{'c', 81.29, -134.70, 83.01 ,-134.40, 84.79, -134.12}, +{'c', 85.10, -134.08, 85.30 ,-133.56, 85.62, -133.46}, +{'c', 87.85, -132.79, 90.23 ,-133.32, 92.35, -132.48}, +{'c', 93.94, -131.85, 95.52 ,-131.03, 96.75, -129.75}, +{'c', 97.01, -129.50, 96.68 ,-129.19, 96.40, -129.00}, +{'c', 96.79, -129.11, 97.06 ,-128.90, 97.17, -128.59}, +{'c', 97.26, -128.35, 97.26 ,-128.05, 97.17, -127.81}, +{'c', 97.06, -127.50, 96.78 ,-127.40, 96.41, -127.35}, +{'c', 95.00, -127.16, 96.77 ,-128.54, 96.07, -128.09}, +{'c', 94.80, -127.27, 95.55 ,-125.87, 94.80, -124.60}, +{'c', 94.52, -124.79, 94.29 ,-125.01, 94.40, -125.40}, +{'c', 94.64, -124.88, 94.03 ,-124.59, 93.86, -124.27}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 59.20, -115.39, 0, 0, 0, 0}, +{'c', 56.04, -116.19, 52.99 ,-116.07, 49.98, -117.35}, +{'c', 49.91, -117.37, 49.69 ,-117.03, 49.62, -117.05}, +{'c', 48.26, -117.65, 47.34 ,-118.61, 46.26, -119.66}, +{'c', 45.35, -120.55, 43.69 ,-120.16, 42.42, -120.65}, +{'c', 42.09, -120.77, 41.89 ,-121.28, 41.59, -121.32}, +{'c', 40.37, -121.48, 39.45 ,-122.43, 38.40, -123.00}, +{'c', 40.74, -123.80, 43.15 ,-123.76, 45.61, -124.15}, +{'c', 45.72, -124.17, 45.87 ,-123.84, 46.00, -123.84}, +{'c', 46.14, -123.84, 46.27 ,-124.07, 46.40, -124.20}, +{'c', 46.59, -123.92, 46.90 ,-123.59, 47.15, -123.85}, +{'c', 47.70, -124.39, 48.26 ,-124.20, 48.80, -124.16}, +{'c', 48.94, -124.15, 49.07 ,-123.84, 49.20, -123.84}, +{'c', 49.34, -123.84, 49.47 ,-124.16, 49.60, -124.16}, +{'c', 49.74, -124.16, 49.87 ,-123.84, 50.00, -123.84}, +{'c', 50.14, -123.84, 50.27 ,-124.07, 50.40, -124.20}, +{'c', 51.09, -123.42, 51.98 ,-123.97, 52.80, -123.79}, +{'c', 53.84, -123.57, 54.10 ,-122.42, 55.18, -122.12}, +{'c', 59.89, -120.82, 64.03 ,-118.67, 68.39, -116.58}, +{'c', 68.70, -116.44, 68.91 ,-116.19, 68.80, -115.80}, +{'c', 69.07, -115.80, 69.38 ,-115.89, 69.57, -115.76}, +{'c', 70.63, -115.02, 71.67 ,-114.48, 72.37, -113.38}, +{'c', 72.58, -113.04, 72.25 ,-112.63, 72.02, -112.68}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 45.34, -71.18, 0, 0, 0, 0}, +{'c', 43.75, -72.40, 43.16 ,-74.43, 42.03, -76.22}, +{'c', 41.82, -76.56, 42.09 ,-76.88, 42.41, -76.96}, +{'c', 42.97, -77.12, 43.51 ,-76.64, 43.92, -76.44}, +{'c', 45.67, -75.58, 47.20 ,-74.34, 49.20, -74.20}, +{'c', 51.19, -71.97, 55.45 ,-71.58, 55.46, -68.20}, +{'c', 55.46, -67.34, 54.03 ,-68.26, 53.60, -67.40}, +{'c', 51.15, -68.40, 48.76 ,-68.30, 46.38, -69.77}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 17.80, -123.76, 0, 0, 0, 0}, +{'c', 17.93, -123.75, 24.97 ,-123.52, 24.95, -123.41}, +{'c', 24.90, -123.10, 17.17 ,-122.05, 16.81, -122.22}, +{'c', 16.65, -122.30, 9.13 ,-119.87, 9.00, -120.00}, +{'f', 0.804000,0.469000,0.134000,1.000000,0,0 }, +{'m', 33.20, -114.00, 0, 0, 0, 0}, +{'c', 33.20, -114.00, 18.40 ,-112.20, 14.00, -111.00}, +{'c', 9.60, -109.80, -9.00 ,-102.20, -12.00, -100.20}, +{'c', -12.00, -100.20, -25.40 ,-94.80, -42.40, -74.80}, +{'c', -42.40, -74.80, -34.80 ,-78.20, -32.60, -81.00}, +{'c', -32.60, -81.00, -19.00 ,-93.60, -19.20, -91.00}, +{'c', -19.20, -91.00, -7.00 ,-99.60, -7.60, -97.40}, +{'c', -7.60, -97.40, 16.80 ,-108.60, 14.80, -105.40}, +{'c', 14.80, -105.40, 36.40 ,-110.00, 35.40, -108.00}, +{'c', 35.40, -108.00, 54.20 ,-103.60, 51.40, -103.40}, +{'c', 51.40, -103.40, 45.60 ,-102.20, 52.00, -98.60}, +{'c', 52.00, -98.60, 48.60 ,-94.20, 43.20, -98.20}, +{'c', 37.80, -102.20, 40.80 ,-100.00, 35.80, -99.00}, +{'c', 35.80, -99.00, 33.20 ,-98.20, 28.60, -102.20}, +{'c', 28.60, -102.20, 23.00 ,-106.80, 14.20, -103.20}, +{'c', 14.20, -103.20, -16.40 ,-90.60, -18.40, -90.00}, +{'c', -18.40, -90.00, -22.00 ,-87.20, -24.40, -83.60}, +{'c', -24.40, -83.60, -30.20 ,-79.20, -33.20, -77.80}, +{'c', -33.20, -77.80, -46.00 ,-66.20, -47.20, -64.80}, +{'c', -47.20, -64.80, -50.60 ,-59.60, -51.40, -59.20}, +{'c', -51.40, -59.20, -45.00 ,-63.00, -43.00, -65.00}, +{'c', -43.00, -65.00, -29.00 ,-75.00, -23.60, -75.80}, +{'c', -23.60, -75.80, -19.20 ,-78.80, -18.40, -80.20}, +{'c', -18.40, -80.20, -4.00 ,-89.40, 0.20, -89.40}, +{'c', 0.20, -89.40, 9.40 ,-84.20, 11.80, -91.20}, +{'c', 11.80, -91.20, 17.60 ,-93.00, 23.20, -91.80}, +{'c', 23.20, -91.80, 26.40 ,-94.40, 25.60, -96.60}, +{'c', 25.60, -96.60, 27.20 ,-98.40, 28.20, -94.60}, +{'c', 28.20, -94.60, 31.60 ,-91.00, 36.40, -93.00}, +{'c', 36.40, -93.00, 40.40 ,-93.20, 38.40, -90.80}, +{'c', 38.40, -90.80, 34.00 ,-87.00, 22.20, -86.80}, +{'c', 22.20, -86.80, 9.80 ,-86.20, -6.60, -78.60}, +{'c', -6.60, -78.60, -36.40 ,-68.20, -45.60, -57.80}, +{'c', -45.60, -57.80, -52.00 ,-49.00, -57.40, -47.80}, +{'c', -57.40, -47.80, -63.20 ,-47.00, -69.20, -39.60}, +{'c', -69.20, -39.60, -59.40 ,-45.40, -50.40, -45.40}, +{'c', -50.40, -45.40, -46.40 ,-47.80, -50.20, -44.20}, +{'c', -50.20, -44.20, -53.80 ,-36.60, -52.20, -31.20}, +{'c', -52.20, -31.20, -52.80 ,-26.00, -53.60, -24.40}, +{'c', -53.60, -24.40, -61.40 ,-11.60, -61.40, -9.20}, +{'c', -61.40, -6.80, -60.20 ,3.00, -59.80, 3.60}, +{'c', -59.40, 4.20, -60.80 ,2.00, -57.00, 4.40}, +{'c', -53.20, 6.80, -50.40 ,8.40, -49.60, 11.20}, +{'c', -48.80, 14.00, -51.60 ,5.80, -51.80, 4.00}, +{'c', -52.00, 2.20, -56.20 ,-5.00, -55.40, -7.40}, +{'c', -55.40, -7.40, -54.40 ,-6.40, -53.60, -5.00}, +{'c', -53.60, -5.00, -54.20 ,-5.60, -53.60, -9.20}, +{'c', -53.60, -9.20, -52.80 ,-14.40, -51.40, -17.60}, +{'c', -50.00, -20.80, -48.00 ,-24.60, -47.60, -25.40}, +{'c', -47.20, -26.20, -47.20 ,-32.00, -45.80, -29.40}, +{'l', -42.40, -26.80, 0, 0, 0, 0}, +{'c', -42.40, -26.80, -45.20 ,-29.40, -43.00, -31.60}, +{'c', -43.00, -31.60, -44.00 ,-37.20, -42.20, -39.80}, +{'c', -42.20, -39.80, -35.20 ,-48.20, -33.60, -49.20}, +{'c', -32.00, -50.20, -33.40 ,-49.80, -33.40, -49.80}, +{'c', -33.40, -49.80, -27.40 ,-54.00, -33.20, -52.40}, +{'c', -33.20, -52.40, -37.20 ,-50.80, -40.20, -50.80}, +{'c', -40.20, -50.80, -47.80 ,-48.80, -43.80, -53.00}, +{'c', -39.80, -57.20, -29.80 ,-62.60, -26.00, -62.40}, +{'l', -25.20, -60.80, 0, 0, 0, 0}, +{'l', -14.00, -63.20, 0, 0, 0, 0}, +{'l', -15.20, -62.40, 0, 0, 0, 0}, +{'c', -15.20, -62.40, -15.40 ,-62.60, -11.20, -63.00}, +{'c', -7.00, -63.40, -1.20 ,-62.00, 0.20, -63.80}, +{'c', 1.60, -65.60, 5.00 ,-66.60, 4.60, -65.20}, +{'c', 4.20, -63.80, 4.00 ,-61.80, 4.00, -61.80}, +{'c', 4.00, -61.80, 9.00 ,-67.60, 8.40, -65.40}, +{'c', 7.80, -63.20, -0.40 ,-58.00, -1.80, -51.80}, +{'l', 8.60, -60.00, 0, 0, 0, 0}, +{'l', 12.20, -63.00, 0, 0, 0, 0}, +{'c', 12.20, -63.00, 15.80 ,-60.80, 16.00, -62.40}, +{'c', 16.20, -64.00, 20.80 ,-69.80, 22.00, -69.60}, +{'c', 23.20, -69.40, 25.20 ,-72.20, 25.00, -69.60}, +{'c', 24.80, -67.00, 32.40 ,-61.60, 32.40, -61.60}, +{'c', 32.40, -61.60, 35.60 ,-63.40, 37.00, -62.00}, +{'c', 38.40, -60.60, 42.60 ,-81.80, 42.60, -81.80}, +{'l', 67.60, -92.40, 0, 0, 0, 0}, +{'l', 111.20, -95.80, 0, 0, 0, 0}, +{'l', 94.20, -102.60, 0, 0, 0, 0}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 51.40, 85.00, 0, 0, 0, 0}, +{'c', 51.40, 85.00, 36.40 ,68.20, 28.00, 65.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 24.80, 64.20, 0, 0, 0, 0}, +{'c', 24.80, 64.20, -0.40 ,56.20, -15.80, 60.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 21.20, 63.00, 0, 0, 0, 0}, +{'c', 21.20, 63.00, 4.20 ,55.80, -10.60, 53.60}, +{'c', -10.60, 53.60, -27.20 ,51.00, -43.80, 58.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 22.20, 63.40, 0, 0, 0, 0}, +{'c', 22.20, 63.40, 6.80 ,52.40, 5.80, 51.00}, +{'c', 5.80, 51.00, -1.20 ,40.00, -14.20, 39.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 20.89, 54.41, 0, 0, 0, 0}, +{'c', 22.44, 55.87, 49.40 ,84.80, 49.40, 84.80}, +{'c', 84.60, 121.40, 56.60 ,87.20, 56.60, 87.20}, +{'c', 49.00, 82.40, 39.80 ,63.60, 39.80, 63.60}, +{'c', 38.60, 60.80, 53.80 ,70.80, 53.80, 70.80}, +{'c', 57.80, 71.60, 71.40 ,90.80, 71.40, 90.80}, +{'c', 64.60, 88.40, 69.40 ,95.60, 69.40, 95.60}, +{'c', 72.20, 97.60, 92.60 ,113.20, 92.60, 113.20}, +{'c', 96.20, 117.20, 100.20 ,118.80, 100.20, 118.80}, +{'c', 114.20, 113.60, 107.80 ,126.80, 107.80, 126.80}, +{'c', 110.20, 133.60, 115.80 ,122.00, 115.80, 122.00}, +{'c', 127.00, 105.20, 110.60 ,107.60, 110.60, 107.60}, +{'c', 80.60, 110.40, 73.80 ,94.40, 73.80, 94.40}, +{'c', 71.40, 92.00, 80.20 ,94.40, 80.20, 94.40}, +{'c', 88.60, 96.40, 73.00 ,82.00, 73.00, 82.00}, +{'c', 75.40, 82.00, 84.60 ,88.80, 84.60, 88.80}, +{'c', 95.00, 98.00, 97.00 ,96.00, 97.00, 96.00}, +{'c', 115.00, 87.20, 125.40 ,94.80, 125.40, 94.80}, +{'c', 127.40, 96.40, 121.80 ,103.20, 123.40, 108.40}, +{'c', 125.00, 113.60, 129.80 ,126.00, 129.80, 126.00}, +{'c', 127.40, 127.60, 127.80 ,138.40, 127.80, 138.40}, +{'c', 144.60, 161.60, 135.00 ,159.60, 135.00, 159.60}, +{'c', 119.40, 159.20, 134.20 ,166.80, 134.20, 166.80}, +{'c', 137.40, 168.80, 146.20 ,176.00, 146.20, 176.00}, +{'c', 143.40, 174.80, 141.80 ,180.00, 141.80, 180.00}, +{'c', 146.60, 184.00, 143.80 ,188.80, 143.80, 188.80}, +{'c', 137.80, 190.00, 136.60 ,194.00, 136.60, 194.00}, +{'c', 143.40, 202.00, 133.40 ,202.40, 133.40, 202.40}, +{'c', 137.00, 206.80, 132.20 ,218.80, 132.20, 218.80}, +{'c', 127.40, 218.80, 121.00 ,224.40, 121.00, 224.40}, +{'c', 123.40, 229.20, 113.00 ,234.80, 113.00, 234.80}, +{'c', 104.60, 236.40, 107.40 ,243.20, 107.40, 243.20}, +{'c', 99.40, 249.20, 97.00 ,265.20, 97.00, 265.20}, +{'c', 96.20, 275.60, 93.80 ,278.80, 99.00, 276.80}, +{'c', 104.20, 274.80, 103.40 ,262.40, 103.40, 262.40}, +{'c', 98.60, 246.80, 141.40 ,230.80, 141.40, 230.80}, +{'c', 145.40, 229.20, 146.20 ,224.00, 146.20, 224.00}, +{'c', 148.20, 224.40, 157.00 ,232.00, 157.00, 232.00}, +{'c', 164.60, 243.20, 165.00 ,234.00, 165.00, 234.00}, +{'c', 166.20, 230.40, 164.60 ,224.40, 164.60, 224.40}, +{'c', 170.60, 202.80, 156.60 ,196.40, 156.60, 196.40}, +{'c', 146.60, 162.80, 160.60 ,171.20, 160.60, 171.20}, +{'c', 163.40, 176.80, 174.20 ,182.00, 174.20, 182.00}, +{'l', 177.80, 179.60, 0, 0, 0, 0}, +{'c', 176.20, 174.80, 184.60 ,168.80, 184.60, 168.80}, +{'c', 187.40, 175.20, 193.40 ,167.20, 193.40, 167.20}, +{'c', 197.00, 142.80, 209.40 ,157.20, 209.40, 157.20}, +{'c', 213.40, 158.40, 214.60 ,151.60, 214.60, 151.60}, +{'c', 218.20, 141.20, 214.60 ,127.60, 214.60, 127.60}, +{'c', 218.20, 127.20, 227.80 ,133.20, 227.80, 133.20}, +{'c', 230.60, 129.60, 221.40 ,112.80, 225.40, 115.20}, +{'c', 229.40, 117.60, 233.80 ,119.20, 233.80, 119.20}, +{'c', 234.60, 117.20, 224.60 ,104.80, 224.60, 104.80}, +{'c', 220.20, 102.00, 215.00 ,81.60, 215.00, 81.60}, +{'c', 222.20, 85.20, 212.20 ,70.00, 212.20, 70.00}, +{'c', 212.20, 66.80, 218.20 ,55.60, 218.20, 55.60}, +{'c', 217.40, 48.80, 218.20 ,49.20, 218.20, 49.20}, +{'c', 221.00, 50.40, 229.00 ,52.00, 222.20, 45.60}, +{'c', 215.40, 39.20, 223.00 ,34.40, 223.00, 34.40}, +{'c', 227.40, 31.60, 213.80 ,32.00, 213.80, 32.00}, +{'c', 208.60, 27.60, 209.00 ,23.60, 209.00, 23.60}, +{'c', 217.00, 25.60, 202.60 ,11.20, 200.20, 7.60}, +{'c', 197.80, 4.00, 207.40 ,-1.20, 207.40, -1.20}, +{'c', 220.60, -4.80, 209.00 ,-8.00, 209.00, -8.00}, +{'c', 189.40, -7.60, 200.20 ,-18.40, 200.20, -18.40}, +{'c', 206.20, -18.00, 204.60 ,-20.40, 204.60, -20.40}, +{'c', 199.40, -21.60, 189.80 ,-28.00, 189.80, -28.00}, +{'c', 185.80, -31.60, 189.40 ,-30.80, 189.40, -30.80}, +{'c', 206.20, -29.60, 177.40 ,-40.80, 177.40, -40.80}, +{'c', 185.40, -40.80, 167.40 ,-51.20, 167.40, -51.20}, +{'c', 165.40, -52.80, 162.20 ,-60.40, 162.20, -60.40}, +{'c', 156.20, -65.60, 151.40 ,-72.40, 151.40, -72.40}, +{'c', 151.00, -76.80, 146.20 ,-81.60, 146.20, -81.60}, +{'c', 134.60, -95.20, 129.00 ,-94.80, 129.00, -94.80}, +{'c', 114.20, -98.40, 109.00 ,-97.60, 109.00, -97.60}, +{'l', 56.20, -93.20, 0, 0, 0, 0}, +{'c', 29.80, -80.40, 37.60 ,-59.40, 37.60, -59.40}, +{'c', 44.00, -51.00, 53.20 ,-54.80, 53.20, -54.80}, +{'c', 57.80, -61.00, 69.40 ,-58.80, 69.40, -58.80}, +{'c', 89.80, -55.60, 87.20 ,-59.20, 87.20, -59.20}, +{'c', 84.80, -63.80, 68.60 ,-70.00, 68.40, -70.60}, +{'c', 68.20, -71.20, 59.40 ,-74.60, 59.40, -74.60}, +{'c', 56.40, -75.80, 52.00 ,-85.00, 52.00, -85.00}, +{'c', 48.80, -88.40, 64.60 ,-82.60, 64.60, -82.60}, +{'c', 63.40, -81.60, 70.80 ,-77.60, 70.80, -77.60}, +{'c', 88.20, -78.60, 98.80 ,-67.80, 98.80, -67.80}, +{'c', 109.60, -51.20, 109.80 ,-59.40, 109.80, -59.40}, +{'c', 112.60, -68.80, 100.80 ,-90.00, 100.80, -90.00}, +{'c', 101.20, -92.00, 109.40 ,-85.40, 109.40, -85.40}, +{'c', 110.80, -87.40, 111.60 ,-81.60, 111.60, -81.60}, +{'c', 111.80, -79.20, 115.60 ,-71.20, 115.60, -71.20}, +{'c', 118.40, -58.20, 122.00 ,-65.60, 122.00, -65.60}, +{'l', 126.60, -56.20, 0, 0, 0, 0}, +{'c', 128.00, -53.60, 122.00 ,-46.00, 122.00, -46.00}, +{'c', 121.80, -43.20, 122.60 ,-43.40, 117.00, -35.80}, +{'c', 111.40, -28.20, 114.80 ,-23.80, 114.80, -23.80}, +{'c', 113.40, -17.20, 122.20 ,-17.60, 122.20, -17.60}, +{'c', 124.80, -15.40, 128.20 ,-15.40, 128.20, -15.40}, +{'c', 130.00, -13.40, 132.40 ,-14.00, 132.40, -14.00}, +{'c', 134.00, -17.80, 140.20 ,-15.80, 140.20, -15.80}, +{'c', 141.60, -18.20, 149.80 ,-18.60, 149.80, -18.60}, +{'c', 150.80, -21.20, 151.20 ,-22.80, 154.60, -23.40}, +{'c', 158.00, -24.00, 133.40 ,-67.00, 133.40, -67.00}, +{'c', 139.80, -67.80, 131.60 ,-80.20, 131.60, -80.20}, +{'c', 129.40, -86.80, 140.80 ,-72.20, 143.00, -70.80}, +{'c', 145.20, -69.40, 146.20 ,-67.20, 144.60, -67.40}, +{'c', 143.00, -67.60, 141.20 ,-65.40, 142.60, -65.20}, +{'c', 144.00, -65.00, 157.00 ,-50.00, 160.40, -39.80}, +{'c', 163.80, -29.60, 169.80 ,-25.60, 176.00, -19.60}, +{'c', 182.20, -13.60, 181.40 ,10.60, 181.40, 10.60}, +{'c', 181.00, 19.40, 187.00 ,30.00, 187.00, 30.00}, +{'c', 189.00, 33.80, 184.80 ,52.00, 184.80, 52.00}, +{'c', 182.80, 54.20, 184.20 ,55.00, 184.20, 55.00}, +{'c', 185.20, 56.20, 192.00 ,69.40, 192.00, 69.40}, +{'c', 190.20, 69.20, 193.80 ,72.80, 193.80, 72.80}, +{'c', 199.00, 78.80, 192.60 ,75.80, 192.60, 75.80}, +{'c', 186.60, 74.20, 193.60 ,84.00, 193.60, 84.00}, +{'c', 194.80, 85.80, 185.80 ,81.20, 185.80, 81.20}, +{'c', 176.60, 80.60, 188.20 ,87.80, 188.20, 87.80}, +{'c', 196.80, 95.00, 185.40 ,90.60, 185.40, 90.60}, +{'c', 180.80, 88.80, 184.00 ,95.60, 184.00, 95.60}, +{'c', 187.20, 97.20, 204.40 ,104.20, 204.40, 104.20}, +{'c', 204.80, 108.00, 201.80 ,113.00, 201.80, 113.00}, +{'c', 202.20, 117.00, 200.00 ,120.40, 200.00, 120.40}, +{'c', 198.80, 128.60, 198.20 ,129.40, 198.20, 129.40}, +{'c', 194.00, 129.60, 186.60 ,143.40, 186.60, 143.40}, +{'c', 184.80, 146.00, 174.60 ,158.00, 174.60, 158.00}, +{'c', 172.60, 165.00, 154.60 ,157.80, 154.60, 157.80}, +{'c', 148.00, 161.20, 150.00 ,157.80, 150.00, 157.80}, +{'c', 149.60, 155.60, 154.40 ,149.60, 154.40, 149.60}, +{'c', 161.40, 147.00, 158.80 ,136.20, 158.80, 136.20}, +{'c', 162.80, 134.80, 151.60 ,132.00, 151.80, 130.80}, +{'c', 152.00, 129.60, 157.80 ,128.20, 157.80, 128.20}, +{'c', 165.80, 126.20, 161.40 ,123.80, 161.40, 123.80}, +{'c', 160.80, 119.80, 163.80 ,114.20, 163.80, 114.20}, +{'c', 175.40, 113.40, 163.80 ,97.20, 163.80, 97.20}, +{'c', 153.00, 89.60, 152.00 ,83.80, 152.00, 83.80}, +{'c', 164.60, 75.60, 156.40 ,63.20, 156.60, 59.60}, +{'c', 156.80, 56.00, 158.00 ,34.40, 158.00, 34.40}, +{'c', 156.00, 28.20, 153.00 ,14.60, 153.00, 14.60}, +{'c', 155.20, 9.40, 162.60 ,-3.20, 162.60, -3.20}, +{'c', 165.40, -7.40, 174.20 ,-12.20, 172.00, -15.20}, +{'c', 169.80, -18.20, 162.00 ,-16.40, 162.00, -16.40}, +{'c', 154.20, -17.80, 154.80 ,-12.60, 154.80, -12.60}, +{'c', 153.20, -11.60, 152.40 ,-6.60, 152.40, -6.60}, +{'c', 151.68, 1.33, 142.80 ,7.60, 142.80, 7.60}, +{'c', 131.60, 13.80, 140.80 ,17.80, 140.80, 17.80}, +{'c', 146.80, 24.40, 137.00 ,24.60, 137.00, 24.60}, +{'c', 126.00, 22.80, 134.20 ,33.00, 134.20, 33.00}, +{'c', 145.00, 45.80, 142.00 ,48.60, 142.00, 48.60}, +{'c', 131.80, 49.60, 144.40 ,58.80, 144.40, 58.80}, +{'c', 144.40, 58.80, 143.60 ,56.80, 143.80, 58.60}, +{'c', 144.00, 60.40, 147.00 ,64.60, 147.80, 66.60}, +{'c', 148.60, 68.60, 144.60 ,68.80, 144.60, 68.80}, +{'c', 145.20, 78.40, 129.80 ,74.20, 129.80, 74.20}, +{'c', 129.80, 74.20, 129.80 ,74.20, 128.20, 74.40}, +{'c', 126.60, 74.60, 115.40 ,73.80, 109.60, 71.60}, +{'c', 103.80, 69.40, 97.00 ,69.40, 97.00, 69.40}, +{'c', 97.00, 69.40, 93.00 ,71.20, 85.40, 71.00}, +{'c', 77.80, 70.80, 69.80 ,73.60, 69.80, 73.60}, +{'c', 65.40, 73.20, 74.00 ,68.80, 74.20, 69.00}, +{'c', 74.40, 69.20, 80.00 ,63.60, 72.00, 64.20}, +{'c', 50.20, 65.83, 39.40 ,55.60, 39.40, 55.60}, +{'c', 37.40, 54.20, 34.80 ,51.40, 34.80, 51.40}, +{'c', 24.80, 49.40, 36.20 ,63.80, 36.20, 63.80}, +{'c', 37.40, 65.20, 36.00 ,66.20, 36.00, 66.20}, +{'c', 35.20, 64.60, 27.40 ,59.20, 27.40, 59.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -3.00, 42.80, 0, 0, 0, 0}, +{'c', -3.00, 42.80, 8.60 ,48.40, 11.20, 51.20}, +{'c', 13.80, 54.00, 27.80 ,65.40, 27.80, 65.40}, +{'c', 27.80, 65.40, 22.40 ,63.40, 19.80, 61.60}, +{'c', 17.20, 59.80, 6.40 ,51.60, 6.40, 51.60}, +{'f', 0.268000,0.000000,0.000000,1.000000,0,0 }, +{'m', -61.01, 11.60, 0, 0, 0, 0}, +{'c', -60.67, 11.46, -61.20 ,8.74, -61.40, 8.20}, +{'c', -62.42, 5.47, -71.40 ,4.00, -71.40, 4.00}, +{'c', -71.63, 5.37, -71.68 ,6.96, -71.58, 8.60}, +{'f', 0.603000,0.804000,0.201000,1.000000,0,0 }, +{'m', -61.01, 11.40, 0, 0, 0, 0}, +{'c', -61.46, 11.56, -61.02 ,8.67, -61.20, 8.20}, +{'c', -62.22, 5.47, -71.40 ,3.90, -71.40, 3.90}, +{'c', -71.63, 5.26, -71.68 ,6.86, -71.58, 8.50}, +{'f', 0.402000,0.603000,0.000000,1.000000,0,0 }, +{'m', -65.40, 11.55, 0, 0, 0, 0}, +{'c', -66.03, 11.55, -66.53 ,10.41, -66.53, 9.00}, +{'c', -66.53, 7.59, -66.03 ,6.46, -65.40, 6.46}, +{'c', -64.78, 6.46, -64.27 ,7.59, -64.27, 9.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -111.00, 109.60, 0, 0, 0, 0}, +{'c', -111.00, 109.60, -116.60 ,119.60, -91.80, 113.60}, +{'c', -91.80, 113.60, -77.80 ,112.40, -75.40, 110.00}, +{'c', -74.20, 110.80, -65.83 ,113.73, -63.00, 114.40}, +{'c', -56.20, 116.00, -47.80 ,106.00, -47.80, 106.00}, +{'c', -47.80, 106.00, -43.20 ,95.50, -40.40, 95.50}, +{'c', -37.60, 95.50, -40.80 ,97.10, -40.80, 97.10}, +{'c', -40.80, 97.10, -47.40 ,107.20, -47.00, 108.80}, +{'c', -47.00, 108.80, -52.20 ,128.80, -68.20, 129.60}, +{'c', -68.20, 129.60, -84.35 ,130.55, -83.00, 136.40}, +{'c', -83.00, 136.40, -74.20 ,134.00, -71.80, 136.40}, +{'c', -71.80, 136.40, -61.00 ,136.00, -69.00, 142.40}, +{'l', -75.80, 154.00, 0, 0, 0, 0}, +{'c', -75.80, 154.00, -75.66 ,157.92, -85.80, 154.40}, +{'c', -95.60, 151.00, -105.90 ,138.10, -105.90, 138.10}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -112.20, 113.60, 0, 0, 0, 0}, +{'c', -112.20, 113.60, -114.20 ,123.20, -77.40, 112.80}, +{'c', -77.40, 112.80, -73.00 ,112.80, -70.60, 113.60}, +{'c', -68.20, 114.40, -56.20 ,117.20, -54.20, 116.00}, +{'c', -54.20, 116.00, -61.40 ,129.60, -73.00, 128.00}, +{'c', -73.00, 128.00, -86.20 ,129.60, -85.80, 134.40}, +{'c', -85.80, 134.40, -81.80 ,141.60, -77.00, 144.00}, +{'c', -77.00, 144.00, -74.20 ,146.40, -74.60, 149.60}, +{'c', -75.00, 152.80, -77.80 ,154.40, -79.80, 155.20}, +{'c', -81.80, 156.00, -85.00 ,152.80, -86.60, 152.80}, +{'c', -88.20, 152.80, -96.60 ,146.40, -101.00, 141.60}, +{'c', -105.40, 136.80, -113.80 ,124.80, -113.40, 122.00}, +{'f', 0.938000,0.603000,0.603000,1.000000,0,0 }, +{'m', -109.00, 131.05, 0, 0, 0, 0}, +{'c', -106.40, 135.00, -103.20 ,139.20, -101.00, 141.60}, +{'c', -96.60, 146.40, -88.20 ,152.80, -86.60, 152.80}, +{'c', -85.00, 152.80, -81.80 ,156.00, -79.80, 155.20}, +{'c', -77.80, 154.40, -75.00 ,152.80, -74.60, 149.60}, +{'c', -74.20, 146.40, -77.00 ,144.00, -77.00, 144.00}, +{'c', -80.07, 142.47, -82.81 ,138.98, -84.39, 136.65}, +{'c', -84.39, 136.65, -84.20 ,139.20, -89.40, 138.40}, +{'c', -94.60, 137.60, -99.80 ,134.80, -101.40, 131.60}, +{'c', -103.00, 128.40, -105.40 ,126.00, -103.80, 129.60}, +{'c', -102.20, 133.20, -99.80 ,136.80, -98.20, 137.20}, +{'c', -96.60, 137.60, -97.00 ,138.80, -99.40, 138.40}, +{'f', 0.737000,0.402000,0.402000,1.000000,0,0 }, +{'m', -111.60, 110.00, 0, 0, 0, 0}, +{'c', -111.60, 110.00, -109.80 ,96.40, -108.60, 92.40}, +{'c', -108.60, 92.40, -109.40 ,85.60, -107.00, 81.40}, +{'c', -104.60, 77.20, -102.60 ,71.00, -99.60, 65.60}, +{'c', -96.60, 60.20, -96.40 ,56.20, -92.40, 54.60}, +{'c', -88.40, 53.00, -82.40 ,44.40, -79.60, 43.40}, +{'c', -76.80, 42.40, -77.00 ,43.20, -77.00, 43.20}, +{'c', -77.00, 43.20, -70.20 ,28.40, -56.60, 32.40}, +{'c', -56.60, 32.40, -72.80 ,29.60, -57.00, 20.20}, +{'c', -57.00, 20.20, -61.80 ,21.30, -58.50, 14.30}, +{'c', -56.30, 9.63, -56.80 ,16.40, -67.80, 28.20}, +{'c', -67.80, 28.20, -72.80 ,36.80, -78.00, 39.80}, +{'c', -83.20, 42.80, -95.20 ,49.80, -96.40, 53.60}, +{'c', -97.60, 57.40, -100.80 ,63.20, -102.80, 64.80}, +{'c', -104.80, 66.40, -107.60 ,70.60, -108.00, 74.00}, +{'c', -108.00, 74.00, -109.20 ,78.00, -110.60, 79.20}, +{'c', -112.00, 80.40, -112.20 ,83.60, -112.20, 85.60}, +{'c', -112.20, 87.60, -114.20 ,90.40, -114.00, 92.80}, +{'c', -114.00, 92.80, -113.20 ,111.80, -113.60, 113.80}, +{'f', 0.603000,0.134000,0.000000,1.000000,0,0 }, +{'m', -120.20, 114.60, 0, 0, 0, 0}, +{'c', -120.20, 114.60, -122.20 ,113.20, -126.60, 119.20}, +{'c', -126.60, 119.20, -119.30 ,152.20, -119.30, 153.60}, +{'c', -119.30, 153.60, -118.20 ,151.50, -119.50, 144.30}, +{'c', -120.80, 137.10, -121.70 ,124.40, -121.70, 124.40}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -98.60, 54.00, 0, 0, 0, 0}, +{'c', -98.60, 54.00, -116.20 ,57.20, -115.80, 86.40}, +{'l', -116.60, 111.20, 0, 0, 0, 0}, +{'c', -116.60, 111.20, -117.80 ,85.60, -119.00, 84.00}, +{'c', -120.20, 82.40, -116.20 ,71.20, -119.40, 77.20}, +{'c', -119.40, 77.20, -133.40 ,91.20, -125.40, 112.40}, +{'c', -125.40, 112.40, -123.90 ,115.70, -126.90, 111.10}, +{'c', -126.90, 111.10, -131.50 ,98.50, -130.40, 92.10}, +{'c', -130.40, 92.10, -130.20 ,89.90, -128.30, 87.10}, +{'c', -128.30, 87.10, -119.70 ,75.40, -117.00, 73.10}, +{'c', -117.00, 73.10, -115.20 ,58.70, -99.80, 53.50}, +{'f', 0.603000,0.134000,0.000000,1.000000,0,0 }, +{'m', 40.80, -12.20, 0, 0, 0, 0}, +{'c', 41.46, -12.55, 41.45 ,-13.52, 42.03, -13.70}, +{'c', 43.18, -14.04, 43.34 ,-15.11, 43.86, -15.89}, +{'c', 44.73, -17.21, 44.93 ,-18.74, 45.51, -20.23}, +{'c', 45.78, -20.93, 45.81 ,-21.89, 45.50, -22.55}, +{'c', 44.32, -25.03, 43.62 ,-27.48, 42.18, -29.91}, +{'c', 41.91, -30.36, 41.65 ,-31.15, 41.45, -31.75}, +{'c', 40.98, -33.13, 39.73 ,-34.12, 38.87, -35.44}, +{'c', 38.58, -35.88, 39.10 ,-36.81, 38.39, -36.89}, +{'c', 37.49, -37.00, 36.04 ,-37.58, 35.81, -36.55}, +{'c', 35.22, -33.97, 36.23 ,-31.44, 37.20, -29.00}, +{'c', 36.42, -28.31, 36.75 ,-27.39, 36.90, -26.62}, +{'c', 37.61, -23.01, 36.42 ,-19.66, 35.66, -16.19}, +{'c', 35.63, -16.08, 35.97 ,-15.89, 35.95, -15.82}, +{'c', 34.72, -13.14, 33.27 ,-10.69, 31.45, -8.31}, +{'c', 30.70, -7.32, 29.82 ,-6.40, 29.33, -5.34}, +{'c', 28.96, -4.55, 28.55 ,-3.59, 28.80, -2.60}, +{'c', 25.36, 0.18, 23.11 ,4.03, 20.50, 7.87}, +{'c', 20.04, 8.55, 20.33 ,9.76, 20.88, 10.03}, +{'c', 21.70, 10.43, 22.65 ,9.40, 23.12, 8.56}, +{'c', 23.51, 7.86, 23.86 ,7.21, 24.36, 6.57}, +{'c', 24.49, 6.39, 24.31 ,5.97, 24.45, 5.85}, +{'c', 27.08, 3.50, 28.75 ,0.57, 31.20, -1.80}, +{'c', 33.15, -2.13, 34.69 ,-3.13, 36.44, -4.14}, +{'c', 36.74, -4.32, 37.27 ,-4.07, 37.56, -4.26}, +{'c', 39.31, -5.44, 39.31 ,-7.48, 39.41, -9.39}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 31.96, -16.67, 0, 0, 0, 0}, +{'c', 32.08, -16.74, 31.93 ,-17.17, 32.04, -17.38}, +{'c', 32.20, -17.71, 32.60 ,-17.89, 32.76, -18.22}, +{'c', 32.87, -18.43, 32.71 ,-18.81, 32.85, -18.96}, +{'c', 35.18, -21.40, 35.44 ,-24.43, 34.40, -27.40}, +{'c', 35.42, -28.02, 35.48 ,-29.28, 35.06, -30.13}, +{'c', 34.21, -31.83, 34.01 ,-33.76, 33.04, -35.30}, +{'c', 32.24, -36.57, 30.66 ,-37.81, 29.29, -36.51}, +{'c', 28.87, -36.11, 28.55 ,-35.32, 28.82, -34.61}, +{'c', 28.89, -34.45, 29.17 ,-34.30, 29.15, -34.22}, +{'c', 29.04, -33.89, 28.49 ,-33.67, 28.49, -33.40}, +{'c', 28.46, -31.90, 27.50 ,-30.39, 28.13, -29.06}, +{'c', 28.91, -27.43, 29.72 ,-25.58, 30.40, -23.80}, +{'c', 29.17, -21.68, 30.20 ,-19.23, 28.45, -17.36}, +{'c', 28.31, -17.21, 28.32 ,-16.83, 28.44, -16.62}, +{'c', 28.73, -16.14, 29.14 ,-15.73, 29.62, -15.44}, +{'c', 29.83, -15.32, 30.18 ,-15.32, 30.38, -15.44}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 94.77, -26.98, 0, 0, 0, 0}, +{'c', 96.16, -25.18, 96.45 ,-22.39, 94.40, -21.00}, +{'c', 94.95, -17.69, 98.30 ,-19.67, 100.40, -20.20}, +{'c', 100.29, -20.59, 100.52 ,-20.93, 100.80, -20.94}, +{'c', 101.86, -20.95, 102.54 ,-21.98, 103.60, -21.80}, +{'c', 104.03, -23.36, 105.67 ,-24.06, 106.32, -25.44}, +{'c', 108.04, -29.13, 107.45 ,-33.41, 104.87, -36.65}, +{'c', 104.67, -36.91, 104.88 ,-37.42, 104.76, -37.79}, +{'c', 104.00, -40.00, 101.94 ,-40.31, 100.00, -41.00}, +{'c', 98.82, -44.88, 98.16 ,-48.91, 96.40, -52.60}, +{'c', 94.79, -52.85, 94.09 ,-54.59, 92.75, -55.31}, +{'c', 91.42, -56.03, 90.85 ,-54.45, 90.89, -53.40}, +{'c', 90.90, -53.20, 91.35 ,-52.97, 91.18, -52.61}, +{'c', 91.11, -52.45, 90.84 ,-52.33, 90.84, -52.20}, +{'c', 90.85, -52.06, 91.07 ,-51.93, 91.20, -51.80}, +{'c', 90.28, -50.98, 88.86 ,-50.50, 88.56, -49.36}, +{'c', 87.61, -45.65, 90.18 ,-42.52, 91.85, -39.32}, +{'c', 92.44, -38.19, 91.71 ,-36.92, 90.95, -35.71}, +{'c', 90.51, -35.01, 90.62 ,-33.89, 90.89, -33.03}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 57.61, -8.59, 0, 0, 0, 0}, +{'c', 56.12, -6.74, 52.71 ,-4.17, 55.63, -2.24}, +{'c', 55.82, -2.11, 56.19 ,-2.11, 56.37, -2.24}, +{'c', 58.39, -3.81, 60.39 ,-4.71, 62.83, -5.29}, +{'c', 62.95, -5.32, 63.22 ,-4.86, 63.59, -5.02}, +{'c', 65.21, -5.72, 67.22 ,-5.66, 68.40, -7.00}, +{'c', 72.17, -6.78, 75.73 ,-7.89, 79.12, -9.20}, +{'c', 80.28, -9.65, 81.55 ,-10.21, 82.75, -10.71}, +{'c', 84.13, -11.29, 85.33 ,-12.21, 86.45, -13.35}, +{'c', 86.58, -13.49, 86.93 ,-13.40, 87.20, -13.40}, +{'c', 87.16, -14.26, 88.12 ,-14.39, 88.37, -15.01}, +{'c', 88.46, -15.24, 88.31 ,-15.64, 88.44, -15.74}, +{'c', 90.58, -17.37, 91.50 ,-19.39, 90.33, -21.77}, +{'c', 90.05, -22.34, 89.80 ,-22.96, 89.23, -23.44}, +{'c', 88.15, -24.35, 87.05 ,-23.50, 86.00, -23.80}, +{'c', 85.84, -23.17, 85.11 ,-23.34, 84.73, -23.15}, +{'c', 83.87, -22.71, 82.53 ,-23.29, 81.67, -22.85}, +{'c', 80.31, -22.16, 79.07 ,-21.99, 77.65, -21.61}, +{'c', 77.34, -21.53, 76.56 ,-21.63, 76.40, -21.00}, +{'c', 76.27, -21.13, 76.12 ,-21.37, 76.01, -21.35}, +{'c', 74.10, -20.95, 72.84 ,-20.74, 71.54, -19.04}, +{'c', 71.44, -18.91, 71.00 ,-19.09, 70.84, -18.95}, +{'c', 69.88, -18.15, 69.48 ,-16.91, 68.38, -16.24}, +{'c', 68.17, -16.12, 67.82 ,-16.29, 67.63, -16.16}, +{'c', 66.98, -15.73, 66.62 ,-15.09, 65.97, -14.64}, +{'c', 65.64, -14.41, 65.25 ,-14.73, 65.28, -14.99}, +{'c', 65.52, -16.94, 66.17 ,-18.72, 65.60, -20.60}, +{'c', 67.68, -23.12, 70.19 ,-25.07, 72.00, -27.80}, +{'c', 72.02, -29.97, 72.71 ,-32.11, 72.59, -34.19}, +{'c', 72.58, -34.38, 72.30 ,-35.12, 72.17, -35.46}, +{'c', 71.86, -36.32, 72.76 ,-37.38, 71.92, -38.11}, +{'c', 70.52, -39.31, 69.22 ,-38.43, 68.40, -37.00}, +{'c', 66.56, -36.61, 64.50 ,-35.92, 62.92, -37.15}, +{'c', 61.91, -37.94, 61.33 ,-38.84, 60.53, -39.90}, +{'c', 59.55, -41.20, 59.88 ,-42.64, 59.95, -44.20}, +{'c', 59.96, -44.33, 59.65 ,-44.47, 59.65, -44.60}, +{'c', 59.65, -44.73, 59.87 ,-44.87, 60.00, -45.00}, +{'c', 59.29, -45.63, 59.02 ,-46.68, 58.00, -47.00}, +{'c', 58.30, -48.09, 57.63 ,-48.98, 56.76, -49.28}, +{'c', 54.76, -49.97, 53.09 ,-48.06, 51.19, -47.98}, +{'c', 50.68, -47.97, 50.21 ,-49.00, 49.56, -49.33}, +{'c', 49.13, -49.54, 48.43 ,-49.58, 48.07, -49.31}, +{'c', 47.38, -48.81, 46.79 ,-48.69, 46.03, -48.49}, +{'c', 44.41, -48.05, 43.14 ,-46.96, 41.66, -46.10}, +{'c', 40.17, -45.25, 39.22 ,-43.81, 38.14, -42.49}, +{'c', 37.20, -41.34, 37.06 ,-38.92, 38.48, -38.42}, +{'c', 40.32, -37.77, 41.63 ,-40.48, 43.59, -40.15}, +{'c', 43.90, -40.10, 44.11 ,-39.79, 44.00, -39.40}, +{'c', 44.39, -39.29, 44.61 ,-39.52, 44.80, -39.80}, +{'c', 45.66, -38.78, 46.82 ,-38.44, 47.76, -37.57}, +{'c', 48.73, -36.67, 50.48 ,-37.09, 51.49, -36.09}, +{'c', 53.02, -34.59, 52.46 ,-31.91, 54.40, -30.60}, +{'c', 53.81, -29.29, 53.21 ,-28.01, 52.87, -26.58}, +{'c', 52.59, -25.38, 53.58 ,-24.18, 54.80, -24.27}, +{'c', 56.05, -24.36, 56.31 ,-25.12, 56.80, -26.20}, +{'c', 57.07, -25.93, 57.54 ,-25.64, 57.49, -25.42}, +{'c', 57.04, -23.03, 56.01 ,-21.04, 55.55, -18.61}, +{'c', 55.49, -18.29, 55.19 ,-18.09, 54.80, -18.20}, +{'c', 54.33, -14.05, 50.28 ,-11.66, 47.73, -8.49}, +{'c', 47.33, -7.99, 47.33 ,-6.74, 47.74, -6.34}, +{'c', 49.14, -4.95, 51.10 ,-6.50, 52.80, -7.00}, +{'c', 53.01, -8.21, 53.87 ,-9.15, 55.20, -9.09}, +{'c', 55.46, -9.08, 55.70 ,-9.62, 56.02, -9.75}, +{'c', 56.37, -9.89, 56.87 ,-9.67, 57.16, -9.87}, +{'c', 58.88, -11.06, 60.29 ,-12.17, 62.03, -13.36}, +{'c', 62.22, -13.49, 62.57 ,-13.33, 62.78, -13.44}, +{'c', 63.11, -13.60, 63.29 ,-13.98, 63.62, -14.17}, +{'c', 63.97, -14.37, 64.21 ,-14.08, 64.40, -13.80}, +{'c', 63.75, -13.45, 63.75 ,-12.49, 63.17, -12.29}, +{'c', 62.39, -12.02, 61.83 ,-11.51, 61.16, -11.06}, +{'c', 60.87, -10.87, 60.21 ,-11.12, 60.10, -10.94}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 2.20, -58.00, 0, 0, 0, 0}, +{'c', 2.20, -58.00, -7.04 ,-60.87, -18.20, -35.20}, +{'c', -18.20, -35.20, -20.60 ,-30.00, -23.00, -28.00}, +{'c', -25.40, -26.00, -36.60 ,-22.40, -38.60, -18.40}, +{'l', -49.00, -2.40, 0, 0, 0, 0}, +{'c', -49.00, -2.40, -34.20 ,-18.40, -31.00, -20.80}, +{'c', -31.00, -20.80, -23.00 ,-29.20, -26.20, -22.40}, +{'c', -26.20, -22.40, -40.20 ,-11.60, -39.00, -2.40}, +{'c', -39.00, -2.40, -44.60 ,12.00, -45.40, 14.00}, +{'c', -45.40, 14.00, -29.40 ,-18.00, -27.00, -19.20}, +{'c', -24.60, -20.40, -23.40 ,-20.40, -24.60, -16.80}, +{'c', -25.80, -13.20, -26.20 ,3.20, -29.00, 5.20}, +{'c', -29.00, 5.20, -21.00 ,-15.20, -21.80, -18.40}, +{'c', -21.80, -18.40, -18.60 ,-22.00, -16.20, -16.80}, +{'l', -17.40, -0.80, 0, 0, 0, 0}, +{'l', -13.00, 11.20, 0, 0, 0, 0}, +{'c', -13.00, 11.20, -15.40 ,0.00, -13.80, -15.60}, +{'c', -13.80, -15.60, -15.80 ,-26.00, -11.80, -20.40}, +{'c', -7.80, -14.80, 1.80 ,-8.80, 1.80, -4.00}, +{'c', 1.80, -4.00, -3.40 ,-21.60, -12.60, -26.40}, +{'l', -16.60, -20.40, 0, 0, 0, 0}, +{'l', -17.80, -22.40, 0, 0, 0, 0}, +{'c', -17.80, -22.40, -21.40 ,-23.20, -17.00, -30.00}, +{'c', -12.60, -36.80, -13.00 ,-37.60, -13.00, -37.60}, +{'c', -13.00, -37.60, -6.60 ,-30.40, -5.00, -30.40}, +{'c', -5.00, -30.40, 8.20 ,-38.00, 9.40, -13.60}, +{'c', 9.40, -13.60, 16.20 ,-28.00, 7.00, -34.80}, +{'c', 7.00, -34.80, -7.80 ,-36.80, -6.60, -42.00}, +{'l', 0.60, -54.40, 0, 0, 0, 0}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -17.80, -41.60, 0, 0, 0, 0}, +{'c', -17.80, -41.60, -30.60 ,-41.60, -33.80, -36.40}, +{'l', -41.00, -26.80, 0, 0, 0, 0}, +{'c', -41.00, -26.80, -23.80 ,-36.80, -19.80, -38.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -57.80, -35.20, 0, 0, 0, 0}, +{'c', -57.80, -35.20, -59.80 ,-34.00, -60.20, -31.20}, +{'c', -60.60, -28.40, -63.00 ,-28.00, -62.20, -25.20}, +{'c', -61.40, -22.40, -59.40 ,-20.00, -59.40, -24.00}, +{'c', -59.40, -28.00, -57.80 ,-30.00, -57.00, -31.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -66.60, 26.00, 0, 0, 0, 0}, +{'c', -66.60, 26.00, -75.00 ,22.00, -78.20, 18.40}, +{'c', -81.40, 14.80, -80.95 ,19.97, -85.80, 19.60}, +{'c', -91.65, 19.16, -90.60 ,3.20, -90.60, 3.20}, +{'l', -94.60, 10.80, 0, 0, 0, 0}, +{'c', -94.60, 10.80, -95.80 ,25.20, -87.80, 22.80}, +{'c', -83.89, 21.63, -82.60 ,23.20, -84.20, 24.00}, +{'c', -85.80, 24.80, -78.60 ,25.20, -81.40, 26.80}, +{'c', -84.20, 28.40, -69.80 ,23.20, -72.20, 33.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -79.20, 40.40, 0, 0, 0, 0}, +{'c', -79.20, 40.40, -94.60 ,44.80, -98.20, 35.20}, +{'c', -98.20, 35.20, -103.00 ,37.60, -100.80, 40.60}, +{'c', -98.60, 43.60, -97.40 ,44.00, -97.40, 44.00}, +{'c', -97.40, 44.00, -92.00 ,45.20, -92.60, 46.00}, +{'c', -93.20, 46.80, -95.60 ,50.20, -95.60, 50.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 149.20, 118.60, 0, 0, 0, 0}, +{'c', 148.77, 120.73, 147.10 ,121.54, 145.20, 122.20}, +{'c', 143.28, 121.24, 140.69 ,118.14, 138.80, 120.20}, +{'c', 138.33, 119.72, 137.55 ,119.66, 137.20, 119.00}, +{'c', 136.74, 118.10, 137.01 ,117.06, 136.67, 116.26}, +{'c', 136.12, 114.98, 135.41 ,113.62, 135.60, 112.20}, +{'c', 137.41, 111.49, 138.00 ,109.58, 137.53, 107.82}, +{'c', 137.46, 107.56, 137.03 ,107.37, 137.23, 107.02}, +{'c', 137.42, 106.69, 137.73 ,106.47, 138.00, 106.20}, +{'c', 137.87, 106.33, 137.72 ,106.57, 137.61, 106.55}, +{'c', 137.00, 106.44, 137.12 ,105.81, 137.25, 105.42}, +{'c', 137.84, 103.67, 139.85 ,103.41, 141.20, 104.60}, +{'c', 141.46, 104.03, 141.97 ,104.23, 142.40, 104.20}, +{'c', 142.35, 103.62, 142.76 ,103.09, 142.96, 102.67}, +{'c', 143.47, 101.58, 145.10 ,102.68, 145.90, 102.07}, +{'c', 146.98, 101.25, 148.04 ,100.55, 149.12, 101.15}, +{'c', 150.93, 102.16, 152.64 ,103.37, 153.84, 105.11}, +{'c', 154.41, 105.95, 154.65 ,107.23, 154.59, 108.19}, +{'c', 154.55, 108.83, 153.17 ,108.48, 152.83, 109.41}, +{'c', 152.19, 111.16, 154.02 ,111.68, 154.77, 113.02}, +{'c', 154.97, 113.37, 154.71 ,113.67, 154.39, 113.77}, +{'c', 153.98, 113.90, 153.20 ,113.71, 153.33, 114.16}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 139.60, 138.20, 0, 0, 0, 0}, +{'c', 139.59, 136.46, 137.99 ,134.71, 139.20, 133.00}, +{'c', 139.34, 133.13, 139.47 ,133.36, 139.60, 133.36}, +{'c', 139.74, 133.36, 139.87 ,133.13, 140.00, 133.00}, +{'c', 141.50, 135.22, 145.15 ,136.15, 145.01, 138.99}, +{'c', 144.98, 139.44, 143.90 ,140.36, 144.80, 141.00}, +{'c', 142.99, 142.35, 142.93 ,144.72, 142.00, 146.60}, +{'c', 140.76, 146.31, 139.55 ,145.95, 138.40, 145.40}, +{'c', 138.75, 143.91, 138.64 ,142.23, 139.46, 140.91}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -26.60, 129.20, 0, 0, 0, 0}, +{'c', -26.60, 129.20, -43.46 ,139.34, -29.40, 124.00}, +{'c', -20.60, 114.40, -10.60 ,108.80, -10.60, 108.80}, +{'c', -10.60, 108.80, -0.20 ,104.40, 3.40, 103.20}, +{'c', 7.00, 102.00, 22.20 ,96.80, 25.40, 96.40}, +{'c', 28.60, 96.00, 38.20 ,92.00, 45.00, 96.00}, +{'c', 51.80, 100.00, 59.80 ,104.40, 59.80, 104.40}, +{'c', 59.80, 104.40, 43.40 ,96.00, 39.80, 98.40}, +{'c', 36.20, 100.80, 29.00 ,100.40, 23.00, 103.60}, +{'c', 23.00, 103.60, 8.20 ,108.00, 5.00, 110.00}, +{'c', 1.80, 112.00, -8.60 ,123.60, -10.20, 122.80}, +{'c', -11.80, 122.00, -9.80 ,121.60, -8.60, 118.80}, +{'c', -7.40, 116.00, -9.40 ,114.40, -17.40, 120.80}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -19.20, 123.23, 0, 0, 0, 0}, +{'c', -19.20, 123.23, -17.79 ,110.19, -9.31, 111.86}, +{'c', -9.31, 111.86, -1.08 ,107.69, 1.64, 105.72}, +{'c', 1.64, 105.72, 9.78 ,104.02, 11.09, 103.40}, +{'c', 29.57, 94.70, 44.29 ,99.22, 44.84, 98.10}, +{'c', 45.38, 96.98, 65.01 ,104.10, 68.61, 108.19}, +{'c', 69.01, 108.63, 58.38 ,102.59, 48.69, 100.70}, +{'c', 40.41, 99.08, 18.81 ,100.94, 7.91, 106.48}, +{'c', 4.93, 107.99, -4.01 ,113.77, -6.54, 113.66}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -23.00, 148.80, 0, 0, 0, 0}, +{'c', -23.00, 148.80, -38.20 ,146.40, -21.40, 144.80}, +{'c', -21.40, 144.80, -3.40 ,142.80, 0.60, 137.60}, +{'c', 0.60, 137.60, 14.20 ,128.40, 17.00, 128.00}, +{'c', 19.80, 127.60, 49.80 ,120.40, 50.20, 118.00}, +{'c', 50.60, 115.60, 56.20 ,115.60, 57.80, 116.40}, +{'c', 59.40, 117.20, 58.60 ,118.40, 55.80, 119.20}, +{'c', 53.00, 120.00, 21.80 ,136.40, 15.40, 137.60}, +{'c', 9.00, 138.80, -2.60 ,146.40, -7.40, 147.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -3.48, 141.40, 0, 0, 0, 0}, +{'c', -3.48, 141.40, -12.06 ,140.57, -3.46, 139.75}, +{'c', -3.46, 139.75, 5.36 ,136.33, 7.40, 133.67}, +{'c', 7.40, 133.67, 14.37 ,128.96, 15.80, 128.75}, +{'c', 17.23, 128.55, 31.19 ,124.86, 31.40, 123.63}, +{'c', 31.60, 122.40, 65.67 ,109.82, 70.09, 113.01}, +{'c', 73.00, 115.11, 63.10 ,113.44, 53.47, 117.85}, +{'c', 52.11, 118.47, 18.26 ,133.05, 14.98, 133.67}, +{'c', 11.70, 134.28, 5.76 ,138.17, 3.31, 138.79}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -11.40, 143.60, 0, 0, 0, 0}, +{'c', -11.40, 143.60, -6.20 ,143.20, -7.40, 144.80}, +{'c', -8.60, 146.40, -11.00 ,145.60, -11.00, 145.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -18.60, 145.20, 0, 0, 0, 0}, +{'c', -18.60, 145.20, -13.40 ,144.80, -14.60, 146.40}, +{'c', -15.80, 148.00, -18.20 ,147.20, -18.20, 147.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -29.00, 146.80, 0, 0, 0, 0}, +{'c', -29.00, 146.80, -23.80 ,146.40, -25.00, 148.00}, +{'c', -26.20, 149.60, -28.60 ,148.80, -28.60, 148.80}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -36.60, 147.60, 0, 0, 0, 0}, +{'c', -36.60, 147.60, -31.40 ,147.20, -32.60, 148.80}, +{'c', -33.80, 150.40, -36.20 ,149.60, -36.20, 149.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 1.80, 108.00, 0, 0, 0, 0}, +{'c', 1.80, 108.00, 6.20 ,108.00, 5.00, 109.60}, +{'c', 3.80, 111.20, 0.60 ,110.80, 0.60, 110.80}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -8.20, 113.60, 0, 0, 0, 0}, +{'c', -8.20, 113.60, -1.69 ,111.46, -4.20, 114.80}, +{'c', -5.40, 116.40, -7.80 ,115.60, -7.80, 115.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -19.40, 118.40, 0, 0, 0, 0}, +{'c', -19.40, 118.40, -14.20 ,118.00, -15.40, 119.60}, +{'c', -16.60, 121.20, -19.00 ,120.40, -19.00, 120.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -27.00, 124.40, 0, 0, 0, 0}, +{'c', -27.00, 124.40, -21.80 ,124.00, -23.00, 125.60}, +{'c', -24.20, 127.20, -26.60 ,126.40, -26.60, 126.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -33.80, 129.20, 0, 0, 0, 0}, +{'c', -33.80, 129.20, -28.60 ,128.80, -29.80, 130.40}, +{'c', -31.00, 132.00, -33.40 ,131.20, -33.40, 131.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 5.28, 135.60, 0, 0, 0, 0}, +{'c', 5.28, 135.60, 12.20 ,135.07, 10.61, 137.19}, +{'c', 9.01, 139.32, 5.81 ,138.26, 5.81, 138.26}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 15.68, 130.80, 0, 0, 0, 0}, +{'c', 15.68, 130.80, 22.60 ,130.27, 21.01, 132.40}, +{'c', 19.41, 134.53, 16.21 ,133.46, 16.21, 133.46}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 26.48, 126.40, 0, 0, 0, 0}, +{'c', 26.48, 126.40, 33.40 ,125.87, 31.81, 128.00}, +{'c', 30.21, 130.12, 27.01 ,129.06, 27.01, 129.06}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 36.88, 121.60, 0, 0, 0, 0}, +{'c', 36.88, 121.60, 43.80 ,121.07, 42.21, 123.19}, +{'c', 40.61, 125.33, 37.41 ,124.26, 37.41, 124.26}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 9.28, 103.60, 0, 0, 0, 0}, +{'c', 9.28, 103.60, 16.20 ,103.07, 14.61, 105.19}, +{'c', 13.01, 107.33, 9.01 ,107.06, 9.01, 107.06}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 19.28, 100.40, 0, 0, 0, 0}, +{'c', 19.28, 100.40, 26.20 ,99.87, 24.61, 102.00}, +{'c', 23.01, 104.12, 18.61 ,103.86, 18.61, 103.86}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -3.40, 140.40, 0, 0, 0, 0}, +{'c', -3.40, 140.40, 1.80 ,140.00, 0.60, 141.60}, +{'c', -0.60, 143.20, -3.00 ,142.40, -3.00, 142.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -76.60, 41.20, 0, 0, 0, 0}, +{'c', -76.60, 41.20, -81.00 ,50.00, -81.40, 53.20}, +{'c', -81.40, 53.20, -80.60 ,44.40, -79.40, 42.40}, +{'f', 0.603000,0.134000,0.000000,1.000000,0,0 }, +{'m', -95.00, 55.20, 0, 0, 0, 0}, +{'c', -95.00, 55.20, -98.20 ,69.60, -97.80, 72.40}, +{'c', -97.80, 72.40, -99.00 ,60.80, -98.60, 59.60}, +{'f', 0.603000,0.134000,0.000000,1.000000,0,0 }, +{'m', -74.20, -19.40, 0, 0, 0, 0}, +{'l', -74.40, -16.20, 0, 0, 0, 0}, +{'l', -76.60, -16.00, 0, 0, 0, 0}, +{'c', -76.60, -16.00, -62.40 ,-3.40, -61.80, 4.20}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -70.22, -18.14, 0, 0, 0, 0}, +{'c', -70.65, -18.55, -70.43 ,-19.30, -70.84, -19.56}, +{'c', -71.64, -20.07, -69.54 ,-20.13, -69.77, -20.84}, +{'c', -70.15, -22.05, -69.96 ,-22.07, -70.08, -23.35}, +{'c', -70.14, -23.95, -69.55 ,-25.49, -69.17, -25.93}, +{'c', -67.72, -27.58, -69.05 ,-30.51, -67.41, -32.06}, +{'c', -67.10, -32.35, -66.73 ,-32.90, -66.44, -33.32}, +{'c', -65.78, -34.28, -64.60 ,-34.77, -63.65, -35.60}, +{'c', -63.33, -35.88, -63.53 ,-36.70, -62.96, -36.61}, +{'c', -62.25, -36.49, -61.01 ,-36.62, -61.05, -35.78}, +{'c', -61.16, -33.66, -62.49 ,-31.94, -63.77, -30.28}, +{'c', -63.32, -29.57, -63.78 ,-28.94, -64.06, -28.38}, +{'c', -65.40, -25.76, -65.21 ,-22.92, -65.39, -20.08}, +{'c', -65.39, -19.99, -65.70 ,-19.92, -65.69, -19.86}, +{'c', -65.34, -17.53, -64.75 ,-15.33, -63.87, -13.10}, +{'c', -63.51, -12.17, -63.04 ,-11.28, -62.89, -10.35}, +{'c', -62.77, -9.66, -62.67 ,-8.83, -63.08, -8.12}, +{'c', -61.05, -5.23, -62.35 ,-2.58, -61.19, 0.95}, +{'c', -60.98, 1.57, -59.29 ,3.49, -59.75, 3.33}, +{'c', -62.26, 2.46, -62.37 ,2.06, -62.55, 1.30}, +{'c', -62.70, 0.68, -63.03 ,-0.70, -63.26, -1.30}, +{'c', -63.33, -1.46, -63.50 ,-3.35, -63.58, -3.47}, +{'c', -65.09, -5.85, -63.73 ,-5.67, -65.10, -8.03}, +{'c', -66.53, -8.71, -67.50 ,-9.82, -68.62, -10.98}, +{'c', -68.82, -11.18, -67.67 ,-11.91, -67.86, -12.12}, +{'c', -68.95, -13.41, -70.10 ,-14.18, -69.76, -15.67}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -73.80, -16.40, 0, 0, 0, 0}, +{'c', -73.80, -16.40, -73.40 ,-9.60, -71.00, -8.00}, +{'c', -68.60, -6.40, -69.80 ,-7.20, -73.00, -8.40}, +{'c', -76.20, -9.60, -75.00 ,-10.40, -75.00, -10.40}, +{'c', -75.00, -10.40, -77.80 ,-10.00, -75.40, -8.00}, +{'c', -73.00, -6.00, -69.40 ,-3.60, -71.00, -3.60}, +{'c', -72.60, -3.60, -80.20 ,-7.60, -80.20, -10.40}, +{'c', -80.20, -13.20, -81.20 ,-17.30, -81.20, -17.30}, +{'c', -81.20, -17.30, -80.10 ,-18.10, -75.30, -18.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -74.60, 2.20, 0, 0, 0, 0}, +{'c', -74.60, 2.20, -83.12 ,-0.59, -101.60, 2.80}, +{'c', -101.60, 2.80, -92.57 ,0.72, -73.80, 3.00}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -72.50, 2.13, 0, 0, 0, 0}, +{'c', -72.50, 2.13, -80.75 ,-1.39, -99.45, 0.39}, +{'c', -99.45, 0.39, -90.28 ,-0.90, -71.77, 3.00}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -70.71, 2.22, 0, 0, 0, 0}, +{'c', -70.71, 2.22, -78.68 ,-1.90, -97.46, -1.51}, +{'c', -97.46, -1.51, -88.21 ,-2.12, -70.05, 3.14}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -69.44, 2.44, 0, 0, 0, 0}, +{'c', -69.44, 2.44, -76.27 ,-1.86, -93.14, -2.96}, +{'c', -93.14, -2.96, -84.80 ,-2.79, -68.92, 3.32}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 45.84, 12.96, 0, 0, 0, 0}, +{'c', 45.84, 12.96, 44.91 ,13.61, 45.12, 12.42}, +{'c', 45.34, 11.24, 73.55 ,-1.93, 77.16, -1.68}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 42.45, 13.60, 0, 0, 0, 0}, +{'c', 42.45, 13.60, 41.57 ,14.31, 41.69, 13.12}, +{'c', 41.81, 11.93, 68.90 ,-3.42, 72.52, -3.45}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 39.16, 14.97, 0, 0, 0, 0}, +{'c', 39.16, 14.97, 38.33 ,15.75, 38.37, 14.55}, +{'c', 38.42, 13.35, 58.23 ,-2.15, 68.05, -4.02}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 36.28, 16.84, 0, 0, 0, 0}, +{'c', 36.28, 16.84, 35.54 ,17.53, 35.58, 16.45}, +{'c', 35.62, 15.37, 53.45 ,1.43, 62.28, -0.26}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 4.60, 164.80, 0, 0, 0, 0}, +{'c', 4.60, 164.80, -10.60 ,162.40, 6.20, 160.80}, +{'c', 6.20, 160.80, 24.20 ,158.80, 28.20, 153.60}, +{'c', 28.20, 153.60, 41.80 ,144.40, 44.60, 144.00}, +{'c', 47.40, 143.60, 63.80 ,140.00, 64.20, 137.60}, +{'c', 64.60, 135.20, 70.60 ,132.80, 72.20, 133.60}, +{'c', 73.80, 134.40, 73.80 ,143.60, 71.00, 144.40}, +{'c', 68.20, 145.20, 49.40 ,152.40, 43.00, 153.60}, +{'c', 36.60, 154.80, 25.00 ,162.40, 20.20, 163.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 77.60, 127.40, 0, 0, 0, 0}, +{'c', 77.60, 127.40, 74.60 ,129.00, 73.40, 131.60}, +{'c', 73.40, 131.60, 67.00 ,142.20, 52.80, 145.40}, +{'c', 52.80, 145.40, 29.80 ,154.40, 22.00, 156.40}, +{'c', 22.00, 156.40, 8.60 ,161.40, 1.20, 160.60}, +{'c', 1.20, 160.60, -5.80 ,160.80, 0.40, 162.40}, +{'c', 0.40, 162.40, 20.60 ,160.40, 24.00, 158.60}, +{'c', 24.00, 158.60, 39.60 ,153.40, 42.60, 150.80}, +{'c', 45.60, 148.20, 63.80 ,143.20, 66.00, 141.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 18.88, 158.91, 0, 0, 0, 0}, +{'c', 18.88, 158.91, 24.11 ,158.69, 22.96, 160.23}, +{'c', 21.80, 161.78, 19.36 ,160.91, 19.36, 160.91}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 11.68, 160.26, 0, 0, 0, 0}, +{'c', 11.68, 160.26, 16.91 ,160.04, 15.76, 161.59}, +{'c', 14.60, 163.14, 12.15 ,162.26, 12.15, 162.26}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 1.25, 161.51, 0, 0, 0, 0}, +{'c', 1.25, 161.51, 6.48 ,161.28, 5.33, 162.83}, +{'c', 4.17, 164.38, 1.73 ,163.51, 1.73, 163.51}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -6.38, 162.06, 0, 0, 0, 0}, +{'c', -6.38, 162.06, -1.15 ,161.83, -2.31, 163.38}, +{'c', -3.46, 164.93, -5.91 ,164.05, -5.91, 164.05}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 35.41, 151.51, 0, 0, 0, 0}, +{'c', 35.41, 151.51, 42.38 ,151.21, 40.84, 153.27}, +{'c', 39.31, 155.34, 36.05 ,154.17, 36.05, 154.17}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 45.73, 147.09, 0, 0, 0, 0}, +{'c', 45.73, 147.09, 51.69 ,143.79, 51.16, 148.85}, +{'c', 50.88, 151.41, 46.36 ,149.75, 46.36, 149.75}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 54.86, 144.27, 0, 0, 0, 0}, +{'c', 54.86, 144.27, 62.02 ,140.57, 60.29, 146.03}, +{'c', 59.51, 148.49, 55.49 ,146.94, 55.49, 146.94}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 64.38, 139.45, 0, 0, 0, 0}, +{'c', 64.38, 139.45, 68.73 ,134.55, 69.80, 141.21}, +{'c', 70.21, 143.75, 65.01 ,142.11, 65.01, 142.11}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 26.83, 156.00, 0, 0, 0, 0}, +{'c', 26.83, 156.00, 32.06 ,155.77, 30.91, 157.32}, +{'c', 29.76, 158.87, 27.31 ,158.00, 27.31, 158.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 62.43, 34.60, 0, 0, 0, 0}, +{'c', 62.43, 34.60, 61.71 ,35.27, 61.71, 34.20}, +{'c', 61.71, 33.13, 79.19 ,19.86, 88.03, 18.48}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 65.40, 98.40, 0, 0, 0, 0}, +{'c', 65.40, 98.40, 87.40 ,120.80, 96.60, 124.40}, +{'c', 96.60, 124.40, 105.80 ,135.60, 101.80, 161.60}, +{'c', 101.80, 161.60, 98.60 ,169.20, 95.40, 148.40}, +{'c', 95.40, 148.40, 98.60 ,123.20, 87.40, 139.20}, +{'c', 87.40, 139.20, 79.00 ,129.30, 85.40, 129.60}, +{'c', 85.40, 129.60, 88.60 ,131.60, 89.00, 130.00}, +{'c', 89.40, 128.40, 81.40 ,114.80, 64.20, 100.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', 7.00, 137.20, 0, 0, 0, 0}, +{'c', 7.00, 137.20, 6.80 ,135.40, 8.60, 136.20}, +{'c', 10.40, 137.00, 104.60 ,143.20, 136.20, 167.20}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 17.40, 132.80, 0, 0, 0, 0}, +{'c', 17.40, 132.80, 17.20 ,131.00, 19.00, 131.80}, +{'c', 20.80, 132.60, 157.40 ,131.60, 181.00, 164.00}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 29.00, 128.80, 0, 0, 0, 0}, +{'c', 29.00, 128.80, 28.80 ,127.00, 30.60, 127.80}, +{'c', 32.40, 128.60, 205.80 ,115.60, 229.40, 148.00}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 39.00, 124.00, 0, 0, 0, 0}, +{'c', 39.00, 124.00, 38.80 ,122.20, 40.60, 123.00}, +{'c', 42.40, 123.80, 164.60 ,85.20, 188.20, 117.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -19.00, 146.80, 0, 0, 0, 0}, +{'c', -19.00, 146.80, -19.20 ,145.00, -17.40, 145.80}, +{'c', -15.60, 146.60, 2.20 ,148.80, 4.20, 187.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -27.80, 148.40, 0, 0, 0, 0}, +{'c', -27.80, 148.40, -28.00 ,146.60, -26.20, 147.40}, +{'c', -24.40, 148.20, -10.20 ,143.60, -13.00, 182.40}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -35.80, 148.80, 0, 0, 0, 0}, +{'c', -35.80, 148.80, -36.00 ,147.00, -34.20, 147.80}, +{'c', -32.40, 148.60, -17.00 ,149.20, -29.40, 171.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 11.53, 104.47, 0, 0, 0, 0}, +{'c', 11.53, 104.47, 11.08 ,106.46, 12.63, 105.25}, +{'c', 28.70, 92.62, 61.14 ,33.72, 116.83, 28.09}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 22.73, 102.67, 0, 0, 0, 0}, +{'c', 22.73, 102.67, 21.36 ,101.47, 23.23, 100.85}, +{'c', 25.10, 100.22, 137.54 ,27.72, 176.83, 35.69}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 1.89, 108.77, 0, 0, 0, 0}, +{'c', 1.89, 108.77, 1.38 ,110.37, 3.09, 109.39}, +{'c', 12.06, 104.27, 15.68 ,47.06, 59.25, 45.80}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -18.04, 119.79, 0, 0, 0, 0}, +{'c', -18.04, 119.79, -19.11 ,121.08, -17.16, 120.83}, +{'c', -6.92, 119.49, 14.49 ,78.22, 58.93, 83.30}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -6.80, 113.67, 0, 0, 0, 0}, +{'c', -6.80, 113.67, -7.61 ,115.14, -5.74, 114.51}, +{'c', 4.06, 111.24, 17.14 ,66.62, 61.73, 63.08}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -25.08, 124.91, 0, 0, 0, 0}, +{'c', -25.08, 124.91, -25.95 ,125.95, -24.37, 125.75}, +{'c', -16.07, 124.67, 1.27 ,91.24, 37.26, 95.35}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -32.68, 130.82, 0, 0, 0, 0}, +{'c', -32.68, 130.82, -33.68 ,131.87, -32.09, 131.75}, +{'c', -27.92, 131.44, 2.71 ,98.36, 21.18, 113.86}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 36.85, 98.90, 0, 0, 0, 0}, +{'c', 36.85, 98.90, 35.65 ,97.54, 37.59, 97.16}, +{'c', 39.52, 96.77, 160.22 ,39.06, 198.18, 51.93}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 3.40, 163.20, 0, 0, 0, 0}, +{'c', 3.40, 163.20, 3.20 ,161.40, 5.00, 162.20}, +{'c', 6.80, 163.00, 22.20 ,163.60, 9.80, 186.00}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 13.80, 161.60, 0, 0, 0, 0}, +{'c', 13.80, 161.60, 13.60 ,159.80, 15.40, 160.60}, +{'c', 17.20, 161.40, 35.00 ,163.60, 37.00, 202.40}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 20.60, 160.00, 0, 0, 0, 0}, +{'c', 20.60, 160.00, 20.40 ,158.20, 22.20, 159.00}, +{'c', 24.00, 159.80, 48.60 ,163.20, 72.20, 195.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 28.23, 157.97, 0, 0, 0, 0}, +{'c', 28.23, 157.97, 27.79 ,156.21, 29.68, 156.77}, +{'c', 31.57, 157.32, 52.00 ,155.42, 90.10, 189.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 38.62, 153.57, 0, 0, 0, 0}, +{'c', 38.62, 153.57, 38.19 ,151.81, 40.08, 152.37}, +{'c', 41.97, 152.92, 76.80 ,157.42, 128.50, 192.40}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -1.80, 142.00, 0, 0, 0, 0}, +{'c', -1.80, 142.00, -2.00 ,140.20, -0.20, 141.00}, +{'c', 1.60, 141.80, 55.00 ,144.40, 85.40, 171.20}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -11.80, 146.00, 0, 0, 0, 0}, +{'c', -11.80, 146.00, -12.00 ,144.20, -10.20, 145.00}, +{'c', -8.40, 145.80, 16.20 ,149.20, 39.80, 181.60}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 49.50, 148.96, 0, 0, 0, 0}, +{'c', 49.50, 148.96, 48.94 ,147.24, 50.86, 147.66}, +{'c', 52.79, 148.07, 87.86 ,150.00, 141.98, 181.10}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 57.90, 146.56, 0, 0, 0, 0}, +{'c', 57.90, 146.56, 57.34 ,144.84, 59.26, 145.25}, +{'c', 61.19, 145.67, 96.26 ,147.60, 150.38, 178.70}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', 67.50, 141.56, 0, 0, 0, 0}, +{'c', 67.50, 141.56, 66.94 ,139.84, 68.86, 140.25}, +{'c', 70.79, 140.67, 113.86 ,145.00, 203.58, 179.30}, +{'f', 1.000000,1.000000,1.000000,1.000000,0,0 }, +{'m', -43.80, 148.40, 0, 0, 0, 0}, +{'c', -43.80, 148.40, -38.60 ,148.00, -39.80, 149.60}, +{'c', -41.00, 151.20, -43.40 ,150.40, -43.40, 150.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -13.00, 162.40, 0, 0, 0, 0}, +{'c', -13.00, 162.40, -7.80 ,162.00, -9.00, 163.60}, +{'c', -10.20, 165.20, -12.60 ,164.40, -12.60, 164.40}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -21.80, 162.00, 0, 0, 0, 0}, +{'c', -21.80, 162.00, -16.60 ,161.60, -17.80, 163.20}, +{'c', -19.00, 164.80, -21.40 ,164.00, -21.40, 164.00}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -117.17, 150.18, 0, 0, 0, 0}, +{'c', -117.17, 150.18, -112.12 ,151.50, -113.78, 152.62}, +{'c', -115.44, 153.74, -117.45 ,152.20, -117.45, 152.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -115.17, 140.58, 0, 0, 0, 0}, +{'c', -115.17, 140.58, -110.12 ,141.91, -111.78, 143.02}, +{'c', -113.44, 144.14, -115.45 ,142.60, -115.45, 142.60}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -122.37, 136.18, 0, 0, 0, 0}, +{'c', -122.37, 136.18, -117.32 ,137.50, -118.98, 138.62}, +{'c', -120.64, 139.74, -122.65 ,138.20, -122.65, 138.20}, +{'f', 0.000000,0.000000,0.000000,1.000000,0,0 }, +{'m', -42.60, 211.20, 0, 0, 0, 0}, +{'c', -42.60, 211.20, -44.20 ,211.20, -48.20, 213.20}, +{'c', -50.20, 213.20, -61.40 ,216.80, -67.00, 226.80}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 45.12, 303.85, 0, 0, 0, 0}, +{'c', 45.26, 304.11, 45.31 ,304.52, 45.60, 304.54}, +{'c', 46.26, 304.58, 47.49 ,304.88, 47.37, 304.25}, +{'c', 46.52, 299.94, 45.65 ,295.00, 41.52, 293.20}, +{'c', 40.88, 292.92, 39.43 ,293.33, 39.36, 294.21}, +{'c', 39.23, 295.74, 39.12 ,297.09, 39.42, 298.55}, +{'c', 39.73, 299.98, 41.88 ,299.99, 42.80, 298.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 34.04, 308.58, 0, 0, 0, 0}, +{'c', 34.79, 309.99, 34.66 ,311.85, 36.07, 312.42}, +{'c', 36.81, 312.71, 38.66 ,311.74, 38.25, 310.66}, +{'c', 37.44, 308.60, 37.06 ,306.36, 35.67, 304.55}, +{'c', 35.47, 304.29, 35.71 ,303.75, 35.55, 303.43}, +{'c', 34.95, 302.21, 33.81 ,301.47, 32.40, 301.80}, +{'c', 31.29, 304.00, 32.43 ,306.13, 33.95, 307.84}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -5.56, 303.39, 0, 0, 0, 0}, +{'c', -5.67, 303.01, -5.71 ,302.55, -5.54, 302.23}, +{'c', -5.01, 301.20, -4.22 ,300.07, -4.56, 299.05}, +{'c', -4.91, 298.00, -6.02 ,298.18, -6.67, 298.75}, +{'c', -7.81, 299.74, -7.86 ,301.57, -8.55, 302.93}, +{'c', -8.74, 303.31, -8.69 ,303.89, -9.13, 304.28}, +{'c', -9.61, 304.70, -10.05 ,306.22, -9.95, 306.79}, +{'c', -9.90, 307.11, -10.08 ,317.01, -9.86, 316.75}, +{'c', -9.24, 316.02, -6.19 ,306.28, -6.12, 305.39}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -31.20, 296.60, 0, 0, 0, 0}, +{'c', -28.57, 294.10, -25.78 ,291.14, -26.22, 287.43}, +{'c', -26.34, 286.45, -28.11 ,286.98, -28.30, 287.82}, +{'c', -29.10, 291.45, -31.14 ,294.11, -33.71, 296.50}, +{'c', -35.90, 298.55, -37.77 ,304.89, -38.00, 305.40}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -44.78, 290.63, 0, 0, 0, 0}, +{'c', -44.25, 290.26, -44.55 ,289.77, -44.34, 289.44}, +{'c', -43.38, 287.98, -42.08 ,286.74, -42.07, 285.00}, +{'c', -42.06, 284.72, -42.44 ,284.41, -42.78, 284.64}, +{'c', -43.05, 284.82, -43.40 ,284.95, -43.50, 285.08}, +{'c', -45.53, 287.53, -46.93 ,290.20, -48.38, 293.01}, +{'c', -48.56, 293.37, -49.70 ,297.86, -49.39, 297.97}, +{'c', -49.15, 298.06, -47.43 ,293.88, -47.22, 293.76}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -28.04, 310.18, 0, 0, 0, 0}, +{'c', -27.60, 309.31, -26.02 ,308.11, -26.14, 307.22}, +{'c', -26.25, 306.29, -25.79 ,304.85, -26.70, 305.54}, +{'c', -27.95, 306.48, -31.40 ,307.83, -31.67, 313.64}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -13.60, 293.00, 0, 0, 0, 0}, +{'c', -13.20, 292.33, -12.49 ,292.81, -12.03, 292.54}, +{'c', -11.38, 292.17, -10.77 ,291.61, -10.48, 290.96}, +{'c', -9.51, 288.81, -7.74 ,287.00, -7.60, 284.60}, +{'c', -9.09, 283.20, -9.77 ,285.24, -10.40, 286.20}, +{'c', -11.72, 284.55, -12.72 ,286.43, -14.02, 286.95}, +{'c', -14.09, 286.98, -14.30 ,286.63, -14.38, 286.65}, +{'c', -15.56, 287.10, -16.24 ,288.18, -17.23, 288.96}, +{'c', -17.41, 289.09, -17.81 ,288.91, -17.96, 289.05}, +{'c', -18.61, 289.65, -19.58 ,289.98, -19.86, 290.66}, +{'c', -20.97, 293.36, -24.11 ,295.46, -26.00, 303.00}, +{'c', -25.62, 303.91, -21.49 ,296.36, -21.00, 295.66}, +{'c', -20.16, 294.46, -20.05 ,297.32, -18.77, 296.66}, +{'c', -18.72, 296.63, -18.53 ,296.87, -18.40, 297.00}, +{'c', -18.21, 296.72, -17.99 ,296.49, -17.60, 296.60}, +{'c', -17.60, 296.20, -17.73 ,295.64, -17.53, 295.49}, +{'c', -16.30, 294.51, -16.38 ,293.44, -15.60, 292.20}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 46.20, 347.40, 0, 0, 0, 0}, +{'c', 46.20, 347.40, 53.60 ,327.00, 49.20, 315.80}, +{'c', 49.20, 315.80, 60.60 ,337.40, 56.00, 348.60}, +{'c', 56.00, 348.60, 55.60 ,338.20, 51.60, 333.20}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 31.40, 344.80, 0, 0, 0, 0}, +{'c', 31.40, 344.80, 36.80 ,336.00, 28.80, 317.60}, +{'c', 28.80, 317.60, 28.00 ,338.00, 21.20, 349.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 21.40, 342.80, 0, 0, 0, 0}, +{'c', 21.40, 342.80, 21.20 ,322.80, 21.60, 319.80}, +{'c', 21.60, 319.80, 17.80 ,336.40, 7.60, 346.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 11.80, 310.80, 0, 0, 0, 0}, +{'c', 11.80, 310.80, 17.80 ,324.40, 7.80, 342.80}, +{'c', 7.80, 342.80, 14.20 ,330.60, 9.40, 323.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -7.40, 342.40, 0, 0, 0, 0}, +{'c', -7.40, 342.40, -8.40 ,326.80, -6.60, 324.60}, +{'c', -6.60, 324.60, -6.40 ,318.20, -6.80, 317.20}, +{'c', -6.80, 317.20, -2.80 ,311.00, -2.60, 318.40}, +{'c', -2.60, 318.40, -1.20 ,326.20, 1.60, 330.80}, +{'c', 1.60, 330.80, 5.20 ,336.20, 5.00, 342.60}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -11.00, 314.80, 0, 0, 0, 0}, +{'c', -11.00, 314.80, -17.60 ,325.60, -19.40, 344.60}, +{'c', -19.40, 344.60, -20.80 ,338.40, -17.00, 324.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -32.80, 334.60, 0, 0, 0, 0}, +{'c', -32.80, 334.60, -27.80 ,329.20, -26.40, 324.20}, +{'c', -26.40, 324.20, -22.80 ,308.40, -29.20, 317.00}, +{'c', -29.20, 317.00, -29.00 ,325.00, -37.20, 332.40}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -38.60, 329.60, 0, 0, 0, 0}, +{'c', -38.60, 329.60, -35.20 ,312.20, -34.40, 311.40}, +{'c', -34.40, 311.40, -32.60 ,308.00, -35.40, 311.20}, +{'c', -35.40, 311.20, -44.20 ,330.40, -48.20, 337.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -44.40, 313.00, 0, 0, 0, 0}, +{'c', -44.40, 313.00, -32.80 ,290.60, -54.60, 316.40}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -59.80, 298.40, 0, 0, 0, 0}, +{'c', -59.80, 298.40, -55.00 ,279.60, -52.40, 279.80}, +{'c', -52.40, 279.80, -44.20 ,270.80, -50.80, 281.40}, +{'c', -50.80, 281.40, -56.80 ,291.00, -56.20, 300.80}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 270.50, 287.00, 0, 0, 0, 0}, +{'c', 270.50, 287.00, 258.50 ,277.00, 256.00, 273.50}, +{'c', 256.00, 273.50, 269.50 ,292.00, 269.50, 299.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 276.00, 265.00, 0, 0, 0, 0}, +{'c', 276.00, 265.00, 255.00 ,250.00, 251.50, 242.50}, +{'c', 251.50, 242.50, 278.00 ,272.00, 278.00, 276.50}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 293.00, 111.00, 0, 0, 0, 0}, +{'c', 293.00, 111.00, 281.00 ,103.00, 279.50, 105.00}, +{'c', 279.50, 105.00, 290.00 ,111.50, 292.50, 120.00}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 301.50, 191.50, 0, 0, 0, 0}, +{'l', 284.00, 179.50, 0, 0, 0, 0}, +{'c', 284.00, 179.50, 303.00 ,196.50, 303.50, 200.50}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -89.25, 169.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'l', -67.25, 173.75, 0, 0, 0, 0}, +{'m', -39.00, 331.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -33.50, 336.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 20.50, 344.50, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 301.50, 191.50, 0, 0, 0, 0}, +{'l', 284.00, 179.50, 0, 0, 0, 0}, +{'c', 284.00, 179.50, 303.00 ,196.50, 303.50, 200.50}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -89.25, 169.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'l', -67.25, 173.75, 0, 0, 0, 0}, +{'m', -39.00, 331.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -33.50, 336.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 20.50, 344.50, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 301.50, 191.50, 0, 0, 0, 0}, +{'l', 284.00, 179.50, 0, 0, 0, 0}, +{'c', 284.00, 179.50, 303.00 ,196.50, 303.50, 200.50}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -89.25, 169.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'l', -67.25, 173.75, 0, 0, 0, 0}, +{'m', -39.00, 331.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', -33.50, 336.00, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }, +{'m', 20.50, 344.50, 0, 0, 0, 0}, +{'f', 0.804000,0.804000,0.804000,1.000000,0,0 }}; diff --git a/test/tighten-bounds.c b/test/tighten-bounds.c new file mode 100644 index 000000000..f5430e447 --- /dev/null +++ b/test/tighten-bounds.c @@ -0,0 +1,172 @@ +/* + * Copyright © 2011 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" + +static void path_none (cairo_t *cr, int size) +{ +} + +static void path_box (cairo_t *cr, int size) +{ + cairo_rectangle (cr, 0, 0, size, size); +} + +static void path_box_unaligned (cairo_t *cr, int size) +{ + cairo_rectangle (cr, 0.5, 0.5, size - 1, size - 1); +} + +static void path_triangle (cairo_t *cr, int size) +{ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, size/2, size); + cairo_line_to (cr, size, 0); + cairo_close_path (cr); +} + +static void path_circle (cairo_t *cr, int size) +{ + cairo_arc (cr, size / 2.0, size / 2.0, size / 2.0, 0, 2 * M_PI); +} + +static void (* const path_funcs[])(cairo_t *cr, int size) = { + path_none, + path_box, + path_box_unaligned, + path_triangle, + path_circle +}; + +#define SIZE 20 +#define PAD 2 +#define TYPES 6 +/* All-clipped is boring, thus we skip path_none for clipping */ +#define CLIP_OFFSET 1 +#define IMAGE_WIDTH ((ARRAY_LENGTH (path_funcs) - CLIP_OFFSET) * TYPES * (SIZE + PAD) - PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (path_funcs) * (SIZE + PAD) - PAD) + +static void +draw_idx (cairo_t *cr, int i, int j, int type) +{ + cairo_bool_t little_path; + cairo_bool_t empty_clip; + cairo_bool_t little_clip; + + /* The lowest bit controls the path, the rest the clip */ + little_path = type & 1; + + /* We don't want the combination "empty_clip = TRUE, little_clip = FALSE" + * (== all clipped). + */ + switch (type >> 1) + { + case 0: + empty_clip = FALSE; + little_clip = FALSE; + break; + case 1: + empty_clip = FALSE; + little_clip = TRUE; + break; + case 2: + empty_clip = TRUE; + little_clip = TRUE; + break; + default: + return; + } + + cairo_save (cr); + + /* Thanks to the fill rule, drawing something twice removes it again */ + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + + path_funcs[i] (cr, SIZE); + if (empty_clip) + path_funcs[i] (cr, SIZE); + if (little_clip) + { + cairo_save (cr); + cairo_translate (cr, SIZE / 4, SIZE / 4); + path_funcs[i] (cr, SIZE / 2); + cairo_restore (cr); + } + cairo_clip (cr); + + path_funcs[j] (cr, SIZE); + path_funcs[j] (cr, SIZE); + if (little_path) + { + /* Draw the object again in the center of itself */ + cairo_save (cr); + cairo_translate (cr, SIZE / 4, SIZE / 4); + path_funcs[j] (cr, SIZE / 2); + cairo_restore (cr); + } + cairo_fill (cr); + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + size_t i, j, k; + + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_paint (cr); + + /* Set an unbounded operator so that we can see how accurate the bounded + * extents were. + */ + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + cairo_set_source_rgb (cr, 1, 1, 1); + + for (j = 0; j < ARRAY_LENGTH (path_funcs); j++) { + cairo_save (cr); + for (i = CLIP_OFFSET; i < ARRAY_LENGTH (path_funcs); i++) { + for (k = 0; k < TYPES; k++) { + cairo_save (cr); + cairo_rectangle (cr, 0, 0, SIZE, SIZE); + cairo_clip (cr); + draw_idx (cr, i, j, k); + cairo_restore (cr); + cairo_translate (cr, SIZE + PAD, 0); + } + } + cairo_restore (cr); + cairo_translate (cr, 0, SIZE + PAD); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (tighten_bounds, + "Tests that we tighten the bounds after tessellation.", + "fill", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/toy-font-face.c b/test/toy-font-face.c new file mode 100644 index 000000000..cbebf840a --- /dev/null +++ b/test/toy-font-face.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2005,2008 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Behdad Esfahbod + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-test.h" + +#include +#include +#include + +#if CAIRO_HAS_WIN32_FONT +#define CAIRO_FONT_FAMILY_DEFAULT "Arial" +#elif CAIRO_HAS_QUARTZ_FONT +#define CAIRO_FONT_FAMILY_DEFAULT "Helvetica" +#elif CAIRO_HAS_FT_FONT +#define CAIRO_FONT_FAMILY_DEFAULT "" +#else +#define CAIRO_FONT_FAMILY_DEFAULT "@cairo:" +#endif + + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + cairo_t *cr; + cairo_surface_t *surface; + cairo_font_face_t *font_face; + cairo_status_t status; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 0, 0); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + font_face = cairo_font_face_reference (cairo_get_font_face (cr)); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (cairo_toy_font_face_get_family (font_face) != NULL); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + status = cairo_font_face_status(font_face); + cairo_font_face_destroy (font_face); + + if (status) + return cairo_test_status_from_status (ctx, status); + + cairo_select_font_face (cr, + "bizarre", + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + font_face = cairo_font_face_reference (cairo_get_font_face (cr)); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "bizarre")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_OBLIQUE); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_BOLD); + status = cairo_font_face_status(font_face); + cairo_font_face_destroy (font_face); + + if (status) + return cairo_test_status_from_status (ctx, status); + + font_face = cairo_toy_font_face_create ("bozarre", + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "bozarre")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_OBLIQUE); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_BOLD); + status = cairo_font_face_status(font_face); + cairo_font_face_destroy (font_face); + + if (status) + return cairo_test_status_from_status (ctx, status); + + font_face = cairo_toy_font_face_create (NULL, + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), CAIRO_FONT_FAMILY_DEFAULT)); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_NULL_POINTER); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("\xff", + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), CAIRO_FONT_FAMILY_DEFAULT)); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_INVALID_STRING); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("sans", + -1, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), CAIRO_FONT_FAMILY_DEFAULT)); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_INVALID_SLANT); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("sans", + CAIRO_FONT_SLANT_OBLIQUE, + -1); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), CAIRO_FONT_FAMILY_DEFAULT)); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_INVALID_WEIGHT); + cairo_font_face_destroy (font_face); + + cairo_destroy (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (toy_font_face, + "Check the construction of 'toy' font faces", + "font, api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/transforms.c b/test/transforms.c new file mode 100644 index 000000000..17b139687 --- /dev/null +++ b/test/transforms.c @@ -0,0 +1,112 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl Worth + */ + +#include "cairo-test.h" + +#define WIDTH 45 +#define HEIGHT 30 + +static void +draw_L_shape (cairo_t *cr) +{ + cairo_move_to (cr, 0, 0); + cairo_rel_line_to (cr, 0, 10); + cairo_rel_line_to (cr, 5, 0); + + cairo_save (cr); + cairo_identity_matrix (cr); + cairo_set_line_width (cr, 2.0); + cairo_stroke (cr); + cairo_restore (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_translate (cr, 5, 5); + + draw_L_shape (cr); + + cairo_translate (cr, 10, 0); + + cairo_save (cr); + { + cairo_scale (cr, 2, 2); + draw_L_shape (cr); + } + cairo_restore (cr); + + cairo_translate (cr, 15, 0); + + cairo_save (cr); + { + cairo_rotate (cr, M_PI / 2.0); + draw_L_shape (cr); + } + cairo_restore (cr); + + cairo_translate (cr, 5, 0); + + cairo_save (cr); + { + cairo_matrix_t skew_y = { + 1, -1, + 0, 1, + 0, 0 + }; + cairo_transform (cr, &skew_y); + draw_L_shape (cr); + } + cairo_restore (cr); + + cairo_translate (cr, 5, 10); + + cairo_save (cr); + { + cairo_matrix_t skew_x = { + 1.0, 0.0, + -0.5, 1.0, + 0.0, 0.0 + }; + cairo_transform (cr, &skew_x); + draw_L_shape (cr); + } + cairo_restore (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (transforms, + "Test various transformations.", + "transforms, api", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/translate-show-surface.c b/test/translate-show-surface.c new file mode 100644 index 000000000..9f7af8db2 --- /dev/null +++ b/test/translate-show-surface.c @@ -0,0 +1,79 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +/* Bug history + * + * 2005-04-11 Carl Worth + * + * It appears that calling cairo_show_surface after cairo_translate + * somehow applies the translation twice to the surface being + * shown. This is pretty easy to demonstrate by bringing up xsvg on + * an SVG file with an and panning around a bit with the + * arrow keys. + * + * This is almost certainly a regression, and I suspect there may be + * some interaction with the fix for move-to-show-surface. + * + * 2005-04-12 Carl Worth + * + * I committed a fix for this bug today. + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + uint32_t colors[4] = { + 0xffffffff, 0xffff0000, + 0xff00ff00, 0xff0000ff + }; + int i; + + for (i=0; i < 4; i++) { + surface = cairo_image_surface_create_for_data ((unsigned char *) &colors[i], + CAIRO_FORMAT_RGB24, + 1, 1, 4); + cairo_save (cr); + { + cairo_translate (cr, i % 2, i / 2); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + } + cairo_restore (cr); + cairo_surface_finish (surface); /* colors will go out of scope */ + cairo_surface_destroy (surface); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (translate_show_surface, + "Tests calls to cairo_show_surface after cairo_translate", + "transform", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/trap-clip.c b/test/trap-clip.c new file mode 100644 index 000000000..f1a24ca8d --- /dev/null +++ b/test/trap-clip.c @@ -0,0 +1,213 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" +#include +#include + +#define WIDTH 16 +#define HEIGHT 16 +#define PAD 2 + +static const char *png_filename = "romedalen.png"; +static cairo_surface_t *image; + +static void +set_solid_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_set_source_rgb (cr, 0, 0, 0.6); +} + +static void +set_translucent_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_set_source_rgba (cr, 0, 0, 0.6, 0.5); +} + +static void +set_gradient_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + pattern = + cairo_pattern_create_linear (x, y, x + WIDTH, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 1, 1, 1); + cairo_pattern_add_color_stop_rgba (pattern, 1, 0, 0, 0.4, 1); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); +} + +static void +set_image_pattern (const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) +{ + cairo_pattern_t *pattern; + + if (image == NULL || cairo_surface_status (image)) { + cairo_surface_destroy (image); + image = cairo_test_create_surface_from_png (ctx, png_filename); + } + + pattern = cairo_pattern_create_for_surface (image); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); +} + +static void +draw_rect (cairo_t *cr, int x, int y) +{ + cairo_new_path (cr); + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill (cr); +} + +static void +draw_rects (cairo_t *cr, int x, int y) +{ + int width = WIDTH / 3; + int height = HEIGHT / 2; + + cairo_new_path (cr); + cairo_rectangle (cr, x, y, width, height); + cairo_rectangle (cr, x + width, y + height, width, height); + cairo_rectangle (cr, x + 2 * width, y, width, height); + cairo_fill (cr); +} + +static void +draw_polygon (cairo_t *cr, int x, int y) +{ + cairo_new_path (cr); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + HEIGHT); + cairo_line_to (cr, x + WIDTH / 2, y + 3 * HEIGHT / 4); + cairo_line_to (cr, x + WIDTH, y + HEIGHT); + cairo_line_to (cr, x + WIDTH, y); + cairo_line_to (cr, x + WIDTH / 2, y + HEIGHT / 4); + cairo_close_path (cr); + cairo_fill (cr); +} + +static void +clip_none (cairo_t *cr, int x, int y) +{ +} + +static void +clip_rect (cairo_t *cr, int x, int y) +{ + cairo_new_path (cr); + cairo_rectangle (cr, x + (int)WIDTH / 6, y + (int)HEIGHT / 6, + 4 * ((int)WIDTH / 6), 4 * ((int)WIDTH / 6)); + cairo_clip (cr); + cairo_new_path (cr); +} + +static void +clip_rects (cairo_t *cr, int x, int y) +{ + int height = HEIGHT / 3; + + cairo_new_path (cr); + cairo_rectangle (cr, x, y, WIDTH, height); + cairo_rectangle (cr, x, y + 2 * height, WIDTH, height); + cairo_clip (cr); + cairo_new_path (cr); +} + +static void +clip_circle (cairo_t *cr, int x, int y) +{ + cairo_new_path (cr); + cairo_arc (cr, x + WIDTH / 2, y + HEIGHT / 2, + WIDTH / 3, 0, 2 * M_PI); + cairo_clip (cr); + cairo_new_path (cr); +} + +static void (* const pattern_funcs[])(const cairo_test_context_t *ctx, cairo_t *cr, int x, int y) = { + set_solid_pattern, + set_translucent_pattern, + set_gradient_pattern, + set_image_pattern, +}; + +static void (* const draw_funcs[])(cairo_t *cr, int x, int y) = { + draw_rect, + draw_rects, + draw_polygon, +}; + +static void (* const clip_funcs[])(cairo_t *cr, int x, int y) = { + clip_none, + clip_rect, + clip_rects, + clip_circle, +}; + +#define IMAGE_WIDTH (ARRAY_LENGTH (pattern_funcs) * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (draw_funcs) * ARRAY_LENGTH (clip_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + size_t i, j, k, x, y; + + for (k = 0; k < ARRAY_LENGTH (clip_funcs); k++) { + for (j = 0; j < ARRAY_LENGTH (draw_funcs); j++) { + for (i = 0; i < ARRAY_LENGTH (pattern_funcs); i++) { + x = i * (WIDTH + PAD) + PAD; + y = (ARRAY_LENGTH (draw_funcs) * k + j) * (HEIGHT + PAD) + PAD; + + cairo_save (cr); + + cairo_move_to (cr, x, y); + clip_funcs[k] (cr, x, y); + pattern_funcs[i] (ctx, cr, x, y); + draw_funcs[j] (cr, x, y); + if (cairo_status (cr)) + cairo_test_log (ctx, "%d %d HERE!\n", (int)i, (int)j); + + cairo_restore (cr); + } + } + } + + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) + cairo_test_log (ctx, "%d %d .HERE!\n", (int)i, (int)j); + + cairo_surface_destroy (image); + image = NULL; + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (trap_clip, + "Trapezoid clipping", + "clip, trap", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/twin-antialias-gray.c b/test/twin-antialias-gray.c new file mode 100644 index 000000000..8e00370b0 --- /dev/null +++ b/test/twin-antialias-gray.c @@ -0,0 +1,71 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_options_t *options; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_GRAY); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + cairo_set_font_size (cr, 16); + + cairo_move_to (cr, 4, 14); + cairo_show_text (cr, "Is cairo's twin giza?"); + + cairo_move_to (cr, 4, 34); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_fill (cr); + + cairo_move_to (cr, 4, 54); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_set_line_width (cr, 2/16.); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (twin_antialias_gray, + "Tests the internal font (with antialiasing reduced)", + "twin, font", /* keywords */ + "target=raster", /* requirements */ + 140, 60, + NULL, draw) diff --git a/test/twin-antialias-mixed.c b/test/twin-antialias-mixed.c new file mode 100644 index 000000000..da4121a1d --- /dev/null +++ b/test/twin-antialias-mixed.c @@ -0,0 +1,97 @@ +/* + * Copyright 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_scaled_font_t * +create_twin (cairo_t *cr, cairo_antialias_t antialias) +{ + cairo_font_options_t *options; + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, antialias); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + return cairo_scaled_font_reference (cairo_get_scaled_font (cr)); +} + + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_scaled_font_t *subpixel, *gray, *none; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_font_size (cr, 16); + subpixel = create_twin (cr, CAIRO_ANTIALIAS_SUBPIXEL); + gray = create_twin (cr, CAIRO_ANTIALIAS_GRAY); + none = create_twin (cr, CAIRO_ANTIALIAS_NONE); + + cairo_move_to (cr, 4, 14); + cairo_set_scaled_font (cr, subpixel); + cairo_show_text (cr, "Is cairo's"); + cairo_set_scaled_font (cr, gray); + cairo_show_text (cr, " twin"); + cairo_set_scaled_font (cr, none); + cairo_show_text (cr, " giza?"); + + cairo_move_to (cr, 4, 34); + cairo_set_scaled_font (cr, gray); + cairo_show_text (cr, "Is cairo's"); + cairo_set_scaled_font (cr, none); + cairo_show_text (cr, " twin"); + cairo_set_scaled_font (cr, subpixel); + cairo_show_text (cr, " giza?"); + + cairo_move_to (cr, 4, 54); + cairo_set_scaled_font (cr, none); + cairo_show_text (cr, "Is cairo's"); + cairo_set_scaled_font (cr, gray); + cairo_show_text (cr, " twin"); + cairo_set_scaled_font (cr, subpixel); + cairo_show_text (cr, " giza?"); + + cairo_scaled_font_destroy (none); + cairo_scaled_font_destroy (gray); + cairo_scaled_font_destroy (subpixel); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (twin_antialias_mixed, + "Tests the internal font (with intermixed antialiasing)", + "twin, font", /* keywords */ + "target=raster", /* requirements */ + 140, 60, + NULL, draw) diff --git a/test/twin-antialias-none.c b/test/twin-antialias-none.c new file mode 100644 index 000000000..a5b713db3 --- /dev/null +++ b/test/twin-antialias-none.c @@ -0,0 +1,71 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_options_t *options; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_NONE); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + cairo_set_font_size (cr, 16); + + cairo_move_to (cr, 4, 14); + cairo_show_text (cr, "Is cairo's twin giza?"); + + cairo_move_to (cr, 4, 34); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_fill (cr); + + cairo_move_to (cr, 4, 54); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_set_line_width (cr, 2/16.); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (twin_antialias_none, + "Tests the internal font (with antialiasing disabled)", + "twin, font", /* keywords */ + "target=raster", /* requirements */ + 140, 60, + NULL, draw) diff --git a/test/twin-antialias-subpixel.c b/test/twin-antialias-subpixel.c new file mode 100644 index 000000000..e0262863c --- /dev/null +++ b/test/twin-antialias-subpixel.c @@ -0,0 +1,71 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_options_t *options; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_SUBPIXEL); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + options = cairo_font_options_create (); + cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_SUBPIXEL); + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + + cairo_set_font_size (cr, 16); + + cairo_move_to (cr, 4, 14); + cairo_show_text (cr, "Is cairo's twin giza?"); + + cairo_move_to (cr, 4, 34); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_fill (cr); + + cairo_move_to (cr, 4, 54); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_set_line_width (cr, 2/16.); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (twin_antialias_subpixel, + "Tests the internal font (with subpixel antialiasing)", + "twin, font", /* keywords */ + "target=raster", /* requirements */ + 140, 60, + NULL, draw) diff --git a/test/twin.c b/test/twin.c new file mode 100644 index 000000000..08865f077 --- /dev/null +++ b/test/twin.c @@ -0,0 +1,61 @@ +/* + * Copyright 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_select_font_face (cr, + "@cairo:", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, 16); + + cairo_move_to (cr, 4, 14); + cairo_show_text (cr, "Is cairo's twin giza?"); + + cairo_move_to (cr, 4, 34); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_fill (cr); + + cairo_move_to (cr, 4, 54); + cairo_text_path (cr, "Is cairo's twin giza?"); + cairo_set_line_width (cr, 2/16.); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (twin, + "Tests the internal font", + "twin, font", /* keywords */ + NULL, /* requirements */ + 140, 60, + NULL, draw) diff --git a/test/unaligned-box.c b/test/unaligned-box.c new file mode 100644 index 000000000..552691934 --- /dev/null +++ b/test/unaligned-box.c @@ -0,0 +1,73 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define WIDTH 48 +#define HEIGHT 52 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int sx, sy; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + + cairo_translate(cr, 2, 2); + + for (sx = 1; sx <= 4; sx++) { + cairo_save (cr); + for (sy = 1; sy <= 4; sy++) { + cairo_rectangle (cr, 0, 0, sx, sy); + cairo_fill (cr); + + cairo_rectangle (cr, sx + 1 + .5, 0, sx, sy); + cairo_fill (cr); + + cairo_rectangle (cr, 0, sy + 1 + .5, sx, sy); + cairo_fill (cr); + + cairo_rectangle (cr, sx + 1 + .5, sy + 1 + .5, sx-.5, sy-.5); + cairo_fill (cr); + + cairo_translate (cr, 2*sx + 3, 0); + } + cairo_restore (cr); + cairo_translate (cr, 0, 2*sy + 3); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (unaligned_box, + "Tests handling of various boundary conditions for unaligned rectangles.", + "fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/unantialiased-shapes.c b/test/unantialiased-shapes.c new file mode 100644 index 000000000..b53ed0d6e --- /dev/null +++ b/test/unantialiased-shapes.c @@ -0,0 +1,98 @@ +/* + * Copyright © 2005 Billy Biggs + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Billy Biggs not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Billy Biggs makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * BILLY BIGGS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL BILLY BIGGS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Billy Biggs + */ + +#include "cairo-test.h" + +/* The star shape from the SVG test suite, from the fill rule test */ +static void +big_star_path (cairo_t *cr) +{ + cairo_move_to (cr, 40, 0); + cairo_rel_line_to (cr, 25, 80); + cairo_rel_line_to (cr, -65, -50); + cairo_rel_line_to (cr, 80, 0); + cairo_rel_line_to (cr, -65, 50); + cairo_close_path (cr); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + + /* Try a circle */ + cairo_arc (cr, 40, 40, 20, 0, 2 * M_PI); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_fill (cr); + + /* Try using clipping to draw a circle */ + cairo_arc (cr, 100, 40, 20, 0, 2 * M_PI); + cairo_clip (cr); + cairo_rectangle (cr, 80, 20, 40, 40); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_fill (cr); + + /* Reset the clipping */ + cairo_reset_clip (cr); + + /* Draw a bunch of lines */ + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, 0, 1, 0); + for (i = 0; i < 10; i++) { + cairo_move_to (cr, 10, 70 + (i * 4)); + cairo_line_to (cr, 120, 70 + (i * 18)); + cairo_stroke (cr); + } + + /* Try filling a poly */ + cairo_translate (cr, 160, 120); + cairo_set_source_rgb (cr, 1, 1, 0); + big_star_path (cr); + cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); + cairo_fill (cr); + cairo_translate (cr, -160, -120); + + /* How about some curves? */ + cairo_set_source_rgb (cr, 1, 0, 1); + for (i = 0; i < 10; i++) { + cairo_move_to (cr, 150, 50 + (i * 5)); + cairo_curve_to (cr, 250, 50, 200, (i * 10), 300, 50 + (i * 10)); + cairo_stroke (cr); + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (unantialiased_shapes, + "Test shape drawing without antialiasing", + "fill, stroke", /* keywords */ + "target=raster", /* requirements */ + 320, 240, + NULL, draw) diff --git a/test/unbounded-operator.c b/test/unbounded-operator.c new file mode 100644 index 000000000..ac1c50d1d --- /dev/null +++ b/test/unbounded-operator.c @@ -0,0 +1,185 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Kristian Høgsberg + * Owen Taylor + */ + +#include "cairo-test.h" +#include +#include + +#define WIDTH 16 +#define HEIGHT 16 +#define PAD 2 + +static void +draw_mask (cairo_t *cr, int x, int y) +{ + cairo_surface_t *mask_surface; + cairo_t *cr2; + + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + mask_surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + width, height); + cr2 = cairo_create (mask_surface); + cairo_surface_destroy (mask_surface); + + cairo_save (cr2); + cairo_set_source_rgba (cr2, 0, 0, 0, 0); /* transparent */ + cairo_set_operator (cr2, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr2); + cairo_restore (cr2); + + cairo_set_source_rgb (cr2, 1, 1, 1); /* white */ + + cairo_arc (cr2, 0.5 * width, 0.5 * height, 0.45 * height, 0, 2 * M_PI); + cairo_fill (cr2); + + cairo_mask_surface (cr, cairo_get_target (cr2), x, y); + cairo_destroy (cr2); +} + +static void +draw_glyphs (cairo_t *cr, int x, int y) +{ + cairo_text_extents_t extents; + + cairo_set_font_size (cr, 0.8 * HEIGHT); + + cairo_text_extents (cr, "FG", &extents); + cairo_move_to (cr, + x + floor ((WIDTH - extents.width) / 2 + 0.5) - extents.x_bearing, + y + floor ((HEIGHT - extents.height) / 2 + 0.5) - extents.y_bearing); + cairo_show_text (cr, "FG"); +} + +static void +draw_polygon (cairo_t *cr, int x, int y) +{ + double width = (int)(0.9 * WIDTH); + double height = (int)(0.9 * HEIGHT); + x += 0.05 * WIDTH; + y += 0.05 * HEIGHT; + + cairo_new_path (cr); + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + height); + cairo_line_to (cr, x + width / 2, y + 3 * height / 4); + cairo_line_to (cr, x + width, y + height); + cairo_line_to (cr, x + width, y); + cairo_line_to (cr, x + width / 2, y + height / 4); + cairo_close_path (cr); + cairo_fill (cr); +} + +static void +draw_rects (cairo_t *cr, int x, int y) +{ + double block_width = (int)(0.33 * WIDTH + 0.5); + double block_height = (int)(0.33 * HEIGHT + 0.5); + int i, j; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + if ((i + j) % 2 == 0) + cairo_rectangle (cr, + x + block_width * i, y + block_height * j, + block_width, block_height); + + cairo_fill (cr); +} + +static void (*const draw_funcs[])(cairo_t *cr, int x, int y) = { + draw_mask, + draw_glyphs, + draw_polygon, + draw_rects +}; + +static cairo_operator_t operators[] = { + CAIRO_OPERATOR_IN, CAIRO_OPERATOR_OUT, + CAIRO_OPERATOR_DEST_IN, CAIRO_OPERATOR_DEST_ATOP +}; + +#define IMAGE_WIDTH (ARRAY_LENGTH (operators) * (WIDTH + PAD) + PAD) +#define IMAGE_HEIGHT (ARRAY_LENGTH (draw_funcs) * (HEIGHT + PAD) + PAD) + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + size_t i, j, x, y; + cairo_pattern_t *pattern; + + cairo_select_font_face (cr, CAIRO_TEST_FONT_FAMILY " Sans", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + for (j = 0; j < ARRAY_LENGTH (draw_funcs); j++) { + for (i = 0; i < ARRAY_LENGTH (operators); i++) { + x = i * (WIDTH + PAD) + PAD; + y = j * (HEIGHT + PAD) + PAD; + + cairo_save (cr); + + pattern = cairo_pattern_create_linear (x + WIDTH, y, + x, y + HEIGHT); + cairo_pattern_add_color_stop_rgba (pattern, 0.2, + 0.0, 0.0, 1.0, 1.0); /* Solid blue */ + cairo_pattern_add_color_stop_rgba (pattern, 0.8, + 0.0, 0.0, 1.0, 0.0); /* Transparent blue */ + cairo_set_source (cr, pattern); + cairo_pattern_destroy (pattern); + + cairo_rectangle (cr, x, y, WIDTH, HEIGHT); + cairo_fill_preserve (cr); + cairo_clip (cr); + + cairo_set_operator (cr, operators[i]); + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + + draw_funcs[j] (cr, x, y); + if (cairo_status (cr)) + cairo_test_log (ctx, "%d %d HERE!\n", (int)i, (int)j); + + cairo_restore (cr); + } + } + + if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) + cairo_test_log (ctx, "%d %d .HERE!\n", (int)i, (int)j); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (unbounded_operator, + "Operators with an effect for transparent source/mask", + "operator", /* keywords */ + NULL, /* requirements */ + IMAGE_WIDTH, IMAGE_HEIGHT, + NULL, draw) diff --git a/test/unclosed-strokes.c b/test/unclosed-strokes.c new file mode 100644 index 000000000..40a76eb6b --- /dev/null +++ b/test/unclosed-strokes.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2011 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" + +#define LINE_WIDTH 10. +#define SIZE (5 * LINE_WIDTH) +#define PAD (2 * LINE_WIDTH) + +static void +make_path (cairo_t *cr) +{ + cairo_move_to (cr, 0, 0); + cairo_rel_line_to (cr, -SIZE/2, SIZE); + cairo_rel_line_to (cr, SIZE, 0); + /* back to the start, but do not close */ + cairo_rel_line_to (cr, -SIZE/2, -SIZE); +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + cairo_set_line_width (cr, LINE_WIDTH); + cairo_translate (cr, PAD + SIZE / 2., PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_BEVEL); + make_path (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + make_path (cr); + cairo_stroke (cr); + + cairo_translate (cr, 0, SIZE + PAD); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); + make_path (cr); + cairo_stroke (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (unclosed_strokes, + "Test coincident end-points are capped and not joined", + "stroke, caps", /* keywords */ + NULL, /* requirements */ + PAD + SIZE + PAD, + 3 * (PAD + SIZE) + PAD, + NULL, draw) + diff --git a/test/user-data.c b/test/user-data.c new file mode 100644 index 000000000..532107aa2 --- /dev/null +++ b/test/user-data.c @@ -0,0 +1,110 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Kristian Høgsberg + */ + +#include "cairo-test.h" + +#include + +static void +destroy_data1 (void *p) +{ + *(int *) p = 1; +} + +static void +destroy_data2 (void *p) +{ + *(int *) p = 2; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + static const cairo_user_data_key_t key1, key2; + cairo_surface_t *surface; + cairo_status_t status; + int data1, data2; + + data1 = 0; + data2 = 0; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); + status = cairo_surface_set_user_data (surface, &key1, &data1, destroy_data1); + if (status) + goto error; + + status = cairo_surface_set_user_data (surface, &key2, &data2, destroy_data2); + if (status) + goto error; + + assert (cairo_surface_get_user_data (surface, &key1) == &data1); + status = cairo_surface_set_user_data (surface, &key1, NULL, NULL); + if (status) + goto error; + + assert (cairo_surface_get_user_data (surface, &key1) == NULL); + assert (data1 == 1); + assert (data2 == 0); + + status = cairo_surface_set_user_data (surface, &key2, NULL, NULL); + if (status) + goto error; + + assert (data2 == 2); + + data1 = 0; + status = cairo_surface_set_user_data (surface, &key1, &data1, NULL); + if (status) + goto error; + + status = cairo_surface_set_user_data (surface, &key1, NULL, NULL); + if (status) + goto error; + + assert (data1 == 0); + assert (cairo_surface_get_user_data (surface, &key1) == NULL); + + status = cairo_surface_set_user_data (surface, &key1, &data1, destroy_data1); + if (status) + goto error; + + cairo_surface_destroy (surface); + + assert (data1 == 1); + assert (data2 == 2); + + return CAIRO_TEST_SUCCESS; + +error: + cairo_surface_destroy (surface); + return cairo_test_status_from_status (ctx, status); +} + +CAIRO_TEST (user_data, + "Test setting and getting random bits of user data.", + "api", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/user-font-mask.c b/test/user-font-mask.c new file mode 100644 index 000000000..cf548e649 --- /dev/null +++ b/test/user-font-mask.c @@ -0,0 +1,253 @@ +/* + * Copyright © 2006, 2008 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Contributor(s): + * Kristian Høgsberg + * Behdad Esfahbod + * Adrian Johnson + */ + +#include "cairo-test.h" + +#include +#include + +/*#define ROTATED 1*/ + +#define BORDER 10 +#define TEXT_SIZE 64 +#define WIDTH (TEXT_SIZE * 15 + 2*BORDER) +#ifndef ROTATED + #define HEIGHT ((TEXT_SIZE + 2*BORDER)*2) +#else + #define HEIGHT WIDTH +#endif +#define END_GLYPH 0 +#define TEXT "cairo" + +/* Reverse the bits in a byte with 7 operations (no 64-bit): + * Devised by Sean Anderson, July 13, 2001. + * Source: http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits + */ +#define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16) + +#ifdef WORDS_BIGENDIAN +#define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) (c) +#else +#define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) CAIRO_BITSWAP8(c) +#endif + + + +/* Simple glyph definition. data is an 8x8 bitmap. + */ +typedef struct { + unsigned long ucs4; + int width; + char data[8]; +} test_scaled_font_glyph_t; + +static cairo_user_data_key_t test_font_face_glyphs_key; + +static cairo_status_t +test_scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *metrics) +{ + metrics->ascent = 1; + metrics->descent = 0; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +test_scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph) +{ + test_scaled_font_glyph_t *glyphs = cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &test_font_face_glyphs_key); + int i; + + for (i = 0; glyphs[i].ucs4 != (unsigned long) -1; i++) + if (glyphs[i].ucs4 == unicode) { + *glyph = i; + return CAIRO_STATUS_SUCCESS; + } + + /* Not found. Default to glyph 0 */ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +test_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + test_scaled_font_glyph_t *glyphs = cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &test_font_face_glyphs_key); + int i; + unsigned char *data; + cairo_surface_t *image; + cairo_pattern_t *pattern; + cairo_matrix_t matrix; + uint8_t byte; + + /* FIXME: We simply crash on out-of-bound glyph indices */ + + metrics->x_advance = (glyphs[glyph].width + 1) / 8.0; + + image = cairo_image_surface_create (CAIRO_FORMAT_A1, glyphs[glyph].width, 8); + if (cairo_surface_status (image)) + return cairo_surface_status (image); + + data = cairo_image_surface_get_data (image); + for (i = 0; i < 8; i++) { + byte = glyphs[glyph].data[i]; + *data = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (byte); + data += cairo_image_surface_get_stride (image); + } + cairo_surface_mark_dirty (image); + + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + + cairo_matrix_init_identity (&matrix); + cairo_matrix_scale (&matrix, 1.0/8.0, 1.0/8.0); + cairo_matrix_translate (&matrix, 0, -8); + cairo_matrix_invert (&matrix); + cairo_pattern_set_matrix (pattern, &matrix); + + cairo_set_source (cr, pattern); + cairo_mask (cr, pattern); + cairo_pattern_destroy (pattern); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_user_font_face_create (cairo_font_face_t **out) +{ + static const test_scaled_font_glyph_t glyphs [] = { + { 'c', 6, { 0x00, 0x38, 0x44, 0x80, 0x80, 0x80, 0x44, 0x38 } }, + { 'a', 6, { 0x00, 0x70, 0x88, 0x3c, 0x44, 0x84, 0x8c, 0x74 } }, + { 'i', 1, { 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 } }, + { 'r', 6, { 0x00, 0xb8, 0xc4, 0x80, 0x80, 0x80, 0x80, 0x80 } }, + { 'o', 7, { 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38 } }, + { -1, 8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + }; + + cairo_font_face_t *user_font_face; + cairo_status_t status; + + user_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_init_func (user_font_face, test_scaled_font_init); + cairo_user_font_face_set_render_glyph_func (user_font_face, test_scaled_font_render_glyph); + cairo_user_font_face_set_unicode_to_glyph_func (user_font_face, test_scaled_font_unicode_to_glyph); + + status = cairo_font_face_set_user_data (user_font_face, + &test_font_face_glyphs_key, + (void*) glyphs, NULL); + if (status) { + cairo_font_face_destroy (user_font_face); + return status; + } + + *out = user_font_face; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_face_t *font_face; + const char text[] = TEXT; + cairo_font_extents_t font_extents; + cairo_text_extents_t extents; + cairo_status_t status; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + +#ifdef ROTATED + cairo_translate (cr, TEXT_SIZE, 0); + cairo_rotate (cr, .6); +#endif + + status = _user_font_face_create (&font_face); + if (status) { + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_font_face (cr, font_face); + cairo_font_face_destroy (font_face); + + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_font_extents (cr, &font_extents); + cairo_text_extents (cr, text, &extents); + + /* logical boundaries in red */ + cairo_move_to (cr, 0, BORDER); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, 0, BORDER + font_extents.ascent); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, 0, BORDER + font_extents.ascent + font_extents.descent); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, BORDER, 0); + cairo_rel_line_to (cr, 0, 2*BORDER + TEXT_SIZE); + cairo_move_to (cr, BORDER + extents.x_advance, 0); + cairo_rel_line_to (cr, 0, 2*BORDER + TEXT_SIZE); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* ink boundaries in green */ + cairo_rectangle (cr, + BORDER + extents.x_bearing, BORDER + font_extents.ascent + extents.y_bearing, + extents.width, extents.height); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* text in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, BORDER, BORDER + font_extents.ascent); + cairo_show_text (cr, text); + + + /* filled version of text in blue */ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_move_to (cr, BORDER, BORDER + font_extents.height + 2*BORDER + font_extents.ascent); + cairo_text_path (cr, text); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (user_font_mask, + "Tests a user-font using cairo_mask with bitmap images", + "user-font, mask", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/user-font-proxy.c b/test/user-font-proxy.c new file mode 100644 index 000000000..6a39d8ed8 --- /dev/null +++ b/test/user-font-proxy.c @@ -0,0 +1,222 @@ +/* + * Copyright © 2006, 2008 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Contributor(s): + * Kristian Høgsberg + * Behdad Esfahbod + */ + +#include "cairo-test.h" + +#include +#include + +/*#define ROTATED 1*/ + +#define BORDER 10 +#define TEXT_SIZE 64 +#define WIDTH (TEXT_SIZE * 12 + 2*BORDER) +#ifndef ROTATED + #define HEIGHT ((TEXT_SIZE + 2*BORDER)*2) +#else + #define HEIGHT WIDTH +#endif +#define TEXT "geez... cairo user-font" + +static cairo_user_data_key_t fallback_font_key; + +static cairo_status_t +test_scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *extents) +{ + cairo_status_t status; + + cairo_set_font_face (cr, + cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &fallback_font_key)); + + status = cairo_scaled_font_set_user_data (scaled_font, + &fallback_font_key, + cairo_scaled_font_reference (cairo_get_scaled_font (cr)), + (cairo_destroy_func_t) cairo_scaled_font_destroy); + if (unlikely (status)) { + cairo_scaled_font_destroy (cairo_get_scaled_font (cr)); + return status; + } + + cairo_font_extents (cr, extents); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +test_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *extents) +{ + cairo_glyph_t cairo_glyph; + + cairo_glyph.index = glyph; + cairo_glyph.x = 0; + cairo_glyph.y = 0; + + cairo_set_font_face (cr, + cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &fallback_font_key)); + + cairo_show_glyphs (cr, &cairo_glyph, 1); + cairo_glyph_extents (cr, &cairo_glyph, 1, extents); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +test_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, + const char *utf8, + int utf8_len, + cairo_glyph_t **glyphs, + int *num_glyphs, + cairo_text_cluster_t **clusters, + int *num_clusters, + cairo_text_cluster_flags_t *cluster_flags) +{ + cairo_scaled_font_t *fallback_scaled_font; + + fallback_scaled_font = cairo_scaled_font_get_user_data (scaled_font, + &fallback_font_key); + + return cairo_scaled_font_text_to_glyphs (fallback_scaled_font, 0, 0, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, cluster_flags); +} + +static cairo_status_t +_user_font_face_create (cairo_font_face_t **out) +{ + cairo_font_face_t *user_font_face; + cairo_font_face_t *fallback_font_face; + cairo_status_t status; + + user_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_init_func (user_font_face, test_scaled_font_init); + cairo_user_font_face_set_render_glyph_func (user_font_face, test_scaled_font_render_glyph); + cairo_user_font_face_set_text_to_glyphs_func (user_font_face, test_scaled_font_text_to_glyphs); + + /* This also happens to be default font face on cairo_t, so does + * not make much sense here. For demonstration only. + */ + fallback_font_face = cairo_toy_font_face_create ("", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + + status = cairo_font_face_set_user_data (user_font_face, + &fallback_font_key, + fallback_font_face, + (cairo_destroy_func_t) cairo_font_face_destroy); + if (status) { + cairo_font_face_destroy (fallback_font_face); + cairo_font_face_destroy (user_font_face); + return status; + } + + *out = user_font_face; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + const char text[] = TEXT; + cairo_font_extents_t font_extents; + cairo_text_extents_t extents; + cairo_font_face_t *font_face; + cairo_status_t status; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + +#ifdef ROTATED + cairo_translate (cr, TEXT_SIZE, 0); + cairo_rotate (cr, .6); +#endif + + status = _user_font_face_create (&font_face); + if (status) { + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_font_face (cr, font_face); + cairo_font_face_destroy (font_face); + + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_font_extents (cr, &font_extents); + cairo_text_extents (cr, text, &extents); + + /* logical boundaries in red */ + cairo_move_to (cr, 0, BORDER); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, 0, BORDER + font_extents.ascent); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, 0, BORDER + font_extents.ascent + font_extents.descent); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, BORDER, 0); + cairo_rel_line_to (cr, 0, 2*BORDER + TEXT_SIZE); + cairo_move_to (cr, BORDER + extents.x_advance, 0); + cairo_rel_line_to (cr, 0, 2*BORDER + TEXT_SIZE); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* ink boundaries in green */ + cairo_rectangle (cr, + BORDER + extents.x_bearing, BORDER + font_extents.ascent + extents.y_bearing, + extents.width, extents.height); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* text in gray */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, BORDER, BORDER + font_extents.ascent); + cairo_show_text (cr, text); + + + /* filled version of text in light blue */ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_move_to (cr, BORDER, BORDER + font_extents.height + BORDER + font_extents.ascent); + cairo_text_path (cr, text); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (user_font_proxy, + "Tests a user-font using a native font in its render_glyph", + "font, user-font", /* keywords */ + "cairo >= 1.7.4", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/user-font-rescale.c b/test/user-font-rescale.c new file mode 100644 index 000000000..6f03b8e66 --- /dev/null +++ b/test/user-font-rescale.c @@ -0,0 +1,368 @@ +/* + * Copyright © 2008 Jeff Muizelaar + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Jeff Muizelaar not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Jeff Muizelaar makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF MUIZELAAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL JEFF MUIZELAAR BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Contributor(s): + * Jeff Muizelaar + * Kristian Høgsberg + * Behdad Esfahbod + */ + +#include "cairo-test.h" + +#include + +#define BORDER 10 +#define TEXT_SIZE 32 +#define WIDTH (TEXT_SIZE * 13.75 + 2*BORDER) +#define HEIGHT ((TEXT_SIZE + 2*BORDER)*3 + BORDER) +#define TEXT "test of rescaled glyphs" + +static const cairo_user_data_key_t rescale_font_closure_key; + +struct rescaled_font { + cairo_font_face_t *substitute_font; + cairo_scaled_font_t *measuring_font; + unsigned long glyph_count; + unsigned long start; + double *desired_width; + double *rescale_factor; +}; + +static cairo_status_t +test_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + cairo_font_face_t *user_font; + struct rescaled_font *r; + cairo_glyph_t cairo_glyph; + + cairo_glyph.index = glyph; + cairo_glyph.x = 0; + cairo_glyph.y = 0; + + user_font = cairo_scaled_font_get_font_face (scaled_font); + r = cairo_font_face_get_user_data (user_font, &rescale_font_closure_key); + cairo_set_font_face (cr, r->substitute_font); + + if (glyph - r->start < r->glyph_count) { + cairo_matrix_t matrix; + + if (isnan (r->rescale_factor[glyph - r->start])) { + double desired_width; + double actual_width; + cairo_text_extents_t extents; + + /* measure the glyph and compute the necessary rescaling factor */ + cairo_scaled_font_glyph_extents (r->measuring_font, + &cairo_glyph, 1, + &extents); + + desired_width = r->desired_width[glyph - r->start]; + actual_width = extents.x_advance; + + r->rescale_factor[glyph - r->start] = desired_width / actual_width; + } + + /* scale the font so that the glyph width matches the desired width */ + cairo_get_font_matrix (cr, &matrix); + cairo_matrix_scale (&matrix, r->rescale_factor[glyph - r->start], 1.); + cairo_set_font_matrix (cr, &matrix); + } + + cairo_show_glyphs (cr, &cairo_glyph, 1); + cairo_glyph_extents (cr, &cairo_glyph, 1, metrics); + + return CAIRO_STATUS_SUCCESS; +} + +static void +unichar_to_utf8 (uint32_t ucs4, char utf8[7]) +{ + int i, charlen, first; + + if (ucs4 < 0x80) { + first = 0; + charlen = 1; + } else if (ucs4 < 0x800) { + first = 0xc0; + charlen = 2; + } else if (ucs4 < 0x10000) { + first = 0xe0; + charlen = 3; + } else if (ucs4 < 0x200000) { + first = 0xf0; + charlen = 4; + } else if (ucs4 < 0x4000000) { + first = 0xf8; + charlen = 5; + } else { + first = 0xfc; + charlen = 6; + } + + for (i = charlen - 1; i > 0; --i) { + utf8[i] = (ucs4 & 0x3f) | 0x80; + ucs4 >>= 6; + } + utf8[0] = ucs4 | first; + utf8[charlen] = '\0'; +} + +static cairo_status_t +test_scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph_index) +{ + cairo_font_face_t *user_font; + struct rescaled_font *r; + int num_glyphs; + cairo_glyph_t *glyphs = NULL; + cairo_status_t status; + char utf8[7]; + + user_font = cairo_scaled_font_get_font_face (scaled_font); + + unichar_to_utf8 (unicode, utf8); + r = cairo_font_face_get_user_data (user_font, &rescale_font_closure_key); + status = cairo_scaled_font_text_to_glyphs (r->measuring_font, 0, 0, + utf8, -1, + &glyphs, &num_glyphs, + NULL, NULL, NULL); + if (status) + return status; + + *glyph_index = glyphs[0].index; + + cairo_glyph_free (glyphs); + return CAIRO_STATUS_SUCCESS; +} + +static void rescale_font_closure_destroy (void *data) +{ + struct rescaled_font *r = data; + + cairo_font_face_destroy (r->substitute_font); + cairo_scaled_font_destroy (r->measuring_font); + free (r->desired_width); + free (r->rescale_factor); + free (r); +} + +static cairo_status_t +create_rescaled_font (cairo_font_face_t *substitute_font, + int glyph_start, + int glyph_count, + double *desired_width, + cairo_font_face_t **out) +{ + cairo_font_face_t *user_font_face; + struct rescaled_font *r; + cairo_font_options_t *options; + cairo_status_t status; + cairo_matrix_t m; + unsigned long i; + + user_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_render_glyph_func (user_font_face, test_scaled_font_render_glyph); + cairo_user_font_face_set_unicode_to_glyph_func (user_font_face, test_scaled_font_unicode_to_glyph); + + r = xmalloc (sizeof (struct rescaled_font)); + r->substitute_font = cairo_font_face_reference (substitute_font); + + /* we don't want any hinting when doing the measuring */ + options = cairo_font_options_create (); + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + + cairo_matrix_init_identity (&m); + + r->measuring_font = cairo_scaled_font_create (r->substitute_font, + &m, &m, + options); + cairo_font_options_destroy (options); + + + r->start = glyph_start; + r->glyph_count = glyph_count; + r->desired_width = xcalloc (sizeof (double), r->glyph_count); + r->rescale_factor = xcalloc (sizeof (double), r->glyph_count); + + for (i = 0; i < r->glyph_count; i++) { + r->desired_width[i] = desired_width[i]; + /* use NaN to specify unset */ + r->rescale_factor[i] = cairo_test_NaN (); + } + + status = cairo_font_face_set_user_data (user_font_face, + &rescale_font_closure_key, + r, rescale_font_closure_destroy); + if (status) { + rescale_font_closure_destroy (r); + cairo_font_face_destroy (user_font_face); + return status; + } + + *out = user_font_face; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +get_user_font_face (cairo_font_face_t *substitute_font, + const char *text, + cairo_font_face_t *old, + cairo_font_face_t **out) +{ + cairo_font_options_t *options; + cairo_matrix_t m; + cairo_scaled_font_t *measure; + int i; + double *widths; + int count; + int num_glyphs; + unsigned long min_index, max_index; + cairo_status_t status; + + cairo_glyph_t *glyphs = NULL; + + /* we don't want any hinting when doing the measuring */ + options = cairo_font_options_create (); + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + + cairo_matrix_init_identity (&m); + measure = cairo_scaled_font_create (old, &m, &m, options); + + status = cairo_scaled_font_text_to_glyphs (measure, 0, 0, + text, -1, + &glyphs, &num_glyphs, + NULL, NULL, NULL); + cairo_font_options_destroy (options); + + if (status) { + cairo_scaled_font_destroy (measure); + return status; + } + + /* find the glyph range the text covers */ + max_index = glyphs[0].index; + min_index = glyphs[0].index; + for (i=0; i max_index) + max_index = glyphs[i].index; + } + + count = max_index - min_index + 1; + widths = xcalloc (sizeof (double), count); + /* measure all of the necessary glyphs individually */ + for (i=0; i + * Behdad Esfahbod + */ + +#include "cairo-test.h" + +#include +#include + +/*#define ROTATED 1*/ + +#define BORDER 10 +#define TEXT_SIZE 64 +#define WIDTH (TEXT_SIZE * 15 + 2*BORDER) +#ifndef ROTATED + #define HEIGHT ((TEXT_SIZE + 2*BORDER)*2) +#else + #define HEIGHT WIDTH +#endif +#define TEXT "geez... cairo user-font" + +#define END_GLYPH 0 +#define STROKE 126 +#define CLOSE 127 + +/* Simple glyph definition: 1 - 15 means lineto (or moveto for first + * point) for one of the points on this grid: + * + * 1 2 3 + * 4 5 6 + * 7 8 9 + * ----10 11 12----(baseline) + * 13 14 15 + */ +typedef struct { + unsigned long ucs4; + int width; + char data[16]; +} test_scaled_font_glyph_t; + +static cairo_user_data_key_t test_font_face_glyphs_key; + +static cairo_status_t +test_scaled_font_init (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *metrics) +{ + metrics->ascent = .75; + metrics->descent = .25; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +test_scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph) +{ + test_scaled_font_glyph_t *glyphs = cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &test_font_face_glyphs_key); + int i; + + for (i = 0; glyphs[i].ucs4 != (unsigned long) -1; i++) + if (glyphs[i].ucs4 == unicode) { + *glyph = i; + return CAIRO_STATUS_SUCCESS; + } + + /* Not found. Default to glyph 0 */ + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +test_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + test_scaled_font_glyph_t *glyphs = cairo_font_face_get_user_data (cairo_scaled_font_get_font_face (scaled_font), + &test_font_face_glyphs_key); + int i; + const char *data; + div_t d; + double x, y; + + /* FIXME: We simply crash on out-of-bound glyph indices */ + + metrics->x_advance = glyphs[glyph].width / 4.0; + + cairo_set_line_width (cr, 0.1); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + + data = glyphs[glyph].data; + for (i = 0; data[i] != END_GLYPH; i++) { + switch (data[i]) { + case STROKE: + cairo_new_sub_path (cr); + break; + + case CLOSE: + cairo_close_path (cr); + break; + + default: + d = div (data[i] - 1, 3); + x = d.rem / 4.0 + 0.125; + y = d.quot / 5.0 + 0.4 - 1.0; + cairo_line_to (cr, x, y); + } + } + cairo_stroke (cr); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_user_font_face_create (cairo_font_face_t **out) +{ + /* Simple glyph definition: 1 - 15 means lineto (or moveto for first + * point) for one of the points on this grid: + * + * 1 2 3 + * 4 5 6 + * 7 8 9 + * ----10 11 12----(baseline) + * 13 14 15 + */ + static const test_scaled_font_glyph_t glyphs [] = { + { 'a', 3, { 4, 6, 12, 10, 7, 9, STROKE, END_GLYPH } }, + { 'c', 3, { 6, 4, 10, 12, STROKE, END_GLYPH } }, + { 'e', 3, { 12, 10, 4, 6, 9, 7, STROKE, END_GLYPH } }, + { 'f', 3, { 3, 2, 11, STROKE, 4, 6, STROKE, END_GLYPH } }, + { 'g', 3, { 12, 10, 4, 6, 15, 13, STROKE, END_GLYPH } }, + { 'h', 3, { 1, 10, STROKE, 7, 5, 6, 12, STROKE, END_GLYPH } }, + { 'i', 1, { 1, 1, STROKE, 4, 10, STROKE, END_GLYPH } }, + { 'l', 1, { 1, 10, STROKE, END_GLYPH } }, + { 'n', 3, { 10, 4, STROKE, 7, 5, 6, 12, STROKE, END_GLYPH } }, + { 'o', 3, { 4, 10, 12, 6, CLOSE, END_GLYPH } }, + { 'r', 3, { 4, 10, STROKE, 7, 5, 6, STROKE, END_GLYPH } }, + { 's', 3, { 6, 4, 7, 9, 12, 10, STROKE, END_GLYPH } }, + { 't', 3, { 2, 11, 12, STROKE, 4, 6, STROKE, END_GLYPH } }, + { 'u', 3, { 4, 10, 12, 6, STROKE, END_GLYPH } }, + { 'z', 3, { 4, 6, 10, 12, STROKE, END_GLYPH } }, + { ' ', 1, { END_GLYPH } }, + { '-', 2, { 7, 8, STROKE, END_GLYPH } }, + { '.', 1, { 10, 10, STROKE, END_GLYPH } }, + { -1, 0, { END_GLYPH } }, + }; + + cairo_font_face_t *user_font_face; + cairo_status_t status; + + user_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_init_func (user_font_face, test_scaled_font_init); + cairo_user_font_face_set_render_glyph_func (user_font_face, test_scaled_font_render_glyph); + cairo_user_font_face_set_unicode_to_glyph_func (user_font_face, test_scaled_font_unicode_to_glyph); + + status = cairo_font_face_set_user_data (user_font_face, + &test_font_face_glyphs_key, + (void*) glyphs, NULL); + if (status) { + cairo_font_face_destroy (user_font_face); + return status; + } + + *out = user_font_face; + return CAIRO_STATUS_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_font_face_t *font_face; + const char text[] = TEXT; + cairo_font_extents_t font_extents; + cairo_text_extents_t extents; + cairo_status_t status; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + +#ifdef ROTATED + cairo_translate (cr, TEXT_SIZE, 0); + cairo_rotate (cr, .6); +#endif + + status = _user_font_face_create (&font_face); + if (status) { + return cairo_test_status_from_status (cairo_test_get_context (cr), + status); + } + + cairo_set_font_face (cr, font_face); + cairo_font_face_destroy (font_face); + + cairo_set_font_size (cr, TEXT_SIZE); + + cairo_font_extents (cr, &font_extents); + cairo_text_extents (cr, text, &extents); + + /* logical boundaries in red */ + cairo_move_to (cr, 0, BORDER); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, 0, BORDER + font_extents.ascent); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, 0, BORDER + font_extents.ascent + font_extents.descent); + cairo_rel_line_to (cr, WIDTH, 0); + cairo_move_to (cr, BORDER, 0); + cairo_rel_line_to (cr, 0, 2*BORDER + TEXT_SIZE); + cairo_move_to (cr, BORDER + extents.x_advance, 0); + cairo_rel_line_to (cr, 0, 2*BORDER + TEXT_SIZE); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* ink boundaries in green */ + cairo_rectangle (cr, + BORDER + extents.x_bearing, BORDER + font_extents.ascent + extents.y_bearing, + extents.width, extents.height); + cairo_set_source_rgb (cr, 0, 1, 0); + cairo_set_line_width (cr, 2); + cairo_stroke (cr); + + /* text in black */ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_move_to (cr, BORDER, BORDER + font_extents.ascent); + cairo_show_text (cr, text); + + + /* filled version of text in blue */ + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_move_to (cr, BORDER, BORDER + font_extents.height + 2*BORDER + font_extents.ascent); + cairo_text_path (cr, text); + cairo_fill (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (user_font, + "Tests user font feature", + "font, user-font", /* keywords */ + "cairo >= 1.7.4", /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/white-in-noop.c b/test/white-in-noop.c new file mode 100644 index 000000000..e6a93e801 --- /dev/null +++ b/test/white-in-noop.c @@ -0,0 +1,52 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Andrea Canciani + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Andrea Canciani + */ + +#include "cairo-test.h" + +#define HEIGHT 4 +#define WIDTH 4 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_paint (cr); + + cairo_set_operator (cr, CAIRO_OPERATOR_IN); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (white_in_noop, + "Test an invalid optimization of the IN operator with white sources", + "operator", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/world-map.c b/test/world-map.c new file mode 100644 index 000000000..f775bb0d5 --- /dev/null +++ b/test/world-map.c @@ -0,0 +1,151 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +#define WIDTH 800 +#define HEIGHT 400 + +typedef enum { + WM_NEW_PATH, + WM_MOVE_TO, + WM_LINE_TO, + WM_HLINE_TO, + WM_VLINE_TO, + WM_REL_LINE_TO, + WM_END +} wm_type_t; + +typedef struct _wm_element { + wm_type_t type; + double x; + double y; +} wm_element_t; + +#include "world-map.h" + +enum { + STROKE = 1, + FILL = 2, +}; + +static cairo_test_status_t +draw_world_map (cairo_t *cr, int width, int height, int mode) +{ + const wm_element_t *e; + double cx, cy; + + cairo_set_line_width (cr, 0.2); + + cairo_set_source_rgb (cr, .68, .85, .90); /* lightblue */ + cairo_rectangle (cr, 0, 0, 800, 400); + cairo_fill (cr); + + e = &countries[0]; + while (1) { + switch (e->type) { + case WM_NEW_PATH: + case WM_END: + if (mode & FILL) { + cairo_set_source_rgb (cr, .75, .75, .75); /* silver */ + cairo_fill_preserve (cr); + } + if (mode & STROKE) { + cairo_set_source_rgb (cr, .50, .50, .50); /* gray */ + cairo_stroke (cr); + } + cairo_new_path (cr); + cairo_move_to (cr, e->x, e->y); + break; + case WM_MOVE_TO: + cairo_close_path (cr); + cairo_move_to (cr, e->x, e->y); + break; + case WM_LINE_TO: + cairo_line_to (cr, e->x, e->y); + break; + case WM_HLINE_TO: + cairo_get_current_point (cr, &cx, &cy); + cairo_line_to (cr, e->x, cy); + break; + case WM_VLINE_TO: + cairo_get_current_point (cr, &cx, &cy); + cairo_line_to (cr, cx, e->y); + break; + case WM_REL_LINE_TO: + cairo_rel_line_to (cr, e->x, e->y); + break; + } + if (e->type == WM_END) + break; + e++; + } + + cairo_new_path (cr); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw_world_map_stroke (cairo_t *cr, int width, int height) +{ + return draw_world_map (cr, width, height, STROKE); +} + +static cairo_test_status_t +draw_world_map_fill (cairo_t *cr, int width, int height) +{ + return draw_world_map (cr, width, height, FILL); +} + +static cairo_test_status_t +draw_world_map_both (cairo_t *cr, int width, int height) +{ + return draw_world_map (cr, width, height, FILL | STROKE); +} + +CAIRO_TEST (world_map, + "Tests a complex drawing (part of the performance suite)", + "fill, stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_world_map_both) +CAIRO_TEST (world_map_stroke, + "Tests a complex drawing (part of the performance suite)", + "stroke", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_world_map_stroke) +CAIRO_TEST (world_map_fill, + "Tests a complex drawing (part of the performance suite)", + "fill", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw_world_map_fill) diff --git a/test/world-map.h b/test/world-map.h new file mode 100644 index 000000000..af58b80f1 --- /dev/null +++ b/test/world-map.h @@ -0,0 +1,196 @@ +/* The data for this test case was provided by Gary Nicholson + * who originally created an interactive SVG map + * of the world as can be seen here: + * + * http://www.wherearewe.co.nz/svg.html + * + * The data is used here by permission from Gary given on 2006-11-08: + * + * Thanks for asking, I don't need any attribution if you are + * only using the vectors and not the entire map with + * interactivity etc. So feel free to do what you wish with + * the data. + */ + +#define N(x,y) { WM_NEW_PATH, x, y } +#define M(x,y) { WM_MOVE_TO, x, y } +#define L(x,y) { WM_LINE_TO, x, y } +#define H(x,y) { WM_HLINE_TO, x, y } +#define V(x,y) { WM_VLINE_TO, x, y } +#define l(x,y) { WM_REL_LINE_TO, x, y } +#define E(x,y) { WM_END, x, y } + +static const wm_element_t countries[] = { +N(413.519,90.071),l(.136,-.348),l(-.31,-.204),l(-.017,-.327),l(.213,-.322),l(.245,-.147),l(.142,-.08),l(.225,.072),l(.062,.301),l(.41,.312),l(.466,.096),l(-.044,.288),l(-.248,.144),l(.074,.353),l(-.145,-.063),l(-.568,-.011),l(-.642,-.063), +N(421.683,94.397),l(.193,.336),l(-.266,.274),l(.214,.288),l(-.09,.192),l(.622,.062),l(.008,.144),l(.55,.242),l(.579,-.332),l(.215,.117),l(-.029,.171),l(-.126,.309),l(.112,.212),l(-.038,.192),l(-.315,-.051),l(-.176,-.162),l(-.283,.091),l(-.081,.273),l(.244,.131),l(-.228,.415),l(-.244,-.333),l(-.469,.05),l(-.071,.122),l(-.216,.03),l(-.23,-.142),l(-.143,-.354),l(-.371,.081),l(.019,.333),l(-.425,.384),l(-.018,.535),l(-.285,.151),l(-.385,-.312),l(.098,-.182),l(-.311,-.071),l(-.534,-.363),l(-.016,-.415),l(-.777,.404),l(.103,.212),l(-.349,.432),l(-.275,.16),l(-.629,-.168),l(-.627,.204),l(-.599,-.062),l(-.102,-.424),l(-.312,-.806),l(-.616,.147),l(-.854,.668),l(-.369,-.111),l(.238,-.226),l(.013,-.322),l(-.08,-.137),l(.089,-.294),l(.718,-.418),l(-.038,-.315),l(.575,-.24),l(.012,-.076),l(.528,-.494),l(.173,-.035),l(-.116,-.089),l(-.153,-.028),l(.221,-.302),l(.446,.007),l(-.005,.096),l(.473,.007),l(.385,-.309),l(.271,.089),l(.272,-.117),l(.271,.096),l(.567,-.158),l(.278,.11),l(.354,-.021),l(-.179,-.199),l(.709,-.199),l(.017,.151),l(.199,-.014),l(.149,.089),l(.852,.007),l(.664,.261), +N(421.394,104.558),l(.104,.175),l(.04,.256),l(-.06,.475),l(.118,.054),l(.062,.333),l(-.076,.795),l(-.211,.327),l(-.118,.724),l(-.292,.501),l(-.298,-.043),l(-.057,-.196),l(-.41,-.076),l(-.227,-.152),l(.284,-.207),l(-.07,-.076),l(-.437,-.098),l(.257,-.332),l(-.11,-.071),l(-.291,.071),l(-.053,-.147),l(.115,-.022),l(.175,-.158),l(-.094,-.153),l(-.257,-.082),l(.015,-.164),l(.247,-.12),l(-.284,-.218),l(.241,-.284),l(.6,-.305),l(.27,-.022),l(.04,-.125),l(.292,-.043),l(.195,.104),l(.096,-.142),l(-.022,-.344),l(.072,-.224),l(.143,-.011),M(396.323,103.853),l(.375,-.122),l(.411,-.365),l(.549,-2.299),l(.397,-.091),l(-.21,-.29),l(-.226,.259),l(.125,-1.144),l(.223,-.826),l(.115,.153),l(.496,.306),l(.191,.382),l(.191,.229),l(-.281,-.673),l(-.63,-.582),l(-.242,-.233),l(.024,-.249),l(.359,-.477),l(-.202,-.375),l(-.2,-.274),l(-.326,-.216),l(-.685,-.1),l(-.515,-.571),l(-.416,-.323),l(.278,-.426),l(-.233,-.181),l(-.343,-.131),l(-.511,-.142),l(-.184,-.173),l(.247,-.376),l(-.329,-.173),l(-.509,.179),l(-.489,-.249),l(-.824,-.251),l(-.619,-.181),l(-.325,.014),l(-.215,-.25),l(-.91,.167),l(-.059,-.25),l(-.265,-.125),l(-.367,-.042),l(-.056,-.104),l(.861,-.083),l(-.085,-.229),l(-.526,-.104),l(.442,-.104),l(.086,-.205),l(-.275,.017),l(-.263,-.021),l(-.417,.083),l(.04,-.438),l(.303,.012),l(.305,-.146),l(.526,-.088),l(.562,-.174),l(.215,.188),l(.18,-.167),l(.474,.063),l(.112,-.26),l(.272,-.059),l(.764,-.078),l(.393,.366),l(.275,.26),l(.342,.083),l(.652,-.271),l(.317,.167),l(.276,-.127),l(.457,-.124),l(.029,.23),l(.591,-.065),l(.3,-.103),l(-.265,-.188),l(-.028,-.251),l(.056,-.345),l(-.037,-.428),l(-.131,.021),l(-.562,-.682),l(-.11,-.407),l(.927,.126),l(.607,-.105),l(-.084,.397),l(.248,.419),l(.342,-.146),l(1.241,.104),l(.501,.146),l(.079,-.014),l(.525,-.093),l(.662,-.27),l(-.534,-.124),l(.055,-.204),l(.166,-.175),l(.753,-.322),l(.756,-.181),l(.902,-.215),l(.314,-.235),l(.302,-.264),l(-.053,-.775),l(.135,-.542),l(.521,-.25),l(.46,-.16),l(.916,-.092),l(.177,-.096),l(.208,.447),l(.311,.335),l(.266,.127),l(.141,-.071),l(.41,-.208),l(.153,.17),l(.202,.458),l(.194,.133),l(.518,-.012),l(.159,.301),l(.259,-.012),l(.576,.048),l(.375,.168),l(-.159,.241),l(.091,.175),l(-.072,.198),l(.285,.122),l(.406,-.075),l(.446,-.035),l(.193,-.313),l(.245,-.072),l(-.119,.373),l(.146,.18),l(-.039,.228),l(.529,.048),l(.341,.192),l(.371,.204),l(.127,.228),l(.694,-.174),l(.079,.114),l(.642,.063),l(.568,.011),l(.145,.063),l(.428,.319),l(.337,.277),l(.395,-.055),l(.045,.145),l(.689,-.062),l(.072,-.048),l(.233,.007),l(.095,.186),l(.456,.09),l(.479,-.014),l(.605,.193),l(-.954,.806),l(-.054,.213),l(-.054,.358),l(-.321,.372),l(-.075,.295),l(.091,.076),l(-.216,.701),l(.135,.233),l(-.385,.309),l(-.473,-.007),l(.005,-.096),L(415.96,94.5),l(-.221,.302),l(.153,.028),l(.116,.089),l(-.173,.035),l(-.528,.494),l(-.012,.076),l(-.575,.24),l(.038,.315),l(-.718,.418),l(-.089,.294),l(.08,.137),l(-.013,.322),l(-.238,.226),l(.369,.111),l(.854,-.668),l(.616,-.147),l(.312,.806),l(.102,.424),l(-.624,.301),l(.532,.344),l(.025,.292),l(.43,.192),l(-.199,.272),l(-.541,.353),l(-.183,-.111),l(-.437,.186),l(.352,.358),l(.616,.191),l(.135,.331),l(-.175,.01),l(-.315,.371),l(.193,.442),l(.754,.391),l(.849,-.07),l(.062,.281),l(-.146,.469),l(-.346,.23),l(-.221,.215),l(-.833,.488),l(-.889,.659),l(-.427,.087),l(-.318,.043),l(-.798,.159),l(-.405,-.028),l(-.471,-.156),l(-.851,-.499),l(-.315,-.085),l(-.354,.029),l(-.231,.072),l(-.511,-.056),l(-.752,-.313),l(-.602,.044),l(-.731,.345),l(-.357,.258),l(-.555,.559),l(-.147,.386),l(.099,.514),l(.091,.379),l(-.334,-.091),l(-.75,.137),l(-.039,.136),l(-.485,-.015),l(-.427,-.197),l(-.395,.167),l(-.261,-.015),l(-.036,-.152),l(-.335,-.091),l(-.206,.03),l(-.374,.076),l(-.187,-.076),l(-.035,-.289),l(-.091,-.213),l(-1.252,-.304),l(-.355,0),l(.017,.319),l(-.542,-.015),l(-.337,.061),l(-.037,-.122),l(-.767,.03),l(-.084,-.114),l(-.028,-.038),l(-.431,-.152),l(-.131,.076),l(-.262,-.03),l(-.056,.076),l(-.507,-.395),l(-.15,.061),l(-1.088,-.334),l(-.112,.106),l(-.15,-.03),l(-.094,-.106),l(.205,-.243),l(-.058,-.122),l(-.469,.03),l(-.472,-.243), +N(681.312,116.395),l(.235,-.171),l(.283,-.256),l(.633,-.738),l(.315,-.157),l(.595,.011),l(.579,.068),l(.511,.096),l(.309,-.115),l(.571,-.678),l(.682,.621),l(1.178,1.611),l(.329,.495),l(.269,.664),l(.002,.75),l(-.034,.947),l(-.129,.637),l(.143,.113),l(.5,-.043),l(-.121,.41),l(-.282,.523),l(-.5,.75),l(-.316,.312),l(-.243,.043),l(-.567,-.211),l(-.256,.1),l(-.607,.58),l(-.431,-.083),l(-.289,-.225),l(-.544,.1),l(-.526,.199),l(-1.188,.835),l(-.462,.043),l(-.46,.312),l(-.055,-.564),l(-.056,-.324),l(-.163,-.705),l(-.137,-.395),l(.167,-.453),l(.499,-.468),l(0,-.353),l(.226,-.425),l(-.044,-.141),l(-.378,-.311),l(-.095,-.296),l(.015,-.467),l(-.087,-.339),l(-.289,-.126),l(-.603,-.084),l(.654,-.411),l(.303,-.114),l(.654,.268),l(.254,-.241),l(-.029,-.283),l(-.764,-.89),l(-.113,-.311),l(-.137,-.105), +N(475.646,121.847),l(-.018,.175),l(.338,.391),l(-.295,-.009),l(-.132,.108),l(-.104,-.059),l(-.327,-.021),l(-.121,.33),l(-.783,.257),l(-.384,.046),l(-.099,.053),l(0,.21),l(-.217,.006),l(-.072,-.192),l(-.402,.023),l(-.547,-.146),l(-.191,-.087),l(0,-.21),l(-.161,-.105),l(-.122,-.403),l(.082,-.035),l(.12,.1),l(.147,-.006),l(.405,-.304),l(.253,-.006),l(.328,.092),l(.077,-.086),l(.088,-.286),l(-.053,-.175),l(.627,.093),l(.658,.027),l(.367,-.056),l(.818,-.233),l(.689,-.304),l(.535,-.158),l(-.475,.295),l(-.436,.231),l(-.596,.444), +N(704.404,117.274),l(.197,-.099),l(1.108,-.271),l(.057,.354),l(-.481,.284),l(-.232,.241),l(-.068,.453),l(.139,.367),l(.291,.056),l(.221,-.114),l(.418,-.354),l(.24,-.085),l(1.656,-.697),l(.389,-.213),l(.46,-.326),l(.349,-.638),l(.76,-.412),l(.347,-.327),l(.191,-.269),l(.142,-.51),l(.538,-.582),l(-.01,-.142),l(.344,-.567),l(.159,-.468),l(.139,-.609),l(-.043,-.467),l(-.33,-.198),l(-.128,-.24),l(.234,-.213),l(.166,-.284),l(-.155,-1.023),l(.544,-.343),l(.176,-.242),l(.327,-.328),l(.192,0),l(.21,.355),l(.199,.227),l(.303,-.058),l(.799,-.257),l(-.169,-.526),l(-.311,-.028),l(-.36,-.312),l(.694,-.415),l(.441,.156),l(.336,.227),l(.025,.199),l(-.016,.868),l(.058,.611),l(.22,.127),l(.243,.312),l(.717,1.432),l(.001,.496),l(-.246,.709),l(-.709,.766),l(-.226,.439),l(.064,.368),l(-.15,.071),l(-.737,.285),l(-.161,.113),l(-.164,.199),l(-.174,.453),l(.02,.396),l(.094,.254),l(.131,.792),l(-.04,.693),l(-.686,.751),l(-.242,.736),l(.02,.707),l(.198,.296),l(.422,.353),l(-.617,.298),l(-.193,.127),l(-.166,.17),l(-.174,.834),l(-1.081,.439),l(-.094,-.282),l(.294,-.665),l(.184,-.523),l(-.198,-.126),l(-.514,.241),l(-.578,.623),l(-.476,.001),l(-.346,.312),l(-.066,.748),l(-.354,.269),l(-.188,-.028),l(-.066,-.155),l(.003,-.606),l(-.149,-.155),l(-.211,.042),l(-.309,.156),l(-.344,.311),l(-.325,.523),l(-.866,-.055),l(-.505,.057),l(-.631,.1),l(-.458,-.549),l(-.685,-.323),l(-.26,.254),l(-.067,.184),l(-.177,.353),l(.037,.056),l(.417,.197),l(.416,.323),l(-.293,.198),l(-.829,.129),l(-.433,.241),l(-.463,.622),l(-.522,.847),l(-.688,-.365),l(-.565,-.21),l(-.285,-.197),l(-.014,-.169),l(-.194,-.818),l(.099,-.155),l(.495,-.325),l(.179,-.269),l(-.067,-.282),l(-.18,-.042),l(-.601,.17),l(-.341,-.028),l(-.789,-.167),l(-.475,.128),l(-.427,.227),l(-.437,.184),l(-.269,-.098),l(-.256,-.027),l(-1.647,.398),l(-.814,.298),l(-.21,-.31),l(-.452,-.042),l(-.413,.438),l(-.006,.635),l(-.756,-.238),l(-.579,-.055),l(-1.1,.073),l(-.267,-.14),l(.072,-.339),l(.179,-.283),l(.483,.013),l(.499,-.114),l(.751,-.467),l(2.201,-1.953),l(.28,-.015),l(.427,-.128),l(.056,.424),l(.495,-.128),l(1.278,-.257),l(.933,-.058),l(1.183,-.172),l(.892,-.256),l(.068,.452),l(.377,.268),l(.167,-.085),l(.654,-.199),l(.446,-.34),l(-.003,-.353),l(.114,-.467),l(.465,-.51),l(.698,-.581),l(.371,-.453),l(-.062,-1.117),l(.182,-.213),M(695.464,127.756),l(-.292,-.197),l(-.223,-.268),l(-.101,-.381),l(-.177,-.395),l(-.492,-.535),l(.731,-.382),l(.287,-.269),l(.456,-.593),l(.409,.253),l(.615,-.015),l(.483,-.185),l(.311,-.339),l(.451,-.311),l(.454,-.029),l(.316,.169),l(.862,.224),l(.153,.254),l(-.1,.127),l(-.102,.423),l(-.292,.24),l(-.864,.876),l(-.181,-.211),l(-.424,-.295),l(-.467,-.042),l(-.612,.213),l(-.193,.184),l(-.245,.495),l(-.165,.508),l(-.153,.212),l(-.448,.269),M(691.12,131.448),l(-.366,-.042),l(-.056,-.141),l(.268,-.537),l(.128,-.593),l(-.334,-.112),l(-.239,.198),l(-.155,.466),l(-.381,.452),l(-.326,-.211),l(-.059,-.211),l(.322,-.466),l(.032,-.296),l(-.356,-.917),l(.169,-.113),l(.687,-.58),l(.083,-.141),l(.034,-.466),l(-.532,-.789),l(-.333,-.042),l(-.162,.269),l(-.419,.495),l(-.249,-.112),l(-.23,-.508),l(-.376,-.267),l(-.261,-.366),l(.41,-.325),l(.733,.083),l(.706,-.171),l(.315,-.466),l(.241,-.283),l(.484,-.058),l(.478,.056),l(.249,.38),l(.27,.168),l(.43,.084),l(.628,-.213),l(.225,.395),l(-.569,.438),l(.405,.239),l(.443,.437),l(.079,.254),l(-.596,.58),l(-.242,.41),l(-.104,.367),l(-.085,.621),l(-.109,.649),l(-.242,.353),l(-.194,.099),l(-.165,.071),l(-.197,.184),l(-.479,.678),M(711.938,108.369),l(-.222,-.241),l(-.077,-.271),l(.325,-.642),l(-.055,-.342),l(-.549,-.198),l(-.168,-.171),l(-.146,-.812),l(.583,-.386),l(.522,-.172),l(.646,-.373),l(.037,-.356),l(-.318,-.285),l(.277,-.3),l(.224,-.015),l(.661,.427),l(.373,.085),l(.532,-.201),l(-.004,-1.186),l(.455,-.187),l(.45,-.244),l(.074,-.743),l(.007,-.844),l(-.398,-.758),l(-.098,-.473),l(.166,-.216),l(.618,-.346),l(.063,.072),l(.507,.43),l(.904,.816),l(1.07,.842),l(1.083,.684),l(.627,.285),l(.528,.17),l(1.02,.198),l(.282,.042),l(.304,-.086),l(.866,-.66),l(.461,-.144),l(.002,.1),l(-.308,.358),l(-.335,.558),l(.198,.414),l(.469,.599),l(.197,.356),l(-.561,.272),l(-.447,.244),l(-.534,.158),l(-.365,.015),l(-.488,-.199),l(-.453,.015),l(-.363,.144),l(-.345,.229),l(-.754,.786),l(-.396,.5),l(-.26,.599),l(-.4,-.07),l(-.425,-.241),l(-2.031,-.965),l(-.461,-.085),l(-.72,.044),l(-1.038,.587),l(-.153,-.299),l(-.372,-.356),l(-.339,.029),l(-.266,.115),l(-.439,.272),l(.049,.299),l(1.16,.497),l(.56,.298),l(.302,.27),l(-.391,.214),l(-.303,.029),l(-.305,-.128),l(-.261,.043),l(-.324,.314),l(-.388,.471),l(-.347,.114), +N(597.917,139.685),l(1.251,-1.545),l(.609,-.539),l(.348,-.239),l(.149,-.103),l(.417,-.016),l(.309,.294),l(.479,.208),l(1.659,.047),l(.371,.041),l(.312,.209),l(.329,.619),l(-.07,.156),l(.042,.24),l(.326,.294),l(.313,.069),l(.258,.238),l(.017,.282),l(-.217,.58),l(-.624,.06),l(-1.036,.062),l(-1.238,-.063),l(-.335,-.125),l(-.301,-.055),l(-.531,.313),l(-.544,.074),l(-.085,-.021),l(-.869,-.214),l(-.559,-.081),l(-.637,-.18),l(-.235,-.493),l(.092,-.113), +N(362.764,152.723),l(.072,-.625),l(.395,-.876),l(.52,-.552),l(.488,-.566),l(.244,-.509),l(1.175,-2.559),l(.238,-.241),l(1.404,-1.175),l(.345,-.495),l(.051,-.918),l(.305,-1.088),l(.651,-1.075),l(.399,-.34),l(.404,-.198),l(.838,-.51),l(.361,-.495),l(.334,-.777),l(.428,-.851),l(1.635,-.04),l(2.511,0),l(2.677,-.001),l(1.718,.004),l(1.42,-.008),l(.027,.876),l(-.03,1.752),l(.002,.65),l(-.104,.396),l(-.56,-.011),l(-6.005,-.022),l(-.557,.074),l(-.047,.509),l(-.07,2.261),l(-.099,2.6),l(-.144,.128),l(-.809,.287),l(-.726,.315),l(-.575,.427),l(-.249,.383),l(-.01,.707),l(.164,1.539),l(.051,1.102),l(-.212,-.027),l(-.732,.033),l(-2.396,-.014),l(-5.055,-.056),l(-.474,-.013), +N(514.551,145.841),l(-.374,.027),l(-.336,-.083),l(-.008,-.615),l(-.153,-.437),l(-.108,-.791),l(.187,-.607),l(.188,-.11),l(-.059,-.187),l(.177,-.607),l(.33,-.269),l(.312,.083),l(.069,.315),l(.26,.093),l(.063,.199),l(.116,.326),l(-.106,.42),l(.031,.708),l(.118,.254),l(-.104,.381),l(-.327,.467),l(-.275,.433), +N(514.177,145.868),l(.374,-.027),l(.008,.288),l(.361,.14),l(.153,.128),l(.186,-.093),l(-.046,.443),l(.397,.001),l(.402,.127),l(.687,-.093),l(.103,-.21),l(.183,-.058),l(.218,.117),l(.424,-.042),l(.595,.112),l(.224,-.035),l(.079,-.105),l(1.358,.222),l(.732,-.14),l(-.022,-.292),l(.225,.175),l(.375,-.016),l(.157,-.099),l(.312,-.422),l(.232,-.073),l(.267,-.495),l(.131,-.297),l(.711,-.637),l(.813,-.889),l(.163,.105),l(.229,-.178),l(.85,-.708),l(.313,-.433),l(.15,.161),l(-.248,.42),l(-.107,.299),l(-.004,.176),l(.099,.064),l(.121,-.024),l(.454,.042),l(.09,.324),l(.001,.508),l(-.003,.358),l(-.49,.034),l(-.401,-.083),l(-.107,.396),l(.073,1.326),l(-.199,.34),l(-.536,.596),l(.003,.946),l(.024,2.075),l(.063,.183),l(-.152,.057),l(-.584,.469),l(-.839,-.108),l(-3.387,-.446),l(-3.362,-.375),l(-.261,-.902),l(-.548,-1.154),l(-1.043,-2.198), +N(668.627,151.365),l(-.102,-.056),l(-.107,-.325),l(-.922,-1.212),l(-.332,-.987),l(-.03,-.438),l(.156,-.749),l(.546,-.792),l(1.312,-1.852),l(.259,-.184),l(.425,-.128),l(.229,-.184),l(.358,-.227),l(.228,.127),l(.554,.394),l(-.334,.424),l(-.084,.142),l(.023,.31),l(-.067,.622),l(-.203,.296),l(-.182,.354),l(-.065,.692),l(-.1,.494),l(-.317,.805),l(-.473,.707),l(-.417,.833),l(-.014,.353),l(-.114,.438),l(-.228,.142), +N(389.765,144.543),l(.1,.084),l(.895,.531),l(2.054,1.344),l(.811,.575),l(3.283,2.241),l(1.924,1.26),l(1.292,.824),l(.397,.253),l(2.472,1.469),l(.181,.253),l(-.096,.396),l(.082,.183),l(.393,.28),l(1.111,1.039),l(.229,.027),l(.47,-.314),l(.588,.562),l(.375,.167),l(.748,.024),l(.309,.111),l(.277,.352),l(.099,.522),l(-.161,.679),l(.146,.564),l(2.176,-.408),l(.064,1.017),l(.034,2.203),l(.001,.96),l(-.08,.89),l(-.145,.919),l(-.434,1.246),l(-.596,.794),l(-.339,.271),l(-.29,.129),l(-2.533,.085),l(-1.808,.124),l(-.209,.072),l(-.562,.427),l(-.579,.272),l(-.678,-.053),l(-.581,-.081),l(-1.062,-.173),l(-.36,-.059),l(-.356,-.125),l(-.37,.073),l(-1.22,.713),l(-.947,.458),l(-.304,.228),l(-.314,.793),l(-.274,-.027),l(-.324,-.182),l(-.518,-.209),l(-.272,.101),l(-.638,.625),l(-.492,.667),l(-.393,.822),l(-.174,.227),l(-.45,.102),l(-.551,-.364),l(-.293,-.281),l(-.273,.058),l(-.397,.384),l(-.355,1.217),l(-.292,1.047),l(-.317,.369),l(-.543,.271),l(-.448,.158),l(-.257,.016),l(-.141,.255),l(.058,.749),l(-.133,.876),l(-.261,.92),l(-.172,.326),l(-.046,.156),l(-.08,.043),l(-.159,.1),l(-.604,.399),l(-.352,.059),l(-.148,-.239),l(-.117,-.381),l(-.004,-.297),l(-.147,-.211),l(-.257,-.041),l(-.239,.114),l(-.571,.483),l(-.362,.469),l(-.35,.228),l(-.455,-.436),l(-.566,-.321),l(-.352,.059),l(-.522,.54),l(-.559,-.901),l(-.194,-1.143),l(-.349,-.718),l(-.474,-.478),l(-.265,-.451),l(-.271,-.832),l(-.022,-.339),l(-.246,-.281),l(-.323,-.055),l(-.684,.428),l(-.3,.327),l(-.43,.243),l(-.565,-.152),l(-.356,-.153),l(-.338,-.026),l(-.475,.413),l(-.252,.256),l(-.536,-.265),l(-.882,-.715),l(-.18,-.183),l(-.113,-.028),l(.062,-.142),l(.004,-.565),l(-.082,-.833),l(-.265,-.337),l(-.554,-.322),l(-.181,-.197),l(-.22,-.479),l(-.144,-.663),l(-.251,-1.1),l(.057,-.339),l(.506,-.399),l(.332,-.284),l(.018,-.607),l(.181,-.552),l(.252,-.256),l(.402,-.073),l(.261,.111),l(.568,.83),l(.214,.168),l(.454,.082),l(.107,-.269),l(-.055,-.296),l(.06,-.212),l(.535,.124),l(.713,.137),l(.485,.054),l(.387,-.031),l(.945,-.344),l(1.953,-.026),l(6.457,-.01),l(.379,-1.613),l(-.724,-.787),l(-.186,-1.468),l(-.202,-2.386),l(-.325,-2.753),l(-.178,-1.736),l(-.19,-1.468),l(-.908,-7.962),l(-.049,-.776),l(3.231,-.089),l(.523,-.13), +N(525.37,142.384),l(.312,-.429),l(.155,-.17),l(.084,.833),l(-.423,.707),l(-.118,.156),l(-.121,.024),l(-.099,-.064),l(.004,-.176),l(.107,-.299),l(.248,-.42),l(-.15,-.161),M(525.923,144.712),l(0,.22),l(.456,.762),l(.408,.465),l(.782,.634),l(.677,.394),l(1.008,.52),l(.392,.154),l(.277,.014),l(.576,-.029),l(.364,.112),l(.873,.973),l(.518,.648),l(.46,.422),l(.81,.365),l(.025,.212),l(-.67,1.06),l(-.615,.721),l(-.883,.807),l(-.776,1.541),l(-.242,.142),l(-.562,-.083),l(-.235,-.084),l(-.252,.071),l(-.278,.509),l(-.062,1.115),l(.001,.791),l(.134,.621),l(-.403,.142),l(-1.046,.073),l(-.627,.27),l(-.367,.283),l(-.29,.495),l(-.131,.551),l(-.204,.283),l(-.444,.255),l(-.544,.1),l(-.292,0),l(-.386,-.042),l(-.326,.029),l(-.382,.283),l(-.22,.297),l(-.125,.508),l(.003,.353),l(-.091,.311),l(-.631,.396),l(-.344,.043),l(-.776,-.21),l(-.717,.058),l(-.896,.27),l(-.768,.298),l(-.283,.099),l(-.416,.145),l(-.241,-.306),l(-.483,-.689),l(.006,-.296),l(-.127,-.253),l(-.933,-1.364),l(-.604,-.971),l(-.226,-.634),l(-.092,-.663),l(1.691,-.815),l(2.35,-1.213),l(5.346,-2.982),l(-.155,-1.453),l(-.581,-.914),l(-.063,-.183),l(-.024,-2.075),l(-.003,-.946),l(.536,-.596),l(.199,-.34),l(-.073,-1.326),l(.107,-.396),l(.401,.083),l(.49,-.034), +N(405.733,173.04),l(-.568,-.971),l(-.562,-.025),l(-.37,.044),l(-.516,-.181),l(-.97,-.757),l(-.114,-.226),l(.335,-.439),l(-.018,-.212),l(-.179,-.268),l(-.502,-.42),l(-.389,-.266),l(-.422,-.492),l(-.426,-.93),l(-.019,-.396),l(.173,-.665),l(.581,.081),l(.678,.053),l(.579,-.272),l(.562,-.427),l(.209,-.072),l(1.808,-.124),l(2.533,-.085),l(.29,-.129),l(.339,-.271),l(.596,-.794),l(.434,-1.246),l(.145,-.919),l(.08,-.89),l(-.001,-.96),l(-.034,-2.203),l(-.064,-1.017),l(1.672,-.321),l(1.82,-.364),l(3.084,-2.617),l(.834,-.655),l(2.308,-1.454),l(1.607,-.956),l(4.012,-2.241),l(1.632,-.843),l(.265,-.186),l(.832,.137),l(1.646,.442),l(1.008,.333),l(.258,.182),l(1.192,.911),l(.231,-.157),l(1.519,-.729),l(.364,2.145),l(.169,1.298),l(.42,1.028),l(.554,.802),l(.703,.604),l(-.388,.722),l(-.265,.99),l(-.168,1.088),l(-.084,.989),l(.022,.537),l(-.062,.707),l(-.019,1.045),l(-.034,1.088),l(-.056,.466),l(-2.43,2.613),l(-.591,.78),l(-.87,1.333),l(-.572,.794),l(-.007,.678),l(.123,.719),l(.014,.269),l(-.951,.034),l(-.437,.2),l(-.453,.299),l(-.761,.697),l(-.259,.058),l(-.609,-.208),l(-.724,-.193),l(-.884,-.221),l(-.531,-.04),l(-.709,.047),l(-.628,.103),l(-.774,.287),l(-.403,.327),l(-.629,.399),l(-.273,.059),l(-.934,.005),l(-.965,-.277),l(-1.173,-.742),l(-.354,-.083),l(-.467,.116),l(-1.337,.544),l(-.37,.002),l(-.209,-.098),l(-1.095,-1.223),l(-.821,-.277),l(-1.111,-.121),l(-1.174,.108),l(-1.064,.188),l(-.676,.4),l(-.687,1.614),l(-.353,.482),l(-.158,.849),l(-.092,.961),l(-.902,-.503),l(-.727,-.589),l(-.339,-.28),l(-.321,.073),l(-.577,.3), +N(431.763,171.063),l(-.351,-.407),l(-.575,-.52),l(-.173,-.394),l(-.014,-.269),l(-.123,-.719),l(.007,-.678),l(.572,-.794),l(.87,-1.333),l(.591,-.78),l(2.43,-2.613),l(.056,-.466),l(.034,-1.088),l(.019,-1.045),l(.062,-.707),l(-.022,-.537),l(.084,-.989),l(.168,-1.088),l(.265,-.99),l(.388,-.722),l(-.703,-.604),l(-.554,-.802),l(-.42,-1.028),l(-.169,-1.298),l(-.364,-2.145),l(1.818,-.858),l(.41,-.059),l(5.231,2.554),l(4.941,2.372),l(5.577,2.792),l(1.981,.963),l(-.02,1.045),l(-.016,.946),l(-.036,.636),l(.085,2.5),l(-.038,.749),l(.036,1.002),l(.031,1.229),l(-.04,.283),l(-.839,-.009),l(-1.245,.05),l(-.229,.143),l(-.417,1.245),l(-.583,.809),l(-.122,.438),l(.131,.677),l(-.149,.212),l(-.718,.428),l(-.053,.24),l(.342,.662),l(-.087,.34),l(-.542,.596),l(-.316,.609),l(.219,.352),l(.517,-.088),l(.338,.012),l(.141,.225),l(.221,1.228),l(.137,.522),l(.155,.295),l(.444,.407),l(.266,.465),l(.026,.367),l(-.15,.425),l(-.559,-.208),l(-.321,-.012),l(-.322,.086),l(-.939,.613),l(-.372,.228),l(-.165,.382),l(-.005,.41),l(-.196,.284),l(-2.649,2.275),l(-.386,.087),l(-2.181,.055),l(-.434,.059),l(-.209,.199),l(-.117,.806),l(-.646,1.176),l(-.258,.143),l(-.368,.031),l(-.881,-.009),l(-.818,.273),l(-.754,.386),l(-.466,.271),l(-.224,.03),l(-.225,-.069),l(-.494,-.661),l(-1.363,.686),l(-.449,.158),l(-.24,-.027),l(-.096,-.084),l(-.208,-.183),l(-.382,-1.057),l(-.638,-1.07),l(-1.343,-1.179),l(-1.088,-1.067),l(.323,-.539),l(.29,-.312),l(.24,-.1),l(.481,.082),l(1.187,.191),l(.674,-.032),l(.225,-.143),l(-.047,-.127),l(-.208,-.21),l(-.381,-.633),l(-.205,-.578),l(-.169,-1.228),l(.134,-.651),l(-.119,-1.2),l(-.395,-.887),l(-.923,-1.238),l(-.208,-.083),l(-.627,-.109), +N(627.173,150.012),l(.483,-.229),l(.515,-.13),l(.341,.012),l(.597,.392),l(.325,.097),l(.584,-.413),l(.332,-.115),l(1.595,-.052),l(.807,-.117),l(.341,-.157),l(.696,-.554),l(.521,-.328),l(.298,-.101),l(.623,.575),l(.771,.235),l(.66,.053),l(.777,-.047),l(.237,.21),l(.056,.38),l(-.472,.75),l(.096,.521),l(.273,.365),l(.943,.615),l(.621,.166),l(.909,.107),l(.197,.143),l(-.19,.132),l(-.826,.482),l(.106,.465),l(-.203,.212),l(-1.261,-.054),l(-.136,.198),l(.057,.395),l(-.283,.382),l(-.585,.792),l(-.221,.142),l(-.533,.241),l(-.171,.127),l(-.27,.396),l(-.303,.932),l(-.388,.975),l(.268,.225),l(.469,.563),l(1.112,1.071),l(.023,.24),l(.042,.522),l(.087,.254),l(.42,.493),l(1.096,.83),l(1.282,1.296),l(.26,.197),l(.636,.069),l(.313,.38),l(.282,1.016),l(.302,.578),l(.638,.605),l(.293,.663),l(.341,1.382),l(.524,2.809),l(-.295,.438),l(-.235,.495),l(.05,.819),l(-.095,.41),l(.056,.664),l(-.027,.099),l(-.364,.551),l(-.447,.439),l(-.254,.127),l(-.509,.1),l(-.419,.17),l(-.501,.354),l(-.591,.622),l(-.579,.354),l(-.325,.043),l(-.512,-.197),l(-.404,-.31),l(-.179,-.141),l(-.153,.424),l(.051,.494),l(.048,.353),l(-.205,.721),l(-.388,.424),l(-.326,.071),l(-.235,-.07),l(-.246,.481),l(-.427,.326),l(-.523,.142),l(-.417,.213),l(-.459,.565),l(-.196,.269),l(-.406,.297),l(-.264,.099),l(-.365,-.042),l(.078,-.861),l(.1,-1.313),l(.151,-.494),l(.215,-.283),l(-.02,-.353),l(-.475,-.437),l(-.749,-.238),l(-.091,-.066),l(.3,-.289),l(.646,-.229),l(.915,-.528),l(.599,-.229),l(.497,.011),l(.688,.194),l(.17,-.27),l(-.03,-.197),l(-.568,-.435),l(-.216,-.422),l(.234,-.425),l(.99,-.571),l(.521,-.229),l(.932,-.443),l(.599,-.187),l(.385,-.285),l(.217,-.509),l(-.054,-1.073),l(.05,-.424),l(.076,-.367),l(-.455,-1.014),l(-.029,-.663),l(.215,-.905),l(.155,-.918),l(-.064,-.578),l(-.214,-.437),l(-.529,-.477),l(-.072,-.282),l(.226,-.439),l(-.136,-.395),l(-.358,-.308),l(-.685,-.391),l(-.471,-.52),l(-.57,-.914),l(-1.683,-2.121),l(-.698,-.772),l(-.637,-.646),l(-.632,-.476),l(-1.234,-.741),l(-.162,-.098),l(-.043,-.494),l(.277,-.369),l(.311,-.101),l(.476,.068),l(.287,-.058),l(.261,-.185),l(.255,-.326),l(-.009,-.508),l(-.87,-.968),l(-.434,-.675),l(-.262,-.083),l(-.39,.171),l(-.509,.483),l(-.287,.058),l(-.47,-.195),l(-.607,-.434),l(-.334,-.689),l(-.338,-.929),l(-.543,-.604),l(-.613,-.575),l(-.45,-.745), +N(217.961,150.385),l(.304,-.043),l(.84,-.27),l(-.17,-.254),l(-.312,-.112),l(-.369,-.056),l(-.651,.016),l(-.497,-.042),l(-.645,.157),l(-1.193,.92),l(-.371,.029),l(-.653,.001),l(-.211,.113),l(-.189,.452),l(-.396,.284),l(-.32,.043),l(-.786,.086),l(.259,-.325),l(.473,-.312),l(-.128,-.593),l(.282,-.382),l(.114,-.099),l(1.258,-.61),l(1.625,-.47),l(1.164,-.087),l(.842,-.157),l(.825,.041),l(.566,-.044),l(.73,.168),l(.848,.083),l(.603,.197),l(.557,.112),l(.477,.013),l(.499,.268),l(.573,.536),l(.382,.253),l(.581,.168),l(.768,.111),l(1.229,.351),l(1.02,.492),l(.453,.31),l(.374,.55),l(.33,.141),l(.479,.041),l(1.704,.519),l(1.018,.167),l(.327,.239),l(-.344,.58),l(.233,.155),l(.559,.042),l(.756,-.072),l(.495,.168),l(.507,.38),l(.591,.281),l(.381,.296),l(-.233,.085),l(-.981,.087),l(-1.15,.398),l(-.626,.058),l(-1.054,-.209),l(-.9,-.041),l(-.934,.186),l(-.943,.115),l(-.484,.029),l(-.449,-.07),l(.353,-.382),l(.728,-.623),l(.173,-.396),L(229,154.204),l(-.181,-.127),l(-.622,-.14),l(-.7,.001),l(-.603,-.112),l(-.651,-.338),l(-.141,-.748),l(-.258,-.536),l(-.218,-.155),l(-.396,-.027),l(-1.005,.044),l(-.836,-.139),l(-.621,-.225),l(-.956,-.493),l(-.739,-.238),l(-.615,-.069),l(-1.154,-.068),l(-.489,-.098),l(-.855,-.352), +N(634.036,168.444),l(.808,-.64),l(.121,-.438),l(-.002,-.945),l(-.157,-.507),l(-.419,-.703),l(-.979,-1.279),l(-.255,-.464),l(-.107,-.366),l(-.058,-1.524),l(-.435,-.632),l(-.688,-.659),l(-.285,-.535),l(-.052,-.282),l(-.266,-.153),l(-.893,-.192),l(-.403,-.012),l(-.286,.453),l(-.2,.538),l(-.543,.257),l(-.223,.072),l(-.59,-.265),l(-.835,-.348),l(-.346,.03),l(-1.173,1.178),l(-.37,.411),l(-.481,-.138),l(-.145,-.324),l(.027,-.494),l(.117,-.438),l(.528,-1.569),l(.085,-.41),l(-.249,-1.311),l(-.045,-.113),l(-.414,.045),l(-.489,.2),l(-.423,.003),l(-.186,-.154),l(-.066,-.367),l(.106,-.805),l(-.01,-.423),l(-.118,-.168),l(-.295,-.182),l(-.541,-.166),l(.193,-.185),l(.582,-.455),l(.442,-.581),l(.53,-.61),l(.502,-.355),l(.178,.196),l(.321,.21),l(.769,.08),l(.266,-.213),l(.109,-.339),l(-.119,-.521),l(-.228,-.366),l(-.138,-.592),l(.043,-.325),l(.24,-.241),l(.679,-.314),l(.45,.745),l(.613,.575),l(.543,.604),l(.338,.929),l(.334,.689),l(.607,.434),l(.47,.195),l(.287,-.058),l(.509,-.483),l(.39,-.171),l(.262,.083),l(.434,.675),l(.87,.968),l(.009,.508),l(-.255,.326),l(-.261,.185),l(-.287,.058),l(-.476,-.068),l(-.311,.101),l(-.277,.369),l(.043,.494),l(.162,.098),l(1.234,.741),l(.632,.476),l(.637,.646),l(.698,.772),l(1.683,2.121),l(.57,.914),l(.471,.52),l(.685,.391),l(.358,.308),l(.136,.395),l(-.226,.439),l(.072,.282),l(.529,.477),l(.214,.437),l(.064,.578),l(-.155,.918),l(-.209,.114),l(-.975,.429),l(-.3,.072),l(-.373,-.351),l(-.444,-.181),l(-.476,.186),l(-.392,.285),l(.107,.296),l(.187,.182),l(.103,.211),l(-.095,.24),l(-.248,.058),l(-.469,-.251),l(-.341,-.111),l(-.736,-.165),l(-.533,-.251), +N(60.074,72.607),l(-.099,.228),l(-.491,.472),l(-.395,.183),l(-.462,.062),L(58,73.461),l(-.961,-.362),l(-.153,-.197),l(.169,-.289),l(.54,-.274),l(.341,-.32),l(.716,.364),l(.3,.091),l(.465,-.26),l(.215,-.213),l(.064,-.366),l(.485,-.047),l(1.107,.135),l(.536,.334),l(.133,.213),l(-.756,.062),l(-.429,0),l(-.59,.184),l(-.11,.092),M(40.092,77.571),l(-.729,-.029),l(-.097,-.24),l(.011,-.3),l(.802,-.243),l(.326,-.211),l(.593,-.423),l(.448,-.137),l(.646,-.077),l(1.427,.253),l(.711,.24),l(-.079,.211),l(-.303,.046),l(-.754,-.074),l(-.496,.031),l(-1.077,.183),l(-.269,.226),l(-1.161,.543),M(38.426,77.979),l(-.515,-.209),l(-.139,-.285),l(.381,-.227),l(.674,.27),l(.093,.195),l(-.122,.15),l(-.372,.105),M(37.896,78.449),l(-.256,.084),l(-.558,.151),l(-1.109,-.058),l(-.387,.135),l(-.398,.434),l(-.31,.15),l(-.854,-.207),l(-.135,-.224),l(.497,-.359),l(.5,-.315),l(.955,-.166),l(.863,-.346),l(.39,.089),l(.461,.224),l(.341,.409),M(29.628,81.29),l(-.168,-.594),l(-.324,-.476),l(.839,-.136),l(.424,.088),l(.436,.238),l(-.244,.268),l(-.26,.06),l(-.073,.297),l(-.22,.09),l(-.412,.164),M(27.543,81.591),l(-.39,.031),l(-.741,.165),l(-.311,-.133),l(-.088,-.178),l(.104,-.119),l(.336,-.268),l(.294,-.09),l(.584,.222),l(.212,.371),M(54.394,157.986),l(-.559,-.356),l(-.044,-.884),l(-.243,-.677),l(.482,-.402),l(-.035,-.2),l(-.156,-.26),l(.052,-.149),l(.173,-.046),l(.354,.158),l(.652,.279),l(.593,.425),l(-.015,.275),l(.238,.046),l(.12,.287),l(.306,.149),l(-.062,.161),L(56,156.933),l(-.172,.204),l(-.766,.195),l(-.374,.23),l(-.295,.425),M(23.015,59.92),l(-1.613,-.646),l(-.75,-.205),l(-.792,-.062),l(-.9,.065),l(-.291,-.095),l(-.431,-.222),l(.179,-.287),l(.516,-.049),l(1.135,.221),l(.579,-.001),l(.543,-.081),l(.538,-.001),l(.828,.285),l(1.725,.362),l(.429,.237),l(.046,.111),l(-.569,-.03),l(-.646,.033),l(-.527,.365),M(99.855,70.993),l(.467,.929),l(-.071,.167),l(-.879,-.272),l(-.621,-.075),l(.067,.441),l(-.056,.228),l(-.935,-.607),L(97.03,71.41),l(.396,-.458),l(.263,-.153),l(.612,-.078),l(.784,.38),l(.771,-.108),M(100.975,73.606),l(.128,.272),l(-.086,.273),l(-.318,.483),l(-.559,-.815),l(-.597,-.909),l(-.04,-.228),l(.095,-.213),l(.407,.029),l(.568,.197),l(.402,.91),M(106.858,78.207),l(-1.872,-1.166),l(-.566,-.555),l(.01,-.467),l(-.559,-.843),l(.071,-.106),l(.456,.06),l(.274,.256),l(1.165,.48),l(.086,.196),l(-.059,.136),l(-.149,.226),l(.296,.436),l(.839,.374),l(.007,.974),M(140.191,127.819),l(-.043,-.094),l(-.198,-.36),l(-.049,-.067),l(-.032,.042),l(-.028,.05),l(-.04,-.092),l(.002,-.664),l(-.331,-.604),l(-.472,-.451),l(-.661,-.451),l(-.512,-.197),l(-.114,-.052),l(-.145,.034),l(.002,.092),l(-.088,.025),l(-.1,-.042),l(-.146,-.143),l(.076,-.076),l(-.073,-.202),l(-.228,-.252),l(-.283,-.025),l(-.312,.084),l(-.932,-.336),l(-.286,-.328),l(-.428,-.244),l(-.383,.042),l(-.932,-.16),l(-.721,.051),l(-.12,-.185),l(-.234,-.067),l(-.046,-.177),l(.094,-.117),l(-.157,-.504),l(.133,-.464),l(-.227,-.096),l(-.127,.008),l(-.249,-.134),l(0,-.101),l(.075,-.093),l(-.029,-.219),l(-.347,-.185),l(-.254,-.286),l(-.415,-.219),l(-.391,-.623),l(-.202,-.076),l(-.203,-.311),l(-.409,-.219),l(-.156,-.529),l(-.002,-.227),l(.178,.007),l(.147,-.164),l(.029,-.326),l(-.208,-.251),l(-.192,-.045),l(-.22,.037),l(-.303,-.126),l(-.535,-.514),l(.078,-.21),l(-.091,-.312),l(-.129,-.067),l(-.044,-.463),l(.058,-.152),l(.119,-.025),l(.099,.067),l(.073,.076),l(-.086,.101),l(.153,.202),l(.285,.126),l(.116,.118),l(.203,.017),l(-.385,-.564),l(-.183,-.144),l(-.021,-.236),l(-.184,-.109),l(-.051,-.344),l(-.13,.006),l(-.011,.144),l(.048,.446),l(-.093,.017),l(-.293,-.194),l(-.119,.042),l(-.516,-.404),l(-.136,-.363),l(-.377,-.514),l(-.531,-.379),l(-.624,-.583),l(-.123,-.142),l(.114,-.101),l(-.327,-.751),l(.161,-.43),l(-.254,-.479),l(-.22,-.355),l(-.738,-.782),l(-.104,-.299),l(.099,-.627),l(.252,-.628),l(.166,-.357),l(.059,-.856),l(-.215,-.785),l(-.692,-1.486),l(-.153,-.916),l(.096,-.287),l(.231,-.244),l(.402,-.201),l(.365,-.717),l(-.365,-.573),l(-.066,-.33),l(.424,-1.593),l(.153,-.575),l(.061,-.634),l(.091,-.778),l(.019,-.179),l(-.153,-.16),l(.08,-.231),l(-.103,-.167),l(.157,-.077),l(-.03,-.186),l(-.046,-.186),l(-.031,-.103),l(-.004,-.058),l(.322,.096),l(.209,-.019),l(.062,-.097),l(-.211,.006),l(-.614,-.122),l(.062,-.707),l(-.103,-.328),l(.017,-.277),l(.587,-.225),l(-.345,-.019),l(-.16,-.142),l(-.129,0),l(-.053,.045),l(.042,.116),l(-.12,.052),l(-.133,-.979),l(-.927,-1.463),l(-.017,-.465),l(.129,-.131),l(.544,.086),l(.632,.217),l(.785,.114),l(.641,.028),l(.546,-.044),l(.415,.086),l(.547,.318),l(.039,.435),l(-.42,.407),l(-.413,.347),l(.532,.146),l(.184,.188),l(.251,.169),l(.029,-.228),l(.161,-.232),l(.393,-.305),l(.21,-.581),l(.102,-.465),l(-.064,-.421),l(-.356,-.958),l(-.158,-.305),l(-.655,-.516),l(.194,.013),l(2.579,.001),l(1.335,.022),l(4.588,-.025),l(3.938,.008),l(2.87,-.001),l(1.687,.006),l(5.117,-.028),l(.74,.011),l(4.13,.021),l(1.089,-.035),l(3.821,.023),l(.875,-.005),l(3.617,-.004),l(4.84,.018),l(.601,-.003),l(2.935,.014),l(2.131,-.012),l(2.781,.029),l(2.915,-.016),l(2.105,.003),l(1.348,-.007),l(2.798,.029),l(2.687,-.029),l(.68,.003),l(-.387,-.588),l(-.131,-.347),l(.501,-.036),l(.896,.748),l(.279,.371),l(.468,.46),l(.833,.451),l(.518,-.076),l(1.425,.208),l(.02,.185),l(.271,-.012),l(.338,.48),l(.16,-.247),l(.502,.013),l(.241,.271),l(.469,.086),l(.064,.185),l(.506,.098),l(.573,-.141),l(.219,-.06),l(.412,-.191),l(.373,-.075),l(.028,.282),l(.197,.116),l(.855,-.083),l(.474,.041),l(.156,.115),l(.196,.144),l(.542,-.049),l(.707,.074),l(1.469,-.592),l(.805,-.189),l(.797,.227),l(.977,.386),l(3.975,1.576),l(2.15,1.061),l(.101,.429),l(.46,.465),l(.628,-.024),l(.178,.135),l(.184,.294),l(.916,.181),l(.307,.235),l(-.11,.318),l(.26,.33),l(2.529,1.05),l(.876,3.16),l(.054,.545),l(-.028,.746),l(-.377,.576),l(-.294,.544),l(-.264,.433),l(-.414,.294),l(-.707,.525),l(-.044,.218),l(.012,.33),l(.371,.427),l(.497,.169),l(.573,.068),l(.524,-.117),l(.925,-.506),l(.939,-.478),l(.88,-.262),l(.919,-.062),l(.944,-.163),l(1.464,-.452),l(.875,-.427),l(-.047,-.362),l(-.16,-.471),l(-.018,-.319),l(.162,-.375),l(.47,-.203),l(.93,-.091),l(1.123,.01),l(1.305,.138),l(1.156,-.197),l(.44,-.275),l(.163,-.512),l(.146,-.434),l(.545,-.164),l(1.754,-.814),l(.534,-.305),l(.968,-.523),l(1.76,-.009),l(2.508,.029),l(1.855,.004),l(1.093,.095),l(.174,-.375),l(.363,-.435),l(.402,-.06),l(1.161,.124),l(1.139,-1.45),l(1.139,-2.22),l(.514,-.626),l(.632,-.526),l(.273,.085),l(.505,.36),l(.381,.085),l(.41,-.176),l(.771,.025),l(.488,.288),l(.174,.274),l(.31,2.819),l(-.077,.229),l(.606,.231),l(.224,0),l(.042,.154),l(-.143,.069),l(.02,.256),l(-.192,.077),l(.16,.291),l(.188,-.153),l(.349,.495),l(-.268,.281),l(.299,-.04),l(.171,.093),l(-.511,.374),l(-.509,.093),l(-.297,-.12),l(-.013,.253),l(-.138,.067),l(-.077,-.107),l(-.231,-.08),l(-.277,.133),l(-.101,.28),l(-.171,-.013),l(-.15,.16),l(-.175,-.347),l(-.746,.28),l(-.204,-.093),l(.12,.413),l(-.666,-.213),l(.199,-.48),l(-.149,-.04),l(-.364,.52),l(-.332,.56),l(-.342,.333),l(-.324,-.227),l(-.249,.439),l(-.346,-.08),l(.122,-.307),l(-.325,.253),l(.165,.16),l(-.326,.293),l(-.318,-.133),l(.105,-.226),l(-.654,.253),l(.065,.359),l(-.264,.04),l(-.161,.373),l(-.352,.106),l(-.333,.679),l(-.404,.505),l(.173,.146),l(.068,.212),l(.168,.053),l(.083,-.08),l(.169,.013),l(-.122,.146),l(-.547,.106),l(.053,.093),l(-.392,.292),l(-.068,.159),l(.337,.027),l(.282,.093),l(.599,.704),l(.055,.398),l(.399,.106),l(.691,-.239),l(-.022,-.186),l(-.14,-.027),l(-.254,-.279),l(-.097,-.04),l(-.009,-.066),l(.196,0),l(.23,.133),l(.218,.358),l(.031,.425),l(-1.599,.292),l(-.032,-.385),l(-.124,-.066),l(-.109,.226),l(-.164,.04),l(-.03,.093),l(-.105,-.106),l(-.159,.266),l(-.164,.04),l(-.294,.04),l(-.045,-.332),l(.198,-.332),l(-.443,.119),l(-.154,-.146),l(-.082,.252),l(-.087,.664),l(-1.429,.132),l(-1.694,.159),l(-1.182,.345),l(-.787,.358),l(-.097,.212),l(-.32,.053),l(-.144,.172),l(-.032,-.04),l(.308,-.756),l(.024,-.106),l(-.071,.027),l(-.41,.994),l(-.079,-.08),l(-.406,.292),l(.218,.318),l(.553,.093),l(-.46,1.515),l(-.302,.429),l(-.259,-.092),l(.043,.251),l(-.062,.185),l(-.237,.145),l(-.462,.501),l(-.292,.304),l(-.167,.026),l(-.075,-.119),l(.177,-.31),l(-.113,-.178),l(-.43,.013),l(-.447,-.343),l(-.148,-.053),l(-.329,-.541),l(.315,-.257),l(.151,-.245),l(-.271,.119),l(-.362,.37),l(.489,.845),l(.033,.356),l(.387,.581),l(.28,.066),l(.104,.765),l(-.101,.238),l(-.151,.23),l(-.125,-.013),l(-.487,.666),l(-.396,.798),l(.034,.053),l(-.13,.132),l(-.107,-.125),l(-.374,.725),l(.026,.125),l(-.226,.04),l(-.137,-.263),l(.342,-.864),l(.195,-.29),l(.247,-.119),l(.061,-.237),l(-.093,-.059),l(-.374,.119),l(.226,-.383),l(-.218,.04),l(-.176,-.093),l(.012,-.191),l(.242,-.04),l(-.077,-.33),l(-.439,.296),l(-.241,-.204),l(-.157,.053),l(-.23,-.396),l(.355,-.171),l(.357,-.053),l(-.005,-.06),l(-.604,-.316),l(-.092,.165),l(-.072,0),l(.107,-.323),l(.089,-.02),l(.21,.159),l(.131,-.06),l(-.098,-.224),l(-.353,-.066),l(-.065,-.112),l(.096,-.112),l(.336,.02),l(.193,-.284),l(-.281,.046),l(-.158,-.059),l(.241,-.37),l(.652,-.152),l(-.328,-.06),l(.146,-.409),l(-.28,.093),l(-.096,.132),l(.11,.079),l(-.315,.191),l(-.035,-.224),l(-.093,.053),l(.051,.224),l(-.081,.086),l(-.051,-.158),l(-.097,-.066),l(-.103,.416),l(-.447,-.079),l(.402,.501),l(-.294,.666),l(.07,.237),l(.272,.488),l(-.055,.139),l(-.466,-.317),l(-.1,-.211),l(.026,.205),l(.174,.218),l(.421,.237),l(.132,.508),l(-.631,-.402),l(-.354,-.007),l(-.118,-.283),l(-.155,-.053),l(.066,.25),l(-.541,-.323),l(-.33,.04),l(.015,-.29),l(.427,-.323),l(-.428,.079),l(-.19,.468),l(.204,.231),l(.457,.046),l(.202,.25),l(.954,.297),l(-.047,.092),l(.554,.165),l(.158,.132),l(-.22,.468),l(-.227,.06),l(-1.042,-.804),l(.708,.811),l(.626,.171),l(-.248,.092),l(.323,.079),l(-.045,.079),l(.061,.06),l(-.034,.25),l(-.312,-.191),l(-.071,.073),l(.104,.211),l(-.216,.02),l(-.656,-.56),l(-.023,.026),l(.419,.475),l(.309,.158),l(.182,-.026),l(.191,.21),l(.018,.31),l(-.298,.059),l(-.492,-.534),l(-.474,-.198),l(-.199,.16),l(.046,.044),l(.44,.145),l(.488,.382),l(-.047,.237),l(.442,-.033),l(.031,-.119),l(.748,.119),l(.151,.382),l(.406,1.212),l(.448,.803),l(-.14,-.092),l(-.262,-.349),l(-.059,-.132),l(-.359,-1.172),l(-.147,-.277),l(-.056,.31),l(.135,0),l(.034,.198),l(-.292,-.066),l(.173,.283),l(.144,.099),l(.228,.58),l(-.144,-.053),l(-.211,-.382),l(.002,.224),l(-.52,-.303),l(-.06,.059),l(.266,.303),l(-.247,.119),l(-.526,-.204),l(.225,.204),l(-.375,.211),l(-.173,-.02),l(-.251,-.21),l(-.024,-.217),l(.083,-.158),l(-.081,-.053),l(-.091,.204),l(.044,.23),l(.116,.211),l(-.107,.158),l(.894,.02),l(.571,-.145),l(.125,.165),l(-.113,.191),l(-.072,.369),l(.14,.066),l(.092,-.257),l(.135,-.369),l(.18,-.105),l(.266,.31),l(.047,.296),l(-.166,.25),l(-.163,-.013),l(-.063,-.099),l(-.316,.474),l(-.254,.197),l(-.483,-.053),l(-.203,-.065),l(-.147,-.066),l(-.136,-.245),l(-.151,.014),l(.141,.244),l(-.075,.013),l(-.538,-.125),l(-.436,-.151),l(.162,.185),l(.269,.026),l(.833,.335),l(-.034,.119),l(-.396,.145),l(.247,.007),l(-.19,.25),l(-.281,.138),l(-.149,0),l(-.481,-.375),l(.242,.395),l(.43,.164),l(.302,-.171),l(.292,.026),l(.11,-.204),l(.04,.178),l(.217,.04),l(.048,.079),l(-.428,.322),l(-.013,.085),l(-.261,.072),l(-1.498,.214),l(-.865,.895),l(-.487,.609),l(-.13,.127),l(-.935,.143),l(-.528,.128),l(-.617,.241),l(-.678,.539),l(-.225,.424),l(-.096,.354),l(-.819,.694),l(-.693,.383),l(-.429,.199),l(-.797,.086),l(-.35,.58),l(-.177,.198),l(-.809,1.125),l(-.273,.781),l(-.459,1.249),l(.236,1.455),l(.387,.925),l(.456,.873),l(.934,1.562),l(.352,1.746),l(.486,1.194),l(-.075,.092),l(.287,.276),l(.123,.333),l(.062,.827),l(-.301,1.536),l(-.064,.278),l(-.31,.415),l(.108,.424),l(-.02,.252),l(-.393,.551),l(-.017,-.092),l(.129,-.241),l(-.025,-.138),l(-.256,.035),l(-.38,.137),l(-.291,-.126),l(-.509,.138),l(-.12,-.329),l(.014,-.233),l(-.567,-1.068),l(-.764,-.138),l(-.204,-.352),l(-.113,-.819),l(-.423,-.229),l(-.144,-.702),l(-.373,.093),l(-.608,-1.08),l(-.375,-.482),l(.296,0),l(.375,-.438),l(.048,-.226),l(-.167,-.226),l(-.471,.407),l(-.277,-.208),l(.126,-.573),l(.147,-.758),l(.158,-1.043),l(-.293,-.452),l(-.258,-.169),l(-.496,-.126),l(-.832,-.987),l(-.875,-.804),l(-.528,-.168),l(-.43,.072),l(-.536,.298),l(-.456,.354),l(-1.202,.299),l(-.273,-.213),l(-.131,-.62),l(-.253,-.254),l(-.264,-.113),l(-.752,-.069),l(-.516,-.296),l(-.22,-.233),l(-.504,.138),l(-1.052,.115),l(-.653,-.184),l(-.047,.298),l(-.64,.099),l(-.183,0),l(-.578,-.926),l(-.238,.781),l(-.447,-.135),l(-.65,.001),l(-1.328,-.04),l(-.672,.439),l(-.39,.055),l(-1,-.459),l(-.096,.009),l(-.142,.014),l(-.362,.528),l(.201,.229),l(.303,0),l(.211,0),l(.537,-.207),l(.406,.092),l(.676,.482),l(-.68,.373),l(.02,.254),l(.263,.353),l(.593,.146),l(.229,.217),l(.35,.334),l(-.533,.136),l(-.503,-.084),l(-.276,-.419),l(-.79,-.271),l(-.224,-.211),l(-.265,-.056),l(-.013,.02),l(-.209,.32),l(.209,.154),l(.248,.183),l(-.248,.179),l(-.069,.05),l(-.447,-.459),l(-.476,.192),l(-.287,.291),l(-1.025,-.472),l(-.419,-.494),l(-1.16,-.642),l(-.615,.066),l(.554,.393),l(-.307,.187),l(-1.17,-.083),l(-.886,-.252),l(-.896,-.168),l(-1.547,.173),l(-.632,.328),l(-.392,-.015),l(-.433,-.031),l(-.135,-.49),l(-.333,.057),l(-.112,.184),l(.474,.731),l(-.877,.64),l(-.808,.577),l(-.915,.317),l(-.419,.043),l(-.414,-.056),l(-.728,-.111),l(-.126,.198),l(.437,.437),l(-.239,.396),l(-.327,.199),l(-.631,.114),l(-.737,.27),l(-.268,.17),l(.558,.352),l(.111,.169),l(-.659,.694),l(-.154,.297),l(-.012,.848),l(.144,.636),l(.271,.762),l(.425,.903),l(-.347,-.119),l(-.816,-.377),l(-.296,.001),l(-.416,.116),l(-.264,-.069),l(-1.029,-.56),l(-.921,-.32),l(-.375,-.365),l(-.336,-.592),l(-.332,-.932),l(-.078,-.467),l(-.268,-.253),l(-.657,-.576),l(-.845,-1.042),l(-.744,-1.227),l(-.663,-1.029),l(-.363,-.366),l(-.412,-.252),l(-.783,-.321),l(-.475,-.082),l(-.643,.018),l(-.468,.201),l(-.576,.541),l(-.418,.413),l(-.283,.37),l(-.416,.158),l(-.501,-.011),l(-.337,-.069),l(-1.104,-.503),l(-1.092,-.659),l(-.445,-.549),l(-.318,-.847),l(-.284,-.678),l(-.179,-.226),l(-.708,-.491),l(-.837,-.519),l(-.766,-.632),l(-.631,-.662),l(-.209,-.112),l(-1.892,-.046),l(-1.858,-.003),l(-.096,.892),l(-.213,.101),l(-1.867,.011),l(-.966,-.037),l(-1.544,-.02),l(-1.662,-.019),l(-.338,-.055),l(-3.516,-1.112),l(-2.811,-.933),l(-1.186,-.39),l(-.267,-.154),l(-.316,-.31),l(-2.381,.084),l(-2.367,.155),l(-.34,.017),M(49.818,152.776),l(-.122,.086),l(-.279,.03),l(-.111,-.131),l(-.177,-.005),l(-.324,.051),l(-.304,-.39),l(-.071,-.263),l(.339,-.01),l(.299,-.253),l(.188,.218),l(.106,.294),l(.223,.096),l(.233,.279),M(52.785,154.312),l(-.155,-.081),l(-.085,-.356),l(-.461,-.321),l(.095,-.229),l(.143,-.058),l(.366,.209),l(.344,.055),l(.616,.356),l(-.005,.172),l(-.294,.184),l(-.563,.069),M(111.683,77.224),l(-.138,.415),l(-.45,.067),l(-.324,.113),l(-.295,.247),l(-.321,-.137),l(-.185,-.21),l(.087,-.443),l(.086,-.443),l(-.438,-.675),l(-.463,-.319),l(-.199,-.271),l(-1.281,.055),l(-.437,.098),l(-.153,.161),l(-.496,.097),l(-.019,-.193),l(-.034,-.432),l(.212,-.272),l(.184,-.212),l(-.378,-.347),l(-.641,-.438),l(-.693,-.696),l(-.723,-.317),l(-.453,-.136),l(.132,-.35),l(-.569,-.592),l(-.099,-.213),l(.371,-.229),l(-.068,-.122),l(-.301,-.152),l(-.445,-.076),l(-.392,-.274),l(-.237,-.259),l(-.57,-.305),l(-1,-.411),l(-.479,-.765),l(-.217,-.583),l(-.367,-.399),l(-.357,.016),l(-.101,.814),l(.42,.873),l(.104,.306),l(-.047,.153),l(-.701,-.136),l(-.272,-.076),l(-.511,-.504),l(-.4,-.459),l(-.537,.139),l(-1.219,-.228),l(1.263,.718),l(.032,.214),l(-1.62,.171),l(-1.093,-.35),l(-1.388,-.948),l(-.543,-.292),l(-.664,-.043),l(-.079,0),l(-.933,-.213),l(-1.3,-.536),l(.928,-.248),l(.135,-.169),L(90.8,67.129),l(-.384,-.153),l(-.792,.156),l(-.454,.14),l(-.656,.017),l(-1.058,-.06),l(-1.068,-.245),l(.027,-.247),l(-.148,-.186),l(-.325,-.108),l(-.359,.016),l(-.47,.202),l(-1.036,.049),l(-1.465,-.122),L(80.46,66.64),l(-.786,-.091),l(-.248,-.108),l(-.651,-.387),l(-.427,-.527),l(-.301,.218),l(-.788,.157),l(-.89,-.293),l(-.234,-.326),l(-.417,-.139),l(-.872,-.248),l(-1.538,-.23),l(-.817,-.248),l(-.671,-.342),l(-.553,.235),l(-.675,.079),l(.06,.437),l(-.193,.062),l(-.389,.25),l(-.249,.405),l(1.119,.293),l(.174,.294),l(-.096,.388),l(-.428,.449),l(-.458,.001),l(-.804,-.214),l(-.586,-.061),l(-.568,.094),l(-.978,.603),l(-1.066,.217),l(-.936,.448),l(-1.035,.448),l(-1.095,.109),l(.178,-.308),l(.063,-.123),l(.72,-.401),l(-.093,-.385),l(-.655,-.523),l(.004,-.108),L(64.1,66.19),l(.411,-.482),l(.157,-.42),l(.736,-.312),l(.87,-.235),l(1.165,-.018),l(1.085,.123),l(.239,-.156),l(-1.239,-.466),l(-.971,-.389),l(-1.043,.049),l(-.226,.219),l(-.449,.095),l(-.573,.438),l(-.865,.375),l(-1.019,.282),L(61.553,65.9),l(-.406,.094),l(-.298,.14),l(.131,.325),l(-.177,.526),l(-.563,.34),l(-.564,.078),L(59,67.544),l(-.592,.278),l(-.681,.601),l(-.035,.292),l(.38,.168),l(.36,.03),l(.667,.106),l(.465,.229),l(-.075,.184),l(-.43,.338),l(-.625,.2),l(-.557,.277),l(-.423,.398),l(-.544,.383),l(-.675,.093),l(-1.434,.308),l(-.678,.397),l(-1.036,.337),l(-.7,.367),l(.52,.5),l(-.1,.167),l(-1.106,.412),l(-.897,.153),l(-.778,.168),L(49.51,74.19),l(-1.214,.456),L(48.1,74.828),l(-.274,.394),l(-.753,.439),l(-1.193,.229),l(-1.234,.184),l(-.973,-.345),l(.001,-.181),l(.332,-.348),l(.763,-.273),l(.306,-.212),l(.445,-.364),l(1.171,-.441),l(1.403,.073),l(-.12,-.212),l(.02,-.516),l(.47,-.304),l(.725,-.291),l(.754,-.366),l(.266,-.214),l(.002,-.731),l(.246,-.749),l(.693,-.49),l(.194,-.398),l(.034,-.412),l(-.633,.122),l(-1.251,.186),l(-.676,-.029),l(-.5,-.597),l(-.266,.062),l(-.613,.216),l(-.136,.23),l(.239,.352),l(.021,.352),l(-.169,.046),L(47,70.115),l(-.567,-.32),l(-.487,-.397),l(-.509,-.291),l(-.56,-.03),l(-.812,-.106),l(-.91,.094),l(.028,.138),l(-.644,.338),l(-1.175,.14),l(-.649,-.09),l(-.064,-.123),l(-.082,-.107),l(-.125,-1.028),l(.3,-.508),l(-.142,-.431),l(-.864,-1.002),l(-1.43,.437),l(-.738,.078),l(-.406,.202),l(-1.091,.094),l(-.4,-.23),l(-.394,-.355),l(-.466,-.325),l(-1.007,-.463),l(-.179,-.28),l(.292,-.171),l(.337,-.437),l(.704,.139),l(1.312,.309),l(.69,.03),l(.238,-.234),l(-.375,-.482),l(-.458,-.264),l(-.363,0),l(-.541,.22),l(-.528,-.015),l(-1.342,-.513),l(-.623,-.186),l(-.197,.016),l(-.858,-.029),l(-.024,-.078),l(-.623,-.985),l(.79,-.19),l(.071,-.456),l(.495,-.221),l(.102,-.299),l(.227,-.347),l(.893,-.491),l(.337,-.38),l(.386,-.301),l(.527,-.476),l(.39,-.175),l(.719,.109),l(.98,.268),l(.485,.094),l(.752,-.144),l(.427,-.254),l(.675,-.429),l(1.252,-.257),l(.774,-.033),l(.955,-.049),l(.354,-.175),l(.187,-.478),l(-.259,-.669),l(-.814,-.686),l(.026,-.096),l(.927,-.034),l(.343,-.256),l(-.25,-.384),l(-.497,-.256),l(-.367,-.08),l(-1.88,.389),L(39.33,56.53),l(-.534,.289),l(-.496,.065),l(-1.907,-.333),l(-.848,-.031),L(34.8,56.49),l(-1.27,.162),l(-1.265,-.029),l(-1.349,-.174),l(-.53,-.207),l(-.183,-.788),l(.144,-.146),l(.636,-.033),l(1.008,-.002),l(.446,-.179),l(-1.057,-.241),l(-1.912,-.304),L(28.13,54.31),l(-1.285,-.208),l(.219,-.114),l(.781,-.262),l(1.568,-.214),l(1.325,-.328),l(.958,-.214),l(1.058,-.361),l(.953,-.23),l(1.399,-.281),l(1.513,.128),l(-.158,.523),l(.023,.277),l(1.051,.161),l(1.359,.095),l(1.074,-.019),l(.657,-.099),l(.784,-.246),l(.55,-.295),l(.262,-.083),l(.752,.064),l(.751,.113),l(1.021,-.051),l(.2,-.327),l(.007,-.18),l(-.689,-.064),l(-1.946,-.292),l(-1.283,-.047),l(-.312,-.755),l(-1.473,-.162),l(-.96,-.031),l(-1.573,-.096),l(-.194,-.511),l(-.484,-.312),l(-1.042,-.461),l(-.512,-.148),l(-2.66,-.659),l(-2.008,-.545),l(.317,-.167),l(.812,-.402),l(.086,-.485),l(2.136,-.054),l(.99,-.069),l(1.829,-.288),l(.784,-.354),l(.452,-.623),l(.788,-.575),l(.616,-.525),l(.818,-.41),l(.742,-.224),l(1.066,-.104),l(1.133,-.241),l(1.047,-.036),l(1.804,.065),l(.146,-.188),l(-.156,-.205),L(44.47,42.83),l(.018,-.206),l(1.936,-.089),l(1.143,.032),l(.974,-.054),l(1.344,-.14),l(1.098,-.416),l(.918,-.417),l(.957,-.019),l(.282,.051),l(.675,.241),l(.156,.172),l(-.383,.139),l(.017,.344),l(1.049,.136),l(.424,.034),l(.536,-.293),l(.297,-.208),l(1.419,.187),l(1.534,.049),l(1.062,.049),l(.715,.033),l(.711,.257),l(.359,.274),l(.783,.358),l(.494,.085),l(.421,-.086),l(1.292,.117),l(1.124,.015),l(1.556,-.054),l(1.449,-.088),l(1.213,.1),l(1.377,.254),l(.883,.118),l(3.424,.13),l(1.279,.168),l(.743,.169),l(2.027,-.038),l(2.339,-.141),l(1.123,.236),l(2.441,.791),l(1.206,.301),l(.227,.008),l(.102,.483),l(-.003,2.855),l(.039,2.259),l(.052,2.335),l(.129,2.796),l(-.026,2.183),l(-.043,4.334),l(.026,2.167),l(.089,1.046),l(.196,.279),l(.84,.074),l(2.424,-.122),l(.739,.059),l(.332,.388),l(.173,.387),l(.348,.292),l(2.162,1.318),l(.945,.673),l(.238,-.325),l(.848,-.205),l(1.225,-.67),l(.731,-.498),l(.495,-.126),l(.832,.073),l(.316,.199),l(.371,.492),l(.35,.322),l(2.048,1.175),l(.814,.58),l(1.769,1.768),l(1.67,1.882),l(.512,.393),l(.189,.029),l(.98,.314),l(2.025,.763),l(.402,.255),l(-.163,.788),l(.393,.777), +N(643.755,159.873),l(-1.092,-.52),l(-.637,-.337),l(-.203,-1.284),l(.036,-.282),l(.24,-.241),l(.42,-.241),l(.721,-.623),l(.493,.056),l(.049,-.17),l(.24,-.396),l(.239,.028),l(.573,.225),l(.321,-.312),l(.439,-.001),l(.798,-.171),l(.596,.69),l(-.163,.17),l(-.443,.354),l(-.412,.538),l(-.285,.734),l(.14,.296),l(-.22,.311),l(-.292,.085),l(-1.026,.383),l(-.532,.707),M(627.173,150.012),l(-.679,.314),l(-.24,.241),l(-.043,.325),l(.138,.592),l(.228,.366),l(.119,.521),l(-.109,.339),l(-.266,.213),l(-.769,-.08),l(-.321,-.21),l(-.178,-.196),l(-.153,-.239),l(-.111,-.38),l(-.628,.413),l(-.647,.159),l(-.246,-.083),l(-.378,-.266),l(-.341,-.746),l(-.291,-.379),l(-.481,.045),l(-.507,.003),l(-.228,-.098),l(-.117,-.352),l(.729,-1.584),l(-.033,-.268),l(-.521,-.096),l(-.554,.074),l(-.202,-.324),l(-.277,-1.762),l(-.156,-.126),l(-.479,.017),l(-.771,.089),l(-.819,.442),l(-.312,.086),l(-.216,-.069),l(0,-.268),l(.224,-.58),l(-.163,-.705),l(-.075,-.465),l(.617,-.85),l(.191,-.198),l(.487,-.271),l(.611,-.525),l(.429,-.722),l(.353,-.862),l(-.02,-.875),l(-.195,-1.649),l(-.146,-.14),l(-.504,.031),l(-.287,-.041),l(-.217,-.309),l(-.243,-.901),l(-.397,-.435),l(-.504,-.279),l(-.277,.044),l(-.306,.34),l(-.001,.127),l(-.624,-.081),l(-.73,-.179),l(-.657,-.081),l(-.3,-.055),l(-.102,-.056),l(.138,-.269),l(.354,-.454),l(-.046,-.38),l(-.716,-.715),l(-.455,-.392),l(-1.377,.84),l(-.377,.044),l(-.975,-.319),l(-.286,-.167),l(-.355,.087),l(-.546,.299),l(-1.105,.726),l(-.829,.258),l(-.543,.37),l(-1.123,1.107),l(-.397,.27),l(-.714,.216),l(-.784,.033),l(-.189,.1),l(-.329,-.619),l(-.312,-.209),l(-.371,-.041),l(-1.659,-.047),L(601,137.538),l(-.309,-.294),l(-.417,.016),l(-.149,.103),l(-.348,.239),l(-.609,.539),l(-1.251,1.545),l(-.212,-.662),l(.052,-.861),l(-.139,-.183),l(-.231,-.069),l(-.471,.102),l(-.345,.129),l(-.655,-.159),l(-.339,.281),l(-.341,-.116),l(-.849,.066),l(-.319,-.364),l(-.63,-.281),l(-.407,0),l(-.08,.331),l(-.271,.083),l(-.685,-.38),l(.01,.364),l(-.237,.099),l(-.141,-.463),l(-.54,-.496),l(-.365,.066),l(-.935,-.066),l(-.014,-.265),l(.175,-.396),l(-.326,-.017),l(-.333,.248),l(-1.451,-.893),l(.069,-.281),l(-.178,-.38),l(-.289,-.166),l(-.71,.116),l(-.158,.166),l(-.657,-.794),l(-.454,-.281),l(-.15,.132),l(-.472,-.215),l(-.726,-.595),l(-.867,-.264),l(-.132,-.612),l(-1.079,-.199),l(-.186,.182),l(-.275,-.066),l(-.134,.513),l(-.276,.314),l(-.299,-.05),l(-.24,-.43),l(-.859,-.596),l(-.154,.066),l(-.756,-.248),l(.116,-.364),l(-1.078,-.579),l(-.363,.116),l(-.772,-.843),l(-.383,-.248),l(-.477,.314),l(-.198,-.066),l(-.099,-.43),l(.215,-.215),l(-.272,-.364),l(.104,-.446),l(-.579,-.595),l(-.157,-.694),l(.785,-.198),l(.033,.364),l(.337,.264),l(.368,-.049),l(.376,-.281),l(.578,-.364),l(-.367,-.694),l(.104,-.414),l(-.68,-.099),l(-.044,-.182),l(-.092,-.078),l(-.718,-.096),l(-.294,-.221),l(-.037,-.552),l(-.073,-.589),l(.184,-.184),l(.331,-.221),l(-.221,-.258),l(-.441,-.405),l(-.81,-.11),l(-.221,-.515),l(-.441,-1.03),l(0,-.515),l(-.502,.152),l(-.147,-.126),l(-.305,-.111),l(-1.337,-.104),l(-.565,-.436),l(-.178,-.09),l(-.104,-.199),l(-.239,0),l(-.52,.196),l(-.252,-.281),l(-.198,-.218),l(-.301,-.07),l(.312,-.516),l(-.007,-.501),l(-.213,-.247),l(-.373,-.323),l(-.625,.009),l(-.282,.128),l(-.004,-.456),l(-.554,-.117),l(-.296,-.047),l(-.281,.21),l(-.105,-.112),l(-.313,-.14),l(-.048,-.088),l(-.236,-.012),l(-.01,-.269),l(.574,.059),l(.192,-.145),l(.354,-.136),l(.08,-.249),l(.181,-.185),l(-.2,-.163),l(.152,-.36),l(-.245,-.237),l(.126,-.428),l(-.049,-.123),l(-.152,-.012),l(-.028,-.246),l(.009,-.284),l(-.295,-.494),l(-.273,-.154),l(-.692,-.039),l(-.22,-.06),l(-.229,.162),l(-.463,.045),l(-.325,-.394),l(-.077,-.305),l(.207,-.223),l(-.023,-1.031),l(.011,-.069),l(.139,-.739),l(.129,-.213),l(.274,-.186),l(1.422,-.704),l(1.737,-.734),l(.359,-.03),l(.06,.071),l(.183,.567),l(.344,.055),l(.507,-.145),l(.885,-.132),l(.268,-.243),l(.463,-.784),l(.467,-.472),l(.238,-.03),l(1.248,.235),l(.459,-.017),l(.478,-.102),l(.646,-.345),l(.638,-.701),l(.405,-.301),l(.445,-.145),l(1.338,-.349),l(.97,-.219),l(.325,-.187),l(.051,-.157),l(-.031,-.194),l(-.139,-.86),l(.02,-.399),l(.32,-.401),l(.705,-.546),l(.222,-.33),l(-.119,-.47),l(-.29,-.441),l(-.345,-.627),l(-.03,-1.357),l(-.483,-.141),l(-.366,.06),l(-.232,-.185),l(.068,-.215),l(.215,-.302),l(.393,-.188),l(1.799,-.254),l(1.082,-.207),l(.35,-.06),l(.5,.184),l(1.133,.238),l(.394,-.074),l(.231,-.145),l(.156,-.245),l(-.126,-.286),l(-.622,-.514),l(.137,-.418),l(.286,-.605),l(.438,-.794),l(.516,-1.141),l(.427,-.507),l(1.096,.254),l(.721,.141),l(.594,.141),l(1.402,.079),l(.718,-.062),l(.417,-.103),l(.444,-.392),l(.157,-.39),l(-.213,-.707),l(-.097,-.75),l(.34,-.581),l(.428,-.277),l(1.199,-.093),l(.289,-.06),l(.306,-.219),l(.035,-.478),l(.011,-.275),l(.279,-.262),l(.542,-.148),l(.551,-.034),l(.228,-.014),l(.569,-.003),l(.244,-.074),l(.062,.145),l(.131,.405),l(.24,.563),l(.371,.433),l(1.301,.745),l(.834,.415),l(.614,.069),l(.731,.167),l(.633,.144),l(.354,.143),l(.568,.618),l(1.07,1.451),l(.401,.66),l(-.215,.447),l(-.237,.75),l(-.214,.389),l(-.369,.347),l(-.035,.129),l(.105,.43),l(.233,.229),l(.724,.312),l(1.062,.181),l(1.505,.021),l(.995,.038),l(.668,.083),l(.998,.224),l(.632,.268),l(1.645,.806),l(.839,.31),l(.744,.096),l(.105,.542),l(1.571,2.161),l(.467,.439),l(.444,.254),l(1.979,.018),l(1.241,.207),l(.802,.109),l(1.165,.022),l(2.861,-.059),l(.937,.023),l(1.164,.022),l(1.69,.119),l(.521,.168),l(.815,.551),l(1.006,.365),l(1.599,.433),l(.929,.123),l(.663,-.061),l(.61,.067),l(.253,.297),l(.433,.197),l(.481,-.017),l(.686,-.289),l(1.44,-.534),l(.303,-.101),l(.736,-.274),l(.816,-.289),l(1.204,-.349),l(1.339,-.007),l(1.514,-.065),l(.987,.08),l(.651,-.061),l(1.941,-.737),l(.265,-.172),l(1.111,-1.046),l(.67,-.389),l(1.265,-.292),l(.326,-.259),l(.123,-.271),l(-.188,-.228),l(-.599,-.411),l(-.389,-.569),l(-.003,-.343),l(.214,-.401),l(.539,-.589),l(.457,-.231),l(.316,-.073),l(.718,.154),l(.668,.382),l(.592,.125),l(.982,-.005),l(.744,-.047),l(.742,-.433),l(1.192,-.91),l(.224,.013),l(.438,.012),l(.624,.054),l(.896,-.134),l(.638,-.248),l(.347,-.188),l(.241,-.216),l(.312,-.82),l(.363,-.333),l(.47,-.204),l(.464,-.045),l(.483,.127),l(.353,-.189),l(.831,-.278),l(.539,-.146),l(.937,-.221),l(.854,-.033),l(.432,.099),l(1.074,.008),l(.464,.127),l(.414,-.218),l(.107,-.217),l(-.048,-.273),l(-.599,-.501),l(-.879,-.99),l(-.797,-.5),l(-.538,-.199),l(-.928,-.212),l(-.438,.002),l(-1.191,.786),l(-.292,-.07),l(-.431,-.416),l(-.317,-.085),l(-.576,.018),l(-.754,.062),l(-.929,.395),l(-.342,.045),l(-.051,-.029),l(-.269,-.836),l(.381,-.58),l(1.224,-1.959),l(.687,-1.207),l(.295,-.31),l(.046,.018),l(.452,.172),l(1.126,.574),l(.343,-.016),l(.438,-.089),l(2.44,-.752),l(.779,-.339),l(.123,-.233),l(-.056,-.306),l(-.35,-.348),l(-.062,-.146),l(.103,-.249),l(.422,-.426),l(.416,-.543),l(.667,-.779),l(.599,-.545),l(1.371,-.608),l(.167,-.794),l(-.107,-.249),l(-.465,-.306),l(-.558,-.026),l(-.822,.078),l(.119,-.25),l(.375,-.282),l(1.193,-.787),l(.478,-.165),l(.602,-.136),l(1.854,-.143),l(.836,-.123),l(1.203,-.109),l(.917,-.049),l(1.148,.215),l(1.037,.481),l(.683,.188),l(1.386,-.125),l(.539,.026),l(.763,.467),l(.742,.952),l(1.087,2.384),l(.94,1.588),l(.927,1.903),l(.436,.389),l(.507,.2),l(1.247,.341),l(1.523,.253),l(2.659,.839),l(.205,.144),l(.297,.866),l(.44,1.283),l(.261,.446),l(.68,-.033),l(.649,-.018),l(1.657,-.052),l(.604,-.22),l(.953,-.308),l(1.357,-.31),l(1.181,-.208),l(.902,-.034),l(.246,.114),l(.064,.259),l(.116,.389),l(.017,.504),l(-.566,.407),l(-.66,.393),l(-.291,.707),l(-.278,.893),l(-.538,1.066),l(-.627,1.08),l(-.329,.432),l(-.551,.69),l(-.47,.347),l(-.547,-.098),l(-.679,-.225),l(-.685,-.24),l(-.396,-.041),l(-1.664,.982),l(-.048,.557),l(.332,.897),l(.062,.656),l(-.006,.613),l(-.025,.385),l(-.097,.128),l(.112,.299),l(-.156,.329),l(-.511,.43),l(-1.252,.462),l(-.111,.058),l(-.579,-.68),l(-.247,.001),l(-.253,.129),l(-.383,.358),l(-.23,.713),l(-.955,.532),l(-.62,.259),l(-.538,.017),l(-.452,-.054),l(-.333,-.126),l(-.392,.059),l(-.273,.243),l(-.025,.342),l(.508,.765),l(.046,.113),l(-.527,.159),l(-.975,.048),l(-.508,-.153),l(-.493,-.253),l(-.273,-.396),l(-.448,.017),l(-.386,.13),l(-.686,1.027),l(-.636,.543),l(-1.032,.545),l(-1.533,.604),l(-.52,.329),l(-.415,.442),l(-.379,.528),l(-.066,-.092),l(-.417,.171),l(-1.222,.13),l(-.728,.171),l(-2.248,.925),l(-.632,.37),l(-.566,.469),l(-.604,.271),l(-.336,.015),l(.13,-.255),l(.862,-.682),l(.33,-.354),l(-.47,-.113),l(-.37,.072),l(-.153,-.297),l(.058,-.156),l(.953,-.781),l(.269,-.384),l(.55,-.413),l(.159,-.2),l(-.057,-.298),l(-.73,-.553),l(-.727,-.283),l(-.131,-.014),l(-.628,.03),l(-.166,.015),l(-.494,.371),l(-1.146,1.183),l(-.355,.157),l(-.643,.086),l(-.613,.243),l(-.36,.199),L(665.49,112),l(-.136,.411),l(-.131,.255),l(-.251,.255),l(-.437,.128),l(-.493,-.013),l(-.326,.27),l(-.307,.114),l(-.455,-.565),l(-.355,-.014),l(-.349,.128),l(-.396,.638),l(-.301,.694),l(.088,.34),l(.245,.368),l(.558,.268),l(.8,.268),l(1.21,-.045),l(.29,.254),l(-.019,.538),l(-.123,.581),l(.057,.538),l(.261,.283),l(.733,.069),l(.698,-.157),l(.76,-.525),l(.509,-.497),l(.552,-.228),l(.534,-.128),l(.287,.07),l(.895,.621),l(.543,.197),l(1.023,-.087),l(.361,.027),l(.471,.141),l(.274,0),l(-.248,.708),l(-.057,.552),l(-.612,-.197),l(-.297,-.084),l(-.525,.058),l(-1.677,.555),l(-.707,.44),l(-.072,.735),l(-.522,.157),l(-.146,-.113),l(-.017,-.269),l(-.127,-.084),l(-.501,.114),l(.138,.466),l(-.152,.368),l(-.485,.496),l(-1.397,1.119),l(-.126,.226),l(.039,.55),l(.62,.225),l(.712,.492),l(.785,.521),l(.391,.535),l(.424,1.241),l(.668,.647),l(.175,.437),l(-.13,.677),l(.172,.183),l(.694,.295),l(.399,.592),l(.562,.253),l(.272,.268),l(.087,.31),l(-.049,.155),l(-.789,.369),l(.088,.07),l(.425,.31),l(.314,.79),l(-.019,.296),l(-.141,.184),l(-.534,.043),l(-.651,.213),l(-.948,.552),l(-.849,.213),l(-.629,.297),l(.72,.21),l(.378,.056),l(.944,-.425),l(.488,-.058),l(.162,.056),l(.524,.592),l(.387,.168),l(.456,.027),l(.009,.155),l(-.231,.311),l(-.382,.227),l(-.304,.241),l(.11,.155),l(.326,-.029),l(.202,.084),l(-.184,.325),l(-.298,.749),l(-.192,.649),l(.028,.353),l(-.22,.452),l(-.209,.127),l(-.35,-.338),l(-.146,.142),l(-.569,.763),l(-.401,.622),l(-.215,.622),l(-.127,.296),l(-.595,.425),l(-.251,.438),l(-.254,.184),l(-.569,.029),l(-.382,.227),l(.279,.719),l(-.264,.508),l(.076,.593),l(-.093,.269),l(-.207,.269),l(-.532,.199),l(-.161,.282),l(-.174,.396),l(-.294,.636),l(-.626,.354),l(-.412,.495),l(-.492,-.14),l(-.443,-.069),l(-.142,.113),l(-.145,.198),l(.118,.833),l(-.213,.142),l(-.772,.651),l(-.356,.127),l(-.628,.171),l(-.563,.467),l(-.571,.213),l(-.107,.113),l(-.008,.48),l(-.133,.156),l(-.568,.058),l(-.5,.114),l(-.341,.438),l(-.364,-.126),l(-.52,-.168),l(-.274,.057),l(-.315,.326),l(-.435,.198),l(-.643,.1),l(-.047,-.465),l(-.52,.057),l(-.699,.213),l(-.32,.198),l(-.285,-.042),l(-.401,-.493),l(-.163,-.155),l(-.191,.283),l(.095,.169),l(-.045,.212),l(-.047,.691),l(-.209,.297),l(-.416,.114),l(-.501,-.182),l(-.123,.282),l(-.001,.24),l(-.146,.155),l(-.615,.058),l(-.366,.114),l(-.596,.043),l(-.463,-.211),l(-.217,.1),l(-.439,.48),l(-.227,.071),l(-.774,-.041),l(-.747,.227),l(-.406,.326),l(-.451,-.027),l(-.277,-.084),l(-.011,.057),l(-.069,.353),l(-.29,.396),l(.011,.113),l(.48,.634),l(.269,.126),l(.043,.198),l(-.36,.269),l(-.763,.157),l(-.481,-.719),l(-.241,-.691),l(.012,-.395),l(.396,-.777),l(-.015,-.169),l(-.587,-.253),l(-.226,.071),l(-.206,.297),l(-.454,.072),l(-.676,-.21),l(-.574,-.733),l(-.196,.085),l(-.017,.169),l(-.159,.396),l(-.27,.128),l(-.332,-.056),l(-.481,.043),l(-.055,.038),l(-.197,-.143),l(-.909,-.107),l(-.621,-.166),l(-.943,-.615),l(-.273,-.365),l(-.096,-.521),l(.472,-.75),l(-.056,-.38),l(-.237,-.21),l(-.777,.047),l(-.66,-.053),l(-.771,-.235),l(-.623,-.575),l(-.298,.101),l(-.521,.328),l(-.696,.554),l(-.341,.157),l(-.807,.117),l(-1.595,.052),l(-.332,.115),l(-.584,.413),l(-.325,-.097),l(-.597,-.392),l(-.341,-.012),l(-.515,.13),l(-.483,.229), +N(241.073,156.152),l(.017,.52),l(.098,1.215),l(.012,.212),l(-.379,.455),l(-.011,.17),l(.485,1.358),l(-.669,-.577),l(-.445,-.056),l(-.761,.143),l(-.877,-.012),l(-.666,-.14),l(-.574,-.056),l(-.474,.1),l(-.378,.354),l(-.135,-.042),l(-.993,-.549),l(-.171,-.325),l(.04,-.198),l(.269,-.184),l(1.051,.097),l(.631,.111),l(1.125,.167),l(.654,.041),l(.61,-.185),l(.386,-.156),l(-.198,-.155),l(-.692,-.464),l(-.136,-.296),l(.184,-.707),l(-.202,-.296),l(-.394,-.154),l(-.913,-.14),l(-.305,-.211),l(.04,-.184),l(.119,-.085),l(.344,-.1),l(.724,-.058),l(.781,.125),l(1.081,.294),l(.576,.056),l(.147,-.089), +N(241.295,160.082),l(-.485,-1.358),l(.011,-.17),l(.379,-.455),l(-.012,-.212),l(-.098,-1.215),l(-.017,-.52),l(.503,-.279),l(.393,.14),l(.342,0),l(.384,-.17),l(.369,-.043),l(.14,.198),l(.177,.112),l(1,.309),l(.657,-.072),l(.213,.395),l(.335,.338),l(.528,.324),l(.335,.084),l(.643,.21),l(.916,.45),l(.399,.352),l(.231,.311),l(-.191,.17),l(-.144,.297),l(-.314,.368),l(-.238,-.098),l(-.476,-.592),l(-.378,-.042),l(-.788,.058),l(-.288,-.098),l(-.373,0),l(-.329,.1),l(-.763,.539),l(-.396,-.056),l(-.319,-.494),l(-.166,-.028),l(-.155,.057),l(-.658,.326),l(-.344,.778),l(-.41,.65),l(-.289,-.112),l(-.325,-.551), +N(668.053,167.796),l(-.131,-.099),l(-.74,-.732),l(-.444,-1.255),l(.037,-.424),l(.054,-.706),l(-.292,-.465),l(.18,-.382),l(.978,.704),l(.202,-.424),l(.023,-.41),l(-.101,-.438),l(-.026,-.579),l(.145,-.438),l(.025,-.664),l(.082,-.861),l(.074,-.636),l(.38,-.862),l(.188,-.127),l(.337,-.142),l(.523,.055),l(1.21,.52),l(.576,.042),l(.188,-.212),l(.277,-.17),l(.199,.141),l(.018,.396),l(-.266,.438),l(-.045,.48),l(.14,.79),l(.541,.394),l(.182,.325),l(-.427,1.271),l(-.31,.467),l(-.834,.608),l(-.555,.312),l(-.082,.099),l(.003,.268),l(-.078,.565),l(-.28,.424),l(.127,.211),l(.35,.733),l(.345,1.101),l(.26,.62),l(.093,.028),l(.451,.324),l(.296,.07),l(.161,-.325),l(.485,-.537),l(.197,-.029),l(.418,.112),l(.226,.211),l(.179,.635),l(.286,.353),l(.326,.084),l(.505,-.58),l(.621,.267),l(.141,.028),l(.078,.127),l(-.168,.156),l(-.378,.156),l(-.208,.212),l(.936,1.226),l(-.315,.184),l(-.568,-.196),l(-.404,-.098),l(-.094,-.48),l(-.229,-.31),l(-.599,-.535),l(-.753,-.577),l(-.258,0),l(-.099,.226),l(.371,.776),l(-.218,.283),l(-.727,-.775),l(-.982,-.548),l(-.309,.015),l(-.344,.142),l(-.182,.255),l(-.14,.071),l(-.395,.057),l(-.322,-.225),l(-.591,-.366),l(-.195,-.423),l(.64,-.608),l(.323,.211),l(.358,.084),l(.4,-.199),l(-.151,-.169),l(-.713,-.295),l(-.422,-.395),l(-.522,-.168),l(-.239,.607),M(669.676,172.974),l(-.452,-.366),l(-.349,-.408),l(-.051,-.226),l(-.364,-1.114),l(-.459,-.521),l(.685,-.058),l(.868,.012),l(.314,.169),l(.274,.451),l(.028,.861),l(-.097,.48),l(-.214,.283),l(-.185,.438),M(679.073,175.368),l(-.562,-.267),l(-.178,-.254),l(-.237,-.169),l(-.064,-.127),l(.139,-.339),l(-.091,-.423),l(-.55,-.352),l(-.662,-.479),l(-.147,-.466),l(.513,-.1),l(1.017,-.143),l(.371,.112),l(.283,.409),l(.069,.818),l(.123,.805),l(.257,.79),l(-.112,.127),l(-.167,.057),M(671.406,176.824),l(.022,-.353),l(.186,-1.342),l(.061,-1.172),l(.482,.395),l(.576,.281),l(.366,.028),l(.634,-.185),l(.027,.438),l(-.079,.396),l(-.24,.269),l(-.184,.198),l(-.908,.651),l(-.943,.397),M(664.721,177.812),l(-.366,-.027),l(.127,-.297),l(.202,-.099),l(.314,-.396),l(.265,-.523),l(.082,-.607),l(.138,-.509),l(.326,-.184),l(.14,.183),l(-.16,.283),l(.276,.55),l(.212,.564),l(-.108,.113),l(-.664,.354),l(-.406,.368),l(-.377,.227),M(673.781,179.981),l(-.385,-.366),l(-.828,-.591),l(-.206,-.38),l(.099,-.368),l(.565,-.213),l(.22,-.269),l(.487,-1.822),l(.438,-.185),l(.271,.028),l(.113,.126),l(.049,.282),l(-.373,.905),l(-.089,.226),l(-.315,1.413),l(.165,.296),l(.214,.465),l(-.213,.41),l(-.212,.043),M(661.179,181.308),l(-.317,-.042),l(.215,-.48),l(.343,-.467),l(.35,-.34),l(.592,-.354),l(.636,-.496),l(.933,-1.089),l(.11,.55),l(-.118,.424),l(-.267,.297),l(-.24,.184),l(-.516,.213),l(-.172,.127),l(-.244,.622),l(-.327,.269),l(-.591,.171),l(-.386,.41),M(680.678,185.402),l(-.201,-.098),l(-.098,-.438),l(-.361,-.748),l(-.297,-.112),l(-.381,.608),l(-.361,.82),l(.246,.38),l(.166,.395),l(.148,.677),l(-.158,.495),l(-.383,.509),l(-.305,-.253),l(-.176,-.268),l(.201,-.41),l(-.076,-.325),l(-.363,-.07),l(-.361,.665),l(-.173,-.056),l(-1.114,-.619),l(-.557,-.549),l(-.206,-.508),l(-.037,-.635),l(.466,-.905),l(-.108,-.479),l(-.466,-.409),l(-.778,-.295),l(-.292,.043),l(-.062,.17),l(-.129,.226),l(-.5,.255),l(-.661,.058),l(-.027,-.494),l(-.174,-.24),l(-.399,.199),l(-.504,.961),l(-.525,.863),l(-.219,-.084),l(-.119,-.127),l(-.034,-.197),l(.054,-.311),l(.359,-.749),l(.185,-.537),l(.263,-.283),l(.383,-.184),l(.564,-.044),l(.219,-.127),l(.134,-.466),l(.205,-.156),l(.549,-.241),l(.777,-.101),l(.292,.353),l(.102,.72),l(.317,-.156),l(.485,-.058),l(.207,-.184),l(.207,-.565),l(.358,-.255),l(.479,.21),l(.186,.084),l(.158,-1.087),l(.29,-.015),l(.264,.465),l(.315,-.481),l(.205,-.142),l(.392,.098),l(.133,-.227),l(-.048,-.706),l(-.172,-.564),l(.146,-.353),l(.413,.549),l(.711,.803),l(.229,.48),l(.083,.324),l(-.336,.735),l(.237,.226),l(.537,-.1),l(.076,.423),l(-.114,.424),l(.056,.692),l(.207,.437),l(-.002,.438),l(-.111,.424),l(-.283,.579),l(-.332,.622), +N(251.898,160.229),l(-.547,-.112),l(-.073,-.212),l(.051,-.551),l(-.109,-.24),l(.11,-.17),l(.235,-.071),l(.543,.069),l(.404,-.015),l(1.505,.11),l(.393,.168),l(.113,.141),l(-.188,.354),l(-.07,.099),l(-.283,.227),l(-.335,.043),l(-.739,-.083),l(-.657,.072),l(-.354,.17), +N(228.82,160.519),l(-.299,-.056),l(-.693,-.224),l(-.229,-.268),l(-.47,-.366),l(-.465,-.084),l(-.142,-.211),l(.53,-.284),l(.704,-.072),l(1.364,.251),l(.97,.351),l(.651,.267),l(.279,.282),l(-.04,.198),l(-.332,.071),l(-.751,-.295),l(-.543,.058),l(-.227,.255),l(-.308,.128), +N(400.72,175.499),l(-.595,-.119),l(-.161,-.032),l(-.976,.458),l(-1.429,-.006),l(-.867,-.037),l(-2.119,.041),l(-.271,.157),l(-.125,.34),l(.261,1.934),l(.02,.41),l(-.191,.17),l(-.63,-.434),l(-.644,-.166),l(-.769,.075),l(-.608,.159),l(-.446,.257),l(-.368,.115),l(-.354,-.083),l(-.452,-.223),l(-.52,-.562),l(-.15,-.465),l(-.308,-.252),l(-.545,.003),l(-.259,-.168),l(.08,-.043),l(.046,-.156),l(.172,-.326),l(.261,-.92),l(.133,-.876),l(-.058,-.749),l(.141,-.255),l(.257,-.016),l(.448,-.158),l(.543,-.271),l(.317,-.369),l(.292,-1.047),l(.355,-1.217),l(.397,-.384),l(.273,-.058),l(.293,.281),l(.551,.364),l(.45,-.102),l(.174,-.227),l(.393,-.822),l(.492,-.667),l(.638,-.625),l(.272,-.101),l(.518,.209),l(.324,.182),l(.274,.027),l(.314,-.793),l(.304,-.228),l(.947,-.458),l(1.22,-.713),l(.37,-.073),l(.356,.125),l(.36,.059),l(1.062,.173),l(-.173,.665),l(.019,.396),l(.426,.93),l(.422,.492),l(.389,.266),l(.502,.42),l(.179,.268),l(.018,.212),l(-.335,.439),l(.114,.226),l(.97,.757),l(.516,.181),l(.37,-.044),l(.562,.025),l(.568,.971),l(.131,.367),l(-.237,.764),l(-.415,.468),l(-.337,.158),l(-.739,-.095),l(-.418,.045),l(-.415,.271),l(-.366,.553),l(-.24,.157),l(-.062,.142),l(-.29,-.041),l(-.611,-.166),l(-1.013,-.163), +N(209.823,175.47),l(-.388,-.645),l(-.932,-.888),l(-1.003,-1.085),l(-.837,-.817),l(-.723,-.464),l(-.196,-.183),l(-.023,-.226),l(.625,-.03),l(1.001,-.125),l(.29,-.143),l(.293,-.412),l(.005,-.961),l(.882,-.034),l(.513,-.583),l(.725,.42),l(1.207,-.997),l(.503,-.794),l(.294,-.242),l(.259,.013),l(.328,.182),l(.463,.097),l(.248,-.086),l(.424,-.229),l(1.425,-.486),l(.23,.519),l(.038,.339),l(-.057,.509),l(-.214,.707),l(-.543,.806),l(-.1,.749),l(.042,.904),l(-.245,1.13),l(-.188,.735),l(-.101,1.385),l(.031,.55),l(.184,.466),l(.188,.363),l(-.281,.274),l(-.767,-.149),l(-.241,-.46),l(-.285,.077),l(-.394,-.107),l(-.603,.25),l(-1.651,-.599),l(-.43,.271), +N(634.036,168.444),l(.533,.251),l(.736,.165),l(.341,.111),l(.469,.251),l(.248,-.058),l(.095,-.24),l(-.103,-.211),l(-.187,-.182),l(-.107,-.296),l(.392,-.285),l(.476,-.186),l(.444,.181),l(.373,.351),l(.3,-.072),l(.975,-.429),l(.209,-.114),l(-.215,.905),l(.029,.663),l(.455,1.014),l(-.076,.367),l(-.05,.424),l(.054,1.073),l(-.217,.509),l(-.385,.285),l(-.599,.187),l(-.932,.443),l(-.521,.229),l(-.99,.571),l(-.234,.425),l(.216,.422),l(.568,.435),l(.03,.197),l(-.17,.27),l(-.688,-.194),l(-.497,-.011),l(-.599,.229),l(-.915,.528),l(-.646,.229),l(-.3,.289),l(-.256,-.188),l(-.248,-.268),l(-.35,-.042),l(-.382,.142),l(-.205,-.042),l(-.293,.043),l(-.183,-.113),l(.142,-.311),l(.182,-.226),l(-.04,-.254),l(-.283,-.395),l(-.277,.043),l(-.462,.298),l(-.339,.015),l(-.171,-1.044),l(-.649,-1.488),l(.146,-.176),l(-.16,-.479),l(-.487,-.717),l(-.219,-.648),l(-.026,-.635),l(.076,-.382),l(.146,-.297),l(.92,-1.233),l(.521,-.441),l(.383,-.101),l(1.172,-.091),l(.798,.066),l(.558,-.074),l(.575,.039),l(.599,.109),l(.301,.167), +N(214.474,175.913),l(.821,.884),l(.385,.623),l(.314,.322),l(.225,.046),l(.465,.645),l(.441,.352),l(-.014,.006),l(-.074,.123),l(-.478,-.184),l(-.219,.205),l(-.014,.321),l(0,.58),l(.507,.307),l(-.396,.368),l(.125,.532),l(-.374,.369),l(.243,.184),l(-.204,.609),l(.003,-.466),l(-.296,-.307),l(.01,-.568),l(-.377,-.148),l(-.238,-.102),l(-.111,.082),l(.325,.41),l(.084,.225),l(-.113,.062),l(-.726,-.299),l(-.13,-.282),l(.251,-.339),l(.04,-.382),l(-.182,-.338),l(-.486,-.324),l(-.695,-.287),l(-.079,-.144),l(-.689,-.103),l(-.316,-.327),l(.007,-.421),l(-.146,-.255),l(-.249,-.098),l(-.576,-.353),l(-.416,-.266),l(.225,.512),l(.086,.222),l(.422,.044),l(.181,.266),l(-.544,.573),l(-.144,-.262),l(-.356,-.282),l(-.561,-.211),l(-.323,-.239),l(-.147,-.24),l(-.104,-.494),l(.128,-.421),l(.332,-.225),l(-.008,-.389),l(-.554,-.225),l(.363,-.123),l(-.057,-.227),l(-.238,.017),l(.43,-.271),l(1.651,.599),l(.603,-.25),l(.394,.107),l(.285,-.077),l(.241,.46),l(.767,.149),l(.281,-.274), +N(436.304,195.359),l(-.209,-.451),l(-.194,-.804),l(-.498,-.802),l(-1.217,-1.236),l(-.112,-.324),l(-.064,-.791),l(-.432,-.605),l(-.4,-.661),l(-.207,-.592),l(-.273,-1.185),l(-.112,-.776),l(.064,-.424),l(.144,-.198),l(.528,-.399),l(.4,-.511),l(.866,-1.743),l(.354,-.327),l(.208,-.114),l(.096,.084),l(.24,.027),l(.449,-.158),l(1.363,-.686),l(.494,.661),l(.225,.069),l(.224,-.03),l(.466,-.271),l(.754,-.386),l(.818,-.273),l(.881,.009),l(.368,-.031),l(.258,-.143),l(.646,-1.176),l(.117,-.806),l(.209,-.199),l(.434,-.059),l(2.181,-.055),l(.386,-.087),l(2.649,-2.275),l(.196,-.284),l(.005,-.41),l(.165,-.382),l(.372,-.228),l(.939,-.613),l(.322,-.086),l(.321,.012),l(.559,.208),l(1.342,1.673),l(.347,.549),l(.122,.536),l(-.416,1.472),l(.01,.664),l(.158,.211),l(.802,-.019),l(.272,-.001),l(.207,.126),l(.252,.493),l(.223,.225),l(.797,.447),l(.799,.235),l(.351,.196),l(.223,.267),l(-.148,.481),l(.173,.395),l(.445,.351),l(.558,.378),l(.717,.434),l(.207,.168),l(.206,.366),l(.059,.72),l(.285,.436),l(.367,.224),l(.814,.165),l(.558,.477),l(.157,.352),l(-.083,.679),l(.031,.07),l(-.496,.145),l(-.962,.344),l(-.319,-.026),l(-.287,-.167),l(-.687,-.264),l(-1.15,-.361),l(-.4,.13),l(-.082,.551),l(-.13,.241),l(-.256,.058),l(-.399,-.026),l(-.862,-.207),l(-.593,.102),l(-.93,.373),l(-.93,.486),l(-.271,.016),l(-.559,-.35),l(-.383,-.153),l(-.353,.186),l(-.677,1.36),l(-.176,.157),l(-.591,-.067),l(-1.934,-.511),l(-1.422,-.189),l(-.512,-.322),l(-.159,-.239),l(-.334,-.394),l(-.75,-.518),l(-.432,-.167),l(-.479,.06),l(-.529,.3),l(-.353,.341),l(-.785,.979),l(-.097,.297),l(.096,.452),l(-.017,.353),l(-.063,.594),l(-.16,.058),l(-.751,.287),l(-.895,-.093),l(-.624,-.138),l(-.367,-.054),l(-.975,.175),l(-.479,.102),l(-.255,.228),l(-.222,1.287),l(-.158,.523),l(-.365,.497),l(-.303,.312), +N(371.324,180.419),l(1.088,-1.235),l(.643,-.866),l(.238,-.157),l(.594,.039),l(1.137,-.148),l(.466,.04),l(.42,.224),l(.456,.421),l(.475,.619),l(.252,.761),l(.165,1.369),l(.26,.656),l(-.259,.502),l(-1.184,1.151),l(-.63,.724),l(-.285,.256),l(-.061,.103),l(-.631,-.523),l(-.661,-.408),l(-.483,-.196),l(-.033,-.141),l(.061,-.297),l(-.05,-.184),l(-.531,-.21),l(-.792,-.549),l(-.389,-.366),l(-.375,-.465),l(.494,-.241),l(.174,-.227),l(-.034,-.155),l(-.484,-.211),l(-.065,-.113),l(.022,-.173), +N(579.606,186.906),l(-.493,-.083),l(-.265,-.197),l(-.21,-.353),l(-.246,-.621),l(-.361,-1.256),l(-.034,-.649),l(.005,-.763),l(-.02,-.904),l(-.24,-.696),l(.188,-.513),l(-.298,-.35),l(.068,-.28),l(.423,.023),l(.349,-.43),l(.053,-.367),l(.226,-.369),l(-.152,-.537),l(.529,.48),l(.699,.38),l(.234,.395),l(.549,.776),l(.175,.324),l(-.099,.339),l(.024,.141),l(.592,.338),l(.266,.733),l(.798,1.368),l(.136,.508),l(-.193,.735),l(-.397,.679),l(-.369,.396),l(-.514,.425),l(-.78,.284),l(-.642,.043), +N(217.111,178.792),l(.52,.307),l(.195,.512),l(.02,.374),l(.363,.155),l(.628,.024),l(.244,-.205),l(.398,.43),l(.726,.082),l(.458,-.083),l(1.348,-.751),l(.514,-.046),l(1.387,-.921),l(.373,.144),l(.742,.069),l(.071,.156),l(.789,-.017),l(.767,.21),l(.666,.38),l(.644,.563),l(.406,.666),l(.084,.327),l(.228,.149),l(.509,1.038),l(-.322,.062),l(-.094,.43),l(-.584,.409),l(-.085,-.307),l(-.19,-.082),l(.045,.45),l(-.228,.082),l(-.256,.753),l(-.378,-.825),l(-.441,-.762),l(-.137,-.452),l(.179,-.24),l(.22,-.085),l(.786,.125),l(-.336,-.193),l(-.125,-.164),l(-.096,-.471),l(-.309,.307),l(-.439,.041),l(-.244,-.378),l(-.031,-.269),l(-.193,-.282),l(-.132,.151),l(-.226,-.287),l(-.11,.102),l(-.132,-.266),l(-.456,-.192),l(-.562,-.013),l(-.499,.241),l(-.382,.108),l(-.07,.359),l(.081,.234),l(-.529,.318),l(-.374,.184),l(-.335,.029),l(-.345,.41),l(.049,.296),l(.316,.297),l(.464,.43),l(.178,.386),l(-.011,.146),l(-.281,.081),l(-.243,-.042),l(-.431,.391),l(-.568,.105),l(-.339,-.042),l(-.189,-.146),l(.108,-.164),l(-.349,-.833),l(-.244,-.353),l(-.177,.674),l(-.812,-.409),l(-.227,-.757),l(-.207,.041),l(-.96,-.123),l(-.434,-.266),l(-.599,0),l(-.314,.113),l(-.361,.495),l(.204,-.609),l(-.243,-.184),l(.374,-.369),l(-.125,-.532),l(.396,-.368),l(-.507,-.307),l(0,-.58),l(.014,-.321),l(.219,-.205),l(.478,.184),l(.074,-.123), +N(266.015,188.956),l(-.503,-.647),l(-.732,-.745),l(-.324,-.521),l(.071,-.212),l(.395,-.539),l(-.008,-.58),l(.061,-.452),l(1.032,-.19),l(.41,-.144),l(.308,-.299),l(-.141,-.282),l(-.62,-.604),l(-.074,-.212),l(.101,-.255),l(1.655,-1.239),l(.061,-.41),l(-.095,-.296),l(.072,.049),l(.496,.338),l(.856,.521),l(.695,.521),l(.587,.663),l(.128,.409),l(-.036,.734),l(.148,.945),l(.298,-.593),l(.22,-.099),l(.6,.182),l(.101,.127),l(.507,.295),l(.708,.549),l(.401,.493),l(.374,.649),l(-.015,.339),l(-.142,.496),l(-.082,.862),l(-.183,.27),l(-1.131,.091),l(-.169,.17),l(.078,.777),l(-.095,.467),l(-.328,.694),l(.571,.831),l(.532,.675),l(.561,.067),l(.185,.295),l(.246,.832),l(.49,1.127),l(.332,.563),l(-.06,.212),l(-.943,-.022),l(-.934,.429),l(-1,.331),l(-.505,.314),l(-.694,.513),l(-.686,.075),l(-.613,-.392),l(-1.103,-.897),l(-.15,-.296),l(-.008,-.396),l(.072,-.354),l(-.167,-.31),l(-.281,-.394),l(-.156,-.465),l(.213,-.962),l(.547,-1.416),l(.179,-.368),l(-.435,-.958),l(-.533,-.138),l(-.304,.001),l(.452,-1.09),l(-.04,-.212),l(-.26,-.111),l(-.516,-.124),l(-.302,.058),l(-.375,.257), +N(377.518,182.142),l(.193,-.376),l(.252,-.242),l(.367,-.143),l(.528,-.046),l(.338,.097),l(.165,.366),l(.22,.846),l(.009,.65),l(-.044,.283),l(.277,.323),l(.404,.322),l(.321,.026),l(.756,-.922),l(.143,-.086),l(.337,.097),l(.339,.224),l(-.062,.17),l(.119,.55),l(-.059,.438),l(-.501,.865),l(.05,.183),l(.194,.183),l(.369,.097),l(.592,-.032),l(1.264,1.334),l(.131,.282),l(-.059,.452),l(-.247,.849),l(-.105,.565),l(-.041,.919),l(-1.513,-.643),l(-1.221,-.619),l(-1.012,-.562),l(-.403,-.423),l(-1.129,-1.113),l(-1.111,-.76),l(-.723,-.337),l(-.901,-.535),l(-.66,-.548),l(.061,-.103),l(.285,-.256),l(.63,-.724),l(1.184,-1.151),l(.259,-.502), +N(429.505,210.684),l(.484,.336),l(.177,.013),l(.443,-.271),l(.327,-.581),l(1.495,-.532),l(.054,.424),l(.042,.664),l(.147,.211),l(.57,-.328),l(.554,-.399),l(.931,-.811),l(.364,-.229),l(1.025,-.938),l(.086,-.706),l(-.122,-.72),l(.074,-.396),l(.193,-1.159),l(.343,-.751),l(.47,-.836),l(.41,-.454),l(.809,-.599),l(.525,-.229),l(.459,-.427),l(.139,-.523),l(.169,-.708),l(.115,-.61),l(.254,-1.342),l(.196,-2.021),l(.156,-.764),l(.094,-.551),l(.349,-.821),l(.558,-.837),l(.398,-1.203),l(.031,-.156),l(-.128,-.197),l(.16,-.058),l(.063,-.594),l(.017,-.353),l(-.096,-.452),l(.097,-.297),l(.785,-.979),l(.353,-.341),l(.529,-.3),l(.479,-.06),l(.432,.167),l(.75,.518),l(.334,.394),l(.159,.239),l(.512,.322),l(1.422,.189),l(1.934,.511),l(.591,.067),l(.176,-.157),l(.677,-1.36),l(.353,-.186),l(.383,.153),l(.559,.35),l(.271,-.016),l(.93,-.486),l(.93,-.373),l(.593,-.102),l(.862,.207),l(.399,.026),l(.256,-.058),l(.13,-.241),l(.082,-.551),l(.4,-.13),l(1.15,.361),l(.687,.264),l(.287,.167),l(.319,.026),l(.962,-.344),l(.496,-.145),l(.143,.239),l(.795,.772),l(.348,.493),l(.525,.477),l(.366,.195),l(.352,-.016),l(.258,-.242),l(.529,-.37),l(.384,.012),l(.684,.631),l(.16,-.1),l(.436,-.582),l(.258,-.157),l(.207,.083),l(1.032,.926),l(1.288,1.32),l(.063,.028),l(.159,.183),l(-.018,.424),l(-.26,1.88),l(.128,.253),l(.191,.027),l(.479,.04),l(.271,.182),l(.111,.31),l(-.191,.453),l(-1.195,1.066),l(-1.241,.996),l(-.255,.284),l(-.395,.681),l(-.217,1.02),l(-.107,.507),l(.021,.593),l(-.025,.734),l(.057,.748),l(-.076,.27),l(-.188,.298),l(-.426,.412),l(-.301,.171),l(-.269,.256),l(-.122,.425),l(-.49,1.358),l(.197,.338),l(.689,.999),l(.087,.381),l(-.04,.438),l(.014,.636),l(.237,.634),l(.017,1.329),l(-.064,.762),l(.425,1.439),l(-.102,.848),l(.122,.693),l(.486,.631),l(.936,.898),l(.428,.78),l(.689,1.804),l(-.563,.068),l(-3.015,.499),l(-.347,.214),l(-.154,.198),l(-.797,1.276),l(-.029,.622),l(.372,2.088),l(-.377,1.175),l(-.3,1.02),l(.043,.296),l(.456,.605),l(.837,.843),l(.445,.279),l(.515,.012),l(.448,-.455),l(.362,-.186),l(.136,.183),l(.032,.791),l(.028,1.427),l(-.041,.551),l(-.371,-.012),l(-1.355,-.091),l(-.348,-.21),l(-.381,-.647),l(-.561,-.731),l(-.416,-.351),l(-.477,-.252),l(-.895,-.263),l(-.38,-.28),l(-.728,-1.423),l(-.212,.354),l(-.522,.682),l(-.366,.087),l(-.325,-.111),l(-.922,-.164),l(-.925,-.249),l(-.489,-.194),l(-.58,-1.014),l(-.175,.071),l(-1.146,.289),l(-.195,-.056),l(-.172,-.352),l(-.365,-.379),l(-.678,-.096),l(-1.24,-.147),l(-.991,.146),l(-.859,.26),l(-.61,.004),l(-.199,-.197),l(-.007,-.254),l(.198,-.905),l(.003,-.466),l(-.306,-.62),l(-.844,-.998),l(-.117,-.211),l(-.021,-.212),l(.296,-1.033),l(.07,-1.06),l(-.109,-.607),l(-.303,-.605),l(.057,-.354),l(.177,-.693),l(-.052,-.183),l(-.322,-.098),l(-1.231,.093),l(-.88,.019),l(-.212,-.168),l(.055,-.48),l(-.181,-.225),l(-2.016,.082),l(-.112,.001),l(-.089,.354),l(.027,.593),l(-.286,.892),l(-.184,.411),l(-.993,.006),l(-.899,-.122),l(-1.021,.246),l(-.88,.034),l(-.292,-.168),l(-.64,-.787),l(-.597,-1.07),l(-.537,-1.409),l(-.059,-.579),l(-.121,-.521),l(-.082,-.127),l(-.321,-.111),l(-.385,-.012),l(-1.104,-.008),l(-.88,.034),l(-.624,.003),l(-1.312,-.048),l(-.945,-.052),l(-.783,.02),l(-.432,.03),l(-.318,.101),l(-.896,.062),l(-.699,.314),l(-.56,.06),l(-.112,-.013),l(-.322,-.922),l(.012,-.053),l(.74,-.3),l(-.017,-.085),l(.1,-.89),l(.094,-.143),l(.317,-.199),l(.583,-.568), +N(468.568,202.653),l(1.277,-.05),l(4.659,0),l(1.448,-.033),l(4.663,2.568),l(3.553,1.984),l(.137,.381),l(-.116,.552),l(.07,.239),l(2.427,1.752),l(1.067,.807),l(-.237,.427),l(-.419,1.329),l(-.137,1.017),l(.109,.551),l(.665,.987),l(.768,.577),l(-.024,.282),l(-.263,.354),l(-.371,1.046),l(.037,.17),l(.306,.041),l(.118,.226),l(-.172,.692),l(-.019,.946),l(.411,1.793),l(.18,.564),l(.401,.465),l(.823,.55),l(.396,.268),l(.177,.228),l(-1.157,.836),l(-.515,.342),l(-1.218,.402),l(-1.243,.559),l(-.448,.031),l(-.646,-.42),l(-.276,-.083),l(-.21,.326),l(-.543,.766),l(-.396,.144),l(-.42,-.054),l(-.964,.006),l(-.963,.02),l(-.512,-.294),l(-.323,-.394),l(-.229,-.083),l(-.123,.128),l(-.643,.356),l(-.526,.088),l(-1.019,-.149),l(-.898,-.018),l(-.196,-.559),l(-.135,-.766),l(-.053,-.584),l(-.135,-.946),l(-.448,-.841),l(-.663,-.538),l(-1.014,-.107),l(-.223,.016),l(-.385,-.407),l(-.732,-.349),l(-1.574,-.57),l(-1.269,-.6),l(-.729,-.265),l(-.263,-.21),l(-.703,-.641),l(-.689,-1.804),l(-.428,-.78),l(-.936,-.898),l(-.486,-.631),l(-.122,-.693),l(.102,-.848),l(-.425,-1.439),l(.064,-.762),l(1.252,-.348),l(.388,-.539),l(.645,-1.204),l(.687,-.853),l(.346,-.271),l(.044,-.212),l(-.148,-.239),l(-.273,-.125),l(-.401,-.068),l(-.211,-.211),l(.158,-.976),l(.304,-.016),l(.396,-.158),l(.142,-.17),l(.104,-.481),l(-.167,-.493),l(-.364,-.888),l(-.121,-.748), +N(464.786,206.235),l(-.197,-.338),l(.49,-1.358),l(.122,-.425),l(.269,-.256),l(.301,-.171),l(.426,-.412),l(.064,.042),l(.546,.223),l(.431,-.045),l(.458,-.427),l(.554,-.398),l(.319,-.017),l(.121,.748),l(.364,.888),l(.167,.493),l(-.104,.481),l(-.142,.17),l(-.396,.158),l(-.304,.016),l(-.559,.031),l(-.508,.159),l(-.391,.567),l(-.158,.085),l(-.396,.13),l(-.789,-.32),l(-.688,-.024), +N(465.79,210.652),l(-.017,-1.329),l(-.237,-.634),l(-.014,-.636),l(.04,-.438),l(-.087,-.381),l(-.689,-.999),l(.688,.024),l(.789,.32),l(.396,-.13),l(.158,-.085),l(.391,-.567),l(.508,-.159),l(.559,-.031),l(-.158,.976),l(.211,.211),l(.401,.068),l(.273,.125),l(.148,.239),l(-.044,.212),l(-.346,.271),l(-.687,.853),l(-.645,1.204),l(-.388,.539),l(-1.252,.348), +N(427.243,211.207),l(.536,-.414),l(.68,-.513),l(.351,-.13),l(.695,.533),l(-.583,.568),l(-.317,.199),l(-.094,.143),l(-.1,.89),l(.017,.085),l(-.74,.3),l(.143,-.625),l(-.082,-.24),l(-.505,-.796),M(427.998,213.843),l(.112,.013),l(.56,-.06),l(.699,-.314),l(.896,-.062),l(.318,-.101),l(.432,-.03),l(.783,-.02),l(.945,.052),l(1.312,.048),l(.624,-.003),l(.88,-.034),l(1.104,.008),l(.385,.012),l(.321,.111),l(.082,.127),l(.121,.521),l(.059,.579),l(.537,1.409),l(.597,1.07),l(.64,.787),l(.292,.168),l(.88,-.034),l(1.021,-.246),l(.899,.122),l(.993,-.006),l(.184,-.411),l(.286,-.892),l(-.027,-.593),l(.089,-.354),l(.112,-.001),l(2.016,-.082),l(.181,.225),l(-.055,.48),l(.212,.168),l(.88,-.019),l(1.231,-.093),l(.322,.098),l(.052,.183),l(-.177,.693),l(-.057,.354),l(.303,.605),l(.109,.607),l(-.07,1.06),l(-.296,1.033),l(.021,.212),l(.117,.211),l(.844,.998),l(.306,.62),l(-.003,.466),l(-.198,.905),l(.007,.254),l(.199,.197),l(.61,-.004),l(.859,-.26),l(.991,-.146),l(1.24,.147),l(-.214,1.344),l(.195,1.059),l(.269,.323),l(.089,.254),l(-.132,.368),l(-.436,.44),l(-.124,.594),l(-.125,.086),l(-.517,-.04),l(-3.408,.091),l(-.051,.877),l(.015,1.342),l(-.024,3.249),l(.017,.848),l(.023,.594),l(.099,.438),l(.308,.394),l(.471,.436),l(1.354,1.391),l(.611,.632),l(-.93,.218),l(-1.96,.379),l(-1.044,.203),l(-.717,-.08),l(-1.164,.063),l(-.408,-.083),l(-.349,-.21),l(-2.024,.026),l(-.697,-.024),l(-.622,-.151),l(-.401,-.322),l(-.305,-.366),l(-.408,-.096),l(-.989,-.023),l(-2.59,.016),l(-1.636,-.019),l(-.631,-.011),l(-1.296,-.006),l(-2.201,.013),l(-.636,-.151),l(-.463,-.309),l(-.45,-.478),l(-.294,-.083),l(-.499,.088),l(-.591,.286),l(-.778,.513),l(-.758,-.462),l(-.352,.144),l(-.248,.197),l(.048,-1.809),l(-.017,-.805),l(-.029,-.649),l(.397,-.34),l(.221,-.269),l(.26,-.707),l(.163,-.734),l(.184,-1.398),l(.239,-.976),l(.321,-.918),l(.584,-.665),l(.183,-.565),l(.268,-.354),l(.64,-.228),l(.268,-.325),l(.423,-.679),l(.364,-1.201),l(.053,-.664),l(-.046,-.848),l(-.191,-.959),l(-.201,-.536),l(-.492,-.705),l(-.476,-.776),l(-.268,-.775),l(.139,-.495),l(.476,-.382),l(.158,-.156),l(.107,-.424),l(-.006,-.479),l(-.199,-.579),l(-.489,-.69),l(-.441,-.733),l(-.203,-1.031),l(-.181,-.423),l(-.276,-.366),l(-.666,-.974),l(-.072,-.15), +N(452.198,239.34),l(-.611,-.632),l(-1.354,-1.391),l(-.471,-.436),l(-.308,-.394),l(-.099,-.438),l(-.023,-.594),l(-.017,-.848),l(.024,-3.249),l(-.015,-1.342),l(.051,-.877),l(3.408,-.091),l(.517,.04),l(.125,-.086),l(.124,-.594),l(.436,-.44),l(.132,-.368),l(-.089,-.254),l(-.269,-.323),l(-.195,-1.059),l(.214,-1.344),l(.678,.096),l(.365,.379),l(.172,.352),l(.195,.056),l(1.146,-.289),l(.175,-.071),l(.58,1.014),l(.489,.194),l(.925,.249),l(.922,.164),l(.325,.111),l(.366,-.087),l(.522,-.682),l(.212,-.354),l(.728,1.423),l(.38,.28),l(.895,.263),l(.477,.252),l(.416,.351),l(.561,.731),l(.381,.647),l(.348,.21),l(1.355,.091),l(.371,.012),l(.041,-.551),l(-.028,-1.427),l(-.032,-.791),l(-.136,-.183),l(-.362,.186),l(-.448,.455),l(-.515,-.012),l(-.445,-.279),l(-.837,-.843),l(-.456,-.605),l(-.043,-.296),l(.3,-1.02),l(.377,-1.175),l(-.372,-2.088),l(.029,-.622),l(.797,-1.276),l(.154,-.198),l(.347,-.214),l(3.015,-.499),l(.563,-.068),l(.703,.641),l(.263,.21),l(.729,.265),l(1.269,.6),l(1.574,.57),l(.732,.349),l(.385,.407),l(.559,.887),l(.434,.859),l(.013,.324),l(-.183,.27),l(-.709,.344),l(-.011,.127),l(.04,.594),l(-.091,1.682),l(.08,.353),l(.216,.168),l(.511,.266),l(.072,.197),l(-.197,.241),l(-.472,.258),l(-.792,.259),l(-.146,.34),l(-.094,.764),l(-.3,.807),l(.2,.479),l(.261,.408),l(.394,.125),l(-1.264,.53),l(-1.696,.575),l(-.932,.4),l(-2.165,.578),l(-.187,.128),l(-.009,.495),l(.152,.465),l(.087,.438),l(-.505,-.096),l(-.999,.049),l(-.794,.259),l(-.636,.54),l(-.312,.539),l(-.019,.579),l(-.168,.199),l(-.285,.114),l(-.999,.062),l(-.621,.202),l(-.306,.341),l(-.777,.937),l(-.562,.738),l(-.825,.951),l(-.354,.045),l(-.803,-.165),l(-.421,-.309),l(-.334,.129),l(-.521,.286),l(-.404,.017),l(-.594,-.209),l(-.264,-.097),l(-.154,-.169),l(-.163,-.027),l(-.187,-.154),l(-.456,-.393),l(-.294,-.055),l(-1.089,-.093),l(-.086,-.099),l(-.165,-.056),l(-1.845,.364), +N(477.231,225.874),l(-.224,1.184),l(-.107,.48),l(.252,.917),l(.177,1.017),l(.149,.408),l(.238,.268),l(.803,.588),l(1.189,1.166),l(.454,.661),l(.14,.48),l(-.155,2.346),l(-.04,.41),l(-.214,.213),l(-.432,.073),l(-.322,.017),l(-.229,.213),l(-.076,.622),l(.08,.509),l(.029,.479),l(-.096,.283),l(-.185,-.111),l(-.562,-.463),l(-.763,-1.112),l(-.484,-.548),l(-.234,-.423),l(.036,-.212),l(.499,-.61),l(.116,-.227),l(.025,-.693),l(-.1,-.96),l(-.22,-.479),l(-.261,-.056),l(-.674,.061),l(-.702,.132),l(-.27,-.211),l(-.343,-.407),l(-.382,-.549),l(-.195,-.041),l(-.394,-.125),l(-.261,-.408),l(-.2,-.479),l(.3,-.807),l(.094,-.764),l(.146,-.34),l(.792,-.259),l(.472,-.258),l(.197,-.241),l(-.072,-.197),l(-.511,-.266),l(-.216,-.168),l(-.08,-.353),l(.091,-1.682),l(-.04,-.594),l(.011,-.127),l(.709,-.344),l(.183,-.27),l(-.013,-.324),l(-.434,-.859),l(-.559,-.887),l(.223,-.016),l(1.014,.107),l(.663,.538),l(.448,.841),l(.135,.946),l(.053,.584),l(.135,.766),l(.196,.559), +N(245.934,224.314),l(.939,.136),l(1.122,.304),l(.355,-.03),l(.946,-.824),l(.336,.026),l(.48,.025),l(.415,-.243),l(1.471,-1.109),l(.874,-.485),l(.36,-.158),l(.934,-.076),l(1.283,.021),l(.045,.748),l(-.079,.621),l(-.064,.622),l(.036,.818),l(.141,.635),l(.335,.591),l(.813,.928),l(1.1,.939),l(.316,.097),l(.787,.023),l(.355,-.03),l(.676,.25),l(.688,.307),l(.75,.603),l(.3,.098),l(.882,.037),l(.096,.014),l(.385,.774),l(.398,.308),l(.22,.084),l(1.148,-.077),l(.636,.123),l(.537,.166),l(.403,.237),l(.085,.169),l(-.038,.565),l(.203,1.029),l(.03,.706),l(.138,2.032),l(.249,.944),l(.153,.112),l(.967,.036),l(.5,.012),l(1.615,.019),l(.693,.024),l(.042,.296),l(-.261,.835),l(.067,.563),l(.436,.407),l(.73,.362),l(.316,.479),l(.307,.774),l(.022,.494),l(-.185,1.173),l(-.238,.834),l(-.38,.765),l(-.421,.666),l(-.089,-.084),l(-1.952,-.991),l(-.352,-.054),l(-.928,.02),l(-.843,-.01),l(-.126,.128),l(-1.076,.204),l(-1.104,.162),l(-.784,.202),l(-.33,.044),l(-.332,.383),l(-.698,1.105),l(-.278,.341),l(-.133,.509),l(.016,.635),l(-.385,1.188),l(-.395,1.104),l(-.149,.325),l(-.592,-.109),l(-1.33,-.077),l(-.686,.004),l(-1.034,1.784),l(-.416,-1.084),l(-.341,-.309),l(-.37,-.195),l(-.531,-.067),l(-.527,.045),l(-.901,.034),l(-.615,-.194),l(-.193,-.169),l(-.322,-.181),l(-.292,.27),l(-2.026,2.087),l(-1.047,.006),l(-.272,-.182),l(-.397,-2.144),l(-.278,-.973),l(-.212,-.563),l(-.769,-1.11),l(-.249,-.676),l(.04,-.354),l(.437,-1.555),l(-.017,-.282),l(-.761,-.744),l(-.25,-.521),l(-.193,-1.213),l(-.304,-.647),l(-.555,-.745),l(-.152,-.253),l(-.018,-.142),l(-.132,-.295),l(-.049,-.48),l(.12,-.227),l(.723,-.61),l(.285,-.439),l(-.015,-.522),l(-.604,-1.168),l(-.022,-.48),l(.159,-.34),l(.21,-.368),l(-.347,-.845),l(.102,-.452),l(.532,-.582),l(.221,-.34),l(.156,-.34),l(-.236,-.902),l(-.057,-.522),l(.143,-.848),l(.15,-.523),l(.437,-.736),l(-.08,-.24),l(-.922,-1.646),l(-1.109,-1.843), +N(473.575,260.04),l(-1.331,.011),l(-.192,.058),l(-.068,-.382),l(-.261,-.889),l(.071,-.495),l(-.075,-.296),l(-.095,-.324),l(.03,-.806),l(.057,-1.301),l(-.072,-.763),l(-.147,-.678),l(-.33,-.944),l(-.441,-.689),l(-.181,-.946),l(-.295,-1.199),l(-.159,-.183),l(.448,-.384),l(.396,-.412),l(1.68,-1.706),l(.114,-.227),l(-.09,-.367),l(.075,-.834),l(.229,-.481),l(.736,-.683),l(.205,-.341),l(.168,-.41),l(-.594,-.845),l(-.118,-.805),l(-.113,-.494),l(.128,-.283),l(.448,-.596),l(.201,-.411),l(-.132,-.805),l(-.086,-1.144),l(-.031,-.791),l(-.178,-.818),l(-.441,-.379),l(-.515,-.224),l(-1.167,-.347),l(-1.042,-.445),l(-.658,-.223),l(-1.438,-.006),l(-.137,-.14),l(-.025,-.495),l(-.011,-.212),l(-.087,-.438),l(-.152,-.465),l(.009,-.495),l(.187,-.128),l(2.165,-.578),l(.932,-.4),l(1.696,-.575),l(1.264,-.53),l(.195,.041),l(.382,.549),l(.343,.407),l(.27,.211),l(.702,-.132),l(.674,-.061),l(.261,.056),l(.22,.479),l(.1,.96),l(-.025,.693),l(-.116,.227),l(-.499,.61),l(-.036,.212),l(.234,.423),l(.484,.548),l(.763,1.112),l(.562,.463),l(.185,.111),l(.096,-.283),l(-.029,-.479),l(-.08,-.509),l(.076,-.622),l(.229,-.213),l(.322,-.017),l(.432,-.073),l(.214,-.213),l(.04,-.41),l(.155,-2.346),l(-.14,-.48),l(-.454,-.661),l(-1.189,-1.166),l(-.803,-.588),l(-.238,-.268),l(-.149,-.408),l(-.177,-1.017),l(-.252,-.917),l(.107,-.48),l(.224,-1.184),l(.898,.018),l(1.019,.149),l(.526,-.088),l(.643,-.356),l(.123,-.128),l(.229,.083),l(.323,.394),l(.512,.294),l(.963,-.02),l(.964,-.006),l(.42,.054),l(.396,-.144),l(.543,-.766),l(.21,-.326),l(.276,.083),l(.646,.42),l(.448,-.031),l(1.243,-.559),l(1.218,-.402),l(.515,-.342),l(1.157,-.836),l(.128,.167),l(.212,.479),l(-.185,.579),l(-.302,.453),l(-.198,.255),l(.181,.451),l(.129,.72),l(-.012,.466),l(.182,1.115),l(-.101,.58),l(-.258,.325),l(.374,.705),l(.154,.494),l(-.006,1.115),l(-.004,.819),l(.043,.184),l(.185,.127),l(.327,.084),l(.015,.269),l(-.165,.494),l(-.563,.58),l(.184,.381),l(-.08,.283),l(-.418,.565),l(-.802,.906),l(-.512,.622),l(-.72,.651),l(-1.36,.751),l(-1.48,.653),l(-.73,.228),l(-1.308,.582),l(-.852,.637),l(-1.286,1.443),l(-.886,.85),l(-1.193,.878),l(-1.181,.836),l(-.268,.128),l(-.035,.96),l(-.083,.495),l(.058,.127),l(.719,.535),l(.188,.381),l(-.166,.452),l(-.085,.184),l(.461,1.511),l(.071,.564),l(.06,.155),l(.246,.014),l(.171,-.128),l(.141,-.085),l(.043,.607),l(-.234,2.218),l(-.284,.82),l(.325,.196),l(.152,.057),l(-.025,.325),l(-.157,.311),l(-.516,.566),l(-.699,.538),l(-.664,.34),l(-1.266,.412),l(-.796,.312),l(-.688,.228),l(-.895,.524),l(-.652,.665),l(-.337,.51),l(.292,.338),l(.589,.338),l(.045,.325),l(-.149,1.022), +N(499.85,236.166),l(.544,-.071),l(.622,-.369),l(.18,.028),l(.346,.098),l(.269,-.085),l(.396,-.368),l(.911,-.143),l(.311,.281),l(.305,-.028),l(.101,-.185),l(-.171,-.366),l(.771,-.539),l(.423,-.198),l(.322,.226),l(.389,-.213),l(-.308,-.494),l(.207,-.282),l(.505,-.425),l(.229,.296),l(.229,.056),l(.558,-.594),l(-.158,-.197),l(-.253,-.409),l(.094,-.297),l(.243,.014),l(.27,-.071),l(.172,-.34),l(-.297,-.875),l(.06,-.339),l(.255,-.043),l(.117,.07),l(.253,.438),l(.28,.099),l(.2,-.41),l(.692,-.524),l(.235,-.367),l(.134,-.452),l(.168,-.692),l(-.133,-.354),l(.003,-.226),l(.537,-.468),l(.356,.324),l(.455,.648),l(.612,.281),l(.141,.198),l(.213,.847),l(.294,1.821),l(.093,.663),l(.231,.791),l(.391,.733),l(.163,.466),l(-.038,.367),l(-.069,.155),l(-.058,.099),l(-.537,.807),l(-.22,-.127),l(-.189,-.366),l(-.555,-.748),l(-.297,.143),l(-.05,.424),l(.193,.875),l(.396,.521),l(.079,.396),l(-.307,.636),l(-.746,1.005),l(-.045,.452),l(.041,.89),l(-.18,.946),l(-.709,2.12),l(-.825,2.572),l(-1.254,3.788),l(-1.324,4.48),l(-.518,1.568),l(-.188,.255),l(-.508,.637),l(-.2,.113),l(-1.369,.102),l(-.999,.327),l(-.474,.468),l(-.813,.086),l(-.363,-.465),l(-.196,-.142),l(-.546,-.182),l(-.37,.071),l(-.269,-.057),l(-.863,-.718),l(-.104,-.24),l(-.02,-.565),l(-.104,-.239),l(-.46,-.366),l(-.124,-.282),l(.001,-.721),l(.345,-1.088),l(-.094,-.325),l(-.287,-.479),l(-.62,-.931),l(-.189,-.494),l(.075,-.664),l(.391,-1.37),l(.228,-.213),l(.474,-.185),l(.768,-1.371),l(.686,-1.174),l(.104,-.325),l(.151,-1.103),l(-.11,-.353),l(-.278,-.226),l(-.354,-.366),l(.066,-.184),l(.252,-.509),l(-.521,-.861),l(-.117,-.677),l(-.069,-.494),l(-.231,-.721),l(.024,-.112),l(.517,-.693),l(.362,-.594),l(.163,-.438),l(.007,-1.073),l(.484,-.016), +N(468.138,234.908),l(.011,.212),l(.025,.495),l(.137,.14),l(1.438,.006),l(.658,.223),l(1.042,.445),l(1.167,.347),l(.515,.224),l(.441,.379),l(.178,.818),l(.031,.791),l(.086,1.144),l(.132,.805),l(-.201,.411),l(-.448,.596),l(-.128,.283),l(.113,.494),l(.118,.805),l(.594,.845),l(-.168,.41),l(-.205,.341),l(-.736,.683),l(-.229,.481),l(-.075,.834),l(.09,.367),l(-.114,.227),l(-1.68,1.706),l(-.396,.412),l(-.448,.384),l(-.342,-.225),l(-.547,-.124),l(-.442,-.025),l(-.529,.145),l(-.31,.016),l(-.99,-.403),l(-.597,-.139),l(-.72,-.023),l(-.067,-.042),l(-.186,-.098),l(-.306,-.451),l(-.479,-.35),l(-.549,-.167),l(-.938,-.136),l(-.352,-.153),l(-.524,-.873),l(-.163,-.564),l(.032,-.565),l(-.127,-.239),l(-.78,.019),l(-.201,-.098),l(-.109,-.211),l(.051,-.537),l(-.106,-.169),l(-.552,-.266),l(-.533,-.223),l(-.57,-.321),l(-.563,-.491),l(-.377,-.662),l(-.246,-.96),l(-.469,-.604),l(-.43,-.478),l(-.267,-.451),l(.103,-.227),l(.594,.209),l(.404,-.017),l(.521,-.286),l(.334,-.129),l(.421,.309),l(.803,.165),l(.354,-.045),l(.825,-.951),l(.562,-.738),l(.777,-.937),l(.306,-.341),l(.621,-.202),l(.999,-.062),l(.285,-.114),l(.168,-.199),l(.019,-.579),l(.312,-.539),l(.636,-.54),l(.794,-.259),l(.999,-.049),l(.505,.096), +N(444.673,255.519),l(-.006,3.434),l(.031,1.894),l(.025,2.246),l(-.057,.205),l(-.454,.318),l(-.545,.302),l(-.581,.498),l(-.427,.034),l(-.581,-.166),l(-.745,-.042),l(-.892,.048),l(-.517,-.039),l(-.296,-.212),l(-.055,-.528),l(-.042,-.345),l(-.193,-.222),l(-.637,-.348),l(-.329,-.127),l(-.335,.116),l(-.109,.217),l(-.317,.416),l(-.584,.27),l(-.152,.068),l(-.458,-.491),l(-1.041,-1.001),l(-.458,-.606),l(-.359,-1.03),l(-.345,-.72),l(-.136,-.493),l(.12,-.269),l(.053,-.34),l(-.458,-.719),l(-.231,-.861),l(.148,-.861),l(-.002,-.48),l(-.537,-1.326),l(-.496,-2.244),l(.772,-.02),l(.04,-.678),l(-.077,-.749),l(-.456,-.006),l(.016,-.06),l(-.099,-.522),l(-.26,-.508),l(-1.018,-1.283),l(-.343,-.55),l(-1.102,-2.158),l(-.841,-1.623),l(-.9,-1.509),l(-.988,-1.269),l(-.511,-1.044),l(-.122,-.396),l(-.045,-.551),l(.015,-.578),l(.248,-.197),l(.352,-.144),l(.758,.462),l(.778,-.513),l(.591,-.286),l(.499,-.088),l(.294,.083),l(.45,.478),l(.463,.309),l(.636,.151),l(2.201,-.013),l(1.296,.006),l(.631,.011),l(1.636,.019),l(2.59,-.016),l(.989,.023),l(.408,.096),l(.305,.366),l(.401,.322),l(.622,.151),l(.697,.024),l(2.024,-.026),l(.349,.21),l(.408,.083),l(1.164,-.063),l(.717,.08),l(1.044,-.203),l(1.96,-.379),l(.93,-.218),l(1.845,-.364),l(.165,.056),l(.086,.099),l(1.089,.093),l(.294,.055),l(.456,.393),l(-.811,.315),l(-.891,.02),l(-.284,.143),l(-.993,.938),l(-.209,.029),l(-.62,-.773),l(-1.048,.134),l(-2.962,.47),l(-1.183,.021),l(.005,1.215),l(-.007,1.286),l(-.025,.876),l(-.043,1.201),l(.002,3.561),l(-.586,.046),l(-1.564,.052),l(-.146,.028),l(-.106,2.657),l(-.009,1.201),l(.013,1.624),l(.007,.806), +N(248.453,316.576),l(-.306,.101),l(-.892,-.087),l(-.538,-.293),l(-.236,-.015),l(-.311,.163),l(-.418,.398),l(-.498,.192),l(-1.156,.091),l(-.349,.09),l(-.358,.207),l(-.267,.621),l(-.114,.341),l(.06,.532),l(-.163,.622),l(-.104,.148),l(-.453,.031),l(-.534,.104),l(-.956,-.413),l(.667,-.639),l(.326,-.444),l(.582,-.4),l(.025,-.147),l(-.372,-.177),l(-.273,-.117),l(-1.353,.534),l(-1.01,-.013),l(-.545,.163),l(-.202,-.339),l(.128,-.192),l(.959,-.268),l(.266,.028),l(.792,-.208),l(.441,-.118),l(-.605,-.162),l(-.582,.002),l(-.77,.001),l(-.014,-.413),l(.265,-.31),l(-.007,-.191),l(-.446,-.073),l(-.356,-.44),l(-.66,.384),l(-.669,-.175),l(.292,-.53),l(.041,-.177),l(-.378,.045),l(-.361,.147),l(-.416,-.396),l(-.215,-.117),l(.413,-.279),l(.114,-.177),l(-.091,-.278),l(-.053,-.073),l(-.351,.03),l(-.773,-.424),l(-.135,-.059),l(.844,-.192),l(.253,-.161),l(.1,-.294),l(.396,-.366),l(.049,-.234),l(-.641,.06),l(-.257,.104),l(-.312,-.073),l(-.256,-.672),l(.573,-.395),l(-.565,-.378),l(-.12,-.421),l(.757,-.452),l(-.14,-.421),l(-.686,.422),l(-.091,-1.523),l(.399,-.596),l(-.185,-.825),l(.013,-.218),l(.593,.014),l(.41,.245),l(.711,.071),l(.171,-.246),l(.002,-.159),l(-.896,-.447),l(-.867,.146),l(-.317,-.173),l(-.536,.059),l(-.017,-.231),l(.339,-.333),l(.025,-.246),l(-.067,-.087),l(.186,-.202),l(.536,.014),l(.229,-.377),l(.01,-.216),l(-.722,-.389),l(-.354,-.129),l(-.886,.045),l(-.332,-.101),l(-.024,-.49),l(-.939,.16),l(-.115,-.101),l(.122,-.145),l(1.032,-.521),l(.251,-.116),l(.4,-.404),l(.266,-.389),l(.833,-.06),l(.268,.201),l(.059,.346),l(-.648,.202),l(-.323,.274),l(.11,.505),l(.117,.058),l(.191,-.102),l(.268,-.39),l(.183,-.087),l(.242,.101),l(-.037,.317),l(.057,.504),l(.886,-.996),l(.161,-.678),l(.056,-.647),l(.237,-.375),l(.079,-.058),l(.631,-.217),l(-.201,-.071),l(-.438,-.143),l(-.056,-.158),l(.101,-.273),l(.246,-.072),l(.571,-.245),l(.599,-.431),l(.271,-.459),l(-.061,-.229),l(-.394,-.157),l(-.662,-.399),l(-.053,-.372),l(.139,-.243),l(.105,-.458),l(-.06,-.828),l(.366,-.33),l(.676,-.272),l(-.431,-.585),l(-.053,-.784),l(.133,-.158),l(.554,-.157),l(.054,-.314),l(-.116,-.285),l(-.317,-.085),l(-.272,-.198),l(.233,-.329),l(.087,-.313),l(-.401,-.185),l(-.274,-.014),l(-.161,.101),l(-.476,.414),l(-.548,.058),l(-.087,.001),l(-.289,-.199),l(-.16,-.484),l(-.399,-.726),l(-.133,-.697),l(.188,-.911),l(.137,-.413),l(.722,-.739),l(.535,-.767),l(-.006,-.326),l(-.544,-1.757),l(.001,-.608),l(.088,-.567),l(-.076,-.438),l(-.528,-.891),l(-.04,-.298),l(.236,-.198),l(.499,.098),l(.182,-.085),l(.2,-.142),l(.097,-.143),l(.41,-1.288),l(.252,-.481),l(.304,-.935),l(.18,-.65),l(.664,-.808),l(.363,-.722),l(.201,-.636),l(.252,-.946),l(.311,-.691),l(.187,-.128),l(.273,-.382),l(.013,-.296),l(-.312,-.847),l(.082,-.184),l(.455,-.452),l(.206,-.339),l(.028,-.24),l(-.093,-.226),l(-.166,-.805),l(-.292,-2.088),l(-.098,-.86),l(.031,-.565),l(.412,-.565),l(.37,-.537),l(.207,-.564),l(.007,-.734),l(-.339,-.521),l(-.098,-.409),l(.295,-.96),l(.218,-.941),l(.127,-.556),l(.461,-.594),l(.171,-.918),l(.243,-.975),l(.126,-.805),l(.082,-.565),l(-.063,-1.087),l(.422,-.664),l(.211,-.494),l(-.221,-.932),l(-.048,-.833),l(.148,-.24),l(-.022,-.917),l(.229,-.607),l(-.124,-.297),l(-.365,-.084),l(.06,-.324),l(-.046,-.396),l(.223,-.198),l(.402,-.198),l(.137,-.424),l(-.008,-.819),l(.093,-.593),l(.182,-.918),l(-.004,-2.344),l(-.172,-2.074),l(-.042,-1.539),l(-.194,-.974),l(-.15,-.387),l(.852,-.275),l(.259,-.298),l(.228,-.933),l(.15,-.199),l(.586,-.187),l(.152,.253),l(.555,.745),l(.304,.647),l(.193,1.213),l(.25,.521),l(.761,.744),l(.017,.282),l(-.437,1.555),l(-.04,.354),l(.249,.676),l(.769,1.11),l(.212,.563),l(.278,.973),l(.397,2.144),l(.272,.182),l(1.047,-.006),l(.107,.056),l(.212,.14),l(.161,.154),l(-.093,.636),l(-.541,1.457),l(-.36,.256),l(-1.346,.53),l(-.819,.372),l(-.204,.312),l(.25,.817),l(-.421,.722),l(-.007,.579),l(.113,.437),l(.34,.449),l(.03,.226),l(-.273,.369),l(-.161,.382),l(.114,.507),l(.53,.477),l(.011,.227),l(-.152,.311),l(-.333,.017),l(-.791,.089),l(-.329,.835),l(-.464,.835),l(-.608,.694),l(-.282,.439),l(-.823,1.839),l(.167,1.466),l(.054,.762),l(-.124,.185),l(-.492,.271),l(-.292,.34),l(-.388,1.201),l(-.156,.961),l(.285,.633),l(.408,1.154),l(.784,2.816),l(.055,.69),l(-.075,.41),l(-1.083,1.854),l(-.319,.595),l(.088,.409),l(.189,1.06),l(-.078,.325),l(-1.334,1.11),l(-.231,.312),l(-.142,1.075),l(.014,1.16),l(.249,1.103),l(.437,.932),l(-.202,.143),l(-.951,.529),l(-.126,.17),l(-.053,.312),l(-.511,2.427),l(-.316,.541),l(-.1,.37),l(.123,1.835),l(.231,.867),l(.012,.427),l(-.596,.317),l(-.172,.172),l(-.106,.271),l(.094,1.226),l(.125,.128),l(.555,.111),l(.088,.655),l(-.191,1.458),l(.252,.585),l(.26,.185),l(.789,.11),l(.302,.17),l(-.007,.186),l(-.245,.202),l(-.322,.13),l(-.726,.033),l(-.757,.146),l(.176,.171),l(.586,.298),l(.552,.385),l(.017,.216),l(-.767,.794),l(-.059,1.094),l(.158,1.035),l(-.216,.896),l(-.212,.434),l(-.226,.262),l(-.598,.161),l(-.28,.219),l(-.249,.781),l(.446,.648),l(-.069,.188),l(-.296,1.218),l(-.307,.263),l(-1.729,1.01),l(-.271,.292),l(-.037,.45),l(.28,1.309),l(.508,1.123),l(.218,.043),l(.961,-.283),l(.654,-.121),l(.187,.248),l(.231,2.285),l(.778,.568),l(.669,.041),l(1.41,-.052),l(2.827,.132),l(.841,.217),l(1.385,.36),l(.286,.039),M(236.642,296.773),l(-.394,-.113),l(-.43,-.028),l(-.21,-.171),l(-.133,-.229),l(.21,-.457),l(.15,-.657),l(-.087,-.514),l(.011,-.414),l(.364,-.728),l(.817,-.116),l(.36,.327),l(.044,.328),l(-.688,.443),l(-.146,.229),l(.493,.771),l(-.194,1.058),l(-.167,.271),M(238.177,317.937),l(-.445,-.177),l(.083,-.842),l(-.849,.075),l(-.073,-.368),l(.218,-.354),l(.823,.102),l(.508,-.207),l(.205,.103),l(.054,.812),l(-.267,.34),l(-.257,.518),M(247.801,322.062),l(-1.033,.102),l(-.467,-.118),l(-.55,-.237),l(-.42,.001),l(-.481,.104),l(-.935,.226),l(-.496,.03),l(.125,-.343),l(.202,-.312),l(-.104,-.312),l(.906,-.15),l(1.434,.058),l(.433,.323),l(.706,-.007),l(-.622,-.689),l(-.307,-.163),l(-.56,-.117),l(-.178,-.089),l(-.188,.03),l(-.338,-.341),l(-.229,-.4),l(1.611,-.581),l(-.044,-.296),l(-.165,-.147),l(-1.819,.285),l(-.292,-.222),l(.263,-.474),l(.146,-.163),l(1.074,-.52),l(.868,-.637),l(.414,.28),l(1.153,.062),l(-.008,1.144),l(-.098,3.675), +N(456.133,239.67),l(.187,.154),l(.163,.027),l(.154,.169),l(.264,.097),l(-.103,.227),l(.267,.451),l(.43,.478),l(.469,.604),l(.246,.96),l(.377,.662),l(.563,.491),l(.57,.321),l(.533,.223),l(.552,.266),l(.106,.169),l(-.051,.537),l(.109,.211),l(.201,.098),l(.78,-.019),l(.127,.239),l(-.032,.565),l(.163,.564),l(.524,.873),l(.352,.153),l(.938,.136),l(.549,.167),l(.479,.35),l(.306,.451),l(.186,.098),l(-.317,.411),l(-.388,.327),l(-.507,.243),l(-.747,.075),l(-.304,.115),l(-.7,.823),l(-.586,.583),l(-.362,.229),l(-.747,.357),l(-.388,.355),l(-.107,.636),l(-.222,.666),l(-.247,.241),l(-.634,.357),l(-.98,.33),l(-.249,.214),l(-.217,.708),l(-.345,.963),l(-.288,.354),l(-.237,.129),l(-.584,.116),l(-.43,-.026),l(-.473,.06),l(-.511,-.011),l(-.819,-.193),l(-.744,-.32),l(-.979,-.645),l(-.545,-.039),l(-.333,.186),l(-.084,.24),l(-.585,1.134),l(-.382,.469),l(-.651,.625),l(-.632,.428),l(-.8,.372),l(-.823,.033),l(-.854,.047),l(-.368,-.097),l(-.11,-.183),l(.003,-.48),l(.243,-.609),l(.166,-.538),l(-.21,-.762),l(-.547,-.943),l(-.716,-.787),l(-.528,-.067),l(-.007,-.806),l(-.013,-1.624),l(.009,-1.201),l(.106,-2.657),l(.146,-.028),l(1.564,-.052),l(.586,-.046),l(-.002,-3.561),l(.043,-1.201),l(.025,-.876),l(.007,-1.286),l(-.005,-1.215),l(1.183,-.021),l(2.962,-.47),l(1.048,-.134),l(.62,.773),l(.209,-.029),l(.993,-.938),l(.284,-.143),l(.891,-.02),l(.811,-.315), +N(279.288,257.295),l(.02,.239),l(-.544,1.57),l(-.375,.468),l(-1.007,.74),l(-.301,.27),l(-.352,.51),l(-.609,-.363),l(-.35,-.097),l(-.235,.029),l(-.387,.172),l(-.745,.131),l(-.71,.005),l(-.564,-.096),l(-.992,-.333),l(-.607,-.025),l(-1.187,.332),l(-.19,-.056),l(.064,-.212),l(.425,-.426),l(.486,-.398),l(.11,-.198),l(-.21,-.619),l(.048,-.227),l(.625,-.851),l(.617,-1.203),l(.018,-.268),l(-.939,-.503),l(-.65,-.18),l(-1.448,-.697),l(-1.632,-1.106),l(-.671,-.307),l(-1.173,-.204),l(-.498,-.237),l(-.835,-.588),l(-.576,-.562),l(-1.271,-1.376),l(-.782,-.913),l(-.225,-.337),l(-.19,-.056),l(.149,-.325),l(.395,-1.104),l(.385,-1.188),l(-.016,-.635),l(.133,-.509),l(.278,-.341),l(.698,-1.105),l(.332,-.383),l(.33,-.044),l(.784,-.202),l(1.104,-.162),l(1.076,-.204),l(.126,-.128),l(.843,.01),l(.928,-.02),l(.352,.054),l(1.952,.991),l(.089,.084),l(.253,.408),l(.084,.663),l(.521,.872),l(.104,.959),l(-.132,.862),l(-.086,.721),l(-.006,.72),l(.372,.04),l(.818,.15),l(.925,.221),l(.346,-.03),l(.709,-.413),l(.115,-.001),l(.724,.278),l(.843,.404),l(.121,.437),l(.487,2.524),l(.254,.563),l(.224,.055),l(1.29,-.445),l(.234,.112),l(.491,.336),l(.019,.141),l(-.321,.75),l(-.298,.835),l(-.222,.819),l(-.027,.777),l(.063,.423), +N(444.673,255.519),l(.528,.067),l(.716,.787),l(.547,.943),l(.21,.762),l(-.166,.538),l(-.243,.609),l(-.003,.48),l(.11,.183),l(.368,.097),l(.854,-.047),l(.823,-.033),l(.8,-.372),l(.632,-.428),l(.651,-.625),l(.382,-.469),l(.585,-1.134),l(.084,-.24),l(.333,-.186),l(.545,.039),l(.979,.645),l(.744,.32),l(.819,.193),l(.511,.011),l(.473,-.06),l(.43,.026),l(.584,-.116),l(.237,-.129),l(.288,-.354),l(.345,-.963),l(.217,-.708),l(.249,-.214),l(.98,-.33),l(.634,-.357),l(.247,-.241),l(.222,-.666),l(.107,-.636),l(.388,-.355),l(.747,-.357),l(.362,-.229),l(.586,-.583),l(.7,-.823),l(.304,-.115),l(.747,-.075),l(.507,-.243),l(.388,-.327),l(.317,-.411),l(.067,.042),l(.72,.023),l(.597,.139),l(.99,.403),l(.31,-.016),l(.529,-.145),l(.442,.025),l(.547,.124),l(.342,.225),l(.159,.183),l(.295,1.199),l(.181,.946),l(.441,.689),l(.33,.944),l(.147,.678),l(.072,.763),l(-.057,1.301),l(-.03,.806),l(.095,.324),l(-1.449,-.585),l(-.279,.199),l(-.657,.979),l(-.28,.567),l(-.005,.325),l(.39,.676),l(.307,.465),l(.458,.322),l(.671,.109),l(.595,-.004),l(.076,-.594),l(.064,-.198),l(.312,-.186),l(.131,-.015),l(.192,-.058),l(1.331,-.011),l(-.182,1.195),l(-.352,.849),l(-.182,.184),l(-.404,.1),l(-.093,.24),l(.199,.536),l(-.104,.467),l(-.248,.354),l(-.569,.453),l(-.923,.581),l(-.591,.75),l(-1.383,1.98),l(-.631,.834),l(-1.242,1.373),l(-1.193,1.062),l(-.829,.863),l(-1.434,1.034),l(-1.379,1.091),l(-.552,.382),l(-.989,.638),l(-.676,.298),l(-.782,.101),l(-.98,-.012),l(-.549,.071),l(-.132,.354),l(.013,.127),l(-.109,.085),l(-.449,-.098),l(-.553,-.126),l(-.303,.015),l(-.25,.198),l(-.272,.312),l(-.226,.113),l(-.36,-.056),l(-.768,-.408),l(-.759,-.168),l(-.542,-.013),l(-.31,.113),l(-.38,.27),l(-.482,-.099),l(-.645,-.21),l(-.295,.1),l(-.638,.043),l(-.589,.214),l(-.729,.538),l(-.72,.086),l(-.44,-.013),l(-.667,-.084),l(-.738,.072),l(-.575,.199),l(-.827,.82),l(-1.251,-.576),l(-.092,-.509),l(-.218,-.183),l(-.479,-.056),l(-.28,.085),l(-.257,-.479),l(-.343,-.056),l(-.149,.255),l(-.035,.197),l(-.312,-.112),l(-.119,-.226),l(.267,-.495),l(.103,-.424),l(-.857,-1.354),l(-.323,-.282),l(-.134,-.226),l(.173,-.17),l(.636,-.044),l(.172,-.424),l(.06,-.819),l(-.163,-.663),l(-.186,-.522),l(-.61,-1.143),l(-.75,-1.029),l(-.472,-.903),l(-.612,-1.383),l(-.646,-1.467),l(-.573,-.818),l(-.436,-.467),l(.152,-.068),l(.584,-.27),l(.317,-.416),l(.109,-.217),l(.335,-.116),l(.329,.127),l(.637,.348),l(.193,.222),l(.042,.345),l(.055,.528),l(.296,.212),l(.517,.039),l(.892,-.048),l(.745,.042),l(.581,.166),l(.427,-.034),l(.581,-.498),l(.545,-.302),l(.454,-.318),l(.057,-.205),l(-.025,-2.246),l(-.031,-1.894),l(.006,-3.434),M(462.462,268.501),l(.412,-.044),l(.194,-.553),l(.633,-.343),l(1.035,-.303),l(.263,-.199),l(.582,-1.007),l(.268,-.326),l(.143,-.241),l(-.104,-.226),l(-.967,-.744),l(-.33,-.337),l(-.422,-.266),l(-.308,.086),l(-.995,.359),l(-.65,.329),l(-.513,.567),l(-.275,.44),l(-.691,.611),l(.12,.409),l(.582,.858),l(.285,.366),l(.739,.561),M(432.955,250.661),l(.456,.006),l(.077,.749),l(-.04,.678),l(-.772,.02),l(-.078,-.354),l(-.028,-.396),l(.285,-.297),l(.101,-.406), +N(471.719,258.047),l(.075,.296),l(-.071,.495),l(.261,.889),l(.068,.382),l(-.131,.015),l(-.312,.186),l(-.064,.198),l(-.076,.594),l(-.595,.004),l(-.671,-.109),l(-.458,-.322),l(-.307,-.465),l(-.39,-.676),l(.005,-.325),l(.28,-.567),l(.657,-.979),l(.279,-.199),l(1.449,.585), +N(462.462,268.501),l(-.739,-.561),l(-.285,-.366),l(-.582,-.858),l(-.12,-.409),l(.691,-.611),l(.275,-.44),l(.513,-.567),l(.65,-.329),l(.995,-.359),l(.308,-.086),l(.422,.266),l(.33,.337),l(.967,.744),l(.104,.226),l(-.143,.241),l(-.268,.326),l(-.582,1.007),l(-.263,.199),l(-1.035,.303),l(-.633,.343),l(-.194,.553),l(-.412,.044), +N(790.15,283.022),l(.738,.197),l(.008,-.227),l(-.242,-.524),l(.052,-.284),l(.233,.014),l(.389,.17),l(.37,.751),l(.277,.964),l(.48,.17),l(1.753,.691),l(.506,.113),l(.37,-.072),l(.699,-.483),l(.885,-.343),l(.4,.027),l(.329,.17),l(.066,.454),l(-.022,.198),l(-.402,1.236),l(-.283,.072),l(-.761,.058),l(-.035,.683),l(-.124,.156),l(-.424,.029),l(-.746,.016),l(-.432,.2),l(-.271,.284),l(.041,.384),l(.254,.525),l(-.002,.213),l(-.151,.199),l(-.646,.515),l(-.898,1.129),l(-.847,1.058),l(-.756,.587),l(-.68,.316),l(-.337,-.171),l(-.47,-.313),l(-.237,-.328),l(.056,-.314),l(.288,-.386),l(.307,-.671),l(.398,-.5),l(-.031,-.343),l(-.271,-.128),l(-.761,-.582),l(-.421,-.185),l(-.593,-.184),l(-.98,-.452),l(-.306,-.256),l(-.11,-.17),l(.081,-.128),l(.419,-.157),l(1.389,-.685),l(.209,-.512),l(-.078,-.695),l(.087,-.312),l(.396,-.441),l(.032,-.383),l(-.482,-.837),l(.081,-.567),l(-.156,-.311),l(-.479,-.655),l(-.574,-.678),l(.102,-.164),l(-.145,-.304),l(-.291,-.351),l(-.336,-.188),l(-.29,-.163),l(.117,.233),l(.497,.515),l(.049,.141),l(-.169,0),l(-.211,-.281),l(-.525,-.631),l(-.622,-.771),l(-.518,-.561),l(.001,-.117),l(-.268,-.257),l(.04,-.141),l(.013,-.14),l(-.048,-.188),l(-.197,-.396),l(-.379,-.42),l(-.347,-.257),l(.163,-.046),l(.205,.093),l(.358,-.047),l(.131,-.093),l(.084,.28),l(-.149,.187),l(.186,.303),l(.177,.21),l(.167,.116),l(.228,.164),l(.041,-.141),l(.269,.023),l(.519,.257),l(.42,.117),l(.274,.07),l(.128,.257),l(-.011,.141),l(.185,.023),l(.146,-.188),l(.185,.023),l(-.022,.164),l(.227,.351),l(.249,.187),l(.233,.28),l(-.18,.023),l(-.076,.164),l(.093,.163),l(-.242,-.023),l(-.175,-.047),l(.143,.117),l(.251,.188),l(.23,.233),l(.352,.28),l(.063,.234),l(.019,.21),l(-.261,-.047),l(.096,.164),l(.239,.351),l(.256,.188),l(-.292,.023),l(-.226,0),l(-.205,-.047),l(-.006,.141),l(.306,.14),l(.324,.164),l(-.09,.211),l(.205,.046),l(.265,-.023),l(.226,0),l(.223,.141),l(-.114,.07),l(-.031,.141),l(.025,.141),l(.136,.06),M(782.939,297.694),l(-.088,.158),l(-.558,.13),l(-.309,.288),l(-.322,.101),l(-.246,.244),l(-.692,-.242),l(-.16,.086),l(.15,.216),l(.429,.415),l(-.141,.173),l(.02,.259),l(-.064,.431),l(-.218,-.071),l(-.976,-.099),l(.418,.229),l(.449,.244),l(-.278,.49),l(-.427,.896),l(-.212,.549),l(-.418,.318),l(-.673,.349),l(-.171,.246),l(-.259,.145),l(-.581,.233),l(-.593,.406),l(-.398,.015),l(-1.156,-.258),l(-.628,.112),l(-.585,-.442),l(-.812,-.158),l(-.373,-.066),l(-.162,-.308),l(-.467,-.098),l(-.24,.142),l(-.062,.168),l(-.78,.095),l(-.214,-.166),l(-.515,-.095),l(-.146,-.286),l(.432,-.089),l(-.223,-.216),l(.328,-.116),l(.322,-.001),l(-.452,-.482),l(.82,.266),l(-.464,-.576),l(.121,-.145),l(.946,.156),l(.082,-.13),l(-.141,-.173),l(-.201,-.216),l(-.06,-.288),l(.283,-.303),l(.569,-.246),l(.328,-.374),l(.561,-.375),l(.102,-.302),l(.998,-.575),l(1.106,-.275),l(.713,-.331),l(.544,-.36),l(.377,-.101),l(.685,-.575),l(.066,-.272),l(.48,-.302),l(.373,-.015),l(.787,-.331),l(.664,-.402),l(.126,-.215),l(-.008,-.172),l(.266,-.144),l(.448,-.302),l(-.109,-.501),l(.076,-.214),l(.166,-.44),l(.306,.048),l(.066,-.152),l(.58,-.259),l(.444,-.272),l(.137,-.285),l(.131,-1.187),l(.512,-.647),l(.372,.047),l(.365,.165),l(.032,.259),l(.337,.06),l(.187,.186),l(.231,.799),l(.312,.242),l(.973,-.645),l(.426,-.029),l(.367,.113),l(.222,.5),l(-.197,.399),l(.299,.429),l(.066,.271),l(-.611,.659),l(-.261,.401),l(-.476,.358),l(-.868,.746),l(-.578,.359),l(-.295,.13),l(-.236,.258),l(-.389,.159),l(-.271,.258),l(.416,.407),l(.428,.047),l(.421,.289),l(-.276,.113),l(-.484,.07),l(-.503,-.296),l(-.488,.131),l(-.352,.158), +N(247.899,318.387),l(.008,-1.144),l(.821,.289),l(.06,.206),l(-.354,.312),l(-.534,.337),M(248.453,316.576),l(-.286,-.039),l(-1.385,-.36),l(-.841,-.217),l(-2.827,-.132),l(-1.41,.052),l(-.669,-.041),l(-.778,-.568),l(-.231,-2.285),l(-.187,-.248),l(-.654,.121),l(-.961,.283),l(-.218,-.043),l(-.508,-1.123),l(-.28,-1.309),l(.037,-.45),l(.271,-.292),l(1.729,-1.01),l(.307,-.263),l(.296,-1.218),l(.069,-.188),l(-.446,-.648),l(.249,-.781),l(.28,-.219),l(.598,-.161),l(.226,-.262),l(.212,-.434),l(.216,-.896),l(-.158,-1.035),l(.059,-1.094),l(.767,-.794),l(-.017,-.216),l(-.552,-.385),l(-.586,-.298),l(-.176,-.171),l(.757,-.146),l(.726,-.033),l(.322,-.13),l(.245,-.202),l(.007,-.186),l(-.302,-.17),l(-.789,-.11),l(-.26,-.185),l(-.252,-.585),l(.191,-1.458),l(-.088,-.655),l(-.555,-.111),l(-.125,-.128),l(-.094,-1.226),l(.106,-.271),l(.172,-.172),l(.596,-.317),l(-.012,-.427),l(-.231,-.867),l(-.123,-1.835),l(.1,-.37),l(.316,-.541),l(.511,-2.427),l(.053,-.312),l(.126,-.17),l(.951,-.529),l(.202,-.143),l(-.437,-.932),l(-.249,-1.103),l(-.014,-1.16),l(.142,-1.075),l(.231,-.312),l(1.334,-1.11),l(.078,-.325),l(-.189,-1.06),l(-.088,-.409),l(.319,-.595),l(1.083,-1.854),l(.075,-.41),l(-.055,-.69),l(-.784,-2.816),l(-.408,-1.154),l(-.285,-.633),l(.156,-.961),l(.388,-1.201),l(.292,-.34),l(.492,-.271),l(.124,-.185),l(-.054,-.762),l(-.167,-1.466),l(.823,-1.839),l(.282,-.439),l(.608,-.694),l(.464,-.835),l(.329,-.835),l(.791,-.089),l(.333,-.017),l(.152,-.311),l(-.011,-.227),l(-.53,-.477),l(-.114,-.507),l(.161,-.382),l(.273,-.369),l(-.03,-.226),l(-.34,-.449),l(-.113,-.437),l(.007,-.579),l(.421,-.722),l(-.25,-.817),l(.204,-.312),l(.819,-.372),l(1.346,-.53),l(.36,-.256),l(.541,-1.457),l(.093,-.636),l(-.161,-.154),l(-.212,-.14),l(-.107,-.056),l(2.026,-2.087),l(.292,-.27),l(.322,.181),l(.193,.169),l(.615,.194),l(.901,-.034),l(.527,-.045),l(.531,.067),l(.37,.195),l(.341,.309),l(.416,1.084),l(1.034,-1.784),l(.686,-.004),l(1.33,.077),l(.592,.109),l(.19,.056),l(.225,.337),l(.782,.913),l(1.271,1.376),l(.576,.562),l(.835,.588),l(.498,.237),l(1.173,.204),l(.671,.307),l(1.632,1.106),l(1.448,.697),l(.65,.18),l(.939,.503),l(-.018,.268),l(-.617,1.203),l(-.625,.851),l(-.048,.227),l(.21,.619),l(-.11,.198),l(-.486,.398),l(-.425,.426),l(-.064,.212),l(.19,.056),l(1.187,-.332),l(.607,.025),l(.992,.333),l(.564,.096),l(.71,-.005),l(.745,-.131),l(.387,-.172),l(.235,-.029),l(.35,.097),l(.609,.363),l(.352,-.51),l(.301,-.27),l(1.007,-.74),l(.375,-.468),l(.544,-1.57),l(-.02,-.239),l(.957,-.161),l(.462,-.017),l(.206,.196),l(.517,1.154),l(-.094,1.638),l(-.161,.467),l(-.521,.313),l(-1.754,.744),l(-.348,.242),l(-1.633,1.448),l(-1.435,1.363),l(-1.805,1.816),l(-.833,.88),l(-.214,.27),l(-.443,.524),l(-.065,.452),l(-.595,2.359),l(-.103,.522),l(.049,.847),l(.168,.986),l(-.118,.325),l(-.48,.524),l(-.24,.495),l(-.011,.522),l(.194,.577),l(-.054,.338),l(-.162,.273),l(-.26,.325),l(.015,.226),l(.924,.831),l(.68,.281),l(.715,.281),l(.283,.169),l(.281,.325),l(-.025,.325),l(-.362,.523),l(-.043,.396),l(.105,.339),l(.174,.269),l(.466,.325),l(.522,.168),l(.109,.113),l(.226,.892),l(-.308,.481),l(-.75,.937),l(-.729,.766),l(-.313,.737),l(-.368,.284),l(-.832,.342),l(-1.04,.342),l(-1.92,.401),l(-1.795,.188),l(-1.361,.116),l(-.945,.044),l(-1.175,-.11),l(-.934,-.226),l(-.128,.199),l(.036,.808),l(.322,.312),l(.308,.184),l(-.09,.298),l(-.381,.624),l(-.345,.498),l(-.069,.385),l(.392,.682),l(.066,.285),l(-.208,.214),l(-.105,.057),l(-1.251,.473),l(-1.137,.116),l(-.814,-.069),l(-.967,-.34),l(-1.47,-.396),l(-.246,.057),l(-.23,.271),l(.041,.598),l(.429,.684),l(.037,.398),l(-.242,.643),l(.092,.385),l(.773,.54),l(.796,.084),l(.369,-.2),l(-.387,-.398),l(.872,-.188),l(.383,-.043),l(.234,1.041),l(.052,.3),l(-.144,.157),l(-.299,.101),l(-.448,.072),l(-.261,-.157),l(-.104,-.299),l(-.115,-.071),l(-1.046,.073),l(-.67,.201),l(-.212,.101),l(.151,.214),l(.591,.07),l(.47,.113),l(.452,.113),l(.06,.028),l(-.864,.388),l(-.776,.287),l(-.577,.602),l(.003,.414),l(.161,.787),l(-.081,.258),l(-.815,.817),l(.022,.215),l(.423,.371),l(-.491,.116),l(-1.194,.088),l(-.48,.087),l(-.632,.246),l(-.619,.389),l(-.56,.548),l(-.549,.821),l(-.052,.389),l(.061,.375),l(.312,.591),l(.48,.446),l(.98,.633),l(.657,.244),l(.97,.143),l(.362,.086),l(.14,.274),l(-.151,.796),l(-.128,.348),l(-.342,.464),l(-.189,.145),l(-1.08,.524),l(-1.541,.814),l(-.712,.698),l(-.179,.276),l(-.093,.45),l(.111,.523),l(-.169,.451),l(-.239,.32),l(-.97,.454),l(-.969,.25),l(-.421,.221),l(-.323,.396),l(-.226,.791),l(-.054,.514),l(.2,.777),l(.547,.896),l(.699,.779),l(.235,.339),l(-.101,.032),M(247.899,318.387),l(.18,.182),l(.148,.073),l(.607,-.075),l(.344,.133),l(.648,.725),l(.908,.665),l(.993,.756),l(.525,.222),l(.73,.37),l(.246,.074),l(.42,-.001),l(.483,.163),l(1.283,.027),l(.142,-.016),l(-.006,.224),l(-.19,.209),l(-.492,.06),l(-1.198,.092),l(-.777,.196),l(-.364,0),l(-1.179,-.355),l(-.753,-.088),l(-1.15,-.027),l(-.814,-.014),l(-.831,.081),l(.098,-3.675), +N(346.758,54.457),l(.127,-.162),l(.42,-.179),l(.894,.015),l(.674,-.098),l(-.354,-.227),l(-.405,-.34),l(.317,-.342),l(.277,0),l(.956,.42),l(.67,.048),l(.3,-.163),l(-.191,-.26),l(-.625,-.373),l(.366,-.245),l(1.037,.226),l(.957,.08),l(.746,.275),l(.446,.551),l(-.119,.405),l(-.441,.292),l(.922,.806),l(.553,-.356),l(.352,-.13),l(.63,-.114),l(.49,-.179),l(.061,-.21),l(-.169,-.778),l(.542,-.245),l(.501,.454),l(.426,.307),l(.489,.209),l(.215,.016),l(.185,-.13),l(-.264,-.454),l(.243,-.163),l(.27,-.033),l(.817,-.164),l(.683,.438),l(.536,.242),l(.542,.063),l(.05,-.178),l(-.358,-.535),l(1.006,.145),l(1.439,.079),l(.787,-.115),l(.427,-.229),l(-.021,-.716),l(1.167,.08),l(.635,.471),l(1.118,.323),l(.683,.015),l(.273,.243),l(-.252,.552),l(.786,.29),l(1.674,.159),l(.127,.145),l(.143,.548),l(-.07,.387),l(-.152,.256),l(-.152,.256),l(-.443,.129),l(-.815,.018),l(-.195,.096),l(-.04,.431),l(-.515,.463),l(-.497,.16),l(-.568,-.031),l(-.422,-.159),l(-.817,.495),l(-.539,.144),l(-1.46,.463),l(-.853,.113),l(-.726,.001),l(-.771,.097),l(-.784,.587),l(-.473,.127),l(-1.078,.097),l(-.709,-.03),l(-1.316,-.171),l(-.608,-.142),l(-1.283,-.489),l(-1.058,-.093),l(-.443,.064),l(-1.041,-.014),l(-1.834,-.124),l(-.297,-.206),l(.434,-.191),l(1.127,-.352),l(.701,-.59),l(-.818,-.015),l(-.51,-.126),l(-.428,-.398),l(-.253,-.095),l(-.358,.081),l(-1.564,.115),l(-.557,.033),l(-.37,-.223),l(.141,-.192),l(.388,-.129),l(.669,-.097),l(.794,-.017),l(.729,-.114),l(1.049,-.098),l(.376,-.194),l(.178,-.322),l(-.144,-.258),l(-.358,-.177),l(-.426,-.015),l(-.478,-.145),l(-1.005,-.047),l(-.821,.099),l(-.424,.162),l(-.676,.082),l(-1.041,-.272),l(-.16,-.21), +N(462.829,67.958),l(.145,.053),l(.16,.131),l(-.043,.174),l(-.175,.044),l(-.189,0),l(-.116,0),l(-.088,.043),l(-.058,.131),l(-.175,.277),l(-.219,.204),l(-.319,.131),l(-.204,.131),l(-.088,.16),l(.029,.16),l(.131,.437),l(.073,.189),l(.029,.16),l(-.175,.131),l(0,.175),l(.175,.233),l(.203,.087),l(.088,.073),l(0,.073),l(.015,.087),l(.043,.146),l(.175,.043),l(.059,.059),l(-.175,.073),l(-.262,.043),l(-.16,.058),l(-.059,.102),l(-.087,.116),l(-.131,0),L(461.402,72),l(-.015,.087),l(-.116,.058),l(.081,.106),l(-.125,.025),l(-.087,-.015),l(-.306,-.043),l(-.16,-.058),l(-.175,-.073),l(-.204,-.044),l(-.131,.102),l(-.204,-.029),l(-.131,.044),l(-.16,.087),l(-.146,.014),l(-.146,-.087),l(-.116,-.029),l(-.175,0),l(-.204,-.117),l(-.116,-.174),l(-.203,-.117),l(-.146,-.043),l(-.072,-.117),l(-.189,0),l(-.247,-.043),l(-.204,-.117),l(-.029,0),l(-.276,-.014),l(-.102,-.102),l(-.248,-.043),l(-.116,-.102),l(-.189,-.087),l(0,.073),l(-.116,.087),l(-.131,-.058),l(-.015,-.073),l(-.087,-.029),l(-.103,0),l(-.276,.117),l(-.102,.029),l(-.131,.015),l(-.219,.015),l(-.146,.043),l(-.262,.029),l(-.276,.087),l(-.116,.102),l(-.087,0),l(.156,-.19),l(-.003,-.351),l(.183,-.238),l(-.368,-.21),l(-.605,.437),l(-.334,-.251),l(-.527,-.038),l(.043,-.942),l(-.396,.188),l(-.336,-.415),l(.158,-.202),l(-.209,-.254),l(.265,-.074),l(-.092,-.252),l(.344,-.042),l(1.026,-.084),l(-.006,-.132),l(.561,-.108),l(.133,-.188),l(.436,.101),l(.074,-.113),l(.317,.05),l(.083,-.215),l(1.104,.193),l(.446,-.294),l(.091,.165),l(.514,-.089),l(1.383,.029),l(1.152,.167),l(.305,.12),l(.592,-.045),l(.971,.09),l(.426,-.108),l(.271,-.24),l(-.006,-.009), +N(461.353,72.251),l(.37,-.004),l(-.015,.116),l(0,.117),l(.232,.073),l(.204,.087),l(.087,.073),l(.204,.058),l(-.015,.087),l(-.029,.116),l(-.015,.087),l(-.102,.073),l(-.087,.015),l(-.103,.029),l(.131,.087),l(-.072,.131),l(.029,.117),l(-.073,.087),l(-.102,.073),l(-.044,.102),l(.204,-.059),l(.146,-.015),l(.131,.073),l(.087,.014),l(.073,.044),l(-.059,.087),l(-.043,.073),l(.116,.102),l(.131,.058),l(.029,.16),l(.146,.102),l(.16,.043),l(-.059,.087),l(.131,.117),l(-.015,.189),l(.088,.233),l(-.044,.087),l(-.015,.117),l(-.061,.042),l(-.241,.044),l(-.24,.051),l(-.12,.12),l(-.223,.034),l(-.137,.154),l(-.137,.085),l(-.069,.103),l(-.068,.206),l(-.188,.035),l(-.239,-.035),l(-.24,-.034),l(-.325,-.034),l(-.359,0),l(-.172,.068),l(-.103,.137),l(-.223,.085),l(-.154,0),l(-.103,-.017),l(-.086,.052),l(-.377,-.035),l(-.273,-.068),l(-.154,-.171),l(-.138,-.154),l(-.325,-.137),l(-.497,-.223),l(-.342,-.24),l(-.377,-.034),l(-.583,-.035),l(-.325,-.12),l(-.291,-.188),l(-.086,-.257),l(-.188,.017),l(-.171,.068),l(-.36,.171),l(-.394,.017),l(-.24,0),l(-.273,.085),l(-.24,-.085),l(-.309,-.103),l(-.6,-.017),l(-.291,.069),l(-.359,-.069),l(-.291,-.051),l(-.154,.034),l(-.274,.069),l(-.103,-.052),l(-.12,-.137),l(-.154,0),l(-.257,.068),l(-.188,0),l(-.754,-.017),l(-.445,-.085),l(-.754,.171),l(-.599,.154),l(-.429,.103),l(-.257,.137),l(-.052,.188),l(-.526,.026),l(-.065,-.059),l(.073,-.837),l(.035,-.302),l(.127,-.167),l(.672,-.379),l(.034,-.717),l(.267,-.162),l(.267,-.273),l(.217,-.203),l(.296,-.026),l(1.056,-.199),l(.166,-.046),l(.162,-.066),l(.29,0),l(.049,.237),l(.657,.388),l(.422,.162),l(.23,.473),l(.091,.15),l(.441,.196),l(.785,.059),l(.868,-.244),l(.24,-.122),l(.178,-.288),l(-.052,-.394),l(-.193,-.869),l(.198,-.243),l(.045,-.055),l(.087,0),l(.116,-.102),l(.276,-.087),l(.262,-.029),l(.146,-.043),l(.219,-.015),l(.131,-.015),l(.102,-.029),l(.276,-.117),l(.103,0),l(.087,.029),l(.015,.073),l(.131,.058),l(.116,-.087),l(0,-.073),l(.189,.087),l(.116,.102),l(.248,.043),l(.102,.102),l(.276,.014),l(.029,0),l(.204,.117),l(.247,.043),l(.189,0),l(.072,.117),l(.146,.043),l(.203,.117),l(.116,.174),l(.204,.117),l(.175,0),l(.116,.029),l(.146,.087),l(.146,-.014),l(.16,-.087),l(.131,-.044),l(.204,.029),l(.131,-.102),l(.204,.044),l(.175,.073),l(.16,.058),l(.306,.043),l(.087,.015),l(.125,-.025), +N(451.02,79.165),l(-.029,-.038),l(-.034,-.137),l(-.018,-.171),l(.068,-.206),l(.068,-.154),l(.224,-.12),l(-.052,-.12),l(-.018,-.137),l(-.171,-.069),l(-.188,-.034),l(-.103,-.103),l(-.086,-.137),l(-.223,.017),l(-.257,0),l(-.445,0),l(-.223,.051),l(-.086,-.103),l(-.514,-.068),l(-.257,-.069),l(-.223,-.12),l(-.24,0),l(-.086,-.052),l(-.051,-.154),l(-.12,.034),l(-.353,.096),l(-.043,-.077),l(.128,-.012),l(.034,-.183),l(-.439,-.646),l(-.008,-.14),l(-.042,-.727),l(-.112,-.102),l(.526,-.026),l(.052,-.188),l(.257,-.137),l(.429,-.103),l(.599,-.154),l(.754,-.171),l(.445,.085),l(.754,.017),l(.188,0),l(.257,-.068),l(.154,0),l(.12,.137),l(.103,.052),l(.274,-.069),l(.154,-.034),l(.291,.051),l(.359,.069),l(.291,-.069),l(.6,.017),l(.309,.103),l(.24,.085),l(.273,-.085),l(.24,0),l(.394,-.017),l(.36,-.171),l(.171,-.068),l(.188,-.017),l(.086,.257),l(.291,.188),l(.325,.12),l(.583,.035),l(.377,.034),l(.342,.24),l(.497,.223),l(.325,.137),l(.138,.154),l(.154,.171),l(.273,.068),l(.377,.035),l(-.017,.171),l(-.086,.154),l(-.034,.12),l(-.12,.137),l(-.086,.137),l(.343,.034),l(.274,.052),l(.085,.051),l(-.119,.051),l(-.086,0),l(-.103,.154),l(-.018,.154),l(-.171,.017),l(-.12,-.086),l(-.12,.051),l(-.239,-.034),l(-.154,.034),l(-.086,.154),l(-.103,.154),l(-.257,.068),l(-.429,0),l(-.137,.137),l(-.12,.12),l(-.034,.154),l(-.086,.171),l(.103,.171),l(-.068,.137),l(-.239,.154),l(0,.137),l(-.068,.085),l(-.069,.137),l(.172,.034),l(.205,0),l(.138,.206),l(-.086,.188),l(-.274,.017),l(-.223,-.068),l(0,-.154),l(-.034,-.085),l(-.086,-.069),l(-.171,.051),l(-.12,.086),l(-.291,-.034),l(-.068,.137),l(-.24,.12),l(-.154,0),l(-.188,-.034),l(-.273,.103),l(.086,.171),l(-.069,.12),l(-.171,.034),l(-.137,-.034),l(-.206,.051),l(-.377,.154),l(-.291,0),l(-.068,-.103),l(-.12,-.051),l(-.239,.051),l(-.377,.017),l(-.24,.034),l(-.291,-.034),l(-.154,.034),l(-.093,-.035),l(-.09,-.171),l(-.016,-.029),l(-.099,-.186),l(-.284,-.487),l(-.679,-.243),l(-.04,-.014),l(-.641,.021), +N(452.867,80.273),l(.093,.035),l(.154,-.034),l(.291,.034),l(.24,-.034),l(.377,-.017),l(.239,-.051),l(.12,.051),l(.068,.103),l(.291,0),l(.377,-.154),l(.206,-.051),l(.137,.034),l(.171,-.034),l(.069,-.12),l(-.086,-.171),l(.273,-.103),l(.188,.034),l(.154,0),l(.24,-.12),l(.068,-.137),l(.291,.034),l(.12,-.086),l(.171,-.051),l(.086,.069),l(.034,.085),l(0,.154),l(.223,.068),l(.274,-.017),l(.086,-.188),l(-.138,-.206),l(-.205,0),l(-.172,-.034),l(.069,-.137),l(.068,-.085),l(0,-.137),l(.239,-.154),l(.068,-.137),l(-.103,-.171),l(.086,-.171),l(.034,-.154),l(.12,-.12),l(.137,-.137),l(.429,0),l(.257,-.068),l(.103,-.154),l(.086,-.154),l(.154,-.034),l(.239,.034),l(.12,-.051),l(.12,.086),l(.171,-.017),l(.018,-.154),l(.103,-.154),l(.086,0),l(.119,-.051),l(-.085,-.051),l(-.274,-.052),l(-.343,-.034),l(.086,-.137),l(.12,-.137),l(.034,-.12),l(.086,-.154),l(.017,-.171),l(.086,-.052),l(.103,.017),l(.154,0),l(.223,-.085),l(.103,-.137),l(.172,-.068),l(.359,0),l(.325,.034),l(.24,.034),l(.239,.035),l(.188,-.035),l(.068,-.206),l(.069,-.103),l(.137,-.085),l(.137,-.154),l(.223,-.034),l(.12,-.12),l(.24,-.051),l(.241,-.044),l(.165,.147),l(.229,.066),l(.197,-.131),l(.181,.016),l(.312,.033),l(.132,.148),l(.082,.148),l(.197,-.033),l(.214,-.065),l(.361,-.049),l(.312,.049),l(.296,.065),l(.147,.017),l(0,.115),l(-.164,.099),l(-.017,.099),l(.065,.148),l(.164,.148),l(.197,0),l(.214,-.197),l(.279,-.016),l(.165,0),l(.147,-.099),l(.23,-.083),l(.131,.049),l(.099,.049),l(.247,-.049),l(.542,.115),l(.132,.131),l(.279,.099),l(.099,.099),l(.147,.099),l(.165,.033),l(.147,-.033),l(.049,.115),l(-.065,.115),l(0,.083),l(-.033,.164),l(-.131,.165),l(.197,.247),l(.147,.099),l(.05,.164),l(-.066,.131),l(-.114,0),l(0,.083),l(-.115,.082),l(-.099,.049),l(-.033,.165),l(-.049,.147),l(.345,.049),l(.132,.181),l(.082,.115),l(.181,-.049),l(.132,.033),l(-.099,.115),l(-.066,.131),l(.017,.099),l(.214,.017),l(.164,.263),l(.115,.23),l(.443,.213),l(.23,.066),l(.279,.082),l(.164,.099),l(.066,.148),l(-.099,.197),l(-.066,.181),l(.182,.066),l(.361,-.066),l(.378,.066),l(.361,.099),l(.263,.066),l(-.032,.065),l(-.066,.049),l(-.082,.017),l(.099,.181),l(.296,.148),l(.279,.066),l(.033,.131),l(-.065,.164),l(-.296,0),l(-.148,.083),l(-.049,.065),l(-.444,.247),l(-.525,.099),l(-.51,-.016),l(-.197,-.132),l(-.328,-.049),l(-.362,.017),l(-.131,.165),l(-.099,.131),l(.017,.164),l(.279,.263),l(.296,.164),l(0,.165),l(-.132,.066),l(.099,.148),l(.147,.131),l(-.082,.099),l(.033,.164),l(.033,.23),l(-.033,.099),l(.164,.082),l(.082,.115),l(.165,.066),l(.002,.142),l(-.519,-.005),l(-.522,.056),l(-.112,.131),l(-.205,-.056),l(-.187,-.037),l(-.336,.075),l(-.057,.13),l(-.111,.112),l(-.317,.187),l(-.188,.261),l(-.261,.224),l(-.057,.206),l(.243,.205),l(.056,.149),l(-.131,.206),l(-.261,-.019),l(-.149,-.056),l(-.149,-.206),l(-.112,-.056),l(-.187,-.075),l(-.224,-.037),l(-.225,.037),l(-.242,.075),l(-.299,.019),l(-.149,-.131),l(-.224,.075),l(-.188,.093),l(-.316,.056),l(-.188,-.056),l(-.037,-.205),l(-.112,-.131),l(-.168,-.131),l(-.13,.038),l(-.131,.075),l(-.168,0),l(-.299,.149),l(-.131,.149),l(-.168,0),l(-.094,-.187),l(-.13,-.075),l(-.206,0),l(-.224,.112),l(-.131,-.187),l(-.224,-.093),l(-.131,.112),l(-.354,.056),l(-.262,-.112),l(-.112,0),l(-.019,.205),l(-.168,.093),l(-.093,-.056),l(.056,-.224),l(-.243,-.038),l(-.187,-.056),l(-.541,.112),l(0,-.149),l(-.187,0),l(.019,-.224),l(-.28,-.037),l(-.242,.075),l(-.523,-.112),l(-.578,-.056),l(-.075,-.056),l(-.522,0),l(-.205,-.168),l(-.262,.019),l(-.522,-.093),l(-.467,.075),l(-.485,0),l(-.354,-.056),l(-.355,.056),l(-.354,.056),l(-.485,-.038),l(-.485,.019),l(-.205,.187),l(-.037,.168),l(-.374,.168),l(-.373,.206),l(-.112,-.112),l(-.261,0),l(-.374,-.019),l(-.037,.131),l(0,.045),l(-.126,-.137),l(.315,-.752),l(-.013,-.25),l(-.218,-.146),l(-.149,-.176),l(-.421,-.146),l(-.289,-.012),l(.128,-.292),l(.291,-.328),l(.571,-.244),l(.44,-.03),l(.263,-.208),l(.023,-.236),l(-.172,-.502),l(-.615,-1.5),l(-.16,-.302), +N(400.125,81.146),l(.633,.305),l(.208,.207),l(.208,.37),l(-.038,.193),l(-.545,.563),l(.714,.176),l(.396,-.311),l(.527,-.119),l(.602,.028),l(.807,.176),l(.467,.354),l(.235,.752),l(-.077,.221),l(-.322,.414),l(-1.068,.473),l(-.767,.561),l(-.96,.237),l(1.223,.167),l(.501,.043),l(.354,-.104),l(.39,.117),l(-.066,.516),l(-.997,.308),l(.005,.199),l(-.479,-.084),l(-1.068,.443),l(-.879,-.142),l(-.293,-.048),l(-1.119,.211),l(-.587,-.211),l(-.598,.112),l(-1.584,.141),l(.137,.295),l(-.907,-.168),l(-.264,.168),l(-.911,-.337),l(-.334,.143),l(-.913,.089),l(-.093,.569),l(-.337,.316),l(-.37,.042),l(-.272,-.252),l(-.53,-.172),l(-.135,.151),l(-.527,-.077),l(-.948,.324),l(-.701,.552),l(-.326,-.231),l(-.775,-.147),l(1.2,-.472),l(.492,-.476),l(.447,-.097),l(.468,-.388),l(.118,-.485),l(.242,.063),l(.367,-.211),l(-.008,-.274),l(1.013,-.105),l(.76,.119),l(.927,.007),l(.073,-.338),l(.308,-.142),l(.321,-.556),l(-.939,.394),l(-.725,.016),l(-1.467,-.482),l(-1.866,-.055),l(-.399,-.191),l(-.156,-.162),l(.417,-.325),l(.983,-.194),l(.721,-.237),l(.38,-.384),l(.066,-.827),l(-.119,-.192),l(-.713,.046),l(-.34,-.044),l(.288,-.355),l(.387,-.223),l(.802,-.253),l(1.394,-.062),l(.922,-.076),l(-.316,-.548),l(.172,-.683),l(.253,-.461),l(-.045,-.312),l(-.834,.061),l(-.484,-.296),l(-.2,-.312),l(.309,-.507),l(.617,-.433),l(-.347,-.104),l(-.596,-.088),l(-.735,.3),l(-.476,.061),l(-.753,-.222),l(-.088,.194),l(-.222,.194),l(-.672,-.103),l(-.464,-.133),l(.1,-.343),l(.348,-.36),l(.604,-.706),l(-.293,-.134),l(-.305,-.39),l(.028,-.24),l(.304,-.106),l(.3,-.196),l(-.194,-.496),l(-.306,.076),l(-.636,.453),l(-.442,.031),l(-.526,.287),l(-.14,-.421),l(.302,-.527),l(.438,-.559),l(.065,-.257),l(-.417,-.195),l(-.196,-.045),l(-.218,.302),l(-.394,.257),l(-.493,-.165),l(.299,-.575),l(.54,-.455),l(.09,-.136),l(-.225,-.575),l(.366,-.092),l(.225,-.197),l(-.672,-.515),l(.432,-.351),l(.752,.151),l(.387,-.092),l(-.645,-.759),l(.975,-.169),l(-.457,-.502),l(.416,-.382),l(.924,.365),l(.824,-.093),l(.686,-.139),l(.867,-.047),l(.612,.014),l(.303,.259),l(-.307,.29),l(-1.726,.704),l(-.46,.274),l(-.218,.441),l(.222,.182),l(.784,.029),l(.877,-.078),l(.685,-.001),l(.53,.075),l(1.563,-.064),l(.458,.378),l(-.363,.425),l(-.212,.323),l(.098,.112),l(-.565,.66),l(-.226,.111),l(-.339,.437),l(-.696,.261),l(-.382,.038),l(.451,.186),l(.508,.167),l(-.116,.015),l(-.272,.19),l(-.61,.052),l(-.275,.196),l(-1.337,-.025),l(.404,.223),l(.302,0),l(.492,.093),l(.432,-.006),l(.519,-.223),l(.413,-.025),l(.449,.161),l(.656,.164),l(.673,.566),l(.496,.228),l(.118,.165),l(-.067,.238),l(.312,.78),l(.371,.536),l(.438,.189),l(.714,.107),l(.59,.549),l(.688,.593),l(.135,.52),l(-.188,.49),l(.257,.124),M(387.915,77.13),l(-.128,-.325),l(.149,-.335),l(.38,-.089),l(.079,.501),l(-.307,.251),l(-.173,-.003),M(386.786,80.184),l(-.178,-.272),l(-.967,.072),l(.123,-.256),l(-.364,-.15),l(-.26,-.257),l(-.335,-.107),l(-.253,.364),l(-.751,.257),l(-.778,-.192),l(-.401,-.278),l(-.101,-.278),l(.86,-.278),l(-.483,-.257),l(.817,-.107),l(.385,-.484),l(-.029,-.235),l(.449,-.09),l(.508,-.15),l(.781,-.077),l(.424,.044),l(.389,.104),l(.362,-.046),l(.218,.149),l(.519,.791),l(.047,.179),l(-.081,.298),l(.308,.446),l(-.155,.328),l(-.402,.328),l(-.354,.12),l(-.299,.038), +N(578.943,106.217),l(-.41,-.375),l(-.466,-.098),l(-.663,0),l(-.196,-.27),l(-.27,-.147),l(-.147,-.344),l(-.564,.049),l(-.981,-.246),l(-.662,.074),l(-1.35,-.024),l(-.662,-.098),l(-.712,-.221),l(-.785,.147),l(-.761,0),l(-.858,.024),l(-.441,.27),l(-.54,-.098),l(-.908,-.196),l(-.735,-.246),l(-.761,-.27),l(-.589,-.074),l(-.688,.123),l(-.466,.368),l(-.245,.736),l(.024,.442),l(-.344,-.123),l(-.81,-.123),l(-.688,-.196),l(-.883,-.245),l(-.883,-.147),l(-.663,.098),l(-.736,.123),l(-.318,.368),l(-.393,.442),l(.044,.273),l(-.322,.031),l(-.377,.377),l(-.283,-.126),l(-.22,.063),l(-.346,.283),l(-.534,.471),l(-.755,.189),l(-.943,.377),l(-.282,.188),l(-.221,.472),l(-.439,.188),l(-.504,.44),l(.157,.409),l(-.125,.188),l(-.66,0),l(-.44,-.346),l(.062,-.283),l(-.062,-.283),l(-.44,-.314),l(-.346,0),l(-1.006,.094),l(-.691,.032),l(-.503,-.063),l(-.346,-1.069),l(-.221,-.817),l(-1.006,0),l(-.031,-.754),l(.188,-.409),l(.031,-1.038),l(-.66,.314),l(-.66,-1.006),l(-.597,-.22),l(-.724,-.723),l(-1.1,.409),l(-2.767,-.188),l(-2.578,.346),l(-2.012,-1.666),l(-5.722,-2.986),l(-5.658,1.289),l(-.056,8.174),l(-.158,-.014),l(-.341,.106),l(-.489,.043),l(-.447,-.255),l(-.638,-.703),l(-.256,-.511),l(-.617,-.383),l(-.681,-.383),l(-.512,-.234),l(-.979,.085),l(-1.277,.298),l(-.937,.532),l(-.529,.453),l(.092,-.399),l(-.06,-.18),l(-.12,-.12),l(.14,-.26),l(.2,-.2),l(.14,-.32),l(.04,-.3),l(.18,-.2),l(-.159,-.24),l(-.4,-.16),l(-.459,.06),l(-.18,-.16),l(-.3,.06),l(-.2,.04),l(-.199,-.18),l(-.221,-.32),l(-.319,-.28),l(-.34,0),l(-.359,.02),l(0,-.2),l(.08,-.28),l(-.2,-.379),l(-.239,-.12),l(-.2,-.24),l(-.399,-.799),l(-.08,-.28),l(-.56,-.12),l(-.699,-.08),l(-.14,-.16),l(.02,-.439),l(.16,-.12),l(.3,-.06),l(.399,.02),l(.34,.02),l(.479,.14),l(.539,.18),l(.18,-.08),l(.36,-.08),l(-.2,-.16),l(-.26,-.12),l(-.399,-.2),l(-.2,-.24),l(.26,-.36),l(.28,-.04),l(.08,-.26),l(.18,-.299),l(.12,-.14),l(.26,.04),l(.319,-.08),l(.16,-.1),l(.339,.12),l(.24,0),l(1.119,-.04),l(.999,.14),l(.499,.02),l(-.159,-.08),l(-.34,-.2),l(-.479,-.12),l(-.021,-.3),l(.2,-.2),l(.279,-.22),l(.221,-.28),l(.119,-.52),l(.12,-.28),l(-.16,-.24),l(-.14,-.16),l(.1,-.2),l(.26,-.2),l(-.119,-.12),l(-.101,-.3),l(-.359,-.12),l(-.359,-.04),l(-.68,-.1),l(-.2,.16),l(-.199,.08),l(-.52,.08),l(-.46,-.12),l(-.319,-.26),l(-.26,-.06),l(-.68,-.12),l(-.56,.06),l(-.659,.319),l(-.42,.02),l(-.799,.5),l(-.72,.28),l(-.499,.06),l(-.42,-.02),l(-.279,.24),l(-.213,.18),l(-.616,-.19),l(-.857,-.377),l(-.068,-.308),l(.343,-.103),l(.309,.103),l(.445,.103),l(.138,-.103),l(-.96,-1.131),l(-.343,-.514),l(-.479,-.206),l(-.515,-.445),l(-.514,-.034),l(-.343,.034),l(-.583,-.206),l(-.103,.343),l(-.514,-.514),l(.068,-.309),l(-.138,-.377),l(-1.37,-.343),l(.65,-1.165),l(.446,-.274),l(.239,-.206),l(-.239,-.274),l(-.343,-.171),l(.205,-1.303),l(.823,-.137),l(.343,-.549),l(.103,-.308),l(.411,-.069),l(.514,.24),l(.48,.548),l(.514,.411),l(.651,0),l(.411,-.24),l(.068,-.446),l(-.171,-.411),l(-.068,-.445),l(.479,-.206),l(.891,-.411),l(.172,-.24),l(.309,-.309),l(.514,-.171),l(.549,-.068),l(.788,-.377),l(.548,-.343),l(.515,-.309),l(.651,.069),l(.479,0),l(.309,.274),l(.651,-.137),l(.273,-.137),l(.617,-.24),l(.411,.069),l(.411,.514),l(.788,.035),l(.617,-.069),l(.96,.171),l(0,.343),l(.582,.206),l(.789,.343),l(.411,.274),l(.068,.583),l(.274,.137),l(.239,-.274),l(-.205,-.48),l(-.034,-.24),l(.72,.068),l(.582,.548),l(.686,.137),l(.411,.24),l(.686,-.171),l(.274,-.274),l(.377,-.343),l(.514,-.377),l(.823,.068),l(.65,.035),l(.651,.411),l(.617,-.068),l(.137,-.412),l(1.062,-.103),l(.754,.103),l(.274,.548),l(.926,.309),l(.754,.137),l(.411,.171),l(.651,-.343),l(.171,-.309),l(.24,0),l(.343,.343),l(.959,.034),l(1.577,-.411),l(.137,-.309),l(.138,-.686),l(-.24,-.24),l(-1.165,-.171),l(-.274,-.308),l(-.651,-.069),l(-.377,-.137),l(.068,-.171),l(-.377,-.137),l(-.239,0),l(-.164,-.274),l(.467,-.067),l(.735,-.368),l(.588,-.147),l(.331,-.294),l(-.441,-.478),l(-.146,-.257),l(.662,-.515),l(.698,-.184),l(1.103,.147),l(.515,-.073),l(.11,-.257),l(-.956,-.294),l(-1.065,-.11),l(0,-.331),l(.294,-.074),l(-.294,-.221),l(-.074,-.441),l(.185,-.515),l(.33,-.074),l(1.066,.147),l(.515,0),l(.772,0),l(.368,-.184),l(1.396,-.405),l(1.029,-.037),l(.735,-.11),l(1.545,-.11),l(.588,-.073),l(.331,.073),l(.221,-.331),l(.625,-.331),l(1.177,-.037),l(2.021,-.405),l(1.876,-.073),l(.625,-.074),l(.367,-.368),V(0,77.39),l(.515,-.037),l(.589,-.184),l(.11,-.221),l(.735,-.037),l(.919,.147),l(.515,.11),l(.772,.257),l(.625,-.11),l(.882,-.037),l(.368,.404),l(-.037,.331),l(.147,.221),l(.515,.22),l(-.11,.331),l(-.147,.257),l(.073,.331),l(-.33,.037),l(.184,.257),l(.478,.074),l(.295,-.147),l(.44,.11),l(.368,-.147),l(.367,.074),l(.331,-.221),l(.294,.11),l(.295,.368),l(.367,.221),l(.147,-.147),l(.184,-.147),l(.478,.037),l(.405,.294),l(.478,.11),l(.441,-.221),l(.367,0),l(-.146,.294),l(-.441,.184),l(-.331,.441),l(.331,.184),l(.441,-.11),l(.771,-.073),l(.441,.037),l(.552,.184),l(.294,-.294),l(.772,-.441),l(1.103,-.257),l(.956,-.515),l(.772,-.221),l(.515,-.22),l(.809,-.074),l(0,.441),l(-.515,.11),l(-.11,.368),l(1.104,.588),l(.809,.294),l(1.287,.772),l(1.066,1.029),l(1.69,2.133),l(.846,.882),l(1.104,1.434),l(.515,-.257),l(.331,-.257),l(.367,-.515),l(.92,0),l(.367,.331),l(0,.368),l(.478,0),l(.258,.257),l(.184,.184),l(.589,0),l(.992,0),l(.993,-.221),l(.771,-.221),l(.993,-.037),l(.698,.441),l(.772,.588),l(.331,.625),l(.956,.147),l(.588,.552),l(.662,.699),l(.882,.073),l(.993,.074),l(.478,-.368),l(.625,-.184),l(-.073,.331),l(.441,.331),l(.294,.478),l(.589,0),l(.064,.145),l(-.551,.034),l(-.542,.148),l(-.279,.262),l(-.011,.275),l(-.035,.478),l(-.306,.219),l(-.289,.06),l(-1.199,.093),l(-.428,.277),l(-.34,.581),l(.097,.75),l(.213,.707),l(-.157,.39),l(-.444,.392),l(-.417,.103),l(-.718,.062),l(-1.402,-.079),l(-.594,-.141),l(-.721,-.141),l(-1.096,-.254),l(-.427,.507),l(-.516,1.141),L(584.2,97.43),l(-.286,.605),l(-.137,.418),l(.622,.514),l(.126,.286),l(-.156,.245),l(-.231,.145),l(-.394,.074),l(-1.133,-.238),l(-.5,-.184),l(-.35,.06),l(-1.082,.207),l(-1.799,.254),l(-.393,.188),l(-.215,.302),l(-.068,.215),l(.232,.185),l(.366,-.06),l(.483,.141),l(.03,1.357),l(.345,.627),l(.29,.441),l(.119,.47),l(-.222,.33),l(-.705,.546),l(-.32,.401),l(-.02,.399),l(.139,.86), +N(386.786,80.184),l(-.304,.038),l(-.223,.09),l(.241,.252),l(.361,.771),l(.287,1.213),l(-.061,.281),l(-.359,.341),l(-.242,.414),l(-.145,.473),l(-.185,.044),l(-.284,-.058),l(-.616,.031),l(-.15,.212),l(-.913,.042),l(-.84,.132),l(-.247,.144),l(-.661,.286),l(-.903,.498),l(-.628,.035),l(-.879,.283),l(-1.28,.084),l(.053,-.378),l(-.089,-.441),l(-.848,.1),l(-.171,-.487),l(.734,-.254),l(-1.186,-.021),l(.062,-.233),l(1.286,.027),l(.198,-.104),l(.039,-.222),l(.107,-.31),l(.515,-.134),l(.692,-.031),l(.13,-.281),l(-1.07,.099),l(.387,-.437),l(-.187,-.159),l(.481,-.468),l(.694,-.011),l(.163,-.089),l(-.174,-.311),l(-.348,.177),l(-.309,-.131),l(-.319,.03),l(-.391,-.177),l(-.414,.001),l(-.182,.106),L(378,81.478),l(.309,-.306),l(-.29,-.142),l(.759,-.126),l(-.139,-.301),l(.391,-.235),l(-.481,-.214),l(-.59,.128),L(378,79.792),l(.38,-.268),l(.215,-.16),l(.928,.187),l(.336,-.075),l(.527,.038),l(1.102,.123),l(-.214,-.358),L(382.132,79),l(.198,-.321),l(-1.373,0),l(.154,-.15),l(.569,-.107),l(.061,-.29),l(.291,-.479),l(.505,-.181),l(.804,-.169),l(.22,.302),l(.354,.149),l(.156,-.031),l(.029,.235),l(-.385,.484),l(-.817,.107),l(.483,.257),l(-.86,.278),l(.101,.278),l(.401,.278),l(.778,.192),l(.751,-.257),l(.253,-.364),l(.335,.107),l(.26,.257),l(.364,.15),l(-.123,.256),l(.967,-.072),l(.178,.272), +N(452.998,85.535),V(0,85.49),l(.037,-.131),l(.374,.019),l(.261,0),l(.112,.112),l(.373,-.206),l(.374,-.168),l(.037,-.168),l(.205,-.187),l(.485,-.019),l(.485,.038),l(.354,-.056),l(.355,-.056),l(.354,.056),l(.485,0),l(.467,-.075),l(.522,.093),l(.262,-.019),l(.205,.168),l(.522,0),l(.075,.056),l(.578,.056),l(.523,.112),l(.242,-.075),l(.28,.037),l(-.019,.224),l(.187,0),l(0,.149),l(.541,-.112),l(.187,.056),l(.243,.038),l(-.056,.224),l(.093,.056),l(.168,-.093),l(.019,-.205),l(.112,0),l(.262,.112),l(.354,-.056),l(.131,-.112),l(.224,.093),l(.131,.187),l(.224,-.112),l(.206,0),l(.13,.075),l(.094,.187),l(.168,0),l(.131,-.149),l(.299,-.149),l(.168,0),l(.131,-.075),l(.13,-.038),l(.168,.131),l(.112,.131),l(.037,.205),l(.188,.056),l(.316,-.056),l(.188,-.093),l(.224,-.075),l(.149,.131),l(.299,-.019),l(.242,-.075),l(.225,-.037),l(.224,.037),l(.187,.075),l(.112,.056),l(.149,.206),l(.149,.056),l(.261,.019),l(.131,-.206),l(-.056,-.149),l(-.243,-.205),l(.057,-.206),l(.261,-.224),l(.188,-.261),l(.317,-.187),l(.111,-.112),l(.057,-.13),l(.336,-.075),l(.187,.037),l(.205,.056),l(.112,-.131),l(.522,-.056),l(.519,.005),l(.357,.089),l(.469,.022),l(.313,-.156),l(.179,-.291),l(.134,-.268),l(.536,.246),l(.536,-.022),l(.67,-.223),l(.692,.112),l(.514,-.134),l(.201,.268),l(.312,.134),l(.246,.335),l(.134,.201),l(.246,.156),l(.312,.156),l(0,.268),l(-.312,-.022),l(-.312,.134),l(.134,.291),l(.111,.357),l(.269,.29),l(.647,0),l(.156,.112),l(.514,-.067),l(.38,.022),l(0,.312),l(.402,0),l(0,.357),l(.224,.268),l(.089,.246),l(-.089,.179),l(.089,.224),l(.179,.089),l(.291,.29),l(.268,-.179),l(.47,-.067),l(.268,.067),l(.469,.291),l(.201,-.067),l(.179,.022),l(.179,.156),l(.425,-.112),l(.312,-.112),l(.269,0),l(.536,-.134),l(.357,-.067),l(.111,.156),l(.268,.179),l(0,.134),l(.201,.179),l(.022,.134),l(.402,.044),l(.179,.179),l(.224,.112),l(.29,-.134),l(.045,-.157),l(.224,-.067),l(.29,.268),l(.425,.067),l(.469,.112),l(.268,.112),l(.357,-.067),l(.201,.179),l(.291,.089),l(.469,.022),l(.111,.224),l(.357,.156),l(.269,0),l(.134,-.044),l(.201,-.089),l(.156,.089),l(-.089,.111),l(-.022,.179),l(.111,.089),l(.09,.179),l(-.045,.224),l(-.201,.089),l(-.156,.067),l(-.357,.201),l(-.312,.044),l(.223,.246),l(.269,.089),l(.29,.044),l(-.134,.156),l(-.312,0),l(-.246,0),l(-.045,.179),l(-.044,.224),l(.156,.067),l(.179,.067),l(.044,.134),l(.045,.179),l(.09,.201),l(.066,.067),l(-.156,.491),l(-.156,.291),l(0,.156),l(-.335,.134),l(-.805,-.157),l(-.736,.045),l(-.269,0),l(-.022,.179),l(-.223,.179),l(-.38,.134),l(-.357,.022),l(-.224,.089),l(-.09,.514),l(0,.224),l(-.021,.112),l(-.012,.126),l(-.779,.104),l(-.971,.06),l(-.511,.405),l(-.729,.189),l(-1.135,.075),l(-1.119,.248),l(-.502,.318),l(-.463,.059),l(-.453,-.316),l(-.369,.621),l(-.31,.188),l(-.477,.044),l(-.438,-.057),l(-.959,.031),l(-.5,.16),l(.641,.287),l(1.957,1.004),l(.053,.172),l(-.093,.188),l(.163,.244),l(.562,.042),l(.511,-.13),l(.675,-.146),l(1.052,.013),l(.439,.114),l(-.235,.259),l(-.106,.245),l(-.228,.144),l(-.578,.116),l(-.31,.029),l(-.591,-.157),l(-.473,.044),l(-.71,.489),l(-1.007,.045),l(-.538,.188),l(-.527,.488),l(-.269,.101),l(-.786,-.07),l(-.588,-.171),l(.364,-.746),l(-.096,-.416),l(-.264,-.287),l(-.854,-.286),l(-.193,-.014),l(-.629,.016),l(-.151,.043),l(-.16,-.187),l(.887,-.505),l(.644,-.261),l(.772,-.188),l(.221,-.116),l(-.246,-.46),l(-.435,-.071),l(-.799,.044),l(-1.015,.045),l(-.698,-.1),l(-.195,-.101),l(-.418,-.432),l(.584,-.405),l(-.528,-.605),l(-.378,.361),l(-.541,.001),l(-1.001,.146),l(-.565,.131),l(-.694,.722),l(-1.003,.867),l(-.754,.203),l(-.223,.044),l(-.287,.504),l(.079,.158),l(.178,.093),l(-.706,-.131),l(-.665,.261),l(-.457,0),l(-.033,.189),l(-.609,-.047),l(-.398,-.166),l(-.119,-.249),l(-.15,.02),l(.055,-.077),l(.102,-.025),l(.126,.013),l(.113,.013),l(.189,0),l(.088,-.114),l(0,-.088),l(-.063,-.113),l(.025,-.113),l(.126,-.063),l(.051,-.063),l(.075,-.013),l(.089,-.025),l(.088,-.063),l(.089,-.088),l(.024,-.126),l(-.013,-.114),l(.14,-.013),l(.29,-.063),l(.075,-.076),l(-.025,-.088),l(-.062,-.088),l(.126,-.114),l(.037,-.063),l(-.012,-.088),l(-.114,-.113),l(.051,-.101),l(-.088,-.151),l(-.063,-.101),l(.202,-.151),l(.239,-.025),l(.126,-.088),l(.113,.025),l(.013,.088),l(-.013,.214),l(.063,.013),l(.113,0),V(0,96.92),l(-.013,-.063),l(.101,.038),l(.063,.051),l(.025,-.076),l(.075,-.038),l(.139,-.012),l(0,.075),l(.089,.063),l(.075,0),l(.126,.164),l(.076,-.076),l(.075,-.076),l(.013,-.05),l(.101,-.025),l(.177,0),l(-.037,.189),l(.176,.025),l(.038,-.038),l(.038,-.038),l(.139,.013),l(.227,0),l(.038,-.025),l(.075,-.076),l(-.126,-.013),l(-.164,-.126),l(-.101,-.051),l(-.075,-.05),l(.013,-.038),l(.101,-.063),l(-.025,-.113),l(.038,-.101),l(-.013,-.126),l(-.051,-.139),l(-.101,-.063),l(-.177,-.076),l(-.075,0),l(-.151,-.126),l(-.151,-.063),l(-.151,-.038),l(.051,-.151),l(.037,-.088),l(-.037,-.051),l(-.127,.038),l(-.062,-.114),l(.113,-.038),l(-.013,-.189),l(.089,-.075),l(-.025,-.101),l(-.038,-.088),l(-.113,0),l(-.102,.05),l(-.088,.051),l(-.113,-.088),l(-.089,-.101),l(-.188,-.101),l(-.139,-.025),l(-.102,-.139),l(-.05,-.139),l(.177,-.139),l(0,-.189),l(.024,-.114),l(.051,-.05),l(-.126,-.063),l(.164,-.151),l(-.113,-.025),l(-.076,-.063),l(-.062,-.126),l(-.14,-.013),l(-.062,.101),l(-.126,-.025),l(-.215,-.025),l(-.126,-.189),l(-.05,-.189),l(-.417,-.075),l(-.277,.012),l(-.062,.051),l(-.076,.101),l(-.062,-.05),l(0,-.076),l(-.089,-.025),l(-.101,.038),l(.038,-.05),l(.088,-.101),l(-.025,-.063),l(-.113,0),l(-.177,.038),l(-.126,-.025),l(-.101,.013),l(-.076,-.076),l(-.05,-.063),l(-.101,-.063),l(-.151,-.013),l(-.139,-.05),l(-.14,-.126),l(-.214,-.088),l(-.038,-.013),l(-.126,.025),l(-.05,.025),l(-.114,-.051),l(-.088,-.025),l(-.139,.025),l(-.177,.051),l(-.177,-.025),l(-.062,.038),l(-.126,.114),l(-.202,0),l(-.265,-.038),l(-.126,.051),l(-.315,-.114),l(-.088,.101),l(.012,.113),l(-.126,0),l(-.075,-.063),l(-.126,.114),l(-.06,.052),l(-.634,.08),l(-.151,.311),l(-.278,.178),l(-1.992,.191),l(-.186,.215),l(-.243,.119),l(-.339,.06),l(-.188,-.227),l(-.327,.004),l(-.025,-.231),l(-.363,.045),l(-1.115,-.066),l(-.958,-.193),l(-.241,.107),l(-.787,-.121),l(-.136,.085),l(-.678,-.387),l(-.554,-.2),l(-.668,-.301),l(-.166,.015),l(1.047,-1.471),l(.653,.018),l(-.349,-.383),l(-.044,-.552),l(.082,-.306),l(1.509,-1.218),l(.599,-.398),l(.286,-.181),l(.429,-.013),l(.255,-.24),l(.009,-.314),l(-.328,-.302),l(.085,-.133),l(.298,-.048),l(-.316,-.193),l(-.816,-.835),l(.074,-.242),l(-.161,-.175), +N(660.044,89.132),l(-.295,.31),l(-.687,1.207),l(-1.224,1.959),l(-.381,.58),l(.269,.836),l(.051,.029),l(.342,-.045),l(.929,-.395),l(.754,-.062),l(.576,-.018),l(.317,.085),l(.431,.416),l(.292,.07),l(1.191,-.786),l(.438,-.002),l(.928,.212),l(.538,.199),l(.797,.5),l(.879,.99),l(.599,.501),l(.048,.273),l(-.107,.217),l(-.414,.218),l(-.464,-.127),l(-1.074,-.008),l(-.432,-.099),l(-.854,.033),l(-.937,.221),l(-.539,.146),l(-.831,.278),l(-.353,.189),l(-.483,-.127),l(-.464,.045),l(-.47,.204),l(-.363,.333),l(-.312,.82),l(-.241,.216),l(-.347,.188),l(-.638,.248),l(-.896,.134),l(-.624,-.054),l(-.438,-.012),l(-.224,-.013),l(-1.192,.91),l(-.742,.433),l(-.744,.047),l(-.982,.005),l(-.592,-.125),l(-.668,-.382),l(-.718,-.154),l(-.316,.073),l(-.457,.231),l(-.539,.589),l(-.214,.401),l(.003,.343),l(.389,.569),l(.599,.411),l(.188,.228),l(-.123,.271),l(-.326,.259),l(-1.265,.292),l(-.67,.389),l(-1.111,1.046),l(-.265,.172),l(-1.941,.737),l(-.651,.061),l(-.987,-.08),l(-1.514,.065),l(-1.339,.007),l(-1.204,.349),l(-.816,.289),l(-.736,.274),l(-.303,.101),l(-1.44,.534),l(-.686,.289),l(-.481,.017),l(-.433,-.197),l(-.253,-.297),l(-.61,-.067),l(-.663,.061),l(-.929,-.123),l(-1.599,-.433),l(-1.006,-.365),l(-.815,-.551),l(-.521,-.168),l(-1.69,-.119),l(-1.164,-.022),l(-.937,-.023),l(-2.861,.059),l(-1.165,-.022),l(-.802,-.109),l(-1.241,-.207),l(-1.979,-.018),l(-.444,-.254),l(-.467,-.439),l(-1.571,-2.161),l(-.105,-.542),l(-.744,-.096),l(-.839,-.31),l(-1.645,-.806),l(-.632,-.268),l(-.998,-.224),l(-.668,-.083),l(-.995,-.038),l(-1.505,-.021),l(-1.062,-.181),l(-.724,-.312),l(-.233,-.229),l(-.105,-.43),l(.035,-.129),l(.369,-.347),l(.214,-.389),l(.237,-.75),l(.215,-.447),l(-.401,-.66),l(-1.07,-1.451),l(-.568,-.618),l(-.354,-.143),l(-.633,-.144),l(-.731,-.167),l(-.614,-.069),l(-.834,-.415),l(-1.301,-.745),l(-.371,-.433),l(-.24,-.563),l(-.131,-.405),l(-.062,-.145),l(.154,-.044),l(.799,-.425),l(.599,-.207),l(1.387,-.08),l(.603,-.148),l(.727,-.381),l(.017,-.012),l(.971,-.692),l(.787,-.398),l(1.143,-.341),l(1.512,-.476),l(.84,-.18),l(.953,.097),l(.932,.156),l(1.842,.122),l(.831,.083),l(.694,.755),l(.393,.406),l(.699,.113),l(1.458,-.008),l(.719,.083),l(.85,-.004),l(.875,.068),l(.312,.114),l(.576,.186),l(.562,-.018),l(.755,-.28),l(.31,-.162),l(.744,-.572),l(.163,-.526),l(-.116,-.204),l(-.396,-.304),l(-.409,-.86),l(.098,-.293),l(.905,-.839),l(1.269,-.96),l(.84,.201),l(1.028,.098),l(1.036,.185),l(1.748,.328),l(.702,.231),l(.989,.317),l(.767,.143),l(.145,.204),l(.004,.541),l(.182,.481),l(.408,.451),l(.421,.333),l(1.643,.531),l(.673,.113),l(2.48,-.538),l(.796,-.077),l(1.172,.037),l(1.423,.022),l(.769,.229),l(1.333,.75),l(.623,.331),l(1.132,.313),l(.812,.373),l(1.318,.254),l(.905,.241),l(.984,.082),l(.739,.039),l(1.602,-.11),l(1.018,-.063),l(.532,-.075),l(.867,-.106),l(1.147,-.136),l(.526,-.163),l(.604,-.264),l(.447,-.394),l(.755,-.498),l(1.165,-.487),l(.333,-.002),l(.609,-.047),l(.74,.156),l(.751,.506),l(.34,.129),l(.86,.169),l(1.228,-.297),l(.622,-.018),l(.431,.168), +N(406.183,86.551),l(1.051,-.494),l(.485,-.089),l(.574,.087),l(.465,-.016),l(.209,-.147),l(.477,.098),l(.407,.042),l(.52,-.034),l(-.025,-.157),l(.307,.012),l(.307,0),l(.267,-.182),l(.313,.242),l(.173,-.121),l(.228,.061),l(.292,.375),l(.535,-.109),l(.754,.375),l(-.11,.423),l(-.172,.097),l(.001,.338),l(.672,-.024),l(.344,.177),l(.282,.365),l(.038,.468),l(-.422,.376),l(-.225,-.072),l(-.142,.08),l(-.245,.147),l(-.213,.322),l(.017,.327),l(.31,.204),l(-.136,.348),l(-.079,-.114),l(-.694,.174),l(-.127,-.228),l(-.371,-.204),l(-.341,-.192),l(-.529,-.048),l(.039,-.228),l(-.146,-.18),l(.119,-.373),l(-.245,.072),l(-.193,.313),l(-.446,.035),l(-.406,.075),l(-.285,-.122),l(.072,-.198),l(-.091,-.175),l(.159,-.241),l(-.375,-.168),l(-.576,-.048),l(-.259,.012),l(-.159,-.301),l(-.518,.012),l(-.194,-.133),l(-.202,-.458),l(-.153,-.17),l(-.41,.208),l(-.141,.071),l(-.266,-.127),l(-.311,-.335),l(-.208,-.447), +N(438.22,91.952),l(.039,-.044),l(.065,-.105),l(.014,-.131),l(.092,-.066),l(.146,-.119),l(.026,-.04),l(.171,-.053),l(.093,-.026),l(.092,.053),l(.132,.053),l(.158,0),l(.065,-.026),l(.093,0),l(.065,.026),l(.065,.026),l(.093,-.026),l(.145,-.04),l(.132,0),l(.118,-.053),l(.079,-.053),l(.066,-.026),l(.105,-.026),l(.039,0),l(.053,-.079),l(.04,-.092),l(.079,-.079),l(.092,.026),l(.105,-.04),l(.145,-.066),l(.053,-.105),l(.053,-.079),l(.026,-.132),l(.026,-.092),l(.053,-.092),l(.118,-.013),l(.105,-.013),l(.132,-.079),l(.119,-.053),l(.118,-.092),l(.053,-.079),l(.132,-.066),l(.065,-.04),L(442,89.998),l(.145,.013),l(.105,.026),l(.066,-.04),l(.065,-.066),l(.071,.012),l(.285,.041),l(.03,.228),l(.43,-.048),l(.183,-.24),l(.193,.016),l(.062,-.112),l(.261,-.024),l(.194,.24),l(.073,.169),l(.331,-.025),l(.066,.18),l(-.026,.083),l(.003,.204),l(.389,-.083),l(.18,.12),l(.149,-.135),l(.104,-.177),l(.558,-.204),l(.168,.056),l(.483,-.046),l(.46,.254),l(.373,-.18),l(.073,-.137),l(.508,.041),l(.561,-.076),l(.129,.13),l(.703,.186),l(.104,.216),l(.424,.101),l(.831,.33),l(-1.047,1.471),l(-.629,.076),l(-.437,-.143),l(-.534,-.359),l(-1.062,.035),l(-.717,.047),l(-1.024,.759),L(444.857,93),l(-.59,-.072),l(-.499,.061),l(-.761,.134),l(-.255,.001),l(-.334,.568),l(-1.651,-.036),l(-.414,-.027),l(-.617,-.17),l(-.399,-.172),l(-.245,.146),l(-.761,-.547),l(-.155,-.26),l(.097,-.581),l(-.053,-.093), +N(442.391,98.111),l(-.589,.203),l(-.433,.031),l(-.668,.047),l(-.58,-.098),l(-1.116,-.671),l(-1.412,-.612),l(-.215,-.197),l(-.364,-.333),l(-.304,-.59),l(.346,-.299),l(.154,-.294),l(-.204,-.188),l(.04,-.375),l(.409,-.062),l(.157,-.206),l(-.136,-.196),l(-.452,-.063),l(.223,-.197),l(.325,0),l(.164,.134),l(.701,-.054),l(.019,-.367),l(.636,-.291),l(.245,-.146),l(.399,.172),l(.617,.17),l(.414,.027),l(1.651,.036),l(.334,-.568),l(.255,-.001),l(.761,-.134),l(.499,-.061),l(.59,.072),l(.427,-.063),l(1.024,-.759),l(.717,-.047),l(1.062,-.035),l(.534,.359),l(.437,.143),l(.629,-.076),l(.166,-.015),l(.668,.301),l(.554,.2),l(.678,.387),l(-.45,.338),l(-1.125,.267),l(-.581,.408),l(-.968,1.451),l(-.63,.84),l(-.753,.567),l(-.361,.16),l(-.724,.047),l(-.264,.103),l(-.176,-.002),l(-.907,-.067),l(-.889,.077),l(-1.535,.529), +N(459.717,92.836),l(.06,-.052),l(.126,-.114),l(.075,.063),l(.126,0),l(-.012,-.113),l(.088,-.101),l(.315,.114),l(.126,-.051),l(.265,.038),l(.202,0),l(.126,-.114),l(.062,-.038),l(.177,.025),l(.177,-.051),l(.139,-.025),l(.088,.025),l(.114,.051),l(.05,-.025),l(.126,-.025),l(.038,.013),l(.214,.088),l(.14,.126),l(.139,.05),l(.151,.013),l(.101,.063),l(.05,.063),l(.076,.076),l(.101,-.013),l(.126,.025),l(.177,-.038),l(.113,0),l(.025,.063),l(-.088,.101),l(-.038,.05),l(.101,-.038),l(.089,.025),l(0,.076),l(.062,.05),l(.076,-.101),l(.062,-.051),l(.277,-.012),l(.417,.075),l(.05,.189),l(.126,.189),l(.215,.025),l(.126,.025),l(.062,-.101),l(.14,.013),l(.062,.126),l(.076,.063),l(.113,.025),l(-.164,.151),l(.126,.063),l(-.051,.05),l(-.024,.114),l(0,.189),l(-.177,.139),l(.05,.139),l(.102,.139),l(.139,.025),l(.188,.101),l(.089,.101),l(.113,.088),l(.088,-.051),l(.102,-.05),l(.113,0),l(.038,.088),l(.025,.101),l(-.089,.075),l(.013,.189),l(-.113,.038),l(.062,.114),l(.127,-.038),l(.037,.051),l(-.037,.088),l(-.051,.151),l(.151,.038),l(.151,.063),l(.151,.126),l(.075,0),l(.177,.076),l(.101,.063),l(.051,.139),l(.013,.126),l(-.038,.101),l(.025,.113),l(-.101,.063),l(-.013,.038),l(.075,.05),l(.101,.051),l(.164,.126),l(.126,.013),l(-.075,.076),l(-.038,.025),l(-.227,0),l(-.139,-.013),l(-.038,.038),l(-.038,.038),l(-.176,-.025),l(.037,-.189),l(-.177,0),l(-.101,.025),l(-.013,.05),l(-.075,.076),l(-.076,.076),l(-.126,-.164),l(-.075,0),l(-.089,-.063),l(0,-.075),l(-.139,.012),l(-.075,.038),l(-.025,.076),l(-.063,-.051),l(-.101,-.038),l(.013,.063),l(0,.088),l(-.113,0),l(-.063,-.013),l(.013,-.214),l(-.013,-.088),l(-.113,-.025),l(-.126,.088),l(-.239,.025),l(-.202,.151),l(.063,.101),l(.088,.151),l(-.051,.101),l(.114,.113),l(.012,.088),l(-.037,.063),l(-.126,.114),l(.062,.088),l(.025,.088),l(-.075,.076),l(-.29,.063),l(-.14,.013),l(.013,.114),l(-.024,.126),l(-.089,.088),l(-.088,.063),l(-.089,.025),l(-.075,.013),l(-.051,.063),l(-.126,.063),l(-.025,.113),l(.063,.113),l(0,.088),l(-.088,.114),l(-.189,0),l(-.113,-.013),l(-.126,-.013),l(-.102,.025),l(-.055,.077),l(-.03,.004),l(-.062,-.237),l(-.218,-.106),l(.16,-.071),l(-.021,-.267),l(-.104,-.561),l(.323,-.978),l(.027,-.404),l(-.353,-.856),l(-.604,-.286),l(-1.037,-1.119),L(460.567,93),l(-.626,-.191),l(-.225,.028), +N(445.722,97.573),l(.176,.002),l(.264,-.103),l(.724,-.047),l(.361,-.16),l(.753,-.567),l(.63,-.84),l(.968,-1.451),l(.581,-.408),l(1.125,-.267),l(.45,-.338),l(.136,-.085),l(.787,.121),l(.241,-.107),l(.958,.193),l(1.115,.066),l(.363,-.045),l(.025,.231),l(.327,-.004),l(.188,.227),l(.339,-.06),l(.243,-.119),l(.186,-.215),l(1.992,-.191),l(.278,-.178),l(.151,-.311),l(.634,-.08),l(.225,-.028),L(460.567,93),l(.767,1.17),l(1.037,1.119),l(.604,.286),l(.353,.856),l(-.027,.404),l(-.323,.978),l(.104,.561),l(.021,.267),l(-.16,.071),l(.218,.106),l(.062,.237),l(.03,-.004),l(.15,-.02),l(.119,.249),l(.398,.166),l(.609,.047),l(.033,-.189),l(.457,0),l(.665,-.261),l(.706,.131),l(.149,.079),l(.062,.259),l(-.293,.446),l(-.27,.316),l(-.436,.044),l(-.382,.043),l(-.382,.245),l(-.515,.617),l(-.252,.645),l(-.096,.787),l(-.044,.223),l(-.671,-.12),l(-1.346,-.336),l(-.514,-.226),l(-.295,-.042),l(-.671,-.369),l(-.562,-.04),l(-.618,.218),l(-1.904,.771),l(-.38,.059),l(-1.385,-.35),l(-.3,-.013),l(-.69,.261),l(-.34,.031),l(-1.151,-.395),l(-.506,-.002),l(-.771,.189),l(-.266,.023),l(-.048,-.189),l(.234,-.318),l(-.352,-.106),l(-.392,-.204),l(-.418,-.186),l(-.146,-.33),l(.32,-.201),l(.351,.012),l(-.114,-.13),l(-.625,-.248),l(-.253,.13),l(-.215,.283),l(-.147,.118),l(-.414,-.239),l(-.194,-.139),l(-.594,-.059),l(-.02,-.189),l(-.234,0),l(-.245,-.036),l(-.052,-.165),l(.178,-.094),l(.271,-.071),l(-.239,-.083),l(-.183,-.059),l(.124,-.146),l(.19,-.127),l(-.069,-.142),l(-.306,-.118),l(-.555,-.141),l(-.712,-.471),l(.058,-.088),l(-.104,-.119),l(.075,-.356),l(-.202,-.036),l(-.19,-.237),l(-.569,-.178),l(-.054,-.309), +N(420.177,113.472),l(-.274,-.042),l(-.253,-.155),l(-.367,-.325),l(-.096,-.213),l(.202,-.738),l(.097,-.681),l(-.046,-.583),l(-.133,-.569),l(-.503,-.44),l(-.094,-.271),l(.181,-.157),l(.366,-.015),l(.801,-.001),l(.339,-.172),l(.861,-.543),l(.633,.625),l(.451,.754),l(-.014,.271),l(-.204,.285),l(-.145,.484),l(.149,.894),l(-.11,.525),l(-.377,.695),l(-.405,-.198),l(-.52,.03),l(-.143,.1),l(-.149,.27),l(-.248,.17),M(433.783,118.446),l(-.712,-.084),l(-.902,-.607),l(-.772,-.239),l(-1.904,-.817),l(-.833,-.126),l(-.232,-.127),l(-.173,-.283),l(.139,-.34),l(.328,-.34),l(.264,-.1),l(.629,.112),l(.569,-.341),l(.68,.424),l(.403,.141),l(.722,-.016),l(1.403,-.187),l(1.38,-.329),l(.148,.085),l(.043,.127),l(-.112,.127),l(-.536,.823),l(-.153,.497),l(.009,.382),l(.411,.509),l(-.179,.128),l(-.43,.567),l(-.188,.015),M(431.244,98.829),l(-.281,-.329),l(-.242,-.027),l(-.281,.196),l(-.156,-.125),l(-.47,-.071),l(-.114,.32),l(-.458,.054),l(-1.001,.364),l(.078,-.151),l(-.452,.133),l(-.063,.249),l(-.157,.044),l(-.01,.125),l(.303,.08),l(.021,.302),l(.193,.119),l(.253,.236),l(-.104,.213),l(-.449,.254),l(.016,.272),l(.143,.554),l(.783,.814),l(2.008,.889),l(.29,.357),l(.134,.558),l(.274,.557),l(.395,.585),l(.694,.57),l(.254,.274),l(.446,.195),l(.041,.21),l(.408,.167),l(1.17,.255),l(1.254,-.105),l(.388,.141),l(.024,.212),l(-.465,.247),l(-.258,.294),l(.262,.213),l(.954,.283),l(1.168,.411),l(.829,.366),l(1.589,.739),l(.058,.185),l(.719,.458),l(.31,.475),l(-.198,.435),l(-.152,.337),l(-.455,-.281),l(-.318,-.167),l(-.109,-.486),l(-.263,-.17),l(-.512,-.099),l(-.483,-.009),l(-.439,-.236),l(.086,-.217),l(-.353,-.065),l(-.301,.098),l(-.232,.262),l(-.259,.399),l(-.273,.208),l(.043,.271),l(-.197,.303),l(-.007,.298),l(.76,.342),l(.611,.271),l(-.093,.314),l(.03,.432),l(.133,.142),l(-.191,.238),l(-.659,-.024),l(-.41,.219),l(-.202,.228),l(.11,.595),l(-.536,.303),l(-.617,.866),l(-.595,.048),l(-.167,-.071),l(-.184,-.14),l(-.002,-.508),l(.364,-.141),l(.317,-.542),l(-.236,-.184),l(.361,-.249),l(.361,.074),l(.133,-.17),l(-.077,-.34),l(-.211,-.181),l(-.206,-.924),l(-.367,-.516),l(-.15,-.607),l(-.201,-.352),l(-.334,.058),l(-.187,.171),l(-.899,-.496),l(-.286,-.065),l(.208,-.291),l(-.092,-.398),l(-.461,-.34),l(-.909,.247),l(.034,-.109),l(.322,-.194),l(-.276,-.27),l(-.29,-.003),l(-.42,.19),l(-.242,-.512),l(-.198,-.207),l(-.124,-.228),l(-.663,-.241),l(-.505,-.027),l(-.654,-.127),l(-.745,-.355),l(-.548,-.441),l(-.959,-.612),l(-1.036,-.826),l(-.872,-.384),l(-.805,-.67),l(-.566,-.856),l(-.434,-1.043),l(-.347,-.443),l(-.505,-.457),l(-.483,-.243),l(-1.188,-.341),l(-.579,-.142),l(-.5,.044),l(-1.078,.647),l(-.46,.359),l(-.646,.173),l(-.303,.043),l(.146,-.469),l(-.062,-.281),l(-.849,.07),l(-.754,-.391),l(-.193,-.442),l(.315,-.371),l(.175,-.01),l(-.135,-.331),l(-.616,-.191),l(-.352,-.358),l(.437,-.186),l(.183,.111),l(.541,-.353),l(.199,-.272),l(-.43,-.192),l(-.025,-.292),l(-.532,-.344),l(.624,-.301),l(.599,.062),l(.627,-.204),l(.629,.168),l(.275,-.16),l(.349,-.432),l(-.103,-.212),l(.777,-.404),l(.016,.415),l(.534,.363),l(.311,.071),l(-.098,.182),l(.385,.312),l(.285,-.151),l(.018,-.535),l(.425,-.384),l(-.019,-.333),l(.371,-.081),l(.143,.354),l(.23,.142),l(.216,-.03),l(.071,-.122),l(.469,-.05),l(.244,.333),l(.228,-.415),l(-.244,-.131),l(.081,-.273),l(.283,-.091),l(.176,.162),l(.315,.051),l(.038,-.192),l(-.112,-.212),l(.126,-.309),l(.631,.171),l(.597,.034),l(.329,-.411),l(.366,-.096),l(.183,.083),l(.445,-.11),l(.301,.103),l(.856,-.227),l(.023,.363),l(.318,.096),l(.32,.391),l(1.311,.247),l(.894,.082),l(.478,.112),l(.116,.199),l(-.614,.303),l(.098,.151),l(.297,.002),l(.187,.185),l(-.367,.285),l(.336,.089),l(-.127,.361),l(.36,.11),l(.284,.198),l(-.056,.214), +N(430.73,96.731),l(1.04,.065),l(.179,.107),l(.612,-.009),l(.287,.152),l(.646,-.5),l(.566,-.107),l(.85,.08),l(.298,-.196),l(.89,.116),l(-.082,-.393),l(.693,-.157),l(.304,.59),l(.364,.333),l(-.035,-.009),l(-.1,-.073),l(-.145,-.036),l(-.172,0),l(-.145,.009),l(-.055,.063),l(0,.072),l(.019,.09),l(.009,.082),l(-.063,.009),l(-.136,-.009),l(-.108,-.036),l(-.091,.063),l(-.045,.082),l(-.081,.063),l(-.082,.045),l(-.081,.009),l(-.163,.036),l(-.117,.036),l(-.108,.036),l(-.055,.045),l(-.153,-.009),l(-.127,.072),l(-.063,.054),l(-.018,.082),l(.036,.072),l(.081,.054),l(.063,.055),l(.045,.045),l(.019,.063),l(.018,.09),l(-.036,.108),l(-.018,.063),l(-.046,.1),l(-.108,0),l(-.081,-.009),l(-.091,.027),l(-.108,.009),l(-.117,.054),l(-.091,.018),l(-.081,.027),l(-.1,.045),l(-.055,.063),l(-.036,.027),l(.055,.018),l(.063,.009),l(.026,.027),l(.037,.072),l(-.046,.063),l(-.027,.009),l(-.081,.027),l(-.009,.045),l(.045,.081),l(0,.072),l(.045,.1),l(-.054,.072),l(-.063,-.018),l(-.1,.045),l(-.117,.018),l(-.127,-.036),l(-.063,-.027),l(-.1,-.063),l(-.099,0),l(-.063,-.027),l(-.118,-.045),l(-.018,.045),l(-.027,.045),l(-.1,.027),l(-.136,0),l(-.054,-.045),l(-.072,-.063),l(-.127,-.018),l(-.019,-.09),l(-.026,-.018),l(-.063,-.054),l(-.055,-.027),l(-.018,-.054),l(-.01,-.054),l(-.036,-.009),l(-.063,.018),l(-.036,.054),l(-.009,.027),l(-.054,.063),l(-.019,.018),l(-.018,.081),l(-.063,.045),l(-.046,.018),l(-.062,.054),l(-.036,.009),l(-.254,0),l(-.108,-.027),l(-.108,.027),l(-.145,.009),l(-.1,-.009),l(-.1,-.036),l(-.045,-.019),l(-.055,0),l(0,.037),l(0,.036),l(-.045,.027),l(-.045,.018),l(-.136,-.009),l(-.027,-.036),l(-.108,.018),l(-.019,.018),l(-.136,.018),l(-.063,.018),l(-.126,.018),l(-.272,-.063),l(.428,-.077),l(.113,-.16),l(.056,-.214),l(-.284,-.198),l(-.36,-.11),l(.127,-.361),l(-.336,-.089),l(.367,-.285),l(-.187,-.185),l(-.297,-.002),l(-.098,-.151),l(.614,-.303),l(-.116,-.199), +N(439.573,104.709),l(-1.051,-.672),l(-.185,-.222),l(-.783,-.149),l(-.203,-.159),l(-.403,-.115),l(-.683,.177),l(-.326,-.486),l(-1.112,-.627),l(-.584,-.678),l(.277,.007),l(.608,.016),l(-.583,-.221),l(-.659,-.469),l(-.183,-.407),l(.086,-.452),l(-.289,-.336),l(-.646,-.418),l(-.378,-.126),l(-.258,.579),l(-.142,.116),l(.03,.15),l(-.284,.106),l(-.154,.248),l(-.213,.053),l(-.496,-.647),l(-.063,-.286),l(-.259,-.612),l(.065,-.012),l(.272,.063),l(.126,-.018),l(.063,-.018),l(.136,-.018),l(.019,-.018),l(.108,-.018),l(.027,.036),l(.136,.009),l(.045,-.018),l(.045,-.027),l(0,-.036),l(0,-.037),l(.055,0),l(.045,.019),l(.1,.036),l(.1,.009),l(.145,-.009),l(.108,-.027),l(.108,.027),l(.254,0),l(.036,-.009),l(.062,-.054),l(.046,-.018),l(.063,-.045),l(.018,-.081),l(.019,-.018),l(.054,-.063),l(.009,-.027),l(.036,-.054),l(.063,-.018),l(.036,.009),l(.01,.054),l(.018,.054),l(.055,.027),l(.063,.054),l(.026,.018),l(.019,.09),l(.127,.018),l(.072,.063),l(.054,.045),l(.136,0),l(.1,-.027),l(.027,-.045),l(.018,-.045),l(.118,.045),l(.063,.027),l(.099,0),l(.1,.063),l(.063,.027),l(.127,.036),l(.117,-.018),l(.1,-.045),l(.063,.018),l(.054,-.072),l(-.045,-.1),l(0,-.072),l(-.045,-.081),l(.009,-.045),l(.081,-.027),l(.027,-.009),l(.046,-.063),l(-.037,-.072),l(-.026,-.027),l(-.063,-.009),l(-.055,-.018),l(.036,-.027),l(.055,-.063),l(.1,-.045),l(.081,-.027),l(.091,-.018),l(.117,-.054),l(.108,-.009),l(.091,-.027),l(.081,.009),l(.108,0),l(.046,-.1),l(.018,-.063),l(.036,-.108),l(-.018,-.09),l(-.019,-.063),l(-.045,-.045),l(-.063,-.055),l(-.081,-.054),l(-.036,-.072),l(.018,-.082),l(.063,-.054),l(.127,-.072),l(.153,.009),l(.055,-.045),l(.108,-.036),l(.117,-.036),l(.163,-.036),l(.081,-.009),l(.082,-.045),l(.081,-.063),l(.045,-.082),l(.091,-.063),l(.108,.036),l(.136,.009),l(.063,-.009),l(-.009,-.082),l(-.019,-.09),l(0,-.072),l(.055,-.063),l(.145,-.009),l(.172,0),l(.145,.036),l(.1,.073),l(.035,.009),l(.215,.197),l(1.412,.612),l(1.116,.671),l(.58,.098),l(.668,-.047),l(.433,-.031),l(.589,-.203),l(.201,.142),l(.056,.089),l(.022,.112),l(-.022,.078),l(.045,.044),l(.011,.067),l(-.078,.056),l(-.011,.146),l(.078,.067),l(.145,-.034),l(.101,.034),l(.045,.089),l(-.078,.011),l(-.056,-.022),l(-.022,.078),l(.033,.1),l(-.045,.034),l(-.044,.022),l(.066,.111),l(.168,-.022),l(.033,.078),l(.123,.1),l(.122,0),l(.101,0),l(.09,.078),l(.122,.011),l(.134,0),l(.012,.078),l(-.033,.056),l(-.135,-.011),l(-.089,-.034),l(-.067,.022),l(-.078,-.011),l(-.066,-.045),l(-.056,-.011),l(-.045,.011),l(.033,.067),l(-.101,.089),l(-.078,0),l(0,.156),l(.045,.067),l(-.033,.078),l(.022,.078),l(.011,.078),l(-.089,.033),l(-.09,-.033),l(-.056,.067),l(.078,.089),l(-.078,.011),l(-.189,.022),l(-.201,-.022),l(-.145,-.123),l(.056,-.101),l(-.045,-.089),l(-.123,-.011),l(-.022,-.112),l(-.145,-.056),l(-.146,-.045),l(-.101,.089),l(-.1,-.011),l(-.156,-.078),l(-.067,-.022),l(-.146,0),l(-.156,-.045),l(-.111,.067),l(-.134,.045),l(-.134,-.045),l(-.111,-.067),l(-.112,0),l(-.122,.089),l(-.168,.078),l(-.156,-.067),l(-.268,-.089),l(-.179,.011),l(-.156,.011),l(-.189,-.056),l(-.168,-.011),l(-.156,-.089),l(-.089,.078),l(-.111,.022),l(-.057,-.056),l(-.234,-.078),l(-.156,-.056),l(-.134,-.045),l(-.089,-.011),l(-.134,.123),l(-.112,-.011),l(-.223,-.022),l(-.168,-.033),l(-.212,.022),l(-.101,.111),l(-.145,.145),l(-.123,.201),l(-.201,-.022),l(-.256,-.134),l(-.156,-.19),l(-.101,-.111),l(-.312,-.034),l(-.123,.044),l(-.089,.179),l(-.045,.167),l(.045,.134),l(0,.078),l(.033,.212),l(-.123,.067),l(.022,.089),l(.134,.078),l(.09,.089),l(.122,.034),l(.101,.033),l(.179,.179),l(.146,.234),l(.089,.134),l(.022,.123),l(.156,.111),l(-.078,.056),l(-.012,.1),l(.022,.146),l(.168,-.011),l(.089,.111),l(.056,.123),l(.112,.111),l(.167,.045),l(.167,.033),l(.369,.357),l(.021,.167),l(.078,.044),l(.213,.078),l(.379,.357),l(.224,.123),l(.223,.067),l(.101,.056),l(0,.112),l(.078,.279),l(.201,.078),l(.189,.167),l(.146,.112),l(.245,.123),l(.067,.212),l(-.284,.083),M(439.792,104.833),l(.132,-.118),l(.134,.011),l(.123,.034),l(.045,.078),l(.066,.089),l(.146,.089),l(.179,.078),l(.212,.011),l(.312,.257),l(.045,.067),l(.134,-.033),l(.123,.022),l(.089,.034),l(.062,.063),l(.005,.004),l(-.022,.089),l(.033,.078),l(.082,.072),l(.029,.092),l(-.002,.1),l(-.589,-.367),l(-.549,-.371),l(-.789,-.378), +N(451.009,101.725),l(-.328,.346),l(-.383,.374),l(-.18,.302),l(.056,.271),l(1.326,1.122),l(.028,.2),l(-.302,.302),l(-.762,.333),l(-.246,.301),l(-.008,.514),l(-.013,.208),l(-.058,-.017),l(-.072,.029),l(-.16,.022),l(-.145,.021),l(-.116,.022),l(-.058,.015),l(-.102,-.051),l(-.087,.043),l(-.088,.021),l(-.102,-.043),l(-.064,-.021),l(-.131,.116),l(-.087,.08),l(-.152,-.015),l(-.196,-.007),l(-.064,.007),l(-.175,-.043),l(-.152,.087),l(-.151,.102),l(-.109,.058),l(.059,.072),l(-.029,.058),l(-.116,0),l(-.094,-.109),l(-.131,-.058),l(-.087,-.073),l(-.08,.065),l(-.116,.058),l(-.246,.058),l(-.225,.058),l(-.088,.058),l(-.058,.167),l(.029,.13),l(-.029,.072),l(-.072,.087),l(-.188,0),l(-.14,-.049),l(-.018,-.109),l(-.733,-.866),l(-.382,-.369),l(-.058,-.004),l(.109,-.286),l(0,-.067),l(-.078,-.067),l(-.101,0),l(-.056,-.056),l(.022,-.089),l(.111,-.033),l(.146,.011),l(.167,.033),l(.057,-.033),l(.021,-.067),l(.09,-.044),l(.134,-.022),l(.089,-.011),l(-.011,-.089),l(-.101,-.101),l(-.167,-.067),l(-.134,-.045),l(-.057,-.044),l(-.111,.022),l(-.078,-.045),l(-.033,-.067),l(-.123,-.101),l(-.078,-.1),l(-.066,-.022),l(-.067,.044),l(-.078,-.011),l(-.101,-.056),l(-.279,-.078),l(-.078,-.022),l(-.056,-.033),l(-.167,-.134),l(-.101,-.146),l(-.111,-.111),l(-.168,-.078),l(-.156,-.101),l(-.223,-.056),l(0,-.101),l(.179,-.101),l(.089,-.111),l(.078,-.011),l(.067,.034),l(.078,.044),l(.1,.022),l(.045,-.022),l(.012,-.134),l(.011,-.19),l(-.134,-.145),l(-.179,-.19),l(-.212,-.134),l(-.101,-.145),l(.101,.022),l(.101,.011),l(.145,.056),l(.224,.044),l(.134,-.078),l(.089,-.056),l(.067,-.078),l(-.089,-.044),l(-.135,-.022),l(-.089,-.089),l(-.123,-.078),l(-.156,-.089),l(-.033,-.101),l(-.045,-.1),l(-.212,.011),l(-.167,-.056),l(-.078,-.1),l(-.022,-.134),l(.078,-.067),l(0,-.089),l(-.033,-.1),l(.056,-.056),l(.066,-.078),l(.156,-.156),l(.156,-.223),l(.034,-.167),l(.056,-.1),l(-.022,-.067),l(-.123,-.022),l(-.179,-.011),l(-.156,0),l(-.212,.112),l(-.078,-.089),l(.056,-.067),l(.09,.033),l(.089,-.033),l(-.011,-.078),l(-.022,-.078),l(.033,-.078),l(-.045,-.067),l(0,-.156),l(.078,0),l(.101,-.089),l(-.033,-.067),l(.045,-.011),l(.056,.011),l(.066,.045),l(.078,.011),l(.067,-.022),l(.089,.034),l(.135,.011),l(.033,-.056),l(-.012,-.078),l(-.134,0),l(-.122,-.011),l(-.09,-.078),l(-.101,0),l(-.122,0),l(-.123,-.1),l(-.033,-.078),l(-.168,.022),l(-.066,-.111),l(.044,-.022),l(.045,-.034),l(-.033,-.1),l(.022,-.078),l(.056,.022),l(.078,-.011),l(-.045,-.089),l(-.101,-.034),l(-.145,.034),l(-.078,-.067),l(.011,-.146),l(.078,-.056),l(-.011,-.067),l(-.045,-.044),l(.022,-.078),l(-.022,-.112),l(-.056,-.089),l(-.201,-.142),l(1.535,-.529),l(.889,-.077),l(.907,.067),l(.054,.309),l(.569,.178),l(.19,.237),l(.202,.036),l(-.075,.356),l(.104,.119),l(-.058,.088),l(.712,.471),l(.555,.141),l(.306,.118),l(.069,.142),l(-.19,.127),l(-.124,.146),l(.183,.059),l(.239,.083),l(-.271,.071),l(-.178,.094),l(.052,.165),l(.245,.036),l(.234,0),l(.02,.189),l(.594,.059),l(.194,.139),l(.414,.239),l(.147,-.118),l(.215,-.283),l(.253,-.13),l(.625,.248),l(.114,.13),l(-.351,-.012),l(-.32,.201),l(.146,.33),l(.418,.186), +N(551.198,117.997),l(-.351,-.48),l(-.236,-.126),l(-1.217,-.05),l(-.646,-.011),l(-.096,-.016),l(.091,-.726),l(-.062,-.503),l(.157,-.251),l(.062,-.22),l(-.503,-.094),l(-.534,-.283),l(-.566,-.189),l(-.471,.063),l(-.378,-.251),l(-1.132,-.597),l(-.565,-.22),l(-.943,-.597),l(-.314,.063),l(-1.006,-.503),l(-.377,-.44),l(-1.194,-.597),l(-1.384,-.975),l(0,-.283),l(-.188,-.44),l(-.283,-.188),l(-.408,-.597),l(-.126,-.566),l(-.22,-.377),l(-.881,-.251),l(-.188,.157),l(-.439,.063),l(-.535,-.126),l(-.439,.032),l(-.503,.094),l(-.314,-.157),l(-.691,-.314),l(.094,-.22),l(.157,-.188),l(-.188,-.22),l(.031,-.188),l(.188,-.157),l(-.439,-.283),l(0,-.22),l(-.032,-.22),l(-.251,-.22),l(-.534,-.094),l(-.692,-.095),l(-.22,-.314),l(-.346,-.032),l(-.629,-.377),l(-.472,-.095),l(-.188,.063),l(-.565,.157),l(.251,.251),l(.188,.377),l(-.597,-.283),l(-.283,0),l(-.126,.126),l(-.22,.346),l(-.283,.126),l(-.629,0),l(-.503,.251),l(-.503,.409),l(-.062,.628),l(.314,.409),l(-.126,.314),l(-1.383,.032),l(-1.03,-.063),l(.056,-8.174),l(5.658,-1.289),l(5.722,2.986),l(2.012,1.666),l(2.578,-.346),l(2.767,.188),l(1.1,-.409),l(.724,.723),l(.597,.22),l(.66,1.006),l(.66,-.314),l(-.031,1.038),l(-.188,.409),l(.031,.754),l(1.006,0),l(.221,.817),l(.346,1.069),l(.503,.063),l(.691,-.032),l(1.006,-.094),l(.346,0),l(.44,.314),l(.062,.283),l(-.062,.283),l(.44,.346),l(.66,0),l(.125,-.188),l(-.157,-.409),l(.504,-.44),l(.439,-.188),l(.221,-.472),l(.282,-.188),l(.943,-.377),l(.755,-.189),l(.534,-.471),l(.346,-.283),l(.22,-.063),l(.283,.126),l(.377,-.377),l(.322,-.031),l(.349,-.126),l(.441,.246),l(-.368,.172),l(-.368,.171),l(-.221,.049),l(-.073,.196),l(-.295,.049),l(-.294,.172),l(-.196,.147),l(-.441,.295),l(-.172,.098),l(-.024,.123),l(.294,.049),l(.295,.074),l(.146,.123),l(.418,-.147),l(.098,.221),l(.172,.221),l(.368,.27),l(.589,0),l(.393,0),l(.049,-.393),l(.221,.049),l(.196,-.196),l(.024,-.245),l(.196,.098),l(.196,.172),l(.172,.294),l(.049,.147),l(.393,.024),l(.147,-.024),l(.073,.246),l(.025,.098),l(.343,-.025),l(.319,.147),l(.245,.196),l(.516,.074),l(.466,.024),l(.172,.123),l(-.49,.221),l(-.197,.147),l(-.221,.147),l(-.49,-.024),l(-.245,-.049),l(.049,.171),l(0,.147),l(-.319,0),l(-.172,.049),l(-.343,.196),l(-.221,.196),l(-.271,.049),l(-.221,.196),l(-.245,-.147),l(-.319,-.098),l(-.294,-.098),l(-.221,.025),l(-.246,.073),l(-.318,-.073),l(-.042,.098),l(-.345,-.005),l(-.409,.031),l(-.188,-.283),l(-.251,-.063),l(-.126,-.188),l(.251,-.126),l(.409,-.346),l(.188,-.22),l(-.252,-.251),l(-.439,-.377),l(-.221,.251),l(-.471,.346),l(-.692,.188),l(-.22,.157),l(-.252,-.22),l(-.22,-.157),l(-.346,0),l(.031,.22),l(-.283,.314),l(.189,.314),l(-.032,.346),l(-.062,.126),l(-.472,-.095),l(-.565,.095),l(-.503,.094),l(.251,.125),l(.534,-.031),l(.126,.094),l(-.251,.063),l(-.188,.063),l(-.032,.346),l(-.188,0),l(-.251,.157),l(-.063,.409),l(-.282,.188),l(-1.069,-.094),l(-.629,-.126),l(-.472,.283),l(-.125,.471),l(.251,.283),l(.346,.188),l(.157,.157),l(.44,.032),l(.346,0),l(.126,.22),l(-.126,.22),l(-.031,.472),l(.126,.409),l(.471,.314),l(.126,.283),l(-.157,.22),l(-.503,.346),l(-.283,.503),l(-.377,.377),l(.063,.377),l(-.375,.843), +N(439.792,104.833),l(-.113,-.054),l(-.105,-.07),l(.284,-.083),l(-.067,-.212),l(-.245,-.123),l(-.146,-.112),l(-.189,-.167),l(-.201,-.078),l(-.078,-.279),l(0,-.112),l(-.101,-.056),l(-.223,-.067),l(-.224,-.123),l(-.379,-.357),l(-.213,-.078),l(-.078,-.044),l(-.021,-.167),l(-.369,-.357),l(-.167,-.033),l(-.167,-.045),l(-.112,-.111),l(-.056,-.123),l(-.089,-.111),l(-.168,.011),l(-.022,-.146),l(.012,-.1),l(.078,-.056),l(-.156,-.111),l(-.022,-.123),l(-.089,-.134),l(-.146,-.234),l(-.179,-.179),l(-.101,-.033),l(-.122,-.034),l(-.09,-.089),l(-.134,-.078),l(-.022,-.089),l(.123,-.067),l(-.033,-.212),l(0,-.078),l(-.045,-.134),l(.045,-.167),l(.089,-.179),l(.123,-.044),l(.312,.034),l(.101,.111),l(.156,.19),l(.256,.134),l(.201,.022),l(.123,-.201),l(.145,-.145),l(.101,-.111),l(.212,-.022),l(.168,.033),l(.223,.022),l(.112,.011),l(.134,-.123),l(.089,.011),l(.134,.045),l(.156,.056),l(.234,.078),l(.057,.056),l(.111,-.022),l(.089,-.078),l(.156,.089),l(.168,.011),l(.189,.056),l(.156,-.011),l(.179,-.011),l(.268,.089),l(.156,.067),l(.168,-.078),l(.122,-.089),l(.112,0),l(.111,.067),l(.134,.045),l(.134,-.045),l(.111,-.067),l(.156,.045),l(.146,0),l(.067,.022),l(.156,.078),l(.1,.011),l(.101,-.089),l(.146,.045),l(.145,.056),l(.022,.112),l(.123,.011),l(.045,.089),l(-.056,.101),l(.145,.123),l(.201,.022),l(.189,-.022),l(.078,-.011),l(.212,-.112),l(.156,0),l(.179,.011),l(.123,.022),l(.022,.067),l(-.056,.1),l(-.034,.167),l(-.156,.223),l(-.156,.156),l(-.066,.078),l(-.056,.056),l(.033,.1),l(0,.089),l(-.078,.067),l(.022,.134),l(.078,.1),l(.167,.056),l(.212,-.011),l(.045,.1),l(.033,.101),l(.156,.089),l(.123,.078),l(.089,.089),l(.135,.022),l(.089,.044),l(-.067,.078),l(-.089,.056),l(-.134,.078),l(-.224,-.044),l(-.145,-.056),l(-.101,-.011),l(-.101,-.022),l(.101,.145),l(.212,.134),l(.179,.19),l(.134,.145),l(-.011,.19),l(-.012,.134),l(-.045,.022),l(-.1,-.022),l(-.078,-.044),l(-.067,-.034),l(-.078,.011),l(-.089,.111),l(-.179,.101),l(-.056,-.033),l(-.156,.056),l(-.112,-.022),l(-.066,-.044),l(-.112,.033),l(-.078,.056),l(.012,.078),l(.089,.1),l(.123,.167),l(.056,.101),l(-.056,.101),l(-.111,0),l(-.09,-.056),l(-.056,-.089),l(-.056,-.044),l(-.123,-.011),l(-.122,.056),l(-.168,.078),l(-.045,.101),l(-.044,.089),l(-.112,.101),l(.034,.089),l(.011,.1),L(442,104.458),l(-.134,.011),l(-.111,.022),l(-.101,.089),l(-.012,.134),l(.012,.112),l(.011,.145),l(.012,.044),l(.066,.112),l(.078,.089),l(.045,.101),l(-.09,.089),l(-.183,.108),l(-.062,-.063),l(-.089,-.034),l(-.123,-.022),l(-.134,.033),l(-.045,-.067),l(-.312,-.257),l(-.212,-.011),l(-.179,-.078),l(-.146,-.089),l(-.066,-.089),l(-.045,-.078),l(-.123,-.034),l(-.134,-.011),l(-.132,.118), +N(450.198,105.998),l(.013,-.208),l(.008,-.514),l(.246,-.301),l(.762,-.333),l(.302,-.302),l(-.028,-.2),l(-1.326,-1.122),l(-.056,-.271),l(.18,-.302),l(.383,-.374),l(.328,-.346),l(.392,.204),l(.352,.106),l(-.234,.318),l(.048,.189),l(.266,-.023),l(.771,-.189),l(.506,.002),l(1.151,.395),l(.34,-.031),l(.69,-.261),l(.3,.013),l(1.385,.35),l(.38,-.059),l(1.904,-.771),l(.618,-.218),l(.562,.04),l(.671,.369),l(.295,.042),l(.514,.226),l(1.346,.336),l(.671,.12),l(-.066,.335),l(-.077,.258),l(-.261,.086),l(-.313,-.028),l(-.339,.129),l(-.327,.73),l(-.039,.586),l(-.075,.143),l(-.404,.115),l(-.338,.372),l(-.017,.257),l(.252,-.036),l(.255,.224),l(.033,.154),l(.391,.375),l(.01,.223),l(-1.333,-.005),l(-.527,-.111),l(-.497,.045),l(-.629,.374),l(-.498,.445),l(-.363,-.026),l(-.344,.216),l(.097,.327),l(-.086,.257),l(-1.117,.277),l(-.388,.031),l(-.619,-.21),l(-1.473,-.505),l(-.584,.06),l(-.799,.261),l(-1.855,.195),l(-.09,.029),l(-.047,-.199),l(.104,-.3),l(.006,-.499),l(-.225,-.469),l(-.358,-.383),l(-.666,-.296),l(-.134,-.213),l(.007,-.106), +N(381.009,107),l(-.121,-.278),l(.138,-.4),l(.343,-.5),l(-.358,-.471),l(-.304,-.428),l(-.514,-.07),l(-.164,-.1),l(-.053,-.329),l(.163,-.243),l(.409,-.272),l(.365,-.101),l(.563,-.03),l(.634,-.03),l(.133,-.172),l(.068,-.415),l(.535,-.273),l(.763,.042),l(1.078,.37),l(.763,.07),l(.756,-.087),l(.577,-.173),l(.508,-.144),l(.354,-.001),l(.629,.285),l(.694,.156),l(.939,.084),l(1.538,.04),l(.583,.027),l(.957,.141),l(.491,-.158),l(.419,-.229),l(.531,.027),l(.891,.47),l(.67,-.016),l(.335,.062),l(.472,.243),l(.469,-.03),l(.058,.122),l(-.205,.243),l(.094,.106),l(.15,.03),l(.112,-.106),l(1.088,.334),l(.15,-.061),l(.507,.395),l(.056,-.076),l(.262,.03),l(.131,-.076),l(.431,.152),l(.028,.038),l(.084,.114),l(.767,-.03),l(.037,.122),l(.337,-.061),l(.542,.015),l(-.017,-.319),l(.355,0),l(1.252,.304),l(.091,.213),l(.035,.289),l(.187,.076),l(.374,-.076),l(.206,-.03),l(.335,.091),l(.036,.152),l(.261,.015),l(.395,-.167),l(.427,.197),l(.485,.015),l(.039,-.136),l(.75,-.137),l(.334,.091),l(-.001,.088),l(-.001,.463),l(.156,.1),l(-.062,.485),l(-1.112,.528),l(-.95,.385),l(-.267,.328),l(-1.046,.198),l(-.664,.116),l(-.96,.301),l(-.323,.326),l(-.053,.2),l(.261,.128),l(-.088,.157),l(-.628,.143),l(-.594,.783),l(-.886,.787),l(-.096,.192),l(-.18,.361),l(-.245,.45),l(.353,.827),l(.072,.111),l(.084,.13),l(.648,.295),l(.103,.185),l(-.621,.327),l(-.215,.105),l(-.515,.252),l(-.286,.479),l(-.224,.085),l(-.461,.926),l(.155,.322),l(-.257,.099),l(-.992,.049),l(-.581,.242),l(-.425,.327),l(-.274,.757),l(-.663,.496),l(-.258,-.213),l(-.599,.028),l(-.305,.27),l(-.342,0),l(-.121,-.113),l(-3.282,.042),l(-.69,.524),l(-1.021,.17),l(-.35,.382),l(-.028,.283),l(-.083,.085),l(-.073,-.212),l(-.068,-.014),l(.005,.241),l(-.389,.127),l(-.421,-.142),l(-.788,-.467),l(-.224,-.382),l(.036,-.262),l(-.345,-.113),l(-.125,-.213),l(.175,-.163),l(-.468,-.51),l(-.702,-.284),L(385,117.498),l(-.484,-.135),l(-.586,.039),l(.008,-.018),l(.304,-.951),l(.242,-.37),l(.884,-.643),l(-.408,-.31),l(-.812,-.123),l(.17,-.455),l(.506,-.655),l(.347,-.371),l(-.163,-.198),l(-.455,-.551),l(-.488,-.494),l(.288,-.129),l(.482,-.045),l(.458,-.229),l(.043,-.199),l(-.057,-.938),l(.132,-.983),l(-.072,-.456),l(.051,-.442),l(.084,-.072),l(1.234,-.506),l(.288,-.216),l(-.062,-.242),l(-.842,-.495),l(-.15,-.242),l(-.272,-.227),l(-.335,-.055),l(-.531,.26),L(382.981,107),l(-.531,-.439),l(-.55,.188),L(381.009,107), +N(489.685,103.693),l(.112,-.309),l(.26,-.166),l(.284,.047),l(.07,.047),l(.402,.023),l(.449,.023),l(.283,.095),l(.284,.142),l(.188,.094),l(.189,.047),l(.331,0),l(.213,0),l(.212,.166),l(.261,.095),l(.307,.071),l(.355,.047),l(.307,0),l(.426,-.095),l(.544,0),l(.401,.166),l(.189,0),l(.283,-.047),l(.354,.166),l(.095,.142),l(.284,.213),l(.52,.118),l(.354,.071),l(.236,.118),l(.308,.119),l(-.142,.118),l(-.048,.118),l(.261,.118),l(.212,.071),l(.261,-.118),l(.283,0),l(.166,-.166),l(.094,-.095),l(.213,-.071),l(.354,0),l(.261,.071),l(.188,.142),l(.142,-.166),l(.095,-.071),l(.118,0),l(.236,.118),l(.143,.094),l(.212,0),l(.189,.118),l(.213,.166),l(.378,0),l(.354,.024),l(.118,.142),l(-.118,.189),l(-.118,.307),l(.354,.284),l(.284,.166),l(.26,.094),l(.284,.047),l(.236,-.023),l(.236,.071),l(.126,.189),l(-.268,.189),l(-.143,.142),l(-.095,.071),l(.143,.26),l(.213,.307),l(.614,.166),l(.118,.213),l(-.095,.331),l(-.236,.095),l(-.236,.047),l(-.26,-.189),l(-.143,-.071),l(-.188,-.023),l(-.284,.047),l(-.638,-.189),l(-.189,-.213),l(-.331,-.189),l(-.473,-.024),l(-.236,0),l(-.418,.308),l(-.291,.094),l(-.378,.047),l(-.591,.095),l(-.592,-.047),l(-.401,.118),l(-.426,.023),l(-.308,.095),l(-.307,-.024),l(-.377,.108),l(-.031,-.028),l(-1.326,-1.018),l(-.41,-.041),l(-.761,.36),l(-.226,.072),l(-.491,-.068),l(-1.212,-.082),l(.083,-.065),l(.322,-.585),l(.032,-.143),l(-.064,-.728),l(-.331,-1.084),l(-.206,-.399),l(-.639,-.513),l(-.341,-.128),l(-.916,-.155),l(-.679,-.271),l(-.341,-.243), +N(443.617,107.095),l(-.065,-.035),l(-.435,-.156),l(-.017,-.15),l(-.501,-.485),l(-.848,-.3),l(-.033,-.021),l(.002,-.1),l(-.029,-.092),l(-.082,-.072),l(-.033,-.078),l(.022,-.089),l(-.005,-.004),l(.183,-.108),l(.09,-.089),l(-.045,-.101),l(-.078,-.089),l(-.066,-.112),l(-.012,-.044),l(-.011,-.145),l(-.012,-.112),l(.012,-.134),l(.101,-.089),l(.111,-.022),l(.134,-.011),l(.056,-.056),l(-.011,-.1),l(-.034,-.089),l(.112,-.101),l(.044,-.089),l(.045,-.101),l(.168,-.078),l(.122,-.056),l(.123,.011),l(.056,.044),l(.056,.089),l(.09,.056),l(.111,0),l(.056,-.101),l(-.056,-.101),l(-.123,-.167),l(-.089,-.1),l(-.012,-.078),l(.078,-.056),l(.112,-.033),l(.066,.044),l(.112,.022),l(.156,-.056),l(.056,.033),l(0,.101),l(.223,.056),l(.156,.101),l(.168,.078),l(.111,.111),l(.101,.146),l(.167,.134),l(.056,.033),l(.078,.022),l(.279,.078),l(.101,.056),l(.078,.011),l(.067,-.044),l(.066,.022),l(.078,.1),l(.123,.101),l(.033,.067),l(.078,.045),l(.111,-.022),l(.057,.044),l(.134,.045),l(.167,.067),l(.101,.101),l(.011,.089),l(-.089,.011),l(-.134,.022),l(-.09,.044),l(-.021,.067),l(-.057,.033),l(-.167,-.033),l(-.146,-.011),l(-.111,.033),l(-.022,.089),l(.056,.056),l(.101,0),l(.078,.067),l(0,.067),l(-.109,.286),l(-.361,-.022),l(-.727,-.11),l(-.273,.273),l(-.279,.515),l(.133,.427),l(-.002,.342), +N(558.52,110.652),l(.042,-.098),l(.318,.073),l(.246,-.073),l(.221,-.025),l(.294,.098),l(.319,.098),l(.245,.147),l(.221,-.196),l(.271,-.049),l(.221,-.196),l(.343,-.196),l(.172,-.049),l(.319,0),l(0,-.147),l(-.049,-.171),l(.245,.049),l(.49,.024),l(.221,-.147),l(.197,-.147),l(.49,-.221),l(-.172,-.123),l(-.466,-.024),l(-.516,-.074),l(-.245,-.196),l(-.319,-.147),l(-.343,.025),l(-.025,-.098),l(-.073,-.246),l(-.147,.024),l(-.393,-.024),l(-.049,-.147),l(-.172,-.294),l(-.196,-.172),l(-.196,-.098),l(-.024,.245),l(-.196,.196),l(-.221,-.049),l(-.049,.393),l(-.393,0),l(-.589,0),l(-.368,-.27),l(-.172,-.221),l(-.098,-.221),l(-.418,.147),l(-.146,-.123),l(-.295,-.074),l(-.294,-.049),l(.024,-.123),l(.172,-.098),l(.441,-.295),l(.196,-.147),l(.294,-.172),l(.295,-.049),l(.073,-.196),l(.221,-.049),l(.368,-.171),l(.368,-.172),l(-.441,-.246),l(-.349,.126),l(-.044,-.273),l(.393,-.442),l(.318,-.368),l(.736,-.123),l(.663,-.098),l(.883,.147),l(.883,.245),l(.688,.196),l(.81,.123),l(.344,.123),l(-.024,-.442),l(.245,-.736),l(.466,-.368),l(.688,-.123),l(.589,.074),l(.761,.27),l(.735,.246),l(.908,.196),l(.54,.098),l(.441,-.27),l(.858,-.024),l(.761,0),l(.785,-.147),l(.712,.221),l(.662,.098),l(1.35,.024),l(.662,-.074),l(.981,.246),l(.564,-.049),l(.147,.344),l(.27,.147),l(.196,.27),l(.663,0),l(.466,.098),l(.41,.375),l(.031,.194),l(-.051,.157),l(-.325,.187),l(-.97,.219),l(-1.338,.349),l(-.445,.145),l(-.405,.301),l(-.638,.701),l(-.646,.345),l(-.478,.102),l(-.459,.017),l(-1.248,-.235),l(-.238,.03),l(-.467,.472),l(-.463,.784),l(-.268,.243),l(-.885,.132),l(-.507,.145),l(-.344,-.055),l(-.183,-.567),l(-.06,-.071),l(-.359,.03),l(-1.737,.734),l(-1.422,.704),l(-.274,.186),l(-.129,.213),l(-.139,.739),l(-.196,-.073),l(-.344,.098),l(-.344,.171),l(-.539,0),l(-.663,-.073),l(-.834,.221),l(-.172,.147),l(-.196,0),l(-.172,-.319),l(-.368,.024),l(-.318,.172),l(-.074,-.221),l(-.049,-.172),l(-.122,.024),l(-.319,-.123),l(-.049,-.147),l(-.221,-.024),l(-.442,.123),l(-.343,.049),l(.024,.221),l(-.295,.049),l(-.393,-.074),l(-.073,-.196),l(-.147,-.123),l(-.368,-.098),l(-.49,.147),l(-.196,-.073),l(-.688,.024),l(-.564,0),l(-.589,.024),l(-.122,-.098),l(-.049,-.147),l(-.099,-.27),l(.099,-.245),l(.196,-.196),l(.098,.221),l(.196,-.074),l(-.049,-.196),l(.098,-.27),l(.123,0),l(.981,-.196),l(.515,.147),l(.516,.196),l(.099,.172),l(.196,0),l(.024,-.246),l(.441,-.196),l(.302,-.147), +N(685.343,114.455),l(-.571,.678),l(-.309,.115),l(-.511,-.096),l(-.579,-.068),l(-.595,-.011),l(-.315,.157),l(-.633,.738),l(-.283,.256),l(-.235,.171),l(-.268,-.206),l(-.35,.34),l(-.319,.199),l(-.373,-.608),l(-.398,-.112),l(-.649,.78),l(-.195,-.382),l(-.232,-.254),l(-.683,-.367),l(-.169,-.453),l(.095,-.312),l(.429,-.411),l(.754,-.229),l(.056,-.269),l(-.591,-.282),l(.407,-.879),l(.189,-.34),l(-.199,-.269),l(-.632,-.296),l(-.139,0),l(-.381,.029),l(-.312,.143),l(-.234,-.07),l(-.52,-.368),l(-.167,-.233),l(.379,-.528),l(.415,-.442),l(.52,-.329),l(1.533,-.604),l(1.032,-.545),l(.636,-.543),l(.686,-1.027),l(.386,-.13),l(.448,-.017),l(.273,.396),l(.493,.253),l(.508,.153),l(.975,-.048),l(.527,-.159),l(-.046,-.113),l(-.508,-.765),l(.025,-.342),l(.273,-.243),l(.392,-.059),l(.333,.126),l(.452,.054),l(.538,-.017),l(.62,-.259),l(.955,-.532),l(.23,-.713),l(.383,-.358),l(.253,-.129),l(.247,-.001),l(.579,.68),l(.298,.439),l(.167,.393),l(-1.356,.923),l(-.408,.457),l(-.112,.414),l(.09,.427),l(-.154,.456),l(-.187,.868),l(-.668,.115),l(-.36,.229),l(-.497,.385),l(-.766,.641),l(-.468,.214),l(-.678,.03),l(-.577,.199),l(-.265,.228),l(-.248,.312),l(-.364,.893),l(.284,.326),l(1.225,.847),l(.419,.354), +N(536.625,121.017),l(-.078,-.028),l(-.15,-.692),l(-.01,-.565),l(-.038,-.848),l(-.185,-.211),l(-.787,.075),l(-.696,-.01),l(-.655,-.506),l(-1.803,-1.362),l(-.597,-.336),l(-.66,-.167),l(-.5,-.054),l(-.788,-.066),l(-.822,-.335),l(-.708,-.251),l(-.402,-.437),l(-1.055,-.107),l(-.519,-.054),l(-.343,.129),l(-.517,.343),l(-.333,.03),l(-.78,-.038),l(-.609,.032),l(-.413,.144),l(-.476,.328),l(-.621,.654),l(-.466,.3),l(-.562,.13),l(-.441,-.025),l(-.066,-.376),l(-.128,-.681),l(-.106,-.447),l(.128,-.298),l(0,-.383),l(0,-.532),l(.106,-.191),l(.106,-.298),l(.085,-.234),l(-.085,-.212),l(-.256,-.128),l(-.319,-.191),l(-.213,-.255),l(-.042,-.149),l(-.171,0),l(-.191,-.042),l(-.361,-.106),l(-.191,.192),l(-.086,-.234),l(.086,-.106),l(.148,-.255),l(.128,.106),l(.383,-.042),l(.426,.085),l(.128,.021),l(.043,-.128),l(-.319,-.213),l(-.256,-.021),l(-.085,-.277),l(.17,-.255),l(.213,-.191),l(-.404,-.042),l(-.319,.085),l(-.383,0),l(-.319,-.085),l(-.128,.149),l(-.17,-.255),l(-.149,-.298),l(0,-.34),l(-.042,-.298),l(.17,-.213),l(.106,-.319),l(.043,-.255),l(.105,-.277),l(.086,-.234),l(.213,.34),l(.063,.128),l(.17,.17),l(.405,-.085),l(.383,.128),l(.106,-.149),l(-.021,-.149),l(.106,0),l(.148,.021),l(.064,.319),l(.106,.191),l(.298,-.021),l(.298,-.063),l(.256,-.106),l(.233,.085),l(.192,.064),l(.085,-.128),l(-.149,-.191),l(-.042,-.213),l(.191,-.042),l(.106,.149),l(.233,.085),l(.256,-.085),l(.213,-.064),l(.021,-.234),l(-.171,-.341),l(-.34,-.234),l(-.532,-.319),l(-.426,-.213),l(-.063,-.319),l(-.043,-.34),l(-.213,-.17),l(0,-.213),l(0,-.213),l(-.085,-.127),l(-.554,-.064),l(-.617,.085),l(-.426,.021),l(-.446,.127),l(-.192,.277),l(-.085,.298),l(.128,.192),l(-.063,.276),l(-.086,.405),l(.064,.234),l(.021,.298),l(-.256,-.553),l(-.361,-.319),l(.042,-.17),l(-.063,-.191),l(-.274,-.143),l(.529,-.453),l(.937,-.532),l(1.277,-.298),l(.979,-.085),l(.512,.234),l(.681,.383),l(.617,.383),l(.256,.511),l(.638,.703),l(.447,.255),l(.489,-.043),l(.341,-.106),l(.158,.014),l(1.03,.063),l(1.383,-.032),l(.126,-.314),l(-.314,-.409),l(.062,-.628),l(.503,-.409),l(.503,-.251),l(.629,0),l(.283,-.126),l(.22,-.346),l(.126,-.126),l(.283,0),l(.597,.283),l(-.188,-.377),l(-.251,-.251),l(.565,-.157),l(.188,-.063),l(.472,.095),l(.629,.377),l(.346,.032),l(.22,.314),l(.692,.095),l(.534,.094),l(.251,.22),l(.032,.22),l(0,.22),l(.439,.283),l(-.188,.157),l(-.031,.188),l(.188,.22),l(-.157,.188),l(-.094,.22),l(.691,.314),l(.314,.157),l(.503,-.094),l(.439,-.032),l(.535,.126),l(.439,-.063),l(.188,-.157),l(.881,.251),l(.22,.377),l(.126,.566),l(.408,.597),l(.283,.188),l(.188,.44),l(0,.283),l(1.384,.975),l(1.194,.597),l(.377,.44),l(1.006,.503),l(.314,-.063),l(.943,.597),l(.565,.22),l(1.132,.597),l(.378,.251),l(.471,-.063),l(.566,.189),l(.534,.283),l(.503,.094),l(-.062,.22),l(-.157,.251),l(.062,.503),l(-.091,.726),l(-1.454,-.244),l(-.565,-.294),l(-.445,.356),l(-.417,.2),l(-1.135,.205),l(-.432,.809),l(-.203,.991),l(-.103,.128),l(-.508,.243),l(-1.985,.689),l(-.568,.159),l(-.119,.199),l(-.001,.466),l(-.22,.199),l(-.636,.3),l(-.534,.031),l(-.573,-.082),l(-.999,-.348),l(-.937,-.193),l(-.193,-.112), +N(445.294,112.196),l(-.07,-.115),l(-.138,-.469),l(-.5,-.452),l(-.966,-.541),l(.024,-.141),l(.23,.062),l(.023,-.237),l(-.345,-.414),l(.418,-.616),l(-.182,-.22),l(.188,-.563),l(-.251,-.282),l(.182,-.396),l(.268,-.079),l(-.027,-.45),l(-.331,-.081),l(-.2,-.107),l(.002,-.342),l(-.133,-.427),l(.279,-.515),l(.273,-.273),l(.727,.11),l(.361,.022),l(.058,.004),l(.382,.369),l(.733,.866),l(.018,.109),l(.035,.218),l(-.132,.429),l(.074,.641),l(.298,.668),l(.722,.608),l(-.09,.029),l(-.449,.842),l(-.402,.386),l(-.496,.472),l(-.583,.884), +N(451.512,108.463),l(-.507,.16),l(-.532,.245),l(-.622,-.054),l(-.361,-.041),l(-.365,.159),l(-.395,.429),l(-.606,.146),l(-.809,.076),l(-.722,-.608),l(-.298,-.668),l(-.074,-.641),l(.132,-.429),l(-.035,-.218),l(.14,.049),l(.188,0),l(.072,-.087),l(.029,-.072),l(-.029,-.13),l(.058,-.167),l(.088,-.058),l(.225,-.058),l(.246,-.058),l(.116,-.058),l(.08,-.065),l(.087,.073),l(.131,.058),l(.094,.109),l(.116,0),l(.029,-.058),l(-.059,-.072),l(.109,-.058),l(.151,-.102),l(.152,-.087),l(.175,.043),l(.064,-.007),l(.196,.007),l(.152,.015),l(.087,-.08),l(.131,-.116),l(.064,.021),l(.102,.043),l(.088,-.021),l(.087,-.043),l(.102,.051),l(.058,-.015),l(.116,-.022),l(.145,-.021),l(.16,-.022),l(.072,-.029),l(.058,.017),l(-.007,.106),l(.134,.213),l(.666,.296),l(.358,.383),l(.225,.469),l(-.006,.499),l(-.104,.3),l(.047,.199), +N(383.93,117.402),l(-.249,.101),l(-.517,.291),l(-.439,.052),l(-.548,-.178),l(-.58,0),l(-.28,-.073),l(-.719,.292),l(-.058,-.177),l(.389,-1.012),l(-.021,-.856),l(-.182,-.115),l(.244,-.542),l(-.054,-.397),l(.13,-.114),l(-.144,-.141),l(-.375,.085),l(-.476,.097),l(-.108,-.449),l(.48,-.052),l(.283,-.22),l(-.042,-.17),l(-.178,-.226),l(-.3,.417),l(-.413,.136),l(-.357,-.042),l(-.059,-.188),l(.198,-.397),l(.138,-.616),l(-.039,-.303),l(.258,-.114),l(.403,-.503),l(.45,-1.098),l(-.12,-.115),l(.612,-1.783),l(-.35,-.924),l(-.007,-.42),l(-.146,-.378),l(.255,-.271),l(.891,-.251),l(.55,-.188),l(.531,.439),l(1.822,.047),l(.531,-.26),l(.335,.055),l(.272,.227),l(.15,.242),l(.842,.495),l(.062,.242),l(-.288,.216),l(-1.234,.506),l(-.084,.072),l(-.051,.442),l(.072,.456),l(-.132,.983),l(.057,.938),l(-.043,.199),l(-.458,.229),l(-.482,.045),l(-.288,.129),l(.488,.494),l(.455,.551),l(.163,.198),l(-.347,.371),l(-.506,.655),l(-.17,.455),l(.812,.123),l(.408,.31),l(-.884,.643),l(-.242,.37),l(-.304,.951),l(-.008,.018), +N(500.121,117.572),l(-.407,-.016),l(-.433,.388),l(-.164,.126),l(-.318,-.105),l(-.102,-.269),l(.03,-.259),l(-.274,-.151),l(-.366,-.082),l(-.244,.234),l(-.343,-.023),l(-.811,-.153),l(-.364,.032),l(-.304,-.16),l(-.437,.094),l(-.266,.143),l(-.23,.043),l(-.064,-.245),l(-.207,-.023),l(-.24,.292),l(-.693,.304),l(-1.185,.224),l(-.711,-.039),l(-.747,-.123),l(-.439,.073),l(-1.498,.673),l(-.567,.13),l(-1.104,.176),l(-.556,-.153),l(-1.532,-.444),l(-.278,.03),l(-.929,.373),l(-.746,.075),l(-.575,-.025),l(-.777,-.166),l(-.222,.001),l(-.142,-.035),l(-.055,.319),l(.102,.452),l(.243,.423),l(-.627,.127),l(-.156,.374),l(-.2,.169),l(-.171,-.041),l(-.114,.127),l(-.39,-.125),l(-.311,.001),l(-.245,-.459),l(-.119,-.093),l(.097,-.175),l(.242,-.197),l(.617,-.403),l(.021,-.175),l(-.049,-.134),l(-.279,-.28),l(-.146,-.053),l(-.487,.368),l(-.23,.041),l(-.137,.064),l(.092,.041),l(-.118,.216),l(-.172,.023),l(-.063,-.047),l(-.076,.088),l(-.297,.058),l(-.332,-.222),l(-.447,-.198),l(-.461,-.157),l(-.395,.046),l(-.849,.548),l(-.337,.286),l(.006,.204),l(-.141,.046),l(-.122,.07),l(-.005,.082),l(-.179,-.169),l(-.604,.206),l(-.689,.185),l(-.594,-.013),l(-.587,-.07),l(-.678,-.267),l(-.963,-.819),l(-1.181,-.479),l(-1.034,-.182),l(-.692,.072),l(-.119,.255),l(-.097,.609),l(-.053,.411),l(-.173,.156),l(-.256,0),l(-.253,-.155),l(-1.12,.243),l(-.423,-.027),l(-.386,-.183),l(-.657,-1.159),l(-.42,.354),l(-.764,-.451),l(-.451,.057),l(-.562,.412),l(-.227,-.382),l(.066,-.127),l(.242,-.17),l(-.116,-.17),l(-.989,-.012),l(-.545,-.013),l(-.088,-.269),l(.571,-.199),l(-.074,-.241),l(-.284,-.198),l(-.454,-.07),l(-.084,-.297),l(.041,-.34),l(.087,-.284),l(-.089,-.255),l(-.396,-.126),l(-.627,-.353),l(-.371,.086),l(-.265,-.084),l(-.004,-.255),l(.171,-.501),l(.131,.059),l(.478,.311),l(.567,-.271),l(-.396,-.283),l(.021,-.124),l(-.296,-.128),l(.03,-.128),l(.571,-.159),l(.152,-.113),l(-.068,-.142),l(-.149,-.088),l(-.337,-.035),l(.01,-.187),l(.18,-.07),l(-.163,-.164),l(-.198,-.117),l(-.009,-.152),l(-.227,-.012),l(.263,-.181),l(.296,-.275),l(.161,-.035),l(.07,-.16),l(-.341,-.042),l(-.573,.12),l(-.905,.164),l(-.166,-.035),l(.046,-.33),l(.127,-.125),l(-.003,-.199),l(-.029,-.286),l(.13,-.264),l(.299,.012),l(.184,-.41),l(.175,-.023),l(.63,-.422),l(.514,.012),l(.133,-.129),l(.479,-.047),l(.128,.211),l(.268,.102),l(.169,.028),l(.529,.022),l(.147,-.129),l(-.067,-.129),l(-.269,-.129),l(.286,-.094),l(.324,.036),l(.117,.082),l(-.219,.223),l(.213,-.026),l(1.053,-.073),l(.619,.042),l(.379,.046),l(.279,.047),l(.155,-.176),l(-.086,-.094),l(-.468,-.035),l(-.212,-.118),l(.275,-.212),l(1.386,-.151),l(.417,-.012),l(.377,-.117),l(-.442,-.012),l(-.592,.023),l(-.215,0),l(-.068,-.146),l(-.611,-.382),l(.325,-.528),l(.926,.14),l(1.244,.048),l(.264,-.117),l(1.086,.321),l(1.051,-.031),l(.414,-.243),l(-.041,-.27),l(.624,-.244),l(.455,-.214),l(1.218,-.573),l(.598,-.215),l(1.039,-.23),l(.889,-.073),l(.758,.07),l(.905,.126),l(.798,.041),l(.753,-.372),l(.216,.527),l(.416,.298),l(.278,.099),l(.592,.013),l(.622,-.144),l(.453,.74),l(.492,.255),l(.574,-.172),l(.391,.056),l(.968,.582),l(1.265,.04),l(1.094,.197),l(.749,-.001),l(1.084,-.272),l(.514,-.044),l(.651,.141),l(.764,.098),l(.787,-.016),l(.554,-.144),l(1.518,-.573),l(.424,-.335),l(1.212,.082),l(.491,.068),l(.226,-.072),l(.761,-.36),l(.41,.041),l(1.326,1.018),l(.031,.028),l(.795,.722),l(.026,.199),l(-.421,.813),l(.033,.412),l(.284,.211),l(1.413,.12),l(.492,.451),l(-.072,.211),l(-.409,-.023),l(-.231,.141),l(-.009,.433),l(-.584,.267),l(-.039,.27),l(.264,.67),l(-.122,.375),l(.224,.492),l(.09,.117),l(.106,-.105),l(.288,.203),l(.039,.207),l(-.229,.281),l(-.287,.535),l(-.06,.128),l(.213,.14),l(.424,.111),l(-.145,.245),l(.099,.421),l(.42,.374),l(.275,.035),l(.023,.308),M(462.617,106.804),l(.241,.211),l(-.019,.287),l(.115,.285),l(.077,.071),l(.593,.355),l(.819,.241),l(.605,.155),l(.152,.121),L(464.943,109),l(-.304,.166),l(-.515,-.072),l(-.94,-.246),l(-.326,.07),l(-.209,.152),l(-1.019,-.012),l(-.357,.384),l(-.109,.273),l(-.833,.316),l(-.612,.282),l(-.222,.258),l(-.307,.152),l(-.268,.293),l(-.255,.082),l(.164,-.258),l(.019,-.141),l(-.062,-.176),l(.584,-.293),l(.22,-.141),l(-.226,-.191),l(-.082,.015),l(-.653,-.056),l(-.229,-.148),l(.326,-.546),l(.387,-.558),l(.678,-.631),l(-.127,-.227),l(-.427,-.197),l(-.105,0),l(.498,-.445),l(.629,-.374),l(.497,-.045),l(.527,.111),l(1.333,.005), +N(509.077,114.955),l(-.72,-.317),l(-.268,.016),l(-.356,-.433),l(-.374,-.105),l(-.13,-.363),l(.532,-.27),l(.095,-.222),l(-.43,-.176),l(-.027,-.188),l(.63,-.129),l(.094,-.155),l(-.061,-.113),l(-.487,-.21),l(-.351,-.281),l(-.306,-.166),l(-.456,.234),l(-1.058,.492),l(-.374,.445),l(-.642,.188),l(-.254,.255),l(-.014,-.027),l(.094,-.118),l(-.094,-.213),l(-.189,-.071),l(.26,-.095),l(.166,-.047),l(-.261,-.189),l(-.236,-.236),l(.236,-.118),l(.095,-.189),l(-.283,-.047),l(-.354,-.024),l(-.284,-.118),l(-.213,-.212),l(-.236,-.024),l(-.26,-.354),l(-.283,-.142),l(-.048,-.094),l(.166,0),l(.378,0),l(.165,-.236),l(0,-.236),l(-.213,-.024),l(-.188,-.142),l(-.544,-.331),l(-.283,-.354),l(.047,-.284),l(.402,-.142),l(-.119,-.236),l(-.212,-.166),l(-.426,-.071),l(-.284,-.095),l(.071,-.094),l(.071,-.118),l(-.284,-.095),l(-.087,-.212),l(.418,-.308),l(.236,0),l(.473,.024),l(.331,.189),l(.189,.213),l(.638,.189),l(.284,-.047),l(.188,.023),l(.143,.071),l(.26,.189),l(.236,-.047),l(.236,-.095),l(.095,-.331),l(-.118,-.213),l(-.614,-.166),l(-.213,-.307),l(-.143,-.26),l(.095,-.071),l(.143,-.142),l(.268,-.189),l(.229,-.023),l(.023,.166),l(.213,-.047),l(.189,0),l(.142,.189),l(.473,.284),l(.095,.118),l(.118,0),l(.283,.284),l(0,.308),l(.591,.094),l(.449,.142),l(.379,-.047),l(.165,-.213),l(.308,-.331),l(.283,-.094),l(.496,-.284),l(.292,-.449),l(.465,.331),l(.236,.378),l(.26,.189),l(.284,.307),l(.095,.52),l(.142,.236),l(.283,.26),l(.284,.165),l(0,.166),l(.449,.236),l(.473,-.047),l(.378,.071),l(.284,.166),l(.236,.189),l(.095,.189),l(0,.142),l(-.355,-.142),l(-.401,-.047),l(-.213,0),l(-.26,.047),l(-.142,.118),l(-.402,.071),l(-.213,.142),l(-.047,.189),l(-.023,.473),l(-.118,.26),l(-.095,.236),l(-.095,.378),l(.213,.236),l(-.023,.189),l(-.237,-.071),l(-.094,.095),l(-.071,.331),l(-.071,.26),l(-.118,-.047),l(-.094,-.236),l(-.143,-.095),l(-.165,.095),l(-.047,.307),l(.07,.166),l(-.118,.118),l(-.118,.095),l(.095,.26),l(-.363,.91),M(499.844,111.738),l(.709,.061),l(.142,-.047),l(.26,-.071),l(.236,.236),l(.071,.166),l(.378,.142),l(.213,.071),l(.308,-.118),l(.52,0),l(-.071,.213),l(.024,.236),l(.118,.023),l(.331,.166),l(-.071,.236),l(.421,.763),l(-.009,.001),l(-.253,-.133),l(-.416,.038),l(-.512,-.025),l(-.421,-.125),l(-.335,-.211),l(-.294,-.402),l(-.551,-.223),l(-.281,-.417),l(-.265,-.381),l(-.252,-.197), +N(455.452,122.442),l(.049,-.209),l(-.057,-.128),l(-.812,-.256),l(-.691,-.006),l(-.506,-.116),l(-.484,.017),l(-.121,-.046),l(-.103,-.093),l(.139,-.56),l(.315,-.005),l(-.005,-.088),l(-.009,-.122),l(.069,-.07),l(.083,.157),l(.021,.146),l(.303,.021),l(.172,.055),l(.184,-.076),l(-.014,-.082),l(.108,-.029),l(.157,.105),l(-.037,.093),l(-.099,.006),l(-.04,.053),l(.088,.023),l(.144,.035),l(.094,.046),l(.021,.128),l(.353,.041),l(.846,-.122),l(.509,.016),l(.035,.13),l(.192,.035),l(.608,.064),l(.307,.051),l(.358,-.121),l(.09,.05),l(-.101,.312),l(.163,.11),l(.105,0),l(.325,-.169),l(.286,-.058),l(.078,.052),l(.154,-.07),l(.232,-.146),l(-.083,.187),l(.015,.186),l(-.183,.268),l(-.582,-.046),l(-.349,.081),l(-.335,-.017),l(-1.994,.169),M(445.294,112.196),l(.583,-.884),l(.496,-.472),l(.402,-.386),l(.449,-.842),l(.09,-.029),l(.809,-.076),l(.606,-.146),l(.395,-.429),l(.365,-.159),l(.361,.041),l(.622,.054),l(.532,-.245),l(.507,-.16),l(.09,-.029),l(1.855,-.195),l(.799,-.261),l(.584,-.06),l(1.473,.505),l(.619,.21),l(.388,-.031),l(1.117,-.277),l(.086,-.257),l(-.097,-.327),l(.344,-.216),l(.363,.026),l(.105,0),l(.427,.197),l(.127,.227),l(-.678,.631),l(-.387,.558),l(-.326,.546),l(-.062,-.407),l(-.794,-.056),l(-.743,-.041),l(-.566,-.125),l(-.062,-.144),l(-.459,.186),l(-.248,.123),l(-.403,.012),l(-.031,-.247),l(-.335,.029),l(-.301,.314),l(-.431,.186),l(-.31,.03),l(-.306,-.159),l(-.252,.07),l(-.004,.133),l(.169,.185),l(.169,.34),l(.308,.059),l(.826,.609),l(-.166,.07),l(-.369,-.258),l(-.015,-.105),l(-.276,-.082),l(-.331,-.105),l(-.116,.099),l(-.211,.007),l(.069,.129),l(-.016,.129),l(.338,.164),l(.145,-.012),l(.114,.234),l(-.03,.129),l(-.245,.023),l(-.445,-.457),l(-.341,-.141),l(-.207,-.059),l(-.128,-.012),l(.003,.094),l(-.075,.035),l(.138,.164),l(.102,.105),l(.154,.141),l(.193,.059),l(.153,.035),l(.103,.094),l(-.093,.058),l(-.494,-.046),l(-.253,-.035),l(.035,-.176),l(-.137,-.293),l(-.164,-.188),l(-.401,-.108),l(-.472,-.373),l(.258,-.118),l(.025,-.136),l(-.053,-.122),l(-.182,-.035),l(-.153,.199),l(-.465,.176),l(.245,.224),l(-.25,.371),l(-.05,.249),l(.13,.121),l(.065,.172),l(.311,.338),l(.133,.036),l(.131,.479),l(.579,.421),l(.359,.467),l(-.172,.14),l(-.237,.082),l(.106,-.187),l(-.121,-.187),l(-.142,-.128),l(-.139,-.035),l(-.151,-.047),l(-.29,.175),l(.102,.188),l(.153,.081),l(.08,.316),l(-.193,.187),l(-.652,.141),l(.248,.046),l(.27,.14),l(.391,.058),l(.188,.222),l(.257,-.012),l(.155,.012),l(.048,.126),l(.367,.269),l(.306,.014),l(.138,.292),l(.282,.012),l(.27,0),l(.348,.303),l(.015,.128),l(-.193,.082),l(.238,.782),l(-.153,.175),l(-.185,0),l(-.226,-.385),l(-.222,-.047),l(-.207,-.278),l(-.101,-.142),l(-.17,0),l(-.496,.14),l(-.479,.105),l(-.184,.128),l(.315,.093),l(.013,.188),l(.007,.291),l(.229,.117),l(.153,-.026),l(.225,-.079),l(-.021,.198),l(.235,.175),l(-.519,.093),l(.002,.117),l(-.169,.062),l(-.309,-.086),l(.121,-.21),l(-.186,-.086),l(-.508,-.056),l(-.158,-.092),l(-.008,.206),l(.194,.453),l(.193,.17),l(-.045,.163),l(.209,.204),l(.213,.96),l(-.688,-.31),l(-.331,.071),l(-.298,.439),l(-.442,-.735),l(-.46,-.367),l(-.452,.44),l(-.428,-.353),l(-.127,-.297),l(.212,-.425),l(-.028,-.241),l(-.215,-.269),l(-.491,-.424),l(-.167,-.226),l(.017,-.17),l(.471,-.61),l(.609,.098),l(.425,-.298),l(.202,.042),l(1.668,.663),l(.337,-.1),l(.483,-.355),l(-.266,-.049),l(-.27,-.056),l(-1.204,-.493),l(-1.127,-.083),l(-.367,.058),l(-.66,.058),l(-.427,.143),l(-.89,-1.118),l(.269,-.1),l(.253,.056),l(.218,-.114),l(.122,-.185),l(-.339,-.24),l(-.235,.114),l(-.496,-.042),l(-1.035,-.721),l(-.199,-.325), +N(504.136,113.458),l(-.327,.328),l(-.377,.03),l(-.421,-.763),l(.071,-.236),l(-.331,-.166),l(-.118,-.023),l(-.024,-.236),l(.071,-.213),l(-.52,0),l(-.308,.118),l(-.213,-.071),l(-.378,-.142),l(-.071,-.166),l(-.236,-.236),l(-.26,.071),l(-.142,.047),l(-.709,-.061),l(-.492,-.451),l(-1.413,-.12),l(-.284,-.211),l(-.033,-.412),l(.421,-.813),l(-.026,-.199),l(-.795,-.722),l(.377,-.108),l(.307,.024),l(.308,-.095),l(.426,-.023),l(.401,-.118),l(.592,.047),l(.591,-.095),l(.378,-.047),l(.291,-.094),l(.087,.212),l(.284,.095),l(-.071,.118),l(-.071,.094),l(.284,.095),l(.426,.071),l(.212,.166),l(.119,.236),l(-.402,.142),l(-.047,.284),l(.283,.354),l(.544,.331),l(.188,.142),l(.213,.024),l(0,.236),l(-.165,.236),l(-.378,0),l(-.166,0),l(.048,.094),l(.283,.142),l(.26,.354),l(.236,.024),l(.213,.212),l(.284,.118),l(.354,.024),l(.283,.047),l(-.095,.189),l(-.236,.118),l(.236,.236),l(.261,.189),l(-.166,.047),l(-.26,.095),l(.189,.071),l(.094,.213),l(-.094,.118),l(.014,.027), +N(566.651,117.4),l(-.565,-.153),l(-.496,-.054),l(-.264,-.151),l(-.564,.227),l(-.974,.147),l(-.137,-.059),l(.129,-.176),l(-.198,-.077),l(-.678,.03),l(-.739,.315),l(-.592,.486),l(-.589,.064),l(-.745,.495),l(-.351,.03),l(-.368,-.026),l(-.128,-.084),l(-.164,-.409),l(-.199,-.521),l(.185,-.444),l(.099,-.775),l(.029,-.255),l(-.17,-.187),l(-.484,.093),l(.156,-.597),l(-.576,-.45),l(-.153,-.056),l(-.384,.016),l(-.286,.162),l(-.134,.363),l(-.435,.428),l(-.049,.425),l(.006,.255),l(-.208,.228),l(-.442,.158),l(-.133,-.013),l(-.587,-.152),l(-.292,.058),l(-.073,.185),l(.007,.311),l(-.3,.313),l(-.21,.128),l(-.381,.016),l(-.63,-.237),l(-.325,.001),l(-.581,.286),l(-.58,.343),l(-.485,.144),l(-.245,-.041),l(-.129,-.141),l(-.04,-.055),l(.375,-.843),l(-.063,-.377),l(.377,-.377),l(.283,-.503),l(.503,-.346),l(.157,-.22),l(-.126,-.283),l(-.471,-.314),l(-.126,-.409),l(.031,-.472),l(.126,-.22),l(-.126,-.22),l(-.346,0),l(-.44,-.032),l(-.157,-.157),l(-.346,-.188),l(-.251,-.283),l(.125,-.471),l(.472,-.283),l(.629,.126),l(1.069,.094),l(.282,-.188),l(.063,-.409),l(.251,-.157),l(.188,0),l(.032,-.346),l(.188,-.063),l(.251,-.063),l(-.126,-.094),l(-.534,.031),l(-.251,-.125),l(.503,-.094),l(.565,-.095),l(.472,.095),l(.062,-.126),l(.032,-.346),l(-.189,-.314),l(.283,-.314),l(-.031,-.22),l(.346,0),l(.22,.157),l(.252,.22),l(.22,-.157),l(.692,-.188),l(.471,-.346),l(.221,-.251),l(.439,.377),l(.252,.251),l(-.188,.22),l(-.409,.346),l(-.251,.126),l(.126,.188),l(.251,.063),l(.188,.283),l(.409,-.031),l(.345,.005),l(-.302,.147),l(-.441,.196),l(-.024,.246),l(-.196,0),l(-.099,-.172),l(-.516,-.196),l(-.515,-.147),l(-.981,.196),l(-.123,0),l(-.098,.27),l(.049,.196),l(-.196,.074),l(-.098,-.221),l(-.196,.196),l(-.099,.245),l(.099,.27),l(.049,.147),l(.122,.098),l(.589,-.024),l(.564,0),l(.688,-.024),l(.196,.073),l(.49,-.147),l(.368,.098),l(.147,.123),l(.073,.196),l(.393,.074),l(.295,-.049),l(-.024,-.221),l(.343,-.049),l(.442,-.123),l(.221,.024),l(.049,.147),l(.319,.123),l(.122,-.024),l(.049,.172),l(.074,.221),l(.318,-.172),l(.368,-.024),l(.172,.319),l(.196,0),l(.172,-.147),l(.834,-.221),l(.663,.073),l(.539,0),l(.344,-.171),l(.344,-.098),l(.196,.073),l(-.011,.069),l(.023,1.031),l(-.207,.223),l(.077,.305),l(.325,.394),l(.463,-.045),l(.229,-.162),l(.22,.06),l(.692,.039),l(.273,.154),l(.295,.494),l(-.009,.284),l(.028,.246),l(.152,.012),l(.049,.123),l(-.126,.428),l(.245,.237),l(-.152,.36),l(.2,.163),l(-.181,.185),l(-.08,.249),l(-.354,.136), +N(500.121,117.572),l(-.023,-.308),l(-.275,-.035),l(-.42,-.374),l(-.099,-.421),l(.145,-.245),l(-.424,-.111),l(-.213,-.14),l(.06,-.128),l(.287,-.535),l(.229,-.281),l(-.039,-.207),l(-.288,-.203),l(-.106,.105),l(-.09,-.117),l(-.224,-.492),l(.122,-.375),l(-.264,-.67),l(.039,-.27),l(.584,-.267),l(.009,-.433),l(.231,-.141),l(.409,.023),l(.072,-.211),l(.252,.197),l(.265,.381),l(.281,.417),l(.551,.223),l(.294,.402),l(.335,.211),l(.421,.125),l(.512,.025),l(.416,-.038),l(.253,.133),l(.009,-.001),l(.377,-.03),l(.327,-.328),l(.254,-.255),l(.642,-.188),l(.374,-.445),l(1.058,-.492),l(.456,-.234),l(.306,.166),l(.351,.281),l(.487,.21),l(.061,.113),l(-.094,.155),l(-.63,.129),l(.027,.188),l(.43,.176),l(-.095,.222),l(-.532,.27),l(.13,.363),l(.374,.105),l(.356,.433),l(.268,-.016),l(.72,.317),l(.015,.007),l(-.05,.707),l(-.143,.581),l(.205,.48),l(.494,.252),l(.925,.235),l(.827,.052),l(.424,.097),l(.162,.282),l(.312,.451),l(.687,.463),l(1.902,.513),l(.841,.052),l(.438,-.059),l(1.354,-.262),l(1.192,-.148),l(1.469,-.079),l(.41,-.229),l(.185,-.354),l(-.131,-.905),l(.015,0),l(.441,.025),l(.562,-.13),l(.466,-.3),l(.621,-.654),l(.476,-.328),l(.413,-.144),l(.609,-.032),l(.78,.038),l(.333,-.03),l(.517,-.343),l(.343,-.129),l(.519,.054),l(1.055,.107),l(.402,.437),l(.708,.251),l(.822,.335),l(.788,.066),l(.5,.054),l(.66,.167),l(.597,.336),l(1.803,1.362),l(.655,.506),l(.696,.01),l(.787,-.075),l(.185,.211),l(.038,.848),l(.01,.565),l(.15,.692),l(.078,.028),l(-.145,.241),l(-.084,.339),l(-.246,.807),l(-.49,1.272),l(-.222,.297),l(-.596,.384),l(-.016,.141),l(.119,.663),l(.096,.098),l(.738,.235),l(.026,.183),l(-.661,.935),l(-.034,.155),l(.254,1.085),l(.167,1.283),l(.143,.775),l(.191,.21),l(.209,.041),l(1.198,.275),l(.401,.167),l(.144,.366),l(.046,.437),l(-.425,.553),l(-.853,.795),l(-.853,1.034),l(.802,1.083),l(.71,1.068),l(.353,.464),l(.695,.391),l(1.144,.388),l(.409,.224),l(.168,.38),l(.111,1.34),l(.185,.394),l(.652,.053),l(.186,.281),l(-.036,.974),l(-.188,.255),l(-.209,.072),l(-1,.077),l(-.697,.258),l(-.794,.47),l(-.285,.383),l(-.31,.792),l(-.049,.354),l(-.182,.954),l(-.502,.028),l(-1.079,-.153),l(-.236,-.197),l(-.605,-.253),l(-.403,-.056),l(-1.43,.003),l(-.783,-.041),l(-.602,.072),l(-.475,-.38),l(-.163,-.126),l(-.835,-.026),l(-.576,.001),l(-.465,.014),l(-.212,-.239),l(-.756,-.125),l(-.305,-.183),l(-.162,-.014),l(-.021,-.5),l(-.295,-.128),l(-.103,-.514),l(-.292,-.349),l(-.013,-.639),l(-.309,-.493),l(-.237,.012),l(-.035,-.181),l(-.526,-.126),l(-.807,-.013),l(-.374,.017),l(-.209,.222),l(-.329,.018),l(-.517,.075),l(-.188,.364),l(-.538,.138),l(-.383,.443),l(-.368,.283),l(-.253,.043),l(-1.292,-.689),l(-.958,-.104),l(-.562,-.359),l(-1.088,-.317),l(-.247,-.301),l(-.324,-.282),l(-.497,-.592),l(-.997,-.436),l(-.584,-.083),l(-.194,-.028),l(-.58,-.465),l(-.596,-1.058),l(-.635,-1.114),l(-.209,-.268),l(.005,-.593),l(-.767,-.761),l(-.506,-.719),l(-.921,.143),l(-.46,-.042),l(-.13,-.126),l(-.291,-.056),l(-.191,-.268),l(-.029,-.565),l(-.448,.1),l(-.166,.099),l(-.32,.678),l(-.195,.184),l(-.355,.012),l(-.014,-.12),l(-.351,-.224),l(-.686,-.546),l(.064,-.212),l(-.007,-.395),l(-.164,-.465),l(-.215,-.013),l(-.551,.003),l(-.034,-.325),l(.055,-.579),l(.197,-.622),l(.014,-.508),l(-.112,-.239),l(-.29,-.28),l(-.774,-.603),l(-.436,-.209),l(-1.242,-.925),l(-.533,-.025),l(-.321,.115),L(503,127.106),l(.033,-.819),l(-1.02,-.954),l(-.312,-.351),l(-.002,-.184),l(.133,-.875),l(.235,-.763),l(1.142,-.98),l(-.422,-.761),l(.013,-.254),l(.468,-.596),l(-1.067,-.107),l(-.761,-.208),l(-.065,-.198),l(-.563,-1.086),l(-.69,-1.397), +N(535.734,133.791),l(.853,-1.034),l(.853,-.795),l(.425,-.553),l(-.046,-.437),l(-.144,-.366),l(-.401,-.167),l(-1.198,-.275),l(-.209,-.041),l(-.191,-.21),l(-.143,-.775),l(-.167,-1.283),l(-.254,-1.085),l(.034,-.155),l(.661,-.935),l(-.026,-.183),l(-.738,-.235),l(-.096,-.098),l(-.119,-.663),l(.016,-.141),l(.596,-.384),l(.222,-.297),l(.49,-1.272),l(.246,-.807),l(.084,-.339),l(.145,-.241),l(.193,.112),l(.937,.193),l(.999,.348),l(.573,.082),l(.534,-.031),l(.636,-.3),l(.22,-.199),l(.001,-.466),l(.119,-.199),l(.568,-.159),l(1.985,-.689),l(.508,-.243),l(.103,-.128),l(.203,-.991),l(.432,-.809),l(1.135,-.205),l(.417,-.2),l(.445,-.356),l(.565,.294),l(1.454,.244),l(.096,.016),l(.646,.011),l(1.217,.05),l(.236,.126),l(.351,.48),l(.04,.055),l(.129,.141),l(.245,.041),l(.485,-.144),l(.58,-.343),l(.581,-.286),l(.325,-.001),l(.63,.237),l(.381,-.016),l(.21,-.128),l(.3,-.313),l(-.007,-.311),l(.073,-.185),l(.292,-.058),l(.587,.152),l(.133,.013),l(.442,-.158),l(.208,-.228),l(-.006,-.255),l(.049,-.425),l(.435,-.428),l(.134,-.363),l(.286,-.162),l(.384,-.016),l(.153,.056),l(.576,.45),l(-.156,.597),l(.484,-.093),l(.17,.187),l(-.029,.255),l(-.099,.775),l(-.185,.444),l(.199,.521),l(.164,.409),l(.128,.084),l(.368,.026),l(.351,-.03),l(.745,-.495),l(.589,-.064),l(.592,-.486),l(.739,-.315),l(.678,-.03),l(.198,.077),l(-.129,.176),l(.137,.059),l(.974,-.147),l(.564,-.227),l(.264,.151),l(.496,.054),l(.565,.153),l(-.192,.145),l(-.574,-.059),l(.01,.269),l(.236,.012),l(.048,.088),l(-.148,.142),l(-.358,.004),l(-.455,.297),l(-.332,-.005),l(-.338,.179),l(-.647,-.144),l(-1.345,.012),l(-1.148,.152),l(-.53,.292),l(-.272,.19),l(-.559,.395),l(-.246,-.023),l(-.258,.214),l(-.464,.413),l(.01,.32),l(.411,.271),l(.01,.336),l(.232,.171),l(-.119,.483),l(.198,.477),l(-.324,.426),l(-.524,.355),l(-.4,.341),l(-.13,.283),l(.223,.478),l(.033,.31),l(-.289,.255),l(-.513,.215),l(-.698,-.039),l(-.997,-.122),l(-.355,.129),l(.35,.336),l(.365,.407),l(.129,.281),l(.088,.437),l(-.199,.255),l(-.315,.115),l(-.513,.031),l(-.416,.115),l(-.292,.228),l(-.224,.424),l(-.288,.834),l(-.139,1.214),l(-.021,.084),l(-.34,.383),l(-.237,.086),l(-1.001,-.375),l(-.562,-.025),l(-.559,.243),l(-.362,.271),l(-.321,.693),l(-.254,.086),l(-.516,-.082),l(-.644,-.039),l(-.283,.072),l(-.597,.441),l(-.412,.369),l(-.188,.34),l(-.232,.876),l(-.099,.903),l(-.069,.184),l(-.247,.156),l(-1.066,.274),l(-1.183,.19),l(-.964,.175),l(-1.234,.12),l(-1.005,-.135),l(-.349,.002),l(-1.187,.218),l(-.742,-.024),l(-.541,-.039),l(-.854,-.235),l(-1.069,-.248),l(-.63,-.194),l(-.887,-.32), +N(486.696,126.295),l(5.257,-2.711),l(.589,-2.701),l(-.024,-.467),l(-.187,-.508),l(.009,-.255),l(.23,-.355),l(.31,-.214),l(.866,-.174),l(.457,-.371),l(.944,-.883),l(-.059,-.24),l(.23,-.043),l(.266,-.143),l(.437,-.094),l(.304,.16),l(.364,-.032),l(.811,.153),l(.343,.023),l(.244,-.234),l(.366,.082),l(.274,.151),l(-.03,.259),l(.102,.269),l(.318,.105),l(.164,-.126),l(.433,-.388),l(.407,.016),l(.69,1.397),l(.563,1.086),l(.065,.198),l(.761,.208),l(1.067,.107),l(-.468,.596),l(-.013,.254),l(.422,.761),l(-1.142,.98),l(-.235,.763),l(-.133,.875),l(.002,.184),l(.312,.351),l(1.02,.954),L(503,127.106),l(.075,.155),l(.321,-.115),l(.533,.025),l(1.242,.925),l(.436,.209),l(.774,.603),l(.29,.28),l(.112,.239),l(-.014,.508),l(-.197,.622),l(-.055,.579),l(.034,.325),l(.551,-.003),l(.215,.013),l(.164,.465),l(.007,.395),l(-.064,.212),l(.686,.546),l(.351,.224),l(.014,.12),l(-.096,.003),l(-.664,.101),l(-.408,-.056),l(-.157,.057),l(-.103,.127),l(-1.271,.044),l(-.518,.13),l(-.343,.693),l(-.463,.609),l(-.521,.568),l(-4.048,-.132),l(-1.557,-.697),l(-.812,-.277),l(-.118,-.253),l(-.047,-.818),l(.118,-.396),l(-.135,-.366),l(-.973,.048),l(-.141,-.07),l(-.399,-.633),l(-.258,-.196),l(-2.44,-1.101),l(-1.14,-.473),l(-2.034,-.934),l(-.757,-.222),l(-1.129,-.459),l(-.093,-.056),l(-.093,-.056),l(-.311,-.69),l(-.87,-1.632), +N(479.916,127.377),l(-.082,-.085),l(.047,-.122),l(-.021,-.183),l(-.201,-.128),l(-.183,-.346),l(.398,-.209),l(.041,-.099),l(.526,-.396),l(-.048,-.058),l(-.223,-.099),l(.077,-.151),l(.298,-.25),l(.599,-.006),l(-.14,-.146),l(-.035,-.046),l(.078,-.111),l(.177,-.163),l(.169,-.116),l(.299,-.239),l(-.068,-.058),l(.023,-.163),l(-.09,-.047),l(-.031,-.221),l(-.241,-.157),l(-.222,-.058),l(.204,-.204),l(-.125,-.052),l(-.053,-.116),l(-.12,.058),l(-.335,.052),l(-.388,-.023),l(-.225,-.564),l(.129,-.593),l(.072,-.064),l(-.1,-.507),l(-.42,-.326),l(.126,-.093),l(.036,-.152),l(.117,-.128),l(-.093,-.222),l(.107,-.012),l(.259,-.32),l(-.061,-.112),l(.311,-.001),l(.39,.125),l(.114,-.127),l(.171,.041),l(.2,-.169),l(.156,-.374),l(.627,-.127),l(-.243,-.423),l(-.102,-.452),l(.055,-.319),l(.142,.035),l(.222,-.001),l(.777,.166),l(.575,.025),l(.746,-.075),l(.929,-.373),l(.278,-.03),l(1.532,.444),l(.556,.153),l(1.104,-.176),l(.567,-.13),l(1.498,-.673),l(.439,-.073),l(.747,.123),l(.711,.039),l(1.185,-.224),l(.693,-.304),l(.24,-.292),l(.207,.023),l(.064,.245),l(.059,.24),l(-.944,.883),l(-.457,.371),l(-.866,.174),l(-.31,.214),l(-.23,.355),l(-.009,.255),l(.187,.508),l(.024,.467),l(-.589,2.701),l(-5.257,2.711),l(-.161,.071),l(-2.96,1.541),l(-1.139,.656),l(-.253,.016),l(-.365,-.167),l(-1.902,-1.034), +N(426.068,126.434),l(-.093,.981),l(.064,.564),l(-.093,.269),l(-.802,.428),l(-.579,.314),l(-1.473,1.138),l(-.126,.354),l(.274,.973),l(-.147,.537),l(-.155,.227),l(-.864,.598),l(-.22,.143),l(-.564,-1.536),l(-.699,-2.242),l(-.323,-.464),l(-.363,-.252),l(-.432,-.181),l(-.484,-.831),l(-.225,-.465),l(-.363,-.28),l(-.452,-.097),l(-.336,-.774),l(-.301,-.888),l(.112,-.509),l(1,-.853),l(.414,-.355),l(.163,-.411),l(.048,-.537),l(-.052,-.594),l(-.026,-.892),l(-.012,-1.429),l(.114,-.439),l(.685,-.627),l(.012,-.184),l(.508,-.185),l(.633,-.455),l(.591,-.228),l(.703,-.016),l(.643,.183),l(.247,.212),l(.059,.241),l(.25,.538),l(.27,.084),l(.417,-.171),l(.584,-.44),l(.401,-.17),l(.034,.354),l(-.265,.567),l(-.638,.511),l(-.275,.468),l(.005,.283),l(.202,.438),l(.508,.466),l(.351,.127),l(.303,.848),l(-.094,.212),l(-.541,.764),l(-.59,.34),l(-1.017,.92),l(-.216,.339),l(.287,.451),l(.587,.55),l(.528,.295),l(.284,.056),l(.396,-.227),l(.316,.084),l(.244,.635),l(.582,.239), +N(381.402,139.704),l(-.027,-.876),l(.069,-2.006),l(.037,-.382),l(.686,-.314),l(1.512,-.998),l(.963,-.542),l(1.265,.078),l(.397,-.059),l(.181,-.693),l(.864,-.033),l(.777,-.174),l(.527,-.229),l(.524,-.356),l(.484,-.652),l(1.109,-.332),l(1.52,-.701),l(.129,-.227),l(-.296,-.62),l(-.025,-.396),l(.079,-.227),l(.265,-.114),l(1.186,-.12),l(.381,-.186),l(.309,-.553),l(1.022,.022),l(.67,-.018),l(1.826,.004),l(.34,-1.033),l(-.07,-.211),l(-.507,-.322),L(397,126.646),l(-.158,-.465),l(.016,-1.271),l(.022,-.833),l(-.165,-.889),l(-.189,-.211),l(-.563,-.279),l(-.259,-.508),l(.351,0),l(.66,-.143),l(.541,-.256),l(.369,-.566),l(.405,-.312),l(.509,-.086),l(.407,-.157),l(.679,-.27),l(.324,.226),l(.176,.017),l(.249,.024),l(.238,-.142),l(.407,-.51),l(.613,-.426),l(.682,-.355),l(.614,-.171),l(1.16,-.116),l(1.587,-.06),l(.513,-.072),l(.634,-.312),l(.578,.211),l(.564,-.072),l(.585,-.313),l(.343,-.1),l(.939,.012),l(.513,-.015),l(.307,.056),l(.221,.042),l(.322,.113),l(.816,.168),l(.529,-.015),l(.772,-.171),l(.705,-.2),l(.612,-.554),l(.994,.508),l(.339,.099),l(.312,-.143),l(.314,-.241),l(.228,-.156),l(.528,.042),l(.388,.197),l(.162,.269),l(.269,.126),l(.516,-.086),l(1.093,-.158),l(-.012,.184),l(-.685,.627),l(-.114,.439),l(.012,1.429),l(.026,.892),l(.052,.594),l(-.048,.537),l(-.163,.411),l(-.414,.355),l(-1,.853),l(-.112,.509),l(.301,.888),l(.336,.774),l(.452,.097),l(.363,.28),l(.225,.465),l(.484,.831),l(.432,.181),l(.363,.252),l(.323,.464),l(.699,2.242),l(.564,1.536),l(-.204,.156),l(-.241,.383),l(.88,1.605),l(.147,.833),l(.052,.691),l(-.1,.862),l(.101,.748),l(-.16,.622),l(-.158,.495),l(.457,1.156),l(-.061,.664),l(-.086,.17),l(-.666,.47),l(-.249,.128),l(-.152,.283),l(1.272,1.702),l(.249,.917),l(.562,.873),l(.244,.154),l(.544,-.201),l(.702,.165),l(1.028,.347),l(.178,.168),l(.86,1.506),l(.098,.07),l(-.265,.186),l(-1.632,.843),l(-4.012,2.241),l(-1.607,.956),l(-2.308,1.454),l(-.834,.655),l(-3.084,2.617),l(-1.82,.364),l(-1.672,.321),l(-2.176,.408),l(-.146,-.564),l(.161,-.679),l(-.099,-.522),l(-.277,-.352),l(-.309,-.111),l(-.748,-.024),l(-.375,-.167),l(-.588,-.562),l(-.47,.314),l(-.229,-.027),l(-1.111,-1.039),l(-.393,-.28),l(-.082,-.183),l(.096,-.396),l(-.181,-.253),l(-2.472,-1.469),l(-.397,-.253),l(-1.292,-.824),l(-1.924,-1.26),l(-3.283,-2.241),l(-.811,-.575),l(-2.054,-1.344),l(-.895,-.531),l(-.1,-.084),l(-1.414,-.91),l(-4.12,-2.42),l(-2.829,-1.509), +N(395.704,122.189),l(.259,.508),l(.563,.279),l(.189,.211),l(.165,.889),l(-.022,.833),l(-.016,1.271),l(.158,.465),l(.598,.788),l(.507,.322),l(.07,.211),l(-.34,1.033),l(-1.826,-.004),l(-.67,.018),l(-1.022,-.022),l(-.309,.553),l(-.381,.186),l(-1.186,.12),l(-.265,.114),l(-.079,.227),l(.025,.396),l(.296,.62),l(-.129,.227),l(-1.52,.701),l(-1.109,.332),l(-.484,.652),l(-.524,.356),l(-.527,.229),l(-.777,.174),l(-.864,.033),l(-.181,.693),l(-.397,.059),l(-1.265,-.078),l(-.963,.542),l(-1.512,.998),l(-.686,.314),l(-.037,.382),l(-.069,2.006),l(-1.42,.008),l(-1.718,-.004),l(-2.677,.001),l(-2.511,0),l(-1.635,.04),l(.141,-.28),l(.431,-.411),l(.427,-.085),l(1.296,-.285),l(1.143,-.455),l(.453,-.312),l(1.147,-.85),l(1.149,-.878),l(1.043,-1.104),l(.46,-.693),l(.133,-.509),l(-.05,-.494),l(-.427,-.776),l(-.09,-.678),l(.099,-.508),l(.396,-.636),l(.706,-.863),l(.211,-.65),l(-.063,-.367),l(.071,-.353),l(1.285,-1.203),l(.724,-.481),l(.916,-.327),l(1.266,-.469),l(.73,-.397),l(.558,-.552),l(.537,-.736),l(.466,-.905),l(.829,-1.925),l(.269,-.128),l(.54,-.171),l(.19,.127),l(.684,.848),l(.138,.099),l(1.148,.507),l(.661,-.001),l(.595,.042),l(1.304,-.074),l(.522,-.228),l(.437,-.27),l(.398,.551),l(.256,.099),l(.798,.097),l(.361,0), +N(480.248,123.437),l(.388,.023),l(.335,-.052),l(.12,-.058),l(.053,.116),l(.125,.052),l(-.204,.204),l(.222,.058),l(.241,.157),l(.031,.221),l(.09,.047),l(-.023,.163),l(.068,.058),l(-.299,.239),l(-.169,.116),l(-.177,.163),l(-.078,.111),l(.035,.046),l(.14,.146),l(-.599,.006),l(-.298,.25),l(-.077,.151),l(.223,.099),l(.048,.058),l(-.526,.396),l(-.041,.099),l(-.398,.209),l(-.07,-.023),l(-.088,.041),l(-.067,.193),l(-.009,.167),l(-.355,.07),l(-.07,-.099),l(-.151,-.022),l(-.372,.051),l(.26,-.291),l(.097,-.361),l(.169,-.227),l(.328,-.681),l(-.017,-.232),l(.181,0),l(.138,-.192),l(.072,-.32),l(.018,-.32),l(.409,-.431),l(.232,-.07),l(.116,-.174),l(-.048,-.157), +N(184.444,142.729),l(-.367,.82),l(-.518,.821),l(-.186,.763),l(-.179,1.159),l(.017,1.851),l(-.133,1.187),l(-.016,1.13),l(.564,1.737),l(.275,.805),l(.624,.945),l(.76,.903),l(.191,.452),l(.481,.521),l(.529,.974),l(.729,1.228),l(.375,.296),l(.677,.069),l(.436,-.015),l(.577,.154),l(.593,.451),l(.503,.508),l(.773,.069),l(1.016,-.242),l(1.55,-.456),l(1.396,-.3),l(.803,-.157),l(-.02,.542),l(.838,.223),l(.264,-.286),l(.293,-.199),l(-.104,-.247),l(-.393,-.175),l(1.073,-.62),l(.633,-.62),l(.086,-.827),l(.498,-.429),l(-.094,-.477),l(.092,-1.145),l(.254,-.699),l(.625,-.334),l(.164,-.043),l(.757,-.198),l(.701,-.1),l(1.088,-.229),l(1.016,-.37),l(.594,-.058),l(.499,.056),l(1.139,.181),l(.502,-.194),l(.378,.093),l(.62,.507),l(.047,.297),l(-.079,.424),l(-.298,.382),l(-.541,.496),l(-.433,.425),l(-.317,.445),l(-.02,.7),l(-.254,.297),l(-.188,.354),l(.155,.155),l(.337,-.138),l(-.101,.652),l(-.262,1.196),L(205.356,159),l(-.062,.24),l(-.34,-.534),l(-.167,-.452),l(-.072,-.155),l(-.386,.34),l(-.02,.549),l(-.437,.016),l(-.178,.447),l(-.599,.857),l(-.386,-.27),l(-.278,.095),l(.025,.329),l(-2.332,-.006),l(-1.792,-.005),l(-.04,1.24),l(-.999,.032),l(.396,.223),l(.495,.541),l(.624,.231),l(.359,.69),l(.532,.223),l(-.211,.683),l(-1.762,-.007),l(-1.06,.007),l(-1.076,1.812),l(.305,.397),l(-.207,.238),l(.054,.553),l(.044,.454),l(-.704,-.555),l(-.952,-.888),l(-.956,-.761),l(-1.069,-.859),l(-.534,-.352),l(-.053,-.071),l(-.639,-.252),l(-1.048,-.21),l(-.657,.044),l(-.817,.397),l(-1.1,.567),l(-.756,.256),l(-.931,-.069),l(-.724,-.21),l(-.48,-.197),l(-1.305,-.195),l(-.588,-.267),l(-.644,-.422),l(-.935,-.521),l(-.785,-.267),l(-1.711,-.392),l(-.963,-.365),l(-.722,-.366),l(-1.074,-.436),l(-.592,-.352),l(-1.123,-1),l(-.207,-.07),l(-.606,.058),l(-.689,-.14),l(-1.835,-.575),l(-.565,-.536),l(-.503,-.634),l(-.495,-.395),l(-1.049,-.577),l(-.619,-.267),l(-.5,-.494),l(-.742,-.987),l(-.363,-.55),l(-.038,-.113),l(.15,-.155),l(.504,-.086),l(.18,-.17),l(.047,-.184),l(-.331,-.367),l(.457,-.679),l(.041,-.381),l(-.172,-.466),l(-.744,-.959),l(.121,-.297),l(.146,-.17),l(-.07,-.268),l(-.665,-.62),l(-1.495,-1.777),l(-.546,-.493),l(-.963,-1.058),l(-.474,-.522),l(-.815,-.578),l(-.322,-.197),l(-.158,-.268),l(-.058,-.48),l(-.144,-.183),l(-.329,-.197),l(-.609,-.197),l(-.408,-.31),l(-.366,-.522),l(-.271,-.028),l(-.414,.114),l(-.238,-.155),l(-.163,-.367),l(-.005,-.325),l(.459,-.736),l(-.126,-.339),l(-.751,-.62),l(-.439,.255),l(-.375,-.621),l(-.118,-.353),l(-.359,-.211),l(-.61,-.168),l(-.319,-.296),l(-.125,-.254),l(.05,-.381),l(.084,-.269),l(-.185,-.226),l(-.561,-.21),l(-.46,-.098),l(-.46,-.253),l(-.935,-.86),l(-.478,-.706),l(-.281,-.551),l(-.646,-.832),l(-.736,-1.073),l(-.184,-.423),l(-.38,-.678),l(-.242,-.338),l(-.152,-.452),l(.042,-.509),l(.032,-.311),l(-.56,-.239),l(-.795,-.196),l(-.06,-.452),l(-.128,-.155),l(-.458,-.183),l(-.289,.326),l(-.251,.043),l(-1.43,-.647),l(-.285,1.004),l(-.045,.438),l(.033,.084),l(.265,.339),l(.264,.296),l(.028,1.046),l(.088,.509),l(.51,.677),l(.143,.169),l(.643,.267),l(.601,.536),l(.525,.663),l(.602,1.214),l(.44,.282),l(.328,.042),l(.237,.169),l(.325,1.398),l(.102,.169),l(.246,.155),l(.497,.056),l(.133,.056),l(.215,.438),l(.161,.65),l(.445,.79),l(.49,-.071),l(.223,-.142),l(.245,.452),l(.344,1.469),l(.531,1.059),l(.649,1.2),l(.069,.593),l(-.014,.522),l(.26,.353),l(.378,.154),l(.389,-.17),l(.234,-.198),l(.588,.804),l(.258,.579),l(.464,.253),l(.281,.014),l(.133,.311),l(-.196,.537),l(-.136,.127),l(-.691,.595),l(-.254,-.042),l(-.251,-.409),l(-.24,-.734),l(-.617,-.578),l(-.625,-.309),l(-.516,-.479),l(-.834,-.507),l(-1.143,-.986),l(-.416,-.451),l(-.162,-.269),l(.216,-.989),l(-.035,-.254),l(-.488,-1.002),l(-.238,-.381),l(-.327,-.282),l(-.44,-.098),l(-.5,-.31),l(-.675,-.677),l(-.305,.142),l(-.363,-.056),l(-1.262,-.746),l(-.722,-.31),l(-.896,-.973),l(-.139,-.127),l(-.246,-.254),l(.679,.15),l(.599,.013),l(.588,-.284),l(.244,-.326),l(.093,-.636),l(-.01,-.184),l(-.458,-.635),l(-.466,-.452),l(-1.1,-.888),l(-.986,-.493),l(-.402,-.338),l(-.203,-.522),l(-.272,-.649),l(-.091,-.155),l(-.447,-.126),l(-.15,-.353),l(-.026,-.594),l(-.203,-.395),l(-.623,-.734),l(-.434,-.706),l(-.003,-.254),l(.212,-.382),l(-.777,-.62),l(-.254,-.325),l(-.22,-.485),l(.34,-.017),l(2.367,-.155),l(2.381,-.084),l(.316,.31),l(.267,.154),l(1.186,.39),l(2.811,.933),l(3.516,1.112),l(.338,.055),l(1.662,.019),l(1.544,.02),l(.966,.037),l(1.867,-.011),l(.213,-.101),l(.096,-.892),l(1.858,.003),l(1.892,.046),l(.209,.112),l(.631,.662),l(.766,.632),l(.837,.519),l(.708,.491),l(.179,.226),l(.284,.678),l(.318,.847),l(.445,.549),l(1.092,.659),l(1.104,.503),l(.337,.069),l(.501,.011),l(.416,-.158),l(.283,-.37),l(.418,-.413),l(.576,-.541),l(.468,-.201),l(.643,-.018),l(.475,.082),l(.783,.321),l(.412,.252),l(.363,.366),l(.663,1.029),l(.744,1.227),l(.845,1.042),l(.657,.576),l(.268,.253),l(.078,.467),l(.332,.932),l(.336,.592),l(.375,.365),l(.921,.32),l(1.029,.56),l(.264,.069),l(.416,-.116),l(.296,-.001),l(.816,.377),l(.347,.119), +N(507.047,133.665),l(.055,.197),l(.134,.691),l(-.336,-.028),l(-.513,.513),l(.421,.194),l(.418,-.206),l(.306,.021),l(.698,1.84),l(-.644,.044),l(-1.07,-.05),l(-.185,-.239),l(-.334,-.619),l(-.408,-.054),l(-1.657,-.259),l(.521,-.568),l(.463,-.609),l(.343,-.693),l(.518,-.13),l(1.271,-.044), +N(606.155,150.953),l(.595,.152),l(.255,.14),l(.25,-.129),l(.273,-.368),l(.015,-.678),l(-.152,-.93),l(.228,-.185),l(.401,-.144),l(.191,-.354),l(-.146,-1.594),l(.133,-.283),l(.811,.32),l(.391,.11),l(.309,.013),l(.17,-.128),l(1.148,-2.25),l(0,-.324),l(-.192,-.408),l(.045,-.212),l(.938,-1.134),l(.136,-.382),l(-.057,-.761),l(.197,-.354),l(1.446,-.883),l(.719,-.512),l(.312,-.129),l(.558,.082),l(.853,.221),l(.295,-.058),l(-.184,-.718),l(.072,-.283),l(.596,-.582),l(.112,-.24),l(.018,-.508),l(.001,-.127),l(.306,-.34),l(.277,-.044),l(.504,.279),l(.397,.435),l(.243,.901),l(.217,.309),l(.287,.041),l(.504,-.031),l(.146,.14),l(.195,1.649),l(.02,.875),l(-.353,.862),l(-.429,.722),l(-.611,.525),l(-.487,.271),l(-.191,.198),l(-.617,.85),l(.075,.465),l(.163,.705),l(-.224,.58),l(0,.268),l(.216,.069),l(.312,-.086),l(.819,-.442),l(.771,-.089),l(.479,-.017),l(.156,.126),l(.277,1.762),l(.202,.324),l(.554,-.074),l(.521,.096),l(.033,.268),l(-.729,1.584),l(.117,.352),l(.228,.098),l(.507,-.003),l(.481,-.045),l(.291,.379),l(.341,.746),l(.378,.266),l(.246,.083),l(.647,-.159),l(.628,-.413),l(.111,.38),l(.153,.239),l(-.502,.355),l(-.53,.61),l(-.442,.581),l(-.582,.455),l(-.193,.185),l(-.08,.085),l(-.158,.071),l(-.645,.06),l(-.436,.172),l(-.528,.342),l(-.394,.595),l(-1.078,.316),l(-.62,.018),l(-.474,-.082),l(-.362,.411),l(-.143,.368),l(-.036,.819),l(-.114,.509),l(.064,.409),l(-.086,.24),l(-.163,.001),l(-.588,.131),l(.739,.884),l(.069,.183),l(.112,.875),l(.254,.14),l(1.091,.953),l(.148,.324),l(.646,1.041),l(.163,.338),l(-.194,.241),l(-.451,.229),l(-.128,.226),l(.231,1.185),l(-.171,.198),l(-.812,.428),l(.178,.38),l(.6,1.436),l(.54,.477),l(.606,.604),l(.203,.479),l(.088,.663),l(-.086,.636),l(.006,.254),l(.488,1.183),l(.586,1.225),l(-.077,.297),l(-1.011,1.559),l(-1.01,1.7),l(-.098,.374),l(-.359,-.181),l(-.075,-.805),l(.461,-.665),l(.174,-.495),l(.122,-.777),l(.287,-.466),l(-.512,-.027),l(-.104,-.084),l(-.004,-.282),l(.195,-.509),l(-.177,-1.524),l(-.246,-.832),l(-.639,-1.185),l(-.488,-1.312),l(-.347,-.846),l(-.179,-.875),l(-.174,-1.736),l(-.117,-.677),l(-.034,-.564),l(-.051,-.212),l(-.344,-.084),l(-.148,-.098),l(-.304,-.917),l(-.516,-.677),l(-.226,-.225),l(-.247,.029),l(-.081,.988),l(-.158,.424),l(-.43,.41),l(-.59,.284),l(-1.089,.511),l(-.359,.622),l(-.298,.297),l(-.196,.142),l(-.237,-.282),l(-.007,-.438),l(-.212,.015),l(-.338,.354),l(-.321,-.013),l(-.166,-.211),l(.147,-.495),l(-.001,-.113),l(-.621,.171),l(-.276,.127),l(-.247,.283),l(-.355,-.126),l(-.002,-.466),l(.553,-1.54),l(.162,-.791),l(.001,-.889),l(-.101,-1.059),l(-.384,-.973),l(-.431,-1.072),l(-.196,-.296),l(-.281,.537),l(-.32,-.126),l(-.526,-.366),l(.482,-.17),l(.312,-.015),l(-.149,-.479),l(-.054,-.268),l(-.684,-.775),l(-.182,-.183),l(-.19,-.028),l(-.407,.1),l(-.38,-.267),l(.086,-.438),l(-.026,-.141),l(-.209,-.112),l(-.365,.043),l(-.577,-.465),l(-.504,-.606),l(-.117,-.244),l(.252,-.341),l(.801,-.527),l(-.194,-1.607), +N(605.297,153.429),l(-.126,-.264),l(-.269,-.55),l(-.223,-1.213),l(-.611,-1.41),l(-.357,-.395),l(-.73,.354),l(-.393,0),l(-.034,-.084),l(-.242,-.211),l(-.356,-.592),l(-.124,-.042),l(-.152,.127),l(-.026,.537),l(.374,.79),l(-.006,.424),l(-.143,.169),l(-.455,.086),l(-.235,.537),l(-.261,.1),l(-.255,-.437),l(-.311,-.395),l(-.073,-.057),l(-.163,.669),l(-.28,.249),l(-.203,.043),l(-.271,-.536),l(-.495,.636),l(-.359,-.265),l(-.147,-.532),l(-.402,-1.775),l(-.325,-1.409),l(-.352,-.45),l(-.04,-.254),l(.505,-.765),l(.029,-.269),l(-.193,-.21),l(-1.042,-.431),l(-.339,-.323),l(.548,-.61),l(.4,-.299),l(.502,-.13),l(.382,-.101),l(.047,-.155),l(-.126,-.112),l(-1.224,-.938),l(-.494,-.237),l(-.083,-.155),l(.124,-.283),l(.555,-.525),l(.234,-.171),l(1.252,.303),l(.339,.266),l(.372,.266),l(.489,-.06),l(.417,.054),l(.129,.324),l(.053,.479),l(.079,.719),l(.095,.099),l(.537,.109),l(.547,.053),l(.916,-.062),l(.559,-.003),l(2.473,.198),l(.111,.098),l(.057,.127),l(-.012,.79),l(-.159,.34),l(-.938,.767),l(-.498,.13),l(-.651,.356),l(-.131,.283),l(.009,.522),l(.001,.381),l(.23,.281),l(.249,.267),l(.529,.448),l(.224,-.354),l(.395,-1.159),l(.281,-.115),l(.4,-.044),l(.064,.578),l(.627,2.479),l(.037,.466),l(.194,1.607),l(-.801,.527),l(-.252,.341), +N(627.408,186.411),l(-.086,.337),l(-.495,.35),l(-.11,.575),l(-.644,.089),l(-.05,-.478),l(-.309,-.163),l(-.279,.28),l(-.244,.394),l(-.204,-.083),l(-.118,-.239),l(.213,-.398),l(-.041,-.21),l(-.055,-.226),l(-.261,-.238),l(-.447,-.119),l(-.106,-.466),l(-.571,.013),l(-.448,.17),l(.013,-.104),l(.128,-.297),l(-.15,-.183),l(-.411,.212),l(-.301,-.07),l(-.38,-.38),l(-.116,-.508),l(.064,-.282),l(-.151,-.438),l(-.229,-.169),l(-.388,.043),l(-.39,-.719),l(-.209,-.508),l(-.3,-.324),l(-.311,-.155),l(-.456,-.395),l(-.343,.1),l(-.218,.142),l(-.216,-.381),l(-.04,-.607),l(.163,-.749),l(.559,-1.738),l(.29,-.848),l(-.087,-.044),l(.098,-.374),l(1.01,-1.7),l(1.011,-1.559),l(.077,-.297),l(-.586,-1.225),l(-.488,-1.183),l(-.006,-.254),l(.086,-.636),l(-.088,-.663),l(-.203,-.479),l(-.606,-.604),l(-.54,-.477),l(-.6,-1.436),l(-.178,-.38),l(.812,-.428),l(.171,-.198),l(-.231,-1.185),l(.128,-.226),l(.451,-.229),l(.194,-.241),l(-.163,-.338),l(-.646,-1.041),l(-.148,-.324),l(-1.091,-.953),l(-.254,-.14),l(-.112,-.875),l(-.069,-.183),l(-.739,-.884),l(.588,-.131),l(.163,-.001),l(.086,-.24),l(-.064,-.409),l(.114,-.509),l(.036,-.819),l(.143,-.368),l(.362,-.411),l(.474,.082),l(.62,-.018),l(1.078,-.316),l(.394,-.595),l(.528,-.342),l(.436,-.172),l(.645,-.06),l(.158,-.071),l(.08,-.085),l(.541,.166),l(.295,.182),l(.118,.168),l(.01,.423),l(-.106,.805),l(.066,.367),l(.186,.154),l(.423,-.003),l(.489,-.2),l(.414,-.045),l(.045,.113),l(.249,1.311),l(-.085,.41),l(-.528,1.569),l(-.117,.438),l(-.027,.494),l(.145,.324),l(.481,.138),l(.37,-.411),l(1.173,-1.178),l(.346,-.03),l(.835,.348),l(.59,.265),l(.223,-.072),l(.543,-.257),l(.2,-.538),l(.286,-.453),l(.403,.012),l(.893,.192),l(.266,.153),l(.052,.282),l(.285,.535),l(.688,.659),l(.435,.632),l(.058,1.524),l(.107,.366),l(.255,.464),l(.979,1.279),l(.419,.703),l(.157,.507),l(.002,.945),l(-.121,.438),l(-.808,.64),l(-.301,-.167),l(-.599,-.109),l(-.575,-.039),l(-.558,.074),l(-.798,-.066),l(-1.172,.091),l(-.383,.101),l(-.521,.441),l(-.92,1.233),l(-.146,.297),l(-.076,.382),l(.026,.635),l(.219,.648),l(.487,.717),l(.16,.479),l(-.146,.176),l(-.026,-.063),l(-.286,-.183),l(-.458,-.084),l(-.9,-.887),l(-.434,-.154),l(-.304,-.014),l(-.572,.227),l(-.391,-.112),l(-.29,-.141),l(-.337,-.014),l(0,-.282),l(.19,-1.243),l(-.107,-.184),l(-.719,-.055),l(-.248,-.084),l(-.521,.043),l(-.443,.212),l(-.244,.297),l(.207,.593),l(-.103,.339),l(-.318,.707),l(.083,.579),l(.054,.41),l(-.293,.664),l(-.583,1.187),l(-.7,1.682),l(-.255,1.314),l(.104,1.171),l(.172,.296),l(.229,.169),l(.55,-.072),l(.396,-.142),l(.252,.07),l(.135,.353),l(.009,.325),l(-.08,.466),l(.141,.282),l(.178,.211),l(.271,-.094),l(.17,.46),l(.209,.974),l(-.032,.254),l(.127,.737),l(.434,.871),l(.167,.155),l(.801,.281),l(.539,.112),l(.467,-.058),l(.294,.197),l(.266,.612),l(.664,.544),l(.212,.145), +N(204.31,158.989),l(-.175,.412),l(.612,-.173),l(.026,.429),l(-.419,1.241),l(.178,.269),l(-.237,.795),l(.189,.318),l(-.092,.397),l(-.358,.875),l(-.3,.35),l(-.36,.032),l(-.054,.286),l(-.388,.238),l(0,.286),l(-.69,.016),l(.215,-4.297),l(-.025,-.329),l(.278,-.095),l(.386,.27),l(.599,-.857),l(.178,-.447),l(.437,-.016), +N(200.276,169.481),l(-.151,-.056),l(-.928,-.342),l(-.614,.032),l(-.766,-.032),l(-.608,-.239),l(-.909,-.656),l(-.513,-.419),l(-.044,-.454),l(-.054,-.553),l(.207,-.238),l(-.305,-.397),l(1.076,-1.812),l(1.06,-.007),l(1.762,.007),l(.211,-.683),l(-.532,-.223),l(-.359,-.69),l(-.624,-.231),l(-.495,-.541),l(-.396,-.223),l(.999,-.032),l(.04,-1.24),l(1.792,.005),l(2.332,.006),l(-.215,4.297),l(.69,-.016),l(.303,.095),l(.311,.302),l(.14,-.191),l(-.066,-.381),l(.336,.157),l(.458,.367),l(-1.507,1.208),l(-.499,.238),l(-.177,.493),l(.162,.604),l(-.438,.302),l(-.467,.048),l(-.043,.254),l(.164,.159),l(-.351,.111),l(-.184,.302),l(-.22,-.016),l(-.565,.461),l(-.012,.223), +N(204.413,165.093),l(.312,-.03),l(.612,-.27),l(.639,-.058),l(.743,.126),l(.478,.069),l(1.443,.04),l(.699,-.228),l(.379,-.199),l(.567,.267),l(.788,-.03),l(.763,-.101),l(.63,-.001),l(.5,.126),l(.564,.253),l(-.038,.353),l(-.102,.226),l(.228,.282),l(.787,.238),l(.557,.069),l(.244,.524),l(-1.425,.486),l(-.424,.229),l(-.248,.086),l(-.463,-.097),l(-.328,-.182),l(-.259,-.013),l(-.294,.242),l(-.503,.794),l(-1.207,.997),l(-.725,-.42),l(-.513,.583),l(-.882,.034),l(-.005,.961),l(-.293,.412),l(-.29,.143),l(-1.001,.125),l(-.311,-.661),l(-.025,-.085),l(-.478,-.3),l(.085,-.731),l(-.128,-.175),l(-.272,0),l(-.541,-.276),l(-.433,.34),l(-.365,-.016),l(-.066,-.271),l(-.565,-.35),l(-.409,-.08),l(-.208,-.418),l(-.677,-.17),l(.438,-.302),l(-.162,-.604),l(.177,-.493),l(.499,-.238),l(1.507,-1.208), +N(205.532,170.085),l(.035,.076),l(-.203,.057),l(.01,.265),l(-.237,.334),l(-.68,-.046),l(-.853,-.139),l(-1.697,-.505),l(-1.305,-.435),l(-.325,-.21),l(.012,-.223),l(.565,-.461),l(.22,.016),l(.184,-.302),l(.351,-.111),l(-.164,-.159),l(.043,-.254),l(.467,-.048),l(.677,.17),l(.208,.418),l(.409,.08),l(.565,.35),l(.066,.271),l(.365,.016),l(.433,-.34),l(.541,.276),l(.272,0),l(.128,.175),l(-.085,.731), +N(242.38,173.617),l(-.128,-.105),l(-.84,.171),l(-.534,.156),l(-.414,.2),l(-.056,.288),l(.048,.497),l(-.129,.396),l(-.227,-.027),l(-.381,.059),l(-.99,1.758),l(-.172,.722),l(-.241,.722),l(-.709,1.191),l(.402,.025),l(.234,-.1),l(.384,-.017),l(.31,.606),l(.855,1.45),l(.103,.395),l(-.226,1.132),l(.099,.353),l(.401,.309),l(.429,.548),l(.397,.252),l(.496,-.017),l(1.163,-.12),l(1.167,-.05),l(.521,.181),l(.64,.321),l(.188,.253),l(.847,.998),l(.554,.576),l(.144,0),l(.522,-.13),l(.76,-.174),l(1.99,-.224),l(.644,.081),l(-.409,.525),l(-.085,1.004),l(-.379,.511),l(-.147,.326),l(.026,.254),l(.035,.438),l(.048,.367),l(.162,.804),l(.447,.789),l(.256,.437),l(.486,.647),l(.121,.282),l(-.731,.612),l(-.479,.526),l(.51,.491),l(.797,1.182),l(-.52,.286),l(-.834,.57),l(-.412,.158),l(-.463,.017),l(-2.812,-.082),l(-.64,-.024),l(-.042,.325),l(-.013,1.031),l(.178,.154),l(.896,.122),l(.177,.084),l(.293,.408),l(.052,.367),l(-.384,-.04),l(-.417,-.11),l(-.687,.032),l(-.493,.187),l(-.111,.085),l(-.001,1.071),l(0,.554),l(.192,.197),l(.688,.363),l(.192,.183),l(-.031,.777),l(.399,.562),l(.031,.212),l(-.326,1.428),l(-.706,4.411),l(-.073,.382),l(-.133,.198),l(-.156,-.14),l(-.575,-.703),l(-.237,-.126),l(-.161,.058),l(-.448,.031),l(1.155,-1.956),l(.035,-.198),l(-.127,-.069),l(-1.299,-.84),l(-.509,-.209),l(-.708,.442),l(-.397,-.182),l(-.523,-.421),l(-.452,.427),l(-.337,.157),l(-.496,.031),l(-1.038,-.008),l(-.573,-.152),l(-.092,-.281),l(.004,-.396),l(-.173,-.296),l(-.479,-.039),l(-.366,-.14),l(-.078,-.282),l(-.251,-.761),l(-.988,-.672),l(-.526,-.364),l(-.208,-.62),l(-.208,-.324),l(-.513,-.435),l(-.897,-.418),l(-.927,-.107),l(-.081,-.112),l(-.269,-.162),l(-.197,-.118),l(-.709,-.631),l(-.128,-.056),l(-.89,.401),l(-.67,.061),l(-.977,-.277),l(-.355,-.309),l(-.166,-.493),l(-.227,-.225),l(-1.432,-.656),l(-1.496,-.803),l(.033,-.068),l(-.117,-.311),l(-.181,-.282),l(.108,-.212),l(.509,-.114),l(.465,.112),l(.186,-.325),l(-.348,-.564),l(.086,-.424),l(.314,-.227),l(.878,-.058),l(.193,.042),l(.41,-.227),l(.445,-.679),l(.45,-.961),l(.651,-1.061),l(-.122,-.268),l(-.56,-.408),l(-.071,-.184),l(.306,-.721),l(.089,-.523),l(-.149,-.861),l(-.371,-.86),l(.085,-.254),l(.49,-.143),l(.135,-.212),l(-.088,-.198),l(-.565,-.479),l(-.042,-.226),l(.103,-.198),l(.242,-.326),l(.036,-.254),l(-.173,-.282),l(-.739,-.719),l(-.364,-.396),l(.256,-.753),l(.228,-.082),l(-.045,-.45),l(.19,.082),l(.085,.307),l(.584,-.409),l(.094,-.43),l(.322,-.062),l(-.509,-1.038),l(-.228,-.149),l(-.084,-.327),l(.142,.075),l(.42,.338),l(.397,.507),l(.22,.508),l(.235,.197),l(.199,-.17),l(.147,-.241),l(-.332,-.776),l(.02,-.212),l(.176,-.297),l(.445,-.34),l(.399,-.297),l(.501,-.736),l(.327,-.156),l(.684,-.101),l(.217,-.382),l(-.104,-.381),l(.174,-.777),l(.067,-.65),l(.207,-.48),l(.498,-.439),l(.429,-.283),l(.592,-.242),l(.113,0),l(.374,.206),l(.22,.443),l(.281,-.34),l(.031,-.438),l(.199,-.551),l(.22,-.071),l(.267,.126),l(.855,.041),l(.562,-.001),l(.623,-.27),l(.237,-.254),l(.476,-.298),l(.848,-.256),l(.435,-.396),l(.278,-.551),l(.333,-.255),l(.469,-.17),l(.58,.013),l(.526,.338),l(.155,.126),l(.155,.339),l(-.285,.332), +N(408.6,174.04),l(-.062,.777),l(.164,.762),l(.388,.718),l(-.316,.962),l(-.19,.566),l(-.223,.298),l(-.656,.414),l(-.095,.34),l(.116,.592),l(-.078,.368),l(-.433,.13),l(-.257,.03),l(-.237,.397),l(.002,.381),l(.003,.48),l(-.012,.876),l(-.09,.989),l(.217,1.439),l(-.121,1.188),l(.006,.234),l(-.333,.015),l(-1.232,.144),l(-.669,.052),l(-.106,-.205),l(-.295,-1.072),l(.188,-.708),l(.026,-.833),l(-.036,-.537),l(-.135,-.974),l(-.006,-.862),l(-.035,-.522),l(.013,-.579),l(-.442,-1.311),l(-.164,-.691),l(-.403,-.323),l(-.468,-.294),l(-.18,-.395),l(.141,-.594),l(.046,-.424),l(.062,-.142),l(.24,-.157),l(.366,-.553),l(.415,-.271),l(.418,-.045),l(.739,.095),l(.337,-.158),l(.415,-.468),l(.237,-.764),l(-.131,-.367),l(.577,-.3),l(.321,-.073),l(.339,.28),l(.727,.589),l(.902,.503), +N(394.266,178.814),l(.191,-.17),l(-.02,-.41),l(-.261,-1.934),l(.125,-.34),l(.271,-.157),l(2.119,-.041),l(.867,.037),l(1.429,.006),l(.976,-.458),l(.161,.032),l(.595,.119),l(-.25,.849),l(.05,.254),l(.633,.915),l(.244,.451),l(-.188,.721),l(.02,.396),l(.265,1.114),l(.181,.592),l(.503,.788),l(.032,.155),l(-.286,.242),l(-.174,.382),l(.01,1.314),l(-.011,.72),l(.021,.551),l(.18,.479),l(.468,.577),l(.752,.608),l(-.503,.682),l(-.304,.099),l(-.593,-.013),l(-.992,.144),l(-.463,.185),l(-.188,.098),l(-.898,.469),l(-1.263,.398),l(-.942,.412),l(-.958,.567),l(-.578,-.324),l(-.945,-.436),l(-.074,-.124),l(-.066,-.741),l(-.554,-1.155),l(-.263,-.747),l(-.103,-.706),l(.327,-1.005),l(.437,-1.274),l(.521,-.851),l(.203,-.595),l(-.334,-1.438),l(-.189,-1.285),l(-.178,-.154), +N(400.72,175.499),l(1.013,.163),l(.611,.166),l(.29,.041),l(-.046,.424),l(-.141,.594),l(.18,.395),l(.468,.294),l(.403,.323),l(.164,.691),l(.442,1.311),l(-.013,.579),l(.035,.522),l(.006,.862),l(.135,.974),l(.036,.537),l(-.026,.833),l(-.188,.708),l(.295,1.072),l(.106,.205),l(-.452,.035),l(-.479,.128),l(-.368,.212),l(-.023,.04),l(-.752,-.608),l(-.468,-.577),l(-.18,-.479),l(-.021,-.551),l(.011,-.72),l(-.01,-1.314),l(.174,-.382),l(.286,-.242),l(-.032,-.155),l(-.503,-.788),l(-.181,-.592),l(-.265,-1.114),l(-.02,-.396),l(.188,-.721),l(-.244,-.451),l(-.633,-.915),l(-.05,-.254),l(.25,-.849), +N(383.772,190.418),l(.041,-.919),l(.105,-.565),l(.247,-.849),l(.059,-.452),l(-.131,-.282),l(-1.264,-1.334),l(-.592,.032),l(-.369,-.097),l(-.194,-.183),l(-.05,-.183),l(.501,-.865),l(.059,-.438),l(-.119,-.55),l(.062,-.17),l(.047,-.099),l(.602,-.554),l(.188,-.354),l(-.179,-.21),l(-.296,-.549),l(.03,-.127),l(.158,-.199),l(.304,-.03),l(.548,.223),l(.304,.012),l(.19,-.143),l(-.051,-.226),l(-.648,-.561),l(-.309,-.351),l(.332,-.37),l(.125,-.283),l(-.197,-.31),l(-.695,-.405),l(-.214,-.409),l(.264,-.623),l(.379,-.397),l(.522,-.54),l(.352,-.059),l(.566,.321),l(.455,.436),l(.35,-.228),l(.362,-.469),l(.571,-.483),l(.239,-.114),l(.257,.041),l(.147,.211),l(.004,.297),l(.117,.381),l(.148,.239),l(.352,-.059),l(.604,-.399),l(.159,-.1),l(.259,.168),l(.545,-.003),l(.308,.252),l(.15,.465),l(.52,.562),l(.452,.223),l(.354,.083),l(.368,-.115),l(.446,-.257),l(.608,-.159),l(.769,-.075),l(.644,.166),l(.63,.434),l(.178,.154),l(.189,1.285),l(.334,1.438),l(-.203,.595),l(-.521,.851),l(-.437,1.274),l(-.327,1.005),l(.103,.706),l(.263,.747),l(.554,1.155),l(.066,.741),l(-.119,-.201),l(-.289,-.197),l(-.208,.015),l(-.143,.24),l(-.096,.042),l(-.48,-.027),l(-.705,-.167),l(-.608,-.083),l(-2.352,.062),l(-1.279,.243),l(-.575,.199),l(-1.07,.369),l(-1.739,.781),l(-.701,.425),l(-.256,-.013),l(-.075,-.032), +N(627.408,186.411),l(.035,.024),l(.523,.098),l(1.061,1.198),l(.693,.916),l(.506,.762),l(.081,.579),l(-.023,.805),l(-.134,.862),l(.07,1.073),l(-.07,.636),l(.097,.494),l(.196,.381),l(.53,.493),l(.338,.536),l(.705,1.608),l(.062,.127),l(-.366,-.069),l(-.895,-.055),l(-.401,.142),l(-.175,-.07),l(-.521,-.437),l(-.885,-.605),l(-.6,-.337),l(-1.231,-.675),l(-1.02,-.732),l(-.217,-.254),l(-.16,-.988),l(-.438,-.691),l(-.895,-.817),l(-.195,-.663),l(.039,-.494),l(.03,-.283),l(-.107,-.409),l(-.399,-.634),l(-.347,-1.849),l(-.188,-.72),l(.043,-.362),l(.448,-.17),l(.571,-.013),l(.106,.466),l(.447,.119),l(.261,.238),l(.055,.226),l(.041,.21),l(-.213,.398),l(.118,.239),l(.204,.083),l(.244,-.394),l(.279,-.28),l(.309,.163),l(.05,.478),l(.644,-.089),l(.11,-.575),l(.495,-.35),l(.086,-.337),M(643.95,196.042),l(.081,.044),l(.375,.408),l(.397,.141),l(.861,.083),l(.413,.168),l(.761,.436),l(.335,.042),l(.337,-.1),l(-.503,-.535),l(.169,-.551),l(.365,-.608),l(.528,-1.258),l(.584,-.27),l(1.481,-.342),l(1.018,-.299),l(.428,-.326),l(.524,-1.021),l(.523,-.323),l(.87,-1.117),l(.22,-.212),l(.244,-.147),l(.112,-.068),l(.084,.126),l(.062,.37),l(.234,-.012),l(.111,.259),l(.309,.271),l(.383,-.271),l(1.234,-.42),l(-.025,-.086),l(-.197,-.197),l(.013,-.247),l(.024,-.111),l(-.148,-.444),l(-.11,-.174),l(.167,-.042),l(.188,.143),l(.085,-.016),l(.449,-.084),l(.161,-.283),l(-.036,-.24),l(-.478,-.366),l(.197,-.396),l(.436,-.071),l(.511,.041),l(.154,-.605),l(.408,-.313),l(.284,-.48),l(.531,-.58),l(.498,-1.032),l(.075,-.17),l(.322,.465),l(.33,.098),l(.315,-.424),l(.305,.494),l(.351,.282),l(.402,.211),l(.075,.338),l(-.182,.354),l(-.234,.452),l(.037,.198),l(.631,-.128),l(.472,-.128),l(.115,.226),l(-.349,.495),l(.742,-.1),l(.357,-.085),l(.269,.056),l(1.035,.662),l(.345,.14),l(.1,.24),l(-.158,.269),l(-.201,.155),l(-.44,.143),l(-.594,.029),l(-.683,-.083),l(-.355,.311),l(.096,.254),l(.888,.69),l(-.161,.311),l(-.458,.199),l(-.646,.1),l(-.518,.114),l(-.067,.15),l(-.182,-.09),l(-.753,-.292),l(-.446,-.04),l(-.624,.018),l(-.651,-.081),l(-.748,-.081),l(-.464,.017),l(-.247,.157),l(-.381,.638),l(-.119,.565),l(.106,.988),l(-.22,.383),l(-.646,.244),l(-.218,.34),l(.076,.748),l(-.928,1.785),l(-.387,.299),l(-.864,.175),l(-.465,.172),l(-.467,.356),l(-.287,.03),l(-.559,-.152),l(-.524,-.223),l(-.557,-.251),l(-.431,-.11),l(-.479,.074),l(-.531,.441),l(-.403,.525),l(-.528,.342),l(-.399,.172),l(-.543,-.11),l(-.526,-.223),l(-.255,.001),l(-.928,.416),l(-.446,-.28),l(-.304,-.083),l(-1,-.983),l(-.253,-.295),l(-.288,-.792), +N(274.556,195.884),l(.06,-.212),l(-.332,-.563),l(-.49,-1.127),l(-.246,-.832),l(-.185,-.295),l(-.561,-.067),l(-.532,-.675),l(-.571,-.831),l(.328,-.694),l(.095,-.467),l(-.078,-.777),l(.169,-.17),l(1.131,-.091),l(.183,-.27),l(.082,-.862),l(.142,-.496),l(.015,-.339),l(.326,-.312),l(.382,-.057),l(1.392,.463),l(.465,.042),l(.083,-.41),l(.141,-.085),l(.337,.027),l(.833,.012),l(.863,-.03),l(.723,.069),l(.63,.182),l(.999,.427),l(-.647,.876),l(-.391,.751),l(-.137,.594),l(.094,.381),l(.134,.635),l(.086,.664),l(.521,.844),l(.029,.438),l(-.424,1.472),l(-.489,.963),l(-1.05,-.488),l(-.319,.001),l(-.534,.385),l(-.398,.059),l(-.418,-.139),l(-.642,-.124),l(-.172,.156),l(-.2,.326),l(.611,1.014),l(-.528,-.054),l(-1.108,-.276),l(-.4,-.04), +N(285.859,190.719),l(.015,.422),l(-1.102,1.646),l(-.427,.765),l(-.439,.992),l(-.464,.681),l(-.299,.214),l(-.56,-.025),l(-1.11,-.389),l(-.882,.613),l(-.225,-.069),l(-.649,-.505),l(.489,-.963),l(.424,-1.472),l(-.029,-.438),l(-.521,-.844),l(-.086,-.664),l(-.134,-.635),l(-.094,-.381),l(.137,-.594),l(.391,-.751),l(.647,-.876),l(.218,.093),l(1.033,.294),l(.55,.196),l(.799,.549),l(1.264,1.084),l(.545,.564),l(.317,.465),l(.193,.028), +N(429.505,210.684),l(-.695,-.533),l(-.351,.13),l(-.68,.513),l(-.536,.414),l(-.112,-.177),l(-.392,-.86),l(-1.381,-1.344),l(.184,-.295),l(.413,-.229),l(.803,.307),l(.343,-.681),l(-.052,-.296),l(-.274,-.253),l(-.39,-.521),l(-.116,-.366),l(.058,-.495),l(.127,-.1),l(.909,-.146),l(.604,-.243),l(.125,-.213),l(.167,-.807),l(.174,-.185),l(.239,-.029),l(.193,.14),l(.341,.479),l(.405,.521),l(.386,.195),l(.287,-.016),l(.188,-.228),l(.362,-.482),l(.29,.253),l(.167,.578),l(.146,.112),l(.304,.068),l(.255,-.114),l(.184,-.68),l(.243,-1.089),l(.131,-1.229),l(.229,-1.047),l(-.114,-.338),l(-.161,-.127),l(-.384,-.082),l(-.528,-.208),l(-.242,-.31),l(-.132,-.437),l(.008,-.109),l(.021,-.3),l(.157,-.284),l(.492,-.398),l(.556,-.441),l(.094,-.354),l(-.389,-.902),l(-.369,-.322),l(-.592,-.067),l(-.939,.5),l(-.463,-.025),l(-.146,-.253),l(-.068,-.734),l(.077,-.679),l(.396,-.468),l(.56,.109),l(.863,.023),l(.878,-.076),l(.271,.055),l(.479,.04),l(.56,.124),l(.576,.194),l(.864,.334),l(.863,.292),l(.271,-.086),l(-.1,-.861),l(.159,-.185),l(.303,-.312),l(.365,-.497),l(.158,-.523),l(.222,-1.287),l(.255,-.228),l(.479,-.102),l(.975,-.175),l(.367,.054),l(.624,.138),l(.895,.093),l(.751,-.287),l(.128,.197),l(-.031,.156),l(-.398,1.203),l(-.558,.837),l(-.349,.821),l(-.094,.551),l(-.156,.764),l(-.196,2.021),l(-.254,1.342),l(-.115,.61),l(-.169,.708),l(-.139,.523),l(-.459,.427),l(-.525,.229),l(-.809,.599),l(-.41,.454),l(-.47,.836),l(-.343,.751),l(-.193,1.159),l(-.074,.396),l(.122,.72),l(-.086,.706),l(-1.025,.938),l(-.364,.229),l(-.931,.811),l(-.554,.399),l(-.57,.328),l(-.147,-.211),l(-.042,-.664),l(-.054,-.424),l(-1.495,.532),l(-.327,.581),l(-.443,.271),l(-.177,-.013),l(-.484,-.336), +N(425.506,195.522),l(.045,-.495),l(.88,.093),l(1.773,.088),l(.831,.038),l(1.022,.149),l(-.396,.468),l(-.077,.679),l(.068,.734),l(.146,.253),l(.463,.025),l(.939,-.5),l(.592,.067),l(.369,.322),l(.389,.902),l(-.094,.354),l(-.556,.441),l(-.492,.398),l(-.157,.284),l(-.021,.3),l(-.008,.109),l(.132,.437),l(.242,.31),l(.528,.208),l(.384,.082),l(.161,.127),l(.114,.338),l(-.229,1.047),l(-.131,1.229),l(-.243,1.089),l(-.184,.68),l(-.255,.114),l(-.304,-.068),l(-.146,-.112),l(-.167,-.578),l(-.29,-.253),l(-.362,.482),l(-.188,.228),l(-.287,.016),l(-.386,-.195),l(-.405,-.521),l(-.341,-.479),l(-.193,-.14),l(-.239,.029),l(-.174,.185),l(-.167,.807),l(-.125,.213),l(-.604,.243),l(-.909,.146),l(-.127,.1),l(-.058,.495),l(.116,.366),l(.39,.521),l(.274,.253),l(.052,.296),l(-.343,.681),l(-.803,-.307),l(-.413,.229),l(-.184,.295),l(-.038,-.037),l(-.563,-.493),l(-.532,-.55),l(-.259,-.466),l(-1.318,-1.169),l(.286,-.312),l(-.369,-.281),l(-.528,-.056),l(-.918,-1.438),l(.382,-.297),l(.111,-.1),l(-.321,-.395),l(-.464,-.14),l(-.29,-.564),l(-.369,-.451),l(.319,-.17),l(.541,-.411),l(.223,-.396),l(.291,-.976),l(.089,-.295),l(.415,.07),l(.495,.013),l(-.064,-.211),l(-.56,-.352),l(-.561,-.451),l(.208,-.042),l(.271,-.128),l(.142,-.617),l(.83,-.043),l(.927,.008),l(1.245,.021),l(.575,-.032),l(-.001,-.155),l(-.02,-.551),l(-.026,-1.836), +N(422.536,195.513),l(1.005,-.007),l(1.965,.017),l(.026,1.836),l(.02,.551),l(.001,.155),l(-.575,.032),l(-1.245,-.021),l(-.927,-.008),l(-.83,.043),l(.033,-.146),l(-.049,-.297),l(-.144,-.084),l(-.416,-.098),l(.287,-.467),l(.447,-.523),l(.335,-.58),l(.066,-.403),M(419.636,193.273),l(-.484,-.049),l(-.049,-.218),l(.049,-.291),l(.242,-.097),l(.024,-.146),l(0,-.291),l(.17,-.097),l(.169,-.121),l(.219,.048),l(.218,.048),l(.097,.194),l(-.193,.169),l(-.146,.243),l(-.17,.339),l(-.146,.267), +N(222.291,207.801),l(.188,-.126),l(.264,-.312),l(.585,-1.061),l(.038,-.269),l(-.209,-.733),l(.058,-.391),l(-.478,.617),l(-.732,.623),l(-.333,-.098),l(-.601,-.324),l(-.408,-.408),l(.389,-.283),l(.1,-.24),l(-.167,-.579),l(.005,-.438),l(.133,-.466),l(-.109,-.282),l(-.362,-.649),l(.193,-.17),l(.48,-.198),l(.721,-.454),l(-.319,-.395),l(0,-.226),l(.175,-.354),l(.497,-.462),l(.157,-.146),l(.14,-.848),l(-.116,-.452),l(-.082,-.184),l(.11,-.226),l(.686,-.101),l(.891,-.341),l(.396,-.241),l(.474,-.382),l(.09,-.186),l(1.496,.803),l(1.432,.656),l(.227,.225),l(.166,.493),l(.355,.309),l(.977,.277),l(.67,-.061),l(.89,-.401),l(.128,.056),l(.709,.631),l(.197,.118),l(.269,.162),l(.081,.112),l(.387,.76),l(.321,.789),l(-.08,.255),l(-.352,.384),l(-.547,1.147),l(-.533,.779),l(-.71,.725),l(-1.001,.755),l(-.336,.087),l(-1.028,.303),l(-.901,.358),l(-.809,.499),l(-.59,.653),l(-.284,.51),l(-.987,2.506),l(-.267,.312),l(-.242,.072),l(-.398,-.068),l(-.398,-.491),l(-.191,-.479),l(-.312,-.252),l(-.815,.005),l(-.444,-.11),l(-.105,-.197),l(-.097,-.494),l(.233,-.34),l(.029,-.495),l(.005,-.569), +N(245.934,224.314),l(1.109,1.843),l(.922,1.646),l(.08,.24),l(-.437,.736),l(-.15,.523),l(-.143,.848),l(.057,.522),l(.236,.902),l(-.156,.34),l(-.221,.34),l(-.532,.582),l(-.102,.452),l(.347,.845),l(-.21,.368),l(-.159,.34),l(.022,.48),l(.604,1.168),l(.015,.522),l(-.285,.439),l(-.723,.61),l(-.12,.227),l(.049,.48),l(.132,.295),l(.018,.142),l(-.586,.187),l(-.15,.199),l(-.228,.933),l(-.259,.298),l(-.852,.275),l(-.201,-.517),l(-.289,-.31),l(-1.422,-.618),l(-.313,-.239),l(-.233,-.678),l(-.315,-.38),l(-.559,-.225),l(-.504,-.281),l(-.489,-.254),l(-.616,-.309),l(-.873,-.464),l(-.673,-.366),l(-.866,-.379),l(-.838,-.337),l(-1.271,-.845),l(-1.354,-.985),l(-1.232,-1.099),l(-.594,-.705),l(-.42,-.677),l(.008,-.438),l(0,-.903),l(-.269,-.606),l(-.781,-1.043),l(-1.389,-2.778),l(-.285,-.268),l(-.467,-.211),l(-.074,-.085),l(.055,-.536),l(-.02,-.396),l(-.149,-.396),l(-1.208,-2.199),l(-.997,-1.961),l(-.688,-1.27),l(-1.365,-1.917),l(-.272,-.353),l(-.598,-.973),l(-.462,-.423),l(-.75,-.437),l(-.914,-.365),l(-.61,-.365),l(.119,-.17),l(.181,-.113),l(.609,-.029),l(.144,-.41),l(-.118,-.282),l(-.592,-.874),l(-.353,-.437),l(-.258,-.72),l(.01,-.24),l(.244,-.523),l(.582,-.622),l(1.02,-.878),l(.47,-.198),l(.317,-.214),l(-.005,.569),l(-.029,.495),l(-.233,.34),l(.097,.494),l(.105,.197),l(.444,.11),l(.815,-.005),l(.312,.252),l(.191,.479),l(.398,.491),l(.398,.068),l(.242,-.072),l(.267,-.312),l(.987,-2.506),l(.284,-.51),l(.59,-.653),l(.809,-.499),l(.901,-.358),l(1.028,-.303),l(.336,-.087),l(1.001,-.755),l(.71,-.725),l(.533,-.779),l(.547,-1.147),l(.352,-.384),l(.08,-.255),l(-.321,-.789),l(-.387,-.76),l(.927,.107),l(.897,.418),l(.513,.435),l(.208,.324),l(.208,.62),l(.526,.364),l(.988,.672),l(.251,.761),l(.078,.282),l(.366,.14),l(.479,.039),l(.173,.296),l(-.004,.396),l(.092,.281),l(.573,.152),l(1.038,.008),l(.496,-.031),l(.337,-.157),l(.452,-.427),l(.523,.421),l(.397,.182),l(.708,-.442),l(.509,.209),l(1.299,.84),l(.127,.069),l(-.035,.198),l(-1.155,1.956),l(.448,-.031),l(.161,-.058),l(.237,.126),l(.575,.703),l(.156,.14),l(.136,.324),l(-.341,.186),l(-.793,-.235),l(-.493,-.096),l(-.322,.072),l(-.604,.441),l(-.371,.115),l(-.669,-.066),l(-1.895,.773),l(-.701,.442),l(-.372,.172),l(-.599,1.415),l(-.319,.511),l(-.021,.155),l(.277,.86),l(.012,.112),l(-.625,.498),l(-.62,.328),l(-.349,.342),l(-.247,.622),l(.106,.564),l(.619,.957),l(1.333,2.166),l(.106,.127),l(-.247,.495),l(-.208,.312),l(1.085,.12),l(.415,.04),l(.312,.182),l(.241,.323),l(.096,.663),l(1.843,.032),l(.762,-.499),l(.648,-.484),l(.326,-.114),l(-.059,1.511),l(-.098,1.173),l(.108,.353),l(.317,.337),l(.285,.068),l(.358,-.072),l(.786,-.259),l(.42,-.045), +N(279.288,257.295),l(-.063,-.423),l(.027,-.777),l(.222,-.819),l(.298,-.835),l(.321,-.75),l(-.019,-.141),l(-.491,-.336),l(-.234,-.112),l(-1.29,.445),l(-.224,-.055),l(-.254,-.563),l(-.487,-2.524),l(-.121,-.437),l(-.843,-.404),l(-.724,-.278),l(-.115,.001),l(-.709,.413),l(-.346,.03),l(-.925,-.221),l(-.818,-.15),l(-.372,-.04),l(.006,-.72),l(.086,-.721),l(.132,-.862),l(-.104,-.959),l(-.521,-.872),l(-.084,-.663),l(-.253,-.408),l(.421,-.666),l(.38,-.765),l(.238,-.834),l(.185,-1.173),l(-.022,-.494),l(-.307,-.774),l(-.316,-.479),l(-.73,-.362),l(-.436,-.407),l(-.067,-.563),l(.261,-.835),l(-.042,-.296),l(-.693,-.024),l(-1.615,-.019),l(-.5,-.012),l(-.967,-.036),l(-.153,-.112),l(-.249,-.944),l(-.138,-2.032),l(-.03,-.706),l(-.203,-1.029),l(.038,-.565),l(-.085,-.169),l(-.403,-.237),l(-.537,-.166),l(-.636,-.123),l(-1.148,.077),l(-.22,-.084),l(-.398,-.308),l(-.385,-.774),l(-.096,-.014),l(-.882,-.037),l(-.3,-.098),l(-.75,-.603),l(-.688,-.307),l(-.676,-.25),l(-.355,.03),l(-.787,-.023),l(-.316,-.097),l(-1.1,-.939),l(-.813,-.928),l(-.335,-.591),l(-.141,-.635),l(-.036,-.818),l(.064,-.622),l(.079,-.621),l(-.045,-.748),l(-1.283,-.021),l(-.934,.076),l(-.36,.158),l(-.874,.485),l(-1.471,1.109),l(-.415,.243),l(-.48,-.025),l(-.336,-.026),l(-.946,.824),l(-.355,.03),l(-1.122,-.304),l(-.939,-.136),l(-.42,.045),l(-.786,.259),l(-.358,.072),l(-.285,-.068),l(-.317,-.337),l(-.108,-.353),l(.098,-1.173),l(.059,-1.511),l(-.326,.114),l(-.648,.484),l(-.762,.499),l(-1.843,-.032),l(-.096,-.663),l(-.241,-.323),l(-.312,-.182),l(-.415,-.04),l(-1.085,-.12),l(.208,-.312),l(.247,-.495),l(-.106,-.127),l(-1.333,-2.166),l(-.619,-.957),l(-.106,-.564),l(.247,-.622),l(.349,-.342),l(.62,-.328),l(.625,-.498),l(-.012,-.112),l(-.277,-.86),l(.021,-.155),l(.319,-.511),l(.599,-1.415),l(.372,-.172),l(.701,-.442),l(1.895,-.773),l(.669,.066),l(.371,-.115),l(.604,-.441),l(.322,-.072),l(.493,.096),l(.793,.235),l(.341,-.186),l(-.136,-.324),l(.133,-.198),l(.073,-.382),l(.706,-4.411),l(.326,-1.428),l(-.031,-.212),l(-.399,-.562),l(.031,-.777),l(-.192,-.183),l(-.688,-.363),l(-.192,-.197),l(0,-.554),l(.001,-1.071),l(.111,-.085),l(.493,-.187),l(.687,-.032),l(.417,.11),l(.384,.04),l(-.052,-.367),l(-.293,-.408),l(-.177,-.084),l(-.896,-.122),l(-.178,-.154),l(.013,-1.031),l(.042,-.325),l(.64,.024),l(2.812,.082),l(.463,-.017),l(.412,-.158),l(.834,-.57),l(.52,-.286),l(.148,.168),l(.138,.437),l(.161,.861),l(.088,.452),l(.199,.437),l(.432,.054),l(.694,.546),l(.482,.223),l(.414,-.073),l(.757,-.697),l(.083,.183),l(.186,.776),l(.271,-.016),l(.645,-.739),l(.74,-.654),l(.554,-.286),l(.652,-.173),l(.235,-.213),l(.259,-.666),l(.203,-.199),l(.652,-.131),l(.569,-.272),l(.265,-.27),l(-.15,-.253),l(-.434,-.125),l(-.96,-.051),l(-.166,-.239),l(-.079,-.55),l(-.302,-1.524),l(-.391,-.69),l(-.616,-.688),l(.041,-.184),l(.159,-.029),l(.309,.125),l(.896,.461),l(.385,.04),l(1.149,-.035),l(.344,.224),l(.628,.618),l(.348,-.115),l(.232,-1.117),l(.284,-.115),l(.465,.054),l(.557,-.074),l(.807,-.23),l(1.74,-.9),l(.592,-.385),l(.163,-.326),l(-.103,-.169),l(.375,-.257),l(.302,-.058),l(.516,.124),l(.26,.111),l(.04,.212),l(-.452,1.09),l(.304,-.001),l(.533,.138),l(.435,.958),l(-.179,.368),l(-.547,1.416),l(-.213,.962),l(.156,.465),l(.281,.394),l(.167,.31),l(-.072,.354),l(.008,.396),l(.15,.296),l(1.103,.897),l(.613,.392),l(.686,-.075),l(.694,-.513),l(.505,-.314),l(1,-.331),l(.934,-.429),l(.943,.022),l(.4,.04),l(1.108,.276),l(.528,.054),l(-.611,-1.014),l(.2,-.326),l(.172,-.156),l(.642,.124),l(.418,.139),l(.398,-.059),l(.534,-.385),l(.319,-.001),l(1.05,.488),l(.649,.505),l(.225,.069),l(.882,-.613),l(1.11,.389),l(.56,.025),l(.299,-.214),l(.464,-.681),l(.439,-.992),l(.427,-.765),l(1.102,-1.646),l(-.015,-.422),l(.409,-.241),l(.276,.141),l(.235,.423),l(.164,.791),l(.414,1.34),l(.108,.607),l(.472,1.383),l(.296,.55),l(.324,.324),l(.978,.21),l(.196,.338),l(.038,.551),l(-.045,.254),l(-.524,.354),l(-.933,1.414),l(-.238,.325),l(-.51,.411),l(-.41,.231),l(-.244,.138),l(-.798,.778),l(-.544,.947),l(-.419,1.018),l(-.402,.453),l(.271,.112),l(.512,-.072),l(.497,-.198),l(1.202,-.709),l(.112,-.028),l(.299,.889),l(.442,.818),l(.255,.112),l(.287,.07),l(1.135,-.031),l(.592,-.058),l(.737,-.298),l(-.277,.679),l(-.017,.584),l(.448,-.557),l(1.254,-1.006),l(.289,-.156),l(.306,-.382),l(.499,-.933),l(.272,-.396),l(.256,-.099),l(1.006,-.003),l(.352,-.198),l(.175,0),l(.687,.549),l(.654,.267),l(.32,-.028),l(.814,.28),l(1.069,.45),l(.334,.281),l(.269,.593),l(.08,.028),l(.176,-.015),l(.402,-.354),l(.319,.042),l(.302,.254),l(.538,.789),l(.205,.396),l(-.13,.254),l(-.308,.41),l(-.116,.424),l(.091,.466),l(.171,.396),l(.825,-.821),l(.369,-.156),l(.609,-.156),l(.995,-.454),l(.224,-.028),l(.367,.069),l(.764,.38),l(.907,.436),l(.462,.098),l(1.117,.167),l(1.118,.083),l(.464,-.058),l(.48,-.029),l(.577,-.171),l(.416,-.016),l(1.131,.351),l(.731,.408),l(.762,.479),l(.586,.437),l(1.595,1.395),l(.742,.662),l(.821,.605),l(.41,.338),l(.477,.196),l(.734,.168),l(1.247,.097),l(.912,.04),l(.445,.197),l(.265,.465),l(.087,.607),l(.592,2.004),l(.268,1.143),l(.062,.988),l(-.076,.579),l(-.179,.904),l(-.243,.848),l(-.559,1.301),l(-.518,.849),l(-1.347,1.175),l(-1.388,1.288),l(-.44,.198),l(-.354,.043),l(-.39,.637),l(-.094,.396),l(-.012,.353),l(-.504,1.074),l(-.6,.976),l(-.8,1.104),l(-.266,.212),l(-.194,.015),l(-.079,-.423),l(-.278,-.296),l(-.367,-.084),l(-.064,.79),l(-.538,1.64),l(-.049,.734),l(-.077,.607),l(.318,2.738),l(.078,.988),l(-.577,2.543),l(-.039,.663),l(.14,.649),l(.043,.085),l(-.759,.495),l(-.404,.51),l(-.261,.791),l(-.04,.367),l(.245,1.468),l(-.106,.367),l(-.214,.283),l(-.676,.608),l(-.752,1.498),l(-1.01,1.4),l(-.201,.537),l(-.055,.311),l(.144,.945),l(-1.203,.37),l(-.544,.283),l(-.355,.368),l(-.084,.466),l(.021,.367),l(-.401,.114),l(-.864,-.041),l(-.979,.172),l(-.654,.001),l(-.764,-.055),l(-.465,-.112),l(-.922,.072),l(-.736,.002),l(-.214,.607),l(-.295,.198),l(-.795,.312),l(-.481,.453),l(-.21,.354),l(-.747,-.267),l(-.35,.071),l(-.563,.255),l(-1.864,1.232),l(-.528,.396),l(-.725,.383),l(-.616,.438),l(-.532,.679),l(-.486,.241),l(-.567,.072),l(-.278,-.014),l(.006,.24),l(.336,.225),l(.12,.536),l(-.111,.537),l(-.099,.282),l(-.282,.156),l(-.084,.155),l(.384,.648),l(.036,1.186),l(.05,1.045),l(-.057,.311),l(-.11,.594),l(-.198,.621),l(-.464,.735),l(-.566,.495),l(-.788,.524),l(-.866,1.046),l(-.208,.396),l(-.476,1.145),l(-.499,.933),l(-.75,1.004),l(-.69,.623),l(-.801,.78),l(.321,-.808),l(.436,-.594),l(.629,-.566),l(.605,-1.158),l(-.06,-.254),l(-.356,.142),l(-.397,-.014),l(-.633,-.21),l(-.075,.155),l(.002,.297),l(-.401,1.215),l(-.349,.48),l(-.661,.438),l(-.317,.283),l(-.225,.424),l(-.013,.354),l(-.448,1.709),l(-.481,.763),l(-.787,.934),l(-1.076,.979),l(-.101,-.313),l(-.258,-.746),l(.103,-.269),l(.634,-.766),l(.017,-.269),l(-.333,-.379),l(-.163,-.027),l(-.131,-.197),l(-.853,-1.109),l(-.474,-.435),l(-.999,-.587),l(-.55,-.194),l(-.617,-.194),l(-.432,-.576),l(-.365,-.393),l(-.693,.427),l(-.27,.016),l(-.232,-.38),l(-.59,-.814),l(-.379,-.407),l(-.47,-.364),l(-.266,-.098),l(-.25,.101),l(-1.042,.246),l(-.55,.003),l(.214,-.27),l(.833,-.88),l(1.805,-1.816),l(1.435,-1.363),l(1.633,-1.448),l(.348,-.242),l(1.754,-.744),l(.521,-.313),l(.161,-.467),l(.094,-1.638),l(-.517,-1.154),l(-.206,-.196),l(-.462,.017),l(-.957,.161),M(288.966,203.943),l(-.558,-.125),l(-.301,-.536),l(-.078,-.382),l(.16,-.197),l(-.094,-.636),l(.048,-.381),l(.208,-1.018),l(.176,-.099),l(.479,-.058),l(.879,.097),l(1.007,.11),l(.479,-.199),l(.368,.028),l(.479,.168),l(.479,.083),l(.319,.155),l(-.335,.538),l(-.193,.946),l(-.257,.494),l(-.289,.312),l(-.561,.326),l(-.464,.171),l(-.527,.015),l(-.783,.016),l(-.641,.171), +N(732.92,214.323),l(-.164,-.24),l(-.225,-.197),l(-.379,-.126),l(-.416,.198),l(-.399,-.38),l(-.287,-.184),l(-.659,-.238),l(-.243,-.239),l(.156,-.255),l(.29,.027),l(.731,-.058),l(.538,.126),l(.743,.083),l(.523,-.058),l(.258,-.185),l(.232,-.509),l(.056,.099),l(.351,.395),l(.286,.184),l(.241,.014),l(.961,-.2),l(.366,-.227),l(.361,-.722),l(.241,-.212),l(.653,-.029),l(.263,-.128),l(.04,-.282),l(-.064,-.565),l(-.043,-.536),l(.495,.196),l(.404,.056),l(.324,-.354),l(.318,.578),l(.077,.353),l(-.196,.495),l(-.099,.184),l(-.509,.044),l(-.159,.226),l(.061,.17),l(.437,.479),l(-.308,.354),l(-.264,.113),l(-.742,-.083),l(-.416,.001),l(-.091,.269),l(-.408,.495),l(-.275,.156),l(-.973,.426),l(-.484,.143),l(-.798,.029),l(-.807,.115),M(713.795,220.696),l(.031,-3.438),l(-.046,-.805),l(-.431,-1.368),l(.44,-.822),l(-.169,-7.966),l(2.581,.802),l(.85,.337),l(1.04,.295),l(1.254,.378),l(.848,.507),l(.613,.323),l(.597,.084),l(.38,-.058),l(.26,.508),l(.274,.254),l(.635,.352),l(.687,.395),l(.779,.718),l(-.3,.947),l(.033,.226),l(.305,.226),l(.665,.111),l(1.887,.787),l(.354,.027),l(.72,.183),l(.181,.254),l(.413,.535),l(.211,.579),l(-.166,.113),l(-1.114,.073),l(-.563,.156),l(-.098,.155),l(.047,.339),l(.589,.987),l(.5,.521),l(1.464,1),l(.218,.847),l(.725,1.044),l(.288,.141),l(.304,-.015),l(.712,-.086),l(.338,.013),l(.087,.198),l(-.354,.551),l(.218,.212),l(.401,.141),l(.423,.041),l(.63,.168),l(.096,.127),l(-.031,.142),l(-.648,.213),l(.287,.24),l(1.064,.28),l(.538,.295),l(.235,.763),l(-.064,.226),l(-1.094,-.012),l(-.215,-.154),l(-.146,-.466),l(-.126,-.099),l(-1.011,-.111),l(-1.063,-.266),l(-.644,-.126),l(-.752,.016),l(-.774,-.026),l(-.573,-.211),l(-.494,-.352),l(-.223,-.522),l(-.24,-.268),l(-.726,-.31),l(-.472,-.338),l(-.135,-.197),l(-1.089,-1.608),l(-.613,-.817),l(-.454,-.056),l(-1.524,-.336),l(-.671,-.31),l(-.55,-.055),l(-.415,.185),l(-.394,.071),l(-.78,-.45),l(.282,.762),l(-.027,.212),l(-.249,.071),l(-.382,-.126),l(-.311,.1),l(.296,.395),l(-.116,.113),l(-1.037,.045),l(-1.125,-.182),l(-.478,.029),l(.237,.127),l(.24,.154),l(.642,.169),l(.662,.352),l(.404,.338),l(.219,.395),l(-.411,.199),l(-.739,.425),l(-.458,.213),l(-.668,-.097),l(-1.801,-.039),l(-1.219,-.092), +N(726.605,297.247),l(-.479,-.229),l(-1.179,-.471),l(-.543,-.371),l(-.508,-.715),l(-.477,-.558),l(-.216,-.414),l(.264,-.044),l(.169,.1),l(.421,.171),l(.129,-.143),l(-.209,-.387),l(-.703,-.699),l(-.617,-.713),l(-.149,-.257),l(-.375,-.956),l(-.008,-.67),l(.177,-.044),l(1.004,.312),l(1.476,.354),l(1.089,.369),l(.797,-.03),l(.463,-.144),l(.382,-.115),l(.373,-.058),l(.684,.027),l(.306,-.301),l(.716,-.244),l(.475,.385),l(-.009,.1),l(.128,.8),l(-.009,.686),l(-.751,1.503),l(-.124,.758),l(-.245,.315),l(-.943,.26),l(-.553,.388),l(-.49,.689),l(-.189,.272),l(-.274,.072),M(716.883,224.344),l(.682,.394),l(.233,.509),l(.047,.649),l(.118,.678),l(.256,.197),l(.42,.013),l(.102,.24),l(-.45,.919),l(.715,.338),l(.175,.282),l(.147,.593),l(.08,1.3),l(.144,.621),l(.456,1.157),l(.293,.268),l(.422,.014),l(.328,-.312),l(.384,-.185),l(.32,.663),l(.363,.127),l(.563,.408),l(.385,.154),l(.144,.155),l(.002,.41),l(.083,.96),l(.275,.776),l(-.046,1.06),l(.279,.24),l(.93,1.325),l(.276,.706),l(.055,.777),l(-.209,.876),l(.403,.649),l(.275,.833),l(.204,.353),l(1.395,.803),l(.285,.154),l(.744,.111),l(.402,.649),l(.843,.535),l(.483,.169),l(1.141,.068),l(.117,.197),L(731,245.42),l(-.273,.565),l(.309,.424),l(.879,.479),l(.22,.564),l(.469,1.342),l(.211,.748),l(.112,.396),l(.252,.311),l(.771,.352),l(-.021,-.127),l(-.141,-.777),l(.913,.507),l(.567,.154),l(.184,.127),l(.136,.296),l(.106,1.752),l(.884,.762),l(.573,.323),l(.604,.154),l(.287,.296),l(.244,.579),l(.229,.424),l(.545,.168),l(.176,.297),l(.007,.269),l(.19,.536),l(.106,.113),l(.506,.126),l(.156,.112),l(.162,.354),l(.366,1.327),l(.026,.876),l(.013,.862),l(-.132,.41),l(-.181,.325),l(.778,1.271),l(.223,.48),l(.181,.833),l(.034,.749),l(-.293,.708),l(-.353,1.668),l(-.585,1.755),l(.137,.791),l(-.065,.806),l(-.306,.778),l(-.661,.977),l(-.203,.665),l(-.598,.821),l(-.45,.185),l(-.465,.1),l(-.423,.468),l(-.466,.68),l(-.328,1.527),l(-.477,.638),l(-.34,.495),l(.014,.65),l(-.208,.539),l(-.331,.312),l(-.601,.341),l(-.27,.326),l(-.3,1.021),l(-.169,1.049),l(-.079,.937),l(.021,.666),l(-.283,.64),l(-.322,.354),l(-.463,.3),l(-.754,.101),l(-1.158,.087),l(-.82,.03),l(-.527,.157),l(-.516,.299),l(-1.529,.94),l(-.443,.129),l(-.214,.284),l(-.346,.071),l(-.528,.059),l(-.286,-.014),l(.295,.368),l(.209,.27),l(-1.315,-.665),l(-.885,-.353),l(.003,-.469),l(-.073,-.156),l(-.56,-.467),l(-.628,-.368),l(-.421,-.014),l(-.485,.172),l(-.335,.242),l(.748,.467),l(-.97,.243),l(-.929,.428),l(-.953,.442),l(-.222,.028),l(-.604,-.226),l(-.886,-.438),l(-.67,-.226),l(-1.086,-.311),l(-.51,-.041),l(-.239,.156),l(-.044,.113),l(-.716,-.169),l(-.751,-.353),l(-.522,-.298),l(-.896,-.82),l(-.526,-.34),l(-.422,-.879),l(.09,-1.035),l(-.082,-.411),l(-.184,-.495),l(-.664,-.736),l(-.141,-.523),l(-.029,-.425),l(-.534,-.014),l(-.786,.398),l(-.597,.114),l(-.34,.058),l(-.178,-.07),l(-.167,-.17),l(.517,-.454),l(.233,-.567),l(.073,-.821),l(-.253,-.324),l(-.536,-.593),l(-.247,-.353),l(-.485,.735),l(-.443,1.431),l(-.19,.113),l(-.796,.002),l(-.199,.156),l(-.196,.015),l(-.255,.028),l(.198,-.396),l(.081,-.396),l(.079,-.1),l(.634,.041),l(.242,-.142),l(.126,-.255),l(-.105,-1.004),l(.454,-.835),l(.328,-.453),l(.091,-.396),l(.018,-.409),l(.151,-.128),l(.245,-.015),l(.218,-.354),l(-.052,-.227),l(-.323,-.494),l(-.338,-.494),l(-.107,.707),l(-.288,.255),l(-.518,.299),l(-.311,.467),l(-.086,.155),l(-.189,.467),l(-.281,.326),l(-.747,.242),l(-.735,.481),l(-.653,.567),l(-.36,.693),l(-.514,.808),l(-.41,-.339),l(-.38,-1.328),l(-.263,-.579),l(-.19,-.325),l(-.688,-.79),l(-.297,-.734),l(-.176,-.212),l(-.704,.072),l(-.235,-.099),l(-.139,-.24),l(-.085,-.269),l(.334,-.34),l(-.047,-.297),l(-.346,-.395),l(-.543,-.494),l(-.266,-.098),l(-.83,.157),l(-.486,-.07),l(-.95,-.549),l(-.274,-.014),l(-.438,.17),l(-.433,-.027),l(-.421,-.183),l(-.662,-.521),l(-.921,-.437),l(-.218,.001),l(-.723,.213),l(-1.282,.088),l(-.669,.001),l(-1.764,.061),l(-.611,.129),l(-.656,.213),l(-.989,.44),l(-.972,.256),l(-1.039,.257),l(-1.503,.088),l(-.794,-.013),l(-.383,.044),l(-.927,.284),l(-.993,.469),l(-.773,.397),l(-.538,.143),l(-.431,.085),l(-.361,.199),l(-.615,.693),l(-.774,1.02),l(-.588,.284),l(-.766,-.013),l(-.547,-.013),l(-.927,.143),l(-.4,.185),l(-.663,-.395),l(-.294,-.084),l(-.734,.016),l(-1.572,.173),l(-.938,.157),l(-.459,-.041),l(-.672,.044),l(-.398,.227),l(-.583,.793),l(-.344,.128),l(-.958,-.125),l(-.158,.057),l(-.57,.708),l(-.465,.368),l(-.919,.271),l(-.586,.086),l(-1.516,-.082),l(-.638,-.055),l(-.688,-.197),l(-.633,-.366),l(-.778,-.677),l(-.74,-.353),l(-.374,-.041),l(-.151,-.07),l(-.19,-1.229),l(.055,-.255),l(.489,.112),l(.45,-.086),l(.332,-.425),l(.197,-.467),l(.267,-1.357),l(-.043,-1.215),l(-.156,-.622),l(-.258,-.593),l(-1.117,-1.906),l(-.208,-.635),l(-.144,-.834),l(.027,-.989),l(-.16,-.692),l(-.467,-1.072),l(-.663,-.945),l(-.603,-.734),l(-.214,-.254),l(.128,-.904),l(-.215,-.536),l(-.733,-1.115),l(-.972,-1.018),l(-.273,-.583),l(.126,-.233),l(.188,.187),l(.152,.443),l(.183,.163),l(.235,.35),l(.327,.188),l(.354,.023),l(-.348,-1.144),l(-.437,-.396),l(-.226,-.326),l(.08,-.304),l(.748,.84),l(.495,.979),l(.477,.065),l(-.099,-.555),l(.289,-.039),l(.004,-.564),l(-.282,-.48),l(-1.03,-1.368),l(-.354,-.691),l(-.119,-.579),l(-.038,-.734),l(.355,-.595),l(.323,-.523),l(.21,-.664),l(-.083,-1.031),l(-.254,-.635),l(.033,-.368),l(.438,-.692),l(.109,-.325),l(.064,-.156),l(.271,.649),l(.011,.424),l(.105,.184),l(.35,.027),l(.171,-.113),l(.187,-.565),l(.141,-.48),l(.765,-.468),l(1.22,-.624),l(.484,-.326),l(.676,-.581),l(.585,-.467),l(.632,-.327),l(.79,-.114),l(.697,-.016),l(.7,-.002),l(.431,-.043),l(.352,-.185),l(.474,-.453),l(.494,-.128),l(.929,-.072),l(.279,-.143),l(.291,-.551),l(.158,-.1),l(.444,.027),l(.877,.224),l(.626,-.043),l(.911,-.299),l(1.084,-.469),l(.359,-.213),l(.716,-.665),l(.427,-.58),l(.29,-.622),l(.132,-.297),l(.41,-.369),l(.968,-.651),l(.079,-.17),l(-.067,-.409),l(-.242,-.805),l(-.016,-.495),l(1.063,-1.118),l(.387,-.692),l(.291,.169),l(.341,.437),l(.619,1.355),l(.262,.253),l(.177,-.579),l(.021,-.466),l(.436,.238),l(.272,.07),l(.189,-.607),l(-.06,-.142),l(-.563,-.238),l(-.175,-.24),l(.007,-.565),l(.044,-.112),l(.897,.04),l(.661,.253),l(.642,-.029),l(.334,-.029),l(.289,.074),l(-.699,-.455),l(-.431,-.141),l(.128,-.537),l(-.07,-.296),l(.135,-.509),l(.422,-.354),l(.165,-.07),l(.732,.394),l(.202,-.043),l(-.112,-.452),l(.11,-.48),l(.146,-.367),l(-.041,-.522),l(.358,-.171),l(.4,-.113),l(.813,.04),l(.529,-1.088),l(.371,-.298),l(.35,.169),l(.268,.451),l(.265,-.552),l(.222,-.227),l(.197,-.48),l(.695,.62),l(.513,.084),l(.293,.211),l(.331,.536),l(.632,.592),l(.122,.706),l(-.072,.594),l(.181,.197),l(.256,-.283),l(.462,-.679),l(.155,-.128),l(1.16,.082),l(.479,.155),l(.637,.492),l(.332,.141),l(.156,-.48),l(.302,-.297),l(.022,-.24),l(-.266,-.324),l(-.601,-.395),l(-.079,-.184),l(.008,-.24),l(.145,-.099),l(.604,-.538),l(.007,-.452),l(.191,-.213),l(.518,-.283),l(.268,-.241),l(.151,-.269),l(-.094,-.184),l(.003,-.296),l(.512,-.863),l(.121,-.057),l(.317,-.029),l(.397,-.029),l(.248,-.17),l(-.205,-.409),l(.377,-.396),l(.344,-.071),l(.793,.366),l(.616,-.072),l(1.291,-.088),l(.512,-.128),l(.232,-.17),l(.04,-.057),l(-.077,-.197),l(-.2,-.734),l(-.248,-.282),l(-.471,-.268),l(-.374,.086),l(-.244,-.141),l(.035,-.212),l(.367,-.143),l(.396,-.043),l(.617,.521),l(.255,.099),l(.34,-.1),l(.364,.31),l(.676,.465),l(.36,.154),l(1.297,.294),l(.591,.084),l(.413,-.143),l(.372,.014),l(.396,.606),l(.419,.112),l(.141,-.029),l(.562,-.438),l(.454,.027),l(.652,.38),l(.331,.479),l(.46,-.143),l(.122,-.791),l(.181,-.085),l(.455,.465),l(.337,.099),l(.152,.154),l(-.436,.411),l(-.126,.424),l(-.176,.212),l(-.011,.438),l(-.12,.255),l(-.513,.015),l(-.51,.228),l(-.396,.34),l(-.004,.551),l(.301,.353),l(-.187,.692),l(-.381,.58),l(-.559,.481),l(-.155,.48),l(.063,.17),l(.469,.437),l(1.038,.619),l(.81,.677),l(.508,.606),l(.246,.099),l(.349,-.114),l(.264,.027),l(.782,.352),l(.742,.465),l(.434,.451),l(.679,.535),l(.335,.127),l(.442,.027),l(.784,.182),l(.25,.184),l(.218,.621),l(.167,.169),l(.507,.31),l(.76,.423),l(.537,.154),l(.422,-.072),l(.414,-.17),l(.603,-.199),l(.208,-.156),l(.736,-1.344),l(.403,-1.131),l(.194,-1.314),l(.259,-.721),l(.43,-.679),l(-.131,-.424),l(-.409,-.621),l(.022,-.311),l(.236,-.637),l(.187,-.48),l(-.164,-.282),l(-.183,-.395),l(.088,-.692),l(.104,-1.004),l(.225,-.297),l(.329,-.156),l(.158,-.311),l(-.534,-.521),l(.033,-.198),l(.576,-.947),l(.312,-.934),l(.072,-.833),l(.191,-.241),l(.279,-.297), +N(270.934,276.123),l(.054,-.338),l(-.194,-.577),l(.011,-.522),l(.24,-.495),l(.48,-.524),l(.118,-.325),l(-.168,-.986),l(-.049,-.847),l(.103,-.522),l(.595,-2.359),l(.065,-.452),l(.443,-.524),l(.55,-.003),l(1.042,-.246),l(.25,-.101),l(.266,.098),l(.47,.364),l(.379,.407),l(.59,.814),l(.232,.38),l(.27,-.016),l(.693,-.427),l(.365,.393),l(.432,.576),l(.617,.194),l(.55,.194),l(.999,.587),l(.474,.435),l(.853,1.109),l(.131,.197),l(.163,.027),l(.333,.379),l(-.017,.269),l(-.634,.766),l(-.103,.269),l(.258,.746),l(.101,.313),l(-.059,.053),l(-.803,1.103),l(-.625,.552),l(-.775,.454),l(-.441,.156),l(-.818,.1),l(-.874,-.337),l(-.551,.044),l(-.551,.114),l(-.64,.283),l(-.38,-.042),l(-.846,-.676),l(-.637,-.252),l(-.76,-.154),l(-.469,.128),l(-.507,.072),l(-.327,-.127),l(-.548,-.563),l(-.354,-.159), +N(418.763,73.869),l(.391,-.499),l(.389,-.262),l(.283,.081),l(.663,-.062),l(.762,-.075),l(.324,-.137),l(.891,-.787),l(.979,-.2),l(.224,.025),l(.198,-.219),l(.175,.032),l(-.349,.531),l(.11,.106),l(.026,.481),l(-.288,.156),l(-.17,.368),l(-1.675,.069),l(-.376,-.106),l(-.428,.031),l(-.14,-.062),l(-.239,.081),l(-.275,.031),l(-.153,.417),l(-.249,.218),l(-.353,.118),l(-.08,.112),l(-.229,-.155),l(-.411,-.292),M(421.68,78.002),l(-1.839,.129),l(-.116,-.016),l(.064,-.404),l(-.19,-.638),l(-.174,.015),l(-.36,-.293),l(-.233,.184),l(-.398,-.172),l(.2,-.355),l(.434,-.293),l(-.007,-.181),l(-.445,-.541),l(.018,-.256),l(.131,-.498),l(.279,-.106),l(.318,.15),l(.495,.12),l(.43,-.574),l(.299,-.091),l(.296,.437),l(.391,-.046),l(.022,-.528),l(.107,-.363),l(1.032,-.017),l(.848,.089),l(.03,.544),l(.187,.301),l(1.138,.058),l(.14,.166),l(-.307,.604),l(-.565,.142),l(-.119,-.261),l(-.331,.031),l(-.263,.136),l(.121,.278),l(-.184,.414),l(-.312,.077),l(-.069,.244),l(-.635,.035),l(.157,.229),l(-.291,.094),l(-.191,.24),l(-.061,.285),l(.003,.21),l(-.215,.338),l(.166,.084),M(427.177,77.967),l(-.139,-.149),l(-.312,-.344),l(-.405,.031),l(-.665,-.059),l(-.123,-.329),l(-.285,-.66),l(.433,-.091),l(.603,-.467),l(.356,.495),l(.521,.179),l(.2,-.271),l(.078,-.586),l(.333,-.046),l(.459,.044),l(.056,.571),l(-.134,.36),l(-.144,.09),l(-.413,.286),l(.603,.299),l(-.285,.166),l(-.499,.39),l(-.238,.09), +N(417.259,94.301),l(-.135,-.233),l(.216,-.701),l(-.091,-.076),l(.075,-.295),l(.321,-.372),l(.054,-.358),l(.054,-.213),l(.954,-.806),l(-.605,-.193),l(-.479,.014),l(-.456,-.09),l(-.095,-.186),l(-.233,-.007),l(-.072,.048),l(-.689,.062),l(-.045,-.145),l(-.395,.055),l(-.337,-.277),l(-.428,-.319),l(-.074,-.353),l(.248,-.144),l(.044,-.288),l(-.466,-.096),l(-.41,-.312),l(-.062,-.301),l(.422,-.376),l(-.038,-.468),l(-.282,-.365),l(-.344,-.177),l(.165,-.278),l(-.143,-.217),l(-.182,-.037),l(.08,-.097),l(.235,-.133),l(.236,-.133),l(-.193,-.121),l(.201,-.275),l(.095,-.148),l(-.152,-.292),l(-.082,-.265),l(-.376,-.182),l(.07,-.182),l(.341,-.078),l(.175,-.092),l(.378,.134),l(.664,-.151),l(.32,-.152),l(.128,-.376),l(.412,-.207),l(.003,-.328),l(-.16,-.17),l(-.188,.061),l(-.44,-.134),l(.029,-.184),l(.113,-.181),l(.571,.036),l(.084,-.401),l(.345,-.361),l(-.151,-.438),l(.066,-.147),l(-.465,-.192),l(.126,-.43),l(.285,-.181),l(.371,-.028),l(1.12,-.062),l(.293,-.012),l(.095,.16),l(.195,.271),l(-.155,.158),l(.324,.113),l(.148,-.068),l(.042,-.192),l(-.159,-.204),l(.259,.012),l(.437,.169),l(-.163,-.362),l(.247,-.419),l(.687,.113),l(.614,-.091),l(-.596,-.17),l(-.084,-.227),l(.282,-.102),l(-.252,-.114),l(-.12,-.147),l(.166,-.08),l(.068,-.136),l(-.675,.08),l(-.06,-.182),l(.664,-.125),l(.218,-.193),l(-.464,-.42),l(-.324,-.341),l(.045,-.28),l(.116,.016),l(1.839,-.129),l(.254,.13),l(.565,.341),l(.271,.297),l(-.02,.228),l(-.252,.175),l(.445,-.05),l(.171,.216),l(.157,-.078),l(.283,.021),l(.235,.156),l(.45,.073),l(.866,-.121),l(.077,.208),l(-.07,.149),l(-.057,.125),l(-.665,.295),l(.316,.193),l(.649,-.136),l(.113,.182),l(.457,-.006),l(.349,-.391),l(1.059,-.136),l(.602,-.234),l(.757,-.266),l(.249,.113),l(.396,-.17),l(.184,.182),l(.085,.159),l(.634,.29),l(.182,.074),l(.526,-.12),l(.156,.12),l(.059,.34),l(.036,.227),l(.154,.102),l(.354,.125),l(.372,-.022),l(.028,.13),l(.201,.025),l(.319,.835),l(-.219,.52),l(-.391,.147),l(-.051,.328),l(.391,.102),l(.683,.429),l(-.217,.395),l(.094,.18),l(.312,.146),l(-.021,.304),l(.131,.102),l(-.118,.292),l(-.214,.124),l(-.007,.191),l(.325,.27),l(-.114,.258),l(.468,.188),l(.281,.485),l(-.435,.698),l(-.142,.115),l(-.344,-.072),l(-.031,-.278),l(-.308,-.121),l(-.436,.072),l(.282,.218),l(-.254,.084),l(-.284,.097),l(-.524,.048),l(-.124,.169),l(-.735,.024),l(-.112,.217),l(-.176,-.072),l(-.358,.061),l(-.097,.229),l(-.382,.012),l(-.078,.181),l(-.442,0),l(-.422,.201),l(-.293,-.033),l(-.26,.181),l(-.243,.168),l(.037,.056),l(.258,.378),l(.413,.098),l(-.155,.25),l(-.08,.406),l(.159,.085),l(.036,.233),l(.244,.173),l(.478,.265),l(.188,-.072),l(.573,.515),l(.431,.17),l(.184,.201),l(.219,-.084),l(.165,.18),l(.207,.036),l(.447,.633),l(-.682,.26),l(-.437,-.151),l(-.132,.027),l(-.039,.337),l(-.162,.172),l(-.968,.295),l(-.364,.227),l(.538,.571),l(-.197,.295),l(.334,.014),l(.056,.158),l(-.098,.343),l(-.082,.055),l(-.441,-.178),l(.049,-.165),l(-.146,-.117),l(-.564,.062),l(-.195,-.138),l(-.433,.035),l(-.092,.178),l(-1.25,.035),l(-.125,.171),l(-.319,.014),l(-.044,.13),L(425.4,94.7),l(-.594,.021),l(-.059,-.144),l(-.093,-.145),l(-.493,-.089),l(-.262,.055),l(-.237,-.041),l(.032,.274),l(-.452,.343),l(-.215,0),l(.078,-.195),l(-.26,-.039),l(.011,-.165),l(-.194,-.048),l(-.104,-.137),l(-.249,-.007),l(-.096,-.11),l(-.164,.137),l(-.368,-.014),l(-.664,-.261),l(-.852,-.007),l(-.149,-.089),l(-.199,.014),l(-.017,-.151),l(-.709,.199),l(.179,.199),l(-.354,.021),l(-.278,-.11),l(-.567,.158),l(-.271,-.096),l(-.272,.117),l(-.271,-.089),M(432.012,80.473),l(-.171,-.038),l(-.088,-.049),l(-.447,.08),l(-.111,-.264),l(.002,-.213),l(.647,.281),l(.168,.203), +N(450.734,91.05),l(-.831,-.33),l(-.424,-.101),l(-.104,-.216),l(-.703,-.186),l(-.129,-.13),l(-.561,.076),l(-.508,-.041),l(-.073,.137),l(-.373,.18),l(-.46,-.254),l(-.483,.046),l(-.168,-.056),l(-.558,.204),l(-.104,.177),l(-.149,.135),l(-.18,-.12),l(-.389,.083),l(-.003,-.204),l(.026,-.083),l(-.066,-.18),l(-.331,.025),l(-.073,-.169),l(-.194,-.24),l(-.261,.024),l(-.062,.112),l(-.193,-.016),l(-.183,.24),l(-.43,.048),l(-.03,-.228),l(-.285,-.041),l(-.105,-.331),l(-.382,-.096),l(-.188,-.208),l(.02,-.249),l(-.802,-.132),l(-.311,-.181),l(-.368,.161),l(-.293,-.013),l(-.013,-.221),l(.001,-.253),l(-.329,.084),l(.181,-.283),l(-.709,.005),l(-.258,-.121),l(-.509,-.193),l(-.286,-.024),l(-.003,.145),l(.282,.302),l(-.41,.12),l(-.22,.187),l(-.318,-.072),l(-.296,-.38),l(-.55,-.247),l(.224,-.211),l(.208,-.024),l(.099,-.121),l(-.199,-.181),l(-.257,-.024),l(-.061,.066),l(-.466,.066),l(.005,-.169),l(-.278,.037),l(-.132,-.181),l(-.568,-.054),l(-.201,-.025),l(-.363,-.163),l(-.093,-.26),l(-.211,-.091),l(-.361,.018),l(-.063,.084),l(.062,.073),l(-.024,.151),l(-.375,0),l(.435,-.698),l(-.281,-.485),l(-.468,-.188),l(.114,-.258),l(-.325,-.27),l(.007,-.191),l(.214,-.124),l(.118,-.292),l(-.131,-.102),l(.021,-.304),l(-.312,-.146),l(-.094,-.18),l(.217,-.395),l(-.683,-.429),l(-.391,-.102),l(.051,-.328),l(.391,-.147),l(.219,-.52),l(-.319,-.835),l(.34,.043),l(.23,.125),l(-.093,-.193),l(.156,-.153),l(-.019,-.147),l(-.166,-.13),l(-.021,-.129),l(-.012,-.075),l(.93,-.154),l(.431,-.051),l(.516,-.152),l(1.304,-.128),l(.48,-.158),l(.797,-.479),l(1.117,-.298),l(1.515,-.303),l(1.382,-.086),l(1.067,.417),l(-.882,-.294),l(-.054,.147),l(.256,.172),l(.132,.466),l(.355,.135),l(.648,.061),l(.645,-.11),l(1.063,-.409),l(.054,.004),l(-.978,.417),l(-.19,.11),l(-.004,.123),l(.218,.012),l(.286,-.123),l(.613,-.208),l(.543,-.253),l(.842,.006),l(2.246,.115),l(2.96,-.101),l(.641,-.021),l(.04,.014),l(.679,.243),l(.284,.487),l(.099,.186),l(.016,.029),l(.09,.171),l(.16,.302),l(.615,1.5),l(.172,.502),l(-.023,.236),l(-.263,.208),l(-.44,.03),l(-.571,.244),l(-.291,.328),l(-.128,.292),l(.289,.012),l(.421,.146),l(.149,.176),l(.218,.146),l(.013,.25),l(-.315,.752),l(.126,.137),l(.161,.175),l(-.074,.242),l(.816,.835),l(.316,.193),l(-.298,.048),l(-.085,.133),l(.328,.302),l(-.009,.314),l(-.255,.24),l(-.429,.013),l(-.286,.181),l(-.599,.398),l(-1.509,1.218),l(-.082,.306),l(.044,.552),l(.349,.383),l(-.653,-.018),M(431.844,80.27),l(.232,.024),l(.069,.208),l(-.134,-.029),l(-.168,-.203),M(432.739,80.361),l(-.03,.129),l(-.278,-.024),l(-.191,.03),l(-.046,-.208),l(.174,-.012),l(.266,0),l(.106,.085), +N(416.488,81.945),l(.151,.438),l(-.345,.361),l(-.084,.401),l(-.571,-.036),l(-.113,.181),l(-.029,.184),l(.44,.134),l(.188,-.061),l(.16,.17),l(-.003,.328),l(-.412,.207),l(-.128,.376),l(-.32,.152),l(-.664,.151),l(-.378,-.134),l(-.175,.092),l(-.341,.078),l(-.07,.182),l(.376,.182),l(.082,.265),l(.152,.292),l(-.095,.148),l(-.201,.275),l(.193,.121),l(-.236,.133),l(-.235,.133),l(-.08,.097),l(.182,.037),l(.143,.217),l(-.165,.278),l(-.672,.024),l(-.001,-.338),l(.172,-.097),l(.11,-.423),l(-.754,-.375),l(-.535,.109),l(-.292,-.375),l(-.228,-.061),l(-.173,.121),l(-.313,-.242),l(-.267,.182),l(-.307,0),l(-.307,-.012),l(.025,.157),l(-.52,.034),l(-.407,-.042),l(-.477,-.098),l(-.07,-.162),l(-.496,-.264),l(.795,-.472),l(.858,-.621),l(.273,-.354),l(.563,-1.167),l(.173,-.104),l(.644,-.12),l(.367,.251),l(.136,.268),l(-.28,.203),l(-.228,-.056),l(.066,.496),l(-.191,.124),l(1.163,.225),l(.225,-.236),l(.406,-.113),l(.134,-.417),l(-.458,-.022),l(-.123,-.124),l(-.02,-.203),l(.236,-.158),l(-.171,-.023),l(-.558,-.067),l(.072,-.328),l(-.034,-.13),l(-.023,-.034),l(.128,-.283),l(.572,-.198),l(.709,-.238),l(.654,.03),l(1.089,-.151),l(.245,.275),l(.329,.045),l(.076,.181),l(.259,0), +N(431.57,91.965),l(-.447,-.633),l(-.207,-.036),l(-.165,-.18),l(-.219,.084),L(430.349,91),l(-.431,-.17),l(-.573,-.515),l(-.188,.072),l(-.478,-.265),l(-.244,-.173),l(-.036,-.233),l(-.159,-.085),l(.08,-.406),l(.155,-.25),l(-.413,-.098),l(-.258,-.378),l(-.037,-.056),l(.243,-.168),l(.26,-.181),l(.293,.033),l(.422,-.201),l(.442,0),l(.078,-.181),l(.382,-.012),l(.097,-.229),l(.358,-.061),l(.176,.072),l(.112,-.217),l(.735,-.024),l(.124,-.169),l(.524,-.048),l(.284,-.097),l(.254,-.084),l(-.282,-.218),l(.436,-.072),l(.308,.121),l(.031,.278),l(.344,.072),l(.142,-.115),l(.375,0),l(.024,-.151),l(-.062,-.073),l(.063,-.084),l(.361,-.018),l(.211,.091),l(.093,.26),l(.363,.163),l(.201,.025),l(.568,.054),l(.132,.181),l(.278,-.037),l(-.005,.169),l(.466,-.066),l(.061,-.066),l(.257,.024),l(.199,.181),l(-.099,.121),l(-.208,.024),l(-.224,.211),l(.55,.247),l(.296,.38),l(.318,.072),l(.22,-.187),l(.41,-.12),l(-.282,-.302),l(.003,-.145),l(.286,.024),l(.509,.193),l(.258,.121),l(.709,-.005),l(-.181,.283),l(.329,-.084),l(-.001,.253),l(.013,.221),l(.293,.013),l(.368,-.161),l(.311,.181),l(.802,.132),l(-.02,.249),l(.188,.208),l(.382,.096),l(.105,.331),l(-.071,-.012),l(-.065,.066),l(-.066,.04),l(-.105,-.026),L(442,89.998),l(-.119,.013),l(-.065,.04),l(-.132,.066),l(-.053,.079),l(-.118,.092),l(-.119,.053),l(-.132,.079),l(-.105,.013),l(-.118,.013),l(-.053,.092),l(-.026,.092),l(-.026,.132),l(-.053,.079),l(-.053,.105),l(-.145,.066),l(-.105,.04),l(-.092,-.026),l(-.079,.079),l(-.04,.092),l(-.053,.079),l(-.039,0),l(-.105,.026),l(-.066,.026),l(-.079,.053),l(-.118,.053),l(-.132,0),l(-.145,.04),l(-.093,.026),l(-.065,-.026),l(-.065,-.026),l(-.093,0),l(-.065,.026),l(-.158,0),l(-.132,-.053),l(-.092,-.053),l(-.093,.026),l(-.171,.053),l(-.026,.04),l(-.146,.119),l(-.092,.066),l(-.014,.131),l(-.065,.105),l(-.039,.044),l(-.055,-.095),l(-.545,-.2),l(-1.332,.181),l(-1.019,-.227),l(-1.374,-.341),l(-.746,.773),l(-.598,.163),l(-.483,-.099),l(-.354,-.129),l(-.145,-.014), +N(421.683,94.397),l(.368,.014),l(.164,-.137),l(.096,.11),l(.249,.007),l(.104,.137),l(.194,.048),l(-.011,.165),l(.26,.039),l(-.078,.195),l(.215,0),l(.452,-.343),l(-.032,-.274),l(.237,.041),l(.262,-.055),l(.493,.089),l(.093,.145),l(.059,.144),L(425.4,94.7),l(.377,-.103),l(.044,-.13),l(.319,-.014),l(.125,-.171),l(1.25,-.035),l(.092,-.178),l(.433,-.035),l(.195,.138),l(.564,-.062),l(.146,.117),l(-.049,.165),l(.441,.178),l(.082,-.055),l(.098,-.343),l(-.056,-.158),l(-.334,-.014),l(.197,-.295),l(-.538,-.571),l(.364,-.227),l(.968,-.295),l(.162,-.172),l(.039,-.337),l(.132,-.027),l(.437,.151),l(.682,-.26),l(.145,.014),l(.354,.129),l(.483,.099),l(.598,-.163),l(.746,-.773),l(1.374,.341),l(1.019,.227),l(1.332,-.181),l(.545,.2),l(.055,.095),l(.053,.093),l(-.097,.581),l(.155,.26),l(.761,.547),l(-.636,.291),l(-.019,.367),l(-.701,.054),l(-.164,-.134),l(-.325,0),l(-.223,.197),l(.452,.063),l(.136,.196),l(-.157,.206),l(-.409,.062),l(-.04,.375),l(.204,.188),l(-.154,.294),l(-.346,.299),l(-.693,.157),l(.082,.393),l(-.89,-.116),l(-.298,.196),l(-.85,-.08),l(-.566,.107),l(-.646,.5),l(-.287,-.152),l(-.612,.009),l(-.179,-.107),l(-1.04,-.065),l(-.478,-.112),l(-.894,-.082),l(-1.311,-.247),l(-.32,-.391),l(-.318,-.096),l(-.023,-.363),l(-.856,.227),l(-.301,-.103),l(-.445,.11),l(-.183,-.083),l(-.366,.096),l(-.329,.411),l(-.597,-.034),l(-.631,-.171),l(.029,-.171),l(-.215,-.117),l(-.579,.332),l(-.55,-.242),l(-.008,-.144),l(-.622,-.062),l(.09,-.192),l(-.214,-.288),l(.266,-.274),l(-.193,-.336), +N(431.763,171.063),l(-.067,.354),l(.091,.72),l(.108,.508),l(.225,.168),l(.562,.11),l(.144,.183),l(.077,.353),l(-.089,1.116),l(-.146,.227),l(-.274,.171),l(-.885,.217),l(-.291,.256),l(-.664,1.275),l(-.503,1.203),l(-.243,1.004),l(-.354,.129),l(-.369,.03),l(-.129,.354),l(-.146,1.229),l(-.192,.312),l(-.385,.045),l(-.257,.284),l(-.417,.836),l(-.944,2.223),l(-.304,.624),l(-.352,.496),l(-.368,.355),l(-.239,.114),l(-.145,-.056),l(-.722,-.97),l(-.145,-.14),l(-1.104,-.05),l(-.272,.03),l(-1.31,1.265),l(-.941,.839),l(-.495,.526),l(.02,.974),l(-.189,.552),l(-.376,.686),l(-.188,-.119),l(-.224,-.042),l(-.176,-.127),l(-.145,.212),l(.144,.296),l(-.063,.127),l(-.353,.198),l(-.56,.03),l(-.977,.101),l(-.607,-.267),l(-.288,.043),l(-.271,.368),l(-.177,.113),l(-.432,-.07),l(-1.247,-.011),l(-.528,-.225),l(-.543,-.451),l(-.416,-.72),l(-.192,-.649),l(.048,-.254),l(.208,-.254),l(-.144,-.296),l(-.513,-.069),l(-.128,-.254),l(-.464,-.55),l(-.561,-.465),l(-.608,-.253),l(-.641,-.253),l(-.272,-.31),l(-.513,.072),l(-.24,.297),l(-.336,.071),l(-.881,.044),l(-.659,.03),l(-.006,-.234),l(.121,-1.188),l(-.217,-1.439),l(.09,-.989),l(.012,-.876),l(-.003,-.48),l(-.002,-.381),l(.237,-.397),l(.257,-.03),l(.433,-.13),l(.078,-.368),l(-.116,-.592),l(.095,-.34),l(.656,-.414),l(.223,-.298),l(.19,-.566),l(.316,-.962),l(-.388,-.718),l(-.164,-.762),l(.062,-.777),l(.092,-.961),l(.158,-.849),l(.353,-.482),l(.687,-1.614),l(.676,-.4),l(1.064,-.188),l(1.174,-.108),l(1.111,.121),l(.821,.277),l(1.095,1.223),l(.209,.098),l(.37,-.002),l(1.337,-.544),l(.467,-.116),l(.354,.083),l(1.173,.742),l(.965,.277),l(.934,-.005),l(.273,-.059),l(.629,-.399),l(.403,-.327),l(.774,-.287),l(.628,-.103),l(.709,-.047),l(.531,.04),l(.884,.221),l(.724,.193),l(.609,.208),l(.259,-.058),l(.761,-.697),l(.453,-.299),l(.437,-.2),l(.951,-.034),l(.173,.394),l(.575,.52),l(.351,.407), +N(425.506,195.522),l(-1.965,-.017),l(-1.005,.007),l(.029,-.176),l(-.208,-.536),l(.271,-.989),l(-.159,-.72),l(-.191,-.522),l(-.399,-.649),l(.433,-.396),l(-.287,-.367),l(-.24,-.056),l(-.576,.058),l(-.559,-.268),l(-.176,-.324),l(-.063,-.537),l(-.111,-.211),l(-.527,-.14),l(-.101,-.064),l(.376,-.686),l(.189,-.552),l(-.02,-.974),l(.495,-.526),l(.941,-.839),l(1.31,-1.265),l(.272,-.03),l(1.104,.05),l(.145,.14),l(.722,.97),l(.145,.056),l(.239,-.114),l(.368,-.355),l(.352,-.496),l(.304,-.624),l(.944,-2.223),l(.417,-.836),l(.257,-.284),l(.385,-.045),l(.192,-.312),l(.146,-1.229),l(.129,-.354),l(.369,-.03),l(.354,-.129),l(.243,-1.004),l(.503,-1.203),l(.664,-1.275),l(.291,-.256),l(.885,-.217),l(.274,-.171),l(.146,-.227),l(.089,-1.116),l(-.077,-.353),l(-.144,-.183),l(-.562,-.11),l(-.225,-.168),l(-.108,-.508),l(-.091,-.72),l(.067,-.354),l(.627,.109),l(.208,.083),l(.923,1.238),l(.395,.887),l(.119,1.2),l(-.134,.651),l(.169,1.228),l(.205,.578),l(.381,.633),l(.208,.21),l(.047,.127),l(-.225,.143),l(-.674,.032),l(-1.187,-.191),l(-.481,-.082),l(-.24,.1),l(-.29,.312),l(-.323,.539),l(1.088,1.067),l(1.343,1.179),l(.638,1.07),l(.382,1.057),l(.208,.183),l(-.208,.114),l(-.354,.327),l(-.866,1.743),l(-.4,.511),l(-.528,.399),l(-.144,.198),l(-.064,.424),l(.112,.776),l(.273,1.185),l(.207,.592),l(.4,.661),l(.432,.605),l(.064,.791),l(.112,.324),l(1.217,1.236),l(.498,.802),l(.194,.804),l(.209,.451),l(-.159,.185),l(.1,.861),l(-.271,.086),l(-.863,-.292),l(-.864,-.334),l(-.576,-.194),l(-.56,-.124),l(-.479,-.04),l(-.271,-.055),l(-.878,.076),l(-.863,-.023),l(-.56,-.109),l(-1.022,-.149),l(-.831,-.038),l(-1.773,-.088),l(-.88,-.093),l(-.045,.495), +N(551.793,147.278),l(-.788,-.111),l(-.458,-.253),l(-.379,-.367),l(-.248,-1.101),l(-.112,-.141),l(-.342,-.141),l(-.662,-.083),l(-.105,-.07),l(-.014,-.268),l(.116,-.466),l(-.178,-.451),l(-.418,-.38),l(-.294,-.013),l(-1.181,.412),l(-1.229,.087),l(-.81,.143),l(-.947,.073),l(-.415,-.083),l(-.263,-.226),l(-.135,-.197),l(-.909,.143),l(-.548,.382),l(-.856,.016),l(-1.264,-.011),l(-.691,.128),l(-.723,.115),l(-.541,.03),l(.182,-.954),l(.049,-.354),l(.31,-.792),l(.285,-.383),l(.794,-.47),l(.697,-.258),l(1,-.077),l(.209,-.072),l(.188,-.255),l(.036,-.974),l(-.186,-.281),l(-.652,-.053),l(-.185,-.394),l(-.111,-1.34),l(-.168,-.38),l(-.409,-.224),l(-1.144,-.388),l(-.695,-.391),l(-.353,-.464),l(-.71,-1.068),l(-.802,-1.083),l(.887,.32),l(.63,.194),l(1.069,.248),l(.854,.235),l(.541,.039),l(.742,.024),l(1.187,-.218),l(.349,-.002),l(1.005,.135),l(1.234,-.12),l(.964,-.175),l(1.183,-.19),l(1.066,-.274),l(.247,-.156),l(.069,-.184),l(.099,-.903),l(.232,-.876),l(.188,-.34),l(.412,-.369),l(.597,-.441),l(.283,-.072),l(.644,.039),l(.516,.082),l(.254,-.086),l(.321,-.693),l(.362,-.271),l(.559,-.243),l(.562,.025),l(1.001,.375),l(.237,-.086),l(.34,-.383),l(.021,-.084),l(.139,-1.214),l(.288,-.834),l(.224,-.424),l(.292,-.228),l(.416,-.115),l(.513,-.031),l(.315,-.115),l(.199,-.255),l(-.088,-.437),l(-.129,-.281),L(556.193,125),l(-.35,-.336),l(.355,-.129),l(.997,.122),l(.698,.039),l(.513,-.215),l(.289,-.255),l(-.033,-.31),l(-.223,-.478),l(.13,-.283),l(.4,-.341),l(.524,-.355),l(.324,-.426),l(-.198,-.477),l(.119,-.483),l(-.232,-.171),l(-.01,-.336),l(-.411,-.271),l(-.01,-.32),l(.464,-.413),l(.258,-.214),l(.246,.023),l(.559,-.395),l(.272,-.19),l(.53,-.292),l(1.148,-.152),l(1.345,-.012),l(.647,.144),l(.338,-.179),l(.332,.005),l(.455,-.297),l(.358,-.004),l(.148,-.142),l(.313,.14),l(.105,.112),l(.281,-.21),l(.296,.047),l(.554,.117),l(.004,.456),l(.282,-.128),l(.625,-.009),l(.373,.323),l(.213,.247),l(.007,.501),l(-.312,.516),l(.301,.07),l(.198,.218),l(.252,.281),l(.52,-.196),l(.239,0),l(.104,.199),l(.178,.09),l(.565,.436),l(1.337,.104),l(.305,.111),l(.147,.126),l(-.207,.084),l(-.688,.37),l(-.411,.232),l(-.155,.43),l(-.071,.479),l(-.234,.116),l(-.125,-.179),l(-.621,-.102),l(-.438,.132),l(-.271,.298),l(-.262,-.116),l(-.557,.265),l(-.928,-.149),l(-.568,-.138),l(-1.708,-.325),l(-.894,.265),l(-.38,.611),l(.09,.166),l(.336,0),l(.047,.314),l(-.202,.149),l(.101,.199),l(.598,-.017),l(-.002,.347),l(-.384,.099),l(-.139,.413),l(.389,.232),l(-.116,.479),l(-.215,.132),l(.089,.248),l(.606,.298),l(-.003,.532),l(.782,-.003),l(-.039,.43),l(.188,.248),l(.702,-.05),l(.668,.377),l(.012,.211),l(-.2,.255),l(-.504,.2),l(-.643,.196),l(-.517,.248),l(.032,.366),l(.188,.377),l(-.237,.977),l(-1.512,1.503),l(.261,.38),l(-.358,.281),l(-.609,.133),l(-.353,.467),l(-.509,1.216),l(-.478,.547),l(-1.193,.496),l(-.177,.364),l(-.277,.481),l(-.563,.61),l(-.076,.38),l(-.71,.259),l(-.734,-.011),l(-.895,.314),l(-.361,-.094),l(-.158,-.518),l(-.207,-.132),l(-.404,.083),l(-.535,.463),l(-.144,.446),l(-.979,.893),l(-.186,.543),l(-.079,.269),l(.116,.38),l(.541,.163),l(.504,.085),l(.425,.014),l(-.114,.689),l(-.154,.735),l(.412,.411),l(.33,.099),l(.537,-.099),l(.112,.441),l(.216,.507),l(.654,1.333),l(-.232,.149),l(.241,.463),l(-.317,.066),l(-.15,.248),l(-.55,.083),l(-.145,-.335),l(-.183,-.062),l(-.78,.215),l(-.2,.331),l(-.735,-.099),l(-.229,-.149),l(-.835,-.021),l(-.835,-.009),l(-.259,-.052),l(.015,.728),l(-.866,.017),l(-.296,.431),l(-.37,.036), +N(606.155,150.953),l(-.037,-.466),l(-.627,-2.479),l(-.064,-.578),l(-.4,.044),l(-.281,.115),l(-.395,1.159),l(-.224,.354),l(-.529,-.448),l(-.249,-.267),l(-.23,-.281),l(-.001,-.381),l(-.009,-.522),l(.131,-.283),l(.651,-.356),l(.498,-.13),l(.938,-.767),l(.159,-.34),l(.012,-.79),l(-.057,-.127),l(-.111,-.098),l(-2.473,-.198),l(-.559,.003),l(-.916,.062),l(-.547,-.053),l(-.537,-.109),l(-.095,-.099),l(-.079,-.719),l(-.053,-.479),l(-.129,-.324),l(-.417,-.054),l(-.489,.06),l(-.372,-.266),l(-.339,-.266),l(-1.252,-.303),l(-.234,.171),l(-.555,.525),l(-.124,.283),l(.083,.155),l(.494,.237),l(1.224,.938),l(.126,.112),l(-.047,.155),l(-.382,.101),l(-.502,.13),l(-.4,.299),l(-.548,.61),l(.339,.323),l(1.042,.431),l(.193,.21),l(-.029,.269),l(-.505,.765),l(.04,.254),l(.352,.45),l(.325,1.409),l(.402,1.775),l(.147,.532),l(-.172,.322),l(.068,.183),l(-.321,.071),l(-.35,-.056),l(-.148,-.706),l(-.198,-.084),l(-.253,.354),l(-.171,.354),l(-.172,.057),l(-.115,-.099),l(-.28,-.592),l(-.152,-.169),l(-.412,.537),l(-.504,.298),l(-.992,.397),l(-.571,.213),l(-.264,.226),l(-.05,.113),l(.106,.579),l(.183,.409),l(-.336,.495),l(-.305,.332),l(-.013,.257),l(-.548,.415),l(-.593,.467),l(-.467,.185),l(-.432,.057),l(-.746,.206),l(-.591,.362),l(-.459,.58),l(-.551,.552),l(-.88,1.061),l(-.611,.552),l(-.673,.276),l(-.675,.829),l(-.676,.467),l(-.728,.368),l(-.452,.241),l(-.427,.312),l(-.192,.509),l(-.073,.466),l(-.341,.41),l(-.649,.298),l(-.428,.058),l(-.506,-.098),l(-.258,.269),l(-.366,.887),l(-.277,.23),l(-.505,-.253),l(-.614,.142),l(-.354,.283),l(-.304,.565),l(-.165,.48),l(-.005,.508),l(.166,1.539),l(.018,.805),l(-.208,.495),l(.227,.324),l(.315,.423),l(-.015,.508),l(-.199,.607),l(-.669,1.611),l(-.341,.834),l(-.13,.636),l(.047,.649),l(.21,1.764),l(-.081,.24),l(-.643,.001),l(-.433,-.013),l(-.186,.142),l(-.334,.961),l(-.324,.594),l(.025,.127),l(.493,.352),l(-.805,.327),l(-.306,.015),l(-.77,.284),l(-.295,.41),l(-.101,.692),l(-.157,.255),l(-.367,.283),l(-.526,.255),l(-.099,.057),l(-.066,.042),l(-.231,.156),l(-.145,0),l(-.174,-.056),l(-1.417,-1.451),l(-.092,-.395),l(-.276,-.522),l(-.34,-1.397),l(-.689,-1.792),l(-.94,-1.933),l(-.979,-1.508),l(-.554,-1.722),l(-.507,-1.792),l(-.738,-1.636),l(-.82,-1.42),l(-.424,-.737),l(-.598,-1.439),l(-.363,-1.157),l(-.767,-3.274),l(-.469,-2.695),l(-.157,-1.566),l(-.051,-.24),l(.232,-.565),l(.546,-.834),l(.007,-.311),l(-.404,-.281),l(-.367,-.437),l(-.113,-.635),l(-.108,-.917),l(.065,-.622),l(-.837,.03),l(-.19,.212),l(-.235,.424),l(.009,.183),l(.276,.254),l(.074,.183),l(-.073,.438),l(-.301,.438),l(-.503,.368),l(-.812,.369),l(-.504,.114),l(-.617,.255),l(-.377,.015),l(-.861,-.281),l(-.572,-.38),l(-1.018,-1),l(-1.391,-1.268),l(-.516,-.705),l(.267,-.043),l(1.062,.125),l(.615,-.086),l(.443,-.142),l(.461,-.283),l(.521,-.608),l(-.067,-.24),l(-.156,.071),l(-.587,.114),l(-.847,-.026),l(-.607,-.112),l(-.632,-.132),l(-.5,-.218),l(-.203,-.07),l(-.929,-.661),l(-.668,-.775),l(-.057,-.197),l(.37,-.036),l(.296,-.431),l(.866,-.017),l(-.015,-.728),l(.259,.052),l(.835,.009),l(.835,.021),l(.229,.149),l(.735,.099),l(.2,-.331),l(.78,-.215),l(.183,.062),l(.145,.335),l(.55,-.083),l(.15,-.248),l(.317,-.066),l(-.241,-.463),l(.232,-.149),l(-.654,-1.333),l(-.216,-.507),l(-.112,-.441),L(557,143.058),l(-.33,-.099),l(-.412,-.411),l(.154,-.735),l(.114,-.689),l(-.425,-.014),l(-.504,-.085),l(-.541,-.163),l(-.116,-.38),l(.079,-.269),l(.186,-.543),l(.979,-.893),l(.144,-.446),l(.535,-.463),l(.404,-.083),l(.207,.132),l(.158,.518),l(.361,.094),l(.895,-.314),l(.734,.011),l(.71,-.259),l(.076,-.38),l(.563,-.61),l(.277,-.481),l(.177,-.364),l(1.193,-.496),l(.478,-.547),l(.509,-1.216),l(.353,-.467),l(.609,-.133),l(.358,-.281),l(-.261,-.38),l(1.512,-1.503),l(.237,-.977),l(-.188,-.377),l(-.032,-.366),l(.517,-.248),l(.643,-.196),l(.504,-.2),l(.2,-.255),l(-.012,-.211),l(-.668,-.377),l(-.702,.05),l(-.188,-.248),l(.039,-.43),l(-.782,.003),l(.003,-.532),l(-.606,-.298),l(-.089,-.248),l(.215,-.132),l(.116,-.479),l(-.389,-.232),l(.139,-.413),l(.384,-.099),l(.002,-.347),l(-.598,.017),l(-.101,-.199),l(.202,-.149),l(-.047,-.314),l(-.336,0),l(-.09,-.166),l(.38,-.611),l(.894,-.265),l(1.708,.325),l(.568,.138),l(.928,.149),l(.557,-.265),l(.262,.116),l(.271,-.298),l(.438,-.132),l(.621,.102),l(.125,.179),l(.234,-.116),l(.071,-.479),l(.155,-.43),l(.411,-.232),l(.688,-.37),l(.207,-.084),l(.502,-.152),l(0,.515),l(.441,1.03),l(.221,.515),l(.81,.11),l(.441,.405),l(.221,.258),l(-.331,.221),l(-.184,.184),l(.073,.589),l(.037,.552),l(.294,.221),l(.718,.096),l(.092,.078),l(.044,.182),l(.68,.099),l(-.104,.414),l(.367,.694),l(-.578,.364),l(-.376,.281),l(-.368,.049),l(-.337,-.264),l(-.033,-.364),l(-.785,.198),l(.157,.694),l(.579,.595),l(-.104,.446),l(.272,.364),l(-.215,.215),l(.099,.43),l(.198,.066),l(.477,-.314),l(.383,.248),l(.772,.843),l(.363,-.116),l(1.078,.579),l(-.116,.364),l(.756,.248),l(.154,-.066),l(.859,.596),l(-1.07,.909),l(-.281,.116),l(.008,.364),l(-.221,.265),l(.04,.396),l(-.309,.397),l(-.218,.43),l(.039,.248),l(.63,.38),l(.466,-.083),l(.665,.479),l(.704,.149),l(.305,.529),l(1.242,.678),l(.231,-.166),l(1.027,.595),l(.538,-.066),l(.182,.397),l(.835,.166),l(.304,.198),l(.15,-.066),l(.087,-.215),l(.503,0),l(.482,.265),l(.582,-.347),l(.494,.298),l(.643,.066),l(.142,.231),l(-.101,.446),l(.663,.149),l(.286,.281),l(.618,.265),l(.584,-.281),l(.313,.066),l(-.034,.331),l(.312,.248),l(.379,-.231),l(.721,.148),l(.847,.364),l(.606,-.297),l(.268,.364),l(.399,.116),l(.357,-.132),l(.271,.083),l(.687,-.132),l(.336,.05),l(.311,-.694),l(-.429,-.827),l(.07,-.876),l(.318,-.761),l(-.037,-.022),l(.345,-.129),l(.471,-.102),l(.231,.069),l(.139,.183),l(-.052,.861),l(.212,.662),l(-.092,.113),l(.235,.493),l(.637,.18),l(.559,.081),l(.869,.214),l(.085,.021),l(.544,-.074),l(.531,-.313),l(.301,.055),l(.335,.125),l(1.238,.063),l(1.036,-.062),l(.624,-.06),l(.217,-.58),l(-.017,-.282),l(-.258,-.238),l(-.313,-.069),l(-.326,-.294),l(-.042,-.24),l(.07,-.156),l(.189,-.1),l(.784,-.033),l(.714,-.216),l(.397,-.27),l(1.123,-1.107),l(.543,-.37),l(.829,-.258),l(1.105,-.726),l(.546,-.299),l(.355,-.087),l(.286,.167),l(.975,.319),l(.377,-.044),l(1.377,-.84),l(.455,.392),l(.716,.715),l(.046,.38),l(-.354,.454),l(-.138,.269),l(.102,.056),l(.3,.055),l(.657,.081),l(.73,.179),l(.624,.081),l(-.018,.508),l(-.112,.24),l(-.596,.582),l(-.072,.283),l(.184,.718),l(-.295,.058),l(-.853,-.221),l(-.558,-.082),l(-.312,.129),l(-.719,.512),l(-1.446,.883),l(-.197,.354),l(.057,.761),l(-.136,.382),l(-.938,1.134),l(-.045,.212),l(.192,.408),l(0,.324),l(-1.148,2.25),l(-.17,.128),l(-.309,-.013),l(-.391,-.11),l(-.811,-.32),l(-.133,.283),l(.146,1.594),l(-.191,.354),l(-.401,.144),l(-.228,.185),l(.152,.93),l(-.015,.678),l(-.273,.368),l(-.25,.129),l(-.255,-.14),l(-.595,-.152), +N(478.516,135.173),l(.052,-.292),l(-.049,-.169),l(-.197,-.107),l(.107,-.175),l(.292,-.919),l(-.015,-.818),l(.517,-1.09),l(.3,-.891),l(-.004,-.409),l(.133,-.283),l(.07,-.749),l(.033,-.847),l(.062,-.174),l(.026,-.278),l(-.065,-.411),l(.037,-.119),l(.102,-.063),l(1.902,1.034),l(.365,.167),l(.253,-.016),l(1.139,-.656),l(2.96,-1.541),l(.161,-.071),l(.87,1.632),l(.311,.69),l(.093,.056),l(-.46,.44),l(-.257,.171),l(-.97,.26),l(-2.586,.622),l(-.646,.229),l(1.146,1.32),l(.698,.885),l(-.765,.724),l(-.456,.37),l(-.24,.072),l(-1.249,.332),l(-.462,.61),l(-.975,.782),l(-2.079,-.299),l(-.154,-.017), +N(456.028,151.46),l(-.021,1.003),l(.033,3.078),l(-.088,.17),l(-1.561,-.019),l(-.52,-.011),l(-.073,1.13),l(-1.981,-.963),l(-5.577,-2.792),l(-4.941,-2.372),l(-5.231,-2.554),l(-.41,.059),l(-1.818,.858),l(-1.519,.729),l(-.231,.157),l(-1.192,-.911),l(-.258,-.182),l(-1.008,-.333),l(-1.646,-.442),l(-.832,-.137),l(-.098,-.07),l(-.86,-1.506),l(-.178,-.168),l(-1.028,-.347),l(-.702,-.165),l(-.544,.201),l(-.244,-.154),l(-.562,-.873),l(-.249,-.917),l(-1.272,-1.702),l(.152,-.283),l(.249,-.128),l(.666,-.47),l(.086,-.17),l(.061,-.664),l(-.457,-1.156),l(.158,-.495),l(.16,-.622),l(-.101,-.748),l(.1,-.862),l(-.052,-.691),l(-.147,-.833),l(-.88,-1.605),l(.241,-.383),l(.204,-.156),l(.22,-.143),l(.864,-.598),l(.155,-.227),l(.147,-.537),l(-.274,-.973),l(.126,-.354),l(1.473,-1.138),l(.579,-.314),l(.802,-.428),l(.093,-.269),l(-.064,-.564),l(.093,-.981),l(1.436,.59),l(.995,.309),l(.521,.013),l(.863,-.129),l(.604,.027),l(1.552,.223),l(.614,.479),l(.794,.224),l(.486,-.001),l(.342,.197),l(.173,.226),l(.26,.819),l(.39,.564),l(.688,.591),l(.378,.126),l(.678,.14),l(1.031,.083),l(.447,.07),l(.973,.224),l(.639,.224),l(.552,.281),l(1.289,.788),l(.84,.464),l(.465,.013),l(.441,-.128),l(.758,-.411),l(.706,-.623),l(.3,-.523),l(0,-.254),l(-.276,-.621),l(-.112,-.579),l(.044,-.41),l(.237,-.537),l(.661,-.58),l(.333,-.198),l(.554,-.241),l(.644,-.298),l(1.376,-.413),l(1.205,.054),l(.728,.154),l(.844,.365),l(.188,.169),l(.043,.508),l(.281,.253),l(.301,.014),l(.945,.125),l(.712,.309),l(.45,.027),l(1.286,.04),l(.302,.197),l(.068,.381),l(.276,.296),l(-.099,.208),l(-.369,.228),l(-.21,.34),l(.354,1.283),l(-.231,.425),l(-.322,.553),l(-.056,.311),l(.185,.945),l(.388,.916),l(.042,.367),l(-.015,.988),l(-.019,3.869),l(-.016,1.468),l(-.008,2.048),l(-.001,.692),l(.045,2.81),l(-.021,1.342),l(.011,2.612), +N(478.212,134.714),l(-.834,-1.746),l(-.796,-1.944),l(-.124,-.289),l(.109,-.066),l(.679,-.851),l(.219,-.438),l(.183,-.507),l(.171,-.566),l(.188,-.822),l(.116,.018),l(.137,-.093),l(.006,-.204),l(.028,-.315),l(.372,-.051),l(.151,.022),l(.07,.099),l(.355,-.07),l(.009,-.167),l(.067,-.193),l(.088,-.041),l(.07,.023),l(.183,.346),l(.201,.128),l(.021,.183),l(-.047,.122),l(.082,.085),l(-.102,.063),l(-.037,.119),l(.065,.411),l(-.026,.278),l(-.062,.174),l(-.033,.847),l(-.07,.749),l(-.133,.283),l(.004,.409),l(-.3,.891),l(-.517,1.09),l(.015,.818),l(-.292,.919),l(-.107,.175),l(-.067,.068),l(-.042,.042), +N(495.751,163.817),l(-.03,-.184),l(-.112,-.537),l(-.508,-.945),l(-.73,-.987),l(-.438,-.493),l(-.846,-.69),l(-.51,-.875),l(-.814,-1.876),l(-.474,-.889),l(-.28,-.409),l(-.794,-.507),l(-1.271,-.689),l(-.527,-.634),l(-.8,-1.17),l(-.081,-.96),l(-.061,-.776),l(-.002,-.89),l(-.104,-.381),l(-.312,-.663),l(-.944,-1.65),l(-.357,-.494),l(-.758,-.62),l(-.459,-.225),l(-.499,-.126),l(-.308,-.282),l(-.483,-.578),l(.149,-.692),l(-.111,-.437),l(-.474,-.818),l(-.747,-1.072),l(-.793,-.902),l(-1.069,-1.494),l(-.525,-.931),l(-.352,-.479),l(-.722,-.761),l(-.524,-.056),l(-.248,0),l(.077,-.296),l(.193,-.283),l(.311,-1.314),l(.104,-.583),l(.154,.017),l(2.079,.299),l(.975,-.782),l(.462,-.61),l(1.249,-.332),l(.24,-.072),l(.456,-.37),l(.765,-.724),l(-.698,-.885),l(-1.146,-1.32),l(.646,-.229),l(2.586,-.622),l(.97,-.26),l(.257,-.171),l(.46,-.44),l(.093,.056),l(1.129,.459),l(.757,.222),l(2.034,.934),l(1.14,.473),l(2.44,1.101),l(.258,.196),l(.399,.633),l(.141,.07),l(.973,-.048),l(.135,.366),l(-.118,.396),l(.047,.818),l(.118,.253),l(.812,.277),l(1.557,.697),l(4.048,.132),l(1.657,.259),l(.408,.054),l(.334,.619),l(.185,.239),l(1.07,.05),l(.644,-.044),l(.043,.121),l(.277,.648),l(.365,.494),l(.178,.663),l(.052,.113),l(.615,-.029),l(.248,.126),l(-.204,.237),l(.194,.187),l(.184,.282),l(.234,.067),l(.234,.27),l(.886,.168),l(.423,.437),l(-.07,.28),l(-.235,.035),l(-.111,.25),l(.316,.381),l(-.188,.593),l(-.122,.198),l(.165,.268),l(.302,.666),l(.149,-.117),l(.372,.282),l(.105,.616),l(.422,.696),l(-.028,.423),l(.222,.268),l(.16,.197),l(.287,.084),l(.136,-.007),l(.336,.083),l(1.043,2.198),l(.548,1.154),l(.261,.902),l(3.362,.375),l(3.387,.446),l(.839,.108),l(.584,-.469),l(.152,-.057),l(.581,.914),l(.155,1.453),l(-5.346,2.982),l(-2.35,1.213),l(-1.691,.815),l(-.169,.085),l(-1.148,.346),l(-3.097,1.035),l(-4.618,1.566),l(-.484,.229),l(-.041,.127),l(-.383,.397),l(-1.907,2.271),l(-2.042,2.667),l(-1.302,-2.703),l(-1.211,-2.45),l(-.452,-.012),l(-.715,.047),l(-.446,-.125),l(-.671,-.151),l(-.216,.1),l(-.174,.185),l(-.11,.495),l(.041,.678),l(-.113,.565),l(-.692,.563), +N(476.458,130.735),l(.124,.289),l(.796,1.944),l(.834,1.746),l(-.38,.381),l(-.479,1.145),l(-.334,1.413),l(-.171,.593),l(-.18,.156),l(-.407,-.07),l(-.448,-.521),l(-.782,-.676),l(-.386,-.494),l(-.338,-.988),l(-.521,-.45),l(-.289,-.621),l(-.17,-.479),l(-.198,-.353),l(-.466,.17),l(-.267,.523),l(.604,1.34),l(.131,.381),l(.634,.86),l(.933,1.042),l(.473,1.199),l(.526,.973),l(.277,.818),l(.391,.465),l(.912,1.735),l(1.072,1.904),l(.428,.705),l(.586,.549),l(.451,.352),l(.151,.183),l(-.241,.17),l(-.285,.1),l(-.043,.155),l(.238,1.087),l(.252,.467),l(.127,.238),l(.812,.591),l(.397,.168),l(.406,.521),l(.416,.38),l(.311,.56),l(-10.382,-.006),l(-2.138,-.001),l(-2.774,.002),l(-2.513,.015),l(-2.268,-.029),l(-1.664,.01),l(-1.241,.007),l(-1.614,-.019),l(-.914,.005),l(-.819,.089),l(-.011,-2.612),l(.021,-1.342),l(-.045,-2.81),l(.001,-.692),l(.008,-2.048),l(.016,-1.468),l(.019,-3.869),l(.015,-.988),l(-.042,-.367),l(-.388,-.916),l(-.185,-.945),l(.056,-.311),l(.322,-.553),l(.231,-.425),l(-.354,-1.283),l(.21,-.34),l(.369,-.228),l(.099,-.208),l(.337,.168),l(.553,-.015),l(.628,-.1),l(.786,-.001),l(1.513,.293),l(.587,.115),l(.779,.122),l(.721,.154),l(.348,.409),l(.4,0),l(.928,.083),l(.998,.394),l(.628,.069),l(.245,-.127),l(.72,-.538),l(.925,-.397),l(.837,-.186),l(.78,-.27),l(.375,-.072),l(.346,.056),l(.535,-.001),l(.723,.126),l(.202,.465),l(.596,.366),l(.518,-.156),l(.64,.267),l(.382,.027),l(.561,-.401),l(.241,.179),l(.277,.056),l(.674,.13),l(.338,-.062),l(.46,-.165),l(.51,-.308), +N(580.625,132.873),l(.24,.43),l(.299,.05),l(.276,-.314),l(.134,-.513),l(.275,.066),l(.186,-.182),l(1.079,.199),l(.132,.612),l(.867,.264),l(.726,.595),l(.472,.215),l(.15,-.132),l(.454,.281),l(.657,.794),l(.158,-.166),l(.71,-.116),l(.289,.166),l(.178,.38),l(-.069,.281),l(1.451,.893),l(.333,-.248),l(.326,.017),l(-.175,.396),l(.014,.265),l(.935,.066),l(.365,-.066),l(.54,.496),l(.141,.463),l(.237,-.099),l(-.01,-.364),l(.685,.38),l(.271,-.083),l(.08,-.331),l(.407,0),l(.63,.281),l(.319,.364),l(.849,-.066),l(.341,.116),l(.339,-.281),l(.655,.159),l(.037,.022),l(-.318,.761),l(-.07,.876),l(.429,.827),l(-.311,.694),l(-.336,-.05),l(-.687,.132),l(-.271,-.083),l(-.357,.132),l(-.399,-.116),l(-.268,-.364),l(-.606,.297),l(-.847,-.364),l(-.721,-.148),l(-.379,.231),l(-.312,-.248),l(.034,-.331),l(-.313,-.066),l(-.584,.281),l(-.618,-.265),l(-.286,-.281),l(-.663,-.149),l(.101,-.446),l(-.142,-.231),l(-.643,-.066),l(-.494,-.298),l(-.582,.347),l(-.482,-.265),l(-.503,0),l(-.087,.215),l(-.15,.066),l(-.304,-.198),l(-.835,-.166),l(-.182,-.397),l(-.538,.066),l(-1.027,-.595),l(-.231,.166),l(-1.242,-.678),l(-.305,-.529),l(-.704,-.149),l(-.665,-.479),l(-.466,.083),l(-.63,-.38),l(-.039,-.248),l(.218,-.43),l(.309,-.397),l(-.04,-.396),l(.221,-.265),l(-.008,-.364),l(.281,-.116),l(1.07,-.909), +N(374.125,167.166),l(-1.41,-.924),l(-.661,-.604),l(-.537,-.788),l(-.292,-.662),l(-.15,-.183),l(-.312,-.154),l(-.567,-.053),l(-.655,-.307),l(-.695,-.561),l(-.604,-.194),l(-.567,-.025),l(-1.209,.12),l(-1.821,.194),l(-.523,.417),l(.06,-.502),l(.563,-1.301),l(.188,-.819),l(.13,-1.13),l(-.162,-1.101),l(-.3,-.791),l(-.624,-.747),l(.267,-.283),l(.182,-.424),l(.067,-.975),l(-.065,-.537),l(-.174,-.353),l(-.808,-.817),l(-.297,-.112),l(-.393,.438),l(-.055,-.197),l(-.013,-.381),l(.08,-.689),l(.474,.013),l(5.055,.056),l(2.396,.014),l(.732,-.033),l(.212,.027),l(-.051,-1.102),l(-.164,-1.539),l(.01,-.707),l(.249,-.383),l(.575,-.427),l(.726,-.315),l(.809,-.287),l(.144,-.128),l(.099,-2.6),l(.07,-2.261),l(.047,-.509),l(.557,-.074),l(6.005,.022),l(.56,.011),l(.104,-.396),l(-.002,-.65),l(.03,-1.752),l(2.829,1.509),l(4.12,2.42),l(1.414,.91),l(-.523,.13),l(-3.231,.089),l(.049,.776),l(.908,7.962),l(.19,1.468),l(.178,1.736),l(.325,2.753),l(.202,2.386),l(.186,1.468),l(.724,.787),l(-.379,1.613),l(-6.457,.01),l(-1.953,.026),l(-.945,.344),l(-.387,.031),l(-.485,-.054),l(-.713,-.137),l(-.535,-.124),l(-.06,.212),l(.055,.296),l(-.107,.269),l(-.454,-.082),l(-.214,-.168),l(-.568,-.83),l(-.261,-.111),l(-.402,.073),l(-.252,.256),l(-.181,.552),l(-.018,.607),l(-.332,.284), +N(476.114,191.139),l(-.563,.54),l(-.626,.314),l(-.367,.016),l(-.303,-.196),l(-.303,-.097),l(-.88,.132),l(-.881,.33),l(-.911,.048),l(-.942,-.234),l(-.495,-.011),l(-.464,.087),l(-.496,.229),l(-1.288,-1.32),l(-1.032,-.926),l(-.207,-.083),l(-.258,.157),l(-.436,.582),l(-.16,.1),l(-.684,-.631),l(-.384,-.012),l(-.529,.37),l(-.258,.242),l(-.352,.016),l(-.366,-.195),l(-.525,-.477),l(-.348,-.493),l(-.795,-.772),l(-.143,-.239),l(-.031,-.07),l(.083,-.679),l(-.157,-.352),l(-.558,-.477),l(-.814,-.165),l(-.367,-.224),l(-.285,-.436),l(-.059,-.72),l(-.206,-.366),l(-.207,-.168),l(-.717,-.434),l(-.558,-.378),l(-.445,-.351),l(-.173,-.395),l(.148,-.481),l(-.223,-.267),l(-.351,-.196),l(-.799,-.235),l(-.797,-.447),l(-.223,-.225),l(-.252,-.493),l(-.207,-.126),l(-.272,.001),l(-.802,.019),l(-.158,-.211),l(-.01,-.664),l(.416,-1.472),l(-.122,-.536),l(-.347,-.549),l(-1.342,-1.673),l(.15,-.425),l(-.026,-.367),l(-.266,-.465),l(-.444,-.407),l(-.155,-.295),l(-.137,-.522),l(-.221,-1.228),l(-.141,-.225),l(-.338,-.012),l(-.517,.088),l(-.219,-.352),l(.316,-.609),l(.542,-.596),l(.087,-.34),l(-.342,-.662),l(.053,-.24),l(.718,-.428),l(.149,-.212),l(-.131,-.677),l(.122,-.438),l(.583,-.809),l(.417,-1.245),l(.229,-.143),l(1.245,-.05),l(.839,.009),l(.04,-.283),l(-.031,-1.229),l(-.036,-1.002),l(.038,-.749),l(-.085,-2.5),l(.036,-.636),l(.016,-.946),l(.02,-1.045),l(.073,-1.13),l(.52,.011),l(1.561,.019),l(.088,-.17),l(-.033,-3.078),l(.021,-1.003),l(.819,-.089),l(.914,-.005),l(1.614,.019),l(1.241,-.007),l(1.664,-.01),l(2.268,.029),l(2.513,-.015),l(2.774,-.002),l(2.138,.001),l(10.382,.006),l(.229,.414),l(.499,1.115),l(.281,3.501),l(.319,1.637),l(.182,.211),l(.625,.394),l(.595,.366),l(.617,.507),l(.491,.197),l(.254,.223),l(-.238,.199),l(-.277,.327),l(-.306,.566),l(-.369,.242),l(-.511,.172),l(-.427,.116),l(-.153,.142),l(-.235,.496),l(-.348,.171),l(-.73,.033),l(-.204,.552),l(-.038,.452),l(-.202,.862),l(-.242,.722),l(-.541,1.302),l(-.068,.495),l(.092,.903),l(-.013,.679),l(-.001,.083),l(-.148,.947),l(-.398,1.231),l(-.214,1.061),l(-1.04,.331),l(-.414,.37),l(-.693,1.134),l(-.154,.34),l(-.191,1.088),l(-.141,1.074),l(-.197,.185),l(-.274,.044),l(-.431,-.096),l(-.259,.072),l(-.163,.114),l(-.187,1.103),l(-.115,.933),l(-.2,1.272),l(.039,.522),l(-.229,1.159),l(-.469,.299),l(-.288,-.012),l(-.928,-.122),l(-.321,.03),l(-.188,.806),l(-.054,.466),l(.094,.141),l(.479,.11),l(.734,.123),l(.334,.167),l(.805,.913),l(1.06,1.067),l(.751,1.464),l(.345,.732),l(.348,.421),l(.462,.28),l(.415,.097),l(.269,.309),l(.117,.988),l(-.034,.17),l(-.018,.141),l(-.079,-.028),l(-.464,.017),l(-1.009,.133),l(-.832,.005),l(-.671,-.052),l(-.291,.327),l(-.678,.795), +N(518.402,163.079),l(-.282,.097),l(-.538,.27),l(-.656,.566),l(-.265,.297),l(-.166,.508),l(-.062,.41),l(-.41,.326),l(-1.418,.652),l(-2.27,.641),l(-1.285,.412),l(-.843,.312),l(-.356,.297),l(-.473,.622),l(-.436,.269),l(-.506,.114),l(-.593,-.069),l(-.521,.072),l(-.83,.439),l(-.65,.396),l(-.956,.397),l(-.752,.199),l(-1.16,.003),l(-.562,-.013),l(-.297,.128),l(-.386,.312),l(-.272,.297),l(-.45,.312),l(-.511,.241),l(-.389,.043),l(-.239,-.042),l(-.535,.411),l(-.839,.058),l(-.494,-.112),l(-.623,-.437),l(-.17,-.155),l(-.317,-.437),l(-.084,-.254),l(.18,-.721),l(-.081,-.635),l(-.312,-.507),l(-.341,-1.171),l(-.572,-1.919),l(-.072,-.438),l(.268,-.707),l(-.124,-.748),l(.692,-.563),l(.113,-.565),l(-.041,-.678),l(.11,-.495),l(.174,-.185),l(.216,-.1),l(.671,.151),l(.446,.125),l(.715,-.047),l(.452,.012),l(1.211,2.45),l(1.302,2.703),l(2.042,-2.667),l(1.907,-2.271),l(.383,-.397),l(.041,-.127),l(.484,-.229),l(4.618,-1.566),l(3.097,-1.035),l(1.148,-.346),l(.169,-.085),l(.092,.663),l(.226,.634),l(.604,.971),l(.933,1.364),l(.127,.253),l(-.006,.296),l(.483,.689),l(.241,.306), +N(494.64,172.627),l(-.261,-.166),l(-.476,-.633),l(-.475,-.159),l(-.437,-.911),l(-1.267,-.792),l(-.277,-.594),l(-.673,-.673),l(-.594,-.119),l(-.871,-.554),l(-.555,.079),l(-.158,-.158),l(-.237,.04),l(-.277,-.198),l(-.356,.159),l(-.476,.079),l(-.277,-.436),l(-.158,.237),l(-.436,.198),l(-.792,.079),l(-.554,-.594),l(-.238,0),l(-.396,-.317),l(-.832,1.663),l(-.436,-.871),l(-.475,.079),l(-.277,.356),l(-.396,-.08),l(-.349,.041),l(.013,-.679),l(-.092,-.903),l(.068,-.495),l(.541,-1.302),l(.242,-.722),l(.202,-.862),l(.038,-.452),l(.204,-.552),l(.73,-.033),l(.348,-.171),l(.235,-.496),l(.153,-.142),l(.427,-.116),l(.511,-.172),l(.369,-.242),l(.306,-.566),l(.277,-.327),l(.238,-.199),l(.098,.129),l(.718,2.102),l(.442,1.623),l(.689,1.919),l(.618,.832),l(.205,-.212),l(-.072,-.479),l(.093,-.226),l(.31,.253),l(.4,.677),l(.384,.395),l(.534,-.043),l(.242,.014),l(1.338,1.282),l(.809,.916),l(.124,.099),l(.706,.055),l(.618,.874),l(.021,.24),l(-.025,.198),l(.118,.212),l(.507,.182),l(.915,.869),l(-.075,.094),l(-.529,.78),l(-.331,-.182),l(-.396,-.125),l(-.214,.114),l(-.055,.085), +N(370.147,172.035),l(-2.301,-.043),l(-1.045,.006),l(-.505,.384),l(-.51,.187),l(-.74,-.024),l(-.819,.047),l(-.463,.139),l(-.009,-.003),l(-.278,-.226),l(-.169,-.409),l(.104,-.424),l(-.095,-.55),l(-.018,-.198),l(.001,-.046),l(1.695,.014),l(0,-.434),l(.155,0),l(.341,-.016),l(.186,-.077),l(.248,.062),l(.294,-.046),l(.124,-.093),l(.016,-.263),l(.077,-.078),l(.14,-.016),l(.155,.155),l(.232,.124),l(.356,.108),l(.046,.108),l(.139,.047),l(.217,-.031),l(.263,.108),l(.186,.17),l(.434,0),l(.186,-.108),l(.263,-.108),l(.279,0),l(.108,-.124),l(.016,-.124),l(-.155,-.217),l(-.202,-.077),l(-.201,.031),l(-.294,.093),l(-.108,.093),l(-.248,.062),l(-.279,-.186),l(-.031,-.186),l(-.186,-.108),l(-.17,-.015),l(-.186,.124),l(-.139,-.108),l(-.108,-.217),l(-.155,-.108),l(-.201,.031),l(-.17,-.062),l(-.387,.17),l(-.108,-.108),l(-.155,.046),l(-.202,.124),l(-.093,.294),l(-1.664,0),l(-.007,-.067),l(-.028,-.269),l(-.377,-.268),l(-.068,-.155),l(-.057,-.367),l(-.386,-.635),l(-.399,-.494),l(-.379,-.31),l(-.472,-.183),l(.54,-.34),l(.723,-.75),l(.588,-1.004),l(.334,-.82),l(.099,-.826),l(.523,-.417),l(1.821,-.194),l(1.209,-.12),l(.567,.025),l(.604,.194),l(.695,.561),l(.655,.307),l(.567,.053),l(.312,.154),l(.15,.183),l(.292,.662),l(.537,.788),l(.661,.604),l(1.41,.924),l(-.506,.399),l(-.057,.339),l(.251,1.1),l(.144,.663),l(.22,.479),l(.181,.197),l(.554,.322),l(.265,.337),l(.082,.833),l(-.004,.565),l(-.062,.142),l(-.146,-.042),l(-.963,.091),l(-.658,.074),l(-.725,-.081),l(-.503,-.209),l(-.795,-.32),l(-1.255,-.021), +N(495.973,175.881),l(-.363,.807),l(.083,.409),l(.428,.732),l(.587,.844),l(.732,.801),l(.596,.547),l(.634,.321),l(.54,.209),l(4.26,1.443),l(1.447,.472),l(1.875,-.04),l(.236,.154),l(-4.087,4.205),l(-1.562,1.69),l(-.813,.909),l(-.8,.004),l(-1.693,-.046),l(-.626,.088),l(-.562,.215),l(-.388,.214),l(-.502,.497),l(-.294,.426),l(-.337,.115),l(-1.216,.078),l(-.305,.101),l(-.453,.511),l(-1.103,-.106),l(-.461,-.181),l(-.46,-.336),l(-.271,-.098),l(-.852,.358),l(-.675,.343),l(-.258,.199),l(-.71,.753),l(-.16,.114),l(-.847,-.094),l(-.67,-.193),l(-1.373,-.133),l(-.335,-.041),l(-2.353,-1.525),l(-.604,-.293),l(-.749,-.193),l(-1.054,-.149),l(-.319,-.069),l(.018,-.141),l(.034,-.17),l(-.117,-.988),l(-.269,-.309),l(-.415,-.097),l(-.462,-.28),l(-.348,-.421),l(-.345,-.732),l(-.751,-1.464),l(-1.06,-1.067),l(-.805,-.913),l(-.334,-.167),l(-.734,-.123),l(-.479,-.11),l(-.094,-.141),l(.054,-.466),l(.188,-.806),l(.321,-.03),l(.928,.122),l(.288,.012),l(.469,-.299),l(.229,-1.159),l(-.039,-.522),l(.2,-1.272),l(.115,-.933),l(.187,-1.103),l(.163,-.114),l(.259,-.072),l(.431,.096),l(.274,-.044),l(.197,-.185),l(.141,-1.074),l(.191,-1.088),l(.154,-.34),l(.693,-1.134),l(.414,-.37),l(1.04,-.331),l(.214,-1.061),l(.398,-1.231),l(.148,-.947),l(.001,-.083),l(.349,-.041),l(.396,.08),l(.277,-.356),l(.475,-.079),l(.436,.871),l(.832,-1.663),l(.396,.317),l(.238,0),l(.554,.594),l(.792,-.079),l(.436,-.198),l(.158,-.237),l(.277,.436),l(.476,-.079),l(.356,-.159),l(.277,.198),l(.237,-.04),l(.158,.158),l(.555,-.079),l(.871,.554),l(.594,.119),l(.673,.673),l(.277,.594),l(1.267,.792),l(.437,.911),l(.475,.159),l(.476,.633),l(.261,.166),l(-.594,.921),l(-.488,.61),l(-.105,.254),l(-.029,.396),l(.202,1.157),l(.5,-.074),l(.892,-.246),l(.4,.04),l(.556,.195), +N(364.011,169.929),l(1.664,0),l(.093,-.294),l(.202,-.124),l(.155,-.046),l(.108,.108),l(.387,-.17),l(.17,.062),l(.201,-.031),l(.155,.108),l(.108,.217),l(.139,.108),l(.186,-.124),l(.17,.015),l(.186,.108),l(.031,.186),l(.279,.186),l(.248,-.062),l(.108,-.093),l(.294,-.093),l(.201,-.031),l(.202,.077),l(.155,.217),l(-.016,.124),l(-.108,.124),l(-.279,0),l(-.263,.108),l(-.186,.108),l(-.434,0),l(-.186,-.17),l(-.263,-.108),l(-.217,.031),l(-.139,-.047),l(-.046,-.108),l(-.356,-.108),l(-.232,-.124),l(-.155,-.155),l(-.14,.016),l(-.077,.078),l(-.016,.263),l(-.124,.093),l(-.294,.046),l(-.248,-.062),l(-.186,.077),l(-.341,.016),l(-.155,0),l(0,.434),l(-1.695,-.014),l(.019,-.477),l(.173,-.198),l(.434,-.058),l(.093,-.155),l(-.006,-.059), +N(495.973,175.881),l(-.556,-.195),l(-.4,-.04),l(-.892,.246),l(-.5,.074),l(-.202,-1.157),l(.029,-.396),l(.105,-.254),l(.488,-.61),l(.594,-.921),l(.055,-.085),l(.214,-.114),l(.396,.125),l(.331,.182),l(.529,-.78),l(.075,-.094),l(.627,.596),l(.285,.465),l(.036,.282),l(-.118,.113),l(-.361,.185),l(-.438,.1),l(-.56,.312),l(-.566,.467),l(.253,.127),l(.645,-.058),l(.321,.013),l(.434,.124),l(-.114,.26),l(-.37,.468),l(-.34,.567), +N(363.763,172.732),l(.463,-.139),l(.819,-.047),l(.74,.024),l(.51,-.187),l(.505,-.384),l(1.045,-.006),l(2.301,.043),l(-.111,.792),l(.115,.847),l(-.186,.312),l(-.333,.186),l(-.513,.031),l(-.401,.017),l(-.381,.186),l(-.789,.64),l(-.321,.372),l(-.047,-.126),l(-.192,0),l(-.501,-.14),l(-.165,-.254),l(.121,-.41),l(.33,-.438),l(.253,-.212),l(-.131,-.141),l(-.372,-.112),l(-.498,.015),l(-.415,.17),l(-.161,0),l(-.616,-.281),l(-.36,-.296),l(-.069,-.24),l(-.323,-.084),l(-.316,-.137), +N(383.005,177.596),l(-.379,.397),l(-.264,.623),l(.214,.409),l(.695,.405),l(.197,.31),l(-.125,.283),l(-.332,.37),l(.309,.351),l(.648,.561),l(.051,.226),l(-.19,.143),l(-.304,-.012),l(-.548,-.223),l(-.304,.03),l(-.158,.199),l(-.03,.127),l(.296,.549),l(.179,.21),l(-.188,.354),l(-.602,.554),l(-.047,.099),l(-.339,-.224),l(-.337,-.097),l(-.143,.086),l(-.756,.922),l(-.321,-.026),l(-.404,-.322),l(-.277,-.323),l(.044,-.283),l(-.009,-.65),l(-.22,-.846),l(-.165,-.366),l(-.338,-.097),l(-.528,.046),l(-.367,.143),l(-.252,.242),l(-.193,.376),l(-.26,-.656),l(-.165,-1.369),l(-.252,-.761),l(-.475,-.619),l(-.456,-.421),l(-.42,-.224),l(-.466,-.04),l(-1.137,.148),l(-.594,-.039),l(-.238,.157),l(-.643,.866),l(-1.088,1.235),l(.051,-.392),l(-.312,-.55),l(-.764,-.775),l(-.122,-.649),l(-.84,-.366),l(-.908,-.563),l(-.277,-.296),l(.09,-.396),l(-.053,-.311),l(-.547,-.041),l(-.323,-.098),l(-.115,-.155),l(.059,-.311),l(-.038,-.1),l(.321,-.372),l(.789,-.64),l(.381,-.186),l(.401,-.017),l(.513,-.031),l(.333,-.186),l(.186,-.312),l(-.115,-.847),l(.111,-.792),l(1.255,.021),l(.795,.32),l(.503,.209),l(.725,.081),l(.658,-.074),l(.963,-.091),l(.146,.042),l(.113,.028),l(.18,.183),l(.882,.715),l(.536,.265),l(.252,-.256),l(.475,-.413),l(.338,.026),l(.356,.153),l(.565,.152),l(.43,-.243),l(.3,-.327),l(.684,-.428),l(.323,.055),l(.246,.281),l(.022,.339),l(.271,.832),l(.265,.451),l(.474,.478),l(.349,.718),l(.194,1.143),l(.559,.901), +N(266.015,188.956),l(.103,.169),l(-.163,.326),l(-.592,.385),l(-1.74,.9),l(-.807,.23),l(-.557,.074),l(-.465,-.054),l(-.284,.115),l(-.232,1.117),l(-.348,.115),l(-.628,-.618),l(-.344,-.224),l(-1.149,.035),l(-.385,-.04),l(-.896,-.461),l(-.309,-.125),l(-.159,.029),l(-.041,.184),l(.616,.688),l(.391,.69),l(.302,1.524),l(.079,.55),l(.166,.239),l(.96,.051),l(.434,.125),l(.15,.253),l(-.265,.27),l(-.569,.272),l(-.652,.131),l(-.203,.199),l(-.259,.666),l(-.235,.213),l(-.652,.173),l(-.554,.286),l(-.74,.654),l(-.645,.739),l(-.271,.016),l(-.186,-.776),l(-.083,-.183),l(-.757,.697),l(-.414,.073),l(-.482,-.223),l(-.694,-.546),l(-.432,-.054),l(-.199,-.437),l(-.088,-.452),l(-.161,-.861),l(-.138,-.437),l(-.148,-.168),l(-.797,-1.182),l(-.51,-.491),l(.479,-.526),l(.731,-.612),l(-.121,-.282),l(-.486,-.647),l(-.256,-.437),l(-.447,-.789),l(-.162,-.804),l(-.048,-.367),l(-.035,-.438),l(-.026,-.254),l(.147,-.326),l(.379,-.511),l(.085,-1.004),l(.409,-.525),l(-.644,-.081),l(-1.99,.224),l(-.76,.174),l(-.522,.13),l(-.144,0),l(-.554,-.576),l(-.847,-.998),l(-.188,-.253),l(-.64,-.321),l(-.521,-.181),l(-1.167,.05),l(-1.163,.12),l(-.496,.017),l(-.397,-.252),l(-.429,-.548),l(-.401,-.309),l(-.099,-.353),l(.226,-1.132),l(-.103,-.395),l(-.855,-1.45),l(-.31,-.606),l(-.384,.017),l(-.234,.1),l(-.402,-.025),l(.709,-1.191),l(.241,-.722),l(.172,-.722),l(.99,-1.758),l(.381,-.059),l(.227,.027),l(.129,-.396),l(-.048,-.497),l(.056,-.288),l(.414,-.2),l(.534,-.156),l(.84,-.171),l(.128,.105),l(-.9,.151),l(-.731,.312),l(-.145,.212),l(.19,.607),l(.142,.407),l(.224,.126),l(-.043,.145),l(.153,.579),l(-.135,.367),l(-.327,.364),l(-.348,.824),l(-.137,.368),l(.253,.479),l(.288,.253),l(.25,.72),l(.341,.353),l(.523,-.114),l(.184,-.156),l(.419,-.255),l(.12,-.142),l(.066,-.523),l(-.167,-.649),l(-.21,-.282),l(-.438,-.804),l(-.136,-.135),l(-.118,-.395),l(-.247,-.18),l(.239,-.099),l(.095,-.251),l(-.204,-.144),l(1,-.379),l(1.085,-.327),l(.998,-.272),l(.086,-.225),l(.69,-.086),l(.143,-.008),l(-.042,-.157),l(-.055,-.198),l(-.125,-.036),l(-.039,-.108),l(-.128,-.072),l(-.226,.071),l(-.156,.027),l(-.229,-.012),l(-.315,-.55),l(.109,-.254),l(.337,-.213),l(.367,-.043),l(.09,.112),l(.14,.368),l(.186,.162),l(-.001,.148),l(.026,.193),l(.068,.09),l(.004,.198),l(.253,.258),l(.329,-.02),l(.699,.111),l(.455,.07),l(.593,.196),l(.323,.254),l(.393,.564),l(.156,.635),l(.358,.324),l(.359,.084),l(1.02,-.129),l(.928,-.059),l(.59,-.058),l(.799,-.059),l(.714,.125),l(.4,.479),l(.267,.169),l(.578,.253),l(.49,.14),l(1.094,.04),l(.382,-.057),l(.388,-.227),l(1.042,-.807),l(.47,-.185),l(.453,.042),l(.959,-.073),l(1.152,-.073),l(.919,.055),l(.248,.112),l(-.056,.141),l(-.294,.185),l(-.854,-.041),l(-.433,.015),l(-.083,.212),l(.059,.184),l(.593,.253),l(.609,.535),l(.195,.649),l(.246,-.523),l(.185,-.142),l(.415,.253),l(.483,.027),l(.374,.098),l(.258,.338),l(.918,.394),l(.464,.295),l(-.729,.496),l(-.161,.65),l(-.214,.226),l(-1.055,.417),l(.5,.064),l(.598,.098),l(.368,-.029),l(.33,-.142),l(.929,-.03),l(.725,.083),l(.84,.274),l(.095,.296),l(-.061,.41),l(-1.655,1.239),l(-.101,.255),l(.074,.212),l(.62,.604),l(.141,.282),l(-.308,.299),l(-.41,.144),l(-1.032,.19),l(-.061,.452),l(.008,.58),l(-.395,.539),l(-.071,.212),l(.324,.521),l(.732,.745),l(.503,.647), +N(493.044,204.258),l(-1.223,-1.771),l(-.027,-.932),l(-.03,-1.43),l(-.042,-2.045),l(-.003,-1.017),l(0,-.438),l(.016,-.848),l(.004,-1.215),l(.002,-.508),l(1.649,-2.467),l(.453,-.511),l(.305,-.101),l(1.216,-.078),l(.337,-.115),l(.294,-.426),l(.502,-.497),l(.388,-.214),l(.562,-.215),l(.626,-.088),l(1.693,.046),l(.8,-.004),l(.813,-.909),l(1.562,-1.69),l(4.087,-4.205),l(-.236,-.154),l(-1.875,.04),l(-1.447,-.472),l(-4.26,-1.443),l(-.54,-.209),l(-.634,-.321),l(-.596,-.547),l(-.732,-.801),l(-.587,-.844),l(-.428,-.732),l(-.083,-.409),l(.363,-.807),l(.34,-.567),l(.37,-.468),l(.114,-.26),l(.154,.044),l(.935,1.142),l(.586,.62),l(.243,.381),l(.265,.211),l(.372,-.071),l(.417,-.001),l(.465,.027),l(.372,-.071),l(.572,-.27),l(.836,-.425),l(.585,-.157),l(.397,.098),l(.76,.267),l(.549,-.072),l(.56,-.326),l(.779,-.566),l(.247,-.127),l(.447,.041),l(.479,.098),l(.419,-.043),l(1.195,-.482),l(.288,.027),l(.682,.196),l(.74,-.03),l(.764,-.185),l(.964,-.327),l(.9,-.666),l(.47,-.382),l(.604,.154),l(.391,.211),l(.08,.014),l(.147,.268),l(-.414,.919),l(.021,.564),l(.132,.621),l(-.165,.452),l(-.375,.509),l(-.028,.678),l(-.047,.833),l(-.163,.509),l(-1.264,2.262),l(-.842,.792),l(-.122,.311),l(.102,.353),l(-.893,1.569),l(-.834,1.272),l(-.214,.947),l(-.351,.636),l(-.712,1.117),l(-.874,1.188),l(-1.159,1.498),l(-.384,.439),l(-2.274,2.504),l(-1.82,1.557),l(-2.164,1.121),l(-.593,.382),l(-1.28,1.09),l(-1.74,1.755),l(-.06,.061),l(-1.055,1.1),l(-1.235,1.569),l(-.615,.835),l(.1,.353),l(-.094,.276), +N(264.768,176.039),l(-.128,.225),l(-.115,.067),l(-.029,.135),l(.039,.25),l(-.058,.086),l(.125,.376),l(-.039,.424),l(-.453,.154),l(-.135,-.01),l(-.144,.039),l(-.482,-.039),l(-.192,.039),l(-.087,-.048),l(-.356,0),l(-.02,-.058),l(.039,-.067),l(.202,-.029),l(.222,-.135),l(.019,-.087),l(.106,.02),l(.154,.01),l(.135,-.145),l(-.096,-.279),l(.048,-.125),l(.029,-.183),l(-.067,-.125),l(-.097,-.135),l(-.279,-.048),l(.116,-.096),l(.164,-.019),l(.231,-.029),l(.115,-.087),l(.385,.02),l(.106,-.039),l(.299,-.067),l(.244,.006), +N(654.075,190.187),l(.206,-.125),l(.63,-.114),l(.656,-.938),l(.241,-.07),l(-.069,.268),l(.122,.087),l(.187,-.046),l(.11,.174),l(.148,.444),l(-.024,.111),l(-.013,.247),l(.197,.197),l(.025,.086),l(-1.234,.42),l(-.383,.271),l(-.309,-.271),l(-.111,-.259),l(-.234,.012),l(-.062,-.37),l(-.084,-.126), +N(493.044,204.258),l(-.602,.389),l(-.557,.171),l(-.385,-.112),l(-.086,.777),l(-.282,.367),l(-.67,.115),l(-.394,.382),l(-.088,.48),l(.006,.353),l(-.356,.622),l(-.964,1.358),l(.092,.536),l(-.337,.65),l(-.25,.255),l(-.334,.1),l(-.084,.152),l(-1.067,-.807),l(-2.427,-1.752),l(-.07,-.239),l(.116,-.552),l(-.137,-.381),l(-3.553,-1.984),l(-4.663,-2.568),l(-1.448,.033),l(1.144,-2.479),l(.105,-.229),l(.656,-.835),l(.985,-.938),l(.477,-.525),l(.43,-.695),l(.143,-.566),l(-.048,-.664),l(-.223,-.606),l(-.224,-.352),l(-.732,-1.069),l(-.174,-.465),l(-.027,-.861),l(-.126,-.226),l(-.477,-.463),l(-.3,-.493),l(.678,-.795),l(.291,-.327),l(.671,.052),l(.832,-.005),l(1.009,-.133),l(.464,-.017),l(.079,.028),l(.319,.069),l(1.054,.149),l(.749,.193),l(.604,.293),l(2.353,1.525),l(.335,.041),l(1.373,.133),l(.67,.193),l(.847,.094),l(.16,-.114),l(.71,-.753),l(.258,-.199),l(.675,-.343),l(.852,-.358),l(.271,.098),l(.46,.336),l(.461,.181),l(1.103,.106),l(-1.649,2.467),l(-.002,.508),l(-.004,1.215),l(-.016,.848),l(0,.438),l(.003,1.017),l(.042,2.045),l(.03,1.43),l(.027,.932),l(1.223,1.771), +N(466.196,203.275),l(.188,-.298),l(.076,-.27),l(-.057,-.748),l(.025,-.734),l(-.021,-.593),l(.107,-.507),l(.217,-1.02),l(.395,-.681),l(.255,-.284),l(1.241,-.996),l(1.195,-1.066),l(.191,-.453),l(-.111,-.31),l(-.271,-.182),l(-.479,-.04),l(-.191,-.027),l(-.128,-.253),l(.26,-1.88),l(.018,-.424),l(-.159,-.183),l(-.063,-.028),l(.496,-.229),l(.464,-.087),l(.495,.011),l(.942,.234),l(.911,-.048),l(.881,-.33),l(.88,-.132),l(.303,.097),l(.303,.196),l(.367,-.016),l(.626,-.314),l(.563,-.54),l(.3,.493),l(.477,.463),l(.126,.226),l(.027,.861),l(.174,.465),l(.732,1.069),l(.224,.352),l(.223,.606),l(.048,.664),l(-.143,.566),l(-.43,.695),l(-.477,.525),l(-.985,.938),l(-.656,.835),l(-.105,.229),l(-1.144,2.479),l(-4.659,0),l(-1.277,.05),l(-.319,.017),l(-.554,.398),l(-.458,.427),l(-.431,.045),l(-.546,-.223),l(-.064,-.042), +N(713.621,206.298),l(.169,7.966),l(-.44,.822),l(.431,1.368),l(.046,.805),l(-.031,3.438),l(-.515,-.512),l(-.927,-.888),l(-.716,-.902),l(-.406,-.056),l(-.776,.101),l(-.739,.143),l(-.434,-.013),l(.091,-.382),l(.435,-.65),l(.006,-.283),l(-.561,-.521),l(-.565,-.775),l(.028,-.226),l(.442,.111),l(.236,-.042),l(.135,-.113),l(-.467,-.409),l(-.595,-.408),l(-.287,-.381),l(-.275,-.648),l(-1.053,-1.693),l(-.508,-.394),l(-.467,-.282),l(-.604,-.196),l(-1.983,-.603),l(-1.26,-.379),l(-.613,-.069),l(-.705,-.238),l(-.63,-.323),l(.072,-.34),l(-.098,-.268),l(-.193,-.028),l(-.617,.101),l(-.389,-.07),l(-.412,-.196),l(-.408,-.395),l(-.209,-.579),l(.133,-.494),l(-.155,-.226),l(-.187,.113),l(-.234,.396),l(-.122,.664),l(-.251,.608),l(-.334,.269),l(-.696,.354),l(-.155,-.169),l(-.331,-.677),l(.022,-.155),l(.384,-.27),l(-.152,-.424),l(-.173,-.239),l(-.564,-.395),l(-.707,-.394),l(-.338,-.056),l(-.059,-.212),l(.038,-.226),l(.413,-.044),l(.388,.084),l(.603,.239),l(.158,-.029),l(.368,-.34),l(.525,-.41),l(.146,.056),l(.3,.269),l(1.021,-.045),l(.139,-.128),l(.09,-.522),l(-.063,-.409),l(-.238,.028),l(-.345,.199),l(-.604,.071),l(-.656,-.041),l(-.766,.044),l(-1.026,-.082),l(-.411,-.31),l(-.135,-.197),l(-.148,-.664),l(-.202,-.338),l(-.42,-.155),l(-1.249,-.124),l(.265,-.297),l(.058,-.255),l(.004,-.593),l(.463,-.029),l(.92,-.411),l(.49,-.383),l(.444,-.283),l(.352,.027),l(.4,.069),l(1.494,.646),l(.515,.169),l(.913,.153),l(.382,.705),l(.138,.396),l(-.283,.749),l(-.067,.381),l(.221,.381),l(.115,.494),l(.115,.48),l(.215,.521),l(.186,.197),l(.197,.127),l(.226,-.65),l(.085,.113),l(.087,.141),l(.309,1.073),l(.169,.169),l(.234,.183),l(.294,.112),l(.354,.056),l(.58,-.198),l(.504,-.439),l(1.192,-1.853),l(.352,-.015),l(1.078,-.215),l(.378,-.142),l(.045,-.085),l(.014,-.509),l(.219,-.17),l(1.1,-.609),l(.335,-.043),l(1.732,.759),l(2.129,.941),l(1.54,.52),l(1.299,.404),M(691.208,208.707),l(-.388,-.069),l(-.693,-.38),l(-.852,-.647),l(-.295,-.141),l(-.414,.028),l(-.059,.1),l(.024,.452),l(-.206,.028),l(-1.014,-.407),l(-.258,-.353),l(-.582,.199),l(-.289,.269),l(-.326,.185),l(-.186,-.184),l(-.312,-.451),l(-.245,-.451),l(.246,-.198),l(.303,-.029),l(.274,.056),l(1.104,.04),l(.574,.31),l(.319,-.015),l(.544,-.326),l(.414,-.015),l(.534,.126),l(.857,.21),l(.499,.395),l(.293,.395),l(.179,.621),l(-.049,.254),M(682.045,208.699),l(-.419,-.056),l(-.715,-.493),l(-.232,-.451),l(.146,-.283),l(.603,-.1),l(.766,-.044),l(.246,.126),l(.256,.311),l(.313,.197),l(.108,.226),l(-.067,.226),l(-.125,.057),l(-.879,.285),M(707.635,219.095),l(-1.11,-.209),l(.589,-1.032),l(.56,-.708),l(.407,-.269),l(.427,-.072),l(.527,.338),l(.198,.24),l(-.11,.184),l(-.324,.637),l(-.256,.17),l(-.638,.693),l(-.27,.028),M(673.797,218.703),l(-.562,.257),l(.034,.233),l(-.886,.326),l(-.582,.274),l(-.339,-.041),l(-.453,.325),l(-.504,-.069),l(-.427,-.112),l(-.378,.255),l(-.3,.058),l(-.358,-.07),l(-.58,-.196),l(-1.046,-.04),l(-.316,.043),l(-.211,-.564),l(.027,-.24),l(.383,-.198),l(.672,-.199),l(.528,-.016),l(1.142,.407),l(.445,.324),l(.338,.013),l(.326,-.297),l(.464,-.016),l(.429,-.071),l(.414,.187),l(.467,-.116),l(-.072,-.222),l(.421,-.187),l(.404,-.233),l(.094,-.151),l(-.076,-.117),l(-.184,.023),l(.116,-.198),l(.16,.012),l(.22,.094),l(.177,.221),l(.013,.304),M(662.661,219.065),l(-.312,-.099),l(-.203,-.127),l(-.062,-.169),l(.03,-.212),l(.256,-.198),l(.315,-.036),l(.17,.092),l(.053,.212),l(.182,.098),l(.305,-.145),l(.34,.105),l(.104,.151),l(-.012,.451),l(.183,-.148),l(.163,-.304),l(.318,-.029),l(.229,.226),l(.021,.424),l(.181,-.036),l(.062,.104),l(-.025,.397),l(-.316,-.211),l(-.311,-.058),l(-.141,.058),l(.072,.155),l(-.852,.157),l(-.143,-.091),l(.097,-.268),l(-.085,-.059),l(-.308,.269),l(-.229,.256),l(-.296,-.046),l(-.63,.225),l(-.624,.199),l(-.357,-.051),l(-.31,.123),l(-.392,-.07),l(-.103,-.07),l(-.202,-.123),l(-.063,-.279),l(.143,-.261),l(-.08,-.253),l(.193,-.115),l(.23,-.113),l(.233,-.156),l(.224,.07),l(.61,.013),l(.4,.104),l(.089,.28),l(.291,.109),l(.294,.056),l(.189,-.259),l(.29,-.012),l(.051,-.187),l(-.263,-.15),M(656.294,219.602),l(-.393,-.282),l(-.855,-.449),l(-.118,-.269),l(.417,-.001),l(.514,-.185),l(.462,-.029),l(.925,.521),l(-.338,.17),l(-.232,.1),l(-.381,.425),M(631.053,200.125),l(-.061,.225),l(-.413,.439),l(-.204,.41),l(-.381,.354),l(.164,.353),l(.162,.169),l(.806,.493),l(.832,.055),l(.241,.112),l(.151,.381),l(.128,.763),l(-.007,.409),l(.267,.423),l(.212,.127),l(.544,.041),l(-.45,.933),l(.151,.212),l(.703,-.453),l(.824,.252),l(.177,.042),l(.265,.254),l(.144,.438),l(.698,.676),l(-.515,1.979),l(-.04,.452),l(.23,.946),l(-.021,.438),l(.021,.664),l(-.002,.268),l(-.149,1.06),l(-.087,.156),l(-.107,.07),l(-.367,-.253),l(-.381,-.522),l(-.261,-.084),l(-.262,.481),l(-.081,.268),l(-1.043,-.619),l(-.219,.086),l(.394,.747),l(-.163,.213),l(-.204,-.197),l(-1.343,-1.424),l(-.775,-.761),l(-1.011,-.859),l(-1.348,-.958),l(-.391,-.451),l(-.199,-.493),l(-.191,-.339),l(-1.003,-.633),l(-.697,-.677),l(-1.186,-1.509),l(-.074,-.353),l(.039,-.339),l(-.324,-.875),l(-.841,-1.467),l(-.667,-1.044),l(-.612,-.775),l(-.369,-.301),l(-.287,-.234),l(-.64,-.295),l(-.254,-.748),l(-.688,-1.806),l(.067,-.24),l(-.107,-.311),l(-.157,-.197),l(-.662,-.507),l(-.711,-.394),l(-.539,-.21),l(-.317,-.099),l(-.119,-.353),l(-.077,-.734),l(-.18,-.409),l(-.386,-.479),l(-.818,-.831),l(-.368,-.423),l(-.725,.128),l(-.613,-.676),l(-.646,-.606),l(-.593,-.69),l(-.562,-.945),l(-.229,-.635),l(-.032,-.367),l(.057,-.198),l(.149,-.113),l(.401,-.043),l(.364,.098),l(.25,.126),l(.632,.563),l(.361,.155),l(.922,.153),l(.335,.027),l(.548,-.1),l(.454,-.142),l(.4,-.015),l(.323,.31),l(.919,1.156),l(.513,.31),l(.058,.155),l(-.12,.537),l(1.066,.916),l(.749,.493),l(1.175,.689),l(.678,.323),l(.139,.169),l(.03,.593),l(-.02,.155),l(.573,.055),l(.745,.944),l(.612,.55),l(.271,-.015),l(.004,-.198),l(-.123,-.226),l(.069,-.24),l(.507,.21),l(.479,.804),l(.441,.38),l(.446,.056),l(.429,.197),l(.314,.366),l(.28,.734),l(.316,.437),l(.431,.268),l(.511,.126),l(.767,.083),l(.431,.154),l(.494,.38),l(.576,.606),l(-.019,.071),M(684.201,200.125),l(-.007,-.172),l(-.414,-1.058),l(.18,-.551),l(-.078,-.141),l(-.141,-.296),l(.036,-.325),l(.286,-.89),l(.514,-.82),l(.263,.367),l(.152,.353),l(-.054,.283),l(-.246,.396),l(-.361,.763),l(.061,.325),l(.19,.141),l(.097,-.141),l(.436,-.411),l(.135,-.522),l(.179,-.142),l(.806,-.412),l(.141,.141),l(-.052,.254),l(.104,.55),l(-.354,.212),l(-.467,.354),l(-.162,.311),l(.159,.099),l(.446,.126),l(.398,.211),l(-.016,.141),l(.159,.353),l(-.688,-.154),l(-.431,-.154),l(-.367,-.042),l(-.304,.156),l(-.08,.438),l(.049,.258),l(.131,.688),l(.341,.62),l(.405,.438),l(.196,.282),l(-.156,.212),l(-.26,-.211),l(-.664,-.648),l(-.55,-.733),l(-.002,-.396),l(-.011,-.251),M(637.361,207.144),l(-.863,-.394),l(-.377,-.239),l(-.205,-.367),l(-.045,-.367),l(-.156,-.395),l(-.507,-.395),l(-.291,-.099),l(-.446,.029),l(-.116,-.141),l(.271,-.65),l(.234,-.24),l(.509,.55),l(.148,-.467),l(.313,-.269),l(.072,.395),l(.312,.89),l(.648,.817),l(.698,.31),l(-.265,.184),l(-.118,.283),l(.183,.564),M(634.321,215.345),l(-.091,-.187),l(.316,-.023),l(.402,.093),l(.369,-.129),l(.068,-.524),l(.018,-.14),l(.309,.057),l(-.043,-.5),l(.222,-.235),l(.093,-.277),l(.202,.121),l(.631,.112),l(.474,-.047),l(.237,.443),l(.524,-.089),l(.158,-.297),l(.022,-.244),l(.259,.116),l(.618,.168),l(.411,.438),l(.338,-.046),l(.204,.271),l(.446,-.029),l(.453,-.185),l(.302,.211),l(.369,.522),l(.179,.521),l(.884,.041),l(.462,.188),l(.49,-.077),l(1.435,.124),l(.479,-.029),l(.34,-.17),l(.213,-.65),l(.271,-.269),l(.447,-.015),l(.223,.211),l(.289,.494),l(.633,.125),l(.53,.027),l(.774,.083),l(.796,.153),l(.289,.24),l(.293,.288),l(-.08,.445),l(.275,.466),l(.119,.099),l(.877,.352),l(.422,.069),l(.658,.013),l(.45,-.185),l(.415,-.015),l(.628,.238),l(.048,.197),l(-.255,.425),l(-.152,.494),l(.578,.776),l(-.499,-.211),l(-.802,-.196),l(-.599,-.253),l(-.891,-.309),l(-.528,.001),l(-.589,.256),l(-.348,.057),l(-.714,-.098),l(-1.454,-.138),l(-1.47,-.138),l(-.805,-.253),l(-.839,-.479),l(-1.099,-.336),l(-1.125,-.267),l(-.948,-.04),l(-.556,.298),l(-.445,.043),l(-.957,-.153),l(-.805,-.492),l(-.357,-.07),l(-1.606,-.066),l(-.363,-.155),l(.055,-.141),l(.448,-.468),l(-.402,-.267),l(-.551,-.099),l(-.506,-.14),l(-.307,-.027),l(-1.261,-.121),M(675.004,223.092),l(.249,-.494),l(.023,-.537),l(.113,-.312),l(.674,-.481),l(1.447,-.624),l(.662,-.454),l(.36,-.607),l(.466,-.157),l(1.578,-.102),l(.91,-.214),l(.541,-.044),l(.869,-.143),l(.118,.07),l(.099,.197),l(-.237,.212),l(-.36,.256),l(-1.609,.61),l(-1.369,.44),l(-.713,.256),l(-.606,.354),l(-1.09,.963),l(-.653,.481),l(-.439,.086),l(-.552,.228),l(-.48,.015),M(667.866,223.149),l(-.217,-.069),l(-.917,-.605),l(-.8,-.45),l(-.347,-.099),l(-.493,-.126),l(-.292,-.197),l(.108,-.212),l(.371,-.142),l(.992,-.03),l(.502,-.114),l(.35,.296),l(1.147,.746),l(.265,.381),l(-.125,.325),l(-.246,.24),l(-.299,.057),M(661.819,191.241),l(-.041,.09),l(.319,.691),l(-.23,.142),l(-.546,.043),l(-.579,.086),l(.198,.226),l(.115,.296),l(-.169,.226),l(.216,.211),l(.235,.112),l(.546,.832),l(.536,.747),l(.043,.198),l(-.338,.721),l(.075,.226),l(.406,.465),l(.743,.45),l(.6,.493),l(.551,.761),l(-.465,.17),l(-.75,-.026),l(-.797,-.238),l(-.337,.1),l(-.387,.467),l(-.354,.918),l(-.08,.476),l(-.046,.272),l(.132,.649),l(.116,.424),l(-.133,.848),l(-.256,0),l(-.466,-.154),l(-1.037,.963),l(-.433,.65),l(-.751,.608),l(.443,.381),l(.06,.396),l(.17,.296),l(-.685,.058),l(.452,.578),l(.009,.212),l(-.103,.227),l(-.547,.665),l(-.206,.396),l(-.127,.354),l(-.529,.594),l(-1.294,.61),l(-.607,.284),l(-.292,.198),l(-.194,-.311),l(.024,-.424),l(-.33,-.804),l(-.306,-.381),l(-.265,-.184),l(-.286,.029),l(-.503,.523),l(-.302,.029),l(-.328,-.508),l(-.313,-.197),l(-.437,-.112),l(-.387,-.451),l(-.342,-.154),l(-.35,.806),l(-.135,.198),l(-.381,.058),l(-.356,-.112),l(-.442,.128),l(-.318,.354),l(-.364,.071),l(-.059,-.551),l(.034,-.311),l(-.314,-1.03),l(-.336,.396),l(-1.42,.44),l(-.321,-.408),l(-.639,.015),l(-.281,.156),l(-.303,.029),l(-.058,-.649),l(-.022,-.65),l(-.267,-1.411),l(-.012,-.48),l(-.352,-.747),l(-.406,-.409),l(-.79,-.422),l(-.146,-.141),l(.555,-.354),l(-.531,-.38),l(-.258,-.296),l(.188,-.735),l(-.074,-.128),l(-.278,-.478),l(-.352,-.296),l(.065,-.466),l(-.125,-.593),l(.182,-.65),l(.133,-.353),l(.424,-.58),l(.303,-.806),l(.318,.028),l(.204,.11),l(.288,.792),l(.253,.295),l(1,.983),l(.304,.083),l(.446,.28),l(.928,-.416),l(.255,-.001),l(.526,.223),l(.543,.11),l(.399,-.172),l(.528,-.342),l(.403,-.525),l(.531,-.441),l(.479,-.074),l(.431,.11),l(.557,.251),l(.524,.223),l(.559,.152),l(.287,-.03),l(.467,-.356),l(.465,-.172),l(.864,-.175),l(.387,-.299),l(.928,-1.785),l(-.076,-.748),l(.218,-.34),l(.646,-.244),l(.22,-.383),l(-.106,-.988),l(.119,-.565),l(.381,-.638),l(.247,-.157),l(.464,-.017),l(.748,.081),l(.651,.081),l(.624,-.018),l(.446,.04),l(.753,.292),l(.182,.09),M(666.561,200.125),l(.012,-.049),l(.48,-1.188),l(.434,-.41),l(.289,-.142),l(.429,.338),l(.29,-.311),l(.162,-.325),l(.293,-.481),l(.496,-.058),l(.605,.14),l(.729,.535),l(.447,.027),l(.863,-.044),l(.478,.168),l(.749,.267),l(.577,-.227),l(1.853,.081),l(.72,-.128),l(.627,-.354),l(.211,-.283),l(-.156,-.268),l(.196,-.283),l(.388,-.241),l(.295,-.41),l(.289,-.057),l(.075,.24),l(-.073,.537),l(-.117,.311),l(-.081,.127),l(-.082,.127),l(-.969,1.259),l(-.416,.396),l(-.464,.1),l(-1.23,.229),l(-.495,-.069),l(-.591,-.422),l(-1.149,-.068),l(-1.151,.059),l(-.878,-.041),l(-1.039,.045),l(-.575,-.083),l(-.671,.029),l(-.415,.1),l(-.433,.368),l(-.259,.461),l(-.154,.274),l(-.187,.721),l(.068,.48),l(.263,.494),l(.194,.183),l(.403,.226),l(.259,.196),l(.221,.607),l(.179,.154),l(.226,.042),l(.815,.026),l(.249,-.269),l(.652,-.976),l(.385,.056),l(.307,.183),l(.496,.041),l(.363,-.227),l(.669,-.156),l(.62,-.143),l(.268,-.298),l(.271,-.057),l(.466,.196),l(.131,.212),l(-.083,.734),l(-.469,-.267),l(-.544,-.042),l(-.361,.298),l(-.389,.523),l(-.438,.425),l(-1.059,.439),l(-.214,.325),l(-.143,.029),l(-.241,-.042),l(-.468,-.126),l(-.03,.056),l(.025,.312),l(.212,.126),l(.676,.578),l(.467,.521),l(.854,1.24),l(-.097,.325),l(-.156,.679),l(.102,.409),l(.447,.535),l(.555,.438),l(.062,.226),l(-.045,.282),l(-.436,-.056),l(-.652,.059),l(-.412,.297),l(-.224,.692),l(-.498,-.026),l(-.461,-.183),l(-.107,-.17),l(.052,-.649),l(.204,-.58),l(-.978,-.845),l(-.417,-.31),l(-.174,-.269),l(.036,-.24),l(.284,-.396),l(.116,-.579),l(-.165,-.494),l(-.737,-.055),l(-.503,.213),l(-.494,.396),l(.16,.353),l(.143,.932),l(-.068,.509),l(-.236,1.145),l(.363,.903),l(-.01,.311),l(-.377,.636),l(-.019,.227),l(.275,.564),l(-.726,.171),l(-.513,.241),l(-.476,.071),l(-.245,-.324),l(-.16,-.522),l(.156,-.325),l(.181,-.466),l(.069,-.876),l(.06,-1.073),l(-.125,-.509),l(.029,-.339),l(-.213,-.395),l(-.311,-.127),l(-.391,.171),l(-.574,.029),l(.011,-.41),l(-.25,-1.284),l(.131,-.311),l(.491,-.524),l(.469,-.777),l(.161,-.48),l(-.089,-.918),l(-.006,-.254),l(.087,-.452),l(.339,-.721),l(.447,-.058),l(-.043,-.861),l(.254,-1.053), +N(341.05,41.069),l(2.084,.272),l(.344,.361),l(-.869,.174),l(-.541,.139),l(-1.678,.106),l(-1.159,.037),l(-.689,.156),l(-.372,.224),l(-.308,.6),l(-.361,.376),l(1.05,.39),l(.971,.168),l(2.117,.064),l(.601,-.001),l(1.775,-.242),l(1.93,-.038),l(.866,.135),l(.933,.219),l(.417,.135),l(.284,-.018),l(1.001,-.002),l(1.277,.032),l(.615,.05),l(-1.277,.626),l(-1.583,.457),l(-1.976,.523),l(-.556,-.016),l(-.695,-.116),l(-.951,.671),l(-1.061,.503),l(-1.246,.452),l(-1.125,.296),l(-.211,.056),l(-2.212,.054),l(-.525,.134),l(-.502,.001),l(-.982,.201),l(-.665,.167),l(-.528,.051),l(-.946,-.413),l(-.375,.05),l(-.69,.913),l(-.958,.118),l(-.631,-.065),l(-.743,-.197),l(-.622,-.463),l(-.854,-.43),l(-.647,-.215),l(-.109,0),l(.008,.2),l(.707,1.043),l(-.192,.249),l(-.319,.017),l(-.69,.249),l(-.84,.249),l(-.573,.38),l(-1,.906),l(-.657,.657),l(-1.051,.851),l(-.776,.262),l(-1.034,.083),l(-1.023,-.275),l(-.148,.554),l(-.438,.569),l(-.783,.277),l(-.992,-.095),l(-.616,.05),l(-1.18,.439),l(.942,-1.723),l(-.121,.017),l(-.795,-.015),l(-1.055,-.177),l(.26,.423),l(-.026,.455),l(-.386,.407),l(-.794,.39),l(-1.16,.164),l(-.973,.002),l(-1.255,.083),l(.467,.403),l(.212,.403),l(-.09,.387),l(-.379,.097),l(-.321,-.063),l(-.47,.033),l(-1.792,-.157),l(.517,.32),l(.765,.462),l(.295,.351),l(-.01,.224),l(-.26,.176),l(-1.197,.034),l(-1.051,.129),l(.844,.413),l(.47,.126),l(.448,.222),l(.389,.333),l(-.554,.461),l(-.285,.111),l(-.599,-.094),l(-.478,.096),l(.345,.474),l(-.009,.127),L(308.501,60),l(-.486,-.125),l(-.583,-.062),l(.026,.158),l(.255,.457),l(-.101,.347),l(-.288,0),l(-.656,-.093),l(-.089,-.016),l(-.979,.112),l(-1.081,.018),l(.682,.487),l(1.108,.391),l(.331,.204),l(-.077,1.035),l(-.382,.938),l(-.427,.094),l(-.815,-.061),l(.489,.591),l(-.016,.498),l(.156,.233),l(-.068,.373),l(-.316,.062),l(-.495,-.03),l(-.771,.079),l(.762,.386),l(.427,.603),l(-.117,.447),l(-.287,.031),l(-.967,-.26),l(-1.052,-.508),l(-.498,.294),l(-.425,.602),l(-.635,-.599),l(.158,-.573),l(-.387,-.201),l(-1.124,-.184),l(-.577,-.309),l(.04,-.187),l(.253,-.249),l(.066,-.218),l(-.325,-.28),l(-.366,-.186),l(-.668,.359),l(-.276,.016),l(-.3,.141),l(-.444,-.046),l(-.98,.064),l(-.417,.017),l(-.571,.296),l(-.476,.28),l(-.426,-.403),l(-.104,-.357),l(-.222,-.217),l(-.513,-.233),l(-.817,-.232),l(-.772,-.389),l(-.517,-.781),l(.07,-.737),l(-.199,-.156),l(-.434,-.094),l(-.467,.048),l(-.97,-.266),l(-.108,-.094),l(-.138,-.236),l(.14,-.457),l(.459,-.395),l(.071,-.269),l(-.258,-.062),l(-.551,-.031),l(-.542,-.094),l(-.278,-.221),l(-.058,-.633),l(-.458,-.126),l(-.616,.049),l(-.589,-.57),l(.023,-.191),l(.198,-.254),l(.618,-.367),l(1.22,-.337),l(.405,-.304),l(.476,-.128),l(.051,-.383),l(-.277,-.287),l(-.473,.097),l(-.921,.082),l(-.493,.097),l(-.635,.416),l(-.538,.129),l(-.63,.304),l(-.339,-.318),l(.038,-.623),l(-.114,-.784),l(-.206,-.451),l(.015,-.355),l(-.243,-.323),l(-.504,.082),l(-.271,-.032),l(-.666,-.355),l(-.594,-.485),l(-.013,-.357),l(.842,-.538),l(.265,.019),l(-.556,-.189),l(-1.083,.064),l(-.103,-.284),l(.383,-.176),l(.677,-.03),l(.586,-.052),l(.456,-.087),l(.322,-.672),l(-1.208,-.047),l(-.572,.05),l(-.362,-.032),l(-.29,-.163),l(-.116,-.197),l(.223,-.28),l(.218,-.008),l(.18,-.16),l(.427,-.055),l(-.375,-.188),l(-.552,.073),l(-.22,-.248),l(.057,-.188),l(.073,-.132),l(.259,0),l(.309,-.099),l(.827,-.25),l(1.218,.081),l(.854,.163),l(.776,.032),l(.378,.131),l(.927,.146),l(1.027,.097),l(-.031,-.363),l(.299,-.545),l(-.298,-.182),l(-1.02,-.263),l(-1.356,-.312),l(-.903,-.164),l(-1.592,-.33),l(-.354,-.116),l(.336,-.35),l(.788,-.001),l(1.462,.363),l(1.034,.048),l(.463,-.067),l(.114,-.067),l(.088,-.6),l(.088,-.301),l(.595,-.034),l(.528,.116),l(.227,-.101),l(-.027,-.351),l(-.195,-.184),l(-.891,-.317),l(.162,-.437),l(.528,-.455),l(-.258,-.286),l(-1.21,-.167),l(-1.154,.002),l(-1.178,-.286),l(-1.649,-.49),l(-.78,-.101),l(-.903,-.05),l(-.76,-.34),l(-.811,-.477),l(.156,-.035),l(.323,-.155),l(.605,-.001),l(.572,-.019),l(2.085,.305),l(.716,.033),l(1.249,.306),l(1.451,.458),l(.729,.169),l(.056,-.307),l(-.311,-.426),l(-.86,-.546),l(-.172,-.446),l(-.603,-.446),l(-.485,-.051),l(-.677,-.24),l(.361,-.277),l(.542,-.139),L(285.644,41),l(-.704,-.241),l(-1.101,-.015),l(-.625,-.086),l(-1.132,-.327),l(-.88,.608),l(-.324,.156),l(-.274,.294),l(-.875,.243),l(-1.402,-.066),l(-1.031,-.343),l(-.306,-.242),l(-.027,-.294),l(.438,-.313),l(.293,-.645),l(-.152,-1.259),l(.582,-.054),l(.691,.192),l(.372,-.124),l(.151,-.334),l(-.383,-.369),l(-.933,-.545),l(-.452,-.141),l(-.946,-.796),l(-.895,-.925),l(-1.105,-1.289),l(-.578,-.485),l(-1.855,-.379),l(-.667,-.255),l(-.291,-.202),l(-.052,-.701),l(-.904,-.406),l(-.962,-.109),l(-1.589,-.165),l(-1.928,-.425),l(-1.903,-.333),l(-2.133,-.183),l(-.997,-.054),l(-1.632,-.035),l(-.785,.189),l(-1.043,.096),l(-.806,.188),l(-1.419,.152),l(-1.228,-.166),l(-1.46,-.296),l(.319,.747),l(-.051,.093),l(-1.051,-.017),l(-1.294,-.184),l(-3.168,-.611),l(1.538,-.566),l(.463,-.114),l(-.092,-.226),l(-.423,-.169),l(-1.067,-.017),l(-2.21,-.015),l(-.812,-.074),l(-.629,-.018),l(-1.238,-.434),l(-.87,-.208),l(.587,-.306),l(1.257,-.041),l(3.036,.147),l(2.025,.034),l(1.343,.017),l(2.117,-.157),l(1.055,-.212),l(.292,-.096),l(.054,-.345),l(-.627,-.287),l(-.82,-.21),l(-1.217,.156),l(-1.11,.252),l(-1.31,.021),l(-1.138,-.113),l(-.753,.078),l(-.879,.098),l(-.68,-.056),l(-.857,-.19),l(-.664,-.365),l(-.816,-.191),l(-.662,-.057),l(-.726,.059),l(-.486,-.076),l(-1.416,-.481),l(-.044,-.35),l(.36,-.45),l(.81,-.119),l(1.235,-.1),l(1.517,-.14),l(2.074,-.161),l(1.29,-.081),l(.951,-.396),l(1.089,-.259),l(.843,-.081),l(2.478,-.005),l(1.101,-.101),l(1.942,.036),l(.402,-.139),l(.31,-.199),l(.609,-.16),l(.202,-.658),l(.276,-.501),l(.116,-.101),l(-.89,-.228),l(-1.947,-.039),l(-1.155,.194),l(-.959,-.125),l(-1.243,-.383),l(.595,-.781),l(1.38,-.332),l(2.845,-.359),l(1.407,-.225),l(1.962,-.249),l(2.112,-.162),l(1.163,.087),l(1.213,-.07),l(1.319,-.07),l(.345,-.181),l(.011,-.226),l(-.357,-.753),l(-.022,-.208),l(.522,-.14),l(1.886,-.05),l(1.526,.205),l(2.141,.41),l(1.296,.226),l(.802,.181),l(.823,-.275),l(-1.657,-.525),l(-.697,-.509),l(.167,-.047),l(2.2,-.122),l(1.166,-.12),l(1.854,-.216),l(2.52,-.195),l(.73,.069),l(1.064,.116),l(.232,1.738),l(.913,-.162),l(.539,-.322),l(.432,-1),l(1.003,.021),l(2.004,.323),l(1.858,.414),l(1.529,.25),l(.205,-.3),l(-.644,-.3),l(-.816,-.537),l(-.894,-.4),l(.295,-.287),l(.742,.022),l(1.758,.02),l(1.136,.212),l(2.754,.373),l(1.284,.279),l(2.109,.322),l(1.878,.274),l(1.872,.204),l(.8,-.209),l(.816,-1.483),l(-.326,-.191),l(-1.292,-.334),l(-1.176,-.533),l(.708,-.247),l(2.404,-.005),l(2.962,-.328),l(1.329,-.077),l(1.527,.17),l(2.221,.488),l(1.567,.167),l(2.005,.142),l(.3,-.761),l(-.3,-.472),l(2.646,-.206),l(2.021,-.08),l(2.589,.095),l(1.989,.146),l(1.886,-.18),l(2.367,-.207),l(2.043,-.005),l(1.859,.223),l(1.825,-.055),l(1.315,.072),l(.619,.099),l(.55,-.102),l(1.946,.146),l(1.707,.046),l(1.673,.096),l(2.438,.761),l(1.368,.241),l(1.345,-.076),l(1.118,.168),l(2.594,.237),l(.445,.408),l(-.304,.12),l(-.492,.192),l(-1.683,.146),l(-2.303,.124),l(-1.152,.121),l(-1.233,.05),l(-1.469,-.068),l(-2.831,-.064),l(-2.22,-.066),l(-1.389,.168),l(-1.614,.027),l(-1.933,.027),l(-1.16,.026),l(-1.485,.168),l(-.444,.118),l(-1.322,.213),l(-.335,.464),l(.743,.251),l(2.551,-.281),l(1.367,-.072),l(3.912,.038),l(2.223,-.12),l(2.331,-.005),l(.997,-.025),l(.93,.067),l(1.77,.434),l(.671,.09),l(1.087,-.186),l(1.663,-.21),l(1.536,-.281),l(1.964,-.144),l(.59,.462),l(-.566,.482),l(-2.316,.639),l(-.973,.338),l(-1.281,.734),l(.12,.307),l(.319,.152),l(.796,-.089),l(.477,-.044),l(1.616,-.553),l(1.766,-.537),l(1.413,-.385),l(1.706,-.32),l(.775,-.207),l(1.662,-.163),l(1.618,.111),l(1.391,.065),l(1.497,-.3),l(.703,-.324),l(1.129,-.234),l(2.148,-.004),l(1.672,.112),l(1.097,.044),l(1.197,.136),l(1.135,.228),l(1.107,.112),l(.316,.25),l(-.181,.273),l(-1.97,.252),l(-1.491,.138),l(-1.245,.494),l(-.557,.289),l(-1.604,.355),l(-1.57,.548),l(-1.063,.089),l(-.918,-.042),l(-1.592,.047),l(-2.213,-.039),l(-1.491,.198),l(-.731,.217),l(-.495,.535),l(.166,.322),l(1.949,-.305),l(1.581,-.046),l(1.856,.101),l(.003,.42),l(-.743,.241),l(-2.388,.124),l(-.463,.14),l(-.213,.199),l(-.156,.595),l(-.471,.71),l(-.678,.158),l(-1.06,-.077),l(-.742,.041),l(-.837,.9),l(-.987,1.087),l(-.15,.347),l(.454,.307),l(.403,.095),l(.602,-.481),l(.743,-.368),l(.856,-.041),l(2.345,.266),l(.353,.096),l(.262,.288),l(-.059,.211),l(-1.234,-.074),l(-.673,-.018),l(-.512,.097),l(-.136,.191),l(.29,.286),l(1.756,.188),l(.557,.132),l(1.802,-.137),l(.526,.208),l(.214,.323),l(-.049,.436),l(-.256,.133),l(-1.835,-.186),l(-1.653,-.054),l(-.781,-.074),l(-1.295,.078),l(-1.382,.475),l(-.823,-.13),l(-.49,-.15),l(-1.06,.04),l(-.283,.377),l(1.393,.599),l(1.187,.222),l(1.298,.128),l(1.665,.072),l(.696,.148),l(.551,.482),l(.272,.444),l(.014,.554),l(-.434,.405),l(-.384,.074),l(-1.292,-.181),l(-.82,-.109),l(-.372,.111),l(.023,.55),l(.118,.236),l(.426,.162),l(.618,.089),l(.723,.215),l(.914,.142),l(.752,.16),l(.383,.376),l(-.338,.233),l(-.832,.145),l(-.647,.126),l(-1.747,-.032),l(-1.176,-.087),l(-1.624,-.086),l(-.592,.448),l(.551,.195),l(1.396,.051),l(1.052,.158),l(.724,.248),l(.088,.319),l(-.035,.549),l(-.13,-.005),l(-1.092,-.045),l(-1.247,.108),l(-.596,.266),l(-1.246,.02),l(-1.225,-.139),l(-1.497,-.404),l(-.922,-.478),l(-.373,-.07),l(-1.094,.286),L(345,36.811),l(-1.084,.09),l(-.589,.178),l(-1.451,-.033),l(-.913,-.087),l(-.969,.143),l(-.395,.125),l(-.174,.283),l(.006,.141),l(.354,.527),l(.71,.245),l(1.284,.05),l(1.515,.26),l(1.567,-.056),l(1.323,.54),l(.758,.226),l(.482,.226),l(1.196,.329),l(1.252,.38),l(.376,.276),l(.483,.898),l(.892,-.208),l(.278,-.139),l(.397,.207),l(.298,.43),l(.071,.344),l(.198,1.164),l(-.169,.205),l(-.371,.12),l(-.541,-.101),l(-.546,-.119),l(-.917,.002),l(-1.041,.036),l(-1.488,-.27),l(-.637,-.409),l(-.415,-.634),l(-.354,-.274),l(-1.17,-.566),l(-.84,-.292),l(-.748,-.137),l(-1.095,-.084),l(-.521,.14),l(-.962,.105),M(351.365,40.026),l(-1.527,-.537),l(-.96,-.225),l(-.712,-.156),l(-.159,-.069),l(-.314,-.419),l(1.483,-.038),l(.893,.139),l(1.064,.26),l(.819,.296),l(.162,.488),l(-.215,.209),l(-.533,.053),M(281.574,46.135),l(-.568,-.133),l(-.707,-.318),l(-.801,-.183),l(-.197,-.101),l(-.25,-.218),l(-.08,-.844),l(.287,-.34),l(.368,-.018),l(.646,.135),l(1.157,.066),l(1.287,.27),l(.748,.269),l(.595,.1),l(.777,.217),l(.603,.335),l(-.144,.202),l(-.112,.034),l(-.543,.051),l(-.774,.035),l(-.77,.186),l(-1.009,.153),l(-.511,.102), +N(105.98,81.688),l(-.952,-.826),l(-.198,-.342),l(-.024,-.476),l(.095,-.104),l(.408,.044),l(.312,-.045),l(.781,.177),l(.658,-.076),l(.28,.119),l(.138,.163),l(-.234,.224),l(-.173,.565),l(-.028,.312),l(-.581,.075),l(-.483,.19),M(125.24,92.375),l(-1.312,-.288),l(-1.345,-.434),l(-.218,-.174),l(.061,-.189),l(.376,-.466),l(-1.023,.002),l(-.413,.248),l(-.299,-.072),l(-.416,-.188),l(.166,-.452),l(-.487,-.334),l(-.269,-.014),l(-.735,-.086),l(-.226,-.262),l(.317,-.292),l(-.976,-.524),l(-.556,.118),l(-.386,-.102),l(-.852,-.511),l(-1.277,-.863),l(-.219,-.235),l(.02,-.117),l(.962,-.12),l(.337,.043),l(1.979,.598),l(.981,.204),l(1.772,.202),l(.385,.263),l(.618,.526),l(.426,.642),l(.433,.422),l(.362,.189),l(1.587,.536),l(.316,.203),l(.48,.756),l(.116,.407),l(-.279,.349),l(-.407,.016),M(271.379,92.089),l(-1.202,-.23),l(.641,-.743),l(.358,-.161),l(.279,.058),l(.292,0),l(.355,-.263),l(-.697,-.653),l(.079,-.219),L(272,89.003),l(1.121,-1.35),l(1.454,-1.31),l(.725,-.442),l(.496,-.192),l(1.315,-.194),l(.198,.073),l(.11,.221),l(-.299,.221),l(-.582,.03),l(-.242,.133),l(.349,.44),l(-.755,.78),l(-1.226,1.438),l(-.271,.526),l(.113,.291),l(.11,0),l(.428,-.176),l(.483,-.555),l(.458,-.191),l(1.115,.305),l(-.896,.687),l(.261,.203),l(.229,.072),l(1.423,.565),l(.758,-.03),l(.325,-.408),l(.309,-.059),l(.718,.057),l(.826,.202),l(.616,.231),l(-.297,.292),l(-.373,.233),l(-.708,.467),l(.339,.333),l(.477,.362),l(.26,.014),l(.417,-.161),l(.464,-.132),l(.278,.116),l(.02,.16),l(-.254,.262),l(-.404,.248),l(-.892,.104),L(280.84,93),l(.273,.362),l(.124,.405),l(.28,.231),l(.183,-.203),l(.309,-.262),l(.527,.159),l(-.099,.449),l(.149,.275),l(.716,.028),l(.085,-.015),l(.015,.203),l(-.168,.304),l(-.25,.652),l(-.34,.651),l(-.222,-.072),l(-.71,-.128),l(-.301,-.144),l(-.042,-.651),l(-.601,.406),l(-.374,.015),l(-.095,-.274),l(.497,-.652),l(.011,-.333),l(-.421,-.478),l(-.279,-.072),l(-.388,.392),l(-.423,.291),l(-.365,.146),l(-.435,.204),l(-.552,.536),l(-.496,.334),l(-.881,-.042),l(-.222,-.217),l(.165,-.145),l(1.229,-.408),l(.466,-.522),l(.632,-.363),l(-.699,-.129),l(-.601,-.057),l(-.322,.464),l(-.412,.015),l(-.13,-.159),l(.04,-.493),l(-.757,.016),l(-.148,.29),l(-.41,.218),l(-1.052,.045),l(-.709,-.057),l(-1.139,-.186),l(-1.012,-.085),l(-1.355,.061),l(-1.014,.147),l(-.145,-.188),l(-.215,-.463),l(.187,-.175),l(.561,-.334),l(.734,-.408),l(.502,-.161),l(.636,-.335),M(265.435,98.655),l(-.469,-.057),l(-.497,-.273),l(-.356,-.562),l(.062,-.635),l(.742,-.738),l(.932,-1.043),l(.816,.432),l(-.375,.435),l(-.112,.462),l(-.233,.333),l(-.262,.116),l(-.58,.319),l(-.244,.448),l(.522,.244),l(.168,-.029),l(.279,-.26),l(.42,-.362),l(.617,-.319),l(.309,.057),l(.495,.461),l(-.177,.347),l(-.246,.159),l(-1.134,.42),l(-.682,.044),M(211.34,59.677),l(-.68,-.046),l(.068,-.872),l(-.375,-.333),l(-.958,.161),l(-2.375,.29),l(.107,-.461),l(.56,-.303),l(1.644,-.561),l(-.302,-.478),l(-.102,-.415),l(.106,-.417),l(.398,-.835),l(.434,-.566),l(.254,-.648),l(.331,-.471),l(1.11,.566),l(-.312,.518),l(.791,.386),l(.527,.047),l(.402,-.469),l(.67,.112),l(.806,.289),l(.917,.514),l(.582,.255),l(2.168,.492),l(.442,.271),l(.176,.255),l(-.09,.925),l(.539,.047),l(.57,-.065),l(.934,.046),l(.701,.142),l(1.019,.427),l(-.419,.096),l(-.269,.127),l(-.46,.271),l(-.949,-.046),l(-.623,-.125),l(-1.328,-.125),l(-.438,-.126),L(217.259,58),l(-.528,-.301),l(-1.017,-.237),l(-.528,.017),l(-.203,.271),l(.174,.588),l(-.126,.096),l(-1.314,.161),l(-.673,.493),l(-.588,.302),l(-1.116,.287),M(200.125,19.1),l(-.862,-.015),l(-1.085,-.195),l(-.308,-.664),l(.819,-.304),l(.77,-.072),l(.666,-.024),l(3.475,-.125),l(1.263,-.12),l(1.374,-.026),l(1.714,.324),l(.397,-.094),l(.397,-.377),l(1.303,-.287),l(1.759,-.099),l(1.975,.209),l(.746,-.001),l(2.562,.137),l(2.621,.324),l(1.424,.09),l(1.461,.161),l(.448,-.165),l(-1.433,-.42),l(-1.67,-.352),l(-.816,-.429),l(.293,-.242),l(1.361,-.148),l(1.101,-.246),l(1.431,-.101),l(2.382,-.201),l(1.666,.119),l(1.944,.191),l(1.009,.265),l(1.19,.456),l(.354,.047),l(.273,-.362),l(-.959,-.508),l(-.828,-.292),l(.499,-.248),l(1.45,.121),l(1.832,.168),l(1.653,.07),l(1.639,.46),l(.378,.023),l(.062,-.195),l(-.301,-.539),l(1.781,-.004),l(1.408,.046),l(.832,.269),l(.831,.34),l(.618,-.001),l(-.044,-.268),l(-.331,-.467),l(1.075,-.077),l(3.691,.386),l(2.726,.288),l(1.937,-.077),l(2.987,.018),l(.967,.047),l(.757,.12),l(.126,0),l(1.419,.094),l(1.089,.191),l(.744,.095),l(1.685,.044),l(1.357,.357),l(-.385,.358),l(-1.237,.121),l(-1.206,.356),l(-1.849,.191),l(-.978,-.045),l(-2.191,-.159),l(-2.284,.005),l(-.776,.142),l(-1.915,.168),l(-.597,.465),l(.75,.366),l(.761,.044),l(1.03,-.048),l(1.705,-.279),l(.79,.021),l(.808,.434),l(-.168,.114),l(-1.246,.139),l(-1.38,.207),l(-1.174,.295),l(-2.098,.518),l(-1.316,.224),l(-1.19,.355),l(-.924,.286),l(-2.252,.005),l(.65,.906),l(-.449,.193),l(-2.297,.455),l(-.768,-.019),l(-1.587,-.037),l(-1.462,-.218),l(-2.386,-.164),l(-.66,.33),l(2.591,.695),l(-.662,.141),l(-.967,-.038),l(-1.297,.022),l(-1.068,.022),l(-2.58,-.214),l(-2.009,.063),l(-.134,.66),l(1.257,-.105),l(1.065,.018),l(2.312,.292),l(.557,.157),l(.12,.67),l(-.33,.197),l(-1.031,.12),l(-.515,.705),l(-1.073,.021),l(-.448,-.058),l(-.402,.176),l(.297,.253),l(.759,.25),l(-.328,.136),l(-1.615,.08),l(-.867,-.037),l(-1.71,-.171),l(-.422,.078),l(.41,.791),l(-.08,.231),l(-.649,.289),l(-.767,.155),l(-1.52,-.112),l(-2.039,-.111),l(-1.43,-.227),l(-1.008,.079),l(-1.219,.5),l(1.031,.112),l(.368,.057),l(2.154,.11),l(1.759,.13),l(1.534,.168),l(2.001,.034),l(.66,.34),l(.045,.359),l(-.907,.398),l(-2.685,.268),l(-.927,.115),l(-1.054,.227),l(-1.115,.077),l(-.467,-.28),l(-.797,-.638),l(-.56,.039),l(-.631,.001),l(-1.453,-.318),l(-.001,.17),l(.331,.508),l(-1.477,-.016),l(-1.5,-.129),l(-.875,-.319),l(-1.033,-.471),l(-.388,.058),l(.527,.717),l(-.24,.17),l(-.821,.133),l(-1.72,-.109),l(-2.276,-.033),l(-.972,-.073),l(-1.382,-.394),l(-.642,-.131),l(-.282,.453),l(-.619,.152),l(-1.843,-.316),l(.161,-.586),l(.219,-.228),l(1.525,-.117),l(.61,-.249),l(.961,-.173),l(1.179,.036),l(.499,-.172),l(-1.073,-.4),l(-1.043,-.651),l(.052,-.154),l(.479,-.117),l(1.316,.036),l(1.743,.093),l(.888,.21),l(1.108,.517),l(1.35,.323),l(1.085,.093),l(1.667,-.022),l(.829,-.136),l(.086,-.268),l(.514,-.304),l(-3.019,.001),l(-1.025,-.171),l(-.156,-.85),l(.211,-.154),l(-1.74,-.153),l(-1.963,-.152),l(-.274,0),l(-.631,.114),l(.204,-.758),l(1.159,-.551),l(1.104,-.16),l(1.837,-.003),l(1.164,.037),l(1.37,.076),l(2.023,.311),l(1.342,.115),l(.486,-.158),l(1.132,-.041),l(-3.399,-.802),l(-1.742,-.313),l(-3.555,-1.27),l(-.406,.242),l(-1.398,-.878),l(.025,-.258),l(.313,-.108),l(1.747,.104),l(1.905,-.004),l(2.019,.06),l(1.6,.382),l(2.535,.784),l(1.448,-.043),l(.833,.095),l(-1.387,-.555),l(-2.015,-.317),l(1.208,-.743),l(1.456,-.329),l(1.731,-.025),l(1.529,-.222),l(2.042,-.07),l(1.157,-.112),l(1.414,-.051),l(-1.778,-.479),l(-1.425,-.153),l(-2.501,.027),l(-1.243,.248),l(-1.305,.158),l(-1.425,.202),l(-1.447,.047),l(-.586,.067),l(-1.532,-.438),l(-.214,.111),l(-.543,.156),l(-2.16,-.018),l(-1.58,.365),l(.311,-.828),l(.98,-.292),l(.007,-.202),l(-.606,-.247),l(-1.375,-.156),l(-1.39,.003),l(-4.189,.505),l(-2.031,.672),l(-.408,-.11),l(-.569,-.251),l(.395,-.133),l(.678,-.023),l(-.117,-.316),l(-.698,-.398),l(-1.216,-.056),l(-.216,-.003),M(200.125,20.844),l(.899,-.096),l(.832,.196),l(.339,.5),l(.511,.495),l(.427,.063),l(1.141,.041),l(-.081,-.236),l(.056,-.411),l(.438,-.109),l(.718,.194),l(.718,.322),l(.374,.3),l(-.066,.171),l(.056,.826),l(.764,.442),l(.953,-.017),l(1.276,-.074),l(1.646,.504),l(-1.123,-.264),l(-1.528,.34),l(-1.599,.221),l(-.83,.377),l(-.287,.197),l(-.265,.315),l(-.448,.021),l(-1.493,-.41),l(-.656,.335),l(.465,.43),l(-.029,.235),l(-.412,.196),l(-.392,.04),l(-1.086,-.31),l(-.944,-.311),l(-.26,.645),l(-.117,.068),l(-.083,.049),l(-.888,.041),l(-1.74,-.094),l(-1.458,-.153),l(-.888,-.154),l(-.494,.021),l(-3.115,-1.31),l(-.191,-.276),l(1.971,-.241),l(3.32,.093),l(.889,.097),l(1.573,.1),l(-2.485,-.693),l(-3.019,-.213),l(-1.103,.122),l(-1.43,-.017),l(-.597,.18),l(-1.008,.022),l(-.606,-.198),l(-1.066,-.517),l(-1.425,-.479),l(-.341,-.355),l(1.971,.124),l(2.278,-.175),l(-1.255,-.249),l(-.756,-.351),l(.38,-.305),l(.729,-.132),l(.769,-.023),l(.921,.042),l(.156,-.219),l(-1.799,-.793),l(1.053,-.114),l(1.213,-.182),l(1.13,.087),l(.584,-.046),l(.145,-.18),l(-.514,-.475),l(1.362,.134),l(.941,.066),l(.83,.202),l(1.589,.869),l(.653,.264),l(.772,.24),l(.674,-.001),l(.36,-.039),M(179.067,27.216),l(-1.156,-.056),l(-.604,-.173),l(-.926,-.638),l(-.621,-.193),l(-3.102,-.091),l(-1.487,.081),l(-.622,.001),l(-1.444,-.056),l(-.767,-.154),l(-1.019,-.37),l(-.161,-.234),l(.335,-.138),l(.802,-.001),l(1.687,.232),l(.867,-.021),l(-.031,-.235),l(-.252,-.275),l(-1.344,-.49),l(-.579,-.098),l(-1.075,-.077),l(-1.392,-.196),l(.065,-.397),l(2.246,-.124),l(2.392,.155),l(.77,.376),l(.999,.453),l(1.979,.193),l(2.189,.114),l(1.178,.233),l(.604,.254),l(1.123,.721),l(.581,.446),l(.168,.426),l(-.481,.194),l(-.919,.137),M(185.907,26.758),l(-1.078,-.037),L(184,26.529),l(-1.029,-.484),l(-1.144,-.76),l(-.03,-.216),l(.239,-.099),l(2.296,-.044),l(1.816,.311),l(3.101,.542),l(-.047,.351),l(-.254,.331),l(-.436,.04),l(-1.563,.177),l(-1.043,.08),M(156.886,26.865),l(-1.573,.646),l(-.558,.27),l(-1.85,.042),l(-1.019,.079),l(-1.898,-.15),l(-.577,-.114),l(-.302,-.423),l(.334,-.291),l(1.365,-.177),l(.899,.056),l(2.351,-.102),l(.496,0),l(2.331,.163),M(132.902,31.305),l(-.53,-.186),l(-.95,-.466),l(-.424,-.112),l(-.33,.057),l(-.56,.207),l(-1.269,.059),l(-.786,-.279),l(-.283,-.319),l(.23,-.264),l(1.13,-.097),l(.503,-.133),l(.771,-.134),l(.977,-.399),l(.848,-.211),l(.726,-.172),l(.548,-.344),l(1.083,-.231),l(1.277,-.079),l(2.532,-.158),l(1.68,.016),l(.888,-.29),l(1.038,-.079),l(1.503,.438),l(-.756,.097),l(-.852,.231),l(-.22,.268),l(.12,.266),l(.469,.474),l(-.777,.001),l(-.912,.115),l(-.918,.662),l(-1,-.017),l(-.867,-.981),l(-.694,-.15),l(-.379,.02),l(-.229,.285),l(-.588,.342),l(-.63,.623),l(-.595,.151),l(-.284,.375),l(-.705,.356),l(-.787,.058),M(191.827,30.313),l(-1.266,-.054),l(-2.278,-.165),l(-.426,.058),l(-.332,-.094),l(-.896,-.489),l(-1.185,-.414),l(.192,-.229),l(2.433,-.042),l(1.542,.263),l(1.472,.054),l(.171,0),l(.89,.358),l(-.179,.246),l(.123,.32),l(-.263,.188),M(144.688,31.739),l(-2.222,-.395),l(-.325,-.674),l(.503,-.057),l(.595,-.17),l(.945,-.096),l(.953,-.133),l(1.279,-.059),l(.522,.187),l(.65,.374),l(.659,.186),l(1.55,-.209),l(.617,.149),l(1.624,.762),l(1.016,.351),l(.897,.036),l(.96,-.058),l(1.418,.09),l(.591,-.02),l(1.116,-.169),l(.092,-.297),l(-.557,-.559),l(-.941,-.391),l(-1.347,-.354),l(.96,-.322),l(.524,-.379),l(.569,-.152),l(1.097,-.116),l(.507,.17),l(.773,.678),l(-.017,.413),l(.518,.654),l(.565,.111),l(.9,.036),l(1.805,.406),l(-.334,-.465),l(.151,-.28),l(.409,-.076),l(1.495,.24),l(.932,.39),l(-.292,.409),l(.039,.5),l(-.358,.461),l(-.573,.277),l(-.755,.111),l(-.782,.001),l(-1.682,.095),l(-1.156,-.071),l(-1.757,-.18),l(-.622,-.017),l(-1.129,.277),l(-1.132,.202),l(-.76,.182),l(-.977,.254),l(-1.625,.292),l(-1.338,.2),L(149.23,34.5),l(-.748,-.07),l(-1.445,-.286),l(-.276,-.378),l(.648,-.128),l(1.219,-.038),l(.738,-.146),l(.852,-.075),l(1.166,-.057),l(.622,.017),l(1.09,-.149),l(.483,-.553),l(-2.768,-.087),l(-.925,-.054),l(-1.564,.28),l(-1.625,.168),l(-1.292,.04),l(-.795,.093),l(-1.681,-.347),l(-.479,.167),l(-.92,.075),l(-.979,-.127),l(-.854,-.33),l(.023,-.111),l(.863,-.427),l(1.098,-.058),l(2.047,-.022),l(.96,-.159),M(178.479,33.234),l(-.984,-.219),l(-.193,-.294),l(.764,-.389),l(.433,-.112),l(.088,-.167),l(-.447,-.333),l(-1.161,-.054),l(-2.13,.227),l(-.939,.076),l(-.331,.019),l(-.854,-.276),l(.039,-.335),l(.739,-.02),l(.542,-.244),l(.587,-.057),l(-.466,-.598),l(.176,-.245),l(.132,-.226),l(.49,.018),l(.859,.224),l(1.942,.746),l(.426,.186),l(.46,-.094),l(-.101,-.243),l(-.959,-.486),l(-.371,-.131),l(-.407,-.357),l(.436,-.095),l(.956,-.059),l(.713,.131),l(1.033,.262),l(.572,.168),l(.27,.018),l(.162,-.452),l(.478,-.133),l(.73,.112),l(.717,.168),l(.327,.168),l(.367,.75),l(-.034,.616),l(-.247,.242),l(-.831,.335),l(-.017,.352),l(.35,.625),l(-.361,.147),l(-1.648,-.089),l(-.862,.112),l(-1.446,.003),M(200.125,30.572),l(-.895,.045),l(-.853,.17),l(-.37,.467),l(1.133,.054),l(.984,-.038),l(.046,-.001),l(.847,.11),l(.463,.129),l(.498,.463),l(.727,.424),l(.621,.091),l(.213,-.074),l(.043,-.314),l(.286,-.056),l(1.075,-.002),l(.883,-.187),l(.766,.11),l(.835,.239),l(.665,.257),l(.976,.053),l(.775,-.463),l(1.393,-.281),l(1.704,-.114),l(1.951,-.246),l(1.533,.053),l(2.59,.014),l(.381,.037),l(.79,.314),l(.911,.239),l(1.418,.146),l(.653,.128),l(.21,.037),l(.361,.166),l(.181,.257),l(-.4,.148),l(-1.833,.407),l(-.135,.255),l(.469,.666),l(-2.486,.076),l(-.592,.02),l(-.651,.091),l(-.768,-.053),l(-.846,-.16),l(-.405,-.125),l(-.306,-.667),l(-.833,-.218),l(-.366,.129),l(.072,.723),l(-.536,.127),l(-.747,-.053),l(-.91,.109),l(-.728,-.017),l(-.495,.001),l(-1.342,-.213),l(-.593,-.197),l(-.495,-.017),l(-.209,.433),l(-1.801,.111),l(-.831,.074),l(-1.453,-.069),l(-.404,-.251),l(-.144,-.686),l(-1.237,.129),l(-.389,.181),l(-.326,.325),l(-.955,.2),l(-1.011,-.034),l(-.112,-.027),l(-.704,-.169),l(-1.186,-.575),l(-.675,.489),l(-1.131,-.07),l(-.666,-.688),l(-.442,-.717),l(.587,-.481),l(.019,-.371),l(-.292,-.316),l(-1.249,-.651),l(-.617,-.299),l(-.047,-.338),l(.636,-.133),l(1.226,-.078),l(2.472,-.023),l(.763,.093),l(1.118,.261),l(.188,.04),l(.872,.184),l(-.613,.189),l(-.259,.013),M(128.19,41.985),l(-.926,-.016),l(-1.059,-.102),l(-.362,-.466),l(-.549,-.467),l(-.432,-.259),l(-1.123,-.363),l(-1.36,-.067),l(-.951,-.138),l(-.469,-.19),l(-.168,-.174),l(.537,-.106),l(.589,-.298),l(.481,-.211),l(.08,-.386),l(-.437,-.809),l(.552,-.001),l(.468,-.177),l(.307,-.372),l(1.104,-.533),l(.526,-.588),l(-.121,-.32),l(-.271,-.16),l(-1.229,-.677),l(-.375,-.448),l(.869,-.001),l(.823,-.056),l(1.455,.051),l(.97,.016),l(1.515,-.092),l(1.284,-.146),l(1.242,-.074),l(.495,.125),l(3.242,.801),l(.918,.088),l(.708,-.055),l(1.316,-.127),l(1.223,.016),l(.771,.07),l(1.35,.373),l(2.389,.815),l(-.242,.143),l(-.432,.036),l(-.26,.072),l(-1.609,.322),l(-1.073,.144),l(-1.829,.428),l(-1.069,.319),l(-1.604,.725),l(-1.025,.563),l(-.549,.089),l(-.974,.124),l(.066,.924),l(-.271,.504),l(-.662,.278),l(-1.215,.124),l(-1.213,-.067),l(-.521,.485),l(-.898,.312),M(190.483,39.666),l(-1.146,-.208),l(-.146,-.524),l(-.941,-.806),l(-.207,-.582),l(.058,-.389),l(.27,-.657),l(.377,-.321),l(1.256,.033),l(-.089,-.16),l(-.416,-.266),l(-.185,-.286),l(.211,-.09),l(.234,-.072),l(2.154,-.058),l(1.215,.087),l(1.464,.248),l(1.282,.051),l(1.316,-.146),l(1.051,.016),l(.694,.105),l(.639,.213),l(-.007,.089),l(-.224,.179),l(-.824,.428),l(-.874,.746),l(-1.513,.92),l(-1.386,.073),l(-2.379,-.154),l(-1.269,.055),l(1.392,.717),l(-.188,.315),l(-.855,.369),l(-.964,.072),M(181.204,41.523),l(-.491,-.085),l(-1.101,-.552),l(-.952,-.641),l(-1.014,-.468),l(-.978,-.225),l(-1.438,-.12),l(-.55,-.174),l(-2.255,-1.066),l(.866,-.654),l(.653,.14),l(1.032,.474),l(1.063,.227),l(.46,.052),l(.615,-.283),l(.908,-.619),l(.415,-.036),l(.018,-.212),l(-1.062,-.565),l(-1.068,-.424),l(-.177,-.231),l(.132,-.107),l(1.683,.086),l(.711,-.215),l(.42,0),l(.996,.39),l(.56,.035),l(.58,-.055),l(.435,-.25),l(1.232,-.127),l(1.354,.069),l(.912,.23),l(-.324,.268),l(-.58,.125),l(-.323,.338),l(-1.55,.375),l(-.392,.16),l(-.069,.194),l(.253,.247),l(.506,.105),l(.692,-.089),l(1.08,.174),l(.868,.245),l(.391,.017),l(.564,.262),l(.186,.438),l(-.681,.352),l(-.156,.35),l(-.271,.68),l(-.457,.366),l(-.508,.14),l(-.658,.019),l(-.582,-.103),l(-.773,-.346),l(-.653,-.103),l(.013,.208),l(1.054,.553),l(-.817,.399),l(-.77,.036),M(243.524,60.394),l(-.234,-.208),l(-1.199,-.235),l(-.673,-.331),l(-.154,-.269),l(.346,-.064),l(.616,-.461),l(-1.378,-.521),l(-1.132,-.125),l(-.76,-.349),l(-.929,-.731),l(-.035,-.511),l(-1.115,-.062),l(-1.311,-.366),l(-.675,-.031),l(.284,.767),l(-.155,.096),l(-.409,-.015),l(-1.704,-.332),l(-.309,.033),l(-.325,.304),l(-.441,.288),l(-1.312,.082),l(-1.349,-.173),l(-1.343,-.189),l(-.813,-.254),l(-.052,-.319),l(.196,-.4),l(.382,-.354),l(1.066,-.163),l(.192,-.178),l(-.128,-.516),l(.206,-.033),l(1.357,.11),l(1.408,.175),l(.517,.144),l(.962,.626),l(.051,-.386),l(-.154,-.193),l(.077,-.194),l(.585,-.033),l(.977,-.099),l(.652,-.163),l(.649,-.114),l(.515,.063),l(.785,.031),l(.166,-.275),l(-1.138,-.825),l(-.773,-.356),l(-.119,-.228),l(.167,-.163),l(.586,-.066),l(.72,-.246),l(1.409,-.591),l(.361,-.541),l(.771,-.46),l(.493,-.379),l(-.109,-.593),l(-.899,-.841),l(-.407,-.496),l(-.541,-.364),l(-.414,.001),l(-1.258,-.33),l(-1.041,-.481),l(-.244,-.467),l(-.527,-.384),l(-.442,.202),l(-.551,.202),l(-.825,-.015),l(-.293,.117),l(-.62,.018),l(-1.255,.169),l(-.214,-.667),l(1.032,-.052),l(1.23,-.103),l(.163,-.269),l(-1.604,-.618),l(-1.552,-.67),l(-.879,-.015),l(-.567,-.185),l(-.169,-.542),l(-.677,-.339),l(-.45,-.05),l(-.918,-.306),l(-.687,-.341),l(-.385,-.119),l(-.611,.155),l(-.81,-.187),l(-1.177,-.238),l(-.489,-.085),l(-.379,.138),l(.529,.307),l(.453,.05),l(2.838,.712),l(.438,.271),l(.069,.306),l(-.505,.221),l(-.669,.069),l(-.541,-.033),l(-.757,-.049),l(-.818,-.252),l(-1.153,-.27),l(-.667,-.066),l(-.323,.17),l(.044,.204),l(.426,.236),l(.259,.438),l(-1.703,-.553),l(-.47,-.05),l(-.396,.119),l(-.63,.153),l(-.767,-.218),l(-.693,-.117),l(-.859,.12),l(-1.474,-.184),l(-1.995,-.167),l(-1.321,.037),l(-1.146,-.032),l(-.862,-.186),l(-.003,-.597),l(-.363,-.153),l(-.904,-.049),l(-.396,.342),l(-.623,.086),l(-1.214,-.049),l(-1.076,-.168),l(-1.303,-.477),l(-.415,-.376),l(.123,-.275),l(.868,-.07),l(1.131,.067),l(1.212,.101),l(.879,-.019),l(.312,-.19),l(-.934,-.463),l(-.8,-.275),l(-.905,-.102),l(-1.106,-.119),l(-.752,.036),l(-.539,-.017),l(-1.249,-.223),l(.114,-.416),l(.292,-.557),l(.34,-.14),l(.646,-.054),l(.081,-.227),l(-1.082,-.4),l(-.044,-.175),l(.449,-.79),l(1.197,-.919),l(.565,-.284),l(.918,-.321),l(.74,-.374),l(.423,-.037),l(.37,-.178),l(.698,-.001),l(.481,-.125),l(.71,-.09),l(1.436,-.109),l(1.348,.033),l(.857,.194),l(-.92,.393),l(-.815,.48),l(-1.394,.639),l(-.43,.529),l(.169,.369),l(1.256,.541),l(-.444,.298),l(-.076,.402),l(.257,.313),l(.862,.554),l(1.559,.621),l(-.096,.121),l(-1.272,.331),l(-.072,.31),l(.959,.033),l(1.504,.101),l(.654,-.639),l(-.103,-.415),l(-.343,-.277),l(-.724,-.103),l(-.422,-.138),l(-.884,-.538),l(.101,-.157),l(.506,-.245),l(.473,-.193),l(1.001,.12),l(.837,-.071),l(-1.204,-.47),l(-.703,-.034),l(-.793,-.279),l(-.056,-.193),l(.053,-.545),l(.886,-.319),l(1.207,.086),l(1.509,-.056),l(-.939,-.281),l(-1.233,-.351),l(.793,-.303),l(1.288,-.198),l(1.044,-.126),l(1.688,-.323),l(1.114,.016),l(.642,.052),l(.833,.141),l(.782,.478),l(1.536,.97),l(.058,.141),l(-.583,.687),l(-.709,.632),l(.038,.733),l(.364,.086),l(.65,.033),l(1.088,-.315),l(.284,-.455),l(.595,-.088),l(.791,.034),l(.454,.174),l(-.006,.262),l(.16,.47),l(.875,.189),l(.196,-.122),l(-.204,-.854),l(.218,-.123),l(.456,-.474),l(1.038,-.265),l(.98,-.054),l(.748,.034),l(.98,.174),l(1.172,.138),l(1.151,-.09),l(.688,.139),l(.327,.262),l(.621,.331),l(.574,.191),L(235.438,40),l(0,.191),l(-.531,.088),l(-.484,.279),l(-.818,.262),l(-.148,.225),l(.45,.259),l(.427,.068),l(.897,-.417),l(.652,-.174),l(.502,.051),l(.476,.242),l(.365,.466),l(.516,.413),l(.342,-.242),l(1.304,-.798),l(1.935,.256),l(.915,.361),l(-.051,.069),l(-.638,.346),l(-.708,.517),l(1.167,-.054),l(.455,-.173),l(1.078,-.105),l(.033,.704),l(.797,.324),l(.523,-.069),l(.831,-.207),l(1.316,-.088),l(.816,.221),l(.566,.273),l(-.162,.154),l(-.461,.223),l(-1.87,.43),l(-.238,.272),l(.523,.253),l(.456,-.068),l(.747,-.171),l(1.235,-.122),l(.406,-.29),l(.361,-.103),l(.479,.067),l(.51,.187),l(.544,.339),l(.636,.522),l(-1.019,.002),l(-1.2,.053),l(-.424,.135),l(.059,.269),l(.372,.134),l(1.333,.065),l(.938,.183),l(.543,.217),l(.233,.301),l(-.37,.034),l(-.748,.001),l(-1.011,-.082),l(-.875,-.216),l(-.824,-.065),l(-.316,.185),l(1.23,.583),l(-.216,.201),l(-1.552,.12),l(.245,.283),l(.437,.166),l(.551,.032),l(1.331,.364),l(1.312,.347),l(.247,.182),l(.039,.282),l(.351,.38),l(.75,-.217),l(.536,.049),l(1.413,.295),l(.298,-.067),l(.649,-.15),l(.61,.032),l(.752,.379),l(.862,.477),l(.376,.346),l(-.685,.1),l(-.801,.117),l(-.027,.444),l(.795,-.001),l(1.405,-.052),l(.51,-.132),l(.895,.048),l(-.386,.559),l(.918,.179),l(.514,-.001),l(.943,-.379),l(.685,.343),l(1.089,.407),l(.194,.098),l(-.275,.229),l(-.254,.099),l(-.103,.326),l(-.819,.05),l(-.718,-.21),l(-.247,-.048),l(-.794,.213),l(.968,.454),l(.279,.162),l(.057,.276),l(-1.057,.197),l(-.356,.228),l(-.312,.292),l(-.372,-.113),l(-.819,-.583),l(-.29,1.103),l(.354,.903),l(-.419,.065),l(-.677,-.257),l(-.751,-.176),l(-.205,-.177),l(-.018,-.243),l(-.315,-.274),l(-.93,.276),l(-.743,-.613),l(.051,-.292),l(.27,-.374),l(-.304,-.129),l(-.224,-.016),l(-.992,-.08),l(-.718,-.292),l(-1.17,-.617),l(-.769,-.292),l(-.762,-.048),l(-.452,.23),l(-.645,.083),L(250,52.592),l(.281,.179),l(1.05,.682),l(-.321,.114),l(-.686,.05),l(-.359,-.259),L(249.277,53),l(-.646,-.21),l(.275,.488),l(.859,.972),l(.604,.015),l(.587,.08),l(.5,.581),l(.612,.805),l(.513,.432),l(.615,-.321),l(.285,.047),l(.592,.399),l(.585,.271),l(1.38,.396),l(-.634,.113),l(-.213,.208),l(.254,.19),l(.568,.286),l(.962,.444),l(.324,.237),l(.242,.682),l(-.112,.428),l(-1.302,-1.155),l(-.554,-.237),l(-.027,.238),l(.118,.27),l(1.055,1.281),l(-.01,.3),l(-.926,-.125),l(.053,.205),l(.432,.409),l(.378,.519),l(-.563,-.172),l(-.615,-.313),l(-.889,-.693),l(-.145,-.031),l(-.719,.064),l(-.91,-.188),l(-1.44,-.662),l(-.319,-.285),l(-1.062,-.665),l(.187,.777),l(-1.22,-.473),l(-.567,-.158),l(-.872,-.03),l(.095,.222),l(.799,.696),l(.853,.426),l(1.842,.645),l(1.296,.644),l(.774,.549),l(.442,.486),l(.429,.689),l(-1.833,-.341),l(-1.524,-.421),l(-1.251,-.28),l(-1.444,-.107),l(-1.092,-.25),l(-.898,-.644),l(-1.146,-.14),l(-.638,-.204),l(-.635,-.141),l(-.058,.145),M(146.194,38.698),l(.818,-.037),l(.78,-.125),l(1.138,-.548),l(.895,-.019),l(1.723,.243),l(.939,.262),l(-.188,.877),l(.515,-.071),l(.66,-.019),l(.792,-.229),l(.599,-.141),l(.758,.016),l(.334,-.071),l(-.989,-.965),l(.156,-.036),l(1.38,.138),l(1.208,.245),l(.675,.245),l(.259,.245),l(.194,.508),l(.965,1.063),l(.638,.346),l(1.045,-.315),l(.14,-.261),l(-1.243,-1.361),l(-.439,-1.321),l(.228,-.354),l(1.91,.262),l(1.775,.156),l(2.031,.719),l(.36,.175),l(.3,.316),l(.16,.701),l(.511,.645),l(.352,.26),l(.856,.606),l(.048,.19),l(-.178,.243),l(-.333,.605),l(.179,.31),l(.224,.12),l(1.4,.649),l(.509,.171),l(1.151,.254),l(1.513,.1),l(2.056,.576),l(1.012,.39),l(.364,.793),l(-.168,.101),l(-1.071,-.082),l(-.811,-.234),l(-.945,-.234),l(-.551,.169),l(-.665,.204),l(-1.021,.036),l(-.256,.118),l(.208,.689),l(1.087,-.069),l(.614,-.152),l(.676,-.119),l(.876,.536),l(-.01,.235),l(-.526,.151),l(-.517,.252),l(-.583,.102),l(-1.417,.12),l(-1.049,-.015),l(-1.194,-.082),l(-1.594,-.248),l(-2.278,-.499),l(-.553,-.217),l(-.436,-.335),l(-.482,-.033),l(-.581,.102),l(-.402,.37),l(-1.114,.505),l(-1.055,.019),l(-1.411,.103),l(-1.253,.42),l(-2.753,.356),l(-1.42,.019),l(-1.205,.086),l(-1.984,-.063),l(-.483,.101),l(-.916,-.015),l(-1,-.282),l(-.061,-.468),l(.198,-.101),l(.002,-.302),l(-.395,-.2),l(-.462,-.1),l(-3.146,-.112),l(-1.258,-.115),l(-.864,-.167),l(-.801,-.2),l(-.753,-.504),l(-1.274,-.554),l(.303,-.069),l(.531,-.222),l(1.572,-.054),l(.603,-.188),l(.558,.016),l(.91,-.019),l(.904,-.087),l(1.716,.031),l(.935,-.002),l(2.14,.047),l(1.09,-.002),l(1.711,-.038),l(.415,-.154),l(-.681,-.221),l(-2.312,-.492),l(-1.942,-.202),l(-4.059,-.061),l(-1.569,-.014),l(-1.694,.055),l(-.955,.053),l(-.604,.001),l(-1.651,-.529),l(.011,-.207),l(.28,-.069),l(.823,-.053),l(1.315,-.209),l(.996,.032),l(1.78,-.141),l(.931,-.105),l(.5,-.277),l(-.392,-.346),l(-2.023,.073),l(-1.578,.159),l(-.393,-.051),l(-.554,-.189),l(-.677,-.346),l(-.65,-.19),l(-.692,.054),l(-.709,-.242),l(-.039,-.279),l(1.304,-.981),l(2.62,-.848),l(.909,-.143),l(.373,-.177),l(1.297,-.267),l(1.324,-.162),l(.701,-.267),l(1.113,-.091),l(1.026,.246),l(-.07,.212),l(-.548,.354),l(-.021,.81),M(251.273,99.526),l(-.188,.153),l(-.16,-.291),l(.192,-.077),l(-.02,-.256),l(.143,-.069),l(-.042,-.154),l(-.224,0),l(-.606,-.231),l(.077,-.229),l(-.31,-2.819),l(-.174,-.274),l(-.488,-.288),l(-.771,-.025),l(-.41,.176),l(-.381,-.085),l(-.505,-.36),l(-.273,-.085),l(-.632,.526),l(-.514,.626),l(-1.139,2.22),l(-1.139,1.45),l(-1.161,-.124),l(-.402,.06),l(-.363,.435),l(-.174,.375),l(-1.093,-.095),l(-1.855,-.004),l(-2.508,-.029),l(-1.76,.009),l(-.968,.523),l(-.534,.305),l(-1.754,.814),l(-.545,.164),l(-.146,.434),l(-.163,.512),l(-.44,.275),l(-1.156,.197),l(-1.305,-.138),l(-1.123,-.01),l(-.93,.091),l(-.47,.203),l(-.162,.375),l(.018,.319),l(.16,.471),l(.047,.362),l(-.875,.427),l(-1.464,.452),l(-.944,.163),l(-.919,.062),l(-.88,.262),l(-.939,.478),l(-.925,.506),l(-.524,.117),l(-.573,-.068),l(-.497,-.169),l(-.371,-.427),l(-.012,-.33),l(.044,-.218),l(.707,-.525),l(.414,-.294),l(.264,-.433),l(.294,-.544),l(.377,-.576),l(.028,-.746),l(-.054,-.545),l(-.876,-3.16),l(-2.529,-1.05),l(-.26,-.33),l(.11,-.318),l(-.307,-.235),l(-.916,-.181),l(-.184,-.294),l(-.178,-.135),l(-.628,.024),l(-.46,-.465),l(-.101,-.429),l(-2.15,-1.061),l(-3.975,-1.576),l(-.977,-.386),l(-.797,-.227),l(-.805,.189),l(-1.469,.592),l(-.707,-.074),l(-.542,.049),l(-.196,-.144),l(-.156,-.115),l(-.474,-.041),l(-.855,.083),l(-.197,-.116),l(-.028,-.282),l(-.373,.075),l(-.412,.191),l(-.219,.06),l(-.573,.141),l(-.506,-.098),l(-.064,-.185),l(-.469,-.086),l(-.241,-.271),l(-.502,-.013),l(-.16,.247),l(-.338,-.48),l(-.271,.012),l(-.02,-.185),l(-1.425,-.208),l(-.518,.076),l(-.833,-.451),l(-.468,-.46),l(-.279,-.371),l(-.896,-.748),l(-.501,.036),l(.131,.347),l(.387,.588),l(-.68,-.003),l(-2.687,.029),l(-2.798,-.029),l(-1.348,.007),l(-2.105,-.003),l(-2.915,.016),l(-2.781,-.029),l(-2.131,.012),l(-2.935,-.014),l(-.601,.003),l(-4.84,-.018),l(-3.617,.004),l(-.875,.005),l(-3.821,-.023),l(-1.089,.035),l(-4.13,-.021),l(-.74,-.011),l(-5.117,.028),l(-1.687,-.006),l(-2.87,.001),l(-3.938,-.008),l(-4.588,.025),l(-1.335,-.022),l(-2.579,-.001),l(-.194,-.013),l(-.187,-.151),l(-.509,-.305),l(-.071,-.437),l(.074,-.346),l(-.708,.25),l(-.373,-.029),l(-.331,-.305),l(-.162,-.496),l(-.125,-.189),l(-.385,.088),l(-.23,.205),l(-.483,.059),l(-.721,-.495),l(-.119,-.425),l(-.201,-.821),l(-1.051,.104),l(-1.01,-.277),l(-.487,-.087),l(-.173,-.087),l(-.143,-.396),l(-.438,-.352),l(-.591,.222),l(-1.236,.046),l(-.461,-.117),l(-.383,-.249),l(-.106,-.25),l(.257,-.648),l(.458,-.222),l(-.227,-.294),l(-1.24,-.086),l(.617,-.518),l(.398,-.281),l(.547,-.149),l(.605,-.508),l(-.874,.006),l(-.621,.149),l(-.362,-.043),L(116,83.422),l(-.039,-.978),l(-.789,.002),l(-1.015,-1.066),l(.132,-.238),l(.034,-.53),l(-.547,.056),l(-.83,.492),l(-1.266,-.934),l(-.384,-.521),l(-.204,-.402),l(-.068,-.432),l(.419,-.404),l(.161,-.254),l(.436,-.3),l(-.358,-.689),l(-.393,-.777),l(.163,-.788),l(-.402,-.255),l(-2.025,-.763),l(-.98,-.314),l(-.189,-.029),l(-.512,-.393),l(-1.67,-1.882),l(-1.769,-1.768),l(-.814,-.58),l(-2.048,-1.175),l(-.35,-.322),l(-.371,-.492),l(-.316,-.199),l(-.832,-.073),l(-.495,.126),l(-.731,.498),l(-1.225,.67),l(-.848,.205),l(-.238,.325),l(-.945,-.673),l(-2.162,-1.318),l(-.348,-.292),l(-.173,-.387),l(-.332,-.388),l(-.739,-.059),l(-2.424,.122),l(-.84,-.074),l(-.196,-.279),l(-.089,-1.046),l(-.026,-2.167),l(.043,-4.334),l(.026,-2.183),l(-.129,-2.796),l(-.052,-2.335),l(-.039,-2.259),l(.003,-2.855),l(-.102,-.483),l(.71,.024),l(.9,-.086),l(.964,.116),l(2.012,.451),l(1.601,.518),l(1.214,.266),l(1.04,.115),l(.731,.032),l(1.619,.164),l(.888,.232),l(.429,.149),l(.254,-.034),l(-.452,-.601),l(-.357,-.2),l(-.345,-.15),l(-.064,-.419),l(1.344,-.423),l(.745,.066),l(.578,-.068),l(.15,-.102),l(1.736,.148),l(.771,-.001),l(1.125,-.373),l(.309,-.186),l(.442,0),l(.656,-.221),l(.759,-.069),l(.866,-.086),l(.734,-.086),l(.469,-.239),l(.392,-.188),l(.771,-.104),l(1.045,-.002),l(.872,.123),l(-.445,.404),l(-.352,.119),l(-1.101,.137),l(-1.092,.373),l(-1.244,.171),l(-1.22,.271),l(-.699,.522),l(-1.767,.255),l(-.681,.487),l(.846,.266),l(1.441,.748),l(-.219,-.55),l(.168,-.351),l(1.196,-.253),l(.39,-.235),l(.726,-.421),l(1.727,-.053),l(.96,-.372),l(1.158,-.389),l(2.066,-.173),l(.643,-.338),l(.921,-.272),l(.821,-.189),l(.476,-.239),l(-.178,-.272),l(-.702,-.392),l(-.655,-.444),l(.899,.101),l(.764,.272),l(.701,.306),l(.412,.324),l(.376,.476),l(.449,.523),l(.393,.235),l(1.246,.486),l(.186,.067),l(1.154,.216),l(.394,-.018),l(.199,-.151),l(-.511,-.639),l(.07,-.27),l(.548,-.035),l(.334,-.136),l(.627,-.103),l(.383,.354),l(.059,.421),l(-.205,.287),l(.833,.133),l(.938,-.069),l(1.136,-.457),l(.536,-.49),l(.479,-.069),l(1.131,.015),l(1.536,.267),l(1.745,.435),l(1.396,.334),l(2.095,.349),l(1.024,.216),l(.619,.066),l(1.572,.282),l(1.121,.065),l(1.144,.148),l(1.096,.032),l(1.4,-.086),l(.899,.099),l(1.008,.282),l(.982,.349),l(.434,.249),l(.191,.333),l(-.524,.134),l(-.935,-.032),l(-.566,.051),l(-.849,.135),l(-.354,.714),l(3.323,.358),l(1.726,.079),l(1.749,.014),l(.868,-.068),l(.738,-.051),l(.94,-.167),l(.895,-.118),l(.938,-.101),l(.886,.032),l(1.432,.477),l(1.452,.179),l(.42,.115),l(1.225,.443),l(-.013,.312),l(-.504,.083),l(-.35,.247),l(.305,.147),l(1.823,.979),l(-.162,-.392),l(-.024,-.312),l(.456,-.05),l(.617,-.132),l(-.062,-.181),l(-.972,-.656),l(-.128,-.198),l(-.145,-.445),l(.121,-.745),l(.35,-.034),l(1.944,-.136),l(.928,-.151),l(.207,-.299),l(.459,-.217),l(.613,-.035),l(1.098,.281),l(1.528,.279),l(.968,.064),l(.969,-.102),l(.612,.414),l(.248,.082),l(.962,.213),l(1.211,.13),l(.678,.081),l(1.146,-.002),l(.879,-.2),l(1.755,-.02),l(1.876,.029),l(1.07,-.052),l(1.18,-.267),l(.959,.478),l(.95,.296),l(.522,-.018),l(.243,-.314),l(-.017,-.513),l(-.666,-.231),l(-.732,-.131),l(-1.377,-.064),l(.089,-.449),l(1.193,-.085),l(.575,.065),l(.804,.214),l(.871,.198),l(.858,.048),l(.498,.198),l(.088,.183),l(-.095,.132),l(-.287,.86),l(.179,.51),l(.304,.164),l(.177,.065),l(.792,.097),l(.951,.311),l(-.071,-.559),l(-.466,-.989),l(.137,-.48),l(.258,-.266),l(.712,.015),l(.811,-.035),l(1.229,-.85),l(.492,-.051),l(.479,-.001),l(.517,-.151),l(.033,-.133),l(-.15,-.367),l(-.375,-.35),l(-.307,.001),l(-.81,.185),l(-.988,-.082),l(.535,-.52),l(.806,-.069),l(.435,-.168),l(.572,-.001),l(.739,.4),l(.464,.167),l(.065,-.268),l(-.081,-.956),l(-.744,.069),l(-.897,-.032),l(-.68,-.116),l(-.859,-.318),l(-.725,.085),l(-1.245,-.183),l(-.861,-.234),l(-.956,-.218),l(-.657,-.338),l(-.092,-.136),l(-.022,-.324),l(.33,-.137),l(.842,-.463),l(-.486,-.221),l(-1.188,-.375),l(.09,-.207),l(.58,-.604),l(.593,-.294),l(.387,-.035),l(1.032,.257),l(.139,-.035),l(.173,-.346),l(-.709,-.362),l(-.201,-.277),l(.23,-.035),l(.551,-.331),l(.367,-.035),l(1.841,-.021),l(.559,.086),l(.728,.189),l(1.26,.449),l(.432,.328),l(.195,.38),l(-.246,.603),l(1.261,.53),l(.809,.495),l(1.134,.493),l(-.377,.341),l(-.985,.036),l(-.474,.273),l(-.416,.557),l(.471,.067),l(1.071,.233),l(.805,.049),l(.387,-.136),l(.597,-.001),l(1.477,.351),l(-.335,.353),l(-.563,.219),l(.092,.151),l(.796,.467),l(.358,.601),l(.025,.833),l(.303,-.063),l(.021,-.004),l(.411,-.067),l(.608,-.367),l(.655,-1.137),l(.668,-.42),l(.523,.016),l(.731,.284),l(1.064,.55),l(.473,.383),l(.209,.45),l(-.159,.433),l(-.336,.034),l(-.796,-.098),l(-.202,.299),l(-.043,.415),l(.35,.396),l(1.146,.659),l(.61,.493),l(.463,.279),l(.595,-.166),l(.896,-.167),l(.369,-.132),l(.208,-.66),l(.764,-.398),l(.599,-.416),l(.249,-.664),l(.363,-.75),l(.237,-.184),l(1.394,.081),l(.329,-.067),l(.134,-.518),l(-.985,-.333),l(-.918,-.35),l(.088,-.891),l(.595,-.271),l(.787,.032),l(.42,-.068),l(.571,.016),l(3.459,.616),l(1.325,.669),l(.506,-.001),l(.553,-.068),l(.454,.201),l(.244,1.036),l(-.474,.268),l(-.431,.101),l(-.243,-.05),l(-.718,-.532),l(-.263,0),l(-.799,.269),l(.123,.316),l(.309,.515),l(.699,.729),l(.855,.528),l(1.108,.576),l(.024,.313),l(-.478,.642),l(-.439,.181),l(-1.407,.772),l(-.674,.083),l(-1.123,.509),l(-.763,-.276),l(-1.654,-.962),l(-.586,-.262),l(-.497,-.048),l(-.684,.281),l(1.364,.521),l(1.483,.896),l(-.708,.067),l(-.691,-.081),l(-1.288,.084),l(-.375,-.129),l(-.596,-.62),l(-1.147,-.014),l(-1.857,.118),l(-.253,.229),l(.614,.244),l(1.311,.421),l(-.159,.195),l(-.611,.327),l(-2.045,1.106),l(-.657,.179),l(-.527,.001),l(-.859,-.241),l(-.816,-.484),l(-.225,-.081),l(-1.189,-.225),l(-.736,-.259),l(-.598,-.112),l(-.947,.014),l(-.289,.004),l(-1.214,.174),l(1.503,.278),l(1.136,.21),l(1.751,.774),l(1.629,.433),l(1.233,.126),l(1.02,.031),l(-.618,1.091),l(-1.237,.705),l(-.856,.432),l(-.728,.161),l(-.829,.049),l(-.928,-.126),l(-1.062,-.38),l(-.048,.351),l(-.025,.287),l(.321,.572),l(-.02,.159),l(-.741,.031),l(-.058,.002),l(-1.365,-.108),l(-1.649,-.41),l(-.884,-.078),l(-2.962,-.322),l(2.146,.864),l(1.576,.156),l(1.367,.267),l(.562,.205),l(.33,.268),l(-.011,.19),l(-.642,.333),l(-1.106,.207),l(-1.429,-.076),l(-.511,-.062),l(-.367,.269),l(1.254,.423),l(-.469,.426),l(-1.06,.316),l(-1.454,.662),l(-.421,.252),l(.218,.704),l(-.313,.235),l(-.909,.205),l(-.31,.282),l(-.529,.64),l(-.276,.296),l(-.241,.669),l(-.274,.543),l(-.323,.666),l(.056,.416),l(-.161,.554),l(.123,.875),l(.136,.536),l(.598,.366),l(.25,.015),l(.257,.091),l(.664,.014),l(1.164,-.094),l(.276,.045),l(.367,.29),l(.413,.763),l(.813,1.157),l(.22,.668),l(-.132,.91),l(.673,.014),l(1.874,-.428),l(1.261,-.033),l(.723,.074),l(.535,.157),l(1.062,.311),l(2.129,.435),l(1.896,.903),l(.993,.933),l(3.5,.67),l(.644,.225),l(.982,.403),l(.986,.253),l(.553,.104),l(.702,-.091),l(.453,.044),l(.828,-.077),l(1.245,.163),l(1.407,.207),l(.401,.194),l(-.297,.702),l(-.142,.85),l(.154,.283),l(.307,.342),l(.07,.416),l(-.115,1.025),l(-.309,.593),l(.022,.208),l(.604,.266),l(.481,.339),l(.264,.354),l(.046,.488),l(-.076,.354),l(.97,.116),l(.963,.47),l(.676,.588),l(.392,.588),l(.078,.162),l(.64,.014),l(.726,.41),l(.907,.601),l(-.349,-.66),l(-.22,-.279),l(.134,-.338),l(.573,-.414),l(.365,.176),l(.381,.456),l(.262,.353),l(.165,-.354),l(.107,-.545),l(-.215,-.456),l(.541,-.532),l(.139,-.546),l(-.183,-.517),l(-.337,-.458),l(-.261,-.754),l(-.004,-.548),l(-.205,-.593),l(-.218,-.43),l(.615,-.016),l(-.097,-.476),l(-.296,-.252),l(-.657,-.163),l(-.375,-.282),l(-.326,-.923),l(1.252,-.271),l(.872,-.241),l(.625,-.271),l(1.758,-.949),l(.629,-.302),l(1.043,-.935),l(.434,-.544),l(.237,-.665),l(.054,-.529),l(-.257,-1.045),l(-.246,-.531),l(-.239,-.319),l(-.938,-.729),l(-.467,-.274),l(-1.105,-.532),l(-.363,-.122),l(-.453,-.274),l(-.151,-.046),l(-.293,-.351),l(.08,-.107),l(.868,-.522),l(.553,-.875),l(.293,-.416),l(.25,-.092),l(.447,-.017),l(.295,-.277),l(-.106,-.523),l(-.18,-.355),l(-.316,-.402),l(-.048,-.202),l(.258,-.357),l(.005,-.264),l(-1.751,-.105),l(1.084,-.92),l(.503,-.704),l(.007,-.125),l(-.316,-.203),l(-.609,-.265),l(-.244,-.266),l(-.043,-.533),l(.305,-.425),l(.554,-.315),l(.57,-.19),l(.827,.062),l(1.781,.374),l(1.097,.234),l(.753,.077),l(1.44,.013),l(1.08,-.144),l(.86,-.222),l(.21,-.047),l(.179,-.063),l(.589,.078),l(.991,.407),l(.254,.125),l(.754,.454),l(.918,.375),l(.796,.437),l(-.294,.391),l(.406,.233),l(1.698,.496),l(1.958,.354),l(.725,-.033),l(.368,-.203),l(.339,.295),l(-.013,.404),l(-.577,.343),l(-.123,.45),l(.438,1.327),l(.136,.722),l(.23,.414),l(-.049,.353),l(-.248,.169),l(-.445,-.014),l(-.347,-.015),l(-.138,.674),l(.375,.274),l(1.137,-.415),l(.366,-.047),l(.781,-.047),l(.286,.015),l(.677,.32),l(.378,.351),l(.004,.259),l(-.081,.123),l(.277,.32),l(.516,-.184),l(.306,-.046),l(1.173,-.079),l(.636,-.184),l(.436,-.383),l(.333,-.551),l(.326,.015),l(.194,.122),l(.693,.717),l(.042,-.062),l(.108,-.764),l(.317,-.583),l(.475,-.262),l(.539,-.385),l(-.651,-.505),l(.008,-.308),l(.272,-.139),l(.98,-.094),l(.193,-.139),l(.512,-.665),l(.667,.37),l(.607,.599),l(.785,.506),l(.596,.797),l(1.045,.764),l(.264,.352),l(-.344,.291),l(.095,.335),l(.573,-.031),l(.365,.777),l(.182,.183),l(.324,.121),l(.743,.136),l(.281,.258),l(.133,.38),l(-.379,.092),l(-.416,.168),l(.411,.318),l(.397,.227),l(.77,.196),l(.279,.227),l(.034,.424),l(-.056,.076),l(-.409,.106),l(-.676,-.029),l(-.745,-.12),l(-.316,.061),l(.091,.166),l(.273,.181),l(.189,.241),l(.333,.513),l(.411,.226),l(.634,.029),l(.462,.18),l(.838,.496),l(.899,.435),l(.246,.33),l(-.035,.195),l(-.447,.781),l(.508,.059),l(.663,-.166),l(.786,-.077),l(.79,.164),l(.574,.194),l(1.162,.49),l(.981,.132),l(1.517,.295),l(-.184,.253),l(-.718,.21),l(-.736,.21),l(-.663,.046),l(-.834,.24),l(-.583,.402),l(-.65,.225),l(-1.032,.061),l(-.286,.075),l(-.324,.268),l(.029,.371),l(-.271,.535),l(1.175,-.343),l(.542,-.09),l(.649,-.105),l(1.201,-.774),l(1.251,-.478),l(1.146,-.106),l(.662,.237),l(.35,.341),l(-.398,.446),l(.036,.119),l(.307,.296),l(.616,-.224),l(.455,-.164),l(.655,.192),l(1.051,.487),l(.226,.251),l(.022,.178),l(-.299,.43),l(-.05,.355),l(-.406,.444),l(1.001,.929),l(-.365,.37),l(-.795,.282),l(-1.078,.621),l(-.662,.281),l(-1.097,.046),l(-.823,.119),l(-1.548,.077),l(-.433,.413),l(-.916,.795),l(-.686,.427),l(-.612,.294),l(-.938,.222),l(-1.494,.172),l(-1.845,.127),l(-1.452,-.07),l(-2.031,-.084),l(-.355,.03),l(-1.073,.075),l(-1.058,-.012),l(-1.873,-.099),l(-.917,-.027),l(-1.758,.106),l(-.547,.206),l(-.523,.294),l(-.537,.585),l(-.205,.554),l(-.287,.335),l(-.591,.19),l(-1.07,.104),l(-.537,.147),l(-1.098,.555),l(-.774,.54),l(-.794,.612),l(-.325,.363),l(-.33,.233),l(-.868,.843),l(-.485,.566),l(-.418,.276),l(-.46,.58),l(-.518,.968),l(.749,-.737),l(.375,-.131),l(.688,-.479),l(1.059,-.944),l(1.097,-.785),l(2.028,-.948),l(1.245,-.395),l(1.797,-.512),l(1.065,-.235),l(1.03,-.235),l(1.473,-.148),l(.922,.056),l(.895,.289),l(.509,.29),l(.136,.189),l(.144,.464),l(-.125,.218),l(-.326,.219),l(-1.059,.292),l(-.753,.452),l(-.581,.044),l(-.845,-.23),l(-.726,.045),l(-.645,.19),l(.279,.08),l(1.13,.229),l(.17,.122),l(.256,.444),l(.074,.095),l(1.299,-.485),l(-.028,.216),l(.479,-.148),l(.372,.162),l(-.36,.229),l(-.231,.256),l(.112,.27),l(-.163,.014),l(-.074,.229),l(-.91,.444),l(1.216,.013),l(.077,.188),l(-.187,.282),l(.091,.43),l(.118,-.081),l(.239,.134),l(-.063,.134),l(.048,.202),l(.351,.457),l(.009,.147),l(.824,.054),l(.154,.094),l(.04,-.067),l(.727,.147),l(-.315,.134),l(-.373,-.013),l(-.047,.134),l(.525,.147),l(.211,.241),l(.569,-.081),l(.135,.134),l(.212,-.014),l(.134,.174),l(.418,-.04),l(-.075,-.107),l(.843,.067),l(.241,.107),l(-.207,.201),l(.242,-.107),l(.26,.027),l(.245,-.013),l(.696,-.362),l(.303,-.081),l(.104,.362),l(.377,.161),l(.538,-.121),l(.488,.416),l(-.405,.254),l(.089,.107),l(.825,.027),l(.164,.174),l(-.521,.121),l(-.161,-.121),l(-.3,.134),l(.118,.094),l(-.515,0),l(-.23,-.04),l(.109,.161),l(-.45,.04),l(.056,.107),l(-.443,.014),l(-.128,.147),l(-.45,.04),l(-.368,.253),l(-.09,-.106),l(-.706,.28),l(-.046,.053),l(-.529,.133),l(-.119,-.267),l(-.274,.106),l(-.163,.267),l(-.188,-.187),l(-.068,.253),l(-.218,.08),l(-.094,.187),l(-.513,0),l(-.081,-.08),l(-.169,-.053),l(.032,-.347),l(-.242,.36),l(-.202,.12),l(-.131,-.253),l(-.354,.027),l(.043,.24),l(-.233,.04),l(.312,.08),l(.033,.213),l(-.103,.12),l(-.174,-.067),l(-.768,.453),l(.127,.16),l(-.235,.12),l(-.194,.053),l(.015,.213),l(-.161,-.12),l(.083,.173),l(-.217,.08),l(-.14,-.107),l(.096,.253),l(-.222,.066),l(-.146,-.08),l(-.148,0),l(-.064,.133),l(-.156,-.106),l(-.243,.227),l(-.086,.292),l(-.201,-.226),l(-.344,.133),l(-.154,-.187),l(-.349,-.479),l(-.138,.24),l(-.419,-.866),l(.456,-.773),l(.284,-.16),l(.035,-.12),l(-.35,.12),l(-.357,.267),l(-.076,-.106),l(.924,-.507),l(.125,.146),l(.195,-.093),l(-.258,-.107),l(1.103,-.52),l(1.109,-.562),l(.658,-.361),l(.336,.094),l(-.067,.428),l(.179,-.054),l(.258,.281),l(-.044,-.201),l(-.017,-.174),l(.632,-.214),l(.73,-.134),l(.192,.067),l(.202,-.081),l(-.152,-.094),l(-.653,-.053),l(-.595,.053),l(-.42,-.053),l(-.804,-.014),l(-.306,.027),l(-.251,.081),l(-.246,.094),l(.033,-.214),l(1.128,-.563),l(.054,-.201),l(.252,-.08),l(-.052,-.174),l(-.523,.281),l(.097,-.134),l(-.502,-.51),l(.309,.443),l(-.36,.482),l(-.328,.013),l(-1.974,.817),l(-.284,.08),l(-.362,-.201),l(-.227,-.067),l(.23,.201),l(-.788,.401),l(-.219,-.174),l(-1.019,-.054),l(-.124,.147),l(-.38,-.241),M(186.193,47.833),l(-.713,-.032),l(-.922,-.181),l(-.882,-.065),l(-1.25,-.314),l(-.973,-.182),l(-.604,-.049),l(-1.083,-.199),l(.43,-.335),l(1.542,-.405),l(.385,-.186),l(.115,-.673),l(.305,-.236),l(.831,-.069),l(.743,.184),l(1.436,.603),l(1.287,.4),l(.074,.285),l(.315,.284),l(1.094,.516),l(-.288,.117),l(-1.263,.486),l(-.578,.051),M(231.09,50.646),l(-1.319,-.03),l(-.449,-.147),l(-.232,-.247),l(-.173,-.478),l(.3,-.43),l(.708,-.664),l(.662,-.267),l(1.359,-.168),l(.911,.197),l(.79,.314),l(-.021,.464),l(-.039,.727),l(-.362,.265),l(-1.025,.348),l(-1.108,.117), +N(444.972,79.145),l(.47,-.218),l(.307,-.093),l(-.294,-.024),l(-.419,.061),l(-.15,-.135),l(-.125,.184),l(-.108,-.012),l(.066,-.491),l(.177,-.218),l(.41,.009),l(1.489,.062),l(.417,.014),l(.339,-.075),l(.121,-.253),l(-.175,-.288),l(.246,-.05),l(-.068,-.122),l(-.068,-.123),l(.353,-.096),l(.12,-.034),l(.051,.154),l(.086,.052),l(.24,0),l(.223,.12),l(.257,.069),l(.514,.068),l(.086,.103),l(.223,-.051),l(.445,0),l(.257,0),l(.223,-.017),l(.086,.137),l(.103,.103),l(.188,.034),l(.171,.069),l(.018,.137),l(.052,.12),l(-.224,.12),l(-.068,.154),l(-.068,.206),l(.018,.171),l(.034,.137),l(.029,.038),l(-2.96,.101),l(-2.246,-.115),l(-.842,-.006),M(717.633,81.109),l(.42,.443),l(.429,.62),l(.183,.457),l(.01,.767),l(-.244,.442),l(-.197,.78),l(-.002,.764),l(.29,.777),l(.592,.849),l(.65,1.446),l(.899,1.614),l(1.115,1.679),l(-1.26,-.677),l(-.832,-.39),l(-.99,-.056),l(-.268,.088),l(-.396,.204),l(-.462,1.045),l(-.266,1.101),l(-.082,.579),l(.277,.982),l(.183,.216),l(.659,.908),l(.54,.201),l(.463,.648),l(-.314,1.246),l(-.664,-1.258),l(-.866,-.301),l(-.224,.029),l(-.415,.303),l(-.311,.534),l(-.643,.907),l(-.422,-.5),l(-.19,-.929),l(.637,-1.146),l(-.395,-.884),l(.175,-.454),l(.502,-.63),l(-.131,-.723),l(-.196,-.376),l(-.27,-.55),l(-.062,-.235),l(.403,-.302),l(.284,-.915),l(.075,-.784),l(.005,-1.326),l(.15,-1.302),l(-.09,-.732),l(-.213,-.469),l(-.83,-.85),l(-.1,-.897),l(.114,-.192),l(.359,-.722),l(.065,-.738),l(-.336,-.457),l(.172,-.237),l(.374,-.03),l(.62,-.031),l(1.023,-.534),M(471.158,84.281),l(-.002,-.142),l(-.165,-.066),l(-.082,-.115),l(-.164,-.082),l(.033,-.099),l(-.033,-.23),l(-.033,-.164),l(.082,-.099),l(-.147,-.131),l(-.099,-.148),l(.132,-.066),l(0,-.165),l(-.296,-.164),l(-.279,-.263),l(-.017,-.164),l(.099,-.131),l(.131,-.165),l(.362,-.017),l(.328,.049),l(.197,.132),l(.51,.016),l(.525,-.099),l(.444,-.247),l(.049,-.065),l(.148,-.083),l(.296,0),l(.065,-.164),l(-.033,-.131),l(-.279,-.066),l(-.296,-.148),l(-.099,-.181),l(.082,-.017),l(.066,-.049),l(.032,-.065),l(-.263,-.066),l(-.361,-.099),l(-.378,-.066),l(-.361,.066),l(-.182,-.066),l(.066,-.181),l(.099,-.197),l(-.066,-.148),l(-.164,-.099),l(-.279,-.082),l(-.23,-.066),l(-.443,-.213),l(-.115,-.23),l(-.164,-.263),l(-.214,-.017),l(-.017,-.099),l(.066,-.131),l(.099,-.115),l(-.132,-.033),l(-.181,.049),l(-.082,-.115),l(-.132,-.181),l(-.345,-.049),l(.049,-.147),l(.033,-.165),l(.099,-.049),l(.115,-.082),l(0,-.083),l(.114,0),l(.066,-.131),l(-.05,-.164),l(-.147,-.099),l(-.197,-.247),l(.131,-.165),l(.033,-.164),l(0,-.083),l(.065,-.115),l(-.049,-.115),l(-.147,.033),l(-.165,-.033),l(-.147,-.099),l(-.099,-.099),l(-.279,-.099),l(-.132,-.131),l(-.542,-.115),l(-.247,.049),l(-.099,-.049),l(-.131,-.049),l(-.23,.083),l(-.147,.099),l(-.165,0),l(-.279,.016),l(-.214,.197),l(-.197,0),l(-.164,-.148),l(-.065,-.148),l(.017,-.099),l(.164,-.099),l(0,-.115),l(-.147,-.017),l(-.296,-.065),l(-.312,-.049),l(-.361,.049),l(-.214,.065),l(-.197,.033),l(-.082,-.148),l(-.132,-.148),l(-.312,-.033),l(-.181,-.016),l(-.197,.131),l(-.229,-.066),l(-.165,-.147),l(.061,-.042),l(.015,-.117),l(.044,-.087),l(-.088,-.233),l(.015,-.189),l(-.131,-.117),l(.059,-.087),l(-.16,-.043),l(-.146,-.102),l(-.029,-.16),l(-.131,-.058),l(-.116,-.102),l(.043,-.073),l(.059,-.087),l(-.073,-.044),l(-.087,-.014),l(-.131,-.073),l(-.146,.015),l(-.204,.059),l(.044,-.102),l(.102,-.073),l(.073,-.087),l(-.029,-.117),l(.072,-.131),l(-.131,-.087),l(.103,-.029),l(.087,-.015),l(.102,-.073),l(.015,-.087),l(.029,-.116),l(.015,-.087),l(-.204,-.058),l(-.087,-.073),l(-.204,-.087),l(-.232,-.073),l(0,-.117),l(.015,-.116),l(-.37,.004),l(-.081,-.106),l(.116,-.058),L(461.402,72),l(.029,-.117),l(.131,0),l(.087,-.116),l(.059,-.102),l(.16,-.058),l(.262,-.043),l(.175,-.073),l(-.059,-.059),l(-.175,-.043),l(-.043,-.146),l(-.015,-.087),l(0,-.073),l(-.088,-.073),l(-.203,-.087),l(-.175,-.233),l(0,-.175),l(.175,-.131),l(-.029,-.16),l(-.073,-.189),l(-.131,-.437),l(-.029,-.16),l(.088,-.16),l(.204,-.131),l(.319,-.131),l(.219,-.204),l(.175,-.277),l(.058,-.131),l(.088,-.043),l(.116,0),l(.189,0),l(.175,-.044),l(.043,-.174),l(-.16,-.131),l(-.145,-.053),l(-.089,-.13),l(-.17,-.038),l(.1,-.253),l(.339,-.038),l(.153,.165),l(.229,.063),l(.188,-.088),l(-.094,-.139),l(.301,-.154),l(.485,.199),l(.296,-.062),l(.312,-.338),l(.311,-.185),l(.75,.106),l(.781,.275),l(.439,0),l(.363,-.154),l(-.386,-.399),l(-.59,-.323),l(-.393,-.03),l(-1.204,.08),l(-.616,-.091),l(-.271,-.108),l(-.299,-.309),l(.258,-.434),l(-.065,-.201),l(-.199,.044),l(.174,-.285),l(1.946,-1.145),l(1.983,-1.195),l(1.385,-.758),l(.591,-.536),l(.43,-.536),l(.105,-.409),l(-.161,-.346),l(-.436,-.392),l(-.703,-.265),l(-1.357,-.499),l(-.439,-.33),l(.327,-.191),l(.542,-.415),l(.057,-.254),l(-.151,-.253),l(-1.286,-1.395),l(-.37,-.509),l(.029,-.37),l(.187,-.403),l(.44,-.535),l(.196,-.356),l(-.772,-1.195),l(-1.402,-1.394),l(.328,-.296),l(1.303,-.777),l(.421,-.364),l(-.543,-.392),l(-.964,-.506),l(-.872,-.194),l(-.563,-.212),l(-.116,-.529),l(.258,-.465),l(.024,-.283),l(.689,-.303),l(1.013,-.672),l(1.023,-.49),l(.77,-.121),l(.824,-.021),l(.514,-.204),l(.404,-.288),l(.617,-.051),l(1.002,-.254),l(.643,-.237),l(.01,.151),l(.255,.386),l(.358,.284),l(.543,.2),l(.919,.082),l(.602,.1),l(.078,.602),l(.695,-.319),l(.421,.049),l(1.083,.048),l(.875,.015),l(.522,.032),l(1.116,-.002),l(1.293,.281),l(2.728,.512),l(.984,.364),l(1.595,.86),l(.583,.214),l(1.48,.246),l(1.296,.212),l(2.018,.623),l(.328,.279),l(-.051,.444),l(.147,.295),l(.426,.294),l(.104,.294),l(-.24,.344),l(-.69,.491),l(-1.092,.54),l(-.816,.262),l(-1.75,.36),l(-.907,.083),l(-1.631,-.013),l(-1.391,-.192),l(-2.038,-.175),l(-1.63,-.192),l(-1.342,-.339),l(-2.256,-.485),l(-1.114,-.112),l(-.476,-.048),l(-.621,-.473),l(-.371,-.163),l(-.771,-.13),l(-.943,.117),l(.307,.163),l(.149,.065),l(.73,.538),l(.482,.146),l(1.109,.601),l(.832,.291),l(.921,.161),l(.634,.242),l(.405,.453),l(-.002,.405),l(-.276,.291),l(-.684,.195),l(.086,.113),l(.208,.531),l(.771,.943),l(.093,.494),l(.155,.207),l(.438,.174),l(1.203,.078),l(.872,.125),l(.499,.619),l(.401,.095),l(1.26,.077),l(.575,.126),l(.364,.079),l(.402,-.128),l(.785,-.097),l(.243,-.302),l(-.001,-.318),l(-.387,-.397),l(-.471,-.079),l(-.455,.096),l(-.447,-.031),l(-.589,-.206),l(-.952,-.795),l(.701,-.674),l(.484,-.001),l(1.116,.479),l(1.441,.333),l(2.09,.427),l(.952,.078),l(.834,-.146),l(.723,.174),l(.261,-.224),l(.05,-.415),l(-.214,-.239),l(-.858,-.656),l(-.348,-.628),l(.285,-.323),l(.19,-.049),l(1.432,-.423),l(1.495,-.359),l(.599,-.244),l(1.133,-.717),l(.172,-.049),l(.462,.064),l(1.829,.29),l(1.41,.533),l(.341,-.001),l(.052,-.065),l(.154,-.503),l(.581,-.767),l(-.048,-.653),l(-.317,-.408),l(-.847,-.163),l(-.3,-.229),l(1.139,-1.005),l(.101,-.247),l(-.205,-.594),l(-.771,-.512),l(.069,-.315),l(.353,-.051),l(1.458,.23),l(2.025,-.12),l(.631,.132),l(.664,.611),l(.616,.445),l(.433,.461),l(-1.045,.051),l(-1.559,.085),l(-.822,.215),l(-.492,.51),l(.191,.18),l(.952,.293),l(.732,.555),l(.804,.194),l(.723,.097),l(1.268,-.133),l(1.33,-.084),l(.301,-.164),l(.257,-.491),l(.291,-.591),l(.284,-.412),l(1.232,-.2),l(1.223,-.414),l(.988,-.216),l(1.924,-.483),l(1.429,-.251),l(1.537,-.318),l(.921,-.3),l(.205,.464),l(.278,.083),l(.571,-.117),l(.487,-.266),l(.148,-.465),l(.386,-.167),l(.718,-.135),l(.859,.065),l(-.18,.399),l(-.058,.597),l(-.858,.084),l(-.178,.149),l(.002,.215),l(.687,.197),l(.507,-.083),l(1.169,-.167),l(.436,-.001),l(.161,.198),l(.23,.049),l(.278,-.133),l(.264,-.216),l(.29,-.431),l(.464,-.183),l(.861,-.118),l(1.049,-.068),l(.768,.032),l(1.075,.23),l(.755,-.018),l(.36,-.083),l(.963,-.467),l(1,-.285),l(.803,-.052),l(.952,.182),l(.326,.166),l(-.631,.45),l(.129,.232),l(.217,.099),l(.632,.131),l(.579,-.018),l(.288,-.232),l(.074,-.398),l(.342,-.084),l(.962,.065),l(.543,-.184),l(.395,-.316),l(.115,-.417),l(-1.37,-1.033),l(.405,-.168),l(.66,-.37),l(.403,-.068),l(.609,.016),l(2.171,.063),l(1.272,.199),l(1.241,.149),l(1.135,.199),l(2.111,.515),l(1.071,.098),l(1.712,.414),l(1.02,.248),l(1.305,.53),l(1.455,.611),l(.864,.379),l(.376,.049),l(.229,-.1),l(1.145,-1.047),l(.236,-.3),l(-.927,.035),l(-.4,-.049),l(-.564,-.232),l(-.365,-.433),l(.027,-.652),l(-.727,-.283),l(-1.987,-.147),l(-.19,-.268),l(.064,-.168),l(.305,-.303),l(.693,-.255),l(.236,-.153),l(.085,-.187),l(-.052,-.833),l(-.251,-.238),l(-1.135,-.066),l(-.232,-.29),l(.328,-.532),l(.359,-.241),l(.391,-.035),l(1.482,-.416),l(1.098,-.485),l(.521,-.416),l(.581,-.608),l(.544,-1.22),l(.637,-.421),l(.374,.069),l(1.562,.155),l(1.613,-.125),l(1.605,-.091),l(.695,.069),l(1.066,-.055),l(.574,.122),l(.309,.279),l(-.018,.332),l(-.423,.836),l(-.348,.348),l(-1.334,.833),l(-.223,.345),l(.752,.342),l(.931,.667),l(.277,.342),l(.21,.818),l(-.174,.222),l(-.575,.375),l(.254,1.179),l(-.058,1.305),l(.263,.583),l(.45,.381),l(1.027,.264),l(.19,.166),l(-.001,.133),l(-.485,.481),l(-.417,.826),l(-.333,.33),l(-.784,.462),l(-1.232,.625),l(-.63,.198),l(-.55,.263),l(.321,.522),l(-.433,.115),L(558,52.195),l(-1.599,-.372),l(-.731,-.08),l(-.97,.034),l(-.601,.115),l(.195,.31),l(.583,.276),l(.738,.21),l(1.569,.208),l(1.133,.079),l(.613,-.05),l(1.188,.144),l(.922,-.034),l(.472,-.358),l(.303,-.358),l(1.352,-.328),l(1.166,-.492),l(.268,-.278),l(.386,-.606),l(.818,-.313),l(.864,-.626),l(.064,-.362),l(-.225,-.561),l(-.609,-.545),l(.244,-.548),l(.237,-.1),l(.677,-.151),l(1.38,-.152),l(1.757,-.003),l(.74,.231),l(.842,.463),l(.151,.778),l(-.34,1.023),l(.302,.279),l(.92,.212),l(1.298,.047),l(.864,-.149),l(.129,-.296),l(-.514,-.18),l(-.797,-.18),l(-.571,.034),l(-.457,-.098),l(.068,-.379),l(1.03,-.382),l(.065,-.249),l(-.218,-.148),l(-.166,-.331),l(-.441,-.763),l(-.511,-.266),l(-.836,-.098),l(-1.093,-.231),l(-.801,-.116),l(-1.288,-.165),l(-.91,.186),l(-.638,.101),l(-1.297,-.181),l(-.896,.019),l(-.015,-.267),l(-.564,-1.071),l(.305,-.657),l(.736,-.697),l(.282,-.46),l(-.134,-.221),l(-1.092,-1.042),l(-.949,-.514),l(-.12,-.189),l(.833,-.554),l(1.213,-.106),l(.998,-.262),l(.744,-.348),l(.172,-.226),l(.169,-.644),l(-.13,-.663),l(.23,.069),l(.64,.051),l(.466,.086),l(.108,.471),l(-.186,.54),l(-.636,.608),l(-.167,.554),l(.14,.448),l(.373,.274),l(.485,.274),l(1.384,.134),l(1.574,.169),l(1.632,.083),l(.819,.409),l(.321,.017),l(.799,-.036),l(-.527,-.89),l(-.521,-.274),l(-1.893,-.1),l(-.931,-.067),l(-.576,-.154),l(-.609,-.448),l(.275,-.329),l(1.374,-.054),l(.444,.172),l(1.145,.084),l(.747,-.157),l(-.09,-.728),l(.408,-.088),l(.84,-.105),l(1.278,-.02),l(1.067,.207),l(1.413,.379),l(1.088,.535),l(1.326,.343),l(.547,.085),l(1.822,.014),l(.727,-.174),l(.138,.345),l(-.781,.38),l(-.696,.259),l(-.248,.771),l(-.129,.972),l(.333,.136),l(.68,-.785),l(.387,-.292),l(.285,.051),l(.604,.528),l(-.088,.749),l(.743,-.205),l(.681,-.273),l(-.044,-.306),l(-.191,-.119),l(-.147,-.358),l(-.748,-.821),l(.188,-.223),l(.686,-.759),l(-.797,-.448),l(-.772,-.258),l(-.93,-.241),l(-.257,-.382),l(-.655,-.051),l(-.979,-.242),l(-1.34,-.207),l(-.307,-.296),l(.062,-.577),l(-.096,-.386),l(-.811,-.667),l(.081,-.247),l(.266,-.16),l(.484,-.125),l(2.31,-.11),l(2.54,-.022),l(2.125,-.128),l(1.421,-.162),l(.475,.317),l(.382,.052),l(.844,-.267),l(1.056,-.286),l(1.413,-.109),l(.589,.194),l(-.957,.338),l(-.451,.407),l(1.737,-.233),l(.521,-.107),l(.955,-.374),l(.27,-.284),l(-.334,-.444),l(-.326,-.177),l(-.925,-.266),l(-.365,-.303),l(-.002,-.232),l(.324,-.539),l(1.176,-.397),l(.966,-.22),l(3.028,-.903),l(.889,-.094),l(.248,-.036),l(.522,-.076),l(1.899,-.096),l(1.663,-.114),l(2.302,-.244),l(2.048,-.263),l(1.595,-.43),l(.855,-.243),l(1.763,.034),l(1.065,-.002),l(.383,.185),l(-.351,.409),l(1.504,.108),l(1.018,-.039),l(1.261,-.188),l(1.345,-.225),l(.95,-.039),l(.982,.166),l(.687,.073),l(.693,-.206),l(.12,-.335),l(-.133,-.167),l(.466,-.337),l(.942,-.077),l(.939,.036),l(1.243,-.377),l(-.618,-.506),l(.122,-.34),l(1.165,-.438),l(1.554,-.383),l(2.23,-.406),l(1.229,-.077),l(.993,.056),l(1.486,-.003),l(.86,.265),l(.045,.266),l(-1.528,.401),l(-.66,.342),l(.488,.15),l(1.83,-.117),l(1.588,.148),l(2.039,-.079),l(.177,.113),l(-.375,.283),l(-1.187,.453),l(-.296,.3),l(1.971,-.004),l(.833,-.02),l(.234,.093),l(1.052,-.545),l(1.366,-.002),l(1.771,-.097),l(.631,.13),l(1.35,-.021),l(1.954,.165),l(1.4,.259),l(1.181,.427),l(.52,.445),l(.726,-.001),l(.854,-.076),l(.422,.5),l(-1.354,.832),l(.241,.128),l(.896,.365),l(-2.329,.859),l(-1.035,.235),l(-1.166,.11),l(-3.404,1.061),l(-3.018,.965),l(-.793,.285),l(-2.388,.375),l(-2.35,.586),l(-2.065,1.126),l(.715,.017),l(1.081,-.247),l(.922,-.458),l(1.663,-.161),l(1.231,-.02),l(2.101,-.268),l(1.879,-.286),l(.879,-.107),l(1.004,-.284),l(-.094,-.389),l(-.492,-.123),l(-.034,-.071),l(.281,-.249),l(.581,-.214),l(.873,.211),l(.603,.389),l(.621,.052),l(.593,.193),l(.737,.052),l(.853,-.055),l(1.155,-.268),l(.499,.07),l(.192,.3),l(.009,.512),l(.522,.404),l(1.422,-.778),l(1.66,-.021),l(1.506,-.145),l(2.354,.014),l(1.919,.155),l(.854,.034),l(1.204,.033),l(-.271,.74),l(.354,.333),l(2.043,.154),l(.848,.121),l(.698,.069),l(1.035,.103),l(2.49,-.145),l(1.209,-.02),l(1.42,.348),l(1.405,-.932),l(-.161,-.352),l(-.038,-.229),l(-.034,-.105),l(1.806,-.48),l(.521,-.019),l(.802,.104),l(1.148,.298),l(.851,.281),l(1.711,.032),l(1.354,-.073),l(1.384,.033),l(1.323,.431),l(.409,.181),l(.058,.386),l(-.52,.088),l(-.268,.036),l(-1.905,.406),l(-2.438,.737),l(-.233,.227),l(.253,.069),l(1.033,.067),l(.957,.016),l(.659,.155),l(.659,.293),l(1.014,.396),l(.583,.172),l(.78,.481),l(1.27,.805),l(1.814,.801),l(1.351,.305),l(.612,-.018),l(.795,-.394),l(.843,-.72),l(1.093,-1.051),l(.601,-.329),l(.29,.017),l(.236,.465),l(.772,.308),l(1.346,.29),l(1.105,.135),l(.848,-.087),l(1.973,-.468),l(.778,-.07),l(.813,.067),l(1.196,.239),l(1.921,.734),l(.315,-.052),l(.186,-.069),l(.491,-.258),l(.221,-.258),l(-.137,-.051),l(.013,-.189),l(.726,-.312),l(.509,-.018),l(.5,.257),l(.575,.188),l(1.302,.032),l(.181,-.5),l(-.194,-.466),l(.15,-.363),l(.093,-.521),l(-1.131,.159),l(-.643,.001),l(-.179,-.104),l(.442,-.296),l(.318,-.087),l(.986,-.089),l(1.021,-.02),l(.832,-.141),l(1.566,-.648),l(.254,0),l(1.76,.241),l(1.561,.137),l(2.036,.188),l(.997,.068),l(.654,.103),l(2.307,.065),l(-1.732,.628),l(.865,.051),l(1.011,-.089),l(.335,.138),l(-.305,.381),l(-.926,.192),l(-.846,.261),l(-.177,.293),l(.664,.033),l(.52,-.122),l(.916,-.14),l(.978,-.33),l(1.62,-.799),l(2.766,.012),l(1.196,.067),l(.903,.172),l(.946,.137),l(.205,.19),l(.221,.104),l(-2.247,.59),l(.559,.137),l(1.674,.289),l(2.174,.202),l(.946,.204),l(.801,.375),l(.367,.427),l(.564,.357),l(.522,.152),l(1.459,-.037),l(1.364,-.105),l(1.138,-.139),l(2.518,-.329),l(2.208,-.107),l(3.008,.131),l(1.515,.134),l(.734,.118),l(1.168,.424),l(.655,.169),l(.525,.338),l(.361,.39),l(-.123,.491),l(-.286,.521),l(.509,.25),l(.764,.065),l(.835,.015),l(.643,.083),l(-.017,.685),l(.419,.416),l(.686,-.168),l(.545,-.435),l(1.211,-.387),l(.348,-.067),l(.35,.049),l(1.696,-.02),l(1.521,-.288),l(.736,.032),l(.588,.434),l(.707,.116),l(1.541,.014),l(2.176,.062),l(.869,-.118),l(1.378,-.504),l(.406,.2),l(.93,.533),l(.396,.216),l(1.095,.265),l(.875,.332),l(.282,.398),l(.612,.148),l(1.556,-.136),l(1.653,-.319),l(.16,-.25),l(-.248,-.333),l(-.805,-.833),l(-.833,-.115),l(.4,-.336),l(.479,-.571),l(1.89,.098),l(1.214,.082),l(1.135,.065),l(1.221,.166),l(.222,.318),l(1.396,-.153),l(2.084,-.054),l(2.304,.013),l(1.292,.148),l(.786,.199),l(1.185,.199),l(1.391,.098),l(.751,.182),l(1.302,.332),l(.747,.065),l(.703,.182),l(1.145,.505),l(0,2.126),l(0,2.222),l(0,2.222),l(0,1.292),l(0,.157),l(0,.576),l(0,.219),l(-1.083,.371),l(-.651,.03),l(-.645,.37),l(-.56,.065),l(-1.044,.065),l(-.355,-.079),l(-.928,-.052),l(-.118,-.343),l(-.271,-.211),l(-.501,.027),l(.241,-.185),l(-.938,.324),l(-.846,.02),l(-.337,-.211),l(-.478,-.079),l(.424,.501),l(-.569,.29),l(.32,.103),l(.942,.205),l(.634,-.36),l(.395,.041),l(.335,.079),l(0,.477),l(.248,.206),l(.76,.269),l(1.059,-.228),l(-.439,.322),l(.741,-.243),l(.065,.336),l(.247,.206),l(.187,.363),l(.068,.189),l(-.722,.522),l(.593,-.064),l(.349,.172),l(.473,.503),l(.501,.157),l(.145,.251),l(-.162,.456),l(.792,-.111),l(-.125,.393),l(.023,.25),l(-.43,.299),l(-.691,.205),l(-.635,-.046),l(-.448,-.14),l(-1.243,-.154),l(-.889,-.077),l(-.347,-.14),l(.123,-.267),l(-.493,-.046),l(-.304,.032),l(-.559,.55),l(-.069,.11),l(-3.06,.913),l(-1.155,.174),l(-.245,0),l(-.43,.203),l(-.219,.188),l(-.719,.22),l(-.991,.033),l(-.308,.11),l(-.48,.405),l(-.462,.203),l(-.946,.033),l(-.854,.622),l(-.24,.279),l(-1.67,.452),l(-.392,.449),l(-1.229,.25),l(-.406,.14),l(-.151,.293),l(.01,.292),l(-.473,.292),l(-.406,.016),l(-.586,-.306),l(-.183,-.262),l(-.169,-.37),l(-.67,-.308),l(-1.074,-.044),l(-1.021,.048),l(-1.159,.172),l(-1.301,.188),l(-.523,.217),l(-1.333,.756),l(-.536,.277),l(-.184,-.138),l(.575,-1.293),l(-.55,.094),l(-.392,-.097),l(-.811,.531),l(-.67,.186),l(-.401,.155),l(-.114,.506),l(-.66,.154),l(-.317,-.168),l(-.253,-.49),l(-.483,-.261),l(-1.024,.636),l(.261,-.204),l(-.557,.062),l(-.283,.092),l(-.628,.522),l(-.141,.261),l(.126,.229),l(.344,.152),l(-.932,.521),l(-.182,.199),l(.342,.167),l(-.647,.352),l(-.88,.55),l(-.626,.503),l(-.298,.35),l(-.01,.531),l(.421,.317),l(.477,.09),l(1.382,-.048),l(.562,.166),l(.11,.167),l(-.436,.394),l(-.752,.455),l(-.181,.302),l(.224,.512),l(.292,.452),l(.786,.089),l(.165,.391),l(-.014,.616),l(-.349,.361),l(-.528,.061),l(-.481,-.209),l(-.017,-.21),l(.388,-.527),l(-.444,-.014),l(-.454,.242),l(-1.014,.843),l(-.56,.675),l(-.237,.599),l(.321,.672),l(.647,.311),l(.154,.237),l(-.294,.387),l(-.688,.313),l(-.956,.031),l(-.664,-.088),l(-.344,.001),l(-.619,.179),l(-.837,.476),l(-.214,.149),l(-.525,.504),l(-.137,.341),l(.111,.281),l(.492,.398),l(.038,.221),l(-.056,.133),l(-.679,.238),l(-.604,.016),L(753.44,82.4),l(-.727,.296),l(-.065,.251),l(.067,.28),l(-.161,.854),l(-.293,.412),l(-.8,.78),l(-1.53,.971),l(-.854,.5),l(-.285,.103),l(-.295,-.614),l(-.198,-.821),l(-.25,-.69),l(-.064,-.794),l(-.351,-.75),l(-.305,-.383),l(-.214,-.915),l(-.514,-1.36),l(-.008,-.578),l(-.154,-.563),l(-.017,-.327),l(-.105,-.193),l(-.262,-.817),l(-.026,-.792),l(.116,-.808),l(.271,-1.396),l(.167,-.226),l(1.185,-.86),l(.716,-.424),l(.57,-.695),l(.14,-.227),l(-.085,-.318),l(-.139,-.166),l(1.632,-.367),l(1.001,-.305),l(.811,-.32),l(1.729,-.884),l(.641,-.412),l(.431,-.428),l(.14,-.335),l(1.784,-.889),l(.872,-.445),l(1.535,-.861),l(.368,-.293),l(.26,-.433),l(1.252,-.435),l(2.106,-.514),l(.257,-.434),l(.773,-.528),l(.086,-.233),l(-.568,-.216),l(.814,-.904),l(-.036,-.483),l(.183,-.391),l(.598,-.204),l(1.729,-.082),l(.513,-.063),l(-.485,-.328),l(-2.065,-.215),l(-.71,.095),l(-1.062,.174),l(-.777,.189),l(.042,.328),l(-.664,.923),l(.125,.202),l(-.04,.14),l(-.662,.11),l(-.479,.11),l(-1.555,.718),l(-1.979,1.042),l(-1.169,.342),l(-.249,-.062),l(.156,-.325),l(.352,-.465),l(-.933,-.076),l(-.16,-.263),l(.252,-.451),l(.442,-.467),l(.207,-.328),l(-.069,-.202),l(-.339,-.031),l(-1.136,.454),l(-.496,.032),l(-.277,-.358),l(-.589,-.17),l(-1.606,.144),l(-1.312,.111),l(-.956,.08),l(-.606,.157),l(-.894,.359),l(-.093,.436),l(.082,.186),l(-1.262,.53),l(-.408,.233),l(.149,.495),l(-1.294,.357),l(-1.019,.434),l(-.84,.479),l(-.496,.461),l(-.332,.46),l(.004,.383),l(.527,.213),l(1.269,.043),l(.278,.275),l(.062,.122),l(-1.152,.139),l(-1.028,.262),l(-1.045,-.059),l(-.698,-.136),l(-.382,.031),l(-.311,.107),l(-.721,.398),l(-.695,-.35),l(-1.112,.383),l(-.747,.139),l(-.487,-.09),l(-.284,-.137),l(.108,-.29),l(.748,-.124),l(.868,-.124),l(.164,-.046),l(-.741,-.64),L(736.444,68),l(-1.06,.017),l(-.854,.155),l(-.353,-.061),l(-.868,-.458),l(-.775,-.029),l(-.745,.047),l(-.704,.246),l(.042,.398),l(-.26,.229),l(-.477,.215),l(-.695,-.243),l(-.408,-.122),l(-1.26,.063),l(-.784,.093),l(-.651,-.075),l(-.887,-.136),l(-.563,.078),l(-.067,.122),l(-.147,.474),l(-.677,.017),l(-.311,-.137),l(-.038,-.382),l(-.203,-.259),l(-1.241,.094),l(-1.014,-.059),l(-1.257,.033),l(-1.158,.063),l(-.836,-.029),l(-.18,.016),l(-1.085,.292),l(-.964,.444),l(-.74,.474),l(-.536,.504),l(-.789,.245),l(-.904,.336),l(-.194,.152),l(-1.047,1.17),l(-1.634,.684),l(-.949,.471),l(-1.157,.711),l(-1.653,1.253),l(-.828,.572),l(-1.573,.873),l(-.893,.376),l(-1.889,.871),l(-.632,.388),l(-.203,.298),l(.018,.357),l(.428,.281),l(.485,.043),l(.918,.013),l(1.046,-.15),l(.656,.043),l(-.329,1.261),l(.016,.415),l(.303,.103),l(.63,-.09),l(.601,-.371),l(.761,.117),l(-.127,.148),L(705.293,81),l(-.112,.222),l(.373,.073),l(1.645,-.018),l(.566,-.238),l(.39,-.519),l(.017,-.638),l(.763,.014),l(.647,-.001),l(.726,.014),l(.951,.265),l(.658,.354),l(.486,.591),l(.847,.575),l(.426,.176),l(.506,.324),l(-.07,.148),l(-.581,.355),l(.453,.221),l(.13,.309),l(-.336,.723),l(.491,.117),l(.215,.235),l(-.291,.515),l(-.348,.397),l(-.532,.559),l(-.724,1.364),l(-.181,.688),l(.057,.219),l(.24,.701),l(-.188,.917),l(-.098,.741),l(-.403,1.408),l(-.146,.493),l(-1.928,1.538),l(-.371,.435),l(-.217,.65),l(-.587,.42),l(-.741,.579),l(-.241,.361),l(-.574,.981),l(-.587,.606),l(-.941,.778),l(-1.784,1.512),l(-.464,.474),l(-.235,.458),l(-.323,.33),l(-.758,.388),l(-.618,.416),l(-.574,.702),l(-.431,.458),l(-.875,.673),l(-.955,.487),l(-1.838,.475),l(-.798,.244),l(-.278,-.427),l(-.519,-.085),l(-.243,.043),l(-.337,-.185),l(-.337,-.513),l(-.663,.272),l(-.464,.101),l(.424,-.586),l(-.624,.173),l(-.506,.486),l(-.649,.543),l(-1.326,1.001),l(-.072,.049),l(-.167,-.393),l(-.298,-.439),l(.111,-.058),l(1.252,-.462),l(.511,-.43),l(.156,-.329),l(-.112,-.299),l(.097,-.128),l(.025,-.385),l(.006,-.613),l(-.062,-.656),l(-.332,-.897),l(.048,-.557),l(1.664,-.982),l(.396,.041),l(.685,.24),l(.679,.225),l(.547,.098),l(.47,-.347),l(.551,-.69),l(.329,-.432),l(.627,-1.08),l(.538,-1.066),l(.278,-.893),l(.291,-.707),l(.66,-.393),l(.566,-.407),l(-.017,-.504),l(-.116,-.389),l(-.064,-.259),l(-.246,-.114),l(-.902,.034),l(-1.181,.208),l(-1.357,.31),l(-.953,.308),l(-.604,.22),l(-1.657,.052),l(-.649,.018),l(-.68,.033),l(-.261,-.446),l(-.44,-1.283),l(-.297,-.866),l(-.205,-.144),l(-2.659,-.839),l(-1.523,-.253),l(-1.247,-.341),l(-.507,-.2),l(-.436,-.389),l(-.927,-1.903),l(-.94,-1.588),l(-1.087,-2.384),l(-.742,-.952),l(-.763,-.467),l(-.539,-.026),l(-1.386,.125),l(-.683,-.188),l(-1.037,-.481),l(-1.148,-.215),l(-.917,.049),l(-1.203,.109),l(-.836,.123),l(-1.854,.143),l(-.602,.136),l(-.478,.165),l(-1.193,.787),l(-.375,.282),l(-.119,.25),l(.822,-.078),l(.558,.026),l(.465,.306),l(.107,.249),l(-.167,.794),l(-1.371,.608),l(-.599,.545),l(-.667,.779),l(-.416,.543),l(-.422,.426),l(-.103,.249),l(.062,.146),l(.35,.348),l(.056,.306),l(-.123,.233),l(-.779,.339),l(-2.44,.752),l(-.438,.089),l(-.343,.016),l(-1.126,-.574),l(-.452,-.172),l(-.046,-.018),l(-.431,-.168),l(-.622,.018),l(-1.228,.297),l(-.86,-.169),l(-.34,-.129),l(-.751,-.506),l(-.74,-.156),l(-.609,.047),l(-.333,.002),l(-1.165,.487),l(-.755,.498),l(-.447,.394),l(-.604,.264),l(-.526,.163),l(-1.147,.136),l(-.867,.106),l(-.532,.075),l(-1.018,.063),l(-1.602,.11),l(-.739,-.039),l(-.984,-.082),l(-.905,-.241),l(-1.318,-.254),l(-.812,-.373),l(-1.132,-.313),l(-.623,-.331),l(-1.333,-.75),l(-.769,-.229),l(-1.423,-.022),l(-1.172,-.037),l(-.796,.077),l(-2.48,.538),l(-.673,-.113),l(-1.643,-.531),l(-.421,-.333),l(-.408,-.451),l(-.182,-.481),l(-.004,-.541),l(-.145,-.204),l(-.767,-.143),l(-.989,-.317),l(-.702,-.231),l(-1.748,-.328),l(-1.036,-.185),l(-1.028,-.098),l(-.84,-.201),l(-1.269,.96),l(-.905,.839),l(-.098,.293),l(.409,.86),l(.396,.304),l(.116,.204),l(-.163,.526),l(-.744,.572),l(-.31,.162),l(-.755,.28),l(-.562,.018),l(-.576,-.186),l(-.312,-.114),l(-.875,-.068),l(-.85,.004),l(-.719,-.083),l(-1.458,.008),l(-.699,-.113),l(-.393,-.406),l(-.694,-.755),l(-.831,-.083),l(-1.842,-.122),l(-.932,-.156),l(-.953,-.097),l(-.84,.18),l(-1.512,.476),l(-1.143,.341),l(-.787,.398),l(-.971,.692),l(-.017,.012),l(-.727,.381),l(-.603,.148),l(-1.387,.08),l(-.599,.207),l(-.799,.425),l(-.154,.044),l(-.244,.074),l(-.569,.003),l(-.228,.014),l(-.064,-.145),l(-.589,0),l(-.294,-.478),l(-.441,-.331),l(.073,-.331),l(-.625,.184),l(-.478,.368),l(-.993,-.074),l(-.882,-.073),l(-.662,-.699),l(-.588,-.552),l(-.956,-.147),l(-.331,-.625),l(-.772,-.588),l(-.698,-.441),l(-.993,.037),l(-.771,.221),l(-.993,.221),l(-.992,0),l(-.589,0),l(-.184,-.184),l(-.258,-.257),l(-.478,0),l(0,-.368),l(-.367,-.331),l(-.92,0),l(-.367,.515),l(-.331,.257),l(-.515,.257),l(-1.104,-1.434),l(-.846,-.882),l(-1.69,-2.133),l(-1.066,-1.029),l(-1.287,-.772),l(-.809,-.294),l(-1.104,-.588),l(.11,-.368),l(.515,-.11),l(0,-.441),l(-.809,.074),l(-.515,.22),l(-.772,.221),l(-.956,.515),l(-1.103,.257),l(-.772,.441),l(-.294,.294),l(-.552,-.184),l(-.441,-.037),l(-.771,.073),l(-.441,.11),l(-.331,-.184),l(.331,-.441),l(.441,-.184),l(.146,-.294),l(-.367,0),l(-.441,.221),l(-.478,-.11),l(-.405,-.294),l(-.478,-.037),l(-.184,.147),l(-.147,.147),l(-.367,-.221),l(-.295,-.368),l(-.294,-.11),l(-.331,.221),l(-.367,-.074),l(-.368,.147),l(-.44,-.11),l(-.295,.147),l(-.478,-.074),l(-.184,-.257),l(.33,-.037),l(-.073,-.331),l(.147,-.257),l(.11,-.331),l(-.515,-.22),l(-.147,-.221),l(.037,-.331),l(-.368,-.404),l(-.882,.037),l(-.625,.11),l(-.772,-.257),l(-.515,-.11),l(-.919,-.147),l(-.735,.037),l(-.11,.221),l(-.589,.184),l(-.515,.037),l(0,.294),l(-.367,.368),l(-.625,.074),l(-1.876,.073),l(-2.021,.405),l(-1.177,.037),l(-.625,.331),l(-.221,.331),l(-.331,-.073),l(-.588,.073),l(-1.545,.11),l(-.735,.11),l(-1.029,.037),l(-1.396,.405),l(-.368,.184),l(-.772,0),l(-.515,0),L(537.304,80),l(-.33,.074),l(-.185,.515),l(.074,.441),l(.294,.221),l(-.294,.074),l(0,.331),l(1.065,.11),l(.956,.294),l(-.11,.257),l(-.515,.073),l(-1.103,-.147),l(-.698,.184),l(-.662,.515),l(.146,.257),l(.441,.478),l(-.331,.294),l(-.588,.147),l(-.735,.368),l(-.467,.067),l(.164,.274),l(.239,0),l(.377,.137),l(-.068,.171),l(.377,.137),l(.651,.069),l(.274,.308),l(1.165,.171),l(.24,.24),l(-.138,.686),l(-.137,.309),l(-1.577,.411),l(-.959,-.034),l(-.343,-.343),l(-.24,0),l(-.171,.309),l(-.651,.343),l(-.411,-.171),l(-.754,-.137),l(-.926,-.309),l(-.274,-.548),l(-.754,-.103),l(-1.062,.103),l(-.137,.412),l(-.617,.068),l(-.651,-.411),l(-.65,-.035),l(-.823,-.068),l(-.514,.377),l(-.377,.343),l(-.274,.274),l(-.686,.171),l(-.411,-.24),l(-.686,-.137),l(-.582,-.548),l(-.72,-.068),l(.034,.24),l(.205,.48),l(-.239,.274),l(-.274,-.137),l(-.068,-.583),l(-.411,-.274),l(-.789,-.343),l(-.582,-.206),l(0,-.343),l(-.96,-.171),l(-.617,.069),l(-.788,-.035),l(-.411,-.514),l(-.411,-.069),l(-.617,.24),l(-.273,.137),l(-.651,.137),l(-.309,-.274),l(-.479,0),l(-.651,-.069),l(-.515,.309),l(-.548,.343),l(-.788,.377),l(-.549,.068),l(-.514,.171),l(-.309,.309),l(-.172,.24),L(509.58,87.5),l(-.479,.206),l(.068,.445),l(.171,.411),l(-.068,.446),l(-.411,.24),l(-.651,0),l(-.514,-.411),l(-.48,-.548),l(-.514,-.24),l(-.411,.069),l(-.103,.308),l(-.343,.549),l(-.823,.137),l(-.205,1.303),l(.343,.171),l(.239,.274),l(-.239,.206),l(-.446,.274),l(-.65,1.165),l(1.37,.343),l(.138,.377),l(-.068,.309),l(.514,.514),l(.103,-.343),l(.583,.206),l(.343,-.034),l(.514,.034),l(.515,.445),l(.479,.206),l(.343,.514),l(.96,1.131),l(-.138,.103),l(-.445,-.103),l(-.309,-.103),l(-.343,.103),l(.068,.308),l(.857,.377),l(.616,.19),l(-.167,.2),l(-.399,.28),l(-.38,.12),l(-.12,0),l(0,.14),l(0,.22),l(-.14,.08),l(-.3,-.2),l(-.34,.2),l(-.399,.26),l(-.64,.12),l(-.319,.08),l(-.26,-.08),l(-.181,-.08),l(-.1,.04),l(-.06,.16),l(.12,.26),l(-.221,.2),l(-.18,.3),l(-.18,.319),l(-.319,.42),l(-.18,.28),l(-.32,.16),l(-.34,.24),l(-.14,.32),l(.08,.2),l(.34,.2),l(.319,.04),l(.18,.3),l(.24,.04),l(.239,.34),l(.28,.419),l(-.06,.38),l(-.101,.2),l(.061,.16),l(.1,-.2),l(.1,-.34),l(.12,-.22),l(.16,-.02),l(-.141,.439),l(-.22,.36),l(.061,.4),l(.12,.1),l(-.16,.2),l(-.04,.4),l(.38,.24),l(.119,.1),l(.12,.52),l(.28,.06),l(.359,.42),l(.2,.28),l(.439,.419),l(.18,.36),l(.359,.06),l(.047,.146),l(-.292,.449),l(-.496,.284),l(-.283,.094),l(-.308,.331),l(-.165,.213),l(-.379,.047),l(-.449,-.142),l(-.591,-.094),l(0,-.308),l(-.283,-.284),l(-.118,0),l(-.095,-.118),l(-.473,-.284),l(-.142,-.189),H(504.5,0),l(-.213,.047),L(504.264,107),l(-.229,.023),l(-.126,-.189),l(-.236,-.071),l(-.236,.023),l(-.284,-.047),l(-.26,-.094),l(-.284,-.166),l(-.354,-.284),l(.118,-.307),l(.118,-.189),l(-.118,-.142),l(-.354,-.024),l(-.378,0),l(-.213,-.166),l(-.189,-.118),l(-.212,0),l(-.143,-.094),l(-.236,-.118),l(-.118,0),l(-.095,.071),l(-.142,.166),l(-.188,-.142),l(-.261,-.071),l(-.354,0),l(-.213,.071),l(-.094,.095),l(-.166,.166),l(-.283,0),l(-.261,.118),l(-.212,-.071),l(-.261,-.118),l(.048,-.118),l(.142,-.118),l(-.308,-.119),l(-.236,-.118),l(-.354,-.071),l(-.52,-.118),l(-.284,-.213),l(-.095,-.142),l(-.354,-.166),l(-.283,.047),l(-.189,0),l(-.401,-.166),l(-.544,0),l(-.426,.095),l(-.307,0),l(-.355,-.047),l(-.307,-.071),l(-.261,-.095),l(-.212,-.166),l(-.213,0),l(-.331,0),l(-.189,-.047),l(-.188,-.094),l(-.284,-.142),l(-.283,-.095),l(-.449,-.023),l(-.402,-.023),l(-.07,-.047),l(-.284,-.047),l(-.26,.166),l(-.112,.309),l(-1.421,-1.012),l(-1.188,-.842),l(-.817,-.385),l(-.62,-.084),l(-.373,-.157),l(-.509,-.5),l(-.236,-.057),l(-.338,.159),l(-.329,-.042),l(-.347,-.515),l(-.795,-.674),l(.595,-.188),l(.519,-.001),l(.445,-.073),l(.1,-.519),l(.359,-.476),L(485,97.85),l(.526,-.03),l(.516,-.131),l(-.432,-.532),l(-.654,-.273),l(-.474,-.36),l(.243,-.116),l(.367,-.03),l(.82,-.117),l(.715,-.348),l(1.244,-.436),l(-.196,-.375),l(-.076,-.058),l(-.799,.088),l(-1.312,.175),l(.012,-.126),l(.021,-.112),l(0,-.224),l(.09,-.514),l(.224,-.089),l(.357,-.022),l(.38,-.134),l(.223,-.179),l(.022,-.179),l(.269,0),l(.736,-.045),l(.805,.157),l(.335,-.134),l(0,-.156),l(.156,-.291),l(.156,-.491),l(-.066,-.067),l(-.09,-.201),l(-.045,-.179),l(-.044,-.134),l(-.179,-.067),l(-.156,-.067),l(.044,-.224),l(.045,-.179),l(.246,0),l(.312,0),l(.134,-.156),l(-.29,-.044),l(-.269,-.089),l(-.223,-.246),l(.312,-.044),l(.357,-.201),l(.156,-.067),l(.201,-.089),l(.045,-.224),l(-.09,-.179),l(-.111,-.089),l(.022,-.179),l(.089,-.111),l(-.156,-.089),l(-.201,.089),l(-.134,.044),l(-.269,0),l(-.357,-.156),l(-.111,-.224),l(-.469,-.022),l(-.291,-.089),l(-.201,-.179),l(-.357,.067),l(-.268,-.112),l(-.469,-.112),l(-.425,-.067),l(-.29,-.268),l(-.224,.067),l(-.045,.157),l(-.29,.134),l(-.224,-.112),l(-.179,-.179),l(-.402,-.044),l(-.022,-.134),l(-.201,-.179),l(0,-.134),l(-.268,-.179),l(-.111,-.156),l(-.357,.067),l(-.536,.134),l(-.269,0),l(-.312,.112),l(-.425,.112),l(-.179,-.156),l(-.179,-.022),l(-.201,.067),l(-.469,-.291),l(-.268,-.067),l(-.47,.067),l(-.268,.179),l(-.291,-.29),l(-.179,-.089),l(-.089,-.224),l(.089,-.179),l(-.089,-.246),l(-.224,-.268),l(0,-.357),l(-.402,0),l(0,-.312),l(-.38,-.022),l(-.514,.067),l(-.156,-.112),l(-.647,0),l(-.269,-.29),l(-.111,-.357),l(-.134,-.291),l(.312,-.134),l(.312,.022),l(0,-.268),l(-.312,-.156),l(-.246,-.156),l(-.134,-.201),l(-.246,-.335),l(-.312,-.134),l(-.201,-.268),l(-.514,.134),l(-.692,-.112),l(-.67,.223),l(-.536,.022),l(-.536,-.246),l(-.134,.268),l(-.179,.291),l(-.313,.156),l(-.469,-.022),l(-.357,-.089),M(527.156,37.071),l(-.59,-.14),l(-.955,-.21),l(-1.128,-.139),l(-.739,.054),l(-.959,.037),l(-.732,.143),l(-.411,-.105),l(-1.025,-.476),l(.737,-.303),l(1.21,-.429),l(.654,-.09),l(1.549,-.002),l(.135,-.357),l(-.728,-.338),l(.351,-.269),l(.419,-.144),l(.676,-.02),l(.852,-.181),l(-.25,-.161),l(-.526,-.233),l(1.539,-.895),l(.513,-.129),l(.226,.073),l(.892,.017),l(.981,-.535),l(.863,-.333),l(1.02,-.261),l(.975,-.15),l(1.305,-.113),l(1.274,.053),l(.738,-.15),l(.786,-.615),l(.273,.018),l(.873,-.132),l(1.722,.276),l(.471,-.038),l(1.93,-.321),l(.958,-.039),l(2.184,-.247),l(1.864,-.116),l(.771,-.564),l(.376,-.152),l(2.511,-.137),l(1.965,-.079),l(.471,.131),l(.442,.225),l(.154,.357),l(-.812,.47),l(-.541,.169),l(-1.346,.319),l(-2.609,.433),l(-4.329,.49),l(-2.187,.281),l(-2.122,.299),l(-1.842,.316),l(-2.102,.242),l(-.941,.203),l(-.288,.274),l(.644,.216),l(-.422,.217),l(-.943,.361),l(-.527,.037),l(-2.047,-.068),l(-.432,.18),l(-.119,.233),l(.621,.249),l(-.331,.233),l(-1.206,.448),l(-.402,-.142),l(-.752,-.087),l(-.592,.304),l(.877,.283),l(.052,.319),l(-1.094,.657),l(-.822,.284),M(517.491,38.443),l(1.041,-.37),l(.512,-.299),l(.428,-.212),l(1.426,-.021),l(1.316,-.249),l(.987,-.02),l(1.412,-.091),l(.551,.069),l(.988,.227),l(-.063,.176),l(-.463,.528),l(-.302,.158),l(-.697,.071),l(-.443,.228),l(-.233,.385),l(.006,.818),l(.445,1.039),l(.957,.826),l(.505,.308),l(.775,.307),l(1.162,.392),l(-.028,.282),l(-2.62,-.089),l(-.844,.053),l(-.917,.326),l(-.596,.086),l(-.676,-.494),l(-.382,-.034),l(-1.091,.088),l(-.673,-.102),l(-.031,-.359),l(1.347,-.362),l(.073,-.24),l(-.102,-.017),l(-.944,-.273),l(-1.442,-.411),l(-1.519,-.17),l(-.33,.156),l(-.624,.122),l(-.681,-.033),l(-.625,-.396),l(-.114,-.415),l(.229,-.312),l(.39,-.209),l(.344,-.036),l(.318,.104),l(.65,.016),l(.518,-.192),l(1.121,-.768),l(.243,-.35),l(-.322,0),l(-.981,-.243),M(.125,56.089),l(0,-.562),l(0,-.576),l(0,-.157),l(0,-1.292),V(0,51.28),l(0,-2.222),l(0,-2.12),l(2.917,.61),l(1.693,.598),l(.933,.181),l(3.819,.99),l(1.059,.395),l(.204,.149),l(.074,.214),l(.445,.429),l(.406,.789),l(-.209,.428),l(1.034,.8),l(.982,.26),l(-.02,-.18),l(.297,-.148),l(-.051,-.196),l(-.638,-.392),l(.016,-.542),l(.077,-.296),l(1.026,-.183),l(.984,.278),l(.573,.098),l(.767,.064),l(1.003,-.117),l(.933,.13),l(.93,.425),l(.694,.359),l(1.676,.684),l(.32,.081),l(.584,.179),l(.43,.211),l(.09,.13),l(-.343,.033),l(-1.026,-.096),l(-.364,.034),l(-.808,.798),l(-1.539,-.468),l(.138,.178),l(.438,.227),l(.465,.324),l(-1.177,-.111),l(-1.008,.05),l(-1.202,-.387),l(-.708,-.096),l(.135,.129),l(.289,.259),l(.084,0),l(.561,.259),l(.205,.307),l(.131,.453),l(-.056,.339),l(-.814,.05),l(-.805,.065),l(-.189,.161),l(.5,.865),l(-.115,.272),l(-1.04,-.078),l(-.397,.081),l(-1.193,-.174),l(-.264,-.352),l(-1.795,-.51),l(-.253,.273),L(9.85,55.79),l(-.276,-.161),l(-.265,-.403),l(.174,-.178),l(-.321,-.42),l(-.87,-.339),l(-.565,-.063),l(-.762,.034),l(-.858,.229),l(-1.343,.084),L(3.57,54.443),l(.059,-.325),l(-.155,-.325),l(-.618,-.487),L(1.958,53.43),l(-.45,.409),l(-.655,1.228),l(-.166,.715),l(-.562,.307), +N(449.401,22.792),l(-1.596,-.014),l(-2.019,-.016),l(-1.739,.063),l(-.764,.061),l(-1.972,-.316),l(.812,-.456),l(.826,-.172),l(.735,-.453),l(1.148,-.588),l(1.354,.691),l(.998,.105),l(1.116,-.088),l(.9,.084),l(.704,.341),l(.865,-.323),l(.53,-.454),l(.868,-.306),l(-.311,.823),l(.086,.32),l(.851,-.001),l(.991,-.495),l(1.061,-.261),l(.803,.128),l(.559,.472),l(.705,.041),l(2.007,-.111),l(1.543,.189),l(.551,.376),l(-.507,.201),l(-2.004,.622),l(-1.623,.38),l(-1.069,.062),l(-.976,.14),l(-1.324,.366),l(-6.271,-.097),l(-.033,-.377),l(1.492,-.26),l(.702,-.677),M(430.027,22.752),l(.068,.697),l(.252,.119),l(1.694,.155),l(.221,-.377),l(.13,-.418),l(.573,-.141),l(.523,-.041),l(.949,.477),l(1.192,.771),l(.798,.235),l(.568,-.218),l(-.222,-.296),l(-.46,-.356),l(-.327,-.477),l(-.04,-.22),l(.91,-.407),l(1.001,.103),l(.485,.18),l(1.278,.018),l(.586,.179),l(-.08,.419),l(-.169,.298),l(.104,.159),l(.549,.118),l(.743,-.338),l(.44,-.1),l(.662,.396),l(.678,.335),l(.785,.156),l(.948,.117),l(1.672,.429),l(.498,.234),l(-1.305,.277),l(-1.981,.218),l(-.696,.293),l(-.731,1.144),l(-.885,.885),l(-1.243,.117),l(-.766,.535),l(-.455,.589),l(-.029,.378),l(-.786,.209),l(-.556,-.018),l(-1.593,-.355),l(-1.883,-.507),l(-1.365,-.568),l(.651,-.364),l(1.565,-.041),l(1.788,-.137),l(.944,-.386),l(-.652,-.249),l(-1.822,.139),l(-1.566,.118),l(-1.694,.042),l(-.502,-.519),l(.959,-.06),l(1.371,-.215),l(2.149,-.314),l(1.547,-.45),l(-2.525,-.405),l(-.881,-.292),l(-.589,.138),l(-1.036,.646),l(-1.069,.293),l(-.562,.059),l(-1.236,-.172),l(-.338,-.174),l(-1.05,-.368),l(-.807,-.233),l(-.698,-.41),l(1.698,-.396),l(-.817,-.571),l(-1.359,.319),l(-.467,-.078),l(-.924,-.751),l(.812,-.36),l(.516,-.021),l(1.075,-.122),l(1.017,.038),l(.577,-.061),l(1.188,-.042),M(425.42,68.82),l(-.148,-.21),l(-.629,.132),l(-.134,-.026),l(-.249,-.237),l(-.239,-.343),l(.188,-.158),l(-.143,-.291),l(-.361,.185),l(-.062,.29),l(.113,.237),l(-.147,.105),l(-.339,.316),l(-.086,.185),l(-.521,.105),l(-.533,-.131),l(-.781,.342),l(.057,.131),l(-.502,.289),l(-.498,.263),l(-1.658,.813),L(418.697,71),l(-.274,.052),l(-.271,0),l(-2.111,.209),l(-.188,-.236),l(-.33,-.131),l(-.183,.209),L(414.976,71),l(.384,-.184),l(-.935,-.236),l(-.794,-.341),l(-.574,-.052),l(-.479,-.578),l(.292,-.368),l(-.126,-.21),l(.34,.026),l(.085,.316),l(.284,-.21),l(.667,.263),l(-.244,-.197),l(.127,-.145),l(.5,-.092),l(-.479,.026),l(-.245,.105),l(-.263,-.184),l(-.111,-.132),l(.579,-.276),l(.455,-.185),l(-.482,.066),l(-.317,-.132),l(.441,-.237),l(.083,-.237),l(-.661,.475),l(-.036,-.264),l(-.265,-.171),l(.005,.211),l(.076,.171),l(-.419,.158),l(-.41,0),l(.014,-.277),l(-.15,.264),l(-.235,-.079),l(-.2,-.448),l(.658,-.449),l(.08,.436),l(.068,-.317),l(.438,.158),l(.211,-.092),l(-.166,-.106),l(.674,-.079),l(.479,-.251),l(-.611,.159),l(-.48,0),l(-.335,-.159),l(.196,-.132),l(.387,-.146),l(.196,-.471),l(-.821,-.014),l(-.546,.094),l(-.406,-.309),l(.368,-.14),l(.643,-.404),l(-.212,-.186),l(-.445,.063),l(-.399,-.062),l(-.211,-.217),l(.284,-.482),l(.619,-.265),l(-.595,-.248),l(-.225,-.374),l(.272,-.188),l(-.089,-.687),l(.106,-.094),l(.594,-.063),l(.392,-.045),l(.455,.044),l(.082,-.11),l(-.255,-.134),l(-.425,-.118),l(-.228,-.17),l(.098,-.188),l(.211,-.125),l(.575,-.064),l(.511,-.346),l(.567,.109),l(.498,-.111),l(.179,-.55),l(.835,.093),l(.668,.125),l(.571,-.252),l(-.989,-.234),l(-.266,-.314),l(.236,-.143),l(1.151,.014),l(.851,-.08),l(.538,.219),l(.06,-.473),l(.477,-.27),l(.297,-.333),l(.78,-.175),l(.438,.189),l(.138,.079),l(.5,-.476),l(.869,-.413),l(.084,-.429),l(.437,-.398),l(1.497,-.735),l(.335,-.192),l(.235,-.048),l(.481,.175),l(.335,-.001),l(.319,-.224),l(-.225,-.223),l(.141,-.128),l(.488,-.224),l(.457,-.305),l(.481,-.483),l(.245,.064),l(.676,-.017),l(-.067,-.612),l(-.471,-.112),l(.434,-.405),l(.511,-.648),l(.841,.063),l(.047,-.341),l(.096,-.228),l(.954,-.116),l(-.396,-.357),l(-.327,-.097),l(-.193,-.146),l(.164,-.245),l(.313,-.246),l(.464,.048),l(.888,-.067),l(-.543,-.522),l(.249,-.082),l(.435,-.034),l(.707,-.263),l(.592,-.067),l(.308,-.208),l(-.358,-.064),l(-.105,-.187),l(.289,-.1),l(.616,-.33),l(.557,.032),l(.351,.098),l(.434,-.264),l(.369,-.031),l(.035,-.176),l(-.421,-.321),l(.627,-.232),l(.146,-.275),l(.336,.01),l(.359,.297),l(.397,.082),l(.526,-.381),l(-.281,-.656),l(.438,.065),l(.698,-.058),l(.207,-.174),l(-.604,-.315),l(.411,-.224),l(.816,-.251),l(.093,-.257),l(.261,-.194),l(.73,-.135),l(.074,.067),l(.274,-.051),l(.102,-.067),l(.492,-.67),l(.521,.25),l(.96,-.153),l(.411,.133),l(.265,.1),l(.646,.065),l(.536,-.419),l(.747,-.84),l(.286,-.085),l(.16,.168),l(-.178,.286),l(-.182,.587),l(.791,-.454),l(.403,-.572),l(.819,-.085),l(.688,-.439),l(.437,.117),l(.665,.353),l(.567,-.643),l(.318,-.272),l(.976,.1),l(1.019,.506),l(.197,-.152),l(.479,-.595),l(.709,-.444),l(.283,-.052),l(.562,.067),l(.338,-.308),l(.469,-.291),l(.619,-.189),l(1.2,-.173),l(.984,.015),l(-1.337,.755),l(-.24,.273),l(-.107,.646),l(.42,.084),l(.691,-.579),l(1.53,-.941),l(.764,-.275),l(.028,.257),l(-.004,.905),l(.704,-.172),l(.438,-.239),l(.855,-.874),l(.959,-.104),l(.586,-.001),l(.216,.154),l(-.383,.257),l(-.335,.257),l(.074,.239),l(-.319,.41),l(.921,.118),l(.221,-.443),l(.902,-.651),l(.421,.017),l(1.682,.561),l(.667,.135),l(.935,.015),l(.649,.237),l(.1,.272),l(-1.216,.393),l(-1.148,.036),l(-2.233,-.047),l(.193,.084),l(.585,.304),l(1.058,.284),l(.383,.302),l(.728,-.052),l(.679,-.102),l(.831,.032),l(.708,.25),l(-.404,.288),l(-.514,.204),l(-.824,.021),l(-.77,.121),l(-1.023,.49),l(-1.013,.672),l(-.689,.303),l(-.001,-.2),l(.096,-.367),l(.874,-.923),l(-.044,-.268),l(-.88,-.348),l(-.672,-.114),l(-1.125,-.431),l(-.556,.003),l(-.555,.07),l(-2.004,.095),l(-.865,.374),l(-.567,.422),l(-.26,.437),l(-.079,.501),l(-.188,.5),l(-1.25,.472),l(-.582,.368),l(-.31,-.148),l(-1.288,-.492),l(-1.657,.225),l(-1.411,-.042),l(-.536,-.13),l(-.861,-.595),l(-.994,-.612),l(-.486,-.082),l(-.355,.103),l(-1.012,.656),l(-.114,-.063),l(-.41,-.031),l(-.865,.038),l(-.281,1.066),l(-.164,.449),l(-.271,.25),l(-.323,-.015),l(-.67,-.129),l(-.972,-.144),l(-1.731,-.389),l(-.168,.183),l(-.021,.663),l(-.083,.199),l(-.318,.299),l(-.695,.004),l(-.871,-.095),l(-.279,-.015),l(-.465,.167),l(-1.484,1.176),l(.05,.213),l(.171,.507),l(-.188,.345),l(-.615,.346),l(-1.325,.919),l(-.687,.442),l(-.981,.021),l(-.121,.244),l(-.06,.971),l(-.32,.598),l(-.383,.469),l(-.574,.499),l(-.495,.545),l(.339,.125),l(.381,.269),l(.252,.587),l(-.17,.176),l(-.44,.177),l(-.733,.036),l(-.932,-.027),l(-.618,.114),l(-.613,.257),l(-.617,.479),l(-.389,.492),l(-.077,.664),l(-.349,1.093),l(.65,.729),l(-.335,1.171),l(.582,.39),l(.715,.186),l(.297,.243),l(-.432,.67),l(-.941,.16),l(.571,.735),l(.26,.427),l(-.249,.346),l(-.029,.532),l(-.769,.384),l(-.414,.013),l(-.117,.423),l(-.506,.224),l(.22,.831),l(-.324,.737),l(-.41,.013),l(-.15,-.342),l(-.293,-.132), +N(464.349,47.431),l(-.024,.283),l(-.258,.465),l(.116,.529),l(.563,.212),l(.872,.194),l(.964,.506),l(.543,.392),l(-.421,.364),l(-1.303,.777),l(-.328,.296),l(1.402,1.394),l(.772,1.195),l(-.196,.356),l(-.44,.535),l(-.187,.403),l(-.029,.37),l(.37,.509),l(1.286,1.395),l(.151,.253),l(-.057,.254),l(-.542,.415),l(-.327,.191),l(.439,.33),l(1.357,.499),l(.703,.265),l(.436,.392),l(.161,.346),l(-.105,.409),l(-.43,.536),l(-.591,.536),l(-1.385,.758),l(-1.983,1.195),l(-1.946,1.145),l(-.174,.285),l(-.935,.206),l(-1.195,.188),l(-.149,.181),l(-.506,-.217),l(-.518,.146),l(-.052,.134),l(-.688,-.07),l(-.193,-.108),l(.057,-.387),l(-.241,.527),l(-.268,.14),l(-.633,.047),l(-.328,.03),l(-.1,.267),l(-.589,-.326),l(-.29,.275),l(-.676,.064),l(-.34,.178),l(-.052,-.127),l(-.504,.108),l(-.504,.108),l(-.211,.266),l(-.311,-.152),l(-.672,.126),l(-.04,-.114),l(-.658,.215),l(-.547,.013),l(-.482,.025),l(-.487,-.253),l(-.223,-.274),l(.273,-.34),l(-.846,.017),l(-.517,.177),l(.065,-.382),l(-.446,.076),l(-.644,-.271),l(-.409,-.061),l(-.415,-.231),l(-.26,-.403),l(-.036,-.714),l(.158,-.374),l(.05,-.436),l(.09,-.234),l(-.347,-.483),l(-.431,-.375),l(.3,-.658),l(-.02,-.392),l(-.305,-.204),l(-.37,-.093),l(.062,-.299),l(.295,-.331),l(.637,-.285),l(.144,-.189),l(-.113,-.331),l(.382,-.143),l(.633,.125),l(.274,.063),l(.483,-.222),l(.303,-.427),l(.104,-.459),l(.207,-.27),l(.301,.316),l(.27,0),l(1.678,-1.114),l(1.142,-.654),l(.835,-.576),l(1.026,-.401),l(.874,.03),l(.06,-.304),l(-.13,-.144),l(-.357,-.16),l(.119,-.371),l(.146,-.387),l(-.329,-.274),l(-1.139,-.095),l(-.836,-.451),l(-.594,-.024),l(-.113,-.234),l(-.327,-.307),l(-.208,-.535),l(.5,-.8),l(-.028,-.392),l(-.405,-.685),l(-.507,-.637),l(.004,-.526),l(.062,-.413),l(-.77,-.558),l(-.508,-.229),l(-1.583,-.207),l(-1.085,-.292),l(-1.286,-.658),l(-.616,-.463),l(-.146,-.033),l(1.012,-.656),l(.355,-.103),l(.486,.082),l(.994,.612),l(.861,.595),l(.536,.13),l(1.411,.042),l(1.657,-.225),l(1.288,.492),l(.31,.148),l(.582,-.368),l(1.25,-.472),l(.188,-.5),l(.079,-.501),l(.26,-.437),l(.567,-.422),l(.865,-.374),l(2.004,-.095),l(.555,-.07),l(.556,-.003),l(1.125,.431),l(.672,.114),l(.88,.348),l(.044,.268),l(-.874,.923),l(-.096,.367),l(.001,.2), +N(453.795,53.873),l(-.23,-.004),l(-.975,.164),l(-.447,.098),l(-.902,-.387),l(-.339,-.178),l(-.347,.114),l(-.641,.374),l(-.542,.599),l(-.309,.146),l(-.658,.018),l(-.545,.355),l(.325,.241),l(.146,.192),l(-.355,.273),l(-.907,.401),l(.317,.271),l(.385,.159),l(.33,.302),l(-.749,.367),l(-.405,.43),l(-.368,.461),l(-1.591,.669),l(-.699,.286),l(-.456,-.205),l(-.326,.08),l(-.538,.539),l(-.646,.144),l(-.663,.348),l(-.217,.284),l(-.191,.142),l(-.746,.033),l(-.221,-.031),l(.151,.535),l(-.484,.425),L(439,61.33),l(.216,.533),l(.243,.25),l(-.244,.955),l(-.498,.063),l(-.217,.204),l(.189,.757),l(-.009,.544),l(.381,.444),l(-.287,.175),l(.926,.082),l(.225,.187),l(.499,-.082),l(.652,.594),l(.428,.314),l(.86,.163),l(.198,.406),l(.32,.139),l(.014,.335),l(-.391,0),l(-.508,.323),l(-.861,.3),l(-.492,.162),l(-.521,-.012),l(-.146,-.115),l(-.805,-.115),l(-.66,-.173),l(-.634,-.069),l(-.137,.104),l(-.446,-.115),l(-.257,.3),l(.819,-.069),l(.497,.265),l(.591,.046),l(.205,.208),l(.481,.069),l(.021,-.127),l(.616,.069),l(.258,-.196),l(.297,.011),l(.481,-.104),l(.226,.081),l(.026,-.15),l(.164,0),l(.214,.15),l(-.029,.081),l(-.722,.023),l(.219,.288),l(-.792,.265),l(-.168,.288),l(-.386,.08),l(-.089,-.092),l(.042,-.161),l(-.014,-.276),l(-.258,.023),l(-.091,.46),l(-.501,.333),l(-.248,.058),l(-.36,-.069),l(-.005,.218),l(-1.418,.035),l(.156,.458),l(.513,.258),l(.066,.609),l(-.109,.33),l(-.281,.051),l(-.308,-.064),l(.038,.429),l(.29,.081),l(-.126,.268),l(.24,.228),l(-.365,.364),l(-.222,.455),l(-.041,.56),l(-.766,1.043),l(-.58,.71),l(-.165,-.062),l(-.442,-.236),l(-.614,.193),l(-1.262,-.089),l(-.106,.311),l(-.252,-.083),l(-.518,.264),l(-.295,.517),l(.356,.336),l(-.376,.374),l(-.48,-.129),l(-.173,-.037),l(-1.158,.269),l(-1.11,-.116),l(-.001,-.142),l(.19,-.078),l(-.062,-.181),l(.281,-.297),l(-.638,-.53),l(-.413,-.479),l(-.22,-.272),l(.529,-.116),l(-.082,-.312),l(.421,.077),l(.147,-.245),l(-.19,-.234),l(-.285,.013),l(-.292,-.377),l(-.527,-.221),l(-.63,-.99),l(-.286,0),l(.011,-.408),l(-.256,-.364),l(-.348,-.298),l(.221,-.484),l(.206,-.341),l(-.418,-.154),l(-.405,.102),l(-.055,-.288),l(-.412,.051),l(-.18,-1.207),l(-.225,-.131),l(.311,-.355),l(.293,.132),l(.15,.342),l(.41,-.013),l(.324,-.737),l(-.22,-.831),l(.506,-.224),l(.117,-.423),l(.414,-.013),l(.769,-.384),l(.029,-.532),l(.249,-.346),l(-.26,-.427),l(-.571,-.735),l(.941,-.16),l(.432,-.67),l(-.297,-.243),l(-.715,-.186),l(-.582,-.39),l(.335,-1.171),l(-.65,-.729),l(.349,-1.093),l(.077,-.664),l(.389,-.492),l(.617,-.479),l(.613,-.257),l(.618,-.114),l(.932,.027),l(.733,-.036),l(.44,-.177),l(.17,-.176),l(-.252,-.587),l(-.381,-.269),l(-.339,-.125),l(.495,-.545),l(.574,-.499),l(.383,-.469),l(.32,-.598),l(.06,-.971),l(.121,-.244),l(.981,-.021),l(.687,-.442),l(1.325,-.919),l(.615,-.346),l(.188,-.345),l(-.171,-.507),l(-.05,-.213),l(1.484,-1.176),l(.465,-.167),l(.279,.015),l(.871,.095),l(.695,-.004),l(.318,-.299),l(.083,-.199),l(.021,-.663),l(.168,-.183),l(1.731,.389),l(.972,.144),l(.67,.129),l(.323,.015),l(.271,-.25),l(.164,-.449),l(.281,-1.066),l(.865,-.038),l(.41,.031),l(.114,.063),l(.146,.033),l(.616,.463),l(1.286,.658),l(1.085,.292),l(1.583,.207),l(.508,.229),l(.77,.558),l(-.062,.413),l(-.004,.526),l(.507,.637),l(.405,.685),l(.028,.392),l(-.5,.8),l(.208,.535),l(.327,.307),l(.113,.234), +N(238.107,361.753),l(.515,-.688),l(.859,0),l(1.202,-.515),l(-.171,-.858),l(-3.091,.344),l(-2.061,.515),l(-1.545,-.344),l(-.515,-.858),l(1.374,-.515),l(1.202,-.172),l(3.091,-.172),l(1.374,-.515),l(-.172,-1.03),l(.859,-.516),l(0,-1.374),l(-1.326,-1.054),l(.982,-.491),l(1.202,-.344),l(1.545,-.172),l(.858,.344),l(.858,.858),l(1.03,1.374),l(1.374,1.202),l(1.03,1.373),l(-.515,2.061),l(-1.545,.516),l(-1.545,.858),l(-3.434,.172),l(-3.435,0),M(172.686,360.379),l(3.091,-.687),l(3.262,0),l(5.495,0),l(2.919,1.202),l(-2.748,.687),l(-3.759,-.337),l(-5.169,-.35),l(-3.091,-.516),M(65.13,371.085),l(1.194,-.265),l(1.393,.133),l(.796,.464),l(-1.99,0),l(-1.393,-.332),M(277.944,379.954),l(.515,-1.202),l(2.404,-1.03),l(2.748,-.172),l(2.061,-.171),l(1.545,-.859),l(.343,-1.545),l(1.374,-.687),l(3.091,-.688),l(4.464,0),l(2.404,0),l(3.434,.688),l(.687,1.889),l(0,1.202),l(-2.061,1.201),l(-11.848,1.03),l(-11.161,.344),M(36.004,376.434),l(1.202,-.858),l(2.061,-.343),l(4.121,.515),l(4.293,1.374),l(-.887,.482),l(-2.719,.204),l(-4.293,-.515),l(-3.777,-.859),M(777.843,385.46),l(3.823,.391),l(.899,.029),l(.322,.234),l(1.202,.294),l(2.329,.088),l(2.126,-.003),l(5.218,.329),l(3.046,.348),l(1.144,-.059),l(.762,.029),l(1.411,.37),l(0,2.175),l(0,2.223),l(0,2.222),l(0,2.223),l(0,2.222),l(0,1.551),l(-.041,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.182,0),l(-.041,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.223,0),l(-2.182,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.223,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),l(-2.222,0),H(9.014,0),H(6.792,0),H(4.569,0),H(2.347,0),H(.125,0),l(0,-1.544),l(0,-2.222),l(0,-2.223),l(0,-2.222),l(0,-2.223),l(0,-2.223),l(3.941,.297),l(10.131,0),l(7.898,.516),l(6.868,.172),l(8.586,.858),l(6.353,.515),l(8.757,.172),l(4.808,-.172),l(6.525,-.172),l(2.404,.344),l(3.606,-.858),l(16.312,.344),l(4.638,-.013),l(1.143,-.467),l(-14.366,-.551),l(-9.616,-.688),l(-2.232,0),l(-3.091,-.172),l(-.858,-.171),l(-1.545,-.344),l(-.498,-.455),l(.155,-1.434),l(.687,-.858),l(1.889,-.688),l(-3.263,-.687),l(-2.232,-.344),l(-.953,-.503),l(1.589,-.521),l(-2.891,-.6),l(-3.074,-.208),l(-.104,-.261),l(2.857,-.312),l(2.748,0),l(6.525,.343),l(3.434,0),l(2.576,.344),l(4.636,-1.202),l(2.404,-.687),l(-2.748,-1.03),l(-3.778,-.858),l(-4.391,-.405),l(-2.649,-.625),l(-3.262,-.172),l(-2.919,0),l(-2.919,-.858),l(2.576,-.516),l(1.28,-.342),l(-1.28,-.517),l(-2.919,.516),H(52.66,0),l(-1.717,-.344),L(49.054,373),l(.343,-1.202),l(1.956,-.07),l(1.65,-.273),l(4.98,0),l(4.626,.493),l(3.272,.709),l(1.374,.172),l(4.465,-.858),l(4.089,.243),l(0,-.729),l(.066,-.597),l(-2.255,-.73),l(-2.93,-.075),l(-2.576,-.344),l(2.404,-.687),l(4.121,.171),l(1.717,-.343),l(3.091,-.516),l(3.09,-.343),l(5.667,-.688),l(4.465,-.343),l(3.949,-.516),l(4.464,-.515),l(2.748,.343),l(5.667,0),l(4.464,.258),l(4.121,-.515),l(7.898,.343),l(7.555,-.687),l(3.091,.172),l(1.545,-.688),l(1.545,.516),l(5.323,-.172),l(.121,-.87),l(1.758,-.293),l(1.433,.325),l(.586,.554),l(-.423,.813),l(2.364,.329),l(1.38,-.264),l(-.006,-.938),l(1.438,-.267),l(1.48,.267),l(.212,1.036),l(-1.009,.423),l(.521,.781),l(3.024,-.351),l(1.889,.343),l(3.434,.172),l(2.576,-.687),l(3.778,.086),l(4.868,.33),l(2.344,.013),l(1.449,.109),l(.693,-.53),l(-.611,-.285),l(-2.202,-.122),l(1.305,-.285),l(.041,-.408),l(-.367,-.245),l(-1.386,.123),l(-.693,.04),l(-.856,-.979),l(-2.178,-.337),l(-.676,-.193),l(-.182,-.665),l(4.056,.462),l(3.874,-.245),l(-1.224,-.489),l(-6.035,-.163),l(-.774,-.082),l(-.653,-.489),l(0,-.815),l(2.301,.105),l(.839,.67),l(5.301,-.204),l(7.253,.736),l(2.404,-.172),l(3.262,-.172),l(4.464,.172),l(3.263,.172),l(2.061,-.516),l(.687,-.687),l(1.202,0),l(.344,1.03),l(2.576,.343),l(2.404,-.343),l(.858,.515),l(3.435,.688),l(3.777,.343),l(2.061,.172),l(1.03,-.515),l(.687,-1.202),l(2.747,-.172),l(1.03,.515),l(1.717,.688),l(3.091,-.172),l(3.434,.258),l(4.121,-.344),l(4.979,-.516),l(5.495,-.858),l(3.091,-.515),l(1.202,-.688),l(0,-1.373),l(-1.374,-1.202),l(-.859,-1.545),l(-1.202,-.688),l(-.344,-1.03),l(1.202,-1.03),l(1.717,-.343),l(.858,-1.202),l(-.343,-.858),l(-.172,-1.03),l(-1.202,-.516),l(.344,-1.545),l(1.889,-.172),l(2.404,-1.374),l(1.545,-.515),l(.859,-.859),l(1.03,-.687),l(2.919,-1.202),l(3.606,-.515),l(2.404,-1.202),l(2.404,-.172),l(2.232,-1.03),l(1.545,-.343),l(.343,1.03),l(-1.374,.515),l(-1.03,.344),l(-1.202,.515),l(-.858,0),l(-1.202,0),l(-2.919,1.202),l(-1.03,.687),l(-1.717,1.374),l(-.172,1.202),l(-.687,.687),l(-1.374,-.344),l(-1.03,0),l(-1.202,.516),l(-1.202,.687),l(-1.03,.688),l(-.687,1.201),l(.515,.688),l(.687,.687),l(1.374,.344),l(1.545,0),l(.858,.515),l(.687,1.202),l(1.545,1.546),l(.687,.858),l(1.03,.687),l(.687,1.374),l(.858,1.373),l(.344,1.546),l(-.344,.858),l(-.858,1.717),l(-2.919,1.889),l(-1.202,.172),l(-1.03,.858),l(-1.717,1.03),l(-3.263,.344),l(-4.979,.858),l(-2.404,.344),l(-2.919,.687),l(-7.377,-.141),l(-4.556,-.316),l(-.773,-.401),l(-1.717,-.344),l(-1.717,-.343),l(-1.374,0),l(-.859,.515),l(.515,.858),l(2.061,.688),l(4.121,1.202),l(4.995,.04),l(1.202,.759),l(-3.278,.574),l(-5.667,-.343),l(-4.979,-.516),l(-3.097,-.285),l(-2.151,.253),l(.823,.696),l(1.164,.538),l(3.262,.172),l(2.232,0),l(1.374,.343),l(-.249,.402),l(-.782,.113),l(-2.232,.515),l(-5.151,-.171),l(-1.374,-.172),l(-2.232,-1.202),l(-2.404,0),l(.128,.917),l(2.62,1.144),l(1.03,.172),l(1.202,-.172),l(1.374,.344),l(2.404,0),l(4.98,-.516),l(3.09,.687),l(.385,.431),l(-.041,.6),l(-2.061,.172),l(-3.263,.172),l(-2.608,-.185),l(3.811,.871),l(3.656,-.238),l(1.324,.41),l(2.576,.687),l(6.869,.859),l(8.585,.858),l(10.646,1.373),l(6.525,.516),l(2.061,.858),l(.687,1.03),l(3.091,-.344),l(5.323,-1.545),l(6.525,-.687),l(2.455,-.066),l(6.474,-.105),l(9.788,-.344),l(1.889,.344),l(2.576,-1.202),l(8.414,-1.03),l(11.333,-.172),l(8.929,-.858),l(1.202,-.858),l(-1.202,-.516),l(-.271,-1.07),l(-1.184,-.338),l(-5.071,.035),l(-2.232,.172),l(-4.808,-.344),l(-3.091,0),l(0,-1.202),l(3.263,-1.545),l(3.949,-1.202),l(2.404,-.172),l(4.121,-1.03),l(9.444,-1.202),l(5.323,-.858),l(6.525,0),l(4.979,-.516),l(2.747,-2.061),l(6.039,-1.541),l(-1.23,-.52),l(-2.576,.516),l(-2.061,-.344),l(1.545,-1.03),l(1.545,-.343),l(2.48,-.249),l(.696,-.742),l(3.85,-.742),l(1.577,-.418),l(.603,-.557),l(-1.716,-.881),l(-.093,-.604),l(1.252,-.231),l(.464,.742),l(1.017,-.097),l(2.061,-.858),l(1.03,-.343),l(.858,.171),l(1.203,1.544),l(2.403,-.342),l(.242,-.91),l(.96,-.807),l(1.889,-.516),l(1.374,.516),l(-1.162,.574),l(-.139,.604),l(3.189,-.319),l(4.808,.258),l(3.263,-.172),l(1.03,.858),l(1.545,-.344),l(1.717,-.515),l(5.839,-.858),l(7.212,-1.03),l(4.292,-.858),l(2.061,0),l(2.061,1.373),l(1.718,.344),l(1.889,-.344),l(1.545,-.858),l(7.556,-.344),l(3.434,-.171),l(4.293,.171),l(6.697,.945),l(2.575,0),l(4.293,-.516),l(6.01,-.687),l(5.151,-.688),l(2.404,-.515),l(2.231,-.344),l(.615,-.959),l(1.148,-.835),l(1.671,-.095),l(.938,.965),l(1.294,.409),l(1.732,1.052),l(1.009,.139),l(1.009,-.661),l(1.322,-.174),l(.209,.522),l(-.835,.312),l(.661,.244),l(.8,.278),l(.383,-.383),l(.313,-.383),l(.312,.209),l(-.174,.348),l(0,.521),l(.592,-.174),l(1.913,-.557),l(.418,-1.704),l(5.102,-1.137),l(1.374,-.687),l(3.605,-.172),l(1.363,-.646),l(2.758,-.126),l(.21,-.27),l(-.165,-.297),l(.692,-.23),l(1.221,.165),l(.197,.593),l(.66,.231),l(2.165,-.536),l(1.265,-.223),l(-.726,-.297),l(-.561,-.264),l(.099,-.362),l(1.451,-.1),l(1.562,.215),l(.647,.28),l(.692,-.132),l(-.066,-.33),l(-.527,-.33),l(0,-.561),l(.297,-.23),l(.846,-.242),l(4.292,-.858),l(2.92,-.172),l(3.058,.115),l(2.296,1.076),l(1.316,.023),l(.741,.144),l(.023,.383),l(-.908,.096),l(-.168,.454),l(1.723,.216),l(4.892,.646),l(5.571,.453),l(1.546,.172),l(1.717,-.172),l(7.556,.688),l(5.323,0),l(.687,.687),l(.2,1.075),l(-.73,1.232),l(-.672,.439),l(-.425,1.113),l(-.73,.319),l(-.905,-.402),l(-.83,.402),l(-.73,.959),l(1.507,.457),l(.594,.045),l(.959,-.593),l(.411,.365),l(-.867,1.05),l(-1.215,.062),l(-1.717,1.374),l(0,.858),l(1.889,.688),l(2.919,0),l(1.718,-.859),l(1.889,-1.545),l(1.717,-1.717),l(1.374,-.688),l(4.121,-1.03),l(2.231,-.687),l(3.263,-.344),l(2.061,-1.03),l(1.03,-1.03),l(3.435,-1.03),l(2.403,-.687),l(2.061,-.687),l(2.061,-.172),l(6.182,-.687),l(3.778,.171),l(1.204,-.542),l(.169,-.659),l(.54,-.759),l(.49,-.101),l(.471,.776),l(.305,.775),l(4.892,-.35),l(5.838,0),l(4.979,-.172),l(3.091,.344),l(2.112,-.214),l(1.328,.085),l(1.018,.594),l(1.188,-.764),l(2.714,-1.046),l(1.866,-.226),l(.664,-.028),l(.594,-.028),l(.777,-.057),l(1.512,.311),l(1.166,-.172),l(3.606,.687),l(3.777,.344),l(1.03,0),l(1.064,.573),l(.745,.088),l(2.149,-.088),l(1.271,-.263),l(1.315,-.438),l(-.192,-.216),l(.28,-.53),l(1.447,-.131),l(.921,-.088),l(.786,.062),l(2.195,-.501),l(2.097,.501),l(.688,.687),l(.373,.435),l(1.842,-.131),l(.921,-.044),l(.985,.255),l(1.889,.688),l(2.919,.515),l(2.919,-.343),l(4.121,-.258),l(2.232,-.344),l(2.404,0),l(3.521,.315),l(.702,-.755),l(2.158,-.162),l(.863,1.133),l(4.909,.323),l(.917,-1.133),l(1.889,-.593),l(5.988,.013),l(.756,-.283),l(1.996,.108),l(-.432,-1.403),l(.054,-.809),l(1.232,-.36),l(.872,1.277),l(-.647,1.079),l(.805,.219),l(2.81,.482),l(5.262,.376),l(5.494,.344),l(2.278,.583),l(1.283,.14),l(1.396,-.167),l(2.204,.446),l(1.961,-.167),l(.719,.278),l(-.435,.431),l(-.151,.351),l(.293,.123),l(2.081,.331),l(1.078,.484),l(2.706,-.134),l(.377,.595),l(1.038,.227),l(4.808,.515),l(-.123,.536),l(.567,.236),l(2.695,-.095),l(3.214,.181),l(-.329,-.984),l(.71,-.095),l(.804,.426),l(.331,.709),l(1.135,.284),l(2.672,.519),l(2.576,-.343),l(4.017,.999),l(1.626,.495),l(1.672,.871),l(1.626,.023),l(.504,.187),l(.532,-.021),l(.754,-.047),l(.777,.047),l(.896,.589),l(.541,.118),l(.542,.07),l(.142,-.259),l(.471,0),l(1.484,-.048),l(1.416,.237),l(5.951,.535),l(.729,.516),l(1.733,.323),l(2.979,.944),l(.43,-.335),l(.551,.191),l(.454,.67),l(-.741,.215),l(-1.124,.167),l(-.216,.359),l(.168,.263),l(.55,-.048),l(-.024,.67),l(-.43,-.048),l(-.096,.287),l(-.312,.071),l(-.598,.622),l(-.526,.12),l(-.55,.287),l(-.168,.669),l(-1.603,.096),l(-1.339,-.239),l(-1.794,.359),l(-2.153,.425),l(-2.629,.764),l(1.271,1.103),l(-1.907,.212),l(-1.23,-.255),l(-.763,.212),l(-.043,.637),l(-2.374,.169),l(.136,.514),l(.924,.632),l(-.127,.763),l(-.382,.085),l(-.466,.467),l(.551,.466),l(.085,.764),l(-.764,.424),l(.637,.254),l(.763,0),l(.764,.255),l(.339,.509),l(.17,.721),l(1.284,-.187),l(.836,.907),l(2.035,.297),l(.339,.339),l(2.672,.552),l(-4.113,0),l(-2.799,.138),l(-2.332,.541),l(-1.823,-.085),l(-.806,.212),l(-1.611,.339),l(-1.326,-.32),l(-.546,.426),l(1.116,.529),l(-.503,.447),l(-.669,.195),l(-1.117,.753),l(-2.623,.642),l(.475,.391),l(2.205,-.111),l(.53,0),l(.809,.307),l(.168,.363),l(.499,.18),l(.422,.183),l(.111,.894),l(.209,.502),l(3.195,.279),l(2.874,.948),l(3.662,.801),l(5.151,1.202),l(1.456,.062),l(1.015,.17),l(-.146,.234),l(-1.67,.264),l(-.47,.264),l(1.173,.088),l(2.198,-.293),l(1.988,.166), +E(0,0) +}; + +#undef N +#undef M +#undef L +#undef l +#undef E diff --git a/test/xcb-huge-image-shm.c b/test/xcb-huge-image-shm.c new file mode 100644 index 000000000..269d7f0d4 --- /dev/null +++ b/test/xcb-huge-image-shm.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2011 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" + +#define WIDTH 3000 +#define HEIGHT 3000 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_surface_t *image; + cairo_t *cr2; + + /* We use a similar surface to have way smaller ref images */ + surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + WIDTH, HEIGHT); + + /* First we have to defeat xcb's deferred clear */ + cr2 = cairo_create (surface); + cairo_test_paint_checkered (cr2); + cairo_destroy (cr2); + + /* Now we try to map this to an image. This will try to use shared memory + * but fail the allocation, because of the huge surface. */ + image = cairo_surface_map_to_image (surface, NULL); + cairo_surface_unmap_image (surface, image); + + /* Finally we make sure that errors aren't lost. */ + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (xcb_huge_image_shm, + "Force a failed shm allocation when receiving an image", + "xcb", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/xcb-huge-subimage.c b/test/xcb-huge-subimage.c new file mode 100644 index 000000000..fc8e278c6 --- /dev/null +++ b/test/xcb-huge-subimage.c @@ -0,0 +1,81 @@ +/* + * Copyright © 2012 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" + +#define WIDTH 6000 +#define HEIGHT 6000 + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *surface; + cairo_surface_t *image; + cairo_surface_t *subimage; + cairo_rectangle_int_t extents; + cairo_t *cr2; + + extents.x = extents.y = 10; + extents.width = WIDTH - 20; + extents.height = HEIGHT - 20; + + /* We use a similar surface to have way smaller ref images */ + surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + WIDTH, HEIGHT); + + /* First we have to defeat xcb's deferred clear */ + cr2 = cairo_create (surface); + cairo_test_paint_checkered (cr2); + cairo_destroy (cr2); + + /* Get us an image surface with a non-natural stride */ + image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + WIDTH, HEIGHT); + subimage = cairo_surface_map_to_image (image, &extents); + + /* Paint the subimage to the similar surface and trigger the big upload */ + cr2 = cairo_create (surface); + cairo_set_source_surface (cr2, subimage, 0, 0); + cairo_paint (cr2); + cairo_destroy (cr2); + + /* Finally we make sure that errors aren't lost. */ + cairo_surface_unmap_image (image, subimage); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_paint (cr); + cairo_surface_destroy (image); + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (xcb_huge_subimage, + "Test if the maximum request size is honored", + "xcb", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/xcb-snapshot-assert.c b/test/xcb-snapshot-assert.c new file mode 100644 index 000000000..b578f8c7e --- /dev/null +++ b/test/xcb-snapshot-assert.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2011 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" +#include "cairo.h" + +static cairo_surface_t * +create_image (int width, int height) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); + /* Paint something random to the image */ + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_set_source_rgb (cr, 0, 1, 1); + cairo_paint (cr); + + surface = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_surface_t *image; + + /* Image has to have same geometry as xcb surface to be added as a snapshot */ + image = create_image (width, height); + cairo_set_source_surface (cr, image, 0, 0); + cairo_surface_destroy (image); + + /* This attaches the tested xcb surface as a snapshot */ + cairo_paint (cr); + + /* Now cairo is modifying a snapshot which fails an + * assert in _cairo_surface_begin_modification */ + cairo_paint (cr); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (xcb_snapshot_assert, + "Test a wrong _cairo_surface_attach_snapshot call", + "xcb", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/xcb-stress-cache.c b/test/xcb-stress-cache.c new file mode 100644 index 000000000..3e3d0a289 --- /dev/null +++ b/test/xcb-stress-cache.c @@ -0,0 +1,118 @@ +/* + * Copyright © 2011 Uli Schlachter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Uli Schlachter + */ + +#include "cairo-test.h" + +#define WIDTH 512 +#define HEIGHT 512 + +/* This is a random pick. This results in 512 (width) * 512 (height) * + * 2 (surfaces per run) * 4 (ARGB32) * ITERATIONS = 200 MiB of image data. */ +#define ITERATIONS 100 + +/* This tries to trigger a bug in the xcb backend where a Picture is freed to + * early. It goes something like this: + * + * - _composite_mask calls _cairo_xcb_picture_for_pattern to get a xcb_picture_t + * for the source. + * - _cairo_xcb_picture_for_pattern calls _cairo_xcb_surface_picture which calls + * _cairo_xcb_screen_store_surface_picture which adds the picture to a cache. + * - _cairo_xcb_surface_picture also attached the picture as a snapshot to + * the source surface using cairo_surface_finish as detach_func. + * - _composite_mask calls _cairo_xcb_picture_for_pattern to get a xcb_picture_t + * for the mask. + * - The resulting picture surface is added to the cache again, but the cache is + * already full, so a random cache entry is picked and removed. + * - The surface that was added before is picked and gets fed to + * _surface_cache_entry_destroy. + * - This calls _cairo_surface_detach_snapshot which causes the + * detach_func from above to be called, so the surface is finished and the + * associated picture is FreePicture'd. + * - _composite_mask now uses a Picture that was already freed. + * + * So this depends on the screen's surface cache to be full which is why we do + * all this looping. + */ + +static cairo_surface_t * +create_image (void) +{ + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); + /* Paint something random to the image */ + cr = cairo_create (surface); + cairo_paint (cr); + cairo_set_source_rgb (cr, 0, 1, 1); + cairo_rectangle (cr, 0, 0, WIDTH/2.0, HEIGHT/2.0); + cairo_fill (cr); + cairo_set_source_rgb (cr, 1, 0, 1); + cairo_rectangle (cr, WIDTH/2.0, HEIGHT/2.0, WIDTH/2.0, HEIGHT/2.0); + cairo_fill (cr); + cairo_destroy (cr); + + return surface; +} + +static cairo_surface_t * +dirty_cache (cairo_t *cr) +{ + cairo_surface_t *surface; + + /* Set a source surface... */ + surface = create_image (); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_surface_destroy (surface); + /* ...and create a mask surface, so that we can hit the early FreePicture */ + surface = create_image (); + cairo_mask_surface (cr, surface, 0, 0); + + return surface; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + cairo_surface_t *array[ITERATIONS]; + + /* We have to keep the associated cairo_surface_t alive so that they aren't + * removed from the cache */ + for (i = 0; i < ITERATIONS; i++) + array[i] = dirty_cache (cr); + for (i = 0; i < ITERATIONS; i++) + cairo_surface_destroy (array[i]); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (xcb_stress_cache, + "Stress test for a image surface cache in cairo-xcb", + "xcb, stress", /* keywords */ + NULL, /* requirements */ + 2, 2, + NULL, draw) diff --git a/test/xcb-surface-source.c b/test/xcb-surface-source.c new file mode 100644 index 000000000..d2c7a1362 --- /dev/null +++ b/test/xcb-surface-source.c @@ -0,0 +1,149 @@ +/* + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#if CAIRO_HAS_XCB_SURFACE +#include +#endif + +#include "surface-source.c" + +#if CAIRO_HAS_XCB_SURFACE +static cairo_user_data_key_t closure_key; + +struct closure { + cairo_device_t *device; + xcb_connection_t *connection; + xcb_pixmap_t pixmap; +}; + +static void +cleanup (void *data) +{ + struct closure *arg = data; + + cairo_device_finish (arg->device); + cairo_device_destroy (arg->device); + + xcb_free_pixmap (arg->connection, arg->pixmap); + xcb_disconnect (arg->connection); + + free (arg); +} + +static xcb_render_pictforminfo_t * +find_depth (xcb_connection_t *connection, int depth, void **formats_out) +{ + xcb_render_query_pict_formats_reply_t *formats; + xcb_render_query_pict_formats_cookie_t cookie; + xcb_render_pictforminfo_iterator_t i; + + cookie = xcb_render_query_pict_formats (connection); + xcb_flush (connection); + + formats = xcb_render_query_pict_formats_reply (connection, cookie, 0); + if (formats == NULL) + return NULL; + + for (i = xcb_render_query_pict_formats_formats_iterator (formats); + i.rem; + xcb_render_pictforminfo_next (&i)) + { + if (XCB_RENDER_PICT_TYPE_DIRECT != i.data->type) + continue; + + if (depth != i.data->depth) + continue; + + *formats_out = formats; + return i.data; + } + + free (formats); + return NULL; +} +#endif + +static cairo_surface_t * +create_source_surface (int size) +{ +#if CAIRO_HAS_XCB_SURFACE + xcb_connection_t *connection; + xcb_render_pictforminfo_t *render_format; + struct closure *data; + cairo_surface_t *surface; + xcb_screen_t *root; + xcb_void_cookie_t cookie; + void *formats; + + connection = xcb_connect (NULL, NULL); + if (connection == NULL) + return NULL; + + data = xmalloc (sizeof (struct closure)); + data->connection = connection; + + render_format = find_depth (connection, 32, &formats); + if (render_format == NULL) { + xcb_disconnect (connection); + free (data); + return NULL; + } + + root = xcb_setup_roots_iterator (xcb_get_setup (connection)).data; + + data->pixmap = xcb_generate_id (connection); + cookie = xcb_create_pixmap_checked (connection, 32, + data->pixmap, root->root, size, size); + /* slow, but sure */ + if (xcb_request_check (connection, cookie) != NULL) { + free (formats); + xcb_disconnect (connection); + free (data); + return NULL; + } + + surface = cairo_xcb_surface_create_with_xrender_format (connection, + root, + data->pixmap, + render_format, + size, size); + free (formats); + + data->device = cairo_device_reference (cairo_surface_get_device (surface)); + cairo_surface_set_user_data (surface, &closure_key, data, cleanup); + + return surface; +#else + return NULL; +#endif +} + +CAIRO_TEST (xcb_surface_source, + "Test using a XCB surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/xcomposite-projection.c b/test/xcomposite-projection.c new file mode 100644 index 000000000..39686cf99 --- /dev/null +++ b/test/xcomposite-projection.c @@ -0,0 +1,109 @@ +/* + * Copyright 2009 Benjamin Otte + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +/* + * Exercise a bug in the projection of a rotated trapezoid mask. + * I used CAIRO_ANTIALIAS_NONE and a single-color source in the test to get + * rid of aliasing issues in the output images. This makes some issues + * slightly less visible, but still fails for all of them. If you want to + * get a clearer view: + * #define ANTIALIAS CAIRO_ANTIALIAS_DEFAULT + */ + +#define ANTIALIAS CAIRO_ANTIALIAS_NONE + +static const char png_filename[] = "romedalen.png"; + +static cairo_pattern_t * +get_source (const cairo_test_context_t *ctx, + int *width, int *height) +{ + cairo_surface_t *surface; + cairo_pattern_t *pattern; + + if (ANTIALIAS == CAIRO_ANTIALIAS_NONE) { + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 256, 192); + cr = cairo_create (surface); + + cairo_set_source_rgb (cr, 0.75, 0.25, 0.25); + cairo_paint (cr); + + pattern = cairo_pattern_create_for_surface (cairo_get_target (cr)); + cairo_destroy (cr); + } else { + surface = cairo_test_create_surface_from_png (ctx, png_filename); + pattern = cairo_pattern_create_for_surface (surface); + } + + *width = cairo_image_surface_get_width (surface); + *height = cairo_image_surface_get_height (surface); + cairo_surface_destroy (surface); + + return pattern; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_pattern_t *image; + int img_width, img_height; + + image = get_source (cairo_test_get_context (cr), + &img_width, &img_height); + + /* we don't want to debug antialiasing artifacts */ + cairo_set_antialias (cr, ANTIALIAS); + + /* dark grey background */ + cairo_set_source_rgb (cr, 0.25, 0.25, 0.25); + cairo_paint (cr); + + /* magic transform */ + cairo_translate (cr, 10, -40); + cairo_rotate (cr, -0.05); + + /* place the image on our surface */ + cairo_set_source (cr, image); + + /* paint the image */ + cairo_rectangle (cr, 0, 0, img_width, img_height); + cairo_fill (cr); + + cairo_pattern_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (xcomposite_projection, + "Test a bug with XRenderComposite reference computation when projecting the first trapezoid onto 16.16 space", + "xlib", /* keywords */ + "target=raster", /* requirements */ + 300, 150, + NULL, draw) diff --git a/test/xlib-expose-event.c b/test/xlib-expose-event.c new file mode 100644 index 000000000..1de23e01e --- /dev/null +++ b/test/xlib-expose-event.c @@ -0,0 +1,196 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +/* This test tries to emulate the behaviour of most toolkits; it tries + * to simulate typical usage of a single surface with multiple exposures. + * + * The first goal of the test is to reproduce the XSetClipMask(NULL) bug + * reintroduced in 1.6.2 (but was originally fixed in 40558cb15). As I've + * made the same mistake again, it is worth adding a regression test... + */ + +#include "cairo-test.h" + +#include +#include + +#include "cairo.h" + +#include "buffer-diff.h" + +#define SIZE 160 +#define NLOOPS 10 + +static const char *png_filename = "romedalen.png"; + +static void +draw_mask (cairo_t *cr) +{ + cairo_surface_t *surface; + cairo_t *cr2; + + surface = cairo_surface_create_similar (cairo_get_group_target (cr), + CAIRO_CONTENT_ALPHA, + 50, 50); + cr2 = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_rectangle (cr2, + 0, 0, + 40, 40); + cairo_rectangle (cr2, + 10, 10, + 40, 40); + cairo_clip (cr2); + + cairo_move_to (cr2, 0, 25); + cairo_line_to (cr2, 50, 25); + cairo_move_to (cr2, 25, 0); + cairo_line_to (cr2, 25, 50); + cairo_set_source_rgb (cr2, 1, 1, 1); + cairo_stroke (cr2); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_mask_surface (cr, cairo_get_target (cr2), 50, 50); + cairo_destroy (cr2); +} + +static cairo_surface_t * +clone_similar_surface (cairo_surface_t * target, cairo_surface_t *surface) +{ + cairo_t *cr; + cairo_surface_t *similar; + + similar = cairo_surface_create_similar (target, + cairo_surface_get_content (surface), + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); + + cr = cairo_create (similar); + cairo_surface_destroy (similar); + + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + similar = cairo_surface_reference (cairo_get_target (cr)); + cairo_destroy (cr); + + return similar; +} + +static void +draw_image (const cairo_test_context_t *ctx, + cairo_t *cr, + cairo_surface_t *image) +{ + cairo_set_source_surface (cr, image, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); +} + +static void +draw (const cairo_test_context_t *ctx, + cairo_t *cr, + cairo_surface_t *image, + cairo_rectangle_t *region, + int n_regions) +{ + cairo_save (cr); + if (region != NULL) { + int i; + for (i = 0; i < n_regions; i++) { + cairo_rectangle (cr, + region[i].x, region[i].y, + region[i].width, region[i].height); + } + cairo_clip (cr); + } + cairo_push_group (cr); + draw_image (ctx, cr, image); + draw_mask (cr); + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_restore (cr); +} + +static cairo_test_status_t +draw_func (cairo_t *cr, int width, int height) +{ + cairo_rectangle_t region[4]; + const cairo_test_context_t *ctx; + cairo_surface_t *source, *image; + int i, j; + + ctx = cairo_test_get_context (cr); + + source = cairo_test_create_surface_from_png (ctx, png_filename); + image = clone_similar_surface (cairo_get_group_target (cr), source); + cairo_surface_destroy (source); + + cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR); + draw (ctx, cr, image, NULL, 0); + for (i = 0; i < NLOOPS; i++) { + for (j = 0; j < NLOOPS; j++) { + region[0].x = i * SIZE / NLOOPS; + region[0].y = i * SIZE / NLOOPS; + region[0].width = SIZE / 4; + region[0].height = SIZE / 4; + + region[1].x = j * SIZE / NLOOPS; + region[1].y = j * SIZE / NLOOPS; + region[1].width = SIZE / 4; + region[1].height = SIZE / 4; + + region[2].x = i * SIZE / NLOOPS; + region[2].y = j * SIZE / NLOOPS; + region[2].width = SIZE / 4; + region[2].height = SIZE / 4; + + region[3].x = j * SIZE / NLOOPS; + region[3].y = i * SIZE / NLOOPS; + region[3].width = SIZE / 4; + region[3].height = SIZE / 4; + + draw (ctx, cr, image, region, 4); + } + } + + cairo_pop_group_to_source (cr); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + cairo_surface_destroy (image); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (xlib_expose_event, + "Emulate a typical expose event", + "xlib", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw_func) diff --git a/test/xlib-surface-source.c b/test/xlib-surface-source.c new file mode 100644 index 000000000..7d2ed71c0 --- /dev/null +++ b/test/xlib-surface-source.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2008 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include "cairo-test.h" +#include +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +#include +#endif + +#include "surface-source.c" + +static cairo_user_data_key_t closure_key; + +struct closure { + cairo_device_t *device; + Display *dpy; + Pixmap pix; +}; + +static void +cleanup (void *data) +{ + struct closure *arg = data; + + cairo_device_finish (arg->device); + cairo_device_destroy (arg->device); + + XFreePixmap (arg->dpy, arg->pix); + XCloseDisplay (arg->dpy); + + free (arg); +} + +static cairo_surface_t * +create_source_surface (int size) +{ +#if CAIRO_HAS_XLIB_XRENDER_SURFACE + XRenderPictFormat *xrender_format; + struct closure *data; + cairo_surface_t *surface; + + data = xmalloc (sizeof (struct closure)); + + data->dpy = XOpenDisplay (NULL); + if (!data->dpy) { + return NULL; + } + + xrender_format = XRenderFindStandardFormat (data->dpy, PictStandardARGB32); + + data->pix = XCreatePixmap (data->dpy, DefaultRootWindow (data->dpy), + size, size, xrender_format->depth); + + surface = cairo_xlib_surface_create_with_xrender_format (data->dpy, + data->pix, + DefaultScreenOfDisplay (data->dpy), + xrender_format, + size, size); + data->device = cairo_device_reference (cairo_surface_get_device (surface)); + if (cairo_surface_set_user_data (surface, &closure_key, data, cleanup)) { + cairo_surface_finish (surface); + cairo_surface_destroy (surface); + cleanup (data); + return NULL; + } + + return surface; +#else + return NULL; +#endif +} + +CAIRO_TEST (xlib_surface_source, + "Test using a Xlib surface as the source", + "source", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + preamble, draw) diff --git a/test/xlib-surface.c b/test/xlib-surface.c new file mode 100644 index 000000000..137b28232 --- /dev/null +++ b/test/xlib-surface.c @@ -0,0 +1,353 @@ +/* + * Copyright © 2005 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#include +#include + +#include "cairo.h" +#include "cairo-xlib.h" + +#include "cairo-boilerplate-xlib.h" + +#include "buffer-diff.h" + +#define SIZE 100 +#define OFFSCREEN_OFFSET 50 + +cairo_bool_t result = 0; + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE + +#include "cairo-xlib-xrender.h" + +/* Vladimir Vukicevic reported that surfaces were being created with + * mismatching Visuals and XRenderPictFormats. + */ +static cairo_bool_t +surface_compare_visual_and_format (cairo_surface_t *surface) +{ + Display *dpy; + Visual *visual; + XRenderPictFormat *format; + + dpy = cairo_xlib_surface_get_display (surface); + + visual = cairo_xlib_surface_get_visual (surface); + if (visual == NULL) + return TRUE; + + format = cairo_xlib_surface_get_xrender_format (surface); + if (format == NULL) + return TRUE; + + return format == XRenderFindVisualFormat (dpy, visual); + +} +#else + +static cairo_bool_t +surface_compare_visual_and_format (cairo_surface_t *surface) +{ + return TRUE; +} + +#endif + +static cairo_bool_t +check_similar_visual_and_format (cairo_surface_t *surface) +{ + cairo_surface_t *similar; + cairo_bool_t ret; + + similar = cairo_surface_create_similar (surface, + CAIRO_CONTENT_COLOR_ALPHA, + 1, 1); + if (cairo_surface_status (similar)) + return FALSE; + + ret = surface_compare_visual_and_format (similar); + + cairo_surface_destroy (similar); + + return ret; +} + + +static void +draw_pattern (cairo_surface_t *surface) +{ + cairo_t *cr = cairo_create (surface); + int i; + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + + cairo_set_source_rgba (cr, 0, 0.0, 0.0, 0.50); /* half-alpha-black */ + + for (i = 1; i <= 3; i++) { + int inset = SIZE / 8 * i; + + cairo_rectangle (cr, + inset, inset, + SIZE - 2 * inset, SIZE - 2 * inset); + cairo_fill (cr); + } + + cairo_destroy (cr); +} + +static void +erase_pattern (cairo_surface_t *surface) +{ + cairo_t *cr = cairo_create (surface); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ + cairo_paint (cr); + + cairo_destroy (cr); +} + +static cairo_test_status_t +do_test (const cairo_test_context_t *ctx, + Display *dpy, + unsigned char *reference_data, + unsigned char *test_data, + unsigned char *diff_data, + cairo_bool_t use_pixmap, + cairo_bool_t set_size, + cairo_bool_t offscreen) +{ + cairo_surface_t *surface; + cairo_surface_t *test_surface; + cairo_t *test_cr; + buffer_diff_result_t result; + Drawable drawable; + int screen = DefaultScreen (dpy); + + if (use_pixmap && offscreen) + return CAIRO_TEST_SUCCESS; + + if (use_pixmap) { + drawable = XCreatePixmap (dpy, DefaultRootWindow (dpy), + SIZE, SIZE, DefaultDepth (dpy, screen)); + } else { + XSetWindowAttributes xwa; + int x, y; + + xwa.override_redirect = True; + + if (offscreen) { + x = - OFFSCREEN_OFFSET; + y = - OFFSCREEN_OFFSET; + } else { + x = 0; + y = 0; + } + + drawable = XCreateWindow (dpy, DefaultRootWindow (dpy), + x, y, SIZE, SIZE, 0, + DefaultDepth (dpy, screen), InputOutput, + DefaultVisual (dpy, screen), + CWOverrideRedirect, &xwa); + XMapWindow (dpy, drawable); + } + + surface = cairo_xlib_surface_create (dpy, + drawable, + DefaultVisual (dpy, screen), + SIZE, SIZE); + + if (! surface_compare_visual_and_format (surface)) + return CAIRO_TEST_FAILURE; + + if (set_size) { + cairo_xlib_surface_set_size (surface, SIZE, SIZE); + + if (cairo_xlib_surface_get_width (surface) != SIZE || + cairo_xlib_surface_get_height (surface) != SIZE) + return CAIRO_TEST_FAILURE; + } + + if (! check_similar_visual_and_format (surface)) + return CAIRO_TEST_FAILURE; + + draw_pattern (surface); + + test_surface = cairo_image_surface_create_for_data (test_data, + CAIRO_FORMAT_RGB24, + SIZE, SIZE, + SIZE * 4); + + test_cr = cairo_create (test_surface); + cairo_set_source_surface (test_cr, surface, 0, 0); + cairo_paint (test_cr); + + cairo_destroy (test_cr); + cairo_surface_destroy (test_surface); + + /* We erase the surface to black in case we get the same + * memory back again for the pixmap case. + */ + erase_pattern (surface); + cairo_surface_destroy (surface); + + if (use_pixmap) + XFreePixmap (dpy, drawable); + else + XDestroyWindow (dpy, drawable); + + if (offscreen) { + size_t offset = 4 * (SIZE * OFFSCREEN_OFFSET + OFFSCREEN_OFFSET); + + buffer_diff_noalpha (reference_data + offset, + test_data + offset, + diff_data + offset, + SIZE - OFFSCREEN_OFFSET, + SIZE - OFFSCREEN_OFFSET, + 4 * SIZE, + &result); + } else { + buffer_diff_noalpha (reference_data, + test_data, + diff_data, + SIZE, + SIZE, + 4 * SIZE, + &result); + } + + cairo_test_log (ctx, "xlib-surface: %s, %s, %s: %s\n", + set_size ? " size" : "no-size", + use_pixmap ? "pixmap" : "window", + use_pixmap ? " " : (offscreen ? ", offscreen" : ", onscreen"), + image_diff_is_failure (&result, 0) ? "FAIL" : "PASS"); + + if (image_diff_is_failure (&result, 0)) + return CAIRO_TEST_FAILURE; + else + return CAIRO_TEST_SUCCESS; +} + +static cairo_bool_t +check_visual (Display *dpy) +{ + Visual *visual = DefaultVisual (dpy, DefaultScreen (dpy)); + + if ((visual->red_mask == 0xff0000 && + visual->green_mask == 0x00ff00 && + visual->blue_mask == 0x0000ff) || + (visual->red_mask == 0x0000ff && + visual->green_mask == 0x00ff00 && + visual->blue_mask == 0xff0000)) + return 1; + else + return 0; +} + +#undef xcalloc +static void * +xcalloc (const cairo_test_context_t *ctx, size_t a, size_t b) +{ + void *ptr = calloc (a, b); + if (ptr == NULL) { + cairo_test_log (ctx, "xlib-surface: unable to allocate memory, skipping\n"); + abort (); + } + return ptr; +} + +static cairo_test_status_t +preamble (cairo_test_context_t *ctx) +{ + Display *dpy; + unsigned char *reference_data; + unsigned char *test_data; + unsigned char *diff_data; + cairo_surface_t *reference_surface; + cairo_bool_t use_pixmap; + cairo_bool_t set_size; + cairo_bool_t offscreen; + cairo_test_status_t status, result = CAIRO_TEST_UNTESTED; + int stride; + + if (! cairo_test_is_target_enabled (ctx, "xlib")) + goto CLEANUP_TEST; + + dpy = XOpenDisplay (NULL); + if (!dpy) { + cairo_test_log (ctx, "xlib-surface: Cannot open display, skipping\n"); + goto CLEANUP_TEST; + } + + if (!check_visual (dpy)) { + cairo_test_log (ctx, "xlib-surface: default visual is not RGB24 or BGR24, skipping\n"); + goto CLEANUP_DISPLAY; + } + + stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, SIZE); + + reference_data = xcalloc (ctx, SIZE, stride); + test_data = xcalloc (ctx, SIZE, stride); + diff_data = xcalloc (ctx, SIZE, stride); + + reference_surface = cairo_image_surface_create_for_data (reference_data, + CAIRO_FORMAT_RGB24, + SIZE, SIZE, + stride); + + draw_pattern (reference_surface); + cairo_surface_destroy (reference_surface); + + result = CAIRO_TEST_SUCCESS; + + for (set_size = 0; set_size <= 1; set_size++) + for (use_pixmap = 0; use_pixmap <= 1; use_pixmap++) + for (offscreen = 0; offscreen <= 1; offscreen++) { + status = do_test (ctx, dpy, + reference_data, test_data, diff_data, + use_pixmap, set_size, offscreen); + if (status) + result = status; + } + + free (reference_data); + free (test_data); + free (diff_data); + + CLEANUP_DISPLAY: + XCloseDisplay (dpy); + + CLEANUP_TEST: + return result; +} + +CAIRO_TEST (xlib_surface, + "Check creating surfaces for various XWindows", + "xlib", /* keywords */ + NULL, /* requirements */ + 0, 0, + preamble, NULL) diff --git a/test/zero-alpha.c b/test/zero-alpha.c new file mode 100644 index 000000000..0105cc8e6 --- /dev/null +++ b/test/zero-alpha.c @@ -0,0 +1,95 @@ +/* + * Copyright © 2006 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + */ + +#include "cairo-test.h" + +#define SIZE 3 +#define REPS 10 + +/* History: + * + * 2006-06-13 Paul Giblock reports a "Stange alpha channel problem" on + * the cairo mailing list. + * + * 2006-06-13 Carl Worth writes this test in an attempt to reproduce + * the problem. The test first fills in a 3x3 rectangle with red, then + * starts pounding on that center pixel with various forms of + * zero-alpha rendering to see if its value can ever be made to + * change. + * + * 2006-06-13 Paul Giblock reports that this only happens with the + * xlib backend, and then only on some systems. + */ +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + int i; + cairo_surface_t *surface; + uint32_t zero = 0; + + /* First paint background red. */ + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); /* red */ + cairo_paint (cr); + + /* Then we paint zero-alpha in several ways (always REPS times): */ + + /* 1. fill a rectangle with a zero-alpha solid source. */ + cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); /* transparent */ + cairo_rectangle (cr, 1.0, 1.0, 1.0, 1.0); + for (i=0; i < REPS; i++) + cairo_fill_preserve (cr); + cairo_new_path (cr); + + /* 2. paint with a zero-alpha image surface source. */ + surface = cairo_image_surface_create_for_data ((unsigned char *) &zero, + CAIRO_FORMAT_ARGB32, 1, 1, 4); + cairo_set_source_surface (cr, surface, 1, 1); + for (i=0; i < REPS; i++) + cairo_paint (cr); + + /* 3. clip to rectangle then paint with zero-alpha solid source. */ + cairo_rectangle (cr, 1.0, 1.0, 1.0, 1.0); + cairo_clip (cr); + cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); /* transparent */ + for (i=0; i < REPS; i++) + cairo_paint (cr); + + /* 4. With the clip still there, paint our image surface. */ + cairo_set_source_surface (cr, surface, 1, 1); + for (i=0; i < REPS; i++) + cairo_paint (cr); + + cairo_surface_finish (surface); /* zero will go out of scope */ + cairo_surface_destroy (surface); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (zero_alpha, + "Testing that drawing with zero alpha has no effect", + "alpha", /* keywords */ + NULL, /* requirements */ + SIZE, SIZE, + NULL, draw) diff --git a/test/zero-mask.c b/test/zero-mask.c new file mode 100644 index 000000000..3d2f34d0e --- /dev/null +++ b/test/zero-mask.c @@ -0,0 +1,198 @@ +/* + * Copyright © 2010 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Benjamin Otte + */ + +#include "cairo-test.h" + +#define RECT 10 +#define SPACE 5 + +static void +paint_with_alpha (cairo_t *cr) +{ + cairo_paint_with_alpha (cr, 0.0); +} + +static void +mask_with_solid (cairo_t *cr) +{ + cairo_pattern_t *pattern = cairo_pattern_create_rgba (1, 0, 0, 0); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + +static void +mask_with_empty_gradient (cairo_t *cr) +{ + cairo_pattern_t *pattern = cairo_pattern_create_linear (1, 2, 3, 4); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + +static void +mask_with_gradient (cairo_t *cr) +{ + cairo_pattern_t *pattern = cairo_pattern_create_radial (1, 2, 3, 4, 5, 6); + + cairo_pattern_add_color_stop_rgba (pattern, 0, 1, 0, 0, 0); + cairo_pattern_add_color_stop_rgba (pattern, 0, 0, 0, 1, 0); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); +} + +static void +mask_with_surface (cairo_t *cr) +{ + cairo_surface_t *surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + RECT, + RECT); + + cairo_mask_surface (cr, surface, 0, 0); + + cairo_surface_destroy (surface); +} + +static void +mask_with_alpha_surface (cairo_t *cr) +{ + cairo_surface_t *surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_ALPHA, + RECT / 2, + RECT / 2); + cairo_pattern_t *pattern = cairo_pattern_create_for_surface (surface); + cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REFLECT); + + cairo_mask (cr, pattern); + + cairo_pattern_destroy (pattern); + cairo_surface_destroy (surface); +} + +static void +mask_with_nonclear_surface (cairo_t *cr) +{ + static unsigned char data[8 * 4] = { 0, }; + cairo_surface_t *surface = cairo_image_surface_create_for_data (data, + CAIRO_FORMAT_A1, + 16, 8, 4); + + cairo_mask_surface (cr, surface, 0, 0); + + cairo_surface_destroy (surface); +} + +static void +mask_with_0x0_surface (cairo_t *cr) +{ + cairo_surface_t *surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + 0, 0); + + cairo_mask_surface (cr, surface, 0, 0); + + cairo_surface_destroy (surface); +} + +static void +mask_with_extend_none (cairo_t *cr) +{ + cairo_surface_t *surface = cairo_surface_create_similar (cairo_get_target (cr), + CAIRO_CONTENT_COLOR_ALPHA, + RECT, + RECT); + + cairo_mask_surface (cr, surface, 2 * RECT, 2 * RECT); + + cairo_surface_destroy (surface); +} + +typedef void (* mask_func_t) (cairo_t *); + +static mask_func_t mask_funcs[] = { + paint_with_alpha, + mask_with_solid, + mask_with_empty_gradient, + mask_with_gradient, + mask_with_surface, + mask_with_alpha_surface, + mask_with_nonclear_surface, + mask_with_0x0_surface, + mask_with_extend_none +}; + +static cairo_operator_t operators[] = { + CAIRO_OPERATOR_CLEAR, + CAIRO_OPERATOR_SOURCE, + CAIRO_OPERATOR_OVER, + CAIRO_OPERATOR_IN, + CAIRO_OPERATOR_DEST_ATOP, + CAIRO_OPERATOR_SATURATE, + CAIRO_OPERATOR_MULTIPLY +}; + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + unsigned int i, op; + + /* 565-compatible gray background */ + cairo_set_source_rgb (cr, 0.51613, 0.55555, 0.51613); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); /* green */ + /* mask with zero-alpha in several ways */ + + cairo_translate (cr, SPACE, SPACE); + + for (op = 0; op < ARRAY_LENGTH (operators); op++) { + cairo_set_operator (cr, operators[op]); + + for (i = 0; i < ARRAY_LENGTH (mask_funcs); i++) { + cairo_save (cr); + cairo_translate (cr, i * (RECT + SPACE), op * (RECT + SPACE)); + cairo_rectangle (cr, 0, 0, RECT, RECT); + cairo_clip (cr); + mask_funcs[i] (cr); + cairo_restore (cr); + } + } + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (zero_mask, + "Testing that masking with zero alpha works", + "alpha, mask", /* keywords */ + NULL, /* requirements */ + SPACE + (RECT + SPACE) * ARRAY_LENGTH (mask_funcs), + SPACE + (RECT + SPACE) * ARRAY_LENGTH (operators), + NULL, draw) diff --git a/util/COPYING b/util/COPYING new file mode 100644 index 000000000..ea44bb6f5 --- /dev/null +++ b/util/COPYING @@ -0,0 +1,4 @@ +Cairo is free software. + +These utilities are all free software, please see the licensing conditions +in the opening comments of each file. diff --git a/util/Makefile.am b/util/Makefile.am new file mode 100644 index 000000000..82d0a804c --- /dev/null +++ b/util/Makefile.am @@ -0,0 +1,102 @@ +include $(top_srcdir)/build/Makefile.am.common + +SUBDIRS = . cairo-missing + +if CAIRO_HAS_GOBJECT_FUNCTIONS +SUBDIRS += cairo-gobject +endif + +if CAIRO_HAS_INTERPRETER +SUBDIRS += cairo-script +endif + +if CAIRO_HAS_TRACE +SUBDIRS += cairo-trace +if CAIRO_HAS_DLSYM +if CAIRO_HAS_SCRIPT_SURFACE +if CAIRO_HAS_TEE_SURFACE +SUBDIRS += cairo-fdr +endif +endif +endif +endif + +if BUILD_SPHINX +if CAIRO_HAS_DLSYM +if CAIRO_HAS_SCRIPT_SURFACE +if CAIRO_HAS_TEE_SURFACE +SUBDIRS += cairo-sphinx +endif +endif +endif +endif + +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/util/cairo-script \ + $(CAIRO_CFLAGS) + +EXTRA_PROGRAMS += show-contour show-traps show-edges show-polygon show-events +if CAIRO_HAS_INTERPRETER +EXTRA_PROGRAMS += trace-to-xml xml-to-trace +endif + +trace_to_xml_LDADD = cairo-script/libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LDADD) + +xml_to_trace_LDADD = -lexpat + +show_traps_SOURCES = show-traps.c +show_traps_CFLAGS = $(gtk_CFLAGS) +#show_traps_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_traps_LDADD = $(gtk_LIBS) + +show_polygon_SOURCES = show-polygon.c +show_polygon_CFLAGS = $(gtk_CFLAGS) +#show_polygon_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_polygon_LDADD = $(gtk_LIBS) + +show_edges_SOURCES = show-edges.c +show_edges_CFLAGS = $(gtk_CFLAGS) +#show_edges_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_edges_LDADD = $(gtk_LIBS) + +show_contour_SOURCES = show-contour.c +show_contour_CFLAGS = $(gtk_CFLAGS) +#show_contour_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_contour_LDADD = $(gtk_LIBS) + +show_events_SOURCES = show-events.c +show_events_CFLAGS = $(gtk_CFLAGS) +#show_events_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_events_LDADD = $(gtk_LIBS) + +util: malloc-stats.so backtrace-symbols.so + +.la.so: + $(RM) $@ + $(LN_S) .libs/$*.so $@ + +CLEANFILES += *.so + +# The -rpath is needed to build shared objects that are not installed, +# ie. with EXTRA_LTLIBRARIES +AM_LDFLAGS = -module -avoid-version -export-dynamic -rpath /dev/null + +EXTRA_LTLIBRARIES += malloc-stats.la backtrace-symbols.la + +backtrace_symbols_la_LIBADD = -lbfd -liberty + +#malloc_stats_la_LIBADD = $(backtrace_symbols_la_LIBADD) backtrace-symbols.lo + +if HAVE_GTK +EXTRA_PROGRAMS += font-view +font_view_CFLAGS = $(gtk_CFLAGS) +font_view_LDADD = ../src/libcairo.la $(gtk_LIBS) +endif + +EXTRA_DIST += \ + COPYING \ + xr2cairo \ + cairo-api-update \ + cairo-view \ + waterfall diff --git a/util/Makefile.in b/util/Makefile.in new file mode 100644 index 000000000..def0d203c --- /dev/null +++ b/util/Makefile.in @@ -0,0 +1,1422 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/build/Makefile.am.common \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp $(top_srcdir)/build/test-driver \ + COPYING README +EXTRA_PROGRAMS = show-contour$(EXEEXT) show-traps$(EXEEXT) \ + show-edges$(EXEEXT) show-polygon$(EXEEXT) show-events$(EXEEXT) \ + $(am__EXEEXT_1) $(am__EXEEXT_2) +TESTS = +check_PROGRAMS = +@CAIRO_HAS_GOBJECT_FUNCTIONS_TRUE@am__append_1 = cairo-gobject +@CAIRO_HAS_INTERPRETER_TRUE@am__append_2 = cairo-script +@CAIRO_HAS_TRACE_TRUE@am__append_3 = cairo-trace +@CAIRO_HAS_DLSYM_TRUE@@CAIRO_HAS_SCRIPT_SURFACE_TRUE@@CAIRO_HAS_TEE_SURFACE_TRUE@@CAIRO_HAS_TRACE_TRUE@am__append_4 = cairo-fdr +@BUILD_SPHINX_TRUE@@CAIRO_HAS_DLSYM_TRUE@@CAIRO_HAS_SCRIPT_SURFACE_TRUE@@CAIRO_HAS_TEE_SURFACE_TRUE@am__append_5 = cairo-sphinx +@CAIRO_HAS_INTERPRETER_TRUE@am__append_6 = trace-to-xml xml-to-trace + +#malloc_stats_la_LIBADD = $(backtrace_symbols_la_LIBADD) backtrace-symbols.lo +@HAVE_GTK_TRUE@am__append_7 = font-view +subdir = util +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +backtrace_symbols_la_DEPENDENCIES = +backtrace_symbols_la_SOURCES = backtrace-symbols.c +backtrace_symbols_la_OBJECTS = backtrace-symbols.lo +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +malloc_stats_la_LIBADD = +malloc_stats_la_SOURCES = malloc-stats.c +malloc_stats_la_OBJECTS = malloc-stats.lo +@CAIRO_HAS_INTERPRETER_TRUE@am__EXEEXT_1 = trace-to-xml$(EXEEXT) \ +@CAIRO_HAS_INTERPRETER_TRUE@ xml-to-trace$(EXEEXT) +@HAVE_GTK_TRUE@am__EXEEXT_2 = font-view$(EXEEXT) +font_view_SOURCES = font-view.c +font_view_OBJECTS = font_view-font-view.$(OBJEXT) +am__DEPENDENCIES_1 = +@HAVE_GTK_TRUE@font_view_DEPENDENCIES = ../src/libcairo.la \ +@HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) +font_view_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(font_view_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_show_contour_OBJECTS = show_contour-show-contour.$(OBJEXT) +show_contour_OBJECTS = $(am_show_contour_OBJECTS) +show_contour_DEPENDENCIES = $(am__DEPENDENCIES_1) +show_contour_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(show_contour_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_show_edges_OBJECTS = show_edges-show-edges.$(OBJEXT) +show_edges_OBJECTS = $(am_show_edges_OBJECTS) +show_edges_DEPENDENCIES = $(am__DEPENDENCIES_1) +show_edges_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(show_edges_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_show_events_OBJECTS = show_events-show-events.$(OBJEXT) +show_events_OBJECTS = $(am_show_events_OBJECTS) +show_events_DEPENDENCIES = $(am__DEPENDENCIES_1) +show_events_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(show_events_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_show_polygon_OBJECTS = show_polygon-show-polygon.$(OBJEXT) +show_polygon_OBJECTS = $(am_show_polygon_OBJECTS) +show_polygon_DEPENDENCIES = $(am__DEPENDENCIES_1) +show_polygon_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(show_polygon_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_show_traps_OBJECTS = show_traps-show-traps.$(OBJEXT) +show_traps_OBJECTS = $(am_show_traps_OBJECTS) +show_traps_DEPENDENCIES = $(am__DEPENDENCIES_1) +show_traps_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(show_traps_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +trace_to_xml_SOURCES = trace-to-xml.c +trace_to_xml_OBJECTS = trace-to-xml.$(OBJEXT) +trace_to_xml_DEPENDENCIES = \ + cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/src/libcairo.la +xml_to_trace_SOURCES = xml-to-trace.c +xml_to_trace_OBJECTS = xml-to-trace.$(OBJEXT) +xml_to_trace_DEPENDENCIES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = backtrace-symbols.c malloc-stats.c font-view.c \ + $(show_contour_SOURCES) $(show_edges_SOURCES) \ + $(show_events_SOURCES) $(show_polygon_SOURCES) \ + $(show_traps_SOURCES) trace-to-xml.c xml-to-trace.c +DIST_SOURCES = backtrace-symbols.c malloc-stats.c font-view.c \ + $(show_contour_SOURCES) $(show_edges_SOURCES) \ + $(show_events_SOURCES) $(show_polygon_SOURCES) \ + $(show_traps_SOURCES) trace-to-xml.c xml-to-trace.c +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + check recheck distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +DIST_SUBDIRS = . cairo-missing cairo-gobject cairo-script cairo-trace \ + cairo-fdr cairo-sphinx +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +BUILT_SOURCES = +CLEANFILES = *.i *.s *.gch $(EXTRA_LTLIBRARIES) $(EXTRA_PROGRAMS) \ + $(check_PROGRAMS) *.so +DISTCLEANFILES = $(BUILT_SOURCES) +EXTRA_DIST = COPYING xr2cairo cairo-api-update cairo-view waterfall +EXTRA_LTLIBRARIES = malloc-stats.la backtrace-symbols.la +MAINTAINERCLEANFILES = Makefile.in +SUBDIRS = . cairo-missing $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/util/cairo-script \ + $(CAIRO_CFLAGS) + +trace_to_xml_LDADD = cairo-script/libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LDADD) +xml_to_trace_LDADD = -lexpat +show_traps_SOURCES = show-traps.c +show_traps_CFLAGS = $(gtk_CFLAGS) +#show_traps_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_traps_LDADD = $(gtk_LIBS) +show_polygon_SOURCES = show-polygon.c +show_polygon_CFLAGS = $(gtk_CFLAGS) +#show_polygon_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_polygon_LDADD = $(gtk_LIBS) +show_edges_SOURCES = show-edges.c +show_edges_CFLAGS = $(gtk_CFLAGS) +#show_edges_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_edges_LDADD = $(gtk_LIBS) +show_contour_SOURCES = show-contour.c +show_contour_CFLAGS = $(gtk_CFLAGS) +#show_contour_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_contour_LDADD = $(gtk_LIBS) +show_events_SOURCES = show-events.c +show_events_CFLAGS = $(gtk_CFLAGS) +#show_events_LDADD = $(top_builddir)/src/libcairo.la $(gtk_LIBS) +show_events_LDADD = $(gtk_LIBS) + +# The -rpath is needed to build shared objects that are not installed, +# ie. with EXTRA_LTLIBRARIES +AM_LDFLAGS = -module -avoid-version -export-dynamic -rpath /dev/null +backtrace_symbols_la_LIBADD = -lbfd -liberty +@HAVE_GTK_TRUE@font_view_CFLAGS = $(gtk_CFLAGS) +@HAVE_GTK_TRUE@font_view_LDADD = ../src/libcairo.la $(gtk_LIBS) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .la .lo .log .o .obj .so .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/build/Makefile.am.common $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/build/Makefile.am.common: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +backtrace-symbols.la: $(backtrace_symbols_la_OBJECTS) $(backtrace_symbols_la_DEPENDENCIES) $(EXTRA_backtrace_symbols_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(backtrace_symbols_la_OBJECTS) $(backtrace_symbols_la_LIBADD) $(LIBS) + +malloc-stats.la: $(malloc_stats_la_OBJECTS) $(malloc_stats_la_DEPENDENCIES) $(EXTRA_malloc_stats_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(malloc_stats_la_OBJECTS) $(malloc_stats_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +font-view$(EXEEXT): $(font_view_OBJECTS) $(font_view_DEPENDENCIES) $(EXTRA_font_view_DEPENDENCIES) + @rm -f font-view$(EXEEXT) + $(AM_V_CCLD)$(font_view_LINK) $(font_view_OBJECTS) $(font_view_LDADD) $(LIBS) + +show-contour$(EXEEXT): $(show_contour_OBJECTS) $(show_contour_DEPENDENCIES) $(EXTRA_show_contour_DEPENDENCIES) + @rm -f show-contour$(EXEEXT) + $(AM_V_CCLD)$(show_contour_LINK) $(show_contour_OBJECTS) $(show_contour_LDADD) $(LIBS) + +show-edges$(EXEEXT): $(show_edges_OBJECTS) $(show_edges_DEPENDENCIES) $(EXTRA_show_edges_DEPENDENCIES) + @rm -f show-edges$(EXEEXT) + $(AM_V_CCLD)$(show_edges_LINK) $(show_edges_OBJECTS) $(show_edges_LDADD) $(LIBS) + +show-events$(EXEEXT): $(show_events_OBJECTS) $(show_events_DEPENDENCIES) $(EXTRA_show_events_DEPENDENCIES) + @rm -f show-events$(EXEEXT) + $(AM_V_CCLD)$(show_events_LINK) $(show_events_OBJECTS) $(show_events_LDADD) $(LIBS) + +show-polygon$(EXEEXT): $(show_polygon_OBJECTS) $(show_polygon_DEPENDENCIES) $(EXTRA_show_polygon_DEPENDENCIES) + @rm -f show-polygon$(EXEEXT) + $(AM_V_CCLD)$(show_polygon_LINK) $(show_polygon_OBJECTS) $(show_polygon_LDADD) $(LIBS) + +show-traps$(EXEEXT): $(show_traps_OBJECTS) $(show_traps_DEPENDENCIES) $(EXTRA_show_traps_DEPENDENCIES) + @rm -f show-traps$(EXEEXT) + $(AM_V_CCLD)$(show_traps_LINK) $(show_traps_OBJECTS) $(show_traps_LDADD) $(LIBS) + +trace-to-xml$(EXEEXT): $(trace_to_xml_OBJECTS) $(trace_to_xml_DEPENDENCIES) $(EXTRA_trace_to_xml_DEPENDENCIES) + @rm -f trace-to-xml$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(trace_to_xml_OBJECTS) $(trace_to_xml_LDADD) $(LIBS) + +xml-to-trace$(EXEEXT): $(xml_to_trace_OBJECTS) $(xml_to_trace_DEPENDENCIES) $(EXTRA_xml_to_trace_DEPENDENCIES) + @rm -f xml-to-trace$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(xml_to_trace_OBJECTS) $(xml_to_trace_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backtrace-symbols.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/font_view-font-view.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc-stats.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show_contour-show-contour.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show_edges-show-edges.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show_events-show-events.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show_polygon-show-polygon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/show_traps-show-traps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trace-to-xml.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-to-trace.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +font_view-font-view.o: font-view.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(font_view_CFLAGS) $(CFLAGS) -MT font_view-font-view.o -MD -MP -MF $(DEPDIR)/font_view-font-view.Tpo -c -o font_view-font-view.o `test -f 'font-view.c' || echo '$(srcdir)/'`font-view.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/font_view-font-view.Tpo $(DEPDIR)/font_view-font-view.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-view.c' object='font_view-font-view.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(font_view_CFLAGS) $(CFLAGS) -c -o font_view-font-view.o `test -f 'font-view.c' || echo '$(srcdir)/'`font-view.c + +font_view-font-view.obj: font-view.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(font_view_CFLAGS) $(CFLAGS) -MT font_view-font-view.obj -MD -MP -MF $(DEPDIR)/font_view-font-view.Tpo -c -o font_view-font-view.obj `if test -f 'font-view.c'; then $(CYGPATH_W) 'font-view.c'; else $(CYGPATH_W) '$(srcdir)/font-view.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/font_view-font-view.Tpo $(DEPDIR)/font_view-font-view.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='font-view.c' object='font_view-font-view.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(font_view_CFLAGS) $(CFLAGS) -c -o font_view-font-view.obj `if test -f 'font-view.c'; then $(CYGPATH_W) 'font-view.c'; else $(CYGPATH_W) '$(srcdir)/font-view.c'; fi` + +show_contour-show-contour.o: show-contour.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_contour_CFLAGS) $(CFLAGS) -MT show_contour-show-contour.o -MD -MP -MF $(DEPDIR)/show_contour-show-contour.Tpo -c -o show_contour-show-contour.o `test -f 'show-contour.c' || echo '$(srcdir)/'`show-contour.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_contour-show-contour.Tpo $(DEPDIR)/show_contour-show-contour.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-contour.c' object='show_contour-show-contour.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_contour_CFLAGS) $(CFLAGS) -c -o show_contour-show-contour.o `test -f 'show-contour.c' || echo '$(srcdir)/'`show-contour.c + +show_contour-show-contour.obj: show-contour.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_contour_CFLAGS) $(CFLAGS) -MT show_contour-show-contour.obj -MD -MP -MF $(DEPDIR)/show_contour-show-contour.Tpo -c -o show_contour-show-contour.obj `if test -f 'show-contour.c'; then $(CYGPATH_W) 'show-contour.c'; else $(CYGPATH_W) '$(srcdir)/show-contour.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_contour-show-contour.Tpo $(DEPDIR)/show_contour-show-contour.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-contour.c' object='show_contour-show-contour.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_contour_CFLAGS) $(CFLAGS) -c -o show_contour-show-contour.obj `if test -f 'show-contour.c'; then $(CYGPATH_W) 'show-contour.c'; else $(CYGPATH_W) '$(srcdir)/show-contour.c'; fi` + +show_edges-show-edges.o: show-edges.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_edges_CFLAGS) $(CFLAGS) -MT show_edges-show-edges.o -MD -MP -MF $(DEPDIR)/show_edges-show-edges.Tpo -c -o show_edges-show-edges.o `test -f 'show-edges.c' || echo '$(srcdir)/'`show-edges.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_edges-show-edges.Tpo $(DEPDIR)/show_edges-show-edges.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-edges.c' object='show_edges-show-edges.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_edges_CFLAGS) $(CFLAGS) -c -o show_edges-show-edges.o `test -f 'show-edges.c' || echo '$(srcdir)/'`show-edges.c + +show_edges-show-edges.obj: show-edges.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_edges_CFLAGS) $(CFLAGS) -MT show_edges-show-edges.obj -MD -MP -MF $(DEPDIR)/show_edges-show-edges.Tpo -c -o show_edges-show-edges.obj `if test -f 'show-edges.c'; then $(CYGPATH_W) 'show-edges.c'; else $(CYGPATH_W) '$(srcdir)/show-edges.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_edges-show-edges.Tpo $(DEPDIR)/show_edges-show-edges.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-edges.c' object='show_edges-show-edges.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_edges_CFLAGS) $(CFLAGS) -c -o show_edges-show-edges.obj `if test -f 'show-edges.c'; then $(CYGPATH_W) 'show-edges.c'; else $(CYGPATH_W) '$(srcdir)/show-edges.c'; fi` + +show_events-show-events.o: show-events.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_events_CFLAGS) $(CFLAGS) -MT show_events-show-events.o -MD -MP -MF $(DEPDIR)/show_events-show-events.Tpo -c -o show_events-show-events.o `test -f 'show-events.c' || echo '$(srcdir)/'`show-events.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_events-show-events.Tpo $(DEPDIR)/show_events-show-events.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-events.c' object='show_events-show-events.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_events_CFLAGS) $(CFLAGS) -c -o show_events-show-events.o `test -f 'show-events.c' || echo '$(srcdir)/'`show-events.c + +show_events-show-events.obj: show-events.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_events_CFLAGS) $(CFLAGS) -MT show_events-show-events.obj -MD -MP -MF $(DEPDIR)/show_events-show-events.Tpo -c -o show_events-show-events.obj `if test -f 'show-events.c'; then $(CYGPATH_W) 'show-events.c'; else $(CYGPATH_W) '$(srcdir)/show-events.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_events-show-events.Tpo $(DEPDIR)/show_events-show-events.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-events.c' object='show_events-show-events.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_events_CFLAGS) $(CFLAGS) -c -o show_events-show-events.obj `if test -f 'show-events.c'; then $(CYGPATH_W) 'show-events.c'; else $(CYGPATH_W) '$(srcdir)/show-events.c'; fi` + +show_polygon-show-polygon.o: show-polygon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_polygon_CFLAGS) $(CFLAGS) -MT show_polygon-show-polygon.o -MD -MP -MF $(DEPDIR)/show_polygon-show-polygon.Tpo -c -o show_polygon-show-polygon.o `test -f 'show-polygon.c' || echo '$(srcdir)/'`show-polygon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_polygon-show-polygon.Tpo $(DEPDIR)/show_polygon-show-polygon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-polygon.c' object='show_polygon-show-polygon.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_polygon_CFLAGS) $(CFLAGS) -c -o show_polygon-show-polygon.o `test -f 'show-polygon.c' || echo '$(srcdir)/'`show-polygon.c + +show_polygon-show-polygon.obj: show-polygon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_polygon_CFLAGS) $(CFLAGS) -MT show_polygon-show-polygon.obj -MD -MP -MF $(DEPDIR)/show_polygon-show-polygon.Tpo -c -o show_polygon-show-polygon.obj `if test -f 'show-polygon.c'; then $(CYGPATH_W) 'show-polygon.c'; else $(CYGPATH_W) '$(srcdir)/show-polygon.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_polygon-show-polygon.Tpo $(DEPDIR)/show_polygon-show-polygon.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-polygon.c' object='show_polygon-show-polygon.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_polygon_CFLAGS) $(CFLAGS) -c -o show_polygon-show-polygon.obj `if test -f 'show-polygon.c'; then $(CYGPATH_W) 'show-polygon.c'; else $(CYGPATH_W) '$(srcdir)/show-polygon.c'; fi` + +show_traps-show-traps.o: show-traps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_traps_CFLAGS) $(CFLAGS) -MT show_traps-show-traps.o -MD -MP -MF $(DEPDIR)/show_traps-show-traps.Tpo -c -o show_traps-show-traps.o `test -f 'show-traps.c' || echo '$(srcdir)/'`show-traps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_traps-show-traps.Tpo $(DEPDIR)/show_traps-show-traps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-traps.c' object='show_traps-show-traps.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_traps_CFLAGS) $(CFLAGS) -c -o show_traps-show-traps.o `test -f 'show-traps.c' || echo '$(srcdir)/'`show-traps.c + +show_traps-show-traps.obj: show-traps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_traps_CFLAGS) $(CFLAGS) -MT show_traps-show-traps.obj -MD -MP -MF $(DEPDIR)/show_traps-show-traps.Tpo -c -o show_traps-show-traps.obj `if test -f 'show-traps.c'; then $(CYGPATH_W) 'show-traps.c'; else $(CYGPATH_W) '$(srcdir)/show-traps.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/show_traps-show-traps.Tpo $(DEPDIR)/show_traps-show-traps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='show-traps.c' object='show_traps-show-traps.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(show_traps_CFLAGS) $(CFLAGS) -c -o show_traps-show-traps.obj `if test -f 'show-traps.c'; then $(CYGPATH_W) 'show-traps.c'; else $(CYGPATH_W) '$(srcdir)/show-traps.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + else \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) all check check-am install install-am \ + install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-TESTS check-am clean clean-checkPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ + uninstall uninstall-am + + +util: malloc-stats.so backtrace-symbols.so + +.la.so: + $(RM) $@ + $(LN_S) .libs/$*.so $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/README b/util/README new file mode 100644 index 000000000..39560a8c3 --- /dev/null +++ b/util/README @@ -0,0 +1,67 @@ +Cairo Utilities +=============== + +There are a varieties of utilities we use with cairo. + + +backtrace-symbols +----------------- + +This is a small shared library designed to be preloaded by the +linker and its purpose is to make the backtrace_symbols() function +of glibc produce more useful source reference information. + +Build by: + + make backtrace-symbols.so + +and use by: + + LD_PRELOAD=$PWD/backtrace-symbols.so app-to-run + +This code should be contributed back to glibc at some point. + + +malloc-stats +------------ + +This is a small shared library designed to be preloaded by the +linker and its purpose is to make the malloc_stats() function +of glibc produce more useful information. + +Build by: + + make malloc-stats.so + +and use by: + + LD_PRELOAD=$PWD/malloc-stats.so app-to-run + +This works best when backtrace-symbols is in use. That is: + + LD_PRELOAD="$PWD/backtrace-symbols.so $PWD/malloc-stats.so" app-to-run + + +cairo-trace +----------- + +This tool can be used to trace all the cairo function calls made by an +applications. This is useful for either extracting a test case triggering +a bug from an application, or simply to get a general idea of how an +application is using cairo. + + +cairo-api-update and xr2cairo +----------------------------- + +These two scripts were used to convert source code written for pre-1.0 +cairo to newer API. See $(top_srcdir)/PORTING_GUIDE for more information. + +These files are obsolete now and may be removed in a future version. + + +cairo-view and waterfall +------------------------ + +These are two pycairo scripts useful for testing the toy font backend. + diff --git a/util/backtrace-symbols.c b/util/backtrace-symbols.c new file mode 100644 index 000000000..045ad7805 --- /dev/null +++ b/util/backtrace-symbols.c @@ -0,0 +1,377 @@ +/* + A hacky replacement for backtrace_symbols in glibc + + backtrace_symbols in glibc looks up symbols using dladdr which is limited in + the symbols that it sees. libbacktracesymbols opens the executable and shared + libraries using libbfd and will look up backtrace information using the symbol + table and the dwarf line information. + + It may make more sense for this program to use libelf instead of libbfd. + However, I have not investigated that yet. + + Derived from addr2line.c from GNU Binutils by Jeff Muizelaar + + Copyright 2007 Jeff Muizelaar +*/ + +/* addr2line.c -- convert addresses to line number and function name + Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by Ulrich Lauther + + This file was part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. */ + +#define fatal(a, b) exit(1) +#define bfd_fatal(a) exit(1) +#define bfd_nonfatal(a) exit(1) +#define list_matching_formats(a) exit(1) + +/* 2 characters for each byte, plus 1 each for 0, x, and NULL */ +#define PTRSTR_LEN (sizeof(void *) * 2 + 3) +#define true 1 +#define false 0 + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#if 0 + +void (*dbfd_init)(void); +bfd_vma (*dbfd_scan_vma)(const char *string, const char **end, int base); +bfd* (*dbfd_openr)(const char *filename, const char *target); +bfd_boolean (*dbfd_check_format)(bfd *abfd, bfd_format format); +bfd_boolean (*dbfd_check_format_matches)(bfd *abfd, bfd_format format, char ***matching); +bfd_boolean (*dbfd_close)(bfd *abfd); +bfd_boolean (*dbfd_map_over_sections)(bfd *abfd, void (*func)(bfd *abfd, asection *sect, void *obj), + void *obj); +#define bfd_init dbfd_init + +static void load_funcs(void) +{ + void * handle = dlopen("libbfd.so", RTLD_NOW); + dbfd_init = dlsym(handle, "bfd_init"); + dbfd_scan_vma = dlsym(handle, "bfd_scan_vma"); + dbfd_openr = dlsym(handle, "bfd_openr"); + dbfd_check_format = dlsym(handle, "bfd_check_format"); + dbfd_check_format_matches = dlsym(handle, "bfd_check_format_matches"); + dbfd_close = dlsym(handle, "bfd_close"); + dbfd_map_over_sections = dlsym(handle, "bfd_map_over_sections"); +} + +#endif + + +static asymbol **syms; /* Symbol table. */ + +/* 150 isn't special; it's just an arbitrary non-ASCII char value. */ +#define OPTION_DEMANGLER (150) + +static void slurp_symtab(bfd * abfd); +static void find_address_in_section(bfd *abfd, asection *section, void *data); + +/* Read in the symbol table. */ + +static void slurp_symtab(bfd * abfd) +{ + long symcount; + unsigned int size; + + if ((bfd_get_file_flags(abfd) & HAS_SYMS) == 0) + return; + + symcount = bfd_read_minisymbols(abfd, false, (PTR) & syms, &size); + if (symcount == 0) + symcount = bfd_read_minisymbols(abfd, true /* dynamic */ , + (PTR) & syms, &size); + + if (symcount < 0) + bfd_fatal(bfd_get_filename(abfd)); +} + +/* These global variables are used to pass information between + translate_addresses and find_address_in_section. */ + +static bfd_vma pc; +static const char *filename; +static const char *functionname; +static unsigned int line; +static int found; + +/* Look for an address in a section. This is called via + bfd_map_over_sections. */ + +static void find_address_in_section(bfd *abfd, asection *section, void *data __attribute__ ((__unused__)) ) +{ + bfd_vma vma; + bfd_size_type size; + + if (found) + return; + + if ((bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0) + return; + + vma = bfd_get_section_vma(abfd, section); + if (pc < vma) + return; + + size = bfd_section_size(abfd, section); + if (pc >= vma + size) + return; + + found = bfd_find_nearest_line(abfd, section, syms, pc - vma, + &filename, &functionname, &line); +} + +/* Read hexadecimal addresses from stdin, translate into + file_name:line_number and optionally function name. */ +#if 0 +static void translate_addresses(bfd * abfd, char (*addr)[PTRSTR_LEN], int naddr) +{ + while (naddr) { + pc = bfd_scan_vma(addr[naddr-1], NULL, 16); + + found = false; + bfd_map_over_sections(abfd, find_address_in_section, + (PTR) NULL); + + if (!found) { + printf("[%s] \?\?() \?\?:0\n",addr[naddr-1]); + } else { + const char *name; + + name = functionname; + if (name == NULL || *name == '\0') + name = "??"; + if (filename != NULL) { + char *h; + + h = strrchr(filename, '/'); + if (h != NULL) + filename = h + 1; + } + + printf("\t%s:%u\t", filename ? filename : "??", + line); + + printf("%s()\n", name); + + } + + /* fflush() is essential for using this command as a server + child process that reads addresses from a pipe and responds + with line number information, processing one address at a + time. */ + fflush(stdout); + naddr--; + } +} +#endif + +static char** translate_addresses_buf(bfd * abfd, bfd_vma *addr, int naddr) +{ + int naddr_orig = naddr; + char b; + int total = 0; + enum { Count, Print } state; + char *buf = &b; + int len = 0; + char **ret_buf = NULL; + /* iterate over the formating twice. + * the first time we count how much space we need + * the second time we do the actual printing */ + for (state=Count; state<=Print; state++) { + if (state == Print) { + ret_buf = malloc(total + sizeof(char*)*naddr); + buf = (char*)(ret_buf + naddr); + len = total; + } + while (naddr) { + if (state == Print) + ret_buf[naddr-1] = buf; + pc = addr[naddr-1]; + + found = false; + bfd_map_over_sections(abfd, find_address_in_section, + (PTR) NULL); + + if (!found) { + total += snprintf(buf, len, "[0x%llx] \?\?() \?\?:0",(long long unsigned int) addr[naddr-1]) + 1; + } else { + const char *name; + + name = functionname; + if (name == NULL || *name == '\0') + name = "??"; + if (filename != NULL) { + char *h; + + h = strrchr(filename, '/'); + if (h != NULL) + filename = h + 1; + } + total += snprintf(buf, len, "%s:%u\t%s()", filename ? filename : "??", + line, name) + 1; + + } + if (state == Print) { + /* set buf just past the end of string */ + buf = buf + total + 1; + } + naddr--; + } + naddr = naddr_orig; + } + return ret_buf; +} +/* Process a file. */ + +static char **process_file(const char *file_name, bfd_vma *addr, int naddr) +{ + bfd *abfd; + char **matching; + char **ret_buf; + + abfd = bfd_openr(file_name, NULL); + + if (abfd == NULL) + bfd_fatal(file_name); + + if (bfd_check_format(abfd, bfd_archive)) + fatal("%s: can not get addresses from archive", file_name); + + if (!bfd_check_format_matches(abfd, bfd_object, &matching)) { + bfd_nonfatal(bfd_get_filename(abfd)); + if (bfd_get_error() == + bfd_error_file_ambiguously_recognized) { + list_matching_formats(matching); + free(matching); + } + xexit(1); + } + + slurp_symtab(abfd); + + ret_buf = translate_addresses_buf(abfd, addr, naddr); + + free (syms); + syms = NULL; + + bfd_close(abfd); + return ret_buf; +} + +#define MAX_DEPTH 16 + +struct file_match { + const char *file; + void *address; + void *base; + void *hdr; +}; + +static int find_matching_file(struct dl_phdr_info *info, + size_t size, void *data) +{ + struct file_match *match = data; + /* This code is modeled from Gfind_proc_info-lsb.c:callback() from libunwind */ + long n; + const ElfW(Phdr) *phdr; + ElfW(Addr) load_base = info->dlpi_addr; + phdr = info->dlpi_phdr; + for (n = info->dlpi_phnum; --n >= 0; phdr++) { + if (phdr->p_type == PT_LOAD) { + ElfW(Addr) vaddr = phdr->p_vaddr + load_base; + if (match->address >= vaddr && match->address < vaddr + phdr->p_memsz) { + /* we found a match */ + match->file = info->dlpi_name; + match->base = info->dlpi_addr; + } + } + } + return 0; +} + +char **backtrace_symbols(void *const *buffer, int size) +{ + int stack_depth = size - 1; + int x,y; + /* discard calling function */ + int total = 0; + + char ***locations; + char **final; + char *f_strings; + + locations = malloc(sizeof(char**) * (stack_depth+1)); + + bfd_init(); + for(x=stack_depth, y=0; x>=0; x--, y++){ + struct file_match match = { .address = buffer[x] }; + char **ret_buf; + bfd_vma addr; + dl_iterate_phdr(find_matching_file, &match); + addr = buffer[x] - match.base; + if (match.file && strlen(match.file)) + ret_buf = process_file(match.file, &addr, 1); + else + ret_buf = process_file("/proc/self/exe", &addr, 1); + locations[x] = ret_buf; + total += strlen(ret_buf[0]) + 1; + } + + /* allocate the array of char* we are going to return and extra space for + * all of the strings */ + final = malloc(total + (stack_depth + 1) * sizeof(char*)); + /* get a pointer to the extra space */ + f_strings = (char*)(final + stack_depth + 1); + + /* fill in all of strings and pointers */ + for(x=stack_depth; x>=0; x--){ + strcpy(f_strings, locations[x][0]); + free(locations[x]); + final[x] = f_strings; + f_strings += strlen(f_strings) + 1; + } + + free(locations); + + return final; +} + +void +backtrace_symbols_fd(void *const *buffer, int size, int fd) +{ + int j; + char **strings; + + strings = backtrace_symbols(buffer, size); + if (strings == NULL) { + perror("backtrace_symbols"); + exit(EXIT_FAILURE); + } + + for (j = 0; j < size; j++) + printf("%s\n", strings[j]); + + free(strings); +} diff --git a/util/cairo-api-update b/util/cairo-api-update new file mode 100755 index 000000000..e16df43fd --- /dev/null +++ b/util/cairo-api-update @@ -0,0 +1,72 @@ +#!/bin/sh +set -e + +if [ $# -lt 1 ]; then + argv0=`basename $0` + echo "$argv0: Update source code to the lastest Cairo API" >&2 + echo "" >&2 + echo "Usage: $argv0 file [...]" >&2 + exit 1 +fi + +cairo_api_update() { + file=$1 + backup=$file.bak + + cp $file $backup + sed -e '/\(DEPRECATED\|REPLACED\)_BY/! { + s/cairo_current_font_extents/cairo_font_extents/g + s/cairo_get_font_extents/cairo_font_extents/g + s/cairo_current_operator/cairo_get_operator/g + s/cairo_current_tolerance/cairo_get_tolerance/g + s/cairo_current_point/cairo_get_current_point/g + s/cairo_current_fill_rule/cairo_get_fill_rule/g + s/cairo_current_line_width/cairo_get_line_width/g + s/cairo_current_line_cap/cairo_get_line_cap/g + s/cairo_current_line_join/cairo_get_line_join/g + s/cairo_current_miter_limit/cairo_get_miter_limit/g + s/cairo_current_matrix/cairo_get_matrix/g + s/cairo_current_pattern/cairo_get_source/g + s/cairo_current_target_surface/cairo_get_target/g + s/cairo_get_status/cairo_status/g + s/cairo_get_status_string/cairo_status_string/g + s/cairo_concat_matrix/cairo_transform/g + s/cairo_scale_font/cairo_set_font_size/g + s/cairo_select_font\([^_]\)/cairo_select_font_face\1/g + s/cairo_transform_font/cairo_set_font_matrix/g + s/cairo_transform_point/cairo_user_to_device/g + s/cairo_transform_distance/cairo_user_to_device_distance/g + s/cairo_inverse_transform_point/cairo_device_to_user/g + s/cairo_inverse_transform_distance/cairo_device_to_user_distance/g + s/cairo_init_clip/cairo_reset_clip/g + s/cairo_surface_create_for_image/cairo_image_surface_create_for_data/g + s/cairo_default_matrix/cairo_identity_matrix/g + s/cairo_matrix_set_affine/cairo_matrix_init/g + s/cairo_matrix_set_identity/cairo_matrix_init_identity/g + s/\([^_]\)cairo_pattern_add_color_stop\([^_]\)/\1cairo_pattern_add_color_stop_rgba\2/g + s/cairo_set_rgb_color/cairo_set_source_rgb/g + s/cairo_set_pattern/cairo_set_source/g + s/CAIRO_OPERATOR_SRC/CAIRO_OPERATOR_SOURCE/g + s/CAIRO_OPERATOR_DST/CAIRO_OPERATOR_DEST/g + s/CAIRO_OPERATOR_OVER_REVERSE/CAIRO_OPERATOR_DEST_OVER/g + s/CAIRO_OPERATOR_IN_REVERSE/CAIRO_OPERATOR_DEST_IN/g + s/CAIRO_OPERATOR_OUT_REVERSE/CAIRO_OPERATOR_DEST_OUT/g + s/CAIRO_OPERATOR_ATOP_REVERSE/CAIRO_OPERATOR_DEST_ATOP/g + } + ' $backup > $file + + grep -n 'cairo_create[ ]*([ ]*)' $file /dev/null | sed 's/^\(.*:[0-9]\+:\).*/\1 cairo_create must now accept a target surface/' + grep -n 'cairo_set_target_image' $file /dev/null | sed 's/^\(.*:[0-9]\+:\).*/\1 cairo_set_target_image should be reworked to use cairo_image_surface_create_for_data, likely before cairo_create/' + grep -n 'cairo_set_target_surface' $file /dev/null | sed 's/^\(.*:[0-9]\+:\).*/\1 cairo_set_target_surface for temporarily changing the target should now be rworked to create a temporary context with cairo_create/' + grep -n 'cairo_set_target_png' $file /dev/null | sed 's/^\(.*:[0-9]\+:\).*/\1 cairo_set_target_png should be reworked to use cairo_image_surface_create followed by cairo_surface_write_to_png/' + grep -n 'cairo_set_target_drawable' $file /dev/null | sed 's/^\(.*:[0-9]\+:\).*/\1 cairo_set_target_drawable should be reworked to use cairo_xlib_surface_create, likely before cairo_create/' + grep -n 'cairo_set_target_[^dis][^n]' $file /dev/null | sed 's/^\(.*:[0-9]\+:\).*cairo_set_target_\([a-z]*\).*/\1 cairo_set_target_\2 should be reworked to use cairo_\2_surface_create, likely before cairo_create/' + grep -n 'cairo_set_alpha' $file /dev/null | sed 's/\(.*:[0-9]\+:\).*/\1 cairo_set_alpha should be replaced by turning a nearby cairo_set_source_rgb into cairo_set_source_rgba or turning a nearby cairo_paint into cairo_paint_with_alpha/' +} + +while [ $# -gt 0 ]; do + file=$1 + shift + cairo_api_update $file +done + diff --git a/util/cairo-fdr/Makefile.am b/util/cairo-fdr/Makefile.am new file mode 100644 index 000000000..34215a659 --- /dev/null +++ b/util/cairo-fdr/Makefile.am @@ -0,0 +1,15 @@ +cairolibdir = $(libdir)/cairo + +#bin_SCRIPTS = cairo-fdr +cairolib_LTLIBRARIES = cairo-fdr.la + +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src + +cairo_fdr_la_SOURCES = fdr.c +cairo_fdr_la_CPPFLAGS = $(AM_CPPFLAGS) +cairo_fdr_la_CFLAGS = $(CAIRO_CFLAGS) +cairo_fdr_la_LDFLAGS = -module -no-undefined +if CAIRO_HAS_DL +cairo_fdr_la_LIBADD = -ldl +endif diff --git a/util/cairo-fdr/Makefile.in b/util/cairo-fdr/Makefile.in new file mode 100644 index 000000000..a7710e534 --- /dev/null +++ b/util/cairo-fdr/Makefile.in @@ -0,0 +1,765 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = util/cairo-fdr +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(cairolibdir)" +LTLIBRARIES = $(cairolib_LTLIBRARIES) +cairo_fdr_la_DEPENDENCIES = +am_cairo_fdr_la_OBJECTS = cairo_fdr_la-fdr.lo +cairo_fdr_la_OBJECTS = $(am_cairo_fdr_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +cairo_fdr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(cairo_fdr_la_CFLAGS) \ + $(CFLAGS) $(cairo_fdr_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(cairo_fdr_la_SOURCES) +DIST_SOURCES = $(cairo_fdr_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +cairolibdir = $(libdir)/cairo + +#bin_SCRIPTS = cairo-fdr +cairolib_LTLIBRARIES = cairo-fdr.la +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src + +cairo_fdr_la_SOURCES = fdr.c +cairo_fdr_la_CPPFLAGS = $(AM_CPPFLAGS) +cairo_fdr_la_CFLAGS = $(CAIRO_CFLAGS) +cairo_fdr_la_LDFLAGS = -module -no-undefined +@CAIRO_HAS_DL_TRUE@cairo_fdr_la_LIBADD = -ldl +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-fdr/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-fdr/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-cairolibLTLIBRARIES: $(cairolib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(cairolib_LTLIBRARIES)'; test -n "$(cairolibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairolibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairolibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(cairolibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(cairolibdir)"; \ + } + +uninstall-cairolibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(cairolib_LTLIBRARIES)'; test -n "$(cairolibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(cairolibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(cairolibdir)/$$f"; \ + done + +clean-cairolibLTLIBRARIES: + -test -z "$(cairolib_LTLIBRARIES)" || rm -f $(cairolib_LTLIBRARIES) + @list='$(cairolib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +cairo-fdr.la: $(cairo_fdr_la_OBJECTS) $(cairo_fdr_la_DEPENDENCIES) $(EXTRA_cairo_fdr_la_DEPENDENCIES) + $(AM_V_CCLD)$(cairo_fdr_la_LINK) -rpath $(cairolibdir) $(cairo_fdr_la_OBJECTS) $(cairo_fdr_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_fdr_la-fdr.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +cairo_fdr_la-fdr.lo: fdr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_fdr_la_CPPFLAGS) $(CPPFLAGS) $(cairo_fdr_la_CFLAGS) $(CFLAGS) -MT cairo_fdr_la-fdr.lo -MD -MP -MF $(DEPDIR)/cairo_fdr_la-fdr.Tpo -c -o cairo_fdr_la-fdr.lo `test -f 'fdr.c' || echo '$(srcdir)/'`fdr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_fdr_la-fdr.Tpo $(DEPDIR)/cairo_fdr_la-fdr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fdr.c' object='cairo_fdr_la-fdr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_fdr_la_CPPFLAGS) $(CPPFLAGS) $(cairo_fdr_la_CFLAGS) $(CFLAGS) -c -o cairo_fdr_la-fdr.lo `test -f 'fdr.c' || echo '$(srcdir)/'`fdr.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(cairolibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-cairolibLTLIBRARIES clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-cairolibLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-cairolibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-cairolibLTLIBRARIES clean-generic clean-libtool \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-cairolibLTLIBRARIES install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-cairolibLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-fdr/fdr.c b/util/cairo-fdr/fdr.c new file mode 100644 index 000000000..08d9c0113 --- /dev/null +++ b/util/cairo-fdr/fdr.c @@ -0,0 +1,331 @@ +/* cairo-fdr - a 'flight data recorder', a black box, for cairo + * + * Copyright © 2009 Chris Wilson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include + +static void *_dlhandle = RTLD_NEXT; +#define DLCALL(name, args...) ({ \ + static typeof (&name) name##_real; \ + if (name##_real == NULL) { \ + name##_real = dlsym (_dlhandle, #name); \ + if (name##_real == NULL && _dlhandle == RTLD_NEXT) { \ + _dlhandle = dlopen ("libcairo.so", RTLD_LAZY); \ + name##_real = dlsym (_dlhandle, #name); \ + assert (name##_real != NULL); \ + } \ + } \ + (*name##_real) (args); \ +}) + +#define RINGBUFFER_SIZE 16 +static cairo_surface_t *fdr_ringbuffer[RINGBUFFER_SIZE]; +static int fdr_position; +static int fdr_dump; + +static const cairo_user_data_key_t fdr_key; + +static void +fdr_replay_to_script (cairo_surface_t *recording, cairo_device_t *ctx) +{ + if (recording != NULL) { + DLCALL (cairo_script_write_comment, ctx, "--- fdr ---", -1); + DLCALL (cairo_script_from_recording_surface, ctx, recording); + } +} + +static void +fdr_dump_ringbuffer (void) +{ + cairo_device_t *ctx; + int n; + + ctx = DLCALL (cairo_script_create, "/tmp/fdr.trace"); + + for (n = fdr_position; n < RINGBUFFER_SIZE; n++) + fdr_replay_to_script (fdr_ringbuffer[n], ctx); + + for (n = 0; n < fdr_position; n++) + fdr_replay_to_script (fdr_ringbuffer[n], ctx); + + DLCALL (cairo_device_destroy, ctx); +} + +static void +fdr_sighandler (int sig) +{ + fdr_dump = 1; +} + +static void +fdr_urgent_sighandler (int sig) +{ + fdr_dump_ringbuffer (); +} + +static void +fdr_atexit (void) +{ + if (fdr_dump) + fdr_dump_ringbuffer (); +} + +static void +fdr_pending_signals (void) +{ + static int initialized; + + if (! initialized) { + initialized = 1; + + signal (SIGUSR1, fdr_sighandler); + + signal (SIGSEGV, fdr_urgent_sighandler); + signal (SIGABRT, fdr_urgent_sighandler); + atexit (fdr_atexit); + } + + if (fdr_dump) { + fdr_dump_ringbuffer (); + fdr_dump = 0; + } +} + +static void +fdr_get_extents (cairo_surface_t *surface, + cairo_rectangle_t *extents) +{ + cairo_t *cr; + + cr = DLCALL (cairo_create, surface); + DLCALL (cairo_clip_extents, cr, + &extents->x, &extents->y, &extents->width, &extents->height); + DLCALL (cairo_destroy, cr); + + extents->width -= extents->x; + extents->height -= extents->y; +} + +static void +fdr_surface_destroy (void *surface) +{ + DLCALL (cairo_surface_destroy, surface); +} + +static void +fdr_surface_reference (void *surface) +{ + DLCALL (cairo_surface_reference, surface); +} + +static cairo_surface_t * +fdr_surface_get_tee (cairo_surface_t *surface) +{ + return DLCALL (cairo_surface_get_user_data, surface, &fdr_key); +} + +static cairo_surface_t * +fdr_tee_surface_index (cairo_surface_t *surface, int index) +{ + return DLCALL (cairo_tee_surface_index, surface, index); +} + +cairo_t * +cairo_create (cairo_surface_t *surface) +{ + cairo_surface_t *record, *tee; + + fdr_pending_signals (); + + tee = fdr_surface_get_tee (surface); + if (tee == NULL) { + cairo_rectangle_t extents; + cairo_content_t content; + + fdr_get_extents (surface, &extents); + content = DLCALL (cairo_surface_get_content, surface); + + tee = DLCALL (cairo_tee_surface_create, surface); + record = DLCALL (cairo_recording_surface_create, content, &extents); + DLCALL (cairo_tee_surface_add, tee, record); + + DLCALL (cairo_surface_set_user_data, surface, + &fdr_key, tee, fdr_surface_destroy); + } else { + int n; + + record = fdr_tee_surface_index (tee, 1); + + /* update the position of the recording surface in the ringbuffer */ + for (n = 0; n < RINGBUFFER_SIZE; n++) { + if (record == fdr_ringbuffer[n]) { + fdr_ringbuffer[n] = NULL; + break; + } + } + } + + fdr_surface_destroy (fdr_ringbuffer[fdr_position]); + fdr_ringbuffer[fdr_position] = record; + fdr_position = (fdr_position + 1) % RINGBUFFER_SIZE; + + return DLCALL (cairo_create, tee); +} + +static void +fdr_remove_tee (cairo_surface_t *surface) +{ + fdr_surface_reference (surface); + DLCALL (cairo_surface_set_user_data, surface, &fdr_key, NULL, NULL); + fdr_surface_destroy (surface); +} + +void +cairo_destroy (cairo_t *cr) +{ + cairo_surface_t *tee; + + tee = DLCALL (cairo_get_target, cr); + DLCALL (cairo_destroy, cr); + + if (DLCALL (cairo_surface_get_reference_count, tee) == 1) + fdr_remove_tee (fdr_tee_surface_index (tee, 0)); +} + +void +cairo_pattern_destroy (cairo_pattern_t *pattern) +{ + if (DLCALL (cairo_pattern_get_type, pattern) == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_t *surface; + + if (DLCALL (cairo_pattern_get_surface, pattern, &surface) == CAIRO_STATUS_SUCCESS && + DLCALL (cairo_surface_get_type, surface) == CAIRO_SURFACE_TYPE_TEE && + DLCALL (cairo_surface_get_reference_count, surface) == 2) + { + fdr_remove_tee (fdr_tee_surface_index (surface, 0)); + } + } + + DLCALL (cairo_pattern_destroy, pattern); +} + +cairo_surface_t * +cairo_get_target (cairo_t *cr) +{ + cairo_surface_t *tee; + + tee = DLCALL (cairo_get_target, cr); + return fdr_tee_surface_index (tee, 0); +} + +cairo_surface_t * +cairo_get_group_target (cairo_t *cr) +{ + cairo_surface_t *tee; + + tee = DLCALL (cairo_get_group_target, cr); + return fdr_tee_surface_index (tee, 0); +} + +cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + return DLCALL (cairo_pattern_create_for_surface, surface); +} + +cairo_status_t +cairo_pattern_get_surface (cairo_pattern_t *pattern, + cairo_surface_t **surface) +{ + cairo_status_t status; + cairo_surface_t *tee; + + status = DLCALL (cairo_pattern_get_surface, pattern, surface); + if (status != CAIRO_STATUS_SUCCESS) + return status; + + tee = fdr_surface_get_tee (*surface); + if (tee != NULL) + *surface = tee; + + return CAIRO_STATUS_SUCCESS; +} + +void +cairo_set_source_surface (cairo_t *cr, + cairo_surface_t *surface, + double x, double y) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + DLCALL (cairo_set_source_surface, cr, surface, x, y); +} + +cairo_surface_t * +cairo_surface_create_similar (cairo_surface_t *surface, + cairo_content_t content, + int width, int height) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + return DLCALL (cairo_surface_create_similar, + surface, content, width, height); +} + +cairo_surface_t * +cairo_surface_create_for_rectangle (cairo_surface_t *surface, + double x, + double y, + double width, + double height) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + return DLCALL (cairo_surface_create_for_rectangle, + surface, x, y, width, height); +} diff --git a/util/cairo-gobject/Makefile.am b/util/cairo-gobject/Makefile.am new file mode 100644 index 000000000..22c1a278a --- /dev/null +++ b/util/cairo-gobject/Makefile.am @@ -0,0 +1,15 @@ +lib_LTLIBRARIES = libcairo-gobject.la + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src + +cairoincludedir=$(includedir)/cairo +cairoinclude_HEADERS = cairo-gobject.h +libcairo_gobject_la_SOURCES = \ + cairo-gobject-enums.c \ + cairo-gobject-structs.c \ + $(NULL) + +libcairo_gobject_la_CFLAGS = $(CAIRO_CFLAGS) $(GOBJECT_CFLAGS) +libcairo_gobject_la_LDFLAGS = -version-info $(CAIRO_LIBTOOL_VERSION_INFO) -no-undefined $(export_symbols) +libcairo_gobject_la_LIBADD = $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) $(GOBJECT_LIBS) + diff --git a/util/cairo-gobject/Makefile.in b/util/cairo-gobject/Makefile.in new file mode 100644 index 000000000..a7946fa19 --- /dev/null +++ b/util/cairo-gobject/Makefile.in @@ -0,0 +1,802 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = util/cairo-gobject +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp $(cairoinclude_HEADERS) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cairoincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libcairo_gobject_la_DEPENDENCIES = $(top_builddir)/src/libcairo.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libcairo_gobject_la_OBJECTS = \ + libcairo_gobject_la-cairo-gobject-enums.lo \ + libcairo_gobject_la-cairo-gobject-structs.lo +libcairo_gobject_la_OBJECTS = $(am_libcairo_gobject_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcairo_gobject_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libcairo_gobject_la_CFLAGS) $(CFLAGS) \ + $(libcairo_gobject_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libcairo_gobject_la_SOURCES) +DIST_SOURCES = $(libcairo_gobject_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(cairoinclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +lib_LTLIBRARIES = libcairo-gobject.la +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src +cairoincludedir = $(includedir)/cairo +cairoinclude_HEADERS = cairo-gobject.h +libcairo_gobject_la_SOURCES = \ + cairo-gobject-enums.c \ + cairo-gobject-structs.c \ + $(NULL) + +libcairo_gobject_la_CFLAGS = $(CAIRO_CFLAGS) $(GOBJECT_CFLAGS) +libcairo_gobject_la_LDFLAGS = -version-info $(CAIRO_LIBTOOL_VERSION_INFO) -no-undefined $(export_symbols) +libcairo_gobject_la_LIBADD = $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) $(GOBJECT_LIBS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-gobject/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-gobject/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libcairo-gobject.la: $(libcairo_gobject_la_OBJECTS) $(libcairo_gobject_la_DEPENDENCIES) $(EXTRA_libcairo_gobject_la_DEPENDENCIES) + $(AM_V_CCLD)$(libcairo_gobject_la_LINK) -rpath $(libdir) $(libcairo_gobject_la_OBJECTS) $(libcairo_gobject_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_gobject_la-cairo-gobject-enums.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_gobject_la-cairo-gobject-structs.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libcairo_gobject_la-cairo-gobject-enums.lo: cairo-gobject-enums.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_gobject_la_CFLAGS) $(CFLAGS) -MT libcairo_gobject_la-cairo-gobject-enums.lo -MD -MP -MF $(DEPDIR)/libcairo_gobject_la-cairo-gobject-enums.Tpo -c -o libcairo_gobject_la-cairo-gobject-enums.lo `test -f 'cairo-gobject-enums.c' || echo '$(srcdir)/'`cairo-gobject-enums.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_gobject_la-cairo-gobject-enums.Tpo $(DEPDIR)/libcairo_gobject_la-cairo-gobject-enums.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-gobject-enums.c' object='libcairo_gobject_la-cairo-gobject-enums.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_gobject_la_CFLAGS) $(CFLAGS) -c -o libcairo_gobject_la-cairo-gobject-enums.lo `test -f 'cairo-gobject-enums.c' || echo '$(srcdir)/'`cairo-gobject-enums.c + +libcairo_gobject_la-cairo-gobject-structs.lo: cairo-gobject-structs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_gobject_la_CFLAGS) $(CFLAGS) -MT libcairo_gobject_la-cairo-gobject-structs.lo -MD -MP -MF $(DEPDIR)/libcairo_gobject_la-cairo-gobject-structs.Tpo -c -o libcairo_gobject_la-cairo-gobject-structs.lo `test -f 'cairo-gobject-structs.c' || echo '$(srcdir)/'`cairo-gobject-structs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_gobject_la-cairo-gobject-structs.Tpo $(DEPDIR)/libcairo_gobject_la-cairo-gobject-structs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-gobject-structs.c' object='libcairo_gobject_la-cairo-gobject-structs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_gobject_la_CFLAGS) $(CFLAGS) -c -o libcairo_gobject_la-cairo-gobject-structs.lo `test -f 'cairo-gobject-structs.c' || echo '$(srcdir)/'`cairo-gobject-structs.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-cairoincludeHEADERS: $(cairoinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairoincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairoincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(cairoincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(cairoincludedir)" || exit $$?; \ + done + +uninstall-cairoincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(cairoincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cairoincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-cairoincludeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-cairoincludeHEADERS uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am \ + install-cairoincludeHEADERS install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am \ + uninstall-cairoincludeHEADERS uninstall-libLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-gobject/cairo-gobject-enums.c b/util/cairo-gobject/cairo-gobject-enums.c new file mode 100644 index 000000000..0a7c95d29 --- /dev/null +++ b/util/cairo-gobject/cairo-gobject-enums.c @@ -0,0 +1,511 @@ + +/* Generated data (by glib-mkenums) */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-gobject.h" + +GType +cairo_gobject_status_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_STATUS_SUCCESS, "CAIRO_STATUS_SUCCESS", "success" }, + { CAIRO_STATUS_NO_MEMORY, "CAIRO_STATUS_NO_MEMORY", "no-memory" }, + { CAIRO_STATUS_INVALID_RESTORE, "CAIRO_STATUS_INVALID_RESTORE", "invalid-restore" }, + { CAIRO_STATUS_INVALID_POP_GROUP, "CAIRO_STATUS_INVALID_POP_GROUP", "invalid-pop-group" }, + { CAIRO_STATUS_NO_CURRENT_POINT, "CAIRO_STATUS_NO_CURRENT_POINT", "no-current-point" }, + { CAIRO_STATUS_INVALID_MATRIX, "CAIRO_STATUS_INVALID_MATRIX", "invalid-matrix" }, + { CAIRO_STATUS_INVALID_STATUS, "CAIRO_STATUS_INVALID_STATUS", "invalid-status" }, + { CAIRO_STATUS_NULL_POINTER, "CAIRO_STATUS_NULL_POINTER", "null-pointer" }, + { CAIRO_STATUS_INVALID_STRING, "CAIRO_STATUS_INVALID_STRING", "invalid-string" }, + { CAIRO_STATUS_INVALID_PATH_DATA, "CAIRO_STATUS_INVALID_PATH_DATA", "invalid-path-data" }, + { CAIRO_STATUS_READ_ERROR, "CAIRO_STATUS_READ_ERROR", "read-error" }, + { CAIRO_STATUS_WRITE_ERROR, "CAIRO_STATUS_WRITE_ERROR", "write-error" }, + { CAIRO_STATUS_SURFACE_FINISHED, "CAIRO_STATUS_SURFACE_FINISHED", "surface-finished" }, + { CAIRO_STATUS_SURFACE_TYPE_MISMATCH, "CAIRO_STATUS_SURFACE_TYPE_MISMATCH", "surface-type-mismatch" }, + { CAIRO_STATUS_PATTERN_TYPE_MISMATCH, "CAIRO_STATUS_PATTERN_TYPE_MISMATCH", "pattern-type-mismatch" }, + { CAIRO_STATUS_INVALID_CONTENT, "CAIRO_STATUS_INVALID_CONTENT", "invalid-content" }, + { CAIRO_STATUS_INVALID_FORMAT, "CAIRO_STATUS_INVALID_FORMAT", "invalid-format" }, + { CAIRO_STATUS_INVALID_VISUAL, "CAIRO_STATUS_INVALID_VISUAL", "invalid-visual" }, + { CAIRO_STATUS_FILE_NOT_FOUND, "CAIRO_STATUS_FILE_NOT_FOUND", "file-not-found" }, + { CAIRO_STATUS_INVALID_DASH, "CAIRO_STATUS_INVALID_DASH", "invalid-dash" }, + { CAIRO_STATUS_INVALID_DSC_COMMENT, "CAIRO_STATUS_INVALID_DSC_COMMENT", "invalid-dsc-comment" }, + { CAIRO_STATUS_INVALID_INDEX, "CAIRO_STATUS_INVALID_INDEX", "invalid-index" }, + { CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, "CAIRO_STATUS_CLIP_NOT_REPRESENTABLE", "clip-not-representable" }, + { CAIRO_STATUS_TEMP_FILE_ERROR, "CAIRO_STATUS_TEMP_FILE_ERROR", "temp-file-error" }, + { CAIRO_STATUS_INVALID_STRIDE, "CAIRO_STATUS_INVALID_STRIDE", "invalid-stride" }, + { CAIRO_STATUS_FONT_TYPE_MISMATCH, "CAIRO_STATUS_FONT_TYPE_MISMATCH", "font-type-mismatch" }, + { CAIRO_STATUS_USER_FONT_IMMUTABLE, "CAIRO_STATUS_USER_FONT_IMMUTABLE", "user-font-immutable" }, + { CAIRO_STATUS_USER_FONT_ERROR, "CAIRO_STATUS_USER_FONT_ERROR", "user-font-error" }, + { CAIRO_STATUS_NEGATIVE_COUNT, "CAIRO_STATUS_NEGATIVE_COUNT", "negative-count" }, + { CAIRO_STATUS_INVALID_CLUSTERS, "CAIRO_STATUS_INVALID_CLUSTERS", "invalid-clusters" }, + { CAIRO_STATUS_INVALID_SLANT, "CAIRO_STATUS_INVALID_SLANT", "invalid-slant" }, + { CAIRO_STATUS_INVALID_WEIGHT, "CAIRO_STATUS_INVALID_WEIGHT", "invalid-weight" }, + { CAIRO_STATUS_INVALID_SIZE, "CAIRO_STATUS_INVALID_SIZE", "invalid-size" }, + { CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED, "CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED", "user-font-not-implemented" }, + { CAIRO_STATUS_DEVICE_TYPE_MISMATCH, "CAIRO_STATUS_DEVICE_TYPE_MISMATCH", "device-type-mismatch" }, + { CAIRO_STATUS_DEVICE_ERROR, "CAIRO_STATUS_DEVICE_ERROR", "device-error" }, + { CAIRO_STATUS_INVALID_MESH_CONSTRUCTION, "CAIRO_STATUS_INVALID_MESH_CONSTRUCTION", "invalid-mesh-construction" }, + { CAIRO_STATUS_LAST_STATUS, "CAIRO_STATUS_LAST_STATUS", "last-status" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_status_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_content_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_CONTENT_COLOR, "CAIRO_CONTENT_COLOR", "color" }, + { CAIRO_CONTENT_ALPHA, "CAIRO_CONTENT_ALPHA", "alpha" }, + { CAIRO_CONTENT_COLOR_ALPHA, "CAIRO_CONTENT_COLOR_ALPHA", "color-alpha" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_content_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_operator_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_OPERATOR_CLEAR, "CAIRO_OPERATOR_CLEAR", "clear" }, + { CAIRO_OPERATOR_SOURCE, "CAIRO_OPERATOR_SOURCE", "source" }, + { CAIRO_OPERATOR_OVER, "CAIRO_OPERATOR_OVER", "over" }, + { CAIRO_OPERATOR_IN, "CAIRO_OPERATOR_IN", "in" }, + { CAIRO_OPERATOR_OUT, "CAIRO_OPERATOR_OUT", "out" }, + { CAIRO_OPERATOR_ATOP, "CAIRO_OPERATOR_ATOP", "atop" }, + { CAIRO_OPERATOR_DEST, "CAIRO_OPERATOR_DEST", "dest" }, + { CAIRO_OPERATOR_DEST_OVER, "CAIRO_OPERATOR_DEST_OVER", "dest-over" }, + { CAIRO_OPERATOR_DEST_IN, "CAIRO_OPERATOR_DEST_IN", "dest-in" }, + { CAIRO_OPERATOR_DEST_OUT, "CAIRO_OPERATOR_DEST_OUT", "dest-out" }, + { CAIRO_OPERATOR_DEST_ATOP, "CAIRO_OPERATOR_DEST_ATOP", "dest-atop" }, + { CAIRO_OPERATOR_XOR, "CAIRO_OPERATOR_XOR", "xor" }, + { CAIRO_OPERATOR_ADD, "CAIRO_OPERATOR_ADD", "add" }, + { CAIRO_OPERATOR_SATURATE, "CAIRO_OPERATOR_SATURATE", "saturate" }, + { CAIRO_OPERATOR_MULTIPLY, "CAIRO_OPERATOR_MULTIPLY", "multiply" }, + { CAIRO_OPERATOR_SCREEN, "CAIRO_OPERATOR_SCREEN", "screen" }, + { CAIRO_OPERATOR_OVERLAY, "CAIRO_OPERATOR_OVERLAY", "overlay" }, + { CAIRO_OPERATOR_DARKEN, "CAIRO_OPERATOR_DARKEN", "darken" }, + { CAIRO_OPERATOR_LIGHTEN, "CAIRO_OPERATOR_LIGHTEN", "lighten" }, + { CAIRO_OPERATOR_COLOR_DODGE, "CAIRO_OPERATOR_COLOR_DODGE", "color-dodge" }, + { CAIRO_OPERATOR_COLOR_BURN, "CAIRO_OPERATOR_COLOR_BURN", "color-burn" }, + { CAIRO_OPERATOR_HARD_LIGHT, "CAIRO_OPERATOR_HARD_LIGHT", "hard-light" }, + { CAIRO_OPERATOR_SOFT_LIGHT, "CAIRO_OPERATOR_SOFT_LIGHT", "soft-light" }, + { CAIRO_OPERATOR_DIFFERENCE, "CAIRO_OPERATOR_DIFFERENCE", "difference" }, + { CAIRO_OPERATOR_EXCLUSION, "CAIRO_OPERATOR_EXCLUSION", "exclusion" }, + { CAIRO_OPERATOR_HSL_HUE, "CAIRO_OPERATOR_HSL_HUE", "hsl-hue" }, + { CAIRO_OPERATOR_HSL_SATURATION, "CAIRO_OPERATOR_HSL_SATURATION", "hsl-saturation" }, + { CAIRO_OPERATOR_HSL_COLOR, "CAIRO_OPERATOR_HSL_COLOR", "hsl-color" }, + { CAIRO_OPERATOR_HSL_LUMINOSITY, "CAIRO_OPERATOR_HSL_LUMINOSITY", "hsl-luminosity" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_operator_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_antialias_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_ANTIALIAS_DEFAULT, "CAIRO_ANTIALIAS_DEFAULT", "default" }, + + { CAIRO_ANTIALIAS_NONE, "CAIRO_ANTIALIAS_NONE", "none" }, + { CAIRO_ANTIALIAS_GRAY, "CAIRO_ANTIALIAS_GRAY", "gray" }, + { CAIRO_ANTIALIAS_SUBPIXEL, "CAIRO_ANTIALIAS_SUBPIXEL", "subpixel" }, + + { CAIRO_ANTIALIAS_FAST, "CAIRO_ANTIALIAS_FAST", "fast" }, + { CAIRO_ANTIALIAS_GOOD, "CAIRO_ANTIALIAS_GOOD", "good" }, + { CAIRO_ANTIALIAS_BEST, "CAIRO_ANTIALIAS_BEST", "best" }, + + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_antialias_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_fill_rule_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_FILL_RULE_WINDING, "CAIRO_FILL_RULE_WINDING", "winding" }, + { CAIRO_FILL_RULE_EVEN_ODD, "CAIRO_FILL_RULE_EVEN_ODD", "even-odd" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_fill_rule_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_line_cap_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_LINE_CAP_BUTT, "CAIRO_LINE_CAP_BUTT", "butt" }, + { CAIRO_LINE_CAP_ROUND, "CAIRO_LINE_CAP_ROUND", "round" }, + { CAIRO_LINE_CAP_SQUARE, "CAIRO_LINE_CAP_SQUARE", "square" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_line_cap_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_line_join_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_LINE_JOIN_MITER, "CAIRO_LINE_JOIN_MITER", "miter" }, + { CAIRO_LINE_JOIN_ROUND, "CAIRO_LINE_JOIN_ROUND", "round" }, + { CAIRO_LINE_JOIN_BEVEL, "CAIRO_LINE_JOIN_BEVEL", "bevel" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_line_join_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_text_cluster_flags_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_TEXT_CLUSTER_FLAG_BACKWARD, "CAIRO_TEXT_CLUSTER_FLAG_BACKWARD", "backward" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_text_cluster_flags_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_font_slant_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_FONT_SLANT_NORMAL, "CAIRO_FONT_SLANT_NORMAL", "normal" }, + { CAIRO_FONT_SLANT_ITALIC, "CAIRO_FONT_SLANT_ITALIC", "italic" }, + { CAIRO_FONT_SLANT_OBLIQUE, "CAIRO_FONT_SLANT_OBLIQUE", "oblique" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_font_slant_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_font_weight_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_FONT_WEIGHT_NORMAL, "CAIRO_FONT_WEIGHT_NORMAL", "normal" }, + { CAIRO_FONT_WEIGHT_BOLD, "CAIRO_FONT_WEIGHT_BOLD", "bold" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_font_weight_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_subpixel_order_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_SUBPIXEL_ORDER_DEFAULT, "CAIRO_SUBPIXEL_ORDER_DEFAULT", "default" }, + { CAIRO_SUBPIXEL_ORDER_RGB, "CAIRO_SUBPIXEL_ORDER_RGB", "rgb" }, + { CAIRO_SUBPIXEL_ORDER_BGR, "CAIRO_SUBPIXEL_ORDER_BGR", "bgr" }, + { CAIRO_SUBPIXEL_ORDER_VRGB, "CAIRO_SUBPIXEL_ORDER_VRGB", "vrgb" }, + { CAIRO_SUBPIXEL_ORDER_VBGR, "CAIRO_SUBPIXEL_ORDER_VBGR", "vbgr" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_subpixel_order_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_hint_style_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_HINT_STYLE_DEFAULT, "CAIRO_HINT_STYLE_DEFAULT", "default" }, + { CAIRO_HINT_STYLE_NONE, "CAIRO_HINT_STYLE_NONE", "none" }, + { CAIRO_HINT_STYLE_SLIGHT, "CAIRO_HINT_STYLE_SLIGHT", "slight" }, + { CAIRO_HINT_STYLE_MEDIUM, "CAIRO_HINT_STYLE_MEDIUM", "medium" }, + { CAIRO_HINT_STYLE_FULL, "CAIRO_HINT_STYLE_FULL", "full" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_hint_style_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_hint_metrics_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_HINT_METRICS_DEFAULT, "CAIRO_HINT_METRICS_DEFAULT", "default" }, + { CAIRO_HINT_METRICS_OFF, "CAIRO_HINT_METRICS_OFF", "off" }, + { CAIRO_HINT_METRICS_ON, "CAIRO_HINT_METRICS_ON", "on" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_hint_metrics_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_font_type_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_FONT_TYPE_TOY, "CAIRO_FONT_TYPE_TOY", "toy" }, + { CAIRO_FONT_TYPE_FT, "CAIRO_FONT_TYPE_FT", "ft" }, + { CAIRO_FONT_TYPE_WIN32, "CAIRO_FONT_TYPE_WIN32", "win32" }, + { CAIRO_FONT_TYPE_QUARTZ, "CAIRO_FONT_TYPE_QUARTZ", "quartz" }, + { CAIRO_FONT_TYPE_USER, "CAIRO_FONT_TYPE_USER", "user" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_font_type_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_path_data_type_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_PATH_MOVE_TO, "CAIRO_PATH_MOVE_TO", "move-to" }, + { CAIRO_PATH_LINE_TO, "CAIRO_PATH_LINE_TO", "line-to" }, + { CAIRO_PATH_CURVE_TO, "CAIRO_PATH_CURVE_TO", "curve-to" }, + { CAIRO_PATH_CLOSE_PATH, "CAIRO_PATH_CLOSE_PATH", "close-path" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_path_data_type_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_device_type_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_DEVICE_TYPE_DRM, "CAIRO_DEVICE_TYPE_DRM", "drm" }, + { CAIRO_DEVICE_TYPE_GL, "CAIRO_DEVICE_TYPE_GL", "gl" }, + { CAIRO_DEVICE_TYPE_SCRIPT, "CAIRO_DEVICE_TYPE_SCRIPT", "script" }, + { CAIRO_DEVICE_TYPE_XCB, "CAIRO_DEVICE_TYPE_XCB", "xcb" }, + { CAIRO_DEVICE_TYPE_XLIB, "CAIRO_DEVICE_TYPE_XLIB", "xlib" }, + { CAIRO_DEVICE_TYPE_XML, "CAIRO_DEVICE_TYPE_XML", "xml" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_device_type_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_surface_type_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_SURFACE_TYPE_IMAGE, "CAIRO_SURFACE_TYPE_IMAGE", "image" }, + { CAIRO_SURFACE_TYPE_PDF, "CAIRO_SURFACE_TYPE_PDF", "pdf" }, + { CAIRO_SURFACE_TYPE_PS, "CAIRO_SURFACE_TYPE_PS", "ps" }, + { CAIRO_SURFACE_TYPE_XLIB, "CAIRO_SURFACE_TYPE_XLIB", "xlib" }, + { CAIRO_SURFACE_TYPE_XCB, "CAIRO_SURFACE_TYPE_XCB", "xcb" }, + { CAIRO_SURFACE_TYPE_GLITZ, "CAIRO_SURFACE_TYPE_GLITZ", "glitz" }, + { CAIRO_SURFACE_TYPE_QUARTZ, "CAIRO_SURFACE_TYPE_QUARTZ", "quartz" }, + { CAIRO_SURFACE_TYPE_WIN32, "CAIRO_SURFACE_TYPE_WIN32", "win32" }, + { CAIRO_SURFACE_TYPE_BEOS, "CAIRO_SURFACE_TYPE_BEOS", "beos" }, + { CAIRO_SURFACE_TYPE_DIRECTFB, "CAIRO_SURFACE_TYPE_DIRECTFB", "directfb" }, + { CAIRO_SURFACE_TYPE_SVG, "CAIRO_SURFACE_TYPE_SVG", "svg" }, + { CAIRO_SURFACE_TYPE_OS2, "CAIRO_SURFACE_TYPE_OS2", "os2" }, + { CAIRO_SURFACE_TYPE_WIN32_PRINTING, "CAIRO_SURFACE_TYPE_WIN32_PRINTING", "win32-printing" }, + { CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, "CAIRO_SURFACE_TYPE_QUARTZ_IMAGE", "quartz-image" }, + { CAIRO_SURFACE_TYPE_SCRIPT, "CAIRO_SURFACE_TYPE_SCRIPT", "script" }, + { CAIRO_SURFACE_TYPE_QT, "CAIRO_SURFACE_TYPE_QT", "qt" }, + { CAIRO_SURFACE_TYPE_RECORDING, "CAIRO_SURFACE_TYPE_RECORDING", "recording" }, + { CAIRO_SURFACE_TYPE_VG, "CAIRO_SURFACE_TYPE_VG", "vg" }, + { CAIRO_SURFACE_TYPE_GL, "CAIRO_SURFACE_TYPE_GL", "gl" }, + { CAIRO_SURFACE_TYPE_DRM, "CAIRO_SURFACE_TYPE_DRM", "drm" }, + { CAIRO_SURFACE_TYPE_TEE, "CAIRO_SURFACE_TYPE_TEE", "tee" }, + { CAIRO_SURFACE_TYPE_XML, "CAIRO_SURFACE_TYPE_XML", "xml" }, + { CAIRO_SURFACE_TYPE_SKIA, "CAIRO_SURFACE_TYPE_SKIA", "skia" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_surface_type_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_format_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_FORMAT_INVALID, "CAIRO_FORMAT_INVALID", "invalid" }, + { CAIRO_FORMAT_ARGB32, "CAIRO_FORMAT_ARGB32", "argb32" }, + { CAIRO_FORMAT_RGB24, "CAIRO_FORMAT_RGB24", "rgb24" }, + { CAIRO_FORMAT_A8, "CAIRO_FORMAT_A8", "a8" }, + { CAIRO_FORMAT_A1, "CAIRO_FORMAT_A1", "a1" }, + { CAIRO_FORMAT_RGB16_565, "CAIRO_FORMAT_RGB16_565", "rgb16-565" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_format_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_pattern_type_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_PATTERN_TYPE_SOLID, "CAIRO_PATTERN_TYPE_SOLID", "solid" }, + { CAIRO_PATTERN_TYPE_SURFACE, "CAIRO_PATTERN_TYPE_SURFACE", "surface" }, + { CAIRO_PATTERN_TYPE_LINEAR, "CAIRO_PATTERN_TYPE_LINEAR", "linear" }, + { CAIRO_PATTERN_TYPE_RADIAL, "CAIRO_PATTERN_TYPE_RADIAL", "radial" }, + { CAIRO_PATTERN_TYPE_MESH, "CAIRO_PATTERN_TYPE_MESH", "mesh" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_pattern_type_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_extend_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_EXTEND_NONE, "CAIRO_EXTEND_NONE", "none" }, + { CAIRO_EXTEND_REPEAT, "CAIRO_EXTEND_REPEAT", "repeat" }, + { CAIRO_EXTEND_REFLECT, "CAIRO_EXTEND_REFLECT", "reflect" }, + { CAIRO_EXTEND_PAD, "CAIRO_EXTEND_PAD", "pad" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_extend_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_filter_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_FILTER_FAST, "CAIRO_FILTER_FAST", "fast" }, + { CAIRO_FILTER_GOOD, "CAIRO_FILTER_GOOD", "good" }, + { CAIRO_FILTER_BEST, "CAIRO_FILTER_BEST", "best" }, + { CAIRO_FILTER_NEAREST, "CAIRO_FILTER_NEAREST", "nearest" }, + { CAIRO_FILTER_BILINEAR, "CAIRO_FILTER_BILINEAR", "bilinear" }, + { CAIRO_FILTER_GAUSSIAN, "CAIRO_FILTER_GAUSSIAN", "gaussian" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_filter_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +GType +cairo_gobject_region_overlap_get_type (void) +{ + static volatile gsize type_volatile = 0; + if (g_once_init_enter (&type_volatile)) { + static const GEnumValue values[] = { + { CAIRO_REGION_OVERLAP_IN, "CAIRO_REGION_OVERLAP_IN", "in" }, + { CAIRO_REGION_OVERLAP_OUT, "CAIRO_REGION_OVERLAP_OUT", "out" }, + { CAIRO_REGION_OVERLAP_PART, "CAIRO_REGION_OVERLAP_PART", "part" }, + { 0, NULL, NULL } + }; + GType type = g_enum_register_static (g_intern_static_string ("cairo_region_overlap_t"), values); + + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + + +/* Generated data ends here */ + diff --git a/util/cairo-gobject/cairo-gobject-structs.c b/util/cairo-gobject/cairo-gobject-structs.c new file mode 100644 index 000000000..4bbf11baa --- /dev/null +++ b/util/cairo-gobject/cairo-gobject-structs.c @@ -0,0 +1,89 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Benjamin Otte + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-gobject.h" + +#define CAIRO_DEFINE_BOXED(Name,underscore_name,copy_func,free_func) \ +GType \ +underscore_name ## _get_type (void) \ +{ \ + static volatile gsize type_volatile = 0; \ + if (g_once_init_enter (&type_volatile)) { \ + GType type = g_boxed_type_register_static (g_intern_static_string (Name), \ + (GBoxedCopyFunc)copy_func, \ + (GBoxedFreeFunc)free_func); \ + g_once_init_leave (&type_volatile, type); \ + } \ + return type_volatile; \ +} + +CAIRO_DEFINE_BOXED ("CairoContext", cairo_gobject_context, + cairo_reference, cairo_destroy); +CAIRO_DEFINE_BOXED ("CairoDevice", cairo_gobject_device, + cairo_device_reference, cairo_device_destroy); +CAIRO_DEFINE_BOXED ("CairoPattern", cairo_gobject_pattern, + cairo_pattern_reference, cairo_pattern_destroy); +CAIRO_DEFINE_BOXED ("CairoSurface", cairo_gobject_surface, + cairo_surface_reference, cairo_surface_destroy); +CAIRO_DEFINE_BOXED ("CairoScaledFont", cairo_gobject_scaled_font, + cairo_scaled_font_reference, cairo_scaled_font_destroy); +CAIRO_DEFINE_BOXED ("CairoFontFace", cairo_gobject_font_face, + cairo_font_face_reference, cairo_font_face_destroy); +CAIRO_DEFINE_BOXED ("CairoFontOptions", cairo_gobject_font_options, + cairo_font_options_copy, cairo_font_options_destroy); +CAIRO_DEFINE_BOXED ("CairoRegion", cairo_gobject_region, + cairo_region_reference, cairo_region_destroy); + +#define COPY_FUNC(name) \ +static gpointer \ +cairo_gobject_cairo_ ## name ## _copy (gpointer src) \ +{ \ + return g_memdup (src, sizeof (cairo_ ## name ## _t)); \ +} + +COPY_FUNC (matrix) +CAIRO_DEFINE_BOXED ("CairoMatrix", cairo_gobject_matrix, + cairo_gobject_cairo_matrix_copy, g_free); +COPY_FUNC (rectangle) +CAIRO_DEFINE_BOXED ("CairoRectangle", cairo_gobject_rectangle, + cairo_gobject_cairo_rectangle_copy, g_free); +COPY_FUNC (rectangle_int) +CAIRO_DEFINE_BOXED ("CairoRectangleInt", cairo_gobject_rectangle_int, + cairo_gobject_cairo_rectangle_int_copy, g_free); diff --git a/util/cairo-gobject/cairo-gobject.h b/util/cairo-gobject/cairo-gobject.h new file mode 100644 index 000000000..459074e83 --- /dev/null +++ b/util/cairo-gobject/cairo-gobject.h @@ -0,0 +1,192 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2010 Red Hat Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is University of Southern + * California. + * + * Contributor(s): + * Benjamin Otte + */ + +#ifndef CAIRO_GOBJECT_H +#define CAIRO_GOBJECT_H + +#include + +#if CAIRO_HAS_GOBJECT_FUNCTIONS + +#include + +CAIRO_BEGIN_DECLS + +/* structs */ + +#define CAIRO_GOBJECT_TYPE_CONTEXT cairo_gobject_context_get_type () +cairo_public GType +cairo_gobject_context_get_type (void); + +#define CAIRO_GOBJECT_TYPE_DEVICE cairo_gobject_device_get_type () +cairo_public GType +cairo_gobject_device_get_type (void); + +#define CAIRO_GOBJECT_TYPE_MATRIX cairo_gobject_matrix_get_type () +cairo_public GType +cairo_gobject_matrix_get_type (void); + +#define CAIRO_GOBJECT_TYPE_PATTERN cairo_gobject_pattern_get_type () +cairo_public GType +cairo_gobject_pattern_get_type (void); + +#define CAIRO_GOBJECT_TYPE_SURFACE cairo_gobject_surface_get_type () +cairo_public GType +cairo_gobject_surface_get_type (void); + +#define CAIRO_GOBJECT_TYPE_RECTANGLE cairo_gobject_rectangle_get_type () +cairo_public GType +cairo_gobject_rectangle_get_type (void); + +#define CAIRO_GOBJECT_TYPE_SCALED_FONT cairo_gobject_scaled_font_get_type () +cairo_public GType +cairo_gobject_scaled_font_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FONT_FACE cairo_gobject_font_face_get_type () +cairo_public GType +cairo_gobject_font_face_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FONT_OPTIONS cairo_gobject_font_options_get_type () +cairo_public GType +cairo_gobject_font_options_get_type (void); + +#define CAIRO_GOBJECT_TYPE_RECTANGLE_INT cairo_gobject_rectangle_int_get_type () +cairo_public GType +cairo_gobject_rectangle_int_get_type (void); + +#define CAIRO_GOBJECT_TYPE_REGION cairo_gobject_region_get_type () +cairo_public GType +cairo_gobject_region_get_type (void); + +/* enums */ + +#define CAIRO_GOBJECT_TYPE_STATUS cairo_gobject_status_get_type () +cairo_public GType +cairo_gobject_status_get_type (void); + +#define CAIRO_GOBJECT_TYPE_CONTENT cairo_gobject_content_get_type () +cairo_public GType +cairo_gobject_content_get_type (void); + +#define CAIRO_GOBJECT_TYPE_OPERATOR cairo_gobject_operator_get_type () +cairo_public GType +cairo_gobject_operator_get_type (void); + +#define CAIRO_GOBJECT_TYPE_ANTIALIAS cairo_gobject_antialias_get_type () +cairo_public GType +cairo_gobject_antialias_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FILL_RULE cairo_gobject_fill_rule_get_type () +cairo_public GType +cairo_gobject_fill_rule_get_type (void); + +#define CAIRO_GOBJECT_TYPE_LINE_CAP cairo_gobject_line_cap_get_type () +cairo_public GType +cairo_gobject_line_cap_get_type (void); + +#define CAIRO_GOBJECT_TYPE_LINE_JOIN cairo_gobject_line_join_get_type () +cairo_public GType +cairo_gobject_line_join_get_type (void); + +#define CAIRO_GOBJECT_TYPE_TEXT_CLUSTER_FLAGS cairo_gobject_text_cluster_flags_get_type () +cairo_public GType +cairo_gobject_text_cluster_flags_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FONT_SLANT cairo_gobject_font_slant_get_type () +cairo_public GType +cairo_gobject_font_slant_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FONT_WEIGHT cairo_gobject_font_weight_get_type () +cairo_public GType +cairo_gobject_font_weight_get_type (void); + +#define CAIRO_GOBJECT_TYPE_SUBPIXEL_ORDER cairo_gobject_subpixel_order_get_type () +cairo_public GType +cairo_gobject_subpixel_order_get_type (void); + +#define CAIRO_GOBJECT_TYPE_HINT_STYLE cairo_gobject_hint_style_get_type () +cairo_public GType +cairo_gobject_hint_style_get_type (void); + +/* historical accident */ +#define CAIRO_GOBJECT_TYPE_HNT_METRICS cairo_gobject_hint_metrics_get_type () +#define CAIRO_GOBJECT_TYPE_HINT_METRICS cairo_gobject_hint_metrics_get_type () +cairo_public GType +cairo_gobject_hint_metrics_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FONT_TYPE cairo_gobject_font_type_get_type () +cairo_public GType +cairo_gobject_font_type_get_type (void); + +#define CAIRO_GOBJECT_TYPE_PATH_DATA_TYPE cairo_gobject_path_data_type_get_type () +cairo_public GType +cairo_gobject_path_data_type_get_type (void); + +#define CAIRO_GOBJECT_TYPE_DEVICE_TYPE cairo_gobject_device_type_get_type () +cairo_public GType +cairo_gobject_device_type_get_type (void); + +#define CAIRO_GOBJECT_TYPE_SURFACE_TYPE cairo_gobject_surface_type_get_type () +cairo_public GType +cairo_gobject_surface_type_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FORMAT cairo_gobject_format_get_type () +cairo_public GType +cairo_gobject_format_get_type (void); + +#define CAIRO_GOBJECT_TYPE_PATTERN_TYPE cairo_gobject_pattern_type_get_type () +cairo_public GType +cairo_gobject_pattern_type_get_type (void); + +#define CAIRO_GOBJECT_TYPE_EXTEND cairo_gobject_extend_get_type () +cairo_public GType +cairo_gobject_extend_get_type (void); + +#define CAIRO_GOBJECT_TYPE_FILTER cairo_gobject_filter_get_type () +cairo_public GType +cairo_gobject_filter_get_type (void); + +#define CAIRO_GOBJECT_TYPE_REGION_OVERLAP cairo_gobject_region_overlap_get_type () +cairo_public GType +cairo_gobject_region_overlap_get_type (void); + +CAIRO_END_DECLS + +#else /* CAIRO_HAS_GOBJECT_FUNCTIONS */ +# error Cairo was not compiled with support for GObject +#endif /* CAIRO_HAS_GOBJECT_FUNCTIONS */ + +#endif /* CAIRO_GOBJECT_H */ diff --git a/util/cairo-missing/Makefile.am b/util/cairo-missing/Makefile.am new file mode 100644 index 000000000..907861026 --- /dev/null +++ b/util/cairo-missing/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/util/cairo-missing/Makefile.sources + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src + +noinst_LTLIBRARIES = libcairo-missing.la + +libcairo_missing_la_SOURCES = \ + $(libcairo_missing_sources) \ + $(libcairo_missing_headers) \ + $(NULL) diff --git a/util/cairo-missing/Makefile.in b/util/cairo-missing/Makefile.in new file mode 100644 index 000000000..f04b67a13 --- /dev/null +++ b/util/cairo-missing/Makefile.in @@ -0,0 +1,708 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/util/cairo-missing/Makefile.sources \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp +subdir = util/cairo-missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libcairo_missing_la_LIBADD = +am__objects_1 = strndup.lo getline.lo +am__objects_2 = +am_libcairo_missing_la_OBJECTS = $(am__objects_1) $(am__objects_2) +libcairo_missing_la_OBJECTS = $(am_libcairo_missing_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libcairo_missing_la_SOURCES) +DIST_SOURCES = $(libcairo_missing_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +libcairo_missing_sources = \ + strndup.c \ + getline.c \ + $(NULL) + +libcairo_missing_headers = \ + cairo-missing.h \ + $(NULL) + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src +noinst_LTLIBRARIES = libcairo-missing.la +libcairo_missing_la_SOURCES = \ + $(libcairo_missing_sources) \ + $(libcairo_missing_headers) \ + $(NULL) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/util/cairo-missing/Makefile.sources $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-missing/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-missing/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/util/cairo-missing/Makefile.sources: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libcairo-missing.la: $(libcairo_missing_la_OBJECTS) $(libcairo_missing_la_DEPENDENCIES) $(EXTRA_libcairo_missing_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libcairo_missing_la_OBJECTS) $(libcairo_missing_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strndup.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-missing/Makefile.sources b/util/cairo-missing/Makefile.sources new file mode 100644 index 000000000..1a306314a --- /dev/null +++ b/util/cairo-missing/Makefile.sources @@ -0,0 +1,8 @@ +libcairo_missing_sources = \ + strndup.c \ + getline.c \ + $(NULL) + +libcairo_missing_headers = \ + cairo-missing.h \ + $(NULL) diff --git a/util/cairo-missing/cairo-missing.h b/util/cairo-missing/cairo-missing.h new file mode 100644 index 000000000..741b498a8 --- /dev/null +++ b/util/cairo-missing/cairo-missing.h @@ -0,0 +1,59 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + * Andrea Canciani + */ + +#ifndef CAIRO_MISSING_H +#define CAIRO_MISSING_H + +#include "cairo-compiler-private.h" + +#include +#include +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include + +#if !defined(_SSIZE_T_DEFINED) && !defined(_SSIZE_T_) +typedef SSIZE_T ssize_t; +#endif +#endif + +#ifndef HAVE_GETLINE +cairo_private ssize_t +getline (char **lineptr, size_t *n, FILE *stream); +#endif + +#ifndef HAVE_STRNDUP +cairo_private char * +strndup (const char *s, size_t n); +#endif + +#endif diff --git a/util/cairo-missing/getline.c b/util/cairo-missing/getline.c new file mode 100644 index 000000000..8585cfdc2 --- /dev/null +++ b/util/cairo-missing/getline.c @@ -0,0 +1,90 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + * Andrea Canciani + */ + +#include "cairo-missing.h" + +#ifndef HAVE_GETLINE +#include "cairo-malloc-private.h" + +#define GETLINE_MIN_BUFFER_SIZE 128 +ssize_t +getline (char **lineptr, + size_t *n, + FILE *stream) +{ + char *line, *tmpline; + size_t len, offset; + ssize_t ret; + + offset = 0; + len = *n; + line = *lineptr; + if (len < GETLINE_MIN_BUFFER_SIZE) { + len = GETLINE_MIN_BUFFER_SIZE; + line = NULL; + } + + if (line == NULL) { + line = (char *) _cairo_malloc (len); + if (unlikely (line == NULL)) + return -1; + } + + while (1) { + if (offset + 1 == len) { + tmpline = (char *) _cairo_realloc_ab (line, len, 2); + if (unlikely (tmpline == NULL)) { + if (line != *lineptr) + free (line); + return -1; + } + len *= 2; + line = tmpline; + } + + ret = getc (stream); + if (ret == -1) + break; + + line[offset++] = ret; + if (ret == '\n') { + ret = offset; + break; + } + } + + line[offset++] = '\0'; + *lineptr = line; + *n = len; + + return ret; +} +#undef GETLINE_BUFFER_SIZE +#endif diff --git a/util/cairo-missing/strndup.c b/util/cairo-missing/strndup.c new file mode 100644 index 000000000..280ea3017 --- /dev/null +++ b/util/cairo-missing/strndup.c @@ -0,0 +1,57 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2006 Red Hat, Inc. + * Copyright © 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of the + * copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Carl Worth + * Andrea Canciani + */ + +#include "cairo-missing.h" + +#ifndef HAVE_STRNDUP +#include "cairo-malloc-private.h" + +char * +strndup (const char *s, + size_t n) +{ + size_t len; + char *sdup; + + if (s == NULL) + return NULL; + + len = strlen (s); + if (len > n) + len = n; + sdup = (char *) _cairo_malloc (len + 1); + if (sdup != NULL) { + memcpy (sdup, s, len); + sdup[len] = '\0'; + } + + return sdup; +} +#endif diff --git a/util/cairo-script/COPYING b/util/cairo-script/COPYING new file mode 100644 index 000000000..66ad7840f --- /dev/null +++ b/util/cairo-script/COPYING @@ -0,0 +1,17 @@ +Cairo is free software. + +Every source file in the implementation of cairo is available to be +redistributed and/or modified under the terms of either the GNU Lesser +General Public License (LGPL) version 2.1 or the Mozilla Public +License (MPL) version 1.1. Some files are available under more +liberal terms, but we believe that in all cases, each file may be used +under either the LGPL or the MPL. + +See the following files in this directory for the precise terms and +conditions of either license: + + COPYING-LGPL-2.1 + COPYING-MPL-1.1 + +Please see each file in the implementation for copyright and licensing +information, (in the opening comment of each file). diff --git a/util/cairo-script/Makefile.am b/util/cairo-script/Makefile.am new file mode 100644 index 000000000..d5c2998ac --- /dev/null +++ b/util/cairo-script/Makefile.am @@ -0,0 +1,34 @@ +include $(top_srcdir)/util/cairo-script/Makefile.sources + +SUBDIRS = examples + +lib_LTLIBRARIES = libcairo-script-interpreter.la +EXTRA_PROGRAMS = csi-replay csi-exec csi-bind + +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src + +cairoincludedir=$(includedir)/cairo +cairoinclude_HEADERS = cairo-script-interpreter.h +libcairo_script_interpreter_la_SOURCES = \ + $(libcairo_script_interpreter_sources) \ + $(libcairo_script_interpreter_headers) \ + $(NULL) +libcairo_script_interpreter_la_CFLAGS = $(CAIRO_CFLAGS) +libcairo_script_interpreter_la_LDFLAGS = -version-info $(CAIRO_LIBTOOL_VERSION_INFO) -no-undefined $(export_symbols) +libcairo_script_interpreter_la_LIBADD = $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) $(lzo_LIBS) -lz + +csi_replay_SOURCES = csi-replay.c +csi_replay_CFLAGS = $(CAIRO_CFLAGS) +csi_replay_LDADD = libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) + +csi_exec_SOURCES = csi-exec.c +csi_exec_LDADD = libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) + +if CAIRO_HAS_SCRIPT_SURFACE +EXTRA_PROGRAMS += csi-trace +csi_trace_SOURCES = csi-trace.c +csi_trace_LDADD = libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) +endif + +EXTRA_DIST = \ + COPYING diff --git a/util/cairo-script/Makefile.in b/util/cairo-script/Makefile.in new file mode 100644 index 000000000..6ae94ae4c --- /dev/null +++ b/util/cairo-script/Makefile.in @@ -0,0 +1,1056 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(top_srcdir)/util/cairo-script/Makefile.sources \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp $(cairoinclude_HEADERS) COPYING +EXTRA_PROGRAMS = csi-replay$(EXEEXT) csi-exec$(EXEEXT) \ + csi-bind$(EXEEXT) $(am__EXEEXT_1) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__append_1 = csi-trace +subdir = util/cairo-script +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cairoincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libcairo_script_interpreter_la_DEPENDENCIES = \ + $(top_builddir)/src/libcairo.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__objects_1 = libcairo_script_interpreter_la-cairo-script-file.lo \ + libcairo_script_interpreter_la-cairo-script-hash.lo \ + libcairo_script_interpreter_la-cairo-script-interpreter.lo \ + libcairo_script_interpreter_la-cairo-script-objects.lo \ + libcairo_script_interpreter_la-cairo-script-operators.lo \ + libcairo_script_interpreter_la-cairo-script-scanner.lo \ + libcairo_script_interpreter_la-cairo-script-stack.lo +am__objects_2 = +am_libcairo_script_interpreter_la_OBJECTS = $(am__objects_1) \ + $(am__objects_2) +libcairo_script_interpreter_la_OBJECTS = \ + $(am_libcairo_script_interpreter_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcairo_script_interpreter_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) \ + $(libcairo_script_interpreter_la_LDFLAGS) $(LDFLAGS) -o $@ +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am__EXEEXT_1 = csi-trace$(EXEEXT) +csi_bind_SOURCES = csi-bind.c +csi_bind_OBJECTS = csi-bind.$(OBJEXT) +csi_bind_LDADD = $(LDADD) +am_csi_exec_OBJECTS = csi-exec.$(OBJEXT) +csi_exec_OBJECTS = $(am_csi_exec_OBJECTS) +csi_exec_DEPENDENCIES = libcairo-script-interpreter.la \ + $(top_builddir)/src/libcairo.la $(am__DEPENDENCIES_1) +am_csi_replay_OBJECTS = csi_replay-csi-replay.$(OBJEXT) +csi_replay_OBJECTS = $(am_csi_replay_OBJECTS) +csi_replay_DEPENDENCIES = libcairo-script-interpreter.la \ + $(top_builddir)/src/libcairo.la $(am__DEPENDENCIES_1) +csi_replay_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(csi_replay_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__csi_trace_SOURCES_DIST = csi-trace.c +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@am_csi_trace_OBJECTS = \ +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@ csi-trace.$(OBJEXT) +csi_trace_OBJECTS = $(am_csi_trace_OBJECTS) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@csi_trace_DEPENDENCIES = \ +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@ libcairo-script-interpreter.la \ +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@ $(top_builddir)/src/libcairo.la \ +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libcairo_script_interpreter_la_SOURCES) csi-bind.c \ + $(csi_exec_SOURCES) $(csi_replay_SOURCES) $(csi_trace_SOURCES) +DIST_SOURCES = $(libcairo_script_interpreter_la_SOURCES) csi-bind.c \ + $(csi_exec_SOURCES) $(csi_replay_SOURCES) \ + $(am__csi_trace_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(cairoinclude_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +libcairo_script_interpreter_sources = \ + cairo-script-file.c \ + cairo-script-hash.c \ + cairo-script-interpreter.c \ + cairo-script-objects.c \ + cairo-script-operators.c \ + cairo-script-scanner.c \ + cairo-script-stack.c \ + $(NULL) + +libcairo_script_interpreter_headers = \ + cairo-script-private.h \ + $(NULL) + +SUBDIRS = examples +lib_LTLIBRARIES = libcairo-script-interpreter.la +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src +cairoincludedir = $(includedir)/cairo +cairoinclude_HEADERS = cairo-script-interpreter.h +libcairo_script_interpreter_la_SOURCES = \ + $(libcairo_script_interpreter_sources) \ + $(libcairo_script_interpreter_headers) \ + $(NULL) + +libcairo_script_interpreter_la_CFLAGS = $(CAIRO_CFLAGS) +libcairo_script_interpreter_la_LDFLAGS = -version-info $(CAIRO_LIBTOOL_VERSION_INFO) -no-undefined $(export_symbols) +libcairo_script_interpreter_la_LIBADD = $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) $(lzo_LIBS) -lz +csi_replay_SOURCES = csi-replay.c +csi_replay_CFLAGS = $(CAIRO_CFLAGS) +csi_replay_LDADD = libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) +csi_exec_SOURCES = csi-exec.c +csi_exec_LDADD = libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@csi_trace_SOURCES = csi-trace.c +@CAIRO_HAS_SCRIPT_SURFACE_TRUE@csi_trace_LDADD = libcairo-script-interpreter.la $(top_builddir)/src/libcairo.la $(CAIRO_LIBS) +EXTRA_DIST = \ + COPYING + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/util/cairo-script/Makefile.sources $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-script/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-script/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/util/cairo-script/Makefile.sources: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libcairo-script-interpreter.la: $(libcairo_script_interpreter_la_OBJECTS) $(libcairo_script_interpreter_la_DEPENDENCIES) $(EXTRA_libcairo_script_interpreter_la_DEPENDENCIES) + $(AM_V_CCLD)$(libcairo_script_interpreter_la_LINK) -rpath $(libdir) $(libcairo_script_interpreter_la_OBJECTS) $(libcairo_script_interpreter_la_LIBADD) $(LIBS) + +csi-bind$(EXEEXT): $(csi_bind_OBJECTS) $(csi_bind_DEPENDENCIES) $(EXTRA_csi_bind_DEPENDENCIES) + @rm -f csi-bind$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(csi_bind_OBJECTS) $(csi_bind_LDADD) $(LIBS) + +csi-exec$(EXEEXT): $(csi_exec_OBJECTS) $(csi_exec_DEPENDENCIES) $(EXTRA_csi_exec_DEPENDENCIES) + @rm -f csi-exec$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(csi_exec_OBJECTS) $(csi_exec_LDADD) $(LIBS) + +csi-replay$(EXEEXT): $(csi_replay_OBJECTS) $(csi_replay_DEPENDENCIES) $(EXTRA_csi_replay_DEPENDENCIES) + @rm -f csi-replay$(EXEEXT) + $(AM_V_CCLD)$(csi_replay_LINK) $(csi_replay_OBJECTS) $(csi_replay_LDADD) $(LIBS) + +csi-trace$(EXEEXT): $(csi_trace_OBJECTS) $(csi_trace_DEPENDENCIES) $(EXTRA_csi_trace_DEPENDENCIES) + @rm -f csi-trace$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(csi_trace_OBJECTS) $(csi_trace_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csi-bind.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csi-exec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csi-trace.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csi_replay-csi-replay.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-hash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-interpreter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-objects.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-operators.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-scanner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_script_interpreter_la-cairo-script-stack.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libcairo_script_interpreter_la-cairo-script-file.lo: cairo-script-file.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-file.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-file.Tpo -c -o libcairo_script_interpreter_la-cairo-script-file.lo `test -f 'cairo-script-file.c' || echo '$(srcdir)/'`cairo-script-file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-file.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-file.c' object='libcairo_script_interpreter_la-cairo-script-file.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-file.lo `test -f 'cairo-script-file.c' || echo '$(srcdir)/'`cairo-script-file.c + +libcairo_script_interpreter_la-cairo-script-hash.lo: cairo-script-hash.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-hash.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-hash.Tpo -c -o libcairo_script_interpreter_la-cairo-script-hash.lo `test -f 'cairo-script-hash.c' || echo '$(srcdir)/'`cairo-script-hash.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-hash.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-hash.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-hash.c' object='libcairo_script_interpreter_la-cairo-script-hash.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-hash.lo `test -f 'cairo-script-hash.c' || echo '$(srcdir)/'`cairo-script-hash.c + +libcairo_script_interpreter_la-cairo-script-interpreter.lo: cairo-script-interpreter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-interpreter.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-interpreter.Tpo -c -o libcairo_script_interpreter_la-cairo-script-interpreter.lo `test -f 'cairo-script-interpreter.c' || echo '$(srcdir)/'`cairo-script-interpreter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-interpreter.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-interpreter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-interpreter.c' object='libcairo_script_interpreter_la-cairo-script-interpreter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-interpreter.lo `test -f 'cairo-script-interpreter.c' || echo '$(srcdir)/'`cairo-script-interpreter.c + +libcairo_script_interpreter_la-cairo-script-objects.lo: cairo-script-objects.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-objects.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-objects.Tpo -c -o libcairo_script_interpreter_la-cairo-script-objects.lo `test -f 'cairo-script-objects.c' || echo '$(srcdir)/'`cairo-script-objects.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-objects.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-objects.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-objects.c' object='libcairo_script_interpreter_la-cairo-script-objects.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-objects.lo `test -f 'cairo-script-objects.c' || echo '$(srcdir)/'`cairo-script-objects.c + +libcairo_script_interpreter_la-cairo-script-operators.lo: cairo-script-operators.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-operators.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-operators.Tpo -c -o libcairo_script_interpreter_la-cairo-script-operators.lo `test -f 'cairo-script-operators.c' || echo '$(srcdir)/'`cairo-script-operators.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-operators.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-operators.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-operators.c' object='libcairo_script_interpreter_la-cairo-script-operators.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-operators.lo `test -f 'cairo-script-operators.c' || echo '$(srcdir)/'`cairo-script-operators.c + +libcairo_script_interpreter_la-cairo-script-scanner.lo: cairo-script-scanner.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-scanner.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-scanner.Tpo -c -o libcairo_script_interpreter_la-cairo-script-scanner.lo `test -f 'cairo-script-scanner.c' || echo '$(srcdir)/'`cairo-script-scanner.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-scanner.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-scanner.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-scanner.c' object='libcairo_script_interpreter_la-cairo-script-scanner.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-scanner.lo `test -f 'cairo-script-scanner.c' || echo '$(srcdir)/'`cairo-script-scanner.c + +libcairo_script_interpreter_la-cairo-script-stack.lo: cairo-script-stack.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -MT libcairo_script_interpreter_la-cairo-script-stack.lo -MD -MP -MF $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-stack.Tpo -c -o libcairo_script_interpreter_la-cairo-script-stack.lo `test -f 'cairo-script-stack.c' || echo '$(srcdir)/'`cairo-script-stack.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-stack.Tpo $(DEPDIR)/libcairo_script_interpreter_la-cairo-script-stack.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cairo-script-stack.c' object='libcairo_script_interpreter_la-cairo-script-stack.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_script_interpreter_la_CFLAGS) $(CFLAGS) -c -o libcairo_script_interpreter_la-cairo-script-stack.lo `test -f 'cairo-script-stack.c' || echo '$(srcdir)/'`cairo-script-stack.c + +csi_replay-csi-replay.o: csi-replay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(csi_replay_CFLAGS) $(CFLAGS) -MT csi_replay-csi-replay.o -MD -MP -MF $(DEPDIR)/csi_replay-csi-replay.Tpo -c -o csi_replay-csi-replay.o `test -f 'csi-replay.c' || echo '$(srcdir)/'`csi-replay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csi_replay-csi-replay.Tpo $(DEPDIR)/csi_replay-csi-replay.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='csi-replay.c' object='csi_replay-csi-replay.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(csi_replay_CFLAGS) $(CFLAGS) -c -o csi_replay-csi-replay.o `test -f 'csi-replay.c' || echo '$(srcdir)/'`csi-replay.c + +csi_replay-csi-replay.obj: csi-replay.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(csi_replay_CFLAGS) $(CFLAGS) -MT csi_replay-csi-replay.obj -MD -MP -MF $(DEPDIR)/csi_replay-csi-replay.Tpo -c -o csi_replay-csi-replay.obj `if test -f 'csi-replay.c'; then $(CYGPATH_W) 'csi-replay.c'; else $(CYGPATH_W) '$(srcdir)/csi-replay.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csi_replay-csi-replay.Tpo $(DEPDIR)/csi_replay-csi-replay.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='csi-replay.c' object='csi_replay-csi-replay.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(csi_replay_CFLAGS) $(CFLAGS) -c -o csi_replay-csi-replay.obj `if test -f 'csi-replay.c'; then $(CYGPATH_W) 'csi-replay.c'; else $(CYGPATH_W) '$(srcdir)/csi-replay.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-cairoincludeHEADERS: $(cairoinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairoincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairoincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(cairoincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(cairoincludedir)" || exit $$?; \ + done + +uninstall-cairoincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(cairoinclude_HEADERS)'; test -n "$(cairoincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(cairoincludedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cairoincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-cairoincludeHEADERS + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-cairoincludeHEADERS uninstall-libLTLIBRARIES + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-cairoincludeHEADERS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-cairoincludeHEADERS uninstall-libLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-script/Makefile.sources b/util/cairo-script/Makefile.sources new file mode 100644 index 000000000..fd73a17cf --- /dev/null +++ b/util/cairo-script/Makefile.sources @@ -0,0 +1,13 @@ +libcairo_script_interpreter_sources = \ + cairo-script-file.c \ + cairo-script-hash.c \ + cairo-script-interpreter.c \ + cairo-script-objects.c \ + cairo-script-operators.c \ + cairo-script-scanner.c \ + cairo-script-stack.c \ + $(NULL) + +libcairo_script_interpreter_headers = \ + cairo-script-private.h \ + $(NULL) diff --git a/util/cairo-script/cairo-script-file.c b/util/cairo-script/cairo-script-file.c new file mode 100644 index 000000000..0274a3e7c --- /dev/null +++ b/util/cairo-script/cairo-script-file.c @@ -0,0 +1,1107 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairo-script-private.h" + +#include +#include /* INT_MAX */ +#include +#include + +#if HAVE_LZO +#include +#endif + +#define CHUNK_SIZE 32768 + +#define OWN_STREAM 0x1 + +csi_status_t +csi_file_new (csi_t *ctx, + csi_object_t *obj, + const char *path, const char *mode) +{ + csi_file_t *file; + + file = _csi_slab_alloc (ctx, sizeof (csi_file_t)); + if (file == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + file->base.type = CSI_OBJECT_TYPE_FILE; + file->base.ref = 1; + + file->data = NULL; + file->type = STDIO; + file->flags = OWN_STREAM; + file->src = fopen (path, mode); + if (file->src == NULL) { + _csi_slab_free (ctx, file, sizeof (csi_file_t)); + return _csi_error (CAIRO_STATUS_FILE_NOT_FOUND); + } + + file->data = _csi_alloc (ctx, CHUNK_SIZE); + if (file->data == NULL) { + _csi_slab_free (ctx, file, sizeof (csi_file_t)); + return _csi_error (CAIRO_STATUS_NO_MEMORY); + } + file->bp = file->data; + file->rem = 0; + + obj->type = CSI_OBJECT_TYPE_FILE; + obj->datum.file = file; + return CAIRO_STATUS_SUCCESS; +} + +csi_status_t +csi_file_new_for_stream (csi_t *ctx, + csi_object_t *obj, + FILE *stream) +{ + csi_file_t *file; + + file = _csi_slab_alloc (ctx, sizeof (csi_file_t)); + if (file == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + file->base.type = CSI_OBJECT_TYPE_FILE; + file->base.ref = 1; + + file->data = NULL; + file->type = STDIO; + file->flags = 0; + file->src = stream; + if (file->src == NULL) { + _csi_slab_free (ctx, file, sizeof (csi_file_t)); + return _csi_error (CAIRO_STATUS_FILE_NOT_FOUND); + } + + file->data = _csi_alloc (ctx, CHUNK_SIZE); + if (file->data == NULL) { + _csi_slab_free (ctx, file, sizeof (csi_file_t)); + return _csi_error (CAIRO_STATUS_NO_MEMORY); + } + file->bp = file->data; + file->rem = 0; + + obj->type = CSI_OBJECT_TYPE_FILE; + obj->datum.file = file; + return CAIRO_STATUS_SUCCESS; +} + +csi_status_t +csi_file_new_for_bytes (csi_t *ctx, + csi_object_t *obj, + const char *bytes, + unsigned int length) +{ + csi_file_t *file; + + file = _csi_slab_alloc (ctx, sizeof (csi_file_t)); + if (file == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + file->base.type = CSI_OBJECT_TYPE_FILE; + file->base.ref = 1; + + file->type = BYTES; + file->src = (uint8_t *) bytes; + file->data = (uint8_t *) bytes; + file->bp = (uint8_t *) bytes; + file->rem = length; + + obj->type = CSI_OBJECT_TYPE_FILE; + obj->datum.file = file; + return CAIRO_STATUS_SUCCESS; +} + +csi_status_t +csi_file_new_from_string (csi_t *ctx, + csi_object_t *obj, + csi_string_t *src) +{ + csi_file_t *file; + + file = _csi_slab_alloc (ctx, sizeof (csi_file_t)); + if (_csi_unlikely (file == NULL)) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + file->base.type = CSI_OBJECT_TYPE_FILE; + file->base.ref = 1; + + if (src->deflate) { + uLongf len = src->deflate; + csi_object_t tmp_obj; + csi_string_t *tmp_str; + csi_status_t status; + + status = csi_string_new (ctx, &tmp_obj, NULL, src->deflate); + if (_csi_unlikely (status)) + return status; + + tmp_str = tmp_obj.datum.string; + switch (src->method) { + case NONE: + default: + status = _csi_error (CAIRO_STATUS_NO_MEMORY); + break; + + case ZLIB: +#if HAVE_ZLIB + if (uncompress ((Bytef *) tmp_str->string, &len, + (Bytef *) src->string, src->len) != Z_OK) +#endif + status = _csi_error (CAIRO_STATUS_NO_MEMORY); + break; + case LZO: +#if HAVE_LZO + if (lzo2a_decompress ((lzo_bytep) src->string, src->len, + (lzo_bytep) tmp_str->string, &len, + NULL)) +#endif + status = _csi_error (CAIRO_STATUS_NO_MEMORY); + break; + } + if (_csi_unlikely (status)) { + csi_string_free (ctx, tmp_str); + _csi_slab_free (ctx, file, sizeof (csi_file_t)); + return status; + } + + file->src = tmp_str; + file->data = tmp_str->string; + file->rem = tmp_str->len; + } else { + file->src = src; src->base.ref++; + file->data = src->string; + file->rem = src->len; + } + file->type = BYTES; + file->bp = file->data; + + obj->type = CSI_OBJECT_TYPE_FILE; + obj->datum.file = file; + return CAIRO_STATUS_SUCCESS; +} + +static csi_status_t +_csi_file_new_filter (csi_t *ctx, + csi_object_t *obj, + csi_object_t *src, + const csi_filter_funcs_t *funcs, + void *data) +{ + csi_file_t *file; + csi_object_t src_file; + csi_status_t status; + + file = _csi_slab_alloc (ctx, sizeof (csi_file_t)); + if (file == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + obj->type = CSI_OBJECT_TYPE_FILE; + obj->datum.file = file; + + file->base.type = CSI_OBJECT_TYPE_FILE; + file->base.ref = 1; + + file->type = FILTER; + file->data = data; + file->filter = funcs; + status = csi_object_as_file (ctx, src, &src_file); + if (status) { + csi_object_free (ctx, obj); + return status; + } + file->src = src_file.datum.file; + + return CAIRO_STATUS_SUCCESS; +} + + +#if 0 +csi_status_t +csi_file_new_from_stream (csi_t *ctx, + FILE *file, + csi_object_t **out) +{ + csi_file_t *obj; + + obj = (csi_file_t *) _csi_object_new (ctx, CSI_OBJECT_TYPE_FILE); + if (obj == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + obj->type = STDIO; + obj->src = file; + obj->data = _csi_alloc (ctx, CHUNK_SIZE); + if (obj->data == NULL) { + csi_object_free (&obj->base); + return _csi_error (CAIRO_STATUS_UNDEFINED_FILENAME_ERROR); + } + obj->bp = obj->data; + obj->rem = 0; + + *out = &obj->base; + return CAIRO_STATUS_SUCCESS; +} + +static csi_object_t * +_csi_file_new_from_procedure (csi_t *ctx, csi_object_t *src) +{ + csi_file_t *obj; + + obj = (csi_file_t *) _csi_object_new (ctx, CSI_OBJECT_TYPE_FILE); + if (obj == NULL) + return NULL; + + obj->type = PROCEDURE; + obj->src = csi_object_reference (src); + obj->data = NULL; + + return &obj->base; +} +#endif + +typedef struct _ascii85_decode_data { + uint8_t buf[CHUNK_SIZE]; + uint8_t *bp; + short bytes_available; + short eod; +} _ascii85_decode_data_t; + +static int +_getc_skip_whitespace (csi_file_t *src) +{ + int c; + + do switch ((c = csi_file_getc (src))) { + case 0x0: + case 0x9: + case 0xa: + case 0xc: + case 0xd: + case 0x20: + continue; + + default: + return c; + } while (TRUE); + + return c; +} + +static void +_ascii85_decode (csi_file_t *file) +{ + _ascii85_decode_data_t *data = file->data; + unsigned int n; + + if (data->eod) + return; + + data->bp = data->buf; + + n = 0; + do { + unsigned int v = _getc_skip_whitespace (file->src); + if (v == 'z') { + data->buf[n+0] = 0; + data->buf[n+1] = 0; + data->buf[n+2] = 0; + data->buf[n+3] = 0; + } else if (v == '~') { + _getc_skip_whitespace (file->src); /* == '>' || IO_ERROR */ + data->eod = TRUE; + break; + } else if (v < '!' || v > 'u') { + /* IO_ERROR */ + data->eod = TRUE; + break; + } else { + unsigned int i; + + v -= '!'; + for (i = 1; i < 5; i++) { + int c = _getc_skip_whitespace (file->src); + if (c == '~') { /* short tuple */ + _getc_skip_whitespace (file->src); /* == '>' || IO_ERROR */ + data->eod = TRUE; + switch (i) { + case 0: + case 1: + /* IO_ERROR */ + break; + case 2: + v = v * (85*85*85) + 85*85*85 -1; + goto odd1; + case 3: + v = v * (85*85) + 85*85 -1; + goto odd2; + case 4: + v = v * 85 + 84; + data->buf[n+2] = v >> 8 & 0xff; +odd2: + data->buf[n+1] = v >> 16 & 0xff; +odd1: + data->buf[n+0] = v >> 24 & 0xff; + data->bytes_available = n + i - 1; + return; + } + break; + } + v = 85*v + c-'!'; + } + + data->buf[n+0] = v >> 24 & 0xff; + data->buf[n+1] = v >> 16 & 0xff; + data->buf[n+2] = v >> 8 & 0xff; + data->buf[n+3] = v >> 0 & 0xff; + } + n += 4; + } while (n < sizeof (data->buf) && data->eod == FALSE); + + data->bytes_available = n; +} + +static int +_ascii85_decode_getc (csi_file_t *file) +{ + _ascii85_decode_data_t *data = file->data; + + if (data->bytes_available == 0) { + _ascii85_decode (file); + + if (data->bytes_available == 0) + return EOF; + } + + data->bytes_available--; + return *data->bp++; +} + +static void +_ascii85_decode_putc (csi_file_t *file, int c) +{ + _ascii85_decode_data_t *data = file->data; + data->bytes_available++; + data->bp--; +} + +static int +_ascii85_decode_read (csi_file_t *file, uint8_t *buf, int len) +{ + _ascii85_decode_data_t *data = file->data; + + if (data->bytes_available == 0) { + _ascii85_decode (file); + + if (data->bytes_available == 0) + return 0; + } + + if (len > data->bytes_available) + len = data->bytes_available; + memcpy (buf, data->bp, len); + data->bp += len; + data->bytes_available -= len; + return len; +} + +csi_status_t +csi_file_new_ascii85_decode (csi_t *ctx, + csi_object_t *obj, + csi_dictionary_t *dict, + csi_object_t *src) +{ + static const csi_filter_funcs_t funcs = { + _ascii85_decode_getc, + _ascii85_decode_putc, + _ascii85_decode_read, + _csi_free, + }; + _ascii85_decode_data_t *data; + + data = _csi_alloc0 (ctx, sizeof (_ascii85_decode_data_t)); + if (data == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + return _csi_file_new_filter (ctx, obj, src, &funcs, data); +} + +#if HAVE_ZLIB +#include + +typedef struct _deflate_decode_data { + z_stream zlib_stream; + + uint8_t in[CHUNK_SIZE]; + uint8_t out[CHUNK_SIZE]; + + int bytes_available; + uint8_t *bp; +} _deflate_decode_data_t; + +static void +_deflate_decode (csi_file_t *file) +{ + _deflate_decode_data_t *data = file->data; + uint8_t *bp; + int len; + + data->zlib_stream.next_out = data->out; + data->zlib_stream.avail_out = sizeof (data->out); + + bp = data->in; + len = sizeof (data->in); + if (data->zlib_stream.avail_in) { + memmove (data->in, + data->zlib_stream.next_in, + data->zlib_stream.avail_in); + len -= data->zlib_stream.avail_in; + bp += data->zlib_stream.avail_in; + } + + len = csi_file_read (file->src, bp, len); + + data->zlib_stream.next_in = data->in; + data->zlib_stream.avail_in += len; + + inflate (&data->zlib_stream, len == 0 ? Z_FINISH : Z_NO_FLUSH); + + data->bytes_available = data->zlib_stream.next_out - data->out; + data->bp = data->out; +} + +static int +_deflate_decode_getc (csi_file_t *file) +{ + _deflate_decode_data_t *data = file->data; + + if (data->bytes_available == 0) { + _deflate_decode (file); + + if (data->bytes_available == 0) + return EOF; + } + + data->bytes_available--; + return *data->bp++; +} + +static void +_deflate_decode_putc (csi_file_t *file, int c) +{ + _deflate_decode_data_t *data = file->data; + data->bytes_available++; + data->bp--; +} + +static int +_deflate_decode_read (csi_file_t *file, uint8_t *buf, int len) +{ + _deflate_decode_data_t *data = file->data; + + if (data->bytes_available == 0) { + _deflate_decode (file); + + if (data->bytes_available == 0) + return 0; + } + + if (len > (int) data->bytes_available) + len = data->bytes_available; + memcpy (buf, data->bp, len); + data->bp += len; + data->bytes_available -= len; + return len; +} + +static void +_deflate_destroy (csi_t *ctx, void *closure) +{ + _deflate_decode_data_t *data; + + data = closure; + + inflateEnd (&data->zlib_stream); + + _csi_free (ctx, data); +} + +csi_status_t +csi_file_new_deflate_decode (csi_t *ctx, + csi_object_t *obj, + csi_dictionary_t *dict, + csi_object_t *src) +{ + static const csi_filter_funcs_t funcs = { + _deflate_decode_getc, + _deflate_decode_putc, + _deflate_decode_read, + _deflate_destroy, + }; + _deflate_decode_data_t *data; + + data = _csi_alloc (ctx, sizeof (_deflate_decode_data_t)); + if (data == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + data->zlib_stream.zalloc = Z_NULL; + data->zlib_stream.zfree = Z_NULL; + data->zlib_stream.opaque = Z_NULL; + data->zlib_stream.next_in = data->in; + data->zlib_stream.avail_in = 0; + data->zlib_stream.next_out = data->out; + data->zlib_stream.avail_out = sizeof (data->out); + data->bytes_available = 0; + + if (inflateInit (&data->zlib_stream) != Z_OK) { + _csi_free (ctx, data); + return _csi_error (CAIRO_STATUS_NO_MEMORY); + } + + return _csi_file_new_filter (ctx, obj, src, &funcs, data); +} +#endif + +#if 0 +static int +hex_value (int c) +{ + if (c < '0') + return EOF; + if (c <= '9') + return c - '0'; + c |= 32; + if (c < 'a') + return EOF; + if (c <= 'f') + return c - 'a' + 0xa; + return EOF; +} + +/* Adobe Type 1 Font Format book: p63 */ +typedef struct _decrypt_data { + uint8_t putback[32]; + uint8_t nputback; + csi_bool_t is_hexadecimal; + unsigned short R; + int eod; +} _decrypt_data_t; + +static uint8_t +_decrypt (unsigned short *R, uint8_t cypher) +{ +#define c1 52845 +#define c2 22719 + uint8_t plain; + + plain = cypher ^ (*R >> 8); + *R = (cypher + *R) * c1 + c2; + return plain; +#undef c1 +#undef c2 +} + +int +csi_decrypt (uint8_t *in, int length, + unsigned short salt, int binary, + uint8_t *out) +{ + const uint8_t * const end = in + length; + uint8_t *base = out; + + while (in < end) { + int c; + + if (! binary) { + int c_hi = -1, c_lo = 0; + + while (in < end && (c_hi = *in++)) { + switch (c_hi) { + case 0x0: + case 0x9: + case 0xa: + case 0xc: + case 0xd: + case 0x20: + continue; + + default: + break; + } + } + if (c_hi < 0) + break; + + while (in < end && (c_lo = *in++)) { + switch (c_lo) { + case 0x0: + case 0x9: + case 0xa: + case 0xc: + case 0xd: + case 0x20: + continue; + + default: + break; + } + } + + c = (hex_value (c_hi) << 4) | hex_value (c_lo); + } else + c = *in++; + + *out++ = _decrypt (&salt, c); + } + + return out - base; +} + +static uint8_t +_encrypt (unsigned short *R, uint8_t plain) +{ +#define c1 52845 +#define c2 22719 + uint8_t cypher; + + cypher = plain ^ (*R >> 8); + *R = (cypher + *R) * c1 + c2; + return cypher; +#undef c1 +#undef c2 +} + +int +csi_encrypt (uint8_t *in, int length, + unsigned short salt, int discard, int binary, + uint8_t *out) +{ + const char hex[]="0123456789abcdef"; + const uint8_t * const end = in + length; + uint8_t *base = out; + int col = 0; + + while (discard--) { + if (! binary) { + int c = _encrypt (&salt, ' '); + *out++ = hex[(c >> 4) & 0xf]; + *out++ = hex[(c >> 0) & 0xf]; + } else + *out++ = _encrypt (&salt, 0); + } + + while (in < end) { + int c; + + c = _encrypt (&salt, *in++); + if (! binary) { + if (col == 78) { + *out++ = '\n'; + col = 0; + } + *out++ = hex[(c >> 4) & 0xf]; + *out++ = hex[(c >> 0) & 0xf]; + col += 2; + } else + *out++ = c; + } + + return out - base; +} + +static int +_decrypt_getc (csi_file_t *file) +{ + _decrypt_data_t *data = file->data; + int c; + + if (data->nputback) + return data->putback[--data->nputback]; + + if (data->is_hexadecimal) { + int c_hi, c_lo; + + c_hi = _getc_skip_whitespace (file->src); + c_lo = _getc_skip_whitespace (file->src); + c = (hex_value (c_hi) << 4) | hex_value (c_lo); + } else + c = csi_file_getc (file->src); + + if (c == EOF) + return EOF; + + return _decrypt (&data->R, c); +} + +static void +_decrypt_putc (csi_file_t *file, int c) +{ + _decrypt_data_t *data; + + data = file->data; + + data->putback[data->nputback++] = c; +} + +csi_object_t * +csi_file_new_decrypt (csi_t *ctx, csi_object_t *src, int salt, int discard) +{ + csi_object_t *obj; + _decrypt_data_t *data; + int n; + + data = _csi_alloc0 (ctx, sizeof (_decrypt_data_t)); + if (data == NULL) + return NULL; + + data->R = salt; + + obj = _csi_file_new_filter (ctx, src, + _decrypt_getc, + _decrypt_putc, + NULL, + _csi_free, + data); + if (obj == NULL) + return NULL; + + /* XXX determine encoding, eexec only? */ + data->is_hexadecimal = salt != 4330; + for (n = 0; n < discard; n++) { + int c; + c = csi_file_getc (obj); + if (c == EOF) { + return obj; + } + } + return obj; +} +#endif + +csi_status_t +_csi_file_execute (csi_t *ctx, csi_file_t *obj) +{ + return _csi_scan_file (ctx, obj); +} + +int +csi_file_getc (csi_file_t *file) +{ + int c; + + if (_csi_unlikely (file->src == NULL)) + return EOF; + + switch (file->type) { + case STDIO: + if (_csi_likely (file->rem)) { + c = *file->bp++; + file->rem--; + } else { + file->rem = fread (file->bp = file->data, 1, CHUNK_SIZE, file->src); + case BYTES: + if (_csi_likely (file->rem)) { + c = *file->bp++; + file->rem--; + } else + c = EOF; + } + break; + + case PROCEDURE: +#if 0 + if (file->data == NULL) { + csi_status_t status; + csi_object_t *string; + +RERUN_PROCEDURE: + status = csi_object_execute (file->src); + if (status) + return EOF; + + string = csi_pop_operand (file->base.ctx); + if (string == NULL) + return EOF; + file->data = csi_object_as_file (file->base.ctx, string); + csi_object_free (string); + if (file->data == NULL) + return EOF; + } + c = csi_file_getc (file->data); + if (c == EOF) { + csi_object_free (file->data); + file->data = NULL; + goto RERUN_PROCEDURE; + } +#else + c = EOF; +#endif + break; + + case FILTER: + c = file->filter->filter_getc (file); + break; + + default: + c = EOF; + break; + } + + return c; +} + +int +csi_file_read (csi_file_t *file, void *buf, int len) +{ + int ret; + + if (file->src == NULL) + return 0; + + switch (file->type) { + case STDIO: + if (file->rem > 0) { + ret = len; + if (file->rem < ret) + ret = file->rem; + memcpy (buf, file->bp, ret); + file->bp += ret; + file->rem -= ret; + } else + ret = fread (buf, 1, len, file->src); + break; + + case BYTES: + if (file->rem > 0) { + ret = len; + if (file->rem < ret) + ret = file->rem; + memcpy (buf, file->bp, ret); + file->bp += ret; + file->rem -= ret; + } else + ret = 0; + break; + + case PROCEDURE: +#if 0 + if (file->data == NULL) { + csi_status_t status; + csi_object_t *string; + +RERUN_PROCEDURE: + status = csi_object_execute (file->src); + if (status) + return 0; + + string = csi_pop_operand (file->base.ctx); + if (string == NULL) + return 0; + file->data = csi_object_as_file (file->base.ctx, string); + csi_object_free (string); + if (file->data == NULL) + return 0; + } + ret = csi_file_read (file->data, buf, len); + if (ret == 0) { + csi_object_free (file->data); + file->data = NULL; + goto RERUN_PROCEDURE; + } +#else + ret = 0; +#endif + break; + + case FILTER: + ret = file->filter->filter_read (file, buf, len); + break; + + default: + ret = 0; + break; + } + + return ret; +} + +void +csi_file_putc (csi_file_t *file, int c) +{ + if (file->src == NULL) + return; + + switch ((int) file->type) { + case STDIO: + case BYTES: + file->bp--; + file->rem++; + break; + case FILTER: + file->filter->filter_putc (file, c); + break; + default: + break; + } +} + +void +csi_file_flush (csi_file_t *file) +{ + if (file->src == NULL) + return; + + switch ((int) file->type) { + case FILTER: /* need to eat EOD */ + while (csi_file_getc (file) != EOF) + ; + break; + default: + break; + } +} + +void +csi_file_close (csi_t *ctx, csi_file_t *file) +{ + if (file->src == NULL) + return; + + switch (file->type) { + case STDIO: + if (file->flags & OWN_STREAM) + fclose (file->src); + break; + case BYTES: + if (file->src != file->data) { + csi_string_t *src = file->src; + if (src != NULL && --src->base.ref == 0) + csi_string_free (ctx, src); + } + break; + case FILTER: + { + csi_file_t *src = file->src; + if (src != NULL && --src->base.ref == 0) + _csi_file_free (ctx, src); + } + break; + case PROCEDURE: + default: + break; + } + file->src = NULL; +} + +void +_csi_file_free (csi_t *ctx, csi_file_t *file) +{ + csi_file_flush (file); + /* XXX putback */ + csi_file_close (ctx, file); + + switch (file->type) { + case BYTES: + break; + case PROCEDURE: +#if 0 + csi_object_free (ctx, file->data); +#endif + break; + case STDIO: + _csi_free (ctx, file->data); + break; + case FILTER: + file->filter->filter_destroy (ctx, file->data); + break; + default: + break; + } + + _csi_slab_free (ctx, file, sizeof (csi_file_t)); +} + +csi_status_t +_csi_file_as_string (csi_t *ctx, + csi_file_t *file, + csi_object_t *obj) +{ + char *bytes; + unsigned int len; + unsigned int allocated; + csi_status_t status; + + allocated = 16384; + bytes = _csi_alloc (ctx, allocated); + if (bytes == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + len = 0; + do { + int ret; + + ret = csi_file_read (file, bytes + len, allocated - len); + if (ret == 0) + break; + + len += ret; + if (len + 1 > allocated / 2) { + char *newbytes; + int newlen; + + if (_csi_unlikely (allocated > INT_MAX / 2)) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + newlen = allocated * 2; + newbytes = _csi_realloc (ctx, bytes, newlen); + if (_csi_unlikely (newbytes == NULL)) { + _csi_free (ctx, bytes); + return _csi_error (CAIRO_STATUS_NO_MEMORY); + } + bytes = newbytes; + allocated = newlen; + } + } while (TRUE); + + bytes[len] = '\0'; /* better safe than sorry! */ + status = csi_string_new_from_bytes (ctx, obj, bytes, len); + if (status) { + _csi_free (ctx, bytes); + return status; + } + + return CAIRO_STATUS_SUCCESS; +} + diff --git a/util/cairo-script/cairo-script-hash.c b/util/cairo-script/cairo-script-hash.c new file mode 100644 index 000000000..4d111033e --- /dev/null +++ b/util/cairo-script/cairo-script-hash.c @@ -0,0 +1,483 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2004 Red Hat, Inc. + * Copyright © 2005 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Red Hat, Inc. + * + * Contributor(s): + * Keith Packard + * Graydon Hoare + * Carl Worth + * Karl Tomlinson , Mozilla Corporation + */ + +#include "cairo-script-private.h" + +#include + +/* + * An entry can be in one of three states: + * + * FREE: Entry has never been used, terminates all searches. + * Appears in the table as a %NULL pointer. + * + * DEAD: Entry had been live in the past. A dead entry can be reused + * but does not terminate a search for an exact entry. + * Appears in the table as a pointer to DEAD_ENTRY. + * + * LIVE: Entry is currently being used. + * Appears in the table as any non-%NULL, non-DEAD_ENTRY pointer. + */ + +#define DEAD_ENTRY ((csi_hash_entry_t *) 0x1) + +#define ENTRY_IS_FREE(entry) ((entry) == NULL) +#define ENTRY_IS_DEAD(entry) ((entry) == DEAD_ENTRY) +#define ENTRY_IS_LIVE(entry) ((entry) > DEAD_ENTRY) + + +/* This table is open-addressed with double hashing. Each table size is a + * prime chosen to be a little more than double the high water mark for a + * given arrangement, so the tables should remain < 50% full. The table + * size makes for the "first" hash modulus; a second prime (2 less than the + * first prime) serves as the "second" hash modulus, which is co-prime and + * thus guarantees a complete permutation of table indices. + * + * This structure, and accompanying table, is borrowed/modified from the + * file xserver/render/glyph.c in the freedesktop.org x server, with + * permission (and suggested modification of doubling sizes) by Keith + * Packard. + */ + +static const csi_hash_table_arrangement_t hash_table_arrangements [] = { + { 16, 43, 41 }, + { 32, 73, 71 }, + { 64, 151, 149 }, + { 128, 283, 281 }, + { 256, 571, 569 }, + { 512, 1153, 1151 }, + { 1024, 2269, 2267 }, + { 2048, 4519, 4517 }, + { 4096, 9013, 9011 }, + { 8192, 18043, 18041 }, + { 16384, 36109, 36107 }, + { 32768, 72091, 72089 }, + { 65536, 144409, 144407 }, + { 131072, 288361, 288359 }, + { 262144, 576883, 576881 }, + { 524288, 1153459, 1153457 }, + { 1048576, 2307163, 2307161 }, + { 2097152, 4613893, 4613891 }, + { 4194304, 9227641, 9227639 }, + { 8388608, 18455029, 18455027 }, + { 16777216, 36911011, 36911009 }, + { 33554432, 73819861, 73819859 }, + { 67108864, 147639589, 147639587 }, + { 134217728, 295279081, 295279079 }, + { 268435456, 590559793, 590559791 } +}; + +#define NUM_HASH_TABLE_ARRANGEMENTS ARRAY_LENGTH (hash_table_arrangements) + +/** + * _csi_hash_table_create: + * @keys_equal: a function to return %TRUE if two keys are equal + * + * Creates a new hash table which will use the keys_equal() function + * to compare hash keys. Data is provided to the hash table in the + * form of user-derived versions of #csi_hash_entry_t. A hash entry + * must be able to hold both a key (including a hash code) and a + * value. Sometimes only the key will be necessary, (as in + * _csi_hash_table_remove), and other times both a key and a value + * will be necessary, (as in _csi_hash_table_insert). + * + * See #csi_hash_entry_t for more details. + * + * Return value: the new hash table or %NULL if out of memory. + **/ +csi_status_t +_csi_hash_table_init (csi_hash_table_t *hash_table, + csi_hash_keys_equal_func_t keys_equal) +{ + hash_table->keys_equal = keys_equal; + + hash_table->arrangement = &hash_table_arrangements[0]; + + hash_table->entries = calloc (hash_table->arrangement->size, + sizeof(csi_hash_entry_t *)); + if (hash_table->entries == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + hash_table->live_entries = 0; + hash_table->used_entries = 0; + hash_table->iterating = 0; + + return CSI_STATUS_SUCCESS; +} + +/** + * _csi_hash_table_destroy: + * @hash_table: an empty hash table to destroy + * + * Immediately destroys the given hash table, freeing all resources + * associated with it. + * + * WARNING: The hash_table must have no live entries in it before + * _csi_hash_table_destroy is called. It is a fatal error otherwise, + * and this function will halt. The rationale for this behavior is to + * avoid memory leaks and to avoid needless complication of the API + * with destroy notifiy callbacks. + * + * WARNING: The hash_table must have no running iterators in it when + * _csi_hash_table_destroy is called. It is a fatal error otherwise, + * and this function will halt. + **/ +void +_csi_hash_table_fini (csi_hash_table_t *hash_table) +{ + free (hash_table->entries); +} + +static csi_hash_entry_t ** +_csi_hash_table_lookup_unique_key (csi_hash_table_t *hash_table, + csi_hash_entry_t *key) +{ + unsigned long table_size, i, idx, step; + csi_hash_entry_t **entry; + + table_size = hash_table->arrangement->size; + idx = key->hash % table_size; + + entry = &hash_table->entries[idx]; + if (! ENTRY_IS_LIVE (*entry)) + return entry; + + i = 1; + step = key->hash % hash_table->arrangement->rehash; + if (step == 0) + step = 1; + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = &hash_table->entries[idx]; + if (! ENTRY_IS_LIVE (*entry)) + return entry; + } while (++i < table_size); + + return NULL; +} + +/** + * _csi_hash_table_manage: + * @hash_table: a hash table + * + * Resize the hash table if the number of entries has gotten much + * bigger or smaller than the ideal number of entries for the current + * size, or control the number of dead entries by moving the entries + * within the table. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if out of memory. + **/ +static csi_status_t +_csi_hash_table_manage (csi_hash_table_t *hash_table) +{ + csi_hash_table_t tmp; + csi_boolean_t realloc = TRUE; + unsigned long i; + + /* This keeps the size of the hash table between 2 and approximately 8 + * times the number of live entries and keeps the proportion of free + * entries (search-terminations) > 25%. + */ + unsigned long high = hash_table->arrangement->high_water_mark; + unsigned long low = high >> 2; + unsigned long max_used = high + high / 2; + + tmp = *hash_table; + + if (hash_table->live_entries > high) { + tmp.arrangement = hash_table->arrangement + 1; + /* This code is being abused if we can't make a table big enough. */ + } else if (hash_table->live_entries < low && + /* Can't shrink if we're at the smallest size */ + hash_table->arrangement != &hash_table_arrangements[0]) + { + tmp.arrangement = hash_table->arrangement - 1; + } + else if (hash_table->used_entries > max_used) + { + /* Clean out dead entries to prevent lookups from becoming too slow. */ + for (i = 0; i < hash_table->arrangement->size; ++i) { + if (ENTRY_IS_DEAD (hash_table->entries[i])) + hash_table->entries[i] = NULL; + } + hash_table->used_entries = hash_table->live_entries; + + /* There is no need to reallocate but some entries may need to be + * moved. Typically the proportion of entries needing to be moved is + * small, but, if the moving should leave a large number of dead + * entries, they will be cleaned out next time this code is + * executed. */ + realloc = FALSE; + } + else + { + return CAIRO_STATUS_SUCCESS; + } + + if (realloc) { + tmp.entries = calloc (tmp.arrangement->size, + sizeof (csi_hash_entry_t*)); + if (tmp.entries == NULL) + return _csi_error (CAIRO_STATUS_NO_MEMORY); + + hash_table->used_entries = 0; + } + + for (i = 0; i < hash_table->arrangement->size; ++i) { + csi_hash_entry_t *entry, **pos; + + entry = hash_table->entries[i]; + if (ENTRY_IS_LIVE (entry)) { + hash_table->entries[i] = DEAD_ENTRY; + + pos = _csi_hash_table_lookup_unique_key (&tmp, entry); + if (ENTRY_IS_FREE (*pos)) + hash_table->used_entries++; + + *pos = entry; + } + } + + if (realloc) { + free (hash_table->entries); + hash_table->entries = tmp.entries; + hash_table->arrangement = tmp.arrangement; + } + + return CAIRO_STATUS_SUCCESS; +} + +/** + * _csi_hash_table_lookup: + * @hash_table: a hash table + * @key: the key of interest + * + * Performs a lookup in @hash_table looking for an entry which has a + * key that matches @key, (as determined by the keys_equal() function + * passed to _csi_hash_table_create). + * + * Return value: the matching entry, of %NULL if no match was found. + **/ +void * +_csi_hash_table_lookup (csi_hash_table_t *hash_table, + csi_hash_entry_t *key) +{ + csi_hash_entry_t **entry; + unsigned long table_size, i, idx, step; + + table_size = hash_table->arrangement->size; + idx = key->hash % table_size; + entry = &hash_table->entries[idx]; + + if (ENTRY_IS_LIVE (*entry)) { + if ((*entry)->hash == key->hash && hash_table->keys_equal (key, *entry)) + return *entry; + } else if (ENTRY_IS_FREE (*entry)) + return NULL; + + i = 1; + step = key->hash % hash_table->arrangement->rehash; + if (step == 0) + step = 1; + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = &hash_table->entries[idx]; + if (ENTRY_IS_LIVE (*entry)) { + if ((*entry)->hash == key->hash && + hash_table->keys_equal (key, *entry)) + { + return *entry; + } + } else if (ENTRY_IS_FREE (*entry)) + return NULL; + } while (++i < table_size); + + return NULL; +} + +/** + * _csi_hash_table_insert: + * @hash_table: a hash table + * @key_and_value: an entry to be inserted + * + * Insert the entry #key_and_value into the hash table. + * + * WARNING: There must not be an existing entry in the hash table + * with a matching key. + * + * WARNING: It is a fatal error to insert an element while + * an iterator is running + * + * Instead of using insert to replace an entry, consider just editing + * the entry obtained with _csi_hash_table_lookup. Or if absolutely + * necessary, use _csi_hash_table_remove first. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if insufficient memory is available. + **/ +csi_status_t +_csi_hash_table_insert (csi_hash_table_t *hash_table, + csi_hash_entry_t *key_and_value) +{ + csi_status_t status; + csi_hash_entry_t **entry; + + hash_table->live_entries++; + status = _csi_hash_table_manage (hash_table); + if (_csi_unlikely (status)) { + /* abort the insert... */ + hash_table->live_entries--; + return status; + } + + entry = _csi_hash_table_lookup_unique_key (hash_table, + key_and_value); + if (ENTRY_IS_FREE (*entry)) + hash_table->used_entries++; + + *entry = key_and_value; + return CAIRO_STATUS_SUCCESS; +} + +static csi_hash_entry_t ** +_csi_hash_table_lookup_exact_key (csi_hash_table_t *hash_table, + csi_hash_entry_t *key) +{ + unsigned long table_size, i, idx, step; + csi_hash_entry_t **entry; + + table_size = hash_table->arrangement->size; + idx = key->hash % table_size; + + entry = &hash_table->entries[idx]; + if (*entry == key) + return entry; + + i = 1; + step = key->hash % hash_table->arrangement->rehash; + if (step == 0) + step = 1; + do { + idx += step; + if (idx >= table_size) + idx -= table_size; + + entry = &hash_table->entries[idx]; + if (*entry == key) + return entry; + } while (++i < table_size); + + return NULL; +} +/** + * _csi_hash_table_remove: + * @hash_table: a hash table + * @key: key of entry to be removed + * + * Remove an entry from the hash table which points to @key. + * + * Return value: %CAIRO_STATUS_SUCCESS if successful or + * %CAIRO_STATUS_NO_MEMORY if out of memory. + **/ +void +_csi_hash_table_remove (csi_hash_table_t *hash_table, + csi_hash_entry_t *key) +{ + *_csi_hash_table_lookup_exact_key (hash_table, key) = DEAD_ENTRY; + hash_table->live_entries--; + + /* Check for table resize. Don't do this when iterating as this will + * reorder elements of the table and cause the iteration to potentially + * skip some elements. */ + if (hash_table->iterating == 0) { + /* This call _can_ fail, but only in failing to allocate new + * memory to shrink the hash table. It does leave the table in a + * consistent state, and we've already succeeded in removing the + * entry, so we don't examine the failure status of this call. */ + _csi_hash_table_manage (hash_table); + } +} + +/** + * _csi_hash_table_foreach: + * @hash_table: a hash table + * @hash_callback: function to be called for each live entry + * @closure: additional argument to be passed to @hash_callback + * + * Call @hash_callback for each live entry in the hash table, in a + * non-specified order. + * + * Entries in @hash_table may be removed by code executed from @hash_callback. + * + * Entries may not be inserted to @hash_table, nor may @hash_table + * be destroyed by code executed from @hash_callback. The relevant + * functions will halt in these cases. + **/ +void +_csi_hash_table_foreach (csi_hash_table_t *hash_table, + csi_hash_callback_func_t hash_callback, + void *closure) +{ + unsigned long i; + csi_hash_entry_t *entry; + + /* Mark the table for iteration */ + ++hash_table->iterating; + for (i = 0; i < hash_table->arrangement->size; i++) { + entry = hash_table->entries[i]; + if (ENTRY_IS_LIVE(entry)) + hash_callback (entry, closure); + } + /* If some elements were deleted during the iteration, + * the table may need resizing. Just do this every time + * as the check is inexpensive. + */ + if (--hash_table->iterating == 0) { + /* Should we fail to shrink the hash table, it is left unaltered, + * and we don't need to propagate the error status. */ + _csi_hash_table_manage (hash_table); + } +} diff --git a/util/cairo-script/cairo-script-interpreter.c b/util/cairo-script/cairo-script-interpreter.c new file mode 100644 index 000000000..50170fc29 --- /dev/null +++ b/util/cairo-script/cairo-script-interpreter.c @@ -0,0 +1,699 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#include + +#include "cairo-script-private.h" + +#include +#include +#include +#include +#include + +#ifndef MAX +#define MAX(a,b) (((a)>=(b))?(a):(b)) +#endif + +csi_status_t +_csi_error (csi_status_t status) +{ + return status; +} + +/* XXX track global/local memory, cap etc, mark/sweep GC */ +void * +_csi_alloc (csi_t *ctx, int size) +{ + return malloc (size); +} + +void * +_csi_alloc0 (csi_t *ctx, int size) +{ + void *ptr; + + ptr = _csi_alloc (ctx, size); + if (_csi_likely (ptr != NULL)) + memset (ptr, 0, size); + + return ptr; +} + +void * +_csi_realloc (csi_t *ctx, void *ptr, int size) +{ + return realloc (ptr, size); +} + +void +_csi_free (csi_t *ctx, void *ptr) +{ + if (_csi_unlikely (ptr == NULL)) + return; + + free (ptr); +} + +void * +_csi_perm_alloc (csi_t *ctx, int size) +{ + csi_chunk_t *chunk; + void *ptr; + + size = (size + sizeof (void *)-1) & -sizeof (void *); + + chunk = ctx->perm_chunk; + if (chunk == NULL || chunk->rem < size) { + int chunk_size = (size + 8191) & -8192; + chunk = _csi_alloc (ctx, sizeof (csi_chunk_t) + chunk_size); + if (_csi_unlikely (chunk == NULL)) + return NULL; + + chunk->rem = chunk_size; + chunk->ptr = (char *) (chunk + 1); + chunk->next = ctx->perm_chunk; + ctx->perm_chunk = chunk; + } + + ptr = chunk->ptr; + chunk->ptr += size; + chunk->rem -= size; + + return ptr; +} + +void * +_csi_slab_alloc (csi_t *ctx, int size) +{ +#if CSI_DEBUG_MALLOC + return malloc (size); +#else + int chunk_size; + csi_chunk_t *chunk; + void *ptr; + + chunk_size = 2 * sizeof (void *); + chunk_size = (size + chunk_size - 1) / chunk_size; + + if (ctx->slabs[chunk_size].free_list) { + ptr = ctx->slabs[chunk_size].free_list; + ctx->slabs[chunk_size].free_list = *(void **) ptr; + return ptr; + } + + chunk = ctx->slabs[chunk_size].chunk; + if (chunk == NULL || ! chunk->rem) { + int cnt = MAX (128, 8192 / (chunk_size * 2 * sizeof (void *))); + + chunk = _csi_alloc (ctx, + sizeof (csi_chunk_t) + + cnt * chunk_size * 2 * sizeof (void *)); + if (_csi_unlikely (chunk == NULL)) + return NULL; + + chunk->rem = cnt; + chunk->ptr = (char *) (chunk + 1); + chunk->next = ctx->slabs[chunk_size].chunk; + ctx->slabs[chunk_size].chunk = chunk; + } + + ptr = chunk->ptr; + chunk->ptr += chunk_size * 2 * sizeof (void *); + chunk->rem--; + + return ptr; +#endif +} + +void +_csi_slab_free (csi_t *ctx, void *ptr, int size) +{ + int chunk_size; + void **free_list; + + if (_csi_unlikely (ptr == NULL)) + return; + +#if CSI_DEBUG_MALLOC + free (ptr); +#else + chunk_size = 2 * sizeof (void *); + chunk_size = (size + chunk_size - 1) / chunk_size; + + free_list = ptr; + *free_list = ctx->slabs[chunk_size].free_list; + ctx->slabs[chunk_size].free_list = ptr; +#endif +} + +static void +_csi_perm_fini (csi_t *ctx) +{ + while (ctx->perm_chunk != NULL) { + csi_chunk_t *chunk = ctx->perm_chunk; + ctx->perm_chunk = chunk->next; + _csi_free (ctx, chunk); + } +} + +static void +_csi_slab_fini (csi_t *ctx) +{ + unsigned int i; + + for (i = 0; i < sizeof (ctx->slabs) / sizeof (ctx->slabs[0]); i++) { + while (ctx->slabs[i].chunk != NULL) { + csi_chunk_t *chunk = ctx->slabs[i].chunk; + ctx->slabs[i].chunk = chunk->next; + _csi_free (ctx, chunk); + } + } +} + +static csi_status_t +_add_operator (csi_t *ctx, + csi_dictionary_t *dict, + const csi_operator_def_t *def) +{ + csi_object_t name; + csi_object_t operator; + csi_status_t status; + + status = csi_name_new_static (ctx, &name, def->name); + if (status) + return status; + + csi_operator_new (&operator, def->op); + + return csi_dictionary_put (ctx, dict, name.datum.name, &operator); +} + +static csi_status_t +_add_integer_constant (csi_t *ctx, + csi_dictionary_t *dict, + const csi_integer_constant_def_t *def) +{ + csi_object_t name; + csi_object_t constant; + csi_status_t status; + + status = csi_name_new_static (ctx, &name, def->name); + if (status) + return status; + + csi_integer_new (&constant, def->value); + + return csi_dictionary_put (ctx, dict, name.datum.name, &constant); +} + +static csi_status_t +_add_real_constant (csi_t *ctx, + csi_dictionary_t *dict, + const csi_real_constant_def_t *def) +{ + csi_object_t name; + csi_object_t constant; + csi_status_t status; + + status = csi_name_new_static (ctx, &name, def->name); + if (status) + return status; + + csi_real_new (&constant, def->value); + + return csi_dictionary_put (ctx, dict, name.datum.name, &constant); +} + +static csi_status_t +_init_dictionaries (csi_t *ctx) +{ + csi_status_t status; + csi_stack_t *stack; + csi_object_t obj; + csi_dictionary_t *dict, *opcodes; + const csi_operator_def_t *odef; + const csi_integer_constant_def_t *idef; + const csi_real_constant_def_t *rdef; + unsigned n; + + stack = &ctx->dstack; + + status = _csi_stack_init (ctx, stack, 4); + if (_csi_unlikely (status)) + return status; + + /* systemdict */ + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + + status = _csi_stack_push (ctx, stack, &obj); + if (_csi_unlikely (status)) + return status; + + dict = obj.datum.dictionary; + + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + + opcodes = obj.datum.dictionary; + + n = 0; + csi_integer_new (&obj, n); + status = csi_dictionary_put (ctx, opcodes, 0, &obj); + if (_csi_unlikely (status)) + return status; + ctx->opcode[n++] = NULL; + + /* fill systemdict with operators */ + for (odef = _csi_operators (); odef->name != NULL; odef++) { + status = _add_operator (ctx, dict, odef); + if (_csi_unlikely (status)) + return status; + + if (! csi_dictionary_has (opcodes, (csi_name_t) odef->op)) { + csi_integer_new (&obj, n); + status = csi_dictionary_put (ctx, + opcodes, (csi_name_t) odef->op, &obj); + if (_csi_unlikely (status)) + return status; + + assert (n < sizeof (ctx->opcode) / sizeof (ctx->opcode[0])); + ctx->opcode[n++] = odef->op; + } + } + csi_dictionary_free (ctx, opcodes); + + /* add constants */ + for (idef = _csi_integer_constants (); idef->name != NULL; idef++) { + status = _add_integer_constant (ctx, dict, idef); + if (_csi_unlikely (status)) + return status; + } + for (rdef = _csi_real_constants (); rdef->name != NULL; rdef++) { + status = _add_real_constant (ctx, dict, rdef); + if (_csi_unlikely (status)) + return status; + } + + /* and seal */ + //dict.type &= ~CSI_OBJECT_ATTR_WRITABLE; + + + /* globaldict */ + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + status = _csi_stack_push (ctx, stack, &obj); + if (_csi_unlikely (status)) + return status; + + /* userdict */ + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + status = _csi_stack_push (ctx, stack, &obj); + if (_csi_unlikely (status)) + return status; + + return CSI_STATUS_SUCCESS; +} + +/* intern string */ + +typedef struct _cairo_intern_string { + csi_hash_entry_t hash_entry; + int len; + char *string; +} csi_intern_string_t; + +static unsigned long +_intern_string_hash (const char *str, int len) +{ + const signed char *p = (const signed char *) str; + if (len > 0) { + unsigned int h = *p; + + while (--len) + h = (h << 5) - h + *++p; + + return h; + } + return 0; +} + +static cairo_bool_t +_intern_string_equal (const void *_a, const void *_b) +{ + const csi_intern_string_t *a = _a; + const csi_intern_string_t *b = _b; + + if (a->len != b->len) + return FALSE; + + return memcmp (a->string, b->string, a->len) == 0; +} + +static void +_csi_init (csi_t *ctx) +{ + csi_status_t status; + + memset (ctx, 0, sizeof (*ctx)); + + ctx->status = CSI_STATUS_SUCCESS; + ctx->ref_count = 1; + ctx->scanner.line_number = -1; + + status = _csi_hash_table_init (&ctx->strings, _intern_string_equal); + if (status) + goto FAIL; + + status = _csi_stack_init (ctx, &ctx->ostack, 2048); + if (status) + goto FAIL; + status = _init_dictionaries (ctx); + if (status) + goto FAIL; + + status = _csi_scanner_init (ctx, &ctx->scanner); + if (status) + goto FAIL; + + return; + +FAIL: + if (ctx->status == CSI_STATUS_SUCCESS) + ctx->status = status; +} + +static void +_csi_finish (csi_t *ctx) +{ + _csi_stack_fini (ctx, &ctx->ostack); + _csi_stack_fini (ctx, &ctx->dstack); + _csi_scanner_fini (ctx, &ctx->scanner); + + _csi_hash_table_fini (&ctx->strings); +} + +csi_status_t +_csi_name_define (csi_t *ctx, csi_name_t name, csi_object_t *obj) +{ + return csi_dictionary_put (ctx, + ctx->dstack.objects[ctx->dstack.len-1].datum.dictionary, + name, + obj); +} + +csi_status_t +_csi_name_lookup (csi_t *ctx, csi_name_t name, csi_object_t *obj) +{ + int i; + + for (i = ctx->dstack.len; i--; ) { + csi_dictionary_t *dict; + csi_dictionary_entry_t *entry; + + dict = ctx->dstack.objects[i].datum.dictionary; + entry = _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) &name); + if (entry != NULL) { + *obj = entry->value; + return CSI_STATUS_SUCCESS; + } + } + + return _csi_error (CSI_STATUS_INVALID_SCRIPT); +} + +csi_status_t +_csi_name_undefine (csi_t *ctx, csi_name_t name) +{ + unsigned int i; + + for (i = ctx->dstack.len; --i; ) { + if (csi_dictionary_has (ctx->dstack.objects[i].datum.dictionary, + name)) + { + csi_dictionary_remove (ctx, + ctx->dstack.objects[i].datum.dictionary, + name); + return CSI_STATUS_SUCCESS; + } + } + + return _csi_error (CSI_STATUS_INVALID_SCRIPT); +} + +csi_status_t +_csi_intern_string (csi_t *ctx, const char **str_inout, int len) +{ + char *str = (char *) *str_inout; + csi_intern_string_t tmpl, *istring; + csi_status_t status = CSI_STATUS_SUCCESS; + + tmpl.hash_entry.hash = _intern_string_hash (str, len); + tmpl.len = len; + tmpl.string = (char *) str; + + istring = _csi_hash_table_lookup (&ctx->strings, &tmpl.hash_entry); + if (istring == NULL) { + istring = _csi_perm_alloc (ctx, + sizeof (csi_intern_string_t) + len + 1); + if (istring != NULL) { + istring->hash_entry.hash = tmpl.hash_entry.hash; + istring->len = tmpl.len; + istring->string = (char *) (istring + 1); + memcpy (istring->string, str, len); + istring->string[len] = '\0'; + + status = _csi_hash_table_insert (&ctx->strings, + &istring->hash_entry); + if (_csi_unlikely (status)) { + _csi_free (ctx, istring); + return status; + } + } else + return _csi_error (CSI_STATUS_NO_MEMORY); + } + + *str_inout = istring->string; + return CSI_STATUS_SUCCESS; +} + +/* Public */ + +static csi_t _csi_nil = { -1, CSI_STATUS_NO_MEMORY }; + +csi_t * +cairo_script_interpreter_create (void) +{ + csi_t *ctx; + + ctx = malloc (sizeof (csi_t)); + if (ctx == NULL) + return (csi_t *) &_csi_nil; + + _csi_init (ctx); + + return ctx; +} + +void +cairo_script_interpreter_install_hooks (csi_t *ctx, + const csi_hooks_t *hooks) +{ + if (ctx->status) + return; + + ctx->hooks = *hooks; +} + +cairo_status_t +cairo_script_interpreter_run (csi_t *ctx, const char *filename) +{ + csi_object_t file; + + if (ctx->status) + return ctx->status; + if (ctx->finished) + return ctx->status = CSI_STATUS_INTERPRETER_FINISHED; + + ctx->status = csi_file_new (ctx, &file, filename, "r"); + if (ctx->status) + return ctx->status; + + file.type |= CSI_OBJECT_ATTR_EXECUTABLE; + + ctx->status = csi_object_execute (ctx, &file); + csi_object_free (ctx, &file); + + return ctx->status; +} + +cairo_status_t +cairo_script_interpreter_feed_stream (csi_t *ctx, FILE *stream) +{ + csi_object_t file; + + if (ctx->status) + return ctx->status; + if (ctx->finished) + return ctx->status = CSI_STATUS_INTERPRETER_FINISHED; + + ctx->status = csi_file_new_for_stream (ctx, &file, stream); + if (ctx->status) + return ctx->status; + + file.type |= CSI_OBJECT_ATTR_EXECUTABLE; + + ctx->status = csi_object_execute (ctx, &file); + csi_object_free (ctx, &file); + + return ctx->status; +} + +cairo_status_t +cairo_script_interpreter_feed_string (csi_t *ctx, const char *line, int len) +{ + csi_object_t file; + + if (ctx->status) + return ctx->status; + if (ctx->finished) + return ctx->status = CSI_STATUS_INTERPRETER_FINISHED; + + if (len < 0) + len = strlen (line); + ctx->status = csi_file_new_for_bytes (ctx, &file, line, len); + if (ctx->status) + return ctx->status; + + file.type |= CSI_OBJECT_ATTR_EXECUTABLE; + + ctx->status = csi_object_execute (ctx, &file); + csi_object_free (ctx, &file); + + return ctx->status; +} + +unsigned int +cairo_script_interpreter_get_line_number (csi_t *ctx) +{ + return ctx->scanner.line_number + 1; /* 1 index based */ +} + +csi_t * +cairo_script_interpreter_reference (csi_t *ctx) +{ + ctx->ref_count++; + return ctx; +} +slim_hidden_def (cairo_script_interpreter_reference); + +cairo_status_t +cairo_script_interpreter_finish (csi_t *ctx) +{ + csi_status_t status; + + status = ctx->status; + if (! ctx->finished) { + _csi_finish (ctx); + ctx->finished = 1; + } else if (status == CSI_STATUS_SUCCESS) { + status = ctx->status = CSI_STATUS_INTERPRETER_FINISHED; + } + + return status; +} + +static void +_csi_fini (csi_t *ctx) +{ + if (! ctx->finished) + _csi_finish (ctx); + + if (ctx->free_array != NULL) + csi_array_free (ctx, ctx->free_array); + if (ctx->free_dictionary != NULL) + csi_dictionary_free (ctx, ctx->free_dictionary); + if (ctx->free_string != NULL) + csi_string_free (ctx, ctx->free_string); + + _csi_slab_fini (ctx); + _csi_perm_fini (ctx); +} + +cairo_status_t +cairo_script_interpreter_destroy (csi_t *ctx) +{ + csi_status_t status; + + status = ctx->status; + if (--ctx->ref_count) + return status; + + _csi_fini (ctx); + free (ctx); + + return status; +} +slim_hidden_def (cairo_script_interpreter_destroy); + +cairo_status_t +cairo_script_interpreter_translate_stream (FILE *stream, + cairo_write_func_t write_func, + void *closure) +{ + csi_t ctx; + csi_object_t src; + csi_status_t status; + + _csi_init (&ctx); + + status = csi_file_new_for_stream (&ctx, &src, stream); + if (status) + goto BAIL; + + status = _csi_translate_file (&ctx, src.datum.file, write_func, closure); + +BAIL: + csi_object_free (&ctx, &src); + _csi_fini (&ctx); + + return status; +} diff --git a/util/cairo-script/cairo-script-interpreter.h b/util/cairo-script/cairo-script-interpreter.h new file mode 100644 index 000000000..27fb98661 --- /dev/null +++ b/util/cairo-script/cairo-script-interpreter.h @@ -0,0 +1,124 @@ +/* cairo - a vector graphics library with display and print output + * + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SCRIPT_INTERPRETER_H +#define CAIRO_SCRIPT_INTERPRETER_H + +#include +#include + +CAIRO_BEGIN_DECLS + +typedef struct _cairo_script_interpreter cairo_script_interpreter_t; + +/* XXX expose csi_dictionary_t and pass to hooks */ +typedef void +(*csi_destroy_func_t) (void *closure, + void *ptr); + +typedef cairo_surface_t * +(*csi_surface_create_func_t) (void *closure, + cairo_content_t content, + double width, + double height, + long uid); +typedef cairo_t * +(*csi_context_create_func_t) (void *closure, + cairo_surface_t *surface); +typedef void +(*csi_show_page_func_t) (void *closure, + cairo_t *cr); + +typedef void +(*csi_copy_page_func_t) (void *closure, + cairo_t *cr); + +typedef cairo_surface_t * +(*csi_create_source_image_t) (void *closure, + cairo_format_t format, + int width, int height, + long uid); + +typedef struct _cairo_script_interpreter_hooks { + void *closure; + csi_surface_create_func_t surface_create; + csi_destroy_func_t surface_destroy; + csi_context_create_func_t context_create; + csi_destroy_func_t context_destroy; + csi_show_page_func_t show_page; + csi_copy_page_func_t copy_page; + csi_create_source_image_t create_source_image; +} cairo_script_interpreter_hooks_t; + +cairo_public cairo_script_interpreter_t * +cairo_script_interpreter_create (void); + +cairo_public void +cairo_script_interpreter_install_hooks (cairo_script_interpreter_t *ctx, + const cairo_script_interpreter_hooks_t *hooks); + +cairo_public cairo_status_t +cairo_script_interpreter_run (cairo_script_interpreter_t *ctx, + const char *filename); + +cairo_public cairo_status_t +cairo_script_interpreter_feed_stream (cairo_script_interpreter_t *ctx, + FILE *stream); + +cairo_public cairo_status_t +cairo_script_interpreter_feed_string (cairo_script_interpreter_t *ctx, + const char *line, + int len); + +cairo_public unsigned int +cairo_script_interpreter_get_line_number (cairo_script_interpreter_t *ctx); + +cairo_public cairo_script_interpreter_t * +cairo_script_interpreter_reference (cairo_script_interpreter_t *ctx); + +cairo_public cairo_status_t +cairo_script_interpreter_finish (cairo_script_interpreter_t *ctx); + +cairo_public cairo_status_t +cairo_script_interpreter_destroy (cairo_script_interpreter_t *ctx); + +cairo_public cairo_status_t +cairo_script_interpreter_translate_stream (FILE *stream, + cairo_write_func_t write_func, + void *closure); + +CAIRO_END_DECLS + +#endif /*CAIRO_SCRIPT_INTERPRETER_H*/ diff --git a/util/cairo-script/cairo-script-objects.c b/util/cairo-script/cairo-script-objects.c new file mode 100644 index 000000000..a625489b1 --- /dev/null +++ b/util/cairo-script/cairo-script-objects.c @@ -0,0 +1,936 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairo-script-private.h" + +#include /* INT_MAX */ +#include + +csi_status_t +csi_array_new (csi_t *ctx, + csi_integer_t initial_size, + csi_object_t *obj) + +{ + csi_array_t *array; + + if (ctx->free_array == NULL || + ctx->free_array->stack.size <= initial_size) + { + csi_status_t status; + + array = _csi_slab_alloc (ctx, sizeof (csi_array_t)); + if (_csi_unlikely (array == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + status = _csi_stack_init (ctx, &array->stack, + initial_size ? initial_size : 32); + if (_csi_unlikely (status)) { + _csi_slab_free (ctx, array, sizeof (csi_array_t)); + return status; + } + } else { + array = ctx->free_array; + ctx->free_array = NULL; + } + + array->base.type = CSI_OBJECT_TYPE_ARRAY; + array->base.ref = 1; + + obj->type = CSI_OBJECT_TYPE_ARRAY; + obj->datum.array = array; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_array_put (csi_t *ctx, + csi_array_t *array, + csi_integer_t elem, + csi_object_t *value) +{ + if (_csi_unlikely (elem < 0)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + if (_csi_unlikely (elem >= array->stack.len)) { + csi_status_t status; + + status = _csi_stack_grow (ctx, &array->stack, elem + 1); + if (_csi_unlikely (status)) + return status; + + memset (array->stack.objects + array->stack.len, + 0, (elem - array->stack.len + 1) * sizeof (csi_object_t)); + array->stack.len = elem + 1; + } + + csi_object_free (ctx, &array->stack.objects[elem]); + array->stack.objects[elem] = *csi_object_reference (value); + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_array_get (csi_t *ctx, + csi_array_t *array, + csi_integer_t elem, + csi_object_t *value) +{ + if (_csi_unlikely (elem < 0)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + if (_csi_unlikely (elem > array->stack.len)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *value = array->stack.objects[elem]; + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_array_append (csi_t *ctx, + csi_array_t *array, + csi_object_t *obj) +{ + return _csi_stack_push (ctx, &array->stack, csi_object_reference (obj)); +} + +inline csi_status_t +_csi_array_execute (csi_t *ctx, csi_array_t *array) +{ + csi_integer_t i; + csi_status_t status; + + if (_csi_unlikely (array->stack.len == 0)) + return CSI_STATUS_SUCCESS; + + for (i = 0; i < array->stack.len; i++) { + csi_object_t *obj = &array->stack.objects[i]; + + if (obj->type & CSI_OBJECT_ATTR_EXECUTABLE) { + if (obj->type == (CSI_OBJECT_TYPE_ARRAY | + CSI_OBJECT_ATTR_EXECUTABLE)) + { + status = _csi_push_ostack_copy (ctx, &array->stack.objects[i]); + } + else + status = csi_object_execute (ctx, &array->stack.objects[i]); + } else + status = _csi_push_ostack_copy (ctx, &array->stack.objects[i]); + if (_csi_unlikely (status)) + return status; + } + + return CSI_STATUS_SUCCESS; +} + +void +csi_array_free (csi_t *ctx, csi_array_t *array) +{ +#if CSI_DEBUG_MALLOC + _csi_stack_fini (ctx, &array->stack); + _csi_slab_free (ctx, array, sizeof (csi_array_t)); +#else + csi_integer_t n; + + for (n = 0; n < array->stack.len; n++) + csi_object_free (ctx, &array->stack.objects[n]); + array->stack.len = 0; + + if (ctx->free_array != NULL) { + if (array->stack.size > ctx->free_array->stack.size) { + csi_array_t *tmp = ctx->free_array; + ctx->free_array = array; + array = tmp; + } + + _csi_stack_fini (ctx, &array->stack); + _csi_slab_free (ctx, array, sizeof (csi_array_t)); + } else + ctx->free_array = array; +#endif +} + +static cairo_bool_t +_dictionary_name_equal (const void *_a, const void *_b) +{ + return TRUE; +} + +csi_status_t +csi_dictionary_new (csi_t *ctx, + csi_object_t *obj) + +{ + csi_dictionary_t *dict; + + if (ctx->free_dictionary != NULL) { + dict = ctx->free_dictionary; + ctx->free_dictionary = NULL; + } else { + csi_status_t status; + + dict = _csi_slab_alloc (ctx, sizeof (csi_dictionary_t)); + if (_csi_unlikely (dict == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + status = _csi_hash_table_init (&dict->hash_table, + _dictionary_name_equal); + if (_csi_unlikely (status)) { + _csi_slab_free (ctx, dict, sizeof (csi_dictionary_t)); + return status; + } + } + + dict->base.type = CSI_OBJECT_TYPE_DICTIONARY; + dict->base.ref = 1; + + obj->type = CSI_OBJECT_TYPE_DICTIONARY; + obj->datum.dictionary = dict; + + return CSI_STATUS_SUCCESS; +} + +struct _dictionary_entry_pluck { + csi_t *ctx; + csi_hash_table_t *hash_table; +}; + +static void +_dictionary_entry_pluck (void *entry, void *data) +{ + csi_dictionary_entry_t *dict_entry; + struct _dictionary_entry_pluck *pluck_data; + + dict_entry = entry; + pluck_data = data; + + _csi_hash_table_remove (pluck_data->hash_table, entry); + csi_object_free (pluck_data->ctx, &dict_entry->value); + _csi_slab_free (pluck_data->ctx, entry, sizeof (csi_dictionary_entry_t)); +} + +void +csi_dictionary_free (csi_t *ctx, + csi_dictionary_t *dict) +{ + struct _dictionary_entry_pluck data; + + data.ctx = ctx; + data.hash_table = &dict->hash_table; + _csi_hash_table_foreach (&dict->hash_table, + _dictionary_entry_pluck, + &data); + +#if CSI_DEBUG_MALLOC + _csi_hash_table_fini (&dict->hash_table); + _csi_slab_free (ctx, dict, sizeof (csi_dictionary_t)); +#else + if (ctx->free_dictionary != NULL) { + _csi_hash_table_fini (&dict->hash_table); + _csi_slab_free (ctx, dict, sizeof (csi_dictionary_t)); + } else + ctx->free_dictionary = dict; +#endif +} + +csi_status_t +csi_dictionary_put (csi_t *ctx, + csi_dictionary_t *dict, + csi_name_t name, + csi_object_t *value) +{ + csi_dictionary_entry_t *entry; + csi_status_t status; + + entry = _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) &name); + if (entry != NULL) { + /* replace the existing entry */ + csi_object_free (ctx, &entry->value); + entry->value = *csi_object_reference (value); + return CSI_STATUS_SUCCESS; + } + + entry = _csi_slab_alloc (ctx, sizeof (*entry)); + if (_csi_unlikely (entry == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + entry->hash_entry.hash = name; + status = _csi_hash_table_insert (&dict->hash_table, &entry->hash_entry); + if (_csi_unlikely (status)) { + _csi_slab_free (ctx, entry, sizeof (*entry)); + return status; + } + + entry->value = *csi_object_reference (value); + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_dictionary_get (csi_t *ctx, + csi_dictionary_t *dict, + csi_name_t name, + csi_object_t *value) +{ + csi_dictionary_entry_t *entry; + + entry = _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) &name); + if (_csi_unlikely (entry == NULL)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *value = entry->value; + return CSI_STATUS_SUCCESS; +} + +csi_boolean_t +csi_dictionary_has (csi_dictionary_t *dict, + csi_name_t name) +{ + return _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) &name) != NULL; +} + +void +csi_dictionary_remove (csi_t *ctx, + csi_dictionary_t *dict, + csi_name_t name) +{ + csi_dictionary_entry_t *entry; + + entry = _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) &name); + if (entry != NULL) { + _csi_hash_table_remove (&dict->hash_table, &entry->hash_entry); + csi_object_free (ctx, &entry->value); + _csi_slab_free (ctx, entry, sizeof (csi_dictionary_entry_t)); + } +} + +csi_status_t +csi_matrix_new (csi_t *ctx, + csi_object_t *obj) +{ + csi_matrix_t *matrix; + + matrix = _csi_slab_alloc (ctx, sizeof (csi_matrix_t)); + if (_csi_unlikely (matrix == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + matrix->base.type = CSI_OBJECT_TYPE_MATRIX; + matrix->base.ref = 1; + cairo_matrix_init_identity (&matrix->matrix); + + obj->type = CSI_OBJECT_TYPE_MATRIX; + obj->datum.matrix = matrix; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_matrix_new_from_array (csi_t *ctx, + csi_object_t *obj, + csi_array_t *array) +{ + csi_matrix_t *matrix; + + if (_csi_unlikely (array->stack.len != 6)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + matrix = _csi_slab_alloc (ctx, sizeof (csi_matrix_t)); + if (_csi_unlikely (matrix == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + matrix->base.type = CSI_OBJECT_TYPE_MATRIX; + matrix->base.ref = 1; + cairo_matrix_init (&matrix->matrix, + csi_number_get_value (&array->stack.objects[0]), + csi_number_get_value (&array->stack.objects[1]), + csi_number_get_value (&array->stack.objects[2]), + csi_number_get_value (&array->stack.objects[3]), + csi_number_get_value (&array->stack.objects[4]), + csi_number_get_value (&array->stack.objects[5])); + + obj->type = CSI_OBJECT_TYPE_MATRIX; + obj->datum.matrix = matrix; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_matrix_new_from_matrix (csi_t *ctx, + csi_object_t *obj, + const cairo_matrix_t *m) +{ + csi_matrix_t *matrix; + + matrix = _csi_slab_alloc (ctx, sizeof (csi_matrix_t)); + if (_csi_unlikely (matrix == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + matrix->base.type = CSI_OBJECT_TYPE_MATRIX; + matrix->base.ref = 1; + matrix->matrix = *m; + + obj->type = CSI_OBJECT_TYPE_MATRIX; + obj->datum.matrix = matrix; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_matrix_new_from_values (csi_t *ctx, + csi_object_t *obj, + double v[6]) +{ + csi_matrix_t *matrix; + + matrix = _csi_slab_alloc (ctx, sizeof (csi_matrix_t)); + if (_csi_unlikely (matrix == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + matrix->base.type = CSI_OBJECT_TYPE_MATRIX; + matrix->base.ref = 1; + cairo_matrix_init (&matrix->matrix, v[0], v[1], v[2], v[3], v[4], v[5]); + + obj->type = CSI_OBJECT_TYPE_MATRIX; + obj->datum.matrix = matrix; + + return CSI_STATUS_SUCCESS; +} + +void +csi_matrix_free (csi_t *ctx, + csi_matrix_t *obj) +{ + _csi_slab_free (ctx, obj, sizeof (csi_matrix_t)); +} + + +csi_status_t +csi_name_new (csi_t *ctx, + csi_object_t *obj, + const char *str, + int len) +{ + csi_status_t status; + + status = _csi_intern_string (ctx, &str, len); + if (_csi_unlikely (status)) + return status; + + obj->type = CSI_OBJECT_TYPE_NAME; + obj->datum.name = (csi_name_t) str; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_name_new_static (csi_t *ctx, + csi_object_t *obj, + const char *str) +{ + csi_status_t status; + + status = _csi_intern_string (ctx, &str, strlen (str)); + if (_csi_unlikely (status)) + return status; + + obj->type = CSI_OBJECT_TYPE_NAME; + obj->datum.name = (csi_name_t) str; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_string_new (csi_t *ctx, + csi_object_t *obj, + const char *str, + int len) +{ + csi_string_t *string; + + if (len < 0) + len = strlen (str); + if (_csi_unlikely (len >= INT_MAX)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + if (ctx->free_string == NULL || ctx->free_string->len <= len) { + string = _csi_slab_alloc (ctx, sizeof (csi_string_t)); + if (_csi_unlikely (string == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + string->string = _csi_alloc (ctx, len + 1); + if (_csi_unlikely (string->string == NULL)) { + _csi_slab_free (ctx, string, sizeof (csi_string_t)); + return _csi_error (CSI_STATUS_NO_MEMORY); + } + } else { + string = ctx->free_string; + ctx->free_string = NULL; + } + + if (str != NULL) { + memcpy (string->string, str, len); + string->string[len] = '\0'; + } + string->len = len; + string->deflate = 0; + string->method = NONE; + + string->base.type = CSI_OBJECT_TYPE_STRING; + string->base.ref = 1; + + obj->type = CSI_OBJECT_TYPE_STRING; + obj->datum.string = string; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_string_deflate_new (csi_t *ctx, + csi_object_t *obj, + void *bytes, + int in_len, + int out_len) +{ + csi_status_t status; + csi_string_t *string; + + status = csi_string_new (ctx, obj, bytes, in_len); + if (_csi_unlikely (status)) + return status; + + string = obj->datum.string; + string->deflate = out_len; + string->method = ZLIB; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +csi_string_new_from_bytes (csi_t *ctx, + csi_object_t *obj, + char *bytes, + unsigned int len) +{ + csi_string_t *string; + + if (_csi_unlikely (len >= INT_MAX)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + string = _csi_slab_alloc (ctx, sizeof (csi_string_t)); + if (_csi_unlikely (string == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + string->string = bytes; + string->len = len; + string->deflate = 0; + string->method = NONE; + + string->base.type = CSI_OBJECT_TYPE_STRING; + string->base.ref = 1; + + obj->type = CSI_OBJECT_TYPE_STRING; + obj->datum.string = string; + + return CSI_STATUS_SUCCESS; +} + +static inline csi_status_t +_csi_string_execute (csi_t *ctx, csi_string_t *string) +{ + csi_status_t status; + csi_object_t obj; + + if (_csi_unlikely (string->len == 0)) + return CSI_STATUS_SUCCESS; + + status = csi_file_new_for_bytes (ctx, &obj, string->string, string->len); + if (_csi_unlikely (status)) + return status; + + status = _csi_scan_file (ctx, obj.datum.file); + csi_object_free (ctx, &obj); + + return status; +} + +void +csi_string_free (csi_t *ctx, csi_string_t *string) +{ +#if CSI_DEBUG_MALLOC + _csi_free (ctx, string->string); + _csi_slab_free (ctx, string, sizeof (csi_string_t)); +#else + if (ctx->free_string != NULL) { + if (string->len > ctx->free_string->len) { + csi_string_t *tmp = ctx->free_string; + ctx->free_string = string; + string = tmp; + } + + _csi_free (ctx, string->string); + _csi_slab_free (ctx, string, sizeof (csi_string_t)); + } else + ctx->free_string = string; +#endif +} + +csi_status_t +csi_object_execute (csi_t *ctx, csi_object_t *obj) +{ + csi_status_t status; + csi_object_t indirect; + + INDIRECT: + switch (obj->type & CSI_OBJECT_TYPE_MASK) { + case CSI_OBJECT_TYPE_NAME: + status = _csi_name_lookup (ctx, obj->datum.name, &indirect); + if (_csi_unlikely (status)) + return status; + if (indirect.type & CSI_OBJECT_ATTR_EXECUTABLE) { + obj = &indirect; + goto INDIRECT; + } else + return _csi_push_ostack_copy (ctx, &indirect); + + case CSI_OBJECT_TYPE_OPERATOR: + return obj->datum.op (ctx); + + case CSI_OBJECT_TYPE_ARRAY: + return _csi_array_execute (ctx, obj->datum.array); + case CSI_OBJECT_TYPE_FILE: + return _csi_file_execute (ctx, obj->datum.file); + case CSI_OBJECT_TYPE_STRING: + return _csi_string_execute (ctx, obj->datum.string); + + default: + return _csi_push_ostack_copy (ctx, obj); + } +} + +csi_object_t * +csi_object_reference (csi_object_t *obj) +{ + if (CSI_OBJECT_IS_CAIRO (obj)) { + switch (obj->type & CSI_OBJECT_TYPE_MASK) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_reference (obj->datum.cr); + break; + case CSI_OBJECT_TYPE_FONT: + cairo_font_face_reference (obj->datum.font_face); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_pattern_reference (obj->datum.pattern); + break; + case CSI_OBJECT_TYPE_SCALED_FONT: + cairo_scaled_font_reference (obj->datum.scaled_font); + break; + case CSI_OBJECT_TYPE_SURFACE: + cairo_surface_reference (obj->datum.surface); + break; + } + } else if (CSI_OBJECT_IS_COMPOUND (obj)) { + obj->datum.object->ref++; + } + + return obj; +} + +void +csi_object_free (csi_t *ctx, + csi_object_t *obj) +{ + if (CSI_OBJECT_IS_CAIRO (obj)) { + switch (obj->type & CSI_OBJECT_TYPE_MASK) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_destroy (obj->datum.cr); + break; + case CSI_OBJECT_TYPE_FONT: + cairo_font_face_destroy (obj->datum.font_face); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_pattern_destroy (obj->datum.pattern); + break; + case CSI_OBJECT_TYPE_SCALED_FONT: + cairo_scaled_font_destroy (obj->datum.scaled_font); + break; + case CSI_OBJECT_TYPE_SURFACE: + cairo_surface_destroy (obj->datum.surface); + break; + } + } else if (CSI_OBJECT_IS_COMPOUND (obj)) { + if (--obj->datum.object->ref) + return; + + switch (obj->type & CSI_OBJECT_TYPE_MASK) { + case CSI_OBJECT_TYPE_ARRAY: + csi_array_free (ctx, obj->datum.array); + break; + case CSI_OBJECT_TYPE_DICTIONARY: + csi_dictionary_free (ctx, obj->datum.dictionary); + break; + case CSI_OBJECT_TYPE_FILE: + _csi_file_free (ctx, obj->datum.file); + break; + case CSI_OBJECT_TYPE_MATRIX: + csi_matrix_free (ctx, obj->datum.matrix); + break; + case CSI_OBJECT_TYPE_STRING: + csi_string_free (ctx, obj->datum.string); + break; + default: + break; + } + } +} + +csi_status_t +csi_object_as_file (csi_t *ctx, + csi_object_t *src, + csi_object_t *file) +{ + int type = csi_object_get_type (src); + switch (type) { + case CSI_OBJECT_TYPE_FILE: + *file = *csi_object_reference (src); + return CSI_STATUS_SUCCESS; + case CSI_OBJECT_TYPE_STRING: + return csi_file_new_from_string (ctx, file, src->datum.string); + case CSI_OBJECT_TYPE_ARRAY: +#if 0 + if (src->type & CSI_OBJECT_ATTR_EXECUTABLE) + return _csi_file_new_from_procedure (cs, src); +#endif + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static int +lexcmp (void const *a, size_t alen, + void const *b, size_t blen) +{ + size_t len = alen < blen ? alen : blen; + int cmp = memcmp (a, b, len); + if (cmp) + return cmp; + if (alen == blen) + return 0; + return alen < blen ? -1 : +1; +} + +csi_boolean_t +csi_object_eq (csi_object_t *a, + csi_object_t *b) +{ + csi_object_type_t atype = csi_object_get_type (a); + csi_object_type_t btype = csi_object_get_type (b); + + if (atype == btype) { + switch (atype) { + case CSI_OBJECT_TYPE_BOOLEAN: + return a->datum.boolean == b->datum.boolean; + case CSI_OBJECT_TYPE_INTEGER: + return a->datum.integer == b->datum.integer; + case CSI_OBJECT_TYPE_REAL: + return a->datum.real == b->datum.real; + case CSI_OBJECT_TYPE_NAME: + return a->datum.name == b->datum.name; + case CSI_OBJECT_TYPE_STRING: + return 0 == lexcmp (a->datum.string->string, + a->datum.string->len, + b->datum.string->string, + b->datum.string->len); + case CSI_OBJECT_TYPE_NULL: + case CSI_OBJECT_TYPE_MARK: + return TRUE; + case CSI_OBJECT_TYPE_OPERATOR: + return a->datum.op == b->datum.op; + case CSI_OBJECT_TYPE_ARRAY: + case CSI_OBJECT_TYPE_DICTIONARY: + case CSI_OBJECT_TYPE_FILE: + case CSI_OBJECT_TYPE_MATRIX: + case CSI_OBJECT_TYPE_CONTEXT: + case CSI_OBJECT_TYPE_FONT: + case CSI_OBJECT_TYPE_PATTERN: + case CSI_OBJECT_TYPE_SCALED_FONT: + case CSI_OBJECT_TYPE_SURFACE: + return a->datum.ptr == b->datum.ptr; + } + } + + if (atype < btype) { + csi_object_t *c; + csi_object_type_t ctype; + c = a; a = b; b = c; + ctype = atype; atype = btype; btype = ctype; + } + + switch ((int) atype) { + case CSI_OBJECT_TYPE_INTEGER: + if (btype == CSI_OBJECT_TYPE_BOOLEAN) { + return a->datum.integer == b->datum.boolean; + } + break; + case CSI_OBJECT_TYPE_REAL: + if (btype == CSI_OBJECT_TYPE_INTEGER) { + return a->datum.real == b->datum.integer; + } + else if (btype == CSI_OBJECT_TYPE_BOOLEAN) { + return a->datum.real == b->datum.boolean; + } + break; + + case CSI_OBJECT_TYPE_STRING: + if (btype == CSI_OBJECT_TYPE_NAME) { + const char *bstr = (const char *) b->datum.name; + return 0 == lexcmp (a->datum.string->string, + a->datum.string->len, + bstr, + strlen (bstr)); + } + break; + + default: + break; + } + + return FALSE; +} + +csi_status_t +csi_object_compare (csi_object_t *a, + csi_object_t *b, + int *out) +{ + csi_object_type_t atype = csi_object_get_type (a); + csi_object_type_t btype = csi_object_get_type (b); + int sign; + + if (csi_object_eq (a, b)){ + *out = 0; + return CSI_STATUS_SUCCESS; + } + +#define CMP(x,y) ((x) < (y) ? -1 : +1) + + if (atype == btype) { + switch (atype) { + case CSI_OBJECT_TYPE_BOOLEAN: + *out = CMP (a->datum.boolean, b->datum.boolean); + return CSI_STATUS_SUCCESS; + case CSI_OBJECT_TYPE_INTEGER: + *out = CMP (a->datum.integer, b->datum.integer); + return CSI_STATUS_SUCCESS; + case CSI_OBJECT_TYPE_REAL: + *out = CMP (a->datum.real, b->datum.real); + return CSI_STATUS_SUCCESS; + case CSI_OBJECT_TYPE_NAME: { + const char *x = (char const *) a->datum.name; + const char *y = (char const *) b->datum.name; + *out = lexcmp (x, strlen(x), y, strlen (y)); + return CSI_STATUS_SUCCESS; + } + case CSI_OBJECT_TYPE_STRING: + *out = lexcmp (a->datum.string->string, + a->datum.string->len, + b->datum.string->string, + b->datum.string->len); + return CSI_STATUS_SUCCESS; + case CSI_OBJECT_TYPE_NULL: + case CSI_OBJECT_TYPE_MARK: + case CSI_OBJECT_TYPE_OPERATOR: + case CSI_OBJECT_TYPE_ARRAY: + case CSI_OBJECT_TYPE_DICTIONARY: + case CSI_OBJECT_TYPE_FILE: + case CSI_OBJECT_TYPE_MATRIX: + case CSI_OBJECT_TYPE_CONTEXT: + case CSI_OBJECT_TYPE_FONT: + case CSI_OBJECT_TYPE_PATTERN: + case CSI_OBJECT_TYPE_SCALED_FONT: + case CSI_OBJECT_TYPE_SURFACE: + goto TYPE_CHECK_ERROR; + } + } + + sign = +1; + if (atype < btype) { + csi_object_t *c; + csi_object_type_t ctype; + c = a; a = b; b = c; + ctype = atype; atype = btype; btype = ctype; + sign = -1; + } + + switch ((int) atype) { + case CSI_OBJECT_TYPE_INTEGER: + if (btype == CSI_OBJECT_TYPE_BOOLEAN) { + *out = sign * CMP (a->datum.integer, !!b->datum.boolean); + return CSI_STATUS_SUCCESS; + } + break; + case CSI_OBJECT_TYPE_REAL: + if (btype == CSI_OBJECT_TYPE_INTEGER) { + *out = sign * CMP (a->datum.real, b->datum.integer); + return CSI_STATUS_SUCCESS; + } + else if (btype == CSI_OBJECT_TYPE_BOOLEAN) { + *out = sign * CMP (a->datum.real, !!b->datum.boolean); + return CSI_STATUS_SUCCESS; + } + break; + + case CSI_OBJECT_TYPE_STRING: + if (btype == CSI_OBJECT_TYPE_NAME) { + const char *bstr = (const char *) b->datum.name; + *out = sign * lexcmp (a->datum.string->string, + a->datum.string->len, + bstr, + strlen (bstr)); + return CSI_STATUS_SUCCESS; + } + break; + + default: + break; + } + +#undef CMP + + TYPE_CHECK_ERROR: + return _csi_error (CSI_STATUS_SCRIPT_INVALID_TYPE); +} diff --git a/util/cairo-script/cairo-script-operators.c b/util/cairo-script/cairo-script-operators.c new file mode 100644 index 000000000..0d6cafc37 --- /dev/null +++ b/util/cairo-script/cairo-script-operators.c @@ -0,0 +1,6791 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +/* TODO real path type */ + +#include "cairo-script-private.h" + +#if CAIRO_HAS_SCRIPT_SURFACE +#include "cairo-script.h" +#endif + +#include /* snprintf */ +#include /* mkstemp */ +#include + +#ifdef _MSC_VER +#define _USE_MATH_DEFINES /* for M_LN2, M_PI and M_SQRT2 on win32 */ +#define snprintf _snprintf +#endif + +#include +#include /* INT_MAX */ +#include + +#if HAVE_ZLIB +#include +#endif + +#if HAVE_LZO +#include +#endif + +#ifdef HAVE_MMAP +# ifdef HAVE_UNISTD_H +# include +# include +# else +# undef HAVE_MMAP +# endif +#endif + +typedef struct _csi_proxy { + csi_t *ctx; + void *ptr; + csi_dictionary_t *dictionary; + csi_destroy_func_t destroy_func; + void *destroy_data; +} csi_proxy_t; + +typedef struct _csi_blob { + csi_list_t list; + unsigned long hash; + uint8_t *bytes; + unsigned int len; +} csi_blob_t; + +static const cairo_user_data_key_t _csi_proxy_key; +static const cairo_user_data_key_t _csi_blob_key; + +enum mime_type { + MIME_TYPE_NONE = 0, + MIME_TYPE_PNG +}; + +#define check(CNT) do {\ + if (_csi_unlikely (! _csi_check_ostack (ctx, (CNT)))) \ + return _csi_error (CSI_STATUS_INVALID_SCRIPT); \ +} while (0) +#define pop(CNT) _csi_pop_ostack (ctx, (CNT)) +#define push(OBJ) _csi_push_ostack (ctx, (OBJ)) + +static csi_proxy_t * +_csi_proxy_create (csi_t *ctx, + void *ptr, + csi_dictionary_t *dictionary, + csi_destroy_func_t destroy_func, + void *destroy_data) +{ + csi_proxy_t *proxy; + + proxy = _csi_slab_alloc (ctx, sizeof (csi_proxy_t)); + if (proxy == NULL) + return NULL; + + proxy->ctx = cairo_script_interpreter_reference (ctx); + proxy->ptr = ptr; + proxy->destroy_func = destroy_func; + proxy->destroy_data = destroy_data; + proxy->dictionary = dictionary; + if (dictionary != NULL) + dictionary->base.ref++; + + return proxy; +} + +static void +_csi_proxy_destroy (void *closure) +{ + csi_proxy_t *proxy = closure; + csi_t *ctx = proxy->ctx; + + /* XXX this doesn't work because user_data_destroy is called too late. + * Considering another hook into the (cairo internal) object system. + */ + if (proxy->destroy_func != NULL) + proxy->destroy_func (proxy->destroy_data, proxy->ptr); + + if (proxy->dictionary != NULL && --proxy->dictionary->base.ref == 0) + csi_dictionary_free (ctx, proxy->dictionary); + + _csi_slab_free (ctx, proxy, sizeof (csi_proxy_t)); + cairo_script_interpreter_destroy (ctx); +} + +static void +_csi_blob_hash (csi_blob_t *blob, const uint32_t *data, int len) +{ + unsigned long hash = blob->hash; + /* very simple! */ + while (len--) { + unsigned long c = *data++; + hash *= 33; + hash ^= c; + } + blob->hash = hash; +} + +static csi_boolean_t +_csi_blob_equal (const csi_list_t *link, void *data) +{ + csi_blob_t *A, *B; + + A = csi_container_of (link, csi_blob_t, list); + B = data; + + if (A->len != B->len) + return FALSE; + + if (A->hash != B->hash) + return FALSE; + + return memcmp (A->bytes, B->bytes, A->len) == 0; +} + +static void +_csi_blob_init (csi_blob_t *blob, uint8_t *bytes, int len) +{ + blob->hash = 5381; + blob->len = len; + blob->bytes = bytes; +} + +static csi_list_t * +_csi_list_unlink (csi_list_t *head, csi_list_t *link) +{ + if (link->next != NULL) + link->next->prev = link->prev; + if (link->prev != NULL) + link->prev->next = link->next; + else + head = link->next; + return head; +} + +static csi_list_t * +_csi_list_prepend (csi_list_t *head, csi_list_t *link) +{ + if (head != NULL) + head->prev = link; + link->next = head; + link->prev = NULL; + return link; +} + +static csi_list_t * +_csi_list_find (csi_list_t *head, + csi_boolean_t (*predicate) (const csi_list_t *link, void *data), + void *data) +{ + while (head != NULL) { + if (predicate (head, data)) + return head; + head = head->next; + } + + return NULL; +} + +static csi_status_t +_csi_ostack_get_boolean (csi_t *ctx, unsigned int i, csi_boolean_t *out) +{ + csi_object_t *obj; + int type; + + obj = _csi_peek_ostack (ctx, i); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + *out = obj->datum.boolean; + break; + case CSI_OBJECT_TYPE_INTEGER: + *out = !! obj->datum.integer; + break; + case CSI_OBJECT_TYPE_REAL: + *out = obj->datum.real != 0.; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_integer (csi_t *ctx, unsigned int i, csi_integer_t *out) +{ + csi_object_t *obj; + int type; + + obj = _csi_peek_ostack (ctx, i); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + *out = obj->datum.boolean; + break; + case CSI_OBJECT_TYPE_INTEGER: + *out = obj->datum.integer; + break; + case CSI_OBJECT_TYPE_REAL: + *out = obj->datum.real; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_number (csi_t *ctx, unsigned int i, double *out) +{ + csi_object_t *obj; + int type; + + obj = _csi_peek_ostack (ctx, i); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + *out = obj->datum.boolean; + break; + case CSI_OBJECT_TYPE_INTEGER: + *out = obj->datum.integer; + break; + case CSI_OBJECT_TYPE_REAL: + *out = obj->datum.real; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + return CSI_STATUS_SUCCESS; +} + +static double +_csi_object_as_real (csi_object_t *obj) +{ + int type; + + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + return obj->datum.boolean; + case CSI_OBJECT_TYPE_INTEGER: + return obj->datum.integer; + case CSI_OBJECT_TYPE_REAL: + return obj->datum.real; + default: + return 0; + } +} + +static csi_status_t +_csi_ostack_get_name (csi_t *ctx, unsigned int i, csi_name_t *out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (csi_object_get_type (obj) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.name; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_context (csi_t *ctx, unsigned int i, cairo_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (csi_object_get_type (obj) != CSI_OBJECT_TYPE_CONTEXT)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.cr; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_font_face (csi_t *ctx, unsigned int i, cairo_font_face_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (csi_object_get_type (obj) != CSI_OBJECT_TYPE_FONT)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.font_face; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_pattern (csi_t *ctx, unsigned int i, cairo_pattern_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (csi_object_get_type (obj) != CSI_OBJECT_TYPE_PATTERN)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.pattern; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_scaled_font (csi_t *ctx, unsigned int i, + cairo_scaled_font_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely + (csi_object_get_type (obj) != CSI_OBJECT_TYPE_SCALED_FONT)) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + *out = obj->datum.scaled_font; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_surface (csi_t *ctx, unsigned int i, cairo_surface_t **out) +{ + csi_object_t *obj; + int type; + + obj = _csi_peek_ostack (ctx, i); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + *out = cairo_get_target (obj->datum.cr); + break; + case CSI_OBJECT_TYPE_SURFACE: + *out = obj->datum.surface; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_array (csi_t *ctx, unsigned int i, csi_array_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (csi_object_get_type (obj) != CSI_OBJECT_TYPE_ARRAY)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.array; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_procedure (csi_t *ctx, unsigned int i, csi_array_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (! csi_object_is_procedure (obj))) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.array; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_dictionary (csi_t *ctx, unsigned int i, csi_dictionary_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely + (csi_object_get_type (obj) != CSI_OBJECT_TYPE_DICTIONARY)) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + *out = obj->datum.dictionary; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_matrix (csi_t *ctx, unsigned int i, cairo_matrix_t *out) +{ + csi_object_t *obj; + int type; + + obj = _csi_peek_ostack (ctx, i); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_MATRIX: + *out = obj->datum.matrix->matrix; + return CSI_STATUS_SUCCESS; + + case CSI_OBJECT_TYPE_ARRAY: + if (obj->datum.array->stack.len == 6) { + cairo_matrix_init (out, + csi_number_get_value (&obj->datum.array->stack.objects[0]), + csi_number_get_value (&obj->datum.array->stack.objects[1]), + csi_number_get_value (&obj->datum.array->stack.objects[2]), + csi_number_get_value (&obj->datum.array->stack.objects[3]), + csi_number_get_value (&obj->datum.array->stack.objects[4]), + csi_number_get_value (&obj->datum.array->stack.objects[5])); + return CSI_STATUS_SUCCESS; + } + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static csi_status_t +_csi_dictionary_get_integer (csi_t *ctx, + csi_dictionary_t *dict, + const char *name, + csi_boolean_t optional, + long *value) +{ + csi_status_t status; + csi_object_t key, obj; + int type; + + status = csi_name_new_static (ctx, &key, name); + if (_csi_unlikely (status)) + return status; + + if (optional && ! csi_dictionary_has (dict, key.datum.name)) + return CSI_STATUS_SUCCESS; + + status = csi_dictionary_get (ctx, dict, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + type = csi_object_get_type (&obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + *value = obj.datum.boolean; + break; + case CSI_OBJECT_TYPE_INTEGER: + *value = obj.datum.integer; + break; + case CSI_OBJECT_TYPE_REAL: + *value = obj.datum.real; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_dictionary_get_number (csi_t *ctx, + csi_dictionary_t *dict, + const char *name, + csi_boolean_t optional, + double *value) +{ + csi_status_t status; + csi_object_t key, obj; + + status = csi_name_new_static (ctx, &key, name); + if (_csi_unlikely (status)) + return status; + + if (optional && ! csi_dictionary_has (dict, key.datum.name)) + return CSI_STATUS_SUCCESS; + + status = csi_dictionary_get (ctx, dict, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + *value = csi_number_get_value (&obj); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_string (csi_t *ctx, unsigned int i, csi_string_t **out) +{ + csi_object_t *obj; + + obj = _csi_peek_ostack (ctx, i); + if (_csi_unlikely (csi_object_get_type (obj) != CSI_OBJECT_TYPE_STRING)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + *out = obj->datum.string; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_csi_ostack_get_string_constant (csi_t *ctx, unsigned int i, const char **out) +{ + csi_object_t *obj; + int type; + + obj = _csi_peek_ostack (ctx, i); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_NAME: + *out = (const char *) obj->datum.name; + break; + case CSI_OBJECT_TYPE_STRING: + *out = obj->datum.string->string; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_do_cairo_op (csi_t *ctx, void (*op) (cairo_t *)) +{ + cairo_t *cr; + csi_status_t status; + + check (1); + + status = _csi_ostack_get_context (ctx, 0, &cr); + if (_csi_unlikely (status)) + return status; + + op (cr); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +end_dict_construction (csi_t *ctx) +{ + csi_object_t obj; + csi_dictionary_t *dict; + csi_status_t status; + + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + + dict = obj.datum.dictionary; + do { + csi_object_t *name, *value; + + check (1); + + value = _csi_peek_ostack (ctx, 0); + if (csi_object_get_type (value) == CSI_OBJECT_TYPE_MARK) { + pop (1); + break; + } + + check (2); + + name = _csi_peek_ostack (ctx, 1); + if (_csi_unlikely + (csi_object_get_type (name) != CSI_OBJECT_TYPE_NAME)) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + status = csi_dictionary_put (ctx, dict, name->datum.name, value); + if (_csi_unlikely (status)) + return status; + + pop (2); + } while (TRUE); + + return push (&obj); +} + +static csi_status_t +end_array_construction (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + int len = 0; + + do { + check (len + 1); + + if (csi_object_get_type (_csi_peek_ostack (ctx, len)) == + CSI_OBJECT_TYPE_MARK) + { + break; + } + + len++; + } while (TRUE); + + status = csi_array_new (ctx, len, &obj); + if (_csi_unlikely (status)) + return status; + + if (len != 0) { + csi_array_t *array; + + array = obj.datum.array; + memcpy (array->stack.objects, + _csi_peek_ostack (ctx, len - 1), + sizeof (csi_object_t) * len); + array->stack.len = len; + } + ctx->ostack.len -= len + 1; + + return push (&obj); +} + +static csi_status_t +_alpha (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + double a; + + check (1); + + status = _csi_ostack_get_number (ctx, 0, &a); + if (_csi_unlikely (status)) + return status; + + pop (1); + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_rgba (0, 0, 0, a); + return push (&obj); +} + +static csi_status_t +_add (csi_t *ctx) +{ + csi_object_t *A; + csi_object_t *B; + csi_object_type_t type_a, type_b; + + check (2); + + B = _csi_peek_ostack (ctx, 0); + A = _csi_peek_ostack (ctx, 1); + + type_a = csi_object_get_type (A); + if (_csi_unlikely (! (type_a == CSI_OBJECT_TYPE_INTEGER || + type_a == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + type_b = csi_object_get_type (B); + if (_csi_unlikely (! (type_b == CSI_OBJECT_TYPE_INTEGER || + type_b == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + + if (type_a == CSI_OBJECT_TYPE_REAL && + type_b == CSI_OBJECT_TYPE_REAL) + { + return _csi_push_ostack_real (ctx, A->datum.real + B->datum.real); + + } + else if (type_a == CSI_OBJECT_TYPE_INTEGER && + type_b == CSI_OBJECT_TYPE_INTEGER) + { + return _csi_push_ostack_integer (ctx, + A->datum.integer + B->datum.integer); + } + else + { + double v; + + if (type_a == CSI_OBJECT_TYPE_REAL) + v = A->datum.real; + else + v = A->datum.integer; + + if (type_b == CSI_OBJECT_TYPE_REAL) + v += B->datum.real; + else + v += B->datum.integer; + + return _csi_push_ostack_real (ctx, v); + } +} + +static csi_status_t +_add_color_stop (csi_t *ctx) +{ + csi_status_t status; + double offset, r, g, b, a; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + + check (6); + + status = _csi_ostack_get_number (ctx, 0, &a); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &b); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &g); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &r); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 4, &offset); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_pattern (ctx, 5, &pattern); + if (_csi_unlikely (status)) + return status; + + cairo_pattern_add_color_stop_rgba (pattern, offset, r, g, b, a); + + pop (5); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_and (csi_t *ctx) +{ + csi_object_t *a, *b; + int type; + + check (2); + + a = _csi_peek_ostack (ctx, 0); + b = _csi_peek_ostack (ctx, 1); + if (_csi_unlikely (csi_object_get_type (a) != csi_object_get_type (b))) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + pop (2); + type = csi_object_get_type (a); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + return _csi_push_ostack_integer (ctx, + a->datum.integer & b->datum.integer); + case CSI_OBJECT_TYPE_BOOLEAN: + return _csi_push_ostack_boolean (ctx, + a->datum.boolean & b->datum.boolean); + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static csi_status_t +_arc (csi_t *ctx) +{ + csi_status_t status; + double x, y, r; + double theta1, theta2; + cairo_t *cr; + + check (6); + + status = _csi_ostack_get_number (ctx, 0, &theta2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &theta1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &r); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 4, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 5, &cr); + if (_csi_unlikely (status)) + return status; + + /* XXX handle path object */ + + cairo_arc (cr, x, y, r, theta1, theta2); + pop (5); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_arc_negative (csi_t *ctx) +{ + csi_status_t status; + double x, y, r; + double theta1, theta2; + cairo_t *cr; + + check (6); + + status = _csi_ostack_get_number (ctx, 0, &theta2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &theta1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &r); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 4, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 5, &cr); + if (_csi_unlikely (status)) + return status; + + /* XXX handle path object */ + + cairo_arc_negative (cr, x, y, r, theta1, theta2); + pop (5); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_array (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + + status = csi_array_new (ctx, 0, &obj); + if (_csi_unlikely (status)) + return status; + + return push (&obj); +} + +static csi_status_t +_bind_substitute (csi_t *ctx, csi_array_t *array) +{ + csi_status_t status; + csi_integer_t i, n; + csi_dictionary_t *dict; + + /* perform operator substitution on the executable array (procedure) */ + dict = ctx->dstack.objects[0].datum.dictionary; + n = array->stack.len; + for (i = 0; i < n; i++) { + csi_object_t *obj = &array->stack.objects[i]; + + if (obj->type == (CSI_OBJECT_TYPE_NAME | CSI_OBJECT_ATTR_EXECUTABLE)) { + csi_dictionary_entry_t *entry; + + entry = _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) + &obj->datum.name); + if (entry != NULL) + *obj = entry->value; + } else if (csi_object_is_procedure (obj)) { + status = _bind_substitute (ctx, obj->datum.array); + if (_csi_unlikely (status)) + return status; + } + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_idiom_substitute (csi_t *ctx, csi_array_t *array) +{ +#if 0 + csi_status_t status; + csi_integer_t i, j; + + /* XXX substring search, build array once then search for + * longest matching idiom, repeat. */ + + /* scan the top-most array for sequences we can pre-compile */ + + /* now recurse for subroutines */ + j = array->stack.len; + for (i = 0; i < j; i++) { + csi_object_t *obj = &array->stack.objects[i]; + + if (csi_object_is_procedure (obj)) { + status = _idiom_substitute (ctx, obj->datum.array); + if (_csi_unlikely (_cairo_is_error (status)) + return status; + } + } +#endif + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_bind (csi_t *ctx) +{ + csi_array_t *array; + csi_status_t status; + + check (1); + + status = _csi_ostack_get_procedure (ctx, 0, &array); + if (_csi_unlikely (status)) + return status; + + status = _bind_substitute (ctx, array); + if (_csi_unlikely (status)) + return status; + + status = _idiom_substitute (ctx, array); + if (_csi_unlikely (status)) + return status; + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_bitshift (csi_t *ctx) +{ + long v, shift; + csi_status_t status; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &shift); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 1, &v); + if (_csi_unlikely (status)) + return status; + + if (shift < 0) { + shift = -shift; + v >>= shift; + } else + v <<= shift; + + pop (1); + _csi_peek_ostack (ctx, 0)->datum.integer = v; + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_clip (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_clip); +} + +static csi_status_t +_clip_preserve (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_clip_preserve); +} + +static csi_status_t +_close_path (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_close_path); +} + +static csi_status_t +_context (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + cairo_surface_t *surface; + cairo_t *cr; + csi_context_create_func_t hook; + csi_proxy_t *proxy; + + check (1); + + status = _csi_ostack_get_surface (ctx, 0, &surface); + if (_csi_unlikely (status)) + return status; + + hook = ctx->hooks.context_create; + if (hook != NULL) + cr = hook (ctx->hooks.closure, surface); + else + cr = cairo_create (surface); + + proxy = _csi_proxy_create (ctx, cr, NULL, + ctx->hooks.context_destroy, + ctx->hooks.closure); + if (_csi_unlikely (proxy == NULL)) { + cairo_destroy (cr); + return _csi_error (CSI_STATUS_NO_MEMORY); + } + + status = cairo_set_user_data (cr, &_csi_proxy_key, + proxy, _csi_proxy_destroy); + if (_csi_unlikely (status)) { + _csi_proxy_destroy (proxy); + cairo_destroy (cr); + return status; + } + + pop (1); + obj.type = CSI_OBJECT_TYPE_CONTEXT; + obj.datum.cr = cr; + return push (&obj); +} + +static csi_status_t +_copy (csi_t *ctx) +{ + csi_object_t *obj; + int type; + + check (1); + + obj = csi_object_reference (_csi_peek_ostack (ctx, 0)); + pop (1); + + type = csi_object_get_type (obj); + switch (type) { + /*XXX array, string, dictionary, etc */ + case CSI_OBJECT_TYPE_INTEGER: + { + long i, n; + + n = obj->datum.integer; + if (_csi_unlikely (n < 0)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + check (n); + + for (i = n; i--; ) { + csi_status_t status; + + status = _csi_push_ostack_copy (ctx, + _csi_peek_ostack (ctx, n-1)); + if (_csi_unlikely (status)) + return status; + } + break; + } + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_copy_page (csi_t *ctx) +{ + csi_object_t *obj; + int type; + + check (1); + + obj = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_copy_page (obj->datum.cr); + if (ctx->hooks.copy_page != NULL) + ctx->hooks.copy_page (ctx->hooks.closure, obj->datum.cr); + break; + case CSI_OBJECT_TYPE_SURFACE: + cairo_surface_copy_page (obj->datum.surface); + /* XXX hook? */ + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_curve_to (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *obj; + int type; + double x1, y1; + double x2, y2; + double x3, y3; + + check (7); + + status = _csi_ostack_get_number (ctx, 0, &y3); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x3); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &y2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &x2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 4, &y1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 5, &x1); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 6); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_curve_to (obj->datum.cr, x1, y1, x2, y2, x3, y3); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_mesh_pattern_curve_to (obj->datum.pattern, + x1, y1, x2, y2, x3, y3); + break; + /* XXX handle path object */ + } + + pop (6); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_cvi (csi_t *ctx) +{ + csi_object_t *val, obj; + int type; + + check (1); + + val = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (val); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + return CSI_STATUS_SUCCESS; + + case CSI_OBJECT_TYPE_REAL: + pop (1); + return _csi_push_ostack_integer (ctx, val->datum.real); + + case CSI_OBJECT_TYPE_STRING: + if (! _csi_parse_number (&obj, + val->datum.string->string, + val->datum.string->len)) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + if (csi_object_get_type (&obj) == CSI_OBJECT_TYPE_INTEGER) + return push (&obj); + else + return _csi_push_ostack_integer (ctx, obj.datum.real); + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static csi_status_t +_cvr (csi_t *ctx) +{ + csi_object_t *val, obj; + int type; + + check (1); + + val = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (val); + switch (type) { + case CSI_OBJECT_TYPE_REAL: + return CSI_STATUS_SUCCESS; + + case CSI_OBJECT_TYPE_INTEGER: + pop (1); + return _csi_push_ostack_real (ctx, val->datum.integer); + + case CSI_OBJECT_TYPE_STRING: + if (! _csi_parse_number (&obj, + val->datum.string->string, + val->datum.string->len)) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + if (csi_object_get_type (&obj) == CSI_OBJECT_TYPE_REAL) + return push (&obj); + else + return _csi_push_ostack_real (ctx, obj.datum.integer); + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static csi_status_t +_def (csi_t *ctx) +{ + csi_name_t name = 0; /* silence the compiler */ + csi_status_t status; + + check (2); + + status = _csi_ostack_get_name (ctx, 1, &name); + if (_csi_unlikely (status)) + return status; + + status = _csi_name_define (ctx, name, _csi_peek_ostack (ctx, 0)); + if (_csi_unlikely (status)) + return status; + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_dict (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + + return push (&obj); +} + +static csi_status_t +_div (csi_t *ctx) +{ + csi_object_t *A; + csi_object_t *B; + csi_object_type_t type_a, type_b; + + check (2); + + B = _csi_peek_ostack (ctx, 0); + A = _csi_peek_ostack (ctx, 1); + + type_a = csi_object_get_type (A); + if (_csi_unlikely (! (type_a == CSI_OBJECT_TYPE_INTEGER || + type_a == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + type_b = csi_object_get_type (B); + if (_csi_unlikely (! (type_b == CSI_OBJECT_TYPE_INTEGER || + type_b == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + + if (type_a == CSI_OBJECT_TYPE_REAL && + type_b == CSI_OBJECT_TYPE_REAL) + { + return _csi_push_ostack_real (ctx, A->datum.real / B->datum.real); + + } + else if (type_a == CSI_OBJECT_TYPE_INTEGER && + type_b == CSI_OBJECT_TYPE_INTEGER) + { + return _csi_push_ostack_integer (ctx, + A->datum.integer / B->datum.integer); + } + else + { + double v; + + if (type_a == CSI_OBJECT_TYPE_REAL) + v = A->datum.real; + else + v = A->datum.integer; + + if (type_b == CSI_OBJECT_TYPE_REAL) + v /= B->datum.real; + else + v /= B->datum.integer; + + return _csi_push_ostack_real (ctx, v); + } +} + +static csi_status_t +_duplicate (csi_t *ctx) +{ + check (1); + + return _csi_push_ostack_copy (ctx, _csi_peek_ostack (ctx, 0)); +} + +static csi_status_t +_eq (csi_t *ctx) +{ + csi_object_t *a, *b; + csi_boolean_t v; + + check (2); + + b = _csi_peek_ostack (ctx, 0); + a = _csi_peek_ostack (ctx, 1); + + v = csi_object_eq (a, b); + + pop (2); + return _csi_push_ostack_boolean (ctx, v); +} + +static csi_status_t +_exch (csi_t *ctx) +{ + return _csi_stack_exch (&ctx->ostack); +} + +static csi_status_t +_false (csi_t *ctx) +{ + return _csi_push_ostack_boolean (ctx, FALSE); +} + +static csi_status_t +_fill (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_fill); +} + +static csi_status_t +_fill_preserve (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_fill_preserve); +} + +static csi_status_t +_filter (csi_t *ctx) +{ + csi_object_t *src; + csi_dictionary_t *dict = NULL; + csi_status_t status; + const char *name = NULL; /* silence the compiler */ + const struct filters { + const char *name; + csi_status_t (*constructor) (csi_t *t, + csi_object_t *, + csi_dictionary_t *, + csi_object_t *); + } filters[] = { + { "ascii85", csi_file_new_ascii85_decode }, +#if HAVE_ZLIB + { "deflate", csi_file_new_deflate_decode }, +#endif +#if 0 + { "lzw", csi_file_new_lzw_decode }, +#endif + { NULL, NULL } + }, *filter; + int cnt; + + check (2); + + status = _csi_ostack_get_string_constant (ctx, 0, &name); + if (_csi_unlikely (status)) + return status; + + src = _csi_peek_ostack (ctx, 1); + cnt = 2; + if (csi_object_get_type (src) == CSI_OBJECT_TYPE_DICTIONARY) { + dict = src->datum.dictionary; + + check (3); + + src = _csi_peek_ostack (ctx, 2); + cnt = 3; + } + + for (filter = filters; filter->name != NULL; filter++) { + if (strcmp (name, filter->name) == 0) { + csi_object_t file; + + status = filter->constructor (ctx, &file, dict, src); + if (_csi_unlikely (status)) + return status; + + pop (cnt); + return push (&file); + } + } + + return _csi_error (CSI_STATUS_INVALID_SCRIPT); +} + +static cairo_status_t +_type3_init (cairo_scaled_font_t *scaled_font, + cairo_t *cr, + cairo_font_extents_t *metrics) +{ + cairo_font_face_t *face; + csi_proxy_t *proxy; + csi_t *ctx; + csi_dictionary_t *font; + csi_object_t key; + csi_object_t obj; + csi_array_t *array; + csi_status_t status; + + face = cairo_scaled_font_get_font_face (scaled_font); + proxy = cairo_font_face_get_user_data (face, &_csi_proxy_key); + if (_csi_unlikely (proxy == NULL)) + return CAIRO_STATUS_NO_MEMORY; + + ctx = proxy->ctx; + font = proxy->dictionary; + + status = csi_name_new_static (ctx, &key, "metrics"); + if (_csi_unlikely (status)) + return CAIRO_STATUS_NO_MEMORY; + + if (! csi_dictionary_has (font, key.datum.name)) + return CAIRO_STATUS_SUCCESS; + + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + if (csi_object_get_type (&obj) != CSI_OBJECT_TYPE_ARRAY) + return CAIRO_STATUS_USER_FONT_ERROR; + + array = obj.datum.array; + if (array->stack.len != 5) + return CAIRO_STATUS_USER_FONT_ERROR; + + metrics->ascent = csi_number_get_value (&array->stack.objects[0]); + metrics->descent = csi_number_get_value (&array->stack.objects[1]); + metrics->height = csi_number_get_value (&array->stack.objects[2]); + metrics->max_x_advance = csi_number_get_value (&array->stack.objects[3]); + metrics->max_y_advance = csi_number_get_value (&array->stack.objects[4]); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_status_t +_type3_lookup (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph) +{ + cairo_font_face_t *face; + csi_proxy_t *proxy; + csi_t *ctx; + csi_dictionary_t *font; + csi_object_t obj, key; + csi_array_t *array; + char buf[12]; + csi_integer_t i; + cairo_status_t status; + + face = cairo_scaled_font_get_font_face (scaled_font); + proxy = cairo_font_face_get_user_data (face, &_csi_proxy_key); + if (_csi_unlikely (proxy == NULL)) + return CAIRO_STATUS_USER_FONT_ERROR; + + ctx = proxy->ctx; + font = proxy->dictionary; + + status = csi_name_new_static (ctx, &key, "encoding"); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + if (! csi_dictionary_has (font, key.datum.name)) { + *glyph = unicode; + return CAIRO_STATUS_SUCCESS; + } + + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + if (_csi_unlikely (csi_object_get_type (&obj) != CSI_OBJECT_TYPE_ARRAY)) + return CAIRO_STATUS_USER_FONT_ERROR; + + snprintf (buf, sizeof (buf), "uni%04lu", unicode); + array = obj.datum.array; + for (i = 0; i < array->stack.len; i++) { + csi_object_t *name; + + name = &array->stack.objects[i]; + if (csi_object_get_type (name) != CSI_OBJECT_TYPE_NAME) + continue; + + if (strcmp ((char *) name->datum.name, buf) == 0) { + *glyph = i; + return CAIRO_STATUS_SUCCESS; + } + } + + return CAIRO_STATUS_USER_FONT_ERROR; +} + +static cairo_status_t +_type3_render (cairo_scaled_font_t *scaled_font, + unsigned long glyph_index, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + cairo_font_face_t *face; + csi_proxy_t *proxy; + csi_t *ctx; + csi_dictionary_t *font; + csi_array_t *glyphs; + csi_object_t *glyph; + csi_object_t key; + csi_object_t obj; + csi_object_t render; + csi_status_t status; + + face = cairo_scaled_font_get_font_face (scaled_font); + proxy = cairo_font_face_get_user_data (face, &_csi_proxy_key); + if (_csi_unlikely (proxy == NULL)) + return CAIRO_STATUS_USER_FONT_ERROR; + + ctx = proxy->ctx; + font = proxy->dictionary; + + status = csi_name_new_static (ctx, &key, "glyphs"); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + if (_csi_unlikely (csi_object_get_type (&obj) != CSI_OBJECT_TYPE_ARRAY)) + return CAIRO_STATUS_USER_FONT_ERROR; + + glyphs = obj.datum.array; + glyph = &glyphs->stack.objects[glyph_index]; + if (csi_object_get_type (glyph) == CSI_OBJECT_TYPE_NULL) + return CAIRO_STATUS_SUCCESS; /* .notdef */ + + if (_csi_unlikely (csi_object_get_type (glyph) != CSI_OBJECT_TYPE_DICTIONARY)) + return CAIRO_STATUS_USER_FONT_ERROR; + + status = csi_name_new_static (ctx, &key, "metrics"); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + font = glyph->datum.dictionary; + if (csi_dictionary_has (font, key.datum.name)) { + csi_array_t *array; + + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + if (_csi_unlikely (csi_object_get_type (&obj) != + CSI_OBJECT_TYPE_ARRAY)) + return CAIRO_STATUS_USER_FONT_ERROR; + + array = obj.datum.array; + if (_csi_unlikely (array->stack.len != 6)) + return CAIRO_STATUS_USER_FONT_ERROR; + + metrics->x_bearing = csi_number_get_value (&array->stack.objects[0]); + metrics->y_bearing = csi_number_get_value (&array->stack.objects[1]); + metrics->width = csi_number_get_value (&array->stack.objects[2]); + metrics->height = csi_number_get_value (&array->stack.objects[3]); + metrics->x_advance = csi_number_get_value (&array->stack.objects[4]); + metrics->y_advance = csi_number_get_value (&array->stack.objects[5]); + } + + status = csi_name_new_static (ctx, &key, "render"); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + status = csi_dictionary_get (ctx, font, key.datum.name, &render); + if (_csi_unlikely (status)) + return CAIRO_STATUS_USER_FONT_ERROR; + + if (_csi_unlikely (! csi_object_is_procedure (&render))) + return CAIRO_STATUS_USER_FONT_ERROR; + + obj.type = CSI_OBJECT_TYPE_CONTEXT; + obj.datum.cr = cairo_reference (cr); + status = push (&obj); + if (_csi_unlikely (status)) { + cairo_destroy (cr); + return CAIRO_STATUS_USER_FONT_ERROR; + } + + status = csi_object_execute (ctx, &render); + pop (1); + return status ? CAIRO_STATUS_USER_FONT_ERROR : CAIRO_STATUS_SUCCESS; +} + +static csi_status_t +_font_type3 (csi_t *ctx, + csi_dictionary_t *font, + cairo_font_face_t **font_face_out) +{ + cairo_font_face_t *font_face; + + font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_init_func (font_face, _type3_init); + cairo_user_font_face_set_unicode_to_glyph_func (font_face, _type3_lookup); + cairo_user_font_face_set_render_glyph_func (font_face, _type3_render); + + *font_face_out = font_face; + return CSI_STATUS_SUCCESS; +} + +#if CAIRO_HAS_FT_FONT +#include +#include +#include FT_FREETYPE_H + +static FT_Library _ft_lib; + +struct _ft_face_data { + csi_t *ctx; + csi_blob_t blob; + FT_Face face; + csi_string_t *source; + void *bytes; + cairo_font_face_t *font_face; +}; + +static void +_ft_done_face (void *closure) +{ + struct _ft_face_data *data = closure; + csi_t *ctx; + + ctx = data->ctx; + + if (data->face != NULL) + FT_Done_Face (data->face); + + ctx->_faces = _csi_list_unlink (ctx->_faces, &data->blob.list); + + if (data->source != NULL) { + if (--data->source->base.ref == 0) + csi_string_free (ctx, data->source); + } else { +#ifdef HAVE_MMAP + munmap (data->blob.bytes, data->blob.len); +#endif + } + + if (data->bytes != NULL) + _csi_free (ctx, data->bytes); + + _csi_slab_free (ctx, data, sizeof (*data)); + + cairo_script_interpreter_destroy (ctx); +} + +struct mmap_vec { + const uint8_t *bytes; + size_t num_bytes; +}; + +#ifdef HAVE_MMAP +/* manual form of swapping for swapless systems like tiny */ +static void * +_mmap_bytes (const struct mmap_vec *vec, int count) +{ + char template[] = "/tmp/csi-font.XXXXXX"; + void *ptr; + int fd; + int num_bytes; + + fd = mkstemp (template); + if (fd == -1) + return MAP_FAILED; + + unlink (template); + num_bytes = 0; + while (count--) { + const uint8_t *bytes = vec->bytes; + size_t len = vec->num_bytes; + while (len) { + int ret = write (fd, bytes, len); + if (ret < 0) { + close (fd); + return MAP_FAILED; + } + len -= ret; + bytes += ret; + } + + num_bytes += vec->num_bytes; + vec++; + } + + ptr = mmap (NULL, num_bytes, PROT_READ, MAP_SHARED, fd, 0); + close (fd); + + return ptr; +} +#endif + +static void * +inflate_string (csi_t *ctx, csi_string_t *src) +{ + uLongf len; + uint8_t *bytes; + + len = src->deflate; + bytes = _csi_alloc (ctx, len + 1); + if (bytes == NULL) + return NULL; + + switch (src->method) { + default: + case NONE: + free (bytes); + return NULL; + + case ZLIB: +#if HAVE_ZLIB + if (uncompress ((Bytef *) bytes, &len, + (Bytef *) src->string, src->len) != Z_OK) +#endif + { + _csi_free (ctx, bytes); + return NULL; + } + break; + + case LZO: +#if HAVE_LZO + if (lzo2a_decompress ((Bytef *) src->string, src->len, + (Bytef *) bytes, &len, + NULL)) +#endif + { + _csi_free (ctx, bytes); + return NULL; + } + break; + } + + bytes[len] = '\0'; + return bytes; +} + +static csi_status_t +_ft_create_for_source (csi_t *ctx, + csi_string_t *source, + int index, int load_flags, + cairo_font_face_t **font_face_out) +{ + csi_blob_t tmpl; + struct _ft_face_data *data; + csi_list_t *link; + FT_Error err; + cairo_font_face_t *font_face; + csi_status_t status; + struct mmap_vec vec[2]; + int vec_count; + void *bytes; + int len; + + /* check for an existing FT_Face (kept alive by the font cache) */ + /* XXX index/flags */ + _csi_blob_init (&tmpl, (uint8_t *) source->string, source->len); + _csi_blob_hash (&tmpl, (uint32_t *) source->string, source->len / sizeof (uint32_t)); + link = _csi_list_find (ctx->_faces, _csi_blob_equal, &tmpl); + if (link) { + if (--source->base.ref == 0) + csi_string_free (ctx, source); + data = csi_container_of (link, struct _ft_face_data, blob.list); + *font_face_out = cairo_font_face_reference (data->font_face); + return CSI_STATUS_SUCCESS; + } + + /* no existing font_face, create new FT_Face */ + if (_ft_lib == NULL) { + err = FT_Init_FreeType (&_ft_lib); + if (_csi_unlikely (err != FT_Err_Ok)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } + + data = _csi_slab_alloc (ctx, sizeof (*data)); + data->bytes = NULL; + data->source = source; + + vec[0].bytes = tmpl.bytes; + vec[0].num_bytes = tmpl.len; + + if (source->deflate) { + len = source->deflate; + bytes = inflate_string (ctx, source); + if (_csi_unlikely (bytes == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + vec[1].bytes = bytes; + vec[1].num_bytes = len; + data->bytes = bytes; + vec_count = 2; + } else { + bytes = tmpl.bytes; + len = tmpl.len; + vec_count = 1; + } + + data->face = NULL; + ctx->_faces = _csi_list_prepend (ctx->_faces, &data->blob.list); + data->ctx = cairo_script_interpreter_reference (ctx); + data->blob.hash = tmpl.hash; + data->blob.len = tmpl.len; +#ifdef HAVE_MMAP + data->blob.bytes = _mmap_bytes (vec, vec_count); + if (data->blob.bytes != MAP_FAILED) { + if (--source->base.ref == 0) + csi_string_free (ctx, source); + + if (source->deflate) { + _csi_free (ctx, bytes); + bytes = data->blob.bytes + vec[0].num_bytes; + } else + bytes = data->blob.bytes; + + data->source = NULL; + data->bytes = NULL; + } else { + data->blob.bytes = tmpl.bytes; + } +#else + data->blob.bytes = tmpl.bytes; +#endif + + err = FT_New_Memory_Face (_ft_lib, + bytes, len, + index, + &data->face); + if (_csi_unlikely (err != FT_Err_Ok)) { + _ft_done_face (data); + + if (err == FT_Err_Out_Of_Memory) + return _csi_error (CSI_STATUS_NO_MEMORY); + + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + font_face = cairo_ft_font_face_create_for_ft_face (data->face, load_flags); + status = cairo_font_face_set_user_data (font_face, + &_csi_blob_key, + data, _ft_done_face); + if (_csi_unlikely (status)) { + _ft_done_face (data); + cairo_font_face_destroy (font_face); + return status; + } + + data->font_face = font_face; + *font_face_out = font_face; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_ft_create_for_pattern (csi_t *ctx, + csi_string_t *string, + cairo_font_face_t **font_face_out) +{ +#if CAIRO_HAS_FC_FONT + csi_blob_t tmpl; + struct _ft_face_data *data; + csi_list_t *link; + cairo_font_face_t *font_face; + FcPattern *pattern, *resolved; + csi_status_t status; + struct mmap_vec vec; + void *bytes; + + _csi_blob_init (&tmpl, (uint8_t *) string->string, string->len); + _csi_blob_hash (&tmpl, (uint32_t *) string->string, string->len / sizeof (uint32_t)); + link = _csi_list_find (ctx->_faces, _csi_blob_equal, &tmpl); + if (link) { + if (--string->base.ref == 0) + csi_string_free (ctx, string); + data = csi_container_of (link, struct _ft_face_data, blob.list); + *font_face_out = cairo_font_face_reference (data->font_face); + return CSI_STATUS_SUCCESS; + } + + if (string->deflate) { + bytes = inflate_string (ctx, string); + if (_csi_unlikely (bytes == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else { + bytes = tmpl.bytes; + } + + pattern = FcNameParse (bytes); + if (!pattern) + { + /* Fontconfig's representation of charset changed mid 2014; + * We used to record charset before that. Remove everything + * after charset if that's present, and try again. */ + char *s = strstr ((char *) bytes, ":charset="); + if (s) + { + *s = '\0'; + pattern = FcNameParse (bytes); + } + } + if (bytes != tmpl.bytes) + _csi_free (ctx, bytes); + +retry: + resolved = pattern; + if (cairo_version () < CAIRO_VERSION_ENCODE (1, 9, 0)) { + /* prior to 1.9, you needed to pass a resolved pattern */ + resolved = FcFontMatch (NULL, pattern, NULL); + if (_csi_unlikely (resolved == NULL)) { + FcPatternDestroy (pattern); + return _csi_error (CSI_STATUS_NO_MEMORY); + } + } + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + if (resolved != pattern) + FcPatternDestroy (resolved); + + if (cairo_font_face_status (font_face)) { + char *filename = NULL; + + /* Try a manual fallback process by eliminating specific requests */ + + if (FcPatternGetString (pattern, + FC_FILE, 0, + (FcChar8 **) &filename) == FcResultMatch) { + FcPatternDel (pattern, FC_FILE); + goto retry; + } + } + + FcPatternDestroy (pattern); + + data = _csi_slab_alloc (ctx, sizeof (*data)); + ctx->_faces = _csi_list_prepend (ctx->_faces, &data->blob.list); + data->ctx = cairo_script_interpreter_reference (ctx); + data->blob.hash = tmpl.hash; + data->blob.len = tmpl.len; + data->bytes = NULL; + data->face = NULL; +#ifdef HAVE_MMAP + vec.bytes = tmpl.bytes; + vec.num_bytes = tmpl.len; + data->blob.bytes = _mmap_bytes (&vec, 1); + if (data->blob.bytes != MAP_FAILED) { + data->source = NULL; + if (--string->base.ref == 0) + csi_string_free (ctx, string); + } else { + data->blob.bytes = tmpl.bytes; + data->source = string; + } +#else + data->blob.bytes = tmpl.bytes; + data->source = string; +#endif + + status = cairo_font_face_set_user_data (font_face, + &_csi_blob_key, + data, _ft_done_face); + if (_csi_unlikely (status)) { + _ft_done_face (data); + cairo_font_face_destroy (font_face); + return status; + } + + data->font_face = font_face; + *font_face_out = font_face; + return CSI_STATUS_SUCCESS; +#else + if (--string->base.ref == 0) + csi_string_free (ctx, string); + return CSI_INT_STATUS_UNSUPPORTED; +#endif +} + +static csi_status_t +_ft_type42_create (csi_t *ctx, + csi_dictionary_t *font, + cairo_font_face_t **font_face_out) +{ + csi_object_t key; + csi_status_t status; + + /* two basic sub-types, either an FcPattern or embedded font */ + status = csi_name_new_static (ctx, &key, "pattern"); + if (_csi_unlikely (status)) + return status; + + if (csi_dictionary_has (font, key.datum.name)) { + csi_object_t obj; + int type; + + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + type = csi_object_get_type (&obj); + switch (type) { + case CSI_OBJECT_TYPE_FILE: + status = _csi_file_as_string (ctx, obj.datum.file, &obj); + if (_csi_unlikely (status)) + return status; + break; + case CSI_OBJECT_TYPE_STRING: + obj.datum.object->ref++; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return _ft_create_for_pattern (ctx, + obj.datum.string, + font_face_out); + } + + status = csi_name_new_static (ctx, &key, "source"); + if (_csi_unlikely (status)) + return status; + + if (csi_dictionary_has (font, key.datum.name)) { + csi_object_t obj; + long index, flags; + int type; + + index = 0; + status = _csi_dictionary_get_integer (ctx, font, "index", TRUE, &index); + if (_csi_unlikely (status)) + return status; + + flags = 0; + status = _csi_dictionary_get_integer (ctx, font, "flags", TRUE, &flags); + if (_csi_unlikely (status)) + return status; + + status = csi_name_new_static (ctx, &key, "source"); + if (_csi_unlikely (status)) + return status; + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + type = csi_object_get_type (&obj); + switch (type) { + case CSI_OBJECT_TYPE_FILE: + status = _csi_file_as_string (ctx, obj.datum.file, &obj); + if (_csi_unlikely (status)) + return status; + break; + case CSI_OBJECT_TYPE_STRING: + obj.datum.object->ref++; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return _ft_create_for_source (ctx, obj.datum.string, + index, flags, + font_face_out); + } + + return _csi_error (CSI_STATUS_INVALID_SCRIPT); +} +#else +#define _ft_type42_create(ctx, font, face_out) CSI_INT_STATUS_UNSUPPORTED +#endif + +static char * +_fc_strcpy (csi_t *ctx, const char *str) +{ + char *ret; + int len; + + ret = strchr (str, ':'); + if (ret != NULL) + len = ret - str; + else + len = strlen (str); + + ret = _csi_alloc (ctx, len+1); + if (_csi_unlikely (ret == NULL)) + return NULL; + + memcpy (ret, str, len); + ret[len] = '\0'; + + return ret; +} + +static cairo_font_face_t * +_select_font (const char *name) +{ + cairo_surface_t *surface; + cairo_font_face_t *face; + cairo_t *cr; + + /* create a dummy context to choose a font */ + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + cairo_select_font_face (cr, name, + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); + face = cairo_font_face_reference (cairo_get_font_face (cr)); + cairo_destroy (cr); + + return face; +} + +static csi_status_t +_ft_fallback_create_for_pattern (csi_t *ctx, + csi_string_t *string, + cairo_font_face_t **font_face_out) +{ + char *str, *name; + + str = string->string; +#if 0 + name = strstr (str, "fullname="); + if (name != NULL) + str = name + 9; +#endif + + name = _fc_strcpy (ctx, str); + if (_csi_unlikely (name == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + *font_face_out = _select_font (name); + _csi_free (ctx, name); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_ft_type42_fallback_create (csi_t *ctx, + csi_dictionary_t *font, + cairo_font_face_t **font_face_out) +{ + csi_object_t key; + csi_status_t status; + + /* attempt to select a similar font */ + + /* two basic sub-types, either an FcPattern or embedded font */ + status = csi_name_new_static (ctx, &key, "pattern"); + if (_csi_unlikely (status)) + return status; + + if (csi_dictionary_has (font, key.datum.name)) { + csi_object_t obj; + int type; + + status = csi_dictionary_get (ctx, font, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + type = csi_object_get_type (&obj); + switch (type) { + case CSI_OBJECT_TYPE_FILE: + status = _csi_file_as_string (ctx, obj.datum.file, &obj); + if (_csi_unlikely (status)) + return status; + break; + case CSI_OBJECT_TYPE_STRING: + obj.datum.object->ref++; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return _ft_fallback_create_for_pattern (ctx, + obj.datum.string, + font_face_out); + } + + /* XXX: enable the trace to run */ + *font_face_out = _select_font ("Sans"); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_font_type42 (csi_t *ctx, csi_dictionary_t *font, cairo_font_face_t **font_face) +{ + csi_status_t status; + + status = _ft_type42_create (ctx, font, font_face); + if (_csi_likely (status != CSI_INT_STATUS_UNSUPPORTED)) + return status; + + return _ft_type42_fallback_create (ctx, font, font_face); +} + +static csi_status_t +_font (csi_t *ctx) +{ + csi_dictionary_t *font; + csi_status_t status; + cairo_font_face_t *font_face = NULL; /* silence the compiler */ + csi_proxy_t *proxy; + csi_object_t obj; + long type; + + check (1); + + status = _csi_ostack_get_dictionary (ctx, 0, &font); + if (_csi_unlikely (status)) + return status; + + status = _csi_dictionary_get_integer (ctx, font, "type", FALSE, &type); + if (_csi_unlikely (status)) + return status; + + switch (type) { + case 3: + status = _font_type3 (ctx, font, &font_face); + break; + case 42: + status = _font_type42 (ctx, font, &font_face); + break; + default: + status = _csi_error (CSI_STATUS_INVALID_SCRIPT); + break; + } + + if (_csi_unlikely (status)) + return status; + + /* transfer ownership of dictionary to cairo_font_face_t */ + proxy = _csi_proxy_create (ctx, font_face, font, NULL, NULL); + if (_csi_unlikely (proxy == NULL)) { + cairo_font_face_destroy (font_face); + return _csi_error (CSI_STATUS_NO_MEMORY); + } + + status = cairo_font_face_set_user_data (font_face, + &_csi_proxy_key, + proxy, _csi_proxy_destroy); + if (_csi_unlikely (status)) { + _csi_proxy_destroy (proxy); + cairo_font_face_destroy (font_face); + return status; + } + + obj.type = CSI_OBJECT_TYPE_FONT; + obj.datum.font_face = font_face; + + pop (1); + status = push (&obj); + if (_csi_unlikely (status)) { + cairo_font_face_destroy (font_face); + return status; + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_for (csi_t *ctx) +{ + csi_array_t *proc; + csi_status_t status; + long i, inc, limit; + + check (4); + + status = _csi_ostack_get_procedure (ctx, 0, &proc); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 1, &limit); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 2, &inc); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 3, &i); + if (_csi_unlikely (status)) + return status; + + proc->base.ref++; + pop (4); + + for (; i <= limit; i += inc) { + status = _csi_push_ostack_integer (ctx, i); + if (_csi_unlikely (status)) + break; + + status = _csi_array_execute (ctx, proc); + if (_csi_unlikely (status)) + break; + } + + if (--proc->base.ref == 0) + csi_array_free (ctx, proc); + return status; +} + +static csi_status_t +_ge (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *a, *b; + int cmp; + + check (2); + + b = _csi_peek_ostack (ctx, 0); + a = _csi_peek_ostack (ctx, 1); + + status = csi_object_compare (a, b, &cmp); + if (_csi_unlikely (status)) + return status; + + pop (2); + return _csi_push_ostack_boolean (ctx, cmp >= 0); +} + +static csi_status_t +_proxy_get (csi_proxy_t *proxy, + csi_name_t key) +{ + csi_object_t obj; + csi_status_t status; + + if (_csi_unlikely (proxy == NULL || proxy->dictionary == NULL)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = csi_dictionary_get (proxy->ctx, proxy->dictionary, key, &obj); + if (_csi_unlikely (status)) + return status; + + return _csi_push_ostack_copy (proxy->ctx, &obj); +} + +static csi_status_t +_context_get (csi_t *ctx, + cairo_t *cr, + csi_name_t key) +{ + csi_status_t status; + csi_object_t obj; + + if (strcmp ((char *) key, "current-point") == 0) { + double x, y; + + cairo_get_current_point (cr, &x, &y); + + status = _csi_push_ostack_real (ctx, x); + if (_csi_unlikely (status)) + return status; + status = _csi_push_ostack_real (ctx, y); + if (_csi_unlikely (status)) + return status; + + return CSI_STATUS_SUCCESS; + } else if (strcmp ((char *) key, "source") == 0) { + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_reference (cairo_get_source (cr)); + } else if (strcmp ((char *) key, "target") == 0) { + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_surface_reference (cairo_get_target (cr)); + } else if (strcmp ((char *) key, "group-target") == 0) { + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_surface_reference (cairo_get_group_target (cr)); + } else if (strcmp ((char *) key, "scaled-font") == 0) { + obj.type = CSI_OBJECT_TYPE_SCALED_FONT; + obj.datum.scaled_font = cairo_scaled_font_reference (cairo_get_scaled_font (cr)); + } else if (strcmp ((char *) key, "font-face") == 0) { + obj.type = CSI_OBJECT_TYPE_FONT; + obj.datum.font_face = cairo_font_face_reference (cairo_get_font_face (cr)); + } else + return _proxy_get (cairo_get_user_data (cr, &_csi_proxy_key), key); + + return push (&obj); +} + +static csi_status_t +_font_get (csi_t *ctx, + cairo_font_face_t *font_face, + csi_name_t key) +{ + return _proxy_get (cairo_font_face_get_user_data (font_face, + &_csi_proxy_key), + key); +} + +static csi_status_t +_pattern_get (csi_t *ctx, + cairo_pattern_t *pattern, + csi_name_t key) +{ + csi_status_t status; + + if (strcmp ((char *) key, "type") == 0) + return _csi_push_ostack_integer (ctx, cairo_pattern_get_type (pattern)); + + if (strcmp ((char *) key, "filter") == 0) + return _csi_push_ostack_integer (ctx, cairo_pattern_get_filter (pattern)); + + if (strcmp ((char *) key, "extend") == 0) + return _csi_push_ostack_integer (ctx, cairo_pattern_get_extend (pattern)); + + if (strcmp ((char *) key, "matrix") == 0) { + csi_object_t obj; + cairo_matrix_t m; + + cairo_pattern_get_matrix (pattern, &m); + status = csi_matrix_new_from_matrix (ctx, &obj, &m); + if (_csi_unlikely (status)) + return status; + + return push (&obj); + } + + return _proxy_get (cairo_pattern_get_user_data (pattern, &_csi_proxy_key), + key); +} + +static csi_status_t +_scaled_font_get (csi_t *ctx, + cairo_scaled_font_t *font, + csi_name_t key) +{ + return _proxy_get (cairo_scaled_font_get_user_data (font, &_csi_proxy_key), + key); +} + +static csi_status_t +_surface_get (csi_t *ctx, + cairo_surface_t *surface, + csi_name_t key) +{ + if (strcmp ((char *) key, "type") == 0) { + return _csi_push_ostack_integer (ctx, cairo_surface_get_type (surface)); + } + + if (strcmp ((char *) key, "content") == 0) { + return _csi_push_ostack_integer (ctx, + cairo_surface_get_content (surface)); + } + + return _proxy_get (cairo_surface_get_user_data (surface, &_csi_proxy_key), + key); +} + +static csi_status_t +_get (csi_t *ctx) +{ + csi_object_t *key, *src, obj; + csi_status_t status; + int type; + + check (2); + + key = _csi_peek_ostack (ctx, 0); + src = _csi_peek_ostack (ctx, 1); + pop (1); + type = csi_object_get_type (src); + switch (type) { + case CSI_OBJECT_TYPE_DICTIONARY: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = csi_dictionary_get (ctx, + src->datum.dictionary, + key->datum.name, + &obj); + break; + case CSI_OBJECT_TYPE_ARRAY: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_INTEGER)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = csi_array_get (ctx, + src->datum.array, + key->datum.integer, + &obj); + break; +#if 0 + case CSI_OBJECT_TYPE_STRING: + status = csi_string_get (src, key, &obj); + break; +#endif + + case CSI_OBJECT_TYPE_CONTEXT: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + return _context_get (ctx, src->datum.cr, key->datum.name); + + case CSI_OBJECT_TYPE_FONT: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + return _font_get (ctx, src->datum.font_face, key->datum.name); + + case CSI_OBJECT_TYPE_PATTERN: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + return _pattern_get (ctx, src->datum.pattern, key->datum.name); + + case CSI_OBJECT_TYPE_SCALED_FONT: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + return _scaled_font_get (ctx, src->datum.scaled_font, key->datum.name); + + case CSI_OBJECT_TYPE_SURFACE: + if (_csi_unlikely (csi_object_get_type (key) != CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + return _surface_get (ctx, src->datum.surface, key->datum.name); + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + if (_csi_unlikely (status)) + return status; + + return _csi_push_ostack_copy (ctx, &obj); +} + +struct glyph_advance_cache { + csi_t *ctx; + double glyph_advance[256][2]; + unsigned long have_glyph_advance[256]; +}; + +static void +glyph_advance_cache_destroy (void *closure) +{ + struct glyph_advance_cache *cache = closure; + _csi_free (cache->ctx, cache); +} + +static int +_glyph_string (csi_t *ctx, + csi_array_t *array, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs) +{ + struct glyph_advance_cache uncached; + struct glyph_advance_cache *cache; + csi_integer_t nglyphs, i, j; + double x, y, dx; + cairo_status_t status; + + if (cairo_scaled_font_status (scaled_font)) + return 0; + + cache = cairo_scaled_font_get_user_data (scaled_font, + (cairo_user_data_key_t *) ctx); + if (cache == NULL) { + cache = _csi_alloc (ctx, sizeof (*cache)); + if (_csi_likely (cache != NULL)) { + cache->ctx = ctx; + memset (cache->have_glyph_advance, 0xff, + sizeof (cache->have_glyph_advance)); + + status = cairo_scaled_font_set_user_data (scaled_font, + (cairo_user_data_key_t *) ctx, + cache, + glyph_advance_cache_destroy); + if (_csi_unlikely (status)) { + _csi_free (ctx, cache); + cache = NULL; + } + } + } + + if (_csi_unlikely (cache == NULL)) { + cache = &uncached; + + cache->ctx = ctx; + memset (cache->have_glyph_advance, 0xff, + sizeof (cache->have_glyph_advance)); + } + + nglyphs = 0; + x = y = 0; + for (i = 0; i < array->stack.len; i++) { + const csi_object_t *obj = &array->stack.objects[i]; + int type = csi_object_get_type (obj); + + switch (type) { + case CSI_OBJECT_TYPE_ARRAY: { + const csi_array_t *glyph_array = obj->datum.array; + for (j = 0; j < glyph_array->stack.len; j++) { + unsigned long g; + int gi; + + obj = &glyph_array->stack.objects[j]; + if (csi_object_get_type (obj) != CSI_OBJECT_TYPE_INTEGER) + break; + g = obj->datum.integer; + + glyphs[nglyphs].index = g; + glyphs[nglyphs].x = x; + glyphs[nglyphs].y = y; + + gi = g % ARRAY_LENGTH (cache->have_glyph_advance); + if (cache->have_glyph_advance[gi] != g) { + cairo_text_extents_t extents; + + cairo_scaled_font_glyph_extents (scaled_font, + &glyphs[nglyphs], 1, + &extents); + + cache->glyph_advance[gi][0] = extents.x_advance; + cache->glyph_advance[gi][1] = extents.y_advance; + cache->have_glyph_advance[gi] = g; + } + + x += cache->glyph_advance[gi][0]; + y += cache->glyph_advance[gi][1]; + nglyphs++; + } + break; + } + + case CSI_OBJECT_TYPE_STRING: { + const csi_string_t *glyph_string = obj->datum.string; + for (j = 0; j < glyph_string->len; j++) { + uint8_t g; + + g = glyph_string->string[j]; + glyphs[nglyphs].index = g; + glyphs[nglyphs].x = x; + glyphs[nglyphs].y = y; + + if (cache->have_glyph_advance[g] != g) { + cairo_text_extents_t extents; + + cairo_scaled_font_glyph_extents (scaled_font, + &glyphs[nglyphs], 1, + &extents); + + cache->glyph_advance[g][0] = extents.x_advance; + cache->glyph_advance[g][1] = extents.y_advance; + cache->have_glyph_advance[g] = g; + } + + x += cache->glyph_advance[g][0]; + y += cache->glyph_advance[g][1]; + nglyphs++; + } + break; + } + + case CSI_OBJECT_TYPE_INTEGER: + case CSI_OBJECT_TYPE_REAL: /* dx or x*/ + dx = csi_number_get_value (obj); + if (i+1 == array->stack.len) + break; + + type = csi_object_get_type (&array->stack.objects[i+1]); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + case CSI_OBJECT_TYPE_REAL: /* y */ + y = csi_number_get_value (&array->stack.objects[i+1]); + x = dx; + i++; + break; + + default: + x += dx; + } + } + } + + return nglyphs; +} + +static csi_status_t +_glyph_path (csi_t *ctx) +{ + csi_array_t *array; + csi_status_t status; + cairo_t *cr; + cairo_glyph_t stack_glyphs[256], *glyphs; + csi_integer_t nglyphs, i; + + check (2); + + status = _csi_ostack_get_array (ctx, 0, &array); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + /* count glyphs */ + nglyphs = 0; + for (i = 0; i < array->stack.len; i++) { + csi_object_t *obj = &array->stack.objects[i]; + int type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_ARRAY: + nglyphs += obj->datum.array->stack.len; + break; + case CSI_OBJECT_TYPE_STRING: + nglyphs += obj->datum.string->len; + break; + } + } + if (nglyphs == 0) { + pop (1); + return CSI_STATUS_SUCCESS; + } + + if (nglyphs > ARRAY_LENGTH (stack_glyphs)) { + if (_csi_unlikely ((unsigned) nglyphs >= INT_MAX / sizeof (cairo_glyph_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + + glyphs = _csi_alloc (ctx, sizeof (cairo_glyph_t) * nglyphs); + if (_csi_unlikely (glyphs == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else + glyphs = stack_glyphs; + + nglyphs = _glyph_string (ctx, array, cairo_get_scaled_font (cr), glyphs); + cairo_glyph_path (cr, glyphs, nglyphs); + + if (glyphs != stack_glyphs) + _csi_free (ctx, glyphs); + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_gray (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + double g; + + check (1); + + status = _csi_ostack_get_number (ctx, 0, &g); + if (_csi_unlikely (status)) + return status; + + pop (1); + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_rgba (g, g, g, 1); + return push (&obj); +} + +static csi_status_t +_gt (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *a, *b; + int cmp; + + check (2); + + b = _csi_peek_ostack (ctx, 0); + a = _csi_peek_ostack (ctx, 1); + + status = csi_object_compare (a, b, &cmp); + if (_csi_unlikely (status)) + return status; + + pop (2); + return _csi_push_ostack_boolean (ctx, cmp > 0); +} + +static csi_status_t +_identity (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + + status = csi_matrix_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + + return push (&obj); +} + +static csi_status_t +_if (csi_t *ctx) +{ + csi_array_t *proc; + csi_boolean_t predicate = FALSE; /* silence the compiler */ + csi_status_t status; + + check (2); + + status = _csi_ostack_get_procedure (ctx, 0, &proc); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_boolean (ctx, 1, &predicate); + if (_csi_unlikely (status)) + return status; + + proc->base.ref++; + pop (2); + + if (predicate) + status = _csi_array_execute (ctx, proc); + + if (--proc->base.ref == 0) + csi_array_free (ctx, proc); + + return status; +} + +static csi_status_t +_ifelse (csi_t *ctx) +{ + csi_array_t *true_proc, *false_proc; + csi_boolean_t predicate = FALSE; /* silence the compiler */ + csi_status_t status; + + check (3); + + status = _csi_ostack_get_procedure (ctx, 0, &false_proc); + if (_csi_unlikely (status)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = _csi_ostack_get_procedure (ctx, 1, &true_proc); + if (_csi_unlikely (status)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = _csi_ostack_get_boolean (ctx, 2, &predicate); + if (_csi_unlikely (status)) + return status; + + true_proc->base.ref++; + false_proc->base.ref++; + pop (3); + + if (predicate) + status = _csi_array_execute (ctx, true_proc); + else + status = _csi_array_execute (ctx, false_proc); + + if (--true_proc->base.ref == 0) + csi_array_free (ctx, true_proc); + if (--false_proc->base.ref == 0) + csi_array_free (ctx, false_proc); + + return status; +} + +static csi_status_t +_image_read_raw (csi_t *ctx, + csi_object_t *src, + cairo_format_t format, + int width, int height, + cairo_surface_t **image_out) +{ + cairo_surface_t *image; + uint8_t *bp, *data; + int rem, len, ret, x, rowlen, instride, stride; + cairo_status_t status; + + if (width == 0 || height == 0) { + *image_out = cairo_image_surface_create (format, 0, 0); + return CSI_STATUS_SUCCESS; + } + + if (ctx->hooks.create_source_image != NULL) { + image = ctx->hooks.create_source_image (ctx->hooks.closure, + format, width, height, + 0); + + stride = cairo_image_surface_get_stride (image); + data = cairo_image_surface_get_data (image); + } else { + stride = cairo_format_stride_for_width (format, width); + data = malloc (stride * height); + if (data == NULL) + return CAIRO_STATUS_NO_MEMORY; + + image = cairo_image_surface_create_for_data (data, format, + width, height, stride); + status = cairo_surface_set_user_data (image, + (const cairo_user_data_key_t *) image, + data, free); + if (status) { + cairo_surface_destroy (image); + free (image); + return status; + } + } + + switch (format) { + case CAIRO_FORMAT_A1: + instride = rowlen = (width+7)/8; + break; + case CAIRO_FORMAT_A8: + instride = rowlen = width; + break; + case CAIRO_FORMAT_RGB16_565: + instride = rowlen = 2 * width; + break; + case CAIRO_FORMAT_RGB24: + rowlen = 3 * width; + instride = 4 *width; + break; + default: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_ARGB32: + instride = rowlen = 4 * width; + break; + } + len = rowlen * height; + + if (rowlen == instride && + src->type == CSI_OBJECT_TYPE_STRING && + len == src->datum.string->deflate) + { + csi_string_t *s = src->datum.string; + unsigned long out = s->deflate; + + switch (s->method) { + default: + case NONE: +err_decompress: + cairo_surface_destroy (image); + return _csi_error (CSI_STATUS_READ_ERROR); + + case ZLIB: +#if HAVE_ZLIB + if (uncompress ((Bytef *) data, &out, + (Bytef *) s->string, s->len) != Z_OK) +#endif + goto err_decompress; + break; + + case LZO: +#if HAVE_LZO + if (lzo2a_decompress ((Bytef *) s->string, s->len, + (Bytef *) data, &out, + NULL)) +#endif + goto err_decompress; + break; + } + } + else + { + csi_object_t file; + + status = csi_object_as_file (ctx, src, &file); + if (_csi_unlikely (status)) { + cairo_surface_destroy (image); + return status; + } + + bp = data; + rem = len; + while (rem) { + ret = csi_file_read (file.datum.file, bp, rem); + if (_csi_unlikely (ret == 0)) { + cairo_surface_destroy (image); + return _csi_error (CSI_STATUS_READ_ERROR); + } + rem -= ret; + bp += ret; + } + + if (len != height * stride) { + while (--height) { + uint8_t *row = data + height * stride; + + /* XXX pixel conversion */ + switch (format) { + case CAIRO_FORMAT_A1: + for (x = rowlen; x--; ) { + uint8_t byte = *--bp; + row[x] = CSI_BITSWAP8_IF_LITTLE_ENDIAN (byte); + } + break; + case CAIRO_FORMAT_A8: + for (x = width; x--; ) + row[x] = *--bp; + break; + case CAIRO_FORMAT_RGB16_565: + for (x = width; x--; ) { +#ifdef WORDS_BIGENDIAN + row[2*x + 1] = *--bp; + row[2*x + 0] = *--bp; +#else + row[2*x + 0] = *--bp; + row[2*x + 1] = *--bp; +#endif + } + break; + case CAIRO_FORMAT_RGB24: + for (x = width; x--; ) { +#ifdef WORDS_BIGENDIAN + row[4*x + 3] = *--bp; + row[4*x + 2] = *--bp; + row[4*x + 1] = *--bp; + row[4*x + 0] = 0xff; +#else + row[4*x + 0] = *--bp; + row[4*x + 1] = *--bp; + row[4*x + 2] = *--bp; + row[4*x + 3] = 0xff; +#endif + } + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_ARGB32: + /* stride == width */ + break; + } + + memset (row + instride, 0, stride - instride); + } + + /* need to treat last row carefully */ + switch (format) { + case CAIRO_FORMAT_A1: + for (x = rowlen; x--; ) { + uint8_t byte = *--bp; + data[x] = CSI_BITSWAP8_IF_LITTLE_ENDIAN (byte); + } + break; + case CAIRO_FORMAT_A8: + for (x = width; x--; ) + data[x] = *--bp; + break; + case CAIRO_FORMAT_RGB16_565: + for (x = width; x--; ) { +#ifdef WORDS_BIGENDIAN + data[2*x + 1] = *--bp; + data[2*x + 0] = *--bp; +#else + data[2*x + 0] = *--bp; + data[2*x + 1] = *--bp; +#endif + } + break; + case CAIRO_FORMAT_RGB24: + for (x = width; --x>1; ) { +#ifdef WORDS_BIGENDIAN + data[4*x + 3] = *--bp; + data[4*x + 2] = *--bp; + data[4*x + 1] = *--bp; + data[4*x + 0] = 0xff; +#else + data[4*x + 0] = *--bp; + data[4*x + 1] = *--bp; + data[4*x + 2] = *--bp; + data[4*x + 3] = 0xff; +#endif + } + if (width > 1) { + uint8_t rgb[2][3]; + /* shuffle the last couple of overlapping pixels */ + rgb[1][0] = data[5]; + rgb[1][1] = data[4]; + rgb[1][2] = data[3]; + rgb[0][0] = data[2]; + rgb[0][1] = data[1]; + rgb[0][2] = data[0]; +#ifdef WORDS_BIGENDIAN + data[4] = 0xff; + data[5] = rgb[1][2]; + data[6] = rgb[1][1]; + data[7] = rgb[1][0]; + data[0] = 0xff; + data[1] = rgb[0][2]; + data[2] = rgb[0][1]; + data[3] = rgb[0][0]; +#else + data[7] = 0xff; + data[6] = rgb[1][2]; + data[5] = rgb[1][1]; + data[4] = rgb[1][0]; + data[3] = 0xff; + data[2] = rgb[0][2]; + data[1] = rgb[0][1]; + data[0] = rgb[0][0]; +#endif + } else { +#ifdef WORDS_BIGENDIAN + data[0] = 0xff; + data[1] = data[0]; + data[2] = data[1]; + data[3] = data[2]; +#else + data[3] = data[0]; + data[0] = data[2]; + data[2] = data[3]; + data[3] = 0xff; +#endif + } + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_ARGB32: + /* stride == width */ + break; + } + memset (data + instride, 0, stride - instride); + } else { +#ifndef WORDS_BIGENDIAN + switch (format) { + case CAIRO_FORMAT_A1: + for (x = 0; x < len; x++) { + uint8_t byte = data[x]; + data[x] = CSI_BITSWAP8_IF_LITTLE_ENDIAN (byte); + } + break; + case CAIRO_FORMAT_RGB16_565: + { + uint32_t *rgba = (uint32_t *) data; + for (x = len/2; x--; rgba++) { + *rgba = bswap_16 (*rgba); + } + } + break; + case CAIRO_FORMAT_ARGB32: + { + uint32_t *rgba = (uint32_t *) data; + for (x = len/4; x--; rgba++) { + *rgba = bswap_32 (*rgba); + } + } + break; + + case CAIRO_FORMAT_A8: + break; + + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_INVALID: + default: + break; + } +#endif + } + csi_object_free (ctx, &file); + } + + cairo_surface_mark_dirty (image); + *image_out = image; + return CSI_STATUS_SUCCESS; +} + +static cairo_status_t +png_read_func (void *closure, uint8_t *data, unsigned int len) +{ + int ret; + + ret = csi_file_read (closure, data, len); + if ((unsigned int) ret != len) + return CAIRO_STATUS_READ_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +static csi_status_t +_image_read_png (csi_file_t *src, cairo_surface_t **out) +{ +#if CAIRO_HAS_PNG_FUNCTIONS + *out = cairo_image_surface_create_from_png_stream (png_read_func, src); + return cairo_surface_status (*out); +#else + return CAIRO_STATUS_READ_ERROR; +#endif +} + +struct _image_tag { + csi_t *ctx; + csi_blob_t blob; + cairo_surface_t *surface; +}; + +static void +_image_tag_done (void *closure) +{ + struct _image_tag *tag = closure; + csi_t *ctx = tag->ctx; + + ctx->_images = _csi_list_unlink (ctx->_images, &tag->blob.list); + _csi_slab_free (ctx, tag, sizeof (*tag)); + cairo_script_interpreter_destroy (ctx); +} + +static void +_image_hash (csi_blob_t *blob, + cairo_surface_t *surface) +{ + uint32_t value; + + value = cairo_image_surface_get_width (surface); + _csi_blob_hash (blob, &value, 1); + + value = cairo_image_surface_get_height (surface); + _csi_blob_hash (blob, &value, 1); + + value = cairo_image_surface_get_format (surface); + _csi_blob_hash (blob, &value, 1); +} + +static cairo_surface_t * +_image_cached (csi_t *ctx, cairo_surface_t *surface) +{ + csi_blob_t tmpl; + csi_list_t *link; + uint8_t *data; + int stride, height; + struct _image_tag *tag; + + /* check for an existing image */ + + data = cairo_image_surface_get_data (surface); + stride = cairo_image_surface_get_stride (surface); + height = cairo_image_surface_get_height (surface); + _csi_blob_init (&tmpl, data, stride * height); + _image_hash (&tmpl, surface); + link = _csi_list_find (ctx->_images, _csi_blob_equal, &tmpl); + if (link) { + cairo_surface_destroy (surface); + tag = csi_container_of (link, struct _image_tag, blob.list); + return cairo_surface_reference (tag->surface); + } + + /* none found, insert a tag for this one */ + + tag = _csi_slab_alloc (ctx, sizeof (struct _image_tag)); + if (tag == NULL) + return surface; + + ctx->_images = _csi_list_prepend (ctx->_images, &tag->blob.list); + tag->ctx = cairo_script_interpreter_reference (ctx); + tag->blob.hash = tmpl.hash; + tag->blob.bytes = tmpl.bytes; + tag->blob.len = tmpl.len; + tag->surface = surface; + + if (cairo_surface_set_user_data (surface, &_csi_blob_key, + tag, _image_tag_done)) + { + _image_tag_done (tag); + } + + return surface; +} + +static csi_status_t +_image_load_from_dictionary (csi_t *ctx, + csi_dictionary_t *dict, + cairo_surface_t **image_out) +{ + csi_object_t obj, key; + long width; + long height; + long format; + cairo_surface_t *image = NULL; /* silence the compiler */ + csi_status_t status; + + /* check for "status? */ + + status = _csi_dictionary_get_integer (ctx, dict, "width", FALSE, &width); + if (_csi_unlikely (status)) + return status; + status = _csi_dictionary_get_integer (ctx, dict, "height", FALSE, &height); + if (_csi_unlikely (status)) + return status; + + format = CAIRO_FORMAT_ARGB32; + status = _csi_dictionary_get_integer (ctx, dict, "format", TRUE, &format); + if (_csi_unlikely (status)) + return status; + + status = csi_name_new_static (ctx, &key, "source"); + if (_csi_unlikely (status)) + return status; + + if (csi_dictionary_has (dict, key.datum.name)) { + enum mime_type mime_type; + csi_object_t file; + + status = csi_dictionary_get (ctx, dict, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + status = csi_name_new_static (ctx, &key, "mime-type"); + if (_csi_unlikely (status)) + return status; + + mime_type = MIME_TYPE_NONE; + if (csi_dictionary_has (dict, key.datum.name)) { + csi_object_t type_obj; + const char *type_str; + int type; + + status = csi_dictionary_get (ctx, dict, key.datum.name, &type_obj); + if (_csi_unlikely (status)) + return status; + + type = csi_object_get_type (&type_obj); + switch (type) { + case CSI_OBJECT_TYPE_STRING: + type_str = type_obj.datum.string->string; + break; + case CSI_OBJECT_TYPE_NAME: + type_str = (char *) type_obj.datum.name; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + if (strcmp (type_str, CAIRO_MIME_TYPE_PNG) == 0) + mime_type = MIME_TYPE_PNG; + } + + + /* XXX hook for general mime-type decoder */ + + switch (mime_type) { + case MIME_TYPE_NONE: + status = _image_read_raw (ctx, &obj, format, width, height, &image); + break; + case MIME_TYPE_PNG: + status = csi_object_as_file (ctx, &obj, &file); + if (_csi_unlikely (status)) + return status; + + status = _image_read_png (file.datum.file, &image); + csi_object_free (ctx, &file); + break; + } + if (_csi_unlikely (status)) + return status; + + image = _image_cached (ctx, image); + } else + image = cairo_image_surface_create (format, width, height); + + *image_out = image; + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_image (csi_t *ctx) +{ + csi_dictionary_t *dict; + cairo_surface_t *image; + csi_status_t status; + csi_object_t obj; + + check (1); + + status = _csi_ostack_get_dictionary (ctx, 0, &dict); + if (_csi_unlikely (status)) + return status; + + status = _image_load_from_dictionary (ctx, dict, &image); + if (_csi_unlikely (status)) + return status; + + pop (1); + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = image; + return push (&obj); +} + +static csi_status_t +_index (csi_t *ctx) +{ + csi_status_t status; + long n; + + check (1); + + status = _csi_ostack_get_integer (ctx, 0, &n); + if (_csi_unlikely (status)) + return status; + + pop (1); + + check (n); + return _csi_push_ostack_copy (ctx, _csi_peek_ostack (ctx, n)); +} + +static csi_status_t +_integer (csi_t *ctx) +{ + csi_object_t *obj; + int type; + + check (1); + + obj = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + break; + case CSI_OBJECT_TYPE_REAL: + obj->datum.integer = obj->datum.real; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + obj->type = CSI_OBJECT_TYPE_INTEGER; + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_invert (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + cairo_matrix_t m; + + check (1); + + status = _csi_ostack_get_matrix (ctx, 0, &m); + if (_csi_unlikely (status)) + return status; + + cairo_matrix_invert (&m); + + status = csi_matrix_new_from_matrix (ctx, &obj, &m); + if (_csi_unlikely (status)) + return status; + + pop (1); + + return push (&obj); +} + +static csi_status_t +_le (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *a, *b; + int cmp; + + check (2); + + b = _csi_peek_ostack (ctx, 0); + a = _csi_peek_ostack (ctx, 1); + + status = csi_object_compare (a, b, &cmp); + if (_csi_unlikely (status)) + return status; + + pop (2); + return _csi_push_ostack_boolean (ctx, cmp <= 0); +} + +static csi_status_t +_linear (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + double x1, y1, x2, y2; + + check (4); + + status = _csi_ostack_get_number (ctx, 0, &y2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &y1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &x1); + if (_csi_unlikely (status)) + return status; + + pop (4); + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_linear (x1, y1, x2, y2); + return push (&obj); +} + +static csi_status_t +_line_to (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *obj; + int type; + double x, y; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + + /* XXX path object */ + + obj = _csi_peek_ostack (ctx, 2); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_line_to (obj->datum.cr, x, y); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_mesh_pattern_line_to (obj->datum.pattern, x, y); + break; + } + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_lt (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *a, *b; + int cmp; + + check (2); + + b = _csi_peek_ostack (ctx, 0); + a = _csi_peek_ostack (ctx, 1); + + status = csi_object_compare (a, b, &cmp); + if (_csi_unlikely (status)) + return status; + + pop (2); + return _csi_push_ostack_boolean (ctx, cmp < 0); +} + +static csi_status_t +_mark (csi_t *ctx) +{ + return _csi_push_ostack_mark (ctx); +} + +static csi_status_t +_ne (csi_t *ctx) +{ + csi_object_t *a, *b; + csi_boolean_t v; + + check (2); + + b = _csi_peek_ostack (ctx, 0); + a = _csi_peek_ostack (ctx, 1); + + v = ! csi_object_eq (a, b); + + pop (2); + return _csi_push_ostack_boolean (ctx, v); +} + +static csi_status_t +_neg (csi_t *ctx) +{ + csi_object_t *obj; + int type; + + check (1); + + obj = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + obj->datum.integer = -obj->datum.integer; + break; + case CSI_OBJECT_TYPE_REAL: + obj->datum.real = -obj->datum.real; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_not (csi_t *ctx) +{ + csi_object_t *obj; + int type; + + check (1); + + obj = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + obj->datum.boolean = ! obj->datum.boolean; + break; + case CSI_OBJECT_TYPE_INTEGER: + obj->type = CSI_OBJECT_TYPE_BOOLEAN; + obj->datum.boolean = ! obj->datum.integer; + break; + case CSI_OBJECT_TYPE_REAL: + obj->type = CSI_OBJECT_TYPE_BOOLEAN; + obj->datum.boolean = obj->datum.real == 0.0; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_new_path (csi_t *ctx) +{ + /* XXX handle path object */ + return _do_cairo_op (ctx, cairo_new_path); +} + +static csi_status_t +_new_sub_path (csi_t *ctx) +{ + /* XXX handle path object */ + return _do_cairo_op (ctx, cairo_new_sub_path); +} + +static csi_status_t +_null (csi_t *ctx) +{ + return _csi_push_ostack_null (ctx); +} + +static csi_status_t +_mask (csi_t *ctx) +{ + cairo_t *cr; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + csi_status_t status; + + check (2); + + status = _csi_ostack_get_pattern (ctx, 0, &pattern); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_mask (cr, pattern); + pop (1); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_matrix (csi_t *ctx) +{ + csi_object_t *obj, matrix; + double v[6]; + csi_status_t status; + int n; + + check (1); + + obj = _csi_peek_ostack (ctx, 0); + if (csi_object_is_number (obj)) { + check (6); + + for (n = 6; n--; ) { + status = _csi_ostack_get_number (ctx, 5-n, &v[n]); + if (_csi_unlikely (status)) + return status; + } + status = csi_matrix_new_from_values (ctx, &matrix, v); + if (_csi_unlikely (status)) + return status; + + pop (6); + } else { + csi_array_t *array; + + status = _csi_ostack_get_array (ctx, 0, &array); + if (_csi_unlikely (status)) + return status; + + status = csi_matrix_new_from_array (ctx, &matrix, array); + if (_csi_unlikely (status)) + return status; + + pop (1); + } + + return push (&matrix); +} + +static csi_status_t +_map_to_image (csi_t *ctx) +{ + csi_object_t obj; + csi_array_t *array; + csi_status_t status; + cairo_rectangle_int_t extents, *r; + cairo_surface_t *surface; + + check (2); + + status = _csi_ostack_get_array (ctx, 0, &array); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_surface (ctx, 1, &surface); + if (_csi_unlikely (status)) + return status; + + switch (array->stack.len) { + case 0: + r = NULL; + break; + case 4: + extents.x = floor (_csi_object_as_real (&array->stack.objects[0])); + extents.y = floor (_csi_object_as_real (&array->stack.objects[1])); + extents.width = ceil (_csi_object_as_real (&array->stack.objects[2])); + extents.height = ceil (_csi_object_as_real (&array->stack.objects[3])); + r = &extents; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_surface_reference (cairo_surface_map_to_image (surface, r)); + pop (1); + return push (&obj); +} + +static csi_status_t +_unmap_image (csi_t *ctx) +{ + cairo_surface_t *surface, *image; + csi_status_t status; + + check (2); + + status = _csi_ostack_get_surface (ctx, 0, &image); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 1, &surface); + if (_csi_unlikely (status)) + return status; + + cairo_surface_unmap_image (surface, image); + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_mesh (csi_t *ctx) +{ + csi_object_t obj; + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_mesh (); + return push (&obj); +} + +static csi_status_t +_mesh_begin_patch (csi_t *ctx) +{ + csi_status_t status; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + + check (1); + + status = _csi_ostack_get_pattern (ctx, 0, &pattern); + if (_csi_unlikely (status)) + return status; + + cairo_mesh_pattern_begin_patch (pattern); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_mesh_end_patch (csi_t *ctx) +{ + csi_status_t status; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + + check (1); + + status = _csi_ostack_get_pattern (ctx, 0, &pattern); + if (_csi_unlikely (status)) + return status; + + cairo_mesh_pattern_end_patch (pattern); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_mesh_set_control_point (csi_t *ctx) +{ + csi_status_t status; + double x, y; + csi_integer_t point; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + + check (4); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 2, &point); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_pattern (ctx, 3, &pattern); + if (_csi_unlikely (status)) + return status; + + cairo_mesh_pattern_set_control_point (pattern, point, x, y); + + pop (3); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_mesh_set_corner_color (csi_t *ctx) +{ + csi_status_t status; + double r, g, b, a; + csi_integer_t corner; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + + check (6); + + status = _csi_ostack_get_number (ctx, 0, &a); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &b); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &g); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &r); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 4, &corner); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_pattern (ctx, 5, &pattern); + if (_csi_unlikely (status)) + return status; + + cairo_mesh_pattern_set_corner_color_rgba (pattern, corner, r, g, b, a); + + pop (5); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_mod (csi_t *ctx) +{ + csi_integer_t x, y; + csi_status_t status; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + + pop (2); + return _csi_push_ostack_integer (ctx, x % y); +} + +static csi_status_t +_move_to (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *obj; + int type; + double x, y; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 2); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_move_to (obj->datum.cr, x, y); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_mesh_pattern_move_to (obj->datum.pattern, x, y); + break; + + /* XXX path object */ + } + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_mul (csi_t *ctx) +{ + csi_object_t *A; + csi_object_t *B; + csi_object_type_t type_a, type_b; + + check (2); + + B = _csi_peek_ostack (ctx, 0); + A = _csi_peek_ostack (ctx, 1); + + type_a = csi_object_get_type (A); + if (_csi_unlikely (! (type_a == CSI_OBJECT_TYPE_INTEGER || + type_a == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + type_b = csi_object_get_type (B); + if (_csi_unlikely (! (type_b == CSI_OBJECT_TYPE_INTEGER || + type_b == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + + if (type_a == CSI_OBJECT_TYPE_REAL && + type_b == CSI_OBJECT_TYPE_REAL) + { + return _csi_push_ostack_real (ctx, A->datum.real * B->datum.real); + + } + else if (type_a == CSI_OBJECT_TYPE_INTEGER && + type_b == CSI_OBJECT_TYPE_INTEGER) + { + return _csi_push_ostack_integer (ctx, + A->datum.integer * B->datum.integer); + } + else + { + double v; + + if (type_a == CSI_OBJECT_TYPE_REAL) + v = A->datum.real; + else + v = A->datum.integer; + + if (type_b == CSI_OBJECT_TYPE_REAL) + v *= B->datum.real; + else + v *= B->datum.integer; + + return _csi_push_ostack_real (ctx, v); + } +} + +static csi_status_t +_or (csi_t *ctx) +{ + csi_object_t *a, *b; + int type; + + check (2); + + a = _csi_peek_ostack (ctx, 0); + b = _csi_peek_ostack (ctx, 1); + if (_csi_unlikely (csi_object_get_type (a) != csi_object_get_type (b))) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + pop (2); + type = csi_object_get_type (a); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + return _csi_push_ostack_integer (ctx, + a->datum.integer | b->datum.integer); + case CSI_OBJECT_TYPE_BOOLEAN: + return _csi_push_ostack_boolean (ctx, + a->datum.boolean | b->datum.boolean); + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static csi_status_t +_paint (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_paint); +} + +static csi_status_t +_paint_with_alpha (csi_t *ctx) +{ + cairo_t *cr; + csi_status_t status; + double alpha; + + check (2); + + status = _csi_ostack_get_number (ctx, 0, &alpha); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_paint_with_alpha (cr, alpha); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_pattern (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + cairo_surface_t *surface; + + check (1); + + status = _csi_ostack_get_surface (ctx, 0, &surface); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_for_surface (surface); + + pop (1); + return push (&obj); +} + +static csi_status_t +_pop (csi_t *ctx) +{ + check (1); + pop (1); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_pop_group (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + cairo_t *cr; + + check (1); + + status = _csi_ostack_get_context (ctx, 0, &cr); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pop_group (cr); + + return push (&obj); +} + +static csi_status_t +_push_group (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + long content; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &content); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_push_group_with_content (cr, content); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_radial (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + double x1, y1, r1, x2, y2, r2; + + check (6); + + status = _csi_ostack_get_number (ctx, 0, &r2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &y2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &x2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &r1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 4, &y1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 5, &x1); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_radial (x1, y1, r1, x2, y2, r2); + pop (6); + return push (&obj); +} + +static csi_status_t +_rectangle (csi_t *ctx) +{ + csi_status_t status; + double x, y; + double w, h; + cairo_t *cr; + + check (5); + + status = _csi_ostack_get_number (ctx, 0, &h); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &w); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 4, &cr); + if (_csi_unlikely (status)) + return status; + + /* XXX path object */ + + cairo_rectangle (cr, x, y, w, h); + pop(4); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_rel_curve_to (csi_t *ctx) +{ + csi_status_t status; + double x1, y1; + double x2, y2; + double x3, y3; + cairo_t *cr; + + check (7); + + status = _csi_ostack_get_number (ctx, 0, &y3); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x3); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &y2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &x2); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 4, &y1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 5, &x1); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 6, &cr); + if (_csi_unlikely (status)) + return status; + + /* XXX path object */ + + cairo_rel_curve_to (cr, x1, y1, x2, y2, x3, y3); + pop (6); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_rel_line_to (csi_t *ctx) +{ + csi_status_t status; + double x, y; + cairo_t *cr; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 2, &cr); + if (_csi_unlikely (status)) + return status; + + /* XXX path object */ + + cairo_rel_line_to (cr, x, y); + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_rel_move_to (csi_t *ctx) +{ + csi_status_t status; + double x, y; + cairo_t *cr; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 2, &cr); + if (_csi_unlikely (status)) + return status; + + /* XXX path object */ + cairo_rel_move_to (cr, x, y); + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_repeat (csi_t *ctx) +{ + csi_array_t *proc; + csi_integer_t count; + csi_status_t status; + + check (2); + + status = _csi_ostack_get_procedure (ctx, 0, &proc); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_integer (ctx, 1, &count); + if (_csi_unlikely (status)) + return status; + + if (_csi_unlikely (count < 0)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + proc->base.ref++; + pop (2); + + while (count--) { + status = _csi_array_execute (ctx, proc); + if (_csi_unlikely (status)) + break; + } + + if (--proc->base.ref == 0) + csi_array_free (ctx, proc); + + return status; +} + +static csi_status_t +_reset_clip (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_reset_clip); +} + +static csi_status_t +_restore (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_restore); +} + +static csi_status_t +_rgb (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + double r,g,b; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &b); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &g); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &r); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_rgb (r, g, b); + pop (3); + return push (&obj); +} + +static csi_status_t +_rgba (csi_t *ctx) +{ + csi_object_t obj; + csi_status_t status; + double r,g,b,a; + + check (4); + + status = _csi_ostack_get_number (ctx, 0, &a); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &b); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &g); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &r); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_PATTERN; + obj.datum.pattern = cairo_pattern_create_rgba (r, g, b, a); + pop (4); + return push (&obj); +} + +static csi_status_t +_roll (csi_t *ctx) +{ + csi_status_t status; + long j, n; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &j); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 1, &n); + if (_csi_unlikely (status)) + return status; + + pop (2); + check (n); + return _csi_stack_roll (ctx, &ctx->ostack, j, n); +} + +static csi_status_t +_rotate (csi_t *ctx) +{ + csi_object_t *obj; + csi_status_t status; + double theta; + int type; + + check (2); + + status = _csi_ostack_get_number (ctx, 0, &theta); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_rotate (obj->datum.cr, theta); + break; + + case CSI_OBJECT_TYPE_PATTERN: + { + cairo_matrix_t ctm; + cairo_pattern_get_matrix (obj->datum.pattern, &ctm); + cairo_matrix_rotate (&ctm, theta); + cairo_pattern_set_matrix (obj->datum.pattern, &ctm); + } + break; + + + case CSI_OBJECT_TYPE_MATRIX: + cairo_matrix_rotate (&obj->datum.matrix->matrix, theta); + break; + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_save (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_save); +} + +static csi_status_t +_scale (csi_t *ctx) +{ + csi_object_t *obj; + csi_status_t status; + double x, y; + int type; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 2); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_scale (obj->datum.cr, x, y); + break; + + case CSI_OBJECT_TYPE_PATTERN: + { + cairo_matrix_t ctm; + cairo_pattern_get_matrix (obj->datum.pattern, &ctm); + cairo_matrix_scale (&ctm, x, y); + cairo_pattern_set_matrix (obj->datum.pattern, &ctm); + } + break; + + + case CSI_OBJECT_TYPE_MATRIX: + cairo_matrix_scale (&obj->datum.matrix->matrix, x, y); + break; + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_font_options_load_from_dictionary (csi_t *ctx, + csi_dictionary_t *dict, + cairo_font_options_t *options) +{ + const struct { + const char *key; + void (*setter) (cairo_font_options_t *, int val); + } properties[] = { + { "antialias", + (void (*)(cairo_font_options_t *, int val)) + cairo_font_options_set_antialias }, + { "subpixel-order", + (void (*)(cairo_font_options_t *, int val)) + cairo_font_options_set_subpixel_order }, + { "hint-style", + (void (*)(cairo_font_options_t *, int val)) + cairo_font_options_set_hint_style }, + { "hint-metrics", + (void (*)(cairo_font_options_t *, int val)) + cairo_font_options_set_hint_metrics }, + { NULL, NULL }, + }, *prop = properties; + + while (prop->key != NULL) { + csi_object_t key, value; + csi_status_t status; + + status = csi_name_new_static (ctx, &key, prop->key); + if (_csi_unlikely (status)) + return status; + + if (csi_dictionary_has (dict, key.datum.name)) { + status = csi_dictionary_get (ctx, dict, key.datum.name, &value); + if (_csi_unlikely (status)) + return status; + + if (_csi_unlikely (csi_object_get_type (&value) != + CSI_OBJECT_TYPE_INTEGER)) + { + csi_object_free (ctx, &value); + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + prop->setter (options, value.datum.integer); + } + + prop++; + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_scaled_font (csi_t *ctx) +{ + csi_object_t obj; + csi_dictionary_t *dict; + cairo_font_face_t *font_face = NULL; /* silence the compiler */ + cairo_matrix_t font_matrix, ctm; + cairo_font_options_t *options; + csi_status_t status; + + check (4); + + status = _csi_ostack_get_dictionary (ctx, 0, &dict); + if (_csi_unlikely (status)) + return status; + options = cairo_font_options_create (); + status = _font_options_load_from_dictionary (ctx, dict, options); + if (_csi_unlikely (status)) { + cairo_font_options_destroy (options); + return status; + } + + status = _csi_ostack_get_matrix (ctx, 1, &ctm); + if (_csi_unlikely (status)) { + cairo_font_options_destroy (options); + return status; + } + + status = _csi_ostack_get_matrix (ctx, 2, &font_matrix); + if (_csi_unlikely (status)) { + cairo_font_options_destroy (options); + return status; + } + + status = _csi_ostack_get_font_face (ctx, 3, &font_face); + if (_csi_unlikely (status)) { + cairo_font_options_destroy (options); + return status; + } + + obj.type = CSI_OBJECT_TYPE_SCALED_FONT; + obj.datum.scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + options); + cairo_font_options_destroy (options); + pop (4); + return push (&obj); +} + +static csi_status_t +_select_font_face (csi_t *ctx) +{ + cairo_t *cr; + long weight; + long slant; + csi_string_t *family; + csi_status_t status; + + check (4); + + status = _csi_ostack_get_integer (ctx, 0, &weight); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 1, &slant); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_string (ctx, 2, &family); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 3, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_select_font_face (cr, family->string, slant, weight); + pop (3); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_context_set (csi_t *ctx, + cairo_t *cr, + csi_name_t key, + csi_object_t *obj) +{ + if (strcmp ((char *) key, "source") == 0) { + if (_csi_unlikely (csi_object_get_type (obj) != + CSI_OBJECT_TYPE_PATTERN)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + cairo_set_source (cr, obj->datum.pattern); + return CSI_STATUS_SUCCESS; + } + + if (strcmp ((char *) key, "scaled-font") == 0) { + if (_csi_unlikely (csi_object_get_type (obj) != + CSI_OBJECT_TYPE_SCALED_FONT)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + cairo_set_scaled_font (cr, obj->datum.scaled_font); + return CSI_STATUS_SUCCESS; + } + + if (strcmp ((char *) key, "font-face") == 0) { + if (_csi_unlikely (csi_object_get_type (obj) != + CSI_OBJECT_TYPE_FONT)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + cairo_set_font_face (cr, obj->datum.font_face); + return CSI_STATUS_SUCCESS; + } + + /* return _proxy_set()? */ + return _csi_error (CSI_STATUS_INVALID_SCRIPT); +} + +static csi_status_t +_set (csi_t *ctx) +{ + csi_object_t *key, *value, *dst; + csi_status_t status; + int type; + + check (3); + + value = _csi_peek_ostack (ctx, 0); + key = _csi_peek_ostack (ctx, 1); + dst = _csi_peek_ostack (ctx, 2); + + type = csi_object_get_type (dst); + switch (type) { + case CSI_OBJECT_TYPE_DICTIONARY: + if (_csi_unlikely (csi_object_get_type (key) != + CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = csi_dictionary_put (ctx, + dst->datum.dictionary, + key->datum.name, + value); + break; + case CSI_OBJECT_TYPE_ARRAY: + if (_csi_unlikely (csi_object_get_type (key) != + CSI_OBJECT_TYPE_INTEGER)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = csi_array_put (ctx, + dst->datum.array, + key->datum.integer, + value); + break; + + case CSI_OBJECT_TYPE_CONTEXT: + if (_csi_unlikely (csi_object_get_type (key) != + CSI_OBJECT_TYPE_NAME)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + status = _context_set (ctx, + dst->datum.cr, + key->datum.name, + value); + break; + + case CSI_OBJECT_TYPE_STRING: +#if 0 + status = csi_string_put (dst, key, value); + break; +#endif + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + return status; +} + +static csi_status_t +_set_antialias (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + long antialias; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &antialias); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_antialias (cr, antialias); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_dash (csi_t *ctx) +{ + csi_array_t *array; + csi_status_t status; + cairo_t *cr; + double offset; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &offset); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_array (ctx, 1, &array); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 2, &cr); + if (_csi_unlikely (status)) + return status; + + if (array->stack.len == 0) { + cairo_set_dash (cr, NULL, 0., 0.); + } else { + double stack_dashes[8]; + double *dashes; + csi_integer_t n; + + if (_csi_likely (array->stack.len < ARRAY_LENGTH (stack_dashes))) { + dashes = stack_dashes; + } else { + if (_csi_unlikely ((unsigned) array->stack.len >= INT_MAX / sizeof (double))) + return _csi_error (CSI_STATUS_NO_MEMORY); + dashes = _csi_alloc (ctx, sizeof (double) * array->stack.len); + if (_csi_unlikely (dashes == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } + + for (n = 0; n < array->stack.len; n++) { + if (_csi_unlikely (! csi_object_is_number + (&array->stack.objects[n]))) + { + if (dashes != stack_dashes) + _csi_free (ctx, dashes); + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + dashes[n] = csi_number_get_value (&array->stack.objects[n]); + } + + cairo_set_dash (cr, dashes, n, offset); + + if (dashes != stack_dashes) + _csi_free (ctx, dashes); + } + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_device_offset (csi_t *ctx) +{ + csi_status_t status; + cairo_surface_t *surface; + double x, y; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 2, &surface); + if (_csi_unlikely (status)) + return status; + + cairo_surface_set_device_offset (surface, x, y); + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_device_scale (csi_t *ctx) +{ + csi_status_t status; + cairo_surface_t *surface; + double x, y; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 2, &surface); + if (_csi_unlikely (status)) + return status; + + cairo_surface_set_device_scale (surface, x, y); + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_extend (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *obj; + long extend; + int type; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &extend); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_pattern_set_extend (cairo_get_source (obj->datum.cr), + extend); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_pattern_set_extend (obj->datum.pattern, extend); + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_fallback_resolution (csi_t *ctx) +{ + csi_status_t status; + cairo_surface_t *surface; + double dpi_x, dpi_y; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &dpi_y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &dpi_x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 2, &surface); + if (_csi_unlikely (status)) + return status; + + cairo_surface_set_fallback_resolution (surface, dpi_x, dpi_y); + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_fill_rule (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + long fill_rule; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &fill_rule); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_fill_rule (cr, fill_rule); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_filter (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *obj; + long filter; + int type; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &filter); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_pattern_set_filter (cairo_get_source (obj->datum.cr), + filter); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_pattern_set_filter (obj->datum.pattern, filter); + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_font_face (csi_t *ctx) +{ + cairo_t *cr; + cairo_font_face_t *font = NULL; /* silence the compiler */ + csi_status_t status; + + check (2); + + status = _csi_ostack_get_font_face (ctx, 0, &font); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_font_face (cr, font); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_font_options (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + csi_dictionary_t *dict; + cairo_font_options_t *options; + + check (2); + + status = _csi_ostack_get_dictionary (ctx, 0, &dict); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + options = cairo_font_options_create (); + status = _font_options_load_from_dictionary (ctx, dict, options); + if (_csi_unlikely (status)) + return status; + + cairo_set_font_options (cr, options); + cairo_font_options_destroy (options); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_font_matrix (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + cairo_matrix_t m; + + check (2); + + status = _csi_ostack_get_matrix (ctx, 0, &m); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_font_matrix (cr, &m); + pop(1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_font_size (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + double size; + + check (2); + + status = _csi_ostack_get_number (ctx, 0, &size); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_font_size (cr, size); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_line_cap (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + long line_cap; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &line_cap); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_line_cap (cr, line_cap); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_line_join (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + long line_join; + + status = _csi_ostack_get_integer (ctx, 0, &line_join); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_line_join (cr, line_join); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_line_width (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + double line_width; + + check (2); + + status = _csi_ostack_get_number (ctx, 0, &line_width); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_line_width (cr, line_width); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_matrix (csi_t *ctx) +{ + csi_object_t *obj; + csi_status_t status; + cairo_matrix_t m; + int type; + + check (2); + + status = _csi_ostack_get_matrix (ctx, 0, &m); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_set_matrix (obj->datum.cr, &m); + break; + case CSI_OBJECT_TYPE_PATTERN: + cairo_pattern_set_matrix (obj->datum.pattern, &m); + break; + case CSI_OBJECT_TYPE_MATRIX: + obj->datum.matrix->matrix = m; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +struct _mime_tag { + csi_t *ctx; + csi_string_t *source; +}; +static void +_mime_tag_destroy (void *closure) +{ + struct _mime_tag *tag = closure; + + if (--tag->source->base.ref) + csi_string_free (tag->ctx, tag->source); + + _csi_slab_free (tag->ctx, tag, sizeof (struct _mime_tag)); +} + +static csi_status_t +_set_mime_data (csi_t *ctx) +{ + csi_status_t status; + csi_object_t *obj; + const char *mime = NULL; /* silence the compiler */ + csi_object_t source; + cairo_surface_t *surface; + struct _mime_tag *tag; + int type; + + check (3); + + obj = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_FILE: + status = _csi_file_as_string (ctx, obj->datum.file, &source); + if (_csi_unlikely (status)) + return status; + + break; + + case CSI_OBJECT_TYPE_STRING: + source = *csi_object_reference (obj); + break; + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + status = _csi_ostack_get_string_constant (ctx, 1, &mime); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_surface (ctx, 2, &surface); + if (_csi_unlikely (status)) + return status; + + + /* XXX free source */ + tag = _csi_slab_alloc (ctx, sizeof (struct _mime_tag)); + if (_csi_unlikely (tag == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + tag->ctx = cairo_script_interpreter_reference (ctx); + tag->source = source.datum.string; + tag->source->base.ref++; + + status = cairo_surface_set_mime_data (surface, + mime, + (uint8_t *) + source.datum.string->string, + source.datum.string->len, + _mime_tag_destroy, tag); + if (_csi_unlikely (status)) { + _mime_tag_destroy (tag); + return status; + } + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_miter_limit (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + double miter_limit; + + check (2); + + status = _csi_ostack_get_number (ctx, 0, &miter_limit); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_miter_limit (cr, miter_limit); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_operator (csi_t *ctx) +{ + cairo_t *cr; + long val; + csi_status_t status; + + check (2); + + status = _csi_ostack_get_integer (ctx, 0, &val); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_operator (cr, val); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_scaled_font (csi_t *ctx) +{ + cairo_t *cr; + cairo_scaled_font_t *font = NULL; /* silence the compiler */ + csi_status_t status; + + check (2); + + status = _csi_ostack_get_scaled_font (ctx, 0, &font); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_scaled_font (cr, font); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_source (csi_t *ctx) +{ + cairo_t *cr; + cairo_pattern_t *pattern = NULL; /* silence the compiler */ + csi_status_t status; + + check (2); + + status = _csi_ostack_get_pattern (ctx, 0, &pattern); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_source (cr, pattern); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_boolean_t +_matching_images (cairo_surface_t *a, cairo_surface_t *b) +{ + cairo_format_t format_a, format_b; + + if (cairo_surface_get_type (a) != CAIRO_SURFACE_TYPE_IMAGE) + return FALSE; + if (cairo_surface_get_type (b) != CAIRO_SURFACE_TYPE_IMAGE) + return FALSE; + + if (cairo_image_surface_get_height (a) != cairo_image_surface_get_height (b)) + return FALSE; + + if (cairo_image_surface_get_width (a) != cairo_image_surface_get_width (b)) + return FALSE; + + format_a = cairo_image_surface_get_format (a); + if (format_a == CAIRO_FORMAT_RGB24) + format_a = CAIRO_FORMAT_ARGB32; + + format_b = cairo_image_surface_get_format (b); + if (format_b == CAIRO_FORMAT_RGB24) + format_b = CAIRO_FORMAT_ARGB32; + + if (format_a != format_b) + return FALSE; + + return TRUE; +} + +static csi_status_t +_set_source_image (csi_t *ctx) +{ + csi_status_t status; + cairo_surface_t *surface; + cairo_surface_t *source; + + check (2); + + status = _csi_ostack_get_surface (ctx, 0, &source); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 1, &surface); + if (_csi_unlikely (status)) + return status; + + /* Catch the most frequent use of simply uploading pixel data, + * principally to remove the pixman ops from the profiles. + */ + if (_csi_likely (_matching_images (surface, source))) { + if (cairo_surface_get_reference_count (surface) == 1 && + cairo_surface_get_reference_count (source) == 1) + { + _csi_peek_ostack (ctx, 0)->datum.surface = surface; + _csi_peek_ostack (ctx, 1)->datum.surface = source; + } + else + { + cairo_surface_flush (surface); + memcpy (cairo_image_surface_get_data (surface), + cairo_image_surface_get_data (source), + cairo_image_surface_get_height (source) * cairo_image_surface_get_stride (source)); + cairo_surface_mark_dirty (surface); + } + } else { + cairo_t *cr; + + cr = cairo_create (surface); + cairo_set_source_surface (cr, source, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_source_rgb (csi_t *ctx) +{ + csi_status_t status; + double r,g,b; + cairo_t *cr; + + check (4); + + status = _csi_ostack_get_number (ctx, 0, &b); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &g); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &r); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 3, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_source_rgb (cr, r, g, b); + pop (3); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_source_rgba (csi_t *ctx) +{ + csi_status_t status; + double r,g,b,a; + cairo_t *cr; + + check (5); + + status = _csi_ostack_get_number (ctx, 0, &a); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &b); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &g); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &r); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 4, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_source_rgba (cr, r, g, b, a); + pop (4); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_set_tolerance (csi_t *ctx) +{ + csi_status_t status; + cairo_t *cr; + double tolerance; + + check (2); + + status = _csi_ostack_get_number (ctx, 0, &tolerance); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_set_tolerance (cr, tolerance); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_transform (csi_t *ctx) +{ + csi_object_t *obj; + csi_status_t status; + cairo_matrix_t m; + int type; + + check (2); + + status = _csi_ostack_get_matrix (ctx, 0, &m); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_transform (obj->datum.cr, &m); + break; + case CSI_OBJECT_TYPE_PATTERN: + { + cairo_matrix_t ctm; + cairo_pattern_get_matrix (obj->datum.pattern, &ctm); + cairo_matrix_multiply (&ctm, &m, &ctm); + cairo_pattern_set_matrix (obj->datum.pattern, &ctm); + } + break; + case CSI_OBJECT_TYPE_MATRIX: + cairo_matrix_multiply (&obj->datum.matrix->matrix, + &m, + &obj->datum.matrix->matrix); + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate (csi_t *ctx) +{ + csi_object_t *obj; + csi_status_t status; + double x, y; + int type; + + check (3); + + status = _csi_ostack_get_number (ctx, 0, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &x); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 2); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_translate (obj->datum.cr, x, y); + break; + + case CSI_OBJECT_TYPE_PATTERN: + { + cairo_matrix_t ctm; + cairo_pattern_get_matrix (obj->datum.pattern, &ctm); + cairo_matrix_translate (&ctm, x, y); + cairo_pattern_set_matrix (obj->datum.pattern, &ctm); + } + break; + + + case CSI_OBJECT_TYPE_MATRIX: + cairo_matrix_translate (&obj->datum.matrix->matrix, x, y); + break; + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_true (csi_t *ctx) +{ + return _csi_push_ostack_boolean (ctx, TRUE); +} + +static csi_status_t +_show_page (csi_t *ctx) +{ + csi_object_t *obj; + int type; + + check (1); + + obj = _csi_peek_ostack (ctx, 0); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_CONTEXT: + cairo_show_page (obj->datum.cr); + if (ctx->hooks.copy_page != NULL) + ctx->hooks.copy_page (ctx->hooks.closure, obj->datum.cr); + break; + case CSI_OBJECT_TYPE_SURFACE: + cairo_surface_show_page (obj->datum.surface); + /* XXX hook? */ + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_similar (csi_t *ctx) +{ + csi_object_t obj; + long content; + double width, height; + cairo_surface_t *other; + csi_status_t status; + + check (4); + + status = _csi_ostack_get_integer (ctx, 0, &content); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &height); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &width); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 3, &other); + if (_csi_unlikely (status)) + return status; + + /* silently fix-up a common bug when writing CS */ + if ((content & CAIRO_CONTENT_COLOR_ALPHA) == 0) { + if (_csi_unlikely (content & ~CAIRO_CONTENT_COLOR_ALPHA)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + switch ((int) content) { + default: + case CAIRO_FORMAT_ARGB32: + content = CAIRO_CONTENT_COLOR_ALPHA; + break; + case CAIRO_FORMAT_RGB16_565: + case CAIRO_FORMAT_RGB24: + content = CAIRO_CONTENT_COLOR; + break; + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + content = CAIRO_CONTENT_ALPHA; + break; + } + } + + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_surface_create_similar (other, + content, width, height); + pop (4); + return push (&obj); +} + +static csi_status_t +_similar_image (csi_t *ctx) +{ + csi_object_t obj; + long format; + double width, height; + cairo_surface_t *other; + csi_status_t status; + + check (4); + + status = _csi_ostack_get_number (ctx, 0, &height); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &width); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_integer (ctx, 2, &format); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 3, &other); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_surface_create_similar_image (other, + format, + width, height); + pop (4); + return push (&obj); +} + +static csi_status_t +_subsurface (csi_t *ctx) +{ + csi_object_t obj; + double x, y, width, height; + cairo_surface_t *target; + csi_status_t status; + + check (5); + + status = _csi_ostack_get_number (ctx, 0, &height); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 1, &width); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 2, &y); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_number (ctx, 3, &x); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 4, &target); + if (_csi_unlikely (status)) + return status; + + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_surface_create_for_rectangle (target, x, y, width, height); + pop (5); + return push (&obj); +} + +static csi_status_t +_show_text (csi_t *ctx) +{ + csi_status_t status; + csi_string_t *text; + cairo_t *cr; + + check (2); + + status = _csi_ostack_get_string (ctx, 0, &text); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_show_text (cr, text->string); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_show_glyphs (csi_t *ctx) +{ + csi_array_t *array; + csi_status_t status; + cairo_t *cr; + cairo_glyph_t stack_glyphs[256], *glyphs; + csi_integer_t nglyphs, i; + + check (2); + + status = _csi_ostack_get_array (ctx, 0, &array); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + /* count glyphs */ + nglyphs = 0; + for (i = 0; i < array->stack.len; i++) { + csi_object_t *obj = &array->stack.objects[i]; + int type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_ARRAY: + nglyphs += obj->datum.array->stack.len; + break; + case CSI_OBJECT_TYPE_STRING: + nglyphs += obj->datum.string->len; + break; + } + } + if (nglyphs == 0) { + pop (1); + return CSI_STATUS_SUCCESS; + } + + if (nglyphs > ARRAY_LENGTH (stack_glyphs)) { + if (_csi_unlikely ((unsigned) nglyphs >= INT_MAX / sizeof (cairo_glyph_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + + glyphs = _csi_alloc (ctx, sizeof (cairo_glyph_t) * nglyphs); + if (_csi_unlikely (glyphs == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else + glyphs = stack_glyphs; + + nglyphs = _glyph_string (ctx, array, cairo_get_scaled_font (cr), glyphs); + cairo_show_glyphs (cr, glyphs, nglyphs); + + if (glyphs != stack_glyphs) + _csi_free (ctx, glyphs); + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_show_text_glyphs (csi_t *ctx) +{ + csi_object_t *obj; + csi_array_t *array; + csi_string_t *string; + csi_string_t *utf8_string; + csi_status_t status; + cairo_t *cr; + cairo_text_cluster_t stack_clusters[256], *clusters; + cairo_glyph_t stack_glyphs[256], *glyphs; + csi_integer_t nglyphs, nclusters, i; + long direction; + int type; + + check (5); + + status = _csi_ostack_get_integer (ctx, 0, &direction); + if (_csi_unlikely (status)) + return status; + + obj = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_ARRAY: + array = obj->datum.array; + nclusters = array->stack.len / 2; + if (nclusters > ARRAY_LENGTH (stack_clusters)) { + if (_csi_unlikely ((unsigned) nclusters >= INT_MAX / sizeof (cairo_text_cluster_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + clusters = _csi_alloc (ctx, sizeof (cairo_text_cluster_t) * nclusters); + if (_csi_unlikely (clusters == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else + clusters = stack_clusters; + + for (i = 0; i < nclusters; i++) { + clusters[i].num_bytes = csi_number_get_value (&array->stack.objects[2*i+0]); + clusters[i].num_glyphs = csi_number_get_value (&array->stack.objects[2*i+1]); + } + break; + + case CSI_OBJECT_TYPE_STRING: + string = obj->datum.string; + nclusters = string->len / 2; + if (nclusters > ARRAY_LENGTH (stack_clusters)) { + if (_csi_unlikely ((unsigned) nclusters >= INT_MAX / sizeof (cairo_text_cluster_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + clusters = _csi_alloc (ctx, sizeof (cairo_text_cluster_t) * nclusters); + if (_csi_unlikely (clusters == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else + clusters = stack_clusters; + + for (i = 0; i < nclusters; i++) { + clusters[i].num_bytes = string->string[2*i+0]; + clusters[i].num_glyphs = string->string[2*i+1]; + } + break; + + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + status = _csi_ostack_get_array (ctx, 2, &array); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_string (ctx, 3, &utf8_string); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 4, &cr); + if (_csi_unlikely (status)) + return status; + + /* count glyphs */ + nglyphs = 0; + for (i = 0; i < array->stack.len; i++) { + obj = &array->stack.objects[i]; + type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_ARRAY: + nglyphs += obj->datum.array->stack.len; + break; + case CSI_OBJECT_TYPE_STRING: + nglyphs += obj->datum.string->len; + break; + } + } + if (nglyphs == 0) { + pop (4); + return CSI_STATUS_SUCCESS; + } + + if (nglyphs > ARRAY_LENGTH (stack_glyphs)) { + if (_csi_unlikely ((unsigned) nglyphs >= INT_MAX / sizeof (cairo_glyph_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + + glyphs = _csi_alloc (ctx, sizeof (cairo_glyph_t) * nglyphs); + if (_csi_unlikely (glyphs == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else + glyphs = stack_glyphs; + + nglyphs = _glyph_string (ctx, array, cairo_get_scaled_font (cr), glyphs); + cairo_show_text_glyphs (cr, + utf8_string->string, utf8_string->len, + glyphs, nglyphs, + clusters, nclusters, + direction); + + if (clusters != stack_clusters) + _csi_free (ctx, clusters); + if (glyphs != stack_glyphs) + _csi_free (ctx, glyphs); + + pop (4); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_stroke (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_stroke); +} + +static csi_status_t +_stroke_preserve (csi_t *ctx) +{ + return _do_cairo_op (ctx, cairo_stroke_preserve); +} + +static csi_status_t +_sub (csi_t *ctx) +{ + csi_object_t *A; + csi_object_t *B; + csi_object_type_t type_a, type_b; + + check (2); + + B = _csi_peek_ostack (ctx, 0); + A = _csi_peek_ostack (ctx, 1); + + type_a = csi_object_get_type (A); + if (_csi_unlikely (! (type_a == CSI_OBJECT_TYPE_INTEGER || + type_a == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + type_b = csi_object_get_type (B); + if (_csi_unlikely (! (type_b == CSI_OBJECT_TYPE_INTEGER || + type_b == CSI_OBJECT_TYPE_REAL))) + { + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (2); + + if (type_a == CSI_OBJECT_TYPE_REAL && + type_b == CSI_OBJECT_TYPE_REAL) + { + return _csi_push_ostack_real (ctx, A->datum.real - B->datum.real); + + } + else if (type_a == CSI_OBJECT_TYPE_INTEGER && + type_b == CSI_OBJECT_TYPE_INTEGER) + { + return _csi_push_ostack_integer (ctx, + A->datum.integer - B->datum.integer); + } + else + { + double v; + + if (type_a == CSI_OBJECT_TYPE_REAL) + v = A->datum.real; + else + v = A->datum.integer; + + if (type_b == CSI_OBJECT_TYPE_REAL) + v -= B->datum.real; + else + v -= B->datum.integer; + + return _csi_push_ostack_real (ctx, v); + } +} + +static csi_status_t +_surface (csi_t *ctx) +{ + csi_object_t obj; + csi_dictionary_t *dict; + csi_proxy_t *proxy; + csi_object_t key; + double width, height; + csi_surface_create_func_t hook; + long content; + cairo_surface_t *surface; + long uid; + csi_status_t status; + + check (1); + + status = _csi_ostack_get_dictionary (ctx, 0, &dict); + if (_csi_unlikely (status)) + return status; + + status = _csi_dictionary_get_number (ctx, dict, "width", FALSE, &width); + if (_csi_unlikely (status)) + return status; + status = _csi_dictionary_get_number (ctx, dict, "height", FALSE, &height); + if (_csi_unlikely (status)) + return status; + + content = CAIRO_CONTENT_COLOR_ALPHA; + status = _csi_dictionary_get_integer (ctx, dict, "content", TRUE, &content); + if (_csi_unlikely (status)) + return status; + + uid = 0; + status = _csi_dictionary_get_integer (ctx, dict, "uid", TRUE, &uid); + if (_csi_unlikely (status)) + return status; + if (uid == 0) { + status = _csi_dictionary_get_integer (ctx, dict, "drawable", TRUE, &uid); + if (_csi_unlikely (status)) + return status; + } + + hook = ctx->hooks.surface_create; + assert (hook != NULL); + + surface = hook (ctx->hooks.closure, content, width, height, uid); + if (_csi_unlikely (surface == NULL)) { + return _csi_error (CSI_STATUS_NULL_POINTER); + } + + proxy = _csi_proxy_create (ctx, surface, dict, + ctx->hooks.surface_destroy, + ctx->hooks.closure); + if (_csi_unlikely (proxy == NULL)) { + cairo_surface_destroy (surface); + return _csi_error (CSI_STATUS_NO_MEMORY); + } + + status = cairo_surface_set_user_data (surface, + &_csi_proxy_key, + proxy, _csi_proxy_destroy); + if (_csi_unlikely (status)) { + _csi_proxy_destroy (proxy); + cairo_surface_destroy (surface); + return status; + } + + status = csi_name_new_static (ctx, &key, "fallback-resolution"); + if (_csi_unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + if (csi_dictionary_has (dict, key.datum.name)) { + status = csi_dictionary_get (ctx, dict, key.datum.name, &obj); + if (_csi_unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + if (csi_object_get_type (&obj) == CSI_OBJECT_TYPE_ARRAY) { + csi_array_t *array = obj.datum.array; + if (array->stack.len == 2) { + cairo_surface_set_fallback_resolution (surface, + csi_number_get_value + (&array->stack.objects[0]), + csi_number_get_value + (&array->stack.objects[1])); + } + } + } + /* initialise surface to source */ + status = csi_name_new_static (ctx, &key, "source"); + if (_csi_unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + if (csi_dictionary_has (dict, key.datum.name)) { + cairo_surface_t *image; + cairo_t *cr; + + status = _image_load_from_dictionary (ctx, dict, &image); + if (_csi_unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + + cr = cairo_create (surface); + cairo_set_source_surface (cr, image, 0, 0); + cairo_surface_destroy (image); + cairo_paint (cr); + status = cairo_status (cr); + cairo_destroy (cr); + + if (_csi_unlikely (status)) + return status; + } + + status = csi_name_new_static (ctx, &key, "device-offset"); + if (_csi_unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + if (csi_dictionary_has (dict, key.datum.name)) { + status = csi_dictionary_get (ctx, dict, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + if (csi_object_get_type (&obj) == CSI_OBJECT_TYPE_ARRAY) { + csi_array_t *array = obj.datum.array; + + if (array->stack.len == 2) { + cairo_surface_set_device_offset (surface, + csi_number_get_value + (&array->stack.objects[0]), + csi_number_get_value + (&array->stack.objects[1])); + } + } + } + + status = csi_name_new_static (ctx, &key, "device-scale"); + if (_csi_unlikely (status)) { + cairo_surface_destroy (surface); + return status; + } + if (csi_dictionary_has (dict, key.datum.name)) { + status = csi_dictionary_get (ctx, dict, key.datum.name, &obj); + if (_csi_unlikely (status)) + return status; + + if (csi_object_get_type (&obj) == CSI_OBJECT_TYPE_ARRAY) { + csi_array_t *array = obj.datum.array; + + if (array->stack.len == 2) { + cairo_surface_set_device_scale (surface, + csi_number_get_value + (&array->stack.objects[0]), + csi_number_get_value + (&array->stack.objects[1])); + } + } + } + + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = surface; + pop (1); + return push (&obj); +} + +static csi_status_t +_record (csi_t *ctx) +{ + csi_object_t obj; + long content; + csi_array_t *array; + csi_status_t status; + cairo_rectangle_t extents; + cairo_rectangle_t *r; + + check (2); + + status = _csi_ostack_get_array (ctx, 0, &array); + if (_csi_unlikely (status)) + return status; + + status = _csi_ostack_get_integer (ctx, 1, &content); + if (_csi_unlikely (status)) + return status; + + switch (array->stack.len) { + case 0: + r = NULL; + break; + case 2: + extents.x = extents.y = 0; + extents.width = _csi_object_as_real (&array->stack.objects[0]); + extents.height = _csi_object_as_real (&array->stack.objects[1]); + r = &extents; + break; + case 4: + extents.x = _csi_object_as_real (&array->stack.objects[0]); + extents.y = _csi_object_as_real (&array->stack.objects[1]); + extents.width = _csi_object_as_real (&array->stack.objects[2]); + extents.height = _csi_object_as_real (&array->stack.objects[3]); + r = &extents; + break; + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + obj.type = CSI_OBJECT_TYPE_SURFACE; + obj.datum.surface = cairo_recording_surface_create (content, r); + pop (2); + return push (&obj); +} + +static csi_status_t +_text_path (csi_t *ctx) +{ + csi_status_t status; + csi_string_t *text; + cairo_t *cr; + + check (2); + + status = _csi_ostack_get_string (ctx, 0, &text); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_context (ctx, 1, &cr); + if (_csi_unlikely (status)) + return status; + + cairo_text_path (cr, text->string); + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_undef (csi_t *ctx) +{ + csi_name_t name = 0; /* silence the compiler */ + csi_status_t status; + + check (1); + + status = _csi_ostack_get_name (ctx, 0, &name); + if (_csi_unlikely (status)) + return status; + + status = _csi_name_undefine (ctx, name); + if (_csi_unlikely (status)) + return status; + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_unset (csi_t *ctx) +{ + csi_object_t *dst; + csi_name_t name = 0; /* silence the compiler */ + csi_status_t status; + int type; + + check (2); + + status = _csi_ostack_get_name (ctx, 0, &name); + if (_csi_unlikely (status)) + return status; + + dst = _csi_peek_ostack (ctx, 1); + type = csi_object_get_type (dst); + switch (type) { + case CSI_OBJECT_TYPE_DICTIONARY: + csi_dictionary_remove (ctx, dst->datum.dictionary, name); + break; + case CSI_OBJECT_TYPE_STRING: + case CSI_OBJECT_TYPE_ARRAY: + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_write_to_png (csi_t *ctx) +{ + csi_status_t status; + csi_string_t *filename; + cairo_surface_t *surface; + + check (2); + + status = _csi_ostack_get_string (ctx, 0, &filename); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 1, &surface); + if (_csi_unlikely (status)) + return status; + +#if CAIRO_HAS_PNG_FUNCTIONS + status = cairo_surface_write_to_png (surface, filename->string); + if (_csi_unlikely (status)) + return status; +#else + return CAIRO_STATUS_WRITE_ERROR; +#endif + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_write_to_script (csi_t *ctx) +{ + csi_status_t status; + csi_string_t *filename; + cairo_surface_t *record; + + check (2); + + status = _csi_ostack_get_string (ctx, 0, &filename); + if (_csi_unlikely (status)) + return status; + status = _csi_ostack_get_surface (ctx, 1, &record); + if (_csi_unlikely (status)) + return status; + + if (cairo_surface_get_type (record) != CAIRO_SURFACE_TYPE_RECORDING) + return CAIRO_STATUS_SURFACE_TYPE_MISMATCH; + +#if CAIRO_HAS_SCRIPT_SURFACE + { + cairo_device_t *script; + + script = cairo_script_create (filename->string); + status = cairo_script_from_recording_surface (script, record); + cairo_device_destroy (script); + if (_csi_unlikely (status)) + return status; + } +#else + return CAIRO_STATUS_WRITE_ERROR; +#endif + + pop (1); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_xor (csi_t *ctx) +{ + csi_object_t *a, *b; + int type; + + check (2); + + a = _csi_peek_ostack (ctx, 0); + b = _csi_peek_ostack (ctx, 1); + if (_csi_unlikely (csi_object_get_type (a) != csi_object_get_type (b))) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + pop (2); + type = csi_object_get_type (a); + switch (type) { + case CSI_OBJECT_TYPE_INTEGER: + return _csi_push_ostack_integer (ctx, + a->datum.integer ^ b->datum.integer); + case CSI_OBJECT_TYPE_BOOLEAN: + return _csi_push_ostack_boolean (ctx, + a->datum.boolean ^ b->datum.boolean); + default: + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + } +} + +static csi_status_t +_debug_print (csi_t *ctx) +{ + csi_object_t *obj; + + check (1); + obj = _csi_peek_ostack (ctx, 0); + switch (csi_object_get_type (obj)) { + case CSI_OBJECT_TYPE_NULL: + fprintf (stderr, "NULL\n"); + break; + + /* atomics */ + case CSI_OBJECT_TYPE_BOOLEAN: + fprintf (stderr, "boolean: %s\n", + obj->datum.boolean ? "true" : "false"); + break; + case CSI_OBJECT_TYPE_INTEGER: + fprintf (stderr, "integer: %ld\n", obj->datum.integer); + break; + case CSI_OBJECT_TYPE_MARK: + fprintf (stderr, "mark\n"); + break; + case CSI_OBJECT_TYPE_NAME: + fprintf (stderr, "name: %s\n", (char *) obj->datum.name); + break; + case CSI_OBJECT_TYPE_OPERATOR: + fprintf (stderr, "operator: %p\n", obj->datum.ptr); + break; + case CSI_OBJECT_TYPE_REAL: + fprintf (stderr, "real: %g\n", obj->datum.real); + break; + + /* compound */ + case CSI_OBJECT_TYPE_ARRAY: + fprintf (stderr, "array\n"); + break; + case CSI_OBJECT_TYPE_DICTIONARY: + fprintf (stderr, "dictionary\n"); + break; + case CSI_OBJECT_TYPE_FILE: + fprintf (stderr, "file\n"); + break; + case CSI_OBJECT_TYPE_MATRIX: + fprintf (stderr, "matrix: [%g %g %g %g %g %g]\n", + obj->datum.matrix->matrix.xx, + obj->datum.matrix->matrix.yx, + obj->datum.matrix->matrix.xy, + obj->datum.matrix->matrix.yy, + obj->datum.matrix->matrix.x0, + obj->datum.matrix->matrix.y0); + break; + case CSI_OBJECT_TYPE_STRING: + fprintf (stderr, "string: %s\n", obj->datum.string->string); + break; + + /* cairo */ + case CSI_OBJECT_TYPE_CONTEXT: + fprintf (stderr, "context\n"); + break; + case CSI_OBJECT_TYPE_FONT: + fprintf (stderr, "font\n"); + break; + case CSI_OBJECT_TYPE_PATTERN: + fprintf (stderr, "pattern\n"); + break; + case CSI_OBJECT_TYPE_SCALED_FONT: + fprintf (stderr, "scaled-font\n"); + break; + case CSI_OBJECT_TYPE_SURFACE: + fprintf (stderr, "surface\n"); + break; + } + pop (1); + return CSI_STATUS_SUCCESS; +} + +static const csi_operator_def_t +_defs[] = { + { "<<", _mark }, + { ">>", end_dict_construction }, + { "[", _mark }, + { "]", end_array_construction }, + { "a", _alpha }, + { "abs", NULL }, + { "add", _add }, + { "add-color-stop", _add_color_stop }, + { "and", _and }, + { "arc", _arc }, + { "arc-negative", _arc_negative }, + { "arc-", _arc_negative }, + { "arc-to", NULL }, + { "array", _array }, + { "astore", NULL }, + { "atan", NULL }, + { "bind", _bind }, + { "bitshift", _bitshift }, + { "c", _curve_to }, + { "C", _rel_curve_to }, + { "ceiling", NULL }, + { "clear", NULL }, + { "clear-to-mark", NULL }, + { "clip", _clip }, + { "clip-extents", NULL }, + { "clip-preserve", _clip_preserve }, + { "clip+", _clip_preserve }, + { "close-path", _close_path }, + { "context", _context }, + { "copy", _copy }, + { "copy-page", _copy_page }, + { "cos", NULL }, + { "count", NULL }, + { "count-to-mark", NULL }, + { "curve-to", _curve_to }, + { "cvi", _cvi }, + { "cvr", _cvr }, + { "def", _def }, + { "device-to-user", NULL }, + { "device-to-user-distance", NULL }, + { "dict", _dict }, + { "div", _div }, + { "dup", _duplicate }, + { "eq", _eq }, + { "exch", _exch }, + { "exec", NULL }, + { "exp", NULL }, + { "false", _false }, + { "fill", _fill }, + { "fill-extents", NULL }, + { "fill-preserve", _fill_preserve }, + { "fill+", _fill_preserve }, + { "filter", _filter }, + { "floor", NULL }, + { "font", _font }, + { "for", _for }, + { "forall", NULL }, + { "g", _gray }, + { "ge", _ge }, + { "get", _get }, + { "glyph-path", _glyph_path }, + { "gt", _gt }, + { "h", _close_path }, + { "identity", _identity }, + { "if", _if }, + { "ifelse", _ifelse }, + { "image", _image }, + { "index", _index }, + { "integer", _integer }, + { "invert", _invert }, + { "in-stroke", NULL }, + { "in-fill", NULL }, + { "known", NULL }, + { "l", _line_to }, + { "L", _rel_line_to }, + { "languagelevel", NULL }, + { "le", _le }, + { "length", NULL }, + { "linear", _linear }, + { "line-to", _line_to }, + { "ln", NULL }, + { "load", NULL }, + { "log", NULL }, + { "loop", NULL }, + { "lt", _lt }, + { "m", _move_to }, + { "M", _rel_move_to }, + { "map-to-image", _map_to_image }, + { "mark", _mark }, + { "mask", _mask }, + { "matrix", _matrix }, + + { "mesh", _mesh }, + { "begin-patch", _mesh_begin_patch }, + { "end-patch", _mesh_end_patch }, + { "set-control-point", _mesh_set_control_point }, + { "set-corner-color", _mesh_set_corner_color }, + + { "mod", _mod }, + { "move-to", _move_to }, + { "mul", _mul }, + { "multiply", NULL }, + { "n", _new_path }, + { "N", _new_sub_path }, + { "ne", _ne }, + { "neg", _neg }, + { "new-path", _new_path }, + { "new-sub-path", _new_sub_path }, + { "not", _not }, + { "null", _null }, + { "or", _or }, + { "paint", _paint }, + { "paint-with-alpha", _paint_with_alpha }, + { "pattern", _pattern }, + { "pop", _pop }, + { "pop-group", _pop_group }, + { "push-group", _push_group }, + { "radial", _radial }, + { "rand", NULL }, + { "record", _record }, + { "rectangle", _rectangle }, + { "repeat", _repeat }, + { "restore", _restore }, + { "rel-curve-to", _rel_curve_to }, + { "rel-line-to", _rel_line_to }, + { "rel-move-to", _rel_move_to }, + { "reset-clip", _reset_clip }, + { "rgb", _rgb }, + { "rgba", _rgba }, + { "roll", _roll }, + { "rotate", _rotate }, + { "round", NULL }, + { "run", NULL }, + { "save", _save }, + { "scale", _scale }, + { "scaled-font", _scaled_font }, + { "select-font-face", _select_font_face }, + { "set", _set }, + { "set-antialias", _set_antialias }, + { "set-dash", _set_dash }, + { "set-device-offset", _set_device_offset }, + { "set-device-scale", _set_device_scale }, + { "set-extend", _set_extend }, + { "set-fallback-resolution", _set_fallback_resolution }, + { "set-fill-rule", _set_fill_rule }, + { "set-filter", _set_filter }, + { "set-font-face", _set_font_face }, + { "set-font-options", _set_font_options }, + { "set-font-matrix", _set_font_matrix }, + { "set-font-size", _set_font_size }, + { "set-line-cap", _set_line_cap }, + { "set-line-join", _set_line_join }, + { "set-line-width", _set_line_width }, + { "set-matrix", _set_matrix }, + { "set-miter-limit", _set_miter_limit }, + { "set-mime-data", _set_mime_data }, + { "set-operator", _set_operator }, + { "set-scaled-font", _set_scaled_font }, + { "set-source", _set_source }, + { "set-source-image", _set_source_image }, + { "set-source-rgb", _set_source_rgb }, + { "set-source-rgba", _set_source_rgba }, + { "set-tolerance", _set_tolerance }, + { "show-glyphs", _show_glyphs }, + { "show-text", _show_text }, + { "show-text-glyphs", _show_text_glyphs }, + { "show-page", _show_page }, + { "similar", _similar }, + { "similar-image", _similar_image }, + { "sin", NULL }, + { "sqrt", NULL }, + { "sub", _sub }, + { "subsurface", _subsurface }, + { "surface", _surface }, + { "string", NULL }, + { "stroke", _stroke }, + { "stroke-extents", NULL }, + { "stroke-preserve", _stroke_preserve }, + { "stroke+", _stroke_preserve }, + { "text-path", _text_path }, + { "transform", _transform }, + { "transform-distance", NULL }, + { "transform-point", NULL }, + { "translate", _translate }, + { "true", _true }, + { "type", NULL }, + { "undef", _undef }, + { "unmap-image", _unmap_image }, + { "unset", _unset }, + { "user-to-device", NULL }, + { "user-to-device-distance", NULL }, + { "where", NULL }, + { "write-to-png", _write_to_png }, + { "write-to-script", _write_to_script }, + { "xor", _xor }, + + { "=", _debug_print }, + + { NULL, NULL }, +}; + +const csi_operator_def_t * +_csi_operators (void) +{ + return _defs; +} + +static const csi_integer_constant_def_t +_integer_constants[] = { + { "CLEAR", CAIRO_OPERATOR_CLEAR }, + { "SOURCE", CAIRO_OPERATOR_SOURCE }, + { "OVER", CAIRO_OPERATOR_OVER }, + { "IN", CAIRO_OPERATOR_IN }, + { "OUT", CAIRO_OPERATOR_OUT }, + { "ATOP", CAIRO_OPERATOR_ATOP }, + { "DEST", CAIRO_OPERATOR_DEST }, + { "DEST_OVER", CAIRO_OPERATOR_DEST_OVER }, + { "DEST_IN", CAIRO_OPERATOR_DEST_IN }, + { "DEST_OUT", CAIRO_OPERATOR_DEST_OUT }, + { "DEST_ATOP", CAIRO_OPERATOR_DEST_ATOP }, + { "XOR", CAIRO_OPERATOR_XOR }, + { "ADD", CAIRO_OPERATOR_ADD }, + { "SATURATE", CAIRO_OPERATOR_SATURATE }, + { "MULTIPLY", CAIRO_OPERATOR_MULTIPLY }, + { "SCREEN", CAIRO_OPERATOR_SCREEN }, + { "OVERLAY", CAIRO_OPERATOR_OVERLAY }, + { "DARKEN", CAIRO_OPERATOR_DARKEN }, + { "LIGHTEN", CAIRO_OPERATOR_LIGHTEN }, + { "DODGE", CAIRO_OPERATOR_COLOR_DODGE }, + { "BURN", CAIRO_OPERATOR_COLOR_BURN }, + { "HARD_LIGHT", CAIRO_OPERATOR_HARD_LIGHT }, + { "SOFT_LIGHT", CAIRO_OPERATOR_SOFT_LIGHT }, + { "DIFFERENCE", CAIRO_OPERATOR_DIFFERENCE }, + { "EXCLUSION", CAIRO_OPERATOR_EXCLUSION }, + { "HSL_HUE", CAIRO_OPERATOR_HSL_HUE }, + { "HSL_SATURATION", CAIRO_OPERATOR_HSL_SATURATION }, + { "HSL_COLOR", CAIRO_OPERATOR_HSL_COLOR }, + { "HSL_LUMINOSITY", CAIRO_OPERATOR_HSL_LUMINOSITY }, + + { "WINDING", CAIRO_FILL_RULE_WINDING }, + { "EVEN_ODD", CAIRO_FILL_RULE_EVEN_ODD }, + + { "ANTIALIAS_DEFAULT", CAIRO_ANTIALIAS_DEFAULT }, + { "ANTIALIAS_NONE", CAIRO_ANTIALIAS_NONE }, + { "ANTIALIAS_GRAY", CAIRO_ANTIALIAS_GRAY }, + { "ANTIALIAS_SUBPIXEL", CAIRO_ANTIALIAS_SUBPIXEL }, + { "ANTIALIAS_FAST", CAIRO_ANTIALIAS_FAST }, + { "ANTIALIAS_GOOD", CAIRO_ANTIALIAS_GOOD }, + { "ANTIALIAS_BEST", CAIRO_ANTIALIAS_BEST }, + + { "LINE_CAP_BUTT", CAIRO_LINE_CAP_BUTT }, + { "LINE_CAP_ROUND", CAIRO_LINE_CAP_ROUND }, + { "LINE_CAP_SQUARE", CAIRO_LINE_CAP_SQUARE }, + + { "LINE_JOIN_MITER", CAIRO_LINE_JOIN_MITER }, + { "LINE_JOIN_ROUND", CAIRO_LINE_JOIN_ROUND }, + { "LINE_JOIN_BEVEL", CAIRO_LINE_JOIN_BEVEL }, + + { "EXTEND_NONE", CAIRO_EXTEND_NONE }, + { "EXTEND_REPEAT", CAIRO_EXTEND_REPEAT }, + { "EXTEND_REFLECT", CAIRO_EXTEND_REFLECT }, + { "EXTEND_PAD", CAIRO_EXTEND_PAD }, + + { "FILTER_FAST", CAIRO_FILTER_FAST }, + { "FILTER_GOOD", CAIRO_FILTER_GOOD }, + { "FILTER_BEST", CAIRO_FILTER_BEST }, + { "FILTER_BILINEAR", CAIRO_FILTER_BILINEAR }, + { "FILTER_NEAREST", CAIRO_FILTER_NEAREST }, + { "FILTER_GAUSSIAN", CAIRO_FILTER_GAUSSIAN }, + + { "SLANT_NORMAL", CAIRO_FONT_SLANT_NORMAL }, + { "SLANT_ITALIC", CAIRO_FONT_SLANT_ITALIC }, + { "SLANT_OBLIQUE", CAIRO_FONT_SLANT_OBLIQUE }, + + { "WEIGHT_NORMAL", CAIRO_FONT_WEIGHT_NORMAL }, + { "WEIGHT_BOLD", CAIRO_FONT_WEIGHT_BOLD }, + + { "SUBPIXEL_ORDER_DEFAULT", CAIRO_SUBPIXEL_ORDER_DEFAULT }, + { "SUBPIXEL_ORDER_RGB", CAIRO_SUBPIXEL_ORDER_RGB }, + { "SUBPIXEL_ORDER_BGR", CAIRO_SUBPIXEL_ORDER_BGR }, + { "SUBPIXEL_ORDER_VRGB", CAIRO_SUBPIXEL_ORDER_VRGB }, + { "SUBPIXEL_ORDER_VBGR", CAIRO_SUBPIXEL_ORDER_VBGR }, + + { "HINT_STYLE_DEFAULT", CAIRO_HINT_STYLE_DEFAULT }, + { "HINT_STYLE_NONE", CAIRO_HINT_STYLE_NONE }, + { "HINT_STYLE_SLIGHT", CAIRO_HINT_STYLE_SLIGHT }, + { "HINT_STYLE_MEDIUM", CAIRO_HINT_STYLE_MEDIUM }, + { "HINT_STYLE_FULL", CAIRO_HINT_STYLE_FULL }, + + { "HINT_METRICS_DEFAULT", CAIRO_HINT_METRICS_DEFAULT }, + { "HINT_METRICS_OFF", CAIRO_HINT_METRICS_OFF }, + { "HINT_METRICS_ON", CAIRO_HINT_METRICS_ON }, + + { "FORWARD", 0 }, + { "BACKWARD", 1 }, + + { "COLOR", CAIRO_CONTENT_COLOR }, + { "ALPHA", CAIRO_CONTENT_ALPHA }, + { "COLOR_ALPHA", CAIRO_CONTENT_COLOR_ALPHA }, + + { "A1", CAIRO_FORMAT_A1 }, + { "A8", CAIRO_FORMAT_A8 }, + { "RGB16_565", CAIRO_FORMAT_RGB16_565 }, + { "RGB24", CAIRO_FORMAT_RGB24 }, + { "ARGB32", CAIRO_FORMAT_ARGB32 }, + { "INVALID", CAIRO_FORMAT_INVALID }, + + { NULL, 0 } +}; + + +const csi_integer_constant_def_t * +_csi_integer_constants (void) +{ + return _integer_constants; +} + +static const csi_real_constant_def_t +_real_constants[] = { + { "math.pi", M_PI }, + { "math.2pi", 2 * M_PI }, + { "math.sqrt2", M_SQRT2 }, + { "math.ln2", M_LN2 }, + + { NULL, 0 } +}; + +const csi_real_constant_def_t * +_csi_real_constants (void) +{ + return _real_constants; +} diff --git a/util/cairo-script/cairo-script-private.h b/util/cairo-script/cairo-script-private.h new file mode 100644 index 000000000..6bf41b4e5 --- /dev/null +++ b/util/cairo-script/cairo-script-private.h @@ -0,0 +1,994 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#ifndef CAIRO_SCRIPT_PRIVATE_H +#define CAIRO_SCRIPT_PRIVATE_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "cairo-script-interpreter.h" + +#include + +#ifdef _MSC_VER +#undef inline +#define inline __inline +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#ifndef NULL +#define NULL (void *) 0 +#endif + +#if HAVE_STDINT_H +# include +#elif HAVE_INTTYPES_H +# include +#elif HAVE_SYS_INT_TYPES_H +# include +#elif defined(_MSC_VER) + typedef __int8 int8_t; + typedef unsigned __int8 uint8_t; + typedef __int16 int16_t; + typedef unsigned __int16 uint16_t; + typedef __int32 int32_t; + typedef unsigned __int32 uint32_t; + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +# ifndef HAVE_UINT64_T +# define HAVE_UINT64_T 1 +# endif +#else +#error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.) +#endif + +#if HAVE_BYTESWAP_H +# include +#endif +#ifndef bswap_16 +# define bswap_16(p) \ + (((((uint16_t)(p)) & 0x00ff) << 8) | \ + (((uint16_t)(p)) >> 8)) +#endif +#ifndef bswap_32 +# define bswap_32(p) \ + (((((uint32_t)(p)) & 0x000000ff) << 24) | \ + ((((uint32_t)(p)) & 0x0000ff00) << 8) | \ + ((((uint32_t)(p)) & 0x00ff0000) >> 8) | \ + ((((uint32_t)(p))) >> 24)) +#endif + + +#if __GNUC__ >= 3 && defined(__ELF__) && !defined(__sun) +# define slim_hidden_proto(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) csi_private +# define slim_hidden_proto_no_warn(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) csi_private_no_warn +# define slim_hidden_def(name) slim_hidden_def1(name, slim_hidden_int_name(name)) +# define slim_hidden_int_name(name) INT_##name +# define slim_hidden_proto1(name, internal) \ + extern __typeof (name) name \ + __asm__ (slim_hidden_asmname (internal)) +# define slim_hidden_def1(name, internal) \ + extern __typeof (name) EXT_##name __asm__(slim_hidden_asmname(name)) \ + __attribute__((__alias__(slim_hidden_asmname(internal)))) +# define slim_hidden_ulp slim_hidden_ulp1(__USER_LABEL_PREFIX__) +# define slim_hidden_ulp1(x) slim_hidden_ulp2(x) +# define slim_hidden_ulp2(x) #x +# define slim_hidden_asmname(name) slim_hidden_asmname1(name) +# define slim_hidden_asmname1(name) slim_hidden_ulp #name +#else +# define slim_hidden_proto(name) int _csi_dummy_prototype(void) +# define slim_hidden_proto_no_warn(name) int _csi_dummy_prototype(void) +# define slim_hidden_def(name) int _csi_dummy_prototype(void) +#endif + +#if __GNUC__ >= 3 +#define csi_pure __attribute__((pure)) +#define csi_const __attribute__((const)) +#else +#define csi_pure +#define csi_const +#endif + +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +#define _CSI_BOOLEAN_EXPR(expr) \ + __extension__ ({ \ + int _csi_boolean_var_; \ + if (expr) \ + _csi_boolean_var_ = 1; \ + else \ + _csi_boolean_var_ = 0; \ + _csi_boolean_var_; \ +}) +#define _csi_likely(expr) (__builtin_expect (_CSI_BOOLEAN_EXPR(expr), 1)) +#define _csi_unlikely(expr) (__builtin_expect (_CSI_BOOLEAN_EXPR(expr), 0)) +#else +#define _csi_likely(expr) (expr) +#define _csi_unlikely(expr) (expr) +#endif + +#ifdef __GNUC__ +#ifndef offsetof +#define offsetof(type, member) \ + ((char *) &((type *) 0)->member - (char *) 0) +#endif +#define csi_container_of(ptr, type, member) ({ \ + const typeof(((type *) 0)->member) *mptr__ = (ptr); \ + (type *) ((char *) mptr__ - offsetof (type, member)); \ +}) +#else +#define csi_container_of(ptr, type, member) \ + (type *)((char *) (ptr) - (char *) &((type *)0)->member) +#endif + +/* slim_internal.h */ +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun) +#define csi_private_no_warn __attribute__((__visibility__("hidden"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +#define csi_private_no_warn __hidden +#else /* not gcc >= 3.3 and not Sun Studio >= 8 */ +#define csi_private_no_warn +#endif + +#undef ARRAY_LENGTH +#define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) + +#ifndef WARN_UNUSED_RESULT +#define WARN_UNUSED_RESULT +#endif +/* Add attribute(warn_unused_result) if supported */ +#define csi_warn WARN_UNUSED_RESULT +#define csi_private csi_private_no_warn csi_warn + +#define CSI_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16) +#ifdef WORDS_BIGENDIAN +#define CSI_BITSWAP8_IF_LITTLE_ENDIAN(c) (c) +#else +#define CSI_BITSWAP8_IF_LITTLE_ENDIAN(c) CSI_BITSWAP8(c) +#endif + +typedef enum _csi_status { + CSI_STATUS_SUCCESS = CAIRO_STATUS_SUCCESS, + CSI_STATUS_NO_MEMORY = CAIRO_STATUS_NO_MEMORY, + CSI_STATUS_INVALID_RESTORE = CAIRO_STATUS_INVALID_RESTORE, + CSI_STATUS_INVALID_POP_GROUP = CAIRO_STATUS_INVALID_POP_GROUP, + CSI_STATUS_NO_CURRENT_POINT = CAIRO_STATUS_NO_CURRENT_POINT, + CSI_STATUS_INVALID_MATRIX = CAIRO_STATUS_INVALID_MATRIX, + CSI_STATUS_INVALID_STATUS = CAIRO_STATUS_INVALID_STATUS, + CSI_STATUS_NULL_POINTER = CAIRO_STATUS_NULL_POINTER, + CSI_STATUS_INVALID_STRING = CAIRO_STATUS_INVALID_STRING, + CSI_STATUS_INVALID_PATH_DATA = CAIRO_STATUS_INVALID_PATH_DATA, + CSI_STATUS_READ_ERROR = CAIRO_STATUS_READ_ERROR, + CSI_STATUS_WRITE_ERROR = CAIRO_STATUS_WRITE_ERROR, + CSI_STATUS_SURFACE_FINISHED = CAIRO_STATUS_SURFACE_FINISHED, + CSI_STATUS_SURFACE_TYPE_MISMATCH = CAIRO_STATUS_SURFACE_TYPE_MISMATCH, + CSI_STATUS_PATTERN_TYPE_MISMATCH = CAIRO_STATUS_PATTERN_TYPE_MISMATCH, + CSI_STATUS_INVALID_CONTENT = CAIRO_STATUS_INVALID_CONTENT, + CSI_STATUS_INVALID_FORMAT = CAIRO_STATUS_INVALID_FORMAT, + CSI_STATUS_INVALID_VISUAL = CAIRO_STATUS_INVALID_VISUAL, + CSI_STATUS_FILE_NOT_FOUND = CAIRO_STATUS_FILE_NOT_FOUND, + CSI_STATUS_INVALID_DASH = CAIRO_STATUS_INVALID_DASH, + CSI_STATUS_INVALID_DSC_COMMENT = CAIRO_STATUS_INVALID_DSC_COMMENT, + CSI_STATUS_INVALID_INDEX = CAIRO_STATUS_INVALID_INDEX, + CSI_STATUS_CLIP_NOT_REPRESENTABLE = CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, + CSI_STATUS_TEMP_FILE_ERROR = CAIRO_STATUS_TEMP_FILE_ERROR, + CSI_STATUS_INVALID_STRIDE = CAIRO_STATUS_INVALID_STRIDE, + CSI_STATUS_FONT_TYPE_MISMATCH = CAIRO_STATUS_FONT_TYPE_MISMATCH, + CSI_STATUS_USER_FONT_IMMUTABLE = CAIRO_STATUS_USER_FONT_IMMUTABLE, + CSI_STATUS_USER_FONT_ERROR = CAIRO_STATUS_USER_FONT_ERROR, + CSI_STATUS_NEGATIVE_COUNT = CAIRO_STATUS_NEGATIVE_COUNT, + CSI_STATUS_INVALID_CLUSTERS = CAIRO_STATUS_INVALID_CLUSTERS, + CSI_STATUS_INVALID_SLANT = CAIRO_STATUS_INVALID_SLANT, + CSI_STATUS_INVALID_WEIGHT = CAIRO_STATUS_INVALID_WEIGHT, + + /* cairo-script-interpreter specific errors */ + + CSI_STATUS_INVALID_SCRIPT, + CSI_STATUS_SCRIPT_INVALID_TYPE, + CSI_STATUS_SCRIPT_INVALID_INDEX, + CSI_STATUS_SCRIPT_UNDEFINED_NAME, + CSI_STATUS_INTERPRETER_FINISHED, + + _CSI_STATUS_SCRIPT_LAST_ERROR, + CSI_INT_STATUS_UNSUPPORTED +} csi_status_t; + +typedef enum { + CSI_OBJECT_TYPE_NULL = 0, + + /* atomics */ + CSI_OBJECT_TYPE_BOOLEAN, + CSI_OBJECT_TYPE_INTEGER, + CSI_OBJECT_TYPE_MARK, + CSI_OBJECT_TYPE_NAME, + CSI_OBJECT_TYPE_OPERATOR, + CSI_OBJECT_TYPE_REAL, + + /* compound */ + CSI_OBJECT_TYPE_ARRAY = 0x8, + CSI_OBJECT_TYPE_DICTIONARY, + CSI_OBJECT_TYPE_FILE, + CSI_OBJECT_TYPE_MATRIX, + CSI_OBJECT_TYPE_STRING, + + /* cairo */ + CSI_OBJECT_TYPE_CONTEXT = 0x10, + CSI_OBJECT_TYPE_FONT, + CSI_OBJECT_TYPE_PATTERN, + CSI_OBJECT_TYPE_SCALED_FONT, + CSI_OBJECT_TYPE_SURFACE +} csi_object_type_t; + +#define CSI_OBJECT_IS_ATOM(OBJ) (((OBJ)->type & CSI_OBJECT_TYPE_MASK) < 0x08) +#define CSI_OBJECT_IS_COMPOUND(OBJ) ((OBJ)->type & 0x08) +#define CSI_OBJECT_IS_CAIRO(OBJ) ((OBJ)->type & 0x10) + +enum { /* attributes */ + CSI_OBJECT_ATTR_EXECUTABLE = 1 << 6, + CSI_OBJECT_ATTR_WRITABLE = 1 << 7 +}; +#define CSI_OBJECT_ATTR_MASK (CSI_OBJECT_ATTR_EXECUTABLE | \ + CSI_OBJECT_ATTR_WRITABLE) +#define CSI_OBJECT_TYPE_MASK (~CSI_OBJECT_ATTR_MASK) + +typedef struct _cairo_script_interpreter csi_t; + +typedef cairo_bool_t csi_boolean_t; +typedef csi_status_t (*csi_operator_t) (csi_t *); +typedef float csi_real_t; +typedef long csi_integer_t; +typedef long csi_name_t; +typedef struct _csi_array csi_array_t; +typedef struct _csi_buffer csi_buffer_t; +typedef struct _csi_compound_object csi_compound_object_t; +typedef struct _csi_dictionary csi_dictionary_t; +typedef struct _csi_file csi_file_t; +typedef struct _csi_hash_entry csi_hash_entry_t; +typedef struct _csi_hash_table csi_hash_table_t; +typedef struct _csi_hash_table_arrangement csi_hash_table_arrangement_t; +typedef struct _csi_list csi_list_t; +typedef struct _csi_matrix csi_matrix_t; +typedef struct _csi_object csi_object_t; +typedef struct _csi_scanner csi_scanner_t; +typedef struct _csi_stack csi_stack_t; +typedef struct _csi_string csi_string_t; + +typedef cairo_bool_t +(*csi_hash_predicate_func_t) (void *entry); + +typedef void +(*csi_hash_callback_func_t) (void *entry, + void *closure); + +typedef cairo_bool_t +(*csi_hash_keys_equal_func_t) (const void *key_a, const void *key_b); + +struct _csi_object { + csi_object_type_t type; + union { + cairo_t *cr; + cairo_font_face_t *font_face; + cairo_pattern_t *pattern; + cairo_scaled_font_t *scaled_font; + cairo_surface_t *surface; + csi_array_t *array; + csi_boolean_t boolean; + csi_compound_object_t *object; + csi_dictionary_t *dictionary; + csi_file_t *file; + csi_integer_t integer; + csi_matrix_t *matrix; + csi_operator_t op; + csi_name_t name; + csi_real_t real; + csi_string_t *string; + void *ptr; + } datum; +}; + +struct _csi_compound_object { + csi_object_type_t type; + unsigned int ref; +}; + +struct _csi_hash_entry { + unsigned long hash; +}; + +struct _csi_hash_table_arrangement { + unsigned long high_water_mark; + unsigned long size; + unsigned long rehash; +}; + +struct _csi_hash_table { + csi_hash_keys_equal_func_t keys_equal; + + const csi_hash_table_arrangement_t *arrangement; + csi_hash_entry_t **entries; + + unsigned long live_entries; + unsigned long used_entries; + unsigned long iterating; /* Iterating, no insert, no resize */ +}; + + +/* simple, embedded doubly-linked links */ +struct _csi_list { + struct _csi_list *next, *prev; +}; + +struct _csi_buffer { + char *base, *ptr, *end; + unsigned int size; +}; + +struct _csi_stack { + csi_object_t *objects; + csi_integer_t len; + csi_integer_t size; +}; + +struct _csi_array { + csi_compound_object_t base; + csi_stack_t stack; +}; + +typedef struct _csi_dictionary_entry { + csi_hash_entry_t hash_entry; + csi_object_t value; +} csi_dictionary_entry_t; + +struct _csi_dictionary { + csi_compound_object_t base; + csi_hash_table_t hash_table; +}; + +struct _csi_matrix { + csi_compound_object_t base; + cairo_matrix_t matrix; +}; + +struct _csi_string { + csi_compound_object_t base; + csi_integer_t len; + csi_integer_t deflate; + enum { + NONE, + ZLIB, + LZO, + } method; + char *string; +}; + +typedef struct _csi_filter_funcs { + int (*filter_getc) (csi_file_t *); + void (*filter_putc) (csi_file_t *, int); + int (*filter_read) (csi_file_t *, uint8_t *, int); + void (*filter_destroy) (csi_t *, void *); +} csi_filter_funcs_t; + +struct _csi_file { + csi_compound_object_t base; + enum { + STDIO, + BYTES, + PROCEDURE, + FILTER + } type; + unsigned int flags; + void *src; + void *data; + uint8_t *bp; + int rem; + const csi_filter_funcs_t *filter; +}; + +union _csi_union_object { + void *ptr[2]; + csi_stack_t stack; + csi_array_t arry; + csi_dictionary_t dictionary; + csi_matrix_t matrix; + csi_string_t string; + csi_file_t file; + csi_object_t object; +}; + +struct _csi_scanner { + jmp_buf jmpbuf; + int depth; + + int bind; + csi_status_t (*push) (csi_t *ctx, csi_object_t *obj); + csi_status_t (*execute) (csi_t *ctx, csi_object_t *obj); + void *closure; + + csi_buffer_t buffer; + csi_stack_t procedure_stack; + csi_object_t build_procedure; + + unsigned int accumulator; + unsigned int accumulator_count; + + unsigned int line_number; +}; + +typedef cairo_script_interpreter_hooks_t csi_hooks_t; + +typedef struct _csi_chunk { + struct _csi_chunk *next; + int rem; + char *ptr; +} csi_chunk_t; + +struct _cairo_script_interpreter { + int ref_count; + csi_status_t status; + + unsigned int finished : 1; + + csi_hooks_t hooks; + + csi_hash_table_t strings; + + csi_stack_t ostack; + csi_stack_t dstack; + + csi_scanner_t scanner; + + csi_chunk_t *perm_chunk; + struct { + csi_chunk_t *chunk; + void *free_list; + } slabs[16]; + csi_array_t *free_array; + csi_dictionary_t *free_dictionary; + csi_string_t *free_string; + + csi_operator_t opcode[256]; + + /* caches of live data */ + csi_list_t *_images; + csi_list_t *_faces; +}; + +typedef struct _csi_operator_def { + const char *name; + csi_operator_t op; +} csi_operator_def_t; + +typedef struct _csi_integer_constant_def { + const char *name; + csi_integer_t value; +} csi_integer_constant_def_t; + +typedef struct _csi_real_constant_def { + const char *name; + csi_real_t value; +} csi_real_constant_def_t; + +/* cairo-script-file.c */ + +csi_private csi_status_t +csi_file_new (csi_t *ctx, + csi_object_t *obj, + const char *path, const char *mode); + +csi_private csi_status_t +csi_file_new_for_stream (csi_t *ctx, + csi_object_t *obj, + FILE *stream); + +csi_private csi_status_t +csi_file_new_for_bytes (csi_t *ctx, + csi_object_t *obj, + const char *bytes, + unsigned int length); + +csi_private csi_status_t +csi_file_new_from_string (csi_t *ctx, + csi_object_t *obj, + csi_string_t *src); + +csi_private csi_status_t +csi_file_new_ascii85_decode (csi_t *ctx, + csi_object_t *obj, + csi_dictionary_t *dict, + csi_object_t *src); + +csi_private csi_status_t +csi_file_new_deflate_decode (csi_t *ctx, + csi_object_t *obj, + csi_dictionary_t *dict, + csi_object_t *src); + +csi_private csi_status_t +_csi_file_execute (csi_t *ctx, csi_file_t *obj); + +csi_private int +csi_file_getc (csi_file_t *obj); + +csi_private int +csi_file_read (csi_file_t *obj, void *buf, int len); + +csi_private void +csi_file_putc (csi_file_t *obj, int c); + +csi_private void +csi_file_flush (csi_file_t *obj); + +csi_private void +csi_file_close (csi_t *ctx, csi_file_t *obj); + +csi_private void +_csi_file_free (csi_t *ctx, csi_file_t *obj); + +csi_private csi_status_t +_csi_file_as_string (csi_t *ctx, + csi_file_t *file, + csi_object_t *obj); + +/* cairo-script-hash.c */ + +csi_private csi_status_t +_csi_hash_table_init (csi_hash_table_t *hash_table, + csi_hash_keys_equal_func_t keys_equal); + +csi_private void +_csi_hash_table_fini (csi_hash_table_t *hash_table); + +csi_private void * +_csi_hash_table_lookup (csi_hash_table_t *hash_table, + csi_hash_entry_t *key); + +csi_private csi_status_t +_csi_hash_table_insert (csi_hash_table_t *hash_table, + csi_hash_entry_t *entry); + +csi_private void +_csi_hash_table_remove (csi_hash_table_t *hash_table, + csi_hash_entry_t *key); + +csi_private void +_csi_hash_table_foreach (csi_hash_table_t *hash_table, + csi_hash_callback_func_t hash_callback, + void *closure); + +/* cairo-script-interpreter.c */ + +csi_private void * +_csi_alloc (csi_t *ctx, int size); + +csi_private void * +_csi_alloc0 (csi_t *ctx, int size); + +csi_private void * +_csi_realloc (csi_t *ctx, void *ptr, int size); + +csi_private void +_csi_free (csi_t *ctx, void *ptr); + +csi_private void * +_csi_slab_alloc (csi_t *ctx, int size); + +csi_private void * +_csi_perm_alloc (csi_t *ctx, int size); + +csi_private void +_csi_slab_free (csi_t *ctx, void *ptr, int size); + +csi_private csi_status_t +csi_push_ostack (csi_t *ctx, csi_object_t *obj); + +csi_private csi_status_t +_csi_name_define (csi_t *ctx, csi_name_t name, csi_object_t *obj); + +csi_private csi_status_t +_csi_name_lookup (csi_t *ctx, csi_name_t name, csi_object_t *obj); + +csi_private csi_status_t +_csi_name_undefine (csi_t *ctx, csi_name_t name); + +csi_private csi_status_t +_csi_intern_string (csi_t *ctx, const char **str_inout, int len); + +csi_private csi_status_t +_csi_error (csi_status_t status); + +/* cairo-script-objects.c */ + +csi_private csi_status_t +csi_array_new (csi_t *ctx, + csi_integer_t initial_size, + csi_object_t *obj); + +csi_private csi_status_t +_csi_array_execute (csi_t *ctx, csi_array_t *array); + +csi_private csi_status_t +csi_array_get (csi_t *ctx, + csi_array_t *array, + long elem, + csi_object_t *value); + +csi_private csi_status_t +csi_array_put (csi_t *ctx, + csi_array_t *array, + csi_integer_t elem, + csi_object_t *value); + +csi_private csi_status_t +csi_array_append (csi_t *ctx, + csi_array_t *array, + csi_object_t *obj); + +csi_private void +csi_array_free (csi_t *ctx, csi_array_t *array); + +static inline void +csi_boolean_new (csi_object_t *obj, + csi_boolean_t v) +{ + obj->type = CSI_OBJECT_TYPE_BOOLEAN; + obj->datum.boolean = v; +} + +csi_private csi_status_t +csi_dictionary_new (csi_t *ctx, + csi_object_t *obj); + +csi_private csi_status_t +csi_dictionary_put (csi_t *ctx, + csi_dictionary_t *dict, + csi_name_t name, + csi_object_t *value); + +csi_private csi_status_t +csi_dictionary_get (csi_t *ctx, + csi_dictionary_t *dict, + csi_name_t name, + csi_object_t *value); + +csi_private csi_boolean_t +csi_dictionary_has (csi_dictionary_t *dict, + csi_name_t name); + +csi_private void +csi_dictionary_remove (csi_t *ctx, + csi_dictionary_t *dict, + csi_name_t name); + +csi_private void +csi_dictionary_free (csi_t *ctx, + csi_dictionary_t *dict); + +static inline void +csi_integer_new (csi_object_t *obj, + csi_integer_t v) +{ + obj->type = CSI_OBJECT_TYPE_INTEGER; + obj->datum.integer = v; +} + + +csi_private csi_status_t +csi_matrix_new (csi_t *ctx, + csi_object_t *obj); + +csi_private csi_status_t +csi_matrix_new_from_array (csi_t *ctx, + csi_object_t *obj, + csi_array_t *array); + +csi_private csi_status_t +csi_matrix_new_from_matrix (csi_t *ctx, + csi_object_t *obj, + const cairo_matrix_t *m); + +csi_private csi_status_t +csi_matrix_new_from_values (csi_t *ctx, + csi_object_t *obj, + double v[6]); + +csi_private void +csi_matrix_free (csi_t *ctx, + csi_matrix_t *obj); + +csi_private csi_status_t +csi_name_new (csi_t *ctx, + csi_object_t *obj, + const char *str, + int len); + +csi_private csi_status_t +csi_name_new_static (csi_t *ctx, + csi_object_t *obj, + const char *str); + +static inline void +csi_operator_new (csi_object_t *obj, + csi_operator_t op) +{ + obj->type = CSI_OBJECT_TYPE_OPERATOR | CSI_OBJECT_ATTR_EXECUTABLE; + obj->datum.op = op; +} + +static inline void +csi_real_new (csi_object_t *obj, + csi_real_t v) +{ + obj->type = CSI_OBJECT_TYPE_REAL; + obj->datum.real = v; +} + +csi_private csi_status_t +csi_string_new (csi_t *ctx, + csi_object_t *obj, + const char *str, + int len); + +csi_private csi_status_t +csi_string_deflate_new (csi_t *ctx, + csi_object_t *obj, + void *bytes, + int in_len, + int out_len); + +csi_private csi_status_t +csi_string_new_from_bytes (csi_t *ctx, + csi_object_t *obj, + char *bytes, + unsigned int len); + +csi_private void +csi_string_free (csi_t *ctx, csi_string_t *string); + +csi_private csi_status_t +csi_object_execute (csi_t *ctx, csi_object_t *obj); + +csi_private csi_object_t * +csi_object_reference (csi_object_t *obj); + +csi_private void +csi_object_free (csi_t *ctx, + csi_object_t *obj); + +csi_private csi_status_t +csi_object_as_file (csi_t *ctx, + csi_object_t *src, + csi_object_t *file); + +csi_private csi_boolean_t +csi_object_eq (csi_object_t *a, + csi_object_t *b); + +csi_private csi_status_t +csi_object_compare (csi_object_t *a, + csi_object_t *b, + int *out_cmp); + +/* cairo-script-operators.c */ + +csi_private const csi_operator_def_t * +_csi_operators (void); + +csi_private const csi_integer_constant_def_t * +_csi_integer_constants (void); + +csi_private const csi_real_constant_def_t * +_csi_real_constants (void); + +/* cairo-script-scanner.c */ + +csi_private csi_status_t +_csi_scanner_init (csi_t *ctx, csi_scanner_t *scanner); + +csi_private csi_status_t +_csi_scan_file (csi_t *ctx, csi_file_t *src); + +csi_private csi_status_t +_csi_translate_file (csi_t *ctx, + csi_file_t *file, + cairo_write_func_t write_func, + void *closure); + +csi_private void +_csi_scanner_fini (csi_t *ctx, csi_scanner_t *scanner); + +csi_private csi_boolean_t +_csi_parse_number (csi_object_t *obj, const char *s, int len); + +/* cairo-script-stack.c */ + +csi_private csi_status_t +_csi_stack_init (csi_t *ctx, csi_stack_t *stack, csi_integer_t size); + +csi_private void +_csi_stack_fini (csi_t *ctx, csi_stack_t *stack); + +csi_private csi_status_t +_csi_stack_roll (csi_t *ctx, + csi_stack_t *stack, + csi_integer_t mod, + csi_integer_t n); + +csi_private csi_status_t +_csi_stack_grow (csi_t *ctx, csi_stack_t *stack, csi_integer_t cnt); + +csi_private csi_status_t +_csi_stack_push_internal (csi_t *ctx, csi_stack_t *stack, + const csi_object_t *obj); + +csi_private csi_object_t * +_csi_stack_peek (csi_stack_t *stack, csi_integer_t i); + +csi_private void +_csi_stack_pop (csi_t *ctx, csi_stack_t *stack, csi_integer_t count); + +csi_private csi_status_t +_csi_stack_exch (csi_stack_t *stack); + +static inline csi_object_type_t +csi_object_get_type (const csi_object_t *obj) +{ + return obj->type & CSI_OBJECT_TYPE_MASK; +} + +static inline csi_boolean_t +csi_object_is_procedure (const csi_object_t *obj) +{ + return obj->type == (CSI_OBJECT_TYPE_ARRAY | CSI_OBJECT_ATTR_EXECUTABLE); +} + +static inline csi_boolean_t +csi_object_is_number (const csi_object_t *obj) +{ + int type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: + case CSI_OBJECT_TYPE_INTEGER: + case CSI_OBJECT_TYPE_REAL: + return 1; + default: + return 0; + } +} + +static inline double +csi_number_get_value (const csi_object_t *obj) +{ + int type = csi_object_get_type (obj); + switch (type) { + case CSI_OBJECT_TYPE_BOOLEAN: return obj->datum.boolean; + case CSI_OBJECT_TYPE_INTEGER: return obj->datum.integer; + case CSI_OBJECT_TYPE_REAL: return obj->datum.real; + default: return 0.; + } +} + +static inline csi_status_t +_csi_stack_push (csi_t *ctx, csi_stack_t *stack, + const csi_object_t *obj) +{ + if (_csi_unlikely (stack->len == stack->size)) + return _csi_stack_push_internal (ctx, stack, obj); + + stack->objects[stack->len++] = *obj; + return CSI_STATUS_SUCCESS; +} + +static inline csi_boolean_t +_csi_check_ostack (csi_t *ctx, csi_integer_t count) +{ + return ctx->ostack.len >= count; +} + +static inline csi_object_t * +_csi_peek_ostack (csi_t *ctx, csi_integer_t i) +{ + return &ctx->ostack.objects[ctx->ostack.len - i -1]; +} + +static inline void +_csi_pop_ostack (csi_t *ctx, csi_integer_t count) +{ + do + csi_object_free (ctx, &ctx->ostack.objects[--ctx->ostack.len]); + while (--count); +} + +static inline csi_status_t +_csi_push_ostack_copy (csi_t *ctx, csi_object_t *obj) +{ + return _csi_stack_push (ctx, &ctx->ostack, csi_object_reference (obj)); +} + +static inline csi_status_t +_csi_push_ostack (csi_t *ctx, csi_object_t *obj) +{ + return _csi_stack_push (ctx, &ctx->ostack, obj); +} + +static inline csi_status_t +_csi_push_ostack_boolean (csi_t *ctx, csi_boolean_t v) +{ + csi_object_t obj; + obj.type = CSI_OBJECT_TYPE_BOOLEAN; + obj.datum.boolean = v; + return _csi_stack_push (ctx, &ctx->ostack, &obj); +} +static inline csi_status_t +_csi_push_ostack_integer (csi_t *ctx, csi_integer_t v) +{ + csi_object_t obj; + obj.type = CSI_OBJECT_TYPE_INTEGER; + obj.datum.integer = v; + return _csi_stack_push (ctx, &ctx->ostack, &obj); +} +static inline csi_status_t +_csi_push_ostack_mark (csi_t *ctx) +{ + csi_object_t obj; + obj.type = CSI_OBJECT_TYPE_MARK; + return _csi_stack_push (ctx, &ctx->ostack, &obj); +} +static inline csi_status_t +_csi_push_ostack_null (csi_t *ctx) +{ + csi_object_t obj; + obj.type = CSI_OBJECT_TYPE_NULL; + return _csi_stack_push (ctx, &ctx->ostack, &obj); +} +static inline csi_status_t +_csi_push_ostack_real (csi_t *ctx, csi_real_t v) +{ + csi_object_t obj; + obj.type = CSI_OBJECT_TYPE_REAL; + obj.datum.real = v; + return _csi_stack_push (ctx, &ctx->ostack, &obj); +} + +slim_hidden_proto_no_warn (cairo_script_interpreter_destroy); +slim_hidden_proto_no_warn (cairo_script_interpreter_reference); + +#endif /* CAIRO_SCRIPT_PRIVATE_H */ diff --git a/util/cairo-script/cairo-script-scanner.c b/util/cairo-script/cairo-script-scanner.c new file mode 100644 index 000000000..4254aa01e --- /dev/null +++ b/util/cairo-script/cairo-script-scanner.c @@ -0,0 +1,1901 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairo-script-private.h" + +#include /* INT_MAX */ +#include /* pow */ +#include /* EOF */ +#include /* for {INT,UINT}*_{MIN,MAX} */ +#include /* malloc/free */ +#include /* memset */ +#include +#include + +#if HAVE_LZO +#include +#endif + +#define DEBUG_SCAN 0 + +#if WORDS_BIGENDIAN +#define le16(x) bswap_16 (x) +#define le32(x) bswap_32 (x) +#define be16(x) x +#define be32(x) x +#define to_be32(x) x +#else +#define le16(x) x +#define le32(x) x +#define be16(x) bswap_16 (x) +#define be32(x) bswap_32 (x) +#define to_be32(x) bswap_32 (x) +#endif + +/* + * whitespace: + * 0 - nul + * 9 - tab + * A - LF + * C - FF + * D - CR + * + * syntax delimiters + * ( = 28, ) = 29 - literal strings + * < = 3C, > = 3E - hex/base85 strings, dictionary name + * [ = 5B, ] = 5D - array + * { = 7B, } = 7C - procedure + * / = 5C - literal marker + * % = 25 - comment + */ + +static void +fprintf_obj (FILE *stream, csi_t *ctx, const csi_object_t *obj) +{ + switch (csi_object_get_type (obj)) { + case CSI_OBJECT_TYPE_NULL: + fprintf (stream, "NULL\n"); + break; + + /* atomics */ + case CSI_OBJECT_TYPE_BOOLEAN: + fprintf (stream, "boolean: %s\n", + obj->datum.boolean ? "true" : "false"); + break; + case CSI_OBJECT_TYPE_INTEGER: + fprintf (stream, "integer: %ld\n", obj->datum.integer); + break; + case CSI_OBJECT_TYPE_MARK: + fprintf (stream, "mark\n"); + break; + case CSI_OBJECT_TYPE_NAME: + fprintf (stream, "name: %s\n", (char *) obj->datum.name); + break; + case CSI_OBJECT_TYPE_OPERATOR: + fprintf (stream, "operator: %p\n", obj->datum.ptr); + break; + case CSI_OBJECT_TYPE_REAL: + fprintf (stream, "real: %g\n", obj->datum.real); + break; + + /* compound */ + case CSI_OBJECT_TYPE_ARRAY: + fprintf (stream, "array\n"); + break; + case CSI_OBJECT_TYPE_DICTIONARY: + fprintf (stream, "dictionary\n"); + break; + case CSI_OBJECT_TYPE_FILE: + fprintf (stream, "file\n"); + break; + case CSI_OBJECT_TYPE_MATRIX: + fprintf (stream, "matrix: [%g %g %g %g %g %g]\n", + obj->datum.matrix->matrix.xx, + obj->datum.matrix->matrix.yx, + obj->datum.matrix->matrix.xy, + obj->datum.matrix->matrix.yy, + obj->datum.matrix->matrix.x0, + obj->datum.matrix->matrix.y0); + break; + case CSI_OBJECT_TYPE_STRING: + fprintf (stream, "string: len=%ld, defate=%ld, method=%d\n", + obj->datum.string->len, obj->datum.string->deflate, obj->datum.string->method); + break; + + /* cairo */ + case CSI_OBJECT_TYPE_CONTEXT: + fprintf (stream, "context\n"); + break; + case CSI_OBJECT_TYPE_FONT: + fprintf (stream, "font\n"); + break; + case CSI_OBJECT_TYPE_PATTERN: + fprintf (stream, "pattern\n"); + break; + case CSI_OBJECT_TYPE_SCALED_FONT: + fprintf (stream, "scaled-font\n"); + break; + case CSI_OBJECT_TYPE_SURFACE: + fprintf (stream, "surface\n"); + break; + } +} + +/* takes ownership of obj */ +static inline csi_status_t +scan_push (csi_t *ctx, csi_object_t *obj) +{ + return ctx->scanner.push (ctx, obj); +} + +static inline csi_status_t +scan_execute (csi_t *ctx, csi_object_t *obj) +{ + return ctx->scanner.execute (ctx, obj); +} + +static cairo_status_t +buffer_init (csi_t *ctx, csi_buffer_t *buffer) +{ + cairo_status_t status = CSI_STATUS_SUCCESS; + + buffer->size = 16384; + buffer->base = _csi_alloc (ctx, buffer->size); + if (_csi_unlikely (buffer->base == NULL)) { + status = _csi_error (CSI_STATUS_NO_MEMORY); + buffer->size = 0; + } + + buffer->ptr = buffer->base; + buffer->end = buffer->base + buffer->size; + + return status; +} + +static void +buffer_fini (csi_t *ctx, csi_buffer_t *buffer) +{ + _csi_free (ctx, buffer->base); +} + +static void +_buffer_grow (csi_t *ctx, csi_scanner_t *scan) +{ + int newsize; + int offset; + char *base; + + if (_csi_unlikely (scan->buffer.size > INT_MAX / 2)) + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_NO_MEMORY)); + + offset = scan->buffer.ptr - scan->buffer.base; + newsize = scan->buffer.size * 2; + base = _csi_realloc (ctx, scan->buffer.base, newsize); + if (_csi_unlikely (base == NULL)) + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_NO_MEMORY)); + + scan->buffer.base = base; + scan->buffer.ptr = base + offset; + scan->buffer.end = base + newsize; + scan->buffer.size = newsize; +} + +static inline void +buffer_check (csi_t *ctx, csi_scanner_t *scan, int count) +{ + if (_csi_unlikely (scan->buffer.ptr + count > scan->buffer.end)) + _buffer_grow (ctx, scan); +} + +static inline void +buffer_add (csi_buffer_t *buffer, int c) +{ + *buffer->ptr++ = c; +} + +static inline void +buffer_reset (csi_buffer_t *buffer) +{ + buffer->ptr = buffer->base; +} + +static void +token_start (csi_scanner_t *scan) +{ + buffer_reset (&scan->buffer); +} + +static void +token_add (csi_t *ctx, csi_scanner_t *scan, int c) +{ + buffer_check (ctx, scan, 1); + buffer_add (&scan->buffer, c); +} + +static void +token_add_unchecked (csi_scanner_t *scan, int c) +{ + buffer_add (&scan->buffer, c); +} + +csi_boolean_t +_csi_parse_number (csi_object_t *obj, const char *s, int len) +{ + int radix = 0; + long long mantissa = 0; + int exponent = 0; + int sign = 1; + int decimal = -1; + int exponent_sign = 0; + const char * const end = s + len; + + switch (*s) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + mantissa = *s - '0'; + case '+': + break; + case '-': + sign = -1; + break; + case '.': + decimal = 0; + break; + default: + return FALSE; + } + + while (++s < end) { + if (*s < '0') { + if (*s == '.') { + if (_csi_unlikely (radix)) + return FALSE; + if (_csi_unlikely (decimal != -1)) + return FALSE; + if (_csi_unlikely (exponent_sign)) + return FALSE; + + decimal = 0; + } else if (*s == '!') { + if (_csi_unlikely (radix)) + return FALSE; + if (_csi_unlikely (decimal != -1)) + return FALSE; + if (_csi_unlikely (exponent_sign)) + return FALSE; + + radix = mantissa; + mantissa = 0; + + if (_csi_unlikely (radix < 2 || radix > 36)) + return FALSE; + } else + return FALSE; + } else if (*s <= '9') { + int v = *s - '0'; + if (_csi_unlikely (radix && v >= radix)) + return FALSE; + + if (exponent_sign) { + exponent = 10 * exponent + v; + } else { + if (radix) + mantissa = radix * mantissa + v; + else + mantissa = 10 * mantissa + v; + if (decimal != -1) + decimal++; + } + } else if (*s == 'E' || * s== 'e') { + if (radix == 0) { + if (_csi_unlikely (s + 1 == end)) + return FALSE; + + exponent_sign = 1; + if (s[1] == '-') { + exponent_sign = -1; + s++; + } else if (s[1] == '+') + s++; + } else { + int v = 0xe; + + if (_csi_unlikely (v >= radix)) + return FALSE; + + mantissa = radix * mantissa + v; + } + } else if (*s < 'A') { + return FALSE; + } else if (*s <= 'Z') { + int v = *s - 'A' + 0xA; + + if (_csi_unlikely (v >= radix)) + return FALSE; + + mantissa = radix * mantissa + v; + } else if (*s < 'a') { + return FALSE; + } else if (*s <= 'z') { + int v = *s - 'a' + 0xa; + + if (_csi_unlikely (v >= radix)) + return FALSE; + + mantissa = radix * mantissa + v; + } else + return FALSE; + } + + if (exponent_sign || decimal != -1) { + if (mantissa == 0) { + obj->type = CSI_OBJECT_TYPE_REAL; + obj->datum.real = 0.; + return TRUE; + } else { + int e; + double v; + + v = mantissa; + e = exponent * exponent_sign; + if (decimal != -1) + e -= decimal; + switch (e) { + case -7: v *= 0.0000001; break; + case -6: v *= 0.000001; break; + case -5: v *= 0.00001; break; + case -4: v *= 0.0001; break; + case -3: v *= 0.001; break; + case -2: v *= 0.01; break; + case -1: v *= 0.1; break; + case 0: break; + case 1: v *= 10; break; + case 2: v *= 100; break; + case 3: v *= 1000; break; + case 4: v *= 10000; break; + case 5: v *= 100000; break; + case 6: v *= 1000000; break; + default: + v *= pow (10, e); /* XXX */ + break; + } + + obj->type = CSI_OBJECT_TYPE_REAL; + obj->datum.real = sign * v; + return TRUE; + } + } else { + obj->type = CSI_OBJECT_TYPE_INTEGER; + obj->datum.integer = sign * mantissa; + return TRUE; + } +} + +static void +token_end (csi_t *ctx, csi_scanner_t *scan, csi_file_t *src) +{ + cairo_status_t status; + char *s; + csi_object_t obj; + int len; + + /* + * Any token that consists entirely of regular characters and + * cannot be interpreted as a number is treated as a name object + * (more precisely, an executable name). All characters except + * delimiters and white-space characters can appear in names, + * including characters ordinarily considered to be punctuation. + */ + + if (_csi_unlikely (scan->buffer.ptr == scan->buffer.base)) + return; + + s = scan->buffer.base; + len = scan->buffer.ptr - scan->buffer.base; + + if (_csi_likely (! scan->bind)) { + if (s[0] == '{') { /* special case procedures */ + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) { + status = _csi_stack_push (ctx, + &scan->procedure_stack, + &scan->build_procedure); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + } + + status = csi_array_new (ctx, 0, &scan->build_procedure); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + scan->build_procedure.type |= CSI_OBJECT_ATTR_EXECUTABLE; + return; + } else if (s[0] == '}') { + if (_csi_unlikely + (scan->build_procedure.type == CSI_OBJECT_TYPE_NULL)) + { + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + } + + if (scan->procedure_stack.len) { + csi_object_t *next; + + next = _csi_stack_peek (&scan->procedure_stack, 0); + status = csi_array_append (ctx, next->datum.array, + &scan->build_procedure); + scan->build_procedure = *next; + scan->procedure_stack.len--; + } else { + status = scan_push (ctx, &scan->build_procedure); + scan->build_procedure.type = CSI_OBJECT_TYPE_NULL; + } + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + return; + } + } + + if (s[0] == '/') { + if (len >= 2 && s[1] == '/') { /* substituted name */ + status = csi_name_new (ctx, &obj, s + 2, len - 2); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + status = _csi_name_lookup (ctx, obj.datum.name, &obj); + } else { /* literal name */ + status = csi_name_new (ctx, &obj, s + 1, len - 1); + } + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + } else { + if (! _csi_parse_number (&obj, s, len)) { + status = csi_name_new (ctx, &obj, s, len); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + obj.type |= CSI_OBJECT_ATTR_EXECUTABLE; + } + } + + /* consume whitespace after token, before calling the interpreter */ + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) { + status = csi_array_append (ctx, + scan->build_procedure.datum.array, + &obj); + } else if (obj.type & CSI_OBJECT_ATTR_EXECUTABLE) { + status = scan_execute (ctx, &obj); + csi_object_free (ctx, &obj); + } else { + status = scan_push (ctx, &obj); + } + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); +} + +static void +string_add (csi_t *ctx, csi_scanner_t *scan, int c) +{ + buffer_check (ctx, scan, 1); + buffer_add (&scan->buffer, c); +} + +static void +string_end (csi_t *ctx, csi_scanner_t *scan) +{ + csi_object_t obj; + cairo_status_t status; + + status = csi_string_new (ctx, + &obj, + scan->buffer.base, + scan->buffer.ptr - scan->buffer.base); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) + status = csi_array_append (ctx, + scan->build_procedure.datum.array, + &obj); + else + status = scan_push (ctx, &obj); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); +} + +static int +hex_value (int c) +{ + if (c < '0') + return EOF; + if (c <= '9') + return c - '0'; + c |= 32; + if (c < 'a') + return EOF; + if (c <= 'f') + return c - 'a' + 0xa; + return EOF; +} + +static void +hex_add (csi_t *ctx, csi_scanner_t *scan, int c) +{ + if (scan->accumulator_count == 0) { + scan->accumulator |= hex_value (c) << 4; + scan->accumulator_count = 1; + } else { + scan->accumulator |= hex_value (c) << 0; + buffer_check (ctx, scan, 1); + buffer_add (&scan->buffer, scan->accumulator); + + scan->accumulator = 0; + scan->accumulator_count = 0; + } +} + +static void +hex_end (csi_t *ctx, csi_scanner_t *scan) +{ + csi_object_t obj; + cairo_status_t status; + + if (scan->accumulator_count) + hex_add (ctx, scan, '0'); + + status = csi_string_new (ctx, + &obj, + scan->buffer.base, + scan->buffer.ptr - scan->buffer.base); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) + status = csi_array_append (ctx, + scan->build_procedure.datum.array, + &obj); + else + status = scan_push (ctx, &obj); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); +} + +static void +base85_add (csi_t *ctx, csi_scanner_t *scan, int c) +{ + if (c == 'z') { + if (_csi_unlikely (scan->accumulator_count != 0)) + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + + buffer_check (ctx, scan, 4); + buffer_add (&scan->buffer, 0); + buffer_add (&scan->buffer, 0); + buffer_add (&scan->buffer, 0); + buffer_add (&scan->buffer, 0); + } else if (_csi_unlikely (c < '!' || c > 'u')) { + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + } else { + scan->accumulator = scan->accumulator*85 + c - '!'; + if (++scan->accumulator_count == 5) { + buffer_check (ctx, scan, 4); + buffer_add (&scan->buffer, (scan->accumulator >> 24) & 0xff); + buffer_add (&scan->buffer, (scan->accumulator >> 16) & 0xff); + buffer_add (&scan->buffer, (scan->accumulator >> 8) & 0xff); + buffer_add (&scan->buffer, (scan->accumulator >> 0) & 0xff); + + scan->accumulator = 0; + scan->accumulator_count = 0; + } + } +} + +static void +base85_end (csi_t *ctx, csi_scanner_t *scan, cairo_bool_t deflate) +{ + csi_object_t obj; + cairo_status_t status; + + buffer_check (ctx, scan, 4); + + switch (scan->accumulator_count) { + case 0: + break; + case 1: + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + break; + + case 2: + scan->accumulator = scan->accumulator * (85*85*85) + 85*85*85 -1; + buffer_add (&scan->buffer, (scan->accumulator >> 24) & 0xff); + break; + case 3: + scan->accumulator = scan->accumulator * (85*85) + 85*85 -1; + buffer_add (&scan->buffer, (scan->accumulator >> 24) & 0xff); + buffer_add (&scan->buffer, (scan->accumulator >> 16) & 0xff); + break; + case 4: + scan->accumulator = scan->accumulator * 85 + 84; + buffer_add (&scan->buffer, (scan->accumulator >> 24) & 0xff); + buffer_add (&scan->buffer, (scan->accumulator >> 16) & 0xff); + buffer_add (&scan->buffer, (scan->accumulator >> 8) & 0xff); + break; + } + + if (deflate) { + uLongf len = be32 (*(uint32_t *) scan->buffer.base); + Bytef *source = (Bytef *) (scan->buffer.base + sizeof (uint32_t)); + + status = csi_string_deflate_new (ctx, &obj, + source, + (Bytef *) scan->buffer.ptr - source, + len); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + } else { + status = csi_string_new (ctx, + &obj, + scan->buffer.base, + scan->buffer.ptr - scan->buffer.base); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + } + + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) + status = csi_array_append (ctx, + scan->build_procedure.datum.array, + &obj); + else + status = scan_push (ctx, &obj); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); +} + +static void +base64_add (csi_t *ctx, csi_scanner_t *scan, int c) +{ + int val; + + /* Convert Base64 character to its 6 bit nibble */ + val = scan->accumulator; + if (c =='/') { + val = (val << 6) | 63; + } else if (c =='+') { + val = (val << 6) | 62; + } else if (c >='A' && c <='Z') { + val = (val << 6) | (c -'A'); + } else if (c >='a' && c <='z') { + val = (val << 6) | (c -'a' + 26); + } else if (c >='0' && c <='9') { + val = (val << 6) | (c -'0' + 52); + } + + buffer_check (ctx, scan, 1); + switch (scan->accumulator_count++) { + case 0: + break; + + case 1: + buffer_add (&scan->buffer, (val >> 4) & 0xFF); + val &= 0xF; + break; + + case 2: + buffer_add (&scan->buffer, (val >> 2) & 0xFF); + val &= 0x3; + break; + + case 3: + buffer_add (&scan->buffer, (val >> 0) & 0xFF); + scan->accumulator_count = 0; + val = 0; + break; + } + + if (c == '=') { + scan->accumulator_count = 0; + scan->accumulator = 0; + } else { + scan->accumulator = val; + } +} + +static void +base64_end (csi_t *ctx, csi_scanner_t *scan) +{ + csi_object_t obj; + cairo_status_t status; + + switch (scan->accumulator_count) { + case 0: + break; + case 2: + base64_add (ctx, scan, (scan->accumulator << 2) & 0x3f); + base64_add (ctx, scan, '='); + break; + case 1: + base64_add (ctx, scan, (scan->accumulator << 4) & 0x3f); + base64_add (ctx, scan, '='); + base64_add (ctx, scan, '='); + break; + } + + status = csi_string_new (ctx, + &obj, + scan->buffer.base, + scan->buffer.ptr - scan->buffer.base); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) + status = csi_array_append (ctx, + scan->build_procedure.datum.array, + &obj); + else + status = scan_push (ctx, &obj); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); +} + +static void +scan_read (csi_scanner_t *scan, csi_file_t *src, void *ptr, int len) +{ + uint8_t *data = ptr; + do { + int ret = csi_file_read (src, data, len); + if (_csi_unlikely (ret == 0)) + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_READ_ERROR)); + data += ret; + len -= ret; + } while (_csi_unlikely (len)); +} + +static void +string_read (csi_t *ctx, + csi_scanner_t *scan, + csi_file_t *src, + int len, + int compressed, + csi_object_t *obj) +{ + csi_status_t status; + + status = csi_string_new (ctx, obj, NULL, len); + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + + if (compressed) { + uint32_t u32; + scan_read (scan, src, &u32, 4); + obj->datum.string->deflate = be32 (u32); + obj->datum.string->method = compressed; + } + + if (_csi_likely (len)) + scan_read (scan, src, obj->datum.string->string, len); + obj->datum.string->string[len] = '\0'; +} + +static void +_scan_file (csi_t *ctx, csi_file_t *src) +{ + csi_scanner_t *scan = &ctx->scanner; + int c, next; + union { + int8_t i8; + uint8_t u8; + int16_t i16; + uint16_t u16; + int32_t i32; + uint32_t u32; + float f; + } u; + int deflate = 0; + int string_p; + +scan_none: + while ((c = csi_file_getc (src)) != EOF) { + csi_object_t obj = { CSI_OBJECT_TYPE_NULL }; + + switch (c) { + case 0xa: + scan->line_number++; + case 0x0: + case 0x9: + case 0xc: + case 0xd: + case 0x20: /* ignore whitespace */ + break; + + case '%': + goto scan_comment; + + case '(': + goto scan_string; + + case '[': /* needs special case */ + case ']': + case '{': + case '}': + token_start (scan); + token_add_unchecked (scan, c); + token_end (ctx, scan, src); + goto scan_none; + + case '<': + next = csi_file_getc (src); + switch (next) { + case EOF: + csi_file_putc (src, '<'); + return; + case '<': + /* dictionary name */ + token_start (scan); + token_add_unchecked (scan, '<'); + token_add_unchecked (scan, '<'); + token_end (ctx, scan, src); + goto scan_none; + case '|': + deflate = 1; + case '~': + goto scan_base85; + case '{': + goto scan_base64; + default: + csi_file_putc (src, next); + goto scan_hex; + } + break; + + /* binary token */ +#define MSB_INT8 128 +#define MSB_UINT8 129 +#define MSB_INT16 130 +#define MSB_UINT16 131 +#define MSB_INT32 132 +#define LSB_INT8 MSB_INT8 +#define LSB_UINT8 MSB_UINT8 +#define LSB_INT16 133 +#define LSB_UINT16 134 +#define LSB_INT32 135 +#define MSB_FLOAT32 140 +#define LSB_FLOAT32 141 + case MSB_INT8: + scan_read (scan, src, &u.i8, 1); + csi_integer_new (&obj, u.i8); + break; + case MSB_UINT8: + scan_read (scan, src, &u.u8, 1); + csi_integer_new (&obj, u.u8); + break; + case MSB_INT16: + scan_read (scan, src, &u.i16, 2); + csi_integer_new (&obj, be16 (u.i16)); + break; + case LSB_INT16: + scan_read (scan, src, &u.i16, 2); + csi_integer_new (&obj, le16 (u.i16)); + break; + case MSB_UINT16: + scan_read (scan, src, &u.u16, 2); + csi_integer_new (&obj, be16 (u.u16)); + break; + case LSB_UINT16: + scan_read (scan, src, &u.u16, 2); + csi_integer_new (&obj, le16 (u.u16)); + break; + case MSB_INT32: + scan_read (scan, src, &u.i32, 4); + csi_integer_new (&obj, be32 (u.i32)); + break; + case LSB_INT32: + scan_read (scan, src, &u.i32, 4); + csi_integer_new (&obj, le32 (u.i32)); + break; + + case 136: /* 16.16 msb */ + scan_read (scan, src, &u.i32, 4); + csi_real_new (&obj, be32 (u.i32) / 65536.); + break; + case 137: /* 16.16 lsb */ + scan_read (scan, src, &u.i32, 4); + csi_real_new (&obj, le32 (u.i32) / 65536.); + break; + case 138: /* 24.8 msb */ + scan_read (scan, src, &u.i32, 4); + csi_real_new (&obj, be32 (u.i32) / 256.); + break; + case 139: /* 24.8 lsb */ + scan_read (scan, src, &u.i32, 4); + csi_real_new (&obj, le32 (u.i32) / 256.); + break; + case MSB_FLOAT32: + scan_read (scan, src, &u.i32, 4); + u.i32 = be32 (u.i32); + csi_real_new (&obj, u.f); + break; + case LSB_FLOAT32: + scan_read (scan, src, &u.i32, 4); + u.i32 = le32 (u.i32); + csi_real_new (&obj, u.f); + break; + +#define STRING_1 142 +#define STRING_2_MSB 144 +#define STRING_2_LSB 146 +#define STRING_4_MSB 148 +#define STRING_4_LSB 150 +#define STRING_DEFLATE 1 + case STRING_1: + case STRING_1 | STRING_DEFLATE: + scan_read (scan, src, &u.u8, 1); + string_read (ctx, scan, src, u.u8, c & STRING_DEFLATE, &obj); + break; + case STRING_2_MSB: + case STRING_2_MSB | STRING_DEFLATE: + scan_read (scan, src, &u.u16, 2); + string_read (ctx, scan, src, be16 (u.u16), c & STRING_DEFLATE, &obj); + break; + case STRING_2_LSB: + case STRING_2_LSB | STRING_DEFLATE: + scan_read (scan, src, &u.u16, 2); + string_read (ctx, scan, src, le16 (u.u16), c & STRING_DEFLATE, &obj); + break; + case STRING_4_MSB: + case STRING_4_MSB | STRING_DEFLATE: + scan_read (scan, src, &u.u32, 4); + string_read (ctx, scan, src, be32 (u.u32), c & STRING_DEFLATE, &obj); + break; + case STRING_4_LSB: + case STRING_4_LSB | STRING_DEFLATE: + scan_read (scan, src, &u.u32, 4); + string_read (ctx, scan, src, le32 (u.u32), c & STRING_DEFLATE, &obj); + break; + +#define OPCODE 152 + case OPCODE: + scan_read (scan, src, &u.u8, 1); + csi_operator_new (&obj, ctx->opcode[u.u8]); + break; + + case OPCODE | 1: + scan_read (scan, src, &u.u8, 1); + csi_operator_new (&obj, ctx->opcode[u.u8]); + obj.type &= ~CSI_OBJECT_ATTR_EXECUTABLE; + break; + +#define STRING_LZO 154 + case STRING_LZO: + scan_read (scan, src, &u.u32, 4); + string_read (ctx, scan, src, be32 (u.u32), LZO, &obj); + break; + + /* unassigned */ + case 155: + case 156: + case 157: + case 158: + case 159: + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + + case '#': /* PDF 1.2 escape code */ + { + int c_hi = csi_file_getc (src); + int c_lo = csi_file_getc (src); + c = (hex_value (c_hi) << 4) | hex_value (c_lo); + } + /* fall-through */ + default: + token_start (scan); + token_add_unchecked (scan, c); + goto scan_token; + } + + if (obj.type != CSI_OBJECT_TYPE_NULL) { + cairo_status_t status; + + if (scan->build_procedure.type != CSI_OBJECT_TYPE_NULL) { + status = csi_array_append (ctx, + scan->build_procedure.datum.array, + &obj); + } else if (obj.type & CSI_OBJECT_ATTR_EXECUTABLE) { + status = scan_execute (ctx, &obj); + csi_object_free (ctx, &obj); + } else { + status = scan_push (ctx, &obj); + } + if (_csi_unlikely (status)) + longjmp (scan->jmpbuf, status); + } + } + return; + +scan_token: + while ((c = csi_file_getc (src)) != EOF) { + switch (c) { + case 0xa: + scan->line_number++; + case 0x0: + case 0x9: + case 0xc: + case 0xd: + case 0x20: + token_end (ctx, scan, src); + goto scan_none; + + /* syntax delimiters */ + case '%': + token_end (ctx, scan, src); + goto scan_comment; + /* syntax error? */ + case '(': + token_end (ctx, scan, src); + goto scan_string; + /* XXX syntax error? */ + case ')': + token_end (ctx, scan, src); + goto scan_none; + case '/': + /* need to special case '^//?' */ + if (scan->buffer.ptr > scan->buffer.base+1 || + scan->buffer.base[0] != '/') + { + token_end (ctx, scan, src); + token_start (scan); + } + token_add_unchecked (scan, '/'); + goto scan_token; + + case '{': + case '}': + case ']': + token_end (ctx, scan, src); + token_start (scan); + token_add_unchecked (scan, c); + token_end (ctx, scan, src); + goto scan_none; + + case '<': + csi_file_putc (src, '<'); + token_end (ctx, scan, src); + goto scan_none; + + case '#': /* PDF 1.2 escape code */ + { + int c_hi = csi_file_getc (src); + int c_lo = csi_file_getc (src); + c = (hex_value (c_hi) << 4) | hex_value (c_lo); + } + /* fall-through */ + default: + token_add (ctx, scan, c); + break; + } + } + token_end (ctx, scan, src); + return; + +scan_comment: + /* discard until newline */ + while ((c = csi_file_getc (src)) != EOF) { + switch (c) { + case 0xa: + scan->line_number++; + case 0xc: + goto scan_none; + } + } + return; + +scan_string: + buffer_reset (&scan->buffer); + string_p = 1; + while ((c = csi_file_getc (src)) != EOF) { + switch (c) { + case '\\': /* escape */ + next = csi_file_getc (src); + switch (next) { + case EOF: + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + + case 'n': + string_add (ctx, scan, '\n'); + break; + case 'r': + string_add (ctx, scan, '\r'); + break; + case 't': + string_add (ctx, scan, '\t'); + break; + case 'b': + string_add (ctx, scan, '\b'); + break; + case 'f': + string_add (ctx, scan, '\f'); + break; + case '\\': + string_add (ctx, scan, '\\'); + break; + case '(': + string_add (ctx, scan, '('); + break; + case ')': + string_add (ctx, scan, ')'); + break; + + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + { /* octal code: \d{1,3} */ + int i; + + c = next - '0'; + + for (i = 0; i < 2; i++) { + next = csi_file_getc (src); + switch (next) { + case EOF: + return; + + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c = 8*c + next-'0'; + break; + + default: + csi_file_putc (src, next); + goto octal_code_done; + } + } + octal_code_done: + string_add (ctx, scan, c); + } + break; + + case 0xa: + /* skip the newline */ + next = csi_file_getc (src); /* might be compound LFCR */ + switch (next) { + case EOF: + return; + case 0xc: + break; + default: + csi_file_putc (src, next); + break; + } + scan->line_number++; + break; + case 0xc: + break; + + default: + /* ignore the '\' */ + break; + } + break; + + case '(': + string_p++; + string_add (ctx, scan, c); + break; + + case ')': + if (--string_p == 0) { + string_end (ctx, scan); + goto scan_none; + } + /* fall through */ + default: + string_add (ctx, scan, c); + break; + } + } + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + +scan_hex: + buffer_reset (&scan->buffer); + scan->accumulator_count = 0; + scan->accumulator = 0; + while ((c = csi_file_getc (src)) != EOF) { + switch (c) { + case 0xa: + scan->line_number++; + case 0x0: + case 0x9: + case 0xc: + case 0xd: + case 0x20: /* ignore whitespace */ + break; + + case '>': + hex_end (ctx, scan); /* fixup odd digit with '0' */ + goto scan_none; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + hex_add (ctx, scan, c); + break; + + default: + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + } + } + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + +scan_base85: + buffer_reset (&scan->buffer); + scan->accumulator = 0; + scan->accumulator_count = 0; + while ((c = csi_file_getc (src)) != EOF) { + switch (c) { + case '~': + next = csi_file_getc (src); + switch (next) { + case EOF: + return; + + case '>': + base85_end (ctx, scan, deflate); + deflate = 0; + goto scan_none; + } + csi_file_putc (src, next); + + /* fall-through */ + default: + base85_add (ctx, scan, c); + break; + } + } + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + +scan_base64: + buffer_reset (&scan->buffer); + scan->accumulator = 0; + scan->accumulator_count = 0; + while ((c = csi_file_getc (src)) != EOF) { + switch (c) { + case '}': + next = csi_file_getc (src); + switch (next) { + case EOF: + return; + + case '>': + base64_end (ctx, scan); + goto scan_none; + } + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + + default: + base64_add (ctx, scan, c); + break; + } + } + longjmp (scan->jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); +} + +static csi_status_t +_scan_push (csi_t *ctx, csi_object_t *obj) +{ + if (DEBUG_SCAN) { + fprintf (stderr, "push "); + fprintf_obj (stderr, ctx, obj); + } + return _csi_push_ostack (ctx, obj); +} + +static csi_status_t +_scan_execute (csi_t *ctx, csi_object_t *obj) +{ + if (DEBUG_SCAN) { + fprintf (stderr, "exec "); + fprintf_obj (stderr, ctx, obj); + } + return csi_object_execute (ctx, obj); +} + +csi_status_t +_csi_scanner_init (csi_t *ctx, csi_scanner_t *scanner) +{ + csi_status_t status; + + memset (scanner, 0, sizeof (csi_scanner_t)); + + status = buffer_init (ctx, &scanner->buffer); + if (status) + return status; + + status = _csi_stack_init (ctx, &scanner->procedure_stack, 4); + if (status) + return status; + + scanner->bind = 0; + scanner->push = _scan_push; + scanner->execute = _scan_execute; + + return CSI_STATUS_SUCCESS; +} + +void +_csi_scanner_fini (csi_t *ctx, csi_scanner_t *scanner) +{ + buffer_fini (ctx, &scanner->buffer); + _csi_stack_fini (ctx, &scanner->procedure_stack); + if (scanner->build_procedure.type != CSI_OBJECT_TYPE_NULL) + csi_object_free (ctx, &scanner->build_procedure); +} + +csi_status_t +_csi_scan_file (csi_t *ctx, csi_file_t *src) +{ + csi_status_t status; + int old_line_number; + + /* This function needs to be reentrant to handle recursive scanners. + * i.e. one script executes a second. + */ + + if (ctx->scanner.depth++ == 0) { + if ((status = setjmp (ctx->scanner.jmpbuf))) { + ctx->scanner.depth = 0; + return status; + } + } + + old_line_number = ctx->scanner.line_number; + ctx->scanner.line_number = 0; + + _scan_file (ctx, src); + + ctx->scanner.line_number = old_line_number; + + --ctx->scanner.depth; + return CSI_STATUS_SUCCESS; +} + +struct _translate_closure { + csi_dictionary_t *opcodes; + cairo_write_func_t write_func; + void *closure; +}; + +static csi_status_t +_translate_name (csi_t *ctx, + csi_name_t name, + csi_boolean_t executable, + struct _translate_closure *closure) +{ + if (executable) { + csi_dictionary_entry_t *entry; + uint16_t u16; + + /* Bind executable names. + * XXX This may break some scripts that overload system operators. + */ + entry = _csi_hash_table_lookup (&closure->opcodes->hash_table, + (csi_hash_entry_t *) &name); + if (entry == NULL) + goto STRING; + + u16 = entry->value.datum.integer; + u16 = be16 (u16); + closure->write_func (closure->closure, (unsigned char *) &u16, 2); + } else { + closure->write_func (closure->closure, (unsigned char *) "/", 1); +STRING: + closure->write_func (closure->closure, + (unsigned char *) name, + strlen ((char *) name)); + closure->write_func (closure->closure, (unsigned char *) "\n", 1); + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate_operator (csi_t *ctx, + csi_operator_t op, + csi_boolean_t executable, + struct _translate_closure *closure) +{ + csi_dictionary_entry_t *entry; + uint16_t u16; + + entry = _csi_hash_table_lookup (&closure->opcodes->hash_table, + (csi_hash_entry_t *) &op); + if (entry == NULL) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + u16 = entry->value.datum.integer; + if (! executable) + u16 += 1 << 8; + u16 = be16 (u16); + closure->write_func (closure->closure, (unsigned char *) &u16, 2); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate_integer (csi_t *ctx, + csi_integer_t i, + struct _translate_closure *closure) +{ + uint8_t hdr; + union { + int8_t i8; + uint8_t u8; + int16_t i16; + uint16_t u16; + int32_t i32; + uint32_t u32; + } u; + int len; + +#if WORDS_BIGENDIAN + if (i < INT16_MIN) { + hdr = MSB_INT32; + len = 4; + u.i32 = i; + } else if (i < INT8_MIN) { + hdr = MSB_INT16; + len = 2; + u.i16 = i; + } else if (i < 0) { + hdr = MSB_INT8; + len = 1; + u.i8 = i; + } else if (i <= UINT8_MAX) { + hdr = MSB_UINT8; + len = 1; + u.u8 = i; + } else if (i <= UINT16_MAX) { + hdr = MSB_UINT16; + len = 2; + u.u16 = i; + } else { + hdr = MSB_INT32; + len = 4; + u.u32 = i; + } +#else + if (i < INT16_MIN) { + hdr = LSB_INT32; + len = 4; + u.i32 = i; + } else if (i < INT8_MIN) { + hdr = LSB_INT16; + len = 2; + u.i16 = i; + } else if (i < 0) { + hdr = LSB_INT8; + len = 1; + u.i8 = i; + } else if (i <= UINT8_MAX) { + hdr = LSB_UINT8; + len = 1; + u.u8 = i; + } else if (i <= UINT16_MAX) { + hdr = LSB_UINT16; + len = 2; + u.u16 = i; + } else { + hdr = LSB_INT32; + len = 4; + u.u32 = i; + } +#endif + + closure->write_func (closure->closure, (unsigned char *) &hdr, 1); + closure->write_func (closure->closure, (unsigned char *) &u, len); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate_real (csi_t *ctx, + csi_real_t real, + struct _translate_closure *closure) +{ + uint8_t hdr; + + if (real >= INT32_MIN && real <= INT32_MAX && (int) real == real) + return _translate_integer (ctx, real, closure); + +#if WORDS_BIGENDIAN + hdr = MSB_FLOAT32; +#else + hdr = LSB_FLOAT32; +#endif + closure->write_func (closure->closure, (unsigned char *) &hdr, 1); + closure->write_func (closure->closure, (unsigned char *) &real, 4); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate_string (csi_t *ctx, + csi_string_t *string, + struct _translate_closure *closure) +{ + uint8_t hdr; + union { + uint8_t u8; + uint16_t u16; + uint32_t u32; + } u; + void *buf; + unsigned long hdr_len, buf_len, deflate; + int method; + + buf = string->string; + buf_len = string->len; + deflate = string->deflate; + method = string->method; + +#if HAVE_LZO + if (method == NONE && buf_len > 16) { + unsigned long mem_len = 2*string->len > LZO2A_999_MEM_COMPRESS ? 2*string->len : LZO2A_999_MEM_COMPRESS; + void *mem = malloc (mem_len); + void *work = malloc(LZO2A_999_MEM_COMPRESS); + + if (lzo2a_999_compress ((lzo_bytep) buf, buf_len, + (lzo_bytep) mem, &mem_len, + work) == 0 && + 8+2*mem_len < buf_len) + { + method = LZO; + deflate = buf_len; + buf_len = mem_len; + buf = mem; + } + else + { + free (mem); + } + + free (work); + } +#if HAVE_ZLIB + if (method == ZLIB) { + buf_len = string->deflate; + buf = malloc (string->deflate); + if (uncompress ((Bytef *) buf, &buf_len, + (Bytef *) string->string, string->len) == Z_OK) + { + if (buf_len <= 8 + 2*string->len) { + method = NONE; + deflate = 0; + } else { + unsigned long mem_len = 2*string->deflate; + void *mem = malloc (mem_len); + void *work = malloc(LZO2A_999_MEM_COMPRESS); + + if (lzo2a_999_compress ((lzo_bytep) buf, buf_len, + (lzo_bytep) mem, &mem_len, + work) == 0) + { + if (8 + mem_len > buf_len) { + method = NONE; + deflate = 0; + } else { + free (buf); + method = LZO; + deflate = buf_len; + buf_len = mem_len; + buf = mem; + assert(deflate); + } + } + else + { + free (buf); + buf = string->string; + buf_len = string->len; + } + + free (work); + } + } + else + { + free (buf); + buf = string->string; + buf_len = string->len; + } + } +#endif +#endif + + if (method == LZO) { + hdr = STRING_LZO; + u.u32 = to_be32 (buf_len); + hdr_len = 4; + } else { +#if WORDS_BIGENDIAN + if (buf_len <= UINT8_MAX) { + hdr = STRING_1; + u.u8 = buf_len; + hdr_len = 1; + } else if (buf_len <= UINT16_MAX) { + hdr = STRING_2_MSB; + u.u16 = buf_len; + hdr_len = 2; + } else { + hdr = STRING_4_MSB; + u.u32 = buf_len; + hdr_len = 4; + } +#else + if (buf_len <= UINT8_MAX) { + hdr = STRING_1; + u.u8 = buf_len; + hdr_len = 1; + } else if (buf_len <= UINT16_MAX) { + hdr = STRING_2_LSB; + u.u16 = buf_len; + hdr_len = 2; + } else { + hdr = STRING_4_LSB; + u.u32 = buf_len; + hdr_len = 4; + } +#endif + if (deflate) { + assert (method == ZLIB); + hdr |= STRING_DEFLATE; + } + } + + closure->write_func (closure->closure, (unsigned char *) &hdr, 1); + closure->write_func (closure->closure, (unsigned char *) &u, hdr_len); + if (deflate) { + uint32_t u32 = to_be32 (deflate); + closure->write_func (closure->closure, (unsigned char *) &u32, 4); + } + closure->write_func (closure->closure, (unsigned char *) buf, buf_len); + + if (buf != string->string) + free (buf); + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate_push (csi_t *ctx, csi_object_t *obj) +{ + struct _translate_closure *closure = ctx->scanner.closure; + + if (0) { + fprintf (stderr, "push "); + fprintf_obj (stderr, ctx, obj); + } + + switch (csi_object_get_type (obj)) { + case CSI_OBJECT_TYPE_NAME: + return _translate_name (ctx, obj->datum.name, FALSE, closure); + + case CSI_OBJECT_TYPE_OPERATOR: + return _translate_operator (ctx, obj->datum.op, FALSE, closure); + + case CSI_OBJECT_TYPE_INTEGER: + return _translate_integer (ctx, obj->datum.integer, closure); + + case CSI_OBJECT_TYPE_REAL: + return _translate_real (ctx, obj->datum.real, closure); + + case CSI_OBJECT_TYPE_STRING: + return _translate_string (ctx, obj->datum.string, closure); + + case CSI_OBJECT_TYPE_NULL: + case CSI_OBJECT_TYPE_BOOLEAN: + case CSI_OBJECT_TYPE_MARK: + case CSI_OBJECT_TYPE_ARRAY: + case CSI_OBJECT_TYPE_DICTIONARY: + case CSI_OBJECT_TYPE_FILE: + case CSI_OBJECT_TYPE_MATRIX: + case CSI_OBJECT_TYPE_CONTEXT: + case CSI_OBJECT_TYPE_FONT: + case CSI_OBJECT_TYPE_PATTERN: + case CSI_OBJECT_TYPE_SCALED_FONT: + case CSI_OBJECT_TYPE_SURFACE: + longjmp (ctx->scanner.jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + break; + } + + csi_object_free (ctx, obj); + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +_translate_execute (csi_t *ctx, csi_object_t *obj) +{ + struct _translate_closure *closure = ctx->scanner.closure; + + if (0) { + fprintf (stderr, "exec "); + fprintf_obj (stderr, ctx, obj); + } + + switch (csi_object_get_type (obj)) { + case CSI_OBJECT_TYPE_NAME: + return _translate_name (ctx, obj->datum.name, TRUE, closure); + + case CSI_OBJECT_TYPE_OPERATOR: + return _translate_operator (ctx, obj->datum.op, TRUE, closure); + + case CSI_OBJECT_TYPE_INTEGER: + return _translate_integer (ctx, obj->datum.integer, closure); + + case CSI_OBJECT_TYPE_REAL: + return _translate_real (ctx, obj->datum.real, closure); + + case CSI_OBJECT_TYPE_STRING: + return _translate_string (ctx, obj->datum.string, closure); + + case CSI_OBJECT_TYPE_NULL: + case CSI_OBJECT_TYPE_BOOLEAN: + case CSI_OBJECT_TYPE_MARK: + case CSI_OBJECT_TYPE_ARRAY: + case CSI_OBJECT_TYPE_DICTIONARY: + case CSI_OBJECT_TYPE_FILE: + case CSI_OBJECT_TYPE_MATRIX: + case CSI_OBJECT_TYPE_CONTEXT: + case CSI_OBJECT_TYPE_FONT: + case CSI_OBJECT_TYPE_PATTERN: + case CSI_OBJECT_TYPE_SCALED_FONT: + case CSI_OBJECT_TYPE_SURFACE: + longjmp (ctx->scanner.jmpbuf, _csi_error (CSI_STATUS_INVALID_SCRIPT)); + break; + } + + return CSI_STATUS_SUCCESS; +} + +static csi_status_t +build_opcodes (csi_t *ctx, csi_dictionary_t **out) +{ + csi_object_t obj; + csi_dictionary_t *dict; + const csi_operator_def_t *def; + csi_status_t status; + int opcode = OPCODE << 8; + + status = csi_dictionary_new (ctx, &obj); + if (_csi_unlikely (status)) + return status; + + dict = obj.datum.dictionary; + + csi_integer_new (&obj, opcode++); + status = csi_dictionary_put (ctx, dict, 0, &obj); + if (_csi_unlikely (status)) + goto FAIL; + + for (def = _csi_operators (); def->name != NULL; def++) { + csi_object_t name; + csi_dictionary_entry_t *entry; + int code; + + entry = _csi_hash_table_lookup (&dict->hash_table, + (csi_hash_entry_t *) &def->op); + if (entry == NULL) { + code = opcode++; + csi_integer_new (&obj, code); + status = csi_dictionary_put (ctx, dict, (csi_name_t) def->op, &obj); + if (_csi_unlikely (status)) + goto FAIL; + } else { + code = entry->value.datum.integer; + csi_integer_new (&obj, code); + } + assert (ctx->opcode[code & 0xff] == def->op); + + status = csi_name_new_static (ctx, &name, def->name); + if (_csi_unlikely (status)) + goto FAIL; + + status = csi_dictionary_put (ctx, dict, name.datum.name, &obj); + if (_csi_unlikely (status)) + goto FAIL; + } + + *out = dict; + return CSI_STATUS_SUCCESS; + +FAIL: + csi_dictionary_free (ctx, dict); + return status; +} + +csi_status_t +_csi_translate_file (csi_t *ctx, + csi_file_t *file, + cairo_write_func_t write_func, + void *closure) +{ + csi_status_t status; + struct _translate_closure translator; + + if ((status = setjmp (ctx->scanner.jmpbuf))) + return status; + + status = build_opcodes (ctx, &translator.opcodes); + if (_csi_unlikely (status)) + return status; + + translator.write_func = write_func; + translator.closure = closure; + ctx->scanner.closure = &translator; + + ctx->scanner.bind = 1; + ctx->scanner.push = _translate_push; + ctx->scanner.execute = _translate_execute; + + _scan_file (ctx, file); + + ctx->scanner.bind = 0; + ctx->scanner.push = _scan_push; + ctx->scanner.execute = _scan_execute; + + csi_dictionary_free (ctx, translator.opcodes); + + return CSI_STATUS_SUCCESS; +} diff --git a/util/cairo-script/cairo-script-stack.c b/util/cairo-script/cairo-script-stack.c new file mode 100644 index 000000000..b1d146c52 --- /dev/null +++ b/util/cairo-script/cairo-script-stack.c @@ -0,0 +1,196 @@ +/* + * Copyright © 2008 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + * + * Contributor(s): + * Chris Wilson + */ + +#include "cairo-script-private.h" + +#include /* INT_MAX */ +#include + +csi_status_t +_csi_stack_init (csi_t *ctx, csi_stack_t *stack, csi_integer_t size) +{ + csi_status_t status = CSI_STATUS_SUCCESS; + + stack->len = 0; + stack->size = size; + /* assert ((unsigned) size < INT_MAX / sizeof (csi_object_t)); */ + stack->objects = _csi_alloc (ctx, size * sizeof (csi_object_t)); + if (_csi_unlikely (stack->objects == NULL)) + status = _csi_error (CSI_STATUS_NO_MEMORY); + + return status; +} + +void +_csi_stack_fini (csi_t *ctx, csi_stack_t *stack) +{ + csi_integer_t n; + + for (n = 0; n < stack->len; n++) + csi_object_free (ctx, &stack->objects[n]); + + _csi_free (ctx, stack->objects); +} + +csi_status_t +_csi_stack_roll (csi_t *ctx, + csi_stack_t *stack, + csi_integer_t mod, csi_integer_t n) +{ + csi_object_t stack_copy[128]; + csi_object_t *copy; + csi_integer_t last, i, len; + + switch (mod) { /* special cases */ + case 1: + last = stack->len - 1; + stack_copy[0] = stack->objects[last]; + for (i = last; --n; i--) + stack->objects[i] = stack->objects[i-1]; + stack->objects[i] = stack_copy[0]; + return CSI_STATUS_SUCCESS; + case -1: + last = stack->len - 1; + stack_copy[0] = stack->objects[i = last - n + 1]; + for (; --n; i++) + stack->objects[i] = stack->objects[i+1]; + stack->objects[i] = stack_copy[0]; + return CSI_STATUS_SUCCESS; + } + + /* fall back to a copy */ + if (n > ARRAY_LENGTH (stack_copy)) { + if (_csi_unlikely ((unsigned) n > INT_MAX / sizeof (csi_object_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + copy = _csi_alloc (ctx, n * sizeof (csi_object_t)); + if (copy == NULL) + return _csi_error (CSI_STATUS_NO_MEMORY); + } else + copy = stack_copy; + + i = stack->len - n; + memcpy (copy, stack->objects + i, n * sizeof (csi_object_t)); + mod = -mod; + if (mod < 0) + mod += n; + last = mod; + for (len = n; n--; i++) { + stack->objects[i] = copy[last]; + if (++last == len) + last = 0; + } + + if (copy != stack_copy) + _csi_free (ctx, copy); + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +_csi_stack_grow (csi_t *ctx, csi_stack_t *stack, csi_integer_t cnt) +{ + csi_integer_t newsize; + csi_object_t *newstack; + + if (_csi_likely (cnt <= stack->size)) + return CSI_STATUS_SUCCESS; + if (_csi_unlikely ((unsigned) cnt >= INT_MAX / sizeof (csi_object_t))) + return _csi_error (CSI_STATUS_NO_MEMORY); + + newsize = stack->size; + do { + newsize *= 2; + } while (newsize <= cnt); + + newstack = _csi_realloc (ctx, + stack->objects, + newsize * sizeof (csi_object_t)); + if (_csi_unlikely (newstack == NULL)) + return _csi_error (CSI_STATUS_NO_MEMORY); + + stack->objects = newstack; + stack->size = newsize; + + return CSI_STATUS_SUCCESS; +} + +csi_status_t +_csi_stack_push_internal (csi_t *ctx, csi_stack_t *stack, + const csi_object_t *obj) +{ + csi_status_t status; + + status = _csi_stack_grow (ctx, stack, stack->size + 1); + if (_csi_unlikely (status)) + return status; + + stack->objects[stack->len++] = *obj; + return CSI_STATUS_SUCCESS; +} + +csi_object_t * +_csi_stack_peek (csi_stack_t *stack, csi_integer_t i) +{ + if (_csi_unlikely (stack->len < i)) + return NULL; + + return &stack->objects[stack->len - i -1]; +} + +void +_csi_stack_pop (csi_t *ctx, csi_stack_t *stack, csi_integer_t count) +{ + if (_csi_unlikely (stack->len < count)) + count = stack->len; + + while (count--) + csi_object_free (ctx, &stack->objects[--stack->len]); +} + +csi_status_t +_csi_stack_exch (csi_stack_t *stack) +{ + csi_object_t tmp; + csi_integer_t n; + + if (_csi_unlikely (stack->len < 2)) + return _csi_error (CSI_STATUS_INVALID_SCRIPT); + + n = stack->len - 1; + tmp = stack->objects[n]; + stack->objects[n] = stack->objects[n - 1]; + stack->objects[n - 1] = tmp; + + return CSI_STATUS_SUCCESS; +} diff --git a/util/cairo-script/csi-bind.c b/util/cairo-script/csi-bind.c new file mode 100644 index 000000000..91b58fb95 --- /dev/null +++ b/util/cairo-script/csi-bind.c @@ -0,0 +1,76 @@ +#include +#include + +#include +#include + +static cairo_status_t +write_func (void *closure, + const unsigned char *data, + unsigned int length) +{ + if (fwrite (data, length, 1, closure) != 1) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +int +main (int argc, char **argv) +{ + FILE *in = stdin, *out = stdout; + cairo_status_t status; + int i; + + if (argc >= 3) { + if (strcmp (argv[argc-1], "-")) { + out = fopen (argv[argc-1], "w"); + if (out == NULL) { + fprintf (stderr, "Failed to open output '%s'\n", argv[argc-1]); + return 1; + } + } + } + + if (argc > 2) { + for (i = 1; i < argc - 1; i++) { + in = fopen (argv[i], "r"); + if (in == NULL) { + fprintf (stderr, "Failed to open input '%s'\n", argv[i]); + return 1; + } + + status = cairo_script_interpreter_translate_stream (in, write_func, out); + fclose (in); + + if (status) + break; + } + } else { + if (argc > 1) { + if (strcmp (argv[1], "-")) { + in = fopen (argv[1], "r"); + if (in == NULL) { + fprintf (stderr, "Failed to open input '%s'\n", argv[1]); + return 1; + } + } + } + + status = cairo_script_interpreter_translate_stream (in, write_func, out); + + if (in != stdin) + fclose (in); + } + + if (out != stdout) + fclose (out); + + if (status) { + fprintf (stderr, "Translation failed: %s\n", + cairo_status_to_string (status)); + return status; + } + + return status; +} diff --git a/util/cairo-script/csi-exec.c b/util/cairo-script/csi-exec.c new file mode 100644 index 000000000..d30b1c9c8 --- /dev/null +++ b/util/cairo-script/csi-exec.c @@ -0,0 +1,41 @@ +#include +#include + +#include +#include + +static cairo_surface_t * +_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); +} + +int +main (int argc, char **argv) +{ + const cairo_script_interpreter_hooks_t hooks = { + .surface_create = _surface_create + }; + cairo_script_interpreter_t *csi; + int i; + + for (i = 1; i < argc; i++) { + int status, line; + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + cairo_script_interpreter_run (csi, argv[i]); + line = cairo_script_interpreter_get_line_number (csi); + status = cairo_script_interpreter_destroy (csi); + if (status) { + fprintf (stderr, "Error during replay of '%s', line %d: %d\n", + argv[i], line, status); + return 1; + } + } + + return 0; +} diff --git a/util/cairo-script/csi-replay.c b/util/cairo-script/csi-replay.c new file mode 100644 index 000000000..67fed3b33 --- /dev/null +++ b/util/cairo-script/csi-replay.c @@ -0,0 +1,360 @@ +#include +#include + +#include +#include +#include + +static const cairo_user_data_key_t _key; + +#define SINGLE_SURFACE 1 + +#if SINGLE_SURFACE +static cairo_surface_t * +_similar_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_surface_create_similar (closure, content, width, height); +} + +static struct list { + struct list *next; + cairo_t *context; + cairo_surface_t *surface; +} *list; + +static cairo_t * +_context_create (void *closure, cairo_surface_t *surface) +{ + cairo_t *cr = cairo_create (surface); + struct list *l = malloc (sizeof (*l)); + l->next = list; + l->context = cr; + l->surface = cairo_surface_reference (surface); + list = l; + return cr; +} + +static void +_context_destroy (void *closure, void *ptr) +{ + struct list *l, **prev = &list; + while ((l = *prev) != NULL) { + if (l->context == ptr) { + if (cairo_surface_status (l->surface) == CAIRO_STATUS_SUCCESS) { + cairo_t *cr = cairo_create (closure); + cairo_set_source_surface (cr, l->surface, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + } + + cairo_surface_destroy (l->surface); + *prev = l->next; + free (l); + return; + } + prev = &l->next; + } +} +#endif + +#if CAIRO_HAS_XLIB_SURFACE +#include +static Display * +_get_display (void) +{ + static Display *dpy; + + if (dpy != NULL) + return dpy; + + dpy = XOpenDisplay (NULL); + if (dpy == NULL) { + fprintf (stderr, "Failed to open display.\n"); + exit (1); + } + + return dpy; +} + +static void +_destroy_window (void *closure) +{ + XFlush (_get_display ()); + XDestroyWindow (_get_display(), (Window) closure); +} + +static cairo_surface_t * +_xlib_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + Display *dpy; + XSetWindowAttributes attr; + Visual *visual; + int depth; + Window w; + cairo_surface_t *surface; + + dpy = _get_display (); + + visual = DefaultVisual (dpy, DefaultScreen (dpy)); + depth = DefaultDepth (dpy, DefaultScreen (dpy)); + attr.override_redirect = True; + w = XCreateWindow (dpy, DefaultRootWindow (dpy), 0, 0, + width <= 0 ? 1 : width, + height <= 0 ? 1 : height, + 0, depth, + InputOutput, visual, CWOverrideRedirect, &attr); + XMapWindow (dpy, w); + + surface = cairo_xlib_surface_create (dpy, w, visual, width, height); + cairo_surface_set_user_data (surface, &_key, (void *) w, _destroy_window); + + return surface; +} + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +#include + +static void +_destroy_pixmap (void *closure) +{ + XFreePixmap (_get_display(), (Pixmap) closure); +} + +static cairo_surface_t * +_xrender_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + Display *dpy; + Pixmap pixmap; + XRenderPictFormat *xrender_format; + cairo_surface_t *surface; + + dpy = _get_display (); + + content = CAIRO_CONTENT_COLOR_ALPHA; + + switch (content) { + case CAIRO_CONTENT_COLOR_ALPHA: + xrender_format = XRenderFindStandardFormat (dpy, PictStandardARGB32); + break; + case CAIRO_CONTENT_COLOR: + xrender_format = XRenderFindStandardFormat (dpy, PictStandardRGB24); + break; + case CAIRO_CONTENT_ALPHA: + default: + xrender_format = XRenderFindStandardFormat (dpy, PictStandardA8); + } + + pixmap = XCreatePixmap (dpy, DefaultRootWindow (dpy), + width, height, xrender_format->depth); + + surface = cairo_xlib_surface_create_with_xrender_format (dpy, pixmap, + DefaultScreenOfDisplay (dpy), + xrender_format, + width, height); + cairo_surface_set_user_data (surface, &_key, + (void *) pixmap, _destroy_pixmap); + + return surface; +} +#endif +#endif + +#if CAIRO_HAS_GL_GLX_SURFACE +#include +static cairo_gl_context_t * +_glx_get_context (cairo_content_t content) +{ + static cairo_gl_context_t *context; + + if (context == NULL) { + int rgba_attribs[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + None + }; + XVisualInfo *visinfo; + GLXContext gl_ctx; + Display *dpy; + + dpy = XOpenDisplay (NULL); + if (dpy == NULL) { + fprintf (stderr, "Failed to open display.\n"); + exit (1); + } + + visinfo = glXChooseVisual (dpy, DefaultScreen (dpy), rgba_attribs); + if (visinfo == NULL) { + fprintf (stderr, "Failed to create RGBA, double-buffered visual\n"); + exit (1); + } + + gl_ctx = glXCreateContext (dpy, visinfo, NULL, True); + XFree (visinfo); + + context = cairo_glx_context_create (dpy, gl_ctx); + } + + return context; +} + +static cairo_surface_t * +_glx_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + return cairo_gl_surface_create (_glx_get_context (content), + content, width, height); +} +#endif + +#if CAIRO_HAS_PDF_SURFACE +#include +static cairo_surface_t * +_pdf_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_pdf_surface_create_for_stream (NULL, NULL, width, height); +} +#endif + +#if CAIRO_HAS_PS_SURFACE +#include +static cairo_surface_t * +_ps_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_ps_surface_create_for_stream (NULL, NULL, width, height); +} +#endif + +#if CAIRO_HAS_SVG_SURFACE +#include +static cairo_surface_t * +_svg_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_svg_surface_create_for_stream (NULL, NULL, width, height); +} +#endif + +static cairo_surface_t * +_image_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); +} + +int +main (int argc, char **argv) +{ + cairo_script_interpreter_t *csi; + cairo_script_interpreter_hooks_t hooks = { +#if SINGLE_SURFACE + .surface_create = _similar_surface_create, + .context_create = _context_create, + .context_destroy = _context_destroy +#elif CAIRO_HAS_XLIB_XRENDER_SURFACE + .surface_create = _xrender_surface_create +#elif CAIRO_HAS_XLIB_SURFACE + .surface_create = _xlib_surface_create +#elif CAIRO_PDF_SURFACE + .surface_create = _pdf_surface_create +#elif CAIRO_PS_SURFACE + .surface_create = _ps_surface_create +#elif CAIRO_SVG_SURFACE + .surface_create = _svg_surface_create +#else + .surface_create = _image_surface_create +#endif + }; + int i; + const struct backends { + const char *name; + csi_surface_create_func_t create; + } backends[] = { + { "--image", _image_surface_create }, +#if CAIRO_HAS_XLIB_XRENDER_SURFACE + { "--xrender", _xrender_surface_create }, +#endif +#if CAIRO_HAS_GL_GLX_SURFACE + { "--glx", _glx_surface_create }, +#endif +#if CAIRO_HAS_XLIB_SURFACE + { "--xlib", _xlib_surface_create }, +#endif +#if CAIRO_HAS_PDF_SURFACE + { "--pdf", _pdf_surface_create }, +#endif +#if CAIRO_HAS_PS_SURFACE + { "--ps", _ps_surface_create }, +#endif +#if CAIRO_HAS_SVG_SURFACE + { "--svg", _svg_surface_create }, +#endif + { NULL, NULL } + }; + +#if SINGLE_SURFACE + hooks.closure = backends[0].create (NULL, + CAIRO_CONTENT_COLOR_ALPHA, + 512, 512, + 0); +#endif + + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + + for (i = 1; i < argc; i++) { + const struct backends *b; + + for (b = backends; b->name != NULL; b++) { + if (strcmp (b->name, argv[i]) == 0) { +#if SINGLE_SURFACE + cairo_surface_destroy (hooks.closure); + hooks.closure = b->create (NULL, + CAIRO_CONTENT_COLOR_ALPHA, + 512, 512, + 0); +#else + hooks.surface_create = b->create; +#endif + cairo_script_interpreter_install_hooks (csi, &hooks); + break; + } + } + + if (b->name == NULL) + cairo_script_interpreter_run (csi, argv[i]); + } + cairo_surface_destroy (hooks.closure); + + return cairo_script_interpreter_destroy (csi); +} diff --git a/util/cairo-script/csi-trace.c b/util/cairo-script/csi-trace.c new file mode 100644 index 000000000..a0466a35b --- /dev/null +++ b/util/cairo-script/csi-trace.c @@ -0,0 +1,48 @@ +#include +#include + +#include +#include +#include +#include + +static cairo_surface_t * +_script_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + return cairo_script_surface_create (closure, content, width, height); +} + +int +main (int argc, char **argv) +{ + cairo_script_interpreter_t *csi; + cairo_script_interpreter_hooks_t hooks = { + .surface_create = _script_surface_create, + }; + int i; + char buf[4096]; + + csi = cairo_script_interpreter_create (); + + for (i = 1; i < argc; i++) { + if (strcmp (argv[i], "--version")) { + printf ("%s: version %s\n", argv[0], __DATE__); + exit (0); + } else if (strcmp (argv[i], "--help")) { + printf ("usage: %s < in > out\n", argv[0]); + exit (0); + } + + snprintf (buf, sizeof (buf), "%s.trace", basename (argv[i])); + cairo_device_destroy (hooks.closure); + hooks.closure = cairo_script_create (buf); + cairo_script_interpreter_install_hooks (csi, &hooks); + cairo_script_interpreter_run (csi, argv[i]); + } + cairo_device_destroy (hooks.closure); + + return cairo_script_interpreter_destroy (csi); +} diff --git a/util/cairo-script/examples/Makefile.am b/util/cairo-script/examples/Makefile.am new file mode 100644 index 000000000..a87f02d9a --- /dev/null +++ b/util/cairo-script/examples/Makefile.am @@ -0,0 +1,10 @@ +EXTRA_DIST = \ + dragon.cs \ + hilbert.cs \ + infinichess.cs \ + interference.cs \ + pythagoras-tree.cs \ + sierpinski.cs \ + wedgeAnnulus_crop_ybRings.cs \ + world-map.cs \ + zrusin.cs diff --git a/util/cairo-script/examples/Makefile.in b/util/cairo-script/examples/Makefile.in new file mode 100644 index 000000000..357a65767 --- /dev/null +++ b/util/cairo-script/examples/Makefile.in @@ -0,0 +1,551 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = util/cairo-script/examples +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +EXTRA_DIST = \ + dragon.cs \ + hilbert.cs \ + infinichess.cs \ + interference.cs \ + pythagoras-tree.cs \ + sierpinski.cs \ + wedgeAnnulus_crop_ybRings.cs \ + world-map.cs \ + zrusin.cs + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-script/examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-script/examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-script/examples/dragon.cs b/util/cairo-script/examples/dragon.cs new file mode 100644 index 000000000..1060ca699 --- /dev/null +++ b/util/cairo-script/examples/dragon.cs @@ -0,0 +1,48 @@ +%!CairoScript +/pot { % n -- n + 1 sub + dup -1 bitshift or + dup -2 bitshift or + dup -4 bitshift or + dup -8 bitshift or + dup -16 bitshift or + 1 add +} bind def + +/direction { % i -- bool + dup 2 lt { pop true } { + dup 1 add dup pot dup 3 -1 roll eq { pop pop true } { + 2 div 1 sub 2 mul exch sub direction not + } ifelse + } ifelse +} bind def + +/path { % cr dx dy -- cr + 0 1 2048 { + 4 1 roll 3 copy L pop 4 -1 roll direction { + exch neg + } { + neg exch + } ifelse + } for + pop pop +} bind def + +dict + /width 512 set + /height 512 set + surface context + +1 g set-source paint + +//LINE_CAP_ROUND set-line-cap +//LINE_JOIN_ROUND set-line-join +4 set-line-width + +256 256 m 12 0 path 0 0 0 rgb set-source stroke +256 256 m -12 0 path 1 0 0 rgb set-source stroke +256 256 m 0 12 path 0 1 0 rgb set-source stroke +256 256 m 0 -12 path 0 0 1 rgb set-source stroke + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/hilbert.cs b/util/cairo-script/examples/hilbert.cs new file mode 100644 index 000000000..4278bf74c --- /dev/null +++ b/util/cairo-script/examples/hilbert.cs @@ -0,0 +1,51 @@ +%!CairoScript + +/hA { % cr dist lvl *hA* cr dist + dup not { pop } { + 1 sub + 3 copy hB 0 exch L pop + 3 copy hA 0 L pop + 3 copy hA neg 0 exch L pop + hC + } ifelse +} bind def + +/hB { % cr dist lvl *hB* cr dist + dup not { pop } { + 1 sub + 3 copy hA 0 L pop + 3 copy hB 0 exch L pop + 3 copy hB neg 0 L pop + hD + } ifelse +} bind def + +/hC { % cr dist lvl *hC* cr dist + dup not { pop } { + 1 sub + 3 copy hD neg 0 L pop + 3 copy hC neg 0 exch L pop + 3 copy hC 0 L pop + hA + } ifelse +} bind def + +/hD { % cr dist lvl *hD* cr dist + dup not { pop } { + 1 sub + 3 copy hC neg 0 exch L pop + 3 copy hD neg 0 L pop + 3 copy hD 0 exch L pop + hB + } ifelse +} bind def + +dict + /width 1024 set + /height 1024 set + surface context + +2 2 m 4 10 hA pop 1 g set-source stroke + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/infinichess.cs b/util/cairo-script/examples/infinichess.cs new file mode 100644 index 000000000..f82b10278 --- /dev/null +++ b/util/cairo-script/examples/infinichess.cs @@ -0,0 +1,29 @@ +/xdef { exch def } def +/-rot { 3 1 roll } def +/rot { 3 -1 roll } def +/2dup { 2 copy } def + +/SIZE 600. def +<< /width SIZE /height SIZE >> surface context +1 1 1 set-source-rgb paint +0 0 0 set-source-rgb +EVEN_ODD set-fill-rule +SIZE SIZE scale + +0.5 0 translate + +save +1 1 scale +/n 90 def +n neg 1 n { + /x xdef + 0 0 m + x 1 l + x 0.5 add 1 l + 0 0 l +} for +restore +fill + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/interference.cs b/util/cairo-script/examples/interference.cs new file mode 100644 index 000000000..6d2ee2200 --- /dev/null +++ b/util/cairo-script/examples/interference.cs @@ -0,0 +1,46 @@ +/rot { 3 -1 roll } def +/2dup { 2 copy } def + +/circle { % context radius -- context + 2dup 0 m pop + 0 0 rot 0 math.2pi arc h +} def + +/circles { % context #circles -- context + 1 1 rot { circle } for +} def + +/SIDE 600. def +/SIZE 600. def +<< /width SIZE /height SIZE >> surface context +1 1 1 set-source-rgb paint +0 0 0 set-source-rgb +//EVEN_ODD set-fill-rule + +/r 4 def +/n SIDE 1.5 mul r div integer def + +SIZE SIDE div dup scale + +save + 302 200 translate + r dup scale + n circles +restore + +save + 100 300 translate + r dup scale + n circles +restore + +save + 500 400 translate + r dup scale + n circles +restore + +fill + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/pythagoras-tree.cs b/util/cairo-script/examples/pythagoras-tree.cs new file mode 100644 index 000000000..96b4b39bc --- /dev/null +++ b/util/cairo-script/examples/pythagoras-tree.cs @@ -0,0 +1,53 @@ +%!CairoScript + +/pi4 0.785398163 def +/sqrt2 1.414213562 def + +/R { % cr size *R* cr + dup 1 lt { pop } { + exch /current-point get % size cr x y + 4 2 roll % x y size cr + + % draw a rectangle in relative co-ordinates + 1 index 2 div neg dup exch M + 1 index 0 L + 0 2 index L + 1 index neg 0 L + h + + save + 1 index dup 2 div neg exch translate + 4 2 roll 3 copy % size cr x y cr x y + m + //pi4 rotate + pop 4 2 roll % x y size cr + 1 index //sqrt2 div + R + restore + + save + 1 index dup 2 div exch translate + 4 2 roll 3 copy % size cr x y cr x y + m + //pi4 neg rotate + pop 4 2 roll % x y size cr + 1 index //sqrt2 div + R + restore + + 4 1 roll pop pop pop + } ifelse +} bind def + +dict + /width 1024 set + /height 512 set + surface context + +1 1 1 set-source-rgb paint + +0 512 translate 1 -1 scale +512 64 m 128. R 0 0 0 set-source-rgb fill + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/sierpinski.cs b/util/cairo-script/examples/sierpinski.cs new file mode 100644 index 000000000..6f959083b --- /dev/null +++ b/util/cairo-script/examples/sierpinski.cs @@ -0,0 +1,37 @@ +%!CairoScript + +/1sqrt3 0.577359269 def + +/T { % cr size -- cr + exch % size cr + 0 0 m 1 index 0 l 1 index dup 2 div exch //1sqrt3 mul l h + + exch 2 div + dup 4 ge { + exch % size/2 cr + + 1 index T + save 1 index 0 translate 1 index T restore + save 1 index dup 2 div exch //1sqrt3 mul translate 1 index T restore + + exch + } if + pop +} bind def + +dict + /width 512 set + /height 300 set + surface context + +1 1 1 set-source-rgb paint + +.5 set-line-width + +0 300 translate +1 -1 scale + +512 T 0 0 0 set-source-rgb stroke + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/wedgeAnnulus_crop_ybRings.cs b/util/cairo-script/examples/wedgeAnnulus_crop_ybRings.cs new file mode 100644 index 000000000..5aeb97f6e --- /dev/null +++ b/util/cairo-script/examples/wedgeAnnulus_crop_ybRings.cs @@ -0,0 +1,30 @@ +/SIDE 600 def + +<< /width SIDE /height SIDE >> surface context + +1 1 1 rgb set-source +paint + +SIDE dup scale +0.5 0.5 translate +0.5 -0.5 scale + +/theta math.pi 10 div def + +10 { + N + 0 0 1.0 0 //theta arc + 0 0 0.2 //theta 0 arc- + h + //theta rotate + //theta rotate +} repeat + +0 0 0.2 0 0 1 radial + 0.0 1 1 0 1 add-color-stop + 1.0 0 0 1 1 add-color-stop +set-source +fill + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/world-map.cs b/util/cairo-script/examples/world-map.cs new file mode 100644 index 000000000..54d9a8f31 --- /dev/null +++ b/util/cairo-script/examples/world-map.cs @@ -0,0 +1,209 @@ +%!CairoScript +% The data for this test case was provided by Gary Nicholson +% who originally created an interactive SVG map +% of the world as can be seen here: +% +% http://www.wherearewe.co.nz/svg.html +% +% The data is used here by permission from Gary given on 2006-11-08: +% +% Thanks for asking, I don't need any attribution if you are +% only using the vectors and not the entire map with +% interactivity etc. So feel free to do what you wish with +% the data. + +/N { + 2 index + .75 .75 .75 set-source-rgb fill+ + .5 .5 .5 set-source-rgb stroke + pop + m +} bind def + +% simpler if these had been expressed in relative coords... +/H { + exch /current-point get exch pop % x cr y + 3 -1 roll exch l +} bind def + +/V { + exch /current-point get pop % y cr x + 3 -1 roll l +} bind def + +dict + /width 800 set + /height 400 set + surface context + +.68 .85 .90 set-source-rgb paint +.2 set-line-width + +413.519 90.071 N .136 -.348 L -.31 -.204 L -.017 -.327 L .213 -.322 L .245 -.147 L .142 -.08 L .225 .072 L .062 .301 L .41 .312 L .466 .096 L -.044 .288 L -.248 .144 L .074 .353 L -.145 -.063 L -.568 -.011 L -.642 -.063 L +421.683 94.397 N .193 .336 L -.266 .274 L .214 .288 L -.09 .192 L .622 .062 L .008 .144 L .55 .242 L .579 -.332 L .215 .117 L -.029 .171 L -.126 .309 L .112 .212 L -.038 .192 L -.315 -.051 L -.176 -.162 L -.283 .091 L -.081 .273 L .244 .131 L -.228 .415 L -.244 -.333 L -.469 .05 L -.071 .122 L -.216 .03 L -.23 -.142 L -.143 -.354 L -.371 .081 L .019 .333 L -.425 .384 L -.018 .535 L -.285 .151 L -.385 -.312 L .098 -.182 L -.311 -.071 L -.534 -.363 L -.016 -.415 L -.777 .404 L .103 .212 L -.349 .432 L -.275 .16 L -.629 -.168 L -.627 .204 L -.599 -.062 L -.102 -.424 L -.312 -.806 L -.616 .147 L -.854 .668 L -.369 -.111 L .238 -.226 L .013 -.322 L -.08 -.137 L .089 -.294 L .718 -.418 L -.038 -.315 L .575 -.24 L .012 -.076 L .528 -.494 L .173 -.035 L -.116 -.089 L -.153 -.028 L .221 -.302 L .446 .007 L -.005 .096 L .473 .007 L .385 -.309 L .271 .089 L .272 -.117 L .271 .096 L .567 -.158 L .278 .11 L .354 -.021 L -.179 -.199 L .709 -.199 L .017 .151 L .199 -.014 L .149 .089 L .852 .007 L .664 .261 L +421.394 104.558 N .104 .175 L .04 .256 L -.06 .475 L .118 .054 L .062 .333 L -.076 .795 L -.211 .327 L -.118 .724 L -.292 .501 L -.298 -.043 L -.057 -.196 L -.41 -.076 L -.227 -.152 L .284 -.207 L -.07 -.076 L -.437 -.098 L .257 -.332 L -.11 -.071 L -.291 .071 L -.053 -.147 L .115 -.022 L .175 -.158 L -.094 -.153 L -.257 -.082 L .015 -.164 L .247 -.12 L -.284 -.218 L .241 -.284 L .6 -.305 L .27 -.022 L .04 -.125 L .292 -.043 L .195 .104 L .096 -.142 L -.022 -.344 L .072 -.224 L .143 -.011 L h 396.323 103.853 m .375 -.122 L .411 -.365 L .549 -2.299 L .397 -.091 L -.21 -.29 L -.226 .259 L .125 -1.144 L .223 -.826 L .115 .153 L .496 .306 L .191 .382 L .191 .229 L -.281 -.673 L -.63 -.582 L -.242 -.233 L .024 -.249 L .359 -.477 L -.202 -.375 L -.2 -.274 L -.326 -.216 L -.685 -.1 L -.515 -.571 L -.416 -.323 L .278 -.426 L -.233 -.181 L -.343 -.131 L -.511 -.142 L -.184 -.173 L .247 -.376 L -.329 -.173 L -.509 .179 L -.489 -.249 L -.824 -.251 L -.619 -.181 L -.325 .014 L -.215 -.25 L -.91 .167 L -.059 -.25 L -.265 -.125 L -.367 -.042 L -.056 -.104 L .861 -.083 L -.085 -.229 L -.526 -.104 L .442 -.104 L .086 -.205 L -.275 .017 L -.263 -.021 L -.417 .083 L .04 -.438 L .303 .012 L .305 -.146 L .526 -.088 L .562 -.174 L .215 .188 L .18 -.167 L .474 .063 L .112 -.26 L .272 -.059 L .764 -.078 L .393 .366 L .275 .26 L .342 .083 L .652 -.271 L .317 .167 L .276 -.127 L .457 -.124 L .029 .23 L .591 -.065 L .3 -.103 L -.265 -.188 L -.028 -.251 L .056 -.345 L -.037 -.428 L -.131 .021 L -.562 -.682 L -.11 -.407 L .927 .126 L .607 -.105 L -.084 .397 L .248 .419 L .342 -.146 L 1.241 .104 L .501 .146 L .079 -.014 L .525 -.093 L .662 -.27 L -.534 -.124 L .055 -.204 L .166 -.175 L .753 -.322 L .756 -.181 L .902 -.215 L .314 -.235 L .302 -.264 L -.053 -.775 L .135 -.542 L .521 -.25 L .46 -.16 L .916 -.092 L .177 -.096 L .208 .447 L .311 .335 L .266 .127 L .141 -.071 L .41 -.208 L .153 .17 L .202 .458 L .194 .133 L .518 -.012 L .159 .301 L .259 -.012 L .576 .048 L .375 .168 L -.159 .241 L .091 .175 L -.072 .198 L .285 .122 L .406 -.075 L .446 -.035 L .193 -.313 L .245 -.072 L -.119 .373 L .146 .18 L -.039 .228 L .529 .048 L .341 .192 L .371 .204 L .127 .228 L .694 -.174 L .079 .114 L .642 .063 L .568 .011 L .145 .063 L .428 .319 L .337 .277 L .395 -.055 L .045 .145 L .689 -.062 L .072 -.048 L .233 .007 L .095 .186 L .456 .09 L .479 -.014 L .605 .193 L -.954 .806 L -.054 .213 L -.054 .358 L -.321 .372 L -.075 .295 L .091 .076 L -.216 .701 L .135 .233 L -.385 .309 L -.473 -.007 L .005 -.096 L 415.96 94.5 l -.221 .302 L .153 .028 L .116 .089 L -.173 .035 L -.528 .494 L -.012 .076 L -.575 .24 L .038 .315 L -.718 .418 L -.089 .294 L .08 .137 L -.013 .322 L -.238 .226 L .369 .111 L .854 -.668 L .616 -.147 L .312 .806 L .102 .424 L -.624 .301 L .532 .344 L .025 .292 L .43 .192 L -.199 .272 L -.541 .353 L -.183 -.111 L -.437 .186 L .352 .358 L .616 .191 L .135 .331 L -.175 .01 L -.315 .371 L .193 .442 L .754 .391 L .849 -.07 L .062 .281 L -.146 .469 L -.346 .23 L -.221 .215 L -.833 .488 L -.889 .659 L -.427 .087 L -.318 .043 L -.798 .159 L -.405 -.028 L -.471 -.156 L -.851 -.499 L -.315 -.085 L -.354 .029 L -.231 .072 L -.511 -.056 L -.752 -.313 L -.602 .044 L -.731 .345 L -.357 .258 L -.555 .559 L -.147 .386 L .099 .514 L .091 .379 L -.334 -.091 L -.75 .137 L -.039 .136 L -.485 -.015 L -.427 -.197 L -.395 .167 L -.261 -.015 L -.036 -.152 L -.335 -.091 L -.206 .03 L -.374 .076 L -.187 -.076 L -.035 -.289 L -.091 -.213 L -1.252 -.304 L -.355 0 L .017 .319 L -.542 -.015 L -.337 .061 L -.037 -.122 L -.767 .03 L -.084 -.114 L -.028 -.038 L -.431 -.152 L -.131 .076 L -.262 -.03 L -.056 .076 L -.507 -.395 L -.15 .061 L -1.088 -.334 L -.112 .106 L -.15 -.03 L -.094 -.106 L .205 -.243 L -.058 -.122 L -.469 .03 L -.472 -.243 L +681.312 116.395 N .235 -.171 L .283 -.256 L .633 -.738 L .315 -.157 L .595 .011 L .579 .068 L .511 .096 L .309 -.115 L .571 -.678 L .682 .621 L 1.178 1.611 L .329 .495 L .269 .664 L .002 .75 L -.034 .947 L -.129 .637 L .143 .113 L .5 -.043 L -.121 .41 L -.282 .523 L -.5 .75 L -.316 .312 L -.243 .043 L -.567 -.211 L -.256 .1 L -.607 .58 L -.431 -.083 L -.289 -.225 L -.544 .1 L -.526 .199 L -1.188 .835 L -.462 .043 L -.46 .312 L -.055 -.564 L -.056 -.324 L -.163 -.705 L -.137 -.395 L .167 -.453 L .499 -.468 L 0 -.353 L .226 -.425 L -.044 -.141 L -.378 -.311 L -.095 -.296 L .015 -.467 L -.087 -.339 L -.289 -.126 L -.603 -.084 L .654 -.411 L .303 -.114 L .654 .268 L .254 -.241 L -.029 -.283 L -.764 -.89 L -.113 -.311 L -.137 -.105 L +475.646 121.847 N -.018 .175 L .338 .391 L -.295 -.009 L -.132 .108 L -.104 -.059 L -.327 -.021 L -.121 .33 L -.783 .257 L -.384 .046 L -.099 .053 L 0 .21 L -.217 .006 L -.072 -.192 L -.402 .023 L -.547 -.146 L -.191 -.087 L 0 -.21 L -.161 -.105 L -.122 -.403 L .082 -.035 L .12 .1 L .147 -.006 L .405 -.304 L .253 -.006 L .328 .092 L .077 -.086 L .088 -.286 L -.053 -.175 L .627 .093 L .658 .027 L .367 -.056 L .818 -.233 L .689 -.304 L .535 -.158 L -.475 .295 L -.436 .231 L -.596 .444 L +704.404 117.274 N .197 -.099 L 1.108 -.271 L .057 .354 L -.481 .284 L -.232 .241 L -.068 .453 L .139 .367 L .291 .056 L .221 -.114 L .418 -.354 L .24 -.085 L 1.656 -.697 L .389 -.213 L .46 -.326 L .349 -.638 L .76 -.412 L .347 -.327 L .191 -.269 L .142 -.51 L .538 -.582 L -.01 -.142 L .344 -.567 L .159 -.468 L .139 -.609 L -.043 -.467 L -.33 -.198 L -.128 -.24 L .234 -.213 L .166 -.284 L -.155 -1.023 L .544 -.343 L .176 -.242 L .327 -.328 L .192 0 L .21 .355 L .199 .227 L .303 -.058 L .799 -.257 L -.169 -.526 L -.311 -.028 L -.36 -.312 L .694 -.415 L .441 .156 L .336 .227 L .025 .199 L -.016 .868 L .058 .611 L .22 .127 L .243 .312 L .717 1.432 L .001 .496 L -.246 .709 L -.709 .766 L -.226 .439 L .064 .368 L -.15 .071 L -.737 .285 L -.161 .113 L -.164 .199 L -.174 .453 L .02 .396 L .094 .254 L .131 .792 L -.04 .693 L -.686 .751 L -.242 .736 L .02 .707 L .198 .296 L .422 .353 L -.617 .298 L -.193 .127 L -.166 .17 L -.174 .834 L -1.081 .439 L -.094 -.282 L .294 -.665 L .184 -.523 L -.198 -.126 L -.514 .241 L -.578 .623 L -.476 .001 L -.346 .312 L -.066 .748 L -.354 .269 L -.188 -.028 L -.066 -.155 L .003 -.606 L -.149 -.155 L -.211 .042 L -.309 .156 L -.344 .311 L -.325 .523 L -.866 -.055 L -.505 .057 L -.631 .1 L -.458 -.549 L -.685 -.323 L -.26 .254 L -.067 .184 L -.177 .353 L .037 .056 L .417 .197 L .416 .323 L -.293 .198 L -.829 .129 L -.433 .241 L -.463 .622 L -.522 .847 L -.688 -.365 L -.565 -.21 L -.285 -.197 L -.014 -.169 L -.194 -.818 L .099 -.155 L .495 -.325 L .179 -.269 L -.067 -.282 L -.18 -.042 L -.601 .17 L -.341 -.028 L -.789 -.167 L -.475 .128 L -.427 .227 L -.437 .184 L -.269 -.098 L -.256 -.027 L -1.647 .398 L -.814 .298 L -.21 -.31 L -.452 -.042 L -.413 .438 L -.006 .635 L -.756 -.238 L -.579 -.055 L -1.1 .073 L -.267 -.14 L .072 -.339 L .179 -.283 L .483 .013 L .499 -.114 L .751 -.467 L 2.201 -1.953 L .28 -.015 L .427 -.128 L .056 .424 L .495 -.128 L 1.278 -.257 L .933 -.058 L 1.183 -.172 L .892 -.256 L .068 .452 L .377 .268 L .167 -.085 L .654 -.199 L .446 -.34 L -.003 -.353 L .114 -.467 L .465 -.51 L .698 -.581 L .371 -.453 L -.062 -1.117 L .182 -.213 L h 695.464 127.756 m -.292 -.197 L -.223 -.268 L -.101 -.381 L -.177 -.395 L -.492 -.535 L .731 -.382 L .287 -.269 L .456 -.593 L .409 .253 L .615 -.015 L .483 -.185 L .311 -.339 L .451 -.311 L .454 -.029 L .316 .169 L .862 .224 L .153 .254 L -.1 .127 L -.102 .423 L -.292 .24 L -.864 .876 L -.181 -.211 L -.424 -.295 L -.467 -.042 L -.612 .213 L -.193 .184 L -.245 .495 L -.165 .508 L -.153 .212 L -.448 .269 L h 691.12 131.448 m -.366 -.042 L -.056 -.141 L .268 -.537 L .128 -.593 L -.334 -.112 L -.239 .198 L -.155 .466 L -.381 .452 L -.326 -.211 L -.059 -.211 L .322 -.466 L .032 -.296 L -.356 -.917 L .169 -.113 L .687 -.58 L .083 -.141 L .034 -.466 L -.532 -.789 L -.333 -.042 L -.162 .269 L -.419 .495 L -.249 -.112 L -.23 -.508 L -.376 -.267 L -.261 -.366 L .41 -.325 L .733 .083 L .706 -.171 L .315 -.466 L .241 -.283 L .484 -.058 L .478 .056 L .249 .38 L .27 .168 L .43 .084 L .628 -.213 L .225 .395 L -.569 .438 L .405 .239 L .443 .437 L .079 .254 L -.596 .58 L -.242 .41 L -.104 .367 L -.085 .621 L -.109 .649 L -.242 .353 L -.194 .099 L -.165 .071 L -.197 .184 L -.479 .678 L h 711.938 108.369 m -.222 -.241 L -.077 -.271 L .325 -.642 L -.055 -.342 L -.549 -.198 L -.168 -.171 L -.146 -.812 L .583 -.386 L .522 -.172 L .646 -.373 L .037 -.356 L -.318 -.285 L .277 -.3 L .224 -.015 L .661 .427 L .373 .085 L .532 -.201 L -.004 -1.186 L .455 -.187 L .45 -.244 L .074 -.743 L .007 -.844 L -.398 -.758 L -.098 -.473 L .166 -.216 L .618 -.346 L .063 .072 L .507 .43 L .904 .816 L 1.07 .842 L 1.083 .684 L .627 .285 L .528 .17 L 1.02 .198 L .282 .042 L .304 -.086 L .866 -.66 L .461 -.144 L .002 .1 L -.308 .358 L -.335 .558 L .198 .414 L .469 .599 L .197 .356 L -.561 .272 L -.447 .244 L -.534 .158 L -.365 .015 L -.488 -.199 L -.453 .015 L -.363 .144 L -.345 .229 L -.754 .786 L -.396 .5 L -.26 .599 L -.4 -.07 L -.425 -.241 L -2.031 -.965 L -.461 -.085 L -.72 .044 L -1.038 .587 L -.153 -.299 L -.372 -.356 L -.339 .029 L -.266 .115 L -.439 .272 L .049 .299 L 1.16 .497 L .56 .298 L .302 .27 L -.391 .214 L -.303 .029 L -.305 -.128 L -.261 .043 L -.324 .314 L -.388 .471 L -.347 .114 L +597.917 139.685 N 1.251 -1.545 L .609 -.539 L .348 -.239 L .149 -.103 L .417 -.016 L .309 .294 L .479 .208 L 1.659 .047 L .371 .041 L .312 .209 L .329 .619 L -.07 .156 L .042 .24 L .326 .294 L .313 .069 L .258 .238 L .017 .282 L -.217 .58 L -.624 .06 L -1.036 .062 L -1.238 -.063 L -.335 -.125 L -.301 -.055 L -.531 .313 L -.544 .074 L -.085 -.021 L -.869 -.214 L -.559 -.081 L -.637 -.18 L -.235 -.493 L .092 -.113 L +362.764 152.723 N .072 -.625 L .395 -.876 L .52 -.552 L .488 -.566 L .244 -.509 L 1.175 -2.559 L .238 -.241 L 1.404 -1.175 L .345 -.495 L .051 -.918 L .305 -1.088 L .651 -1.075 L .399 -.34 L .404 -.198 L .838 -.51 L .361 -.495 L .334 -.777 L .428 -.851 L 1.635 -.04 L 2.511 0 L 2.677 -.001 L 1.718 .004 L 1.42 -.008 L .027 .876 L -.03 1.752 L .002 .65 L -.104 .396 L -.56 -.011 L -6.005 -.022 L -.557 .074 L -.047 .509 L -.07 2.261 L -.099 2.6 L -.144 .128 L -.809 .287 L -.726 .315 L -.575 .427 L -.249 .383 L -.01 .707 L .164 1.539 L .051 1.102 L -.212 -.027 L -.732 .033 L -2.396 -.014 L -5.055 -.056 L -.474 -.013 L +514.551 145.841 N -.374 .027 L -.336 -.083 L -.008 -.615 L -.153 -.437 L -.108 -.791 L .187 -.607 L .188 -.11 L -.059 -.187 L .177 -.607 L .33 -.269 L .312 .083 L .069 .315 L .26 .093 L .063 .199 L .116 .326 L -.106 .42 L .031 .708 L .118 .254 L -.104 .381 L -.327 .467 L -.275 .433 L +514.177 145.868 N .374 -.027 L .008 .288 L .361 .14 L .153 .128 L .186 -.093 L -.046 .443 L .397 .001 L .402 .127 L .687 -.093 L .103 -.21 L .183 -.058 L .218 .117 L .424 -.042 L .595 .112 L .224 -.035 L .079 -.105 L 1.358 .222 L .732 -.14 L -.022 -.292 L .225 .175 L .375 -.016 L .157 -.099 L .312 -.422 L .232 -.073 L .267 -.495 L .131 -.297 L .711 -.637 L .813 -.889 L .163 .105 L .229 -.178 L .85 -.708 L .313 -.433 L .15 .161 L -.248 .42 L -.107 .299 L -.004 .176 L .099 .064 L .121 -.024 L .454 .042 L .09 .324 L .001 .508 L -.003 .358 L -.49 .034 L -.401 -.083 L -.107 .396 L .073 1.326 L -.199 .34 L -.536 .596 L .003 .946 L .024 2.075 L .063 .183 L -.152 .057 L -.584 .469 L -.839 -.108 L -3.387 -.446 L -3.362 -.375 L -.261 -.902 L -.548 -1.154 L -1.043 -2.198 L +668.627 151.365 N -.102 -.056 L -.107 -.325 L -.922 -1.212 L -.332 -.987 L -.03 -.438 L .156 -.749 L .546 -.792 L 1.312 -1.852 L .259 -.184 L .425 -.128 L .229 -.184 L .358 -.227 L .228 .127 L .554 .394 L -.334 .424 L -.084 .142 L .023 .31 L -.067 .622 L -.203 .296 L -.182 .354 L -.065 .692 L -.1 .494 L -.317 .805 L -.473 .707 L -.417 .833 L -.014 .353 L -.114 .438 L -.228 .142 L +389.765 144.543 N .1 .084 L .895 .531 L 2.054 1.344 L .811 .575 L 3.283 2.241 L 1.924 1.26 L 1.292 .824 L .397 .253 L 2.472 1.469 L .181 .253 L -.096 .396 L .082 .183 L .393 .28 L 1.111 1.039 L .229 .027 L .47 -.314 L .588 .562 L .375 .167 L .748 .024 L .309 .111 L .277 .352 L .099 .522 L -.161 .679 L .146 .564 L 2.176 -.408 L .064 1.017 L .034 2.203 L .001 .96 L -.08 .89 L -.145 .919 L -.434 1.246 L -.596 .794 L -.339 .271 L -.29 .129 L -2.533 .085 L -1.808 .124 L -.209 .072 L -.562 .427 L -.579 .272 L -.678 -.053 L -.581 -.081 L -1.062 -.173 L -.36 -.059 L -.356 -.125 L -.37 .073 L -1.22 .713 L -.947 .458 L -.304 .228 L -.314 .793 L -.274 -.027 L -.324 -.182 L -.518 -.209 L -.272 .101 L -.638 .625 L -.492 .667 L -.393 .822 L -.174 .227 L -.45 .102 L -.551 -.364 L -.293 -.281 L -.273 .058 L -.397 .384 L -.355 1.217 L -.292 1.047 L -.317 .369 L -.543 .271 L -.448 .158 L -.257 .016 L -.141 .255 L .058 .749 L -.133 .876 L -.261 .92 L -.172 .326 L -.046 .156 L -.08 .043 L -.159 .1 L -.604 .399 L -.352 .059 L -.148 -.239 L -.117 -.381 L -.004 -.297 L -.147 -.211 L -.257 -.041 L -.239 .114 L -.571 .483 L -.362 .469 L -.35 .228 L -.455 -.436 L -.566 -.321 L -.352 .059 L -.522 .54 L -.559 -.901 L -.194 -1.143 L -.349 -.718 L -.474 -.478 L -.265 -.451 L -.271 -.832 L -.022 -.339 L -.246 -.281 L -.323 -.055 L -.684 .428 L -.3 .327 L -.43 .243 L -.565 -.152 L -.356 -.153 L -.338 -.026 L -.475 .413 L -.252 .256 L -.536 -.265 L -.882 -.715 L -.18 -.183 L -.113 -.028 L .062 -.142 L .004 -.565 L -.082 -.833 L -.265 -.337 L -.554 -.322 L -.181 -.197 L -.22 -.479 L -.144 -.663 L -.251 -1.1 L .057 -.339 L .506 -.399 L .332 -.284 L .018 -.607 L .181 -.552 L .252 -.256 L .402 -.073 L .261 .111 L .568 .83 L .214 .168 L .454 .082 L .107 -.269 L -.055 -.296 L .06 -.212 L .535 .124 L .713 .137 L .485 .054 L .387 -.031 L .945 -.344 L 1.953 -.026 L 6.457 -.01 L .379 -1.613 L -.724 -.787 L -.186 -1.468 L -.202 -2.386 L -.325 -2.753 L -.178 -1.736 L -.19 -1.468 L -.908 -7.962 L -.049 -.776 L 3.231 -.089 L .523 -.13 L +525.37 142.384 N .312 -.429 L .155 -.17 L .084 .833 L -.423 .707 L -.118 .156 L -.121 .024 L -.099 -.064 L .004 -.176 L .107 -.299 L .248 -.42 L -.15 -.161 L h 525.923 144.712 m 0 .22 L .456 .762 L .408 .465 L .782 .634 L .677 .394 L 1.008 .52 L .392 .154 L .277 .014 L .576 -.029 L .364 .112 L .873 .973 L .518 .648 L .46 .422 L .81 .365 L .025 .212 L -.67 1.06 L -.615 .721 L -.883 .807 L -.776 1.541 L -.242 .142 L -.562 -.083 L -.235 -.084 L -.252 .071 L -.278 .509 L -.062 1.115 L .001 .791 L .134 .621 L -.403 .142 L -1.046 .073 L -.627 .27 L -.367 .283 L -.29 .495 L -.131 .551 L -.204 .283 L -.444 .255 L -.544 .1 L -.292 0 L -.386 -.042 L -.326 .029 L -.382 .283 L -.22 .297 L -.125 .508 L .003 .353 L -.091 .311 L -.631 .396 L -.344 .043 L -.776 -.21 L -.717 .058 L -.896 .27 L -.768 .298 L -.283 .099 L -.416 .145 L -.241 -.306 L -.483 -.689 L .006 -.296 L -.127 -.253 L -.933 -1.364 L -.604 -.971 L -.226 -.634 L -.092 -.663 L 1.691 -.815 L 2.35 -1.213 L 5.346 -2.982 L -.155 -1.453 L -.581 -.914 L -.063 -.183 L -.024 -2.075 L -.003 -.946 L .536 -.596 L .199 -.34 L -.073 -1.326 L .107 -.396 L .401 .083 L .49 -.034 L +405.733 173.04 N -.568 -.971 L -.562 -.025 L -.37 .044 L -.516 -.181 L -.97 -.757 L -.114 -.226 L .335 -.439 L -.018 -.212 L -.179 -.268 L -.502 -.42 L -.389 -.266 L -.422 -.492 L -.426 -.93 L -.019 -.396 L .173 -.665 L .581 .081 L .678 .053 L .579 -.272 L .562 -.427 L .209 -.072 L 1.808 -.124 L 2.533 -.085 L .29 -.129 L .339 -.271 L .596 -.794 L .434 -1.246 L .145 -.919 L .08 -.89 L -.001 -.96 L -.034 -2.203 L -.064 -1.017 L 1.672 -.321 L 1.82 -.364 L 3.084 -2.617 L .834 -.655 L 2.308 -1.454 L 1.607 -.956 L 4.012 -2.241 L 1.632 -.843 L .265 -.186 L .832 .137 L 1.646 .442 L 1.008 .333 L .258 .182 L 1.192 .911 L .231 -.157 L 1.519 -.729 L .364 2.145 L .169 1.298 L .42 1.028 L .554 .802 L .703 .604 L -.388 .722 L -.265 .99 L -.168 1.088 L -.084 .989 L .022 .537 L -.062 .707 L -.019 1.045 L -.034 1.088 L -.056 .466 L -2.43 2.613 L -.591 .78 L -.87 1.333 L -.572 .794 L -.007 .678 L .123 .719 L .014 .269 L -.951 .034 L -.437 .2 L -.453 .299 L -.761 .697 L -.259 .058 L -.609 -.208 L -.724 -.193 L -.884 -.221 L -.531 -.04 L -.709 .047 L -.628 .103 L -.774 .287 L -.403 .327 L -.629 .399 L -.273 .059 L -.934 .005 L -.965 -.277 L -1.173 -.742 L -.354 -.083 L -.467 .116 L -1.337 .544 L -.37 .002 L -.209 -.098 L -1.095 -1.223 L -.821 -.277 L -1.111 -.121 L -1.174 .108 L -1.064 .188 L -.676 .4 L -.687 1.614 L -.353 .482 L -.158 .849 L -.092 .961 L -.902 -.503 L -.727 -.589 L -.339 -.28 L -.321 .073 L -.577 .3 L +431.763 171.063 N -.351 -.407 L -.575 -.52 L -.173 -.394 L -.014 -.269 L -.123 -.719 L .007 -.678 L .572 -.794 L .87 -1.333 L .591 -.78 L 2.43 -2.613 L .056 -.466 L .034 -1.088 L .019 -1.045 L .062 -.707 L -.022 -.537 L .084 -.989 L .168 -1.088 L .265 -.99 L .388 -.722 L -.703 -.604 L -.554 -.802 L -.42 -1.028 L -.169 -1.298 L -.364 -2.145 L 1.818 -.858 L .41 -.059 L 5.231 2.554 L 4.941 2.372 L 5.577 2.792 L 1.981 .963 L -.02 1.045 L -.016 .946 L -.036 .636 L .085 2.5 L -.038 .749 L .036 1.002 L .031 1.229 L -.04 .283 L -.839 -.009 L -1.245 .05 L -.229 .143 L -.417 1.245 L -.583 .809 L -.122 .438 L .131 .677 L -.149 .212 L -.718 .428 L -.053 .24 L .342 .662 L -.087 .34 L -.542 .596 L -.316 .609 L .219 .352 L .517 -.088 L .338 .012 L .141 .225 L .221 1.228 L .137 .522 L .155 .295 L .444 .407 L .266 .465 L .026 .367 L -.15 .425 L -.559 -.208 L -.321 -.012 L -.322 .086 L -.939 .613 L -.372 .228 L -.165 .382 L -.005 .41 L -.196 .284 L -2.649 2.275 L -.386 .087 L -2.181 .055 L -.434 .059 L -.209 .199 L -.117 .806 L -.646 1.176 L -.258 .143 L -.368 .031 L -.881 -.009 L -.818 .273 L -.754 .386 L -.466 .271 L -.224 .03 L -.225 -.069 L -.494 -.661 L -1.363 .686 L -.449 .158 L -.24 -.027 L -.096 -.084 L -.208 -.183 L -.382 -1.057 L -.638 -1.07 L -1.343 -1.179 L -1.088 -1.067 L .323 -.539 L .29 -.312 L .24 -.1 L .481 .082 L 1.187 .191 L .674 -.032 L .225 -.143 L -.047 -.127 L -.208 -.21 L -.381 -.633 L -.205 -.578 L -.169 -1.228 L .134 -.651 L -.119 -1.2 L -.395 -.887 L -.923 -1.238 L -.208 -.083 L -.627 -.109 L +627.173 150.012 N .483 -.229 L .515 -.13 L .341 .012 L .597 .392 L .325 .097 L .584 -.413 L .332 -.115 L 1.595 -.052 L .807 -.117 L .341 -.157 L .696 -.554 L .521 -.328 L .298 -.101 L .623 .575 L .771 .235 L .66 .053 L .777 -.047 L .237 .21 L .056 .38 L -.472 .75 L .096 .521 L .273 .365 L .943 .615 L .621 .166 L .909 .107 L .197 .143 L -.19 .132 L -.826 .482 L .106 .465 L -.203 .212 L -1.261 -.054 L -.136 .198 L .057 .395 L -.283 .382 L -.585 .792 L -.221 .142 L -.533 .241 L -.171 .127 L -.27 .396 L -.303 .932 L -.388 .975 L .268 .225 L .469 .563 L 1.112 1.071 L .023 .24 L .042 .522 L .087 .254 L .42 .493 L 1.096 .83 L 1.282 1.296 L .26 .197 L .636 .069 L .313 .38 L .282 1.016 L .302 .578 L .638 .605 L .293 .663 L .341 1.382 L .524 2.809 L -.295 .438 L -.235 .495 L .05 .819 L -.095 .41 L .056 .664 L -.027 .099 L -.364 .551 L -.447 .439 L -.254 .127 L -.509 .1 L -.419 .17 L -.501 .354 L -.591 .622 L -.579 .354 L -.325 .043 L -.512 -.197 L -.404 -.31 L -.179 -.141 L -.153 .424 L .051 .494 L .048 .353 L -.205 .721 L -.388 .424 L -.326 .071 L -.235 -.07 L -.246 .481 L -.427 .326 L -.523 .142 L -.417 .213 L -.459 .565 L -.196 .269 L -.406 .297 L -.264 .099 L -.365 -.042 L .078 -.861 L .1 -1.313 L .151 -.494 L .215 -.283 L -.02 -.353 L -.475 -.437 L -.749 -.238 L -.091 -.066 L .3 -.289 L .646 -.229 L .915 -.528 L .599 -.229 L .497 .011 L .688 .194 L .17 -.27 L -.03 -.197 L -.568 -.435 L -.216 -.422 L .234 -.425 L .99 -.571 L .521 -.229 L .932 -.443 L .599 -.187 L .385 -.285 L .217 -.509 L -.054 -1.073 L .05 -.424 L .076 -.367 L -.455 -1.014 L -.029 -.663 L .215 -.905 L .155 -.918 L -.064 -.578 L -.214 -.437 L -.529 -.477 L -.072 -.282 L .226 -.439 L -.136 -.395 L -.358 -.308 L -.685 -.391 L -.471 -.52 L -.57 -.914 L -1.683 -2.121 L -.698 -.772 L -.637 -.646 L -.632 -.476 L -1.234 -.741 L -.162 -.098 L -.043 -.494 L .277 -.369 L .311 -.101 L .476 .068 L .287 -.058 L .261 -.185 L .255 -.326 L -.009 -.508 L -.87 -.968 L -.434 -.675 L -.262 -.083 L -.39 .171 L -.509 .483 L -.287 .058 L -.47 -.195 L -.607 -.434 L -.334 -.689 L -.338 -.929 L -.543 -.604 L -.613 -.575 L -.45 -.745 L +217.961 150.385 N .304 -.043 L .84 -.27 L -.17 -.254 L -.312 -.112 L -.369 -.056 L -.651 .016 L -.497 -.042 L -.645 .157 L -1.193 .92 L -.371 .029 L -.653 .001 L -.211 .113 L -.189 .452 L -.396 .284 L -.32 .043 L -.786 .086 L .259 -.325 L .473 -.312 L -.128 -.593 L .282 -.382 L .114 -.099 L 1.258 -.61 L 1.625 -.47 L 1.164 -.087 L .842 -.157 L .825 .041 L .566 -.044 L .73 .168 L .848 .083 L .603 .197 L .557 .112 L .477 .013 L .499 .268 L .573 .536 L .382 .253 L .581 .168 L .768 .111 L 1.229 .351 L 1.02 .492 L .453 .31 L .374 .55 L .33 .141 L .479 .041 L 1.704 .519 L 1.018 .167 L .327 .239 L -.344 .58 L .233 .155 L .559 .042 L .756 -.072 L .495 .168 L .507 .38 L .591 .281 L .381 .296 L -.233 .085 L -.981 .087 L -1.15 .398 L -.626 .058 L -1.054 -.209 L -.9 -.041 L -.934 .186 L -.943 .115 L -.484 .029 L -.449 -.07 L .353 -.382 L .728 -.623 L .173 -.396 L 229 154.204 l -.181 -.127 L -.622 -.14 L -.7 .001 L -.603 -.112 L -.651 -.338 L -.141 -.748 L -.258 -.536 L -.218 -.155 L -.396 -.027 L -1.005 .044 L -.836 -.139 L -.621 -.225 L -.956 -.493 L -.739 -.238 L -.615 -.069 L -1.154 -.068 L -.489 -.098 L -.855 -.352 L +634.036 168.444 N .808 -.64 L .121 -.438 L -.002 -.945 L -.157 -.507 L -.419 -.703 L -.979 -1.279 L -.255 -.464 L -.107 -.366 L -.058 -1.524 L -.435 -.632 L -.688 -.659 L -.285 -.535 L -.052 -.282 L -.266 -.153 L -.893 -.192 L -.403 -.012 L -.286 .453 L -.2 .538 L -.543 .257 L -.223 .072 L -.59 -.265 L -.835 -.348 L -.346 .03 L -1.173 1.178 L -.37 .411 L -.481 -.138 L -.145 -.324 L .027 -.494 L .117 -.438 L .528 -1.569 L .085 -.41 L -.249 -1.311 L -.045 -.113 L -.414 .045 L -.489 .2 L -.423 .003 L -.186 -.154 L -.066 -.367 L .106 -.805 L -.01 -.423 L -.118 -.168 L -.295 -.182 L -.541 -.166 L .193 -.185 L .582 -.455 L .442 -.581 L .53 -.61 L .502 -.355 L .178 .196 L .321 .21 L .769 .08 L .266 -.213 L .109 -.339 L -.119 -.521 L -.228 -.366 L -.138 -.592 L .043 -.325 L .24 -.241 L .679 -.314 L .45 .745 L .613 .575 L .543 .604 L .338 .929 L .334 .689 L .607 .434 L .47 .195 L .287 -.058 L .509 -.483 L .39 -.171 L .262 .083 L .434 .675 L .87 .968 L .009 .508 L -.255 .326 L -.261 .185 L -.287 .058 L -.476 -.068 L -.311 .101 L -.277 .369 L .043 .494 L .162 .098 L 1.234 .741 L .632 .476 L .637 .646 L .698 .772 L 1.683 2.121 L .57 .914 L .471 .52 L .685 .391 L .358 .308 L .136 .395 L -.226 .439 L .072 .282 L .529 .477 L .214 .437 L .064 .578 L -.155 .918 L -.209 .114 L -.975 .429 L -.3 .072 L -.373 -.351 L -.444 -.181 L -.476 .186 L -.392 .285 L .107 .296 L .187 .182 L .103 .211 L -.095 .24 L -.248 .058 L -.469 -.251 L -.341 -.111 L -.736 -.165 L -.533 -.251 L +60.074 72.607 N -.099 .228 L -.491 .472 L -.395 .183 L -.462 .062 L 58 73.461 l -.961 -.362 L -.153 -.197 L .169 -.289 L .54 -.274 L .341 -.32 L .716 .364 L .3 .091 L .465 -.26 L .215 -.213 L .064 -.366 L .485 -.047 L 1.107 .135 L .536 .334 L .133 .213 L -.756 .062 L -.429 0 L -.59 .184 L -.11 .092 L h 40.092 77.571 m -.729 -.029 L -.097 -.24 L .011 -.3 L .802 -.243 L .326 -.211 L .593 -.423 L .448 -.137 L .646 -.077 L 1.427 .253 L .711 .24 L -.079 .211 L -.303 .046 L -.754 -.074 L -.496 .031 L -1.077 .183 L -.269 .226 L -1.161 .543 L h 38.426 77.979 m -.515 -.209 L -.139 -.285 L .381 -.227 L .674 .27 L .093 .195 L -.122 .15 L -.372 .105 L h 37.896 78.449 m -.256 .084 L -.558 .151 L -1.109 -.058 L -.387 .135 L -.398 .434 L -.31 .15 L -.854 -.207 L -.135 -.224 L .497 -.359 L .5 -.315 L .955 -.166 L .863 -.346 L .39 .089 L .461 .224 L .341 .409 L h 29.628 81.29 m -.168 -.594 L -.324 -.476 L .839 -.136 L .424 .088 L .436 .238 L -.244 .268 L -.26 .06 L -.073 .297 L -.22 .09 L -.412 .164 L h 27.543 81.591 m -.39 .031 L -.741 .165 L -.311 -.133 L -.088 -.178 L .104 -.119 L .336 -.268 L .294 -.09 L .584 .222 L .212 .371 L h 54.394 157.986 m -.559 -.356 L -.044 -.884 L -.243 -.677 L .482 -.402 L -.035 -.2 L -.156 -.26 L .052 -.149 L .173 -.046 L .354 .158 L .652 .279 L .593 .425 L -.015 .275 L .238 .046 L .12 .287 L .306 .149 L -.062 .161 L 56 156.933 l -.172 .204 L -.766 .195 L -.374 .23 L -.295 .425 L h 23.015 59.92 m -1.613 -.646 L -.75 -.205 L -.792 -.062 L -.9 .065 L -.291 -.095 L -.431 -.222 L .179 -.287 L .516 -.049 L 1.135 .221 L .579 -.001 L .543 -.081 L .538 -.001 L .828 .285 L 1.725 .362 L .429 .237 L .046 .111 L -.569 -.03 L -.646 .033 L -.527 .365 L h 99.855 70.993 m .467 .929 L -.071 .167 L -.879 -.272 L -.621 -.075 L .067 .441 L -.056 .228 L -.935 -.607 L 97.03 71.41 l .396 -.458 L .263 -.153 L .612 -.078 L .784 .38 L .771 -.108 L h 100.975 73.606 m .128 .272 L -.086 .273 L -.318 .483 L -.559 -.815 L -.597 -.909 L -.04 -.228 L .095 -.213 L .407 .029 L .568 .197 L .402 .91 L h 106.858 78.207 m -1.872 -1.166 L -.566 -.555 L .01 -.467 L -.559 -.843 L .071 -.106 L .456 .06 L .274 .256 L 1.165 .48 L .086 .196 L -.059 .136 L -.149 .226 L .296 .436 L .839 .374 L .007 .974 L h 140.191 127.819 m -.043 -.094 L -.198 -.36 L -.049 -.067 L -.032 .042 L -.028 .05 L -.04 -.092 L .002 -.664 L -.331 -.604 L -.472 -.451 L -.661 -.451 L -.512 -.197 L -.114 -.052 L -.145 .034 L .002 .092 L -.088 .025 L -.1 -.042 L -.146 -.143 L .076 -.076 L -.073 -.202 L -.228 -.252 L -.283 -.025 L -.312 .084 L -.932 -.336 L -.286 -.328 L -.428 -.244 L -.383 .042 L -.932 -.16 L -.721 .051 L -.12 -.185 L -.234 -.067 L -.046 -.177 L .094 -.117 L -.157 -.504 L .133 -.464 L -.227 -.096 L -.127 .008 L -.249 -.134 L 0 -.101 L .075 -.093 L -.029 -.219 L -.347 -.185 L -.254 -.286 L -.415 -.219 L -.391 -.623 L -.202 -.076 L -.203 -.311 L -.409 -.219 L -.156 -.529 L -.002 -.227 L .178 .007 L .147 -.164 L .029 -.326 L -.208 -.251 L -.192 -.045 L -.22 .037 L -.303 -.126 L -.535 -.514 L .078 -.21 L -.091 -.312 L -.129 -.067 L -.044 -.463 L .058 -.152 L .119 -.025 L .099 .067 L .073 .076 L -.086 .101 L .153 .202 L .285 .126 L .116 .118 L .203 .017 L -.385 -.564 L -.183 -.144 L -.021 -.236 L -.184 -.109 L -.051 -.344 L -.13 .006 L -.011 .144 L .048 .446 L -.093 .017 L -.293 -.194 L -.119 .042 L -.516 -.404 L -.136 -.363 L -.377 -.514 L -.531 -.379 L -.624 -.583 L -.123 -.142 L .114 -.101 L -.327 -.751 L .161 -.43 L -.254 -.479 L -.22 -.355 L -.738 -.782 L -.104 -.299 L .099 -.627 L .252 -.628 L .166 -.357 L .059 -.856 L -.215 -.785 L -.692 -1.486 L -.153 -.916 L .096 -.287 L .231 -.244 L .402 -.201 L .365 -.717 L -.365 -.573 L -.066 -.33 L .424 -1.593 L .153 -.575 L .061 -.634 L .091 -.778 L .019 -.179 L -.153 -.16 L .08 -.231 L -.103 -.167 L .157 -.077 L -.03 -.186 L -.046 -.186 L -.031 -.103 L -.004 -.058 L .322 .096 L .209 -.019 L .062 -.097 L -.211 .006 L -.614 -.122 L .062 -.707 L -.103 -.328 L .017 -.277 L .587 -.225 L -.345 -.019 L -.16 -.142 L -.129 0 L -.053 .045 L .042 .116 L -.12 .052 L -.133 -.979 L -.927 -1.463 L -.017 -.465 L .129 -.131 L .544 .086 L .632 .217 L .785 .114 L .641 .028 L .546 -.044 L .415 .086 L .547 .318 L .039 .435 L -.42 .407 L -.413 .347 L .532 .146 L .184 .188 L .251 .169 L .029 -.228 L .161 -.232 L .393 -.305 L .21 -.581 L .102 -.465 L -.064 -.421 L -.356 -.958 L -.158 -.305 L -.655 -.516 L .194 .013 L 2.579 .001 L 1.335 .022 L 4.588 -.025 L 3.938 .008 L 2.87 -.001 L 1.687 .006 L 5.117 -.028 L .74 .011 L 4.13 .021 L 1.089 -.035 L 3.821 .023 L .875 -.005 L 3.617 -.004 L 4.84 .018 L .601 -.003 L 2.935 .014 L 2.131 -.012 L 2.781 .029 L 2.915 -.016 L 2.105 .003 L 1.348 -.007 L 2.798 .029 L 2.687 -.029 L .68 .003 L -.387 -.588 L -.131 -.347 L .501 -.036 L .896 .748 L .279 .371 L .468 .46 L .833 .451 L .518 -.076 L 1.425 .208 L .02 .185 L .271 -.012 L .338 .48 L .16 -.247 L .502 .013 L .241 .271 L .469 .086 L .064 .185 L .506 .098 L .573 -.141 L .219 -.06 L .412 -.191 L .373 -.075 L .028 .282 L .197 .116 L .855 -.083 L .474 .041 L .156 .115 L .196 .144 L .542 -.049 L .707 .074 L 1.469 -.592 L .805 -.189 L .797 .227 L .977 .386 L 3.975 1.576 L 2.15 1.061 L .101 .429 L .46 .465 L .628 -.024 L .178 .135 L .184 .294 L .916 .181 L .307 .235 L -.11 .318 L .26 .33 L 2.529 1.05 L .876 3.16 L .054 .545 L -.028 .746 L -.377 .576 L -.294 .544 L -.264 .433 L -.414 .294 L -.707 .525 L -.044 .218 L .012 .33 L .371 .427 L .497 .169 L .573 .068 L .524 -.117 L .925 -.506 L .939 -.478 L .88 -.262 L .919 -.062 L .944 -.163 L 1.464 -.452 L .875 -.427 L -.047 -.362 L -.16 -.471 L -.018 -.319 L .162 -.375 L .47 -.203 L .93 -.091 L 1.123 .01 L 1.305 .138 L 1.156 -.197 L .44 -.275 L .163 -.512 L .146 -.434 L .545 -.164 L 1.754 -.814 L .534 -.305 L .968 -.523 L 1.76 -.009 L 2.508 .029 L 1.855 .004 L 1.093 .095 L .174 -.375 L .363 -.435 L .402 -.06 L 1.161 .124 L 1.139 -1.45 L 1.139 -2.22 L .514 -.626 L .632 -.526 L .273 .085 L .505 .36 L .381 .085 L .41 -.176 L .771 .025 L .488 .288 L .174 .274 L .31 2.819 L -.077 .229 L .606 .231 L .224 0 L .042 .154 L -.143 .069 L .02 .256 L -.192 .077 L .16 .291 L .188 -.153 L .349 .495 L -.268 .281 L .299 -.04 L .171 .093 L -.511 .374 L -.509 .093 L -.297 -.12 L -.013 .253 L -.138 .067 L -.077 -.107 L -.231 -.08 L -.277 .133 L -.101 .28 L -.171 -.013 L -.15 .16 L -.175 -.347 L -.746 .28 L -.204 -.093 L .12 .413 L -.666 -.213 L .199 -.48 L -.149 -.04 L -.364 .52 L -.332 .56 L -.342 .333 L -.324 -.227 L -.249 .439 L -.346 -.08 L .122 -.307 L -.325 .253 L .165 .16 L -.326 .293 L -.318 -.133 L .105 -.226 L -.654 .253 L .065 .359 L -.264 .04 L -.161 .373 L -.352 .106 L -.333 .679 L -.404 .505 L .173 .146 L .068 .212 L .168 .053 L .083 -.08 L .169 .013 L -.122 .146 L -.547 .106 L .053 .093 L -.392 .292 L -.068 .159 L .337 .027 L .282 .093 L .599 .704 L .055 .398 L .399 .106 L .691 -.239 L -.022 -.186 L -.14 -.027 L -.254 -.279 L -.097 -.04 L -.009 -.066 L .196 0 L .23 .133 L .218 .358 L .031 .425 L -1.599 .292 L -.032 -.385 L -.124 -.066 L -.109 .226 L -.164 .04 L -.03 .093 L -.105 -.106 L -.159 .266 L -.164 .04 L -.294 .04 L -.045 -.332 L .198 -.332 L -.443 .119 L -.154 -.146 L -.082 .252 L -.087 .664 L -1.429 .132 L -1.694 .159 L -1.182 .345 L -.787 .358 L -.097 .212 L -.32 .053 L -.144 .172 L -.032 -.04 L .308 -.756 L .024 -.106 L -.071 .027 L -.41 .994 L -.079 -.08 L -.406 .292 L .218 .318 L .553 .093 L -.46 1.515 L -.302 .429 L -.259 -.092 L .043 .251 L -.062 .185 L -.237 .145 L -.462 .501 L -.292 .304 L -.167 .026 L -.075 -.119 L .177 -.31 L -.113 -.178 L -.43 .013 L -.447 -.343 L -.148 -.053 L -.329 -.541 L .315 -.257 L .151 -.245 L -.271 .119 L -.362 .37 L .489 .845 L .033 .356 L .387 .581 L .28 .066 L .104 .765 L -.101 .238 L -.151 .23 L -.125 -.013 L -.487 .666 L -.396 .798 L .034 .053 L -.13 .132 L -.107 -.125 L -.374 .725 L .026 .125 L -.226 .04 L -.137 -.263 L .342 -.864 L .195 -.29 L .247 -.119 L .061 -.237 L -.093 -.059 L -.374 .119 L .226 -.383 L -.218 .04 L -.176 -.093 L .012 -.191 L .242 -.04 L -.077 -.33 L -.439 .296 L -.241 -.204 L -.157 .053 L -.23 -.396 L .355 -.171 L .357 -.053 L -.005 -.06 L -.604 -.316 L -.092 .165 L -.072 0 L .107 -.323 L .089 -.02 L .21 .159 L .131 -.06 L -.098 -.224 L -.353 -.066 L -.065 -.112 L .096 -.112 L .336 .02 L .193 -.284 L -.281 .046 L -.158 -.059 L .241 -.37 L .652 -.152 L -.328 -.06 L .146 -.409 L -.28 .093 L -.096 .132 L .11 .079 L -.315 .191 L -.035 -.224 L -.093 .053 L .051 .224 L -.081 .086 L -.051 -.158 L -.097 -.066 L -.103 .416 L -.447 -.079 L .402 .501 L -.294 .666 L .07 .237 L .272 .488 L -.055 .139 L -.466 -.317 L -.1 -.211 L .026 .205 L .174 .218 L .421 .237 L .132 .508 L -.631 -.402 L -.354 -.007 L -.118 -.283 L -.155 -.053 L .066 .25 L -.541 -.323 L -.33 .04 L .015 -.29 L .427 -.323 L -.428 .079 L -.19 .468 L .204 .231 L .457 .046 L .202 .25 L .954 .297 L -.047 .092 L .554 .165 L .158 .132 L -.22 .468 L -.227 .06 L -1.042 -.804 L .708 .811 L .626 .171 L -.248 .092 L .323 .079 L -.045 .079 L .061 .06 L -.034 .25 L -.312 -.191 L -.071 .073 L .104 .211 L -.216 .02 L -.656 -.56 L -.023 .026 L .419 .475 L .309 .158 L .182 -.026 L .191 .21 L .018 .31 L -.298 .059 L -.492 -.534 L -.474 -.198 L -.199 .16 L .046 .044 L .44 .145 L .488 .382 L -.047 .237 L .442 -.033 L .031 -.119 L .748 .119 L .151 .382 L .406 1.212 L .448 .803 L -.14 -.092 L -.262 -.349 L -.059 -.132 L -.359 -1.172 L -.147 -.277 L -.056 .31 L .135 0 L .034 .198 L -.292 -.066 L .173 .283 L .144 .099 L .228 .58 L -.144 -.053 L -.211 -.382 L .002 .224 L -.52 -.303 L -.06 .059 L .266 .303 L -.247 .119 L -.526 -.204 L .225 .204 L -.375 .211 L -.173 -.02 L -.251 -.21 L -.024 -.217 L .083 -.158 L -.081 -.053 L -.091 .204 L .044 .23 L .116 .211 L -.107 .158 L .894 .02 L .571 -.145 L .125 .165 L -.113 .191 L -.072 .369 L .14 .066 L .092 -.257 L .135 -.369 L .18 -.105 L .266 .31 L .047 .296 L -.166 .25 L -.163 -.013 L -.063 -.099 L -.316 .474 L -.254 .197 L -.483 -.053 L -.203 -.065 L -.147 -.066 L -.136 -.245 L -.151 .014 L .141 .244 L -.075 .013 L -.538 -.125 L -.436 -.151 L .162 .185 L .269 .026 L .833 .335 L -.034 .119 L -.396 .145 L .247 .007 L -.19 .25 L -.281 .138 L -.149 0 L -.481 -.375 L .242 .395 L .43 .164 L .302 -.171 L .292 .026 L .11 -.204 L .04 .178 L .217 .04 L .048 .079 L -.428 .322 L -.013 .085 L -.261 .072 L -1.498 .214 L -.865 .895 L -.487 .609 L -.13 .127 L -.935 .143 L -.528 .128 L -.617 .241 L -.678 .539 L -.225 .424 L -.096 .354 L -.819 .694 L -.693 .383 L -.429 .199 L -.797 .086 L -.35 .58 L -.177 .198 L -.809 1.125 L -.273 .781 L -.459 1.249 L .236 1.455 L .387 .925 L .456 .873 L .934 1.562 L .352 1.746 L .486 1.194 L -.075 .092 L .287 .276 L .123 .333 L .062 .827 L -.301 1.536 L -.064 .278 L -.31 .415 L .108 .424 L -.02 .252 L -.393 .551 L -.017 -.092 L .129 -.241 L -.025 -.138 L -.256 .035 L -.38 .137 L -.291 -.126 L -.509 .138 L -.12 -.329 L .014 -.233 L -.567 -1.068 L -.764 -.138 L -.204 -.352 L -.113 -.819 L -.423 -.229 L -.144 -.702 L -.373 .093 L -.608 -1.08 L -.375 -.482 L .296 0 L .375 -.438 L .048 -.226 L -.167 -.226 L -.471 .407 L -.277 -.208 L .126 -.573 L .147 -.758 L .158 -1.043 L -.293 -.452 L -.258 -.169 L -.496 -.126 L -.832 -.987 L -.875 -.804 L -.528 -.168 L -.43 .072 L -.536 .298 L -.456 .354 L -1.202 .299 L -.273 -.213 L -.131 -.62 L -.253 -.254 L -.264 -.113 L -.752 -.069 L -.516 -.296 L -.22 -.233 L -.504 .138 L -1.052 .115 L -.653 -.184 L -.047 .298 L -.64 .099 L -.183 0 L -.578 -.926 L -.238 .781 L -.447 -.135 L -.65 .001 L -1.328 -.04 L -.672 .439 L -.39 .055 L -1 -.459 L -.096 .009 L -.142 .014 L -.362 .528 L .201 .229 L .303 0 L .211 0 L .537 -.207 L .406 .092 L .676 .482 L -.68 .373 L .02 .254 L .263 .353 L .593 .146 L .229 .217 L .35 .334 L -.533 .136 L -.503 -.084 L -.276 -.419 L -.79 -.271 L -.224 -.211 L -.265 -.056 L -.013 .02 L -.209 .32 L .209 .154 L .248 .183 L -.248 .179 L -.069 .05 L -.447 -.459 L -.476 .192 L -.287 .291 L -1.025 -.472 L -.419 -.494 L -1.16 -.642 L -.615 .066 L .554 .393 L -.307 .187 L -1.17 -.083 L -.886 -.252 L -.896 -.168 L -1.547 .173 L -.632 .328 L -.392 -.015 L -.433 -.031 L -.135 -.49 L -.333 .057 L -.112 .184 L .474 .731 L -.877 .64 L -.808 .577 L -.915 .317 L -.419 .043 L -.414 -.056 L -.728 -.111 L -.126 .198 L .437 .437 L -.239 .396 L -.327 .199 L -.631 .114 L -.737 .27 L -.268 .17 L .558 .352 L .111 .169 L -.659 .694 L -.154 .297 L -.012 .848 L .144 .636 L .271 .762 L .425 .903 L -.347 -.119 L -.816 -.377 L -.296 .001 L -.416 .116 L -.264 -.069 L -1.029 -.56 L -.921 -.32 L -.375 -.365 L -.336 -.592 L -.332 -.932 L -.078 -.467 L -.268 -.253 L -.657 -.576 L -.845 -1.042 L -.744 -1.227 L -.663 -1.029 L -.363 -.366 L -.412 -.252 L -.783 -.321 L -.475 -.082 L -.643 .018 L -.468 .201 L -.576 .541 L -.418 .413 L -.283 .37 L -.416 .158 L -.501 -.011 L -.337 -.069 L -1.104 -.503 L -1.092 -.659 L -.445 -.549 L -.318 -.847 L -.284 -.678 L -.179 -.226 L -.708 -.491 L -.837 -.519 L -.766 -.632 L -.631 -.662 L -.209 -.112 L -1.892 -.046 L -1.858 -.003 L -.096 .892 L -.213 .101 L -1.867 .011 L -.966 -.037 L -1.544 -.02 L -1.662 -.019 L -.338 -.055 L -3.516 -1.112 L -2.811 -.933 L -1.186 -.39 L -.267 -.154 L -.316 -.31 L -2.381 .084 L -2.367 .155 L -.34 .017 L h 49.818 152.776 m -.122 .086 L -.279 .03 L -.111 -.131 L -.177 -.005 L -.324 .051 L -.304 -.39 L -.071 -.263 L .339 -.01 L .299 -.253 L .188 .218 L .106 .294 L .223 .096 L .233 .279 L h 52.785 154.312 m -.155 -.081 L -.085 -.356 L -.461 -.321 L .095 -.229 L .143 -.058 L .366 .209 L .344 .055 L .616 .356 L -.005 .172 L -.294 .184 L -.563 .069 L h 111.683 77.224 m -.138 .415 L -.45 .067 L -.324 .113 L -.295 .247 L -.321 -.137 L -.185 -.21 L .087 -.443 L .086 -.443 L -.438 -.675 L -.463 -.319 L -.199 -.271 L -1.281 .055 L -.437 .098 L -.153 .161 L -.496 .097 L -.019 -.193 L -.034 -.432 L .212 -.272 L .184 -.212 L -.378 -.347 L -.641 -.438 L -.693 -.696 L -.723 -.317 L -.453 -.136 L .132 -.35 L -.569 -.592 L -.099 -.213 L .371 -.229 L -.068 -.122 L -.301 -.152 L -.445 -.076 L -.392 -.274 L -.237 -.259 L -.57 -.305 L -1 -.411 L -.479 -.765 L -.217 -.583 L -.367 -.399 L -.357 .016 L -.101 .814 L .42 .873 L .104 .306 L -.047 .153 L -.701 -.136 L -.272 -.076 L -.511 -.504 L -.4 -.459 L -.537 .139 L -1.219 -.228 L 1.263 .718 L .032 .214 L -1.62 .171 L -1.093 -.35 L -1.388 -.948 L -.543 -.292 L -.664 -.043 L -.079 0 L -.933 -.213 L -1.3 -.536 L .928 -.248 L .135 -.169 L 90.8 67.129 l -.384 -.153 L -.792 .156 L -.454 .14 L -.656 .017 L -1.058 -.06 L -1.068 -.245 L .027 -.247 L -.148 -.186 L -.325 -.108 L -.359 .016 L -.47 .202 L -1.036 .049 L -1.465 -.122 L 80.46 66.64 l -.786 -.091 L -.248 -.108 L -.651 -.387 L -.427 -.527 L -.301 .218 L -.788 .157 L -.89 -.293 L -.234 -.326 L -.417 -.139 L -.872 -.248 L -1.538 -.23 L -.817 -.248 L -.671 -.342 L -.553 .235 L -.675 .079 L .06 .437 L -.193 .062 L -.389 .25 L -.249 .405 L 1.119 .293 L .174 .294 L -.096 .388 L -.428 .449 L -.458 .001 L -.804 -.214 L -.586 -.061 L -.568 .094 L -.978 .603 L -1.066 .217 L -.936 .448 L -1.035 .448 L -1.095 .109 L .178 -.308 L .063 -.123 L .72 -.401 L -.093 -.385 L -.655 -.523 L .004 -.108 L 64.1 66.19 l .411 -.482 L .157 -.42 L .736 -.312 L .87 -.235 L 1.165 -.018 L 1.085 .123 L .239 -.156 L -1.239 -.466 L -.971 -.389 L -1.043 .049 L -.226 .219 L -.449 .095 L -.573 .438 L -.865 .375 L -1.019 .282 L 61.553 65.9 l -.406 .094 L -.298 .14 L .131 .325 L -.177 .526 L -.563 .34 L -.564 .078 L 59 67.544 l -.592 .278 L -.681 .601 L -.035 .292 L .38 .168 L .36 .03 L .667 .106 L .465 .229 L -.075 .184 L -.43 .338 L -.625 .2 L -.557 .277 L -.423 .398 L -.544 .383 L -.675 .093 L -1.434 .308 L -.678 .397 L -1.036 .337 L -.7 .367 L .52 .5 L -.1 .167 L -1.106 .412 L -.897 .153 L -.778 .168 L 49.51 74.19 l -1.214 .456 L 48.1 74.828 l -.274 .394 L -.753 .439 L -1.193 .229 L -1.234 .184 L -.973 -.345 L .001 -.181 L .332 -.348 L .763 -.273 L .306 -.212 L .445 -.364 L 1.171 -.441 L 1.403 .073 L -.12 -.212 L .02 -.516 L .47 -.304 L .725 -.291 L .754 -.366 L .266 -.214 L .002 -.731 L .246 -.749 L .693 -.49 L .194 -.398 L .034 -.412 L -.633 .122 L -1.251 .186 L -.676 -.029 L -.5 -.597 L -.266 .062 L -.613 .216 L -.136 .23 L .239 .352 L .021 .352 L -.169 .046 L 47 70.115 l -.567 -.32 L -.487 -.397 L -.509 -.291 L -.56 -.03 L -.812 -.106 L -.91 .094 L .028 .138 L -.644 .338 L -1.175 .14 L -.649 -.09 L -.064 -.123 L -.082 -.107 L -.125 -1.028 L .3 -.508 L -.142 -.431 L -.864 -1.002 L -1.43 .437 L -.738 .078 L -.406 .202 L -1.091 .094 L -.4 -.23 L -.394 -.355 L -.466 -.325 L -1.007 -.463 L -.179 -.28 L .292 -.171 L .337 -.437 L .704 .139 L 1.312 .309 L .69 .03 L .238 -.234 L -.375 -.482 L -.458 -.264 L -.363 0 L -.541 .22 L -.528 -.015 L -1.342 -.513 L -.623 -.186 L -.197 .016 L -.858 -.029 L -.024 -.078 L -.623 -.985 L .79 -.19 L .071 -.456 L .495 -.221 L .102 -.299 L .227 -.347 L .893 -.491 L .337 -.38 L .386 -.301 L .527 -.476 L .39 -.175 L .719 .109 L .98 .268 L .485 .094 L .752 -.144 L .427 -.254 L .675 -.429 L 1.252 -.257 L .774 -.033 L .955 -.049 L .354 -.175 L .187 -.478 L -.259 -.669 L -.814 -.686 L .026 -.096 L .927 -.034 L .343 -.256 L -.25 -.384 L -.497 -.256 L -.367 -.08 L -1.88 .389 L 39.33 56.53 l -.534 .289 L -.496 .065 L -1.907 -.333 L -.848 -.031 L 34.8 56.49 l -1.27 .162 L -1.265 -.029 L -1.349 -.174 L -.53 -.207 L -.183 -.788 L .144 -.146 L .636 -.033 L 1.008 -.002 L .446 -.179 L -1.057 -.241 L -1.912 -.304 L 28.13 54.31 l -1.285 -.208 L .219 -.114 L .781 -.262 L 1.568 -.214 L 1.325 -.328 L .958 -.214 L 1.058 -.361 L .953 -.23 L 1.399 -.281 L 1.513 .128 L -.158 .523 L .023 .277 L 1.051 .161 L 1.359 .095 L 1.074 -.019 L .657 -.099 L .784 -.246 L .55 -.295 L .262 -.083 L .752 .064 L .751 .113 L 1.021 -.051 L .2 -.327 L .007 -.18 L -.689 -.064 L -1.946 -.292 L -1.283 -.047 L -.312 -.755 L -1.473 -.162 L -.96 -.031 L -1.573 -.096 L -.194 -.511 L -.484 -.312 L -1.042 -.461 L -.512 -.148 L -2.66 -.659 L -2.008 -.545 L .317 -.167 L .812 -.402 L .086 -.485 L 2.136 -.054 L .99 -.069 L 1.829 -.288 L .784 -.354 L .452 -.623 L .788 -.575 L .616 -.525 L .818 -.41 L .742 -.224 L 1.066 -.104 L 1.133 -.241 L 1.047 -.036 L 1.804 .065 L .146 -.188 L -.156 -.205 L 44.47 42.83 l .018 -.206 L 1.936 -.089 L 1.143 .032 L .974 -.054 L 1.344 -.14 L 1.098 -.416 L .918 -.417 L .957 -.019 L .282 .051 L .675 .241 L .156 .172 L -.383 .139 L .017 .344 L 1.049 .136 L .424 .034 L .536 -.293 L .297 -.208 L 1.419 .187 L 1.534 .049 L 1.062 .049 L .715 .033 L .711 .257 L .359 .274 L .783 .358 L .494 .085 L .421 -.086 L 1.292 .117 L 1.124 .015 L 1.556 -.054 L 1.449 -.088 L 1.213 .1 L 1.377 .254 L .883 .118 L 3.424 .13 L 1.279 .168 L .743 .169 L 2.027 -.038 L 2.339 -.141 L 1.123 .236 L 2.441 .791 L 1.206 .301 L .227 .008 L .102 .483 L -.003 2.855 L .039 2.259 L .052 2.335 L .129 2.796 L -.026 2.183 L -.043 4.334 L .026 2.167 L .089 1.046 L .196 .279 L .84 .074 L 2.424 -.122 L .739 .059 L .332 .388 L .173 .387 L .348 .292 L 2.162 1.318 L .945 .673 L .238 -.325 L .848 -.205 L 1.225 -.67 L .731 -.498 L .495 -.126 L .832 .073 L .316 .199 L .371 .492 L .35 .322 L 2.048 1.175 L .814 .58 L 1.769 1.768 L 1.67 1.882 L .512 .393 L .189 .029 L .98 .314 L 2.025 .763 L .402 .255 L -.163 .788 L .393 .777 L +643.755 159.873 N -1.092 -.52 L -.637 -.337 L -.203 -1.284 L .036 -.282 L .24 -.241 L .42 -.241 L .721 -.623 L .493 .056 L .049 -.17 L .24 -.396 L .239 .028 L .573 .225 L .321 -.312 L .439 -.001 L .798 -.171 L .596 .69 L -.163 .17 L -.443 .354 L -.412 .538 L -.285 .734 L .14 .296 L -.22 .311 L -.292 .085 L -1.026 .383 L -.532 .707 L h 627.173 150.012 m -.679 .314 L -.24 .241 L -.043 .325 L .138 .592 L .228 .366 L .119 .521 L -.109 .339 L -.266 .213 L -.769 -.08 L -.321 -.21 L -.178 -.196 L -.153 -.239 L -.111 -.38 L -.628 .413 L -.647 .159 L -.246 -.083 L -.378 -.266 L -.341 -.746 L -.291 -.379 L -.481 .045 L -.507 .003 L -.228 -.098 L -.117 -.352 L .729 -1.584 L -.033 -.268 L -.521 -.096 L -.554 .074 L -.202 -.324 L -.277 -1.762 L -.156 -.126 L -.479 .017 L -.771 .089 L -.819 .442 L -.312 .086 L -.216 -.069 L 0 -.268 L .224 -.58 L -.163 -.705 L -.075 -.465 L .617 -.85 L .191 -.198 L .487 -.271 L .611 -.525 L .429 -.722 L .353 -.862 L -.02 -.875 L -.195 -1.649 L -.146 -.14 L -.504 .031 L -.287 -.041 L -.217 -.309 L -.243 -.901 L -.397 -.435 L -.504 -.279 L -.277 .044 L -.306 .34 L -.001 .127 L -.624 -.081 L -.73 -.179 L -.657 -.081 L -.3 -.055 L -.102 -.056 L .138 -.269 L .354 -.454 L -.046 -.38 L -.716 -.715 L -.455 -.392 L -1.377 .84 L -.377 .044 L -.975 -.319 L -.286 -.167 L -.355 .087 L -.546 .299 L -1.105 .726 L -.829 .258 L -.543 .37 L -1.123 1.107 L -.397 .27 L -.714 .216 L -.784 .033 L -.189 .1 L -.329 -.619 L -.312 -.209 L -.371 -.041 L -1.659 -.047 L 601 137.538 l -.309 -.294 L -.417 .016 L -.149 .103 L -.348 .239 L -.609 .539 L -1.251 1.545 L -.212 -.662 L .052 -.861 L -.139 -.183 L -.231 -.069 L -.471 .102 L -.345 .129 L -.655 -.159 L -.339 .281 L -.341 -.116 L -.849 .066 L -.319 -.364 L -.63 -.281 L -.407 0 L -.08 .331 L -.271 .083 L -.685 -.38 L .01 .364 L -.237 .099 L -.141 -.463 L -.54 -.496 L -.365 .066 L -.935 -.066 L -.014 -.265 L .175 -.396 L -.326 -.017 L -.333 .248 L -1.451 -.893 L .069 -.281 L -.178 -.38 L -.289 -.166 L -.71 .116 L -.158 .166 L -.657 -.794 L -.454 -.281 L -.15 .132 L -.472 -.215 L -.726 -.595 L -.867 -.264 L -.132 -.612 L -1.079 -.199 L -.186 .182 L -.275 -.066 L -.134 .513 L -.276 .314 L -.299 -.05 L -.24 -.43 L -.859 -.596 L -.154 .066 L -.756 -.248 L .116 -.364 L -1.078 -.579 L -.363 .116 L -.772 -.843 L -.383 -.248 L -.477 .314 L -.198 -.066 L -.099 -.43 L .215 -.215 L -.272 -.364 L .104 -.446 L -.579 -.595 L -.157 -.694 L .785 -.198 L .033 .364 L .337 .264 L .368 -.049 L .376 -.281 L .578 -.364 L -.367 -.694 L .104 -.414 L -.68 -.099 L -.044 -.182 L -.092 -.078 L -.718 -.096 L -.294 -.221 L -.037 -.552 L -.073 -.589 L .184 -.184 L .331 -.221 L -.221 -.258 L -.441 -.405 L -.81 -.11 L -.221 -.515 L -.441 -1.03 L 0 -.515 L -.502 .152 L -.147 -.126 L -.305 -.111 L -1.337 -.104 L -.565 -.436 L -.178 -.09 L -.104 -.199 L -.239 0 L -.52 .196 L -.252 -.281 L -.198 -.218 L -.301 -.07 L .312 -.516 L -.007 -.501 L -.213 -.247 L -.373 -.323 L -.625 .009 L -.282 .128 L -.004 -.456 L -.554 -.117 L -.296 -.047 L -.281 .21 L -.105 -.112 L -.313 -.14 L -.048 -.088 L -.236 -.012 L -.01 -.269 L .574 .059 L .192 -.145 L .354 -.136 L .08 -.249 L .181 -.185 L -.2 -.163 L .152 -.36 L -.245 -.237 L .126 -.428 L -.049 -.123 L -.152 -.012 L -.028 -.246 L .009 -.284 L -.295 -.494 L -.273 -.154 L -.692 -.039 L -.22 -.06 L -.229 .162 L -.463 .045 L -.325 -.394 L -.077 -.305 L .207 -.223 L -.023 -1.031 L .011 -.069 L .139 -.739 L .129 -.213 L .274 -.186 L 1.422 -.704 L 1.737 -.734 L .359 -.03 L .06 .071 L .183 .567 L .344 .055 L .507 -.145 L .885 -.132 L .268 -.243 L .463 -.784 L .467 -.472 L .238 -.03 L 1.248 .235 L .459 -.017 L .478 -.102 L .646 -.345 L .638 -.701 L .405 -.301 L .445 -.145 L 1.338 -.349 L .97 -.219 L .325 -.187 L .051 -.157 L -.031 -.194 L -.139 -.86 L .02 -.399 L .32 -.401 L .705 -.546 L .222 -.33 L -.119 -.47 L -.29 -.441 L -.345 -.627 L -.03 -1.357 L -.483 -.141 L -.366 .06 L -.232 -.185 L .068 -.215 L .215 -.302 L .393 -.188 L 1.799 -.254 L 1.082 -.207 L .35 -.06 L .5 .184 L 1.133 .238 L .394 -.074 L .231 -.145 L .156 -.245 L -.126 -.286 L -.622 -.514 L .137 -.418 L .286 -.605 L .438 -.794 L .516 -1.141 L .427 -.507 L 1.096 .254 L .721 .141 L .594 .141 L 1.402 .079 L .718 -.062 L .417 -.103 L .444 -.392 L .157 -.39 L -.213 -.707 L -.097 -.75 L .34 -.581 L .428 -.277 L 1.199 -.093 L .289 -.06 L .306 -.219 L .035 -.478 L .011 -.275 L .279 -.262 L .542 -.148 L .551 -.034 L .228 -.014 L .569 -.003 L .244 -.074 L .062 .145 L .131 .405 L .24 .563 L .371 .433 L 1.301 .745 L .834 .415 L .614 .069 L .731 .167 L .633 .144 L .354 .143 L .568 .618 L 1.07 1.451 L .401 .66 L -.215 .447 L -.237 .75 L -.214 .389 L -.369 .347 L -.035 .129 L .105 .43 L .233 .229 L .724 .312 L 1.062 .181 L 1.505 .021 L .995 .038 L .668 .083 L .998 .224 L .632 .268 L 1.645 .806 L .839 .31 L .744 .096 L .105 .542 L 1.571 2.161 L .467 .439 L .444 .254 L 1.979 .018 L 1.241 .207 L .802 .109 L 1.165 .022 L 2.861 -.059 L .937 .023 L 1.164 .022 L 1.69 .119 L .521 .168 L .815 .551 L 1.006 .365 L 1.599 .433 L .929 .123 L .663 -.061 L .61 .067 L .253 .297 L .433 .197 L .481 -.017 L .686 -.289 L 1.44 -.534 L .303 -.101 L .736 -.274 L .816 -.289 L 1.204 -.349 L 1.339 -.007 L 1.514 -.065 L .987 .08 L .651 -.061 L 1.941 -.737 L .265 -.172 L 1.111 -1.046 L .67 -.389 L 1.265 -.292 L .326 -.259 L .123 -.271 L -.188 -.228 L -.599 -.411 L -.389 -.569 L -.003 -.343 L .214 -.401 L .539 -.589 L .457 -.231 L .316 -.073 L .718 .154 L .668 .382 L .592 .125 L .982 -.005 L .744 -.047 L .742 -.433 L 1.192 -.91 L .224 .013 L .438 .012 L .624 .054 L .896 -.134 L .638 -.248 L .347 -.188 L .241 -.216 L .312 -.82 L .363 -.333 L .47 -.204 L .464 -.045 L .483 .127 L .353 -.189 L .831 -.278 L .539 -.146 L .937 -.221 L .854 -.033 L .432 .099 L 1.074 .008 L .464 .127 L .414 -.218 L .107 -.217 L -.048 -.273 L -.599 -.501 L -.879 -.99 L -.797 -.5 L -.538 -.199 L -.928 -.212 L -.438 .002 L -1.191 .786 L -.292 -.07 L -.431 -.416 L -.317 -.085 L -.576 .018 L -.754 .062 L -.929 .395 L -.342 .045 L -.051 -.029 L -.269 -.836 L .381 -.58 L 1.224 -1.959 L .687 -1.207 L .295 -.31 L .046 .018 L .452 .172 L 1.126 .574 L .343 -.016 L .438 -.089 L 2.44 -.752 L .779 -.339 L .123 -.233 L -.056 -.306 L -.35 -.348 L -.062 -.146 L .103 -.249 L .422 -.426 L .416 -.543 L .667 -.779 L .599 -.545 L 1.371 -.608 L .167 -.794 L -.107 -.249 L -.465 -.306 L -.558 -.026 L -.822 .078 L .119 -.25 L .375 -.282 L 1.193 -.787 L .478 -.165 L .602 -.136 L 1.854 -.143 L .836 -.123 L 1.203 -.109 L .917 -.049 L 1.148 .215 L 1.037 .481 L .683 .188 L 1.386 -.125 L .539 .026 L .763 .467 L .742 .952 L 1.087 2.384 L .94 1.588 L .927 1.903 L .436 .389 L .507 .2 L 1.247 .341 L 1.523 .253 L 2.659 .839 L .205 .144 L .297 .866 L .44 1.283 L .261 .446 L .68 -.033 L .649 -.018 L 1.657 -.052 L .604 -.22 L .953 -.308 L 1.357 -.31 L 1.181 -.208 L .902 -.034 L .246 .114 L .064 .259 L .116 .389 L .017 .504 L -.566 .407 L -.66 .393 L -.291 .707 L -.278 .893 L -.538 1.066 L -.627 1.08 L -.329 .432 L -.551 .69 L -.47 .347 L -.547 -.098 L -.679 -.225 L -.685 -.24 L -.396 -.041 L -1.664 .982 L -.048 .557 L .332 .897 L .062 .656 L -.006 .613 L -.025 .385 L -.097 .128 L .112 .299 L -.156 .329 L -.511 .43 L -1.252 .462 L -.111 .058 L -.579 -.68 L -.247 .001 L -.253 .129 L -.383 .358 L -.23 .713 L -.955 .532 L -.62 .259 L -.538 .017 L -.452 -.054 L -.333 -.126 L -.392 .059 L -.273 .243 L -.025 .342 L .508 .765 L .046 .113 L -.527 .159 L -.975 .048 L -.508 -.153 L -.493 -.253 L -.273 -.396 L -.448 .017 L -.386 .13 L -.686 1.027 L -.636 .543 L -1.032 .545 L -1.533 .604 L -.52 .329 L -.415 .442 L -.379 .528 L -.066 -.092 L -.417 .171 L -1.222 .13 L -.728 .171 L -2.248 .925 L -.632 .37 L -.566 .469 L -.604 .271 L -.336 .015 L .13 -.255 L .862 -.682 L .33 -.354 L -.47 -.113 L -.37 .072 L -.153 -.297 L .058 -.156 L .953 -.781 L .269 -.384 L .55 -.413 L .159 -.2 L -.057 -.298 L -.73 -.553 L -.727 -.283 L -.131 -.014 L -.628 .03 L -.166 .015 L -.494 .371 L -1.146 1.183 L -.355 .157 L -.643 .086 L -.613 .243 L -.36 .199 L 665.49 112 l -.136 .411 L -.131 .255 L -.251 .255 L -.437 .128 L -.493 -.013 L -.326 .27 L -.307 .114 L -.455 -.565 L -.355 -.014 L -.349 .128 L -.396 .638 L -.301 .694 L .088 .34 L .245 .368 L .558 .268 L .8 .268 L 1.21 -.045 L .29 .254 L -.019 .538 L -.123 .581 L .057 .538 L .261 .283 L .733 .069 L .698 -.157 L .76 -.525 L .509 -.497 L .552 -.228 L .534 -.128 L .287 .07 L .895 .621 L .543 .197 L 1.023 -.087 L .361 .027 L .471 .141 L .274 0 L -.248 .708 L -.057 .552 L -.612 -.197 L -.297 -.084 L -.525 .058 L -1.677 .555 L -.707 .44 L -.072 .735 L -.522 .157 L -.146 -.113 L -.017 -.269 L -.127 -.084 L -.501 .114 L .138 .466 L -.152 .368 L -.485 .496 L -1.397 1.119 L -.126 .226 L .039 .55 L .62 .225 L .712 .492 L .785 .521 L .391 .535 L .424 1.241 L .668 .647 L .175 .437 L -.13 .677 L .172 .183 L .694 .295 L .399 .592 L .562 .253 L .272 .268 L .087 .31 L -.049 .155 L -.789 .369 L .088 .07 L .425 .31 L .314 .79 L -.019 .296 L -.141 .184 L -.534 .043 L -.651 .213 L -.948 .552 L -.849 .213 L -.629 .297 L .72 .21 L .378 .056 L .944 -.425 L .488 -.058 L .162 .056 L .524 .592 L .387 .168 L .456 .027 L .009 .155 L -.231 .311 L -.382 .227 L -.304 .241 L .11 .155 L .326 -.029 L .202 .084 L -.184 .325 L -.298 .749 L -.192 .649 L .028 .353 L -.22 .452 L -.209 .127 L -.35 -.338 L -.146 .142 L -.569 .763 L -.401 .622 L -.215 .622 L -.127 .296 L -.595 .425 L -.251 .438 L -.254 .184 L -.569 .029 L -.382 .227 L .279 .719 L -.264 .508 L .076 .593 L -.093 .269 L -.207 .269 L -.532 .199 L -.161 .282 L -.174 .396 L -.294 .636 L -.626 .354 L -.412 .495 L -.492 -.14 L -.443 -.069 L -.142 .113 L -.145 .198 L .118 .833 L -.213 .142 L -.772 .651 L -.356 .127 L -.628 .171 L -.563 .467 L -.571 .213 L -.107 .113 L -.008 .48 L -.133 .156 L -.568 .058 L -.5 .114 L -.341 .438 L -.364 -.126 L -.52 -.168 L -.274 .057 L -.315 .326 L -.435 .198 L -.643 .1 L -.047 -.465 L -.52 .057 L -.699 .213 L -.32 .198 L -.285 -.042 L -.401 -.493 L -.163 -.155 L -.191 .283 L .095 .169 L -.045 .212 L -.047 .691 L -.209 .297 L -.416 .114 L -.501 -.182 L -.123 .282 L -.001 .24 L -.146 .155 L -.615 .058 L -.366 .114 L -.596 .043 L -.463 -.211 L -.217 .1 L -.439 .48 L -.227 .071 L -.774 -.041 L -.747 .227 L -.406 .326 L -.451 -.027 L -.277 -.084 L -.011 .057 L -.069 .353 L -.29 .396 L .011 .113 L .48 .634 L .269 .126 L .043 .198 L -.36 .269 L -.763 .157 L -.481 -.719 L -.241 -.691 L .012 -.395 L .396 -.777 L -.015 -.169 L -.587 -.253 L -.226 .071 L -.206 .297 L -.454 .072 L -.676 -.21 L -.574 -.733 L -.196 .085 L -.017 .169 L -.159 .396 L -.27 .128 L -.332 -.056 L -.481 .043 L -.055 .038 L -.197 -.143 L -.909 -.107 L -.621 -.166 L -.943 -.615 L -.273 -.365 L -.096 -.521 L .472 -.75 L -.056 -.38 L -.237 -.21 L -.777 .047 L -.66 -.053 L -.771 -.235 L -.623 -.575 L -.298 .101 L -.521 .328 L -.696 .554 L -.341 .157 L -.807 .117 L -1.595 .052 L -.332 .115 L -.584 .413 L -.325 -.097 L -.597 -.392 L -.341 -.012 L -.515 .13 L -.483 .229 L +241.073 156.152 N .017 .52 L .098 1.215 L .012 .212 L -.379 .455 L -.011 .17 L .485 1.358 L -.669 -.577 L -.445 -.056 L -.761 .143 L -.877 -.012 L -.666 -.14 L -.574 -.056 L -.474 .1 L -.378 .354 L -.135 -.042 L -.993 -.549 L -.171 -.325 L .04 -.198 L .269 -.184 L 1.051 .097 L .631 .111 L 1.125 .167 L .654 .041 L .61 -.185 L .386 -.156 L -.198 -.155 L -.692 -.464 L -.136 -.296 L .184 -.707 L -.202 -.296 L -.394 -.154 L -.913 -.14 L -.305 -.211 L .04 -.184 L .119 -.085 L .344 -.1 L .724 -.058 L .781 .125 L 1.081 .294 L .576 .056 L .147 -.089 L +241.295 160.082 N -.485 -1.358 L .011 -.17 L .379 -.455 L -.012 -.212 L -.098 -1.215 L -.017 -.52 L .503 -.279 L .393 .14 L .342 0 L .384 -.17 L .369 -.043 L .14 .198 L .177 .112 L 1 .309 L .657 -.072 L .213 .395 L .335 .338 L .528 .324 L .335 .084 L .643 .21 L .916 .45 L .399 .352 L .231 .311 L -.191 .17 L -.144 .297 L -.314 .368 L -.238 -.098 L -.476 -.592 L -.378 -.042 L -.788 .058 L -.288 -.098 L -.373 0 L -.329 .1 L -.763 .539 L -.396 -.056 L -.319 -.494 L -.166 -.028 L -.155 .057 L -.658 .326 L -.344 .778 L -.41 .65 L -.289 -.112 L -.325 -.551 L +668.053 167.796 N -.131 -.099 L -.74 -.732 L -.444 -1.255 L .037 -.424 L .054 -.706 L -.292 -.465 L .18 -.382 L .978 .704 L .202 -.424 L .023 -.41 L -.101 -.438 L -.026 -.579 L .145 -.438 L .025 -.664 L .082 -.861 L .074 -.636 L .38 -.862 L .188 -.127 L .337 -.142 L .523 .055 L 1.21 .52 L .576 .042 L .188 -.212 L .277 -.17 L .199 .141 L .018 .396 L -.266 .438 L -.045 .48 L .14 .79 L .541 .394 L .182 .325 L -.427 1.271 L -.31 .467 L -.834 .608 L -.555 .312 L -.082 .099 L .003 .268 L -.078 .565 L -.28 .424 L .127 .211 L .35 .733 L .345 1.101 L .26 .62 L .093 .028 L .451 .324 L .296 .07 L .161 -.325 L .485 -.537 L .197 -.029 L .418 .112 L .226 .211 L .179 .635 L .286 .353 L .326 .084 L .505 -.58 L .621 .267 L .141 .028 L .078 .127 L -.168 .156 L -.378 .156 L -.208 .212 L .936 1.226 L -.315 .184 L -.568 -.196 L -.404 -.098 L -.094 -.48 L -.229 -.31 L -.599 -.535 L -.753 -.577 L -.258 0 L -.099 .226 L .371 .776 L -.218 .283 L -.727 -.775 L -.982 -.548 L -.309 .015 L -.344 .142 L -.182 .255 L -.14 .071 L -.395 .057 L -.322 -.225 L -.591 -.366 L -.195 -.423 L .64 -.608 L .323 .211 L .358 .084 L .4 -.199 L -.151 -.169 L -.713 -.295 L -.422 -.395 L -.522 -.168 L -.239 .607 L h 669.676 172.974 m -.452 -.366 L -.349 -.408 L -.051 -.226 L -.364 -1.114 L -.459 -.521 L .685 -.058 L .868 .012 L .314 .169 L .274 .451 L .028 .861 L -.097 .48 L -.214 .283 L -.185 .438 L h 679.073 175.368 m -.562 -.267 L -.178 -.254 L -.237 -.169 L -.064 -.127 L .139 -.339 L -.091 -.423 L -.55 -.352 L -.662 -.479 L -.147 -.466 L .513 -.1 L 1.017 -.143 L .371 .112 L .283 .409 L .069 .818 L .123 .805 L .257 .79 L -.112 .127 L -.167 .057 L h 671.406 176.824 m .022 -.353 L .186 -1.342 L .061 -1.172 L .482 .395 L .576 .281 L .366 .028 L .634 -.185 L .027 .438 L -.079 .396 L -.24 .269 L -.184 .198 L -.908 .651 L -.943 .397 L h 664.721 177.812 m -.366 -.027 L .127 -.297 L .202 -.099 L .314 -.396 L .265 -.523 L .082 -.607 L .138 -.509 L .326 -.184 L .14 .183 L -.16 .283 L .276 .55 L .212 .564 L -.108 .113 L -.664 .354 L -.406 .368 L -.377 .227 L h 673.781 179.981 m -.385 -.366 L -.828 -.591 L -.206 -.38 L .099 -.368 L .565 -.213 L .22 -.269 L .487 -1.822 L .438 -.185 L .271 .028 L .113 .126 L .049 .282 L -.373 .905 L -.089 .226 L -.315 1.413 L .165 .296 L .214 .465 L -.213 .41 L -.212 .043 L h 661.179 181.308 m -.317 -.042 L .215 -.48 L .343 -.467 L .35 -.34 L .592 -.354 L .636 -.496 L .933 -1.089 L .11 .55 L -.118 .424 L -.267 .297 L -.24 .184 L -.516 .213 L -.172 .127 L -.244 .622 L -.327 .269 L -.591 .171 L -.386 .41 L h 680.678 185.402 m -.201 -.098 L -.098 -.438 L -.361 -.748 L -.297 -.112 L -.381 .608 L -.361 .82 L .246 .38 L .166 .395 L .148 .677 L -.158 .495 L -.383 .509 L -.305 -.253 L -.176 -.268 L .201 -.41 L -.076 -.325 L -.363 -.07 L -.361 .665 L -.173 -.056 L -1.114 -.619 L -.557 -.549 L -.206 -.508 L -.037 -.635 L .466 -.905 L -.108 -.479 L -.466 -.409 L -.778 -.295 L -.292 .043 L -.062 .17 L -.129 .226 L -.5 .255 L -.661 .058 L -.027 -.494 L -.174 -.24 L -.399 .199 L -.504 .961 L -.525 .863 L -.219 -.084 L -.119 -.127 L -.034 -.197 L .054 -.311 L .359 -.749 L .185 -.537 L .263 -.283 L .383 -.184 L .564 -.044 L .219 -.127 L .134 -.466 L .205 -.156 L .549 -.241 L .777 -.101 L .292 .353 L .102 .72 L .317 -.156 L .485 -.058 L .207 -.184 L .207 -.565 L .358 -.255 L .479 .21 L .186 .084 L .158 -1.087 L .29 -.015 L .264 .465 L .315 -.481 L .205 -.142 L .392 .098 L .133 -.227 L -.048 -.706 L -.172 -.564 L .146 -.353 L .413 .549 L .711 .803 L .229 .48 L .083 .324 L -.336 .735 L .237 .226 L .537 -.1 L .076 .423 L -.114 .424 L .056 .692 L .207 .437 L -.002 .438 L -.111 .424 L -.283 .579 L -.332 .622 L +251.898 160.229 N -.547 -.112 L -.073 -.212 L .051 -.551 L -.109 -.24 L .11 -.17 L .235 -.071 L .543 .069 L .404 -.015 L 1.505 .11 L .393 .168 L .113 .141 L -.188 .354 L -.07 .099 L -.283 .227 L -.335 .043 L -.739 -.083 L -.657 .072 L -.354 .17 L +228.82 160.519 N -.299 -.056 L -.693 -.224 L -.229 -.268 L -.47 -.366 L -.465 -.084 L -.142 -.211 L .53 -.284 L .704 -.072 L 1.364 .251 L .97 .351 L .651 .267 L .279 .282 L -.04 .198 L -.332 .071 L -.751 -.295 L -.543 .058 L -.227 .255 L -.308 .128 L +400.72 175.499 N -.595 -.119 L -.161 -.032 L -.976 .458 L -1.429 -.006 L -.867 -.037 L -2.119 .041 L -.271 .157 L -.125 .34 L .261 1.934 L .02 .41 L -.191 .17 L -.63 -.434 L -.644 -.166 L -.769 .075 L -.608 .159 L -.446 .257 L -.368 .115 L -.354 -.083 L -.452 -.223 L -.52 -.562 L -.15 -.465 L -.308 -.252 L -.545 .003 L -.259 -.168 L .08 -.043 L .046 -.156 L .172 -.326 L .261 -.92 L .133 -.876 L -.058 -.749 L .141 -.255 L .257 -.016 L .448 -.158 L .543 -.271 L .317 -.369 L .292 -1.047 L .355 -1.217 L .397 -.384 L .273 -.058 L .293 .281 L .551 .364 L .45 -.102 L .174 -.227 L .393 -.822 L .492 -.667 L .638 -.625 L .272 -.101 L .518 .209 L .324 .182 L .274 .027 L .314 -.793 L .304 -.228 L .947 -.458 L 1.22 -.713 L .37 -.073 L .356 .125 L .36 .059 L 1.062 .173 L -.173 .665 L .019 .396 L .426 .93 L .422 .492 L .389 .266 L .502 .42 L .179 .268 L .018 .212 L -.335 .439 L .114 .226 L .97 .757 L .516 .181 L .37 -.044 L .562 .025 L .568 .971 L .131 .367 L -.237 .764 L -.415 .468 L -.337 .158 L -.739 -.095 L -.418 .045 L -.415 .271 L -.366 .553 L -.24 .157 L -.062 .142 L -.29 -.041 L -.611 -.166 L -1.013 -.163 L +209.823 175.47 N -.388 -.645 L -.932 -.888 L -1.003 -1.085 L -.837 -.817 L -.723 -.464 L -.196 -.183 L -.023 -.226 L .625 -.03 L 1.001 -.125 L .29 -.143 L .293 -.412 L .005 -.961 L .882 -.034 L .513 -.583 L .725 .42 L 1.207 -.997 L .503 -.794 L .294 -.242 L .259 .013 L .328 .182 L .463 .097 L .248 -.086 L .424 -.229 L 1.425 -.486 L .23 .519 L .038 .339 L -.057 .509 L -.214 .707 L -.543 .806 L -.1 .749 L .042 .904 L -.245 1.13 L -.188 .735 L -.101 1.385 L .031 .55 L .184 .466 L .188 .363 L -.281 .274 L -.767 -.149 L -.241 -.46 L -.285 .077 L -.394 -.107 L -.603 .25 L -1.651 -.599 L -.43 .271 L +634.036 168.444 N .533 .251 L .736 .165 L .341 .111 L .469 .251 L .248 -.058 L .095 -.24 L -.103 -.211 L -.187 -.182 L -.107 -.296 L .392 -.285 L .476 -.186 L .444 .181 L .373 .351 L .3 -.072 L .975 -.429 L .209 -.114 L -.215 .905 L .029 .663 L .455 1.014 L -.076 .367 L -.05 .424 L .054 1.073 L -.217 .509 L -.385 .285 L -.599 .187 L -.932 .443 L -.521 .229 L -.99 .571 L -.234 .425 L .216 .422 L .568 .435 L .03 .197 L -.17 .27 L -.688 -.194 L -.497 -.011 L -.599 .229 L -.915 .528 L -.646 .229 L -.3 .289 L -.256 -.188 L -.248 -.268 L -.35 -.042 L -.382 .142 L -.205 -.042 L -.293 .043 L -.183 -.113 L .142 -.311 L .182 -.226 L -.04 -.254 L -.283 -.395 L -.277 .043 L -.462 .298 L -.339 .015 L -.171 -1.044 L -.649 -1.488 L .146 -.176 L -.16 -.479 L -.487 -.717 L -.219 -.648 L -.026 -.635 L .076 -.382 L .146 -.297 L .92 -1.233 L .521 -.441 L .383 -.101 L 1.172 -.091 L .798 .066 L .558 -.074 L .575 .039 L .599 .109 L .301 .167 L +214.474 175.913 N .821 .884 L .385 .623 L .314 .322 L .225 .046 L .465 .645 L .441 .352 L -.014 .006 L -.074 .123 L -.478 -.184 L -.219 .205 L -.014 .321 L 0 .58 L .507 .307 L -.396 .368 L .125 .532 L -.374 .369 L .243 .184 L -.204 .609 L .003 -.466 L -.296 -.307 L .01 -.568 L -.377 -.148 L -.238 -.102 L -.111 .082 L .325 .41 L .084 .225 L -.113 .062 L -.726 -.299 L -.13 -.282 L .251 -.339 L .04 -.382 L -.182 -.338 L -.486 -.324 L -.695 -.287 L -.079 -.144 L -.689 -.103 L -.316 -.327 L .007 -.421 L -.146 -.255 L -.249 -.098 L -.576 -.353 L -.416 -.266 L .225 .512 L .086 .222 L .422 .044 L .181 .266 L -.544 .573 L -.144 -.262 L -.356 -.282 L -.561 -.211 L -.323 -.239 L -.147 -.24 L -.104 -.494 L .128 -.421 L .332 -.225 L -.008 -.389 L -.554 -.225 L .363 -.123 L -.057 -.227 L -.238 .017 L .43 -.271 L 1.651 .599 L .603 -.25 L .394 .107 L .285 -.077 L .241 .46 L .767 .149 L .281 -.274 L +436.304 195.359 N -.209 -.451 L -.194 -.804 L -.498 -.802 L -1.217 -1.236 L -.112 -.324 L -.064 -.791 L -.432 -.605 L -.4 -.661 L -.207 -.592 L -.273 -1.185 L -.112 -.776 L .064 -.424 L .144 -.198 L .528 -.399 L .4 -.511 L .866 -1.743 L .354 -.327 L .208 -.114 L .096 .084 L .24 .027 L .449 -.158 L 1.363 -.686 L .494 .661 L .225 .069 L .224 -.03 L .466 -.271 L .754 -.386 L .818 -.273 L .881 .009 L .368 -.031 L .258 -.143 L .646 -1.176 L .117 -.806 L .209 -.199 L .434 -.059 L 2.181 -.055 L .386 -.087 L 2.649 -2.275 L .196 -.284 L .005 -.41 L .165 -.382 L .372 -.228 L .939 -.613 L .322 -.086 L .321 .012 L .559 .208 L 1.342 1.673 L .347 .549 L .122 .536 L -.416 1.472 L .01 .664 L .158 .211 L .802 -.019 L .272 -.001 L .207 .126 L .252 .493 L .223 .225 L .797 .447 L .799 .235 L .351 .196 L .223 .267 L -.148 .481 L .173 .395 L .445 .351 L .558 .378 L .717 .434 L .207 .168 L .206 .366 L .059 .72 L .285 .436 L .367 .224 L .814 .165 L .558 .477 L .157 .352 L -.083 .679 L .031 .07 L -.496 .145 L -.962 .344 L -.319 -.026 L -.287 -.167 L -.687 -.264 L -1.15 -.361 L -.4 .13 L -.082 .551 L -.13 .241 L -.256 .058 L -.399 -.026 L -.862 -.207 L -.593 .102 L -.93 .373 L -.93 .486 L -.271 .016 L -.559 -.35 L -.383 -.153 L -.353 .186 L -.677 1.36 L -.176 .157 L -.591 -.067 L -1.934 -.511 L -1.422 -.189 L -.512 -.322 L -.159 -.239 L -.334 -.394 L -.75 -.518 L -.432 -.167 L -.479 .06 L -.529 .3 L -.353 .341 L -.785 .979 L -.097 .297 L .096 .452 L -.017 .353 L -.063 .594 L -.16 .058 L -.751 .287 L -.895 -.093 L -.624 -.138 L -.367 -.054 L -.975 .175 L -.479 .102 L -.255 .228 L -.222 1.287 L -.158 .523 L -.365 .497 L -.303 .312 L +371.324 180.419 N 1.088 -1.235 L .643 -.866 L .238 -.157 L .594 .039 L 1.137 -.148 L .466 .04 L .42 .224 L .456 .421 L .475 .619 L .252 .761 L .165 1.369 L .26 .656 L -.259 .502 L -1.184 1.151 L -.63 .724 L -.285 .256 L -.061 .103 L -.631 -.523 L -.661 -.408 L -.483 -.196 L -.033 -.141 L .061 -.297 L -.05 -.184 L -.531 -.21 L -.792 -.549 L -.389 -.366 L -.375 -.465 L .494 -.241 L .174 -.227 L -.034 -.155 L -.484 -.211 L -.065 -.113 L .022 -.173 L +579.606 186.906 N -.493 -.083 L -.265 -.197 L -.21 -.353 L -.246 -.621 L -.361 -1.256 L -.034 -.649 L .005 -.763 L -.02 -.904 L -.24 -.696 L .188 -.513 L -.298 -.35 L .068 -.28 L .423 .023 L .349 -.43 L .053 -.367 L .226 -.369 L -.152 -.537 L .529 .48 L .699 .38 L .234 .395 L .549 .776 L .175 .324 L -.099 .339 L .024 .141 L .592 .338 L .266 .733 L .798 1.368 L .136 .508 L -.193 .735 L -.397 .679 L -.369 .396 L -.514 .425 L -.78 .284 L -.642 .043 L +217.111 178.792 N .52 .307 L .195 .512 L .02 .374 L .363 .155 L .628 .024 L .244 -.205 L .398 .43 L .726 .082 L .458 -.083 L 1.348 -.751 L .514 -.046 L 1.387 -.921 L .373 .144 L .742 .069 L .071 .156 L .789 -.017 L .767 .21 L .666 .38 L .644 .563 L .406 .666 L .084 .327 L .228 .149 L .509 1.038 L -.322 .062 L -.094 .43 L -.584 .409 L -.085 -.307 L -.19 -.082 L .045 .45 L -.228 .082 L -.256 .753 L -.378 -.825 L -.441 -.762 L -.137 -.452 L .179 -.24 L .22 -.085 L .786 .125 L -.336 -.193 L -.125 -.164 L -.096 -.471 L -.309 .307 L -.439 .041 L -.244 -.378 L -.031 -.269 L -.193 -.282 L -.132 .151 L -.226 -.287 L -.11 .102 L -.132 -.266 L -.456 -.192 L -.562 -.013 L -.499 .241 L -.382 .108 L -.07 .359 L .081 .234 L -.529 .318 L -.374 .184 L -.335 .029 L -.345 .41 L .049 .296 L .316 .297 L .464 .43 L .178 .386 L -.011 .146 L -.281 .081 L -.243 -.042 L -.431 .391 L -.568 .105 L -.339 -.042 L -.189 -.146 L .108 -.164 L -.349 -.833 L -.244 -.353 L -.177 .674 L -.812 -.409 L -.227 -.757 L -.207 .041 L -.96 -.123 L -.434 -.266 L -.599 0 L -.314 .113 L -.361 .495 L .204 -.609 L -.243 -.184 L .374 -.369 L -.125 -.532 L .396 -.368 L -.507 -.307 L 0 -.58 L .014 -.321 L .219 -.205 L .478 .184 L .074 -.123 L +266.015 188.956 N -.503 -.647 L -.732 -.745 L -.324 -.521 L .071 -.212 L .395 -.539 L -.008 -.58 L .061 -.452 L 1.032 -.19 L .41 -.144 L .308 -.299 L -.141 -.282 L -.62 -.604 L -.074 -.212 L .101 -.255 L 1.655 -1.239 L .061 -.41 L -.095 -.296 L .072 .049 L .496 .338 L .856 .521 L .695 .521 L .587 .663 L .128 .409 L -.036 .734 L .148 .945 L .298 -.593 L .22 -.099 L .6 .182 L .101 .127 L .507 .295 L .708 .549 L .401 .493 L .374 .649 L -.015 .339 L -.142 .496 L -.082 .862 L -.183 .27 L -1.131 .091 L -.169 .17 L .078 .777 L -.095 .467 L -.328 .694 L .571 .831 L .532 .675 L .561 .067 L .185 .295 L .246 .832 L .49 1.127 L .332 .563 L -.06 .212 L -.943 -.022 L -.934 .429 L -1 .331 L -.505 .314 L -.694 .513 L -.686 .075 L -.613 -.392 L -1.103 -.897 L -.15 -.296 L -.008 -.396 L .072 -.354 L -.167 -.31 L -.281 -.394 L -.156 -.465 L .213 -.962 L .547 -1.416 L .179 -.368 L -.435 -.958 L -.533 -.138 L -.304 .001 L .452 -1.09 L -.04 -.212 L -.26 -.111 L -.516 -.124 L -.302 .058 L -.375 .257 L +377.518 182.142 N .193 -.376 L .252 -.242 L .367 -.143 L .528 -.046 L .338 .097 L .165 .366 L .22 .846 L .009 .65 L -.044 .283 L .277 .323 L .404 .322 L .321 .026 L .756 -.922 L .143 -.086 L .337 .097 L .339 .224 L -.062 .17 L .119 .55 L -.059 .438 L -.501 .865 L .05 .183 L .194 .183 L .369 .097 L .592 -.032 L 1.264 1.334 L .131 .282 L -.059 .452 L -.247 .849 L -.105 .565 L -.041 .919 L -1.513 -.643 L -1.221 -.619 L -1.012 -.562 L -.403 -.423 L -1.129 -1.113 L -1.111 -.76 L -.723 -.337 L -.901 -.535 L -.66 -.548 L .061 -.103 L .285 -.256 L .63 -.724 L 1.184 -1.151 L .259 -.502 L +429.505 210.684 N .484 .336 L .177 .013 L .443 -.271 L .327 -.581 L 1.495 -.532 L .054 .424 L .042 .664 L .147 .211 L .57 -.328 L .554 -.399 L .931 -.811 L .364 -.229 L 1.025 -.938 L .086 -.706 L -.122 -.72 L .074 -.396 L .193 -1.159 L .343 -.751 L .47 -.836 L .41 -.454 L .809 -.599 L .525 -.229 L .459 -.427 L .139 -.523 L .169 -.708 L .115 -.61 L .254 -1.342 L .196 -2.021 L .156 -.764 L .094 -.551 L .349 -.821 L .558 -.837 L .398 -1.203 L .031 -.156 L -.128 -.197 L .16 -.058 L .063 -.594 L .017 -.353 L -.096 -.452 L .097 -.297 L .785 -.979 L .353 -.341 L .529 -.3 L .479 -.06 L .432 .167 L .75 .518 L .334 .394 L .159 .239 L .512 .322 L 1.422 .189 L 1.934 .511 L .591 .067 L .176 -.157 L .677 -1.36 L .353 -.186 L .383 .153 L .559 .35 L .271 -.016 L .93 -.486 L .93 -.373 L .593 -.102 L .862 .207 L .399 .026 L .256 -.058 L .13 -.241 L .082 -.551 L .4 -.13 L 1.15 .361 L .687 .264 L .287 .167 L .319 .026 L .962 -.344 L .496 -.145 L .143 .239 L .795 .772 L .348 .493 L .525 .477 L .366 .195 L .352 -.016 L .258 -.242 L .529 -.37 L .384 .012 L .684 .631 L .16 -.1 L .436 -.582 L .258 -.157 L .207 .083 L 1.032 .926 L 1.288 1.32 L .063 .028 L .159 .183 L -.018 .424 L -.26 1.88 L .128 .253 L .191 .027 L .479 .04 L .271 .182 L .111 .31 L -.191 .453 L -1.195 1.066 L -1.241 .996 L -.255 .284 L -.395 .681 L -.217 1.02 L -.107 .507 L .021 .593 L -.025 .734 L .057 .748 L -.076 .27 L -.188 .298 L -.426 .412 L -.301 .171 L -.269 .256 L -.122 .425 L -.49 1.358 L .197 .338 L .689 .999 L .087 .381 L -.04 .438 L .014 .636 L .237 .634 L .017 1.329 L -.064 .762 L .425 1.439 L -.102 .848 L .122 .693 L .486 .631 L .936 .898 L .428 .78 L .689 1.804 L -.563 .068 L -3.015 .499 L -.347 .214 L -.154 .198 L -.797 1.276 L -.029 .622 L .372 2.088 L -.377 1.175 L -.3 1.02 L .043 .296 L .456 .605 L .837 .843 L .445 .279 L .515 .012 L .448 -.455 L .362 -.186 L .136 .183 L .032 .791 L .028 1.427 L -.041 .551 L -.371 -.012 L -1.355 -.091 L -.348 -.21 L -.381 -.647 L -.561 -.731 L -.416 -.351 L -.477 -.252 L -.895 -.263 L -.38 -.28 L -.728 -1.423 L -.212 .354 L -.522 .682 L -.366 .087 L -.325 -.111 L -.922 -.164 L -.925 -.249 L -.489 -.194 L -.58 -1.014 L -.175 .071 L -1.146 .289 L -.195 -.056 L -.172 -.352 L -.365 -.379 L -.678 -.096 L -1.24 -.147 L -.991 .146 L -.859 .26 L -.61 .004 L -.199 -.197 L -.007 -.254 L .198 -.905 L .003 -.466 L -.306 -.62 L -.844 -.998 L -.117 -.211 L -.021 -.212 L .296 -1.033 L .07 -1.06 L -.109 -.607 L -.303 -.605 L .057 -.354 L .177 -.693 L -.052 -.183 L -.322 -.098 L -1.231 .093 L -.88 .019 L -.212 -.168 L .055 -.48 L -.181 -.225 L -2.016 .082 L -.112 .001 L -.089 .354 L .027 .593 L -.286 .892 L -.184 .411 L -.993 .006 L -.899 -.122 L -1.021 .246 L -.88 .034 L -.292 -.168 L -.64 -.787 L -.597 -1.07 L -.537 -1.409 L -.059 -.579 L -.121 -.521 L -.082 -.127 L -.321 -.111 L -.385 -.012 L -1.104 -.008 L -.88 .034 L -.624 .003 L -1.312 -.048 L -.945 -.052 L -.783 .02 L -.432 .03 L -.318 .101 L -.896 .062 L -.699 .314 L -.56 .06 L -.112 -.013 L -.322 -.922 L .012 -.053 L .74 -.3 L -.017 -.085 L .1 -.89 L .094 -.143 L .317 -.199 L .583 -.568 L +468.568 202.653 N 1.277 -.05 L 4.659 0 L 1.448 -.033 L 4.663 2.568 L 3.553 1.984 L .137 .381 L -.116 .552 L .07 .239 L 2.427 1.752 L 1.067 .807 L -.237 .427 L -.419 1.329 L -.137 1.017 L .109 .551 L .665 .987 L .768 .577 L -.024 .282 L -.263 .354 L -.371 1.046 L .037 .17 L .306 .041 L .118 .226 L -.172 .692 L -.019 .946 L .411 1.793 L .18 .564 L .401 .465 L .823 .55 L .396 .268 L .177 .228 L -1.157 .836 L -.515 .342 L -1.218 .402 L -1.243 .559 L -.448 .031 L -.646 -.42 L -.276 -.083 L -.21 .326 L -.543 .766 L -.396 .144 L -.42 -.054 L -.964 .006 L -.963 .02 L -.512 -.294 L -.323 -.394 L -.229 -.083 L -.123 .128 L -.643 .356 L -.526 .088 L -1.019 -.149 L -.898 -.018 L -.196 -.559 L -.135 -.766 L -.053 -.584 L -.135 -.946 L -.448 -.841 L -.663 -.538 L -1.014 -.107 L -.223 .016 L -.385 -.407 L -.732 -.349 L -1.574 -.57 L -1.269 -.6 L -.729 -.265 L -.263 -.21 L -.703 -.641 L -.689 -1.804 L -.428 -.78 L -.936 -.898 L -.486 -.631 L -.122 -.693 L .102 -.848 L -.425 -1.439 L .064 -.762 L 1.252 -.348 L .388 -.539 L .645 -1.204 L .687 -.853 L .346 -.271 L .044 -.212 L -.148 -.239 L -.273 -.125 L -.401 -.068 L -.211 -.211 L .158 -.976 L .304 -.016 L .396 -.158 L .142 -.17 L .104 -.481 L -.167 -.493 L -.364 -.888 L -.121 -.748 L +464.786 206.235 N -.197 -.338 L .49 -1.358 L .122 -.425 L .269 -.256 L .301 -.171 L .426 -.412 L .064 .042 L .546 .223 L .431 -.045 L .458 -.427 L .554 -.398 L .319 -.017 L .121 .748 L .364 .888 L .167 .493 L -.104 .481 L -.142 .17 L -.396 .158 L -.304 .016 L -.559 .031 L -.508 .159 L -.391 .567 L -.158 .085 L -.396 .13 L -.789 -.32 L -.688 -.024 L +465.79 210.652 N -.017 -1.329 L -.237 -.634 L -.014 -.636 L .04 -.438 L -.087 -.381 L -.689 -.999 L .688 .024 L .789 .32 L .396 -.13 L .158 -.085 L .391 -.567 L .508 -.159 L .559 -.031 L -.158 .976 L .211 .211 L .401 .068 L .273 .125 L .148 .239 L -.044 .212 L -.346 .271 L -.687 .853 L -.645 1.204 L -.388 .539 L -1.252 .348 L +427.243 211.207 N .536 -.414 L .68 -.513 L .351 -.13 L .695 .533 L -.583 .568 L -.317 .199 L -.094 .143 L -.1 .89 L .017 .085 L -.74 .3 L .143 -.625 L -.082 -.24 L -.505 -.796 L h 427.998 213.843 m .112 .013 L .56 -.06 L .699 -.314 L .896 -.062 L .318 -.101 L .432 -.03 L .783 -.02 L .945 .052 L 1.312 .048 L .624 -.003 L .88 -.034 L 1.104 .008 L .385 .012 L .321 .111 L .082 .127 L .121 .521 L .059 .579 L .537 1.409 L .597 1.07 L .64 .787 L .292 .168 L .88 -.034 L 1.021 -.246 L .899 .122 L .993 -.006 L .184 -.411 L .286 -.892 L -.027 -.593 L .089 -.354 L .112 -.001 L 2.016 -.082 L .181 .225 L -.055 .48 L .212 .168 L .88 -.019 L 1.231 -.093 L .322 .098 L .052 .183 L -.177 .693 L -.057 .354 L .303 .605 L .109 .607 L -.07 1.06 L -.296 1.033 L .021 .212 L .117 .211 L .844 .998 L .306 .62 L -.003 .466 L -.198 .905 L .007 .254 L .199 .197 L .61 -.004 L .859 -.26 L .991 -.146 L 1.24 .147 L -.214 1.344 L .195 1.059 L .269 .323 L .089 .254 L -.132 .368 L -.436 .44 L -.124 .594 L -.125 .086 L -.517 -.04 L -3.408 .091 L -.051 .877 L .015 1.342 L -.024 3.249 L .017 .848 L .023 .594 L .099 .438 L .308 .394 L .471 .436 L 1.354 1.391 L .611 .632 L -.93 .218 L -1.96 .379 L -1.044 .203 L -.717 -.08 L -1.164 .063 L -.408 -.083 L -.349 -.21 L -2.024 .026 L -.697 -.024 L -.622 -.151 L -.401 -.322 L -.305 -.366 L -.408 -.096 L -.989 -.023 L -2.59 .016 L -1.636 -.019 L -.631 -.011 L -1.296 -.006 L -2.201 .013 L -.636 -.151 L -.463 -.309 L -.45 -.478 L -.294 -.083 L -.499 .088 L -.591 .286 L -.778 .513 L -.758 -.462 L -.352 .144 L -.248 .197 L .048 -1.809 L -.017 -.805 L -.029 -.649 L .397 -.34 L .221 -.269 L .26 -.707 L .163 -.734 L .184 -1.398 L .239 -.976 L .321 -.918 L .584 -.665 L .183 -.565 L .268 -.354 L .64 -.228 L .268 -.325 L .423 -.679 L .364 -1.201 L .053 -.664 L -.046 -.848 L -.191 -.959 L -.201 -.536 L -.492 -.705 L -.476 -.776 L -.268 -.775 L .139 -.495 L .476 -.382 L .158 -.156 L .107 -.424 L -.006 -.479 L -.199 -.579 L -.489 -.69 L -.441 -.733 L -.203 -1.031 L -.181 -.423 L -.276 -.366 L -.666 -.974 L -.072 -.15 L +452.198 239.34 N -.611 -.632 L -1.354 -1.391 L -.471 -.436 L -.308 -.394 L -.099 -.438 L -.023 -.594 L -.017 -.848 L .024 -3.249 L -.015 -1.342 L .051 -.877 L 3.408 -.091 L .517 .04 L .125 -.086 L .124 -.594 L .436 -.44 L .132 -.368 L -.089 -.254 L -.269 -.323 L -.195 -1.059 L .214 -1.344 L .678 .096 L .365 .379 L .172 .352 L .195 .056 L 1.146 -.289 L .175 -.071 L .58 1.014 L .489 .194 L .925 .249 L .922 .164 L .325 .111 L .366 -.087 L .522 -.682 L .212 -.354 L .728 1.423 L .38 .28 L .895 .263 L .477 .252 L .416 .351 L .561 .731 L .381 .647 L .348 .21 L 1.355 .091 L .371 .012 L .041 -.551 L -.028 -1.427 L -.032 -.791 L -.136 -.183 L -.362 .186 L -.448 .455 L -.515 -.012 L -.445 -.279 L -.837 -.843 L -.456 -.605 L -.043 -.296 L .3 -1.02 L .377 -1.175 L -.372 -2.088 L .029 -.622 L .797 -1.276 L .154 -.198 L .347 -.214 L 3.015 -.499 L .563 -.068 L .703 .641 L .263 .21 L .729 .265 L 1.269 .6 L 1.574 .57 L .732 .349 L .385 .407 L .559 .887 L .434 .859 L .013 .324 L -.183 .27 L -.709 .344 L -.011 .127 L .04 .594 L -.091 1.682 L .08 .353 L .216 .168 L .511 .266 L .072 .197 L -.197 .241 L -.472 .258 L -.792 .259 L -.146 .34 L -.094 .764 L -.3 .807 L .2 .479 L .261 .408 L .394 .125 L -1.264 .53 L -1.696 .575 L -.932 .4 L -2.165 .578 L -.187 .128 L -.009 .495 L .152 .465 L .087 .438 L -.505 -.096 L -.999 .049 L -.794 .259 L -.636 .54 L -.312 .539 L -.019 .579 L -.168 .199 L -.285 .114 L -.999 .062 L -.621 .202 L -.306 .341 L -.777 .937 L -.562 .738 L -.825 .951 L -.354 .045 L -.803 -.165 L -.421 -.309 L -.334 .129 L -.521 .286 L -.404 .017 L -.594 -.209 L -.264 -.097 L -.154 -.169 L -.163 -.027 L -.187 -.154 L -.456 -.393 L -.294 -.055 L -1.089 -.093 L -.086 -.099 L -.165 -.056 L -1.845 .364 L +477.231 225.874 N -.224 1.184 L -.107 .48 L .252 .917 L .177 1.017 L .149 .408 L .238 .268 L .803 .588 L 1.189 1.166 L .454 .661 L .14 .48 L -.155 2.346 L -.04 .41 L -.214 .213 L -.432 .073 L -.322 .017 L -.229 .213 L -.076 .622 L .08 .509 L .029 .479 L -.096 .283 L -.185 -.111 L -.562 -.463 L -.763 -1.112 L -.484 -.548 L -.234 -.423 L .036 -.212 L .499 -.61 L .116 -.227 L .025 -.693 L -.1 -.96 L -.22 -.479 L -.261 -.056 L -.674 .061 L -.702 .132 L -.27 -.211 L -.343 -.407 L -.382 -.549 L -.195 -.041 L -.394 -.125 L -.261 -.408 L -.2 -.479 L .3 -.807 L .094 -.764 L .146 -.34 L .792 -.259 L .472 -.258 L .197 -.241 L -.072 -.197 L -.511 -.266 L -.216 -.168 L -.08 -.353 L .091 -1.682 L -.04 -.594 L .011 -.127 L .709 -.344 L .183 -.27 L -.013 -.324 L -.434 -.859 L -.559 -.887 L .223 -.016 L 1.014 .107 L .663 .538 L .448 .841 L .135 .946 L .053 .584 L .135 .766 L .196 .559 L +245.934 224.314 N .939 .136 L 1.122 .304 L .355 -.03 L .946 -.824 L .336 .026 L .48 .025 L .415 -.243 L 1.471 -1.109 L .874 -.485 L .36 -.158 L .934 -.076 L 1.283 .021 L .045 .748 L -.079 .621 L -.064 .622 L .036 .818 L .141 .635 L .335 .591 L .813 .928 L 1.1 .939 L .316 .097 L .787 .023 L .355 -.03 L .676 .25 L .688 .307 L .75 .603 L .3 .098 L .882 .037 L .096 .014 L .385 .774 L .398 .308 L .22 .084 L 1.148 -.077 L .636 .123 L .537 .166 L .403 .237 L .085 .169 L -.038 .565 L .203 1.029 L .03 .706 L .138 2.032 L .249 .944 L .153 .112 L .967 .036 L .5 .012 L 1.615 .019 L .693 .024 L .042 .296 L -.261 .835 L .067 .563 L .436 .407 L .73 .362 L .316 .479 L .307 .774 L .022 .494 L -.185 1.173 L -.238 .834 L -.38 .765 L -.421 .666 L -.089 -.084 L -1.952 -.991 L -.352 -.054 L -.928 .02 L -.843 -.01 L -.126 .128 L -1.076 .204 L -1.104 .162 L -.784 .202 L -.33 .044 L -.332 .383 L -.698 1.105 L -.278 .341 L -.133 .509 L .016 .635 L -.385 1.188 L -.395 1.104 L -.149 .325 L -.592 -.109 L -1.33 -.077 L -.686 .004 L -1.034 1.784 L -.416 -1.084 L -.341 -.309 L -.37 -.195 L -.531 -.067 L -.527 .045 L -.901 .034 L -.615 -.194 L -.193 -.169 L -.322 -.181 L -.292 .27 L -2.026 2.087 L -1.047 .006 L -.272 -.182 L -.397 -2.144 L -.278 -.973 L -.212 -.563 L -.769 -1.11 L -.249 -.676 L .04 -.354 L .437 -1.555 L -.017 -.282 L -.761 -.744 L -.25 -.521 L -.193 -1.213 L -.304 -.647 L -.555 -.745 L -.152 -.253 L -.018 -.142 L -.132 -.295 L -.049 -.48 L .12 -.227 L .723 -.61 L .285 -.439 L -.015 -.522 L -.604 -1.168 L -.022 -.48 L .159 -.34 L .21 -.368 L -.347 -.845 L .102 -.452 L .532 -.582 L .221 -.34 L .156 -.34 L -.236 -.902 L -.057 -.522 L .143 -.848 L .15 -.523 L .437 -.736 L -.08 -.24 L -.922 -1.646 L -1.109 -1.843 L +473.575 260.04 N -1.331 .011 L -.192 .058 L -.068 -.382 L -.261 -.889 L .071 -.495 L -.075 -.296 L -.095 -.324 L .03 -.806 L .057 -1.301 L -.072 -.763 L -.147 -.678 L -.33 -.944 L -.441 -.689 L -.181 -.946 L -.295 -1.199 L -.159 -.183 L .448 -.384 L .396 -.412 L 1.68 -1.706 L .114 -.227 L -.09 -.367 L .075 -.834 L .229 -.481 L .736 -.683 L .205 -.341 L .168 -.41 L -.594 -.845 L -.118 -.805 L -.113 -.494 L .128 -.283 L .448 -.596 L .201 -.411 L -.132 -.805 L -.086 -1.144 L -.031 -.791 L -.178 -.818 L -.441 -.379 L -.515 -.224 L -1.167 -.347 L -1.042 -.445 L -.658 -.223 L -1.438 -.006 L -.137 -.14 L -.025 -.495 L -.011 -.212 L -.087 -.438 L -.152 -.465 L .009 -.495 L .187 -.128 L 2.165 -.578 L .932 -.4 L 1.696 -.575 L 1.264 -.53 L .195 .041 L .382 .549 L .343 .407 L .27 .211 L .702 -.132 L .674 -.061 L .261 .056 L .22 .479 L .1 .96 L -.025 .693 L -.116 .227 L -.499 .61 L -.036 .212 L .234 .423 L .484 .548 L .763 1.112 L .562 .463 L .185 .111 L .096 -.283 L -.029 -.479 L -.08 -.509 L .076 -.622 L .229 -.213 L .322 -.017 L .432 -.073 L .214 -.213 L .04 -.41 L .155 -2.346 L -.14 -.48 L -.454 -.661 L -1.189 -1.166 L -.803 -.588 L -.238 -.268 L -.149 -.408 L -.177 -1.017 L -.252 -.917 L .107 -.48 L .224 -1.184 L .898 .018 L 1.019 .149 L .526 -.088 L .643 -.356 L .123 -.128 L .229 .083 L .323 .394 L .512 .294 L .963 -.02 L .964 -.006 L .42 .054 L .396 -.144 L .543 -.766 L .21 -.326 L .276 .083 L .646 .42 L .448 -.031 L 1.243 -.559 L 1.218 -.402 L .515 -.342 L 1.157 -.836 L .128 .167 L .212 .479 L -.185 .579 L -.302 .453 L -.198 .255 L .181 .451 L .129 .72 L -.012 .466 L .182 1.115 L -.101 .58 L -.258 .325 L .374 .705 L .154 .494 L -.006 1.115 L -.004 .819 L .043 .184 L .185 .127 L .327 .084 L .015 .269 L -.165 .494 L -.563 .58 L .184 .381 L -.08 .283 L -.418 .565 L -.802 .906 L -.512 .622 L -.72 .651 L -1.36 .751 L -1.48 .653 L -.73 .228 L -1.308 .582 L -.852 .637 L -1.286 1.443 L -.886 .85 L -1.193 .878 L -1.181 .836 L -.268 .128 L -.035 .96 L -.083 .495 L .058 .127 L .719 .535 L .188 .381 L -.166 .452 L -.085 .184 L .461 1.511 L .071 .564 L .06 .155 L .246 .014 L .171 -.128 L .141 -.085 L .043 .607 L -.234 2.218 L -.284 .82 L .325 .196 L .152 .057 L -.025 .325 L -.157 .311 L -.516 .566 L -.699 .538 L -.664 .34 L -1.266 .412 L -.796 .312 L -.688 .228 L -.895 .524 L -.652 .665 L -.337 .51 L .292 .338 L .589 .338 L .045 .325 L -.149 1.022 L +499.85 236.166 N .544 -.071 L .622 -.369 L .18 .028 L .346 .098 L .269 -.085 L .396 -.368 L .911 -.143 L .311 .281 L .305 -.028 L .101 -.185 L -.171 -.366 L .771 -.539 L .423 -.198 L .322 .226 L .389 -.213 L -.308 -.494 L .207 -.282 L .505 -.425 L .229 .296 L .229 .056 L .558 -.594 L -.158 -.197 L -.253 -.409 L .094 -.297 L .243 .014 L .27 -.071 L .172 -.34 L -.297 -.875 L .06 -.339 L .255 -.043 L .117 .07 L .253 .438 L .28 .099 L .2 -.41 L .692 -.524 L .235 -.367 L .134 -.452 L .168 -.692 L -.133 -.354 L .003 -.226 L .537 -.468 L .356 .324 L .455 .648 L .612 .281 L .141 .198 L .213 .847 L .294 1.821 L .093 .663 L .231 .791 L .391 .733 L .163 .466 L -.038 .367 L -.069 .155 L -.058 .099 L -.537 .807 L -.22 -.127 L -.189 -.366 L -.555 -.748 L -.297 .143 L -.05 .424 L .193 .875 L .396 .521 L .079 .396 L -.307 .636 L -.746 1.005 L -.045 .452 L .041 .89 L -.18 .946 L -.709 2.12 L -.825 2.572 L -1.254 3.788 L -1.324 4.48 L -.518 1.568 L -.188 .255 L -.508 .637 L -.2 .113 L -1.369 .102 L -.999 .327 L -.474 .468 L -.813 .086 L -.363 -.465 L -.196 -.142 L -.546 -.182 L -.37 .071 L -.269 -.057 L -.863 -.718 L -.104 -.24 L -.02 -.565 L -.104 -.239 L -.46 -.366 L -.124 -.282 L .001 -.721 L .345 -1.088 L -.094 -.325 L -.287 -.479 L -.62 -.931 L -.189 -.494 L .075 -.664 L .391 -1.37 L .228 -.213 L .474 -.185 L .768 -1.371 L .686 -1.174 L .104 -.325 L .151 -1.103 L -.11 -.353 L -.278 -.226 L -.354 -.366 L .066 -.184 L .252 -.509 L -.521 -.861 L -.117 -.677 L -.069 -.494 L -.231 -.721 L .024 -.112 L .517 -.693 L .362 -.594 L .163 -.438 L .007 -1.073 L .484 -.016 L +468.138 234.908 N .011 .212 L .025 .495 L .137 .14 L 1.438 .006 L .658 .223 L 1.042 .445 L 1.167 .347 L .515 .224 L .441 .379 L .178 .818 L .031 .791 L .086 1.144 L .132 .805 L -.201 .411 L -.448 .596 L -.128 .283 L .113 .494 L .118 .805 L .594 .845 L -.168 .41 L -.205 .341 L -.736 .683 L -.229 .481 L -.075 .834 L .09 .367 L -.114 .227 L -1.68 1.706 L -.396 .412 L -.448 .384 L -.342 -.225 L -.547 -.124 L -.442 -.025 L -.529 .145 L -.31 .016 L -.99 -.403 L -.597 -.139 L -.72 -.023 L -.067 -.042 L -.186 -.098 L -.306 -.451 L -.479 -.35 L -.549 -.167 L -.938 -.136 L -.352 -.153 L -.524 -.873 L -.163 -.564 L .032 -.565 L -.127 -.239 L -.78 .019 L -.201 -.098 L -.109 -.211 L .051 -.537 L -.106 -.169 L -.552 -.266 L -.533 -.223 L -.57 -.321 L -.563 -.491 L -.377 -.662 L -.246 -.96 L -.469 -.604 L -.43 -.478 L -.267 -.451 L .103 -.227 L .594 .209 L .404 -.017 L .521 -.286 L .334 -.129 L .421 .309 L .803 .165 L .354 -.045 L .825 -.951 L .562 -.738 L .777 -.937 L .306 -.341 L .621 -.202 L .999 -.062 L .285 -.114 L .168 -.199 L .019 -.579 L .312 -.539 L .636 -.54 L .794 -.259 L .999 -.049 L .505 .096 L +444.673 255.519 N -.006 3.434 L .031 1.894 L .025 2.246 L -.057 .205 L -.454 .318 L -.545 .302 L -.581 .498 L -.427 .034 L -.581 -.166 L -.745 -.042 L -.892 .048 L -.517 -.039 L -.296 -.212 L -.055 -.528 L -.042 -.345 L -.193 -.222 L -.637 -.348 L -.329 -.127 L -.335 .116 L -.109 .217 L -.317 .416 L -.584 .27 L -.152 .068 L -.458 -.491 L -1.041 -1.001 L -.458 -.606 L -.359 -1.03 L -.345 -.72 L -.136 -.493 L .12 -.269 L .053 -.34 L -.458 -.719 L -.231 -.861 L .148 -.861 L -.002 -.48 L -.537 -1.326 L -.496 -2.244 L .772 -.02 L .04 -.678 L -.077 -.749 L -.456 -.006 L .016 -.06 L -.099 -.522 L -.26 -.508 L -1.018 -1.283 L -.343 -.55 L -1.102 -2.158 L -.841 -1.623 L -.9 -1.509 L -.988 -1.269 L -.511 -1.044 L -.122 -.396 L -.045 -.551 L .015 -.578 L .248 -.197 L .352 -.144 L .758 .462 L .778 -.513 L .591 -.286 L .499 -.088 L .294 .083 L .45 .478 L .463 .309 L .636 .151 L 2.201 -.013 L 1.296 .006 L .631 .011 L 1.636 .019 L 2.59 -.016 L .989 .023 L .408 .096 L .305 .366 L .401 .322 L .622 .151 L .697 .024 L 2.024 -.026 L .349 .21 L .408 .083 L 1.164 -.063 L .717 .08 L 1.044 -.203 L 1.96 -.379 L .93 -.218 L 1.845 -.364 L .165 .056 L .086 .099 L 1.089 .093 L .294 .055 L .456 .393 L -.811 .315 L -.891 .02 L -.284 .143 L -.993 .938 L -.209 .029 L -.62 -.773 L -1.048 .134 L -2.962 .47 L -1.183 .021 L .005 1.215 L -.007 1.286 L -.025 .876 L -.043 1.201 L .002 3.561 L -.586 .046 L -1.564 .052 L -.146 .028 L -.106 2.657 L -.009 1.201 L .013 1.624 L .007 .806 L +248.453 316.576 N -.306 .101 L -.892 -.087 L -.538 -.293 L -.236 -.015 L -.311 .163 L -.418 .398 L -.498 .192 L -1.156 .091 L -.349 .09 L -.358 .207 L -.267 .621 L -.114 .341 L .06 .532 L -.163 .622 L -.104 .148 L -.453 .031 L -.534 .104 L -.956 -.413 L .667 -.639 L .326 -.444 L .582 -.4 L .025 -.147 L -.372 -.177 L -.273 -.117 L -1.353 .534 L -1.01 -.013 L -.545 .163 L -.202 -.339 L .128 -.192 L .959 -.268 L .266 .028 L .792 -.208 L .441 -.118 L -.605 -.162 L -.582 .002 L -.77 .001 L -.014 -.413 L .265 -.31 L -.007 -.191 L -.446 -.073 L -.356 -.44 L -.66 .384 L -.669 -.175 L .292 -.53 L .041 -.177 L -.378 .045 L -.361 .147 L -.416 -.396 L -.215 -.117 L .413 -.279 L .114 -.177 L -.091 -.278 L -.053 -.073 L -.351 .03 L -.773 -.424 L -.135 -.059 L .844 -.192 L .253 -.161 L .1 -.294 L .396 -.366 L .049 -.234 L -.641 .06 L -.257 .104 L -.312 -.073 L -.256 -.672 L .573 -.395 L -.565 -.378 L -.12 -.421 L .757 -.452 L -.14 -.421 L -.686 .422 L -.091 -1.523 L .399 -.596 L -.185 -.825 L .013 -.218 L .593 .014 L .41 .245 L .711 .071 L .171 -.246 L .002 -.159 L -.896 -.447 L -.867 .146 L -.317 -.173 L -.536 .059 L -.017 -.231 L .339 -.333 L .025 -.246 L -.067 -.087 L .186 -.202 L .536 .014 L .229 -.377 L .01 -.216 L -.722 -.389 L -.354 -.129 L -.886 .045 L -.332 -.101 L -.024 -.49 L -.939 .16 L -.115 -.101 L .122 -.145 L 1.032 -.521 L .251 -.116 L .4 -.404 L .266 -.389 L .833 -.06 L .268 .201 L .059 .346 L -.648 .202 L -.323 .274 L .11 .505 L .117 .058 L .191 -.102 L .268 -.39 L .183 -.087 L .242 .101 L -.037 .317 L .057 .504 L .886 -.996 L .161 -.678 L .056 -.647 L .237 -.375 L .079 -.058 L .631 -.217 L -.201 -.071 L -.438 -.143 L -.056 -.158 L .101 -.273 L .246 -.072 L .571 -.245 L .599 -.431 L .271 -.459 L -.061 -.229 L -.394 -.157 L -.662 -.399 L -.053 -.372 L .139 -.243 L .105 -.458 L -.06 -.828 L .366 -.33 L .676 -.272 L -.431 -.585 L -.053 -.784 L .133 -.158 L .554 -.157 L .054 -.314 L -.116 -.285 L -.317 -.085 L -.272 -.198 L .233 -.329 L .087 -.313 L -.401 -.185 L -.274 -.014 L -.161 .101 L -.476 .414 L -.548 .058 L -.087 .001 L -.289 -.199 L -.16 -.484 L -.399 -.726 L -.133 -.697 L .188 -.911 L .137 -.413 L .722 -.739 L .535 -.767 L -.006 -.326 L -.544 -1.757 L .001 -.608 L .088 -.567 L -.076 -.438 L -.528 -.891 L -.04 -.298 L .236 -.198 L .499 .098 L .182 -.085 L .2 -.142 L .097 -.143 L .41 -1.288 L .252 -.481 L .304 -.935 L .18 -.65 L .664 -.808 L .363 -.722 L .201 -.636 L .252 -.946 L .311 -.691 L .187 -.128 L .273 -.382 L .013 -.296 L -.312 -.847 L .082 -.184 L .455 -.452 L .206 -.339 L .028 -.24 L -.093 -.226 L -.166 -.805 L -.292 -2.088 L -.098 -.86 L .031 -.565 L .412 -.565 L .37 -.537 L .207 -.564 L .007 -.734 L -.339 -.521 L -.098 -.409 L .295 -.96 L .218 -.941 L .127 -.556 L .461 -.594 L .171 -.918 L .243 -.975 L .126 -.805 L .082 -.565 L -.063 -1.087 L .422 -.664 L .211 -.494 L -.221 -.932 L -.048 -.833 L .148 -.24 L -.022 -.917 L .229 -.607 L -.124 -.297 L -.365 -.084 L .06 -.324 L -.046 -.396 L .223 -.198 L .402 -.198 L .137 -.424 L -.008 -.819 L .093 -.593 L .182 -.918 L -.004 -2.344 L -.172 -2.074 L -.042 -1.539 L -.194 -.974 L -.15 -.387 L .852 -.275 L .259 -.298 L .228 -.933 L .15 -.199 L .586 -.187 L .152 .253 L .555 .745 L .304 .647 L .193 1.213 L .25 .521 L .761 .744 L .017 .282 L -.437 1.555 L -.04 .354 L .249 .676 L .769 1.11 L .212 .563 L .278 .973 L .397 2.144 L .272 .182 L 1.047 -.006 L .107 .056 L .212 .14 L .161 .154 L -.093 .636 L -.541 1.457 L -.36 .256 L -1.346 .53 L -.819 .372 L -.204 .312 L .25 .817 L -.421 .722 L -.007 .579 L .113 .437 L .34 .449 L .03 .226 L -.273 .369 L -.161 .382 L .114 .507 L .53 .477 L .011 .227 L -.152 .311 L -.333 .017 L -.791 .089 L -.329 .835 L -.464 .835 L -.608 .694 L -.282 .439 L -.823 1.839 L .167 1.466 L .054 .762 L -.124 .185 L -.492 .271 L -.292 .34 L -.388 1.201 L -.156 .961 L .285 .633 L .408 1.154 L .784 2.816 L .055 .69 L -.075 .41 L -1.083 1.854 L -.319 .595 L .088 .409 L .189 1.06 L -.078 .325 L -1.334 1.11 L -.231 .312 L -.142 1.075 L .014 1.16 L .249 1.103 L .437 .932 L -.202 .143 L -.951 .529 L -.126 .17 L -.053 .312 L -.511 2.427 L -.316 .541 L -.1 .37 L .123 1.835 L .231 .867 L .012 .427 L -.596 .317 L -.172 .172 L -.106 .271 L .094 1.226 L .125 .128 L .555 .111 L .088 .655 L -.191 1.458 L .252 .585 L .26 .185 L .789 .11 L .302 .17 L -.007 .186 L -.245 .202 L -.322 .13 L -.726 .033 L -.757 .146 L .176 .171 L .586 .298 L .552 .385 L .017 .216 L -.767 .794 L -.059 1.094 L .158 1.035 L -.216 .896 L -.212 .434 L -.226 .262 L -.598 .161 L -.28 .219 L -.249 .781 L .446 .648 L -.069 .188 L -.296 1.218 L -.307 .263 L -1.729 1.01 L -.271 .292 L -.037 .45 L .28 1.309 L .508 1.123 L .218 .043 L .961 -.283 L .654 -.121 L .187 .248 L .231 2.285 L .778 .568 L .669 .041 L 1.41 -.052 L 2.827 .132 L .841 .217 L 1.385 .36 L .286 .039 L h 236.642 296.773 m -.394 -.113 L -.43 -.028 L -.21 -.171 L -.133 -.229 L .21 -.457 L .15 -.657 L -.087 -.514 L .011 -.414 L .364 -.728 L .817 -.116 L .36 .327 L .044 .328 L -.688 .443 L -.146 .229 L .493 .771 L -.194 1.058 L -.167 .271 L h 238.177 317.937 m -.445 -.177 L .083 -.842 L -.849 .075 L -.073 -.368 L .218 -.354 L .823 .102 L .508 -.207 L .205 .103 L .054 .812 L -.267 .34 L -.257 .518 L h 247.801 322.062 m -1.033 .102 L -.467 -.118 L -.55 -.237 L -.42 .001 L -.481 .104 L -.935 .226 L -.496 .03 L .125 -.343 L .202 -.312 L -.104 -.312 L .906 -.15 L 1.434 .058 L .433 .323 L .706 -.007 L -.622 -.689 L -.307 -.163 L -.56 -.117 L -.178 -.089 L -.188 .03 L -.338 -.341 L -.229 -.4 L 1.611 -.581 L -.044 -.296 L -.165 -.147 L -1.819 .285 L -.292 -.222 L .263 -.474 L .146 -.163 L 1.074 -.52 L .868 -.637 L .414 .28 L 1.153 .062 L -.008 1.144 L -.098 3.675 L +456.133 239.67 N .187 .154 L .163 .027 L .154 .169 L .264 .097 L -.103 .227 L .267 .451 L .43 .478 L .469 .604 L .246 .96 L .377 .662 L .563 .491 L .57 .321 L .533 .223 L .552 .266 L .106 .169 L -.051 .537 L .109 .211 L .201 .098 L .78 -.019 L .127 .239 L -.032 .565 L .163 .564 L .524 .873 L .352 .153 L .938 .136 L .549 .167 L .479 .35 L .306 .451 L .186 .098 L -.317 .411 L -.388 .327 L -.507 .243 L -.747 .075 L -.304 .115 L -.7 .823 L -.586 .583 L -.362 .229 L -.747 .357 L -.388 .355 L -.107 .636 L -.222 .666 L -.247 .241 L -.634 .357 L -.98 .33 L -.249 .214 L -.217 .708 L -.345 .963 L -.288 .354 L -.237 .129 L -.584 .116 L -.43 -.026 L -.473 .06 L -.511 -.011 L -.819 -.193 L -.744 -.32 L -.979 -.645 L -.545 -.039 L -.333 .186 L -.084 .24 L -.585 1.134 L -.382 .469 L -.651 .625 L -.632 .428 L -.8 .372 L -.823 .033 L -.854 .047 L -.368 -.097 L -.11 -.183 L .003 -.48 L .243 -.609 L .166 -.538 L -.21 -.762 L -.547 -.943 L -.716 -.787 L -.528 -.067 L -.007 -.806 L -.013 -1.624 L .009 -1.201 L .106 -2.657 L .146 -.028 L 1.564 -.052 L .586 -.046 L -.002 -3.561 L .043 -1.201 L .025 -.876 L .007 -1.286 L -.005 -1.215 L 1.183 -.021 L 2.962 -.47 L 1.048 -.134 L .62 .773 L .209 -.029 L .993 -.938 L .284 -.143 L .891 -.02 L .811 -.315 L +279.288 257.295 N .02 .239 L -.544 1.57 L -.375 .468 L -1.007 .74 L -.301 .27 L -.352 .51 L -.609 -.363 L -.35 -.097 L -.235 .029 L -.387 .172 L -.745 .131 L -.71 .005 L -.564 -.096 L -.992 -.333 L -.607 -.025 L -1.187 .332 L -.19 -.056 L .064 -.212 L .425 -.426 L .486 -.398 L .11 -.198 L -.21 -.619 L .048 -.227 L .625 -.851 L .617 -1.203 L .018 -.268 L -.939 -.503 L -.65 -.18 L -1.448 -.697 L -1.632 -1.106 L -.671 -.307 L -1.173 -.204 L -.498 -.237 L -.835 -.588 L -.576 -.562 L -1.271 -1.376 L -.782 -.913 L -.225 -.337 L -.19 -.056 L .149 -.325 L .395 -1.104 L .385 -1.188 L -.016 -.635 L .133 -.509 L .278 -.341 L .698 -1.105 L .332 -.383 L .33 -.044 L .784 -.202 L 1.104 -.162 L 1.076 -.204 L .126 -.128 L .843 .01 L .928 -.02 L .352 .054 L 1.952 .991 L .089 .084 L .253 .408 L .084 .663 L .521 .872 L .104 .959 L -.132 .862 L -.086 .721 L -.006 .72 L .372 .04 L .818 .15 L .925 .221 L .346 -.03 L .709 -.413 L .115 -.001 L .724 .278 L .843 .404 L .121 .437 L .487 2.524 L .254 .563 L .224 .055 L 1.29 -.445 L .234 .112 L .491 .336 L .019 .141 L -.321 .75 L -.298 .835 L -.222 .819 L -.027 .777 L .063 .423 L +444.673 255.519 N .528 .067 L .716 .787 L .547 .943 L .21 .762 L -.166 .538 L -.243 .609 L -.003 .48 L .11 .183 L .368 .097 L .854 -.047 L .823 -.033 L .8 -.372 L .632 -.428 L .651 -.625 L .382 -.469 L .585 -1.134 L .084 -.24 L .333 -.186 L .545 .039 L .979 .645 L .744 .32 L .819 .193 L .511 .011 L .473 -.06 L .43 .026 L .584 -.116 L .237 -.129 L .288 -.354 L .345 -.963 L .217 -.708 L .249 -.214 L .98 -.33 L .634 -.357 L .247 -.241 L .222 -.666 L .107 -.636 L .388 -.355 L .747 -.357 L .362 -.229 L .586 -.583 L .7 -.823 L .304 -.115 L .747 -.075 L .507 -.243 L .388 -.327 L .317 -.411 L .067 .042 L .72 .023 L .597 .139 L .99 .403 L .31 -.016 L .529 -.145 L .442 .025 L .547 .124 L .342 .225 L .159 .183 L .295 1.199 L .181 .946 L .441 .689 L .33 .944 L .147 .678 L .072 .763 L -.057 1.301 L -.03 .806 L .095 .324 L -1.449 -.585 L -.279 .199 L -.657 .979 L -.28 .567 L -.005 .325 L .39 .676 L .307 .465 L .458 .322 L .671 .109 L .595 -.004 L .076 -.594 L .064 -.198 L .312 -.186 L .131 -.015 L .192 -.058 L 1.331 -.011 L -.182 1.195 L -.352 .849 L -.182 .184 L -.404 .1 L -.093 .24 L .199 .536 L -.104 .467 L -.248 .354 L -.569 .453 L -.923 .581 L -.591 .75 L -1.383 1.98 L -.631 .834 L -1.242 1.373 L -1.193 1.062 L -.829 .863 L -1.434 1.034 L -1.379 1.091 L -.552 .382 L -.989 .638 L -.676 .298 L -.782 .101 L -.98 -.012 L -.549 .071 L -.132 .354 L .013 .127 L -.109 .085 L -.449 -.098 L -.553 -.126 L -.303 .015 L -.25 .198 L -.272 .312 L -.226 .113 L -.36 -.056 L -.768 -.408 L -.759 -.168 L -.542 -.013 L -.31 .113 L -.38 .27 L -.482 -.099 L -.645 -.21 L -.295 .1 L -.638 .043 L -.589 .214 L -.729 .538 L -.72 .086 L -.44 -.013 L -.667 -.084 L -.738 .072 L -.575 .199 L -.827 .82 L -1.251 -.576 L -.092 -.509 L -.218 -.183 L -.479 -.056 L -.28 .085 L -.257 -.479 L -.343 -.056 L -.149 .255 L -.035 .197 L -.312 -.112 L -.119 -.226 L .267 -.495 L .103 -.424 L -.857 -1.354 L -.323 -.282 L -.134 -.226 L .173 -.17 L .636 -.044 L .172 -.424 L .06 -.819 L -.163 -.663 L -.186 -.522 L -.61 -1.143 L -.75 -1.029 L -.472 -.903 L -.612 -1.383 L -.646 -1.467 L -.573 -.818 L -.436 -.467 L .152 -.068 L .584 -.27 L .317 -.416 L .109 -.217 L .335 -.116 L .329 .127 L .637 .348 L .193 .222 L .042 .345 L .055 .528 L .296 .212 L .517 .039 L .892 -.048 L .745 .042 L .581 .166 L .427 -.034 L .581 -.498 L .545 -.302 L .454 -.318 L .057 -.205 L -.025 -2.246 L -.031 -1.894 L .006 -3.434 L h 462.462 268.501 m .412 -.044 L .194 -.553 L .633 -.343 L 1.035 -.303 L .263 -.199 L .582 -1.007 L .268 -.326 L .143 -.241 L -.104 -.226 L -.967 -.744 L -.33 -.337 L -.422 -.266 L -.308 .086 L -.995 .359 L -.65 .329 L -.513 .567 L -.275 .44 L -.691 .611 L .12 .409 L .582 .858 L .285 .366 L .739 .561 L h 432.955 250.661 m .456 .006 L .077 .749 L -.04 .678 L -.772 .02 L -.078 -.354 L -.028 -.396 L .285 -.297 L .101 -.406 L +471.719 258.047 N .075 .296 L -.071 .495 L .261 .889 L .068 .382 L -.131 .015 L -.312 .186 L -.064 .198 L -.076 .594 L -.595 .004 L -.671 -.109 L -.458 -.322 L -.307 -.465 L -.39 -.676 L .005 -.325 L .28 -.567 L .657 -.979 L .279 -.199 L 1.449 .585 L +462.462 268.501 N -.739 -.561 L -.285 -.366 L -.582 -.858 L -.12 -.409 L .691 -.611 L .275 -.44 L .513 -.567 L .65 -.329 L .995 -.359 L .308 -.086 L .422 .266 L .33 .337 L .967 .744 L .104 .226 L -.143 .241 L -.268 .326 L -.582 1.007 L -.263 .199 L -1.035 .303 L -.633 .343 L -.194 .553 L -.412 .044 L +790.15 283.022 N .738 .197 L .008 -.227 L -.242 -.524 L .052 -.284 L .233 .014 L .389 .17 L .37 .751 L .277 .964 L .48 .17 L 1.753 .691 L .506 .113 L .37 -.072 L .699 -.483 L .885 -.343 L .4 .027 L .329 .17 L .066 .454 L -.022 .198 L -.402 1.236 L -.283 .072 L -.761 .058 L -.035 .683 L -.124 .156 L -.424 .029 L -.746 .016 L -.432 .2 L -.271 .284 L .041 .384 L .254 .525 L -.002 .213 L -.151 .199 L -.646 .515 L -.898 1.129 L -.847 1.058 L -.756 .587 L -.68 .316 L -.337 -.171 L -.47 -.313 L -.237 -.328 L .056 -.314 L .288 -.386 L .307 -.671 L .398 -.5 L -.031 -.343 L -.271 -.128 L -.761 -.582 L -.421 -.185 L -.593 -.184 L -.98 -.452 L -.306 -.256 L -.11 -.17 L .081 -.128 L .419 -.157 L 1.389 -.685 L .209 -.512 L -.078 -.695 L .087 -.312 L .396 -.441 L .032 -.383 L -.482 -.837 L .081 -.567 L -.156 -.311 L -.479 -.655 L -.574 -.678 L .102 -.164 L -.145 -.304 L -.291 -.351 L -.336 -.188 L -.29 -.163 L .117 .233 L .497 .515 L .049 .141 L -.169 0 L -.211 -.281 L -.525 -.631 L -.622 -.771 L -.518 -.561 L .001 -.117 L -.268 -.257 L .04 -.141 L .013 -.14 L -.048 -.188 L -.197 -.396 L -.379 -.42 L -.347 -.257 L .163 -.046 L .205 .093 L .358 -.047 L .131 -.093 L .084 .28 L -.149 .187 L .186 .303 L .177 .21 L .167 .116 L .228 .164 L .041 -.141 L .269 .023 L .519 .257 L .42 .117 L .274 .07 L .128 .257 L -.011 .141 L .185 .023 L .146 -.188 L .185 .023 L -.022 .164 L .227 .351 L .249 .187 L .233 .28 L -.18 .023 L -.076 .164 L .093 .163 L -.242 -.023 L -.175 -.047 L .143 .117 L .251 .188 L .23 .233 L .352 .28 L .063 .234 L .019 .21 L -.261 -.047 L .096 .164 L .239 .351 L .256 .188 L -.292 .023 L -.226 0 L -.205 -.047 L -.006 .141 L .306 .14 L .324 .164 L -.09 .211 L .205 .046 L .265 -.023 L .226 0 L .223 .141 L -.114 .07 L -.031 .141 L .025 .141 L .136 .06 L h 782.939 297.694 m -.088 .158 L -.558 .13 L -.309 .288 L -.322 .101 L -.246 .244 L -.692 -.242 L -.16 .086 L .15 .216 L .429 .415 L -.141 .173 L .02 .259 L -.064 .431 L -.218 -.071 L -.976 -.099 L .418 .229 L .449 .244 L -.278 .49 L -.427 .896 L -.212 .549 L -.418 .318 L -.673 .349 L -.171 .246 L -.259 .145 L -.581 .233 L -.593 .406 L -.398 .015 L -1.156 -.258 L -.628 .112 L -.585 -.442 L -.812 -.158 L -.373 -.066 L -.162 -.308 L -.467 -.098 L -.24 .142 L -.062 .168 L -.78 .095 L -.214 -.166 L -.515 -.095 L -.146 -.286 L .432 -.089 L -.223 -.216 L .328 -.116 L .322 -.001 L -.452 -.482 L .82 .266 L -.464 -.576 L .121 -.145 L .946 .156 L .082 -.13 L -.141 -.173 L -.201 -.216 L -.06 -.288 L .283 -.303 L .569 -.246 L .328 -.374 L .561 -.375 L .102 -.302 L .998 -.575 L 1.106 -.275 L .713 -.331 L .544 -.36 L .377 -.101 L .685 -.575 L .066 -.272 L .48 -.302 L .373 -.015 L .787 -.331 L .664 -.402 L .126 -.215 L -.008 -.172 L .266 -.144 L .448 -.302 L -.109 -.501 L .076 -.214 L .166 -.44 L .306 .048 L .066 -.152 L .58 -.259 L .444 -.272 L .137 -.285 L .131 -1.187 L .512 -.647 L .372 .047 L .365 .165 L .032 .259 L .337 .06 L .187 .186 L .231 .799 L .312 .242 L .973 -.645 L .426 -.029 L .367 .113 L .222 .5 L -.197 .399 L .299 .429 L .066 .271 L -.611 .659 L -.261 .401 L -.476 .358 L -.868 .746 L -.578 .359 L -.295 .13 L -.236 .258 L -.389 .159 L -.271 .258 L .416 .407 L .428 .047 L .421 .289 L -.276 .113 L -.484 .07 L -.503 -.296 L -.488 .131 L -.352 .158 L +247.899 318.387 N .008 -1.144 L .821 .289 L .06 .206 L -.354 .312 L -.534 .337 L h 248.453 316.576 m -.286 -.039 L -1.385 -.36 L -.841 -.217 L -2.827 -.132 L -1.41 .052 L -.669 -.041 L -.778 -.568 L -.231 -2.285 L -.187 -.248 L -.654 .121 L -.961 .283 L -.218 -.043 L -.508 -1.123 L -.28 -1.309 L .037 -.45 L .271 -.292 L 1.729 -1.01 L .307 -.263 L .296 -1.218 L .069 -.188 L -.446 -.648 L .249 -.781 L .28 -.219 L .598 -.161 L .226 -.262 L .212 -.434 L .216 -.896 L -.158 -1.035 L .059 -1.094 L .767 -.794 L -.017 -.216 L -.552 -.385 L -.586 -.298 L -.176 -.171 L .757 -.146 L .726 -.033 L .322 -.13 L .245 -.202 L .007 -.186 L -.302 -.17 L -.789 -.11 L -.26 -.185 L -.252 -.585 L .191 -1.458 L -.088 -.655 L -.555 -.111 L -.125 -.128 L -.094 -1.226 L .106 -.271 L .172 -.172 L .596 -.317 L -.012 -.427 L -.231 -.867 L -.123 -1.835 L .1 -.37 L .316 -.541 L .511 -2.427 L .053 -.312 L .126 -.17 L .951 -.529 L .202 -.143 L -.437 -.932 L -.249 -1.103 L -.014 -1.16 L .142 -1.075 L .231 -.312 L 1.334 -1.11 L .078 -.325 L -.189 -1.06 L -.088 -.409 L .319 -.595 L 1.083 -1.854 L .075 -.41 L -.055 -.69 L -.784 -2.816 L -.408 -1.154 L -.285 -.633 L .156 -.961 L .388 -1.201 L .292 -.34 L .492 -.271 L .124 -.185 L -.054 -.762 L -.167 -1.466 L .823 -1.839 L .282 -.439 L .608 -.694 L .464 -.835 L .329 -.835 L .791 -.089 L .333 -.017 L .152 -.311 L -.011 -.227 L -.53 -.477 L -.114 -.507 L .161 -.382 L .273 -.369 L -.03 -.226 L -.34 -.449 L -.113 -.437 L .007 -.579 L .421 -.722 L -.25 -.817 L .204 -.312 L .819 -.372 L 1.346 -.53 L .36 -.256 L .541 -1.457 L .093 -.636 L -.161 -.154 L -.212 -.14 L -.107 -.056 L 2.026 -2.087 L .292 -.27 L .322 .181 L .193 .169 L .615 .194 L .901 -.034 L .527 -.045 L .531 .067 L .37 .195 L .341 .309 L .416 1.084 L 1.034 -1.784 L .686 -.004 L 1.33 .077 L .592 .109 L .19 .056 L .225 .337 L .782 .913 L 1.271 1.376 L .576 .562 L .835 .588 L .498 .237 L 1.173 .204 L .671 .307 L 1.632 1.106 L 1.448 .697 L .65 .18 L .939 .503 L -.018 .268 L -.617 1.203 L -.625 .851 L -.048 .227 L .21 .619 L -.11 .198 L -.486 .398 L -.425 .426 L -.064 .212 L .19 .056 L 1.187 -.332 L .607 .025 L .992 .333 L .564 .096 L .71 -.005 L .745 -.131 L .387 -.172 L .235 -.029 L .35 .097 L .609 .363 L .352 -.51 L .301 -.27 L 1.007 -.74 L .375 -.468 L .544 -1.57 L -.02 -.239 L .957 -.161 L .462 -.017 L .206 .196 L .517 1.154 L -.094 1.638 L -.161 .467 L -.521 .313 L -1.754 .744 L -.348 .242 L -1.633 1.448 L -1.435 1.363 L -1.805 1.816 L -.833 .88 L -.214 .27 L -.443 .524 L -.065 .452 L -.595 2.359 L -.103 .522 L .049 .847 L .168 .986 L -.118 .325 L -.48 .524 L -.24 .495 L -.011 .522 L .194 .577 L -.054 .338 L -.162 .273 L -.26 .325 L .015 .226 L .924 .831 L .68 .281 L .715 .281 L .283 .169 L .281 .325 L -.025 .325 L -.362 .523 L -.043 .396 L .105 .339 L .174 .269 L .466 .325 L .522 .168 L .109 .113 L .226 .892 L -.308 .481 L -.75 .937 L -.729 .766 L -.313 .737 L -.368 .284 L -.832 .342 L -1.04 .342 L -1.92 .401 L -1.795 .188 L -1.361 .116 L -.945 .044 L -1.175 -.11 L -.934 -.226 L -.128 .199 L .036 .808 L .322 .312 L .308 .184 L -.09 .298 L -.381 .624 L -.345 .498 L -.069 .385 L .392 .682 L .066 .285 L -.208 .214 L -.105 .057 L -1.251 .473 L -1.137 .116 L -.814 -.069 L -.967 -.34 L -1.47 -.396 L -.246 .057 L -.23 .271 L .041 .598 L .429 .684 L .037 .398 L -.242 .643 L .092 .385 L .773 .54 L .796 .084 L .369 -.2 L -.387 -.398 L .872 -.188 L .383 -.043 L .234 1.041 L .052 .3 L -.144 .157 L -.299 .101 L -.448 .072 L -.261 -.157 L -.104 -.299 L -.115 -.071 L -1.046 .073 L -.67 .201 L -.212 .101 L .151 .214 L .591 .07 L .47 .113 L .452 .113 L .06 .028 L -.864 .388 L -.776 .287 L -.577 .602 L .003 .414 L .161 .787 L -.081 .258 L -.815 .817 L .022 .215 L .423 .371 L -.491 .116 L -1.194 .088 L -.48 .087 L -.632 .246 L -.619 .389 L -.56 .548 L -.549 .821 L -.052 .389 L .061 .375 L .312 .591 L .48 .446 L .98 .633 L .657 .244 L .97 .143 L .362 .086 L .14 .274 L -.151 .796 L -.128 .348 L -.342 .464 L -.189 .145 L -1.08 .524 L -1.541 .814 L -.712 .698 L -.179 .276 L -.093 .45 L .111 .523 L -.169 .451 L -.239 .32 L -.97 .454 L -.969 .25 L -.421 .221 L -.323 .396 L -.226 .791 L -.054 .514 L .2 .777 L .547 .896 L .699 .779 L .235 .339 L -.101 .032 L h 247.899 318.387 m .18 .182 L .148 .073 L .607 -.075 L .344 .133 L .648 .725 L .908 .665 L .993 .756 L .525 .222 L .73 .37 L .246 .074 L .42 -.001 L .483 .163 L 1.283 .027 L .142 -.016 L -.006 .224 L -.19 .209 L -.492 .06 L -1.198 .092 L -.777 .196 L -.364 0 L -1.179 -.355 L -.753 -.088 L -1.15 -.027 L -.814 -.014 L -.831 .081 L .098 -3.675 L +346.758 54.457 N .127 -.162 L .42 -.179 L .894 .015 L .674 -.098 L -.354 -.227 L -.405 -.34 L .317 -.342 L .277 0 L .956 .42 L .67 .048 L .3 -.163 L -.191 -.26 L -.625 -.373 L .366 -.245 L 1.037 .226 L .957 .08 L .746 .275 L .446 .551 L -.119 .405 L -.441 .292 L .922 .806 L .553 -.356 L .352 -.13 L .63 -.114 L .49 -.179 L .061 -.21 L -.169 -.778 L .542 -.245 L .501 .454 L .426 .307 L .489 .209 L .215 .016 L .185 -.13 L -.264 -.454 L .243 -.163 L .27 -.033 L .817 -.164 L .683 .438 L .536 .242 L .542 .063 L .05 -.178 L -.358 -.535 L 1.006 .145 L 1.439 .079 L .787 -.115 L .427 -.229 L -.021 -.716 L 1.167 .08 L .635 .471 L 1.118 .323 L .683 .015 L .273 .243 L -.252 .552 L .786 .29 L 1.674 .159 L .127 .145 L .143 .548 L -.07 .387 L -.152 .256 L -.152 .256 L -.443 .129 L -.815 .018 L -.195 .096 L -.04 .431 L -.515 .463 L -.497 .16 L -.568 -.031 L -.422 -.159 L -.817 .495 L -.539 .144 L -1.46 .463 L -.853 .113 L -.726 .001 L -.771 .097 L -.784 .587 L -.473 .127 L -1.078 .097 L -.709 -.03 L -1.316 -.171 L -.608 -.142 L -1.283 -.489 L -1.058 -.093 L -.443 .064 L -1.041 -.014 L -1.834 -.124 L -.297 -.206 L .434 -.191 L 1.127 -.352 L .701 -.59 L -.818 -.015 L -.51 -.126 L -.428 -.398 L -.253 -.095 L -.358 .081 L -1.564 .115 L -.557 .033 L -.37 -.223 L .141 -.192 L .388 -.129 L .669 -.097 L .794 -.017 L .729 -.114 L 1.049 -.098 L .376 -.194 L .178 -.322 L -.144 -.258 L -.358 -.177 L -.426 -.015 L -.478 -.145 L -1.005 -.047 L -.821 .099 L -.424 .162 L -.676 .082 L -1.041 -.272 L -.16 -.21 L +462.829 67.958 N .145 .053 L .16 .131 L -.043 .174 L -.175 .044 L -.189 0 L -.116 0 L -.088 .043 L -.058 .131 L -.175 .277 L -.219 .204 L -.319 .131 L -.204 .131 L -.088 .16 L .029 .16 L .131 .437 L .073 .189 L .029 .16 L -.175 .131 L 0 .175 L .175 .233 L .203 .087 L .088 .073 L 0 .073 L .015 .087 L .043 .146 L .175 .043 L .059 .059 L -.175 .073 L -.262 .043 L -.16 .058 L -.059 .102 L -.087 .116 L -.131 0 L 461.402 72 l -.015 .087 L -.116 .058 L .081 .106 L -.125 .025 L -.087 -.015 L -.306 -.043 L -.16 -.058 L -.175 -.073 L -.204 -.044 L -.131 .102 L -.204 -.029 L -.131 .044 L -.16 .087 L -.146 .014 L -.146 -.087 L -.116 -.029 L -.175 0 L -.204 -.117 L -.116 -.174 L -.203 -.117 L -.146 -.043 L -.072 -.117 L -.189 0 L -.247 -.043 L -.204 -.117 L -.029 0 L -.276 -.014 L -.102 -.102 L -.248 -.043 L -.116 -.102 L -.189 -.087 L 0 .073 L -.116 .087 L -.131 -.058 L -.015 -.073 L -.087 -.029 L -.103 0 L -.276 .117 L -.102 .029 L -.131 .015 L -.219 .015 L -.146 .043 L -.262 .029 L -.276 .087 L -.116 .102 L -.087 0 L .156 -.19 L -.003 -.351 L .183 -.238 L -.368 -.21 L -.605 .437 L -.334 -.251 L -.527 -.038 L .043 -.942 L -.396 .188 L -.336 -.415 L .158 -.202 L -.209 -.254 L .265 -.074 L -.092 -.252 L .344 -.042 L 1.026 -.084 L -.006 -.132 L .561 -.108 L .133 -.188 L .436 .101 L .074 -.113 L .317 .05 L .083 -.215 L 1.104 .193 L .446 -.294 L .091 .165 L .514 -.089 L 1.383 .029 L 1.152 .167 L .305 .12 L .592 -.045 L .971 .09 L .426 -.108 L .271 -.24 L -.006 -.009 L +461.353 72.251 N .37 -.004 L -.015 .116 L 0 .117 L .232 .073 L .204 .087 L .087 .073 L .204 .058 L -.015 .087 L -.029 .116 L -.015 .087 L -.102 .073 L -.087 .015 L -.103 .029 L .131 .087 L -.072 .131 L .029 .117 L -.073 .087 L -.102 .073 L -.044 .102 L .204 -.059 L .146 -.015 L .131 .073 L .087 .014 L .073 .044 L -.059 .087 L -.043 .073 L .116 .102 L .131 .058 L .029 .16 L .146 .102 L .16 .043 L -.059 .087 L .131 .117 L -.015 .189 L .088 .233 L -.044 .087 L -.015 .117 L -.061 .042 L -.241 .044 L -.24 .051 L -.12 .12 L -.223 .034 L -.137 .154 L -.137 .085 L -.069 .103 L -.068 .206 L -.188 .035 L -.239 -.035 L -.24 -.034 L -.325 -.034 L -.359 0 L -.172 .068 L -.103 .137 L -.223 .085 L -.154 0 L -.103 -.017 L -.086 .052 L -.377 -.035 L -.273 -.068 L -.154 -.171 L -.138 -.154 L -.325 -.137 L -.497 -.223 L -.342 -.24 L -.377 -.034 L -.583 -.035 L -.325 -.12 L -.291 -.188 L -.086 -.257 L -.188 .017 L -.171 .068 L -.36 .171 L -.394 .017 L -.24 0 L -.273 .085 L -.24 -.085 L -.309 -.103 L -.6 -.017 L -.291 .069 L -.359 -.069 L -.291 -.051 L -.154 .034 L -.274 .069 L -.103 -.052 L -.12 -.137 L -.154 0 L -.257 .068 L -.188 0 L -.754 -.017 L -.445 -.085 L -.754 .171 L -.599 .154 L -.429 .103 L -.257 .137 L -.052 .188 L -.526 .026 L -.065 -.059 L .073 -.837 L .035 -.302 L .127 -.167 L .672 -.379 L .034 -.717 L .267 -.162 L .267 -.273 L .217 -.203 L .296 -.026 L 1.056 -.199 L .166 -.046 L .162 -.066 L .29 0 L .049 .237 L .657 .388 L .422 .162 L .23 .473 L .091 .15 L .441 .196 L .785 .059 L .868 -.244 L .24 -.122 L .178 -.288 L -.052 -.394 L -.193 -.869 L .198 -.243 L .045 -.055 L .087 0 L .116 -.102 L .276 -.087 L .262 -.029 L .146 -.043 L .219 -.015 L .131 -.015 L .102 -.029 L .276 -.117 L .103 0 L .087 .029 L .015 .073 L .131 .058 L .116 -.087 L 0 -.073 L .189 .087 L .116 .102 L .248 .043 L .102 .102 L .276 .014 L .029 0 L .204 .117 L .247 .043 L .189 0 L .072 .117 L .146 .043 L .203 .117 L .116 .174 L .204 .117 L .175 0 L .116 .029 L .146 .087 L .146 -.014 L .16 -.087 L .131 -.044 L .204 .029 L .131 -.102 L .204 .044 L .175 .073 L .16 .058 L .306 .043 L .087 .015 L .125 -.025 L +451.02 79.165 N -.029 -.038 L -.034 -.137 L -.018 -.171 L .068 -.206 L .068 -.154 L .224 -.12 L -.052 -.12 L -.018 -.137 L -.171 -.069 L -.188 -.034 L -.103 -.103 L -.086 -.137 L -.223 .017 L -.257 0 L -.445 0 L -.223 .051 L -.086 -.103 L -.514 -.068 L -.257 -.069 L -.223 -.12 L -.24 0 L -.086 -.052 L -.051 -.154 L -.12 .034 L -.353 .096 L -.043 -.077 L .128 -.012 L .034 -.183 L -.439 -.646 L -.008 -.14 L -.042 -.727 L -.112 -.102 L .526 -.026 L .052 -.188 L .257 -.137 L .429 -.103 L .599 -.154 L .754 -.171 L .445 .085 L .754 .017 L .188 0 L .257 -.068 L .154 0 L .12 .137 L .103 .052 L .274 -.069 L .154 -.034 L .291 .051 L .359 .069 L .291 -.069 L .6 .017 L .309 .103 L .24 .085 L .273 -.085 L .24 0 L .394 -.017 L .36 -.171 L .171 -.068 L .188 -.017 L .086 .257 L .291 .188 L .325 .12 L .583 .035 L .377 .034 L .342 .24 L .497 .223 L .325 .137 L .138 .154 L .154 .171 L .273 .068 L .377 .035 L -.017 .171 L -.086 .154 L -.034 .12 L -.12 .137 L -.086 .137 L .343 .034 L .274 .052 L .085 .051 L -.119 .051 L -.086 0 L -.103 .154 L -.018 .154 L -.171 .017 L -.12 -.086 L -.12 .051 L -.239 -.034 L -.154 .034 L -.086 .154 L -.103 .154 L -.257 .068 L -.429 0 L -.137 .137 L -.12 .12 L -.034 .154 L -.086 .171 L .103 .171 L -.068 .137 L -.239 .154 L 0 .137 L -.068 .085 L -.069 .137 L .172 .034 L .205 0 L .138 .206 L -.086 .188 L -.274 .017 L -.223 -.068 L 0 -.154 L -.034 -.085 L -.086 -.069 L -.171 .051 L -.12 .086 L -.291 -.034 L -.068 .137 L -.24 .12 L -.154 0 L -.188 -.034 L -.273 .103 L .086 .171 L -.069 .12 L -.171 .034 L -.137 -.034 L -.206 .051 L -.377 .154 L -.291 0 L -.068 -.103 L -.12 -.051 L -.239 .051 L -.377 .017 L -.24 .034 L -.291 -.034 L -.154 .034 L -.093 -.035 L -.09 -.171 L -.016 -.029 L -.099 -.186 L -.284 -.487 L -.679 -.243 L -.04 -.014 L -.641 .021 L +452.867 80.273 N .093 .035 L .154 -.034 L .291 .034 L .24 -.034 L .377 -.017 L .239 -.051 L .12 .051 L .068 .103 L .291 0 L .377 -.154 L .206 -.051 L .137 .034 L .171 -.034 L .069 -.12 L -.086 -.171 L .273 -.103 L .188 .034 L .154 0 L .24 -.12 L .068 -.137 L .291 .034 L .12 -.086 L .171 -.051 L .086 .069 L .034 .085 L 0 .154 L .223 .068 L .274 -.017 L .086 -.188 L -.138 -.206 L -.205 0 L -.172 -.034 L .069 -.137 L .068 -.085 L 0 -.137 L .239 -.154 L .068 -.137 L -.103 -.171 L .086 -.171 L .034 -.154 L .12 -.12 L .137 -.137 L .429 0 L .257 -.068 L .103 -.154 L .086 -.154 L .154 -.034 L .239 .034 L .12 -.051 L .12 .086 L .171 -.017 L .018 -.154 L .103 -.154 L .086 0 L .119 -.051 L -.085 -.051 L -.274 -.052 L -.343 -.034 L .086 -.137 L .12 -.137 L .034 -.12 L .086 -.154 L .017 -.171 L .086 -.052 L .103 .017 L .154 0 L .223 -.085 L .103 -.137 L .172 -.068 L .359 0 L .325 .034 L .24 .034 L .239 .035 L .188 -.035 L .068 -.206 L .069 -.103 L .137 -.085 L .137 -.154 L .223 -.034 L .12 -.12 L .24 -.051 L .241 -.044 L .165 .147 L .229 .066 L .197 -.131 L .181 .016 L .312 .033 L .132 .148 L .082 .148 L .197 -.033 L .214 -.065 L .361 -.049 L .312 .049 L .296 .065 L .147 .017 L 0 .115 L -.164 .099 L -.017 .099 L .065 .148 L .164 .148 L .197 0 L .214 -.197 L .279 -.016 L .165 0 L .147 -.099 L .23 -.083 L .131 .049 L .099 .049 L .247 -.049 L .542 .115 L .132 .131 L .279 .099 L .099 .099 L .147 .099 L .165 .033 L .147 -.033 L .049 .115 L -.065 .115 L 0 .083 L -.033 .164 L -.131 .165 L .197 .247 L .147 .099 L .05 .164 L -.066 .131 L -.114 0 L 0 .083 L -.115 .082 L -.099 .049 L -.033 .165 L -.049 .147 L .345 .049 L .132 .181 L .082 .115 L .181 -.049 L .132 .033 L -.099 .115 L -.066 .131 L .017 .099 L .214 .017 L .164 .263 L .115 .23 L .443 .213 L .23 .066 L .279 .082 L .164 .099 L .066 .148 L -.099 .197 L -.066 .181 L .182 .066 L .361 -.066 L .378 .066 L .361 .099 L .263 .066 L -.032 .065 L -.066 .049 L -.082 .017 L .099 .181 L .296 .148 L .279 .066 L .033 .131 L -.065 .164 L -.296 0 L -.148 .083 L -.049 .065 L -.444 .247 L -.525 .099 L -.51 -.016 L -.197 -.132 L -.328 -.049 L -.362 .017 L -.131 .165 L -.099 .131 L .017 .164 L .279 .263 L .296 .164 L 0 .165 L -.132 .066 L .099 .148 L .147 .131 L -.082 .099 L .033 .164 L .033 .23 L -.033 .099 L .164 .082 L .082 .115 L .165 .066 L .002 .142 L -.519 -.005 L -.522 .056 L -.112 .131 L -.205 -.056 L -.187 -.037 L -.336 .075 L -.057 .13 L -.111 .112 L -.317 .187 L -.188 .261 L -.261 .224 L -.057 .206 L .243 .205 L .056 .149 L -.131 .206 L -.261 -.019 L -.149 -.056 L -.149 -.206 L -.112 -.056 L -.187 -.075 L -.224 -.037 L -.225 .037 L -.242 .075 L -.299 .019 L -.149 -.131 L -.224 .075 L -.188 .093 L -.316 .056 L -.188 -.056 L -.037 -.205 L -.112 -.131 L -.168 -.131 L -.13 .038 L -.131 .075 L -.168 0 L -.299 .149 L -.131 .149 L -.168 0 L -.094 -.187 L -.13 -.075 L -.206 0 L -.224 .112 L -.131 -.187 L -.224 -.093 L -.131 .112 L -.354 .056 L -.262 -.112 L -.112 0 L -.019 .205 L -.168 .093 L -.093 -.056 L .056 -.224 L -.243 -.038 L -.187 -.056 L -.541 .112 L 0 -.149 L -.187 0 L .019 -.224 L -.28 -.037 L -.242 .075 L -.523 -.112 L -.578 -.056 L -.075 -.056 L -.522 0 L -.205 -.168 L -.262 .019 L -.522 -.093 L -.467 .075 L -.485 0 L -.354 -.056 L -.355 .056 L -.354 .056 L -.485 -.038 L -.485 .019 L -.205 .187 L -.037 .168 L -.374 .168 L -.373 .206 L -.112 -.112 L -.261 0 L -.374 -.019 L -.037 .131 L 0 .045 L -.126 -.137 L .315 -.752 L -.013 -.25 L -.218 -.146 L -.149 -.176 L -.421 -.146 L -.289 -.012 L .128 -.292 L .291 -.328 L .571 -.244 L .44 -.03 L .263 -.208 L .023 -.236 L -.172 -.502 L -.615 -1.5 L -.16 -.302 L +400.125 81.146 N .633 .305 L .208 .207 L .208 .37 L -.038 .193 L -.545 .563 L .714 .176 L .396 -.311 L .527 -.119 L .602 .028 L .807 .176 L .467 .354 L .235 .752 L -.077 .221 L -.322 .414 L -1.068 .473 L -.767 .561 L -.96 .237 L 1.223 .167 L .501 .043 L .354 -.104 L .39 .117 L -.066 .516 L -.997 .308 L .005 .199 L -.479 -.084 L -1.068 .443 L -.879 -.142 L -.293 -.048 L -1.119 .211 L -.587 -.211 L -.598 .112 L -1.584 .141 L .137 .295 L -.907 -.168 L -.264 .168 L -.911 -.337 L -.334 .143 L -.913 .089 L -.093 .569 L -.337 .316 L -.37 .042 L -.272 -.252 L -.53 -.172 L -.135 .151 L -.527 -.077 L -.948 .324 L -.701 .552 L -.326 -.231 L -.775 -.147 L 1.2 -.472 L .492 -.476 L .447 -.097 L .468 -.388 L .118 -.485 L .242 .063 L .367 -.211 L -.008 -.274 L 1.013 -.105 L .76 .119 L .927 .007 L .073 -.338 L .308 -.142 L .321 -.556 L -.939 .394 L -.725 .016 L -1.467 -.482 L -1.866 -.055 L -.399 -.191 L -.156 -.162 L .417 -.325 L .983 -.194 L .721 -.237 L .38 -.384 L .066 -.827 L -.119 -.192 L -.713 .046 L -.34 -.044 L .288 -.355 L .387 -.223 L .802 -.253 L 1.394 -.062 L .922 -.076 L -.316 -.548 L .172 -.683 L .253 -.461 L -.045 -.312 L -.834 .061 L -.484 -.296 L -.2 -.312 L .309 -.507 L .617 -.433 L -.347 -.104 L -.596 -.088 L -.735 .3 L -.476 .061 L -.753 -.222 L -.088 .194 L -.222 .194 L -.672 -.103 L -.464 -.133 L .1 -.343 L .348 -.36 L .604 -.706 L -.293 -.134 L -.305 -.39 L .028 -.24 L .304 -.106 L .3 -.196 L -.194 -.496 L -.306 .076 L -.636 .453 L -.442 .031 L -.526 .287 L -.14 -.421 L .302 -.527 L .438 -.559 L .065 -.257 L -.417 -.195 L -.196 -.045 L -.218 .302 L -.394 .257 L -.493 -.165 L .299 -.575 L .54 -.455 L .09 -.136 L -.225 -.575 L .366 -.092 L .225 -.197 L -.672 -.515 L .432 -.351 L .752 .151 L .387 -.092 L -.645 -.759 L .975 -.169 L -.457 -.502 L .416 -.382 L .924 .365 L .824 -.093 L .686 -.139 L .867 -.047 L .612 .014 L .303 .259 L -.307 .29 L -1.726 .704 L -.46 .274 L -.218 .441 L .222 .182 L .784 .029 L .877 -.078 L .685 -.001 L .53 .075 L 1.563 -.064 L .458 .378 L -.363 .425 L -.212 .323 L .098 .112 L -.565 .66 L -.226 .111 L -.339 .437 L -.696 .261 L -.382 .038 L .451 .186 L .508 .167 L -.116 .015 L -.272 .19 L -.61 .052 L -.275 .196 L -1.337 -.025 L .404 .223 L .302 0 L .492 .093 L .432 -.006 L .519 -.223 L .413 -.025 L .449 .161 L .656 .164 L .673 .566 L .496 .228 L .118 .165 L -.067 .238 L .312 .78 L .371 .536 L .438 .189 L .714 .107 L .59 .549 L .688 .593 L .135 .52 L -.188 .49 L .257 .124 L h 387.915 77.13 m -.128 -.325 L .149 -.335 L .38 -.089 L .079 .501 L -.307 .251 L -.173 -.003 L h 386.786 80.184 m -.178 -.272 L -.967 .072 L .123 -.256 L -.364 -.15 L -.26 -.257 L -.335 -.107 L -.253 .364 L -.751 .257 L -.778 -.192 L -.401 -.278 L -.101 -.278 L .86 -.278 L -.483 -.257 L .817 -.107 L .385 -.484 L -.029 -.235 L .449 -.09 L .508 -.15 L .781 -.077 L .424 .044 L .389 .104 L .362 -.046 L .218 .149 L .519 .791 L .047 .179 L -.081 .298 L .308 .446 L -.155 .328 L -.402 .328 L -.354 .12 L -.299 .038 L +578.943 106.217 N -.41 -.375 L -.466 -.098 L -.663 0 L -.196 -.27 L -.27 -.147 L -.147 -.344 L -.564 .049 L -.981 -.246 L -.662 .074 L -1.35 -.024 L -.662 -.098 L -.712 -.221 L -.785 .147 L -.761 0 L -.858 .024 L -.441 .27 L -.54 -.098 L -.908 -.196 L -.735 -.246 L -.761 -.27 L -.589 -.074 L -.688 .123 L -.466 .368 L -.245 .736 L .024 .442 L -.344 -.123 L -.81 -.123 L -.688 -.196 L -.883 -.245 L -.883 -.147 L -.663 .098 L -.736 .123 L -.318 .368 L -.393 .442 L .044 .273 L -.322 .031 L -.377 .377 L -.283 -.126 L -.22 .063 L -.346 .283 L -.534 .471 L -.755 .189 L -.943 .377 L -.282 .188 L -.221 .472 L -.439 .188 L -.504 .44 L .157 .409 L -.125 .188 L -.66 0 L -.44 -.346 L .062 -.283 L -.062 -.283 L -.44 -.314 L -.346 0 L -1.006 .094 L -.691 .032 L -.503 -.063 L -.346 -1.069 L -.221 -.817 L -1.006 0 L -.031 -.754 L .188 -.409 L .031 -1.038 L -.66 .314 L -.66 -1.006 L -.597 -.22 L -.724 -.723 L -1.1 .409 L -2.767 -.188 L -2.578 .346 L -2.012 -1.666 L -5.722 -2.986 L -5.658 1.289 L -.056 8.174 L -.158 -.014 L -.341 .106 L -.489 .043 L -.447 -.255 L -.638 -.703 L -.256 -.511 L -.617 -.383 L -.681 -.383 L -.512 -.234 L -.979 .085 L -1.277 .298 L -.937 .532 L -.529 .453 L .092 -.399 L -.06 -.18 L -.12 -.12 L .14 -.26 L .2 -.2 L .14 -.32 L .04 -.3 L .18 -.2 L -.159 -.24 L -.4 -.16 L -.459 .06 L -.18 -.16 L -.3 .06 L -.2 .04 L -.199 -.18 L -.221 -.32 L -.319 -.28 L -.34 0 L -.359 .02 L 0 -.2 L .08 -.28 L -.2 -.379 L -.239 -.12 L -.2 -.24 L -.399 -.799 L -.08 -.28 L -.56 -.12 L -.699 -.08 L -.14 -.16 L .02 -.439 L .16 -.12 L .3 -.06 L .399 .02 L .34 .02 L .479 .14 L .539 .18 L .18 -.08 L .36 -.08 L -.2 -.16 L -.26 -.12 L -.399 -.2 L -.2 -.24 L .26 -.36 L .28 -.04 L .08 -.26 L .18 -.299 L .12 -.14 L .26 .04 L .319 -.08 L .16 -.1 L .339 .12 L .24 0 L 1.119 -.04 L .999 .14 L .499 .02 L -.159 -.08 L -.34 -.2 L -.479 -.12 L -.021 -.3 L .2 -.2 L .279 -.22 L .221 -.28 L .119 -.52 L .12 -.28 L -.16 -.24 L -.14 -.16 L .1 -.2 L .26 -.2 L -.119 -.12 L -.101 -.3 L -.359 -.12 L -.359 -.04 L -.68 -.1 L -.2 .16 L -.199 .08 L -.52 .08 L -.46 -.12 L -.319 -.26 L -.26 -.06 L -.68 -.12 L -.56 .06 L -.659 .319 L -.42 .02 L -.799 .5 L -.72 .28 L -.499 .06 L -.42 -.02 L -.279 .24 L -.213 .18 L -.616 -.19 L -.857 -.377 L -.068 -.308 L .343 -.103 L .309 .103 L .445 .103 L .138 -.103 L -.96 -1.131 L -.343 -.514 L -.479 -.206 L -.515 -.445 L -.514 -.034 L -.343 .034 L -.583 -.206 L -.103 .343 L -.514 -.514 L .068 -.309 L -.138 -.377 L -1.37 -.343 L .65 -1.165 L .446 -.274 L .239 -.206 L -.239 -.274 L -.343 -.171 L .205 -1.303 L .823 -.137 L .343 -.549 L .103 -.308 L .411 -.069 L .514 .24 L .48 .548 L .514 .411 L .651 0 L .411 -.24 L .068 -.446 L -.171 -.411 L -.068 -.445 L .479 -.206 L .891 -.411 L .172 -.24 L .309 -.309 L .514 -.171 L .549 -.068 L .788 -.377 L .548 -.343 L .515 -.309 L .651 .069 L .479 0 L .309 .274 L .651 -.137 L .273 -.137 L .617 -.24 L .411 .069 L .411 .514 L .788 .035 L .617 -.069 L .96 .171 L 0 .343 L .582 .206 L .789 .343 L .411 .274 L .068 .583 L .274 .137 L .239 -.274 L -.205 -.48 L -.034 -.24 L .72 .068 L .582 .548 L .686 .137 L .411 .24 L .686 -.171 L .274 -.274 L .377 -.343 L .514 -.377 L .823 .068 L .65 .035 L .651 .411 L .617 -.068 L .137 -.412 L 1.062 -.103 L .754 .103 L .274 .548 L .926 .309 L .754 .137 L .411 .171 L .651 -.343 L .171 -.309 L .24 0 L .343 .343 L .959 .034 L 1.577 -.411 L .137 -.309 L .138 -.686 L -.24 -.24 L -1.165 -.171 L -.274 -.308 L -.651 -.069 L -.377 -.137 L .068 -.171 L -.377 -.137 L -.239 0 L -.164 -.274 L .467 -.067 L .735 -.368 L .588 -.147 L .331 -.294 L -.441 -.478 L -.146 -.257 L .662 -.515 L .698 -.184 L 1.103 .147 L .515 -.073 L .11 -.257 L -.956 -.294 L -1.065 -.11 L 0 -.331 L .294 -.074 L -.294 -.221 L -.074 -.441 L .185 -.515 L .33 -.074 L 1.066 .147 L .515 0 L .772 0 L .368 -.184 L 1.396 -.405 L 1.029 -.037 L .735 -.11 L 1.545 -.11 L .588 -.073 L .331 .073 L .221 -.331 L .625 -.331 L 1.177 -.037 L 2.021 -.405 L 1.876 -.073 L .625 -.074 L .367 -.368 L 77.39 V .515 -.037 L .589 -.184 L .11 -.221 L .735 -.037 L .919 .147 L .515 .11 L .772 .257 L .625 -.11 L .882 -.037 L .368 .404 L -.037 .331 L .147 .221 L .515 .22 L -.11 .331 L -.147 .257 L .073 .331 L -.33 .037 L .184 .257 L .478 .074 L .295 -.147 L .44 .11 L .368 -.147 L .367 .074 L .331 -.221 L .294 .11 L .295 .368 L .367 .221 L .147 -.147 L .184 -.147 L .478 .037 L .405 .294 L .478 .11 L .441 -.221 L .367 0 L -.146 .294 L -.441 .184 L -.331 .441 L .331 .184 L .441 -.11 L .771 -.073 L .441 .037 L .552 .184 L .294 -.294 L .772 -.441 L 1.103 -.257 L .956 -.515 L .772 -.221 L .515 -.22 L .809 -.074 L 0 .441 L -.515 .11 L -.11 .368 L 1.104 .588 L .809 .294 L 1.287 .772 L 1.066 1.029 L 1.69 2.133 L .846 .882 L 1.104 1.434 L .515 -.257 L .331 -.257 L .367 -.515 L .92 0 L .367 .331 L 0 .368 L .478 0 L .258 .257 L .184 .184 L .589 0 L .992 0 L .993 -.221 L .771 -.221 L .993 -.037 L .698 .441 L .772 .588 L .331 .625 L .956 .147 L .588 .552 L .662 .699 L .882 .073 L .993 .074 L .478 -.368 L .625 -.184 L -.073 .331 L .441 .331 L .294 .478 L .589 0 L .064 .145 L -.551 .034 L -.542 .148 L -.279 .262 L -.011 .275 L -.035 .478 L -.306 .219 L -.289 .06 L -1.199 .093 L -.428 .277 L -.34 .581 L .097 .75 L .213 .707 L -.157 .39 L -.444 .392 L -.417 .103 L -.718 .062 L -1.402 -.079 L -.594 -.141 L -.721 -.141 L -1.096 -.254 L -.427 .507 L -.516 1.141 L 584.2 97.43 l -.286 .605 L -.137 .418 L .622 .514 L .126 .286 L -.156 .245 L -.231 .145 L -.394 .074 L -1.133 -.238 L -.5 -.184 L -.35 .06 L -1.082 .207 L -1.799 .254 L -.393 .188 L -.215 .302 L -.068 .215 L .232 .185 L .366 -.06 L .483 .141 L .03 1.357 L .345 .627 L .29 .441 L .119 .47 L -.222 .33 L -.705 .546 L -.32 .401 L -.02 .399 L .139 .86 L +386.786 80.184 N -.304 .038 L -.223 .09 L .241 .252 L .361 .771 L .287 1.213 L -.061 .281 L -.359 .341 L -.242 .414 L -.145 .473 L -.185 .044 L -.284 -.058 L -.616 .031 L -.15 .212 L -.913 .042 L -.84 .132 L -.247 .144 L -.661 .286 L -.903 .498 L -.628 .035 L -.879 .283 L -1.28 .084 L .053 -.378 L -.089 -.441 L -.848 .1 L -.171 -.487 L .734 -.254 L -1.186 -.021 L .062 -.233 L 1.286 .027 L .198 -.104 L .039 -.222 L .107 -.31 L .515 -.134 L .692 -.031 L .13 -.281 L -1.07 .099 L .387 -.437 L -.187 -.159 L .481 -.468 L .694 -.011 L .163 -.089 L -.174 -.311 L -.348 .177 L -.309 -.131 L -.319 .03 L -.391 -.177 L -.414 .001 L -.182 .106 L 378 81.478 l .309 -.306 L -.29 -.142 L .759 -.126 L -.139 -.301 L .391 -.235 L -.481 -.214 L -.59 .128 L 378 79.792 l .38 -.268 L .215 -.16 L .928 .187 L .336 -.075 L .527 .038 L 1.102 .123 L -.214 -.358 L 382.132 79 l .198 -.321 L -1.373 0 L .154 -.15 L .569 -.107 L .061 -.29 L .291 -.479 L .505 -.181 L .804 -.169 L .22 .302 L .354 .149 L .156 -.031 L .029 .235 L -.385 .484 L -.817 .107 L .483 .257 L -.86 .278 L .101 .278 L .401 .278 L .778 .192 L .751 -.257 L .253 -.364 L .335 .107 L .26 .257 L .364 .15 L -.123 .256 L .967 -.072 L .178 .272 L +452.998 85.535 N 85.49 V .037 -.131 L .374 .019 L .261 0 L .112 .112 L .373 -.206 L .374 -.168 L .037 -.168 L .205 -.187 L .485 -.019 L .485 .038 L .354 -.056 L .355 -.056 L .354 .056 L .485 0 L .467 -.075 L .522 .093 L .262 -.019 L .205 .168 L .522 0 L .075 .056 L .578 .056 L .523 .112 L .242 -.075 L .28 .037 L -.019 .224 L .187 0 L 0 .149 L .541 -.112 L .187 .056 L .243 .038 L -.056 .224 L .093 .056 L .168 -.093 L .019 -.205 L .112 0 L .262 .112 L .354 -.056 L .131 -.112 L .224 .093 L .131 .187 L .224 -.112 L .206 0 L .13 .075 L .094 .187 L .168 0 L .131 -.149 L .299 -.149 L .168 0 L .131 -.075 L .13 -.038 L .168 .131 L .112 .131 L .037 .205 L .188 .056 L .316 -.056 L .188 -.093 L .224 -.075 L .149 .131 L .299 -.019 L .242 -.075 L .225 -.037 L .224 .037 L .187 .075 L .112 .056 L .149 .206 L .149 .056 L .261 .019 L .131 -.206 L -.056 -.149 L -.243 -.205 L .057 -.206 L .261 -.224 L .188 -.261 L .317 -.187 L .111 -.112 L .057 -.13 L .336 -.075 L .187 .037 L .205 .056 L .112 -.131 L .522 -.056 L .519 .005 L .357 .089 L .469 .022 L .313 -.156 L .179 -.291 L .134 -.268 L .536 .246 L .536 -.022 L .67 -.223 L .692 .112 L .514 -.134 L .201 .268 L .312 .134 L .246 .335 L .134 .201 L .246 .156 L .312 .156 L 0 .268 L -.312 -.022 L -.312 .134 L .134 .291 L .111 .357 L .269 .29 L .647 0 L .156 .112 L .514 -.067 L .38 .022 L 0 .312 L .402 0 L 0 .357 L .224 .268 L .089 .246 L -.089 .179 L .089 .224 L .179 .089 L .291 .29 L .268 -.179 L .47 -.067 L .268 .067 L .469 .291 L .201 -.067 L .179 .022 L .179 .156 L .425 -.112 L .312 -.112 L .269 0 L .536 -.134 L .357 -.067 L .111 .156 L .268 .179 L 0 .134 L .201 .179 L .022 .134 L .402 .044 L .179 .179 L .224 .112 L .29 -.134 L .045 -.157 L .224 -.067 L .29 .268 L .425 .067 L .469 .112 L .268 .112 L .357 -.067 L .201 .179 L .291 .089 L .469 .022 L .111 .224 L .357 .156 L .269 0 L .134 -.044 L .201 -.089 L .156 .089 L -.089 .111 L -.022 .179 L .111 .089 L .09 .179 L -.045 .224 L -.201 .089 L -.156 .067 L -.357 .201 L -.312 .044 L .223 .246 L .269 .089 L .29 .044 L -.134 .156 L -.312 0 L -.246 0 L -.045 .179 L -.044 .224 L .156 .067 L .179 .067 L .044 .134 L .045 .179 L .09 .201 L .066 .067 L -.156 .491 L -.156 .291 L 0 .156 L -.335 .134 L -.805 -.157 L -.736 .045 L -.269 0 L -.022 .179 L -.223 .179 L -.38 .134 L -.357 .022 L -.224 .089 L -.09 .514 L 0 .224 L -.021 .112 L -.012 .126 L -.779 .104 L -.971 .06 L -.511 .405 L -.729 .189 L -1.135 .075 L -1.119 .248 L -.502 .318 L -.463 .059 L -.453 -.316 L -.369 .621 L -.31 .188 L -.477 .044 L -.438 -.057 L -.959 .031 L -.5 .16 L .641 .287 L 1.957 1.004 L .053 .172 L -.093 .188 L .163 .244 L .562 .042 L .511 -.13 L .675 -.146 L 1.052 .013 L .439 .114 L -.235 .259 L -.106 .245 L -.228 .144 L -.578 .116 L -.31 .029 L -.591 -.157 L -.473 .044 L -.71 .489 L -1.007 .045 L -.538 .188 L -.527 .488 L -.269 .101 L -.786 -.07 L -.588 -.171 L .364 -.746 L -.096 -.416 L -.264 -.287 L -.854 -.286 L -.193 -.014 L -.629 .016 L -.151 .043 L -.16 -.187 L .887 -.505 L .644 -.261 L .772 -.188 L .221 -.116 L -.246 -.46 L -.435 -.071 L -.799 .044 L -1.015 .045 L -.698 -.1 L -.195 -.101 L -.418 -.432 L .584 -.405 L -.528 -.605 L -.378 .361 L -.541 .001 L -1.001 .146 L -.565 .131 L -.694 .722 L -1.003 .867 L -.754 .203 L -.223 .044 L -.287 .504 L .079 .158 L .178 .093 L -.706 -.131 L -.665 .261 L -.457 0 L -.033 .189 L -.609 -.047 L -.398 -.166 L -.119 -.249 L -.15 .02 L .055 -.077 L .102 -.025 L .126 .013 L .113 .013 L .189 0 L .088 -.114 L 0 -.088 L -.063 -.113 L .025 -.113 L .126 -.063 L .051 -.063 L .075 -.013 L .089 -.025 L .088 -.063 L .089 -.088 L .024 -.126 L -.013 -.114 L .14 -.013 L .29 -.063 L .075 -.076 L -.025 -.088 L -.062 -.088 L .126 -.114 L .037 -.063 L -.012 -.088 L -.114 -.113 L .051 -.101 L -.088 -.151 L -.063 -.101 L .202 -.151 L .239 -.025 L .126 -.088 L .113 .025 L .013 .088 L -.013 .214 L .063 .013 L .113 0 L 96.92 V -.013 -.063 L .101 .038 L .063 .051 L .025 -.076 L .075 -.038 L .139 -.012 L 0 .075 L .089 .063 L .075 0 L .126 .164 L .076 -.076 L .075 -.076 L .013 -.05 L .101 -.025 L .177 0 L -.037 .189 L .176 .025 L .038 -.038 L .038 -.038 L .139 .013 L .227 0 L .038 -.025 L .075 -.076 L -.126 -.013 L -.164 -.126 L -.101 -.051 L -.075 -.05 L .013 -.038 L .101 -.063 L -.025 -.113 L .038 -.101 L -.013 -.126 L -.051 -.139 L -.101 -.063 L -.177 -.076 L -.075 0 L -.151 -.126 L -.151 -.063 L -.151 -.038 L .051 -.151 L .037 -.088 L -.037 -.051 L -.127 .038 L -.062 -.114 L .113 -.038 L -.013 -.189 L .089 -.075 L -.025 -.101 L -.038 -.088 L -.113 0 L -.102 .05 L -.088 .051 L -.113 -.088 L -.089 -.101 L -.188 -.101 L -.139 -.025 L -.102 -.139 L -.05 -.139 L .177 -.139 L 0 -.189 L .024 -.114 L .051 -.05 L -.126 -.063 L .164 -.151 L -.113 -.025 L -.076 -.063 L -.062 -.126 L -.14 -.013 L -.062 .101 L -.126 -.025 L -.215 -.025 L -.126 -.189 L -.05 -.189 L -.417 -.075 L -.277 .012 L -.062 .051 L -.076 .101 L -.062 -.05 L 0 -.076 L -.089 -.025 L -.101 .038 L .038 -.05 L .088 -.101 L -.025 -.063 L -.113 0 L -.177 .038 L -.126 -.025 L -.101 .013 L -.076 -.076 L -.05 -.063 L -.101 -.063 L -.151 -.013 L -.139 -.05 L -.14 -.126 L -.214 -.088 L -.038 -.013 L -.126 .025 L -.05 .025 L -.114 -.051 L -.088 -.025 L -.139 .025 L -.177 .051 L -.177 -.025 L -.062 .038 L -.126 .114 L -.202 0 L -.265 -.038 L -.126 .051 L -.315 -.114 L -.088 .101 L .012 .113 L -.126 0 L -.075 -.063 L -.126 .114 L -.06 .052 L -.634 .08 L -.151 .311 L -.278 .178 L -1.992 .191 L -.186 .215 L -.243 .119 L -.339 .06 L -.188 -.227 L -.327 .004 L -.025 -.231 L -.363 .045 L -1.115 -.066 L -.958 -.193 L -.241 .107 L -.787 -.121 L -.136 .085 L -.678 -.387 L -.554 -.2 L -.668 -.301 L -.166 .015 L 1.047 -1.471 L .653 .018 L -.349 -.383 L -.044 -.552 L .082 -.306 L 1.509 -1.218 L .599 -.398 L .286 -.181 L .429 -.013 L .255 -.24 L .009 -.314 L -.328 -.302 L .085 -.133 L .298 -.048 L -.316 -.193 L -.816 -.835 L .074 -.242 L -.161 -.175 L +660.044 89.132 N -.295 .31 L -.687 1.207 L -1.224 1.959 L -.381 .58 L .269 .836 L .051 .029 L .342 -.045 L .929 -.395 L .754 -.062 L .576 -.018 L .317 .085 L .431 .416 L .292 .07 L 1.191 -.786 L .438 -.002 L .928 .212 L .538 .199 L .797 .5 L .879 .99 L .599 .501 L .048 .273 L -.107 .217 L -.414 .218 L -.464 -.127 L -1.074 -.008 L -.432 -.099 L -.854 .033 L -.937 .221 L -.539 .146 L -.831 .278 L -.353 .189 L -.483 -.127 L -.464 .045 L -.47 .204 L -.363 .333 L -.312 .82 L -.241 .216 L -.347 .188 L -.638 .248 L -.896 .134 L -.624 -.054 L -.438 -.012 L -.224 -.013 L -1.192 .91 L -.742 .433 L -.744 .047 L -.982 .005 L -.592 -.125 L -.668 -.382 L -.718 -.154 L -.316 .073 L -.457 .231 L -.539 .589 L -.214 .401 L .003 .343 L .389 .569 L .599 .411 L .188 .228 L -.123 .271 L -.326 .259 L -1.265 .292 L -.67 .389 L -1.111 1.046 L -.265 .172 L -1.941 .737 L -.651 .061 L -.987 -.08 L -1.514 .065 L -1.339 .007 L -1.204 .349 L -.816 .289 L -.736 .274 L -.303 .101 L -1.44 .534 L -.686 .289 L -.481 .017 L -.433 -.197 L -.253 -.297 L -.61 -.067 L -.663 .061 L -.929 -.123 L -1.599 -.433 L -1.006 -.365 L -.815 -.551 L -.521 -.168 L -1.69 -.119 L -1.164 -.022 L -.937 -.023 L -2.861 .059 L -1.165 -.022 L -.802 -.109 L -1.241 -.207 L -1.979 -.018 L -.444 -.254 L -.467 -.439 L -1.571 -2.161 L -.105 -.542 L -.744 -.096 L -.839 -.31 L -1.645 -.806 L -.632 -.268 L -.998 -.224 L -.668 -.083 L -.995 -.038 L -1.505 -.021 L -1.062 -.181 L -.724 -.312 L -.233 -.229 L -.105 -.43 L .035 -.129 L .369 -.347 L .214 -.389 L .237 -.75 L .215 -.447 L -.401 -.66 L -1.07 -1.451 L -.568 -.618 L -.354 -.143 L -.633 -.144 L -.731 -.167 L -.614 -.069 L -.834 -.415 L -1.301 -.745 L -.371 -.433 L -.24 -.563 L -.131 -.405 L -.062 -.145 L .154 -.044 L .799 -.425 L .599 -.207 L 1.387 -.08 L .603 -.148 L .727 -.381 L .017 -.012 L .971 -.692 L .787 -.398 L 1.143 -.341 L 1.512 -.476 L .84 -.18 L .953 .097 L .932 .156 L 1.842 .122 L .831 .083 L .694 .755 L .393 .406 L .699 .113 L 1.458 -.008 L .719 .083 L .85 -.004 L .875 .068 L .312 .114 L .576 .186 L .562 -.018 L .755 -.28 L .31 -.162 L .744 -.572 L .163 -.526 L -.116 -.204 L -.396 -.304 L -.409 -.86 L .098 -.293 L .905 -.839 L 1.269 -.96 L .84 .201 L 1.028 .098 L 1.036 .185 L 1.748 .328 L .702 .231 L .989 .317 L .767 .143 L .145 .204 L .004 .541 L .182 .481 L .408 .451 L .421 .333 L 1.643 .531 L .673 .113 L 2.48 -.538 L .796 -.077 L 1.172 .037 L 1.423 .022 L .769 .229 L 1.333 .75 L .623 .331 L 1.132 .313 L .812 .373 L 1.318 .254 L .905 .241 L .984 .082 L .739 .039 L 1.602 -.11 L 1.018 -.063 L .532 -.075 L .867 -.106 L 1.147 -.136 L .526 -.163 L .604 -.264 L .447 -.394 L .755 -.498 L 1.165 -.487 L .333 -.002 L .609 -.047 L .74 .156 L .751 .506 L .34 .129 L .86 .169 L 1.228 -.297 L .622 -.018 L .431 .168 L +406.183 86.551 N 1.051 -.494 L .485 -.089 L .574 .087 L .465 -.016 L .209 -.147 L .477 .098 L .407 .042 L .52 -.034 L -.025 -.157 L .307 .012 L .307 0 L .267 -.182 L .313 .242 L .173 -.121 L .228 .061 L .292 .375 L .535 -.109 L .754 .375 L -.11 .423 L -.172 .097 L .001 .338 L .672 -.024 L .344 .177 L .282 .365 L .038 .468 L -.422 .376 L -.225 -.072 L -.142 .08 L -.245 .147 L -.213 .322 L .017 .327 L .31 .204 L -.136 .348 L -.079 -.114 L -.694 .174 L -.127 -.228 L -.371 -.204 L -.341 -.192 L -.529 -.048 L .039 -.228 L -.146 -.18 L .119 -.373 L -.245 .072 L -.193 .313 L -.446 .035 L -.406 .075 L -.285 -.122 L .072 -.198 L -.091 -.175 L .159 -.241 L -.375 -.168 L -.576 -.048 L -.259 .012 L -.159 -.301 L -.518 .012 L -.194 -.133 L -.202 -.458 L -.153 -.17 L -.41 .208 L -.141 .071 L -.266 -.127 L -.311 -.335 L -.208 -.447 L +438.22 91.952 N .039 -.044 L .065 -.105 L .014 -.131 L .092 -.066 L .146 -.119 L .026 -.04 L .171 -.053 L .093 -.026 L .092 .053 L .132 .053 L .158 0 L .065 -.026 L .093 0 L .065 .026 L .065 .026 L .093 -.026 L .145 -.04 L .132 0 L .118 -.053 L .079 -.053 L .066 -.026 L .105 -.026 L .039 0 L .053 -.079 L .04 -.092 L .079 -.079 L .092 .026 L .105 -.04 L .145 -.066 L .053 -.105 L .053 -.079 L .026 -.132 L .026 -.092 L .053 -.092 L .118 -.013 L .105 -.013 L .132 -.079 L .119 -.053 L .118 -.092 L .053 -.079 L .132 -.066 L .065 -.04 L 442 89.998 l .145 .013 L .105 .026 L .066 -.04 L .065 -.066 L .071 .012 L .285 .041 L .03 .228 L .43 -.048 L .183 -.24 L .193 .016 L .062 -.112 L .261 -.024 L .194 .24 L .073 .169 L .331 -.025 L .066 .18 L -.026 .083 L .003 .204 L .389 -.083 L .18 .12 L .149 -.135 L .104 -.177 L .558 -.204 L .168 .056 L .483 -.046 L .46 .254 L .373 -.18 L .073 -.137 L .508 .041 L .561 -.076 L .129 .13 L .703 .186 L .104 .216 L .424 .101 L .831 .33 L -1.047 1.471 L -.629 .076 L -.437 -.143 L -.534 -.359 L -1.062 .035 L -.717 .047 L -1.024 .759 L 444.857 93 l -.59 -.072 L -.499 .061 L -.761 .134 L -.255 .001 L -.334 .568 L -1.651 -.036 L -.414 -.027 L -.617 -.17 L -.399 -.172 L -.245 .146 L -.761 -.547 L -.155 -.26 L .097 -.581 L -.053 -.093 L +442.391 98.111 N -.589 .203 L -.433 .031 L -.668 .047 L -.58 -.098 L -1.116 -.671 L -1.412 -.612 L -.215 -.197 L -.364 -.333 L -.304 -.59 L .346 -.299 L .154 -.294 L -.204 -.188 L .04 -.375 L .409 -.062 L .157 -.206 L -.136 -.196 L -.452 -.063 L .223 -.197 L .325 0 L .164 .134 L .701 -.054 L .019 -.367 L .636 -.291 L .245 -.146 L .399 .172 L .617 .17 L .414 .027 L 1.651 .036 L .334 -.568 L .255 -.001 L .761 -.134 L .499 -.061 L .59 .072 L .427 -.063 L 1.024 -.759 L .717 -.047 L 1.062 -.035 L .534 .359 L .437 .143 L .629 -.076 L .166 -.015 L .668 .301 L .554 .2 L .678 .387 L -.45 .338 L -1.125 .267 L -.581 .408 L -.968 1.451 L -.63 .84 L -.753 .567 L -.361 .16 L -.724 .047 L -.264 .103 L -.176 -.002 L -.907 -.067 L -.889 .077 L -1.535 .529 L +459.717 92.836 N .06 -.052 L .126 -.114 L .075 .063 L .126 0 L -.012 -.113 L .088 -.101 L .315 .114 L .126 -.051 L .265 .038 L .202 0 L .126 -.114 L .062 -.038 L .177 .025 L .177 -.051 L .139 -.025 L .088 .025 L .114 .051 L .05 -.025 L .126 -.025 L .038 .013 L .214 .088 L .14 .126 L .139 .05 L .151 .013 L .101 .063 L .05 .063 L .076 .076 L .101 -.013 L .126 .025 L .177 -.038 L .113 0 L .025 .063 L -.088 .101 L -.038 .05 L .101 -.038 L .089 .025 L 0 .076 L .062 .05 L .076 -.101 L .062 -.051 L .277 -.012 L .417 .075 L .05 .189 L .126 .189 L .215 .025 L .126 .025 L .062 -.101 L .14 .013 L .062 .126 L .076 .063 L .113 .025 L -.164 .151 L .126 .063 L -.051 .05 L -.024 .114 L 0 .189 L -.177 .139 L .05 .139 L .102 .139 L .139 .025 L .188 .101 L .089 .101 L .113 .088 L .088 -.051 L .102 -.05 L .113 0 L .038 .088 L .025 .101 L -.089 .075 L .013 .189 L -.113 .038 L .062 .114 L .127 -.038 L .037 .051 L -.037 .088 L -.051 .151 L .151 .038 L .151 .063 L .151 .126 L .075 0 L .177 .076 L .101 .063 L .051 .139 L .013 .126 L -.038 .101 L .025 .113 L -.101 .063 L -.013 .038 L .075 .05 L .101 .051 L .164 .126 L .126 .013 L -.075 .076 L -.038 .025 L -.227 0 L -.139 -.013 L -.038 .038 L -.038 .038 L -.176 -.025 L .037 -.189 L -.177 0 L -.101 .025 L -.013 .05 L -.075 .076 L -.076 .076 L -.126 -.164 L -.075 0 L -.089 -.063 L 0 -.075 L -.139 .012 L -.075 .038 L -.025 .076 L -.063 -.051 L -.101 -.038 L .013 .063 L 0 .088 L -.113 0 L -.063 -.013 L .013 -.214 L -.013 -.088 L -.113 -.025 L -.126 .088 L -.239 .025 L -.202 .151 L .063 .101 L .088 .151 L -.051 .101 L .114 .113 L .012 .088 L -.037 .063 L -.126 .114 L .062 .088 L .025 .088 L -.075 .076 L -.29 .063 L -.14 .013 L .013 .114 L -.024 .126 L -.089 .088 L -.088 .063 L -.089 .025 L -.075 .013 L -.051 .063 L -.126 .063 L -.025 .113 L .063 .113 L 0 .088 L -.088 .114 L -.189 0 L -.113 -.013 L -.126 -.013 L -.102 .025 L -.055 .077 L -.03 .004 L -.062 -.237 L -.218 -.106 L .16 -.071 L -.021 -.267 L -.104 -.561 L .323 -.978 L .027 -.404 L -.353 -.856 L -.604 -.286 L -1.037 -1.119 L 460.567 93 l -.626 -.191 L -.225 .028 L +445.722 97.573 N .176 .002 L .264 -.103 L .724 -.047 L .361 -.16 L .753 -.567 L .63 -.84 L .968 -1.451 L .581 -.408 L 1.125 -.267 L .45 -.338 L .136 -.085 L .787 .121 L .241 -.107 L .958 .193 L 1.115 .066 L .363 -.045 L .025 .231 L .327 -.004 L .188 .227 L .339 -.06 L .243 -.119 L .186 -.215 L 1.992 -.191 L .278 -.178 L .151 -.311 L .634 -.08 L .225 -.028 L 460.567 93 l .767 1.17 L 1.037 1.119 L .604 .286 L .353 .856 L -.027 .404 L -.323 .978 L .104 .561 L .021 .267 L -.16 .071 L .218 .106 L .062 .237 L .03 -.004 L .15 -.02 L .119 .249 L .398 .166 L .609 .047 L .033 -.189 L .457 0 L .665 -.261 L .706 .131 L .149 .079 L .062 .259 L -.293 .446 L -.27 .316 L -.436 .044 L -.382 .043 L -.382 .245 L -.515 .617 L -.252 .645 L -.096 .787 L -.044 .223 L -.671 -.12 L -1.346 -.336 L -.514 -.226 L -.295 -.042 L -.671 -.369 L -.562 -.04 L -.618 .218 L -1.904 .771 L -.38 .059 L -1.385 -.35 L -.3 -.013 L -.69 .261 L -.34 .031 L -1.151 -.395 L -.506 -.002 L -.771 .189 L -.266 .023 L -.048 -.189 L .234 -.318 L -.352 -.106 L -.392 -.204 L -.418 -.186 L -.146 -.33 L .32 -.201 L .351 .012 L -.114 -.13 L -.625 -.248 L -.253 .13 L -.215 .283 L -.147 .118 L -.414 -.239 L -.194 -.139 L -.594 -.059 L -.02 -.189 L -.234 0 L -.245 -.036 L -.052 -.165 L .178 -.094 L .271 -.071 L -.239 -.083 L -.183 -.059 L .124 -.146 L .19 -.127 L -.069 -.142 L -.306 -.118 L -.555 -.141 L -.712 -.471 L .058 -.088 L -.104 -.119 L .075 -.356 L -.202 -.036 L -.19 -.237 L -.569 -.178 L -.054 -.309 L +420.177 113.472 N -.274 -.042 L -.253 -.155 L -.367 -.325 L -.096 -.213 L .202 -.738 L .097 -.681 L -.046 -.583 L -.133 -.569 L -.503 -.44 L -.094 -.271 L .181 -.157 L .366 -.015 L .801 -.001 L .339 -.172 L .861 -.543 L .633 .625 L .451 .754 L -.014 .271 L -.204 .285 L -.145 .484 L .149 .894 L -.11 .525 L -.377 .695 L -.405 -.198 L -.52 .03 L -.143 .1 L -.149 .27 L -.248 .17 L h 433.783 118.446 m -.712 -.084 L -.902 -.607 L -.772 -.239 L -1.904 -.817 L -.833 -.126 L -.232 -.127 L -.173 -.283 L .139 -.34 L .328 -.34 L .264 -.1 L .629 .112 L .569 -.341 L .68 .424 L .403 .141 L .722 -.016 L 1.403 -.187 L 1.38 -.329 L .148 .085 L .043 .127 L -.112 .127 L -.536 .823 L -.153 .497 L .009 .382 L .411 .509 L -.179 .128 L -.43 .567 L -.188 .015 L h 431.244 98.829 m -.281 -.329 L -.242 -.027 L -.281 .196 L -.156 -.125 L -.47 -.071 L -.114 .32 L -.458 .054 L -1.001 .364 L .078 -.151 L -.452 .133 L -.063 .249 L -.157 .044 L -.01 .125 L .303 .08 L .021 .302 L .193 .119 L .253 .236 L -.104 .213 L -.449 .254 L .016 .272 L .143 .554 L .783 .814 L 2.008 .889 L .29 .357 L .134 .558 L .274 .557 L .395 .585 L .694 .57 L .254 .274 L .446 .195 L .041 .21 L .408 .167 L 1.17 .255 L 1.254 -.105 L .388 .141 L .024 .212 L -.465 .247 L -.258 .294 L .262 .213 L .954 .283 L 1.168 .411 L .829 .366 L 1.589 .739 L .058 .185 L .719 .458 L .31 .475 L -.198 .435 L -.152 .337 L -.455 -.281 L -.318 -.167 L -.109 -.486 L -.263 -.17 L -.512 -.099 L -.483 -.009 L -.439 -.236 L .086 -.217 L -.353 -.065 L -.301 .098 L -.232 .262 L -.259 .399 L -.273 .208 L .043 .271 L -.197 .303 L -.007 .298 L .76 .342 L .611 .271 L -.093 .314 L .03 .432 L .133 .142 L -.191 .238 L -.659 -.024 L -.41 .219 L -.202 .228 L .11 .595 L -.536 .303 L -.617 .866 L -.595 .048 L -.167 -.071 L -.184 -.14 L -.002 -.508 L .364 -.141 L .317 -.542 L -.236 -.184 L .361 -.249 L .361 .074 L .133 -.17 L -.077 -.34 L -.211 -.181 L -.206 -.924 L -.367 -.516 L -.15 -.607 L -.201 -.352 L -.334 .058 L -.187 .171 L -.899 -.496 L -.286 -.065 L .208 -.291 L -.092 -.398 L -.461 -.34 L -.909 .247 L .034 -.109 L .322 -.194 L -.276 -.27 L -.29 -.003 L -.42 .19 L -.242 -.512 L -.198 -.207 L -.124 -.228 L -.663 -.241 L -.505 -.027 L -.654 -.127 L -.745 -.355 L -.548 -.441 L -.959 -.612 L -1.036 -.826 L -.872 -.384 L -.805 -.67 L -.566 -.856 L -.434 -1.043 L -.347 -.443 L -.505 -.457 L -.483 -.243 L -1.188 -.341 L -.579 -.142 L -.5 .044 L -1.078 .647 L -.46 .359 L -.646 .173 L -.303 .043 L .146 -.469 L -.062 -.281 L -.849 .07 L -.754 -.391 L -.193 -.442 L .315 -.371 L .175 -.01 L -.135 -.331 L -.616 -.191 L -.352 -.358 L .437 -.186 L .183 .111 L .541 -.353 L .199 -.272 L -.43 -.192 L -.025 -.292 L -.532 -.344 L .624 -.301 L .599 .062 L .627 -.204 L .629 .168 L .275 -.16 L .349 -.432 L -.103 -.212 L .777 -.404 L .016 .415 L .534 .363 L .311 .071 L -.098 .182 L .385 .312 L .285 -.151 L .018 -.535 L .425 -.384 L -.019 -.333 L .371 -.081 L .143 .354 L .23 .142 L .216 -.03 L .071 -.122 L .469 -.05 L .244 .333 L .228 -.415 L -.244 -.131 L .081 -.273 L .283 -.091 L .176 .162 L .315 .051 L .038 -.192 L -.112 -.212 L .126 -.309 L .631 .171 L .597 .034 L .329 -.411 L .366 -.096 L .183 .083 L .445 -.11 L .301 .103 L .856 -.227 L .023 .363 L .318 .096 L .32 .391 L 1.311 .247 L .894 .082 L .478 .112 L .116 .199 L -.614 .303 L .098 .151 L .297 .002 L .187 .185 L -.367 .285 L .336 .089 L -.127 .361 L .36 .11 L .284 .198 L -.056 .214 L +430.73 96.731 N 1.04 .065 L .179 .107 L .612 -.009 L .287 .152 L .646 -.5 L .566 -.107 L .85 .08 L .298 -.196 L .89 .116 L -.082 -.393 L .693 -.157 L .304 .59 L .364 .333 L -.035 -.009 L -.1 -.073 L -.145 -.036 L -.172 0 L -.145 .009 L -.055 .063 L 0 .072 L .019 .09 L .009 .082 L -.063 .009 L -.136 -.009 L -.108 -.036 L -.091 .063 L -.045 .082 L -.081 .063 L -.082 .045 L -.081 .009 L -.163 .036 L -.117 .036 L -.108 .036 L -.055 .045 L -.153 -.009 L -.127 .072 L -.063 .054 L -.018 .082 L .036 .072 L .081 .054 L .063 .055 L .045 .045 L .019 .063 L .018 .09 L -.036 .108 L -.018 .063 L -.046 .1 L -.108 0 L -.081 -.009 L -.091 .027 L -.108 .009 L -.117 .054 L -.091 .018 L -.081 .027 L -.1 .045 L -.055 .063 L -.036 .027 L .055 .018 L .063 .009 L .026 .027 L .037 .072 L -.046 .063 L -.027 .009 L -.081 .027 L -.009 .045 L .045 .081 L 0 .072 L .045 .1 L -.054 .072 L -.063 -.018 L -.1 .045 L -.117 .018 L -.127 -.036 L -.063 -.027 L -.1 -.063 L -.099 0 L -.063 -.027 L -.118 -.045 L -.018 .045 L -.027 .045 L -.1 .027 L -.136 0 L -.054 -.045 L -.072 -.063 L -.127 -.018 L -.019 -.09 L -.026 -.018 L -.063 -.054 L -.055 -.027 L -.018 -.054 L -.01 -.054 L -.036 -.009 L -.063 .018 L -.036 .054 L -.009 .027 L -.054 .063 L -.019 .018 L -.018 .081 L -.063 .045 L -.046 .018 L -.062 .054 L -.036 .009 L -.254 0 L -.108 -.027 L -.108 .027 L -.145 .009 L -.1 -.009 L -.1 -.036 L -.045 -.019 L -.055 0 L 0 .037 L 0 .036 L -.045 .027 L -.045 .018 L -.136 -.009 L -.027 -.036 L -.108 .018 L -.019 .018 L -.136 .018 L -.063 .018 L -.126 .018 L -.272 -.063 L .428 -.077 L .113 -.16 L .056 -.214 L -.284 -.198 L -.36 -.11 L .127 -.361 L -.336 -.089 L .367 -.285 L -.187 -.185 L -.297 -.002 L -.098 -.151 L .614 -.303 L -.116 -.199 L +439.573 104.709 N -1.051 -.672 L -.185 -.222 L -.783 -.149 L -.203 -.159 L -.403 -.115 L -.683 .177 L -.326 -.486 L -1.112 -.627 L -.584 -.678 L .277 .007 L .608 .016 L -.583 -.221 L -.659 -.469 L -.183 -.407 L .086 -.452 L -.289 -.336 L -.646 -.418 L -.378 -.126 L -.258 .579 L -.142 .116 L .03 .15 L -.284 .106 L -.154 .248 L -.213 .053 L -.496 -.647 L -.063 -.286 L -.259 -.612 L .065 -.012 L .272 .063 L .126 -.018 L .063 -.018 L .136 -.018 L .019 -.018 L .108 -.018 L .027 .036 L .136 .009 L .045 -.018 L .045 -.027 L 0 -.036 L 0 -.037 L .055 0 L .045 .019 L .1 .036 L .1 .009 L .145 -.009 L .108 -.027 L .108 .027 L .254 0 L .036 -.009 L .062 -.054 L .046 -.018 L .063 -.045 L .018 -.081 L .019 -.018 L .054 -.063 L .009 -.027 L .036 -.054 L .063 -.018 L .036 .009 L .01 .054 L .018 .054 L .055 .027 L .063 .054 L .026 .018 L .019 .09 L .127 .018 L .072 .063 L .054 .045 L .136 0 L .1 -.027 L .027 -.045 L .018 -.045 L .118 .045 L .063 .027 L .099 0 L .1 .063 L .063 .027 L .127 .036 L .117 -.018 L .1 -.045 L .063 .018 L .054 -.072 L -.045 -.1 L 0 -.072 L -.045 -.081 L .009 -.045 L .081 -.027 L .027 -.009 L .046 -.063 L -.037 -.072 L -.026 -.027 L -.063 -.009 L -.055 -.018 L .036 -.027 L .055 -.063 L .1 -.045 L .081 -.027 L .091 -.018 L .117 -.054 L .108 -.009 L .091 -.027 L .081 .009 L .108 0 L .046 -.1 L .018 -.063 L .036 -.108 L -.018 -.09 L -.019 -.063 L -.045 -.045 L -.063 -.055 L -.081 -.054 L -.036 -.072 L .018 -.082 L .063 -.054 L .127 -.072 L .153 .009 L .055 -.045 L .108 -.036 L .117 -.036 L .163 -.036 L .081 -.009 L .082 -.045 L .081 -.063 L .045 -.082 L .091 -.063 L .108 .036 L .136 .009 L .063 -.009 L -.009 -.082 L -.019 -.09 L 0 -.072 L .055 -.063 L .145 -.009 L .172 0 L .145 .036 L .1 .073 L .035 .009 L .215 .197 L 1.412 .612 L 1.116 .671 L .58 .098 L .668 -.047 L .433 -.031 L .589 -.203 L .201 .142 L .056 .089 L .022 .112 L -.022 .078 L .045 .044 L .011 .067 L -.078 .056 L -.011 .146 L .078 .067 L .145 -.034 L .101 .034 L .045 .089 L -.078 .011 L -.056 -.022 L -.022 .078 L .033 .1 L -.045 .034 L -.044 .022 L .066 .111 L .168 -.022 L .033 .078 L .123 .1 L .122 0 L .101 0 L .09 .078 L .122 .011 L .134 0 L .012 .078 L -.033 .056 L -.135 -.011 L -.089 -.034 L -.067 .022 L -.078 -.011 L -.066 -.045 L -.056 -.011 L -.045 .011 L .033 .067 L -.101 .089 L -.078 0 L 0 .156 L .045 .067 L -.033 .078 L .022 .078 L .011 .078 L -.089 .033 L -.09 -.033 L -.056 .067 L .078 .089 L -.078 .011 L -.189 .022 L -.201 -.022 L -.145 -.123 L .056 -.101 L -.045 -.089 L -.123 -.011 L -.022 -.112 L -.145 -.056 L -.146 -.045 L -.101 .089 L -.1 -.011 L -.156 -.078 L -.067 -.022 L -.146 0 L -.156 -.045 L -.111 .067 L -.134 .045 L -.134 -.045 L -.111 -.067 L -.112 0 L -.122 .089 L -.168 .078 L -.156 -.067 L -.268 -.089 L -.179 .011 L -.156 .011 L -.189 -.056 L -.168 -.011 L -.156 -.089 L -.089 .078 L -.111 .022 L -.057 -.056 L -.234 -.078 L -.156 -.056 L -.134 -.045 L -.089 -.011 L -.134 .123 L -.112 -.011 L -.223 -.022 L -.168 -.033 L -.212 .022 L -.101 .111 L -.145 .145 L -.123 .201 L -.201 -.022 L -.256 -.134 L -.156 -.19 L -.101 -.111 L -.312 -.034 L -.123 .044 L -.089 .179 L -.045 .167 L .045 .134 L 0 .078 L .033 .212 L -.123 .067 L .022 .089 L .134 .078 L .09 .089 L .122 .034 L .101 .033 L .179 .179 L .146 .234 L .089 .134 L .022 .123 L .156 .111 L -.078 .056 L -.012 .1 L .022 .146 L .168 -.011 L .089 .111 L .056 .123 L .112 .111 L .167 .045 L .167 .033 L .369 .357 L .021 .167 L .078 .044 L .213 .078 L .379 .357 L .224 .123 L .223 .067 L .101 .056 L 0 .112 L .078 .279 L .201 .078 L .189 .167 L .146 .112 L .245 .123 L .067 .212 L -.284 .083 L h 439.792 104.833 m .132 -.118 L .134 .011 L .123 .034 L .045 .078 L .066 .089 L .146 .089 L .179 .078 L .212 .011 L .312 .257 L .045 .067 L .134 -.033 L .123 .022 L .089 .034 L .062 .063 L .005 .004 L -.022 .089 L .033 .078 L .082 .072 L .029 .092 L -.002 .1 L -.589 -.367 L -.549 -.371 L -.789 -.378 L +451.009 101.725 N -.328 .346 L -.383 .374 L -.18 .302 L .056 .271 L 1.326 1.122 L .028 .2 L -.302 .302 L -.762 .333 L -.246 .301 L -.008 .514 L -.013 .208 L -.058 -.017 L -.072 .029 L -.16 .022 L -.145 .021 L -.116 .022 L -.058 .015 L -.102 -.051 L -.087 .043 L -.088 .021 L -.102 -.043 L -.064 -.021 L -.131 .116 L -.087 .08 L -.152 -.015 L -.196 -.007 L -.064 .007 L -.175 -.043 L -.152 .087 L -.151 .102 L -.109 .058 L .059 .072 L -.029 .058 L -.116 0 L -.094 -.109 L -.131 -.058 L -.087 -.073 L -.08 .065 L -.116 .058 L -.246 .058 L -.225 .058 L -.088 .058 L -.058 .167 L .029 .13 L -.029 .072 L -.072 .087 L -.188 0 L -.14 -.049 L -.018 -.109 L -.733 -.866 L -.382 -.369 L -.058 -.004 L .109 -.286 L 0 -.067 L -.078 -.067 L -.101 0 L -.056 -.056 L .022 -.089 L .111 -.033 L .146 .011 L .167 .033 L .057 -.033 L .021 -.067 L .09 -.044 L .134 -.022 L .089 -.011 L -.011 -.089 L -.101 -.101 L -.167 -.067 L -.134 -.045 L -.057 -.044 L -.111 .022 L -.078 -.045 L -.033 -.067 L -.123 -.101 L -.078 -.1 L -.066 -.022 L -.067 .044 L -.078 -.011 L -.101 -.056 L -.279 -.078 L -.078 -.022 L -.056 -.033 L -.167 -.134 L -.101 -.146 L -.111 -.111 L -.168 -.078 L -.156 -.101 L -.223 -.056 L 0 -.101 L .179 -.101 L .089 -.111 L .078 -.011 L .067 .034 L .078 .044 L .1 .022 L .045 -.022 L .012 -.134 L .011 -.19 L -.134 -.145 L -.179 -.19 L -.212 -.134 L -.101 -.145 L .101 .022 L .101 .011 L .145 .056 L .224 .044 L .134 -.078 L .089 -.056 L .067 -.078 L -.089 -.044 L -.135 -.022 L -.089 -.089 L -.123 -.078 L -.156 -.089 L -.033 -.101 L -.045 -.1 L -.212 .011 L -.167 -.056 L -.078 -.1 L -.022 -.134 L .078 -.067 L 0 -.089 L -.033 -.1 L .056 -.056 L .066 -.078 L .156 -.156 L .156 -.223 L .034 -.167 L .056 -.1 L -.022 -.067 L -.123 -.022 L -.179 -.011 L -.156 0 L -.212 .112 L -.078 -.089 L .056 -.067 L .09 .033 L .089 -.033 L -.011 -.078 L -.022 -.078 L .033 -.078 L -.045 -.067 L 0 -.156 L .078 0 L .101 -.089 L -.033 -.067 L .045 -.011 L .056 .011 L .066 .045 L .078 .011 L .067 -.022 L .089 .034 L .135 .011 L .033 -.056 L -.012 -.078 L -.134 0 L -.122 -.011 L -.09 -.078 L -.101 0 L -.122 0 L -.123 -.1 L -.033 -.078 L -.168 .022 L -.066 -.111 L .044 -.022 L .045 -.034 L -.033 -.1 L .022 -.078 L .056 .022 L .078 -.011 L -.045 -.089 L -.101 -.034 L -.145 .034 L -.078 -.067 L .011 -.146 L .078 -.056 L -.011 -.067 L -.045 -.044 L .022 -.078 L -.022 -.112 L -.056 -.089 L -.201 -.142 L 1.535 -.529 L .889 -.077 L .907 .067 L .054 .309 L .569 .178 L .19 .237 L .202 .036 L -.075 .356 L .104 .119 L -.058 .088 L .712 .471 L .555 .141 L .306 .118 L .069 .142 L -.19 .127 L -.124 .146 L .183 .059 L .239 .083 L -.271 .071 L -.178 .094 L .052 .165 L .245 .036 L .234 0 L .02 .189 L .594 .059 L .194 .139 L .414 .239 L .147 -.118 L .215 -.283 L .253 -.13 L .625 .248 L .114 .13 L -.351 -.012 L -.32 .201 L .146 .33 L .418 .186 L +551.198 117.997 N -.351 -.48 L -.236 -.126 L -1.217 -.05 L -.646 -.011 L -.096 -.016 L .091 -.726 L -.062 -.503 L .157 -.251 L .062 -.22 L -.503 -.094 L -.534 -.283 L -.566 -.189 L -.471 .063 L -.378 -.251 L -1.132 -.597 L -.565 -.22 L -.943 -.597 L -.314 .063 L -1.006 -.503 L -.377 -.44 L -1.194 -.597 L -1.384 -.975 L 0 -.283 L -.188 -.44 L -.283 -.188 L -.408 -.597 L -.126 -.566 L -.22 -.377 L -.881 -.251 L -.188 .157 L -.439 .063 L -.535 -.126 L -.439 .032 L -.503 .094 L -.314 -.157 L -.691 -.314 L .094 -.22 L .157 -.188 L -.188 -.22 L .031 -.188 L .188 -.157 L -.439 -.283 L 0 -.22 L -.032 -.22 L -.251 -.22 L -.534 -.094 L -.692 -.095 L -.22 -.314 L -.346 -.032 L -.629 -.377 L -.472 -.095 L -.188 .063 L -.565 .157 L .251 .251 L .188 .377 L -.597 -.283 L -.283 0 L -.126 .126 L -.22 .346 L -.283 .126 L -.629 0 L -.503 .251 L -.503 .409 L -.062 .628 L .314 .409 L -.126 .314 L -1.383 .032 L -1.03 -.063 L .056 -8.174 L 5.658 -1.289 L 5.722 2.986 L 2.012 1.666 L 2.578 -.346 L 2.767 .188 L 1.1 -.409 L .724 .723 L .597 .22 L .66 1.006 L .66 -.314 L -.031 1.038 L -.188 .409 L .031 .754 L 1.006 0 L .221 .817 L .346 1.069 L .503 .063 L .691 -.032 L 1.006 -.094 L .346 0 L .44 .314 L .062 .283 L -.062 .283 L .44 .346 L .66 0 L .125 -.188 L -.157 -.409 L .504 -.44 L .439 -.188 L .221 -.472 L .282 -.188 L .943 -.377 L .755 -.189 L .534 -.471 L .346 -.283 L .22 -.063 L .283 .126 L .377 -.377 L .322 -.031 L .349 -.126 L .441 .246 L -.368 .172 L -.368 .171 L -.221 .049 L -.073 .196 L -.295 .049 L -.294 .172 L -.196 .147 L -.441 .295 L -.172 .098 L -.024 .123 L .294 .049 L .295 .074 L .146 .123 L .418 -.147 L .098 .221 L .172 .221 L .368 .27 L .589 0 L .393 0 L .049 -.393 L .221 .049 L .196 -.196 L .024 -.245 L .196 .098 L .196 .172 L .172 .294 L .049 .147 L .393 .024 L .147 -.024 L .073 .246 L .025 .098 L .343 -.025 L .319 .147 L .245 .196 L .516 .074 L .466 .024 L .172 .123 L -.49 .221 L -.197 .147 L -.221 .147 L -.49 -.024 L -.245 -.049 L .049 .171 L 0 .147 L -.319 0 L -.172 .049 L -.343 .196 L -.221 .196 L -.271 .049 L -.221 .196 L -.245 -.147 L -.319 -.098 L -.294 -.098 L -.221 .025 L -.246 .073 L -.318 -.073 L -.042 .098 L -.345 -.005 L -.409 .031 L -.188 -.283 L -.251 -.063 L -.126 -.188 L .251 -.126 L .409 -.346 L .188 -.22 L -.252 -.251 L -.439 -.377 L -.221 .251 L -.471 .346 L -.692 .188 L -.22 .157 L -.252 -.22 L -.22 -.157 L -.346 0 L .031 .22 L -.283 .314 L .189 .314 L -.032 .346 L -.062 .126 L -.472 -.095 L -.565 .095 L -.503 .094 L .251 .125 L .534 -.031 L .126 .094 L -.251 .063 L -.188 .063 L -.032 .346 L -.188 0 L -.251 .157 L -.063 .409 L -.282 .188 L -1.069 -.094 L -.629 -.126 L -.472 .283 L -.125 .471 L .251 .283 L .346 .188 L .157 .157 L .44 .032 L .346 0 L .126 .22 L -.126 .22 L -.031 .472 L .126 .409 L .471 .314 L .126 .283 L -.157 .22 L -.503 .346 L -.283 .503 L -.377 .377 L .063 .377 L -.375 .843 L +439.792 104.833 N -.113 -.054 L -.105 -.07 L .284 -.083 L -.067 -.212 L -.245 -.123 L -.146 -.112 L -.189 -.167 L -.201 -.078 L -.078 -.279 L 0 -.112 L -.101 -.056 L -.223 -.067 L -.224 -.123 L -.379 -.357 L -.213 -.078 L -.078 -.044 L -.021 -.167 L -.369 -.357 L -.167 -.033 L -.167 -.045 L -.112 -.111 L -.056 -.123 L -.089 -.111 L -.168 .011 L -.022 -.146 L .012 -.1 L .078 -.056 L -.156 -.111 L -.022 -.123 L -.089 -.134 L -.146 -.234 L -.179 -.179 L -.101 -.033 L -.122 -.034 L -.09 -.089 L -.134 -.078 L -.022 -.089 L .123 -.067 L -.033 -.212 L 0 -.078 L -.045 -.134 L .045 -.167 L .089 -.179 L .123 -.044 L .312 .034 L .101 .111 L .156 .19 L .256 .134 L .201 .022 L .123 -.201 L .145 -.145 L .101 -.111 L .212 -.022 L .168 .033 L .223 .022 L .112 .011 L .134 -.123 L .089 .011 L .134 .045 L .156 .056 L .234 .078 L .057 .056 L .111 -.022 L .089 -.078 L .156 .089 L .168 .011 L .189 .056 L .156 -.011 L .179 -.011 L .268 .089 L .156 .067 L .168 -.078 L .122 -.089 L .112 0 L .111 .067 L .134 .045 L .134 -.045 L .111 -.067 L .156 .045 L .146 0 L .067 .022 L .156 .078 L .1 .011 L .101 -.089 L .146 .045 L .145 .056 L .022 .112 L .123 .011 L .045 .089 L -.056 .101 L .145 .123 L .201 .022 L .189 -.022 L .078 -.011 L .212 -.112 L .156 0 L .179 .011 L .123 .022 L .022 .067 L -.056 .1 L -.034 .167 L -.156 .223 L -.156 .156 L -.066 .078 L -.056 .056 L .033 .1 L 0 .089 L -.078 .067 L .022 .134 L .078 .1 L .167 .056 L .212 -.011 L .045 .1 L .033 .101 L .156 .089 L .123 .078 L .089 .089 L .135 .022 L .089 .044 L -.067 .078 L -.089 .056 L -.134 .078 L -.224 -.044 L -.145 -.056 L -.101 -.011 L -.101 -.022 L .101 .145 L .212 .134 L .179 .19 L .134 .145 L -.011 .19 L -.012 .134 L -.045 .022 L -.1 -.022 L -.078 -.044 L -.067 -.034 L -.078 .011 L -.089 .111 L -.179 .101 L -.056 -.033 L -.156 .056 L -.112 -.022 L -.066 -.044 L -.112 .033 L -.078 .056 L .012 .078 L .089 .1 L .123 .167 L .056 .101 L -.056 .101 L -.111 0 L -.09 -.056 L -.056 -.089 L -.056 -.044 L -.123 -.011 L -.122 .056 L -.168 .078 L -.045 .101 L -.044 .089 L -.112 .101 L .034 .089 L .011 .1 L 442 104.458 l -.134 .011 L -.111 .022 L -.101 .089 L -.012 .134 L .012 .112 L .011 .145 L .012 .044 L .066 .112 L .078 .089 L .045 .101 L -.09 .089 L -.183 .108 L -.062 -.063 L -.089 -.034 L -.123 -.022 L -.134 .033 L -.045 -.067 L -.312 -.257 L -.212 -.011 L -.179 -.078 L -.146 -.089 L -.066 -.089 L -.045 -.078 L -.123 -.034 L -.134 -.011 L -.132 .118 L +450.198 105.998 N .013 -.208 L .008 -.514 L .246 -.301 L .762 -.333 L .302 -.302 L -.028 -.2 L -1.326 -1.122 L -.056 -.271 L .18 -.302 L .383 -.374 L .328 -.346 L .392 .204 L .352 .106 L -.234 .318 L .048 .189 L .266 -.023 L .771 -.189 L .506 .002 L 1.151 .395 L .34 -.031 L .69 -.261 L .3 .013 L 1.385 .35 L .38 -.059 L 1.904 -.771 L .618 -.218 L .562 .04 L .671 .369 L .295 .042 L .514 .226 L 1.346 .336 L .671 .12 L -.066 .335 L -.077 .258 L -.261 .086 L -.313 -.028 L -.339 .129 L -.327 .73 L -.039 .586 L -.075 .143 L -.404 .115 L -.338 .372 L -.017 .257 L .252 -.036 L .255 .224 L .033 .154 L .391 .375 L .01 .223 L -1.333 -.005 L -.527 -.111 L -.497 .045 L -.629 .374 L -.498 .445 L -.363 -.026 L -.344 .216 L .097 .327 L -.086 .257 L -1.117 .277 L -.388 .031 L -.619 -.21 L -1.473 -.505 L -.584 .06 L -.799 .261 L -1.855 .195 L -.09 .029 L -.047 -.199 L .104 -.3 L .006 -.499 L -.225 -.469 L -.358 -.383 L -.666 -.296 L -.134 -.213 L .007 -.106 L +381.009 107 N -.121 -.278 L .138 -.4 L .343 -.5 L -.358 -.471 L -.304 -.428 L -.514 -.07 L -.164 -.1 L -.053 -.329 L .163 -.243 L .409 -.272 L .365 -.101 L .563 -.03 L .634 -.03 L .133 -.172 L .068 -.415 L .535 -.273 L .763 .042 L 1.078 .37 L .763 .07 L .756 -.087 L .577 -.173 L .508 -.144 L .354 -.001 L .629 .285 L .694 .156 L .939 .084 L 1.538 .04 L .583 .027 L .957 .141 L .491 -.158 L .419 -.229 L .531 .027 L .891 .47 L .67 -.016 L .335 .062 L .472 .243 L .469 -.03 L .058 .122 L -.205 .243 L .094 .106 L .15 .03 L .112 -.106 L 1.088 .334 L .15 -.061 L .507 .395 L .056 -.076 L .262 .03 L .131 -.076 L .431 .152 L .028 .038 L .084 .114 L .767 -.03 L .037 .122 L .337 -.061 L .542 .015 L -.017 -.319 L .355 0 L 1.252 .304 L .091 .213 L .035 .289 L .187 .076 L .374 -.076 L .206 -.03 L .335 .091 L .036 .152 L .261 .015 L .395 -.167 L .427 .197 L .485 .015 L .039 -.136 L .75 -.137 L .334 .091 L -.001 .088 L -.001 .463 L .156 .1 L -.062 .485 L -1.112 .528 L -.95 .385 L -.267 .328 L -1.046 .198 L -.664 .116 L -.96 .301 L -.323 .326 L -.053 .2 L .261 .128 L -.088 .157 L -.628 .143 L -.594 .783 L -.886 .787 L -.096 .192 L -.18 .361 L -.245 .45 L .353 .827 L .072 .111 L .084 .13 L .648 .295 L .103 .185 L -.621 .327 L -.215 .105 L -.515 .252 L -.286 .479 L -.224 .085 L -.461 .926 L .155 .322 L -.257 .099 L -.992 .049 L -.581 .242 L -.425 .327 L -.274 .757 L -.663 .496 L -.258 -.213 L -.599 .028 L -.305 .27 L -.342 0 L -.121 -.113 L -3.282 .042 L -.69 .524 L -1.021 .17 L -.35 .382 L -.028 .283 L -.083 .085 L -.073 -.212 L -.068 -.014 L .005 .241 L -.389 .127 L -.421 -.142 L -.788 -.467 L -.224 -.382 L .036 -.262 L -.345 -.113 L -.125 -.213 L .175 -.163 L -.468 -.51 L -.702 -.284 L 385 117.498 l -.484 -.135 L -.586 .039 L .008 -.018 L .304 -.951 L .242 -.37 L .884 -.643 L -.408 -.31 L -.812 -.123 L .17 -.455 L .506 -.655 L .347 -.371 L -.163 -.198 L -.455 -.551 L -.488 -.494 L .288 -.129 L .482 -.045 L .458 -.229 L .043 -.199 L -.057 -.938 L .132 -.983 L -.072 -.456 L .051 -.442 L .084 -.072 L 1.234 -.506 L .288 -.216 L -.062 -.242 L -.842 -.495 L -.15 -.242 L -.272 -.227 L -.335 -.055 L -.531 .26 L 382.981 107 l -.531 -.439 L -.55 .188 L 381.009 107 l +489.685 103.693 N .112 -.309 L .26 -.166 L .284 .047 L .07 .047 L .402 .023 L .449 .023 L .283 .095 L .284 .142 L .188 .094 L .189 .047 L .331 0 L .213 0 L .212 .166 L .261 .095 L .307 .071 L .355 .047 L .307 0 L .426 -.095 L .544 0 L .401 .166 L .189 0 L .283 -.047 L .354 .166 L .095 .142 L .284 .213 L .52 .118 L .354 .071 L .236 .118 L .308 .119 L -.142 .118 L -.048 .118 L .261 .118 L .212 .071 L .261 -.118 L .283 0 L .166 -.166 L .094 -.095 L .213 -.071 L .354 0 L .261 .071 L .188 .142 L .142 -.166 L .095 -.071 L .118 0 L .236 .118 L .143 .094 L .212 0 L .189 .118 L .213 .166 L .378 0 L .354 .024 L .118 .142 L -.118 .189 L -.118 .307 L .354 .284 L .284 .166 L .26 .094 L .284 .047 L .236 -.023 L .236 .071 L .126 .189 L -.268 .189 L -.143 .142 L -.095 .071 L .143 .26 L .213 .307 L .614 .166 L .118 .213 L -.095 .331 L -.236 .095 L -.236 .047 L -.26 -.189 L -.143 -.071 L -.188 -.023 L -.284 .047 L -.638 -.189 L -.189 -.213 L -.331 -.189 L -.473 -.024 L -.236 0 L -.418 .308 L -.291 .094 L -.378 .047 L -.591 .095 L -.592 -.047 L -.401 .118 L -.426 .023 L -.308 .095 L -.307 -.024 L -.377 .108 L -.031 -.028 L -1.326 -1.018 L -.41 -.041 L -.761 .36 L -.226 .072 L -.491 -.068 L -1.212 -.082 L .083 -.065 L .322 -.585 L .032 -.143 L -.064 -.728 L -.331 -1.084 L -.206 -.399 L -.639 -.513 L -.341 -.128 L -.916 -.155 L -.679 -.271 L -.341 -.243 L +443.617 107.095 N -.065 -.035 L -.435 -.156 L -.017 -.15 L -.501 -.485 L -.848 -.3 L -.033 -.021 L .002 -.1 L -.029 -.092 L -.082 -.072 L -.033 -.078 L .022 -.089 L -.005 -.004 L .183 -.108 L .09 -.089 L -.045 -.101 L -.078 -.089 L -.066 -.112 L -.012 -.044 L -.011 -.145 L -.012 -.112 L .012 -.134 L .101 -.089 L .111 -.022 L .134 -.011 L .056 -.056 L -.011 -.1 L -.034 -.089 L .112 -.101 L .044 -.089 L .045 -.101 L .168 -.078 L .122 -.056 L .123 .011 L .056 .044 L .056 .089 L .09 .056 L .111 0 L .056 -.101 L -.056 -.101 L -.123 -.167 L -.089 -.1 L -.012 -.078 L .078 -.056 L .112 -.033 L .066 .044 L .112 .022 L .156 -.056 L .056 .033 L 0 .101 L .223 .056 L .156 .101 L .168 .078 L .111 .111 L .101 .146 L .167 .134 L .056 .033 L .078 .022 L .279 .078 L .101 .056 L .078 .011 L .067 -.044 L .066 .022 L .078 .1 L .123 .101 L .033 .067 L .078 .045 L .111 -.022 L .057 .044 L .134 .045 L .167 .067 L .101 .101 L .011 .089 L -.089 .011 L -.134 .022 L -.09 .044 L -.021 .067 L -.057 .033 L -.167 -.033 L -.146 -.011 L -.111 .033 L -.022 .089 L .056 .056 L .101 0 L .078 .067 L 0 .067 L -.109 .286 L -.361 -.022 L -.727 -.11 L -.273 .273 L -.279 .515 L .133 .427 L -.002 .342 L +558.52 110.652 N .042 -.098 L .318 .073 L .246 -.073 L .221 -.025 L .294 .098 L .319 .098 L .245 .147 L .221 -.196 L .271 -.049 L .221 -.196 L .343 -.196 L .172 -.049 L .319 0 L 0 -.147 L -.049 -.171 L .245 .049 L .49 .024 L .221 -.147 L .197 -.147 L .49 -.221 L -.172 -.123 L -.466 -.024 L -.516 -.074 L -.245 -.196 L -.319 -.147 L -.343 .025 L -.025 -.098 L -.073 -.246 L -.147 .024 L -.393 -.024 L -.049 -.147 L -.172 -.294 L -.196 -.172 L -.196 -.098 L -.024 .245 L -.196 .196 L -.221 -.049 L -.049 .393 L -.393 0 L -.589 0 L -.368 -.27 L -.172 -.221 L -.098 -.221 L -.418 .147 L -.146 -.123 L -.295 -.074 L -.294 -.049 L .024 -.123 L .172 -.098 L .441 -.295 L .196 -.147 L .294 -.172 L .295 -.049 L .073 -.196 L .221 -.049 L .368 -.171 L .368 -.172 L -.441 -.246 L -.349 .126 L -.044 -.273 L .393 -.442 L .318 -.368 L .736 -.123 L .663 -.098 L .883 .147 L .883 .245 L .688 .196 L .81 .123 L .344 .123 L -.024 -.442 L .245 -.736 L .466 -.368 L .688 -.123 L .589 .074 L .761 .27 L .735 .246 L .908 .196 L .54 .098 L .441 -.27 L .858 -.024 L .761 0 L .785 -.147 L .712 .221 L .662 .098 L 1.35 .024 L .662 -.074 L .981 .246 L .564 -.049 L .147 .344 L .27 .147 L .196 .27 L .663 0 L .466 .098 L .41 .375 L .031 .194 L -.051 .157 L -.325 .187 L -.97 .219 L -1.338 .349 L -.445 .145 L -.405 .301 L -.638 .701 L -.646 .345 L -.478 .102 L -.459 .017 L -1.248 -.235 L -.238 .03 L -.467 .472 L -.463 .784 L -.268 .243 L -.885 .132 L -.507 .145 L -.344 -.055 L -.183 -.567 L -.06 -.071 L -.359 .03 L -1.737 .734 L -1.422 .704 L -.274 .186 L -.129 .213 L -.139 .739 L -.196 -.073 L -.344 .098 L -.344 .171 L -.539 0 L -.663 -.073 L -.834 .221 L -.172 .147 L -.196 0 L -.172 -.319 L -.368 .024 L -.318 .172 L -.074 -.221 L -.049 -.172 L -.122 .024 L -.319 -.123 L -.049 -.147 L -.221 -.024 L -.442 .123 L -.343 .049 L .024 .221 L -.295 .049 L -.393 -.074 L -.073 -.196 L -.147 -.123 L -.368 -.098 L -.49 .147 L -.196 -.073 L -.688 .024 L -.564 0 L -.589 .024 L -.122 -.098 L -.049 -.147 L -.099 -.27 L .099 -.245 L .196 -.196 L .098 .221 L .196 -.074 L -.049 -.196 L .098 -.27 L .123 0 L .981 -.196 L .515 .147 L .516 .196 L .099 .172 L .196 0 L .024 -.246 L .441 -.196 L .302 -.147 L +685.343 114.455 N -.571 .678 L -.309 .115 L -.511 -.096 L -.579 -.068 L -.595 -.011 L -.315 .157 L -.633 .738 L -.283 .256 L -.235 .171 L -.268 -.206 L -.35 .34 L -.319 .199 L -.373 -.608 L -.398 -.112 L -.649 .78 L -.195 -.382 L -.232 -.254 L -.683 -.367 L -.169 -.453 L .095 -.312 L .429 -.411 L .754 -.229 L .056 -.269 L -.591 -.282 L .407 -.879 L .189 -.34 L -.199 -.269 L -.632 -.296 L -.139 0 L -.381 .029 L -.312 .143 L -.234 -.07 L -.52 -.368 L -.167 -.233 L .379 -.528 L .415 -.442 L .52 -.329 L 1.533 -.604 L 1.032 -.545 L .636 -.543 L .686 -1.027 L .386 -.13 L .448 -.017 L .273 .396 L .493 .253 L .508 .153 L .975 -.048 L .527 -.159 L -.046 -.113 L -.508 -.765 L .025 -.342 L .273 -.243 L .392 -.059 L .333 .126 L .452 .054 L .538 -.017 L .62 -.259 L .955 -.532 L .23 -.713 L .383 -.358 L .253 -.129 L .247 -.001 L .579 .68 L .298 .439 L .167 .393 L -1.356 .923 L -.408 .457 L -.112 .414 L .09 .427 L -.154 .456 L -.187 .868 L -.668 .115 L -.36 .229 L -.497 .385 L -.766 .641 L -.468 .214 L -.678 .03 L -.577 .199 L -.265 .228 L -.248 .312 L -.364 .893 L .284 .326 L 1.225 .847 L .419 .354 L +536.625 121.017 N -.078 -.028 L -.15 -.692 L -.01 -.565 L -.038 -.848 L -.185 -.211 L -.787 .075 L -.696 -.01 L -.655 -.506 L -1.803 -1.362 L -.597 -.336 L -.66 -.167 L -.5 -.054 L -.788 -.066 L -.822 -.335 L -.708 -.251 L -.402 -.437 L -1.055 -.107 L -.519 -.054 L -.343 .129 L -.517 .343 L -.333 .03 L -.78 -.038 L -.609 .032 L -.413 .144 L -.476 .328 L -.621 .654 L -.466 .3 L -.562 .13 L -.441 -.025 L -.066 -.376 L -.128 -.681 L -.106 -.447 L .128 -.298 L 0 -.383 L 0 -.532 L .106 -.191 L .106 -.298 L .085 -.234 L -.085 -.212 L -.256 -.128 L -.319 -.191 L -.213 -.255 L -.042 -.149 L -.171 0 L -.191 -.042 L -.361 -.106 L -.191 .192 L -.086 -.234 L .086 -.106 L .148 -.255 L .128 .106 L .383 -.042 L .426 .085 L .128 .021 L .043 -.128 L -.319 -.213 L -.256 -.021 L -.085 -.277 L .17 -.255 L .213 -.191 L -.404 -.042 L -.319 .085 L -.383 0 L -.319 -.085 L -.128 .149 L -.17 -.255 L -.149 -.298 L 0 -.34 L -.042 -.298 L .17 -.213 L .106 -.319 L .043 -.255 L .105 -.277 L .086 -.234 L .213 .34 L .063 .128 L .17 .17 L .405 -.085 L .383 .128 L .106 -.149 L -.021 -.149 L .106 0 L .148 .021 L .064 .319 L .106 .191 L .298 -.021 L .298 -.063 L .256 -.106 L .233 .085 L .192 .064 L .085 -.128 L -.149 -.191 L -.042 -.213 L .191 -.042 L .106 .149 L .233 .085 L .256 -.085 L .213 -.064 L .021 -.234 L -.171 -.341 L -.34 -.234 L -.532 -.319 L -.426 -.213 L -.063 -.319 L -.043 -.34 L -.213 -.17 L 0 -.213 L 0 -.213 L -.085 -.127 L -.554 -.064 L -.617 .085 L -.426 .021 L -.446 .127 L -.192 .277 L -.085 .298 L .128 .192 L -.063 .276 L -.086 .405 L .064 .234 L .021 .298 L -.256 -.553 L -.361 -.319 L .042 -.17 L -.063 -.191 L -.274 -.143 L .529 -.453 L .937 -.532 L 1.277 -.298 L .979 -.085 L .512 .234 L .681 .383 L .617 .383 L .256 .511 L .638 .703 L .447 .255 L .489 -.043 L .341 -.106 L .158 .014 L 1.03 .063 L 1.383 -.032 L .126 -.314 L -.314 -.409 L .062 -.628 L .503 -.409 L .503 -.251 L .629 0 L .283 -.126 L .22 -.346 L .126 -.126 L .283 0 L .597 .283 L -.188 -.377 L -.251 -.251 L .565 -.157 L .188 -.063 L .472 .095 L .629 .377 L .346 .032 L .22 .314 L .692 .095 L .534 .094 L .251 .22 L .032 .22 L 0 .22 L .439 .283 L -.188 .157 L -.031 .188 L .188 .22 L -.157 .188 L -.094 .22 L .691 .314 L .314 .157 L .503 -.094 L .439 -.032 L .535 .126 L .439 -.063 L .188 -.157 L .881 .251 L .22 .377 L .126 .566 L .408 .597 L .283 .188 L .188 .44 L 0 .283 L 1.384 .975 L 1.194 .597 L .377 .44 L 1.006 .503 L .314 -.063 L .943 .597 L .565 .22 L 1.132 .597 L .378 .251 L .471 -.063 L .566 .189 L .534 .283 L .503 .094 L -.062 .22 L -.157 .251 L .062 .503 L -.091 .726 L -1.454 -.244 L -.565 -.294 L -.445 .356 L -.417 .2 L -1.135 .205 L -.432 .809 L -.203 .991 L -.103 .128 L -.508 .243 L -1.985 .689 L -.568 .159 L -.119 .199 L -.001 .466 L -.22 .199 L -.636 .3 L -.534 .031 L -.573 -.082 L -.999 -.348 L -.937 -.193 L -.193 -.112 L +445.294 112.196 N -.07 -.115 L -.138 -.469 L -.5 -.452 L -.966 -.541 L .024 -.141 L .23 .062 L .023 -.237 L -.345 -.414 L .418 -.616 L -.182 -.22 L .188 -.563 L -.251 -.282 L .182 -.396 L .268 -.079 L -.027 -.45 L -.331 -.081 L -.2 -.107 L .002 -.342 L -.133 -.427 L .279 -.515 L .273 -.273 L .727 .11 L .361 .022 L .058 .004 L .382 .369 L .733 .866 L .018 .109 L .035 .218 L -.132 .429 L .074 .641 L .298 .668 L .722 .608 L -.09 .029 L -.449 .842 L -.402 .386 L -.496 .472 L -.583 .884 L +451.512 108.463 N -.507 .16 L -.532 .245 L -.622 -.054 L -.361 -.041 L -.365 .159 L -.395 .429 L -.606 .146 L -.809 .076 L -.722 -.608 L -.298 -.668 L -.074 -.641 L .132 -.429 L -.035 -.218 L .14 .049 L .188 0 L .072 -.087 L .029 -.072 L -.029 -.13 L .058 -.167 L .088 -.058 L .225 -.058 L .246 -.058 L .116 -.058 L .08 -.065 L .087 .073 L .131 .058 L .094 .109 L .116 0 L .029 -.058 L -.059 -.072 L .109 -.058 L .151 -.102 L .152 -.087 L .175 .043 L .064 -.007 L .196 .007 L .152 .015 L .087 -.08 L .131 -.116 L .064 .021 L .102 .043 L .088 -.021 L .087 -.043 L .102 .051 L .058 -.015 L .116 -.022 L .145 -.021 L .16 -.022 L .072 -.029 L .058 .017 L -.007 .106 L .134 .213 L .666 .296 L .358 .383 L .225 .469 L -.006 .499 L -.104 .3 L .047 .199 L +383.93 117.402 N -.249 .101 L -.517 .291 L -.439 .052 L -.548 -.178 L -.58 0 L -.28 -.073 L -.719 .292 L -.058 -.177 L .389 -1.012 L -.021 -.856 L -.182 -.115 L .244 -.542 L -.054 -.397 L .13 -.114 L -.144 -.141 L -.375 .085 L -.476 .097 L -.108 -.449 L .48 -.052 L .283 -.22 L -.042 -.17 L -.178 -.226 L -.3 .417 L -.413 .136 L -.357 -.042 L -.059 -.188 L .198 -.397 L .138 -.616 L -.039 -.303 L .258 -.114 L .403 -.503 L .45 -1.098 L -.12 -.115 L .612 -1.783 L -.35 -.924 L -.007 -.42 L -.146 -.378 L .255 -.271 L .891 -.251 L .55 -.188 L .531 .439 L 1.822 .047 L .531 -.26 L .335 .055 L .272 .227 L .15 .242 L .842 .495 L .062 .242 L -.288 .216 L -1.234 .506 L -.084 .072 L -.051 .442 L .072 .456 L -.132 .983 L .057 .938 L -.043 .199 L -.458 .229 L -.482 .045 L -.288 .129 L .488 .494 L .455 .551 L .163 .198 L -.347 .371 L -.506 .655 L -.17 .455 L .812 .123 L .408 .31 L -.884 .643 L -.242 .37 L -.304 .951 L -.008 .018 L +500.121 117.572 N -.407 -.016 L -.433 .388 L -.164 .126 L -.318 -.105 L -.102 -.269 L .03 -.259 L -.274 -.151 L -.366 -.082 L -.244 .234 L -.343 -.023 L -.811 -.153 L -.364 .032 L -.304 -.16 L -.437 .094 L -.266 .143 L -.23 .043 L -.064 -.245 L -.207 -.023 L -.24 .292 L -.693 .304 L -1.185 .224 L -.711 -.039 L -.747 -.123 L -.439 .073 L -1.498 .673 L -.567 .13 L -1.104 .176 L -.556 -.153 L -1.532 -.444 L -.278 .03 L -.929 .373 L -.746 .075 L -.575 -.025 L -.777 -.166 L -.222 .001 L -.142 -.035 L -.055 .319 L .102 .452 L .243 .423 L -.627 .127 L -.156 .374 L -.2 .169 L -.171 -.041 L -.114 .127 L -.39 -.125 L -.311 .001 L -.245 -.459 L -.119 -.093 L .097 -.175 L .242 -.197 L .617 -.403 L .021 -.175 L -.049 -.134 L -.279 -.28 L -.146 -.053 L -.487 .368 L -.23 .041 L -.137 .064 L .092 .041 L -.118 .216 L -.172 .023 L -.063 -.047 L -.076 .088 L -.297 .058 L -.332 -.222 L -.447 -.198 L -.461 -.157 L -.395 .046 L -.849 .548 L -.337 .286 L .006 .204 L -.141 .046 L -.122 .07 L -.005 .082 L -.179 -.169 L -.604 .206 L -.689 .185 L -.594 -.013 L -.587 -.07 L -.678 -.267 L -.963 -.819 L -1.181 -.479 L -1.034 -.182 L -.692 .072 L -.119 .255 L -.097 .609 L -.053 .411 L -.173 .156 L -.256 0 L -.253 -.155 L -1.12 .243 L -.423 -.027 L -.386 -.183 L -.657 -1.159 L -.42 .354 L -.764 -.451 L -.451 .057 L -.562 .412 L -.227 -.382 L .066 -.127 L .242 -.17 L -.116 -.17 L -.989 -.012 L -.545 -.013 L -.088 -.269 L .571 -.199 L -.074 -.241 L -.284 -.198 L -.454 -.07 L -.084 -.297 L .041 -.34 L .087 -.284 L -.089 -.255 L -.396 -.126 L -.627 -.353 L -.371 .086 L -.265 -.084 L -.004 -.255 L .171 -.501 L .131 .059 L .478 .311 L .567 -.271 L -.396 -.283 L .021 -.124 L -.296 -.128 L .03 -.128 L .571 -.159 L .152 -.113 L -.068 -.142 L -.149 -.088 L -.337 -.035 L .01 -.187 L .18 -.07 L -.163 -.164 L -.198 -.117 L -.009 -.152 L -.227 -.012 L .263 -.181 L .296 -.275 L .161 -.035 L .07 -.16 L -.341 -.042 L -.573 .12 L -.905 .164 L -.166 -.035 L .046 -.33 L .127 -.125 L -.003 -.199 L -.029 -.286 L .13 -.264 L .299 .012 L .184 -.41 L .175 -.023 L .63 -.422 L .514 .012 L .133 -.129 L .479 -.047 L .128 .211 L .268 .102 L .169 .028 L .529 .022 L .147 -.129 L -.067 -.129 L -.269 -.129 L .286 -.094 L .324 .036 L .117 .082 L -.219 .223 L .213 -.026 L 1.053 -.073 L .619 .042 L .379 .046 L .279 .047 L .155 -.176 L -.086 -.094 L -.468 -.035 L -.212 -.118 L .275 -.212 L 1.386 -.151 L .417 -.012 L .377 -.117 L -.442 -.012 L -.592 .023 L -.215 0 L -.068 -.146 L -.611 -.382 L .325 -.528 L .926 .14 L 1.244 .048 L .264 -.117 L 1.086 .321 L 1.051 -.031 L .414 -.243 L -.041 -.27 L .624 -.244 L .455 -.214 L 1.218 -.573 L .598 -.215 L 1.039 -.23 L .889 -.073 L .758 .07 L .905 .126 L .798 .041 L .753 -.372 L .216 .527 L .416 .298 L .278 .099 L .592 .013 L .622 -.144 L .453 .74 L .492 .255 L .574 -.172 L .391 .056 L .968 .582 L 1.265 .04 L 1.094 .197 L .749 -.001 L 1.084 -.272 L .514 -.044 L .651 .141 L .764 .098 L .787 -.016 L .554 -.144 L 1.518 -.573 L .424 -.335 L 1.212 .082 L .491 .068 L .226 -.072 L .761 -.36 L .41 .041 L 1.326 1.018 L .031 .028 L .795 .722 L .026 .199 L -.421 .813 L .033 .412 L .284 .211 L 1.413 .12 L .492 .451 L -.072 .211 L -.409 -.023 L -.231 .141 L -.009 .433 L -.584 .267 L -.039 .27 L .264 .67 L -.122 .375 L .224 .492 L .09 .117 L .106 -.105 L .288 .203 L .039 .207 L -.229 .281 L -.287 .535 L -.06 .128 L .213 .14 L .424 .111 L -.145 .245 L .099 .421 L .42 .374 L .275 .035 L .023 .308 L h 462.617 106.804 m .241 .211 L -.019 .287 L .115 .285 L .077 .071 L .593 .355 L .819 .241 L .605 .155 L .152 .121 L 464.943 109 l -.304 .166 L -.515 -.072 L -.94 -.246 L -.326 .07 L -.209 .152 L -1.019 -.012 L -.357 .384 L -.109 .273 L -.833 .316 L -.612 .282 L -.222 .258 L -.307 .152 L -.268 .293 L -.255 .082 L .164 -.258 L .019 -.141 L -.062 -.176 L .584 -.293 L .22 -.141 L -.226 -.191 L -.082 .015 L -.653 -.056 L -.229 -.148 L .326 -.546 L .387 -.558 L .678 -.631 L -.127 -.227 L -.427 -.197 L -.105 0 L .498 -.445 L .629 -.374 L .497 -.045 L .527 .111 L 1.333 .005 L +509.077 114.955 N -.72 -.317 L -.268 .016 L -.356 -.433 L -.374 -.105 L -.13 -.363 L .532 -.27 L .095 -.222 L -.43 -.176 L -.027 -.188 L .63 -.129 L .094 -.155 L -.061 -.113 L -.487 -.21 L -.351 -.281 L -.306 -.166 L -.456 .234 L -1.058 .492 L -.374 .445 L -.642 .188 L -.254 .255 L -.014 -.027 L .094 -.118 L -.094 -.213 L -.189 -.071 L .26 -.095 L .166 -.047 L -.261 -.189 L -.236 -.236 L .236 -.118 L .095 -.189 L -.283 -.047 L -.354 -.024 L -.284 -.118 L -.213 -.212 L -.236 -.024 L -.26 -.354 L -.283 -.142 L -.048 -.094 L .166 0 L .378 0 L .165 -.236 L 0 -.236 L -.213 -.024 L -.188 -.142 L -.544 -.331 L -.283 -.354 L .047 -.284 L .402 -.142 L -.119 -.236 L -.212 -.166 L -.426 -.071 L -.284 -.095 L .071 -.094 L .071 -.118 L -.284 -.095 L -.087 -.212 L .418 -.308 L .236 0 L .473 .024 L .331 .189 L .189 .213 L .638 .189 L .284 -.047 L .188 .023 L .143 .071 L .26 .189 L .236 -.047 L .236 -.095 L .095 -.331 L -.118 -.213 L -.614 -.166 L -.213 -.307 L -.143 -.26 L .095 -.071 L .143 -.142 L .268 -.189 L .229 -.023 L .023 .166 L .213 -.047 L .189 0 L .142 .189 L .473 .284 L .095 .118 L .118 0 L .283 .284 L 0 .308 L .591 .094 L .449 .142 L .379 -.047 L .165 -.213 L .308 -.331 L .283 -.094 L .496 -.284 L .292 -.449 L .465 .331 L .236 .378 L .26 .189 L .284 .307 L .095 .52 L .142 .236 L .283 .26 L .284 .165 L 0 .166 L .449 .236 L .473 -.047 L .378 .071 L .284 .166 L .236 .189 L .095 .189 L 0 .142 L -.355 -.142 L -.401 -.047 L -.213 0 L -.26 .047 L -.142 .118 L -.402 .071 L -.213 .142 L -.047 .189 L -.023 .473 L -.118 .26 L -.095 .236 L -.095 .378 L .213 .236 L -.023 .189 L -.237 -.071 L -.094 .095 L -.071 .331 L -.071 .26 L -.118 -.047 L -.094 -.236 L -.143 -.095 L -.165 .095 L -.047 .307 L .07 .166 L -.118 .118 L -.118 .095 L .095 .26 L -.363 .91 L h 499.844 111.738 m .709 .061 L .142 -.047 L .26 -.071 L .236 .236 L .071 .166 L .378 .142 L .213 .071 L .308 -.118 L .52 0 L -.071 .213 L .024 .236 L .118 .023 L .331 .166 L -.071 .236 L .421 .763 L -.009 .001 L -.253 -.133 L -.416 .038 L -.512 -.025 L -.421 -.125 L -.335 -.211 L -.294 -.402 L -.551 -.223 L -.281 -.417 L -.265 -.381 L -.252 -.197 L +455.452 122.442 N .049 -.209 L -.057 -.128 L -.812 -.256 L -.691 -.006 L -.506 -.116 L -.484 .017 L -.121 -.046 L -.103 -.093 L .139 -.56 L .315 -.005 L -.005 -.088 L -.009 -.122 L .069 -.07 L .083 .157 L .021 .146 L .303 .021 L .172 .055 L .184 -.076 L -.014 -.082 L .108 -.029 L .157 .105 L -.037 .093 L -.099 .006 L -.04 .053 L .088 .023 L .144 .035 L .094 .046 L .021 .128 L .353 .041 L .846 -.122 L .509 .016 L .035 .13 L .192 .035 L .608 .064 L .307 .051 L .358 -.121 L .09 .05 L -.101 .312 L .163 .11 L .105 0 L .325 -.169 L .286 -.058 L .078 .052 L .154 -.07 L .232 -.146 L -.083 .187 L .015 .186 L -.183 .268 L -.582 -.046 L -.349 .081 L -.335 -.017 L -1.994 .169 L h 445.294 112.196 m .583 -.884 L .496 -.472 L .402 -.386 L .449 -.842 L .09 -.029 L .809 -.076 L .606 -.146 L .395 -.429 L .365 -.159 L .361 .041 L .622 .054 L .532 -.245 L .507 -.16 L .09 -.029 L 1.855 -.195 L .799 -.261 L .584 -.06 L 1.473 .505 L .619 .21 L .388 -.031 L 1.117 -.277 L .086 -.257 L -.097 -.327 L .344 -.216 L .363 .026 L .105 0 L .427 .197 L .127 .227 L -.678 .631 L -.387 .558 L -.326 .546 L -.062 -.407 L -.794 -.056 L -.743 -.041 L -.566 -.125 L -.062 -.144 L -.459 .186 L -.248 .123 L -.403 .012 L -.031 -.247 L -.335 .029 L -.301 .314 L -.431 .186 L -.31 .03 L -.306 -.159 L -.252 .07 L -.004 .133 L .169 .185 L .169 .34 L .308 .059 L .826 .609 L -.166 .07 L -.369 -.258 L -.015 -.105 L -.276 -.082 L -.331 -.105 L -.116 .099 L -.211 .007 L .069 .129 L -.016 .129 L .338 .164 L .145 -.012 L .114 .234 L -.03 .129 L -.245 .023 L -.445 -.457 L -.341 -.141 L -.207 -.059 L -.128 -.012 L .003 .094 L -.075 .035 L .138 .164 L .102 .105 L .154 .141 L .193 .059 L .153 .035 L .103 .094 L -.093 .058 L -.494 -.046 L -.253 -.035 L .035 -.176 L -.137 -.293 L -.164 -.188 L -.401 -.108 L -.472 -.373 L .258 -.118 L .025 -.136 L -.053 -.122 L -.182 -.035 L -.153 .199 L -.465 .176 L .245 .224 L -.25 .371 L -.05 .249 L .13 .121 L .065 .172 L .311 .338 L .133 .036 L .131 .479 L .579 .421 L .359 .467 L -.172 .14 L -.237 .082 L .106 -.187 L -.121 -.187 L -.142 -.128 L -.139 -.035 L -.151 -.047 L -.29 .175 L .102 .188 L .153 .081 L .08 .316 L -.193 .187 L -.652 .141 L .248 .046 L .27 .14 L .391 .058 L .188 .222 L .257 -.012 L .155 .012 L .048 .126 L .367 .269 L .306 .014 L .138 .292 L .282 .012 L .27 0 L .348 .303 L .015 .128 L -.193 .082 L .238 .782 L -.153 .175 L -.185 0 L -.226 -.385 L -.222 -.047 L -.207 -.278 L -.101 -.142 L -.17 0 L -.496 .14 L -.479 .105 L -.184 .128 L .315 .093 L .013 .188 L .007 .291 L .229 .117 L .153 -.026 L .225 -.079 L -.021 .198 L .235 .175 L -.519 .093 L .002 .117 L -.169 .062 L -.309 -.086 L .121 -.21 L -.186 -.086 L -.508 -.056 L -.158 -.092 L -.008 .206 L .194 .453 L .193 .17 L -.045 .163 L .209 .204 L .213 .96 L -.688 -.31 L -.331 .071 L -.298 .439 L -.442 -.735 L -.46 -.367 L -.452 .44 L -.428 -.353 L -.127 -.297 L .212 -.425 L -.028 -.241 L -.215 -.269 L -.491 -.424 L -.167 -.226 L .017 -.17 L .471 -.61 L .609 .098 L .425 -.298 L .202 .042 L 1.668 .663 L .337 -.1 L .483 -.355 L -.266 -.049 L -.27 -.056 L -1.204 -.493 L -1.127 -.083 L -.367 .058 L -.66 .058 L -.427 .143 L -.89 -1.118 L .269 -.1 L .253 .056 L .218 -.114 L .122 -.185 L -.339 -.24 L -.235 .114 L -.496 -.042 L -1.035 -.721 L -.199 -.325 L +504.136 113.458 N -.327 .328 L -.377 .03 L -.421 -.763 L .071 -.236 L -.331 -.166 L -.118 -.023 L -.024 -.236 L .071 -.213 L -.52 0 L -.308 .118 L -.213 -.071 L -.378 -.142 L -.071 -.166 L -.236 -.236 L -.26 .071 L -.142 .047 L -.709 -.061 L -.492 -.451 L -1.413 -.12 L -.284 -.211 L -.033 -.412 L .421 -.813 L -.026 -.199 L -.795 -.722 L .377 -.108 L .307 .024 L .308 -.095 L .426 -.023 L .401 -.118 L .592 .047 L .591 -.095 L .378 -.047 L .291 -.094 L .087 .212 L .284 .095 L -.071 .118 L -.071 .094 L .284 .095 L .426 .071 L .212 .166 L .119 .236 L -.402 .142 L -.047 .284 L .283 .354 L .544 .331 L .188 .142 L .213 .024 L 0 .236 L -.165 .236 L -.378 0 L -.166 0 L .048 .094 L .283 .142 L .26 .354 L .236 .024 L .213 .212 L .284 .118 L .354 .024 L .283 .047 L -.095 .189 L -.236 .118 L .236 .236 L .261 .189 L -.166 .047 L -.26 .095 L .189 .071 L .094 .213 L -.094 .118 L .014 .027 L +566.651 117.4 N -.565 -.153 L -.496 -.054 L -.264 -.151 L -.564 .227 L -.974 .147 L -.137 -.059 L .129 -.176 L -.198 -.077 L -.678 .03 L -.739 .315 L -.592 .486 L -.589 .064 L -.745 .495 L -.351 .03 L -.368 -.026 L -.128 -.084 L -.164 -.409 L -.199 -.521 L .185 -.444 L .099 -.775 L .029 -.255 L -.17 -.187 L -.484 .093 L .156 -.597 L -.576 -.45 L -.153 -.056 L -.384 .016 L -.286 .162 L -.134 .363 L -.435 .428 L -.049 .425 L .006 .255 L -.208 .228 L -.442 .158 L -.133 -.013 L -.587 -.152 L -.292 .058 L -.073 .185 L .007 .311 L -.3 .313 L -.21 .128 L -.381 .016 L -.63 -.237 L -.325 .001 L -.581 .286 L -.58 .343 L -.485 .144 L -.245 -.041 L -.129 -.141 L -.04 -.055 L .375 -.843 L -.063 -.377 L .377 -.377 L .283 -.503 L .503 -.346 L .157 -.22 L -.126 -.283 L -.471 -.314 L -.126 -.409 L .031 -.472 L .126 -.22 L -.126 -.22 L -.346 0 L -.44 -.032 L -.157 -.157 L -.346 -.188 L -.251 -.283 L .125 -.471 L .472 -.283 L .629 .126 L 1.069 .094 L .282 -.188 L .063 -.409 L .251 -.157 L .188 0 L .032 -.346 L .188 -.063 L .251 -.063 L -.126 -.094 L -.534 .031 L -.251 -.125 L .503 -.094 L .565 -.095 L .472 .095 L .062 -.126 L .032 -.346 L -.189 -.314 L .283 -.314 L -.031 -.22 L .346 0 L .22 .157 L .252 .22 L .22 -.157 L .692 -.188 L .471 -.346 L .221 -.251 L .439 .377 L .252 .251 L -.188 .22 L -.409 .346 L -.251 .126 L .126 .188 L .251 .063 L .188 .283 L .409 -.031 L .345 .005 L -.302 .147 L -.441 .196 L -.024 .246 L -.196 0 L -.099 -.172 L -.516 -.196 L -.515 -.147 L -.981 .196 L -.123 0 L -.098 .27 L .049 .196 L -.196 .074 L -.098 -.221 L -.196 .196 L -.099 .245 L .099 .27 L .049 .147 L .122 .098 L .589 -.024 L .564 0 L .688 -.024 L .196 .073 L .49 -.147 L .368 .098 L .147 .123 L .073 .196 L .393 .074 L .295 -.049 L -.024 -.221 L .343 -.049 L .442 -.123 L .221 .024 L .049 .147 L .319 .123 L .122 -.024 L .049 .172 L .074 .221 L .318 -.172 L .368 -.024 L .172 .319 L .196 0 L .172 -.147 L .834 -.221 L .663 .073 L .539 0 L .344 -.171 L .344 -.098 L .196 .073 L -.011 .069 L .023 1.031 L -.207 .223 L .077 .305 L .325 .394 L .463 -.045 L .229 -.162 L .22 .06 L .692 .039 L .273 .154 L .295 .494 L -.009 .284 L .028 .246 L .152 .012 L .049 .123 L -.126 .428 L .245 .237 L -.152 .36 L .2 .163 L -.181 .185 L -.08 .249 L -.354 .136 L +500.121 117.572 N -.023 -.308 L -.275 -.035 L -.42 -.374 L -.099 -.421 L .145 -.245 L -.424 -.111 L -.213 -.14 L .06 -.128 L .287 -.535 L .229 -.281 L -.039 -.207 L -.288 -.203 L -.106 .105 L -.09 -.117 L -.224 -.492 L .122 -.375 L -.264 -.67 L .039 -.27 L .584 -.267 L .009 -.433 L .231 -.141 L .409 .023 L .072 -.211 L .252 .197 L .265 .381 L .281 .417 L .551 .223 L .294 .402 L .335 .211 L .421 .125 L .512 .025 L .416 -.038 L .253 .133 L .009 -.001 L .377 -.03 L .327 -.328 L .254 -.255 L .642 -.188 L .374 -.445 L 1.058 -.492 L .456 -.234 L .306 .166 L .351 .281 L .487 .21 L .061 .113 L -.094 .155 L -.63 .129 L .027 .188 L .43 .176 L -.095 .222 L -.532 .27 L .13 .363 L .374 .105 L .356 .433 L .268 -.016 L .72 .317 L .015 .007 L -.05 .707 L -.143 .581 L .205 .48 L .494 .252 L .925 .235 L .827 .052 L .424 .097 L .162 .282 L .312 .451 L .687 .463 L 1.902 .513 L .841 .052 L .438 -.059 L 1.354 -.262 L 1.192 -.148 L 1.469 -.079 L .41 -.229 L .185 -.354 L -.131 -.905 L .015 0 L .441 .025 L .562 -.13 L .466 -.3 L .621 -.654 L .476 -.328 L .413 -.144 L .609 -.032 L .78 .038 L .333 -.03 L .517 -.343 L .343 -.129 L .519 .054 L 1.055 .107 L .402 .437 L .708 .251 L .822 .335 L .788 .066 L .5 .054 L .66 .167 L .597 .336 L 1.803 1.362 L .655 .506 L .696 .01 L .787 -.075 L .185 .211 L .038 .848 L .01 .565 L .15 .692 L .078 .028 L -.145 .241 L -.084 .339 L -.246 .807 L -.49 1.272 L -.222 .297 L -.596 .384 L -.016 .141 L .119 .663 L .096 .098 L .738 .235 L .026 .183 L -.661 .935 L -.034 .155 L .254 1.085 L .167 1.283 L .143 .775 L .191 .21 L .209 .041 L 1.198 .275 L .401 .167 L .144 .366 L .046 .437 L -.425 .553 L -.853 .795 L -.853 1.034 L .802 1.083 L .71 1.068 L .353 .464 L .695 .391 L 1.144 .388 L .409 .224 L .168 .38 L .111 1.34 L .185 .394 L .652 .053 L .186 .281 L -.036 .974 L -.188 .255 L -.209 .072 L -1 .077 L -.697 .258 L -.794 .47 L -.285 .383 L -.31 .792 L -.049 .354 L -.182 .954 L -.502 .028 L -1.079 -.153 L -.236 -.197 L -.605 -.253 L -.403 -.056 L -1.43 .003 L -.783 -.041 L -.602 .072 L -.475 -.38 L -.163 -.126 L -.835 -.026 L -.576 .001 L -.465 .014 L -.212 -.239 L -.756 -.125 L -.305 -.183 L -.162 -.014 L -.021 -.5 L -.295 -.128 L -.103 -.514 L -.292 -.349 L -.013 -.639 L -.309 -.493 L -.237 .012 L -.035 -.181 L -.526 -.126 L -.807 -.013 L -.374 .017 L -.209 .222 L -.329 .018 L -.517 .075 L -.188 .364 L -.538 .138 L -.383 .443 L -.368 .283 L -.253 .043 L -1.292 -.689 L -.958 -.104 L -.562 -.359 L -1.088 -.317 L -.247 -.301 L -.324 -.282 L -.497 -.592 L -.997 -.436 L -.584 -.083 L -.194 -.028 L -.58 -.465 L -.596 -1.058 L -.635 -1.114 L -.209 -.268 L .005 -.593 L -.767 -.761 L -.506 -.719 L -.921 .143 L -.46 -.042 L -.13 -.126 L -.291 -.056 L -.191 -.268 L -.029 -.565 L -.448 .1 L -.166 .099 L -.32 .678 L -.195 .184 L -.355 .012 L -.014 -.12 L -.351 -.224 L -.686 -.546 L .064 -.212 L -.007 -.395 L -.164 -.465 L -.215 -.013 L -.551 .003 L -.034 -.325 L .055 -.579 L .197 -.622 L .014 -.508 L -.112 -.239 L -.29 -.28 L -.774 -.603 L -.436 -.209 L -1.242 -.925 L -.533 -.025 L -.321 .115 L 503 127.106 l .033 -.819 L -1.02 -.954 L -.312 -.351 L -.002 -.184 L .133 -.875 L .235 -.763 L 1.142 -.98 L -.422 -.761 L .013 -.254 L .468 -.596 L -1.067 -.107 L -.761 -.208 L -.065 -.198 L -.563 -1.086 L -.69 -1.397 L +535.734 133.791 N .853 -1.034 L .853 -.795 L .425 -.553 L -.046 -.437 L -.144 -.366 L -.401 -.167 L -1.198 -.275 L -.209 -.041 L -.191 -.21 L -.143 -.775 L -.167 -1.283 L -.254 -1.085 L .034 -.155 L .661 -.935 L -.026 -.183 L -.738 -.235 L -.096 -.098 L -.119 -.663 L .016 -.141 L .596 -.384 L .222 -.297 L .49 -1.272 L .246 -.807 L .084 -.339 L .145 -.241 L .193 .112 L .937 .193 L .999 .348 L .573 .082 L .534 -.031 L .636 -.3 L .22 -.199 L .001 -.466 L .119 -.199 L .568 -.159 L 1.985 -.689 L .508 -.243 L .103 -.128 L .203 -.991 L .432 -.809 L 1.135 -.205 L .417 -.2 L .445 -.356 L .565 .294 L 1.454 .244 L .096 .016 L .646 .011 L 1.217 .05 L .236 .126 L .351 .48 L .04 .055 L .129 .141 L .245 .041 L .485 -.144 L .58 -.343 L .581 -.286 L .325 -.001 L .63 .237 L .381 -.016 L .21 -.128 L .3 -.313 L -.007 -.311 L .073 -.185 L .292 -.058 L .587 .152 L .133 .013 L .442 -.158 L .208 -.228 L -.006 -.255 L .049 -.425 L .435 -.428 L .134 -.363 L .286 -.162 L .384 -.016 L .153 .056 L .576 .45 L -.156 .597 L .484 -.093 L .17 .187 L -.029 .255 L -.099 .775 L -.185 .444 L .199 .521 L .164 .409 L .128 .084 L .368 .026 L .351 -.03 L .745 -.495 L .589 -.064 L .592 -.486 L .739 -.315 L .678 -.03 L .198 .077 L -.129 .176 L .137 .059 L .974 -.147 L .564 -.227 L .264 .151 L .496 .054 L .565 .153 L -.192 .145 L -.574 -.059 L .01 .269 L .236 .012 L .048 .088 L -.148 .142 L -.358 .004 L -.455 .297 L -.332 -.005 L -.338 .179 L -.647 -.144 L -1.345 .012 L -1.148 .152 L -.53 .292 L -.272 .19 L -.559 .395 L -.246 -.023 L -.258 .214 L -.464 .413 L .01 .32 L .411 .271 L .01 .336 L .232 .171 L -.119 .483 L .198 .477 L -.324 .426 L -.524 .355 L -.4 .341 L -.13 .283 L .223 .478 L .033 .31 L -.289 .255 L -.513 .215 L -.698 -.039 L -.997 -.122 L -.355 .129 L .35 .336 L .365 .407 L .129 .281 L .088 .437 L -.199 .255 L -.315 .115 L -.513 .031 L -.416 .115 L -.292 .228 L -.224 .424 L -.288 .834 L -.139 1.214 L -.021 .084 L -.34 .383 L -.237 .086 L -1.001 -.375 L -.562 -.025 L -.559 .243 L -.362 .271 L -.321 .693 L -.254 .086 L -.516 -.082 L -.644 -.039 L -.283 .072 L -.597 .441 L -.412 .369 L -.188 .34 L -.232 .876 L -.099 .903 L -.069 .184 L -.247 .156 L -1.066 .274 L -1.183 .19 L -.964 .175 L -1.234 .12 L -1.005 -.135 L -.349 .002 L -1.187 .218 L -.742 -.024 L -.541 -.039 L -.854 -.235 L -1.069 -.248 L -.63 -.194 L -.887 -.32 L +486.696 126.295 N 5.257 -2.711 L .589 -2.701 L -.024 -.467 L -.187 -.508 L .009 -.255 L .23 -.355 L .31 -.214 L .866 -.174 L .457 -.371 L .944 -.883 L -.059 -.24 L .23 -.043 L .266 -.143 L .437 -.094 L .304 .16 L .364 -.032 L .811 .153 L .343 .023 L .244 -.234 L .366 .082 L .274 .151 L -.03 .259 L .102 .269 L .318 .105 L .164 -.126 L .433 -.388 L .407 .016 L .69 1.397 L .563 1.086 L .065 .198 L .761 .208 L 1.067 .107 L -.468 .596 L -.013 .254 L .422 .761 L -1.142 .98 L -.235 .763 L -.133 .875 L .002 .184 L .312 .351 L 1.02 .954 L 503 127.106 l .075 .155 L .321 -.115 L .533 .025 L 1.242 .925 L .436 .209 L .774 .603 L .29 .28 L .112 .239 L -.014 .508 L -.197 .622 L -.055 .579 L .034 .325 L .551 -.003 L .215 .013 L .164 .465 L .007 .395 L -.064 .212 L .686 .546 L .351 .224 L .014 .12 L -.096 .003 L -.664 .101 L -.408 -.056 L -.157 .057 L -.103 .127 L -1.271 .044 L -.518 .13 L -.343 .693 L -.463 .609 L -.521 .568 L -4.048 -.132 L -1.557 -.697 L -.812 -.277 L -.118 -.253 L -.047 -.818 L .118 -.396 L -.135 -.366 L -.973 .048 L -.141 -.07 L -.399 -.633 L -.258 -.196 L -2.44 -1.101 L -1.14 -.473 L -2.034 -.934 L -.757 -.222 L -1.129 -.459 L -.093 -.056 L -.093 -.056 L -.311 -.69 L -.87 -1.632 L +479.916 127.377 N -.082 -.085 L .047 -.122 L -.021 -.183 L -.201 -.128 L -.183 -.346 L .398 -.209 L .041 -.099 L .526 -.396 L -.048 -.058 L -.223 -.099 L .077 -.151 L .298 -.25 L .599 -.006 L -.14 -.146 L -.035 -.046 L .078 -.111 L .177 -.163 L .169 -.116 L .299 -.239 L -.068 -.058 L .023 -.163 L -.09 -.047 L -.031 -.221 L -.241 -.157 L -.222 -.058 L .204 -.204 L -.125 -.052 L -.053 -.116 L -.12 .058 L -.335 .052 L -.388 -.023 L -.225 -.564 L .129 -.593 L .072 -.064 L -.1 -.507 L -.42 -.326 L .126 -.093 L .036 -.152 L .117 -.128 L -.093 -.222 L .107 -.012 L .259 -.32 L -.061 -.112 L .311 -.001 L .39 .125 L .114 -.127 L .171 .041 L .2 -.169 L .156 -.374 L .627 -.127 L -.243 -.423 L -.102 -.452 L .055 -.319 L .142 .035 L .222 -.001 L .777 .166 L .575 .025 L .746 -.075 L .929 -.373 L .278 -.03 L 1.532 .444 L .556 .153 L 1.104 -.176 L .567 -.13 L 1.498 -.673 L .439 -.073 L .747 .123 L .711 .039 L 1.185 -.224 L .693 -.304 L .24 -.292 L .207 .023 L .064 .245 L .059 .24 L -.944 .883 L -.457 .371 L -.866 .174 L -.31 .214 L -.23 .355 L -.009 .255 L .187 .508 L .024 .467 L -.589 2.701 L -5.257 2.711 L -.161 .071 L -2.96 1.541 L -1.139 .656 L -.253 .016 L -.365 -.167 L -1.902 -1.034 L +426.068 126.434 N -.093 .981 L .064 .564 L -.093 .269 L -.802 .428 L -.579 .314 L -1.473 1.138 L -.126 .354 L .274 .973 L -.147 .537 L -.155 .227 L -.864 .598 L -.22 .143 L -.564 -1.536 L -.699 -2.242 L -.323 -.464 L -.363 -.252 L -.432 -.181 L -.484 -.831 L -.225 -.465 L -.363 -.28 L -.452 -.097 L -.336 -.774 L -.301 -.888 L .112 -.509 L 1 -.853 L .414 -.355 L .163 -.411 L .048 -.537 L -.052 -.594 L -.026 -.892 L -.012 -1.429 L .114 -.439 L .685 -.627 L .012 -.184 L .508 -.185 L .633 -.455 L .591 -.228 L .703 -.016 L .643 .183 L .247 .212 L .059 .241 L .25 .538 L .27 .084 L .417 -.171 L .584 -.44 L .401 -.17 L .034 .354 L -.265 .567 L -.638 .511 L -.275 .468 L .005 .283 L .202 .438 L .508 .466 L .351 .127 L .303 .848 L -.094 .212 L -.541 .764 L -.59 .34 L -1.017 .92 L -.216 .339 L .287 .451 L .587 .55 L .528 .295 L .284 .056 L .396 -.227 L .316 .084 L .244 .635 L .582 .239 L +381.402 139.704 N -.027 -.876 L .069 -2.006 L .037 -.382 L .686 -.314 L 1.512 -.998 L .963 -.542 L 1.265 .078 L .397 -.059 L .181 -.693 L .864 -.033 L .777 -.174 L .527 -.229 L .524 -.356 L .484 -.652 L 1.109 -.332 L 1.52 -.701 L .129 -.227 L -.296 -.62 L -.025 -.396 L .079 -.227 L .265 -.114 L 1.186 -.12 L .381 -.186 L .309 -.553 L 1.022 .022 L .67 -.018 L 1.826 .004 L .34 -1.033 L -.07 -.211 L -.507 -.322 L 397 126.646 l -.158 -.465 L .016 -1.271 L .022 -.833 L -.165 -.889 L -.189 -.211 L -.563 -.279 L -.259 -.508 L .351 0 L .66 -.143 L .541 -.256 L .369 -.566 L .405 -.312 L .509 -.086 L .407 -.157 L .679 -.27 L .324 .226 L .176 .017 L .249 .024 L .238 -.142 L .407 -.51 L .613 -.426 L .682 -.355 L .614 -.171 L 1.16 -.116 L 1.587 -.06 L .513 -.072 L .634 -.312 L .578 .211 L .564 -.072 L .585 -.313 L .343 -.1 L .939 .012 L .513 -.015 L .307 .056 L .221 .042 L .322 .113 L .816 .168 L .529 -.015 L .772 -.171 L .705 -.2 L .612 -.554 L .994 .508 L .339 .099 L .312 -.143 L .314 -.241 L .228 -.156 L .528 .042 L .388 .197 L .162 .269 L .269 .126 L .516 -.086 L 1.093 -.158 L -.012 .184 L -.685 .627 L -.114 .439 L .012 1.429 L .026 .892 L .052 .594 L -.048 .537 L -.163 .411 L -.414 .355 L -1 .853 L -.112 .509 L .301 .888 L .336 .774 L .452 .097 L .363 .28 L .225 .465 L .484 .831 L .432 .181 L .363 .252 L .323 .464 L .699 2.242 L .564 1.536 L -.204 .156 L -.241 .383 L .88 1.605 L .147 .833 L .052 .691 L -.1 .862 L .101 .748 L -.16 .622 L -.158 .495 L .457 1.156 L -.061 .664 L -.086 .17 L -.666 .47 L -.249 .128 L -.152 .283 L 1.272 1.702 L .249 .917 L .562 .873 L .244 .154 L .544 -.201 L .702 .165 L 1.028 .347 L .178 .168 L .86 1.506 L .098 .07 L -.265 .186 L -1.632 .843 L -4.012 2.241 L -1.607 .956 L -2.308 1.454 L -.834 .655 L -3.084 2.617 L -1.82 .364 L -1.672 .321 L -2.176 .408 L -.146 -.564 L .161 -.679 L -.099 -.522 L -.277 -.352 L -.309 -.111 L -.748 -.024 L -.375 -.167 L -.588 -.562 L -.47 .314 L -.229 -.027 L -1.111 -1.039 L -.393 -.28 L -.082 -.183 L .096 -.396 L -.181 -.253 L -2.472 -1.469 L -.397 -.253 L -1.292 -.824 L -1.924 -1.26 L -3.283 -2.241 L -.811 -.575 L -2.054 -1.344 L -.895 -.531 L -.1 -.084 L -1.414 -.91 L -4.12 -2.42 L -2.829 -1.509 L +395.704 122.189 N .259 .508 L .563 .279 L .189 .211 L .165 .889 L -.022 .833 L -.016 1.271 L .158 .465 L .598 .788 L .507 .322 L .07 .211 L -.34 1.033 L -1.826 -.004 L -.67 .018 L -1.022 -.022 L -.309 .553 L -.381 .186 L -1.186 .12 L -.265 .114 L -.079 .227 L .025 .396 L .296 .62 L -.129 .227 L -1.52 .701 L -1.109 .332 L -.484 .652 L -.524 .356 L -.527 .229 L -.777 .174 L -.864 .033 L -.181 .693 L -.397 .059 L -1.265 -.078 L -.963 .542 L -1.512 .998 L -.686 .314 L -.037 .382 L -.069 2.006 L -1.42 .008 L -1.718 -.004 L -2.677 .001 L -2.511 0 L -1.635 .04 L .141 -.28 L .431 -.411 L .427 -.085 L 1.296 -.285 L 1.143 -.455 L .453 -.312 L 1.147 -.85 L 1.149 -.878 L 1.043 -1.104 L .46 -.693 L .133 -.509 L -.05 -.494 L -.427 -.776 L -.09 -.678 L .099 -.508 L .396 -.636 L .706 -.863 L .211 -.65 L -.063 -.367 L .071 -.353 L 1.285 -1.203 L .724 -.481 L .916 -.327 L 1.266 -.469 L .73 -.397 L .558 -.552 L .537 -.736 L .466 -.905 L .829 -1.925 L .269 -.128 L .54 -.171 L .19 .127 L .684 .848 L .138 .099 L 1.148 .507 L .661 -.001 L .595 .042 L 1.304 -.074 L .522 -.228 L .437 -.27 L .398 .551 L .256 .099 L .798 .097 L .361 0 L +480.248 123.437 N .388 .023 L .335 -.052 L .12 -.058 L .053 .116 L .125 .052 L -.204 .204 L .222 .058 L .241 .157 L .031 .221 L .09 .047 L -.023 .163 L .068 .058 L -.299 .239 L -.169 .116 L -.177 .163 L -.078 .111 L .035 .046 L .14 .146 L -.599 .006 L -.298 .25 L -.077 .151 L .223 .099 L .048 .058 L -.526 .396 L -.041 .099 L -.398 .209 L -.07 -.023 L -.088 .041 L -.067 .193 L -.009 .167 L -.355 .07 L -.07 -.099 L -.151 -.022 L -.372 .051 L .26 -.291 L .097 -.361 L .169 -.227 L .328 -.681 L -.017 -.232 L .181 0 L .138 -.192 L .072 -.32 L .018 -.32 L .409 -.431 L .232 -.07 L .116 -.174 L -.048 -.157 L +184.444 142.729 N -.367 .82 L -.518 .821 L -.186 .763 L -.179 1.159 L .017 1.851 L -.133 1.187 L -.016 1.13 L .564 1.737 L .275 .805 L .624 .945 L .76 .903 L .191 .452 L .481 .521 L .529 .974 L .729 1.228 L .375 .296 L .677 .069 L .436 -.015 L .577 .154 L .593 .451 L .503 .508 L .773 .069 L 1.016 -.242 L 1.55 -.456 L 1.396 -.3 L .803 -.157 L -.02 .542 L .838 .223 L .264 -.286 L .293 -.199 L -.104 -.247 L -.393 -.175 L 1.073 -.62 L .633 -.62 L .086 -.827 L .498 -.429 L -.094 -.477 L .092 -1.145 L .254 -.699 L .625 -.334 L .164 -.043 L .757 -.198 L .701 -.1 L 1.088 -.229 L 1.016 -.37 L .594 -.058 L .499 .056 L 1.139 .181 L .502 -.194 L .378 .093 L .62 .507 L .047 .297 L -.079 .424 L -.298 .382 L -.541 .496 L -.433 .425 L -.317 .445 L -.02 .7 L -.254 .297 L -.188 .354 L .155 .155 L .337 -.138 L -.101 .652 L -.262 1.196 L 205.356 159 l -.062 .24 L -.34 -.534 L -.167 -.452 L -.072 -.155 L -.386 .34 L -.02 .549 L -.437 .016 L -.178 .447 L -.599 .857 L -.386 -.27 L -.278 .095 L .025 .329 L -2.332 -.006 L -1.792 -.005 L -.04 1.24 L -.999 .032 L .396 .223 L .495 .541 L .624 .231 L .359 .69 L .532 .223 L -.211 .683 L -1.762 -.007 L -1.06 .007 L -1.076 1.812 L .305 .397 L -.207 .238 L .054 .553 L .044 .454 L -.704 -.555 L -.952 -.888 L -.956 -.761 L -1.069 -.859 L -.534 -.352 L -.053 -.071 L -.639 -.252 L -1.048 -.21 L -.657 .044 L -.817 .397 L -1.1 .567 L -.756 .256 L -.931 -.069 L -.724 -.21 L -.48 -.197 L -1.305 -.195 L -.588 -.267 L -.644 -.422 L -.935 -.521 L -.785 -.267 L -1.711 -.392 L -.963 -.365 L -.722 -.366 L -1.074 -.436 L -.592 -.352 L -1.123 -1 L -.207 -.07 L -.606 .058 L -.689 -.14 L -1.835 -.575 L -.565 -.536 L -.503 -.634 L -.495 -.395 L -1.049 -.577 L -.619 -.267 L -.5 -.494 L -.742 -.987 L -.363 -.55 L -.038 -.113 L .15 -.155 L .504 -.086 L .18 -.17 L .047 -.184 L -.331 -.367 L .457 -.679 L .041 -.381 L -.172 -.466 L -.744 -.959 L .121 -.297 L .146 -.17 L -.07 -.268 L -.665 -.62 L -1.495 -1.777 L -.546 -.493 L -.963 -1.058 L -.474 -.522 L -.815 -.578 L -.322 -.197 L -.158 -.268 L -.058 -.48 L -.144 -.183 L -.329 -.197 L -.609 -.197 L -.408 -.31 L -.366 -.522 L -.271 -.028 L -.414 .114 L -.238 -.155 L -.163 -.367 L -.005 -.325 L .459 -.736 L -.126 -.339 L -.751 -.62 L -.439 .255 L -.375 -.621 L -.118 -.353 L -.359 -.211 L -.61 -.168 L -.319 -.296 L -.125 -.254 L .05 -.381 L .084 -.269 L -.185 -.226 L -.561 -.21 L -.46 -.098 L -.46 -.253 L -.935 -.86 L -.478 -.706 L -.281 -.551 L -.646 -.832 L -.736 -1.073 L -.184 -.423 L -.38 -.678 L -.242 -.338 L -.152 -.452 L .042 -.509 L .032 -.311 L -.56 -.239 L -.795 -.196 L -.06 -.452 L -.128 -.155 L -.458 -.183 L -.289 .326 L -.251 .043 L -1.43 -.647 L -.285 1.004 L -.045 .438 L .033 .084 L .265 .339 L .264 .296 L .028 1.046 L .088 .509 L .51 .677 L .143 .169 L .643 .267 L .601 .536 L .525 .663 L .602 1.214 L .44 .282 L .328 .042 L .237 .169 L .325 1.398 L .102 .169 L .246 .155 L .497 .056 L .133 .056 L .215 .438 L .161 .65 L .445 .79 L .49 -.071 L .223 -.142 L .245 .452 L .344 1.469 L .531 1.059 L .649 1.2 L .069 .593 L -.014 .522 L .26 .353 L .378 .154 L .389 -.17 L .234 -.198 L .588 .804 L .258 .579 L .464 .253 L .281 .014 L .133 .311 L -.196 .537 L -.136 .127 L -.691 .595 L -.254 -.042 L -.251 -.409 L -.24 -.734 L -.617 -.578 L -.625 -.309 L -.516 -.479 L -.834 -.507 L -1.143 -.986 L -.416 -.451 L -.162 -.269 L .216 -.989 L -.035 -.254 L -.488 -1.002 L -.238 -.381 L -.327 -.282 L -.44 -.098 L -.5 -.31 L -.675 -.677 L -.305 .142 L -.363 -.056 L -1.262 -.746 L -.722 -.31 L -.896 -.973 L -.139 -.127 L -.246 -.254 L .679 .15 L .599 .013 L .588 -.284 L .244 -.326 L .093 -.636 L -.01 -.184 L -.458 -.635 L -.466 -.452 L -1.1 -.888 L -.986 -.493 L -.402 -.338 L -.203 -.522 L -.272 -.649 L -.091 -.155 L -.447 -.126 L -.15 -.353 L -.026 -.594 L -.203 -.395 L -.623 -.734 L -.434 -.706 L -.003 -.254 L .212 -.382 L -.777 -.62 L -.254 -.325 L -.22 -.485 L .34 -.017 L 2.367 -.155 L 2.381 -.084 L .316 .31 L .267 .154 L 1.186 .39 L 2.811 .933 L 3.516 1.112 L .338 .055 L 1.662 .019 L 1.544 .02 L .966 .037 L 1.867 -.011 L .213 -.101 L .096 -.892 L 1.858 .003 L 1.892 .046 L .209 .112 L .631 .662 L .766 .632 L .837 .519 L .708 .491 L .179 .226 L .284 .678 L .318 .847 L .445 .549 L 1.092 .659 L 1.104 .503 L .337 .069 L .501 .011 L .416 -.158 L .283 -.37 L .418 -.413 L .576 -.541 L .468 -.201 L .643 -.018 L .475 .082 L .783 .321 L .412 .252 L .363 .366 L .663 1.029 L .744 1.227 L .845 1.042 L .657 .576 L .268 .253 L .078 .467 L .332 .932 L .336 .592 L .375 .365 L .921 .32 L 1.029 .56 L .264 .069 L .416 -.116 L .296 -.001 L .816 .377 L .347 .119 L +507.047 133.665 N .055 .197 L .134 .691 L -.336 -.028 L -.513 .513 L .421 .194 L .418 -.206 L .306 .021 L .698 1.84 L -.644 .044 L -1.07 -.05 L -.185 -.239 L -.334 -.619 L -.408 -.054 L -1.657 -.259 L .521 -.568 L .463 -.609 L .343 -.693 L .518 -.13 L 1.271 -.044 L +606.155 150.953 N .595 .152 L .255 .14 L .25 -.129 L .273 -.368 L .015 -.678 L -.152 -.93 L .228 -.185 L .401 -.144 L .191 -.354 L -.146 -1.594 L .133 -.283 L .811 .32 L .391 .11 L .309 .013 L .17 -.128 L 1.148 -2.25 L 0 -.324 L -.192 -.408 L .045 -.212 L .938 -1.134 L .136 -.382 L -.057 -.761 L .197 -.354 L 1.446 -.883 L .719 -.512 L .312 -.129 L .558 .082 L .853 .221 L .295 -.058 L -.184 -.718 L .072 -.283 L .596 -.582 L .112 -.24 L .018 -.508 L .001 -.127 L .306 -.34 L .277 -.044 L .504 .279 L .397 .435 L .243 .901 L .217 .309 L .287 .041 L .504 -.031 L .146 .14 L .195 1.649 L .02 .875 L -.353 .862 L -.429 .722 L -.611 .525 L -.487 .271 L -.191 .198 L -.617 .85 L .075 .465 L .163 .705 L -.224 .58 L 0 .268 L .216 .069 L .312 -.086 L .819 -.442 L .771 -.089 L .479 -.017 L .156 .126 L .277 1.762 L .202 .324 L .554 -.074 L .521 .096 L .033 .268 L -.729 1.584 L .117 .352 L .228 .098 L .507 -.003 L .481 -.045 L .291 .379 L .341 .746 L .378 .266 L .246 .083 L .647 -.159 L .628 -.413 L .111 .38 L .153 .239 L -.502 .355 L -.53 .61 L -.442 .581 L -.582 .455 L -.193 .185 L -.08 .085 L -.158 .071 L -.645 .06 L -.436 .172 L -.528 .342 L -.394 .595 L -1.078 .316 L -.62 .018 L -.474 -.082 L -.362 .411 L -.143 .368 L -.036 .819 L -.114 .509 L .064 .409 L -.086 .24 L -.163 .001 L -.588 .131 L .739 .884 L .069 .183 L .112 .875 L .254 .14 L 1.091 .953 L .148 .324 L .646 1.041 L .163 .338 L -.194 .241 L -.451 .229 L -.128 .226 L .231 1.185 L -.171 .198 L -.812 .428 L .178 .38 L .6 1.436 L .54 .477 L .606 .604 L .203 .479 L .088 .663 L -.086 .636 L .006 .254 L .488 1.183 L .586 1.225 L -.077 .297 L -1.011 1.559 L -1.01 1.7 L -.098 .374 L -.359 -.181 L -.075 -.805 L .461 -.665 L .174 -.495 L .122 -.777 L .287 -.466 L -.512 -.027 L -.104 -.084 L -.004 -.282 L .195 -.509 L -.177 -1.524 L -.246 -.832 L -.639 -1.185 L -.488 -1.312 L -.347 -.846 L -.179 -.875 L -.174 -1.736 L -.117 -.677 L -.034 -.564 L -.051 -.212 L -.344 -.084 L -.148 -.098 L -.304 -.917 L -.516 -.677 L -.226 -.225 L -.247 .029 L -.081 .988 L -.158 .424 L -.43 .41 L -.59 .284 L -1.089 .511 L -.359 .622 L -.298 .297 L -.196 .142 L -.237 -.282 L -.007 -.438 L -.212 .015 L -.338 .354 L -.321 -.013 L -.166 -.211 L .147 -.495 L -.001 -.113 L -.621 .171 L -.276 .127 L -.247 .283 L -.355 -.126 L -.002 -.466 L .553 -1.54 L .162 -.791 L .001 -.889 L -.101 -1.059 L -.384 -.973 L -.431 -1.072 L -.196 -.296 L -.281 .537 L -.32 -.126 L -.526 -.366 L .482 -.17 L .312 -.015 L -.149 -.479 L -.054 -.268 L -.684 -.775 L -.182 -.183 L -.19 -.028 L -.407 .1 L -.38 -.267 L .086 -.438 L -.026 -.141 L -.209 -.112 L -.365 .043 L -.577 -.465 L -.504 -.606 L -.117 -.244 L .252 -.341 L .801 -.527 L -.194 -1.607 L +605.297 153.429 N -.126 -.264 L -.269 -.55 L -.223 -1.213 L -.611 -1.41 L -.357 -.395 L -.73 .354 L -.393 0 L -.034 -.084 L -.242 -.211 L -.356 -.592 L -.124 -.042 L -.152 .127 L -.026 .537 L .374 .79 L -.006 .424 L -.143 .169 L -.455 .086 L -.235 .537 L -.261 .1 L -.255 -.437 L -.311 -.395 L -.073 -.057 L -.163 .669 L -.28 .249 L -.203 .043 L -.271 -.536 L -.495 .636 L -.359 -.265 L -.147 -.532 L -.402 -1.775 L -.325 -1.409 L -.352 -.45 L -.04 -.254 L .505 -.765 L .029 -.269 L -.193 -.21 L -1.042 -.431 L -.339 -.323 L .548 -.61 L .4 -.299 L .502 -.13 L .382 -.101 L .047 -.155 L -.126 -.112 L -1.224 -.938 L -.494 -.237 L -.083 -.155 L .124 -.283 L .555 -.525 L .234 -.171 L 1.252 .303 L .339 .266 L .372 .266 L .489 -.06 L .417 .054 L .129 .324 L .053 .479 L .079 .719 L .095 .099 L .537 .109 L .547 .053 L .916 -.062 L .559 -.003 L 2.473 .198 L .111 .098 L .057 .127 L -.012 .79 L -.159 .34 L -.938 .767 L -.498 .13 L -.651 .356 L -.131 .283 L .009 .522 L .001 .381 L .23 .281 L .249 .267 L .529 .448 L .224 -.354 L .395 -1.159 L .281 -.115 L .4 -.044 L .064 .578 L .627 2.479 L .037 .466 L .194 1.607 L -.801 .527 L -.252 .341 L +627.408 186.411 N -.086 .337 L -.495 .35 L -.11 .575 L -.644 .089 L -.05 -.478 L -.309 -.163 L -.279 .28 L -.244 .394 L -.204 -.083 L -.118 -.239 L .213 -.398 L -.041 -.21 L -.055 -.226 L -.261 -.238 L -.447 -.119 L -.106 -.466 L -.571 .013 L -.448 .17 L .013 -.104 L .128 -.297 L -.15 -.183 L -.411 .212 L -.301 -.07 L -.38 -.38 L -.116 -.508 L .064 -.282 L -.151 -.438 L -.229 -.169 L -.388 .043 L -.39 -.719 L -.209 -.508 L -.3 -.324 L -.311 -.155 L -.456 -.395 L -.343 .1 L -.218 .142 L -.216 -.381 L -.04 -.607 L .163 -.749 L .559 -1.738 L .29 -.848 L -.087 -.044 L .098 -.374 L 1.01 -1.7 L 1.011 -1.559 L .077 -.297 L -.586 -1.225 L -.488 -1.183 L -.006 -.254 L .086 -.636 L -.088 -.663 L -.203 -.479 L -.606 -.604 L -.54 -.477 L -.6 -1.436 L -.178 -.38 L .812 -.428 L .171 -.198 L -.231 -1.185 L .128 -.226 L .451 -.229 L .194 -.241 L -.163 -.338 L -.646 -1.041 L -.148 -.324 L -1.091 -.953 L -.254 -.14 L -.112 -.875 L -.069 -.183 L -.739 -.884 L .588 -.131 L .163 -.001 L .086 -.24 L -.064 -.409 L .114 -.509 L .036 -.819 L .143 -.368 L .362 -.411 L .474 .082 L .62 -.018 L 1.078 -.316 L .394 -.595 L .528 -.342 L .436 -.172 L .645 -.06 L .158 -.071 L .08 -.085 L .541 .166 L .295 .182 L .118 .168 L .01 .423 L -.106 .805 L .066 .367 L .186 .154 L .423 -.003 L .489 -.2 L .414 -.045 L .045 .113 L .249 1.311 L -.085 .41 L -.528 1.569 L -.117 .438 L -.027 .494 L .145 .324 L .481 .138 L .37 -.411 L 1.173 -1.178 L .346 -.03 L .835 .348 L .59 .265 L .223 -.072 L .543 -.257 L .2 -.538 L .286 -.453 L .403 .012 L .893 .192 L .266 .153 L .052 .282 L .285 .535 L .688 .659 L .435 .632 L .058 1.524 L .107 .366 L .255 .464 L .979 1.279 L .419 .703 L .157 .507 L .002 .945 L -.121 .438 L -.808 .64 L -.301 -.167 L -.599 -.109 L -.575 -.039 L -.558 .074 L -.798 -.066 L -1.172 .091 L -.383 .101 L -.521 .441 L -.92 1.233 L -.146 .297 L -.076 .382 L .026 .635 L .219 .648 L .487 .717 L .16 .479 L -.146 .176 L -.026 -.063 L -.286 -.183 L -.458 -.084 L -.9 -.887 L -.434 -.154 L -.304 -.014 L -.572 .227 L -.391 -.112 L -.29 -.141 L -.337 -.014 L 0 -.282 L .19 -1.243 L -.107 -.184 L -.719 -.055 L -.248 -.084 L -.521 .043 L -.443 .212 L -.244 .297 L .207 .593 L -.103 .339 L -.318 .707 L .083 .579 L .054 .41 L -.293 .664 L -.583 1.187 L -.7 1.682 L -.255 1.314 L .104 1.171 L .172 .296 L .229 .169 L .55 -.072 L .396 -.142 L .252 .07 L .135 .353 L .009 .325 L -.08 .466 L .141 .282 L .178 .211 L .271 -.094 L .17 .46 L .209 .974 L -.032 .254 L .127 .737 L .434 .871 L .167 .155 L .801 .281 L .539 .112 L .467 -.058 L .294 .197 L .266 .612 L .664 .544 L .212 .145 L +204.31 158.989 N -.175 .412 L .612 -.173 L .026 .429 L -.419 1.241 L .178 .269 L -.237 .795 L .189 .318 L -.092 .397 L -.358 .875 L -.3 .35 L -.36 .032 L -.054 .286 L -.388 .238 L 0 .286 L -.69 .016 L .215 -4.297 L -.025 -.329 L .278 -.095 L .386 .27 L .599 -.857 L .178 -.447 L .437 -.016 L +200.276 169.481 N -.151 -.056 L -.928 -.342 L -.614 .032 L -.766 -.032 L -.608 -.239 L -.909 -.656 L -.513 -.419 L -.044 -.454 L -.054 -.553 L .207 -.238 L -.305 -.397 L 1.076 -1.812 L 1.06 -.007 L 1.762 .007 L .211 -.683 L -.532 -.223 L -.359 -.69 L -.624 -.231 L -.495 -.541 L -.396 -.223 L .999 -.032 L .04 -1.24 L 1.792 .005 L 2.332 .006 L -.215 4.297 L .69 -.016 L .303 .095 L .311 .302 L .14 -.191 L -.066 -.381 L .336 .157 L .458 .367 L -1.507 1.208 L -.499 .238 L -.177 .493 L .162 .604 L -.438 .302 L -.467 .048 L -.043 .254 L .164 .159 L -.351 .111 L -.184 .302 L -.22 -.016 L -.565 .461 L -.012 .223 L +204.413 165.093 N .312 -.03 L .612 -.27 L .639 -.058 L .743 .126 L .478 .069 L 1.443 .04 L .699 -.228 L .379 -.199 L .567 .267 L .788 -.03 L .763 -.101 L .63 -.001 L .5 .126 L .564 .253 L -.038 .353 L -.102 .226 L .228 .282 L .787 .238 L .557 .069 L .244 .524 L -1.425 .486 L -.424 .229 L -.248 .086 L -.463 -.097 L -.328 -.182 L -.259 -.013 L -.294 .242 L -.503 .794 L -1.207 .997 L -.725 -.42 L -.513 .583 L -.882 .034 L -.005 .961 L -.293 .412 L -.29 .143 L -1.001 .125 L -.311 -.661 L -.025 -.085 L -.478 -.3 L .085 -.731 L -.128 -.175 L -.272 0 L -.541 -.276 L -.433 .34 L -.365 -.016 L -.066 -.271 L -.565 -.35 L -.409 -.08 L -.208 -.418 L -.677 -.17 L .438 -.302 L -.162 -.604 L .177 -.493 L .499 -.238 L 1.507 -1.208 L +205.532 170.085 N .035 .076 L -.203 .057 L .01 .265 L -.237 .334 L -.68 -.046 L -.853 -.139 L -1.697 -.505 L -1.305 -.435 L -.325 -.21 L .012 -.223 L .565 -.461 L .22 .016 L .184 -.302 L .351 -.111 L -.164 -.159 L .043 -.254 L .467 -.048 L .677 .17 L .208 .418 L .409 .08 L .565 .35 L .066 .271 L .365 .016 L .433 -.34 L .541 .276 L .272 0 L .128 .175 L -.085 .731 L +242.38 173.617 N -.128 -.105 L -.84 .171 L -.534 .156 L -.414 .2 L -.056 .288 L .048 .497 L -.129 .396 L -.227 -.027 L -.381 .059 L -.99 1.758 L -.172 .722 L -.241 .722 L -.709 1.191 L .402 .025 L .234 -.1 L .384 -.017 L .31 .606 L .855 1.45 L .103 .395 L -.226 1.132 L .099 .353 L .401 .309 L .429 .548 L .397 .252 L .496 -.017 L 1.163 -.12 L 1.167 -.05 L .521 .181 L .64 .321 L .188 .253 L .847 .998 L .554 .576 L .144 0 L .522 -.13 L .76 -.174 L 1.99 -.224 L .644 .081 L -.409 .525 L -.085 1.004 L -.379 .511 L -.147 .326 L .026 .254 L .035 .438 L .048 .367 L .162 .804 L .447 .789 L .256 .437 L .486 .647 L .121 .282 L -.731 .612 L -.479 .526 L .51 .491 L .797 1.182 L -.52 .286 L -.834 .57 L -.412 .158 L -.463 .017 L -2.812 -.082 L -.64 -.024 L -.042 .325 L -.013 1.031 L .178 .154 L .896 .122 L .177 .084 L .293 .408 L .052 .367 L -.384 -.04 L -.417 -.11 L -.687 .032 L -.493 .187 L -.111 .085 L -.001 1.071 L 0 .554 L .192 .197 L .688 .363 L .192 .183 L -.031 .777 L .399 .562 L .031 .212 L -.326 1.428 L -.706 4.411 L -.073 .382 L -.133 .198 L -.156 -.14 L -.575 -.703 L -.237 -.126 L -.161 .058 L -.448 .031 L 1.155 -1.956 L .035 -.198 L -.127 -.069 L -1.299 -.84 L -.509 -.209 L -.708 .442 L -.397 -.182 L -.523 -.421 L -.452 .427 L -.337 .157 L -.496 .031 L -1.038 -.008 L -.573 -.152 L -.092 -.281 L .004 -.396 L -.173 -.296 L -.479 -.039 L -.366 -.14 L -.078 -.282 L -.251 -.761 L -.988 -.672 L -.526 -.364 L -.208 -.62 L -.208 -.324 L -.513 -.435 L -.897 -.418 L -.927 -.107 L -.081 -.112 L -.269 -.162 L -.197 -.118 L -.709 -.631 L -.128 -.056 L -.89 .401 L -.67 .061 L -.977 -.277 L -.355 -.309 L -.166 -.493 L -.227 -.225 L -1.432 -.656 L -1.496 -.803 L .033 -.068 L -.117 -.311 L -.181 -.282 L .108 -.212 L .509 -.114 L .465 .112 L .186 -.325 L -.348 -.564 L .086 -.424 L .314 -.227 L .878 -.058 L .193 .042 L .41 -.227 L .445 -.679 L .45 -.961 L .651 -1.061 L -.122 -.268 L -.56 -.408 L -.071 -.184 L .306 -.721 L .089 -.523 L -.149 -.861 L -.371 -.86 L .085 -.254 L .49 -.143 L .135 -.212 L -.088 -.198 L -.565 -.479 L -.042 -.226 L .103 -.198 L .242 -.326 L .036 -.254 L -.173 -.282 L -.739 -.719 L -.364 -.396 L .256 -.753 L .228 -.082 L -.045 -.45 L .19 .082 L .085 .307 L .584 -.409 L .094 -.43 L .322 -.062 L -.509 -1.038 L -.228 -.149 L -.084 -.327 L .142 .075 L .42 .338 L .397 .507 L .22 .508 L .235 .197 L .199 -.17 L .147 -.241 L -.332 -.776 L .02 -.212 L .176 -.297 L .445 -.34 L .399 -.297 L .501 -.736 L .327 -.156 L .684 -.101 L .217 -.382 L -.104 -.381 L .174 -.777 L .067 -.65 L .207 -.48 L .498 -.439 L .429 -.283 L .592 -.242 L .113 0 L .374 .206 L .22 .443 L .281 -.34 L .031 -.438 L .199 -.551 L .22 -.071 L .267 .126 L .855 .041 L .562 -.001 L .623 -.27 L .237 -.254 L .476 -.298 L .848 -.256 L .435 -.396 L .278 -.551 L .333 -.255 L .469 -.17 L .58 .013 L .526 .338 L .155 .126 L .155 .339 L -.285 .332 L +408.6 174.04 N -.062 .777 L .164 .762 L .388 .718 L -.316 .962 L -.19 .566 L -.223 .298 L -.656 .414 L -.095 .34 L .116 .592 L -.078 .368 L -.433 .13 L -.257 .03 L -.237 .397 L .002 .381 L .003 .48 L -.012 .876 L -.09 .989 L .217 1.439 L -.121 1.188 L .006 .234 L -.333 .015 L -1.232 .144 L -.669 .052 L -.106 -.205 L -.295 -1.072 L .188 -.708 L .026 -.833 L -.036 -.537 L -.135 -.974 L -.006 -.862 L -.035 -.522 L .013 -.579 L -.442 -1.311 L -.164 -.691 L -.403 -.323 L -.468 -.294 L -.18 -.395 L .141 -.594 L .046 -.424 L .062 -.142 L .24 -.157 L .366 -.553 L .415 -.271 L .418 -.045 L .739 .095 L .337 -.158 L .415 -.468 L .237 -.764 L -.131 -.367 L .577 -.3 L .321 -.073 L .339 .28 L .727 .589 L .902 .503 L +394.266 178.814 N .191 -.17 L -.02 -.41 L -.261 -1.934 L .125 -.34 L .271 -.157 L 2.119 -.041 L .867 .037 L 1.429 .006 L .976 -.458 L .161 .032 L .595 .119 L -.25 .849 L .05 .254 L .633 .915 L .244 .451 L -.188 .721 L .02 .396 L .265 1.114 L .181 .592 L .503 .788 L .032 .155 L -.286 .242 L -.174 .382 L .01 1.314 L -.011 .72 L .021 .551 L .18 .479 L .468 .577 L .752 .608 L -.503 .682 L -.304 .099 L -.593 -.013 L -.992 .144 L -.463 .185 L -.188 .098 L -.898 .469 L -1.263 .398 L -.942 .412 L -.958 .567 L -.578 -.324 L -.945 -.436 L -.074 -.124 L -.066 -.741 L -.554 -1.155 L -.263 -.747 L -.103 -.706 L .327 -1.005 L .437 -1.274 L .521 -.851 L .203 -.595 L -.334 -1.438 L -.189 -1.285 L -.178 -.154 L +400.72 175.499 N 1.013 .163 L .611 .166 L .29 .041 L -.046 .424 L -.141 .594 L .18 .395 L .468 .294 L .403 .323 L .164 .691 L .442 1.311 L -.013 .579 L .035 .522 L .006 .862 L .135 .974 L .036 .537 L -.026 .833 L -.188 .708 L .295 1.072 L .106 .205 L -.452 .035 L -.479 .128 L -.368 .212 L -.023 .04 L -.752 -.608 L -.468 -.577 L -.18 -.479 L -.021 -.551 L .011 -.72 L -.01 -1.314 L .174 -.382 L .286 -.242 L -.032 -.155 L -.503 -.788 L -.181 -.592 L -.265 -1.114 L -.02 -.396 L .188 -.721 L -.244 -.451 L -.633 -.915 L -.05 -.254 L .25 -.849 L +383.772 190.418 N .041 -.919 L .105 -.565 L .247 -.849 L .059 -.452 L -.131 -.282 L -1.264 -1.334 L -.592 .032 L -.369 -.097 L -.194 -.183 L -.05 -.183 L .501 -.865 L .059 -.438 L -.119 -.55 L .062 -.17 L .047 -.099 L .602 -.554 L .188 -.354 L -.179 -.21 L -.296 -.549 L .03 -.127 L .158 -.199 L .304 -.03 L .548 .223 L .304 .012 L .19 -.143 L -.051 -.226 L -.648 -.561 L -.309 -.351 L .332 -.37 L .125 -.283 L -.197 -.31 L -.695 -.405 L -.214 -.409 L .264 -.623 L .379 -.397 L .522 -.54 L .352 -.059 L .566 .321 L .455 .436 L .35 -.228 L .362 -.469 L .571 -.483 L .239 -.114 L .257 .041 L .147 .211 L .004 .297 L .117 .381 L .148 .239 L .352 -.059 L .604 -.399 L .159 -.1 L .259 .168 L .545 -.003 L .308 .252 L .15 .465 L .52 .562 L .452 .223 L .354 .083 L .368 -.115 L .446 -.257 L .608 -.159 L .769 -.075 L .644 .166 L .63 .434 L .178 .154 L .189 1.285 L .334 1.438 L -.203 .595 L -.521 .851 L -.437 1.274 L -.327 1.005 L .103 .706 L .263 .747 L .554 1.155 L .066 .741 L -.119 -.201 L -.289 -.197 L -.208 .015 L -.143 .24 L -.096 .042 L -.48 -.027 L -.705 -.167 L -.608 -.083 L -2.352 .062 L -1.279 .243 L -.575 .199 L -1.07 .369 L -1.739 .781 L -.701 .425 L -.256 -.013 L -.075 -.032 L +627.408 186.411 N .035 .024 L .523 .098 L 1.061 1.198 L .693 .916 L .506 .762 L .081 .579 L -.023 .805 L -.134 .862 L .07 1.073 L -.07 .636 L .097 .494 L .196 .381 L .53 .493 L .338 .536 L .705 1.608 L .062 .127 L -.366 -.069 L -.895 -.055 L -.401 .142 L -.175 -.07 L -.521 -.437 L -.885 -.605 L -.6 -.337 L -1.231 -.675 L -1.02 -.732 L -.217 -.254 L -.16 -.988 L -.438 -.691 L -.895 -.817 L -.195 -.663 L .039 -.494 L .03 -.283 L -.107 -.409 L -.399 -.634 L -.347 -1.849 L -.188 -.72 L .043 -.362 L .448 -.17 L .571 -.013 L .106 .466 L .447 .119 L .261 .238 L .055 .226 L .041 .21 L -.213 .398 L .118 .239 L .204 .083 L .244 -.394 L .279 -.28 L .309 .163 L .05 .478 L .644 -.089 L .11 -.575 L .495 -.35 L .086 -.337 L h 643.95 196.042 m .081 .044 L .375 .408 L .397 .141 L .861 .083 L .413 .168 L .761 .436 L .335 .042 L .337 -.1 L -.503 -.535 L .169 -.551 L .365 -.608 L .528 -1.258 L .584 -.27 L 1.481 -.342 L 1.018 -.299 L .428 -.326 L .524 -1.021 L .523 -.323 L .87 -1.117 L .22 -.212 L .244 -.147 L .112 -.068 L .084 .126 L .062 .37 L .234 -.012 L .111 .259 L .309 .271 L .383 -.271 L 1.234 -.42 L -.025 -.086 L -.197 -.197 L .013 -.247 L .024 -.111 L -.148 -.444 L -.11 -.174 L .167 -.042 L .188 .143 L .085 -.016 L .449 -.084 L .161 -.283 L -.036 -.24 L -.478 -.366 L .197 -.396 L .436 -.071 L .511 .041 L .154 -.605 L .408 -.313 L .284 -.48 L .531 -.58 L .498 -1.032 L .075 -.17 L .322 .465 L .33 .098 L .315 -.424 L .305 .494 L .351 .282 L .402 .211 L .075 .338 L -.182 .354 L -.234 .452 L .037 .198 L .631 -.128 L .472 -.128 L .115 .226 L -.349 .495 L .742 -.1 L .357 -.085 L .269 .056 L 1.035 .662 L .345 .14 L .1 .24 L -.158 .269 L -.201 .155 L -.44 .143 L -.594 .029 L -.683 -.083 L -.355 .311 L .096 .254 L .888 .69 L -.161 .311 L -.458 .199 L -.646 .1 L -.518 .114 L -.067 .15 L -.182 -.09 L -.753 -.292 L -.446 -.04 L -.624 .018 L -.651 -.081 L -.748 -.081 L -.464 .017 L -.247 .157 L -.381 .638 L -.119 .565 L .106 .988 L -.22 .383 L -.646 .244 L -.218 .34 L .076 .748 L -.928 1.785 L -.387 .299 L -.864 .175 L -.465 .172 L -.467 .356 L -.287 .03 L -.559 -.152 L -.524 -.223 L -.557 -.251 L -.431 -.11 L -.479 .074 L -.531 .441 L -.403 .525 L -.528 .342 L -.399 .172 L -.543 -.11 L -.526 -.223 L -.255 .001 L -.928 .416 L -.446 -.28 L -.304 -.083 L -1 -.983 L -.253 -.295 L -.288 -.792 L +274.556 195.884 N .06 -.212 L -.332 -.563 L -.49 -1.127 L -.246 -.832 L -.185 -.295 L -.561 -.067 L -.532 -.675 L -.571 -.831 L .328 -.694 L .095 -.467 L -.078 -.777 L .169 -.17 L 1.131 -.091 L .183 -.27 L .082 -.862 L .142 -.496 L .015 -.339 L .326 -.312 L .382 -.057 L 1.392 .463 L .465 .042 L .083 -.41 L .141 -.085 L .337 .027 L .833 .012 L .863 -.03 L .723 .069 L .63 .182 L .999 .427 L -.647 .876 L -.391 .751 L -.137 .594 L .094 .381 L .134 .635 L .086 .664 L .521 .844 L .029 .438 L -.424 1.472 L -.489 .963 L -1.05 -.488 L -.319 .001 L -.534 .385 L -.398 .059 L -.418 -.139 L -.642 -.124 L -.172 .156 L -.2 .326 L .611 1.014 L -.528 -.054 L -1.108 -.276 L -.4 -.04 L +285.859 190.719 N .015 .422 L -1.102 1.646 L -.427 .765 L -.439 .992 L -.464 .681 L -.299 .214 L -.56 -.025 L -1.11 -.389 L -.882 .613 L -.225 -.069 L -.649 -.505 L .489 -.963 L .424 -1.472 L -.029 -.438 L -.521 -.844 L -.086 -.664 L -.134 -.635 L -.094 -.381 L .137 -.594 L .391 -.751 L .647 -.876 L .218 .093 L 1.033 .294 L .55 .196 L .799 .549 L 1.264 1.084 L .545 .564 L .317 .465 L .193 .028 L +429.505 210.684 N -.695 -.533 L -.351 .13 L -.68 .513 L -.536 .414 L -.112 -.177 L -.392 -.86 L -1.381 -1.344 L .184 -.295 L .413 -.229 L .803 .307 L .343 -.681 L -.052 -.296 L -.274 -.253 L -.39 -.521 L -.116 -.366 L .058 -.495 L .127 -.1 L .909 -.146 L .604 -.243 L .125 -.213 L .167 -.807 L .174 -.185 L .239 -.029 L .193 .14 L .341 .479 L .405 .521 L .386 .195 L .287 -.016 L .188 -.228 L .362 -.482 L .29 .253 L .167 .578 L .146 .112 L .304 .068 L .255 -.114 L .184 -.68 L .243 -1.089 L .131 -1.229 L .229 -1.047 L -.114 -.338 L -.161 -.127 L -.384 -.082 L -.528 -.208 L -.242 -.31 L -.132 -.437 L .008 -.109 L .021 -.3 L .157 -.284 L .492 -.398 L .556 -.441 L .094 -.354 L -.389 -.902 L -.369 -.322 L -.592 -.067 L -.939 .5 L -.463 -.025 L -.146 -.253 L -.068 -.734 L .077 -.679 L .396 -.468 L .56 .109 L .863 .023 L .878 -.076 L .271 .055 L .479 .04 L .56 .124 L .576 .194 L .864 .334 L .863 .292 L .271 -.086 L -.1 -.861 L .159 -.185 L .303 -.312 L .365 -.497 L .158 -.523 L .222 -1.287 L .255 -.228 L .479 -.102 L .975 -.175 L .367 .054 L .624 .138 L .895 .093 L .751 -.287 L .128 .197 L -.031 .156 L -.398 1.203 L -.558 .837 L -.349 .821 L -.094 .551 L -.156 .764 L -.196 2.021 L -.254 1.342 L -.115 .61 L -.169 .708 L -.139 .523 L -.459 .427 L -.525 .229 L -.809 .599 L -.41 .454 L -.47 .836 L -.343 .751 L -.193 1.159 L -.074 .396 L .122 .72 L -.086 .706 L -1.025 .938 L -.364 .229 L -.931 .811 L -.554 .399 L -.57 .328 L -.147 -.211 L -.042 -.664 L -.054 -.424 L -1.495 .532 L -.327 .581 L -.443 .271 L -.177 -.013 L -.484 -.336 L +425.506 195.522 N .045 -.495 L .88 .093 L 1.773 .088 L .831 .038 L 1.022 .149 L -.396 .468 L -.077 .679 L .068 .734 L .146 .253 L .463 .025 L .939 -.5 L .592 .067 L .369 .322 L .389 .902 L -.094 .354 L -.556 .441 L -.492 .398 L -.157 .284 L -.021 .3 L -.008 .109 L .132 .437 L .242 .31 L .528 .208 L .384 .082 L .161 .127 L .114 .338 L -.229 1.047 L -.131 1.229 L -.243 1.089 L -.184 .68 L -.255 .114 L -.304 -.068 L -.146 -.112 L -.167 -.578 L -.29 -.253 L -.362 .482 L -.188 .228 L -.287 .016 L -.386 -.195 L -.405 -.521 L -.341 -.479 L -.193 -.14 L -.239 .029 L -.174 .185 L -.167 .807 L -.125 .213 L -.604 .243 L -.909 .146 L -.127 .1 L -.058 .495 L .116 .366 L .39 .521 L .274 .253 L .052 .296 L -.343 .681 L -.803 -.307 L -.413 .229 L -.184 .295 L -.038 -.037 L -.563 -.493 L -.532 -.55 L -.259 -.466 L -1.318 -1.169 L .286 -.312 L -.369 -.281 L -.528 -.056 L -.918 -1.438 L .382 -.297 L .111 -.1 L -.321 -.395 L -.464 -.14 L -.29 -.564 L -.369 -.451 L .319 -.17 L .541 -.411 L .223 -.396 L .291 -.976 L .089 -.295 L .415 .07 L .495 .013 L -.064 -.211 L -.56 -.352 L -.561 -.451 L .208 -.042 L .271 -.128 L .142 -.617 L .83 -.043 L .927 .008 L 1.245 .021 L .575 -.032 L -.001 -.155 L -.02 -.551 L -.026 -1.836 L +422.536 195.513 N 1.005 -.007 L 1.965 .017 L .026 1.836 L .02 .551 L .001 .155 L -.575 .032 L -1.245 -.021 L -.927 -.008 L -.83 .043 L .033 -.146 L -.049 -.297 L -.144 -.084 L -.416 -.098 L .287 -.467 L .447 -.523 L .335 -.58 L .066 -.403 L h 419.636 193.273 m -.484 -.049 L -.049 -.218 L .049 -.291 L .242 -.097 L .024 -.146 L 0 -.291 L .17 -.097 L .169 -.121 L .219 .048 L .218 .048 L .097 .194 L -.193 .169 L -.146 .243 L -.17 .339 L -.146 .267 L +222.291 207.801 N .188 -.126 L .264 -.312 L .585 -1.061 L .038 -.269 L -.209 -.733 L .058 -.391 L -.478 .617 L -.732 .623 L -.333 -.098 L -.601 -.324 L -.408 -.408 L .389 -.283 L .1 -.24 L -.167 -.579 L .005 -.438 L .133 -.466 L -.109 -.282 L -.362 -.649 L .193 -.17 L .48 -.198 L .721 -.454 L -.319 -.395 L 0 -.226 L .175 -.354 L .497 -.462 L .157 -.146 L .14 -.848 L -.116 -.452 L -.082 -.184 L .11 -.226 L .686 -.101 L .891 -.341 L .396 -.241 L .474 -.382 L .09 -.186 L 1.496 .803 L 1.432 .656 L .227 .225 L .166 .493 L .355 .309 L .977 .277 L .67 -.061 L .89 -.401 L .128 .056 L .709 .631 L .197 .118 L .269 .162 L .081 .112 L .387 .76 L .321 .789 L -.08 .255 L -.352 .384 L -.547 1.147 L -.533 .779 L -.71 .725 L -1.001 .755 L -.336 .087 L -1.028 .303 L -.901 .358 L -.809 .499 L -.59 .653 L -.284 .51 L -.987 2.506 L -.267 .312 L -.242 .072 L -.398 -.068 L -.398 -.491 L -.191 -.479 L -.312 -.252 L -.815 .005 L -.444 -.11 L -.105 -.197 L -.097 -.494 L .233 -.34 L .029 -.495 L .005 -.569 L +245.934 224.314 N 1.109 1.843 L .922 1.646 L .08 .24 L -.437 .736 L -.15 .523 L -.143 .848 L .057 .522 L .236 .902 L -.156 .34 L -.221 .34 L -.532 .582 L -.102 .452 L .347 .845 L -.21 .368 L -.159 .34 L .022 .48 L .604 1.168 L .015 .522 L -.285 .439 L -.723 .61 L -.12 .227 L .049 .48 L .132 .295 L .018 .142 L -.586 .187 L -.15 .199 L -.228 .933 L -.259 .298 L -.852 .275 L -.201 -.517 L -.289 -.31 L -1.422 -.618 L -.313 -.239 L -.233 -.678 L -.315 -.38 L -.559 -.225 L -.504 -.281 L -.489 -.254 L -.616 -.309 L -.873 -.464 L -.673 -.366 L -.866 -.379 L -.838 -.337 L -1.271 -.845 L -1.354 -.985 L -1.232 -1.099 L -.594 -.705 L -.42 -.677 L .008 -.438 L 0 -.903 L -.269 -.606 L -.781 -1.043 L -1.389 -2.778 L -.285 -.268 L -.467 -.211 L -.074 -.085 L .055 -.536 L -.02 -.396 L -.149 -.396 L -1.208 -2.199 L -.997 -1.961 L -.688 -1.27 L -1.365 -1.917 L -.272 -.353 L -.598 -.973 L -.462 -.423 L -.75 -.437 L -.914 -.365 L -.61 -.365 L .119 -.17 L .181 -.113 L .609 -.029 L .144 -.41 L -.118 -.282 L -.592 -.874 L -.353 -.437 L -.258 -.72 L .01 -.24 L .244 -.523 L .582 -.622 L 1.02 -.878 L .47 -.198 L .317 -.214 L -.005 .569 L -.029 .495 L -.233 .34 L .097 .494 L .105 .197 L .444 .11 L .815 -.005 L .312 .252 L .191 .479 L .398 .491 L .398 .068 L .242 -.072 L .267 -.312 L .987 -2.506 L .284 -.51 L .59 -.653 L .809 -.499 L .901 -.358 L 1.028 -.303 L .336 -.087 L 1.001 -.755 L .71 -.725 L .533 -.779 L .547 -1.147 L .352 -.384 L .08 -.255 L -.321 -.789 L -.387 -.76 L .927 .107 L .897 .418 L .513 .435 L .208 .324 L .208 .62 L .526 .364 L .988 .672 L .251 .761 L .078 .282 L .366 .14 L .479 .039 L .173 .296 L -.004 .396 L .092 .281 L .573 .152 L 1.038 .008 L .496 -.031 L .337 -.157 L .452 -.427 L .523 .421 L .397 .182 L .708 -.442 L .509 .209 L 1.299 .84 L .127 .069 L -.035 .198 L -1.155 1.956 L .448 -.031 L .161 -.058 L .237 .126 L .575 .703 L .156 .14 L .136 .324 L -.341 .186 L -.793 -.235 L -.493 -.096 L -.322 .072 L -.604 .441 L -.371 .115 L -.669 -.066 L -1.895 .773 L -.701 .442 L -.372 .172 L -.599 1.415 L -.319 .511 L -.021 .155 L .277 .86 L .012 .112 L -.625 .498 L -.62 .328 L -.349 .342 L -.247 .622 L .106 .564 L .619 .957 L 1.333 2.166 L .106 .127 L -.247 .495 L -.208 .312 L 1.085 .12 L .415 .04 L .312 .182 L .241 .323 L .096 .663 L 1.843 .032 L .762 -.499 L .648 -.484 L .326 -.114 L -.059 1.511 L -.098 1.173 L .108 .353 L .317 .337 L .285 .068 L .358 -.072 L .786 -.259 L .42 -.045 L +279.288 257.295 N -.063 -.423 L .027 -.777 L .222 -.819 L .298 -.835 L .321 -.75 L -.019 -.141 L -.491 -.336 L -.234 -.112 L -1.29 .445 L -.224 -.055 L -.254 -.563 L -.487 -2.524 L -.121 -.437 L -.843 -.404 L -.724 -.278 L -.115 .001 L -.709 .413 L -.346 .03 L -.925 -.221 L -.818 -.15 L -.372 -.04 L .006 -.72 L .086 -.721 L .132 -.862 L -.104 -.959 L -.521 -.872 L -.084 -.663 L -.253 -.408 L .421 -.666 L .38 -.765 L .238 -.834 L .185 -1.173 L -.022 -.494 L -.307 -.774 L -.316 -.479 L -.73 -.362 L -.436 -.407 L -.067 -.563 L .261 -.835 L -.042 -.296 L -.693 -.024 L -1.615 -.019 L -.5 -.012 L -.967 -.036 L -.153 -.112 L -.249 -.944 L -.138 -2.032 L -.03 -.706 L -.203 -1.029 L .038 -.565 L -.085 -.169 L -.403 -.237 L -.537 -.166 L -.636 -.123 L -1.148 .077 L -.22 -.084 L -.398 -.308 L -.385 -.774 L -.096 -.014 L -.882 -.037 L -.3 -.098 L -.75 -.603 L -.688 -.307 L -.676 -.25 L -.355 .03 L -.787 -.023 L -.316 -.097 L -1.1 -.939 L -.813 -.928 L -.335 -.591 L -.141 -.635 L -.036 -.818 L .064 -.622 L .079 -.621 L -.045 -.748 L -1.283 -.021 L -.934 .076 L -.36 .158 L -.874 .485 L -1.471 1.109 L -.415 .243 L -.48 -.025 L -.336 -.026 L -.946 .824 L -.355 .03 L -1.122 -.304 L -.939 -.136 L -.42 .045 L -.786 .259 L -.358 .072 L -.285 -.068 L -.317 -.337 L -.108 -.353 L .098 -1.173 L .059 -1.511 L -.326 .114 L -.648 .484 L -.762 .499 L -1.843 -.032 L -.096 -.663 L -.241 -.323 L -.312 -.182 L -.415 -.04 L -1.085 -.12 L .208 -.312 L .247 -.495 L -.106 -.127 L -1.333 -2.166 L -.619 -.957 L -.106 -.564 L .247 -.622 L .349 -.342 L .62 -.328 L .625 -.498 L -.012 -.112 L -.277 -.86 L .021 -.155 L .319 -.511 L .599 -1.415 L .372 -.172 L .701 -.442 L 1.895 -.773 L .669 .066 L .371 -.115 L .604 -.441 L .322 -.072 L .493 .096 L .793 .235 L .341 -.186 L -.136 -.324 L .133 -.198 L .073 -.382 L .706 -4.411 L .326 -1.428 L -.031 -.212 L -.399 -.562 L .031 -.777 L -.192 -.183 L -.688 -.363 L -.192 -.197 L 0 -.554 L .001 -1.071 L .111 -.085 L .493 -.187 L .687 -.032 L .417 .11 L .384 .04 L -.052 -.367 L -.293 -.408 L -.177 -.084 L -.896 -.122 L -.178 -.154 L .013 -1.031 L .042 -.325 L .64 .024 L 2.812 .082 L .463 -.017 L .412 -.158 L .834 -.57 L .52 -.286 L .148 .168 L .138 .437 L .161 .861 L .088 .452 L .199 .437 L .432 .054 L .694 .546 L .482 .223 L .414 -.073 L .757 -.697 L .083 .183 L .186 .776 L .271 -.016 L .645 -.739 L .74 -.654 L .554 -.286 L .652 -.173 L .235 -.213 L .259 -.666 L .203 -.199 L .652 -.131 L .569 -.272 L .265 -.27 L -.15 -.253 L -.434 -.125 L -.96 -.051 L -.166 -.239 L -.079 -.55 L -.302 -1.524 L -.391 -.69 L -.616 -.688 L .041 -.184 L .159 -.029 L .309 .125 L .896 .461 L .385 .04 L 1.149 -.035 L .344 .224 L .628 .618 L .348 -.115 L .232 -1.117 L .284 -.115 L .465 .054 L .557 -.074 L .807 -.23 L 1.74 -.9 L .592 -.385 L .163 -.326 L -.103 -.169 L .375 -.257 L .302 -.058 L .516 .124 L .26 .111 L .04 .212 L -.452 1.09 L .304 -.001 L .533 .138 L .435 .958 L -.179 .368 L -.547 1.416 L -.213 .962 L .156 .465 L .281 .394 L .167 .31 L -.072 .354 L .008 .396 L .15 .296 L 1.103 .897 L .613 .392 L .686 -.075 L .694 -.513 L .505 -.314 L 1 -.331 L .934 -.429 L .943 .022 L .4 .04 L 1.108 .276 L .528 .054 L -.611 -1.014 L .2 -.326 L .172 -.156 L .642 .124 L .418 .139 L .398 -.059 L .534 -.385 L .319 -.001 L 1.05 .488 L .649 .505 L .225 .069 L .882 -.613 L 1.11 .389 L .56 .025 L .299 -.214 L .464 -.681 L .439 -.992 L .427 -.765 L 1.102 -1.646 L -.015 -.422 L .409 -.241 L .276 .141 L .235 .423 L .164 .791 L .414 1.34 L .108 .607 L .472 1.383 L .296 .55 L .324 .324 L .978 .21 L .196 .338 L .038 .551 L -.045 .254 L -.524 .354 L -.933 1.414 L -.238 .325 L -.51 .411 L -.41 .231 L -.244 .138 L -.798 .778 L -.544 .947 L -.419 1.018 L -.402 .453 L .271 .112 L .512 -.072 L .497 -.198 L 1.202 -.709 L .112 -.028 L .299 .889 L .442 .818 L .255 .112 L .287 .07 L 1.135 -.031 L .592 -.058 L .737 -.298 L -.277 .679 L -.017 .584 L .448 -.557 L 1.254 -1.006 L .289 -.156 L .306 -.382 L .499 -.933 L .272 -.396 L .256 -.099 L 1.006 -.003 L .352 -.198 L .175 0 L .687 .549 L .654 .267 L .32 -.028 L .814 .28 L 1.069 .45 L .334 .281 L .269 .593 L .08 .028 L .176 -.015 L .402 -.354 L .319 .042 L .302 .254 L .538 .789 L .205 .396 L -.13 .254 L -.308 .41 L -.116 .424 L .091 .466 L .171 .396 L .825 -.821 L .369 -.156 L .609 -.156 L .995 -.454 L .224 -.028 L .367 .069 L .764 .38 L .907 .436 L .462 .098 L 1.117 .167 L 1.118 .083 L .464 -.058 L .48 -.029 L .577 -.171 L .416 -.016 L 1.131 .351 L .731 .408 L .762 .479 L .586 .437 L 1.595 1.395 L .742 .662 L .821 .605 L .41 .338 L .477 .196 L .734 .168 L 1.247 .097 L .912 .04 L .445 .197 L .265 .465 L .087 .607 L .592 2.004 L .268 1.143 L .062 .988 L -.076 .579 L -.179 .904 L -.243 .848 L -.559 1.301 L -.518 .849 L -1.347 1.175 L -1.388 1.288 L -.44 .198 L -.354 .043 L -.39 .637 L -.094 .396 L -.012 .353 L -.504 1.074 L -.6 .976 L -.8 1.104 L -.266 .212 L -.194 .015 L -.079 -.423 L -.278 -.296 L -.367 -.084 L -.064 .79 L -.538 1.64 L -.049 .734 L -.077 .607 L .318 2.738 L .078 .988 L -.577 2.543 L -.039 .663 L .14 .649 L .043 .085 L -.759 .495 L -.404 .51 L -.261 .791 L -.04 .367 L .245 1.468 L -.106 .367 L -.214 .283 L -.676 .608 L -.752 1.498 L -1.01 1.4 L -.201 .537 L -.055 .311 L .144 .945 L -1.203 .37 L -.544 .283 L -.355 .368 L -.084 .466 L .021 .367 L -.401 .114 L -.864 -.041 L -.979 .172 L -.654 .001 L -.764 -.055 L -.465 -.112 L -.922 .072 L -.736 .002 L -.214 .607 L -.295 .198 L -.795 .312 L -.481 .453 L -.21 .354 L -.747 -.267 L -.35 .071 L -.563 .255 L -1.864 1.232 L -.528 .396 L -.725 .383 L -.616 .438 L -.532 .679 L -.486 .241 L -.567 .072 L -.278 -.014 L .006 .24 L .336 .225 L .12 .536 L -.111 .537 L -.099 .282 L -.282 .156 L -.084 .155 L .384 .648 L .036 1.186 L .05 1.045 L -.057 .311 L -.11 .594 L -.198 .621 L -.464 .735 L -.566 .495 L -.788 .524 L -.866 1.046 L -.208 .396 L -.476 1.145 L -.499 .933 L -.75 1.004 L -.69 .623 L -.801 .78 L .321 -.808 L .436 -.594 L .629 -.566 L .605 -1.158 L -.06 -.254 L -.356 .142 L -.397 -.014 L -.633 -.21 L -.075 .155 L .002 .297 L -.401 1.215 L -.349 .48 L -.661 .438 L -.317 .283 L -.225 .424 L -.013 .354 L -.448 1.709 L -.481 .763 L -.787 .934 L -1.076 .979 L -.101 -.313 L -.258 -.746 L .103 -.269 L .634 -.766 L .017 -.269 L -.333 -.379 L -.163 -.027 L -.131 -.197 L -.853 -1.109 L -.474 -.435 L -.999 -.587 L -.55 -.194 L -.617 -.194 L -.432 -.576 L -.365 -.393 L -.693 .427 L -.27 .016 L -.232 -.38 L -.59 -.814 L -.379 -.407 L -.47 -.364 L -.266 -.098 L -.25 .101 L -1.042 .246 L -.55 .003 L .214 -.27 L .833 -.88 L 1.805 -1.816 L 1.435 -1.363 L 1.633 -1.448 L .348 -.242 L 1.754 -.744 L .521 -.313 L .161 -.467 L .094 -1.638 L -.517 -1.154 L -.206 -.196 L -.462 .017 L -.957 .161 L h 288.966 203.943 m -.558 -.125 L -.301 -.536 L -.078 -.382 L .16 -.197 L -.094 -.636 L .048 -.381 L .208 -1.018 L .176 -.099 L .479 -.058 L .879 .097 L 1.007 .11 L .479 -.199 L .368 .028 L .479 .168 L .479 .083 L .319 .155 L -.335 .538 L -.193 .946 L -.257 .494 L -.289 .312 L -.561 .326 L -.464 .171 L -.527 .015 L -.783 .016 L -.641 .171 L +732.92 214.323 N -.164 -.24 L -.225 -.197 L -.379 -.126 L -.416 .198 L -.399 -.38 L -.287 -.184 L -.659 -.238 L -.243 -.239 L .156 -.255 L .29 .027 L .731 -.058 L .538 .126 L .743 .083 L .523 -.058 L .258 -.185 L .232 -.509 L .056 .099 L .351 .395 L .286 .184 L .241 .014 L .961 -.2 L .366 -.227 L .361 -.722 L .241 -.212 L .653 -.029 L .263 -.128 L .04 -.282 L -.064 -.565 L -.043 -.536 L .495 .196 L .404 .056 L .324 -.354 L .318 .578 L .077 .353 L -.196 .495 L -.099 .184 L -.509 .044 L -.159 .226 L .061 .17 L .437 .479 L -.308 .354 L -.264 .113 L -.742 -.083 L -.416 .001 L -.091 .269 L -.408 .495 L -.275 .156 L -.973 .426 L -.484 .143 L -.798 .029 L -.807 .115 L h 713.795 220.696 m .031 -3.438 L -.046 -.805 L -.431 -1.368 L .44 -.822 L -.169 -7.966 L 2.581 .802 L .85 .337 L 1.04 .295 L 1.254 .378 L .848 .507 L .613 .323 L .597 .084 L .38 -.058 L .26 .508 L .274 .254 L .635 .352 L .687 .395 L .779 .718 L -.3 .947 L .033 .226 L .305 .226 L .665 .111 L 1.887 .787 L .354 .027 L .72 .183 L .181 .254 L .413 .535 L .211 .579 L -.166 .113 L -1.114 .073 L -.563 .156 L -.098 .155 L .047 .339 L .589 .987 L .5 .521 L 1.464 1 L .218 .847 L .725 1.044 L .288 .141 L .304 -.015 L .712 -.086 L .338 .013 L .087 .198 L -.354 .551 L .218 .212 L .401 .141 L .423 .041 L .63 .168 L .096 .127 L -.031 .142 L -.648 .213 L .287 .24 L 1.064 .28 L .538 .295 L .235 .763 L -.064 .226 L -1.094 -.012 L -.215 -.154 L -.146 -.466 L -.126 -.099 L -1.011 -.111 L -1.063 -.266 L -.644 -.126 L -.752 .016 L -.774 -.026 L -.573 -.211 L -.494 -.352 L -.223 -.522 L -.24 -.268 L -.726 -.31 L -.472 -.338 L -.135 -.197 L -1.089 -1.608 L -.613 -.817 L -.454 -.056 L -1.524 -.336 L -.671 -.31 L -.55 -.055 L -.415 .185 L -.394 .071 L -.78 -.45 L .282 .762 L -.027 .212 L -.249 .071 L -.382 -.126 L -.311 .1 L .296 .395 L -.116 .113 L -1.037 .045 L -1.125 -.182 L -.478 .029 L .237 .127 L .24 .154 L .642 .169 L .662 .352 L .404 .338 L .219 .395 L -.411 .199 L -.739 .425 L -.458 .213 L -.668 -.097 L -1.801 -.039 L -1.219 -.092 L +726.605 297.247 N -.479 -.229 L -1.179 -.471 L -.543 -.371 L -.508 -.715 L -.477 -.558 L -.216 -.414 L .264 -.044 L .169 .1 L .421 .171 L .129 -.143 L -.209 -.387 L -.703 -.699 L -.617 -.713 L -.149 -.257 L -.375 -.956 L -.008 -.67 L .177 -.044 L 1.004 .312 L 1.476 .354 L 1.089 .369 L .797 -.03 L .463 -.144 L .382 -.115 L .373 -.058 L .684 .027 L .306 -.301 L .716 -.244 L .475 .385 L -.009 .1 L .128 .8 L -.009 .686 L -.751 1.503 L -.124 .758 L -.245 .315 L -.943 .26 L -.553 .388 L -.49 .689 L -.189 .272 L -.274 .072 L h 716.883 224.344 m .682 .394 L .233 .509 L .047 .649 L .118 .678 L .256 .197 L .42 .013 L .102 .24 L -.45 .919 L .715 .338 L .175 .282 L .147 .593 L .08 1.3 L .144 .621 L .456 1.157 L .293 .268 L .422 .014 L .328 -.312 L .384 -.185 L .32 .663 L .363 .127 L .563 .408 L .385 .154 L .144 .155 L .002 .41 L .083 .96 L .275 .776 L -.046 1.06 L .279 .24 L .93 1.325 L .276 .706 L .055 .777 L -.209 .876 L .403 .649 L .275 .833 L .204 .353 L 1.395 .803 L .285 .154 L .744 .111 L .402 .649 L .843 .535 L .483 .169 L 1.141 .068 L .117 .197 L 731 245.42 l -.273 .565 L .309 .424 L .879 .479 L .22 .564 L .469 1.342 L .211 .748 L .112 .396 L .252 .311 L .771 .352 L -.021 -.127 L -.141 -.777 L .913 .507 L .567 .154 L .184 .127 L .136 .296 L .106 1.752 L .884 .762 L .573 .323 L .604 .154 L .287 .296 L .244 .579 L .229 .424 L .545 .168 L .176 .297 L .007 .269 L .19 .536 L .106 .113 L .506 .126 L .156 .112 L .162 .354 L .366 1.327 L .026 .876 L .013 .862 L -.132 .41 L -.181 .325 L .778 1.271 L .223 .48 L .181 .833 L .034 .749 L -.293 .708 L -.353 1.668 L -.585 1.755 L .137 .791 L -.065 .806 L -.306 .778 L -.661 .977 L -.203 .665 L -.598 .821 L -.45 .185 L -.465 .1 L -.423 .468 L -.466 .68 L -.328 1.527 L -.477 .638 L -.34 .495 L .014 .65 L -.208 .539 L -.331 .312 L -.601 .341 L -.27 .326 L -.3 1.021 L -.169 1.049 L -.079 .937 L .021 .666 L -.283 .64 L -.322 .354 L -.463 .3 L -.754 .101 L -1.158 .087 L -.82 .03 L -.527 .157 L -.516 .299 L -1.529 .94 L -.443 .129 L -.214 .284 L -.346 .071 L -.528 .059 L -.286 -.014 L .295 .368 L .209 .27 L -1.315 -.665 L -.885 -.353 L .003 -.469 L -.073 -.156 L -.56 -.467 L -.628 -.368 L -.421 -.014 L -.485 .172 L -.335 .242 L .748 .467 L -.97 .243 L -.929 .428 L -.953 .442 L -.222 .028 L -.604 -.226 L -.886 -.438 L -.67 -.226 L -1.086 -.311 L -.51 -.041 L -.239 .156 L -.044 .113 L -.716 -.169 L -.751 -.353 L -.522 -.298 L -.896 -.82 L -.526 -.34 L -.422 -.879 L .09 -1.035 L -.082 -.411 L -.184 -.495 L -.664 -.736 L -.141 -.523 L -.029 -.425 L -.534 -.014 L -.786 .398 L -.597 .114 L -.34 .058 L -.178 -.07 L -.167 -.17 L .517 -.454 L .233 -.567 L .073 -.821 L -.253 -.324 L -.536 -.593 L -.247 -.353 L -.485 .735 L -.443 1.431 L -.19 .113 L -.796 .002 L -.199 .156 L -.196 .015 L -.255 .028 L .198 -.396 L .081 -.396 L .079 -.1 L .634 .041 L .242 -.142 L .126 -.255 L -.105 -1.004 L .454 -.835 L .328 -.453 L .091 -.396 L .018 -.409 L .151 -.128 L .245 -.015 L .218 -.354 L -.052 -.227 L -.323 -.494 L -.338 -.494 L -.107 .707 L -.288 .255 L -.518 .299 L -.311 .467 L -.086 .155 L -.189 .467 L -.281 .326 L -.747 .242 L -.735 .481 L -.653 .567 L -.36 .693 L -.514 .808 L -.41 -.339 L -.38 -1.328 L -.263 -.579 L -.19 -.325 L -.688 -.79 L -.297 -.734 L -.176 -.212 L -.704 .072 L -.235 -.099 L -.139 -.24 L -.085 -.269 L .334 -.34 L -.047 -.297 L -.346 -.395 L -.543 -.494 L -.266 -.098 L -.83 .157 L -.486 -.07 L -.95 -.549 L -.274 -.014 L -.438 .17 L -.433 -.027 L -.421 -.183 L -.662 -.521 L -.921 -.437 L -.218 .001 L -.723 .213 L -1.282 .088 L -.669 .001 L -1.764 .061 L -.611 .129 L -.656 .213 L -.989 .44 L -.972 .256 L -1.039 .257 L -1.503 .088 L -.794 -.013 L -.383 .044 L -.927 .284 L -.993 .469 L -.773 .397 L -.538 .143 L -.431 .085 L -.361 .199 L -.615 .693 L -.774 1.02 L -.588 .284 L -.766 -.013 L -.547 -.013 L -.927 .143 L -.4 .185 L -.663 -.395 L -.294 -.084 L -.734 .016 L -1.572 .173 L -.938 .157 L -.459 -.041 L -.672 .044 L -.398 .227 L -.583 .793 L -.344 .128 L -.958 -.125 L -.158 .057 L -.57 .708 L -.465 .368 L -.919 .271 L -.586 .086 L -1.516 -.082 L -.638 -.055 L -.688 -.197 L -.633 -.366 L -.778 -.677 L -.74 -.353 L -.374 -.041 L -.151 -.07 L -.19 -1.229 L .055 -.255 L .489 .112 L .45 -.086 L .332 -.425 L .197 -.467 L .267 -1.357 L -.043 -1.215 L -.156 -.622 L -.258 -.593 L -1.117 -1.906 L -.208 -.635 L -.144 -.834 L .027 -.989 L -.16 -.692 L -.467 -1.072 L -.663 -.945 L -.603 -.734 L -.214 -.254 L .128 -.904 L -.215 -.536 L -.733 -1.115 L -.972 -1.018 L -.273 -.583 L .126 -.233 L .188 .187 L .152 .443 L .183 .163 L .235 .35 L .327 .188 L .354 .023 L -.348 -1.144 L -.437 -.396 L -.226 -.326 L .08 -.304 L .748 .84 L .495 .979 L .477 .065 L -.099 -.555 L .289 -.039 L .004 -.564 L -.282 -.48 L -1.03 -1.368 L -.354 -.691 L -.119 -.579 L -.038 -.734 L .355 -.595 L .323 -.523 L .21 -.664 L -.083 -1.031 L -.254 -.635 L .033 -.368 L .438 -.692 L .109 -.325 L .064 -.156 L .271 .649 L .011 .424 L .105 .184 L .35 .027 L .171 -.113 L .187 -.565 L .141 -.48 L .765 -.468 L 1.22 -.624 L .484 -.326 L .676 -.581 L .585 -.467 L .632 -.327 L .79 -.114 L .697 -.016 L .7 -.002 L .431 -.043 L .352 -.185 L .474 -.453 L .494 -.128 L .929 -.072 L .279 -.143 L .291 -.551 L .158 -.1 L .444 .027 L .877 .224 L .626 -.043 L .911 -.299 L 1.084 -.469 L .359 -.213 L .716 -.665 L .427 -.58 L .29 -.622 L .132 -.297 L .41 -.369 L .968 -.651 L .079 -.17 L -.067 -.409 L -.242 -.805 L -.016 -.495 L 1.063 -1.118 L .387 -.692 L .291 .169 L .341 .437 L .619 1.355 L .262 .253 L .177 -.579 L .021 -.466 L .436 .238 L .272 .07 L .189 -.607 L -.06 -.142 L -.563 -.238 L -.175 -.24 L .007 -.565 L .044 -.112 L .897 .04 L .661 .253 L .642 -.029 L .334 -.029 L .289 .074 L -.699 -.455 L -.431 -.141 L .128 -.537 L -.07 -.296 L .135 -.509 L .422 -.354 L .165 -.07 L .732 .394 L .202 -.043 L -.112 -.452 L .11 -.48 L .146 -.367 L -.041 -.522 L .358 -.171 L .4 -.113 L .813 .04 L .529 -1.088 L .371 -.298 L .35 .169 L .268 .451 L .265 -.552 L .222 -.227 L .197 -.48 L .695 .62 L .513 .084 L .293 .211 L .331 .536 L .632 .592 L .122 .706 L -.072 .594 L .181 .197 L .256 -.283 L .462 -.679 L .155 -.128 L 1.16 .082 L .479 .155 L .637 .492 L .332 .141 L .156 -.48 L .302 -.297 L .022 -.24 L -.266 -.324 L -.601 -.395 L -.079 -.184 L .008 -.24 L .145 -.099 L .604 -.538 L .007 -.452 L .191 -.213 L .518 -.283 L .268 -.241 L .151 -.269 L -.094 -.184 L .003 -.296 L .512 -.863 L .121 -.057 L .317 -.029 L .397 -.029 L .248 -.17 L -.205 -.409 L .377 -.396 L .344 -.071 L .793 .366 L .616 -.072 L 1.291 -.088 L .512 -.128 L .232 -.17 L .04 -.057 L -.077 -.197 L -.2 -.734 L -.248 -.282 L -.471 -.268 L -.374 .086 L -.244 -.141 L .035 -.212 L .367 -.143 L .396 -.043 L .617 .521 L .255 .099 L .34 -.1 L .364 .31 L .676 .465 L .36 .154 L 1.297 .294 L .591 .084 L .413 -.143 L .372 .014 L .396 .606 L .419 .112 L .141 -.029 L .562 -.438 L .454 .027 L .652 .38 L .331 .479 L .46 -.143 L .122 -.791 L .181 -.085 L .455 .465 L .337 .099 L .152 .154 L -.436 .411 L -.126 .424 L -.176 .212 L -.011 .438 L -.12 .255 L -.513 .015 L -.51 .228 L -.396 .34 L -.004 .551 L .301 .353 L -.187 .692 L -.381 .58 L -.559 .481 L -.155 .48 L .063 .17 L .469 .437 L 1.038 .619 L .81 .677 L .508 .606 L .246 .099 L .349 -.114 L .264 .027 L .782 .352 L .742 .465 L .434 .451 L .679 .535 L .335 .127 L .442 .027 L .784 .182 L .25 .184 L .218 .621 L .167 .169 L .507 .31 L .76 .423 L .537 .154 L .422 -.072 L .414 -.17 L .603 -.199 L .208 -.156 L .736 -1.344 L .403 -1.131 L .194 -1.314 L .259 -.721 L .43 -.679 L -.131 -.424 L -.409 -.621 L .022 -.311 L .236 -.637 L .187 -.48 L -.164 -.282 L -.183 -.395 L .088 -.692 L .104 -1.004 L .225 -.297 L .329 -.156 L .158 -.311 L -.534 -.521 L .033 -.198 L .576 -.947 L .312 -.934 L .072 -.833 L .191 -.241 L .279 -.297 L +270.934 276.123 N .054 -.338 L -.194 -.577 L .011 -.522 L .24 -.495 L .48 -.524 L .118 -.325 L -.168 -.986 L -.049 -.847 L .103 -.522 L .595 -2.359 L .065 -.452 L .443 -.524 L .55 -.003 L 1.042 -.246 L .25 -.101 L .266 .098 L .47 .364 L .379 .407 L .59 .814 L .232 .38 L .27 -.016 L .693 -.427 L .365 .393 L .432 .576 L .617 .194 L .55 .194 L .999 .587 L .474 .435 L .853 1.109 L .131 .197 L .163 .027 L .333 .379 L -.017 .269 L -.634 .766 L -.103 .269 L .258 .746 L .101 .313 L -.059 .053 L -.803 1.103 L -.625 .552 L -.775 .454 L -.441 .156 L -.818 .1 L -.874 -.337 L -.551 .044 L -.551 .114 L -.64 .283 L -.38 -.042 L -.846 -.676 L -.637 -.252 L -.76 -.154 L -.469 .128 L -.507 .072 L -.327 -.127 L -.548 -.563 L -.354 -.159 L +418.763 73.869 N .391 -.499 L .389 -.262 L .283 .081 L .663 -.062 L .762 -.075 L .324 -.137 L .891 -.787 L .979 -.2 L .224 .025 L .198 -.219 L .175 .032 L -.349 .531 L .11 .106 L .026 .481 L -.288 .156 L -.17 .368 L -1.675 .069 L -.376 -.106 L -.428 .031 L -.14 -.062 L -.239 .081 L -.275 .031 L -.153 .417 L -.249 .218 L -.353 .118 L -.08 .112 L -.229 -.155 L -.411 -.292 L h 421.68 78.002 m -1.839 .129 L -.116 -.016 L .064 -.404 L -.19 -.638 L -.174 .015 L -.36 -.293 L -.233 .184 L -.398 -.172 L .2 -.355 L .434 -.293 L -.007 -.181 L -.445 -.541 L .018 -.256 L .131 -.498 L .279 -.106 L .318 .15 L .495 .12 L .43 -.574 L .299 -.091 L .296 .437 L .391 -.046 L .022 -.528 L .107 -.363 L 1.032 -.017 L .848 .089 L .03 .544 L .187 .301 L 1.138 .058 L .14 .166 L -.307 .604 L -.565 .142 L -.119 -.261 L -.331 .031 L -.263 .136 L .121 .278 L -.184 .414 L -.312 .077 L -.069 .244 L -.635 .035 L .157 .229 L -.291 .094 L -.191 .24 L -.061 .285 L .003 .21 L -.215 .338 L .166 .084 L h 427.177 77.967 m -.139 -.149 L -.312 -.344 L -.405 .031 L -.665 -.059 L -.123 -.329 L -.285 -.66 L .433 -.091 L .603 -.467 L .356 .495 L .521 .179 L .2 -.271 L .078 -.586 L .333 -.046 L .459 .044 L .056 .571 L -.134 .36 L -.144 .09 L -.413 .286 L .603 .299 L -.285 .166 L -.499 .39 L -.238 .09 L +417.259 94.301 N -.135 -.233 L .216 -.701 L -.091 -.076 L .075 -.295 L .321 -.372 L .054 -.358 L .054 -.213 L .954 -.806 L -.605 -.193 L -.479 .014 L -.456 -.09 L -.095 -.186 L -.233 -.007 L -.072 .048 L -.689 .062 L -.045 -.145 L -.395 .055 L -.337 -.277 L -.428 -.319 L -.074 -.353 L .248 -.144 L .044 -.288 L -.466 -.096 L -.41 -.312 L -.062 -.301 L .422 -.376 L -.038 -.468 L -.282 -.365 L -.344 -.177 L .165 -.278 L -.143 -.217 L -.182 -.037 L .08 -.097 L .235 -.133 L .236 -.133 L -.193 -.121 L .201 -.275 L .095 -.148 L -.152 -.292 L -.082 -.265 L -.376 -.182 L .07 -.182 L .341 -.078 L .175 -.092 L .378 .134 L .664 -.151 L .32 -.152 L .128 -.376 L .412 -.207 L .003 -.328 L -.16 -.17 L -.188 .061 L -.44 -.134 L .029 -.184 L .113 -.181 L .571 .036 L .084 -.401 L .345 -.361 L -.151 -.438 L .066 -.147 L -.465 -.192 L .126 -.43 L .285 -.181 L .371 -.028 L 1.12 -.062 L .293 -.012 L .095 .16 L .195 .271 L -.155 .158 L .324 .113 L .148 -.068 L .042 -.192 L -.159 -.204 L .259 .012 L .437 .169 L -.163 -.362 L .247 -.419 L .687 .113 L .614 -.091 L -.596 -.17 L -.084 -.227 L .282 -.102 L -.252 -.114 L -.12 -.147 L .166 -.08 L .068 -.136 L -.675 .08 L -.06 -.182 L .664 -.125 L .218 -.193 L -.464 -.42 L -.324 -.341 L .045 -.28 L .116 .016 L 1.839 -.129 L .254 .13 L .565 .341 L .271 .297 L -.02 .228 L -.252 .175 L .445 -.05 L .171 .216 L .157 -.078 L .283 .021 L .235 .156 L .45 .073 L .866 -.121 L .077 .208 L -.07 .149 L -.057 .125 L -.665 .295 L .316 .193 L .649 -.136 L .113 .182 L .457 -.006 L .349 -.391 L 1.059 -.136 L .602 -.234 L .757 -.266 L .249 .113 L .396 -.17 L .184 .182 L .085 .159 L .634 .29 L .182 .074 L .526 -.12 L .156 .12 L .059 .34 L .036 .227 L .154 .102 L .354 .125 L .372 -.022 L .028 .13 L .201 .025 L .319 .835 L -.219 .52 L -.391 .147 L -.051 .328 L .391 .102 L .683 .429 L -.217 .395 L .094 .18 L .312 .146 L -.021 .304 L .131 .102 L -.118 .292 L -.214 .124 L -.007 .191 L .325 .27 L -.114 .258 L .468 .188 L .281 .485 L -.435 .698 L -.142 .115 L -.344 -.072 L -.031 -.278 L -.308 -.121 L -.436 .072 L .282 .218 L -.254 .084 L -.284 .097 L -.524 .048 L -.124 .169 L -.735 .024 L -.112 .217 L -.176 -.072 L -.358 .061 L -.097 .229 L -.382 .012 L -.078 .181 L -.442 0 L -.422 .201 L -.293 -.033 L -.26 .181 L -.243 .168 L .037 .056 L .258 .378 L .413 .098 L -.155 .25 L -.08 .406 L .159 .085 L .036 .233 L .244 .173 L .478 .265 L .188 -.072 L .573 .515 L .431 .17 L .184 .201 L .219 -.084 L .165 .18 L .207 .036 L .447 .633 L -.682 .26 L -.437 -.151 L -.132 .027 L -.039 .337 L -.162 .172 L -.968 .295 L -.364 .227 L .538 .571 L -.197 .295 L .334 .014 L .056 .158 L -.098 .343 L -.082 .055 L -.441 -.178 L .049 -.165 L -.146 -.117 L -.564 .062 L -.195 -.138 L -.433 .035 L -.092 .178 L -1.25 .035 L -.125 .171 L -.319 .014 L -.044 .13 L 425.4 94.7 l -.594 .021 L -.059 -.144 L -.093 -.145 L -.493 -.089 L -.262 .055 L -.237 -.041 L .032 .274 L -.452 .343 L -.215 0 L .078 -.195 L -.26 -.039 L .011 -.165 L -.194 -.048 L -.104 -.137 L -.249 -.007 L -.096 -.11 L -.164 .137 L -.368 -.014 L -.664 -.261 L -.852 -.007 L -.149 -.089 L -.199 .014 L -.017 -.151 L -.709 .199 L .179 .199 L -.354 .021 L -.278 -.11 L -.567 .158 L -.271 -.096 L -.272 .117 L -.271 -.089 L h 432.012 80.473 m -.171 -.038 L -.088 -.049 L -.447 .08 L -.111 -.264 L .002 -.213 L .647 .281 L .168 .203 L +450.734 91.05 N -.831 -.33 L -.424 -.101 L -.104 -.216 L -.703 -.186 L -.129 -.13 L -.561 .076 L -.508 -.041 L -.073 .137 L -.373 .18 L -.46 -.254 L -.483 .046 L -.168 -.056 L -.558 .204 L -.104 .177 L -.149 .135 L -.18 -.12 L -.389 .083 L -.003 -.204 L .026 -.083 L -.066 -.18 L -.331 .025 L -.073 -.169 L -.194 -.24 L -.261 .024 L -.062 .112 L -.193 -.016 L -.183 .24 L -.43 .048 L -.03 -.228 L -.285 -.041 L -.105 -.331 L -.382 -.096 L -.188 -.208 L .02 -.249 L -.802 -.132 L -.311 -.181 L -.368 .161 L -.293 -.013 L -.013 -.221 L .001 -.253 L -.329 .084 L .181 -.283 L -.709 .005 L -.258 -.121 L -.509 -.193 L -.286 -.024 L -.003 .145 L .282 .302 L -.41 .12 L -.22 .187 L -.318 -.072 L -.296 -.38 L -.55 -.247 L .224 -.211 L .208 -.024 L .099 -.121 L -.199 -.181 L -.257 -.024 L -.061 .066 L -.466 .066 L .005 -.169 L -.278 .037 L -.132 -.181 L -.568 -.054 L -.201 -.025 L -.363 -.163 L -.093 -.26 L -.211 -.091 L -.361 .018 L -.063 .084 L .062 .073 L -.024 .151 L -.375 0 L .435 -.698 L -.281 -.485 L -.468 -.188 L .114 -.258 L -.325 -.27 L .007 -.191 L .214 -.124 L .118 -.292 L -.131 -.102 L .021 -.304 L -.312 -.146 L -.094 -.18 L .217 -.395 L -.683 -.429 L -.391 -.102 L .051 -.328 L .391 -.147 L .219 -.52 L -.319 -.835 L .34 .043 L .23 .125 L -.093 -.193 L .156 -.153 L -.019 -.147 L -.166 -.13 L -.021 -.129 L -.012 -.075 L .93 -.154 L .431 -.051 L .516 -.152 L 1.304 -.128 L .48 -.158 L .797 -.479 L 1.117 -.298 L 1.515 -.303 L 1.382 -.086 L 1.067 .417 L -.882 -.294 L -.054 .147 L .256 .172 L .132 .466 L .355 .135 L .648 .061 L .645 -.11 L 1.063 -.409 L .054 .004 L -.978 .417 L -.19 .11 L -.004 .123 L .218 .012 L .286 -.123 L .613 -.208 L .543 -.253 L .842 .006 L 2.246 .115 L 2.96 -.101 L .641 -.021 L .04 .014 L .679 .243 L .284 .487 L .099 .186 L .016 .029 L .09 .171 L .16 .302 L .615 1.5 L .172 .502 L -.023 .236 L -.263 .208 L -.44 .03 L -.571 .244 L -.291 .328 L -.128 .292 L .289 .012 L .421 .146 L .149 .176 L .218 .146 L .013 .25 L -.315 .752 L .126 .137 L .161 .175 L -.074 .242 L .816 .835 L .316 .193 L -.298 .048 L -.085 .133 L .328 .302 L -.009 .314 L -.255 .24 L -.429 .013 L -.286 .181 L -.599 .398 L -1.509 1.218 L -.082 .306 L .044 .552 L .349 .383 L -.653 -.018 L h 431.844 80.27 m .232 .024 L .069 .208 L -.134 -.029 L -.168 -.203 L h 432.739 80.361 m -.03 .129 L -.278 -.024 L -.191 .03 L -.046 -.208 L .174 -.012 L .266 0 L .106 .085 L +416.488 81.945 N .151 .438 L -.345 .361 L -.084 .401 L -.571 -.036 L -.113 .181 L -.029 .184 L .44 .134 L .188 -.061 L .16 .17 L -.003 .328 L -.412 .207 L -.128 .376 L -.32 .152 L -.664 .151 L -.378 -.134 L -.175 .092 L -.341 .078 L -.07 .182 L .376 .182 L .082 .265 L .152 .292 L -.095 .148 L -.201 .275 L .193 .121 L -.236 .133 L -.235 .133 L -.08 .097 L .182 .037 L .143 .217 L -.165 .278 L -.672 .024 L -.001 -.338 L .172 -.097 L .11 -.423 L -.754 -.375 L -.535 .109 L -.292 -.375 L -.228 -.061 L -.173 .121 L -.313 -.242 L -.267 .182 L -.307 0 L -.307 -.012 L .025 .157 L -.52 .034 L -.407 -.042 L -.477 -.098 L -.07 -.162 L -.496 -.264 L .795 -.472 L .858 -.621 L .273 -.354 L .563 -1.167 L .173 -.104 L .644 -.12 L .367 .251 L .136 .268 L -.28 .203 L -.228 -.056 L .066 .496 L -.191 .124 L 1.163 .225 L .225 -.236 L .406 -.113 L .134 -.417 L -.458 -.022 L -.123 -.124 L -.02 -.203 L .236 -.158 L -.171 -.023 L -.558 -.067 L .072 -.328 L -.034 -.13 L -.023 -.034 L .128 -.283 L .572 -.198 L .709 -.238 L .654 .03 L 1.089 -.151 L .245 .275 L .329 .045 L .076 .181 L .259 0 L +431.57 91.965 N -.447 -.633 L -.207 -.036 L -.165 -.18 L -.219 .084 L 430.349 91 l -.431 -.17 L -.573 -.515 L -.188 .072 L -.478 -.265 L -.244 -.173 L -.036 -.233 L -.159 -.085 L .08 -.406 L .155 -.25 L -.413 -.098 L -.258 -.378 L -.037 -.056 L .243 -.168 L .26 -.181 L .293 .033 L .422 -.201 L .442 0 L .078 -.181 L .382 -.012 L .097 -.229 L .358 -.061 L .176 .072 L .112 -.217 L .735 -.024 L .124 -.169 L .524 -.048 L .284 -.097 L .254 -.084 L -.282 -.218 L .436 -.072 L .308 .121 L .031 .278 L .344 .072 L .142 -.115 L .375 0 L .024 -.151 L -.062 -.073 L .063 -.084 L .361 -.018 L .211 .091 L .093 .26 L .363 .163 L .201 .025 L .568 .054 L .132 .181 L .278 -.037 L -.005 .169 L .466 -.066 L .061 -.066 L .257 .024 L .199 .181 L -.099 .121 L -.208 .024 L -.224 .211 L .55 .247 L .296 .38 L .318 .072 L .22 -.187 L .41 -.12 L -.282 -.302 L .003 -.145 L .286 .024 L .509 .193 L .258 .121 L .709 -.005 L -.181 .283 L .329 -.084 L -.001 .253 L .013 .221 L .293 .013 L .368 -.161 L .311 .181 L .802 .132 L -.02 .249 L .188 .208 L .382 .096 L .105 .331 L -.071 -.012 L -.065 .066 L -.066 .04 L -.105 -.026 L 442 89.998 l -.119 .013 L -.065 .04 L -.132 .066 L -.053 .079 L -.118 .092 L -.119 .053 L -.132 .079 L -.105 .013 L -.118 .013 L -.053 .092 L -.026 .092 L -.026 .132 L -.053 .079 L -.053 .105 L -.145 .066 L -.105 .04 L -.092 -.026 L -.079 .079 L -.04 .092 L -.053 .079 L -.039 0 L -.105 .026 L -.066 .026 L -.079 .053 L -.118 .053 L -.132 0 L -.145 .04 L -.093 .026 L -.065 -.026 L -.065 -.026 L -.093 0 L -.065 .026 L -.158 0 L -.132 -.053 L -.092 -.053 L -.093 .026 L -.171 .053 L -.026 .04 L -.146 .119 L -.092 .066 L -.014 .131 L -.065 .105 L -.039 .044 L -.055 -.095 L -.545 -.2 L -1.332 .181 L -1.019 -.227 L -1.374 -.341 L -.746 .773 L -.598 .163 L -.483 -.099 L -.354 -.129 L -.145 -.014 L +421.683 94.397 N .368 .014 L .164 -.137 L .096 .11 L .249 .007 L .104 .137 L .194 .048 L -.011 .165 L .26 .039 L -.078 .195 L .215 0 L .452 -.343 L -.032 -.274 L .237 .041 L .262 -.055 L .493 .089 L .093 .145 L .059 .144 L 425.4 94.7 l .377 -.103 L .044 -.13 L .319 -.014 L .125 -.171 L 1.25 -.035 L .092 -.178 L .433 -.035 L .195 .138 L .564 -.062 L .146 .117 L -.049 .165 L .441 .178 L .082 -.055 L .098 -.343 L -.056 -.158 L -.334 -.014 L .197 -.295 L -.538 -.571 L .364 -.227 L .968 -.295 L .162 -.172 L .039 -.337 L .132 -.027 L .437 .151 L .682 -.26 L .145 .014 L .354 .129 L .483 .099 L .598 -.163 L .746 -.773 L 1.374 .341 L 1.019 .227 L 1.332 -.181 L .545 .2 L .055 .095 L .053 .093 L -.097 .581 L .155 .26 L .761 .547 L -.636 .291 L -.019 .367 L -.701 .054 L -.164 -.134 L -.325 0 L -.223 .197 L .452 .063 L .136 .196 L -.157 .206 L -.409 .062 L -.04 .375 L .204 .188 L -.154 .294 L -.346 .299 L -.693 .157 L .082 .393 L -.89 -.116 L -.298 .196 L -.85 -.08 L -.566 .107 L -.646 .5 L -.287 -.152 L -.612 .009 L -.179 -.107 L -1.04 -.065 L -.478 -.112 L -.894 -.082 L -1.311 -.247 L -.32 -.391 L -.318 -.096 L -.023 -.363 L -.856 .227 L -.301 -.103 L -.445 .11 L -.183 -.083 L -.366 .096 L -.329 .411 L -.597 -.034 L -.631 -.171 L .029 -.171 L -.215 -.117 L -.579 .332 L -.55 -.242 L -.008 -.144 L -.622 -.062 L .09 -.192 L -.214 -.288 L .266 -.274 L -.193 -.336 L +431.763 171.063 N -.067 .354 L .091 .72 L .108 .508 L .225 .168 L .562 .11 L .144 .183 L .077 .353 L -.089 1.116 L -.146 .227 L -.274 .171 L -.885 .217 L -.291 .256 L -.664 1.275 L -.503 1.203 L -.243 1.004 L -.354 .129 L -.369 .03 L -.129 .354 L -.146 1.229 L -.192 .312 L -.385 .045 L -.257 .284 L -.417 .836 L -.944 2.223 L -.304 .624 L -.352 .496 L -.368 .355 L -.239 .114 L -.145 -.056 L -.722 -.97 L -.145 -.14 L -1.104 -.05 L -.272 .03 L -1.31 1.265 L -.941 .839 L -.495 .526 L .02 .974 L -.189 .552 L -.376 .686 L -.188 -.119 L -.224 -.042 L -.176 -.127 L -.145 .212 L .144 .296 L -.063 .127 L -.353 .198 L -.56 .03 L -.977 .101 L -.607 -.267 L -.288 .043 L -.271 .368 L -.177 .113 L -.432 -.07 L -1.247 -.011 L -.528 -.225 L -.543 -.451 L -.416 -.72 L -.192 -.649 L .048 -.254 L .208 -.254 L -.144 -.296 L -.513 -.069 L -.128 -.254 L -.464 -.55 L -.561 -.465 L -.608 -.253 L -.641 -.253 L -.272 -.31 L -.513 .072 L -.24 .297 L -.336 .071 L -.881 .044 L -.659 .03 L -.006 -.234 L .121 -1.188 L -.217 -1.439 L .09 -.989 L .012 -.876 L -.003 -.48 L -.002 -.381 L .237 -.397 L .257 -.03 L .433 -.13 L .078 -.368 L -.116 -.592 L .095 -.34 L .656 -.414 L .223 -.298 L .19 -.566 L .316 -.962 L -.388 -.718 L -.164 -.762 L .062 -.777 L .092 -.961 L .158 -.849 L .353 -.482 L .687 -1.614 L .676 -.4 L 1.064 -.188 L 1.174 -.108 L 1.111 .121 L .821 .277 L 1.095 1.223 L .209 .098 L .37 -.002 L 1.337 -.544 L .467 -.116 L .354 .083 L 1.173 .742 L .965 .277 L .934 -.005 L .273 -.059 L .629 -.399 L .403 -.327 L .774 -.287 L .628 -.103 L .709 -.047 L .531 .04 L .884 .221 L .724 .193 L .609 .208 L .259 -.058 L .761 -.697 L .453 -.299 L .437 -.2 L .951 -.034 L .173 .394 L .575 .52 L .351 .407 L +425.506 195.522 N -1.965 -.017 L -1.005 .007 L .029 -.176 L -.208 -.536 L .271 -.989 L -.159 -.72 L -.191 -.522 L -.399 -.649 L .433 -.396 L -.287 -.367 L -.24 -.056 L -.576 .058 L -.559 -.268 L -.176 -.324 L -.063 -.537 L -.111 -.211 L -.527 -.14 L -.101 -.064 L .376 -.686 L .189 -.552 L -.02 -.974 L .495 -.526 L .941 -.839 L 1.31 -1.265 L .272 -.03 L 1.104 .05 L .145 .14 L .722 .97 L .145 .056 L .239 -.114 L .368 -.355 L .352 -.496 L .304 -.624 L .944 -2.223 L .417 -.836 L .257 -.284 L .385 -.045 L .192 -.312 L .146 -1.229 L .129 -.354 L .369 -.03 L .354 -.129 L .243 -1.004 L .503 -1.203 L .664 -1.275 L .291 -.256 L .885 -.217 L .274 -.171 L .146 -.227 L .089 -1.116 L -.077 -.353 L -.144 -.183 L -.562 -.11 L -.225 -.168 L -.108 -.508 L -.091 -.72 L .067 -.354 L .627 .109 L .208 .083 L .923 1.238 L .395 .887 L .119 1.2 L -.134 .651 L .169 1.228 L .205 .578 L .381 .633 L .208 .21 L .047 .127 L -.225 .143 L -.674 .032 L -1.187 -.191 L -.481 -.082 L -.24 .1 L -.29 .312 L -.323 .539 L 1.088 1.067 L 1.343 1.179 L .638 1.07 L .382 1.057 L .208 .183 L -.208 .114 L -.354 .327 L -.866 1.743 L -.4 .511 L -.528 .399 L -.144 .198 L -.064 .424 L .112 .776 L .273 1.185 L .207 .592 L .4 .661 L .432 .605 L .064 .791 L .112 .324 L 1.217 1.236 L .498 .802 L .194 .804 L .209 .451 L -.159 .185 L .1 .861 L -.271 .086 L -.863 -.292 L -.864 -.334 L -.576 -.194 L -.56 -.124 L -.479 -.04 L -.271 -.055 L -.878 .076 L -.863 -.023 L -.56 -.109 L -1.022 -.149 L -.831 -.038 L -1.773 -.088 L -.88 -.093 L -.045 .495 L +551.793 147.278 N -.788 -.111 L -.458 -.253 L -.379 -.367 L -.248 -1.101 L -.112 -.141 L -.342 -.141 L -.662 -.083 L -.105 -.07 L -.014 -.268 L .116 -.466 L -.178 -.451 L -.418 -.38 L -.294 -.013 L -1.181 .412 L -1.229 .087 L -.81 .143 L -.947 .073 L -.415 -.083 L -.263 -.226 L -.135 -.197 L -.909 .143 L -.548 .382 L -.856 .016 L -1.264 -.011 L -.691 .128 L -.723 .115 L -.541 .03 L .182 -.954 L .049 -.354 L .31 -.792 L .285 -.383 L .794 -.47 L .697 -.258 L 1 -.077 L .209 -.072 L .188 -.255 L .036 -.974 L -.186 -.281 L -.652 -.053 L -.185 -.394 L -.111 -1.34 L -.168 -.38 L -.409 -.224 L -1.144 -.388 L -.695 -.391 L -.353 -.464 L -.71 -1.068 L -.802 -1.083 L .887 .32 L .63 .194 L 1.069 .248 L .854 .235 L .541 .039 L .742 .024 L 1.187 -.218 L .349 -.002 L 1.005 .135 L 1.234 -.12 L .964 -.175 L 1.183 -.19 L 1.066 -.274 L .247 -.156 L .069 -.184 L .099 -.903 L .232 -.876 L .188 -.34 L .412 -.369 L .597 -.441 L .283 -.072 L .644 .039 L .516 .082 L .254 -.086 L .321 -.693 L .362 -.271 L .559 -.243 L .562 .025 L 1.001 .375 L .237 -.086 L .34 -.383 L .021 -.084 L .139 -1.214 L .288 -.834 L .224 -.424 L .292 -.228 L .416 -.115 L .513 -.031 L .315 -.115 L .199 -.255 L -.088 -.437 L -.129 -.281 L 556.193 125 l -.35 -.336 L .355 -.129 L .997 .122 L .698 .039 L .513 -.215 L .289 -.255 L -.033 -.31 L -.223 -.478 L .13 -.283 L .4 -.341 L .524 -.355 L .324 -.426 L -.198 -.477 L .119 -.483 L -.232 -.171 L -.01 -.336 L -.411 -.271 L -.01 -.32 L .464 -.413 L .258 -.214 L .246 .023 L .559 -.395 L .272 -.19 L .53 -.292 L 1.148 -.152 L 1.345 -.012 L .647 .144 L .338 -.179 L .332 .005 L .455 -.297 L .358 -.004 L .148 -.142 L .313 .14 L .105 .112 L .281 -.21 L .296 .047 L .554 .117 L .004 .456 L .282 -.128 L .625 -.009 L .373 .323 L .213 .247 L .007 .501 L -.312 .516 L .301 .07 L .198 .218 L .252 .281 L .52 -.196 L .239 0 L .104 .199 L .178 .09 L .565 .436 L 1.337 .104 L .305 .111 L .147 .126 L -.207 .084 L -.688 .37 L -.411 .232 L -.155 .43 L -.071 .479 L -.234 .116 L -.125 -.179 L -.621 -.102 L -.438 .132 L -.271 .298 L -.262 -.116 L -.557 .265 L -.928 -.149 L -.568 -.138 L -1.708 -.325 L -.894 .265 L -.38 .611 L .09 .166 L .336 0 L .047 .314 L -.202 .149 L .101 .199 L .598 -.017 L -.002 .347 L -.384 .099 L -.139 .413 L .389 .232 L -.116 .479 L -.215 .132 L .089 .248 L .606 .298 L -.003 .532 L .782 -.003 L -.039 .43 L .188 .248 L .702 -.05 L .668 .377 L .012 .211 L -.2 .255 L -.504 .2 L -.643 .196 L -.517 .248 L .032 .366 L .188 .377 L -.237 .977 L -1.512 1.503 L .261 .38 L -.358 .281 L -.609 .133 L -.353 .467 L -.509 1.216 L -.478 .547 L -1.193 .496 L -.177 .364 L -.277 .481 L -.563 .61 L -.076 .38 L -.71 .259 L -.734 -.011 L -.895 .314 L -.361 -.094 L -.158 -.518 L -.207 -.132 L -.404 .083 L -.535 .463 L -.144 .446 L -.979 .893 L -.186 .543 L -.079 .269 L .116 .38 L .541 .163 L .504 .085 L .425 .014 L -.114 .689 L -.154 .735 L .412 .411 L .33 .099 L .537 -.099 L .112 .441 L .216 .507 L .654 1.333 L -.232 .149 L .241 .463 L -.317 .066 L -.15 .248 L -.55 .083 L -.145 -.335 L -.183 -.062 L -.78 .215 L -.2 .331 L -.735 -.099 L -.229 -.149 L -.835 -.021 L -.835 -.009 L -.259 -.052 L .015 .728 L -.866 .017 L -.296 .431 L -.37 .036 L +606.155 150.953 N -.037 -.466 L -.627 -2.479 L -.064 -.578 L -.4 .044 L -.281 .115 L -.395 1.159 L -.224 .354 L -.529 -.448 L -.249 -.267 L -.23 -.281 L -.001 -.381 L -.009 -.522 L .131 -.283 L .651 -.356 L .498 -.13 L .938 -.767 L .159 -.34 L .012 -.79 L -.057 -.127 L -.111 -.098 L -2.473 -.198 L -.559 .003 L -.916 .062 L -.547 -.053 L -.537 -.109 L -.095 -.099 L -.079 -.719 L -.053 -.479 L -.129 -.324 L -.417 -.054 L -.489 .06 L -.372 -.266 L -.339 -.266 L -1.252 -.303 L -.234 .171 L -.555 .525 L -.124 .283 L .083 .155 L .494 .237 L 1.224 .938 L .126 .112 L -.047 .155 L -.382 .101 L -.502 .13 L -.4 .299 L -.548 .61 L .339 .323 L 1.042 .431 L .193 .21 L -.029 .269 L -.505 .765 L .04 .254 L .352 .45 L .325 1.409 L .402 1.775 L .147 .532 L -.172 .322 L .068 .183 L -.321 .071 L -.35 -.056 L -.148 -.706 L -.198 -.084 L -.253 .354 L -.171 .354 L -.172 .057 L -.115 -.099 L -.28 -.592 L -.152 -.169 L -.412 .537 L -.504 .298 L -.992 .397 L -.571 .213 L -.264 .226 L -.05 .113 L .106 .579 L .183 .409 L -.336 .495 L -.305 .332 L -.013 .257 L -.548 .415 L -.593 .467 L -.467 .185 L -.432 .057 L -.746 .206 L -.591 .362 L -.459 .58 L -.551 .552 L -.88 1.061 L -.611 .552 L -.673 .276 L -.675 .829 L -.676 .467 L -.728 .368 L -.452 .241 L -.427 .312 L -.192 .509 L -.073 .466 L -.341 .41 L -.649 .298 L -.428 .058 L -.506 -.098 L -.258 .269 L -.366 .887 L -.277 .23 L -.505 -.253 L -.614 .142 L -.354 .283 L -.304 .565 L -.165 .48 L -.005 .508 L .166 1.539 L .018 .805 L -.208 .495 L .227 .324 L .315 .423 L -.015 .508 L -.199 .607 L -.669 1.611 L -.341 .834 L -.13 .636 L .047 .649 L .21 1.764 L -.081 .24 L -.643 .001 L -.433 -.013 L -.186 .142 L -.334 .961 L -.324 .594 L .025 .127 L .493 .352 L -.805 .327 L -.306 .015 L -.77 .284 L -.295 .41 L -.101 .692 L -.157 .255 L -.367 .283 L -.526 .255 L -.099 .057 L -.066 .042 L -.231 .156 L -.145 0 L -.174 -.056 L -1.417 -1.451 L -.092 -.395 L -.276 -.522 L -.34 -1.397 L -.689 -1.792 L -.94 -1.933 L -.979 -1.508 L -.554 -1.722 L -.507 -1.792 L -.738 -1.636 L -.82 -1.42 L -.424 -.737 L -.598 -1.439 L -.363 -1.157 L -.767 -3.274 L -.469 -2.695 L -.157 -1.566 L -.051 -.24 L .232 -.565 L .546 -.834 L .007 -.311 L -.404 -.281 L -.367 -.437 L -.113 -.635 L -.108 -.917 L .065 -.622 L -.837 .03 L -.19 .212 L -.235 .424 L .009 .183 L .276 .254 L .074 .183 L -.073 .438 L -.301 .438 L -.503 .368 L -.812 .369 L -.504 .114 L -.617 .255 L -.377 .015 L -.861 -.281 L -.572 -.38 L -1.018 -1 L -1.391 -1.268 L -.516 -.705 L .267 -.043 L 1.062 .125 L .615 -.086 L .443 -.142 L .461 -.283 L .521 -.608 L -.067 -.24 L -.156 .071 L -.587 .114 L -.847 -.026 L -.607 -.112 L -.632 -.132 L -.5 -.218 L -.203 -.07 L -.929 -.661 L -.668 -.775 L -.057 -.197 L .37 -.036 L .296 -.431 L .866 -.017 L -.015 -.728 L .259 .052 L .835 .009 L .835 .021 L .229 .149 L .735 .099 L .2 -.331 L .78 -.215 L .183 .062 L .145 .335 L .55 -.083 L .15 -.248 L .317 -.066 L -.241 -.463 L .232 -.149 L -.654 -1.333 L -.216 -.507 L -.112 -.441 L 557 143.058 l -.33 -.099 L -.412 -.411 L .154 -.735 L .114 -.689 L -.425 -.014 L -.504 -.085 L -.541 -.163 L -.116 -.38 L .079 -.269 L .186 -.543 L .979 -.893 L .144 -.446 L .535 -.463 L .404 -.083 L .207 .132 L .158 .518 L .361 .094 L .895 -.314 L .734 .011 L .71 -.259 L .076 -.38 L .563 -.61 L .277 -.481 L .177 -.364 L 1.193 -.496 L .478 -.547 L .509 -1.216 L .353 -.467 L .609 -.133 L .358 -.281 L -.261 -.38 L 1.512 -1.503 L .237 -.977 L -.188 -.377 L -.032 -.366 L .517 -.248 L .643 -.196 L .504 -.2 L .2 -.255 L -.012 -.211 L -.668 -.377 L -.702 .05 L -.188 -.248 L .039 -.43 L -.782 .003 L .003 -.532 L -.606 -.298 L -.089 -.248 L .215 -.132 L .116 -.479 L -.389 -.232 L .139 -.413 L .384 -.099 L .002 -.347 L -.598 .017 L -.101 -.199 L .202 -.149 L -.047 -.314 L -.336 0 L -.09 -.166 L .38 -.611 L .894 -.265 L 1.708 .325 L .568 .138 L .928 .149 L .557 -.265 L .262 .116 L .271 -.298 L .438 -.132 L .621 .102 L .125 .179 L .234 -.116 L .071 -.479 L .155 -.43 L .411 -.232 L .688 -.37 L .207 -.084 L .502 -.152 L 0 .515 L .441 1.03 L .221 .515 L .81 .11 L .441 .405 L .221 .258 L -.331 .221 L -.184 .184 L .073 .589 L .037 .552 L .294 .221 L .718 .096 L .092 .078 L .044 .182 L .68 .099 L -.104 .414 L .367 .694 L -.578 .364 L -.376 .281 L -.368 .049 L -.337 -.264 L -.033 -.364 L -.785 .198 L .157 .694 L .579 .595 L -.104 .446 L .272 .364 L -.215 .215 L .099 .43 L .198 .066 L .477 -.314 L .383 .248 L .772 .843 L .363 -.116 L 1.078 .579 L -.116 .364 L .756 .248 L .154 -.066 L .859 .596 L -1.07 .909 L -.281 .116 L .008 .364 L -.221 .265 L .04 .396 L -.309 .397 L -.218 .43 L .039 .248 L .63 .38 L .466 -.083 L .665 .479 L .704 .149 L .305 .529 L 1.242 .678 L .231 -.166 L 1.027 .595 L .538 -.066 L .182 .397 L .835 .166 L .304 .198 L .15 -.066 L .087 -.215 L .503 0 L .482 .265 L .582 -.347 L .494 .298 L .643 .066 L .142 .231 L -.101 .446 L .663 .149 L .286 .281 L .618 .265 L .584 -.281 L .313 .066 L -.034 .331 L .312 .248 L .379 -.231 L .721 .148 L .847 .364 L .606 -.297 L .268 .364 L .399 .116 L .357 -.132 L .271 .083 L .687 -.132 L .336 .05 L .311 -.694 L -.429 -.827 L .07 -.876 L .318 -.761 L -.037 -.022 L .345 -.129 L .471 -.102 L .231 .069 L .139 .183 L -.052 .861 L .212 .662 L -.092 .113 L .235 .493 L .637 .18 L .559 .081 L .869 .214 L .085 .021 L .544 -.074 L .531 -.313 L .301 .055 L .335 .125 L 1.238 .063 L 1.036 -.062 L .624 -.06 L .217 -.58 L -.017 -.282 L -.258 -.238 L -.313 -.069 L -.326 -.294 L -.042 -.24 L .07 -.156 L .189 -.1 L .784 -.033 L .714 -.216 L .397 -.27 L 1.123 -1.107 L .543 -.37 L .829 -.258 L 1.105 -.726 L .546 -.299 L .355 -.087 L .286 .167 L .975 .319 L .377 -.044 L 1.377 -.84 L .455 .392 L .716 .715 L .046 .38 L -.354 .454 L -.138 .269 L .102 .056 L .3 .055 L .657 .081 L .73 .179 L .624 .081 L -.018 .508 L -.112 .24 L -.596 .582 L -.072 .283 L .184 .718 L -.295 .058 L -.853 -.221 L -.558 -.082 L -.312 .129 L -.719 .512 L -1.446 .883 L -.197 .354 L .057 .761 L -.136 .382 L -.938 1.134 L -.045 .212 L .192 .408 L 0 .324 L -1.148 2.25 L -.17 .128 L -.309 -.013 L -.391 -.11 L -.811 -.32 L -.133 .283 L .146 1.594 L -.191 .354 L -.401 .144 L -.228 .185 L .152 .93 L -.015 .678 L -.273 .368 L -.25 .129 L -.255 -.14 L -.595 -.152 L +478.516 135.173 N .052 -.292 L -.049 -.169 L -.197 -.107 L .107 -.175 L .292 -.919 L -.015 -.818 L .517 -1.09 L .3 -.891 L -.004 -.409 L .133 -.283 L .07 -.749 L .033 -.847 L .062 -.174 L .026 -.278 L -.065 -.411 L .037 -.119 L .102 -.063 L 1.902 1.034 L .365 .167 L .253 -.016 L 1.139 -.656 L 2.96 -1.541 L .161 -.071 L .87 1.632 L .311 .69 L .093 .056 L -.46 .44 L -.257 .171 L -.97 .26 L -2.586 .622 L -.646 .229 L 1.146 1.32 L .698 .885 L -.765 .724 L -.456 .37 L -.24 .072 L -1.249 .332 L -.462 .61 L -.975 .782 L -2.079 -.299 L -.154 -.017 L +456.028 151.46 N -.021 1.003 L .033 3.078 L -.088 .17 L -1.561 -.019 L -.52 -.011 L -.073 1.13 L -1.981 -.963 L -5.577 -2.792 L -4.941 -2.372 L -5.231 -2.554 L -.41 .059 L -1.818 .858 L -1.519 .729 L -.231 .157 L -1.192 -.911 L -.258 -.182 L -1.008 -.333 L -1.646 -.442 L -.832 -.137 L -.098 -.07 L -.86 -1.506 L -.178 -.168 L -1.028 -.347 L -.702 -.165 L -.544 .201 L -.244 -.154 L -.562 -.873 L -.249 -.917 L -1.272 -1.702 L .152 -.283 L .249 -.128 L .666 -.47 L .086 -.17 L .061 -.664 L -.457 -1.156 L .158 -.495 L .16 -.622 L -.101 -.748 L .1 -.862 L -.052 -.691 L -.147 -.833 L -.88 -1.605 L .241 -.383 L .204 -.156 L .22 -.143 L .864 -.598 L .155 -.227 L .147 -.537 L -.274 -.973 L .126 -.354 L 1.473 -1.138 L .579 -.314 L .802 -.428 L .093 -.269 L -.064 -.564 L .093 -.981 L 1.436 .59 L .995 .309 L .521 .013 L .863 -.129 L .604 .027 L 1.552 .223 L .614 .479 L .794 .224 L .486 -.001 L .342 .197 L .173 .226 L .26 .819 L .39 .564 L .688 .591 L .378 .126 L .678 .14 L 1.031 .083 L .447 .07 L .973 .224 L .639 .224 L .552 .281 L 1.289 .788 L .84 .464 L .465 .013 L .441 -.128 L .758 -.411 L .706 -.623 L .3 -.523 L 0 -.254 L -.276 -.621 L -.112 -.579 L .044 -.41 L .237 -.537 L .661 -.58 L .333 -.198 L .554 -.241 L .644 -.298 L 1.376 -.413 L 1.205 .054 L .728 .154 L .844 .365 L .188 .169 L .043 .508 L .281 .253 L .301 .014 L .945 .125 L .712 .309 L .45 .027 L 1.286 .04 L .302 .197 L .068 .381 L .276 .296 L -.099 .208 L -.369 .228 L -.21 .34 L .354 1.283 L -.231 .425 L -.322 .553 L -.056 .311 L .185 .945 L .388 .916 L .042 .367 L -.015 .988 L -.019 3.869 L -.016 1.468 L -.008 2.048 L -.001 .692 L .045 2.81 L -.021 1.342 L .011 2.612 L +478.212 134.714 N -.834 -1.746 L -.796 -1.944 L -.124 -.289 L .109 -.066 L .679 -.851 L .219 -.438 L .183 -.507 L .171 -.566 L .188 -.822 L .116 .018 L .137 -.093 L .006 -.204 L .028 -.315 L .372 -.051 L .151 .022 L .07 .099 L .355 -.07 L .009 -.167 L .067 -.193 L .088 -.041 L .07 .023 L .183 .346 L .201 .128 L .021 .183 L -.047 .122 L .082 .085 L -.102 .063 L -.037 .119 L .065 .411 L -.026 .278 L -.062 .174 L -.033 .847 L -.07 .749 L -.133 .283 L .004 .409 L -.3 .891 L -.517 1.09 L .015 .818 L -.292 .919 L -.107 .175 L -.067 .068 L -.042 .042 L +495.751 163.817 N -.03 -.184 L -.112 -.537 L -.508 -.945 L -.73 -.987 L -.438 -.493 L -.846 -.69 L -.51 -.875 L -.814 -1.876 L -.474 -.889 L -.28 -.409 L -.794 -.507 L -1.271 -.689 L -.527 -.634 L -.8 -1.17 L -.081 -.96 L -.061 -.776 L -.002 -.89 L -.104 -.381 L -.312 -.663 L -.944 -1.65 L -.357 -.494 L -.758 -.62 L -.459 -.225 L -.499 -.126 L -.308 -.282 L -.483 -.578 L .149 -.692 L -.111 -.437 L -.474 -.818 L -.747 -1.072 L -.793 -.902 L -1.069 -1.494 L -.525 -.931 L -.352 -.479 L -.722 -.761 L -.524 -.056 L -.248 0 L .077 -.296 L .193 -.283 L .311 -1.314 L .104 -.583 L .154 .017 L 2.079 .299 L .975 -.782 L .462 -.61 L 1.249 -.332 L .24 -.072 L .456 -.37 L .765 -.724 L -.698 -.885 L -1.146 -1.32 L .646 -.229 L 2.586 -.622 L .97 -.26 L .257 -.171 L .46 -.44 L .093 .056 L 1.129 .459 L .757 .222 L 2.034 .934 L 1.14 .473 L 2.44 1.101 L .258 .196 L .399 .633 L .141 .07 L .973 -.048 L .135 .366 L -.118 .396 L .047 .818 L .118 .253 L .812 .277 L 1.557 .697 L 4.048 .132 L 1.657 .259 L .408 .054 L .334 .619 L .185 .239 L 1.07 .05 L .644 -.044 L .043 .121 L .277 .648 L .365 .494 L .178 .663 L .052 .113 L .615 -.029 L .248 .126 L -.204 .237 L .194 .187 L .184 .282 L .234 .067 L .234 .27 L .886 .168 L .423 .437 L -.07 .28 L -.235 .035 L -.111 .25 L .316 .381 L -.188 .593 L -.122 .198 L .165 .268 L .302 .666 L .149 -.117 L .372 .282 L .105 .616 L .422 .696 L -.028 .423 L .222 .268 L .16 .197 L .287 .084 L .136 -.007 L .336 .083 L 1.043 2.198 L .548 1.154 L .261 .902 L 3.362 .375 L 3.387 .446 L .839 .108 L .584 -.469 L .152 -.057 L .581 .914 L .155 1.453 L -5.346 2.982 L -2.35 1.213 L -1.691 .815 L -.169 .085 L -1.148 .346 L -3.097 1.035 L -4.618 1.566 L -.484 .229 L -.041 .127 L -.383 .397 L -1.907 2.271 L -2.042 2.667 L -1.302 -2.703 L -1.211 -2.45 L -.452 -.012 L -.715 .047 L -.446 -.125 L -.671 -.151 L -.216 .1 L -.174 .185 L -.11 .495 L .041 .678 L -.113 .565 L -.692 .563 L +476.458 130.735 N .124 .289 L .796 1.944 L .834 1.746 L -.38 .381 L -.479 1.145 L -.334 1.413 L -.171 .593 L -.18 .156 L -.407 -.07 L -.448 -.521 L -.782 -.676 L -.386 -.494 L -.338 -.988 L -.521 -.45 L -.289 -.621 L -.17 -.479 L -.198 -.353 L -.466 .17 L -.267 .523 L .604 1.34 L .131 .381 L .634 .86 L .933 1.042 L .473 1.199 L .526 .973 L .277 .818 L .391 .465 L .912 1.735 L 1.072 1.904 L .428 .705 L .586 .549 L .451 .352 L .151 .183 L -.241 .17 L -.285 .1 L -.043 .155 L .238 1.087 L .252 .467 L .127 .238 L .812 .591 L .397 .168 L .406 .521 L .416 .38 L .311 .56 L -10.382 -.006 L -2.138 -.001 L -2.774 .002 L -2.513 .015 L -2.268 -.029 L -1.664 .01 L -1.241 .007 L -1.614 -.019 L -.914 .005 L -.819 .089 L -.011 -2.612 L .021 -1.342 L -.045 -2.81 L .001 -.692 L .008 -2.048 L .016 -1.468 L .019 -3.869 L .015 -.988 L -.042 -.367 L -.388 -.916 L -.185 -.945 L .056 -.311 L .322 -.553 L .231 -.425 L -.354 -1.283 L .21 -.34 L .369 -.228 L .099 -.208 L .337 .168 L .553 -.015 L .628 -.1 L .786 -.001 L 1.513 .293 L .587 .115 L .779 .122 L .721 .154 L .348 .409 L .4 0 L .928 .083 L .998 .394 L .628 .069 L .245 -.127 L .72 -.538 L .925 -.397 L .837 -.186 L .78 -.27 L .375 -.072 L .346 .056 L .535 -.001 L .723 .126 L .202 .465 L .596 .366 L .518 -.156 L .64 .267 L .382 .027 L .561 -.401 L .241 .179 L .277 .056 L .674 .13 L .338 -.062 L .46 -.165 L .51 -.308 L +580.625 132.873 N .24 .43 L .299 .05 L .276 -.314 L .134 -.513 L .275 .066 L .186 -.182 L 1.079 .199 L .132 .612 L .867 .264 L .726 .595 L .472 .215 L .15 -.132 L .454 .281 L .657 .794 L .158 -.166 L .71 -.116 L .289 .166 L .178 .38 L -.069 .281 L 1.451 .893 L .333 -.248 L .326 .017 L -.175 .396 L .014 .265 L .935 .066 L .365 -.066 L .54 .496 L .141 .463 L .237 -.099 L -.01 -.364 L .685 .38 L .271 -.083 L .08 -.331 L .407 0 L .63 .281 L .319 .364 L .849 -.066 L .341 .116 L .339 -.281 L .655 .159 L .037 .022 L -.318 .761 L -.07 .876 L .429 .827 L -.311 .694 L -.336 -.05 L -.687 .132 L -.271 -.083 L -.357 .132 L -.399 -.116 L -.268 -.364 L -.606 .297 L -.847 -.364 L -.721 -.148 L -.379 .231 L -.312 -.248 L .034 -.331 L -.313 -.066 L -.584 .281 L -.618 -.265 L -.286 -.281 L -.663 -.149 L .101 -.446 L -.142 -.231 L -.643 -.066 L -.494 -.298 L -.582 .347 L -.482 -.265 L -.503 0 L -.087 .215 L -.15 .066 L -.304 -.198 L -.835 -.166 L -.182 -.397 L -.538 .066 L -1.027 -.595 L -.231 .166 L -1.242 -.678 L -.305 -.529 L -.704 -.149 L -.665 -.479 L -.466 .083 L -.63 -.38 L -.039 -.248 L .218 -.43 L .309 -.397 L -.04 -.396 L .221 -.265 L -.008 -.364 L .281 -.116 L 1.07 -.909 L +374.125 167.166 N -1.41 -.924 L -.661 -.604 L -.537 -.788 L -.292 -.662 L -.15 -.183 L -.312 -.154 L -.567 -.053 L -.655 -.307 L -.695 -.561 L -.604 -.194 L -.567 -.025 L -1.209 .12 L -1.821 .194 L -.523 .417 L .06 -.502 L .563 -1.301 L .188 -.819 L .13 -1.13 L -.162 -1.101 L -.3 -.791 L -.624 -.747 L .267 -.283 L .182 -.424 L .067 -.975 L -.065 -.537 L -.174 -.353 L -.808 -.817 L -.297 -.112 L -.393 .438 L -.055 -.197 L -.013 -.381 L .08 -.689 L .474 .013 L 5.055 .056 L 2.396 .014 L .732 -.033 L .212 .027 L -.051 -1.102 L -.164 -1.539 L .01 -.707 L .249 -.383 L .575 -.427 L .726 -.315 L .809 -.287 L .144 -.128 L .099 -2.6 L .07 -2.261 L .047 -.509 L .557 -.074 L 6.005 .022 L .56 .011 L .104 -.396 L -.002 -.65 L .03 -1.752 L 2.829 1.509 L 4.12 2.42 L 1.414 .91 L -.523 .13 L -3.231 .089 L .049 .776 L .908 7.962 L .19 1.468 L .178 1.736 L .325 2.753 L .202 2.386 L .186 1.468 L .724 .787 L -.379 1.613 L -6.457 .01 L -1.953 .026 L -.945 .344 L -.387 .031 L -.485 -.054 L -.713 -.137 L -.535 -.124 L -.06 .212 L .055 .296 L -.107 .269 L -.454 -.082 L -.214 -.168 L -.568 -.83 L -.261 -.111 L -.402 .073 L -.252 .256 L -.181 .552 L -.018 .607 L -.332 .284 L +476.114 191.139 N -.563 .54 L -.626 .314 L -.367 .016 L -.303 -.196 L -.303 -.097 L -.88 .132 L -.881 .33 L -.911 .048 L -.942 -.234 L -.495 -.011 L -.464 .087 L -.496 .229 L -1.288 -1.32 L -1.032 -.926 L -.207 -.083 L -.258 .157 L -.436 .582 L -.16 .1 L -.684 -.631 L -.384 -.012 L -.529 .37 L -.258 .242 L -.352 .016 L -.366 -.195 L -.525 -.477 L -.348 -.493 L -.795 -.772 L -.143 -.239 L -.031 -.07 L .083 -.679 L -.157 -.352 L -.558 -.477 L -.814 -.165 L -.367 -.224 L -.285 -.436 L -.059 -.72 L -.206 -.366 L -.207 -.168 L -.717 -.434 L -.558 -.378 L -.445 -.351 L -.173 -.395 L .148 -.481 L -.223 -.267 L -.351 -.196 L -.799 -.235 L -.797 -.447 L -.223 -.225 L -.252 -.493 L -.207 -.126 L -.272 .001 L -.802 .019 L -.158 -.211 L -.01 -.664 L .416 -1.472 L -.122 -.536 L -.347 -.549 L -1.342 -1.673 L .15 -.425 L -.026 -.367 L -.266 -.465 L -.444 -.407 L -.155 -.295 L -.137 -.522 L -.221 -1.228 L -.141 -.225 L -.338 -.012 L -.517 .088 L -.219 -.352 L .316 -.609 L .542 -.596 L .087 -.34 L -.342 -.662 L .053 -.24 L .718 -.428 L .149 -.212 L -.131 -.677 L .122 -.438 L .583 -.809 L .417 -1.245 L .229 -.143 L 1.245 -.05 L .839 .009 L .04 -.283 L -.031 -1.229 L -.036 -1.002 L .038 -.749 L -.085 -2.5 L .036 -.636 L .016 -.946 L .02 -1.045 L .073 -1.13 L .52 .011 L 1.561 .019 L .088 -.17 L -.033 -3.078 L .021 -1.003 L .819 -.089 L .914 -.005 L 1.614 .019 L 1.241 -.007 L 1.664 -.01 L 2.268 .029 L 2.513 -.015 L 2.774 -.002 L 2.138 .001 L 10.382 .006 L .229 .414 L .499 1.115 L .281 3.501 L .319 1.637 L .182 .211 L .625 .394 L .595 .366 L .617 .507 L .491 .197 L .254 .223 L -.238 .199 L -.277 .327 L -.306 .566 L -.369 .242 L -.511 .172 L -.427 .116 L -.153 .142 L -.235 .496 L -.348 .171 L -.73 .033 L -.204 .552 L -.038 .452 L -.202 .862 L -.242 .722 L -.541 1.302 L -.068 .495 L .092 .903 L -.013 .679 L -.001 .083 L -.148 .947 L -.398 1.231 L -.214 1.061 L -1.04 .331 L -.414 .37 L -.693 1.134 L -.154 .34 L -.191 1.088 L -.141 1.074 L -.197 .185 L -.274 .044 L -.431 -.096 L -.259 .072 L -.163 .114 L -.187 1.103 L -.115 .933 L -.2 1.272 L .039 .522 L -.229 1.159 L -.469 .299 L -.288 -.012 L -.928 -.122 L -.321 .03 L -.188 .806 L -.054 .466 L .094 .141 L .479 .11 L .734 .123 L .334 .167 L .805 .913 L 1.06 1.067 L .751 1.464 L .345 .732 L .348 .421 L .462 .28 L .415 .097 L .269 .309 L .117 .988 L -.034 .17 L -.018 .141 L -.079 -.028 L -.464 .017 L -1.009 .133 L -.832 .005 L -.671 -.052 L -.291 .327 L -.678 .795 L +518.402 163.079 N -.282 .097 L -.538 .27 L -.656 .566 L -.265 .297 L -.166 .508 L -.062 .41 L -.41 .326 L -1.418 .652 L -2.27 .641 L -1.285 .412 L -.843 .312 L -.356 .297 L -.473 .622 L -.436 .269 L -.506 .114 L -.593 -.069 L -.521 .072 L -.83 .439 L -.65 .396 L -.956 .397 L -.752 .199 L -1.16 .003 L -.562 -.013 L -.297 .128 L -.386 .312 L -.272 .297 L -.45 .312 L -.511 .241 L -.389 .043 L -.239 -.042 L -.535 .411 L -.839 .058 L -.494 -.112 L -.623 -.437 L -.17 -.155 L -.317 -.437 L -.084 -.254 L .18 -.721 L -.081 -.635 L -.312 -.507 L -.341 -1.171 L -.572 -1.919 L -.072 -.438 L .268 -.707 L -.124 -.748 L .692 -.563 L .113 -.565 L -.041 -.678 L .11 -.495 L .174 -.185 L .216 -.1 L .671 .151 L .446 .125 L .715 -.047 L .452 .012 L 1.211 2.45 L 1.302 2.703 L 2.042 -2.667 L 1.907 -2.271 L .383 -.397 L .041 -.127 L .484 -.229 L 4.618 -1.566 L 3.097 -1.035 L 1.148 -.346 L .169 -.085 L .092 .663 L .226 .634 L .604 .971 L .933 1.364 L .127 .253 L -.006 .296 L .483 .689 L .241 .306 L +494.64 172.627 N -.261 -.166 L -.476 -.633 L -.475 -.159 L -.437 -.911 L -1.267 -.792 L -.277 -.594 L -.673 -.673 L -.594 -.119 L -.871 -.554 L -.555 .079 L -.158 -.158 L -.237 .04 L -.277 -.198 L -.356 .159 L -.476 .079 L -.277 -.436 L -.158 .237 L -.436 .198 L -.792 .079 L -.554 -.594 L -.238 0 L -.396 -.317 L -.832 1.663 L -.436 -.871 L -.475 .079 L -.277 .356 L -.396 -.08 L -.349 .041 L .013 -.679 L -.092 -.903 L .068 -.495 L .541 -1.302 L .242 -.722 L .202 -.862 L .038 -.452 L .204 -.552 L .73 -.033 L .348 -.171 L .235 -.496 L .153 -.142 L .427 -.116 L .511 -.172 L .369 -.242 L .306 -.566 L .277 -.327 L .238 -.199 L .098 .129 L .718 2.102 L .442 1.623 L .689 1.919 L .618 .832 L .205 -.212 L -.072 -.479 L .093 -.226 L .31 .253 L .4 .677 L .384 .395 L .534 -.043 L .242 .014 L 1.338 1.282 L .809 .916 L .124 .099 L .706 .055 L .618 .874 L .021 .24 L -.025 .198 L .118 .212 L .507 .182 L .915 .869 L -.075 .094 L -.529 .78 L -.331 -.182 L -.396 -.125 L -.214 .114 L -.055 .085 L +370.147 172.035 N -2.301 -.043 L -1.045 .006 L -.505 .384 L -.51 .187 L -.74 -.024 L -.819 .047 L -.463 .139 L -.009 -.003 L -.278 -.226 L -.169 -.409 L .104 -.424 L -.095 -.55 L -.018 -.198 L .001 -.046 L 1.695 .014 L 0 -.434 L .155 0 L .341 -.016 L .186 -.077 L .248 .062 L .294 -.046 L .124 -.093 L .016 -.263 L .077 -.078 L .14 -.016 L .155 .155 L .232 .124 L .356 .108 L .046 .108 L .139 .047 L .217 -.031 L .263 .108 L .186 .17 L .434 0 L .186 -.108 L .263 -.108 L .279 0 L .108 -.124 L .016 -.124 L -.155 -.217 L -.202 -.077 L -.201 .031 L -.294 .093 L -.108 .093 L -.248 .062 L -.279 -.186 L -.031 -.186 L -.186 -.108 L -.17 -.015 L -.186 .124 L -.139 -.108 L -.108 -.217 L -.155 -.108 L -.201 .031 L -.17 -.062 L -.387 .17 L -.108 -.108 L -.155 .046 L -.202 .124 L -.093 .294 L -1.664 0 L -.007 -.067 L -.028 -.269 L -.377 -.268 L -.068 -.155 L -.057 -.367 L -.386 -.635 L -.399 -.494 L -.379 -.31 L -.472 -.183 L .54 -.34 L .723 -.75 L .588 -1.004 L .334 -.82 L .099 -.826 L .523 -.417 L 1.821 -.194 L 1.209 -.12 L .567 .025 L .604 .194 L .695 .561 L .655 .307 L .567 .053 L .312 .154 L .15 .183 L .292 .662 L .537 .788 L .661 .604 L 1.41 .924 L -.506 .399 L -.057 .339 L .251 1.1 L .144 .663 L .22 .479 L .181 .197 L .554 .322 L .265 .337 L .082 .833 L -.004 .565 L -.062 .142 L -.146 -.042 L -.963 .091 L -.658 .074 L -.725 -.081 L -.503 -.209 L -.795 -.32 L -1.255 -.021 L +495.973 175.881 N -.363 .807 L .083 .409 L .428 .732 L .587 .844 L .732 .801 L .596 .547 L .634 .321 L .54 .209 L 4.26 1.443 L 1.447 .472 L 1.875 -.04 L .236 .154 L -4.087 4.205 L -1.562 1.69 L -.813 .909 L -.8 .004 L -1.693 -.046 L -.626 .088 L -.562 .215 L -.388 .214 L -.502 .497 L -.294 .426 L -.337 .115 L -1.216 .078 L -.305 .101 L -.453 .511 L -1.103 -.106 L -.461 -.181 L -.46 -.336 L -.271 -.098 L -.852 .358 L -.675 .343 L -.258 .199 L -.71 .753 L -.16 .114 L -.847 -.094 L -.67 -.193 L -1.373 -.133 L -.335 -.041 L -2.353 -1.525 L -.604 -.293 L -.749 -.193 L -1.054 -.149 L -.319 -.069 L .018 -.141 L .034 -.17 L -.117 -.988 L -.269 -.309 L -.415 -.097 L -.462 -.28 L -.348 -.421 L -.345 -.732 L -.751 -1.464 L -1.06 -1.067 L -.805 -.913 L -.334 -.167 L -.734 -.123 L -.479 -.11 L -.094 -.141 L .054 -.466 L .188 -.806 L .321 -.03 L .928 .122 L .288 .012 L .469 -.299 L .229 -1.159 L -.039 -.522 L .2 -1.272 L .115 -.933 L .187 -1.103 L .163 -.114 L .259 -.072 L .431 .096 L .274 -.044 L .197 -.185 L .141 -1.074 L .191 -1.088 L .154 -.34 L .693 -1.134 L .414 -.37 L 1.04 -.331 L .214 -1.061 L .398 -1.231 L .148 -.947 L .001 -.083 L .349 -.041 L .396 .08 L .277 -.356 L .475 -.079 L .436 .871 L .832 -1.663 L .396 .317 L .238 0 L .554 .594 L .792 -.079 L .436 -.198 L .158 -.237 L .277 .436 L .476 -.079 L .356 -.159 L .277 .198 L .237 -.04 L .158 .158 L .555 -.079 L .871 .554 L .594 .119 L .673 .673 L .277 .594 L 1.267 .792 L .437 .911 L .475 .159 L .476 .633 L .261 .166 L -.594 .921 L -.488 .61 L -.105 .254 L -.029 .396 L .202 1.157 L .5 -.074 L .892 -.246 L .4 .04 L .556 .195 L +364.011 169.929 N 1.664 0 L .093 -.294 L .202 -.124 L .155 -.046 L .108 .108 L .387 -.17 L .17 .062 L .201 -.031 L .155 .108 L .108 .217 L .139 .108 L .186 -.124 L .17 .015 L .186 .108 L .031 .186 L .279 .186 L .248 -.062 L .108 -.093 L .294 -.093 L .201 -.031 L .202 .077 L .155 .217 L -.016 .124 L -.108 .124 L -.279 0 L -.263 .108 L -.186 .108 L -.434 0 L -.186 -.17 L -.263 -.108 L -.217 .031 L -.139 -.047 L -.046 -.108 L -.356 -.108 L -.232 -.124 L -.155 -.155 L -.14 .016 L -.077 .078 L -.016 .263 L -.124 .093 L -.294 .046 L -.248 -.062 L -.186 .077 L -.341 .016 L -.155 0 L 0 .434 L -1.695 -.014 L .019 -.477 L .173 -.198 L .434 -.058 L .093 -.155 L -.006 -.059 L +495.973 175.881 N -.556 -.195 L -.4 -.04 L -.892 .246 L -.5 .074 L -.202 -1.157 L .029 -.396 L .105 -.254 L .488 -.61 L .594 -.921 L .055 -.085 L .214 -.114 L .396 .125 L .331 .182 L .529 -.78 L .075 -.094 L .627 .596 L .285 .465 L .036 .282 L -.118 .113 L -.361 .185 L -.438 .1 L -.56 .312 L -.566 .467 L .253 .127 L .645 -.058 L .321 .013 L .434 .124 L -.114 .26 L -.37 .468 L -.34 .567 L +363.763 172.732 N .463 -.139 L .819 -.047 L .74 .024 L .51 -.187 L .505 -.384 L 1.045 -.006 L 2.301 .043 L -.111 .792 L .115 .847 L -.186 .312 L -.333 .186 L -.513 .031 L -.401 .017 L -.381 .186 L -.789 .64 L -.321 .372 L -.047 -.126 L -.192 0 L -.501 -.14 L -.165 -.254 L .121 -.41 L .33 -.438 L .253 -.212 L -.131 -.141 L -.372 -.112 L -.498 .015 L -.415 .17 L -.161 0 L -.616 -.281 L -.36 -.296 L -.069 -.24 L -.323 -.084 L -.316 -.137 L +383.005 177.596 N -.379 .397 L -.264 .623 L .214 .409 L .695 .405 L .197 .31 L -.125 .283 L -.332 .37 L .309 .351 L .648 .561 L .051 .226 L -.19 .143 L -.304 -.012 L -.548 -.223 L -.304 .03 L -.158 .199 L -.03 .127 L .296 .549 L .179 .21 L -.188 .354 L -.602 .554 L -.047 .099 L -.339 -.224 L -.337 -.097 L -.143 .086 L -.756 .922 L -.321 -.026 L -.404 -.322 L -.277 -.323 L .044 -.283 L -.009 -.65 L -.22 -.846 L -.165 -.366 L -.338 -.097 L -.528 .046 L -.367 .143 L -.252 .242 L -.193 .376 L -.26 -.656 L -.165 -1.369 L -.252 -.761 L -.475 -.619 L -.456 -.421 L -.42 -.224 L -.466 -.04 L -1.137 .148 L -.594 -.039 L -.238 .157 L -.643 .866 L -1.088 1.235 L .051 -.392 L -.312 -.55 L -.764 -.775 L -.122 -.649 L -.84 -.366 L -.908 -.563 L -.277 -.296 L .09 -.396 L -.053 -.311 L -.547 -.041 L -.323 -.098 L -.115 -.155 L .059 -.311 L -.038 -.1 L .321 -.372 L .789 -.64 L .381 -.186 L .401 -.017 L .513 -.031 L .333 -.186 L .186 -.312 L -.115 -.847 L .111 -.792 L 1.255 .021 L .795 .32 L .503 .209 L .725 .081 L .658 -.074 L .963 -.091 L .146 .042 L .113 .028 L .18 .183 L .882 .715 L .536 .265 L .252 -.256 L .475 -.413 L .338 .026 L .356 .153 L .565 .152 L .43 -.243 L .3 -.327 L .684 -.428 L .323 .055 L .246 .281 L .022 .339 L .271 .832 L .265 .451 L .474 .478 L .349 .718 L .194 1.143 L .559 .901 L +266.015 188.956 N .103 .169 L -.163 .326 L -.592 .385 L -1.74 .9 L -.807 .23 L -.557 .074 L -.465 -.054 L -.284 .115 L -.232 1.117 L -.348 .115 L -.628 -.618 L -.344 -.224 L -1.149 .035 L -.385 -.04 L -.896 -.461 L -.309 -.125 L -.159 .029 L -.041 .184 L .616 .688 L .391 .69 L .302 1.524 L .079 .55 L .166 .239 L .96 .051 L .434 .125 L .15 .253 L -.265 .27 L -.569 .272 L -.652 .131 L -.203 .199 L -.259 .666 L -.235 .213 L -.652 .173 L -.554 .286 L -.74 .654 L -.645 .739 L -.271 .016 L -.186 -.776 L -.083 -.183 L -.757 .697 L -.414 .073 L -.482 -.223 L -.694 -.546 L -.432 -.054 L -.199 -.437 L -.088 -.452 L -.161 -.861 L -.138 -.437 L -.148 -.168 L -.797 -1.182 L -.51 -.491 L .479 -.526 L .731 -.612 L -.121 -.282 L -.486 -.647 L -.256 -.437 L -.447 -.789 L -.162 -.804 L -.048 -.367 L -.035 -.438 L -.026 -.254 L .147 -.326 L .379 -.511 L .085 -1.004 L .409 -.525 L -.644 -.081 L -1.99 .224 L -.76 .174 L -.522 .13 L -.144 0 L -.554 -.576 L -.847 -.998 L -.188 -.253 L -.64 -.321 L -.521 -.181 L -1.167 .05 L -1.163 .12 L -.496 .017 L -.397 -.252 L -.429 -.548 L -.401 -.309 L -.099 -.353 L .226 -1.132 L -.103 -.395 L -.855 -1.45 L -.31 -.606 L -.384 .017 L -.234 .1 L -.402 -.025 L .709 -1.191 L .241 -.722 L .172 -.722 L .99 -1.758 L .381 -.059 L .227 .027 L .129 -.396 L -.048 -.497 L .056 -.288 L .414 -.2 L .534 -.156 L .84 -.171 L .128 .105 L -.9 .151 L -.731 .312 L -.145 .212 L .19 .607 L .142 .407 L .224 .126 L -.043 .145 L .153 .579 L -.135 .367 L -.327 .364 L -.348 .824 L -.137 .368 L .253 .479 L .288 .253 L .25 .72 L .341 .353 L .523 -.114 L .184 -.156 L .419 -.255 L .12 -.142 L .066 -.523 L -.167 -.649 L -.21 -.282 L -.438 -.804 L -.136 -.135 L -.118 -.395 L -.247 -.18 L .239 -.099 L .095 -.251 L -.204 -.144 L 1 -.379 L 1.085 -.327 L .998 -.272 L .086 -.225 L .69 -.086 L .143 -.008 L -.042 -.157 L -.055 -.198 L -.125 -.036 L -.039 -.108 L -.128 -.072 L -.226 .071 L -.156 .027 L -.229 -.012 L -.315 -.55 L .109 -.254 L .337 -.213 L .367 -.043 L .09 .112 L .14 .368 L .186 .162 L -.001 .148 L .026 .193 L .068 .09 L .004 .198 L .253 .258 L .329 -.02 L .699 .111 L .455 .07 L .593 .196 L .323 .254 L .393 .564 L .156 .635 L .358 .324 L .359 .084 L 1.02 -.129 L .928 -.059 L .59 -.058 L .799 -.059 L .714 .125 L .4 .479 L .267 .169 L .578 .253 L .49 .14 L 1.094 .04 L .382 -.057 L .388 -.227 L 1.042 -.807 L .47 -.185 L .453 .042 L .959 -.073 L 1.152 -.073 L .919 .055 L .248 .112 L -.056 .141 L -.294 .185 L -.854 -.041 L -.433 .015 L -.083 .212 L .059 .184 L .593 .253 L .609 .535 L .195 .649 L .246 -.523 L .185 -.142 L .415 .253 L .483 .027 L .374 .098 L .258 .338 L .918 .394 L .464 .295 L -.729 .496 L -.161 .65 L -.214 .226 L -1.055 .417 L .5 .064 L .598 .098 L .368 -.029 L .33 -.142 L .929 -.03 L .725 .083 L .84 .274 L .095 .296 L -.061 .41 L -1.655 1.239 L -.101 .255 L .074 .212 L .62 .604 L .141 .282 L -.308 .299 L -.41 .144 L -1.032 .19 L -.061 .452 L .008 .58 L -.395 .539 L -.071 .212 L .324 .521 L .732 .745 L .503 .647 L +493.044 204.258 N -1.223 -1.771 L -.027 -.932 L -.03 -1.43 L -.042 -2.045 L -.003 -1.017 L 0 -.438 L .016 -.848 L .004 -1.215 L .002 -.508 L 1.649 -2.467 L .453 -.511 L .305 -.101 L 1.216 -.078 L .337 -.115 L .294 -.426 L .502 -.497 L .388 -.214 L .562 -.215 L .626 -.088 L 1.693 .046 L .8 -.004 L .813 -.909 L 1.562 -1.69 L 4.087 -4.205 L -.236 -.154 L -1.875 .04 L -1.447 -.472 L -4.26 -1.443 L -.54 -.209 L -.634 -.321 L -.596 -.547 L -.732 -.801 L -.587 -.844 L -.428 -.732 L -.083 -.409 L .363 -.807 L .34 -.567 L .37 -.468 L .114 -.26 L .154 .044 L .935 1.142 L .586 .62 L .243 .381 L .265 .211 L .372 -.071 L .417 -.001 L .465 .027 L .372 -.071 L .572 -.27 L .836 -.425 L .585 -.157 L .397 .098 L .76 .267 L .549 -.072 L .56 -.326 L .779 -.566 L .247 -.127 L .447 .041 L .479 .098 L .419 -.043 L 1.195 -.482 L .288 .027 L .682 .196 L .74 -.03 L .764 -.185 L .964 -.327 L .9 -.666 L .47 -.382 L .604 .154 L .391 .211 L .08 .014 L .147 .268 L -.414 .919 L .021 .564 L .132 .621 L -.165 .452 L -.375 .509 L -.028 .678 L -.047 .833 L -.163 .509 L -1.264 2.262 L -.842 .792 L -.122 .311 L .102 .353 L -.893 1.569 L -.834 1.272 L -.214 .947 L -.351 .636 L -.712 1.117 L -.874 1.188 L -1.159 1.498 L -.384 .439 L -2.274 2.504 L -1.82 1.557 L -2.164 1.121 L -.593 .382 L -1.28 1.09 L -1.74 1.755 L -.06 .061 L -1.055 1.1 L -1.235 1.569 L -.615 .835 L .1 .353 L -.094 .276 L +264.768 176.039 N -.128 .225 L -.115 .067 L -.029 .135 L .039 .25 L -.058 .086 L .125 .376 L -.039 .424 L -.453 .154 L -.135 -.01 L -.144 .039 L -.482 -.039 L -.192 .039 L -.087 -.048 L -.356 0 L -.02 -.058 L .039 -.067 L .202 -.029 L .222 -.135 L .019 -.087 L .106 .02 L .154 .01 L .135 -.145 L -.096 -.279 L .048 -.125 L .029 -.183 L -.067 -.125 L -.097 -.135 L -.279 -.048 L .116 -.096 L .164 -.019 L .231 -.029 L .115 -.087 L .385 .02 L .106 -.039 L .299 -.067 L .244 .006 L +654.075 190.187 N .206 -.125 L .63 -.114 L .656 -.938 L .241 -.07 L -.069 .268 L .122 .087 L .187 -.046 L .11 .174 L .148 .444 L -.024 .111 L -.013 .247 L .197 .197 L .025 .086 L -1.234 .42 L -.383 .271 L -.309 -.271 L -.111 -.259 L -.234 .012 L -.062 -.37 L -.084 -.126 L +493.044 204.258 N -.602 .389 L -.557 .171 L -.385 -.112 L -.086 .777 L -.282 .367 L -.67 .115 L -.394 .382 L -.088 .48 L .006 .353 L -.356 .622 L -.964 1.358 L .092 .536 L -.337 .65 L -.25 .255 L -.334 .1 L -.084 .152 L -1.067 -.807 L -2.427 -1.752 L -.07 -.239 L .116 -.552 L -.137 -.381 L -3.553 -1.984 L -4.663 -2.568 L -1.448 .033 L 1.144 -2.479 L .105 -.229 L .656 -.835 L .985 -.938 L .477 -.525 L .43 -.695 L .143 -.566 L -.048 -.664 L -.223 -.606 L -.224 -.352 L -.732 -1.069 L -.174 -.465 L -.027 -.861 L -.126 -.226 L -.477 -.463 L -.3 -.493 L .678 -.795 L .291 -.327 L .671 .052 L .832 -.005 L 1.009 -.133 L .464 -.017 L .079 .028 L .319 .069 L 1.054 .149 L .749 .193 L .604 .293 L 2.353 1.525 L .335 .041 L 1.373 .133 L .67 .193 L .847 .094 L .16 -.114 L .71 -.753 L .258 -.199 L .675 -.343 L .852 -.358 L .271 .098 L .46 .336 L .461 .181 L 1.103 .106 L -1.649 2.467 L -.002 .508 L -.004 1.215 L -.016 .848 L 0 .438 L .003 1.017 L .042 2.045 L .03 1.43 L .027 .932 L 1.223 1.771 L +466.196 203.275 N .188 -.298 L .076 -.27 L -.057 -.748 L .025 -.734 L -.021 -.593 L .107 -.507 L .217 -1.02 L .395 -.681 L .255 -.284 L 1.241 -.996 L 1.195 -1.066 L .191 -.453 L -.111 -.31 L -.271 -.182 L -.479 -.04 L -.191 -.027 L -.128 -.253 L .26 -1.88 L .018 -.424 L -.159 -.183 L -.063 -.028 L .496 -.229 L .464 -.087 L .495 .011 L .942 .234 L .911 -.048 L .881 -.33 L .88 -.132 L .303 .097 L .303 .196 L .367 -.016 L .626 -.314 L .563 -.54 L .3 .493 L .477 .463 L .126 .226 L .027 .861 L .174 .465 L .732 1.069 L .224 .352 L .223 .606 L .048 .664 L -.143 .566 L -.43 .695 L -.477 .525 L -.985 .938 L -.656 .835 L -.105 .229 L -1.144 2.479 L -4.659 0 L -1.277 .05 L -.319 .017 L -.554 .398 L -.458 .427 L -.431 .045 L -.546 -.223 L -.064 -.042 L +713.621 206.298 N .169 7.966 L -.44 .822 L .431 1.368 L .046 .805 L -.031 3.438 L -.515 -.512 L -.927 -.888 L -.716 -.902 L -.406 -.056 L -.776 .101 L -.739 .143 L -.434 -.013 L .091 -.382 L .435 -.65 L .006 -.283 L -.561 -.521 L -.565 -.775 L .028 -.226 L .442 .111 L .236 -.042 L .135 -.113 L -.467 -.409 L -.595 -.408 L -.287 -.381 L -.275 -.648 L -1.053 -1.693 L -.508 -.394 L -.467 -.282 L -.604 -.196 L -1.983 -.603 L -1.26 -.379 L -.613 -.069 L -.705 -.238 L -.63 -.323 L .072 -.34 L -.098 -.268 L -.193 -.028 L -.617 .101 L -.389 -.07 L -.412 -.196 L -.408 -.395 L -.209 -.579 L .133 -.494 L -.155 -.226 L -.187 .113 L -.234 .396 L -.122 .664 L -.251 .608 L -.334 .269 L -.696 .354 L -.155 -.169 L -.331 -.677 L .022 -.155 L .384 -.27 L -.152 -.424 L -.173 -.239 L -.564 -.395 L -.707 -.394 L -.338 -.056 L -.059 -.212 L .038 -.226 L .413 -.044 L .388 .084 L .603 .239 L .158 -.029 L .368 -.34 L .525 -.41 L .146 .056 L .3 .269 L 1.021 -.045 L .139 -.128 L .09 -.522 L -.063 -.409 L -.238 .028 L -.345 .199 L -.604 .071 L -.656 -.041 L -.766 .044 L -1.026 -.082 L -.411 -.31 L -.135 -.197 L -.148 -.664 L -.202 -.338 L -.42 -.155 L -1.249 -.124 L .265 -.297 L .058 -.255 L .004 -.593 L .463 -.029 L .92 -.411 L .49 -.383 L .444 -.283 L .352 .027 L .4 .069 L 1.494 .646 L .515 .169 L .913 .153 L .382 .705 L .138 .396 L -.283 .749 L -.067 .381 L .221 .381 L .115 .494 L .115 .48 L .215 .521 L .186 .197 L .197 .127 L .226 -.65 L .085 .113 L .087 .141 L .309 1.073 L .169 .169 L .234 .183 L .294 .112 L .354 .056 L .58 -.198 L .504 -.439 L 1.192 -1.853 L .352 -.015 L 1.078 -.215 L .378 -.142 L .045 -.085 L .014 -.509 L .219 -.17 L 1.1 -.609 L .335 -.043 L 1.732 .759 L 2.129 .941 L 1.54 .52 L 1.299 .404 L h 691.208 208.707 m -.388 -.069 L -.693 -.38 L -.852 -.647 L -.295 -.141 L -.414 .028 L -.059 .1 L .024 .452 L -.206 .028 L -1.014 -.407 L -.258 -.353 L -.582 .199 L -.289 .269 L -.326 .185 L -.186 -.184 L -.312 -.451 L -.245 -.451 L .246 -.198 L .303 -.029 L .274 .056 L 1.104 .04 L .574 .31 L .319 -.015 L .544 -.326 L .414 -.015 L .534 .126 L .857 .21 L .499 .395 L .293 .395 L .179 .621 L -.049 .254 L h 682.045 208.699 m -.419 -.056 L -.715 -.493 L -.232 -.451 L .146 -.283 L .603 -.1 L .766 -.044 L .246 .126 L .256 .311 L .313 .197 L .108 .226 L -.067 .226 L -.125 .057 L -.879 .285 L h 707.635 219.095 m -1.11 -.209 L .589 -1.032 L .56 -.708 L .407 -.269 L .427 -.072 L .527 .338 L .198 .24 L -.11 .184 L -.324 .637 L -.256 .17 L -.638 .693 L -.27 .028 L h 673.797 218.703 m -.562 .257 L .034 .233 L -.886 .326 L -.582 .274 L -.339 -.041 L -.453 .325 L -.504 -.069 L -.427 -.112 L -.378 .255 L -.3 .058 L -.358 -.07 L -.58 -.196 L -1.046 -.04 L -.316 .043 L -.211 -.564 L .027 -.24 L .383 -.198 L .672 -.199 L .528 -.016 L 1.142 .407 L .445 .324 L .338 .013 L .326 -.297 L .464 -.016 L .429 -.071 L .414 .187 L .467 -.116 L -.072 -.222 L .421 -.187 L .404 -.233 L .094 -.151 L -.076 -.117 L -.184 .023 L .116 -.198 L .16 .012 L .22 .094 L .177 .221 L .013 .304 L h 662.661 219.065 m -.312 -.099 L -.203 -.127 L -.062 -.169 L .03 -.212 L .256 -.198 L .315 -.036 L .17 .092 L .053 .212 L .182 .098 L .305 -.145 L .34 .105 L .104 .151 L -.012 .451 L .183 -.148 L .163 -.304 L .318 -.029 L .229 .226 L .021 .424 L .181 -.036 L .062 .104 L -.025 .397 L -.316 -.211 L -.311 -.058 L -.141 .058 L .072 .155 L -.852 .157 L -.143 -.091 L .097 -.268 L -.085 -.059 L -.308 .269 L -.229 .256 L -.296 -.046 L -.63 .225 L -.624 .199 L -.357 -.051 L -.31 .123 L -.392 -.07 L -.103 -.07 L -.202 -.123 L -.063 -.279 L .143 -.261 L -.08 -.253 L .193 -.115 L .23 -.113 L .233 -.156 L .224 .07 L .61 .013 L .4 .104 L .089 .28 L .291 .109 L .294 .056 L .189 -.259 L .29 -.012 L .051 -.187 L -.263 -.15 L h 656.294 219.602 m -.393 -.282 L -.855 -.449 L -.118 -.269 L .417 -.001 L .514 -.185 L .462 -.029 L .925 .521 L -.338 .17 L -.232 .1 L -.381 .425 L h 631.053 200.125 m -.061 .225 L -.413 .439 L -.204 .41 L -.381 .354 L .164 .353 L .162 .169 L .806 .493 L .832 .055 L .241 .112 L .151 .381 L .128 .763 L -.007 .409 L .267 .423 L .212 .127 L .544 .041 L -.45 .933 L .151 .212 L .703 -.453 L .824 .252 L .177 .042 L .265 .254 L .144 .438 L .698 .676 L -.515 1.979 L -.04 .452 L .23 .946 L -.021 .438 L .021 .664 L -.002 .268 L -.149 1.06 L -.087 .156 L -.107 .07 L -.367 -.253 L -.381 -.522 L -.261 -.084 L -.262 .481 L -.081 .268 L -1.043 -.619 L -.219 .086 L .394 .747 L -.163 .213 L -.204 -.197 L -1.343 -1.424 L -.775 -.761 L -1.011 -.859 L -1.348 -.958 L -.391 -.451 L -.199 -.493 L -.191 -.339 L -1.003 -.633 L -.697 -.677 L -1.186 -1.509 L -.074 -.353 L .039 -.339 L -.324 -.875 L -.841 -1.467 L -.667 -1.044 L -.612 -.775 L -.369 -.301 L -.287 -.234 L -.64 -.295 L -.254 -.748 L -.688 -1.806 L .067 -.24 L -.107 -.311 L -.157 -.197 L -.662 -.507 L -.711 -.394 L -.539 -.21 L -.317 -.099 L -.119 -.353 L -.077 -.734 L -.18 -.409 L -.386 -.479 L -.818 -.831 L -.368 -.423 L -.725 .128 L -.613 -.676 L -.646 -.606 L -.593 -.69 L -.562 -.945 L -.229 -.635 L -.032 -.367 L .057 -.198 L .149 -.113 L .401 -.043 L .364 .098 L .25 .126 L .632 .563 L .361 .155 L .922 .153 L .335 .027 L .548 -.1 L .454 -.142 L .4 -.015 L .323 .31 L .919 1.156 L .513 .31 L .058 .155 L -.12 .537 L 1.066 .916 L .749 .493 L 1.175 .689 L .678 .323 L .139 .169 L .03 .593 L -.02 .155 L .573 .055 L .745 .944 L .612 .55 L .271 -.015 L .004 -.198 L -.123 -.226 L .069 -.24 L .507 .21 L .479 .804 L .441 .38 L .446 .056 L .429 .197 L .314 .366 L .28 .734 L .316 .437 L .431 .268 L .511 .126 L .767 .083 L .431 .154 L .494 .38 L .576 .606 L -.019 .071 L h 684.201 200.125 m -.007 -.172 L -.414 -1.058 L .18 -.551 L -.078 -.141 L -.141 -.296 L .036 -.325 L .286 -.89 L .514 -.82 L .263 .367 L .152 .353 L -.054 .283 L -.246 .396 L -.361 .763 L .061 .325 L .19 .141 L .097 -.141 L .436 -.411 L .135 -.522 L .179 -.142 L .806 -.412 L .141 .141 L -.052 .254 L .104 .55 L -.354 .212 L -.467 .354 L -.162 .311 L .159 .099 L .446 .126 L .398 .211 L -.016 .141 L .159 .353 L -.688 -.154 L -.431 -.154 L -.367 -.042 L -.304 .156 L -.08 .438 L .049 .258 L .131 .688 L .341 .62 L .405 .438 L .196 .282 L -.156 .212 L -.26 -.211 L -.664 -.648 L -.55 -.733 L -.002 -.396 L -.011 -.251 L h 637.361 207.144 m -.863 -.394 L -.377 -.239 L -.205 -.367 L -.045 -.367 L -.156 -.395 L -.507 -.395 L -.291 -.099 L -.446 .029 L -.116 -.141 L .271 -.65 L .234 -.24 L .509 .55 L .148 -.467 L .313 -.269 L .072 .395 L .312 .89 L .648 .817 L .698 .31 L -.265 .184 L -.118 .283 L .183 .564 L h 634.321 215.345 m -.091 -.187 L .316 -.023 L .402 .093 L .369 -.129 L .068 -.524 L .018 -.14 L .309 .057 L -.043 -.5 L .222 -.235 L .093 -.277 L .202 .121 L .631 .112 L .474 -.047 L .237 .443 L .524 -.089 L .158 -.297 L .022 -.244 L .259 .116 L .618 .168 L .411 .438 L .338 -.046 L .204 .271 L .446 -.029 L .453 -.185 L .302 .211 L .369 .522 L .179 .521 L .884 .041 L .462 .188 L .49 -.077 L 1.435 .124 L .479 -.029 L .34 -.17 L .213 -.65 L .271 -.269 L .447 -.015 L .223 .211 L .289 .494 L .633 .125 L .53 .027 L .774 .083 L .796 .153 L .289 .24 L .293 .288 L -.08 .445 L .275 .466 L .119 .099 L .877 .352 L .422 .069 L .658 .013 L .45 -.185 L .415 -.015 L .628 .238 L .048 .197 L -.255 .425 L -.152 .494 L .578 .776 L -.499 -.211 L -.802 -.196 L -.599 -.253 L -.891 -.309 L -.528 .001 L -.589 .256 L -.348 .057 L -.714 -.098 L -1.454 -.138 L -1.47 -.138 L -.805 -.253 L -.839 -.479 L -1.099 -.336 L -1.125 -.267 L -.948 -.04 L -.556 .298 L -.445 .043 L -.957 -.153 L -.805 -.492 L -.357 -.07 L -1.606 -.066 L -.363 -.155 L .055 -.141 L .448 -.468 L -.402 -.267 L -.551 -.099 L -.506 -.14 L -.307 -.027 L -1.261 -.121 L h 675.004 223.092 m .249 -.494 L .023 -.537 L .113 -.312 L .674 -.481 L 1.447 -.624 L .662 -.454 L .36 -.607 L .466 -.157 L 1.578 -.102 L .91 -.214 L .541 -.044 L .869 -.143 L .118 .07 L .099 .197 L -.237 .212 L -.36 .256 L -1.609 .61 L -1.369 .44 L -.713 .256 L -.606 .354 L -1.09 .963 L -.653 .481 L -.439 .086 L -.552 .228 L -.48 .015 L h 667.866 223.149 m -.217 -.069 L -.917 -.605 L -.8 -.45 L -.347 -.099 L -.493 -.126 L -.292 -.197 L .108 -.212 L .371 -.142 L .992 -.03 L .502 -.114 L .35 .296 L 1.147 .746 L .265 .381 L -.125 .325 L -.246 .24 L -.299 .057 L h 661.819 191.241 m -.041 .09 L .319 .691 L -.23 .142 L -.546 .043 L -.579 .086 L .198 .226 L .115 .296 L -.169 .226 L .216 .211 L .235 .112 L .546 .832 L .536 .747 L .043 .198 L -.338 .721 L .075 .226 L .406 .465 L .743 .45 L .6 .493 L .551 .761 L -.465 .17 L -.75 -.026 L -.797 -.238 L -.337 .1 L -.387 .467 L -.354 .918 L -.08 .476 L -.046 .272 L .132 .649 L .116 .424 L -.133 .848 L -.256 0 L -.466 -.154 L -1.037 .963 L -.433 .65 L -.751 .608 L .443 .381 L .06 .396 L .17 .296 L -.685 .058 L .452 .578 L .009 .212 L -.103 .227 L -.547 .665 L -.206 .396 L -.127 .354 L -.529 .594 L -1.294 .61 L -.607 .284 L -.292 .198 L -.194 -.311 L .024 -.424 L -.33 -.804 L -.306 -.381 L -.265 -.184 L -.286 .029 L -.503 .523 L -.302 .029 L -.328 -.508 L -.313 -.197 L -.437 -.112 L -.387 -.451 L -.342 -.154 L -.35 .806 L -.135 .198 L -.381 .058 L -.356 -.112 L -.442 .128 L -.318 .354 L -.364 .071 L -.059 -.551 L .034 -.311 L -.314 -1.03 L -.336 .396 L -1.42 .44 L -.321 -.408 L -.639 .015 L -.281 .156 L -.303 .029 L -.058 -.649 L -.022 -.65 L -.267 -1.411 L -.012 -.48 L -.352 -.747 L -.406 -.409 L -.79 -.422 L -.146 -.141 L .555 -.354 L -.531 -.38 L -.258 -.296 L .188 -.735 L -.074 -.128 L -.278 -.478 L -.352 -.296 L .065 -.466 L -.125 -.593 L .182 -.65 L .133 -.353 L .424 -.58 L .303 -.806 L .318 .028 L .204 .11 L .288 .792 L .253 .295 L 1 .983 L .304 .083 L .446 .28 L .928 -.416 L .255 -.001 L .526 .223 L .543 .11 L .399 -.172 L .528 -.342 L .403 -.525 L .531 -.441 L .479 -.074 L .431 .11 L .557 .251 L .524 .223 L .559 .152 L .287 -.03 L .467 -.356 L .465 -.172 L .864 -.175 L .387 -.299 L .928 -1.785 L -.076 -.748 L .218 -.34 L .646 -.244 L .22 -.383 L -.106 -.988 L .119 -.565 L .381 -.638 L .247 -.157 L .464 -.017 L .748 .081 L .651 .081 L .624 -.018 L .446 .04 L .753 .292 L .182 .09 L h 666.561 200.125 m .012 -.049 L .48 -1.188 L .434 -.41 L .289 -.142 L .429 .338 L .29 -.311 L .162 -.325 L .293 -.481 L .496 -.058 L .605 .14 L .729 .535 L .447 .027 L .863 -.044 L .478 .168 L .749 .267 L .577 -.227 L 1.853 .081 L .72 -.128 L .627 -.354 L .211 -.283 L -.156 -.268 L .196 -.283 L .388 -.241 L .295 -.41 L .289 -.057 L .075 .24 L -.073 .537 L -.117 .311 L -.081 .127 L -.082 .127 L -.969 1.259 L -.416 .396 L -.464 .1 L -1.23 .229 L -.495 -.069 L -.591 -.422 L -1.149 -.068 L -1.151 .059 L -.878 -.041 L -1.039 .045 L -.575 -.083 L -.671 .029 L -.415 .1 L -.433 .368 L -.259 .461 L -.154 .274 L -.187 .721 L .068 .48 L .263 .494 L .194 .183 L .403 .226 L .259 .196 L .221 .607 L .179 .154 L .226 .042 L .815 .026 L .249 -.269 L .652 -.976 L .385 .056 L .307 .183 L .496 .041 L .363 -.227 L .669 -.156 L .62 -.143 L .268 -.298 L .271 -.057 L .466 .196 L .131 .212 L -.083 .734 L -.469 -.267 L -.544 -.042 L -.361 .298 L -.389 .523 L -.438 .425 L -1.059 .439 L -.214 .325 L -.143 .029 L -.241 -.042 L -.468 -.126 L -.03 .056 L .025 .312 L .212 .126 L .676 .578 L .467 .521 L .854 1.24 L -.097 .325 L -.156 .679 L .102 .409 L .447 .535 L .555 .438 L .062 .226 L -.045 .282 L -.436 -.056 L -.652 .059 L -.412 .297 L -.224 .692 L -.498 -.026 L -.461 -.183 L -.107 -.17 L .052 -.649 L .204 -.58 L -.978 -.845 L -.417 -.31 L -.174 -.269 L .036 -.24 L .284 -.396 L .116 -.579 L -.165 -.494 L -.737 -.055 L -.503 .213 L -.494 .396 L .16 .353 L .143 .932 L -.068 .509 L -.236 1.145 L .363 .903 L -.01 .311 L -.377 .636 L -.019 .227 L .275 .564 L -.726 .171 L -.513 .241 L -.476 .071 L -.245 -.324 L -.16 -.522 L .156 -.325 L .181 -.466 L .069 -.876 L .06 -1.073 L -.125 -.509 L .029 -.339 L -.213 -.395 L -.311 -.127 L -.391 .171 L -.574 .029 L .011 -.41 L -.25 -1.284 L .131 -.311 L .491 -.524 L .469 -.777 L .161 -.48 L -.089 -.918 L -.006 -.254 L .087 -.452 L .339 -.721 L .447 -.058 L -.043 -.861 L .254 -1.053 L +341.05 41.069 N 2.084 .272 L .344 .361 L -.869 .174 L -.541 .139 L -1.678 .106 L -1.159 .037 L -.689 .156 L -.372 .224 L -.308 .6 L -.361 .376 L 1.05 .39 L .971 .168 L 2.117 .064 L .601 -.001 L 1.775 -.242 L 1.93 -.038 L .866 .135 L .933 .219 L .417 .135 L .284 -.018 L 1.001 -.002 L 1.277 .032 L .615 .05 L -1.277 .626 L -1.583 .457 L -1.976 .523 L -.556 -.016 L -.695 -.116 L -.951 .671 L -1.061 .503 L -1.246 .452 L -1.125 .296 L -.211 .056 L -2.212 .054 L -.525 .134 L -.502 .001 L -.982 .201 L -.665 .167 L -.528 .051 L -.946 -.413 L -.375 .05 L -.69 .913 L -.958 .118 L -.631 -.065 L -.743 -.197 L -.622 -.463 L -.854 -.43 L -.647 -.215 L -.109 0 L .008 .2 L .707 1.043 L -.192 .249 L -.319 .017 L -.69 .249 L -.84 .249 L -.573 .38 L -1 .906 L -.657 .657 L -1.051 .851 L -.776 .262 L -1.034 .083 L -1.023 -.275 L -.148 .554 L -.438 .569 L -.783 .277 L -.992 -.095 L -.616 .05 L -1.18 .439 L .942 -1.723 L -.121 .017 L -.795 -.015 L -1.055 -.177 L .26 .423 L -.026 .455 L -.386 .407 L -.794 .39 L -1.16 .164 L -.973 .002 L -1.255 .083 L .467 .403 L .212 .403 L -.09 .387 L -.379 .097 L -.321 -.063 L -.47 .033 L -1.792 -.157 L .517 .32 L .765 .462 L .295 .351 L -.01 .224 L -.26 .176 L -1.197 .034 L -1.051 .129 L .844 .413 L .47 .126 L .448 .222 L .389 .333 L -.554 .461 L -.285 .111 L -.599 -.094 L -.478 .096 L .345 .474 L -.009 .127 L 308.501 60 l -.486 -.125 L -.583 -.062 L .026 .158 L .255 .457 L -.101 .347 L -.288 0 L -.656 -.093 L -.089 -.016 L -.979 .112 L -1.081 .018 L .682 .487 L 1.108 .391 L .331 .204 L -.077 1.035 L -.382 .938 L -.427 .094 L -.815 -.061 L .489 .591 L -.016 .498 L .156 .233 L -.068 .373 L -.316 .062 L -.495 -.03 L -.771 .079 L .762 .386 L .427 .603 L -.117 .447 L -.287 .031 L -.967 -.26 L -1.052 -.508 L -.498 .294 L -.425 .602 L -.635 -.599 L .158 -.573 L -.387 -.201 L -1.124 -.184 L -.577 -.309 L .04 -.187 L .253 -.249 L .066 -.218 L -.325 -.28 L -.366 -.186 L -.668 .359 L -.276 .016 L -.3 .141 L -.444 -.046 L -.98 .064 L -.417 .017 L -.571 .296 L -.476 .28 L -.426 -.403 L -.104 -.357 L -.222 -.217 L -.513 -.233 L -.817 -.232 L -.772 -.389 L -.517 -.781 L .07 -.737 L -.199 -.156 L -.434 -.094 L -.467 .048 L -.97 -.266 L -.108 -.094 L -.138 -.236 L .14 -.457 L .459 -.395 L .071 -.269 L -.258 -.062 L -.551 -.031 L -.542 -.094 L -.278 -.221 L -.058 -.633 L -.458 -.126 L -.616 .049 L -.589 -.57 L .023 -.191 L .198 -.254 L .618 -.367 L 1.22 -.337 L .405 -.304 L .476 -.128 L .051 -.383 L -.277 -.287 L -.473 .097 L -.921 .082 L -.493 .097 L -.635 .416 L -.538 .129 L -.63 .304 L -.339 -.318 L .038 -.623 L -.114 -.784 L -.206 -.451 L .015 -.355 L -.243 -.323 L -.504 .082 L -.271 -.032 L -.666 -.355 L -.594 -.485 L -.013 -.357 L .842 -.538 L .265 .019 L -.556 -.189 L -1.083 .064 L -.103 -.284 L .383 -.176 L .677 -.03 L .586 -.052 L .456 -.087 L .322 -.672 L -1.208 -.047 L -.572 .05 L -.362 -.032 L -.29 -.163 L -.116 -.197 L .223 -.28 L .218 -.008 L .18 -.16 L .427 -.055 L -.375 -.188 L -.552 .073 L -.22 -.248 L .057 -.188 L .073 -.132 L .259 0 L .309 -.099 L .827 -.25 L 1.218 .081 L .854 .163 L .776 .032 L .378 .131 L .927 .146 L 1.027 .097 L -.031 -.363 L .299 -.545 L -.298 -.182 L -1.02 -.263 L -1.356 -.312 L -.903 -.164 L -1.592 -.33 L -.354 -.116 L .336 -.35 L .788 -.001 L 1.462 .363 L 1.034 .048 L .463 -.067 L .114 -.067 L .088 -.6 L .088 -.301 L .595 -.034 L .528 .116 L .227 -.101 L -.027 -.351 L -.195 -.184 L -.891 -.317 L .162 -.437 L .528 -.455 L -.258 -.286 L -1.21 -.167 L -1.154 .002 L -1.178 -.286 L -1.649 -.49 L -.78 -.101 L -.903 -.05 L -.76 -.34 L -.811 -.477 L .156 -.035 L .323 -.155 L .605 -.001 L .572 -.019 L 2.085 .305 L .716 .033 L 1.249 .306 L 1.451 .458 L .729 .169 L .056 -.307 L -.311 -.426 L -.86 -.546 L -.172 -.446 L -.603 -.446 L -.485 -.051 L -.677 -.24 L .361 -.277 L .542 -.139 L 285.644 41 l -.704 -.241 L -1.101 -.015 L -.625 -.086 L -1.132 -.327 L -.88 .608 L -.324 .156 L -.274 .294 L -.875 .243 L -1.402 -.066 L -1.031 -.343 L -.306 -.242 L -.027 -.294 L .438 -.313 L .293 -.645 L -.152 -1.259 L .582 -.054 L .691 .192 L .372 -.124 L .151 -.334 L -.383 -.369 L -.933 -.545 L -.452 -.141 L -.946 -.796 L -.895 -.925 L -1.105 -1.289 L -.578 -.485 L -1.855 -.379 L -.667 -.255 L -.291 -.202 L -.052 -.701 L -.904 -.406 L -.962 -.109 L -1.589 -.165 L -1.928 -.425 L -1.903 -.333 L -2.133 -.183 L -.997 -.054 L -1.632 -.035 L -.785 .189 L -1.043 .096 L -.806 .188 L -1.419 .152 L -1.228 -.166 L -1.46 -.296 L .319 .747 L -.051 .093 L -1.051 -.017 L -1.294 -.184 L -3.168 -.611 L 1.538 -.566 L .463 -.114 L -.092 -.226 L -.423 -.169 L -1.067 -.017 L -2.21 -.015 L -.812 -.074 L -.629 -.018 L -1.238 -.434 L -.87 -.208 L .587 -.306 L 1.257 -.041 L 3.036 .147 L 2.025 .034 L 1.343 .017 L 2.117 -.157 L 1.055 -.212 L .292 -.096 L .054 -.345 L -.627 -.287 L -.82 -.21 L -1.217 .156 L -1.11 .252 L -1.31 .021 L -1.138 -.113 L -.753 .078 L -.879 .098 L -.68 -.056 L -.857 -.19 L -.664 -.365 L -.816 -.191 L -.662 -.057 L -.726 .059 L -.486 -.076 L -1.416 -.481 L -.044 -.35 L .36 -.45 L .81 -.119 L 1.235 -.1 L 1.517 -.14 L 2.074 -.161 L 1.29 -.081 L .951 -.396 L 1.089 -.259 L .843 -.081 L 2.478 -.005 L 1.101 -.101 L 1.942 .036 L .402 -.139 L .31 -.199 L .609 -.16 L .202 -.658 L .276 -.501 L .116 -.101 L -.89 -.228 L -1.947 -.039 L -1.155 .194 L -.959 -.125 L -1.243 -.383 L .595 -.781 L 1.38 -.332 L 2.845 -.359 L 1.407 -.225 L 1.962 -.249 L 2.112 -.162 L 1.163 .087 L 1.213 -.07 L 1.319 -.07 L .345 -.181 L .011 -.226 L -.357 -.753 L -.022 -.208 L .522 -.14 L 1.886 -.05 L 1.526 .205 L 2.141 .41 L 1.296 .226 L .802 .181 L .823 -.275 L -1.657 -.525 L -.697 -.509 L .167 -.047 L 2.2 -.122 L 1.166 -.12 L 1.854 -.216 L 2.52 -.195 L .73 .069 L 1.064 .116 L .232 1.738 L .913 -.162 L .539 -.322 L .432 -1 L 1.003 .021 L 2.004 .323 L 1.858 .414 L 1.529 .25 L .205 -.3 L -.644 -.3 L -.816 -.537 L -.894 -.4 L .295 -.287 L .742 .022 L 1.758 .02 L 1.136 .212 L 2.754 .373 L 1.284 .279 L 2.109 .322 L 1.878 .274 L 1.872 .204 L .8 -.209 L .816 -1.483 L -.326 -.191 L -1.292 -.334 L -1.176 -.533 L .708 -.247 L 2.404 -.005 L 2.962 -.328 L 1.329 -.077 L 1.527 .17 L 2.221 .488 L 1.567 .167 L 2.005 .142 L .3 -.761 L -.3 -.472 L 2.646 -.206 L 2.021 -.08 L 2.589 .095 L 1.989 .146 L 1.886 -.18 L 2.367 -.207 L 2.043 -.005 L 1.859 .223 L 1.825 -.055 L 1.315 .072 L .619 .099 L .55 -.102 L 1.946 .146 L 1.707 .046 L 1.673 .096 L 2.438 .761 L 1.368 .241 L 1.345 -.076 L 1.118 .168 L 2.594 .237 L .445 .408 L -.304 .12 L -.492 .192 L -1.683 .146 L -2.303 .124 L -1.152 .121 L -1.233 .05 L -1.469 -.068 L -2.831 -.064 L -2.22 -.066 L -1.389 .168 L -1.614 .027 L -1.933 .027 L -1.16 .026 L -1.485 .168 L -.444 .118 L -1.322 .213 L -.335 .464 L .743 .251 L 2.551 -.281 L 1.367 -.072 L 3.912 .038 L 2.223 -.12 L 2.331 -.005 L .997 -.025 L .93 .067 L 1.77 .434 L .671 .09 L 1.087 -.186 L 1.663 -.21 L 1.536 -.281 L 1.964 -.144 L .59 .462 L -.566 .482 L -2.316 .639 L -.973 .338 L -1.281 .734 L .12 .307 L .319 .152 L .796 -.089 L .477 -.044 L 1.616 -.553 L 1.766 -.537 L 1.413 -.385 L 1.706 -.32 L .775 -.207 L 1.662 -.163 L 1.618 .111 L 1.391 .065 L 1.497 -.3 L .703 -.324 L 1.129 -.234 L 2.148 -.004 L 1.672 .112 L 1.097 .044 L 1.197 .136 L 1.135 .228 L 1.107 .112 L .316 .25 L -.181 .273 L -1.97 .252 L -1.491 .138 L -1.245 .494 L -.557 .289 L -1.604 .355 L -1.57 .548 L -1.063 .089 L -.918 -.042 L -1.592 .047 L -2.213 -.039 L -1.491 .198 L -.731 .217 L -.495 .535 L .166 .322 L 1.949 -.305 L 1.581 -.046 L 1.856 .101 L .003 .42 L -.743 .241 L -2.388 .124 L -.463 .14 L -.213 .199 L -.156 .595 L -.471 .71 L -.678 .158 L -1.06 -.077 L -.742 .041 L -.837 .9 L -.987 1.087 L -.15 .347 L .454 .307 L .403 .095 L .602 -.481 L .743 -.368 L .856 -.041 L 2.345 .266 L .353 .096 L .262 .288 L -.059 .211 L -1.234 -.074 L -.673 -.018 L -.512 .097 L -.136 .191 L .29 .286 L 1.756 .188 L .557 .132 L 1.802 -.137 L .526 .208 L .214 .323 L -.049 .436 L -.256 .133 L -1.835 -.186 L -1.653 -.054 L -.781 -.074 L -1.295 .078 L -1.382 .475 L -.823 -.13 L -.49 -.15 L -1.06 .04 L -.283 .377 L 1.393 .599 L 1.187 .222 L 1.298 .128 L 1.665 .072 L .696 .148 L .551 .482 L .272 .444 L .014 .554 L -.434 .405 L -.384 .074 L -1.292 -.181 L -.82 -.109 L -.372 .111 L .023 .55 L .118 .236 L .426 .162 L .618 .089 L .723 .215 L .914 .142 L .752 .16 L .383 .376 L -.338 .233 L -.832 .145 L -.647 .126 L -1.747 -.032 L -1.176 -.087 L -1.624 -.086 L -.592 .448 L .551 .195 L 1.396 .051 L 1.052 .158 L .724 .248 L .088 .319 L -.035 .549 L -.13 -.005 L -1.092 -.045 L -1.247 .108 L -.596 .266 L -1.246 .02 L -1.225 -.139 L -1.497 -.404 L -.922 -.478 L -.373 -.07 L -1.094 .286 L 345 36.811 l -1.084 .09 L -.589 .178 L -1.451 -.033 L -.913 -.087 L -.969 .143 L -.395 .125 L -.174 .283 L .006 .141 L .354 .527 L .71 .245 L 1.284 .05 L 1.515 .26 L 1.567 -.056 L 1.323 .54 L .758 .226 L .482 .226 L 1.196 .329 L 1.252 .38 L .376 .276 L .483 .898 L .892 -.208 L .278 -.139 L .397 .207 L .298 .43 L .071 .344 L .198 1.164 L -.169 .205 L -.371 .12 L -.541 -.101 L -.546 -.119 L -.917 .002 L -1.041 .036 L -1.488 -.27 L -.637 -.409 L -.415 -.634 L -.354 -.274 L -1.17 -.566 L -.84 -.292 L -.748 -.137 L -1.095 -.084 L -.521 .14 L -.962 .105 L h 351.365 40.026 m -1.527 -.537 L -.96 -.225 L -.712 -.156 L -.159 -.069 L -.314 -.419 L 1.483 -.038 L .893 .139 L 1.064 .26 L .819 .296 L .162 .488 L -.215 .209 L -.533 .053 L h 281.574 46.135 m -.568 -.133 L -.707 -.318 L -.801 -.183 L -.197 -.101 L -.25 -.218 L -.08 -.844 L .287 -.34 L .368 -.018 L .646 .135 L 1.157 .066 L 1.287 .27 L .748 .269 L .595 .1 L .777 .217 L .603 .335 L -.144 .202 L -.112 .034 L -.543 .051 L -.774 .035 L -.77 .186 L -1.009 .153 L -.511 .102 L +105.98 81.688 N -.952 -.826 L -.198 -.342 L -.024 -.476 L .095 -.104 L .408 .044 L .312 -.045 L .781 .177 L .658 -.076 L .28 .119 L .138 .163 L -.234 .224 L -.173 .565 L -.028 .312 L -.581 .075 L -.483 .19 L h 125.24 92.375 m -1.312 -.288 L -1.345 -.434 L -.218 -.174 L .061 -.189 L .376 -.466 L -1.023 .002 L -.413 .248 L -.299 -.072 L -.416 -.188 L .166 -.452 L -.487 -.334 L -.269 -.014 L -.735 -.086 L -.226 -.262 L .317 -.292 L -.976 -.524 L -.556 .118 L -.386 -.102 L -.852 -.511 L -1.277 -.863 L -.219 -.235 L .02 -.117 L .962 -.12 L .337 .043 L 1.979 .598 L .981 .204 L 1.772 .202 L .385 .263 L .618 .526 L .426 .642 L .433 .422 L .362 .189 L 1.587 .536 L .316 .203 L .48 .756 L .116 .407 L -.279 .349 L -.407 .016 L h 271.379 92.089 m -1.202 -.23 L .641 -.743 L .358 -.161 L .279 .058 L .292 0 L .355 -.263 L -.697 -.653 L .079 -.219 L 272 89.003 l 1.121 -1.35 L 1.454 -1.31 L .725 -.442 L .496 -.192 L 1.315 -.194 L .198 .073 L .11 .221 L -.299 .221 L -.582 .03 L -.242 .133 L .349 .44 L -.755 .78 L -1.226 1.438 L -.271 .526 L .113 .291 L .11 0 L .428 -.176 L .483 -.555 L .458 -.191 L 1.115 .305 L -.896 .687 L .261 .203 L .229 .072 L 1.423 .565 L .758 -.03 L .325 -.408 L .309 -.059 L .718 .057 L .826 .202 L .616 .231 L -.297 .292 L -.373 .233 L -.708 .467 L .339 .333 L .477 .362 L .26 .014 L .417 -.161 L .464 -.132 L .278 .116 L .02 .16 L -.254 .262 L -.404 .248 L -.892 .104 L 280.84 93 l .273 .362 L .124 .405 L .28 .231 L .183 -.203 L .309 -.262 L .527 .159 L -.099 .449 L .149 .275 L .716 .028 L .085 -.015 L .015 .203 L -.168 .304 L -.25 .652 L -.34 .651 L -.222 -.072 L -.71 -.128 L -.301 -.144 L -.042 -.651 L -.601 .406 L -.374 .015 L -.095 -.274 L .497 -.652 L .011 -.333 L -.421 -.478 L -.279 -.072 L -.388 .392 L -.423 .291 L -.365 .146 L -.435 .204 L -.552 .536 L -.496 .334 L -.881 -.042 L -.222 -.217 L .165 -.145 L 1.229 -.408 L .466 -.522 L .632 -.363 L -.699 -.129 L -.601 -.057 L -.322 .464 L -.412 .015 L -.13 -.159 L .04 -.493 L -.757 .016 L -.148 .29 L -.41 .218 L -1.052 .045 L -.709 -.057 L -1.139 -.186 L -1.012 -.085 L -1.355 .061 L -1.014 .147 L -.145 -.188 L -.215 -.463 L .187 -.175 L .561 -.334 L .734 -.408 L .502 -.161 L .636 -.335 L h 265.435 98.655 m -.469 -.057 L -.497 -.273 L -.356 -.562 L .062 -.635 L .742 -.738 L .932 -1.043 L .816 .432 L -.375 .435 L -.112 .462 L -.233 .333 L -.262 .116 L -.58 .319 L -.244 .448 L .522 .244 L .168 -.029 L .279 -.26 L .42 -.362 L .617 -.319 L .309 .057 L .495 .461 L -.177 .347 L -.246 .159 L -1.134 .42 L -.682 .044 L h 211.34 59.677 m -.68 -.046 L .068 -.872 L -.375 -.333 L -.958 .161 L -2.375 .29 L .107 -.461 L .56 -.303 L 1.644 -.561 L -.302 -.478 L -.102 -.415 L .106 -.417 L .398 -.835 L .434 -.566 L .254 -.648 L .331 -.471 L 1.11 .566 L -.312 .518 L .791 .386 L .527 .047 L .402 -.469 L .67 .112 L .806 .289 L .917 .514 L .582 .255 L 2.168 .492 L .442 .271 L .176 .255 L -.09 .925 L .539 .047 L .57 -.065 L .934 .046 L .701 .142 L 1.019 .427 L -.419 .096 L -.269 .127 L -.46 .271 L -.949 -.046 L -.623 -.125 L -1.328 -.125 L -.438 -.126 L 217.259 58 l -.528 -.301 L -1.017 -.237 L -.528 .017 L -.203 .271 L .174 .588 L -.126 .096 L -1.314 .161 L -.673 .493 L -.588 .302 L -1.116 .287 L h 200.125 19.1 m -.862 -.015 L -1.085 -.195 L -.308 -.664 L .819 -.304 L .77 -.072 L .666 -.024 L 3.475 -.125 L 1.263 -.12 L 1.374 -.026 L 1.714 .324 L .397 -.094 L .397 -.377 L 1.303 -.287 L 1.759 -.099 L 1.975 .209 L .746 -.001 L 2.562 .137 L 2.621 .324 L 1.424 .09 L 1.461 .161 L .448 -.165 L -1.433 -.42 L -1.67 -.352 L -.816 -.429 L .293 -.242 L 1.361 -.148 L 1.101 -.246 L 1.431 -.101 L 2.382 -.201 L 1.666 .119 L 1.944 .191 L 1.009 .265 L 1.19 .456 L .354 .047 L .273 -.362 L -.959 -.508 L -.828 -.292 L .499 -.248 L 1.45 .121 L 1.832 .168 L 1.653 .07 L 1.639 .46 L .378 .023 L .062 -.195 L -.301 -.539 L 1.781 -.004 L 1.408 .046 L .832 .269 L .831 .34 L .618 -.001 L -.044 -.268 L -.331 -.467 L 1.075 -.077 L 3.691 .386 L 2.726 .288 L 1.937 -.077 L 2.987 .018 L .967 .047 L .757 .12 L .126 0 L 1.419 .094 L 1.089 .191 L .744 .095 L 1.685 .044 L 1.357 .357 L -.385 .358 L -1.237 .121 L -1.206 .356 L -1.849 .191 L -.978 -.045 L -2.191 -.159 L -2.284 .005 L -.776 .142 L -1.915 .168 L -.597 .465 L .75 .366 L .761 .044 L 1.03 -.048 L 1.705 -.279 L .79 .021 L .808 .434 L -.168 .114 L -1.246 .139 L -1.38 .207 L -1.174 .295 L -2.098 .518 L -1.316 .224 L -1.19 .355 L -.924 .286 L -2.252 .005 L .65 .906 L -.449 .193 L -2.297 .455 L -.768 -.019 L -1.587 -.037 L -1.462 -.218 L -2.386 -.164 L -.66 .33 L 2.591 .695 L -.662 .141 L -.967 -.038 L -1.297 .022 L -1.068 .022 L -2.58 -.214 L -2.009 .063 L -.134 .66 L 1.257 -.105 L 1.065 .018 L 2.312 .292 L .557 .157 L .12 .67 L -.33 .197 L -1.031 .12 L -.515 .705 L -1.073 .021 L -.448 -.058 L -.402 .176 L .297 .253 L .759 .25 L -.328 .136 L -1.615 .08 L -.867 -.037 L -1.71 -.171 L -.422 .078 L .41 .791 L -.08 .231 L -.649 .289 L -.767 .155 L -1.52 -.112 L -2.039 -.111 L -1.43 -.227 L -1.008 .079 L -1.219 .5 L 1.031 .112 L .368 .057 L 2.154 .11 L 1.759 .13 L 1.534 .168 L 2.001 .034 L .66 .34 L .045 .359 L -.907 .398 L -2.685 .268 L -.927 .115 L -1.054 .227 L -1.115 .077 L -.467 -.28 L -.797 -.638 L -.56 .039 L -.631 .001 L -1.453 -.318 L -.001 .17 L .331 .508 L -1.477 -.016 L -1.5 -.129 L -.875 -.319 L -1.033 -.471 L -.388 .058 L .527 .717 L -.24 .17 L -.821 .133 L -1.72 -.109 L -2.276 -.033 L -.972 -.073 L -1.382 -.394 L -.642 -.131 L -.282 .453 L -.619 .152 L -1.843 -.316 L .161 -.586 L .219 -.228 L 1.525 -.117 L .61 -.249 L .961 -.173 L 1.179 .036 L .499 -.172 L -1.073 -.4 L -1.043 -.651 L .052 -.154 L .479 -.117 L 1.316 .036 L 1.743 .093 L .888 .21 L 1.108 .517 L 1.35 .323 L 1.085 .093 L 1.667 -.022 L .829 -.136 L .086 -.268 L .514 -.304 L -3.019 .001 L -1.025 -.171 L -.156 -.85 L .211 -.154 L -1.74 -.153 L -1.963 -.152 L -.274 0 L -.631 .114 L .204 -.758 L 1.159 -.551 L 1.104 -.16 L 1.837 -.003 L 1.164 .037 L 1.37 .076 L 2.023 .311 L 1.342 .115 L .486 -.158 L 1.132 -.041 L -3.399 -.802 L -1.742 -.313 L -3.555 -1.27 L -.406 .242 L -1.398 -.878 L .025 -.258 L .313 -.108 L 1.747 .104 L 1.905 -.004 L 2.019 .06 L 1.6 .382 L 2.535 .784 L 1.448 -.043 L .833 .095 L -1.387 -.555 L -2.015 -.317 L 1.208 -.743 L 1.456 -.329 L 1.731 -.025 L 1.529 -.222 L 2.042 -.07 L 1.157 -.112 L 1.414 -.051 L -1.778 -.479 L -1.425 -.153 L -2.501 .027 L -1.243 .248 L -1.305 .158 L -1.425 .202 L -1.447 .047 L -.586 .067 L -1.532 -.438 L -.214 .111 L -.543 .156 L -2.16 -.018 L -1.58 .365 L .311 -.828 L .98 -.292 L .007 -.202 L -.606 -.247 L -1.375 -.156 L -1.39 .003 L -4.189 .505 L -2.031 .672 L -.408 -.11 L -.569 -.251 L .395 -.133 L .678 -.023 L -.117 -.316 L -.698 -.398 L -1.216 -.056 L -.216 -.003 L h 200.125 20.844 m .899 -.096 L .832 .196 L .339 .5 L .511 .495 L .427 .063 L 1.141 .041 L -.081 -.236 L .056 -.411 L .438 -.109 L .718 .194 L .718 .322 L .374 .3 L -.066 .171 L .056 .826 L .764 .442 L .953 -.017 L 1.276 -.074 L 1.646 .504 L -1.123 -.264 L -1.528 .34 L -1.599 .221 L -.83 .377 L -.287 .197 L -.265 .315 L -.448 .021 L -1.493 -.41 L -.656 .335 L .465 .43 L -.029 .235 L -.412 .196 L -.392 .04 L -1.086 -.31 L -.944 -.311 L -.26 .645 L -.117 .068 L -.083 .049 L -.888 .041 L -1.74 -.094 L -1.458 -.153 L -.888 -.154 L -.494 .021 L -3.115 -1.31 L -.191 -.276 L 1.971 -.241 L 3.32 .093 L .889 .097 L 1.573 .1 L -2.485 -.693 L -3.019 -.213 L -1.103 .122 L -1.43 -.017 L -.597 .18 L -1.008 .022 L -.606 -.198 L -1.066 -.517 L -1.425 -.479 L -.341 -.355 L 1.971 .124 L 2.278 -.175 L -1.255 -.249 L -.756 -.351 L .38 -.305 L .729 -.132 L .769 -.023 L .921 .042 L .156 -.219 L -1.799 -.793 L 1.053 -.114 L 1.213 -.182 L 1.13 .087 L .584 -.046 L .145 -.18 L -.514 -.475 L 1.362 .134 L .941 .066 L .83 .202 L 1.589 .869 L .653 .264 L .772 .24 L .674 -.001 L .36 -.039 L h 179.067 27.216 m -1.156 -.056 L -.604 -.173 L -.926 -.638 L -.621 -.193 L -3.102 -.091 L -1.487 .081 L -.622 .001 L -1.444 -.056 L -.767 -.154 L -1.019 -.37 L -.161 -.234 L .335 -.138 L .802 -.001 L 1.687 .232 L .867 -.021 L -.031 -.235 L -.252 -.275 L -1.344 -.49 L -.579 -.098 L -1.075 -.077 L -1.392 -.196 L .065 -.397 L 2.246 -.124 L 2.392 .155 L .77 .376 L .999 .453 L 1.979 .193 L 2.189 .114 L 1.178 .233 L .604 .254 L 1.123 .721 L .581 .446 L .168 .426 L -.481 .194 L -.919 .137 L h 185.907 26.758 m -1.078 -.037 L 184 26.529 l -1.029 -.484 L -1.144 -.76 L -.03 -.216 L .239 -.099 L 2.296 -.044 L 1.816 .311 L 3.101 .542 L -.047 .351 L -.254 .331 L -.436 .04 L -1.563 .177 L -1.043 .08 L h 156.886 26.865 m -1.573 .646 L -.558 .27 L -1.85 .042 L -1.019 .079 L -1.898 -.15 L -.577 -.114 L -.302 -.423 L .334 -.291 L 1.365 -.177 L .899 .056 L 2.351 -.102 L .496 0 L 2.331 .163 L h 132.902 31.305 m -.53 -.186 L -.95 -.466 L -.424 -.112 L -.33 .057 L -.56 .207 L -1.269 .059 L -.786 -.279 L -.283 -.319 L .23 -.264 L 1.13 -.097 L .503 -.133 L .771 -.134 L .977 -.399 L .848 -.211 L .726 -.172 L .548 -.344 L 1.083 -.231 L 1.277 -.079 L 2.532 -.158 L 1.68 .016 L .888 -.29 L 1.038 -.079 L 1.503 .438 L -.756 .097 L -.852 .231 L -.22 .268 L .12 .266 L .469 .474 L -.777 .001 L -.912 .115 L -.918 .662 L -1 -.017 L -.867 -.981 L -.694 -.15 L -.379 .02 L -.229 .285 L -.588 .342 L -.63 .623 L -.595 .151 L -.284 .375 L -.705 .356 L -.787 .058 L h 191.827 30.313 m -1.266 -.054 L -2.278 -.165 L -.426 .058 L -.332 -.094 L -.896 -.489 L -1.185 -.414 L .192 -.229 L 2.433 -.042 L 1.542 .263 L 1.472 .054 L .171 0 L .89 .358 L -.179 .246 L .123 .32 L -.263 .188 L h 144.688 31.739 m -2.222 -.395 L -.325 -.674 L .503 -.057 L .595 -.17 L .945 -.096 L .953 -.133 L 1.279 -.059 L .522 .187 L .65 .374 L .659 .186 L 1.55 -.209 L .617 .149 L 1.624 .762 L 1.016 .351 L .897 .036 L .96 -.058 L 1.418 .09 L .591 -.02 L 1.116 -.169 L .092 -.297 L -.557 -.559 L -.941 -.391 L -1.347 -.354 L .96 -.322 L .524 -.379 L .569 -.152 L 1.097 -.116 L .507 .17 L .773 .678 L -.017 .413 L .518 .654 L .565 .111 L .9 .036 L 1.805 .406 L -.334 -.465 L .151 -.28 L .409 -.076 L 1.495 .24 L .932 .39 L -.292 .409 L .039 .5 L -.358 .461 L -.573 .277 L -.755 .111 L -.782 .001 L -1.682 .095 L -1.156 -.071 L -1.757 -.18 L -.622 -.017 L -1.129 .277 L -1.132 .202 L -.76 .182 L -.977 .254 L -1.625 .292 L -1.338 .2 L 149.23 34.5 l -.748 -.07 L -1.445 -.286 L -.276 -.378 L .648 -.128 L 1.219 -.038 L .738 -.146 L .852 -.075 L 1.166 -.057 L .622 .017 L 1.09 -.149 L .483 -.553 L -2.768 -.087 L -.925 -.054 L -1.564 .28 L -1.625 .168 L -1.292 .04 L -.795 .093 L -1.681 -.347 L -.479 .167 L -.92 .075 L -.979 -.127 L -.854 -.33 L .023 -.111 L .863 -.427 L 1.098 -.058 L 2.047 -.022 L .96 -.159 L h 178.479 33.234 m -.984 -.219 L -.193 -.294 L .764 -.389 L .433 -.112 L .088 -.167 L -.447 -.333 L -1.161 -.054 L -2.13 .227 L -.939 .076 L -.331 .019 L -.854 -.276 L .039 -.335 L .739 -.02 L .542 -.244 L .587 -.057 L -.466 -.598 L .176 -.245 L .132 -.226 L .49 .018 L .859 .224 L 1.942 .746 L .426 .186 L .46 -.094 L -.101 -.243 L -.959 -.486 L -.371 -.131 L -.407 -.357 L .436 -.095 L .956 -.059 L .713 .131 L 1.033 .262 L .572 .168 L .27 .018 L .162 -.452 L .478 -.133 L .73 .112 L .717 .168 L .327 .168 L .367 .75 L -.034 .616 L -.247 .242 L -.831 .335 L -.017 .352 L .35 .625 L -.361 .147 L -1.648 -.089 L -.862 .112 L -1.446 .003 L h 200.125 30.572 m -.895 .045 L -.853 .17 L -.37 .467 L 1.133 .054 L .984 -.038 L .046 -.001 L .847 .11 L .463 .129 L .498 .463 L .727 .424 L .621 .091 L .213 -.074 L .043 -.314 L .286 -.056 L 1.075 -.002 L .883 -.187 L .766 .11 L .835 .239 L .665 .257 L .976 .053 L .775 -.463 L 1.393 -.281 L 1.704 -.114 L 1.951 -.246 L 1.533 .053 L 2.59 .014 L .381 .037 L .79 .314 L .911 .239 L 1.418 .146 L .653 .128 L .21 .037 L .361 .166 L .181 .257 L -.4 .148 L -1.833 .407 L -.135 .255 L .469 .666 L -2.486 .076 L -.592 .02 L -.651 .091 L -.768 -.053 L -.846 -.16 L -.405 -.125 L -.306 -.667 L -.833 -.218 L -.366 .129 L .072 .723 L -.536 .127 L -.747 -.053 L -.91 .109 L -.728 -.017 L -.495 .001 L -1.342 -.213 L -.593 -.197 L -.495 -.017 L -.209 .433 L -1.801 .111 L -.831 .074 L -1.453 -.069 L -.404 -.251 L -.144 -.686 L -1.237 .129 L -.389 .181 L -.326 .325 L -.955 .2 L -1.011 -.034 L -.112 -.027 L -.704 -.169 L -1.186 -.575 L -.675 .489 L -1.131 -.07 L -.666 -.688 L -.442 -.717 L .587 -.481 L .019 -.371 L -.292 -.316 L -1.249 -.651 L -.617 -.299 L -.047 -.338 L .636 -.133 L 1.226 -.078 L 2.472 -.023 L .763 .093 L 1.118 .261 L .188 .04 L .872 .184 L -.613 .189 L -.259 .013 L h 128.19 41.985 m -.926 -.016 L -1.059 -.102 L -.362 -.466 L -.549 -.467 L -.432 -.259 L -1.123 -.363 L -1.36 -.067 L -.951 -.138 L -.469 -.19 L -.168 -.174 L .537 -.106 L .589 -.298 L .481 -.211 L .08 -.386 L -.437 -.809 L .552 -.001 L .468 -.177 L .307 -.372 L 1.104 -.533 L .526 -.588 L -.121 -.32 L -.271 -.16 L -1.229 -.677 L -.375 -.448 L .869 -.001 L .823 -.056 L 1.455 .051 L .97 .016 L 1.515 -.092 L 1.284 -.146 L 1.242 -.074 L .495 .125 L 3.242 .801 L .918 .088 L .708 -.055 L 1.316 -.127 L 1.223 .016 L .771 .07 L 1.35 .373 L 2.389 .815 L -.242 .143 L -.432 .036 L -.26 .072 L -1.609 .322 L -1.073 .144 L -1.829 .428 L -1.069 .319 L -1.604 .725 L -1.025 .563 L -.549 .089 L -.974 .124 L .066 .924 L -.271 .504 L -.662 .278 L -1.215 .124 L -1.213 -.067 L -.521 .485 L -.898 .312 L h 190.483 39.666 m -1.146 -.208 L -.146 -.524 L -.941 -.806 L -.207 -.582 L .058 -.389 L .27 -.657 L .377 -.321 L 1.256 .033 L -.089 -.16 L -.416 -.266 L -.185 -.286 L .211 -.09 L .234 -.072 L 2.154 -.058 L 1.215 .087 L 1.464 .248 L 1.282 .051 L 1.316 -.146 L 1.051 .016 L .694 .105 L .639 .213 L -.007 .089 L -.224 .179 L -.824 .428 L -.874 .746 L -1.513 .92 L -1.386 .073 L -2.379 -.154 L -1.269 .055 L 1.392 .717 L -.188 .315 L -.855 .369 L -.964 .072 L h 181.204 41.523 m -.491 -.085 L -1.101 -.552 L -.952 -.641 L -1.014 -.468 L -.978 -.225 L -1.438 -.12 L -.55 -.174 L -2.255 -1.066 L .866 -.654 L .653 .14 L 1.032 .474 L 1.063 .227 L .46 .052 L .615 -.283 L .908 -.619 L .415 -.036 L .018 -.212 L -1.062 -.565 L -1.068 -.424 L -.177 -.231 L .132 -.107 L 1.683 .086 L .711 -.215 L .42 0 L .996 .39 L .56 .035 L .58 -.055 L .435 -.25 L 1.232 -.127 L 1.354 .069 L .912 .23 L -.324 .268 L -.58 .125 L -.323 .338 L -1.55 .375 L -.392 .16 L -.069 .194 L .253 .247 L .506 .105 L .692 -.089 L 1.08 .174 L .868 .245 L .391 .017 L .564 .262 L .186 .438 L -.681 .352 L -.156 .35 L -.271 .68 L -.457 .366 L -.508 .14 L -.658 .019 L -.582 -.103 L -.773 -.346 L -.653 -.103 L .013 .208 L 1.054 .553 L -.817 .399 L -.77 .036 L h 243.524 60.394 m -.234 -.208 L -1.199 -.235 L -.673 -.331 L -.154 -.269 L .346 -.064 L .616 -.461 L -1.378 -.521 L -1.132 -.125 L -.76 -.349 L -.929 -.731 L -.035 -.511 L -1.115 -.062 L -1.311 -.366 L -.675 -.031 L .284 .767 L -.155 .096 L -.409 -.015 L -1.704 -.332 L -.309 .033 L -.325 .304 L -.441 .288 L -1.312 .082 L -1.349 -.173 L -1.343 -.189 L -.813 -.254 L -.052 -.319 L .196 -.4 L .382 -.354 L 1.066 -.163 L .192 -.178 L -.128 -.516 L .206 -.033 L 1.357 .11 L 1.408 .175 L .517 .144 L .962 .626 L .051 -.386 L -.154 -.193 L .077 -.194 L .585 -.033 L .977 -.099 L .652 -.163 L .649 -.114 L .515 .063 L .785 .031 L .166 -.275 L -1.138 -.825 L -.773 -.356 L -.119 -.228 L .167 -.163 L .586 -.066 L .72 -.246 L 1.409 -.591 L .361 -.541 L .771 -.46 L .493 -.379 L -.109 -.593 L -.899 -.841 L -.407 -.496 L -.541 -.364 L -.414 .001 L -1.258 -.33 L -1.041 -.481 L -.244 -.467 L -.527 -.384 L -.442 .202 L -.551 .202 L -.825 -.015 L -.293 .117 L -.62 .018 L -1.255 .169 L -.214 -.667 L 1.032 -.052 L 1.23 -.103 L .163 -.269 L -1.604 -.618 L -1.552 -.67 L -.879 -.015 L -.567 -.185 L -.169 -.542 L -.677 -.339 L -.45 -.05 L -.918 -.306 L -.687 -.341 L -.385 -.119 L -.611 .155 L -.81 -.187 L -1.177 -.238 L -.489 -.085 L -.379 .138 L .529 .307 L .453 .05 L 2.838 .712 L .438 .271 L .069 .306 L -.505 .221 L -.669 .069 L -.541 -.033 L -.757 -.049 L -.818 -.252 L -1.153 -.27 L -.667 -.066 L -.323 .17 L .044 .204 L .426 .236 L .259 .438 L -1.703 -.553 L -.47 -.05 L -.396 .119 L -.63 .153 L -.767 -.218 L -.693 -.117 L -.859 .12 L -1.474 -.184 L -1.995 -.167 L -1.321 .037 L -1.146 -.032 L -.862 -.186 L -.003 -.597 L -.363 -.153 L -.904 -.049 L -.396 .342 L -.623 .086 L -1.214 -.049 L -1.076 -.168 L -1.303 -.477 L -.415 -.376 L .123 -.275 L .868 -.07 L 1.131 .067 L 1.212 .101 L .879 -.019 L .312 -.19 L -.934 -.463 L -.8 -.275 L -.905 -.102 L -1.106 -.119 L -.752 .036 L -.539 -.017 L -1.249 -.223 L .114 -.416 L .292 -.557 L .34 -.14 L .646 -.054 L .081 -.227 L -1.082 -.4 L -.044 -.175 L .449 -.79 L 1.197 -.919 L .565 -.284 L .918 -.321 L .74 -.374 L .423 -.037 L .37 -.178 L .698 -.001 L .481 -.125 L .71 -.09 L 1.436 -.109 L 1.348 .033 L .857 .194 L -.92 .393 L -.815 .48 L -1.394 .639 L -.43 .529 L .169 .369 L 1.256 .541 L -.444 .298 L -.076 .402 L .257 .313 L .862 .554 L 1.559 .621 L -.096 .121 L -1.272 .331 L -.072 .31 L .959 .033 L 1.504 .101 L .654 -.639 L -.103 -.415 L -.343 -.277 L -.724 -.103 L -.422 -.138 L -.884 -.538 L .101 -.157 L .506 -.245 L .473 -.193 L 1.001 .12 L .837 -.071 L -1.204 -.47 L -.703 -.034 L -.793 -.279 L -.056 -.193 L .053 -.545 L .886 -.319 L 1.207 .086 L 1.509 -.056 L -.939 -.281 L -1.233 -.351 L .793 -.303 L 1.288 -.198 L 1.044 -.126 L 1.688 -.323 L 1.114 .016 L .642 .052 L .833 .141 L .782 .478 L 1.536 .97 L .058 .141 L -.583 .687 L -.709 .632 L .038 .733 L .364 .086 L .65 .033 L 1.088 -.315 L .284 -.455 L .595 -.088 L .791 .034 L .454 .174 L -.006 .262 L .16 .47 L .875 .189 L .196 -.122 L -.204 -.854 L .218 -.123 L .456 -.474 L 1.038 -.265 L .98 -.054 L .748 .034 L .98 .174 L 1.172 .138 L 1.151 -.09 L .688 .139 L .327 .262 L .621 .331 L .574 .191 L 235.438 40 l 0 .191 L -.531 .088 L -.484 .279 L -.818 .262 L -.148 .225 L .45 .259 L .427 .068 L .897 -.417 L .652 -.174 L .502 .051 L .476 .242 L .365 .466 L .516 .413 L .342 -.242 L 1.304 -.798 L 1.935 .256 L .915 .361 L -.051 .069 L -.638 .346 L -.708 .517 L 1.167 -.054 L .455 -.173 L 1.078 -.105 L .033 .704 L .797 .324 L .523 -.069 L .831 -.207 L 1.316 -.088 L .816 .221 L .566 .273 L -.162 .154 L -.461 .223 L -1.87 .43 L -.238 .272 L .523 .253 L .456 -.068 L .747 -.171 L 1.235 -.122 L .406 -.29 L .361 -.103 L .479 .067 L .51 .187 L .544 .339 L .636 .522 L -1.019 .002 L -1.2 .053 L -.424 .135 L .059 .269 L .372 .134 L 1.333 .065 L .938 .183 L .543 .217 L .233 .301 L -.37 .034 L -.748 .001 L -1.011 -.082 L -.875 -.216 L -.824 -.065 L -.316 .185 L 1.23 .583 L -.216 .201 L -1.552 .12 L .245 .283 L .437 .166 L .551 .032 L 1.331 .364 L 1.312 .347 L .247 .182 L .039 .282 L .351 .38 L .75 -.217 L .536 .049 L 1.413 .295 L .298 -.067 L .649 -.15 L .61 .032 L .752 .379 L .862 .477 L .376 .346 L -.685 .1 L -.801 .117 L -.027 .444 L .795 -.001 L 1.405 -.052 L .51 -.132 L .895 .048 L -.386 .559 L .918 .179 L .514 -.001 L .943 -.379 L .685 .343 L 1.089 .407 L .194 .098 L -.275 .229 L -.254 .099 L -.103 .326 L -.819 .05 L -.718 -.21 L -.247 -.048 L -.794 .213 L .968 .454 L .279 .162 L .057 .276 L -1.057 .197 L -.356 .228 L -.312 .292 L -.372 -.113 L -.819 -.583 L -.29 1.103 L .354 .903 L -.419 .065 L -.677 -.257 L -.751 -.176 L -.205 -.177 L -.018 -.243 L -.315 -.274 L -.93 .276 L -.743 -.613 L .051 -.292 L .27 -.374 L -.304 -.129 L -.224 -.016 L -.992 -.08 L -.718 -.292 L -1.17 -.617 L -.769 -.292 L -.762 -.048 L -.452 .23 L -.645 .083 L 250 52.592 l .281 .179 L 1.05 .682 L -.321 .114 L -.686 .05 L -.359 -.259 L 249.277 53 l -.646 -.21 L .275 .488 L .859 .972 L .604 .015 L .587 .08 L .5 .581 L .612 .805 L .513 .432 L .615 -.321 L .285 .047 L .592 .399 L .585 .271 L 1.38 .396 L -.634 .113 L -.213 .208 L .254 .19 L .568 .286 L .962 .444 L .324 .237 L .242 .682 L -.112 .428 L -1.302 -1.155 L -.554 -.237 L -.027 .238 L .118 .27 L 1.055 1.281 L -.01 .3 L -.926 -.125 L .053 .205 L .432 .409 L .378 .519 L -.563 -.172 L -.615 -.313 L -.889 -.693 L -.145 -.031 L -.719 .064 L -.91 -.188 L -1.44 -.662 L -.319 -.285 L -1.062 -.665 L .187 .777 L -1.22 -.473 L -.567 -.158 L -.872 -.03 L .095 .222 L .799 .696 L .853 .426 L 1.842 .645 L 1.296 .644 L .774 .549 L .442 .486 L .429 .689 L -1.833 -.341 L -1.524 -.421 L -1.251 -.28 L -1.444 -.107 L -1.092 -.25 L -.898 -.644 L -1.146 -.14 L -.638 -.204 L -.635 -.141 L -.058 .145 L h 146.194 38.698 m .818 -.037 L .78 -.125 L 1.138 -.548 L .895 -.019 L 1.723 .243 L .939 .262 L -.188 .877 L .515 -.071 L .66 -.019 L .792 -.229 L .599 -.141 L .758 .016 L .334 -.071 L -.989 -.965 L .156 -.036 L 1.38 .138 L 1.208 .245 L .675 .245 L .259 .245 L .194 .508 L .965 1.063 L .638 .346 L 1.045 -.315 L .14 -.261 L -1.243 -1.361 L -.439 -1.321 L .228 -.354 L 1.91 .262 L 1.775 .156 L 2.031 .719 L .36 .175 L .3 .316 L .16 .701 L .511 .645 L .352 .26 L .856 .606 L .048 .19 L -.178 .243 L -.333 .605 L .179 .31 L .224 .12 L 1.4 .649 L .509 .171 L 1.151 .254 L 1.513 .1 L 2.056 .576 L 1.012 .39 L .364 .793 L -.168 .101 L -1.071 -.082 L -.811 -.234 L -.945 -.234 L -.551 .169 L -.665 .204 L -1.021 .036 L -.256 .118 L .208 .689 L 1.087 -.069 L .614 -.152 L .676 -.119 L .876 .536 L -.01 .235 L -.526 .151 L -.517 .252 L -.583 .102 L -1.417 .12 L -1.049 -.015 L -1.194 -.082 L -1.594 -.248 L -2.278 -.499 L -.553 -.217 L -.436 -.335 L -.482 -.033 L -.581 .102 L -.402 .37 L -1.114 .505 L -1.055 .019 L -1.411 .103 L -1.253 .42 L -2.753 .356 L -1.42 .019 L -1.205 .086 L -1.984 -.063 L -.483 .101 L -.916 -.015 L -1 -.282 L -.061 -.468 L .198 -.101 L .002 -.302 L -.395 -.2 L -.462 -.1 L -3.146 -.112 L -1.258 -.115 L -.864 -.167 L -.801 -.2 L -.753 -.504 L -1.274 -.554 L .303 -.069 L .531 -.222 L 1.572 -.054 L .603 -.188 L .558 .016 L .91 -.019 L .904 -.087 L 1.716 .031 L .935 -.002 L 2.14 .047 L 1.09 -.002 L 1.711 -.038 L .415 -.154 L -.681 -.221 L -2.312 -.492 L -1.942 -.202 L -4.059 -.061 L -1.569 -.014 L -1.694 .055 L -.955 .053 L -.604 .001 L -1.651 -.529 L .011 -.207 L .28 -.069 L .823 -.053 L 1.315 -.209 L .996 .032 L 1.78 -.141 L .931 -.105 L .5 -.277 L -.392 -.346 L -2.023 .073 L -1.578 .159 L -.393 -.051 L -.554 -.189 L -.677 -.346 L -.65 -.19 L -.692 .054 L -.709 -.242 L -.039 -.279 L 1.304 -.981 L 2.62 -.848 L .909 -.143 L .373 -.177 L 1.297 -.267 L 1.324 -.162 L .701 -.267 L 1.113 -.091 L 1.026 .246 L -.07 .212 L -.548 .354 L -.021 .81 L h 251.273 99.526 m -.188 .153 L -.16 -.291 L .192 -.077 L -.02 -.256 L .143 -.069 L -.042 -.154 L -.224 0 L -.606 -.231 L .077 -.229 L -.31 -2.819 L -.174 -.274 L -.488 -.288 L -.771 -.025 L -.41 .176 L -.381 -.085 L -.505 -.36 L -.273 -.085 L -.632 .526 L -.514 .626 L -1.139 2.22 L -1.139 1.45 L -1.161 -.124 L -.402 .06 L -.363 .435 L -.174 .375 L -1.093 -.095 L -1.855 -.004 L -2.508 -.029 L -1.76 .009 L -.968 .523 L -.534 .305 L -1.754 .814 L -.545 .164 L -.146 .434 L -.163 .512 L -.44 .275 L -1.156 .197 L -1.305 -.138 L -1.123 -.01 L -.93 .091 L -.47 .203 L -.162 .375 L .018 .319 L .16 .471 L .047 .362 L -.875 .427 L -1.464 .452 L -.944 .163 L -.919 .062 L -.88 .262 L -.939 .478 L -.925 .506 L -.524 .117 L -.573 -.068 L -.497 -.169 L -.371 -.427 L -.012 -.33 L .044 -.218 L .707 -.525 L .414 -.294 L .264 -.433 L .294 -.544 L .377 -.576 L .028 -.746 L -.054 -.545 L -.876 -3.16 L -2.529 -1.05 L -.26 -.33 L .11 -.318 L -.307 -.235 L -.916 -.181 L -.184 -.294 L -.178 -.135 L -.628 .024 L -.46 -.465 L -.101 -.429 L -2.15 -1.061 L -3.975 -1.576 L -.977 -.386 L -.797 -.227 L -.805 .189 L -1.469 .592 L -.707 -.074 L -.542 .049 L -.196 -.144 L -.156 -.115 L -.474 -.041 L -.855 .083 L -.197 -.116 L -.028 -.282 L -.373 .075 L -.412 .191 L -.219 .06 L -.573 .141 L -.506 -.098 L -.064 -.185 L -.469 -.086 L -.241 -.271 L -.502 -.013 L -.16 .247 L -.338 -.48 L -.271 .012 L -.02 -.185 L -1.425 -.208 L -.518 .076 L -.833 -.451 L -.468 -.46 L -.279 -.371 L -.896 -.748 L -.501 .036 L .131 .347 L .387 .588 L -.68 -.003 L -2.687 .029 L -2.798 -.029 L -1.348 .007 L -2.105 -.003 L -2.915 .016 L -2.781 -.029 L -2.131 .012 L -2.935 -.014 L -.601 .003 L -4.84 -.018 L -3.617 .004 L -.875 .005 L -3.821 -.023 L -1.089 .035 L -4.13 -.021 L -.74 -.011 L -5.117 .028 L -1.687 -.006 L -2.87 .001 L -3.938 -.008 L -4.588 .025 L -1.335 -.022 L -2.579 -.001 L -.194 -.013 L -.187 -.151 L -.509 -.305 L -.071 -.437 L .074 -.346 L -.708 .25 L -.373 -.029 L -.331 -.305 L -.162 -.496 L -.125 -.189 L -.385 .088 L -.23 .205 L -.483 .059 L -.721 -.495 L -.119 -.425 L -.201 -.821 L -1.051 .104 L -1.01 -.277 L -.487 -.087 L -.173 -.087 L -.143 -.396 L -.438 -.352 L -.591 .222 L -1.236 .046 L -.461 -.117 L -.383 -.249 L -.106 -.25 L .257 -.648 L .458 -.222 L -.227 -.294 L -1.24 -.086 L .617 -.518 L .398 -.281 L .547 -.149 L .605 -.508 L -.874 .006 L -.621 .149 L -.362 -.043 L 116 83.422 l -.039 -.978 L -.789 .002 L -1.015 -1.066 L .132 -.238 L .034 -.53 L -.547 .056 L -.83 .492 L -1.266 -.934 L -.384 -.521 L -.204 -.402 L -.068 -.432 L .419 -.404 L .161 -.254 L .436 -.3 L -.358 -.689 L -.393 -.777 L .163 -.788 L -.402 -.255 L -2.025 -.763 L -.98 -.314 L -.189 -.029 L -.512 -.393 L -1.67 -1.882 L -1.769 -1.768 L -.814 -.58 L -2.048 -1.175 L -.35 -.322 L -.371 -.492 L -.316 -.199 L -.832 -.073 L -.495 .126 L -.731 .498 L -1.225 .67 L -.848 .205 L -.238 .325 L -.945 -.673 L -2.162 -1.318 L -.348 -.292 L -.173 -.387 L -.332 -.388 L -.739 -.059 L -2.424 .122 L -.84 -.074 L -.196 -.279 L -.089 -1.046 L -.026 -2.167 L .043 -4.334 L .026 -2.183 L -.129 -2.796 L -.052 -2.335 L -.039 -2.259 L .003 -2.855 L -.102 -.483 L .71 .024 L .9 -.086 L .964 .116 L 2.012 .451 L 1.601 .518 L 1.214 .266 L 1.04 .115 L .731 .032 L 1.619 .164 L .888 .232 L .429 .149 L .254 -.034 L -.452 -.601 L -.357 -.2 L -.345 -.15 L -.064 -.419 L 1.344 -.423 L .745 .066 L .578 -.068 L .15 -.102 L 1.736 .148 L .771 -.001 L 1.125 -.373 L .309 -.186 L .442 0 L .656 -.221 L .759 -.069 L .866 -.086 L .734 -.086 L .469 -.239 L .392 -.188 L .771 -.104 L 1.045 -.002 L .872 .123 L -.445 .404 L -.352 .119 L -1.101 .137 L -1.092 .373 L -1.244 .171 L -1.22 .271 L -.699 .522 L -1.767 .255 L -.681 .487 L .846 .266 L 1.441 .748 L -.219 -.55 L .168 -.351 L 1.196 -.253 L .39 -.235 L .726 -.421 L 1.727 -.053 L .96 -.372 L 1.158 -.389 L 2.066 -.173 L .643 -.338 L .921 -.272 L .821 -.189 L .476 -.239 L -.178 -.272 L -.702 -.392 L -.655 -.444 L .899 .101 L .764 .272 L .701 .306 L .412 .324 L .376 .476 L .449 .523 L .393 .235 L 1.246 .486 L .186 .067 L 1.154 .216 L .394 -.018 L .199 -.151 L -.511 -.639 L .07 -.27 L .548 -.035 L .334 -.136 L .627 -.103 L .383 .354 L .059 .421 L -.205 .287 L .833 .133 L .938 -.069 L 1.136 -.457 L .536 -.49 L .479 -.069 L 1.131 .015 L 1.536 .267 L 1.745 .435 L 1.396 .334 L 2.095 .349 L 1.024 .216 L .619 .066 L 1.572 .282 L 1.121 .065 L 1.144 .148 L 1.096 .032 L 1.4 -.086 L .899 .099 L 1.008 .282 L .982 .349 L .434 .249 L .191 .333 L -.524 .134 L -.935 -.032 L -.566 .051 L -.849 .135 L -.354 .714 L 3.323 .358 L 1.726 .079 L 1.749 .014 L .868 -.068 L .738 -.051 L .94 -.167 L .895 -.118 L .938 -.101 L .886 .032 L 1.432 .477 L 1.452 .179 L .42 .115 L 1.225 .443 L -.013 .312 L -.504 .083 L -.35 .247 L .305 .147 L 1.823 .979 L -.162 -.392 L -.024 -.312 L .456 -.05 L .617 -.132 L -.062 -.181 L -.972 -.656 L -.128 -.198 L -.145 -.445 L .121 -.745 L .35 -.034 L 1.944 -.136 L .928 -.151 L .207 -.299 L .459 -.217 L .613 -.035 L 1.098 .281 L 1.528 .279 L .968 .064 L .969 -.102 L .612 .414 L .248 .082 L .962 .213 L 1.211 .13 L .678 .081 L 1.146 -.002 L .879 -.2 L 1.755 -.02 L 1.876 .029 L 1.07 -.052 L 1.18 -.267 L .959 .478 L .95 .296 L .522 -.018 L .243 -.314 L -.017 -.513 L -.666 -.231 L -.732 -.131 L -1.377 -.064 L .089 -.449 L 1.193 -.085 L .575 .065 L .804 .214 L .871 .198 L .858 .048 L .498 .198 L .088 .183 L -.095 .132 L -.287 .86 L .179 .51 L .304 .164 L .177 .065 L .792 .097 L .951 .311 L -.071 -.559 L -.466 -.989 L .137 -.48 L .258 -.266 L .712 .015 L .811 -.035 L 1.229 -.85 L .492 -.051 L .479 -.001 L .517 -.151 L .033 -.133 L -.15 -.367 L -.375 -.35 L -.307 .001 L -.81 .185 L -.988 -.082 L .535 -.52 L .806 -.069 L .435 -.168 L .572 -.001 L .739 .4 L .464 .167 L .065 -.268 L -.081 -.956 L -.744 .069 L -.897 -.032 L -.68 -.116 L -.859 -.318 L -.725 .085 L -1.245 -.183 L -.861 -.234 L -.956 -.218 L -.657 -.338 L -.092 -.136 L -.022 -.324 L .33 -.137 L .842 -.463 L -.486 -.221 L -1.188 -.375 L .09 -.207 L .58 -.604 L .593 -.294 L .387 -.035 L 1.032 .257 L .139 -.035 L .173 -.346 L -.709 -.362 L -.201 -.277 L .23 -.035 L .551 -.331 L .367 -.035 L 1.841 -.021 L .559 .086 L .728 .189 L 1.26 .449 L .432 .328 L .195 .38 L -.246 .603 L 1.261 .53 L .809 .495 L 1.134 .493 L -.377 .341 L -.985 .036 L -.474 .273 L -.416 .557 L .471 .067 L 1.071 .233 L .805 .049 L .387 -.136 L .597 -.001 L 1.477 .351 L -.335 .353 L -.563 .219 L .092 .151 L .796 .467 L .358 .601 L .025 .833 L .303 -.063 L .021 -.004 L .411 -.067 L .608 -.367 L .655 -1.137 L .668 -.42 L .523 .016 L .731 .284 L 1.064 .55 L .473 .383 L .209 .45 L -.159 .433 L -.336 .034 L -.796 -.098 L -.202 .299 L -.043 .415 L .35 .396 L 1.146 .659 L .61 .493 L .463 .279 L .595 -.166 L .896 -.167 L .369 -.132 L .208 -.66 L .764 -.398 L .599 -.416 L .249 -.664 L .363 -.75 L .237 -.184 L 1.394 .081 L .329 -.067 L .134 -.518 L -.985 -.333 L -.918 -.35 L .088 -.891 L .595 -.271 L .787 .032 L .42 -.068 L .571 .016 L 3.459 .616 L 1.325 .669 L .506 -.001 L .553 -.068 L .454 .201 L .244 1.036 L -.474 .268 L -.431 .101 L -.243 -.05 L -.718 -.532 L -.263 0 L -.799 .269 L .123 .316 L .309 .515 L .699 .729 L .855 .528 L 1.108 .576 L .024 .313 L -.478 .642 L -.439 .181 L -1.407 .772 L -.674 .083 L -1.123 .509 L -.763 -.276 L -1.654 -.962 L -.586 -.262 L -.497 -.048 L -.684 .281 L 1.364 .521 L 1.483 .896 L -.708 .067 L -.691 -.081 L -1.288 .084 L -.375 -.129 L -.596 -.62 L -1.147 -.014 L -1.857 .118 L -.253 .229 L .614 .244 L 1.311 .421 L -.159 .195 L -.611 .327 L -2.045 1.106 L -.657 .179 L -.527 .001 L -.859 -.241 L -.816 -.484 L -.225 -.081 L -1.189 -.225 L -.736 -.259 L -.598 -.112 L -.947 .014 L -.289 .004 L -1.214 .174 L 1.503 .278 L 1.136 .21 L 1.751 .774 L 1.629 .433 L 1.233 .126 L 1.02 .031 L -.618 1.091 L -1.237 .705 L -.856 .432 L -.728 .161 L -.829 .049 L -.928 -.126 L -1.062 -.38 L -.048 .351 L -.025 .287 L .321 .572 L -.02 .159 L -.741 .031 L -.058 .002 L -1.365 -.108 L -1.649 -.41 L -.884 -.078 L -2.962 -.322 L 2.146 .864 L 1.576 .156 L 1.367 .267 L .562 .205 L .33 .268 L -.011 .19 L -.642 .333 L -1.106 .207 L -1.429 -.076 L -.511 -.062 L -.367 .269 L 1.254 .423 L -.469 .426 L -1.06 .316 L -1.454 .662 L -.421 .252 L .218 .704 L -.313 .235 L -.909 .205 L -.31 .282 L -.529 .64 L -.276 .296 L -.241 .669 L -.274 .543 L -.323 .666 L .056 .416 L -.161 .554 L .123 .875 L .136 .536 L .598 .366 L .25 .015 L .257 .091 L .664 .014 L 1.164 -.094 L .276 .045 L .367 .29 L .413 .763 L .813 1.157 L .22 .668 L -.132 .91 L .673 .014 L 1.874 -.428 L 1.261 -.033 L .723 .074 L .535 .157 L 1.062 .311 L 2.129 .435 L 1.896 .903 L .993 .933 L 3.5 .67 L .644 .225 L .982 .403 L .986 .253 L .553 .104 L .702 -.091 L .453 .044 L .828 -.077 L 1.245 .163 L 1.407 .207 L .401 .194 L -.297 .702 L -.142 .85 L .154 .283 L .307 .342 L .07 .416 L -.115 1.025 L -.309 .593 L .022 .208 L .604 .266 L .481 .339 L .264 .354 L .046 .488 L -.076 .354 L .97 .116 L .963 .47 L .676 .588 L .392 .588 L .078 .162 L .64 .014 L .726 .41 L .907 .601 L -.349 -.66 L -.22 -.279 L .134 -.338 L .573 -.414 L .365 .176 L .381 .456 L .262 .353 L .165 -.354 L .107 -.545 L -.215 -.456 L .541 -.532 L .139 -.546 L -.183 -.517 L -.337 -.458 L -.261 -.754 L -.004 -.548 L -.205 -.593 L -.218 -.43 L .615 -.016 L -.097 -.476 L -.296 -.252 L -.657 -.163 L -.375 -.282 L -.326 -.923 L 1.252 -.271 L .872 -.241 L .625 -.271 L 1.758 -.949 L .629 -.302 L 1.043 -.935 L .434 -.544 L .237 -.665 L .054 -.529 L -.257 -1.045 L -.246 -.531 L -.239 -.319 L -.938 -.729 L -.467 -.274 L -1.105 -.532 L -.363 -.122 L -.453 -.274 L -.151 -.046 L -.293 -.351 L .08 -.107 L .868 -.522 L .553 -.875 L .293 -.416 L .25 -.092 L .447 -.017 L .295 -.277 L -.106 -.523 L -.18 -.355 L -.316 -.402 L -.048 -.202 L .258 -.357 L .005 -.264 L -1.751 -.105 L 1.084 -.92 L .503 -.704 L .007 -.125 L -.316 -.203 L -.609 -.265 L -.244 -.266 L -.043 -.533 L .305 -.425 L .554 -.315 L .57 -.19 L .827 .062 L 1.781 .374 L 1.097 .234 L .753 .077 L 1.44 .013 L 1.08 -.144 L .86 -.222 L .21 -.047 L .179 -.063 L .589 .078 L .991 .407 L .254 .125 L .754 .454 L .918 .375 L .796 .437 L -.294 .391 L .406 .233 L 1.698 .496 L 1.958 .354 L .725 -.033 L .368 -.203 L .339 .295 L -.013 .404 L -.577 .343 L -.123 .45 L .438 1.327 L .136 .722 L .23 .414 L -.049 .353 L -.248 .169 L -.445 -.014 L -.347 -.015 L -.138 .674 L .375 .274 L 1.137 -.415 L .366 -.047 L .781 -.047 L .286 .015 L .677 .32 L .378 .351 L .004 .259 L -.081 .123 L .277 .32 L .516 -.184 L .306 -.046 L 1.173 -.079 L .636 -.184 L .436 -.383 L .333 -.551 L .326 .015 L .194 .122 L .693 .717 L .042 -.062 L .108 -.764 L .317 -.583 L .475 -.262 L .539 -.385 L -.651 -.505 L .008 -.308 L .272 -.139 L .98 -.094 L .193 -.139 L .512 -.665 L .667 .37 L .607 .599 L .785 .506 L .596 .797 L 1.045 .764 L .264 .352 L -.344 .291 L .095 .335 L .573 -.031 L .365 .777 L .182 .183 L .324 .121 L .743 .136 L .281 .258 L .133 .38 L -.379 .092 L -.416 .168 L .411 .318 L .397 .227 L .77 .196 L .279 .227 L .034 .424 L -.056 .076 L -.409 .106 L -.676 -.029 L -.745 -.12 L -.316 .061 L .091 .166 L .273 .181 L .189 .241 L .333 .513 L .411 .226 L .634 .029 L .462 .18 L .838 .496 L .899 .435 L .246 .33 L -.035 .195 L -.447 .781 L .508 .059 L .663 -.166 L .786 -.077 L .79 .164 L .574 .194 L 1.162 .49 L .981 .132 L 1.517 .295 L -.184 .253 L -.718 .21 L -.736 .21 L -.663 .046 L -.834 .24 L -.583 .402 L -.65 .225 L -1.032 .061 L -.286 .075 L -.324 .268 L .029 .371 L -.271 .535 L 1.175 -.343 L .542 -.09 L .649 -.105 L 1.201 -.774 L 1.251 -.478 L 1.146 -.106 L .662 .237 L .35 .341 L -.398 .446 L .036 .119 L .307 .296 L .616 -.224 L .455 -.164 L .655 .192 L 1.051 .487 L .226 .251 L .022 .178 L -.299 .43 L -.05 .355 L -.406 .444 L 1.001 .929 L -.365 .37 L -.795 .282 L -1.078 .621 L -.662 .281 L -1.097 .046 L -.823 .119 L -1.548 .077 L -.433 .413 L -.916 .795 L -.686 .427 L -.612 .294 L -.938 .222 L -1.494 .172 L -1.845 .127 L -1.452 -.07 L -2.031 -.084 L -.355 .03 L -1.073 .075 L -1.058 -.012 L -1.873 -.099 L -.917 -.027 L -1.758 .106 L -.547 .206 L -.523 .294 L -.537 .585 L -.205 .554 L -.287 .335 L -.591 .19 L -1.07 .104 L -.537 .147 L -1.098 .555 L -.774 .54 L -.794 .612 L -.325 .363 L -.33 .233 L -.868 .843 L -.485 .566 L -.418 .276 L -.46 .58 L -.518 .968 L .749 -.737 L .375 -.131 L .688 -.479 L 1.059 -.944 L 1.097 -.785 L 2.028 -.948 L 1.245 -.395 L 1.797 -.512 L 1.065 -.235 L 1.03 -.235 L 1.473 -.148 L .922 .056 L .895 .289 L .509 .29 L .136 .189 L .144 .464 L -.125 .218 L -.326 .219 L -1.059 .292 L -.753 .452 L -.581 .044 L -.845 -.23 L -.726 .045 L -.645 .19 L .279 .08 L 1.13 .229 L .17 .122 L .256 .444 L .074 .095 L 1.299 -.485 L -.028 .216 L .479 -.148 L .372 .162 L -.36 .229 L -.231 .256 L .112 .27 L -.163 .014 L -.074 .229 L -.91 .444 L 1.216 .013 L .077 .188 L -.187 .282 L .091 .43 L .118 -.081 L .239 .134 L -.063 .134 L .048 .202 L .351 .457 L .009 .147 L .824 .054 L .154 .094 L .04 -.067 L .727 .147 L -.315 .134 L -.373 -.013 L -.047 .134 L .525 .147 L .211 .241 L .569 -.081 L .135 .134 L .212 -.014 L .134 .174 L .418 -.04 L -.075 -.107 L .843 .067 L .241 .107 L -.207 .201 L .242 -.107 L .26 .027 L .245 -.013 L .696 -.362 L .303 -.081 L .104 .362 L .377 .161 L .538 -.121 L .488 .416 L -.405 .254 L .089 .107 L .825 .027 L .164 .174 L -.521 .121 L -.161 -.121 L -.3 .134 L .118 .094 L -.515 0 L -.23 -.04 L .109 .161 L -.45 .04 L .056 .107 L -.443 .014 L -.128 .147 L -.45 .04 L -.368 .253 L -.09 -.106 L -.706 .28 L -.046 .053 L -.529 .133 L -.119 -.267 L -.274 .106 L -.163 .267 L -.188 -.187 L -.068 .253 L -.218 .08 L -.094 .187 L -.513 0 L -.081 -.08 L -.169 -.053 L .032 -.347 L -.242 .36 L -.202 .12 L -.131 -.253 L -.354 .027 L .043 .24 L -.233 .04 L .312 .08 L .033 .213 L -.103 .12 L -.174 -.067 L -.768 .453 L .127 .16 L -.235 .12 L -.194 .053 L .015 .213 L -.161 -.12 L .083 .173 L -.217 .08 L -.14 -.107 L .096 .253 L -.222 .066 L -.146 -.08 L -.148 0 L -.064 .133 L -.156 -.106 L -.243 .227 L -.086 .292 L -.201 -.226 L -.344 .133 L -.154 -.187 L -.349 -.479 L -.138 .24 L -.419 -.866 L .456 -.773 L .284 -.16 L .035 -.12 L -.35 .12 L -.357 .267 L -.076 -.106 L .924 -.507 L .125 .146 L .195 -.093 L -.258 -.107 L 1.103 -.52 L 1.109 -.562 L .658 -.361 L .336 .094 L -.067 .428 L .179 -.054 L .258 .281 L -.044 -.201 L -.017 -.174 L .632 -.214 L .73 -.134 L .192 .067 L .202 -.081 L -.152 -.094 L -.653 -.053 L -.595 .053 L -.42 -.053 L -.804 -.014 L -.306 .027 L -.251 .081 L -.246 .094 L .033 -.214 L 1.128 -.563 L .054 -.201 L .252 -.08 L -.052 -.174 L -.523 .281 L .097 -.134 L -.502 -.51 L .309 .443 L -.36 .482 L -.328 .013 L -1.974 .817 L -.284 .08 L -.362 -.201 L -.227 -.067 L .23 .201 L -.788 .401 L -.219 -.174 L -1.019 -.054 L -.124 .147 L -.38 -.241 L h 186.193 47.833 m -.713 -.032 L -.922 -.181 L -.882 -.065 L -1.25 -.314 L -.973 -.182 L -.604 -.049 L -1.083 -.199 L .43 -.335 L 1.542 -.405 L .385 -.186 L .115 -.673 L .305 -.236 L .831 -.069 L .743 .184 L 1.436 .603 L 1.287 .4 L .074 .285 L .315 .284 L 1.094 .516 L -.288 .117 L -1.263 .486 L -.578 .051 L h 231.09 50.646 m -1.319 -.03 L -.449 -.147 L -.232 -.247 L -.173 -.478 L .3 -.43 L .708 -.664 L .662 -.267 L 1.359 -.168 L .911 .197 L .79 .314 L -.021 .464 L -.039 .727 L -.362 .265 L -1.025 .348 L -1.108 .117 L +444.972 79.145 N .47 -.218 L .307 -.093 L -.294 -.024 L -.419 .061 L -.15 -.135 L -.125 .184 L -.108 -.012 L .066 -.491 L .177 -.218 L .41 .009 L 1.489 .062 L .417 .014 L .339 -.075 L .121 -.253 L -.175 -.288 L .246 -.05 L -.068 -.122 L -.068 -.123 L .353 -.096 L .12 -.034 L .051 .154 L .086 .052 L .24 0 L .223 .12 L .257 .069 L .514 .068 L .086 .103 L .223 -.051 L .445 0 L .257 0 L .223 -.017 L .086 .137 L .103 .103 L .188 .034 L .171 .069 L .018 .137 L .052 .12 L -.224 .12 L -.068 .154 L -.068 .206 L .018 .171 L .034 .137 L .029 .038 L -2.96 .101 L -2.246 -.115 L -.842 -.006 L h 717.633 81.109 m .42 .443 L .429 .62 L .183 .457 L .01 .767 L -.244 .442 L -.197 .78 L -.002 .764 L .29 .777 L .592 .849 L .65 1.446 L .899 1.614 L 1.115 1.679 L -1.26 -.677 L -.832 -.39 L -.99 -.056 L -.268 .088 L -.396 .204 L -.462 1.045 L -.266 1.101 L -.082 .579 L .277 .982 L .183 .216 L .659 .908 L .54 .201 L .463 .648 L -.314 1.246 L -.664 -1.258 L -.866 -.301 L -.224 .029 L -.415 .303 L -.311 .534 L -.643 .907 L -.422 -.5 L -.19 -.929 L .637 -1.146 L -.395 -.884 L .175 -.454 L .502 -.63 L -.131 -.723 L -.196 -.376 L -.27 -.55 L -.062 -.235 L .403 -.302 L .284 -.915 L .075 -.784 L .005 -1.326 L .15 -1.302 L -.09 -.732 L -.213 -.469 L -.83 -.85 L -.1 -.897 L .114 -.192 L .359 -.722 L .065 -.738 L -.336 -.457 L .172 -.237 L .374 -.03 L .62 -.031 L 1.023 -.534 L h 471.158 84.281 m -.002 -.142 L -.165 -.066 L -.082 -.115 L -.164 -.082 L .033 -.099 L -.033 -.23 L -.033 -.164 L .082 -.099 L -.147 -.131 L -.099 -.148 L .132 -.066 L 0 -.165 L -.296 -.164 L -.279 -.263 L -.017 -.164 L .099 -.131 L .131 -.165 L .362 -.017 L .328 .049 L .197 .132 L .51 .016 L .525 -.099 L .444 -.247 L .049 -.065 L .148 -.083 L .296 0 L .065 -.164 L -.033 -.131 L -.279 -.066 L -.296 -.148 L -.099 -.181 L .082 -.017 L .066 -.049 L .032 -.065 L -.263 -.066 L -.361 -.099 L -.378 -.066 L -.361 .066 L -.182 -.066 L .066 -.181 L .099 -.197 L -.066 -.148 L -.164 -.099 L -.279 -.082 L -.23 -.066 L -.443 -.213 L -.115 -.23 L -.164 -.263 L -.214 -.017 L -.017 -.099 L .066 -.131 L .099 -.115 L -.132 -.033 L -.181 .049 L -.082 -.115 L -.132 -.181 L -.345 -.049 L .049 -.147 L .033 -.165 L .099 -.049 L .115 -.082 L 0 -.083 L .114 0 L .066 -.131 L -.05 -.164 L -.147 -.099 L -.197 -.247 L .131 -.165 L .033 -.164 L 0 -.083 L .065 -.115 L -.049 -.115 L -.147 .033 L -.165 -.033 L -.147 -.099 L -.099 -.099 L -.279 -.099 L -.132 -.131 L -.542 -.115 L -.247 .049 L -.099 -.049 L -.131 -.049 L -.23 .083 L -.147 .099 L -.165 0 L -.279 .016 L -.214 .197 L -.197 0 L -.164 -.148 L -.065 -.148 L .017 -.099 L .164 -.099 L 0 -.115 L -.147 -.017 L -.296 -.065 L -.312 -.049 L -.361 .049 L -.214 .065 L -.197 .033 L -.082 -.148 L -.132 -.148 L -.312 -.033 L -.181 -.016 L -.197 .131 L -.229 -.066 L -.165 -.147 L .061 -.042 L .015 -.117 L .044 -.087 L -.088 -.233 L .015 -.189 L -.131 -.117 L .059 -.087 L -.16 -.043 L -.146 -.102 L -.029 -.16 L -.131 -.058 L -.116 -.102 L .043 -.073 L .059 -.087 L -.073 -.044 L -.087 -.014 L -.131 -.073 L -.146 .015 L -.204 .059 L .044 -.102 L .102 -.073 L .073 -.087 L -.029 -.117 L .072 -.131 L -.131 -.087 L .103 -.029 L .087 -.015 L .102 -.073 L .015 -.087 L .029 -.116 L .015 -.087 L -.204 -.058 L -.087 -.073 L -.204 -.087 L -.232 -.073 L 0 -.117 L .015 -.116 L -.37 .004 L -.081 -.106 L .116 -.058 L 461.402 72 l .029 -.117 L .131 0 L .087 -.116 L .059 -.102 L .16 -.058 L .262 -.043 L .175 -.073 L -.059 -.059 L -.175 -.043 L -.043 -.146 L -.015 -.087 L 0 -.073 L -.088 -.073 L -.203 -.087 L -.175 -.233 L 0 -.175 L .175 -.131 L -.029 -.16 L -.073 -.189 L -.131 -.437 L -.029 -.16 L .088 -.16 L .204 -.131 L .319 -.131 L .219 -.204 L .175 -.277 L .058 -.131 L .088 -.043 L .116 0 L .189 0 L .175 -.044 L .043 -.174 L -.16 -.131 L -.145 -.053 L -.089 -.13 L -.17 -.038 L .1 -.253 L .339 -.038 L .153 .165 L .229 .063 L .188 -.088 L -.094 -.139 L .301 -.154 L .485 .199 L .296 -.062 L .312 -.338 L .311 -.185 L .75 .106 L .781 .275 L .439 0 L .363 -.154 L -.386 -.399 L -.59 -.323 L -.393 -.03 L -1.204 .08 L -.616 -.091 L -.271 -.108 L -.299 -.309 L .258 -.434 L -.065 -.201 L -.199 .044 L .174 -.285 L 1.946 -1.145 L 1.983 -1.195 L 1.385 -.758 L .591 -.536 L .43 -.536 L .105 -.409 L -.161 -.346 L -.436 -.392 L -.703 -.265 L -1.357 -.499 L -.439 -.33 L .327 -.191 L .542 -.415 L .057 -.254 L -.151 -.253 L -1.286 -1.395 L -.37 -.509 L .029 -.37 L .187 -.403 L .44 -.535 L .196 -.356 L -.772 -1.195 L -1.402 -1.394 L .328 -.296 L 1.303 -.777 L .421 -.364 L -.543 -.392 L -.964 -.506 L -.872 -.194 L -.563 -.212 L -.116 -.529 L .258 -.465 L .024 -.283 L .689 -.303 L 1.013 -.672 L 1.023 -.49 L .77 -.121 L .824 -.021 L .514 -.204 L .404 -.288 L .617 -.051 L 1.002 -.254 L .643 -.237 L .01 .151 L .255 .386 L .358 .284 L .543 .2 L .919 .082 L .602 .1 L .078 .602 L .695 -.319 L .421 .049 L 1.083 .048 L .875 .015 L .522 .032 L 1.116 -.002 L 1.293 .281 L 2.728 .512 L .984 .364 L 1.595 .86 L .583 .214 L 1.48 .246 L 1.296 .212 L 2.018 .623 L .328 .279 L -.051 .444 L .147 .295 L .426 .294 L .104 .294 L -.24 .344 L -.69 .491 L -1.092 .54 L -.816 .262 L -1.75 .36 L -.907 .083 L -1.631 -.013 L -1.391 -.192 L -2.038 -.175 L -1.63 -.192 L -1.342 -.339 L -2.256 -.485 L -1.114 -.112 L -.476 -.048 L -.621 -.473 L -.371 -.163 L -.771 -.13 L -.943 .117 L .307 .163 L .149 .065 L .73 .538 L .482 .146 L 1.109 .601 L .832 .291 L .921 .161 L .634 .242 L .405 .453 L -.002 .405 L -.276 .291 L -.684 .195 L .086 .113 L .208 .531 L .771 .943 L .093 .494 L .155 .207 L .438 .174 L 1.203 .078 L .872 .125 L .499 .619 L .401 .095 L 1.26 .077 L .575 .126 L .364 .079 L .402 -.128 L .785 -.097 L .243 -.302 L -.001 -.318 L -.387 -.397 L -.471 -.079 L -.455 .096 L -.447 -.031 L -.589 -.206 L -.952 -.795 L .701 -.674 L .484 -.001 L 1.116 .479 L 1.441 .333 L 2.09 .427 L .952 .078 L .834 -.146 L .723 .174 L .261 -.224 L .05 -.415 L -.214 -.239 L -.858 -.656 L -.348 -.628 L .285 -.323 L .19 -.049 L 1.432 -.423 L 1.495 -.359 L .599 -.244 L 1.133 -.717 L .172 -.049 L .462 .064 L 1.829 .29 L 1.41 .533 L .341 -.001 L .052 -.065 L .154 -.503 L .581 -.767 L -.048 -.653 L -.317 -.408 L -.847 -.163 L -.3 -.229 L 1.139 -1.005 L .101 -.247 L -.205 -.594 L -.771 -.512 L .069 -.315 L .353 -.051 L 1.458 .23 L 2.025 -.12 L .631 .132 L .664 .611 L .616 .445 L .433 .461 L -1.045 .051 L -1.559 .085 L -.822 .215 L -.492 .51 L .191 .18 L .952 .293 L .732 .555 L .804 .194 L .723 .097 L 1.268 -.133 L 1.33 -.084 L .301 -.164 L .257 -.491 L .291 -.591 L .284 -.412 L 1.232 -.2 L 1.223 -.414 L .988 -.216 L 1.924 -.483 L 1.429 -.251 L 1.537 -.318 L .921 -.3 L .205 .464 L .278 .083 L .571 -.117 L .487 -.266 L .148 -.465 L .386 -.167 L .718 -.135 L .859 .065 L -.18 .399 L -.058 .597 L -.858 .084 L -.178 .149 L .002 .215 L .687 .197 L .507 -.083 L 1.169 -.167 L .436 -.001 L .161 .198 L .23 .049 L .278 -.133 L .264 -.216 L .29 -.431 L .464 -.183 L .861 -.118 L 1.049 -.068 L .768 .032 L 1.075 .23 L .755 -.018 L .36 -.083 L .963 -.467 L 1 -.285 L .803 -.052 L .952 .182 L .326 .166 L -.631 .45 L .129 .232 L .217 .099 L .632 .131 L .579 -.018 L .288 -.232 L .074 -.398 L .342 -.084 L .962 .065 L .543 -.184 L .395 -.316 L .115 -.417 L -1.37 -1.033 L .405 -.168 L .66 -.37 L .403 -.068 L .609 .016 L 2.171 .063 L 1.272 .199 L 1.241 .149 L 1.135 .199 L 2.111 .515 L 1.071 .098 L 1.712 .414 L 1.02 .248 L 1.305 .53 L 1.455 .611 L .864 .379 L .376 .049 L .229 -.1 L 1.145 -1.047 L .236 -.3 L -.927 .035 L -.4 -.049 L -.564 -.232 L -.365 -.433 L .027 -.652 L -.727 -.283 L -1.987 -.147 L -.19 -.268 L .064 -.168 L .305 -.303 L .693 -.255 L .236 -.153 L .085 -.187 L -.052 -.833 L -.251 -.238 L -1.135 -.066 L -.232 -.29 L .328 -.532 L .359 -.241 L .391 -.035 L 1.482 -.416 L 1.098 -.485 L .521 -.416 L .581 -.608 L .544 -1.22 L .637 -.421 L .374 .069 L 1.562 .155 L 1.613 -.125 L 1.605 -.091 L .695 .069 L 1.066 -.055 L .574 .122 L .309 .279 L -.018 .332 L -.423 .836 L -.348 .348 L -1.334 .833 L -.223 .345 L .752 .342 L .931 .667 L .277 .342 L .21 .818 L -.174 .222 L -.575 .375 L .254 1.179 L -.058 1.305 L .263 .583 L .45 .381 L 1.027 .264 L .19 .166 L -.001 .133 L -.485 .481 L -.417 .826 L -.333 .33 L -.784 .462 L -1.232 .625 L -.63 .198 L -.55 .263 L .321 .522 L -.433 .115 L 558 52.195 l -1.599 -.372 L -.731 -.08 L -.97 .034 L -.601 .115 L .195 .31 L .583 .276 L .738 .21 L 1.569 .208 L 1.133 .079 L .613 -.05 L 1.188 .144 L .922 -.034 L .472 -.358 L .303 -.358 L 1.352 -.328 L 1.166 -.492 L .268 -.278 L .386 -.606 L .818 -.313 L .864 -.626 L .064 -.362 L -.225 -.561 L -.609 -.545 L .244 -.548 L .237 -.1 L .677 -.151 L 1.38 -.152 L 1.757 -.003 L .74 .231 L .842 .463 L .151 .778 L -.34 1.023 L .302 .279 L .92 .212 L 1.298 .047 L .864 -.149 L .129 -.296 L -.514 -.18 L -.797 -.18 L -.571 .034 L -.457 -.098 L .068 -.379 L 1.03 -.382 L .065 -.249 L -.218 -.148 L -.166 -.331 L -.441 -.763 L -.511 -.266 L -.836 -.098 L -1.093 -.231 L -.801 -.116 L -1.288 -.165 L -.91 .186 L -.638 .101 L -1.297 -.181 L -.896 .019 L -.015 -.267 L -.564 -1.071 L .305 -.657 L .736 -.697 L .282 -.46 L -.134 -.221 L -1.092 -1.042 L -.949 -.514 L -.12 -.189 L .833 -.554 L 1.213 -.106 L .998 -.262 L .744 -.348 L .172 -.226 L .169 -.644 L -.13 -.663 L .23 .069 L .64 .051 L .466 .086 L .108 .471 L -.186 .54 L -.636 .608 L -.167 .554 L .14 .448 L .373 .274 L .485 .274 L 1.384 .134 L 1.574 .169 L 1.632 .083 L .819 .409 L .321 .017 L .799 -.036 L -.527 -.89 L -.521 -.274 L -1.893 -.1 L -.931 -.067 L -.576 -.154 L -.609 -.448 L .275 -.329 L 1.374 -.054 L .444 .172 L 1.145 .084 L .747 -.157 L -.09 -.728 L .408 -.088 L .84 -.105 L 1.278 -.02 L 1.067 .207 L 1.413 .379 L 1.088 .535 L 1.326 .343 L .547 .085 L 1.822 .014 L .727 -.174 L .138 .345 L -.781 .38 L -.696 .259 L -.248 .771 L -.129 .972 L .333 .136 L .68 -.785 L .387 -.292 L .285 .051 L .604 .528 L -.088 .749 L .743 -.205 L .681 -.273 L -.044 -.306 L -.191 -.119 L -.147 -.358 L -.748 -.821 L .188 -.223 L .686 -.759 L -.797 -.448 L -.772 -.258 L -.93 -.241 L -.257 -.382 L -.655 -.051 L -.979 -.242 L -1.34 -.207 L -.307 -.296 L .062 -.577 L -.096 -.386 L -.811 -.667 L .081 -.247 L .266 -.16 L .484 -.125 L 2.31 -.11 L 2.54 -.022 L 2.125 -.128 L 1.421 -.162 L .475 .317 L .382 .052 L .844 -.267 L 1.056 -.286 L 1.413 -.109 L .589 .194 L -.957 .338 L -.451 .407 L 1.737 -.233 L .521 -.107 L .955 -.374 L .27 -.284 L -.334 -.444 L -.326 -.177 L -.925 -.266 L -.365 -.303 L -.002 -.232 L .324 -.539 L 1.176 -.397 L .966 -.22 L 3.028 -.903 L .889 -.094 L .248 -.036 L .522 -.076 L 1.899 -.096 L 1.663 -.114 L 2.302 -.244 L 2.048 -.263 L 1.595 -.43 L .855 -.243 L 1.763 .034 L 1.065 -.002 L .383 .185 L -.351 .409 L 1.504 .108 L 1.018 -.039 L 1.261 -.188 L 1.345 -.225 L .95 -.039 L .982 .166 L .687 .073 L .693 -.206 L .12 -.335 L -.133 -.167 L .466 -.337 L .942 -.077 L .939 .036 L 1.243 -.377 L -.618 -.506 L .122 -.34 L 1.165 -.438 L 1.554 -.383 L 2.23 -.406 L 1.229 -.077 L .993 .056 L 1.486 -.003 L .86 .265 L .045 .266 L -1.528 .401 L -.66 .342 L .488 .15 L 1.83 -.117 L 1.588 .148 L 2.039 -.079 L .177 .113 L -.375 .283 L -1.187 .453 L -.296 .3 L 1.971 -.004 L .833 -.02 L .234 .093 L 1.052 -.545 L 1.366 -.002 L 1.771 -.097 L .631 .13 L 1.35 -.021 L 1.954 .165 L 1.4 .259 L 1.181 .427 L .52 .445 L .726 -.001 L .854 -.076 L .422 .5 L -1.354 .832 L .241 .128 L .896 .365 L -2.329 .859 L -1.035 .235 L -1.166 .11 L -3.404 1.061 L -3.018 .965 L -.793 .285 L -2.388 .375 L -2.35 .586 L -2.065 1.126 L .715 .017 L 1.081 -.247 L .922 -.458 L 1.663 -.161 L 1.231 -.02 L 2.101 -.268 L 1.879 -.286 L .879 -.107 L 1.004 -.284 L -.094 -.389 L -.492 -.123 L -.034 -.071 L .281 -.249 L .581 -.214 L .873 .211 L .603 .389 L .621 .052 L .593 .193 L .737 .052 L .853 -.055 L 1.155 -.268 L .499 .07 L .192 .3 L .009 .512 L .522 .404 L 1.422 -.778 L 1.66 -.021 L 1.506 -.145 L 2.354 .014 L 1.919 .155 L .854 .034 L 1.204 .033 L -.271 .74 L .354 .333 L 2.043 .154 L .848 .121 L .698 .069 L 1.035 .103 L 2.49 -.145 L 1.209 -.02 L 1.42 .348 L 1.405 -.932 L -.161 -.352 L -.038 -.229 L -.034 -.105 L 1.806 -.48 L .521 -.019 L .802 .104 L 1.148 .298 L .851 .281 L 1.711 .032 L 1.354 -.073 L 1.384 .033 L 1.323 .431 L .409 .181 L .058 .386 L -.52 .088 L -.268 .036 L -1.905 .406 L -2.438 .737 L -.233 .227 L .253 .069 L 1.033 .067 L .957 .016 L .659 .155 L .659 .293 L 1.014 .396 L .583 .172 L .78 .481 L 1.27 .805 L 1.814 .801 L 1.351 .305 L .612 -.018 L .795 -.394 L .843 -.72 L 1.093 -1.051 L .601 -.329 L .29 .017 L .236 .465 L .772 .308 L 1.346 .29 L 1.105 .135 L .848 -.087 L 1.973 -.468 L .778 -.07 L .813 .067 L 1.196 .239 L 1.921 .734 L .315 -.052 L .186 -.069 L .491 -.258 L .221 -.258 L -.137 -.051 L .013 -.189 L .726 -.312 L .509 -.018 L .5 .257 L .575 .188 L 1.302 .032 L .181 -.5 L -.194 -.466 L .15 -.363 L .093 -.521 L -1.131 .159 L -.643 .001 L -.179 -.104 L .442 -.296 L .318 -.087 L .986 -.089 L 1.021 -.02 L .832 -.141 L 1.566 -.648 L .254 0 L 1.76 .241 L 1.561 .137 L 2.036 .188 L .997 .068 L .654 .103 L 2.307 .065 L -1.732 .628 L .865 .051 L 1.011 -.089 L .335 .138 L -.305 .381 L -.926 .192 L -.846 .261 L -.177 .293 L .664 .033 L .52 -.122 L .916 -.14 L .978 -.33 L 1.62 -.799 L 2.766 .012 L 1.196 .067 L .903 .172 L .946 .137 L .205 .19 L .221 .104 L -2.247 .59 L .559 .137 L 1.674 .289 L 2.174 .202 L .946 .204 L .801 .375 L .367 .427 L .564 .357 L .522 .152 L 1.459 -.037 L 1.364 -.105 L 1.138 -.139 L 2.518 -.329 L 2.208 -.107 L 3.008 .131 L 1.515 .134 L .734 .118 L 1.168 .424 L .655 .169 L .525 .338 L .361 .39 L -.123 .491 L -.286 .521 L .509 .25 L .764 .065 L .835 .015 L .643 .083 L -.017 .685 L .419 .416 L .686 -.168 L .545 -.435 L 1.211 -.387 L .348 -.067 L .35 .049 L 1.696 -.02 L 1.521 -.288 L .736 .032 L .588 .434 L .707 .116 L 1.541 .014 L 2.176 .062 L .869 -.118 L 1.378 -.504 L .406 .2 L .93 .533 L .396 .216 L 1.095 .265 L .875 .332 L .282 .398 L .612 .148 L 1.556 -.136 L 1.653 -.319 L .16 -.25 L -.248 -.333 L -.805 -.833 L -.833 -.115 L .4 -.336 L .479 -.571 L 1.89 .098 L 1.214 .082 L 1.135 .065 L 1.221 .166 L .222 .318 L 1.396 -.153 L 2.084 -.054 L 2.304 .013 L 1.292 .148 L .786 .199 L 1.185 .199 L 1.391 .098 L .751 .182 L 1.302 .332 L .747 .065 L .703 .182 L 1.145 .505 L 0 2.126 L 0 2.222 L 0 2.222 L 0 1.292 L 0 .157 L 0 .576 L 0 .219 L -1.083 .371 L -.651 .03 L -.645 .37 L -.56 .065 L -1.044 .065 L -.355 -.079 L -.928 -.052 L -.118 -.343 L -.271 -.211 L -.501 .027 L .241 -.185 L -.938 .324 L -.846 .02 L -.337 -.211 L -.478 -.079 L .424 .501 L -.569 .29 L .32 .103 L .942 .205 L .634 -.36 L .395 .041 L .335 .079 L 0 .477 L .248 .206 L .76 .269 L 1.059 -.228 L -.439 .322 L .741 -.243 L .065 .336 L .247 .206 L .187 .363 L .068 .189 L -.722 .522 L .593 -.064 L .349 .172 L .473 .503 L .501 .157 L .145 .251 L -.162 .456 L .792 -.111 L -.125 .393 L .023 .25 L -.43 .299 L -.691 .205 L -.635 -.046 L -.448 -.14 L -1.243 -.154 L -.889 -.077 L -.347 -.14 L .123 -.267 L -.493 -.046 L -.304 .032 L -.559 .55 L -.069 .11 L -3.06 .913 L -1.155 .174 L -.245 0 L -.43 .203 L -.219 .188 L -.719 .22 L -.991 .033 L -.308 .11 L -.48 .405 L -.462 .203 L -.946 .033 L -.854 .622 L -.24 .279 L -1.67 .452 L -.392 .449 L -1.229 .25 L -.406 .14 L -.151 .293 L .01 .292 L -.473 .292 L -.406 .016 L -.586 -.306 L -.183 -.262 L -.169 -.37 L -.67 -.308 L -1.074 -.044 L -1.021 .048 L -1.159 .172 L -1.301 .188 L -.523 .217 L -1.333 .756 L -.536 .277 L -.184 -.138 L .575 -1.293 L -.55 .094 L -.392 -.097 L -.811 .531 L -.67 .186 L -.401 .155 L -.114 .506 L -.66 .154 L -.317 -.168 L -.253 -.49 L -.483 -.261 L -1.024 .636 L .261 -.204 L -.557 .062 L -.283 .092 L -.628 .522 L -.141 .261 L .126 .229 L .344 .152 L -.932 .521 L -.182 .199 L .342 .167 L -.647 .352 L -.88 .55 L -.626 .503 L -.298 .35 L -.01 .531 L .421 .317 L .477 .09 L 1.382 -.048 L .562 .166 L .11 .167 L -.436 .394 L -.752 .455 L -.181 .302 L .224 .512 L .292 .452 L .786 .089 L .165 .391 L -.014 .616 L -.349 .361 L -.528 .061 L -.481 -.209 L -.017 -.21 L .388 -.527 L -.444 -.014 L -.454 .242 L -1.014 .843 L -.56 .675 L -.237 .599 L .321 .672 L .647 .311 L .154 .237 L -.294 .387 L -.688 .313 L -.956 .031 L -.664 -.088 L -.344 .001 L -.619 .179 L -.837 .476 L -.214 .149 L -.525 .504 L -.137 .341 L .111 .281 L .492 .398 L .038 .221 L -.056 .133 L -.679 .238 L -.604 .016 L 753.44 82.4 l -.727 .296 L -.065 .251 L .067 .28 L -.161 .854 L -.293 .412 L -.8 .78 L -1.53 .971 L -.854 .5 L -.285 .103 L -.295 -.614 L -.198 -.821 L -.25 -.69 L -.064 -.794 L -.351 -.75 L -.305 -.383 L -.214 -.915 L -.514 -1.36 L -.008 -.578 L -.154 -.563 L -.017 -.327 L -.105 -.193 L -.262 -.817 L -.026 -.792 L .116 -.808 L .271 -1.396 L .167 -.226 L 1.185 -.86 L .716 -.424 L .57 -.695 L .14 -.227 L -.085 -.318 L -.139 -.166 L 1.632 -.367 L 1.001 -.305 L .811 -.32 L 1.729 -.884 L .641 -.412 L .431 -.428 L .14 -.335 L 1.784 -.889 L .872 -.445 L 1.535 -.861 L .368 -.293 L .26 -.433 L 1.252 -.435 L 2.106 -.514 L .257 -.434 L .773 -.528 L .086 -.233 L -.568 -.216 L .814 -.904 L -.036 -.483 L .183 -.391 L .598 -.204 L 1.729 -.082 L .513 -.063 L -.485 -.328 L -2.065 -.215 L -.71 .095 L -1.062 .174 L -.777 .189 L .042 .328 L -.664 .923 L .125 .202 L -.04 .14 L -.662 .11 L -.479 .11 L -1.555 .718 L -1.979 1.042 L -1.169 .342 L -.249 -.062 L .156 -.325 L .352 -.465 L -.933 -.076 L -.16 -.263 L .252 -.451 L .442 -.467 L .207 -.328 L -.069 -.202 L -.339 -.031 L -1.136 .454 L -.496 .032 L -.277 -.358 L -.589 -.17 L -1.606 .144 L -1.312 .111 L -.956 .08 L -.606 .157 L -.894 .359 L -.093 .436 L .082 .186 L -1.262 .53 L -.408 .233 L .149 .495 L -1.294 .357 L -1.019 .434 L -.84 .479 L -.496 .461 L -.332 .46 L .004 .383 L .527 .213 L 1.269 .043 L .278 .275 L .062 .122 L -1.152 .139 L -1.028 .262 L -1.045 -.059 L -.698 -.136 L -.382 .031 L -.311 .107 L -.721 .398 L -.695 -.35 L -1.112 .383 L -.747 .139 L -.487 -.09 L -.284 -.137 L .108 -.29 L .748 -.124 L .868 -.124 L .164 -.046 L -.741 -.64 L 736.444 68 l -1.06 .017 L -.854 .155 L -.353 -.061 L -.868 -.458 L -.775 -.029 L -.745 .047 L -.704 .246 L .042 .398 L -.26 .229 L -.477 .215 L -.695 -.243 L -.408 -.122 L -1.26 .063 L -.784 .093 L -.651 -.075 L -.887 -.136 L -.563 .078 L -.067 .122 L -.147 .474 L -.677 .017 L -.311 -.137 L -.038 -.382 L -.203 -.259 L -1.241 .094 L -1.014 -.059 L -1.257 .033 L -1.158 .063 L -.836 -.029 L -.18 .016 L -1.085 .292 L -.964 .444 L -.74 .474 L -.536 .504 L -.789 .245 L -.904 .336 L -.194 .152 L -1.047 1.17 L -1.634 .684 L -.949 .471 L -1.157 .711 L -1.653 1.253 L -.828 .572 L -1.573 .873 L -.893 .376 L -1.889 .871 L -.632 .388 L -.203 .298 L .018 .357 L .428 .281 L .485 .043 L .918 .013 L 1.046 -.15 L .656 .043 L -.329 1.261 L .016 .415 L .303 .103 L .63 -.09 L .601 -.371 L .761 .117 L -.127 .148 L 705.293 81 l -.112 .222 L .373 .073 L 1.645 -.018 L .566 -.238 L .39 -.519 L .017 -.638 L .763 .014 L .647 -.001 L .726 .014 L .951 .265 L .658 .354 L .486 .591 L .847 .575 L .426 .176 L .506 .324 L -.07 .148 L -.581 .355 L .453 .221 L .13 .309 L -.336 .723 L .491 .117 L .215 .235 L -.291 .515 L -.348 .397 L -.532 .559 L -.724 1.364 L -.181 .688 L .057 .219 L .24 .701 L -.188 .917 L -.098 .741 L -.403 1.408 L -.146 .493 L -1.928 1.538 L -.371 .435 L -.217 .65 L -.587 .42 L -.741 .579 L -.241 .361 L -.574 .981 L -.587 .606 L -.941 .778 L -1.784 1.512 L -.464 .474 L -.235 .458 L -.323 .33 L -.758 .388 L -.618 .416 L -.574 .702 L -.431 .458 L -.875 .673 L -.955 .487 L -1.838 .475 L -.798 .244 L -.278 -.427 L -.519 -.085 L -.243 .043 L -.337 -.185 L -.337 -.513 L -.663 .272 L -.464 .101 L .424 -.586 L -.624 .173 L -.506 .486 L -.649 .543 L -1.326 1.001 L -.072 .049 L -.167 -.393 L -.298 -.439 L .111 -.058 L 1.252 -.462 L .511 -.43 L .156 -.329 L -.112 -.299 L .097 -.128 L .025 -.385 L .006 -.613 L -.062 -.656 L -.332 -.897 L .048 -.557 L 1.664 -.982 L .396 .041 L .685 .24 L .679 .225 L .547 .098 L .47 -.347 L .551 -.69 L .329 -.432 L .627 -1.08 L .538 -1.066 L .278 -.893 L .291 -.707 L .66 -.393 L .566 -.407 L -.017 -.504 L -.116 -.389 L -.064 -.259 L -.246 -.114 L -.902 .034 L -1.181 .208 L -1.357 .31 L -.953 .308 L -.604 .22 L -1.657 .052 L -.649 .018 L -.68 .033 L -.261 -.446 L -.44 -1.283 L -.297 -.866 L -.205 -.144 L -2.659 -.839 L -1.523 -.253 L -1.247 -.341 L -.507 -.2 L -.436 -.389 L -.927 -1.903 L -.94 -1.588 L -1.087 -2.384 L -.742 -.952 L -.763 -.467 L -.539 -.026 L -1.386 .125 L -.683 -.188 L -1.037 -.481 L -1.148 -.215 L -.917 .049 L -1.203 .109 L -.836 .123 L -1.854 .143 L -.602 .136 L -.478 .165 L -1.193 .787 L -.375 .282 L -.119 .25 L .822 -.078 L .558 .026 L .465 .306 L .107 .249 L -.167 .794 L -1.371 .608 L -.599 .545 L -.667 .779 L -.416 .543 L -.422 .426 L -.103 .249 L .062 .146 L .35 .348 L .056 .306 L -.123 .233 L -.779 .339 L -2.44 .752 L -.438 .089 L -.343 .016 L -1.126 -.574 L -.452 -.172 L -.046 -.018 L -.431 -.168 L -.622 .018 L -1.228 .297 L -.86 -.169 L -.34 -.129 L -.751 -.506 L -.74 -.156 L -.609 .047 L -.333 .002 L -1.165 .487 L -.755 .498 L -.447 .394 L -.604 .264 L -.526 .163 L -1.147 .136 L -.867 .106 L -.532 .075 L -1.018 .063 L -1.602 .11 L -.739 -.039 L -.984 -.082 L -.905 -.241 L -1.318 -.254 L -.812 -.373 L -1.132 -.313 L -.623 -.331 L -1.333 -.75 L -.769 -.229 L -1.423 -.022 L -1.172 -.037 L -.796 .077 L -2.48 .538 L -.673 -.113 L -1.643 -.531 L -.421 -.333 L -.408 -.451 L -.182 -.481 L -.004 -.541 L -.145 -.204 L -.767 -.143 L -.989 -.317 L -.702 -.231 L -1.748 -.328 L -1.036 -.185 L -1.028 -.098 L -.84 -.201 L -1.269 .96 L -.905 .839 L -.098 .293 L .409 .86 L .396 .304 L .116 .204 L -.163 .526 L -.744 .572 L -.31 .162 L -.755 .28 L -.562 .018 L -.576 -.186 L -.312 -.114 L -.875 -.068 L -.85 .004 L -.719 -.083 L -1.458 .008 L -.699 -.113 L -.393 -.406 L -.694 -.755 L -.831 -.083 L -1.842 -.122 L -.932 -.156 L -.953 -.097 L -.84 .18 L -1.512 .476 L -1.143 .341 L -.787 .398 L -.971 .692 L -.017 .012 L -.727 .381 L -.603 .148 L -1.387 .08 L -.599 .207 L -.799 .425 L -.154 .044 L -.244 .074 L -.569 .003 L -.228 .014 L -.064 -.145 L -.589 0 L -.294 -.478 L -.441 -.331 L .073 -.331 L -.625 .184 L -.478 .368 L -.993 -.074 L -.882 -.073 L -.662 -.699 L -.588 -.552 L -.956 -.147 L -.331 -.625 L -.772 -.588 L -.698 -.441 L -.993 .037 L -.771 .221 L -.993 .221 L -.992 0 L -.589 0 L -.184 -.184 L -.258 -.257 L -.478 0 L 0 -.368 L -.367 -.331 L -.92 0 L -.367 .515 L -.331 .257 L -.515 .257 L -1.104 -1.434 L -.846 -.882 L -1.69 -2.133 L -1.066 -1.029 L -1.287 -.772 L -.809 -.294 L -1.104 -.588 L .11 -.368 L .515 -.11 L 0 -.441 L -.809 .074 L -.515 .22 L -.772 .221 L -.956 .515 L -1.103 .257 L -.772 .441 L -.294 .294 L -.552 -.184 L -.441 -.037 L -.771 .073 L -.441 .11 L -.331 -.184 L .331 -.441 L .441 -.184 L .146 -.294 L -.367 0 L -.441 .221 L -.478 -.11 L -.405 -.294 L -.478 -.037 L -.184 .147 L -.147 .147 L -.367 -.221 L -.295 -.368 L -.294 -.11 L -.331 .221 L -.367 -.074 L -.368 .147 L -.44 -.11 L -.295 .147 L -.478 -.074 L -.184 -.257 L .33 -.037 L -.073 -.331 L .147 -.257 L .11 -.331 L -.515 -.22 L -.147 -.221 L .037 -.331 L -.368 -.404 L -.882 .037 L -.625 .11 L -.772 -.257 L -.515 -.11 L -.919 -.147 L -.735 .037 L -.11 .221 L -.589 .184 L -.515 .037 L 0 .294 L -.367 .368 L -.625 .074 L -1.876 .073 L -2.021 .405 L -1.177 .037 L -.625 .331 L -.221 .331 L -.331 -.073 L -.588 .073 L -1.545 .11 L -.735 .11 L -1.029 .037 L -1.396 .405 L -.368 .184 L -.772 0 L -.515 0 L 537.304 80 l -.33 .074 L -.185 .515 L .074 .441 L .294 .221 L -.294 .074 L 0 .331 L 1.065 .11 L .956 .294 L -.11 .257 L -.515 .073 L -1.103 -.147 L -.698 .184 L -.662 .515 L .146 .257 L .441 .478 L -.331 .294 L -.588 .147 L -.735 .368 L -.467 .067 L .164 .274 L .239 0 L .377 .137 L -.068 .171 L .377 .137 L .651 .069 L .274 .308 L 1.165 .171 L .24 .24 L -.138 .686 L -.137 .309 L -1.577 .411 L -.959 -.034 L -.343 -.343 L -.24 0 L -.171 .309 L -.651 .343 L -.411 -.171 L -.754 -.137 L -.926 -.309 L -.274 -.548 L -.754 -.103 L -1.062 .103 L -.137 .412 L -.617 .068 L -.651 -.411 L -.65 -.035 L -.823 -.068 L -.514 .377 L -.377 .343 L -.274 .274 L -.686 .171 L -.411 -.24 L -.686 -.137 L -.582 -.548 L -.72 -.068 L .034 .24 L .205 .48 L -.239 .274 L -.274 -.137 L -.068 -.583 L -.411 -.274 L -.789 -.343 L -.582 -.206 L 0 -.343 L -.96 -.171 L -.617 .069 L -.788 -.035 L -.411 -.514 L -.411 -.069 L -.617 .24 L -.273 .137 L -.651 .137 L -.309 -.274 L -.479 0 L -.651 -.069 L -.515 .309 L -.548 .343 L -.788 .377 L -.549 .068 L -.514 .171 L -.309 .309 L -.172 .24 L 509.58 87.5 l -.479 .206 L .068 .445 L .171 .411 L -.068 .446 L -.411 .24 L -.651 0 L -.514 -.411 L -.48 -.548 L -.514 -.24 L -.411 .069 L -.103 .308 L -.343 .549 L -.823 .137 L -.205 1.303 L .343 .171 L .239 .274 L -.239 .206 L -.446 .274 L -.65 1.165 L 1.37 .343 L .138 .377 L -.068 .309 L .514 .514 L .103 -.343 L .583 .206 L .343 -.034 L .514 .034 L .515 .445 L .479 .206 L .343 .514 L .96 1.131 L -.138 .103 L -.445 -.103 L -.309 -.103 L -.343 .103 L .068 .308 L .857 .377 L .616 .19 L -.167 .2 L -.399 .28 L -.38 .12 L -.12 0 L 0 .14 L 0 .22 L -.14 .08 L -.3 -.2 L -.34 .2 L -.399 .26 L -.64 .12 L -.319 .08 L -.26 -.08 L -.181 -.08 L -.1 .04 L -.06 .16 L .12 .26 L -.221 .2 L -.18 .3 L -.18 .319 L -.319 .42 L -.18 .28 L -.32 .16 L -.34 .24 L -.14 .32 L .08 .2 L .34 .2 L .319 .04 L .18 .3 L .24 .04 L .239 .34 L .28 .419 L -.06 .38 L -.101 .2 L .061 .16 L .1 -.2 L .1 -.34 L .12 -.22 L .16 -.02 L -.141 .439 L -.22 .36 L .061 .4 L .12 .1 L -.16 .2 L -.04 .4 L .38 .24 L .119 .1 L .12 .52 L .28 .06 L .359 .42 L .2 .28 L .439 .419 L .18 .36 L .359 .06 L .047 .146 L -.292 .449 L -.496 .284 L -.283 .094 L -.308 .331 L -.165 .213 L -.379 .047 L -.449 -.142 L -.591 -.094 L 0 -.308 L -.283 -.284 L -.118 0 L -.095 -.118 L -.473 -.284 L -.142 -.189 L 504.5 H -.213 .047 L 504.264 107 l -.229 .023 L -.126 -.189 L -.236 -.071 L -.236 .023 L -.284 -.047 L -.26 -.094 L -.284 -.166 L -.354 -.284 L .118 -.307 L .118 -.189 L -.118 -.142 L -.354 -.024 L -.378 0 L -.213 -.166 L -.189 -.118 L -.212 0 L -.143 -.094 L -.236 -.118 L -.118 0 L -.095 .071 L -.142 .166 L -.188 -.142 L -.261 -.071 L -.354 0 L -.213 .071 L -.094 .095 L -.166 .166 L -.283 0 L -.261 .118 L -.212 -.071 L -.261 -.118 L .048 -.118 L .142 -.118 L -.308 -.119 L -.236 -.118 L -.354 -.071 L -.52 -.118 L -.284 -.213 L -.095 -.142 L -.354 -.166 L -.283 .047 L -.189 0 L -.401 -.166 L -.544 0 L -.426 .095 L -.307 0 L -.355 -.047 L -.307 -.071 L -.261 -.095 L -.212 -.166 L -.213 0 L -.331 0 L -.189 -.047 L -.188 -.094 L -.284 -.142 L -.283 -.095 L -.449 -.023 L -.402 -.023 L -.07 -.047 L -.284 -.047 L -.26 .166 L -.112 .309 L -1.421 -1.012 L -1.188 -.842 L -.817 -.385 L -.62 -.084 L -.373 -.157 L -.509 -.5 L -.236 -.057 L -.338 .159 L -.329 -.042 L -.347 -.515 L -.795 -.674 L .595 -.188 L .519 -.001 L .445 -.073 L .1 -.519 L .359 -.476 L 485 97.85 l .526 -.03 L .516 -.131 L -.432 -.532 L -.654 -.273 L -.474 -.36 L .243 -.116 L .367 -.03 L .82 -.117 L .715 -.348 L 1.244 -.436 L -.196 -.375 L -.076 -.058 L -.799 .088 L -1.312 .175 L .012 -.126 L .021 -.112 L 0 -.224 L .09 -.514 L .224 -.089 L .357 -.022 L .38 -.134 L .223 -.179 L .022 -.179 L .269 0 L .736 -.045 L .805 .157 L .335 -.134 L 0 -.156 L .156 -.291 L .156 -.491 L -.066 -.067 L -.09 -.201 L -.045 -.179 L -.044 -.134 L -.179 -.067 L -.156 -.067 L .044 -.224 L .045 -.179 L .246 0 L .312 0 L .134 -.156 L -.29 -.044 L -.269 -.089 L -.223 -.246 L .312 -.044 L .357 -.201 L .156 -.067 L .201 -.089 L .045 -.224 L -.09 -.179 L -.111 -.089 L .022 -.179 L .089 -.111 L -.156 -.089 L -.201 .089 L -.134 .044 L -.269 0 L -.357 -.156 L -.111 -.224 L -.469 -.022 L -.291 -.089 L -.201 -.179 L -.357 .067 L -.268 -.112 L -.469 -.112 L -.425 -.067 L -.29 -.268 L -.224 .067 L -.045 .157 L -.29 .134 L -.224 -.112 L -.179 -.179 L -.402 -.044 L -.022 -.134 L -.201 -.179 L 0 -.134 L -.268 -.179 L -.111 -.156 L -.357 .067 L -.536 .134 L -.269 0 L -.312 .112 L -.425 .112 L -.179 -.156 L -.179 -.022 L -.201 .067 L -.469 -.291 L -.268 -.067 L -.47 .067 L -.268 .179 L -.291 -.29 L -.179 -.089 L -.089 -.224 L .089 -.179 L -.089 -.246 L -.224 -.268 L 0 -.357 L -.402 0 L 0 -.312 L -.38 -.022 L -.514 .067 L -.156 -.112 L -.647 0 L -.269 -.29 L -.111 -.357 L -.134 -.291 L .312 -.134 L .312 .022 L 0 -.268 L -.312 -.156 L -.246 -.156 L -.134 -.201 L -.246 -.335 L -.312 -.134 L -.201 -.268 L -.514 .134 L -.692 -.112 L -.67 .223 L -.536 .022 L -.536 -.246 L -.134 .268 L -.179 .291 L -.313 .156 L -.469 -.022 L -.357 -.089 L h 527.156 37.071 m -.59 -.14 L -.955 -.21 L -1.128 -.139 L -.739 .054 L -.959 .037 L -.732 .143 L -.411 -.105 L -1.025 -.476 L .737 -.303 L 1.21 -.429 L .654 -.09 L 1.549 -.002 L .135 -.357 L -.728 -.338 L .351 -.269 L .419 -.144 L .676 -.02 L .852 -.181 L -.25 -.161 L -.526 -.233 L 1.539 -.895 L .513 -.129 L .226 .073 L .892 .017 L .981 -.535 L .863 -.333 L 1.02 -.261 L .975 -.15 L 1.305 -.113 L 1.274 .053 L .738 -.15 L .786 -.615 L .273 .018 L .873 -.132 L 1.722 .276 L .471 -.038 L 1.93 -.321 L .958 -.039 L 2.184 -.247 L 1.864 -.116 L .771 -.564 L .376 -.152 L 2.511 -.137 L 1.965 -.079 L .471 .131 L .442 .225 L .154 .357 L -.812 .47 L -.541 .169 L -1.346 .319 L -2.609 .433 L -4.329 .49 L -2.187 .281 L -2.122 .299 L -1.842 .316 L -2.102 .242 L -.941 .203 L -.288 .274 L .644 .216 L -.422 .217 L -.943 .361 L -.527 .037 L -2.047 -.068 L -.432 .18 L -.119 .233 L .621 .249 L -.331 .233 L -1.206 .448 L -.402 -.142 L -.752 -.087 L -.592 .304 L .877 .283 L .052 .319 L -1.094 .657 L -.822 .284 L h 517.491 38.443 m 1.041 -.37 L .512 -.299 L .428 -.212 L 1.426 -.021 L 1.316 -.249 L .987 -.02 L 1.412 -.091 L .551 .069 L .988 .227 L -.063 .176 L -.463 .528 L -.302 .158 L -.697 .071 L -.443 .228 L -.233 .385 L .006 .818 L .445 1.039 L .957 .826 L .505 .308 L .775 .307 L 1.162 .392 L -.028 .282 L -2.62 -.089 L -.844 .053 L -.917 .326 L -.596 .086 L -.676 -.494 L -.382 -.034 L -1.091 .088 L -.673 -.102 L -.031 -.359 L 1.347 -.362 L .073 -.24 L -.102 -.017 L -.944 -.273 L -1.442 -.411 L -1.519 -.17 L -.33 .156 L -.624 .122 L -.681 -.033 L -.625 -.396 L -.114 -.415 L .229 -.312 L .39 -.209 L .344 -.036 L .318 .104 L .65 .016 L .518 -.192 L 1.121 -.768 L .243 -.35 L -.322 0 L -.981 -.243 L h .125 56.089 m 0 -.562 L 0 -.576 L 0 -.157 L 0 -1.292 L 51.28 V 0 -2.222 L 0 -2.12 L 2.917 .61 L 1.693 .598 L .933 .181 L 3.819 .99 L 1.059 .395 L .204 .149 L .074 .214 L .445 .429 L .406 .789 L -.209 .428 L 1.034 .8 L .982 .26 L -.02 -.18 L .297 -.148 L -.051 -.196 L -.638 -.392 L .016 -.542 L .077 -.296 L 1.026 -.183 L .984 .278 L .573 .098 L .767 .064 L 1.003 -.117 L .933 .13 L .93 .425 L .694 .359 L 1.676 .684 L .32 .081 L .584 .179 L .43 .211 L .09 .13 L -.343 .033 L -1.026 -.096 L -.364 .034 L -.808 .798 L -1.539 -.468 L .138 .178 L .438 .227 L .465 .324 L -1.177 -.111 L -1.008 .05 L -1.202 -.387 L -.708 -.096 L .135 .129 L .289 .259 L .084 0 L .561 .259 L .205 .307 L .131 .453 L -.056 .339 L -.814 .05 L -.805 .065 L -.189 .161 L .5 .865 L -.115 .272 L -1.04 -.078 L -.397 .081 L -1.193 -.174 L -.264 -.352 L -1.795 -.51 L -.253 .273 L 9.85 55.79 l -.276 -.161 L -.265 -.403 L .174 -.178 L -.321 -.42 L -.87 -.339 L -.565 -.063 L -.762 .034 L -.858 .229 L -1.343 .084 L 3.57 54.443 l .059 -.325 L -.155 -.325 L -.618 -.487 L 1.958 53.43 l -.45 .409 L -.655 1.228 L -.166 .715 L -.562 .307 L +449.401 22.792 N -1.596 -.014 L -2.019 -.016 L -1.739 .063 L -.764 .061 L -1.972 -.316 L .812 -.456 L .826 -.172 L .735 -.453 L 1.148 -.588 L 1.354 .691 L .998 .105 L 1.116 -.088 L .9 .084 L .704 .341 L .865 -.323 L .53 -.454 L .868 -.306 L -.311 .823 L .086 .32 L .851 -.001 L .991 -.495 L 1.061 -.261 L .803 .128 L .559 .472 L .705 .041 L 2.007 -.111 L 1.543 .189 L .551 .376 L -.507 .201 L -2.004 .622 L -1.623 .38 L -1.069 .062 L -.976 .14 L -1.324 .366 L -6.271 -.097 L -.033 -.377 L 1.492 -.26 L .702 -.677 L h 430.027 22.752 m .068 .697 L .252 .119 L 1.694 .155 L .221 -.377 L .13 -.418 L .573 -.141 L .523 -.041 L .949 .477 L 1.192 .771 L .798 .235 L .568 -.218 L -.222 -.296 L -.46 -.356 L -.327 -.477 L -.04 -.22 L .91 -.407 L 1.001 .103 L .485 .18 L 1.278 .018 L .586 .179 L -.08 .419 L -.169 .298 L .104 .159 L .549 .118 L .743 -.338 L .44 -.1 L .662 .396 L .678 .335 L .785 .156 L .948 .117 L 1.672 .429 L .498 .234 L -1.305 .277 L -1.981 .218 L -.696 .293 L -.731 1.144 L -.885 .885 L -1.243 .117 L -.766 .535 L -.455 .589 L -.029 .378 L -.786 .209 L -.556 -.018 L -1.593 -.355 L -1.883 -.507 L -1.365 -.568 L .651 -.364 L 1.565 -.041 L 1.788 -.137 L .944 -.386 L -.652 -.249 L -1.822 .139 L -1.566 .118 L -1.694 .042 L -.502 -.519 L .959 -.06 L 1.371 -.215 L 2.149 -.314 L 1.547 -.45 L -2.525 -.405 L -.881 -.292 L -.589 .138 L -1.036 .646 L -1.069 .293 L -.562 .059 L -1.236 -.172 L -.338 -.174 L -1.05 -.368 L -.807 -.233 L -.698 -.41 L 1.698 -.396 L -.817 -.571 L -1.359 .319 L -.467 -.078 L -.924 -.751 L .812 -.36 L .516 -.021 L 1.075 -.122 L 1.017 .038 L .577 -.061 L 1.188 -.042 L h 425.42 68.82 m -.148 -.21 L -.629 .132 L -.134 -.026 L -.249 -.237 L -.239 -.343 L .188 -.158 L -.143 -.291 L -.361 .185 L -.062 .29 L .113 .237 L -.147 .105 L -.339 .316 L -.086 .185 L -.521 .105 L -.533 -.131 L -.781 .342 L .057 .131 L -.502 .289 L -.498 .263 L -1.658 .813 L 418.697 71 l -.274 .052 L -.271 0 L -2.111 .209 L -.188 -.236 L -.33 -.131 L -.183 .209 L 414.976 71 l .384 -.184 L -.935 -.236 L -.794 -.341 L -.574 -.052 L -.479 -.578 L .292 -.368 L -.126 -.21 L .34 .026 L .085 .316 L .284 -.21 L .667 .263 L -.244 -.197 L .127 -.145 L .5 -.092 L -.479 .026 L -.245 .105 L -.263 -.184 L -.111 -.132 L .579 -.276 L .455 -.185 L -.482 .066 L -.317 -.132 L .441 -.237 L .083 -.237 L -.661 .475 L -.036 -.264 L -.265 -.171 L .005 .211 L .076 .171 L -.419 .158 L -.41 0 L .014 -.277 L -.15 .264 L -.235 -.079 L -.2 -.448 L .658 -.449 L .08 .436 L .068 -.317 L .438 .158 L .211 -.092 L -.166 -.106 L .674 -.079 L .479 -.251 L -.611 .159 L -.48 0 L -.335 -.159 L .196 -.132 L .387 -.146 L .196 -.471 L -.821 -.014 L -.546 .094 L -.406 -.309 L .368 -.14 L .643 -.404 L -.212 -.186 L -.445 .063 L -.399 -.062 L -.211 -.217 L .284 -.482 L .619 -.265 L -.595 -.248 L -.225 -.374 L .272 -.188 L -.089 -.687 L .106 -.094 L .594 -.063 L .392 -.045 L .455 .044 L .082 -.11 L -.255 -.134 L -.425 -.118 L -.228 -.17 L .098 -.188 L .211 -.125 L .575 -.064 L .511 -.346 L .567 .109 L .498 -.111 L .179 -.55 L .835 .093 L .668 .125 L .571 -.252 L -.989 -.234 L -.266 -.314 L .236 -.143 L 1.151 .014 L .851 -.08 L .538 .219 L .06 -.473 L .477 -.27 L .297 -.333 L .78 -.175 L .438 .189 L .138 .079 L .5 -.476 L .869 -.413 L .084 -.429 L .437 -.398 L 1.497 -.735 L .335 -.192 L .235 -.048 L .481 .175 L .335 -.001 L .319 -.224 L -.225 -.223 L .141 -.128 L .488 -.224 L .457 -.305 L .481 -.483 L .245 .064 L .676 -.017 L -.067 -.612 L -.471 -.112 L .434 -.405 L .511 -.648 L .841 .063 L .047 -.341 L .096 -.228 L .954 -.116 L -.396 -.357 L -.327 -.097 L -.193 -.146 L .164 -.245 L .313 -.246 L .464 .048 L .888 -.067 L -.543 -.522 L .249 -.082 L .435 -.034 L .707 -.263 L .592 -.067 L .308 -.208 L -.358 -.064 L -.105 -.187 L .289 -.1 L .616 -.33 L .557 .032 L .351 .098 L .434 -.264 L .369 -.031 L .035 -.176 L -.421 -.321 L .627 -.232 L .146 -.275 L .336 .01 L .359 .297 L .397 .082 L .526 -.381 L -.281 -.656 L .438 .065 L .698 -.058 L .207 -.174 L -.604 -.315 L .411 -.224 L .816 -.251 L .093 -.257 L .261 -.194 L .73 -.135 L .074 .067 L .274 -.051 L .102 -.067 L .492 -.67 L .521 .25 L .96 -.153 L .411 .133 L .265 .1 L .646 .065 L .536 -.419 L .747 -.84 L .286 -.085 L .16 .168 L -.178 .286 L -.182 .587 L .791 -.454 L .403 -.572 L .819 -.085 L .688 -.439 L .437 .117 L .665 .353 L .567 -.643 L .318 -.272 L .976 .1 L 1.019 .506 L .197 -.152 L .479 -.595 L .709 -.444 L .283 -.052 L .562 .067 L .338 -.308 L .469 -.291 L .619 -.189 L 1.2 -.173 L .984 .015 L -1.337 .755 L -.24 .273 L -.107 .646 L .42 .084 L .691 -.579 L 1.53 -.941 L .764 -.275 L .028 .257 L -.004 .905 L .704 -.172 L .438 -.239 L .855 -.874 L .959 -.104 L .586 -.001 L .216 .154 L -.383 .257 L -.335 .257 L .074 .239 L -.319 .41 L .921 .118 L .221 -.443 L .902 -.651 L .421 .017 L 1.682 .561 L .667 .135 L .935 .015 L .649 .237 L .1 .272 L -1.216 .393 L -1.148 .036 L -2.233 -.047 L .193 .084 L .585 .304 L 1.058 .284 L .383 .302 L .728 -.052 L .679 -.102 L .831 .032 L .708 .25 L -.404 .288 L -.514 .204 L -.824 .021 L -.77 .121 L -1.023 .49 L -1.013 .672 L -.689 .303 L -.001 -.2 L .096 -.367 L .874 -.923 L -.044 -.268 L -.88 -.348 L -.672 -.114 L -1.125 -.431 L -.556 .003 L -.555 .07 L -2.004 .095 L -.865 .374 L -.567 .422 L -.26 .437 L -.079 .501 L -.188 .5 L -1.25 .472 L -.582 .368 L -.31 -.148 L -1.288 -.492 L -1.657 .225 L -1.411 -.042 L -.536 -.13 L -.861 -.595 L -.994 -.612 L -.486 -.082 L -.355 .103 L -1.012 .656 L -.114 -.063 L -.41 -.031 L -.865 .038 L -.281 1.066 L -.164 .449 L -.271 .25 L -.323 -.015 L -.67 -.129 L -.972 -.144 L -1.731 -.389 L -.168 .183 L -.021 .663 L -.083 .199 L -.318 .299 L -.695 .004 L -.871 -.095 L -.279 -.015 L -.465 .167 L -1.484 1.176 L .05 .213 L .171 .507 L -.188 .345 L -.615 .346 L -1.325 .919 L -.687 .442 L -.981 .021 L -.121 .244 L -.06 .971 L -.32 .598 L -.383 .469 L -.574 .499 L -.495 .545 L .339 .125 L .381 .269 L .252 .587 L -.17 .176 L -.44 .177 L -.733 .036 L -.932 -.027 L -.618 .114 L -.613 .257 L -.617 .479 L -.389 .492 L -.077 .664 L -.349 1.093 L .65 .729 L -.335 1.171 L .582 .39 L .715 .186 L .297 .243 L -.432 .67 L -.941 .16 L .571 .735 L .26 .427 L -.249 .346 L -.029 .532 L -.769 .384 L -.414 .013 L -.117 .423 L -.506 .224 L .22 .831 L -.324 .737 L -.41 .013 L -.15 -.342 L -.293 -.132 L +464.349 47.431 N -.024 .283 L -.258 .465 L .116 .529 L .563 .212 L .872 .194 L .964 .506 L .543 .392 L -.421 .364 L -1.303 .777 L -.328 .296 L 1.402 1.394 L .772 1.195 L -.196 .356 L -.44 .535 L -.187 .403 L -.029 .37 L .37 .509 L 1.286 1.395 L .151 .253 L -.057 .254 L -.542 .415 L -.327 .191 L .439 .33 L 1.357 .499 L .703 .265 L .436 .392 L .161 .346 L -.105 .409 L -.43 .536 L -.591 .536 L -1.385 .758 L -1.983 1.195 L -1.946 1.145 L -.174 .285 L -.935 .206 L -1.195 .188 L -.149 .181 L -.506 -.217 L -.518 .146 L -.052 .134 L -.688 -.07 L -.193 -.108 L .057 -.387 L -.241 .527 L -.268 .14 L -.633 .047 L -.328 .03 L -.1 .267 L -.589 -.326 L -.29 .275 L -.676 .064 L -.34 .178 L -.052 -.127 L -.504 .108 L -.504 .108 L -.211 .266 L -.311 -.152 L -.672 .126 L -.04 -.114 L -.658 .215 L -.547 .013 L -.482 .025 L -.487 -.253 L -.223 -.274 L .273 -.34 L -.846 .017 L -.517 .177 L .065 -.382 L -.446 .076 L -.644 -.271 L -.409 -.061 L -.415 -.231 L -.26 -.403 L -.036 -.714 L .158 -.374 L .05 -.436 L .09 -.234 L -.347 -.483 L -.431 -.375 L .3 -.658 L -.02 -.392 L -.305 -.204 L -.37 -.093 L .062 -.299 L .295 -.331 L .637 -.285 L .144 -.189 L -.113 -.331 L .382 -.143 L .633 .125 L .274 .063 L .483 -.222 L .303 -.427 L .104 -.459 L .207 -.27 L .301 .316 L .27 0 L 1.678 -1.114 L 1.142 -.654 L .835 -.576 L 1.026 -.401 L .874 .03 L .06 -.304 L -.13 -.144 L -.357 -.16 L .119 -.371 L .146 -.387 L -.329 -.274 L -1.139 -.095 L -.836 -.451 L -.594 -.024 L -.113 -.234 L -.327 -.307 L -.208 -.535 L .5 -.8 L -.028 -.392 L -.405 -.685 L -.507 -.637 L .004 -.526 L .062 -.413 L -.77 -.558 L -.508 -.229 L -1.583 -.207 L -1.085 -.292 L -1.286 -.658 L -.616 -.463 L -.146 -.033 L 1.012 -.656 L .355 -.103 L .486 .082 L .994 .612 L .861 .595 L .536 .13 L 1.411 .042 L 1.657 -.225 L 1.288 .492 L .31 .148 L .582 -.368 L 1.25 -.472 L .188 -.5 L .079 -.501 L .26 -.437 L .567 -.422 L .865 -.374 L 2.004 -.095 L .555 -.07 L .556 -.003 L 1.125 .431 L .672 .114 L .88 .348 L .044 .268 L -.874 .923 L -.096 .367 L .001 .2 L +453.795 53.873 N -.23 -.004 L -.975 .164 L -.447 .098 L -.902 -.387 L -.339 -.178 L -.347 .114 L -.641 .374 L -.542 .599 L -.309 .146 L -.658 .018 L -.545 .355 L .325 .241 L .146 .192 L -.355 .273 L -.907 .401 L .317 .271 L .385 .159 L .33 .302 L -.749 .367 L -.405 .43 L -.368 .461 L -1.591 .669 L -.699 .286 L -.456 -.205 L -.326 .08 L -.538 .539 L -.646 .144 L -.663 .348 L -.217 .284 L -.191 .142 L -.746 .033 L -.221 -.031 L .151 .535 L -.484 .425 L 439 61.33 l .216 .533 L .243 .25 L -.244 .955 L -.498 .063 L -.217 .204 L .189 .757 L -.009 .544 L .381 .444 L -.287 .175 L .926 .082 L .225 .187 L .499 -.082 L .652 .594 L .428 .314 L .86 .163 L .198 .406 L .32 .139 L .014 .335 L -.391 0 L -.508 .323 L -.861 .3 L -.492 .162 L -.521 -.012 L -.146 -.115 L -.805 -.115 L -.66 -.173 L -.634 -.069 L -.137 .104 L -.446 -.115 L -.257 .3 L .819 -.069 L .497 .265 L .591 .046 L .205 .208 L .481 .069 L .021 -.127 L .616 .069 L .258 -.196 L .297 .011 L .481 -.104 L .226 .081 L .026 -.15 L .164 0 L .214 .15 L -.029 .081 L -.722 .023 L .219 .288 L -.792 .265 L -.168 .288 L -.386 .08 L -.089 -.092 L .042 -.161 L -.014 -.276 L -.258 .023 L -.091 .46 L -.501 .333 L -.248 .058 L -.36 -.069 L -.005 .218 L -1.418 .035 L .156 .458 L .513 .258 L .066 .609 L -.109 .33 L -.281 .051 L -.308 -.064 L .038 .429 L .29 .081 L -.126 .268 L .24 .228 L -.365 .364 L -.222 .455 L -.041 .56 L -.766 1.043 L -.58 .71 L -.165 -.062 L -.442 -.236 L -.614 .193 L -1.262 -.089 L -.106 .311 L -.252 -.083 L -.518 .264 L -.295 .517 L .356 .336 L -.376 .374 L -.48 -.129 L -.173 -.037 L -1.158 .269 L -1.11 -.116 L -.001 -.142 L .19 -.078 L -.062 -.181 L .281 -.297 L -.638 -.53 L -.413 -.479 L -.22 -.272 L .529 -.116 L -.082 -.312 L .421 .077 L .147 -.245 L -.19 -.234 L -.285 .013 L -.292 -.377 L -.527 -.221 L -.63 -.99 L -.286 0 L .011 -.408 L -.256 -.364 L -.348 -.298 L .221 -.484 L .206 -.341 L -.418 -.154 L -.405 .102 L -.055 -.288 L -.412 .051 L -.18 -1.207 L -.225 -.131 L .311 -.355 L .293 .132 L .15 .342 L .41 -.013 L .324 -.737 L -.22 -.831 L .506 -.224 L .117 -.423 L .414 -.013 L .769 -.384 L .029 -.532 L .249 -.346 L -.26 -.427 L -.571 -.735 L .941 -.16 L .432 -.67 L -.297 -.243 L -.715 -.186 L -.582 -.39 L .335 -1.171 L -.65 -.729 L .349 -1.093 L .077 -.664 L .389 -.492 L .617 -.479 L .613 -.257 L .618 -.114 L .932 .027 L .733 -.036 L .44 -.177 L .17 -.176 L -.252 -.587 L -.381 -.269 L -.339 -.125 L .495 -.545 L .574 -.499 L .383 -.469 L .32 -.598 L .06 -.971 L .121 -.244 L .981 -.021 L .687 -.442 L 1.325 -.919 L .615 -.346 L .188 -.345 L -.171 -.507 L -.05 -.213 L 1.484 -1.176 L .465 -.167 L .279 .015 L .871 .095 L .695 -.004 L .318 -.299 L .083 -.199 L .021 -.663 L .168 -.183 L 1.731 .389 L .972 .144 L .67 .129 L .323 .015 L .271 -.25 L .164 -.449 L .281 -1.066 L .865 -.038 L .41 .031 L .114 .063 L .146 .033 L .616 .463 L 1.286 .658 L 1.085 .292 L 1.583 .207 L .508 .229 L .77 .558 L -.062 .413 L -.004 .526 L .507 .637 L .405 .685 L .028 .392 L -.5 .8 L .208 .535 L .327 .307 L .113 .234 L +238.107 361.753 N .515 -.688 L .859 0 L 1.202 -.515 L -.171 -.858 L -3.091 .344 L -2.061 .515 L -1.545 -.344 L -.515 -.858 L 1.374 -.515 L 1.202 -.172 L 3.091 -.172 L 1.374 -.515 L -.172 -1.03 L .859 -.516 L 0 -1.374 L -1.326 -1.054 L .982 -.491 L 1.202 -.344 L 1.545 -.172 L .858 .344 L .858 .858 L 1.03 1.374 L 1.374 1.202 L 1.03 1.373 L -.515 2.061 L -1.545 .516 L -1.545 .858 L -3.434 .172 L -3.435 0 L h 172.686 360.379 m 3.091 -.687 L 3.262 0 L 5.495 0 L 2.919 1.202 L -2.748 .687 L -3.759 -.337 L -5.169 -.35 L -3.091 -.516 L h 65.13 371.085 m 1.194 -.265 L 1.393 .133 L .796 .464 L -1.99 0 L -1.393 -.332 L h 277.944 379.954 m .515 -1.202 L 2.404 -1.03 L 2.748 -.172 L 2.061 -.171 L 1.545 -.859 L .343 -1.545 L 1.374 -.687 L 3.091 -.688 L 4.464 0 L 2.404 0 L 3.434 .688 L .687 1.889 L 0 1.202 L -2.061 1.201 L -11.848 1.03 L -11.161 .344 L h 36.004 376.434 m 1.202 -.858 L 2.061 -.343 L 4.121 .515 L 4.293 1.374 L -.887 .482 L -2.719 .204 L -4.293 -.515 L -3.777 -.859 L h 777.843 385.46 m 3.823 .391 L .899 .029 L .322 .234 L 1.202 .294 L 2.329 .088 L 2.126 -.003 L 5.218 .329 L 3.046 .348 L 1.144 -.059 L .762 .029 L 1.411 .37 L 0 2.175 L 0 2.223 L 0 2.222 L 0 2.223 L 0 2.222 L 0 1.551 L -.041 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.182 0 L -.041 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.223 0 L -2.182 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.223 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L -2.222 0 L 9.014 H 6.792 H 4.569 H 2.347 H .125 H 0 -1.544 L 0 -2.222 L 0 -2.223 L 0 -2.222 L 0 -2.223 L 0 -2.223 L 3.941 .297 L 10.131 0 L 7.898 .516 L 6.868 .172 L 8.586 .858 L 6.353 .515 L 8.757 .172 L 4.808 -.172 L 6.525 -.172 L 2.404 .344 L 3.606 -.858 L 16.312 .344 L 4.638 -.013 L 1.143 -.467 L -14.366 -.551 L -9.616 -.688 L -2.232 0 L -3.091 -.172 L -.858 -.171 L -1.545 -.344 L -.498 -.455 L .155 -1.434 L .687 -.858 L 1.889 -.688 L -3.263 -.687 L -2.232 -.344 L -.953 -.503 L 1.589 -.521 L -2.891 -.6 L -3.074 -.208 L -.104 -.261 L 2.857 -.312 L 2.748 0 L 6.525 .343 L 3.434 0 L 2.576 .344 L 4.636 -1.202 L 2.404 -.687 L -2.748 -1.03 L -3.778 -.858 L -4.391 -.405 L -2.649 -.625 L -3.262 -.172 L -2.919 0 L -2.919 -.858 L 2.576 -.516 L 1.28 -.342 L -1.28 -.517 L -2.919 .516 L 52.66 H -1.717 -.344 L 49.054 373 l .343 -1.202 L 1.956 -.07 L 1.65 -.273 L 4.98 0 L 4.626 .493 L 3.272 .709 L 1.374 .172 L 4.465 -.858 L 4.089 .243 L 0 -.729 L .066 -.597 L -2.255 -.73 L -2.93 -.075 L -2.576 -.344 L 2.404 -.687 L 4.121 .171 L 1.717 -.343 L 3.091 -.516 L 3.09 -.343 L 5.667 -.688 L 4.465 -.343 L 3.949 -.516 L 4.464 -.515 L 2.748 .343 L 5.667 0 L 4.464 .258 L 4.121 -.515 L 7.898 .343 L 7.555 -.687 L 3.091 .172 L 1.545 -.688 L 1.545 .516 L 5.323 -.172 L .121 -.87 L 1.758 -.293 L 1.433 .325 L .586 .554 L -.423 .813 L 2.364 .329 L 1.38 -.264 L -.006 -.938 L 1.438 -.267 L 1.48 .267 L .212 1.036 L -1.009 .423 L .521 .781 L 3.024 -.351 L 1.889 .343 L 3.434 .172 L 2.576 -.687 L 3.778 .086 L 4.868 .33 L 2.344 .013 L 1.449 .109 L .693 -.53 L -.611 -.285 L -2.202 -.122 L 1.305 -.285 L .041 -.408 L -.367 -.245 L -1.386 .123 L -.693 .04 L -.856 -.979 L -2.178 -.337 L -.676 -.193 L -.182 -.665 L 4.056 .462 L 3.874 -.245 L -1.224 -.489 L -6.035 -.163 L -.774 -.082 L -.653 -.489 L 0 -.815 L 2.301 .105 L .839 .67 L 5.301 -.204 L 7.253 .736 L 2.404 -.172 L 3.262 -.172 L 4.464 .172 L 3.263 .172 L 2.061 -.516 L .687 -.687 L 1.202 0 L .344 1.03 L 2.576 .343 L 2.404 -.343 L .858 .515 L 3.435 .688 L 3.777 .343 L 2.061 .172 L 1.03 -.515 L .687 -1.202 L 2.747 -.172 L 1.03 .515 L 1.717 .688 L 3.091 -.172 L 3.434 .258 L 4.121 -.344 L 4.979 -.516 L 5.495 -.858 L 3.091 -.515 L 1.202 -.688 L 0 -1.373 L -1.374 -1.202 L -.859 -1.545 L -1.202 -.688 L -.344 -1.03 L 1.202 -1.03 L 1.717 -.343 L .858 -1.202 L -.343 -.858 L -.172 -1.03 L -1.202 -.516 L .344 -1.545 L 1.889 -.172 L 2.404 -1.374 L 1.545 -.515 L .859 -.859 L 1.03 -.687 L 2.919 -1.202 L 3.606 -.515 L 2.404 -1.202 L 2.404 -.172 L 2.232 -1.03 L 1.545 -.343 L .343 1.03 L -1.374 .515 L -1.03 .344 L -1.202 .515 L -.858 0 L -1.202 0 L -2.919 1.202 L -1.03 .687 L -1.717 1.374 L -.172 1.202 L -.687 .687 L -1.374 -.344 L -1.03 0 L -1.202 .516 L -1.202 .687 L -1.03 .688 L -.687 1.201 L .515 .688 L .687 .687 L 1.374 .344 L 1.545 0 L .858 .515 L .687 1.202 L 1.545 1.546 L .687 .858 L 1.03 .687 L .687 1.374 L .858 1.373 L .344 1.546 L -.344 .858 L -.858 1.717 L -2.919 1.889 L -1.202 .172 L -1.03 .858 L -1.717 1.03 L -3.263 .344 L -4.979 .858 L -2.404 .344 L -2.919 .687 L -7.377 -.141 L -4.556 -.316 L -.773 -.401 L -1.717 -.344 L -1.717 -.343 L -1.374 0 L -.859 .515 L .515 .858 L 2.061 .688 L 4.121 1.202 L 4.995 .04 L 1.202 .759 L -3.278 .574 L -5.667 -.343 L -4.979 -.516 L -3.097 -.285 L -2.151 .253 L .823 .696 L 1.164 .538 L 3.262 .172 L 2.232 0 L 1.374 .343 L -.249 .402 L -.782 .113 L -2.232 .515 L -5.151 -.171 L -1.374 -.172 L -2.232 -1.202 L -2.404 0 L .128 .917 L 2.62 1.144 L 1.03 .172 L 1.202 -.172 L 1.374 .344 L 2.404 0 L 4.98 -.516 L 3.09 .687 L .385 .431 L -.041 .6 L -2.061 .172 L -3.263 .172 L -2.608 -.185 L 3.811 .871 L 3.656 -.238 L 1.324 .41 L 2.576 .687 L 6.869 .859 L 8.585 .858 L 10.646 1.373 L 6.525 .516 L 2.061 .858 L .687 1.03 L 3.091 -.344 L 5.323 -1.545 L 6.525 -.687 L 2.455 -.066 L 6.474 -.105 L 9.788 -.344 L 1.889 .344 L 2.576 -1.202 L 8.414 -1.03 L 11.333 -.172 L 8.929 -.858 L 1.202 -.858 L -1.202 -.516 L -.271 -1.07 L -1.184 -.338 L -5.071 .035 L -2.232 .172 L -4.808 -.344 L -3.091 0 L 0 -1.202 L 3.263 -1.545 L 3.949 -1.202 L 2.404 -.172 L 4.121 -1.03 L 9.444 -1.202 L 5.323 -.858 L 6.525 0 L 4.979 -.516 L 2.747 -2.061 L 6.039 -1.541 L -1.23 -.52 L -2.576 .516 L -2.061 -.344 L 1.545 -1.03 L 1.545 -.343 L 2.48 -.249 L .696 -.742 L 3.85 -.742 L 1.577 -.418 L .603 -.557 L -1.716 -.881 L -.093 -.604 L 1.252 -.231 L .464 .742 L 1.017 -.097 L 2.061 -.858 L 1.03 -.343 L .858 .171 L 1.203 1.544 L 2.403 -.342 L .242 -.91 L .96 -.807 L 1.889 -.516 L 1.374 .516 L -1.162 .574 L -.139 .604 L 3.189 -.319 L 4.808 .258 L 3.263 -.172 L 1.03 .858 L 1.545 -.344 L 1.717 -.515 L 5.839 -.858 L 7.212 -1.03 L 4.292 -.858 L 2.061 0 L 2.061 1.373 L 1.718 .344 L 1.889 -.344 L 1.545 -.858 L 7.556 -.344 L 3.434 -.171 L 4.293 .171 L 6.697 .945 L 2.575 0 L 4.293 -.516 L 6.01 -.687 L 5.151 -.688 L 2.404 -.515 L 2.231 -.344 L .615 -.959 L 1.148 -.835 L 1.671 -.095 L .938 .965 L 1.294 .409 L 1.732 1.052 L 1.009 .139 L 1.009 -.661 L 1.322 -.174 L .209 .522 L -.835 .312 L .661 .244 L .8 .278 L .383 -.383 L .313 -.383 L .312 .209 L -.174 .348 L 0 .521 L .592 -.174 L 1.913 -.557 L .418 -1.704 L 5.102 -1.137 L 1.374 -.687 L 3.605 -.172 L 1.363 -.646 L 2.758 -.126 L .21 -.27 L -.165 -.297 L .692 -.23 L 1.221 .165 L .197 .593 L .66 .231 L 2.165 -.536 L 1.265 -.223 L -.726 -.297 L -.561 -.264 L .099 -.362 L 1.451 -.1 L 1.562 .215 L .647 .28 L .692 -.132 L -.066 -.33 L -.527 -.33 L 0 -.561 L .297 -.23 L .846 -.242 L 4.292 -.858 L 2.92 -.172 L 3.058 .115 L 2.296 1.076 L 1.316 .023 L .741 .144 L .023 .383 L -.908 .096 L -.168 .454 L 1.723 .216 L 4.892 .646 L 5.571 .453 L 1.546 .172 L 1.717 -.172 L 7.556 .688 L 5.323 0 L .687 .687 L .2 1.075 L -.73 1.232 L -.672 .439 L -.425 1.113 L -.73 .319 L -.905 -.402 L -.83 .402 L -.73 .959 L 1.507 .457 L .594 .045 L .959 -.593 L .411 .365 L -.867 1.05 L -1.215 .062 L -1.717 1.374 L 0 .858 L 1.889 .688 L 2.919 0 L 1.718 -.859 L 1.889 -1.545 L 1.717 -1.717 L 1.374 -.688 L 4.121 -1.03 L 2.231 -.687 L 3.263 -.344 L 2.061 -1.03 L 1.03 -1.03 L 3.435 -1.03 L 2.403 -.687 L 2.061 -.687 L 2.061 -.172 L 6.182 -.687 L 3.778 .171 L 1.204 -.542 L .169 -.659 L .54 -.759 L .49 -.101 L .471 .776 L .305 .775 L 4.892 -.35 L 5.838 0 L 4.979 -.172 L 3.091 .344 L 2.112 -.214 L 1.328 .085 L 1.018 .594 L 1.188 -.764 L 2.714 -1.046 L 1.866 -.226 L .664 -.028 L .594 -.028 L .777 -.057 L 1.512 .311 L 1.166 -.172 L 3.606 .687 L 3.777 .344 L 1.03 0 L 1.064 .573 L .745 .088 L 2.149 -.088 L 1.271 -.263 L 1.315 -.438 L -.192 -.216 L .28 -.53 L 1.447 -.131 L .921 -.088 L .786 .062 L 2.195 -.501 L 2.097 .501 L .688 .687 L .373 .435 L 1.842 -.131 L .921 -.044 L .985 .255 L 1.889 .688 L 2.919 .515 L 2.919 -.343 L 4.121 -.258 L 2.232 -.344 L 2.404 0 L 3.521 .315 L .702 -.755 L 2.158 -.162 L .863 1.133 L 4.909 .323 L .917 -1.133 L 1.889 -.593 L 5.988 .013 L .756 -.283 L 1.996 .108 L -.432 -1.403 L .054 -.809 L 1.232 -.36 L .872 1.277 L -.647 1.079 L .805 .219 L 2.81 .482 L 5.262 .376 L 5.494 .344 L 2.278 .583 L 1.283 .14 L 1.396 -.167 L 2.204 .446 L 1.961 -.167 L .719 .278 L -.435 .431 L -.151 .351 L .293 .123 L 2.081 .331 L 1.078 .484 L 2.706 -.134 L .377 .595 L 1.038 .227 L 4.808 .515 L -.123 .536 L .567 .236 L 2.695 -.095 L 3.214 .181 L -.329 -.984 L .71 -.095 L .804 .426 L .331 .709 L 1.135 .284 L 2.672 .519 L 2.576 -.343 L 4.017 .999 L 1.626 .495 L 1.672 .871 L 1.626 .023 L .504 .187 L .532 -.021 L .754 -.047 L .777 .047 L .896 .589 L .541 .118 L .542 .07 L .142 -.259 L .471 0 L 1.484 -.048 L 1.416 .237 L 5.951 .535 L .729 .516 L 1.733 .323 L 2.979 .944 L .43 -.335 L .551 .191 L .454 .67 L -.741 .215 L -1.124 .167 L -.216 .359 L .168 .263 L .55 -.048 L -.024 .67 L -.43 -.048 L -.096 .287 L -.312 .071 L -.598 .622 L -.526 .12 L -.55 .287 L -.168 .669 L -1.603 .096 L -1.339 -.239 L -1.794 .359 L -2.153 .425 L -2.629 .764 L 1.271 1.103 L -1.907 .212 L -1.23 -.255 L -.763 .212 L -.043 .637 L -2.374 .169 L .136 .514 L .924 .632 L -.127 .763 L -.382 .085 L -.466 .467 L .551 .466 L .085 .764 L -.764 .424 L .637 .254 L .763 0 L .764 .255 L .339 .509 L .17 .721 L 1.284 -.187 L .836 .907 L 2.035 .297 L .339 .339 L 2.672 .552 L -4.113 0 L -2.799 .138 L -2.332 .541 L -1.823 -.085 L -.806 .212 L -1.611 .339 L -1.326 -.32 L -.546 .426 L 1.116 .529 L -.503 .447 L -.669 .195 L -1.117 .753 L -2.623 .642 L .475 .391 L 2.205 -.111 L .53 0 L .809 .307 L .168 .363 L .499 .18 L .422 .183 L .111 .894 L .209 .502 L 3.195 .279 L 2.874 .948 L 3.662 .801 L 5.151 1.202 L 1.456 .062 L 1.015 .17 L -.146 .234 L -1.67 .264 L -.47 .264 L 1.173 .088 L 2.198 -.293 L 1.988 .166 L + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-script/examples/zrusin.cs b/util/cairo-script/examples/zrusin.cs new file mode 100644 index 000000000..8efc24bbe --- /dev/null +++ b/util/cairo-script/examples/zrusin.cs @@ -0,0 +1,1333 @@ +% The data in this file was created by Zack Rusin and downloaded from: +% +% http://ktown.kde.org/~zrusin/examples/cairorender.tar.bz2 +% +% It is included in the cairo performance test suite by his +% permission, (given in email to Carl Worth on 2006-10-23) + +dict + /width 415 set + /height 116 set + surface context + +107.893088734820 103.841923410053 l +106.908713734820 104.920048410053 l +106.605078419636 105.201721390261 l +102.286079757931 107.612435141518 l +95.848592904540 109.855345077872 l +95.820873452616 109.863161445001 l +90.517184462013 111.170008329713 l +87.125000000000 111.625000000000 l +82.393245921775 111.316572641568 l +77.855183975790 110.402282596173 l +73.577390672683 108.898617908665 l +69.626442523093 106.822066623894 l +69.373711344187 106.641023992165 l +57.717461344187 97.141023992165 l +60.861283165549 97.153157587308 l +52.861026127481 102.679312400770 l +43.297199733607 107.707604120505 l +38.061787185467 109.824994465236 l +32.824736230810 111.354170438973 l +27.636335844151 112.281599723349 l +22.546875000000 112.593750000000 l +19.478437557032 111.949288129016 l +16.158848619890 110.212087077375 l +13.224557514711 107.109984243309 l +12.401022392395 105.215121771751 l +12.109375000000 103.234375000000 l +12.857968117079 98.340329228563 l +15.050447208669 93.495802782054 l +18.606861885297 88.792446786896 l +23.447261757492 84.321912369510 l +23.462751811761 84.309735859104 l +29.835792474114 80.170241641945 l +36.826339837257 77.183700966953 l +44.355342734713 75.374150023260 l +52.343750000000 74.765625000000 l +54.172214431835 74.493658379815 l +55.005326273741 73.240819884599 l +54.891695624471 73.637732784350 l +55.835419478567 69.288398667240 l +56.941029555972 65.553969608663 l +57.993585771605 68.524034756036 l +53.681468264740 66.410473849442 l +48.062136369578 64.586219029579 l +42.258612309644 63.317877950046 l +37.437500000000 62.906250000000 l +32.573685233275 63.044800246717 l +26.989159126193 63.632907811096 l +20.752015377001 64.279295952574 l +16.562500000000 64.484375000000 l +16.408072340842 64.479600861137 l +11.611197340842 64.182725861137 l +11.453516511116 64.167941148499 l +6.725716011250 62.845442977500 l +4.607850691978 60.769517471259 l +3.781250000000 57.859375000000 l +4.373461857036 55.042556375256 l +5.951936001924 52.702230099626 l +6.143541831166 52.540844514692 l +9.884650718045 51.301737345381 l +10.233131146503 51.254965794601 l +14.936256146503 50.958090794601 l +15.093750000000 50.953125000000 l +19.896489079886 51.056672881330 l +25.533897731570 51.448761318515 l +25.296875000000 51.437500000000 l +30.909892241200 52.067729129895 l +30.484375000000 52.031250000000 l +39.960841830525 52.410121686268 l +48.752300459876 53.538988916016 l +48.757228534847 53.539874692156 l +54.123571896675 54.731960341587 l +58.970980406852 56.270657465230 l +63.248918806945 58.141504425356 l +66.906851838519 60.330039584234 l +66.896289983187 60.322652661852 l +70.654761046586 63.581911162241 l +73.423041490057 67.400928399521 l +75.133561184297 71.670457102504 l +75.718750000000 76.281250000000 l +74.721151272876 79.892293861068 l +72.068677652167 83.513297493231 l +70.325052633091 85.868624092784 l +69.828125000000 88.250000000000 l +70.186304443223 90.552747673203 l +71.326302526678 92.735137555366 l +73.346308881046 94.894011912335 l +76.344513137007 97.126213009954 l +79.989627194854 99.164217236556 l +83.789048154438 100.596188457783 l +87.811323321056 101.441306202608 l +92.125000000000 101.718750000000 l +97.462586180660 101.070932456387 l +97.557831952069 101.055648080491 l +103.015964519671 99.851433056816 l +103.984375000000 99.656250000000 l +106.046875000000 99.656250000000 l +107.893088734820 103.841923410053 l +106.046875000000 104.656250000000 l +103.984375000000 104.656250000000 l +104.952785480329 104.461066943184 l +98.254668047931 106.006851919509 l +98.349913819340 105.991567543613 l +92.125000000000 106.718750000000 l +87.170121991444 106.371193797392 l +82.386733095562 105.341311542217 l +77.843380617646 103.648282763444 l +73.608611862993 101.311286990046 l +69.914433306454 98.422394337665 l +67.154166223322 95.217987444634 l +65.426000244277 91.794908576797 l +64.828125000000 88.250000000000 l +65.079958470471 86.099459712769 l +65.803853616909 83.955594657216 l +68.478197347833 80.033577506769 l +70.243692477124 77.869424888932 l +70.718750000000 76.281250000000 l +70.335188815703 72.767042897496 l +69.139458509943 69.692821600479 l +67.063988953414 66.949338837759 l +64.041210016813 64.427347338148 l +64.030648161481 64.419960415766 l +57.122769593148 60.885592534770 l +47.867771465153 58.460125307844 l +47.872699540124 58.461011083984 l +39.531345669475 57.386753313732 l +30.484375000000 57.031250000000 l +30.058857758800 56.994770870105 l +25.296875000000 56.437500000000 l +25.059852268430 56.426238681485 l +19.697260920114 56.052702118670 l +15.093750000000 55.953125000000 l +15.251243853497 55.948159205399 l +10.548118853497 56.245034205399 l +10.896599281955 56.198262654619 l +9.168958168834 56.521655485308 l +9.360563998076 56.360269900374 l +8.781250000000 57.859375000000 l +8.758601803360 58.189255218076 l +8.735899308021 58.292982528741 l +8.961783988750 58.373307022500 l +12.077733488884 59.207058851501 l +11.920052659158 59.192274138863 l +16.716927659158 59.489149138863 l +16.562500000000 59.484375000000 l +20.310484622999 59.298829047426 l +26.432715873807 58.663967188904 l +32.129439766725 58.064574753283 l +37.437500000000 57.906250000000 l +42.956231440356 58.377434549954 l +49.359738630422 59.757530970421 l +55.603687985260 61.808276150558 l +60.600164228395 64.257215243964 l +61.652720444028 67.227280391337 l +60.695830521433 70.461601332760 l +59.795804375529 74.612267215650 l +59.682173726259 75.009180115401 l +58.534870256371 76.967235761415 l +56.827785568165 78.467279120185 l +54.713289027441 79.427384197713 l +52.343750000000 79.765625000000 l +45.078251015287 80.284053101740 l +38.408035162743 81.855361533047 l +32.254051275886 84.503586483055 l +26.537248188239 88.252764140896 l +26.552738242508 88.240587630490 l +22.301341239703 92.064975088104 l +19.363615291331 95.777634717946 l +17.659610007921 99.470217646437 l +17.109375000000 103.234375000000 l +17.462942485289 104.745484506691 l +18.934901380110 106.053537922625 l +21.052812442968 107.257743120984 l +22.546875000000 107.593750000000 l +27.127336030849 107.323869026651 l +31.729951269190 106.505204561027 l +36.405009689533 105.124224284764 l +41.202800266393 103.167395879495 l +50.256161372519 98.422250099230 l +57.732466834451 93.253092412692 l +60.876288655813 93.265226007835 l +72.532538655813 102.765226007835 l +72.279807476907 102.584183376106 l +75.647218702317 104.376772716335 l +79.199503524210 105.636779903827 l +83.003238453225 106.380692983432 l +87.125000000000 106.625000000000 l +94.491626547384 105.043088554999 l +94.463907095460 105.050904922128 l +100.135795242069 103.121939858482 l +103.519921580364 101.267028609739 l +103.216286265180 101.548701589947 l +104.200661265180 100.470576589947 l +106.046875000000 104.656250000000 l +107.893088734820 103.841923410053 l +55.872490683787 89.763134548637 l +54.997490683787 85.841259548637 l +55.036476188094 85.993355189713 l +52.343750000000 85.750000000000 l +46.702141892082 86.180801752650 l +41.285068752391 87.490050907175 l +36.021375201732 89.703013308437 l +30.839905860908 92.844954801298 l +30.840393168266 92.844613599752 l +24.841774707763 97.553563991314 l +23.093750000000 100.109375000000 l +23.668337709691 101.518994849695 l +23.371174656526 101.224323797050 l +23.620948599883 101.397798979282 l +24.023420115060 101.552272092059 l +25.484375000000 101.718750000000 l +29.298199671143 101.348354407082 l +33.545396502623 100.218839979757 l +38.283160693967 98.302715245167 l +43.568687444697 95.572488730454 l +43.462444284634 95.635929361188 l +56.978069284634 87.104679361188 l +55.872490683787 89.763134548637 l +107.893088734820 103.841923410053 l +59.646930715366 91.332820638812 l +46.131305715366 99.864070638812 l +46.025062555303 99.927511269546 l +40.294964306033 102.857441004833 l +34.923353497377 104.984285020243 l +29.967425328857 106.280551842918 l +25.484375000000 106.718750000000 l +22.429704884940 106.291477907941 l +20.160075343474 105.056926202950 l +19.862912290309 104.762255150305 l +18.581942192719 102.559691058502 l +18.093750000000 100.109375000000 l +18.781885833597 97.630167914546 l +20.751975292237 94.868311008686 l +27.972106831734 88.749136400248 l +27.972594139092 88.748795198702 l +33.744249798268 85.287221066563 l +39.777431247609 82.783386592825 l +46.000983107918 81.262557622350 l +52.343750000000 80.750000000000 l +54.881053553302 80.995299290410 l +57.121823397686 81.724997675285 l +58.847249996203 82.929795925088 l +59.838523811906 84.600394810287 l +59.877509316213 84.752490451363 l +60.752509316213 88.674365451363 l +59.646930715366 91.332820638812 l +107.893088734820 103.841923410053 l +155.484375000000 101.859375000000 l +154.564834615754 105.515207938449 l +152.115670325806 108.366761454651 l +148.955163295626 109.891294781728 l +145.437500000000 110.437500000000 l +142.960397099416 109.918703000637 l +140.390467597390 108.438024620128 l +137.806753458193 106.109033784838 l +135.288296646094 103.045299421136 l +135.165845369106 102.859481271949 l +127.322095369106 89.718856271949 l +127.315939322101 89.708486304067 l +123.037165252408 83.240466071649 l +119.422893480005 79.457711309224 l +123.333764624626 78.181432151290 l +119.923748586047 88.267600564284 l +116.288451493331 96.371224650234 l +116.310270123205 96.328970526240 l +111.013619195867 105.085481651574 l +104.498474377631 112.833853093888 l +102.718750000000 113.578125000000 l +98.109375000000 113.578125000000 l +95.790533815800 112.012456612681 l +92.715536961613 101.759617602767 l +90.624767168816 88.808240839597 l +90.625938562396 88.818553777181 l +88.018863793847 68.357428789163 l +88.022375537533 68.374401202625 l +86.904794319936 64.234191072834 l +85.466909526601 60.964474099786 l +83.670654326939 58.467433589062 l +81.477961890361 56.645252846242 l +80.463845731714 53.674615230649 l +82.823220731714 47.205865230649 l +82.883587418943 47.055653464335 l +83.966380643129 44.754922491868 l +85.291281927099 42.535861182972 l +88.514402164445 41.595109434025 l +91.785870247761 43.817111177877 l +94.599270325866 47.029404143594 l +96.906293571887 51.130222797294 l +98.658631158949 56.017801605095 l +98.664492355983 56.039251079522 l +100.006630671722 63.228131068770 l +101.762541190731 76.272848032637 l +101.765778670251 76.300425005941 l +103.467098832178 87.353480411923 l +105.697048617918 94.795754781373 l +102.319980907406 93.545204629259 l +104.354680083199 92.248641487426 l +106.296883956259 90.334282557687 l +110.081726403105 84.371439341729 l +110.069085073875 84.396782220394 l +112.413266990492 78.560599894318 l +114.080111889746 71.934817013191 l +115.075734612596 64.464258680566 l +115.406250000000 56.093750000000 l +117.906250000000 53.593750000000 l +122.515625000000 53.593750000000 l +124.596624760838 54.708311442938 l +155.065374760838 100.473936442938 l +155.484375000000 101.859375000000 l +107.893088734820 103.841923410053 l +150.903375239162 103.244813557062 l +120.434625239162 57.479188557062 l +122.515625000000 58.593750000000 l +117.906250000000 58.593750000000 l +120.406250000000 56.093750000000 l +120.037546637404 64.922460069434 l +118.935513110254 72.987057986809 l +117.106264259508 80.232368855682 l +114.555914926125 86.603217779606 l +114.543273596895 86.628560658271 l +112.308927321184 90.508291033149 l +109.859366043741 93.751654942313 l +107.239069916801 96.288467887574 l +104.492519092594 98.048545370741 l +101.115451382082 96.797995218627 l +98.626651167822 88.552769588077 l +96.796721329749 76.855824994059 l +96.799958809269 76.883401967363 l +95.087119328278 64.107806431230 l +93.835507644017 57.335748920478 l +93.841368841051 57.357198394905 l +92.427690803113 53.221339702706 l +90.736667174134 50.033095856406 l +88.719989127239 47.690701322123 l +86.329347835555 46.092390565975 l +89.552468072901 45.151638817028 l +88.346119356871 47.166952508132 l +87.460162581057 49.069346535665 l +87.520529268286 48.919134769351 l +85.161154268286 55.387884769351 l +84.147038109639 52.417247153758 l +87.106689423061 54.909519535937 l +89.579965473399 58.293338400214 l +91.528799430064 62.470887052166 l +92.915124462467 67.344348797375 l +92.918636206153 67.361321210837 l +95.592811437604 88.243946222819 l +95.593982831184 88.254259160403 l +97.565713038387 100.591944897233 l +100.428216184200 110.143793387319 l +98.109375000000 108.578125000000 l +102.718750000000 108.578125000000 l +100.939025622369 109.322396906112 l +106.962943304133 102.180143348427 l +111.845979876795 94.077279473760 l +111.867798506669 94.035025349766 l +115.287188913953 86.412086935716 l +118.541235375374 76.756067848710 l +122.452106519995 75.479788690776 l +126.837834747592 80.025158928351 l +131.621560677899 87.166513695933 l +131.615404630894 87.156143728051 l +139.459154630894 100.296768728051 l +139.336703353906 100.110950578864 l +142.906407402610 104.257287879872 l +145.437500000000 105.437500000000 l +147.478430454374 105.175111468272 l +149.243704674194 104.273863545349 l +150.251571634246 103.277760811551 l +150.484375000000 101.859375000000 l +150.903375239162 103.244813557062 l +107.893088734820 103.841923410053 l +231.343750000000 91.875000000000 l +230.760913847107 95.964970754466 l +229.068047862611 99.735912943733 l +226.348615757792 103.075786207286 l +222.686081243924 105.872550184609 l +222.648873373705 105.894655312846 l +215.093162016193 109.098726800095 l +205.138412990776 111.389009633945 l +205.099511514392 111.395066324151 l +196.531910121565 112.292873746127 l +187.093750000000 112.593750000000 l +180.736641615184 112.156201510495 l +174.578395035074 110.855968371846 l +168.685194057574 108.711669078852 l +163.123222480588 105.741922126310 l +163.102786019362 105.728945017668 l +158.065383006950 101.833715472335 l +154.350564084671 97.489870440862 l +152.052565874896 92.798170193375 l +151.265625000000 87.859375000000 l +151.531470468770 85.013668760581 l +152.287360086651 82.060400295498 l +152.321821893194 81.964698849566 l +155.704155919825 73.828381186220 l +158.270837388345 69.249451319292 l +158.258242073026 69.265568807584 l +162.161895999987 65.281962610977 l +167.278829839386 61.794937132641 l +173.532669176810 58.834467171163 l +180.847039597849 56.430527525129 l +179.144548452656 58.005986305326 l +180.222673452656 54.974736305326 l +180.222279555972 54.975844608663 l +182.650011718926 50.400876966176 l +185.678714551395 49.466466465483 l +192.833058049629 52.996232862321 l +201.831199616962 58.692914409530 l +211.602112156950 65.789874557518 l +220.243790039283 73.085988470431 l +220.250361498213 73.092084369790 l +227.553434625305 81.089470457139 l +229.783449199558 84.667905408782 l +230.987849850362 87.897461316292 l +231.037603485703 88.222391630780 l +231.334478485703 91.659891630780 l +231.343750000000 91.875000000000 l +107.893088734820 103.841923410053 l +226.353021514297 92.090108369220 l +226.056146514297 88.652608369220 l +226.105900149638 88.977538683708 l +225.181394550443 86.544985216218 l +223.368440374695 83.730842042861 l +216.843388501787 76.751665630210 l +216.849959960717 76.757761529569 l +208.538512843050 69.741375442482 l +199.012550383038 62.822710590470 l +190.370066950371 57.347517137679 l +183.790035448605 54.096033534517 l +186.818738281074 53.161623033824 l +184.933970444028 56.649155391337 l +184.933576547344 56.650263694674 l +183.855451547344 59.681513694674 l +182.152960402151 61.256972474871 l +175.418502698190 63.429204703837 l +169.900857660614 65.978500367359 l +165.523650875013 68.934834264023 l +162.210507926974 72.328181192416 l +162.197912611655 72.344298680708 l +160.116156580175 76.155993813780 l +156.990678106806 83.754051150434 l +157.025139913349 83.658349704502 l +156.265625000000 87.859375000000 l +156.814621625104 91.570970431625 l +158.524435915329 95.017942059138 l +161.489304493050 98.301050152665 l +165.803463980638 101.521054982332 l +165.783027519412 101.508077873690 l +170.773790317426 104.198487171148 l +175.945042464926 106.097156628154 l +181.362967759816 107.222704739505 l +187.093750000000 107.593750000000 l +196.179027378435 107.308688753873 l +204.369238485608 106.448683675849 l +204.330337009224 106.454740366055 l +213.484962983807 104.385648199905 l +220.132376626295 101.574094687154 l +220.095168756076 101.596199815391 l +222.954118617208 99.523823167714 l +224.892889637389 97.287524556267 l +225.994945527893 94.775263620534 l +226.343750000000 91.875000000000 l +226.353021514297 92.090108369220 l +107.893088734820 103.841923410053 l +219.781250000000 95.890625000000 l +219.378166433508 93.853798730227 l +218.111752188172 91.489941446073 l +212.645950385807 85.475693519170 l +212.685981945341 85.511936058310 l +206.545320157918 80.643069684901 l +198.180220478697 74.962876659750 l +198.191932106006 74.970352872652 l +191.582535336704 71.037624006410 l +191.504903114611 70.993386859602 l +190.358726480976 70.329891393482 l +194.093750000000 68.156250000000 l +193.486799914207 72.326466575586 l +191.750022838432 75.648693620488 l +191.727672642897 75.674671879974 l +189.796209835616 77.308949639626 l +187.307360975056 78.497446987452 l +184.374093537693 79.223076311545 l +181.109375000000 79.468750000000 l +178.539517280969 79.274893727068 l +176.586499975916 78.676142180991 l +173.086052480141 74.877460550577 l +176.026873378540 75.790765650642 l +173.637934677835 76.966105971818 l +171.454775584042 78.628861257931 l +167.479150931130 83.659399177979 l +167.492959438562 83.636441477986 l +164.707555748674 89.579684053440 l +164.890625000000 88.640625000000 l +165.429801946489 91.718738201013 l +167.140367049889 94.413281660069 l +170.161871706101 96.828214751252 l +174.633867311024 99.067496848641 l +174.595883286589 99.052025896332 l +183.311717611230 101.570655775842 l +188.036065935963 102.270678900324 l +192.781250000000 102.500000000000 l +204.722829878151 102.082467436594 l +212.458857303872 100.833616072622 l +214.905535432122 99.897801735668 l +216.940228691241 98.604487224303 l +220.087216056537 94.692203098109 l +219.781250000000 95.890625000000 l +107.893088734820 103.841923410053 l +224.475283943463 97.089046901891 l +222.495392805158 99.992428606532 l +220.012896308759 102.426762775697 l +217.106183317878 104.328760764332 l +213.853642696128 105.635133927378 l +205.324045121849 107.034720063406 l +192.781250000000 107.500000000000 l +187.549871564037 107.241039849676 l +182.344532388770 106.476219224158 l +172.747866713411 103.697974103668 l +172.709882688976 103.682503151359 l +167.310784543899 100.802644623748 l +163.281507950111 97.266405839931 l +160.761604303511 93.177746173987 l +160.111277146626 90.958745814619 l +159.890625000000 88.640625000000 l +160.073694251326 87.701565946560 l +163.194540561438 81.082308522014 l +163.208349068870 81.059350822021 l +165.573405849355 77.703241627766 l +168.240536915958 74.886763742069 l +171.153080947165 72.670612778182 l +174.254376621460 71.115484349358 l +177.195197519859 72.028789449423 l +178.991625024084 74.292607819009 l +181.109375000000 74.468750000000 l +185.450451524944 73.971303012548 l +187.959827357103 72.387828120026 l +187.937477161568 72.413806379512 l +188.825700085793 70.736033424413 l +189.093750000000 68.156250000000 l +192.828773519024 65.982608606518 l +194.057596885389 66.694113140398 l +193.979964663296 66.649875993590 l +200.870567893994 70.748397127348 l +200.882279521303 70.755873340250 l +209.532804842082 76.638180315099 l +216.001518054659 81.769313941690 l +216.041549614192 81.805556480830 l +219.736550554799 85.597619431325 l +222.481997811828 89.260058553927 l +224.192146066492 92.716513769773 l +224.781250000000 95.890625000000 l +224.475283943463 97.089046901891 l +107.893088734820 103.841923410053 l +274.375000000000 74.921875000000 l +274.375000000000 76.000000000000 l +273.941340954992 77.877573018672 l +272.878932097861 79.515803527315 l +273.201644884750 79.109789854043 l +272.240878131027 80.634530144823 l +272.178064435979 80.731878545843 l +270.366672394243 82.164949472839 l +268.046875000000 82.703125000000 l +266.183148747233 82.484226579792 l +265.676843902484 82.347511014208 l +261.919943241226 81.056638412991 l +261.845529920936 81.035610157726 l +257.771892015055 80.000491652766 l +254.812500000000 79.671875000000 l +253.064641952966 80.017766952966 l +253.029646790629 80.052082662255 l +253.183319188544 79.921363850038 l +253.251518993920 79.984611568497 l +253.185946392942 81.106825858762 l +253.000000000000 86.578125000000 l +253.496255380785 102.128843883245 l +253.498940253820 102.192840332413 l +254.068093288267 110.651263719025 l +251.578125000000 113.375000000000 l +246.875000000000 113.375000000000 l +246.340326851360 113.317155732979 l +244.239667843345 112.409341061474 l +241.449240399376 110.489665586259 l +233.966932708158 103.861287459859 l +233.964253154933 103.858697290509 l +230.739570245917 99.429986748935 l +227.863465886694 92.900734302334 l +227.865566738278 92.906614054351 l +224.904456445713 83.297192679644 l +223.890625000000 76.390625000000 l +224.718172891760 73.652424627265 l +226.991950628026 71.671512863124 l +230.398659300280 70.468125917422 l +234.625000000000 70.062500000000 l +239.436000436064 69.828681464349 l +240.453125000000 69.140625000000 l +239.621272369169 63.470278877568 l +237.983036171748 55.833595299706 l +237.978023315197 55.813489579321 l +235.265625000000 42.968750000000 l +235.414374888933 43.818233911095 l +223.164374888933 9.911983911095 l +223.454623060848 7.647483743269 l +225.610873060848 4.506858743269 l +225.803351703291 4.260965402925 l +227.719534150475 2.932735689909 l +230.078782966130 2.347671229322 l +230.218750000000 2.343750000000 l +231.580832848366 2.789728316683 l +232.871346377781 3.980786060276 l +235.131457239225 7.716876589460 l +240.051188613236 19.745668022304 l +244.970104457946 33.805503176211 l +247.762510801176 44.143184476801 l +247.777764624530 44.225329525617 l +252.184014624530 70.381579525617 l +251.352799675865 68.904817480577 l +254.575226795957 69.673348314939 l +260.406250000000 70.359375000000 l +270.523910039912 70.690857394210 l +273.186407177161 72.174765791999 l +274.049624252688 73.457293811137 l +274.375000000000 74.921875000000 l +107.893088734820 103.841923410053 l +269.375000000000 74.921875000000 l +269.694839960088 75.621642605790 l +260.406250000000 75.359375000000 l +253.596648204043 74.576651685061 l +250.197596782742 73.718304003256 l +248.084700324135 72.688932519423 l +247.253485375470 71.212170474383 l +242.847235375470 45.055920474383 l +242.862489198824 45.138065523199 l +240.182239292054 35.233559323790 l +235.370686386764 21.504331977696 l +230.614636510775 9.861248410540 l +229.674552059719 7.679370189724 l +229.774391761009 7.390935745817 l +230.218750000000 7.343750000000 l +230.358717033870 7.339828770678 l +229.540398296709 7.582784597075 l +229.732876939152 7.336891256731 l +227.576626939152 10.477516256731 l +227.866875111067 8.213016088905 l +240.116875111067 42.119266088905 l +240.265625000000 42.968750000000 l +242.834476684803 54.624010420679 l +242.829463828252 54.603904700294 l +244.534977630831 62.545346122432 l +245.453125000000 69.140625000000 l +244.611402180226 71.735213821357 l +242.306187063936 73.585381035651 l +238.867409665678 74.693638982119 l +234.625000000000 75.062500000000 l +229.906486871974 75.367549636876 l +229.092373983240 75.779215997735 l +228.934535185216 76.058687905577 l +228.890625000000 76.390625000000 l +229.790856054287 82.319994820356 l +232.571933261722 91.218385945649 l +232.574034113306 91.224265697666 l +234.986992254083 96.851263251065 l +237.441996845067 100.266302709491 l +237.439317291842 100.263712540141 l +244.074197100624 106.275959413741 l +247.409673148640 108.432844267021 l +246.875000000000 108.375000000000 l +251.578125000000 108.375000000000 l +249.088156711733 111.098736280975 l +248.501059746180 102.338409667587 l +248.503744619215 102.402406116755 l +248.000000000000 86.578125000000 l +248.204678607058 80.674424141238 l +248.635199756080 78.226325931503 l +249.564103209371 76.447917337745 l +249.529108047034 76.482233047034 l +251.855421271850 75.142541341903 l +254.812500000000 74.671875000000 l +258.571857984945 75.077633347234 l +263.279470079064 76.245639842274 l +263.205056758774 76.224611587009 l +267.479406097516 77.683738985792 l +266.973101252767 77.547023420208 l +268.046875000000 77.703125000000 l +268.247054721136 77.733964370993 l +268.227077605757 77.803800527161 l +268.040685564021 77.924371454157 l +267.977871868973 78.021719855177 l +268.985855115250 76.421460145957 l +269.308567902139 76.015446472685 l +269.418034045008 75.973989481328 l +269.375000000000 76.000000000000 l +269.375000000000 74.921875000000 l +107.893088734820 103.841923410053 l +243.911209450369 105.662056821622 l +240.832004992147 102.845101845416 l +236.815516984936 97.742848726260 l +236.813922800164 97.740633958664 l +232.773597278734 91.287437871638 l +230.710552894044 85.924483215760 l +230.745327869205 86.067653416413 l +229.840275149638 82.415038683708 l +229.855893749637 82.481339062591 l +229.093750000000 78.546875000000 l +229.510257350732 77.264688549054 l +230.557731326090 76.286764971873 l +233.333290689663 75.138571514324 l +238.843750000000 74.468750000000 l +241.980836948934 74.687319511759 l +245.189547085049 75.561169162745 l +247.167986856352 77.549353232692 l +248.217702574415 80.638507879225 l +248.687500000000 88.140625000000 l +248.194671228610 98.736670034806 l +248.200295344311 98.650162873539 l +247.698246960594 103.850772804200 l +243.911209450369 105.662056821622 l +107.893088734820 103.841923410053 l +242.739253039406 103.211727195800 l +243.205954655689 98.412337126461 l +243.211578771390 98.325829965194 l +243.687500000000 88.140625000000 l +243.282297425585 81.439617120775 l +243.185452914951 80.141955837255 l +241.300413051066 79.640805488241 l +238.843750000000 79.468750000000 l +234.557334310337 79.986428485676 l +234.323615830224 80.043375869145 l +234.139295619945 80.082650511165 l +233.899908001681 80.106538837663 l +233.805549923910 79.924172528127 l +234.093750000000 78.546875000000 l +234.706606250363 81.268660937409 l +234.722224850362 81.334961316292 l +235.567172130795 84.744846583587 l +235.601947105956 84.888016784240 l +237.273277721266 89.165687128362 l +240.873577199836 94.821866041336 l +240.871983015064 94.819651273740 l +244.355495007853 99.326773154584 l +246.526290549631 101.400443178378 l +242.739253039406 103.211727195800 l +107.893088734820 103.841923410053 l +304.579027849556 115.887559254375 l +299.647333003501 118.498603127587 l +299.601234810263 118.526555579345 l +296.960609810263 120.089055579345 l +295.687500000000 120.437500000000 l +292.434178516679 119.763451801101 l +289.591538470777 117.850158805700 l +287.263626957927 114.860898415742 l +285.554491073762 110.958948033170 l +285.546168760441 110.932189402305 l +283.409425227272 100.413450166388 l +283.408069329655 100.405281467271 l +280.968147929764 87.644193704042 l +284.218299056292 87.914012723915 l +279.519746335556 93.766171451312 l +279.798545332977 93.224824860858 l +274.937093489612 105.343910553875 l +272.454127837569 109.762553039486 l +269.772550129691 112.314814767144 l +266.294988321147 110.999865652887 l +264.699764075525 105.167535274279 l +264.676753039406 105.022647804200 l +264.221109604112 100.702343060691 l +264.171875000000 98.828125000000 l +263.607902205199 91.869081828698 l +263.613915250645 91.062865437610 l +263.781250000000 89.718750000000 l +263.644962649638 88.985351183708 l +262.873500431741 86.703985451358 l +262.739182179139 86.219942105230 l +260.786057179139 74.844942105230 l +260.786249814804 74.846062487964 l +256.958124814804 52.611687487964 l +256.955473276820 52.595988114755 l +254.892973276820 40.142863114755 l +254.909488793847 40.232428789163 l +254.331363793847 37.388678789163 l +254.339079247810 37.425229542768 l +253.651579247810 34.284604542768 l +253.593750000000 33.750000000000 l +254.239654341050 30.319069019177 l +254.154681406546 30.589185956325 l +256.319133024351 26.771372253672 l +258.818704827809 25.924919245868 l +261.217531024880 26.988383072536 l +263.253153025566 28.888095452080 l +264.856582863559 31.480336604342 l +265.958832572550 34.621386749163 l +266.013105788729 34.918097636045 l +267.200714432551 44.731495841479 l +267.198350954149 44.712535224402 l +269.443623734153 61.037071609407 l +269.421396014347 60.906344576785 l +270.652021489737 67.736566992690 l +271.992261513603 76.440263813345 l +271.992747064473 76.443809223415 l +273.038636247453 85.686082548185 l +273.390625000000 92.953125000000 l +273.238407027301 96.898129287691 l +272.771685367998 99.590064317759 l +267.989237947004 98.132898258783 l +271.223612947004 86.961023258783 l +271.391159168632 86.533772766328 l +274.526090303798 81.379570646076 l +274.584318175231 81.310286998919 l +276.982682022500 78.600716011250 l +277.142029400154 78.326905342657 l +279.265919333198 75.301911531816 l +279.298622345235 75.258362091268 l +281.876153531632 73.009942282517 l +284.906250000000 72.125000000000 l +287.318073492888 72.767987310135 l +289.339116026344 74.544184270464 l +290.903803647217 77.224443425871 l +291.946562402359 80.579617321243 l +291.963278527291 80.666832095730 l +293.477578855570 88.491377103079 l +294.532438780850 92.026218792971 l +294.690170210143 92.371639700252 l +298.832669585147 102.687317191341 l +298.821447919079 102.663322107333 l +301.483679194839 107.248880594573 l +302.541048238599 108.202972500861 l +303.515625000000 108.484375000000 l +306.015625000000 110.984375000000 l +306.015625000000 113.625000000000 l +304.579027849556 115.887559254375 l +107.893088734820 103.841923410053 l +301.015625000000 113.625000000000 l +301.015625000000 110.984375000000 l +303.515625000000 113.484375000000 l +300.984342386401 112.859527499139 l +298.555383305161 111.094869405427 l +296.303526841571 108.355227332168 l +294.303552080921 104.805427892667 l +294.292330414853 104.781432808659 l +289.997329789857 94.097110299748 l +290.155061219150 94.442531207029 l +288.709921144430 89.953935396921 l +287.036721472709 81.520667904270 l +287.053437597641 81.607882678757 l +286.004633973656 77.940190729536 l +284.906250000000 77.125000000000 l +284.500063101353 77.160595459408 l +284.155096468369 77.318182717483 l +283.263877654765 78.304137908732 l +283.296580666802 78.260588468184 l +281.295470599846 81.110594657343 l +281.454817977500 80.836783988750 l +278.353181824769 84.595963001081 l +278.411409696202 84.526679353924 l +275.858840831368 88.778727233672 l +276.026387052996 88.351476741217 l +272.792012052996 99.523351741217 l +268.009564632002 98.066185682241 l +268.390625000000 92.953125000000 l +268.055113752547 86.056104951815 l +267.038502935527 77.118690776585 l +267.038988486397 77.122236186655 l +265.722978510263 68.575933007310 l +264.516103985653 61.874905423215 l +264.493876265847 61.744178390593 l +262.239149045851 45.349964775598 l +262.236785567449 45.331004158521 l +261.049394211271 35.519402363955 l +261.103667427450 35.816113250837 l +259.699971974434 32.150967047920 l +257.681295172191 30.793830754132 l +260.180866975649 29.947377746328 l +259.001568593454 31.817064043675 l +258.916595658950 32.087180980823 l +258.593750000000 33.750000000000 l +258.535920752190 33.215395457232 l +259.223420752190 36.356020457232 l +259.231136206153 36.392571210837 l +259.809261206153 39.236321210837 l +259.825776723180 39.325886885245 l +261.888276723180 51.779011885245 l +261.885625185196 51.763312512036 l +265.713750185196 73.997687512036 l +265.713942820861 73.998807894770 l +267.667067820861 85.373807894770 l +267.532749568259 84.889764548642 l +268.526912350362 87.905273816292 l +268.781250000000 89.718750000000 l +268.542334749355 91.905884562390 l +268.548347794801 91.099668171302 l +269.171875000000 98.828125000000 l +269.216390395888 100.485156939309 l +269.635746960594 104.383602195800 l +269.612735924475 104.238714725721 l +270.955011678853 109.187634347113 l +267.477449870309 107.872685232856 l +268.686497162431 106.569478210514 l +270.375406510388 103.296714446125 l +275.107704667023 91.493925139142 l +275.386503664444 90.952578548688 l +278.700840527029 86.470174071108 l +281.281700943708 83.867237276085 l +284.531852070236 84.137056295958 l +285.408419686884 85.805066273498 l +286.324716189650 88.997159604327 l +288.341930670345 99.594718532729 l +288.340574772728 99.586549833612 l +290.328831239559 109.474060597695 l +290.320508926238 109.447301966830 l +291.419966792073 112.312929709258 l +292.611586529223 114.157653694300 l +293.999415233321 115.144751323899 l +295.687500000000 115.437500000000 l +294.414390189737 115.785944420655 l +297.055015189737 114.223444420655 l +297.008916996499 114.251396872413 l +302.452222150444 111.362440745625 l +301.015625000000 113.625000000000 l +107.893088734820 103.841923410053 l +374.437500000000 106.765625000000 l +373.775309600600 109.463093710969 l +372.064906958700 112.117295697199 l +372.041004786215 112.144602045402 l +368.522704503395 114.706400007155 l +366.442611342446 115.399541345014 l +364.281250000000 115.640625000000 l +355.911205219123 114.726652651698 l +341.052591424867 111.966274658224 l +341.038040421249 111.963294783992 l +326.905309277070 108.757693347762 l +319.727026481732 106.439595965247 l +319.807037817648 106.479160754059 l +310.484453831953 101.696158824691 l +304.482826587959 97.721718623918 l +304.310358047034 97.564641952966 l +302.095819571999 95.254869206705 l +298.220153609739 90.667578419636 l +300.367638895226 91.618501549714 l +296.258263895226 91.915376549714 l +296.078125000000 91.921875000000 l +293.025957236218 91.709450913344 l +290.151865257421 91.083888117023 l +285.254658796565 88.663603177256 l +285.219422230119 88.636374171395 l +281.529900243089 84.536170132203 l +280.513144708967 82.282593311151 l +280.156250000000 80.015625000000 l +280.896516775664 77.119922391977 l +282.806537684315 74.726645730656 l +285.448073147177 73.263018105533 l +288.686079158715 72.443690273534 l +290.750793112766 73.122099563886 l +293.797668112766 76.059599563886 l +293.736465601749 76.002539206463 l +295.798965601749 77.861914206463 l +294.222063773555 77.220634985862 l +301.862688773555 77.517509985862 l +299.265625000000 80.015625000000 l +299.934685624955 74.754308742711 l +301.898213943218 69.792099871114 l +305.090729619888 65.230982029954 l +309.446752320064 61.172938863978 l +309.482902906976 61.145713152252 l +318.065904047846 56.213131631660 l +329.455658353400 51.953267244508 l +329.496351456999 51.941186017188 l +336.615241964605 50.572965088062 l +336.666137267666 50.568817238037 l +342.150512267666 50.178192238037 l +342.328125000000 50.171875000000 l +347.088673798588 50.461178987176 l +351.635436696472 51.319590054257 l +355.904450990616 52.732856859568 l +359.831753977986 54.686728061438 l +363.292951645549 57.250115143707 l +365.880587968213 60.272932122861 l +367.501493801268 63.647371305944 l +368.062500000000 67.265625000000 l +367.659428864193 69.524372763002 l +366.507997055207 71.901249483478 l +362.306741008310 76.690232523947 l +362.309449580203 76.687848273793 l +355.067416613929 81.592460070084 l +345.579434368324 85.619156329617 l +345.543296906352 85.631025936969 l +338.856518222681 87.434049611292 l +331.674077585810 88.726763309129 l +324.032609882622 89.505258086643 l +315.968750000000 89.765625000000 l +315.697255981477 89.750839477245 l +313.837880981477 89.547714477245 l +314.109375000000 89.562500000000 l +315.203325765838 88.142787621838 l +315.234375000000 87.750000000000 l +315.261368553241 87.459370280378 l +315.416652198286 87.453346686481 l +316.557907675735 88.522399326740 l +316.429841220906 88.403882310796 l +319.273591220906 90.857007310796 l +318.935343465338 90.611377991437 l +331.091593465338 97.970752991437 l +330.612118984109 97.746034726917 l +334.956642245028 98.975789357391 l +339.851927078584 99.850564497063 l +351.453125000000 100.546875000000 l +354.203872313810 100.381670729150 l +355.159915151904 99.886038066767 l +355.055436157189 100.055596900919 l +357.900435727416 97.290434866877 l +362.379803562479 95.425955323112 l +363.015625000000 95.343750000000 l +366.828125000000 95.343750000000 l +368.997562855593 96.601357392681 l +374.106937855593 105.523232392681 l +374.437500000000 106.765625000000 l +107.893088734820 103.841923410053 l +369.768062144407 108.008017607319 l +364.658687144407 99.086142607319 l +366.828125000000 100.343750000000 l +363.015625000000 100.343750000000 l +363.651446437521 100.261544676888 l +360.724564272584 101.303315133123 l +359.413313842811 102.506903099081 l +359.308834848096 102.676461933233 l +358.021570604282 103.932262067178 l +356.186752686190 104.829266770850 l +351.453125000000 105.546875000000 l +345.006190631125 105.353277680068 l +339.085572921416 104.774435502937 l +333.730857754972 103.813273142609 l +328.981631015891 102.472715273083 l +328.502156534662 102.247997008563 l +316.345906534662 94.888622008563 l +316.007658779094 94.642992689204 l +313.163908779094 92.189867689204 l +313.035842324265 92.071350673260 l +311.083347801714 89.820090813519 l +310.234375000000 87.750000000000 l +310.265424234162 87.357212378162 l +310.780311953087 86.191927459145 l +311.752715552710 85.312201869144 l +314.109375000000 84.562500000000 l +314.380869018523 84.577285522755 l +316.240244018523 84.780410522755 l +315.968750000000 84.765625000000 l +323.705671367377 84.524038788357 l +330.935297414190 83.796674190871 l +337.694263027319 82.579622263708 l +344.019203093648 80.868974063031 l +343.983065631676 80.880843670383 l +352.635708386071 77.251289929916 l +359.003050419797 72.937151726207 l +359.005758991690 72.934767476053 l +362.163877944793 69.637813016522 l +363.062500000000 67.265625000000 l +362.747529636232 64.880949006556 l +361.740505781787 62.777849127139 l +359.948259291951 60.848517668793 l +357.277621022014 58.985146938562 l +353.920744321884 57.295463452932 l +350.352844553528 56.106191195743 l +346.509959013911 55.403078825324 l +342.328125000000 55.171875000000 l +342.505737732334 55.165557761963 l +337.021362732334 55.556182761963 l +337.072258035395 55.552034911938 l +330.878648543001 56.746313982812 l +330.919341646600 56.734232755492 l +320.246595952154 60.693118368340 l +312.454597093024 65.166786847748 l +312.490747679936 65.139561136022 l +308.794036005112 68.485814845046 l +306.234598556782 72.012587628886 l +304.746955000045 75.821863132289 l +304.265625000000 80.015625000000 l +301.668561226445 82.513740014138 l +294.027936226445 82.216865014138 l +292.451034398251 81.575585793537 l +290.388534398251 79.716210793537 l +290.327331887234 79.659150436114 l +287.280456887234 76.721650436114 l +289.345170841285 77.400059726466 l +287.321458102823 77.850263144467 l +285.927837315685 78.632729269344 l +285.271451974336 79.274608858023 l +285.175338636761 79.581613557521 l +285.156250000000 80.015625000000 l +285.837287256911 82.245079867797 l +288.311827769881 84.707375828605 l +288.276591203435 84.680146822744 l +291.660634742579 86.384861882977 l +296.078125000000 86.921875000000 l +295.897986104774 86.928373450286 l +300.007361104774 86.631498450286 l +302.154846390261 87.582421580364 l +305.732305428001 91.823255793295 l +307.845891952966 94.029108047034 l +307.673423412041 93.872031376082 l +313.085858668047 97.436653675309 l +321.942962182352 101.958339245941 l +322.022973518268 101.997904034753 l +328.415003222930 104.000119152238 l +342.055709578751 107.067955216008 l +342.041158575133 107.064975341776 l +356.698169780877 109.788972348302 l +364.281250000000 110.640625000000 l +366.516357996605 110.246724992845 l +368.302745213785 108.824147954598 l +368.278843041300 108.851454302801 l +369.437500000000 106.765625000000 l +369.768062144407 108.008017607319 l +107.893088734820 103.841923410053 l +359.034454681034 69.861443602839 l +357.173548986071 72.638610976591 l +353.435826646756 75.215386191513 l +347.992418306797 77.582163291606 l +341.014454609897 79.729336320871 l +326.426284670840 82.761098429090 l +319.640717587115 83.525315463381 l +313.234375000000 83.781250000000 l +312.706760041223 83.724940335389 l +311.331760041223 83.428065335389 l +311.389194323030 83.439762979730 l +309.920444323030 83.158512979730 l +310.390625000000 83.203125000000 l +309.032298883605 83.610801187634 l +305.860259182280 80.222501196670 l +308.487654632717 75.272571710106 l +311.451975717975 70.927537861140 l +314.718319876723 67.239682598354 l +318.251784547635 64.261288870324 l +318.235984828743 64.272646821685 l +322.460311501394 61.735717754517 l +327.134482463160 59.899177687483 l +332.183220900533 58.782772982128 l +337.531250000000 58.406250000000 l +345.475041381297 58.786142249068 l +351.020038715603 59.929523334009 l +351.130689531816 59.972424607386 l +353.699762084814 61.379594420291 l +355.915109055748 63.288105475323 l +357.703808635445 65.619192847673 l +358.992939014732 68.294091612533 l +359.034454681034 69.861443602839 l +107.893088734820 103.841923410053 l +354.288310985268 69.987158387467 l +352.366140944252 66.657207024677 l +349.213060468184 64.590075392614 l +349.323711284397 64.632976665991 l +344.735896118703 63.713857750932 l +337.531250000000 63.406250000000 l +332.857794724467 63.703555142872 l +328.623330036840 64.608634812517 l +324.752579123606 66.141235370483 l +321.170265171257 68.321103178315 l +321.154465452365 68.332461129676 l +318.096133248277 70.895083026646 l +315.305836782025 74.049024638860 l +312.748673492282 77.846568914895 l +310.389740817720 82.339998803330 l +307.217701116395 78.951698812366 l +310.390625000000 78.203125000000 l +310.860805676970 78.247737020270 l +312.329555676970 78.528987020270 l +312.386989958777 78.540684664611 l +313.761989958777 78.837559664611 l +313.234375000000 78.781250000000 l +319.326079287885 78.541090786619 l +325.753402829160 77.817026570910 l +339.735545390103 74.895663679129 l +350.446985853244 71.354926308487 l +353.125279138929 69.816467148409 l +354.246795318966 68.419806397161 l +354.288310985268 69.987158387467 l +107.893088734820 103.841923410053 l +412.906150029990 61.293260146951 l +409.761470127352 62.134684085464 l +407.280172710472 63.259435125605 l +407.285792255081 63.256184676520 l +404.793374271599 64.364965077547 l +402.406250000000 64.781250000000 l +400.799037804796 64.455489160260 l +399.281565012266 63.565560595750 l +396.896451926356 60.617324020679 l +395.843750000000 59.187500000000 l +394.132759007664 59.586356110398 l +392.227223295325 60.862510968959 l +387.514233459670 66.524236094764 l +387.523930329881 66.510005317299 l +384.972470502350 70.813073903396 l +383.182220364063 75.072391356081 l +382.127155126215 79.356608210051 l +381.781250000000 83.734375000000 l +382.036891605602 86.926476407739 l +382.837535469594 90.232985146136 l +382.953125000000 90.984375000000 l +382.953125000000 110.781250000000 l +380.453125000000 113.281250000000 l +374.875000000000 113.281250000000 l +372.797350977108 112.469290573921 l +370.771127450416 110.197059087430 l +366.940746762890 102.253660683699 l +366.931766441279 102.229357657717 l +364.988344509233 95.969248633492 l +363.592635453443 89.400212341223 l +362.750737781251 82.563409292771 l +362.468750000000 75.500000000000 l +362.469585639102 75.564633561058 l +362.375835639102 71.939633561058 l +362.376194806642 71.952282634846 l +362.282444806642 68.921032634846 l +362.281250000000 68.843750000000 l +362.557974048920 65.558176179264 l +363.371209408870 62.925233614273 l +365.078767647837 60.585701488502 l +367.830147985199 58.062445160283 l +369.390625000000 57.515625000000 l +372.609375000000 57.515625000000 l +375.044088155839 59.448023159988 l +375.637838155839 61.994898159988 l +375.701153736333 62.463240580013 l +375.794903736333 64.822615580013 l +375.796875000000 64.921875000000 l +375.796875000000 66.390625000000 l +375.727843254951 66.974057381188 l +375.364882971473 68.609156073692 l +375.377354243352 68.535253718305 l +374.986729243352 71.082128718305 l +375.015625000000 70.703125000000 l +375.946084438562 73.051058522014 l +371.472688855144 73.407169646001 l +374.338903268299 66.961197216653 l +377.510670879106 61.308691210684 l +380.962283852915 56.499192859154 l +384.668034355078 52.582243393122 l +384.668120639869 52.582165462116 l +388.032154904598 50.002880989291 l +391.626628158728 48.110057708285 l +395.367786243461 46.944465688666 l +399.171875000000 46.546875000000 l +400.072873198005 46.714879663986 l +404.885373198005 48.574254663986 l +404.871260445955 48.568850974212 l +412.883679720929 50.905386234424 l +414.906250000000 53.359375000000 l +414.906250000000 58.843750000000 l +412.906150029990 61.293260146951 l +107.893088734820 103.841923410053 l +409.906250000000 58.843750000000 l +409.906250000000 53.359375000000 l +411.928820279071 55.813363765576 l +403.097489554045 53.243649025788 l +403.083376801995 53.238245336014 l +398.270876801995 51.378870336014 l +399.171875000000 51.546875000000 l +396.227916881538 51.823112436334 l +393.443684341272 52.679004791715 l +390.735423220402 54.155322135709 l +388.019379360131 56.292834537884 l +388.019465644922 56.292756606878 l +384.707638022085 59.784010265846 l +381.637766620894 64.074121289316 l +378.784143606701 69.212630908347 l +376.121061144856 75.249080353999 l +371.647665561438 75.605191477986 l +370.464152438185 73.063686657060 l +370.015625000000 70.703125000000 l +370.044520756648 70.324121281695 l +370.435145756648 67.777246281695 l +370.447617028527 67.703343926308 l +370.865906745049 65.807192618812 l +370.796875000000 66.390625000000 l +370.796875000000 64.921875000000 l +370.798846263667 65.021134419987 l +370.705096263667 62.661759419987 l +370.768411844161 63.130101840012 l +370.174661844161 60.583226840012 l +372.609375000000 62.515625000000 l +369.390625000000 62.515625000000 l +370.951102014801 61.968804839717 l +367.847540591130 65.152891385727 l +367.281250000000 68.843750000000 l +367.280055193358 68.766467365154 l +367.373805193358 71.797717365154 l +367.374164360898 71.810366438942 l +367.467914360898 75.435366438942 l +367.468750000000 75.500000000000 l +367.725824718749 82.182684457229 l +368.501114546557 88.552912658777 l +369.800717990767 94.651845116508 l +371.630733558721 100.520642342283 l +371.621753237110 100.496339316301 l +374.875000000000 108.281250000000 l +380.453125000000 108.281250000000 l +377.953125000000 110.781250000000 l +377.953125000000 90.984375000000 l +378.068714530406 91.735764853864 l +377.111545894398 87.698523592261 l +376.781250000000 83.734375000000 l +377.206829248785 78.659016789949 l +378.466217135937 73.583858643919 l +380.533388872650 68.577551096604 l +383.382319670119 63.708744682701 l +383.392016540330 63.694513905236 l +386.493443824758 59.714265008269 l +389.655589204675 56.723426531041 l +392.798881617336 54.841378264602 l +395.843750000000 54.187500000000 l +397.450962195204 54.513260839740 l +398.968434987734 55.403189404250 l +401.353548073644 58.351425979321 l +402.406250000000 59.781250000000 l +404.776707744919 58.931315323480 l +404.782327289528 58.928064874395 l +408.035404872648 57.459065914536 l +411.906349970010 56.394239853049 l +409.906250000000 58.843750000000 l +107.893088734820 103.841923410053 l +.0 .0 .8 set-source-rgb fill + +/target get (out.png) write-to-png pop +pop diff --git a/util/cairo-sphinx/Makefile.am b/util/cairo-sphinx/Makefile.am new file mode 100644 index 000000000..10bc10c27 --- /dev/null +++ b/util/cairo-sphinx/Makefile.am @@ -0,0 +1,43 @@ +cairolibdir = $(libdir)/cairo + +cairolib_LTLIBRARIES = cairo-sphinx.la +bin_PROGRAMS = cairo-sphinx + +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/util/cairo-script + +cairo_sphinx_la_SOURCES = fdr.c +cairo_sphinx_la_CPPFLAGS = $(AM_CPPFLAGS) +cairo_sphinx_la_CFLAGS = $(CAIRO_CFLAGS) +cairo_sphinx_la_LDFLAGS = -module -no-undefined +if CAIRO_HAS_DL +cairo_sphinx_la_LIBADD = -ldl +endif + +cairo_sphinx_SOURCES = sphinx.c +cairo_sphinx_CPPFLAGS = $(AM_CPPFLAGS) -DLIBDIR="\"$(cairolibdir)\"" +cairo_sphinx_CFLAGS = $(CAIRO_CFLAGS) $(real_pthread_CFLAGS) $(glib_CFLAGS) +cairo_sphinx_LDADD = \ + $(real_pthread_LIBS) \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la \ + $(glib_LIBS) \ + $(CAIRO_LDADD) \ + $(shm_LIBS) +cairo_sphinx_DEPENDENCIES = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la + +# Install rules to rebuild the libraries and add explicit dependencies +$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la + +$(top_builddir)/src/libcairo.la: + cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la + +$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la diff --git a/util/cairo-sphinx/Makefile.in b/util/cairo-sphinx/Makefile.in new file mode 100644 index 000000000..ccdee137d --- /dev/null +++ b/util/cairo-sphinx/Makefile.in @@ -0,0 +1,872 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = cairo-sphinx$(EXEEXT) +subdir = util/cairo-sphinx +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/build/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(cairolibdir)" "$(DESTDIR)$(bindir)" +LTLIBRARIES = $(cairolib_LTLIBRARIES) +cairo_sphinx_la_DEPENDENCIES = +am_cairo_sphinx_la_OBJECTS = cairo_sphinx_la-fdr.lo +cairo_sphinx_la_OBJECTS = $(am_cairo_sphinx_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +cairo_sphinx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cairo_sphinx_la_CFLAGS) $(CFLAGS) $(cairo_sphinx_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) +am_cairo_sphinx_OBJECTS = cairo_sphinx-sphinx.$(OBJEXT) +cairo_sphinx_OBJECTS = $(am_cairo_sphinx_OBJECTS) +am__DEPENDENCIES_1 = +cairo_sphinx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(cairo_sphinx_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(cairo_sphinx_la_SOURCES) $(cairo_sphinx_SOURCES) +DIST_SOURCES = $(cairo_sphinx_la_SOURCES) $(cairo_sphinx_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +cairolibdir = $(libdir)/cairo +cairolib_LTLIBRARIES = cairo-sphinx.la +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/util/cairo-script + +cairo_sphinx_la_SOURCES = fdr.c +cairo_sphinx_la_CPPFLAGS = $(AM_CPPFLAGS) +cairo_sphinx_la_CFLAGS = $(CAIRO_CFLAGS) +cairo_sphinx_la_LDFLAGS = -module -no-undefined +@CAIRO_HAS_DL_TRUE@cairo_sphinx_la_LIBADD = -ldl +cairo_sphinx_SOURCES = sphinx.c +cairo_sphinx_CPPFLAGS = $(AM_CPPFLAGS) -DLIBDIR="\"$(cairolibdir)\"" +cairo_sphinx_CFLAGS = $(CAIRO_CFLAGS) $(real_pthread_CFLAGS) $(glib_CFLAGS) +cairo_sphinx_LDADD = \ + $(real_pthread_LIBS) \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la \ + $(glib_LIBS) \ + $(CAIRO_LDADD) \ + $(shm_LIBS) + +cairo_sphinx_DEPENDENCIES = \ + $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ + $(top_builddir)/boilerplate/libcairoboilerplate.la \ + $(top_builddir)/src/libcairo.la + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-sphinx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-sphinx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-cairolibLTLIBRARIES: $(cairolib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(cairolib_LTLIBRARIES)'; test -n "$(cairolibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairolibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairolibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(cairolibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(cairolibdir)"; \ + } + +uninstall-cairolibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(cairolib_LTLIBRARIES)'; test -n "$(cairolibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(cairolibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(cairolibdir)/$$f"; \ + done + +clean-cairolibLTLIBRARIES: + -test -z "$(cairolib_LTLIBRARIES)" || rm -f $(cairolib_LTLIBRARIES) + @list='$(cairolib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +cairo-sphinx.la: $(cairo_sphinx_la_OBJECTS) $(cairo_sphinx_la_DEPENDENCIES) $(EXTRA_cairo_sphinx_la_DEPENDENCIES) + $(AM_V_CCLD)$(cairo_sphinx_la_LINK) -rpath $(cairolibdir) $(cairo_sphinx_la_OBJECTS) $(cairo_sphinx_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +cairo-sphinx$(EXEEXT): $(cairo_sphinx_OBJECTS) $(cairo_sphinx_DEPENDENCIES) $(EXTRA_cairo_sphinx_DEPENDENCIES) + @rm -f cairo-sphinx$(EXEEXT) + $(AM_V_CCLD)$(cairo_sphinx_LINK) $(cairo_sphinx_OBJECTS) $(cairo_sphinx_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_sphinx-sphinx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cairo_sphinx_la-fdr.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +cairo_sphinx_la-fdr.lo: fdr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_sphinx_la_CPPFLAGS) $(CPPFLAGS) $(cairo_sphinx_la_CFLAGS) $(CFLAGS) -MT cairo_sphinx_la-fdr.lo -MD -MP -MF $(DEPDIR)/cairo_sphinx_la-fdr.Tpo -c -o cairo_sphinx_la-fdr.lo `test -f 'fdr.c' || echo '$(srcdir)/'`fdr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_sphinx_la-fdr.Tpo $(DEPDIR)/cairo_sphinx_la-fdr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fdr.c' object='cairo_sphinx_la-fdr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_sphinx_la_CPPFLAGS) $(CPPFLAGS) $(cairo_sphinx_la_CFLAGS) $(CFLAGS) -c -o cairo_sphinx_la-fdr.lo `test -f 'fdr.c' || echo '$(srcdir)/'`fdr.c + +cairo_sphinx-sphinx.o: sphinx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_sphinx_CPPFLAGS) $(CPPFLAGS) $(cairo_sphinx_CFLAGS) $(CFLAGS) -MT cairo_sphinx-sphinx.o -MD -MP -MF $(DEPDIR)/cairo_sphinx-sphinx.Tpo -c -o cairo_sphinx-sphinx.o `test -f 'sphinx.c' || echo '$(srcdir)/'`sphinx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_sphinx-sphinx.Tpo $(DEPDIR)/cairo_sphinx-sphinx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sphinx.c' object='cairo_sphinx-sphinx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_sphinx_CPPFLAGS) $(CPPFLAGS) $(cairo_sphinx_CFLAGS) $(CFLAGS) -c -o cairo_sphinx-sphinx.o `test -f 'sphinx.c' || echo '$(srcdir)/'`sphinx.c + +cairo_sphinx-sphinx.obj: sphinx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_sphinx_CPPFLAGS) $(CPPFLAGS) $(cairo_sphinx_CFLAGS) $(CFLAGS) -MT cairo_sphinx-sphinx.obj -MD -MP -MF $(DEPDIR)/cairo_sphinx-sphinx.Tpo -c -o cairo_sphinx-sphinx.obj `if test -f 'sphinx.c'; then $(CYGPATH_W) 'sphinx.c'; else $(CYGPATH_W) '$(srcdir)/sphinx.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cairo_sphinx-sphinx.Tpo $(DEPDIR)/cairo_sphinx-sphinx.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sphinx.c' object='cairo_sphinx-sphinx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cairo_sphinx_CPPFLAGS) $(CPPFLAGS) $(cairo_sphinx_CFLAGS) $(CFLAGS) -c -o cairo_sphinx-sphinx.obj `if test -f 'sphinx.c'; then $(CYGPATH_W) 'sphinx.c'; else $(CYGPATH_W) '$(srcdir)/sphinx.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(cairolibdir)" "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-cairolibLTLIBRARIES clean-generic \ + clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-cairolibLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-cairolibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-cairolibLTLIBRARIES clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS \ + install-cairolibLTLIBRARIES install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS \ + uninstall-cairolibLTLIBRARIES + + +# Install rules to rebuild the libraries and add explicit dependencies +$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la + +$(top_builddir)/src/libcairo.la: + cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la + +$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la + cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-sphinx/fdr.c b/util/cairo-sphinx/fdr.c new file mode 100644 index 000000000..aeda89bcd --- /dev/null +++ b/util/cairo-sphinx/fdr.c @@ -0,0 +1,261 @@ +/* cairo-fdr - a 'flight data recorder', a black box, for cairo + * + * Copyright © 2009 Chris Wilson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static void *_dlhandle = RTLD_NEXT; +#define DLCALL(name, args...) ({ \ + static typeof (&name) name##_real; \ + if (name##_real == NULL) { \ + name##_real = dlsym (_dlhandle, #name); \ + if (name##_real == NULL && _dlhandle == RTLD_NEXT) { \ + _dlhandle = dlopen ("libcairo.so", RTLD_LAZY); \ + name##_real = dlsym (_dlhandle, #name); \ + assert (name##_real != NULL); \ + } \ + } \ + (*name##_real) (args); \ +}) + +static cairo_device_t *fdr_context; +static const cairo_user_data_key_t fdr_key; + +static void +fdr_get_extents (cairo_surface_t *surface, + cairo_rectangle_t *extents) +{ + cairo_t *cr; + + cr = DLCALL (cairo_create, surface); + DLCALL (cairo_clip_extents, cr, + &extents->x, &extents->y, &extents->width, &extents->height); + DLCALL (cairo_destroy, cr); + + extents->width -= extents->x; + extents->height -= extents->y; +} + +static void +fdr_surface_destroy (void *surface) +{ + DLCALL (cairo_surface_destroy, surface); +} + +static void +fdr_surface_reference (void *surface) +{ + DLCALL (cairo_surface_reference, surface); +} + +static cairo_surface_t * +fdr_surface_get_tee (cairo_surface_t *surface) +{ + return DLCALL (cairo_surface_get_user_data, surface, &fdr_key); +} + +static cairo_surface_t * +fdr_tee_surface_index (cairo_surface_t *surface, int index) +{ + return DLCALL (cairo_tee_surface_index, surface, index); +} + +static cairo_status_t +fdr_write (void *closure, const unsigned char *data, unsigned int len) +{ + int fd = (int) (intptr_t) closure; + while (len) { + int ret = write (fd, data, len); + if (ret < 0) { + switch (errno) { + case EAGAIN: + case EINTR: + continue; + default: + return CAIRO_STATUS_WRITE_ERROR; + } + } else if (ret == 0) { + return CAIRO_STATUS_WRITE_ERROR; + } else { + data += ret; + len -= ret; + } + } + return CAIRO_STATUS_SUCCESS; +} + +cairo_t * +cairo_create (cairo_surface_t *surface) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee == NULL) { + cairo_surface_t *script; + cairo_rectangle_t extents; + cairo_content_t content; + + if (fdr_context == NULL) { + const char *env = getenv ("CAIRO_SPHINX_FD"); + int fd = env ? atoi (env) : 1; + fdr_context = DLCALL (cairo_script_create_for_stream, + fdr_write, (void *) (intptr_t) fd); + } + + fdr_get_extents (surface, &extents); + content = DLCALL (cairo_surface_get_content, surface); + + tee = DLCALL (cairo_tee_surface_create, surface); + script = DLCALL (cairo_script_surface_create, + fdr_context, content, extents.width, extents.height); + DLCALL (cairo_tee_surface_add, tee, script); + + DLCALL (cairo_surface_set_user_data, surface, + &fdr_key, tee, fdr_surface_destroy); + } + + return DLCALL (cairo_create, tee); +} + +static void +fdr_remove_tee (cairo_surface_t *surface) +{ + fdr_surface_reference (surface); + DLCALL (cairo_surface_set_user_data, surface, &fdr_key, NULL, NULL); + fdr_surface_destroy (surface); +} + +void +cairo_destroy (cairo_t *cr) +{ + cairo_surface_t *tee; + + tee = DLCALL (cairo_get_target, cr); + DLCALL (cairo_destroy, cr); + + if (DLCALL (cairo_surface_get_reference_count, tee) == 1) + fdr_remove_tee (fdr_tee_surface_index (tee, 0)); +} + +void +cairo_pattern_destroy (cairo_pattern_t *pattern) +{ + if (DLCALL (cairo_pattern_get_type, pattern) == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_t *surface; + + if (DLCALL (cairo_pattern_get_surface, pattern, &surface) == CAIRO_STATUS_SUCCESS && + DLCALL (cairo_surface_get_type, surface) == CAIRO_SURFACE_TYPE_TEE && + DLCALL (cairo_surface_get_reference_count, surface) == 2) + { + fdr_remove_tee (fdr_tee_surface_index (surface, 0)); + } + } + + DLCALL (cairo_pattern_destroy, pattern); +} + +cairo_surface_t * +cairo_get_target (cairo_t *cr) +{ + cairo_surface_t *tee; + + tee = DLCALL (cairo_get_target, cr); + return fdr_tee_surface_index (tee, 0); +} + +cairo_surface_t * +cairo_get_group_target (cairo_t *cr) +{ + cairo_surface_t *tee; + + tee = DLCALL (cairo_get_group_target, cr); + return fdr_tee_surface_index (tee, 0); +} + +cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + return DLCALL (cairo_pattern_create_for_surface, surface); +} + +cairo_status_t +cairo_pattern_get_surface (cairo_pattern_t *pattern, + cairo_surface_t **surface) +{ + cairo_status_t status; + cairo_surface_t *tee; + + status = DLCALL (cairo_pattern_get_surface, pattern, surface); + if (status != CAIRO_STATUS_SUCCESS) + return status; + + tee = fdr_surface_get_tee (*surface); + if (tee != NULL) + *surface = tee; + + return CAIRO_STATUS_SUCCESS; +} + +void +cairo_set_source_surface (cairo_t *cr, + cairo_surface_t *surface, + double x, double y) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + DLCALL (cairo_set_source_surface, cr, surface, x, y); +} + +cairo_surface_t * +cairo_surface_create_similar (cairo_surface_t *surface, + cairo_content_t content, + int width, int height) +{ + cairo_surface_t *tee; + + tee = fdr_surface_get_tee (surface); + if (tee != NULL) + surface = tee; + + return DLCALL (cairo_surface_create_similar, + surface, content, width, height); +} diff --git a/util/cairo-sphinx/sphinx.c b/util/cairo-sphinx/sphinx.c new file mode 100644 index 000000000..238d40064 --- /dev/null +++ b/util/cairo-sphinx/sphinx.c @@ -0,0 +1,1545 @@ +/* + * The intention for sphinx is for detection of rendering errors inside + * applications by simultaneously rendering on to the target device and on + * an image surface and comparing the two. If it found a discrepancy, it + * would then dump the trace that reproduces the error. (Then apply + * delta-debugging to reduce that down to a minimal trace.) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include /* for checksumming */ + +#ifndef CAIRO_HAS_REAL_PTHREAD +# error "cairo-sphinx needs real pthreads" +#endif + +#ifndef MAP_NORESERVE +#define MAP_NORESERVE 0 +#endif + +#define DATA_SIZE (256 << 20) +#define SHM_PATH_XXX "/shmem-cairo-sphinx" + +struct client { + int sk; + const cairo_boilerplate_target_t *target; + cairo_surface_t *surface; + void *base; + + cairo_script_interpreter_t *csi; + struct context_closure { + struct context_closure *next; + unsigned long id; + cairo_t *context; + cairo_surface_t *surface; + cairo_surface_t *original; + } *contexts; + + unsigned long context_id; +}; + +struct surface_tag { + long width, height; +}; +static const cairo_user_data_key_t surface_tag; + +static int +client_socket (const char *socket_path); + +static int +writen (int fd, const void *ptr, int len) +{ +#if 1 + const uint8_t *data = ptr; + while (len) { + int ret = write (fd, data, len); + if (ret < 0) { + switch (errno) { + case EAGAIN: + case EINTR: + continue; + default: + return FALSE; + } + } else if (ret == 0) { + return FALSE; + } else { + data += ret; + len -= ret; + } + } + return TRUE; +#else + int ret = send (fd, ptr, len, 0); + return ret == len; +#endif +} + +static int +readn (int fd, void *ptr, int len) +{ +#if 0 + uint8_t *data = ptr; + while (len) { + int ret = read (fd, data, len); + if (ret < 0) { + switch (errno) { + case EAGAIN: + case EINTR: + continue; + default: + return FALSE; + } + } else if (ret == 0) { + return FALSE; + } else { + data += ret; + len -= ret; + } + } + return TRUE; +#else + int ret = recv (fd, ptr, len, MSG_WAITALL); + return ret == len; +#endif +} +static int +open_devnull_to_fd (int want_fd, int flags) +{ + int error; + int got_fd; + + close (want_fd); + + got_fd = open("/dev/null", flags | O_CREAT, 0700); + if (got_fd == -1) + return -1; + + error = dup2 (got_fd, want_fd); + close (got_fd); + + return error; +} + +static int +daemonize (void) +{ + void (*oldhup) (int); + + /* Let the parent go. */ + switch (fork ()) { + case -1: return -1; + case 0: break; + default: _exit (0); + } + + /* Become session leader. */ + if (setsid () == -1) + return -1; + + /* Refork to yield session leadership. */ + oldhup = signal (SIGHUP, SIG_IGN); + switch (fork ()) { + case -1: return -1; + case 0: break; + default: _exit (0); + } + signal (SIGHUP, oldhup); + + /* Establish stdio. */ + if (open_devnull_to_fd (0, O_RDONLY) == -1) + return -1; + if (open_devnull_to_fd (1, O_WRONLY | O_APPEND) == -1) + return -1; + if (dup2 (1, 2) == -1) + return -1; + + return 0; +} + +static int +server_socket (const char *socket_path) +{ + long flags; + struct sockaddr_un addr; + int sk; + + unlink (socket_path); + + sk = socket (PF_UNIX, SOCK_STREAM, 0); + if (sk == -1) + return -1; + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, socket_path); + if (bind (sk, (struct sockaddr *) &addr, sizeof (addr)) == -1) { + close (sk); + return -1; + } + + flags = fcntl (sk, F_GETFL); + if (flags == -1 || fcntl (sk, F_SETFL, flags | O_NONBLOCK) == -1) { + close (sk); + return -1; + } + + if (listen (sk, 5) == -1) { + close (sk); + return -1; + } + + return sk; +} + +static int +readline (int fd, char *line, int max) +{ + int len = 0; + do { + int ret = read (fd, &line[len], 1); + if (ret <= 0) + return -1; + } while (line[len] != '\n' && ++len < max); + line[len] = '\0'; + return len; +} + +struct clients { + int count, size; + int complete; + + cairo_surface_t *recording; + unsigned long serial; + + struct client_info { + int sk; + int trace; + unsigned long image_serial; + cairo_surface_t *image; + char *name; + char *target; + char *reference; + + uint8_t *out_buf; + int out_len; + int out_size; + } *clients; + const char *shm_path; + unsigned long offset; + uint8_t *base; +}; + +static void * +clients_shm (const char *shm_path) +{ + void *base; + int fd; + + shm_unlink (shm_path); + fd = shm_open (shm_path, O_RDWR | O_EXCL | O_CREAT, 0777); + if (fd == -1) + return MAP_FAILED; + + if (ftruncate (fd, DATA_SIZE) == -1) { + close (fd); + return MAP_FAILED; + } + + base = mmap (NULL, DATA_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + close (fd); + + return base; +} + +static int +clients_init (struct clients *clients) +{ + clients->count = 0; + clients->complete = 0; + clients->size = 4; + clients->clients = xmalloc (clients->size * sizeof (struct client_info)); + + clients->shm_path = SHM_PATH_XXX; + clients->base = clients_shm (clients->shm_path); + if (clients->base == MAP_FAILED) + return -1; + clients->offset = 0; + + clients->recording = NULL; + clients->serial = 0; + + return 0; +} + +static void +clients_add_command (struct clients *clients, int fd, char *info) +{ + struct client_info *c; + char buf[1024]; + int len; + char *str; + + if (clients->count == clients->size) { + clients->size *= 2; + clients->clients = xrealloc (clients->clients, + clients->size * sizeof (struct client_info)); + } + + c = &clients->clients[clients->count++]; + c->sk = fd; + c->trace = -1; + c->image_serial = 0; + c->image = NULL; + c->name = c->target = c->reference = NULL; + + c->out_size = 8192; + c->out_buf = xmalloc (c->out_size); + c->out_len = 0; + + str = strstr (info, "name="); + if (str != NULL) { + char *sp = strchr (str + 5, ' '); + int len; + if (sp) + len = sp - str - 5; + else + len = strlen (str + 5); + c->name = xmalloc (len + 1); + memcpy (c->name, str + 5, len); + c->name[len] = '\0'; + } + + str = strstr (info, "target="); + if (str != NULL) { + char *sp = strchr (str + 7, ' '); + int len; + if (sp) + len = sp - str - 7; + else + len = strlen (str + 7); + c->target = xmalloc (len + 1); + memcpy (c->target, str + 7, len); + c->target[len] = '\0'; + } + + str = strstr (info, "reference="); + if (str != NULL) { + char *sp = strchr (str + 10, ' '); + int len; + if (sp) + len = sp - str - 10; + else + len = strlen (str + 10); + c->reference = xmalloc (len + 1); + memcpy (c->reference, str + 10, len); + c->reference[len] = '\0'; + } + + len = sprintf (buf, "%s\n", clients->shm_path); + writen (fd, buf, len); +} + +static void +clients_add_trace (struct clients *clients, int fd, char *info) +{ + char *str, *sp; + char *name; + int i; + + str = strstr (info, "name="); + assert (str != NULL); + sp = strchr (str + 5, ' '); + if (sp) + i = sp - str - 5; + else + i = strlen (str + 5); + + name = xmalloc (i + 1); + memcpy (name, str + 5, i); + name[i] = '\0'; + + for (i = 0; i < clients->count; i++) { + struct client_info *c = &clients->clients[i]; + if (strcmp (name, c->name) == 0) { + c->trace = fd; + break; + } + } + + free (name); +} + +static int +clients_image (struct clients *clients, int fd, char *info) +{ + struct client_info *c = NULL; + int format, width, height, stride, size; + int i; + + for (i = 0; i < clients->count; i++) { + if (clients->clients[i].sk == fd) { + c = &clients->clients[i]; + break; + } + } + + if (c == NULL) + return 0; + + if (sscanf (info, "%lu %d %d %d %d", + &c->image_serial, &format, &width, &height, &stride) != 5) + { + return 0; + } + + size = height * stride; + size = (size + 4095) & -4096; + assert (clients->offset + size <= DATA_SIZE); + + c->image = + cairo_image_surface_create_for_data (clients->base + clients->offset, + format, width, height, stride); + + if (! writen (fd, &clients->offset, sizeof (clients->offset))) + return 0; + + clients->offset += size; + + return 1; +} + +static int +u8_cmp (const void *A, const void *B) +{ + const uint8_t *a = A, *b = B; + return (int) *a - (int) *b; +} + +static uint8_t +median (uint8_t *values, int count) +{ + /* XXX could use a fast median here if we cared */ + qsort (values, count, 1, u8_cmp); + return values[count/2]; +} + +static uint32_t +get_pixel32 (int x, int y, const uint8_t *data, int stride) +{ + return ((uint32_t *)(data + y * stride))[x]; +} + +static uint8_t +get_median_32 (int x, int y, int channel, + const uint8_t *data, int width, int height, int stride) +{ + uint8_t neighbourhood[25]; + int cnt = 0; + int xx, yy; + + for (yy = y - 2; yy <= y + 2; yy++) { + if (yy < 0) + continue; + if (yy >= height) + continue; + + for (xx = x - 2; xx <= x + 2; xx++) { + if (xx < 0) + continue; + if (xx >= width) + continue; + + neighbourhood[cnt++] = (get_pixel32 (xx, yy, data, stride) >> (channel*8)) & 0xff; + } + } + + return median (neighbourhood, cnt); +} + +static uint8_t +get_pixel8 (int x, int y, const uint8_t *data, int stride) +{ + return data[y * stride + x]; +} + +static uint8_t +get_median_8 (int x, int y, const uint8_t *data, int width, int height, int stride) +{ + uint8_t neighbourhood[25]; + int cnt = 0; + int xx, yy; + + for (yy = y - 2; yy <= y + 2; yy++) { + if (yy < 0) + continue; + if (yy >= height) + continue; + + for (xx = x - 2; xx <= x + 2; xx++) { + if (xx < 0) + continue; + if (xx >= width) + continue; + + neighbourhood[cnt++] = get_pixel8 (xx, yy, data, stride); + } + } + + return median (neighbourhood, cnt); +} + +static cairo_bool_t +compare_images (cairo_surface_t *a, + cairo_surface_t *b) +{ + int width, height, stride; + const uint8_t *aa, *bb; + int x, y; + + if (cairo_surface_status (a) || cairo_surface_status (b)) + return FALSE; + + if (cairo_surface_get_type (a) != cairo_surface_get_type (b)) + return FALSE; + + if (cairo_image_surface_get_format (a) != cairo_image_surface_get_format (b)) + return FALSE; + + if (cairo_image_surface_get_width (a) != cairo_image_surface_get_width (b)) + return FALSE; + + if (cairo_image_surface_get_height (a) != cairo_image_surface_get_height (b)) + return FALSE; + + if (cairo_image_surface_get_stride (a) != cairo_image_surface_get_stride (b)) + return FALSE; + + + width = cairo_image_surface_get_width (a); + height = cairo_image_surface_get_height (a); + stride = cairo_image_surface_get_stride (a); + + aa = cairo_image_surface_get_data (a); + bb = cairo_image_surface_get_data (b); + switch (cairo_image_surface_get_format (a)) { + case CAIRO_FORMAT_ARGB32: + for (y = 0; y < height; y++) { + const uint32_t *ua = (uint32_t *) aa; + const uint32_t *ub = (uint32_t *) bb; + for (x = 0; x < width; x++) { + if (ua[x] != ub[x]) { + int channel; + + for (channel = 0; channel < 4; channel++) { + unsigned va, vb, diff; + + va = (ua[x] >> (channel*8)) & 0xff; + vb = (ub[x] >> (channel*8)) & 0xff; + diff = abs (va - vb); + if (diff > 1) { + va = get_median_32 (x, y, channel, aa, width, height, stride); + vb = get_median_32 (x, y, channel, bb, width, height, stride); + diff = abs (va - vb); + if (diff > 1) + return FALSE; + } + } + } + } + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_RGB24: + for (y = 0; y < height; y++) { + const uint32_t *ua = (uint32_t *) aa; + const uint32_t *ub = (uint32_t *) bb; + for (x = 0; x < width; x++) { + if ((ua[x] & 0x00ffffff) != (ub[x] & 0x00ffffff)) { + int channel; + + for (channel = 0; channel < 3; channel++) { + unsigned va, vb, diff; + + va = (ua[x] >> (channel*8)) & 0xff; + vb = (ub[x] >> (channel*8)) & 0xff; + diff = abs (va - vb); + if (diff > 1) { + va = get_median_32 (x, y, channel, aa, width, height, stride); + vb = get_median_32 (x, y, channel, bb, width, height, stride); + diff = abs (va - vb); + if (diff > 1) + return FALSE; + } + } + } + } + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_A8: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + if (aa[x] != bb[x]) { + unsigned diff = abs (aa[x] - bb[x]); + if (diff > 1) { + uint8_t va, vb; + + va = get_median_8 (x, y, aa, width, height, stride); + vb = get_median_8 (x, y, bb, width, height, stride); + diff = abs (va - vb); + if (diff > 1) + return FALSE; + } + + } + } + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_A1: + width /= 8; + for (y = 0; y < height; y++) { + if (memcmp (aa, bb, width)) + return FALSE; + aa += stride; + bb += stride; + } + break; + + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_RGB16_565: /* XXX */ + break; + } + + return TRUE; +} + +static int +check_images (struct clients *clients) +{ + int i, j; + + for (i = 0; i < clients->count; i++) { + struct client_info *c = &clients->clients[i]; + + if (c->reference == NULL) + continue; + + for (j = 0; j < clients->count; j++) { + struct client_info *ref = &clients->clients[j]; + + if (strcmp (c->reference, ref->name)) + continue; + + if (! compare_images (c->image, ref->image)) + return 0; + } + } + + return 1; +} + +static gchar * +checksum (const char *filename) +{ + gchar *str = NULL; + gchar *data; + gsize len; + + if (g_file_get_contents (filename, &data, &len, NULL)) { + str = g_compute_checksum_for_data (G_CHECKSUM_SHA1, (guchar *) data, len); + g_free (data); + } + + return str; +} + +static void +write_trace (struct clients *clients) +{ + cairo_device_t *ctx; + gchar *csum; + char buf[4096]; + int i; + + mkdir ("output", 0777); + + ctx = cairo_script_create ("output/cairo-sphinx.trace"); + cairo_script_from_recording_surface (ctx, clients->recording); + cairo_device_destroy (ctx); + + csum = checksum ("output/cairo-sphinx.trace"); + + sprintf (buf, "output/%s.trace", csum); + if (! g_file_test (buf, G_FILE_TEST_EXISTS)) { + rename ("output/cairo-sphinx.trace", buf); + + sprintf (buf, "output/%s.recording.png", csum); + cairo_surface_write_to_png (clients->recording, buf); + + for (i = 0; i < clients->count; i++) { + struct client_info *c = &clients->clients[i]; + if (c->image != NULL) { + sprintf (buf, "output/%s.%s.png", csum, c->name); + cairo_surface_write_to_png (c->image, buf); + } + } + } +} + +static void +clients_complete (struct clients *clients, int fd) +{ + int i; + + for (i = 0; i < clients->count; i++) { + if (clients->clients[i].sk == fd) { + break; + } + } + if (i == clients->count) + return; + + if (++clients->complete != clients->count) + return; + + clients->offset = 0; + clients->complete = 0; + + if (! check_images (clients)) + write_trace (clients); + + /* ack */ + for (i = 0; i < clients->count; i++) { + struct client_info *c = &clients->clients[i]; + + cairo_surface_destroy (c->image); + c->image = NULL; + + if (! writen (c->sk, &clients->serial, sizeof (clients->serial))) + continue; + + c->image_serial = 0; + } + + clients->recording = NULL; + clients->serial = 0; +} + +static void +clients_recording (struct clients *clients, int fd, char *info) +{ + sscanf (info, "%p %lu", &clients->recording, &clients->serial); + clients_complete (clients, fd); +} + +static void +clients_remove (struct clients *clients, int fd) +{ + int i, j; + + for (i = 0; i < clients->count; i++) { + struct client_info *c = &clients->clients[i]; + if (c->sk == fd) { + free (c->out_buf); + break; + } + } + + for (j = i++; i < clients->count; i++) + clients->clients[j] = clients->clients[i]; + + clients->count = j; +} + +static void +clients_send_trace (struct clients *clients, + const char * const line, const int len) +{ + int i; + + for (i = 0; i < clients->count; i++) { + struct client_info *c = &clients->clients[i]; + int ret, rem = len; + + if (c->trace == -1) + continue; + + if (c->out_len) { + ret = write (c->trace, c->out_buf, c->out_len); + if (ret > 0) { + c->out_len -= ret; + if (c->out_len) + memmove (c->out_buf, c->out_buf + ret, c->out_len); + } + } + + if (! c->out_len) { + ret = write (c->trace, line, rem); + if (ret > 0) + rem -= ret; + } + + if (rem) { + if (c->out_len + rem > c->out_size) { + c->out_size *= 2; + c->out_buf = xrealloc (c->out_buf, c->out_size); + } + + memcpy (c->out_buf + c->out_len, line, rem); + c->out_len += rem; + } + } +} + +static void +clients_fini (struct clients *clients) +{ + shm_unlink (clients->shm_path); + munmap (clients->base, DATA_SIZE); + free (clients->clients); +} + +static int +nonblocking (int fd) +{ + long flags; + + flags = fcntl (fd, F_GETFL); + if (flags == -1) + return -1; + + return fcntl (fd, F_SETFL, flags | O_NONBLOCK); +} + +static void * +request_image (struct client *c, + struct context_closure *closure, + cairo_format_t format, + int width, int height, int stride) +{ + char buf[1024]; + unsigned long offset = -1; + int len; + + assert (format != CAIRO_FORMAT_INVALID); + + len = sprintf (buf, ".image %lu %d %d %d %d\n", + closure->id, format, width, height, stride); + writen (c->sk, buf, len); + + readn (c->sk, &offset, sizeof (offset)); + if (offset == (unsigned long) -1) + return NULL; + + return (uint8_t *) c->base + offset; +} + +static cairo_format_t +format_for_content (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: + return CAIRO_FORMAT_A8; + case CAIRO_CONTENT_COLOR: + return CAIRO_FORMAT_RGB24; + default: + case CAIRO_CONTENT_COLOR_ALPHA: + return CAIRO_FORMAT_ARGB32; + } +} + +static void +get_surface_size (cairo_surface_t *surface, + int *width, int *height, + cairo_format_t *format) +{ + if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE) { + *width = cairo_image_surface_get_width (surface); + *height = cairo_image_surface_get_height (surface); + *format = cairo_image_surface_get_format (surface); + } else { + struct surface_tag *tag; + + tag = cairo_surface_get_user_data (surface, &surface_tag); + if (tag != NULL) { + *width = tag->width; + *height = tag->height; + } else { + double x0, x1, y0, y1; + cairo_t *cr; + + /* presumably created using cairo_surface_create_similar() */ + cr = cairo_create (surface); + cairo_clip_extents (cr, &x0, &y0, &x1, &y1); + cairo_destroy (cr); + + tag = xmalloc (sizeof (*tag)); + *width = tag->width = ceil (x1 - x0); + *height = tag->height = ceil (y1 - y0); + + if (cairo_surface_set_user_data (surface, &surface_tag, tag, free)) + exit (-1); + } + } +} + + +static void +send_surface (struct client *c, + struct context_closure *closure) +{ + cairo_surface_t *source = closure->surface; + cairo_surface_t *image; + cairo_format_t format = CAIRO_FORMAT_INVALID; + cairo_t *cr; + int width, height, stride; + void *data; + unsigned long serial; + + get_surface_size (source, &width, &height, &format); + if (format == CAIRO_FORMAT_INVALID) + format = format_for_content (cairo_surface_get_content (source)); + + stride = cairo_format_stride_for_width (format, width); + + data = request_image (c, closure, format, width, height, stride); + if (data == NULL) + exit (-1); + + image = cairo_image_surface_create_for_data (data, + format, + width, height, + stride); + cr = cairo_create (image); + cairo_surface_destroy (image); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_surface (cr, source, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + /* signal completion */ + writen (c->sk, ".complete\n", strlen (".complete\n")); + + /* wait for image check */ + serial = 0; + readn (c->sk, &serial, sizeof (serial)); + if (serial != closure->id) + exit (-1); +} + +static void +send_recording (struct client *c, + struct context_closure *closure) +{ + cairo_surface_t *source = closure->surface; + char buf[1024]; + int len; + unsigned long serial; + + assert (cairo_surface_get_type (source) == CAIRO_SURFACE_TYPE_RECORDING); + len = sprintf (buf, ".recording %p %lu\n", source, closure->id); + writen (c->sk, buf, len); + + /* wait for image check */ + + serial = 0; + readn (c->sk, &serial, sizeof (serial)); + if (serial != closure->id) + exit (-1); +} + +static cairo_surface_t * +_surface_create (void *closure, + cairo_content_t content, + double width, double height, + long uid) +{ + struct client *c = closure; + cairo_surface_t *surface; + + surface = cairo_surface_create_similar (c->surface, + content, width, height); + if (cairo_surface_get_type (surface) != CAIRO_SURFACE_TYPE_IMAGE) { + struct surface_tag *tag; + + tag = xmalloc (sizeof (*tag)); + tag->width = width; + tag->height = height; + if (cairo_surface_set_user_data (surface, &surface_tag, tag, free)) + exit (-1); + } + + return surface; +} + +static cairo_t * +_context_create (void *closure, cairo_surface_t *surface) +{ + struct client *c = closure; + struct context_closure *l; + cairo_bool_t foreign = FALSE; + + l = xmalloc (sizeof (*l)); + l->next = c->contexts; + l->surface = surface; + l->original = cairo_surface_reference (surface); + l->id = ++c->context_id; + if (l->id == 0) + l->id = ++c->context_id; + c->contexts = l; + + /* record everything, including writes to images */ + if (c->target == NULL) { + if (cairo_surface_get_type (surface) != CAIRO_SURFACE_TYPE_RECORDING) { + cairo_format_t format; + int width, height; + + get_surface_size (surface, &width, &height, &format); + l->surface = cairo_surface_create_similar (c->surface, + cairo_surface_get_content (surface), + width, height); + foreign = TRUE; + } + } + + l->context = cairo_create (l->surface); + if (foreign) { + cairo_set_source_surface (l->context, surface, 0, 0); + cairo_paint (l->context); + } + + return l->context; +} + +static void +_context_destroy (void *closure, void *ptr) +{ + struct client *c = closure; + struct context_closure *l, **prev = &c->contexts; + + while ((l = *prev) != NULL) { + if (l->context == ptr) { + if (cairo_surface_status (l->surface) == CAIRO_STATUS_SUCCESS) { + if (c->target == NULL) + send_recording (c, l); + else + send_surface (c, l); + } else { + exit (-1); + } + + cairo_surface_destroy (l->original); + *prev = l->next; + free (l); + return; + } + prev = &l->next; + } +} + +static void * +recorder (void *arg) +{ + struct client client; + const cairo_script_interpreter_hooks_t hooks = { + .closure = &client, + .surface_create = _surface_create, + .context_create = _context_create, + .context_destroy = _context_destroy, + }; + char *buf; + int buf_size; + int len = 0, ret; + struct pollfd pfd; + + client.target = NULL; + client.sk = client_socket ("/tmp/cairo-sphinx"); + if (client.sk < 0) + return NULL; + + buf_size = 65536; + buf = xmalloc (buf_size); + + len = sprintf (buf, "client-command target=recording name=.recorder\n"); + if (! writen (client.sk, buf, len)) + return NULL; + + /* drain the shm_path */ + len = readline (client.sk, buf, buf_size); + + pfd.fd = client_socket ("/tmp/cairo-sphinx"); + if (pfd.fd < 0) + return NULL; + + len = sprintf (buf, "client-trace name=.recorder\n"); + if (! writen (pfd.fd, buf, len)) + return NULL; + + client.surface = cairo_recording_surface_create (CAIRO_CONTENT_COLOR_ALPHA, + NULL); + + client.context_id = 0; + client.csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (client.csi, &hooks); + + nonblocking (pfd.fd); + pfd.events = POLLIN; + len = 0; + while (poll (&pfd, 1, -1) > 0) { + while ((ret = read (pfd.fd, buf + len, buf_size - len)) > 0) { + int end; + + if (ret == buf_size - len) { + buf_size *= 2; + buf = xrealloc (buf, buf_size); + } + len += ret; + + for (end = len; end > 0 && buf[--end] != '\n'; ) + ; + if (end > 0) { + buf[end] = '\0'; + cairo_script_interpreter_feed_string (client.csi, buf, end); + + len -= end + 1; + if (len) + memmove (buf, buf + end + 1, len); + } + } + if (ret == 0) + break; + if (! (errno == EAGAIN || errno == EINTR)) + break; + } + + cairo_script_interpreter_finish (client.csi); + cairo_script_interpreter_destroy (client.csi); + + cairo_surface_destroy (client.surface); + return NULL; +} + +static int +do_server (const char *path) +{ + pthread_t thread; + struct clients clients; + char line[4096]; + struct pollfd *pfd; + int num_pfd, size_pfd; + int n, cnt, ret = 1; + int sk, source = -1; + int waiter = -1, waiter_count = 0; + int len; + + signal (SIGPIPE, SIG_IGN); + + if (clients_init (&clients) < 0) { + fprintf (stderr, "Failed to initialise clients structure\n"); + return -1; + } + + sk = server_socket (path); + if (sk < 0) { + fprintf (stderr, "Failed to create server socket\n"); + return 1; + } + + if (daemonize () < 0) + return 1; + + if (pthread_create (&thread, NULL, recorder, NULL) < 0) { + fprintf (stderr, "Failed to create spawn recording thread\n"); + return 1; + } + + size_pfd = 4; + pfd = xmalloc (sizeof (*pfd) * size_pfd); + pfd[0].fd = sk; + pfd[0].events = POLLIN; + num_pfd = 1; + + while ((cnt = poll (pfd, num_pfd, -1)) > 0) { + int have_source; + + if (pfd[0].revents) { + while ((sk = accept (pfd[0].fd, NULL, NULL)) != -1) { + len = readline (sk, line, sizeof (line)); + if (strcmp (line, "source") == 0) { + + if (source != -1) + exit (1); + + source = sk; + if (nonblocking (sk) < 0) { + close (sk); + continue; + } + } else if (strncmp (line, "client-command", 14) == 0) { + if (source == -1) + clients_add_command (&clients, sk, line); + } else if (strncmp (line, "client-trace", 12) == 0) { + if (source == -1) { + clients_add_trace (&clients, sk, line); + if (nonblocking (sk) < 0) { + close (sk); + continue; + } + + if (clients.count == waiter_count) { + for (n = 1; n < num_pfd; n++) { + if (pfd[n].fd == waiter) { + pfd[n].fd = -1; + break; + } + } + close (waiter); + waiter_count = -1; + } + } + } else if (strncmp (line, "wait", 4) == 0) { + int count = atoi (line + 5) + 1; + if (clients.count == count) { + close (sk); + continue; + } else { + waiter = sk; + waiter_count = count; + } + } + + if (num_pfd == size_pfd) { + size_pfd *= 2; + pfd = xrealloc (pfd, sizeof (*pfd) * size_pfd); + } + + pfd[num_pfd].fd = sk; + pfd[num_pfd].events = POLLIN; + pfd[num_pfd].revents = 0; + num_pfd++; + } + cnt--; + } + + have_source = 0; + for (n = 1; cnt && n < num_pfd; n++) { + if (! pfd[n].revents) + continue; + cnt--; + + if (pfd[n].fd == -1) + continue; + + if (source == pfd[n].fd) { + have_source = n; + } else { + len = readline (pfd[n].fd, line, sizeof (line)); + if (len < 0) { + clients_remove (&clients, pfd[n].fd); + close (pfd[n].fd); + pfd[n].fd = -1; + continue; + } + + if (strncmp (line, ".image", 6) == 0) { + if (! clients_image (&clients, pfd[n].fd, line + 7)) { + clients_remove (&clients, pfd[n].fd); + close (pfd[n].fd); + pfd[n].fd = -1; + continue; + } + } else if (strncmp (line, ".complete", 9) == 0) { + clients_complete (&clients, pfd[n].fd); + } else if (strncmp (line, ".recording", 10) == 0) { + clients_recording (&clients, pfd[n].fd, line + 6); + } else { + printf ("do_command (%s)\n", line); + } + } + } + + if (have_source) { + do { + len = read (source, line, sizeof (line)); + if (len > 0) { + clients_send_trace (&clients, line, len); + } else if (len == 0) { + close (source); + pfd[have_source].fd = source = -1; + goto done; + } else + break; + } while (1); + } + + for (n = cnt = 1; n < num_pfd; n++) { + if (pfd[n].fd != -1) { + if (cnt != n) + pfd[cnt] = pfd[n]; + cnt++; + } + } + num_pfd = cnt; + } + +done: + ret = 0; + for (n = 0; n < num_pfd; n++) { + if (pfd[n].fd != -1) + close (pfd[n].fd); + } + free (pfd); + clients_fini (&clients); + + return ret; +} + +static void * +client_shm (const char *shm_path) +{ + void *base; + int fd; + + fd = shm_open (shm_path, O_RDWR, 0); + if (fd == -1) + return MAP_FAILED; + + base = mmap (NULL, DATA_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_NORESERVE, + fd, 0); + close (fd); + + return base; +} + +static int +client_socket (const char *socket_path) +{ + struct sockaddr_un addr; + int sk; + + sk = socket (PF_UNIX, SOCK_STREAM, 0); + if (sk == -1) + return -1; + + memset (&addr, 0, sizeof (addr)); + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, socket_path); + + if (connect (sk, (struct sockaddr *) &addr, sizeof (addr)) == -1) + return -1; + + return sk; +} + +static int +do_client (int fd, + const char *target, + const char *name, + const char *reference, + cairo_content_t content) +{ + struct client client; + const cairo_script_interpreter_hooks_t hooks = { + .closure = &client, + .surface_create = _surface_create, + .context_create = _context_create, + .context_destroy = _context_destroy, + }; + void *closure; + char *buf; + int buf_size; + int len = 0, ret; + struct pollfd pfd; + + client.sk = fd; + client.target = cairo_boilerplate_get_target_by_name (target, content); + client.context_id = 0; + + client.surface = client.target->create_surface (NULL, content, 1, 1, 1, 1, + CAIRO_BOILERPLATE_MODE_TEST, + &closure); + if (client.surface == NULL) { + fprintf (stderr, "Failed to create target surface: %s.\n", + client.target->name); + return 1; + } + + buf_size = 65536; + buf = xmalloc (buf_size); + + if (reference != NULL) { + len = sprintf (buf, + "client-command name=%s target=%s reference=%s\n", + name, target, reference); + } else { + len = sprintf (buf, + "client-command name=%s target=%s\n", + name, target); + } + if (! writen (fd, buf, len)) + return 1; + + len = readline (fd, buf, buf_size); + client.base = client_shm (buf); + if (client.base == MAP_FAILED) { + fprintf (stderr, "Failed to map shared memory segment '%s'.\n", buf); + return 1; + } + + if (daemonize () < 0) + return 1; + + pfd.fd = client_socket ("/tmp/cairo-sphinx"); + if (pfd.fd < 0) + return 1; + + len = sprintf (buf, "client-trace name=%s\n", name); + if (! writen (pfd.fd, buf, len)) + return 1; + + client.csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (client.csi, &hooks); + + nonblocking (pfd.fd); + pfd.events = POLLIN; + len = 0; + while (poll (&pfd, 1, -1) > 0) { + while ((ret = read (pfd.fd, buf + len, buf_size - len)) > 0) { + int end; + + if (ret == buf_size - len) { + buf_size *= 2; + buf = xrealloc (buf, buf_size); + } + len += ret; + + for (end = len; end > 0 && buf[--end] != '\n'; ) + ; + if (end > 0) { + buf[end] = '\0'; + cairo_script_interpreter_feed_string (client.csi, buf, end); + + len -= end + 1; + if (len) + memmove (buf, buf + end + 1, len); + } + } + if (ret == 0) + break; + if (! (errno == EAGAIN || errno == EINTR)) + break; + } + + cairo_script_interpreter_finish (client.csi); + cairo_script_interpreter_destroy (client.csi); + + cairo_surface_destroy (client.surface); + close (fd); + + return 0; +} + +static int +do_exec (int fd, char **argv) +{ + char buf[4096]; + + if (*argv == NULL) + return 0; + + snprintf (buf, sizeof (buf), "%s/cairo-trace.so", LIBDIR); + setenv ("LD_PRELOAD", buf, 1); + + snprintf (buf, sizeof (buf), "0"); + setenv ("CAIRO_TRACE_LINE_INFO", buf, 1); + + snprintf (buf, sizeof (buf), "%d", fd); + setenv ("CAIRO_TRACE_FD", buf, 1); + putenv (buf); + + return execvp (argv[0], argv); +} + +static int +do_wait (int fd) +{ + char buf; + int ret = read (fd, &buf, 1); + return ret != 0; +} + +int +main (int argc, char **argv) +{ + char buf[4096]; + int len; + int fd; + + if (argc == 1) + return do_server ("/tmp/cairo-sphinx"); + + fd = client_socket ("/tmp/cairo-sphinx"); + if (fd < 0) + return 1; + + if (strcmp (argv[1], "client") == 0) { + return do_client (fd, argv[2], argv[3], argv[4], + CAIRO_CONTENT_COLOR_ALPHA); + } + + if (strcmp (argv[1], "wait") == 0) { + len = snprintf (buf, sizeof (buf), "wait %s\n", argv[2]); + if (! writen (fd, buf, len)) + return 1; + + return do_wait (fd); + } + + if (strcmp (argv[1], "exec") == 0) { + len = snprintf (buf, sizeof (buf), "source\n"); + if (! writen (fd, buf, len)) + return 1; + + return do_exec (fd, argv+2); + } + + if (strcmp (argv[1], "replay") == 0) { + len = snprintf (buf, sizeof (buf), "replay %s\n", argv[2]); + return ! writen (fd, buf, len); + } + + return 0; +} diff --git a/util/cairo-trace/COPYING b/util/cairo-trace/COPYING new file mode 100644 index 000000000..37aeee076 --- /dev/null +++ b/util/cairo-trace/COPYING @@ -0,0 +1,5 @@ +Cairo is free software. + +cairo-trace is released under the terms of the GNU General Public License +(GPL) version 3. Please see COPYING-GPL-3 for the precise terms and +conditions. diff --git a/util/cairo-trace/COPYING-GPL-3 b/util/cairo-trace/COPYING-GPL-3 new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/util/cairo-trace/COPYING-GPL-3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/util/cairo-trace/Makefile.am b/util/cairo-trace/Makefile.am new file mode 100644 index 000000000..3278abe42 --- /dev/null +++ b/util/cairo-trace/Makefile.am @@ -0,0 +1,40 @@ +cairolibdir = $(libdir)/cairo +cairooutdir = $(localstatedir)/lib/cairo-trace + +bin_SCRIPTS = cairo-trace +cairolib_LTLIBRARIES = libcairo-trace.la + +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src + +libcairo_trace_la_SOURCES = trace.c +libcairo_trace_la_CPPFLAGS = -DCAIRO_TRACE_OUTDIR="\"$(cairooutdir)\"" \ + $(AM_CPPFLAGS) +libcairo_trace_la_CFLAGS = $(CAIRO_CFLAGS) $(real_pthread_CFLAGS) +libcairo_trace_la_LDFLAGS = -no-undefined + +libcairo_trace_la_LIBADD = $(real_pthread_LIBS) -lz +if CAIRO_HAS_DL +libcairo_trace_la_LIBADD += -ldl +endif + +if CAIRO_HAS_SYMBOL_LOOKUP +libcairo_trace_la_SOURCES += \ + lookup-symbol.c \ + lookup-symbol.h +libcairo_trace_la_LIBADD += $(BFD_LIBS) +endif + + +system-install: install + -mkdir -p $(cairooutdir) + -chmod 01777 $(cairooutdir) + grep -sq $(cairolibdir)/libcairo-trace.so /etc/ld.so.preload || echo $(cairolibdir)/libcairo-trace.so >> /etc/ld.so.preload + +system-uninstall: uninstall + sed -e '/libcairo-trace.so/d' < /etc/ld.so.preload > /tmp/ld.so.preload && mv /tmp/ld.so.preload /etc/ld.so.preload; + +EXTRA_DIST = \ + COPYING \ + COPYING-GPL-3 \ + cairo-trace.in diff --git a/util/cairo-trace/Makefile.in b/util/cairo-trace/Makefile.in new file mode 100644 index 000000000..a381384e0 --- /dev/null +++ b/util/cairo-trace/Makefile.in @@ -0,0 +1,844 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@CAIRO_HAS_DL_TRUE@am__append_1 = -ldl +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_2 = \ +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@ lookup-symbol.c \ +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@ lookup-symbol.h + +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__append_3 = $(BFD_LIBS) +subdir = util/cairo-trace +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(srcdir)/cairo-trace.in $(top_srcdir)/build/depcomp COPYING +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/build/aclocal.cairo.m4 \ + $(top_srcdir)/build/aclocal.compare.m4 \ + $(top_srcdir)/build/aclocal.enable.m4 \ + $(top_srcdir)/build/aclocal.float.m4 \ + $(top_srcdir)/build/aclocal.makefile.m4 \ + $(top_srcdir)/build/aclocal.pkg.m4 \ + $(top_srcdir)/build/gtk-doc.m4 $(top_srcdir)/build/libtool.m4 \ + $(top_srcdir)/build/ltoptions.m4 \ + $(top_srcdir)/build/ltsugar.m4 \ + $(top_srcdir)/build/ltversion.m4 \ + $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/cairo-version.h \ + $(top_srcdir)/build/configure.ac.version \ + $(top_srcdir)/build/configure.ac.tools \ + $(top_srcdir)/build/configure.ac.features \ + $(top_srcdir)/build/configure.ac.warnings \ + $(top_srcdir)/build/configure.ac.system \ + $(top_srcdir)/build/configure.ac.analysis \ + $(top_srcdir)/build/configure.ac.noversion \ + $(top_srcdir)/build/configure.ac.pthread \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = cairo-trace +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(cairolibdir)" "$(DESTDIR)$(bindir)" +LTLIBRARIES = $(cairolib_LTLIBRARIES) +am__DEPENDENCIES_1 = +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__DEPENDENCIES_2 = \ +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@ $(am__DEPENDENCIES_1) +libcairo_trace_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +am__libcairo_trace_la_SOURCES_DIST = trace.c lookup-symbol.c \ + lookup-symbol.h +@CAIRO_HAS_SYMBOL_LOOKUP_TRUE@am__objects_1 = libcairo_trace_la-lookup-symbol.lo +am_libcairo_trace_la_OBJECTS = libcairo_trace_la-trace.lo \ + $(am__objects_1) +libcairo_trace_la_OBJECTS = $(am_libcairo_trace_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcairo_trace_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libcairo_trace_la_CFLAGS) $(CFLAGS) \ + $(libcairo_trace_la_LDFLAGS) $(LDFLAGS) -o $@ +SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libcairo_trace_la_SOURCES) +DIST_SOURCES = $(am__libcairo_trace_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BFD_LIBS = @BFD_LIBS@ +CAIROBOILERPLATE_LIBS = @CAIROBOILERPLATE_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_LDFLAGS = @CAIRO_LDFLAGS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CAIRO_LIBTOOL_VERSION_INFO = @CAIRO_LIBTOOL_VERSION_INFO@ +CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ +CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ +CAIRO_RELEASE_STATUS = @CAIRO_RELEASE_STATUS@ +CAIRO_REQUIRES = @CAIRO_REQUIRES@ +CAIRO_TEST_MODE = @CAIRO_TEST_MODE@ +CAIRO_TEST_UNDEFINED_LDFLAGS = @CAIRO_TEST_UNDEFINED_LDFLAGS@ +CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ +CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ +CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ +CAIRO_VERSION_SONUM = @CAIRO_VERSION_SONUM@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FIND = @FIND@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ +GOBJECT_LIBS = @GOBJECT_LIBS@ +GREP = @GREP@ +GS = @GS@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ +LIBRSVG_LIBS = @LIBRSVG_LIBS@ +LIBS = @LIBS@ +LIBSPECTRE_CFLAGS = @LIBSPECTRE_CFLAGS@ +LIBSPECTRE_LIBS = @LIBSPECTRE_LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTP = @LTP@ +LTP_GENHTML = @LTP_GENHTML@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ +PKG_CONFIG = @PKG_CONFIG@ +POPPLER_CFLAGS = @POPPLER_CFLAGS@ +POPPLER_LIBS = @POPPLER_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHLIB_EXT = @SHLIB_EXT@ +SHM_LIBS = @SHM_LIBS@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +XARGS = @XARGS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cogl_CFLAGS = @cogl_CFLAGS@ +cogl_LIBS = @cogl_LIBS@ +datadir = @datadir@ +datarootdir = @datarootdir@ +directfb_CFLAGS = @directfb_CFLAGS@ +directfb_LIBS = @directfb_LIBS@ +docdir = @docdir@ +drm_CFLAGS = @drm_CFLAGS@ +drm_LIBS = @drm_LIBS@ +dvidir = @dvidir@ +egl_CFLAGS = @egl_CFLAGS@ +egl_LIBS = @egl_LIBS@ +exec_prefix = @exec_prefix@ +gallium_DIR = @gallium_DIR@ +gl_CFLAGS = @gl_CFLAGS@ +gl_LIBS = @gl_LIBS@ +glesv2_CFLAGS = @glesv2_CFLAGS@ +glesv2_LIBS = @glesv2_LIBS@ +glib_CFLAGS = @glib_CFLAGS@ +glib_LIBS = @glib_LIBS@ +gtk_CFLAGS = @gtk_CFLAGS@ +gtk_LIBS = @gtk_LIBS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_LIBS = @lzo_LIBS@ +mandir = @mandir@ +mesa_DIR = @mesa_DIR@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pixman_CFLAGS = @pixman_CFLAGS@ +pixman_LIBS = @pixman_LIBS@ +png_CFLAGS = @png_CFLAGS@ +png_LIBS = @png_LIBS@ +png_REQUIRES = @png_REQUIRES@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_CFLAGS = @pthread_CFLAGS@ +pthread_LIBS = @pthread_LIBS@ +qt_CFLAGS = @qt_CFLAGS@ +qt_LIBS = @qt_LIBS@ +real_pthread_CFLAGS = @real_pthread_CFLAGS@ +real_pthread_LIBS = @real_pthread_LIBS@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shm_LIBS = @shm_LIBS@ +skia_DIR = @skia_DIR@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +xcb_CFLAGS = @xcb_CFLAGS@ +xcb_LIBS = @xcb_LIBS@ +xcb_shm_CFLAGS = @xcb_shm_CFLAGS@ +xcb_shm_LIBS = @xcb_shm_LIBS@ +xlib_CFLAGS = @xlib_CFLAGS@ +xlib_LIBS = @xlib_LIBS@ +xlib_xcb_CFLAGS = @xlib_xcb_CFLAGS@ +xlib_xcb_LIBS = @xlib_xcb_LIBS@ +xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ +xlib_xrender_LIBS = @xlib_xrender_LIBS@ +cairolibdir = $(libdir)/cairo +cairooutdir = $(localstatedir)/lib/cairo-trace +bin_SCRIPTS = cairo-trace +cairolib_LTLIBRARIES = libcairo-trace.la +AM_CPPFLAGS = -I$(top_srcdir)/src \ + -I$(top_builddir)/src + +libcairo_trace_la_SOURCES = trace.c $(am__append_2) +libcairo_trace_la_CPPFLAGS = -DCAIRO_TRACE_OUTDIR="\"$(cairooutdir)\"" \ + $(AM_CPPFLAGS) + +libcairo_trace_la_CFLAGS = $(CAIRO_CFLAGS) $(real_pthread_CFLAGS) +libcairo_trace_la_LDFLAGS = -no-undefined +libcairo_trace_la_LIBADD = $(real_pthread_LIBS) -lz $(am__append_1) \ + $(am__append_3) +EXTRA_DIST = \ + COPYING \ + COPYING-GPL-3 \ + cairo-trace.in + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/cairo-trace/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/cairo-trace/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +cairo-trace: $(top_builddir)/config.status $(srcdir)/cairo-trace.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +install-cairolibLTLIBRARIES: $(cairolib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(cairolib_LTLIBRARIES)'; test -n "$(cairolibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(cairolibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cairolibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(cairolibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(cairolibdir)"; \ + } + +uninstall-cairolibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(cairolib_LTLIBRARIES)'; test -n "$(cairolibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(cairolibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(cairolibdir)/$$f"; \ + done + +clean-cairolibLTLIBRARIES: + -test -z "$(cairolib_LTLIBRARIES)" || rm -f $(cairolib_LTLIBRARIES) + @list='$(cairolib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libcairo-trace.la: $(libcairo_trace_la_OBJECTS) $(libcairo_trace_la_DEPENDENCIES) $(EXTRA_libcairo_trace_la_DEPENDENCIES) + $(AM_V_CCLD)$(libcairo_trace_la_LINK) -rpath $(cairolibdir) $(libcairo_trace_la_OBJECTS) $(libcairo_trace_la_LIBADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_trace_la-lookup-symbol.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_trace_la-trace.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libcairo_trace_la-trace.lo: trace.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcairo_trace_la_CPPFLAGS) $(CPPFLAGS) $(libcairo_trace_la_CFLAGS) $(CFLAGS) -MT libcairo_trace_la-trace.lo -MD -MP -MF $(DEPDIR)/libcairo_trace_la-trace.Tpo -c -o libcairo_trace_la-trace.lo `test -f 'trace.c' || echo '$(srcdir)/'`trace.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_trace_la-trace.Tpo $(DEPDIR)/libcairo_trace_la-trace.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='trace.c' object='libcairo_trace_la-trace.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcairo_trace_la_CPPFLAGS) $(CPPFLAGS) $(libcairo_trace_la_CFLAGS) $(CFLAGS) -c -o libcairo_trace_la-trace.lo `test -f 'trace.c' || echo '$(srcdir)/'`trace.c + +libcairo_trace_la-lookup-symbol.lo: lookup-symbol.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcairo_trace_la_CPPFLAGS) $(CPPFLAGS) $(libcairo_trace_la_CFLAGS) $(CFLAGS) -MT libcairo_trace_la-lookup-symbol.lo -MD -MP -MF $(DEPDIR)/libcairo_trace_la-lookup-symbol.Tpo -c -o libcairo_trace_la-lookup-symbol.lo `test -f 'lookup-symbol.c' || echo '$(srcdir)/'`lookup-symbol.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcairo_trace_la-lookup-symbol.Tpo $(DEPDIR)/libcairo_trace_la-lookup-symbol.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lookup-symbol.c' object='libcairo_trace_la-lookup-symbol.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcairo_trace_la_CPPFLAGS) $(CPPFLAGS) $(libcairo_trace_la_CFLAGS) $(CFLAGS) -c -o libcairo_trace_la-lookup-symbol.lo `test -f 'lookup-symbol.c' || echo '$(srcdir)/'`lookup-symbol.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) +installdirs: + for dir in "$(DESTDIR)$(cairolibdir)" "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-cairolibLTLIBRARIES clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-cairolibLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binSCRIPTS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binSCRIPTS uninstall-cairolibLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-cairolibLTLIBRARIES clean-generic clean-libtool \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binSCRIPTS install-cairolibLTLIBRARIES install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-binSCRIPTS \ + uninstall-cairolibLTLIBRARIES + + +system-install: install + -mkdir -p $(cairooutdir) + -chmod 01777 $(cairooutdir) + grep -sq $(cairolibdir)/libcairo-trace.so /etc/ld.so.preload || echo $(cairolibdir)/libcairo-trace.so >> /etc/ld.so.preload + +system-uninstall: uninstall + sed -e '/libcairo-trace.so/d' < /etc/ld.so.preload > /tmp/ld.so.preload && mv /tmp/ld.so.preload /etc/ld.so.preload; + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/util/cairo-trace/cairo-trace.in b/util/cairo-trace/cairo-trace.in new file mode 100644 index 000000000..ece90d3eb --- /dev/null +++ b/util/cairo-trace/cairo-trace.in @@ -0,0 +1,136 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ + +nofile= +flush= +nocallers= +nomarkdirty= +compress= + +usage() { +cat << EOF +usage: cairo-trace [--no-file] command +cairo-trace will generate a log of all calls made by command to +cairo. This log will be stored in a file in the local directory +called command.pid.trace. +Whatever else happens is driven by its argument: + --flush - Flush the output trace after every call. + --no-file - Disable the creation of an output file. Outputs to the + terminal instead. + --no-callers - Do not lookup the caller address/symbol/line whilst tracing. + --mark-dirty - Record image data for cairo_mark_dirty() [default] + --no-mark-dirty - Do not record image data for cairo_mark_dirty() + --compress - Compress the output with LZMA + --profile - Combine --no-callers and --no-mark-dirty and --compress + +Environment variables understood by cairo-trace: + CAIRO_TRACE_FLUSH - flush the output after every function call. + CAIRO_TRACE_LINE_INFO - emit line information for most function calls. +EOF +exit +} + +skip=1 +while test $skip -eq 1; do + skip=0 + case $1 in + --flush) + skip=1 + flush=1 + ;; + --no-file) + skip=1 + nofile=1 + ;; + --no-callers) + skip=1 + nocallers=1 + ;; + --mark-dirty) + skip=1 + nomarkdirty= + ;; + --no-mark-dirty) + skip=1 + nomarkdirty=1 + ;; + --compress) + skip=1 + compress=1 + nofile=1 + ;; + --profile) + skip=1 + compress=1 + nomarkdirty=1 + nocallers=1 + nofile=1 + ;; + --version) + echo "cairo-trace, version @CAIRO_VERSION_MAJOR@.@CAIRO_VERSION_MINOR@.@CAIRO_VERSION_MICRO@." + exit + ;; + --help) + usage + ;; + esac + if test $skip -eq 1; then + shift + fi +done + +if test $# -eq 0; then + usage +fi + +CAIRO_TRACE_PROG_NAME="$1" +export CAIRO_TRACE_PROG_NAME + +if test "x$CAIRO_TRACE_SO" = "x"; then + CAIRO_TRACE_SO="" + for lib in @libdir@/cairo/libcairo-trace.@SHLIB_EXT@ @libdir@/cairo/libcairo-trace.@SHLIB_EXT@* @libdir@/cairo/libcairo-trace.*.@SHLIB_EXT@ ; do + if test -h "$lib" -o -f "$lib"; then + CAIRO_TRACE_SO="$lib" + break + fi + done +fi +if test "x$CAIRO_TRACE_SO" = "x"; then + echo "Could not find the cairo-trace shared library in @libdir@/cairo/." >&2 + echo "Set the CAIRO_TRACE_SO environment variable to the full path of the library." >&2 + exit 15 +fi + +LD_PRELOAD="$CAIRO_TRACE_SO" +DYLD_INSERT_LIBRARIES="$CAIRO_TRACE_SO" +DYLD_FORCE_FLAT_NAMESPACE=1 +export LD_PRELOAD +export DYLD_INSERT_LIBRARIES +export DYLD_FORCE_FLAT_NAMESPACE + +if test -n "$nocallers"; then + CAIRO_TRACE_LINE_INFO=0 + export CAIRO_TRACE_LINE_INFO +fi + +if test -n "$nomarkdirty"; then + CAIRO_TRACE_MARK_DIRTY=0 + export CAIRO_TRACE_MARK_DIRTY +fi + +if test -n "$flush"; then + CAIRO_TRACE_FLUSH=1 + export CAIRO_TRACE_FLUSH +fi + +if test -z "$nofile"; then + CAIRO_TRACE_OUTDIR=`pwd` "$@" +elif test -n "$compress"; then + name=`basename $1` + echo Generating compressed trace file $name.$$.lzma + CAIRO_TRACE_FD=3 "$@" 3>&1 >/dev/null | lzma -cz9 > $name.$$.lzma +else + CAIRO_TRACE_FD=3 "$@" 3>&1 >/dev/null +fi diff --git a/util/cairo-trace/lookup-symbol.c b/util/cairo-trace/lookup-symbol.c new file mode 100644 index 000000000..f9665b36f --- /dev/null +++ b/util/cairo-trace/lookup-symbol.c @@ -0,0 +1,331 @@ +/* cairo-trace - a utility to record and replay calls to the Cairo library. + * + * Copyright © 2008 Chris Wilson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * A less hacky utility to lookup the debug strings for a particular + * .text address. + * Derived from backtrace-symbols.c in cairo by Chris Wilson. + */ + +/* + A hacky replacement for backtrace_symbols in glibc + + backtrace_symbols in glibc looks up symbols using dladdr which is limited + in the symbols that it sees. libbacktracesymbols opens the executable and + shared libraries using libbfd and will look up backtrace information using + the symbol table and the dwarf line information. + + It may make more sense for this program to use libelf instead of libbfd. + However, I have not investigated that yet. + + Derived from addr2line.c from GNU Binutils by Jeff Muizelaar + + Copyright 2007 Jeff Muizelaar + */ + +/* addr2line.c -- convert addresses to line number and function name + Copyright 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by Ulrich Lauther + + This file was part of GNU Binutils. + */ + +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define true 1 +#define false 0 + +#include "lookup-symbol.h" + +#include +#include +#include +#include +#include +#include + +#if HAVE_BFD +#include +#include + +struct symtab { + bfd *bfd; + asymbol **syms; +}; + +struct symbol { + int found; + bfd_vma pc; + struct symtab *symtab; + const char *filename; + const char *functionname; + unsigned int line; +}; + + +static void +_symtab_fini (struct symtab *symtab) +{ + free (symtab->syms); + if (symtab->bfd != NULL) + bfd_close (symtab->bfd); +} + +/* Read in the symbol table. */ +static int +_symtab_init (struct symtab *symtab, const char *filename) +{ + char **matching; + long symcount; + unsigned int size; + + symtab->bfd = NULL; + symtab->syms = NULL; + + symtab->bfd = bfd_openr (filename, NULL); + if (symtab->bfd == NULL) + goto BAIL; + + if (bfd_check_format (symtab->bfd, bfd_archive)) + goto BAIL; + + if (! bfd_check_format_matches (symtab->bfd, bfd_object, &matching)) + goto BAIL; + + symcount = bfd_read_minisymbols (symtab->bfd, false, (PTR) &symtab->syms, &size); + if (symcount == 0) { + symcount = bfd_read_minisymbols (symtab->bfd, true /* dynamic */ , + (PTR) &symtab->syms, &size); + } + if (symcount < 0) + goto BAIL; + + if ((bfd_get_file_flags (symtab->bfd) & HAS_SYMS) == 0) + goto BAIL; + + return 1; + +BAIL: + _symtab_fini (symtab); + return 0; +} + +/* Look for an address in a section. + * This is called via bfd_map_over_sections. + */ +static void +find_address_in_section (bfd *abfd, + asection *section, + void *data) +{ + bfd_vma vma; + bfd_size_type size; + struct symbol *symbol = data; + struct symtab *symtab = symbol->symtab; + + if (symbol->found) + return; + + if ((bfd_get_section_flags (symtab->bfd, section) & SEC_ALLOC) == 0) + return; + + vma = bfd_get_section_vma (symtab->bfd, section); + if (symbol->pc < vma) + return; + + size = bfd_section_size (symtab->bfd, section); + if (symbol->pc >= vma + size) + return; + + symbol->found = bfd_find_nearest_line (symtab->bfd, section, + symtab->syms, + symbol->pc - vma, + &symbol->filename, + &symbol->functionname, + &symbol->line); +} + +static void +_symbol_fini (struct symbol *symbol) +{ +} + +static void +_symbol_init (struct symbol *symbol, struct symtab *symtab, bfd_vma addr) +{ + symbol->found = false; + symbol->symtab = symtab; + symbol->pc = addr; +} + +static void +_symbol_print (struct symbol *symbol, char *buf, int buflen, const char *filename) +{ + const char *name, *h; + char path[1024]; + + if (! symbol->found) + return; + + name = symbol->functionname; + if (name == NULL || *name == '\0') + name = "??"; + + if (symbol->filename != NULL) + filename = symbol->filename; + if (strcmp (filename, "/proc/self/exe") == 0) { + int len = readlink ("/proc/self/exe", path, sizeof (path) - 1); + if (len != -1) { + path[len] = '\0'; + filename = path; + } + } + h = strrchr (filename, '/'); + if (h != NULL) + filename = h + 1; + + if (symbol->line) { + snprintf (buf, buflen, "%s() [%s:%u]", + name, filename, symbol->line); + } else { + snprintf (buf, buflen, "%s() [%s]", name, filename); + } +} +#endif + +struct file_match { + const char *file; + ElfW(Addr) address; + ElfW(Addr) base; + void *hdr; +}; + +static int +find_matching_file (struct dl_phdr_info *info, size_t size, void *data) +{ + struct file_match *match = data; + /* This code is modeled from Gfind_proc_info-lsb.c:callback() from libunwind */ + long n; + const ElfW(Phdr) *phdr; + ElfW(Addr) load_base = info->dlpi_addr; + + phdr = info->dlpi_phdr; + for (n = info->dlpi_phnum; --n >= 0; phdr++) { + if (phdr->p_type == PT_LOAD) { + ElfW(Addr) vaddr = phdr->p_vaddr + load_base; + if (match->address >= vaddr && + match->address < vaddr + phdr->p_memsz) + { + /* we found a match */ + match->file = info->dlpi_name; + match->base = info->dlpi_addr; + return 1; + } + } + } + + return 0; +} + +struct symbol_cache_entry { + const void *ptr; + struct symbol_cache_entry *hash_prev, *hash_next; + char name[0]; +}; + +static struct symbol_cache_entry *symbol_cache_hash[13477]; +static pthread_mutex_t symbol_cache_mutex = PTHREAD_MUTEX_INITIALIZER; + +char * +lookup_symbol (char *buf, int buflen, const void *ptr) +{ + struct file_match match; +#if HAVE_BFD + struct symtab symtab; + struct symbol symbol; +#endif + struct symbol_cache_entry *cache; + int bucket; + int len; + + bucket = (unsigned long) ptr % (sizeof (symbol_cache_hash) / sizeof (symbol_cache_hash[0])); + pthread_mutex_lock (&symbol_cache_mutex); + for (cache = symbol_cache_hash[bucket]; + cache != NULL; + cache = cache->hash_next) + { + if (cache->ptr == ptr) { + if (cache->hash_prev != NULL) { + cache->hash_prev->hash_next = cache->hash_next; + if (cache->hash_next != NULL) + cache->hash_next->hash_prev = cache->hash_prev; + cache->hash_prev = NULL; + cache->hash_next = symbol_cache_hash[bucket]; + symbol_cache_hash[bucket]->hash_prev = cache; + symbol_cache_hash[bucket] = cache; + } + + pthread_mutex_unlock (&symbol_cache_mutex); + return cache->name; + } + } + pthread_mutex_unlock (&symbol_cache_mutex); + + match.file = NULL; + match.address = (ElfW(Addr)) ptr; + dl_iterate_phdr (find_matching_file, &match); + + snprintf (buf, buflen, "0x%llx", + (long long unsigned int) match.address); + + if (match.file == NULL || *match.file == '\0') + match.file = "/proc/self/exe"; + +#if HAVE_BFD + if (_symtab_init (&symtab, match.file)) { + _symbol_init (&symbol, &symtab, match.address - match.base); + bfd_map_over_sections (symtab.bfd, find_address_in_section, &symbol); + if (symbol.found) + _symbol_print (&symbol, buf, buflen, match.file); + _symbol_fini (&symbol); + + _symtab_fini (&symtab); + } +#endif + + len = strlen (buf); + cache = malloc (sizeof (struct symbol_cache_entry) + len + 1); + if (cache != NULL) { + cache->ptr = ptr; + memcpy (cache->name, buf, len + 1); + + pthread_mutex_lock (&symbol_cache_mutex); + cache->hash_prev = NULL; + cache->hash_next = symbol_cache_hash[bucket]; + if (symbol_cache_hash[bucket] != NULL) + symbol_cache_hash[bucket]->hash_prev = cache; + symbol_cache_hash[bucket] = cache; + pthread_mutex_unlock (&symbol_cache_mutex); + } + + return buf; +} diff --git a/util/cairo-trace/lookup-symbol.h b/util/cairo-trace/lookup-symbol.h new file mode 100644 index 000000000..83817edc6 --- /dev/null +++ b/util/cairo-trace/lookup-symbol.h @@ -0,0 +1,24 @@ +/* cairo-trace - a utility to record and replay calls to the Cairo library. + * + * Copyright © 2008 Chris Wilson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef LOOKUP_SYMBOLS_H + +char * +lookup_symbol (char *buf, int len, const void *ptr); + +#endif /*LOOKUP_SYMBOLS_H */ diff --git a/util/cairo-trace/trace.c b/util/cairo-trace/trace.c new file mode 100644 index 000000000..d5d76689c --- /dev/null +++ b/util/cairo-trace/trace.c @@ -0,0 +1,5581 @@ +/* cairo-trace - a utility to record and replay calls to the Cairo library. + * + * Copyright © 2008 Chris Wilson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* The autoconf on OpenBSD 4.5 produces the malformed constant name + * SIZEOF_VOID__ rather than SIZEOF_VOID_P. Work around that here. */ +#if !defined(SIZEOF_VOID_P) && defined(SIZEOF_VOID__) +# define SIZEOF_VOID_P SIZEOF_VOID__ +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for locale independent %f printing */ +#include +#include +#include +#include +#include + +#include +#if CAIRO_HAS_FT_FONT +# include +#endif + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#ifndef CAIRO_TRACE_OUTDIR +#define CAIRO_TRACE_OUTDIR "." +#endif + +#define DEBUG_STACK 0 + +#if HAVE_BYTESWAP_H +# include +#endif +#ifndef bswap_16 +# define bswap_16(p) \ + (((((uint16_t)(p)) & 0x00ff) << 8) | \ + (((uint16_t)(p)) >> 8)) +#endif +#ifndef bswap_32 +# define bswap_32(p) \ + (((((uint32_t)(p)) & 0x000000ff) << 24) | \ + ((((uint32_t)(p)) & 0x0000ff00) << 8) | \ + ((((uint32_t)(p)) & 0x00ff0000) >> 8) | \ + ((((uint32_t)(p))) >> 24)) +#endif + +#if WORDS_BIGENDIAN +#define le16(x) bswap_16 (x) +#define le32(x) bswap_32 (x) +#define be16(x) x +#define be32(x) x +#define to_be32(x) x +#else +#define le16(x) x +#define le32(x) x +#define be16(x) bswap_16 (x) +#define be32(x) bswap_32 (x) +#define to_be32(x) bswap_32 (x) +#endif + +#if CAIRO_HAS_SYMBOL_LOOKUP +#include "lookup-symbol.h" +#endif + +/* Reverse the bits in a byte with 7 operations (no 64-bit): + * Devised by Sean Anderson, July 13, 2001. + * Source: http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits + */ +#define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16) + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#else +#define CAIRO_PRINTF_FORMAT(fmt_index, va_index) +#endif + +/* XXX implement manual vprintf so that the user can control precision of + * printed numbers. + */ + +static void *_dlhandle = RTLD_NEXT; +#define DLCALL(name, args...) ({ \ + static typeof (&name) name##_real; \ + if (name##_real == NULL) { \ + name##_real = (typeof (&name))(dlsym (_dlhandle, #name)); \ + if (name##_real == NULL && _dlhandle == RTLD_NEXT) { \ + _dlhandle = dlopen ("libcairo." SHARED_LIB_EXT, RTLD_LAZY); \ + name##_real = (typeof (&name))(dlsym (_dlhandle, #name)); \ + assert (name##_real != NULL); \ + } \ + } \ + (*name##_real) (args); \ +}) + +#ifndef ARRAY_LENGTH +#define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) +#endif + +#if SIZEOF_VOID_P == 4 +#define PTR_SHIFT 2 +#elif SIZEOF_VOID_P == 8 +#define PTR_SHIFT 3 +#else +#error Unexpected pointer size +#endif +#define BUCKET(b, ptr) (((unsigned long) (ptr) >> PTR_SHIFT) % ARRAY_LENGTH (b)) + +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +#define _BOOLEAN_EXPR(expr) \ + __extension__ ({ \ + int _boolean_var_; \ + if (expr) \ + _boolean_var_ = 1; \ + else \ + _boolean_var_ = 0; \ + _boolean_var_; \ +}) +#define LIKELY(expr) (__builtin_expect (_BOOLEAN_EXPR(expr), 1)) +#define UNLIKELY(expr) (__builtin_expect (_BOOLEAN_EXPR(expr), 0)) +#else +#define LIKELY(expr) (expr) +#define UNLIKELY(expr) (expr) +#endif + +typedef struct _object Object; +typedef struct _type Type; + +struct _object { + const void *addr; + Type *type; + unsigned long int token; + int width, height; + cairo_bool_t foreign; + cairo_bool_t defined; + cairo_bool_t unknown; + int operand; + void *data; + void (*destroy)(void *); + Object *next, *prev; +}; + +struct _type { + const char *name; + + enum operand_type { + NONE, + SURFACE, + CONTEXT, + FONT_FACE, + PATTERN, + SCALED_FONT, + _N_OP_TYPES + } op_type; + const char *op_code; + + pthread_mutex_t mutex; + struct _bitmap { + unsigned long int min; + unsigned long int count; + unsigned int map[64]; + struct _bitmap *next; + } map; + Object *objects[607]; + Type *next; +}; + +static struct _type_table { + pthread_mutex_t mutex; + Type *op_types[_N_OP_TYPES]; +} Types; + +static FILE *logfile; +static cairo_bool_t _flush; +static cairo_bool_t _error; +static cairo_bool_t _line_info; +static cairo_bool_t _mark_dirty; +static const cairo_user_data_key_t destroy_key; +static pthread_once_t once_control = PTHREAD_ONCE_INIT; +static pthread_key_t counter_key; + +static void _init_trace (void); + +#define INIT_TRACE_ONCE() pthread_once (&once_control, _init_trace) + +#if __GNUC__ >= 3 && defined(__ELF__) && !defined(__sun) +# define _enter_trace() INIT_TRACE_ONCE () +# define _exit_trace() do { } while (0) +# define _should_trace() 1 +# define USE_ENTER_EXIT 0 +#else +static void _enter_trace (void); +static void _exit_trace (void); +static cairo_bool_t _should_trace (void); +# define USE_ENTER_EXIT 1 +#endif + +#if HAVE_BUILTIN_RETURN_ADDRESS && CAIRO_HAS_SYMBOL_LOOKUP +#define _emit_line_info() do { \ + if (_line_info && _write_lock ()) { \ + void *addr = __builtin_return_address(0); \ + char caller[1024]; \ + _trace_printf ("%% %s() called by %s\n", __FUNCTION__, \ + lookup_symbol (caller, sizeof (caller), addr)); \ + _write_unlock (); \ + } \ +} while (0) +#else +#define _emit_line_info() +#endif + +static void +_type_release_token (Type *t, unsigned long int token) +{ + struct _bitmap *b, **prev = NULL; + + b = &t->map; + while (b != NULL) { + if (token < b->min + sizeof (b->map) * CHAR_BIT) { + unsigned int bit, elem; + + token -= b->min; + elem = token / (sizeof (b->map[0]) * CHAR_BIT); + bit = token % (sizeof (b->map[0]) * CHAR_BIT); + b->map[elem] &= ~(1 << bit); + if (! --b->count && prev) { + *prev = b->next; + free (b); + } + return; + } + prev = &b->next; + b = b->next; + } +} + +static unsigned long int +_type_next_token (Type *t) +{ + struct _bitmap *b, *bb, **prev = NULL; + unsigned long int min = 0; + + b = &t->map; + while (b != NULL) { + if (b->min != min) + break; + + if (b->count < sizeof (b->map) * CHAR_BIT) { + unsigned int n, m, bit; + for (n = 0; n < ARRAY_LENGTH (b->map); n++) { + if (b->map[n] == (unsigned int) -1) + continue; + + for (m=0, bit=1; mmap[0])*CHAR_BIT; m++, bit<<=1) { + if ((b->map[n] & bit) == 0) { + b->map[n] |= bit; + b->count++; + return n * sizeof (b->map[0])*CHAR_BIT + m + b->min; + } + } + } + } + min += sizeof (b->map) * CHAR_BIT; + + prev = &b->next; + b = b->next; + } + + bb = malloc (sizeof (struct _bitmap)); + *prev = bb; + bb->next = b; + bb->min = min; + bb->count = 1; + bb->map[0] = 0x1; + memset (bb->map + 1, 0, sizeof (bb->map) - sizeof (bb->map[0])); + + return min; +} + +static void +_object_destroy (Object *obj) +{ + int bucket; + + pthread_mutex_lock (&obj->type->mutex); + bucket = BUCKET (obj->type->objects, obj->addr); + _type_release_token (obj->type, obj->token); + + if (obj->prev != NULL) + obj->prev->next = obj->next; + else + obj->type->objects[bucket] = obj->next; + + if (obj->next != NULL) + obj->next->prev = obj->prev; + pthread_mutex_unlock (&obj->type->mutex); + + if (obj->data != NULL && obj->destroy != NULL) + obj->destroy (obj->data); + + free (obj); +} + +static void +_type_create (const char *typename, + enum operand_type op_type, + const char *op_code) +{ + Type *t; + + pthread_mutex_lock (&Types.mutex); + + t = malloc (sizeof (Type)); + t->name = typename; + t->op_type = op_type; + t->op_code = op_code; + + pthread_mutex_init (&t->mutex, NULL); + + t->map.min = 0; + t->map.count = 0; + memset (t->map.map, 0, sizeof (t->map.map)); + t->map.next = NULL; + + memset (t->objects, 0, sizeof (t->objects)); + + t->next = NULL; + + Types.op_types[op_type] = t; + pthread_mutex_unlock (&Types.mutex); +} + +static Type * +_get_type (enum operand_type type) +{ + return Types.op_types[type]; +} + +static void +_type_destroy (Type *t) +{ + int n; + struct _bitmap *b; + + for (n = 0; n < ARRAY_LENGTH (t->objects); n++) { + Object *obj = t->objects[n]; + while (obj != NULL) { + Object *next = obj->next; + _object_destroy (obj); + obj = next; + } + } + + b = t->map.next; + while (b != NULL) { + struct _bitmap *next = b->next; + free (b); + b = next; + } + + pthread_mutex_destroy (&t->mutex); + free (t); +} + +static Object * +_type_get_object (Type *type, const void *ptr) +{ + Object *obj; + int bucket = BUCKET (type->objects, ptr); + + for (obj = type->objects[bucket]; obj != NULL; obj = obj->next) { + if (obj->addr == ptr) { + if (obj->prev != NULL) { /* mru */ + obj->prev->next = obj->next; + if (obj->next != NULL) + obj->next->prev = obj->prev; + obj->prev = NULL; + type->objects[bucket]->prev = obj; + obj->next = type->objects[bucket]; + type->objects[bucket] = obj; + } + return obj; + } + } + + return NULL; +} + +static Object * +_object_create (Type *type, const void *ptr) +{ + Object *obj; + int bucket = BUCKET (type->objects, ptr); + + obj = malloc (sizeof (Object)); + obj->unknown = TRUE; + obj->defined = FALSE; + obj->foreign = FALSE; + obj->operand = -1; + obj->type = type; + obj->addr = ptr; + obj->token = _type_next_token (type); + obj->data = NULL; + obj->destroy = NULL; + obj->prev = NULL; + obj->next = type->objects[bucket]; + if (type->objects[bucket] != NULL) + type->objects[bucket]->prev = obj; + type->objects[bucket] = obj; + + return obj; +} + +#if USE_ENTER_EXIT +static int * +_get_counter (void) +{ + int *counter = pthread_getspecific (counter_key); + if (counter == NULL) { + counter = calloc(1, sizeof(int)); + pthread_setspecific (counter_key, counter); + } + return counter; +} + +static void +_enter_trace (void) +{ + INIT_TRACE_ONCE (); + _get_counter ()[0]++; +} + +static void +_exit_trace (void) +{ + _get_counter ()[0]--; +} + +static cairo_bool_t +_should_trace (void) +{ + return _get_counter ()[0] <= 1; +} +#endif /* USE_ENTER_EXIT */ + +static void +_init_trace (void) +{ + pthread_mutex_init (&Types.mutex, NULL); + pthread_key_create (&counter_key, free); + + _type_create ("unclassed", NONE, ""); + _type_create ("cairo_t", CONTEXT, "c"); + _type_create ("cairo_font_face_t", FONT_FACE, "f"); + _type_create ("cairo_pattern_t", PATTERN, "p"); + _type_create ("cairo_scaled_font_t", SCALED_FONT, "sf"); + _type_create ("cairo_surface_t", SURFACE, "s"); +} + +static void +_close_trace (void) +{ + if (logfile != NULL) { + fclose (logfile); + logfile = NULL; + } +} + +static void __attribute__ ((destructor)) +_fini_trace (void) +{ + int n; + + _close_trace (); + + for (n = 0; n < ARRAY_LENGTH (Types.op_types); n++) { + if (Types.op_types[n]) { + _type_destroy (Types.op_types[n]); + Types.op_types[n] = NULL; + } + } + + pthread_mutex_destroy (&Types.mutex); +} + +/* Format a double in a locale independent way and trim trailing + * zeros. Based on code from Alex Larson . + * http://mail.gnome.org/archives/gtk-devel-list/2001-October/msg00087.html + * + * The code in the patch is copyright Red Hat, Inc under the LGPL. + */ +#define SIGNIFICANT_DIGITS_AFTER_DECIMAL 6 +static void +_trace_dtostr (char *buffer, size_t size, double d) +{ + struct lconv *locale_data; + const char *decimal_point; + int decimal_point_len; + char *p; + int decimal_len; + int num_zeros, decimal_digits; + + /* Omit the minus sign from negative zero. */ + if (d == 0.0) + d = 0.0; + + locale_data = localeconv (); + decimal_point = locale_data->decimal_point; + decimal_point_len = strlen (decimal_point); + + /* Using "%f" to print numbers less than 0.1 will result in + * reduced precision due to the default 6 digits after the + * decimal point. + * + * For numbers is < 0.1, we print with maximum precision and count + * the number of zeros between the decimal point and the first + * significant digit. We then print the number again with the + * number of decimal places that gives us the required number of + * significant digits. This ensures the number is correctly + * rounded. + */ + if (fabs (d) >= 0.1) { + snprintf (buffer, size, "%f", d); + } else { + snprintf (buffer, size, "%.18f", d); + p = buffer; + + if (*p == '+' || *p == '-') + p++; + + while (isdigit (*p)) + p++; + + if (strncmp (p, decimal_point, decimal_point_len) == 0) + p += decimal_point_len; + + num_zeros = 0; + while (*p++ == '0') + num_zeros++; + + decimal_digits = num_zeros + SIGNIFICANT_DIGITS_AFTER_DECIMAL; + + if (decimal_digits < 18) + snprintf (buffer, size, "%.*f", decimal_digits, d); + } + p = buffer; + + if (*p == '+' || *p == '-') + p++; + + while (isdigit (*p)) + p++; + + if (strncmp (p, decimal_point, decimal_point_len) == 0) { + *p = '.'; + decimal_len = strlen (p + decimal_point_len); + memmove (p + 1, p + decimal_point_len, decimal_len); + p[1 + decimal_len] = 0; + + /* Remove trailing zeros and decimal point if possible. */ + for (p = p + decimal_len; *p == '0'; p--) + *p = 0; + + if (*p == '.') { + *p = 0; + p--; + } + } +} + +enum { + LENGTH_MODIFIER_LONG = 0x100 +}; + +/* Here's a limited reimplementation of printf. The reason for doing + * this is primarily to special case handling of doubles. We want + * locale independent formatting of doubles and we want to trim + * trailing zeros. This is handled by dtostr() above, and the code + * below handles everything else by calling snprintf() to do the + * formatting. This functionality is only for internal use and we + * only implement the formats we actually use. + */ +static void CAIRO_PRINTF_FORMAT(1, 0) +_trace_vprintf (const char *fmt, va_list ap) +{ +#define SINGLE_FMT_BUFFER_SIZE 32 + char buffer[512], single_fmt[SINGLE_FMT_BUFFER_SIZE]; + int single_fmt_length; + char *p; + const char *f, *start; + int length_modifier, width; + cairo_bool_t var_width; + int ret_ignored; + + assert (_should_trace ()); + + f = fmt; + p = buffer; + while (*f != '\0') { + if (*f != '%') { + *p++ = *f++; + continue; + } + + start = f; + f++; + + if (*f == '0') + f++; + + var_width = 0; + if (*f == '*') { + var_width = 1; + f++; + } + + while (isdigit (*f)) + f++; + + length_modifier = 0; + if (*f == 'l') { + length_modifier = LENGTH_MODIFIER_LONG; + f++; + } + + /* The only format strings exist in the cairo implementation + * itself. So there's an internal consistency problem if any + * of them is larger than our format buffer size. */ + single_fmt_length = f - start + 1; + + /* Reuse the format string for this conversion. */ + memcpy (single_fmt, start, single_fmt_length); + single_fmt[single_fmt_length] = '\0'; + + /* Flush contents of buffer before snprintf()'ing into it. */ + ret_ignored = fwrite (buffer, 1, p-buffer, logfile); + + /* We group signed and unsigned together in this switch, the + * only thing that matters here is the size of the arguments, + * since we're just passing the data through to sprintf(). */ + switch (*f | length_modifier) { + case '%': + buffer[0] = *f; + buffer[1] = 0; + break; + case 'd': + case 'u': + case 'o': + case 'x': + case 'X': + if (var_width) { + width = va_arg (ap, int); + snprintf (buffer, sizeof buffer, + single_fmt, width, va_arg (ap, int)); + } else { + snprintf (buffer, sizeof buffer, single_fmt, va_arg (ap, int)); + } + break; + case 'd' | LENGTH_MODIFIER_LONG: + case 'u' | LENGTH_MODIFIER_LONG: + case 'o' | LENGTH_MODIFIER_LONG: + case 'x' | LENGTH_MODIFIER_LONG: + case 'X' | LENGTH_MODIFIER_LONG: + if (var_width) { + width = va_arg (ap, int); + snprintf (buffer, sizeof buffer, + single_fmt, width, va_arg (ap, long int)); + } else { + snprintf (buffer, sizeof buffer, + single_fmt, va_arg (ap, long int)); + } + break; + case 's': + snprintf (buffer, sizeof buffer, + single_fmt, va_arg (ap, const char *)); + break; + case 'f': + case 'g': + _trace_dtostr (buffer, sizeof buffer, va_arg (ap, double)); + break; + case 'c': + buffer[0] = va_arg (ap, int); + buffer[1] = 0; + break; + default: + break; + } + p = buffer + strlen (buffer); + f++; + } + + ret_ignored = fwrite (buffer, 1, p-buffer, logfile); + (void)ret_ignored; +} + +static void CAIRO_PRINTF_FORMAT(1, 2) +_trace_printf (const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + _trace_vprintf (fmt, ap); + va_end (ap); +} + +static void +get_prog_name (char *buf, int length) +{ + char *slash; + FILE *file; + + memset (buf, 0, length); + if (length == 0) + return; + + file = fopen ("/proc/self/cmdline", "rb"); + if (file != NULL) { + slash = fgets (buf, length, file); + fclose (file); + + if (slash == NULL) + return; + } else { + char const *name = getenv ("CAIRO_TRACE_PROG_NAME"); + if (name != NULL) { + strncpy (buf, name, length-1); + } + } + + slash = strrchr (buf, '/'); + if (slash != NULL) { + size_t len = strlen (slash+1); + memmove (buf, slash+1, len+1); + } +} + +static void +_emit_header (void) +{ + char name[4096] = ""; + + get_prog_name (name, sizeof (name)); + + _trace_printf ("%%!CairoScript - %s\n", name); +} + +static cairo_bool_t +_init_logfile (void) +{ + static cairo_bool_t initialized; + char buf[4096]; + const char *filename; + const char *env; + + if (initialized) + return logfile != NULL; + + initialized = TRUE; + + env = getenv ("CAIRO_TRACE_FLUSH"); + if (env != NULL) + _flush = atoi (env); + + _line_info = TRUE; + env = getenv ("CAIRO_TRACE_LINE_INFO"); + if (env != NULL) + _line_info = atoi (env); + + _mark_dirty = TRUE; + env = getenv ("CAIRO_TRACE_MARK_DIRTY"); + if (env != NULL) + _mark_dirty = atoi (env); + + filename = getenv ("CAIRO_TRACE_FD"); + if (filename != NULL) { + int fd = atoi (filename); + if (fd == -1) + return FALSE; + + logfile = fdopen (fd, "w"); + if (logfile == NULL) { + fprintf (stderr, "Failed to open trace file descriptor '%s': %s\n", + filename, strerror (errno)); + return FALSE; + } + + setenv ("CAIRO_TRACE_FD", "-1", 1); + goto done; + } + + filename = getenv ("CAIRO_TRACE_OUTFILE_EXACT"); + if (filename == NULL) { + char name[4096] = ""; + + filename = getenv ("CAIRO_TRACE_OUTDIR"); + if (filename == NULL) + filename = CAIRO_TRACE_OUTDIR; + + get_prog_name (name, sizeof (name)); + if (*name == '\0') + strcpy (name, "cairo-trace.dat"); + + snprintf (buf, sizeof (buf), "%s/%s.%d.trace", + filename, name, getpid()); + + filename = buf; + } else { + setenv ("CAIRO_TRACE_FD", "-1", 1); + } + + logfile = fopen (filename, "wb"); + if (logfile == NULL) { + fprintf (stderr, "Failed to open trace file '%s': %s\n", + filename, strerror (errno)); + return FALSE; + } + + fprintf (stderr, "cairo-trace: Recording cairo trace data to %s\n", + filename); + +done: + atexit (_close_trace); + _emit_header (); + return TRUE; +} + +static cairo_bool_t +_write_lock (void) +{ + if (_error) + return FALSE; + + if (! _should_trace ()) + return FALSE; + + if (! _init_logfile ()) + return FALSE; + +#if HAVE_FLOCKFILE && HAVE_FUNLOCKFILE + flockfile (logfile); +#endif + return TRUE; +} + +static void +_write_unlock (void) +{ + if (logfile == NULL) + return; + +#if HAVE_FLOCKFILE && HAVE_FUNLOCKFILE + funlockfile (logfile); +#endif + + if (_flush) + fflush (logfile); +} + + +static Object * +_type_object_create (enum operand_type op_type, const void *ptr) +{ + Type *type; + Object *obj; + + type = _get_type (op_type); + + pthread_mutex_lock (&type->mutex); + obj = _object_create (type, ptr); + pthread_mutex_unlock (&type->mutex); + + return obj; +} + +static Object * +_get_object (enum operand_type op_type, const void *ptr) +{ + Type *type; + Object *obj; + + type = _get_type (op_type); + pthread_mutex_lock (&type->mutex); + obj = _type_get_object (type, ptr); + pthread_mutex_unlock (&type->mutex); + + return obj; +} + +static Object *current_object[2048]; /* XXX limit operand stack */ +static int current_stack_depth; + +static void +dump_stack(const char *func) +{ +#if DEBUG_STACK + int n; + + _trace_printf ("%% %s: stack[%d] = [", func, current_stack_depth); + fflush (logfile); + for (n = 0; n < current_stack_depth; n++) { + Object *obj = current_object[n]; + assert(obj && obj->type); + _trace_printf (" %s%s%ld", + obj->defined ? "" : "*", + obj->type->op_code, obj->token); + fflush (logfile); + } + _trace_printf (" ]\n"); + fflush (logfile); +#endif +} + +static void +ensure_operands (int num_operands) +{ + if (current_stack_depth < num_operands) { + int n; + + fprintf (stderr, "Operand stack underflow!\n"); + for (n = 0; n < current_stack_depth; n++) { + Object *obj = current_object[n]; + + fprintf (stderr, " [%3d] = %s%ld\n", + n, obj->type->op_code, obj->token); + } + + abort (); + } +} + +static void +_consume_operand (bool discard) +{ + Object *obj; + + ensure_operands (1); + obj = current_object[--current_stack_depth]; + if (!discard && ! obj->defined) { + _trace_printf ("dup /%s%ld exch def\n", + obj->type->op_code, + obj->token); + obj->defined = TRUE; + } + obj->operand = -1; +} + +static void +_exch_operands (void) +{ + Object *tmp; + + ensure_operands (2); + tmp = current_object[current_stack_depth-1]; + tmp->operand--; + current_object[current_stack_depth-1] = current_object[current_stack_depth-2]; + current_object[current_stack_depth-2] = tmp; + tmp = current_object[current_stack_depth-1]; + tmp->operand++; +} + +static cairo_bool_t +_pop_operands_to_depth (int depth) +{ + if (depth < 0) + return FALSE; + + assert(current_stack_depth >= depth); + if (current_stack_depth == depth) + return TRUE; + + while (current_stack_depth > depth + 1) { + Object *c_obj; + + ensure_operands (1); + c_obj = current_object[--current_stack_depth]; + + assert(c_obj); + assert(c_obj->type); + + if (! c_obj->defined) { + current_stack_depth++; + return FALSE; + } + + _trace_printf ("pop %% %s%ld\n", + c_obj->type->op_code, c_obj->token); + c_obj->operand = -1; + } + + _exch_operands (); + _trace_printf ("exch\n"); + + dump_stack(__func__); + return TRUE; +} + +static cairo_bool_t +_pop_operands_to_object (Object *obj) +{ + if (!obj) + return FALSE; + + if (obj->operand == -1) + return FALSE; + + if (obj->operand == current_stack_depth - 1) + return TRUE; + + if (obj->operand == current_stack_depth - 2) { + _exch_operands (); + _trace_printf ("exch "); + return TRUE; + } + + return _pop_operands_to_depth (obj->operand + 1); +} + +static cairo_bool_t +_pop_operands_to (enum operand_type t, const void *ptr) +{ + return _pop_operands_to_object (_get_object (t, ptr)); +} + +static cairo_bool_t +_is_current_object (Object *obj, int depth) +{ + if (current_stack_depth <= depth) + return FALSE; + return current_object[current_stack_depth-depth-1] == obj; +} + +static cairo_bool_t +_is_current (enum operand_type type, const void *ptr, int depth) +{ + return _is_current_object (_get_object (type, ptr), depth); +} + +static void +_push_object(Object *obj) +{ + assert(obj->operand == -1); + + if (current_stack_depth == ARRAY_LENGTH (current_object)) { + int n; + + fprintf (stderr, "Operand stack overflow!\n"); + for (n = 0; n < current_stack_depth; n++) { + obj = current_object[n]; + + fprintf (stderr, " [%3d] = %s%ld\n", + n, obj->type->op_code, obj->token); + } + + abort (); + } + + obj->operand = current_stack_depth; + current_object[current_stack_depth++] = obj; +} + +static void +_push_operand (enum operand_type t, const void *ptr) +{ + _push_object(_get_object(t, ptr)); +} + +static void +_object_remove (Object *obj) +{ + if (obj->operand != -1) { + ensure_operands (1); + if (obj->operand == current_stack_depth - 1) { + _trace_printf ("pop %% %s%ld destroyed\n", + obj->type->op_code, obj->token); + } else if (obj->operand == current_stack_depth - 2) { + _exch_operands (); + _trace_printf ("exch pop %% %s%ld destroyed\n", + obj->type->op_code, obj->token); + } else { + int n; + + _trace_printf ("%d -1 roll pop %% %s%ld destroyed\n", + current_stack_depth - obj->operand, + obj->type->op_code, obj->token); + + for (n = obj->operand; n < current_stack_depth - 1; n++) { + current_object[n] = current_object[n+1]; + current_object[n]->operand = n; + } + } + obj->operand = -1; + + current_stack_depth--; + dump_stack(__func__); + } +} + +static void +_object_undef (void *ptr) +{ + Object *obj = ptr; + + if (_write_lock ()) { + _object_remove (obj); + + if (obj->defined) { + _trace_printf ("/%s%ld undef\n", + obj->type->op_code, obj->token); + } + + _write_unlock (); + } + + _object_destroy (obj); +} + +static long +_create_context_id (cairo_t *cr) +{ + Object *obj; + + obj = _get_object (CONTEXT, cr); + if (obj == NULL) { + obj = _type_object_create (CONTEXT, cr); + DLCALL (cairo_set_user_data, + cr, &destroy_key, obj, _object_undef); + } + + return obj->token; +} + +static long +_get_id (enum operand_type op_type, const void *ptr) +{ + Object *obj; + + obj = _get_object (op_type, ptr); + if (obj == NULL) { + if (logfile != NULL) { + _trace_printf ("%% Unknown object of type %s, trace is incomplete.", + _get_type (op_type)->name); + } + _error = TRUE; + return -1; + } + + return obj->token; +} + +static cairo_bool_t +_has_id (enum operand_type op_type, const void *ptr) +{ + return _get_object (op_type, ptr) != NULL; +} + +static long +_create_font_face_id (cairo_font_face_t *font_face) +{ + Object *obj; + + obj = _get_object (FONT_FACE, font_face); + if (obj == NULL) { + obj = _type_object_create (FONT_FACE, font_face); + DLCALL (cairo_font_face_set_user_data, + font_face, &destroy_key, obj, _object_undef); + } + + return obj->token; +} + +static long +_get_font_face_id (cairo_font_face_t *font_face) +{ + return _get_id (FONT_FACE, font_face); +} + +static void +_emit_font_face_id (cairo_font_face_t *font_face) +{ + Object *obj = _get_object (FONT_FACE, font_face); + if (obj == NULL) { + _trace_printf ("null "); + } else { + if (obj->defined) { + _trace_printf ("f%ld ", obj->token); + } else { + _trace_printf ("%d index ", current_stack_depth - obj->operand - 1); + } + } +} + +static cairo_bool_t +_has_pattern_id (cairo_pattern_t *pattern) +{ + return _has_id (PATTERN, pattern); +} + +static long +_create_pattern_id (cairo_pattern_t *pattern) +{ + Object *obj; + + obj = _get_object (PATTERN, pattern); + if (obj == NULL) { + obj = _type_object_create (PATTERN, pattern); + DLCALL (cairo_pattern_set_user_data, + pattern, &destroy_key, obj, _object_undef); + } + + return obj->token; +} + +static void +_emit_pattern_id (cairo_pattern_t *pattern) +{ + Object *obj = _get_object (PATTERN, pattern); + if (obj == NULL) { + _trace_printf ("null "); + } else { + if (obj->defined) { + _trace_printf ("p%ld ", obj->token); + } else { + _trace_printf ("%d index ", + current_stack_depth - obj->operand - 1); + } + } +} + +static void +_emit_scaled_font_id (const cairo_scaled_font_t *scaled_font) +{ + Object *obj = _get_object (SCALED_FONT, scaled_font); + if (obj == NULL) { + _trace_printf ("null "); + } else { + if (obj->defined) { + _trace_printf ("sf%ld ", obj->token); + } else { + _trace_printf ("%d index ", + current_stack_depth - obj->operand - 1); + } + } +} + +static long +_create_scaled_font_id (cairo_scaled_font_t *font) +{ + Object *obj; + + assert(_get_object (SCALED_FONT, font) == NULL); + obj = _type_object_create (SCALED_FONT, font); + DLCALL (cairo_scaled_font_set_user_data, + font, &destroy_key, obj, _object_undef); + + return obj->token; +} + +static cairo_bool_t +_has_scaled_font_id (const cairo_scaled_font_t *font) +{ + return _has_id (SCALED_FONT, font); +} + +static Object * +_create_surface (cairo_surface_t *surface) +{ + Object *obj; + + obj = _get_object (SURFACE, surface); + if (obj == NULL) { + obj = _type_object_create (SURFACE, surface); + DLCALL (cairo_surface_set_user_data, + surface, &destroy_key, obj, _object_undef); + } + + return obj; +} + +static long +_get_surface_id (cairo_surface_t *surface) +{ + return _get_id (SURFACE, surface); +} + +static cairo_bool_t +_matrix_is_identity (const cairo_matrix_t *m) +{ + return m->xx == 1. && m->yx == 0. && + m->xy == 0. && m->yy == 1. && + m->x0 == 0. && m->y0 == 0.; +} + +#define BUFFER_SIZE 16384 +struct _data_stream { + z_stream zlib_stream; + unsigned char zin_buf[BUFFER_SIZE]; + unsigned char zout_buf[BUFFER_SIZE]; + unsigned char four_tuple[4]; + int base85_pending; +}; + +static void +_write_zlib_data_start (struct _data_stream *stream) +{ + stream->zlib_stream.zalloc = Z_NULL; + stream->zlib_stream.zfree = Z_NULL; + stream->zlib_stream.opaque = Z_NULL; + + deflateInit (&stream->zlib_stream, Z_DEFAULT_COMPRESSION); + + stream->zlib_stream.next_in = stream->zin_buf; + stream->zlib_stream.avail_in = 0; + stream->zlib_stream.next_out = stream->zout_buf; + stream->zlib_stream.avail_out = BUFFER_SIZE; +} + +static void +_write_base85_data_start (struct _data_stream *stream) +{ + stream->base85_pending = 0; +} + +static cairo_bool_t +_expand_four_tuple_to_five (unsigned char four_tuple[4], + unsigned char five_tuple[5]) +{ + uint32_t value; + int digit, i; + cairo_bool_t all_zero = TRUE; + + value = four_tuple[0] << 24 | + four_tuple[1] << 16 | + four_tuple[2] << 8 | + four_tuple[3] << 0; + for (i = 0; i < 5; i++) { + digit = value % 85; + if (digit != 0 && all_zero) + all_zero = FALSE; + five_tuple[4-i] = digit + 33; + value = value / 85; + } + + return all_zero; +} + +static void +_write_base85_data (struct _data_stream *stream, + const unsigned char *data, + unsigned long length) +{ + unsigned char five_tuple[5]; + int ret; + + assert (_should_trace ()); + + while (length--) { + stream->four_tuple[stream->base85_pending++] = *data++; + if (stream->base85_pending == 4) { + if (_expand_four_tuple_to_five (stream->four_tuple, five_tuple)) + ret = fwrite ("z", 1, 1, logfile); + else + ret = fwrite (five_tuple, 5, 1, logfile); + (void)ret; + stream->base85_pending = 0; + } + } +} + +static void +_write_zlib_data (struct _data_stream *stream, cairo_bool_t flush) +{ + cairo_bool_t finished; + + do { + int ret = deflate (&stream->zlib_stream, flush ? Z_FINISH : Z_NO_FLUSH); + if (flush || stream->zlib_stream.avail_out == 0) { + _write_base85_data (stream, + stream->zout_buf, + BUFFER_SIZE - stream->zlib_stream.avail_out); + stream->zlib_stream.next_out = stream->zout_buf; + stream->zlib_stream.avail_out = BUFFER_SIZE; + } + + finished = TRUE; + if (stream->zlib_stream.avail_in != 0) + finished = FALSE; + if (flush && ret != Z_STREAM_END) + finished = FALSE; + } while (! finished); + + stream->zlib_stream.next_in = stream->zin_buf; +} + +static void +_write_data_start (struct _data_stream *stream, uint32_t len) +{ + _write_zlib_data_start (stream); + _write_base85_data_start (stream); + + _trace_printf ("<|"); + len = to_be32 (len); + _write_base85_data (stream, (unsigned char *) &len, sizeof (len)); +} + +static void +_write_data (struct _data_stream *stream, + const void *data, + unsigned int length) +{ + unsigned int count; + const unsigned char *p = data; + + while (length) { + count = length; + if (count > BUFFER_SIZE - stream->zlib_stream.avail_in) + count = BUFFER_SIZE - stream->zlib_stream.avail_in; + memcpy (stream->zin_buf + stream->zlib_stream.avail_in, p, count); + p += count; + stream->zlib_stream.avail_in += count; + length -= count; + + if (stream->zlib_stream.avail_in == BUFFER_SIZE) + _write_zlib_data (stream, FALSE); + } +} + +static void +_write_zlib_data_end (struct _data_stream *stream) +{ + _write_zlib_data (stream, TRUE); + deflateEnd (&stream->zlib_stream); + +} + +static void +_write_base85_data_end (struct _data_stream *stream) +{ + unsigned char five_tuple[5]; + int ret; + + assert (_should_trace ()); + + if (stream->base85_pending) { + memset (stream->four_tuple + stream->base85_pending, + 0, 4 - stream->base85_pending); + _expand_four_tuple_to_five (stream->four_tuple, five_tuple); + ret = fwrite (five_tuple, stream->base85_pending+1, 1, logfile); + (void) ret; + } +} + +static void +_write_data_end (struct _data_stream *stream) +{ + _write_zlib_data_end (stream); + _write_base85_data_end (stream); + + _trace_printf ("~>"); +} + +static void +_emit_data (const void *data, unsigned int length) +{ + struct _data_stream stream; + + _write_data_start (&stream, length); + _write_data (&stream, data, length); + _write_data_end (&stream); +} + +static const char * +_format_to_string (cairo_format_t format) +{ +#define f(name) case CAIRO_FORMAT_ ## name: return #name + switch (format) { + f(INVALID); + f(ARGB32); + f(RGB30); + f(RGB24); + f(RGB16_565); + f(A8); + f(A1); + } +#undef f + return "UNKNOWN_FORMAT"; +} + +static const char * +_format_to_content_string (cairo_format_t format) +{ + switch (format) { + case CAIRO_FORMAT_INVALID: + return "INVALID"; + case CAIRO_FORMAT_ARGB32: + return "COLOR_ALPHA"; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_RGB24: + case CAIRO_FORMAT_RGB16_565: + return "COLOR"; + case CAIRO_FORMAT_A8: + case CAIRO_FORMAT_A1: + return "ALPHA"; + } + return "UNKNOWN"; +} + +static const char * +_status_to_string (cairo_status_t status) +{ +#define f(name) case CAIRO_STATUS_ ## name: return "STATUS_" #name + switch (status) { + f(SUCCESS); + f(NO_MEMORY); + f(INVALID_RESTORE); + f(INVALID_POP_GROUP); + f(NO_CURRENT_POINT); + f(INVALID_MATRIX); + f(INVALID_STATUS); + f(NULL_POINTER); + f(INVALID_STRING); + f(INVALID_PATH_DATA); + f(READ_ERROR); + f(WRITE_ERROR); + f(SURFACE_FINISHED); + f(SURFACE_TYPE_MISMATCH); + f(PATTERN_TYPE_MISMATCH); + f(INVALID_CONTENT); + f(INVALID_FORMAT); + f(INVALID_VISUAL); + f(FILE_NOT_FOUND); + f(INVALID_DASH); + f(INVALID_DSC_COMMENT); + f(INVALID_INDEX); + f(CLIP_NOT_REPRESENTABLE); + f(TEMP_FILE_ERROR); + f(INVALID_STRIDE); + f(FONT_TYPE_MISMATCH); + f(USER_FONT_IMMUTABLE); + f(USER_FONT_ERROR); + f(NEGATIVE_COUNT); + f(INVALID_CLUSTERS); + f(INVALID_SLANT); + f(INVALID_WEIGHT); + f(INVALID_SIZE); + f(USER_FONT_NOT_IMPLEMENTED); + f(DEVICE_TYPE_MISMATCH); + f(DEVICE_ERROR); + f(INVALID_MESH_CONSTRUCTION); + f(DEVICE_FINISHED); + f(JBIG2_GLOBAL_MISSING); + case CAIRO_STATUS_LAST_STATUS: + break; + } + return "UNKNOWN_STATUS"; +#undef f +} + +static void CAIRO_PRINTF_FORMAT(2, 3) +_emit_image (cairo_surface_t *image, + const char *info, + ...) +{ + int stride, row, width, height; + uint32_t len; + cairo_format_t format; + uint8_t row_stack[BUFFER_SIZE]; + uint8_t *rowdata; + uint8_t *data; + struct _data_stream stream; + cairo_status_t status; + + status = DLCALL (cairo_surface_status, image); + if (status) { + _trace_printf ("<< /status //%s >> image", + _status_to_string (status)); + return; + } + + width = DLCALL (cairo_image_surface_get_width, image); + height = DLCALL (cairo_image_surface_get_height, image); + stride = DLCALL (cairo_image_surface_get_stride, image); + format = DLCALL (cairo_image_surface_get_format, image); + data = DLCALL (cairo_image_surface_get_data, image); + + _trace_printf ("dict\n" + " /width %d set\n" + " /height %d set\n" + " /format //%s set\n", + width, height, + _format_to_string (format)); + if (info != NULL) { + va_list ap; + + va_start (ap, info); + _trace_vprintf (info, ap); + va_end (ap); + } + + if (DLCALL (cairo_version) >= CAIRO_VERSION_ENCODE (1, 9, 0)) { + const char *mime_types[] = { + CAIRO_MIME_TYPE_JPEG, + CAIRO_MIME_TYPE_JP2, + CAIRO_MIME_TYPE_PNG, + NULL + }, **mime_type; + + for (mime_type = mime_types; *mime_type; mime_type++) { + const unsigned char *mime_data; + unsigned long mime_length; + + DLCALL (cairo_surface_get_mime_data, + image, *mime_type, &mime_data, &mime_length); + if (mime_data != NULL) { + _trace_printf (" /mime-type (%s) set\n" + " /source <~", + *mime_type); + _write_base85_data_start (&stream); + _write_base85_data (&stream, mime_data, mime_length); + _write_base85_data_end (&stream); + _trace_printf ("~> set\n" + " image"); + return; + } + } + } + + switch (format) { + case CAIRO_FORMAT_A1: len = (width + 7)/8; break; + case CAIRO_FORMAT_A8: len = width; break; + case CAIRO_FORMAT_RGB16_565: len = 2*width; break; + case CAIRO_FORMAT_RGB24: len = 3*width; break; + default: + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_INVALID: + case CAIRO_FORMAT_ARGB32: len = 4*width; break; + } + + _trace_printf (" /source "); + _write_data_start (&stream, len * height); + +#ifdef WORDS_BIGENDIAN + switch (format) { + case CAIRO_FORMAT_A1: + for (row = height; row--; ) { + _write_data (&stream, data, (width+7)/8); + data += stride; + } + break; + case CAIRO_FORMAT_A8: + for (row = height; row--; ) { + _write_data (&stream, data, width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB16_565: + for (row = height; row--; ) { + _write_data (&stream, data, 2*width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB24: + for (row = height; row--; ) { + int col; + rowdata = data; + for (col = width; col--; ) { + _write_data (&stream, rowdata, 3); + rowdata+=4; + } + data += stride; + } + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: + for (row = height; row--; ) { + _write_data (&stream, data, 4*width); + data += stride; + } + break; + case CAIRO_FORMAT_INVALID: + default: + break; + } +#else + if (stride > ARRAY_LENGTH (row_stack)) { + rowdata = malloc (stride); + if (rowdata == NULL) + goto BAIL; + } else + rowdata = row_stack; + + switch (format) { + case CAIRO_FORMAT_A1: + for (row = height; row--; ) { + int col; + for (col = 0; col < (width + 7)/8; col++) + rowdata[col] = CAIRO_BITSWAP8 (data[col]); + _write_data (&stream, rowdata, (width+7)/8); + data += stride; + } + break; + case CAIRO_FORMAT_A8: + for (row = height; row--; ) { + _write_data (&stream, rowdata, width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB16_565: /* XXX endianness */ + for (row = height; row--; ) { + uint16_t *src = (uint16_t *) data; + uint16_t *dst = (uint16_t *)rowdata; + int col; + for (col = 0; col < width; col++) + dst[col] = bswap_16 (src[col]); + _write_data (&stream, rowdata, 2*width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB24: + for (row = height; row--; ) { + uint8_t *src = data; + int col; + for (col = 0; col < width; col++) { + rowdata[3*col+2] = *src++; + rowdata[3*col+1] = *src++; + rowdata[3*col+0] = *src++; + src++; + } + _write_data (&stream, rowdata, 3*width); + data += stride; + } + break; + case CAIRO_FORMAT_RGB30: + case CAIRO_FORMAT_ARGB32: + for (row = height; row--; ) { + uint32_t *src = (uint32_t *) data; + uint32_t *dst = (uint32_t *) rowdata; + int col; + for (col = 0; col < width; col++) + dst[col] = bswap_32 (src[col]); + _write_data (&stream, rowdata, 4*width); + data += stride; + } + break; + case CAIRO_FORMAT_INVALID: + default: + break; + } + if (rowdata != row_stack) + free (rowdata); + +BAIL: + _write_data_end (&stream); +#endif + _trace_printf (" set\n image"); +} + +static void +_encode_string_literal (char *out, int max, + const char *utf8, int len) +{ + char c; + const char *end; + + *out++ = '('; + max--; + + if (utf8 == NULL) + goto DONE; + + if (len < 0) + len = strlen (utf8); + end = utf8 + len; + + while (utf8 < end) { + if (max < 5) + break; + + switch ((c = *utf8++)) { + case '\n': + *out++ = '\\'; + *out++ = 'n'; + max -= 2; + break; + case '\r': + *out++ = '\\'; + *out++ = 'r'; + max -= 2; + case '\t': + *out++ = '\\'; + *out++ = 't'; + max -= 2; + break; + case '\b': + *out++ = '\\'; + *out++ = 'b'; + max -= 2; + break; + case '\f': + *out++ = '\\'; + *out++ = 'f'; + max -= 2; + break; + case '\\': + case '(': + case ')': + *out++ = '\\'; + *out++ = c; + max -= 2; + break; + default: + if (isprint (c) || isspace (c)) { + *out++ = c; + } else { + int octal = 0; + while (c) { + octal *= 10; + octal += c&7; + c /= 8; + } + octal = snprintf (out, max, "\\%03d", octal); + out += octal; + max -= octal; + } + break; + } + } +DONE: + *out++ = ')'; + *out = '\0'; +} + +static void +to_octal (int value, char *buf, size_t size) +{ + do { + buf[--size] = '0' + (value & 7); + value >>= 3; + } while (size); +} + +static void +_emit_string_literal (const char *utf8, int len) +{ + char c; + const char *end; + + if (utf8 == NULL) { + _trace_printf ("()"); + return; + } + + if (len < 0) + len = strlen (utf8); + end = utf8 + len; + + _trace_printf ("("); + while (utf8 < end) { + switch ((c = *utf8++)) { + case '\n': + c = 'n'; + goto ESCAPED_CHAR; + case '\r': + c = 'r'; + goto ESCAPED_CHAR; + case '\t': + c = 't'; + goto ESCAPED_CHAR; + case '\b': + c = 'b'; + goto ESCAPED_CHAR; + case '\f': + c = 'f'; + goto ESCAPED_CHAR; + case '\\': + case '(': + case ')': +ESCAPED_CHAR: + _trace_printf ("\\%c", c); + break; + default: + if (isprint (c) || isspace (c)) { + _trace_printf ("%c", c); + } else { + char buf[4] = { '\\' }; + int ret_ignored; + + to_octal (c, buf+1, 3); + ret_ignored = fwrite (buf, 4, 1, logfile); + (void)ret_ignored; + } + break; + } + } + _trace_printf (")"); +} + +static void +_emit_current (Object *obj) +{ + if (obj != NULL && ! _pop_operands_to_object (obj)) { + if (obj->operand != -1) { + int n; + + _trace_printf ("%d -1 roll %% %s%ld\n", + current_stack_depth - obj->operand, + obj->type->op_code, obj->token); + + for (n = obj->operand; n < current_stack_depth - 1; n++) { + current_object[n] = current_object[n+1]; + current_object[n]->operand = n; + } + obj->operand = -1; + current_stack_depth--; + } else { + assert(obj->defined); + _trace_printf ("%s%ld\n", obj->type->op_code, obj->token); + } + + _push_object (obj); + dump_stack(__func__); + } +} + +static void +_emit_context (cairo_t *cr) +{ + _emit_current (_get_object (CONTEXT, cr)); +} + +static void +_emit_pattern (cairo_pattern_t *pattern) +{ + _emit_current (_get_object (PATTERN, pattern)); +} + +static void +_emit_surface (cairo_surface_t *surface) +{ + _emit_current (_get_object (SURFACE, surface)); +} + +static void CAIRO_PRINTF_FORMAT(2, 3) +_emit_cairo_op (cairo_t *cr, const char *fmt, ...) +{ + va_list ap; + + if (cr == NULL || ! _write_lock ()) + return; + + _emit_context (cr); + + va_start (ap, fmt); + _trace_vprintf ( fmt, ap); + va_end (ap); + + _write_unlock (); +} + +cairo_t * +cairo_create (cairo_surface_t *target) +{ + cairo_t *ret; + long surface_id; + long context_id; + + _enter_trace (); + + ret = DLCALL (cairo_create, target); + context_id = _create_context_id (ret); + + _emit_line_info (); + if (target != NULL && _write_lock ()) { + surface_id = _get_surface_id (target); + if (surface_id != -1) { + _get_object (SURFACE, target)->foreign = FALSE; + + /* we presume that we will continue to use the context */ + if (_pop_operands_to (SURFACE, target)){ + _consume_operand (false); + } else { + _trace_printf ("s%ld ", surface_id); + } + _trace_printf ("context %% c%ld\n", context_id); + _push_operand (CONTEXT, ret); + dump_stack(__func__); + } + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +void +cairo_save (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "save\n"); + DLCALL (cairo_save, cr); + _exit_trace (); +} + +void +cairo_restore (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "restore\n"); + DLCALL (cairo_restore, cr); + _exit_trace (); +} + +void +cairo_push_group (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "//COLOR_ALPHA push-group\n"); + DLCALL (cairo_push_group, cr); + _exit_trace (); +} + +static const char * +_content_to_string (cairo_content_t content) +{ + switch (content) { + case CAIRO_CONTENT_ALPHA: return "ALPHA"; + case CAIRO_CONTENT_COLOR: return "COLOR"; + default: + case CAIRO_CONTENT_COLOR_ALPHA: return "COLOR_ALPHA"; + } +} + +void +cairo_push_group_with_content (cairo_t *cr, cairo_content_t content) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "//%s push-group\n", _content_to_string (content)); + DLCALL (cairo_push_group_with_content, cr, content); + _exit_trace (); +} + +cairo_pattern_t * +cairo_pop_group (cairo_t *cr) +{ + cairo_pattern_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_pop_group, cr); + + _emit_line_info (); + _emit_cairo_op (cr, "pop-group %% p%ld\n", _create_pattern_id (ret)); + _push_operand (PATTERN, ret); + dump_stack(__func__); + + _exit_trace (); + return ret; +} + +void +cairo_pop_group_to_source (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "pop-group set-source\n"); + DLCALL (cairo_pop_group_to_source, cr); + _exit_trace (); +} + +static const char * +_operator_to_string (cairo_operator_t op) +{ +#define f(name) case CAIRO_OPERATOR_ ## name: return #name + switch (op) { + f(OVER); + f(SOURCE); + f(CLEAR); + f(IN); + f(OUT); + f(ATOP); + f(DEST); + f(DEST_OVER); + f(DEST_IN); + f(DEST_OUT); + f(DEST_ATOP); + f(XOR); + f(ADD); + f(SATURATE); + f(MULTIPLY); + f(SCREEN); + f(OVERLAY); + f(DARKEN); + f(LIGHTEN); + case CAIRO_OPERATOR_COLOR_DODGE: return "DODGE"; + case CAIRO_OPERATOR_COLOR_BURN: return "BURN"; + f(HARD_LIGHT); + f(SOFT_LIGHT); + f(DIFFERENCE); + f(EXCLUSION); + f(HSL_HUE); + f(HSL_SATURATION); + f(HSL_COLOR); + f(HSL_LUMINOSITY); + } +#undef f + return "UNKNOWN_OPERATOR"; +} + +void +cairo_set_operator (cairo_t *cr, cairo_operator_t op) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "//%s set-operator\n", _operator_to_string (op)); + DLCALL (cairo_set_operator, cr, op); + _exit_trace (); +} + +void +cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g %g %g set-source-rgb\n", red, green, blue); + DLCALL (cairo_set_source_rgb, cr, red, green, blue); + _exit_trace (); +} + +void +cairo_set_source_rgba (cairo_t *cr, double red, double green, double blue, double alpha) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g %g %g %g set-source-rgba\n", + red, green, blue, alpha); + DLCALL (cairo_set_source_rgba, cr, red, green, blue, alpha); + _exit_trace (); +} + +static void +_emit_source_image (cairo_surface_t *surface) +{ + Object *obj; + cairo_surface_t *image; + cairo_t *cr; + + obj = _get_object (SURFACE, surface); + if (obj == NULL) + return; + + image = DLCALL (cairo_image_surface_create, + CAIRO_FORMAT_ARGB32, + obj->width, + obj->height); + cr = DLCALL (cairo_create, image); + DLCALL (cairo_set_source_surface, cr, surface, 0, 0); + DLCALL (cairo_paint, cr); + DLCALL (cairo_destroy, cr); + + _emit_image (image, NULL); + _trace_printf (" set-source-image "); + DLCALL (cairo_surface_destroy, image); + + obj->foreign = FALSE; +} + +static void +_emit_source_image_rectangle (cairo_surface_t *surface, + int x, int y, + int width, int height) +{ + Object *obj; + cairo_surface_t *image; + cairo_t *cr; + + obj = _get_object (SURFACE, surface); + if (obj == NULL) + return; + + if (obj->foreign) { + _emit_source_image (surface); + return; + } + + image = DLCALL (cairo_image_surface_create, + CAIRO_FORMAT_ARGB32, + width, + height); + cr = DLCALL (cairo_create, image); + DLCALL (cairo_set_source_surface, cr, surface, x, y); + DLCALL (cairo_paint, cr); + DLCALL (cairo_destroy, cr); + + _emit_image (image, NULL); + _trace_printf (" %d %d set-device-offset set-source-image ", + x, y); + DLCALL (cairo_surface_destroy, image); +} + +void +cairo_set_source_surface (cairo_t *cr, cairo_surface_t *surface, double x, double y) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && surface != NULL && _write_lock ()) { + Object *obj = _get_object (SURFACE, surface); + + if (_is_current (SURFACE, surface, 0) && + _is_current (CONTEXT, cr, 1)) + { + _consume_operand (false); + } + else if (_is_current (SURFACE, surface, 1) && + _is_current (CONTEXT, cr, 0) && + obj->defined) + { + _trace_printf ("exch "); + _exch_operands (); + _consume_operand (false); + } else if (obj->defined) { + _emit_context (cr); + _trace_printf ("s%ld ", obj->token); + } else { + _emit_context (cr); + _trace_printf ("%d index ", + current_stack_depth - obj->operand - 1); + } + + if (obj->foreign) + _emit_source_image (surface); + + _trace_printf ("pattern"); + if (x != 0. || y != 0.) + _trace_printf (" %g %g translate", -x, -y); + + _trace_printf (" set-source\n"); + _write_unlock (); + } + + DLCALL (cairo_set_source_surface, cr, surface, x, y); + _exit_trace (); +} + +void +cairo_set_source (cairo_t *cr, cairo_pattern_t *source) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && source != NULL && _write_lock ()) { + Object *obj = _get_object (PATTERN, source); + cairo_bool_t need_context_and_pattern = TRUE; + + if (_is_current (PATTERN, source, 0) && + _is_current (CONTEXT, cr, 1)) + { + if (obj->defined) { + _consume_operand (false); + } else { + _trace_printf ("exch 1 index "); + _exch_operands (); + } + need_context_and_pattern = FALSE; + } + else if (_is_current (PATTERN, source, 1) && + _is_current (CONTEXT, cr, 0)) + { + if (obj->defined) { + _trace_printf ("exch "); + _exch_operands (); + _consume_operand (false); + need_context_and_pattern = FALSE; + } + } + + if (need_context_and_pattern) { + _emit_context (cr); + _emit_pattern_id (source); + } + + _trace_printf ("set-source %% p%ld\n", obj->token); + _write_unlock (); + } + + DLCALL (cairo_set_source, cr, source); + _exit_trace (); +} + +cairo_pattern_t * +cairo_get_source (cairo_t *cr) +{ + cairo_pattern_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_get_source, cr); + + if (! _has_pattern_id (ret)) { + _emit_cairo_op (cr, "/source get /p%ld exch def\n", + _create_pattern_id (ret)); + _get_object (PATTERN, ret)->defined = TRUE; + } + + _exit_trace (); + return ret; +} + +void +cairo_set_tolerance (cairo_t *cr, double tolerance) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g set-tolerance\n", tolerance); + DLCALL (cairo_set_tolerance, cr, tolerance); + _exit_trace (); +} + +static const char * +_antialias_to_string (cairo_antialias_t antialias) +{ +#define f(name) case CAIRO_ANTIALIAS_ ## name: return "ANTIALIAS_" #name + switch (antialias) { + f(DEFAULT); + + f(NONE); + f(GRAY); + f(SUBPIXEL); + + f(FAST); + f(GOOD); + f(BEST); + }; +#undef f + return "UNKNOWN_ANTIALIAS"; +} + +void +cairo_set_antialias (cairo_t *cr, cairo_antialias_t antialias) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, + "//%s set-antialias\n", _antialias_to_string (antialias)); + DLCALL (cairo_set_antialias, cr, antialias); + _exit_trace (); +} + +static const char * +_fill_rule_to_string (cairo_fill_rule_t rule) +{ +#define f(name) case CAIRO_FILL_RULE_ ## name: return #name + switch (rule) { + f(WINDING); + f(EVEN_ODD); + }; +#undef f + return "UNKNOWN_FILL_RULE"; +} + +void +cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, + "//%s set-fill-rule\n", _fill_rule_to_string (fill_rule)); + DLCALL (cairo_set_fill_rule, cr, fill_rule); + _exit_trace (); +} + +void +cairo_set_line_width (cairo_t *cr, double width) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g set-line-width\n", width); + DLCALL (cairo_set_line_width, cr, width); + _exit_trace (); +} + +static const char * +_line_cap_to_string (cairo_line_cap_t line_cap) +{ +#define f(name) case CAIRO_LINE_CAP_ ## name: return "LINE_CAP_" #name + switch (line_cap) { + f(BUTT); + f(ROUND); + f(SQUARE); + }; +#undef f + return "UNKNOWN_LINE_CAP"; +} + +void +cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "//%s set-line-cap\n", _line_cap_to_string (line_cap)); + DLCALL (cairo_set_line_cap, cr, line_cap); + _exit_trace (); +} + +static const char * +_line_join_to_string (cairo_line_join_t line_join) +{ +#define f(name) case CAIRO_LINE_JOIN_ ## name: return "LINE_JOIN_" #name + switch (line_join) { + f(MITER); + f(ROUND); + f(BEVEL); + }; +#undef f + return "UNKNOWN_LINE_JOIN"; +} + +void +cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, + "//%s set-line-join\n", _line_join_to_string (line_join)); + DLCALL (cairo_set_line_join, cr, line_join); + _exit_trace (); +} + +void +cairo_set_dash (cairo_t *cr, const double *dashes, int num_dashes, double offset) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && _write_lock ()) { + int n; + + _emit_context (cr); + + _trace_printf ("["); + for (n = 0; n < num_dashes; n++) { + if (n != 0) + _trace_printf (" "); + _trace_printf ("%g", dashes[n]); + } + _trace_printf ("] %g set-dash\n", offset); + + _write_unlock (); + } + + DLCALL (cairo_set_dash, cr, dashes, num_dashes, offset); + _exit_trace (); +} + +void +cairo_set_miter_limit (cairo_t *cr, double limit) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g set-miter-limit\n", limit); + DLCALL (cairo_set_miter_limit, cr, limit); + _exit_trace (); +} + +void +cairo_translate (cairo_t *cr, double tx, double ty) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g %g translate\n", tx, ty); + DLCALL (cairo_translate, cr, tx, ty); + _exit_trace (); +} + +void +cairo_scale (cairo_t *cr, double sx, double sy) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g %g scale\n", sx, sy); + DLCALL (cairo_scale, cr, sx, sy); + _exit_trace (); +} + +void +cairo_rotate (cairo_t *cr, double angle) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g rotate\n", angle); + DLCALL (cairo_rotate, cr, angle); + _exit_trace (); +} + +void +cairo_transform (cairo_t *cr, const cairo_matrix_t *matrix) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g %g %g %g %g %g matrix transform\n", + matrix->xx, matrix->yx, + matrix->xy, matrix->yy, + matrix->x0, matrix->y0); + DLCALL (cairo_transform, cr, matrix); + _exit_trace (); +} + +void +cairo_set_matrix (cairo_t *cr, const cairo_matrix_t *matrix) +{ + _enter_trace (); + _emit_line_info (); + if (_matrix_is_identity (matrix)) { + _emit_cairo_op (cr, "identity set-matrix\n"); + } else { + _emit_cairo_op (cr, "%g %g %g %g %g %g matrix set-matrix\n", + matrix->xx, matrix->yx, + matrix->xy, matrix->yy, + matrix->x0, matrix->y0); + } + DLCALL (cairo_set_matrix, cr, matrix); + _exit_trace (); +} + +cairo_surface_t * +cairo_get_target (cairo_t *cr) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_get_target, cr); + if (cr != NULL) { + Object *obj = _create_surface (ret); + + if (! obj->defined) { + _emit_cairo_op (cr, + "/target get /s%ld exch def\n", + obj->token); + obj->defined = TRUE; + } + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_get_group_target (cairo_t *cr) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_get_group_target, cr); + if (cr != NULL) { + Object *obj = _create_surface (ret); + + if (! obj->defined) { + _emit_cairo_op (cr, + "/group-target get /s%ld exch def\n", + obj->token); + obj->defined = TRUE; + } + } + + _exit_trace (); + return ret; +} + +void +cairo_identity_matrix (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "identity set-matrix\n"); + DLCALL (cairo_identity_matrix, cr); + _exit_trace (); +} + +void +cairo_new_path (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "n "); + DLCALL (cairo_new_path, cr); + _exit_trace (); +} + +void +cairo_move_to (cairo_t *cr, double x, double y) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g m ", x, y); + DLCALL (cairo_move_to, cr, x, y); + _exit_trace (); +} + +void +cairo_new_sub_path (cairo_t *cr) +{ + _enter_trace (); + _emit_cairo_op (cr, "N "); + DLCALL (cairo_new_sub_path, cr); + _exit_trace (); +} + +void +cairo_line_to (cairo_t *cr, double x, double y) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g l ", x, y); + DLCALL (cairo_line_to, cr, x, y); + _exit_trace (); +} + +void +cairo_curve_to (cairo_t *cr, double x1, double y1, double x2, double y2, double x3, double y3) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g %g %g %g %g c ", x1, y1, x2, y2, x3, y3); + DLCALL (cairo_curve_to, cr, x1, y1, x2, y2, x3, y3); + _exit_trace (); +} + +void +cairo_arc (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g %g %g %g arc\n", xc, yc, radius, angle1, angle2); + DLCALL (cairo_arc, cr, xc, yc, radius, angle1, angle2); + _exit_trace (); +} + +void +cairo_arc_negative (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g %g %g %g arc-\n", + xc, yc, radius, angle1, angle2); + DLCALL (cairo_arc_negative, cr, xc, yc, radius, angle1, angle2); + _exit_trace (); +} + +void +cairo_rel_move_to (cairo_t *cr, double dx, double dy) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g M ", dx, dy); + DLCALL (cairo_rel_move_to, cr, dx, dy); + _exit_trace (); +} + +void +cairo_rel_line_to (cairo_t *cr, double dx, double dy) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g L ", dx, dy); + DLCALL (cairo_rel_line_to, cr, dx, dy); + _exit_trace (); +} + +void +cairo_rel_curve_to (cairo_t *cr, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g %g %g %g %g C ", + dx1, dy1, dx2, dy2, dx3, dy3); + DLCALL (cairo_rel_curve_to, cr, dx1, dy1, dx2, dy2, dx3, dy3); + _exit_trace (); +} + +void +cairo_rectangle (cairo_t *cr, double x, double y, double width, double height) +{ + _enter_trace (); + _emit_cairo_op (cr, "%g %g %g %g rectangle\n", x, y, width, height); + DLCALL (cairo_rectangle, cr, x, y, width, height); + _exit_trace (); +} + +void +cairo_close_path (cairo_t *cr) +{ + _enter_trace (); + _emit_cairo_op (cr, "h\n"); + DLCALL (cairo_close_path, cr); + _exit_trace (); +} + +void +cairo_paint (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "paint\n"); + DLCALL (cairo_paint, cr); + _exit_trace (); +} + +void +cairo_paint_with_alpha (cairo_t *cr, double alpha) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g paint-with-alpha\n", alpha); + DLCALL (cairo_paint_with_alpha, cr, alpha); + _exit_trace (); +} + +void +cairo_mask (cairo_t *cr, cairo_pattern_t *pattern) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && pattern != NULL && _write_lock ()) { + Object *obj = _get_object (PATTERN, pattern); + cairo_bool_t need_context_and_pattern = TRUE; + + if (_is_current (PATTERN, pattern, 0) && + _is_current (CONTEXT, cr, 1)) + { + if (obj->defined) { + _consume_operand (false); + need_context_and_pattern = FALSE; + } + } + else if (_is_current (PATTERN, pattern, 1) && + _is_current (CONTEXT, cr, 0)) + { + if (obj->defined) { + _trace_printf ("exch "); + _exch_operands (); + _consume_operand (false); + need_context_and_pattern = FALSE; + } + } + + if (need_context_and_pattern) { + _emit_context (cr); + _emit_pattern_id (pattern); + } + + _trace_printf (" mask\n"); + _write_unlock (); + } + DLCALL (cairo_mask, cr, pattern); + _exit_trace (); +} + +void +cairo_mask_surface (cairo_t *cr, cairo_surface_t *surface, double x, double y) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && surface != NULL && _write_lock ()) { + Object *obj = _get_object (SURFACE, surface); + if (_is_current (SURFACE, surface, 0) && + _is_current (CONTEXT, cr, 1)) + { + _consume_operand (false); + } + else if (_is_current (SURFACE, surface, 1) && + _is_current (CONTEXT, cr, 0)) + { + _trace_printf ("exch "); + _exch_operands (); + _consume_operand (false); + } else if (obj->defined){ + _emit_context (cr); + _trace_printf ("s%ld ", obj->token); + } else { + _emit_context (cr); + _trace_printf ("%d index ", + current_stack_depth - obj->operand - 1); + } + _trace_printf ("pattern"); + + if (x != 0. || y != 0.) + _trace_printf (" %g %g translate", -x, -y); + + _trace_printf (" mask\n"); + _write_unlock (); + } + + DLCALL (cairo_mask_surface, cr, surface, x, y); + _exit_trace (); +} + +void +cairo_stroke (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "stroke\n"); + DLCALL (cairo_stroke, cr); + _exit_trace (); +} + +void +cairo_stroke_preserve (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "stroke+\n"); + DLCALL (cairo_stroke_preserve, cr); + _exit_trace (); +} + +void +cairo_fill (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "fill\n"); + DLCALL (cairo_fill, cr); + _exit_trace (); +} + +void +cairo_fill_preserve (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "fill+\n"); + DLCALL (cairo_fill_preserve, cr); + _exit_trace (); +} + +void +cairo_copy_page (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "copy-page\n"); + DLCALL (cairo_copy_page, cr); + _exit_trace (); +} + +void +cairo_show_page (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "show-page\n"); + DLCALL (cairo_show_page, cr); + _exit_trace (); +} + +void +cairo_clip (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "clip\n"); + DLCALL (cairo_clip, cr); + _exit_trace (); +} + +void +cairo_clip_preserve (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "clip+\n"); + DLCALL (cairo_clip_preserve, cr); + _exit_trace (); +} + +void +cairo_reset_clip (cairo_t *cr) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "reset-clip\n"); + DLCALL (cairo_reset_clip, cr); + _exit_trace (); +} + + +static const char * +_slant_to_string (cairo_font_slant_t font_slant) +{ +#define f(name) case CAIRO_FONT_SLANT_ ## name: return "SLANT_" #name + switch (font_slant) { + f(NORMAL); + f(ITALIC); + f(OBLIQUE); + }; +#undef f + return "UNKNOWN_SLANT"; +} + +static const char * +_weight_to_string (cairo_font_weight_t font_weight) +{ +#define f(name) case CAIRO_FONT_WEIGHT_ ## name: return "WEIGHT_" #name + switch (font_weight) { + f(NORMAL); + f(BOLD); + }; +#undef f + return "UNKNOWN_WEIGHT"; +} + +void +cairo_select_font_face (cairo_t *cr, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && _write_lock ()) { + _emit_context (cr); + _emit_string_literal (family, -1); + _trace_printf (" //%s //%s select-font-face\n", + _slant_to_string (slant), + _weight_to_string (weight)); + _write_unlock (); + } + DLCALL (cairo_select_font_face, cr, family, slant, weight); + _exit_trace (); +} + +cairo_font_face_t * +cairo_get_font_face (cairo_t *cr) +{ + cairo_font_face_t *ret; + long font_face_id; + + _enter_trace (); + + ret = DLCALL (cairo_get_font_face, cr); + font_face_id = _create_font_face_id (ret); + + _emit_cairo_op (cr, "/font-face get %% f%ld\n", font_face_id); + _push_operand (FONT_FACE, ret); + dump_stack(__func__); + + _exit_trace (); + return ret; +} + +void +cairo_set_font_face (cairo_t *cr, cairo_font_face_t *font_face) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && font_face != NULL && _write_lock ()) { + if (_is_current (FONT_FACE, font_face, 0) && + _is_current (CONTEXT, cr, 1)) + { + _consume_operand (false); + } + else if (_is_current (FONT_FACE, font_face, 1) && + _is_current (CONTEXT, cr, 0)) + { + _trace_printf ("exch "); + _exch_operands (); + _consume_operand (false); + } + else + { + _emit_context (cr); + _emit_font_face_id (font_face); + } + + _trace_printf ("set-font-face\n"); + _write_unlock (); + } + + DLCALL (cairo_set_font_face, cr, font_face); + _exit_trace (); +} + +void +cairo_set_font_size (cairo_t *cr, double size) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g set-font-size\n", size); + DLCALL (cairo_set_font_size, cr, size); + _exit_trace (); +} + +void +cairo_set_font_matrix (cairo_t *cr, const cairo_matrix_t *matrix) +{ + _enter_trace (); + _emit_line_info (); + _emit_cairo_op (cr, "%g %g %g %g %g %g matrix set-font-matrix\n", + matrix->xx, matrix->yx, + matrix->xy, matrix->yy, + matrix->x0, matrix->y0); + DLCALL (cairo_set_font_matrix, cr, matrix); + _exit_trace (); +} + +static const char * +_subpixel_order_to_string (cairo_subpixel_order_t subpixel_order) +{ +#define f(name) case CAIRO_SUBPIXEL_ORDER_ ## name: return "SUBPIXEL_ORDER_" #name + switch (subpixel_order) { + f(DEFAULT); + f(RGB); + f(BGR); + f(VRGB); + f(VBGR); + }; +#undef f + return "UNKNOWN_SUBPIXEL_ORDER"; +} + +static const char * +_hint_style_to_string (cairo_hint_style_t hint_style) +{ +#define f(name) case CAIRO_HINT_STYLE_ ## name: return "HINT_STYLE_" #name + switch (hint_style) { + f(DEFAULT); + f(NONE); + f(SLIGHT); + f(MEDIUM); + f(FULL); + }; +#undef f + return "UNKNOWN_HINT_STYLE"; +} + +static const char * +_hint_metrics_to_string (cairo_hint_metrics_t hint_metrics) +{ +#define f(name) case CAIRO_HINT_METRICS_ ## name: return "HINT_METRICS_" #name + switch (hint_metrics) { + f(DEFAULT); + f(OFF); + f(ON); + }; +#undef f + return "UNKNOWN_HINT_METRICS"; +} + +static void +_emit_font_options (const cairo_font_options_t *options) +{ + cairo_antialias_t antialias; + cairo_subpixel_order_t subpixel_order; + cairo_hint_style_t hint_style; + cairo_hint_metrics_t hint_metrics; + + _trace_printf ("<<"); + + antialias = DLCALL (cairo_font_options_get_antialias, options); + if (antialias != CAIRO_ANTIALIAS_DEFAULT) { + _trace_printf (" /antialias //%s", + _antialias_to_string (antialias)); + } + + subpixel_order = DLCALL (cairo_font_options_get_subpixel_order, options); + if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) { + _trace_printf (" /subpixel-order //%s", + _subpixel_order_to_string (subpixel_order)); + } + + hint_style = DLCALL (cairo_font_options_get_hint_style, options); + if (hint_style != CAIRO_HINT_STYLE_DEFAULT) { + _trace_printf (" /hint-style //%s", + _hint_style_to_string (hint_style)); + } + + hint_metrics = DLCALL (cairo_font_options_get_hint_metrics, options); + if (hint_metrics != CAIRO_HINT_METRICS_DEFAULT) { + _trace_printf (" /hint-metrics //%s", + _hint_metrics_to_string (hint_metrics)); + } + + _trace_printf (" >>"); +} + +void +cairo_set_font_options (cairo_t *cr, const cairo_font_options_t *options) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && options != NULL && _write_lock ()) { + _emit_context (cr); + _emit_font_options (options); + _trace_printf (" set-font-options\n"); + _write_unlock (); + } + + DLCALL (cairo_set_font_options, cr, options); + _exit_trace (); +} + +cairo_scaled_font_t * +cairo_get_scaled_font (cairo_t *cr) +{ + cairo_scaled_font_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_get_scaled_font, cr); + + if (cr != NULL && ! _has_scaled_font_id (ret)) { + _emit_cairo_op (cr, "/scaled-font get /sf%ld exch def\n", + _create_scaled_font_id (ret)); + _get_object (SCALED_FONT, ret)->defined = TRUE; + } + + _exit_trace (); + return ret; +} + +void +cairo_set_scaled_font (cairo_t *cr, const cairo_scaled_font_t *scaled_font) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && scaled_font != NULL && _write_lock ()) { + Object *obj = _get_object (SCALED_FONT, scaled_font); + cairo_bool_t need_context_and_font = TRUE; + + if (_is_current (SCALED_FONT, scaled_font, 0) && + _is_current (CONTEXT, cr, 1)) + { + if (obj->defined) { + _consume_operand (false); + } else { + _trace_printf ("exch 1 index "); + _exch_operands (); + } + need_context_and_font = FALSE; + } + else if (_is_current (SCALED_FONT, scaled_font, 1) && + _is_current (CONTEXT, cr, 0)) + { + if (obj->defined) { + _trace_printf ("exch "); + _exch_operands (); + _consume_operand (false); + need_context_and_font = FALSE; + } + } + + if (need_context_and_font) { + _emit_context (cr); + _emit_scaled_font_id (scaled_font); + } + + _trace_printf ("set-scaled-font\n"); + + _write_unlock (); + } + DLCALL (cairo_set_scaled_font, cr, scaled_font); + _exit_trace (); +} + +static void +_emit_matrix (const cairo_matrix_t *m) +{ + if (_matrix_is_identity(m)) + { + _trace_printf ("identity"); + } + else + { + _trace_printf ("%g %g %g %g %g %g matrix", + m->xx, m->yx, + m->xy, m->yy, + m->x0, m->y0); + } +} + +cairo_scaled_font_t * +cairo_scaled_font_create (cairo_font_face_t *font_face, + const cairo_matrix_t *font_matrix, + const cairo_matrix_t *ctm, + const cairo_font_options_t *options) +{ + cairo_scaled_font_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_scaled_font_create, font_face, font_matrix, ctm, options); + if (_has_scaled_font_id (ret)) + goto out; + + _emit_line_info (); + if (font_face != NULL && + font_matrix != NULL && + ctm != NULL && + options != NULL + && _write_lock ()) + { + Object *obj; + + obj = _type_object_create (SCALED_FONT, ret); + DLCALL (cairo_scaled_font_set_user_data, + ret, &destroy_key, obj, _object_undef); + + if (_pop_operands_to (FONT_FACE, font_face)) + _consume_operand (false); + else + _trace_printf ("f%ld ", _get_font_face_id (font_face)); + + _emit_matrix (font_matrix); + _trace_printf (" "); + + _emit_matrix (ctm); + _trace_printf (" "); + + _emit_font_options (options); + + _trace_printf (" scaled-font /sf%ld exch def\n", + obj->token); + obj->defined = TRUE; + + _write_unlock (); + } + +out: + _exit_trace (); + return ret; +} + +void +cairo_show_text (cairo_t *cr, const char *utf8) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && _write_lock ()) { + _emit_context (cr); + _emit_string_literal (utf8, -1); + _trace_printf (" show-text\n"); + _write_unlock (); + } + DLCALL (cairo_show_text, cr, utf8); + _exit_trace (); +} + +static void +_glyph_advance (cairo_scaled_font_t *font, + const cairo_glyph_t *glyph, + double *x, double *y) +{ + cairo_text_extents_t extents; + + DLCALL (cairo_scaled_font_glyph_extents, font, glyph, 1, &extents); + *x += extents.x_advance; + *y += extents.y_advance; +} + +#define TOLERANCE 1e-5 +static void +_emit_glyphs (cairo_scaled_font_t *font, + const cairo_glyph_t *glyphs, + int num_glyphs) +{ + double x,y; + int n; + + if (num_glyphs == 0) { + _trace_printf ("[]"); + return; + } + + for (n = 0; n < num_glyphs; n++) { + if (glyphs[n].index > 255) + break; + } + + x = glyphs->x; + y = glyphs->y; + if (n < num_glyphs) { /* need full glyph range */ + cairo_bool_t first; + + _trace_printf ("[%g %g [", x, y); + first = TRUE; + while (num_glyphs--) { + if (fabs (glyphs->x - x) > TOLERANCE || + fabs (glyphs->y - y) > TOLERANCE) + { + x = glyphs->x; + y = glyphs->y; + _trace_printf ("] %g %g [", x, y); + first = TRUE; + } + + if (! first) + _trace_printf (" "); + _trace_printf ("%lu", glyphs->index); + first = FALSE; + + _glyph_advance (font, glyphs, &x, &y); + glyphs++; + } + _trace_printf ("]]"); + } else { + struct _data_stream stream; + + if (num_glyphs == 1) { + _trace_printf ("[%g %g <%02lx>]", x, y, glyphs->index); + } else { + _trace_printf ("[%g %g <~", x, y); + _write_base85_data_start (&stream); + while (num_glyphs--) { + unsigned char c; + + if (fabs (glyphs->x - x) > TOLERANCE || + fabs (glyphs->y - y) > TOLERANCE) + { + x = glyphs->x; + y = glyphs->y; + _write_base85_data_end (&stream); + _trace_printf ("~> %g %g <~", x, y); + _write_base85_data_start (&stream); + } + + c = glyphs->index; + _write_base85_data (&stream, &c, 1); + + _glyph_advance (font, glyphs, &x, &y); + glyphs++; + } + _write_base85_data_end (&stream); + _trace_printf ("~>]"); + } + } +} + +void +cairo_show_glyphs (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && glyphs != NULL && _write_lock ()) { + cairo_scaled_font_t *font; + + _emit_context (cr); + font = DLCALL (cairo_get_scaled_font, cr); + + _emit_glyphs (font, glyphs, num_glyphs); + _trace_printf (" show-glyphs\n"); + _write_unlock (); + } + + DLCALL (cairo_show_glyphs, cr, glyphs, num_glyphs); + _exit_trace (); +} + +static const char * +_direction_to_string (cairo_bool_t backward) +{ + const char *names[] = { + "FORWARD", + "BACKWARD" + }; + return names[!!backward]; +} + +void +cairo_show_text_glyphs (cairo_t *cr, + const char *utf8, + int utf8_len, + const cairo_glyph_t *glyphs, + int num_glyphs, + const cairo_text_cluster_t *clusters, + int num_clusters, + cairo_text_cluster_flags_t backward) +{ + cairo_scaled_font_t *font; + + _enter_trace (); + + font = DLCALL (cairo_get_scaled_font, cr); + + _emit_line_info (); + if (cr != NULL && glyphs != NULL && clusters != NULL && _write_lock ()) { + int n; + + _emit_context (cr); + + _emit_string_literal (utf8, utf8_len); + + _emit_glyphs (font, glyphs, num_glyphs); + _trace_printf (" ["); + for (n = 0; n < num_clusters; n++) { + _trace_printf (" %d %d", + clusters[n].num_bytes, + clusters[n].num_glyphs); + } + _trace_printf (" ] //%s show-text-glyphs\n", + _direction_to_string (backward)); + + _write_unlock (); + } + + DLCALL (cairo_show_text_glyphs, cr, + utf8, utf8_len, + glyphs, num_glyphs, + clusters, num_clusters, + backward); + _exit_trace (); +} + +void +cairo_text_path (cairo_t *cr, const char *utf8) +{ + _enter_trace (); + _emit_line_info (); + if (cr != NULL && _write_lock ()) { + _emit_context (cr); + _emit_string_literal (utf8, -1); + _trace_printf (" text-path\n"); + _write_unlock (); + } + DLCALL (cairo_text_path, cr, utf8); + _exit_trace (); +} + +void +cairo_glyph_path (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs) +{ + cairo_scaled_font_t *font; + + _enter_trace (); + + font = DLCALL (cairo_get_scaled_font, cr); + + _emit_line_info (); + if (cr != NULL && glyphs != NULL && _write_lock ()) { + _emit_context (cr); + _emit_glyphs (font, glyphs, num_glyphs); + _trace_printf (" glyph-path\n"); + + _write_unlock (); + } + + DLCALL (cairo_glyph_path, cr, glyphs, num_glyphs); + _exit_trace (); +} + +void +cairo_append_path (cairo_t *cr, const cairo_path_t *path) +{ + /* XXX no support for named paths, so manually reconstruct */ + int i; + cairo_path_data_t *p; + + _enter_trace (); + + _emit_line_info (); + if (cr == NULL || path == NULL) { + DLCALL (cairo_append_path, cr, path); + _exit_trace (); + return; + } + + for (i=0; i < path->num_data; i += path->data[i].header.length) { + p = &path->data[i]; + switch (p->header.type) { + case CAIRO_PATH_MOVE_TO: + if (p->header.length >= 2) + cairo_move_to (cr, p[1].point.x, p[1].point.y); + break; + case CAIRO_PATH_LINE_TO: + if (p->header.length >= 2) + cairo_line_to (cr, p[1].point.x, p[1].point.y); + break; + case CAIRO_PATH_CURVE_TO: + if (p->header.length >= 4) + cairo_curve_to (cr, + p[1].point.x, p[1].point.y, + p[2].point.x, p[2].point.y, + p[3].point.x, p[3].point.y); + break; + case CAIRO_PATH_CLOSE_PATH: + if (p->header.length >= 1) + cairo_close_path (cr); + break; + default: + break; + } + } + _exit_trace (); +} + +cairo_surface_t * +cairo_image_surface_create (cairo_format_t format, int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_image_surface_create, format, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + const char *format_str = _format_to_string (format); + const char *content_str = _format_to_content_string (format); + + _trace_printf ("dict\n" + " /width %d set\n" + " /height %d set\n" + " /format //%s set\n" + " /content //%s set\n" + " image dup /s%ld exch def\n", + width, height, format_str, content_str, obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_image_surface_create_for_data (unsigned char *data, cairo_format_t format, int width, int height, int stride) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_image_surface_create_for_data, data, format, width, height, stride); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + /* cairo_image_surface_create_for_data() is both used to supply + * foreign pixel data to cairo and in order to read pixels back. + * Defer grabbing the pixel contents until we have to, but only for + * "large" images, for small images the overhead of embedding pixels + * is negligible. + * + * Choose 32x32 as that captures most icons which thanks to GdkPixbuf + * are frequently reloaded. + */ + if (width * height < 32*32) { + _emit_image (ret, NULL); + _trace_printf (" dup /s%ld exch def\n", + obj->token); + } else { + _trace_printf ("dict\n" + " /width %d set\n" + " /height %d set\n" + " /format //%s set\n" + " image dup /s%ld exch def\n", + width, height, + _format_to_string (format), + obj->token); + + obj->foreign = TRUE; + } + + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +unsigned char * +cairo_image_surface_get_data (cairo_surface_t *surface) +{ + unsigned char *ptr; + + /* Just leave some breadcrumbs */ + _enter_trace (); + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + _trace_printf ("%% s%ld get-data\n", _get_surface_id (surface)); + _write_unlock (); + } + ptr = DLCALL (cairo_image_surface_get_data, surface); + _exit_trace (); + + return ptr; +} + +cairo_pattern_t * +cairo_pattern_create_raster_source (void *data, cairo_content_t content, int width, int height) +{ + cairo_pattern_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_pattern_create_raster_source, data, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + long pattern_id = _create_pattern_id (ret); + cairo_format_t format; + cairo_surface_t *image; + cairo_t *cr; + + /* Impossible to accurately record the interaction with this custom + * pattern so just suck all the data into an image upfront */ + switch (content) { + case CAIRO_CONTENT_ALPHA: format = CAIRO_FORMAT_A8; break; + case CAIRO_CONTENT_COLOR: format = CAIRO_FORMAT_RGB24; break; + default: + case CAIRO_CONTENT_COLOR_ALPHA: format = CAIRO_FORMAT_ARGB32; break; + } + + _trace_printf ("%% raster-source\n"); + + image = DLCALL (cairo_image_surface_create, format, width, height); + cr = DLCALL (cairo_create, image); + DLCALL (cairo_set_source, cr, ret); + DLCALL (cairo_paint, cr); + DLCALL (cairo_destroy, cr); + + _emit_image (image, NULL); + DLCALL (cairo_surface_destroy, image); + _trace_printf (" pattern dup /s%ld exch def\n", + pattern_id); + + _push_operand (PATTERN, ret); + _get_object (PATTERN, ret)->defined = TRUE; + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_surface_create_similar (cairo_surface_t *other, + cairo_content_t content, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_surface_create_similar, other, content, width, height); + + _emit_line_info (); + if (other != NULL && _write_lock ()) { + Object *other_obj = _get_object(SURFACE, other); + Object *new_obj = _create_surface (ret); + + if (other_obj->operand != -1) { + if (current_stack_depth == other_obj->operand + 1) + _trace_printf ("dup "); + else + _trace_printf ("%d index ", + current_stack_depth - other_obj->operand - 1); + } else { + assert(other_obj->defined); + _trace_printf ("s%ld ", other_obj->token); + } + + _trace_printf ("%d %d //%s similar dup /s%ld exch def\n", + width, height, + _content_to_string (content), + new_obj->token); + + new_obj->width = width; + new_obj->height = height; + new_obj->defined = TRUE; + + _push_object (new_obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_surface_create_similar_image (cairo_surface_t *other, + cairo_format_t format, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_surface_create_similar_image, + other, format, width, height); + + _emit_line_info (); + if (other != NULL && _write_lock ()) { + Object *other_obj = _get_object(SURFACE, other); + Object *new_obj = _create_surface (ret); + + if (other_obj->defined) + _trace_printf ("s%ld ", other_obj->token); + else if (current_stack_depth == other_obj->operand + 1) + _trace_printf ("dup "); + else + _trace_printf ("%d index ", + current_stack_depth - other_obj->operand - 1); + _trace_printf ("//%s %d %d similar-image %% s%ld\n", + _format_to_string (format), + width, height, + new_obj->token); + new_obj->width = width; + new_obj->height = height; + + _push_object (new_obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_surface_map_to_image (cairo_surface_t *surface, + const cairo_rectangle_int_t *extents) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_surface_map_to_image, surface, extents); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _emit_surface (surface); + if (extents) { + _trace_printf ("[%d %d %d %d] map-to-image %% s%ld\n", + extents->x, extents->y, + extents->width, extents->height, + obj->token); + obj->width = extents->width; + obj->height = extents->height; + } else { + _trace_printf ("[ ] map-to-image %% s%ld\n", obj->token); + } + + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +void +cairo_surface_unmap_image (cairo_surface_t *surface, + cairo_surface_t *image) +{ + _enter_trace (); + + _emit_line_info (); + if (_write_lock ()) { + Object *s = _get_object (SURFACE, surface); + Object *i = _get_object (SURFACE, image); + if (!(s->operand == current_stack_depth - 2 && + i->operand == current_stack_depth - 1)) { + if (i->operand != s->operand + 1 || ! _pop_operands_to_depth (i->operand + 1)) { + _emit_surface (surface); + _emit_surface (image); + } + } + _trace_printf ("unmap-image\n"); + _consume_operand (true); + _write_unlock (); + } + + DLCALL (cairo_surface_unmap_image, surface, image); + + _exit_trace (); +} + +cairo_surface_t * +cairo_surface_create_for_rectangle (cairo_surface_t *target, + double x, double y, + double width, double height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_surface_create_for_rectangle, target, x, y, width, height); + + _emit_line_info (); + if (target != NULL && _write_lock ()) { + Object *target_obj = _get_object (SURFACE, target); + Object *child_obj = _create_surface (ret); + + if (target_obj->defined) + _trace_printf ("s%ld ", target_obj->token); + else if (current_stack_depth == target_obj->operand + 1) + _trace_printf ("dup "); + else + _trace_printf ("%d index ", current_stack_depth - target_obj->operand - 1); + _trace_printf ("%f %f %f %f subsurface %% s%ld\n", + x, y, width, height, + child_obj->token); + + _push_object (child_obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +static void CAIRO_PRINTF_FORMAT(2, 3) +_emit_surface_op (cairo_surface_t *surface, const char *fmt, ...) +{ + va_list ap; + + if (surface == NULL || ! _write_lock ()) + return; + + _emit_surface (surface); + + va_start (ap, fmt); + _trace_vprintf ( fmt, ap); + va_end (ap); + + _write_unlock (); +} + +void +cairo_surface_finish (cairo_surface_t *surface) +{ + _enter_trace (); + _emit_line_info (); + DLCALL (cairo_surface_finish, surface); + _exit_trace (); +} + +void +cairo_surface_flush (cairo_surface_t *surface) +{ + _enter_trace (); + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + _trace_printf ("%% s%ld flush\n", _get_surface_id (surface)); + _write_unlock (); + } + DLCALL (cairo_surface_flush, surface); + _exit_trace (); +} + +void +cairo_surface_mark_dirty (cairo_surface_t *surface) +{ + _enter_trace (); + _emit_line_info (); + + /* Call cairo before emitting the trace since _emit_surface() might cause + * snapshots to be creates while mark_dirty assert()s that there are none. + */ + DLCALL (cairo_surface_mark_dirty, surface); + + if (surface != NULL && _write_lock ()) { + if (_mark_dirty) { + _emit_surface (surface); + _trace_printf ("%% mark-dirty\n"); + _emit_source_image (surface); + } else + _trace_printf ("%% s%ld mark-dirty\n", _get_surface_id (surface)); + _write_unlock (); + } + _exit_trace (); +} + +void +cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface, + int x, int y, int width, int height) +{ + _enter_trace (); + + /* Call cairo before emitting the trace since _emit_surface() might cause + * snapshots to be creates while mark_dirty assert()s that there are none. + */ + DLCALL (cairo_surface_mark_dirty_rectangle, surface, x, y, width, height); + + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + if (_mark_dirty) { + _emit_surface (surface); + _trace_printf ("%% %d %d %d %d mark-dirty-rectangle\n", + x, y, width, height); + _emit_source_image_rectangle (surface, x,y, width, height); + } else + _trace_printf ("%% s%ld %d %d %d %d mark-dirty-rectangle\n", + _get_surface_id (surface), x, y, width, height); + _write_unlock (); + } + _exit_trace (); +} + +void +cairo_surface_set_device_offset (cairo_surface_t *surface, double x_offset, double y_offset) +{ + _enter_trace (); + _emit_line_info (); + _emit_surface_op (surface, "%g %g set-device-offset\n", + x_offset, y_offset); + DLCALL (cairo_surface_set_device_offset, surface, x_offset, y_offset); + _exit_trace (); +} + +void +cairo_surface_set_device_scale (cairo_surface_t *surface, double x_offset, double y_offset) +{ + _enter_trace (); + _emit_line_info (); + _emit_surface_op (surface, "%g %g set-device-scale\n", + x_offset, y_offset); + DLCALL (cairo_surface_set_device_scale, surface, x_offset, y_offset); + _exit_trace (); +} + + +void +cairo_surface_set_fallback_resolution (cairo_surface_t *surface, double x_pixels_per_inch, double y_pixels_per_inch) +{ + _enter_trace (); + _emit_line_info (); + _emit_surface_op (surface, "%g %g set-fallback-resolution\n", + x_pixels_per_inch, y_pixels_per_inch); + DLCALL (cairo_surface_set_fallback_resolution, surface, x_pixels_per_inch, y_pixels_per_inch); + _exit_trace (); +} + +void +cairo_surface_copy_page (cairo_surface_t *surface) +{ + _enter_trace (); + _emit_line_info (); + _emit_surface_op (surface, "copy-page\n"); + DLCALL (cairo_surface_copy_page, surface); + _exit_trace (); +} + +void +cairo_surface_show_page (cairo_surface_t *surface) +{ + _enter_trace (); + _emit_line_info (); + _emit_surface_op (surface, "show-page\n"); + DLCALL (cairo_surface_show_page, surface); + _exit_trace (); +} + +cairo_status_t +cairo_surface_set_mime_data (cairo_surface_t *surface, + const char *mime_type, + const unsigned char *data, + unsigned long length, + cairo_destroy_func_t destroy, + void *closure) +{ + cairo_status_t ret; + _enter_trace (); + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + _emit_surface (surface); + _emit_string_literal (mime_type, -1); + _trace_printf (" "); + _emit_data (data, length); + _trace_printf (" /deflate filter set-mime-data\n"); + + _write_unlock (); + } + + ret = DLCALL (cairo_surface_set_mime_data, + surface, + mime_type, + data, length, + destroy, + closure); + _exit_trace (); + return ret; +} + +#if CAIRO_HAS_PNG_FUNCTIONS +cairo_status_t +cairo_surface_write_to_png (cairo_surface_t *surface, const char *filename) +{ + cairo_status_t ret; + _enter_trace (); + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + _trace_printf ("%% s%ld ", _get_surface_id (surface)); + _emit_string_literal (filename, -1); + _trace_printf (" write-to-png pop\n"); + _write_unlock (); + } + ret = DLCALL (cairo_surface_write_to_png, surface, filename); + _exit_trace (); + return ret; +} + +cairo_status_t +cairo_surface_write_to_png_stream (cairo_surface_t *surface, + cairo_write_func_t write_func, + void *data) +{ + cairo_status_t ret; + _enter_trace (); + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + char symbol[1024]; + + _trace_printf ("%% s%ld ", _get_surface_id (surface)); +#if CAIRO_HAS_SYMBOL_LOOKUP + lookup_symbol (symbol, sizeof (symbol), write_func); +#else + symbol[0] = '\0'; +#endif + _emit_string_literal (symbol, -1); + _trace_printf (" write-to-png-stream pop\n"); + _write_unlock (); + } + ret = DLCALL (cairo_surface_write_to_png_stream, + surface, write_func, data); + _exit_trace (); + return ret; +} +#endif + +static void CAIRO_PRINTF_FORMAT(2, 3) +_emit_pattern_op (cairo_pattern_t *pattern, const char *fmt, ...) +{ + va_list ap; + + if (pattern == NULL || ! _write_lock ()) + return; + + _emit_pattern (pattern); + + va_start (ap, fmt); + _trace_vprintf (fmt, ap); + va_end (ap); + + _write_unlock (); +} + +cairo_pattern_t * +cairo_pattern_create_rgb (double red, double green, double blue) +{ + cairo_pattern_t *ret; + long pattern_id; + + _enter_trace (); + + ret = DLCALL (cairo_pattern_create_rgb, red, green, blue); + pattern_id = _create_pattern_id (ret); + + _emit_line_info (); + if (_write_lock ()) { + _trace_printf ("/p%ld %g %g %g rgb def\n", + pattern_id, red, green, blue); + _get_object (PATTERN, ret)->defined = TRUE; + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_pattern_t * +cairo_pattern_create_rgba (double red, double green, double blue, double alpha) +{ + cairo_pattern_t *ret; + long pattern_id; + + _enter_trace (); + + ret = DLCALL (cairo_pattern_create_rgba, red, green, blue, alpha); + pattern_id = _create_pattern_id (ret); + + _emit_line_info (); + if (_write_lock ()) { + _trace_printf ("/p%ld %g %g %g %g rgba def\n", + pattern_id, red, green, blue, alpha); + _get_object (PATTERN, ret)->defined = TRUE; + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_pattern_t * +cairo_pattern_create_for_surface (cairo_surface_t *surface) +{ + cairo_pattern_t *ret; + long pattern_id; + long surface_id; + + _enter_trace (); + + ret = DLCALL (cairo_pattern_create_for_surface, surface); + pattern_id = _create_pattern_id (ret); + + _emit_line_info (); + if (surface != NULL && _write_lock ()) { + surface_id = _get_surface_id (surface); + + if (_pop_operands_to (SURFACE, surface)) { + _consume_operand (false); + } else { + _trace_printf ("s%ld ", surface_id); + } + + if (_get_object (SURFACE, surface)->foreign) + _emit_source_image (surface); + + _trace_printf ("pattern %% p%ld\n", pattern_id); + _push_operand (PATTERN, ret); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_pattern_t * +cairo_pattern_create_linear (double x0, double y0, double x1, double y1) +{ + cairo_pattern_t *ret; + long pattern_id; + + _enter_trace (); + + ret = DLCALL (cairo_pattern_create_linear, x0, y0, x1, y1); + pattern_id = _create_pattern_id (ret); + + _emit_line_info (); + if (_write_lock ()) { + _trace_printf ("%g %g %g %g linear %% p%ld\n", + x0, y0, x1, y1, pattern_id); + _push_operand (PATTERN, ret); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_pattern_t * +cairo_pattern_create_radial (double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) +{ + cairo_pattern_t *ret; + long pattern_id; + + _enter_trace (); + + ret = DLCALL (cairo_pattern_create_radial, + cx0, cy0, radius0, + cx1, cy1, radius1); + pattern_id = _create_pattern_id (ret); + + _emit_line_info (); + if (_write_lock ()) { + _trace_printf ("%g %g %g %g %g %g radial %% p%ld\n", + cx0, cy0, radius0, cx1, cy1, radius1, + pattern_id); + _push_operand (PATTERN, ret); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +void +cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern, double offset, double red, double green, double blue) +{ + _enter_trace (); + _emit_line_info (); + _emit_pattern_op (pattern, + "%g %g %g %g 1 add-color-stop\n", + offset, red, green, blue); + DLCALL (cairo_pattern_add_color_stop_rgb, pattern, offset, red, green, blue); + _exit_trace (); +} + +void +cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern, double offset, double red, double green, double blue, double alpha) +{ + _enter_trace (); + _emit_line_info (); + _emit_pattern_op (pattern, + "%g %g %g %g %g add-color-stop\n", + offset, red, green, blue, alpha); + DLCALL (cairo_pattern_add_color_stop_rgba, pattern, offset, red, green, blue, alpha); + _exit_trace (); +} + +void +cairo_pattern_set_matrix (cairo_pattern_t *pattern, const cairo_matrix_t *matrix) +{ + _enter_trace (); + _emit_line_info (); + if (_matrix_is_identity (matrix)) { + _emit_pattern_op (pattern, "identity set-matrix\n"); + } else { + _emit_pattern_op (pattern, + "%g %g %g %g %g %g matrix set-matrix\n", + matrix->xx, matrix->yx, + matrix->xy, matrix->yy, + matrix->x0, matrix->y0); + } + DLCALL (cairo_pattern_set_matrix, pattern, matrix); + _exit_trace (); +} + +static const char * +_filter_to_string (cairo_filter_t filter) +{ +#define f(name) case CAIRO_FILTER_ ## name: return "FILTER_" #name + switch (filter) { + f(FAST); + f(GOOD); + f(BEST); + f(NEAREST); + f(BILINEAR); + f(GAUSSIAN); + }; +#undef f + return "UNKNOWN_FILTER"; +} + +void +cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter) +{ + _enter_trace (); + _emit_line_info (); + _emit_pattern_op (pattern, "//%s set-filter\n", _filter_to_string (filter)); + DLCALL (cairo_pattern_set_filter, pattern, filter); + _exit_trace (); +} + +static const char * +_extend_to_string (cairo_extend_t extend) +{ +#define f(name) case CAIRO_EXTEND_ ## name: return "EXTEND_" #name + switch (extend) { + f(NONE); + f(REPEAT); + f(REFLECT); + f(PAD); + }; +#undef f + return "UNKNOWN_EXTEND"; +} + +void +cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend) +{ + _enter_trace (); + _emit_line_info (); + _emit_pattern_op (pattern, "//%s set-extend\n", _extend_to_string (extend)); + DLCALL (cairo_pattern_set_extend, pattern, extend); + _exit_trace (); +} + +#if CAIRO_HAS_FT_FONT +#if CAIRO_HAS_FC_FONT +cairo_font_face_t * +cairo_ft_font_face_create_for_pattern (FcPattern *pattern) +{ + cairo_font_face_t *ret; + long font_face_id; + + _enter_trace (); + + ret = DLCALL (cairo_ft_font_face_create_for_pattern, pattern); + font_face_id = _create_font_face_id (ret); + + _emit_line_info (); + if (pattern != NULL && _write_lock ()) { + Object *obj; + + obj = _get_object (FONT_FACE, ret); + if (obj->unknown) { + FcPattern *copy; + FcChar8 *unparsed; + + copy = DLCALL (FcPatternDuplicate, pattern); + if (copy) + { + DLCALL (FcPatternDel, copy, FC_LANG); + DLCALL (FcPatternDel, copy, FC_CHARSET); + DLCALL (FcPatternDel, copy, FC_CAPABILITY); + } + else + copy = pattern; + + unparsed = DLCALL (FcNameUnparse, copy); + _trace_printf ("dict\n" + " /type 42 set\n" + " /pattern "); + _emit_string_literal ((char *) unparsed, -1); + _trace_printf (" set\n" + " font %% f%ld\n", + font_face_id); + obj->unknown = FALSE; + _push_operand (FONT_FACE, ret); + dump_stack(__func__); + + if (copy != pattern) + DLCALL (FcPatternDestroy, copy); + free (unparsed); + } + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif /* CAIRO_HAS_FC_FONT*/ + +typedef struct _ft_face_data { + unsigned long index; + unsigned long size; + void *data; +} FtFaceData; + +static void +_ft_face_data_destroy (void *arg) +{ + FtFaceData *data = arg; + free (data->data); + free (data); +} + +cairo_font_face_t * +cairo_ft_font_face_create_for_ft_face (FT_Face face, int load_flags) +{ + cairo_font_face_t *ret; + Object *obj; + FtFaceData *data; + long font_face_id; + + _enter_trace (); + + ret = DLCALL (cairo_ft_font_face_create_for_ft_face, face, load_flags); + font_face_id = _create_font_face_id (ret); + + if (face == NULL) { + _exit_trace (); + return ret; + } + + obj = _get_object (NONE, face); + data = obj->data; + if (data == NULL) { + _exit_trace (); + return ret; + } + + _emit_line_info (); + if (_write_lock ()) { + obj = _get_object (FONT_FACE, ret); + if (obj->operand != -1) + _object_remove (obj); + + _trace_printf ("<< /type 42 /source "); + _emit_data (data->data, data->size); + _trace_printf (" /index %lu /flags %d >> font %% f%ld\n", + data->index, load_flags, font_face_id); + _push_operand (FONT_FACE, ret); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +static cairo_bool_t +_ft_read_file (FtFaceData *data, const char *path) +{ + char buf[8192]; + FILE *file; + + file = fopen (path, "rb"); + if (file != NULL) { + size_t ret; + unsigned long int allocated = sizeof (buf); + data->data = malloc (allocated); + do { + ret = fread (buf, 1, sizeof (buf), file); + if (ret == 0) + break; + memcpy ((char *) data->data + data->size, buf, ret); + data->size += ret; + if (ret != sizeof (buf)) + break; + + if (data->size == allocated) { + allocated *= 2; + data->data = realloc (data->data, allocated); + } + } while (TRUE); + fclose (file); + } + + return file != NULL; +} + +FT_Error +FT_New_Face (FT_Library library, const char *pathname, FT_Long index, FT_Face *face) +{ + FT_Error ret; + + _enter_trace (); + + ret = DLCALL (FT_New_Face, library, pathname, index, face); + if (ret == 0) { + Object *obj = _type_object_create (NONE, *face); + FtFaceData *data = malloc (sizeof (FtFaceData)); + data->index = index; + data->size = 0; + data->data = NULL; + _ft_read_file (data, pathname); + obj->data = data; + obj->destroy = _ft_face_data_destroy; + } + + _exit_trace (); + return ret; +} + +FT_Error +FT_New_Memory_Face (FT_Library library, const FT_Byte *mem, FT_Long size, FT_Long index, FT_Face *face) +{ + FT_Error ret; + + _enter_trace (); + + ret = DLCALL (FT_New_Memory_Face, library, mem, size, index, face); + if (ret == 0) { + Object *obj = _type_object_create (NONE, *face); + FtFaceData *data = malloc (sizeof (FtFaceData)); + data->index = index; + data->size = size; + data->data = malloc (size); + memcpy (data->data, mem, size); + obj->data = data; + obj->destroy = _ft_face_data_destroy; + } + + _exit_trace (); + return ret; +} + +/* XXX + * FT_New_Memory_Face() and FT_New_Face() appear to wrap FT_Open_Face() so we + * get a redundant call to FT_Open_Face() from those paths (no PLT hiding + * within FT, naughty library!) but we do not intercept a direct call to + * FT_Open_Face(). So far this has not caused any issues, but it will one + * day... + */ +FT_Error +FT_Open_Face (FT_Library library, const FT_Open_Args *args, FT_Long index, FT_Face *face) +{ + FT_Error ret; + + _enter_trace (); + + ret = DLCALL (FT_Open_Face, library, args, index, face); + if (ret == 0) { + Object *obj = _get_object (NONE, *face); + if (obj == NULL) { + FtFaceData *data; + + data = malloc (sizeof (FtFaceData)); + data->index = index; + if (args->flags & FT_OPEN_MEMORY) { + data->size = args->memory_size; + data->data = malloc (args->memory_size); + memcpy (data->data, args->memory_base, args->memory_size); + } else if (args->flags & FT_OPEN_STREAM) { + fprintf (stderr, "FT_Open_Face (stream, %ld) = %p\n", + index, *face); + abort (); + } else if (args->flags & FT_OPEN_PATHNAME) { + data->size = 0; + data->data = NULL; + _ft_read_file (data, args->pathname); + } + + obj = _type_object_create (NONE, *face); + obj->data = data; + obj->destroy = _ft_face_data_destroy; + } + } + + _exit_trace (); + return ret; +} + +FT_Error +FT_Done_Face (FT_Face face) +{ + FT_Error ret; + _enter_trace (); + + _object_destroy (_get_object (NONE, face)); + + ret = DLCALL (FT_Done_Face, face); + _exit_trace (); + return ret; +} +#endif + +static void +_surface_object_set_size (cairo_surface_t *surface, int width, int height) +{ + Object *obj; + + obj = _get_object (SURFACE, surface); + obj->width = width; + obj->height = height; +} + +static void +_surface_object_set_size_from_surface (cairo_surface_t *surface) +{ + _surface_object_set_size (surface, + DLCALL (cairo_image_surface_get_width, surface), + DLCALL (cairo_image_surface_get_height, surface)); +} + +#if CAIRO_HAS_PS_SURFACE +#include + +cairo_surface_t * +cairo_ps_surface_create (const char *filename, double width_in_points, double height_in_points) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_ps_surface_create, filename, width_in_points, height_in_points); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /PS set\n" + " /filename "); + _emit_string_literal (filename, -1); + _trace_printf (" set\n" + " /width %g set\n" + " /height %g set\n" + " surface %% s%ld\n", + width_in_points, + height_in_points, + obj->token); + obj->width = width_in_points; + obj->height = height_in_points; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_ps_surface_create_for_stream, write_func, closure, width_in_points, height_in_points); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /PS set\n" + " /width %g set\n" + " /height %g set\n" + " surface %% s%ld\n", + width_in_points, + height_in_points, + obj->token); + obj->width = width_in_points; + obj->height = height_in_points; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +void +cairo_ps_surface_set_size (cairo_surface_t *surface, double width_in_points, double height_in_points) +{ + _enter_trace (); + _emit_line_info (); + DLCALL (cairo_ps_surface_set_size, surface, width_in_points, height_in_points); + _exit_trace (); +} + +#endif + +#if CAIRO_HAS_PDF_SURFACE +#include + +cairo_surface_t * +cairo_pdf_surface_create (const char *filename, double width_in_points, double height_in_points) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_pdf_surface_create, filename, width_in_points, height_in_points); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /PDF set\n" + " /filename "); + _emit_string_literal (filename, -1); + _trace_printf (" set\n" + " /width %g set\n" + " /height %g set\n" + " surface %% s%ld\n", + width_in_points, + height_in_points, + obj->token); + obj->width = width_in_points; + obj->height = height_in_points; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_pdf_surface_create_for_stream, write_func, closure, width_in_points, height_in_points); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /PDF set\n" + " /width %g set\n" + " /height %g set\n" + " surface %% s%ld\n", + width_in_points, + height_in_points, + obj->token); + obj->width = width_in_points; + obj->height = height_in_points; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + _exit_trace (); + return ret; +} + +void +cairo_pdf_surface_set_size (cairo_surface_t *surface, double width_in_points, double height_in_points) +{ + _enter_trace (); + _emit_line_info (); + DLCALL (cairo_pdf_surface_set_size, surface, width_in_points, height_in_points); + _exit_trace (); +} +#endif + +#if CAIRO_HAS_SVG_SURFACE +#include + +cairo_surface_t * +cairo_svg_surface_create (const char *filename, double width, double height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_svg_surface_create, filename, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /SVG set\n" + " /filename "); + _emit_string_literal (filename, -1); + _trace_printf (" set\n" + " /width %g set\n" + " /height %g set\n" + " surface %% s%ld\n", + width, + height, + obj->token); + obj->width = width; + obj->height = height; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width, double height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_svg_surface_create_for_stream, write_func, closure, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /SVG set\n" + " /width %g set\n" + " /height %g set\n" + " surface %% s%ld\n", + width, + height, + obj->token); + obj->width = width; + obj->height = height; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#endif + +#if CAIRO_HAS_PNG_FUNCTIONS +cairo_surface_t * +cairo_image_surface_create_from_png (const char *filename) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_image_surface_create_from_png, filename); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + char filename_string[4096]; + + _encode_string_literal (filename_string, sizeof (filename_string), + filename, -1); + _emit_image (ret, " /filename %s set\n", filename_string); + _trace_printf (" dup /s%ld exch def\n", obj->token); + _surface_object_set_size_from_surface (ret); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, void *closure) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_image_surface_create_from_png_stream, read_func, closure); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _emit_image (ret, NULL); + _trace_printf (" dup /s%ld exch def\n", + obj->token); + + _surface_object_set_size_from_surface (ret); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif + +static const char * +_content_from_surface (cairo_surface_t *surface) +{ + return _content_to_string (DLCALL (cairo_surface_get_content, surface)); +} + +#if CAIRO_HAS_TEE_SURFACE +#include + +cairo_surface_t * +cairo_tee_surface_create (cairo_surface_t *master) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_tee_surface_create, master); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /tee set\n" + " /master s%ld set\n" + " surface dup /s%ld exch def\n", + _get_object (SURFACE, master)->token, + obj->token); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#endif + +#if CAIRO_HAS_XLIB_SURFACE +#include + +cairo_surface_t * +cairo_xlib_surface_create (Display *dpy, + Drawable drawable, + Visual *visual, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_xlib_surface_create, + dpy, drawable, visual, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /xlib set\n" + " /drawable 16!%lx set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + drawable, + _content_from_surface (ret), + width, height, + obj->token); + obj->defined = TRUE; + obj->width = width; + obj->height = height; + obj->foreign = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_xlib_surface_create_for_bitmap (Display *dpy, + Pixmap bitmap, + Screen *screen, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_xlib_surface_create_for_bitmap, + dpy, bitmap, screen, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /xlib set\n" + " /drawable 16!%lx set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " /depth 1 set\n" + " surface dup /s%ld exch def\n", + bitmap, + _content_from_surface (ret), + width, height, + obj->token); + obj->defined = TRUE; + obj->width = width; + obj->height = height; + obj->foreign = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#if CAIRO_HAS_XLIB_XRENDER_SURFACE +#include +cairo_surface_t * +cairo_xlib_surface_create_with_xrender_format (Display *dpy, + Drawable drawable, + Screen *screen, + XRenderPictFormat *format, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_xlib_surface_create_with_xrender_format, + dpy, drawable, screen, format, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /xrender set\n" + " /drawable 16!%lx set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " /depth %d set\n" + " surface dup /s%ld exch def\n", + drawable, + _content_from_surface (ret), + width, height, + format->depth, + obj->token); + obj->defined = TRUE; + obj->width = width; + obj->height = height; + obj->foreign = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif +#endif + +#if CAIRO_HAS_SCRIPT_SURFACE +#include +cairo_surface_t * +cairo_script_surface_create (cairo_device_t *device, + cairo_content_t content, + double width, + double height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_script_surface_create, device, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /script set\n" + " /content %s set\n" + " /width %g set\n" + " /height %g set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_script_surface_create_for_target (cairo_device_t *device, + cairo_surface_t *target) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_script_surface_create_for_target, device, target); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /script set\n" + " surface dup /s%ld exch def\n", + obj->token); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif + +#if CAIRO_HAS_TEST_SURFACES +#include +cairo_surface_t * +_cairo_test_paginated_surface_create (cairo_surface_t *surface) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (_cairo_test_paginated_surface_create, surface); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + /* XXX store initial data? */ + _trace_printf ("dict\n" + " /type /test-paginated set\n" + " /target s%ld set\n" + " surface dup /s%ld exch def\n", + _get_surface_id (surface), + obj->token); + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#include + +cairo_surface_t * +_cairo_test_fallback_compositor_surface_create (cairo_content_t content, int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (_cairo_test_fallback_compositor_surface_create, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /test-fallback-compositor set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +_cairo_test_mask_compositor_surface_create (cairo_content_t content, int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (_cairo_test_mask_compositor_surface_create, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /test-mask-compositor set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +_cairo_test_spans_compositor_surface_create (cairo_content_t content, int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (_cairo_test_spans_compositor_surface_create, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /test-spans-compositor set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +_cairo_test_traps_compositor_surface_create (cairo_content_t content, int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (_cairo_test_traps_compositor_surface_create, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /test-traps-compositor set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#endif + +cairo_surface_t * +cairo_recording_surface_create (cairo_content_t content, + const cairo_rectangle_t *extents) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_recording_surface_create, content, extents); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + if (extents) { + _trace_printf ("//%s [ %f %f %f %f ] record dup /s%ld exch def\n", + _content_to_string (content), + extents->x, extents->y, + extents->width, extents->height, + obj->token); + obj->width = extents->width; + obj->height = extents->height; + } else { + _trace_printf ("//%s [ ] record dup /s%ld exch def\n", + _content_to_string (content), + obj->token); + } + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#if CAIRO_HAS_VG_SURFACE +#include +cairo_surface_t * +cairo_vg_surface_create (cairo_vg_context_t *context, + cairo_content_t content, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_vg_surface_create, context, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /vg set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_vg_surface_create_for_image (cairo_vg_context_t *context, + VGImage image, + VGImageFormat format, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_vg_surface_create_for_image, + context, image, format, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + cairo_content_t content; + + content = DLCALL (cairo_surface_get_content, ret); + _trace_printf ("dict\n" + " /type /vg set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif + +#if CAIRO_HAS_GL_SURFACE || CAIRO_HAS_GLESV2_SURFACE +#include +cairo_surface_t * +cairo_gl_surface_create (cairo_device_t *abstract_device, + cairo_content_t content, + int width, + int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_gl_surface_create, abstract_device, content, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /gl set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +cairo_surface_t * +cairo_gl_surface_create_for_texture (cairo_device_t *abstract_device, + cairo_content_t content, + unsigned int tex, + int width, + int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_gl_surface_create_for_texture, abstract_device, content, tex, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /gl set\n" + " /content //%s set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + _content_to_string (content), + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} + +#if CAIRO_HAS_GLX_FUNCTIONS +cairo_surface_t * +cairo_gl_surface_create_for_window (cairo_device_t *device, + Window win, + int width, int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_gl_surface_create_for_window, device, win, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /gl set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif + +#if CAIRO_HAS_WGL_FUNCTIONS +cairo_surface_t * +cairo_gl_surface_create_for_dc (cairo_device_t *device, + HDC dc, + int width, + int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_gl_surface_create_for_dc, device, dc, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /gl set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif + +#if CAIRO_HAS_EGL_FUNCTIONS +cairo_surface_t * +cairo_gl_surface_create_for_egl (cairo_device_t *device, + EGLSurface egl, + int width, + int height) +{ + cairo_surface_t *ret; + + _enter_trace (); + + ret = DLCALL (cairo_gl_surface_create_for_egl, device, egl, width, height); + + _emit_line_info (); + if (_write_lock ()) { + Object *obj = _create_surface (ret); + + _trace_printf ("dict\n" + " /type /gl set\n" + " /width %d set\n" + " /height %d set\n" + " surface dup /s%ld exch def\n", + width, height, + obj->token); + obj->width = width; + obj->height = height; + obj->defined = TRUE; + _push_object (obj); + dump_stack(__func__); + _write_unlock (); + } + + _exit_trace (); + return ret; +} +#endif +#endif diff --git a/util/cairo-view b/util/cairo-view new file mode 100755 index 000000000..2bbed6985 --- /dev/null +++ b/util/cairo-view @@ -0,0 +1,113 @@ +#!/usr/bin/python + +import sys +import cairo +import pygtk +pygtk.require('2.0') +import gtk +import gtk.gdk +import pango +import gobject + +class CairoView(gtk.Window): + def __init__(self, family="", slant=0, weight=0, size=18, text="The Quick Brown Fox Jumps Over The Lazy Dog!"): + gtk.Widget.__init__ (self) + + self.family = family + if slant == "italic": + self.slant = cairo.FONT_SLANT_ITALIC + elif slant == "oblique": + self.slant = cairo.FONT_SLANT_OBLIQUE + else: + self.slant = cairo.FONT_SLANT_NORMAL + if weight == "bold": + self.weight = cairo.FONT_WEIGHT_BOLD + else: + self.weight = cairo.FONT_WEIGHT_NORMAL + self.size = float (size) + self.text = text + + def do_realize(self): + self.set_flags(self.flags() | gtk.REALIZED) + + self.window = gtk.gdk.Window( + self.get_parent_window(), + width=self.allocation.width, + height=self.allocation.height, + window_type=gtk.gdk.WINDOW_CHILD, + wclass=gtk.gdk.INPUT_OUTPUT, + event_mask=self.get_events() | gtk.gdk.EXPOSURE_MASK) + + self.window.set_user_data(self) + + self.style.attach(self.window) + + self.style.set_background(self.window, gtk.STATE_NORMAL) + + self.width, self.height = self.draw () + self.window.move_resize(0, 0, self.width, self.height) + + def do_unrealize(self): + self.window.destroy() + + def do_expose_event(self, event): + self.draw (event) + + return False + + def draw(self, event = None): + + cr = self.window.cairo_create() + if event: + cr.rectangle(event.area.x, event.area.y, + event.area.width, event.area.height) + cr.clip() + + cr.set_source_rgb (1, 1, 1) + cr.paint () + + cr.select_font_face (self.family, self.slant, self.weight) + cr.set_font_size (self.size) + + PAD = 30 + + extents = cr.text_extents (self.text) + cr.translate (PAD-extents[0], PAD-extents[1]) + + font_extents = cr.font_extents () + cr.rectangle (0, -font_extents[0], extents[4], font_extents[2]) + cr.move_to (-PAD, 0) + cr.line_to (extents[2]+PAD, 0) + cr.set_source_rgba (1, 0, 0, .7) + cr.stroke () + + cr.rectangle (*extents[:4]) + cr.set_source_rgba (0, 1, 0, .7) + cr.stroke () + + cr.move_to (0, 0) + cr.set_source_rgb (0, 0, 0) + cr.show_text (self.text) + + return int (extents[2]) + 2 * PAD, int (extents[3]) + 2 * PAD + + def run(self): + + self.props.allow_shrink = True + self.connect("destroy", gtk.main_quit) + self.show() + + gtk.main() + +gobject.type_register(CairoView) + +def main(args): + + if len (args) == 1: + print "usage: cairo-view family [slant [weight [size [text]]]]" + sys.exit (1) + cv= CairoView (*args[1:]) + cv.run() + +if __name__ == "__main__": + main(sys.argv) diff --git a/util/font-view.c b/util/font-view.c new file mode 100644 index 000000000..07d9e2e9d --- /dev/null +++ b/util/font-view.c @@ -0,0 +1,184 @@ +/* + * Copyright © 2008 Behdad Esfahbod + * Copyright © 2009 Chris Wilson + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Chris Wilson not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Chris Wilson makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Chris Wilson + */ + +#include +#include + +struct options { + const char *text; + const char *family; + cairo_font_weight_t weight; + cairo_font_slant_t slant; + double size; + int PAD; + const char *png; +}; + +static void +draw (cairo_t *cr, struct options *options) +{ + cairo_text_extents_t extents; + cairo_font_extents_t font_extents; + + cairo_select_font_face (cr, + options->family, options->slant, options->weight); + cairo_set_font_size (cr, options->size); + + cairo_text_extents (cr, options->text, &extents); + cairo_translate (cr, + options->PAD - extents.x_bearing, + options->PAD - extents.y_bearing); + + cairo_font_extents (cr, &font_extents); + cairo_rectangle (cr, 0, -font_extents.ascent, + extents.x_advance, font_extents.height); + cairo_move_to (cr, -options->PAD, 0); + cairo_line_to (cr, extents.width + options->PAD, 0); + cairo_set_source_rgba (cr, 1, 0, 0, .7); + cairo_stroke (cr); + + cairo_rectangle (cr, + extents.x_bearing, extents.y_bearing, + extents.width, extents.height); + cairo_set_source_rgba (cr, 0, 1, 0, .7); + cairo_stroke (cr); + + cairo_move_to (cr, 0, 0); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_show_text (cr, options->text); + cairo_fill (cr); +} + +static gboolean +expose_event (GtkWidget *w, GdkEventExpose *ev, struct options *options) +{ + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + draw (cr, options); + + cairo_destroy (cr); + + if (options->png) { + cairo_surface_t *image; + + image = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + w->allocation.width, + w->allocation.height); + cr = cairo_create (image); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + draw (cr, options); + + cairo_destroy (cr); + cairo_surface_write_to_png (image, options->png); + cairo_surface_destroy (image); + } + + return TRUE; +} + +static void +size_request (GtkWidget *w, GtkRequisition *req , struct options *options) +{ + cairo_surface_t *dummy; + cairo_t *cr; + cairo_text_extents_t extents; + + dummy = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 0, 0); + cr = cairo_create (dummy); + cairo_surface_destroy (dummy); + + cairo_select_font_face (cr, + options->family, options->slant, options->weight); + cairo_set_font_size (cr, options->size); + + cairo_text_extents (cr, options->text, &extents); + cairo_destroy (cr); + + req->width = extents.width + 2 * options->PAD; + req->height = extents.height + 2 * options->PAD; +} + +int +main (int argc, char **argv) +{ + GtkWidget *window; + struct options options = { + "The Quick Brown Fox Jumps Over The Lazy Dog!", + "@cairo:small-caps", + CAIRO_FONT_WEIGHT_NORMAL, + CAIRO_FONT_SLANT_NORMAL, + 48, + 30, + "font-view.png" + }; + + gtk_init (&argc, &argv); + + /* rudimentary argument processing */ + if (argc >= 2) { + options.family = argv[1]; + } + if (argc >= 3) { + if (strcmp (argv[2], "italic") == 0) + options.slant = CAIRO_FONT_SLANT_ITALIC; + else if (strcmp (argv[2], "oblique") == 0) + options.slant = CAIRO_FONT_SLANT_OBLIQUE; + else + options.slant = atoi (argv[2]); + } + if (argc >= 4) { + if (strcmp (argv[3], "bold") == 0) + options.weight = CAIRO_FONT_WEIGHT_BOLD; + else + options.weight = atoi (argv[3]); + } + if (argc >= 5) { + options.size = atof (argv[4]); + } + if (argc >= 6) { + options.text = argv[5]; + } + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "size-request", + G_CALLBACK (size_request), &options); + g_signal_connect (window, "expose-event", + G_CALLBACK (expose_event), &options); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + + gtk_window_present (GTK_WINDOW (window)); + gtk_main (); + + return 0; +} diff --git a/util/malloc-stats.c b/util/malloc-stats.c new file mode 100644 index 000000000..55ed51cad --- /dev/null +++ b/util/malloc-stats.c @@ -0,0 +1,368 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright © 2007 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Behdad Esfahbod + */ + +/* A simple malloc wrapper that prints out statistics on termination */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include + +/* caller-logging */ + +#include + +struct alloc_stat_t { + unsigned int num; + unsigned long long size; +}; + +struct alloc_stats_t { + struct alloc_stat_t malloc, realloc, total; +}; + +struct func_stat_t { + struct func_stat_t *next; + + const void *addr; + const char *name; + + struct alloc_stats_t stat; +}; + +static struct alloc_stats_t total_allocations; +static struct func_stat_t *func_stats[31627]; +static int func_stats_num; + +#ifndef ARRAY_LENGTH +#define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) +#endif +static void +alloc_stats_add (struct alloc_stats_t *stats, int is_realloc, size_t size) +{ + struct alloc_stat_t *stat = is_realloc ? &stats->realloc : &stats->malloc; + + stats->total.num++; + stats->total.size += size; + + stat->num++; + stat->size += size; +} + +#include + +static void * +_perm_alloc (size_t size) +{ + static uint8_t *ptr; + static size_t rem; + + void *ret; + +#define SUPERBLOCK_SIZE (1<<23) +#define align(x, y) (((x) + ((y)-1)) & ~((y)-1)) + + size = align (size, 2 * sizeof (void *)); + if (size > rem || rem == 0) { + ptr = malloc (SUPERBLOCK_SIZE); + if (ptr == NULL) + exit (1); + rem = SUPERBLOCK_SIZE; + } + +#undef SUPERBLOCK_SIZE +#undef align + + ret = ptr; + rem -= size; + ptr += size; + + return ret; +} + +static void +resolve_addrs (struct func_stat_t *func_stats, int num) +{ + int i; + void **addrs; + char **strings; + + addrs = malloc (num * sizeof (void *)); + for (i = 0; i < num; i++) + addrs[i] = (void *) func_stats[i].addr; + + strings = backtrace_symbols (addrs, num); + + for (i = 0; i < num; i++) { + char *p; + char *name; + int len; + + p = strchr (strings[i], '\t'); + if (p) + p++; + else + p = strings[i]; + + len = strlen (p) + 1; + name = _perm_alloc (len); + memcpy (name, p, len); + func_stats[i].name = name; + } + + free (strings); + free (addrs); +} + +static void +func_stats_add (const void *caller, int is_realloc, size_t size) +{ + int i; + struct func_stat_t *elt; + + alloc_stats_add (&total_allocations, is_realloc, size); + + i = ((uintptr_t) caller ^ 1215497) % ARRAY_LENGTH (func_stats); + for (elt = func_stats[i]; elt != NULL; elt = elt->next) { + if (elt->addr == caller) + break; + } + + if (elt == NULL) { + func_stats_num++; + + elt = _perm_alloc (sizeof (struct func_stat_t)); + elt->next = func_stats[i]; + func_stats[i] = elt; + elt->addr = caller; + elt->name = NULL; + memset (&elt->stat, 0, sizeof (struct alloc_stats_t)); + } + + alloc_stats_add (&elt->stat, is_realloc, size); +} + +/* wrapper stuff */ + +#include + +static void *(*old_malloc)(size_t, const void *); +static void *(*old_realloc)(void *, size_t, const void *); + +static void *my_malloc(size_t, const void *); +static void *my_realloc(void *, size_t, const void *); + +static void +save_hooks (void) +{ + old_malloc = __malloc_hook; + old_realloc = __realloc_hook; +} + +static void +old_hooks (void) +{ + __malloc_hook = old_malloc; + __realloc_hook = old_realloc; +} + +static void +my_hooks (void) +{ + /* should always save the current value */ + save_hooks (); + + __malloc_hook = my_malloc; + __realloc_hook = my_realloc; +} + +static void * +my_malloc(size_t size, const void *caller) +{ + void *ret; + + old_hooks (); + + func_stats_add (caller, 0, size); + + ret = malloc (size); + my_hooks (); + + return ret; +} + +static void * +my_realloc(void *ptr, size_t size, const void *caller) +{ + void *ret; + + old_hooks (); + + func_stats_add (caller, 1, size); + + ret = realloc (ptr, size); + my_hooks (); + + return ret; +} + +static void +my_init_hook(void) { + my_hooks (); +} + +void (*__volatile __malloc_initialize_hook) (void) = my_init_hook; + + +/* reporting */ + +#include + +static void +add_alloc_stats (struct alloc_stats_t *a, struct alloc_stats_t *b) +{ + a->total.num += b->total.num; + a->total.size += b->total.size; + a->malloc.num += b->malloc.num; + a->malloc.size += b->malloc.size; + a->realloc.num += b->realloc.num; + a->realloc.size += b->realloc.size; +} + +static void +dump_alloc_stats (struct alloc_stats_t *stats, const char *name) +{ + printf ("%8u %'11llu %8u %'11llu %8u %'11llu %s\n", + stats->total.num, stats->total.size, + stats->malloc.num, stats->malloc.size, + stats->realloc.num, stats->realloc.size, + name); +} + +static int +compare_func_stats_name (const void *pa, const void *pb) +{ + const struct func_stat_t *a = pa, *b = pb; + int i; + + i = strcmp (a->name, b->name); + if (i) + return i; + + return ((char *) a->addr - (char *) b->addr); +} + +static int +compare_func_stats (const void *pa, const void *pb) +{ + const struct func_stat_t *a = pa, *b = pb; + + if (a->stat.total.num != b->stat.total.num) + return (a->stat.total.num - b->stat.total.num); + + if (a->stat.total.size != b->stat.total.size) + return (a->stat.total.size - b->stat.total.size); + + return compare_func_stats_name (pa, pb); +} + +static int +merge_similar_entries (struct func_stat_t *func_stats, int num) +{ + int i, j; + + j = 0; + for (i = 1; i < num; i++) { + if (i != j && 0 == strcmp (func_stats[i].name, func_stats[j].name)) { + add_alloc_stats (&func_stats[j].stat, &func_stats[i].stat); + } else { + j++; + if (i != j) + func_stats[j] = func_stats[i]; + } + } + j++; + + return j; +} + +__attribute__ ((destructor)) +void +malloc_stats (void) +{ + unsigned int i, j; + struct func_stat_t *sorted_func_stats; + + old_hooks (); + + if (! func_stats_num) + return; + + sorted_func_stats = malloc (sizeof (struct func_stat_t) * (func_stats_num + 1)); + if (sorted_func_stats == NULL) + return; + + j = 0; + for (i = 0; i < ARRAY_LENGTH (func_stats); i++) { + struct func_stat_t *elt; + for (elt = func_stats[i]; elt != NULL; elt = elt->next) + sorted_func_stats[j++] = *elt; + } + + resolve_addrs (sorted_func_stats, j); + + /* merge entries with same name */ + qsort (sorted_func_stats, j, + sizeof (struct func_stat_t), compare_func_stats_name); + j = merge_similar_entries (sorted_func_stats, j); + + qsort (sorted_func_stats, j, + sizeof (struct func_stat_t), compare_func_stats); + + /* add total */ + sorted_func_stats[j].next = NULL; + sorted_func_stats[j].addr = (void *) -1; + sorted_func_stats[j].name = "(total)"; + sorted_func_stats[j].stat = total_allocations; + j++; + + setlocale (LC_ALL, ""); + + printf (" TOTAL MALLOC REALLOC\n"); + printf (" num size num size num size\n"); + + for (i = 0; i < j; i++) { + dump_alloc_stats (&sorted_func_stats[i].stat, + sorted_func_stats[i].name); + } + + /* XXX free other stuff? */ + + free (sorted_func_stats); +} diff --git a/util/show-contour.c b/util/show-contour.c new file mode 100644 index 000000000..f3fa1babf --- /dev/null +++ b/util/show-contour.c @@ -0,0 +1,667 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +typedef struct _point { + gdouble x, y; +} point_t; +typedef struct _box { + point_t p1, p2; +} box_t; + +typedef struct _contour { + struct _contour *next, *prev; + int direction; + int num_points; + int size; + point_t points[0]; +} contour_t; + +typedef struct _TrapView { + GtkWidget widget; + + cairo_surface_t *pixmap; + int pixmap_width, pixmap_height; + + box_t extents; + contour_t *contours; + + double px, py; + + gint mag_x, mag_y; + gint mag_size; + gdouble mag_zoom; + gboolean in_mag_drag; + gint mag_drag_x, mag_drag_y; +} TrapView; + +typedef struct _TrapViewClass { + GtkWidgetClass parent_class; +} TrapViewClass; + +G_DEFINE_TYPE (TrapView, trap_view, GTK_TYPE_WIDGET) + +static cairo_surface_t * +pixmap_create (TrapView *self, cairo_surface_t *target) +{ + cairo_surface_t *surface = + cairo_surface_create_similar (target, CAIRO_CONTENT_COLOR, + self->widget.allocation.width, + self->widget.allocation.height); + cairo_t *cr = cairo_create (surface); + contour_t *contour; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, y0; + int n; + box_t extents; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + if (self->contours == NULL) { + cairo_destroy(cr); + return surface; + } + + extents = self->extents; + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + + for (contour = self->contours; contour; contour = contour->next) { + if (contour->num_points == 0) + continue; + + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + switch (contour->direction) { + case -1: + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + break; + case 0: + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + break; + case 1: + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + break; + } + { + const point_t *p = &contour->points[0]; + cairo_arc (cr, p->x, p->y, 4/sf, 0, 2 * M_PI); + cairo_save (cr); + cairo_identity_matrix (cr); + cairo_stroke (cr); + cairo_restore (cr); + } + for (n = 0; n < contour->num_points; n++) { + const point_t *p = &contour->points[n]; + cairo_arc (cr, p->x, p->y, 2/sf, 0, 2 * M_PI); + cairo_fill (cr); + } + for (n = 0; n < contour->num_points; n++) { + const point_t *p = &contour->points[n]; + cairo_line_to (cr, p->x, p->y); + } + } cairo_restore (cr); + + switch (contour->direction) { + case -1: + cairo_set_source_rgb (cr, 0.3, 0.3, 0.9); + break; + case 0: + cairo_set_source_rgb (cr, 0.3, 0.9, 0.3); + break; + case 1: + cairo_set_source_rgb (cr, 0.9, 0.3, 0.3); + break; + } + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } + + cairo_destroy (cr); + return surface; +} + +static void +trap_view_draw (TrapView *self, cairo_t *cr) +{ + contour_t *contour; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, y0; + int n; + box_t extents; + + extents = self->extents; + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + + if (self->pixmap_width != self->widget.allocation.width || + self->pixmap_height != self->widget.allocation.height) + { + cairo_surface_destroy (self->pixmap); + self->pixmap = pixmap_create (self, cairo_get_target (cr)); + self->pixmap_width = self->widget.allocation.width; + self->pixmap_height = self->widget.allocation.height; + } + + cairo_set_source_surface (cr, self->pixmap, 0, 0); + cairo_paint (cr); + + if (self->contours == NULL) + return; + + /* draw a zoom view of the area around the mouse */ + if (1) { + double zoom = self->mag_zoom; + int size = self->mag_size; + int mag_x = self->mag_x; + int mag_y = self->mag_y; + + if (1) { + if (self->px + size < self->widget.allocation.width/2) + mag_x = self->px + size/4; + else + mag_x = self->px - size/4 - size; + mag_y = self->py - size/2; + if (mag_y < 0) + mag_y = 0; + if (mag_y + size > self->widget.allocation.height) + mag_y = self->widget.allocation.height - size; + } + + cairo_save (cr); { + /* bottom right */ + cairo_rectangle (cr, mag_x, mag_y, size, size); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_fill_preserve (cr); + cairo_clip (cr); + + /* compute roi in extents */ + cairo_translate (cr, mag_x + size/2, mag_y + size/2); + + cairo_save (cr); { + for (contour = self->contours; contour; contour = contour->next) { + if (contour->num_points == 0) + continue; + + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + switch (contour->direction) { + case -1: + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + break; + case 0: + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); + break; + case 1: + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + break; + } + { + const point_t *p = &contour->points[0]; + cairo_arc (cr, p->x, p->y, 4/zoom, 0, 2 * M_PI); + cairo_save (cr); + cairo_identity_matrix (cr); + cairo_stroke (cr); + cairo_restore (cr); + } + for (n = 0; n < contour->num_points; n++) { + const point_t *p = &contour->points[n]; + cairo_arc (cr, p->x, p->y, 2/zoom, 0, 2 * M_PI); + cairo_fill (cr); + } + for (n = 0; n < contour->num_points; n++) { + const point_t *p = &contour->points[n]; + cairo_line_to (cr, p->x, p->y); + } + } cairo_restore (cr); + + switch (contour->direction) { + case -1: + cairo_set_source_rgb (cr, 0.3, 0.3, 0.9); + break; + case 0: + cairo_set_source_rgb (cr, 0.3, 0.9, 0.3); + break; + case 1: + cairo_set_source_rgb (cr, 0.9, 0.3, 0.3); + break; + } + cairo_stroke (cr); + } + } cairo_restore (cr); + + /* grid */ + cairo_save (cr); { + int i; + + cairo_translate (cr, + -zoom*fmod (self->px/sf + x0, 1.), + -zoom*fmod (self->py/sf + y0, 1.)); + zoom /= 2; + for (i = -size/2/zoom; i <= size/2/zoom + 1; i+=2) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + zoom *= 2; + cairo_set_source_rgba (cr, .7, .7, .7, .5); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + for (i = -size/2/zoom - 1; i <= size/2/zoom + 1; i++) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + cairo_set_source_rgba (cr, .1, .1, .1, .5); + cairo_set_line_width (cr, 2.); + cairo_stroke (cr); + } cairo_restore (cr); + + } cairo_restore (cr); + } +} + + +static gdouble +edge_length (const point_t *p1, const point_t *p2) +{ + return hypot (p2->x - p1->x, p2->y - p1->y); +} + +static gdouble +contour_compute_total_length (const contour_t *contour) +{ + int n; + gdouble len = 0.; + for (n = 1; n < contour->num_points; n++) + len += edge_length (&contour->points[n-1], &contour->points[n]); + return len; +} + +static void +trap_view_draw_labels (TrapView *self, cairo_t *cr) +{ + contour_t *contour; + int y = 12; + + for (contour = self->contours; contour; contour = contour->next) { + double total_length = contour_compute_total_length (contour) / 256.; + PangoLayout *layout; + gint width, height; + GString *string; + gchar *str; + + if (contour->num_points == 0) + continue; + + string = g_string_new (NULL); + g_string_append_printf (string, + "Number of points:\t%d\n" + "Total length of contour: \t%.2f", + contour->num_points, + total_length); + + str = g_string_free (string, FALSE); + layout = gtk_widget_create_pango_layout (&self->widget, str); + g_free (str); + + pango_layout_get_pixel_size (layout, &width, &height); + + switch (contour->direction) { + case -1: + cairo_set_source_rgb (cr, 0.9, 0.3, 0.3); + break; + case 0: + cairo_set_source_rgb (cr, 0.3, 0.9, 0.3); + break; + case 1: + cairo_set_source_rgb (cr, 0.3, 0.3, 0.9); + break; + } + + cairo_move_to (cr, 10, y); + pango_cairo_show_layout (cr, layout); + g_object_unref (layout); + + y += height + 4; + } +} + +static gboolean +trap_view_expose (GtkWidget *w, GdkEventExpose *ev) +{ + TrapView *self = (TrapView *) w; + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + gdk_cairo_region (cr, ev->region); + cairo_clip (cr); + + trap_view_draw (self, cr); + trap_view_draw_labels (self, cr); + + cairo_destroy (cr); + return FALSE; +} + +static gboolean +trap_view_key_press (GtkWidget *w, GdkEventKey *ev) +{ + switch (ev->keyval) { + case GDK_Escape: + case GDK_Q: + gtk_main_quit (); + break; + } + + return FALSE; +} + +static gboolean +trap_view_button_press (GtkWidget *w, GdkEventButton *ev) +{ + TrapView *self = (TrapView *) w; + + if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + } + else + { + self->in_mag_drag = TRUE; + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } + + return FALSE; +} + +static gboolean +trap_view_button_release (GtkWidget *w, GdkEventButton *ev) +{ + TrapView *self = (TrapView *) w; + + self->in_mag_drag = FALSE; + + return FALSE; +} + +static void +trap_view_update_mouse (TrapView *self, GdkEventMotion *ev) +{ + self->px = ev->x; + self->py = ev->y; + + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_update_magnifier (TrapView *self, gint *xy) +{ + self->mag_x = xy[0]; + self->mag_y = xy[1]; + + gtk_widget_queue_draw (&self->widget); +} + +static gboolean +trap_view_motion (GtkWidget *w, GdkEventMotion *ev) +{ + TrapView *self = (TrapView *) w; + + if (self->in_mag_drag) { + int xy[2]; + + xy[0] = self->mag_x + ev->x - self->mag_drag_x; + xy[1] = self->mag_y + ev->y - self->mag_drag_y; + + trap_view_update_magnifier (self, xy); + + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } else if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + trap_view_update_mouse (self, ev); + } + + return FALSE; +} + +static void +trap_view_realize (GtkWidget *widget) +{ + GdkWindowAttr attributes; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_EXPOSURE_MASK; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_VISUAL | GDK_WA_COLORMAP); + gdk_window_set_user_data (widget->window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); +} + +static void +trap_view_size_allocate (GtkWidget *w, GdkRectangle *r) +{ + TrapView *self = (TrapView *) w; + + GTK_WIDGET_CLASS (trap_view_parent_class)->size_allocate (w, r); + + self->mag_x = w->allocation.width - self->mag_size - 10; + self->mag_y = w->allocation.height - self->mag_size - 10; +} + +static void +trap_view_finalize (GObject *obj) +{ + G_OBJECT_CLASS (trap_view_parent_class)->finalize (obj); +} + +static void +trap_view_class_init (TrapViewClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + object_class->finalize = trap_view_finalize; + + widget_class->realize = trap_view_realize; + widget_class->size_allocate = trap_view_size_allocate; + widget_class->expose_event = trap_view_expose; + widget_class->key_press_event = trap_view_key_press; + widget_class->button_press_event = trap_view_button_press; + widget_class->button_release_event = trap_view_button_release; + widget_class->motion_notify_event = trap_view_motion; +} + +static void +trap_view_init (TrapView *self) +{ + self->mag_zoom = 64; + self->mag_size = 200; + + self->extents.p1.x = G_MAXDOUBLE; + self->extents.p1.y = G_MAXDOUBLE; + self->extents.p2.x = -G_MAXDOUBLE; + self->extents.p2.y = -G_MAXDOUBLE; + + GTK_WIDGET_SET_FLAGS (self, GTK_CAN_FOCUS); +} + +static contour_t * +_contour_add_point (TrapView *tv, contour_t *contour, point_t *p) +{ + if (contour == NULL) + return NULL; + + if (p->y < tv->extents.p1.y) + tv->extents.p1.y = p->y; + if (p->y > tv->extents.p2.y) + tv->extents.p2.y = p->y; + + if (p->x < tv->extents.p1.x) + tv->extents.p1.x = p->x; + if (p->x > tv->extents.p2.x) + tv->extents.p2.x = p->x; + + if (contour->num_points == contour->size) { + int newsize = 2 * contour->size; + void *newcontour; + + newcontour = g_realloc (contour, + sizeof (contour_t) + newsize * sizeof (point_t)); + if (newcontour == NULL) + return contour; + + contour = newcontour; + contour->size = newsize; + + if (contour->next != NULL) + contour->next->prev = newcontour; + if (contour->prev != NULL) + contour->prev->next = newcontour; + else + tv->contours = newcontour; + } + + contour->points[contour->num_points++] = *p; + + return contour; +} + +static contour_t * +contour_new (TrapView *tv, int direction) +{ + contour_t *t; + + t = g_malloc (sizeof (contour_t) + 128 * sizeof (point_t)); + t->direction = direction; + t->prev = NULL; + t->next = tv->contours; + if (tv->contours) + tv->contours->prev = t; + tv->contours = t; + + t->size = 128; + t->num_points = 0; + + return t; +} + +int +main (int argc, char **argv) +{ + TrapView *tv; + contour_t *contour = NULL; + GtkWidget *window; + FILE *file; + char *line = NULL; + size_t len = 0; + + gtk_init (&argc, &argv); + + tv = g_object_new (trap_view_get_type (), NULL); + + file = fopen (argv[1], "r"); + if (file != NULL) { + while (getline (&line, &len, file) != -1) { + point_t p; + int direction; + + if (sscanf (line, "contour: direction=%d", &direction)) { + if (contour) + g_print ("read %d contour\n", contour->num_points); + + contour = contour_new (tv, direction); + } else if (sscanf (line, " [%*d] = (%lf, %lf)", &p.x, &p.y) == 2) { + contour = _contour_add_point (tv, contour, &p); + } + } + + if (contour) + g_print ("read %d contour\n", contour->num_points); + + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + tv->extents.p1.x, tv->extents.p1.y, + tv->extents.p2.x, tv->extents.p2.y); + fclose (file); + } + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + gtk_widget_set_size_request (window, 800, 800); + gtk_container_add (GTK_CONTAINER (window), &tv->widget); + gtk_widget_show_all (window); + + gtk_main (); + return 0; +} diff --git a/util/show-edges.c b/util/show-edges.c new file mode 100644 index 000000000..a85ad5f7e --- /dev/null +++ b/util/show-edges.c @@ -0,0 +1,1221 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +typedef struct _point { + gdouble x, y; +} point_t; +typedef struct _box { + point_t p1, p2; +} box_t; +typedef struct _line { + point_t p1, p2; +} line_t; +typedef struct _trapezoid { + gdouble top, bottom; + line_t left, right; +} trapezoid_t; +typedef struct _traps { + struct _traps *next, *prev; + box_t extents; + int num_traps; + int size; + trapezoid_t traps[0]; +} traps_t; + +typedef struct _edge { + line_t line; + gdouble top, bottom; + point_t p1, p2; + int dir; +} edge_t; +typedef struct _edges { + struct _edges *next, *prev; + box_t extents; + int num_edges; + int size; + edge_t edges[0]; +} edges_t; + +typedef struct _TrapView { + GtkWidget widget; + + struct _TrapView *group_head; + struct _TrapView *group_next; + struct _TrapView *group_prev; + + traps_t *traps_list; + traps_t *current_traps; + + edges_t *edges_list; + edges_t *current_edges; + + double px, py; + + gint mag_x, mag_y; + gint mag_size; + gdouble mag_zoom; + gboolean in_mag_drag; + gint mag_drag_x, mag_drag_y; +} TrapView; + +typedef struct _TrapViewClass { + GtkWidgetClass parent_class; +} TrapViewClass; + +G_DEFINE_TYPE (TrapView, trap_view, GTK_TYPE_WIDGET) + +static gdouble +_compute_intersection_x_for_y (const line_t *line, + gdouble y) +{ + gdouble dx = line->p2.x - line->p1.x; + gdouble dy = line->p2.y - line->p1.y; + gdouble x; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + if (dy != 0) + x += (y - line->p1.y)*dx/dy; + return x; +} + +static void +_compute_intersection_point (const line_t *line, + gdouble y, + point_t *p) +{ + p->x = _compute_intersection_x_for_y (line, p->y = y); +} + +static void +trap_view_draw (TrapView *self, cairo_t *cr) +{ + traps_t *traps; + edges_t *edges; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, x1, y0, y1; + double dash[2] = {8, 8}; + double dots[2] = {0., 1.}; + int n; + box_t extents; + point_t p; + + cairo_save (cr); + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_restore (cr); + + traps = self->current_traps; + edges = self->current_edges; + if (traps == NULL && edges == NULL) + return; + + if (traps != NULL) { + extents = traps->extents; + if (edges != NULL) { + if (edges->extents.p1.x < extents.p1.x) + extents.p1.x = edges->extents.p1.x; + if (edges->extents.p1.y < extents.p1.y) + extents.p1.y = edges->extents.p1.y; + if (edges->extents.p2.x > extents.p2.x) + extents.p2.x = edges->extents.p2.x; + if (edges->extents.p2.y > extents.p2.y) + extents.p2.y = edges->extents.p2.y; + } + } else + extents = edges->extents; + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + x1 = mid + dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + y1 = mid + dim; + + if (traps != NULL) { + cairo_save (cr); + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + cairo_set_source_rgba (cr, 0, 1, 0, .2); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->top, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + cairo_close_path (cr); + cairo_fill (cr); + } + cairo_restore (cr); + } + + if (edges == NULL) { + cairo_save (cr); + + /* top, bottom */ + cairo_save (cr); { + cairo_matrix_t m; + cairo_matrix_init_scale (&m, sf, sf); + cairo_matrix_translate (&m, -x0, -y0); + + cairo_set_line_width (cr, 1.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + } + } cairo_restore (cr); + + /* left extents */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->left.p1.x, t->left.p1.y); + cairo_line_to (cr, t->left.p2.x, t->left.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 1.); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + + /* left line */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + } cairo_restore (cr); + + /* right extents */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->right.p1.x, t->right.p1.y); + cairo_line_to (cr, t->right.p2.x, t->right.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_line_width (cr, 1.); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + + /* right line */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + } cairo_restore (cr); + } + + /* end-points */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } cairo_restore (cr); + + cairo_restore (cr); + } else { + cairo_save (cr); + + for (n = 0; n < edges->num_edges; n++) { + const edge_t *e = &edges->edges[n]; + + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_line_to (cr, e->p2.x, e->p2.y); + } cairo_restore (cr); + + if (e->dir < 0) { + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_dash (cr, dash, 2, dash[0]); + } else { + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_dash (cr, dash, 2, 0.); + } + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_close_path (cr); + cairo_move_to (cr, e->p2.x, e->p2.y); + cairo_close_path (cr); + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } + + cairo_restore (cr); + } + + /* draw a zoom view of the area around the mouse */ + { + cairo_save (cr); + double zoom = self->mag_zoom; + int size = self->mag_size; + + /* bottom right */ + cairo_rectangle (cr, self->mag_x, self->mag_y, size, size); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_fill_preserve (cr); + cairo_clip (cr); + + /* compute roi in extents */ + cairo_translate (cr, self->mag_x + size/2, self->mag_y + size/2); + + if (traps != NULL) { + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->top, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + cairo_close_path (cr); + cairo_set_source_rgba (cr, 0, 1, 0, .2); + cairo_fill (cr); + } + cairo_restore (cr); + } + + if (edges == NULL) { + cairo_save (cr); { + cairo_matrix_t m; + cairo_matrix_init_scale (&m, zoom, zoom); + cairo_matrix_translate (&m, -(self->px / sf + x0), -(self->py /sf + y0)); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 1.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + } + } cairo_restore (cr); + + cairo_save (cr); { /* left extents */ + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->left.p1.x, t->left.p1.y); + cairo_line_to (cr, t->left.p2.x, t->left.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, .5); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + cairo_save (cr); { /* right extents */ + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->right.p1.x, t->right.p1.y); + cairo_line_to (cr, t->right.p2.x, t->right.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_line_width (cr, .5); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + + cairo_save (cr); { /* left lines */ + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } + cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + } cairo_restore (cr); + cairo_save (cr); { /* right lines */ + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } + cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + } cairo_restore (cr); + + /* end-points */ + cairo_save (cr); { + double dots[2] = {0., 1.}; + + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + } + cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } cairo_restore (cr); + } else { + cairo_save (cr); + + for (n = 0; n < edges->num_edges; n++) { + const edge_t *e = &edges->edges[n]; + + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_line_to (cr, e->p2.x, e->p2.y); + } cairo_restore (cr); + + if (e->dir < 0) { + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_dash (cr, dash, 2, dash[0]); + } else { + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_dash (cr, dash, 2, 0.); + } + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_close_path (cr); + cairo_move_to (cr, e->p2.x, e->p2.y); + cairo_close_path (cr); + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } + + cairo_restore (cr); + } + + /* grid */ + cairo_save (cr); { + int i; + + cairo_translate (cr, + -zoom*fmod (self->px/sf + x0, 1.), + -zoom*fmod (self->py/sf + y0, 1.)); + for (i = -size/2/zoom - 1; i <= size/2/zoom + 1; i++) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + cairo_set_source_rgba (cr, .7, .7, .7, .5); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } cairo_restore (cr); + } + + cairo_restore (cr); +} + + +static gdouble +edge_length (const edge_t *e) +{ + return hypot (e->p2.x - e->p1.x, e->p2.y - e->p1.y); +} + +static gdouble +edges_compute_total_length (const edges_t *edges) +{ + int n; + gdouble len = 0.; + for (n = 0; n < edges->num_edges; n++) + len += edge_length (&edges->edges[n]); + return len; +} + +static gdouble +trapezoid_area (const trapezoid_t *t) +{ + gdouble inner_left, inner_right; + gdouble outer_left, outer_right; + gdouble height; + gdouble area; + + /* split into 3 sections: a rectangle with a pair of triangular bookends */ + inner_left = _compute_intersection_x_for_y (&t->left, t->top); + outer_left = _compute_intersection_x_for_y (&t->left, t->bottom); + if (outer_left > inner_left) { + gdouble t = outer_left; + outer_left = inner_left; + inner_left = t; + } + + inner_right = _compute_intersection_x_for_y (&t->right, t->top); + outer_right = _compute_intersection_x_for_y (&t->right, t->bottom); + if (outer_right > inner_right) { + gdouble t = outer_right; + outer_right = inner_right; + inner_right = t; + } + + if (outer_left > outer_right) { /* reverse */ + gdouble t; + + t = outer_left; + outer_left = inner_right; + inner_right = t; + + t = inner_left; + inner_left = outer_right; + outer_right = t; + } + + height = t->bottom - t->top; + area = (inner_left - outer_left) * height / 2; + area += (outer_right - inner_right) * height / 2; + area += (inner_right - inner_left) * height; + + return area; +} + +static gdouble +traps_compute_total_area (const traps_t *traps) +{ + int n; + gdouble area = 0.; + for (n = 0; n < traps->num_traps; n++) + area += trapezoid_area (&traps->traps[n]); + return area; +} + +static void +trap_view_draw_labels (TrapView *self, cairo_t *cr) +{ + PangoLayout *layout; + gint width, height; + GString *string; + gchar *str; + traps_t *traps; + edges_t *edges; + + string = g_string_new (NULL); + + traps = self->current_traps; + if (traps != NULL) { + /* convert total area from fixed-point (assuming 24.8) */ + gdouble total_area = traps_compute_total_area (traps) / (256. * 256.); + g_string_append_printf (string, + "Number of trapezoids:\t%d\n" + "Total area of trapezoids:\t%.2f\n", + traps->num_traps, + total_area); + } + + edges = self->current_edges; + if (edges != NULL) { + double total_length = edges_compute_total_length (edges) / 256.; + g_string_append_printf (string, + "Number of edges:\t%d\n" + "Total length of edges: \t%.2f\n", + edges->num_edges, + total_length); + } + + str = g_string_free (string, FALSE); + layout = gtk_widget_create_pango_layout (&self->widget, str); + g_free (str); + + pango_layout_get_pixel_size (layout, &width, &height); + + cairo_move_to (cr, 10, 40); + pango_cairo_show_layout (cr, layout); + g_object_unref (layout); +} + +static gboolean +trap_view_expose (GtkWidget *w, GdkEventExpose *ev) +{ + TrapView *self = (TrapView *) w; + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + gdk_cairo_region (cr, ev->region); + cairo_clip (cr); + + trap_view_draw (self, cr); + trap_view_draw_labels (self, cr); + + cairo_destroy (cr); + return FALSE; +} + +static void +trap_view_advance (TrapView *self) +{ + if (self->current_traps && self->current_traps->prev) + self->current_traps = self->current_traps->prev; + if (self->current_edges && self->current_edges->prev) + self->current_edges = self->current_edges->prev; + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_back (TrapView *self) +{ + if (self->current_traps && self->current_traps->next) + self->current_traps = self->current_traps->next; + if (self->current_edges && self->current_edges->next) + self->current_edges = self->current_edges->next; + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_group_foreach (TrapView *group, GFunc func, gpointer data) +{ + while (group) { + func (group, data); + group = group->group_next; + } +} + +static gboolean +trap_view_key_press (GtkWidget *w, GdkEventKey *ev) +{ + TrapView *self = (TrapView *) w; + + switch (ev->keyval) { + case GDK_BackSpace: + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_back, + NULL); + break; + + case GDK_space: + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_advance, + NULL); + break; + + case GDK_Return: + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_advance, + NULL); + break; + + case GDK_Escape: + case GDK_Q: + gtk_main_quit (); + break; + } + + return FALSE; +} + +static gboolean +trap_view_button_press (GtkWidget *w, GdkEventButton *ev) +{ + TrapView *self = (TrapView *) w; + + if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + if (ev->type == GDK_BUTTON_PRESS) { + if (self->current_traps == NULL) + return FALSE; + + if (ev->button == 1) { + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_advance, + NULL); + } else if (ev->button == 3) { + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_back, + NULL); + } + } + } + else + { + self->in_mag_drag = TRUE; + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } + + return FALSE; +} + +static gboolean +trap_view_button_release (GtkWidget *w, GdkEventButton *ev) +{ + TrapView *self = (TrapView *) w; + + self->in_mag_drag = FALSE; + + return FALSE; +} + +static void +trap_view_update_mouse (TrapView *self, GdkEventMotion *ev) +{ + self->px = ev->x; + self->py = ev->y; + + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_update_magnifier (TrapView *self, gint *xy) +{ + self->mag_x = xy[0]; + self->mag_y = xy[1]; + + gtk_widget_queue_draw (&self->widget); +} + +static gboolean +trap_view_motion (GtkWidget *w, GdkEventMotion *ev) +{ + TrapView *self = (TrapView *) w; + + if (self->in_mag_drag) { + int xy[2]; + + xy[0] = self->mag_x + ev->x - self->mag_drag_x; + xy[1] = self->mag_y + ev->y - self->mag_drag_y; + + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_update_magnifier, + xy); + + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } else if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_update_mouse, + ev); + } + + return FALSE; +} + +static void +trap_view_realize (GtkWidget *widget) +{ + GdkWindowAttr attributes; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_EXPOSURE_MASK; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_VISUAL | GDK_WA_COLORMAP); + gdk_window_set_user_data (widget->window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); +} + +static void +trap_view_size_allocate (GtkWidget *w, GdkRectangle *r) +{ + TrapView *self = (TrapView *) w; + + GTK_WIDGET_CLASS (trap_view_parent_class)->size_allocate (w, r); + + self->mag_x = w->allocation.width - self->mag_size - 10; + self->mag_y = w->allocation.height - self->mag_size - 10; +} + +static void +trap_view_finalize (GObject *obj) +{ + G_OBJECT_CLASS (trap_view_parent_class)->finalize (obj); +} + +static void +trap_view_class_init (TrapViewClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + object_class->finalize = trap_view_finalize; + + widget_class->realize = trap_view_realize; + widget_class->size_allocate = trap_view_size_allocate; + widget_class->expose_event = trap_view_expose; + widget_class->key_press_event = trap_view_key_press; + widget_class->button_press_event = trap_view_button_press; + widget_class->button_release_event = trap_view_button_release; + widget_class->motion_notify_event = trap_view_motion; +} + +static void +trap_view_init (TrapView *self) +{ + self->mag_zoom = 10; + self->mag_size = 200; + + GTK_WIDGET_SET_FLAGS (self, GTK_CAN_FOCUS); +} + +static traps_t * +_traps_add_trapezoid (TrapView *tv, traps_t *traps, const trapezoid_t *trap) +{ + if (trap->top < traps->extents.p1.y) + traps->extents.p1.y = trap->top; + if (trap->bottom > traps->extents.p2.y) + traps->extents.p2.y = trap->bottom; + + if (trap->left.p1.x < traps->extents.p1.x) + traps->extents.p1.x = trap->left.p1.x; + if (trap->left.p2.x < traps->extents.p1.x) + traps->extents.p1.x = trap->left.p2.x; + + if (trap->right.p1.x > traps->extents.p2.x) + traps->extents.p2.x = trap->right.p1.x; + if (trap->right.p2.x > traps->extents.p2.x) + traps->extents.p2.x = trap->right.p2.x; + + if (traps->num_traps == traps->size) { + int newsize = 2 * traps->size; + void *newtraps; + + newtraps = g_realloc (traps, + sizeof (traps_t) + newsize * sizeof (trapezoid_t)); + if (newtraps == NULL) + return traps; + + if (tv->current_traps == traps) + tv->current_traps = newtraps; + + traps = newtraps; + traps->size = newsize; + + if (traps->next != NULL) + traps->next->prev = newtraps; + if (traps->prev != NULL) + traps->prev->next = newtraps; + else + tv->traps_list = newtraps; + } + + traps->traps[traps->num_traps++] = *trap; + + return traps; +} + +static traps_t * +traps_new (TrapView *tv) +{ + traps_t *t; + + t = g_malloc (sizeof (traps_t) + 16 * sizeof (trapezoid_t)); + t->prev = NULL; + t->next = tv->traps_list; + if (tv->traps_list) + tv->traps_list->prev = t; + tv->traps_list = t; + + if (tv->current_traps == NULL) + tv->current_traps = t; + + t->size = 16; + t->num_traps = 0; + t->extents.p1.x = G_MAXDOUBLE; + t->extents.p1.y = G_MAXDOUBLE; + t->extents.p2.x = -G_MAXDOUBLE; + t->extents.p2.y = -G_MAXDOUBLE; + + return t; +} + +static edges_t * +_edges_add_edge (TrapView *tv, edges_t *edges, edge_t *e) +{ + if (e->top < edges->extents.p1.y) + edges->extents.p1.y = e->top; + if (e->bottom > edges->extents.p2.y) + edges->extents.p2.y = e->bottom; + + _compute_intersection_point (&e->line, e->top, &e->p1); + _compute_intersection_point (&e->line, e->bottom, &e->p2); + + if (e->p1.x < edges->extents.p1.x) + edges->extents.p1.x = e->p1.x; + if (e->p2.x < edges->extents.p1.x) + edges->extents.p1.x = e->p2.x; + + if (e->p1.x > edges->extents.p2.x) + edges->extents.p2.x = e->p1.x; + if (e->p2.x > edges->extents.p2.x) + edges->extents.p2.x = e->p2.x; + + if (edges->num_edges == edges->size) { + int newsize = 2 * edges->size; + void *newedges; + + newedges = g_realloc (edges, + sizeof (edges_t) + newsize * sizeof (edge_t)); + if (newedges == NULL) + return edges; + + if (tv->current_edges == edges) + tv->current_edges = newedges; + + edges = newedges; + edges->size = newsize; + + if (edges->next != NULL) + edges->next->prev = newedges; + if (edges->prev != NULL) + edges->prev->next = newedges; + else + tv->edges_list = newedges; + } + + edges->edges[edges->num_edges++] = *e; + + return edges; +} + +static edges_t * +edges_new (TrapView *tv) +{ + edges_t *t; + + t = g_malloc (sizeof (edges_t) + 16 * sizeof (edge_t)); + t->prev = NULL; + t->next = tv->edges_list; + if (tv->edges_list) + tv->edges_list->prev = t; + tv->edges_list = t; + + if (tv->current_edges == NULL) + tv->current_edges = t; + + t->size = 16; + t->num_edges = 0; + t->extents.p1.x = G_MAXDOUBLE; + t->extents.p1.y = G_MAXDOUBLE; + t->extents.p2.x = -G_MAXDOUBLE; + t->extents.p2.y = -G_MAXDOUBLE; + + return t; +} + +int +main (int argc, char **argv) +{ + TrapView *tv, *tv2, *group_head = NULL, *group_prev = NULL; + traps_t *traps; + edges_t *edges; + GtkWidget *window, *hbox; + FILE *file; + char *line = NULL; + size_t len = 0; + + gtk_init (&argc, &argv); + + hbox = gtk_hbox_new (TRUE, 0); + + tv = g_object_new (trap_view_get_type (), NULL); + gtk_box_pack_start (GTK_BOX (hbox), &tv->widget, TRUE, TRUE, 0); + gtk_widget_show (&tv->widget); + + tv->group_prev = group_prev; + tv->group_next = NULL; + if (group_prev) + group_prev->group_next = tv; + group_prev = tv; + if (group_head == NULL) + group_head = tv; + tv->group_head = group_head; + + file = fopen (argv[1], "r"); + if (file != NULL) { + edges = edges_new (tv); + while (getline (&line, &len, file) != -1) { + edge_t e; + + if (sscanf (line, + "(%lf, %lf), (%lf, %lf) %lf %lf %d", + &e.line.p1.x, &e.line.p1.y, + &e.line.p2.x, &e.line.p2.y, + &e.top, &e.bottom, + &e.dir) == 7) { + edges = _edges_add_edge (tv, edges, &e); + } else { + if (edges->num_edges) { + g_print ("read %d edges\n", edges->num_edges); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + edges->extents.p1.x, edges->extents.p1.y, + edges->extents.p2.x, edges->extents.p2.y); + edges = edges_new (tv); + } + } + } + + if (edges->num_edges) { + g_print ("read %d edges\n", edges->num_edges); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + edges->extents.p1.x, edges->extents.p1.y, + edges->extents.p2.x, edges->extents.p2.y); + } + + fclose (file); + } + + file = fopen (argv[2], "r"); + if (file != NULL) { + traps = traps_new (tv); + while (getline (&line, &len, file) != -1) { + trapezoid_t t; + + if (sscanf (line, + "%lf %lf L:(%lf, %lf), (%lf, %lf) R:(%lf, %lf), (%lf, %lf)", + &t.top, &t.bottom, + &t.left.p1.x, &t.left.p1.y, + &t.left.p2.x, &t.left.p2.y, + &t.right.p1.x, &t.right.p1.y, + &t.right.p2.x, &t.right.p2.y) == 10) { + traps = _traps_add_trapezoid (tv, traps, &t); + } else { + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + traps = traps_new (tv); + } + } + } + + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + } + + fclose (file); + } + + free (line); + + tv2 = g_object_new (trap_view_get_type (), NULL); + gtk_box_pack_start (GTK_BOX (hbox), &tv2->widget, TRUE, TRUE, 0); + gtk_widget_show (&tv2->widget); + + tv2->traps_list = tv->traps_list; + tv2->current_traps = tv->current_traps; + + tv2->group_prev = group_prev; + tv2->group_next = NULL; + group_prev->group_next = tv2; + group_prev = tv2; + tv2->group_head = group_head; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + gtk_widget_set_size_request (window, 800, 800); + gtk_container_add (GTK_CONTAINER (window), hbox); + gtk_widget_show (hbox); + gtk_widget_show (window); + + gtk_main (); + return 0; +} diff --git a/util/show-events.c b/util/show-events.c new file mode 100644 index 000000000..8bff3efc4 --- /dev/null +++ b/util/show-events.c @@ -0,0 +1,845 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +typedef struct _point { + gdouble x, y; +} point_t; +typedef struct _box { + point_t p1, p2; +} box_t; +typedef struct _line { + point_t p1, p2; +} line_t; + +typedef struct _edge { + gulong id; + line_t line; + gdouble top, bottom; + point_t p1, p2; + int dir; +} edge_t; +typedef struct _trapezoid { + gdouble top, bottom; + const edge_t *left, *right; +} trapezoid_t; +typedef struct _traps { + int num_traps; + int size; + trapezoid_t traps[0]; +} traps_t; + +typedef struct _edges { + GHashTable *ht; + + int num_edges; + int size; + edge_t edges[0]; +} edges_t; + +typedef struct _event { + enum { + START_EDGE, + END_EDGE, + INTERSECTION, + START_TRAP, + END_TRAP, + } type; + + int x, y; /* (top, bottom) for trap */ + long e1, e2; +} event_t; + +typedef struct _events { + struct _events *prev, *next; + + box_t extents; + edges_t *edges; + traps_t *prototraps; + traps_t *traps; + + int current_event; + int num_events; + int size_events; + event_t *events; +} events_t; + +typedef struct _EventView { + GtkWidget widget; + + events_t *events_list; + events_t *current_events; + + double px, py; + + gint mag_x, mag_y; + gint mag_size; + gdouble mag_zoom; + gboolean in_mag_drag; + gint mag_drag_x, mag_drag_y; +} EventView; + +typedef struct _EventViewClass { + GtkWidgetClass parent_class; +} EventViewClass; + +G_DEFINE_TYPE (EventView, event_view, GTK_TYPE_WIDGET) + +static edge_t * +edges_lookup (edges_t *edges, gulong id) +{ + return &edges->edges[GPOINTER_TO_UINT(g_hash_table_lookup (edges->ht, + GUINT_TO_POINTER + (id)))]; +} + +static gdouble +_compute_intersection_x_for_y (const line_t *line, + gdouble y) +{ + gdouble dx = line->p2.x - line->p1.x; + gdouble dy = line->p2.y - line->p1.y; + gdouble x; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + if (dy != 0) + x += (y - line->p1.y)*dx/dy; + return x; +} + +static void +_compute_intersection_point (const line_t *line, + gdouble y, + point_t *p) +{ + p->x = _compute_intersection_x_for_y (line, p->y = y); +} + +static void +_edge_path (cairo_t *cr, const cairo_matrix_t *m, const edge_t *e) +{ + double x, y; + + x = e->p1.x; y = e->p1.y; + cairo_matrix_transform_point (m, &x, &y); + cairo_move_to (cr, x, y); + + x = e->p2.x; y = e->p2.y; + cairo_matrix_transform_point (m, &x, &y); + cairo_line_to (cr, x, y); + + if (e->dir < 0) { + cairo_set_source_rgb (cr, 0, 0, 1); + } else { + cairo_set_source_rgb (cr, 1, 0, 0); + } +} + +static void +_events_draw (events_t *events, cairo_t *cr, cairo_matrix_t *m) +{ + double dash[2] = {8, 8}; + point_t p; + int n; + + /* first the existing and proto-traps */ + cairo_save (cr); { + cairo_set_matrix (cr, m); + + cairo_set_source_rgba (cr, 1, 0, 0, .15); + for (n = 0; n < events->prototraps->num_traps; n++) { + const trapezoid_t *t = &events->prototraps->traps[n]; + + _compute_intersection_point (&t->left->line, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right->line, t->top, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->right->line, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->left->line, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + cairo_close_path (cr); + cairo_fill (cr); + } + + cairo_set_source_rgba (cr, 0, 1, 0, .2); + for (n = 0; n < events->traps->num_traps; n++) { + const trapezoid_t *t = &events->traps->traps[n]; + + _compute_intersection_point (&t->left->line, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right->line, t->top, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->right->line, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->left->line, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + cairo_close_path (cr); + cairo_fill (cr); + } + } cairo_restore (cr); + + /* known edges */ + cairo_save (cr); + cairo_set_line_width (cr, 1.); + for (n = 0; n < events->edges->num_edges; n++) { + const edge_t *e = &events->edges->edges[n]; + double x, y; + + x = e->p1.x; y = e->p1.y; + cairo_matrix_transform_point (m, &x, &y); + cairo_move_to (cr, x, y); + + x = e->p2.x; y = e->p2.y; + cairo_matrix_transform_point (m, &x, &y); + cairo_line_to (cr, x, y); + + if (e->dir < 0) { + cairo_set_source_rgba (cr, 0, 0, 1., .4); + cairo_set_dash (cr, dash, 2, fmod (e->p1.x, dash[0]+dash[1]) + dash[0]); + } else { + cairo_set_source_rgba (cr, 1, 0, 0., 4); + cairo_set_dash (cr, dash, 2, fmod (e->p1.x, dash[0]+dash[1])); + } + + cairo_stroke (cr); + + x = e->p1.x; y = e->p1.y; + cairo_matrix_transform_point (m, &x, &y); + cairo_arc (cr, x, y, 2., 0, 2 * G_PI); + + x = e->p2.x; y = e->p2.y; + cairo_matrix_transform_point (m, &x, &y); + cairo_arc (cr, x, y, 2., 0, 2 * G_PI); + + cairo_fill (cr); + } + cairo_restore (cr); + + /* event time */ + cairo_save (cr); { + event_t *e; + double x, y; + + e = &events->events[events->current_event]; + + cairo_set_line_width (cr, 2.); + cairo_set_matrix (cr, m); + cairo_move_to (cr, + events->extents.p1.x, + e->y); + cairo_line_to (cr, + events->extents.p2.x, + e->y); + cairo_identity_matrix (cr); + cairo_stroke (cr); + + x = e->x; y = e->y; + cairo_matrix_transform_point (m, &x, &y); + switch (e->type) { + case START_EDGE: + case END_EDGE: + case INTERSECTION: + cairo_arc (cr, x, y, 4., 0, 2 * G_PI); + break; + case START_TRAP: + case END_TRAP: + break; + } + switch (e->type) { + case START_EDGE: + cairo_set_source_rgb (cr, 1, 0, 0); + break; + case END_EDGE: + cairo_set_source_rgb (cr, 0, 0, 1); + break; + case INTERSECTION: + cairo_set_source_rgb (cr, 1, 0, 1); + break; + case START_TRAP: + case END_TRAP: + break; + } + cairo_fill (cr); + + cairo_set_line_width (cr, 1.); + switch (e->type) { + case START_EDGE: + _edge_path (cr, m, edges_lookup (events->edges, e->e1)); + cairo_stroke (cr); + break; + case END_EDGE: + _edge_path (cr, m, edges_lookup (events->edges, e->e1)); + cairo_stroke (cr); + break; + case INTERSECTION: + _edge_path (cr, m, edges_lookup (events->edges, e->e1)); + cairo_stroke (cr); + _edge_path (cr, m, edges_lookup (events->edges, e->e2)); + cairo_stroke (cr); + break; + } + } cairo_restore (cr); +} + +static void +event_view_draw (EventView *self, cairo_t *cr) +{ + events_t *events; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, x1, y0, y1; + cairo_matrix_t m; + + cairo_save (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_restore (cr); + + events = self->current_events; + if (events == NULL) + return; + + mid = (events->extents.p2.x + events->extents.p1.x) / 2.; + dim = (events->extents.p2.x - events->extents.p1.x) / 2. * 1.2; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (events->extents.p2.y + events->extents.p1.y) / 2.; + dim = (events->extents.p2.y - events->extents.p1.y) / 2. * 1.2; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (events->extents.p2.x + events->extents.p1.x) / 2.; + dim = sf_x / sf * (events->extents.p2.x - events->extents.p1.x) / 2. * 1.2; + x0 = mid - dim; + x1 = mid + dim; + mid = (events->extents.p2.y + events->extents.p1.y) / 2.; + dim = sf_y / sf * (events->extents.p2.y - events->extents.p1.y) / 2. * 1.2; + y0 = mid - dim; + y1 = mid + dim; + + cairo_matrix_init_scale (&m, sf, sf); + cairo_matrix_translate (&m, -x0, -y0); + _events_draw (events, cr, &m); + + /* draw a zoom view of the area around the mouse */ + cairo_save (cr); { + double zoom = self->mag_zoom; + int size = self->mag_size; + + /* bottom right */ + cairo_rectangle (cr, self->mag_x, self->mag_y, size, size); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_fill_preserve (cr); + cairo_clip (cr); + + /* compute roi in extents */ + cairo_translate (cr, self->mag_x + size/2, self->mag_y + size/2); + + cairo_matrix_init_scale (&m, zoom, zoom); + cairo_matrix_translate (&m, -(self->px / sf + x0), -(self->py /sf + y0)); + _events_draw (events, cr, &m); + + /* grid */ + cairo_save (cr); { + int i; + + cairo_translate (cr, + -zoom*fmod (self->px/sf + x0, 1.), + -zoom*fmod (self->py/sf + y0, 1.)); + for (i = -size/2/zoom - 1; i <= size/2/zoom + 1; i++) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + cairo_set_source_rgba (cr, .7, .7, .7, .5); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } cairo_restore (cr); + } cairo_restore (cr); +} + +static void +event_view_draw_labels (EventView *self, cairo_t *cr) +{ + events_t *events; + + events = self->current_events; + if (events == NULL) + return; + +} + +static gboolean +event_view_expose (GtkWidget *w, GdkEventExpose *ev) +{ + EventView *self = (EventView *) w; + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + gdk_cairo_region (cr, ev->region); + cairo_clip (cr); + + event_view_draw (self, cr); + event_view_draw_labels (self, cr); + + cairo_destroy (cr); + return FALSE; +} + +static void +traps_clear (traps_t *traps) +{ + traps->num_traps = 0; +} + +static traps_t * +traps_add (traps_t *traps, int top, int bot, const edge_t *e1, const edge_t *e2) +{ + trapezoid_t *t; + + if (traps->num_traps == traps->size) { + traps->size *= 2; + traps = g_realloc (traps, + sizeof (traps_t) + traps->size*sizeof (trapezoid_t)); + } + + t = &traps->traps[traps->num_traps++]; + t->top = top; + if (bot > e1->bottom) + bot = e1->bottom; + if (bot > e2->bottom) + bot = e2->bottom; + t->bottom = bot; + + t->left = e1; + t->right = e2; + + return traps; +} + +static void +traps_remove (traps_t *traps, int top, const edge_t *e1, const edge_t *e2) +{ + int n; + + for (n = 0; n < traps->num_traps; n++) { + trapezoid_t *t = &traps->traps[n]; + if (t->top == top && t->left == e1 && t->right == e2) + break; + } + if (n < traps->num_traps) { + g_memmove (&traps->traps[n], + &traps->traps[n+1], + (traps->num_traps-n+1) * sizeof (trapezoid_t)); + traps->num_traps--; + } +} + +static void +event_next (EventView *self) +{ + events_t *events; + event_t *e; + + events = self->current_events; + if (++events->current_event == events->num_events) { + return; + } else if (events->current_event >= events->num_events) { + traps_clear (events->prototraps); + traps_clear (events->traps); + events->current_event = 0; + + self->current_events = events->next; + if (self->current_events == NULL) + self->current_events = self->events_list; + events = self->current_events; + } + + e = &events->events[events->current_event]; + switch (e->type) { + case START_TRAP: + events->prototraps = traps_add (events->prototraps, + e->x, G_MAXINT, + edges_lookup (events->edges, e->e1), + edges_lookup (events->edges, e->e2)); + break; + case END_TRAP: + traps_remove (events->prototraps, + e->x, + edges_lookup (events->edges, e->e1), + edges_lookup (events->edges, e->e2)); + events->traps = traps_add (events->traps, + e->x, e->y, + edges_lookup (events->edges, e->e1), + edges_lookup (events->edges, e->e2)); + break; + } +} + +static gboolean +event_view_button_press (GtkWidget *w, GdkEventButton *ev) +{ + EventView *self = (EventView *) w; + + if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + if (ev->type == GDK_BUTTON_PRESS) { + event_next (self); + gtk_widget_queue_draw (w); + } + } + else + { + self->in_mag_drag = TRUE; + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } + + return FALSE; +} + +static gboolean +event_view_button_release (GtkWidget *w, GdkEventButton *ev) +{ + EventView *self = (EventView *) w; + + self->in_mag_drag = FALSE; + + return FALSE; +} + +static gboolean +event_view_motion (GtkWidget *w, GdkEventMotion *ev) +{ + EventView *self = (EventView *) w; + + if (self->in_mag_drag) { + self->mag_x += ev->x - self->mag_drag_x; + self->mag_y += ev->y - self->mag_drag_y; + + gtk_widget_queue_draw (&self->widget); + + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } else if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + self->px = ev->x; + self->py = ev->y; + + gtk_widget_queue_draw (&self->widget); + } + + return FALSE; +} + +static void +event_view_realize (GtkWidget *widget) +{ + GdkWindowAttr attributes; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_EXPOSURE_MASK; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_VISUAL | GDK_WA_COLORMAP); + gdk_window_set_user_data (widget->window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); +} + +static void +event_view_size_allocate (GtkWidget *w, GdkRectangle *r) +{ + EventView *self = (EventView *) w; + + GTK_WIDGET_CLASS (event_view_parent_class)->size_allocate (w, r); + + self->mag_x = w->allocation.width - self->mag_size - 10; + self->mag_y = w->allocation.height - self->mag_size - 10; +} + +static void +event_view_finalize (GObject *obj) +{ + G_OBJECT_CLASS (event_view_parent_class)->finalize (obj); +} + +static void +event_view_class_init (EventViewClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + object_class->finalize = event_view_finalize; + + widget_class->realize = event_view_realize; + widget_class->size_allocate = event_view_size_allocate; + widget_class->expose_event = event_view_expose; + widget_class->button_press_event = event_view_button_press; + widget_class->button_release_event = event_view_button_release; + widget_class->motion_notify_event = event_view_motion; +} + +static void +event_view_init (EventView *self) +{ + self->mag_zoom = 10; + self->mag_size = 200; +} + +static traps_t * +traps_new (void) +{ + traps_t *t; + + t = g_malloc (sizeof (traps_t) + 16 * sizeof (trapezoid_t)); + + t->size = 16; + t->num_traps = 0; + + return t; +} + +static edges_t * +_edges_add_edge (edges_t *edges, edge_t *e, box_t *extents) +{ + if (e->top < extents->p1.y) + extents->p1.y = e->top; + if (e->bottom > extents->p2.y) + extents->p2.y = e->bottom; + + _compute_intersection_point (&e->line, e->top, &e->p1); + _compute_intersection_point (&e->line, e->bottom, &e->p2); + + if (e->p1.x < extents->p1.x) + extents->p1.x = e->p1.x; + if (e->p2.x < extents->p1.x) + extents->p1.x = e->p2.x; + + if (e->p1.x > extents->p2.x) + extents->p2.x = e->p1.x; + if (e->p2.x > extents->p2.x) + extents->p2.x = e->p2.x; + + if (edges->num_edges == edges->size) { + edges->size *= 2; + edges = g_realloc (edges, + sizeof (edges_t) + edges->size * sizeof (edge_t)); + } + + g_hash_table_insert (edges->ht, + GUINT_TO_POINTER (e->id), + GUINT_TO_POINTER (edges->num_edges)); + edges->edges[edges->num_edges++] = *e; + + return edges; +} + +static void +_events_add_event (events_t *events, + int type, + int x, int y, + gulong e1, gulong e2) +{ + event_t *e; + + if (events->num_events == events->size_events) { + int newsize = 2 * events->size_events; + void *newevents; + + newevents = g_renew (event_t, events->events, newsize); + events->events = newevents; + events->size_events = newsize; + } + + e = &events->events[events->num_events++]; + e->type = type; + e->x = x; + e->y = y; + e->e1 = e1; + e->e2 = e2; +} + +static edges_t * +edges_new (void) +{ + edges_t *t; + + t = g_malloc (sizeof (edges_t) + 16 * sizeof (edge_t)); + t->ht = g_hash_table_new (NULL, NULL); + t->size = 16; + t->num_edges = 0; + + return t; +} + +static events_t * +events_new (void) +{ + events_t *events; + + events = g_malloc (sizeof (events_t)); + + events->next = NULL; + events->prev = NULL; + + events->events = g_new (event_t, 16); + events->size_events = 16; + events->num_events = 0; + events->current_event = 0; + + events->edges = edges_new (); + events->prototraps = traps_new (); + events->traps = traps_new (); + + events->extents.p1.x = G_MAXDOUBLE; + events->extents.p1.y = G_MAXDOUBLE; + events->extents.p2.x = -G_MAXDOUBLE; + events->extents.p2.y = -G_MAXDOUBLE; + + return events; +} + +static void +events_read (EventView *ev, const char *filename) +{ + FILE *file; + + file = fopen (filename, "r"); + if (file != NULL) { + char *line = NULL; + size_t len = 0; + events_t *events; + + events = ev->events_list = events_new (); + while (getline (&line, &len, file) != -1) { + line = g_strstrip (line); + if (*line == '\0') { + events->next = events_new (); + events->next->prev = events; + events = events->next; + } else if (g_str_has_prefix (line, "edge:")) { + edge_t edge; + + sscanf (line, "edge: %lu (%lf, %lf) (%lf, %lf) (%lf, %lf) %d", + &edge.id, + &edge.line.p1.x, + &edge.line.p1.y, + &edge.line.p2.x, + &edge.line.p2.y, + &edge.top, + &edge.bottom, + &edge.dir); + + events->edges = _edges_add_edge (events->edges, + &edge, + &events->extents); + } else if (g_str_has_prefix (line, "event:")) { + int type; + int x,y; + gulong e1, e2; + + sscanf (line, "event: %d (%d, %d) %lu %lu", + &type, &x, &y, + &e1, &e2); + + _events_add_event (events, type, x, y, e1, e2); + } else if (g_str_has_prefix (line, "begin trap:")) { + int top; + gulong e1, e2; + + sscanf (line, "begin trap: %lu %lu %u", &e1, &e2, &top); + + _events_add_event (events, START_TRAP, top, 0, e1, e2); + } else if (g_str_has_prefix (line, "end trap:")) { + int top, bottom; + gulong e1, e2; + + sscanf (line, "end trap: %lu %lu %d %d", + &e1, &e2, &top, &bottom); + + _events_add_event (events, END_TRAP, top, bottom, e1, e2); + } + } + + ev->current_events = ev->events_list; + + free (line); + fclose (file); + } +} + +static gboolean +timeout_advance (EventView *self) +{ + event_next (self); + gtk_widget_queue_draw (&self->widget); + return TRUE; +} + +int +main (int argc, char **argv) +{ + EventView *ev; + GtkWidget *window, *hbox; + + gtk_init (&argc, &argv); + + hbox = gtk_hbox_new (TRUE, 0); + + ev = g_object_new (event_view_get_type (), NULL); + gtk_box_pack_start (GTK_BOX (hbox), &ev->widget, TRUE, TRUE, 0); + gtk_widget_show (&ev->widget); + + events_read (ev, argv[1]); + g_timeout_add (750, (GSourceFunc) timeout_advance, ev); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request (window, 800, 800); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + gtk_container_add (GTK_CONTAINER (window), hbox); + gtk_widget_show (hbox); + gtk_widget_show (window); + + gtk_main (); + return 0; +} diff --git a/util/show-polygon.c b/util/show-polygon.c new file mode 100644 index 000000000..35c0014d1 --- /dev/null +++ b/util/show-polygon.c @@ -0,0 +1,646 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +typedef struct _point { + gdouble x, y; +} point_t; +typedef struct _edge { + point_t p1, p2; + gdouble top, bot; + int dir; +} edge_t; +typedef struct _box { + point_t p1, p2; +} box_t; + +typedef struct _polygon { + struct _polygon *next, *prev; + int num_edges; + int size; + edge_t edges[0]; +} polygon_t; + +typedef struct _PolygonView { + GtkWidget widget; + + cairo_surface_t *pixmap; + int pixmap_width, pixmap_height; + + box_t extents; + polygon_t *polygons; + + double px, py; + + gint mag_x, mag_y; + gint mag_size; + gdouble mag_zoom; + gboolean in_mag_drag; + gint mag_drag_x, mag_drag_y; +} PolygonView; + +typedef struct _PolygonViewClass { + GtkWidgetClass parent_class; +} PolygonViewClass; + +G_DEFINE_TYPE (PolygonView, polygon_view, GTK_TYPE_WIDGET) + +double highlight = -1; + +static void draw_edges (cairo_t *cr, polygon_t *p, gdouble sf, int dir) +{ + int n; + + if (dir < 0) + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + else + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + + for (n = 0; n < p->num_edges; n++) { + const edge_t *e = &p->edges[n]; + double dx, dy; + double x1, x2; + + if (e->dir != dir) + continue; + + dx = e->p2.x - e->p1.x; + dy = e->p2.y - e->p1.y; + + x1 = e->p1.x + (e->top - e->p1.y) / dy * dx; + x2 = e->p1.x + (e->bot - e->p1.y) / dy * dx; + + cairo_arc (cr, x1, e->top, 2/sf, 0, 2*M_PI); + cairo_arc (cr, x2, e->bot, 2/sf, 0, 2*M_PI); + cairo_fill (cr); + } + + if (dir < 0) + cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.5); + else + cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 0.5); + + for (n = 0; n < p->num_edges; n++) { + const edge_t *e = &p->edges[n]; + + if (e->dir != dir) + continue; + + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_line_to (cr, e->p2.x, e->p2.y); + } + cairo_save (cr); { + cairo_identity_matrix (cr); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } cairo_restore (cr); + + if (dir < 0) + cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); + else + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); + + for (n = 0; n < p->num_edges; n++) { + const edge_t *e = &p->edges[n]; + double dx, dy; + double x1, x2; + + if (e->dir != dir) + continue; + + dx = e->p2.x - e->p1.x; + dy = e->p2.y - e->p1.y; + + x1 = e->p1.x + (e->top - e->p1.y) / dy * dx; + x2 = e->p1.x + (e->bot - e->p1.y) / dy * dx; + + cairo_move_to (cr, x1, e->top); + cairo_line_to (cr, x2, e->bot); + } + cairo_save (cr); { + cairo_identity_matrix (cr); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } cairo_restore (cr); +} + +static void draw_polygon (cairo_t *cr, polygon_t *p, gdouble sf) +{ + draw_edges (cr, p, sf, -1); + + draw_edges (cr, p, sf, +1); +} + +static cairo_surface_t * +pixmap_create (PolygonView *self, cairo_surface_t *target) +{ + cairo_surface_t *surface = + cairo_surface_create_similar (target, CAIRO_CONTENT_COLOR, + self->widget.allocation.width, + self->widget.allocation.height); + cairo_t *cr = cairo_create (surface); + polygon_t *polygon; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, y0; + box_t extents; + + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + if (self->polygons == NULL) { + cairo_destroy(cr); + return surface; + } + + extents = self->extents; + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (polygon = self->polygons; polygon; polygon = polygon->next) { + if (polygon->num_edges == 0) + continue; + + draw_polygon (cr, polygon, sf); + } + + if (highlight != -1) { + cairo_move_to (cr, extents.p1.x, highlight); + cairo_line_to (cr, extents.p2.x, highlight); + cairo_set_source_rgb (cr, 0, .7, 0); + cairo_save (cr); + cairo_identity_matrix (cr); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + cairo_restore (cr); + } + } cairo_restore (cr); + + cairo_destroy (cr); + return surface; +} + +static void +polygon_view_draw (PolygonView *self, cairo_t *cr) +{ + polygon_t *polygon; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, y0; + box_t extents; + + extents = self->extents; + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + + if (self->pixmap_width != self->widget.allocation.width || + self->pixmap_height != self->widget.allocation.height) + { + cairo_surface_destroy (self->pixmap); + self->pixmap = pixmap_create (self, cairo_get_target (cr)); + self->pixmap_width = self->widget.allocation.width; + self->pixmap_height = self->widget.allocation.height; + } + + cairo_set_source_surface (cr, self->pixmap, 0, 0); + cairo_paint (cr); + + if (self->polygons == NULL) + return; + + /* draw a zoom view of the area around the mouse */ + if (1) { + double zoom = self->mag_zoom; + int size = self->mag_size; + int mag_x = self->mag_x; + int mag_y = self->mag_y; + + if (1) { + if (self->px + size < self->widget.allocation.width/2) + mag_x = self->px + size/4; + else + mag_x = self->px - size/4 - size; + mag_y = self->py - size/2; + if (mag_y < 0) + mag_y = 0; + if (mag_y + size > self->widget.allocation.height) + mag_y = self->widget.allocation.height - size; + } + + cairo_save (cr); { + /* bottom right */ + cairo_rectangle (cr, mag_x, mag_y, size, size); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_fill_preserve (cr); + cairo_clip (cr); + + /* compute roi in extents */ + cairo_translate (cr, mag_x + size/2, mag_y + size/2); + + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (polygon = self->polygons; polygon; polygon = polygon->next) { + if (polygon->num_edges == 0) + continue; + + draw_polygon (cr, polygon, zoom); + } + + if (highlight != -1) { + cairo_move_to (cr, extents.p1.x, highlight); + cairo_line_to (cr, extents.p2.x, highlight); + cairo_set_source_rgb (cr, 0, .7, 0); + cairo_save (cr); + cairo_identity_matrix (cr); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + cairo_restore (cr); + } + } cairo_restore (cr); + + /* grid */ + cairo_save (cr); { + int i; + + cairo_translate (cr, + -zoom*fmod (self->px/sf + x0, 1.), + -zoom*fmod (self->py/sf + y0, 1.)); + zoom /= 2; + for (i = -size/2/zoom; i <= size/2/zoom + 1; i+=2) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + zoom *= 2; + cairo_set_source_rgba (cr, .7, .7, .7, .5); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + for (i = -size/2/zoom - 1; i <= size/2/zoom + 1; i++) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + cairo_set_source_rgba (cr, .1, .1, .1, .5); + cairo_set_line_width (cr, 2.); + cairo_stroke (cr); + } cairo_restore (cr); + + } cairo_restore (cr); + } +} + +static gboolean +polygon_view_expose (GtkWidget *w, GdkEventExpose *ev) +{ + PolygonView *self = (PolygonView *) w; + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + gdk_cairo_region (cr, ev->region); + cairo_clip (cr); + + polygon_view_draw (self, cr); + + cairo_destroy (cr); + return FALSE; +} + +static gboolean +polygon_view_key_press (GtkWidget *w, GdkEventKey *ev) +{ + switch (ev->keyval) { + case GDK_Escape: + case GDK_Q: + gtk_main_quit (); + break; + } + + return FALSE; +} + +static gboolean +polygon_view_button_press (GtkWidget *w, GdkEventButton *ev) +{ + PolygonView *self = (PolygonView *) w; + + if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + } + else + { + self->in_mag_drag = TRUE; + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } + + return FALSE; +} + +static gboolean +polygon_view_button_release (GtkWidget *w, GdkEventButton *ev) +{ + PolygonView *self = (PolygonView *) w; + + self->in_mag_drag = FALSE; + + return FALSE; +} + +static void +polygon_view_update_mouse (PolygonView *self, GdkEventMotion *ev) +{ + self->px = ev->x; + self->py = ev->y; + + gtk_widget_queue_draw (&self->widget); +} + +static void +polygon_view_update_magnifier (PolygonView *self, gint *xy) +{ + self->mag_x = xy[0]; + self->mag_y = xy[1]; + + gtk_widget_queue_draw (&self->widget); +} + +static gboolean +polygon_view_motion (GtkWidget *w, GdkEventMotion *ev) +{ + PolygonView *self = (PolygonView *) w; + + if (self->in_mag_drag) { + int xy[2]; + + xy[0] = self->mag_x + ev->x - self->mag_drag_x; + xy[1] = self->mag_y + ev->y - self->mag_drag_y; + + polygon_view_update_magnifier (self, xy); + + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } else if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + polygon_view_update_mouse (self, ev); + } + + return FALSE; +} + +static void +polygon_view_realize (GtkWidget *widget) +{ + GdkWindowAttr attributes; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_EXPOSURE_MASK; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_VISUAL | GDK_WA_COLORMAP); + gdk_window_set_user_data (widget->window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); +} + +static void +polygon_view_size_allocate (GtkWidget *w, GdkRectangle *r) +{ + PolygonView *self = (PolygonView *) w; + + GTK_WIDGET_CLASS (polygon_view_parent_class)->size_allocate (w, r); + + self->mag_x = w->allocation.width - self->mag_size - 10; + self->mag_y = w->allocation.height - self->mag_size - 10; +} + +static void +polygon_view_finalize (GObject *obj) +{ + G_OBJECT_CLASS (polygon_view_parent_class)->finalize (obj); +} + +static void +polygon_view_class_init (PolygonViewClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + object_class->finalize = polygon_view_finalize; + + widget_class->realize = polygon_view_realize; + widget_class->size_allocate = polygon_view_size_allocate; + widget_class->expose_event = polygon_view_expose; + widget_class->key_press_event = polygon_view_key_press; + widget_class->button_press_event = polygon_view_button_press; + widget_class->button_release_event = polygon_view_button_release; + widget_class->motion_notify_event = polygon_view_motion; +} + +static void +polygon_view_init (PolygonView *self) +{ + self->mag_zoom = 64; + self->mag_size = 200; + + self->extents.p1.x = G_MAXDOUBLE; + self->extents.p1.y = G_MAXDOUBLE; + self->extents.p2.x = -G_MAXDOUBLE; + self->extents.p2.y = -G_MAXDOUBLE; + + GTK_WIDGET_SET_FLAGS (self, GTK_CAN_FOCUS); +} + +static polygon_t * +_polygon_add_edge (PolygonView *view, polygon_t *polygon, + point_t *p1, point_t *p2, + gdouble top, gdouble bot, int dir) +{ + if (polygon == NULL) + return NULL; + + if (top < view->extents.p1.y) + view->extents.p1.y = top; + if (bot > view->extents.p2.y) + view->extents.p2.y = bot; + + if (p1->x < view->extents.p1.x) + view->extents.p1.x = p1->x; + if (p1->x > view->extents.p2.x) + view->extents.p2.x = p1->x; + if (p2->x < view->extents.p1.x) + view->extents.p1.x = p2->x; + if (p2->x > view->extents.p2.x) + view->extents.p2.x = p2->x; + + if (polygon->num_edges == polygon->size) { + int newsize = 2 * polygon->size; + void *newpolygon; + + newpolygon = g_realloc (polygon, + sizeof (polygon_t) + newsize * sizeof (edge_t)); + if (newpolygon == NULL) + return polygon; + + polygon = newpolygon; + polygon->size = newsize; + + if (polygon->next != NULL) + polygon->next->prev = newpolygon; + if (polygon->prev != NULL) + polygon->prev->next = newpolygon; + else + view->polygons = newpolygon; + } + + polygon->edges[polygon->num_edges].p1 = *p1; + polygon->edges[polygon->num_edges].p2 = *p2; + polygon->edges[polygon->num_edges].top = top; + polygon->edges[polygon->num_edges].bot = bot; + polygon->edges[polygon->num_edges].dir = dir; + polygon->num_edges++; + + return polygon; +} + +static polygon_t * +polygon_new (PolygonView *view) +{ + polygon_t *t; + + t = g_malloc (sizeof (polygon_t) + 128 * sizeof (edge_t)); + t->prev = NULL; + t->next = view->polygons; + if (view->polygons) + view->polygons->prev = t; + view->polygons = t; + + t->size = 128; + t->num_edges = 0; + + return t; +} + +int +main (int argc, char **argv) +{ + PolygonView *view; + polygon_t *polygon = NULL; + GtkWidget *window; + FILE *file; + char *line = NULL; + size_t len = 0; + + gtk_init (&argc, &argv); + + view = g_object_new (polygon_view_get_type (), NULL); + + file = fopen (argv[1], "r"); + if (file != NULL) { + while (getline (&line, &len, file) != -1) { + point_t p1, p2; + double top, bottom; + int dir; + + if (strncmp (line, "polygon: ", sizeof("polygon: ")-1) == 0) { + if (polygon && polygon->num_edges) { + g_print ("read polygon with %d edges\n", polygon->num_edges); + + polygon = polygon_new (view); + } else if (polygon == NULL) + polygon = polygon_new (view); + } else if (sscanf (line, " [%*d] = [(%lf, %lf), (%lf, %lf)], top=%lf, bottom=%lf, dir=%d", &p1.x, &p1.y, &p2.x, &p2.y, &top, &bottom, &dir) == 7) { + polygon = _polygon_add_edge (view, polygon, &p1, &p2, + top, bottom, dir); + } + } + + if (polygon && polygon->num_edges) + g_print ("read polygon with %d edges\n", polygon->num_edges); + + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + view->extents.p1.x, view->extents.p1.y, + view->extents.p2.x, view->extents.p2.y); + fclose (file); + } + + if (argc > 2) + highlight = atof (argv[2]); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + gtk_widget_set_size_request (window, 800, 800); + gtk_container_add (GTK_CONTAINER (window), &view->widget); + gtk_widget_show_all (window); + + gtk_main (); + return 0; +} diff --git a/util/show-traps.c b/util/show-traps.c new file mode 100644 index 000000000..f46c8b009 --- /dev/null +++ b/util/show-traps.c @@ -0,0 +1,1311 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +typedef struct _point { + gdouble x, y; +} point_t; +typedef struct _box { + point_t p1, p2; +} box_t; +typedef struct _line { + point_t p1, p2; +} line_t; +typedef struct _trapezoid { + gdouble top, bottom; + line_t left, right; +} trapezoid_t; +typedef struct _traps { + struct _traps *next, *prev; + box_t extents; + int num_traps; + int size; + trapezoid_t traps[0]; +} traps_t; + +typedef struct _edge { + line_t line; + gdouble top, bottom; + point_t p1, p2; + int dir; +} edge_t; +typedef struct _edges { + struct _edges *next, *prev; + box_t extents; + int num_edges; + int size; + edge_t edges[0]; +} edges_t; + +typedef struct _TrapView { + GtkWidget widget; + + struct _TrapView *group_head; + struct _TrapView *group_next; + struct _TrapView *group_prev; + + cairo_surface_t *pixmap; + int pixmap_width, pixmap_height; + + traps_t *traps_list; + traps_t *current_traps; + + edges_t *edges_list; + edges_t *current_edges; + + double px, py; + + gint mag_x, mag_y; + gint mag_size; + gdouble mag_zoom; + gboolean in_mag_drag; + gint mag_drag_x, mag_drag_y; +} TrapView; + +typedef struct _TrapViewClass { + GtkWidgetClass parent_class; +} TrapViewClass; + +G_DEFINE_TYPE (TrapView, trap_view, GTK_TYPE_WIDGET) + +static gdouble +_compute_intersection_x_for_y (const line_t *line, + gdouble y) +{ + gdouble dx = line->p2.x - line->p1.x; + gdouble dy = line->p2.y - line->p1.y; + gdouble x; + + if (y == line->p1.y) + return line->p1.x; + if (y == line->p2.y) + return line->p2.x; + + x = line->p1.x; + if (dy != 0) + x += (y - line->p1.y)*dx/dy; + return x; +} + +static void +_compute_intersection_point (const line_t *line, + gdouble y, + point_t *p) +{ + p->x = _compute_intersection_x_for_y (line, p->y = y); +} + +static cairo_surface_t * +pixmap_create (TrapView *self, cairo_surface_t *target) +{ + cairo_surface_t *surface = cairo_surface_create_similar (target, CAIRO_CONTENT_COLOR, + self->widget.allocation.width, + self->widget.allocation.height); + cairo_t *cr; + traps_t *traps; + edges_t *edges; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, y0; + double dash[2] = {8, 8}; + double dots[2] = {0., 1.}; + int n; + box_t extents; + point_t p; + + traps = self->current_traps; + if (traps == NULL) + return surface; + edges = self->current_edges; + + extents = traps->extents; + if (edges != NULL) { + if (edges->extents.p1.x < extents.p1.x) + extents.p1.x = edges->extents.p1.x; + if (edges->extents.p1.y < extents.p1.y) + extents.p1.y = edges->extents.p1.y; + if (edges->extents.p2.x > extents.p2.x) + extents.p2.x = edges->extents.p2.x; + if (edges->extents.p2.y > extents.p2.y) + extents.p2.y = edges->extents.p2.y; + } + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + + cr = cairo_create (surface); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + + cairo_save (cr); + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + cairo_set_source_rgba (cr, 0, 1, 0, .2); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->top, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + cairo_close_path (cr); + cairo_fill (cr); + } + cairo_restore (cr); + + if (edges == NULL) { + cairo_save (cr); + + /* top, bottom */ + cairo_save (cr); { + cairo_matrix_t m; + cairo_matrix_init_scale (&m, sf, sf); + cairo_matrix_translate (&m, -x0, -y0); + + cairo_set_line_width (cr, 1.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + } + } cairo_restore (cr); + + /* left extents */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->left.p1.x, t->left.p1.y); + cairo_line_to (cr, t->left.p2.x, t->left.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, 1.); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + + /* left line */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + } cairo_restore (cr); + + /* right extents */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->right.p1.x, t->right.p1.y); + cairo_line_to (cr, t->right.p2.x, t->right.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_line_width (cr, 1.); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + + /* right line */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + } cairo_restore (cr); + } + + /* end-points */ + cairo_save (cr); { + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } cairo_restore (cr); + + cairo_restore (cr); + } else { + cairo_save (cr); + + for (n = 0; n < edges->num_edges; n++) { + const edge_t *e = &edges->edges[n]; + + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_line_to (cr, e->p2.x, e->p2.y); + } cairo_restore (cr); + + if (e->dir < 0) { + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_dash (cr, dash, 2, dash[0]); + } else { + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_dash (cr, dash, 2, 0.); + } + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + + cairo_save (cr); { + cairo_scale (cr, sf, sf); + cairo_translate (cr, -x0, -y0); + cairo_move_to (cr, e->p1.x, e->p1.y); + cairo_close_path (cr); + cairo_move_to (cr, e->p2.x, e->p2.y); + cairo_close_path (cr); + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } + + cairo_restore (cr); + } + + cairo_destroy (cr); + return surface; +} + +static void +trap_view_draw (TrapView *self, cairo_t *cr) +{ + traps_t *traps; + edges_t *edges; + gdouble sf_x, sf_y, sf; + gdouble mid, dim; + gdouble x0, y0; + double dash[2] = {8, 8}; + int n; + box_t extents; + point_t p; + + if (self->pixmap_width != self->widget.allocation.width || + self->pixmap_height != self->widget.allocation.height) + { + cairo_surface_destroy (self->pixmap); + self->pixmap = pixmap_create (self, cairo_get_target (cr)); + self->pixmap_width = self->widget.allocation.width; + self->pixmap_height = self->widget.allocation.height; + } + + cairo_save (cr); + cairo_set_source_surface (cr, self->pixmap, 0, 0); + cairo_paint (cr); + cairo_restore (cr); + + traps = self->current_traps; + if (traps == NULL) + return; + + extents = traps->extents; + edges = self->current_edges; + if (edges != NULL) { + if (edges->extents.p1.x < extents.p1.x) + extents.p1.x = edges->extents.p1.x; + if (edges->extents.p1.y < extents.p1.y) + extents.p1.y = edges->extents.p1.y; + if (edges->extents.p2.x > extents.p2.x) + extents.p2.x = edges->extents.p2.x; + if (edges->extents.p2.y > extents.p2.y) + extents.p2.y = edges->extents.p2.y; + } + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = (extents.p2.x - extents.p1.x) / 2. * 1.25; + sf_x = self->widget.allocation.width / dim / 2; + + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = (extents.p2.y - extents.p1.y) / 2. * 1.25; + sf_y = self->widget.allocation.height / dim / 2; + + sf = MIN (sf_x, sf_y); + + mid = (extents.p2.x + extents.p1.x) / 2.; + dim = sf_x / sf * (extents.p2.x - extents.p1.x) / 2. * 1.25; + x0 = mid - dim; + mid = (extents.p2.y + extents.p1.y) / 2.; + dim = sf_y / sf * (extents.p2.y - extents.p1.y) / 2. * 1.25; + y0 = mid - dim; + + cairo_save (cr); + + /* draw a zoom view of the area around the mouse */ + { + double zoom = self->mag_zoom; + int size = self->mag_size; + + cairo_save (cr); + + /* bottom right */ + cairo_rectangle (cr, self->mag_x, self->mag_y, size, size); + cairo_stroke_preserve (cr); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_fill_preserve (cr); + cairo_clip (cr); + + /* compute roi in extents */ + cairo_translate (cr, self->mag_x + size/2, self->mag_y + size/2); + + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->top, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + cairo_close_path (cr); + cairo_set_source_rgba (cr, 0, 1, 0, .2); + cairo_fill (cr); + } + cairo_restore (cr); + + cairo_save (cr); { + cairo_matrix_t m; + cairo_matrix_init_scale (&m, zoom, zoom); + cairo_matrix_translate (&m, -(self->px / sf + x0), -(self->py /sf + y0)); + + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_line_width (cr, 1.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + + _compute_intersection_point (&t->left, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->top, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_move_to (cr, floor (p.x), floor (p.y) + .5); + cairo_set_dash (cr, dash, 2, fmod (floor (p.x), dash[0] + dash[1])); + + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_matrix_transform_point (&m, &p.x, &p.y); + cairo_line_to (cr, ceil (p.x), floor (p.y) + .5); + cairo_stroke (cr); + } + } cairo_restore (cr); + + cairo_save (cr); { /* left extents */ + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->left.p1.x, t->left.p1.y); + cairo_line_to (cr, t->left.p2.x, t->left.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_set_line_width (cr, .5); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + cairo_save (cr); { /* right extents */ + cairo_save (cr); { + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + cairo_move_to (cr, t->right.p1.x, t->right.p1.y); + cairo_line_to (cr, t->right.p2.x, t->right.p2.y); + } + } cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_set_line_width (cr, .5); + cairo_set_dash (cr, dash, 2, 0.); + cairo_stroke (cr); + } cairo_restore (cr); + + cairo_save (cr); { /* left lines */ + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } + cairo_restore (cr); + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_stroke (cr); + } cairo_restore (cr); + cairo_save (cr); { /* right lines */ + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_line_to (cr, p.x, p.y); + } + cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 1); + cairo_stroke (cr); + } cairo_restore (cr); + + /* end-points */ + cairo_save (cr); { + double dots[2] = {0., 1.}; + + cairo_save (cr); + cairo_scale (cr, zoom, zoom); + cairo_translate (cr, -(self->px / sf + x0), -(self->py /sf + y0)); + for (n = 0; n < traps->num_traps; n++) { + const trapezoid_t *t = &traps->traps[n]; + _compute_intersection_point (&t->left, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->left, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->top, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + _compute_intersection_point (&t->right, t->bottom, &p); + cairo_move_to (cr, p.x, p.y); + cairo_close_path (cr); + } + cairo_restore (cr); + cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_dash (cr, dots, 2, 0.); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_width (cr, 4.); + cairo_stroke (cr); + } cairo_restore (cr); + + /* grid */ + cairo_save (cr); { + int i; + + cairo_translate (cr, + -zoom*fmod (self->px/sf + x0, 1.), + -zoom*fmod (self->py/sf + y0, 1.)); + for (i = -size/2/zoom - 1; i <= size/2/zoom + 1; i++) { + cairo_move_to (cr, zoom*i, -size/2); + cairo_line_to (cr, zoom*i, size/2 + zoom); + cairo_move_to (cr, -size/2, zoom*i); + cairo_line_to (cr, size/2 + zoom, zoom*i); + } + cairo_set_source_rgba (cr, .7, .7, .7, .5); + cairo_set_line_width (cr, 1.); + cairo_stroke (cr); + } cairo_restore (cr); + } + + cairo_restore (cr); +} + +static gdouble +trapezoid_area (const trapezoid_t *t) +{ + gdouble inner_left, inner_right; + gdouble outer_left, outer_right; + gdouble height; + gdouble area; + + /* split into 3 sections: a rectangle with a pair of triangular bookends */ + inner_left = _compute_intersection_x_for_y (&t->left, t->top); + outer_left = _compute_intersection_x_for_y (&t->left, t->bottom); + if (outer_left > inner_left) { + gdouble t = outer_left; + outer_left = inner_left; + inner_left = t; + } + + inner_right = _compute_intersection_x_for_y (&t->right, t->top); + outer_right = _compute_intersection_x_for_y (&t->right, t->bottom); + if (outer_right > inner_right) { + gdouble t = outer_right; + outer_right = inner_right; + inner_right = t; + } + + if (outer_left > outer_right) { /* reverse */ + gdouble t; + + t = outer_left; + outer_left = inner_right; + inner_right = t; + + t = inner_left; + inner_left = outer_right; + outer_right = t; + } + + height = t->bottom - t->top; + area = (inner_left - outer_left) * height / 2; + area += (outer_right - inner_right) * height / 2; + area += (inner_right - inner_left) * height; + + return area; +} + +static gdouble +traps_compute_total_area (const traps_t *traps) +{ + int n; + gdouble area = 0.; + for (n = 0; n < traps->num_traps; n++) + area += trapezoid_area (&traps->traps[n]); + return area; +} + +static void +trap_view_draw_labels (TrapView *self, cairo_t *cr) +{ + PangoLayout *layout; + gint width, height; + gdouble total_area; + gchar *str; + traps_t *traps; + + traps = self->current_traps; + if (traps == NULL) + return; + + /* convert total area from fixed-point (assuming 24.8) */ + total_area = traps_compute_total_area (traps) / (256. * 256.); + str = g_strdup_printf ("Number of trapezoids:\t%d\n" + "Total area of trapezoids:\t%.2f", + traps->num_traps, + total_area); + layout = gtk_widget_create_pango_layout (&self->widget, str); + g_free (str); + + pango_layout_get_pixel_size (layout, &width, &height); + + cairo_move_to (cr, 10, 10 + height); + pango_cairo_show_layout (cr, layout); + g_object_unref (layout); +} + +static gboolean +trap_view_expose (GtkWidget *w, GdkEventExpose *ev) +{ + TrapView *self = (TrapView *) w; + cairo_t *cr; + + cr = gdk_cairo_create (w->window); + gdk_cairo_region (cr, ev->region); + cairo_clip (cr); + + trap_view_draw (self, cr); + trap_view_draw_labels (self, cr); + + cairo_destroy (cr); + return FALSE; +} + +static void +trap_view_advance (TrapView *self) +{ + if (self->current_traps && self->current_traps->prev) + self->current_traps = self->current_traps->prev; + if (self->current_edges && self->current_edges->prev) + self->current_edges = self->current_edges->prev; + self->pixmap_width = self->pixmap_height = 0; + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_back (TrapView *self) +{ + if (self->current_traps && self->current_traps->next) + self->current_traps = self->current_traps->next; + if (self->current_edges && self->current_edges->next) + self->current_edges = self->current_edges->next; + self->pixmap_width = self->pixmap_height = 0; + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_group_foreach (TrapView *group, GFunc func, gpointer data) +{ + while (group) { + func (group, data); + group = group->group_next; + } +} + +static gboolean +trap_view_key_press (GtkWidget *w, GdkEventKey *ev) +{ + TrapView *self = (TrapView *) w; + + switch (ev->keyval) { + case GDK_BackSpace: + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_back, + NULL); + break; + + case GDK_space: + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_advance, + NULL); + break; + + case GDK_Return: + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_advance, + NULL); + break; + + case GDK_Escape: + case GDK_Q: + gtk_main_quit (); + break; + } + + return FALSE; +} + +static gboolean +trap_view_button_press (GtkWidget *w, GdkEventButton *ev) +{ + TrapView *self = (TrapView *) w; + + if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + if (ev->type == GDK_BUTTON_PRESS) { + if (self->current_traps == NULL) + return FALSE; + + if (ev->button == 1) { + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_advance, + NULL); + } else if (ev->button == 3) { + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_back, + NULL); + } + } + } + else + { + self->in_mag_drag = TRUE; + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } + + return FALSE; +} + +static gboolean +trap_view_button_release (GtkWidget *w, GdkEventButton *ev) +{ + TrapView *self = (TrapView *) w; + + self->in_mag_drag = FALSE; + + return FALSE; +} + +static void +trap_view_update_mouse (TrapView *self, GdkEventMotion *ev) +{ + self->px = ev->x; + self->py = ev->y; + + gtk_widget_queue_draw (&self->widget); +} + +static void +trap_view_update_magnifier (TrapView *self, gint *xy) +{ + self->mag_x = xy[0]; + self->mag_y = xy[1]; + + gtk_widget_queue_draw (&self->widget); +} + +static gboolean +trap_view_motion (GtkWidget *w, GdkEventMotion *ev) +{ + TrapView *self = (TrapView *) w; + + if (self->in_mag_drag) { + int xy[2]; + + xy[0] = self->mag_x + ev->x - self->mag_drag_x; + xy[1] = self->mag_y + ev->y - self->mag_drag_y; + + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_update_magnifier, + xy); + + self->mag_drag_x = ev->x; + self->mag_drag_y = ev->y; + } else if (ev->x < self->mag_x || + ev->y < self->mag_y || + ev->x > self->mag_x + self->mag_size || + ev->y > self->mag_y + self->mag_size) + { + trap_view_group_foreach (self->group_head, + (GFunc) trap_view_update_mouse, + ev); + } + + return FALSE; +} + +static void +trap_view_realize (GtkWidget *widget) +{ + GdkWindowAttr attributes; + + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual (widget); + attributes.colormap = gtk_widget_get_colormap (widget); + attributes.event_mask = gtk_widget_get_events (widget) | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_KEY_PRESS_MASK | + GDK_KEY_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_EXPOSURE_MASK; + + widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, + GDK_WA_X | GDK_WA_Y | + GDK_WA_VISUAL | GDK_WA_COLORMAP); + gdk_window_set_user_data (widget->window, widget); + + widget->style = gtk_style_attach (widget->style, widget->window); + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); +} + +static void +trap_view_size_allocate (GtkWidget *w, GdkRectangle *r) +{ + TrapView *self = (TrapView *) w; + + GTK_WIDGET_CLASS (trap_view_parent_class)->size_allocate (w, r); + + self->mag_x = w->allocation.width - self->mag_size - 10; + self->mag_y = w->allocation.height - self->mag_size - 10; +} + +static void +trap_view_finalize (GObject *obj) +{ + G_OBJECT_CLASS (trap_view_parent_class)->finalize (obj); +} + +static void +trap_view_class_init (TrapViewClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + object_class->finalize = trap_view_finalize; + + widget_class->realize = trap_view_realize; + widget_class->size_allocate = trap_view_size_allocate; + widget_class->expose_event = trap_view_expose; + widget_class->key_press_event = trap_view_key_press; + widget_class->button_press_event = trap_view_button_press; + widget_class->button_release_event = trap_view_button_release; + widget_class->motion_notify_event = trap_view_motion; +} + +static void +trap_view_init (TrapView *self) +{ + self->mag_zoom = 10; + self->mag_size = 200; + + GTK_WIDGET_SET_FLAGS (self, GTK_CAN_FOCUS); +} + +static traps_t * +_traps_add_trapezoid (TrapView *tv, traps_t *traps, const trapezoid_t *trap) +{ + if (trap->top < traps->extents.p1.y) + traps->extents.p1.y = trap->top; + if (trap->bottom > traps->extents.p2.y) + traps->extents.p2.y = trap->bottom; + + if (trap->left.p1.x < traps->extents.p1.x) + traps->extents.p1.x = trap->left.p1.x; + if (trap->left.p2.x < traps->extents.p1.x) + traps->extents.p1.x = trap->left.p2.x; + + if (trap->right.p1.x > traps->extents.p2.x) + traps->extents.p2.x = trap->right.p1.x; + if (trap->right.p2.x > traps->extents.p2.x) + traps->extents.p2.x = trap->right.p2.x; + + if (traps->num_traps == traps->size) { + int newsize = 2 * traps->size; + void *newtraps; + + newtraps = g_realloc (traps, + sizeof (traps_t) + newsize * sizeof (trapezoid_t)); + if (newtraps == NULL) + return traps; + + if (tv->current_traps == traps) + tv->current_traps = newtraps; + + traps = newtraps; + traps->size = newsize; + + if (traps->next != NULL) + traps->next->prev = newtraps; + if (traps->prev != NULL) + traps->prev->next = newtraps; + else + tv->traps_list = newtraps; + } + + traps->traps[traps->num_traps++] = *trap; + + return traps; +} + +static traps_t * +traps_new (TrapView *tv) +{ + traps_t *t; + + t = g_malloc (sizeof (traps_t) + 16 * sizeof (trapezoid_t)); + t->prev = NULL; + t->next = tv->traps_list; + if (tv->traps_list) + tv->traps_list->prev = t; + tv->traps_list = t; + + if (tv->current_traps == NULL) + tv->current_traps = t; + + t->size = 16; + t->num_traps = 0; + t->extents.p1.x = G_MAXDOUBLE; + t->extents.p1.y = G_MAXDOUBLE; + t->extents.p2.x = -G_MAXDOUBLE; + t->extents.p2.y = -G_MAXDOUBLE; + + return t; +} + +static edges_t * +_edges_add_edge (TrapView *tv, edges_t *edges, edge_t *e) +{ + if (e->top < edges->extents.p1.y) + edges->extents.p1.y = e->top; + if (e->bottom > edges->extents.p2.y) + edges->extents.p2.y = e->bottom; + + _compute_intersection_point (&e->line, e->top, &e->p1); + _compute_intersection_point (&e->line, e->bottom, &e->p2); + + if (e->p1.x < edges->extents.p1.x) + edges->extents.p1.x = e->p1.x; + if (e->p2.x < edges->extents.p1.x) + edges->extents.p1.x = e->p2.x; + + if (e->p1.x > edges->extents.p2.x) + edges->extents.p2.x = e->p1.x; + if (e->p2.x > edges->extents.p2.x) + edges->extents.p2.x = e->p2.x; + + if (edges->num_edges == edges->size) { + int newsize = 2 * edges->size; + void *newedges; + + newedges = g_realloc (edges, + sizeof (edges_t) + newsize * sizeof (edge_t)); + if (newedges == NULL) + return edges; + + if (tv->current_edges == edges) + tv->current_edges = newedges; + + edges = newedges; + edges->size = newsize; + + if (edges->next != NULL) + edges->next->prev = newedges; + if (edges->prev != NULL) + edges->prev->next = newedges; + else + tv->edges_list = newedges; + } + + edges->edges[edges->num_edges++] = *e; + + return edges; +} + +static edges_t * +edges_new (TrapView *tv) +{ + edges_t *t; + + t = g_malloc (sizeof (edges_t) + 16 * sizeof (edge_t)); + t->prev = NULL; + t->next = tv->edges_list; + if (tv->edges_list) + tv->edges_list->prev = t; + tv->edges_list = t; + + if (tv->current_edges == NULL) + tv->current_edges = t; + + t->size = 16; + t->num_edges = 0; + t->extents.p1.x = G_MAXDOUBLE; + t->extents.p1.y = G_MAXDOUBLE; + t->extents.p2.x = -G_MAXDOUBLE; + t->extents.p2.y = -G_MAXDOUBLE; + + return t; +} + +int +main (int argc, char **argv) +{ + TrapView *tv, *group_head = NULL, *group_prev = NULL; + GtkWidget *window, *hbox; + FILE *file; + + gtk_init (&argc, &argv); + + hbox = gtk_hbox_new (TRUE, 0); + + file = fopen (argv[1], "r"); + if (file != NULL) { + char *line = NULL; + size_t len = 0; + traps_t *traps; + + tv = g_object_new (trap_view_get_type (), NULL); + gtk_box_pack_start (GTK_BOX (hbox), &tv->widget, TRUE, TRUE, 0); + gtk_widget_show (&tv->widget); + + tv->group_prev = group_prev; + tv->group_next = NULL; + if (group_prev) + group_prev->group_next = tv; + group_prev = tv; + if (group_head == NULL) + group_head = tv; + tv->group_head = group_head; + + traps = traps_new (tv); + while (getline (&line, &len, file) != -1) { + trapezoid_t t; + + if (sscanf (line, + "%lf %lf L:(%lf, %lf), (%lf, %lf) R:(%lf, %lf), (%lf, %lf)", + &t.top, &t.bottom, + &t.left.p1.x, &t.left.p1.y, + &t.left.p2.x, &t.left.p2.y, + &t.right.p1.x, &t.right.p1.y, + &t.right.p2.x, &t.right.p2.y) == 10) { + traps = _traps_add_trapezoid (tv, traps, &t); + } else { + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + traps = traps_new (tv); + } + } + } + free (line); + fclose (file); + + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + } + } + + file = fopen (argv[2], "r"); + if (file != NULL) { + char *line = NULL; + size_t len = 0; + traps_t *traps; + + tv = g_object_new (trap_view_get_type (), NULL); + gtk_box_pack_start (GTK_BOX (hbox), &tv->widget, TRUE, TRUE, 0); + gtk_widget_show (&tv->widget); + + tv->group_prev = group_prev; + tv->group_next = NULL; + if (group_prev) + group_prev->group_next = tv; + group_prev = tv; + if (group_head == NULL) + group_head = tv; + tv->group_head = group_head; + + traps = traps_new (tv); + while (getline (&line, &len, file) != -1) { + trapezoid_t t; + + if (sscanf (line, + "%lf %lf L:(%lf, %lf), (%lf, %lf) R:(%lf, %lf), (%lf, %lf)", + &t.top, &t.bottom, + &t.left.p1.x, &t.left.p1.y, + &t.left.p2.x, &t.left.p2.y, + &t.right.p1.x, &t.right.p1.y, + &t.right.p2.x, &t.right.p2.y) == 10) { + traps = _traps_add_trapezoid (tv, traps, &t); + } else { + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + traps = traps_new (tv); + } + } + } + free (line); + fclose (file); + + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + } + } + +#if 1 + if (argc >=4) { + file = fopen (argv[3], "r"); + if (file != NULL) { + char *line = NULL; + size_t len = 0; + edges_t *edges; + + edges = edges_new (tv); + while (getline (&line, &len, file) != -1) { + edge_t e; + + if (sscanf (line, + "(%lf, %lf), (%lf, %lf) %lf %lf %d", + &e.line.p1.x, &e.line.p1.y, + &e.line.p2.x, &e.line.p2.y, + &e.top, &e.bottom, + &e.dir) == 7) { + edges = _edges_add_edge (tv, edges, &e); + } else { + if (edges->num_edges) { + g_print ("read %d edges\n", edges->num_edges); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + edges->extents.p1.x, edges->extents.p1.y, + edges->extents.p2.x, edges->extents.p2.y); + edges = edges_new (tv); + } + } + } + free (line); + fclose (file); + + if (edges->num_edges) { + g_print ("read %d edges\n", edges->num_edges); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + edges->extents.p1.x, edges->extents.p1.y, + edges->extents.p2.x, edges->extents.p2.y); + } + } + } +#else + if (argc >= 4) { + file = fopen (argv[3], "r"); + if (file != NULL) { + char *line = NULL; + size_t len = 0; + traps_t *traps; + + tv = g_object_new (trap_view_get_type (), NULL); + gtk_box_pack_start (GTK_BOX (hbox), &tv->widget, TRUE, TRUE, 0); + gtk_widget_show (&tv->widget); + + tv->group_prev = group_prev; + tv->group_next = NULL; + if (group_prev) + group_prev->group_next = tv; + group_prev = tv; + if (group_head == NULL) + group_head = tv; + tv->group_head = group_head; + + traps = traps_new (tv); + while (getline (&line, &len, file) != -1) { + trapezoid_t t; + + if (sscanf (line, + "%lf %lf L:(%lf, %lf), (%lf, %lf) R:(%lf, %lf), (%lf, %lf)", + &t.top, &t.bottom, + &t.left.p1.x, &t.left.p1.y, + &t.left.p2.x, &t.left.p2.y, + &t.right.p1.x, &t.right.p1.y, + &t.right.p2.x, &t.right.p2.y) == 10) { + traps = _traps_add_trapezoid (tv, traps, &t); + } else { + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + traps = traps_new (tv); + } + } + } + free (line); + fclose (file); + + if (traps->num_traps) { + g_print ("read %d trapezoids\n", traps->num_traps); + g_print ("extents=(%lg, %lg), (%lg, %lg)\n", + traps->extents.p1.x, traps->extents.p1.y, + traps->extents.p2.x, traps->extents.p2.y); + } + } + } +#endif + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + gtk_widget_set_size_request (window, 512, 512); + gtk_container_add (GTK_CONTAINER (window), hbox); + gtk_widget_show (hbox); + gtk_widget_show (window); + + gtk_main (); + return 0; +} diff --git a/util/trace-to-xml.c b/util/trace-to-xml.c new file mode 100644 index 000000000..a0f03ccff --- /dev/null +++ b/util/trace-to-xml.c @@ -0,0 +1,78 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include + +static cairo_surface_t * +_surface_create (void *_closure, + cairo_content_t content, + double width, double height, + long uid) +{ + cairo_surface_t **closure = _closure; + cairo_surface_t *surface; + cairo_rectangle_t extents; + + extents.x = extents.y = 0; + extents.width = width; + extents.height = height; + surface = cairo_recording_surface_create (content, &extents); + if (*closure == NULL) + *closure = cairo_surface_reference (surface); + + return surface; +} + +static cairo_status_t +stdio_write (void *closure, const unsigned char *data, unsigned len) +{ + if (fwrite (data, len, 1, closure) == 1) + return CAIRO_STATUS_SUCCESS; + else + return CAIRO_STATUS_WRITE_ERROR; +} + +int +main (int argc, char **argv) +{ + cairo_surface_t *surface = NULL; + const cairo_script_interpreter_hooks_t hooks = { + .closure = &surface, + .surface_create = _surface_create, + }; + cairo_script_interpreter_t *csi; + FILE *in = stdin, *out = stdout; + + if (argc >= 2 && strcmp (argv[1], "-")) + in = fopen (argv[1], "r"); + if (argc >= 3 && strcmp (argv[2], "-")) + out = fopen (argv[2], "w"); + + csi = cairo_script_interpreter_create (); + cairo_script_interpreter_install_hooks (csi, &hooks); + cairo_script_interpreter_feed_stream (csi, in); + cairo_script_interpreter_finish (csi); + cairo_script_interpreter_destroy (csi); + + if (surface != NULL) { + cairo_device_t *xml; + + xml = cairo_xml_create_for_stream (stdio_write, out); + cairo_xml_for_recording_surface (xml, surface); + cairo_device_destroy (xml); + + cairo_surface_destroy (surface); + } + + if (in != stdin) + fclose (in); + if (out != stdout) + fclose (out); + + return 0; +} diff --git a/util/waterfall b/util/waterfall new file mode 100755 index 000000000..5a683c59b --- /dev/null +++ b/util/waterfall @@ -0,0 +1,97 @@ +#!/usr/bin/python + +import sys +import cairo +import pygtk +pygtk.require('2.0') +import gtk +import gtk.gdk +import pango +import gobject + +class CairoView(gtk.Window): + def __init__(self, family="", slant=0, weight=0, size=18, text="the quick brown fox jumps over the lazy dog! THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG?"): + gtk.Widget.__init__ (self) + + self.family = family + if slant == "italic": + self.slant = cairo.FONT_SLANT_ITALIC + elif slant == "oblique": + self.slant = cairo.FONT_SLANT_OBLIQUE + else: + self.slant = cairo.FONT_SLANT_NORMAL + if weight == "bold": + self.weight = cairo.FONT_WEIGHT_BOLD + else: + self.weight = cairo.FONT_WEIGHT_NORMAL + self.size = float (size) + self.text = text + + def do_realize(self): + self.set_flags(self.flags() | gtk.REALIZED) + + self.window = gtk.gdk.Window( + self.get_parent_window(), + width=self.allocation.width, + height=self.allocation.height, + window_type=gtk.gdk.WINDOW_CHILD, + wclass=gtk.gdk.INPUT_OUTPUT, + event_mask=self.get_events() | gtk.gdk.EXPOSURE_MASK) + + self.window.set_user_data(self) + + self.style.attach(self.window) + + self.style.set_background(self.window, gtk.STATE_NORMAL) + + self.window.move_resize(0, 0, 1000, 1000) + + def do_unrealize(self): + self.window.destroy() + + def do_expose_event(self, event): + self.draw (event) + + return False + + def draw(self, event = None): + + cr = self.window.cairo_create() + if event: + cr.rectangle(event.area.x, event.area.y, + event.area.width, event.area.height) + cr.clip() + + cr.set_source_rgb (1, 1, 1) + cr.paint () + cr.set_source_rgb (0, 0, 0) + + cr.select_font_face (self.family, self.slant, self.weight) + + for size in range (1, 60): + cr.set_font_size (size) + extents = cr.text_extents (self.text) + cr.move_to (-extents[0], -extents[1]) + cr.show_text (self.text) + cr.translate (0, extents[3]) + + def run(self): + + self.props.allow_shrink = True + self.connect("destroy", gtk.main_quit) + self.show() + + gtk.main() + +gobject.type_register(CairoView) + +def main(args): + + if len (args) == 1: + print "usage: cairo-view family [slant [weight [size [text]]]]" + sys.exit (1) + cv= CairoView (*args[1:]) + cv.run() + +if __name__ == "__main__": + main(sys.argv) diff --git a/util/xml-to-trace.c b/util/xml-to-trace.c new file mode 100644 index 000000000..13b7e5706 --- /dev/null +++ b/util/xml-to-trace.c @@ -0,0 +1,263 @@ +#include +#include +#include +#include + +struct trace { + FILE *stream; + char tail_buf[80]; + const char *tail; + int surface_depth; +}; + +static void +start_element (void *closure, + const char *element, + const char **attr) +{ + struct trace *trace = closure; + + if (strcmp (element, "surface") == 0) { + const char *content = "COLOR_ALPHA"; + const char *width = NULL; + const char *height = NULL; + + while (*attr) { + if (strcmp (*attr, "content") == 0) { + content = *++attr; + } else if (strcmp (*attr, "width") == 0) { + width = *++attr; + } else if (strcmp (*attr, "height") == 0) { + height = *++attr; + } else { + fprintf (stderr, "unknown surface attribute '%s'\n", *attr); + attr++; + } + attr++; + } + + fprintf (trace->stream, "<< /content //%s", content); + if (width != NULL && height != NULL) { + fprintf (trace->stream, + " /width %s /height %s", + width, height); + } + if (trace->surface_depth++ == 0) + fprintf (trace->stream, " >> surface context\n"); + else + fprintf (trace->stream, " >> surface dup context\n"); + } else if (strcmp (element, "image") == 0) { + const char *format = "ARGB24"; + const char *width = NULL; + const char *height = NULL; + + while (*attr) { + if (strcmp (*attr, "format") == 0) { + format = *++attr; + } else if (strcmp (*attr, "width") == 0) { + width = *++attr; + } else if (strcmp (*attr, "height") == 0) { + height = *++attr; + } else { + fprintf (stderr, "unknown image attribute '%s'\n", *attr); + attr++; + } + attr++; + } + + fprintf (trace->stream, + "<< /format //%s /width %s /height %s /mime-type (image/png) /source <{", + format, width, height); + assert (trace->tail == NULL); + trace->tail = "}> >> image pattern\n"; + } else if (strcmp (element, "solid") == 0) { + trace->tail = " rgba\n"; + } else if (strcmp (element, "linear") == 0) { + const char *x1 = NULL; + const char *x2 = NULL; + const char *y1 = NULL; + const char *y2 = NULL; + + while (*attr) { + if (strcmp (*attr, "x1") == 0) { + x1 = *++attr; + } else if (strcmp (*attr, "x2") == 0) { + x2 = *++attr; + } else if (strcmp (*attr, "y1") == 0) { + y1 = *++attr; + } else if (strcmp (*attr, "y2") == 0) { + y2 = *++attr; + } else { + fprintf (stderr, "unknown linear attribute '%s'\n", *attr); + attr++; + } + attr++; + } + + fprintf (trace->stream, "%s %s %s %s linear\n", x1, y1, x2, y2); + } else if (strcmp (element, "radial") == 0) { + const char *x1 = NULL; + const char *y1 = NULL; + const char *r1 = NULL; + const char *y2 = NULL; + const char *x2 = NULL; + const char *r2 = NULL; + + while (*attr) { + if (strcmp (*attr, "x1") == 0) { + x1 = *++attr; + } else if (strcmp (*attr, "y1") == 0) { + y1 = *++attr; + } else if (strcmp (*attr, "r1") == 0) { + r1 = *++attr; + } else if (strcmp (*attr, "x2") == 0) { + x2 = *++attr; + } else if (strcmp (*attr, "y2") == 0) { + y2 = *++attr; + } else if (strcmp (*attr, "r2") == 0) { + r2 = *++attr; + } else { + fprintf (stderr, "unknown radial attribute '%s'\n", *attr); + attr++; + } + attr++; + } + + fprintf (trace->stream, + "%s %s %s %s %s %s radial\n", + x1, y1, r1, x2, y2, r2); + } else if (strcmp (element, "matrix") == 0) { + fprintf (trace->stream, "[ "); + trace->tail = " ] set-matrix\n"; + } else if (strcmp (element, "extend") == 0) { + trace->tail = " set-extend\n"; + } else if (strcmp (element, "filter") == 0) { + trace->tail = " set-filter\n"; + } else if (strcmp (element, "operator") == 0) { + trace->tail = " set-operator\n"; + } else if (strcmp (element, "tolerance") == 0) { + trace->tail = " set-tolerance\n"; + } else if (strcmp (element, "fill-rule") == 0) { + trace->tail = " set-fill-rule\n"; + } else if (strcmp (element, "line-cap") == 0) { + trace->tail = " set-line-cap\n"; + } else if (strcmp (element, "line-join") == 0) { + trace->tail = " set-line-join\n"; + } else if (strcmp (element, "line-width") == 0) { + trace->tail = " set-line-width\n"; + } else if (strcmp (element, "miter-limit") == 0) { + trace->tail = " set-miter-limit\n"; + } else if (strcmp (element, "antialias") == 0) { + trace->tail = " set-antialias\n"; + } else if (strcmp (element, "color-stop") == 0) { + trace->tail = " add-color-stop\n"; + } else if (strcmp (element, "path") == 0) { + /* need to reset the matrix to identity before the path */ + fprintf (trace->stream, "identity set-matrix "); + trace->tail = "\n"; + } else if (strcmp (element, "dash") == 0) { + const char *offset = "0"; + + while (*attr) { + if (strcmp (*attr, "offset") == 0) { + offset = *++attr; + } + attr++; + } + + fprintf (trace->stream, "["); + sprintf (trace->tail_buf, "] %s set-dash\n", offset); + trace->tail = trace->tail_buf; + } else { + } +} + +static void +cdata (void *closure, + const XML_Char *s, + int len) +{ + struct trace *trace = closure; + + if (trace->tail) + fwrite (s, len, 1, trace->stream); +} + +static void +end_element (void *closure, + const char *element) +{ + struct trace *trace = closure; + + if (trace->tail) { + fprintf (trace->stream, "%s", trace->tail); + trace->tail = NULL; + } + + if (strcmp (element, "paint") == 0) { + fprintf (trace->stream, "paint\n"); + } else if (strcmp (element, "mask") == 0) { + fprintf (trace->stream, "mask\n"); + } else if (strcmp (element, "stroke") == 0) { + fprintf (trace->stream, "stroke\n"); + } else if (strcmp (element, "fill") == 0) { + fprintf (trace->stream, "fill\n"); + } else if (strcmp (element, "glyphs") == 0) { + fprintf (trace->stream, "show-glyphs\n"); + } else if (strcmp (element, "clip") == 0) { + fprintf (trace->stream, "clip\n"); + } else if (strcmp (element, "source-pattern") == 0) { + fprintf (trace->stream, "set-source\n"); + } else if (strcmp (element, "mask-pattern") == 0) { + } else if (strcmp (element, "surface") == 0) { + if (--trace->surface_depth == 0) + fprintf (trace->stream, "pop\n"); + else + fprintf (trace->stream, "pop pattern\n"); + } +} + +int +main (int argc, char **argv) +{ + struct trace trace; + XML_Parser p; + char buf[8192]; + int done = 0; + FILE *in = stdin; + + trace.stream = stdout; + trace.tail = NULL; + trace.surface_depth = 0; + + if (argc >= 2 && strcmp (argv[1], "-")) + in = fopen (argv[1], "r"); + if (argc >= 3 && strcmp (argv[2], "-")) + trace.stream = fopen (argv[2], "w"); + + p = XML_ParserCreate (NULL); + XML_SetUserData (p, &trace); + XML_SetElementHandler (p, start_element, end_element); + XML_SetCharacterDataHandler (p, cdata); + do { + int len; + + len = fread (buf, 1, sizeof (buf), in); + done = feof (stdin); + + if (XML_Parse (p, buf, len, done) == XML_STATUS_ERROR) { + fprintf (stderr, "Parse error at line %ld:\n%s\n", + XML_GetCurrentLineNumber (p), + XML_ErrorString (XML_GetErrorCode (p))); + exit (-1); + } + } while (! done); + XML_ParserFree (p); + + if (in != stdin) + fclose (in); + if (trace.stream != stdout) + fclose (trace.stream); + + return 0; +} diff --git a/util/xr2cairo b/util/xr2cairo new file mode 100755 index 000000000..c749aa4fd --- /dev/null +++ b/util/xr2cairo @@ -0,0 +1,49 @@ +#!/bin/sh +set -e + +if [ $# -lt 1 ]; then + argv0=`basename $0` + echo "$argv0: Convert source code written for Xr to use Cairo instead." >&2 + echo "" >&2 + echo "Usage: $argv0 file [...]" >&2 + exit 1 +fi + +xr2cairo() { + file=$1 + backup=$file.xr + + if [ -e $backup ]; then + echo "Warning: Backup file $backup already exists --- not backing up this time." >&2 + else + cp $file $backup + fi + sed -e ' + s/\(Xr[a-zA-Z]*\)RGB/\1Rgb/g + s/\(Xr[a-zA-Z]*\)NextTo/\1Similar/g + + s/Xr\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)/\Lcairo_\1_\2_\3_\4_\5\E/g + s/Xr\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)/\Lcairo_\1_\2_\3_\4\E/g + s/Xr\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z]\+\)/\Lcairo_\1_\2_\3\E/g + s/Xr\([A-Z]\+[a-z]\+\)\([A-Z]\+[a-z0-9]\+\)/\Lcairo_\1_\2\E/g + s/Xr\([A-Z]\+[a-z]\+\)/\Lcairo_\1\E/g + + s/\(cairo_\(operator\|status\|fill_rule\|line_cap\|line_join\|filter\|format\)_[a-z0-9_]\{2,\}\)/\U\1/g + + s/cairo_\(fill_rule\|line_cap\|line_join\|format\|operator\|status\|filter\|surface\|matrix\)$/cairo_\1_t/g + s/cairo_\(fill_rule\|line_cap\|line_join\|format\|operator\|status\|filter\|surface\|matrix\)\([^_]\)/cairo_\1_t\2/g + s/_cairo_\(fill_rule\|line_cap\|line_join\|format\|operator\|status\|filter\|surface\|matrix\)_t/cairo_\1/g + s/cairo_state/cairo_t/g + s/_cairo_t\([^a-zA-Z0-9_]\)/cairo\1/g + + s/Xr\.h/cairo.h/g + + ' $backup > $file +} + +while [ $# -gt 0 ]; do + file=$1 + shift + xr2cairo $file +done + -- cgit v1.2.3